ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjE4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCkBAIC0wLDAgKzEsMjE2NyBAQAorLyoKKyAgIDN3LTl4eHguYyAtLSAzd2FyZSA5MDAwIFN0b3JhZ2UgQ29udHJvbGxlciBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKworICAgV3JpdHRlbiBCeTogQWRhbSBSYWRmb3JkIDxsaW51eHJhaWRAYW1jYy5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBOTyBXQVJSQU5UWQorICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzoKKyAgIGxpbnV4cmFpZEBhbWNjLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cuYW1jYy5jb20KKworICAgTm90ZTogVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgZG9lcyBub3QgY29udGFpbiBhIGJ1bmRsZWQgZmlybXdhcmUKKyAgICAgICAgIGltYWdlLgorCisgICBIaXN0b3J5CisgICAtLS0tLS0tCisgICAyLjI2LjAyLjAwMCAtIERyaXZlciBjbGVhbnVwIGZvciBrZXJuZWwgc3VibWlzc2lvbi4KKyAgIDIuMjYuMDIuMDAxIC0gUmVwbGFjZSBzY2hlZHVsZV90aW1lb3V0KCkgY2FsbHMgd2l0aCBtc2xlZXAoKS4KKyAgIDIuMjYuMDIuMDAyIC0gQWRkIHN1cHBvcnQgZm9yIFBBRSBtb2RlLgorICAgICAgICAgICAgICAgICBBZGQgbHVuIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgIEZpeCB0d2FfcmVtb3ZlKCkgdG8gZnJlZSBpcnEgaGFuZGxlci91bnJlZ2lzdGVyX2NocmRldigpCisgICAgICAgICAgICAgICAgIGJlZm9yZSBzaHV0dGluZyBkb3duIGNhcmQuCisgICAgICAgICAgICAgICAgIENoYW5nZSB0byBuZXcgJ2NoYW5nZV9xdWV1ZV9kZXB0aCcgYXBpLgorICAgICAgICAgICAgICAgICBGaXggJ2hhbmRsZWQ9MScgSVNSIHVzYWdlLCByZW1vdmUgYm9ndXMgSVJRIGNoZWNrLgorICAgICAgICAgICAgICAgICBSZW1vdmUgdW4tbmVlZGVkIGVoX2Fib3J0IGhhbmRsZXIuCisgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBlbWJlZGRlZCBmaXJtd2FyZSBlcnJvciBzdHJpbmdzLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlICIzdy05eHh4LmgiCisKKy8qIEdsb2JhbHMgKi8KKyNkZWZpbmUgVFdfRFJJVkVSX1ZFUlNJT04gIjIuMjYuMDIuMDAyIgorc3RhdGljIFRXX0RldmljZV9FeHRlbnNpb24gKnR3YV9kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbVFdfTUFYX1NMT1RdOworc3RhdGljIHVuc2lnbmVkIGludCB0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudDsKK3N0YXRpYyBpbnQgdHdhX21ham9yID0gLTE7CitleHRlcm4gc3RydWN0IHRpbWV6b25lIHN5c190ejsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK01PRFVMRV9BVVRIT1IgKCJBTUNDIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCIzd2FyZSA5MDAwIFN0b3JhZ2UgQ29udHJvbGxlciBMaW51eCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFRXX0RSSVZFUl9WRVJTSU9OKTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgdHdhX2Flbl9xdWV1ZV9ldmVudChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqaGVhZGVyKTsKK3N0YXRpYyBpbnQgdHdhX2Flbl9yZWFkX3F1ZXVlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpOworc3RhdGljIGNoYXIgKnR3YV9hZW5fc2V2ZXJpdHlfbG9va3VwKHVuc2lnbmVkIGNoYXIgc2V2ZXJpdHlfY29kZSk7CitzdGF0aWMgdm9pZCB0d2FfYWVuX3N5bmNfdGltZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKTsKK3N0YXRpYyBpbnQgdHdhX2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB0d2FfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCB0d2FfZmlsbF9zZW5zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgY29weV9zZW5zZSwgaW50IHByaW50X2hvc3QpOworc3RhdGljIHZvaWQgdHdhX2ZyZWVfcmVxdWVzdF9pZChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsaW50IHJlcXVlc3RfaWQpOworc3RhdGljIHZvaWQgdHdhX2dldF9yZXF1ZXN0X2lkKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50ICpyZXF1ZXN0X2lkKTsKK3N0YXRpYyBpbnQgdHdhX2luaXRjb25uZWN0aW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IG1lc3NhZ2VfY3JlZGl0cywKKyAJCQkgICAgICB1MzIgc2V0X2ZlYXR1cmVzLCB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Z3X3NybCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBjdXJyZW50X2Z3X2FyY2hfaWQsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19icmFuY2gsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19idWlsZCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqZndfb25fY3Rscl9zcmwsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfYXJjaF9pZCwgCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCAqZndfb25fY3Rscl9icmFuY2gsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfYnVpbGQsIAorCQkJICAgICAgdTMyICppbml0X2Nvbm5lY3RfcmVzdWx0KTsKK3N0YXRpYyB2b2lkIHR3YV9sb2FkX3NnbChUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQsIGludCByZXF1ZXN0X2lkLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIGludCBsZW5ndGgpOworc3RhdGljIGludCB0d2FfcG9sbF9yZXNwb25zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgc2Vjb25kcyk7CitzdGF0aWMgaW50IHR3YV9wb2xsX3N0YXR1c19nb25lKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgdTMyIGZsYWcsIGludCBzZWNvbmRzKTsKK3N0YXRpYyBpbnQgdHdhX3Bvc3RfY29tbWFuZF9wYWNrZXQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciBpbnRlcm5hbCk7CitzdGF0aWMgaW50IHR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IGlvY3RsX3Jlc2V0KTsKK3N0YXRpYyBpbnQgdHdhX3Jlc2V0X3NlcXVlbmNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHNvZnRfcmVzZXQpOworc3RhdGljIGludCB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBjaGFyICpjZGIsIGludCB1c2Vfc2csIFRXX1NHX0VudHJ5ICpzZ2xpc3RhcmcpOworc3RhdGljIHZvaWQgdHdhX3Njc2lvcF9leGVjdXRlX3Njc2lfY29tcGxldGUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCk7CitzdGF0aWMgY2hhciAqdHdhX3N0cmluZ19sb29rdXAodHdhX21lc3NhZ2VfdHlwZSAqdGFibGUsIHVuc2lnbmVkIGludCBhZW5fY29kZSk7CitzdGF0aWMgdm9pZCB0d2FfdW5tYXBfc2NzaV9kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpOworCisvKiBGdW5jdGlvbnMgKi8KKworLyogU2hvdyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNhcmQgKi8KK3N0YXRpYyBzc2l6ZV90IHR3YV9zaG93X3N0YXRzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3NpemVfdCBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiM3ctOXh4eCBEcml2ZXIgdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICJDdXJyZW50IGNvbW1hbmRzIHBvc3RlZDogICAlNGRcbiIKKwkJICAgICAgICJNYXggY29tbWFuZHMgcG9zdGVkOiAgICAgICAlNGRcbiIKKwkJICAgICAgICJDdXJyZW50IHBlbmRpbmcgY29tbWFuZHM6ICAlNGRcbiIKKwkJICAgICAgICJNYXggcGVuZGluZyBjb21tYW5kczogICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNnbCBsZW5ndGg6ICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2dsIGxlbmd0aDogICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNlY3RvciBjb3VudDogICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2VjdG9yIGNvdW50OiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJTQ1NJIEhvc3QgUmVzZXRzOiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJBRU4nczogICAgICAgICAgICAgICAgICAgICAlNGRcbiIsIAorCQkgICAgICAgVFdfRFJJVkVSX1ZFUlNJT04sCisJCSAgICAgICB0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQsCisJCSAgICAgICB0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+bWF4X3BlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+c2dsX2VudHJpZXMsCisJCSAgICAgICB0d19kZXYtPm1heF9zZ2xfZW50cmllcywKKwkJICAgICAgIHR3X2Rldi0+c2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5udW1fcmVzZXRzLAorCQkgICAgICAgdHdfZGV2LT5hZW5fY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbGVuOworfSAvKiBFbmQgdHdhX3Nob3dfc3RhdHMoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IGEgZGV2aWNlcyBxdWV1ZSBkZXB0aCAqLworc3RhdGljIGludCB0d2FfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHF1ZXVlX2RlcHRoKQoreworCWlmIChxdWV1ZV9kZXB0aCA+IFRXX1FfTEVOR1RILTIpCisJCXF1ZXVlX2RlcHRoID0gVFdfUV9MRU5HVEgtMjsKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfT1JERVJFRF9UQUcsIHF1ZXVlX2RlcHRoKTsKKwlyZXR1cm4gcXVldWVfZGVwdGg7Cit9IC8qIEVuZCB0d2FfY2hhbmdlX3F1ZXVlX2RlcHRoKCkgKi8KKworLyogQ3JlYXRlIHN5c2ZzICdzdGF0cycgZW50cnkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSB0d2FfaG9zdF9zdGF0c19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9IAkic3RhdHMiLAorCQkubW9kZSA9CQlTX0lSVUdPLAorCX0sCisJLnNob3cgPSB0d2Ffc2hvd19zdGF0cworfTsKKworLyogSG9zdCBhdHRyaWJ1dGVzIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnR3YV9ob3N0X2F0dHJzW10gPSB7CisJJnR3YV9ob3N0X3N0YXRzX2F0dHIsCisJTlVMTCwKK307CisKKy8qIEZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3QgZm9yIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR3YV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gdHdhX2NocmRldl9pb2N0bCwKKwkub3BlbgkJPSB0d2FfY2hyZGV2X29wZW4sCisJLnJlbGVhc2UJPSBOVUxMCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29tcGxldGUgYW4gYWVuIHJlcXVlc3QgZnJvbSB0aGUgaXNyICovCitzdGF0aWMgaW50IHR3YV9hZW5fY29tcGxldGUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyICpoZWFkZXI7CisJdW5zaWduZWQgc2hvcnQgYWVuOworCWludCByZXR2YWwgPSAxOworCisJaGVhZGVyID0gKFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciAqKXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtyZXF1ZXN0X2lkXTsKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJYWVuID0gaGVhZGVyLT5zdGF0dXNfYmxvY2suZXJyb3I7CisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwljb21tYW5kX3BhY2tldCA9ICZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm9sZGNvbW1hbmQ7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgaW50ZXJuYWwgY29tcGxldGlvbiBvZiBzZXQgcGFyYW0gZm9yIHRpbWUgc3luYyAqLworCWlmIChUV19PUF9PVVQoY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0KSA9PSBUV19PUF9TRVRfUEFSQU0pIHsKKwkJLyogS2VlcCByZWFkaW5nIHRoZSBxdWV1ZSBpbiBjYXNlIHRoZXJlIGFyZSBtb3JlIGFlbidzICovCisJCWlmICh0d2FfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKSkKKwkJCWdvdG8gb3V0MjsKKwkgICAgICAgIGVsc2UgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc3dpdGNoIChhZW4pIHsKKwljYXNlIFRXX0FFTl9RVUVVRV9FTVBUWToKKwkJLyogUXVpdCByZWFkaW5nIHRoZSBxdWV1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZSAqLworCQlicmVhazsKKwljYXNlIFRXX0FFTl9TWU5DX1RJTUVfV0lUSF9IT1NUOgorCQl0d2FfYWVuX3N5bmNfdGltZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQl0d2FfYWVuX3F1ZXVlX2V2ZW50KHR3X2RldiwgaGVhZGVyKTsKKworCQkvKiBJZiB0aGVyZSBhcmUgbW9yZSBhZW4ncywga2VlcCByZWFkaW5nIHRoZSBxdWV1ZSAqLworCQlpZiAodHdhX2Flbl9yZWFkX3F1ZXVlKHR3X2RldiwgcmVxdWVzdF9pZCkpCisJCQlnb3RvIG91dDI7CisJCWVsc2UgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJldHZhbCA9IDA7CitvdXQyOgorCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJY2xlYXJfYml0KFRXX0lOX0FUVEVOVElPTl9MT09QLCAmdHdfZGV2LT5mbGFncyk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9hZW5fY29tcGxldGUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHJhaW4gYWVuIHF1ZXVlICovCitzdGF0aWMgaW50IHR3YV9hZW5fZHJhaW5fcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgbm9fY2hlY2tfcmVzZXQpCit7CisJaW50IHJlcXVlc3RfaWQgPSAwOworCWNoYXIgY2RiW1RXX01BWF9DREJfTEVOXTsKKwlUV19TR19FbnRyeSBzZ2xpc3RbMV07CisJaW50IGZpbmlzaGVkID0gMCwgY291bnQgPSAwOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcjsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJaW50IGZpcnN0X3Jlc2V0ID0gMCwgcXVldWUgPSAwLCByZXR2YWwgPSAxOworCisJaWYgKG5vX2NoZWNrX3Jlc2V0KQorCQlmaXJzdF9yZXNldCA9IDA7CisJZWxzZQorCQlmaXJzdF9yZXNldCA9IDE7CisKKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChmdWxsX2NvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSk7CisKKwkvKiBJbml0aWFsaXplIGNkYiAqLworCW1lbXNldCgmY2RiLCAwLCBUV19NQVhfQ0RCX0xFTik7CisJY2RiWzBdID0gUkVRVUVTVF9TRU5TRTsgLyogb3Bjb2RlICovCisJY2RiWzRdID0gVFdfQUxMT0NBVElPTl9MRU5HVEg7IC8qIGFsbG9jYXRpb24gbGVuZ3RoICovCisKKwkvKiBJbml0aWFsaXplIHNnbGlzdCAqLworCW1lbXNldCgmc2dsaXN0LCAwLCBzaXplb2YoVFdfU0dfRW50cnkpKTsKKwlzZ2xpc3RbMF0ubGVuZ3RoID0gVFdfU0VDVE9SX1NJWkU7CisJc2dsaXN0WzBdLmFkZHJlc3MgPSB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3BoeXNbcmVxdWVzdF9pZF07CisKKwlpZiAoc2dsaXN0WzBdLmFkZHJlc3MgJiBUV19BTElHTk1FTlRfOTAwMF9TR0wpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDEsICJGb3VuZCB1bmFsaWduZWQgYWRkcmVzcyBkdXJpbmcgQUVOIGRyYWluIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE1hcmsgaW50ZXJuYWwgY29tbWFuZCAqLworCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdID0gTlVMTDsKKworCWRvIHsKKwkJLyogU2VuZCBjb21tYW5kIHRvIHRoZSBib2FyZCAqLworCQlpZiAodHdhX3Njc2lvcF9leGVjdXRlX3Njc2kodHdfZGV2LCByZXF1ZXN0X2lkLCBjZGIsIDEsIHNnbGlzdCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyLCAiRXJyb3IgcG9zdGluZyByZXF1ZXN0IHNlbnNlIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIE5vdyBwb2xsIGZvciBjb21wbGV0aW9uICovCisJCWlmICh0d2FfcG9sbF9yZXNwb25zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDMwKSkgeworCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDMsICJObyB2YWxpZCByZXNwb25zZSB3aGlsZSBkcmFpbmluZyBBRU4gcXVldWUiKTsKKwkJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQloZWFkZXIgPSAoVFdfQ29tbWFuZF9BcGFjaGVfSGVhZGVyICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCQlhZW4gPSBoZWFkZXItPnN0YXR1c19ibG9jay5lcnJvcjsKKwkJcXVldWUgPSAwOworCQljb3VudCsrOworCisJCXN3aXRjaCAoYWVuKSB7CisJCWNhc2UgVFdfQUVOX1FVRVVFX0VNUFRZOgorCQkJaWYgKGZpcnN0X3Jlc2V0ICE9IDEpCisJCQkJZ290byBvdXQ7CisJCQllbHNlCisJCQkJZmluaXNoZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgVFdfQUVOX1NPRlRfUkVTRVQ6CisJCQlpZiAoZmlyc3RfcmVzZXQgPT0gMCkKKwkJCQlmaXJzdF9yZXNldCA9IDE7CisJCQllbHNlCisJCQkJcXVldWUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgVFdfQUVOX1NZTkNfVElNRV9XSVRIX0hPU1Q6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXF1ZXVlID0gMTsKKwkJfQorCisJCS8qIE5vdyBxdWV1ZSBhbiBldmVudCBpbmZvICovCisJCWlmIChxdWV1ZSkKKwkJCXR3YV9hZW5fcXVldWVfZXZlbnQodHdfZGV2LCBoZWFkZXIpOworCX0gd2hpbGUgKChmaW5pc2hlZCA9PSAwKSAmJiAoY291bnQgPCBUV19NQVhfQUVOX0RSQUlOKSk7CisKKwlpZiAoY291bnQgPT0gVFdfTUFYX0FFTl9EUkFJTikKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAwOworb3V0OgorCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0lOSVRJQUw7CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9hZW5fZHJhaW5fcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcXVldWUgYW4gZXZlbnQgKi8KK3N0YXRpYyB2b2lkIHR3YV9hZW5fcXVldWVfZXZlbnQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBUV19Db21tYW5kX0FwYWNoZV9IZWFkZXIgKmhlYWRlcikKK3sKKwl1MzIgbG9jYWxfdGltZTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCVRXX0V2ZW50ICpldmVudDsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJY2hhciBob3N0WzE2XTsKKwljaGFyICplcnJvcl9zdHI7CisKKwl0d19kZXYtPmFlbl9jb3VudCsrOworCisJLyogRmlsbCBvdXQgZXZlbnQgaW5mbyAqLworCWV2ZW50ID0gdHdfZGV2LT5ldmVudF9xdWV1ZVt0d19kZXYtPmVycm9yX2luZGV4XTsKKworCS8qIENoZWNrIGZvciBjbG9iYmVyICovCisJaG9zdFswXSA9ICdcMCc7CisJaWYgKHR3X2Rldi0+aG9zdCkgeworCQlzcHJpbnRmKGhvc3QsICIgc2NzaSVkOiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCWlmIChldmVudC0+cmV0cmlldmVkID09IFRXX0FFTl9OT1RfUkVUUklFVkVEKQorCQkJdHdfZGV2LT5hZW5fY2xvYmJlciA9IDE7CisJfQorCisJYWVuID0gaGVhZGVyLT5zdGF0dXNfYmxvY2suZXJyb3I7CisJbWVtc2V0KGV2ZW50LCAwLCBzaXplb2YoVFdfRXZlbnQpKTsKKworCWV2ZW50LT5zZXZlcml0eSA9IFRXX1NFVl9PVVQoaGVhZGVyLT5zdGF0dXNfYmxvY2suc2V2ZXJpdHlfX3Jlc2VydmVkKTsKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWUpOworCWxvY2FsX3RpbWUgPSAodTMyKSh0aW1lLnR2X3NlYyAtIChzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkpOworCWV2ZW50LT50aW1lX3N0YW1wX3NlYyA9IGxvY2FsX3RpbWU7CisJZXZlbnQtPmFlbl9jb2RlID0gYWVuOworCWV2ZW50LT5yZXRyaWV2ZWQgPSBUV19BRU5fTk9UX1JFVFJJRVZFRDsKKwlldmVudC0+c2VxdWVuY2VfaWQgPSB0d19kZXYtPmVycm9yX3NlcXVlbmNlX2lkOworCXR3X2Rldi0+ZXJyb3Jfc2VxdWVuY2VfaWQrKzsKKworCS8qIENoZWNrIGZvciBlbWJlZGRlZCBlcnJvciBzdHJpbmcgKi8KKwllcnJvcl9zdHIgPSAmKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2Nbc3RybGVuKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MpKzFdKTsKKworCWhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2Nbc2l6ZW9mKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MpIC0gMV0gPSAnXDAnOworCWV2ZW50LT5wYXJhbWV0ZXJfbGVuID0gc3RybGVuKGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MpOworCW1lbWNweShldmVudC0+cGFyYW1ldGVyX2RhdGEsIGhlYWRlci0+ZXJyX3NwZWNpZmljX2Rlc2MsIGV2ZW50LT5wYXJhbWV0ZXJfbGVuKTsKKwlpZiAoZXZlbnQtPnNldmVyaXR5ICE9IFRXX0FFTl9TRVZFUklUWV9ERUJVRykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDolcyBBRU46ICVzICgweCUwMlg6MHglMDRYKTogJXM6JXMuXG4iLAorCQkgICAgICAgaG9zdCwKKwkJICAgICAgIHR3YV9hZW5fc2V2ZXJpdHlfbG9va3VwKFRXX1NFVl9PVVQoaGVhZGVyLT5zdGF0dXNfYmxvY2suc2V2ZXJpdHlfX3Jlc2VydmVkKSksCisJCSAgICAgICBUV19NRVNTQUdFX1NPVVJDRV9DT05UUk9MTEVSX0VWRU5ULCBhZW4sCisJCSAgICAgICBlcnJvcl9zdHJbMF0gPT0gJ1wwJyA/IHR3YV9zdHJpbmdfbG9va3VwKHR3YV9hZW5fdGFibGUsIGFlbikgOiBlcnJvcl9zdHIsCisJCSAgICAgICBoZWFkZXItPmVycl9zcGVjaWZpY19kZXNjKTsKKwllbHNlCisJCXR3X2Rldi0+YWVuX2NvdW50LS07CisKKwlpZiAoKHR3X2Rldi0+ZXJyb3JfaW5kZXggKyAxKSA9PSBUV19RX0xFTkdUSCkKKwkJdHdfZGV2LT5ldmVudF9xdWV1ZV93cmFwcGVkID0gMTsKKwl0d19kZXYtPmVycm9yX2luZGV4ID0gKHR3X2Rldi0+ZXJyb3JfaW5kZXggKyAxICkgJSBUV19RX0xFTkdUSDsKK30gLyogRW5kIHR3YV9hZW5fcXVldWVfZXZlbnQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgYWVuIHF1ZXVlIGZyb20gdGhlIGlzciAqLworc3RhdGljIGludCB0d2FfYWVuX3JlYWRfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwljaGFyIGNkYltUV19NQVhfQ0RCX0xFTl07CisJVFdfU0dfRW50cnkgc2dsaXN0WzFdOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlpbnQgcmV0dmFsID0gMTsKKworCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbcmVxdWVzdF9pZF07CisJbWVtc2V0KGZ1bGxfY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKTsKKworCS8qIEluaXRpYWxpemUgY2RiICovCisJbWVtc2V0KCZjZGIsIDAsIFRXX01BWF9DREJfTEVOKTsKKwljZGJbMF0gPSBSRVFVRVNUX1NFTlNFOyAvKiBvcGNvZGUgKi8KKwljZGJbNF0gPSBUV19BTExPQ0FUSU9OX0xFTkdUSDsgLyogYWxsb2NhdGlvbiBsZW5ndGggKi8KKworCS8qIEluaXRpYWxpemUgc2dsaXN0ICovCisJbWVtc2V0KCZzZ2xpc3QsIDAsIHNpemVvZihUV19TR19FbnRyeSkpOworCXNnbGlzdFswXS5sZW5ndGggPSBUV19TRUNUT1JfU0laRTsKKwlzZ2xpc3RbMF0uYWRkcmVzcyA9IHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfcGh5c1tyZXF1ZXN0X2lkXTsKKworCS8qIE1hcmsgaW50ZXJuYWwgY29tbWFuZCAqLworCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdID0gTlVMTDsKKworCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCAqLworCWlmICh0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaSh0d19kZXYsIHJlcXVlc3RfaWQsIGNkYiwgMSwgc2dsaXN0KSkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4NCwgIlBvc3QgZmFpbGVkIHdoaWxlIHJlYWRpbmcgQUVOIHF1ZXVlIik7CisJCWdvdG8gb3V0OworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfYWVuX3JlYWRfcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9vayB1cCBhbiBBRU4gc2V2ZXJpdHkgc3RyaW5nICovCitzdGF0aWMgY2hhciAqdHdhX2Flbl9zZXZlcml0eV9sb29rdXAodW5zaWduZWQgY2hhciBzZXZlcml0eV9jb2RlKQoreworCWNoYXIgKnJldHZhbCA9IE5VTEw7CisKKwlpZiAoKHNldmVyaXR5X2NvZGUgPCAodW5zaWduZWQgY2hhcikgVFdfQUVOX1NFVkVSSVRZX0VSUk9SKSB8fAorCSAgICAoc2V2ZXJpdHlfY29kZSA+ICh1bnNpZ25lZCBjaGFyKSBUV19BRU5fU0VWRVJJVFlfREVCVUcpKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IHR3YV9hZW5fc2V2ZXJpdHlfdGFibGVbc2V2ZXJpdHlfY29kZV07CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9hZW5fc2V2ZXJpdHlfbG9va3VwKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHN5bmMgZmlybXdhcmUgdGltZSB3aXRoIHRoZSBob3N0IHRpbWUgKi8KK3N0YXRpYyB2b2lkIHR3YV9hZW5fc3luY190aW1lKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdTMyIHNjaGVkdWxlcnRpbWU7CisJc3RydWN0IHRpbWV2YWwgdXRjOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwlUV19QYXJhbV9BcGFjaGUgKnBhcmFtOworCXUzMiBsb2NhbF90aW1lOworCisJLyogRmlsbCBvdXQgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQoZnVsbF9jb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCWNvbW1hbmRfcGFja2V0ID0gJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZDsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigyLCBUV19PUF9TRVRfUEFSQU0pOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZThfb2Zmc2V0LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW3JlcXVlc3RfaWRdOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOF9vZmZzZXQucGFyYW0uc2dsWzBdLmxlbmd0aCA9IFRXX1NFQ1RPUl9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gVFdfQ09NTUFORF9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5ieXRlNl9vZmZzZXQucGFyYW1ldGVyX2NvdW50ID0gMTsKKworCS8qIFNldHVwIHRoZSBwYXJhbSAqLworCXBhcmFtID0gKFRXX1BhcmFtX0FwYWNoZSAqKXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQocGFyYW0sIDAsIFRXX1NFQ1RPUl9TSVpFKTsKKwlwYXJhbS0+dGFibGVfaWQgPSBUV19USU1FS0VFUF9UQUJMRSB8IDB4ODAwMDsgLyogQ29udHJvbGxlciB0aW1lIGtlZXAgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gMHgzOyAvKiBTY2hlZHVsZXJUaW1lICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gNDsKKworCS8qIENvbnZlcnQgc3lzdGVtIHRpbWUgaW4gVVRDIHRvIGxvY2FsIHRpbWUgc2Vjb25kcyBzaW5jZSBsYXN0IAorICAgICAgICAgICBTdW5kYXkgMTI6MDBBTSAqLworCWRvX2dldHRpbWVvZmRheSgmdXRjKTsKKwlsb2NhbF90aW1lID0gKHUzMikodXRjLnR2X3NlYyAtIChzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkpOworCXNjaGVkdWxlcnRpbWUgPSBsb2NhbF90aW1lIC0gKDMgKiA4NjQwMCk7CisJc2NoZWR1bGVydGltZSA9IHNjaGVkdWxlcnRpbWUgJSA2MDQ4MDA7CisKKwltZW1jcHkocGFyYW0tPmRhdGEsICZzY2hlZHVsZXJ0aW1lLCBzaXplb2YodTMyKSk7CisKKwkvKiBNYXJrIGludGVybmFsIGNvbW1hbmQgKi8KKwl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7CisKKwkvKiBOb3cgcG9zdCB0aGUgY29tbWFuZCAqLworCXR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCwgMSk7Cit9IC8qIEVuZCB0d2FfYWVuX3N5bmNfdGltZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBtZW1vcnkgYW5kIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3RseSBhbGlnbmVkICovCitzdGF0aWMgaW50IHR3YV9hbGxvY2F0ZV9tZW1vcnkoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgc2l6ZSwgaW50IHdoaWNoKQoreworCWludCBpOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nICpjcHVfYWRkcjsKKwlpbnQgcmV0dmFsID0gMTsKKworCWNwdV9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHdfZGV2LT50d19wY2lfZGV2LCBzaXplKlRXX1FfTEVOR1RILCAmZG1hX2hhbmRsZSk7CisJaWYgKCFjcHVfYWRkcikgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4NSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIgJSAoVFdfQUxJR05NRU5UXzkwMDApKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHg2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvcnJlY3RseSBhbGlnbmVkIG1lbW9yeSIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2Rldiwgc2l6ZSpUV19RX0xFTkdUSCwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoY3B1X2FkZHIsIDAsIHNpemUqVFdfUV9MRU5HVEgpOworCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJc3dpdGNoKHdoaWNoKSB7CisJCWNhc2UgMDoKKwkJCXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbaV0gPSAoVFdfQ29tbWFuZF9GdWxsICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzW2ldID0gZG1hX2hhbmRsZSsoaSpzaXplKTsKKwkJCXR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFtpXSA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfYWxsb2NhdGVfbWVtb3J5KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIHRoZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIHVuZXhwZWN0ZWQgYml0cyAqLworc3RhdGljIGludCB0d2FfY2hlY2tfYml0cyh1MzIgc3RhdHVzX3JlZ192YWx1ZSkKK3sKKwlpbnQgcmV0dmFsID0gMTsKKworCWlmICgoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19FWFBFQ1RFRF9CSVRTKSAhPSBUV19TVEFUVVNfRVhQRUNURURfQklUUykKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1VORVhQRUNURURfQklUUykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfY2hlY2tfYml0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayB0aGUgc3JsIGFuZCBkZWNpZGUgaWYgd2UgYXJlIGNvbXBhdGlibGUgICovCitzdGF0aWMgaW50IHR3YV9jaGVja19zcmwoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgKmZsYXNoZWQpCit7CisJaW50IHJldHZhbCA9IDE7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9zcmwgPSAwLCBmd19vbl9jdGxyX2FyY2hfaWQgPSAwOworCXVuc2lnbmVkIHNob3J0IGZ3X29uX2N0bHJfYnJhbmNoID0gMCwgZndfb25fY3Rscl9idWlsZCA9IDA7CisJdTMyIGluaXRfY29ubmVjdF9yZXN1bHQgPSAwOworCisJaWYgKHR3YV9pbml0Y29ubmVjdGlvbih0d19kZXYsIFRXX0lOSVRfTUVTU0FHRV9DUkVESVRTLAorCQkJICAgICAgIFRXX0VYVEVOREVEX0lOSVRfQ09OTkVDVCwgVFdfQ1VSUkVOVF9EUklWRVJfU1JMLAorCQkJICAgICAgIFRXXzkwMDBfQVJDSF9JRCwgVFdfQ1VSUkVOVF9EUklWRVJfQlJBTkNILAorCQkJICAgICAgIFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxELCAmZndfb25fY3Rscl9zcmwsCisJCQkgICAgICAgJmZ3X29uX2N0bHJfYXJjaF9pZCwgJmZ3X29uX2N0bHJfYnJhbmNoLAorCQkJICAgICAgICZmd19vbl9jdGxyX2J1aWxkLCAmaW5pdF9jb25uZWN0X3Jlc3VsdCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDcsICJJbml0Y29ubmVjdGlvbiBmYWlsZWQgd2hpbGUgY2hlY2tpbmcgU1JMIik7CisJCWdvdG8gb3V0OworCX0KKworCXR3X2Rldi0+d29ya2luZ19zcmwgPSBmd19vbl9jdGxyX3NybDsKKwl0d19kZXYtPndvcmtpbmdfYnJhbmNoID0gZndfb25fY3Rscl9icmFuY2g7CisJdHdfZGV2LT53b3JraW5nX2J1aWxkID0gZndfb25fY3Rscl9idWlsZDsKKworCS8qIFRyeSBiYXNlIG1vZGUgY29tcGF0aWJpbGl0eSAqLworCWlmICghKGluaXRfY29ubmVjdF9yZXN1bHQgJiBUV19DVExSX0ZXX0NPTVBBVElCTEUpKSB7CisJCWlmICh0d2FfaW5pdGNvbm5lY3Rpb24odHdfZGV2LCBUV19JTklUX01FU1NBR0VfQ1JFRElUUywKKwkJCQkgICAgICAgVFdfRVhURU5ERURfSU5JVF9DT05ORUNULAorCQkJCSAgICAgICBUV19CQVNFX0ZXX1NSTCwgVFdfOTAwMF9BUkNIX0lELAorCQkJCSAgICAgICBUV19CQVNFX0ZXX0JSQU5DSCwgVFdfQkFTRV9GV19CVUlMRCwKKwkJCQkgICAgICAgJmZ3X29uX2N0bHJfc3JsLCAmZndfb25fY3Rscl9hcmNoX2lkLAorCQkJCSAgICAgICAmZndfb25fY3Rscl9icmFuY2gsICZmd19vbl9jdGxyX2J1aWxkLAorCQkJCSAgICAgICAmaW5pdF9jb25uZWN0X3Jlc3VsdCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhhLCAiSW5pdGNvbm5lY3Rpb24gKGJhc2UgbW9kZSkgZmFpbGVkIHdoaWxlIGNoZWNraW5nIFNSTCIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCEoaW5pdF9jb25uZWN0X3Jlc3VsdCAmIFRXX0NUTFJfRldfQ09NUEFUSUJMRSkpIHsKKwkJCWlmIChUV19DVVJSRU5UX0RSSVZFUl9TUkwgPiBmd19vbl9jdGxyX3NybCkgeworCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgzMiwgIkZpcm13YXJlIGFuZCBkcml2ZXIgaW5jb21wYXRpYmlsaXR5OiBwbGVhc2UgdXBncmFkZSBmaXJtd2FyZSIpOworCQkJfSBlbHNlIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MzMsICJGaXJtd2FyZSBhbmQgZHJpdmVyIGluY29tcGF0aWJpbGl0eTogcGxlYXNlIHVwZ3JhZGUgZHJpdmVyIik7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorCQl0d19kZXYtPndvcmtpbmdfc3JsID0gVFdfQkFTRV9GV19TUkw7CisJCXR3X2Rldi0+d29ya2luZ19icmFuY2ggPSBUV19CQVNFX0ZXX0JSQU5DSDsKKwkJdHdfZGV2LT53b3JraW5nX2J1aWxkID0gVFdfQkFTRV9GV19CVUlMRDsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2NoZWNrX3NybCgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpb2N0bCBmb3IgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgdHdhX2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgKmNwdV9hZGRyLCBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQgPSAwLCBmbGFncyA9IDA7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCWludCByZXF1ZXN0X2lkID0gMDsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2VfaWQgPSAwOworCXVuc2lnbmVkIGNoYXIgZXZlbnRfaW5kZXgsIHN0YXJ0X2luZGV4OworCVRXX0lvY3RsX0RyaXZlcl9Db21tYW5kIGRyaXZlcl9jb21tYW5kOworCVRXX0lvY3RsX0J1Zl9BcGFjaGUgKnR3X2lvY3RsOworCVRXX0xvY2sgKnR3X2xvY2s7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0NvbXBhdGliaWxpdHlfSW5mbyAqdHdfY29tcGF0X2luZm87CisJVFdfRXZlbnQgKmV2ZW50OworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKwl1MzIgY3VycmVudF90aW1lX21zOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IHR3YV9kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbaW1pbm9yKGlub2RlKV07CisJaW50IHJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VGQVVMVDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qIE9ubHkgbGV0IG9uZSBvZiB0aGVzZSB0aHJvdWdoIGF0IGEgdGltZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnR3X2Rldi0+aW9jdGxfc2VtKSkgeworCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU5UUjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlyc3QgY29weSBkb3duIHRoZSBkcml2ZXIgY29tbWFuZCAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmZHJpdmVyX2NvbW1hbmQsIGFyZ3AsIHNpemVvZihUV19Jb2N0bF9Ecml2ZXJfQ29tbWFuZCkpKQorCQlnb3RvIG91dDI7CisKKwkvKiBDaGVjayBkYXRhIGJ1ZmZlciBzaXplICovCisJaWYgKGRyaXZlcl9jb21tYW5kLmJ1ZmZlcl9sZW5ndGggPiBUV19NQVhfU0VDVE9SUyAqIDUxMikgeworCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU5WQUw7CisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBIYXJkd2FyZSBjYW4gb25seSBkbyBtdWx0aXBsZSBvZiA1MTIgYnl0ZSB0cmFuc2ZlcnMgKi8KKwlkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQgPSAoZHJpdmVyX2NvbW1hbmQuYnVmZmVyX2xlbmd0aCArIDUxMSkgJiB+NTExOworCisJLyogTm93IGFsbG9jYXRlIGlvY3RsIGJ1ZiBtZW1vcnkgKi8KKwljcHVfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmdHdfZGV2LT50d19wY2lfZGV2LT5kZXYsIGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCtzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxLCAmZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcHVfYWRkcikgeworCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FTk9NRU07CisJCWdvdG8gb3V0MjsKKwl9CisKKwl0d19pb2N0bCA9IChUV19Jb2N0bF9CdWZfQXBhY2hlICopY3B1X2FkZHI7CisKKwkvKiBOb3cgY29weSBkb3duIHRoZSBlbnRpcmUgaW9jdGwgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIodHdfaW9jdGwsIGFyZ3AsIGRyaXZlcl9jb21tYW5kLmJ1ZmZlcl9sZW5ndGggKyBzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxKSkKKwkJZ290byBvdXQzOworCisJLyogU2VlIHdoaWNoIGlvY3RsIHdlIGFyZSBkb2luZyAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUV19JT0NUTF9GSVJNV0FSRV9QQVNTX1RIUk9VR0g6CisJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXR3YV9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkvKiBGbGFnIGludGVybmFsIGNvbW1hbmQgKi8KKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBOVUxMOworCisJCS8qIEZsYWcgY2hyZGV2IGlvY3RsICovCisJCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCisJCWZ1bGxfY29tbWFuZF9wYWNrZXQgPSAmdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQ7CisKKwkJLyogTG9hZCByZXF1ZXN0IGlkIGFuZCBzZ2xpc3QgZm9yIGJvdGggY29tbWFuZCB0eXBlcyAqLworCQl0d2FfbG9hZF9zZ2woZnVsbF9jb21tYW5kX3BhY2tldCwgcmVxdWVzdF9pZCwgZG1hX2hhbmRsZSwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkKTsKKworCQltZW1jcHkodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdLCAmKHR3X2lvY3RsLT5maXJtd2FyZV9jb21tYW5kKSwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCisJCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgY29udHJvbGxlciAqLworCQl0d2FfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQsIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJdGltZW91dCA9IFRXX0lPQ1RMX0NIUkRFVl9USU1FT1VUKkhaOworCisJCS8qIE5vdyB3YWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHdfZGV2LT5pb2N0bF93cXVldWUsIHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUsIHRpbWVvdXQpOworCisJCS8qIFNlZSBpZiB3ZSByZXNldCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgaW9jdGwgdG8gY29tcGxldGUgKi8KKwkJaWYgKHRlc3RfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncykpIHsKKwkJCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOworCQkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRVJFU1RBUlRTWVM7CisJCQlnb3RvIG91dDM7CisJCX0KKworCQkvKiBXZSB0aW1lZCBvdXQsIGFuZCBkaWRuJ3QgZ2V0IGFuIGludGVycnVwdCAqLworCQlpZiAodHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCAhPSBUV19JT0NUTF9DSFJERVZfRlJFRSkgeworCQkJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IFdBUk5JTkc6ICgweCUwMlg6MHglMDRYKTogQ2hhcmFjdGVyIGlvY3RsICgweCV4KSB0aW1lZCBvdXQsIHJlc2V0dGluZyBjYXJkLlxuIiwKKwkJCSAgICAgICB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIFRXX0RSSVZFUiwgMHhjLAorCQkJICAgICAgIGNtZCk7CisJCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU87CisJCQlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQkJdHdhX2ZyZWVfcmVxdWVzdF9pZCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJdHdhX3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAxKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCisJCS8qIE5vdyBjb3B5IGluIHRoZSBjb21tYW5kIHBhY2tldCByZXNwb25zZSAqLworCQltZW1jcHkoJih0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZCksIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXSwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCQkKKwkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdhX2ZyZWVfcmVxdWVzdF9pZCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgVFdfSU9DVExfR0VUX0NPTVBBVElCSUxJVFlfSU5GTzoKKwkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCS8qIENvcHkgY29tcGF0aWJsaXR5IHN0cnVjdCBpbnRvIGlvY3RsIGRhdGEgYnVmZmVyICovCisJCXR3X2NvbXBhdF9pbmZvID0gKFRXX0NvbXBhdGliaWxpdHlfSW5mbyAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKKwkJc3RybmNweSh0d19jb21wYXRfaW5mby0+ZHJpdmVyX3ZlcnNpb24sIFRXX0RSSVZFUl9WRVJTSU9OLCBzdHJsZW4oVFdfRFJJVkVSX1ZFUlNJT04pKTsKKwkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfc3JsID0gdHdfZGV2LT53b3JraW5nX3NybDsKKwkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnJhbmNoID0gdHdfZGV2LT53b3JraW5nX2JyYW5jaDsKKwkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnVpbGQgPSB0d19kZXYtPndvcmtpbmdfYnVpbGQ7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfc3JsX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9TUkw7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEOworCQl0d19jb21wYXRfaW5mby0+ZHJpdmVyX3NybF9sb3cgPSBUV19CQVNFX0ZXX1NSTDsKKwkJdHdfY29tcGF0X2luZm8tPmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfbG93ID0gVFdfQkFTRV9GV19CVUlMRDsKKwkJYnJlYWs7CisJY2FzZSBUV19JT0NUTF9HRVRfTEFTVF9FVkVOVDoKKwkJaWYgKHR3X2Rldi0+ZXZlbnRfcXVldWVfd3JhcHBlZCkgeworCQkJaWYgKHR3X2Rldi0+YWVuX2Nsb2JiZXIpIHsKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX0FFTl9DTE9CQkVSOworCQkJCXR3X2Rldi0+YWVuX2Nsb2JiZXIgPSAwOworCQkJfSBlbHNlCisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoIXR3X2Rldi0+ZXJyb3JfaW5kZXgpIHsKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX05PX01PUkVfRVZFTlRTOworCQkJCWJyZWFrOworCQkJfQorCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCX0KKwkJZXZlbnRfaW5kZXggPSAodHdfZGV2LT5lcnJvcl9pbmRleCAtIDEgKyBUV19RX0xFTkdUSCkgJSBUV19RX0xFTkdUSDsKKwkJbWVtY3B5KHR3X2lvY3RsLT5kYXRhX2J1ZmZlciwgdHdfZGV2LT5ldmVudF9xdWV1ZVtldmVudF9pbmRleF0sIHNpemVvZihUV19FdmVudCkpOworCQl0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XS0+cmV0cmlldmVkID0gVFdfQUVOX1JFVFJJRVZFRDsKKwkJYnJlYWs7CisJY2FzZSBUV19JT0NUTF9HRVRfRklSU1RfRVZFTlQ6CisJCWlmICh0d19kZXYtPmV2ZW50X3F1ZXVlX3dyYXBwZWQpIHsKKwkJCWlmICh0d19kZXYtPmFlbl9jbG9iYmVyKSB7CisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19BRU5fQ0xPQkJFUjsKKwkJCQl0d19kZXYtPmFlbl9jbG9iYmVyID0gMDsKKwkJCX0gZWxzZSAKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gMDsKKwkJCWV2ZW50X2luZGV4ID0gdHdfZGV2LT5lcnJvcl9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlmICghdHdfZGV2LT5lcnJvcl9pbmRleCkgeworCQkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfTk9fTU9SRV9FVkVOVFM7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gMDsKKwkJCWV2ZW50X2luZGV4ID0gMDsKKwkJfQorCQltZW1jcHkodHdfaW9jdGwtPmRhdGFfYnVmZmVyLCB0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XSwgc2l6ZW9mKFRXX0V2ZW50KSk7CisJCXR3X2Rldi0+ZXZlbnRfcXVldWVbZXZlbnRfaW5kZXhdLT5yZXRyaWV2ZWQgPSBUV19BRU5fUkVUUklFVkVEOworCQlicmVhazsKKwljYXNlIFRXX0lPQ1RMX0dFVF9ORVhUX0VWRU5UOgorCQlldmVudCA9IChUV19FdmVudCAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKKwkJc2VxdWVuY2VfaWQgPSBldmVudC0+c2VxdWVuY2VfaWQ7CisJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSAwOworCisJCWlmICh0d19kZXYtPmV2ZW50X3F1ZXVlX3dyYXBwZWQpIHsKKwkJCWlmICh0d19kZXYtPmFlbl9jbG9iYmVyKSB7CisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19BRU5fQ0xPQkJFUjsKKwkJCQl0d19kZXYtPmFlbl9jbG9iYmVyID0gMDsKKwkJCX0KKwkJCXN0YXJ0X2luZGV4ID0gdHdfZGV2LT5lcnJvcl9pbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlmICghdHdfZGV2LT5lcnJvcl9pbmRleCkgeworCQkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfTk9fTU9SRV9FVkVOVFM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzdGFydF9pbmRleCA9IDA7CisJCX0KKwkJZXZlbnRfaW5kZXggPSAoc3RhcnRfaW5kZXggKyBzZXF1ZW5jZV9pZCAtIHR3X2Rldi0+ZXZlbnRfcXVldWVbc3RhcnRfaW5kZXhdLT5zZXF1ZW5jZV9pZCArIDEpICUgVFdfUV9MRU5HVEg7CisKKwkJaWYgKCEodHdfZGV2LT5ldmVudF9xdWV1ZVtldmVudF9pbmRleF0tPnNlcXVlbmNlX2lkID4gc2VxdWVuY2VfaWQpKSB7CisJCQlpZiAodHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9PSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfQUVOX0NMT0JCRVIpCisJCQkJdHdfZGV2LT5hZW5fY2xvYmJlciA9IDE7CisJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX05PX01PUkVfRVZFTlRTOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHR3X2lvY3RsLT5kYXRhX2J1ZmZlciwgdHdfZGV2LT5ldmVudF9xdWV1ZVtldmVudF9pbmRleF0sIHNpemVvZihUV19FdmVudCkpOworCQl0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XS0+cmV0cmlldmVkID0gVFdfQUVOX1JFVFJJRVZFRDsKKwkJYnJlYWs7CisJY2FzZSBUV19JT0NUTF9HRVRfUFJFVklPVVNfRVZFTlQ6CisJCWV2ZW50ID0gKFRXX0V2ZW50ICopdHdfaW9jdGwtPmRhdGFfYnVmZmVyOworCQlzZXF1ZW5jZV9pZCA9IGV2ZW50LT5zZXF1ZW5jZV9pZDsKKwkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisKKwkJaWYgKHR3X2Rldi0+ZXZlbnRfcXVldWVfd3JhcHBlZCkgeworCQkJaWYgKHR3X2Rldi0+YWVuX2Nsb2JiZXIpIHsKKwkJCQl0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID0gVFdfSU9DVExfRVJST1JfU1RBVFVTX0FFTl9DTE9CQkVSOworCQkJCXR3X2Rldi0+YWVuX2Nsb2JiZXIgPSAwOworCQkJfQorCQkJc3RhcnRfaW5kZXggPSB0d19kZXYtPmVycm9yX2luZGV4OworCQl9IGVsc2UgeworCQkJaWYgKCF0d19kZXYtPmVycm9yX2luZGV4KSB7CisJCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19OT19NT1JFX0VWRU5UUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXJ0X2luZGV4ID0gMDsKKwkJfQorCQlldmVudF9pbmRleCA9IChzdGFydF9pbmRleCArIHNlcXVlbmNlX2lkIC0gdHdfZGV2LT5ldmVudF9xdWV1ZVtzdGFydF9pbmRleF0tPnNlcXVlbmNlX2lkIC0gMSkgJSBUV19RX0xFTkdUSDsKKworCQlpZiAoISh0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XS0+c2VxdWVuY2VfaWQgPCBzZXF1ZW5jZV9pZCkpIHsKKwkJCWlmICh0d19pb2N0bC0+ZHJpdmVyX2NvbW1hbmQuc3RhdHVzID09IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19BRU5fQ0xPQkJFUikKKwkJCQl0d19kZXYtPmFlbl9jbG9iYmVyID0gMTsKKwkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSBUV19JT0NUTF9FUlJPUl9TVEFUVVNfTk9fTU9SRV9FVkVOVFM7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkodHdfaW9jdGwtPmRhdGFfYnVmZmVyLCB0d19kZXYtPmV2ZW50X3F1ZXVlW2V2ZW50X2luZGV4XSwgc2l6ZW9mKFRXX0V2ZW50KSk7CisJCXR3X2Rldi0+ZXZlbnRfcXVldWVbZXZlbnRfaW5kZXhdLT5yZXRyaWV2ZWQgPSBUV19BRU5fUkVUUklFVkVEOworCQlicmVhazsKKwljYXNlIFRXX0lPQ1RMX0dFVF9MT0NLOgorCQl0d19sb2NrID0gKFRXX0xvY2sgKil0d19pb2N0bC0+ZGF0YV9idWZmZXI7CisJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJY3VycmVudF90aW1lX21zID0gKGN1cnJlbnRfdGltZS50dl9zZWMgKiAxMDAwKSArIChjdXJyZW50X3RpbWUudHZfdXNlYyAvIDEwMDApOworCisJCWlmICgodHdfbG9jay0+Zm9yY2VfZmxhZyA9PSAxKSB8fCAodHdfZGV2LT5pb2N0bF9zZW1fbG9jayA9PSAwKSB8fCAoY3VycmVudF90aW1lX21zID49IHR3X2Rldi0+aW9jdGxfbXNlYykpIHsKKwkJCXR3X2Rldi0+aW9jdGxfc2VtX2xvY2sgPSAxOworCQkJdHdfZGV2LT5pb2N0bF9tc2VjID0gY3VycmVudF90aW1lX21zICsgdHdfbG9jay0+dGltZW91dF9tc2VjOworCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CisJCQl0d19sb2NrLT50aW1lX3JlbWFpbmluZ19tc2VjID0gdHdfbG9jay0+dGltZW91dF9tc2VjOworCQl9IGVsc2UgeworCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19MT0NLRUQ7CisJCQl0d19sb2NrLT50aW1lX3JlbWFpbmluZ19tc2VjID0gdHdfZGV2LT5pb2N0bF9tc2VjIC0gY3VycmVudF90aW1lX21zOworCQl9CisJCWJyZWFrOworCWNhc2UgVFdfSU9DVExfUkVMRUFTRV9MT0NLOgorCQlpZiAodHdfZGV2LT5pb2N0bF9zZW1fbG9jayA9PSAxKSB7CisJCQl0d19kZXYtPmlvY3RsX3NlbV9sb2NrID0gMDsKKwkJCXR3X2lvY3RsLT5kcml2ZXJfY29tbWFuZC5zdGF0dXMgPSAwOworCQl9IGVsc2UgeworCQkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19OT1RfTE9DS0VEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VOT1RUWTsKKwkJZ290byBvdXQzOworCX0KKworCS8qIE5vdyBjb3B5IHRoZSBlbnRpcmUgcmVzcG9uc2UgdG8gdXNlcnNwYWNlICovCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB0d19pb2N0bCwgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpICsgZHJpdmVyX2NvbW1hbmQuYnVmZmVyX2xlbmd0aCAtIDEpID09IDApCisJCXJldHZhbCA9IDA7CitvdXQzOgorCS8qIE5vdyBmcmVlIGlvY3RsIGJ1ZiBtZW1vcnkgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmdHdfZGV2LT50d19wY2lfZGV2LT5kZXYsIGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCtzaXplb2YoVFdfSW9jdGxfQnVmX0FwYWNoZSkgLSAxLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7CitvdXQyOgorCXVwKCZ0d19kZXYtPmlvY3RsX3NlbSk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9jaHJkZXZfaW9jdGwoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgb3BlbiBmb3IgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgdHdhX2NocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vcl9udW1iZXI7CisJaW50IHJldHZhbCA9IFRXX0lPQ1RMX0VSUk9SX09TX0VOT0RFVjsKKworCW1pbm9yX251bWJlciA9IGltaW5vcihpbm9kZSk7CisJaWYgKG1pbm9yX251bWJlciA+PSB0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2NocmRldl9vcGVuKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHByaW50IHJlYWRhYmxlIG1lc3NhZ2VzIGZyb20gc3RhdHVzIHJlZ2lzdGVyIGVycm9ycyAqLworc3RhdGljIGludCB0d2FfZGVjb2RlX2JpdHMoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCB1MzIgc3RhdHVzX3JlZ192YWx1ZSkKK3sKKwlpbnQgcmV0dmFsID0gMTsKKworCS8qIENoZWNrIGZvciB2YXJpb3VzIGVycm9yIGNvbmRpdGlvbnMgYW5kIGhhbmRsZSB0aGVtIGFwcHJvcHJpYXRlbHkgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19QQ0lfUEFSSVRZX0VSUk9SKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHhjLCAiUENJIFBhcml0eSBFcnJvcjogY2xlYXJpbmciKTsKKwkJd3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfUEFSSVRZX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1BDSV9BQk9SVCkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZCwgIlBDSSBBYm9ydDogY2xlYXJpbmciKTsKKwkJd3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfUENJX0FCT1JULCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHdfZGV2LT50d19wY2lfZGV2LCBQQ0lfU1RBVFVTLCBUV19QQ0lfQ0xFQVJfUENJX0FCT1JUKTsKKwl9CisKKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19RVUVVRV9FUlJPUikgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIkNvbnRyb2xsZXIgUXVldWUgRXJyb3I6IGNsZWFyaW5nIik7CisJCXdyaXRlbChUV19DT05UUk9MX0NMRUFSX1FVRVVFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1NCVUZfV1JJVEVfRVJST1IpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweGYsICJTQlVGIFdyaXRlIEVycm9yOiBjbGVhcmluZyIpOworCQl3cml0ZWwoVFdfQ09OVFJPTF9DTEVBUl9TQlVGX1dSSVRFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9FUlJPUikgeworCQlpZiAodHdfZGV2LT5yZXNldF9wcmludCA9PSAwKSB7CisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTAsICJNaWNyb2NvbnRyb2xsZXIgRXJyb3I6IGNsZWFyaW5nIik7CisJCQl0d19kZXYtPnJlc2V0X3ByaW50ID0gMTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2RlY29kZV9iaXRzKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGVtcHR5IHRoZSByZXNwb25zZSBxdWV1ZSAqLworc3RhdGljIGludCB0d2FfZW1wdHlfcmVzcG9uc2VfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlLCByZXNwb25zZV9xdWVfdmFsdWU7CisJaW50IGNvdW50ID0gMCwgcmV0dmFsID0gMTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSByZWFkbChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisKKwl3aGlsZSAoKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1JFU1BPTlNFX1FVRVVFX0VNUFRZKSA9PSAwKSAmJiAoY291bnQgPCBUV19NQVhfUkVTUE9OU0VfRFJBSU4pKSB7CisJCXJlc3BvbnNlX3F1ZV92YWx1ZSA9IHJlYWRsKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQljb3VudCsrOworCX0KKwlpZiAoY291bnQgPT0gVFdfTUFYX1JFU1BPTlNFX0RSQUlOKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9lbXB0eV9yZXNwb25zZV9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gcGFzc2VzIHNlbnNlIGtleXMgZnJvbSBmaXJtd2FyZSB0byBzY3NpIGxheWVyICovCitzdGF0aWMgaW50IHR3YV9maWxsX3NlbnNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQsIGludCBjb3B5X3NlbnNlLCBpbnQgcHJpbnRfaG9zdCkKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJdW5zaWduZWQgc2hvcnQgZXJyb3I7CisJaW50IHJldHZhbCA9IDE7CisJY2hhciAqZXJyb3Jfc3RyOworCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKworCS8qIENoZWNrIGZvciBlbWJlZGRlZCBlcnJvciBzdHJpbmcgKi8KKwllcnJvcl9zdHIgPSAmKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5lcnJfc3BlY2lmaWNfZGVzY1tzdHJsZW4oZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmVycl9zcGVjaWZpY19kZXNjKSArIDFdKTsKKworCS8qIERvbid0IHByaW50IGVycm9yIGZvciBMb2dpY2FsIHVuaXQgbm90IHN1cHBvcnRlZCBkdXJpbmcgcm9sbGNhbGwgKi8KKwllcnJvciA9IGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zdGF0dXNfYmxvY2suZXJyb3I7CisJaWYgKChlcnJvciAhPSBUV19FUlJPUl9MT0dJQ0FMX1VOSVRfTk9UX1NVUFBPUlRFRCkgJiYgKGVycm9yICE9IFRXX0VSUk9SX1VOSVRfT0ZGTElORSkpIHsKKwkJaWYgKHByaW50X2hvc3QpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IEVSUk9SOiAoMHglMDJYOjB4JTA0WCk6ICVzOiVzLlxuIiwKKwkJCSAgICAgICB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sCisJCQkgICAgICAgVFdfTUVTU0FHRV9TT1VSQ0VfQ09OVFJPTExFUl9FUlJPUiwKKwkJCSAgICAgICBmdWxsX2NvbW1hbmRfcGFja2V0LT5oZWFkZXIuc3RhdHVzX2Jsb2NrLmVycm9yLAorCQkJICAgICAgIGVycm9yX3N0clswXSA9PSAnXDAnID8KKwkJCSAgICAgICB0d2Ffc3RyaW5nX2xvb2t1cCh0d2FfZXJyb3JfdGFibGUsCisJCQkJCQkgZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5lcnJvcikgOiBlcnJvcl9zdHIsCisJCQkgICAgICAgZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmVycl9zcGVjaWZpY19kZXNjKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDogRVJST1I6ICgweCUwMlg6MHglMDRYKTogJXM6JXMuXG4iLAorCQkJICAgICAgIFRXX01FU1NBR0VfU09VUkNFX0NPTlRST0xMRVJfRVJST1IsCisJCQkgICAgICAgZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5lcnJvciwKKwkJCSAgICAgICBlcnJvcl9zdHJbMF0gPT0gJ1wwJyA/CisJCQkgICAgICAgdHdhX3N0cmluZ19sb29rdXAodHdhX2Vycm9yX3RhYmxlLAorCQkJCQkJIGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zdGF0dXNfYmxvY2suZXJyb3IpIDogZXJyb3Jfc3RyLAorCQkJICAgICAgIGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5lcnJfc3BlY2lmaWNfZGVzYyk7CisJfQorCisJaWYgKGNvcHlfc2Vuc2UpIHsKKwkJbWVtY3B5KHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zZW5zZV9idWZmZXIsIGZ1bGxfY29tbWFuZF9wYWNrZXQtPmhlYWRlci5zZW5zZV9kYXRhLCBUV19TRU5TRV9EQVRBX0xFTkdUSCk7CisJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnN0YXR1cyA8PCAxKTsKKwkJcmV0dmFsID0gVFdfSVNSX0RPTlRfUkVTVUxUOworCQlnb3RvIG91dDsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2ZpbGxfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSB1cCBkZXZpY2UgZXh0ZW5zaW9uIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgdHdhX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJaWYgKHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFswXSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0d19kZXYtPnR3X3BjaV9kZXYsCisJCQkJICAgIHNpemVvZihUV19Db21tYW5kX0Z1bGwpKlRXX1FfTEVOR1RILAorCQkJCSAgICB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnRbMF0sCisJCQkJICAgIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c1swXSk7CisKKwlpZiAodHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0WzBdKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2RldiwKKwkJCQkgICAgVFdfU0VDVE9SX1NJWkUqVFdfUV9MRU5HVEgsCisJCQkJICAgIHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfdmlydFswXSwKKwkJCQkgICAgdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl9waHlzWzBdKTsKKworCWlmICh0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKQorCQlrZnJlZSh0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKTsKK30gLyogRW5kIHR3YV9mcmVlX2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhIHJlcXVlc3QgaWQgKi8KK3N0YXRpYyB2b2lkIHR3YV9mcmVlX3JlcXVlc3RfaWQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwl0d19kZXYtPmZyZWVfcXVldWVbdHdfZGV2LT5mcmVlX3RhaWxdID0gcmVxdWVzdF9pZDsKKwl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19GSU5JU0hFRDsKKwl0d19kZXYtPmZyZWVfdGFpbCA9ICh0d19kZXYtPmZyZWVfdGFpbCArIDEpICUgVFdfUV9MRU5HVEg7Cit9IC8qIEVuZCB0d2FfZnJlZV9yZXF1ZXN0X2lkKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCBwYXJhbWV0ZXIgdGFibGUgZW50aXJlcyBmcm9tIHRoZSBmaXJtd2FyZSAqLworc3RhdGljIHZvaWQgKnR3YV9nZXRfcGFyYW0oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgaW50IHRhYmxlX2lkLCBpbnQgcGFyYW1ldGVyX2lkLCBpbnQgcGFyYW1ldGVyX3NpemVfYnl0ZXMpCit7CisJVFdfQ29tbWFuZF9GdWxsICpmdWxsX2NvbW1hbmRfcGFja2V0OworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCVRXX1BhcmFtX0FwYWNoZSAqcGFyYW07CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKwl2b2lkICpyZXR2YWwgPSBOVUxMOworCisJLyogU2V0dXAgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwltZW1zZXQoZnVsbF9jb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCkpOworCWNvbW1hbmRfcGFja2V0ID0gJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZDsKKworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDIsIFRXX09QX0dFVF9QQVJBTSk7CisJY29tbWFuZF9wYWNrZXQtPnNpemUgICAgICAgICAgICAgID0gVFdfQ09NTUFORF9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkICAgICAgICA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2X29mZnNldC5ibG9ja19jb3VudCA9IDE7CisKKwkvKiBOb3cgc2V0dXAgdGhlIHBhcmFtICovCisJcGFyYW0gPSAoVFdfUGFyYW1fQXBhY2hlICopdHdfZGV2LT5nZW5lcmljX2J1ZmZlcl92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgVFdfU0VDVE9SX1NJWkUpOworCXBhcmFtLT50YWJsZV9pZCA9IHRhYmxlX2lkIHwgMHg4MDAwOworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSBwYXJhbWV0ZXJfaWQ7CisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gcGFyYW1ldGVyX3NpemVfYnl0ZXM7CisJcGFyYW1fdmFsdWUgPSB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3BoeXNbcmVxdWVzdF9pZF07CisKKwljb21tYW5kX3BhY2tldC0+Ynl0ZThfb2Zmc2V0LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4X29mZnNldC5wYXJhbS5zZ2xbMF0ubGVuZ3RoID0gVFdfU0VDVE9SX1NJWkU7CisKKwkvKiBQb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgYm9hcmQgKi8KKwl0d2FfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQsIDEpOworCisJLyogUG9sbCBmb3IgY29tcGxldGlvbiAqLworCWlmICh0d2FfcG9sbF9yZXNwb25zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDMwKSkKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDEzLCAiTm8gdmFsaWQgcmVzcG9uc2UgZHVyaW5nIGdldCBwYXJhbSIpCisJZWxzZQorCQlyZXR2YWwgPSAodm9pZCAqKSYocGFyYW0tPmRhdGFbMF0pOworCisJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0lOSVRJQUw7CisKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX2dldF9wYXJhbSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhc3NpZ24gYW4gYXZhaWxhYmxlIHJlcXVlc3QgaWQgKi8KK3N0YXRpYyB2b2lkIHR3YV9nZXRfcmVxdWVzdF9pZChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCAqcmVxdWVzdF9pZCkKK3sKKwkqcmVxdWVzdF9pZCA9IHR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfaGVhZF07CisJdHdfZGV2LT5mcmVlX2hlYWQgPSAodHdfZGV2LT5mcmVlX2hlYWQgKyAxKSAlIFRXX1FfTEVOR1RIOworCXR3X2Rldi0+c3RhdGVbKnJlcXVlc3RfaWRdID0gVFdfU19TVEFSVEVEOworfSAvKiBFbmQgdHdhX2dldF9yZXF1ZXN0X2lkKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYW4gaW5pdGNvbm5lY3Rpb24gY29tbWFuZCB0byBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3YV9pbml0Y29ubmVjdGlvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBtZXNzYWdlX2NyZWRpdHMsCisgCQkJICAgICAgdTMyIHNldF9mZWF0dXJlcywgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19zcmwsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgY3VycmVudF9md19hcmNoX2lkLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZndfYnJhbmNoLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfZndfYnVpbGQsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfc3JsLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpmd19vbl9jdGxyX2FyY2hfaWQsIAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgKmZ3X29uX2N0bHJfYnJhbmNoLCAKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0ICpmd19vbl9jdGxyX2J1aWxkLCAKKwkJCSAgICAgIHUzMiAqaW5pdF9jb25uZWN0X3Jlc3VsdCkKK3sKKwlUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQ7CisJVFdfSW5pdGNvbm5lY3QgKnR3X2luaXRjb25uZWN0OworCWludCByZXF1ZXN0X2lkID0gMCwgcmV0dmFsID0gMTsKKworCS8qIEluaXRpYWxpemUgSW5pdENvbm5lY3Rpb24gY29tbWFuZCBwYWNrZXQgKi8KKwlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCW1lbXNldChmdWxsX2NvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfQ29tbWFuZF9GdWxsKSk7CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLmhlYWRlcl9kZXNjLnNpemVfaGVhZGVyID0gMTI4OworCQorCXR3X2luaXRjb25uZWN0ID0gKFRXX0luaXRjb25uZWN0ICopJmZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZDsKKwl0d19pbml0Y29ubmVjdC0+b3Bjb2RlX19yZXNlcnZlZCA9IFRXX09QUkVTX0lOKDAsIFRXX09QX0lOSVRfQ09OTkVDVElPTik7CisJdHdfaW5pdGNvbm5lY3QtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCXR3X2luaXRjb25uZWN0LT5tZXNzYWdlX2NyZWRpdHMgPSBtZXNzYWdlX2NyZWRpdHM7CisJdHdfaW5pdGNvbm5lY3QtPmZlYXR1cmVzID0gc2V0X2ZlYXR1cmVzOworCisJLyogVHVybiBvbiA2NC1iaXQgc2dsIHN1cHBvcnQgaWYgd2UgbmVlZCB0byAqLworCXR3X2luaXRjb25uZWN0LT5mZWF0dXJlcyB8PSBzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gMSA6IDA7CisKKwlpZiAoc2V0X2ZlYXR1cmVzICYgVFdfRVhURU5ERURfSU5JVF9DT05ORUNUKSB7CisJCXR3X2luaXRjb25uZWN0LT5zaXplID0gVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFX0VYVEVOREVEOworCQl0d19pbml0Y29ubmVjdC0+Zndfc3JsID0gY3VycmVudF9md19zcmw7CisJCXR3X2luaXRjb25uZWN0LT5md19hcmNoX2lkID0gY3VycmVudF9md19hcmNoX2lkOworCQl0d19pbml0Y29ubmVjdC0+ZndfYnJhbmNoID0gY3VycmVudF9md19icmFuY2g7CisJCXR3X2luaXRjb25uZWN0LT5md19idWlsZCA9IGN1cnJlbnRfZndfYnVpbGQ7CisJfSBlbHNlIAorCQl0d19pbml0Y29ubmVjdC0+c2l6ZSA9IFRXX0lOSVRfQ09NTUFORF9QQUNLRVRfU0laRTsKKworCS8qIFNlbmQgY29tbWFuZCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCisJdHdhX3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkLCAxKTsKKworCS8qIFBvbGwgZm9yIGNvbXBsZXRpb24gKi8KKwlpZiAodHdhX3BvbGxfcmVzcG9uc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAzMCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDE1LCAiTm8gdmFsaWQgcmVzcG9uc2UgZHVyaW5nIGluaXQgY29ubmVjdGlvbiIpOworCX0gZWxzZSB7CisJCWlmIChzZXRfZmVhdHVyZXMgJiBUV19FWFRFTkRFRF9JTklUX0NPTk5FQ1QpIHsKKwkJCSpmd19vbl9jdGxyX3NybCA9IHR3X2luaXRjb25uZWN0LT5md19zcmw7CisJCQkqZndfb25fY3Rscl9hcmNoX2lkID0gdHdfaW5pdGNvbm5lY3QtPmZ3X2FyY2hfaWQ7CisJCQkqZndfb25fY3Rscl9icmFuY2ggPSB0d19pbml0Y29ubmVjdC0+ZndfYnJhbmNoOworCQkJKmZ3X29uX2N0bHJfYnVpbGQgPSB0d19pbml0Y29ubmVjdC0+ZndfYnVpbGQ7CisJCQkqaW5pdF9jb25uZWN0X3Jlc3VsdCA9IHR3X2luaXRjb25uZWN0LT5yZXN1bHQ7CisJCX0KKwkJcmV0dmFsID0gMDsKKwl9CisKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfSU5JVElBTDsKKworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfaW5pdGNvbm5lY3Rpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIGEgZGV2aWNlIGV4dGVuc2lvbiAqLworc3RhdGljIGludCB0d2FfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldikKK3sKKwlpbnQgaSwgcmV0dmFsID0gMTsKKworCS8qIEluaXRpYWxpemUgY29tbWFuZCBwYWNrZXQgYnVmZmVycyAqLworCWlmICh0d2FfYWxsb2NhdGVfbWVtb3J5KHR3X2Rldiwgc2l6ZW9mKFRXX0NvbW1hbmRfRnVsbCksIDApKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxNiwgIkNvbW1hbmQgcGFja2V0IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGdlbmVyaWMgYnVmZmVyICovCisJaWYgKHR3YV9hbGxvY2F0ZV9tZW1vcnkodHdfZGV2LCBUV19TRUNUT1JfU0laRSwgMSkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDE3LCAiR2VuZXJpYyBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgZXZlbnQgaW5mbyBzcGFjZSAqLworCXR3X2Rldi0+ZXZlbnRfcXVldWVbMF0gPSBrbWFsbG9jKHNpemVvZihUV19FdmVudCkgKiBUV19RX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0d19kZXYtPmV2ZW50X3F1ZXVlWzBdKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxOCwgIkV2ZW50IGluZm8gbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCh0d19kZXYtPmV2ZW50X3F1ZXVlWzBdLCAwLCBzaXplb2YoVFdfRXZlbnQpICogVFdfUV9MRU5HVEgpOworCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJdHdfZGV2LT5ldmVudF9xdWV1ZVtpXSA9IChUV19FdmVudCAqKSgodW5zaWduZWQgY2hhciAqKXR3X2Rldi0+ZXZlbnRfcXVldWVbMF0gKyAoaSAqIHNpemVvZihUV19FdmVudCkpKTsKKwkJdHdfZGV2LT5mcmVlX3F1ZXVlW2ldID0gaTsKKwkJdHdfZGV2LT5zdGF0ZVtpXSA9IFRXX1NfSU5JVElBTDsKKwl9CisKKwl0d19kZXYtPnBlbmRpbmdfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+ZnJlZV9oZWFkID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPmZyZWVfdGFpbCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5lcnJvcl9zZXF1ZW5jZV9pZCA9IDE7CisJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCisJaW5pdF9NVVRFWCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKworCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdHdhX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCByZXF1ZXN0X2lkLCBlcnJvciA9IDA7CisJdTMyIHN0YXR1c19yZWdfdmFsdWU7CisJVFdfUmVzcG9uc2VfUXVldWUgcmVzcG9uc2VfcXVlOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWRldl9pbnN0YW5jZTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwkvKiBHZXQgdGhlIHBlciBhZGFwdGVyIGxvY2sgKi8KKwlzcGluX2xvY2sodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCisJLyogUmVhZCB0aGUgcmVnaXN0ZXJzICovCisJc3RhdHVzX3JlZ192YWx1ZSA9IHJlYWRsKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgb3VyIGludGVycnVwdCwgb3RoZXJ3aXNlIGJhaWwgKi8KKwlpZiAoIShzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCkpCisJCWdvdG8gdHdhX2ludGVycnVwdF9iYWlsOworCisJaGFuZGxlZCA9IDE7CisKKwkvKiBDaGVjayBjb250cm9sbGVyIGZvciBlcnJvcnMgKi8KKwlpZiAodHdhX2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpIHsKKwkJaWYgKHR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCQlUV19DTEVBUl9BTExfSU5URVJSVVBUUyh0d19kZXYpOworCQkJZ290byB0d2FfaW50ZXJydXB0X2JhaWw7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgaG9zdCBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19IT1NUX0lOVEVSUlVQVCkKKwkJVFdfQ0xFQVJfSE9TVF9JTlRFUlJVUFQodHdfZGV2KTsKKworCS8qIEhhbmRsZSBhdHRlbnRpb24gaW50ZXJydXB0ICovCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQVRURU5USU9OX0lOVEVSUlVQVCkgeworCQlUV19DTEVBUl9BVFRFTlRJT05fSU5URVJSVVBUKHR3X2Rldik7CisJCWlmICghKHRlc3RfYW5kX3NldF9iaXQoVFdfSU5fQVRURU5USU9OX0xPT1AsICZ0d19kZXYtPmZsYWdzKSkpIHsKKwkJCXR3YV9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkJZXJyb3IgPSB0d2FfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJY2xlYXJfYml0KFRXX0lOX0FUVEVOVElPTl9MT09QLCAmdHdfZGV2LT5mbGFncyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgY29tbWFuZCBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19DT01NQU5EX0lOVEVSUlVQVCkgeworCQlUV19NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHR3X2Rldik7CisJCS8qIERyYWluIGFzIG1hbnkgcGVuZGluZyBjb21tYW5kcyBhcyB3ZSBjYW4gKi8KKwkJd2hpbGUgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID4gMCkgeworCQkJcmVxdWVzdF9pZCA9IHR3X2Rldi0+cGVuZGluZ19xdWV1ZVt0d19kZXYtPnBlbmRpbmdfaGVhZF07CisJCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BFTkRJTkcpIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MTksICJGb3VuZCByZXF1ZXN0IGlkIHRoYXQgd2Fzbid0IHBlbmRpbmciKTsKKwkJCQlUV19DTEVBUl9BTExfSU5URVJSVVBUUyh0d19kZXYpOworCQkJCWdvdG8gdHdhX2ludGVycnVwdF9iYWlsOworCQkJfQorCQkJaWYgKHR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCwgMSk9PTApIHsKKwkJCQl0d19kZXYtPnBlbmRpbmdfaGVhZCA9ICh0d19kZXYtPnBlbmRpbmdfaGVhZCArIDEpICUgVFdfUV9MRU5HVEg7CisJCQkJdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQtLTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSWYgd2UgZ2V0IGhlcmUsIHdlIHdpbGwgY29udGludWUgcmUtcG9zdGluZyBvbiB0aGUgbmV4dCBjb21tYW5kIGludGVycnVwdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogSGFuZGxlIHJlc3BvbnNlIGludGVycnVwdCAqLworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1JFU1BPTlNFX0lOVEVSUlVQVCkgeworCisJCS8qIERyYWluIHRoZSByZXNwb25zZSBxdWV1ZSBmcm9tIHRoZSBib2FyZCAqLworCQl3aGlsZSAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFkpID09IDApIHsKKwkJCS8qIENvbXBsZXRlIHRoZSByZXNwb25zZSAqLworCQkJcmVzcG9uc2VfcXVlLnZhbHVlID0gcmVhZGwoVFdfUkVTUE9OU0VfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJCQlyZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZS5yZXNwb25zZV9pZCk7CisJCQlmdWxsX2NvbW1hbmRfcGFja2V0ID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0W3JlcXVlc3RfaWRdOworCQkJZXJyb3IgPSAwOworCQkJY29tbWFuZF9wYWNrZXQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5vbGRjb21tYW5kOworCQkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgcGFja2V0IGVycm9ycyAqLworCQkJaWYgKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5zdGF0dXMgIT0gMCkgeworCQkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSAhPSAwKSB7CisJCQkJCWVycm9yID0gdHdhX2ZpbGxfc2Vuc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAxLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBTa2lwIGlvY3RsIGVycm9yIHByaW50cyAqLworCQkJCQlpZiAocmVxdWVzdF9pZCAhPSB0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkKSB7CisJCQkJCQllcnJvciA9IHR3YV9maWxsX3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCwgMCwgMSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qIENoZWNrIGZvciBjb3JyZWN0IHN0YXRlICovCisJCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BPU1RFRCkgeworCQkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSAhPSAwKSB7CisJCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxYSwgIlJlY2VpdmVkIGEgcmVxdWVzdCBpZCB0aGF0IHdhc24ndCBwb3N0ZWQiKTsKKwkJCQkJVFdfQ0xFQVJfQUxMX0lOVEVSUlVQVFModHdfZGV2KTsKKwkJCQkJZ290byB0d2FfaW50ZXJydXB0X2JhaWw7CisJCQkJfQorCQkJfQorCisJCQkvKiBDaGVjayBmb3IgaW50ZXJuYWwgY29tbWFuZCBjb21wbGV0aW9uICovCisJCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPT0gMCkgeworCQkJCWlmIChyZXF1ZXN0X2lkICE9IHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQpIHsKKwkJCQkJaWYgKHR3YV9hZW5fY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKSkKKwkJCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgxYiwgIkVycm9yIGNvbXBsZXRpbmcgQUVOIGR1cmluZyBhdHRlbnRpb24gaW50ZXJydXB0Iik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCQkJCQl3YWtlX3VwKCZ0d19kZXYtPmlvY3RsX3dxdWV1ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaV9jb21wbGV0ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCS8qIElmIG5vIGVycm9yIGNvbW1hbmQgd2FzIGEgc3VjY2VzcyAqLworCQkJCWlmIChlcnJvciA9PSAwKSB7CisJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCQl9CisKKwkJCQkvKiBJZiBlcnJvciwgY29tbWFuZCBmYWlsZWQgKi8KKwkJCQlpZiAoZXJyb3IgPT0gMSkgeworCQkJCQkvKiBBc2sgZm9yIGEgaG9zdCByZXNldCAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworCQkJCX0KKworCQkJCS8qIFJlcG9ydCByZXNpZHVhbCBieXRlcyBmb3Igc2luZ2xlIHNnbCAqLworCQkJCWlmICgodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnVzZV9zZyA8PSAxKSAmJiAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnN0YXR1cyA9PSAwKSkgeworCQkJCQlpZiAoZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kLnNnX2xpc3RbMF0ubGVuZ3RoIDwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbikKKwkJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXNpZCA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4gLSBmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQuc2dfbGlzdFswXS5sZW5ndGg7CisJCQkJfQorCisJCQkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pOworCQkJCXR3YV91bm1hcF9zY3NpX2RhdGEodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIHZhbGlkIHN0YXR1cyBhZnRlciBlYWNoIGRyYWluICovCisJCQlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKHR3YV9jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCQkJaWYgKHR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCQkJCVRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHR3X2Rldik7CisJCQkJCWdvdG8gdHdhX2ludGVycnVwdF9iYWlsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwordHdhX2ludGVycnVwdF9iYWlsOgorCXNwaW5fdW5sb2NrKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30gLyogRW5kIHR3YV9pbnRlcnJ1cHQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCB0aGUgcmVxdWVzdCBpZCBhbmQgdmFyaW91cyBzZ2xzIGZvciBpb2N0bHMgKi8KK3N0YXRpYyB2b2lkIHR3YV9sb2FkX3NnbChUV19Db21tYW5kX0Z1bGwgKmZ1bGxfY29tbWFuZF9wYWNrZXQsIGludCByZXF1ZXN0X2lkLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIGludCBsZW5ndGgpCit7CisJVFdfQ29tbWFuZCAqb2xkY29tbWFuZDsKKwlUV19Db21tYW5kX0FwYWNoZSAqbmV3Y29tbWFuZDsKKwlUV19TR19FbnRyeSAqc2dsOworCisJaWYgKFRXX09QX09VVChmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQub3Bjb2RlX19yZXNlcnZlZCkgPT0gVFdfT1BfRVhFQ1VURV9TQ1NJKSB7CisJCW5ld2NvbW1hbmQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kOworCQluZXdjb21tYW5kLT5yZXF1ZXN0X2lkX19sdW5sID0gCisJCQlUV19SRVFfTFVOX0lOKFRXX0xVTl9PVVQobmV3Y29tbWFuZC0+cmVxdWVzdF9pZF9fbHVubCksIHJlcXVlc3RfaWQpOworCQluZXdjb21tYW5kLT5zZ19saXN0WzBdLmFkZHJlc3MgPSBkbWFfaGFuZGxlICsgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpIC0gMTsKKwkJbmV3Y29tbWFuZC0+c2dfbGlzdFswXS5sZW5ndGggPSBsZW5ndGg7CisJCW5ld2NvbW1hbmQtPnNnbF9lbnRyaWVzX19sdW5oID0KKwkJCVRXX1JFUV9MVU5fSU4oVFdfTFVOX09VVChuZXdjb21tYW5kLT5zZ2xfZW50cmllc19fbHVuaCksIDEpOworCX0gZWxzZSB7CisJCW9sZGNvbW1hbmQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5vbGRjb21tYW5kOworCQlvbGRjb21tYW5kLT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKworCQlpZiAoVFdfU0dMX09VVChvbGRjb21tYW5kLT5vcGNvZGVfX3NnbG9mZnNldCkpIHsKKwkJCS8qIExvYWQgdGhlIHNnIGxpc3QgKi8KKwkJCXNnbCA9IChUV19TR19FbnRyeSAqKSgodTMyICopb2xkY29tbWFuZCtUV19TR0xfT1VUKG9sZGNvbW1hbmQtPm9wY29kZV9fc2dsb2Zmc2V0KSk7CisJCQlzZ2wtPmFkZHJlc3MgPSBkbWFfaGFuZGxlICsgc2l6ZW9mKFRXX0lvY3RsX0J1Zl9BcGFjaGUpIC0gMTsKKwkJCXNnbC0+bGVuZ3RoID0gbGVuZ3RoOworCisJCQlpZiAoKHNpemVvZihsb25nKSA8IDgpICYmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSkKKwkJCQlvbGRjb21tYW5kLT5zaXplICs9IDE7CisJCX0KKwl9Cit9IC8qIEVuZCB0d2FfbG9hZF9zZ2woKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSBhIHBjaS1kbWEgbWFwcGluZyBmb3IgYSBzY2F0dGVyIGdhdGhlciBsaXN0ICovCitzdGF0aWMgaW50IHR3YV9tYXBfc2NzaV9zZ19kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJaW50IHVzZV9zZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHR3X2Rldi0+dHdfcGNpX2RldjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChjbWQtPnVzZV9zZyA9PSAwKQorCQlnb3RvIG91dDsKKworCXVzZV9zZyA9IHBjaV9tYXBfc2cocGRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAodXNlX3NnID09IDApIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFjLCAiRmFpbGVkIHRvIG1hcCBzY2F0dGVyIGdhdGhlciBsaXN0Iik7CisJCWdvdG8gb3V0OworCX0KKworCWNtZC0+U0NwLnBoYXNlID0gVFdfUEhBU0VfU0dMSVNUOworCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IHVzZV9zZzsKKwlyZXR2YWwgPSB1c2Vfc2c7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9tYXBfc2NzaV9zZ19kYXRhKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gYSBwY2ktZG1hIG1hcCBmb3IgYSBzaW5nbGUgYnVmZmVyICovCitzdGF0aWMgZG1hX2FkZHJfdCB0d2FfbWFwX3Njc2lfc2luZ2xlX2RhdGEoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkKK3sKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0d19kZXYtPnR3X3BjaV9kZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPT0gMCkgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmIChtYXBwaW5nID09IDApIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFkLCAiRmFpbGVkIHRvIG1hcCBwYWdlIik7CisJCWdvdG8gb3V0OworCX0KKworCWNtZC0+U0NwLnBoYXNlID0gVFdfUEhBU0VfU0lOR0xFOworCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IG1hcHBpbmc7CisJcmV0dmFsID0gbWFwcGluZzsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX21hcF9zY3NpX3NpbmdsZV9kYXRhKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgZm9yIGEgcmVzcG9uc2UgaW50ZXJydXB0IG9mIGEgcmVxdWVzdCAqLworc3RhdGljIGludCB0d2FfcG9sbF9yZXNwb25zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkLCBpbnQgc2Vjb25kcykKK3sKKwlpbnQgcmV0dmFsID0gMSwgZm91bmQgPSAwLCByZXNwb25zZV9yZXF1ZXN0X2lkOworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZXVlOworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKworCWlmICh0d2FfcG9sbF9zdGF0dXNfZ29uZSh0d19kZXYsIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWSwgc2Vjb25kcykgPT0gMCkgeworCQlyZXNwb25zZV9xdWV1ZS52YWx1ZSA9IHJlYWRsKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlyZXNwb25zZV9yZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZXVlLnJlc3BvbnNlX2lkKTsKKwkJaWYgKHJlcXVlc3RfaWQgIT0gcmVzcG9uc2VfcmVxdWVzdF9pZCkgeworCQkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDFlLCAiRm91bmQgdW5leHBlY3RlZCByZXF1ZXN0IGlkIHdoaWxlIHBvbGxpbmcgZm9yIHJlc3BvbnNlIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoVFdfT1BfT1VUKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5vcGNvZGVfX3Jlc2VydmVkKSA9PSBUV19PUF9FWEVDVVRFX1NDU0kpIHsKKwkJCWlmIChmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQuc3RhdHVzICE9IDApIHsKKwkJCQkvKiBiYWQgcmVzcG9uc2UgKi8KKwkJCQl0d2FfZmlsbF9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDAsIDApOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZm91bmQgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQub2xkY29tbWFuZC5zdGF0dXMgIT0gMCkgeworCQkJCS8qIGJhZCByZXNwb25zZSAqLworCQkJCXR3YV9maWxsX3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCwgMCwgMCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisKKwlpZiAoZm91bmQpCisJCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9wb2xsX3Jlc3BvbnNlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciBmb3IgYSBmbGFnICovCitzdGF0aWMgaW50IHR3YV9wb2xsX3N0YXR1cyhUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIHUzMiBmbGFnLCBpbnQgc2Vjb25kcykKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsgCisJdW5zaWduZWQgbG9uZyBiZWZvcmU7CisJaW50IHJldHZhbCA9IDE7CisKKwlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCWJlZm9yZSA9IGppZmZpZXM7CisKKwlpZiAodHdhX2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpCisJCXR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpOworCisJd2hpbGUgKChzdGF0dXNfcmVnX3ZhbHVlICYgZmxhZykgIT0gZmxhZykgeworCQlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCisJCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJCXR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfcG9sbF9zdGF0dXMoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcG9sbCB0aGUgc3RhdHVzIHJlZ2lzdGVyIGZvciBkaXNhcHBlYXJhbmNlIG9mIGEgZmxhZyAqLworc3RhdGljIGludCB0d2FfcG9sbF9zdGF0dXNfZ29uZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIHUzMiBmbGFnLCBpbnQgc2Vjb25kcykKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKwlpbnQgcmV0dmFsID0gMTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSByZWFkbChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJYmVmb3JlID0gamlmZmllczsKKworCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJdHdhX2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSk7CisKKwl3aGlsZSAoKHN0YXR1c19yZWdfdmFsdWUgJiBmbGFnKSAhPSAwKSB7CisJCXN0YXR1c19yZWdfdmFsdWUgPSByZWFkbChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJCXR3YV9kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2FfcG9sbF9zdGF0dXNfZ29uZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHBvc3QgYSBjb21tYW5kIHBhY2tldCB0byB0aGUgYm9hcmQgKi8KK3N0YXRpYyBpbnQgdHdhX3Bvc3RfY29tbWFuZF9wYWNrZXQoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciBpbnRlcm5hbCkKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsKKwlkbWFfYWRkcl90IGNvbW1hbmRfcXVlX3ZhbHVlOworCWludCByZXR2YWwgPSAxOworCisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNbcmVxdWVzdF9pZF07CisJc3RhdHVzX3JlZ192YWx1ZSA9IHJlYWRsKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJdHdhX2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSk7CisKKwlpZiAoKCh0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCA+IDApICYmICh0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdICE9IFRXX1NfUEVORElORykpIHx8IChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX0NPTU1BTkRfUVVFVUVfRlVMTCkpIHsKKworCQkvKiBPbmx5IHBlbmQgaW50ZXJuYWwgZHJpdmVyIGNvbW1hbmRzICovCisJCWlmICghaW50ZXJuYWwpIHsKKwkJCXJldHZhbCA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENvdWxkbid0IHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0LCBzbyB3ZSBkbyBpdCBsYXRlciAqLworCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BFTkRJTkcpIHsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BFTkRJTkc7CisJCQl0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCsrOworCQkJaWYgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID4gdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50KSB7CisJCQkJdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50ID0gdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJCQl9CisJCQl0d19kZXYtPnBlbmRpbmdfcXVldWVbdHdfZGV2LT5wZW5kaW5nX3RhaWxdID0gcmVxdWVzdF9pZDsKKwkJCXR3X2Rldi0+cGVuZGluZ190YWlsID0gKHR3X2Rldi0+cGVuZGluZ190YWlsICsgMSkgJSBUV19RX0xFTkdUSDsKKwkJfQorCQlUV19VTk1BU0tfQ09NTUFORF9JTlRFUlJVUFQodHdfZGV2KTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogV2Ugc3VjY2Vzc2Z1bGx5IHBvc3RlZCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKKwkJCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOworCQkJd3JpdGVsKCh1MzIpY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJCQl3cml0ZWwoKHUzMikoKHU2NCljb21tYW5kX3F1ZV92YWx1ZSA+PiAzMiksIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSArIDB4NCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoVFdfQ09NTUFORF9PRkZTRVQgKyBjb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKwkJfQorCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19QT1NURUQ7CisJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQrKzsKKwkJaWYgKHR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQgPiB0d19kZXYtPm1heF9wb3N0ZWRfcmVxdWVzdF9jb3VudCkgeworCQkJdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQgPSB0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50OworCQl9CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IGEgZGV2aWNlIGV4dGVuc2lvbiAqLworc3RhdGljIGludCB0d2FfcmVzZXRfZGV2aWNlX2V4dGVuc2lvbihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBpb2N0bF9yZXNldCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHJldHZhbCA9IDE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzZXRfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJVFdfRElTQUJMRV9JTlRFUlJVUFRTKHR3X2Rldik7CisJVFdfTUFTS19DT01NQU5EX0lOVEVSUlVQVCh0d19kZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKiBBYm9ydCBhbGwgcmVxdWVzdHMgdGhhdCBhcmUgaW4gcHJvZ3Jlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFdfUV9MRU5HVEg7IGkrKykgeworCQlpZiAoKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19GSU5JU0hFRCkgJiYKKwkJICAgICh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfSU5JVElBTCkgJiYKKwkJICAgICh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfQ09NUExFVEVEKSkgeworCQkJaWYgKHR3X2Rldi0+c3JiW2ldKSB7CisJCQkJdHdfZGV2LT5zcmJbaV0tPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJCXR3X2Rldi0+c3JiW2ldLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbaV0pOworCQkJCXR3YV91bm1hcF9zY3NpX2RhdGEodHdfZGV2LCBpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlc2V0IHF1ZXVlcyBhbmQgY291bnRzICovCisJZm9yIChpID0gMDsgaSA8IFRXX1FfTEVOR1RIOyBpKyspIHsKKwkJdHdfZGV2LT5mcmVlX3F1ZXVlW2ldID0gaTsKKwkJdHdfZGV2LT5zdGF0ZVtpXSA9IFRXX1NfSU5JVElBTDsKKwl9CisJdHdfZGV2LT5mcmVlX2hlYWQgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+ZnJlZV90YWlsID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50ID0gMDsKKwl0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCA9IDA7CisJdHdfZGV2LT5wZW5kaW5nX2hlYWQgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+cGVuZGluZ190YWlsID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnJlc2V0X3ByaW50ID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmICh0d2FfcmVzZXRfc2VxdWVuY2UodHdfZGV2LCAxKSkKKwkJZ290byBvdXQ7CisKKwlUV19FTkFCTEVfQU5EX0NMRUFSX0lOVEVSUlVQVFModHdfZGV2KTsKKworCS8qIFdha2UgdXAgYW55IGlvY3RsIHRoYXQgd2FzIHBlbmRpbmcgYmVmb3JlIHRoZSByZXNldCAqLworCWlmICgodHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9PSBUV19JT0NUTF9DSFJERVZfRlJFRSkgfHwgKGlvY3RsX3Jlc2V0KSkgeworCQljbGVhcl9iaXQoVFdfSU5fUkVTRVQsICZ0d19kZXYtPmZsYWdzKTsKKwl9IGVsc2UgeworCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gVFdfSU9DVExfQ0hSREVWX0ZSRUU7CisJCXdha2VfdXAoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKwl9CisJcmV0dmFsID0gMDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfSAvKiBFbmQgdHdhX3Jlc2V0X2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3YV9yZXNldF9zZXF1ZW5jZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBzb2Z0X3Jlc2V0KQoreworCWludCB0cmllcyA9IDAsIHJldHZhbCA9IDEsIGZsYXNoZWQgPSAwLCBkb19zb2Z0X3Jlc2V0ID0gc29mdF9yZXNldDsKKworCXdoaWxlICh0cmllcyA8IFRXX01BWF9SRVNFVF9UUklFUykgeworCQlpZiAoZG9fc29mdF9yZXNldCkKKwkJCVRXX1NPRlRfUkVTRVQodHdfZGV2KTsKKworCQkvKiBNYWtlIHN1cmUgY29udHJvbGxlciBpcyBpbiBhIGdvb2Qgc3RhdGUgKi8KKwkJaWYgKHR3YV9wb2xsX3N0YXR1cyh0d19kZXYsIFRXX1NUQVRVU19NSUNST0NPTlRST0xMRVJfUkVBRFkgfCAoZG9fc29mdF9yZXNldCA9PSAxID8gVFdfU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQgOiAwKSwgNjApKSB7CisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MWYsICJNaWNyb2NvbnRyb2xsZXIgbm90IHJlYWR5IGR1cmluZyByZXNldCBzZXF1ZW5jZSIpOworCQkJZG9fc29mdF9yZXNldCA9IDE7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBFbXB0eSByZXNwb25zZSBxdWV1ZSAqLworCQlpZiAodHdhX2VtcHR5X3Jlc3BvbnNlX3F1ZXVlKHR3X2RldikpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMCwgIlJlc3BvbnNlIHF1ZXVlIGVtcHR5IGZhaWxlZCBkdXJpbmcgcmVzZXQgc2VxdWVuY2UiKTsKKwkJCWRvX3NvZnRfcmVzZXQgPSAxOworCQkJdHJpZXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmxhc2hlZCA9IDA7CisKKwkJLyogQ2hlY2sgZm9yIGNvbXBhdGliaWxpdHkvZmxhc2ggKi8KKwkJaWYgKHR3YV9jaGVja19zcmwodHdfZGV2LCAmZmxhc2hlZCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMSwgIkNvbXBhdGliaWxpdHkgY2hlY2sgZmFpbGVkIGR1cmluZyByZXNldCBzZXF1ZW5jZSIpOworCQkJZG9fc29mdF9yZXNldCA9IDE7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAoZmxhc2hlZCkgeworCQkJCXRyaWVzKys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBEcmFpbiB0aGUgQUVOIHF1ZXVlICovCisJCWlmICh0d2FfYWVuX2RyYWluX3F1ZXVlKHR3X2Rldiwgc29mdF9yZXNldCkpIHsKKwkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyMiwgIkFFTiBkcmFpbiBmYWlsZWQgZHVyaW5nIHJlc2V0IHNlcXVlbmNlIik7CisJCQlkb19zb2Z0X3Jlc2V0ID0gMTsKKwkJCXRyaWVzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElmIHdlIGdvdCBoZXJlLCBjb250cm9sbGVyIGlzIGluIGEgZ29vZCBzdGF0ZSAqLworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9yZXNldF9zZXF1ZW5jZSgpICovCisKKy8qIFRoaXMgZnVuY2l0b24gcmV0dXJucyB1bml0IGdlb21ldHJ5IGluIGN5bGluZGVycy9oZWFkcy9zZWN0b3JzICovCitzdGF0aWMgaW50IHR3YV9zY3NpX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCWludCBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldjsKKworCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoY2FwYWNpdHkgPj0gMHgyMDAwMDApIHsKKwkJaGVhZHMgPSAyNTU7CisJCXNlY3RvcnMgPSA2MzsKKwkJY3lsaW5kZXJzID0gc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMgKiBzZWN0b3JzKTsKKwl9IGVsc2UgeworCQloZWFkcyA9IDY0OworCQlzZWN0b3JzID0gMzI7CisJCWN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzICogc2VjdG9ycyk7CisJfQorCisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3YV9zY3NpX2Jpb3NwYXJhbSgpICovCisKKy8qIFRoaXMgaXMgdGhlIG5ldyBzY3NpIGVoIHJlc2V0IGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHR3YV9zY3NpX2VoX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IE5VTEw7CisJaW50IHJldHZhbCA9IEZBSUxFRDsKKworCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlzcGluX3VubG9ja19pcnEodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCisJdHdfZGV2LT5udW1fcmVzZXRzKys7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IFdBUk5JTkc6ICgweCUwMlg6MHglMDRYKTogVW5pdCAjJWQ6IENvbW1hbmQgKDB4JXgpIHRpbWVkIG91dCwgcmVzZXR0aW5nIGNhcmQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIFRXX0RSSVZFUiwgMHgyYywgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5jbW5kWzBdKTsKKworCS8qIE5vdyByZXNldCB0aGUgY2FyZCBhbmQgc29tZSBvZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBkYXRhICovCisJaWYgKHR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMCkpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDJiLCAiQ29udHJvbGxlciByZXNldCBmYWlsZWQgZHVyaW5nIHNjc2kgaG9zdCByZXNldCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR2YWwgPSBTVUNDRVNTOworb3V0OgorCXNwaW5fbG9ja19pcnEodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2spOworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2Ffc2NzaV9laF9yZXNldCgpICovCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gc2NzaSBxdWV1ZSBmdW5jdGlvbiB0byBoYW5kbGUgc2NzaSBvcGNvZGVzICovCitzdGF0aWMgaW50IHR3YV9zY3NpX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlpbnQgcmVxdWVzdF9pZCwgcmV0dmFsOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBDaGVjayBpZiB0aGlzIEZXIHN1cHBvcnRzIGx1bnMgKi8KKwlpZiAoKFNDcG50LT5kZXZpY2UtPmx1biAhPSAwKSAmJiAodHdfZGV2LT53b3JraW5nX3NybCA8IFRXX0ZXX1NSTF9MVU5TX1NVUFBPUlRFRCkpIHsKKwkJU0NwbnQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCWRvbmUoU0NwbnQpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTYXZlIGRvbmUgZnVuY3Rpb24gaW50byBzY3NpX2NtbmQgc3RydWN0ICovCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJCQorCS8qIEdldCBhIGZyZWUgcmVxdWVzdCBpZCAqLworCXR3YV9nZXRfcmVxdWVzdF9pZCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCS8qIFNhdmUgdGhlIHNjc2kgY29tbWFuZCBmb3IgdXNlIGJ5IHRoZSBJU1IgKi8KKwl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IFNDcG50OworCisJLyogSW5pdGlhbGl6ZSBwaGFzZSB0byB6ZXJvICovCisJU0NwbnQtPlNDcC5waGFzZSA9IFRXX1BIQVNFX0lOSVRJQUw7CisKKwlyZXR2YWwgPSB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaSh0d19kZXYsIHJlcXVlc3RfaWQsIE5VTEwsIDAsIE5VTEwpOworCXN3aXRjaCAocmV0dmFsKSB7CisJY2FzZSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOgorCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQl0d2FfZnJlZV9yZXF1ZXN0X2lkKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCVNDcG50LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJZG9uZShTQ3BudCk7CisJCXJldHZhbCA9IDA7CisJfQorb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2Ffc2NzaV9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZHMgc2NzaSBjZGIncyB0byB0aGUgZmlybXdhcmUgKi8KK3N0YXRpYyBpbnQgdHdhX3Njc2lvcF9leGVjdXRlX3Njc2koVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCwgY2hhciAqY2RiLCBpbnQgdXNlX3NnLCBUV19TR19FbnRyeSAqc2dsaXN0YXJnKQoreworCVRXX0NvbW1hbmRfRnVsbCAqZnVsbF9jb21tYW5kX3BhY2tldDsKKwlUV19Db21tYW5kX0FwYWNoZSAqY29tbWFuZF9wYWNrZXQ7CisJdTMyIG51bV9zZWN0b3JzID0gMHgwOworCWludCBpLCBzZ19jb3VudDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0ID0gTlVMTDsKKwl1MzIgYnVmZmFkZHIgPSAweDA7CisJaW50IHJldHZhbCA9IDE7CisKKwlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pIHsKKwkJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcikgeworCQkJc2dsaXN0ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJfQorCQlzcmIgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNvbW1hbmQgcGFja2V0ICovCisJZnVsbF9jb21tYW5kX3BhY2tldCA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydFtyZXF1ZXN0X2lkXTsKKwlmdWxsX2NvbW1hbmRfcGFja2V0LT5oZWFkZXIuaGVhZGVyX2Rlc2Muc2l6ZV9oZWFkZXIgPSAxMjg7CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5lcnJvciA9IDA7CisJZnVsbF9jb21tYW5kX3BhY2tldC0+aGVhZGVyLnN0YXR1c19ibG9jay5zZXZlcml0eV9fcmVzZXJ2ZWQgPSAwOworCisJY29tbWFuZF9wYWNrZXQgPSAmZnVsbF9jb21tYW5kX3BhY2tldC0+Y29tbWFuZC5uZXdjb21tYW5kOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3Jlc2VydmVkID0gVFdfT1BSRVNfSU4oMCwgVFdfT1BfRVhFQ1VURV9TQ1NJKTsKKworCS8qIFdlIGZvcmNlZCAxNiBieXRlIGNkYiB1c2UgZWFybGllciAqLworCWlmICghY2RiKQorCQltZW1jcHkoY29tbWFuZF9wYWNrZXQtPmNkYiwgc3JiLT5jbW5kLCBUV19NQVhfQ0RCX0xFTik7CisJZWxzZQorCQltZW1jcHkoY29tbWFuZF9wYWNrZXQtPmNkYiwgY2RiLCBUV19NQVhfQ0RCX0xFTik7CisKKwlpZiAoc3JiKSB7CisJCWNvbW1hbmRfcGFja2V0LT51bml0ID0gc3JiLT5kZXZpY2UtPmlkOworCQljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZF9fbHVubCA9CisJCQlUV19SRVFfTFVOX0lOKHNyYi0+ZGV2aWNlLT5sdW4sIHJlcXVlc3RfaWQpOworCX0gZWxzZSB7CisJCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkX19sdW5sID0KKwkJCVRXX1JFUV9MVU5fSU4oMCwgcmVxdWVzdF9pZCk7CisJCWNvbW1hbmRfcGFja2V0LT51bml0ID0gMDsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+c2dsX29mZnNldCA9IDE2OworCisJaWYgKCFzZ2xpc3RhcmcpIHsKKwkJLyogTWFwIHNnbGlzdCBmcm9tIHNjc2kgbGF5ZXIgdG8gY21kIHBhY2tldCAqLworCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnVzZV9zZyA9PSAwKSB7CisJCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbiA8IFRXX01JTl9TR0xfTEVOR1RIKSB7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0uYWRkcmVzcyA9IHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfcGh5c1tyZXF1ZXN0X2lkXTsKKwkJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFswXS5sZW5ndGggPSBUV19NSU5fU0dMX0xFTkdUSDsKKwkJCX0gZWxzZSB7CisJCQkJYnVmZmFkZHIgPSB0d2FfbWFwX3Njc2lfc2luZ2xlX2RhdGEodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQlpZiAoYnVmZmFkZHIgPT0gMCkKKwkJCQkJZ290byBvdXQ7CisKKwkJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFswXS5hZGRyZXNzID0gYnVmZmFkZHI7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0ubGVuZ3RoID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbjsKKwkJCX0KKwkJCWNvbW1hbmRfcGFja2V0LT5zZ2xfZW50cmllc19fbHVuaCA9IFRXX1JFUV9MVU5fSU4oKHNyYi0+ZGV2aWNlLT5sdW4gPj4gNCksIDEpOworCisJCQlpZiAoY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0uYWRkcmVzcyAmIFRXX0FMSUdOTUVOVF85MDAwX1NHTCkgeworCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyZCwgIkZvdW5kIHVuYWxpZ25lZCBhZGRyZXNzIGR1cmluZyBleGVjdXRlIHNjc2kiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+dXNlX3NnID4gMCkgeworCQkJaWYgKCh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+dXNlX3NnID09IDEpICYmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuIDwgVFdfTUlOX1NHTF9MRU5HVEgpKSB7CisJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbMF0uYWRkcmVzcyA9IHR3X2Rldi0+Z2VuZXJpY19idWZmZXJfcGh5c1tyZXF1ZXN0X2lkXTsKKwkJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFswXS5sZW5ndGggPSBUV19NSU5fU0dMX0xFTkdUSDsKKwkJCX0gZWxzZSB7CisJCQkJc2dfY291bnQgPSB0d2FfbWFwX3Njc2lfc2dfZGF0YSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCWlmIChzZ19jb3VudCA9PSAwKQorCQkJCQlnb3RvIG91dDsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisJCQkJCWNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcygmc2dsaXN0W2ldKTsKKwkJCQkJY29tbWFuZF9wYWNrZXQtPnNnX2xpc3RbaV0ubGVuZ3RoID0gc2dfZG1hX2xlbigmc2dsaXN0W2ldKTsKKwkJCQkJaWYgKGNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgJiBUV19BTElHTk1FTlRfOTAwMF9TR0wpIHsKKwkJCQkJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyZSwgIkZvdW5kIHVuYWxpZ25lZCBzZ2wgYWRkcmVzcyBkdXJpbmcgZXhlY3V0ZSBzY3NpIik7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvbW1hbmRfcGFja2V0LT5zZ2xfZW50cmllc19fbHVuaCA9IFRXX1JFUV9MVU5fSU4oKHNyYi0+ZGV2aWNlLT5sdW4gPj4gNCksIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2cpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW50ZXJuYWwgY2RiIHBvc3QgKi8KKwkJZm9yIChpID0gMDsgaSA8IHVzZV9zZzsgaSsrKSB7CisJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFtpXS5hZGRyZXNzID0gc2dsaXN0YXJnW2ldLmFkZHJlc3M7CisJCQljb21tYW5kX3BhY2tldC0+c2dfbGlzdFtpXS5sZW5ndGggPSBzZ2xpc3RhcmdbaV0ubGVuZ3RoOworCQkJaWYgKGNvbW1hbmRfcGFja2V0LT5zZ19saXN0W2ldLmFkZHJlc3MgJiBUV19BTElHTk1FTlRfOTAwMF9TR0wpIHsKKwkJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MmYsICJGb3VuZCB1bmFsaWduZWQgc2dsIGFkZHJlc3MgZHVyaW5nIGludGVybmFsIHBvc3QiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQljb21tYW5kX3BhY2tldC0+c2dsX2VudHJpZXNfX2x1bmggPSBUV19SRVFfTFVOX0lOKDAsIHVzZV9zZyk7CisJfQorCisJaWYgKHNyYikgeworCQlpZiAoc3JiLT5jbW5kWzBdID09IFJFQURfNiB8fCBzcmItPmNtbmRbMF0gPT0gV1JJVEVfNikKKwkJCW51bV9zZWN0b3JzID0gKHUzMilzcmItPmNtbmRbNF07CisKKwkJaWYgKHNyYi0+Y21uZFswXSA9PSBSRUFEXzEwIHx8IHNyYi0+Y21uZFswXSA9PSBXUklURV8xMCkKKwkJCW51bV9zZWN0b3JzID0gKHUzMilzcmItPmNtbmRbOF0gfCAoKHUzMilzcmItPmNtbmRbN10gPDwgOCk7CisJfQorCisJLyogVXBkYXRlIHNlY3RvciBzdGF0aXN0aWMgKi8KKwl0d19kZXYtPnNlY3Rvcl9jb3VudCA9IG51bV9zZWN0b3JzOworCWlmICh0d19kZXYtPnNlY3Rvcl9jb3VudCA+IHR3X2Rldi0+bWF4X3NlY3Rvcl9jb3VudCkKKwkJdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50ID0gdHdfZGV2LT5zZWN0b3JfY291bnQ7CisKKwkvKiBVcGRhdGUgU0cgc3RhdGlzdGljcyAqLworCWlmIChzcmIpIHsKKwkJdHdfZGV2LT5zZ2xfZW50cmllcyA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2c7CisJCWlmICh0d19kZXYtPnNnbF9lbnRyaWVzID4gdHdfZGV2LT5tYXhfc2dsX2VudHJpZXMpCisJCQl0d19kZXYtPm1heF9zZ2xfZW50cmllcyA9IHR3X2Rldi0+c2dsX2VudHJpZXM7CisJfQorCisJLyogTm93IHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJaWYgKHNyYikgeworCQlyZXR2YWwgPSB0d2FfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQsIDApOworCX0gZWxzZSB7CisJCXR3YV9wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCwgMSk7CisJCXJldHZhbCA9IDA7CisJfQorb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gY29tcGxldGVzIGFuIGV4ZWN1dGUgc2NzaSBvcGVyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHR3YV9zY3Npb3BfZXhlY3V0ZV9zY3NpX2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJLyogQ29weSB0aGUgcmVzcG9uc2UgaWYgdG9vIHNtYWxsICovCisJaWYgKCh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIpICYmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuIDwgVFdfTUlOX1NHTF9MRU5HVEgpKSB7CisJCW1lbWNweSh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIsCisJCSAgICAgICB0d19kZXYtPmdlbmVyaWNfYnVmZmVyX3ZpcnRbcmVxdWVzdF9pZF0sCisJCSAgICAgICB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuKTsKKwl9Cit9IC8qIEVuZCB0d2Ffc2NzaW9wX2V4ZWN1dGVfc2NzaV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gdGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gc2h1dCBkb3duICovCitzdGF0aWMgdm9pZCBfX3R3YV9zaHV0ZG93bihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJVFdfRElTQUJMRV9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBTaHV0dGluZyBkb3duIGhvc3QgJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCisJLyogVGVsbCB0aGUgY2FyZCB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworCWlmICh0d2FfaW5pdGNvbm5lY3Rpb24odHdfZGV2LCAxLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MzEsICJDb25uZWN0aW9uIHNodXRkb3duIGZhaWxlZCIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LTl4eHg6IFNodXRkb3duIGNvbXBsZXRlLlxuIik7CisJfQorCisJLyogQ2xlYXIgYWxsIGludGVycnVwdHMganVzdCBiZWZvcmUgZXhpdCAqLworCVRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHR3X2Rldik7Cit9IC8qIEVuZCBfX3R3YV9zaHV0ZG93bigpICovCisKKy8qIFdyYXBwZXIgZm9yIF9fdHdhX3NodXRkb3duICovCitzdGF0aWMgdm9pZCB0d2Ffc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWhvc3QtPmhvc3RkYXRhOworCisJX190d2Ffc2h1dGRvd24odHdfZGV2KTsKK30gLyogRW5kIHR3YV9zaHV0ZG93bigpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBsb29rIHVwIGEgc3RyaW5nICovCitzdGF0aWMgY2hhciAqdHdhX3N0cmluZ19sb29rdXAodHdhX21lc3NhZ2VfdHlwZSAqdGFibGUsIHVuc2lnbmVkIGludCBjb2RlKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSAwOyAoKGNvZGUgIT0gdGFibGVbaW5kZXhdLmNvZGUpICYmCisJCSAgICAgICh0YWJsZVtpbmRleF0udGV4dCAhPSAoY2hhciAqKTApKTsgaW5kZXgrKyk7CisJcmV0dXJuKHRhYmxlW2luZGV4XS50ZXh0KTsKK30gLyogRW5kIHR3YV9zdHJpbmdfbG9va3VwKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gYSBwY2ktZG1hIHVubWFwICovCitzdGF0aWMgdm9pZCB0d2FfdW5tYXBfc2NzaV9kYXRhKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0d19kZXYtPnR3X3BjaV9kZXY7CisKKwlzd2l0Y2goY21kLT5TQ3AucGhhc2UpIHsKKwljYXNlIFRXX1BIQVNFX1NJTkdMRToKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBjbWQtPlNDcC5oYXZlX2RhdGFfaW4sIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWJyZWFrOworCWNhc2UgVFdfUEhBU0VfU0dMSVNUOgorCQlwY2lfdW5tYXBfc2cocGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT51c2Vfc2csIERNQV9CSURJUkVDVElPTkFMKTsKKwkJYnJlYWs7CisJfQorfSAvKiBFbmQgdHdhX3VubWFwX3Njc2lfZGF0YSgpICovCisKKy8qIHNjc2lfaG9zdF90ZW1wbGF0ZSBpbml0aWFsaXplciAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiM3dhcmUgOTAwMCBTdG9yYWdlIENvbnRyb2xsZXIiLAorCS5xdWV1ZWNvbW1hbmQJCT0gdHdhX3Njc2lfcXVldWUsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHR3YV9zY3NpX2VoX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHR3YV9zY3NpX2Jpb3NwYXJhbSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gdHdhX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2FuX3F1ZXVlCQk9IFRXX1FfTEVOR1RILTIsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBUV19BUEFDSEVfTUFYX1NHTF9MRU5HVEgsCisJLm1heF9zZWN0b3JzCQk9IFRXX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBUV19NQVhfQ01EU19QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2hvc3RfYXR0cnMJCT0gdHdhX2hvc3RfYXR0cnMsCisJLmVtdWxhdGVkCQk9IDEKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9iZSBhbmQgaW5pdGlhbGl6ZSBhIGNhcmQgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHR3YV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXY7CisJdTMyIG1lbV9hZGRyOworCWludCByZXR2YWwgPSAtRU5PREVWOworCisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsoaG9zdCwgVFdfRFJJVkVSLCAweDM0LCAiRmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlIik7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0dmFsID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gRE1BXzY0QklUX01BU0sgOiBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsoaG9zdCwgVFdfRFJJVkVSLCAweDIzLCAiRmFpbGVkIHRvIHNldCBkbWEgbWFzayIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZihUV19EZXZpY2VfRXh0ZW5zaW9uKSk7CisJaWYgKCFob3N0KSB7CisJCVRXX1BSSU5USyhob3N0LCBUV19EUklWRVIsIDB4MjQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgZXh0ZW5zaW9uIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKwl0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWhvc3QtPmhvc3RkYXRhOworCisJbWVtc2V0KHR3X2RldiwgMCwgc2l6ZW9mKFRXX0RldmljZV9FeHRlbnNpb24pKTsKKworCS8qIFNhdmUgdmFsdWVzIHRvIGRldmljZSBleHRlbnNpb24gKi8KKwl0d19kZXYtPmhvc3QgPSBob3N0OworCXR3X2Rldi0+dHdfcGNpX2RldiA9IHBkZXY7CisKKwlpZiAodHdhX2luaXRpYWxpemVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNSwgIkZhaWxlZCB0byBpbml0aWFsaXplIGRldmljZSBleHRlbnNpb24iKTsKKwkJZ290byBvdXRfZnJlZV9kZXZpY2VfZXh0ZW5zaW9uOworCX0KKworCS8qIFJlcXVlc3QgSU8gcmVnaW9ucyAqLworCXJldHZhbCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIjN3LTl4eHgiKTsKKwlpZiAocmV0dmFsKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNiwgIkZhaWxlZCB0byBnZXQgbWVtIHJlZ2lvbiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJbWVtX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisKKwkvKiBTYXZlIGJhc2UgYWRkcmVzcyAqLworCXR3X2Rldi0+YmFzZV9hZGRyID0gaW9yZW1hcChtZW1fYWRkciwgUEFHRV9TSVpFKTsKKwlpZiAoIXR3X2Rldi0+YmFzZV9hZGRyKSB7CisJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgzNSwgIkZhaWxlZCB0byBpb3JlbWFwIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIGNhcmQgKi8KKwlUV19ESVNBQkxFX0lOVEVSUlVQVFModHdfZGV2KTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgKi8KKwlpZiAodHdhX3Jlc2V0X3NlcXVlbmNlKHR3X2RldiwgMCkpCisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKworCS8qIFNldCBob3N0IHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwlob3N0LT5tYXhfaWQgPSBUV19NQVhfVU5JVFM7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBUV19NQVhfQ0RCX0xFTjsKKworCS8qIENoYW5uZWxzIGFyZW4ndCBzdXBwb3J0ZWQgYnkgYWRhcHRlciAqLworCWhvc3QtPm1heF9sdW4gPSBUV19NQVhfTFVOUyh0d19kZXYtPndvcmtpbmdfc3JsKTsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisKKwkvKiBSZWdpc3RlciB0aGUgY2FyZCB3aXRoIHRoZSBrZXJuZWwgU0NTSSBsYXllciAqLworCXJldHZhbCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4MjcsICJzY3NpIGFkZCBob3N0IGZhaWxlZCIpOworCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDogc2NzaSVkOiBGb3VuZCBhIDN3YXJlIDkwMDAgU3RvcmFnZSBDb250cm9sbGVyIGF0IDB4JXgsIElSUTogJWQuXG4iLAorCSAgICAgICBob3N0LT5ob3N0X25vLCBtZW1fYWRkciwgcGRldi0+aXJxKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy05eHh4OiBzY3NpJWQ6IEZpcm13YXJlICVzLCBCSU9TICVzLCBQb3J0czogJWQuXG4iLAorCSAgICAgICBob3N0LT5ob3N0X25vLAorCSAgICAgICAoY2hhciAqKXR3YV9nZXRfcGFyYW0odHdfZGV2LCAwLCBUV19WRVJTSU9OX1RBQkxFLAorCQkJCSAgICAgVFdfUEFSQU1fRldWRVIsIFRXX1BBUkFNX0ZXVkVSX0xFTkdUSCksCisJICAgICAgIChjaGFyICopdHdhX2dldF9wYXJhbSh0d19kZXYsIDEsIFRXX1ZFUlNJT05fVEFCTEUsCisJCQkJICAgICBUV19QQVJBTV9CSU9TVkVSLCBUV19QQVJBTV9CSU9TVkVSX0xFTkdUSCksCisJICAgICAgICooaW50ICopdHdhX2dldF9wYXJhbSh0d19kZXYsIDIsIFRXX0lORk9STUFUSU9OX1RBQkxFLAorCQkJCSAgICAgVFdfUEFSQU1fUE9SVENPVU5ULCBUV19QQVJBTV9QT1JUQ09VTlRfTEVOR1RIKSk7CisKKwkvKiBOb3cgc2V0dXAgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0d2FfaW50ZXJydXB0LCBTQV9TSElSUSwgIjN3LTl4eHgiLCB0d19kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDMwLCAiRXJyb3IgcmVxdWVzdGluZyBJUlEiKTsKKwkJZ290byBvdXRfcmVtb3ZlX2hvc3Q7CisJfQorCisJdHdhX2RldmljZV9leHRlbnNpb25fbGlzdFt0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudF0gPSB0d19kZXY7CisJdHdhX2RldmljZV9leHRlbnNpb25fY291bnQrKzsKKworCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkICovCisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBGaW5hbGx5LCBzY2FuIHRoZSBob3N0ICovCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlpZiAodHdhX21ham9yID09IC0xKSB7CisJCWlmICgodHdhX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2ICgwLCAidHdhIiwgJnR3YV9mb3BzKSkgPCAwKQorCQkJVFdfUFJJTlRLKGhvc3QsIFRXX0RSSVZFUiwgMHgyOSwgIkZhaWxlZCB0byByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIik7CisJfQorCXJldHVybiAwOworCitvdXRfcmVtb3ZlX2hvc3Q6CisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKK291dF9yZWxlYXNlX21lbV9yZWdpb246CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9mcmVlX2RldmljZV9leHRlbnNpb246CisJdHdhX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3YV9wcm9iZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIGRldmljZSAqLworc3RhdGljIHZvaWQgdHdhX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisKKwlzY3NpX3JlbW92ZV9ob3N0KHR3X2Rldi0+aG9zdCk7CisKKwkvKiBVbnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgKi8KKwlpZiAodHdhX21ham9yID49IDApIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYodHdhX21ham9yLCAidHdhIik7CisJCXR3YV9tYWpvciA9IC0xOworCX0KKworCS8qIEZyZWUgdXAgdGhlIElSUSAqLworCWZyZWVfaXJxKHR3X2Rldi0+dHdfcGNpX2Rldi0+aXJxLCB0d19kZXYpOworCisJLyogU2h1dGRvd24gdGhlIGNhcmQgKi8KKwlfX3R3YV9zaHV0ZG93bih0d19kZXYpOworCisJLyogRnJlZSB1cCB0aGUgbWVtIHJlZ2lvbiAqLworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwkvKiBGcmVlIHVwIGRldmljZSBleHRlbnNpb24gcmVzb3VyY2VzICovCisJdHdhX2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCisJc2NzaV9ob3N0X3B1dCh0d19kZXYtPmhvc3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl0d2FfZGV2aWNlX2V4dGVuc2lvbl9jb3VudC0tOworfSAvKiBFbmQgdHdhX3JlbW92ZSgpICovCisKKy8qIFBDSSBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHR3YV9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM1dBUkUsIFBDSV9ERVZJQ0VfSURfM1dBUkVfOTAwMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0d2FfcGNpX3RibCk7CisKKy8qIHBjaV9kcml2ZXIgaW5pdGlhbGl6ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0d2FfZHJpdmVyID0geworCS5uYW1lCQk9ICIzdy05eHh4IiwKKwkuaWRfdGFibGUJPSB0d2FfcGNpX3RibCwKKwkucHJvYmUJCT0gdHdhX3Byb2JlLAorCS5yZW1vdmUJCT0gdHdhX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLnNodXRkb3duID0gdHdhX3NodXRkb3duCisJfQorfTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCB0d2FfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3YXJlIDkwMDAgU3RvcmFnZSBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IHYlcy5cbiIsIFRXX0RSSVZFUl9WRVJTSU9OKTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnR3YV9kcml2ZXIpOworfSAvKiBFbmQgdHdhX2luaXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkcml2ZXIgZXhpdCAqLworc3RhdGljIHZvaWQgX19leGl0IHR3YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0d2FfZHJpdmVyKTsKK30gLyogRW5kIHR3YV9leGl0KCkgKi8KKworbW9kdWxlX2luaXQodHdhX2luaXQpOworbW9kdWxlX2V4aXQodHdhX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhlY2JlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaApAQCAtMCwwICsxLDY4MiBAQAorLyoKKyAgIDN3LTl4eHguaCAtLSAzd2FyZSA5MDAwIFN0b3JhZ2UgQ29udHJvbGxlciBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKworICAgV3JpdHRlbiBCeTogQWRhbSBSYWRmb3JkIDxsaW51eHJhaWRAYW1jYy5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBOTyBXQVJSQU5UWQorICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzoKKyAgIGxpbnV4cmFpZEBhbWNjLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cuYW1jYy5jb20KKyovCisKKyNpZm5kZWYgXzNXXzlYWFhfSAorI2RlZmluZSBfM1dfOVhYWF9ICisKKy8qIEFFTiBzdHJpbmcgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX3R3YV9tZXNzYWdlX3R5cGUgeworICB1bnNpZ25lZCBpbnQgICBjb2RlOworICBjaGFyKiAgICAgICAgICB0ZXh0OworfSB0d2FfbWVzc2FnZV90eXBlOworCisvKiBBRU4gc3RyaW5ncyAqLworc3RhdGljIHR3YV9tZXNzYWdlX3R5cGUgdHdhX2Flbl90YWJsZVtdID0geworCXsweDAwMDAsICJBRU4gcXVldWUgZW1wdHkifSwKKwl7MHgwMDAxLCAiQ29udHJvbGxlciByZXNldCBvY2N1cnJlZCJ9LAorCXsweDAwMDIsICJEZWdyYWRlZCB1bml0IGRldGVjdGVkIn0sCisJezB4MDAwMywgIkNvbnRyb2xsZXIgZXJyb3Igb2NjdXJlZCJ9LAorCXsweDAwMDQsICJCYWNrZ3JvdW5kIHJlYnVpbGQgZmFpbGVkIn0sCisJezB4MDAwNSwgIkJhY2tncm91bmQgcmVidWlsZCBkb25lIn0sCisJezB4MDAwNiwgIkluY29tcGxldGUgdW5pdCBkZXRlY3RlZCJ9LAorCXsweDAwMDcsICJCYWNrZ3JvdW5kIGluaXRpYWxpemUgZG9uZSJ9LAorCXsweDAwMDgsICJVbmNsZWFuIHNodXRkb3duIGRldGVjdGVkIn0sCisJezB4MDAwOSwgIkRyaXZlIHRpbWVvdXQgZGV0ZWN0ZWQifSwKKwl7MHgwMDBBLCAiRHJpdmUgZXJyb3IgZGV0ZWN0ZWQifSwKKwl7MHgwMDBCLCAiUmVidWlsZCBzdGFydGVkIn0sCisJezB4MDAwQywgIkJhY2tncm91bmQgaW5pdGlhbGl6ZSBzdGFydGVkIn0sCisJezB4MDAwRCwgIkVudGlyZSBsb2dpY2FsIHVuaXQgd2FzIGRlbGV0ZWQifSwKKwl7MHgwMDBFLCAiQmFja2dyb3VuZCBpbml0aWFsaXplIGZhaWxlZCJ9LAorCXsweDAwMEYsICJTTUFSVCBhdHRyaWJ1dGUgZXhjZWVkZWQgdGhyZXNob2xkIn0sCisJezB4MDAxMCwgIlBvd2VyIHN1cHBseSByZXBvcnRlZCBBQyB1bmRlciByYW5nZSJ9LAorCXsweDAwMTEsICJQb3dlciBzdXBwbHkgcmVwb3J0ZWQgREMgb3V0IG9mIHJhbmdlIn0sCisJezB4MDAxMiwgIlBvd2VyIHN1cHBseSByZXBvcnRlZCBhIG1hbGZ1bmN0aW9uIn0sCisJezB4MDAxMywgIlBvd2VyIHN1cHBseSBwcmVkaWN0ZWQgbWFsZnVuY3Rpb24ifSwKKwl7MHgwMDE0LCAiQmF0dGVyeSBjaGFyZ2UgaXMgYmVsb3cgdGhyZXNob2xkIn0sCisJezB4MDAxNSwgIkZhbiBzcGVlZCBpcyBiZWxvdyB0aHJlc2hvbGQifSwKKwl7MHgwMDE2LCAiVGVtcGVyYXR1cmUgc2Vuc29yIGlzIGFib3ZlIHRocmVzaG9sZCJ9LAorCXsweDAwMTcsICJQb3dlciBzdXBwbHkgd2FzIHJlbW92ZWQifSwKKwl7MHgwMDE4LCAiUG93ZXIgc3VwcGx5IHdhcyBpbnNlcnRlZCJ9LAorCXsweDAwMTksICJEcml2ZSB3YXMgcmVtb3ZlZCBmcm9tIGEgYmF5In0sCisJezB4MDAxQSwgIkRyaXZlIHdhcyBpbnNlcnRlZCBpbnRvIGEgYmF5In0sCisJezB4MDAxQiwgIkRyaXZlIGJheSBjb3ZlciBkb29yIHdhcyBvcGVuZWQifSwKKwl7MHgwMDFDLCAiRHJpdmUgYmF5IGNvdmVyIGRvb3Igd2FzIGNsb3NlZCJ9LAorCXsweDAwMUQsICJQcm9kdWN0IGNhc2Ugd2FzIG9wZW5lZCJ9LAorCXsweDAwMjAsICJQcmVwYXJlIGZvciBzaHV0ZG93biAocG93ZXItb2ZmKSJ9LAorCXsweDAwMjEsICJEb3duZ3JhZGUgVURNQSBtb2RlIHRvIGxvd2VyIHNwZWVkIn0sCisJezB4MDAyMiwgIlVwZ3JhZGUgVURNQSBtb2RlIHRvIGhpZ2hlciBzcGVlZCJ9LAorCXsweDAwMjMsICJTZWN0b3IgcmVwYWlyIGNvbXBsZXRlZCJ9LAorCXsweDAwMjQsICJTYnVmIG1lbW9yeSB0ZXN0IGZhaWxlZCJ9LAorCXsweDAwMjUsICJFcnJvciBmbHVzaGluZyBjYWNoZWQgd3JpdGUgZGF0YSB0byBhcnJheSJ9LAorCXsweDAwMjYsICJEcml2ZSByZXBvcnRlZCBkYXRhIEVDQyBlcnJvciJ9LAorCXsweDAwMjcsICJEQ0IgaGFzIGNoZWNrc3VtIGVycm9yIn0sCisJezB4MDAyOCwgIkRDQiB2ZXJzaW9uIGlzIHVuc3VwcG9ydGVkIn0sCisJezB4MDAyOSwgIkJhY2tncm91bmQgdmVyaWZ5IHN0YXJ0ZWQifSwKKwl7MHgwMDJBLCAiQmFja2dyb3VuZCB2ZXJpZnkgZmFpbGVkIn0sCisJezB4MDAyQiwgIkJhY2tncm91bmQgdmVyaWZ5IGRvbmUifSwKKwl7MHgwMDJDLCAiQmFkIHNlY3RvciBvdmVyd3JpdHRlbiBkdXJpbmcgcmVidWlsZCJ9LAorCXsweDAwMkQsICJCYWNrZ3JvdW5kIHJlYnVpbGQgZXJyb3Igb24gc291cmNlIGRyaXZlIn0sCisJezB4MDAyRSwgIlJlcGxhY2UgZmFpbGVkIGJlY2F1c2UgcmVwbGFjZW1lbnQgZHJpdmUgdG9vIHNtYWxsIn0sCisJezB4MDAyRiwgIlZlcmlmeSBmYWlsZWQgYmVjYXVzZSBhcnJheSB3YXMgbmV2ZXIgaW5pdGlhbGl6ZWQifSwKKwl7MHgwMDMwLCAiVW5zdXBwb3J0ZWQgQVRBIGRyaXZlIn0sCisJezB4MDAzMSwgIlN5bmNocm9uaXplIGhvc3QvY29udHJvbGxlciB0aW1lIn0sCisJezB4MDAzMiwgIlNwYXJlIGNhcGFjaXR5IGlzIGluYWRlcXVhdGUgZm9yIHNvbWUgdW5pdHMifSwKKwl7MHgwMDMzLCAiQmFja2dyb3VuZCBtaWdyYXRpb24gc3RhcnRlZCJ9LAorCXsweDAwMzQsICJCYWNrZ3JvdW5kIG1pZ3JhdGlvbiBmYWlsZWQifSwKKwl7MHgwMDM1LCAiQmFja2dyb3VuZCBtaWdyYXRpb24gZG9uZSJ9LAorCXsweDAwMzYsICJWZXJpZnkgZGV0ZWN0ZWQgYW5kIGZpeGVkIGRhdGEvcGFyaXR5IG1pc21hdGNoIn0sCisJezB4MDAzNywgIlNPLURJTU0gaW5jb21wYXRpYmxlIn0sCisJezB4MDAzOCwgIlNPLURJTU0gbm90IGRldGVjdGVkIn0sCisJezB4MDAzOSwgIkNvcnJlY3RlZCBTYnVmIEVDQyBlcnJvciJ9LAorCXsweDAwM0EsICJEcml2ZSBwb3dlciBvbiByZXNldCBkZXRlY3RlZCJ9LAorCXsweDAwM0IsICJCYWNrZ3JvdW5kIHJlYnVpbGQgcGF1c2VkIn0sCisJezB4MDAzQywgIkJhY2tncm91bmQgaW5pdGlhbGl6ZSBwYXVzZWQifSwKKwl7MHgwMDNELCAiQmFja2dyb3VuZCB2ZXJpZnkgcGF1c2VkIn0sCisJezB4MDAzRSwgIkJhY2tncm91bmQgbWlncmF0aW9uIHBhdXNlZCJ9LAorCXsweDAwM0YsICJDb3JydXB0IGZsYXNoIGZpbGUgc3lzdGVtIGRldGVjdGVkIn0sCisJezB4MDA0MCwgIkZsYXNoIGZpbGUgc3lzdGVtIHJlcGFpcmVkIn0sCisJezB4MDA0MSwgIlVuaXQgbnVtYmVyIGFzc2lnbm1lbnRzIHdlcmUgbG9zdCJ9LAorCXsweDAwNDIsICJFcnJvciBkdXJpbmcgcmVhZCBvZiBwcmltYXJ5IERDQiJ9LAorCXsweDAwNDMsICJMYXRlbnQgZXJyb3IgZm91bmQgaW4gYmFja3VwIERDQiJ9LAorCXsweDAwRkMsICJSZWNvdmVyZWQvZmluaXNoZWQgYXJyYXkgbWVtYmVyc2hpcCB1cGRhdGUifSwKKwl7MHgwMEZELCAiSGFuZGxlciBsb2NrdXAifSwKKwl7MHgwMEZFLCAiUmV0cnlpbmcgUENJIHRyYW5zZmVyIn0sCisJezB4MDBGRiwgIkFFTiBxdWV1ZSBpcyBmdWxsIn0sCisJezB4RkZGRkZGRkYsIChjaGFyKikgMH0KK307CisKKy8qIEFFTiBzZXZlcml0eSB0YWJsZSAqLworc3RhdGljIGNoYXIgKnR3YV9hZW5fc2V2ZXJpdHlfdGFibGVbXSA9Cit7CisJIk5vbmUiLCAiRVJST1IiLCAiV0FSTklORyIsICJJTkZPIiwgIkRFQlVHIiwgKGNoYXIqKSAwCit9OworCisvKiBFcnJvciBzdHJpbmdzICovCitzdGF0aWMgdHdhX21lc3NhZ2VfdHlwZSB0d2FfZXJyb3JfdGFibGVbXSA9IHsKKwl7MHgwMTAwLCAiU0dMIGVudHJ5IGNvbnRhaW5zIHplcm8gZGF0YSJ9LAorCXsweDAxMDEsICJJbnZhbGlkIGNvbW1hbmQgb3Bjb2RlIn0sCisJezB4MDEwMiwgIlNHTCBlbnRyeSBoYXMgdW5hbGlnbmVkIGFkZHJlc3MifSwKKwl7MHgwMTAzLCAiU0dMIHNpemUgZG9lcyBub3QgbWF0Y2ggY29tbWFuZCJ9LAorCXsweDAxMDQsICJTR0wgZW50cnkgaGFzIGlsbGVnYWwgbGVuZ3RoIn0sCisJezB4MDEwNSwgIkNvbW1hbmQgcGFja2V0IGlzIG5vdCBhbGlnbmVkIn0sCisJezB4MDEwNiwgIkludmFsaWQgcmVxdWVzdCBJRCJ9LAorCXsweDAxMDcsICJEdXBsaWNhdGUgcmVxdWVzdCBJRCJ9LAorCXsweDAxMDgsICJJRCBub3QgbG9ja2VkIn0sCisJezB4MDEwOSwgIkxCQSBvdXQgb2YgcmFuZ2UifSwKKwl7MHgwMTBBLCAiTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQifSwKKwl7MHgwMTBCLCAiUGFyYW1ldGVyIHRhYmxlIGRvZXMgbm90IGV4aXN0In0sCisJezB4MDEwQywgIlBhcmFtZXRlciBpbmRleCBkb2VzIG5vdCBleGlzdCJ9LAorCXsweDAxMEQsICJJbnZhbGlkIGZpZWxkIGluIENEQiJ9LAorCXsweDAxMEUsICJTcGVjaWZpZWQgcG9ydCBoYXMgaW52YWxpZCBkcml2ZSJ9LAorCXsweDAxMEYsICJQYXJhbWV0ZXIgaXRlbSBzaXplIG1pc21hdGNoIn0sCisJezB4MDExMCwgIkZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiJ9LAorCXsweDAxMTEsICJNZW1vcnkgcmVxdWVzdCB0b28gbGFyZ2UifSwKKwl7MHgwMTEyLCAiT3V0IG9mIG1lbW9yeSBzZWdtZW50cyJ9LAorCXsweDAxMTMsICJJbnZhbGlkIGFkZHJlc3MgdG8gZGVhbGxvY2F0ZSJ9LAorCXsweDAxMTQsICJPdXQgb2YgbWVtb3J5In0sCisJezB4MDExNSwgIk91dCBvZiBoZWFwIn0sCisJezB4MDEyMCwgIkRvdWJsZSBkZWdyYWRlIn0sCisJezB4MDEyMSwgIkRyaXZlIG5vdCBkZWdyYWRlZCJ9LAorCXsweDAxMjIsICJSZWNvbnN0cnVjdCBlcnJvciJ9LAorCXsweDAxMjMsICJSZXBsYWNlIG5vdCBhY2NlcHRlZCJ9LAorCXsweDAxMjQsICJSZXBsYWNlIGRyaXZlIGNhcGFjaXR5IHRvbyBzbWFsbCJ9LAorCXsweDAxMjUsICJTZWN0b3IgY291bnQgbm90IGFsbG93ZWQifSwKKwl7MHgwMTI2LCAiTm8gc3BhcmVzIGxlZnQifSwKKwl7MHgwMTI3LCAiUmVjb25zdHJ1Y3QgZXJyb3IifSwKKwl7MHgwMTI4LCAiVW5pdCBpcyBvZmZsaW5lIn0sCisJezB4MDEyOSwgIkNhbm5vdCB1cGRhdGUgc3RhdHVzIHRvIERDQiJ9LAorCXsweDAxMzAsICJJbnZhbGlkIHN0cmlwZSBoYW5kbGUifSwKKwl7MHgwMTMxLCAiSGFuZGxlIHRoYXQgd2FzIG5vdCBsb2NrZWQifSwKKwl7MHgwMTMyLCAiSGFuZGxlIHRoYXQgd2FzIG5vdCBlbXB0eSJ9LAorCXsweDAxMzMsICJIYW5kbGUgaGFzIGRpZmZlcmVudCBvd25lciJ9LAorCXsweDAxNDAsICJJUFIgaGFzIHBhcmVudCJ9LAorCXsweDAxNTAsICJJbGxlZ2FsIFBidWYgYWRkcmVzcyBhbGlnbm1lbnQifSwKKwl7MHgwMTUxLCAiSWxsZWdhbCBQYnVmIHRyYW5zZmVyIGxlbmd0aCJ9LAorCXsweDAxNTIsICJJbGxlZ2FsIFNidWYgYWRkcmVzcyBhbGlnbm1lbnQifSwKKwl7MHgwMTUzLCAiSWxsZWdhbCBTYnVmIHRyYW5zZmVyIGxlbmd0aCJ9LAorCXsweDAxNjAsICJDb21tYW5kIHBhY2tldCB0b28gbGFyZ2UifSwKKwl7MHgwMTYxLCAiU0dMIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGgifSwKKwl7MHgwMTYyLCAiU0dMIGhhcyB0b28gbWFueSBlbnRyaWVzIn0sCisJezB4MDE3MCwgIkluc3VmZmljaWVudCByZXNvdXJjZXMgZm9yIHJlYnVpbGRlciJ9LAorCXsweDAxNzEsICJWZXJpZnkgZXJyb3IgKGRhdGEgIT0gcGFyaXR5KSJ9LAorCXsweDAxODAsICJSZXF1ZXN0ZWQgc2VnbWVudCBub3QgaW4gZGlyZWN0b3J5IG9mIHRoaXMgRENCIn0sCisJezB4MDE4MSwgIkRDQiBzZWdtZW50IGhhcyB1bnN1cHBvcnRlZCB2ZXJzaW9uIn0sCisJezB4MDE4MiwgIkRDQiBzZWdtZW50IGhhcyBjaGVja3N1bSBlcnJvciJ9LAorCXsweDAxODMsICJEQ0Igc3VwcG9ydCAoc2V0dGluZ3MpIHNlZ21lbnQgaW52YWxpZCJ9LAorCXsweDAxODQsICJEQ0IgVURCICh1bml0IGRlc2NyaXB0b3IgYmxvY2spIHNlZ21lbnQgaW52YWxpZCJ9LAorCXsweDAxODUsICJEQ0IgR1VJRCAoZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIpIHNlZ21lbnQgaW52YWxpZCJ9LAorCXsweDAxQTAsICJDb3VsZCBub3QgY2xlYXIgU2J1ZiJ9LAorCXsweDAxQzAsICJGbGFzaCBpZGVudGlmeSBmYWlsZWQifSwKKwl7MHgwMUMxLCAiRmxhc2ggb3V0IG9mIGJvdW5kcyJ9LAorCXsweDAxQzIsICJGbGFzaCB2ZXJpZnkgZXJyb3IifSwKKwl7MHgwMUMzLCAiRmxhc2ggZmlsZSBvYmplY3Qgbm90IGZvdW5kIn0sCisJezB4MDFDNCwgIkZsYXNoIGZpbGUgYWxyZWFkeSBwcmVzZW50In0sCisJezB4MDFDNSwgIkZsYXNoIGZpbGUgc3lzdGVtIGZ1bGwifSwKKwl7MHgwMUM2LCAiRmxhc2ggZmlsZSBub3QgcHJlc2VudCJ9LAorCXsweDAxQzcsICJGbGFzaCBmaWxlIHNpemUgZXJyb3IifSwKKwl7MHgwMUM4LCAiQmFkIGZsYXNoIGZpbGUgY2hlY2tzdW0ifSwKKwl7MHgwMUNBLCAiQ29ycnVwdCBmbGFzaCBmaWxlIHN5c3RlbSBkZXRlY3RlZCJ9LAorCXsweDAxRDAsICJJbnZhbGlkIGZpZWxkIGluIHBhcmFtZXRlciBsaXN0In0sCisJezB4MDFEMSwgIlBhcmFtZXRlciBsaXN0IGxlbmd0aCBlcnJvciJ9LAorCXsweDAxRDIsICJQYXJhbWV0ZXIgaXRlbSBpcyBub3QgY2hhbmdlYWJsZSJ9LAorCXsweDAxRDMsICJQYXJhbWV0ZXIgaXRlbSBpcyBub3Qgc2F2ZWFibGUifSwKKwl7MHgwMjAwLCAiVURNQSBDUkMgZXJyb3IifSwKKwl7MHgwMjAxLCAiSW50ZXJuYWwgQ1JDIGVycm9yIn0sCisJezB4MDIwMiwgIkRhdGEgRUNDIGVycm9yIn0sCisJezB4MDIwMywgIkFEUCBsZXZlbCAxIGVycm9yIn0sCisJezB4MDIwNCwgIlBvcnQgdGltZW91dCJ9LAorCXsweDAyMDUsICJEcml2ZSBwb3dlciBvbiByZXNldCJ9LAorCXsweDAyMDYsICJBRFAgbGV2ZWwgMiBlcnJvciJ9LAorCXsweDAyMDcsICJTb2Z0IHJlc2V0IGZhaWxlZCJ9LAorCXsweDAyMDgsICJEcml2ZSBub3QgcmVhZHkifSwKKwl7MHgwMjA5LCAiVW5jbGFzc2lmaWVkIHBvcnQgZXJyb3IifSwKKwl7MHgwMjBBLCAiRHJpdmUgYWJvcnRlZCBjb21tYW5kIn0sCisJezB4MDIxMCwgIkludGVybmFsIENSQyBlcnJvciJ9LAorCXsweDAyMTEsICJQQ0kgYWJvcnQgZXJyb3IifSwKKwl7MHgwMjEyLCAiUENJIHBhcml0eSBlcnJvciJ9LAorCXsweDAyMTMsICJQb3J0IGhhbmRsZXIgZXJyb3IifSwKKwl7MHgwMjE0LCAiVG9rZW4gaW50ZXJydXB0IGNvdW50IGVycm9yIn0sCisJezB4MDIxNSwgIlRpbWVvdXQgd2FpdGluZyBmb3IgUENJIHRyYW5zZmVyIn0sCisJezB4MDIxNiwgIkNvcnJlY3RlZCBidWZmZXIgRUNDIn0sCisJezB4MDIxNywgIlVuY29ycmVjdGVkIGJ1ZmZlciBFQ0MifSwKKwl7MHgwMjMwLCAiVW5zdXBwb3J0ZWQgY29tbWFuZCBkdXJpbmcgZmxhc2ggcmVjb3ZlcnkifSwKKwl7MHgwMjMxLCAiTmV4dCBpbWFnZSBidWZmZXIgZXhwZWN0ZWQifSwKKwl7MHgwMjMyLCAiQmluYXJ5IGltYWdlIGFyY2hpdGVjdHVyZSBpbmNvbXBhdGlibGUifSwKKwl7MHgwMjMzLCAiQmluYXJ5IGltYWdlIGhhcyBubyBzaWduYXR1cmUifSwKKwl7MHgwMjM0LCAiQmluYXJ5IGltYWdlIGhhcyBiYWQgY2hlY2tzdW0ifSwKKwl7MHgwMjM1LCAiSW1hZ2UgZG93bmxvYWRlZCBvdmVyZmxvd2VkIGJ1ZmZlciJ9LAorCXsweDAyNDAsICJJMkMgZGV2aWNlIG5vdCBmb3VuZCJ9LAorCXsweDAyNDEsICJJMkMgdHJhbnNhY3Rpb24gYWJvcnRlZCJ9LAorCXsweDAyNDIsICJTTy1ESU1NIHBhcmFtZXRlcihzKSBpbmNvbXBhdGlibGUgdXNpbmcgZGVmYXVsdHMifSwKKwl7MHgwMjQzLCAiU08tRElNTSB1bnN1cHBvcnRlZCJ9LAorCXsweDAyNDgsICJTUEkgdHJhbnNmZXIgc3RhdHVzIGVycm9yIn0sCisJezB4MDI0OSwgIlNQSSB0cmFuc2ZlciB0aW1lb3V0IGVycm9yIn0sCisJezB4MDI1MCwgIkludmFsaWQgdW5pdCBkZXNjcmlwdG9yIHNpemUgaW4gQ3JlYXRlVW5pdCJ9LAorCXsweDAyNTEsICJVbml0IGRlc2NyaXB0b3Igc2l6ZSBleGNlZWRzIGRhdGEgYnVmZmVyIGluIENyZWF0ZVVuaXQifSwKKwl7MHgwMjUyLCAiSW52YWxpZCB2YWx1ZSBpbiBDcmVhdGVVbml0IGRlc2NyaXB0b3IifSwKKwl7MHgwMjUzLCAiSW5hZGVxdWF0ZSBkaXNrIHNwYWNlIHRvIHN1cHBvcnQgZGVzY3JpcHRvciBpbiBDcmVhdGVVbml0In0sCisJezB4MDI1NCwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBjaGFubmVsIGZvciB0aGlzIHVuaXQgZGVzY3JpcHRvciJ9LAorCXsweDAyNTUsICJDcmVhdGVVbml0IGRlc2NyaXB0b3Igc3BlY2lmaWVzIGEgZHJpdmUgYWxyZWFkeSBpbiB1c2UifSwKKwl7MHgwMjU2LCAiVW5hYmxlIHRvIHdyaXRlIGNvbmZpZ3VyYXRpb24gdG8gYWxsIGRpc2tzIGR1cmluZyBDcmVhdGVVbml0In0sCisJezB4MDI1NywgIkNyZWF0ZVVuaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGRlc2NyaXB0b3IgdmVyc2lvbiJ9LAorCXsweDAyNTgsICJJbnZhbGlkIHN1YnVuaXQgZm9yIFJBSUQgMCBvciA1IGluIENyZWF0ZVVuaXQifSwKKwl7MHgwMjU5LCAiVG9vIG1hbnkgZGVzY3JpcHRvcnMgaW4gQ3JlYXRlVW5pdCJ9LAorCXsweDAyNUEsICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGluIENyZWF0ZVVuaXQgZGVzY3JpcHRvciJ9LAorCXsweDAyNUIsICJJbnZhbGlkIExCQSBvZmZzZXQgc3BlY2lmaWVkIGluIENyZWF0ZVVuaXQgZGVzY3JpcHRvciJ9LAorCXsweDAyNUMsICJJbnZhbGlkIHN0cmlwZWxldCBzaXplIHNwZWNpZmllZCBpbiBDcmVhdGVVbml0IGRlc2NyaXB0b3IifSwKKwl7MHgwMjYwLCAiU01BUlQgYXR0cmlidXRlIGV4Y2VlZGVkIHRocmVzaG9sZCJ9LAorCXsweEZGRkZGRkZGLCAoY2hhciopIDB9Cit9OworCisvKiBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX0hPU1RfSU5URVJSVVBUCSAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9NQVNLX0NPTU1BTkRfSU5URVJSVVBUICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBUV19DT05UUk9MX01BU0tfUkVTUE9OU0VfSU5URVJSVVBUICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfVU5NQVNLX0NPTU1BTkRfSU5URVJSVVBUICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9VTk1BU0tfUkVTUE9OU0VfSU5URVJSVVBUICAgMHgwMDAwNDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX0VSUk9SX1NUQVRVUwkgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBUV19DT05UUk9MX0lTU1VFX1NPRlRfUkVTRVQJICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9FTkFCTEVfSU5URVJSVVBUUwkgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBUV19DT05UUk9MX0RJU0FCTEVfSU5URVJSVVBUUwkgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBUV19DT05UUk9MX0lTU1VFX0hPU1RfSU5URVJSVVBUCSAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfUEFSSVRZX0VSUk9SICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9RVUVVRV9FUlJPUiAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX1BDSV9BQk9SVCAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfU0JVRl9XUklURV9FUlJPUiAgICAgIDB4MDAwMDAwMDgKKworLyogU3RhdHVzIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBUV19TVEFUVVNfTUFKT1JfVkVSU0lPTl9NQVNLCSAgICAgICAweEYwMDAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19NSU5PUl9WRVJTSU9OX01BU0sJICAgICAgIDB4MEYwMDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX1BDSV9QQVJJVFlfRVJST1IJICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX1FVRVVFX0VSUk9SCQkgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX0VSUk9SCSAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19QQ0lfQUJPUlQJCSAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19IT1NUX0lOVEVSUlVQVAkgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBUV19TVEFUVVNfQVRURU5USU9OX0lOVEVSUlVQVAkgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBUV19TVEFUVVNfQ09NTUFORF9JTlRFUlJVUFQJICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX1JFU1BPTlNFX0lOVEVSUlVQVAkgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9GVUxMCSAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWQkgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX1JFQURZCSAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFRXX1NUQVRVU19DT01NQU5EX1FVRVVFX0VNUFRZCSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFRXX1NUQVRVU19FWFBFQ1RFRF9CSVRTCQkgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUV19TVEFUVVNfVU5FWFBFQ1RFRF9CSVRTCSAgICAgICAweDAwRjAwMDA4CisjZGVmaW5lIFRXX1NUQVRVU19TQlVGX1dSSVRFX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCAgICAgICAgICAgICAgMHgwMERGMDAwOAorCisvKiBSRVNQT05TRSBRVUVVRSBCSVQgREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgVFdfUkVTUE9OU0VfSURfTUFTSwkJICAgICAgIDB4MDAwMDBGRjAKKworLyogUENJIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBUV19OVU1ERVZJQ0VTIDEKKyNkZWZpbmUgVFdfUENJX0NMRUFSX1BBUklUWV9FUlJPUlMgMHhjMTAwCisjZGVmaW5lIFRXX1BDSV9DTEVBUl9QQ0lfQUJPUlQgICAgIDB4MjAwMAorCisvKiBDb21tYW5kIHBhY2tldCBvcGNvZGVzIHVzZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBUV19PUF9JTklUX0NPTk5FQ1RJT04gMHgxCisjZGVmaW5lIFRXX09QX0dFVF9QQVJBTQkgICAgICAweDEyCisjZGVmaW5lIFRXX09QX1NFVF9QQVJBTQkgICAgICAweDEzCisjZGVmaW5lIFRXX09QX0VYRUNVVEVfU0NTSSAgICAweDEwCisjZGVmaW5lIFRXX09QX0RPV05MT0FEX0ZJUk1XQVJFIDB4MTYKKyNkZWZpbmUgVFdfT1BfUkVTRVQgICAgICAgICAgICAgMHgxQworCisvKiBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uIChBRU4pIGNvZGVzIHVzZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBUV19BRU5fUVVFVUVfRU1QVFkgICAgICAgMHgwMDAwCisjZGVmaW5lIFRXX0FFTl9TT0ZUX1JFU0VUICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFdfQUVOX1NZTkNfVElNRV9XSVRIX0hPU1QgMHgwMzEKKyNkZWZpbmUgVFdfQUVOX1NFVkVSSVRZX0VSUk9SICAgIDB4MQorI2RlZmluZSBUV19BRU5fU0VWRVJJVFlfREVCVUcgICAgMHg0CisjZGVmaW5lIFRXX0FFTl9OT1RfUkVUUklFVkVEIDB4MQorI2RlZmluZSBUV19BRU5fUkVUUklFVkVEIDB4MgorCisvKiBDb21tYW5kIHN0YXRlIGRlZmluZXMgKi8KKyNkZWZpbmUgVFdfU19JTklUSUFMICAgMHgxICAvKiBJbml0aWFsIHN0YXRlICovCisjZGVmaW5lIFRXX1NfU1RBUlRFRCAgIDB4MiAgLyogSWQgaW4gdXNlICovCisjZGVmaW5lIFRXX1NfUE9TVEVEICAgIDB4NCAgLyogUG9zdGVkIHRvIHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lIFRXX1NfUEVORElORyAgIDB4OCAgLyogV2FpdGluZyB0byBiZSBwb3N0ZWQgaW4gaXNyICovCisjZGVmaW5lIFRXX1NfQ09NUExFVEVEIDB4MTAgLyogQ29tcGxldGVkIGJ5IGlzciAqLworI2RlZmluZSBUV19TX0ZJTklTSEVEICAweDIwIC8qIEkvTyBjb21wbGV0ZWx5IGRvbmUgKi8KKworLyogQ29tcGF0aWJpbGl0eSBkZWZpbmVzICovCisjZGVmaW5lIFRXXzkwMDBfQVJDSF9JRCAweDUKKyNkZWZpbmUgVFdfQ1VSUkVOVF9EUklWRVJfU1JMIDI4CisjZGVmaW5lIFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEIDkKKyNkZWZpbmUgVFdfQ1VSUkVOVF9EUklWRVJfQlJBTkNIIDQKKworLyogUGhhc2UgZGVmaW5lcyAqLworI2RlZmluZSBUV19QSEFTRV9JTklUSUFMIDAKKyNkZWZpbmUgVFdfUEhBU0VfU0lOR0xFICAxCisjZGVmaW5lIFRXX1BIQVNFX1NHTElTVCAgMgorCisvKiBNaXNjIGRlZmluZXMgKi8KKyNkZWZpbmUgVFdfU0VDVE9SX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgVFdfQUxJR05NRU5UXzkwMDAgICAgICAgICAgICAgICAgICAgICA0ICAvKiA0IGJ5dGVzICovCisjZGVmaW5lIFRXX0FMSUdOTUVOVF85MDAwX1NHTCAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIFRXX01BWF9VTklUUwkJCSAgICAgIDE2CisjZGVmaW5lIFRXX0lOSVRfTUVTU0FHRV9DUkVESVRTCQkgICAgICAweDEwMAorI2RlZmluZSBUV19JTklUX0NPTU1BTkRfUEFDS0VUX1NJWkUJICAgICAgMHgzCisjZGVmaW5lIFRXX0lOSVRfQ09NTUFORF9QQUNLRVRfU0laRV9FWFRFTkRFRCAgMHg2CisjZGVmaW5lIFRXX0VYVEVOREVEX0lOSVRfQ09OTkVDVAkgICAgICAweDIKKyNkZWZpbmUgVFdfQlVORExFRF9GV19TQUZFX1RPX0ZMQVNICSAgICAgIDB4NAorI2RlZmluZSBUV19DVExSX0ZXX1JFQ09NTUVORFNfRkxBU0gJICAgICAgMHg4CisjZGVmaW5lIFRXX0NUTFJfRldfQ09NUEFUSUJMRQkJICAgICAgMHgyCisjZGVmaW5lIFRXX0JBU0VfRldfU1JMCQkJICAgICAgMjQKKyNkZWZpbmUgVFdfQkFTRV9GV19CUkFOQ0gJCSAgICAgIDAKKyNkZWZpbmUgVFdfQkFTRV9GV19CVUlMRAkJICAgICAgMQorI2RlZmluZSBUV19GV19TUkxfTFVOU19TVVBQT1JURUQgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFRXX1FfTEVOR1RICQkJICAgICAgMjU2CisjZGVmaW5lIFRXX1FfU1RBUlQJCQkgICAgICAwCisjZGVmaW5lIFRXX01BWF9TTE9UCQkJICAgICAgMzIKKyNkZWZpbmUgVFdfTUFYX1JFU0VUX1RSSUVTCQkgICAgICAyCisjZGVmaW5lIFRXX01BWF9DTURTX1BFUl9MVU4JCSAgICAgIDI1NAorI2RlZmluZSBUV19NQVhfUkVTUE9OU0VfRFJBSU4JCSAgICAgIDI1NgorI2RlZmluZSBUV19NQVhfQUVOX0RSQUlOCQkgICAgICA0MAorI2RlZmluZSBUV19JTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVFdfSU5fQ0hSREVWX0lPQ1RMICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRXX0lOX0FUVEVOVElPTl9MT09QCQkgICAgICA0CisjZGVmaW5lIFRXX01BWF9TRUNUT1JTICAgICAgICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIFRXX0FFTl9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBUV19JT0NUTF9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICgxICogSFopIC8qIDEgc2Vjb25kICovCisjZGVmaW5lIFRXX01BWF9DREJfTEVOICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFdfSVNSX0RPTlRfQ09NUExFVEUgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRXX0lTUl9ET05UX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUV19JT0NUTF9DSFJERVZfVElNRU9VVCAgICAgICAgICAgICAgIDYwIC8qIDYwIHNlY29uZHMgKi8KKyNkZWZpbmUgVFdfSU9DVExfQ0hSREVWX0ZSRUUgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBUV19DT01NQU5EX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDEyOCAvKiAxMjggYnl0ZXMgKi8KKyNkZWZpbmUgVFdfVkVSU0lPTl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDA0MDIKKyNkZWZpbmUgVFdfVElNRUtFRVBfVEFCTEUJCSAgICAgIDB4MDQwQQorI2RlZmluZSBUV19JTkZPUk1BVElPTl9UQUJMRQkJICAgICAgMHgwNDAzCisjZGVmaW5lIFRXX1BBUkFNX0ZXVkVSCQkJICAgICAgMworI2RlZmluZSBUV19QQVJBTV9GV1ZFUl9MRU5HVEgJCSAgICAgIDE2CisjZGVmaW5lIFRXX1BBUkFNX0JJT1NWRVIJCSAgICAgIDQKKyNkZWZpbmUgVFdfUEFSQU1fQklPU1ZFUl9MRU5HVEgJCSAgICAgIDE2CisjZGVmaW5lIFRXX1BBUkFNX1BPUlRDT1VOVAkJICAgICAgMworI2RlZmluZSBUV19QQVJBTV9QT1JUQ09VTlRfTEVOR1RICSAgICAgIDEKKyNkZWZpbmUgVFdfTUlOX1NHTF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAweDIwMCAvKiA1MTIgYnl0ZXMgKi8KKyNkZWZpbmUgVFdfTUFYX1NFTlNFX0xFTkdUSCAgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX0FFTiAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX0NPTU1BTkQgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX1BDSElQICAgICAgICAgICAgICAgICAweDEwMDIKKyNkZWZpbmUgVFdfRVZFTlRfU09VUkNFX0RSSVZFUiAgICAgICAgICAgICAgICAweDEwMDMKKyNkZWZpbmUgVFdfSU9DVExfR0VUX0NPTVBBVElCSUxJVFlfSU5GTwkgICAgICAweDEwMQorI2RlZmluZSBUV19JT0NUTF9HRVRfTEFTVF9FVkVOVCAgICAgICAgICAgICAgIDB4MTAyCisjZGVmaW5lIFRXX0lPQ1RMX0dFVF9GSVJTVF9FVkVOVCAgICAgICAgICAgICAgMHgxMDMKKyNkZWZpbmUgVFdfSU9DVExfR0VUX05FWFRfRVZFTlQgICAgICAgICAgICAgICAweDEwNAorI2RlZmluZSBUV19JT0NUTF9HRVRfUFJFVklPVVNfRVZFTlQgICAgICAgICAgIDB4MTA1CisjZGVmaW5lIFRXX0lPQ1RMX0dFVF9MT0NLICAgICAgICAgICAgICAgICAgICAgMHgxMDYKKyNkZWZpbmUgVFdfSU9DVExfUkVMRUFTRV9MT0NLICAgICAgICAgICAgICAgICAweDEwNworI2RlZmluZSBUV19JT0NUTF9GSVJNV0FSRV9QQVNTX1RIUk9VR0ggICAgICAgIDB4MTA4CisjZGVmaW5lIFRXX0lPQ1RMX0VSUk9SX1NUQVRVU19OT1RfTE9DS0VEICAgICAgMHgxMDAxIC8vIE5vdCBsb2NrZWQKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfU1RBVFVTX0xPQ0tFRCAgICAgICAgICAweDEwMDIgLy8gQWxyZWFkeSBsb2NrZWQKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfU1RBVFVTX05PX01PUkVfRVZFTlRTICAweDEwMDMgLy8gTm8gbW9yZSBldmVudHMKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfU1RBVFVTX0FFTl9DTE9CQkVSICAgICAweDEwMDQgLy8gQUVOIGNsb2JiZXIgb2NjdXJyZWQKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRUZBVUxUCSAgICAgIC1FRkFVTFQgLy8gQmFkIGFkZHJlc3MKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRUlOVFIJCSAgICAgIC1FSU5UUiAgLy8gSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRUlOVkFMCSAgICAgIC1FSU5WQUwgLy8gSW52YWxpZCBhcmd1bWVudAorI2RlZmluZSBUV19JT0NUTF9FUlJPUl9PU19FTk9NRU0JICAgICAgLUVOT01FTSAvLyBPdXQgb2YgbWVtb3J5CisjZGVmaW5lIFRXX0lPQ1RMX0VSUk9SX09TX0VSRVNUQVJUU1lTCSAgICAgIC1FUkVTVEFSVFNZUyAvLyBSZXN0YXJ0IHN5c3RlbSBjYWxsCisjZGVmaW5lIFRXX0lPQ1RMX0VSUk9SX09TX0VJTwkJICAgICAgLUVJTyAvLyBJL08gZXJyb3IKKyNkZWZpbmUgVFdfSU9DVExfRVJST1JfT1NfRU5PVFRZCSAgICAgIC1FTk9UVFkgLy8gTm90IGEgdHlwZXdyaXRlcgorI2RlZmluZSBUV19JT0NUTF9FUlJPUl9PU19FTk9ERVYJICAgICAgLUVOT0RFViAvLyBObyBzdWNoIGRldmljZQorI2RlZmluZSBUV19BTExPQ0FUSU9OX0xFTkdUSAkJICAgICAgMTI4CisjZGVmaW5lIFRXX1NFTlNFX0RBVEFfTEVOR1RICQkgICAgICAxOAorI2RlZmluZSBUV19TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OCSAgICAgIDIKKyNkZWZpbmUgVFdfRVJST1JfTE9HSUNBTF9VTklUX05PVF9TVVBQT1JURUQgICAweDEwYQorI2RlZmluZSBUV19FUlJPUl9VTklUX09GRkxJTkUgICAgICAgICAgICAgICAgIDB4MTI4CisjZGVmaW5lIFRXX01FU1NBR0VfU09VUkNFX0NPTlRST0xMRVJfRVJST1IgICAgMworI2RlZmluZSBUV19NRVNTQUdFX1NPVVJDRV9DT05UUk9MTEVSX0VWRU5UICAgIDQKKyNkZWZpbmUgVFdfTUVTU0FHRV9TT1VSQ0VfTElOVVhfRFJJVkVSICAgICAgICA2CisjZGVmaW5lIFRXX0RSSVZFUiBUV19NRVNTQUdFX1NPVVJDRV9MSU5VWF9EUklWRVIKKyNkZWZpbmUgVFdfTUVTU0FHRV9TT1VSQ0VfTElOVVhfT1MgICAgICAgICAgICA5CisjZGVmaW5lIFRXX09TIFRXX01FU1NBR0VfU09VUkNFX0xJTlVYX09TCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfM1dBUkVfOTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNXQVJFXzkwMDAgMHgxMDAyCisjZW5kaWYKKworLyogQml0bWFzayBtYWNyb3MgdG8gZWxpbWluYXRlIGJpdGZpZWxkcyAqLworCisvKiBvcGNvZGU6IDUsIHJlc2VydmVkOiAzICovCisjZGVmaW5lIFRXX09QUkVTX0lOKHgseSkgKCh4IDw8IDUpIHwgKHkgJiAweDFmKSkKKyNkZWZpbmUgVFdfT1BfT1VUKHgpICh4ICYgMHgxZikKKworLyogb3Bjb2RlOiA1LCBzZ2xvZmZzZXQ6IDMgKi8KKyNkZWZpbmUgVFdfT1BTR0xfSU4oeCx5KSAoKHggPDwgNSkgfCAoeSAmIDB4MWYpKQorI2RlZmluZSBUV19TR0xfT1VUKHgpICgoeCA+PiA1KSAmIDB4NykKKworLyogc2V2ZXJpdHk6IDMsIHJlc2VydmVkOiA1ICovCisjZGVmaW5lIFRXX1NFVl9PVVQoeCkgKHggJiAweDcpCisKKy8qIHJlc2VydmVkXzE6IDQsIHJlc3BvbnNlX2lkOiA4LCByZXNlcnZlZF8yOiAyMCAqLworI2RlZmluZSBUV19SRVNJRF9PVVQoeCkgKCh4ID4+IDQpICYgMHhmZikKKworLyogcmVxdWVzdF9pZDogMTIsIGx1bjogNCAqLworI2RlZmluZSBUV19SRVFfTFVOX0lOKGx1biwgcmVxdWVzdF9pZCkgKCgobHVuIDw8IDEyKSAmIDB4ZjAwMCkgfCAocmVxdWVzdF9pZCAmIDB4ZmZmKSkKKyNkZWZpbmUgVFdfTFVOX09VVChsdW4pICgobHVuID4+IDEyKSAmIDB4ZikKKworLyogTWFjcm9zICovCisjZGVmaW5lIFRXX0NPTlRST0xfUkVHX0FERFIoeCkgKHgtPmJhc2VfYWRkcikKKyNkZWZpbmUgVFdfU1RBVFVTX1JFR19BRERSKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHg0KQorI2RlZmluZSBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSKHgpIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweDIwKSA6ICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHg4KSkKKyNkZWZpbmUgVFdfUkVTUE9OU0VfUVVFVUVfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweEMpCisjZGVmaW5lIFRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHgpICh3cml0ZWwoVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCwgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQoeCkgKHdyaXRlbChUV19DT05UUk9MX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19DTEVBUl9IT1NUX0lOVEVSUlVQVCh4KSAod3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfSE9TVF9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19ESVNBQkxFX0lOVEVSUlVQVFMoeCkgKHdyaXRlbChUV19DT05UUk9MX0RJU0FCTEVfSU5URVJSVVBUUywgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX0VOQUJMRV9BTkRfQ0xFQVJfSU5URVJSVVBUUyh4KSAod3JpdGVsKFRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfVU5NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfRU5BQkxFX0lOVEVSUlVQVFMsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHgpICh3cml0ZWwoVFdfQ09OVFJPTF9NQVNLX0NPTU1BTkRfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfVU5NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHgpICh3cml0ZWwoVFdfQ09OVFJPTF9VTk1BU0tfQ09NTUFORF9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19TT0ZUX1JFU0VUKHgpICh3cml0ZWwoVFdfQ09OVFJPTF9JU1NVRV9TT0ZUX1JFU0VUIHwgXAorCQkJVFdfQ09OVFJPTF9DTEVBUl9IT1NUX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19SRVNQT05TRV9JTlRFUlJVUFQgfCBcCisJCQlUV19DT05UUk9MX0NMRUFSX0VSUk9SX1NUQVRVUyB8IFwKKwkJCVRXX0NPTlRST0xfRElTQUJMRV9JTlRFUlJVUFRTLCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfUFJJTlRLKGgsYSxiLGMpIHsgXAoraWYgKGgpIFwKK3ByaW50ayhLRVJOX1dBUk5JTkcgIjN3LTl4eHg6IHNjc2klZDogRVJST1I6ICgweCUwMlg6MHglMDRYKTogJXMuXG4iLGgtPmhvc3Rfbm8sYSxiLGMpOyBcCitlbHNlIFwKK3ByaW50ayhLRVJOX1dBUk5JTkcgIjN3LTl4eHg6IEVSUk9SOiAoMHglMDJYOjB4JTA0WCk6ICVzLlxuIixhLGIsYyk7IFwKK30KKyNkZWZpbmUgVFdfTUFYX0xVTlMoc3JsKSAoc3JsIDwgVFdfRldfU1JMX0xVTlNfU1VQUE9SVEVEID8gMSA6IDE2KQorI2RlZmluZSBUV19DT01NQU5EX1NJWkUgKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyA1IDogNCkKKyNkZWZpbmUgVFdfQVBBQ0hFX01BWF9TR0xfTEVOR1RIIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gNzIgOiAxMDkpCisjZGVmaW5lIFRXX0VTQ0FMQURFX01BWF9TR0xfTEVOR1RIIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0ID8gNDEgOiA2MikKKyNkZWZpbmUgVFdfUEFERElOR19MRU5HVEggKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyA4IDogMCkKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIFNjYXR0ZXIgR2F0aGVyIExpc3QgRW50cnkgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19TR19FbnRyeSB7CisJZG1hX2FkZHJfdCBhZGRyZXNzOworCXUzMiBsZW5ndGg7Cit9IFRXX1NHX0VudHJ5OworCisvKiBDb21tYW5kIFBhY2tldCAqLwordHlwZWRlZiBzdHJ1Y3QgVFdfQ29tbWFuZCB7CisJdW5zaWduZWQgY2hhciBvcGNvZGVfX3NnbG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyIHNpemU7CisJdW5zaWduZWQgY2hhciByZXF1ZXN0X2lkOworCXVuc2lnbmVkIGNoYXIgdW5pdF9faG9zdGlkOworCS8qIFNlY29uZCBEV09SRCAqLworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5pb24geworCQl1bnNpZ25lZCBzaG9ydCBibG9ja19jb3VudDsKKwkJdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVyX2NvdW50OworCX0gYnl0ZTZfb2Zmc2V0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsYmE7CisJCQlUV19TR19FbnRyeSBzZ2xbVFdfRVNDQUxBREVfTUFYX1NHTF9MRU5HVEhdOworCQkJZG1hX2FkZHJfdCBwYWRkaW5nOworCQl9IGlvOworCQlzdHJ1Y3QgeworCQkJVFdfU0dfRW50cnkgc2dsW1RXX0VTQ0FMQURFX01BWF9TR0xfTEVOR1RIXTsKKwkJCXUzMiBwYWRkaW5nOworCQkJZG1hX2FkZHJfdCBwYWRkaW5nMjsKKwkJfSBwYXJhbTsKKwl9IGJ5dGU4X29mZnNldDsKK30gVFdfQ29tbWFuZDsKKworLyogQ29tbWFuZCBQYWNrZXQgZm9yIDkwMDArIGNvbnRyb2xsZXJzICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfQ29tbWFuZF9BcGFjaGUgeworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlX19yZXNlcnZlZDsKKwl1bnNpZ25lZCBjaGFyIHVuaXQ7CisJdW5zaWduZWQgc2hvcnQgcmVxdWVzdF9pZF9fbHVubDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIHNnbF9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgc2dsX2VudHJpZXNfX2x1bmg7CisJdW5zaWduZWQgY2hhciBjZGJbMTZdOworCVRXX1NHX0VudHJ5IHNnX2xpc3RbVFdfQVBBQ0hFX01BWF9TR0xfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIHBhZGRpbmdbVFdfUEFERElOR19MRU5HVEhdOworfSBUV19Db21tYW5kX0FwYWNoZTsKKworLyogTmV3IGNvbW1hbmQgcGFja2V0IGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciB7CisJdW5zaWduZWQgY2hhciBzZW5zZV9kYXRhW1RXX1NFTlNFX0RBVEFfTEVOR1RIXTsKKwlzdHJ1Y3QgeworCQljaGFyIHJlc2VydmVkWzRdOworCQl1bnNpZ25lZCBzaG9ydCBlcnJvcjsKKwkJdW5zaWduZWQgY2hhciBwYWRkaW5nOworCQl1bnNpZ25lZCBjaGFyIHNldmVyaXR5X19yZXNlcnZlZDsKKwl9IHN0YXR1c19ibG9jazsKKwl1bnNpZ25lZCBjaGFyIGVycl9zcGVjaWZpY19kZXNjWzk4XTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHNpemVfaGVhZGVyOworCQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKKwkJdW5zaWduZWQgY2hhciBzaXplX3NlbnNlOworCX0gaGVhZGVyX2Rlc2M7Cit9IFRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlcjsKKworLyogVGhpcyBzdHJ1Y3QgaXMgYSB1bmlvbiBvZiB0aGUgMiBjb21tYW5kIHBhY2tldHMgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19Db21tYW5kX0Z1bGwgeworCVRXX0NvbW1hbmRfQXBhY2hlX0hlYWRlciBoZWFkZXI7CisJdW5pb24geworCQlUV19Db21tYW5kIG9sZGNvbW1hbmQ7CisJCVRXX0NvbW1hbmRfQXBhY2hlIG5ld2NvbW1hbmQ7CisJfSBjb21tYW5kOworfSBUV19Db21tYW5kX0Z1bGw7CisKKy8qIEluaXRjb25uZWN0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0luaXRjb25uZWN0IHsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZV9fcmVzZXJ2ZWQ7CisJdW5zaWduZWQgY2hhciBzaXplOworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9pZDsKKwl1bnNpZ25lZCBjaGFyIHJlczI7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBtZXNzYWdlX2NyZWRpdHM7CisJdTMyIGZlYXR1cmVzOworCXVuc2lnbmVkIHNob3J0IGZ3X3NybDsKKwl1bnNpZ25lZCBzaG9ydCBmd19hcmNoX2lkOworCXVuc2lnbmVkIHNob3J0IGZ3X2JyYW5jaDsKKwl1bnNpZ25lZCBzaG9ydCBmd19idWlsZDsKKwl1MzIgcmVzdWx0OworfSBUV19Jbml0Y29ubmVjdDsKKworLyogRXZlbnQgaW5mbyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19FdmVudAoreworCXVuc2lnbmVkIGludCBzZXF1ZW5jZV9pZDsKKwl1bnNpZ25lZCBpbnQgdGltZV9zdGFtcF9zZWM7CisJdW5zaWduZWQgc2hvcnQgYWVuX2NvZGU7CisJdW5zaWduZWQgY2hhciBzZXZlcml0eTsKKwl1bnNpZ25lZCBjaGFyIHJldHJpZXZlZDsKKwl1bnNpZ25lZCBjaGFyIHJlcGVhdF9jb3VudDsKKwl1bnNpZ25lZCBjaGFyIHBhcmFtZXRlcl9sZW47CisJdW5zaWduZWQgY2hhciBwYXJhbWV0ZXJfZGF0YVs5OF07Cit9IFRXX0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW9jdGxfRHJpdmVyX0NvbW1hbmQgeworCXVuc2lnbmVkIGludCBjb250cm9sX2NvZGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgdW5pcXVlX2lkOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZV9pZDsKKwl1bnNpZ25lZCBpbnQgb3Nfc3BlY2lmaWM7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9sZW5ndGg7Cit9IFRXX0lvY3RsX0RyaXZlcl9Db21tYW5kOworCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW9jdGxfQXBhY2hlIHsKKwlUV19Jb2N0bF9Ecml2ZXJfQ29tbWFuZCBkcml2ZXJfY29tbWFuZDsKKyAgICAgICAgY2hhciBwYWRkaW5nWzQ4OF07CisJVFdfQ29tbWFuZF9GdWxsIGZpcm13YXJlX2NvbW1hbmQ7CisJY2hhciBkYXRhX2J1ZmZlclsxXTsKK30gVFdfSW9jdGxfQnVmX0FwYWNoZTsKKworLyogTG9jayBzdHJ1Y3R1cmUgZm9yIGlvY3RsIGdldC9yZWxlYXNlIGxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19Mb2NrIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlYzsKKwl1bnNpZ25lZCBsb25nIHRpbWVfcmVtYWluaW5nX21zZWM7CisJdW5zaWduZWQgbG9uZyBmb3JjZV9mbGFnOworfSBUV19Mb2NrOworCisvKiBHZXRQYXJhbSBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQJdGFibGVfaWQ7CisJdW5zaWduZWQgc2hvcnQJcGFyYW1ldGVyX2lkOworCXVuc2lnbmVkIHNob3J0CXBhcmFtZXRlcl9zaXplX2J5dGVzOworCXVuc2lnbmVkIHNob3J0ICBhY3R1YWxfcGFyYW1ldGVyX3NpemVfYnl0ZXM7CisJdW5zaWduZWQgY2hhcglkYXRhWzFdOworfSBUV19QYXJhbV9BcGFjaGUsICpQVFdfUGFyYW1fQXBhY2hlOworCisvKiBSZXNwb25zZSBxdWV1ZSAqLwordHlwZWRlZiB1bmlvbiBUQUdfVFdfUmVzcG9uc2VfUXVldWUgeworCXUzMiByZXNwb25zZV9pZDsKKwl1MzIgdmFsdWU7Cit9IFRXX1Jlc3BvbnNlX1F1ZXVlOworCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfSW5mbyB7CisJY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgcG9zaXRpb247Cit9IFRXX0luZm87CisKKy8qIENvbXBhdGliaWxpdHkgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfQ29tcGF0aWJpbGl0eV9JbmZvCit7CisJY2hhciBkcml2ZXJfdmVyc2lvblszMl07CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19zcmw7CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19icmFuY2g7CisJdW5zaWduZWQgc2hvcnQgd29ya2luZ19idWlsZDsKKwl1bnNpZ25lZCBzaG9ydCBkcml2ZXJfc3JsX2hpZ2g7CisJdW5zaWduZWQgc2hvcnQgZHJpdmVyX2JyYW5jaF9oaWdoOworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9oaWdoOworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9zcmxfbG93OworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9icmFuY2hfbG93OworCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9sb3c7Cit9IFRXX0NvbXBhdGliaWxpdHlfSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVEFHX1RXX0RldmljZV9FeHRlbnNpb24geworCXUzMiAgICAgICAgICAgICAgICAgICAgIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nCSAgICAgICAJKmdlbmVyaWNfYnVmZmVyX3ZpcnRbVFdfUV9MRU5HVEhdOworCWRtYV9hZGRyX3QJICAgICAgIAlnZW5lcmljX2J1ZmZlcl9waHlzW1RXX1FfTEVOR1RIXTsKKwlUV19Db21tYW5kX0Z1bGwJICAgICAgIAkqY29tbWFuZF9wYWNrZXRfdmlydFtUV19RX0xFTkdUSF07CisJZG1hX2FkZHJfdAkJY29tbWFuZF9wYWNrZXRfcGh5c1tUV19RX0xFTkdUSF07CisJc3RydWN0IHBjaV9kZXYJCSp0d19wY2lfZGV2OworCXN0cnVjdCBzY3NpX2NtbmQJKnNyYltUV19RX0xFTkdUSF07CisJdW5zaWduZWQgY2hhcgkJZnJlZV9xdWV1ZVtUV19RX0xFTkdUSF07CisJdW5zaWduZWQgY2hhcgkJZnJlZV9oZWFkOworCXVuc2lnbmVkIGNoYXIJCWZyZWVfdGFpbDsKKwl1bnNpZ25lZCBjaGFyCQlwZW5kaW5nX3F1ZXVlW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyCQlwZW5kaW5nX2hlYWQ7CisJdW5zaWduZWQgY2hhcgkJcGVuZGluZ190YWlsOworCWludCAgICAgCQlzdGF0ZVtUV19RX0xFTkdUSF07CisJdW5zaWduZWQgaW50CQlwb3N0ZWRfcmVxdWVzdF9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCW1heF9wb3N0ZWRfcmVxdWVzdF9jb3VudDsKKwl1bnNpZ25lZCBpbnQJICAgICAgICBwZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJdW5zaWduZWQgaW50CQltYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3NnbF9lbnRyaWVzOworCXVuc2lnbmVkIGludAkJc2dsX2VudHJpZXM7CisJdW5zaWduZWQgaW50CQludW1fcmVzZXRzOworCXVuc2lnbmVkIGludAkJc2VjdG9yX2NvdW50OworCXVuc2lnbmVkIGludAkJbWF4X3NlY3Rvcl9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCWFlbl9jb3VudDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCWxvbmcJCQlmbGFnczsKKwlpbnQJCQlyZXNldF9wcmludDsKKwlUV19FdmVudCAgICAgICAgICAgICAgICAqZXZlbnRfcXVldWVbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGVycm9yX2luZGV4OworCXVuc2lnbmVkIGNoYXIJCWV2ZW50X3F1ZXVlX3dyYXBwZWQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZXJyb3Jfc2VxdWVuY2VfaWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaW9jdGxfc2VtX2xvY2s7CisJdTMyICAgICAgICAgICAgICAgICAgICAgaW9jdGxfbXNlYzsKKwlpbnQJCQljaHJkZXZfcmVxdWVzdF9pZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlpb2N0bF93cXVldWU7CisJc3RydWN0IHNlbWFwaG9yZQlpb2N0bF9zZW07CisJY2hhcgkJCWFlbl9jbG9iYmVyOworCXVuc2lnbmVkIHNob3J0CQl3b3JraW5nX3NybDsKKwl1bnNpZ25lZCBzaG9ydAkJd29ya2luZ19icmFuY2g7CisJdW5zaWduZWQgc2hvcnQJCXdvcmtpbmdfYnVpbGQ7Cit9IFRXX0RldmljZV9FeHRlbnNpb247CisKKyNwcmFnbWEgcGFjaygpCisKKyNlbmRpZiAvKiBfM1dfOVhYWF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjllY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCkBAIC0wLDAgKzEsMjQ3OCBAQAorLyogCisgICAzdy14eHh4LmMgLS0gM3dhcmUgU3RvcmFnZSBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorCisgICBXcml0dGVuIEJ5OiBBZGFtIFJhZGZvcmQgPGxpbnV4cmFpZEBhbWNjLmNvbT4KKyAgIE1vZGlmaWNhdGlvbnMgQnk6IEpvZWwgSmFjb2Jzb24gPGxpbnV4QDN3YXJlLmNvbT4KKyAgIAkJICAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAgICAgICAgICAgICAgICAgICAgIEJyYWQgU3RyYW5kIDxsaW51eEAzd2FyZS5jb20+CisKKyAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IDN3YXJlIEluYy4KKworICAgS2VybmVsIGNvbXBhdGlibGl0eSBCeTogCUFuZHJlIEhlZHJpY2sgPGFuZHJlQHN1c2UuY29tPgorICAgTm9uLUNvcHlyaWdodCAoQykgMjAwMAlBbmRyZSBIZWRyaWNrIDxhbmRyZUBzdXNlLmNvbT4KKyAgIAorICAgRnVydGhlciB0aW55IGJ1aWxkIGZpeGVzIGFuZCB0cml2aWFsIGhvb3ZlcmluZyAgICBBbGFuIENveAorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgIAorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgCisgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgIAorICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAKKyAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgCisgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgIAorICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAKKyAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgCisgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgIAorICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAKKworICAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZICAgCisgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgICAgICAgIAorICAgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgICAKKyAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAgICAgCisgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFICAgIAorICAgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEICAKKyAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMgICAgICAgICAgICAgCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICAgCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgIAorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKworICAgQnVncy9Db21tZW50cy9TdWdnZXN0aW9ucyBzaG91bGQgYmUgbWFpbGVkIHRvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGxpbnV4cmFpZEBhbWNjLmNvbQorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ290bzoKKyAgIGh0dHA6Ly93d3cuYW1jYy5jb20KKworICAgSGlzdG9yeQorICAgLS0tLS0tLQorICAgMC4xLjAwMCAtICAgICBJbml0aWFsIHJlbGVhc2UuCisgICAwLjQuMDAwIC0gICAgIEFkZGVkIHN1cHBvcnQgZm9yIEFzeW5jaHJvbm91cyBFdmVudCBOb3RpZmljYXRpb24gdGhyb3VnaAorICAgICAgICAgICAgICAgICBpb2N0bHMgZm9yIDNETS4KKyAgIDEuMC4wMDAgLSAgICAgQWRkZWQgRFBPICYgRlVBIGJpdCBzdXBwb3J0IGZvciBXUklURV8xMCAmIFdSSVRFXzYgY2RiCisgICAgICAgICAgICAgICAgIHRvIGRpc2FibGUgZHJpdmUgd3JpdGUtY2FjaGUgYmVmb3JlIHdyaXRlcy4KKyAgIDEuMS4wMDAgLSAgICAgRml4ZWQgcGVyZm9ybWFuY2UgYnVnIHdpdGggRFBPICYgRlVBIG5vdCBleGlzdGluZyBmb3IgV1JJVEVfNi4KKyAgIDEuMi4wMDAgLSAgICAgQWRkZWQgc3VwcG9ydCBmb3IgY2xlYW4gc2h1dGRvd24gbm90aWZpY2F0aW9uL2ZlYXR1cmUgdGFibGUuCisgICAxLjAyLjAwLjAwMSAtIEFkZGVkIHN1cHBvcnQgZm9yIGZ1bGwgY29tbWFuZCBwYWNrZXQgcG9zdHMgdGhyb3VnaCBpb2N0bHMKKyAgICAgICAgICAgICAgICAgZm9yIDNETS4KKyAgICAgICAgICAgICAgICAgQnVnIGZpeCBzbyBob3Qgc3BhcmUgZHJpdmVzIGRvbid0IHNob3cgdXAuCisgICAxLjAyLjAwLjAwMiAtIEZpeCBidWcgd2l0aCB0d19zZXRmZWF0dXJlKCkgY2FsbCB0aGF0IGNhdXNlZCBvb3BzIG9uIHNvbWUKKyAgICAgICAgICAgICAgICAgc3lzdGVtcy4KKyAgIDA4LzIxLzAwICAgIC0gcmVsZWFzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCByZXNvdXJjZXMgb24gZmFpbHVyZSBhdAorICAgICAgICAgICAgICAgICB0d19hbGxvY2F0ZV9tZW1vcnkgKGFjbWUpCisgICAxLjAyLjAwLjAwMyAtIEZpeCB0d19pbnRlcnJ1cHQoKSB0byByZXBvcnQgZXJyb3IgdG8gc2NzaSBsYXllciB3aGVuCisgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgc3RhdHVzIGlzIG5vbi16ZXJvLgorICAgICAgICAgICAgICAgICBBZGRlZCBoYW5kbGluZyBvZiByZXF1ZXN0X3NlbnNlIG9wY29kZS4KKyAgICAgICAgICAgICAgICAgRml4IHBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiAKKyAgICAgICAgICAgICAgICAgdHdfcmVzZXRfZGV2aWNlX2V4dGVuc2lvbigpCisgICAxLjAyLjAwLjAwNCAtIEFkZCBzdXBwb3J0IGZvciBkZXZpY2UgaWQgb2YgM3dhcmUgNzAwMCBzZXJpZXMgY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAgIE1ha2UgdHdfc2V0ZmVhdHVyZSgpIGNhbGwgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICAgICAgICAgICAgICAgICBSZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlciBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cy4KKyAgICAgICAgICAgICAgICAgQ2xlYXIgYXR0ZW50aW9uIGludGVycnVwdCBiZWZvcmUgZHJhaW5pbmcgYWVuIHF1ZXVlLgorICAgMS4wMi4wMC4wMDUgLSBBbGxvY2F0ZSBib3VuY2UgYnVmZmVycyBhbmQgY3VzdG9tIHF1ZXVlIGRlcHRoIGZvciByYWlkNSBmb3IKKyAgICAgICAgICAgICAgICAgNjAwMCBhbmQgNTAwMCBzZXJpZXMgY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAgIFJlZHVjZSBwb2xsaW5nIG1kZWxheXMgY2F1c2luZyBwcm9ibGVtcyBvbiBzb21lIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgIEZpeCB1c2Vfc2cgPSAxIGNhbGN1bGF0aW9uIGJ1Zy4KKyAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIHNjc2lfcmVnaXN0ZXIgcmV0dXJuaW5nIE5VTEwuCisgICAgICAgICAgICAgICAgIEFkZCBhZW4gY291bnQgdG8gL3Byb2Mvc2NzaS8zdy14eHh4LgorICAgICAgICAgICAgICAgICBSZW1vdmUgYWVuIGNvZGUgdW5pdCBtYXNraW5nIGluIHR3X2Flbl9jb21wbGV0ZSgpLgorICAgMS4wMi4wMC4wMDYgLSBSZW1vdmUgdW5pdCBmcm9tIHByaW50ayBpbiB0d19zY3NpX2VoX2Fib3J0KCksIGNhdXNpbmcKKyAgICAgICAgICAgICAgICAgcG9zc2libGUgb29wcy4KKyAgICAgICAgICAgICAgICAgRml4IHBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiB0d19zY3NpX3F1ZXVlKCkKKyAgICAgICAgICAgICAgICAgaWYgZG9uZSBmdW5jdGlvbiBwb2ludGVyIHdhcyBpbnZhbGlkLgorICAgMS4wMi4wMC4wMDcgLSBGaXggcG9zc2libGUgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpbiB0d19pb2N0bCgpLgorICAgICAgICAgICAgICAgICBSZW1vdmUgY2hlY2sgZm9yIGludmFsaWQgZG9uZSBmdW5jdGlvbiBwb2ludGVyIGZyb20KKyAgICAgICAgICAgICAgICAgdHdfc2NzaV9xdWV1ZSgpLgorICAgMS4wMi4wMC4wMDggLSBTZXQgbWF4IHNlY3RvcnMgcGVyIGlvIHRvIFRXX01BWF9TRUNUT1JTIGluIHR3X2ZpbmRjYXJkcygpLgorICAgICAgICAgICAgICAgICBBZGQgdHdfZGVjb2RlX2Vycm9yKCkgZm9yIHByaW50aW5nIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICBQcmludCBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiBjZXJ0YWluIGFlbiBjb2Rlcy4KKyAgICAgICAgICAgICAgICAgQWRkIHR3X2RlY29kZV9iaXRzKCkgZm9yIGludGVycHJldGluZyBzdGF0dXMgcmVnaXN0ZXIgb3V0cHV0LgorICAgICAgICAgICAgICAgICBNYWtlIHNjc2lfc2V0X3BjaV9kZXZpY2UoKSBmb3Iga2VybmVscyA+PSAyLjQuNAorICAgICAgICAgICAgICAgICBGaXggYnVnIHdoZXJlIGFlbidzIGNvdWxkIGJlIGxvc3QgYmVmb3JlIGEgcmVzZXQuCisgICAgICAgICAgICAgICAgIFJlLWFkZCBzcGlubG9ja3MgaW4gdHdfc2NzaV9kZXRlY3QoKS4KKyAgICAgICAgICAgICAgICAgRml4IHBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiB0d19hZW5fZHJhaW5fcXVldWUoKQorICAgICAgICAgICAgICAgICBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgIENsZWFyIHBjaSBwYXJpdHkgZXJyb3JzIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgZHVyaW5nIGlvLgorICAgMS4wMi4wMC4wMDkgLSBSZW1vdmUgcmVkdW5kYW50IGluY3JlbWVudCBpbiB0d19zdGF0ZV9yZXF1ZXN0X3N0YXJ0KCkuCisgICAgICAgICAgICAgICAgIEFkZCBpb2N0bCBzdXBwb3J0IGZvciBkaXJlY3QgQVRBIGNvbW1hbmQgcGFzc3RocnUuCisgICAgICAgICAgICAgICAgIEFkZCBlbnRpcmUgYWVuIGNvZGUgc3RyaW5nIGxpc3QuCisgICAxLjAyLjAwLjAxMCAtIENsZWFudXAgcXVldWVpbmcgY29kZSwgZml4IGpib2QgdGhvdWdocHV0LgorICAgICAgICAgICAgICAgICBGaXggZ2V0X3BhcmFtIGZvciBzcGVjaWZpYyB1bml0cy4KKyAgIDEuMDIuMDAuMDExIC0gRml4IGJ1ZyBpbiB0d19hZW5fY29tcGxldGUoKSB3aGVyZSBhZW4ncyBjb3VsZCBiZSBsb3N0LgorICAgICAgICAgICAgICAgICBGaXggdHdfYWVuX2RyYWluX3F1ZXVlKCkgdG8gZGlzcGxheSB1c2VmdWwgaW5mbyBhdCBpbml0LgorICAgICAgICAgICAgICAgICBTZXQgdHdfaG9zdC0+bWF4X2lkIGZvciAxMiBwb3J0IGNhcmRzLgorICAgICAgICAgICAgICAgICBBZGQgaW9jdGwgc3VwcG9ydCBmb3IgcmF3IGNvbW1hbmQgcGFja2V0IHBvc3QgZnJvbSB1c2Vyc3BhY2UKKyAgICAgICAgICAgICAgICAgd2l0aCBzZ2xpc3QgZnJhZ21lbnRzIChwYXJhbWV0ZXIgYW5kIGlvKS4KKyAgIDEuMDIuMDAuMDEyIC0gRml4IHJlYWQgY2FwYWNpdHkgdG8gdW5kZXIgcmVwb3J0IGJ5IDEgc2VjdG9yIHRvIGZpeCBnZXQKKyAgICAgICAgICAgICAgICAgbGFzdCBzZWN0b3IgaW9jdGwuCisgICAxLjAyLjAwLjAxMyAtIEZpeCBidWcgd2hlcmUgbW9yZSBBRU4gY29kZXMgd2VyZW4ndCBjb21pbmcgb3V0IGR1cmluZworICAgICAgICAgICAgICAgICBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIFBDSSBhYm9ydHMuCisgICAxLjAyLjAwLjAxNCAtIEZpeCBidWcgaW4gdHdfZmluZGNhcmRzKCkgd2hlcmUgQUVOIGNvZGUgY291bGQgYmUgbG9zdC4KKyAgICAgICAgICAgICAgICAgSW5jcmVhc2UgdGltZW91dCBpbiB0d19hZW5fZHJhaW5fcXVldWUoKSB0byAzMCBzZWNvbmRzLgorICAgMS4wMi4wMC4wMTUgLSBSZS13cml0ZSByYXcgY29tbWFuZCBwb3N0IHdpdGggZGF0YSBpb2N0bCBtZXRob2QuCisgICAgICAgICAgICAgICAgIFJlbW92ZSByYWlkNSBib3VuY2UgYnVmZmVycyBmb3IgcmFpZDUgZm9yIDZYWFggZm9yIGtlcm5lbCAyLjUKKyAgICAgICAgICAgICAgICAgQWRkIHR3X21hcC91bm1hcF9zY3NpX3NnL3NpbmdsZV9kYXRhKCkgZm9yIGtlcm5lbCAyLjUKKyAgICAgICAgICAgICAgICAgUmVwbGFjZSBpb19yZXF1ZXN0X2xvY2sgd2l0aCBob3N0X2xvY2sgZm9yIGtlcm5lbCAyLjUKKyAgICAgICAgICAgICAgICAgU2V0IG1heF9jbWRfbGVuIHRvIDE2IGZvciAzZG0gZm9yIGtlcm5lbCAyLjUKKyAgIDEuMDIuMDAuMDE2IC0gU2V0IGhvc3QtPm1heF9zZWN0b3JzIGJhY2sgdXAgdG8gMjU2LgorICAgMS4wMi4wMC4wMTcgLSBNb2RpZmllZCBwY2kgcGFyaXR5IGVycm9yIGhhbmRsaW5nL2NsZWFyaW5nIGZyb20gY29uZmlnIHNwYWNlCisgICAgICAgICAgICAgICAgIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgIDEuMDIuMDAuMDE4IC0gQmV0dGVyIGhhbmRsaW5nIG9mIHJlcXVlc3Qgc2Vuc2Ugb3Bjb2RlIGFuZCBzZW5zZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICBmb3IgZmFpbGVkIGNvbW1hbmRzLiAgQWRkIHR3X2RlY29kZV9zZW5zZSgpLgorICAgICAgICAgICAgICAgICBSZXBsYWNlIGFsbCBtZGVsYXkoKSdzIHdpdGggc2NzaV9zbGVlcCgpLgorICAgMS4wMi4wMC4wMTkgLSBSZXZlcnQgbWRlbGF5J3MgYW5kIHNjc2lfc2xlZXAncywgdGhpcyBjYXVzZWQgcHJvYmxlbXMgb24KKyAgICAgICAgICAgICAgICAgc29tZSBTTVAgc3lzdGVtcy4KKyAgIDEuMDIuMDAuMDIwIC0gQWRkIHBjaV9zZXRfZG1hX21hc2soKSwgcmV3cml0ZSBrbWFsbG9jKCkvdmlydF90b19idXMoKSB0bworICAgICAgICAgICAgICAgICBwY2lfYWxsb2MvZnJlZV9jb25zaXN0ZW50KCkuCisgICAgICAgICAgICAgICAgIEJldHRlciBhbGlnbm1lbnQgY2hlY2tpbmcgaW4gdHdfYWxsb2NhdGVfbWVtb3J5KCkuCisgICAgICAgICAgICAgICAgIENsZWFudXAgdHdfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKCkuCisgICAxLjAyLjAwLjAyMSAtIEJ1bXAgY21kX3Blcl9sdW4gaW4gU0hUIHRvIDI1NSBmb3IgYmV0dGVyIGpib2QgcGVyZm9ybWFuY2UuCisgICAgICAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZXJyb3JzIGluIHR3X2ludGVycnVwdCgpLgorICAgICAgICAgICAgICAgICBBZGQgaGFuZGxpbmcvY2xlYXJpbmcgb2YgY29udHJvbGxlciBxdWV1ZSBlcnJvci4KKyAgICAgICAgICAgICAgICAgRW1wdHkgc3RhbGUgcmVzcG9uc2VzIGJlZm9yZSBkcmFpbmluZyBhZW4gcXVldWUuCisgICAgICAgICAgICAgICAgIEZpeCB0d19zY3NpX2VoX2Fib3J0KCkgdG8gbm90IHJlc2V0IG9uIGV2ZXJ5IGlvIGFib3J0LgorICAgICAgICAgICAgICAgICBTZXQgY2FuX3F1ZXVlIGluIFNIVCB0byAyNTUgdG8gcHJldmVudCBoYW5nIGZyb20gQUVOLgorICAgMS4wMi4wMC4wMjIgLSBGaXggcG9zc2libGUgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIGluIHR3X3Njc2lfcmVsZWFzZSgpLgorICAgMS4wMi4wMC4wMjMgLSBGaXggYnVnIGluIHR3X2Flbl9kcmFpbl9xdWV1ZSgpIHdoZXJlIHVuaXQgIyB3YXMgYWx3YXlzIHplcm8uCisgICAxLjAyLjAwLjAyNCAtIEFkZCBzZXZlcml0eSBsZXZlbHMgdG8gQUVOIHN0cmluZ3MuCisgICAxLjAyLjAwLjAyNSAtIEZpeCBjb21tYW5kIGludGVycnVwdCBzcHVyaW91cyBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICAgRml4IGJ1ZyBpbiByYXcgY29tbWFuZCBwb3N0IHdpdGggZGF0YSBpb2N0bCBtZXRob2QuCisgICAgICAgICAgICAgICAgIEZpeCBidWcgd2hlcmUgcm9sbGNhbGwgc29tZXRpbWVzIGZhaWxlZCB3aXRoIGNhYmxlIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgUHJpbnQgdW5pdCAjIG9uIGFsbCBjb21tYW5kIHRpbWVvdXRzLgorICAgMS4wMi4wMC4wMjYgLSBGaXggcG9zc2libGUgaW5maW5pdGUgcmV0cnkgYnVnIHdpdGggcG93ZXIgZ2xpdGNoIGluZHVjZWQKKyAgICAgICAgICAgICAgICAgZHJpdmUgdGltZW91dHMuCisgICAgICAgICAgICAgICAgIENsZWFudXAgc29tZSBBRU4gc2V2ZXJpdHkgbGV2ZWxzLgorICAgMS4wMi4wMC4wMjcgLSBBZGQgZHJpdmUgbm90IHN1cHBvcnRlZCBBRU4gY29kZSBmb3IgU0FUQSBjb250cm9sbGVycy4KKyAgICAgICAgICAgICAgICAgUmVtb3ZlIHNwdXJpb3VzIHVua25vd24gaW9jdGwgZXJyb3IgbWVzc2FnZS4KKyAgIDEuMDIuMDAuMDI4IC0gRml4IGJ1ZyB3aGVyZSBtdWx0aXBsZSBjb250cm9sbGVycyB3aXRoIG5vIHVuaXRzIHdlcmUgdGhlCisgICAgICAgICAgICAgICAgIHNhbWUgY2FyZCBudW1iZXIuCisgICAgICAgICAgICAgICAgIEZpeCBidWcgd2hlcmUgY2FyZHMgd2VyZSBiZWluZyBzaHV0IGRvd24gbW9yZSB0aGFuIG9uY2UuCisgICAxLjAyLjAwLjAyOSAtIEFkZCBtaXNzaW5nIHBjaV9mcmVlX2NvbnNpc3RlbnQoKSBpbiB0d19hbGxvY2F0ZV9tZW1vcnkoKS4KKyAgICAgICAgICAgICAgICAgUmVwbGFjZSBwY2lfbWFwX3NpbmdsZSgpIHdpdGggcGNpX21hcF9wYWdlKCkgZm9yIGhpZ2htZW0uCisgICAgICAgICAgICAgICAgIENoZWNrIGZvciB0d19zZXRmZWF0dXJlKCkgZmFpbHVyZS4KKyAgIDEuMDIuMDAuMDMwIC0gTWFrZSBkcml2ZXIgNjQtYml0IGNsZWFuLgorICAgMS4wMi4wMC4wMzEgLSBDbGVhbnVwIHBvbGxpbmcgdGltZW91dHMvcm91dGluZXMgaW4gc2V2ZXJhbCBwbGFjZXMuCisgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBtb2RlIHNlbnNlIG9wY29kZS4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGNhY2hlIG1vZGUgcGFnZS4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHN5bmNocm9uaXplIGNhY2hlIG9wY29kZS4KKyAgIDEuMDIuMDAuMDMyIC0gRml4IHNtYWxsIG11bHRpY2FyZCByb2xsY2FsbCBidWcuCisgICAgICAgICAgICAgICAgIE1ha2UgZHJpdmVyIHN0YXkgbG9hZGVkIHdpdGggbm8gdW5pdHMgZm9yIGhvdCBhZGQvc3dhcC4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yICJ0d2UiIGNoYXJhY3RlciBkZXZpY2UgZm9yIGlvY3Rscy4KKyAgICAgICAgICAgICAgICAgQ2xlYW4gdXAgcmVxdWVzdF9pZCBxdWV1ZWluZyBjb2RlLgorICAgICAgICAgICAgICAgICBGaXggdHdfc2NzaV9xdWV1ZSgpIHNwaW5sb2Nrcy4KKyAgIDEuMDIuMDAuMDMzIC0gRml4IHR3X2Flbl9jb21wbGV0ZSgpIHRvIG5vdCBxdWV1ZSAncXVldWUgZW1wdHknIEFFTidzLgorICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHF1ZXVlcyBjb3JyZWN0bHkgd2hlbiBsb2FkaW5nIHdpdGggbm8gdmFsaWQgdW5pdHMuCisgICAxLjAyLjAwLjAzNCAtIEZpeCB0d19kZWNvZGVfYml0cygpIHRvIGhhbmRsZSBtdWx0aXBsZSBlcnJvcnMuCisgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciB1c2VyIGNvbmZpZ3VyYWJsZSBjbWRfcGVyX2x1bi4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHNodC0+c2xhdmVfY29uZmlndXJlKCkuCisgICAxLjAyLjAwLjAzNSAtIEltcHJvdmUgdHdfYWxsb2NhdGVfbWVtb3J5KCkgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgIEZpeCB0d19jaHJkZXZfaW9jdGwoKSB0byBzbGVlcCBjb3JyZWN0bHkuCisgICAxLjAyLjAwLjAzNiAtIEluY3JlYXNlIGNoYXJhY3RlciBpb2N0bCB0aW1lb3V0IHRvIDYwIHNlY29uZHMuCisgICAxLjAyLjAwLjAzNyAtIEZpeCB0d19pb2N0bCgpIHRvIGhhbmRsZSBhbGwgbm9uLWRhdGEgQVRBIHBhc3N0aHJ1IGNtZHMKKyAgICAgICAgICAgICAgICAgZm9yICdzbWFydG1vbnRvb2xzJyBzdXBwb3J0LgorICAgMS4yNi4wMC4wMzggLSBSb2xsIGRyaXZlciBtaW5vciB2ZXJzaW9uIHRvIDI2IHRvIGRlbm90ZSBrZXJuZWwgMi42LgorICAgICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgY21kc19wZXJfbHVuIG1vZHVsZSBwYXJhbWV0ZXIuCisgICAxLjI2LjAwLjAzOSAtIEZpeCBidWcgaW4gdHdfY2hyZGV2X2lvY3RsKCkgcG9sbGluZyBjb2RlLgorICAgICAgICAgICAgICAgICBGaXggZGF0YV9idWZmZXJfbGVuZ3RoIHVzYWdlIGluIHR3X2NocmRldl9pb2N0bCgpLgorICAgICAgICAgICAgICAgICBVcGRhdGUgY29udGFjdCBpbmZvcm1hdGlvbi4KKyAgIDEuMjYuMDIuMDAwIC0gQ29udmVydCBkcml2ZXIgdG8gcGNpX2RyaXZlciBmb3JtYXQuCisgICAxLjI2LjAyLjAwMSAtIEluY3JlYXNlIG1heCBpb2N0bCBidWZmZXIgc2l6ZSB0byA1MTIgc2VjdG9ycy4KKyAgICAgICAgICAgICAgICAgTWFrZSB0d19zY3NpX3F1ZXVlKCkgcmV0dXJuIDAgZm9yICdVbmtub3duIHNjc2kgb3Bjb2RlJy4KKyAgICAgICAgICAgICAgICAgRml4IHR3X3JlbW92ZSgpIHRvIGZyZWUgaXJxIGhhbmRsZXIvdW5yZWdpc3Rlcl9jaHJkZXYoKQorICAgICAgICAgICAgICAgICBiZWZvcmUgc2h1dHRpbmcgZG93biBjYXJkLgorICAgICAgICAgICAgICAgICBDaGFuZ2UgdG8gbmV3ICdjaGFuZ2VfcXVldWVfZGVwdGgnIGFwaS4KKyAgICAgICAgICAgICAgICAgRml4ICdoYW5kbGVkPTEnIElTUiB1c2FnZSwgcmVtb3ZlIGJvZ3VzIElSUSBjaGVjay4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSAiM3cteHh4eC5oIgorCisvKiBHbG9iYWxzICovCisjZGVmaW5lIFRXX0RSSVZFUl9WRVJTSU9OICIxLjI2LjAyLjAwMSIKK3N0YXRpYyBUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbVFdfTUFYX1NMT1RdOworc3RhdGljIGludCB0d19kZXZpY2VfZXh0ZW5zaW9uX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHdlX21ham9yID0gLTE7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitNT0RVTEVfQVVUSE9SKCJBTUNDIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjN3YXJlIFN0b3JhZ2UgQ29udHJvbGxlciBMaW51eCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFRXX0RSSVZFUl9WRVJTSU9OKTsKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCB0d19yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IGlvY3RsX3Jlc2V0KTsKKworLyogRnVuY3Rpb25zICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayB0aGUgc3RhdHVzIHJlZ2lzdGVyIGZvciB1bmV4cGVjdGVkIGJpdHMgKi8KK3N0YXRpYyBpbnQgdHdfY2hlY2tfYml0cyh1MzIgc3RhdHVzX3JlZ192YWx1ZSkKK3sKKwlpZiAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfRVhQRUNURURfQklUUykgIT0gVFdfU1RBVFVTX0VYUEVDVEVEX0JJVFMpIHsgIAorCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hlY2tfYml0cygpOiBObyBleHBlY3RlZCBiaXRzICgweCV4KS5cbiIsIHN0YXR1c19yZWdfdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1VORVhQRUNURURfQklUUykgIT0gMCkgeworCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hlY2tfYml0cygpOiBGb3VuZCB1bmV4cGVjdGVkIGJpdHMgKDB4JXgpLlxuIiwgc3RhdHVzX3JlZ192YWx1ZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfY2hlY2tfYml0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcmludCByZWFkYWJsZSBtZXNzYWdlcyBmcm9tIHN0YXR1cyByZWdpc3RlciBlcnJvcnMgKi8KK3N0YXRpYyBpbnQgdHdfZGVjb2RlX2JpdHMoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCB1MzIgc3RhdHVzX3JlZ192YWx1ZSwgaW50IHByaW50X2hvc3QpCit7CisJY2hhciBob3N0WzE2XTsKKworCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19kZWNvZGVfYml0cygpXG4iKTsKKworCWlmIChwcmludF9ob3N0KQorCQlzcHJpbnRmKGhvc3QsICIgc2NzaSVkOiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJZWxzZQorCQlob3N0WzBdID0gJ1wwJzsKKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1BDSV9QQVJJVFlfRVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDolcyBQQ0kgUGFyaXR5IEVycm9yOiBjbGVhcmluZy5cbiIsIGhvc3QpOworCQlvdXRsKFRXX0NPTlRST0xfQ0xFQVJfUEFSSVRZX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1BDSV9BQk9SVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiVzIFBDSSBBYm9ydDogY2xlYXJpbmcuXG4iLCBob3N0KTsKKwkJb3V0bChUV19DT05UUk9MX0NMRUFSX1BDSV9BQk9SVCwgVFdfQ09OVFJPTF9SRUdfQUREUih0d19kZXYpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHR3X2Rldi0+dHdfcGNpX2RldiwgUENJX1NUQVRVUywgVFdfUENJX0NMRUFSX1BDSV9BQk9SVCk7CisJfQorCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfUVVFVUVfRVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDolcyBDb250cm9sbGVyIFF1ZXVlIEVycm9yOiBjbGVhcmluZy5cbiIsIGhvc3QpOworCQlvdXRsKFRXX0NPTlRST0xfQ0xFQVJfUVVFVUVfRVJST1IsIFRXX0NPTlRST0xfUkVHX0FERFIodHdfZGV2KSk7CisJfQorCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfU0JVRl9XUklURV9FUlJPUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiVzIFNCVUYgV3JpdGUgRXJyb3I6IGNsZWFyaW5nLlxuIiwgaG9zdCk7CisJCW91dGwoVFdfQ09OVFJPTF9DTEVBUl9TQlVGX1dSSVRFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOworCX0KKworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9FUlJPUikgeworCQlpZiAodHdfZGV2LT5yZXNldF9wcmludCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiVzIE1pY3JvY29udHJvbGxlciBFcnJvcjogY2xlYXJpbmcuXG4iLCBob3N0KTsKKwkJCXR3X2Rldi0+cmVzZXRfcHJpbnQgPSAxOworCQl9CisJCXJldHVybiAxOworCX0KKwkKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X2RlY29kZV9iaXRzKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciBmb3IgYSBmbGFnICovCitzdGF0aWMgaW50IHR3X3BvbGxfc3RhdHVzKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgdTMyIGZsYWcsIGludCBzZWNvbmRzKQoreworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgYmVmb3JlOworCWludCByZXR2YWwgPSAxOworCisJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJYmVmb3JlID0gamlmZmllczsKKworCWlmICh0d19jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKQorCQl0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDApOworCisJd2hpbGUgKChzdGF0dXNfcmVnX3ZhbHVlICYgZmxhZykgIT0gZmxhZykgeworCQlzdGF0dXNfcmVnX3ZhbHVlID0gaW5sKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCQlpZiAodHdfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJCXR3X2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSwgMCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYmVmb3JlICsgSFogKiBzZWNvbmRzKSkKKwkJCWdvdG8gb3V0OworCisJCW1zbGVlcCg1MCk7CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3X3BvbGxfc3RhdHVzKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciBmb3IgZGlzYXBwZWFyYW5jZSBvZiBhIGZsYWcgKi8KK3N0YXRpYyBpbnQgdHdfcG9sbF9zdGF0dXNfZ29uZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIHUzMiBmbGFnLCBpbnQgc2Vjb25kcykKK3sKKwl1MzIgc3RhdHVzX3JlZ192YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKwlpbnQgcmV0dmFsID0gMTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCWJlZm9yZSA9IGppZmZpZXM7CisKKwlpZiAodHdfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAwKTsKKworCXdoaWxlICgoc3RhdHVzX3JlZ192YWx1ZSAmIGZsYWcpICE9IDApIHsKKwkJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisKKwkJaWYgKHR3X2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpCisJCQl0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDApOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogc2Vjb25kcykpCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNTApOworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d19wb2xsX3N0YXR1c19nb25lKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gcG9zdCBhIGNvbW1hbmQgcGFja2V0IHRvIHRoZSBib2FyZCAqLworc3RhdGljIGludCB0d19wb3N0X2NvbW1hbmRfcGFja2V0KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdTMyIHN0YXR1c19yZWdfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX3F1ZV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Bvc3RfY29tbWFuZF9wYWNrZXQoKVxuIik7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisKKwlpZiAodHdfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkgeworCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfcG9zdF9jb21tYW5kX3BhY2tldCgpOiBVbmV4cGVjdGVkIGJpdHMuXG4iKTsKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAxKTsKKwl9CisKKwlpZiAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9GVUxMKSA9PSAwKSB7CisJCS8qIFdlIHN1Y2Nlc3NmdWxseSBwb3N0ZWQgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJCW91dGwoY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BPU1RFRDsKKwkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCsrOworCQlpZiAodHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCA+IHR3X2Rldi0+bWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50KSB7CisJCQl0d19kZXYtPm1heF9wb3N0ZWRfcmVxdWVzdF9jb3VudCA9IHR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDb3VsZG4ndCBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCwgc28gd2UgZG8gaXQgaW4gdGhlIGlzciAqLworCQlpZiAodHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSAhPSBUV19TX1BFTkRJTkcpIHsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BFTkRJTkc7CisJCQl0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCsrOworCQkJaWYgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID4gdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50KSB7CisJCQkJdHdfZGV2LT5tYXhfcGVuZGluZ19yZXF1ZXN0X2NvdW50ID0gdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJCQl9CisJCQl0d19kZXYtPnBlbmRpbmdfcXVldWVbdHdfZGV2LT5wZW5kaW5nX3RhaWxdID0gcmVxdWVzdF9pZDsKKwkJCWlmICh0d19kZXYtPnBlbmRpbmdfdGFpbCA9PSBUV19RX0xFTkdUSC0xKSB7CisJCQkJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOworCQkJfSBlbHNlIHsKKwkJCQl0d19kZXYtPnBlbmRpbmdfdGFpbCA9IHR3X2Rldi0+cGVuZGluZ190YWlsICsgMTsKKwkJCX0KKwkJfSAKKwkJVFdfVU5NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHR3X2Rldik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Bvc3RfY29tbWFuZF9wYWNrZXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHZhbGlkIHNlbnNlIGJ1ZmZlciBpbmZvcm1hdGlvbiBmb3IgZmFpbGVkIGNtZHMgKi8KK3N0YXRpYyBpbnQgdHdfZGVjb2RlX3NlbnNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQsIGludCBmaWxsX3NlbnNlKQoreworCWludCBpOworCVRXX0NvbW1hbmQgKmNvbW1hbmQ7CisKKyAgICAgICAgZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2RlY29kZV9zZW5zZSgpXG4iKTsKKwljb21tYW5kID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHNjc2klZDogQ29tbWFuZCBmYWlsZWQ6IHN0YXR1cyA9IDB4JXgsIGZsYWdzID0gMHgleCwgdW5pdCAjJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIGNvbW1hbmQtPnN0YXR1cywgY29tbWFuZC0+ZmxhZ3MsIFRXX1VOSVRfT1VUKGNvbW1hbmQtPnVuaXRfX2hvc3RpZCkpOworCisJLyogQXR0ZW1wdCB0byByZXR1cm4gaW50ZWxsaWdlbnQgc2Vuc2UgaW5mb3JtYXRpb24gKi8KKwlpZiAoZmlsbF9zZW5zZSkgeworCQlpZiAoKGNvbW1hbmQtPnN0YXR1cyA9PSAweGM3KSB8fCAoY29tbWFuZC0+c3RhdHVzID09IDB4Y2IpKSB7CisJCQlmb3IgKGk9MDtpPChzaXplb2YodHdfc2Vuc2VfdGFibGUpL3NpemVvZih0d19zZW5zZV90YWJsZVswXSkpO2krKykgeworCQkJCWlmIChjb21tYW5kLT5mbGFncyA9PSB0d19zZW5zZV90YWJsZVtpXVswXSkgeworCisJCQkJCS8qIFZhbGlkIGJpdCBhbmQgJ2N1cnJlbnQgZXJyb3JzJyAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2Vuc2VfYnVmZmVyWzBdID0gKDB4MSA8PCA3IHwgMHg3MCk7CisKKwkJCQkJLyogU2Vuc2Uga2V5ICovCisJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zZW5zZV9idWZmZXJbMl0gPSB0d19zZW5zZV90YWJsZVtpXVsxXTsKKworCQkJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2Vuc2VfYnVmZmVyWzddID0gMHhhOyAvKiAxMCBieXRlcyAqLworCisJCQkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgY29kZSAqLworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2Vuc2VfYnVmZmVyWzEyXSA9IHR3X3NlbnNlX3RhYmxlW2ldWzJdOworCisJCQkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgY29kZSBxdWFsaWZpZXIgKi8KKwkJCQkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnNlbnNlX2J1ZmZlclsxM10gPSB0d19zZW5zZV90YWJsZVtpXVszXTsKKworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworCQkJCQlyZXR1cm4gVFdfSVNSX0RPTlRfUkVTVUxUOyAvKiBTcGVjaWFsIGNhc2UgZm9yIGlzciB0byBub3Qgb3Zlci13cml0ZSByZXN1bHQgKi8KKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBJZiBubyB0YWJsZSBtYXRjaCwgZXJyb3Igc28gd2UgZ2V0IGEgcmVzZXQgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19kZWNvZGVfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVwb3J0IGNvbnRyb2xsZXIgZXJyb3Igc3RhdHVzICovCitzdGF0aWMgaW50IHR3X2NoZWNrX2Vycm9ycyhUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpIAoreworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlOworICAKKwlzdGF0dXNfcmVnX3ZhbHVlID0gaW5sKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCWlmIChUV19TVEFUVVNfRVJST1JTKHN0YXR1c19yZWdfdmFsdWUpIHx8IHR3X2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpIHsKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19jaGVja19lcnJvcnMoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW1wdHkgdGhlIHJlc3BvbnNlIHF1ZSAqLworc3RhdGljIHZvaWQgdHdfZW1wdHlfcmVzcG9uc2VfcXVlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldikgCit7CisJdTMyIHN0YXR1c19yZWdfdmFsdWUsIHJlc3BvbnNlX3F1ZV92YWx1ZTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCisJd2hpbGUgKChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1JFU1BPTlNFX1FVRVVFX0VNUFRZKSA9PSAwKSB7CisJCXJlc3BvbnNlX3F1ZV92YWx1ZSA9IGlubChUV19SRVNQT05TRV9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKwkJc3RhdHVzX3JlZ192YWx1ZSA9IGlubChUV19TVEFUVVNfUkVHX0FERFIodHdfZGV2KSk7CisJfQorfSAvKiBFbmQgdHdfZW1wdHlfcmVzcG9uc2VfcXVlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYSByZXF1ZXN0X2lkICovCitzdGF0aWMgdm9pZCB0d19zdGF0ZV9yZXF1ZXN0X2ZpbmlzaChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCXR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfdGFpbF0gPSByZXF1ZXN0X2lkOworCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0ZJTklTSEVEOworCXR3X2Rldi0+ZnJlZV90YWlsID0gKHR3X2Rldi0+ZnJlZV90YWlsICsgMSkgJSBUV19RX0xFTkdUSDsKK30gLyogRW5kIHR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFzc2lnbiBhbiBhdmFpbGFibGUgcmVxdWVzdF9pZCAqLworc3RhdGljIHZvaWQgdHdfc3RhdGVfcmVxdWVzdF9zdGFydChUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCAqcmVxdWVzdF9pZCkKK3sKKwkqcmVxdWVzdF9pZCA9IHR3X2Rldi0+ZnJlZV9xdWV1ZVt0d19kZXYtPmZyZWVfaGVhZF07CisJdHdfZGV2LT5mcmVlX2hlYWQgPSAodHdfZGV2LT5mcmVlX2hlYWQgKyAxKSAlIFRXX1FfTEVOR1RIOworCXR3X2Rldi0+c3RhdGVbKnJlcXVlc3RfaWRdID0gVFdfU19TVEFSVEVEOworfSAvKiBFbmQgdHdfc3RhdGVfcmVxdWVzdF9zdGFydCgpICovCisKKy8qIFNob3cgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjYXJkICovCitzdGF0aWMgc3NpemVfdCB0d19zaG93X3N0YXRzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3NpemVfdCBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiM3cteHh4eCBEcml2ZXIgdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICJDdXJyZW50IGNvbW1hbmRzIHBvc3RlZDogICAlNGRcbiIKKwkJICAgICAgICJNYXggY29tbWFuZHMgcG9zdGVkOiAgICAgICAlNGRcbiIKKwkJICAgICAgICJDdXJyZW50IHBlbmRpbmcgY29tbWFuZHM6ICAlNGRcbiIKKwkJICAgICAgICJNYXggcGVuZGluZyBjb21tYW5kczogICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNnbCBsZW5ndGg6ICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2dsIGxlbmd0aDogICAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJMYXN0IHNlY3RvciBjb3VudDogICAgICAgICAlNGRcbiIKKwkJICAgICAgICJNYXggc2VjdG9yIGNvdW50OiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJTQ1NJIEhvc3QgUmVzZXRzOiAgICAgICAgICAlNGRcbiIKKwkJICAgICAgICJBRU4nczogICAgICAgICAgICAgICAgICAgICAlNGRcbiIsIAorCQkgICAgICAgVFdfRFJJVkVSX1ZFUlNJT04sCisJCSAgICAgICB0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfcG9zdGVkX3JlcXVlc3RfY291bnQsCisJCSAgICAgICB0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+bWF4X3BlbmRpbmdfcmVxdWVzdF9jb3VudCwKKwkJICAgICAgIHR3X2Rldi0+c2dsX2VudHJpZXMsCisJCSAgICAgICB0d19kZXYtPm1heF9zZ2xfZW50cmllcywKKwkJICAgICAgIHR3X2Rldi0+c2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50LAorCQkgICAgICAgdHdfZGV2LT5udW1fcmVzZXRzLAorCQkgICAgICAgdHdfZGV2LT5hZW5fY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbGVuOworfSAvKiBFbmQgdHdfc2hvd19zdGF0cygpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgYSBkZXZpY2VzIHF1ZXVlIGRlcHRoICovCitzdGF0aWMgaW50IHR3X2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCkKK3sKKwlpZiAocXVldWVfZGVwdGggPiBUV19RX0xFTkdUSC0yKQorCQlxdWV1ZV9kZXB0aCA9IFRXX1FfTEVOR1RILTI7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX09SREVSRURfVEFHLCBxdWV1ZV9kZXB0aCk7CisJcmV0dXJuIHF1ZXVlX2RlcHRoOworfSAvKiBFbmQgdHdfY2hhbmdlX3F1ZXVlX2RlcHRoKCkgKi8KKworLyogQ3JlYXRlIHN5c2ZzICdzdGF0cycgZW50cnkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSB0d19ob3N0X3N0YXRzX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gCSJzdGF0cyIsCisJCS5tb2RlID0JCVNfSVJVR08sCisJfSwKKwkuc2hvdyA9IHR3X3Nob3dfc3RhdHMKK307CisKKy8qIEhvc3QgYXR0cmlidXRlcyBpbml0aWFsaXplciAqLworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICp0d19ob3N0X2F0dHJzW10gPSB7CisJJnR3X2hvc3Rfc3RhdHNfYXR0ciwKKwlOVUxMLAorfTsKKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIGFlbiBxdWV1ZSBmcm9tIHRoZSBpc3IgKi8KK3N0YXRpYyBpbnQgdHdfYWVuX3JlYWRfcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkgCit7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJVFdfUGFyYW0gKnBhcmFtOworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdTMyIHN0YXR1c19yZWdfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZSA9IDA7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpXG4iKTsKKworCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCWlmICh0d19jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBVbmV4cGVjdGVkIGJpdHMuXG4iKTsKKwkJdHdfZGVjb2RlX2JpdHModHdfZGV2LCBzdGF0dXNfcmVnX3ZhbHVlLCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9yZWFkX3F1ZXVlKCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigyLCBUV19PUF9HRVRfUEFSQU0pOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gNDsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPnN0YXR1cyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmZsYWdzID0gMDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTYucGFyYW1ldGVyX2NvdW50ID0gMTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogTm93IHNldHVwIHRoZSBwYXJhbSAqLworCWlmICh0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJcGFyYW0tPnRhYmxlX2lkID0gMHg0MDE7IC8qIEFFTiB0YWJsZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSAyOyAvKiBVbml0IGNvZGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX3NpemVfYnl0ZXMgPSAyOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IHBhcmFtX3ZhbHVlOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0ubGVuZ3RoID0gc2l6ZW9mKFRXX1NlY3Rvcik7CisKKwkvKiBOb3cgcG9zdCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwlpZiAoKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9GVUxMKSA9PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fcmVhZF9xdWV1ZSgpOiBQb3N0IHN1Y2NlZWRlZC5cbiIpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7IC8qIEZsYWcgaW50ZXJuYWwgY29tbWFuZCAqLworCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19QT1NURUQ7CisJCW91dGwoY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX3JlYWRfcXVldWUoKTogUG9zdCBmYWlsZWQsIHdpbGwgcmV0cnkuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19hZW5fcmVhZF9xdWV1ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjb21wbGV0ZSBhbiBhZW4gcmVxdWVzdCBmcm9tIHRoZSBpc3IgKi8KK3N0YXRpYyBpbnQgdHdfYWVuX2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpIAoreworCVRXX1BhcmFtICpwYXJhbTsKKwl1bnNpZ25lZCBzaG9ydCBhZW47CisJaW50IGVycm9yID0gMCwgdGFibGVfbWF4ID0gMDsKKworCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fY29tcGxldGUoKVxuIik7CisJaWYgKHR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9jb21wbGV0ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJYWVuID0gKih1bnNpZ25lZCBzaG9ydCAqKShwYXJhbS0+ZGF0YSk7CisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfYWVuX2NvbXBsZXRlKCk6IFF1ZXVlJ2QgY29kZSAweCV4XG4iLCBhZW4pOworCisJLyogUHJpbnQgc29tZSB1c2VmdWwgaW5mbyB3aGVuIGNlcnRhaW4gYWVuIGNvZGVzIGNvbWUgb3V0ICovCisJaWYgKGFlbiA9PSAweDBmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IEFFTjogSU5GTzogQUVOIHF1ZXVlIG92ZXJmbG93LlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwl9IGVsc2UgeworCQl0YWJsZV9tYXggPSBzaXplb2YodHdfYWVuX3N0cmluZykvc2l6ZW9mKGNoYXIgKik7CisJCWlmICgoYWVuICYgMHgwZmYpIDwgdGFibGVfbWF4KSB7CisJCQlpZiAoKHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl1bc3RybGVuKHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl0pLTFdKSA9PSAnIycpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IEFFTjogJXMlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgdHdfYWVuX3N0cmluZ1thZW4gJiAweGZmXSwgYWVuID4+IDgpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYWVuICE9IDB4MCkgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHNjc2klZDogQUVOOiAlcy5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgdHdfYWVuX3N0cmluZ1thZW4gJiAweGZmXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IFJlY2VpdmVkIEFFTiAlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgYWVuKTsKKwkJfQorCX0KKwlpZiAoYWVuICE9IFRXX0FFTl9RVUVVRV9FTVBUWSkgeworCQl0d19kZXYtPmFlbl9jb3VudCsrOworCisJCS8qIE5vdyBxdWV1ZSB0aGUgY29kZSAqLworCQl0d19kZXYtPmFlbl9xdWV1ZVt0d19kZXYtPmFlbl90YWlsXSA9IGFlbjsKKwkJaWYgKHR3X2Rldi0+YWVuX3RhaWwgPT0gVFdfUV9MRU5HVEggLSAxKSB7CisJCQl0d19kZXYtPmFlbl90YWlsID0gVFdfUV9TVEFSVDsKKwkJfSBlbHNlIHsKKwkJCXR3X2Rldi0+YWVuX3RhaWwgPSB0d19kZXYtPmFlbl90YWlsICsgMTsKKwkJfQorCQlpZiAodHdfZGV2LT5hZW5faGVhZCA9PSB0d19kZXYtPmFlbl90YWlsKSB7CisJCQlpZiAodHdfZGV2LT5hZW5faGVhZCA9PSBUV19RX0xFTkdUSCAtIDEpIHsKKwkJCQl0d19kZXYtPmFlbl9oZWFkID0gVFdfUV9TVEFSVDsKKwkJCX0gZWxzZSB7CisJCQkJdHdfZGV2LT5hZW5faGVhZCA9IHR3X2Rldi0+YWVuX2hlYWQgKyAxOworCQkJfQorCQl9CisKKwkJZXJyb3IgPSB0d19hZW5fcmVhZF9xdWV1ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHNjc2klZDogRXJyb3IgY29tcGxldGluZyBBRU4uXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQkJdHdfZGV2LT5zdGF0ZVtyZXF1ZXN0X2lkXSA9IFRXX1NfQ09NUExFVEVEOworCQkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJfQorCX0gZWxzZSB7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X2Flbl9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBkcmFpbiB0aGUgYWVuIHF1ZXVlIGFmdGVyIGEgc29mdCByZXNldCAqLworc3RhdGljIGludCB0d19hZW5fZHJhaW5fcXVldWUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCVRXX1BhcmFtICpwYXJhbTsKKwlpbnQgcmVxdWVzdF9pZCA9IDA7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX3F1ZV92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHBhcmFtX3ZhbHVlOworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZXVlOworCXVuc2lnbmVkIHNob3J0IGFlbjsKKwl1bnNpZ25lZCBzaG9ydCBhZW5fY29kZTsKKwlpbnQgZmluaXNoZWQgPSAwOworCWludCBmaXJzdF9yZXNldCA9IDA7CisJaW50IHF1ZXVlID0gMDsKKwlpbnQgZm91bmQgPSAwLCB0YWJsZV9tYXggPSAwOworCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKClcbiIpOworCisJaWYgKHR3X3BvbGxfc3RhdHVzKHR3X2RldiwgVFdfU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQgfCBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX1JFQURZLCAzMCkpIHsKKwkJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9kcmFpbl9xdWV1ZSgpOiBObyBhdHRlbnRpb24gaW50ZXJydXB0IGZvciBjYXJkICVkLlxuIiwgdHdfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCk7CisJCXJldHVybiAxOworCX0KKwlUV19DTEVBUl9BVFRFTlRJT05fSU5URVJSVVBUKHR3X2Rldik7CisKKwkvKiBFbXB0eSByZXNwb25zZSBxdWV1ZSAqLworCXR3X2VtcHR5X3Jlc3BvbnNlX3F1ZSh0d19kZXYpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWlmICh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9kcmFpbl9xdWV1ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwljb21tYW5kX3BhY2tldCA9IChUV19Db21tYW5kICopdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJbWVtc2V0KGNvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDQ7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKGNvbW1hbmRfcXVlX3ZhbHVlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKCk6IEJhZCBjb21tYW5kIHBhY2tldCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIE5vdyBzZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKCk6IEJhZCBhbGlnbm1lbnQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQocGFyYW0sIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwlwYXJhbS0+dGFibGVfaWQgPSAweDQwMTsgLyogQUVOIHRhYmxlICovCisJcGFyYW0tPnBhcmFtZXRlcl9pZCA9IDI7IC8qIFVuaXQgY29kZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfc2l6ZV9ieXRlcyA9IDI7CisJcGFyYW1fdmFsdWUgPSB0d19kZXYtPmFsaWdubWVudF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2Flbl9kcmFpbl9xdWV1ZSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IHBhcmFtX3ZhbHVlOworCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5wYXJhbS5zZ2xbMF0ubGVuZ3RoID0gc2l6ZW9mKFRXX1NlY3Rvcik7CisKKwkvKiBOb3cgZHJhaW4gdGhlIGNvbnRyb2xsZXIncyBhZW4gcXVldWUgKi8KKwlkbyB7CisJCS8qIFBvc3QgY29tbWFuZCBwYWNrZXQgKi8KKwkJb3V0bChjb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKworCQkvKiBOb3cgcG9sbCBmb3IgY29tcGxldGlvbiAqLworCQlpZiAodHdfcG9sbF9zdGF0dXNfZ29uZSh0d19kZXYsIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWSwgMzApID09IDApIHsKKwkJCXJlc3BvbnNlX3F1ZXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJcmVxdWVzdF9pZCA9IFRXX1JFU0lEX09VVChyZXNwb25zZV9xdWV1ZS5yZXNwb25zZV9pZCk7CisKKwkJCWlmIChyZXF1ZXN0X2lkICE9IDApIHsKKwkJCQkvKiBVbmV4cGVjdGVkIHJlcXVlc3QgaWQgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hZW5fZHJhaW5fcXVldWUoKTogVW5leHBlY3RlZCByZXF1ZXN0IGlkLlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQkKKwkJCWlmIChjb21tYW5kX3BhY2tldC0+c3RhdHVzICE9IDApIHsKKwkJCQlpZiAoY29tbWFuZF9wYWNrZXQtPmZsYWdzICE9IFRXX0FFTl9UQUJMRV9VTkRFRklORUQpIHsKKwkJCQkJLyogQmFkIHJlc3BvbnNlICovCisJCQkJCXR3X2RlY29kZV9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDApOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBXZSBrbm93IHRoaXMgaXMgYSAzdy0xeDAwLCBhbmQgZG9lc24ndCBzdXBwb3J0IGFlbidzICovCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKworCQkJLyogTm93IGNoZWNrIHRoZSBhZW4gKi8KKwkJCWFlbiA9ICoodW5zaWduZWQgc2hvcnQgKikocGFyYW0tPmRhdGEpOworCQkJYWVuX2NvZGUgPSAoYWVuICYgMHgwZmYpOworCQkJcXVldWUgPSAwOworCQkJc3dpdGNoIChhZW5fY29kZSkgeworCQkJCWNhc2UgVFdfQUVOX1FVRVVFX0VNUFRZOgorCQkJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogQUVOOiAlcy5cbiIsIHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl0pOworCQkJCQlpZiAoZmlyc3RfcmVzZXQgIT0gMSkgeworCQkJCQkJcmV0dXJuIDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmaW5pc2hlZCA9IDE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUV19BRU5fU09GVF9SRVNFVDoKKwkJCQkJaWYgKGZpcnN0X3Jlc2V0ID09IDApIHsKKwkJCQkJCWZpcnN0X3Jlc2V0ID0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEFFTjogJXMuXG4iLCB0d19hZW5fc3RyaW5nW2FlbiAmIDB4ZmZdKTsKKwkJCQkJCXR3X2Rldi0+YWVuX2NvdW50Kys7CisJCQkJCQlxdWV1ZSA9IDE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKGFlbiA9PSAweDBmZikgeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogQUVOOiBJTkZPOiBBRU4gcXVldWUgb3ZlcmZsb3cuXG4iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRhYmxlX21heCA9IHNpemVvZih0d19hZW5fc3RyaW5nKS9zaXplb2YoY2hhciAqKTsKKwkJCQkJCWlmICgoYWVuICYgMHgwZmYpIDwgdGFibGVfbWF4KSB7CisJCQkJCQkJaWYgKCh0d19hZW5fc3RyaW5nW2FlbiAmIDB4ZmZdW3N0cmxlbih0d19hZW5fc3RyaW5nW2FlbiAmIDB4ZmZdKS0xXSkgPT0gJyMnKSB7CisJCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEFFTjogJXMlZC5cbiIsIHR3X2Flbl9zdHJpbmdbYWVuICYgMHhmZl0sIGFlbiA+PiA4KTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBBRU46ICVzLlxuIiwgdHdfYWVuX3N0cmluZ1thZW4gJiAweGZmXSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlCisJCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogUmVjZWl2ZWQgQUVOICVkLlxuIiwgYWVuKTsKKwkJCQkJfQorCQkJCQl0d19kZXYtPmFlbl9jb3VudCsrOworCQkJCQlxdWV1ZSA9IDE7CisJCQl9CisKKwkJCS8qIE5vdyBwdXQgdGhlIGFlbiBvbiB0aGUgYWVuX3F1ZXVlICovCisJCQlpZiAocXVldWUgPT0gMSkgeworCQkJCXR3X2Rldi0+YWVuX3F1ZXVlW3R3X2Rldi0+YWVuX3RhaWxdID0gYWVuOworCQkJCWlmICh0d19kZXYtPmFlbl90YWlsID09IFRXX1FfTEVOR1RIIC0gMSkgeworCQkJCQl0d19kZXYtPmFlbl90YWlsID0gVFdfUV9TVEFSVDsKKwkJCQl9IGVsc2UgeworCQkJCQl0d19kZXYtPmFlbl90YWlsID0gdHdfZGV2LT5hZW5fdGFpbCArIDE7CisJCQkJfQorCQkJCWlmICh0d19kZXYtPmFlbl9oZWFkID09IHR3X2Rldi0+YWVuX3RhaWwpIHsKKwkJCQkJaWYgKHR3X2Rldi0+YWVuX2hlYWQgPT0gVFdfUV9MRU5HVEggLSAxKSB7CisJCQkJCQl0d19kZXYtPmFlbl9oZWFkID0gVFdfUV9TVEFSVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXR3X2Rldi0+YWVuX2hlYWQgPSB0d19kZXYtPmFlbl9oZWFkICsgMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZvdW5kID0gMTsKKwkJfQorCQlpZiAoZm91bmQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfYWVuX2RyYWluX3F1ZXVlKCk6IFJlc3BvbnNlIG5ldmVyIHJlY2VpdmVkLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gd2hpbGUgKGZpbmlzaGVkID09IDApOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19hZW5fZHJhaW5fcXVldWUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5ICovCitzdGF0aWMgaW50IHR3X2FsbG9jYXRlX21lbW9yeShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBzaXplLCBpbnQgd2hpY2gpCit7CisJaW50IGk7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgKmNwdV9hZGRyID0gTlVMTDsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2FsbG9jYXRlX21lbW9yeSgpXG4iKTsKKworCWNwdV9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHdfZGV2LT50d19wY2lfZGV2LCBzaXplKlRXX1FfTEVOR1RILCAmZG1hX2hhbmRsZSk7CisJaWYgKGNwdV9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCh1bnNpZ25lZCBsb25nKWNwdV9hZGRyICUgKHR3X2Rldi0+dHdfcGNpX2Rldi0+ZGV2aWNlID09IFRXX0RFVklDRV9JRCA/IFRXX0FMSUdOTUVOVF82MDAwIDogVFdfQUxJR05NRU5UXzcwMDApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IENvdWxkbid0IGFsbG9jYXRlIGNvcnJlY3RseSBhbGlnbmVkIG1lbW9yeS5cbiIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2Rldiwgc2l6ZSpUV19RX0xFTkdUSCwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZW1zZXQoY3B1X2FkZHIsIDAsIHNpemUqVFdfUV9MRU5HVEgpOworCisJZm9yIChpPTA7aTxUV19RX0xFTkdUSDtpKyspIHsKKwkJc3dpdGNoKHdoaWNoKSB7CisJCWNhc2UgMDoKKwkJCXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tpXSA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBjaGFyICopY3B1X2FkZHIgKyAoaSpzaXplKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tpXSA9IGRtYV9oYW5kbGUrKGkqc2l6ZSk7CisJCQl0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbaV0gPSAodW5zaWduZWQgbG9uZyAqKSgodW5zaWduZWQgY2hhciAqKWNwdV9hZGRyICsgKGkqc2l6ZSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19hbGxvY2F0ZV9tZW1vcnkoKTogY2FzZSBzbGlwIGluIHR3X2FsbG9jYXRlX21lbW9yeSgpXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19hbGxvY2F0ZV9tZW1vcnkoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgaW9jdGwgZm9yIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgaW50IHR3X2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlcXVlc3RfaWQ7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCXVuc2lnbmVkIHNob3J0IHR3X2Flbl9jb2RlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGRhdGFfYnVmZmVyX2xlbmd0aCA9IDA7CisJdW5zaWduZWQgbG9uZyBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgKmNwdV9hZGRyOworCWxvbmcgdGltZW91dDsKKwlUV19OZXdfSW9jdGwgKnR3X2lvY3RsOworCVRXX1Bhc3N0aHJ1ICpwYXNzdGhydTsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSB0d19kZXZpY2VfZXh0ZW5zaW9uX2xpc3RbaW1pbm9yKGlub2RlKV07CisJaW50IHJldHZhbCA9IC1FRkFVTFQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hyZGV2X2lvY3RsKClcbiIpOworCisJLyogT25seSBsZXQgb25lIG9mIHRoZXNlIHRocm91Z2ggYXQgYSB0aW1lICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdHdfZGV2LT5pb2N0bF9zZW0pKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyogRmlyc3QgY29weSBkb3duIHRoZSBidWZmZXIgbGVuZ3RoICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhX2J1ZmZlcl9sZW5ndGgsIGFyZ3AsIHNpemVvZih1bnNpZ25lZCBpbnQpKSkKKwkJZ290byBvdXQ7CisKKwkvKiBDaGVjayBzaXplICovCisJaWYgKGRhdGFfYnVmZmVyX2xlbmd0aCA+IFRXX01BWF9JT0NUTF9TRUNUT1JTICogNTEyKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEhhcmR3YXJlIGNhbiBvbmx5IGRvIG11bHRpcGxlIG9mIDUxMiBieXRlIHRyYW5zZmVycyAqLworCWRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZCA9IChkYXRhX2J1ZmZlcl9sZW5ndGggKyA1MTEpICYgfjUxMTsKKwkKKwkvKiBOb3cgYWxsb2NhdGUgaW9jdGwgYnVmIG1lbW9yeSAqLworCWNwdV9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZ0d19kZXYtPnR3X3BjaV9kZXYtPmRldiwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkK3NpemVvZihUV19OZXdfSW9jdGwpIC0gMSwgJmRtYV9oYW5kbGUsIEdGUF9LRVJORUwpOworCWlmIChjcHVfYWRkciA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXR3X2lvY3RsID0gKFRXX05ld19Jb2N0bCAqKWNwdV9hZGRyOworCisJLyogTm93IGNvcHkgZG93biB0aGUgZW50aXJlIGlvY3RsICovCisJaWYgKGNvcHlfZnJvbV91c2VyKHR3X2lvY3RsLCBhcmdwLCBkYXRhX2J1ZmZlcl9sZW5ndGggKyBzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDEpKQorCQlnb3RvIG91dDI7CisKKwlwYXNzdGhydSA9IChUV19QYXNzdGhydSAqKSZ0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZDsKKworCS8qIFNlZSB3aGljaCBpb2N0bCB3ZSBhcmUgZG9pbmcgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFRXX09QX05PUDoKKwkJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKTogY2F1Z2h0IFRXX09QX05PUC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVFdfT1BfQUVOX0xJU1RFTjoKKwkJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKTogY2F1Z2h0IFRXX0FFTl9MSVNURU4uXG4iKTsKKwkJCW1lbXNldCh0d19pb2N0bC0+ZGF0YV9idWZmZXIsIDAsIGRhdGFfYnVmZmVyX2xlbmd0aCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlpZiAodHdfZGV2LT5hZW5faGVhZCA9PSB0d19kZXYtPmFlbl90YWlsKSB7CisJCQkJdHdfYWVuX2NvZGUgPSBUV19BRU5fUVVFVUVfRU1QVFk7CisJCQl9IGVsc2UgeworCQkJCXR3X2Flbl9jb2RlID0gdHdfZGV2LT5hZW5fcXVldWVbdHdfZGV2LT5hZW5faGVhZF07CisJCQkJaWYgKHR3X2Rldi0+YWVuX2hlYWQgPT0gVFdfUV9MRU5HVEggLSAxKSB7CisJCQkJCXR3X2Rldi0+YWVuX2hlYWQgPSBUV19RX1NUQVJUOworCQkJCX0gZWxzZSB7CisJCQkJCXR3X2Rldi0+YWVuX2hlYWQgPSB0d19kZXYtPmFlbl9oZWFkICsgMTsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQltZW1jcHkodHdfaW9jdGwtPmRhdGFfYnVmZmVyLCAmdHdfYWVuX2NvZGUsIHNpemVvZih0d19hZW5fY29kZSkpOworCQkJYnJlYWs7CisJCWNhc2UgVFdfQ01EX1BBQ0tFVF9XSVRIX0RBVEE6CisJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfY2hyZGV2X2lvY3RsKCk6IGNhdWdodCBUV19DTURfUEFDS0VUX1dJVEhfREFUQS5cbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCQkJdHdfc3RhdGVfcmVxdWVzdF9zdGFydCh0d19kZXYsICZyZXF1ZXN0X2lkKTsKKworCQkJLyogRmxhZyBpbnRlcm5hbCBjb21tYW5kICovCisJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9IE5VTEw7CisKKwkJCS8qIEZsYWcgY2hyZGV2IGlvY3RsICovCisJCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKworCQkJdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQucmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisKKwkJCS8qIExvYWQgdGhlIHNnIGxpc3QgKi8KKwkJCXN3aXRjaCAoVFdfU0dMX09VVCh0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZC5vcGNvZGVfX3NnbG9mZnNldCkpIHsKKwkJCWNhc2UgMjoKKwkJCQl0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZC5ieXRlOC5wYXJhbS5zZ2xbMF0uYWRkcmVzcyA9IGRtYV9oYW5kbGUgKyBzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDE7CisJCQkJdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQuYnl0ZTgucGFyYW0uc2dsWzBdLmxlbmd0aCA9IGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZC5ieXRlOC5pby5zZ2xbMF0uYWRkcmVzcyA9IGRtYV9oYW5kbGUgKyBzaXplb2YoVFdfTmV3X0lvY3RsKSAtIDE7CisJCQkJdHdfaW9jdGwtPmZpcm13YXJlX2NvbW1hbmQuYnl0ZTguaW8uc2dsWzBdLmxlbmd0aCA9IGRhdGFfYnVmZmVyX2xlbmd0aF9hZGp1c3RlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwYXNzdGhydS0+c2dfbGlzdFswXS5hZGRyZXNzID0gZG1hX2hhbmRsZSArIHNpemVvZihUV19OZXdfSW9jdGwpIC0gMTsKKwkJCQlwYXNzdGhydS0+c2dfbGlzdFswXS5sZW5ndGggPSBkYXRhX2J1ZmZlcl9sZW5ndGhfYWRqdXN0ZWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW1lbWNweSh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSwgJih0d19pb2N0bC0+ZmlybXdhcmVfY29tbWFuZCksIHNpemVvZihUV19Db21tYW5kKSk7CisKKwkJCS8qIE5vdyBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCB0byB0aGUgY29udHJvbGxlciAqLworCQkJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJCQl0aW1lb3V0ID0gVFdfSU9DVExfQ0hSREVWX1RJTUVPVVQqSFo7CisKKwkJCS8qIE5vdyB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCQkJdGltZW91dCA9IHdhaXRfZXZlbnRfdGltZW91dCh0d19kZXYtPmlvY3RsX3dxdWV1ZSwgdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9PSBUV19JT0NUTF9DSFJERVZfRlJFRSwgdGltZW91dCk7CisKKwkJCS8qIFNlZSBpZiB3ZSByZXNldCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgaW9jdGwgdG8gY29tcGxldGUgKi8KKwkJCWlmICh0ZXN0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpKSB7CisJCQkJY2xlYXJfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKworCQkJLyogV2UgdGltZWQgb3V0LCBhbmQgZGlkbid0IGdldCBhbiBpbnRlcnJ1cHQgKi8KKwkJCWlmICh0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkICE9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFKSB7CisJCQkJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBDaGFyYWN0ZXIgaW9jdGwgKDB4JXgpIHRpbWVkIG91dCwgcmVzZXR0aW5nIGNhcmQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sIGNtZCk7CisJCQkJcmV0dmFsID0gLUVJTzsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQl0d19zdGF0ZV9yZXF1ZXN0X2ZpbmlzaCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkJaWYgKHR3X3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAxKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19jaHJkZXZfaW9jdGwoKTogUmVzZXQgZmFpbGVkIGZvciBjYXJkICVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJCQl9CisJCQkJZ290byBvdXQyOworCQkJfQorCisJCQkvKiBOb3cgY29weSBpbiB0aGUgY29tbWFuZCBwYWNrZXQgcmVzcG9uc2UgKi8KKwkJCW1lbWNweSgmKHR3X2lvY3RsLT5maXJtd2FyZV9jb21tYW5kKSwgdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0sIHNpemVvZihUV19Db21tYW5kKSk7CisKKwkJCS8qIE5vdyBjb21wbGV0ZSB0aGUgaW8gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQl0d19kZXYtPnBvc3RlZF9yZXF1ZXN0X2NvdW50LS07CisJCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJCQl0d19zdGF0ZV9yZXF1ZXN0X2ZpbmlzaCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR2YWwgPSAtRU5PVFRZOworCQkJZ290byBvdXQyOworCX0KKworCS8qIE5vdyBjb3B5IHRoZSByZXNwb25zZSB0byB1c2Vyc3BhY2UgKi8KKwlpZiAoY29weV90b191c2VyKGFyZ3AsIHR3X2lvY3RsLCBzaXplb2YoVFdfTmV3X0lvY3RsKSArIGRhdGFfYnVmZmVyX2xlbmd0aCAtIDEpKQorCQlnb3RvIG91dDI7CisJcmV0dmFsID0gMDsKK291dDI6CisJLyogTm93IGZyZWUgaW9jdGwgYnVmIG1lbW9yeSAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZ0d19kZXYtPnR3X3BjaV9kZXYtPmRldiwgZGF0YV9idWZmZXJfbGVuZ3RoX2FkanVzdGVkK3NpemVvZihUV19OZXdfSW9jdGwpIC0gMSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworb3V0OgorCXVwKCZ0d19kZXYtPmlvY3RsX3NlbSk7CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3X2NocmRldl9pb2N0bCgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBvcGVuIGZvciB0aGUgY2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIGludCB0d19jaHJkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3JfbnVtYmVyOworCisJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2lvY3RsX29wZW4oKVxuIik7CisKKwltaW5vcl9udW1iZXIgPSBpbWlub3IoaW5vZGUpOworCWlmIChtaW5vcl9udW1iZXIgPj0gdHdfZGV2aWNlX2V4dGVuc2lvbl9jb3VudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X2NocmRldl9vcGVuKCkgKi8KKworLyogRmlsZSBvcGVyYXRpb25zIHN0cnVjdCBmb3IgY2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHdfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCQk9IHR3X2NocmRldl9pb2N0bCwKKwkub3BlbgkJPSB0d19jaHJkZXZfb3BlbiwKKwkucmVsZWFzZQk9IE5VTEwKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHVwIGRldmljZSBleHRlbnNpb24gcmVzb3VyY2VzICovCitzdGF0aWMgdm9pZCB0d19mcmVlX2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbigpXG4iKTsKKworCS8qIEZyZWUgY29tbWFuZCBwYWNrZXQgYW5kIGdlbmVyaWMgYnVmZmVyIG1lbW9yeSAqLworCWlmICh0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1swXSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0d19kZXYtPnR3X3BjaV9kZXYsIHNpemVvZihUV19Db21tYW5kKSpUV19RX0xFTkdUSCwgdHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbMF0sIHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1swXSk7CisKKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzWzBdKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHR3X2Rldi0+dHdfcGNpX2Rldiwgc2l6ZW9mKFRXX1NlY3RvcikqVFdfUV9MRU5HVEgsIHR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1swXSwgdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1swXSk7Cit9IC8qIEVuZCB0d19mcmVlX2RldmljZV9leHRlbnNpb24oKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZCBhbiBpbml0Y29ubmVjdGlvbiBjb21tYW5kIHRvIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgdHdfaW5pdGNvbm5lY3Rpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgbWVzc2FnZV9jcmVkaXRzKSAKK3sKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfcXVlX3ZhbHVlOworCVRXX0NvbW1hbmQgICpjb21tYW5kX3BhY2tldDsKKwlUV19SZXNwb25zZV9RdWV1ZSByZXNwb25zZV9xdWV1ZTsKKwlpbnQgcmVxdWVzdF9pZCA9IDA7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19pbml0Y29ubmVjdGlvbigpXG4iKTsKKworCS8qIEluaXRpYWxpemUgSW5pdENvbm5lY3Rpb24gY29tbWFuZCBwYWNrZXQgKi8KKwlpZiAodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19pbml0Y29ubmVjdGlvbigpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigwLCBUV19PUF9JTklUX0NPTk5FQ1RJT04pOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+c3RhdHVzID0gMHgwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDB4MDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTYubWVzc2FnZV9jcmVkaXRzID0gbWVzc2FnZV9jcmVkaXRzOyAKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTguaW5pdF9jb25uZWN0aW9uLnJlc3BvbnNlX3F1ZXVlX3BvaW50ZXIgPSAweDA7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19pbml0Y29ubmVjdGlvbigpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisgIAorCS8qIFNlbmQgY29tbWFuZCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCisJb3V0bChjb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKyAgICAKKwkvKiBQb2xsIGZvciBjb21wbGV0aW9uICovCisJaWYgKHR3X3BvbGxfc3RhdHVzX2dvbmUodHdfZGV2LCBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFksIDMwKSA9PSAwKSB7CisJCXJlc3BvbnNlX3F1ZXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlyZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZXVlLnJlc3BvbnNlX2lkKTsKKworCQlpZiAocmVxdWVzdF9pZCAhPSAwKSB7CisJCQkvKiB1bmV4cGVjdGVkIHJlcXVlc3QgaWQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2luaXRjb25uZWN0aW9uKCk6IFVuZXhwZWN0ZWQgcmVxdWVzdCBpZC5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGNvbW1hbmRfcGFja2V0LT5zdGF0dXMgIT0gMCkgeworCQkJLyogYmFkIHJlc3BvbnNlICovCisJCQl0d19kZWNvZGVfc2Vuc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfSAvKiBFbmQgdHdfaW5pdGNvbm5lY3Rpb24oKSAqLworCisvKiBTZXQgYSB2YWx1ZSBpbiB0aGUgZmVhdHVyZXMgdGFibGUgKi8KK3N0YXRpYyBpbnQgdHdfc2V0ZmVhdHVyZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCBwYXJtLCBpbnQgcGFyYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZhbCkKK3sKKwlUV19QYXJhbSAqcGFyYW07CisJVFdfQ29tbWFuZCAgKmNvbW1hbmRfcGFja2V0OworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZXVlOworCWludCByZXF1ZXN0X2lkID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfcXVlX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgcGFyYW1fdmFsdWU7CisKKyAgCS8qIEluaXRpYWxpemUgU2V0UGFyYW0gY29tbWFuZCBwYWNrZXQgKi8KKwlpZiAodHdfZGV2LT5jb21tYW5kX3BhY2tldF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zZXRmZWF0dXJlKCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDIsIFRXX09QX1NFVF9QQVJBTSk7CisJcGFyYW0tPnRhYmxlX2lkID0gMHg0MDQ7ICAvKiBGZWF0dXJlcyB0YWJsZSAqLworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSBwYXJtOworCXBhcmFtLT5wYXJhbWV0ZXJfc2l6ZV9ieXRlcyA9IHBhcmFtX3NpemU7CisJbWVtY3B5KHBhcmFtLT5kYXRhLCB2YWwsIHBhcmFtX3NpemUpOworCisJcGFyYW1fdmFsdWUgPSB0d19kZXYtPmFsaWdubWVudF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3NldGZlYXR1cmUoKTogQmFkIGFsaWdubWVudCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2NzaV9kb25lKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwl9CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gNDsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisKKyAgCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3F1ZV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3NldGZlYXR1cmUoKTogQmFkIGNvbW1hbmQgcGFja2V0IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwlyZXR1cm4gMTsKKwl9CisKKwkvKiBTZW5kIGNvbW1hbmQgcGFja2V0IHRvIHRoZSBib2FyZCAqLworCW91dGwoY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7CisKKwkvKiBQb2xsIGZvciBjb21wbGV0aW9uICovCisJaWYgKHR3X3BvbGxfc3RhdHVzX2dvbmUodHdfZGV2LCBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFksIDMwKSA9PSAwKSB7CisJCXJlc3BvbnNlX3F1ZXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQlyZXF1ZXN0X2lkID0gVFdfUkVTSURfT1VUKHJlc3BvbnNlX3F1ZXVlLnJlc3BvbnNlX2lkKTsKKworCQlpZiAocmVxdWVzdF9pZCAhPSAwKSB7CisJCQkvKiB1bmV4cGVjdGVkIHJlcXVlc3QgaWQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3NldGZlYXR1cmUoKTogVW5leHBlY3RlZCByZXF1ZXN0IGlkLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoY29tbWFuZF9wYWNrZXQtPnN0YXR1cyAhPSAwKSB7CisJCQkvKiBiYWQgcmVzcG9uc2UgKi8KKwkJCXR3X2RlY29kZV9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3NldGZlYXR1cmUoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHR3X3Jlc2V0X3NlcXVlbmNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldikgCit7CisJaW50IGVycm9yID0gMDsKKwlpbnQgdHJpZXMgPSAwOworCXVuc2lnbmVkIGNoYXIgYyA9IDE7CisKKwkvKiBSZXNldCB0aGUgYm9hcmQgKi8KKwl3aGlsZSAodHJpZXMgPCBUV19NQVhfUkVTRVRfVFJJRVMpIHsKKwkJVFdfU09GVF9SRVNFVCh0d19kZXYpOworCisJCWVycm9yID0gdHdfYWVuX2RyYWluX3F1ZXVlKHR3X2Rldik7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBBRU4gZHJhaW4gZmFpbGVkLCByZXRyeWluZy5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDaGVjayBmb3IgY29udHJvbGxlciBlcnJvcnMgKi8KKwkJaWYgKHR3X2NoZWNrX2Vycm9ycyh0d19kZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IENvbnRyb2xsZXIgZXJyb3JzIGZvdW5kLCByZXRyeWluZy5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCQl0cmllcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3cgdGhlIGNvbnRyb2xsZXIgaXMgaW4gYSBnb29kIHN0YXRlICovCisJCWJyZWFrOworCX0KKworCWlmICh0cmllcyA+PSBUV19NQVhfUkVTRVRfVFJJRVMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBDb250cm9sbGVyIGVycm9ycywgY2FyZCBub3QgcmVzcG9uZGluZywgY2hlY2sgYWxsIGNhYmxpbmcuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gMTsKKwl9CisKKwllcnJvciA9IHR3X2luaXRjb25uZWN0aW9uKHR3X2RldiwgVFdfSU5JVF9NRVNTQUdFX0NSRURJVFMpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IENvbm5lY3Rpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXJyb3IgPSB0d19zZXRmZWF0dXJlKHR3X2RldiwgMiwgMSwgJmMpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBVbmFibGUgdG8gc2V0IGZlYXR1cmVzIGZvciBjYXJkLCBwcm9iYWJsZSBvbGQgZmlybXdhcmUgb3IgY2FyZC5cbiIpOworCX0KKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfcmVzZXRfc2VxdWVuY2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIGEgZGV2aWNlIGV4dGVuc2lvbiAqLworc3RhdGljIGludCB0d19pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2KQoreworCWludCBpLCBlcnJvcj0wOworCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKClcbiIpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCBidWZmZXJzICovCisJZXJyb3IgPSB0d19hbGxvY2F0ZV9tZW1vcnkodHdfZGV2LCBzaXplb2YoVFdfQ29tbWFuZCksIDApOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBDb21tYW5kIHBhY2tldCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBnZW5lcmljIGJ1ZmZlciAqLworCWVycm9yID0gdHdfYWxsb2NhdGVfbWVtb3J5KHR3X2Rldiwgc2l6ZW9mKFRXX1NlY3RvciksIDEpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBHZW5lcmljIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGk9MDtpPFRXX1FfTEVOR1RIO2krKykgeworCQl0d19kZXYtPmZyZWVfcXVldWVbaV0gPSBpOworCQl0d19kZXYtPnN0YXRlW2ldID0gVFdfU19JTklUSUFMOworCX0KKworCXR3X2Rldi0+cGVuZGluZ19oZWFkID0gVFdfUV9TVEFSVDsKKwl0d19kZXYtPnBlbmRpbmdfdGFpbCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCisJaW5pdF9NVVRFWCgmdHdfZGV2LT5pb2N0bF9zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfaW5pdGlhbGl6ZV9kZXZpY2VfZXh0ZW5zaW9uKCkgKi8KKworc3RhdGljIGludCB0d19tYXBfc2NzaV9zZ19kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IHVzZV9zZzsKKworCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19tYXBfc2NzaV9zZ19kYXRhKClcbiIpOworCQorCWlmIChjbWQtPnVzZV9zZyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXVzZV9zZyA9IHBjaV9tYXBfc2cocGRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisJCisJaWYgKHVzZV9zZyA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X21hcF9zY3NpX3NnX2RhdGEoKTogcGNpX21hcF9zZygpIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWQtPlNDcC5waGFzZSA9IFRXX1BIQVNFX1NHTElTVDsKKwljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSB1c2Vfc2c7CisJCisJcmV0dXJuIHVzZV9zZzsKK30gLyogRW5kIHR3X21hcF9zY3NpX3NnX2RhdGEoKSAqLworCitzdGF0aWMgdTMyIHR3X21hcF9zY3NpX3NpbmdsZV9kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X21hcF9zY3NpX3NpbmdsZV9kYXRhKClcbiIpOworCisJaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuID09IDApCisJCXJldHVybiAwOworCisJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShwZGV2LCB2aXJ0X3RvX3BhZ2UoY21kLT5yZXF1ZXN0X2J1ZmZlciksIG9mZnNldF9pbl9wYWdlKGNtZC0+cmVxdWVzdF9idWZmZXIpLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOworCisJaWYgKG1hcHBpbmcgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19tYXBfc2NzaV9zaW5nbGVfZGF0YSgpOiBwY2lfbWFwX3BhZ2UoKSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kLT5TQ3AucGhhc2UgPSBUV19QSEFTRV9TSU5HTEU7CisJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gbWFwcGluZzsKKworCXJldHVybiBtYXBwaW5nOworfSAvKiBFbmQgdHdfbWFwX3Njc2lfc2luZ2xlX2RhdGEoKSAqLworCitzdGF0aWMgdm9pZCB0d191bm1hcF9zY3NpX2RhdGEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfdW5tYXBfc2NzaV9kYXRhKClcbiIpOworCisJc3dpdGNoKGNtZC0+U0NwLnBoYXNlKSB7CisJCWNhc2UgVFdfUEhBU0VfU0lOR0xFOgorCQkJcGNpX3VubWFwX3BhZ2UocGRldiwgY21kLT5TQ3AuaGF2ZV9kYXRhX2luLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJYnJlYWs7CisJCWNhc2UgVFdfUEhBU0VfU0dMSVNUOgorCQkJcGNpX3VubWFwX3NnKHBkZXYsIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisJCQlicmVhazsKKwl9Cit9IC8qIEVuZCB0d191bm1hcF9zY3NpX2RhdGEoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgYSBkZXZpY2UgZXh0ZW5zaW9uICovCitzdGF0aWMgaW50IHR3X3Jlc2V0X2RldmljZV9leHRlbnNpb24oVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgaW9jdGxfcmVzZXQpIAoreworCWludCBpID0gMDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmI7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKClcbiIpOworCisJc2V0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOworCVRXX0RJU0FCTEVfSU5URVJSVVBUUyh0d19kZXYpOworCVRXX01BU0tfQ09NTUFORF9JTlRFUlJVUFQodHdfZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyogQWJvcnQgYWxsIHJlcXVlc3RzIHRoYXQgYXJlIGluIHByb2dyZXNzICovCisJZm9yIChpPTA7aTxUV19RX0xFTkdUSDtpKyspIHsKKwkJaWYgKCh0d19kZXYtPnN0YXRlW2ldICE9IFRXX1NfRklOSVNIRUQpICYmIAorCQkgICAgKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19JTklUSUFMKSAmJgorCQkgICAgKHR3X2Rldi0+c3RhdGVbaV0gIT0gVFdfU19DT01QTEVURUQpKSB7CisJCQlzcmIgPSB0d19kZXYtPnNyYltpXTsKKwkJCWlmIChzcmIgIT0gTlVMTCkgeworCQkJCXNyYi0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCQkJdHdfZGV2LT5zcmJbaV0tPnNjc2lfZG9uZSh0d19kZXYtPnNyYltpXSk7CisJCQkJdHdfdW5tYXBfc2NzaV9kYXRhKHR3X2Rldi0+dHdfcGNpX2RldiwgdHdfZGV2LT5zcmJbaV0pOworCQkJfQorCQl9CisJfQorCisJLyogUmVzZXQgcXVldWVzIGFuZCBjb3VudHMgKi8KKwlmb3IgKGk9MDtpPFRXX1FfTEVOR1RIO2krKykgeworCQl0d19kZXYtPmZyZWVfcXVldWVbaV0gPSBpOworCQl0d19kZXYtPnN0YXRlW2ldID0gVFdfU19JTklUSUFMOworCX0KKwl0d19kZXYtPmZyZWVfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5mcmVlX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQgPSAwOworCXR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID0gMDsKKwl0d19kZXYtPnBlbmRpbmdfaGVhZCA9IFRXX1FfU1RBUlQ7CisJdHdfZGV2LT5wZW5kaW5nX3RhaWwgPSBUV19RX1NUQVJUOworCXR3X2Rldi0+cmVzZXRfcHJpbnQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHR3X3Jlc2V0X3NlcXVlbmNlKHR3X2RldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBSZXNldCBzZXF1ZW5jZSBmYWlsZWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQlyZXR1cm4gMTsKKwl9CisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBXYWtlIHVwIGFueSBpb2N0bCB0aGF0IHdhcyBwZW5kaW5nIGJlZm9yZSB0aGUgcmVzZXQgKi8KKwlpZiAoKHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUpIHx8IChpb2N0bF9yZXNldCkpIHsKKwkJY2xlYXJfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJfSBlbHNlIHsKKwkJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOworCQl3YWtlX3VwKCZ0d19kZXYtPmlvY3RsX3dxdWV1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKCkgKi8KKworLyogVGhpcyBmdW5jaXRvbiByZXR1cm5zIHVuaXQgZ2VvbWV0cnkgaW4gY3lsaW5kZXJzL2hlYWRzL3NlY3RvcnMgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaV9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkgCit7CisJaW50IGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2OworCQorCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lfYmlvc3BhcmFtKClcbiIpOworCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisKKwloZWFkcyA9IDY0OworCXNlY3RvcnMgPSAzMjsKKwljeWxpbmRlcnMgPSBzZWN0b3JfZGl2KGNhcGFjaXR5LCBoZWFkcyAqIHNlY3RvcnMpOworCisJaWYgKGNhcGFjaXR5ID49IDB4MjAwMDAwKSB7CisJCWhlYWRzID0gMjU1OworCQlzZWN0b3JzID0gNjM7CisJCWN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzICogc2VjdG9ycyk7CisJfQorCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9iaW9zcGFyYW0oKTogaGVhZHMgPSAlZCwgc2VjdG9ycyA9ICVkLCBjeWxpbmRlcnMgPSAlZFxuIiwgaGVhZHMsIHNlY3RvcnMsIGN5bGluZGVycyk7CisJZ2VvbVswXSA9IGhlYWRzOwkJCSAKKwlnZW9tWzFdID0gc2VjdG9yczsKKwlnZW9tWzJdID0gY3lsaW5kZXJzOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3NpX2Jpb3NwYXJhbSgpICovCisKKy8qIFRoaXMgaXMgdGhlIG5ldyBzY3NpIGVoIHJlc2V0IGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHR3X3Njc2lfZWhfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpIAoreworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2Rldj1OVUxMOworCWludCByZXR2YWwgPSBGQUlMRUQ7CisKKwl0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJc3Bpbl91bmxvY2tfaXJxKHR3X2Rldi0+aG9zdC0+aG9zdF9sb2NrKTsKKworCXR3X2Rldi0+bnVtX3Jlc2V0cysrOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBXQVJOSU5HOiBVbml0ICMlZDogQ29tbWFuZCAoMHgleCkgdGltZWQgb3V0LCByZXNldHRpbmcgY2FyZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubywgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5jbW5kWzBdKTsKKworCS8qIE5vdyByZXNldCB0aGUgY2FyZCBhbmQgc29tZSBvZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBkYXRhICovCisJaWYgKHR3X3Jlc2V0X2RldmljZV9leHRlbnNpb24odHdfZGV2LCAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IFJlc2V0IGZhaWxlZC5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IFNVQ0NFU1M7CitvdXQ6CisJc3Bpbl9sb2NrX2lycSh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30gLyogRW5kIHR3X3Njc2lfZWhfcmVzZXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgc2NzaSBpbnF1aXJ5IGNvbW1hbmRzICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9pbnF1aXJ5KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJVFdfUGFyYW0gKnBhcmFtOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5KClcbiIpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9wYWNrZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigyLCBUV19PUF9HRVRfUEFSQU0pOworCWNvbW1hbmRfcGFja2V0LT5zaXplID0gNDsKKwljb21tYW5kX3BhY2tldC0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisJY29tbWFuZF9wYWNrZXQtPnN0YXR1cyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmZsYWdzID0gMDsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTYucGFyYW1ldGVyX2NvdW50ID0gMTsKKworCS8qIE5vdyBzZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX2lucXVpcnkoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCXBhcmFtLT50YWJsZV9pZCA9IDM7CSAvKiB1bml0IHN1bW1hcnkgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gMzsgLyogdW5pdHNzdGF0dXMgcGFyYW1ldGVyICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gVFdfTUFYX1VOSVRTOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfaW5xdWlyeSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpc3IgdG8gY29tcGxldGUgYW4gaW5xdWlyeSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdW5zaWduZWQgY2hhciAqaXNfdW5pdF9wcmVzZW50OworCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3RfYnVmZmVyOworCVRXX1BhcmFtICpwYXJhbTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKClcbiIpOworCisJLyogRmlsbCByZXF1ZXN0IGJ1ZmZlciAqLworCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXF1ZXN0X2J1ZmZlciA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZlcjsKKwltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCXJlcXVlc3RfYnVmZmVyWzBdID0gVFlQRV9ESVNLOyAvKiBQZXJpcGhlcmFsIGRldmljZSB0eXBlICovCisJcmVxdWVzdF9idWZmZXJbMV0gPSAwOwkgICAgICAgLyogRGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KKwlyZXF1ZXN0X2J1ZmZlclsyXSA9IDA7CSAgICAgICAvKiBObyBhbnNpL2lzbyBjb21wbGlhbmNlICovCisJcmVxdWVzdF9idWZmZXJbNF0gPSAzMTsJICAgICAgIC8qIEFkZGl0aW9uYWwgbGVuZ3RoICovCisJbWVtY3B5KCZyZXF1ZXN0X2J1ZmZlcls4XSwgIjN3YXJlICAgIiwgOCk7CSAvKiBWZW5kb3IgSUQgKi8KKwlzcHJpbnRmKCZyZXF1ZXN0X2J1ZmZlclsxNl0sICJMb2dpY2FsIERpc2sgJS0yZCAiLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZCk7CisJbWVtY3B5KCZyZXF1ZXN0X2J1ZmZlclszMl0sIFRXX0RSSVZFUl9WRVJTSU9OLCAzKTsKKworCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKCk6IEJhZCBhbGlnbm1lbnQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKwlpc191bml0X3ByZXNlbnQgPSAmKHBhcmFtLT5kYXRhWzBdKTsKKworCWlmIChpc191bml0X3ByZXNlbnRbdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWRdICYgVFdfVU5JVF9PTkxJTkUpIHsKKwkJdHdfZGV2LT5pc191bml0X3ByZXNlbnRbdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWRdID0gMTsKKwl9IGVsc2UgeworCQl0d19kZXYtPmlzX3VuaXRfcHJlc2VudFt0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZF0gPSAwOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJcmV0dXJuIFRXX0lTUl9ET05UX1JFU1VMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Njc2lvcF9pbnF1aXJ5X2NvbXBsZXRlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHNjc2kgbW9kZV9zZW5zZSBjb21tYW5kcyAqLworc3RhdGljIGludCB0d19zY3Npb3BfbW9kZV9zZW5zZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCVRXX1BhcmFtICpwYXJhbTsKKwlUV19Db21tYW5kICpjb21tYW5kX3BhY2tldDsKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfcXVlX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgcGFyYW1fdmFsdWU7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZSgpXG4iKTsKKworCS8qIE9ubHkgcGFnZSBjb250cm9sID0gMCwgcGFnZSBjb2RlID0gMHg4IChjYWNoZSBwYWdlKSBzdXBwb3J0ZWQgKi8KKwlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmNtbmRbMl0gIT0gMHg4KSB7CisJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2NzaV9kb25lKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm93IHJlYWQgZmlybXdhcmUgY2FjaGUgc2V0dGluZyBmb3IgdGhpcyB1bml0ICovCisJY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZCAqKXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3BhY2tldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF9tb2RlX3NlbnNlKCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2V0dXAgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJbWVtc2V0KGNvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDQ7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisKKwkvKiBTZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX21vZGVfc2Vuc2UoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJcGFyYW0tPnRhYmxlX2lkID0gVFdfVU5JVF9JTkZPUk1BVElPTl9UQUJMRV9CQVNFICsgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQ7CisJcGFyYW0tPnBhcmFtZXRlcl9pZCA9IDc7IC8qIHVuaXQgZmxhZ3MgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX3NpemVfYnl0ZXMgPSAxOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZSgpOiBCYWQgYWxpZ25tZW50IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgcGFja2V0ICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCQorCXJldHVybiAwOworfSAvKiBFbmQgdHdfc2NzaW9wX21vZGVfc2Vuc2UoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaXNyIHRvIGNvbXBsZXRlIGEgbW9kZSBzZW5zZSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9tb2RlX3NlbnNlX2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJVFdfUGFyYW0gKnBhcmFtOworCXVuc2lnbmVkIGNoYXIgKmZsYWdzOworCXVuc2lnbmVkIGNoYXIgKnJlcXVlc3RfYnVmZmVyOworCisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX21vZGVfc2Vuc2VfY29tcGxldGUoKVxuIik7CisKKwlwYXJhbSA9IChUV19QYXJhbSAqKXR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfbW9kZV9zZW5zZV9jb21wbGV0ZSgpOiBCYWQgYWxpZ25tZW50IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZmxhZ3MgPSAoY2hhciAqKSYocGFyYW0tPmRhdGFbMF0pOworCXJlcXVlc3RfYnVmZmVyID0gdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmJ1ZmZlcjsKKwltZW1zZXQocmVxdWVzdF9idWZmZXIsIDAsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJcmVxdWVzdF9idWZmZXJbMF0gPSAweGY7ICAgICAgICAvKiBtb2RlIGRhdGEgbGVuZ3RoICovCisJcmVxdWVzdF9idWZmZXJbMV0gPSAwOyAgICAgICAgICAvKiBkZWZhdWx0IG1lZGl1bSB0eXBlICovCisJcmVxdWVzdF9idWZmZXJbMl0gPSAweDEwOyAgICAgICAvKiBkcG8vZnVhIHN1cHBvcnQgb24gKi8KKwlyZXF1ZXN0X2J1ZmZlclszXSA9IDA7ICAgICAgICAgIC8qIG5vIGJsb2NrIGRlc2NyaXB0b3JzICovCisJcmVxdWVzdF9idWZmZXJbNF0gPSAweDg7ICAgICAgICAvKiBjYWNoaW5nIHBhZ2UgKi8KKwlyZXF1ZXN0X2J1ZmZlcls1XSA9IDB4YTsgICAgICAgIC8qIHBhZ2UgbGVuZ3RoICovCisJaWYgKCpmbGFncyAmIDB4MSkKKwkJcmVxdWVzdF9idWZmZXJbNl0gPSAweDQ7ICAgICAgICAvKiBXQ0Ugb24gKi8KKwllbHNlCisJCXJlcXVlc3RfYnVmZmVyWzZdID0gMHgwOyAgICAgICAgLyogV0NFIG9mZiAqLworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfbW9kZV9zZW5zZV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzY3NpIHJlYWRfY2FwYWNpdHkgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHkoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkgCit7CisJVFdfUGFyYW0gKnBhcmFtOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5KClcbiIpOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKworCWlmIChjb21tYW5kX3BhY2tldCA9PSBOVUxMKSB7CisJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5KCk6IEJhZCBjb21tYW5kIHBhY2tldCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChjb21tYW5kX3BhY2tldCwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDIsIFRXX09QX0dFVF9QQVJBTSk7CisJY29tbWFuZF9wYWNrZXQtPnNpemUgPSA0OworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+dW5pdF9faG9zdGlkID0gVFdfVU5JVEhPU1RfSU4oMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQpOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LmJsb2NrX2NvdW50ID0gMTsKKworCS8qIE5vdyBzZXR1cCB0aGUgcGFyYW0gKi8KKwlpZiAodHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdID09IE5VTEwpIHsKKwkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHkoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCXBhcmFtLT50YWJsZV9pZCA9IFRXX1VOSVRfSU5GT1JNQVRJT05fVEFCTEVfQkFTRSArIAorCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5kZXZpY2UtPmlkOworCXBhcmFtLT5wYXJhbWV0ZXJfaWQgPSA0OwkvKiB1bml0Y2FwYWNpdHkgcGFyYW1ldGVyICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gNDsKKwlwYXJhbV92YWx1ZSA9IHR3X2Rldi0+YWxpZ25tZW50X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKHBhcmFtX3ZhbHVlID09IDApIHsKKwkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHkoKTogQmFkIGFsaWdubWVudCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKyAgCisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5hZGRyZXNzID0gcGFyYW1fdmFsdWU7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LnBhcmFtLnNnbFswXS5sZW5ndGggPSBzaXplb2YoVFdfU2VjdG9yKTsKKwljb21tYW5kX3F1ZV92YWx1ZSA9IHR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9xdWVfdmFsdWUgPT0gMCkgeworCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworICAKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5KCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGlzciB0byBjb21wbGV0ZSBhIHJlYWRjYXBhY2l0eSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9yZWFkX2NhcGFjaXR5X2NvbXBsZXRlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJdW5zaWduZWQgY2hhciAqcGFyYW1fZGF0YTsKKwl1MzIgY2FwYWNpdHk7CisJY2hhciAqYnVmZjsKKwlUV19QYXJhbSAqcGFyYW07CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpXG4iKTsKKworCWJ1ZmYgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXI7CisJaWYgKGJ1ZmYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoYnVmZiwgMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmxlbik7CisJcGFyYW0gPSAoVFdfUGFyYW0gKil0d19kZXYtPmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKHBhcmFtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtX2RhdGEgPSAmKHBhcmFtLT5kYXRhWzBdKTsKKworCWNhcGFjaXR5ID0gKHBhcmFtX2RhdGFbM10gPDwgMjQpIHwgKHBhcmFtX2RhdGFbMl0gPDwgMTYpIHwgCisJCSAgIChwYXJhbV9kYXRhWzFdIDw8IDgpIHwgcGFyYW1fZGF0YVswXTsKKworCS8qIFN1YnRyYWN0IG9uZSBzZWN0b3IgdG8gZml4IGdldCBsYXN0IHNlY3RvciBpb2N0bCAqLworCWNhcGFjaXR5IC09IDE7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpOiBDYXBhY2l0eSA9IDB4JXguXG4iLCBjYXBhY2l0eSk7CisKKwkvKiBOdW1iZXIgb2YgTEJBJ3MgKi8KKwlidWZmWzBdID0gKGNhcGFjaXR5ID4+IDI0KTsKKwlidWZmWzFdID0gKGNhcGFjaXR5ID4+IDE2KSAmIDB4ZmY7CisJYnVmZlsyXSA9IChjYXBhY2l0eSA+PiA4KSAmIDB4ZmY7CisJYnVmZlszXSA9IGNhcGFjaXR5ICYgMHhmZjsKKworCS8qIEJsb2NrIHNpemUgaW4gYnl0ZXMgKDUxMikgKi8KKwlidWZmWzRdID0gKFRXX0JMT0NLX1NJWkUgPj4gMjQpOworCWJ1ZmZbNV0gPSAoVFdfQkxPQ0tfU0laRSA+PiAxNikgJiAweGZmOworCWJ1ZmZbNl0gPSAoVFdfQkxPQ0tfU0laRSA+PiA4KSAmIDB4ZmY7CisJYnVmZls3XSA9IFRXX0JMT0NLX1NJWkUgJiAweGZmOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzY3NpIHJlYWQgb3Igd3JpdGUgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaW9wX3JlYWRfd3JpdGUoVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2LCBpbnQgcmVxdWVzdF9pZCkgCit7CisJVFdfQ29tbWFuZCAqY29tbWFuZF9wYWNrZXQ7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX3F1ZV92YWx1ZTsKKwl1MzIgbGJhID0gMHgwLCBudW1fc2VjdG9ycyA9IDB4MCwgYnVmZmFkZHIgPSAweDA7CisJaW50IGksIHVzZV9zZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmI7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpXG4iKTsKKworCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpOiBSZXF1ZXN0IGJ1ZmZlciBOVUxMLlxuIik7CisJCXJldHVybiAxOworCX0KKwlzZ2xpc3QgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmVyOworCXNyYiA9IHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdOworCisJLyogSW5pdGlhbGl6ZSBjb21tYW5kIHBhY2tldCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9wYWNrZXQgPT0gTlVMTCkgeworCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgdmlydHVhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChzcmItPmNtbmRbMF0gPT0gUkVBRF82IHx8IHNyYi0+Y21uZFswXSA9PSBSRUFEXzEwKSB7CisJCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDMsIFRXX09QX1JFQUQpOworCX0gZWxzZSB7CisJCWNvbW1hbmRfcGFja2V0LT5vcGNvZGVfX3NnbG9mZnNldCA9IFRXX09QU0dMX0lOKDMsIFRXX09QX1dSSVRFKTsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDM7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT51bml0X19ob3N0aWQgPSBUV19VTklUSE9TVF9JTigwLCBzcmItPmRldmljZS0+aWQpOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisKKwlpZiAoc3JiLT5jbW5kWzBdID09IFdSSVRFXzEwKSB7CisJCWlmICgoc3JiLT5jbW5kWzFdICYgMHg4KSB8fCAoc3JiLT5jbW5kWzFdICYgMHgxMCkpCisJCQljb21tYW5kX3BhY2tldC0+ZmxhZ3MgPSAxOworCX0KKworCWlmIChzcmItPmNtbmRbMF0gPT0gUkVBRF82IHx8IHNyYi0+Y21uZFswXSA9PSBXUklURV82KSB7CisJCWxiYSA9ICgodTMyKXNyYi0+Y21uZFsxXSA8PCAxNikgfCAoKHUzMilzcmItPmNtbmRbMl0gPDwgOCkgfCAodTMyKXNyYi0+Y21uZFszXTsKKwkJbnVtX3NlY3RvcnMgPSAodTMyKXNyYi0+Y21uZFs0XTsKKwl9IGVsc2UgeworCQlsYmEgPSAoKHUzMilzcmItPmNtbmRbMl0gPDwgMjQpIHwgKCh1MzIpc3JiLT5jbW5kWzNdIDw8IDE2KSB8ICgodTMyKXNyYi0+Y21uZFs0XSA8PCA4KSB8ICh1MzIpc3JiLT5jbW5kWzVdOworCQludW1fc2VjdG9ycyA9ICh1MzIpc3JiLT5jbW5kWzhdIHwgKCh1MzIpc3JiLT5jbW5kWzddIDw8IDgpOworCX0KKyAgCisJLyogVXBkYXRlIHNlY3RvciBzdGF0aXN0aWMgKi8KKwl0d19kZXYtPnNlY3Rvcl9jb3VudCA9IG51bV9zZWN0b3JzOworCWlmICh0d19kZXYtPnNlY3Rvcl9jb3VudCA+IHR3X2Rldi0+bWF4X3NlY3Rvcl9jb3VudCkKKwkJdHdfZGV2LT5tYXhfc2VjdG9yX2NvdW50ID0gdHdfZGV2LT5zZWN0b3JfY291bnQ7CisgIAorCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF9yZWFkX3dyaXRlKCk6IGxiYSA9IDB4JXggbnVtX3NlY3RvcnMgPSAweCV4XG4iLCBsYmEsIG51bV9zZWN0b3JzKTsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTguaW8ubGJhID0gbGJhOworCWNvbW1hbmRfcGFja2V0LT5ieXRlNi5ibG9ja19jb3VudCA9IG51bV9zZWN0b3JzOworCisJLyogRG8gdGhpcyBpZiB0aGVyZSBhcmUgbm8gc2cgbGlzdCBlbnRyaWVzICovCisJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2cgPT0gMCkgeyAgICAKKwkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlYWRfd3JpdGUoKTogU0cgPSAwXG4iKTsKKwkJYnVmZmFkZHIgPSB0d19tYXBfc2NzaV9zaW5nbGVfZGF0YSh0d19kZXYtPnR3X3BjaV9kZXYsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJaWYgKGJ1ZmZhZGRyID09IDApCisJCQlyZXR1cm4gMTsKKworCQljb21tYW5kX3BhY2tldC0+Ynl0ZTguaW8uc2dsWzBdLmFkZHJlc3MgPSBidWZmYWRkcjsKKwkJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LmlvLnNnbFswXS5sZW5ndGggPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuOworCQljb21tYW5kX3BhY2tldC0+c2l6ZSs9MjsKKwl9CisKKwkvKiBEbyB0aGlzIGlmIHdlIGhhdmUgbXVsdGlwbGUgc2cgbGlzdCBlbnRyaWVzICovCisJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT51c2Vfc2cgPiAwKSB7CisJCXVzZV9zZyA9IHR3X21hcF9zY3NpX3NnX2RhdGEodHdfZGV2LT50d19wY2lfZGV2LCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSk7CisJCWlmICh1c2Vfc2cgPT0gMCkKKwkJCXJldHVybiAxOworCisJCWZvciAoaT0wO2k8dXNlX3NnOyBpKyspIHsKKwkJCWNvbW1hbmRfcGFja2V0LT5ieXRlOC5pby5zZ2xbaV0uYWRkcmVzcyA9IHNnX2RtYV9hZGRyZXNzKCZzZ2xpc3RbaV0pOworCQkJY29tbWFuZF9wYWNrZXQtPmJ5dGU4LmlvLnNnbFtpXS5sZW5ndGggPSBzZ19kbWFfbGVuKCZzZ2xpc3RbaV0pOworCQkJY29tbWFuZF9wYWNrZXQtPnNpemUrPTI7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgU0cgc3RhdGlzdGljcyAqLworCXR3X2Rldi0+c2dsX2VudHJpZXMgPSB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+dXNlX3NnOworCWlmICh0d19kZXYtPnNnbF9lbnRyaWVzID4gdHdfZGV2LT5tYXhfc2dsX2VudHJpZXMpCisJCXR3X2Rldi0+bWF4X3NnbF9lbnRyaWVzID0gdHdfZGV2LT5zZ2xfZW50cmllczsKKworCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3F1ZV92YWx1ZSA9PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfcmVhZF93cml0ZSgpOiBCYWQgY29tbWFuZCBwYWNrZXQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisgICAgICAKKwkvKiBOb3cgdHJ5IHRvIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJdHdfcG9zdF9jb21tYW5kX3BhY2tldCh0d19kZXYsIHJlcXVlc3RfaWQpOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfcmVhZF93cml0ZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGhlIHJlcXVlc3Qgc2Vuc2Ugc2NzaSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9yZXF1ZXN0X3NlbnNlKFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaW9wX3JlcXVlc3Rfc2Vuc2UoKVxuIik7CisKKwkvKiBGb3Igbm93IHdlIGp1c3QgemVybyB0aGUgcmVxdWVzdCBidWZmZXIgKi8KKwltZW1zZXQodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlcXVlc3RfYnVmZmVyLCAwLCB0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+cmVxdWVzdF9idWZmbGVuKTsKKwl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKworCS8qIElmIHdlIGdvdCBhIHJlcXVlc3Rfc2Vuc2UsIHdlIHByb2JhYmx5IHdhbnQgYSByZXNldCwgcmV0dXJuIGVycm9yICovCisJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5zY3NpX2RvbmUodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0pOworCisJcmV0dXJuIDA7Cit9IC8qIEVuZCB0d19zY3Npb3BfcmVxdWVzdF9zZW5zZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgc3luY2hyb25pemUgY2FjaGUgc2NzaSBjb21tYW5kICovCitzdGF0aWMgaW50IHR3X3Njc2lvcF9zeW5jaHJvbml6ZV9jYWNoZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisKKwlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3Npb3Bfc3luY2hyb25pemVfY2FjaGUoKVxuIik7CisKKwkvKiBTZW5kIGZpcm13YXJlIGZsdXNoIGNvbW1hbmQgZm9yIHRoaXMgdW5pdCAqLworCWNvbW1hbmRfcGFja2V0ID0gKFRXX0NvbW1hbmQgKil0d19kZXYtPmNvbW1hbmRfcGFja2V0X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAoY29tbWFuZF9wYWNrZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3Bfc3luY2hyb25pemVfY2FjaGUoKTogQmFkIGNvbW1hbmQgcGFja2V0IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwltZW1zZXQoY29tbWFuZF9wYWNrZXQsIDAsIHNpemVvZihUV19TZWN0b3IpKTsKKwljb21tYW5kX3BhY2tldC0+b3Bjb2RlX19zZ2xvZmZzZXQgPSBUV19PUFNHTF9JTigwLCBUV19PUF9GTFVTSF9DQUNIRSk7CisJY29tbWFuZF9wYWNrZXQtPnNpemUgPSAyOworCWNvbW1hbmRfcGFja2V0LT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKwljb21tYW5kX3BhY2tldC0+dW5pdF9faG9zdGlkID0gVFdfVU5JVEhPU1RfSU4oMCwgdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmRldmljZS0+aWQpOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNpY2FsX2FkZHJlc3NbcmVxdWVzdF9pZF07CisJaWYgKGNvbW1hbmRfcXVlX3ZhbHVlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3N5bmNocm9uaXplX2NhY2hlKCk6IEJhZCBjb21tYW5kIHBhY2tldCBwaHlzaWNhbCBhZGRyZXNzLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIE5vdyB0cnkgdG8gcG9zdCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KKwl0d19wb3N0X2NvbW1hbmRfcGFja2V0KHR3X2RldiwgcmVxdWVzdF9pZCk7CisKKwlyZXR1cm4gMDsKK30gLyogRW5kIHR3X3Njc2lvcF9zeW5jaHJvbml6ZV9jYWNoZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGVzdCB1bml0IHJlYWR5IHNjc2kgY29tbWFuZCAqLworc3RhdGljIGludCB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5KFRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiwgaW50IHJlcXVlc3RfaWQpCit7CisJVFdfUGFyYW0gKnBhcmFtOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCXVuc2lnbmVkIGxvbmcgY29tbWFuZF9xdWVfdmFsdWU7CisJdW5zaWduZWQgbG9uZyBwYXJhbV92YWx1ZTsKKworCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKVxuIik7CisKKwkvKiBJbml0aWFsaXplIGNvbW1hbmQgcGFja2V0ICovCisJY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZCAqKXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3BhY2tldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKTogQmFkIGNvbW1hbmQgcGFja2V0IHZpcnR1YWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtc2V0KGNvbW1hbmRfcGFja2V0LCAwLCBzaXplb2YoVFdfU2VjdG9yKSk7CisJY29tbWFuZF9wYWNrZXQtPm9wY29kZV9fc2dsb2Zmc2V0ID0gVFdfT1BTR0xfSU4oMiwgVFdfT1BfR0VUX1BBUkFNKTsKKwljb21tYW5kX3BhY2tldC0+c2l6ZSA9IDQ7CisJY29tbWFuZF9wYWNrZXQtPnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkOworCWNvbW1hbmRfcGFja2V0LT5zdGF0dXMgPSAwOworCWNvbW1hbmRfcGFja2V0LT5mbGFncyA9IDA7CisJY29tbWFuZF9wYWNrZXQtPmJ5dGU2LnBhcmFtZXRlcl9jb3VudCA9IDE7CisKKwkvKiBOb3cgc2V0dXAgdGhlIHBhcmFtICovCisJaWYgKHR3X2Rldi0+YWxpZ25tZW50X3ZpcnR1YWxfYWRkcmVzc1tyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKFRXX1NlY3RvcikpOworCXBhcmFtLT50YWJsZV9pZCA9IDM7CSAvKiB1bml0IHN1bW1hcnkgdGFibGUgKi8KKwlwYXJhbS0+cGFyYW1ldGVyX2lkID0gMzsgLyogdW5pdHNzdGF0dXMgcGFyYW1ldGVyICovCisJcGFyYW0tPnBhcmFtZXRlcl9zaXplX2J5dGVzID0gVFdfTUFYX1VOSVRTOworCXBhcmFtX3ZhbHVlID0gdHdfZGV2LT5hbGlnbm1lbnRfcGh5c2ljYWxfYWRkcmVzc1tyZXF1ZXN0X2lkXTsKKwlpZiAocGFyYW1fdmFsdWUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5KCk6IEJhZCBhbGlnbm1lbnQgcGh5c2ljYWwgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTgucGFyYW0uc2dsWzBdLmFkZHJlc3MgPSBwYXJhbV92YWx1ZTsKKwljb21tYW5kX3BhY2tldC0+Ynl0ZTgucGFyYW0uc2dsWzBdLmxlbmd0aCA9IHNpemVvZihUV19TZWN0b3IpOworCWNvbW1hbmRfcXVlX3ZhbHVlID0gdHdfZGV2LT5jb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChjb21tYW5kX3F1ZV92YWx1ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHkoKTogQmFkIGNvbW1hbmQgcGFja2V0IHBoeXNpY2FsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTm93IHRyeSB0byBwb3N0IHRoZSBjb21tYW5kIHBhY2tldCAqLworCXR3X3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkKTsKKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBpc3IgdG8gY29tcGxldGUgYSB0ZXN0dW5pdHJlYWR5IGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeV9jb21wbGV0ZShUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYsIGludCByZXF1ZXN0X2lkKQoreworCXVuc2lnbmVkIGNoYXIgKmlzX3VuaXRfcHJlc2VudDsKKwlUV19QYXJhbSAqcGFyYW07CisKKwlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeV9jb21wbGV0ZSgpXG4iKTsKKworCXBhcmFtID0gKFRXX1BhcmFtICopdHdfZGV2LT5hbGlnbm1lbnRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCWlmIChwYXJhbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X3Njc2lvcF90ZXN0X3VuaXRfcmVhZHlfY29tcGxldGUoKTogQmFkIGFsaWdubWVudCB2aXJ0dWFsIGFkZHJlc3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlzX3VuaXRfcHJlc2VudCA9ICYocGFyYW0tPmRhdGFbMF0pOworCisJaWYgKGlzX3VuaXRfcHJlc2VudFt0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZF0gJiBUV19VTklUX09OTElORSkgeworCQl0d19kZXYtPmlzX3VuaXRfcHJlc2VudFt0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+ZGV2aWNlLT5pZF0gPSAxOworCX0gZWxzZSB7CisJCXR3X2Rldi0+aXNfdW5pdF9wcmVzZW50W3R3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5kZXZpY2UtPmlkXSA9IDA7CisJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQlyZXR1cm4gVFdfSVNSX0RPTlRfUkVTVUxUOworCX0KKworCXJldHVybiAwOworfSAvKiBFbmQgdHdfc2NzaW9wX3Rlc3RfdW5pdF9yZWFkeV9jb21wbGV0ZSgpICovCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gc2NzaSBxdWV1ZSBmdW5jdGlvbiB0byBoYW5kbGUgc2NzaSBvcGNvZGVzICovCitzdGF0aWMgaW50IHR3X3Njc2lfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKSAKK3sKKwl1bnNpZ25lZCBjaGFyICpjb21tYW5kID0gU0NwbnQtPmNtbmQ7CisJaW50IHJlcXVlc3RfaWQgPSAwOworCWludCByZXR2YWwgPSAxOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBTYXZlIGRvbmUgZnVuY3Rpb24gaW50byBTY3NpX0NtbmQgc3RydWN0ICovCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJCSAKKwkvKiBRdWV1ZSB0aGUgY29tbWFuZCBhbmQgZ2V0IGEgcmVxdWVzdCBpZCAqLworCXR3X3N0YXRlX3JlcXVlc3Rfc3RhcnQodHdfZGV2LCAmcmVxdWVzdF9pZCk7CisKKwkvKiBTYXZlIHRoZSBzY3NpIGNvbW1hbmQgZm9yIHVzZSBieSB0aGUgSVNSICovCisJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPSBTQ3BudDsKKworCS8qIEluaXRpYWxpemUgcGhhc2UgdG8gemVybyAqLworCVNDcG50LT5TQ3AucGhhc2UgPSBUV19QSEFTRV9JTklUSUFMOworCisJc3dpdGNoICgqY29tbWFuZCkgeworCQljYXNlIFJFQURfMTA6CisJCWNhc2UgUkVBRF82OgorCQljYXNlIFdSSVRFXzEwOgorCQljYXNlIFdSSVRFXzY6CisJCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3NpX3F1ZXVlKCk6IGNhdWdodCBSRUFEL1dSSVRFLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3BfcmVhZF93cml0ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9xdWV1ZSgpOiBjYXVnaHQgVEVTVF9VTklUX1JFQURZLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5KHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBJTlFVSVJZOgorCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9xdWV1ZSgpOiBjYXVnaHQgSU5RVUlSWS5cbiIpOworCQkJcmV0dmFsID0gdHdfc2NzaW9wX2lucXVpcnkodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19zY3NpX3F1ZXVlKCk6IGNhdWdodCBSRUFEX0NBUEFDSVRZLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3BfcmVhZF9jYXBhY2l0eSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJYnJlYWs7CisJICAgICAgICBjYXNlIFJFUVVFU1RfU0VOU0U6CisJCSAgICAgICAgZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfc2NzaV9xdWV1ZSgpOiBjYXVnaHQgUkVRVUVTVF9TRU5TRS5cbiIpOworCQkgICAgICAgIHJldHZhbCA9IHR3X3Njc2lvcF9yZXF1ZXN0X3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCSAgICAgICAgYnJlYWs7CisJCWNhc2UgTU9ERV9TRU5TRToKKwkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lfcXVldWUoKTogY2F1Z2h0IE1PREVfU0VOU0UuXG4iKTsKKwkJCXJldHZhbCA9IHR3X3Njc2lvcF9tb2RlX3NlbnNlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X3Njc2lfcXVldWUoKTogY2F1Z2h0IFNZTkNIUk9OSVpFX0NBQ0hFLlxuIik7CisJCQlyZXR2YWwgPSB0d19zY3Npb3Bfc3luY2hyb25pemVfY2FjaGUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCWJyZWFrOworCQljYXNlIFRXX0lPQ1RMOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQgZGVwcmVjYXRlZCwgcGxlYXNlIHVwZGF0ZSB5b3VyIDN3YXJlIHRvb2xzLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogc2NzaSVkOiBVbmtub3duIHNjc2kgb3Bjb2RlOiAweCV4XG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8sICpjb21tYW5kKTsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCXR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQlTQ3BudC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCWRvbmUoU0NwbnQpOworCQkJcmV0dmFsID0gMDsKKwl9CisJaWYgKHJldHZhbCkgeworCQl0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdID0gVFdfU19DT01QTEVURUQ7CisJCXR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCVNDcG50LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJZG9uZShTQ3BudCk7CisJCXJldHZhbCA9IDA7CisJfQorCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d19zY3NpX3F1ZXVlKCkgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IHR3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIAoreworCWludCByZXF1ZXN0X2lkOworCXUzMiBzdGF0dXNfcmVnX3ZhbHVlOworCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopZGV2X2luc3RhbmNlOworCVRXX1Jlc3BvbnNlX1F1ZXVlIHJlc3BvbnNlX3F1ZTsKKwlpbnQgZXJyb3IgPSAwLCByZXR2YWwgPSAwOworCVRXX0NvbW1hbmQgKmNvbW1hbmRfcGFja2V0OworCWludCBoYW5kbGVkID0gMDsKKworCS8qIEdldCB0aGUgaG9zdCBsb2NrIGZvciBpbyBjb21wbGV0aW9ucyAqLworCXNwaW5fbG9jayh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKiBSZWFkIHRoZSByZWdpc3RlcnMgKi8KKwlzdGF0dXNfcmVnX3ZhbHVlID0gaW5sKFRXX1NUQVRVU19SRUdfQUREUih0d19kZXYpKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgb3VyIGludGVycnVwdCwgb3RoZXJ3aXNlIGJhaWwgKi8KKwlpZiAoIShzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCkpCisJCWdvdG8gdHdfaW50ZXJydXB0X2JhaWw7CisKKwloYW5kbGVkID0gMTsKKworCS8qIENoZWNrIGNvbnRyb2xsZXIgZm9yIGVycm9ycyAqLworCWlmICh0d19jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiB0d19pbnRlcnJ1cHQoKTogVW5leHBlY3RlZCBiaXRzLlxuIik7CisJCWlmICh0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDEpKSB7CisJCQlUV19DTEVBUl9BTExfSU5URVJSVVBUUyh0d19kZXYpOworCQkJZ290byB0d19pbnRlcnJ1cHRfYmFpbDsKKwkJfQorCX0KKworCS8qIEhhbmRsZSBob3N0IGludGVycnVwdCAqLworCWlmIChzdGF0dXNfcmVnX3ZhbHVlICYgVFdfU1RBVFVTX0hPU1RfSU5URVJSVVBUKSB7CisJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBSZWNlaXZlZCBob3N0IGludGVycnVwdC5cbiIpOworCQlUV19DTEVBUl9IT1NUX0lOVEVSUlVQVCh0d19kZXYpOworCX0KKworCS8qIEhhbmRsZSBhdHRlbnRpb24gaW50ZXJydXB0ICovCisJaWYgKHN0YXR1c19yZWdfdmFsdWUgJiBUV19TVEFUVVNfQVRURU5USU9OX0lOVEVSUlVQVCkgeworCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19pbnRlcnJ1cHQoKTogUmVjZWl2ZWQgYXR0ZW50aW9uIGludGVycnVwdC5cbiIpOworCQlUV19DTEVBUl9BVFRFTlRJT05fSU5URVJSVVBUKHR3X2Rldik7CisJCXR3X3N0YXRlX3JlcXVlc3Rfc3RhcnQodHdfZGV2LCAmcmVxdWVzdF9pZCk7CisJCWVycm9yID0gdHdfYWVuX3JlYWRfcXVldWUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJaWYgKGVycm9yKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpJWQ6IEVycm9yIHJlYWRpbmcgYWVuIHF1ZXVlLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCXR3X3N0YXRlX3JlcXVlc3RfZmluaXNoKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgY29tbWFuZCBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19DT01NQU5EX0lOVEVSUlVQVCkgeworCQkvKiBEcmFpbiBhcyBtYW55IHBlbmRpbmcgY29tbWFuZHMgYXMgd2UgY2FuICovCisJCXdoaWxlICh0d19kZXYtPnBlbmRpbmdfcmVxdWVzdF9jb3VudCA+IDApIHsKKwkJCXJlcXVlc3RfaWQgPSB0d19kZXYtPnBlbmRpbmdfcXVldWVbdHdfZGV2LT5wZW5kaW5nX2hlYWRdOworCQkJaWYgKHR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gIT0gVFdfU19QRU5ESU5HKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBGb3VuZCByZXF1ZXN0IGlkIHRoYXQgd2Fzbid0IHBlbmRpbmcuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR3X3Bvc3RfY29tbWFuZF9wYWNrZXQodHdfZGV2LCByZXF1ZXN0X2lkKT09MCkgeworCQkJCWlmICh0d19kZXYtPnBlbmRpbmdfaGVhZCA9PSBUV19RX0xFTkdUSC0xKSB7CisJCQkJCXR3X2Rldi0+cGVuZGluZ19oZWFkID0gVFdfUV9TVEFSVDsKKwkJCQl9IGVsc2UgeworCQkJCQl0d19kZXYtPnBlbmRpbmdfaGVhZCA9IHR3X2Rldi0+cGVuZGluZ19oZWFkICsgMTsKKwkJCQl9CisJCQkJdHdfZGV2LT5wZW5kaW5nX3JlcXVlc3RfY291bnQtLTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSWYgd2UgZ2V0IGhlcmUsIHdlIHdpbGwgY29udGludWUgcmUtcG9zdGluZyBvbiB0aGUgbmV4dCBjb21tYW5kIGludGVycnVwdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHBlbmRpbmcgcmVxdWVzdHMsIHdlIG1hc2sgY29tbWFuZCBpbnRlcnJ1cHQgKi8KKwkJaWYgKHR3X2Rldi0+cGVuZGluZ19yZXF1ZXN0X2NvdW50ID09IDApIAorCQkJVFdfTUFTS19DT01NQU5EX0lOVEVSUlVQVCh0d19kZXYpOworCX0KKworCS8qIEhhbmRsZSByZXNwb25zZSBpbnRlcnJ1cHQgKi8KKwlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19SRVNQT05TRV9JTlRFUlJVUFQpIHsKKwkJLyogRHJhaW4gdGhlIHJlc3BvbnNlIHF1ZXVlIGZyb20gdGhlIGJvYXJkICovCisJCXdoaWxlICgoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19SRVNQT05TRV9RVUVVRV9FTVBUWSkgPT0gMCkgeworCQkJLyogUmVhZCByZXNwb25zZSBxdWV1ZSByZWdpc3RlciAqLworCQkJcmVzcG9uc2VfcXVlLnZhbHVlID0gaW5sKFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJcmVxdWVzdF9pZCA9IFRXX1JFU0lEX09VVChyZXNwb25zZV9xdWUucmVzcG9uc2VfaWQpOworCQkJY29tbWFuZF9wYWNrZXQgPSAoVFdfQ29tbWFuZCAqKXR3X2Rldi0+Y29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW3JlcXVlc3RfaWRdOworCQkJZXJyb3IgPSAwOworCisJCQkvKiBDaGVjayBmb3IgYmFkIHJlc3BvbnNlICovCisJCQlpZiAoY29tbWFuZF9wYWNrZXQtPnN0YXR1cyAhPSAwKSB7CisJCQkJLyogSWYgaW50ZXJuYWwgY29tbWFuZCwgZG9uJ3QgZXJyb3IsIGRvbid0IGZpbGwgc2Vuc2UgKi8KKwkJCQlpZiAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0gPT0gTlVMTCkgeworCQkJCQl0d19kZWNvZGVfc2Vuc2UodHdfZGV2LCByZXF1ZXN0X2lkLCAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnJvciA9IHR3X2RlY29kZV9zZW5zZSh0d19kZXYsIHJlcXVlc3RfaWQsIDEpOworCQkJCX0KKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIGNvcnJlY3Qgc3RhdGUgKi8KKwkJCWlmICh0d19kZXYtPnN0YXRlW3JlcXVlc3RfaWRdICE9IFRXX1NfUE9TVEVEKSB7CisJCQkJaWYgKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdICE9IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBSZWNlaXZlZCBhIHJlcXVlc3QgaWQgdGhhdCB3YXNuJ3QgcG9zdGVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKKwkJCQkJZXJyb3IgPSAxOworCQkJCX0KKwkJCX0KKworCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IFJlc3BvbnNlIHF1ZXVlIHJlcXVlc3QgaWQ6ICVkLlxuIiwgcmVxdWVzdF9pZCk7CisKKwkJCS8qIENoZWNrIGZvciBpbnRlcm5hbCBjb21tYW5kIGNvbXBsZXRpb24gKi8KKwkJCWlmICh0d19kZXYtPnNyYltyZXF1ZXN0X2lkXSA9PSBOVUxMKSB7CisJCQkJZHByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBGb3VuZCBpbnRlcm5hbGx5IHBvc3RlZCBjb21tYW5kLlxuIik7CisJCQkJLyogQ2hlY2sgZm9yIGNocmRldiBpb2N0bCBjb21wbGV0aW9uICovCisJCQkJaWYgKHJlcXVlc3RfaWQgIT0gdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCkgeworCQkJCQlyZXR2YWwgPSB0d19hZW5fY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQkJaWYgKHJldHZhbCkgeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBFcnJvciBjb21wbGV0aW5nIGFlbi5cbiIsIHR3X2Rldi0+aG9zdC0+aG9zdF9ubyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID0gVFdfSU9DVExfQ0hSREVWX0ZSRUU7CisJCQkJCXdha2VfdXAoJnR3X2Rldi0+aW9jdGxfd3F1ZXVlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAodHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPmNtbmRbMF0pIHsKKwkJCQljYXNlIFJFQURfMTA6CisJCQkJY2FzZSBSRUFEXzY6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgUkVBRF8xMC9SRUFEXzZcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdSSVRFXzEwOgorCQkJCWNhc2UgV1JJVEVfNjoKKwkJCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IGNhdWdodCBXUklURV8xMC9XUklURV82XG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgVEVTVF9VTklUX1JFQURZXG4iKTsKKwkJCQkJZXJyb3IgPSB0d19zY3Npb3BfdGVzdF91bml0X3JlYWR5X2NvbXBsZXRlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSU5RVUlSWToKKwkJCQkJZHByaW50ayhLRVJOX05PVElDRSAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IGNhdWdodCBJTlFVSVJZXG4iKTsKKwkJCQkJZXJyb3IgPSB0d19zY3Npb3BfaW5xdWlyeV9jb21wbGV0ZSh0d19kZXYsIHJlcXVlc3RfaWQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgUkVBRF9DQVBBQ0lUWVxuIik7CisJCQkJCWVycm9yID0gdHdfc2NzaW9wX3JlYWRfY2FwYWNpdHlfY29tcGxldGUodHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNT0RFX1NFTlNFOgorCQkJCQlkcHJpbnRrKEtFUk5fTk9USUNFICIzdy14eHh4OiB0d19pbnRlcnJ1cHQoKTogY2F1Z2h0IE1PREVfU0VOU0VcbiIpOworCQkJCQllcnJvciA9IHR3X3Njc2lvcF9tb2RlX3NlbnNlX2NvbXBsZXRlKHR3X2RldiwgcmVxdWVzdF9pZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CisJCQkJCWRwcmludGsoS0VSTl9OT1RJQ0UgIjN3LXh4eHg6IHR3X2ludGVycnVwdCgpOiBjYXVnaHQgU1lOQ0hST05JWkVfQ0FDSEVcbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBjYXNlIHNsaXAgaW4gdHdfaW50ZXJydXB0KClcbiIpOworCQkJCQllcnJvciA9IDE7CisJCQkJfQorCisJCQkJLyogSWYgbm8gZXJyb3IgY29tbWFuZCB3YXMgYSBzdWNjZXNzICovCisJCQkJaWYgKGVycm9yID09IDApIHsKKwkJCQkJdHdfZGV2LT5zcmJbcmVxdWVzdF9pZF0tPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJCX0KKworCQkJCS8qIElmIGVycm9yLCBjb21tYW5kIGZhaWxlZCAqLworCQkJCWlmIChlcnJvciA9PSAxKSB7CisJCQkJCS8qIEFzayBmb3IgYSBob3N0IHJlc2V0ICovCisJCQkJCXR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisJCQkJfQorCisJCQkJLyogTm93IGNvbXBsZXRlIHRoZSBpbyAqLworCQkJCWlmICgoZXJyb3IgIT0gVFdfSVNSX0RPTlRfQ09NUExFVEUpKSB7CisJCQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKKwkJCQkJdHdfc3RhdGVfcmVxdWVzdF9maW5pc2godHdfZGV2LCByZXF1ZXN0X2lkKTsKKwkJCQkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudC0tOworCQkJCQl0d19kZXYtPnNyYltyZXF1ZXN0X2lkXS0+c2NzaV9kb25lKHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJCQkJCisJCQkJCXR3X3VubWFwX3Njc2lfZGF0YSh0d19kZXYtPnR3X3BjaV9kZXYsIHR3X2Rldi0+c3JiW3JlcXVlc3RfaWRdKTsKKwkJCQl9CisJCQl9CisJCQkJCisJCQkvKiBDaGVjayBmb3IgdmFsaWQgc3RhdHVzIGFmdGVyIGVhY2ggZHJhaW4gKi8KKwkJCXN0YXR1c19yZWdfdmFsdWUgPSBpbmwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKHR3X2NoZWNrX2JpdHMoc3RhdHVzX3JlZ192YWx1ZSkpIHsKKwkJCQlkcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogdHdfaW50ZXJydXB0KCk6IFVuZXhwZWN0ZWQgYml0cy5cbiIpOworCQkJCWlmICh0d19kZWNvZGVfYml0cyh0d19kZXYsIHN0YXR1c19yZWdfdmFsdWUsIDEpKSB7CisJCQkJCVRXX0NMRUFSX0FMTF9JTlRFUlJVUFRTKHR3X2Rldik7CisJCQkJCWdvdG8gdHdfaW50ZXJydXB0X2JhaWw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCit0d19pbnRlcnJ1cHRfYmFpbDoKKwlzcGluX3VubG9jayh0d19kZXYtPmhvc3QtPmhvc3RfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9IC8qIEVuZCB0d19pbnRlcnJ1cHQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHNodXQgZG93biAqLworc3RhdGljIHZvaWQgX190d19zaHV0ZG93bihUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJVFdfRElTQUJMRV9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBTaHV0dGluZyBkb3duIGhvc3QgJWQuXG4iLCB0d19kZXYtPmhvc3QtPmhvc3Rfbm8pOworCisJLyogVGVsbCB0aGUgY2FyZCB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworCWlmICh0d19pbml0Y29ubmVjdGlvbih0d19kZXYsIDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IENvbm5lY3Rpb24gc2h1dGRvd24gZmFpbGVkLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogU2h1dGRvd24gY29tcGxldGUuXG4iKTsKKwl9CisKKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyBqdXN0IGJlZm9yZSBleGl0ICovCisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7Cit9IC8qIEVuZCBfX3R3X3NodXRkb3duKCkgKi8KKworLyogV3JhcHBlciBmb3IgX190d19zaHV0ZG93biAqLworc3RhdGljIHZvaWQgdHdfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXYgPSAoVFdfRGV2aWNlX0V4dGVuc2lvbiAqKWhvc3QtPmhvc3RkYXRhOworCisJX190d19zaHV0ZG93bih0d19kZXYpOworfSAvKiBFbmQgdHdfc2h1dGRvd24oKSAqLworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICIzd2FyZSBTdG9yYWdlIENvbnRyb2xsZXIiLAorCS5xdWV1ZWNvbW1hbmQJCT0gdHdfc2NzaV9xdWV1ZSwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gdHdfc2NzaV9laF9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSB0d19zY3NpX2Jpb3NwYXJhbSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gdHdfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jYW5fcXVldWUJCT0gVFdfUV9MRU5HVEgtMiwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IFRXX01BWF9TR0xfTEVOR1RILAorCS5tYXhfc2VjdG9ycwkJPSBUV19NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gVFdfTUFYX0NNRFNfUEVSX0xVTiwJCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5zaG9zdF9hdHRycwkJPSB0d19ob3N0X2F0dHJzLAorCS5lbXVsYXRlZAkJPSAxCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvYmUgYW5kIGluaXRpYWxpemUgYSBjYXJkICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0d19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKKwlUV19EZXZpY2VfRXh0ZW5zaW9uICp0d19kZXY7CisJaW50IHJldHZhbCA9IC1FTk9ERVY7CisKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEZhaWxlZCB0byBlbmFibGUgcGNpIGRldmljZS4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXR2YWwgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIFRXX0RNQV9NQVNLKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEZhaWxlZCB0byBzZXQgZG1hIG1hc2suIik7CisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCX0KKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKFRXX0RldmljZV9FeHRlbnNpb24pKTsKKwlpZiAoIWhvc3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIGV4dGVuc2lvbi4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCXR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CisKKwltZW1zZXQodHdfZGV2LCAwLCBzaXplb2YoVFdfRGV2aWNlX0V4dGVuc2lvbikpOworCisJLyogU2F2ZSB2YWx1ZXMgdG8gZGV2aWNlIGV4dGVuc2lvbiAqLworCXR3X2Rldi0+aG9zdCA9IGhvc3Q7CisJdHdfZGV2LT50d19wY2lfZGV2ID0gcGRldjsKKworCWlmICh0d19pbml0aWFsaXplX2RldmljZV9leHRlbnNpb24odHdfZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgZXh0ZW5zaW9uLiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJLyogUmVxdWVzdCBJTyByZWdpb25zICovCisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiM3cteHh4eCIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogRmFpbGVkIHRvIGdldCBtZW0gcmVnaW9uLiIpOworCQlnb3RvIG91dF9mcmVlX2RldmljZV9leHRlbnNpb247CisJfQorCisJLyogU2F2ZSBiYXNlIGFkZHJlc3MgKi8KKwl0d19kZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoIXR3X2Rldi0+YmFzZV9hZGRyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjN3LXh4eHg6IEZhaWxlZCB0byBnZXQgaW8gYWRkcmVzcy4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLworCVRXX0RJU0FCTEVfSU5URVJSVVBUUyh0d19kZXYpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2FyZCAqLworCWlmICh0d19yZXNldF9zZXF1ZW5jZSh0d19kZXYpKQorCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisKKwkvKiBTZXQgaG9zdCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJaG9zdC0+bWF4X2lkID0gVFdfTUFYX1VOSVRTOworCWhvc3QtPm1heF9jbWRfbGVuID0gVFdfTUFYX0NEQl9MRU47CisKKwkvKiBMdW5zIGFuZCBjaGFubmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIgKi8KKwlob3N0LT5tYXhfbHVuID0gMDsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IDA7CisKKwkvKiBSZWdpc3RlciB0aGUgY2FyZCB3aXRoIHRoZSBrZXJuZWwgU0NTSSBsYXllciAqLworCXJldHZhbCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBzY3NpIGFkZCBob3N0IGZhaWxlZCIpOworCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiM3cteHh4eDogc2NzaSVkOiBGb3VuZCBhIDN3YXJlIFN0b3JhZ2UgQ29udHJvbGxlciBhdCAweCV4LCBJUlE6ICVkLlxuIiwgaG9zdC0+aG9zdF9ubywgdHdfZGV2LT5iYXNlX2FkZHIsIHBkZXYtPmlycSk7CisKKwkvKiBOb3cgc2V0dXAgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0d19pbnRlcnJ1cHQsIFNBX1NISVJRLCAiM3cteHh4eCIsIHR3X2Rldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBFcnJvciByZXF1ZXN0aW5nIElSUS4iKTsKKwkJZ290byBvdXRfcmVtb3ZlX2hvc3Q7CisJfQorCisJdHdfZGV2aWNlX2V4dGVuc2lvbl9saXN0W3R3X2RldmljZV9leHRlbnNpb25fY291bnRdID0gdHdfZGV2OworCXR3X2RldmljZV9leHRlbnNpb25fY291bnQrKzsKKworCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkICovCisJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisKKwkvKiBGaW5hbGx5LCBzY2FuIHRoZSBob3N0ICovCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlpZiAodHdlX21ham9yID09IC0xKSB7CisJCWlmICgodHdlX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2ICgwLCAidHdlIiwgJnR3X2ZvcHMpKSA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIzdy14eHh4OiBGYWlsZWQgdG8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZS4iKTsKKwl9CisJcmV0dXJuIDA7CisKK291dF9yZW1vdmVfaG9zdDoKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbjoKKwl0d19mcmVlX2RldmljZV9leHRlbnNpb24odHdfZGV2KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9IC8qIEVuZCB0d19wcm9iZSgpICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlbW92ZSBhIGRldmljZSAqLworc3RhdGljIHZvaWQgdHdfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKKworCXNjc2lfcmVtb3ZlX2hvc3QodHdfZGV2LT5ob3N0KTsKKworCS8qIFVucmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSAqLworCWlmICh0d2VfbWFqb3IgPj0gMCkgeworCQl1bnJlZ2lzdGVyX2NocmRldih0d2VfbWFqb3IsICJ0d2UiKTsKKwkJdHdlX21ham9yID0gLTE7CisJfQorCisJLyogRnJlZSB1cCB0aGUgSVJRICovCisJZnJlZV9pcnEodHdfZGV2LT50d19wY2lfZGV2LT5pcnEsIHR3X2Rldik7CisKKwkvKiBTaHV0ZG93biB0aGUgY2FyZCAqLworCV9fdHdfc2h1dGRvd24odHdfZGV2KTsKKworCS8qIEZyZWUgdXAgdGhlIG1lbSByZWdpb24gKi8KKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJLyogRnJlZSB1cCBkZXZpY2UgZXh0ZW5zaW9uIHJlc291cmNlcyAqLworCXR3X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbih0d19kZXYpOworCisJc2NzaV9ob3N0X3B1dCh0d19kZXYtPmhvc3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwl0d19kZXZpY2VfZXh0ZW5zaW9uX2NvdW50LS07Cit9IC8qIEVuZCB0d19yZW1vdmUoKSAqLworCisvKiBQQ0kgRGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0d19wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM1dBUkUsIFBDSV9ERVZJQ0VfSURfM1dBUkVfMTAwMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF8zV0FSRSwgUENJX0RFVklDRV9JRF8zV0FSRV83MDAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR3X3BjaV90YmwpOworCisvKiBwY2lfZHJpdmVyIGluaXRpYWxpemVyICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHdfZHJpdmVyID0geworCS5uYW1lCQk9ICIzdy14eHh4IiwKKwkuaWRfdGFibGUJPSB0d19wY2lfdGJsLAorCS5wcm9iZQkJPSB0d19wcm9iZSwKKwkucmVtb3ZlCQk9IHR3X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLnNodXRkb3duID0gdHdfc2h1dGRvd24KKwl9Cit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IHR3X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIzd2FyZSBTdG9yYWdlIENvbnRyb2xsZXIgZGV2aWNlIGRyaXZlciBmb3IgTGludXggdiVzLlxuIiwgVFdfRFJJVkVSX1ZFUlNJT04pOworCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmdHdfZHJpdmVyKTsKK30gLyogRW5kIHR3X2luaXQoKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBkcml2ZXIgZXhpdCAqLworc3RhdGljIHZvaWQgX19leGl0IHR3X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnR3X2RyaXZlcik7Cit9IC8qIEVuZCB0d19leGl0KCkgKi8KKworbW9kdWxlX2luaXQodHdfaW5pdCk7Cittb2R1bGVfZXhpdCh0d19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzN3LXh4eHguaCBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiYWQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmgKQEAgLTAsMCArMSw0MzYgQEAKKy8qIAorICAgM3cteHh4eC5oIC0tIDN3YXJlIFN0b3JhZ2UgQ29udHJvbGxlciBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAgIAorICAgV3JpdHRlbiBCeTogQWRhbSBSYWRmb3JkIDxsaW51eHJhaWRAYW1jYy5jb20+CisgICBNb2RpZmljYXRpb25zIEJ5OiBKb2VsIEphY29ic29uIDxsaW51eEAzd2FyZS5jb20+CisgICAJCSAgICAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgICAgICAgICAgICAgICAgICAgICBCcmFkIFN0cmFuZCA8bGludXhAM3dhcmUuY29tPgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSAzd2FyZSBJbmMuCisKKyAgIEtlcm5lbCBjb21wYXRpYmxpdHkgQnk6CUFuZHJlIEhlZHJpY2sgPGFuZHJlQHN1c2UuY29tPgorICAgTm9uLUNvcHlyaWdodCAoQykgMjAwMAlBbmRyZSBIZWRyaWNrIDxhbmRyZUBzdXNlLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgIAorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIE5PIFdBUlJBTlRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgICAgICAgIAorICAgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgICAgICAKKyAgIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsICAgICAgCisgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzICAgIAorICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCAgICAgICAKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyAgICAgICAgCisgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gICAgIAorICAgdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgICAgICAgICAKKyAgIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiAgCisKKyAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSAgIAorICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICAgICAgICAKKyAgIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EICAgCisgICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgICAgIAorICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSAgICAKKyAgIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCAgCisgICBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTICAgICAgICAgICAgIAorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgIAorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisKKyAgIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBsaW51eHJhaWRAYW1jYy5jb20KKyAgIAorICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvdG86CisgICBodHRwOi8vd3d3LmFtY2MuY29tCisqLworCisjaWZuZGVmIF8zV19YWFhYX0gKKyNkZWZpbmUgXzNXX1hYWFhfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEFFTiBzdHJpbmdzICovCitzdGF0aWMgY2hhciAqdHdfYWVuX3N0cmluZ1tdID0geworCVsweDAwMF0gPSAiSU5GTzogQUVOIHF1ZXVlIGVtcHR5IiwKKwlbMHgwMDFdID0gIklORk86IFNvZnQgcmVzZXQgb2NjdXJyZWQiLAorCVsweDAwMl0gPSAiRVJST1I6IFVuaXQgZGVncmFkZWQ6IFVuaXQgIyIsCisJWzB4MDAzXSA9ICJFUlJPUjogQ29udHJvbGxlciBlcnJvciIsCisJWzB4MDA0XSA9ICJFUlJPUjogUmVidWlsZCBmYWlsZWQ6IFVuaXQgIyIsCisJWzB4MDA1XSA9ICJJTkZPOiBSZWJ1aWxkIGNvbXBsZXRlOiBVbml0ICMiLAorCVsweDAwNl0gPSAiRVJST1I6IEluY29tcGxldGUgdW5pdCBkZXRlY3RlZDogVW5pdCAjIiwKKwlbMHgwMDddID0gIklORk86IEluaXRpYWxpemF0aW9uIGNvbXBsZXRlOiBVbml0ICMiLAorCVsweDAwOF0gPSAiV0FSTklORzogVW5jbGVhbiBzaHV0ZG93biBkZXRlY3RlZDogVW5pdCAjIiwKKwlbMHgwMDldID0gIldBUk5JTkc6IEFUQSBwb3J0IHRpbWVvdXQ6IFBvcnQgIyIsCisJWzB4MDBBXSA9ICJFUlJPUjogRHJpdmUgZXJyb3I6IFBvcnQgIyIsCisJWzB4MDBCXSA9ICJJTkZPOiBSZWJ1aWxkIHN0YXJ0ZWQ6IFVuaXQgIyIsCisJWzB4MDBDXSA9ICJJTkZPOiBJbml0aWFsaXphdGlvbiBzdGFydGVkOiBVbml0ICMiLAorCVsweDAwRF0gPSAiRVJST1I6IExvZ2ljYWwgdW5pdCBkZWxldGVkOiBVbml0ICMiLAorCVsweDAwRl0gPSAiV0FSTklORzogU01BUlQgdGhyZXNob2xkIGV4Y2VlZGVkOiBQb3J0ICMiLAorCVsweDAyMV0gPSAiV0FSTklORzogQVRBIFVETUEgZG93bmdyYWRlOiBQb3J0ICMiLAorCVsweDAyMV0gPSAiV0FSTklORzogQVRBIFVETUEgdXBncmFkZTogUG9ydCAjIiwKKwlbMHgwMjNdID0gIldBUk5JTkc6IFNlY3RvciByZXBhaXIgb2NjdXJyZWQ6IFBvcnQgIyIsCisJWzB4MDI0XSA9ICJFUlJPUjogU0JVRiBpbnRlZ3JpdHkgY2hlY2sgZmFpbHVyZSIsCisJWzB4MDI1XSA9ICJFUlJPUjogTG9zdCBjYWNoZWQgd3JpdGU6IFBvcnQgIyIsCisJWzB4MDI2XSA9ICJFUlJPUjogRHJpdmUgRUNDIGVycm9yIGRldGVjdGVkOiBQb3J0ICMiLAorCVsweDAyN10gPSAiRVJST1I6IERDQiBjaGVja3N1bSBlcnJvcjogUG9ydCAjIiwKKwlbMHgwMjhdID0gIkVSUk9SOiBEQ0IgdW5zdXBwb3J0ZWQgdmVyc2lvbjogUG9ydCAjIiwKKwlbMHgwMjldID0gIklORk86IFZlcmlmeSBzdGFydGVkOiBVbml0ICMiLAorCVsweDAyQV0gPSAiRVJST1I6IFZlcmlmeSBmYWlsZWQ6IFBvcnQgIyIsCisJWzB4MDJCXSA9ICJJTkZPOiBWZXJpZnkgY29tcGxldGU6IFVuaXQgIyIsCisJWzB4MDJDXSA9ICJXQVJOSU5HOiBPdmVyd3JvdGUgYmFkIHNlY3RvciBkdXJpbmcgcmVidWlsZDogUG9ydCAjIiwKKwlbMHgwMkRdID0gIkVSUk9SOiBFbmNvdW50ZXJlZCBiYWQgc2VjdG9yIGR1cmluZyByZWJ1aWxkOiBQb3J0ICMiLAorCVsweDAyRV0gPSAiRVJST1I6IFJlcGxhY2VtZW50IGRyaXZlIGlzIHRvbyBzbWFsbDogUG9ydCAjIiwKKwlbMHgwMkZdID0gIldBUk5JTkc6IFZlcmlmeSBlcnJvcjogVW5pdCBub3QgcHJldmlvdXNseSBpbml0aWFsaXplZDogVW5pdCAjIiwKKwlbMHgwMzBdID0gIkVSUk9SOiBEcml2ZSBub3Qgc3VwcG9ydGVkOiBQb3J0ICMiCit9OworCisvKgorICAgU2Vuc2Uga2V5IGxvb2t1cCB0YWJsZQorICAgRm9ybWF0OiBFU0RDL2ZsYWdzLFNlbnNlS2V5LEFkZGl0aW9uYWxTZW5zZUNvZGUsQWRkaXRpb25hbFNlbnNlQ29kZVF1YWxpZmllcgorKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR3X3NlbnNlX3RhYmxlW11bNF0gPQoreworICAvKiBDb2RlcyBmb3IgbmV3ZXIgZmlybXdhcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBVEEgRXJyb3IgICAgICAgICAgICAgICAgICAgIFNDU0kgRXJyb3IKKyAgezB4MDEsIDB4MDMsIDB4MTMsIDB4MDB9LCAvLyBBZGRyZXNzIG1hcmsgbm90IGZvdW5kICAgICAgIEFkZHJlc3MgbWFyayBub3QgZm91bmQgZm9yIGRhdGEgZmllbGQKKyAgezB4MDQsIDB4MGIsIDB4MDAsIDB4MDB9LCAvLyBBYm9ydGVkIGNvbW1hbmQgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorICB7MHgxMCwgMHgwYiwgMHgxNCwgMHgwMH0sIC8vIElEIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZAorICB7MHg0MCwgMHgwMywgMHgxMSwgMHgwMH0sIC8vIFVuY29ycmVjdGFibGUgRUNDIGVycm9yICAgICAgVW5yZWNvdmVyZWQgcmVhZCBlcnJvcgorICB7MHg2MSwgMHgwNCwgMHgwMCwgMHgwMH0sIC8vIERldmljZSBmYXVsdCAgICAgICAgICAgICAgICAgSGFyZHdhcmUgZXJyb3IKKyAgezB4ODQsIDB4MGIsIDB4NDcsIDB4MDB9LCAvLyBEYXRhIENSQyBlcnJvciAgICAgICAgICAgICAgIFNDU0kgcGFyaXR5IGVycm9yCisgIHsweGQwLCAweDBiLCAweDAwLCAweDAwfSwgLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKKyAgezB4ZDEsIDB4MGIsIDB4MDAsIDB4MDB9LCAvLyBEZXZpY2UgYnVzeSAgICAgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorICB7MHgzNywgMHgwMiwgMHgwNCwgMHgwMH0sIC8vIFVuaXQgb2ZmbGluZSAgICAgICAgICAgICAgICAgTm90IHJlYWR5CisgIHsweDA5LCAweDAyLCAweDA0LCAweDAwfSwgLy8gVW5yZWNvdmVyZWQgZGlzayBlcnJvciAgICAgICBOb3QgcmVhZHkKKworICAvKiBDb2RlcyBmb3Igb2xkZXIgZmlybXdhcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzd2FyZSBFcnJvciAgICAgICAgICAgICAgICAgIFNDU0kgRXJyb3IKKyAgezB4NTEsIDB4MGIsIDB4MDAsIDB4MDB9ICAvLyBVbnNwZWNpZmllZCAgICAgICAgICAgICAgICAgIEFib3J0ZWQgY29tbWFuZAorfTsKKworLyogQ29udHJvbCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9IT1NUX0lOVEVSUlVQVAkgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQgICAweDAwMDQwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUV19DT05UUk9MX1VOTUFTS19DT01NQU5EX0lOVEVSUlVQVCAgICAweDAwMDA4MDAwCisjZGVmaW5lIFRXX0NPTlRST0xfVU5NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9FUlJPUl9TVEFUVVMJICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9JU1NVRV9TT0ZUX1JFU0VUCSAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFRXX0NPTlRST0xfRU5BQkxFX0lOVEVSUlVQVFMJICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgVFdfQ09OVFJPTF9ESVNBQkxFX0lOVEVSUlVQVFMJICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9JU1NVRV9IT1NUX0lOVEVSUlVQVAkgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX1BBUklUWV9FUlJPUiAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFRXX0NPTlRST0xfQ0xFQVJfUVVFVUVfRVJST1IgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgVFdfQ09OVFJPTF9DTEVBUl9QQ0lfQUJPUlQgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBUV19DT05UUk9MX0NMRUFSX1NCVUZfV1JJVEVfRVJST1IgICAgICAweDAwMDAwMDA4CisKKy8qIFN0YXR1cyByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVFdfU1RBVFVTX01BSk9SX1ZFUlNJT05fTUFTSwkgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfTUlOT1JfVkVSU0lPTl9NQVNLCSAgICAgICAweDBGMDAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19QQ0lfUEFSSVRZX0VSUk9SCSAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19RVUVVRV9FUlJPUgkJICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9FUlJPUgkgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfUENJX0FCT1JUCQkgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBUV19TVEFUVVNfSE9TVF9JTlRFUlJVUFQJICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0FUVEVOVElPTl9JTlRFUlJVUFQJICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0NPTU1BTkRfSU5URVJSVVBUCSAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19SRVNQT05TRV9JTlRFUlJVUFQJICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0NPTU1BTkRfUVVFVUVfRlVMTAkgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBUV19TVEFUVVNfUkVTUE9OU0VfUVVFVUVfRU1QVFkJICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX01JQ1JPQ09OVFJPTExFUl9SRUFEWQkgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUV19TVEFUVVNfQ09NTUFORF9RVUVVRV9FTVBUWQkgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBUV19TVEFUVVNfQUxMX0lOVEVSUlVQVFMJICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgVFdfU1RBVFVTX0NMRUFSQUJMRV9CSVRTCSAgICAgICAweDAwRDAwMDAwCisjZGVmaW5lIFRXX1NUQVRVU19FWFBFQ1RFRF9CSVRTCQkgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUV19TVEFUVVNfVU5FWFBFQ1RFRF9CSVRTCSAgICAgICAweDAwRjAwMDA4CisjZGVmaW5lIFRXX1NUQVRVU19TQlVGX1dSSVRFX0VSUk9SICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFdfU1RBVFVTX1ZBTElEX0lOVEVSUlVQVCAgICAgICAgICAgICAgMHgwMERGMDAwOAorCisvKiBSRVNQT05TRSBRVUVVRSBCSVQgREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgVFdfUkVTUE9OU0VfSURfTUFTSwkJICAgICAgIDB4MDAwMDBGRjAKKworLyogUENJIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBUV19JT19BRERSRVNTX1JBTkdFCQkgICAgICAgMHgxMAorI2RlZmluZSBUV19ERVZJQ0VfTkFNRQkJCSAgICAgICAiM3dhcmUgU3RvcmFnZSBDb250cm9sbGVyIgorI2RlZmluZSBUV19WRU5ET1JfSUQgKDB4MTNDMSkJLyogM3dhcmUgKi8KKyNkZWZpbmUgVFdfREVWSUNFX0lEICgweDEwMDApCS8qIFN0b3JhZ2UgQ29udHJvbGxlciAqLworI2RlZmluZSBUV19ERVZJQ0VfSUQyICgweDEwMDEpICAvKiA3MDAwIHNlcmllcyBjb250cm9sbGVyICovCisjZGVmaW5lIFRXX05VTURFVklDRVMgMgorI2RlZmluZSBUV19QQ0lfQ0xFQVJfUEFSSVRZX0VSUk9SUyAweGMxMDAKKyNkZWZpbmUgVFdfUENJX0NMRUFSX1BDSV9BQk9SVCAgICAgMHgyMDAwCisKKy8qIENvbW1hbmQgcGFja2V0IG9wY29kZXMgKi8KKyNkZWZpbmUgVFdfT1BfTk9QCSAgICAgIDB4MAorI2RlZmluZSBUV19PUF9JTklUX0NPTk5FQ1RJT04gMHgxCisjZGVmaW5lIFRXX09QX1JFQUQJICAgICAgMHgyCisjZGVmaW5lIFRXX09QX1dSSVRFCSAgICAgIDB4MworI2RlZmluZSBUV19PUF9WRVJJRlkJICAgICAgMHg0CisjZGVmaW5lIFRXX09QX0dFVF9QQVJBTQkgICAgICAweDEyCisjZGVmaW5lIFRXX09QX1NFVF9QQVJBTQkgICAgICAweDEzCisjZGVmaW5lIFRXX09QX1NFQ1RPUl9JTkZPICAgICAweDFhCisjZGVmaW5lIFRXX09QX0FFTl9MSVNURU4gICAgICAweDFjCisjZGVmaW5lIFRXX09QX0ZMVVNIX0NBQ0hFICAgICAweDBlCisjZGVmaW5lIFRXX0NNRF9QQUNLRVQgICAgICAgICAweDFkCisjZGVmaW5lIFRXX0NNRF9QQUNLRVRfV0lUSF9EQVRBIDB4MWYKKworLyogQXN5bmNocm9ub3VzIEV2ZW50IE5vdGlmaWNhdGlvbiAoQUVOKSBDb2RlcyAqLworI2RlZmluZSBUV19BRU5fUVVFVUVfRU1QVFkgICAgICAgMHgwMDAwCisjZGVmaW5lIFRXX0FFTl9TT0ZUX1JFU0VUICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFdfQUVOX0RFR1JBREVEX01JUlJPUiAgIDB4MDAwMgorI2RlZmluZSBUV19BRU5fQ09OVFJPTExFUl9FUlJPUiAgMHgwMDAzCisjZGVmaW5lIFRXX0FFTl9SRUJVSUxEX0ZBSUwgICAgICAweDAwMDQKKyNkZWZpbmUgVFdfQUVOX1JFQlVJTERfRE9ORSAgICAgIDB4MDAwNQorI2RlZmluZSBUV19BRU5fUVVFVUVfRlVMTCAgICAgICAgMHgwMGZmCisjZGVmaW5lIFRXX0FFTl9UQUJMRV9VTkRFRklORUQgICAweDE1CisjZGVmaW5lIFRXX0FFTl9BUE9SVF9USU1FT1VUICAgICAweDAwMDkKKyNkZWZpbmUgVFdfQUVOX0RSSVZFX0VSUk9SICAgICAgIDB4MDAwQQorI2RlZmluZSBUV19BRU5fU01BUlRfRkFJTCAgICAgICAgMHgwMDBGCisjZGVmaW5lIFRXX0FFTl9TQlVGX0ZBSUwgICAgICAgICAweDAwMjQKKworLyogUGhhc2UgZGVmaW5lcyAqLworI2RlZmluZSBUV19QSEFTRV9JTklUSUFMIDAKKyNkZWZpbmUgVFdfUEhBU0VfU0lOR0xFIDEKKyNkZWZpbmUgVFdfUEhBU0VfU0dMSVNUIDIKKworLyogTWlzYyBkZWZpbmVzICovCisjZGVmaW5lIFRXX0FMSUdOTUVOVF82MDAwCQkgICAgICA2NCAvKiA2NCBieXRlcyAqLworI2RlZmluZSBUV19BTElHTk1FTlRfNzAwMCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIDQgYnl0ZXMgKi8KKyNkZWZpbmUgVFdfTUFYX1VOSVRTCQkJICAgICAgMTYKKyNkZWZpbmUgVFdfQ09NTUFORF9BTElHTk1FTlRfTUFTSwkgICAgICAweDFmZgorI2RlZmluZSBUV19JTklUX01FU1NBR0VfQ1JFRElUUwkJICAgICAgMHgxMDAKKyNkZWZpbmUgVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFCSAgICAgIDB4MworI2RlZmluZSBUV19QT0xMX01BWF9SRVRSSUVTICAgICAgICAJICAgICAgMjAwMDAKKyNkZWZpbmUgVFdfTUFYX1NHTF9MRU5HVEgJCSAgICAgIDYyCisjZGVmaW5lIFRXX0FUQV9QQVNTX1NHTF9NQVggICAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgVFdfUV9MRU5HVEgJCQkgICAgICAyNTYKKyNkZWZpbmUgVFdfUV9TVEFSVAkJCSAgICAgIDAKKyNkZWZpbmUgVFdfTUFYX1NMT1QJCQkgICAgICAzMgorI2RlZmluZSBUV19NQVhfUENJX0JVU0VTCQkgICAgICAyNTUKKyNkZWZpbmUgVFdfTUFYX1JFU0VUX1RSSUVTCQkgICAgICAzCisjZGVmaW5lIFRXX1VOSVRfSU5GT1JNQVRJT05fVEFCTEVfQkFTRQkgICAgICAweDMwMAorI2RlZmluZSBUV19NQVhfQ01EU19QRVJfTFVOCQkgICAgICAyNTQgLyogMjU0IGZvciBpbywgMSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyZGV2IGlvY3RsLCBvbmUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGFlbiBwb3N0ICovCisjZGVmaW5lIFRXX0JMT0NLX1NJWkUJCQkgICAgICAweDIwMCAvKiA1MTItYnl0ZSBibG9ja3MgKi8KKyNkZWZpbmUgVFdfSU9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFRXX1VOSVRfT05MSU5FICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUV19JTl9JTlRSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFdfSU5fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRXX0lOX0NIUkRFVl9JT0NUTCAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUV19NQVhfU0VDVE9SUyAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBUV19NQVhfSU9DVExfU0VDVE9SUwkJICAgICAgNTEyCisjZGVmaW5lIFRXX0FFTl9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBUV19JT0NUTF9XQUlUX1RJTUUgICAgICAgICAgICAgICAgICAgICgxICogSFopIC8qIDEgc2Vjb25kICovCisjZGVmaW5lIFRXX0lTUl9ET05UX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBUV19JU1JfRE9OVF9SRVNVTFQgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVFdfSU9DVExfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAyNSAvKiAyNSBzZWNvbmRzICovCisjZGVmaW5lIFRXX0lPQ1RMX0NIUkRFVl9USU1FT1VUICAgICAgICAgICAgICAgNjAgLyogNjAgc2Vjb25kcyAqLworI2RlZmluZSBUV19JT0NUTF9DSFJERVZfRlJFRSAgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIFRXX0RNQV9NQVNLCQkJICAgICAgRE1BXzMyQklUX01BU0sKKyNkZWZpbmUgVFdfTUFYX0NEQl9MRU4JCQkgICAgICAxNgorCisvKiBCaXRtYXNrIG1hY3JvcyB0byBlbGltaW5hdGUgYml0ZmllbGRzICovCisKKy8qIG9wY29kZTogNSwgc2dsb2Zmc2V0OiAzICovCisjZGVmaW5lIFRXX09QU0dMX0lOKHgseSkgKCh4IDw8IDUpIHwgKHkgJiAweDFmKSkKKyNkZWZpbmUgVFdfU0dMX09VVCh4KSAoKHggPj4gNSkgJiAweDcpCisKKy8qIHJlc2VydmVkXzE6IDQsIHJlc3BvbnNlX2lkOiA4LCByZXNlcnZlZF8yOiAyMCAqLworI2RlZmluZSBUV19SRVNJRF9PVVQoeCkgKCh4ID4+IDQpICYgMHhmZikKKworLyogdW5pdDogNCwgaG9zdF9pZDogNCAqLworI2RlZmluZSBUV19VTklUSE9TVF9JTih4LHkpICgoeCA8PCA0KSB8ICggeSAmIDB4ZikpCisjZGVmaW5lIFRXX1VOSVRfT1VUKHgpICh4ICYgMHhmKQorCisvKiBNYWNyb3MgKi8KKyNkZWZpbmUgVFdfQ09OVFJPTF9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyKQorI2RlZmluZSBUV19TVEFUVVNfUkVHX0FERFIoeCkgKHgtPmJhc2VfYWRkciArIDB4NCkKKyNkZWZpbmUgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyICsgMHg4KQorI2RlZmluZSBUV19SRVNQT05TRV9RVUVVRV9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyICsgMHhDKQorI2RlZmluZSBUV19DTEVBUl9BTExfSU5URVJSVVBUUyh4KSAob3V0bChUV19TVEFUVVNfVkFMSURfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCh4KSAob3V0bChUV19DT05UUk9MX0NMRUFSX0FUVEVOVElPTl9JTlRFUlJVUFQsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19DTEVBUl9IT1NUX0lOVEVSUlVQVCh4KSAob3V0bChUV19DT05UUk9MX0NMRUFSX0hPU1RfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfRElTQUJMRV9JTlRFUlJVUFRTKHgpIChvdXRsKFRXX0NPTlRST0xfRElTQUJMRV9JTlRFUlJVUFRTLCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHgpIChvdXRsKFRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfVU5NQVNLX1JFU1BPTlNFX0lOVEVSUlVQVCB8IFRXX0NPTlRST0xfRU5BQkxFX0lOVEVSUlVQVFMsIFRXX0NPTlRST0xfUkVHX0FERFIoeCkpKQorI2RlZmluZSBUV19NQVNLX0NPTU1BTkRfSU5URVJSVVBUKHgpIChvdXRsKFRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCwgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX1VOTUFTS19DT01NQU5EX0lOVEVSUlVQVCh4KSAob3V0bChUV19DT05UUk9MX1VOTUFTS19DT01NQU5EX0lOVEVSUlVQVCwgVFdfQ09OVFJPTF9SRUdfQUREUih4KSkpCisjZGVmaW5lIFRXX1NPRlRfUkVTRVQoeCkgKG91dGwoVFdfQ09OVFJPTF9JU1NVRV9TT0ZUX1JFU0VUIHwgXAorCQkJVFdfQ09OVFJPTF9DTEVBUl9IT1NUX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfQ0xFQVJfQVRURU5USU9OX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19DT01NQU5EX0lOVEVSUlVQVCB8IFwKKwkJCVRXX0NPTlRST0xfTUFTS19SRVNQT05TRV9JTlRFUlJVUFQgfCBcCisJCQlUV19DT05UUk9MX0NMRUFSX0VSUk9SX1NUQVRVUyB8IFwKKwkJCVRXX0NPTlRST0xfRElTQUJMRV9JTlRFUlJVUFRTLCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKKyNkZWZpbmUgVFdfU1RBVFVTX0VSUk9SUyh4KSBcCisJKCgoeCAmIFRXX1NUQVRVU19QQ0lfQUJPUlQpIHx8IFwKKwkoeCAmIFRXX1NUQVRVU19QQ0lfUEFSSVRZX0VSUk9SKSB8fCBcCisJKHggJiBUV19TVEFUVVNfUVVFVUVfRVJST1IpIHx8IFwKKwkoeCAmIFRXX1NUQVRVU19NSUNST0NPTlRST0xMRVJfRVJST1IpKSAmJiBcCisJKHggJiBUV19TVEFUVVNfTUlDUk9DT05UUk9MTEVSX1JFQURZKSkKKworI2lmZGVmIFRXX0RFQlVHCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBwcmludGsobXNnKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiBTY2F0dGVyIEdhdGhlciBMaXN0IEVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfU0dfRW50cnkgeworCXUzMiBhZGRyZXNzOworCXUzMiBsZW5ndGg7Cit9IFRXX1NHX0VudHJ5OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVFdfU2VjdG9yWzUxMl07CisKKy8qIENvbW1hbmQgUGFja2V0ICovCit0eXBlZGVmIHN0cnVjdCBUV19Db21tYW5kIHsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZV9fc2dsb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHJlcXVlc3RfaWQ7CisJdW5zaWduZWQgY2hhciB1bml0X19ob3N0aWQ7CisJLyogU2Vjb25kIERXT1JEICovCisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0IGJsb2NrX2NvdW50OworCQl1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJfY291bnQ7CisJCXVuc2lnbmVkIHNob3J0IG1lc3NhZ2VfY3JlZGl0czsKKwl9IGJ5dGU2OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsYmE7CisJCQlUV19TR19FbnRyeSBzZ2xbVFdfTUFYX1NHTF9MRU5HVEhdOworCQkJdTMyIHBhZGRpbmc7CS8qIHBhZCB0byA1MTIgYnl0ZXMgKi8KKwkJfSBpbzsKKwkJc3RydWN0IHsKKwkJCVRXX1NHX0VudHJ5IHNnbFtUV19NQVhfU0dMX0xFTkdUSF07CisJCQl1MzIgcGFkZGluZ1syXTsKKwkJfSBwYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiByZXNwb25zZV9xdWV1ZV9wb2ludGVyOworCQkJdTMyIHBhZGRpbmdbMTI1XTsKKwkJfSBpbml0X2Nvbm5lY3Rpb247CisJCXN0cnVjdCB7CisJCQljaGFyIHZlcnNpb25bNTA0XTsKKwkJfSBpb2N0bF9taW5pcG9ydF92ZXJzaW9uOworCX0gYnl0ZTg7Cit9IFRXX0NvbW1hbmQ7CisKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IFRBR19UV19Jb2N0bCB7CisJdW5zaWduZWQgY2hhciBvcGNvZGU7CisJdW5zaWduZWQgc2hvcnQgdGFibGVfaWQ7CisJdW5zaWduZWQgY2hhciBwYXJhbWV0ZXJfaWQ7CisJdW5zaWduZWQgY2hhciBwYXJhbWV0ZXJfc2l6ZV9ieXRlczsKKwl1bnNpZ25lZCBjaGFyIHVuaXRfaW5kZXg7CisJdW5zaWduZWQgY2hhciBkYXRhWzFdOworfSBUV19Jb2N0bDsKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIFN0cnVjdHVyZSBmb3IgbmV3IGNoYXJkZXYgaW9jdGxzICovCit0eXBlZGVmIHN0cnVjdCBUQUdfVFdfTmV3X0lvY3RsIHsKKwl1bnNpZ25lZCBpbnQgZGF0YV9idWZmZXJfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZyBbNTA4XTsKKwlUV19Db21tYW5kIGZpcm13YXJlX2NvbW1hbmQ7CisJY2hhciBkYXRhX2J1ZmZlclsxXTsKK30gVFdfTmV3X0lvY3RsOworCisvKiBHZXRQYXJhbSBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQJdGFibGVfaWQ7CisJdW5zaWduZWQgY2hhcglwYXJhbWV0ZXJfaWQ7CisJdW5zaWduZWQgY2hhcglwYXJhbWV0ZXJfc2l6ZV9ieXRlczsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbMV07Cit9IFRXX1BhcmFtLCAqUFRXX1BhcmFtOworCisvKiBSZXNwb25zZSBxdWV1ZSAqLwordHlwZWRlZiB1bmlvbiBUQUdfVFdfUmVzcG9uc2VfUXVldWUgeworCXUzMiByZXNwb25zZV9pZDsKKwl1MzIgdmFsdWU7Cit9IFRXX1Jlc3BvbnNlX1F1ZXVlOworCit0eXBlZGVmIGludCBUV19DbWRfU3RhdGU7CisKKyNkZWZpbmUgVFdfU19JTklUSUFMICAgMHgxICAvKiBJbml0aWFsIHN0YXRlICovCisjZGVmaW5lIFRXX1NfU1RBUlRFRCAgIDB4MiAgLyogSWQgaW4gdXNlICovCisjZGVmaW5lIFRXX1NfUE9TVEVEICAgIDB4NCAgLyogUG9zdGVkIHRvIHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lIFRXX1NfUEVORElORyAgIDB4OCAgLyogV2FpdGluZyB0byBiZSBwb3N0ZWQgaW4gaXNyICovCisjZGVmaW5lIFRXX1NfQ09NUExFVEVEIDB4MTAgLyogQ29tcGxldGVkIGJ5IGlzciAqLworI2RlZmluZSBUV19TX0ZJTklTSEVEICAweDIwIC8qIEkvTyBjb21wbGV0ZWx5IGRvbmUgKi8KKyNkZWZpbmUgVFdfU1RBUlRfTUFTSyAoVFdfU19TVEFSVEVEIHwgVFdfU19QT1NURUQgfCBUV19TX1BFTkRJTkcgfCBUV19TX0NPTVBMRVRFRCkKKworLyogQ29tbWFuZCBoZWFkZXIgZm9yIEFUQSBwYXNzLXRocnUgKi8KK3R5cGVkZWYgc3RydWN0IFRBR19UV19QYXNzdGhydQoreworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlX19zZ2xvZmZzZXQ7CisJdW5zaWduZWQgY2hhciBzaXplOworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9pZDsKKwl1bnNpZ25lZCBjaGFyIGFwb3J0X19ob3N0aWQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBwYXJhbTsKKwl1bnNpZ25lZCBzaG9ydCBmZWF0dXJlczsKKwl1bnNpZ25lZCBzaG9ydCBzZWN0b3JfY291bnQ7CisJdW5zaWduZWQgc2hvcnQgc2VjdG9yX251bTsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcl9sbzsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcl9oaTsKKwl1bnNpZ25lZCBjaGFyIGRyaXZlX2hlYWQ7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCVRXX1NHX0VudHJ5IHNnX2xpc3RbVFdfQVRBX1BBU1NfU0dMX01BWF07CisJdW5zaWduZWQgY2hhciBwYWRkaW5nWzEyXTsKK30gVFdfUGFzc3RocnU7CisKK3R5cGVkZWYgc3RydWN0IFRBR19UV19EZXZpY2VfRXh0ZW5zaW9uIHsKKwl1MzIJCQliYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZwkJKmFsaWdubWVudF92aXJ0dWFsX2FkZHJlc3NbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGxvbmcJCWFsaWdubWVudF9waHlzaWNhbF9hZGRyZXNzW1RXX1FfTEVOR1RIXTsKKwlpbnQJCQlpc191bml0X3ByZXNlbnRbVFdfTUFYX1VOSVRTXTsKKwl1bnNpZ25lZCBsb25nCQkqY29tbWFuZF9wYWNrZXRfdmlydHVhbF9hZGRyZXNzW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBsb25nCQljb21tYW5kX3BhY2tldF9waHlzaWNhbF9hZGRyZXNzW1RXX1FfTEVOR1RIXTsKKwlzdHJ1Y3QgcGNpX2RldgkJKnR3X3BjaV9kZXY7CisJc3RydWN0IHNjc2lfY21uZAkqc3JiW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyCQlmcmVlX3F1ZXVlW1RXX1FfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyCQlmcmVlX2hlYWQ7CisJdW5zaWduZWQgY2hhcgkJZnJlZV90YWlsOworCXVuc2lnbmVkIGNoYXIJCXBlbmRpbmdfcXVldWVbVFdfUV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIJCXBlbmRpbmdfaGVhZDsKKwl1bnNpZ25lZCBjaGFyCQlwZW5kaW5nX3RhaWw7CisJVFdfQ21kX1N0YXRlCQlzdGF0ZVtUV19RX0xFTkdUSF07CisJdTMyCQkJcG9zdGVkX3JlcXVlc3RfY291bnQ7CisJdTMyCQkJbWF4X3Bvc3RlZF9yZXF1ZXN0X2NvdW50OworCXUzMgkJCXJlcXVlc3RfY291bnRfbWFya2VkX3BlbmRpbmc7CisJdTMyCQkJcGVuZGluZ19yZXF1ZXN0X2NvdW50OworCXUzMgkJCW1heF9wZW5kaW5nX3JlcXVlc3RfY291bnQ7CisJdTMyCQkJbWF4X3NnbF9lbnRyaWVzOworCXUzMgkJCXNnbF9lbnRyaWVzOworCXUzMgkJCW51bV9yZXNldHM7CisJdTMyCQkJc2VjdG9yX2NvdW50OworCXUzMgkJCW1heF9zZWN0b3JfY291bnQ7CisJdTMyCQkJYWVuX2NvdW50OworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7CisJc3RydWN0IHNlbWFwaG9yZQlpb2N0bF9zZW07CisJdW5zaWduZWQgc2hvcnQJCWFlbl9xdWV1ZVtUV19RX0xFTkdUSF07CisJdW5zaWduZWQgY2hhcgkJYWVuX2hlYWQ7CisJdW5zaWduZWQgY2hhcgkJYWVuX3RhaWw7CisJdm9sYXRpbGUgbG9uZwkJZmxhZ3M7IC8qIGxvbmcgcmVxJ2QgZm9yIHNldF9iaXQgLS1SUiAqLworCWludAkJCXJlc2V0X3ByaW50OworCXZvbGF0aWxlIGludAkJY2hyZGV2X3JlcXVlc3RfaWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJaW9jdGxfd3F1ZXVlOworfSBUV19EZXZpY2VfRXh0ZW5zaW9uOworCisjcHJhZ21hIHBhY2soKQorCisjZW5kaWYgLyogXzNXX1hYWFhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzUzYzcwMC5jIGIvZHJpdmVycy9zY3NpLzUzYzcwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTFmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvNTNjNzAwLmMKQEAgLTAsMCArMSwyMTc1IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDggLSotICovCisKKy8qIE5DUiAob3IgU3ltYmlvcykgNTNjNzAwIGFuZCA1M2M3MDAtNjYgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqICAKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIE5vdGVzOgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGV4Y2x1c2l2ZWx5IGZvciB0aGVzZSBjaGlwcyAodmlydHVhbGx5IHRoZQorICogZWFybGllc3Qgb2YgdGhlIHNjcmlwdHMgZW5naW5lIGNoaXBzKS4gIFRoZXkgbmVlZCB0aGVpciBvd24gZHJpdmVycworICogYmVjYXVzZSB0aGV5IGFyZSBtaXNzaW5nIHNvIG1hbnkgb2YgdGhlIHNjcmlwdHMgYW5kIHNuYXp6eSByZWdpc3RlcgorICogZmVhdHVyZXMgb2YgdGhlaXIgZWxkZXIgYnJvdGhlcnMgKHRoZSA3MTAsIDcyMCBhbmQgNzcwKS4KKyAqCisgKiBUaGUgNzAwIGlzIHRoZSBsb3dsaWVzdCBvZiB0aGUgbGluZSwgaXQgY2FuIG9ubHkgZG8gYXN5bmMgU0NTSS4KKyAqIFRoZSA3MDAtNjYgY2FuIGF0IGxlYXN0IGRvIHN5bmNocm9ub3VzIFNDU0kgdXAgdG8gMTBNSHouCisgKiAKKyAqIFRoZSA3MDAgY2hpcCBoYXMgbm8gaG9zdCBidXMgaW50ZXJmYWNlIGxvZ2ljIG9mIGl0cyBvd24uICBIb3dldmVyLAorICogaXQgaXMgdXN1YWxseSBtYXBwZWQgdG8gYSBsb2NhdGlvbiB3aXRoIHdlbGwgZGVmaW5lZCByZWdpc3RlcgorICogb2Zmc2V0cy4gIFRoZXJlZm9yZSwgaWYgeW91IGNhbiBkZXRlcm1pbmUgdGhlIGJhc2UgYWRkcmVzcyBhbmQgdGhlCisgKiBpcnEgeW91ciBib2FyZCBpbmNvcnBvcmF0aW5nIHRoaXMgY2hpcCB1c2VzLCB5b3UgY2FuIHByb2JhYmx5IHVzZQorICogdGhpcyBkcml2ZXIgdG8gcnVuIGl0IChhbHRob3VnaCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byB3cml0ZSBhCisgKiBtaW5pbWFsIHdyYXBwZXIgZm9yIHRoZSBwdXJwb3NlLS0tc2VlIHRoZSBOQ1JfRDcwMCBkcml2ZXIgZm9yCisgKiBkZXRhaWxzIGFib3V0IGhvdyB0byBkbyB0aGlzKS4KKyAqCisgKgorICogVE9ETyBMaXN0OgorICoKKyAqIDEuIEJldHRlciBzdGF0aXN0aWNzIGluIHRoZSBwcm9jIGZzCisgKgorICogMi4gSW1wbGVtZW50IG1lc3NhZ2UgcXVldWUgKHF1ZXVlcyBTQ1NJIG1lc3NhZ2VzIGxpa2UgY29tbWFuZHMpIGFuZCBtYWtlCisgKiAgICB0aGUgYWJvcnQgYW5kIGRldmljZSByZXNldCBmdW5jdGlvbnMgdXNlIHRoZW0uCisgKiAqLworCisvKiBDSEFOR0VMT0cKKyAqCisgKiBWZXJzaW9uIDIuOAorICoKKyAqIEZpeGVkIGJhZCBidWcgYWZmZWN0aW5nIHRhZyBzdGFydmF0aW9uIHByb2Nlc3NpbmcgKHByZXZpb3VzbHkgdGhlCisgKiBkcml2ZXIgd291bGQgaGFuZyB0aGUgc3lzdGVtIGlmIHRvbyBtYW55IHRhZ3Mgc3RhcnZlZC4gIEFsc28gZml4ZWQKKyAqIGJhZCBidWcgaGF2aW5nIHRvIGRvIHdpdGggMTAgYnl0ZSBjb21tYW5kIHByb2Nlc3NpbmcgYW5kIFJFUVVFU1QKKyAqIFNFTlNFICh0aGUgY29tbWFuZCB3b3VsZCBsb29wIGZvcmV2ZXIgZ2V0dGluZyBhIHRyYW5zZmVyIGxlbmd0aAorICogbWlzbWF0Y2ggaW4gdGhlIENNRCBwaGFzZSkuCisgKgorICogVmVyc2lvbiAyLjcKKyAqCisgKiBGaXhlZCBzY3JpcHRzIHByb2JsZW0gd2hpY2ggY2F1c2VkIGNlcnRhaW4gZGV2aWNlcyAobm90YWJseSBDRFJXcykKKyAqIHRvIGhhbmcgb24gaW5pdGlhbCBJTlFVSVJZLiAgVXBkYXRlZCBOQ1JfNzAwX3JlYWRsL3dyaXRlbCB0byB1c2UKKyAqIF9fcmF3X3JlYWRsL3dyaXRlbCBmb3IgcGFyaXNjIGNvbXBhdGliaWxpdHkgKFRob21hcworICogQm9nZW5kb2VyZmVyKS4gQWRkZWQgbWlzc2luZyBTQ3AtPnJlcXVlc3RfYnVmZmxlbiBpbml0aWFsaXNhdGlvbgorICogZm9yIHNlbnNlIHJlcXVlc3RzIChSeWFuIEJyYWRldGljaCkuCisgKgorICogVmVyc2lvbiAyLjYKKyAqCisgKiBGb2xsb3dpbmcgdGVzdCBvZiB0aGUgNjQgYml0IHBhcmlzYyBrZXJuZWwgYnkgUmljaGFyZCBIaXJzdCwKKyAqIHNldmVyYWwgcHJvYmxlbXMgaGF2ZSBub3cgYmVlbiBjb3JyZWN0ZWQuICBBbHNvIGFkZHMgc3VwcG9ydCBmb3IKKyAqIGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogVmVyc2lvbiAyLjUKKyAqIAorICogTW9yZSBDb21wYXRpYmlsaXR5IGNoYW5nZXMgZm9yIDcxMCAobm93IGFjdHVhbGx5IHdvcmtzKS4gIEVuaGFuY2VkCisgKiBzdXBwb3J0IGZvciBvZGQgY2xvY2sgc3BlZWRzIHdoaWNoIGNvbnN0cmFpbiBTRFRSIG5lZ290aWF0aW9ucy4KKyAqIGNvcnJlY3QgY2FjaGVsaW5lIHNlcGFyYXRpb24gZm9yIHNjc2kgbWVzc2FnZXMgYW5kIHN0YXR1cyBmb3IKKyAqIGluY29oZXJlbnQgYXJjaGl0ZWN0dXJlcy4gIFVzZSBvZiB0aGUgcGNpIG1hcHBpbmcgZnVuY3Rpb25zIG9uCisgKiBidWZmZXJzIHRvIGJlZ2luIHN1cHBvcnQgZm9yIDY0IGJpdCBkcml2ZXJzLgorICoKKyAqIFZlcnNpb24gMi40CisgKgorICogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDUzYzcxMCBjaGlwIChpbiA1M2M3MDAgZW11bGF0aW9uIG1vZGUgb25seS0tLW5vIAorICogc3BlY2lhbCA1M2M3MTAgaW5zdHJ1Y3Rpb25zIG9yIHJlZ2lzdGVycyBhcmUgdXNlZCkuCisgKgorICogVmVyc2lvbiAyLjMKKyAqCisgKiBNb3JlIGVuZGlhbm5lc3MvY2FjaGUgY29oZXJlbmN5IGNoYW5nZXMuCisgKgorICogQmV0dGVyIGJhZCBkZXZpY2UgaGFuZGxpbmcgKGhhbmRsZXMgZGV2aWNlcyBseWluZyBhYm91dCB0YWcKKyAqIHF1ZXVlaW5nIHN1cHBvcnQgYW5kIGRldmljZXMgd2hpY2ggZmFpbCB0byBwcm92aWRlIHNlbnNlIGRhdGEgb24KKyAqIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zKQorICoKKyAqIE1hbnkgdGhhbmtzIHRvIFJpY2hhcmQgSGlyc3QgPHJoaXJzdEBsaW51eGNhcmUuY29tPiBmb3IgcGF0aWVudGx5CisgKiBkZWJ1Z2dpbmcgdGhpcyBkcml2ZXIgb24gdGhlIHBhcmlzYyBhcmNoaXRlY3R1cmUgYW5kIHN1Z2dlc3RpbmcKKyAqIG1hbnkgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCisgKgorICogVGhhbmtzIGFsc28gZ28gdG8gTGludXhjYXJlIEluYy4gZm9yIHByb3ZpZGluZyBzZXZlcmFsIFBBUklTQworICogbWFjaGluZXMgZm9yIG1lIHRvIGRlYnVnIHRoZSBkcml2ZXIgb24uCisgKgorICogVmVyc2lvbiAyLjIKKyAqCisgKiBNYWRlIHRoZSBkcml2ZXIgbWVtIG9yIGlvIG1hcHBlZDsgYWRkZWQgZW5kaWFuIGludmFyaWFuY2U7IGFkZGVkCisgKiBkbWEgY2FjaGUgZmx1c2hpbmcgb3BlcmF0aW9ucyBmb3IgYXJjaGl0ZWN0dXJlcyB3aGljaCBuZWVkIGl0OworICogYWRkZWQgc3VwcG9ydCBmb3IgbW9yZSB2YXJpZWQgY2xvY2tpbmcgc3BlZWRzLgorICoKKyAqIFZlcnNpb24gMi4xCisgKgorICogSW5pdGlhbCBtb2R1bGFyaXNhdGlvbiBmcm9tIHRoZSBENzAwLiAgU2VlIE5DUl9ENzAwLmMgZm9yIHRoZSByZXN0IG9mCisgKiB0aGUgY2hhbmdlbG9nLgorICogKi8KKyNkZWZpbmUgTkNSXzcwMF9WRVJTSU9OICIyLjgiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuaD4KKworI2luY2x1ZGUgIjUzYzcwMC5oIgorCisvKiBOT1RFOiBGb3IgNjQgYml0IGRyaXZlcnMgdGhlcmUgYXJlIHBvaW50cyBpbiB0aGUgY29kZSB3aGVyZSB3ZSB1c2UKKyAqIGEgbm9uIGRlcmVmZXJlbmNlYWJsZSBwb2ludGVyIHRvIHBvaW50IHRvIGEgc3RydWN0dXJlIGluIGRtYS1hYmxlCisgKiBtZW1vcnkgKHdoaWNoIGlzIDMyIGJpdHMpIHNvIHRoYXQgd2UgY2FuIHVzZSBhbGwgb2YgdGhlIHN0cnVjdHVyZQorICogb3BlcmF0aW9ucyBidXQgdGFrZSB0aGUgYWRkcmVzcyBhdCB0aGUgZW5kLiAgVGhpcyBtYWNybyBhbGxvd3MgdXMKKyAqIHRvIHRydW5jYXRlIHRoZSA2NCBiaXQgcG9pbnRlciBkb3duIHRvIDMyIGJpdHMgd2l0aG91dCB0aGUgY29tcGlsZXIKKyAqIGNvbXBsYWluaW5nICovCisjZGVmaW5lIHRvMzJiaXQoeCkJKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpKHgpKSkKKworI2lmZGVmIE5DUl83MDBfREVCVUcKKyNkZWZpbmUgU1RBVElDCisjZWxzZQorI2RlZmluZSBTVEFUSUMgc3RhdGljCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQm90dG9tbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjUzYzcwMCBhbmQgNTNjNzAwLTY2IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGlzIGlzIHRoZSBzY3JpcHQgKi8KKyNpbmNsdWRlICI1M2M3MDBfZC5oIgorCisKK1NUQVRJQyBpbnQgTkNSXzcwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitTVEFUSUMgaW50IE5DUl83MDBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKK1NUQVRJQyBpbnQgTkNSXzcwMF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKK1NUQVRJQyBpbnQgTkNSXzcwMF9kZXZfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KTsKK1NUQVRJQyBpbnQgTkNSXzcwMF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCk7CitTVEFUSUMgdm9pZCBOQ1JfNzAwX2NoaXBfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitTVEFUSUMgdm9pZCBOQ1JfNzAwX2NoaXBfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitTVEFUSUMgaW50IE5DUl83MDBfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQpOworU1RBVElDIHZvaWQgTkNSXzcwMF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQpOworc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcG50LCBpbnQgZGVwdGgpOworc3RhdGljIGludCBOQ1JfNzAwX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwbnQsIGludCBkZXB0aCk7CisKK1NUQVRJQyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqTkNSXzcwMF9kZXZfYXR0cnNbXTsKKworU1RBVElDIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqTkNSXzcwMF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOworCitzdGF0aWMgY2hhciAqTkNSXzcwMF9waGFzZVtdID0geworCSIiLAorCSJhZnRlciBzZWxlY3Rpb24iLAorCSJiZWZvcmUgY29tbWFuZCBwaGFzZSIsCisJImFmdGVyIGNvbW1hbmQgcGhhc2UiLAorCSJhZnRlciBzdGF0dXMgcGhhc2UiLAorCSJhZnRlciBkYXRhIGluIHBoYXNlIiwKKwkiYWZ0ZXIgZGF0YSBvdXQgcGhhc2UiLAorCSJkdXJpbmcgZGF0YSBwaGFzZSIsCit9OworCitzdGF0aWMgY2hhciAqTkNSXzcwMF9jb25kaXRpb25bXSA9IHsKKwkiIiwKKwkiTk9UIE1TR19PVVQiLAorCSJVTkVYUEVDVEVEIFBIQVNFIiwKKwkiTk9UIE1TR19JTiIsCisJIlVORVhQRUNURUQgTVNHIiwKKwkiTVNHX0lOIiwKKwkiU0RUUl9NU0cgUkVDRUlWRUQiLAorCSJSRUpFQ1RfTVNHIFJFQ0VJVkVEIiwKKwkiRElTQ09OTkVDVF9NU0cgUkVDRUlWRUQiLAorCSJNU0dfT1VUIiwKKwkiREFUQV9JTiIsCisJCit9OworCitzdGF0aWMgY2hhciAqTkNSXzcwMF9mYXRhbF9tZXNzYWdlc1tdID0geworCSJ1bmV4cGVjdGVkIG1lc3NhZ2UgYWZ0ZXIgcmVzZWxlY3Rpb24iLAorCSJzdGlsbCBNU0dfT1VUIGFmdGVyIG1lc3NhZ2UgaW5qZWN0aW9uIiwKKwkibm90IE1TR19JTiBhZnRlciBzZWxlY3Rpb24iLAorCSJJbGxlZ2FsIG1lc3NhZ2UgbGVuZ3RoIHJlY2VpdmVkIiwKK307CisKK3N0YXRpYyBjaGFyICpOQ1JfNzAwX1NCQ0xfYml0c1tdID0geworCSJJTyAiLAorCSJDRCAiLAorCSJNU0cgIiwKKwkiQVROICIsCisJIlNFTCAiLAorCSJCU1kgIiwKKwkiQUNLICIsCisJIlJFUSAiLAorfTsKKworc3RhdGljIGNoYXIgKk5DUl83MDBfU0JDTF90b19waGFzZVtdID0geworCSJEQVRBX09VVCIsCisJIkRBVEFfSU4iLAorCSJDTURfT1VUIiwKKwkiU1RBVEUiLAorCSJJTExFR0FMIFBIQVNFIiwKKwkiSUxMRUdBTCBQSEFTRSIsCisJIk1TRyBPVVQiLAorCSJNU0cgSU4iLAorfTsKKworc3RhdGljIF9fdTggTkNSXzcwMF9TRFRSX21zZ1tdID0geworCTB4MDEsCQkJLyogRXh0ZW5kZWQgbWVzc2FnZSAqLworCTB4MDMsCQkJLyogRXh0ZW5kZWQgbWVzc2FnZSBMZW5ndGggKi8KKwkweDAxLAkJCS8qIFNEVFIgRXh0ZW5kZWQgbWVzc2FnZSAqLworCU5DUl83MDBfTUlOX1BFUklPRCwKKwlOQ1JfNzAwX01BWF9PRkZTRVQKK307CisKKy8qIFRoaXMgdHJhbnNsYXRlcyB0aGUgU0RUUiBtZXNzYWdlIG9mZnNldCBhbmQgcGVyaW9kIHRvIGEgdmFsdWUKKyAqIHdoaWNoIGNhbiBiZSBsb2FkZWQgaW50byB0aGUgU1hGRVJfUkVHLgorICoKKyAqIE5PVEU6IEFjY29yZGluZyB0byBTQ1NJLTIsIHRoZSB0cnVlIHRyYW5zZmVyIHBlcmlvZCAoaW4gbnMpIGlzCisgKiAgICAgICBhY3R1YWxseSBmb3VyIHRpbWVzIHRoaXMgcGVyaW9kIHZhbHVlICovCitzdGF0aWMgaW5saW5lIF9fdTgKK05DUl83MDBfb2Zmc2V0X3BlcmlvZF90b19zeGZlcihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLAorCQkJICAgICAgIF9fdTggb2Zmc2V0LCBfX3U4IHBlcmlvZCkKK3sKKwlpbnQgWEZFUlA7CisKKwlfX3U4IG1pbl94ZmVycCA9IChob3N0ZGF0YS0+Y2hpcDcxMAorCQkJICA/IE5DUl83MTBfTUlOX1hGRVJQIDogTkNSXzcwMF9NSU5fWEZFUlApOworCV9fdTggbWF4X29mZnNldCA9IChob3N0ZGF0YS0+Y2hpcDcxMAorCQkJICAgPyBOQ1JfNzEwX01BWF9PRkZTRVQgOiBOQ1JfNzAwX01BWF9PRkZTRVQpOworCisJaWYob2Zmc2V0ID09IDApCisJCXJldHVybiAwOworCisJaWYocGVyaW9kIDwgaG9zdGRhdGEtPm1pbl9wZXJpb2QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiNTNjNzAwOiBQZXJpb2QgJWRucyBpcyBsZXNzIHRoYW4gdGhpcyBjaGlwJ3MgbWluaW11bSwgc2V0dGluZyB0byAlZFxuIiwgcGVyaW9kKjQsIE5DUl83MDBfU0RUUl9tc2dbM10qNCk7CisJCXBlcmlvZCA9IGhvc3RkYXRhLT5taW5fcGVyaW9kOworCX0KKwlYRkVSUCA9IChwZXJpb2QqNCAqIGhvc3RkYXRhLT5zeW5jX2Nsb2NrKS8xMDAwIC0gNDsKKwlpZihvZmZzZXQgPiBtYXhfb2Zmc2V0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjUzYzcwMDogT2Zmc2V0ICVkIGV4Y2VlZHMgY2hpcCBtYXhpbXVtLCBzZXR0aW5nIHRvICVkXG4iLAorCQkgICAgICAgb2Zmc2V0LCBtYXhfb2Zmc2V0KTsKKwkJb2Zmc2V0ID0gbWF4X29mZnNldDsKKwl9CisJaWYoWEZFUlAgPCBtaW5feGZlcnApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiNTNjNzAwOiBYRkVSUCAlZCBpcyBsZXNzIHRoYW4gbWluaXVtLCBzZXR0aW5nIHRvICVkXG4iLAorCQkgICAgICAgWEZFUlAsICBtaW5feGZlcnApOworCQlYRkVSUCA9ICBtaW5feGZlcnA7CisJfQorCXJldHVybiAob2Zmc2V0ICYgMHgwZikgfCAoWEZFUlAgJiAweDA3KTw8NDsKK30KKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2dldF9TWEZFUihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTRHAtPmhvc3QtPmhvc3RkYXRhWzBdOworCisJcmV0dXJuIE5DUl83MDBfb2Zmc2V0X3BlcmlvZF90b19zeGZlcihob3N0ZGF0YSwKKwkJCQkJICAgICAgc3BpX29mZnNldChTRHAtPnNkZXZfdGFyZ2V0KSwKKwkJCQkJICAgICAgc3BpX3BlcmlvZChTRHAtPnNkZXZfdGFyZ2V0KSk7Cit9CisKK3N0cnVjdCBTY3NpX0hvc3QgKgorTkNSXzcwMF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwKKwkgICAgICAgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWRtYV9hZGRyX3QgcFNjcmlwdCwgcFNsb3RzOworCV9fdTggKm1lbW9yeTsKKwlfX3UzMiAqc2NyaXB0OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RhdGljIGludCBiYW5uZXIgPSAwOworCWludCBqOworCisJaWYodHBudC0+c2Rldl9hdHRycyA9PSBOVUxMKQorCQl0cG50LT5zZGV2X2F0dHJzID0gTkNSXzcwMF9kZXZfYXR0cnM7CisKKwltZW1vcnkgPSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoaG9zdGRhdGEtPmRldiwgVE9UQUxfTUVNX1NJWkUsCisJCQkJICAgICAgICZwU2NyaXB0LCBHRlBfS0VSTkVMKTsKKwlpZihtZW1vcnkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzcwMDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZHJpdmVyLCBkZXRhdGNoaW5nXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2NyaXB0ID0gKF9fdTMyICopbWVtb3J5OworCWhvc3RkYXRhLT5tc2dpbiA9IG1lbW9yeSArIE1TR0lOX09GRlNFVDsKKwlob3N0ZGF0YS0+bXNnb3V0ID0gbWVtb3J5ICsgTVNHT1VUX09GRlNFVDsKKwlob3N0ZGF0YS0+c3RhdHVzID0gbWVtb3J5ICsgU1RBVFVTX09GRlNFVDsKKwkvKiBhbGwgb2YgdGhlc2Ugb2Zmc2V0cyBhcmUgTDFfQ0FDSEVfQllURVMgc2VwYXJhdGVkLiAgSXQgaXMgZmF0YWwKKwkgKiBpZiB0aGlzIGlzbid0IHN1ZmZpY2llbnQgc2VwYXJhdGlvbiB0byBhdm9pZCBkbWEgZmx1c2hpbmcgaXNzdWVzICovCisJQlVHX09OKCFkbWFfaXNfY29uc2lzdGVudChwU2NyaXB0KSAmJiBMMV9DQUNIRV9CWVRFUyA8IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCkpOworCWhvc3RkYXRhLT5zbG90cyA9IChzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKikobWVtb3J5ICsgU0xPVFNfT0ZGU0VUKTsKKwlob3N0ZGF0YS0+ZGV2ID0gZGV2OworCQkKKwlwU2xvdHMgPSBwU2NyaXB0ICsgU0xPVFNfT0ZGU0VUOworCisJLyogRmlsbCBpbiB0aGUgbWlzc2luZyByb3V0aW5lcyBmcm9tIHRoZSBob3N0IHRlbXBsYXRlICovCisJdHBudC0+cXVldWVjb21tYW5kID0gTkNSXzcwMF9xdWV1ZWNvbW1hbmQ7CisJdHBudC0+ZWhfYWJvcnRfaGFuZGxlciA9IE5DUl83MDBfYWJvcnQ7CisJdHBudC0+ZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBOQ1JfNzAwX2Rldl9yZXNldDsKKwl0cG50LT5laF9idXNfcmVzZXRfaGFuZGxlciA9IE5DUl83MDBfYnVzX3Jlc2V0OworCXRwbnQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IE5DUl83MDBfaG9zdF9yZXNldDsKKwl0cG50LT5jYW5fcXVldWUgPSBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1Q7CisJdHBudC0+c2dfdGFibGVzaXplID0gTkNSXzcwMF9TR19TRUdNRU5UUzsKKwl0cG50LT5jbWRfcGVyX2x1biA9IE5DUl83MDBfQ01EX1BFUl9MVU47CisJdHBudC0+dXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORzsKKwl0cG50LT5zbGF2ZV9jb25maWd1cmUgPSBOQ1JfNzAwX3NsYXZlX2NvbmZpZ3VyZTsKKwl0cG50LT5zbGF2ZV9kZXN0cm95ID0gTkNSXzcwMF9zbGF2ZV9kZXN0cm95OworCXRwbnQtPmNoYW5nZV9xdWV1ZV9kZXB0aCA9IE5DUl83MDBfY2hhbmdlX3F1ZXVlX2RlcHRoOworCXRwbnQtPmNoYW5nZV9xdWV1ZV90eXBlID0gTkNSXzcwMF9jaGFuZ2VfcXVldWVfdHlwZTsKKwkKKwlpZih0cG50LT5uYW1lID09IE5VTEwpCisJCXRwbnQtPm5hbWUgPSAiNTNjNzAwIjsKKwlpZih0cG50LT5wcm9jX25hbWUgPT0gTlVMTCkKKwkJdHBudC0+cHJvY19uYW1lID0gIjUzYzcwMCI7CisJCisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIDQpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGhvc3RkYXRhLT5zbG90cywgMCwgc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCkKKwkgICAgICAgKiBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QpOworCWZvcihqID0gMDsgaiA8IE5DUl83MDBfQ09NTUFORF9TTE9UU19QRVJfSE9TVDsgaisrKSB7CisJCWRtYV9hZGRyX3Qgb2Zmc2V0ID0gKGRtYV9hZGRyX3QpKCh1bnNpZ25lZCBsb25nKSZob3N0ZGF0YS0+c2xvdHNbal0uU0dbMF0KKwkJCQkJICAtICh1bnNpZ25lZCBsb25nKSZob3N0ZGF0YS0+c2xvdHNbMF0uU0dbMF0pOworCQlob3N0ZGF0YS0+c2xvdHNbal0ucFNHID0gKHN0cnVjdCBOQ1JfNzAwX1NHX0xpc3QgKikoKHVuc2lnbmVkIGxvbmcpKHBTbG90cyArIG9mZnNldCkpOworCQlpZihqID09IDApCisJCQlob3N0ZGF0YS0+ZnJlZV9saXN0ID0gJmhvc3RkYXRhLT5zbG90c1tqXTsKKwkJZWxzZQorCQkJaG9zdGRhdGEtPnNsb3RzW2otMV0uSVRMX2ZvcncgPSAmaG9zdGRhdGEtPnNsb3RzW2pdOworCQlob3N0ZGF0YS0+c2xvdHNbal0uc3RhdGUgPSBOQ1JfNzAwX1NMT1RfRlJFRTsKKwl9CisKKwlmb3IoaiA9IDA7IGogPCBzaXplb2YoU0NSSVBUKS9zaXplb2YoU0NSSVBUWzBdKTsgaisrKSB7CisJCXNjcmlwdFtqXSA9IGJTX3RvX2hvc3QoU0NSSVBUW2pdKTsKKwl9CisKKwkvKiBhZGp1c3QgYWxsIGxhYmVscyB0byBiZSBidXMgcGh5c2ljYWwgKi8KKwlmb3IoaiA9IDA7IGogPCBQQVRDSEVTOyBqKyspIHsKKwkJc2NyaXB0W0xBQkVMUEFUQ0hFU1tqXV0gPSBiU190b19ob3N0KHBTY3JpcHQgKyBTQ1JJUFRbTEFCRUxQQVRDSEVTW2pdXSk7CisJfQorCS8qIG5vdyBwYXRjaCB1cCBmaXhlZCBhZGRyZXNzZXMuICovCisJc2NyaXB0X3BhdGNoXzMyKHNjcmlwdCwgTWVzc2FnZUxvY2F0aW9uLAorCQkJcFNjcmlwdCArIE1TR09VVF9PRkZTRVQpOworCXNjcmlwdF9wYXRjaF8zMihzY3JpcHQsIFN0YXR1c0FkZHJlc3MsCisJCQlwU2NyaXB0ICsgU1RBVFVTX09GRlNFVCk7CisJc2NyaXB0X3BhdGNoXzMyKHNjcmlwdCwgUmVjZWl2ZU1zZ0FkZHJlc3MsCisJCQlwU2NyaXB0ICsgTVNHSU5fT0ZGU0VUKTsKKworCWhvc3RkYXRhLT5zY3JpcHQgPSBzY3JpcHQ7CisJaG9zdGRhdGEtPnBTY3JpcHQgPSBwU2NyaXB0OworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhvc3RkYXRhLT5kZXYsIHBTY3JpcHQsIHNpemVvZihTQ1JJUFQpLCBETUFfVE9fREVWSUNFKTsKKwlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfRlJFRTsKKwlob3N0ZGF0YS0+Y21kID0gTlVMTDsKKwlob3N0LT5tYXhfaWQgPSA3OworCWhvc3QtPm1heF9sdW4gPSBOQ1JfNzAwX01BWF9MVU5TOworCUJVR19PTihOQ1JfNzAwX3RyYW5zcG9ydF90ZW1wbGF0ZSA9PSBOVUxMKTsKKwlob3N0LT50cmFuc3BvcnR0ID0gTkNSXzcwMF90cmFuc3BvcnRfdGVtcGxhdGU7CisJaG9zdC0+dW5pcXVlX2lkID0gaG9zdGRhdGEtPmJhc2U7CisJaG9zdC0+YmFzZSA9IGhvc3RkYXRhLT5iYXNlOworCWhvc3RkYXRhLT5laF9jb21wbGV0ZSA9IE5VTEw7CisJaG9zdC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZylob3N0ZGF0YTsKKwkvKiBraWNrIHRoZSBjaGlwICovCisJTkNSXzcwMF93cml0ZWIoMHhmZiwgaG9zdCwgQ1RFU1Q5X1JFRyk7CisJaWYoaG9zdGRhdGEtPmNoaXA3MTApIAorCQlob3N0ZGF0YS0+cmV2ID0gKE5DUl83MDBfcmVhZGIoaG9zdCwgQ1RFU1Q4X1JFRyk+PjQpICYgMHgwZjsKKwllbHNlCisJCWhvc3RkYXRhLT5yZXYgPSAoTkNSXzcwMF9yZWFkYihob3N0LCBDVEVTVDdfUkVHKT4+NCkgJiAweDBmOworCWhvc3RkYXRhLT5mYXN0ID0gKE5DUl83MDBfcmVhZGIoaG9zdCwgQ1RFU1Q5X1JFRykgPT0gMCk7CisJaWYoYmFubmVyID09IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICI1M2M3MDA6IFZlcnNpb24gIiBOQ1JfNzAwX1ZFUlNJT04gIiBCeSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tXG4iKTsKKwkJYmFubmVyID0gMTsKKwl9CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6ICVzIHJldiAlZCAlc1xuIiwgaG9zdC0+aG9zdF9ubywKKwkgICAgICAgaG9zdGRhdGEtPmNoaXA3MTAgPyAiNTNjNzEwIiA6IAorCSAgICAgICAoaG9zdGRhdGEtPmZhc3QgPyAiNTNjNzAwLTY2IiA6ICI1M2M3MDAiKSwKKwkgICAgICAgaG9zdGRhdGEtPnJldiwgaG9zdGRhdGEtPmRpZmZlcmVudGlhbCA/CisJICAgICAgICIoRGlmZmVyZW50aWFsKSIgOiAiIik7CisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlOQ1JfNzAwX2NoaXBfcmVzZXQoaG9zdCk7CisKKwlpZiAoc2NzaV9hZGRfaG9zdChob3N0LCBkZXYpKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgIjUzYzcwMDogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpOworCQlzY3NpX2hvc3RfcHV0KGhvc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGlfc2lnbmFsbGluZyhob3N0KSA9IGhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPyBTUElfU0lHTkFMX0hWRCA6CisJCVNQSV9TSUdOQUxfU0U7CisKKwlyZXR1cm4gaG9zdDsKK30KKworaW50CitOQ1JfNzAwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWRtYV9mcmVlX25vbmNvaGVyZW50KGhvc3RkYXRhLT5kZXYsIFRPVEFMX01FTV9TSVpFLAorCQkJICAgICAgIGhvc3RkYXRhLT5zY3JpcHQsIGhvc3RkYXRhLT5wU2NyaXB0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2lkZW50aWZ5KGludCBjYW5fZGlzY29ubmVjdCwgX191OCBsdW4pCit7CisJcmV0dXJuIElERU5USUZZX0JBU0UgfAorCQkoKGNhbl9kaXNjb25uZWN0KSA/IDB4NDAgOiAwKSB8CisJCShsdW4gJiBOQ1JfNzAwX0xVTl9NQVNLKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBkYXRhX3Jlc2lkdWFsIChTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IHJldHVybiByZXNpZHVhbCBkYXRhIGNvdW50IG9mIHdoYXQncyBpbiB0aGUgY2hpcC4gIElmIHlvdQorICogcmVhbGx5IHdhbnQgdG8ga25vdyB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgZG9pbmcsIGl0J3MgYWxtb3N0IGEKKyAqIGRpcmVjdCB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGluIHRoZSA1M2M3MTAKKyAqIGd1aWRlLCBleGNlcHQgdGhhdCB0aGUgREJDIGFuZCBERklGTyByZWdpc3RlcnMgYXJlIG9ubHkgNiBiaXRzCisgKiB3aWRlIG9uIGEgNTNjNzAwLgorICoKKyAqIElucHV0cyA6IGhvc3QgLSBTQ1NJIGhvc3QgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitOQ1JfNzAwX2RhdGFfcmVzaWR1YWwgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlpbnQgY291bnQsIHN5bmNocm9ub3VzID0gMDsKKwl1bnNpZ25lZCBpbnQgZGRpcjsKKworCWlmKGhvc3RkYXRhLT5jaGlwNzEwKSB7CisJCWNvdW50ID0gKChOQ1JfNzAwX3JlYWRiKGhvc3QsIERGSUZPX1JFRykgJiAweDdmKSAtCisJCQkgKE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweDdmKSkgJiAweDdmOworCX0gZWxzZSB7CisJCWNvdW50ID0gKChOQ1JfNzAwX3JlYWRiKGhvc3QsIERGSUZPX1JFRykgJiAweDNmKSAtCisJCQkgKE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweDNmKSkgJiAweDNmOworCX0KKwkKKwlpZihob3N0ZGF0YS0+ZmFzdCkKKwkJc3luY2hyb25vdXMgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNYRkVSX1JFRykgJiAweDBmOworCQorCS8qIGdldCB0aGUgZGF0YSBkaXJlY3Rpb24gKi8KKwlkZGlyID0gTkNSXzcwMF9yZWFkYihob3N0LCBDVEVTVDBfUkVHKSAmIDB4MDE7CisKKwlpZiAoZGRpcikgeworCQkvKiBSZWNlaXZlICovCisJCWlmIChzeW5jaHJvbm91cykgCisJCQljb3VudCArPSAoTkNSXzcwMF9yZWFkYihob3N0LCBTU1RBVDJfUkVHKSAmIDB4ZjApID4+IDQ7CisJCWVsc2UKKwkJCWlmIChOQ1JfNzAwX3JlYWRiKGhvc3QsIFNTVEFUMV9SRUcpICYgU0lETF9SRUdfRlVMTCkKKwkJCQkrK2NvdW50OworCX0gZWxzZSB7CisJCS8qIFNlbmQgKi8KKwkJX191OCBzc3RhdCA9IE5DUl83MDBfcmVhZGIoaG9zdCwgU1NUQVQxX1JFRyk7CisJCWlmIChzc3RhdCAmIFNPRExfUkVHX0ZVTEwpCisJCQkrK2NvdW50OworCQlpZiAoc3luY2hyb25vdXMgJiYgKHNzdGF0ICYgU09EUl9SRUdfRlVMTCkpCisJCQkrK2NvdW50OworCX0KKyNpZmRlZiBOQ1JfNzAwX0RFQlVHCisJaWYoY291bnQpCisJCXByaW50aygiUkVTSURVQUwgSVMgJWQgKGRkaXIgJWQpXG4iLCBjb3VudCwgZGRpcik7CisjZW5kaWYKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHByaW50IG91dCB0aGUgU0NTSSB3aXJlcyBhbmQgY29ycmVzcG9uZGluZyBwaGFzZSBmcm9tIHRoZSBTQkNMIHJlZ2lzdGVyCisgKiBpbiB0aGUgY2hpcCAqLworc3RhdGljIGlubGluZSBjaGFyICoKK3NiY2xfdG9fc3RyaW5nKF9fdTggc2JjbCkKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY2hhciByZXRbMjU2XTsKKworCXJldFswXT0nXDAnOworCWZvcihpPTA7IGk8ODsgaSsrKSB7CisJCWlmKCgxPDxpKSAmIHNiY2wpIAorCQkJc3RyY2F0KHJldCwgTkNSXzcwMF9TQkNMX2JpdHNbaV0pOworCX0KKwlzdHJjYXQocmV0LCBOQ1JfNzAwX1NCQ0xfdG9fcGhhc2Vbc2JjbCAmIDB4MDddKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIF9fdTgKK2JpdG1hcF90b19udW1iZXIoX191OCBiaXRtYXApCit7CisJX191OCBpOworCisJZm9yKGk9MDsgaTw4ICYmICEoYml0bWFwICYoMTw8aSkpOyBpKyspCisJCTsKKwlyZXR1cm4gaTsKK30KKworLyogUHVsbCBhIHNsb3Qgb2ZmIHRoZSBmcmVlIGxpc3QgKi8KK1NUQVRJQyBzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKgorZmluZF9lbXB0eV9zbG90KHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEpCit7CisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90ID0gaG9zdGRhdGEtPmZyZWVfbGlzdDsKKworCWlmKHNsb3QgPT0gTlVMTCkgeworCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJaWYoaG9zdGRhdGEtPmNvbW1hbmRfc2xvdF9jb3VudCAhPSBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QpCisJCQlwcmludGsoS0VSTl9FUlIgIlNMT1RTIEZVTEwsIGJ1dCBjb3VudCBpcyAlZCwgc2hvdWxkIGJlICVkXG4iLCBob3N0ZGF0YS0+Y29tbWFuZF9zbG90X2NvdW50LCBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZihzbG90LT5zdGF0ZSAhPSBOQ1JfNzAwX1NMT1RfRlJFRSkKKwkJLyogc2hvdWxkIHBhbmljISAqLworCQlwcmludGsoS0VSTl9FUlIgIkJVU1kgU0xPVCBPTiBGUkVFIExJU1QhISFcbiIpOworCQkKKworCWhvc3RkYXRhLT5mcmVlX2xpc3QgPSBzbG90LT5JVExfZm9ydzsKKwlzbG90LT5JVExfZm9ydyA9IE5VTEw7CisKKworCS8qIE5PVEU6IHNldCB0aGUgc3RhdGUgdG8gYnVzeSBoZXJlLCBub3QgcXVldWVkLCBzaW5jZSB0aGlzCisJICogaW5kaWNhdGVzIHRoZSBzbG90IGlzIGluIHVzZSBhbmQgY2Fubm90IGJlIHJ1biBieSB0aGUgSVJRCisJICogZmluaXNoIHJvdXRpbmUuICBJZiB3ZSBjYW5ub3QgcXVldWUgdGhlIGNvbW1hbmQgd2hlbiBpdAorCSAqIGlzIHByb3Blcmx5IGJ1aWxkLCB3ZSB0aGVuIGNoYW5nZSB0byBOQ1JfNzAwX1NMT1RfUVVFVUVEICovCisJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfQlVTWTsKKwlob3N0ZGF0YS0+Y29tbWFuZF9zbG90X2NvdW50Kys7CisJCisJcmV0dXJuIHNsb3Q7Cit9CisKK1NUQVRJQyB2b2lkIAorZnJlZV9zbG90KHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCwKKwkgIHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEpCit7CisJaWYoKHNsb3QtPnN0YXRlICYgTkNSXzcwMF9TTE9UX01BU0spICE9IE5DUl83MDBfU0xPVF9NQUdJQykgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzcwMDogU0xPVCAlcCBpcyBub3QgTUFHSUMhISFcbiIsIHNsb3QpOworCX0KKwlpZihzbG90LT5zdGF0ZSA9PSBOQ1JfNzAwX1NMT1RfRlJFRSkgeworCQlwcmludGsoS0VSTl9FUlIgIjUzYzcwMDogU0xPVCAlcCBpcyBGUkVFISEhXG4iLCBzbG90KTsKKwl9CisJCisJc2xvdC0+cmVzdW1lX29mZnNldCA9IDA7CisJc2xvdC0+Y21uZCA9IE5VTEw7CisJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfRlJFRTsKKwlzbG90LT5JVExfZm9ydyA9IGhvc3RkYXRhLT5mcmVlX2xpc3Q7CisJaG9zdGRhdGEtPmZyZWVfbGlzdCA9IHNsb3Q7CisJaG9zdGRhdGEtPmNvbW1hbmRfc2xvdF9jb3VudC0tOworfQorCisKKy8qIFRoaXMgcm91dGluZSByZWFsbHkgZG9lcyB2ZXJ5IGxpdHRsZS4gIFRoZSBjb21tYW5kIGlzIGluZGV4ZWQgb24KKyAgIHRoZSBJVEwgYW5kIChpZiB0YWdnZWQpIHRoZSBJVExRIGxpc3RzIGluIF9xdWV1ZWNvbW1hbmQgKi8KK1NUQVRJQyB2b2lkCitzYXZlX2Zvcl9yZXNlbGVjdGlvbihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLAorCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcCwgX191MzIgZHNwKQoreworCS8qIEl0cyBqdXN0IHBvc3NpYmxlIHRoYXQgdGhpcyBnZXRzIGV4ZWN1dGVkIHR3aWNlICovCisJaWYoU0NwICE9IE5VTEwpIHsKKwkJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90ID0KKwkJCShzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKilTQ3AtPmhvc3Rfc2NyaWJibGU7CisKKwkJc2xvdC0+cmVzdW1lX29mZnNldCA9IGRzcDsKKwl9CisJaG9zdGRhdGEtPnN0YXRlID0gTkNSXzcwMF9IT1NUX0ZSRUU7CisJaG9zdGRhdGEtPmNtZCA9IE5VTEw7Cit9CisKK1NUQVRJQyBpbmxpbmUgdm9pZAorTkNSXzcwMF91bm1hcChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLCBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AsCisJICAgICAgc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90KQoreworCWlmKFNDcC0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gRE1BX05PTkUgJiYKKwkgICBTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uICE9IERNQV9CSURJUkVDVElPTkFMKSB7CisJCWlmKFNDcC0+dXNlX3NnKSB7CisJCQlkbWFfdW5tYXBfc2coaG9zdGRhdGEtPmRldiwgU0NwLT5idWZmZXIsCisJCQkJICAgICBTQ3AtPnVzZV9zZywgU0NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIHNsb3QtPmRtYV9oYW5kbGUsCisJCQkJCSBTQ3AtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJIFNDcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9CisJfQorfQorCitTVEFUSUMgaW5saW5lIHZvaWQKK05DUl83MDBfc2NzaV9kb25lKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEsCisJICAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcCwgaW50IHJlc3VsdCkKK3sKKwlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfRlJFRTsKKwlob3N0ZGF0YS0+Y21kID0gTlVMTDsKKworCWlmKFNDcCAhPSBOVUxMKSB7CisJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9IAorCQkJKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZTsKKwkJCisJCU5DUl83MDBfdW5tYXAoaG9zdGRhdGEsIFNDcCwgc2xvdCk7CisJCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgc2xvdC0+cENtZCwKKwkJCQkgc2l6ZW9mKFNDcC0+Y21uZCksIERNQV9UT19ERVZJQ0UpOworCQlpZihTQ3AtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBTQ3AtPmNtbmRbNl0gPT0gTkNSXzcwMF9JTlRFUk5BTF9TRU5TRV9NQUdJQykgeworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJCXByaW50aygiIE9SSUdJTkFMIENNRCAlcCBSRVRVUk5FRCAlZCwgbmV3IHJldHVybiBpcyAlZCBzZW5zZSBpc1xuIiwKKwkJCSAgICAgICBTQ3AsIFNDcC0+Y21uZFs3XSwgcmVzdWx0KTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2UoIjUzYzcwMCIsIFNDcCk7CisKKyNlbmRpZgorCQkJLyogcmVzdG9yZSB0aGUgb2xkIHJlc3VsdCBpZiB0aGUgcmVxdWVzdCBzZW5zZSB3YXMKKwkJCSAqIHN1Y2Nlc3NmdWwgKi8KKwkJCWlmKHJlc3VsdCA9PSAwKQorCQkJCXJlc3VsdCA9IFNDcC0+Y21uZFs3XTsKKwkJCS8qIG5vdyByZXN0b3JlIHRoZSBvcmlnaW5hbCBjb21tYW5kICovCisJCQltZW1jcHkoKHZvaWQgKikgU0NwLT5jbW5kLCAodm9pZCAqKSBTQ3AtPmRhdGFfY21uZCwKKwkJCSAgICAgICBzaXplb2YoU0NwLT5kYXRhX2NtbmQpKTsKKwkJCVNDcC0+cmVxdWVzdF9idWZmZXIgPSBTQ3AtPmJ1ZmZlcjsKKwkJCVNDcC0+cmVxdWVzdF9idWZmbGVuID0gU0NwLT5idWZmbGVuOworCQkJU0NwLT51c2Vfc2cgPSBTQ3AtPm9sZF91c2Vfc2c7CisJCQlTQ3AtPmNtZF9sZW4gPSBTQ3AtPm9sZF9jbWRfbGVuOworCQkJU0NwLT5zY19kYXRhX2RpcmVjdGlvbiA9IFNDcC0+c2Nfb2xkX2RhdGFfZGlyZWN0aW9uOworCQkJU0NwLT51bmRlcmZsb3cgPSBTQ3AtPm9sZF91bmRlcmZsb3c7CisJCQkKKwkJfQorCQlmcmVlX3Nsb3Qoc2xvdCwgaG9zdGRhdGEpOworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJaWYoTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpID09IDAgfHwKKwkJICAgTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpID4gU0NwLT5kZXZpY2UtPnF1ZXVlX2RlcHRoKQorCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGRlcHRoIGluIE5DUl83MDBfc2NzaV9kb25lKCk6ICVkXG4iLAorCQkJICAgICAgIE5DUl83MDBfZ2V0X2RlcHRoKFNDcC0+ZGV2aWNlKSk7CisjZW5kaWYgLyogTkNSXzcwMF9ERUJVRyAqLworCQlOQ1JfNzAwX3NldF9kZXB0aChTQ3AtPmRldmljZSwgTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpIC0gMSk7CisKKwkJU0NwLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJU0NwLT5yZXN1bHQgPSByZXN1bHQ7CisJCVNDcC0+c2NzaV9kb25lKFNDcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI1M2M3MDA6IFNDU0kgRE9ORSBIQVMgTlVMTCBTQ3BcbiIpOworCX0KK30KKworCitTVEFUSUMgdm9pZAorTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwkvKiBCdXMgcmVzZXQgKi8KKwlOQ1JfNzAwX3dyaXRlYihBU1NFUlRfUlNULCBob3N0LCBTQ05UTDFfUkVHKTsKKwl1ZGVsYXkoNTApOworCU5DUl83MDBfd3JpdGViKDAsIGhvc3QsIFNDTlRMMV9SRUcpOworCit9CisKK1NUQVRJQyB2b2lkCitOQ1JfNzAwX2NoaXBfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlfX3UzMiBkY250bF9leHRyYSA9IDA7CisJX191OCBtaW5fcGVyaW9kOworCV9fdTggbWluX3hmZXJwID0gKGhvc3RkYXRhLT5jaGlwNzEwID8gTkNSXzcxMF9NSU5fWEZFUlAgOiBOQ1JfNzAwX01JTl9YRkVSUCk7CisKKwlpZihob3N0ZGF0YS0+Y2hpcDcxMCkgeworCQlfX3U4IGJ1cnN0X2Rpc2FibGUgPSBob3N0ZGF0YS0+YnVyc3RfZGlzYWJsZQorCQkJPyBCVVJTVF9ESVNBQkxFIDogMDsKKwkJZGNudGxfZXh0cmEgPSBDT01QQVRfNzAwX01PREU7CisKKwkJTkNSXzcwMF93cml0ZWIoZGNudGxfZXh0cmEsIGhvc3QsIERDTlRMX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEJVUlNUX0xFTkdUSF84ICB8IGhvc3RkYXRhLT5kbW9kZV9leHRyYSwKKwkJCSAgICAgICBob3N0LCBETU9ERV83MTBfUkVHKTsKKwkJTkNSXzcwMF93cml0ZWIoYnVyc3RfZGlzYWJsZSB8IChob3N0ZGF0YS0+ZGlmZmVyZW50aWFsID8gCisJCQkJCQlESUZGIDogMCksIGhvc3QsIENURVNUN19SRUcpOworCQlOQ1JfNzAwX3dyaXRlYihCVEJfVElNRVJfRElTQUJMRSwgaG9zdCwgQ1RFU1QwX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEZVTExfQVJCSVRSQVRJT04gfCBFTkFCTEVfUEFSSVRZIHwgUEFSSVRZCisJCQkgICAgICAgfCBBVVRPX0FUTiwgaG9zdCwgU0NOVEwwX1JFRyk7CisJfSBlbHNlIHsKKwkJTkNSXzcwMF93cml0ZWIoQlVSU1RfTEVOR1RIXzggfCBob3N0ZGF0YS0+ZG1vZGVfZXh0cmEsCisJCQkgICAgICAgaG9zdCwgRE1PREVfNzAwX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKGhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPyAKKwkJCSAgICAgICBESUZGIDogMCwgaG9zdCwgQ1RFU1Q3X1JFRyk7CisJCWlmKGhvc3RkYXRhLT5mYXN0KSB7CisJCQkvKiB0aGlzIGlzIGZvciA3MDAtNjYsIGRvZXMgbm90aGluZyBvbiA3MDAgKi8KKwkJCU5DUl83MDBfd3JpdGViKExBU1RfRElTX0VOQkwgfCBFTkFCTEVfQUNUSVZFX05FR0FUSU9OIAorCQkJCSAgICAgICB8IEdFTkVSQVRFX1JFQ0VJVkVfUEFSSVRZLCBob3N0LAorCQkJCSAgICAgICBDVEVTVDhfUkVHKTsKKwkJfSBlbHNlIHsKKwkJCU5DUl83MDBfd3JpdGViKEZVTExfQVJCSVRSQVRJT04gfCBFTkFCTEVfUEFSSVRZCisJCQkJICAgICAgIHwgUEFSSVRZIHwgQVVUT19BVE4sIGhvc3QsIFNDTlRMMF9SRUcpOworCQl9CisJfQorCisJTkNSXzcwMF93cml0ZWIoMSA8PCBob3N0LT50aGlzX2lkLCBob3N0LCBTQ0lEX1JFRyk7CisJTkNSXzcwMF93cml0ZWIoMCwgaG9zdCwgU0JDTF9SRUcpOworCU5DUl83MDBfd3JpdGViKEFTWU5DX09QRVJBVElPTiwgaG9zdCwgU1hGRVJfUkVHKTsKKworCU5DUl83MDBfd3JpdGViKFBIQVNFX01NX0lOVCB8IFNFTF9USU1FT1VUX0lOVCB8IEdST1NTX0VSUl9JTlQgfCBVWF9ESVNDX0lOVAorCSAgICAgfCBSU1RfSU5UIHwgUEFSX0VSUl9JTlQgfCBTRUxFQ1RfSU5ULCBob3N0LCBTSUVOX1JFRyk7CisKKwlOQ1JfNzAwX3dyaXRlYihBQk9SVF9JTlQgfCBJTlRfSU5TVF9JTlQgfCBJTEdMX0lOU1RfSU5ULCBob3N0LCBESUVOX1JFRyk7CisJTkNSXzcwMF93cml0ZWIoRU5BQkxFX1NFTEVDVCwgaG9zdCwgU0NOVEwxX1JFRyk7CisJaWYoaG9zdGRhdGEtPmNsb2NrID4gNzUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICI1M2M3MDA6IENsb2NrIHNwZWVkICVkTUh6IGlzIHRvbyBoaWdoOiA3NU1oeiBpcyB0aGUgbWF4aW11bSB0aGlzIGNoaXAgY2FuIGJlIGRyaXZlbiBhdFxuIiwgaG9zdGRhdGEtPmNsb2NrKTsKKwkJLyogZG8gdGhlIGJlc3Qgd2UgY2FuLCBidXQgdGhlIGFzeW5jIGNsb2NrIHdpbGwgYmUgb3V0CisJCSAqIG9mIHNwZWM6IHN5bmMgZGl2aWRlciAyLCBhc3luYyBkaXZpZGVyIDMgKi8KKwkJREVCVUcoKCI1M2M3MDA6IHN5bmMgMiBhc3luYyAzXG4iKSk7CisJCU5DUl83MDBfd3JpdGViKFNZTkNfRElWXzJfMCwgaG9zdCwgU0JDTF9SRUcpOworCQlOQ1JfNzAwX3dyaXRlYihBU1lOQ19ESVZfM18wIHwgZGNudGxfZXh0cmEsIGhvc3QsIERDTlRMX1JFRyk7CisJCWhvc3RkYXRhLT5zeW5jX2Nsb2NrID0gaG9zdGRhdGEtPmNsb2NrLzI7CisJfSBlbHNlCWlmKGhvc3RkYXRhLT5jbG9jayA+IDUwICAmJiBob3N0ZGF0YS0+Y2xvY2sgPD0gNzUpIHsKKwkJLyogc3luYyBkaXZpZGVyIDEuNSwgYXN5bmMgZGl2aWRlciAzICovCisJCURFQlVHKCgiNTNjNzAwOiBzeW5jIDEuNSBhc3luYyAzXG4iKSk7CisJCU5DUl83MDBfd3JpdGViKFNZTkNfRElWXzFfNSwgaG9zdCwgU0JDTF9SRUcpOworCQlOQ1JfNzAwX3dyaXRlYihBU1lOQ19ESVZfM18wIHwgZGNudGxfZXh0cmEsIGhvc3QsIERDTlRMX1JFRyk7CisJCWhvc3RkYXRhLT5zeW5jX2Nsb2NrID0gaG9zdGRhdGEtPmNsb2NrKjI7CisJCWhvc3RkYXRhLT5zeW5jX2Nsb2NrIC89IDM7CisJCQorCX0gZWxzZSBpZihob3N0ZGF0YS0+Y2xvY2sgPiAzNyAmJiBob3N0ZGF0YS0+Y2xvY2sgPD0gNTApIHsKKwkJLyogc3luYyBkaXZpZGVyIDEsIGFzeW5jIGRpdmlkZXIgMiAqLworCQlERUJVRygoIjUzYzcwMDogc3luYyAxIGFzeW5jIDJcbiIpKTsKKwkJTkNSXzcwMF93cml0ZWIoU1lOQ19ESVZfMV8wLCBob3N0LCBTQkNMX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEFTWU5DX0RJVl8yXzAgfCBkY250bF9leHRyYSwgaG9zdCwgRENOVExfUkVHKTsKKwkJaG9zdGRhdGEtPnN5bmNfY2xvY2sgPSBob3N0ZGF0YS0+Y2xvY2s7CisJfSBlbHNlIGlmKGhvc3RkYXRhLT5jbG9jayA+IDI1ICYmIGhvc3RkYXRhLT5jbG9jayA8PTM3KSB7CisJCS8qIHN5bmMgZGl2aWRlciAxLCBhc3luYyBkaXZpZGVyIDEuNSAqLworCQlERUJVRygoIjUzYzcwMDogc3luYyAxIGFzeW5jIDEuNVxuIikpOworCQlOQ1JfNzAwX3dyaXRlYihTWU5DX0RJVl8xXzAsIGhvc3QsIFNCQ0xfUkVHKTsKKwkJTkNSXzcwMF93cml0ZWIoQVNZTkNfRElWXzFfNSB8IGRjbnRsX2V4dHJhLCBob3N0LCBEQ05UTF9SRUcpOworCQlob3N0ZGF0YS0+c3luY19jbG9jayA9IGhvc3RkYXRhLT5jbG9jazsKKwl9IGVsc2UgeworCQlERUJVRygoIjUzYzcwMDogc3luYyAxIGFzeW5jIDFcbiIpKTsKKwkJTkNSXzcwMF93cml0ZWIoU1lOQ19ESVZfMV8wLCBob3N0LCBTQkNMX1JFRyk7CisJCU5DUl83MDBfd3JpdGViKEFTWU5DX0RJVl8xXzAgfCBkY250bF9leHRyYSwgaG9zdCwgRENOVExfUkVHKTsKKwkJLyogc3luYyBkaXZpZGVyIDEsIGFzeW5jIGRpdmlkZXIgMSAqLworCQlob3N0ZGF0YS0+c3luY19jbG9jayA9IGhvc3RkYXRhLT5jbG9jazsKKwl9CisJLyogQ2FsY3VsYXRlIHRoZSBhY3R1YWwgbWluaW11bSBwZXJpb2QgdGhhdCBjYW4gYmUgc3VwcG9ydGVkCisJICogYnkgb3VyIHN5bmNocm9ub3VzIGNsb2NrIHNwZWVkLiAgU2VlIHRoZSA3MTAgbWFudWFsIGZvcgorCSAqIGV4YWN0IGRldGFpbHMgb2YgdGhpcyBjYWxjdWxhdGlvbiB3aGljaCBpcyBiYXNlZCBvbiBhCisJICogc2V0dGluZyBvZiB0aGUgU1hGRVIgcmVnaXN0ZXIgKi8KKwltaW5fcGVyaW9kID0gMTAwMCooNCttaW5feGZlcnApLyg0Kmhvc3RkYXRhLT5zeW5jX2Nsb2NrKTsKKwlob3N0ZGF0YS0+bWluX3BlcmlvZCA9IE5DUl83MDBfTUlOX1BFUklPRDsKKwlpZihtaW5fcGVyaW9kID4gTkNSXzcwMF9NSU5fUEVSSU9EKQorCQlob3N0ZGF0YS0+bWluX3BlcmlvZCA9IG1pbl9wZXJpb2Q7Cit9CisKK1NUQVRJQyB2b2lkCitOQ1JfNzAwX2NoaXBfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlpZihob3N0ZGF0YS0+Y2hpcDcxMCkgeworCQlOQ1JfNzAwX3dyaXRlYihTT0ZUV0FSRV9SRVNFVF83MTAsIGhvc3QsIElTVEFUX1JFRyk7CisJCXVkZWxheSgxMDApOworCisJCU5DUl83MDBfd3JpdGViKDAsIGhvc3QsIElTVEFUX1JFRyk7CisJfSBlbHNlIHsKKwkJTkNSXzcwMF93cml0ZWIoU09GVFdBUkVfUkVTRVQsIGhvc3QsIERDTlRMX1JFRyk7CisJCXVkZWxheSgxMDApOworCQkKKwkJTkNSXzcwMF93cml0ZWIoMCwgaG9zdCwgRENOVExfUkVHKTsKKwl9CisKKwltZGVsYXkoMTAwMCk7CisKKwlOQ1JfNzAwX2NoaXBfc2V0dXAoaG9zdCk7Cit9CisKKy8qIFRoZSBoZWFydCBvZiB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIGVuZ2luZSBpcyB0aGF0IHRoZSBpbnN0cnVjdGlvbgorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIElOVCBpcyB0aGUgbm9ybWFsIGNhc2UgKGFuZCBzbyBtdXN0IGJlIENMRUFSCisgKiBBQ0spLiAgSWYgd2Ugd2FudCB0byBkbyBzb21ldGhpbmcgZWxzZSwgd2UgY2FsbCB0aGF0IHJvdXRpbmUgaW4KKyAqIHNjcmlwdHMgYW5kIHNldCB0ZW1wIHRvIGJlIHRoZSBub3JtYWwgY2FzZSArIDggKHNraXBwaW5nIHRoZSBDTEVBUgorICogQUNLKSBzbyB0aGF0IHRoZSByb3V0aW5lIHJldHVybnMgY29ycmVjdGx5IHRvIHJlc3VtZSBpdHMgYWN0aXZpdHkKKyAqICovCitTVEFUSUMgX191MzIKK3Byb2Nlc3NfZXh0ZW5kZWRfbWVzc2FnZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCAKKwkJCSBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhLAorCQkJIHN0cnVjdCBzY3NpX2NtbmQgKlNDcCwgX191MzIgZHNwLCBfX3UzMiBkc3BzKQoreworCV9fdTMyIHJlc3VtZV9vZmZzZXQgPSBkc3AsIHRlbXAgPSBkc3AgKyA4OworCV9fdTggcHVuID0gMHhmZiwgbHVuID0gMHhmZjsKKworCWlmKFNDcCAhPSBOVUxMKSB7CisJCXB1biA9IFNDcC0+ZGV2aWNlLT5pZDsKKwkJbHVuID0gU0NwLT5kZXZpY2UtPmx1bjsKKwl9CisKKwlzd2l0Y2goaG9zdGRhdGEtPm1zZ2luWzJdKSB7CisJY2FzZSBBX1NEVFJfTVNHOgorCQlpZihTQ3AgIT0gTlVMTCAmJiBOQ1JfNzAwX2lzX2ZsYWdfc2V0KFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKSkgeworCQkJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gU0NwLT5kZXZpY2UtPnNkZXZfdGFyZ2V0OworCQkJX191OCBwZXJpb2QgPSBob3N0ZGF0YS0+bXNnaW5bM107CisJCQlfX3U4IG9mZnNldCA9IGhvc3RkYXRhLT5tc2dpbls0XTsKKworCQkJaWYob2Zmc2V0ID09IDAgfHwgcGVyaW9kID09IDApIHsKKwkJCQlvZmZzZXQgPSAwOworCQkJCXBlcmlvZCA9IDA7CisJCQl9CisKKwkJCXNwaV9vZmZzZXQoc3RhcmdldCkgPSBvZmZzZXQ7CisJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gcGVyaW9kOworCQkJCisJCQlpZihOQ1JfNzAwX2lzX2ZsYWdfc2V0KFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9QUklOVF9TWU5DX05FR09USUFUSU9OKSkgeworCQkJCXNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHN0YXJnZXQpOworCQkJCU5DUl83MDBfY2xlYXJfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfUFJJTlRfU1lOQ19ORUdPVElBVElPTik7CisJCQl9CisJCQkKKwkJCU5DUl83MDBfc2V0X2ZsYWcoU0NwLT5kZXZpY2UsIE5DUl83MDBfREVWX05FR09USUFURURfU1lOQyk7CisJCQlOQ1JfNzAwX2NsZWFyX2ZsYWcoU0NwLT5kZXZpY2UsIE5DUl83MDBfREVWX0JFR0lOX1NZTkNfTkVHT1RJQVRJT04pOworCQkJCisJCQlOQ1JfNzAwX3dyaXRlYihOQ1JfNzAwX2dldF9TWEZFUihTQ3AtPmRldmljZSksCisJCQkJICAgICAgIGhvc3QsIFNYRkVSX1JFRyk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIFNEVFIgbWVzc2FnZSBvdXQgb2YgdGhlIGJsdWUsIHJlamVjdCBpdCAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIFVuZXhwZWN0ZWQgU0RUUiBtc2dcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubyk7CisJCQlob3N0ZGF0YS0+bXNnb3V0WzBdID0gQV9SRUpFQ1RfTVNHOworCQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgMSwgRE1BX1RPX0RFVklDRSk7CisJCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJCS8qIFNlbmRNc2dPdXQgcmV0dXJucywgc28gc2V0IHVwIHRoZSByZXR1cm4KKwkJCSAqIGFkZHJlc3MgKi8KKwkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVdpdGhBVE47CisJCX0KKwkJYnJlYWs7CisJCisJY2FzZSBBX1dEVFJfTVNHOgorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6ICglZDolZCksIFVuc29saWNpdGVkIFdEVFIgYWZ0ZXIgQ01ELCBSZWplY3RpbmdcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1bik7CisJCWhvc3RkYXRhLT5tc2dvdXRbMF0gPSBBX1JFSkVDVF9NU0c7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbmRNZXNzYWdlV2l0aEFUTjsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpOiBVbmV4cGVjdGVkIG1lc3NhZ2UgJXM6ICIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwKKwkJICAgICAgIE5DUl83MDBfcGhhc2VbKGRzcHMgJiAweGYwMCkgPj4gOF0pOworCQlzY3NpX3ByaW50X21zZyhob3N0ZGF0YS0+bXNnaW4pOworCQlwcmludGsoIlxuIik7CisJCS8qIGp1c3QgcmVqZWN0IGl0ICovCisJCWhvc3RkYXRhLT5tc2dvdXRbMF0gPSBBX1JFSkVDVF9NU0c7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJLyogU2VuZE1zZ091dCByZXR1cm5zLCBzbyBzZXQgdXAgdGhlIHJldHVybgorCQkgKiBhZGRyZXNzICovCisJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVdpdGhBVE47CisJfQorCU5DUl83MDBfd3JpdGVsKHRlbXAsIGhvc3QsIFRFTVBfUkVHKTsKKwlyZXR1cm4gcmVzdW1lX29mZnNldDsKK30KKworU1RBVElDIF9fdTMyCitwcm9jZXNzX21lc3NhZ2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSwKKwkJc3RydWN0IHNjc2lfY21uZCAqU0NwLCBfX3UzMiBkc3AsIF9fdTMyIGRzcHMpCit7CisJLyogd29yayBvdXQgd2hlcmUgdG8gcmV0dXJuIHRvICovCisJX191MzIgdGVtcCA9IGRzcCArIDgsIHJlc3VtZV9vZmZzZXQgPSBkc3A7CisJX191OCBwdW4gPSAweGZmLCBsdW4gPSAweGZmOworCisJaWYoU0NwICE9IE5VTEwpIHsKKwkJcHVuID0gU0NwLT5kZXZpY2UtPmlkOworCQlsdW4gPSBTQ3AtPmRldmljZS0+bHVuOworCX0KKworI2lmZGVmIE5DUl83MDBfREVCVUcKKwlwcmludGsoInNjc2klZCAoJWQ6JWQpOiBtZXNzYWdlICVzOiAiLCBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwKKwkgICAgICAgTkNSXzcwMF9waGFzZVsoZHNwcyAmIDB4ZjAwKSA+PiA4XSk7CisJc2NzaV9wcmludF9tc2coaG9zdGRhdGEtPm1zZ2luKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCXN3aXRjaChob3N0ZGF0YS0+bXNnaW5bMF0pIHsKKworCWNhc2UgQV9FWFRFTkRFRF9NU0c6CisJCXJlc3VtZV9vZmZzZXQgPSAgcHJvY2Vzc19leHRlbmRlZF9tZXNzYWdlKGhvc3QsIGhvc3RkYXRhLCBTQ3AsCisJCQkJCQkJICBkc3AsIGRzcHMpOworCQlicmVhazsKKworCWNhc2UgQV9SRUpFQ1RfTVNHOgorCQlpZihTQ3AgIT0gTlVMTCAmJiBOQ1JfNzAwX2lzX2ZsYWdfc2V0KFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKSkgeworCQkJLyogUmVqZWN0ZWQgb3VyIHN5bmMgbmVnb3RpYXRpb24gYXR0ZW1wdCAqLworCQkJc3BpX3BlcmlvZChTQ3AtPmRldmljZS0+c2Rldl90YXJnZXQpID0KKwkJCQlzcGlfb2Zmc2V0KFNDcC0+ZGV2aWNlLT5zZGV2X3RhcmdldCkgPSAwOworCQkJTkNSXzcwMF9zZXRfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DKTsKKwkJCU5DUl83MDBfY2xlYXJfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfQkVHSU5fU1lOQ19ORUdPVElBVElPTik7CisJCX0gZWxzZSBpZihTQ3AgIT0gTlVMTCAmJiBOQ1JfNzAwX2dldF90YWdfbmVnX3N0YXRlKFNDcC0+ZGV2aWNlKSA9PSBOQ1JfNzAwX0RVUklOR19UQUdfTkVHT1RJQVRJT04pIHsKKwkJCS8qIHJlamVjdGVkIG91ciBmaXJzdCBzaW1wbGUgdGFnIG1lc3NhZ2UgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCAoJWQ6JWQpIFJlamVjdGVkIGZpcnN0IHRhZyBxdWV1ZSBhdHRlbXB0LCB0dXJuaW5nIG9mZiB0YWcgcXVldWVpbmdcbiIsIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCS8qIHdlJ3JlIGRvbmUgbmVnb3RpYXRpbmcgKi8KKwkJCU5DUl83MDBfc2V0X3RhZ19uZWdfc3RhdGUoU0NwLT5kZXZpY2UsIE5DUl83MDBfRklOSVNIRURfVEFHX05FR09USUFUSU9OKTsKKwkJCWhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmPSB+KDE8PFNDcC0+ZGV2aWNlLT5pZCk7CisJCQlTQ3AtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA9IDA7CisJCQlzY3NpX2RlYWN0aXZhdGVfdGNxKFNDcC0+ZGV2aWNlLCBob3N0LT5jbWRfcGVyX2x1bik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgKCVkOiVkKSBVbmV4cGVjdGVkIFJFSkVDVCBNZXNzYWdlICVzXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkJICAgICAgIE5DUl83MDBfcGhhc2VbKGRzcHMgJiAweGYwMCkgPj4gOF0pOworCQkJLyogaG93ZXZlciwganVzdCBpZ25vcmUgaXQgKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgQV9QQVJJVFlfRVJST1JfTVNHOgorCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCAoJWQ6JWQpIFBhcml0eSBFcnJvciFcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCSAgICAgICBwdW4sIGx1bik7CisJCU5DUl83MDBfaW50ZXJuYWxfYnVzX3Jlc2V0KGhvc3QpOworCQlicmVhazsKKwljYXNlIEFfU0lNUExFX1RBR19NU0c6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpIFNJTVBMRSBUQUcgJWQgJXNcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCSAgICAgICBwdW4sIGx1biwgaG9zdGRhdGEtPm1zZ2luWzFdLAorCQkgICAgICAgTkNSXzcwMF9waGFzZVsoZHNwcyAmIDB4ZjAwKSA+PiA4XSk7CisJCS8qIGp1c3QgaWdub3JlIGl0ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpOiBVbmV4cGVjdGVkIG1lc3NhZ2UgJXM6ICIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwKKwkJICAgICAgIE5DUl83MDBfcGhhc2VbKGRzcHMgJiAweGYwMCkgPj4gOF0pOworCisJCXNjc2lfcHJpbnRfbXNnKGhvc3RkYXRhLT5tc2dpbik7CisJCXByaW50aygiXG4iKTsKKwkJLyoganVzdCByZWplY3QgaXQgKi8KKwkJaG9zdGRhdGEtPm1zZ291dFswXSA9IEFfUkVKRUNUX01TRzsKKwkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgMSwgRE1BX1RPX0RFVklDRSk7CisJCXNjcmlwdF9wYXRjaF8xNihob3N0ZGF0YS0+c2NyaXB0LCBNZXNzYWdlQ291bnQsIDEpOworCQkvKiBTZW5kTXNnT3V0IHJldHVybnMsIHNvIHNldCB1cCB0aGUgcmV0dXJuCisJCSAqIGFkZHJlc3MgKi8KKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbmRNZXNzYWdlV2l0aEFUTjsKKworCQlicmVhazsKKwl9CisJTkNSXzcwMF93cml0ZWwodGVtcCwgaG9zdCwgVEVNUF9SRUcpOworCS8qIHNldCB1cyB1cCB0byByZWNlaXZlIGFub3RoZXIgbWVzc2FnZSAqLworCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwgTVNHX0FSUkFZX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJcmV0dXJuIHJlc3VtZV9vZmZzZXQ7Cit9CisKK1NUQVRJQyBfX3UzMgorcHJvY2Vzc19zY3JpcHRfaW50ZXJydXB0KF9fdTMyIGRzcHMsIF9fdTMyIGRzcCwgc3RydWN0IHNjc2lfY21uZCAqU0NwLAorCQkJIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisJCQkgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSkKK3sKKwlfX3UzMiByZXN1bWVfb2Zmc2V0ID0gMDsKKwlfX3U4IHB1biA9IDB4ZmYsIGx1bj0weGZmOworCisJaWYoU0NwICE9IE5VTEwpIHsKKwkJcHVuID0gU0NwLT5kZXZpY2UtPmlkOworCQlsdW4gPSBTQ3AtPmRldmljZS0+bHVuOworCX0KKworCWlmKGRzcHMgPT0gQV9HT09EX1NUQVRVU19BRlRFUl9TVEFUVVMpIHsKKwkJREVCVUcoKCIgIENPTU1BTkQgQ09NUExFVEUsIHN0YXR1cz0lMDJ4XG4iLAorCQkgICAgICAgaG9zdGRhdGEtPnN0YXR1c1swXSkpOworCQkvKiBPSywgaWYgVENRIHN0aWxsIHVuZGVyIG5lZ290aWF0aW9uLCB3ZSBub3cga25vdyBpdCB3b3JrcyAqLworCQlpZiAoTkNSXzcwMF9nZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSkgPT0gTkNSXzcwMF9EVVJJTkdfVEFHX05FR09USUFUSU9OKQorCQkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSwKKwkJCQkJCSAgTkNSXzcwMF9GSU5JU0hFRF9UQUdfTkVHT1RJQVRJT04pOworCQkJCisJCS8qIGNoZWNrIGZvciBjb250aW5nZW50IGFsbGVnaWFuY2UgY29udGl0aW9ucyAqLworCQlpZihzdGF0dXNfYnl0ZShob3N0ZGF0YS0+c3RhdHVzWzBdKSA9PSBDSEVDS19DT05ESVRJT04gfHwKKwkJICAgc3RhdHVzX2J5dGUoaG9zdGRhdGEtPnN0YXR1c1swXSkgPT0gQ09NTUFORF9URVJNSU5BVEVEKSB7CisJCQlzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKnNsb3QgPQorCQkJCShzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKilTQ3AtPmhvc3Rfc2NyaWJibGU7CisJCQlpZihTQ3AtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgeworCQkJCS8qIE9PUFM6IGJhZCBkZXZpY2UsIHJldHVybmluZyBhbm90aGVyCisJCQkJICogY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbiAqLworCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkICglZDolZCkgYnJva2VuIGRldmljZSBpcyBsb29waW5nIGluIGNvbnRpbmdlbnQgYWxsZWdpYW5jZTogaWdub3JpbmdcbiIsIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCQlOQ1JfNzAwX3Njc2lfZG9uZShob3N0ZGF0YSwgU0NwLCBob3N0ZGF0YS0+c3RhdHVzWzBdKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgTkNSX0RFQlVHCisJCQkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisJCQkJcHJpbnRrKCIgIGNtZCAlcCBoYXMgc3RhdHVzICVkLCByZXF1ZXN0aW5nIHNlbnNlXG4iLAorCQkJCSAgICAgICBTQ3AsIGhvc3RkYXRhLT5zdGF0dXNbMF0pOworI2VuZGlmCisJCQkJLyogd2UgY2FuIGRlc3Ryb3kgdGhlIGNvbW1hbmQgaGVyZQorCQkJCSAqIGJlY2F1c2UgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZQorCQkJCSAqIGNvbmRpdGlvbiB3aWxsIGNhdXNlIGEgcmV0cnkgd2hpY2gKKwkJCQkgKiB3aWxsIHJlLWNvcHkgdGhlIGNvbW1hbmQgZnJvbSB0aGUKKwkJCQkgKiBzYXZlZCBkYXRhX2NtbmQuICBXZSBhbHNvIHVubWFwIGFueQorCQkJCSAqIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kCisJCQkJICogaGVyZSAqLworCQkJCU5DUl83MDBfdW5tYXAoaG9zdGRhdGEsIFNDcCwgc2xvdCk7CisKKwkJCQlTQ3AtPmNtbmRbMF0gPSBSRVFVRVNUX1NFTlNFOworCQkJCVNDcC0+Y21uZFsxXSA9IChTQ3AtPmRldmljZS0+bHVuICYgMHg3KSA8PCA1OworCQkJCVNDcC0+Y21uZFsyXSA9IDA7CisJCQkJU0NwLT5jbW5kWzNdID0gMDsKKwkJCQlTQ3AtPmNtbmRbNF0gPSBzaXplb2YoU0NwLT5zZW5zZV9idWZmZXIpOworCQkJCVNDcC0+Y21uZFs1XSA9IDA7CisJCQkJU0NwLT5jbWRfbGVuID0gNjsKKwkJCQkvKiBIZXJlJ3MgYSBxdWlldCBoYWNrOiB0aGUKKwkJCQkgKiBSRVFVRVNUX1NFTlNFIGNvbW1hbmQgaXMgc2l4IGJ5dGVzLAorCQkJCSAqIHNvIHN0b3JlIGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQKKwkJCQkgKiB0aGlzIHdhcyBhbiBpbnRlcm5hbCBzZW5zZSByZXF1ZXN0CisJCQkJICogYW5kIHRoZSBvcmlnaW5hbCBzdGF0dXMgYXQgdGhlIGVuZAorCQkJCSAqIG9mIHRoZSBjb21tYW5kICovCisJCQkJU0NwLT5jbW5kWzZdID0gTkNSXzcwMF9JTlRFUk5BTF9TRU5TRV9NQUdJQzsKKwkJCQlTQ3AtPmNtbmRbN10gPSBob3N0ZGF0YS0+c3RhdHVzWzBdOworCQkJCVNDcC0+dXNlX3NnID0gMDsKKwkJCQlTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhvc3RkYXRhLT5kZXYsIHNsb3QtPnBDbWQsCisJCQkJCQkJICAgU0NwLT5jbWRfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCQlTQ3AtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlcik7CisJCQkJc2xvdC0+ZG1hX2hhbmRsZSA9IGRtYV9tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIFNDcC0+c2Vuc2VfYnVmZmVyLCBzaXplb2YoU0NwLT5zZW5zZV9idWZmZXIpLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCXNsb3QtPlNHWzBdLmlucyA9IGJTX3RvX2hvc3QoU0NSSVBUX01PVkVfREFUQV9JTiB8IHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlcikpOworCQkJCXNsb3QtPlNHWzBdLnBBZGRyID0gYlNfdG9faG9zdChzbG90LT5kbWFfaGFuZGxlKTsKKwkJCQlzbG90LT5TR1sxXS5pbnMgPSBiU190b19ob3N0KFNDUklQVF9SRVRVUk4pOworCQkJCXNsb3QtPlNHWzFdLnBBZGRyID0gMDsKKwkJCQlzbG90LT5yZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQ7CisJCQkJZG1hX2NhY2hlX3N5bmMoc2xvdC0+U0csIHNpemVvZihzbG90LT5TR1swXSkqMiwgRE1BX1RPX0RFVklDRSk7CisJCQkJZG1hX2NhY2hlX3N5bmMoU0NwLT5zZW5zZV9idWZmZXIsIHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlciksIERNQV9GUk9NX0RFVklDRSk7CisJCQkJCisJCQkJLyogcXVldWUgdGhlIGNvbW1hbmQgZm9yIHJlaXNzdWUgKi8KKwkJCQlzbG90LT5zdGF0ZSA9IE5DUl83MDBfU0xPVF9RVUVVRUQ7CisJCQkJaG9zdGRhdGEtPnN0YXRlID0gTkNSXzcwMF9IT1NUX0ZSRUU7CisJCQkJaG9zdGRhdGEtPmNtZCA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBDdXJyZW50bHkgcmVseSBvbiB0aGUgbWlkIGxheWVyIGV2YWx1YXRpb24KKwkJCS8vIG9mIHRoZSB0YWcgcXVldWluZyBjYXBhYmlsaXR5CisJCQkvLworCQkJLy9pZihzdGF0dXNfYnl0ZShob3N0ZGF0YS0+c3RhdHVzWzBdKSA9PSBHT09EICYmCisJCQkvLyAgIFNDcC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIFNDcC0+dXNlX3NnID09IDApIHsKKwkJCS8vCS8qIFBpZ2d5IGJhY2sgdGhlIHRhZyBxdWV1ZWluZyBzdXBwb3J0CisJCQkvLwkgKiBvbiB0aGlzIGNvbW1hbmQgKi8KKwkJCS8vCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhvc3RkYXRhLT5kZXYsCisJCQkvLwkJCSAgICBzbG90LT5kbWFfaGFuZGxlLAorCQkJLy8JCQkgICAgU0NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkvLwkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOworCQkJLy8JaWYoKChjaGFyICopU0NwLT5yZXF1ZXN0X2J1ZmZlcilbN10gJiAweDAyKSB7CisJCQkvLwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiAoJWQ6JWQpIEVuYWJsaW5nIFRhZyBDb21tYW5kIFF1ZXVpbmdcbiIsIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCS8vCQlob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgfD0gKDE8PFNDcC0+ZGV2aWNlLT5pZCk7CisJCQkvLwkJTkNSXzcwMF9zZXRfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfQkVHSU5fVEFHX1FVRVVFSU5HKTsKKwkJCS8vCX0gZWxzZSB7CisJCQkvLwkJTkNSXzcwMF9jbGVhcl9mbGFnKFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9UQUdfUVVFVUVJTkcpOworCQkJLy8JCWhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmPSB+KDE8PFNDcC0+ZGV2aWNlLT5pZCk7CisJCQkvLwl9CisJCQkvL30KKwkJCU5DUl83MDBfc2NzaV9kb25lKGhvc3RkYXRhLCBTQ3AsIGhvc3RkYXRhLT5zdGF0dXNbMF0pOworCQl9CisJfSBlbHNlIGlmKChkc3BzICYgMHhmZmZmZjBmMCkgPT0gQV9VTkVYUEVDVEVEX1BIQVNFKSB7CisJCV9fdTggaSA9IChkc3BzICYgMHhmMDApID4+IDg7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCksIFVORVhQRUNURUQgUEhBU0UgJXMgKCVzKVxuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkgICAgICAgTkNSXzcwMF9waGFzZVtpXSwKKwkJICAgICAgIHNiY2xfdG9fc3RyaW5nKE5DUl83MDBfcmVhZGIoaG9zdCwgU0JDTF9SRUcpKSk7CisJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgbGVuID0gJWQsIGNtZCA9IiwgU0NwLT5jbWRfbGVuKTsKKwkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisKKwkJTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoaG9zdCk7CisJfSBlbHNlIGlmKChkc3BzICYgMHhmZmZmZjAwMCkgPT0gQV9GQVRBTCkgeworCQlpbnQgaSA9IChkc3BzICYgMHhmZmYpOworCisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAoJWQ6JWQpIEZBVEFMIEVSUk9SOiAlc1xuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLCBOQ1JfNzAwX2ZhdGFsX21lc3NhZ2VzW2ldKTsKKwkJaWYoZHNwcyA9PSBBX0ZBVEFMX0lMTEVHQUxfTVNHX0xFTkdUSCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgIG1zZyBiZWdpbnMgJTAyeCAlMDJ4XG4iLAorCQkJICAgICAgIGhvc3RkYXRhLT5tc2dpblswXSwgaG9zdGRhdGEtPm1zZ2luWzFdKTsKKwkJfQorCQlOQ1JfNzAwX2ludGVybmFsX2J1c19yZXNldChob3N0KTsKKwl9IGVsc2UgaWYoKGRzcHMgJiAweGZmZmZmMGYwKSA9PSBBX0RJU0NPTk5FQ1QpIHsKKyNpZmRlZiBOQ1JfNzAwX0RFQlVHCisJCV9fdTggaSA9IChkc3BzICYgMHhmMDApID4+IDg7CisKKwkJcHJpbnRrKCJzY3NpJWQ6ICglZDolZCksIERJU0NPTk5FQ1RFRCAoJWQpICVzXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sCisJCSAgICAgICBpLCBOQ1JfNzAwX3BoYXNlW2ldKTsKKyNlbmRpZgorCQlzYXZlX2Zvcl9yZXNlbGVjdGlvbihob3N0ZGF0YSwgU0NwLCBkc3ApOworCisJfSBlbHNlIGlmKGRzcHMgPT0gQV9SRVNFTEVDVElPTl9JREVOVElGSUVEKSB7CisJCV9fdTggbHVuOworCQlzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKnNsb3Q7CisJCV9fdTggcmVzZWxlY3Rpb25faWQgPSBob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQ7CisJCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwOworCisJCWx1biA9IGhvc3RkYXRhLT5tc2dpblswXSAmIDB4MWY7CisKKwkJaG9zdGRhdGEtPnJlc2VsZWN0aW9uX2lkID0gMHhmZjsKKwkJREVCVUcoKCJzY3NpJWQ6ICglZDolZCkgUkVTRUxFQ1RFRCFcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCByZXNlbGVjdGlvbl9pZCwgbHVuKSk7CisJCS8qIGNsZWFyIHRoZSByZXNlbGVjdGlvbiBpbmRpY2F0b3IgKi8KKwkJU0RwID0gX19zY3NpX2RldmljZV9sb29rdXAoaG9zdCwgMCwgcmVzZWxlY3Rpb25faWQsIGx1bik7CisJCWlmKHVubGlrZWx5KFNEcCA9PSBOVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgSEFTIE5PIGRldmljZVxuIiwKKwkJCSAgICAgICBob3N0LT5ob3N0X25vLCByZXNlbGVjdGlvbl9pZCwgbHVuKTsKKwkJCUJVRygpOworCQl9CisJCWlmKGhvc3RkYXRhLT5tc2dpblsxXSA9PSBBX1NJTVBMRV9UQUdfTVNHKSB7CisJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBzY3NpX2ZpbmRfdGFnKFNEcCwgaG9zdGRhdGEtPm1zZ2luWzJdKTsKKwkJCWlmKHVubGlrZWx5KFNDcCA9PSBOVUxMKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAoJWQ6JWQpIG5vIHNhdmVkIHJlcXVlc3QgZm9yIHRhZyAlZFxuIiwgCisJCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHJlc2VsZWN0aW9uX2lkLCBsdW4sIGhvc3RkYXRhLT5tc2dpblsyXSk7CisJCQkJQlVHKCk7CisJCQl9CisKKwkJCXNsb3QgPSAoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCQkJREVCVUcoKCI1M2M3MDA6ICVkOiVkOiVkLCByZXNlbGVjdGlvbiBpcyB0YWcgJWQsIHNsb3QgJXAoJWQpXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIFNEcC0+aWQsIFNEcC0+bHVuLAorCQkJICAgICAgIGhvc3RkYXRhLT5tc2dpblsyXSwgc2xvdCwgc2xvdC0+dGFnKSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBzY3NpX2ZpbmRfdGFnKFNEcCwgU0NTSV9OT19UQUcpOworCQkJaWYodW5saWtlbHkoU0NwID09IE5VTEwpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgbm8gc2F2ZWQgcmVxdWVzdCBmb3IgdW50YWdnZWQgY21kXG4iLCAKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcmVzZWxlY3Rpb25faWQsIGx1bik7CisJCQkJQlVHKCk7CisJCQl9CisJCQlzbG90ID0gKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZTsKKwkJfQorCisJCWlmKHNsb3QgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgUkVTRUxFQ1RFRCBidXQgbm8gc2F2ZWQgY29tbWFuZCAoTVNHID0gJTAyeCAlMDJ4ICUwMngpISFcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcmVzZWxlY3Rpb25faWQsIGx1biwKKwkJCSAgICAgICBob3N0ZGF0YS0+bXNnaW5bMF0sIGhvc3RkYXRhLT5tc2dpblsxXSwKKwkJCSAgICAgICBob3N0ZGF0YS0+bXNnaW5bMl0pOworCQl9IGVsc2UgeworCQkJaWYoaG9zdGRhdGEtPnN0YXRlICE9IE5DUl83MDBfSE9TVF9CVVNZKQorCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiBGQVRBTCwgaG9zdCBub3QgYnVzeSBkdXJpbmcgdmFsaWQgcmVzZWxlY3Rpb24hXG4iLAorCQkJCSAgICAgICBob3N0LT5ob3N0X25vKTsKKwkJCXJlc3VtZV9vZmZzZXQgPSBzbG90LT5yZXN1bWVfb2Zmc2V0OworCQkJaG9zdGRhdGEtPmNtZCA9IHNsb3QtPmNtbmQ7CisKKwkJCS8qIHJlLXBhdGNoIGZvciB0aGlzIGNvbW1hbmQgKi8KKwkJCXNjcmlwdF9wYXRjaF8zMl9hYnMoaG9zdGRhdGEtPnNjcmlwdCwgQ29tbWFuZEFkZHJlc3MsIAorCQkJCQkgICAgc2xvdC0+cENtZCk7CisJCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwKKwkJCQkJQ29tbWFuZENvdW50LCBzbG90LT5jbW5kLT5jbWRfbGVuKTsKKwkJCXNjcmlwdF9wYXRjaF8zMl9hYnMoaG9zdGRhdGEtPnNjcmlwdCwgU0dTY3JpcHRTdGFydEFkZHJlc3MsCisJCQkJCSAgICB0bzMyYml0KCZzbG90LT5wU0dbMF0uaW5zKSk7CisKKwkJCS8qIE5vdGU6IHNldHRpbmcgU1hGRVIgb25seSB3b3JrcyBpZiB3ZSdyZQorCQkJICogc3RpbGwgaW4gdGhlIE1FU1NBR0UgcGhhc2UsIHNvIGl0IGlzIHZpdGFsCisJCQkgKiB0aGF0IEFDSyBpcyBzdGlsbCBhc3NlcnRlZCB3aGVuIHdlIHByb2Nlc3MKKwkJCSAqIHRoZSByZXNlbGVjdGlvbiBtZXNzYWdlLiAgVGhlIHJlc3VtZSBvZmZzZXQKKwkJCSAqIHNob3VsZCB0aGVyZWZvcmUgYWx3YXlzIGNsZWFyIEFDSyAqLworCQkJTkNSXzcwMF93cml0ZWIoTkNSXzcwMF9nZXRfU1hGRVIoaG9zdGRhdGEtPmNtZC0+ZGV2aWNlKSwKKwkJCQkgICAgICAgaG9zdCwgU1hGRVJfUkVHKTsKKwkJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwKKwkJCQkgICAgICAgTVNHX0FSUkFZX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+bXNnb3V0LAorCQkJCSAgICAgICBNU0dfQVJSQVlfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJCQkvKiBJJ20ganVzdCBiZWluZyBwYXJhbm9pZCBoZXJlLCB0aGUgY29tbWFuZCBzaG91bGQKKwkJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGZsdXNoZWQgZnJvbSB0aGUgY2FjaGUgKi8KKwkJCWRtYV9jYWNoZV9zeW5jKHNsb3QtPmNtbmQtPmNtbmQsCisJCQkJICAgICAgIHNsb3QtPmNtbmQtPmNtZF9sZW4sIERNQV9UT19ERVZJQ0UpOworCisKKwkJCQorCQl9CisJfSBlbHNlIGlmKGRzcHMgPT0gQV9SRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04pIHsKKworCQkvKiBUaGlzIHNlY3Rpb24gaXMgZnVsbCBvZiBkZWJ1Z2dpbmcgY29kZSBiZWNhdXNlIEkndmUKKwkJICogbmV2ZXIgbWFuYWdlZCB0byByZWFjaCBpdC4gIEkgdGhpbmsgd2hhdCBoYXBwZW5zIGlzCisJCSAqIHRoYXQsIGJlY2F1c2UgdGhlIDcwMCBydW5zIHdpdGggc2VsZWN0aW9uCisJCSAqIGludGVycnVwdHMgZW5hYmxlZCB0aGUgd2hvbGUgdGltZSB0aGF0IHdlIHRha2UgYQorCQkgKiBzZWxlY3Rpb24gaW50ZXJydXB0IGJlZm9yZSB3ZSBtYW5hZ2UgdG8gZ2V0IHRvIHRoZQorCQkgKiByZXNlbGVjdGVkIHNjcmlwdCBpbnRlcnJ1cHQgKi8KKworCQlfX3U4IHJlc2VsZWN0aW9uX2lkID0gTkNSXzcwMF9yZWFkYihob3N0LCBTRkJSX1JFRyk7CisJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdDsKKwkJCisJCS8qIFRha2Ugb3V0IG91ciBvd24gSUQgKi8KKwkJcmVzZWxlY3Rpb25faWQgJj0gfigxPDxob3N0LT50aGlzX2lkKTsKKwkJCisJCS8qIEkndmUgbmV2ZXIgc2VlbiB0aGlzIGhhcHBlbiwgc28ga2VlcCB0aGlzIGFzIGEgcHJpbnRrIHJhdGhlcgorCQkgKiB0aGFuIGEgZGVidWcgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiAoJWQ6JWQpIFJFU0VMRUNUSU9OIERVUklORyBTRUxFQ1RJT04sIGRzcD0lMDh4WyUwNHhdIHN0YXRlPSVkLCBjb3VudD0lZFxuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHJlc2VsZWN0aW9uX2lkLCBsdW4sIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQsIGhvc3RkYXRhLT5zdGF0ZSwgaG9zdGRhdGEtPmNvbW1hbmRfc2xvdF9jb3VudCk7CisKKwkJeworCQkJLyogRklYTUU6IERFQlVHR0lORyBDT0RFICovCisJCQlfX3UzMiBTRyA9IChfX3UzMiliU190b19jcHUoaG9zdGRhdGEtPnNjcmlwdFtBX1NHU2NyaXB0U3RhcnRBZGRyZXNzX3VzZWRbMF1dKTsKKwkJCWludCBpOworCisJCQlmb3IoaT0wOyBpPCBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1Q7IGkrKykgeworCQkJCWlmKFNHID49IHRvMzJiaXQoJmhvc3RkYXRhLT5zbG90c1tpXS5wU0dbMF0pCisJCQkJICAgJiYgU0cgPD0gdG8zMmJpdCgmaG9zdGRhdGEtPnNsb3RzW2ldLnBTR1tOQ1JfNzAwX1NHX1NFR01FTlRTXSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiSURFTlRJRklFRCBTRyBzZWdtZW50IGFzIGJlaW5nICUwOHggaW4gc2xvdCAlcCwgY21kICVwLCBzbG90LT5yZXN1bWVfb2Zmc2V0PSUwOHhcbiIsIFNHLCAmaG9zdGRhdGEtPnNsb3RzW2ldLCBob3N0ZGF0YS0+c2xvdHNbaV0uY21uZCwgaG9zdGRhdGEtPnNsb3RzW2ldLnJlc3VtZV9vZmZzZXQpOworCQkJU0NwID0gIGhvc3RkYXRhLT5zbG90c1tpXS5jbW5kOworCQl9CisKKwkJaWYoU0NwICE9IE5VTEwpIHsKKwkJCXNsb3QgPSAoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCQkJLyogY2hhbmdlIHNsb3QgZnJvbSBidXN5IHRvIHF1ZXVlZCB0byByZWRvIGNvbW1hbmQgKi8KKwkJCXNsb3QtPnN0YXRlID0gTkNSXzcwMF9TTE9UX1FVRVVFRDsKKwkJfQorCQlob3N0ZGF0YS0+Y21kID0gTlVMTDsKKwkJCisJCWlmKHJlc2VsZWN0aW9uX2lkID09IDApIHsKKwkJCWlmKGhvc3RkYXRhLT5yZXNlbGVjdGlvbl9pZCA9PSAweGZmKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IEludmFsaWQgcmVzZWxlY3Rpb24gZHVyaW5nIHNlbGVjdGlvbiEhXG4iLCBob3N0LT5ob3N0X25vKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IHNjcmlwdCByZXNlbGVjdGVkIGFuZCB3ZSB0b29rIGEgc2VsZWN0aW9uIGludGVycnVwdFxuIiwKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubyk7CisJCQkJcmVzZWxlY3Rpb25faWQgPSBob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkKKwkJCS8qIGNvbnZlcnQgdG8gcmVhbCBJRCAqLworCQkJcmVzZWxlY3Rpb25faWQgPSBiaXRtYXBfdG9fbnVtYmVyKHJlc2VsZWN0aW9uX2lkKTsKKwkJfQorCQlob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQgPSByZXNlbGVjdGlvbl9pZDsKKwkJLyoganVzdCBpbiBjYXNlIHdlIGhhdmUgYSBzdGFsZSBzaW1wbGUgdGFnIG1lc3NhZ2UsIGNsZWFyIGl0ICovCisJCWhvc3RkYXRhLT5tc2dpblsxXSA9IDA7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwKKwkJCSAgICAgICBNU0dfQVJSQVlfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOworCQlpZihob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJiAoMTw8cmVzZWxlY3Rpb25faWQpKSB7CisJCQlyZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQgKyBFbnRfR2V0UmVzZWxlY3Rpb25XaXRoVGFnOworCQl9IGVsc2UgeworCQkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X0dldFJlc2VsZWN0aW9uRGF0YTsKKwkJfQorCX0gZWxzZSBpZihkc3BzID09IEFfQ09NUExFVEVEX1NFTEVDVElPTl9BU19UQVJHRVQpIHsKKwkJLyogd2UndmUganVzdCBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLCBkbyBub3RoaW5nIHNpbmNlCisJCSAqIGEgcmV0dXJuIGhlcmUgd2lsbCByZS1ydW4gdGhlIHF1ZXVlZCBjb21tYW5kIHNsb3QKKwkJICogdGhhdCBtYXkgaGF2ZSBiZWVuIGludGVycnVwdGVkIGJ5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiAqLworCQlERUJVRygoIiBTRUxFQ1RJT04gQ09NUExFVEVEXG4iKSk7CisJfSBlbHNlIGlmKChkc3BzICYgMHhmZmZmZjBmMCkgPT0gQV9NU0dfSU4pIHsgCisJCXJlc3VtZV9vZmZzZXQgPSBwcm9jZXNzX21lc3NhZ2UoaG9zdCwgaG9zdGRhdGEsIFNDcCwKKwkJCQkJCWRzcCwgZHNwcyk7CisJfSBlbHNlIGlmKChkc3BzICYgIDB4ZmZmZmYwMDApID09IDApIHsKKwkJX191OCBpID0gKGRzcHMgJiAweGYwKSA+PiA0LCBqID0gKGRzcHMgJiAweGYwMCkgPj4gODsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCksIHVuaGFuZGxlZCBzY3JpcHQgY29uZGl0aW9uICVzICVzIGF0ICUwNHhcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwgTkNSXzcwMF9jb25kaXRpb25baV0sCisJCSAgICAgICBOQ1JfNzAwX3BoYXNlW2pdLCBkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCWlmKFNDcCAhPSBOVUxMKSB7CisJCQlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKworCQkJaWYoU0NwLT51c2Vfc2cpIHsKKwkJCQlmb3IoaSA9IDA7IGkgPCBTQ3AtPnVzZV9zZyArIDE7IGkrKykgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICIgU0dbJWRdLmxlbmd0aCA9ICVkLCBtb3ZlX2luc249JTA4eCwgYWRkciAlMDh4XG4iLCBpLCAoKHN0cnVjdCBzY2F0dGVybGlzdCAqKVNDcC0+YnVmZmVyKVtpXS5sZW5ndGgsICgoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlKS0+U0dbaV0uaW5zLCAoKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZSktPlNHW2ldLnBBZGRyKTsKKwkJCQl9CisJCQl9CisJCX0JICAgICAgIAorCQlOQ1JfNzAwX2ludGVybmFsX2J1c19yZXNldChob3N0KTsKKwl9IGVsc2UgaWYoKGRzcHMgJiAweGZmZmZmMDAwKSA9PSBBX0RFQlVHX0lOVEVSUlVQVCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZCAoJWQ6JWQpIERFQlVHIElOVEVSUlVQVCAlZCBBVCAlMDh4WyUwNHhdLCBjb250aW51aW5nXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sIGRzcHMgJiAweGZmZiwgZHNwLCBkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCXJlc3VtZV9vZmZzZXQgPSBkc3A7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCksIHVuaWRlbnRpZmllZCBzY3JpcHQgaW50ZXJydXB0IDB4JXggYXQgJTA0eFxuIiwKKwkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLCBkc3BzLCBkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCU5DUl83MDBfaW50ZXJuYWxfYnVzX3Jlc2V0KGhvc3QpOworCX0KKwlyZXR1cm4gcmVzdW1lX29mZnNldDsKK30KKworLyogV2UgcnVuIHRoZSA1M2M3MDAgd2l0aCBzZWxlY3Rpb24gaW50ZXJydXB0cyBhbHdheXMgZW5hYmxlZC4gIFRoaXMKKyAqIG1lYW5zIHRoYXQgdGhlIGNoaXAgbWF5IGJlIHNlbGVjdGVkIGFzIHNvb24gYXMgdGhlIGJ1cyBmcmVlcy4gIE9uIGEKKyAqIGJ1c3kgYnVzLCB0aGlzIGNhbiBiZSBiZWZvcmUgdGhlIHNjcmlwdHMgZW5naW5lIGZpbmlzaGVzIGl0cworICogcHJvY2Vzc2luZy4gIFRoZXJlZm9yZSwgcGFydCBvZiB0aGUgc2VsZWN0aW9uIHByb2Nlc3NpbmcgaGFzIHRvIGJlCisgKiB0byBmaW5kIG91dCB3aGF0IHRoZSBzY3JpcHRzIGVuZ2luZSBpcyBkb2luZyBhbmQgY29tcGxldGUgdGhlCisgKiBmdW5jdGlvbiBpZiBuZWNlc3NhcnkgKGkuZS4gcHJvY2VzcyB0aGUgcGVuZGluZyBkaXNjb25uZWN0IG9yIHNhdmUKKyAqIHRoZSBpbnRlcnJ1cHRlZCBpbml0aWFsIHNlbGVjdGlvbiAqLworU1RBVElDIGlubGluZSBfX3UzMgorcHJvY2Vzc19zZWxlY3Rpb24oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgZHNwKQoreworCV9fdTggaWQgPSAwOwkvKiBTcXVhc2ggY29tcGlsZXIgd2FybmluZyAqLworCWludCBjb3VudCA9IDA7CisJX191MzIgcmVzdW1lX29mZnNldCA9IDA7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBob3N0ZGF0YS0+Y21kOworCV9fdTggc2JjbDsKKworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgNTsgY291bnQrKykgeworCQlpZCA9IE5DUl83MDBfcmVhZGIoaG9zdCwgaG9zdGRhdGEtPmNoaXA3MTAgPworCQkJCSAgIENURVNUOV9SRUcgOiBTRkJSX1JFRyk7CisKKwkJLyogVGFrZSBvdXQgb3VyIG93biBJRCAqLworCQlpZCAmPSB+KDE8PGhvc3QtPnRoaXNfaWQpOworCQlpZihpZCAhPSAwKSAKKwkJCWJyZWFrOworCQl1ZGVsYXkoNSk7CisJfQorCXNiY2wgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNCQ0xfUkVHKTsKKwlpZigoc2JjbCAmIFNCQ0xfSU8pID09IDApIHsKKwkJLyogbWFyayBhcyBoYXZpbmcgYmVlbiBzZWxlY3RlZCByYXRoZXIgdGhhbiByZXNlbGVjdGVkICovCisJCWlkID0gMHhmZjsKKwl9IGVsc2UgeworCQkvKiBjb252ZXJ0IHRvIHJlYWwgSUQgKi8KKwkJaG9zdGRhdGEtPnJlc2VsZWN0aW9uX2lkID0gaWQgPSBiaXRtYXBfdG9fbnVtYmVyKGlkKTsKKwkJREVCVUcoKCJzY3NpJWQ6ICBSZXNlbGVjdGVkIGJ5ICVkXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgaWQpKTsKKwl9CisJaWYoaG9zdGRhdGEtPnN0YXRlID09IE5DUl83MDBfSE9TVF9CVVNZICYmIFNDcCAhPSBOVUxMKSB7CisJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9CisJCQkoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCQlERUJVRygoIiAgSUQgJWQgV0FSTklORzogUkVTRUxFQ1RJT04gT0YgQlVTWSBIT1NULCBzYXZpbmcgY21kICVwLCBzbG90ICVwLCBhZGRyICV4IFslMDR4XSwgcmVzdW1lICV4IVxuIiwgaWQsIGhvc3RkYXRhLT5jbWQsIHNsb3QsIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQsIHJlc3VtZV9vZmZzZXQpKTsKKwkJCisJCXN3aXRjaChkc3AgLSBob3N0ZGF0YS0+cFNjcmlwdCkgeworCQljYXNlIEVudF9EaXNjb25uZWN0MToKKwkJY2FzZSBFbnRfRGlzY29ubmVjdDI6CisJCQlzYXZlX2Zvcl9yZXNlbGVjdGlvbihob3N0ZGF0YSwgU0NwLCBFbnRfRGlzY29ubmVjdDIgKyBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCQlicmVhazsKKwkJY2FzZSBFbnRfRGlzY29ubmVjdDM6CisJCWNhc2UgRW50X0Rpc2Nvbm5lY3Q0OgorCQkJc2F2ZV9mb3JfcmVzZWxlY3Rpb24oaG9zdGRhdGEsIFNDcCwgRW50X0Rpc2Nvbm5lY3Q0ICsgaG9zdGRhdGEtPnBTY3JpcHQpOworCQkJYnJlYWs7CisJCWNhc2UgRW50X0Rpc2Nvbm5lY3Q1OgorCQljYXNlIEVudF9EaXNjb25uZWN0NjoKKwkJCXNhdmVfZm9yX3Jlc2VsZWN0aW9uKGhvc3RkYXRhLCBTQ3AsIEVudF9EaXNjb25uZWN0NiArIGhvc3RkYXRhLT5wU2NyaXB0KTsKKwkJCWJyZWFrOworCQljYXNlIEVudF9EaXNjb25uZWN0NzoKKwkJY2FzZSBFbnRfRGlzY29ubmVjdDg6CisJCQlzYXZlX2Zvcl9yZXNlbGVjdGlvbihob3N0ZGF0YSwgU0NwLCBFbnRfRGlzY29ubmVjdDggKyBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCQlicmVhazsKKwkJY2FzZSBFbnRfRmluaXNoMToKKwkJY2FzZSBFbnRfRmluaXNoMjoKKwkJCXByb2Nlc3Nfc2NyaXB0X2ludGVycnVwdChBX0dPT0RfU1RBVFVTX0FGVEVSX1NUQVRVUywgZHNwLCBTQ3AsIGhvc3QsIGhvc3RkYXRhKTsKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQlzbG90LT5zdGF0ZSA9IE5DUl83MDBfU0xPVF9RVUVVRUQ7CisJCQlicmVhazsKKwkJCX0KKwl9CisJaG9zdGRhdGEtPnN0YXRlID0gTkNSXzcwMF9IT1NUX0JVU1k7CisJaG9zdGRhdGEtPmNtZCA9IE5VTEw7CisJLyogY2xlYXIgYW55IHN0YWxlIHNpbXBsZSB0YWcgbWVzc2FnZSAqLworCWhvc3RkYXRhLT5tc2dpblsxXSA9IDA7CisJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ2luLCBNU0dfQVJSQVlfU0laRSwKKwkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmKGlkID09IDB4ZmYpIHsKKwkJLyogU2VsZWN0ZWQgYXMgdGFyZ2V0LCBJZ25vcmUgKi8KKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbGVjdGVkQXNUYXJnZXQ7CisJfSBlbHNlIGlmKGhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmICgxPDxpZCkpIHsKKwkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X0dldFJlc2VsZWN0aW9uV2l0aFRhZzsKKwl9IGVsc2UgeworCQlyZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQgKyBFbnRfR2V0UmVzZWxlY3Rpb25EYXRhOworCX0KKwlyZXR1cm4gcmVzdW1lX29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX2NsZWFyX2ZpZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworCWNvbnN0IHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEKKwkJPSAoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisJaWYoaG9zdGRhdGEtPmNoaXA3MTApIHsKKwkJTkNSXzcwMF93cml0ZWIoQ0xSX0ZJRk9fNzEwLCBob3N0LCBDVEVTVDhfUkVHKTsKKwl9IGVsc2UgeworCQlOQ1JfNzAwX3dyaXRlYihDTFJfRklGTywgaG9zdCwgREZJRk9fUkVHKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9mbHVzaF9maWZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCWlmKGhvc3RkYXRhLT5jaGlwNzEwKSB7CisJCU5DUl83MDBfd3JpdGViKEZMVVNIX0RNQV9GSUZPXzcxMCwgaG9zdCwgQ1RFU1Q4X1JFRyk7CisJCXVkZWxheSgxMCk7CisJCU5DUl83MDBfd3JpdGViKDAsIGhvc3QsIENURVNUOF9SRUcpOworCX0gZWxzZSB7CisJCU5DUl83MDBfd3JpdGViKEZMVVNIX0RNQV9GSUZPLCBob3N0LCBERklGT19SRUcpOworCQl1ZGVsYXkoMTApOworCQlOQ1JfNzAwX3dyaXRlYigwLCBob3N0LCBERklGT19SRUcpOworCX0KK30KKworCisvKiBUaGUgcXVldWUgbG9jayB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgbXVzdCBiZSBoZWxkIG9uIGVudHJ5IHRvCisgKiB0aGlzIGZ1bmN0aW9uICovCitTVEFUSUMgaW50CitOQ1JfNzAwX3N0YXJ0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwKQoreworCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9CisJCShzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKilTQ3AtPmhvc3Rfc2NyaWJibGU7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTQ3AtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJX191MTYgY291bnQgPSAxOwkvKiBmb3IgSURFTlRJRlkgbWVzc2FnZSAqLworCQorCWlmKGhvc3RkYXRhLT5zdGF0ZSAhPSBOQ1JfNzAwX0hPU1RfRlJFRSkgeworCQkvKiBrZWVwIHRoaXMgaW5zaWRlIHRoZSBsb2NrIHRvIGNsb3NlIHRoZSByYWNlIHdpbmRvdyB3aGVyZQorCQkgKiB0aGUgcnVubmluZyBjb21tYW5kIGZpbmlzaGVzIG9uIGFub3RoZXIgQ1BVIHdoaWxlIHdlIGRvbid0CisJCSAqIGNoYW5nZSB0aGUgc3RhdGUgdG8gcXVldWVkIG9uIHRoaXMgb25lICovCisJCXNsb3QtPnN0YXRlID0gTkNSXzcwMF9TTE9UX1FVRVVFRDsKKworCQlERUJVRygoInNjc2klZDogaG9zdCBidXN5LCBxdWV1ZWluZyBjb21tYW5kICVwLCBzbG90ICVwXG4iLAorCQkgICAgICAgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIHNsb3QtPmNtbmQsIHNsb3QpKTsKKwkJcmV0dXJuIDA7CisJfQorCWhvc3RkYXRhLT5zdGF0ZSA9IE5DUl83MDBfSE9TVF9CVVNZOworCWhvc3RkYXRhLT5jbWQgPSBTQ3A7CisJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfQlVTWTsKKwkvKiBrZWVwIGludGVycnVwdHMgZGlzYWJsZWQgdW50aWwgd2UgaGF2ZSB0aGUgY29tbWFuZCBjb3JyZWN0bHkKKwkgKiBzZXQgdXAgc28gd2UgY2Fubm90IHRha2UgYSBzZWxlY3Rpb24gaW50ZXJydXB0ICovCisKKwlob3N0ZGF0YS0+bXNnb3V0WzBdID0gTkNSXzcwMF9pZGVudGlmeShTQ3AtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSwKKwkJCQkJICAgICAgIFNDcC0+ZGV2aWNlLT5sdW4pOworCS8qIGZvciBJTlFVSVJZIG9yIFJFUVVFU1RfU0VOU0UgY29tbWFuZHMsIHdlIGNhbm5vdCBiZSBzdXJlCisJICogaWYgdGhlIG5lZ290aWF0ZWQgdHJhbnNmZXIgcGFyYW1ldGVycyBzdGlsbCBob2xkLCBzbworCSAqIGFsd2F5cyByZW5lZ290aWF0ZSB0aGVtICovCisJaWYoU0NwLT5jbW5kWzBdID09IElOUVVJUlkgfHwgU0NwLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJTkNSXzcwMF9jbGVhcl9mbGFnKFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9ORUdPVElBVEVEX1NZTkMpOworCX0KKworCS8qIFJFUVVFU1RfU0VOU0UgaXMgYXNraW5nIGZvciBjb250aW5nZW50IElfVF9MKF9RKSBzdGF0dXMuCisJICogSWYgYSBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uIGV4aXN0cywgdGhlIGRldmljZQorCSAqIHdpbGwgcmVmdXNlIGFsbCB0YWdzLCBzbyBzZW5kIHRoZSByZXF1ZXN0IHNlbnNlIGFzIHVudGFnZ2VkCisJICogKi8KKwlpZigoaG9zdGRhdGEtPnRhZ19uZWdvdGlhdGVkICYgKDE8PFNDcC0+ZGV2aWNlLT5pZCkpCisJICAgJiYgKHNsb3QtPnRhZyAhPSBTQ1NJX05PX1RBRyAmJiBTQ3AtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSkpIHsKKwkJY291bnQgKz0gc2NzaV9wb3B1bGF0ZV90YWdfbXNnKFNDcCwgJmhvc3RkYXRhLT5tc2dvdXRbY291bnRdKTsKKwl9CisKKwlpZihob3N0ZGF0YS0+ZmFzdCAmJgorCSAgIE5DUl83MDBfaXNfZmxhZ19jbGVhcihTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DKSkgeworCQltZW1jcHkoJmhvc3RkYXRhLT5tc2dvdXRbY291bnRdLCBOQ1JfNzAwX1NEVFJfbXNnLAorCQkgICAgICAgc2l6ZW9mKE5DUl83MDBfU0RUUl9tc2cpKTsKKwkJaG9zdGRhdGEtPm1zZ291dFtjb3VudCszXSA9IHNwaV9wZXJpb2QoU0NwLT5kZXZpY2UtPnNkZXZfdGFyZ2V0KTsKKwkJaG9zdGRhdGEtPm1zZ291dFtjb3VudCs0XSA9IHNwaV9vZmZzZXQoU0NwLT5kZXZpY2UtPnNkZXZfdGFyZ2V0KTsKKwkJY291bnQgKz0gc2l6ZW9mKE5DUl83MDBfU0RUUl9tc2cpOworCQlOQ1JfNzAwX3NldF9mbGFnKFNDcC0+ZGV2aWNlLCBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKTsKKwl9CisKKwlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCBjb3VudCk7CisKKworCXNjcmlwdF9wYXRjaF9JRChob3N0ZGF0YS0+c2NyaXB0LAorCQkJRGV2aWNlX0lELCAxPDxTQ3AtPmRldmljZS0+aWQpOworCisJc2NyaXB0X3BhdGNoXzMyX2Ficyhob3N0ZGF0YS0+c2NyaXB0LCBDb21tYW5kQWRkcmVzcywgCisJCQkgICAgc2xvdC0+cENtZCk7CisJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5zY3JpcHQsIENvbW1hbmRDb3VudCwgU0NwLT5jbWRfbGVuKTsKKwkvKiBmaW5hbGx5IHBsdW1iIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNHIGxpc3QgaW50byB0aGUgc2NyaXB0CisJICogKi8KKwlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5zY3JpcHQsIFNHU2NyaXB0U3RhcnRBZGRyZXNzLAorCQkJICAgIHRvMzJiaXQoJnNsb3QtPnBTR1swXS5pbnMpKTsKKwlOQ1JfNzAwX2NsZWFyX2ZpZm8oU0NwLT5kZXZpY2UtPmhvc3QpOworCisJaWYoc2xvdC0+cmVzdW1lX29mZnNldCA9PSAwKQorCQlzbG90LT5yZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQ7CisJLyogbm93IHBlcmZvcm0gYWxsIHRoZSB3cml0ZWJhY2tzIGFuZCBpbnZhbGlkYXRlcyAqLworCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsIGNvdW50LCBETUFfVE9fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+bXNnaW4sIE1TR19BUlJBWV9TSVpFLAorCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhTQ3AtPmNtbmQsIFNDcC0+Y21kX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPnN0YXR1cywgMSwgRE1BX0ZST01fREVWSUNFKTsKKworCS8qIHNldCB0aGUgc3luY2hyb25vdXMgcGVyaW9kL29mZnNldCAqLworCU5DUl83MDBfd3JpdGViKE5DUl83MDBfZ2V0X1NYRkVSKFNDcC0+ZGV2aWNlKSwKKwkJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LCBTWEZFUl9SRUcpOworCU5DUl83MDBfd3JpdGVsKHNsb3QtPnRlbXAsIFNDcC0+ZGV2aWNlLT5ob3N0LCBURU1QX1JFRyk7CisJTkNSXzcwMF93cml0ZWwoc2xvdC0+cmVzdW1lX29mZnNldCwgU0NwLT5kZXZpY2UtPmhvc3QsIERTUF9SRUcpOworCisJcmV0dXJuIDE7Cit9CisKK2lycXJldHVybl90CitOQ1JfNzAwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKilkZXZfaWQ7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKwlfX3U4IGlzdGF0OworCV9fdTMyIHJlc3VtZV9vZmZzZXQgPSAwOworCV9fdTggcHVuID0gMHhmZiwgbHVuID0gMHhmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBoYW5kbGVkID0gMDsKKworCS8qIFVzZSB0aGUgaG9zdCBsb2NrIHRvIHNlcmlhbGlzZSBhY2VzcyB0byB0aGUgNTNjNzAwCisJICogaGFyZHdhcmUuICBOb3RlOiBJbiBmdXR1cmUsIHdlIG1heSBuZWVkIHRvIHRha2UgdGhlIHF1ZXVlCisJICogbG9jayB0byBlbnRlciB0aGUgZG9uZSByb3V0aW5lcy4gIFdoZW4gdGhhdCBoYXBwZW5zLCB3ZQorCSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgZm9yIHRoaXMgZHJpdmVyLCB0aGUgaG9zdCBsb2NrIGFuZCB0aGUKKwkgKiBxdWV1ZSBsb2NrIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmKChpc3RhdCA9IE5DUl83MDBfcmVhZGIoaG9zdCwgSVNUQVRfUkVHKSkKKwkgICAgICAmIChTQ1NJX0lOVF9QRU5ESU5HIHwgRE1BX0lOVF9QRU5ESU5HKSkgeworCQlfX3UzMiBkc3BzOworCQlfX3U4IHNzdGF0MCA9IDAsIGRzdGF0ID0gMDsKKwkJX191MzIgZHNwOworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3AgPSBob3N0ZGF0YS0+Y21kOworCQllbnVtIE5DUl83MDBfSG9zdF9TdGF0ZSBzdGF0ZTsKKworCQloYW5kbGVkID0gMTsKKwkJc3RhdGUgPSBob3N0ZGF0YS0+c3RhdGU7CisJCVNDcCA9IGhvc3RkYXRhLT5jbWQ7CisKKwkJaWYoaXN0YXQgJiBTQ1NJX0lOVF9QRU5ESU5HKSB7CisJCQl1ZGVsYXkoMTApOworCisJCQlzc3RhdDAgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNTVEFUMF9SRUcpOworCQl9CisKKwkJaWYoaXN0YXQgJiBETUFfSU5UX1BFTkRJTkcpIHsKKwkJCXVkZWxheSgxMCk7CisKKwkJCWRzdGF0ID0gTkNSXzcwMF9yZWFkYihob3N0LCBEU1RBVF9SRUcpOworCQl9CisKKwkJZHNwcyA9IE5DUl83MDBfcmVhZGwoaG9zdCwgRFNQU19SRUcpOworCQlkc3AgPSBOQ1JfNzAwX3JlYWRsKGhvc3QsIERTUF9SRUcpOworCisJCURFQlVHKCgic2NzaSVkOiBpc3RhdCAlMDJ4IHNzdGF0MCAlMDJ4IGRzdGF0ICUwMnggZHNwICUwNHhbJTA4eF0gZHNwcyAweCV4XG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgaXN0YXQsIHNzdGF0MCwgZHN0YXQsCisJCSAgICAgICAoZHNwIC0gKF9fdTMyKShob3N0ZGF0YS0+cFNjcmlwdCkpLzQsCisJCSAgICAgICBkc3AsIGRzcHMpKTsKKworCQlpZihTQ3AgIT0gTlVMTCkgeworCQkJcHVuID0gU0NwLT5kZXZpY2UtPmlkOworCQkJbHVuID0gU0NwLT5kZXZpY2UtPmx1bjsKKwkJfQorCisJCWlmKHNzdGF0MCAmIFNDU0lfUkVTRVRfREVURUNURUQpIHsKKwkJCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwOworCQkJaW50IGk7CisKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IE5DUl83MDBfSE9TVF9CVVNZOworCisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogQnVzIFJlc2V0IGRldGVjdGVkLCBleGVjdXRpbmcgY29tbWFuZCAlcCwgc2xvdCAlcCwgZHNwICUwOHhbJTA0eF1cbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgU0NwLCBTQ3AgPT0gTlVMTCA/IE5VTEwgOiBTQ3AtPmhvc3Rfc2NyaWJibGUsIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQpOworCisJCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoaG9zdCwgMCk7CisKKwkJCS8qIGNsZWFyIGFsbCB0aGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzICovCisJCQlfX3Nob3N0X2Zvcl9lYWNoX2RldmljZShTRHAsIGhvc3QpCisJCQkJU0RwLT5ob3N0ZGF0YSA9IE5VTEw7CisJCQkKKwkJCS8qIGNsZWFyIGFsbCB0aGUgc2xvdHMgYW5kIHRoZWlyIHBlbmRpbmcgY29tbWFuZHMgKi8KKwkJCWZvcihpID0gMDsgaSA8IE5DUl83MDBfQ09NTUFORF9TTE9UU19QRVJfSE9TVDsgaSsrKSB7CisJCQkJc3RydWN0IHNjc2lfY21uZCAqU0NwOworCQkJCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdCA9CisJCQkJCSZob3N0ZGF0YS0+c2xvdHNbaV07CisKKwkJCQlpZihzbG90LT5zdGF0ZSA9PSBOQ1JfNzAwX1NMT1RfRlJFRSkKKwkJCQkJY29udGludWU7CisJCQkJCisJCQkJU0NwID0gc2xvdC0+Y21uZDsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiBmYWlsaW5nIGNvbW1hbmQgYmVjYXVzZSBvZiByZXNldCwgc2xvdCAlcCwgY21uZCAlcFxuIiwKKwkJCQkgICAgICAgc2xvdCwgU0NwKTsKKwkJCQlmcmVlX3Nsb3Qoc2xvdCwgaG9zdGRhdGEpOworCQkJCVNDcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJTkNSXzcwMF9zZXRfZGVwdGgoU0NwLT5kZXZpY2UsIDApOworCQkJCS8qIE5PVEU6IGRlYWRsb2NrIHBvdGVudGlhbCBoZXJlOiB3ZQorCQkJCSAqIHJlbHkgb24gbWlkLWxheWVyIGd1YXJhbnRlZXMgdGhhdAorCQkJCSAqIHNjc2lfZG9uZSB3b24ndCB0cnkgdG8gaXNzdWUgdGhlCisJCQkJICogY29tbWFuZCBhZ2FpbiBvdGhlcndpc2Ugd2UnbGwKKwkJCQkgKiBkZWFkbG9jayBvbiB0aGUKKwkJCQkgKiBob3N0ZGF0YS0+c3RhdGVfbG9jayAqLworCQkJCVNDcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCVNDcC0+c2NzaV9kb25lKFNDcCk7CisJCQl9CisJCQltZGVsYXkoMjUpOworCQkJTkNSXzcwMF9jaGlwX3NldHVwKGhvc3QpOworCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfRlJFRTsKKwkJCWhvc3RkYXRhLT5jbWQgPSBOVUxMOworCQkJLyogc2lnbmFsIGJhY2sgaWYgdGhpcyB3YXMgYW4gZWggaW5kdWNlZCByZXNldCAqLworCQkJaWYoaG9zdGRhdGEtPmVoX2NvbXBsZXRlICE9IE5VTEwpCisJCQkJY29tcGxldGUoaG9zdGRhdGEtPmVoX2NvbXBsZXRlKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfSBlbHNlIGlmKHNzdGF0MCAmIFNFTEVDVElPTl9USU1FT1VUKSB7CisJCQlERUJVRygoInNjc2klZDogKCVkOiVkKSBzZWxlY3Rpb24gdGltZW91dFxuIiwKKwkJCSAgICAgICBob3N0LT5ob3N0X25vLCBwdW4sIGx1bikpOworCQkJTkNSXzcwMF9zY3NpX2RvbmUoaG9zdGRhdGEsIFNDcCwgRElEX05PX0NPTk5FQ1Q8PDE2KTsKKwkJfSBlbHNlIGlmKHNzdGF0MCAmIFBIQVNFX01JU01BVENIKSB7CisJCQlzdHJ1Y3QgTkNSXzcwMF9jb21tYW5kX3Nsb3QgKnNsb3QgPSAoU0NwID09IE5VTEwpID8gTlVMTCA6CisJCQkJKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKVNDcC0+aG9zdF9zY3JpYmJsZTsKKworCQkJaWYoZHNwID09IEVudF9TZW5kTWVzc2FnZSArIDggKyBob3N0ZGF0YS0+cFNjcmlwdCkgeworCQkJCS8qIEl0IHdhbnRzIHRvIHJlcGx5IHRvIHNvbWUgcGFydCBvZgorCQkJCSAqIG91ciBtZXNzYWdlICovCisjaWZkZWYgTkNSXzcwMF9ERUJVRworCQkJCV9fdTMyIHRlbXAgPSBOQ1JfNzAwX3JlYWRsKGhvc3QsIFRFTVBfUkVHKTsKKwkJCQlpbnQgY291bnQgPSAoaG9zdGRhdGEtPnNjcmlwdFtFbnRfU2VuZE1lc3NhZ2UvNF0gJiAweGZmZmZmZikgLSAoKE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweGZmZmZmZikgKyBOQ1JfNzAwX2RhdGFfcmVzaWR1YWwoaG9zdCkpOworCQkJCXByaW50aygic2NzaSVkICglZDolZCkgUEhBU0UgTUlTTUFUQ0ggSU4gU0VORCBNRVNTQUdFICVkIHJlbWFpbiwgcmV0dXJuICVwWyUwNHhdLCBwaGFzZSAlc1xuIiwgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sIGNvdW50LCAodm9pZCAqKXRlbXAsIHRlbXAgLSBob3N0ZGF0YS0+cFNjcmlwdCwgc2JjbF90b19zdHJpbmcoTkNSXzcwMF9yZWFkYihob3N0LCBTQkNMX1JFRykpKTsKKyNlbmRpZgorCQkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVBoYXNlTWlzbWF0Y2g7CisJCQl9IGVsc2UgaWYoZHNwID49IHRvMzJiaXQoJnNsb3QtPnBTR1swXS5pbnMpICYmCisJCQkJICBkc3AgPD0gdG8zMmJpdCgmc2xvdC0+cFNHW05DUl83MDBfU0dfU0VHTUVOVFNdLmlucykpIHsKKwkJCQlpbnQgZGF0YV90cmFuc2ZlciA9IE5DUl83MDBfcmVhZGwoaG9zdCwgREJDX1JFRykgJiAweGZmZmZmZjsKKwkJCQlpbnQgU0djb3VudCA9IChkc3AgLSB0bzMyYml0KCZzbG90LT5wU0dbMF0uaW5zKSkvc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX1NHX0xpc3QpOworCQkJCWludCByZXNpZHVhbCA9IE5DUl83MDBfZGF0YV9yZXNpZHVhbChob3N0KTsKKwkJCQlpbnQgaTsKKyNpZmRlZiBOQ1JfNzAwX0RFQlVHCisJCQkJX191MzIgbmFkZHIgPSBOQ1JfNzAwX3JlYWRsKGhvc3QsIEROQURfUkVHKTsKKworCQkJCXByaW50aygic2NzaSVkOiAoJWQ6JWQpIEV4cGVjdGVkIHBoYXNlIG1pc21hdGNoIGluIHNsb3QtPlNHWyVkXSwgdHJhbnNmZXJyZWQgMHgleFxuIiwKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sCisJCQkJICAgICAgIFNHY291bnQsIGRhdGFfdHJhbnNmZXIpOworCQkJCXNjc2lfcHJpbnRfY29tbWFuZChTQ3ApOworCQkJCWlmKHJlc2lkdWFsKSB7CisJCQkJCXByaW50aygic2NzaSVkOiAoJWQ6JWQpIEV4cGVjdGVkIHBoYXNlIG1pc21hdGNoIGluIHNsb3QtPlNHWyVkXSwgdHJhbnNmZXJyZWQgMHgleCwgcmVzaWR1YWwgJWRcbiIsCisJCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkJCSAgICAgICBTR2NvdW50LCBkYXRhX3RyYW5zZmVyLCByZXNpZHVhbCk7CisJCQkJfQorI2VuZGlmCisJCQkJZGF0YV90cmFuc2ZlciArPSByZXNpZHVhbDsKKworCQkJCWlmKGRhdGFfdHJhbnNmZXIgIT0gMCkgeworCQkJCQlpbnQgY291bnQ7IAorCQkJCQlfX3UzMiBwQWRkcjsKKworCQkJCQlTR2NvdW50LS07CisKKwkJCQkJY291bnQgPSAoYlNfdG9fY3B1KHNsb3QtPlNHW1NHY291bnRdLmlucykgJiAweDAwZmZmZmZmKTsKKwkJCQkJREVCVUcoKCJEQVRBIFRSQU5TRkVSIE1JU01BVENILCBjb3VudCA9ICVkLCB0cmFuc2ZlcnJlZCAlZFxuIiwgY291bnQsIGNvdW50LWRhdGFfdHJhbnNmZXIpKTsKKwkJCQkJc2xvdC0+U0dbU0djb3VudF0uaW5zICY9IGJTX3RvX2hvc3QoMHhmZjAwMDAwMCk7CisJCQkJCXNsb3QtPlNHW1NHY291bnRdLmlucyB8PSBiU190b19ob3N0KGRhdGFfdHJhbnNmZXIpOworCQkJCQlwQWRkciA9IGJTX3RvX2NwdShzbG90LT5TR1tTR2NvdW50XS5wQWRkcik7CisJCQkJCXBBZGRyICs9IChjb3VudCAtIGRhdGFfdHJhbnNmZXIpOworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJCQkJaWYocEFkZHIgIT0gbmFkZHIpIHsKKwkJCQkJCXByaW50aygic2NzaSVkICglZDolZCkgdHJhbnNmZXIgbWlzbWF0Y2ggcEFkZHI9JWx4LCBuYWRkcj0lbHgsIGRhdGFfdHJhbnNmZXI9JWQsIHJlc2lkdWFsPSVkXG4iLCBob3N0LT5ob3N0X25vLCBwdW4sIGx1biwgKHVuc2lnbmVkIGxvbmcpcEFkZHIsICh1bnNpZ25lZCBsb25nKW5hZGRyLCBkYXRhX3RyYW5zZmVyLCByZXNpZHVhbCk7CisJCQkJCX0KKyNlbmRpZgorCQkJCQlzbG90LT5TR1tTR2NvdW50XS5wQWRkciA9IGJTX3RvX2hvc3QocEFkZHIpOworCQkJCX0KKwkJCQkvKiBzZXQgdGhlIGV4ZWN1dGVkIG1vdmVzIHRvIG5vcHMgKi8KKwkJCQlmb3IoaT0wOyBpPFNHY291bnQ7IGkrKykgeworCQkJCQlzbG90LT5TR1tpXS5pbnMgPSBiU190b19ob3N0KFNDUklQVF9OT1ApOworCQkJCQlzbG90LT5TR1tpXS5wQWRkciA9IDA7CisJCQkJfQorCQkJCWRtYV9jYWNoZV9zeW5jKHNsb3QtPlNHLCBzaXplb2Yoc2xvdC0+U0cpLCBETUFfVE9fREVWSUNFKTsKKwkJCQkvKiBhbmQgcHJldGVuZCB3ZSBkaXNjb25uZWN0ZWQgYWZ0ZXIKKwkJCQkgKiB0aGUgY29tbWFuZCBwaGFzZSAqLworCQkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9Nc2dJbkR1cmluZ0RhdGE7CisJCQkJLyogbWFrZSBzdXJlIGFsbCB0aGUgZGF0YSBpcyBmbHVzaGVkICovCisJCQkJTkNSXzcwMF9mbHVzaF9maWZvKGhvc3QpOworCQkJfSBlbHNlIHsKKwkJCQlfX3U4IHNiY2wgPSBOQ1JfNzAwX3JlYWRiKGhvc3QsIFNCQ0xfUkVHKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBwaGFzZSBtaXNtYXRjaCBhdCAlMDR4LCBwaGFzZSAlc1xuIiwKKwkJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4sIGRzcCAtIGhvc3RkYXRhLT5wU2NyaXB0LCBzYmNsX3RvX3N0cmluZyhzYmNsKSk7CisJCQkJTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoaG9zdCk7CisJCQl9CisKKwkJfSBlbHNlIGlmKHNzdGF0MCAmIFNDU0lfR1JPU1NfRVJST1IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAoJWQ6JWQpIEdST1NTIEVSUk9SXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKTsKKwkJCU5DUl83MDBfc2NzaV9kb25lKGhvc3RkYXRhLCBTQ3AsIERJRF9FUlJPUjw8MTYpOworCQl9IGVsc2UgaWYoc3N0YXQwICYgUEFSSVRZX0VSUk9SKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBQQVJJVFkgRVJST1JcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4pOworCQkJTkNSXzcwMF9zY3NpX2RvbmUoaG9zdGRhdGEsIFNDcCwgRElEX0VSUk9SPDwxNik7CisJCX0gZWxzZSBpZihkc3RhdCAmIFNDUklQVF9JTlRfUkVDRUlWRUQpIHsKKwkJCURFQlVHKCgic2NzaSVkOiAoJWQ6JWQpID09PT0+U0NSSVBUIElOVEVSUlVQVDw9PT09XG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuKSk7CisJCQlyZXN1bWVfb2Zmc2V0ID0gcHJvY2Vzc19zY3JpcHRfaW50ZXJydXB0KGRzcHMsIGRzcCwgU0NwLCBob3N0LCBob3N0ZGF0YSk7CisJCX0gZWxzZSBpZihkc3RhdCAmIChJTEdMX0lOU1RfREVURUNURUQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBJbGxlZ2FsIEluc3RydWN0aW9uIGRldGVjdGVkIGF0IDB4JTA4eFsweCV4XSEhIVxuIgorCQkJICAgICAgICIgICAgICAgICBQbGVhc2UgZW1haWwgSmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbSB3aXRoIHRoZSBkZXRhaWxzXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLAorCQkJICAgICAgIGRzcCwgZHNwIC0gaG9zdGRhdGEtPnBTY3JpcHQpOworCQkJTkNSXzcwMF9zY3NpX2RvbmUoaG9zdGRhdGEsIFNDcCwgRElEX0VSUk9SPDwxNik7CisJCX0gZWxzZSBpZihkc3RhdCAmIChXQVRDSF9ET0dfSU5URVJSVVBUfEFCT1JURUQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogKCVkOiVkKSBzZXJpb3VzIERNQSBwcm9ibGVtLCBkc3RhdD0lMDJ4XG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHB1biwgbHVuLCBkc3RhdCk7CisJCQlOQ1JfNzAwX3Njc2lfZG9uZShob3N0ZGF0YSwgU0NwLCBESURfRVJST1I8PDE2KTsKKwkJfQorCisJCQorCQkvKiBOT1RFOiBzZWxlY3Rpb24gaW50ZXJydXB0IHByb2Nlc3NpbmcgTVVTVCBvY2N1cgorCQkgKiBhZnRlciBzY3JpcHQgaW50ZXJydXB0IHByb2Nlc3NpbmcgdG8gY29ycmVjdGx5IGNvcGUKKwkJICogd2l0aCB0aGUgY2FzZSB3aGVyZSB3ZSBwcm9jZXNzIGEgZGlzY29ubmVjdCBhbmQKKwkJICogdGhlbiBnZXQgcmVzZWxlY3RlZCBiZWZvcmUgd2UgcHJvY2VzcyB0aGUKKwkJICogZGlzY29ubmVjdGlvbiAqLworCQlpZihzc3RhdDAgJiBTRUxFQ1RFRCkgeworCQkJLyogRklYTUU6IEl0IGN1cnJlbnRseSB0YWtlcyBhdCBsZWFzdCBGT1VSCisJCQkgKiBpbnRlcnJ1cHRzIHRvIGNvbXBsZXRlIGEgY29tbWFuZCB0aGF0CisJCQkgKiBkaXNjb25uZWN0czogb25lIGZvciB0aGUgZGlzY29ubmVjdCwgb25lCisJCQkgKiBmb3IgdGhlIHJlc2VsZWN0aW9uLCBvbmUgdG8gZ2V0IHRoZQorCQkJICogcmVzZWxlY3Rpb24gZGF0YSBhbmQgb25lIHRvIGNvbXBsZXRlIHRoZQorCQkJICogY29tbWFuZC4gIElmIHdlIGd1ZXNzIHRoZSByZXNlbGVjdGVkCisJCQkgKiBjb21tYW5kIGhlcmUgYW5kIHByZXBhcmUgaXQsIHdlIG9ubHkgbmVlZAorCQkJICogdG8gZ2V0IGEgcmVzZWxlY3Rpb24gZGF0YSBpbnRlcnJ1cHQgaWYgd2UKKwkJCSAqIGd1ZXNzZWQgd3JvbmdseS4gIFNpbmNlIHRoZSBpbnRlcnJ1cHQKKwkJCSAqIG92ZXJoZWFkIGlzIG11Y2ggZ3JlYXRlciB0aGFuIHRoZSBjb21tYW5kCisJCQkgKiBzZXR1cCwgdGhpcyB3b3VsZCBiZSBhbiBlZmZpY2llbnQKKwkJCSAqIG9wdGltaXNhdGlvbiBwYXJ0aWN1bGFybHkgYXMgd2UgcHJvYmFibHkKKwkJCSAqIG9ubHkgaGF2ZSBvbmUgb3V0c3RhbmRpbmcgY29tbWFuZCBvbiBhCisJCQkgKiB0YXJnZXQgbW9zdCBvZiB0aGUgdGltZSAqLworCisJCQlyZXN1bWVfb2Zmc2V0ID0gcHJvY2Vzc19zZWxlY3Rpb24oaG9zdCwgZHNwKTsKKworCQl9CisKKwl9CisKKwlpZihyZXN1bWVfb2Zmc2V0KSB7CisJCWlmKGhvc3RkYXRhLT5zdGF0ZSAhPSBOQ1JfNzAwX0hPU1RfQlVTWSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6IERyaXZlciBlcnJvcjogcmVzdW1lIGF0IDB4JTA4eCBbMHglMDR4XSB3aXRoIG5vbiBidXN5IGhvc3QhXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIHJlc3VtZV9vZmZzZXQsIHJlc3VtZV9vZmZzZXQgLSBob3N0ZGF0YS0+cFNjcmlwdCk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBOQ1JfNzAwX0hPU1RfQlVTWTsKKwkJfQorCisJCURFQlVHKCgiQXR0ZW1wdGluZyB0byByZXN1bWUgYXQgJXhcbiIsIHJlc3VtZV9vZmZzZXQpKTsKKwkJTkNSXzcwMF9jbGVhcl9maWZvKGhvc3QpOworCQlOQ1JfNzAwX3dyaXRlbChyZXN1bWVfb2Zmc2V0LCBob3N0LCBEU1BfUkVHKTsKKwl9IAorCS8qIFRoZXJlIGlzIHByb2JhYmx5IGEgdGVjaG5pY2FsIG5vLW5vIGFib3V0IHRoaXM6IElmIHdlJ3JlIGEKKwkgKiBzaGFyZWQgaW50ZXJydXB0IGFuZCB3ZSBnb3QgdGhpcyBpbnRlcnJ1cHQgYmVjYXVzZSB0aGUKKwkgKiBvdGhlciBkZXZpY2UgbmVlZHMgc2VydmljaW5nIG5vdCB1cywgd2UncmUgc3RpbGwgZ29pbmcgdG8KKwkgKiBjaGVjayBvdXIgcXVldWVkIGNvbW1hbmRzIGhlcmUtLS1vZiBjb3Vyc2UsIHRoZXJlIHNob3VsZG4ndAorCSAqIGJlIGFueSBvdXRzdGFuZGluZy4uLi4gKi8KKwlpZihob3N0ZGF0YS0+c3RhdGUgPT0gTkNSXzcwMF9IT1NUX0ZSRUUpIHsKKwkJaW50IGk7CisKKwkJZm9yKGkgPSAwOyBpIDwgTkNSXzcwMF9DT01NQU5EX1NMT1RTX1BFUl9IT1NUOyBpKyspIHsKKwkJCS8qIGZhaXJuZXNzOiBhbHdheXMgcnVuIHRoZSBxdWV1ZSBmcm9tIHRoZSBsYXN0CisJCQkgKiBwb3NpdGlvbiB3ZSBsZWZ0IG9mZiAqLworCQkJaW50IGogPSAoaSArIGhvc3RkYXRhLT5zYXZlZF9zbG90X3Bvc2l0aW9uKQorCQkJCSUgTkNSXzcwMF9DT01NQU5EX1NMT1RTX1BFUl9IT1NUOworCQkJCisJCQlpZihob3N0ZGF0YS0+c2xvdHNbal0uc3RhdGUgIT0gTkNSXzcwMF9TTE9UX1FVRVVFRCkKKwkJCQljb250aW51ZTsKKwkJCWlmKE5DUl83MDBfc3RhcnRfY29tbWFuZChob3N0ZGF0YS0+c2xvdHNbal0uY21uZCkpIHsKKwkJCQlERUJVRygoInNjc2klZDogSXNzdWluZyBzYXZlZCBjb21tYW5kIHNsb3QgJXAsIGNtZCAlcFx0XG4iLAorCQkJCSAgICAgICBob3N0LT5ob3N0X25vLCAmaG9zdGRhdGEtPnNsb3RzW2pdLAorCQkJCSAgICAgICBob3N0ZGF0YS0+c2xvdHNbal0uY21uZCkpOworCQkJCWhvc3RkYXRhLT5zYXZlZF9zbG90X3Bvc2l0aW9uID0gaiArIDE7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworU1RBVElDIGludAorTkNSXzcwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTQ3AtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJX191MzIgbW92ZV9pbnM7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqc2xvdDsKKworCWlmKGhvc3RkYXRhLT5jb21tYW5kX3Nsb3RfY291bnQgPj0gTkNSXzcwMF9DT01NQU5EX1NMT1RTX1BFUl9IT1NUKSB7CisJCS8qIFdlJ3JlIG92ZXIgb3VyIGFsbG9jYXRpb24sIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkgKiBzaW5jZSB3ZSByZXBvcnQgdGhlIG1heCBhbGxvY2F0aW9uIHRvIHRoZSBtaWQgbGF5ZXIgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBDb21tYW5kIGRlcHRoIGhhcyBnb25lIG92ZXIgcXVldWUgZGVwdGhcbiIsIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGNoZWNrIGZvciB1bnRhZ2dlZCBjb21tYW5kcy4gIFdlIGNhbm5vdCBoYXZlIGFueSBvdXRzdGFuZGluZworCSAqIGNvbW1hbmRzIGlmIHdlIGFjY2VwdCB0aGVtLiAgQ29tbWFuZHMgY291bGQgYmUgdW50YWdnZWQgYmVjYXVzZToKKwkgKgorCSAqIC0gVGhlIHRhZyBuZWdvdGlhdGVkIGJpdG1hcCBpcyBjbGVhcgorCSAqIC0gVGhlIGJsayBsYXllciBzZW50IGFuZCB1bnRhZ2dlZCBjb21tYW5kCisJICovCisJaWYoTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpICE9IDAKKwkgICAmJiAoIShob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJiAoMTw8U0NwLT5kZXZpY2UtPmlkKSkKKwkgICAgICAgfHwgIWJsa19ycV90YWdnZWQoU0NwLT5yZXF1ZXN0KSkpIHsKKwkJREVCVUcoKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKSBoYXMgbm9uIHplcm8gZGVwdGggJWRcbiIsCisJCSAgICAgICBTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgU0NwLT5kZXZpY2UtPmlkLCBTQ3AtPmRldmljZS0+bHVuLAorCQkgICAgICAgTkNSXzcwMF9nZXRfZGVwdGgoU0NwLT5kZXZpY2UpKSk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisJfQorCWlmKE5DUl83MDBfZ2V0X2RlcHRoKFNDcC0+ZGV2aWNlKSA+PSBTQ3AtPmRldmljZS0+cXVldWVfZGVwdGgpIHsKKwkJREVCVUcoKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKSBoYXMgbWF4IHRhZyBkZXB0aCAlZFxuIiwKKwkJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4sCisJCSAgICAgICBOQ1JfNzAwX2dldF9kZXB0aChTQ3AtPmRldmljZSkpKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWTsKKwl9CisJTkNSXzcwMF9zZXRfZGVwdGgoU0NwLT5kZXZpY2UsIE5DUl83MDBfZ2V0X2RlcHRoKFNDcC0+ZGV2aWNlKSArIDEpOworCisJLyogYmVnaW4gdGhlIGNvbW1hbmQgaGVyZSAqLworCS8qIG5vIG5lZWQgdG8gY2hlY2sgZm9yIE5VTEwsIHRlc3QgZm9yIGNvbW1hbmRfc2xvdF9jb3VudCBhYm92ZQorCSAqIGVuc3VyZXMgYSBzbG90IGlzIGZyZWUgKi8KKwlzbG90ID0gZmluZF9lbXB0eV9zbG90KGhvc3RkYXRhKTsKKworCXNsb3QtPmNtbmQgPSBTQ3A7CisKKwlTQ3AtPnNjc2lfZG9uZSA9IGRvbmU7CisJU0NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilzbG90OworCVNDcC0+U0NwLnB0ciA9IE5VTEw7CisJU0NwLT5TQ3AuYnVmZmVyID0gTlVMTDsKKworI2lmZGVmIE5DUl83MDBfREVCVUcKKwlwcmludGsoIjUzYzcwMDogc2NzaSVkLCBjb21tYW5kICIsIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKyNlbmRpZgorCWlmKGJsa19ycV90YWdnZWQoU0NwLT5yZXF1ZXN0KQorCSAgICYmIChob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJigxPDxTQ3AtPmRldmljZS0+aWQpKSA9PSAwCisJICAgJiYgTkNSXzcwMF9nZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSkgPT0gTkNSXzcwMF9TVEFSVF9UQUdfTkVHT1RJQVRJT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQ6ICglZDolZCkgRW5hYmxpbmcgVGFnIENvbW1hbmQgUXVldWluZ1xuIiwgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIFNDcC0+ZGV2aWNlLT5pZCwgU0NwLT5kZXZpY2UtPmx1bik7CisJCWhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCB8PSAoMTw8U0NwLT5kZXZpY2UtPmlkKTsKKwkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTQ3AtPmRldmljZSwgTkNSXzcwMF9EVVJJTkdfVEFHX05FR09USUFUSU9OKTsKKwl9CisKKwkvKiBoZXJlIHdlIG1heSBoYXZlIHRvIHByb2Nlc3MgYW4gdW50YWdnZWQgY29tbWFuZC4gIFRoZSBnYXRlCisJICogYWJvdmUgZW5zdXJlcyB0aGF0IHRoaXMgd2lsbCBiZSB0aGUgb25seSBvbmUgb3V0c3RhbmRpbmcsCisJICogc28gY2xlYXIgdGhlIHRhZyBuZWdvdGlhdGVkIGJpdC4KKwkgKgorCSAqIEZJWE1FOiBUaGlzIHdpbGwgcm95YWxseSBzY3JldyB1cCBvbiBtdWx0aXBsZSBMVU4gZGV2aWNlcworCSAqICovCisJaWYoIWJsa19ycV90YWdnZWQoU0NwLT5yZXF1ZXN0KQorCSAgICYmIChob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJigxPDxTQ3AtPmRldmljZS0+aWQpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6ICglZDolZCkgRGlzYWJsaW5nIFRhZyBDb21tYW5kIFF1ZXVpbmdcbiIsIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4pOworCQlob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJj0gfigxPDxTQ3AtPmRldmljZS0+aWQpOworCX0KKworCWlmKChob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJigxPDxTQ3AtPmRldmljZS0+aWQpKQorCSAgICYmIHNjc2lfZ2V0X3RhZ190eXBlKFNDcC0+ZGV2aWNlKSkgeworCQlzbG90LT50YWcgPSBTQ3AtPnJlcXVlc3QtPnRhZzsKKwkJREVCVUcoKCI1M2M3MDAgJWQ6JWQ6JWQsIHNlbmRpbmcgb3V0IHRhZyAlZCwgc2xvdCAlcFxuIiwKKwkJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4sIHNsb3QtPnRhZywKKwkJICAgICAgIHNsb3QpKTsKKwl9IGVsc2UgeworCQlzbG90LT50YWcgPSBTQ1NJX05PX1RBRzsKKwkJLyogbXVzdCBwb3B1bGF0ZSBjdXJyZW50X2NtbmQgZm9yIHNjc2lfZmluZF90YWcgdG8gd29yayAqLworCQlTQ3AtPmRldmljZS0+Y3VycmVudF9jbW5kID0gU0NwOworCX0KKwkvKiBzYW5pdHkgY2hlY2s6IHNvbWUgb2YgdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBieSB0aGUgbWlkLWxheWVyCisJICogaGF2ZSBhbiBlY2NlbnRyaWMgaWRlYSBvZiB0aGVpciBzY19kYXRhX2RpcmVjdGlvbiAqLworCWlmKCFTQ3AtPnVzZV9zZyAmJiAhU0NwLT5yZXF1ZXN0X2J1ZmZsZW4gCisJICAgJiYgU0NwLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfTk9ORSkgeworI2lmZGVmIE5DUl83MDBfREVCVUcKKwkJcHJpbnRrKCI1M2M3MDA6IENvbW1hbmQiKTsKKwkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisJCXByaW50aygiSGFzIHdyb25nIGRhdGEgZGlyZWN0aW9uICVkXG4iLCBTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKyNlbmRpZgorCQlTQ3AtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJfQorCisJc3dpdGNoIChTQ3AtPmNtbmRbMF0pIHsKKwljYXNlIFJFUVVFU1RfU0VOU0U6CisJCS8qIGNsZWFyIHRoZSBpbnRlcm5hbCBzZW5zZSBtYWdpYyAqLworCQlTQ3AtPmNtbmRbNl0gPSAwOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQkvKiBPSywgZ2V0IGl0IGZyb20gdGhlIGNvbW1hbmQgKi8KKwkJc3dpdGNoKFNDcC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwkJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiNTNjNzAwOiBVbmtub3duIGNvbW1hbmQgZm9yIGRhdGEgZGlyZWN0aW9uICIpOworCQkJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisJCQkKKwkJCW1vdmVfaW5zID0gMDsKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJbW92ZV9pbnMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQkJbW92ZV9pbnMgPSBTQ1JJUFRfTU9WRV9EQVRBX0lOOworCQkJYnJlYWs7CisJCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJCW1vdmVfaW5zID0gU0NSSVBUX01PVkVfREFUQV9PVVQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vdyBidWlsZCB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCWRpcmVjdGlvbiA9IFNDcC0+c2NfZGF0YV9kaXJlY3Rpb247CisJaWYobW92ZV9pbnMgIT0gMCkgeworCQlpbnQgaTsKKwkJaW50IHNnX2NvdW50OworCQlkbWFfYWRkcl90IHZQdHIgPSAwOworCQlfX3UzMiBjb3VudCA9IDA7CisKKwkJaWYoU0NwLT51c2Vfc2cpIHsKKwkJCXNnX2NvdW50ID0gZG1hX21hcF9zZyhob3N0ZGF0YS0+ZGV2LCBTQ3AtPmJ1ZmZlciwKKwkJCQkJICAgICAgU0NwLT51c2Vfc2csIGRpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQl2UHRyID0gZG1hX21hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwKKwkJCQkJICAgICAgU0NwLT5yZXF1ZXN0X2J1ZmZlciwgCisJCQkJCSAgICAgIFNDcC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkgICAgICBkaXJlY3Rpb24pOworCQkJY291bnQgPSBTQ3AtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCXNsb3QtPmRtYV9oYW5kbGUgPSB2UHRyOworCQkJc2dfY291bnQgPSAxOworCQl9CisJCQkKKworCQlmb3IoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisKKwkJCWlmKFNDcC0+dXNlX3NnKSB7CisJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IFNDcC0+YnVmZmVyOworCisJCQkJdlB0ciA9IHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSk7CisJCQkJY291bnQgPSBzZ19kbWFfbGVuKCZzZ1tpXSk7CisJCQl9CisKKwkJCXNsb3QtPlNHW2ldLmlucyA9IGJTX3RvX2hvc3QobW92ZV9pbnMgfCBjb3VudCk7CisJCQlERUJVRygoIiBzY2F0dGVyIGJsb2NrICVkOiBtb3ZlICVkWyUwOHhdIGZyb20gMHglbHhcbiIsCisJCQkgICAgICAgaSwgY291bnQsIHNsb3QtPlNHW2ldLmlucywgKHVuc2lnbmVkIGxvbmcpdlB0cikpOworCQkJc2xvdC0+U0dbaV0ucEFkZHIgPSBiU190b19ob3N0KHZQdHIpOworCQl9CisJCXNsb3QtPlNHW2ldLmlucyA9IGJTX3RvX2hvc3QoU0NSSVBUX1JFVFVSTik7CisJCXNsb3QtPlNHW2ldLnBBZGRyID0gMDsKKwkJZG1hX2NhY2hlX3N5bmMoc2xvdC0+U0csIHNpemVvZihzbG90LT5TRyksIERNQV9UT19ERVZJQ0UpOworCQlERUJVRygoIiBTRVRUSU5HICUwOGx4IHRvICV4XG4iLAorCQkgICAgICAgKCZzbG90LT5wU0dbaV0uaW5zKSwgCisJCSAgICAgICBzbG90LT5TR1tpXS5pbnMpKTsKKwl9CisJc2xvdC0+cmVzdW1lX29mZnNldCA9IDA7CisJc2xvdC0+cENtZCA9IGRtYV9tYXBfc2luZ2xlKGhvc3RkYXRhLT5kZXYsIFNDcC0+Y21uZCwKKwkJCQkgICAgc2l6ZW9mKFNDcC0+Y21uZCksIERNQV9UT19ERVZJQ0UpOworCU5DUl83MDBfc3RhcnRfY29tbWFuZChTQ3ApOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CitOQ1JfNzAwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3ApCit7CisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpzbG90OworCisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkICglZDolZCkgTmV3IGVycm9yIGhhbmRsZXIgd2FudHMgdG8gYWJvcnQgY29tbWFuZFxuXHQiLAorCSAgICAgICBTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgU0NwLT5kZXZpY2UtPmlkLCBTQ3AtPmRldmljZS0+bHVuKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKworCXNsb3QgPSAoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICopU0NwLT5ob3N0X3NjcmliYmxlOworCisJaWYoc2xvdCA9PSBOVUxMKQorCQkvKiBubyBvdXRzdGFuZGluZyBjb21tYW5kIHRvIGFib3J0ICovCisJCXJldHVybiBTVUNDRVNTOworCWlmKFNDcC0+Y21uZFswXSA9PSBURVNUX1VOSVRfUkVBRFkpIHsKKwkJLyogRklYTUU6IFRoaXMgaXMgYmVjYXVzZSBvZiBhIHByb2JsZW0gaW4gdGhlIG5ldworCQkgKiBlcnJvciBoYW5kbGVyLiAgV2hlbiBpdCBpcyBpbiBlcnJvciByZWNvdmVyeSwgaXQKKwkJICogd2lsbCBzZW5kIGEgVFVSIHRvIGEgZGV2aWNlIGl0IHRoaW5rcyBtYXkgc3RpbGwgYmUKKwkJICogc2hvd2luZyBhIHByb2JsZW0uICBJZiB0aGUgVFVSIGlzbid0IHJlc3BvbmRlZCB0bywKKwkJICogaXQgd2lsbCBhYm9ydCBpdCBhbmQgbWFyayB0aGUgZGV2aWNlIG9mZiBsaW5lLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBpdCBkb2VzIG5vIG90aGVyIGVycm9yIHJlY292ZXJ5LCBzbworCQkgKiB0aGlzIHdvdWxkIGxlYXZlIHVzIHdpdGggYW4gb3V0c3RhbmRpbmcgY29tbWFuZAorCQkgKiBvY2N1cHlpbmcgYSBzbG90LiAgUmF0aGVyIHRoYW4gYWxsb3cgdGhpcyB0bworCQkgKiBoYXBwZW4sIHdlIGlzc3VlIGEgYnVzIHJlc2V0IHRvIGZvcmNlIGFsbAorCQkgKiBvdXRzdGFuZGluZyBjb21tYW5kcyB0byB0ZXJtaW5hdGUgaGVyZS4gKi8KKwkJTkNSXzcwMF9pbnRlcm5hbF9idXNfcmVzZXQoU0NwLT5kZXZpY2UtPmhvc3QpOworCQkvKiBzdGlsbCBkcm9wIHRocm91Z2ggYW5kIHJldHVybiBmYWlsZWQgKi8KKwl9CisJcmV0dXJuIEZBSUxFRDsKKworfQorCitTVEFUSUMgaW50CitOQ1JfNzAwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwKQoreworCURFQ0xBUkVfQ09NUExFVElPTihjb21wbGV0ZSk7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9IAorCQkoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkICglZDolZCkgTmV3IGVycm9yIGhhbmRsZXIgd2FudHMgQlVTIHJlc2V0LCBjbWQgJXBcblx0IiwKKwkgICAgICAgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIFNDcC0+ZGV2aWNlLT5pZCwgU0NwLT5kZXZpY2UtPmx1biwgU0NwKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwKTsKKwkvKiBJbiB0aGVvcnksIGVoX2NvbXBsZXRlIHNob3VsZCBhbHdheXMgYmUgbnVsbCBiZWNhdXNlIHRoZQorCSAqIGVoIGlzIHNpbmdsZSB0aHJlYWRlZCwgYnV0IGp1c3QgaW4gY2FzZSB3ZSdyZSBoYW5kbGluZyBhCisJICogcmVzZXQgdmlhIHNnIG9yIHNvbWV0aGluZyAqLworCXdoaWxlKGhvc3RkYXRhLT5laF9jb21wbGV0ZSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycShTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwkJc3Bpbl9sb2NrX2lycShTQ3AtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwl9CisJaG9zdGRhdGEtPmVoX2NvbXBsZXRlID0gJmNvbXBsZXRlOworCU5DUl83MDBfaW50ZXJuYWxfYnVzX3Jlc2V0KFNDcC0+ZGV2aWNlLT5ob3N0KTsKKwlzcGluX3VubG9ja19pcnEoU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcGxldGUpOworCXNwaW5fbG9ja19pcnEoU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CisJaG9zdGRhdGEtPmVoX2NvbXBsZXRlID0gTlVMTDsKKwkvKiBSZXZhbGlkYXRlIHRoZSB0cmFuc3BvcnQgcGFyYW1ldGVycyBvZiB0aGUgZmFpbGluZyBkZXZpY2UgKi8KKwlpZihob3N0ZGF0YS0+ZmFzdCkKKwkJc3BpX3NjaGVkdWxlX2R2X2RldmljZShTQ3AtPmRldmljZSk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK1NUQVRJQyBpbnQKK05DUl83MDBfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3ApCit7CisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkICglZDolZCkgTmV3IGVycm9yIGhhbmRsZXIgd2FudHMgZGV2aWNlIHJlc2V0XG5cdCIsCisJICAgICAgIFNDcC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBTQ3AtPmRldmljZS0+aWQsIFNDcC0+ZGV2aWNlLT5sdW4pOworCXNjc2lfcHJpbnRfY29tbWFuZChTQ3ApOworCQorCXJldHVybiBGQUlMRUQ7Cit9CisKK1NUQVRJQyBpbnQKK05DUl83MDBfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwKQoreworCXByaW50ayhLRVJOX0lORk8gInNjc2klZCAoJWQ6JWQpIE5ldyBlcnJvciBoYW5kbGVyIHdhbnRzIEhPU1QgcmVzZXRcblx0IiwKKwkgICAgICAgU0NwLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIFNDcC0+ZGV2aWNlLT5pZCwgU0NwLT5kZXZpY2UtPmx1bik7CisJc2NzaV9wcmludF9jb21tYW5kKFNDcCk7CisKKwlOQ1JfNzAwX2ludGVybmFsX2J1c19yZXNldChTQ3AtPmRldmljZS0+aG9zdCk7CisJTkNSXzcwMF9jaGlwX3Jlc2V0KFNDcC0+ZGV2aWNlLT5ob3N0KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworU1RBVElDIHZvaWQKK05DUl83MDBfc2V0X3BlcmlvZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKlNUcCwgaW50IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpTSHAgPSBkZXZfdG9fc2hvc3QoU1RwLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilTSHAtPmhvc3RkYXRhWzBdOworCQorCWlmKCFob3N0ZGF0YS0+ZmFzdCkKKwkJcmV0dXJuOworCisJaWYocGVyaW9kIDwgaG9zdGRhdGEtPm1pbl9wZXJpb2QpCisJCXBlcmlvZCA9IGhvc3RkYXRhLT5taW5fcGVyaW9kOworCisJc3BpX3BlcmlvZChTVHApID0gcGVyaW9kOworCXNwaV9mbGFncyhTVHApICY9IH4oTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DIHwKKwkJCSAgICBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKTsKKwlzcGlfZmxhZ3MoU1RwKSB8PSBOQ1JfNzAwX0RFVl9QUklOVF9TWU5DX05FR09USUFUSU9OOworfQorCitTVEFUSUMgdm9pZAorTkNSXzcwMF9zZXRfb2Zmc2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqU1RwLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKlNIcCA9IGRldl90b19zaG9zdChTVHAtPmRldi5wYXJlbnQpOworCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPSAKKwkJKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKVNIcC0+aG9zdGRhdGFbMF07CisJaW50IG1heF9vZmZzZXQgPSBob3N0ZGF0YS0+Y2hpcDcxMAorCQk/IE5DUl83MTBfTUFYX09GRlNFVCA6IE5DUl83MDBfTUFYX09GRlNFVDsKKwkKKwlpZighaG9zdGRhdGEtPmZhc3QpCisJCXJldHVybjsKKworCWlmKG9mZnNldCA+IG1heF9vZmZzZXQpCisJCW9mZnNldCA9IG1heF9vZmZzZXQ7CisKKwkvKiBpZiB3ZSdyZSBjdXJyZW50bHkgYXN5bmMsIG1ha2Ugc3VyZSB0aGUgcGVyaW9kIGlzIHJlYXNvbmFibGUgKi8KKwlpZihzcGlfb2Zmc2V0KFNUcCkgPT0gMCAmJiAoc3BpX3BlcmlvZChTVHApIDwgaG9zdGRhdGEtPm1pbl9wZXJpb2QgfHwKKwkJCQkgICAgc3BpX3BlcmlvZChTVHApID4gMHhmZikpCisJCXNwaV9wZXJpb2QoU1RwKSA9IGhvc3RkYXRhLT5taW5fcGVyaW9kOworCisJc3BpX29mZnNldChTVHApID0gb2Zmc2V0OworCXNwaV9mbGFncyhTVHApICY9IH4oTkNSXzcwMF9ERVZfTkVHT1RJQVRFRF9TWU5DIHwKKwkJCSAgICBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OKTsKKwlzcGlfZmxhZ3MoU1RwKSB8PSBOQ1JfNzAwX0RFVl9QUklOVF9TWU5DX05FR09USUFUSU9OOworfQorCisKKworU1RBVElDIGludAorTkNSXzcwMF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpTRHApCit7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9IAorCQkoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopU0RwLT5ob3N0LT5ob3N0ZGF0YVswXTsKKworCS8qIHRvIGRvIGhlcmU6IGFsbG9jYXRlIG1lbW9yeTsgYnVpbGQgYSBxdWV1ZV9mdWxsIGxpc3QgKi8KKwlpZihTRHAtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJc2NzaV9zZXRfdGFnX3R5cGUoU0RwLCBNU0dfT1JERVJFRF9UQUcpOworCQlzY3NpX2FjdGl2YXRlX3RjcShTRHAsIE5DUl83MDBfREVGQVVMVF9UQUdTKTsKKwkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTRHAsIE5DUl83MDBfU1RBUlRfVEFHX05FR09USUFUSU9OKTsKKwl9IGVsc2UgeworCQkvKiBpbml0aWFsaXNlIHRvIGRlZmF1bHQgZGVwdGggKi8KKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoU0RwLCAwLCBTRHAtPmhvc3QtPmNtZF9wZXJfbHVuKTsKKwl9CisJaWYoaG9zdGRhdGEtPmZhc3QpIHsKKwkJLyogRmluZCB0aGUgY29ycmVjdCBvZmZzZXQgYW5kIHBlcmlvZCB2aWEgZG9tYWluIHZhbGlkYXRpb24gKi8KKwkJaWYgKCFzcGlfaW5pdGlhbF9kdihTRHAtPnNkZXZfdGFyZ2V0KSkKKwkJCXNwaV9kdl9kZXZpY2UoU0RwKTsKKwl9IGVsc2UgeworCQlzcGlfb2Zmc2V0KFNEcC0+c2Rldl90YXJnZXQpID0gMDsKKwkJc3BpX3BlcmlvZChTRHAtPnNkZXZfdGFyZ2V0KSA9IDA7CisJfQorCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAorTkNSXzcwMF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwKQoreworCS8qIHRvIGRvIGhlcmU6IGRlYWxsb2NhdGUgbWVtb3J5ICovCit9CisKK3N0YXRpYyBpbnQKK05DUl83MDBfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBpbnQgZGVwdGgpCit7CisJaWYgKGRlcHRoID4gTkNSXzcwMF9NQVhfVEFHUykKKwkJZGVwdGggPSBOQ1JfNzAwX01BWF9UQUdTOworCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoU0RwLCBzY3NpX2dldF90YWdfdHlwZShTRHApLCBkZXB0aCk7CisJcmV0dXJuIGRlcHRoOworfQorCitzdGF0aWMgaW50IE5DUl83MDBfY2hhbmdlX3F1ZXVlX3R5cGUoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIGludCB0YWdfdHlwZSkKK3sKKwlpbnQgY2hhbmdlX3RhZyA9ICgodGFnX3R5cGUgPT0wICYmICBzY3NpX2dldF90YWdfdHlwZShTRHApICE9IDApCisJCQkgIHx8ICh0YWdfdHlwZSAhPSAwICYmIHNjc2lfZ2V0X3RhZ190eXBlKFNEcCkgPT0gMCkpOworCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPSAKKwkJKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKVNEcC0+aG9zdC0+aG9zdGRhdGFbMF07CisKKwlzY3NpX3NldF90YWdfdHlwZShTRHAsIHRhZ190eXBlKTsKKworCS8qIFdlIGhhdmUgYSBnbG9iYWwgKHBlciB0YXJnZXQpIGZsYWcgdG8gdHJhY2sgd2hldGhlciBUQ1EgaXMKKwkgKiBlbmFibGVkLCBzbyB3ZSdsbCBiZSB0dXJuaW5nIGl0IG9mZiBmb3IgdGhlIGVudGlyZSB0YXJnZXQgaGVyZS4KKwkgKiBvdXIgdGFnIGFsZ29yaXRobSB3aWxsIGZhaWwgaWYgd2UgbWl4IHRhZ2dlZCBhbmQgdW50YWdnZWQgY29tbWFuZHMsCisJICogc28gcXVpZXNjZSB0aGUgZGV2aWNlIGJlZm9yZSBkb2luZyB0aGlzICovCisJaWYgKGNoYW5nZV90YWcpCisJCXNjc2lfdGFyZ2V0X3F1aWVzY2UoU0RwLT5zZGV2X3RhcmdldCk7CisKKwlpZiAoIXRhZ190eXBlKSB7CisJCS8qIHNoaWZ0IGJhY2sgdG8gdGhlIGRlZmF1bHQgdW5xdWV1ZWQgbnVtYmVyIG9mIGNvbW1hbmRzCisJCSAqICh0aGUgdXNlciBjYW4gc3RpbGwgcmFpc2UgdGhpcykgKi8KKwkJc2NzaV9kZWFjdGl2YXRlX3RjcShTRHAsIFNEcC0+aG9zdC0+Y21kX3Blcl9sdW4pOworCQlob3N0ZGF0YS0+dGFnX25lZ290aWF0ZWQgJj0gfigxIDw8IFNEcC0+aWQpOworCX0gZWxzZSB7CisJCS8qIEhlcmUsIHdlIGNsZWFyZWQgdGhlIG5lZ290aWF0aW9uIGZsYWcgYWJvdmUsIHNvIHRoaXMKKwkJICogd2lsbCBmb3JjZSB0aGUgZHJpdmVyIHRvIHJlbmVnb3RpYXRlICovCisJCXNjc2lfYWN0aXZhdGVfdGNxKFNEcCwgU0RwLT5xdWV1ZV9kZXB0aCk7CisJCWlmIChjaGFuZ2VfdGFnKQorCQkJTkNSXzcwMF9zZXRfdGFnX25lZ19zdGF0ZShTRHAsIE5DUl83MDBfU1RBUlRfVEFHX05FR09USUFUSU9OKTsKKwl9CisJaWYgKGNoYW5nZV90YWcpCisJCXNjc2lfdGFyZ2V0X3Jlc3VtZShTRHAtPnNkZXZfdGFyZ2V0KTsKKworCXJldHVybiB0YWdfdHlwZTsKK30KKworc3RhdGljIHNzaXplX3QKK05DUl83MDBfc2hvd19hY3RpdmVfdGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVkXG4iLCBOQ1JfNzAwX2dldF9kZXB0aChTRHApKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIE5DUl83MDBfYWN0aXZlX3RhZ3NfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPQkJImFjdGl2ZV90YWdzIiwKKwkJLm1vZGUgPQkJU19JUlVHTywKKwl9LAorCS5zaG93ID0gTkNSXzcwMF9zaG93X2FjdGl2ZV90YWdzLAorfTsKKworU1RBVElDIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpOQ1JfNzAwX2Rldl9hdHRyc1tdID0geworCSZOQ1JfNzAwX2FjdGl2ZV90YWdzX2F0dHIsCisJTlVMTCwKK307CisKK0VYUE9SVF9TWU1CT0woTkNSXzcwMF9kZXRlY3QpOworRVhQT1JUX1NZTUJPTChOQ1JfNzAwX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChOQ1JfNzAwX2ludHIpOworCitzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBOQ1JfNzAwX3RyYW5zcG9ydF9mdW5jdGlvbnMgPSAgeworCS5zZXRfcGVyaW9kCT0gTkNSXzcwMF9zZXRfcGVyaW9kLAorCS5zaG93X3BlcmlvZAk9IDEsCisJLnNldF9vZmZzZXQJPSBOQ1JfNzAwX3NldF9vZmZzZXQsCisJLnNob3dfb2Zmc2V0CT0gMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IE5DUl83MDBfaW5pdCh2b2lkKQoreworCU5DUl83MDBfdHJhbnNwb3J0X3RlbXBsYXRlID0gc3BpX2F0dGFjaF90cmFuc3BvcnQoJk5DUl83MDBfdHJhbnNwb3J0X2Z1bmN0aW9ucyk7CisJaWYoIU5DUl83MDBfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IE5DUl83MDBfZXhpdCh2b2lkKQoreworCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChOQ1JfNzAwX3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK21vZHVsZV9pbml0KE5DUl83MDBfaW5pdCk7Cittb2R1bGVfZXhpdChOQ1JfNzAwX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjNzAwLmggYi9kcml2ZXJzL3Njc2kvNTNjNzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0YWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3MDAuaApAQCAtMCwwICsxLDY0OSBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBEcml2ZXIgZm9yIDUzYzcwMCBhbmQgNTNjNzAwLTY2IGNoaXBzIGZyb20gTkNSIGFuZCBTeW1iaW9zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqLworCisjaWZuZGVmIF81M0M3MDBfSAorI2RlZmluZSBfNTNDNzAwX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorCisKKyNpZiBkZWZpbmVkKENPTkZJR181M0M3MDBfTUVNX01BUFBFRCkgJiYgZGVmaW5lZChDT05GSUdfNTNDNzAwX0lPX01BUFBFRCkKKyNkZWZpbmUgQ09ORklHXzUzQzcwMF9CT1RIX01BUFBFRAorI2VuZGlmCisKKy8qIFR1cm4gb24gZm9yIGdlbmVyYWwgZGVidWdnaW5nLS0tdG9vIHZlcmJvc2UgZm9yIG5vcm1hbCB1c2UgKi8KKyN1bmRlZglOQ1JfNzAwX0RFQlVHCisvKiBEZWJ1ZyB0aGUgdGFnIHF1ZXVlcywgY2hlY2tpbmcgaGFzaCBxdWV1ZSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24KKyAqIGFuZCBzZWFyY2ggZm9yIGR1cGxpY2F0ZSB0YWdzICovCisjdW5kZWYgTkNSXzcwMF9UQUdfREVCVUcKKworI2lmZGVmIE5DUl83MDBfREVCVUcKKyNkZWZpbmUgREVCVUcoeCkJcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERFQlVHKHgpCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29tbWFuZCBzbG90cyAqLworI2RlZmluZSBOQ1JfNzAwX0NPTU1BTkRfU0xPVFNfUEVSX0hPU1QJNjQKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBTY2F0dGVyIEdhdGhlcnMgd2UgYWxsb3cgKi8KKyNkZWZpbmUgTkNSXzcwMF9TR19TRUdNRU5UUwkJMzIKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsdW5zIChtYWtlIHRoaXMgb2YgdGhlIGZvcm0gMl5uKSAqLworI2RlZmluZSBOQ1JfNzAwX01BWF9MVU5TCQkzMgorI2RlZmluZSBOQ1JfNzAwX0xVTl9NQVNLCQkoTkNSXzcwMF9NQVhfTFVOUyAtIDEpCisvKiBNYXhpbXVtIG51bWJlciBvZiB0YWdzIHRoZSBkcml2ZXIgZXZlciBhbGxvd3MgcGVyIGRldmljZSAqLworI2RlZmluZSBOQ1JfNzAwX01BWF9UQUdTCQkxNgorLyogVGFnIGRlcHRoIHRoZSBkcml2ZXIgc3RhcnRzIG91dCB3aXRoIChjYW4gYmUgYWx0ZXJlZCBpbiBzeXNmcykgKi8KKyNkZWZpbmUgTkNSXzcwMF9ERUZBVUxUX1RBR1MJCTQKKy8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbW1hbmRzIHBlciBMVU4gaW4gdGhlIHVudGFnZ2VkIGNhc2UuCisgKiB0d28gaXMgYSBnb29kIHZhbHVlIGJlY2F1c2UgaXQgbWVhbnMgd2UgY2FuIGhhdmUgb25lIGNvbW1hbmQgYWN0aXZlIGFuZAorICogb25lIGNvbW1hbmQgZnVsbHkgcHJlcGFyZWQgYW5kIHdhaXRpbmcKKyAqLworI2RlZmluZSBOQ1JfNzAwX0NNRF9QRVJfTFVOCQkyCisvKiBtYWdpYyBieXRlIGlkZW50aWZ5aW5nIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkIFJFUVVFU1RfU0VOU0UgY29tbWFuZCAqLworI2RlZmluZSBOQ1JfNzAwX0lOVEVSTkFMX1NFTlNFX01BR0lDCTB4NDIKKworLyogV0FSTklORzogTGVhdmUgdGhpcyBpbiBmb3Igbm93OiB0aGUgZGVwZW5kZW5jeSBwcmVwcm9jZXNzb3IgZG9lc24ndAorICogcGljayB1cCBmaWxlIHNwZWNpZmljIGZsYWdzLCBzbyBtdXN0IGRlZmluZSBoZXJlIGlmIHRoZXkgYXJlIG5vdAorICogc2V0ICovCisjaWYgIWRlZmluZWQoQ09ORklHXzUzQzcwMF9JT19NQVBQRUQpICYmICFkZWZpbmVkKENPTkZJR181M0M3MDBfTUVNX01BUFBFRCkKKyNlcnJvciAiQ29uZmlnLmluIG11c3QgZGVmaW5lIGVpdGhlciBDT05GSUdfNTNDNzAwX0lPX01BUFBFRCBvciBDT05GSUdfNTNDNzAwX01FTV9NQVBQRUQgdG8gdXNlIHRoaXMgc2NzaSBjb3JlLiIKKyNlbmRpZgorCitzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnM7CisKKy8qIFRoZXNlIGFyZSB0aGUgZXh0ZXJuYWxseSB1c2VkIHJvdXRpbmVzICovCitzdHJ1Y3QgU2NzaV9Ib3N0ICpOQ1JfNzAwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICosCisJCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqLCBzdHJ1Y3QgZGV2aWNlICopOworaW50IE5DUl83MDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK2lycXJldHVybl90IE5DUl83MDBfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKworZW51bSBOQ1JfNzAwX0hvc3RfU3RhdGUgeworCU5DUl83MDBfSE9TVF9CVVNZLAorCU5DUl83MDBfSE9TVF9GUkVFLAorfTsKKworc3RydWN0IE5DUl83MDBfU0dfTGlzdCB7CisJLyogVGhlIGZvbGxvd2luZyBpcyBhIHNjcmlwdCBmcmFnbWVudCB0byBtb3ZlIHRoZSBidWZmZXIgb250byB0aGUKKwkgKiBidXMgYW5kIHRoZW4gbGluayB0aGUgbmV4dCBmcmFnbWVudCBvciByZXR1cm4gKi8KKwkjZGVmaW5lCVNDUklQVF9NT1ZFX0RBVEFfSU4JCTB4MDkwMDAwMDAKKwkjZGVmaW5lCVNDUklQVF9NT1ZFX0RBVEFfT1VUCQkweDA4MDAwMDAwCisJX191MzIJaW5zOworCV9fdTMyCXBBZGRyOworCSNkZWZpbmUJU0NSSVBUX05PUAkJCTB4ODAwMDAwMDAKKwkjZGVmaW5lCVNDUklQVF9SRVRVUk4JCQkweDkwMDgwMDAwCit9OworCisvKiBXZSB1c2UgZGV2aWNlLT5ob3N0ZGF0YSB0byBzdG9yZSBuZWdvdGlhdGVkIHBhcmFtZXRlcnMuICBUaGlzIGlzCisgKiBzdXBwb3NlZCB0byBiZSBhIHBvaW50ZXIgdG8gYSBkZXZpY2UgcHJpdmF0ZSBhcmVhLCBidXQgd2UgY2Fubm90CisgKiByZWFsbHkgdXNlIGl0IGFzIHN1Y2ggc2luY2UgaXQgd2lsbCBuZXZlciBiZSBmcmVlZCwgc28ganVzdCB1c2UgdGhlCisgKiAzMiBiaXRzIHRvIGNyYW0gdGhlIGluZm9ybWF0aW9uLiAgVGhlIFNZTkMgbmVnb3RpYXRpb24gc2VxdWVuY2UgbG9va3MKKyAqIGxpa2U6CisgKiAKKyAqIElmIERFVl9ORUdPVElBVEVEX1NZTkMgbm90IHNldCwgdGFjayBhbmQgU0RUUiBtZXNzYWdlIG9uIHRvIHRoZQorICogaW5pdGlhbCBpZGVudGlmeSBmb3IgdGhlIGRldmljZSBhbmQgc2V0IERFVl9CRUdJTl9TWU5DX05FR09UQVRJT04KKyAqIElmIHdlIGdldCBhbiBTRFRSIHJlcGx5LCB3b3JrIG91dCB0aGUgU1hGRVIgcGFyYW1ldGVycywgc3F1aXJyZWwKKyAqIHRoZW0gYXdheSBoZXJlLCBjbGVhciBERVZfQkVHSU5fU1lOQ19ORUdPVElBVElPTiBhbmQgc2V0CisgKiBERVZfTkVHT1RJQVRFRF9TWU5DLiAgSWYgd2UgZ2V0IGEgUkVKRUNUIG1zZywgc3F1aXJyZWwKKyAqCisgKgorICogMDo3CVNYRkVSX1JFRyBuZWdvdGlhdGVkIHZhbHVlIGZvciB0aGlzIGRldmljZQorICogODoxNSBDdXJyZW50IHF1ZXVlIGRlcHRoCisgKiAxNgluZWdvdGlhdGVkIFNZTkMgZmxhZworICogMTcgYmVnaW4gU1lOQyBuZWdvdGlhdGlvbiBmbGFnIAorICogMTggZGV2aWNlIHN1cHBvcnRzIHRhZyBxdWV1ZWluZyAqLworI2RlZmluZSBOQ1JfNzAwX0RFVl9ORUdPVElBVEVEX1NZTkMJKDE8PDE2KQorI2RlZmluZSBOQ1JfNzAwX0RFVl9CRUdJTl9TWU5DX05FR09USUFUSU9OCSgxPDwxNykKKyNkZWZpbmUgTkNSXzcwMF9ERVZfUFJJTlRfU1lOQ19ORUdPVElBVElPTiAoMTw8MTkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9zZXRfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIF9fdTggZGVwdGgpCit7CisJbG9uZyBsID0gKGxvbmcpU0RwLT5ob3N0ZGF0YTsKKworCWwgJj0gMHhmZmZmMDBmZjsKKwlsIHw9IDB4ZmYwMCAmIChkZXB0aCA8PCA4KTsKKwlTRHAtPmhvc3RkYXRhID0gKHZvaWQgKilsOworfQorc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2dldF9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCkKK3sKKwlyZXR1cm4gKCgoKHVuc2lnbmVkIGxvbmcpU0RwLT5ob3N0ZGF0YSkgJiAweGZmMDApPj44KTsKK30KK3N0YXRpYyBpbmxpbmUgaW50CitOQ1JfNzAwX2lzX2ZsYWdfc2V0KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBfX3UzMiBmbGFnKQoreworCXJldHVybiAoc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpICYgZmxhZykgPT0gZmxhZzsKK30KK3N0YXRpYyBpbmxpbmUgaW50CitOQ1JfNzAwX2lzX2ZsYWdfY2xlYXIoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIF9fdTMyIGZsYWcpCit7CisJcmV0dXJuIChzcGlfZmxhZ3MoU0RwLT5zZGV2X3RhcmdldCkgJiBmbGFnKSA9PSAwOworfQorc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3NldF9mbGFnKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwLCBfX3UzMiBmbGFnKQoreworCXNwaV9mbGFncyhTRHAtPnNkZXZfdGFyZ2V0KSB8PSBmbGFnOworfQorc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX2NsZWFyX2ZsYWcoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsIF9fdTMyIGZsYWcpCit7CisJc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpICY9IH5mbGFnOworfQorCitlbnVtIE5DUl83MDBfdGFnX25lZ19zdGF0ZSB7CisJTkNSXzcwMF9TVEFSVF9UQUdfTkVHT1RJQVRJT04gPSAwLAorCU5DUl83MDBfRFVSSU5HX1RBR19ORUdPVElBVElPTiA9IDEsCisJTkNSXzcwMF9GSU5JU0hFRF9UQUdfTkVHT1RJQVRJT04gPSAyLAorfTsKKworc3RhdGljIGlubGluZSBlbnVtIE5DUl83MDBfdGFnX25lZ19zdGF0ZQorTkNSXzcwMF9nZXRfdGFnX25lZ19zdGF0ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCkKK3sKKwlyZXR1cm4gKGVudW0gTkNSXzcwMF90YWdfbmVnX3N0YXRlKSgoc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpPj4yMCkgJiAweDMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK05DUl83MDBfc2V0X3RhZ19uZWdfc3RhdGUoc3RydWN0IHNjc2lfZGV2aWNlICpTRHAsCisJCQkgIGVudW0gTkNSXzcwMF90YWdfbmVnX3N0YXRlIHN0YXRlKQoreworCS8qIGNsZWFyIHRoZSBzbG90ICovCisJc3BpX2ZsYWdzKFNEcC0+c2Rldl90YXJnZXQpICY9IH4oMHgzIDw8IDIwKTsKKwlzcGlfZmxhZ3MoU0RwLT5zZGV2X3RhcmdldCkgfD0gKChfX3UzMilzdGF0ZSkgPDwgMjA7Cit9CisKK3N0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCB7CisJc3RydWN0IE5DUl83MDBfU0dfTGlzdAlTR1tOQ1JfNzAwX1NHX1NFR01FTlRTKzFdOworCXN0cnVjdCBOQ1JfNzAwX1NHX0xpc3QJKnBTRzsKKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9NQVNLIDB4RkMKKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9NQUdJQyAweGI4CisJI2RlZmluZQlOQ1JfNzAwX1NMT1RfRlJFRSAoMHxOQ1JfNzAwX1NMT1RfTUFHSUMpIC8qIHNsb3QgbWF5IGJlIHVzZWQgKi8KKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9CVVNZICgxfE5DUl83MDBfU0xPVF9NQUdJQykgLyogc2xvdCBoYXMgY29tbWFuZCBhY3RpdmUgb24gSEEgKi8KKwkjZGVmaW5lIE5DUl83MDBfU0xPVF9RVUVVRUQgKDJ8TkNSXzcwMF9TTE9UX01BR0lDKSAvKiBzbG90IGhhcyBjb21tYW5kIHRvIGJlIG1hZGUgYWN0aXZlIG9uIEhBICovCisJX191OAlzdGF0ZTsKKwlpbnQJdGFnOworCV9fdTMyCXJlc3VtZV9vZmZzZXQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZDsKKwkvKiBUaGUgcGNpX21hcHBlZCBhZGRyZXNzIG9mIHRoZSBhY3R1YWwgY29tbWFuZCBpbiBjbW5kICovCisJZG1hX2FkZHJfdAlwQ21kOworCV9fdTMyCQl0ZW1wOworCS8qIGlmIHRoaXMgY29tbWFuZCBpcyBhIHBjaV9zaW5nbGUgbWFwcGluZywgaG9sZHMgdGhlIGRtYSBhZGRyZXNzCisJICogZm9yIGxhdGVyIHVubWFwcGluZyBpbiB0aGUgZG9uZSByb3V0aW5lICovCisJZG1hX2FkZHJfdAlkbWFfaGFuZGxlOworCS8qIGhpc3RvcmljYWwgcmVtbmFudCwgbm93IHVzZWQgdG8gbGluayBmcmVlIGNvbW1hbmRzICovCisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpJVExfZm9ydzsKK307CisKK3N0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyB7CisJLyogVGhlc2UgbXVzdCBiZSBmaWxsZWQgaW4gYnkgdGhlIGNhbGxpbmcgZHJpdmVyICovCisJaW50CWNsb2NrOwkJCS8qIGJvYXJkIGNsb2NrIHNwZWVkIGluIE1IeiAqLworCXVuc2lnbmVkIGxvbmcJYmFzZTsJCS8qIHRoZSBiYXNlIGZvciB0aGUgcG9ydCAoY29waWVkIHRvIGhvc3QpICovCisJc3RydWN0IGRldmljZQkqZGV2OworCV9fdTMyCWRtb2RlX2V4dHJhOwkvKiBhZGp1c3RhYmxlIGJ1cyBzZXR0aW5ncyAqLworCV9fdTMyCWRpZmZlcmVudGlhbDoxOwkvKiBpZiB3ZSBhcmUgZGlmZmVyZW50aWFsICovCisjaWZkZWYgQ09ORklHXzUzQzcwMF9MRV9PTl9CRQorCS8qIFRoaXMgb3B0aW9uIGlzIGZvciBIUCBvbmx5LiAgU2V0IGl0IGlmIHlvdXIgY2hpcCBpcyB3aXJlZCBmb3IKKwkgKiBsaXR0bGUgZW5kaWFuIG9uIHRoaXMgcGxhdGZvcm0gKHdoaWNoIGlzIGJpZyBlbmRpYW4pICovCisJX191MzIJZm9yY2VfbGVfb25fYmU6MTsKKyNlbmRpZgorCV9fdTMyCWNoaXA3MTA6MTsJLyogc2V0IGlmIHJlYWxseSBhIDcxMCBub3QgNzAwICovCisJX191MzIJYnVyc3RfZGlzYWJsZToxOwkvKiBzZXQgdG8gMSB0byBkaXNhYmxlIDcxMCBidXJzdGluZyAqLworCisJLyogTk9USElORyBCRUxPVyBIRVJFIE5FRURTIEFMVEVSSU5HICovCisJX191MzIJZmFzdDoxOwkJLyogaWYgd2UgY2FuIGFsdGVyIHRoZSBTQ1NJIGJ1cyBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCAoc28gY2FuIG5lZ2lvdGlhdGUgc3luYykgKi8KKyNpZmRlZiBDT05GSUdfNTNDNzAwX0JPVEhfTUFQUEVECisJX191MzIJbWVtX21hcHBlZDsJLyogc2V0IGlmIG1lbW9yeSBtYXBwZWQgKi8KKyNlbmRpZgorCWludAlzeW5jX2Nsb2NrOwkvKiBUaGUgc3BlZWQgb2YgdGhlIFNZTkMgY29yZSAqLworCisJX191MzIJKnNjcmlwdDsJCS8qIHBvaW50ZXIgdG8gc2NyaXB0IGxvY2F0aW9uICovCisJX191MzIJcFNjcmlwdDsJCS8qIHBoeXNpY2FsIG1lbSBhZGRyIG9mIHNjcmlwdCAqLworCisJZW51bSBOQ1JfNzAwX0hvc3RfU3RhdGUgc3RhdGU7IC8qIHByb3RlY3RlZCBieSBzdGF0ZSBsb2NrICovCisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCS8qIE5vdGU6IHBTY3JpcHQgY29udGFpbnMgdGhlIHNpbmdsZSBjb25zaXN0ZW50IGJsb2NrIG9mCisJICogbWVtb3J5LiAgQWxsIHRoZSBtc2dpbiwgbXNnb3V0IGFuZCBzdGF0dXMgYXJlIGFsbG9jYXRlZCBpbgorCSAqIHRoaXMgbWVtb3J5IHRvbyAoYXQgc2VwYXJhdGUgY2FjaGUgbGluZXMpLiAgVE9UQUxfTUVNX1NJWkUKKwkgKiByZXByZXNlbnRzIHRoZSB0b3RhbCBzaXplIG9mIHRoaXMgYXJlYSAqLworI2RlZmluZQlNU0dfQVJSQVlfU0laRQk4CisjZGVmaW5lCU1TR09VVF9PRkZTRVQJKEwxX0NBQ0hFX0FMSUdOKHNpemVvZihTQ1JJUFQpKSkKKwlfX3U4CSptc2dvdXQ7CisjZGVmaW5lIE1TR0lOX09GRlNFVAkoTVNHT1VUX09GRlNFVCArIEwxX0NBQ0hFX0FMSUdOKE1TR19BUlJBWV9TSVpFKSkKKwlfX3U4CSptc2dpbjsKKyNkZWZpbmUgU1RBVFVTX09GRlNFVAkoTVNHSU5fT0ZGU0VUICsgTDFfQ0FDSEVfQUxJR04oTVNHX0FSUkFZX1NJWkUpKQorCV9fdTgJKnN0YXR1czsKKyNkZWZpbmUgU0xPVFNfT0ZGU0VUCShTVEFUVVNfT0ZGU0VUICsgTDFfQ0FDSEVfQUxJR04oTVNHX0FSUkFZX1NJWkUpKQorCXN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdAkqc2xvdHM7CisjZGVmaW5lCVRPVEFMX01FTV9TSVpFCShTTE9UU19PRkZTRVQgKyBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90KSAqIE5DUl83MDBfQ09NTUFORF9TTE9UU19QRVJfSE9TVCkpCisJaW50CXNhdmVkX3Nsb3RfcG9zaXRpb247CisJaW50CWNvbW1hbmRfc2xvdF9jb3VudDsgLyogcHJvdGVjdGVkIGJ5IHN0YXRlIGxvY2sgKi8KKwlfX3U4CXRhZ19uZWdvdGlhdGVkOworCV9fdTgJcmV2OworCV9fdTgJcmVzZWxlY3Rpb25faWQ7CisJX191OAltaW5fcGVyaW9kOworCisJLyogRnJlZSBsaXN0LCBzaW5nbHkgbGlua2VkIGJ5IElUTF9mb3J3IGVsZW1lbnRzICovCisJc3RydWN0IE5DUl83MDBfY29tbWFuZF9zbG90ICpmcmVlX2xpc3Q7CisJLyogQ29tcGxldGlvbiBmb3Igd2FpdGVkIGZvciBvcHMsIGxpa2UgcmVzZXQsIGFib3J0IG9yCisJICogZGV2aWNlIHJlc2V0LgorCSAqCisJICogTk9URTogcmVsaWVzIG9uIHNpbmdsZSB0aHJlYWRpbmcgaW4gdGhlIGVycm9yIGhhbmRsZXIgdG8KKwkgKiBoYXZlIG9ubHkgb25lIG91dHN0YW5kaW5nIGF0IG9uY2UgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiAqZWhfY29tcGxldGU7Cit9OworCisvKgorICoJNTNDNzAwIFJlZ2lzdGVyIEludGVyZmFjZSAtIHRoZSBvZmZzZXQgZnJvbSB0aGUgU2VsZWN0ZWQgYmFzZQorICoJSS9PIGFkZHJlc3MgKi8KKyNpZmRlZiBDT05GSUdfNTNDNzAwX0xFX09OX0JFCisjZGVmaW5lIGJFCShob3N0ZGF0YS0+Zm9yY2VfbGVfb25fYmUgPyAwIDogMykKKyNkZWZpbmUJYlNXQVAJKGhvc3RkYXRhLT5mb3JjZV9sZV9vbl9iZSkKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorI2RlZmluZSBiRQkzCisjZGVmaW5lIGJTV0FQCTAKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBiRQkwCisjZGVmaW5lIGJTV0FQCTAKKyNlbHNlCisjZXJyb3IgIl9fQklHX0VORElBTiBvciBfX0xJVFRMRV9FTkRJQU4gbXVzdCBiZSBkZWZpbmVkLCBkaWQgeW91IGluY2x1ZGUgYnl0ZW9yZGVyLmg/IgorI2VuZGlmCisjZGVmaW5lIGJTX3RvX2NwdSh4KQkoYlNXQVAgPyBsZTMyX3RvX2NwdSh4KSA6ICh4KSkKKyNkZWZpbmUgYlNfdG9faG9zdCh4KQkoYlNXQVAgPyBjcHVfdG9fbGUzMih4KSA6ICh4KSkKKworLyogTk9URTogVGhlc2UgcmVnaXN0ZXJzIGFyZSBpbiB0aGUgTEUgcmVnaXN0ZXIgc3BhY2Ugb25seSwgdGhlIHJlcXVpcmVkIGJ5dGUKKyAqIHN3YXBwaW5nIGlzIGRvbmUgYnkgdGhlIE5DUl83MDBfe3JlYWR8d3JpdGV9W2JdIGZ1bmN0aW9ucyAqLworI2RlZmluZQlTQ05UTDBfUkVHCQkJMHgwMAorI2RlZmluZQkJRlVMTF9BUkJJVFJBVElPTgkweGMwCisjZGVmaW5lIAlQQVJJVFkJCQkweDA4CisjZGVmaW5lCQlFTkFCTEVfUEFSSVRZCQkweDA0CisjZGVmaW5lIAlBVVRPX0FUTgkJMHgwMgorI2RlZmluZQlTQ05UTDFfUkVHCQkJMHgwMQorI2RlZmluZSAJU0xPV19CVVMJCTB4ODAKKyNkZWZpbmUJCUVOQUJMRV9TRUxFQ1QJCTB4MjAKKyNkZWZpbmUJCUFTU0VSVF9SU1QJCTB4MDgKKyNkZWZpbmUJCUFTU0VSVF9FVkVOX1BBUklUWQkweDA0CisjZGVmaW5lCVNESURfUkVHCQkJMHgwMgorI2RlZmluZQlTSUVOX1JFRwkJCTB4MDMKKyNkZWZpbmUgCVBIQVNFX01NX0lOVAkJMHg4MAorI2RlZmluZSAJRlVOQ19DT01QX0lOVAkJMHg0MAorI2RlZmluZSAJU0VMX1RJTUVPVVRfSU5UCQkweDIwCisjZGVmaW5lIAlTRUxFQ1RfSU5UCQkweDEwCisjZGVmaW5lIAlHUk9TU19FUlJfSU5UCQkweDA4CisjZGVmaW5lIAlVWF9ESVNDX0lOVAkJMHgwNAorI2RlZmluZSAJUlNUX0lOVAkJCTB4MDIKKyNkZWZpbmUgCVBBUl9FUlJfSU5UCQkweDAxCisjZGVmaW5lCVNDSURfUkVHCQkJMHgwNAorI2RlZmluZSBTWEZFUl9SRUcJCQkweDA1CisjZGVmaW5lCQlBU1lOQ19PUEVSQVRJT04JCTB4MDAKKyNkZWZpbmUgU09ETF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lCVNPQ0xfUkVHCQkJMHgwNworI2RlZmluZQlTRkJSX1JFRwkJCTB4MDgKKyNkZWZpbmUJU0lETF9SRUcJCQkweDA5CisjZGVmaW5lCVNCRExfUkVHCQkJMHgwQQorI2RlZmluZQlTQkNMX1JFRwkJCTB4MEIKKy8qIHJlYWQgYml0cyAqLworI2RlZmluZQkJU0JDTF9JTwkJCTB4MDEKKy8qd3JpdGUgYml0cyAqLworI2RlZmluZQkJU1lOQ19ESVZfQVNfQVNZTkMJMHgwMAorI2RlZmluZQkJU1lOQ19ESVZfMV8wCQkweDAxCisjZGVmaW5lCQlTWU5DX0RJVl8xXzUJCTB4MDIKKyNkZWZpbmUJCVNZTkNfRElWXzJfMAkJMHgwMworI2RlZmluZQlEU1RBVF9SRUcJCQkweDBDCisjZGVmaW5lCQlJTEdMX0lOU1RfREVURUNURUQJMHgwMQorI2RlZmluZQkJV0FUQ0hfRE9HX0lOVEVSUlVQVAkweDAyCisjZGVmaW5lCQlTQ1JJUFRfSU5UX1JFQ0VJVkVECTB4MDQKKyNkZWZpbmUJCUFCT1JURUQJCQkweDEwCisjZGVmaW5lCVNTVEFUMF9SRUcJCQkweDBECisjZGVmaW5lCQlQQVJJVFlfRVJST1IJCTB4MDEKKyNkZWZpbmUJCVNDU0lfUkVTRVRfREVURUNURUQJMHgwMgorI2RlZmluZQkJVU5FWFBFQ1RFRF9ESVNDT05ORUNUCTB4MDQKKyNkZWZpbmUJCVNDU0lfR1JPU1NfRVJST1IJMHgwOAorI2RlZmluZQkJU0VMRUNURUQJCTB4MTAKKyNkZWZpbmUJCVNFTEVDVElPTl9USU1FT1VUCTB4MjAKKyNkZWZpbmUJCUZVTkNUSU9OX0NPTVBMRVRFCTB4NDAKKyNkZWZpbmUJCVBIQVNFX01JU01BVENIIAkJMHg4MAorI2RlZmluZQlTU1RBVDFfUkVHCQkJMHgwRQorI2RlZmluZQkJU0lETF9SRUdfRlVMTAkJMHg4MAorI2RlZmluZQkJU09EUl9SRUdfRlVMTAkJMHg0MAorI2RlZmluZQkJU09ETF9SRUdfRlVMTAkJMHgyMAorI2RlZmluZSBTU1RBVDJfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgQ1RFU1QwX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lCQlCVEJfVElNRVJfRElTQUJMRQkweDQwCisjZGVmaW5lIENURVNUMV9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBDVEVTVDJfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgQ1RFU1QzX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIENURVNUNF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSAgICAgICAgIERJU0FCTEVfRklGTyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBTTEJFICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICAgICAgICAgU0ZXUiAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgICAgICAgIEJZVEVfTEFORTAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgICAgICBCWVRFX0xBTkUxICAgICAgICAgICAgICAweDA1CisjZGVmaW5lICAgICAgICAgQllURV9MQU5FMiAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgICAgICAgIEJZVEVfTEFORTMgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgICAgICAgICBTQ1NJX1pNT0RFICAgICAgICAgICAgICAweDIwCisjZGVmaW5lICAgICAgICAgWk1PREUgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBDVEVTVDVfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgICAgICAgICBNQVNURVJfQ09OVFJPTCAgICAgICAgICAweDEwCisjZGVmaW5lICAgICAgICAgRE1BX0RJUkVDVElPTiAgICAgICAgICAgMHgwOAorI2RlZmluZSBDVEVTVDdfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUJCUJVUlNUX0RJU0FCTEUJCTB4ODAgLyogNzEwIG9ubHkgKi8KKyNkZWZpbmUJCVNFTF9USU1FT1VUX0RJU0FCTEUJMHgxMCAvKiA3MTAgb25seSAqLworI2RlZmluZSAgICAgICAgIERGUCAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBFVlAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lCQlESUZGCQkJMHgwMQorI2RlZmluZSBDVEVTVDZfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MUEKKyNkZWZpbmUJVEVNUF9SRUcJCQkweDFDCisjZGVmaW5lCURGSUZPX1JFRwkJCTB4MjAKKyNkZWZpbmUJCUZMVVNIX0RNQV9GSUZPCQkweDgwCisjZGVmaW5lCQlDTFJfRklGTwkJMHg0MAorI2RlZmluZQlJU1RBVF9SRUcJCQkweDIxCisjZGVmaW5lCQlBQk9SVF9PUEVSQVRJT04JCTB4ODAKKyNkZWZpbmUJCVNPRlRXQVJFX1JFU0VUXzcxMAkweDQwCisjZGVmaW5lCQlETUFfSU5UX1BFTkRJTkcJCTB4MDEKKyNkZWZpbmUJCVNDU0lfSU5UX1BFTkRJTkcJMHgwMgorI2RlZmluZQkJQ09OTkVDVEVECQkweDA4CisjZGVmaW5lIENURVNUOF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSAgICAgICAgIExBU1RfRElTX0VOQkwgICAgICAgICAgIDB4MDEKKyNkZWZpbmUJCVNIT1JURU5fRklMVEVSSU5HCTB4MDQKKyNkZWZpbmUJCUVOQUJMRV9BQ1RJVkVfTkVHQVRJT04JMHgxMAorI2RlZmluZQkJR0VORVJBVEVfUkVDRUlWRV9QQVJJVFkJMHgyMAorI2RlZmluZQkJQ0xSX0ZJRk9fNzEwCQkweDA0CisjZGVmaW5lCQlGTFVTSF9ETUFfRklGT183MTAJMHgwOAorI2RlZmluZSBDVEVTVDlfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MjMKKyNkZWZpbmUJREJDX1JFRwkJCQkweDI0CisjZGVmaW5lCURDTURfUkVHCQkJMHgyNworI2RlZmluZQlETkFEX1JFRwkJCTB4MjgKKyNkZWZpbmUJRElFTl9SRUcJCQkweDM5CisjZGVmaW5lCQlCVVNfRkFVTFQJCTB4MjAKKyNkZWZpbmUgCUFCT1JUX0lOVAkJMHgxMAorI2RlZmluZSAJSU5UX0lOU1RfSU5UCQkweDA0CisjZGVmaW5lIAlXRF9JTlQJCQkweDAyCisjZGVmaW5lIAlJTEdMX0lOU1RfSU5UCQkweDAxCisjZGVmaW5lCURDTlRMX1JFRwkJCTB4M0IKKyNkZWZpbmUJCVNPRlRXQVJFX1JFU0VUCQkweDAxCisjZGVmaW5lCQlDT01QQVRfNzAwX01PREUJCTB4MDEKKyNkZWZpbmUgCVNDUlBUU18xNkJJVFMJCTB4MjAKKyNkZWZpbmUJCUFTWU5DX0RJVl8yXzAJCTB4MDAKKyNkZWZpbmUJCUFTWU5DX0RJVl8xXzUJCTB4NDAKKyNkZWZpbmUJCUFTWU5DX0RJVl8xXzAJCTB4ODAKKyNkZWZpbmUJCUFTWU5DX0RJVl8zXzAJCTB4YzAKKyNkZWZpbmUgRE1PREVfNzEwX1JFRwkJCTB4MzgKKyNkZWZpbmUJRE1PREVfNzAwX1JFRwkJCTB4MzQKKyNkZWZpbmUJCUJVUlNUX0xFTkdUSF8xCQkweDAwCisjZGVmaW5lCQlCVVJTVF9MRU5HVEhfMgkJMHg0MAorI2RlZmluZQkJQlVSU1RfTEVOR1RIXzQJCTB4ODAKKyNkZWZpbmUJCUJVUlNUX0xFTkdUSF84CQkweEMwCisjZGVmaW5lCQlETU9ERV9GQzEJCTB4MTAKKyNkZWZpbmUJCURNT0RFX0ZDMgkJMHgyMAorI2RlZmluZSAJQlcxNgkJCTMyIAorI2RlZmluZSAJTU9ERV8yODYJCTE2CisjZGVmaW5lIAlJT19YRkVSCQkJOAorI2RlZmluZSAJRklYRURfQUREUgkJNAorCisjZGVmaW5lIERTUF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBEU1BTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAKKworLyogUGFyYW1ldGVycyB0byBiZWdpbiBTRFRSIG5lZ290aWF0aW9ucy4gIEVtcGlyaWNhbGx5LCBJIGZpbmQgdGhhdAorICogdGhlIDUzYzcwMC02NiBjYW5ub3QgaGFuZGxlIGFuIG9mZnNldCA+OCwgc28gZG9uJ3QgY2hhbmdlIHRoaXMgICovCisjZGVmaW5lIE5DUl83MDBfTUFYX09GRlNFVAk4CisvKiBXYXMgaG9waW5nIHRoZSBtYXggb2Zmc2V0IHdvdWxkIGJlIGdyZWF0ZXIgZm9yIHRoZSA3MTAsIGJ1dAorICogZW1waXJpY2FsbHkgaXQgc2VlbXMgdG8gYmUgOCBhbHNvICovCisjZGVmaW5lIE5DUl83MTBfTUFYX09GRlNFVAk4CisjZGVmaW5lIE5DUl83MDBfTUlOX1hGRVJQCTEKKyNkZWZpbmUgTkNSXzcxMF9NSU5fWEZFUlAJMAorI2RlZmluZSBOQ1JfNzAwX01JTl9QRVJJT0QJMjUgLyogZm9yIFNEVFIgbWVzc2FnZSwgMTAwbnMgKi8KKworI2RlZmluZSBzY3JpcHRfcGF0Y2hfMzIoc2NyaXB0LCBzeW1ib2wsIHZhbHVlKSBcCit7IFwKKwlpbnQgaTsgXAorCWZvcihpPTA7IGk8IChzaXplb2YoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mKF9fdTMyKSk7IGkrKykgeyBcCisJCV9fdTMyIHZhbCA9IGJTX3RvX2NwdSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0pICsgdmFsdWU7IFwKKwkJKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dID0gYlNfdG9faG9zdCh2YWwpOyBcCisJCWRtYV9jYWNoZV9zeW5jKCYoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0sIDQsIERNQV9UT19ERVZJQ0UpOyBcCisJCURFQlVHKCgiIHNjcmlwdCwgcGF0Y2hpbmcgJXMgYXQgJWQgdG8gMHglbHhcbiIsIFwKKwkJICAgICAgICNzeW1ib2wsIEFfIyNzeW1ib2wjI191c2VkW2ldLCAodmFsdWUpKSk7IFwKKwl9IFwKK30KKworI2RlZmluZSBzY3JpcHRfcGF0Y2hfMzJfYWJzKHNjcmlwdCwgc3ltYm9sLCB2YWx1ZSkgXAoreyBcCisJaW50IGk7IFwKKwlmb3IoaT0wOyBpPCAoc2l6ZW9mKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZihfX3UzMikpOyBpKyspIHsgXAorCQkoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0gPSBiU190b19ob3N0KHZhbHVlKTsgXAorCQlkbWFfY2FjaGVfc3luYygmKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dLCA0LCBETUFfVE9fREVWSUNFKTsgXAorCQlERUJVRygoIiBzY3JpcHQsIHBhdGNoaW5nICVzIGF0ICVkIHRvIDB4JWx4XG4iLCBcCisJCSAgICAgICAjc3ltYm9sLCBBXyMjc3ltYm9sIyNfdXNlZFtpXSwgKHZhbHVlKSkpOyBcCisJfSBcCit9CisKKy8qIFVzZWQgZm9yIHBhdGNoaW5nIHRoZSBTQ1NJIElEIGluIHRoZSBTRUxFQ1QgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgc2NyaXB0X3BhdGNoX0lEKHNjcmlwdCwgc3ltYm9sLCB2YWx1ZSkgXAoreyBcCisJaW50IGk7IFwKKwlmb3IoaT0wOyBpPCAoc2l6ZW9mKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZihfX3UzMikpOyBpKyspIHsgXAorCQlfX3UzMiB2YWwgPSBiU190b19jcHUoKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dKTsgXAorCQl2YWwgJj0gMHhmZjAwZmZmZjsgXAorCQl2YWwgfD0gKCh2YWx1ZSkgJiAweGZmKSA8PCAxNjsgXAorCQkoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0gPSBiU190b19ob3N0KHZhbCk7IFwKKwkJZG1hX2NhY2hlX3N5bmMoJihzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldXSwgNCwgRE1BX1RPX0RFVklDRSk7IFwKKwkJREVCVUcoKCIgc2NyaXB0LCBwYXRjaGluZyBJRCBmaWVsZCAlcyBhdCAlZCB0byAweCV4XG4iLCBcCisJCSAgICAgICAjc3ltYm9sLCBBXyMjc3ltYm9sIyNfdXNlZFtpXSwgdmFsKSk7IFwKKwl9IFwKK30KKworI2RlZmluZSBzY3JpcHRfcGF0Y2hfMTYoc2NyaXB0LCBzeW1ib2wsIHZhbHVlKSBcCit7IFwKKwlpbnQgaTsgXAorCWZvcihpPTA7IGk8IChzaXplb2YoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mKF9fdTMyKSk7IGkrKykgeyBcCisJCV9fdTMyIHZhbCA9IGJTX3RvX2NwdSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0pOyBcCisJCXZhbCAmPSAweGZmZmYwMDAwOyBcCisJCXZhbCB8PSAoKHZhbHVlKSAmIDB4ZmZmZik7IFwKKwkJKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dID0gYlNfdG9faG9zdCh2YWwpOyBcCisJCWRtYV9jYWNoZV9zeW5jKCYoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0sIDQsIERNQV9UT19ERVZJQ0UpOyBcCisJCURFQlVHKCgiIHNjcmlwdCwgcGF0Y2hpbmcgc2hvcnQgZmllbGQgJXMgYXQgJWQgdG8gMHgleFxuIiwgXAorCQkgICAgICAgI3N5bWJvbCwgQV8jI3N5bWJvbCMjX3VzZWRbaV0sIHZhbCkpOyBcCisJfSBcCit9CisKKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX21lbV9yZWFkYihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCXJldHVybiByZWFkYihob3N0LT5iYXNlICsgKHJlZ15iRSkpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyCitOQ1JfNzAwX21lbV9yZWFkbChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJX191MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChob3N0LT5iYXNlICsgcmVnKTsKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworI2lmIDEKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlZ2lzdGVyICovCisJaWYoKHJlZyAmIDB4MykgIT0gMCkKKwkJQlVHKCk7CisjZW5kaWYKKworCXJldHVybiBiU190b19jcHUodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK05DUl83MDBfbWVtX3dyaXRlYihfX3U4IHZhbHVlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCXdyaXRlYih2YWx1ZSwgaG9zdC0+YmFzZSArIChyZWdeYkUpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX21lbV93cml0ZWwoX191MzIgdmFsdWUsIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIF9fdTMyIHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisjaWYgMQorCS8qIHNhbml0eSBjaGVjayB0aGUgcmVnaXN0ZXIgKi8KKwlpZigocmVnICYgMHgzKSAhPSAwKQorCQlCVUcoKTsKKyNlbmRpZgorCisJX19yYXdfd3JpdGVsKGJTX3RvX2hvc3QodmFsdWUpLCBob3N0LT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBfX3U4CitOQ1JfNzAwX2lvX3JlYWRiKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIF9fdTMyIHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisJcmV0dXJuIGluYihob3N0LT5iYXNlICsgKHJlZ15iRSkpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyCitOQ1JfNzAwX2lvX3JlYWRsKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIF9fdTMyIHJlZykKK3sKKwlfX3UzMiB2YWx1ZSA9IGlubChob3N0LT5iYXNlICsgcmVnKTsKKwljb25zdCBzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisJCT0gKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqKWhvc3QtPmhvc3RkYXRhWzBdOworCisjaWYgMQorCS8qIHNhbml0eSBjaGVjayB0aGUgcmVnaXN0ZXIgKi8KKwlpZigocmVnICYgMHgzKSAhPSAwKQorCQlCVUcoKTsKKyNlbmRpZgorCisJcmV0dXJuIGJTX3RvX2NwdSh2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9pb193cml0ZWIoX191OCB2YWx1ZSwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgcmVnKQoreworCWNvbnN0IHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKwkJPSAoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisKKwlvdXRiKHZhbHVlLCBob3N0LT5iYXNlICsgKHJlZ15iRSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK05DUl83MDBfaW9fd3JpdGVsKF9fdTMyIHZhbHVlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworI2lmIDEKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlZ2lzdGVyICovCisJaWYoKHJlZyAmIDB4MykgIT0gMCkKKwkJQlVHKCk7CisjZW5kaWYKKworCW91dGwoYlNfdG9faG9zdCh2YWx1ZSksIGhvc3QtPmJhc2UgKyByZWcpOworfQorCisjaWZkZWYgQ09ORklHXzUzQzcwMF9CT1RIX01BUFBFRAorCitzdGF0aWMgaW5saW5lIF9fdTgKK05DUl83MDBfcmVhZGIoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgcmVnKQoreworCV9fdTggdmFsOworCisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWlmKGhvc3RkYXRhLT5tZW1fbWFwcGVkKQorCQl2YWwgPSBOQ1JfNzAwX21lbV9yZWFkYihob3N0LCByZWcpOworCWVsc2UKKwkJdmFsID0gTkNSXzcwMF9pb19yZWFkYihob3N0LCByZWcpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSBfX3UzMgorTkNSXzcwMF9yZWFkbChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJX191MzIgdmFsOworCisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWlmKGhvc3RkYXRhLT5tZW1fbWFwcGVkKQorCQl2YWwgPSBOQ1JfNzAwX21lbV9yZWFkbChob3N0LCByZWcpOworCWVsc2UKKwkJdmFsID0gTkNSXzcwMF9pb19yZWFkbChob3N0LCByZWcpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3dyaXRlYihfX3U4IHZhbHVlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBfX3UzMiByZWcpCit7CisJY29uc3Qgc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCQk9IChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCWlmKGhvc3RkYXRhLT5tZW1fbWFwcGVkKQorCQlOQ1JfNzAwX21lbV93cml0ZWIodmFsdWUsIGhvc3QsIHJlZyk7CisJZWxzZQorCQlOQ1JfNzAwX2lvX3dyaXRlYih2YWx1ZSwgaG9zdCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3dyaXRlbChfX3UzMiB2YWx1ZSwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgX191MzIgcmVnKQoreworCWNvbnN0IHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKwkJPSAoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisKKwlpZihob3N0ZGF0YS0+bWVtX21hcHBlZCkKKwkJTkNSXzcwMF9tZW1fd3JpdGVsKHZhbHVlLCBob3N0LCByZWcpOworCWVsc2UKKwkJTkNSXzcwMF9pb193cml0ZWwodmFsdWUsIGhvc3QsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorTkNSXzcwMF9zZXRfbWVtX21hcHBlZChzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhKQoreworCWhvc3RkYXRhLT5tZW1fbWFwcGVkID0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitOQ1JfNzAwX3NldF9pb19tYXBwZWQoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSkKK3sKKwlob3N0ZGF0YS0+bWVtX21hcHBlZCA9IDA7Cit9CisKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNTNDNzAwX0lPX01BUFBFRCkKKworI2RlZmluZSBOQ1JfNzAwX3JlYWRiIE5DUl83MDBfaW9fcmVhZGIKKyNkZWZpbmUgTkNSXzcwMF9yZWFkbCBOQ1JfNzAwX2lvX3JlYWRsCisjZGVmaW5lIE5DUl83MDBfd3JpdGViIE5DUl83MDBfaW9fd3JpdGViCisjZGVmaW5lIE5DUl83MDBfd3JpdGVsIE5DUl83MDBfaW9fd3JpdGVsCisKKyNkZWZpbmUgTkNSXzcwMF9zZXRfaW9fbWFwcGVkKHgpCisjZGVmaW5lIE5DUl83MDBfc2V0X21lbV9tYXBwZWQoeCkJZXJyb3IgSS9PIG1hcHBlZCBvbmx5CisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzUzQzcwMF9NRU1fTUFQUEVEKQorCisjZGVmaW5lIE5DUl83MDBfcmVhZGIgTkNSXzcwMF9tZW1fcmVhZGIKKyNkZWZpbmUgTkNSXzcwMF9yZWFkbCBOQ1JfNzAwX21lbV9yZWFkbAorI2RlZmluZSBOQ1JfNzAwX3dyaXRlYiBOQ1JfNzAwX21lbV93cml0ZWIKKyNkZWZpbmUgTkNSXzcwMF93cml0ZWwgTkNSXzcwMF9tZW1fd3JpdGVsCisKKyNkZWZpbmUgTkNSXzcwMF9zZXRfaW9fbWFwcGVkKHgpCWVycm9yIE1FTSBtYXBwZWQgb25seQorI2RlZmluZSBOQ1JfNzAwX3NldF9tZW1fbWFwcGVkKHgpCisKKyNlbHNlCisjZXJyb3IgbmVpdGhlciBDT05GSUdfNTNDNzAwX01FTV9NQVBQRUQgbm9yIENPTkZJR181M0M3MDBfSU9fTUFQUEVEIGlzIHNldAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzUzYzcwMC5zY3IgYi9kcml2ZXJzL3Njc2kvNTNjNzAwLnNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY0YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzcwMC5zY3IKQEAgLTAsMCArMSw0MTEgQEAKKzsgU2NyaXB0IGZvciB0aGUgTkNSIChvciBzeW1iaW9zKSA1M2M3MDAgYW5kIDUzYzcwMC02NiBjaGlwCis7Cis7IENvcHlyaWdodCAoQykgMjAwMSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OyAgCis7OyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7ICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7Cis7OyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKzs7ICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOzsgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorOzsKKzs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gYmUgbW9kaWZpZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGNvbW1hbmQgaW4KKzsgb3BlcmF0aW9uLiAgVGhlIHBhcnRpY3VsYXIgdmFyaWFibGVzIHBlcnRhaW5pbmcgdG8gdGhlIGNvbW1hbmRzIGFyZToKKzsKK0FCU09MVVRFCURldmljZV9JRCA9IDAJCTsgSUQgb2YgdGFyZ2V0IGZvciBjb21tYW5kCitBQlNPTFVURQlNZXNzYWdlQ291bnQgPSAwCTsgTnVtYmVyIG9mIGJ5dGVzIGluIG1lc3NhZ2UKK0FCU09MVVRFCU1lc3NhZ2VMb2NhdGlvbiA9IDAJOyBBZGRyIG9mIG1lc3NhZ2UKK0FCU09MVVRFCUNvbW1hbmRDb3VudCA9IDAJOyBOdW1iZXIgb2YgYnl0ZXMgaW4gY29tbWFuZAorQUJTT0xVVEUJQ29tbWFuZEFkZHJlc3MgPSAwCTsgQWRkciBvZiBDb21tYW5kCitBQlNPTFVURQlTdGF0dXNBZGRyZXNzID0gMAk7IEFkZHIgdG8gcmVjZWl2ZSBzdGF0dXMgcmV0dXJuCitBQlNPTFVURQlSZWNlaXZlTXNnQWRkcmVzcyA9IDAJOyBBZGRyIHRvIHJlY2VpdmUgbXNnCis7Cis7IFRoaXMgaXMgdGhlIG1hZ2ljIGNvbXBvbmVudCBmb3IgaGFuZGxpbmcgc2NhdHRlci1nYXRoZXIuICBFYWNoIG9mIHRoZQorOyBTRyBjb21wb25lbnRzIGlzIHByZWNlZWRlZCBieSBhIHNjcmlwdCBmcmFnbWVudCB3aGljaCBtb3ZlcyB0aGUKKzsgbmVjZXNzYXJ5IGFtb3VudCBvZiBkYXRhIGFuZCBqdW1wcyB0byB0aGUgbmV4dCBTRyBzZWdtZW50LiAgVGhlIGZpbmFsCis7IFNHIHNlZ21lbnQganVtcHMgYmFjayB0byAuICBIb3dldmVyLCB0aGlzIGFkZHJlc3MgaXMgdGhlIGZpcnN0IFNHIHNjcmlwdAorOyBzZWdtZW50LgorOworQUJTT0xVVEUJU0dTY3JpcHRTdGFydEFkZHJlc3MgPSAwCisKKzsgVGhlIGZvbGxvd2luZyByZXByZXNlbnQgc3RhdHVzIGludGVycnVwdHMgd2UgdXNlIDMgaGV4IGRpZ2l0cyBmb3IKKzsgdGhpczogMHhQUlMgd2hlcmUgCisKKzsgUDoKK0FCU09MVVRFCUFGVEVSX1NFTEVDVElPTiAJPSAweDEwMAorQUJTT0xVVEUJQkVGT1JFX0NNRCAJCT0gMHgyMDAKK0FCU09MVVRFCUFGVEVSX0NNRCAJCT0gMHgzMDAKK0FCU09MVVRFCUFGVEVSX1NUQVRVUyAJCT0gMHg0MDAKK0FCU09MVVRFCUFGVEVSX0RBVEFfSU4JCT0gMHg1MDAKK0FCU09MVVRFCUFGVEVSX0RBVEFfT1VUCQk9IDB4NjAwCitBQlNPTFVURQlEVVJJTkdfREFUQV9JTgkJPSAweDcwMAorCis7IFI6CitBQlNPTFVURQlOT1RfTVNHX09VVCAJCT0gMHgxMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9QSEFTRSAJPSAweDIwCitBQlNPTFVURQlOT1RfTVNHX0lOIAkJPSAweDMwCitBQlNPTFVURQlVTkVYUEVDVEVEX01TRwkJPSAweDQwCitBQlNPTFVURQlNU0dfSU4JCQk9IDB4NTAKK0FCU09MVVRFCVNEVFJfTVNHX1IJCT0gMHg2MAorQUJTT0xVVEUJUkVKRUNUX01TR19SCQk9IDB4NzAKK0FCU09MVVRFCURJU0NPTk5FQ1QJCT0gMHg4MAorQUJTT0xVVEUJTVNHX09VVAkJCT0gMHg5MAorQUJTT0xVVEUJV0RUUl9NU0dfUgkJPSAweEEwCisKKzsgUzoKK0FCU09MVVRFCUdPT0RfU1RBVFVTIAkJPSAweDEKKworOyBDb21iaW5hdGlvbnMsIHNpbmNlIHRoZSBzY3JpcHQgYXNzZW1ibGVyIGNhbid0IHByb2Nlc3MgfAorQUJTT0xVVEUJTk9UX01TR19PVVRfQUZURVJfU0VMRUNUSU9OID0gMHgxMTAKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRCA9IDB4MjIwCitBQlNPTFVURQlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0NNRCA9IDB4MzIwCitBQlNPTFVURQlOT1RfTVNHX0lOX0FGVEVSX1NUQVRVUyA9IDB4NDMwCitBQlNPTFVURQlHT09EX1NUQVRVU19BRlRFUl9TVEFUVVMgPSAweDQwMQorQUJTT0xVVEUJVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9EQVRBX0lOID0gMHg1MjAKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9PVVQgPSAweDYyMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9NU0dfQkVGT1JFX0NNRCA9IDB4MjQwCitBQlNPTFVURQlNU0dfSU5fQkVGT1JFX0NNRCA9IDB4MjUwCitBQlNPTFVURQlNU0dfSU5fQUZURVJfQ01EID0gMHgzNTAKK0FCU09MVVRFCVNEVFJfTVNHX0JFRk9SRV9DTUQgPSAweDI2MAorQUJTT0xVVEUJUkVKRUNUX01TR19CRUZPUkVfQ01EID0gMHgyNzAKK0FCU09MVVRFCURJU0NPTk5FQ1RfQUZURVJfQ01EID0gMHgzODAKK0FCU09MVVRFCVNEVFJfTVNHX0FGVEVSX0NNRCA9IDB4MzYwCitBQlNPTFVURQlXRFRSX01TR19BRlRFUl9DTUQgPSAweDNBMAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX1NUQVRVUyA9IDB4NDQwCitBQlNPTFVURQlESVNDT05ORUNUX0FGVEVSX0RBVEEgPSAweDU4MAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX0RBVEFfSU4gPSAweDU1MAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX0RBVEFfT1VUID0gMHg2NTAKK0FCU09MVVRFCU1TR19PVVRfQUZURVJfREFUQV9JTiA9IDB4NTkwCitBQlNPTFVURQlEQVRBX0lOX0FGVEVSX0RBVEFfSU4gPSAweDVhMAorQUJTT0xVVEUJTVNHX0lOX0RVUklOR19EQVRBX0lOID0gMHg3NTAKK0FCU09MVVRFCURJU0NPTk5FQ1RfRFVSSU5HX0RBVEEgPSAweDc4MAorCis7Cis7IE90aGVyIGludGVycnVwdCBjb25kaXRpb25zCis7IAorQUJTT0xVVEUJUkVTRUxFQ1RFRF9EVVJJTkdfU0VMRUNUSU9OID0gMHgxMDAwCitBQlNPTFVURQlDT01QTEVURURfU0VMRUNUSU9OX0FTX1RBUkdFVCA9IDB4MTAwMQorQUJTT0xVVEUJUkVTRUxFQ1RJT05fSURFTlRJRklFRCA9IDB4MTAwMworOworOyBGYXRhbCBpbnRlcnJ1cHQgY29uZGl0aW9ucy4gIElmIHlvdSBhZGQgdG8gdGhpcywgYWxzbyBhZGQgdG8gdGhlCis7IGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgbWVzc2FnZXMKKzsKK0FCU09MVVRFCUZBVEFMID0gMHgyMDAwCitBQlNPTFVURQlGQVRBTF9VTkVYUEVDVEVEX1JFU0VMRUNUSU9OX01TRyA9IDB4MjAwMAorQUJTT0xVVEUJRkFUQUxfU0VORF9NU0cgPSAweDIwMDEKK0FCU09MVVRFCUZBVEFMX05PVF9NU0dfSU5fQUZURVJfU0VMRUNUSU9OID0gMHgyMDAyCitBQlNPTFVURQlGQVRBTF9JTExFR0FMX01TR19MRU5HVEggPSAweDIwMDMKKworQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUCT0gMHgzMDAwCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQxID0gMHgzMDAxCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQyID0gMHgzMDAyCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQzID0gMHgzMDAzCitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQ0ID0gMHgzMDA0CitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQ1ID0gMHgzMDA1CitBQlNPTFVURQlERUJVR19JTlRFUlJVUFQ2ID0gMHgzMDA2CisKKworOworOyBTQ1NJIE1lc3NhZ2VzIHdlIGludGVycHJldCBpbiB0aGUgc2NyaXB0Cis7CitBQlNPTFVURQlDT01NQU5EX0NPTVBMRVRFX01TRwk9IDB4MDAKK0FCU09MVVRFCUVYVEVOREVEX01TRwkJPSAweDAxCitBQlNPTFVURQlTRFRSX01TRwkJPSAweDAxCitBQlNPTFVURQlTQVZFX0RBVEFfUFRSU19NU0cJPSAweDAyCitBQlNPTFVURQlSRVNUT1JFX0RBVEFfUFRSU19NU0cJPSAweDAzCitBQlNPTFVURQlXRFRSX01TRwkJPSAweDAzCitBQlNPTFVURQlESVNDT05ORUNUX01TRwkJPSAweDA0CitBQlNPTFVURQlSRUpFQ1RfTVNHCQk9IDB4MDcKK0FCU09MVVRFCVBBUklUWV9FUlJPUl9NU0cJPSAweDA5CitBQlNPTFVURQlTSU1QTEVfVEFHX01TRwkJPSAweDIwCitBQlNPTFVURQlJREVOVElGWV9NU0cJCT0gMHg4MAorQUJTT0xVVEUJSURFTlRJRllfTVNHX01BU0sJPSAweDdGCitBQlNPTFVURQlUV09fQllURV9NU0cJCT0gMHgyMAorQUJTT0xVVEUJVFdPX0JZVEVfTVNHX01BU0sJPSAweDBGCisKKzsgVGhpcyBpcyB3aGVyZSB0aGUgc2NyaXB0IGJlZ2lucworCitFTlRSWQlTdGFydFVwCisKK1N0YXJ0VXA6CisJU0VMRUNUCUFUTiBEZXZpY2VfSUQsIFJlc2VsZWN0CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisJSlVNUAlTZW5kSWRlbnRpZnlNc2csIElGIE1TR19PVVQKKwlJTlQJTk9UX01TR19PVVRfQUZURVJfU0VMRUNUSU9OCisKK1Jlc2VsZWN0OgorCVdBSVQJUkVTRUxFQ1QgU2VsZWN0ZWRBc1RhcmdldAorCUlOVAlSRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04sIFdIRU4gTVNHX0lOCisJSU5UCUZBVEFMX05PVF9NU0dfSU5fQUZURVJfU0VMRUNUSU9OCisKKwlFTlRSWQlHZXRSZXNlbGVjdGlvbkRhdGEKK0dldFJlc2VsZWN0aW9uRGF0YToKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCUlOVAlSRVNFTEVDVElPTl9JREVOVElGSUVECisKKwlFTlRSWQlHZXRSZXNlbGVjdGlvbldpdGhUYWcKK0dldFJlc2VsZWN0aW9uV2l0aFRhZzoKKwlNT1ZFCTMsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCUlOVAlSRVNFTEVDVElPTl9JREVOVElGSUVECisJCisJRU5UUlkJU2VsZWN0ZWRBc1RhcmdldAorU2VsZWN0ZWRBc1RhcmdldDoKKzsgQmFzaWNhbGx5IHRlbGwgdGhlIHNlbGVjdGluZyBkZXZpY2UgdGhhdCB0aGVyZSdzIG5vdGhpbmcgaGVyZQorCVNFVAlUQVJHRVQKKwlESVNDT05ORUNUCisJQ0xFQVIJVEFSR0VUCisJSU5UCUNPTVBMRVRFRF9TRUxFQ1RJT05fQVNfVEFSR0VUCis7Cis7IFRoZXNlIGFyZSB0aGUgbWVzc2FnaW5nIGVudHJpZXMKKzsKKzsgU2VuZCBhIG1lc3NhZ2UuICBNZXNzYWdlIGNvdW50IHNob3VsZCBiZSBjb3JyZWN0bHkgcGF0Y2hlZAorCUVOVFJZCVNlbmRNZXNzYWdlCitTZW5kTWVzc2FnZToKKwlNT1ZFCU1lc3NhZ2VDb3VudCwgTWVzc2FnZUxvY2F0aW9uLCBXSEVOIE1TR19PVVQKK1Jlc3VtZVNlbmRNZXNzYWdlOgorCVJFVFVSTiwJV0hFTiBOT1QgTVNHX09VVAorCUlOVAlGQVRBTF9TRU5EX01TRworCisJRU5UUlkJU2VuZE1lc3NhZ2VQaGFzZU1pc21hdGNoCitTZW5kTWVzc2FnZVBoYXNlTWlzbWF0Y2g6CisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVTZW5kTWVzc2FnZQorOworOyBSZWNlaXZlIGEgbWVzc2FnZS4gIE5lZWQgdG8gaWRlbnRpZnkgdGhlIG1lc3NhZ2UgdG8KKzsgcmVjZWl2ZSBpdCBjb3JyZWN0bHkKKwlFTlRSWQlSZWNlaXZlTWVzc2FnZQorUmVjZWl2ZU1lc3NhZ2U6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKzsKKzsgVXNlIHRoaXMgZW50cnkgaWYgd2UndmUganVzdCB0cmllZCB0byBsb29rIGF0IHRoZSBmaXJzdCBieXRlCis7IG9mIHRoZSBtZXNzYWdlIGFuZCB3YW50IHRvIHByb2Nlc3MgaXQgZnVydGhlcgorUHJvY2Vzc1JlY2VpdmVNZXNzYWdlOgorCUpVTVAJUmVjZWl2ZUV4dGVuZGVkTWVzc2FnZSwgSUYgRVhURU5ERURfTVNHCisJUkVUVVJOLAlJRiBOT1QgVFdPX0JZVEVfTVNHLCBBTkQgTUFTSyBUV09fQllURV9NU0dfTUFTSworCUNMRUFSCUFDSworCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAxLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZUV4dGVuZGVkTWVzc2FnZToKKwlDTEVBUglBQ0sKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzICsgMSwgV0hFTiBNU0dfSU4KKwlKVU1QCVJlY2VpdmUxQnl0ZSwgSUYgMHgwMQorCUpVTVAJUmVjZWl2ZTJCeXRlLCBJRiAweDAyCisJSlVNUAlSZWNlaXZlM0J5dGUsIElGIDB4MDMKKwlKVU1QCVJlY2VpdmU0Qnl0ZSwgSUYgMHgwNAorCUpVTVAJUmVjZWl2ZTVCeXRlLCBJRiAweDA1CisJSU5UCUZBVEFMX0lMTEVHQUxfTVNHX0xFTkdUSAorUmVjZWl2ZTFCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTJCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJMiwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTNCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJMywgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTRCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJNCwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorUmVjZWl2ZTVCeXRlOgorCUNMRUFSCUFDSworCU1PVkUJNSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCVJFVFVSTgorOworOyBDb21lIGhlcmUgZnJvbSB0aGUgbWVzc2FnZSBwcm9jZXNzb3IgdG8gaWdub3JlIHRoZSBtZXNzYWdlCis7CisJRU5UUlkJSWdub3JlTWVzc2FnZQorSWdub3JlTWVzc2FnZToKKwlDTEVBUglBQ0sKKwlSRVRVUk4KKzsKKzsgQ29tZSBoZXJlIHRvIHNlbmQgYSByZXBseSB0byBhIG1lc3NhZ2UKKzsKKwlFTlRSWQlTZW5kTWVzc2FnZVdpdGhBVE4KK1NlbmRNZXNzYWdlV2l0aEFUTjoKKwlTRVQJQVROCisJQ0xFQVIJQUNLCisJSlVNUAlTZW5kTWVzc2FnZQorCitTZW5kSWRlbnRpZnlNc2c6CisJQ0FMTAlTZW5kTWVzc2FnZQorCUNMRUFSCUFUTgorCitJZ25vcmVNc2dCZWZvcmVDb21tYW5kOgorCUNMRUFSCUFDSworCUVOVFJZCVNlbmRDb21tYW5kCitTZW5kQ29tbWFuZDoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKwlKVU1QCU1zZ0luQmVmb3JlQ29tbWFuZCwgSUYgTVNHX0lOCisJSU5UCVVORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRCwgSUYgTk9UIENNRAorCU1PVkUJQ29tbWFuZENvdW50LCBDb21tYW5kQWRkcmVzcywgV0hFTiBDTUQKK1Jlc3VtZVNlbmRDb21tYW5kOgorCUpVTVAJRmluaXNoLCBXSEVOIFNUQVRVUworCUpVTVAJTXNnSW5BZnRlckNtZCwgSUYgTVNHX0lOCisJSlVNUAlEYXRhSW4sIElGIERBVEFfSU4KKwlKVU1QCURhdGFPdXQsIElGIERBVEFfT1VUCisJSU5UCVVORVhQRUNURURfUEhBU0VfQUZURVJfQ01ECisKK0lnbm9yZU1zZ0R1cmluZ0RhdGE6CisJQ0xFQVIJQUNLCisJOyBmYWxsIHRocm91Z2ggdG8gTXNnSW5EdXJpbmdEYXRhCisKK0VudHJ5IE1zZ0luRHVyaW5nRGF0YQorTXNnSW5EdXJpbmdEYXRhOgorOworOyBDb3VsZCBiZSB3ZSBoYXZlIG5vdGhpbmcgbW9yZSB0byB0cmFuc2ZlcgorOworCUpVTVAJRmluaXNoLCBXSEVOIFNUQVRVUworCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisJSlVNUAlEaXNjb25uZWN0RHVyaW5nRGF0YUluLCBJRiBESVNDT05ORUNUX01TRworCUpVTVAJSWdub3JlTXNnRHVyaW5nRGF0YSwgSUYgU0FWRV9EQVRBX1BUUlNfTVNHCisJSlVNUAlJZ25vcmVNc2dEdXJpbmdEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKwlJTlQJTVNHX0lOX0RVUklOR19EQVRBX0lOCisKK01zZ0luQWZ0ZXJDbWQ6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKwlKVU1QCURpc2Nvbm5lY3RBZnRlckNtZCwgSUYgRElTQ09OTkVDVF9NU0cKKwlKVU1QCUlnbm9yZU1zZ0luQWZ0ZXJDbWQsIElGIFNBVkVfREFUQV9QVFJTX01TRworCUpVTVAJSWdub3JlTXNnSW5BZnRlckNtZCwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKwlJTlQJTVNHX0lOX0FGVEVSX0NNRAorCUNMRUFSCUFDSworCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworSWdub3JlTXNnSW5BZnRlckNtZDoKKwlDTEVBUglBQ0sKKwlKVU1QCVJlc3VtZVNlbmRDb21tYW5kCisKK0Rpc2Nvbm5lY3RBZnRlckNtZDoKKwlDTEVBUglBQ0sKKwlXQUlUCURJU0NPTk5FQ1QKKwlFTlRSWQlEaXNjb25uZWN0MQorRGlzY29ubmVjdDE6CisJSU5UCURJU0NPTk5FQ1RfQUZURVJfQ01ECisJRU5UUlkJRGlzY29ubmVjdDIKK0Rpc2Nvbm5lY3QyOgorOyBXZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVTZW5kQ29tbWFuZAorCitNc2dJbkJlZm9yZUNvbW1hbmQ6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKwlKVU1QCUlnbm9yZU1zZ0JlZm9yZUNvbW1hbmQsIElGIFNBVkVfREFUQV9QVFJTX01TRworCUpVTVAJSWdub3JlTXNnQmVmb3JlQ29tbWFuZCwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKwlJTlQJTVNHX0lOX0JFRk9SRV9DTUQKKwlDTEVBUglBQ0sKKwlKVU1QCVNlbmRDb21tYW5kCisKK0RhdGFJbjoKKwlDQUxMCVNHU2NyaXB0U3RhcnRBZGRyZXNzCitSZXN1bWVEYXRhSW46CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisJSlVNUAlNc2dJbkFmdGVyRGF0YUluLCBJRiBNU0dfSU4KKwlKVU1QCURhdGFJbkFmdGVyRGF0YUluLCBpZiBEQVRBX0lOCisJSU5UCU1TR19PVVRfQUZURVJfREFUQV9JTiwgaWYgTVNHX09VVAorCUlOVAlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfSU4KKworRGF0YUluQWZ0ZXJEYXRhSW46CisJSU5UCURBVEFfSU5fQUZURVJfREFUQV9JTgorCUpVTVAJUmVzdW1lRGF0YUluCisKK0RhdGFPdXQ6CisJQ0FMTAlTR1NjcmlwdFN0YXJ0QWRkcmVzcworUmVzdW1lRGF0YU91dDoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKwlKVU1QCU1zZ0luQWZ0ZXJEYXRhT3V0LCBJRiBNU0dfSU4KKwlJTlQJVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9EQVRBX09VVAorCitNc2dJbkFmdGVyRGF0YUluOgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisJSlVNUAlEaXNjb25uZWN0QWZ0ZXJEYXRhSW4sIElGIERJU0NPTk5FQ1RfTVNHCisJSlVNUAlJZ25vcmVNc2dBZnRlckRhdGEsIElGIFNBVkVfREFUQV9QVFJTX01TRworCUpVTVAJSWdub3JlTXNnQWZ0ZXJEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKwlDQUxMCVByb2Nlc3NSZWNlaXZlTWVzc2FnZQorCUlOVAlNU0dfSU5fQUZURVJfREFUQV9JTgorCUNMRUFSCUFDSworCUpVTVAJUmVzdW1lRGF0YUluCisKK0Rpc2Nvbm5lY3REdXJpbmdEYXRhSW46CisJQ0xFQVIJQUNLCisJV0FJVAlESVNDT05ORUNUCisJRU5UUlkJRGlzY29ubmVjdDMKK0Rpc2Nvbm5lY3QzOgorCUlOVAlESVNDT05ORUNUX0RVUklOR19EQVRBCisJRU5UUlkJRGlzY29ubmVjdDQKK0Rpc2Nvbm5lY3Q0OgorOyB3ZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVTZW5kQ29tbWFuZAorCisKK0Rpc2Nvbm5lY3RBZnRlckRhdGFJbjoKKwlDTEVBUglBQ0sKKwlXQUlUCURJU0NPTk5FQ1QKKwlFTlRSWQlEaXNjb25uZWN0NQorRGlzY29ubmVjdDU6CisJSU5UCURJU0NPTk5FQ1RfQUZURVJfREFUQQorCUVOVFJZCURpc2Nvbm5lY3Q2CitEaXNjb25uZWN0NjoKKzsgd2UgcmV0dXJuIGhlcmUgYWZ0ZXIgYSByZXNlbGVjdGlvbgorCUNMRUFSCUFDSworCUpVTVAJUmVzdW1lRGF0YUluCisKK01zZ0luQWZ0ZXJEYXRhT3V0OgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisJSlVNUAlEaXNjb25uZWN0QWZ0ZXJEYXRhT3V0LCBpZiBESVNDT05ORUNUX01TRworCUpVTVAJSWdub3JlTXNnQWZ0ZXJEYXRhLCBJRiBTQVZFX0RBVEFfUFRSU19NU0cKKwlKVU1QCUlnbm9yZU1zZ0FmdGVyRGF0YSwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKwlJTlQJTVNHX0lOX0FGVEVSX0RBVEFfT1VUCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVEYXRhT3V0CisKK0lnbm9yZU1zZ0FmdGVyRGF0YToKKwlDTEVBUglBQ0sKKzsgRGF0YSBpbiBhbmQgb3V0IGRvIHRoZSBzYW1lIHRoaW5nIG9uIHJlc3VtZSwgc28gcGljayBvbmUKKwlKVU1QCVJlc3VtZURhdGFJbgorCitEaXNjb25uZWN0QWZ0ZXJEYXRhT3V0OgorCUNMRUFSCUFDSworCVdBSVQJRElTQ09OTkVDVAorCUVOVFJZCURpc2Nvbm5lY3Q3CitEaXNjb25uZWN0NzoKKwlJTlQJRElTQ09OTkVDVF9BRlRFUl9EQVRBCisJRU5UUlkJRGlzY29ubmVjdDgKK0Rpc2Nvbm5lY3Q4OgorOyB3ZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisJSlVNUAlSZXN1bWVEYXRhT3V0CisKK0ZpbmlzaDoKKwlNT1ZFCTEsIFN0YXR1c0FkZHJlc3MsIFdIRU4gU1RBVFVTCisJSU5UCU5PVF9NU0dfSU5fQUZURVJfU1RBVFVTLCBXSEVOIE5PVCBNU0dfSU4KKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCUpVTVAJRmluaXNoQ29tbWFuZENvbXBsZXRlLCBJRiBDT01NQU5EX0NPTVBMRVRFX01TRworCUNBTEwJUHJvY2Vzc1JlY2VpdmVNZXNzYWdlCisJSU5UCU1TR19JTl9BRlRFUl9TVEFUVVMKKwlFTlRSWQlGaW5pc2hDb21tYW5kQ29tcGxldGUKK0ZpbmlzaENvbW1hbmRDb21wbGV0ZToKKwlDTEVBUglBQ0sKKwlXQUlUCURJU0NPTk5FQ1QKKwlFTlRSWQlGaW5pc2gxCitGaW5pc2gxOgorCUlOVAlHT09EX1NUQVRVU19BRlRFUl9TVEFUVVMKKwlFTlRSWQlGaW5pc2gyCitGaW5pc2gyOgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjNzAwX2QuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpLzUzYzcwMF9kLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQyYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzcwMF9kLmhfc2hpcHBlZApAQCAtMCwwICsxLDEzMjkgQEAKKy8qIERPIE5PVCBFRElUIC0gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgc2NyaXB0X2FzbS5wbCAqLworc3RhdGljIHUzMiBTQ1JJUFRbXSA9IHsKKy8qCis7IFNjcmlwdCBmb3IgdGhlIE5DUiAob3Igc3ltYmlvcykgNTNjNzAwIGFuZCA1M2M3MDAtNjYgY2hpcAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDEgSmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorOzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOzsgIAorOzsgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cis7OyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorOzsgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7OworOzsgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOzsgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7OyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzs7ICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKzs7Cis7Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IFRoaXMgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGJlIG1vZGlmaWVkIGZvciB0aGUgcGFydGljdWxhciBjb21tYW5kIGluCis7IG9wZXJhdGlvbi4gIFRoZSBwYXJ0aWN1bGFyIHZhcmlhYmxlcyBwZXJ0YWluaW5nIHRvIHRoZSBjb21tYW5kcyBhcmU6Cis7CitBQlNPTFVURQlEZXZpY2VfSUQgPSAwCQk7IElEIG9mIHRhcmdldCBmb3IgY29tbWFuZAorQUJTT0xVVEUJTWVzc2FnZUNvdW50ID0gMAk7IE51bWJlciBvZiBieXRlcyBpbiBtZXNzYWdlCitBQlNPTFVURQlNZXNzYWdlTG9jYXRpb24gPSAwCTsgQWRkciBvZiBtZXNzYWdlCitBQlNPTFVURQlDb21tYW5kQ291bnQgPSAwCTsgTnVtYmVyIG9mIGJ5dGVzIGluIGNvbW1hbmQKK0FCU09MVVRFCUNvbW1hbmRBZGRyZXNzID0gMAk7IEFkZHIgb2YgQ29tbWFuZAorQUJTT0xVVEUJU3RhdHVzQWRkcmVzcyA9IDAJOyBBZGRyIHRvIHJlY2VpdmUgc3RhdHVzIHJldHVybgorQUJTT0xVVEUJUmVjZWl2ZU1zZ0FkZHJlc3MgPSAwCTsgQWRkciB0byByZWNlaXZlIG1zZworOworOyBUaGlzIGlzIHRoZSBtYWdpYyBjb21wb25lbnQgZm9yIGhhbmRsaW5nIHNjYXR0ZXItZ2F0aGVyLiAgRWFjaCBvZiB0aGUKKzsgU0cgY29tcG9uZW50cyBpcyBwcmVjZWVkZWQgYnkgYSBzY3JpcHQgZnJhZ21lbnQgd2hpY2ggbW92ZXMgdGhlCis7IG5lY2Vzc2FyeSBhbW91bnQgb2YgZGF0YSBhbmQganVtcHMgdG8gdGhlIG5leHQgU0cgc2VnbWVudC4gIFRoZSBmaW5hbAorOyBTRyBzZWdtZW50IGp1bXBzIGJhY2sgdG8gLiAgSG93ZXZlciwgdGhpcyBhZGRyZXNzIGlzIHRoZSBmaXJzdCBTRyBzY3JpcHQKKzsgc2VnbWVudC4KKzsKK0FCU09MVVRFCVNHU2NyaXB0U3RhcnRBZGRyZXNzID0gMAorCis7IFRoZSBmb2xsb3dpbmcgcmVwcmVzZW50IHN0YXR1cyBpbnRlcnJ1cHRzIHdlIHVzZSAzIGhleCBkaWdpdHMgZm9yCis7IHRoaXM6IDB4UFJTIHdoZXJlIAorCis7IFA6CitBQlNPTFVURQlBRlRFUl9TRUxFQ1RJT04gCT0gMHgxMDAKK0FCU09MVVRFCUJFRk9SRV9DTUQgCQk9IDB4MjAwCitBQlNPTFVURQlBRlRFUl9DTUQgCQk9IDB4MzAwCitBQlNPTFVURQlBRlRFUl9TVEFUVVMgCQk9IDB4NDAwCitBQlNPTFVURQlBRlRFUl9EQVRBX0lOCQk9IDB4NTAwCitBQlNPTFVURQlBRlRFUl9EQVRBX09VVAkJPSAweDYwMAorQUJTT0xVVEUJRFVSSU5HX0RBVEFfSU4JCT0gMHg3MDAKKworOyBSOgorQUJTT0xVVEUJTk9UX01TR19PVVQgCQk9IDB4MTAKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0UgCT0gMHgyMAorQUJTT0xVVEUJTk9UX01TR19JTiAJCT0gMHgzMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9NU0cJCT0gMHg0MAorQUJTT0xVVEUJTVNHX0lOCQkJPSAweDUwCitBQlNPTFVURQlTRFRSX01TR19SCQk9IDB4NjAKK0FCU09MVVRFCVJFSkVDVF9NU0dfUgkJPSAweDcwCitBQlNPTFVURQlESVNDT05ORUNUCQk9IDB4ODAKK0FCU09MVVRFCU1TR19PVVQJCQk9IDB4OTAKK0FCU09MVVRFCVdEVFJfTVNHX1IJCT0gMHhBMAorCis7IFM6CitBQlNPTFVURQlHT09EX1NUQVRVUyAJCT0gMHgxCisKKzsgQ29tYmluYXRpb25zLCBzaW5jZSB0aGUgc2NyaXB0IGFzc2VtYmxlciBjYW4ndCBwcm9jZXNzIHwKK0FCU09MVVRFCU5PVF9NU0dfT1VUX0FGVEVSX1NFTEVDVElPTiA9IDB4MTEwCitBQlNPTFVURQlVTkVYUEVDVEVEX1BIQVNFX0JFRk9SRV9DTUQgPSAweDIyMAorQUJTT0xVVEUJVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9DTUQgPSAweDMyMAorQUJTT0xVVEUJTk9UX01TR19JTl9BRlRFUl9TVEFUVVMgPSAweDQzMAorQUJTT0xVVEUJR09PRF9TVEFUVVNfQUZURVJfU1RBVFVTID0gMHg0MDEKK0FCU09MVVRFCVVORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9JTiA9IDB4NTIwCitBQlNPTFVURQlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUID0gMHg2MjAKK0FCU09MVVRFCVVORVhQRUNURURfTVNHX0JFRk9SRV9DTUQgPSAweDI0MAorQUJTT0xVVEUJTVNHX0lOX0JFRk9SRV9DTUQgPSAweDI1MAorQUJTT0xVVEUJTVNHX0lOX0FGVEVSX0NNRCA9IDB4MzUwCitBQlNPTFVURQlTRFRSX01TR19CRUZPUkVfQ01EID0gMHgyNjAKK0FCU09MVVRFCVJFSkVDVF9NU0dfQkVGT1JFX0NNRCA9IDB4MjcwCitBQlNPTFVURQlESVNDT05ORUNUX0FGVEVSX0NNRCA9IDB4MzgwCitBQlNPTFVURQlTRFRSX01TR19BRlRFUl9DTUQgPSAweDM2MAorQUJTT0xVVEUJV0RUUl9NU0dfQUZURVJfQ01EID0gMHgzQTAKK0FCU09MVVRFCU1TR19JTl9BRlRFUl9TVEFUVVMgPSAweDQ0MAorQUJTT0xVVEUJRElTQ09OTkVDVF9BRlRFUl9EQVRBID0gMHg1ODAKK0FCU09MVVRFCU1TR19JTl9BRlRFUl9EQVRBX0lOID0gMHg1NTAKK0FCU09MVVRFCU1TR19JTl9BRlRFUl9EQVRBX09VVCA9IDB4NjUwCitBQlNPTFVURQlNU0dfT1VUX0FGVEVSX0RBVEFfSU4gPSAweDU5MAorQUJTT0xVVEUJREFUQV9JTl9BRlRFUl9EQVRBX0lOID0gMHg1YTAKK0FCU09MVVRFCU1TR19JTl9EVVJJTkdfREFUQV9JTiA9IDB4NzUwCitBQlNPTFVURQlESVNDT05ORUNUX0RVUklOR19EQVRBID0gMHg3ODAKKworOworOyBPdGhlciBpbnRlcnJ1cHQgY29uZGl0aW9ucworOyAKK0FCU09MVVRFCVJFU0VMRUNURURfRFVSSU5HX1NFTEVDVElPTiA9IDB4MTAwMAorQUJTT0xVVEUJQ09NUExFVEVEX1NFTEVDVElPTl9BU19UQVJHRVQgPSAweDEwMDEKK0FCU09MVVRFCVJFU0VMRUNUSU9OX0lERU5USUZJRUQgPSAweDEwMDMKKzsKKzsgRmF0YWwgaW50ZXJydXB0IGNvbmRpdGlvbnMuICBJZiB5b3UgYWRkIHRvIHRoaXMsIGFsc28gYWRkIHRvIHRoZQorOyBhcnJheSBvZiBjb3JyZXNwb25kaW5nIG1lc3NhZ2VzCis7CitBQlNPTFVURQlGQVRBTCA9IDB4MjAwMAorQUJTT0xVVEUJRkFUQUxfVU5FWFBFQ1RFRF9SRVNFTEVDVElPTl9NU0cgPSAweDIwMDAKK0FCU09MVVRFCUZBVEFMX1NFTkRfTVNHID0gMHgyMDAxCitBQlNPTFVURQlGQVRBTF9OT1RfTVNHX0lOX0FGVEVSX1NFTEVDVElPTiA9IDB4MjAwMgorQUJTT0xVVEUJRkFUQUxfSUxMRUdBTF9NU0dfTEVOR1RIID0gMHgyMDAzCisKK0FCU09MVVRFCURFQlVHX0lOVEVSUlVQVAk9IDB4MzAwMAorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUMSA9IDB4MzAwMQorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUMiA9IDB4MzAwMgorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUMyA9IDB4MzAwMworQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUNCA9IDB4MzAwNAorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUNSA9IDB4MzAwNQorQUJTT0xVVEUJREVCVUdfSU5URVJSVVBUNiA9IDB4MzAwNgorCisKKzsKKzsgU0NTSSBNZXNzYWdlcyB3ZSBpbnRlcnByZXQgaW4gdGhlIHNjcmlwdAorOworQUJTT0xVVEUJQ09NTUFORF9DT01QTEVURV9NU0cJPSAweDAwCitBQlNPTFVURQlFWFRFTkRFRF9NU0cJCT0gMHgwMQorQUJTT0xVVEUJU0RUUl9NU0cJCT0gMHgwMQorQUJTT0xVVEUJU0FWRV9EQVRBX1BUUlNfTVNHCT0gMHgwMgorQUJTT0xVVEUJUkVTVE9SRV9EQVRBX1BUUlNfTVNHCT0gMHgwMworQUJTT0xVVEUJV0RUUl9NU0cJCT0gMHgwMworQUJTT0xVVEUJRElTQ09OTkVDVF9NU0cJCT0gMHgwNAorQUJTT0xVVEUJUkVKRUNUX01TRwkJPSAweDA3CitBQlNPTFVURQlQQVJJVFlfRVJST1JfTVNHCT0gMHgwOQorQUJTT0xVVEUJU0lNUExFX1RBR19NU0cJCT0gMHgyMAorQUJTT0xVVEUJSURFTlRJRllfTVNHCQk9IDB4ODAKK0FCU09MVVRFCUlERU5USUZZX01TR19NQVNLCT0gMHg3RgorQUJTT0xVVEUJVFdPX0JZVEVfTVNHCQk9IDB4MjAKK0FCU09MVVRFCVRXT19CWVRFX01TR19NQVNLCT0gMHgwRgorCis7IFRoaXMgaXMgd2hlcmUgdGhlIHNjcmlwdCBiZWdpbnMKKworRU5UUlkJU3RhcnRVcAorCitTdGFydFVwOgorCVNFTEVDVAlBVE4gRGV2aWNlX0lELCBSZXNlbGVjdAorCithdCAweDAwMDAwMDAwIDogKi8JMHg0MTAwMDAwMCwweDAwMDAwMDIwLAorLyoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDAwMiA6ICovCTB4ODMwYjAwMDAsMHgwMDAwMDQ2MCwKKy8qCisJSlVNUAlTZW5kSWRlbnRpZnlNc2csIElGIE1TR19PVVQKKworYXQgMHgwMDAwMDAwNCA6ICovCTB4ODYwYTAwMDAsMHgwMDAwMDFiMCwKKy8qCisJSU5UCU5PVF9NU0dfT1VUX0FGVEVSX1NFTEVDVElPTgorCithdCAweDAwMDAwMDA2IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwMTEwLAorLyoKKworUmVzZWxlY3Q6CisJV0FJVAlSRVNFTEVDVCBTZWxlY3RlZEFzVGFyZ2V0CisKK2F0IDB4MDAwMDAwMDggOiAqLwkweDUwMDAwMDAwLDB4MDAwMDAwNTgsCisvKgorCUlOVAlSRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04sIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwMGEgOiAqLwkweDlmMGIwMDAwLDB4MDAwMDEwMDAsCisvKgorCUlOVAlGQVRBTF9OT1RfTVNHX0lOX0FGVEVSX1NFTEVDVElPTgorCithdCAweDAwMDAwMDBjIDogKi8JMHg5ODA4MDAwMCwweDAwMDAyMDAyLAorLyoKKworCUVOVFJZCUdldFJlc2VsZWN0aW9uRGF0YQorR2V0UmVzZWxlY3Rpb25EYXRhOgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwMGUgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUlOVAlSRVNFTEVDVElPTl9JREVOVElGSUVECisKK2F0IDB4MDAwMDAwMTAgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDEwMDMsCisvKgorCisJRU5UUlkJR2V0UmVzZWxlY3Rpb25XaXRoVGFnCitHZXRSZXNlbGVjdGlvbldpdGhUYWc6CisJTU9WRQkzLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDAxMiA6ICovCTB4MGYwMDAwMDMsMHgwMDAwMDAwMCwKKy8qCisJSU5UCVJFU0VMRUNUSU9OX0lERU5USUZJRUQKKworYXQgMHgwMDAwMDAxNCA6ICovCTB4OTgwODAwMDAsMHgwMDAwMTAwMywKKy8qCisJCisJRU5UUlkJU2VsZWN0ZWRBc1RhcmdldAorU2VsZWN0ZWRBc1RhcmdldDoKKzsgQmFzaWNhbGx5IHRlbGwgdGhlIHNlbGVjdGluZyBkZXZpY2UgdGhhdCB0aGVyZSdzIG5vdGhpbmcgaGVyZQorCVNFVAlUQVJHRVQKKworYXQgMHgwMDAwMDAxNiA6ICovCTB4NTgwMDAyMDAsMHgwMDAwMDAwMCwKKy8qCisJRElTQ09OTkVDVAorCithdCAweDAwMDAwMDE4IDogKi8JMHg0ODAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwlDTEVBUglUQVJHRVQKKworYXQgMHgwMDAwMDAxYSA6ICovCTB4NjAwMDAyMDAsMHgwMDAwMDAwMCwKKy8qCisJSU5UCUNPTVBMRVRFRF9TRUxFQ1RJT05fQVNfVEFSR0VUCisKK2F0IDB4MDAwMDAwMWMgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDEwMDEsCisvKgorOworOyBUaGVzZSBhcmUgdGhlIG1lc3NhZ2luZyBlbnRyaWVzCis7Cis7IFNlbmQgYSBtZXNzYWdlLiAgTWVzc2FnZSBjb3VudCBzaG91bGQgYmUgY29ycmVjdGx5IHBhdGNoZWQKKwlFTlRSWQlTZW5kTWVzc2FnZQorU2VuZE1lc3NhZ2U6CisJTU9WRQlNZXNzYWdlQ291bnQsIE1lc3NhZ2VMb2NhdGlvbiwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAwMWUgOiAqLwkweDBlMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lU2VuZE1lc3NhZ2U6CisJUkVUVVJOLAlXSEVOIE5PVCBNU0dfT1VUCisKK2F0IDB4MDAwMDAwMjAgOiAqLwkweDk2MDMwMDAwLDB4MDAwMDAwMDAsCisvKgorCUlOVAlGQVRBTF9TRU5EX01TRworCithdCAweDAwMDAwMDIyIDogKi8JMHg5ODA4MDAwMCwweDAwMDAyMDAxLAorLyoKKworCUVOVFJZCVNlbmRNZXNzYWdlUGhhc2VNaXNtYXRjaAorU2VuZE1lc3NhZ2VQaGFzZU1pc21hdGNoOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDI0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlKVU1QCVJlc3VtZVNlbmRNZXNzYWdlCisKK2F0IDB4MDAwMDAwMjYgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwODAsCisvKgorOworOyBSZWNlaXZlIGEgbWVzc2FnZS4gIE5lZWQgdG8gaWRlbnRpZnkgdGhlIG1lc3NhZ2UgdG8KKzsgcmVjZWl2ZSBpdCBjb3JyZWN0bHkKKwlFTlRSWQlSZWNlaXZlTWVzc2FnZQorUmVjZWl2ZU1lc3NhZ2U6CisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcywgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDAyOCA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCis7Cis7IFVzZSB0aGlzIGVudHJ5IGlmIHdlJ3ZlIGp1c3QgdHJpZWQgdG8gbG9vayBhdCB0aGUgZmlyc3QgYnl0ZQorOyBvZiB0aGUgbWVzc2FnZSBhbmQgd2FudCB0byBwcm9jZXNzIGl0IGZ1cnRoZXIKK1Byb2Nlc3NSZWNlaXZlTWVzc2FnZToKKwlKVU1QCVJlY2VpdmVFeHRlbmRlZE1lc3NhZ2UsIElGIEVYVEVOREVEX01TRworCithdCAweDAwMDAwMDJhIDogKi8JMHg4MDBjMDAwMSwweDAwMDAwMGQwLAorLyoKKwlSRVRVUk4sCUlGIE5PVCBUV09fQllURV9NU0csIEFORCBNQVNLIFRXT19CWVRFX01TR19NQVNLCisKK2F0IDB4MDAwMDAwMmMgOiAqLwkweDkwMDQwZjIwLDB4MDAwMDAwMDAsCisvKgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDJlIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzICsgMSwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDAzMCA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMSwKKy8qCisJUkVUVVJOCisKK2F0IDB4MDAwMDAwMzIgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVjZWl2ZUV4dGVuZGVkTWVzc2FnZToKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDAzNCA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJTU9WRQkxLCBSZWNlaXZlTXNnQWRkcmVzcyArIDEsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwMzYgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDEsCisvKgorCUpVTVAJUmVjZWl2ZTFCeXRlLCBJRiAweDAxCisKK2F0IDB4MDAwMDAwMzggOiAqLwkweDgwMGMwMDAxLDB4MDAwMDAxMTAsCisvKgorCUpVTVAJUmVjZWl2ZTJCeXRlLCBJRiAweDAyCisKK2F0IDB4MDAwMDAwM2EgOiAqLwkweDgwMGMwMDAyLDB4MDAwMDAxMjgsCisvKgorCUpVTVAJUmVjZWl2ZTNCeXRlLCBJRiAweDAzCisKK2F0IDB4MDAwMDAwM2MgOiAqLwkweDgwMGMwMDAzLDB4MDAwMDAxNDAsCisvKgorCUpVTVAJUmVjZWl2ZTRCeXRlLCBJRiAweDA0CisKK2F0IDB4MDAwMDAwM2UgOiAqLwkweDgwMGMwMDA0LDB4MDAwMDAxNTgsCisvKgorCUpVTVAJUmVjZWl2ZTVCeXRlLCBJRiAweDA1CisKK2F0IDB4MDAwMDAwNDAgOiAqLwkweDgwMGMwMDA1LDB4MDAwMDAxNzAsCisvKgorCUlOVAlGQVRBTF9JTExFR0FMX01TR19MRU5HVEgKKworYXQgMHgwMDAwMDA0MiA6ICovCTB4OTgwODAwMDAsMHgwMDAwMjAwMywKKy8qCitSZWNlaXZlMUJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNDQgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDQ2IDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA0OCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlMkJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNGEgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJMiwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDRjIDogKi8JMHgwZjAwMDAwMiwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA0ZSA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlM0J5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNTAgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJMywgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDUyIDogKi8JMHgwZjAwMDAwMywweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA1NCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlNEJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNTYgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJNCwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDU4IDogKi8JMHgwZjAwMDAwNCwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA1YSA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCitSZWNlaXZlNUJ5dGU6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwNWMgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUJNSwgUmVjZWl2ZU1zZ0FkZHJlc3MgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDVlIDogKi8JMHgwZjAwMDAwNSwweDAwMDAwMDAyLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA2MCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCis7Cis7IENvbWUgaGVyZSBmcm9tIHRoZSBtZXNzYWdlIHByb2Nlc3NvciB0byBpZ25vcmUgdGhlIG1lc3NhZ2UKKzsKKwlFTlRSWQlJZ25vcmVNZXNzYWdlCitJZ25vcmVNZXNzYWdlOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDYyIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlSRVRVUk4KKworYXQgMHgwMDAwMDA2NCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCis7Cis7IENvbWUgaGVyZSB0byBzZW5kIGEgcmVwbHkgdG8gYSBtZXNzYWdlCis7CisJRU5UUlkJU2VuZE1lc3NhZ2VXaXRoQVROCitTZW5kTWVzc2FnZVdpdGhBVE46CisJU0VUCUFUTgorCithdCAweDAwMDAwMDY2IDogKi8JMHg1ODAwMDAwOCwweDAwMDAwMDAwLAorLyoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDA2OCA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJSlVNUAlTZW5kTWVzc2FnZQorCithdCAweDAwMDAwMDZhIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDc4LAorLyoKKworU2VuZElkZW50aWZ5TXNnOgorCUNBTEwJU2VuZE1lc3NhZ2UKKworYXQgMHgwMDAwMDA2YyA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDA3OCwKKy8qCisJQ0xFQVIJQVROCisKK2F0IDB4MDAwMDAwNmUgOiAqLwkweDYwMDAwMDA4LDB4MDAwMDAwMDAsCisvKgorCitJZ25vcmVNc2dCZWZvcmVDb21tYW5kOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDcwIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlFTlRSWQlTZW5kQ29tbWFuZAorU2VuZENvbW1hbmQ6CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwNzIgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA0NjAsCisvKgorCUpVTVAJTXNnSW5CZWZvcmVDb21tYW5kLCBJRiBNU0dfSU4KKworYXQgMHgwMDAwMDA3NCA6ICovCTB4ODcwYTAwMDAsMHgwMDAwMDJjMCwKKy8qCisJSU5UCVVORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRCwgSUYgTk9UIENNRAorCithdCAweDAwMDAwMDc2IDogKi8JMHg5YTAyMDAwMCwweDAwMDAwMjIwLAorLyoKKwlNT1ZFCUNvbW1hbmRDb3VudCwgQ29tbWFuZEFkZHJlc3MsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwNzggOiAqLwkweDBhMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lU2VuZENvbW1hbmQ6CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwN2EgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA0NjAsCisvKgorCUpVTVAJTXNnSW5BZnRlckNtZCwgSUYgTVNHX0lOCisKK2F0IDB4MDAwMDAwN2MgOiAqLwkweDg3MGEwMDAwLDB4MDAwMDAyNDgsCisvKgorCUpVTVAJRGF0YUluLCBJRiBEQVRBX0lOCisKK2F0IDB4MDAwMDAwN2UgOiAqLwkweDgxMGEwMDAwLDB4MDAwMDAyZjgsCisvKgorCUpVTVAJRGF0YU91dCwgSUYgREFUQV9PVVQKKworYXQgMHgwMDAwMDA4MCA6ICovCTB4ODAwYTAwMDAsMHgwMDAwMDMzOCwKKy8qCisJSU5UCVVORVhQRUNURURfUEhBU0VfQUZURVJfQ01ECisKK2F0IDB4MDAwMDAwODIgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDAzMjAsCisvKgorCitJZ25vcmVNc2dEdXJpbmdEYXRhOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMDg0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwk7IGZhbGwgdGhyb3VnaCB0byBNc2dJbkR1cmluZ0RhdGEKKworRW50cnkgTXNnSW5EdXJpbmdEYXRhCitNc2dJbkR1cmluZ0RhdGE6Cis7Cis7IENvdWxkIGJlIHdlIGhhdmUgbm90aGluZyBtb3JlIHRvIHRyYW5zZmVyCis7CisJSlVNUAlGaW5pc2gsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwODYgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA0NjAsCisvKgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwODggOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRGlzY29ubmVjdER1cmluZ0RhdGFJbiwgSUYgRElTQ09OTkVDVF9NU0cKKworYXQgMHgwMDAwMDA4YSA6ICovCTB4ODAwYzAwMDQsMHgwMDAwMDM5OCwKKy8qCisJSlVNUAlJZ25vcmVNc2dEdXJpbmdEYXRhLCBJRiBTQVZFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA4YyA6ICovCTB4ODAwYzAwMDIsMHgwMDAwMDIxMCwKKy8qCisJSlVNUAlJZ25vcmVNc2dEdXJpbmdEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA4ZSA6ICovCTB4ODAwYzAwMDMsMHgwMDAwMDIxMCwKKy8qCisJSU5UCU1TR19JTl9EVVJJTkdfREFUQV9JTgorCithdCAweDAwMDAwMDkwIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNzUwLAorLyoKKworTXNnSW5BZnRlckNtZDoKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMDkyIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKwlKVU1QCURpc2Nvbm5lY3RBZnRlckNtZCwgSUYgRElTQ09OTkVDVF9NU0cKKworYXQgMHgwMDAwMDA5NCA6ICovCTB4ODAwYzAwMDQsMHgwMDAwMDI5OCwKKy8qCisJSlVNUAlJZ25vcmVNc2dJbkFmdGVyQ21kLCBJRiBTQVZFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA5NiA6ICovCTB4ODAwYzAwMDIsMHgwMDAwMDI4OCwKKy8qCisJSlVNUAlJZ25vcmVNc2dJbkFmdGVyQ21kLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDA5OCA6ICovCTB4ODAwYzAwMDMsMHgwMDAwMDI4OCwKKy8qCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKworYXQgMHgwMDAwMDA5YSA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDBhOCwKKy8qCisJSU5UCU1TR19JTl9BRlRFUl9DTUQKKworYXQgMHgwMDAwMDA5YyA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDM1MCwKKy8qCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwOWUgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBhMCA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFlOCwKKy8qCisKK0lnbm9yZU1zZ0luQWZ0ZXJDbWQ6CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwYTIgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBhNCA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFlOCwKKy8qCisKK0Rpc2Nvbm5lY3RBZnRlckNtZDoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBhNiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAwYTggOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3QxCitEaXNjb25uZWN0MToKKwlJTlQJRElTQ09OTkVDVF9BRlRFUl9DTUQKKworYXQgMHgwMDAwMDBhYSA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDM4MCwKKy8qCisJRU5UUlkJRGlzY29ubmVjdDIKK0Rpc2Nvbm5lY3QyOgorOyBXZSByZXR1cm4gaGVyZSBhZnRlciBhIHJlc2VsZWN0aW9uCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwYWMgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBhZSA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFlOCwKKy8qCisKK01zZ0luQmVmb3JlQ29tbWFuZDoKKwlNT1ZFCTEsIFJlY2VpdmVNc2dBZGRyZXNzLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMGIwIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKwlKVU1QCUlnbm9yZU1zZ0JlZm9yZUNvbW1hbmQsIElGIFNBVkVfREFUQV9QVFJTX01TRworCithdCAweDAwMDAwMGIyIDogKi8JMHg4MDBjMDAwMiwweDAwMDAwMWMwLAorLyoKKwlKVU1QCUlnbm9yZU1zZ0JlZm9yZUNvbW1hbmQsIElGIFJFU1RPUkVfREFUQV9QVFJTX01TRworCithdCAweDAwMDAwMGI0IDogKi8JMHg4MDBjMDAwMywweDAwMDAwMWMwLAorLyoKKwlDQUxMCVByb2Nlc3NSZWNlaXZlTWVzc2FnZQorCithdCAweDAwMDAwMGI2IDogKi8JMHg4ODA4MDAwMCwweDAwMDAwMGE4LAorLyoKKwlJTlQJTVNHX0lOX0JFRk9SRV9DTUQKKworYXQgMHgwMDAwMDBiOCA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDI1MCwKKy8qCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwYmEgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJU2VuZENvbW1hbmQKKworYXQgMHgwMDAwMDBiYyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDFjOCwKKy8qCisKK0RhdGFJbjoKKwlDQUxMCVNHU2NyaXB0U3RhcnRBZGRyZXNzCisKK2F0IDB4MDAwMDAwYmUgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lRGF0YUluOgorCUpVTVAJRmluaXNoLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMGMwIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwNDYwLAorLyoKKwlKVU1QCU1zZ0luQWZ0ZXJEYXRhSW4sIElGIE1TR19JTgorCithdCAweDAwMDAwMGMyIDogKi8JMHg4NzBhMDAwMCwweDAwMDAwMzU4LAorLyoKKwlKVU1QCURhdGFJbkFmdGVyRGF0YUluLCBpZiBEQVRBX0lOCisKK2F0IDB4MDAwMDAwYzQgOiAqLwkweDgxMGEwMDAwLDB4MDAwMDAzMjgsCisvKgorCUlOVAlNU0dfT1VUX0FGVEVSX0RBVEFfSU4sIGlmIE1TR19PVVQKKworYXQgMHgwMDAwMDBjNiA6ICovCTB4OWUwYTAwMDAsMHgwMDAwMDU5MCwKKy8qCisJSU5UCVVORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9JTgorCithdCAweDAwMDAwMGM4IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNTIwLAorLyoKKworRGF0YUluQWZ0ZXJEYXRhSW46CisJSU5UCURBVEFfSU5fQUZURVJfREFUQV9JTgorCithdCAweDAwMDAwMGNhIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNWEwLAorLyoKKwlKVU1QCVJlc3VtZURhdGFJbgorCithdCAweDAwMDAwMGNjIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzAwLAorLyoKKworRGF0YU91dDoKKwlDQUxMCVNHU2NyaXB0U3RhcnRBZGRyZXNzCisKK2F0IDB4MDAwMDAwY2UgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAwMDAsCisvKgorUmVzdW1lRGF0YU91dDoKKwlKVU1QCUZpbmlzaCwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDBkMCA6ICovCTB4ODMwYjAwMDAsMHgwMDAwMDQ2MCwKKy8qCisJSlVNUAlNc2dJbkFmdGVyRGF0YU91dCwgSUYgTVNHX0lOCisKK2F0IDB4MDAwMDAwZDIgOiAqLwkweDg3MGEwMDAwLDB4MDAwMDAzZTgsCisvKgorCUlOVAlVTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUCisKK2F0IDB4MDAwMDAwZDQgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDA2MjAsCisvKgorCitNc2dJbkFmdGVyRGF0YUluOgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwZDYgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRGlzY29ubmVjdEFmdGVyRGF0YUluLCBJRiBESVNDT05ORUNUX01TRworCithdCAweDAwMDAwMGQ4IDogKi8JMHg4MDBjMDAwNCwweDAwMDAwM2MwLAorLyoKKwlKVU1QCUlnbm9yZU1zZ0FmdGVyRGF0YSwgSUYgU0FWRV9EQVRBX1BUUlNfTVNHCisKK2F0IDB4MDAwMDAwZGEgOiAqLwkweDgwMGMwMDAyLDB4MDAwMDA0MjgsCisvKgorCUpVTVAJSWdub3JlTXNnQWZ0ZXJEYXRhLCBJRiBSRVNUT1JFX0RBVEFfUFRSU19NU0cKKworYXQgMHgwMDAwMDBkYyA6ICovCTB4ODAwYzAwMDMsMHgwMDAwMDQyOCwKKy8qCisJQ0FMTAlQcm9jZXNzUmVjZWl2ZU1lc3NhZ2UKKworYXQgMHgwMDAwMDBkZSA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDBhOCwKKy8qCisJSU5UCU1TR19JTl9BRlRFUl9EQVRBX0lOCisKK2F0IDB4MDAwMDAwZTAgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDA1NTAsCisvKgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMGUyIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlKVU1QCVJlc3VtZURhdGFJbgorCithdCAweDAwMDAwMGU0IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzAwLAorLyoKKworRGlzY29ubmVjdER1cmluZ0RhdGFJbjoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBlNiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAwZTggOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3QzCitEaXNjb25uZWN0MzoKKwlJTlQJRElTQ09OTkVDVF9EVVJJTkdfREFUQQorCithdCAweDAwMDAwMGVhIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNzgwLAorLyoKKwlFTlRSWQlEaXNjb25uZWN0NAorRGlzY29ubmVjdDQ6Cis7IHdlIHJldHVybiBoZXJlIGFmdGVyIGEgcmVzZWxlY3Rpb24KKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBlYyA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJSlVNUAlSZXN1bWVTZW5kQ29tbWFuZAorCithdCAweDAwMDAwMGVlIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMWU4LAorLyoKKworCitEaXNjb25uZWN0QWZ0ZXJEYXRhSW46CisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAwZjAgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCVdBSVQJRElTQ09OTkVDVAorCithdCAweDAwMDAwMGYyIDogKi8JMHg0ODAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwlFTlRSWQlEaXNjb25uZWN0NQorRGlzY29ubmVjdDU6CisJSU5UCURJU0NPTk5FQ1RfQUZURVJfREFUQQorCithdCAweDAwMDAwMGY0IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNTgwLAorLyoKKwlFTlRSWQlEaXNjb25uZWN0NgorRGlzY29ubmVjdDY6Cis7IHdlIHJldHVybiBoZXJlIGFmdGVyIGEgcmVzZWxlY3Rpb24KKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDBmNiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJSlVNUAlSZXN1bWVEYXRhSW4KKworYXQgMHgwMDAwMDBmOCA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDMwMCwKKy8qCisKK01zZ0luQWZ0ZXJEYXRhT3V0OgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwZmEgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRGlzY29ubmVjdEFmdGVyRGF0YU91dCwgaWYgRElTQ09OTkVDVF9NU0cKKworYXQgMHgwMDAwMDBmYyA6ICovCTB4ODAwYzAwMDQsMHgwMDAwMDQzOCwKKy8qCisJSlVNUAlJZ25vcmVNc2dBZnRlckRhdGEsIElGIFNBVkVfREFUQV9QVFJTX01TRworCithdCAweDAwMDAwMGZlIDogKi8JMHg4MDBjMDAwMiwweDAwMDAwNDI4LAorLyoKKwlKVU1QCUlnbm9yZU1zZ0FmdGVyRGF0YSwgSUYgUkVTVE9SRV9EQVRBX1BUUlNfTVNHCisKK2F0IDB4MDAwMDAxMDAgOiAqLwkweDgwMGMwMDAzLDB4MDAwMDA0MjgsCisvKgorCUNBTEwJUHJvY2Vzc1JlY2VpdmVNZXNzYWdlCisKK2F0IDB4MDAwMDAxMDIgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAwYTgsCisvKgorCUlOVAlNU0dfSU5fQUZURVJfREFUQV9PVVQKKworYXQgMHgwMDAwMDEwNCA6ICovCTB4OTgwODAwMDAsMHgwMDAwMDY1MCwKKy8qCisJQ0xFQVIJQUNLCisKK2F0IDB4MDAwMDAxMDYgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJUmVzdW1lRGF0YU91dAorCithdCAweDAwMDAwMTA4IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzQwLAorLyoKKworSWdub3JlTXNnQWZ0ZXJEYXRhOgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMTBhIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKzsgRGF0YSBpbiBhbmQgb3V0IGRvIHRoZSBzYW1lIHRoaW5nIG9uIHJlc3VtZSwgc28gcGljayBvbmUKKwlKVU1QCVJlc3VtZURhdGFJbgorCithdCAweDAwMDAwMTBjIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMzAwLAorLyoKKworRGlzY29ubmVjdEFmdGVyRGF0YU91dDoKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDEwZSA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAxMTAgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3Q3CitEaXNjb25uZWN0NzoKKwlJTlQJRElTQ09OTkVDVF9BRlRFUl9EQVRBCisKK2F0IDB4MDAwMDAxMTIgOiAqLwkweDk4MDgwMDAwLDB4MDAwMDA1ODAsCisvKgorCUVOVFJZCURpc2Nvbm5lY3Q4CitEaXNjb25uZWN0ODoKKzsgd2UgcmV0dXJuIGhlcmUgYWZ0ZXIgYSByZXNlbGVjdGlvbgorCUNMRUFSCUFDSworCithdCAweDAwMDAwMTE0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKwlKVU1QCVJlc3VtZURhdGFPdXQKKworYXQgMHgwMDAwMDExNiA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDM0MCwKKy8qCisKK0ZpbmlzaDoKKwlNT1ZFCTEsIFN0YXR1c0FkZHJlc3MsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAxMTggOiAqLwkweDBiMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUlOVAlOT1RfTVNHX0lOX0FGVEVSX1NUQVRVUywgV0hFTiBOT1QgTVNHX0lOCisKK2F0IDB4MDAwMDAxMWEgOiAqLwkweDlmMDMwMDAwLDB4MDAwMDA0MzAsCisvKgorCU1PVkUJMSwgUmVjZWl2ZU1zZ0FkZHJlc3MsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAxMWMgOiAqLwkweDBmMDAwMDAxLDB4MDAwMDAwMDAsCisvKgorCUpVTVAJRmluaXNoQ29tbWFuZENvbXBsZXRlLCBJRiBDT01NQU5EX0NPTVBMRVRFX01TRworCithdCAweDAwMDAwMTFlIDogKi8JMHg4MDBjMDAwMCwweDAwMDAwNDkwLAorLyoKKwlDQUxMCVByb2Nlc3NSZWNlaXZlTWVzc2FnZQorCithdCAweDAwMDAwMTIwIDogKi8JMHg4ODA4MDAwMCwweDAwMDAwMGE4LAorLyoKKwlJTlQJTVNHX0lOX0FGVEVSX1NUQVRVUworCithdCAweDAwMDAwMTIyIDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNDQwLAorLyoKKwlFTlRSWQlGaW5pc2hDb21tYW5kQ29tcGxldGUKK0ZpbmlzaENvbW1hbmRDb21wbGV0ZToKKwlDTEVBUglBQ0sKKworYXQgMHgwMDAwMDEyNCA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisJV0FJVAlESVNDT05ORUNUCisKK2F0IDB4MDAwMDAxMjYgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUVOVFJZCUZpbmlzaDEKK0ZpbmlzaDE6CisJSU5UCUdPT0RfU1RBVFVTX0FGVEVSX1NUQVRVUworCithdCAweDAwMDAwMTI4IDogKi8JMHg5ODA4MDAwMCwweDAwMDAwNDAxLAorfTsKKworI2RlZmluZSBBX0FGVEVSX0NNRAkweDAwMDAwMzAwCitzdGF0aWMgdTMyIEFfQUZURVJfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfQUZURVJfREFUQV9JTgkweDAwMDAwNTAwCitzdGF0aWMgdTMyIEFfQUZURVJfREFUQV9JTl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0FGVEVSX0RBVEFfT1VUCTB4MDAwMDA2MDAKK3N0YXRpYyB1MzIgQV9BRlRFUl9EQVRBX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0FGVEVSX1NFTEVDVElPTgkweDAwMDAwMTAwCitzdGF0aWMgdTMyIEFfQUZURVJfU0VMRUNUSU9OX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfQUZURVJfU1RBVFVTCTB4MDAwMDA0MDAKK3N0YXRpYyB1MzIgQV9BRlRFUl9TVEFUVVNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9CRUZPUkVfQ01ECTB4MDAwMDAyMDAKK3N0YXRpYyB1MzIgQV9CRUZPUkVfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfQ09NTUFORF9DT01QTEVURV9NU0cJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX0NPTU1BTkRfQ09NUExFVEVfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDExZSwKK307CisKKyNkZWZpbmUgQV9DT01QTEVURURfU0VMRUNUSU9OX0FTX1RBUkdFVAkweDAwMDAxMDAxCitzdGF0aWMgdTMyIEFfQ09NUExFVEVEX1NFTEVDVElPTl9BU19UQVJHRVRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDFkLAorfTsKKworI2RlZmluZSBBX0NvbW1hbmRBZGRyZXNzCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9Db21tYW5kQWRkcmVzc191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNzksCit9OworCisjZGVmaW5lIEFfQ29tbWFuZENvdW50CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9Db21tYW5kQ291bnRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDc4LAorfTsKKworI2RlZmluZSBBX0RBVEFfSU5fQUZURVJfREFUQV9JTgkweDAwMDAwNWEwCitzdGF0aWMgdTMyIEFfREFUQV9JTl9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBjYiwKK307CisKKyNkZWZpbmUgQV9ERUJVR19JTlRFUlJVUFQJMHgwMDAwMzAwMAorc3RhdGljIHUzMiBBX0RFQlVHX0lOVEVSUlVQVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0RFQlVHX0lOVEVSUlVQVDEJMHgwMDAwMzAwMQorc3RhdGljIHUzMiBBX0RFQlVHX0lOVEVSUlVQVDFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9ERUJVR19JTlRFUlJVUFQyCTB4MDAwMDMwMDIKK3N0YXRpYyB1MzIgQV9ERUJVR19JTlRFUlJVUFQyX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfREVCVUdfSU5URVJSVVBUMwkweDAwMDAzMDAzCitzdGF0aWMgdTMyIEFfREVCVUdfSU5URVJSVVBUM191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0RFQlVHX0lOVEVSUlVQVDQJMHgwMDAwMzAwNAorc3RhdGljIHUzMiBBX0RFQlVHX0lOVEVSUlVQVDRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9ERUJVR19JTlRFUlJVUFQ1CTB4MDAwMDMwMDUKK3N0YXRpYyB1MzIgQV9ERUJVR19JTlRFUlJVUFQ1X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfREVCVUdfSU5URVJSVVBUNgkweDAwMDAzMDA2CitzdGF0aWMgdTMyIEFfREVCVUdfSU5URVJSVVBUNl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1QJMHgwMDAwMDA4MAorc3RhdGljIHUzMiBBX0RJU0NPTk5FQ1RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9ESVNDT05ORUNUX0FGVEVSX0NNRAkweDAwMDAwMzgwCitzdGF0aWMgdTMyIEFfRElTQ09OTkVDVF9BRlRFUl9DTURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGFiLAorfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1RfQUZURVJfREFUQQkweDAwMDAwNTgwCitzdGF0aWMgdTMyIEFfRElTQ09OTkVDVF9BRlRFUl9EQVRBX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBmNSwKKwkweDAwMDAwMTEzLAorfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1RfRFVSSU5HX0RBVEEJMHgwMDAwMDc4MAorc3RhdGljIHUzMiBBX0RJU0NPTk5FQ1RfRFVSSU5HX0RBVEFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGViLAorfTsKKworI2RlZmluZSBBX0RJU0NPTk5FQ1RfTVNHCTB4MDAwMDAwMDQKK3N0YXRpYyB1MzIgQV9ESVNDT05ORUNUX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOGEsCisJMHgwMDAwMDA5NCwKKwkweDAwMDAwMGQ4LAorCTB4MDAwMDAwZmMsCit9OworCisjZGVmaW5lIEFfRFVSSU5HX0RBVEFfSU4JMHgwMDAwMDcwMAorc3RhdGljIHUzMiBBX0RVUklOR19EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfRGV2aWNlX0lECTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9EZXZpY2VfSURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDAwLAorfTsKKworI2RlZmluZSBBX0VYVEVOREVEX01TRwkweDAwMDAwMDAxCitzdGF0aWMgdTMyIEFfRVhURU5ERURfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAyYSwKK307CisKKyNkZWZpbmUgQV9GQVRBTAkweDAwMDAyMDAwCitzdGF0aWMgdTMyIEFfRkFUQUxfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9GQVRBTF9JTExFR0FMX01TR19MRU5HVEgJMHgwMDAwMjAwMworc3RhdGljIHUzMiBBX0ZBVEFMX0lMTEVHQUxfTVNHX0xFTkdUSF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNDMsCit9OworCisjZGVmaW5lIEFfRkFUQUxfTk9UX01TR19JTl9BRlRFUl9TRUxFQ1RJT04JMHgwMDAwMjAwMgorc3RhdGljIHUzMiBBX0ZBVEFMX05PVF9NU0dfSU5fQUZURVJfU0VMRUNUSU9OX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwZCwKK307CisKKyNkZWZpbmUgQV9GQVRBTF9TRU5EX01TRwkweDAwMDAyMDAxCitzdGF0aWMgdTMyIEFfRkFUQUxfU0VORF9NU0dfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDIzLAorfTsKKworI2RlZmluZSBBX0ZBVEFMX1VORVhQRUNURURfUkVTRUxFQ1RJT05fTVNHCTB4MDAwMDIwMDAKK3N0YXRpYyB1MzIgQV9GQVRBTF9VTkVYUEVDVEVEX1JFU0VMRUNUSU9OX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0dPT0RfU1RBVFVTCTB4MDAwMDAwMDEKK3N0YXRpYyB1MzIgQV9HT09EX1NUQVRVU191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0dPT0RfU1RBVFVTX0FGVEVSX1NUQVRVUwkweDAwMDAwNDAxCitzdGF0aWMgdTMyIEFfR09PRF9TVEFUVVNfQUZURVJfU1RBVFVTX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDEyOSwKK307CisKKyNkZWZpbmUgQV9JREVOVElGWV9NU0cJMHgwMDAwMDA4MAorc3RhdGljIHUzMiBBX0lERU5USUZZX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX0lERU5USUZZX01TR19NQVNLCTB4MDAwMDAwN2YKK3N0YXRpYyB1MzIgQV9JREVOVElGWV9NU0dfTUFTS191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX01TR19JTgkweDAwMDAwMDUwCitzdGF0aWMgdTMyIEFfTVNHX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfTVNHX0lOX0FGVEVSX0NNRAkweDAwMDAwMzUwCitzdGF0aWMgdTMyIEFfTVNHX0lOX0FGVEVSX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOWQsCit9OworCisjZGVmaW5lIEFfTVNHX0lOX0FGVEVSX0RBVEFfSU4JMHgwMDAwMDU1MAorc3RhdGljIHUzMiBBX01TR19JTl9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBlMSwKK307CisKKyNkZWZpbmUgQV9NU0dfSU5fQUZURVJfREFUQV9PVVQJMHgwMDAwMDY1MAorc3RhdGljIHUzMiBBX01TR19JTl9BRlRFUl9EQVRBX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxMDUsCit9OworCisjZGVmaW5lIEFfTVNHX0lOX0FGVEVSX1NUQVRVUwkweDAwMDAwNDQwCitzdGF0aWMgdTMyIEFfTVNHX0lOX0FGVEVSX1NUQVRVU191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxMjMsCit9OworCisjZGVmaW5lIEFfTVNHX0lOX0JFRk9SRV9DTUQJMHgwMDAwMDI1MAorc3RhdGljIHUzMiBBX01TR19JTl9CRUZPUkVfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBiOSwKK307CisKKyNkZWZpbmUgQV9NU0dfSU5fRFVSSU5HX0RBVEFfSU4JMHgwMDAwMDc1MAorc3RhdGljIHUzMiBBX01TR19JTl9EVVJJTkdfREFUQV9JTl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOTEsCit9OworCisjZGVmaW5lIEFfTVNHX09VVAkweDAwMDAwMDkwCitzdGF0aWMgdTMyIEFfTVNHX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX01TR19PVVRfQUZURVJfREFUQV9JTgkweDAwMDAwNTkwCitzdGF0aWMgdTMyIEFfTVNHX09VVF9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBjNywKK307CisKKyNkZWZpbmUgQV9NZXNzYWdlQ291bnQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX01lc3NhZ2VDb3VudF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMWUsCit9OworCisjZGVmaW5lIEFfTWVzc2FnZUxvY2F0aW9uCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9NZXNzYWdlTG9jYXRpb25fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDFmLAorfTsKKworI2RlZmluZSBBX05PVF9NU0dfSU4JMHgwMDAwMDAzMAorc3RhdGljIHUzMiBBX05PVF9NU0dfSU5fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9OT1RfTVNHX0lOX0FGVEVSX1NUQVRVUwkweDAwMDAwNDMwCitzdGF0aWMgdTMyIEFfTk9UX01TR19JTl9BRlRFUl9TVEFUVVNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTFiLAorfTsKKworI2RlZmluZSBBX05PVF9NU0dfT1VUCTB4MDAwMDAwMTAKK3N0YXRpYyB1MzIgQV9OT1RfTVNHX09VVF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX05PVF9NU0dfT1VUX0FGVEVSX1NFTEVDVElPTgkweDAwMDAwMTEwCitzdGF0aWMgdTMyIEFfTk9UX01TR19PVVRfQUZURVJfU0VMRUNUSU9OX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwNywKK307CisKKyNkZWZpbmUgQV9QQVJJVFlfRVJST1JfTVNHCTB4MDAwMDAwMDkKK3N0YXRpYyB1MzIgQV9QQVJJVFlfRVJST1JfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfUkVKRUNUX01TRwkweDAwMDAwMDA3CitzdGF0aWMgdTMyIEFfUkVKRUNUX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1JFSkVDVF9NU0dfQkVGT1JFX0NNRAkweDAwMDAwMjcwCitzdGF0aWMgdTMyIEFfUkVKRUNUX01TR19CRUZPUkVfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfUkVKRUNUX01TR19SCTB4MDAwMDAwNzAKK3N0YXRpYyB1MzIgQV9SRUpFQ1RfTVNHX1JfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9SRVNFTEVDVEVEX0RVUklOR19TRUxFQ1RJT04JMHgwMDAwMTAwMAorc3RhdGljIHUzMiBBX1JFU0VMRUNURURfRFVSSU5HX1NFTEVDVElPTl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMGIsCit9OworCisjZGVmaW5lIEFfUkVTRUxFQ1RJT05fSURFTlRJRklFRAkweDAwMDAxMDAzCitzdGF0aWMgdTMyIEFfUkVTRUxFQ1RJT05fSURFTlRJRklFRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMTEsCisJMHgwMDAwMDAxNSwKK307CisKKyNkZWZpbmUgQV9SRVNUT1JFX0RBVEFfUFRSU19NU0cJMHgwMDAwMDAwMworc3RhdGljIHUzMiBBX1JFU1RPUkVfREFUQV9QVFJTX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOGUsCisJMHgwMDAwMDA5OCwKKwkweDAwMDAwMGI0LAorCTB4MDAwMDAwZGMsCisJMHgwMDAwMDEwMCwKK307CisKKyNkZWZpbmUgQV9SZWNlaXZlTXNnQWRkcmVzcwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfUmVjZWl2ZU1zZ0FkZHJlc3NfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDBmLAorCTB4MDAwMDAwMTMsCisJMHgwMDAwMDAyOSwKKwkweDAwMDAwMDMxLAorCTB4MDAwMDAwMzcsCisJMHgwMDAwMDA0NywKKwkweDAwMDAwMDRkLAorCTB4MDAwMDAwNTMsCisJMHgwMDAwMDA1OSwKKwkweDAwMDAwMDVmLAorCTB4MDAwMDAwODksCisJMHgwMDAwMDA5MywKKwkweDAwMDAwMGIxLAorCTB4MDAwMDAwZDcsCisJMHgwMDAwMDBmYiwKKwkweDAwMDAwMTFkLAorfTsKKworI2RlZmluZSBBX1NBVkVfREFUQV9QVFJTX01TRwkweDAwMDAwMDAyCitzdGF0aWMgdTMyIEFfU0FWRV9EQVRBX1BUUlNfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA4YywKKwkweDAwMDAwMDk2LAorCTB4MDAwMDAwYjIsCisJMHgwMDAwMDBkYSwKKwkweDAwMDAwMGZlLAorfTsKKworI2RlZmluZSBBX1NEVFJfTVNHCTB4MDAwMDAwMDEKK3N0YXRpYyB1MzIgQV9TRFRSX01TR191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1NEVFJfTVNHX0FGVEVSX0NNRAkweDAwMDAwMzYwCitzdGF0aWMgdTMyIEFfU0RUUl9NU0dfQUZURVJfQ01EX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfU0RUUl9NU0dfQkVGT1JFX0NNRAkweDAwMDAwMjYwCitzdGF0aWMgdTMyIEFfU0RUUl9NU0dfQkVGT1JFX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1NEVFJfTVNHX1IJMHgwMDAwMDA2MAorc3RhdGljIHUzMiBBX1NEVFJfTVNHX1JfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9TR1NjcmlwdFN0YXJ0QWRkcmVzcwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfU0dTY3JpcHRTdGFydEFkZHJlc3NfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGJmLAorCTB4MDAwMDAwY2YsCit9OworCisjZGVmaW5lIEFfU0lNUExFX1RBR19NU0cJMHgwMDAwMDAyMAorc3RhdGljIHUzMiBBX1NJTVBMRV9UQUdfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfU3RhdHVzQWRkcmVzcwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfU3RhdHVzQWRkcmVzc191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxMTksCit9OworCisjZGVmaW5lIEFfVFdPX0JZVEVfTVNHCTB4MDAwMDAwMjAKK3N0YXRpYyB1MzIgQV9UV09fQllURV9NU0dfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDJjLAorfTsKKworI2RlZmluZSBBX1RXT19CWVRFX01TR19NQVNLCTB4MDAwMDAwMGYKK3N0YXRpYyB1MzIgQV9UV09fQllURV9NU0dfTUFTS191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMmMsCit9OworCisjZGVmaW5lIEFfVU5FWFBFQ1RFRF9NU0cJMHgwMDAwMDA0MAorc3RhdGljIHUzMiBBX1VORVhQRUNURURfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfVU5FWFBFQ1RFRF9NU0dfQkVGT1JFX0NNRAkweDAwMDAwMjQwCitzdGF0aWMgdTMyIEFfVU5FWFBFQ1RFRF9NU0dfQkVGT1JFX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX1VORVhQRUNURURfUEhBU0UJMHgwMDAwMDAyMAorc3RhdGljIHUzMiBBX1VORVhQRUNURURfUEhBU0VfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9VTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0NNRAkweDAwMDAwMzIwCitzdGF0aWMgdTMyIEFfVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9DTURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDgzLAorfTsKKworI2RlZmluZSBBX1VORVhQRUNURURfUEhBU0VfQUZURVJfREFUQV9JTgkweDAwMDAwNTIwCitzdGF0aWMgdTMyIEFfVU5FWFBFQ1RFRF9QSEFTRV9BRlRFUl9EQVRBX0lOX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBjOSwKK307CisKKyNkZWZpbmUgQV9VTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUCTB4MDAwMDA2MjAKK3N0YXRpYyB1MzIgQV9VTkVYUEVDVEVEX1BIQVNFX0FGVEVSX0RBVEFfT1VUX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDBkNSwKK307CisKKyNkZWZpbmUgQV9VTkVYUEVDVEVEX1BIQVNFX0JFRk9SRV9DTUQJMHgwMDAwMDIyMAorc3RhdGljIHUzMiBBX1VORVhQRUNURURfUEhBU0VfQkVGT1JFX0NNRF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNzcsCit9OworCisjZGVmaW5lIEFfV0RUUl9NU0cJMHgwMDAwMDAwMworc3RhdGljIHUzMiBBX1dEVFJfTVNHX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfV0RUUl9NU0dfQUZURVJfQ01ECTB4MDAwMDAzYTAKK3N0YXRpYyB1MzIgQV9XRFRSX01TR19BRlRFUl9DTURfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9XRFRSX01TR19SCTB4MDAwMDAwYTAKK3N0YXRpYyB1MzIgQV9XRFRSX01TR19SX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEVudF9EaXNjb25uZWN0MQkweDAwMDAwMmE4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0MgkweDAwMDAwMmIwCisjZGVmaW5lIEVudF9EaXNjb25uZWN0MwkweDAwMDAwM2E4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0NAkweDAwMDAwM2IwCisjZGVmaW5lIEVudF9EaXNjb25uZWN0NQkweDAwMDAwM2QwCisjZGVmaW5lIEVudF9EaXNjb25uZWN0NgkweDAwMDAwM2Q4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0NwkweDAwMDAwNDQ4CisjZGVmaW5lIEVudF9EaXNjb25uZWN0OAkweDAwMDAwNDUwCisjZGVmaW5lIEVudF9GaW5pc2gxCTB4MDAwMDA0YTAKKyNkZWZpbmUgRW50X0ZpbmlzaDIJMHgwMDAwMDRhOAorI2RlZmluZSBFbnRfRmluaXNoQ29tbWFuZENvbXBsZXRlCTB4MDAwMDA0OTAKKyNkZWZpbmUgRW50X0dldFJlc2VsZWN0aW9uRGF0YQkweDAwMDAwMDM4CisjZGVmaW5lIEVudF9HZXRSZXNlbGVjdGlvbldpdGhUYWcJMHgwMDAwMDA0OAorI2RlZmluZSBFbnRfSWdub3JlTWVzc2FnZQkweDAwMDAwMTg4CisjZGVmaW5lIEVudF9Nc2dJbkR1cmluZ0RhdGEJMHgwMDAwMDIxOAorI2RlZmluZSBFbnRfUmVjZWl2ZU1lc3NhZ2UJMHgwMDAwMDBhMAorI2RlZmluZSBFbnRfU2VsZWN0ZWRBc1RhcmdldAkweDAwMDAwMDU4CisjZGVmaW5lIEVudF9TZW5kQ29tbWFuZAkweDAwMDAwMWM4CisjZGVmaW5lIEVudF9TZW5kTWVzc2FnZQkweDAwMDAwMDc4CisjZGVmaW5lIEVudF9TZW5kTWVzc2FnZVBoYXNlTWlzbWF0Y2gJMHgwMDAwMDA5MAorI2RlZmluZSBFbnRfU2VuZE1lc3NhZ2VXaXRoQVROCTB4MDAwMDAxOTgKKyNkZWZpbmUgRW50X1N0YXJ0VXAJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBMQUJFTFBBVENIRVNbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwMSwKKwkweDAwMDAwMDAzLAorCTB4MDAwMDAwMDUsCisJMHgwMDAwMDAwOSwKKwkweDAwMDAwMDI3LAorCTB4MDAwMDAwMmIsCisJMHgwMDAwMDAzOSwKKwkweDAwMDAwMDNiLAorCTB4MDAwMDAwM2QsCisJMHgwMDAwMDAzZiwKKwkweDAwMDAwMDQxLAorCTB4MDAwMDAwNmIsCisJMHgwMDAwMDA2ZCwKKwkweDAwMDAwMDczLAorCTB4MDAwMDAwNzUsCisJMHgwMDAwMDA3YiwKKwkweDAwMDAwMDdkLAorCTB4MDAwMDAwN2YsCisJMHgwMDAwMDA4MSwKKwkweDAwMDAwMDg3LAorCTB4MDAwMDAwOGIsCisJMHgwMDAwMDA4ZCwKKwkweDAwMDAwMDhmLAorCTB4MDAwMDAwOTUsCisJMHgwMDAwMDA5NywKKwkweDAwMDAwMDk5LAorCTB4MDAwMDAwOWIsCisJMHgwMDAwMDBhMSwKKwkweDAwMDAwMGE1LAorCTB4MDAwMDAwYWYsCisJMHgwMDAwMDBiMywKKwkweDAwMDAwMGI1LAorCTB4MDAwMDAwYjcsCisJMHgwMDAwMDBiZCwKKwkweDAwMDAwMGMxLAorCTB4MDAwMDAwYzMsCisJMHgwMDAwMDBjNSwKKwkweDAwMDAwMGNkLAorCTB4MDAwMDAwZDEsCisJMHgwMDAwMDBkMywKKwkweDAwMDAwMGQ5LAorCTB4MDAwMDAwZGIsCisJMHgwMDAwMDBkZCwKKwkweDAwMDAwMGRmLAorCTB4MDAwMDAwZTUsCisJMHgwMDAwMDBlZiwKKwkweDAwMDAwMGY5LAorCTB4MDAwMDAwZmQsCisJMHgwMDAwMDBmZiwKKwkweDAwMDAwMTAxLAorCTB4MDAwMDAxMDMsCisJMHgwMDAwMDEwOSwKKwkweDAwMDAwMTBkLAorCTB4MDAwMDAxMTcsCisJMHgwMDAwMDExZiwKKwkweDAwMDAwMTIxLAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyCW9mZnNldDsKKwl2b2lkCQkqYWRkcmVzczsKK30gRVhURVJOQUxfUEFUQ0hFU1tdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKK3N0YXRpYyB1MzIgSU5TVFJVQ1RJT05TIF9fYXR0cmlidXRlKCh1bnVzZWQpKQk9IDE0OTsKK3N0YXRpYyB1MzIgUEFUQ0hFUyBfX2F0dHJpYnV0ZSgodW51c2VkKSkJPSA1NjsKK3N0YXRpYyB1MzIgRVhURVJOQUxfUEFUQ0hFU19MRU4gX19hdHRyaWJ1dGUoKHVudXNlZCkpCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguYyBiL2RyaXZlcnMvc2NzaS81M2M3eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWFkNTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5jCkBAIC0wLDAgKzEsNjEwMiBAQAorLyoKKyAqIDUzYzcxMCBkcml2ZXIuICBNb2RpZmllZCBmcm9tIERyZXcgRWNraGFyZHRzIGRyaXZlcgorICogZm9yIDUzYzgxMCBieSBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCisgKiBDaGVjayBvdXQgUEVSTV9PUFRJT05TIGFuZCBFWFBFQ1RFRF9DTE9DSywgd2hpY2ggbWF5IGJlIGRlZmluZWQgaW4gdGhlCisgKiByZWxldmFudCBtYWNoaW5lIHNwZWNpZmljIGZpbGUgKGVnLiBtdm1lMTZ4LltjaF0sIGFtaWdhN3h4LltjaF0pLgorICogVGhlcmUgYXJlIGFsc28gY3VycmVudGx5IHNvbWUgZGVmaW5lcyBhdCB0aGUgdG9wIG9mIDUzYzd4eC5zY3IuCisgKiBUaGUgY2hpcCB0eXBlIGlzICNkZWZpbmVkIGluIHNjcmlwdF9hc20ucGwsIGFzIHdlbGwgYXMgdGhlIE1ha2VmaWxlLgorICogSG9zdCBzY3NpIElEIGV4cGVjdGVkIHRvIGJlIDcgLSBzZWUgTkNSNTNjN3gwX2luaXQoKS4KKyAqCisgKiBJIGhhdmUgcmVtb3ZlZCB0aGUgUENJIGNvZGUgYW5kIHNvbWUgb2YgdGhlIDUzYzh4eCBzcGVjaWZpYyBjb2RlIC0gCisgKiBzaW1wbHkgdG8gbWFrZSB0aGlzIGZpbGUgc21hbGxlciBhbmQgZWFzaWVyIHRvIG1hbmFnZS4KKyAqCisgKiBNVk1FMTZ4IGlzc3VlczoKKyAqICAgUHJvYmxlbXMgdHJ5aW5nIHRvIHJlYWQgYW55IGNoaXAgcmVnaXN0ZXJzIGluIE5DUjUzYzd4MF9pbml0KCksIGFzIHRoZXkKKyAqICAgbWF5IG5ldmVyIGhhdmUgYmVlbiBzZXQgYnkgMTZ4QnVnIChlZy4gSWYga2VybmVsIGhhcyBjb21lIGluIG92ZXIgdGZ0cCkuCisgKi8KKworLyoKKyAqIEFkYXB0ZWQgZm9yIExpbnV4L202OGsgQW1pZ2EgcGxhdGZvcm1zIGZvciB0aGUgQTQwMDBUL0E0MDkxIGFuZAorICogV2FycEVuZ2luZSBTQ1NJIGNvbnRyb2xsZXJzLgorICogQnkgQWxhbiBIb3VyaWhhbmUgPGFsYW5oQGZhaXJsaXRlLmRlbW9uLmNvLnVrPgorICogVGhhbmtzIHRvIFJpY2hhcmQgSGlyc3QgZm9yIG1ha2luZyBpdCBwb3NzaWJsZSB3aXRoIHRoZSBNVk1FIGFkZGl0aW9ucworICovCisKKy8qCisgKiA1M2M3MTAgcmV2IDAgZG9lc24ndCBzdXBwb3J0IGFkZCB3aXRoIGNhcnJ5LiAgUmV2IDEgYW5kIDIgZG9lcy4gIFRvCisgKiBvdmVyY29tZSB0aGlzIHByb2JsZW0geW91IGNhbiBkZWZpbmUgRk9SQ0VfRFNBX0FMSUdOTUVOVCwgd2hpY2ggZW5zdXJlcworICogdGhhdCB0aGUgRFNBIGFkZHJlc3MgaXMgYWx3YXlzIHh4eHh4eDAwLiAgSWYgZGlzY29ubmVjdGlvbiBpcyBub3QgYWxsb3dlZCwKKyAqIHRoZW4gdGhlIHNjcmlwdCBvbmx5IGV2ZXIgdHJpZXMgdG8gYWRkIHNtYWxsICg8IDI1NikgcG9zaXRpdmUgb2Zmc2V0cyB0bworICogRFNBLCBzbyBsYWNrIG9mIGNhcnJ5IGlzbid0IGEgcHJvYmxlbS4gIEZPUkNFX0RTQV9BTElHTk1FTlQgY2FuLCBvZiBjb3Vyc2UsCisgKiBiZSBkZWZpbmVkIGZvciBhbGwgY2hpcCByZXZpc2lvbnMgYXQgYSBzbWFsbCBjb3N0IGluIG1lbW9yeSB1c2FnZS4KKyAqLworCisjZGVmaW5lIEZPUkNFX0RTQV9BTElHTk1FTlQKKworLyoKKyAqIFNlbGVjdGlvbiB0aW1lciBkb2VzIG5vdCBhbHdheXMgd29yayBvbiB0aGUgNTNjNzEwLCBkZXBlbmRpbmcgb24gdGhlCisgKiB0aW1pbmcgYXQgdGhlIGxhc3QgZGlzY29ubmVjdCwgaWYgdGhpcyBpcyBhIHByb2JsZW0gZm9yIHlvdSwgdHJ5CisgKiB1c2luZyB2YWxpZGlkcyBhcyBkZXRhaWxlZCBiZWxvdy4KKyAqCisgKiBPcHRpb25zIGZvciB0aGUgTkNSN3h4IGRyaXZlcgorICoKKyAqIG5vYXN5bmM6MAkJLQlkaXNhYmxlcyBzeW5jIGFuZCBhc3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyAqIG5vc3luYzowCQktCWRpc2FibGVzIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIChkb2VzIGFzeW5jKQorICogbm9kaXNjb25uZWN0OjAJLQlkaXNhYmxlcyBkaXNjb25uZWN0aW9uCisgKiB2YWxpZGlkczoweD8/CS0JQml0bWFzayBmaWVsZCB0aGF0IGRpc2FsbG93cyBjZXJ0YWluIElEJ3MuCisgKgkJCS0JZS5nLgkweDAzCWFsbG93cyBJRCAwLDEKKyAqCQkJLQkJMHgxRglhbGxvd3MgSUQgMCwxLDIsMyw0CisgKiBvcHRoaTpuCQktCXJlcGxhY2UgdG9wIHdvcmQgb2Ygb3B0aW9ucyB3aXRoICduJworICogb3B0bG86bgkJLQlyZXBsYWNlIGJvdHRvbSB3b3JkIG9mIG9wdGlvbnMgd2l0aCAnbicKKyAqCQkJLQlBTFdBWVMgU1BFQ0lGWSBvcHRoaSBUSEVOIG9wdGxvIDw8PDw8PDw8PDwKKyAqLworCisvKgorICogUEVSTV9PUFRJT05TIGFyZSBkcml2ZXIgb3B0aW9ucyB3aGljaCB3aWxsIGJlIGVuYWJsZWQgZm9yIGFsbCBOQ1IgYm9hcmRzCisgKiBpbiB0aGUgc3lzdGVtIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbiB0aW1lLgorICoKKyAqIERvbid0IFRISU5LIGFib3V0IHRvdWNoaW5nIHRoZXNlIGluIFBFUk1fT1BUSU9OUyA6IAorICogICBPUFRJT05fTUVNT1JZX01BUFBFRCAKKyAqIAk2ODB4MCBkb2Vzbid0IGhhdmUgYW4gSU8gbWFwIQorICoKKyAqICAgT1BUSU9OX0RFQlVHX1RFU1QxCisgKglUZXN0IDEgZG9lcyBidXMgbWFzdGVyaW5nIGFuZCBpbnRlcnJ1cHQgdGVzdHMsIHdoaWNoIHdpbGwgaGVscCB3ZWVkIAorICoJb3V0IGJyYWluIGRhbWFnZWQgbWFpbiBib2FyZHMuCisgKgorICogT3RoZXIgUEVSTV9PUFRJT05TIHNldHRpbmdzIGFyZSBsaXN0ZWQgYmVsb3cuICBOb3RlIHRoZSBhY3R1YWwgb3B0aW9ucworICogcmVxdWlyZWQgYXJlIHNldCBpbiB0aGUgcmVsZXZhbnQgZmlsZSAobXZtZTE2eC5jLCBhbWlnYTd4eC5jLCBldGMpOgorICoKKyAqICAgT1BUSU9OX05PX0FTWU5DCisgKglEb24ndCBuZWdvdGlhdGUgZm9yIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMgb24gdGhlIGZpcnN0IGNvbW1hbmQgCisgKgl3aGVuIE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMgaXMgc2V0LiAgVXNlZnVsIGZvciBkYWluIGJyYW1hZ2VkCisgKglkZXZpY2VzIHdoaWNoIGRvIHNvbWV0aGluZyBiYWQgcmF0aGVyIHRoYW4gc2VuZGluZyBhIE1FU1NBR0UgCisgKglSRUpFQ1QgYmFjayB0byB1cyBsaWtlIHRoZXkgc2hvdWxkIGlmIHRoZXkgY2FuJ3QgY29wZS4KKyAqCisgKiAgIE9QVElPTl9TWU5DSFJPTk9VUworICoJRW5hYmxlIHN1cHBvcnQgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycy4gIFRhcmdldCBuZWdvdGlhdGVkIAorICoJc3luY2hyb25vdXMgdHJhbnNmZXJzIHdpbGwgYmUgcmVzcG9uZGVkIHRvLiAgVG8gaW5pdGlhdGUgCisgKglhIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlcXVlc3QsICBjYWxsIAorICoKKyAqCSAgICByZXF1ZXN0X3N5bmNocm9ub3VzIChob3N0bm8sIHRhcmdldCkgCisgKgorICoJZnJvbSB3aXRoaW4gS0dEQi4KKyAqCisgKiAgIE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMKKyAqCU5lZ290aWF0ZSBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIHdpdGggZXZlcnkgdGFyZ2V0IGFmdGVyCisgKglkcml2ZXIgaW5pdGlhbGl6YXRpb24gb3IgYSBTQ1NJIGJ1cyByZXNldC4gIFRoaXMgaXMgYSBiaXQgZGFuZ2Vyb3VzLCAKKyAqCXNpbmNlIHRoZXJlIGFyZSBzb21lIGRhaW4gYnJhbWFnZWQgU0NTSSBkZXZpY2VzIHdoaWNoIHdpbGwgYWNjZXB0CisgKglTRFRSIG1lc3NhZ2VzIGJ1dCBrZWVwIHRhbGtpbmcgYXN5bmNocm9ub3VzbHkuCisgKgorICogICBPUFRJT05fRElTQ09OTkVDVAorICoJRW5hYmxlIHN1cHBvcnQgZm9yIGRpc2Nvbm5lY3QvcmVjb25uZWN0LiAgVG8gY2hhbmdlIHRoZSAKKyAqCWRlZmF1bHQgc2V0dGluZyBvbiBhIGdpdmVuIGhvc3QgYWRhcHRlciwgY2FsbAorICoKKyAqCSAgICByZXF1ZXN0X2Rpc2Nvbm5lY3QgKGhvc3RubywgYWxsb3cpCisgKgorICoJd2hlcmUgYWxsb3cgaXMgbm9uLXplcm8gdG8gYWxsb3csIDAgdG8gZGlzYWxsb3cuCisgKiAKKyAqICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gcnVuIDEwTUh6IEZBU1QgU0NTSS1JSSB0cmFuc2ZlcnMsIHlvdSBzaG91bGQgCisgKiAga25vdyB0aGF0IHRoZSBOQ1IgZHJpdmVyIGN1cnJlbnRseSBpZ25vcmVzIHBhcml0eSBpbmZvcm1hdGlvbi4gIE1vc3QKKyAqICBzeXN0ZW1zIGRvIDVNSHogU0NTSSBmaW5lLiAgSSd2ZSBzZWVuIGEgbG90IHRoYXQgaGF2ZSBwcm9ibGVtcyBmYXN0ZXIKKyAqICB0aGFuIDhNSHouICBUbyBwbGF5IGl0IHNhZmUsIHdlIG9ubHkgcmVxdWVzdCA1TUh6IHRyYW5zZmVycy4KKyAqCisgKiAgSWYgeW91J2QgcmF0aGVyIGdldCAxME1IeiB0cmFuc2ZlcnMsIGVkaXQgc2R0cl9tZXNzYWdlIGFuZCBjaGFuZ2UgCisgKiAgdGhlIGZvdXJ0aCBieXRlIGZyb20gNTAgdG8gMjUuCisgKi8KKworLyoKKyAqIFNwb25zb3JlZCBieSAKKyAqCWlYIE11bHRpdXNlciBNdWx0aXRhc2tpbmcgTWFnYXppbmUKKyAqCUhhbm5vdmVyLCBHZXJtYW55CisgKglobUBpeC5kZQorICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgZHJld0BQb29oU3RpY2tzLk9SRworICoJKzEgKDMwMykgNzg2LTc5NzUKKyAqCisgKiBUb2xlckFOVCBhbmQgU0NTSSBTQ1JJUFRTIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTkNSIENvcnBvcmF0aW9uLgorICogCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSNTNDODEwIAorICogU0NTSSBJL08gUHJvY2Vzc29yCisgKiBQcm9ncmFtbWVyJ3MgR3VpZGUKKyAqCisgKiBOQ1IgNTNDODEwCisgKiBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yCisgKiBEYXRhIE1hbnVhbAorICoKKyAqIE5DUiA1M0M4MTAvNTNDODIwCisgKiBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yIERlc2lnbiBJbiBHdWlkZQorICoKKyAqIEZvciBsaXRlcmF0dXJlIG9uIFN5bWJpb3MgTG9naWMgSW5jLiBmb3JtZXJseSBOQ1IsIFNDU0ksIAorICogYW5kIENvbW11bmljYXRpb24gcHJvZHVjdHMgcGxlYXNlIGNhbGwgKDgwMCkgMzM0LTU0NTQgb3IKKyAqICg3MTkpIDUzNi0zMzAwLiAKKyAqIAorICogUENJIEJJT1MgU3BlY2lmaWNhdGlvbiBSZXZpc2lvbgorICogUENJIExvY2FsIEJ1cyBTcGVjaWZpY2F0aW9uCisgKiBQQ0kgU3lzdGVtIERlc2lnbiBHdWlkZQorICoKKyAqIFBDSSBTcGVjaWFsIEludGVyZXN0IEdyb3VwCisgKiBNL1MgSEYzLTE1QQorICogNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheQorICogSGlsbHNib3JvLCBPcmVnb24gOTcxMjQtNjQ5NworICogKzEgKDUwMykgNjk2LTIwMDAgCisgKiArMSAoODAwKSA0MzMtNTE3NworICovCisKKy8qCisgKiBEZXNpZ24gaXNzdWVzIDogCisgKiBUaGUgY3VtdWxhdGl2ZSBsYXRlbmN5IG5lZWRlZCB0byBwcm9wYWdhdGUgYSByZWFkL3dyaXRlIHJlcXVlc3QgCisgKiB0aHJvdWdoIHRoZSBmaWxlIHN5c3RlbSwgYnVmZmVyIGNhY2hlLCBkcml2ZXIgc3RhY2tzLCBTQ1NJIGhvc3QsIGFuZCAKKyAqIFNDU0kgZGV2aWNlIGlzIHVsdGltYXRlbHkgdGhlIGxpbWl0aW5nIGZhY3RvciBpbiB0aHJvdWdocHV0IG9uY2Ugd2UgCisgKiBoYXZlIGEgc3VmZmljaWVudGx5IGZhc3QgaG9zdCBhZGFwdGVyLgorICogIAorICogU28sIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIHdlIHdhbnQgdG8ga2VlcCB0aGUgcmF0aW8gb2YgbGF0ZW5jeSB0byBkYXRhIAorICogdHJhbnNmZXIgdGltZSB0byBhIG1pbmltdW0gYnkKKyAqIDEuICBNaW5pbWl6aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWFuZHMgc2VudCAodHlwaWNhbCBjb21tYW5kIGxhdGVuY3kKKyAqCWluY2x1ZGluZyBkcml2ZSBhbmQgYnVzIG1hc3RlcmluZyBob3N0IG92ZXJoZWFkIGlzIGFzIGhpZ2ggYXMgNC41bXMpCisgKgl0byB0cmFuc2ZlciBhIGdpdmVuIGFtb3VudCBvZiBkYXRhLiAgCisgKgorICogICAgICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBwbGFjaW5nIG5vIGFyYml0cmFyeSBsaW1pdCBvbiB0aGUgbnVtYmVyCisgKglvZiBzY2F0dGVyL2dhdGhlciBidWZmZXJzIHN1cHBvcnRlZCwgc2luY2Ugd2UgY2FuIHRyYW5zZmVyIDFLCisgKglwZXIgc2NhdHRlci9nYXRoZXIgYnVmZmVyIHdpdGhvdXQgRXJpYydzIGNsdXN0ZXIgcGF0Y2hlcywgCisgKgk0SyB3aXRoLiAgCisgKgorICogMi4gIE1pbmltaXppbmcgdGhlIG51bWJlciBvZiBmYXRhbCBpbnRlcnJ1cHRzIHNlcnZpY2VkLCBzaW5jZQorICogCWZhdGFsIGludGVycnVwdHMgaGFsdCB0aGUgU0NTSSBJL08gcHJvY2Vzc29yLiAgQmFzaWNhbGx5LAorICoJdGhpcyBtZWFucyBvZmZsb2FkaW5nIHRoZSBwcmFjdGljYWwgbWF4aW11bSBhbW91bnQgb2YgcHJvY2Vzc2luZyAKKyAqCXRvIHRoZSBTQ1NJIGNoaXAuCisgKiAKKyAqCU9uIHRoZSBOQ1I1M2M4MTAvODIwLzcyMCwgIHRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIAorICoJCWludGVycnVwdC1vbi10aGUtZmx5IHNpZ25hbHMgd2hlbiBjb21tYW5kcyBjb21wbGV0ZSwgCisgKgkJYW5kIG9ubHkgaGFuZGxpbmcgZmF0YWwgZXJyb3JzIGFuZCBTRFRSIC8gV0RUUiAJbWVzc2FnZXMgCisgKgkJaW4gdGhlIGhvc3QgY29kZS4KKyAqCisgKglPbiB0aGUgTkNSNTNjNzEwLCBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQgYXMgb24gdGhlIE5DUjUzYzh4MCwKKyAqCQlvbmx5IHRoZSBsYWNrIG9mIGEgaW50ZXJydXB0LW9uLXRoZS1mbHkgZmFjaWxpdHkgY29tcGxpY2F0ZXMKKyAqCQl0aGluZ3MuICAgQWxzbywgU0NTSSBJRCByZWdpc3RlcnMgYW5kIGNvbW1hbmRzIGFyZSAKKyAqCQliaXQgZmllbGRlZCByYXRoZXIgdGhhbiBiaW5hcnkgZW5jb2RlZC4KKyAqCQkKKyAqIAlPbiB0aGUgTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYsIG9wZXJhdGlvbnMgdGhhdCBhcmUgZG9uZSB2aWEgCisgKgkJaW5kaXJlY3QsIHRhYmxlIG1vZGUgb24gdGhlIG1vcmUgYWR2YW5jZWQgY2hpcHMgbXVzdCBiZQorICoJICAgICAgICByZXBsYWNlZCBieSBjYWxscyB0aHJvdWdoIGEganVtcCB0YWJsZSB3aGljaCAKKyAqCQlhY3RzIGFzIGEgc3Vycm9nYXRlIGZvciB0aGUgRFNBLiAgVW5mb3J0dW5hdGVseSwgdGhpcyAKKyAqIAkJd2lsbCBtZWFuIHRoYXQgd2UgbXVzdCBzZXJ2aWNlIGFuIGludGVycnVwdCBmb3IgZWFjaCAKKyAqCQlkaXNjb25uZWN0L3JlY29ubmVjdC4KKyAqIAorICogMy4gIEVsaW1pbmF0aW5nIGxhdGVuY3kgYnkgcGlwZWxpbmluZyBvcGVyYXRpb25zIGF0IHRoZSBkaWZmZXJlbnQgbGV2ZWxzLgorICogCQorICoJVGhpcyBkcml2ZXIgYWxsb3dzIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjb21tYW5kcyB0byBiZSBlbnF1ZXVlZAorICoJZm9yIGVhY2ggdGFyZ2V0L2x1biBjb21iaW5hdGlvbiAoZXhwZXJpbWVudGFsbHksIEkgaGF2ZSBkaXNjb3ZlcmVkCisgKgl0aGF0IHR3byBzZWVtcyB0byB3b3JrIGJlc3QpIGFuZCB3aWxsIHVsdGltYXRlbHkgYWxsb3cgZm9yIAorICoJU0NTSS1JSSB0YWdnZWQgcXVldWluZy4KKyAqIAkKKyAqCisgKiBBcmNoaXRlY3R1cmUgOiAKKyAqIFRoaXMgZHJpdmVyIGlzIGJ1aWx0IGFyb3VuZCBhIExpbnV4IHF1ZXVlIG9mIGNvbW1hbmRzIHdhaXRpbmcgdG8gCisgKiBiZSBleGVjdXRlZCwgYW5kIGEgc2hhcmVkIExpbnV4L05DUiBhcnJheSBvZiBjb21tYW5kcyB0byBzdGFydC4gIENvbW1hbmRzCisgKiBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIGFycmF5ICBieSB0aGUgcnVuX3Byb2Nlc3NfaXNzdWVfcXVldWUoKSBmdW5jdGlvbiAKKyAqIHdoaWNoIGlzIGNhbGxlZCB3aGVuZXZlciBhIGNvbW1hbmQgY29tcGxldGVzLgorICoKKyAqIEFzIGNvbW1hbmRzIGFyZSBjb21wbGV0ZWQsIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyB0cmlnZ2VyZWQsCisgKiBsb29rcyBmb3IgY29tbWFuZHMgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNvbXBsZXRlZCBjb21tYW5kcyB3aXRoCisgKiB2YWxpZCBzdGF0dXMsIHJlbW92ZXMgdGhlc2UgY29tbWFuZHMgZnJvbSBhIGxpc3Qgb2YgcnVubmluZyBjb21tYW5kcywgCisgKiBjYWxscyB0aGUgZG9uZSByb3V0aW5lLCBhbmQgZmxhZ3MgdGhlaXIgdGFyZ2V0L2x1bnMgYXMgbm90IGJ1c3kuCisgKgorICogRHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBpbnRlbGxpZ2VuY2Ugb2YgdGhlIE5DUiBjaGlwcywgY2VydGFpbgorICogY29uY2Vzc2lvbnMgYXJlIG1hZGUuICBJbiBtYW55IGNhc2VzLCBpdCBpcyBlYXNpZXIgdG8gZHluYW1pY2FsbHkgCisgKiBnZW5lcmF0ZS9maXgtdXAgY29kZSByYXRoZXIgdGhhbiBjYWxjdWxhdGUgb24gdGhlIE5DUiBhdCBydW4gdGltZS4gIAorICogU28sIGNvZGUgaXMgZ2VuZXJhdGVkIG9yIGZpeGVkIHVwIGZvcgorICoKKyAqIC0gSGFuZGxpbmcgZGF0YSB0cmFuc2ZlcnMsIHVzaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIE1PVkUgaW5zdHJ1Y3Rpb25zCisgKglpbnRlcnNwZXJzZWQgd2l0aCBDQUxMIE1TR19JTiwgV0hFTiBNU0dJTiBpbnN0cnVjdGlvbnMuCisgKgorICogCVRoZSBEQVRBSU4gYW5kIERBVEFPVVQgcm91dGluZXMJYXJlIHNlcGFyYXRlLCBzbyB0aGF0IGFuIGluY29ycmVjdAorICoJZGlyZWN0aW9uIGNhbiBiZSB0cmFwcGVkLCBhbmQgc3BhY2UgaXNuJ3Qgd2FzdGVkLiAKKyAqCisgKglJdCBtYXkgdHVybiBvdXQgdGhhdCB3ZSdyZSBiZXR0ZXIgb2ZmIHVzaW5nIHNvbWUgc29ydCAKKyAqCW9mIHRhYmxlIGluZGlyZWN0IGluc3RydWN0aW9uIGluIGEgbG9vcCB3aXRoIGEgdmFyaWFibGUKKyAqCXNpemVkIHRhYmxlIG9uIHRoZSBOQ1I1M2M3MTAgYW5kIG5ld2VyIGNoaXBzLgorICoKKyAqIC0gQ2hlY2tpbmcgZm9yIHJlc2VsZWN0aW9uIChOQ1I1M2M3MTAgYW5kIGJldHRlcikKKyAqCisgKiAtIEhhbmRsaW5nIHRoZSBkZXRhaWxzIG9mIFNDU0kgY29udGV4dCBzd2l0Y2hlcyAoTkNSNTNjNzEwIGFuZCBiZXR0ZXIpLAorICoJc3VjaCBhcyByZXByb2dyYW1taW5nIGFwcHJvcHJpYXRlIHN5bmNocm9ub3VzIHBhcmFtZXRlcnMsIAorICoJcmVtb3ZpbmcgdGhlIGRzYSBzdHJ1Y3R1cmUgZnJvbSB0aGUgTkNSJ3MgcXVldWUgb2Ygb3V0c3RhbmRpbmcKKyAqCWNvbW1hbmRzLCBldGMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaWZkZWYgQ09ORklHX0FNSUdBCisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIEJJR19FTkRJQU4KKyNkZWZpbmUgTk9fSU9fU1BBQ0UKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WTUUxNngKKyNpbmNsdWRlIDxhc20vbXZtZTE2eGh3Lmg+CisKKyNkZWZpbmUgQklHX0VORElBTgorI2RlZmluZSBOT19JT19TUEFDRQorI2RlZmluZSBWQUxJRF9JRFMKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JWTUU2MDAwCisjaW5jbHVkZSA8YXNtL2J2bWU2MDAwaHcuaD4KKworI2RlZmluZSBCSUdfRU5ESUFOCisjZGVmaW5lIE5PX0lPX1NQQUNFCisjZGVmaW5lIFZBTElEX0lEUworI2VuZGlmCisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICI1M2M3eHguaCIKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKyNpZmRlZiBOT19JT19TUEFDRQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFrZSB0aGUgZGVmaW5pdGlvbnMgaW4gNTNjN3h4LmggKHdyaXRlOCwgZXRjKSBzbWFsbGVyLAorICogd2UgZG9uJ3QgaGF2ZSBzZXBhcmF0ZSBpL28gc3BhY2UgYW55d2F5LgorICovCisjdW5kZWYgaW5iCisjdW5kZWYgb3V0YgorI3VuZGVmIGludworI3VuZGVmIG91dHcKKyN1bmRlZiBpbmwKKyN1bmRlZiBvdXRsCisjZGVmaW5lIGluYih4KSAgICAgICAgICAxCisjZGVmaW5lIGludyh4KSAgICAgICAgICAxCisjZGVmaW5lIGlubCh4KSAgICAgICAgICAxCisjZGVmaW5lIG91dGIoeCx5KSAgICAgICAxCisjZGVmaW5lIG91dHcoeCx5KSAgICAgICAxCisjZGVmaW5lIG91dGwoeCx5KSAgICAgICAxCisjZW5kaWYKKworc3RhdGljIGludCBjaGVja19hZGRyZXNzICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGR1bXBfZXZlbnRzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgY291bnQpOworc3RhdGljIFNjc2lfQ21uZCAqIHJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgICAgaW50IGZyZWUsIGludCBpc3N1ZSk7CitzdGF0aWMgdm9pZCBoYXJkX3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIG5jcl9zY3NpX3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIHByaW50X2xvdHMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIHZvaWQgc2V0X3N5bmNocm9ub3VzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgdGFyZ2V0LCBpbnQgc3hmZXIsIAorICAgIGludCBzY250bDMsIGludCBub3dfY29ubmVjdGVkKTsKK3N0YXRpYyBpbnQgZGF0YXBhdGhfcmVzaWR1YWwgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIGNvbnN0IGNoYXIgKiBzYmNsX3RvX3BoYXNlIChpbnQgc2JjbCk7CitzdGF0aWMgdm9pZCBwcmludF9wcm9ncmVzcyAoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIHZvaWQgcHJpbnRfcXVldWVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfaXNzdWVfcXVldWUgKHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RhdGljIGludCBzaHV0ZG93biAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBhYm5vcm1hbF9maW5pc2hlZCAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCwgaW50IHJlc3VsdCk7CitzdGF0aWMgaW50IGRpc2FibGUgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIGludCBOQ1I1M2M3eHhfcnVuX3Rlc3RzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBOQ1I1M2M3eDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgdm9pZCBOQ1I1M2M3eDBfaW50Zmx5IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgbmNyX2hhbHQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworc3RhdGljIHZvaWQgaW50cl9waGFzZV9taXNtYXRjaCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgCisgICAgKmNtZCk7CitzdGF0aWMgdm9pZCBpbnRyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCk7CitzdGF0aWMgdm9pZCBwcmludF9kc2EgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHUzMiAqZHNhLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCk7CitzdGF0aWMgaW50IHByaW50X2luc24gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNvbnN0IHUzMiAqaW5zbiwKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsIGludCBrZXJuZWwpOworCitzdGF0aWMgdm9pZCBOQ1I1M2M3eHhfZHNhX2ZpeHVwIChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIE5DUjUzYzd4MF9pbml0X2ZpeHVwIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgTkNSNTNjN3gwX2RzdGF0X3Npcl9pbnRyIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgCisgICAgTkNSNTNjN3gwX2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIE5DUjUzYzd4MF9zb2Z0X3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKKworLyogU2l6ZSBvZiBldmVudCBsaXN0IChwZXIgaG9zdCBhZGFwdGVyKSAqLworc3RhdGljIGludCB0cmFja19ldmVudHMgPSAwOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmZpcnN0X2hvc3QgPSBOVUxMOwkvKiBIZWFkIG9mIGxpc3Qgb2YgTkNSIGJvYXJkcyAqLworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGhlX3RlbXBsYXRlID0gTlVMTDsJCisKKy8qIE5DUjUzYzcxMCBzY3JpcHQgaGFuZGxpbmcgY29kZSAqLworCisjaW5jbHVkZSAiNTNjN3h4X2QuaCIKKyNpZmRlZiBBX2ludF9kZWJ1Z19zeW5jCisjZGVmaW5lIERFQlVHX1NZTkNfSU5UUiBBX2ludF9kZWJ1Z19zeW5jCisjZW5kaWYKK2ludCBOQ1I1M2M3eHhfc2NyaXB0X2xlbiA9IHNpemVvZiAoU0NSSVBUKTsKK2ludCBOQ1I1M2M3eHhfZHNhX2xlbiA9IEFfZHNhX2VuZCArIEVudF9kc2FfemVybyAtIEVudF9kc2FfY29kZV90ZW1wbGF0ZTsKKyNpZmRlZiBGT1JDRV9EU0FfQUxJR05NRU5UCitpbnQgQ21kUGFnZVN0YXJ0ID0gKDAgLSBFbnRfZHNhX3plcm8gLSBzaXplb2Yoc3RydWN0IE5DUjUzYzd4MF9jbWQpKSAmIDB4ZmY7CisjZW5kaWYKKworc3RhdGljIGNoYXIgKnNldHVwX3N0cmluZ3NbXSA9CisJeyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIifTsKKworI2RlZmluZSBNQVhfU0VUVVBfU1RSSU5HUyAoc2l6ZW9mKHNldHVwX3N0cmluZ3MpIC8gc2l6ZW9mKGNoYXIgKikpCisjZGVmaW5lIFNFVFVQX0JVRkZFUl9TSVpFIDIwMAorc3RhdGljIGNoYXIgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFXTsKK3N0YXRpYyBjaGFyIHNldHVwX3VzZWRbTUFYX1NFVFVQX1NUUklOR1NdOworCit2b2lkIG5jcjUzYzd4eF9zZXR1cCAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisgICBpbnQgaTsKKyAgIGNoYXIgKnAxLCAqcDI7CisKKyAgIHAxID0gc2V0dXBfYnVmZmVyOworICAgKnAxID0gJ1wwJzsKKyAgIGlmIChzdHIpCisgICAgICBzdHJuY3B5KHAxLCBzdHIsIFNFVFVQX0JVRkZFUl9TSVpFIC0gc3RybGVuKHNldHVwX2J1ZmZlcikpOworICAgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFIC0gMV0gPSAnXDAnOworICAgcDEgPSBzZXR1cF9idWZmZXI7CisgICBpID0gMDsKKyAgIHdoaWxlICgqcDEgJiYgKGkgPCBNQVhfU0VUVVBfU1RSSU5HUykpIHsKKyAgICAgIHAyID0gc3RyY2hyKHAxLCAnLCcpOworICAgICAgaWYgKHAyKSB7CisgICAgICAgICAqcDIgPSAnXDAnOworICAgICAgICAgaWYgKHAxICE9IHAyKQorICAgICAgICAgICAgc2V0dXBfc3RyaW5nc1tpXSA9IHAxOworICAgICAgICAgcDEgPSBwMiArIDE7CisgICAgICAgICBpKys7CisgICAgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgIHNldHVwX3N0cmluZ3NbaV0gPSBwMTsKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorICAgZm9yIChpPTA7IGk8TUFYX1NFVFVQX1NUUklOR1M7IGkrKykKKyAgICAgIHNldHVwX3VzZWRbaV0gPSAwOworfQorCisKKy8qIGNoZWNrX3NldHVwX3N0cmluZ3MoKSByZXR1cm5zIGluZGV4IGlmIGtleSBmb3VuZCwgMCBpZiBub3QKKyAqLworCitzdGF0aWMgaW50IGNoZWNrX3NldHVwX3N0cmluZ3MoY2hhciAqa2V5LCBpbnQgKmZsYWdzLCBpbnQgKnZhbCwgY2hhciAqYnVmKQoreworaW50IHg7CitjaGFyICpjcDsKKworICAgZm9yICAoeD0wOyB4PE1BWF9TRVRVUF9TVFJJTkdTOyB4KyspIHsKKyAgICAgIGlmIChzZXR1cF91c2VkW3hdKQorICAgICAgICAgY29udGludWU7CisgICAgICBpZiAoIXN0cm5jbXAoc2V0dXBfc3RyaW5nc1t4XSwga2V5LCBzdHJsZW4oa2V5KSkpCisgICAgICAgICBicmVhazsKKyAgICAgIGlmICghc3RybmNtcChzZXR1cF9zdHJpbmdzW3hdLCAibmV4dCIsIHN0cmxlbigibmV4dCIpKSkKKyAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgaWYgKHggPT0gTUFYX1NFVFVQX1NUUklOR1MpCisgICAgICByZXR1cm4gMDsKKyAgIHNldHVwX3VzZWRbeF0gPSAxOworICAgY3AgPSBzZXR1cF9zdHJpbmdzW3hdICsgc3RybGVuKGtleSk7CisgICAqdmFsID0gLTE7CisgICBpZiAoKmNwICE9ICc6JykKKyAgICAgIHJldHVybiArK3g7CisgICBjcCsrOworICAgaWYgKCgqY3AgPj0gJzAnKSAmJiAoKmNwIDw9ICc5JykpIHsKKyAgICAgICp2YWwgPSBzaW1wbGVfc3RydG91bChjcCxOVUxMLDApOworICAgICAgfQorICAgcmV0dXJuICsreDsKK30KKworCisKKy8qCisgKiBLTk9XTiBCVUdTIDoKKyAqIC0gVGhlcmUgaXMgc29tZSBzb3J0IG9mIGNvbmZsaWN0IHdoZW4gdGhlIFBQUCBkcml2ZXIgaXMgY29tcGlsZWQgd2l0aCAKKyAqIAlzdXBwb3J0IGZvciAxNiBjaGFubmVscz8KKyAqIAorICogLSBPbiBzeXN0ZW1zIHdoaWNoIHByZWRhdGUgdGhlIDEuMy54IGluaXRpYWxpemF0aW9uIG9yZGVyIGNoYW5nZSwKKyAqICAgICAgdGhlIE5DUiBkcml2ZXIgd2lsbCBjYXVzZSBDYW5ub3QgZ2V0IGZyZWUgcGFnZSBtZXNzYWdlcyB0byBhcHBlYXIuICAKKyAqICAgICAgVGhlc2UgYXJlIGhhcm1sZXNzLCBidXQgSSBkb24ndCBrbm93IG9mIGFuIGVhc3kgd2F5IHRvIGF2b2lkIHRoZW0uCisgKgorICogLSBXaXRoIE9QVElPTl9ESVNDT05ORUNULCBvbiB0d28gc3lzdGVtcyB1bmRlciB1bmtub3duIGNpcmN1bXN0YW5jZXMsCisgKgl3ZSBnZXQgYSBQSEFTRSBNSVNNQVRDSCB3aXRoIERTQSBzZXQgdG8gemVybyAoc3VnZ2VzdHMgdGhhdCB3ZSAKKyAqCWFyZSBvY2N1cnJpbmcgc29tZXdoZXJlIGluIHRoZSByZXNlbGVjdGlvbiBjb2RlKSB3aGVyZSAKKyAqCURTUD1zb21lIHZhbHVlIERDTUR8REJDPXNhbWUgdmFsdWUuICAKKyAqIAkKKyAqCUNsb3NlciBpbnNwZWN0aW9uIHN1Z2dlc3RzIHRoYXQgd2UgbWF5IGJlIHRyeWluZyB0byBleGVjdXRlCisgKglzb21lIHBvcnRpb24gb2YgdGhlIERTQT8KKyAqIHNjc2kwIDogaGFuZGxpbmcgcmVzaWR1YWwgdHJhbnNmZXIgKCsgMCBieXRlcyBmcm9tIERNQSBGSUZPKQorICogc2NzaTAgOiBoYW5kbGluZyByZXNpZHVhbCB0cmFuc2ZlciAoKyAwIGJ5dGVzIGZyb20gRE1BIEZJRk8pCisgKiBzY3NpMCA6IG5vIGN1cnJlbnQgY29tbWFuZCA6IHVuZXhwZWN0ZWQgcGhhc2UgTVNHSU4uCisgKiAgICAgICAgIERTUD0weDFjNDZjYywgRENNRHxEQkM9MHgxYzQ2YWMsIERTQT0weDAKKyAqICAgICAgICAgRFNQUz0weDAsIFRFTVA9MHgxYzNlNzAsIERNT0RFPTB4ODAKKyAqIHNjc2kwIDogRFNQLT4KKyAqIDAwMWM0NmNjIDogMHgwMDFjNDZjYyAweDAwMDAwMDAwCisgKiAwMDFjNDZkNCA6IDB4MDAxYzVlYTAgMHgwMDAwMTFmOAorICoKKyAqCUNoYW5nZWQgdGhlIHByaW50IGNvZGUgaW4gdGhlIHBoYXNlX21pc21hdGNoIGhhbmRsZXIgc28KKyAqCXRoYXQgd2UgY2FsbCBwcmludF9sb3RzIHRvIHRyeSB0byBkaWFnbm9zZSB0aGlzLgorICoKKyAqLworCisvKiAKKyAqIFBvc3NpYmxlIGZ1dHVyZSBkaXJlY3Rpb24gb2YgYXJjaGl0ZWN0dXJlIGZvciBtYXggcGVyZm9ybWFuY2UgOgorICoKKyAqIFdlJ3JlIHVzaW5nIGEgc2luZ2xlIHN0YXJ0IGFycmF5IGZvciB0aGUgTkNSIGNoaXAuICBUaGlzIGlzIAorICogc3ViLW9wdGltYWwsIGJlY2F1c2Ugd2UgY2Fubm90IGFkZCBhIGNvbW1hbmQgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCAKKyAqIGFuIGV4ZWN1dGluZyBjb21tYW5kIHRvIHRoaXMgc3RhcnQgcXVldWUsIGFuZCB0aGVyZWZvcmUgbXVzdCBpbnNlcnQgdGhlIAorICogbmV4dCBjb21tYW5kIGZvciBhIGdpdmVuIEkvVC9MIGNvbWJpbmF0aW9uIGFmdGVyIHRoZSBmaXJzdCBoYXMgY29tcGxldGVkOworICogaW5jdXJyaW5nIG91ciBpbnRlcnJ1cHQgbGF0ZW5jeSBiZXR3ZWVuIFNDU0kgY29tbWFuZHMuCisgKgorICogVG8gYWxsb3cgZnVydGhlciBwaXBlbGluaW5nIG9mIHRoZSBOQ1IgYW5kIGhvc3QgQ1BVIG9wZXJhdGlvbiwgd2Ugd2FudCAKKyAqIHRvIHNldCB0aGluZ3MgdXAgc28gdGhhdCBpbW1lZGlhdGVseSBvbiB0ZXJtaW5hdGlvbiBvZiBhIGNvbW1hbmQgZGVzdGluZWQgCisgKiBmb3IgYSBnaXZlbiBMVU4sIHdlIGdldCB0aGF0IExVTiBidXN5IGFnYWluLiAgCisgKiAKKyAqIFRvIGRvIHRoaXMsIHdlIG5lZWQgdG8gYWRkIGEgMzIgYml0IHBvaW50ZXIgdG8gd2hpY2ggaXMganVtcGVkIHRvIAorICogb24gY29tcGxldGlvbiBvZiBhIGNvbW1hbmQuICBJZiBubyBuZXcgY29tbWFuZCBpcyBhdmFpbGFibGUsIHRoaXMgCisgKiB3b3VsZCBwb2ludCB0byB0aGUgdXN1YWwgRFNBIGlzc3VlIHF1ZXVlIHNlbGVjdCByb3V0aW5lLgorICoKKyAqIElmIG9uZSB3ZXJlLCBpdCB3b3VsZCBwb2ludCB0byBhIHBlci1OQ1I1M2M3eDBfY21kIHNlbGVjdCByb3V0aW5lIAorICogd2hpY2ggc3RhcnRzIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSwgaW5zZXJ0aW5nIHRoZSBjb21tYW5kIGF0IHRoZSBoZWFkIAorICogb2YgdGhlIHN0YXJ0IHF1ZXVlIGlmIHRoZSBOQ1IgY2hpcCBpcyBzZWxlY3RlZCBvciByZXNlbGVjdGVkLgorICoKKyAqIFdlIHdvdWxkIGNoYW5nZSBzbyB0aGF0IHdlIGtlZXAgYSBsaXN0IG9mIG91dHN0YW5kaW5nIGNvbW1hbmRzIAorICogZm9yIGVhY2ggdW5pdCwgcmF0aGVyIHRoYW4gYSBzaW5nbGUgcnVubmluZ19saXN0LiAgV2UnZCBpbnNlcnQgCisgKiBhIG5ldyBjb21tYW5kIGludG8gdGhlIHJpZ2h0IHJ1bm5pbmcgbGlzdDsgaWYgdGhlIE5DUiBkaWRuJ3QgCisgKiBoYXZlIHNvbWV0aGluZyBydW5uaW5nIGZvciB0aGF0IHlldCwgd2UnZCBwdXQgaXQgaW4gdGhlIAorICogc3RhcnQgcXVldWUgYXMgd2VsbC4gIFNvbWUgbWFnaWMgbmVlZHMgdG8gaGFwcGVuIHRvIGhhbmRsZSB0aGUgCisgKiByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCBjb21tYW5kIHRlcm1pbmF0aW5nIGJlZm9yZSB0aGUgCisgKiBuZXcgb25lIGlzIHdyaXR0ZW4uCisgKgorICogUG90ZW50aWFsIGZvciBwcm9maWxpbmcgOiAKKyAqIENhbGwgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikgdG8gZ2V0IDgwMG5zIHJlc29sdXRpb24uCisgKi8KKworCisvKgorICogVE9ETyA6IAorICogMS4gIFRvIHN1cHBvcnQgV0lERSB0cmFuc2ZlcnMsIG5vdCBtdWNoIG5lZWRzIHRvIGhhcHBlbi4gIFdlCisgKglzaG91bGQgZG8gQ0hNT1ZFIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mIE1PVkVzIHdoZW4KKyAqCXdlIGhhdmUgc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgb2YgdW5ldmVuIGxlbmd0aC4gIFdoZW4KKyAqIAl3ZSBkbyB0aGlzLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBkaXNjb25uZWN0CisgKgliZXR3ZWVuIHNlZ21lbnRzLgorICogCisgKiAyLiAgQ3VycmVudGx5LCB3aGVuIElja3kgdGhpbmdzIGhhcHBlbiB3ZSBkbyBhIEZBVEFMKCkuICBJbnN0ZWFkLAorICogICAgIHdlIHdhbnQgdG8gZG8gYW4gaW50ZWdyaXR5IGNoZWNrIG9uIHRoZSBwYXJ0cyBvZiB0aGUgTkNSIGhvc3RkYXRhCisgKiAgICAgc3RydWN0dXJlIHdoaWNoIHdlcmUgaW5pdGlhbGl6ZWQgYXQgYm9vdCB0aW1lOyBGQVRBTCgpIGlmIHRoYXQgCisgKiAgICAgZmFpbHMsIGFuZCBvdGhlcndpc2UgdHJ5IHRvIHJlY292ZXIuICBLZWVwIHRyYWNrIG9mIGhvdyBtYW55CisgKiAgICAgdGltZXMgdGhpcyBoYXMgaGFwcGVuZWQgd2l0aGluIGEgc2luZ2xlIFNDU0kgY29tbWFuZDsgaWYgaXQgCisgKiAgICAgZ2V0cyBleGNlc3NpdmUsIHRoZW4gRkFUQUwoKS4KKyAqCisgKiAzLiAgUGFyaXR5IGNoZWNraW5nIGlzIGN1cnJlbnRseSBkaXNhYmxlZCwgYW5kIGEgZmV3IHRoaW5ncyBzaG91bGQgCisgKiAgICAgaGFwcGVuIGhlcmUgbm93IHRoYXQgd2Ugc3VwcG9ydCBzeW5jaHJvbm91cyBTQ1NJIHRyYW5zZmVycyA6CisgKiAgICAgMS4gIE9uIHNvZnQtcmVzZXQsIHdlIHNob291bGQgc2V0IHRoZSBFUEMgKEVuYWJsZSBQYXJpdHkgQ2hlY2tpbmcpCisgKgkgICBhbmQgQUFQIChBc3NlcnQgU0FUTi8gb24gcGFyaXR5IGVycm9yKSBiaXRzIGluIFNDTlRMMC4KKyAqCQorICogICAgIDIuICBXZSBzaG91bGQgZW5hYmxlIHRoZSBwYXJpdHkgaW50ZXJydXB0IGluIHRoZSBTSUVOMCByZWdpc3Rlci4KKyAqIAorICogICAgIDMuICBpbnRyX3BoYXNlX21pc21hdGNoKCkgbmVlZHMgdG8gYmVsaWV2ZSB0aGF0IG1lc3NhZ2Ugb3V0IGlzIAorICoJICAgYWx3YXlzIGFuICJhY2NlcHRhYmxlIiBwaGFzZSB0byBoYXZlIGEgbWlzbWF0Y2ggaW4uICBJZiAKKyAqCSAgIHRoZSBvbGQgcGhhc2Ugd2FzIE1TR19JTiwgd2Ugc2hvdWxkIHNlbmQgYSBNRVNTQUdFIFBBUklUWSAKKyAqCSAgIGVycm9yLiAgSWYgdGhlIG9sZCBwaGFzZSB3YXMgc29tZXRoaW5nIGVsc2UsIHdlIHNob3VsZCBzZW5kCisgKgkgICBhIElOSVRJQVRPUl9ERVRFQ1RFRF9FUlJPUiBtZXNzYWdlLiAgTm90ZSB0aGF0IHRoaXMgY291bGQKKyAqCSAgIGNhdXNlIGEgUkVTVE9SRSBQT0lOVEVSUyBtZXNzYWdlOyBzbyB3ZSBzaG91bGQgaGFuZGxlIHRoYXQgCisgKgkgICBjb3JyZWN0bHkgZmlyc3QuICBJbnN0ZWFkLCB3ZSBzaG91bGQgcHJvYmFibHkgZG8gYW4gCisgKgkgICBpbml0aWF0b3JfYWJvcnQuCisgKgorICogNC4gIE1QRUUgYml0IG9mIENURVNUNCBzaG91bGQgYmUgc2V0IHNvIHdlIGdldCBpbnRlcnJ1cHRlZCBpZiAKKyAqICAgICB3ZSBkZXRlY3QgYW4gZXJyb3IuCisgKgorICogIAorICogNS4gIFRoZSBpbml0aWFsIGNvZGUgaGFzIGJlZW4gdGVzdGVkIG9uIHRoZSBOQ1I1M2M4MTAuICBJIGRvbid0IAorICogICAgIGhhdmUgYWNjZXNzIHRvIE5DUjUzYzcwMCwgNzAwLTY2IChGb3JleCBib2FyZHMpLCBOQ1I1M2M3MTAKKyAqICAgICAoTkNSIFBlbnRpdW0gc3lzdGVtcyksIE5DUjUzYzcyMCwgTkNSNTNjODIwLCBvciBOQ1I1M2M4MjUgYm9hcmRzIHRvIAorICogICAgIGZpbmlzaCBkZXZlbG9wbWVudCBvbiB0aG9zZSBwbGF0Zm9ybXMuCisgKgorICogICAgIE5DUjUzYzgyMC84MjUvNzIwIC0gbmVlZCB0byBhZGQgd2lkZSB0cmFuc2ZlciBzdXBwb3J0LCBpbmNsdWRpbmcgV0RUUiAKKyAqICAgICAJCW5lZ290aWF0aW9uLCBwcm9ncmFtbWluZyBvZiB3aWRlIHRyYW5zZmVyIGNhcGFiaWxpdGllcworICoJCW9uIHJlc2VsZWN0aW9uIGFuZCB0YWJsZSBpbmRpcmVjdCBzZWxlY3Rpb24uCisgKgorICogICAgIE5DUjUzYzcxMCAtIG5lZWQgdG8gYWRkIGZhdGFsIGludGVycnVwdCBvciBHRU4gY29kZSBmb3IgCisgKgkJY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbGluZy4gICBOZWVkIHRvIG1vZGlmeSBhbGwgCisgKgkJU0RJRCwgU0NJRCwgZXRjLiByZWdpc3RlcnMsIGFuZCB0YWJsZSBpbmRpcmVjdCBzZWxlY3QgY29kZSAKKyAqCQlzaW5jZSB0aGVzZSB1c2UgYml0IGZpZWxkZWQgKGllIDE8PHRhcmdldCkgaW5zdGVhZCBvZiAKKyAqCQliaW5hcnkgZW5jb2RlZCB0YXJnZXQgaWRzLiAgTmVlZCB0byBhY2NvbW1vZGF0ZQorICoJCWRpZmZlcmVudCByZWdpc3RlciBtYXBwaW5ncywgcHJvYmFibHkgc2NhbiB0aHJvdWdoCisgKgkJdGhlIFNDUklQVCBjb2RlIGFuZCBjaGFuZ2UgdGhlIG5vbiBTRkJSIHJlZ2lzdGVyIG9wZXJhbmQKKyAqCQlvZiBhbGwgTU9WRSBpbnN0cnVjdGlvbnMuCisgKgorICoJCUl0IGlzIHJhdGhlciB3b3JzZSB0aGFuIHRoaXMgYWN0dWFsbHksIHRoZSA3MTAgY29ycnVwdHMKKyAqCQlib3RoIFRFTVAgYW5kIERTQSB3aGVuIHlvdSBkbyBhIE1PVkUgTUVNT1JZLiAgVGhpcworICoJCXNjcmV3cyB5b3UgdXAgYWxsIG92ZXIgdGhlIHBsYWNlLiAgTU9WRSBNRU1PUlkgNCB3aXRoIGEKKyAqCQlkZXN0aW5hdGlvbiBvZiBEU0Egc2VlbXMgdG8gd29yayBPSywgd2hpY2ggaGVscHMgc29tZS4KKyAqCQlSaWNoYXJkIEhpcnN0ICByaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWsKKyAqIAorICogICAgIE5DUjUzYzcwMC83MDAtNjYgLSBuZWVkIHRvIGFkZCBjb2RlIHRvIHJlZml4IGFkZHJlc3NlcyBvbiAKKyAqCQlldmVyeSBuZXh1cyBjaGFuZ2UsIGVsaW1pbmF0ZSBhbGwgdGFibGUgaW5kaXJlY3QgY29kZSwKKyAqCQl2ZXJ5IG1lc3N5LgorICoKKyAqIDYuICBUaGUgTkNSNTNjN3gwIHNlcmllcyBpcyB2ZXJ5IHBvcHVsYXIgb24gb3RoZXIgcGxhdGZvcm1zIHRoYXQgCisgKiAgICAgY291bGQgYmUgcnVubmluZyBMaW51eCAtIGllLCBzb21lIGhpZ2ggcGVyZm9ybWFuY2UgQU1JR0EgU0NTSSAKKyAqICAgICBib2FyZHMgdXNlIGl0LiAgCisgKgkKKyAqICAgICBTbywgSSBzaG91bGQgaW5jbHVkZSAjaWZkZWYnZCBjb2RlIHNvIHRoYXQgaXQgaXMgCisgKiAgICAgY29tcGF0aWJsZSB3aXRoIHRoZXNlIHN5c3RlbXMuCisgKgkKKyAqICAgICBTcGVjaWZpY2FsbHksIHRoZSBsaXR0bGUgRW5kaWFuIGFzc3VtcHRpb25zIEkgbWFkZSBpbiBteSAKKyAqICAgICBiaXQgZmllbGRzIG5lZWQgdG8gY2hhbmdlLCBhbmQgaWYgdGhlIE5DUiBkb2Vzbid0IHNlZSBtZW1vcnkKKyAqICAgICB0aGUgcmlnaHQgd2F5LCB3ZSBuZWVkIHRvIHByb3ZpZGUgb3B0aW9ucyB0byByZXZlcnNlIHdvcmRzCisgKiAgICAgd2hlbiB0aGUgc2NyaXB0cyBhcmUgcmVsb2NhdGVkLgorICoKKyAqIDcuICBVc2UgdnJlbWFwKCkgdG8gYWNjZXNzIG1lbW9yeSBtYXBwZWQgYm9hcmRzLiAgCisgKi8KKworLyogCisgKiBBbGxvdyBmb3Igc2ltdWx0YW5lb3VzIGV4aXN0ZW5jZSBvZiBtdWx0aXBsZSBTQ1NJIHNjcmlwdHMgc28gd2UgCisgKiBjYW4gaGF2ZSBhIHNpbmdsZSBkcml2ZXIgYmluYXJ5IGZvciBhbGwgb2YgdGhlIGZhbWlseS4KKyAqCisgKiAtIG9uZSBmb3IgTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgY2hpcHMJKG5vdCB5ZXQgc3VwcG9ydGVkKQorICogLSBvbmUgZm9yIHJlc3QgKG9ubHkgdGhlIE5DUjUzYzgxMCwgODE1LCA4MjAsIGFuZCA4MjUgYXJlIGN1cnJlbnRseSAKKyAqCXN1cHBvcnRlZCkKKyAqIAorICogU28gdGhhdCB3ZSBvbmx5IG5lZWQgdHdvIFNDU0kgc2NyaXB0cywgd2UgbmVlZCB0byBtb2RpZnkgdGhpbmdzIHNvCisgKiB0aGF0IHdlIGZpeHVwIHJlZ2lzdGVyIGFjY2Vzc2VzIGluIFJFQUQvV1JJVEUgaW5zdHJ1Y3Rpb25zLCBhbmQgCisgKiB3ZSdsbCBhbHNvIGhhdmUgdG8gYWNjb21tb2RhdGUgdGhlIGJpdCB2cy4gYmluYXJ5IGVuY29kaW5nIG9mIElEcworICogd2l0aCB0aGUgN3h4IGNoaXBzLgorICovCisKKyNkZWZpbmUgUk9VTkRVUChhZHIsdHlwZSkJXAorICAoKHZvaWQgKikgKCgobG9uZykgKGFkcikgKyBzaXplb2YodHlwZSkgLSAxKSAmIH4oc2l6ZW9mKHR5cGUpIC0gMSkpKQorCisKKy8qCisgKiBGdW5jdGlvbjogaXNzdWVfdG9fY21kCisgKgorICogUHVycG9zZTogY29udmVydCBqdW1wIGluc3RydWN0aW9uIGluIGlzc3VlIGFycmF5IHRvIE5DUjUzYzd4MF9jbWQKKyAqCXN0cnVjdHVyZSBwb2ludGVyLiAgCisgKgorICogSW5wdXRzOyBpc3N1ZSAtIHBvaW50ZXIgdG8gc3RhcnQgb2YgTk9QIG9yIEpVTVAgaW5zdHJ1Y3Rpb24KKyAqCWluIGlzc3VlIGFycmF5LgorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgdG8gY29tbWFuZCBvbiBzdWNjZXNzOyAwIGlmIG9wY29kZSBpcyBOT1AuCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqCitpc3N1ZV90b19jbWQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhLAorICAgIHUzMiAqaXNzdWUpCit7CisgICAgcmV0dXJuIChpc3N1ZVswXSAhPSBob3N0ZGF0YS0+Tk9QX2luc24pID8gCisgICAgLyogCisgICAgICogSWYgdGhlIElGIFRSVUUgYml0IGlzIHNldCwgaXQncyBhIEpVTVAgaW5zdHJ1Y3Rpb24uICBUaGUKKyAgICAgKiBvcGVyYW5kIGlzIGEgYnVzIHBvaW50ZXIgdG8gdGhlIGRzYV9iZWdpbiByb3V0aW5lIGZvciB0aGlzIERTQS4gIFRoZQorICAgICAqIGRzYSBmaWVsZCBvZiB0aGUgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgc3RhcnRzIHdpdGggdGhlIAorICAgICAqIERTQSBjb2RlIHRlbXBsYXRlLiAgQnkgY29udmVydGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcywKKyAgICAgKiBzdWJ0cmFjdGluZyB0aGUgY29kZSB0ZW1wbGF0ZSBzaXplLCBhbmQgb2Zmc2V0IG9mIHRoZSAKKyAgICAgKiBkc2EgZmllbGQsIHdlIGVuZCB1cCB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIAorICAgICAqIHN0cnVjdHVyZSAoYWx0ZXJuYXRpdmVseSwgd2UgY291bGQgdXNlIHRoZSAKKyAgICAgKiBkc2FfY21uZCBmaWVsZCwgYW4gYW5hY2hyb25pc20gZnJvbSB3aGVuIHdlIHdlcmVuJ3QKKyAgICAgKiBzdXJlIHdoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBOQ1Igc3RydWN0dXJlcworICAgICAqIGFuZCBob3N0IHN0cnVjdHVyZXMgd2VyZSBnb2luZyB0byBiZS4KKyAgICAgKi8KKwkoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgKChjaGFyICopIGJ1c190b192aXJ0IChpc3N1ZVsxXSkgLSAKKwkgICAgKGhvc3RkYXRhLT5FX2RzYV9jb2RlX2JlZ2luIC0gaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGUpIC0KKwkgICAgb2Zmc2V0b2Yoc3RydWN0IE5DUjUzYzd4MF9jbWQsIGRzYSkpIAorICAgIC8qIElmIHRoZSBJRiBUUlVFIGJpdCBpcyBub3Qgc2V0LCBpdCdzIGEgTk9QICovCisJOiBOVUxMOworfQorCisKKy8qIAorICogRklYTUU6IHdlIHNob3VsZCBqdW5rIHRoZXNlLCBpbiBmYXZvciBvZiBzeW5jaHJvbm91c193YW50IGFuZCAKKyAqIHdpZGVfd2FudCBpbiB0aGUgTkNSNTNjN3gwX2hvc3RkYXRhIHN0cnVjdHVyZS4KKyAqLworCisvKiBUZW1wbGF0ZSBmb3IgInByZWZlcnJlZCIgc3luY2hyb25vdXMgdHJhbnNmZXIgcGFyYW1ldGVycy4gKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2R0cl9tZXNzYWdlW10gPSB7CisjaWZkZWYgQ09ORklHX1NDU0lfTkNSNTNDN3h4X0ZBU1QKKyAgICBFWFRFTkRFRF9NRVNTQUdFLCAzIC8qIGxlbmd0aCAqLywgRVhURU5ERURfU0RUUiwgMjUgLyogKjRucyAqLywgOCAvKiBvZmYgKi8KKyNlbHNlCisgICAgRVhURU5ERURfTUVTU0FHRSwgMyAvKiBsZW5ndGggKi8sIEVYVEVOREVEX1NEVFIsIDUwIC8qICo0bnMgKi8sIDggLyogb2ZmICovIAorI2VuZGlmCit9OworCisvKiBUZW1wbGF0ZSB0byByZXF1ZXN0IGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXN5bmNfbWVzc2FnZVtdID0geworICAgIEVYVEVOREVEX01FU1NBR0UsIDMgLyogbGVuZ3RoICovLCBFWFRFTkRFRF9TRFRSLCAwLCAwIC8qIGFzeW5jaHJvbm91cyAqLworfTsKKworLyogVGVtcGxhdGUgZm9yICJwcmVmZXJyZWQiIFdJREUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB3ZHRyX21lc3NhZ2VbXSA9IHsKKyAgICBFWFRFTkRFRF9NRVNTQUdFLCAyIC8qIGxlbmd0aCAqLywgRVhURU5ERURfV0RUUiwgMSAvKiAyXjEgYnl0ZXMgKi8KK307CisKKyNpZiAwCisvKgorICogRnVuY3Rpb24gOiBzdHJ1Y3QgU2NzaV9Ib3N0ICpmaW5kX2hvc3QgKGludCBob3N0KQorICogCisgKiBQdXJwb3NlIDogS0dEQiBzdXBwb3J0IGZ1bmN0aW9uIHdoaWNoIHRyYW5zbGF0ZXMgYSBob3N0IG51bWJlciAKKyAqIAl0byBhIGhvc3Qgc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gbnVtYmVyIG9mIFNDU0kgaG9zdAorICoKKyAqIFJldHVybnMgOiBOVUxMIG9uIGZhaWx1cmUsIHBvaW50ZXIgdG8gaG9zdCBzdHJ1Y3R1cmUgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqCitmaW5kX2hvc3QgKGludCBob3N0KSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaDsKKyAgICBmb3IgKGggPSBmaXJzdF9ob3N0OyBoICYmIGgtPmhvc3Rfbm8gIT0gaG9zdDsgaCA9IGgtPm5leHQpOworICAgIGlmICghaCkgeworCXByaW50ayAoS0VSTl9BTEVSVCAic2NzaSVkIG5vdCBmb3VuZFxuIiwgaG9zdCk7CisJcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChoLT5ob3N0dCAhPSB0aGVfdGVtcGxhdGUpIHsKKwlwcmludGsgKEtFUk5fQUxFUlQgInNjc2klZCBpcyBub3QgYSBOQ1IgYm9hcmRcbiIsIGhvc3QpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gaDsKK30KKworI2lmIDAKKy8qCisgKiBGdW5jdGlvbiA6IHJlcXVlc3Rfc3luY2hyb25vdXMgKGludCBob3N0LCBpbnQgdGFyZ2V0KQorICogCisgKiBQdXJwb3NlIDogS0dEQiBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBuZWdvdGlhdGUgZm9yIAorICogCXN5bmNocm9ub3VzIHRyYW5zZmVycy4gIFRoaXMgaWxsIGJlIHJlcGxhY2VkIHdpdGggYSBtb3JlIAorICogCWludGVncmF0ZWQgZnVuY3Rpb247IHBlcmhhcHMgYSBuZXcgZW50cnkgaW4gdGhlIHNjc2lfaG9zdCAKKyAqCXN0cnVjdHVyZSwgYWNjZXNzaWJsZSB2aWEgYW4gaW9jdGwoKSBvciBwZXJoYXBzIC9wcm9jL3Njc2kuCisgKgorICogSW5wdXRzIDogaG9zdCAtIG51bWJlciBvZiBTQ1NJIGhvc3Q7IHRhcmdldCAtIG51bWJlciBvZiB0YXJnZXQuCisgKgorICogUmV0dXJucyA6IDAgd2hlbiBuZWdvdGlhdGlvbiBoYXMgYmVlbiBzZXR1cCBmb3IgbmV4dCBTQ1NJIGNvbW1hbmQsCisgKgktMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQKK3JlcXVlc3Rfc3luY2hyb25vdXMgKGludCBob3N0LCBpbnQgdGFyZ2V0KSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGlmICh0YXJnZXQgPCAwKSB7CisJcHJpbnRrIChLRVJOX0FMRVJUICJ0YXJnZXQgJWQgaXMgYm9ndXNcbiIsIHRhcmdldCk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIShoID0gZmluZF9ob3N0IChob3N0KSkpCisJcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKGgtPnRoaXNfaWQgPT0gdGFyZ2V0KSB7CisJcHJpbnRrIChLRVJOX0FMRVJUICJ0YXJnZXQgJWQgaXMgaG9zdCBJRFxuIiwgdGFyZ2V0KTsKKwlyZXR1cm4gLTE7CisgICAgfSAKKyAgICBlbHNlIGlmICh0YXJnZXQgPiBoLT5tYXhfaWQpIHsKKwlwcmludGsgKEtFUk5fQUxFUlQgInRhcmdldCAlZCBleGNlZWRzIG1heGltdW0gb2YgJWRcbiIsIHRhcmdldCwKKwkgICAgaC0+bWF4X2lkKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKiloLT5ob3N0ZGF0YVswXTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBpZiAoaG9zdGRhdGEtPmluaXRpYXRlX3NkdHIgJiAoMSA8PCB0YXJnZXQpKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByaW50ayAoS0VSTl9BTEVSVCAidGFyZ2V0ICVkIGFscmVhZHkgZG9pbmcgU0RUUlxuIiwgdGFyZ2V0KTsKKwlyZXR1cm4gLTE7CisgICAgfSAKKyAgICBob3N0ZGF0YS0+aW5pdGlhdGVfc2R0ciB8PSAoMSA8PCB0YXJnZXQpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gOiByZXF1ZXN0X2Rpc2Nvbm5lY3QgKGludCBob3N0LCBpbnQgb25fb3Jfb2ZmKQorICogCisgKiBQdXJwb3NlIDogS0dEQiBzdXBwb3J0IGZ1bmN0aW9uLCB0ZWxscyB1cyB0byBhbGxvdyBvciBkaXNhbGxvdyAKKyAqCWRpc2Nvbm5lY3Rpb25zLgorICoKKyAqIElucHV0cyA6IGhvc3QgLSBudW1iZXIgb2YgU0NTSSBob3N0OyBvbl9vcl9vZmYgLSBub24temVybyB0byBhbGxvdywKKyAqCXplcm8gdG8gZGlzYWxsb3cuCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgKgktMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgCityZXF1ZXN0X2Rpc2Nvbm5lY3QgKGludCBob3N0LCBpbnQgb25fb3Jfb2ZmKSB7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YTsKKyAgICBpZiAoIShoID0gZmluZF9ob3N0IChob3N0KSkpCisJcmV0dXJuIC0xOworICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaC0+aG9zdGRhdGFbMF07CisgICAgaWYgKG9uX29yX29mZikgCisJaG9zdGRhdGEtPm9wdGlvbnMgfD0gT1BUSU9OX0RJU0NPTk5FQ1Q7CisgICAgZWxzZQorCWhvc3RkYXRhLT5vcHRpb25zICY9IH5PUFRJT05fRElTQ09OTkVDVDsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBOQ1I1M2M3eDBfZHJpdmVyX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IEluaXRpYWxpemUgaW50ZXJuYWwgc3RydWN0dXJlcywgYXMgcmVxdWlyZWQgb24gc3RhcnR1cCwgb3IgCisgKglhZnRlciBhIFNDU0kgYnVzIHJlc2V0LgorICogCisgKiBJbnB1dHMgOiBob3N0IC0gcG9pbnRlciB0byB0aGlzIGhvc3QgYWRhcHRlcidzIHN0cnVjdHVyZQorICovCisKK3N0YXRpYyB2b2lkIAorTkNSNTNjN3gwX2RyaXZlcl9pbml0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIGludCBpLCBqOworICAgIHUzMiAqbmNyY3VycmVudDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisJaG9zdGRhdGEtPnJlcXVlc3Rfc2Vuc2VbaV0gPSAwOworICAgIAlmb3IgKGogPSAwOyBqIDwgODsgKytqKSAKKwkgICAgaG9zdGRhdGEtPmJ1c3lbaV1bal0gPSAwOworCXNldF9zeW5jaHJvbm91cyAoaG9zdCwgaSwgLyogc3hmZXIgKi8gMCwgaG9zdGRhdGEtPnNhdmVkX3NjbnRsMywgMCk7CisgICAgfQorICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdCA9IGhvc3RkYXRhLT5maW5pc2hlZF9xdWV1ZSA9IAorCWhvc3RkYXRhLT5uY3JjdXJyZW50ID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwLCBuY3JjdXJyZW50ID0gKHUzMiAqKSBob3N0ZGF0YS0+c2NoZWR1bGU7IAorCWkgPCBob3N0LT5jYW5fcXVldWU7ICsraSwgbmNyY3VycmVudCArPSAyKSB7CisJbmNyY3VycmVudFswXSA9IGhvc3RkYXRhLT5OT1BfaW5zbjsKKwluY3JjdXJyZW50WzFdID0gMHhkZWFkYmVlZjsKKyAgICB9CisgICAgbmNyY3VycmVudFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNCkgfCBEQkNfVENJX1RSVUU7CisgICAgbmNyY3VycmVudFsxXSA9ICh1MzIpIHZpcnRfdG9fYnVzIChob3N0ZGF0YS0+c2NyaXB0KSArCisJaG9zdGRhdGEtPkVfd2FpdF9yZXNlbGVjdDsKKyAgICBob3N0ZGF0YS0+cmVjb25uZWN0X2RzYV9oZWFkID0gMDsKKyAgICBob3N0ZGF0YS0+YWRkcl9yZWNvbm5lY3RfZHNhX2hlYWQgPSAodTMyKSAKKwl2aXJ0X3RvX2J1cygodm9pZCAqKSAmKGhvc3RkYXRhLT5yZWNvbm5lY3RfZHNhX2hlYWQpKTsKKyAgICBob3N0ZGF0YS0+ZXhwZWN0aW5nX2lpZCA9IDA7CisgICAgaG9zdGRhdGEtPmV4cGVjdGluZ19zdG8gPSAwOworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMpIAorCWhvc3RkYXRhLT5pbml0aWF0ZV9zZHRyID0gMHhmZmZmOyAKKyAgICBlbHNlCisgICAgCWhvc3RkYXRhLT5pbml0aWF0ZV9zZHRyID0gMDsKKyAgICBob3N0ZGF0YS0+dGFsa2VkX3RvID0gMDsKKyAgICBob3N0ZGF0YS0+aWRsZSA9IDE7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGNsb2NrX3RvX2NjZl83MTAgKGludCBjbG9jaykKKyAqCisgKiBQdXJwb3NlIDogIFJldHVybiB0aGUgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgZm9yIGEgZ2l2ZW4gU0NTSSBjbG9jay4KKyAqCisgKiBJbnB1dHMgOiBjbG9jayAtIFNDU0kgY2xvY2sgZXhwcmVzc2VkIGluIEh6LgorICoKKyAqIFJldHVybnMgOiBjY2Ygb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IAorY2xvY2tfdG9fY2NmXzcxMCAoaW50IGNsb2NrKSB7CisgICAgaWYgKGNsb2NrIDw9IDE2NjY2NjY2KQorCXJldHVybiAtMTsKKyAgICBpZiAoY2xvY2sgPD0gMjUwMDAwMDApCisJcmV0dXJuIDI7IAkvKiBEaXZpZGUgYnkgMS4wICovCisgICAgZWxzZSBpZiAoY2xvY2sgPD0gMzc1MDAwMDApCisJcmV0dXJuIDE7IAkvKiBEaXZpZGUgYnkgMS41ICovCisgICAgZWxzZSBpZiAoY2xvY2sgPD0gNTAwMDAwMDApCisJcmV0dXJuIDA7CS8qIERpdmlkZSBieSAyLjAgKi8KKyAgICBlbHNlIGlmIChjbG9jayA8PSA2NjAwMDAwMCkKKwlyZXR1cm4gMzsJLyogRGl2aWRlIGJ5IDMuMCAqLworICAgIGVsc2UgCisJcmV0dXJuIC0xOworfQorICAgIAorLyogCisgKiBGdW5jdGlvbiA6IHN0YXRpYyBpbnQgTkNSNTNjN3gwX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6ICBpbml0aWFsaXplIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGZvciBhIGdpdmVuIFNDU0kgaG9zdAorICoKKyAqIElucHV0cyA6IGhvc3QgLSBwb2ludGVyIHRvIHRoaXMgaG9zdCBhZGFwdGVyJ3Mgc3RydWN0dXJlCisgKgorICogUHJlY29uZGl0aW9ucyA6IHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBjaGlwX3R5cGUgCisgKiAJZmllbGQgb2YgdGhlIGhvc3RkYXRhIHN0cnVjdHVyZSBNVVNUIGhhdmUgYmVlbiBzZXQuCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitpbnQgCitOQ1I1M2M3eDBfaW5pdCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgaW50IGksIGNjZjsKKyAgICB1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICAvKiAKKyAgICAgKiBUaGVyZSBhcmUgc29tZSB0aGluZ3Mgd2hpY2ggd2UgbmVlZCB0byBrbm93IGFib3V0IGluIG9yZGVyIHRvIHByb3ZpZGUKKyAgICAgKiBhIHNlbWJsYW5jZSBvZiBzdXBwb3J0LiAgUHJpbnQgJ2VtIGlmIHRoZXkgYXJlbid0IHdoYXQgd2UgZXhwZWN0LCAKKyAgICAgKiBvdGhlcndpc2UgZG9uJ3QgYWRkIHRvIHRoZSBub2lzZS4KKyAgICAgKiAKKyAgICAgKiAtMSBtZWFucyB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZXhwZWN0LgorICAgICAqLworICAgIGludCB2YWwsIGZsYWdzOworICAgIGNoYXIgYnVmWzMyXTsKKyAgICBpbnQgZXhwZWN0ZWRfaWQgPSAtMTsKKyAgICBpbnQgZXhwZWN0ZWRfY2xvY2sgPSAtMTsKKyAgICBpbnQgdW5pbml0aWFsaXplZCA9IDA7CisjaWZkZWYgTk9fSU9fU1BBQ0UKKyAgICBpbnQgZXhwZWN0ZWRfbWFwcGluZyA9IE9QVElPTl9NRU1PUllfTUFQUEVEOworI2Vsc2UKKyAgICBpbnQgZXhwZWN0ZWRfbWFwcGluZyA9IE9QVElPTl9JT19NQVBQRUQ7CisjZW5kaWYKKyAgICBmb3IgKGk9MDtpPDc7aSsrKQorCWhvc3RkYXRhLT52YWxpZF9pZHNbaV0gPSAxOwkvKiBEZWZhdWx0IGFsbCBJRCdzIHRvIHNjYW4gKi8KKworICAgIC8qIFBhcnNlIGNvbW1hbmRsaW5lIGZsYWdzICovCisgICAgaWYgKGNoZWNrX3NldHVwX3N0cmluZ3MoIm5vYXN5bmMiLCZmbGFncywmdmFsLGJ1ZikpCisgICAgeworCWhvc3RkYXRhLT5vcHRpb25zIHw9IE9QVElPTl9OT19BU1lOQzsKKwlob3N0ZGF0YS0+b3B0aW9ucyAmPSB+KE9QVElPTl9TWU5DSFJPTk9VUyB8IE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVMpOworICAgIH0KKworICAgIGlmIChjaGVja19zZXR1cF9zdHJpbmdzKCJub3N5bmMiLCZmbGFncywmdmFsLGJ1ZikpCisgICAgeworCWhvc3RkYXRhLT5vcHRpb25zICY9IH4oT1BUSU9OX1NZTkNIUk9OT1VTIHwgT1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUyk7CisgICAgfQorCisgICAgaWYgKGNoZWNrX3NldHVwX3N0cmluZ3MoIm5vZGlzY29ubmVjdCIsJmZsYWdzLCZ2YWwsYnVmKSkKKwlob3N0ZGF0YS0+b3B0aW9ucyAmPSB+T1BUSU9OX0RJU0NPTk5FQ1Q7CisKKyAgICBpZiAoY2hlY2tfc2V0dXBfc3RyaW5ncygidmFsaWRpZHMiLCZmbGFncywmdmFsLGJ1ZikpCisgICAgeworCWZvciAoaT0wO2k8NztpKyspIAorCQlob3N0ZGF0YS0+dmFsaWRfaWRzW2ldID0gdmFsICYgKDE8PGkpOworICAgIH0KKyAKKyAgICBpZiAgKChpID0gY2hlY2tfc2V0dXBfc3RyaW5ncygibmV4dCIsJmZsYWdzLCZ2YWwsYnVmKSkpCisgICAgeworCXdoaWxlIChpKQorCQlzZXR1cF91c2VkWy0taV0gPSAxOworICAgIH0KKworICAgIGlmIChjaGVja19zZXR1cF9zdHJpbmdzKCJvcHRoaSIsJmZsYWdzLCZ2YWwsYnVmKSkKKwlob3N0ZGF0YS0+b3B0aW9ucyA9IChsb25nIGxvbmcpdmFsIDw8IDMyOworICAgIGlmIChjaGVja19zZXR1cF9zdHJpbmdzKCJvcHRsbyIsJmZsYWdzLCZ2YWwsYnVmKSkKKwlob3N0ZGF0YS0+b3B0aW9ucyB8PSB2YWw7CisKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisgICAgc3dpdGNoIChob3N0ZGF0YS0+Y2hpcCkgeworICAgIGNhc2UgNzEwOgorICAgIGNhc2UgNzcwOgorICAgIAlob3N0ZGF0YS0+ZHN0YXRfc2lyX2ludHIgPSBOQ1I1M2M3eDBfZHN0YXRfc2lyX2ludHI7CisgICAgCWhvc3RkYXRhLT5pbml0X3NhdmVfcmVncyA9IE5VTEw7CisgICAgCWhvc3RkYXRhLT5kc2FfZml4dXAgPSBOQ1I1M2M3eHhfZHNhX2ZpeHVwOworICAgIAlob3N0ZGF0YS0+aW5pdF9maXh1cCA9IE5DUjUzYzd4MF9pbml0X2ZpeHVwOworICAgIAlob3N0ZGF0YS0+c29mdF9yZXNldCA9IE5DUjUzYzd4MF9zb2Z0X3Jlc2V0OworCWhvc3RkYXRhLT5ydW5fdGVzdHMgPSBOQ1I1M2M3eHhfcnVuX3Rlc3RzOworCWV4cGVjdGVkX2Nsb2NrID0gaG9zdGRhdGEtPnNjc2lfY2xvY2s7CisJZXhwZWN0ZWRfaWQgPSA3OworICAgIAlicmVhazsKKyAgICBkZWZhdWx0OgorCXByaW50ayAoInNjc2klZCA6IGNoaXAgdHlwZSBvZiAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldCwgZGV0YWNoaW5nLlxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPmNoaXApOworCXNjc2lfdW5yZWdpc3RlciAoaG9zdCk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEFzc2lnbiBjb25zdGFudHMgYWNjZXNzZWQgYnkgTkNSICovCisgICAgaG9zdGRhdGEtPk5DUjUzYzd4eF96ZXJvID0gMDsJCQkKKyAgICBob3N0ZGF0YS0+TkNSNTNjN3h4X21zZ19yZWplY3QgPSBNRVNTQUdFX1JFSkVDVDsKKyAgICBob3N0ZGF0YS0+TkNSNTNjN3h4X21zZ19hYm9ydCA9IEFCT1JUOworICAgIGhvc3RkYXRhLT5OQ1I1M2M3eHhfbXNnX25vcCA9IE5PUDsKKyAgICBob3N0ZGF0YS0+Tk9QX2luc24gPSAoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNDsKKyAgICBpZiAoZXhwZWN0ZWRfbWFwcGluZyA9PSAtMSB8fCAKKwkoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX01FTU9SWV9NQVBQRUQpKSAhPSAKKwkoZXhwZWN0ZWRfbWFwcGluZyAmIE9QVElPTl9NRU1PUllfTUFQUEVEKSkKKwlwcmludGsgKCJzY3NpJWQgOiB1c2luZyAlcyBtYXBwZWQgYWNjZXNzXG4iLCBob3N0LT5ob3N0X25vLCAKKwkgICAgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX01FTU9SWV9NQVBQRUQpID8gIm1lbW9yeSIgOiAKKwkgICAgImlvIik7CisKKyAgICBob3N0ZGF0YS0+ZG1vZGUgPSAoaG9zdGRhdGEtPmNoaXAgPT0gNzAwIHx8IGhvc3RkYXRhLT5jaGlwID09IDcwMDY2KSA/IAorCURNT0RFX1JFR18wMCA6IERNT0RFX1JFR18xMDsKKyAgICBob3N0ZGF0YS0+aXN0YXQgPSAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KSA/IAorICAgIAlJU1RBVF9SRUdfODAwIDogSVNUQVRfUkVHXzcwMDsKKworLyogV2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGlzIG1heSBiZSB0aGUgZmlyc3QgYWNjZXNzIHRvIHRoZSBjaGlwLCBzbworICogd2UgbXVzdCBzZXQgRUEgaW4gRENOVEwuICovCisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4IChEQ05UTF9SRUcsIERDTlRMXzEwX0VBfERDTlRMXzEwX0NPTSk7CisKKworLyogT25seSB0aGUgSVNUQVQgcmVnaXN0ZXIgaXMgcmVhZGFibGUgd2hlbiB0aGUgTkNSIGlzIHJ1bm5pbmcsIHNvIG1ha2UgCisgICBzdXJlIGl0J3MgaGFsdGVkLiAqLworICAgIG5jcl9oYWx0KGhvc3QpOworCisvKiAKKyAqIFhYWCAtIHRoZSBOQ1I1M2M3MDAgdXNlcyBiaXRmaWVsZGVkIHJlZ2lzdGVycyBmb3IgU0NJRCwgU0RJRCwgZXRjLAorICoJYXMgZG9lcyB0aGUgNzEwIHdpdGggb25lIGJpdCBwZXIgU0NTSSBJRC4gIENvbnZlcnNlbHksIHRoZSBOQ1IKKyAqIAl1c2VzIGEgbm9ybWFsLCAzIGJpdCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlc2UgdmFsdWVzLgorICoKKyAqIEdldCB0aGUgcmVzdCBvZiB0aGUgTkNSIGRvY3VtZW50YXRpb24sIGFuZCBGSU5EIE9VVCB3aGVyZSB0aGUgY2hhbmdlCisgKiB3YXMuCisgKi8KKworI2lmIDAKKwkvKiBNYXkgbm90IGJlIGFibGUgdG8gZG8gdGhpcyAtIGNoaXAgbXkgbm90IGhhdmUgYmVlbiBzZXQgdXAgeWV0ICovCisJdG1wID0gaG9zdGRhdGEtPnRoaXNfaWRfbWFzayA9IE5DUjUzYzd4MF9yZWFkOChTQ0lEX1JFRyk7CisJZm9yIChob3N0LT50aGlzX2lkID0gMDsgdG1wICE9IDE7IHRtcCA+Pj0xLCArK2hvc3QtPnRoaXNfaWQpOworI2Vsc2UKKwlob3N0LT50aGlzX2lkID0gNzsKKyNlbmRpZgorCisvKgorICogTm90ZSA6IHdlIHNob3VsZCBuZXZlciBlbmNvdW50ZXIgYSBib2FyZCBzZXR1cCBmb3IgSUQwLiAgU28sCisgKiAJaWYgd2Ugc2VlIElEMCwgYXNzdW1lIHRoYXQgaXQgd2FzIHVuaW5pdGlhbGl6ZWQgYW5kIHNldCBpdAorICogCXRvIHRoZSBpbmR1c3RyeSBzdGFuZGFyZCA3LgorICovCisgICAgaWYgKCFob3N0LT50aGlzX2lkKSB7CisJcHJpbnRrKCJzY3NpJWQgOiBpbml0aWF0b3IgSUQgd2FzICVkLCBjaGFuZ2luZyB0byA3XG4iLAorCSAgICBob3N0LT5ob3N0X25vLCBob3N0LT50aGlzX2lkKTsKKwlob3N0LT50aGlzX2lkID0gNzsKKwlob3N0ZGF0YS0+dGhpc19pZF9tYXNrID0gMSA8PCA3OworCXVuaW5pdGlhbGl6ZWQgPSAxOworICAgIH07CisKKyAgICBpZiAoZXhwZWN0ZWRfaWQgPT0gLTEgfHwgaG9zdC0+dGhpc19pZCAhPSBleHBlY3RlZF9pZCkKKyAgICAJcHJpbnRrKCJzY3NpJWQgOiB1c2luZyBpbml0aWF0b3IgSUQgJWRcbiIsIGhvc3QtPmhvc3Rfbm8sCisgICAgCSAgICBob3N0LT50aGlzX2lkKTsKKworICAgIC8qCisgICAgICogU2F2ZSBpbXBvcnRhbnQgcmVnaXN0ZXJzIHRvIGFsbG93IGEgc29mdCByZXNldC4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ1RFU1Q3IGNvbnRyb2xzIGNhY2hlIHNub29waW5nLCBidXJzdCBtb2RlLCBhbmQgc3VwcG9ydCBmb3IgCisgICAgICogZXh0ZXJuYWwgZGlmZmVyZW50aWFsIGRyaXZlcnMuICBUaGlzIGlzbid0IGN1cnJlbnRseSB1c2VkIC0gdGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBtYXkgbm90IGJlIG9wdGltYWwgYW55d2F5LgorICAgICAqIEV2ZW4gd29yc2UsIGl0IG1heSBuZXZlciBoYXZlIGJlZW4gc2V0IHVwIHNpbmNlIHJlc2V0LgorICAgICAqLworICAgIGhvc3RkYXRhLT5zYXZlZF9jdGVzdDcgPSBOQ1I1M2M3eDBfcmVhZDgoQ1RFU1Q3X1JFRykgJiBDVEVTVDdfU0FWRTsKKyAgICByZXZpc2lvbiA9IChOQ1I1M2M3eDBfcmVhZDgoQ1RFU1Q4X1JFRykgJiAweEYwKSA+PiA0OworICAgIHN3aXRjaCAocmV2aXNpb24pIHsKKwljYXNlIDE6IHJldmlzaW9uID0gMDsgICAgYnJlYWs7CisJY2FzZSAyOiByZXZpc2lvbiA9IDE7ICAgIGJyZWFrOworCWNhc2UgNDogcmV2aXNpb24gPSAyOyAgICBicmVhazsKKwljYXNlIDg6IHJldmlzaW9uID0gMzsgICAgYnJlYWs7CisJZGVmYXVsdDogcmV2aXNpb24gPSAyNTU7IGJyZWFrOworICAgIH0KKyAgICBwcmludGsoInNjc2klZDogUmV2aXNpb24gMHgleFxuIixob3N0LT5ob3N0X25vLHJldmlzaW9uKTsKKworICAgIGlmICgocmV2aXNpb24gPT0gMCB8fCByZXZpc2lvbiA9PSAyNTUpICYmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fU1lOQ0hST05PVVN8T1BUSU9OX0RJU0NPTk5FQ1R8T1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUykpKQorICAgIHsKKwlwcmludGsgKCJzY3NpJWQ6IERpc2FibGluZyBzeW5jIHdvcmtpbmcgYW5kIGRpc2Nvbm5lY3QvcmVzZWxlY3RcbiIsCisJCQkJCQkJaG9zdC0+aG9zdF9ubyk7CisJaG9zdGRhdGEtPm9wdGlvbnMgJj0gfihPUFRJT05fU1lOQ0hST05PVVN8T1BUSU9OX0RJU0NPTk5FQ1R8T1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBPbiBOQ1I1M2M3MDAgc2VyaWVzIGNoaXBzLCBEQ05UTCBjb250cm9scyB0aGUgU0NTSSBjbG9jayBkaXZpc29yLAorICAgICAqIG9uIDgwMCBzZXJpZXMgY2hpcHMsIGl0IGFsbG93cyBmb3IgYSB0b3RlbS1wb2xlIElSUSBkcml2ZXIuCisgICAgICogTk9URSBzYXZlZF9kY250bCBjdXJyZW50bHkgb3ZlcndyaXR0ZW4gaW4gaW5pdCBmdW5jdGlvbi4KKyAgICAgKiBUaGUgdmFsdWUgcmVhZCBoZXJlIG1heSBiZSBnYXJiYWdlIGFueXdheSwgTVZNRTE2eCBib2FyZCBhdCBsZWFzdAorICAgICAqIGRvZXMgbm90IGluaXRpYWxpc2UgY2hpcCBpZiBrZXJuZWwgYXJyaXZlZCB2aWEgdGZ0cC4KKyAgICAgKi8KKworICAgIGhvc3RkYXRhLT5zYXZlZF9kY250bCA9IE5DUjUzYzd4MF9yZWFkOChEQ05UTF9SRUcpOworCisgICAgLyoKKyAgICAgKiBETU9ERSBjb250cm9scyBETUEgYnVyc3QgbGVuZ3RoLCBhbmQgb24gNzAwIHNlcmllcyBjaGlwcywKKyAgICAgKiAyODYgbW9kZSBhbmQgYnVzIHdpZHRoICAKKyAgICAgKiBOT1RFOiAgT24gTVZNRTE2eCwgY2hpcCBtYXkgaGF2ZSBiZWVuIHJlc2V0LCBzbyB0aGlzIGNvdWxkIGJlIGEKKyAgICAgKiBwb3dlci1vbi9yZXNldCBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIGhvc3RkYXRhLT5zYXZlZF9kbW9kZSA9IE5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+ZG1vZGUpOworCisgICAgLyogCisgICAgICogTm93IHRoYXQgYnVyc3QgbGVuZ3RoIGFuZCBlbmFibGVkL2Rpc2FibGVkIHN0YXR1cyBpcyBrbm93biwgCisgICAgICogY2x1ZSB0aGUgdXNlciBpbiBvbiBpdC4gIAorICAgICAqLworICAgCisgICAgY2NmID0gY2xvY2tfdG9fY2NmXzcxMCAoZXhwZWN0ZWRfY2xvY2spOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIAorCWhvc3RkYXRhLT5jbWRfYWxsb2NhdGVkW2ldID0gMDsKKworICAgIGlmIChob3N0ZGF0YS0+aW5pdF9zYXZlX3JlZ3MpCisgICAgCWhvc3RkYXRhLT5pbml0X3NhdmVfcmVncyAoaG9zdCk7CisgICAgaWYgKGhvc3RkYXRhLT5pbml0X2ZpeHVwKQorICAgIAlob3N0ZGF0YS0+aW5pdF9maXh1cCAoaG9zdCk7CisKKyAgICBpZiAoIXRoZV90ZW1wbGF0ZSkgeworCXRoZV90ZW1wbGF0ZSA9IGhvc3QtPmhvc3R0OworCWZpcnN0X2hvc3QgPSBob3N0OworICAgIH0KKworICAgIC8qIAorICAgICAqIExpbnV4IFNDU0kgZHJpdmVycyBoYXZlIGFsd2F5cyBiZWVuIHBsYWd1ZWQgd2l0aCBpbml0aWFsaXphdGlvbiAKKyAgICAgKiBwcm9ibGVtcyAtIHNvbWUgZGlkbid0IHdvcmsgd2l0aCB0aGUgQklPUyBkaXNhYmxlZCBzaW5jZSB0aGV5IGV4cGVjdGVkCisgICAgICogaW5pdGlhbGl6YXRpb24gZnJvbSBpdCwgc29tZSBkaWRuJ3Qgd29yayB3aGVuIHRoZSBuZXR3b3JraW5nIGNvZGUKKyAgICAgKiB3YXMgZW5hYmxlZCBhbmQgcmVnaXN0ZXJzIGdvdCBzY3JhbWJsZWQsIGV0Yy4KKyAgICAgKgorICAgICAqIFRvIGF2b2lkIHByb2JsZW1zIGxpa2UgdGhpcywgaW4gdGhlIGZ1dHVyZSwgd2Ugd2lsbCBkbyBhIHNvZnQgCisgICAgICogcmVzZXQgb24gdGhlIFNDU0kgY2hpcCwgdGFraW5nIGl0IGJhY2sgdG8gYSBzYW5lIHN0YXRlLgorICAgICAqLworCisgICAgaG9zdGRhdGEtPnNvZnRfcmVzZXQgKGhvc3QpOworCisjaWYgMQorICAgIGhvc3RkYXRhLT5kZWJ1Z19jb3VudF9saW1pdCA9IC0xOworI2Vsc2UKKyAgICBob3N0ZGF0YS0+ZGVidWdfY291bnRfbGltaXQgPSAxOworI2VuZGlmCisgICAgaG9zdGRhdGEtPmludHJzID0gLTE7CisgICAgaG9zdGRhdGEtPnJlc2V0cyA9IC0xOworICAgIG1lbWNweSAoKHZvaWQgKikgaG9zdGRhdGEtPnN5bmNocm9ub3VzX3dhbnQsICh2b2lkICopIHNkdHJfbWVzc2FnZSwgCisJc2l6ZW9mIChob3N0ZGF0YS0+c3luY2hyb25vdXNfd2FudCkpOworCisgICAgTkNSNTNjN3gwX2RyaXZlcl9pbml0IChob3N0KTsKKworICAgIGlmIChyZXF1ZXN0X2lycShob3N0LT5pcnEsIE5DUjUzYzd4MF9pbnRyLCBTQV9TSElSUSwgIjUzYzd4eCIsIGhvc3QpKQorICAgIHsKKwlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBkZXRhY2hpbmdcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGhvc3QtPmlycSk7CisJZ290byBlcnJfdW5yZWdpc3RlcjsKKyAgICB9IAorCisgICAgaWYgKChob3N0ZGF0YS0+cnVuX3Rlc3RzICYmIGhvc3RkYXRhLT5ydW5fdGVzdHMoaG9zdCkgPT0gLTEpIHx8CisgICAgICAgIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19URVNUU19PTkxZKSkgeworICAgIAkvKiBYWFggU2hvdWxkIGRpc2FibGUgaW50ZXJydXB0cywgZXRjLiBoZXJlICovCisJZ290byBlcnJfZnJlZV9pcnE7CisgICAgfSBlbHNlIHsKKwlpZiAoaG9zdC0+aW9fcG9ydCkgIHsKKwkgICAgaG9zdC0+bl9pb19wb3J0ID0gMTI4OworCSAgICBpZiAoIXJlcXVlc3RfcmVnaW9uIChob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJuY3I1M2M3eHgiKSkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoTkNSNTNjN3gwX3JlYWQ4IChTQkNMX1JFRykgJiBTQkNMX0JTWSkgeworCXByaW50ayAoInNjc2klZCA6IGJ1cyB3ZWRnZSwgZG9pbmcgU0NTSSByZXNldFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJaGFyZF9yZXNldCAoaG9zdCk7CisgICAgfQorICAgIHJldHVybiAwOworCisgZXJyX2ZyZWVfaXJxOgorICAgIGZyZWVfaXJxKGhvc3QtPmlycSwgIE5DUjUzYzd4MF9pbnRyKTsKKyBlcnJfdW5yZWdpc3RlcjoKKyAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IG5jcjUzYzd4eF9pbml0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCwgaW50IGJvYXJkLCBpbnQgY2hpcCwKKyAqCXVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGlvX3BvcnQsIGludCBpcnEsIGludCBkbWEsIGxvbmcgbG9uZyBvcHRpb25zLAorICoJaW50IGNsb2NrKTsKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZXMgYSBOQ1I1M2M3LDh4MCBiYXNlZCBvbiBiYXNlIGFkZHJlc3NlcywKKyAqCUlSUSwgYW5kIERNQSBjaGFubmVsLgkKKyAqCQorICogSW5wdXRzIDogdHBudCAtIFRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlciwgYm9hcmQgLSBib2FyZCBsZXZlbAorICoJcHJvZHVjdCwgY2hpcCAtIDcxMAorICogCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoKKyAqLworCitpbnQgCituY3I1M2M3eHhfaW5pdCAoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50LCBpbnQgYm9hcmQsIGludCBjaGlwLAorICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IGlvX3BvcnQsIGludCBpcnEsIGludCBkbWEsIAorICAgIGxvbmcgbG9uZyBvcHRpb25zLCBpbnQgY2xvY2spCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisgICAgY2hhciBjaGlwX3N0cls4MF07CisgICAgaW50IHNjcmlwdF9sZW4gPSAwLCBkc2FfbGVuID0gMCwgc2l6ZSA9IDAsIG1heF9jbWRfc2l6ZSA9IDAsCisJc2NoZWR1bGVfc2l6ZSA9IDAsIG9rID0gMDsKKyAgICB2b2lkICp0bXA7CisgICAgdW5zaWduZWQgbG9uZyBwYWdlOworCisgICAgc3dpdGNoIChjaGlwKSB7CisgICAgY2FzZSA3MTA6CisgICAgY2FzZSA3NzA6CisJc2NoZWR1bGVfc2l6ZSA9ICh0cG50LT5jYW5fcXVldWUgKyAxKSAqIDggLyogSlVNUCBpbnN0cnVjdGlvbiBzaXplICovOworCXNjcmlwdF9sZW4gPSBOQ1I1M2M3eHhfc2NyaXB0X2xlbjsKKyAgICAJZHNhX2xlbiA9IE5DUjUzYzd4eF9kc2FfbGVuOworICAgIAlvcHRpb25zIHw9IE9QVElPTl9JTlRGTFk7CisgICAgCXNwcmludGYgKGNoaXBfc3RyLCAiTkNSNTNjJWQiLCBjaGlwKTsKKyAgICAJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAJcHJpbnRrKCJzY3NpLW5jcjUzYzd4eCA6IHVuc3VwcG9ydGVkIFNDU0kgY2hpcCAlZFxuIiwgY2hpcCk7CisgICAgCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcmludGsoInNjc2ktbmNyNTNjN3h4IDogJXMgYXQgbWVtb3J5IDB4JWx4LCBpbyAweCV4LCBpcnEgJWQiLAorICAgIAljaGlwX3N0ciwgYmFzZSwgaW9fcG9ydCwgaXJxKTsKKyAgICBpZiAoZG1hID09IERNQV9OT05FKQorICAgIAlwcmludGsoIlxuIik7CisgICAgZWxzZSAKKyAgICAJcHJpbnRrKCIsIGRtYSAlZFxuIiwgZG1hKTsKKworICAgIGlmIChvcHRpb25zICYgT1BUSU9OX0RFQlVHX1BST0JFX09OTFkpIHsKKyAgICAJcHJpbnRrICgic2NzaS1uY3I1M2M3eHggOiBwcm9iZSBvbmx5IGVuYWJsZWQsIGFib3J0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKKyAgICAJcmV0dXJuIC0xOworICAgIH0KKworICAgIG1heF9jbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgTkNSNTNjN3gwX2NtZCkgKyBkc2FfbGVuICsKKyAgICAJLyogU2l6ZSBvZiBkeW5hbWljIHBhcnQgb2YgY29tbWFuZCBzdHJ1Y3R1cmUgOiAqLworCTIgKiAvKiBXb3JzdCBjYXNlIDogd2UgZG9uJ3Qga25vdyBpZiB3ZSBuZWVkIERBVEEgSU4gb3IgREFUQSBvdXQgKi8KKwkJKCAyICogLyogQ3VycmVudCBpbnN0cnVjdGlvbnMgcGVyIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnQgKi8gCisgICAgICAgIAkgIHRwbnQtPnNnX3RhYmxlc2l6ZSArIAorICAgICAgICAgICAgICAgICAgMyAvKiBDdXJyZW50IHN0YXJ0dXAgLyB0ZXJtaW5hdGlvbiByZXF1aXJlZCBwZXIgcGhhc2UgKi8KKwkJKSAqCisJOCAvKiBFYWNoIGluc3RydWN0aW9uIGlzIGVpZ2h0IGJ5dGVzICovOworCisgICAgLyogQWxsb2NhdGUgZml4ZWQgcGFydCBvZiBob3N0ZGF0YSwgZHluYW1pYyBwYXJ0IHRvIGhvbGQgYXBwcm9wcmlhdGUKKyAgICAgICBTQ1NJIFNDUklQVCh0bSkgcGx1cyBhIHNpbmdsZSwgbWF4aW11bS1zaXplZCBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZS4KKworICAgICAgIFdlIG5lZWQgYSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSBmb3Igc2Nhbl9zY3NpcygpIHdoZW4gd2UgYXJlIAorICAgICAgIG5vdCBsb2FkZWQgYXMgYSBtb2R1bGUsIGFuZCB3aGVuIHdlJ3JlIGxvYWRlZCBhcyBhIG1vZHVsZSwgd2UgCisgICAgICAgY2FuJ3QgdXNlIGEgbm9uLWR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmUgYmVjYXVzZSBtb2R1bGVzCisgICAgICAgYXJlIHZtYWxsb2MoKSdkLCB3aGljaCBjYW4gYWxsb3cgc3RydWN0dXJlcyB0byBjcm9zcyBwYWdlIAorICAgICAgIGJvdW5kYXJpZXMgYW5kIGJyZWFrcyBvdXIgcGh5c2ljYWwvdmlydHVhbCBhZGRyZXNzIGFzc3VtcHRpb25zCisgICAgICAgZm9yIERNQS4KKworICAgICAgIFNvLCB3ZSBzdGljayBpdCBwYXN0IHRoZSBlbmQgb2Ygb3VyIGhvc3RkYXRhIHN0cnVjdHVyZS4KKworICAgICAgIEFTU1VNUFRJT04gOiAKKyAgICAgICAJIFJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgc2ltdWx0YW5lb3VzIFNDU0kgY29tbWFuZHMgd2UgYWxsb3csCisJIHRoZSBwcm9iZSBjb2RlIG9ubHkgZXhlY3V0ZXMgYSBfc2luZ2xlXyBpbnN0cnVjdGlvbiBhdCBhIHRpbWUsCisJIHNvIHdlIG9ubHkgbmVlZCBvbmUgaGVyZSwgYW5kIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgTkNSNTNjN3gwX2NtZAorCSBzdHJ1Y3R1cmVzIGZvciBlYWNoIHRhcmdldCB1bnRpbCB3ZSBhcmUgbm8gbG9uZ2VyIGluIHNjYW5fc2NzaXMKKwkgYW5kIGttYWxsb2MoKSBoYXMgYmVjb21lIGZ1bmN0aW9uYWwgKG1lbW9yeV9pbml0KCkgaGFwcGVucyAKKwkgYWZ0ZXIgYWxsIGRldmljZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24pLgorICAgICovCisKKyAgICBzaXplID0gc2l6ZW9mKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEpICsgc2NyaXB0X2xlbiArIAorICAgIC8qIE5vdGUgdGhhdCBhbGlnbm1lbnQgd2lsbCBiZSBndWFyYW50ZWVkLCBzaW5jZSB3ZSBwdXQgdGhlIGNvbW1hbmQKKyAgICAgICBhbGxvY2F0ZWQgYXQgcHJvYmUgdGltZSBhZnRlciB0aGUgZml4ZWQtdXAgU0NTSSBzY3JpcHQsIHdoaWNoIAorICAgICAgIGNvbnNpc3RzIG9mIDMyIGJpdCB3b3JkcywgYWxpZ25lZCBvbiBhIDMyIGJpdCBib3VuZGFyeS4gIEJ1dAorICAgICAgIG9uIGEgNjRiaXQgbWFjaGluZSB3ZSBuZWVkIDggYnl0ZSBhbGlnbm1lbnQgZm9yIGhvc3RkYXRhLT5mcmVlLCBzbworICAgICAgIHdlIGFkZCBpbiBhbm90aGVyIDQgYnl0ZXMgdG8gdGFrZSBjYXJlIG9mIHBvdGVudGlhbCBtaXNhbGlnbm1lbnQKKyAgICAgICAqLworCShzaXplb2Yodm9pZCAqKSAtIHNpemVvZih1MzIpKSArIG1heF9jbWRfc2l6ZSArIHNjaGVkdWxlX3NpemU7CisKKyAgICBwYWdlID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLDEpOworICAgIGlmKHBhZ2U9PTApCisgICAgeworICAgIAlwcmludGsoS0VSTl9FUlIgIjUzYzd4eDogb3V0IG9mIG1lbW9yeS5cbiIpOworICAgIAlyZXR1cm4gLUVOT01FTTsKKyAgICB9CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorICAgIC8qCisgICAgICogNTNjNzEwIHJldi4wIGRvZXNuJ3QgaGF2ZSBhbiBhZGQtd2l0aC1jYXJyeSBpbnN0cnVjdGlvbi4KKyAgICAgKiBFbnN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBmb3JjZSBEU0EgYWxpZ25tZW50LgorICAgICovCisgICAgc2l6ZSArPSAyNTY7CisjZW5kaWYKKyAgICAvKiBTaXplIHNob3VsZCBiZSA8IDhLLCBzbyB3ZSBjYW4gZml0IGl0IGluIHR3byBwYWdlcy4gKi8KKyAgICBpZiAoc2l6ZSA+IDgxOTIpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiNTNjN3h4OiBob3N0ZGF0YSA+IDhLXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIDQpOworICAgIGlmICghaW5zdGFuY2UpCisgICAgeworICAgICAgICBmcmVlX3BhZ2UocGFnZSk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnN0YW5jZS0+aG9zdGRhdGFbMF0gPSBwYWdlOworICAgIG1lbXNldCgodm9pZCAqKWluc3RhbmNlLT5ob3N0ZGF0YVswXSwgMCwgODE5Mik7CisgICAgY2FjaGVfcHVzaCh2aXJ0X3RvX3BoeXMoKHZvaWQgKikoaW5zdGFuY2UtPmhvc3RkYXRhWzBdKSksIDgxOTIpOworICAgIGNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cygodm9pZCAqKShpbnN0YW5jZS0+aG9zdGRhdGFbMF0pKSwgODE5Mik7CisgICAga2VybmVsX3NldF9jYWNoZW1vZGUoKHZvaWQgKilpbnN0YW5jZS0+aG9zdGRhdGFbMF0sIDgxOTIsIElPTUFQX05PQ0FDSEVfU0VSKTsKKworICAgIC8qIEZJWE1FIDogaWYgd2UgZXZlciBzdXBwb3J0IGFuIElTQSBOQ1I1M2M3eHggYmFzZWQgYm9hcmQsIHdlCisgICAgICAgbmVlZCB0byBjaGVjayBpZiB0aGUgY2hpcCBpcyBydW5uaW5nIGluIGEgMTYgYml0IG1vZGUsIGFuZCBpZiBzbyAKKyAgICAgICB1bnJlZ2lzdGVyIGl0IGlmIGl0IGlzIHBhc3QgdGhlIDE2TSAoMHgxMDAwMDAwKSBtYXJrICovCisKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhWzBdOworICAgIGhvc3RkYXRhLT5zaXplID0gc2l6ZTsKKyAgICBob3N0ZGF0YS0+c2NyaXB0X2NvdW50ID0gc2NyaXB0X2xlbiAvIHNpemVvZih1MzIpOworICAgIGhvc3RkYXRhLT5ib2FyZCA9IGJvYXJkOworICAgIGhvc3RkYXRhLT5jaGlwID0gY2hpcDsKKworICAgIC8qCisgICAgICogQmVpbmcgbWVtb3J5IG1hcHBlZCBpcyBtb3JlIGRlc2lyYWJsZSwgc2luY2UgCisgICAgICoKKyAgICAgKiAtIE1lbW9yeSBhY2Nlc3NlcyBtYXkgYmUgZmFzdGVyLgorICAgICAqCisgICAgICogLSBUaGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBhZGRyZXNzIHNwYWNlcyBhcmUgdGhlIHNhbWUgZm9yIAorICAgICAqCSBhbGwgaW5zdHJ1Y3Rpb25zLCBtZWFuaW5nIHdlIGRvbid0IGhhdmUgdG8gdHdpZGRsZSBkbW9kZSBvciAKKyAgICAgKgkgYW55IG90aGVyIHJlZ2lzdGVycy4KKyAgICAgKgorICAgICAqIFNvLCB3ZSB0cnkgZm9yIG1lbW9yeSBtYXBwZWQsIGFuZCBpZiB3ZSBkb24ndCBnZXQgaXQsCisgICAgICogd2UgZ28gZm9yIHBvcnQgbWFwcGVkLCBhbmQgdGhhdCBmYWlsaW5nIHdlIHRlbGwgdGhlIHVzZXIKKyAgICAgKiBpdCBjYW4ndCB3b3JrLgorICAgICAqLworCisgICAgaWYgKGJhc2UpIHsKKwlpbnN0YW5jZS0+YmFzZSA9IGJhc2U7CisJLyogQ2hlY2sgZm9yIGZvcmNlZCBJL08gbWFwcGluZyAqLworICAgIAlpZiAoIShvcHRpb25zICYgT1BUSU9OX0lPX01BUFBFRCkpIHsKKwkgICAgb3B0aW9ucyB8PSBPUFRJT05fTUVNT1JZX01BUFBFRDsKKwkgICAgb2sgPSAxOworCX0KKyAgICB9IGVsc2UgeworCW9wdGlvbnMgJj0gfk9QVElPTl9NRU1PUllfTUFQUEVEOworICAgIH0KKworICAgIGlmIChpb19wb3J0KSB7CisJaW5zdGFuY2UtPmlvX3BvcnQgPSBpb19wb3J0OworCW9wdGlvbnMgfD0gT1BUSU9OX0lPX01BUFBFRDsKKwlvayA9IDE7CisgICAgfSBlbHNlIHsKKwlvcHRpb25zICY9IH5PUFRJT05fSU9fTUFQUEVEOworICAgIH0KKworICAgIGlmICghb2spIHsKKwlwcmludGsgKCJzY3NpJWQgOiBub3QgaW5pdGlhbGl6aW5nLCBubyBJL08gb3IgbWVtb3J5IG1hcHBpbmcga25vd24gXG4iLAorCSAgICBpbnN0YW5jZS0+aG9zdF9ubyk7CisJc2NzaV91bnJlZ2lzdGVyIChpbnN0YW5jZSk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnN0YW5jZS0+aXJxID0gaXJxOworICAgIGluc3RhbmNlLT5kbWFfY2hhbm5lbCA9IGRtYTsKKworICAgIGhvc3RkYXRhLT5vcHRpb25zID0gb3B0aW9uczsKKyAgICBob3N0ZGF0YS0+ZHNhX2xlbiA9IGRzYV9sZW47CisgICAgaG9zdGRhdGEtPm1heF9jbWRfc2l6ZSA9IG1heF9jbWRfc2l6ZTsKKyAgICBob3N0ZGF0YS0+bnVtX2NtZHMgPSAxOworICAgIGhvc3RkYXRhLT5zY3NpX2Nsb2NrID0gY2xvY2s7CisgICAgLyogSW5pdGlhbGl6ZSBzaW5nbGUgY29tbWFuZCAqLworICAgIHRtcCA9IChob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPnNjcmlwdF9jb3VudCk7CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorICAgIHsKKwl2b2lkICp0ID0gUk9VTkRVUCh0bXAsIHZvaWQgKik7CisJaWYgKCgodTMyKXQgJiAweGZmKSA+IENtZFBhZ2VTdGFydCkKKwkgICAgdCA9ICh2b2lkICopKCh1MzIpdCArIDI1NSk7CisJdCA9ICh2b2lkICopKCgodTMyKXQgJiB+MHhmZikgKyBDbWRQYWdlU3RhcnQpOworICAgICAgICBob3N0ZGF0YS0+ZnJlZSA9IHQ7CisjaWYgMAorCXByaW50ayAoInNjc2k6IFJlZ2lzdGVyZWQgc2l6ZSBpbmNyZWFzZWQgYnkgMjU2IHRvICVkXG4iLCBzaXplKTsKKwlwcmludGsgKCJzY3NpOiBDbWRQYWdlU3RhcnQgPSAweCUwMnhcbiIsIENtZFBhZ2VTdGFydCk7CisJcHJpbnRrICgic2NzaTogdG1wID0gMHglMDh4LCBob3N0ZGF0YS0+ZnJlZSBzZXQgdG8gMHglMDh4XG4iLAorCQkJKHUzMil0bXAsICh1MzIpdCk7CisjZW5kaWYKKyAgICB9CisjZWxzZQorICAgIGhvc3RkYXRhLT5mcmVlID0gUk9VTkRVUCh0bXAsIHZvaWQgKik7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+ZnJlZS0+cmVhbCA9IHRtcDsKKyAgICBob3N0ZGF0YS0+ZnJlZS0+c2l6ZSA9IG1heF9jbWRfc2l6ZTsKKyAgICBob3N0ZGF0YS0+ZnJlZS0+ZnJlZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmZyZWUtPm5leHQgPSBOVUxMOworICAgIGhvc3RkYXRhLT5leHRyYV9hbGxvY2F0ZSA9IDA7CisKKyAgICAvKiBBbGxvY2F0ZSBjb21tYW5kIHN0YXJ0IGNvZGUgc3BhY2UgKi8KKyAgICBob3N0ZGF0YS0+c2NoZWR1bGUgPSAoY2hpcCA9PSA3MDAgfHwgY2hpcCA9PSA3MDA2NikgPworCU5VTEwgOiAodTMyICopICgoY2hhciAqKWhvc3RkYXRhLT5mcmVlICsgbWF4X2NtZF9zaXplKTsKKworLyogCisgKiBGb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcywgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgaG93IGZhc3QgdGhpbmdzIGJsYXplLgorICogRm9yIHByb2ZpbGluZywgd2Ugd2FudCB0byBhY2Nlc3MgdGhlIDgwMG5zIHJlc29sdXRpb24gc3lzdGVtIGNsb2NrLAorICogdXNpbmcgYSAnQycgY2FsbCBvbiB0aGUgaG9zdCBwcm9jZXNzb3IuCisgKgorICogVGhlcmVmb3JlLCB0aGVyZSdzIG5vIG5lZWQgZm9yIHRoZSBOQ1IgY2hpcCB0byBkaXJlY3RseSBtYW5pcHVsYXRlCisgKiB0aGlzIGRhdGEsIGFuZCB3ZSBzaG91bGQgcHV0IGl0IHdoZXJldmVyIGlzIG1vc3QgY29udmVuaWVudCBmb3IgCisgKiBMaW51eC4KKyAqLworICAgIGlmICh0cmFja19ldmVudHMpIAorCWhvc3RkYXRhLT5ldmVudHMgPSAoc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqKSAodHJhY2tfZXZlbnRzID8gCisJICAgIHZtYWxsb2MgKHNpemVvZiAoc3RydWN0IE5DUjUzYzd4MF9ldmVudCkgKiB0cmFja19ldmVudHMpIDogTlVMTCk7CisgICAgZWxzZQorCWhvc3RkYXRhLT5ldmVudHMgPSBOVUxMOworCisgICAgaWYgKGhvc3RkYXRhLT5ldmVudHMpIHsKKwltZW1zZXQgKCh2b2lkICopIGhvc3RkYXRhLT5ldmVudHMsIDAsIHNpemVvZihzdHJ1Y3QgTkNSNTNjN3gwX2V2ZW50KSAqCisJICAgIHRyYWNrX2V2ZW50cyk7CQorCWhvc3RkYXRhLT5ldmVudF9zaXplID0gdHJhY2tfZXZlbnRzOworCWhvc3RkYXRhLT5ldmVudF9pbmRleCA9IDA7CisgICAgfSBlbHNlIAorCWhvc3RkYXRhLT5ldmVudF9zaXplID0gMDsKKworICAgIHJldHVybiBOQ1I1M2M3eDBfaW5pdChpbnN0YW5jZSk7Cit9CisKKworLyogCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIE5DUjUzYzd4MF9pbml0X2ZpeHVwIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiAgY29weSBhbmQgZml4dXAgdGhlIFNDU0kgU0NSSVBUUyh0bSkgY29kZSBmb3IgdGhpcyBkZXZpY2UuCisgKgorICogSW5wdXRzIDogaG9zdCAtIHBvaW50ZXIgdG8gdGhpcyBob3N0IGFkYXB0ZXIncyBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgCitOQ1I1M2M3eDBfaW5pdF9maXh1cCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIHVuc2lnbmVkIGNoYXIgdG1wOworICAgIGludCBpLCBuY3JfdG9fbWVtb3J5LCBtZW1vcnlfdG9fbmNyOworICAgIHUzMiBiYXNlOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworCisgICAgLyogWFhYIC0gTk9URSA6IHRoaXMgY29kZSBNVVNUIGJlIG1hZGUgZW5kaWFuIGF3YXJlICovCisgICAgLyogIENvcHkgY29kZSBpbnRvIGJ1ZmZlciB0aGF0IHdhcyBhbGxvY2F0ZWQgYXQgZGV0ZWN0aW9uIHRpbWUuICAqLworICAgIG1lbWNweSAoKHZvaWQgKikgaG9zdGRhdGEtPnNjcmlwdCwgKHZvaWQgKikgU0NSSVBULCAKKwlzaXplb2YoU0NSSVBUKSk7CisgICAgLyogRml4dXAgbGFiZWxzICovCisgICAgZm9yIChpID0gMDsgaSA8IFBBVENIRVM7ICsraSkgCisJaG9zdGRhdGEtPnNjcmlwdFtMQUJFTFBBVENIRVNbaV1dICs9IAorICAgIAkgICAgdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCk7CisgICAgLyogRml4dXAgYWRkcmVzc2VzIG9mIGNvbnN0YW50cyB0aGF0IHVzZWQgdG8gYmUgRVhURVJOQUwgKi8KKworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgTkNSNTNjN3h4X21zZ19hYm9ydCwgCisgICAgCXZpcnRfdG9fYnVzKCYoaG9zdGRhdGEtPk5DUjUzYzd4eF9tc2dfYWJvcnQpKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBOQ1I1M2M3eHhfbXNnX3JlamVjdCwgCisgICAgCXZpcnRfdG9fYnVzKCYoaG9zdGRhdGEtPk5DUjUzYzd4eF9tc2dfcmVqZWN0KSkpOworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgTkNSNTNjN3h4X3plcm8sIAorICAgIAl2aXJ0X3RvX2J1cygmKGhvc3RkYXRhLT5OQ1I1M2M3eHhfemVybykpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIE5DUjUzYzd4eF9zaW5rLCAKKyAgICAJdmlydF90b19idXMoJihob3N0ZGF0YS0+TkNSNTNjN3h4X3NpbmspKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBOT1BfaW5zbiwKKwl2aXJ0X3RvX2J1cygmKGhvc3RkYXRhLT5OT1BfaW5zbikpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIHNjaGVkdWxlLAorCXZpcnRfdG9fYnVzKCh2b2lkICopIGhvc3RkYXRhLT5zY2hlZHVsZSkpOworCisgICAgLyogRml4dXAgcmVmZXJlbmNlcyB0byBleHRlcm5hbCB2YXJpYWJsZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IEVYVEVSTkFMX1BBVENIRVNfTEVOOyArK2kpCisgICAgICAgaG9zdGRhdGEtPnNjcmlwdFtFWFRFUk5BTF9QQVRDSEVTW2ldLm9mZnNldF0gKz0KKyAgICAgICAgIHZpcnRfdG9fYnVzKEVYVEVSTkFMX1BBVENIRVNbaV0uYWRkcmVzcyk7CisKKyAgICAvKiAKKyAgICAgKiBGaXh1cCBhYnNvbHV0ZXMgc2V0IGF0IGJvb3QtdGltZS4KKyAgICAgKiAKKyAgICAgKiBBbGwgbm9uLWNvZGUgYWJzb2x1dGUgdmFyaWFibGVzIHN1ZmZpeGVkIHdpdGggImRzYV8iIGFuZCAiaW50XyIKKyAgICAgKiBhcmUgY29uc3RhbnRzLCBhbmQgbmVlZCBubyBmaXh1cCBwcm92aWRlZCB0aGUgYXNzZW1ibGVyIGhhcyBkb25lIAorICAgICAqIGl0IGZvciB1cyAoSSBkb24ndCBrbm93IHdoYXQgdGhlICJyZWFsIiBOQ1IgYXNzZW1ibGVyIGRvZXMgaW4gCisgICAgICogdGhpcyBjYXNlLCBteSBhc3NlbWJsZXIgZG9lcyB0aGUgcmlnaHQgbWFnaWMpLgorICAgICAqLworCisgICAgcGF0Y2hfYWJzX3J3cmlfZGF0YSAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgZHNhX3NhdmVfZGF0YV9wb2ludGVyLCAKKyAgICAJRW50X2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyIC0gRW50X2RzYV96ZXJvKTsKKyAgICBwYXRjaF9hYnNfcndyaV9kYXRhIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBkc2FfcmVzdG9yZV9wb2ludGVycywKKyAgICAJRW50X2RzYV9jb2RlX3Jlc3RvcmVfcG9pbnRlcnMgLSBFbnRfZHNhX3plcm8pOworICAgIHBhdGNoX2Fic19yd3JpX2RhdGEgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGRzYV9jaGVja19yZXNlbGVjdCwKKyAgICAJRW50X2RzYV9jb2RlX2NoZWNrX3Jlc2VsZWN0IC0gRW50X2RzYV96ZXJvKTsKKworICAgIC8qCisgICAgICogSnVzdCBmb3IgdGhlIGhlbGwgb2YgaXQsIHByZXNlcnZlIHRoZSBzZXR0aW5ncyBvZiAKKyAgICAgKiBCdXJzdCBMZW5ndGggYW5kIEVuYWJsZSBSZWFkIExpbmUgYml0cyBmcm9tIHRoZSBETU9ERSAKKyAgICAgKiByZWdpc3Rlci4gIE1ha2Ugc3VyZSBTQ1JJUFRTIHN0YXJ0IGF1dG9tYWdpY2FsbHkuCisgICAgICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTZ4KSB8fCBkZWZpbmVkKENPTkZJR19CVk1FNjAwMCkKKyAgICAvKiBXZSBrbm93IGJldHRlciB3aGF0IHdlIHdhbnQgdGhhbiAxNnhCdWcgZG9lcyEgKi8KKyAgICB0bXAgPSBETU9ERV8xMF9CTF84IHwgRE1PREVfMTBfRkMyOworI2Vsc2UKKyAgICB0bXAgPSBOQ1I1M2M3eDBfcmVhZDgoRE1PREVfUkVHXzEwKTsKKyAgICB0bXAgJj0gKERNT0RFX0JMX01BU0sgfCBETU9ERV8xMF9GQzIgfCBETU9ERV8xMF9GQzEgfCBETU9ERV83MTBfUEQgfAorCQkJCQkJCQlETU9ERV83MTBfVU8pOworI2VuZGlmCisKKyAgICBpZiAoIShob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9NRU1PUllfTUFQUEVEKSkgeworICAgIAliYXNlID0gKHUzMikgaG9zdC0+aW9fcG9ydDsKKyAgICAJbWVtb3J5X3RvX25jciA9IHRtcHxETU9ERV84MDBfRElPTTsKKyAgICAJbmNyX3RvX21lbW9yeSA9IHRtcHxETU9ERV84MDBfU0lPTTsKKyAgICB9IGVsc2UgeworICAgIAliYXNlID0gdmlydF90b19idXMoKHZvaWQgKilob3N0LT5iYXNlKTsKKwltZW1vcnlfdG9fbmNyID0gbmNyX3RvX21lbW9yeSA9IHRtcDsKKyAgICB9CisKKyAgICAvKiBTQ1JBVENIQl9SRUdfMTAgPT0gU0NSQVRDSEFfUkVHXzgwMCwgYXMgaXQgaGFwcGVucyAqLworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgYWRkcl9zY3JhdGNoLCBiYXNlICsgU0NSQVRDSEFfUkVHXzgwMCk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBhZGRyX3RlbXAsIGJhc2UgKyBURU1QX1JFRyk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBhZGRyX2RzYSwgYmFzZSArIERTQV9SRUcpOworCisgICAgLyoKKyAgICAgKiBJIG5lZWRlZCBzb21lIHZhcmlhYmxlcyBpbiB0aGUgc2NyaXB0IHRvIGJlIGFjY2Vzc2libGUgdG8gCisgICAgICogYm90aCB0aGUgTkNSIGNoaXAgYW5kIHRoZSBob3N0IHByb2Nlc3Nvci4gRm9yIHRoZXNlIHZhcmlhYmxlcywKKyAgICAgKiBJIG1hZGUgdGhlIGFyYml0cmFyeSBkZWNpc2lvbiB0byBzdG9yZSB0aGVtIGRpcmVjdGx5IGluIHRoZSAKKyAgICAgKiBob3N0ZGF0YSBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gaW4gdGhlIFJFTEFUSVZFIGFyZWEgb2YgdGhlIAorICAgICAqIFNDUklQVFMuCisgICAgICovCisgICAgCisKKyAgICBwYXRjaF9hYnNfcndyaV9kYXRhIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBkbW9kZV9tZW1vcnlfdG9fbWVtb3J5LCB0bXApOworICAgIHBhdGNoX2Fic19yd3JpX2RhdGEgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGRtb2RlX21lbW9yeV90b19uY3IsIG1lbW9yeV90b19uY3IpOworICAgIHBhdGNoX2Fic19yd3JpX2RhdGEgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGRtb2RlX25jcl90b19tZW1vcnksIG5jcl90b19tZW1vcnkpOworCisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBtc2dfYnVmLCAKKwl2aXJ0X3RvX2J1cygodm9pZCAqKSYoaG9zdGRhdGEtPm1zZ19idWYpKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCByZWNvbm5lY3RfZHNhX2hlYWQsIAorICAgIAl2aXJ0X3RvX2J1cygodm9pZCAqKSYoaG9zdGRhdGEtPnJlY29ubmVjdF9kc2FfaGVhZCkpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkLCAKKwl2aXJ0X3RvX2J1cygodm9pZCAqKSYoaG9zdGRhdGEtPmFkZHJfcmVjb25uZWN0X2RzYV9oZWFkKSkpOworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgcmVzZWxlY3RlZF9pZGVudGlmeSwgCisgICAgCXZpcnRfdG9fYnVzKCh2b2lkICopJihob3N0ZGF0YS0+cmVzZWxlY3RlZF9pZGVudGlmeSkpKTsKKy8qIHJlc2VsZWN0ZWRfdGFnIGlzIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNpZiAwCisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCByZXNlbGVjdGVkX3RhZywgCisgICAgCXZpcnRfdG9fYnVzKCh2b2lkICopJihob3N0ZGF0YS0+cmVzZWxlY3RlZF90YWcpKSk7CisjZW5kaWYKKworICAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgdGVzdF9kZXN0LCAKKwl2aXJ0X3RvX2J1cygodm9pZCopJmhvc3RkYXRhLT50ZXN0X2Rlc3QpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIHRlc3Rfc3JjLCAKKwl2aXJ0X3RvX2J1cygmaG9zdGRhdGEtPnRlc3Rfc291cmNlKSk7CisgICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBzYXZlZF9kc2EsCisJdmlydF90b19idXMoKHZvaWQgKikmaG9zdGRhdGEtPnNhdmVkMl9kc2EpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGVtdWxmbHksCisJdmlydF90b19idXMoKHZvaWQgKikmaG9zdGRhdGEtPmVtdWxhdGVkX2ludGZseSkpOworCisgICAgcGF0Y2hfYWJzX3J3cmlfZGF0YSAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgZHNhX2NoZWNrX3Jlc2VsZWN0LCAKKwkodW5zaWduZWQgY2hhcikoRW50X2RzYV9jb2RlX2NoZWNrX3Jlc2VsZWN0IC0gRW50X2RzYV96ZXJvKSk7CisKKy8qIFRoZXNlIGFyZSBmb3IgZXZlbnQgbG9nZ2luZzsgdGhlIG5jcl9ldmVudCBlbnVtIGNvbnRhaW5zIHRoZSAKKyAgIGFjdHVhbCBpbnRlcnJ1cHQgbnVtYmVycy4gKi8KKyNpZmRlZiBBX2ludF9FVkVOVF9TRUxFQ1QKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX1NFTEVDVCwgKHUzMikgRVZFTlRfU0VMRUNUKTsKKyNlbmRpZgorI2lmZGVmIEFfaW50X0VWRU5UX0RJU0NPTk5FQ1QKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX0RJU0NPTk5FQ1QsICh1MzIpIEVWRU5UX0RJU0NPTk5FQ1QpOworI2VuZGlmCisjaWZkZWYgQV9pbnRfRVZFTlRfUkVTRUxFQ1QKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX1JFU0VMRUNULCAodTMyKSBFVkVOVF9SRVNFTEVDVCk7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9FVkVOVF9DT01QTEVURQorICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBpbnRfRVZFTlRfQ09NUExFVEUsICh1MzIpIEVWRU5UX0NPTVBMRVRFKTsKKyNlbmRpZgorI2lmZGVmIEFfaW50X0VWRU5UX0lETEUKKyAgIHBhdGNoX2Fic18zMiAoaG9zdGRhdGEtPnNjcmlwdCwgMCwgaW50X0VWRU5UX0lETEUsICh1MzIpIEVWRU5UX0lETEUpOworI2VuZGlmCisjaWZkZWYgQV9pbnRfRVZFTlRfU0VMRUNUX0ZBSUxFRAorICAgcGF0Y2hfYWJzXzMyIChob3N0ZGF0YS0+c2NyaXB0LCAwLCBpbnRfRVZFTlRfU0VMRUNUX0ZBSUxFRCwgCisJKHUzMikgRVZFTlRfU0VMRUNUX0ZBSUxFRCk7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9FVkVOVF9CRUZPUkVfU0VMRUNUCisgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGludF9FVkVOVF9CRUZPUkVfU0VMRUNULAorCSh1MzIpIEVWRU5UX0JFRk9SRV9TRUxFQ1QpOworI2VuZGlmCisjaWZkZWYgQV9pbnRfRVZFTlRfUkVTRUxFQ1RfRkFJTEVECisgICBwYXRjaF9hYnNfMzIgKGhvc3RkYXRhLT5zY3JpcHQsIDAsIGludF9FVkVOVF9SRVNFTEVDVF9GQUlMRUQsIAorCSh1MzIpIEVWRU5UX1JFU0VMRUNUX0ZBSUxFRCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogTWFrZSBzdXJlIHRoZSBOQ1IgYW5kIExpbnV4IGNvZGUgYWdyZWUgb24gdGhlIGxvY2F0aW9uIG9mIAorICAgICAqIGNlcnRhaW4gZmllbGRzLgorICAgICAqLworCisgICAgaG9zdGRhdGEtPkVfYWNjZXB0X21lc3NhZ2UgPSBFbnRfYWNjZXB0X21lc3NhZ2U7CisgICAgaG9zdGRhdGEtPkVfY29tbWFuZF9jb21wbGV0ZSA9IEVudF9jb21tYW5kX2NvbXBsZXRlOwkJCisgICAgaG9zdGRhdGEtPkVfY21kb3V0X2NtZG91dCA9IEVudF9jbWRvdXRfY21kb3V0OworICAgIGhvc3RkYXRhLT5FX2RhdGFfdHJhbnNmZXIgPSBFbnRfZGF0YV90cmFuc2ZlcjsKKyAgICBob3N0ZGF0YS0+RV9kZWJ1Z19icmVhayA9IEVudF9kZWJ1Z19icmVhazsJCisgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGUgPSBFbnRfZHNhX2NvZGVfdGVtcGxhdGU7CisgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGVfZW5kID0gRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZDsKKyAgICBob3N0ZGF0YS0+RV9lbmRfZGF0YV90cmFuc2ZlciA9IEVudF9lbmRfZGF0YV90cmFuc2ZlcjsKKyAgICBob3N0ZGF0YS0+RV9pbml0aWF0b3JfYWJvcnQgPSBFbnRfaW5pdGlhdG9yX2Fib3J0OworICAgIGhvc3RkYXRhLT5FX21zZ19pbiA9IEVudF9tc2dfaW47CisgICAgaG9zdGRhdGEtPkVfb3RoZXJfdHJhbnNmZXIgPSBFbnRfb3RoZXJfdHJhbnNmZXI7CisgICAgaG9zdGRhdGEtPkVfb3RoZXJfaW4gPSBFbnRfb3RoZXJfaW47CisgICAgaG9zdGRhdGEtPkVfb3RoZXJfb3V0ID0gRW50X290aGVyX291dDsKKyAgICBob3N0ZGF0YS0+RV9yZWplY3RfbWVzc2FnZSA9IEVudF9yZWplY3RfbWVzc2FnZTsKKyAgICBob3N0ZGF0YS0+RV9yZXNwb25kX21lc3NhZ2UgPSBFbnRfcmVzcG9uZF9tZXNzYWdlOworICAgIGhvc3RkYXRhLT5FX3NlbGVjdCA9IEVudF9zZWxlY3Q7CisgICAgaG9zdGRhdGEtPkVfc2VsZWN0X21zZ291dCA9IEVudF9zZWxlY3RfbXNnb3V0OworICAgIGhvc3RkYXRhLT5FX3RhcmdldF9hYm9ydCA9IEVudF90YXJnZXRfYWJvcnQ7CisjaWZkZWYgRW50X3Rlc3RfMAorICAgIGhvc3RkYXRhLT5FX3Rlc3RfMCA9IEVudF90ZXN0XzA7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+RV90ZXN0XzEgPSBFbnRfdGVzdF8xOworICAgIGhvc3RkYXRhLT5FX3Rlc3RfMiA9IEVudF90ZXN0XzI7CisjaWZkZWYgRW50X3Rlc3RfMworICAgIGhvc3RkYXRhLT5FX3Rlc3RfMyA9IEVudF90ZXN0XzM7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+RV93YWl0X3Jlc2VsZWN0ID0gRW50X3dhaXRfcmVzZWxlY3Q7CisgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfYmVnaW4gPSBFbnRfZHNhX2NvZGVfYmVnaW47CisKKyAgICBob3N0ZGF0YS0+ZHNhX2NtZG91dCA9IEFfZHNhX2NtZG91dDsKKyAgICBob3N0ZGF0YS0+ZHNhX2NtbmQgPSBBX2RzYV9jbW5kOworICAgIGhvc3RkYXRhLT5kc2FfZGF0YWluID0gQV9kc2FfZGF0YWluOworICAgIGhvc3RkYXRhLT5kc2FfZGF0YW91dCA9IEFfZHNhX2RhdGFvdXQ7CisgICAgaG9zdGRhdGEtPmRzYV9lbmQgPSBBX2RzYV9lbmQ7CQkJCisgICAgaG9zdGRhdGEtPmRzYV9tc2dpbiA9IEFfZHNhX21zZ2luOworICAgIGhvc3RkYXRhLT5kc2FfbXNnb3V0ID0gQV9kc2FfbXNnb3V0OworICAgIGhvc3RkYXRhLT5kc2FfbXNnb3V0X290aGVyID0gQV9kc2FfbXNnb3V0X290aGVyOworICAgIGhvc3RkYXRhLT5kc2FfbmV4dCA9IEFfZHNhX25leHQ7CisgICAgaG9zdGRhdGEtPmRzYV9zZWxlY3QgPSBBX2RzYV9zZWxlY3Q7CisgICAgaG9zdGRhdGEtPmRzYV9zdGFydCA9IEVudF9kc2FfY29kZV90ZW1wbGF0ZSAtIEVudF9kc2FfemVybzsKKyAgICBob3N0ZGF0YS0+ZHNhX3N0YXR1cyA9IEFfZHNhX3N0YXR1czsKKyAgICBob3N0ZGF0YS0+ZHNhX2p1bXBfZGVzdCA9IEVudF9kc2FfY29kZV9maXhfanVtcCAtIEVudF9kc2FfemVybyArIAorCTggLyogZGVzdGluYXRpb24gb3BlcmFuZCAqLzsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChBX2RzYV9maWVsZHNfc3RhcnQgIT0gRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIAorICAgIAlFbnRfZHNhX3plcm8pIAorICAgIAlwcmludGsoInNjc2klZCA6IE5DUiBkc2FfZmllbGRzIHN0YXJ0IGlzICVkIG5vdCAlZFxuIiwKKyAgICAJICAgIGhvc3QtPmhvc3Rfbm8sIEFfZHNhX2ZpZWxkc19zdGFydCwgRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIAorICAgIAkgICAgRW50X2RzYV96ZXJvKTsKKworICAgIHByaW50aygic2NzaSVkIDogTkNSIGNvZGUgcmVsb2NhdGVkIHRvIDB4JWx4ICh2aXJ0IDB4JXApXG4iLCBob3N0LT5ob3N0X25vLAorCXZpcnRfdG9fYnVzKGhvc3RkYXRhLT5zY3JpcHQpLCBob3N0ZGF0YS0+c2NyaXB0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBOQ1I1M2M3eHhfcnVuX3Rlc3RzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiBydW4gdmFyaW91cyB2ZXJpZmljYXRpb24gdGVzdHMgb24gdGhlIE5DUiBjaGlwLCAKKyAqCWluY2x1ZGluZyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiwgYW5kIHByb3BlciBidXMgbWFzdGVyaW5nCisgKiAJb3BlcmF0aW9uLgorICogCisgKiBJbnB1dHMgOiBob3N0IC0gYSBwcm9wZXJseSBpbml0aWFsaXplZCBTY3NpX0hvc3Qgc3RydWN0dXJlCisgKgorICogUHJlY29uZGl0aW9ucyA6IHRoZSBOQ1IgY2hpcCBtdXN0IGJlIGluIGEgaGFsdGVkIHN0YXRlLgorICoKKyAqIFJldHVybnMgOiAwIGlmIGFsbCB0ZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwsIC0xIG9uIGVycm9yLgorICogCisgKi8KKworc3RhdGljIGludCAKK05DUjUzYzd4eF9ydW5fdGVzdHMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisgICAgdTMyIHN0YXJ0OworICAgIGludCBmYWlsZWQsIGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICAvKiBUaGUgTkNSIGNoaXAgX211c3RfIGJlIGlkbGUgdG8gcnVuIHRoZSB0ZXN0IHNjcmlwdHMgKi8KKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBpZiAoIWhvc3RkYXRhLT5pZGxlKSB7CisJcHJpbnRrICgic2NzaSVkIDogY2hpcCBub3QgaWRsZSwgYWJvcnRpbmcgdGVzdHNcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogCisgICAgICogQ2hlY2sgZm9yIGZ1bmN0aW9uYWwgaW50ZXJydXB0cywgdGhpcyBjb3VsZCB3b3JrIGFzIGFuCisgICAgICogYXV0b3Byb2JlIHJvdXRpbmUuCisgICAgICovCisKKyAgICBpZiAoKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1RFU1QxKSAmJiAKKwkgICAgaG9zdGRhdGEtPnN0YXRlICE9IFNUQVRFX0RJU0FCTEVEKSB7CisJaG9zdGRhdGEtPmlkbGUgPSAwOworCWhvc3RkYXRhLT50ZXN0X3J1bm5pbmcgPSAxOworCWhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9IC0xOworCWhvc3RkYXRhLT50ZXN0X2Rlc3QgPSAwOworCWhvc3RkYXRhLT50ZXN0X3NvdXJjZSA9IDB4ZGVhZGJlZWY7CisJc3RhcnQgPSB2aXJ0X3RvX2J1cyAoaG9zdGRhdGEtPnNjcmlwdCkgKyBob3N0ZGF0YS0+RV90ZXN0XzE7CisgICAgCWhvc3RkYXRhLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJcHJpbnRrICgic2NzaSVkIDogdGVzdCAxIiwgaG9zdC0+aG9zdF9ubyk7CisJTkNSNTNjN3gwX3dyaXRlMzIgKERTUF9SRUcsIHN0YXJ0KTsKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVFJBQ0UpCisJICAgIE5DUjUzYzd4MF93cml0ZTggKERDTlRMX1JFRywgaG9zdGRhdGEtPnNhdmVkX2RjbnRsIHwgRENOVExfU1NNIHwKKwkJCQkJCURDTlRMX1NURCk7CisJcHJpbnRrICgiIHN0YXJ0ZWRcbiIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIAorCSAqIFRoaXMgaXMgY3VycmVudGx5IGEgLjUgc2Vjb25kIHRpbWVvdXQsIHNpbmNlIChpbiB0aGVvcnkpIG5vIHNsb3cgCisJICogYm9hcmQgd2lsbCB0YWtlIHRoYXQgbG9uZy4gIEluIHByYWN0aWNlLCB3ZSd2ZSBzZWVuIG9uZSAKKwkgKiBwZW50aXVtIHdoaWNoIG9jY2Fzc2lvbmFsbHkgZmFpbHMgd2l0aCB0aGlzLCBidXQgd29ya3Mgd2l0aCAKKwkgKiAxMCB0aW1lcyBhcyBtdWNoPworCSAqLworCisJdGltZW91dCA9IGppZmZpZXMgKyA1ICogSFogLyAxMDsKKwl3aGlsZSAoKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9PSAtMSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCWJhcnJpZXIoKTsKKworCWZhaWxlZCA9IDE7CisJaWYgKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9PSAtMSkKKwkgICAgcHJpbnRrICgic2NzaSVkIDogZHJpdmVyIHRlc3QgMSB0aW1lZCBvdXQlc1xuIixob3N0LT5ob3N0X25vICwKKwkJKGhvc3RkYXRhLT50ZXN0X2Rlc3QgPT0gMHhkZWFkYmVlZikgPyAKKwkJICAgICIgZHVlIHRvIGxvc3QgaW50ZXJydXB0LlxuIgorCQkgICAgIiAgICAgICAgIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGUgY29ycmVjdCBJUlEgaXMgYmVpbmcgdXNlZCBmb3IgeW91ciBib2FyZCxcbiIKKwkJICAgIDogIiIpOworCWVsc2UgaWYgKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCAhPSAxKSAKKwkgICAgcHJpbnRrICgic2NzaSVkIDogdGVzdCAxIGJhZCBpbnRlcnJ1cHQgdmFsdWUgKCVkKVxuIiwgCisJCWhvc3QtPmhvc3Rfbm8sIGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCk7CisJZWxzZSAKKwkgICAgZmFpbGVkID0gKGhvc3RkYXRhLT50ZXN0X2Rlc3QgIT0gMHhkZWFkYmVlZik7CisKKwlpZiAoaG9zdGRhdGEtPnRlc3RfZGVzdCAhPSAweGRlYWRiZWVmKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IGRyaXZlciB0ZXN0IDEgcmVhZCAweCV4IGluc3RlYWQgb2YgMHhkZWFkYmVlZiBpbmRpY2F0aW5nIGFcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIHByb2JhYmxlIGNhY2hlIGludmFsaWRhdGlvbiBwcm9ibGVtLiAgUGxlYXNlIGNvbmZpZ3VyZSBjYWNoaW5nXG4iCisJCSAgICAiICAgICAgICAgYXMgd3JpdGUtdGhyb3VnaCBvciBkaXNhYmxlZFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPnRlc3RfZGVzdCk7CisJfQorCisJaWYgKGZhaWxlZCkgeworCSAgICBwcmludGsgKCJzY3NpJWQgOiBEU1AgPSAweCVwIChzY3JpcHQgYXQgMHglcCwgc3RhcnQgYXQgMHgleClcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNQX1JFRykpLAorCQlob3N0ZGF0YS0+c2NyaXB0LCBzdGFydCk7CisJICAgIHByaW50ayAoInNjc2klZCA6IERTUFMgPSAweCV4XG4iLCBob3N0LT5ob3N0X25vLAorCQlOQ1I1M2M3eDBfcmVhZDMyKERTUFNfUkVHKSk7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICAJaG9zdGRhdGEtPnRlc3RfcnVubmluZyA9IDA7CisgICAgfQorCisgICAgaWYgKChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19URVNUMikgJiYgCisJaG9zdGRhdGEtPnN0YXRlICE9IFNUQVRFX0RJU0FCTEVEKSB7CisJdTMyIGRzYVs0OF07CisgICAgCXVuc2lnbmVkIGNoYXIgaWRlbnRpZnkgPSBJREVOVElGWSgwLCAwKTsKKwl1bnNpZ25lZCBjaGFyIGNtZFs2XTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMzZdOworICAgIAl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDB4ZmY7CisgICAgCXVuc2lnbmVkIGNoYXIgbXNnID0gMHhmZjsKKworICAgIAljbWRbMF0gPSBJTlFVSVJZOworICAgIAljbWRbMV0gPSBjbWRbMl0gPSBjbWRbM10gPSBjbWRbNV0gPSAwOworICAgIAljbWRbNF0gPSBzaXplb2YoZGF0YSk7IAorCisgICAgCWRzYVsyXSA9IDE7CisgICAgCWRzYVszXSA9IHZpcnRfdG9fYnVzKCZpZGVudGlmeSk7CisgICAgCWRzYVs0XSA9IDY7CisgICAgCWRzYVs1XSA9IHZpcnRfdG9fYnVzKCZjbWQpOworICAgIAlkc2FbNl0gPSBzaXplb2YoZGF0YSk7CisgICAgCWRzYVs3XSA9IHZpcnRfdG9fYnVzKCZkYXRhKTsKKyAgICAJZHNhWzhdID0gMTsKKyAgICAJZHNhWzldID0gdmlydF90b19idXMoJnN0YXR1cyk7CisgICAgCWRzYVsxMF0gPSAxOworICAgIAlkc2FbMTFdID0gdmlydF90b19idXMoJm1zZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7CisjaWZkZWYgVkFMSURfSURTCisJICAgIGlmICghaG9zdGRhdGEtPnZhbGlkX2lkc1tpXSkKKwkJY29udGludWU7CisjZW5kaWYKKwkgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkgICAgaWYgKCFob3N0ZGF0YS0+aWRsZSkgeworCQlwcmludGsgKCJzY3NpJWQgOiBjaGlwIG5vdCBpZGxlLCBhYm9ydGluZyB0ZXN0c1xuIiwgaG9zdC0+aG9zdF9ubyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisKKwkgICAgLyogNzEwOiBiaXQgbWFwcGVkIHNjc2kgSUQsIGFzeW5jICAgKi8KKyAgICAgICAgICAgIGRzYVswXSA9ICgxIDw8IGkpIDw8IDE2OworCSAgICBob3N0ZGF0YS0+aWRsZSA9IDA7CisJICAgIGhvc3RkYXRhLT50ZXN0X3J1bm5pbmcgPSAyOworCSAgICBob3N0ZGF0YS0+dGVzdF9jb21wbGV0ZWQgPSAtMTsKKwkgICAgc3RhcnQgPSB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX3Rlc3RfMjsKKwkgICAgaG9zdGRhdGEtPnN0YXRlID0gU1RBVEVfUlVOTklORzsKKwkgICAgTkNSNTNjN3gwX3dyaXRlMzIgKERTQV9SRUcsIHZpcnRfdG9fYnVzKGRzYSkpOworCSAgICBOQ1I1M2M3eDBfd3JpdGUzMiAoRFNQX1JFRywgc3RhcnQpOworCSAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVFJBQ0UpCisJICAgICAgICBOQ1I1M2M3eDBfd3JpdGU4IChEQ05UTF9SRUcsIGhvc3RkYXRhLT5zYXZlZF9kY250bCB8CisJCQkJRENOVExfU1NNIHwgRENOVExfU1REKTsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJICAgIHRpbWVvdXQgPSBqaWZmaWVzICsgNSAqIEhaOwkvKiBhcmJpdHJhcnkgKi8KKwkgICAgd2hpbGUgKChob3N0ZGF0YS0+dGVzdF9jb21wbGV0ZWQgPT0gLTEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCSAgICAJYmFycmllcigpOworCisJICAgIE5DUjUzYzd4MF93cml0ZTMyIChEU0FfUkVHLCAwKTsKKworCSAgICBpZiAoaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkID09IDIpIHsKKwkJZGF0YVszNV0gPSAwOworCQlwcmludGsgKCJzY3NpJWQgOiB0ZXN0IDIgSU5RVUlSWSB0byB0YXJnZXQgJWQsIGx1biAwIDogJXNcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBpLCBkYXRhICsgOCk7CisJCXByaW50ayAoInNjc2klZCA6IHN0YXR1cyAiLCBob3N0LT5ob3N0X25vKTsKKwkJcHJpbnRfc3RhdHVzIChzdGF0dXMpOworCQlwcmludGsgKCJcbnNjc2klZCA6IG1lc3NhZ2UgIiwgaG9zdC0+aG9zdF9ubyk7CisJCXByaW50X21zZyAoJm1zZyk7CisJCXByaW50ayAoIlxuIik7CisJICAgIH0gZWxzZSBpZiAoaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkID09IDMpIHsKKwkJcHJpbnRrKCJzY3NpJWQgOiB0ZXN0IDIgbm8gY29ubmVjdGlvbiB3aXRoIHRhcmdldCAlZFxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGkpOworCQlpZiAoIWhvc3RkYXRhLT5pZGxlKSB7CisJCSAgICBwcmludGsoInNjc2klZCA6IG5vdCBpZGxlXG4iLCBob3N0LT5ob3N0X25vKTsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9PSAtMSkgeworCQlwcmludGsgKCJzY3NpJWQgOiB0ZXN0IDIgdGltZWQgb3V0XG4iLCBob3N0LT5ob3N0X25vKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJICAgIH0gCisJICAgIGhvc3RkYXRhLT50ZXN0X3J1bm5pbmcgPSAwOworCX0KKyAgICB9CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIE5DUjUzYzd4eF9kc2FfZml4dXAgKHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6IGNvcHkgdGhlIE5DUjUzYzh4eCBkc2Egc3RydWN0dXJlIGludG8gY21kJ3MgZHNhIGJ1ZmZlciwKKyAqIAlwZXJmb3JtaW5nIGFsbCBuZWNlc3NhcnkgcmVsb2NhdGlvbi4KKyAqCisgKiBJbnB1dHMgOiBjbWQsIGEgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgd2l0aCBhIGRzYSBhcmVhIGxhcmdlCisgKgllbm91Z2ggdG8gaG9sZCB0aGUgTkNSNTNjOHh4IGRzYS4KKyAqLworCitzdGF0aWMgdm9pZCAKK05DUjUzYzd4eF9kc2FfZml4dXAgKHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBTY3NpX0NtbmQgKmMgPSBjbWQtPmNtZDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gYy0+ZGV2aWNlLT5ob3N0OworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKyAgICAJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgaW50IGk7CisKKyAgICBtZW1jcHkgKGNtZC0+ZHNhLCBob3N0ZGF0YS0+c2NyaXB0ICsgKGhvc3RkYXRhLT5FX2RzYV9jb2RlX3RlbXBsYXRlIC8gNCksCisgICAgCWhvc3RkYXRhLT5FX2RzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIGhvc3RkYXRhLT5FX2RzYV9jb2RlX3RlbXBsYXRlKTsKKworICAgIC8qIAorICAgICAqIE5vdGUgOiB3aXRoaW4gdGhlIE5DUiAnQycgY29kZSwgZHNhIHBvaW50cyB0byB0aGUgX3N0YXJ0XworICAgICAqIG9mIHRoZSBEU0Egc3RydWN0dXJlLCBhbmQgX25vdF8gdGhlIG9mZnNldCBvZiBkc2FfemVybyB3aXRoaW4KKyAgICAgKiB0aGF0IHN0cnVjdHVyZSB1c2VkIHRvIGZhY2lsaXRhdGUgc2hvcnRlciBzaWduZWQgb2Zmc2V0cworICAgICAqIGZvciB0aGUgOCBiaXQgQUxVLgorICAgICAqIAorICAgICAqIFRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBhcmUgdGhhdCAKKyAgICAgKiAKKyAgICAgKiAtIDMyIGJpdCBBX2RzYV8qIGFic29sdXRlIHZhbHVlcyByZXF1aXJlIGFuIGFkZGl0aW9uYWwgCisgICAgICogCSBkc2FfemVybyBhZGRlZCB0byB0aGVpciB2YWx1ZSB0byBiZSBjb3JyZWN0LCBzaW5jZSB0aGV5IGFyZSAKKyAgICAgKiAgIHJlbGF0aXZlIHRvIGRzYV96ZXJvIHdoaWNoIGlzIGluIGVzc2VudGlhbGx5IGEgc2VwYXJhdGUKKyAgICAgKiAgIHNwYWNlIGZyb20gdGhlIGNvZGUgc3ltYm9scy4KKyAgICAgKgorICAgICAqIC0gQWxsIG90aGVyIHN5bWJvbHMgcmVxdWlyZSBubyBzcGVjaWFsIHRyZWF0bWVudC4KKyAgICAgKi8KKworICAgIHBhdGNoX2Fic190Y2lfZGF0YSAoY21kLT5kc2EsIEVudF9kc2FfY29kZV90ZW1wbGF0ZSAvIHNpemVvZih1MzIpLAorICAgIAlkc2FfdGVtcF9sdW4sIGMtPmRldmljZS0+bHVuKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKwlkc2FfdGVtcF9hZGRyX25leHQsIHZpcnRfdG9fYnVzKCZjbWQtPmRzYV9uZXh0X2FkZHIpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfbmV4dCwgdmlydF90b19idXMoY21kLT5kc2EpICsgRW50X2RzYV96ZXJvIC0KKwlFbnRfZHNhX2NvZGVfdGVtcGxhdGUgKyBBX2RzYV9uZXh0KTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwgCisgICAgCWRzYV90ZW1wX3N5bmMsIHZpcnRfdG9fYnVzKCh2b2lkICopaG9zdGRhdGEtPnN5bmNbYy0+ZGV2aWNlLT5pZF0uc2NyaXB0KSk7CisgICAgcGF0Y2hfYWJzXzMyIChjbWQtPmRzYSwgRW50X2RzYV9jb2RlX3RlbXBsYXRlIC8gc2l6ZW9mKHUzMiksIAorICAgIAlkc2Ffc3NjZl83MTAsIHZpcnRfdG9fYnVzKCh2b2lkICopJmhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNzY2ZfNzEwKSk7CisgICAgcGF0Y2hfYWJzX3RjaV9kYXRhIChjbWQtPmRzYSwgRW50X2RzYV9jb2RlX3RlbXBsYXRlIC8gc2l6ZW9mKHUzMiksCisgICAgCSAgICBkc2FfdGVtcF90YXJnZXQsIDEgPDwgYy0+ZGV2aWNlLT5pZCk7CisgICAgLyogWFhYIC0gbmV3IHBvaW50ZXIgc3R1ZmYgKi8KKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfYWRkcl9zYXZlZF9wb2ludGVyLCB2aXJ0X3RvX2J1cygmY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbCwgdmlydF90b19idXMoJmNtZC0+c2F2ZWRfcmVzaWR1YWwpKTsKKyAgICBwYXRjaF9hYnNfMzIgKGNtZC0+ZHNhLCBFbnRfZHNhX2NvZGVfdGVtcGxhdGUgLyBzaXplb2YodTMyKSwKKyAgICAJZHNhX3RlbXBfYWRkcl9yZXNpZHVhbCwgdmlydF90b19idXMoJmNtZC0+cmVzaWR1YWwpKTsKKworICAgIC8qICBYWFggLSBuZXcgc3RhcnQgc3R1ZmYgKi8KKworICAgIHBhdGNoX2Fic18zMiAoY21kLT5kc2EsIEVudF9kc2FfY29kZV90ZW1wbGF0ZSAvIHNpemVvZih1MzIpLAorCWRzYV90ZW1wX2FkZHJfZHNhX3ZhbHVlLCB2aXJ0X3RvX2J1cygmY21kLT5kc2FfYWRkcikpOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogcnVuX3Byb2Nlc3NfaXNzdWVfcXVldWUgKHZvaWQpCisgKiAKKyAqIFB1cnBvc2UgOiBpbnN1cmUgdGhhdCB0aGUgY29yb3V0aW5lIGlzIHJ1bm5pbmcgYW5kIHdpbGwgcHJvY2VzcyBvdXIgCisgKiAJcmVxdWVzdC4gIHByb2Nlc3NfaXNzdWVfcXVldWVfcnVubmluZyBpcyBjaGVja2VkL3NldCBoZXJlIChpbiBhbiAKKyAqCWlubGluZSBmdW5jdGlvbikgcmF0aGVyIHRoYW4gaW4gcHJvY2Vzc19pc3N1ZV9xdWV1ZSBpdHNlbGYgdG8gcmVkdWNlIAorICogCXRoZSBjaGFuY2VzIG9mIHN0YWNrIG92ZXJmbG93LgorICoKKyAqLworCitzdGF0aWMgdm9sYXRpbGUgaW50IHByb2Nlc3NfaXNzdWVfcXVldWVfcnVubmluZyA9IDA7CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgCitydW5fcHJvY2Vzc19pc3N1ZV9xdWV1ZSh2b2lkKSB7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgaWYgKCFwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcpIHsKKwlwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcgPSAxOworICAgICAgICBwcm9jZXNzX2lzc3VlX3F1ZXVlKGZsYWdzKTsKKwkvKiAKKyAgICAgICAgICogcHJvY2Vzc19pc3N1ZV9xdWV1ZV9ydW5uaW5nIGlzIGNsZWFyZWQgaW4gcHJvY2Vzc19pc3N1ZV9xdWV1ZSAKKwkgKiBvbmNlIGl0IGNhbid0IGRvIG1vcmUgd29yaywgYW5kIHByb2Nlc3NfaXNzdWVfcXVldWUgZXhpdHMgd2l0aCAKKwkgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLgorCSAqLworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIGFibm9ybWFsX2ZpbmlzaGVkIChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kLCBpbnQKKyAqCXJlc3VsdCkKKyAqCisgKiBQdXJwb3NlIDogbWFyayBTQ1NJIGNvbW1hbmQgYXMgZmluaXNoZWQsIE9SJ2luZyB0aGUgaG9zdCBwb3J0aW9uIAorICoJb2YgdGhlIHJlc3VsdCB3b3JkIGludG8gdGhlIHJlc3VsdCBmaWVsZCBvZiB0aGUgY29ycmVzcG9uZGluZworICoJU2NzaV9DbW5kIHN0cnVjdHVyZSwgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIGludGVybmFsIHF1ZXVlcy4KKyAqCisgKiBJbnB1dHMgOiBjbWQgLSBjb21tYW5kLCByZXN1bHQgLSBlbnRpcmUgcmVzdWx0IGZpZWxkCisgKgorICogUHJlY29uZGl0aW9ucyA6IHRoZSAJTkNSIGNoaXAgc2hvdWxkIGJlIGluIGEgaGFsdGVkIHN0YXRlIHdoZW4gCisgKglhYm5vcm1hbF9maW5pc2hlZCBpcyBydW4sIHNpbmNlIGl0IG1vZGlmaWVzIHN0cnVjdHVyZXMgd2hpY2gKKyAqCXRoZSBOQ1IgZXhwZWN0cyB0byBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8uCisgKi8KKworc3RhdGljIHZvaWQgCithYm5vcm1hbF9maW5pc2hlZCAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCwgaW50IHJlc3VsdCkgeworICAgIFNjc2lfQ21uZCAqYyA9IGNtZC0+Y21kOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorICAgIAlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBsZWZ0LCBmb3VuZDsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqIGxpbnV4X3NlYXJjaDsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqIHZvbGF0aWxlICpsaW51eF9wcmV2OworICAgIHZvbGF0aWxlIHUzMiAqbmNyX3ByZXYsICpuY3JjdXJyZW50LCBuY3Jfc2VhcmNoOworCisjaWYgMAorICAgIHByaW50ayAoInNjc2klZDogYWJub3JtYWwgZmluaXNoZWRcbiIsIGhvc3QtPmhvc3Rfbm8pOworI2VuZGlmCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgZm91bmQgPSAwOworICAgIC8qIAorICAgICAqIFRyYXZlcnNlIHRoZSBOQ1IgaXNzdWUgYXJyYXkgdW50aWwgd2UgZmluZCBhIG1hdGNoIG9yIHJ1biBvdXQgCisgICAgICogb2YgaW5zdHJ1Y3Rpb25zLiAgSW5zdHJ1Y3Rpb25zIGluIHRoZSBOQ1IgaXNzdWUgYXJyYXkgYXJlIAorICAgICAqIGVpdGhlciBKVU1QIG9yIE5PUCBpbnN0cnVjdGlvbnMsIHdoaWNoIGFyZSAyIHdvcmRzIGluIGxlbmd0aC4KKyAgICAgKi8KKworCisgICAgZm9yIChmb3VuZCA9IDAsIGxlZnQgPSBob3N0LT5jYW5fcXVldWUsIG5jcmN1cnJlbnQgPSBob3N0ZGF0YS0+c2NoZWR1bGU7IAorCWxlZnQgPiAwOyAtLWxlZnQsIG5jcmN1cnJlbnQgKz0gMikKKyAgICB7CisJaWYgKGlzc3VlX3RvX2NtZCAoaG9zdCwgaG9zdGRhdGEsICh1MzIgKikgbmNyY3VycmVudCkgPT0gY21kKSAKKwl7CisJICAgIG5jcmN1cnJlbnRbMF0gPSBob3N0ZGF0YS0+Tk9QX2luc247CisJICAgIG5jcmN1cnJlbnRbMV0gPSAweGRlYWRiZWVmOworCSAgICArK2ZvdW5kOworCSAgICBicmVhazsKKwl9CisgICAgfQorCQorICAgIC8qIAorICAgICAqIFRyYXZlcnNlIHRoZSBOQ1IgcmVjb25uZWN0IGxpc3Qgb2YgRFNBIHN0cnVjdHVyZXMgdW50aWwgd2UgZmluZCAKKyAgICAgKiBhIHBvaW50ZXIgdG8gdGhpcyBkc2Egb3IgaGF2ZSBmb3VuZCB0b28gbWFueSBjb21tYW5kIHN0cnVjdHVyZXMuICAKKyAgICAgKiBXZSBsZXQgcHJldiBwb2ludCBhdCB0aGUgbmV4dCBmaWVsZCBvZiB0aGUgcHJldmlvdXMgZWxlbWVudCBvciAKKyAgICAgKiBoZWFkIG9mIHRoZSBsaXN0LCBzbyB3ZSBkb24ndCBkbyBhbnl0aGluZyBkaWZmZXJlbnQgZm9yIHJlbW92aW5nIAorICAgICAqIHRoZSBoZWFkIGVsZW1lbnQuICAKKyAgICAgKi8KKworICAgIGZvciAobGVmdCA9IGhvc3QtPmNhbl9xdWV1ZSwKKwkgICAgbmNyX3NlYXJjaCA9IGhvc3RkYXRhLT5yZWNvbm5lY3RfZHNhX2hlYWQsIAorCSAgICBuY3JfcHJldiA9ICZob3N0ZGF0YS0+cmVjb25uZWN0X2RzYV9oZWFkOworCWxlZnQgPj0gMCAmJiBuY3Jfc2VhcmNoICYmIAorCSAgICAoKGNoYXIqKWJ1c190b192aXJ0KG5jcl9zZWFyY2gpICsgaG9zdGRhdGEtPmRzYV9zdGFydCkgCisJCSE9IChjaGFyICopIGNtZC0+ZHNhOworCW5jcl9wcmV2ID0gKHUzMiopICgoY2hhciopYnVzX3RvX3ZpcnQobmNyX3NlYXJjaCkgKyAKKwkgICAgaG9zdGRhdGEtPmRzYV9uZXh0KSwgbmNyX3NlYXJjaCA9ICpuY3JfcHJldiwgLS1sZWZ0KTsKKworICAgIGlmIChsZWZ0IDwgMCkgCisJcHJpbnRrKCJzY3NpJWQ6IGxvb3AgZGV0ZWN0ZWQgaW4gbmNyIHJlY29ubmNlY3QgbGlzdFxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubyk7CisgICAgZWxzZSBpZiAobmNyX3NlYXJjaCkgeworCWlmIChmb3VuZCkKKwkgICAgcHJpbnRrKCJzY3NpJWQ6IHNjc2kgJWxkIGluIG5jciBpc3N1ZSBhcnJheSBhbmQgcmVjb25uZWN0IGxpc3RzXG4iLAorCQlob3N0LT5ob3N0X25vLCBjLT5waWQpOworCWVsc2UgeworCSAgICB2b2xhdGlsZSB1MzIgKiBuZXh0ID0gKHUzMiAqKSAKKwkgICAgCSgoY2hhciAqKWJ1c190b192aXJ0KG5jcl9zZWFyY2gpICsgaG9zdGRhdGEtPmRzYV9uZXh0KTsKKwkgICAgKm5jcl9wcmV2ID0gKm5leHQ7CisvKiBJZiB3ZSdyZSBhdCB0aGUgdGFpbCBlbmQgb2YgdGhlIGlzc3VlIHF1ZXVlLCB1cGRhdGUgdGhhdCBwb2ludGVyIHRvby4gKi8KKwkgICAgZm91bmQgPSAxOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyYXZlcnNlIHRoZSBob3N0IHJ1bm5pbmcgbGlzdCB1bnRpbCB3ZSBmaW5kIHRoaXMgY29tbWFuZCBvciBkaXNjb3ZlcgorICAgICAqIHdlIGhhdmUgdG9vIG1hbnkgZWxlbWVudHMsIHBvaW50aW5nIGxpbnV4X3ByZXYgYXQgdGhlIG5leHQgZmllbGQgb2YgdGhlIAorICAgICAqIGxpbnV4X3ByZXZpb3VzIGVsZW1lbnQgb3IgaGVhZCBvZiB0aGUgbGlzdCwgc2VhcmNoIGF0IHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKworICAgIGZvciAobGVmdCA9IGhvc3QtPmNhbl9xdWV1ZSwgbGludXhfc2VhcmNoID0gaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdCwgCisJICAgIGxpbnV4X3ByZXYgPSAmaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdDsKKwlsZWZ0ID49IDAgJiYgbGludXhfc2VhcmNoICYmIGxpbnV4X3NlYXJjaCAhPSBjbWQ7CisJbGludXhfcHJldiA9ICYobGludXhfc2VhcmNoLT5uZXh0KSwgCisJICAgIGxpbnV4X3NlYXJjaCA9IGxpbnV4X3NlYXJjaC0+bmV4dCwgLS1sZWZ0KTsKKyAgICAKKyAgICBpZiAobGVmdCA8IDApIAorCXByaW50ayAoInNjc2klZDogbG9vcCBkZXRlY3RlZCBpbiBob3N0IHJ1bm5pbmcgbGlzdCBmb3Igc2NzaSBwaWQgJWxkXG4iLAorCSAgICBob3N0LT5ob3N0X25vLCBjLT5waWQpOworICAgIGVsc2UgaWYgKGxpbnV4X3NlYXJjaCkgeworCSpsaW51eF9wcmV2ID0gbGludXhfc2VhcmNoLT5uZXh0OworCS0taG9zdGRhdGEtPmJ1c3lbYy0+ZGV2aWNlLT5pZF1bYy0+ZGV2aWNlLT5sdW5dOworICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgTkNSIGNvbW1hbmQgc3RydWN0dXJlIHRvIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBjbWQtPm5leHQgPSBob3N0ZGF0YS0+ZnJlZTsKKyAgICBob3N0ZGF0YS0+ZnJlZSA9IGNtZDsKKyAgICBjLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAgIC8qIEFuZCByZXR1cm4gKi8KKyAgICBjLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgYy0+c2NzaV9kb25lKGMpOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHJ1bl9wcm9jZXNzX2lzc3VlX3F1ZXVlKCk7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBpbnRyX2JyZWFrIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6ICBIYW5kbGVyIGZvciBicmVha3BvaW50IGludGVycnVwdHMgZnJvbSBhIFNDU0kgc2NyaXB0CisgKgorICogSW5wdXRzIDogaG9zdCAtIHBvaW50ZXIgdG8gdGhpcyBob3N0IGFkYXB0ZXIncyBzdHJ1Y3R1cmUsCisgKiAJY21kIC0gcG9pbnRlciB0byB0aGUgY29tbWFuZCAoaWYgYW55KSBkc2Egd2FzIHBvaW50aW5nIAorICogCXRvLgorICoKKyAqLworCitzdGF0aWMgdm9pZCAKK2ludHJfYnJlYWsgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCAKKyAgICBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfYnJlYWsgKmJwOworI2lmIDAKKyAgICBTY3NpX0NtbmQgKmMgPSBjbWQgPyBjbWQtPmNtZCA6IE5VTEw7CisjZW5kaWYKKyAgICB1MzIgKmRzcDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CQkKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworICAgIC8qCisgICAgICogRmluZCB0aGUgYnJlYWsgcG9pbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGFkZHJlc3MsIGFuZCAKKyAgICAgKiBkdW1wIHRoZSBhcHByb3ByaWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gc3RhbmRhcmQgCisgICAgICogb3V0cHV0LiAgCisgICAgICovCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGRzcCA9ICh1MzIgKikgYnVzX3RvX3ZpcnQoTkNSNTNjN3gwX3JlYWQzMihEU1BfUkVHKSk7CisgICAgZm9yIChicCA9IGhvc3RkYXRhLT5icmVha3BvaW50czsgYnAgJiYgYnAtPmFkZHJlc3MgIT0gZHNwOyAKKyAgICAJYnAgPSBicC0+bmV4dCk7CisgICAgaWYgKCFicCkgCisgICAgCXBhbmljKCJzY3NpJWQgOiBicmVhayBwb2ludCBpbnRlcnJ1cHQgZnJvbSAlcCB3aXRoIG5vIGJyZWFrcG9pbnQhIiwKKyAgICAJICAgIGhvc3QtPmhvc3Rfbm8sIGRzcCk7CisKKyAgICAvKgorICAgICAqIENvbmZpZ3VyZSB0aGUgTkNSIGNoaXAgZm9yIG1hbnVhbCBzdGFydCBtb2RlLCBzbyB0aGF0IHdlIGNhbiAKKyAgICAgKiBwb2ludCB0aGUgRFNQIHJlZ2lzdGVyIGF0IHRoZSBpbnN0cnVjdGlvbiB0aGF0IGZvbGxvd3MgdGhlIAorICAgICAqIElOVCBpbnRfZGVidWdfYnJlYWsgaW5zdHJ1Y3Rpb24uCisgICAgICovCisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4IChob3N0ZGF0YS0+ZG1vZGUsIAorCU5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+ZG1vZGUpfERNT0RFX01BTik7CisKKyAgICAvKgorICAgICAqIEFuZCB1cGRhdGUgdGhlIERTUCByZWdpc3RlciwgdXNpbmcgdGhlIHNpemUgb2YgdGhlIG9sZCAKKyAgICAgKiBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAgICAgKi8KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIHByaW50X3N5bmNocm9ub3VzIChjb25zdCBjaGFyICpwcmVmaXgsIAorICoJY29uc3QgdW5zaWduZWQgY2hhciAqbXNnKQorICogCisgKiBQdXJwb3NlIDogcHJpbnQgYSBwcmV0dHksIHVzZXIgYW5kIG1hY2hpbmUgcGFyc2FibGUgcmVwcmVzZW50YXRpb24KKyAqCW9mIGEgU0RUUiBtZXNzYWdlLCBpbmNsdWRpbmcgdGhlICJyZWFsIiBwYXJhbWV0ZXJzLCBkYXRhCisgKgljbG9jayBzbyB3ZSBjYW4gdGVsbCB0cmFuc2ZlciByYXRlIGF0IGEgZ2xhbmNlLgorICoKKyAqIElucHV0cyA7IHByZWZpeCAtIHRleHQgdG8gcHJlcGVuZCwgbXNnIC0gU0RUUiBtZXNzYWdlICg1IGJ5dGVzKQorICovCisKK3N0YXRpYyB2b2lkCitwcmludF9zeW5jaHJvbm91cyAoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCB1bnNpZ25lZCBjaGFyICptc2cpIHsKKyAgICBpZiAobXNnWzRdKSB7CisJaW50IEh6ID0gMTAwMDAwMDAwMCAvIChtc2dbM10gKiA0KTsKKwlpbnQgaW50ZWdlciA9IEh6IC8gMTAwMDAwMDsKKwlpbnQgZnJhY3Rpb24gPSAoSHogLSAoaW50ZWdlciAqIDEwMDAwMDApKSAvIDEwMDAwOworCXByaW50ayAoIiVzcGVyaW9kICVkbnMgb2Zmc2V0ICVkICVkLiUwMmRNSHogJXMgU0NTSSVzXG4iLAorCSAgICBwcmVmaXgsIChpbnQpIG1zZ1szXSAqIDQsIChpbnQpIG1zZ1s0XSwgaW50ZWdlciwgZnJhY3Rpb24sCisJICAgICgoKG1zZ1szXSAqIDQpIDwgMjAwKSA/ICJGQVNUIiA6ICJzeW5jaHJvbm91cyIpLAorCSAgICAoKChtc2dbM10gKiA0KSA8IDIwMCkgPyAiLUlJIiA6ICIiKSk7CisgICAgfSBlbHNlIAorCXByaW50ayAoIiVzYXN5bmNocm9ub3VzIFNDU0lcbiIsIHByZWZpeCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIHNldF9zeW5jaHJvbm91cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgKgkgCWludCB0YXJnZXQsIGludCBzeGZlciwgaW50IHNjbnRsMywgaW50IG5vd19jb25uZWN0ZWQpCisgKgorICogUHVycG9zZSA6IHJlcHJvZ3JhbSB0cmFuc2ZlcnMgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgU0NTSSBpbml0aWF0b3IgYW5kIAorICoJdGFyZ2V0IHdpdGggdGhlIGdpdmVuIHJlZ2lzdGVyIHZhbHVlczsgaW4gdGhlIGluZGlyZWN0CisgKglzZWxlY3Qgb3BlcmFuZCwgcmVzZWxlY3Rpb24gc2NyaXB0LCBhbmQgY2hpcCByZWdpc3RlcnMuCisgKgorICogSW5wdXRzIDogaG9zdCAtIE5DUjUzYzcsOHh4IFNDU0kgaG9zdCwgdGFyZ2V0IC0gbnVtYmVyIFNDU0kgdGFyZ2V0IGlkLAorICoJc3hmZXIgYW5kIHNjbnRsMyAtIE5DUiByZWdpc3RlcnMuIG5vd19jb25uZWN0ZWQgLSBpZiBub24temVybywgCisgKgl3ZSBzaG91bGQgcmVwcm9ncmFtIHRoZSByZWdpc3RlcnMgbm93IHRvby4KKyAqCisgKiAgICAgIE5PVEU6ICBGb3IgNTNjNzEwLCBzY250bDMgaXMgYWN0dWFsbHkgdXNlZCBmb3IgU0NGIGJpdHMgZnJvbQorICoJU0JDTCwgYXMgd2UgZG9uJ3QgaGF2ZSBhIFNDTlRMMy4KKyAqLworCitzdGF0aWMgdm9pZAorc2V0X3N5bmNocm9ub3VzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgdGFyZ2V0LCBpbnQgc3hmZXIsIGludCBzY250bDMsCisgICAgaW50IG5vd19jb25uZWN0ZWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdTMyICpzY3JpcHQ7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgLyogVGhlc2UgYXJlIGVpZ2h0IGJpdCByZWdpc3RlcnMgKi8KKyAgICBzeGZlciAmPSAweGZmOworICAgIHNjbnRsMyAmPSAweGZmOworCisgICAgaG9zdGRhdGEtPnN5bmNbdGFyZ2V0XS5zeGZlcl9zYW5pdHkgPSBzeGZlcjsKKyAgICBob3N0ZGF0YS0+c3luY1t0YXJnZXRdLnNjbnRsM19zYW5pdHkgPSBzY250bDM7CisKKy8qIAorICogSEFSRCBDT0RFRCA6IHN5bmNocm9ub3VzIHNjcmlwdCBpcyBFSUdIVCB3b3JkcyBsb25nLiAgVGhpcyAKKyAqIG11c3QgYWdyZWUgd2l0aCA1M2M3Ljh4eC5oCisgKi8KKworICAgIGlmICgoaG9zdGRhdGEtPmNoaXAgIT0gNzAwKSAmJiAoaG9zdGRhdGEtPmNoaXAgIT0gNzAwNjYpKSB7CisJaG9zdGRhdGEtPnN5bmNbdGFyZ2V0XS5zZWxlY3RfaW5kaXJlY3QgPSAoMSA8PCB0YXJnZXQpIDw8IDE2IHwKKwkJKHN4ZmVyIDw8IDgpOworCWhvc3RkYXRhLT5zeW5jW3RhcmdldF0uc3NjZl83MTAgPSBzY250bDM7CisKKwlzY3JpcHQgPSAodTMyICopIGhvc3RkYXRhLT5zeW5jW3RhcmdldF0uc2NyaXB0OworCisJLyogWFhYIC0gYWRkIE5DUjUzYzd4MCBjb2RlIHRvIHJlcHJvZ3JhbSBTQ0YgYml0cyBpZiB3ZSB3YW50IHRvICovCisJc2NyaXB0WzBdID0gKChEQ01EX1RZUEVfUldSSSB8IERDTURfUldSSV9PUENfTU9ESUZZIHwKKwkJRENNRF9SV1JJX09QX01PVkUpIDw8IDI0KSB8CisJCShTQkNMX1JFRyA8PCAxNikgfCAoc2NudGwzIDw8IDgpOworCXNjcmlwdFsxXSA9IDA7CisJc2NyaXB0ICs9IDI7CisKKwlzY3JpcHRbMF0gPSAoKERDTURfVFlQRV9SV1JJIHwgRENNRF9SV1JJX09QQ19NT0RJRlkgfAorCSAgICBEQ01EX1JXUklfT1BfTU9WRSkgPDwgMjQpIHwKKwkJKFNYRkVSX1JFRyA8PCAxNikgfCAoc3hmZXIgPDwgOCk7CisJc2NyaXB0WzFdID0gMDsKKwlzY3JpcHQgKz0gMjsKKworI2lmZGVmIERFQlVHX1NZTkNfSU5UUgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19ESVNDT05ORUNUKSB7CisJICAgIHNjcmlwdFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9JTlQpIDw8IDI0KSB8IERCQ19UQ0lfVFJVRTsKKwkgICAgc2NyaXB0WzFdID0gREVCVUdfU1lOQ19JTlRSOworCSAgICBzY3JpcHQgKz0gMjsKKwl9CisjZW5kaWYKKworCXNjcmlwdFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9SRVRVUk4pIDw8IDI0KSB8IERCQ19UQ0lfVFJVRTsKKwlzY3JpcHRbMV0gPSAwOworCXNjcmlwdCArPSAyOworICAgIH0KKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TWU5DSFJPTk9VUykgCisJcHJpbnRrICgic2NzaSVkIDogdGFyZ2V0ICVkIHN5bmMgcGFyYW1ldGVycyBhcmUgc3hmZXI9MHgleCwgc2NudGwzPTB4JXhcbiIsCisJaG9zdC0+aG9zdF9ubywgdGFyZ2V0LCBzeGZlciwgc2NudGwzKTsKKworICAgIGlmIChub3dfY29ubmVjdGVkKSB7CisJTkNSNTNjN3gwX3dyaXRlOChTQkNMX1JFRywgc2NudGwzKTsKKwlOQ1I1M2M3eDBfd3JpdGU4KFNYRkVSX1JFRywgc3hmZXIpOworICAgIH0KK30KKworCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGFzeW5jaHJvbm91cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IHRhcmdldCkKKyAqCisgKiBQdXJwb3NlIDogcmVwcm9ncmFtIGJldHdlZW4gdGhlIHNlbGVjdGVkIFNDU0kgSG9zdCBhZGFwdGVyIGFuZCB0YXJnZXQgCisgKiAgICAgIChhc3N1bWVkIHRvIGJlIGN1cnJlbnRseSBjb25uZWN0ZWQpIGZvciBhc3luY2hyb25vdXMgdHJhbnNmZXJzLgorICoKKyAqIElucHV0cyA6IGhvc3QgLSBTQ1NJIGhvc3Qgc3RydWN0dXJlLCB0YXJnZXQgLSBudW1lcmljIHRhcmdldCBJRC4KKyAqCisgKiBQcmVjb25kaXRpb25zIDogdGhlIE5DUiBjaGlwIHNob3VsZCBiZSBpbiBvbmUgb2YgdGhlIGhhbHRlZCBzdGF0ZXMKKyAqLworICAgIAorc3RhdGljIHZvaWQKK2FzeW5jaHJvbm91cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IHRhcmdldCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKyAgICBzZXRfc3luY2hyb25vdXMgKGhvc3QsIHRhcmdldCwgLyogbm8gb2Zmc2V0ICovIDAsIGhvc3RkYXRhLT5zYXZlZF9zY250bDMsCisJMSk7CisgICAgcHJpbnRrICgic2NzaSVkIDogc2V0dGluZyB0YXJnZXQgJWQgdG8gYXN5bmNocm9ub3VzIFNDU0lcbiIsCisJaG9zdC0+aG9zdF9ubywgdGFyZ2V0KTsKK30KKworLyogCisgKiBYWFggLSBkbyB3ZSB3YW50IHRvIGdvIG91dCBvZiBvdXIgd2F5IChpZSwgYWRkIGV4dHJhIGNvZGUgdG8gc2VsZWN0aW9uCisgKiAJaW4gdGhlIE5DUjUzYzcxMC9OQ1I1M2M3MjAgc2NyaXB0KSB0byByZXByb2dyYW0gdGhlIHN5bmNocm9ub3VzCisgKiAJY29udmVyc2lvbiBiaXRzLCBvciBjYW4gd2UgYmUgY29udGVudCBpbiBqdXN0IHNldHRpbmcgdGhlIAorICogCXN4ZmVyIGJpdHM/ICBJIGNob3NlIHRvIGRvIHNvIFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCisgKi8KKworLyogVGFibGUgZm9yIE5DUjUzYzh4eCBzeW5jaHJvbm91cyB2YWx1ZXMgKi8KKworLyogVGhpcyB0YWJsZSBpcyBhbHNvIGNvcnJlY3QgZm9yIDcxMCwgYWxsb3dpbmcgdGhhdCBzY2Y9NCBpcyBlcXVpdmFsZW50CisgKiBvZiBTU0NGPTAgKGllIHVzZSBEQ05UTCwgZGl2aWRlIGJ5IDMpIGZvciBhIDUwLjAxLTY2LjAwTUh6IGNsb2NrLgorICogRm9yIGFueSBvdGhlciBjbG9jayB2YWx1ZXMsIHdlIGNhbm5vdCB1c2UgZW50cmllcyB3aXRoIFNDRiB2YWx1ZXMgb2YKKyAqIDQuICBJIGd1ZXNzIHRoYXQgZm9yIGEgNjZNSHogY2xvY2ssIHRoZSBzbG93ZXN0IGl0IHdpbGwgc2V0IGlzIDJNSHosCisgKiBhbmQgZm9yIGEgNTBNSHogY2xvY2ssIHRoZSBzbG93ZXN0IHdpbGwgYmUgMi4yN01oei4gIFNob3VsZCBjaGVjaworICogdGhhdCBhIGRldmljZSBkb2Vzbid0IHRyeSBhbmQgbmVnb3RpYXRlIHN5bmMgYmVsb3cgdGhlc2UgbGltaXRzIQorICovCisgCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgZGl2OwkJLyogVG90YWwgY2xvY2sgZGl2aXNvciAqIDEwICovCisgICAgdW5zaWduZWQgY2hhciBzY2Y7CS8qICovCisgICAgdW5zaWduZWQgY2hhciB0cDsJLyogNCArIHRwID0geGZlcnAgZGl2aXNvciAqLworfSBzeW5jc1tdID0geworLyoJZGl2CXNjZgl0cAlkaXYJc2NmCXRwCWRpdglzY2YJdHAgKi8KKyAgICB7CTQwLAkxLAkwfSwgewk1MCwJMSwJMX0sIHsJNjAsCTEsCTJ9LCAKKyAgICB7CTcwLAkxLAkzfSwgewk3NSwJMiwJMX0sIHsJODAsCTEsCTR9LAorICAgIHsJOTAsCTEsCTV9LCB7CTEwMCwJMSwJNn0sIHsJMTA1LAkyLAkzfSwKKyAgICB7CTExMCwJMSwJN30sIHsJMTIwLAkyLAk0fSwgewkxMzUsCTIsCTV9LAorICAgIHsJMTQwLAkzLAkzfSwgewkxNTAsCTIsCTZ9LCB7CTE2MCwJMywJNH0sCisgICAgewkxNjUsCTIsCTd9LCB7CTE4MCwJMywJNX0sIHsJMjAwLAkzLAk2fSwKKyAgICB7CTIxMCwJNCwJM30sIHsJMjIwLAkzLAk3fSwgewkyNDAsCTQsCTR9LAorICAgIHsJMjcwLAk0LAk1fSwgewkzMDAsCTQsCTZ9LCB7CTMzMCwJNCwJN30KK307CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIHN5bmNocm9ub3VzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgdGFyZ2V0LCAKKyAqCWNoYXIgKm1zZykKKyAqCisgKiBQdXJwb3NlIDogcmVwcm9ncmFtIHRyYW5zZmVycyBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBTQ1NJIGluaXRpYXRvciBhbmQgCisgKgl0YXJnZXQgZm9yIHN5bmNocm9ub3VzIFNDU0kgdHJhbnNmZXJzIHN1Y2ggdGhhdCB0aGUgc3luY2hyb25vdXMgCisgKglvZmZzZXQgaXMgbGVzcyB0aGFuIHRoYXQgcmVxdWVzdGVkIGFuZCBwZXJpb2QgYXQgbGVhc3QgYXMgbG9uZyAKKyAqCWFzIHRoYXQgcmVxdWVzdGVkLiAgQWxzbyBtb2RpZnkgKm1zZyBzdWNoIHRoYXQgaXQgY29udGFpbnMgCisgKglhbiBhcHByb3ByaWF0ZSByZXNwb25zZS4gCisgKgorICogSW5wdXRzIDogaG9zdCAtIE5DUjUzYzcsOHh4IFNDU0kgaG9zdCwgdGFyZ2V0IC0gbnVtYmVyIFNDU0kgdGFyZ2V0IGlkLAorICoJbXNnIC0gc3luY2hyb25vdXMgdHJhbnNmZXIgcmVxdWVzdC4KKyAqLworCisKK3N0YXRpYyB2b2lkIAorc3luY2hyb25vdXMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGludCB0YXJnZXQsIGNoYXIgKm1zZykgeworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKyAgICBpbnQgZGVzaXJlLCBkaXZpc29yLCBpLCBsaW1pdDsKKyAgICB1bnNpZ25lZCBjaGFyIHNjbnRsMywgc3hmZXI7CisvKiBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlIGZpdHMgb24gb25lIGxpbmUsIGV2ZW4gd2l0aCBtYXguIHdpZHRoIGludGVnZXJzICovCisgICAgY2hhciBidWZbODBdOwkKKyAgIAorLyogRGVzaXJlZCB0cmFuc2ZlciBjbG9jayBpbiBIeiAqLworICAgIGRlc2lyZSA9IDEwMDAwMDAwMDBMIC8gKG1zZ1szXSAqIDQpOworLyogU2NhbGUgdGhlIGF2YWlsYWJsZSBTQ1NJIGNsb2NrIGJ5IDEwIHNvIHdlIGdldCB0ZW50aHMgKi8KKyAgICBkaXZpc29yID0gKGhvc3RkYXRhLT5zY3NpX2Nsb2NrICogMTApIC8gZGVzaXJlOworCisvKiBOQ1IgY2hpcHMgY2FuIGhhbmRsZSBhdCBtb3N0IGFuIG9mZnNldCBvZiA4ICovCisgICAgaWYgKG1zZ1s0XSA+IDgpCisJbXNnWzRdID0gODsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsoInNjc2klZCA6IG9wdGltYWwgc3luY2hyb25vdXMgZGl2aXNvciBvZiAlZC4lMDFkXG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgZGl2aXNvciAvIDEwLCBkaXZpc29yICUgMTApOworCisgICAgbGltaXQgPSAoc2l6ZW9mKHN5bmNzKSAvIHNpemVvZihzeW5jc1swXSkgLTEpOworICAgIGZvciAoaSA9IDA7IChpIDwgbGltaXQpICYmIChkaXZpc29yID4gc3luY3NbaV0uZGl2KTsgKytpKTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsoInNjc2klZCA6IHNlbGVjdGVkIHN5bmNocm9ub3VzIGRpdmlzb3Igb2YgJWQuJTAxZFxuIiwgCisJICAgIGhvc3QtPmhvc3Rfbm8sIHN5bmNzW2ldLmRpdiAvIDEwLCBzeW5jc1tpXS5kaXYgJSAxMCk7CisKKyAgICBtc2dbM10gPSAoKDEwMDAwMDAwMDBMIC8gaG9zdGRhdGEtPnNjc2lfY2xvY2spICogc3luY3NbaV0uZGl2IC8gMTAgLyA0KTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsoInNjc2klZCA6IHNlbGVjdGVkIHN5bmNocm9ub3VzIHBlcmlvZCBvZiAlZG5zXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBtc2dbM10gKiA0KTsKKworICAgIHNjbnRsMyA9IHN5bmNzW2ldLnNjZjsKKyAgICBzeGZlciA9IChtc2dbNF0gPDwgU1hGRVJfTU9fU0hJRlQpIHwgKHN5bmNzW2ldLnRwIDw8IDQpOworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TRFRSKQorICAgIAlwcmludGsgKCJzY3NpJWQgOiBzeGZlcj0weCV4IHNjbnRsMz0weCV4XG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgKGludCkgc3hmZXIsIChpbnQpIHNjbnRsMyk7CisgICAgc2V0X3N5bmNocm9ub3VzIChob3N0LCB0YXJnZXQsIHN4ZmVyLCBzY250bDMsIDEpOworICAgIHNwcmludGYgKGJ1ZiwgInNjc2klZCA6IHNldHRpbmcgdGFyZ2V0ICVkIHRvICIsIGhvc3QtPmhvc3Rfbm8sIHRhcmdldCk7CisgICAgcHJpbnRfc3luY2hyb25vdXMgKGJ1ZiwgbXNnKTsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IHN0YXRpYyBpbnQgTkNSNTNjN3gwX2RzdGF0X3Npcl9pbnRyIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6ICBIYW5kbGVyIGZvciBJTlQgZ2VuZXJhdGVkIGluc3RydWN0aW9ucyBmb3IgdGhlIAorICogCU5DUjUzYzgxMC84MjAgU0NTSSBTQ1JJUFQKKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gcG9pbnRlciB0byB0aGlzIGhvc3QgYWRhcHRlcidzIHN0cnVjdHVyZSwKKyAqIAljbWQgLSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIChpZiBhbnkpIGRzYSB3YXMgcG9pbnRpbmcgCisgKiAJdG8uCisgKgorICovCisKK3N0YXRpYyBpbnQgCitOQ1I1M2M3eDBfZHN0YXRfc2lyX2ludHIgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCAKKyAgICBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIGludCBwcmludDsKKyAgICBTY3NpX0NtbmQgKmMgPSBjbWQgPyBjbWQtPmNtZCA6IE5VTEw7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOwkJCisgICAgdTMyIGRzcHMsKmRzcDsJLyogQXJndW1lbnQgb2YgdGhlIElOVCBpbnN0cnVjdGlvbiAqLworCisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworICAgIGRzcHMgPSBOQ1I1M2M3eDBfcmVhZDMyKERTUFNfUkVHKTsKKyAgICBkc3AgPSAodTMyICopIGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNQX1JFRykpOworCisgICAgLyogUkdIIDE1MDU5NzogIEZyaWcuICBDb21tYW5kcyB3aGljaCBmYWlsIHdpdGggQ2hlY2sgQ29uZGl0aW9uIGFyZQorICAgICAqIEZsYWdnZWQgYXMgc3VjY2Vzc2Z1bCAtIGhhY2sgZHNwcyB0byBpbmRpY2F0ZSBjaGVjayBjb25kaXRpb24gKi8KKyNpZiAwCisgICAgLyogUkdIIDIwMDU5NzogIE5lZWQgdG8gZGlzYWJsZSBmb3IgQlZNRTYwMDAsIGFzIGl0IGdldHMgQ2hlY2sgQ29uZGl0aW9ucworICAgICAqIGFuZCB0aGVuIGRpZXMuICBTZWVtcyB0byBoYW5kbGUgQ2hlY2sgQ29uZGl0aW9uIGF0IHN0YXJ0dXAsIGJ1dAorICAgICAqIG5vdCBtaWQga2VybmVsIGJ1aWxkLiAqLworICAgIGlmIChkc3BzID09IEFfaW50X25vcm1fZW11bGF0ZWludGZseSAmJiBjbWQgJiYgY21kLT5yZXN1bHQgPT0gMikKKyAgICAgICAgZHNwcyA9IEFfaW50X2Vycl9jaGVja19jb25kaXRpb247CisjZW5kaWYKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSAKKwlwcmludGsgKCJzY3NpJWQgOiBEU1BTID0gMHgleFxuIiwgaG9zdC0+aG9zdF9ubywgZHNwcyk7CisKKyAgICBzd2l0Y2ggKGRzcHMpIHsKKyAgICBjYXNlIEFfaW50X21zZ18xOgorCXByaW50ID0gMTsKKwlzd2l0Y2ggKGhvc3RkYXRhLT5tc2dfYnVmWzBdKSB7CisJLyogCisJICogVW5sZXNzIHdlJ3ZlIGluaXRpYXRlZCBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiwgSSBkb24ndAorCSAqIHRoaW5rIHRoYXQgdGhpcyBzaG91bGQgaGFwcGVuLgorCSAqLworCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJICAgIGhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfYWNjZXB0X21lc3NhZ2UgLworCQlzaXplb2YodTMyKTsKKwkgICAgaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgaWYgKGNtZCAmJiAoY21kLT5mbGFncyAmIENNRF9GTEFHX1NEVFIpKSB7CisJCXByaW50ayAoInNjc2klZCA6IHRhcmdldCAlZCByZWplY3RlZCBTRFRSXG4iLCBob3N0LT5ob3N0X25vLCAKKwkJICAgIGMtPmRldmljZS0+aWQpOworCQljbWQtPmZsYWdzICY9IH5DTURfRkxBR19TRFRSOworCQlhc3luY2hyb25vdXMgKGhvc3QsIGMtPmRldmljZS0+aWQpOworCQlwcmludCA9IDA7CisJICAgIH0gCisJICAgIGJyZWFrOworCWNhc2UgSU5JVElBVEVfUkVDT1ZFUlk6CisJICAgIHByaW50ayAoInNjc2klZCA6IGV4dGVuZGVkIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBub3Qgc3VwcG9ydGVkIHlldCwgcmVqZWN0aW5nXG4iLAorCQlob3N0LT5ob3N0X25vKTsKKwkgICAgLyogRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgKi8KKwkgICAgaG9zdGRhdGEtPmRzcCA9IGhvc3RkYXRhLT5zY3JpcHQgKyBob3N0ZGF0YS0+RV9yZWplY3RfbWVzc2FnZSAvCisJCXNpemVvZih1MzIpOworCSAgICBob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwcmludGsgKCJzY3NpJWQgOiB1bnN1cHBvcnRlZCBtZXNzYWdlLCByZWplY3RpbmdcbiIsCisJCWhvc3QtPmhvc3Rfbm8pOworCSAgICBob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX3JlamVjdF9tZXNzYWdlIC8KKwkJc2l6ZW9mKHUzMik7CisJICAgIGhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJfQorCWlmIChwcmludCkgeworCSAgICBwcmludGsgKCJzY3NpJWQgOiByZWNlaXZlZCBtZXNzYWdlIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIGlmIChjKSAKKwkgICAgCXByaW50ayAoIiBmcm9tIHRhcmdldCAlZCBsdW4gJWQgIiwgYy0+ZGV2aWNlLT5pZCwgYy0+ZGV2aWNlLT5sdW4pOworCSAgICBwcmludF9tc2cgKCh1bnNpZ25lZCBjaGFyICopIGhvc3RkYXRhLT5tc2dfYnVmKTsKKwkgICAgcHJpbnRrKCJcbiIpOworCX0KKwkKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisKKworICAgIGNhc2UgQV9pbnRfbXNnX3NkdHI6CisvKgorICogQXQgdGhpcyBwb2ludCwgaG9zdGRhdGEtPm1zZ19idWYgY29udGFpbnMKKyAqIDAgRVhURU5ERUQgTUVTU0FHRQorICogMSBsZW5ndGggCisgKiAyIFNEVFIKKyAqIDMgcGVyaW9kICogNG5zCisgKiA0IG9mZnNldAorICovCisKKwlpZiAoY21kKSB7CisJICAgIGNoYXIgYnVmWzgwXTsKKwkgICAgc3ByaW50ZiAoYnVmLCAic2NzaSVkIDogdGFyZ2V0ICVkICVzICIsIGhvc3QtPmhvc3Rfbm8sIGMtPmRldmljZS0+aWQsCisJCShjbWQtPmZsYWdzICYgQ01EX0ZMQUdfU0RUUikgPyAiYWNjZXB0aW5nIiA6ICJyZXF1ZXN0aW5nIik7CisJICAgIHByaW50X3N5bmNocm9ub3VzIChidWYsICh1bnNpZ25lZCBjaGFyICopIGhvc3RkYXRhLT5tc2dfYnVmKTsKKworCS8qIAorCSAqIEluaXRpYXRvciBpbml0aWF0ZWQsIHdvbid0IGhhcHBlbiB1bmxlc3Mgc3luY2hyb25vdXMgCisJICogCXRyYW5zZmVycyBhcmUgZW5hYmxlZC4gIElmIHdlIGdldCBhIFNEVFIgbWVzc2FnZSBpbgorCSAqIAlyZXNwb25zZSB0byBvdXIgU0RUUiwgd2Ugc2hvdWxkIHByb2dyYW0gb3VyIHBhcmFtZXRlcnMKKwkgKiAJc3VjaCB0aGF0IAorCSAqCQlvZmZzZXQgPD0gcmVxdWVzdGVkIG9mZnNldAorCSAqCQlwZXJpb2QgPj0gcmVxdWVzdGVkIHBlcmlvZAkJIAkKKyAgIAkgKi8KKwkgICAgaWYgKGNtZC0+ZmxhZ3MgJiBDTURfRkxBR19TRFRSKSB7CisJCWNtZC0+ZmxhZ3MgJj0gfkNNRF9GTEFHX1NEVFI7IAorCQlpZiAoaG9zdGRhdGEtPm1zZ19idWZbNF0pIAorCQkgICAgc3luY2hyb25vdXMgKGhvc3QsIGMtPmRldmljZS0+aWQsICh1bnNpZ25lZCBjaGFyICopIAorCQkgICAgCWhvc3RkYXRhLT5tc2dfYnVmKTsKKwkJZWxzZSAKKwkJICAgIGFzeW5jaHJvbm91cyAoaG9zdCwgYy0+ZGV2aWNlLT5pZCk7CisJCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfYWNjZXB0X21lc3NhZ2UgLworCQkgICAgc2l6ZW9mKHUzMik7CisJCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJCXJldHVybiBTUEVDSUZJQ19JTlRfTk9USElORzsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX1NZTkNIUk9OT1VTKSAgeworCQkgICAgY21kLT5mbGFncyB8PSBDTURfRkxBR19ESURfU0RUUjsKKwkJICAgIHN5bmNocm9ub3VzIChob3N0LCBjLT5kZXZpY2UtPmlkLCAodW5zaWduZWQgY2hhciAqKSAKKwkJCWhvc3RkYXRhLT5tc2dfYnVmKTsKKwkJfSBlbHNlIHsKKwkJICAgIGhvc3RkYXRhLT5tc2dfYnVmWzRdID0gMDsJCS8qIDAgb2Zmc2V0ID0gYXN5bmMgKi8KKwkJICAgIGFzeW5jaHJvbm91cyAoaG9zdCwgYy0+ZGV2aWNlLT5pZCk7CisJCX0KKwkJcGF0Y2hfZHNhXzMyIChjbWQtPmRzYSwgZHNhX21zZ291dF9vdGhlciwgMCwgNSk7CisJCXBhdGNoX2RzYV8zMiAoY21kLT5kc2EsIGRzYV9tc2dvdXRfb3RoZXIsIDEsICh1MzIpIAorCQkgICAgdmlydF90b19idXMgKCh2b2lkICopJmhvc3RkYXRhLT5tc2dfYnVmKSk7CisJCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgCisJCSAgICBob3N0ZGF0YS0+RV9yZXNwb25kX21lc3NhZ2UgLyBzaXplb2YodTMyKTsKKwkJaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgfQorCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisJfQorCS8qIEZhbGwgdGhyb3VnaCB0byBhYm9ydCBpZiB3ZSBjb3VsZG4ndCBmaW5kIGEgY21kLCBhbmQgCisJICAgdGhlcmVmb3JlIGEgZHNhIHN0cnVjdHVyZSB0byB0d2lkZGxlICovCisgICAgY2FzZSBBX2ludF9tc2dfd2R0cjoKKwlob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX3JlamVjdF9tZXNzYWdlIC8KKwkgICAgc2l6ZW9mKHUzMik7CisJaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF9lcnJfdW5leHBlY3RlZF9waGFzZToKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgCisJICAgIHByaW50ayAoInNjc2klZCA6IHVuZXhwZWN0ZWQgcGhhc2VcbiIsIGhvc3QtPmhvc3Rfbm8pOworCXJldHVybiBTUEVDSUZJQ19JTlRfQUJPUlQ7CisgICAgY2FzZSBBX2ludF9lcnJfc2VsZWN0ZWQ6CisJaWYgKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkKKwkgICAgcHJpbnRrICgic2NzaSVkIDogc2VsZWN0ZWQgYnkgdGFyZ2V0ICVkXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICAgICAgKGludCkgTkNSNTNjN3gwX3JlYWQ4KFNESURfUkVHXzgwMCkgJjcpOworCWVsc2UKKyAgICAgICAgICAgIHByaW50ayAoInNjc2klZCA6IHNlbGVjdGVkIGJ5IHRhcmdldCBMQ1JDPTB4JTAyeFxuIiwgaG9zdC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoTENSQ19SRUdfMTApKTsKKwlob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX3RhcmdldF9hYm9ydCAvIAorICAgIAkgICAgc2l6ZW9mKHUzMik7CisJaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdDoKKwlpZiAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KQorCSAgICBwcmludGsgKCJzY3NpJWQgOiB1bmV4cGVjdGVkIHJlc2VsZWN0IGJ5IHRhcmdldCAlZCBsdW4gJWRcbiIsIAorCSAgICAgICAgaG9zdC0+aG9zdF9ubywgKGludCkgTkNSNTNjN3gwX3JlYWQ4KFNESURfUkVHXzgwMCkgJiA3LAorCSAgICAgICAgaG9zdGRhdGEtPnJlc2VsZWN0ZWRfaWRlbnRpZnkgJiA3KTsKKwllbHNlCisgICAgICAgICAgICBwcmludGsgKCJzY3NpJWQgOiB1bmV4cGVjdGVkIHJlc2VsZWN0IExDUkM9MHglMDJ4XG4iLCBob3N0LT5ob3N0X25vLAorICAgICAgICAgICAgICAgIChpbnQpIE5DUjUzYzd4MF9yZWFkOChMQ1JDX1JFR18xMCkpOworCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfaW5pdGlhdG9yX2Fib3J0IC8KKyAgICAJICAgIHNpemVvZih1MzIpOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJcmV0dXJuIFNQRUNJRklDX0lOVF9OT1RISU5HOworLyoKKyAqIFNpbmNlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIGFyZSBjbGVhcmVkIGJ5IHRoZSBuZXh0IAorICogY29tbWFuZCBpc3N1ZWQgdG8gYSB0YXJnZXQsIHdlIG11c3QgaXNzdWUgYSBSRVFVRVNUIFNFTlNFIAorICogY29tbWFuZCBhZnRlciByZWNlaXZpbmcgYSBDSEVDSyBDT05ESVRJT04gc3RhdHVzLCBiZWZvcmUKKyAqIGFub3RoZXIgY29tbWFuZCBpcyBpc3N1ZWQuCisgKiAKKyAqIFNpbmNlIHRoaXMgTkNSNTNjN3gwX2NtZCB3aWxsIGJlIGZyZWVkIGFmdGVyIHVzZSwgd2UgZG9uJ3QgCisgKiBjYXJlIGlmIHdlIHN0ZXAgb24gdGhlIHZhcmlvdXMgZmllbGRzLCBzbyBtb2RpZnkgYSBmZXcgdGhpbmdzLgorICovCisgICAgY2FzZSBBX2ludF9lcnJfY2hlY2tfY29uZGl0aW9uOiAKKyNpZiAwCisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpIAorI2VuZGlmCisJICAgIHByaW50ayAoInNjc2klZCA6IENIRUNLIENPTkRJVElPTlxuIiwgaG9zdC0+aG9zdF9ubyk7CisJaWYgKCFjKSB7CisJICAgIHByaW50aygic2NzaSVkIDogQ0hFQ0sgQ09ORElUSU9OIHdpdGggbm8gU0NTSSBjb21tYW5kXG4iLAorCQlob3N0LT5ob3N0X25vKTsKKwkgICAgcmV0dXJuIFNQRUNJRklDX0lOVF9QQU5JQzsKKwl9CisKKwkvKiAKKwkgKiBGSVhNRSA6IHRoaXMgdXNlcyB0aGUgbm9ybWFsIG9uZS1ieXRlIHNlbGVjdGlvbiBtZXNzYWdlLgorCSAqIAlXZSBtYXkgd2FudCB0byByZW5lZ290aWF0ZSBmb3Igc3luY2hyb25vdXMgJiBXSURFIHRyYW5zZmVycworCSAqIAlzaW5jZSB0aGVzZSBjb3VsZCBiZSB0aGUgY3J1eCBvZiBvdXIgcHJvYmxlbS4KKwkgKgorCSBob3N0ZGF0YS0+Tk9QX2luc24qIEZJWE1FIDogb25jZSBTQ1NJLUlJIHRhZ2dlZCBxdWV1aW5nIGlzIGltcGxlbWVudGVkLCB3ZSdsbAorCSAqIAloYXZlIHRvIHNldCB0aGlzIHVwIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIERTQQorCSAqCWFncmVlcyB3aXRoIHRoaXMgYmVpbmcgYW4gdW50YWdnZWQgcXVldWUnZCBjb21tYW5kLgorCSAqLworCisgICAgCXBhdGNoX2RzYV8zMiAoY21kLT5kc2EsIGRzYV9tc2dvdXQsIDAsIDEpOworCisgICAgCS8qIAorICAgIAkgKiBNb2RpZnkgdGhlIHRhYmxlIGluZGlyZWN0IGZvciBDT01NQU5EIE9VVCBwaGFzZSwgc2luY2UgCisgICAgCSAqIFJlcXVlc3QgU2Vuc2UgaXMgYSBzaXggYnl0ZSBjb21tYW5kLgorICAgIAkgKi8KKworICAgIAlwYXRjaF9kc2FfMzIgKGNtZC0+ZHNhLCBkc2FfY21kb3V0LCAwLCA2KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgQ0RCIGlzIG5vdyBtaXJyb3JlZCBpbiBvdXIgbG9jYWwgbm9uLWNhY2hlZAorICAgICAgICAgKiBzdHJ1Y3R1cmUsIGJ1dCBrZWVwIHRoZSBvbGQgc3RydWN0dXJlIHVwIHRvIGRhdGUgYXMgd2VsbCwKKyAgICAgICAgICoganVzdCBpbiBjYXNlIGFueW9uZSBsb29rcyBhdCBpdC4KKyAgICAgICAgICovCisKKwkvKgorCSAqIFhYWCBOZWVkIHRvIHdvcnJ5IGFib3V0IGRhdGEgYnVmZmVyIGFsaWdubWVudC9jYWNoZSBzdGF0ZQorCSAqIFhYWCBoZXJlLCBidXQgY3VycmVudGx5IG5ldmVyIGdldCBBX2ludF9lcnJfY2hlY2tfY29uZGl0aW9uLAorCSAqIFhYWCBzbyBpZ25vcmUgcHJvYmxlbSBmb3Igbm93LgorICAgICAgICAgKi8KKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzBdID0gUkVRVUVTVF9TRU5TRTsKKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzFdICY9IDB4ZTA7CS8qIFplcm8gYWxsIGJ1dCBMVU4gKi8KKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzJdID0gMDsKKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzNdID0gMDsKKwljbWQtPmNtbmRbMF0gPSBjLT5jbW5kWzRdID0gc2l6ZW9mKGMtPnNlbnNlX2J1ZmZlcik7CisJY21kLT5jbW5kWzBdID0gYy0+Y21uZFs1XSA9IDA7IAorCisJLyoKKwkgKiBEaXNhYmxlIGRhdGFvdXQgcGhhc2UsIGFuZCBwcm9ncmFtIGRhdGFpbiB0byB0cmFuc2ZlciB0byB0aGUgCisJICogc2Vuc2UgYnVmZmVyLCBhbmQgYWRkIGEganVtcCB0byBvdGhlcl90cmFuc2ZlciBhZnRlciB0aGUgCisgICAgCSAqIGNvbW1hbmQgc28gb3ZlcmZsb3cvdW5kZXJydW4gY29uZGl0aW9ucyBhcmUgZGV0ZWN0ZWQuCisJICovCisKKyAgICAJcGF0Y2hfZHNhXzMyIChjbWQtPmRzYSwgZHNhX2RhdGFvdXQsIDAsIAorCSAgICB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyKTsKKyAgICAJcGF0Y2hfZHNhXzMyIChjbWQtPmRzYSwgZHNhX2RhdGFpbiwgMCwgCisJICAgIHZpcnRfdG9fYnVzKGNtZC0+ZGF0YV90cmFuc2Zlcl9zdGFydCkpOworICAgIAljbWQtPmRhdGFfdHJhbnNmZXJfc3RhcnRbMF0gPSAoKChEQ01EX1RZUEVfQk1JIHwgRENNRF9CTUlfT1BfTU9WRV9JIHwgCisgICAgCSAgICBEQ01EX0JNSV9JTykpIDw8IDI0KSB8IHNpemVvZihjLT5zZW5zZV9idWZmZXIpOworICAgIAljbWQtPmRhdGFfdHJhbnNmZXJfc3RhcnRbMV0gPSAodTMyKSB2aXJ0X3RvX2J1cyhjLT5zZW5zZV9idWZmZXIpOworCisJY21kLT5kYXRhX3RyYW5zZmVyX3N0YXJ0WzJdID0gKChEQ01EX1RZUEVfVENJIHwgRENNRF9UQ0lfT1BfSlVNUCkgCisgICAgCSAgICA8PCAyNCkgfCBEQkNfVENJX1RSVUU7CisJY21kLT5kYXRhX3RyYW5zZmVyX3N0YXJ0WzNdID0gKHUzMikgdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKwkgICAgaG9zdGRhdGEtPkVfb3RoZXJfdHJhbnNmZXI7CisKKyAgICAJLyoKKyAgICAJICogQ3VycmVudGx5LCB0aGlzIGNvbW1hbmQgaXMgZmxhZ2dlZCBhcyBjb21wbGV0ZWQsIGllIAorICAgIAkgKiBpdCBoYXMgdmFsaWQgc3RhdHVzIGFuZCBtZXNzYWdlIGRhdGEuICBSZWZsYWcgaXQgYXMKKyAgICAJICogaW5jb21wbGV0ZS4gIFEgLSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzbyB0aGF0IG9yaWdpbmFsCisJICogc3RhdHVzLCBldGMgYXJlIHVzZWQuCisgICAgCSAqLworCisJY21kLT5yZXN1bHQgPSBjbWQtPmNtZC0+cmVzdWx0ID0gMHhmZmZmOwkJCisKKwkvKiAKKwkgKiBSZXN0YXJ0IGNvbW1hbmQgYXMgYSBSRVFVRVNUIFNFTlNFLgorCSAqLworCWhvc3RkYXRhLT5kc3AgPSAodTMyICopIGhvc3RkYXRhLT5zY3JpcHQgKyBob3N0ZGF0YS0+RV9zZWxlY3QgLworCSAgICBzaXplb2YodTMyKTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCXJldHVybiBTUEVDSUZJQ19JTlRfTk9USElORzsKKyAgICBjYXNlIEFfaW50X2RlYnVnX2JyZWFrOgorCXJldHVybiBTUEVDSUZJQ19JTlRfQlJFQUs7CisgICAgY2FzZSBBX2ludF9ub3JtX2Fib3J0ZWQ6CisJaG9zdGRhdGEtPmRzcCA9ICh1MzIgKikgaG9zdGRhdGEtPnNjaGVkdWxlOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisJaWYgKGNtZCkKKwkgICAgYWJub3JtYWxfZmluaXNoZWQgKGNtZCwgRElEX0VSUk9SIDw8IDE2KTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF9ub3JtX2VtdWxhdGVpbnRmbHk6CisJTkNSNTNjN3gwX2ludGZseShob3N0KTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisgICAgY2FzZSBBX2ludF90ZXN0XzE6CisgICAgY2FzZSBBX2ludF90ZXN0XzI6CisJaG9zdGRhdGEtPmlkbGUgPSAxOworCWhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9IChkc3BzIC0gQV9pbnRfdGVzdF8xKSAvIDB4MDAwMTAwMDAgKyAxOworCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKQorCSAgICBwcmludGsoInNjc2klZCA6IHRlc3QlZCBjb21wbGV0ZVxuIiwgaG9zdC0+aG9zdF9ubywKKwkJaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkKTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX05PVEhJTkc7CisjaWZkZWYgQV9pbnRfZGVidWdfcmVzZWxlY3RlZF9vaworICAgIGNhc2UgQV9pbnRfZGVidWdfcmVzZWxlY3RlZF9vazoKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKyAgICAJICAgIAlPUFRJT05fREVCVUdfRElTQ09OTkVDVCkpIHsKKwkgICAgLyogCisJICAgICAqIE5vdGUgLSB0aGlzIGRzYSBpcyBub3QgYmFzZWQgb24gbG9jYXRpb24gcmVsYXRpdmUgdG8gCisJICAgICAqIHRoZSBjb21tYW5kIHN0cnVjdHVyZSwgYnV0IHRvIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSAKKwkgICAgICogRFNBIHJlZ2lzdGVyIAorCSAgICAgKi8JCisJICAgIHUzMiAqZHNhOworCSAgICBkc2EgPSAodTMyICopIGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKworCSAgICBwcmludGsoInNjc2klZCA6IHJlc2VsZWN0ZWRfb2sgKERTQSA9IDB4JXggKHZpcnQgMHglcClcbiIsIAorCQlob3N0LT5ob3N0X25vLCBOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpLCBkc2EpOworCSAgICBwcmludGsoInNjc2klZCA6IHJlc3VtZSBhZGRyZXNzIGlzIDB4JXggKHZpcnQgMHglcClcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBjbWQtPnNhdmVkX2RhdGFfcG9pbnRlciwKKwkJICAgIGJ1c190b192aXJ0KGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyKSk7CisJICAgIHByaW50X2luc24gKGhvc3QsIGhvc3RkYXRhLT5zY3JpcHQgKyBFbnRfcmVzZWxlY3RlZF9vayAvIAorICAgIAkgICAgCSAgICBzaXplb2YodTMyKSwgIiIsIDEpOworCSAgICBpZiAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KQorICAgIAkgICAgICAgIHByaW50ayAoInNjc2klZCA6IHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgTkNSNTNjN3gwX3JlYWQ4KFNYRkVSX1JFRyksCisJCSAgICBOQ1I1M2M3eDBfcmVhZDgoU0NOVEwzX1JFR184MDApKTsKKwkgICAgZWxzZQorICAgIAkgICAgICAgIHByaW50ayAoInNjc2klZCA6IHN4ZmVyPTB4JXgsIGNhbm5vdCByZWFkIFNCQ0xcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSk7CisJICAgIGlmIChjKSB7CisJCXByaW50X2luc24gKGhvc3QsICh1MzIgKikgCisJCSAgICBob3N0ZGF0YS0+c3luY1tjLT5kZXZpY2UtPmlkXS5zY3JpcHQsICIiLCAxKTsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgKHUzMiAqKSAKKwkJICAgIGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNjcmlwdCArIDIsICIiLCAxKTsKKwkgICAgfQorCX0KKyAgICAJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfcmVzZWxlY3RfY2hlY2sKKyAgICBjYXNlIEFfaW50X2RlYnVnX3Jlc2VsZWN0X2NoZWNrOgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSKSkgeworCSAgICB1MzIgKmRzYTsKKyNpZiAwCisJICAgIHUzMiAqY29kZTsKKyNlbmRpZgorCSAgICAvKiAKKwkgICAgICogTm90ZSAtIHRoaXMgZHNhIGlzIG5vdCBiYXNlZCBvbiBsb2NhdGlvbiByZWxhdGl2ZSB0byAKKwkgICAgICogdGhlIGNvbW1hbmQgc3RydWN0dXJlLCBidXQgdG8gbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIAorCSAgICAgKiBEU0EgcmVnaXN0ZXIgCisJICAgICAqLwkKKwkgICAgZHNhID0gYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpOworCSAgICBwcmludGsoInNjc2klZCA6IHJlc2VsZWN0ZWRfY2hlY2tfbmV4dCAoRFNBID0gMHglbHggKHZpcnQgMHglcCkpXG4iLAorCQlob3N0LT5ob3N0X25vLCB2aXJ0X3RvX2J1cyhkc2EpLCBkc2EpOworCSAgICBpZiAoZHNhKSB7CisJCXByaW50aygic2NzaSVkIDogcmVzdW1lIGFkZHJlc3MgaXMgMHgleCAodmlydCAweCVwKVxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyLAorCQkgICAgYnVzX3RvX3ZpcnQgKGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyKSk7CisjaWYgMAorCQlwcmludGsoInNjc2klZCA6IHRlbXBsYXRlIGNvZGUgOlxuIiwgaG9zdC0+aG9zdF9ubyk7CisJCWZvciAoY29kZSA9IGRzYSArIChFbnRfZHNhX2NvZGVfY2hlY2tfcmVzZWxlY3QgLSBFbnRfZHNhX3plcm8pIAorCQkgICAgLyBzaXplb2YodTMyKTsgY29kZSA8IChkc2EgKyBFbnRfZHNhX3plcm8gLyBzaXplb2YodTMyKSk7IAorCQkgICAgY29kZSArPSBwcmludF9pbnNuIChob3N0LCBjb2RlLCAiIiwgMSkpOworI2VuZGlmCisJICAgIH0KKwkgICAgcHJpbnRfaW5zbiAoaG9zdCwgaG9zdGRhdGEtPnNjcmlwdCArIEVudF9yZXNlbGVjdGVkX29rIC8gCisgICAgCSAgICAJICAgIHNpemVvZih1MzIpLCAiIiwgMSk7CisJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19kc2Ffc2NoZWR1bGUKKyAgICBjYXNlIEFfaW50X2RlYnVnX2RzYV9zY2hlZHVsZToKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUikpIHsKKwkgICAgdTMyICpkc2E7CisJICAgIC8qIAorCSAgICAgKiBOb3RlIC0gdGhpcyBkc2EgaXMgbm90IGJhc2VkIG9uIGxvY2F0aW9uIHJlbGF0aXZlIHRvIAorCSAgICAgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUsIGJ1dCB0byBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgCisJICAgICAqIERTQSByZWdpc3RlciAKKwkgICAgICovCQorCSAgICBkc2EgPSAodTMyICopIGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBkc2Ffc2NoZWR1bGUgKG9sZCBEU0EgPSAweCVseCAodmlydCAweCVwKSlcbiIsIAorCQlob3N0LT5ob3N0X25vLCB2aXJ0X3RvX2J1cyhkc2EpLCBkc2EpOworCSAgICBpZiAoZHNhKSAKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXN1bWUgYWRkcmVzcyBpcyAweCV4ICh2aXJ0IDB4JXApXG4iCisJCSAgICAgICAiICAgICAgICAgKHRlbXAgd2FzIDB4JXggKHZpcnQgMHglcCkpXG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIsCisJCSAgICBidXNfdG9fdmlydCAoY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpLAorCQkgICAgTkNSNTNjN3gwX3JlYWQzMiAoVEVNUF9SRUcpLAorCQkgICAgYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIoVEVNUF9SRUcpKSk7CisJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19zY2hlZHVsZWQKKyAgICBjYXNlIEFfaW50X2RlYnVnX3NjaGVkdWxlZDoKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUikpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBuZXcgSS9PIDB4JXggKHZpcnQgMHglcCkgc2NoZWR1bGVkXG4iLCAKKwkJaG9zdC0+aG9zdF9ubywgTkNSNTNjN3gwX3JlYWQzMihEU0FfUkVHKSwKKwkgICAgCWJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpKTsKKwl9CisJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfaWRsZQorICAgIGNhc2UgQV9pbnRfZGVidWdfaWRsZToKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUikpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBpZGxlXG4iLCBob3N0LT5ob3N0X25vKTsKKwl9CisJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfY21kCisgICAgY2FzZSBBX2ludF9kZWJ1Z19jbWQ6CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgKE9QVElPTl9ERUJVR19TQ1JJUFR8T1BUSU9OX0RFQlVHX0lOVFIpKSB7CisJICAgIHByaW50aygic2NzaSVkIDogY29tbWFuZCBzZW50XG4iKTsKKwl9CisgICAgCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX2RzYV9sb2FkZWQKKyAgICBjYXNlIEFfaW50X2RlYnVnX2RzYV9sb2FkZWQ6CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgKE9QVElPTl9ERUJVR19TQ1JJUFR8T1BUSU9OX0RFQlVHX0lOVFIpKSB7CisJICAgIHByaW50aygic2NzaSVkIDogRFNBIGxvYWRlZCB3aXRoIDB4JXggKHZpcnQgMHglcClcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCU5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRyksIAorCQlidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKSk7CisJfQorCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsgCisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19yZXNlbGVjdGVkCisgICAgY2FzZSBBX2ludF9kZWJ1Z19yZXNlbGVjdGVkOgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSfAorCSAgICBPUFRJT05fREVCVUdfRElTQ09OTkVDVCkpIHsKKwkgICAgaWYgKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXNlbGVjdGVkIGJ5IHRhcmdldCAlZCBsdW4gJWRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU0RJRF9SRUdfODAwKSAmIH4weDgwLCAKKwkJICAgIChpbnQpIGhvc3RkYXRhLT5yZXNlbGVjdGVkX2lkZW50aWZ5ICYgNyk7CisJICAgIGVsc2UKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXNlbGVjdGVkIGJ5IExDUkM9MHglMDJ4IGx1biAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaG9zdC0+aG9zdF9ubywgKGludCkgTkNSNTNjN3gwX3JlYWQ4KExDUkNfUkVHXzEwKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgaG9zdGRhdGEtPnJlc2VsZWN0ZWRfaWRlbnRpZnkgJiA3KTsKKwkgICAgcHJpbnRfcXVldWVzKGhvc3QpOworCX0KKyAgICAJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfZGlzY29ubmVjdF9tc2cKKyAgICBjYXNlIEFfaW50X2RlYnVnX2Rpc2Nvbm5lY3RfbXNnOgorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSKSkgeworCSAgICBpZiAoYykKKwkJcHJpbnRrKCJzY3NpJWQgOiB0YXJnZXQgJWQgbHVuICVkIGRpc2Nvbm5lY3RpbmdcbiIsIAorCQkgICAgaG9zdC0+aG9zdF9ubywgYy0+ZGV2aWNlLT5pZCwgYy0+ZGV2aWNlLT5sdW4pOworCSAgICBlbHNlCisJCXByaW50aygic2NzaSVkIDogdW5rbm93biB0YXJnZXQgZGlzY29ubmVjdGluZ1xuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8pOworCX0KKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19kaXNjb25uZWN0ZWQKKyAgICBjYXNlIEFfaW50X2RlYnVnX2Rpc2Nvbm5lY3RlZDoKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKwkJT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QpKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IGRpc2Nvbm5lY3RlZCwgbmV3IHF1ZXVlcyBhcmVcbiIsIAorCQlob3N0LT5ob3N0X25vKTsKKwkgICAgcHJpbnRfcXVldWVzKGhvc3QpOworI2lmIDAKKwkgICAgLyogTm90IHZhbGlkIG9uIG5jcjUzYzcxMCEgKi8KKyAgICAJICAgIHByaW50ayAoInNjc2klZCA6IHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iLAorCQlob3N0LT5ob3N0X25vLCBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSwKKwkJTkNSNTNjN3gwX3JlYWQ4KFNDTlRMM19SRUdfODAwKSk7CisjZW5kaWYKKwkgICAgaWYgKGMpIHsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgKHUzMiAqKSAKKwkJICAgIGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNjcmlwdCwgIiIsIDEpOworCQlwcmludF9pbnNuIChob3N0LCAodTMyICopIAorCQkgICAgaG9zdGRhdGEtPnN5bmNbYy0+ZGV2aWNlLT5pZF0uc2NyaXB0ICsgMiwgIiIsIDEpOworCSAgICB9CisJfQorCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX3BhbmljCisgICAgY2FzZSBBX2ludF9kZWJ1Z19wYW5pYzoKKwlwcmludGsoInNjc2klZCA6IGludF9kZWJ1Z19wYW5pYyByZWNlaXZlZFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJcHJpbnRfbG90cyAoaG9zdCk7CisJcmV0dXJuIFNQRUNJRklDX0lOVF9QQU5JQzsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX3NhdmVkCisgICAgY2FzZSBBX2ludF9kZWJ1Z19zYXZlZDoKKyAgICAJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgKE9QVElPTl9ERUJVR19TQ1JJUFR8T1BUSU9OX0RFQlVHX0lOVFJ8CisgICAgCSAgICBPUFRJT05fREVCVUdfRElTQ09OTkVDVCkpIHsKKyAgICAJICAgIHByaW50ayAoInNjc2klZCA6IHNhdmVkIGRhdGEgcG9pbnRlciAweCV4ICh2aXJ0IDB4JXApXG4iLAorICAgIAkgICAgCWhvc3QtPmhvc3Rfbm8sIGNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyLAorCQlidXNfdG9fdmlydCAoY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpKTsKKyAgICAJICAgIHByaW50X3Byb2dyZXNzIChjKTsKKyAgICAJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19yZXN0b3JlZAorICAgIGNhc2UgQV9pbnRfZGVidWdfcmVzdG9yZWQ6CisgICAgCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIChPUFRJT05fREVCVUdfU0NSSVBUfE9QVElPTl9ERUJVR19JTlRSfAorICAgIAkgICAgT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QpKSB7CisgICAgCSAgICBpZiAoY21kKSB7CisJCWludCBzaXplOworICAgIAkgICAgCXByaW50ayAoInNjc2klZCA6IHJlc3RvcmVkIGRhdGEgcG9pbnRlciAweCV4ICh2aXJ0IDB4JXApXG4iLAorICAgIAkgICAgCSAgICBob3N0LT5ob3N0X25vLCBjbWQtPnNhdmVkX2RhdGFfcG9pbnRlciwgYnVzX3RvX3ZpcnQgKAorCQkgICAgY21kLT5zYXZlZF9kYXRhX3BvaW50ZXIpKTsKKwkJc2l6ZSA9IHByaW50X2luc24gKGhvc3QsICh1MzIgKikgCisJCSAgICBidXNfdG9fdmlydChjbWQtPnNhdmVkX2RhdGFfcG9pbnRlciksICIiLCAxKTsKKwkJc2l6ZSA9IHByaW50X2luc24gKGhvc3QsICh1MzIgKikgCisJCSAgICBidXNfdG9fdmlydChjbWQtPnNhdmVkX2RhdGFfcG9pbnRlcikgKyBzaXplLCAiIiwgMSk7CisgICAgCSAgICAJcHJpbnRfcHJvZ3Jlc3MgKGMpOworCSAgICB9CisjaWYgMAorCSAgICBwcmludGsgKCJzY3NpJWQgOiBkYXRhcGF0aCByZXNpZHVhbCAlZFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgZGF0YXBhdGhfcmVzaWR1YWwgKGhvc3QpKSA7CisjZW5kaWYKKyAgICAJfQorICAgIAlyZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyNpZmRlZiBBX2ludF9kZWJ1Z19zeW5jCisgICAgY2FzZSBBX2ludF9kZWJ1Z19zeW5jOgorICAgIAlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKyAgICAJICAgIE9QVElPTl9ERUJVR19ESVNDT05ORUNUfE9QVElPTl9ERUJVR19TRFRSKSkgeworCSAgICB1bnNpZ25lZCBjaGFyIHN4ZmVyID0gTkNSNTNjN3gwX3JlYWQ4IChTWEZFUl9SRUcpLCBzY250bDM7CisJICAgIGlmICgoaG9zdGRhdGEtPmNoaXAgLyAxMDApID09IDgpIHsKKwkJc2NudGwzID0gTkNSNTNjN3gwX3JlYWQ4IChTQ05UTDNfUkVHXzgwMCk7CisJCWlmIChjKSB7CisJCSAgaWYgKHN4ZmVyICE9IGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnN4ZmVyX3Nhbml0eSB8fAorCQkgICAgc2NudGwzICE9IGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNjbnRsM19zYW5pdHkpIHsKKwkJICAgCXByaW50ayAoInNjc2klZCA6ICBzeW5jIHNhbml0eSBjaGVjayBmYWlsZWQgc3hmZXI9MHgleCwgc2NudGwzPTB4JXgiLAorCQkJICAgIGhvc3QtPmhvc3Rfbm8sIHN4ZmVyLCBzY250bDMpOworCQkJTkNSNTNjN3gwX3dyaXRlOCAoU1hGRVJfUkVHLCBzeGZlcik7CisJCQlOQ1I1M2M3eDBfd3JpdGU4IChTQ05UTDNfUkVHXzgwMCwgc2NudGwzKTsKKwkJICAgIH0KKwkJfSBlbHNlIAorICAgIAkgICAgCSAgcHJpbnRrICgic2NzaSVkIDogdW5rbm93biBjb21tYW5kIHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgKGludCkgc3hmZXIsIChpbnQpIHNjbnRsMyk7CisJICAgIH0gZWxzZSB7CisJCWlmIChjKSB7CisJCSAgaWYgKHN4ZmVyICE9IGhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnN4ZmVyX3Nhbml0eSkgeworCQkgICAJcHJpbnRrICgic2NzaSVkIDogIHN5bmMgc2FuaXR5IGNoZWNrIGZhaWxlZCBzeGZlcj0weCV4IiwKKwkJCSAgICBob3N0LT5ob3N0X25vLCBzeGZlcik7CisJCQlOQ1I1M2M3eDBfd3JpdGU4IChTWEZFUl9SRUcsIHN4ZmVyKTsKKwkJCU5DUjUzYzd4MF93cml0ZTggKFNCQ0xfUkVHLAorCQkJCWhvc3RkYXRhLT5zeW5jW2MtPmRldmljZS0+aWRdLnNzY2ZfNzEwKTsKKwkJICAgIH0KKwkJfSBlbHNlIAorICAgIAkgICAgCSAgcHJpbnRrICgic2NzaSVkIDogdW5rbm93biBjb21tYW5kIHN4ZmVyPTB4JXhcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCAoaW50KSBzeGZlcik7CisJICAgIH0KKwl9CisgICAgCXJldHVybiBTUEVDSUZJQ19JTlRfUkVTVEFSVDsKKyNlbmRpZgorI2lmZGVmIEFfaW50X2RlYnVnX2RhdGFpbgorCWNhc2UgQV9pbnRfZGVidWdfZGF0YWluOgorCSAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX1NDUklQVHxPUFRJT05fREVCVUdfSU5UUnwKKwkJT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1R8T1BUSU9OX0RFQlVHX1NEVFIpKSB7CisJCWludCBzaXplOworCQlpZiAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4KQorCQkgIHByaW50ayAoInNjc2klZCA6IEluIGRvX2RhdGFpbiAoJXMpIHN4ZmVyPTB4JXgsIHNjbnRsMz0weCV4XG4iCisJCQkiICAgICAgICAgZGF0YXBhdGggcmVzaWR1YWw9JWRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBzYmNsX3RvX3BoYXNlIChOQ1I1M2M3eDBfcmVhZDggKFNCQ0xfUkVHKSksCisJCSAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSwgCisJCSAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU0NOVEwzX1JFR184MDApLAorCQkgICAgZGF0YXBhdGhfcmVzaWR1YWwgKGhvc3QpKSA7CisJCWVsc2UKKwkJICBwcmludGsgKCJzY3NpJWQgOiBJbiBkb19kYXRhaW4gKCVzKSBzeGZlcj0weCV4XG4iCisJCQkiICAgICAgICAgZGF0YXBhdGggcmVzaWR1YWw9JWRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vLCBzYmNsX3RvX3BoYXNlIChOQ1I1M2M3eDBfcmVhZDggKFNCQ0xfUkVHKSksCisJCSAgICAoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU1hGRVJfUkVHKSwgCisJCSAgICBkYXRhcGF0aF9yZXNpZHVhbCAoaG9zdCkpIDsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgZHNwLCAiIiwgMSk7CisJCXNpemUgPSBwcmludF9pbnNuIChob3N0LCAodTMyICopIGJ1c190b192aXJ0KGRzcFsxXSksICIiLCAxKTsKKwkJcHJpbnRfaW5zbiAoaG9zdCwgKHUzMiAqKSBidXNfdG9fdmlydChkc3BbMV0pICsgc2l6ZSwgIiIsIDEpOworCSAgIH0gCisJcmV0dXJuIFNQRUNJRklDX0lOVF9SRVNUQVJUOworI2VuZGlmCisjaWZkZWYgQV9pbnRfZGVidWdfY2hlY2tfZHNhCisJY2FzZSBBX2ludF9kZWJ1Z19jaGVja19kc2E6CisJICAgIGlmIChOQ1I1M2M3eDBfcmVhZDggKFNDTlRMMV9SRUcpICYgU0NOVEwxX0NPTikgeworCQlpbnQgc2RpZDsKKwkJaW50IHRtcDsKKwkJY2hhciAqd2hlcmU7CisJCWlmIChob3N0ZGF0YS0+Y2hpcCAvIDEwMCA9PSA4KQorCQkgICAgc2RpZCA9IE5DUjUzYzd4MF9yZWFkOCAoU0RJRF9SRUdfODAwKSAmIDE1OworCQllbHNlIHsKKwkJICAgIHRtcCA9IE5DUjUzYzd4MF9yZWFkOCAoU0RJRF9SRUdfNzAwKTsKKwkJICAgIGlmICghdG1wKQorCQkJcGFuaWMgKCJTRElEX1JFR183MDAgPSAwIik7CisJCSAgICB0bXAgPj49IDE7CisJCSAgICBzZGlkID0gMDsKKwkJICAgIHdoaWxlICh0bXApIHsKKwkJCXRtcCA+Pj0gMTsKKwkJCXNkaWQrKzsKKwkJICAgIH0KKwkJfQorCQl3aGVyZSA9IGRzcCAtIE5DUjUzYzd4MF9pbnNuX3NpemUoTkNSNTNjN3gwX3JlYWQ4IAorCQkJKERDTURfUkVHKSkgPT0gaG9zdGRhdGEtPnNjcmlwdCArIAorCQkgICAgCUVudF9zZWxlY3RfY2hlY2tfZHNhIC8gc2l6ZW9mKHUzMikgPworCQkgICAgInNlbGVjdGlvbiIgOiAicmVzZWxlY3Rpb24iOworCQlpZiAoYyAmJiBzZGlkICE9IGMtPmRldmljZS0+aWQpIHsKKwkJICAgIHByaW50ayAoInNjc2klZCA6IFNESUQgdGFyZ2V0ICVkICE9IERTQSB0YXJnZXQgJWQgYXQgJXNcbiIsCisJCQlob3N0LT5ob3N0X25vLCBzZGlkLCBjLT5kZXZpY2UtPmlkLCB3aGVyZSk7CisJCSAgICBwcmludF9sb3RzKGhvc3QpOworCQkgICAgZHVtcF9ldmVudHMgKGhvc3QsIDIwKTsKKwkJICAgIHJldHVybiBTUEVDSUZJQ19JTlRfUEFOSUM7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorCWlmICgoZHNwcyAmIDB4ZmYwMDAwMDApID09IDB4MDMwMDAwMDApIHsKKwkgICAgIHByaW50ayAoInNjc2klZCA6IG1pc2MgZGVidWcgaW50ZXJydXB0IDB4JXhcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGRzcHMpOworCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisJfSBlbHNlIGlmICgoZHNwcyAmIDB4ZmYwMDAwMDApID09IDB4MDUwMDAwMDApIHsKKwkgICAgaWYgKGhvc3RkYXRhLT5ldmVudHMpIHsKKwkJc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqZXZlbnQ7CisJCSsraG9zdGRhdGEtPmV2ZW50X2luZGV4OworCQlpZiAoaG9zdGRhdGEtPmV2ZW50X2luZGV4ID49IGhvc3RkYXRhLT5ldmVudF9zaXplKQorCQkgICAgaG9zdGRhdGEtPmV2ZW50X2luZGV4ID0gMDsKKwkJZXZlbnQgPSAoc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqKSBob3N0ZGF0YS0+ZXZlbnRzICsgCisJCSAgICBob3N0ZGF0YS0+ZXZlbnRfaW5kZXg7CisJCWV2ZW50LT5ldmVudCA9IChlbnVtIG5jcl9ldmVudCkgZHNwczsKKwkJZXZlbnQtPmRzYSA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpOworCQlpZiAoTkNSNTNjN3gwX3JlYWQ4IChTQ05UTDFfUkVHKSAmIFNDTlRMMV9DT04pIHsKKwkJICAgIGlmIChob3N0ZGF0YS0+Y2hpcCAvIDEwMCA9PSA4KQorCQkJZXZlbnQtPnRhcmdldCA9IE5DUjUzYzd4MF9yZWFkOChTU0lEX1JFR184MDApOworCQkgICAgZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyIHRtcCwgc2RpZDsKKwkJICAgICAgICB0bXAgPSBOQ1I1M2M3eDBfcmVhZDggKFNESURfUkVHXzcwMCk7CisJCSAgICAgICAgaWYgKCF0bXApCisJCQkgICAgcGFuaWMgKCJTRElEX1JFR183MDAgPSAwIik7CisJCSAgICAgICAgdG1wID4+PSAxOworCQkgICAgICAgIHNkaWQgPSAwOworCQkgICAgICAgIHdoaWxlICh0bXApIHsKKwkJCSAgICB0bXAgPj49IDE7CisJCQkgICAgc2RpZCsrOworCQkgICAgICAgIH0KKwkJCWV2ZW50LT50YXJnZXQgPSBzZGlkOworCQkgICAgfQorCQl9CisJCWVsc2UgCisJCQlldmVudC0+dGFyZ2V0ID0gMjU1OworCisJCWlmIChldmVudC0+ZXZlbnQgPT0gRVZFTlRfUkVTRUxFQ1QpCisJCSAgICBldmVudC0+bHVuID0gaG9zdGRhdGEtPnJlc2VsZWN0ZWRfaWRlbnRpZnkgJiAweGY7CisJCWVsc2UgaWYgKGMpCisJCSAgICBldmVudC0+bHVuID0gYy0+ZGV2aWNlLT5sdW47CisJCWVsc2UKKwkJICAgIGV2ZW50LT5sdW4gPSAyNTU7CisJCWRvX2dldHRpbWVvZmRheSgmKGV2ZW50LT50aW1lKSk7CisJCWlmIChjKSB7CisJCSAgICBldmVudC0+cGlkID0gYy0+cGlkOworCQkgICAgbWVtY3B5ICgodm9pZCAqKSBldmVudC0+Y21uZCwgKHZvaWQgKikgYy0+Y21uZCwgCisJCQlzaXplb2YgKGV2ZW50LT5jbW5kKSk7CisJCX0gZWxzZSB7CisJCSAgICBldmVudC0+cGlkID0gLTE7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gU1BFQ0lGSUNfSU5UX1JFU1RBUlQ7CisJfQorCisJcHJpbnRrICgic2NzaSVkIDogdW5rbm93biB1c2VyIGludGVycnVwdCAweCV4XG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgKHVuc2lnbmVkKSBkc3BzKTsKKwlyZXR1cm4gU1BFQ0lGSUNfSU5UX1BBTklDOworICAgIH0KK30KKworLyogCisgKiBYWFggLSB0aGUgc3RvY2sgTkNSIGFzc2VtYmxlciB3b24ndCBvdXRwdXQgdGhlIHNjcmlwdHUuaCBmaWxlLAorICogd2hpY2ggdW5kZWZpbmUncyBhbGwgI2RlZmluZSdkIENQUCBzeW1ib2xzIGZyb20gdGhlIHNjcmlwdC5oCisgKiBmaWxlLCB3aGljaCB3aWxsIGNyZWF0ZSBwcm9ibGVtcyBpZiB5b3UgdXNlIG11bHRpcGxlIHNjcmlwdHMKKyAqIHdpdGggdGhlIHNhbWUgIHN5bWJvbCBuYW1lcy4KKyAqCisgKiBJZiB5b3UgaW5zaXN0IG9uIHVzaW5nIE5DUidzIGFzc2VtYmxlciwgeW91IGNvdWxkIGdlbmVyYXRlCisgKiBzY3JpcHR1LmggZnJvbSBzY3JpcHQuaCB1c2luZyBzb21ldGhpbmcgbGlrZSAKKyAqCisgKiBncmVwICNkZWZpbmUgc2NyaXB0LmggfCBcCisgKiBzZWQgJ3MvI2RlZmluZVsgCV1bIAldKlwoW19hLXpBLVpdW19hLXpBLVowLTldKlwpLiokLyN1bmRlZmluZSBcMS8nIFwKKyAqID4gc2NyaXB0dS5oCisgKi8KKworI2luY2x1ZGUgIjUzYzd4eF91LmgiCisKKy8qIFhYWCAtIGFkZCBhbHRlcm5hdGUgc2NyaXB0IGhhbmRsaW5nIGNvZGUgaGVyZSAqLworCisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBOQ1I1Mzd4eF9zb2Z0X3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiAgcGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIE5DUjUzYzd4eCBjaGlwCisgKgorICogSW5wdXRzIDogaG9zdCAtIHBvaW50ZXIgdG8gdGhpcyBob3N0IGFkYXB0ZXIncyBzdHJ1Y3R1cmUKKyAqCisgKiBQcmVjb25kaXRpb25zIDogTkNSNTNjN3gwX2luaXQgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIAorICogICAgICBob3N0LgorICogCisgKi8KKworc3RhdGljIHZvaWQgCitOQ1I1M2M3eDBfc29mdF9yZXNldCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisgICAgLyogRGlzYWJsZSBzY3NpIGNoaXAgYW5kIHMvdyBsZXZlbCA3IGludHMgKi8KKworI2lmZGVmIENPTkZJR19NVk1FMTZ4CisgICAgaWYgKE1BQ0hfSVNfTVZNRTE2eCkKKyAgICB7CisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdjsKKworICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHhmZmY0MDA2YzsKKyAgICAgICAgdiAmPSB+MHg4MDAwOworICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikweGZmZjQwMDZjID0gdjsKKyAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDIwMmM7CisgICAgICAgIHYgJj0gfjB4MTA7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDIwMmMgPSB2OworICAgIH0KKyNlbmRpZgorICAgIC8qIEFueXRoaW5nIHNwZWNpZmljIGZvciB5b3VyIGhhcmR3YXJlPyAqLworCisgICAgLyoKKyAgICAgKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIGNoaXAgc28gdGhhdCBldmVyeXRoaW5nIGlzIAorICAgICAqIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIHBvd2VyLW9uIHN0YXRlLgorICAgICAqCisgICAgICogQmFzaWNhbGx5IGZvbGxvdyB0aGUgcHJvY2VkdXJlIG91dGxpbmVkIGluIHRoZSBOQ1I1M2M3MDAKKyAgICAgKiBkYXRhIG1hbnVhbCB1bmRlciBDaGFwdGVyIFNpeCwgSG93IHRvIFVzZSwgU3RlcHMgTmVjZXNzYXJ5IHRvCisgICAgICogU3RhcnQgU0NSSVBUUywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFjdHVhbGx5IHN0YXJ0aW5nIHRoZSAKKyAgICAgKiBzY3JpcHQgYW5kIHNldHRpbmcgdXAgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIGd1bmsuCisgICAgICovCisKKyAgICAvKiBTaG91bGQgd2UgcmVzZXQgdGhlIHNjc2kgYnVzIGhlcmU/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ICovCisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KElTVEFUX1JFR183MDAsIElTVEFUXzEwX1NSU1QpOworICAgIE5DUjUzYzd4MF93cml0ZTgoSVNUQVRfUkVHXzcwMCwgMCk7CisKKyAgICAvKgorICAgICAqIHNhdmVkX2RjbnRsIGlzIHNldCB1cCBpbiBOQ1I1M2M3eDBfaW5pdCgpIGJlZm9yZSBpdCBpcyBvdmVyd3JpdHRlbgorICAgICAqIGhlcmUuICBXZSBzaG91bGQgaGF2ZSBzb21lIGJldHRlciB3YXkgb2Ygd29ya2luZyBvdXQgdGhlIENGIGJpdAorICAgICAqIHNldHRpbmcuLgorICAgICAqLworCisgICAgaG9zdGRhdGEtPnNhdmVkX2RjbnRsID0gRENOVExfMTBfRUF8RENOVExfMTBfQ09NOworICAgIGlmIChob3N0ZGF0YS0+c2NzaV9jbG9jayA+IDUwMDAwMDAwKQorCWhvc3RkYXRhLT5zYXZlZF9kY250bCB8PSBEQ05UTF83MDBfQ0ZfMzsKKyAgICBlbHNlCisgICAgaWYgKGhvc3RkYXRhLT5zY3NpX2Nsb2NrID4gMzc1MDAwMDApCisgICAgICAgIGhvc3RkYXRhLT5zYXZlZF9kY250bCB8PSBEQ05UTF83MDBfQ0ZfMjsKKyNpZiAwCisgICAgZWxzZQorCS8qIEFueSBjbG9ja3MgbGVzcyB0aGFuIDM3LjVNSHo/ICovCisjZW5kaWYKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19UUkFDRSkKKyAgICAJTkNSNTNjN3gwX3dyaXRlOChEQ05UTF9SRUcsIGhvc3RkYXRhLT5zYXZlZF9kY250bCB8IERDTlRMX1NTTSk7CisgICAgZWxzZQorICAgIAlOQ1I1M2M3eDBfd3JpdGU4KERDTlRMX1JFRywgaG9zdGRhdGEtPnNhdmVkX2RjbnRsKTsKKyAgICAvKiBGb2xsb3dpbmcgZGlzYWJsZXMgc25vb3BpbmcgLSBzbm9vcGluZyBpcyBub3QgcmVxdWlyZWQsIGFzIG5vbi0KKyAgICAgKiBjYWNoZWQgcGFnZXMgYXJlIHVzZWQgZm9yIHNoYXJlZCBkYXRhLCBhbmQgYXBwcm9wcmlhdGUgdXNlIGlzCisgICAgICogbWFkZSBvZiBjYWNoZV9wdXNoL2NhY2hlX2NsZWFyLiAgSW5kZWVkLCBmb3IgNjgwNjAKKyAgICAgKiBlbmFibGluZyBzbm9vcGluZyBjYXVzZXMgZGlzayBjb3JydXB0aW9uIG9mIGV4dDJmcyBmcmVlIGJsb2NrCisgICAgICogYml0bWFwcyBhbmQgdGhlIGxpa2UuICBJZiB5b3UgaGF2ZSBhIDY4MDYwIHdpdGggc25vb3BpbmcgaGFyZHdhcmVkCisgICAgICogb24sIHRoZW4geW91IG5lZWQgdG8gZW5hYmxlIENPTkZJR18wNjBfV1JJVEVUSFJPVUdILgorICAgICAqLworICAgIE5DUjUzYzd4MF93cml0ZTgoQ1RFU1Q3X1JFRywgQ1RFU1Q3XzEwX1RUMXxDVEVTVDdfU1REKTsKKyAgICAvKiBBY3R1YWxseSBidXJzdCBvZiBlaWdodCwgYWNjb3JkaW5nIHRvIG15IDUzYzcxMCBkYXRhYm9vayAqLworICAgIE5DUjUzYzd4MF93cml0ZTgoaG9zdGRhdGEtPmRtb2RlLCBETU9ERV8xMF9CTF84IHwgRE1PREVfMTBfRkMyKTsKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KFNDSURfUkVHLCAxIDw8IGhvc3QtPnRoaXNfaWQpOworICAgIE5DUjUzYzd4MF93cml0ZTgoU0JDTF9SRUcsIDApOworICAgIE5DUjUzYzd4MF93cml0ZTgoU0NOVEwxX1JFRywgU0NOVEwxX0VTUl83MDApOworICAgIE5DUjUzYzd4MF93cml0ZTgoU0NOVEwwX1JFRywgKChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9QQVJJVFkpID8gCisgICAgICAgICAgICBTQ05UTDBfRVBDIDogMCkgfCBTQ05UTDBfRVBHXzcwMCB8IFNDTlRMMF9BUkIxIHwgU0NOVEwwX0FSQjIpOworCisgICAgLyoKKyAgICAgKiBFbmFibGUgYWxsIGludGVycnVwdHMsIGV4Y2VwdCBwYXJpdHkgd2hpY2ggd2Ugb25seSB3YW50IHdoZW4KKyAgICAgKiB0aGUgdXNlciByZXF1ZXN0cyBpdC4KKyAgICAgKi8KKworICAgIE5DUjUzYzd4MF93cml0ZTgoRElFTl9SRUcsIERJRU5fNzAwX0JGIHwKKwkJRElFTl9BQlJUIHwgRElFTl9TU0kgfCBESUVOX1NJUiB8IERJRU5fNzAwX09QQyk7CisKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KFNJRU5fUkVHXzcwMCwgKChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9QQVJJVFkpID8KKwkgICAgU0lFTl9QQVIgOiAwKSB8IFNJRU5fNzAwX1NUTyB8IFNJRU5fUlNUIHwgU0lFTl9VREMgfAorCQlTSUVOX1NHRSB8IFNJRU5fTUEpOworCisjaWZkZWYgQ09ORklHX01WTUUxNngKKyAgICBpZiAoTUFDSF9JU19NVk1FMTZ4KQorICAgIHsKKyAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB2OworCisgICAgICAgIC8qIEVuYWJsZSBzY3NpIGNoaXAgYW5kIHMvdyBsZXZlbCA3IGludHMgKi8KKyAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDAwODA7CisgICAgICAgIHYgPSAodiAmIH4oMHhmIDw8IDI4KSkgfCAoNCA8PCAyOCk7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDAwODAgPSB2OworICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHhmZmY0MDA2YzsKKyAgICAgICAgdiB8PSAweDgwMDA7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDAwNmMgPSB2OworICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHhmZmY0MjAyYzsKKyAgICAgICAgdiA9ICh2ICYgfjB4ZmYpIHwgMHgxMCB8IDQ7CisgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4ZmZmNDIwMmMgPSB2OworICAgIH0KKyNlbmRpZgorICAgIC8qIEFueXRoaW5nIG5lZWRlZCBmb3IgeW91ciBoYXJkd2FyZT8gKi8KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRpYyBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqYWxsb2NhdGVfY21kIChTY3NpX0NtbmQgKmNtZCkKKyAqIAorICogUHVycG9zZSA6IFJldHVybiB0aGUgZmlyc3QgZnJlZSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSAod2hpY2ggYXJlIAorICogCXJldXNlZCBpbiBhIExJRk8gbWFubmVyIHRvIG1pbmltaXplIGNhY2hlIHRocmFzaGluZykuCisgKgorICogU2lkZSBlZmZlY3RzIDogSWYgd2UgaGF2ZW4ndCB5ZXQgc2NoZWR1bGVkIGFsbG9jYXRpb24gb2YgTkNSNTNjN3gwX2NtZAorICoJc3RydWN0dXJlcyBmb3IgdGhpcyBkZXZpY2UsIGRvIHNvLiAgQXR0ZW1wdCB0byBjb21wbGV0ZSBhbGwgc2NoZWR1bGVkCisgKglhbGxvY2F0aW9ucyB1c2luZyBnZXRfemVyb2VkX3BhZ2UoKSwgcHV0dGluZyBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZXMgb24KKyAqCXRoZSBmcmVlIGxpc3QuICBUZWFjaCBwcm9ncmFtbWVycyBub3QgdG8gZHJpbmsgYW5kIGhhY2suCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kCisgKgorICogUmV0dXJucyA6IE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlIGFsbG9jYXRlZCBvbiBiZWhhbGYgb2YgY21kOworICoJTlVMTCBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyB2b2lkCitteV9mcmVlX3BhZ2UgKHZvaWQgKmFkZHIsIGludCBkdW1teSkKK3sKKyAgICAvKiBYWFggVGhpcyBhc3N1bWVzIGRlZmF1bHQgY2FjaGUgbW9kZSB0byBiZSBJT01BUF9GVUxMX0NBQ0hJTkcsIHdoaWNoCisgICAgICogWFhYIG1heSBiZSBpbnZhbGlkIChDT05GSUdfMDYwX1dSSVRFVEhST1VHSCkKKyAgICAgKi8KKyAgICBrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKWFkZHIsIDQwOTYsIElPTUFQX0ZVTExfQ0FDSElORyk7CisgICAgZnJlZV9wYWdlICgodTMyKWFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IE5DUjUzYzd4MF9jbWQgKgorYWxsb2NhdGVfY21kIChTY3NpX0NtbmQgKmNtZCkgeworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IAorCShzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIHUzMiByZWFsOwkJCS8qIFJlYWwgYWRkcmVzcyAqLworICAgIGludCBzaXplOwkJCS8qIFNpemUgb2YgKnRtcCAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICp0bXA7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19BTExPQ0FUSU9OKQorCXByaW50ayAoInNjc2klZCA6IG51bV9jbWRzID0gJWQsIGNhbl9xdWV1ZSA9ICVkXG4iCisJCSIgICAgICAgICB0YXJnZXQgPSAlZCwgbHVuID0gJWQsICVzXG4iLAorCSAgICBob3N0LT5ob3N0X25vLCBob3N0ZGF0YS0+bnVtX2NtZHMsIGhvc3QtPmNhbl9xdWV1ZSwKKwkgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCAoaG9zdGRhdGEtPmNtZF9hbGxvY2F0ZWRbY21kLT5kZXZpY2UtPmlkXSAmCisJCSgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKSA/ICJhbHJlYWR5IGFsbG9jYXRlZCIgOiAibm90IGFsbG9jYXRlZCIpOworCisvKgorICogSWYgd2UgaGF2ZSBub3QgeWV0IHJlc2VydmVkIGNvbW1hbmRzIGZvciB0aGlzIElfVF9MIG5leHVzLCBhbmQKKyAqIHRoZSBkZXZpY2UgZXhpc3RzIChhcyBpbmRpY2F0ZWQgYnkgcGVybWFuZW50IFNjc2lfQ21uZCBzdHJ1Y3R1cmVzCisgKiBiZWluZyBhbGxvY2F0ZWQgdW5kZXIgMS4zLngsIG9yIGJlaW5nIG91dHNpZGUgb2Ygc2Nhbl9zY3NpcyBpbgorICogMS4yLngpLCBkbyBzbyBub3cuCisgKi8KKyAgICBpZiAoIShob3N0ZGF0YS0+Y21kX2FsbG9jYXRlZFtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpICYmCisJCQkJY21kLT5kZXZpY2UgJiYgY21kLT5kZXZpY2UtPmhhc19jbWRibG9ja3MpIHsKKyAgICAgIGlmICgoaG9zdGRhdGEtPmV4dHJhX2FsbG9jYXRlICsgaG9zdGRhdGEtPm51bV9jbWRzKSA8IGhvc3QtPmNhbl9xdWV1ZSkKKyAgICAgICAgICBob3N0ZGF0YS0+ZXh0cmFfYWxsb2NhdGUgKz0gaG9zdC0+Y21kX3Blcl9sdW47CisgICAgICBob3N0ZGF0YS0+Y21kX2FsbG9jYXRlZFtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworICAgIH0KKworICAgIGZvciAoOyBob3N0ZGF0YS0+ZXh0cmFfYWxsb2NhdGUgPiAwIDsgLS1ob3N0ZGF0YS0+ZXh0cmFfYWxsb2NhdGUsIAorICAgIAkrK2hvc3RkYXRhLT5udW1fY21kcykgeworICAgIC8qIGhpc3RvcmljYWxseSwga21hbGxvYyBoYXMgcmV0dXJuZWQgdW5hbGlnbmVkIGFkZHJlc3NlczsgcGFkIHNvIHdlCisgICAgICAgaGF2ZSBlbm91Z2ggcm9vbSB0byBST1VORFVQICovCisJc2l6ZSA9IGhvc3RkYXRhLT5tYXhfY21kX3NpemUgKyBzaXplb2YgKHZvaWQgKik7CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorCS8qCisJICogNTNjNzEwIHJldi4wIGRvZXNuJ3QgaGF2ZSBhbiBhZGQtd2l0aC1jYXJyeSBpbnN0cnVjdGlvbi4KKwkgKiBFbnN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBmb3JjZSBhbGlnbm1lbnQuCisJICovCisJc2l6ZSArPSAyNTY7CisjZW5kaWYKKy8qIEZJWE1FOiBmb3IgSVNBIGJ1cyAnN3h4IGNoaXBzLCB3ZSBuZWVkIHRvIG9yIEdGUF9ETUEgaW4gaGVyZSAqLworCisgICAgICAgIGlmIChzaXplID4gNDA5NikgeworICAgICAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAiNTNjN3h4OiBhbGxvY2F0ZV9jbWQgc2l6ZSA+IDRLXG4iKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgICByZWFsID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworICAgICAgICBpZiAocmVhbCA9PSAwKQorICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbXNldCgodm9pZCAqKXJlYWwsIDAsIDQwOTYpOworICAgICAgICBjYWNoZV9wdXNoKHZpcnRfdG9fcGh5cygodm9pZCAqKXJlYWwpLCA0MDk2KTsKKyAgICAgICAgY2FjaGVfY2xlYXIodmlydF90b19waHlzKCh2b2lkICopcmVhbCksIDQwOTYpOworICAgICAgICBrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKXJlYWwsIDQwOTYsIElPTUFQX05PQ0FDSEVfU0VSKTsKKwl0bXAgPSBST1VORFVQKHJlYWwsIHZvaWQgKik7CisjaWZkZWYgRk9SQ0VfRFNBX0FMSUdOTUVOVAorCXsKKwkgICAgaWYgKCgodTMyKXRtcCAmIDB4ZmYpID4gQ21kUGFnZVN0YXJ0KQorCQl0bXAgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikoKHUzMil0bXAgKyAyNTUpOworCSAgICB0bXAgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikoKCh1MzIpdG1wICYgfjB4ZmYpICsgQ21kUGFnZVN0YXJ0KTsKKyNpZiAwCisJICAgIHByaW50ayAoInNjc2k6IHNpemUgPSAlZCwgcmVhbCA9IDB4JTA4eCwgdG1wIHNldCB0byAweCUwOHhcbiIsCisJCQlzaXplLCByZWFsLCAodTMyKXRtcCk7CisjZW5kaWYKKwl9CisjZW5kaWYKKwl0bXAtPnJlYWwgPSAodm9pZCAqKXJlYWw7CisJdG1wLT5zaXplID0gc2l6ZTsJCQkKKwl0bXAtPmZyZWUgPSAoKHZvaWQgKCopKHZvaWQgKiwgaW50KSkgbXlfZnJlZV9wYWdlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdG1wLT5uZXh0ID0gaG9zdGRhdGEtPmZyZWU7CisJaG9zdGRhdGEtPmZyZWUgPSB0bXA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIH0KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgdG1wID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGhvc3RkYXRhLT5mcmVlOworICAgIGlmICh0bXApIHsKKwlob3N0ZGF0YS0+ZnJlZSA9IHRtcC0+bmV4dDsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIGlmICghdG1wKQorCXByaW50ayAoInNjc2klZCA6IGNhbid0IGFsbG9jYXRlIGNvbW1hbmQgZm9yIHRhcmdldCAlZCBsdW4gJWRcbiIsCisJICAgIGhvc3QtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisgICAgcmV0dXJuIHRtcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRpYyBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY3JlYXRlX2NtZCAoU2NzaV9DbW5kICpjbWQpIAorICoKKyAqCisgKiBQdXJwb3NlIDogYWxsb2NhdGUgYSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSwgaW5pdGlhbGl6ZSBpdCBiYXNlZCBvbiB0aGUgCisgKiAJU2NzaV9DbW5kIHN0cnVjdHVyZSBwYXNzZWQgaW4gY21kLCBpbmNsdWRpbmcgZHNhIGFuZCBMaW51eCBmaWVsZCAKKyAqIAlpbml0aWFsaXphdGlvbiwgYW5kIGRzYSBjb2RlIHJlbG9jYXRpb24uCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kCisgKgorICogUmV0dXJucyA6IE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gY21kLAorICoJTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IE5DUjUzYzd4MF9jbWQgKgorY3JlYXRlX2NtZCAoU2NzaV9DbW5kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisgICAgICAgIGhvc3QtPmhvc3RkYXRhWzBdOwkKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqdG1wOyAJLyogTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgZm9yIHRoaXMgY29tbWFuZCAqLworICAgIGludCBkYXRhaW4sICAJCS8qIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgcGVyIHBoYXNlICovCisJZGF0YW91dDsKKyAgICBpbnQgZGF0YV90cmFuc2Zlcl9pbnN0cnVjdGlvbnMsIC8qIENvdW50IG9mIGR5bmFtaWMgaW5zdHJ1Y3Rpb25zICovCisgICAgCWk7CQkJLyogQ291bnRlciAqLworICAgIHUzMiAqY21kX2RhdGFpbiwJCS8qIEFkZHJlc3Mgb2YgZGF0YWluL2RhdGFvdXQgY29kZSAqLworCSpjbWRfZGF0YW91dDsJCS8qIEluY3JlbWVudGVkIGFzIHdlIGFzc2VtYmxlICovCisjaWZkZWYgbm90eWV0CisgICAgdW5zaWduZWQgY2hhciAqbXNncHRyOwkvKiBDdXJyZW50IGJ5dGUgaW4gc2VsZWN0IG1lc3NhZ2UgKi8KKyAgICBpbnQgbXNnbGVuOwkJCS8qIExlbmd0aCBvZiB3aG9sZSBzZWxlY3QgbWVzc2FnZSAqLworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1MzIgZXhwX3NlbGVjdF9pbmRpcmVjdDsJLyogVXNlZCBpbiBzYW5pdHkgY2hlY2sgKi8KKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoY21kLT5kZXZpY2UtPmhvc3QpOworCisgICAgaWYgKCEodG1wID0gYWxsb2NhdGVfY21kIChjbWQpKSkKKwlyZXR1cm4gTlVMTDsKKworICAgIC8qCisgICAgICogQ29weSBDREIgYW5kIGluaXRpYWxpc2VkIHJlc3VsdCBmaWVsZHMgZnJvbSBTY3NpX0NtbmQgdG8gTkNSNTNjN3gwX2NtZC4KKyAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgTkNSNTNjN3gwX2NtZCBtYXkgaGF2ZSBhIHNwZWNpYWwgY2FjaGUgbW9kZQorICAgICAqIHNlbGVjdGVkIHRvIGNvcGUgd2l0aCBsYWNrIG9mIGJ1cyBzbm9vcGluZywgZXRjLgorICAgICAqLworCisgICAgbWVtY3B5KHRtcC0+Y21uZCwgY21kLT5jbW5kLCAxMik7CisgICAgdG1wLT5yZXN1bHQgPSBjbWQtPnJlc3VsdDsKKworICAgIC8qCisgICAgICogRGVjaWRlIHdoZXRoZXIgd2UgbmVlZCB0byBnZW5lcmF0ZSBjb21tYW5kcyBmb3IgREFUQSBJTiwKKyAgICAgKiBEQVRBIE9VVCwgbmVpdGhlciwgb3IgYm90aCBiYXNlZCBvbiB0aGUgU0NTSSBjb21tYW5kIAorICAgICAqLworCisgICAgc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKyAgICAvKiBUaGVzZSBjb21tYW5kcyBkbyBEQVRBIElOICovCisgICAgY2FzZSBJTlFVSVJZOgorICAgIGNhc2UgTU9ERV9TRU5TRToKKyAgICBjYXNlIFJFQURfNjoKKyAgICBjYXNlIFJFQURfMTA6CisgICAgY2FzZSBSRUFEX0NBUEFDSVRZOgorICAgIGNhc2UgUkVRVUVTVF9TRU5TRToKKyAgICBjYXNlIFJFQURfQkxPQ0tfTElNSVRTOgorICAgIGNhc2UgUkVBRF9UT0M6CisJZGF0YWluID0gMiAqIChjbWQtPnVzZV9zZyA/IGNtZC0+dXNlX3NnIDogMSkgKyAzOworICAgIAlkYXRhb3V0ID0gMDsKKwlicmVhazsKKyAgICAvKiBUaGVzZSBjb21tYW5kcyBkbyBEQVRBIE9VVCAqLworICAgIGNhc2UgTU9ERV9TRUxFQ1Q6IAorICAgIGNhc2UgV1JJVEVfNjoKKyAgICBjYXNlIFdSSVRFXzEwOgorI2lmIDAKKwlwcmludGsoInNjc2klZCA6IGNvbW1hbmQgaXMgIiwgaG9zdC0+aG9zdF9ubyk7CisJcHJpbnRfY29tbWFuZChjbWQtPmNtbmQpOworI2VuZGlmCisjaWYgMAorCXByaW50ayAoInNjc2klZCA6ICVkIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBjbWQtPnVzZV9zZyk7CisjZW5kaWYKKyAgICAJZGF0YWluID0gMDsKKwlkYXRhb3V0ID0gMiAqIChjbWQtPnVzZV9zZyA/IGNtZC0+dXNlX3NnIDogMSkgKyAzOworI2lmIDAKKwlob3N0ZGF0YS0+b3B0aW9ucyB8PSBPUFRJT05fREVCVUdfSU5UUjsKKyNlbmRpZgorCWJyZWFrOworICAgIC8qIAorICAgICAqIFRoZXNlIGNvbW1hbmRzIGRvIG5vIGRhdGEgdHJhbnNmZXIsIHdlIHNob3VsZCBmb3JjZSBhbgorICAgICAqIGludGVycnVwdCBpZiBhIGRhdGEgcGhhc2UgaXMgYXR0ZW1wdGVkIG9uIHRoZW0uCisgICAgICovCisgICAgY2FzZSBURVNUX1VOSVRfUkVBRFk6CisgICAgY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKKyAgICBjYXNlIFNUQVJUX1NUT1A6CisgICAgCWRhdGFpbiA9IGRhdGFvdXQgPSAwOworCWJyZWFrOworICAgIC8qCisgICAgICogV2UgZG9uJ3Qga25vdyBhYm91dCB0aGVzZSBjb21tYW5kcywgc28gZ2VuZXJhdGUgY29kZSB0byBoYW5kbGUKKyAgICAgKiBib3RoIERBVEEgSU4gYW5kIERBVEEgT1VUIHBoYXNlcy4gIE1vcmUgZWZmaWNpZW50IHRvIGlkZW50aWZ5IHRoZW0KKyAgICAgKiBhbmQgYWRkIHRoZW0gdG8gdGhlIGFib3ZlIGNhc2VzLgorICAgICAqLworICAgIGRlZmF1bHQ6CisJcHJpbnRrKCJzY3NpJWQgOiBkYXRhaW4rZGF0YW91dCBmb3IgY29tbWFuZCAiLCBob3N0LT5ob3N0X25vKTsKKwlwcmludF9jb21tYW5kKGNtZC0+Y21uZCk7CisJZGF0YWluID0gZGF0YW91dCA9IDIgKiAoY21kLT51c2Vfc2cgPyBjbWQtPnVzZV9zZyA6IDEpICsgMzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5ldyBjb2RlIDogc28gdGhhdCBhY3RpdmUgcG9pbnRlcnMgd29yayBjb3JyZWN0bHkgcmVnYXJkbGVzcworICAgICAqIAlvZiB3aGVyZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVyIGlzIGF0LCB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5CisgICAgICogCWVudGVyIHRoZSBkeW5hbWljIGNvZGUgYWZ0ZXIgc2VsZWN0aW9uLCBhbmQgb24gYSBub24tZGF0YQorICAgICAqIAlwaGFzZSBwZXJmb3JtIGEgQ0FMTCB0byB0aGUgbm9uLWRhdGEgcGhhc2UgaGFuZGxlciwgd2l0aAorICAgICAqIAlyZXR1cm5zIGJhY2sgdG8gdGhpcyBhZGRyZXNzLgorICAgICAqCisgICAgICogCUlmIGEgcGhhc2UgbWlzbWF0Y2ggaXMgZW5jb3VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiBhIAorICAgICAqIAlCbG9jayBNT1ZFIGluc3RydWN0aW9uLCB3ZSB3YW50IHRvIF9sZWF2ZV8gdGhhdCBpbnN0cnVjdGlvbgorICAgICAqCXVuY2hhbmdlZCBhcyB0aGUgY3VycmVudCBjYXNlIGlzLCBtb2RpZnkgYSB0ZW1wb3JhcnkgYnVmZmVyLAorICAgICAqCWFuZCBwb2ludCB0aGUgYWN0aXZlIHBvaW50ZXIgKFRFTVApIGF0IHRoYXQuCisgICAgICoKKyAgICAgKiAJRnVydGhlcm1vcmUsIHdlIHdhbnQgdG8gaW1wbGVtZW50IGEgc2F2ZWQgZGF0YSBwb2ludGVyLCAKKyAgICAgKiAJc2V0IGJ5IHRoZSBTQVZFX0RBVEFfUE9JTlRFUnMgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIAlTbywgdGhlIGRhdGEgdHJhbnNmZXIgc2VnbWVudHMgd2lsbCBjaGFuZ2UgdG8gCisgICAgICoJCUNBTEwgZGF0YV90cmFuc2ZlciwgV0hFTiBOT1QgZGF0YSBwaGFzZQorICAgICAqCQlNT1ZFIHgsIHgsIFdIRU4gZGF0YSBwaGFzZQorICAgICAqCQkoIHJlcGVhdCApCisgICAgICoJCUpVTVAgb3RoZXJfdHJhbnNmZXIKKyAgICAgKi8KKworICAgIGRhdGFfdHJhbnNmZXJfaW5zdHJ1Y3Rpb25zID0gZGF0YWluICsgZGF0YW91dDsKKworICAgIC8qCisgICAgICogV2hlbiB3ZSBwZXJmb3JtIGEgcmVxdWVzdCBzZW5zZSwgd2Ugb3ZlcndyaXRlIHZhcmlvdXMgdGhpbmdzLAorICAgICAqIGluY2x1ZGluZyB0aGUgZGF0YSB0cmFuc2ZlciBjb2RlLiAgTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoCisgICAgICogc3BhY2UgdG8gZG8gdGhhdC4KKyAgICAgKi8KKworICAgIGlmIChkYXRhX3RyYW5zZmVyX2luc3RydWN0aW9ucyA8IDIpCisgICAgCWRhdGFfdHJhbnNmZXJfaW5zdHJ1Y3Rpb25zID0gMjsKKworCisgICAgLyoKKyAgICAgKiBUaGUgc2F2ZWQgZGF0YSBwb2ludGVyIGlzIHNldCB1cCBzbyB0aGF0IGEgUkVTVE9SRSBQT0lOVEVSUyBtZXNzYWdlIAorICAgICAqIHdpbGwgc3RhcnQgdGhlIGRhdGEgdHJhbnNmZXIgb3ZlciBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAqLworCisgICAgdG1wLT5zYXZlZF9kYXRhX3BvaW50ZXIgPSB2aXJ0X3RvX2J1cyAoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKwlob3N0ZGF0YS0+RV9kYXRhX3RyYW5zZmVyOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIExpbnV4IHNwZWNpZmljIGZpZWxkcy4KKyAgICAgKi8KKworICAgIHRtcC0+Y21kID0gY21kOworICAgIHRtcC0+bmV4dCA9IE5VTEw7CisgICAgdG1wLT5mbGFncyA9IDA7CisgICAgdG1wLT5kc2FfbmV4dF9hZGRyID0gdmlydF90b19idXModG1wLT5kc2EpICsgaG9zdGRhdGEtPmRzYV9uZXh0IC0gCisJaG9zdGRhdGEtPmRzYV9zdGFydDsKKyAgICB0bXAtPmRzYV9hZGRyID0gdmlydF90b19idXModG1wLT5kc2EpIC0gaG9zdGRhdGEtPmRzYV9zdGFydDsKKworICAgIC8qIAorICAgICAqIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgZHluYW1pYyBjb2RlIHRvIGZpbGwgaW4gRFNBCisgICAgICovCisKKyAgICB0bXAtPmRhdGFfdHJhbnNmZXJfc3RhcnQgPSB0bXAtPmRzYSArIChob3N0ZGF0YS0+ZHNhX2VuZCAtIAorICAgIAlob3N0ZGF0YS0+ZHNhX3N0YXJ0KSAvIHNpemVvZih1MzIpOworICAgIHRtcC0+ZGF0YV90cmFuc2Zlcl9lbmQgPSB0bXAtPmRhdGFfdHJhbnNmZXJfc3RhcnQgKyAKKyAgICAJMiAqIGRhdGFfdHJhbnNmZXJfaW5zdHJ1Y3Rpb25zOworCisgICAgY21kX2RhdGFpbiA9IGRhdGFpbiA/IHRtcC0+ZGF0YV90cmFuc2Zlcl9zdGFydCA6IE5VTEw7CisgICAgY21kX2RhdGFvdXQgPSBkYXRhb3V0ID8gKGRhdGFpbiA/IGNtZF9kYXRhaW4gKyAyICogZGF0YWluIDogdG1wLT4KKyAgICAJZGF0YV90cmFuc2Zlcl9zdGFydCkgOiBOVUxMOworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBOQ1I1M2M3eDBfY21kIHN0cnVjdHVyZSBhcyBmb2xsb3dzCisgICAgICogZHNhLCB3aXRoIGZpeGVkIHVwIERTQSBjb2RlCisgICAgICogZGF0YWluIGNvZGUKKyAgICAgKiBkYXRhb3V0IGNvZGUKKyAgICAgKi8KKworICAgIC8qIENvcHkgdGVtcGxhdGUgY29kZSBpbnRvIGRzYSBhbmQgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IGZpeHVwcyAqLworICAgIGlmIChob3N0ZGF0YS0+ZHNhX2ZpeHVwKQorICAgIAlob3N0ZGF0YS0+ZHNhX2ZpeHVwKHRtcCk7CisKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9uZXh0LCAwLCAwKTsKKyAgICAvKgorICAgICAqIFhYWCBpcyB0aGlzIGdpdmluZyA1M2M3MTAgYWNjZXNzIHRvIHRoZSBTY3NpX0NtbmQgaW4gc29tZSB3YXk/CisgICAgICogRG8gd2UgbmVlZCB0byBjaGFuZ2UgaXQgZm9yIGNhY2hpbmcgcmVhc29ucz8KKyAgICAgKi8KKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9jbW5kLCAwLCB2aXJ0X3RvX2J1cyhjbWQpKTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19TWU5DSFJPTk9VUykgeworCisJZXhwX3NlbGVjdF9pbmRpcmVjdCA9ICgoMSA8PCBjbWQtPmRldmljZS0+aWQpIDw8IDE2KSB8CisJCQkoaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zeGZlcl9zYW5pdHkgPDwgOCk7CisKKwlpZiAoaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zZWxlY3RfaW5kaXJlY3QgIT0KKwkJCQlleHBfc2VsZWN0X2luZGlyZWN0KSB7CisJICAgIHByaW50ayAoInNjc2klZCA6ICBzYW5pdHkgY2hlY2sgZmFpbGVkIHNlbGVjdF9pbmRpcmVjdD0weCV4XG4iLAorCQlob3N0LT5ob3N0X25vLCBob3N0ZGF0YS0+c3luY1tjbWQtPmRldmljZS0+aWRdLnNlbGVjdF9pbmRpcmVjdCk7CisJICAgIEZBVEFMKGhvc3QpOworCisJfQorICAgIH0KKworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX3NlbGVjdCwgMCwKKwkJaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zZWxlY3RfaW5kaXJlY3QpOworCisgICAgLyoKKyAgICAgKiBSaWdodCBub3csIHdlJ2xsIGRvIHRoZSBXSURFIGFuZCBTWU5DSFJPTk9VUyBuZWdvdGlhdGlvbnMgb24KKyAgICAgKiBkaWZmZXJlbnQgY29tbWFuZHM7IGFsdGhvdWdoIGl0IHNob3VsZCBiZSB0cml2aWFsIHRvIGRvIHRoZW0KKyAgICAgKiBib3RoIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICovCisgICAgaWYgKGhvc3RkYXRhLT5pbml0aWF0ZV93ZHRyICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCW1lbWNweSAoKHZvaWQgKikgKHRtcC0+c2VsZWN0ICsgMSksICh2b2lkICopIHdkdHJfbWVzc2FnZSwKKwkgICAgc2l6ZW9mKHdkdHJfbWVzc2FnZSkpOworICAgIAlwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXQsIDAsIDEgKyBzaXplb2Yod2R0cl9tZXNzYWdlKSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWhvc3RkYXRhLT5pbml0aWF0ZV93ZHRyICY9IH4oMSA8PCBjbWQtPmRldmljZS0+aWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9IGVsc2UgaWYgKGhvc3RkYXRhLT5pbml0aWF0ZV9zZHRyICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCW1lbWNweSAoKHZvaWQgKikgKHRtcC0+c2VsZWN0ICsgMSksICh2b2lkICopIHNkdHJfbWVzc2FnZSwgCisJICAgIHNpemVvZihzZHRyX21lc3NhZ2UpKTsKKyAgICAJcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfbXNnb3V0LCAwLCAxICsgc2l6ZW9mKHNkdHJfbWVzc2FnZSkpOworCXRtcC0+ZmxhZ3MgfD0gQ01EX0ZMQUdfU0RUUjsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaG9zdGRhdGEtPmluaXRpYXRlX3NkdHIgJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5pZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIAorICAgIH0KKyNpZiAxCisgICAgZWxzZSBpZiAoIShob3N0ZGF0YS0+dGFsa2VkX3RvICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgJiYKKwkJIShob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9OT19BU1lOQykpIHsKKworCW1lbWNweSAoKHZvaWQgKikgKHRtcC0+c2VsZWN0ICsgMSksICh2b2lkICopIGFzeW5jX21lc3NhZ2UsIAorCSAgICBzaXplb2YoYXN5bmNfbWVzc2FnZSkpOworICAgIAlwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXQsIDAsIDEgKyBzaXplb2YoYXN5bmNfbWVzc2FnZSkpOworCXRtcC0+ZmxhZ3MgfD0gQ01EX0ZMQUdfU0RUUjsKKyAgICB9IAorI2VuZGlmCisgICAgZWxzZSAKKyAgICAJcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfbXNnb3V0LCAwLCAxKTsKKworICAgIGhvc3RkYXRhLT50YWxrZWRfdG8gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmlkKTsKKyAgICB0bXAtPnNlbGVjdFswXSA9IChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ESVNDT05ORUNUKSA/IAorCUlERU5USUZZICgxLCBjbWQtPmRldmljZS0+bHVuKSA6IElERU5USUZZICgwLCBjbWQtPmRldmljZS0+bHVuKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXQsIDEsIHZpcnRfdG9fYnVzKHRtcC0+c2VsZWN0KSk7CisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfY21kb3V0LCAwLCBjbWQtPmNtZF9sZW4pOworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX2NtZG91dCwgMSwgdmlydF90b19idXModG1wLT5jbW5kKSk7CisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfZGF0YW91dCwgMCwgY21kX2RhdGFvdXQgPyAKKyAgICAJICAgIHZpcnRfdG9fYnVzIChjbWRfZGF0YW91dCkKKwk6IHZpcnRfdG9fYnVzIChob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9kYXRhaW4sIDAsIGNtZF9kYXRhaW4gPyAKKyAgICAJICAgIHZpcnRfdG9fYnVzIChjbWRfZGF0YWluKSAKKwk6IHZpcnRfdG9fYnVzIChob3N0ZGF0YS0+c2NyaXB0KSArIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyKTsKKyAgICAvKiAKKyAgICAgKiBYWFggLSBuZWVkIHRvIG1ha2UgZW5kaWFuIGF3YXJlLCBzaG91bGQgdXNlIHNlcGFyYXRlIHZhcmlhYmxlcworICAgICAqIGZvciBib3RoIHN0YXR1cyBhbmQgbWVzc2FnZSBieXRlcy4KKyAgICAgKi8KKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dpbiwgMCwgMSk7CisvKiAKKyAqIEZJWE1FIDogdGhlc2Ugb25seSB3b3JrcyBmb3IgbGl0dGxlIGVuZGlhbi4gIFdlIHByb2JhYmx5IHdhbnQgdG8gCisgKiAJcHJvdmlkZSBtZXNzYWdlIGFuZCBzdGF0dXMgZmllbGRzIGluIHRoZSBOQ1I1M2M3eDBfY21kIAorICoJc3RydWN0dXJlLCBhbmQgYXNzaWduIHRoZW0gdG8gY21kLT5yZXN1bHQgd2hlbiB3ZSdyZSBkb25lLgorICovCisjaWZkZWYgQklHX0VORElBTgorICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX21zZ2luLCAxLCB2aXJ0X3RvX2J1cygmdG1wLT5yZXN1bHQpICsgMik7CisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2Ffc3RhdHVzLCAwLCAxKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9zdGF0dXMsIDEsIHZpcnRfdG9fYnVzKCZ0bXAtPnJlc3VsdCkgKyAzKTsKKyNlbHNlCisgICAgcGF0Y2hfZHNhXzMyKHRtcC0+ZHNhLCBkc2FfbXNnaW4sIDEsIHZpcnRfdG9fYnVzKCZ0bXAtPnJlc3VsdCkgKyAxKTsKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9zdGF0dXMsIDAsIDEpOworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX3N0YXR1cywgMSwgdmlydF90b19idXMoJnRtcC0+cmVzdWx0KSk7CisjZW5kaWYKKyAgICBwYXRjaF9kc2FfMzIodG1wLT5kc2EsIGRzYV9tc2dvdXRfb3RoZXIsIDAsIDEpOworICAgIHBhdGNoX2RzYV8zMih0bXAtPmRzYSwgZHNhX21zZ291dF9vdGhlciwgMSwgCisJdmlydF90b19idXMoJihob3N0ZGF0YS0+TkNSNTNjN3h4X21zZ19ub3ApKSk7CisgICAgCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBjb2RlIGZvciB6ZXJvIG9yIG1vcmUgb2YgdGhlIERBVEEgSU4sIERBVEEgT1VUIHBoYXNlcyAKKyAgICAgKiBpbiB0aGUgZm9ybWF0IAorICAgICAqCisgICAgICogQ0FMTCBkYXRhX3RyYW5zZmVyLCBXSEVOIE5PVCBwaGFzZQorICAgICAqIE1PVkUgZmlyc3QgYnVmZmVyIGxlbmd0aCwgZmlyc3QgYnVmZmVyIGFkZHJlc3MsIFdIRU4gcGhhc2UKKyAgICAgKiAuLi4KKyAgICAgKiBNT1ZFIGxhc3QgYnVmZmVyIGxlbmd0aCwgbGFzdCBidWZmZXIgYWRkcmVzcywgV0hFTiBwaGFzZQorICAgICAqIEpVTVAgb3RoZXJfdHJhbnNmZXIKKyAgICAgKi8KKworLyogCisgKiBTZWUgaWYgd2UncmUgZ2V0dGluZyB0byBkYXRhIHRyYW5zZmVyIGJ5IGdlbmVyYXRpbmcgYW4gdW5jb25kaXRpb25hbCAKKyAqIGludGVycnVwdC4KKyAqLworI2lmIDAKKyAgICBpZiAoZGF0YWluKSB7CisJY21kX2RhdGFpblswXSA9IDB4OTgwODAwMDA7CisJY21kX2RhdGFpblsxXSA9IDB4MDNmZmQwMGQ7CisJY21kX2RhdGFpbiArPSAyOworICAgIH0KKyNlbmRpZgorCisvKiAKKyAqIFhYWCAtIEknbSB1bmRlY2lkZWQgd2hldGhlciBhbGwgb2YgdGhpcyBub25zZW5zZSBpcyBmYXN0ZXIKKyAqIGluIHRoZSBsb25nIHJ1biwgb3Igd2hldGhlciBJIHNob3VsZCBqdXN0IGdvIGFuZCBpbXBsZW1lbnQgYSBsb29wCisgKiBvbiB0aGUgTkNSIGNoaXAgdXNpbmcgdGFibGUgaW5kaXJlY3QgbW9kZT8KKyAqCisgKiBJbiBhbnkgY2FzZSwgdGhpcyBpcyBob3cgaXQgX211c3RfIGJlIGRvbmUgZm9yIDUzYzcwMC83MDAtNjYgY2hpcHMsCisgKiBzbyB0aGlzIHN0YXlzIGV2ZW4gd2hlbiB3ZSBjb21lIHVwIHdpdGggc29tZXRoaW5nIGJldHRlci4KKyAqCisgKiBXaGVuIHdlJ3JlIGxpbWl0ZWQgdG8gMSBzaW11bHRhbmVvdXMgY29tbWFuZCwgbm8gb3ZlcmxhcHBpbmcgcHJvY2Vzc2luZywKKyAqIHdlJ3JlIHNlZWluZyA2MzBLL3NlYywgd2l0aCA3JSBDUFUgdXNhZ2Ugb24gYSBzbG93IFN5cXVlc3QgNDVNCisgKiBkcml2ZS4KKyAqCisgKiBOb3QgYmFkLCBub3QgZ29vZC4gV2UnbGwgc2VlLgorICovCisKKyAgICB0bXAtPmJvdW5jZS5sZW4gPSAwOwkvKiBBc3N1bWUgYWxpZ25lZCBidWZmZXIgKi8KKworICAgIGZvciAoaSA9IDA7IGNtZC0+dXNlX3NnID8gKGkgPCBjbWQtPnVzZV9zZykgOiAhaTsgY21kX2RhdGFpbiArPSA0LCAKKwljbWRfZGF0YW91dCArPSA0LCArK2kpIHsKKwl1MzIgdmJ1ZiA9IGNtZC0+dXNlX3NnCisJICAgID8gKHUzMilwYWdlX2FkZHJlc3MoKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcilbaV0ucGFnZSkrCisJICAgICAgKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcilbaV0ub2Zmc2V0CisJICAgIDogKHUzMikoY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisJdTMyIGJidWYgPSB2aXJ0X3RvX2J1cygodm9pZCAqKXZidWYpOworCXUzMiBjb3VudCA9IGNtZC0+dXNlX3NnID8KKwkgICAgKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlcilbaV0ubGVuZ3RoIDoKKwkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYnVmZmVycyB3aGljaCBhcmUgbm90IGFsaWduZWQgd2l0aCAxNiBieXRlIGNhY2hlCisJICogbGluZXMsIHRoZW4gd2UganVzdCBob3BlIG5vdGhpbmcgYWNjZXNzZXMgdGhlIG90aGVyIHBhcnRzIG9mCisJICogdGhvc2UgY2FjaGUgbGluZXMgd2hpbGUgdGhlIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiAgVGhhdCB3b3VsZAorCSAqIGZpbGwgdGhlIGNhY2hlLCBhbmQgc3Vic2VxdWVudCByZWFkcyBvZiB0aGUgZG1hIGRhdGEgd291bGQgcGljaworCSAqIHVwIHRoZSB3cm9uZyB0aGluZy4KKwkgKiBYWFggV2UgbmVlZCBhIGJvdW5jZSBidWZmZXIgdG8gaGFuZGxlIHRoYXQgY29ycmVjdGx5LgorCSAqLworCisJaWYgKCgoYmJ1ZiAmIDE1KSB8fCAoY291bnQgJiAxNSkpICYmIChkYXRhaW4gfHwgZGF0YW91dCkpCisJeworCSAgICAvKiBCb3VuY2UgYnVmZmVyIG5lZWRlZCAqLworCSAgICBpZiAoY21kLT51c2Vfc2cpCisJCXByaW50ayAoIjUzYzd4eDogTm9uLWFsaWduZWQgYnVmZmVyIHdpdGggdXNlX3NnXG4iKTsKKwkgICAgZWxzZSBpZiAoZGF0YWluICYmIGRhdGFvdXQpCisgICAgICAgICAgICAgICAgcHJpbnRrICgiNTNjN3h4OiBOb24tYWxpZ25lZCBidWZmZXIgd2l0aCBkYXRhaW4gJiYgZGF0YW91dFxuIik7CisgICAgICAgICAgICBlbHNlIGlmIChjb3VudCA+IDI1NikKKwkJcHJpbnRrICgiNTNjN3h4OiBOb24tYWxpZ25lZCB0cmFuc2ZlciA+IDI1NiBieXRlc1xuIik7CisJICAgIGVsc2UKKwkgICAgeworCQkgICAgaWYgKGRhdGFpbikKKwkJICAgIHsKKwkJCXRtcC0+Ym91bmNlLmxlbiA9IGNvdW50OworCQkJdG1wLT5ib3VuY2UuYWRkciA9IHZidWY7CisJCQliYnVmID0gdmlydF90b19idXModG1wLT5ib3VuY2UuYnVmKTsKKwkJCXRtcC0+Ym91bmNlLmJ1ZlswXSA9IDB4ZmY7CisJCQl0bXAtPmJvdW5jZS5idWZbMV0gPSAweGZlOworCQkJdG1wLT5ib3VuY2UuYnVmWzJdID0gMHhmZDsKKwkJCXRtcC0+Ym91bmNlLmJ1ZlszXSA9IDB4ZmM7CisJICAgIAkgICAgfQorCSAgICAJICAgIGlmIChkYXRhb3V0KQorCSAgICAJICAgIHsKKwkJCW1lbWNweSAoKHZvaWQgKil0bXAtPmJvdW5jZS5idWYsICh2b2lkICopdmJ1ZiwgY291bnQpOworCQkJYmJ1ZiA9IHZpcnRfdG9fYnVzKHRtcC0+Ym91bmNlLmJ1Zik7CisJCSAgICB9CisJICAgIH0KKwl9CisKKwlpZiAoZGF0YWluKSB7CisgICAgICAgICAgICBjYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMoKHZvaWQgKil2YnVmKSwgY291bnQpOworCSAgICAvKiBDQUxMIG90aGVyX2luLCBXSEVOIE5PVCBEQVRBX0lOICovICAKKwkgICAgY21kX2RhdGFpblswXSA9ICgoRENNRF9UWVBFX1RDSSB8IERDTURfVENJX09QX0NBTEwgfCAKKwkJRENNRF9UQ0lfSU8pIDw8IDI0KSB8IAorCQlEQkNfVENJX1dBSVRfRk9SX1ZBTElEIHwgREJDX1RDSV9DT01QQVJFX1BIQVNFOworCSAgICBjbWRfZGF0YWluWzFdID0gdmlydF90b19idXMgKGhvc3RkYXRhLT5zY3JpcHQpICsgCisJCWhvc3RkYXRhLT5FX290aGVyX2luOworCSAgICAvKiBNT1ZFIGNvdW50LCBidWYsIFdIRU4gREFUQV9JTiAqLworCSAgICBjbWRfZGF0YWluWzJdID0gKChEQ01EX1RZUEVfQk1JIHwgRENNRF9CTUlfT1BfTU9WRV9JIHwgRENNRF9CTUlfSU8pIAorICAgIAkgICAgCTw8IDI0KSB8IGNvdW50OworCSAgICBjbWRfZGF0YWluWzNdID0gYmJ1ZjsKKyNpZiAwCisJICAgIHByaW50X2luc24gKGhvc3QsIGNtZF9kYXRhaW4sICJkeW5hbWljICIsIDEpOworCSAgICBwcmludF9pbnNuIChob3N0LCBjbWRfZGF0YWluICsgMiwgImR5bmFtaWMgIiwgMSk7CisjZW5kaWYKKwl9CisJaWYgKGRhdGFvdXQpIHsKKyAgICAgICAgICAgIGNhY2hlX3B1c2godmlydF90b19waHlzKCh2b2lkICopdmJ1ZiksIGNvdW50KTsKKwkgICAgLyogQ0FMTCBvdGhlcl9vdXQsIFdIRU4gTk9UIERBVEFfT1VUICovCisJICAgIGNtZF9kYXRhb3V0WzBdID0gKChEQ01EX1RZUEVfVENJIHwgRENNRF9UQ0lfT1BfQ0FMTCkgPDwgMjQpIHwgCisJCURCQ19UQ0lfV0FJVF9GT1JfVkFMSUQgfCBEQkNfVENJX0NPTVBBUkVfUEhBU0U7CisJICAgIGNtZF9kYXRhb3V0WzFdID0gdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKyAgICAJICAgIAlob3N0ZGF0YS0+RV9vdGhlcl9vdXQ7CisJICAgIC8qIE1PVkUgY291bnQsIGJ1ZiwgV0hFTiBEQVRBK09VVCAqLworCSAgICBjbWRfZGF0YW91dFsyXSA9ICgoRENNRF9UWVBFX0JNSSB8IERDTURfQk1JX09QX01PVkVfSSkgPDwgMjQpIAorCQl8IGNvdW50OworCSAgICBjbWRfZGF0YW91dFszXSA9IGJidWY7CisjaWYgMAorCSAgICBwcmludF9pbnNuIChob3N0LCBjbWRfZGF0YW91dCwgImR5bmFtaWMgIiwgMSk7CisJICAgIHByaW50X2luc24gKGhvc3QsIGNtZF9kYXRhb3V0ICsgMiwgImR5bmFtaWMgIiwgMSk7CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbnN0YWxsIEpVTVAgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBkYXRhIHRyYW5zZmVyIHJvdXRpbmVzIHRvIHJldHVybgorICAgICAqIGNvbnRyb2wgdG8gdGhlIGRvX290aGVyX3RyYW5zZmVyIHJvdXRpbmVzLgorICAgICAqLworICAKKyAgICAKKyAgICBpZiAoZGF0YWluKSB7CisJY21kX2RhdGFpblswXSA9ICgoRENNRF9UWVBFX1RDSSB8IERDTURfVENJX09QX0pVTVApIDw8IDI0KSB8CisgICAgCSAgICBEQkNfVENJX1RSVUU7CisJY21kX2RhdGFpblsxXSA9IHZpcnRfdG9fYnVzKGhvc3RkYXRhLT5zY3JpcHQpICsgCisgICAgCSAgICBob3N0ZGF0YS0+RV9vdGhlcl90cmFuc2ZlcjsKKyNpZiAwCisJcHJpbnRfaW5zbiAoaG9zdCwgY21kX2RhdGFpbiwgImR5bmFtaWMganVtcCAiLCAxKTsKKyNlbmRpZgorCWNtZF9kYXRhaW4gKz0gMjsgCisgICAgfQorI2lmIDAKKyAgICBpZiAoZGF0YWluKSB7CisJY21kX2RhdGFpblswXSA9IDB4OTgwODAwMDA7CisJY21kX2RhdGFpblsxXSA9IDB4MDNmZmRlZWQ7CisJY21kX2RhdGFpbiArPSAyOworICAgIH0KKyNlbmRpZgorICAgIGlmIChkYXRhb3V0KSB7CisJY21kX2RhdGFvdXRbMF0gPSAoKERDTURfVFlQRV9UQ0kgfCBEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNCkgfAorICAgIAkgICAgREJDX1RDSV9UUlVFOworCWNtZF9kYXRhb3V0WzFdID0gdmlydF90b19idXMoaG9zdGRhdGEtPnNjcmlwdCkgKyAKKyAgICAJICAgIGhvc3RkYXRhLT5FX290aGVyX3RyYW5zZmVyOworI2lmIDAKKwlwcmludF9pbnNuIChob3N0LCBjbWRfZGF0YW91dCwgImR5bmFtaWMganVtcCAiLCAxKTsKKyNlbmRpZgorCWNtZF9kYXRhb3V0ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIHRtcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzYzd4eF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwKKyAqICAgICAgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKKyAqCisgKiBQdXJwb3NlIDogIGVucXVldWVzIGEgU0NTSSBjb21tYW5kCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kLCBkb25lIC0gZnVuY3Rpb24gY2FsbGVkIG9uIGNvbXBsZXRpb24sIHdpdGgKKyAqICAgICAgYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGRlc2NyaXB0b3IuCisgKgorICogUmV0dXJucyA6IDAKKyAqCisgKiBTaWRlIGVmZmVjdHMgOgorICogICAgICBjbWQgaXMgYWRkZWQgdG8gdGhlIHBlciBpbnN0YW5jZSBkcml2ZXIgaXNzdWVfcXVldWUsIHdpdGggbWFqb3IKKyAqICAgICAgdHdpZGRsaW5nIGRvbmUgdG8gdGhlIGhvc3Qgc3BlY2lmaWMgZmllbGRzIG9mIGNtZC4gIElmIHRoZQorICogICAgICBwcm9jZXNzX2lzc3VlX3F1ZXVlIGNvcm91dGluZSBpc24ndCBydW5uaW5nLCBpdCBpcyByZXN0YXJ0ZWQuCisgKiAKKyAqIE5PVEUgOiB3ZSB1c2UgdGhlIGhvc3Rfc2NyaWJibGUgZmllbGQgb2YgdGhlIFNjc2lfQ21uZCBzdHJ1Y3R1cmUgdG8gCisgKglob2xkIG91ciBvd24gZGF0YSwgYW5kIHBlcnZlcnQgdGhlIHB0ciBmaWVsZCBvZiB0aGUgU0NwIGZpZWxkCisgKgl0byBjcmVhdGUgYSBsaW5rZWQgbGlzdC4KKyAqLworCitpbnQKK05DUjUzYzd4eF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgdm9pZCAoKiBkb25lKShTY3NpX0NtbmQgKikpIHsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIFNjc2lfQ21uZCAqdG1wOworCisgICAgY21kLT5zY3NpX2RvbmUgPSBkb25lOworICAgIGNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgY21kLT5TQ3AucHRyID0gTlVMTDsKKyAgICBjbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCisjaWZkZWYgVkFMSURfSURTCisgICAgLyogSWdub3JlIGNvbW1hbmRzIG9uIGludmFsaWQgSURzICovCisgICAgaWYgKCFob3N0ZGF0YS0+dmFsaWRfaWRzW2NtZC0+ZGV2aWNlLT5pZF0pIHsKKyAgICAgICAgcHJpbnRrKCJzY3NpJWQgOiBpZ25vcmluZyB0YXJnZXQgJWQgbHVuICVkXG4iLCBob3N0LT5ob3N0X25vLAorICAgICAgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyAgICAgICAgY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworICAgICAgICBkb25lKGNtZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGlmICgoaG9zdGRhdGEtPm9wdGlvbnMgJiAoT1BUSU9OX0RFQlVHX0lOSVRfT05MWXxPUFRJT05fREVCVUdfUFJPQkVfT05MWSkpIAorCXx8ICgoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVEFSR0VUX0xJTUlUKSAmJgorCSAgICAhKGhvc3RkYXRhLT5kZWJ1Z19sdW5fbGltaXRbY21kLT5kZXZpY2UtPmlkXSAmICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKSkKKyNpZmRlZiBMSU5VWF8xXzIKKwl8fCBjbWQtPmRldmljZS0+aWQgPiA3CisjZWxzZQorCXx8IGNtZC0+ZGV2aWNlLT5pZCA+IGhvc3QtPm1heF9pZAorI2VuZGlmCisJfHwgY21kLT5kZXZpY2UtPmlkID09IGhvc3QtPnRoaXNfaWQKKwl8fCBob3N0ZGF0YS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpIHsKKwlwcmludGsoInNjc2klZCA6IGRpc2FibGVkIG9yIGJhZCB0YXJnZXQgJWQgbHVuICVkXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwlkb25lKGNtZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfTkNPTU1BTkRTX0xJTUlUKSAmJgorCShob3N0ZGF0YS0+ZGVidWdfY291bnRfbGltaXQgPT0gMCkpIHsKKwlwcmludGsoInNjc2klZCA6IG1heGltdW0gY29tbWFuZHMgZXhjZWVkZWRcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwlkb25lKGNtZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19SRUFEX09OTFkpIHsKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCSAgICBwcmludGsoInNjc2klZCA6IFdSSVRFIGF0dGVtcHRlZCB3aXRoIE5PX1dSSVRFIGRlYnVnZ2luZyBmbGFnIHNldFxuIiwKKwkJaG9zdC0+aG9zdF9ubyk7CisJICAgIGNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkgICAgZG9uZShjbWQpOworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgICBpZiAoKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1RBUkdFVF9MSU1JVCkgJiYKKwkgICAgaG9zdGRhdGEtPmRlYnVnX2NvdW50X2xpbWl0ICE9IC0xKSAKKwktLWhvc3RkYXRhLT5kZWJ1Z19jb3VudF9saW1pdDsKKworICAgIGNtZC0+cmVzdWx0ID0gMHhmZmZmOwkvKiBUaGUgTkNSIHdpbGwgb3ZlcndyaXRlIG1lc3NhZ2UKKwkJCQkgICAgICAgYW5kIHN0YXR1cyB3aXRoIHZhbGlkIGRhdGEgKi8KKyAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSB0bXAgPSBjcmVhdGVfY21kIChjbWQpOworCisgICAgLyoKKyAgICAgKiBSRVFVRVNUIFNFTlNFIGNvbW1hbmRzIGFyZSBpbnNlcnRlZCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgCisgICAgICogc28gdGhhdCB3ZSBkbyBub3QgY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24KKyAgICAgKiB0aGV5IG1heSBiZSBsb29raW5nIGF0LgorICAgICAqLworCisgICAgaWYgKCEoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CisJY21kLT5TQ3AucHRyID0gKHVuc2lnbmVkIGNoYXIgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IGNtZDsKKyAgICB9IGVsc2UgeworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IHRtcC0+U0NwLnB0cjsgCisJCXRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5TQ3AucHRyKTsKKwl0bXAtPlNDcC5wdHIgPSAodW5zaWduZWQgY2hhciAqKSBjbWQ7CisgICAgfQorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICBydW5fcHJvY2Vzc19pc3N1ZV9xdWV1ZSgpOworICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIHRvX3NjaGVkdWxlX2xpc3QgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisgKiAJc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqIGhvc3RkYXRhLCBTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogdGFrZXMgYSBTQ1NJIGNvbW1hbmQgd2hpY2ggd2FzIGp1c3QgcmVtb3ZlZCBmcm9tIHRoZSAKKyAqCWlzc3VlIHF1ZXVlLCBhbmQgZGVhbHMgd2l0aCBpdCBieSBpbnNlcnRpbmcgaXQgaW4gdGhlIGZpcnN0CisgKglmcmVlIHNsb3QgaW4gdGhlIHNjaGVkdWxlIGxpc3Qgb3IgYnkgdGVybWluYXRpbmcgaXQgaW1tZWRpYXRlbHkuCisgKgorICogSW5wdXRzIDogCisgKglob3N0IC0gU0NTSSBob3N0IGFkYXB0ZXI7IGhvc3RkYXRhIC0gaG9zdGRhdGEgc3RydWN0dXJlIGZvciAKKyAqCXRoaXMgYWRhcHRlcjsgY21kIC0gYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kOyBzaG91bGQgaGF2ZSAKKyAqCXRoZSBob3N0X3NjcmliYmxlIGZpZWxkIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIGEgdmFsaWQgCisgKgkKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogICAgICBjbWQgaXMgYWRkZWQgdG8gdGhlIHBlciBpbnN0YW5jZSBzY2hlZHVsZSBsaXN0LCB3aXRoIG1pbm9yIAorICogICAgICB0d2lkZGxpbmcgZG9uZSB0byB0aGUgaG9zdCBzcGVjaWZpYyBmaWVsZHMgb2YgY21kLgorICoKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCit0b19zY2hlZHVsZV9saXN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSwKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKSB7CisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICBTY3NpX0NtbmQgKnRtcCA9IGNtZC0+Y21kOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgLyogZHNhIHN0YXJ0IGlzIG5lZ2F0aXZlLCBzbyBzdWJ0cmFjdGlvbiBpcyB1c2VkICovCisgICAgdm9sYXRpbGUgdTMyICpuY3JjdXJyZW50OworCisgICAgaW50IGk7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworI2lmIDAKKyAgICBwcmludGsoInNjc2klZCA6IG5ldyBkc2EgaXMgMHglbHggKHZpcnQgMHglcClcbiIsIGhvc3QtPmhvc3Rfbm8sIAorCXZpcnRfdG9fYnVzKGhvc3RkYXRhLT5kc2EpLCBob3N0ZGF0YS0+ZHNhKTsKKyNlbmRpZgorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgIC8qIAorICAgICAqIFdvcmsgYXJvdW5kIHJhY2UgY29uZGl0aW9uIDogaWYgYW4gaW50ZXJydXB0IGZpcmVkIGFuZCB3ZSAKKyAgICAgKiBnb3QgZGlzYWJsZWQgZm9yZ2V0IGFib3V0IHRoaXMgY29tbWFuZC4KKyAgICAgKi8KKworICAgIGlmIChob3N0ZGF0YS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpIHsKKwlwcmludGsoInNjc2klZCA6IGRyaXZlciBkaXNhYmxlZFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJdG1wLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCWNtZC0+bmV4dCA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+ZnJlZTsKKwlob3N0ZGF0YS0+ZnJlZSA9IGNtZDsKKwl0bXAtPnNjc2lfZG9uZSh0bXApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgZm9yIChpID0gaG9zdC0+Y2FuX3F1ZXVlLCBuY3JjdXJyZW50ID0gaG9zdGRhdGEtPnNjaGVkdWxlOyAKKwlpID4gMCAgJiYgbmNyY3VycmVudFswXSAhPSBob3N0ZGF0YS0+Tk9QX2luc247CisJLS1pLCBuY3JjdXJyZW50ICs9IDIgLyogSlVNUCBpbnN0cnVjdGlvbnMgYXJlIHR3byB3b3JkcyAqLyk7CisKKyAgICBpZiAoaSA+IDApIHsKKwkrK2hvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF1bdG1wLT5kZXZpY2UtPmx1bl07CisJY21kLT5uZXh0ID0gaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdDsKKwlob3N0ZGF0YS0+cnVubmluZ19saXN0ID0gY21kOworCisJLyogUmVzdG9yZSB0aGlzIGluc3RydWN0aW9uIHRvIGEgTk9QIG9uY2UgdGhlIGNvbW1hbmQgc3RhcnRzICovCisJY21kLT5kc2EgWyhob3N0ZGF0YS0+ZHNhX2p1bXBfZGVzdCAtIGhvc3RkYXRhLT5kc2Ffc3RhcnQpIC8gCisJICAgIHNpemVvZih1MzIpXSA9ICh1MzIpIHZpcnRfdG9fYnVzICgodm9pZCAqKW5jcmN1cnJlbnQpOworCS8qIFJlcGxhY2UgdGhlIGN1cnJlbnQganVtcCBvcGVyYW5kLiAgKi8KKwluY3JjdXJyZW50WzFdID0KKwkgICAgdmlydF90b19idXMgKCh2b2lkICopIGNtZC0+ZHNhKSArIGhvc3RkYXRhLT5FX2RzYV9jb2RlX2JlZ2luIC0KKwkgICAgaG9zdGRhdGEtPkVfZHNhX2NvZGVfdGVtcGxhdGU7CisJLyogUmVwbGFjZSB0aGUgTk9QIGluc3RydWN0aW9uIHdpdGggYSBKVU1QICovCisJbmNyY3VycmVudFswXSA9ICgoRENNRF9UWVBFX1RDSXxEQ01EX1RDSV9PUF9KVU1QKSA8PCAyNCkgfAorCSAgICBEQkNfVENJX1RSVUU7CisgICAgfSAgZWxzZSB7CisJcHJpbnRrICgic2NzaSVkOiBubyBmcmVlIHNsb3RcbiIsIGhvc3QtPmhvc3Rfbm8pOworCWRpc2FibGUoaG9zdCk7CisJdG1wLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwljbWQtPm5leHQgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgaG9zdGRhdGEtPmZyZWU7CisJaG9zdGRhdGEtPmZyZWUgPSBjbWQ7CisJdG1wLT5zY3NpX2RvbmUodG1wKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIAorICAgICAqIElmIHRoZSBOQ1IgY2hpcCBpcyBpbiBhbiBpZGxlIHN0YXRlLCBzdGFydCBpdCBydW5uaW5nIHRoZSBzY2hlZHVsZXIKKyAgICAgKiBpbW1lZGlhdGVseS4gIE90aGVyd2lzZSwgc2lnbmFsIHRoZSBjaGlwIHRvIGp1bXAgdG8gc2NoZWR1bGUgYXMgCisgICAgICogc29vbiBhcyBpdCBpcyBpZGxlLgorICAgICAqLworCisgICAgaWYgKGhvc3RkYXRhLT5pZGxlKSB7CisJaG9zdGRhdGEtPmlkbGUgPSAwOworCWhvc3RkYXRhLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJTkNSNTNjN3gwX3dyaXRlMzIgKERTUF9SRUcsICB2aXJ0X3RvX2J1cyAoKHZvaWQgKilob3N0ZGF0YS0+c2NoZWR1bGUpKTsKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfVFJBQ0UpCisJICAgIE5DUjUzYzd4MF93cml0ZTggKERDTlRMX1JFRywgaG9zdGRhdGEtPnNhdmVkX2RjbnRsIHwKKwkJCQlEQ05UTF9TU00gfCBEQ05UTF9TVEQpOworICAgIH0gZWxzZSB7CisJTkNSNTNjN3gwX3dyaXRlOChob3N0ZGF0YS0+aXN0YXQsIElTVEFUXzEwX1NJR1ApOworICAgIH0KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogYnVzeXAgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgCisgKgkqaG9zdGRhdGEsIFNjc2lfQ21uZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBkZWNpZGUgaWYgd2UgY2FuIHBhc3MgdGhlIGdpdmVuIFNDU0kgY29tbWFuZCBvbiB0byB0aGUgCisgKglkZXZpY2UgaW4gcXVlc3Rpb24gb3Igbm90LgorICogIAorICogUmV0dXJucyA6IG5vbi16ZXJvIHdoZW4gd2UncmUgYnVzeSwgMCB3aGVuIHdlIGFyZW4ndC4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2J1c3lwIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSwgCisgICAgU2NzaV9DbW5kICpjbWQpIHsKKyAgICAvKiBGSVhNRSA6IGluIHRoZSBmdXR1cmUsIHRoaXMgbmVlZHMgdG8gYWNjb21tb2RhdGUgU0NTSS1JSSB0YWdnZWQKKyAgICAgICBxdWV1aW5nLCBhbmQgd2UgbWF5IGJlIGFibGUgdG8gcGxheSB3aXRoIGZhaXJuZXNzIGhlcmUgYSBiaXQuCisgICAgICovCisgICAgcmV0dXJuIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF1bY21kLT5kZXZpY2UtPmx1bl07Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHByb2Nlc3NfaXNzdWVfcXVldWUgKHZvaWQpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVyIGNvbW1hbmRzIGZyb20gdGhlIGlzc3VlIHF1ZXVlIHRvIE5DUiBzdGFydCBxdWV1ZSAKKyAqCW9mIGVhY2ggTkNSNTNjNy84eHggaW4gdGhlIHN5c3RlbSwgYXZvaWRpbmcga2VybmVsIHN0YWNrIAorICoJb3ZlcmZsb3dzIHdoZW4gdGhlIHNjc2lfZG9uZSgpIGZ1bmN0aW9uIGlzIGludm9rZWQgcmVjdXJzaXZlbHkuCisgKiAKKyAqIE5PVEUgOiBwcm9jZXNzX2lzc3VlX3F1ZXVlIGV4aXRzIHdpdGggaW50ZXJydXB0cyAqZGlzYWJsZWQqLCBzbyB0aGUgCisgKgljYWxsZXIgbXVzdCByZWVuYWJsZSB0aGVtIGlmIGl0IGRlc2lyZXMuCisgKiAKKyAqIE5PVEUgOiBwcm9jZXNzX2lzc3VlX3F1ZXVlIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBib3RoIAorICoJTkNSNTNjN3gwX3F1ZXVlX2NvbW1hbmQoKSBhbmQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgCisgKglhZnRlciBjb21tYW5kIGNvbXBsZXRpb24gaW4gY2FzZSBOQ1I1M2M3eDBfcXVldWVfY29tbWFuZCgpCisgKiAJaXNuJ3QgaW52b2tlZCBhZ2FpbiBidXQgd2UndmUgZnJlZWQgdXAgcmVzb3VyY2VzIHRoYXQgYXJlCisgKgluZWVkZWQuCisgKi8KKworc3RhdGljIHZvaWQgCitwcm9jZXNzX2lzc3VlX3F1ZXVlICh1bnNpZ25lZCBsb25nIGZsYWdzKSB7CisgICAgU2NzaV9DbW5kICp0bXAsICpwcmV2OworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisgICAgaW50IGRvbmU7CisKKyAgICAvKgorICAgICAqIFdlIHJ1biAod2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkKSB1bnRpbCB3ZSdyZSBzdXJlIHRoYXQgbm9uZSBvZiAKKyAgICAgKiB0aGUgaG9zdCBhZGFwdGVycyBoYXZlIGFueXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUsIGF0IHdoaWNoIHBvaW50IAorICAgICAqIHdlIHNldCBwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcgdG8gMCBhbmQgZXhpdC4KKyAgICAgKgorICAgICAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgYmVmb3JlIGRvaW5nIHZhcmlvdXMgb3RoZXIgaW50ZXJuYWwgCisgICAgICogaW5zdHJ1Y3Rpb25zLCBhZnRlciB3ZSd2ZSBkZWNpZGVkIHRoYXQgd2UgbmVlZCB0byBydW4gdGhyb3VnaAorICAgICAqIHRoZSBsb29wIGFnYWluLgorICAgICAqCisgICAgICovCisKKyAgICBkbyB7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsgLyogRnJlZXplIHJlcXVlc3QgcXVldWVzICovCisJZG9uZSA9IDE7CisJZm9yIChob3N0ID0gZmlyc3RfaG9zdDsgaG9zdCAmJiBob3N0LT5ob3N0dCA9PSB0aGVfdGVtcGxhdGU7CisJICAgIGhvc3QgPSBob3N0LT5uZXh0KSB7CisJICAgIGhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisJICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7CisJICAgIGlmIChob3N0ZGF0YS0+aXNzdWVfcXVldWUpIHsKKwkgICAgCWlmIChob3N0ZGF0YS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMRUQpIHsKKwkJICAgIHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQkgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSB0bXAtPlNDcC5wdHI7CisJCSAgICB0bXAtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCSAgICBpZiAodG1wLT5ob3N0X3NjcmliYmxlKSB7CisJCQkoKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopdG1wLT5ob3N0X3NjcmliYmxlKS0+bmV4dCA9IAorCQkJICAgIGhvc3RkYXRhLT5mcmVlOworCQkJaG9zdGRhdGEtPmZyZWUgPSAKKwkJCSAgICAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKil0bXAtPmhvc3Rfc2NyaWJibGU7CisJCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkgICAgfQorCQkgICAgdG1wLT5zY3NpX2RvbmUgKHRtcCk7CisJCSAgICBkb25lID0gMDsKKwkJfSBlbHNlIAorCQkgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgCisJCQlwcmV2ID0gTlVMTDsgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSAoU2NzaV9DbW5kICopIAorCQkJdG1wLT5TQ3AucHRyKSAKKwkJCWlmICghdG1wLT5ob3N0X3NjcmliYmxlIHx8IAorCQkJICAgICFidXN5cCAoaG9zdCwgaG9zdGRhdGEsIHRtcCkpIHsKKwkJCQlpZiAocHJldikKKwkJCQkgICAgcHJldi0+U0NwLnB0ciA9IHRtcC0+U0NwLnB0cjsKKwkJCQllbHNlCisJCQkJICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IChTY3NpX0NtbmQgKikgCisJCQkJCXRtcC0+U0NwLnB0cjsKKwkJCSAgICB0bXAtPlNDcC5wdHIgPSBOVUxMOworCQkJICAgIGlmICh0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCQlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfUVVFVUVTKSAKKwkJCQkgICAgcHJpbnRrICgic2NzaSVkIDogbW92aW5nIGNvbW1hbmQgZm9yIHRhcmdldCAlZCBsdW4gJWQgdG8gc3RhcnQgbGlzdFxuIiwKKwkJCQkJaG9zdC0+aG9zdF9ubywgdG1wLT5kZXZpY2UtPmlkLCB0bXAtPmRldmljZS0+bHVuKTsKKwkJCisKKwkJCSAgICAJdG9fc2NoZWR1bGVfbGlzdCAoaG9zdCwgaG9zdGRhdGEsIAorCQkJCSAgICAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikKKwkJCQkgICAgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCSAgICB9IGVsc2UgeworCQkJCWlmICgoKHRtcC0+cmVzdWx0ICYgMHhmZikgPT0gMHhmZikgfHwKKwkJCSAgICAJICAgICgodG1wLT5yZXN1bHQgJiAweGZmMDApID09IDB4ZmYwMCkpIHsKKwkJCQkgICAgcHJpbnRrICgic2NzaSVkIDogZGFuZ2VyIFdpbGwgUm9iaW5zb24hXG4iLAorCQkJCQlob3N0LT5ob3N0X25vKTsKKwkJCQkgICAgdG1wLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJICAgIGRpc2FibGUgKGhvc3QpOworCQkJCX0KKwkJCQl0bXAtPnNjc2lfZG9uZSh0bXApOworCQkJICAgIH0KKwkJCSAgICBkb25lID0gMDsKKwkJCX0gLyogaWYgdGFyZ2V0L2x1biBpcyBub3QgYnVzeSAqLworCSAgICB9IC8qIGlmIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSAqLworCSAgICBpZiAoIWRvbmUpCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAJfSAvKiBmb3IgaG9zdCAqLworICAgIH0gd2hpbGUgKCFkb25lKTsKKyAgICBwcm9jZXNzX2lzc3VlX3F1ZXVlX3J1bm5pbmcgPSAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgdm9pZCBpbnRyX3Njc2kgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6IGhhbmRsZSBhbGwgU0NTSSBpbnRlcnJ1cHRzLCBpbmRpY2F0ZWQgYnkgdGhlIHNldHRpbmcgCisgKiAJb2YgdGhlIFNJUCBiaXQgaW4gdGhlIElTVEFUIHJlZ2lzdGVyLgorICoKKyAqIElucHV0cyA6IGhvc3QsIGNtZCAtIGhvc3QgYW5kIE5DUiBjb21tYW5kIGNhdXNpbmcgdGhlIGludGVycnVwdCwgY21kCisgKiAJbWF5IGJlIE5VTEwuCisgKi8KKworc3RhdGljIHZvaWQgCitpbnRyX3Njc2kgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gCisgICAgCShzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIHVuc2lnbmVkIGNoYXIgc3N0YXQwX3Npc3QwLCBzaXN0MSwgCQkvKiBSZWdpc3RlcnMgKi8KKwkgICAgZmF0YWw7IAkJCQkvKiBEaWQgYSBmYXRhbCBpbnRlcnJ1cHQgCisJCQkJCQkgICBvY2N1ciA/ICovCisgICAKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICBmYXRhbCA9IDA7CisKKyAgICBzc3RhdDBfc2lzdDAgPSBOQ1I1M2M3eDBfcmVhZDgoU1NUQVQwX1JFRyk7CisgICAgc2lzdDEgPSAwOworCisgICAgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpIAorCXByaW50ayAoInNjc2klZCA6IFNJU1QwIDB4JTB4LCBTSVNUMSAweCUweFxuIiwgaG9zdC0+aG9zdF9ubywKKwkgICAgc3N0YXQwX3Npc3QwLCBzaXN0MSk7CisKKyAgICAvKiAyNTBtcyBzZWxlY3Rpb24gdGltZW91dCAqLworICAgIGlmIChzc3RhdDBfc2lzdDAgJiBTU1RBVDBfNzAwX1NUTykgeworCWZhdGFsID0gMTsKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgeworCSAgICBwcmludGsgKCJzY3NpJWQgOiBTZWxlY3Rpb24gVGltZW91dFxuIiwgaG9zdC0+aG9zdF9ubyk7CisgICAgCSAgICBpZiAoY21kKSB7CisgICAgCSAgICAJcHJpbnRrKCJzY3NpJWQgOiB0YXJnZXQgJWQsIGx1biAlZCwgY29tbWFuZCAiLAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPmRldmljZS0+aWQsIGNtZC0+Y21kLT5kZXZpY2UtPmx1bik7CisgICAgCSAgICAJcHJpbnRfY29tbWFuZCAoY21kLT5jbWQtPmNtbmQpOworCQlwcmludGsoInNjc2klZCA6IGRzcCA9IDB4JXggKHZpcnQgMHglcClcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCSAgICBOQ1I1M2M3eDBfcmVhZDMyKERTUF9SRUcpLAorCQkgICAgYnVzX3RvX3ZpcnQoTkNSNTNjN3gwX3JlYWQzMihEU1BfUkVHKSkpOworICAgIAkgICAgfSBlbHNlIHsKKyAgICAJICAgIAlwcmludGsoInNjc2klZCA6IG5vIGNvbW1hbmRcbiIsIGhvc3QtPmhvc3Rfbm8pOworICAgIAkgICAgfQorICAgIAl9CisvKgorICogWFhYIC0gcXVlc3Rpb24gOiBob3cgZG8gd2Ugd2FudCB0byBoYW5kbGUgdGhlIElsbGVnYWwgSW5zdHJ1Y3Rpb24KKyAqIAlpbnRlcnJ1cHQsIHdoaWNoIG1heSBvY2N1ciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIFNlbGVjdGlvbiBUaW1lb3V0CisgKiAJaW50ZXJydXB0PworICovCisKKwlpZiAoMSkgeworCSAgICBob3N0ZGF0YS0+aWRsZSA9IDE7CisJICAgIGhvc3RkYXRhLT5leHBlY3Rpbmdfc3RvID0gMDsKKworCSAgICBpZiAoaG9zdGRhdGEtPnRlc3RfcnVubmluZykgeworCQlob3N0ZGF0YS0+dGVzdF9ydW5uaW5nID0gMDsKKwkJaG9zdGRhdGEtPnRlc3RfY29tcGxldGVkID0gMzsKKwkgICAgfSBlbHNlIGlmIChjbWQpIHsKKwkJYWJub3JtYWxfZmluaXNoZWQoY21kLCBESURfQkFEX1RBUkdFVCA8PCAxNik7CisJICAgIH0KKyNpZiAwCSAgICAKKwkgICAgaG9zdGRhdGEtPmludHJzID0gMDsKKyNlbmRpZgorCX0KKyAgICB9IAorCisvKgorICogRklYTUUgOiBpbiB0aGVvcnksIHdlIGNhbiBhbHNvIGdldCBhIFVEQyB3aGVuIGEgU1RPIG9jY3Vycy4KKyAqLworICAgIGlmIChzc3RhdDBfc2lzdDAgJiBTU1RBVDBfVURDKSB7CisJZmF0YWwgPSAxOworCWlmIChjbWQpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiB0YXJnZXQgJWQgbHVuICVkIHVuZXhwZWN0ZWQgZGlzY29ubmVjdFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPmRldmljZS0+aWQsIGNtZC0+Y21kLT5kZXZpY2UtPmx1bik7CisJICAgIHByaW50X2xvdHMgKGhvc3QpOworCSAgICBhYm5vcm1hbF9maW5pc2hlZChjbWQsIERJRF9FUlJPUiA8PCAxNik7CisJfSBlbHNlIAorCSAgICAgcHJpbnRrKCJzY3NpJWQgOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3QgKG5vIGNvbW1hbmQpXG4iLAorCQlob3N0LT5ob3N0X25vKTsKKworCWhvc3RkYXRhLT5kc3AgPSAodTMyICopIGhvc3RkYXRhLT5zY2hlZHVsZTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworICAgIH0KKworICAgIC8qIFNDU0kgUEFSSVRZIGVycm9yICovCisgICAgaWYgKHNzdGF0MF9zaXN0MCAmIFNTVEFUMF9QQVIpIHsKKwlmYXRhbCA9IDE7CisJaWYgKGNtZCAmJiBjbWQtPmNtZCkgeworCSAgICBwcmludGsoInNjc2klZCA6IHRhcmdldCAlZCBsdW4gJWQgcGFyaXR5IGVycm9yLlxuIiwKKwkJaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPmRldmljZS0+aWQsIGNtZC0+Y21kLT5kZXZpY2UtPmx1bik7CisJICAgIGFibm9ybWFsX2ZpbmlzaGVkIChjbWQsIERJRF9QQVJJVFkgPDwgMTYpOyAKKwl9IGVsc2UKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBwYXJpdHkgZXJyb3JcbiIsIGhvc3QtPmhvc3Rfbm8pOworCS8qIFNob3VsZCBzZW5kIG1lc3NhZ2Ugb3V0LCBwYXJpdHkgZXJyb3IgKi8KKworCS8qIFhYWCAtIFJlZHVjZSBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlISAqLworCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfaW5pdGlhdG9yX2Fib3J0IC8KKyAgICAJICAgIHNpemVvZih1MzIpOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7IAorICAgIC8qIFNDU0kgR1JPU1MgZXJyb3IgKi8KKyAgICB9IAorCisgICAgaWYgKHNzdGF0MF9zaXN0MCAmIFNTVEFUMF9TR0UpIHsKKwlmYXRhbCA9IDE7CisJcHJpbnRrKCJzY3NpJWQgOiBncm9zcyBlcnJvciwgc2F2ZWQyX2RzYSA9IDB4JXhcbiIsIGhvc3QtPmhvc3Rfbm8sCisJCQkJCSh1bnNpZ25lZCBpbnQpaG9zdGRhdGEtPnNhdmVkMl9kc2EpOworCXByaW50X2xvdHMgKGhvc3QpOworCQorCS8qIAorICAgICAgICAgKiBBIFNDU0kgZ3Jvc3MgZXJyb3IgbWF5IG9jY3VyIHdoZW4gd2UgaGF2ZSAKKwkgKgorCSAqIC0gQSBzeW5jaHJvbm91cyBvZmZzZXQgd2hpY2ggY2F1c2VzIHRoZSBTQ1NJIEZJRk8gdG8gYmUgb3ZlcndyaXR0ZW4uCisJICoKKwkgKiAtIEEgUkVRIHdoaWNoIGNhdXNlcyB0aGUgbWF4aW11bSBzeW5jaHJvbm91cyBvZmZzZXQgcHJvZ3JhbW1lZCBpbiAKKwkgKiAJdGhlIFNYRkVSIHJlZ2lzdGVyIHRvIGJlIGV4Y2VlZGVkLgorCSAqCisJICogLSBBIHBoYXNlIGNoYW5nZSB3aXRoIGFuIG91dHN0YW5kaW5nIHN5bmNocm9ub3VzIG9mZnNldC4KKwkgKgorCSAqIC0gUmVzaWR1YWwgZGF0YSBpbiB0aGUgc3luY2hyb25vdXMgZGF0YSBGSUZPLCB3aXRoIGEgdHJhbnNmZXIKKwkgKglvdGhlciB0aGFuIGEgc3luY2hyb25vdXMgcmVjZWl2ZSBpcyBzdGFydGVkLiQjCisJICovCisJCQorCisJLyogWFhYIFNob3VsZCBkZWR1Y2Ugc3luY2hyb25vdXMgdHJhbnNmZXIgcmF0ZSEgKi8KKwlob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX2luaXRpYXRvcl9hYm9ydCAvCisgICAgCSAgICBzaXplb2YodTMyKTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworICAgIC8qIFBoYXNlIG1pc21hdGNoICovCisgICAgfSAKKworICAgIGlmIChzc3RhdDBfc2lzdDAgJiBTU1RBVDBfTUEpIHsKKwlmYXRhbCA9IDE7CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpCisJICAgIHByaW50ayAoInNjc2klZCA6IFNTVEFUMF9NQVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJaW50cl9waGFzZV9taXNtYXRjaCAoaG9zdCwgY21kKTsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKHNzdGF0MF9zaXN0MCAmIFNJU1QwXzgwMF9SU0wpIAorCXByaW50ayAoInNjc2klZCA6IE9oIG5vIE1yLiBCaWxsIVxuIiwgaG9zdC0+aG9zdF9ubyk7CisjZW5kaWYKKyAgICAKKy8qCisgKiBJZiBhIGZhdGFsIFNDU0kgaW50ZXJydXB0IG9jY3Vycywgd2UgbXVzdCBpbnN1cmUgdGhhdCB0aGUgRE1BIGFuZAorICogU0NTSSBGSUZPcyB3ZXJlIGZsdXNoZWQuCisgKi8KKworICAgIGlmIChmYXRhbCkgeworCWlmICghaG9zdGRhdGEtPmRzdGF0X3ZhbGlkKSB7CisJICAgIGhvc3RkYXRhLT5kc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChEU1RBVF9SRUcpOworCSAgICBob3N0ZGF0YS0+ZHN0YXRfdmFsaWQgPSAxOworCX0KKworCWlmICghKGhvc3RkYXRhLT5kc3RhdCAmIERTVEFUX0RGRSkpIHsKKwkgIHByaW50ayAoInNjc2klZCA6IERNQSBGSUZPIG5vdCBlbXB0eVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAvKgorCSAgICogUmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhpcyBjb2RlIGZvciA3MTAgIFJHSC4KKwkgICAqIEhhdm4ndCBzZWVuIGFueSBwcm9ibGVtcywgYnV0IG1heWJlIHdlIHNob3VsZCBGTFVTSCBiZWZvcmUKKwkgICAqIGNsZWFyaW5nIHNvbWV0aW1lcy4KKwkgICAqLworICAgICAgICAgIE5DUjUzYzd4MF93cml0ZTggKENURVNUOF9SRUcsIENURVNUOF8xMF9DTEYpOworICAgICAgICAgIHdoaWxlIChOQ1I1M2M3eDBfcmVhZDggKENURVNUOF9SRUcpICYgQ1RFU1Q4XzEwX0NMRikKKwkJOworCSAgaG9zdGRhdGEtPmRzdGF0IHw9IERTVEFUX0RGRTsKKyAgICAJfQorICAgIH0KK30KKworI2lmZGVmIENZQ0xJQ19UUkFDRQorCisvKgorICogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzIGEgY3ljbGljIGxvZyBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQsIGlmIHlvdSB0dXJuCisgKiBUUkFDRSBvbi4gIEl0IHdpbGwgYWxzbyBwcmludCB0aGUgbG9nIGZvciB5b3UuICBWZXJ5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZworICogNTNjNzEwIHN1cHBvcnQsIHBvc3NpYmx5IG5vdCByZWFsbHkgbmVlZGVkIGFueSBtb3JlLgorICovCisKK3UzMiBpbnNuX2xvZ1s0MDk2XTsKK3UzMiBpbnNuX2xvZ19pbmRleCA9IDA7CisKK3ZvaWQgbG9nMSAodTMyIGkpCit7CisJaW5zbl9sb2dbaW5zbl9sb2dfaW5kZXgrK10gPSBpOworCWlmIChpbnNuX2xvZ19pbmRleCA9PSA0MDk2KQorCQlpbnNuX2xvZ19pbmRleCA9IDA7Cit9CisKK3ZvaWQgbG9nX2luc24gKHUzMiAqaXApCit7CisJbG9nMSAoKHUzMilpcCk7CisJbG9nMSAoKmlwKTsKKwlsb2cxICgqKGlwKzEpKTsKKwlpZiAoKCgqaXAgPj4gMjQpICYgRENNRF9UWVBFX01BU0spID09IERDTURfVFlQRV9NTUkpCisJCWxvZzEgKCooaXArMikpOworfQorCit2b2lkIGR1bXBfbG9nKHZvaWQpCit7CisJaW50IGNudCA9IDA7CisJaW50IGkgPSBpbnNuX2xvZ19pbmRleDsKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZmlyc3RfaG9zdDsKKworCXdoaWxlIChjbnQgPCA0MDk2KSB7CisJCXByaW50ayAoIiUwOHggKCslNngpOiAiLCBpbnNuX2xvZ1tpXSwgKGluc25fbG9nW2ldIC0gKHUzMikmKCgoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKWhvc3QtPmhvc3RkYXRhWzBdKS0+c2NyaXB0KSkvNCk7CisJCWlmICgrK2kgPT0gNDA5NikKKwkJCWkgPSAwOworCQljbnQrKzsKKwkJaWYgKCgoaW5zbl9sb2dbaV0gID4+IDI0KSAmIERDTURfVFlQRV9NQVNLKSA9PSBEQ01EX1RZUEVfTU1JKSAKKwkJCXNpemUgPSAzOworCQllbHNlCisJCQlzaXplID0gMjsKKwkJd2hpbGUgKHNpemUtLSkgeworCQkJcHJpbnRrICgiJTA4eCAiLCBpbnNuX2xvZ1tpXSk7CisJCQlpZiAoKytpID09IDQwOTYpCisJCQkJaSA9IDA7CisJCQljbnQrKzsKKwkJfQorCQlwcmludGsgKCJcbiIpOworCX0KK30KKyNlbmRpZgorCisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyB2b2lkIE5DUjUzYzd4MF9pbnRmbHkgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IFNjYW4gY29tbWFuZCBxdWV1ZSBmb3Igc3BlY2lmaWVkIGhvc3QsIGxvb2tpbmcgZm9yIGNvbXBsZXRlZAorICogICAgICAgICAgIGNvbW1hbmRzLgorICogCisgKiBJbnB1dHMgOiBTY3NpX0hvc3QgcG9pbnRlci4KKyAqCisgKiAJVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoZW4gYSBzaW11bGF0ZWQgSU5URkxZCisgKiAJaW50ZXJydXB0IG9jY3Vycy4KKyAqLworCitzdGF0aWMgdm9pZAorTkNSNTNjN3gwX2ludGZseSAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhOwkvKiBob3N0LT5ob3N0ZGF0YVswXSAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQsCQkJLyogY29tbWFuZCB3aGljaCBoYWx0ZWQgKi8KKwkqKmNtZF9wcmV2X3B0cjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkKKyAgICBjaGFyIHNlYXJjaF9mb3VuZCA9IDA7CQkJLyogR290IGF0IGxlYXN0IG9uZSA/ICovCisKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKQorICAgIHByaW50ayAoInNjc2klZCA6IElOVEZMWVxuIiwgaG9zdC0+aG9zdF9ubyk7IAorCisgICAgLyoKKyAgICAqIFRyYXZlcnNlIG91ciBsaXN0IG9mIHJ1bm5pbmcgY29tbWFuZHMsIGFuZCBsb29rCisgICAgKiBmb3IgdGhvc2Ugd2l0aCB2YWxpZCAobm9uLTB4ZmYgZmYpIHN0YXR1cyBhbmQgbWVzc2FnZQorICAgICogYnl0ZXMgZW5jb2RlZCBpbiB0aGUgcmVzdWx0IHdoaWNoIHNpZ25pZnkgY29tbWFuZAorICAgICogY29tcGxldGlvbi4KKyAgICAqLworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworcmVzdGFydDoKKyAgICBmb3IgKGNtZF9wcmV2X3B0ciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKikmKGhvc3RkYXRhLT5ydW5uaW5nX2xpc3QpLAorCWNtZCA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+cnVubmluZ19saXN0OyBjbWQgOworCWNtZF9wcmV2X3B0ciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKikgJihjbWQtPm5leHQpLCAKKyAgICAJY21kID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGNtZC0+bmV4dCkKKyAgICB7CisJU2NzaV9DbW5kICp0bXA7CisKKwlpZiAoIWNtZCkgeworCSAgICBwcmludGsoInNjc2klZCA6IHZlcnkgd2VpcmQuXG4iLCBob3N0LT5ob3N0X25vKTsKKwkgICAgYnJlYWs7CisJfQorCisJaWYgKCEodG1wID0gY21kLT5jbWQpKSB7CisJICAgIHByaW50aygic2NzaSVkIDogd2VpcmQuICBOQ1I1M2M3eDBfY21kIGhhcyBubyBTY3NpX0NtbmRcbiIsCisJCSAgICBob3N0LT5ob3N0X25vKTsKKwkgICAgY29udGludWU7CisJfQorCS8qIENvcHkgdGhlIHJlc3VsdCBvdmVyIG5vdzsgbWF5IG5vdCBiZSBjb21wbGV0ZSwKKwkgKiBidXQgc3Vic2VxdWVudCB0ZXN0cyBtYXkgYXMgd2VsbCBiZSBkb25lIG9uCisJICogY2FjaGVkIG1lbW9yeS4KKwkgKi8KKwl0bXAtPnJlc3VsdCA9IGNtZC0+cmVzdWx0OworCisJaWYgKCgodG1wLT5yZXN1bHQgJiAweGZmKSA9PSAweGZmKSB8fAorCQkJICAgICgodG1wLT5yZXN1bHQgJiAweGZmMDApID09IDB4ZmYwMCkpCisJICAgIGNvbnRpbnVlOworCisJc2VhcmNoX2ZvdW5kID0gMTsKKworCWlmIChjbWQtPmJvdW5jZS5sZW4pCisJICAgIG1lbWNweSAoKHZvaWQgKiljbWQtPmJvdW5jZS5hZGRyLAorCQkJCSh2b2lkICopY21kLT5ib3VuY2UuYnVmLCBjbWQtPmJvdW5jZS5sZW4pOworCisJLyogSW1wb3J0YW50IC0gcmVtb3ZlIGZyb20gbGlzdCBfYmVmb3JlXyBkb25lIGlzIGNhbGxlZCAqLworCWlmIChjbWRfcHJldl9wdHIpCisJICAgICpjbWRfcHJldl9wdHIgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5uZXh0OworCisJLS1ob3N0ZGF0YS0+YnVzeVt0bXAtPmRldmljZS0+aWRdW3RtcC0+ZGV2aWNlLT5sdW5dOworCWNtZC0+bmV4dCA9IGhvc3RkYXRhLT5mcmVlOworCWhvc3RkYXRhLT5mcmVlID0gY21kOworCisJdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IGNvbW1hbmQgY29tcGxldGUgOiBwaWQgJWx1LCBpZCAlZCxsdW4gJWQgcmVzdWx0IDB4JXggIiwgCisJCSAgaG9zdC0+aG9zdF9ubywgdG1wLT5waWQsIHRtcC0+ZGV2aWNlLT5pZCwgdG1wLT5kZXZpY2UtPmx1biwgdG1wLT5yZXN1bHQpOworCSAgICBwcmludF9jb21tYW5kICh0bXAtPmNtbmQpOworCX0KKworCXRtcC0+c2NzaV9kb25lKHRtcCk7CisJZ290byByZXN0YXJ0OworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICBpZiAoIXNlYXJjaF9mb3VuZCkgIHsKKwlwcmludGsgKCJzY3NpJWQgOiBXQVJOSU5HIDogSU5URkxZIHdpdGggbm8gY29tcGxldGVkIGNvbW1hbmRzLlxuIiwKKwkJCSAgICBob3N0LT5ob3N0X25vKTsKKyAgICB9IGVsc2UgeworCXJ1bl9wcm9jZXNzX2lzc3VlX3F1ZXVlKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGlycXJldHVybl90IE5DUjUzYzd4MF9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKKyAqCisgKiBQdXJwb3NlIDogaGFuZGxlIE5DUjUzYzd4MCBpbnRlcnJ1cHRzIGZvciBhbGwgTkNSIGRldmljZXMgc2hhcmluZworICoJdGhlIHNhbWUgSVJRIGxpbmUuICAKKyAqIAorICogSW5wdXRzIDogU2luY2Ugd2UncmUgdXNpbmcgdGhlIFNBX0lOVEVSUlVQVCBpbnRlcnJ1cHQgaGFuZGxlcgorICoJc2VtYW50aWNzLCBpcnEgaW5kaWNhdGVzIHRoZSBpbnRlcnJ1cHQgd2hpY2ggaW52b2tlZCAKKyAqCXRoaXMgaGFuZGxlci4gIAorICoKKyAqIE9uIHRoZSA3MTAgd2Ugc2ltdWFsdGUgYW4gSU5URkxZIHdpdGggYSBzY3JpcHQgaW50ZXJydXB0LCBhbmQgdGhlCisgKiBzY3JpcHQgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBjYWxsIGJhY2sgdG8gdGhpcyBmdW5jdGlvbi4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK05DUjUzYzd4MF9pbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CQkJLyogSG9zdCB3ZSBhcmUgbG9va2luZyBhdCAqLworICAgIHVuc2lnbmVkIGNoYXIgaXN0YXQ7IAkJCS8qIFZhbHVlcyBvZiBpbnRlcnJ1cHQgcmVncyAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhOwkvKiBob3N0LT5ob3N0ZGF0YVswXSAqLworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQ7CQkJLyogY29tbWFuZCB3aGljaCBoYWx0ZWQgKi8KKyAgICB1MzIgKmRzYTsJCQkJCS8qIERTQSAqLworICAgIGludCBoYW5kbGVkID0gMDsKKworI2lmZGVmIE5DUl9ERUJVRworICAgIGNoYXIgYnVmWzgwXTsJCQkJLyogRGVidWdnaW5nIHNwcmludGYgYnVmZmVyICovCisgICAgc2l6ZV90IGJ1ZmxlbjsJCQkJLyogTGVuZ3RoIG9mIHNhbWUgKi8KKyNlbmRpZgorCisgICAgaG9zdCAgICAgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWRldl9pZDsKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworICAgIC8qCisgICAgICogT25seSByZWFkIGlzdGF0IG9uY2UgcGVyIGxvb3AsIHNpbmNlIHJlYWRpbmcgaXQgYWdhaW4gd2lsbCB1bnN0YWNrCisgICAgICogaW50ZXJydXB0cworICAgICAqLworCisgICAgd2hpbGUgKChpc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+aXN0YXQpKSAmIChJU1RBVF9TSVB8SVNUQVRfRElQKSkgeworCWhhbmRsZWQgPSAxOworCWhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDA7CisJaG9zdGRhdGEtPmRzdGF0X3ZhbGlkID0gMDsKKyAgICAJaG9zdGRhdGEtPnN0YXRlID0gU1RBVEVfSEFMVEVEOworCisJaWYgKE5DUjUzYzd4MF9yZWFkOCAoU1NUQVQyX1JFRykgJiBTU1RBVDJfRkZfTUFTSykgCisJICAgIHByaW50ayAoInNjc2klZCA6IFNDU0kgRklGTyBub3QgZW1wdHlcbiIsIGhvc3QtPmhvc3Rfbm8pOworCisJLyoKKwkgKiBOQ1I1M2M3MDAgYW5kIE5DUjUzYzcwMC02NiBjaGFuZ2UgdGhlIGN1cnJlbnQgU0NTSQorCSAqIHByb2Nlc3MsIGhvc3RkYXRhLT5uY3JjdXJyZW50LCBpbiB0aGUgTGludXggZHJpdmVyIHNvCisJICogY21kID0gaG9zdGRhdGEtPm5jcmN1cnJlbnQuCisJICoKKwkgKiBXaXRoIG90aGVyIGNoaXBzLCB3ZSBtdXN0IGxvb2sgdGhyb3VnaCB0aGUgY29tbWFuZHMKKwkgKiBleGVjdXRpbmcgYW5kIGZpbmQgdGhlIGNvbW1hbmQgc3RydWN0dXJlIHdoaWNoIAorCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBEU0EgcmVnaXN0ZXIuCisJICovCisKKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fNzAwKSB7CisJICAgIGNtZCA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+bmNyY3VycmVudDsKKwl9IGVsc2UgeworCSAgICBkc2EgPSBidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKwkgICAgZm9yIChjbWQgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdDsKKwkJY21kICYmIChkc2EgKyAoaG9zdGRhdGEtPmRzYV9zdGFydCAvIHNpemVvZih1MzIpKSkgIT0gY21kLT5kc2E7CisJCSAgICBjbWQgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikoY21kLT5uZXh0KSkKKwkJOworCX0KKwlpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgeworCSAgICBpZiAoY21kKSB7CisJCXByaW50aygic2NzaSVkIDogaW50ZXJydXB0IGZvciBwaWQgJWx1LCBpZCAlZCwgbHVuICVkICIsIAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5jbWQtPnBpZCwgKGludCkgY21kLT5jbWQtPmRldmljZS0+aWQsCisJCSAgICAoaW50KSBjbWQtPmNtZC0+ZGV2aWNlLT5sdW4pOworCQlwcmludF9jb21tYW5kIChjbWQtPmNtZC0+Y21uZCk7CisJICAgIH0gZWxzZSB7CisJCXByaW50aygic2NzaSVkIDogbm8gYWN0aXZlIGNvbW1hbmRcbiIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICB9CisJfQorCQorCWlmIChpc3RhdCAmIElTVEFUX1NJUCkgeworCSAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikgCisJCXByaW50ayAoInNjc2klZCA6IElTVEFUX1NJUFxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIGludHJfc2NzaSAoaG9zdCwgY21kKTsKKwl9CisJCisJaWYgKGlzdGF0ICYgSVNUQVRfRElQKSB7CisJICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSAKKwkJcHJpbnRrICgic2NzaSVkIDogSVNUQVRfRElQXG4iLCBob3N0LT5ob3N0X25vKTsKKwkgICAgaW50cl9kbWEgKGhvc3QsIGNtZCk7CisJfQorCQorCWlmICghaG9zdGRhdGEtPmRzdGF0X3ZhbGlkKSB7CisJICAgIGhvc3RkYXRhLT5kc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChEU1RBVF9SRUcpOworCSAgICBob3N0ZGF0YS0+ZHN0YXRfdmFsaWQgPSAxOworCX0KKwkKKwlpZiAoIShob3N0ZGF0YS0+ZHN0YXQgJiBEU1RBVF9ERkUpKSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IERNQSBGSUZPIG5vdCBlbXB0eVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIC8qIFJlYWxseSBuZWVkIHRvIGNoZWNrIHRoaXMgb3V0IGZvciA3MTAgUkdIICovCisJICAgIE5DUjUzYzd4MF93cml0ZTggKENURVNUOF9SRUcsIENURVNUOF8xMF9DTEYpOworCSAgICB3aGlsZSAoTkNSNTNjN3gwX3JlYWQ4IChDVEVTVDhfUkVHKSAmIENURVNUOF8xMF9DTEYpCisJCTsKKwkgICAgaG9zdGRhdGEtPmRzdGF0IHw9IERTVEFUX0RGRTsKKwl9CisKKwlpZiAoIWhvc3RkYXRhLT5pZGxlICYmIGhvc3RkYXRhLT5zdGF0ZSA9PSBTVEFURV9IQUxURUQpIHsKKwkgICAgaWYgKCFob3N0ZGF0YS0+ZHNwX2NoYW5nZWQpCisJCWhvc3RkYXRhLT5kc3AgPSAodTMyICopYnVzX3RvX3ZpcnQoTkNSNTNjN3gwX3JlYWQzMihEU1BfUkVHKSk7CisjaWYgMAorCSAgICBwcmludGsoInNjc2klZCA6IG5ldyBkc3AgaXMgMHglbHggKHZpcnQgMHglcClcbiIsCisJCWhvc3QtPmhvc3Rfbm8sICB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+ZHNwKSwgaG9zdGRhdGEtPmRzcCk7CisjZW5kaWYKKwkJCisJICAgIGhvc3RkYXRhLT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisJICAgIE5DUjUzYzd4MF93cml0ZTMyIChEU1BfUkVHLCB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+ZHNwKSk7CisJICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19UUkFDRSkgeworI2lmZGVmIENZQ0xJQ19UUkFDRQorCQlsb2dfaW5zbiAoaG9zdGRhdGEtPmRzcCk7CisjZWxzZQorCSAgICAJcHJpbnRfaW5zbiAoaG9zdCwgaG9zdGRhdGEtPmRzcCwgInQgIiwgMSk7CisjZW5kaWYKKwkJTkNSNTNjN3gwX3dyaXRlOCAoRENOVExfUkVHLAorCQkJaG9zdGRhdGEtPnNhdmVkX2RjbnRsIHwgRENOVExfU1NNIHwgRENOVExfU1REKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGFib3J0X2Nvbm5lY3RlZCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKKyAqCisgKiBQdXJwb3NlIDogQXNzdW1pbmcgdGhhdCB0aGUgTkNSIFNDU0kgcHJvY2Vzc29yIGlzIGN1cnJlbnRseSAKKyAqIAloYWx0ZWQsIGJyZWFrIHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV4dXMuICBDbGVhbgorICoJdXAgb2YgdGhlIE5DUjUzYzd4MF9jbWQgYW5kIFNjc2lfQ21uZCBzdHJ1Y3R1cmVzIHNob3VsZAorICoJYmUgZG9uZSBvbiByZWNlaXB0IG9mIHRoZSBhYm9ydCBpbnRlcnJ1cHQuCisgKgorICogSW5wdXRzIDogaG9zdCAtIFNDU0kgaG9zdAorICoKKyAqLworCitzdGF0aWMgaW50IAorYWJvcnRfY29ubmVjdGVkIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisjaWZkZWYgTkVXX0FCT1JUCisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyNlbmRpZgorICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKwlob3N0LT5ob3N0ZGF0YVswXTsKKy8qIEZJWE1FIDogdGhpcyBwcm9iYWJseSBzaG91bGQgY2hhbmdlIGZvciBwcm9kdWN0aW9uIGtlcm5lbHM7IGF0IHRoZSAKKyAgIGxlYXN0LCBjb3VudGVyIHNob3VsZCBtb3ZlIHRvIGEgcGVyLWhvc3Qgc3RydWN0dXJlLiAqLworICAgIHN0YXRpYyBpbnQgY291bnRlciA9IDU7CisjaWZkZWYgTkVXX0FCT1JUCisgICAgaW50IHNzdGF0LCBwaGFzZSwgb2Zmc2V0OworICAgIHUzMiAqc2NyaXB0OworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKyNlbmRpZgorCisgICAgaWYgKC0tY291bnRlciA8PSAwKSB7CisJZGlzYWJsZShob3N0KTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcmludGsgKCJzY3NpJWQgOiBEQU5HRVIgOiBhYm9ydF9jb25uZWN0ZWQoKSBjYWxsZWQgXG4iLAorCWhvc3QtPmhvc3Rfbm8pOworCisjaWZkZWYgTkVXX0FCT1JUCisKKy8qCisgKiBOZXcgc3RyYXRlZ3kgOiBSYXRoZXIgdGhhbiB1c2luZyBhIGdlbmVyaWMgYWJvcnQgcm91dGluZSwKKyAqIHdlJ2xsIHNwZWNpZmljYWxseSB0cnkgdG8gc291cmNlIG9yIHNpbmsgdGhlIGFwcHJvcHJpYXRlCisgKiBhbW91bnQgb2YgZGF0YSBmb3IgdGhlIHBoYXNlIHdlJ3JlIGN1cnJlbnRseSBpbiAodGFraW5nIGludG8gCisgKiBhY2NvdW50IHRoZSBjdXJyZW50IHN5bmNocm9ub3VzIG9mZnNldCkgCisgKi8KKworICAgIHNzdGF0ID0gKE5DUjUzYzh4MF9yZWFkOCAoU1NUQVQyX1JFRyk7CisgICAgb2Zmc2V0ID0gT0ZGU0VUIChzc3RhdCAmIFNTVEFUMl9GRl9NQVNLKSA+PiBTU1RBVDJfRkZfU0hJRlQ7CisgICAgcGhhc2UgPSBzc3RhdCAmIFNTVEFUMl9QSEFTRV9NQVNLOworCisvKgorICogU0VUIEFUTgorICogTU9WRSBzb3VyY2Vfb3Jfc2luaywgV0hFTiBDVVJSRU5UIFBIQVNFIAorICogPCByZXBlYXQgZm9yIGVhY2ggb3V0c3RhbmRpbmcgYnl0ZSA+CisgKiBKVU1QIHNlbmRfYWJvcnRfbWVzc2FnZQorICovCisKKyAgICBzY3JpcHQgPSBob3N0ZGF0YS0+YWJvcnRfc2NyaXB0ID0ga21hbGxvYyAoCisJOCAgLyogaW5zdHJ1Y3Rpb24gc2l6ZSAqLyAqICgKKwkgICAgMSAvKiBzZXQgQVROICovICsKKwkgICAgKCFvZmZzZXQgPyAxIDogb2Zmc2V0KSAvKiBPbmUgdHJhbnNmZXIgcGVyIG91dHN0YW5kaW5nIGJ5dGUgKi8gKworCSAgICAxIC8qIHNlbmQgYWJvcnQgbWVzc2FnZSAqLyksCisJR0ZQX0FUT01JQyk7CisKKworI2Vsc2UgLyogZGVmIE5FV19BQk9SVCAqLworICAgIGhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfaW5pdGlhdG9yX2Fib3J0IC8KKwkgICAgc2l6ZW9mKHUzMik7CisjZW5kaWYgLyogZGVmIE5FV19BQk9SVCAqLworICAgIGhvc3RkYXRhLT5kc3BfY2hhbmdlZCA9IDE7CisKKy8qIFhYWCAtIG5lZWQgdG8gZmxhZyB0aGUgY29tbWFuZCBhcyBhYm9ydGVkIGFmdGVyIHRoZSBhYm9ydF9jb25uZWN0ZWQKKyAJIGNvZGUgcnVucyAKKyAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IGRhdGFwYXRoX3Jlc2lkdWFsIChTY3NpX0hvc3QgKmhvc3QpCisgKgorICogUHVycG9zZSA6IHJldHVybiByZXNpZHVhbCBkYXRhIGNvdW50IG9mIHdoYXQncyBpbiB0aGUgY2hpcC4KKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gU0NTSSBob3N0CisgKi8KKworc3RhdGljIGludAorZGF0YXBhdGhfcmVzaWR1YWwgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIGludCBjb3VudCwgc3luY2hyb25vdXMsIHNzdGF0OworICAgIHVuc2lnbmVkIGludCBkZGlyOworCisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworICAgIC8qIENPTVBBVCA6IHRoZSA3MDAgYW5kIDcwMC02NiBuZWVkIHRvIHVzZSBERklGT18wMF9CT19NQVNLICovCisgICAgY291bnQgPSAoKE5DUjUzYzd4MF9yZWFkOCAoREZJRk9fUkVHKSAmIERGSUZPXzEwX0JPX01BU0spIC0KKwkoTkNSNTNjN3gwX3JlYWQzMiAoREJDX1JFRykgJiBERklGT18xMF9CT19NQVNLKSkgJiBERklGT18xMF9CT19NQVNLOworICAgIHN5bmNocm9ub3VzID0gTkNSNTNjN3gwX3JlYWQ4IChTWEZFUl9SRUcpICYgU1hGRVJfTU9fTUFTSzsKKyAgICAvKiBDT01QQVQgOiBERElSIGlzIGVsc2V3aGVyZSBvbiBub24tJzh4eCBjaGlwcy4gKi8KKyAgICBkZGlyID0gTkNSNTNjN3gwX3JlYWQ4IChDVEVTVDBfUkVHXzcwMCkgJiBDVEVTVDBfNzAwX0RESVI7CisKKyAgICBpZiAoZGRpcikgeworICAgIC8qIFJlY2VpdmUgKi8KKwlpZiAoc3luY2hyb25vdXMpIAorCSAgICBjb3VudCArPSAoTkNSNTNjN3gwX3JlYWQ4IChTU1RBVDJfUkVHKSAmIFNTVEFUMl9GRl9NQVNLKSA+PiBTU1RBVDJfRkZfU0hJRlQ7CisJZWxzZQorCSAgICBpZiAoTkNSNTNjN3gwX3JlYWQ4IChTU1RBVDFfUkVHKSAmIFNTVEFUMV9JTEYpCisJCSsrY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAvKiBTZW5kICovCisJc3N0YXQgPSBOQ1I1M2M3eDBfcmVhZDggKFNTVEFUMV9SRUcpOworCWlmIChzc3RhdCAmIFNTVEFUMV9PTEYpCisJICAgICsrY291bnQ7CisJaWYgKHN5bmNocm9ub3VzICYmIChzc3RhdCAmIFNTVEFUMV9PUkYpKQorCSAgICArK2NvdW50OworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgY29uc3QgY2hhciAqIHNiY2xfdG9fcGhhc2UgKGludCBzYmNsKV8KKyAqCisgKiBQdXJwb3NlIDogQ29udmVydCBTQkNMIHJlZ2lzdGVyIHRvIHVzZXItcGFyc2FibGUgcGhhc2UgcmVwcmVzZW50YXRpb24KKyAqCisgKiBJbnB1dHMgOiBzYmNsIC0gdmFsdWUgb2Ygc2JjbCByZWdpc3RlcgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2JjbF90b19waGFzZSAoaW50IHNiY2wpIHsKKyAgICBzd2l0Y2ggKHNiY2wgJiBTQkNMX1BIQVNFX01BU0spIHsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfREFUQUlOOgorCXJldHVybiAiREFUQUlOIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfREFUQU9VVDoKKwlyZXR1cm4gIkRBVEFPVVQiOworICAgIGNhc2UgU0JDTF9QSEFTRV9NU0dJTjoKKwlyZXR1cm4gIk1TR0lOIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfTVNHT1VUOgorCXJldHVybiAiTVNHT1VUIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfQ01ET1VUOgorCXJldHVybiAiQ01ET1VUIjsKKyAgICBjYXNlIFNCQ0xfUEhBU0VfU1RBVElOOgorCXJldHVybiAiU1RBVFVTSU4iOworICAgIGRlZmF1bHQ6CisJcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBzdGF0aWMgY29uc3QgY2hhciAqIHNzdGF0Ml90b19waGFzZSAoaW50IHNzdGF0KV8KKyAqCisgKiBQdXJwb3NlIDogQ29udmVydCBTU1RBVDIgcmVnaXN0ZXIgdG8gdXNlci1wYXJzYWJsZSBwaGFzZSByZXByZXNlbnRhdGlvbgorICoKKyAqIElucHV0cyA6IHNzdGF0IC0gdmFsdWUgb2Ygc3N0YXQgcmVnaXN0ZXIKKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NzdGF0Ml90b19waGFzZSAoaW50IHNzdGF0KSB7CisgICAgc3dpdGNoIChzc3RhdCAmIFNTVEFUMl9QSEFTRV9NQVNLKSB7CisgICAgY2FzZSBTU1RBVDJfUEhBU0VfREFUQUlOOgorCXJldHVybiAiREFUQUlOIjsKKyAgICBjYXNlIFNTVEFUMl9QSEFTRV9EQVRBT1VUOgorCXJldHVybiAiREFUQU9VVCI7CisgICAgY2FzZSBTU1RBVDJfUEhBU0VfTVNHSU46CisJcmV0dXJuICJNU0dJTiI7CisgICAgY2FzZSBTU1RBVDJfUEhBU0VfTVNHT1VUOgorCXJldHVybiAiTVNHT1VUIjsKKyAgICBjYXNlIFNTVEFUMl9QSEFTRV9DTURPVVQ6CisJcmV0dXJuICJDTURPVVQiOworICAgIGNhc2UgU1NUQVQyX1BIQVNFX1NUQVRJTjoKKwlyZXR1cm4gIlNUQVRVU0lOIjsKKyAgICBkZWZhdWx0OgorCXJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogc3RhdGljIHZvaWQgaW50cl9waGFzZV9taXNtYXRjaCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgKglzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBIYW5kbGUgcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0cworICoKKyAqIElucHV0cyA6IGhvc3QsIGNtZCAtIGhvc3QgYW5kIE5DUiBjb21tYW5kIGNhdXNpbmcgdGhlIGludGVycnVwdCwgY21kCisgKiAJbWF5IGJlIE5VTEwuCisgKgorICogU2lkZSBlZmZlY3RzIDogVGhlIGFib3J0X2Nvbm5lY3RlZCgpIHJvdXRpbmUgaXMgY2FsbGVkIG9yIHRoZSBOQ1IgY2hpcCAKKyAqCWlzIHJlc3RhcnRlZCwganVtcGluZyB0byB0aGUgY29tbWFuZF9jb21wbGV0ZSBlbnRyeSBwb2ludCwgb3IgCisgKglwYXRjaGluZyB0aGUgYWRkcmVzcyBhbmQgdHJhbnNmZXIgY291bnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gCisgKglhbmQgY2FsbGluZyB0aGUgbXNnX2luIGVudHJ5IHBvaW50IGFzIGFwcHJvcHJpYXRlLgorICovCisKK3N0YXRpYyB2b2lkIAoraW50cl9waGFzZV9taXNtYXRjaCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdTMyIGRiY19kY21kLCAqZHNwLCAqZHNwX25leHQ7CisgICAgdW5zaWduZWQgY2hhciBkY21kLCBzYmNsOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikKKyAgICAJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgaW50IHJlc2lkdWFsOworICAgIGVudW0ge0FDVElPTl9BQk9SVCwgQUNUSU9OX0FCT1JUX1BSSU5ULCBBQ1RJT05fQ09OVElOVUV9IGFjdGlvbiA9IAorCUFDVElPTl9BQk9SVF9QUklOVDsKKyAgICBjb25zdCBjaGFyICp3aGVyZSA9IE5VTEw7CisKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICAvKgorICAgICAqIENvcnJlY3RpdmUgYWN0aW9uIGlzIGJhc2VkIG9uIHdoZXJlIGluIHRoZSBTQ1NJIFNDUklQVCh0bSkgdGhlIGVycm9yIAorICAgICAqIG9jY3VycmVkLCBhcyB3ZWxsIGFzIHdoaWNoIFNDU0kgcGhhc2Ugd2UgYXJlIGN1cnJlbnRseSBpbi4KKyAgICAgKi8KKyAgICBkc3BfbmV4dCA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNQX1JFRykpOworCisgICAgLyogCisgICAgICogRmV0Y2ggdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24sIGFuZCByZW1vdmUgdGhlIG9wZXJhbmRzIGZvciBlYXNpZXIgCisgICAgICogaW50ZXJwcmV0YXRpb24uCisgICAgICovCisgICAgZGJjX2RjbWQgPSBOQ1I1M2M3eDBfcmVhZDMyKERCQ19SRUcpOworICAgIGRjbWQgPSAoZGJjX2RjbWQgJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgICAvKgorICAgICAqIExpa2Ugb3RoZXIgcHJvY2Vzc29ycywgdGhlIE5DUiBhZGp1c3RzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGJlZm9yZQorICAgICAqIGluc3RydWN0aW9uIGRlY29kZS4gIFNldCB0aGUgRFNQIGFkZHJlc3MgYmFjayB0byB3aGF0IGl0IHNob3VsZAorICAgICAqIGJlIGZvciB0aGlzIGluc3RydWN0aW9uIGJhc2VkIG9uIGl0cyBzaXplICgyIG9yIDMgMzIgYml0IHdvcmRzKS4KKyAgICAgKi8KKyAgICBkc3AgPSBkc3BfbmV4dCAtIE5DUjUzYzd4MF9pbnNuX3NpemUoZGNtZCk7CisKKworICAgIC8qCisgICAgICogUmVhZCBuZXcgU0NTSSBwaGFzZSBmcm9tIHRoZSBTQkNMIGxpbmVzLiAgU2luY2UgYWxsIG9mIG91ciBjb2RlIHVzZXMgCisgICAgICogYSBXSEVOIGNvbmRpdGlvbmFsIGluc3RlYWQgb2YgYW4gSUYgY29uZGl0aW9uYWwsIHdlIGRvbid0IG5lZWQgdG8gCisgICAgICogd2FpdCBmb3IgYSBuZXcgUkVRLgorICAgICAqLworICAgIHNiY2wgPSBOQ1I1M2M3eDBfcmVhZDgoU0JDTF9SRUcpICYgU0JDTF9QSEFTRV9NQVNLOworCisgICAgaWYgKCFjbWQpIHsKKwlhY3Rpb24gPSBBQ1RJT05fQUJPUlRfUFJJTlQ7CisJd2hlcmUgPSAibm8gY3VycmVudCBjb21tYW5kIjsKKyAgICAvKgorICAgICAqIFRoZSB3YXkgbXkgU0NTSSBTQ1JJUFRTKHRtKSBhcmUgYXJjaGl0ZWN0ZWQsIHJlY292ZXJhYmxlIHBoYXNlCisgICAgICogbWlzbWF0Y2hlcyBzaG91bGQgb25seSBvY2N1ciB3aGVyZSB3ZSdyZSBkb2luZyBhIG11bHRpLWJ5dGUgIAorICAgICAqIEJNSSBpbnN0cnVjdGlvbi4gIFNwZWNpZmljYWxseSwgdGhpcyBtZWFucyAKKyAgICAgKgorICAgICAqICAtIHNlbGVjdCBtZXNzYWdlcyAoYSBTQ1NJLUkgdGFyZ2V0IG1heSBpZ25vcmUgYWRkaXRpb25hbCBtZXNzYWdlcworICAgICAqIAkJYWZ0ZXIgdGhlIElERU5USUZZOyBhbnkgdGFyZ2V0IG1heSByZWplY3QgYSBTRFRSIG9yIFdEVFIpCisgICAgICoKKyAgICAgKiAgLSBjb21tYW5kIG91dCAodGFyZ2V0cyBtYXkgc2VuZCBhIG1lc3NhZ2UgdG8gc2lnbmFsIGFuIGVycm9yIAorICAgICAqIAkJY29uZGl0aW9uLCBvciBnbyBpbnRvIFNUQVRVU0lOIGFmdGVyIHRoZXkndmUgZGVjaWRlZCAKKyAgICAgKgkJdGhleSBkb24ndCBsaWtlIHRoZSBjb21tYW5kLgorICAgICAqCisgICAgICoJLSByZXBseV9tZXNzYWdlICh0YXJnZXRzIG1heSByZWplY3QgYSBtdWx0aS1ieXRlIG1lc3NhZ2UgaW4gdGhlIAorICAgICAqCQltaWRkbGUpCisgICAgICoKKyAgICAgKiAJLSBkYXRhIHRyYW5zZmVyIHJvdXRpbmVzIChjb21tYW5kIGNvbXBsZXRpb24gd2l0aCBidWZmZXIgc3BhY2UKKyAgICAgKgkJbGVmdCwgZGlzY29ubmVjdCBtZXNzYWdlLCBvciBlcnJvciBtZXNzYWdlKQorICAgICAqLworICAgIH0gZWxzZSBpZiAoKChkc3AgPj0gY21kLT5kYXRhX3RyYW5zZmVyX3N0YXJ0ICYmIAorCWRzcCA8IGNtZC0+ZGF0YV90cmFuc2Zlcl9lbmQpKSB8fCBkc3AgPT0gKGNtZC0+cmVzaWR1YWwgKyAyKSkgeworCWlmICgoZGNtZCAmIChEQ01EX1RZUEVfTUFTS3xEQ01EX0JNSV9PUF9NQVNLfERDTURfQk1JX0lORElSRUNUfAorCQlEQ01EX0JNSV9NU0d8RENNRF9CTUlfQ0QpKSA9PSAoRENNRF9UWVBFX0JNSXwKKwkJRENNRF9CTUlfT1BfTU9WRV9JKSkgeworCSAgICByZXNpZHVhbCA9IGRhdGFwYXRoX3Jlc2lkdWFsIChob3N0KTsKKwkgICAgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QpCisJICAgIAlwcmludGsgKCJzY3NpJWQgOiBoYW5kbGluZyByZXNpZHVhbCB0cmFuc2ZlciAoKyAlZCBieXRlcyBmcm9tIERNQSBGSUZPKVxuIiwgCisJCSAgICBob3N0LT5ob3N0X25vLCByZXNpZHVhbCk7CisKKwkgICAgLyoKKwkgICAgICogVGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgQ0FMTCB0byB0aGUgYWx0ZXJuYXRlIGhhbmRsZXIgZm9yIAorCSAgICAgKiB0aGlzIGRhdGEgdHJhbnNmZXIgcGhhc2UsIHNvIHdlIGNhbiBkbyBjYWxscyB0byAKKwkgICAgICogbXVuZ2VfbXNnX3Jlc3RhcnQgYXMgd2Ugd291bGQgaWYgY29udHJvbCB3ZXJlIHBhc3NlZCAKKwkgICAgICogZnJvbSBub3JtYWwgZHluYW1pYyBjb2RlLgorCSAgICAgKi8KKwkgICAgaWYgKGRzcCAhPSBjbWQtPnJlc2lkdWFsICsgMikgeworCQljbWQtPnJlc2lkdWFsWzBdID0gKChEQ01EX1RZUEVfVENJIHwgRENNRF9UQ0lfT1BfQ0FMTCB8CisJCQkoKGRjbWQgJiBEQ01EX0JNSV9JTykgPyBEQ01EX1RDSV9JTyA6IDApKSA8PCAyNCkgfCAKKwkJICAgIERCQ19UQ0lfV0FJVF9GT1JfVkFMSUQgfCBEQkNfVENJX0NPTVBBUkVfUEhBU0U7CisJCWNtZC0+cmVzaWR1YWxbMV0gPSB2aXJ0X3RvX2J1cyhob3N0ZGF0YS0+c2NyaXB0KQorCQkgICAgKyAoKGRjbWQgJiBEQ01EX0JNSV9JTykKKwkJICAgICAgID8gaG9zdGRhdGEtPkVfb3RoZXJfaW4gOiBob3N0ZGF0YS0+RV9vdGhlcl9vdXQpOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogVGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpcyB0aGUgYSBkYXRhIHRyYW5zZmVyIGJsb2NrCisJICAgICAqIG1vdmUgaW5zdHJ1Y3Rpb24sIHJlZmxlY3RpbmcgdGhlIHBvaW50ZXIgYW5kIGNvdW50IGF0IHRoZSAKKwkgICAgICogdGltZSBvZiB0aGUgcGhhc2UgbWlzbWF0Y2guCisJICAgICAqLworCSAgICBjbWQtPnJlc2lkdWFsWzJdID0gZGJjX2RjbWQgKyByZXNpZHVhbDsKKwkgICAgY21kLT5yZXNpZHVhbFszXSA9IE5DUjUzYzd4MF9yZWFkMzIoRE5BRF9SRUcpIC0gcmVzaWR1YWw7CisKKwkgICAgLyoKKwkgICAgICogVGhlIHRoaXJkIGFuZCBmaW5hbCBpbnN0cnVjdGlvbiBpcyBhIGp1bXAgdG8gdGhlIGluc3RydWN0aW9uCisJICAgICAqIHdoaWNoIGZvbGxvd3MgdGhlIGluc3RydWN0aW9uIHdoaWNoIGhhZCB0byBiZSAnc3BsaXQnCisJICAgICAqLworCSAgICBpZiAoZHNwICE9IGNtZC0+cmVzaWR1YWwgKyAyKSB7CisJCWNtZC0+cmVzaWR1YWxbNF0gPSAoKERDTURfVFlQRV9UQ0l8RENNRF9UQ0lfT1BfSlVNUCkgCisJCSAgICA8PCAyNCkgfCBEQkNfVENJX1RSVUU7CisJCWNtZC0+cmVzaWR1YWxbNV0gPSB2aXJ0X3RvX2J1cyhkc3BfbmV4dCk7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgdHJhbnNmZXIgY29udHJvbCB0byB0aGUgCisJICAgICAqIGNvbmRpdGlvbmFsIENBTEwgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZXNpZHVhbCBidWZmZXIuCisJICAgICAqLworCSAgICBob3N0ZGF0YS0+ZHNwID0gY21kLT5yZXNpZHVhbDsKKwkgICAgaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgYWN0aW9uID0gQUNUSU9OX0NPTlRJTlVFOworCX0gZWxzZSB7CisJICAgIHdoZXJlID0gIm5vbi1CTUkgZHluYW1pYyBEU0EgY29kZSI7CisJICAgIGFjdGlvbiA9IEFDVElPTl9BQk9SVF9QUklOVDsKKwl9CisgICAgfSBlbHNlIGlmIChkc3AgPT0gKGhvc3RkYXRhLT5zY3JpcHQgKyBob3N0ZGF0YS0+RV9zZWxlY3RfbXNnb3V0IC8gNCArIDIpKSB7CisJLyogUkdIIDI5MDY5NzogIEFkZGVkICsyIGFib3ZlLCB0byBjb21wZW5zYXRlIGZvciB0aGUgc2NyaXB0CisJICogaW5zdHJ1Y3Rpb24gd2hpY2ggZGlzYWJsZXMgdGhlIHNlbGVjdGlvbiB0aW1lci4gKi8KKwkvKiBSZWxlYXNlIEFUTiAqLworCU5DUjUzYzd4MF93cml0ZTggKFNPQ0xfUkVHLCAwKTsKKwlzd2l0Y2ggKHNiY2wpIHsKKyAgICAvKiAKKyAgICAgKiBTb21lIGRldmljZXMgKFNRNTU1IGNvbWUgdG8gbWluZCkgZ3JhYiB0aGUgSURFTlRJRlkgbWVzc2FnZQorICAgICAqIHNlbnQgb24gc2VsZWN0aW9uLCBhbmQgZGVjaWRlIHRvIGdvIGludG8gQ09NTUFORCBPVVQgcGhhc2UKKyAgICAgKiByYXRoZXIgdGhhbiBhY2NlcHRpbmcgdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2VzIG9yIHJlamVjdGluZworICAgICAqIHRoZW0uICBIYW5kbGUgdGhlc2UgZGV2aWNlcyBncmFjZWZ1bGx5LgorICAgICAqLworCWNhc2UgU0JDTF9QSEFTRV9DTURPVVQ6CisJICAgIGhvc3RkYXRhLT5kc3AgPSBkc3AgKyAyIC8qIHR3byBfd29yZHNfICovOworCSAgICBob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCSAgICBwcmludGsgKCJzY3NpJWQgOiB0YXJnZXQgJWQgaWdub3JlZCBTRFRSIGFuZCB3ZW50IGludG8gQ09NTUFORCBPVVRcbiIsIAorCQlob3N0LT5ob3N0X25vLCBjbWQtPmNtZC0+ZGV2aWNlLT5pZCk7CisJICAgIGNtZC0+ZmxhZ3MgJj0gfkNNRF9GTEFHX1NEVFI7CisJICAgIGFjdGlvbiA9IEFDVElPTl9DT05USU5VRTsKKwkgICAgYnJlYWs7CisJY2FzZSBTQkNMX1BIQVNFX01TR0lOOgorCSAgICBob3N0ZGF0YS0+ZHNwID0gaG9zdGRhdGEtPnNjcmlwdCArIGhvc3RkYXRhLT5FX21zZ19pbiAvIAorCQlzaXplb2YodTMyKTsKKwkgICAgaG9zdGRhdGEtPmRzcF9jaGFuZ2VkID0gMTsKKwkgICAgYWN0aW9uID0gQUNUSU9OX0NPTlRJTlVFOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICB3aGVyZT0ic2VsZWN0IG1lc3NhZ2Ugb3V0IjsKKwkgICAgYWN0aW9uID0gQUNUSU9OX0FCT1JUX1BSSU5UOworCX0KKyAgICAvKgorICAgICAqIFNvbWUgU0NTSSBkZXZpY2VzIHdpbGwgaW50ZXJwcmV0IGEgY29tbWFuZCBhcyB0aGV5IHJlYWQgdGhlIGJ5dGVzCisgICAgICogb2ZmIHRoZSBTQ1NJIGJ1cywgYW5kIG1heSBkZWNpZGUgdGhhdCB0aGUgY29tbWFuZCBpcyBCb2d1cyBiZWZvcmUgCisgICAgICogdGhleSd2ZSByZWFkIHRoZSBlbnRpcmUgY29tbWFuZCBvZmYgdGhlIGJ1cy4KKyAgICAgKi8KKyAgICB9IGVsc2UgaWYgKGRzcCA9PSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfY21kb3V0X2NtZG91dCAvIHNpemVvZiAKKwkodTMyKSkgeworCWhvc3RkYXRhLT5kc3AgPSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfZGF0YV90cmFuc2ZlciAvCisJICAgIHNpemVvZiAodTMyKTsKKwlob3N0ZGF0YS0+ZHNwX2NoYW5nZWQgPSAxOworCWFjdGlvbiA9IEFDVElPTl9DT05USU5VRTsKKyAgICAvKiBGSVhNRSA6IHdlIG5lZWQgdG8gaGFuZGxlIG1lc3NhZ2UgcmVqZWN0LCBldGMuIHdpdGhpbiBtc2dfcmVzcG9uZC4gKi8KKyNpZmRlZiBub3R5ZXQKKyAgICB9IGVsc2UgaWYgKGRzcCA9PSBob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfcmVwbHlfbWVzc2FnZSkgeworCXN3aXRjaCAoc2JjbCkgeworICAgIC8qIEFueSBvdGhlciBwaGFzZSBtaXNtYXRjaGVzIGFib3J0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQuICAqLworI2VuZGlmCisgICAgfSBlbHNlIHsKKwl3aGVyZSA9ICJ1bmtub3duIGxvY2F0aW9uIjsKKwlhY3Rpb24gPSBBQ1RJT05fQUJPUlRfUFJJTlQ7CisgICAgfQorCisgICAgLyogRmx1c2ggRE1BIEZJRk8gKi8KKyAgICBpZiAoIWhvc3RkYXRhLT5kc3RhdF92YWxpZCkgeworCWhvc3RkYXRhLT5kc3RhdCA9IE5DUjUzYzd4MF9yZWFkOChEU1RBVF9SRUcpOworCWhvc3RkYXRhLT5kc3RhdF92YWxpZCA9IDE7CisgICAgfQorICAgIGlmICghKGhvc3RkYXRhLT5kc3RhdCAmIERTVEFUX0RGRSkpIHsKKyAgICAgIC8qIFJlYWxseSBuZWVkIHRvIGNoZWNrIHRoaXMgb3V0IGZvciA3MTAgUkdIICovCisgICAgICBOQ1I1M2M3eDBfd3JpdGU4IChDVEVTVDhfUkVHLCBDVEVTVDhfMTBfQ0xGKTsKKyAgICAgIHdoaWxlIChOQ1I1M2M3eDBfcmVhZDggKENURVNUOF9SRUcpICYgQ1RFU1Q4XzEwX0NMRik7CisgICAgICBob3N0ZGF0YS0+ZHN0YXQgfD0gRFNUQVRfREZFOworICAgIH0KKworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgY2FzZSBBQ1RJT05fQUJPUlRfUFJJTlQ6CisJcHJpbnRrKCJzY3NpJWQgOiAlcyA6IHVuZXhwZWN0ZWQgcGhhc2UgJXMuXG4iLAorCSAgICAgaG9zdC0+aG9zdF9ubywgd2hlcmUgPyB3aGVyZSA6ICJ1bmtub3duIGxvY2F0aW9uIiwgCisJICAgICBzYmNsX3RvX3BoYXNlKHNiY2wpKTsKKwlwcmludF9sb3RzIChob3N0KTsKKyAgICAvKiBGYWxsIHRocm91Z2ggdG8gQUNUSU9OX0FCT1JUICovCisgICAgY2FzZSBBQ1RJT05fQUJPUlQ6CisJYWJvcnRfY29ubmVjdGVkIChob3N0KTsKKwlicmVhazsKKyAgICBjYXNlIEFDVElPTl9DT05USU5VRToKKwlicmVhazsKKyAgICB9CisKKyNpZiAwCisgICAgaWYgKGhvc3RkYXRhLT5kc3BfY2hhbmdlZCkgeworCXByaW50aygic2NzaSVkOiBuZXcgZHNwIDB4JXBcbiIsIGhvc3QtPmhvc3Rfbm8sIGhvc3RkYXRhLT5kc3ApOworCXByaW50X2luc24gKGhvc3QsIGhvc3RkYXRhLT5kc3AsICIiLCAxKTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIHZvaWQgaW50cl9iZiAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgCisgKiAJc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogaGFuZGxlIEJVUyBGQVVMVCBpbnRlcnJ1cHRzIAorICoKKyAqIElucHV0cyA6IGhvc3QsIGNtZCAtIGhvc3QgYW5kIE5DUiBjb21tYW5kIGNhdXNpbmcgdGhlIGludGVycnVwdCwgY21kCisgKiAJbWF5IGJlIE5VTEwuCisgKi8KKworc3RhdGljIHZvaWQKK2ludHJfYmYgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHUzMiAqZHNwLAorCSpuZXh0X2RzcCwJCS8qIEN1cnJlbnQgZHNwICovCisgICAgCSpkc2EsCisJZGJjX2RjbWQ7CQkvKiBEQ01EIChoaWdoIGVpZ2h0IGJpdHMpICsgREJDICovCisgICAgY2hhciAqcmVhc29uID0gTlVMTDsKKyAgICAvKiBEZWZhdWx0IGJlaGF2aW9yIGlzIGZvciBhIHNpbGVudCBlcnJvciwgd2l0aCBhIHJldHJ5IHVudGlsIHdlJ3ZlCisgICAgICAgZXhoYXVzdGVkIHJldHJpZXMuICovCisgICAgZW51bSB7TUFZQkUsIEFMV0FZUywgTkVWRVJ9IHJldHJ5ID0gTUFZQkU7CisgICAgaW50IHJlcG9ydCA9IDA7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgZGJjX2RjbWQgPSBOQ1I1M2M3eDBfcmVhZDMyIChEQkNfUkVHKTsKKyAgICBuZXh0X2RzcCA9IGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTUF9SRUcpKTsKKyAgICBkc3AgPSBuZXh0X2RzcCAtIE5DUjUzYzd4MF9pbnNuX3NpemUgKChkYmNfZGNtZCA+PiAyNCkgJiAweGZmKTsKKy8qIEZJWE1FIC0gY2hlY2sgY2hpcCB0eXBlICAqLworICAgIGRzYSA9IGJ1c190b192aXJ0IChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKworICAgIC8qCisgICAgICogQnVzIGZhdWx0cyBjYW4gYmUgY2F1c2VkIGJ5IGVpdGhlciBhIEJhZCBBZGRyZXNzIG9yIAorICAgICAqIFRhcmdldCBBYm9ydC4gV2Ugc2hvdWxkIGNoZWNrIHRoZSBSZWNlaXZlZCBUYXJnZXQgQWJvcnQKKyAgICAgKiBiaXQgb2YgdGhlIFBDSSBzdGF0dXMgcmVnaXN0ZXIgYW5kIE1hc3RlciBBYm9ydCBCaXQuCisgICAgICoKKyAgICAgKiAJLSBNYXN0ZXIgQWJvcnQgYml0IGluZGljYXRlcyB0aGF0IG5vIGRldmljZSBjbGFpbWVkCisgICAgICoJCXRoZSBhZGRyZXNzIHdpdGggREVWU0VMIHdpdGhpbiBmaXZlIGNsb2NrcworICAgICAqCisgICAgICoJLSBUYXJnZXQgQWJvcnQgYml0IGluZGljYXRlcyB0aGF0IGEgdGFyZ2V0IGNsYWltZWQgaXQsCisgICAgICoJCWJ1dCBjaGFuZ2VkIGl0cyBtaW5kIG9uY2UgaXQgc2F3IHRoZSBieXRlIGVuYWJsZXMuCisgICAgICoKKyAgICAgKi8KKworICAgIC8qIDUzYzcxMCwgbm90IFBDSSBzeXN0ZW0gKi8KKyAgICByZXBvcnQgPSAxOworICAgIHJlYXNvbiA9ICJVbmtub3duIjsKKworI2lmbmRlZiBub3R5ZXQKKyAgICByZXBvcnQgPSAxOworI2VuZGlmCisgICAgaWYgKHJlcG9ydCAmJiByZWFzb24pCisgICAgeworCXByaW50ayhLRVJOX0FMRVJUICJzY3NpJWQgOiBCVVMgRkFVTFQgcmVhc29uID0gJXNcbiIsCisJICAgICBob3N0LT5ob3N0X25vLCByZWFzb24gPyByZWFzb24gOiAidW5rbm93biIpOworCXByaW50X2xvdHMgKGhvc3QpOworICAgIH0KKworI2lmbmRlZiBub3R5ZXQKKyAgICByZXRyeSA9IE5FVkVSOworI2VuZGlmCisKKyAgICAvKiAKKyAgICAgKiBUT0RPIDogd2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGFueSBzcHVyaW91cyBidXMgCisgICAgICogZmF1bHRzLiAgQWZ0ZXIgWCByZXRyaWVzLCB3ZSBzaG91bGQgZmlndXJlIHRoYXQgdGhpbmdzIGFyZSAKKyAgICAgKiBzdWZmaWNpZW50bHkgd2VkZ2VkLCBhbmQgY2FsbCBOQ1I1M2M3eHhfcmVzZXQuCisgICAgICoKKyAgICAgKiBUaGlzIGNvZGUgc2hvdWxkIG9ubHkgZ2V0IGV4ZWN1dGVkIG9uY2Ugd2UndmUgZGVjaWRlZCB0aGF0IHdlIAorICAgICAqIGNhbm5vdCByZXRyeS4KKyAgICAgKi8KKworICAgIGlmIChyZXRyeSA9PSBORVZFUikgeworICAgIAlwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgIG1haWwgcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrXG4iKTsKKyAgICAJRkFUQUwgKGhvc3QpOworICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIHZvaWQgaW50cl9kbWEgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIAorICogCXN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpCisgKgorICogUHVycG9zZSA6IGhhbmRsZSBhbGwgRE1BIGludGVycnVwdHMsIGluZGljYXRlZCBieSB0aGUgc2V0dGluZyAKKyAqIAlvZiB0aGUgRElQIGJpdCBpbiB0aGUgSVNUQVQgcmVnaXN0ZXIuCisgKgorICogSW5wdXRzIDogaG9zdCwgY21kIC0gaG9zdCBhbmQgTkNSIGNvbW1hbmQgY2F1c2luZyB0aGUgaW50ZXJydXB0LCBjbWQKKyAqIAltYXkgYmUgTlVMTC4KKyAqLworCitzdGF0aWMgdm9pZCAKK2ludHJfZG1hIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqY21kKSB7CisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdW5zaWduZWQgY2hhciBkc3RhdDsJLyogRFNUQVQgKi8JCisgICAgdTMyICpkc3AsCisJKm5leHRfZHNwLAkJLyogQ3VycmVudCBkc3AgKi8KKyAgICAJKmRzYSwKKwlkYmNfZGNtZDsJCS8qIERDTUQgKGhpZ2ggZWlnaHQgYml0cykgKyBEQkMgKi8KKyAgICBpbnQgdG1wOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgaWYgKCFob3N0ZGF0YS0+ZHN0YXRfdmFsaWQpIHsKKwlob3N0ZGF0YS0+ZHN0YXQgPSBOQ1I1M2M3eDBfcmVhZDgoRFNUQVRfUkVHKTsKKwlob3N0ZGF0YS0+ZHN0YXRfdmFsaWQgPSAxOworICAgIH0KKyAgICAKKyAgICBkc3RhdCA9IGhvc3RkYXRhLT5kc3RhdDsKKyAgICAKKyAgICBpZiAoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fREVCVUdfSU5UUikKKwlwcmludGsoInNjc2klZCA6IERTVEFUPTB4JXhcbiIsIGhvc3QtPmhvc3Rfbm8sIChpbnQpIGRzdGF0KTsKKworICAgIGRiY19kY21kID0gTkNSNTNjN3gwX3JlYWQzMiAoREJDX1JFRyk7CisgICAgbmV4dF9kc3AgPSBidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTUF9SRUcpKTsKKyAgICBkc3AgPSBuZXh0X2RzcCAtIE5DUjUzYzd4MF9pbnNuX3NpemUgKChkYmNfZGNtZCA+PiAyNCkgJiAweGZmKTsKKy8qIFhYWCAtIGNoZWNrIGNoaXAgdHlwZSAqLworICAgIGRzYSA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIoRFNBX1JFRykpOworCisgICAgLyoKKyAgICAgKiBEU1RBVF9BQlJUIGlzIHRoZSBhYm9ydGVkIGludGVycnVwdC4gIFRoaXMgaXMgc2V0IHdoZW5ldmVyIHRoZSAKKyAgICAgKiBTQ1NJIGNoaXAgaXMgYWJvcnRlZC4gIAorICAgICAqIAorICAgICAqIFdpdGggTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgc3R5bGUgY2hpcHMsIHdlIHNob3VsZCBvbmx5IAorICAgICAqIGdldCB0aGlzIHdoZW4gdGhlIGNoaXAgaXMgY3VycmVudGx5IHJ1bm5pbmcgdGhlIGFjY2VwdCAKKyAgICAgKiByZXNlbGVjdC9zZWxlY3QgY29kZSBhbmQgd2UgaGF2ZSBzZXQgdGhlIGFib3J0IGJpdCBpbiB0aGUgCisgICAgICogSVNUQVQgcmVnaXN0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBpZiAoZHN0YXQgJiBEU1RBVF9BQlJUKSB7CisjaWYgMAorCS8qIFhYWCAtIGFkZCBjb2RlIGhlcmUgdG8gZGVhbCB3aXRoIG5vcm1hbCBhYm9ydCAqLworCWlmICgoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fNzAwKSAmJiAoaG9zdGRhdGEtPnN0YXRlID09CisJICAgIFNUQVRFX0FCT1JUSU5HKSkgeworCX0gZWxzZSAKKyNlbmRpZgorCXsKKwkgICAgcHJpbnRrKEtFUk5fQUxFUlQgInNjc2klZCA6IHVuZXhwZWN0ZWQgYWJvcnQgaW50ZXJydXB0IGF0XG4iIAorCQkgICAiICAgICAgICAgIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIHByaW50X2luc24gKGhvc3QsIGRzcCwgS0VSTl9BTEVSVCAicyAiLCAxKTsKKwkgICAgRkFUQUwgKGhvc3QpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIERTVEFUX1NTSSBpcyB0aGUgc2luZ2xlIHN0ZXAgaW50ZXJydXB0LiAgU2hvdWxkIGJlIGdlbmVyYXRlZCAKKyAgICAgKiB3aGVuZXZlciB3ZSBoYXZlIHNpbmdsZSBzdGVwcGVkIG9yIGFyZSB0cmFjaW5nLgorICAgICAqLworCisgICAgaWYgKGRzdGF0ICYgRFNUQVRfU1NJKSB7CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1RSQUNFKSB7CisJICAgIC8qIERvbid0IHByaW50IGluc3RyLiB1bnRpbCB3ZSB3cml0ZSBEU1AgYXQgZW5kIG9mIGludHIgZnVuY3Rpb24gKi8KKwl9IGVsc2UgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX1NJTkdMRSkgeworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsICJzICIsIDApOworCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisvKiBYWFggLSBzaG91bGQgd2UgZG8gdGhpcywgb3IgY2FuIHdlIGdldCBhd2F5IHdpdGggd3JpdGluZyBkc3A/ICovCisKKwkgICAgTkNSNTNjN3gwX3dyaXRlOCAoRENOVExfUkVHLCAoTkNSNTNjN3gwX3JlYWQ4KERDTlRMX1JFRykgJiAKKyAgICAJICAgIAl+RENOVExfU1NNKSB8IERDTlRMX1NURCk7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9BTEVSVCAic2NzaSVkIDogdW5leHBlY3RlZCBzaW5nbGUgc3RlcCBpbnRlcnJ1cHQgYXRcbiIKKwkJICAgIiAgICAgICAgICIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsIEtFUk5fQUxFUlQgIiIsIDEpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgbWFpbCBkcmV3QFBvb2hTdGlja3MuT1JHXG4iKTsKKyAgICAJICAgIEZBVEFMIChob3N0KTsKKyAgICAJfQorICAgIH0KKworICAgIC8qCisgICAgICogRFNUQVRfSUlEIC8gRFNUQVRfT1BDIChzYW1lIGJpdCwgc2FtZSBtZWFuaW5nLCBvbmx5IHRoZSBuYW1lIAorICAgICAqIGlzIGRpZmZlcmVudCkgaXMgZ2VuZXJhdGVkIHdoZW5ldmVyIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gaXMgCisgICAgICogZW5jb3VudGVyZWQuICAKKyAgICAgKiAKKyAgICAgKiBYWFggLSB3ZSBtYXkgd2FudCB0byBlbXVsYXRlIElOVEZMWSBoZXJlLCBzbyB3ZSBjYW4gdXNlIAorICAgICAqICAgIHRoZSBzYW1lIFNDU0kgU0NSSVBUICh0bSkgZm9yIE5DUjUzYzcxMCB0aHJvdWdoIE5DUjUzYzgxMCAgCisgICAgICoJICBjaGlwcy4KKyAgICAgKi8KKworICAgIGlmIChkc3RhdCAmIERTVEFUX09QQykgeworICAgIC8qIAorICAgICAqIEFzY2VydGFpbiBpZiB0aGlzIElJRCBpbnRlcnJ1cHRzIG9jY3VycmVkIGJlZm9yZSBvciBhZnRlciBhIFNUTyAKKyAgICAgKiBpbnRlcnJ1cHQuICBTaW5jZSB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgbm93IGxlYXZlcyAKKyAgICAgKiBEU1AgdW5tb2RpZmllZCB1bnRpbCBfYWZ0ZXJfIGFsbCBzdGFja2VkIGludGVycnVwdHMgaGF2ZSBiZWVuCisgICAgICogcHJvY2Vzc2VkLCByZWFkaW5nIHRoZSBEU1AgcmV0dXJucyB0aGUgb3JpZ2luYWwgRFNQIHJlZ2lzdGVyLgorICAgICAqIFRoaXMgbWVhbnMgdGhhdCBpZiBkc3AgbGllcyBiZXR3ZWVuIHRoZSBzZWxlY3QgY29kZSwgYW5kIAorICAgICAqIG1lc3NhZ2Ugb3V0IGZvbGxvd2luZyB0aGUgc2VsZWN0aW9uIGNvZGUgKHdoZXJlIHRoZSBJSUQgaW50ZXJydXB0CisgICAgICogd291bGQgaGF2ZSB0byBoYXZlIG9jY3VycmVkIGJ5IGR1ZSB0byB0aGUgaW1wbGljaXQgd2FpdCBmb3IgUkVRKSwKKyAgICAgKiB3ZSBoYXZlIGFuIElJRCBpbnRlcnJ1cHQgcmVzdWx0aW5nIGZyb20gYSBTVE8gY29uZGl0aW9uIGFuZCAKKyAgICAgKiBjYW4gaWdub3JlIGl0LgorICAgICAqLworCisJaWYgKCgoZHNwID49IChob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfc2VsZWN0IC8gc2l6ZW9mKHUzMikpKSAmJgorCSAgICAoZHNwIDw9IChob3N0ZGF0YS0+c2NyaXB0ICsgaG9zdGRhdGEtPkVfc2VsZWN0X21zZ291dCAvIAorICAgIAkgICAgc2l6ZW9mKHUzMikgKyA4KSkpIHx8IChob3N0ZGF0YS0+dGVzdF9ydW5uaW5nID09IDIpKSB7CisJICAgIGlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19JTlRSKSAKKwkJcHJpbnRrICgic2NzaSVkIDogaWdub3JpbmcgRFNUQVRfSUlEIGZvciBTU1RBVF9TVE9cbiIsCisJCSAgICBob3N0LT5ob3N0X25vKTsKKwkgICAgaWYgKGhvc3RkYXRhLT5leHBlY3RpbmdfaWlkKSB7CisJCWhvc3RkYXRhLT5leHBlY3RpbmdfaWlkID0gMDsKKwkJaG9zdGRhdGEtPmlkbGUgPSAxOworCQlpZiAoaG9zdGRhdGEtPnRlc3RfcnVubmluZyA9PSAyKSB7CisJCSAgICBob3N0ZGF0YS0+dGVzdF9ydW5uaW5nID0gMDsKKwkJICAgIGhvc3RkYXRhLT50ZXN0X2NvbXBsZXRlZCA9IDM7CisJCX0gZWxzZSBpZiAoY21kKSAKKwkJCWFibm9ybWFsX2ZpbmlzaGVkIChjbWQsIERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkgICAgfSBlbHNlIHsKKwkJaG9zdGRhdGEtPmV4cGVjdGluZ19zdG8gPSAxOworCSAgICB9CisgICAgLyoKKyAgICAgKiBXZSBjYW4ndCBndWFyYW50ZWUgd2UnbGwgYmUgYWJsZSB0byBleGVjdXRlIHRoZSBXQUlUIERJU0NPTk5FQ1QKKyAgICAgKiBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIDMuNHVzIG9mIGJ1cyBmcmVlIGFuZCBhcmJpdHJhdGlvbiBkZWxheQorICAgICAqIHRoYXQgYSB0YXJnZXQgY2FuIFJFU0VMRUNUIGluIGFuZCBhc3NlcnQgUkVRIGFmdGVyIHdlJ3ZlIGRyb3BwZWQKKyAgICAgKiBBQ0suICBJZiB0aGlzIGhhcHBlbnMsIHdlJ2xsIGdldCBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGludGVycnVwdC4KKyAgICAgKiBEb2luZyBhd2F5IHdpdGggdGhlIFdBSVQgRElTQ09OTkVDVCBpbnN0cnVjdGlvbnMgYnJva2UgZXZlcnl0aGluZywKKyAgICAgKiBzbyBpbnN0ZWFkIEknbGwgc2V0dGxlIGZvciBtb3Zpbmcgb25lIFdBSVQgRElTQ09OTkVDVCBhIGZldyAKKyAgICAgKiBpbnN0cnVjdGlvbnMgY2xvc2VyIHRvIHRoZSBDTEVBUiBBQ0sgYmVmb3JlIGl0IHRvIG1pbmltaXplIHRoZQorICAgICAqIGNoYW5jZXMgb2YgdGhpcyBoYXBwZW5pbmcsIGFuZCBoYW5kbGUgaXQgaWYgaXQgb2NjdXJzIGFueXdheS4KKyAgICAgKgorICAgICAqIFNpbXBseSBjb250aW51ZSB3aXRoIHdoYXQgd2Ugd2VyZSBkb2luZywgYW5kIGNvbnRyb2wgc2hvdWxkCisgICAgICogYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHNjaGVkdWxlIHJvdXRpbmUgd2hpY2ggd2lsbCB1bHRpbWF0ZWx5CisgICAgICogcGFzcyBjb250cm9sIG9udG8gdGhlIHJlc2VsZWN0aW9uIG9yIHNlbGVjdGlvbiAobm90IHlldCkKKyAgICAgKiBjb2RlLgorICAgICAqLworCX0gZWxzZSBpZiAoZGJjX2RjbWQgPT0gMHg0ODAwMDAwMCAmJiAoTkNSNTNjN3gwX3JlYWQ4IChTQkNMX1JFRykgJgorCSAgICBTQkNMX1JFUSkpIHsKKwkgICAgaWYgKCEoaG9zdGRhdGEtPm9wdGlvbnMgJiBPUFRJT05fTk9fUFJJTlRfUkFDRSkpCisJICAgIHsKKwkJcHJpbnRrKCJzY3NpJWQ6IFJFUSBiZWZvcmUgV0FJVCBESVNDT05ORUNUIElJRFxuIiwgCisJCSAgICBob3N0LT5ob3N0X25vKTsKKwkJaG9zdGRhdGEtPm9wdGlvbnMgfD0gT1BUSU9OX05PX1BSSU5UX1JBQ0U7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9BTEVSVCAic2NzaSVkIDogaW52YWxpZCBpbnN0cnVjdGlvblxuIiwgaG9zdC0+aG9zdF9ubyk7CisJICAgIHByaW50X2xvdHMgKGhvc3QpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgbWFpbCBSaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWsgd2l0aCBBTExcbiIKKwkJICAgICAgICAgICAgICAiICAgICAgICAgYm9vdCBtZXNzYWdlcyBhbmQgZGlhZ25vc3RpYyBvdXRwdXRcbiIpOworICAgIAkgICAgRkFUQUwgKGhvc3QpOworCX0KKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBEU1RBVF9CRiBhcmUgYnVzIGZhdWx0IGVycm9ycy4gIERTVEFUXzgwMF9CRiBpcyB2YWxpZCBmb3IgNzEwIGFsc28uCisgICAgICovCisgICAgCisgICAgaWYgKGRzdGF0ICYgRFNUQVRfODAwX0JGKSB7CisJaW50cl9iZiAoaG9zdCwgY21kKTsKKyAgICB9CisJCisKKyAgICAvKiAKKyAgICAgKiBEU1RBVF9TSVIgaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRpb24gb2YgCisgICAgICogdGhlIElOVCBpbnN0cnVjdGlvbi4gIFNpbmNlIHRoZSBleGFjdCB2YWx1ZXMgYXZhaWxhYmxlIAorICAgICAqIGFyZSBkZXRlcm1pbmVkIGVudGlyZWx5IGJ5IHRoZSBTQ1NJIHNjcmlwdCBydW5uaW5nLCAKKyAgICAgKiBhbmQgYXJlIGxvY2FsIHRvIGEgcGFydGljdWxhciBzY3JpcHQsIGEgdW5pcXVlIGhhbmRsZXIKKyAgICAgKiBpcyBjYWxsZWQgZm9yIGVhY2ggc2NyaXB0LgorICAgICAqLworCisgICAgaWYgKGRzdGF0ICYgRFNUQVRfU0lSKSB7CisJaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0lOVFIpCisJICAgIHByaW50ayAoInNjc2klZCA6IERTVEFUX1NJUlxuIiwgaG9zdC0+aG9zdF9ubyk7CisJc3dpdGNoICgodG1wID0gaG9zdGRhdGEtPmRzdGF0X3Npcl9pbnRyIChob3N0LCBjbWQpKSkgeworCWNhc2UgU1BFQ0lGSUNfSU5UX05PVEhJTkc6CisJY2FzZSBTUEVDSUZJQ19JTlRfUkVTVEFSVDoKKwkgICAgYnJlYWs7CisJY2FzZSBTUEVDSUZJQ19JTlRfQUJPUlQ6CisJICAgIGFib3J0X2Nvbm5lY3RlZChob3N0KTsKKwkgICAgYnJlYWs7CisJY2FzZSBTUEVDSUZJQ19JTlRfUEFOSUM6CisJICAgIHByaW50ayhLRVJOX0FMRVJUICJzY3NpJWQgOiBmYWlsdXJlIGF0ICIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsIEtFUk5fQUxFUlQgIiIsIDEpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCAiICAgICAgICAgIGRzdGF0X3Npcl9pbnRyKCkgcmV0dXJuZWQgU1BFQ0lGSUNfSU5UX1BBTklDXG4iKTsKKyAgICAJICAgIEZBVEFMIChob3N0KTsKKwkgICAgYnJlYWs7CisJY2FzZSBTUEVDSUZJQ19JTlRfQlJFQUs6CisJICAgIGludHJfYnJlYWsgKGhvc3QsIGNtZCk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0FMRVJUICJzY3NpJWQgOiBmYWlsdXJlIGF0ICIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBwcmludF9pbnNuIChob3N0LCBkc3AsIEtFUk5fQUxFUlQgIiIsIDEpOworCSAgICBwcmludGsoS0VSTl9BTEVSVCIgICAgICAgICAgZHN0YXRfc2lyX2ludHIoKSByZXR1cm5lZCB1bmtub3duIHZhbHVlICVkXG4iLCAKKwkJdG1wKTsKKyAgICAJICAgIEZBVEFMIChob3N0KTsKKwl9CisgICAgfSAKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBwcmludF9pbnNuIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCAKKyAqIAl1MzIgKmluc24sIGludCBrZXJuZWwpCisgKgorICogUHVycG9zZSA6IHByaW50IG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQKKyAqIAl0byBieSBpbnNuIHRvIHRoZSBkZWJ1Z2dpbmcgb3Iga2VybmVsIG1lc3NhZ2UgYnVmZmVyCisgKglhcyBhcHByb3ByaWF0ZS4gIAorICoKKyAqIAlJZiBkZXNpcmVkLCBhIHVzZXIgbGV2ZWwgcHJvZ3JhbSBjYW4gaW50ZXJwcmV0IHRoaXMgCisgKiAJaW5mb3JtYXRpb24uCisgKgorICogSW5wdXRzIDogaG9zdCwgaW5zbiAtIGhvc3QsIHBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24sIHByZWZpeCAtIAorICoJc3RyaW5nIHRvIHByZXBlbmQsIGtlcm5lbCAtIHVzZSBwcmludGsgaW5zdGVhZCBvZiBkZWJ1Z2dpbmcgYnVmZmVyLgorICoKKyAqIFJldHVybnMgOiBzaXplLCBpbiB1MzJzLCBvZiBpbnN0cnVjdGlvbiBwcmludGVkLgorICovCisKKy8qCisgKiBGSVhNRTogc2hvdWxkIGNoYW5nZSBrZXJuZWwgcGFyYW1ldGVyIHNvIHRoYXQgaXQgdGFrZXMgYW4gRU5VTQorICogCXNwZWNpZnlpbmcgc2V2ZXJpdHkgLSBlaXRoZXIgS0VSTl9BTEVSVCBvciBLRVJOX1BBTklDIHNvCisgKglhbGwgcGFuaWMgbWVzc2FnZXMgYXJlIG91dHB1dCB3aXRoIHRoZSBzYW1lIHNldmVyaXR5LgorICovCisKK3N0YXRpYyBpbnQgCitwcmludF9pbnNuIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjb25zdCB1MzIgKmluc24sIAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGtlcm5lbCkgeworICAgIGNoYXIgYnVmWzE2MF0sIAkJLyogVGVtcG9yYXJ5IGJ1ZmZlciBhbmQgcG9pbnRlci4gIElDS1kgCisJCQkJICAgYXJiaXRyYXJ5IGxlbmd0aC4gICovCisKKwkJCisJKnRtcDsJCQkKKyAgICB1bnNpZ25lZCBjaGFyIGRjbWQ7CQkvKiBkY21kIHJlZ2lzdGVyIGZvciAqaW5zbiAqLworICAgIGludCBzaXplOworCisgICAgLyogCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGlzIG5vdCBib2d1cyBiZWZvcmUgCisgICAgICogaW5kaXJlY3RpbmcgdGhyb3VnaCBpdDsgYXZvaWRpbmcgcmVkLXpvbmUgYXQgc3RhcnQgb2YgCisgICAgICogbWVtb3J5LgorICAgICAqCisgICAgICogRklYTUU6IGlja3kgbWFnaWMgbmVlZHMgdG8gaGFwcGVuIGhlcmUgb24gbm9uLWludGVsIGJveGVzIHdoaWNoCisgICAgICogZG9uJ3QgaGF2ZSBrZXJuZWwgbWVtb3J5IG1hcHBlZCBpbiBsaWtlIHRoaXMuICBNaWdodCBiZSByZWFzb25hYmxlCisgICAgICogdG8gdXNlIHZ2ZXJpZnkoKT8KKyAgICAgKi8KKworICAgIGlmICh2aXJ0X3RvX3BoeXMoKHZvaWQgKilpbnNuKSA8IFBBR0VfU0laRSB8fCAKKwl2aXJ0X3RvX3BoeXMoKHZvaWQgKikoaW5zbiArIDgpKSA+IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkgfHwKKwkoKCgoZGNtZCA9IChpbnNuWzBdID4+IDI0KSAmIDB4ZmYpICYgRENNRF9UWVBFX01NSSkgPT0gRENNRF9UWVBFX01NSSkgJiYKKwl2aXJ0X3RvX3BoeXMoKHZvaWQgKikoaW5zbiArIDEyKSkgPiB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKSkgeworCXNpemUgPSAwOworCXNwcmludGYgKGJ1ZiwgIiVzJXA6IGFkZHJlc3Mgb3V0IG9mIHJhbmdlXG4iLAorCSAgICBwcmVmaXgsIGluc24pOworICAgIH0gZWxzZSB7CisvKiAKKyAqIEZJWE1FIDogKHZvaWQgKikgY2FzdCBpbiB2aXJ0X3RvX2J1cyBzaG91bGQgYmUgdW5uZWNlc3NhcnksIGJlY2F1c2UKKyAqIAlpdCBzaG91bGQgdGFrZSBjb25zdCB2b2lkICogYXMgYXJndW1lbnQuCisgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfTVZNRTE2eCkgJiYgIWRlZmluZWQoQ09ORklHX0JWTUU2MDAwKQorCXNwcmludGYoYnVmLCAiJXMweCVseCAodmlydCAweCVwKSA6IDB4JTA4eCAweCUwOHggKHZpcnQgMHglcCkiLCAKKwkgICAgKHByZWZpeCA/IHByZWZpeCA6ICIiKSwgdmlydF90b19idXMoKHZvaWQgKikgaW5zbiksIGluc24sICAKKwkgICAgaW5zblswXSwgaW5zblsxXSwgYnVzX3RvX3ZpcnQgKGluc25bMV0pKTsKKyNlbHNlCisJLyogUmVtb3ZlIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHJlZHVjZSBvdXRwdXQsIGFzIHRoZXkgYXJlIHRoZSBzYW1lICovCisJc3ByaW50ZihidWYsICIlczB4JXggKCsleCkgOiAweCUwOHggMHglMDh4IiwgCisJICAgIChwcmVmaXggPyBwcmVmaXggOiAiIiksICh1MzIpaW5zbiwgKCh1MzIpaW5zbiAtCisJCSh1MzIpJigoKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKilob3N0LT5ob3N0ZGF0YVswXSktPnNjcmlwdCkpLzQsIAorCSAgICBpbnNuWzBdLCBpbnNuWzFdKTsKKyNlbmRpZgorCXRtcCA9IGJ1ZiArIHN0cmxlbihidWYpOworCWlmICgoZGNtZCAmIERDTURfVFlQRV9NQVNLKSA9PSBEQ01EX1RZUEVfTU1JKSAgeworI2lmICFkZWZpbmVkKENPTkZJR19NVk1FMTZ4KSAmJiAhZGVmaW5lZChDT05GSUdfQlZNRTYwMDApCisJICAgIHNwcmludGYgKHRtcCwgIiAweCUwOHggKHZpcnQgMHglcClcbiIsIGluc25bMl0sIAorCQlidXNfdG9fdmlydChpbnNuWzJdKSk7CisjZWxzZQorCSAgICAvKiBSZW1vdmUgdmlydHVhbCBhZGRyIHRvIHJlZHVjZSBvdXRwdXQsIGFzIGl0IGlzIHRoZSBzYW1lICovCisJICAgIHNwcmludGYgKHRtcCwgIiAweCUwOHhcbiIsIGluc25bMl0pOworI2VuZGlmCisJICAgIHNpemUgPSAzOworCX0gZWxzZSB7CisJICAgIHNwcmludGYgKHRtcCwgIlxuIik7CisJICAgIHNpemUgPSAyOworCX0KKyAgICB9CisKKyAgICBpZiAoa2VybmVsKSAKKwlwcmludGsgKCIlcyIsIGJ1Zik7CisjaWZkZWYgTkNSX0RFQlVHCisgICAgZWxzZSB7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihidWYpOworCWRlYnVnZ2VyX2tlcm5lbF93cml0ZShob3N0LCBidWYsIGxlbik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1M2M3eHhfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorICogCisgKiBQdXJwb3NlIDogQWJvcnQgYW4gZXJyYW50IFNDU0kgY29tbWFuZCwgZG9pbmcgYWxsIG5lY2Vzc2FyeQorICoJY2xlYW51cCBvZiB0aGUgaXNzdWVfcXVldWUsIHJ1bm5pbmdfbGlzdCwgc2hhcmVkIExpbnV4L05DUgorICoJZHNhIGlzc3VlIGFuZCByZWNvbm5lY3QgcXVldWVzLgorICoKKyAqIElucHV0cyA6IGNtZCAtIGNvbW1hbmQgdG8gYWJvcnQsIGNvZGUgLSBlbnRpcmUgcmVzdWx0IGZpZWxkCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitpbnQgCitOQ1I1M2M3eHhfYWJvcnQgKFNjc2lfQ21uZCAqY21kKSB7CisgICAgTkNSNTNjN3gwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBob3N0ID8gKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgCisJaG9zdC0+aG9zdGRhdGFbMF0gOiBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmN1cnIsICoqcHJldjsKKyAgICBTY3NpX0NtbmQgKm1lLCAqKmxhc3Q7CisjaWYgMAorICAgIHN0YXRpYyBsb25nIGNhY2hlX3BpZCA9IC0xOworI2VuZGlmCisKKworICAgIGlmICghaG9zdCkgeworCXByaW50ayAoIkJvZ3VzIFNDU0kgY29tbWFuZCBwaWQgJWxkOyBubyBob3N0IHN0cnVjdHVyZVxuIiwKKwkgICAgY21kLT5waWQpOworCXJldHVybiBTQ1NJX0FCT1JUX0VSUk9SOworICAgIH0gZWxzZSBpZiAoIWhvc3RkYXRhKSB7CisJcHJpbnRrICgiQm9ndXMgU0NTSSBob3N0ICVkOyBubyBob3N0ZGF0YVxuIiwgaG9zdC0+aG9zdF9ubyk7CisJcmV0dXJuIFNDU0lfQUJPUlRfRVJST1I7CisgICAgfQorICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKworLyoKKyAqIENIRUNLIDogSSBkb24ndCB0aGluayB0aGF0IHJlYWRpbmcgSVNUQVQgd2lsbCB1bnN0YWNrIGFueSBpbnRlcnJ1cHRzLAorICoJc2luY2Ugd2UgbmVlZCB0byB3cml0ZSB0aGUgSU5URiBiaXQgdG8gY2xlYXIgaXQsIGFuZCBTQ1NJL0RNQQorICogCWludGVycnVwdHMgZG9uJ3QgY2xlYXIgdW50aWwgd2UgcmVhZCBTU1RBVC9TSVNUIGFuZCBEU1RBVCByZWdpc3RlcnMuCisgKgkKKyAqCVNlZSB0aGF0IHRoaXMgaXMgdGhlIGNhc2UuICBBcHBlYXJzIHRvIGJlIGNvcnJlY3Qgb24gdGhlIDcxMCwgYXQgbGVhc3QuCisgKgorICogSSBzdXNwZWN0IHRoYXQgc2V2ZXJhbCBvZiBvdXIgZmFpbHVyZXMgbWF5IGJlIGNvbWluZyBmcm9tIGEgbmV3IGZhdGFsCisgKiBpbnRlcnJ1cHQgKHBvc3NpYmx5IGR1ZSB0byBhIHBoYXNlIG1pc21hdGNoKSBoYXBwZW5pbmcgYWZ0ZXIgd2UndmUgbGVmdAorICogdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgYmVmb3JlIHRoZSBQSUMgaGFzIGhhZCB0aGUgaW50ZXJydXB0IGNvbmRpdGlvbgorICogY2xlYXJlZC4KKyAqLworCisgICAgaWYgKE5DUjUzYzd4MF9yZWFkOChob3N0ZGF0YS0+aXN0YXQpICYgKElTVEFUX0RJUHxJU1RBVF9TSVApKSB7CisJcHJpbnRrICgic2NzaSVkIDogZHJvcHBlZCBpbnRlcnJ1cHQgZm9yIGNvbW1hbmQgJWxkXG4iLCBob3N0LT5ob3N0X25vLAorCSAgICBjbWQtPnBpZCk7CisJTkNSNTNjN3gwX2ludHIgKGhvc3QtPmlycSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIFNDU0lfQUJPUlRfQlVTWTsKKyAgICB9CisJCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2lmIDAKKyAgICBpZiAoY2FjaGVfcGlkID09IGNtZC0+cGlkKSAKKwlwYW5pYyAoInNjc2klZCA6IGJsb29keSBmZXR1cyAlZFxuIiwgaG9zdC0+aG9zdF9ubywgY21kLT5waWQpOworICAgIGVsc2UKKwljYWNoZV9waWQgPSBjbWQtPnBpZDsKKyNlbmRpZgorCQorCisvKgorICogVGhlIGNvbW1hbmQgY291bGQgYmUgaGlkaW5nIGluIHRoZSBpc3N1ZV9xdWV1ZS4gIFRoaXMgd291bGQgYmUgdmVyeQorICogbmljZSwgYXMgY29tbWFuZHMgY2FuJ3QgYmUgbW92ZWQgZnJvbSB0aGUgaGlnaCBsZXZlbCBkcml2ZXIncyBpc3N1ZSBxdWV1ZSAKKyAqIGludG8gdGhlIHNoYXJlZCBxdWV1ZSB1bnRpbCBhbiBpbnRlcnJ1cHQgcm91dGluZSBpcyBzZXJ2aWNlZCwgYW5kIHRoaXMKKyAqIG1vdmluZyBpcyBhdG9taWMuICAKKyAqCisgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFueXRoaW5nIC0gd2Ugc2ltcGx5CisgKiBwdWxsIHRoZSBjb21tYW5kIG91dCBvZiB0aGUgb2xkIHF1ZXVlLCBhbmQgY2FsbCBpdCBhYm9ydGVkLgorICovCisKKyAgICBmb3IgKG1lID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIAorICAgICAgICAgbGFzdCA9IChTY3NpX0NtbmQgKiopICYoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKKwkgbWUgJiYgbWUgIT0gY21kOyAgbGFzdCA9IChTY3NpX0NtbmQgKiopJihtZS0+U0NwLnB0ciksIAorCSBtZSA9IChTY3NpX0NtbmQgKiltZS0+U0NwLnB0cik7CisKKyAgICBpZiAobWUpIHsKKwkqbGFzdCA9IChTY3NpX0NtbmQgKikgbWUtPlNDcC5wdHI7CisJaWYgKG1lLT5ob3N0X3NjcmliYmxlKSB7CisJICAgICgoc3RydWN0IE5DUjUzYzd4MF9jbWQgKiltZS0+aG9zdF9zY3JpYmJsZSktPm5leHQgPSBob3N0ZGF0YS0+ZnJlZTsKKwkgICAgaG9zdGRhdGEtPmZyZWUgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgbWUtPmhvc3Rfc2NyaWJibGU7CisJICAgIG1lLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwl9CisJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKKwlwcmludGsgKCJzY3NpJWQgOiBmb3VuZCBjb21tYW5kICVsZCBpbiBMaW51eCBpc3N1ZSBxdWV1ZVxuIiwgCisJICAgIGhvc3QtPmhvc3Rfbm8sIG1lLT5waWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAJcnVuX3Byb2Nlc3NfaXNzdWVfcXVldWUoKTsKKwlyZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworICAgIH0KKworLyogCisgKiBUaGF0IGZhaWxpbmcsIHRoZSBjb21tYW5kIGNvdWxkIGJlIGluIG91ciBsaXN0IG9mIGFscmVhZHkgZXhlY3V0aW5nIAorICogY29tbWFuZHMuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBkcmFzdGljIG1lYXN1cmVzIGFyZSBjYWxsZWQgZm9yLiAgCisgKi8gCisKKyAgICBmb3IgKGN1cnIgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgaG9zdGRhdGEtPnJ1bm5pbmdfbGlzdCwgCisgICAgCSBwcmV2ID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICoqKSAmKGhvc3RkYXRhLT5ydW5uaW5nX2xpc3QpOworCSBjdXJyICYmIGN1cnItPmNtZCAhPSBjbWQ7IHByZXYgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKiopIAorICAgICAgICAgJihjdXJyLT5uZXh0KSwgY3VyciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjdXJyLT5uZXh0KTsKKworICAgIGlmIChjdXJyKSB7CisJaWYgKChjdXJyLT5yZXN1bHQgJiAweGZmKSAhPSAweGZmICYmIChjdXJyLT5yZXN1bHQgJiAweGZmMDApICE9IDB4ZmYwMCkgeworICAgICAgICAgICAgY21kLT5yZXN1bHQgPSBjdXJyLT5yZXN1bHQ7CisJICAgIGlmIChwcmV2KQorCQkqcHJldiA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjdXJyLT5uZXh0OworCSAgICBjdXJyLT5uZXh0ID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGhvc3RkYXRhLT5mcmVlOworCSAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCSAgICBob3N0ZGF0YS0+ZnJlZSA9IGN1cnI7CisJICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJcHJpbnRrICgic2NzaSVkIDogZm91bmQgZmluaXNoZWQgY29tbWFuZCAlbGQgaW4gcnVubmluZyBsaXN0XG4iLCAKKwkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5waWQpOworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIHJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCX0gZWxzZSB7CisJICAgIHByaW50ayAoInNjc2klZCA6IERBTkdFUiA6IGNvbW1hbmQgcnVubmluZywgY2FuIG5vdCBhYm9ydC5cbiIsCisJCWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKTsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICByZXR1cm4gU0NTSV9BQk9SVF9CVVNZOworCX0KKyAgICB9CisKKy8qIAorICogQW5kIGlmIHdlIGNvdWxkbid0IGZpbmQgaXQgaW4gYW55IG9mIG91ciBxdWV1ZXMsIGl0IG11c3QgaGF2ZSBiZWVuIAorICogYSBkcm9wcGVkIGludGVycnVwdC4KKyAqLworCisgICAgY3VyciA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisgICAgaWYgKGN1cnIpIHsKKwljdXJyLT5uZXh0ID0gaG9zdGRhdGEtPmZyZWU7CisJaG9zdGRhdGEtPmZyZWUgPSBjdXJyOworCWNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGN1cnIgPT0gTlVMTCB8fCAoKGN1cnItPnJlc3VsdCAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB8fAorCQkoKGN1cnItPnJlc3VsdCAmIDB4ZmYpID09IDB4ZmYpKSB7CisJcHJpbnRrICgic2NzaSVkIDogZGlkIHRoaXMgY29tbWFuZCBldmVyIHJ1bj9cbiIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICBjbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyAgICB9IGVsc2UgeworCXByaW50ayAoInNjc2klZCA6IHByb2JhYmx5IGxvc3QgSU5URkxZLCBub3JtYWwgY29tcGxldGlvblxuIiwgCisJICAgIGhvc3QtPmhvc3Rfbm8pOworICAgICAgICBjbWQtPnJlc3VsdCA9IGN1cnItPnJlc3VsdDsKKy8qIAorICogRklYTUUgOiBXZSBuZWVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIGEgCisgKiBjb21tYW5kIHdhcyBldmVyIGNvdW50ZWQgYXMgQlVTWSwgc28gaWYgd2UgZW5kIHVwIGhlcmUgd2UgY2FuCisgKiBkZWNyZW1lbnQgdGhlIGJ1c3kgY291bnQgaWYgYW5kIG9ubHkgaWYgaXQgaXMgbmVjZXNzYXJ5LgorICovCisgICAgICAgIC0taG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisKKy8qIAorICogV2UgbmVlZCB0byBydW4gcHJvY2Vzc19pc3N1ZV9xdWV1ZSBzaW5jZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIGNvbW1hbmQgCisgKiBtYXkgYWxsb3cgYW5vdGhlciBxdWV1ZWQgY29tbWFuZCB0byBleGVjdXRlIGZpcnN0PyAKKyAqLworICAgIHJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworfQorCisvKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTNjN3h4X3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkgCisgKiAKKyAqIFB1cnBvc2UgOiBwZXJmb3JtIGEgaGFyZCByZXNldCBvZiB0aGUgU0NTSSBidXMgYW5kIE5DUgorICogCWNoaXAuCisgKgorICogSW5wdXRzIDogY21kIC0gY29tbWFuZCB3aGljaCBjYXVzZWQgdGhlIFNDU0kgUkVTRVQKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLgorICovCisgCitpbnQgCitOQ1I1M2M3eHhfcmVzZXQgKFNjc2lfQ21uZCAqY21kLCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqIGM7CisgICAgU2NzaV9DbW5kICp0bXA7CisgICAgLyoKKyAgICAgKiBXaGVuIHdlIGNhbGwgc2NzaV9kb25lKCksIGl0J3MgZ29pbmcgdG8gd2FrZSB1cCBhbnl0aGluZyBzbGVlcGluZyBvbiB0aGUKKyAgICAgKiByZXNvdXJjZXMgd2hpY2ggd2VyZSBpbiB1c2UgYnkgdGhlIGFib3J0ZWQgY29tbWFuZHMsIGFuZCB3ZSdsbCBzdGFydCB0byAKKyAgICAgKiBnZXQgbmV3IGNvbW1hbmRzLgorICAgICAqCisgICAgICogV2UgY2FuJ3QgbGV0IHRoaXMgaGFwcGVuIHVudGlsIGFmdGVyIHdlJ3ZlIHJlLWluaXRpYWxpemVkIHRoZSBkcml2ZXIKKyAgICAgKiBzdHJ1Y3R1cmVzLCBhbmQgY2FuJ3QgcmVpbml0aWFsaXplIHRob3NlIHN0cnVjdHVyZXMgdW50aWwgYWZ0ZXIgd2UndmUgCisgICAgICogZGVhbHQgd2l0aCB0aGVpciBjb250ZW50cy4KKyAgICAgKgorICAgICAqIFNvLCB3ZSBuZWVkIHRvIGZpbmQgYWxsIG9mIHRoZSBjb21tYW5kcyB3aGljaCB3ZXJlIHJ1bm5pbmcsIHN0aWNrCisgICAgICogdGhlbSBvbiBhIGxpbmtlZCBsaXN0IG9mIGNvbXBsZXRlZCBjb21tYW5kcyAod2UnbGwgdXNlIHRoZSBob3N0X3NjcmliYmxlCisgICAgICogcG9pbnRlciksIGRvIG91ciByZWluaXRpYWxpemF0aW9uLCBhbmQgdGhlbiBjYWxsIHRoZSBkb25lIGZ1bmN0aW9uIGZvcgorICAgICAqIGVhY2ggY29tbWFuZC4gIAorICAgICAqLworICAgIFNjc2lfQ21uZCAqbnVrZV9saXN0ID0gTlVMTDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKyAgICAJKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIG5jcl9oYWx0IChob3N0KTsKKyAgICBwcmludF9sb3RzIChob3N0KTsKKyAgICBkdW1wX2V2ZW50cyAoaG9zdCwgMzApOworICAgIG5jcl9zY3NpX3Jlc2V0IChob3N0KTsKKyAgICBmb3IgKHRtcCA9IG51a2VfbGlzdCA9IHJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoaG9zdCwgMSAvKiBmcmVlICovLAorCTAgLyogaXNzdWUgKi8gKTsgdG1wOyB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+U0NwLmJ1ZmZlcikKKwlpZiAodG1wID09IGNtZCkgeworCSAgICBmb3VuZCA9IDE7CisJICAgIGJyZWFrOworCX0KKwkgICAgCisgICAgLyogCisgICAgICogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGNvbW1hbmQgd2hpY2ggY2F1c2VkIHRoaXMgcmVzZXQgaW4gb3VyIHJ1bm5pbmcKKyAgICAgKiBsaXN0LCB0aGVuIHdlJ3ZlIGxvc3QgaXQuICBTZWUgdGhhdCBpdCB0ZXJtaW5hdGVzIG5vcm1hbGx5IGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgCWMgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5ob3N0X3NjcmliYmxlOworICAgIAlpZiAoYykgeworCSAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgIAkgICAgYy0+bmV4dCA9IGhvc3RkYXRhLT5mcmVlOworICAgIAkgICAgaG9zdGRhdGEtPmZyZWUgPSBjOworICAgIAl9IGVsc2UKKwkgICAgcHJpbnRrICgic2NzaSVkOiBsb3N0IGNvbW1hbmQgJWxkXG4iLCBob3N0LT5ob3N0X25vLCBjbWQtPnBpZCk7CisJY21kLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBudWtlX2xpc3Q7CisJbnVrZV9saXN0ID0gY21kOworICAgIH0KKworICAgIE5DUjUzYzd4MF9kcml2ZXJfaW5pdCAoaG9zdCk7CisgICAgaG9zdGRhdGEtPnNvZnRfcmVzZXQgKGhvc3QpOworICAgIGlmIChob3N0ZGF0YS0+cmVzZXRzID09IDApIAorCWRpc2FibGUoaG9zdCk7CisgICAgZWxzZSBpZiAoaG9zdGRhdGEtPnJlc2V0cyAhPSAtMSkKKwktLWhvc3RkYXRhLT5yZXNldHM7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIGZvciAoOyBudWtlX2xpc3Q7IG51a2VfbGlzdCA9IHRtcCkgeworCXRtcCA9IChTY3NpX0NtbmQgKikgbnVrZV9saXN0LT5TQ3AuYnVmZmVyOworICAgIAludWtlX2xpc3QtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwludWtlX2xpc3QtPnNjc2lfZG9uZSAobnVrZV9saXN0KTsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHJldHVybiBTQ1NJX1JFU0VUX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBUaGUgTkNSIFNETVMgYmlvcyBmb2xsb3dzIEFubmV4IEEgb2YgdGhlIFNDU0ktQ0FNIGRyYWZ0LCBhbmQgCisgKiB0aGVyZWZvcmUgc2hhcmVzIHRoZSBzY3NpY2FtX2Jpb3NfcGFyYW0gZnVuY3Rpb24uCisgKi8KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IGluc25fdG9fb2Zmc2V0IChTY3NpX0NtbmQgKmNtZCwgdTMyICppbnNuKQorICoKKyAqIFB1cnBvc2UgOiBjb252ZXJ0IGluc3RydWN0aW9ucyBzdG9yZWQgYXQgTkNSIHBvaW50ZXIgaW50byBkYXRhIAorICoJcG9pbnRlciBvZmZzZXQuCisgKiAKKyAqIElucHV0cyA6IGNtZCAtIFNDU0kgY29tbWFuZDsgaW5zbiAtIHBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24uICBFaXRoZXIgY3VycmVudAorICoJRFNQLCBvciBzYXZlZCBkYXRhIHBvaW50ZXIuCisgKgorICogUmV0dXJucyA6IG9mZnNldCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCisKKworc3RhdGljIGludCAKK2luc25fdG9fb2Zmc2V0IChTY3NpX0NtbmQgKmNtZCwgdTMyICppbnNuKSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisgICAgc3RydWN0IE5DUjUzYzd4MF9jbWQgKm5jbWQgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5ob3N0X3NjcmliYmxlOworICAgIGludCBvZmZzZXQgPSAwLCBidWZmZXJzOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2VnbWVudDsKKyAgICBjaGFyICpwdHI7CisgICAgaW50IGZvdW5kID0gMDsKKworLyoKKyAqIFdpdGggdGhlIGN1cnJlbnQgY29kZSBpbXBsZW1lbnRhdGlvbiwgaWYgdGhlIGluc24gaXMgaW5zaWRlIGR5bmFtaWNhbGx5IAorICogZ2VuZXJhdGVkIGNvZGUsIHRoZSBkYXRhIHBvaW50ZXIgd2lsbCBiZSB0aGUgaW5zdHJ1Y3Rpb24gcHJlY2VkaW5nIAorICogdGhlIG5leHQgdHJhbnNmZXIgc2VnbWVudC4KKyAqLworCisgICAgaWYgKCFjaGVja19hZGRyZXNzICgodW5zaWduZWQgbG9uZykgbmNtZCwgc2l6ZW9mIChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCkpICYmCisJKChpbnNuID49IG5jbWQtPmRhdGFfdHJhbnNmZXJfc3RhcnQgJiYgIAorICAgIAkgICAgaW5zbiA8IG5jbWQtPmRhdGFfdHJhbnNmZXJfZW5kKSB8fAorICAgIAkoaW5zbiA+PSBuY21kLT5yZXNpZHVhbCAmJgorICAgIAkgICAgaW5zbiA8IChuY21kLT5yZXNpZHVhbCArIAorICAgIAkgICAgCXNpemVvZihuY21kLT5yZXNpZHVhbCkpKSkpIHsKKwkgICAgcHRyID0gYnVzX3RvX3ZpcnQoaW5zblszXSk7CisKKwkgICAgaWYgKChidWZmZXJzID0gY21kLT51c2Vfc2cpKSB7CisgICAgCSAgICAJZm9yIChvZmZzZXQgPSAwLCAKKwkJICAgICAJc2VnbWVudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5idWZmZXI7CisgICAgCSAgICAJICAgICBidWZmZXJzICYmICEoKGZvdW5kID0gKChwdHIgPj0gKGNoYXIgKilwYWdlX2FkZHJlc3Moc2VnbWVudC0+cGFnZSkrc2VnbWVudC0+b2Zmc2V0KSAmJiAKKyAgICAJICAgIAkgICAgCSAgICAocHRyIDwgKChjaGFyICopcGFnZV9hZGRyZXNzKHNlZ21lbnQtPnBhZ2UpK3NlZ21lbnQtPm9mZnNldCtzZWdtZW50LT5sZW5ndGgpKSkpKTsKKyAgICAJICAgIAkgICAgIC0tYnVmZmVycywgb2Zmc2V0ICs9IHNlZ21lbnQtPmxlbmd0aCwgKytzZWdtZW50KQorI2lmIDAKKwkJICAgIHByaW50aygic2NzaSVkOiBjb21wYXJpbmcgMHglcCB0byAweCVwXG4iLCAKKwkJCWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBzYXZlZCwgcGFnZV9hZGRyZXNzKHNlZ21lbnQtPnBhZ2Urc2VnbWVudC0+b2Zmc2V0KTsKKyNlbHNlCisJCSAgICA7CisjZW5kaWYKKyAgICAJICAgIAkgICAgb2Zmc2V0ICs9IHB0ciAtICgoY2hhciAqKXBhZ2VfYWRkcmVzcyhzZWdtZW50LT5wYWdlKStzZWdtZW50LT5vZmZzZXQpOworICAgIAkgICAgfSBlbHNlIHsKKwkJZm91bmQgPSAxOworICAgIAkgICAgCW9mZnNldCA9IHB0ciAtIChjaGFyICopIChjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKyAgICAJICAgIH0KKyAgICB9IGVsc2UgaWYgKChpbnNuID49IGhvc3RkYXRhLT5zY3JpcHQgKyAKKwkJaG9zdGRhdGEtPkVfZGF0YV90cmFuc2ZlciAvIHNpemVvZih1MzIpKSAmJgorCSAgICAgICAoaW5zbiA8PSBob3N0ZGF0YS0+c2NyaXB0ICsKKwkJaG9zdGRhdGEtPkVfZW5kX2RhdGFfdHJhbnNmZXIgLyBzaXplb2YodTMyKSkpIHsKKyAgICAJZm91bmQgPSAxOworCW9mZnNldCA9IDA7CisgICAgfQorICAgIHJldHVybiBmb3VuZCA/IG9mZnNldCA6IC0xOworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBwcmludF9wcm9ncmVzcyAoU2NzaV9DbW5kICpjbWQpIAorICogCisgKiBQdXJwb3NlIDogcHJpbnQgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIHNhdmVkIGRhdGEgcG9pbnRlcgorICoKKyAqIElucHV0cyA6IGNtZCAtIGNvbW1hbmQgd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgCitwcmludF9wcm9ncmVzcyAoU2NzaV9DbW5kICpjbWQpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpuY21kID0gCisJKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKyAgICBpbnQgb2Zmc2V0LCBpOworICAgIGNoYXIgKndoZXJlOworICAgIHUzMiAqcHRyOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cCAoY21kLT5kZXZpY2UtPmhvc3QpOworCisgICAgaWYgKGNoZWNrX2FkZHJlc3MgKCh1bnNpZ25lZCBsb25nKSBuY21kLHNpemVvZiAoc3RydWN0IE5DUjUzYzd4MF9jbWQpKSA9PSAwKQorICAgIHsKKwlwcmludGsoIlxuTkNSNTNjN3gwX2NtZCBmaWVsZHM6XG4iKTsKKwlwcmludGsoIiAgYm91bmNlLmxlbj0weCV4LCBhZGRyPTB4JTB4LCBidWZbXT0weCUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgIG5jbWQtPmJvdW5jZS5sZW4sIG5jbWQtPmJvdW5jZS5hZGRyLCBuY21kLT5ib3VuY2UuYnVmWzBdLAorCSAgICBuY21kLT5ib3VuY2UuYnVmWzFdLCBuY21kLT5ib3VuY2UuYnVmWzJdLCBuY21kLT5ib3VuY2UuYnVmWzNdKTsKKwlwcmludGsoIiAgcmVzdWx0PSUwNHgsIGNkYlswXT0weCUwMnhcbiIsIG5jbWQtPnJlc3VsdCwgbmNtZC0+Y21uZFswXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCWlmIChjaGVja19hZGRyZXNzICgodW5zaWduZWQgbG9uZykgbmNtZCwgCisJICAgIHNpemVvZiAoc3RydWN0IE5DUjUzYzd4MF9jbWQpKSA9PSAtMSkgCisJICAgIGNvbnRpbnVlOworCWlmICghaSkgeworCSAgICB3aGVyZSA9ICJzYXZlZCI7CisJICAgIHB0ciA9IGJ1c190b192aXJ0KG5jbWQtPnNhdmVkX2RhdGFfcG9pbnRlcik7CisJfSBlbHNlIHsKKwkgICAgd2hlcmUgPSAiYWN0aXZlIjsKKwkgICAgcHRyID0gYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIgKERTUF9SRUcpIC0KKwkJTkNSNTNjN3gwX2luc25fc2l6ZSAoTkNSNTNjN3gwX3JlYWQ4IChEQ01EX1JFRykpICoKKwkJc2l6ZW9mKHUzMikpOworCX0gCisJb2Zmc2V0ID0gaW5zbl90b19vZmZzZXQgKGNtZCwgcHRyKTsKKworCWlmIChvZmZzZXQgIT0gLTEpIAorCSAgICBwcmludGsgKCJzY3NpJWQgOiAlcyBkYXRhIHBvaW50ZXIgYXQgb2Zmc2V0ICVkXG4iLAorCQljbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgd2hlcmUsIG9mZnNldCk7CisJZWxzZSB7CisJICAgIGludCBzaXplOworCSAgICBwcmludGsgKCJzY3NpJWQgOiBjYW4ndCBkZXRlcm1pbmUgJXMgZGF0YSBwb2ludGVyIG9mZnNldFxuIiwKKwkJY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sIHdoZXJlKTsKKwkgICAgaWYgKG5jbWQpIHsKKwkJc2l6ZSA9IHByaW50X2luc24gKGNtZC0+ZGV2aWNlLT5ob3N0LAorCQkgICAgYnVzX3RvX3ZpcnQobmNtZC0+c2F2ZWRfZGF0YV9wb2ludGVyKSwgIiIsIDEpOworCQlwcmludF9pbnNuIChjbWQtPmRldmljZS0+aG9zdCwKKwkJICAgIGJ1c190b192aXJ0KG5jbWQtPnNhdmVkX2RhdGFfcG9pbnRlcikgKyBzaXplICogc2l6ZW9mKHUzMiksCisJCSAgICAiIiwgMSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIAorcHJpbnRfZHNhIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1MzIgKmRzYSwgY29uc3QgY2hhciAqcHJlZml4KSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIGludCBpLCBsZW47CisgICAgY2hhciAqcHRyOworICAgIFNjc2lfQ21uZCAqY21kOworCisgICAgaWYgKGNoZWNrX2FkZHJlc3MgKCh1bnNpZ25lZCBsb25nKSBkc2EsIGhvc3RkYXRhLT5kc2FfZW5kIC0gCisJaG9zdGRhdGEtPmRzYV9zdGFydCkgPT0gLTEpIHsKKwlwcmludGsoInNjc2klZCA6IGJhZCBkc2EgdmlydCAweCVwXG4iLCBob3N0LT5ob3N0X25vLCBkc2EpOworCXJldHVybjsKKyAgICB9CisgICAgcHJpbnRrKCIlc3Njc2klZCA6IGRzYSBhdCBwaHlzIDB4JWx4ICh2aXJ0IDB4JXApXG4iCisJICAgICIgICAgICAgICsgJWQgOiBkc2FfbXNnb3V0IGxlbmd0aCA9ICV1LCBkYXRhID0gMHgleCAodmlydCAweCVwKVxuIiAsCisgICAgCSAgICBwcmVmaXggPyBwcmVmaXggOiAiIiwKKyAgICAJICAgIGhvc3QtPmhvc3Rfbm8sICB2aXJ0X3RvX2J1cyAoZHNhKSwgZHNhLCBob3N0ZGF0YS0+ZHNhX21zZ291dCwKKyAgICAJICAgIGRzYVtob3N0ZGF0YS0+ZHNhX21zZ291dCAvIHNpemVvZih1MzIpXSwKKwkgICAgZHNhW2hvc3RkYXRhLT5kc2FfbXNnb3V0IC8gc2l6ZW9mKHUzMikgKyAxXSwKKwkgICAgYnVzX3RvX3ZpcnQgKGRzYVtob3N0ZGF0YS0+ZHNhX21zZ291dCAvIHNpemVvZih1MzIpICsgMV0pKTsKKworICAgIC8qIAorICAgICAqIE9ubHkgcHJpbnQgbWVzc2FnZXMgaWYgdGhleSdyZSBzYW5lIGluIGxlbmd0aCBzbyB3ZSBkb24ndAorICAgICAqIGJsb3cgdGhlIGtlcm5lbCBwcmludGsgYnVmZmVyIG9uIHNvbWV0aGluZyB3aGljaCB3b24ndCBidXkgdXMKKyAgICAgKiBhbnl0aGluZy4KKyAgICAgKi8KKworICAgIGlmIChkc2FbaG9zdGRhdGEtPmRzYV9tc2dvdXQgLyBzaXplb2YodTMyKV0gPCAKKwkgICAgc2l6ZW9mIChob3N0ZGF0YS0+ZnJlZS0+c2VsZWN0KSkgCisJZm9yIChpID0gZHNhW2hvc3RkYXRhLT5kc2FfbXNnb3V0IC8gc2l6ZW9mKHUzMildLAorCSAgICBwdHIgPSBidXNfdG9fdmlydCAoZHNhW2hvc3RkYXRhLT5kc2FfbXNnb3V0IC8gc2l6ZW9mKHUzMikgKyAxXSk7IAorCSAgICBpID4gMCAmJiAhY2hlY2tfYWRkcmVzcyAoKHVuc2lnbmVkIGxvbmcpIHB0ciwgMSk7CisJICAgIHB0ciArPSBsZW4sIGkgLT0gbGVuKSB7CisJICAgIHByaW50aygiICAgICAgICAgICAgICAgIik7CisJICAgIGxlbiA9IHByaW50X21zZyAocHRyKTsKKwkgICAgcHJpbnRrKCJcbiIpOworCSAgICBpZiAoIWxlbikKKwkJYnJlYWs7CisJfQorCisgICAgcHJpbnRrKCIgICAgICAgICsgJWQgOiBzZWxlY3RfaW5kaXJlY3QgPSAweCV4XG4iLAorCWhvc3RkYXRhLT5kc2Ffc2VsZWN0LCBkc2FbaG9zdGRhdGEtPmRzYV9zZWxlY3QgLyBzaXplb2YodTMyKV0pOworICAgIGNtZCA9IChTY3NpX0NtbmQgKikgYnVzX3RvX3ZpcnQoZHNhW2hvc3RkYXRhLT5kc2FfY21uZCAvIHNpemVvZih1MzIpXSk7CisgICAgcHJpbnRrKCIgICAgICAgICsgJWQgOiBkc2FfY21uZCA9IDB4JXggIiwgaG9zdGRhdGEtPmRzYV9jbW5kLAorCSAgICh1MzIpIHZpcnRfdG9fYnVzKGNtZCkpOworICAgIC8qIFhYWCBNYXliZSB3ZSBzaG91bGQgYWNjZXNzIGNtZC0+aG9zdF9zY3JpYmJsZS0+cmVzdWx0IGhlcmUuIFJHSCAqLworICAgIGlmIChjbWQpIHsKKwlwcmludGsoIiAgICAgICAgICAgICAgIHJlc3VsdCA9IDB4JXgsIHRhcmdldCA9ICVkLCBsdW4gPSAlZCwgY21kID0gIiwKKwkgICAgY21kLT5yZXN1bHQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJcHJpbnRfY29tbWFuZChjbWQtPmNtbmQpOworICAgIH0gZWxzZQorCXByaW50aygiXG4iKTsKKyAgICBwcmludGsoIiAgICAgICAgKyAlZCA6IGRzYV9uZXh0ID0gMHgleFxuIiwgaG9zdGRhdGEtPmRzYV9uZXh0LAorCWRzYVtob3N0ZGF0YS0+ZHNhX25leHQgLyBzaXplb2YodTMyKV0pOworICAgIGlmIChjbWQpIHsgCisJcHJpbnRrKCJzY3NpJWQgdGFyZ2V0ICVkIDogc3hmZXJfc2FuaXR5ID0gMHgleCwgc2NudGwzX3Nhbml0eSA9IDB4JXhcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICBzY3JpcHQgOiAiLAorCSAgICBob3N0LT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsCisJICAgIGhvc3RkYXRhLT5zeW5jW2NtZC0+ZGV2aWNlLT5pZF0uc3hmZXJfc2FuaXR5LAorCSAgICBob3N0ZGF0YS0+c3luY1tjbWQtPmRldmljZS0+aWRdLnNjbnRsM19zYW5pdHkpOworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGhvc3RkYXRhLT5zeW5jW2NtZC0+ZGV2aWNlLT5pZF0uc2NyaXB0KSAvIDQpOyArK2kpCisJICAgIHByaW50ayAoIjB4JXggIiwgaG9zdGRhdGEtPnN5bmNbY21kLT5kZXZpY2UtPmlkXS5zY3JpcHRbaV0pOworCXByaW50ayAoIlxuIik7CisgICAgCXByaW50X3Byb2dyZXNzIChjbWQpOworICAgIH0KK30KKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgcHJpbnRfcXVldWVzIChTY3NpX0hvc3QgKmhvc3QpIAorICogCisgKiBQdXJwb3NlIDogcHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBOQ1IgaXNzdWUgYW5kIHJlY29ubmVjdCBxdWV1ZXMKKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gU0NTSSBob3N0IHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKgorICovCisKK3N0YXRpYyB2b2lkIAorcHJpbnRfcXVldWVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIHUzMiAqZHNhLCAqbmV4dF9kc2E7CisgICAgdm9sYXRpbGUgdTMyICpuY3JjdXJyZW50OworICAgIGludCBsZWZ0OworICAgIFNjc2lfQ21uZCAqY21kLCAqbmV4dF9jbWQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHByaW50ayAoInNjc2klZCA6IGlzc3VlIHF1ZXVlXG4iLCBob3N0LT5ob3N0X25vKTsKKworICAgIGZvciAobGVmdCA9IGhvc3QtPmNhbl9xdWV1ZSwgY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IAorCSAgICBsZWZ0ID49IDAgJiYgY21kOyAKKwkgICAgY21kID0gbmV4dF9jbWQpIHsKKwluZXh0X2NtZCA9IChTY3NpX0NtbmQgKikgY21kLT5TQ3AucHRyOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoY21kLT5ob3N0X3NjcmliYmxlKSB7CisJICAgIGlmIChjaGVja19hZGRyZXNzICgodW5zaWduZWQgbG9uZykgKGNtZC0+aG9zdF9zY3JpYmJsZSksIAorCQlzaXplb2YgKGNtZC0+aG9zdF9zY3JpYmJsZSkpID09IC0xKQorCQlwcmludGsgKCJzY3NpJWQ6IHNjc2kgcGlkICVsZCBiYWQgcG9pbnRlciB0byBOQ1I1M2M3eDBfY21kXG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgY21kLT5waWQpOworCSAgICAvKiBwcmludF9kc2EgZG9lcyBzYW5pdHkgY2hlY2sgb24gYWRkcmVzcywgbm8gbmVlZCB0byBjaGVjayAqLworCSAgICBlbHNlCisJICAgIAlwcmludF9kc2EgKGhvc3QsICgoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5ob3N0X3NjcmliYmxlKQorCQkgICAgLT4gZHNhLCAiIik7CisJfSBlbHNlIAorCSAgICBwcmludGsgKCJzY3NpJWQgOiBzY3NpIHBpZCAlbGQgZm9yIHRhcmdldCAlZCBsdW4gJWQgaGFzIG5vIE5DUjUzYzd4MF9jbWRcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAobGVmdCA8PSAwKSB7CisJcHJpbnRrICgic2NzaSVkIDogbG9vcCBkZXRlY3RlZCBpbiBpc3N1ZSBxdWV1ZVxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUcmF2ZXJzZSB0aGUgTkNSIHJlY29ubmVjdCBhbmQgc3RhcnQgRFNBIHN0cnVjdHVyZXMsIHByaW50aW5nIG91dCAKKyAgICAgKiBlYWNoIGVsZW1lbnQgdW50aWwgd2UgaGl0IHRoZSBlbmQgb3IgZGV0ZWN0IGEgbG9vcC4gIEN1cnJlbnRseSwKKyAgICAgKiB0aGUgcmVjb25uZWN0IHN0cnVjdHVyZSBpcyBhIGxpbmtlZCBsaXN0OyBhbmQgdGhlIHN0YXJ0IHN0cnVjdHVyZQorICAgICAqIGlzIGFuIGFycmF5LiAgRXZlbnR1YWxseSwgdGhlIHJlY29ubmVjdCBzdHJ1Y3R1cmUgd2lsbCBiZWNvbWUgYSAKKyAgICAgKiBsaXN0IGFzIHdlbGwsIHNpbmNlIHRoaXMgc2ltcGxpZmllcyB0aGUgY29kZS4KKyAgICAgKi8KKworICAgIHByaW50ayAoInNjc2klZCA6IHNjaGVkdWxlIGRzYSBhcnJheSA6XG4iLCBob3N0LT5ob3N0X25vKTsKKyAgICBmb3IgKGxlZnQgPSBob3N0LT5jYW5fcXVldWUsIG5jcmN1cnJlbnQgPSBob3N0ZGF0YS0+c2NoZWR1bGU7CisJICAgIGxlZnQgPiAwOyBuY3JjdXJyZW50ICs9IDIsIC0tbGVmdCkKKwlpZiAobmNyY3VycmVudFswXSAhPSBob3N0ZGF0YS0+Tk9QX2luc24pIAorLyogRklYTUUgOiBjb252ZXJ0IHBvaW50ZXIgdG8gZHNhX2JlZ2luIHRvIHBvaW50ZXIgdG8gZHNhLiAqLworCSAgICBwcmludF9kc2EgKGhvc3QsIGJ1c190b192aXJ0IChuY3JjdXJyZW50WzFdIC0gCisJCShob3N0ZGF0YS0+RV9kc2FfY29kZV9iZWdpbiAtIAorCQlob3N0ZGF0YS0+RV9kc2FfY29kZV90ZW1wbGF0ZSkpLCAiIik7CisgICAgcHJpbnRrICgic2NzaSVkIDogZW5kIHNjaGVkdWxlIGRzYSBhcnJheVxuIiwgaG9zdC0+aG9zdF9ubyk7CisgICAgCisgICAgcHJpbnRrICgic2NzaSVkIDogcmVjb25uZWN0X2RzYV9oZWFkIDpcbiIsIGhvc3QtPmhvc3Rfbm8pOworCSAgICAKKyAgICBmb3IgKGxlZnQgPSBob3N0LT5jYW5fcXVldWUsIAorCWRzYSA9IGJ1c190b192aXJ0IChob3N0ZGF0YS0+cmVjb25uZWN0X2RzYV9oZWFkKTsKKwlsZWZ0ID49IDAgJiYgZHNhOyAKKwlkc2EgPSBuZXh0X2RzYSkgeworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoY2hlY2tfYWRkcmVzcyAoKHVuc2lnbmVkIGxvbmcpIGRzYSwgc2l6ZW9mKGRzYSkpID09IC0xKSB7CisJICAgIHByaW50ayAoInNjc2klZDogYmFkIERTQSBwb2ludGVyIDB4JXAiLCBob3N0LT5ob3N0X25vLAorCQlkc2EpOworCSAgICBuZXh0X2RzYSA9IE5VTEw7CisJfQorCWVsc2UgCisJeworCSAgICBuZXh0X2RzYSA9IGJ1c190b192aXJ0KGRzYVtob3N0ZGF0YS0+ZHNhX25leHQgLyBzaXplb2YodTMyKV0pOworCSAgICBwcmludF9kc2EgKGhvc3QsIGRzYSwgIiIpOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgfQorICAgIHByaW50ayAoInNjc2klZCA6IGVuZCByZWNvbm5lY3RfZHNhX2hlYWRcbiIsIGhvc3QtPmhvc3Rfbm8pOworICAgIGlmIChsZWZ0IDwgMCkKKwlwcmludGsoInNjc2klZDogcG9zc2libGUgbG9vcCBpbiBuY3IgcmVjb25uZWN0IGxpc3RcbiIsCisJICAgIGhvc3QtPmhvc3Rfbm8pOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbG90cyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAKKwkoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YVswXTsKKyAgICB1MzIgKmRzcF9uZXh0LCAqZHNwLCAqZHNhLCBkYmNfZGNtZDsKKyAgICB1bnNpZ25lZCBjaGFyIGRjbWQsIHNiY2w7CisgICAgaW50IGksIHNpemU7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworCisgICAgaWYgKChkc3BfbmV4dCA9IGJ1c190b192aXJ0KE5DUjUzYzd4MF9yZWFkMzIgKERTUF9SRUcpKSkpIHsKKyAgICAJZGJjX2RjbWQgPSBOQ1I1M2M3eDBfcmVhZDMyKERCQ19SRUcpOworICAgIAlkY21kID0gKGRiY19kY21kICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisgICAgCWRzcCA9IGRzcF9uZXh0IC0gTkNSNTNjN3gwX2luc25fc2l6ZShkY21kKTsKKwlkc2EgPSBidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKERTQV9SRUcpKTsKKwlzYmNsID0gTkNSNTNjN3gwX3JlYWQ4IChTQkNMX1JFRyk7CisJICAgIAorCS8qCisJICogRm9yIHRoZSA1M2M3MTAsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXBvcnQgdmFsdWUgMCBmb3IgU0NOVEwzCisJICogYW5kIFNURVNUMCAtIHdlIGRvbid0IGhhdmUgdGhlc2UgcmVnaXN0ZXJzLgorCSAqLworICAgIAlwcmludGsgKCJzY3NpJWQgOiBEQ01EfERCQz0weCV4LCBETkFEPTB4JXggKHZpcnQgMHglcClcbiIKKwkJIiAgICAgICAgIERTQT0weCVseCAodmlydCAweCVwKVxuIgorCSAgICAgICAgIiAgICAgICAgIERTUFM9MHgleCwgVEVNUD0weCV4ICh2aXJ0IDB4JXApLCBETU9ERT0weCV4XG4iCisJCSIgICAgICAgICBTWEZFUj0weCV4LCBTQ05UTDM9MHgleFxuIgorCQkiICAgICAgICAgJXMlcyVzcGhhc2U9JXMsICVkIGJ5dGVzIGluIFNDU0kgRklGT1xuIgorCQkiICAgICAgICAgU0NSQVRDSD0weCV4LCBzYXZlZDJfZHNhPTB4JTBseFxuIiwKKwkgICAgaG9zdC0+aG9zdF9ubywgZGJjX2RjbWQsIE5DUjUzYzd4MF9yZWFkMzIoRE5BRF9SRUcpLAorCQlidXNfdG9fdmlydChOQ1I1M2M3eDBfcmVhZDMyKEROQURfUkVHKSksCisJICAgIHZpcnRfdG9fYnVzKGRzYSksIGRzYSwKKwkgICAgTkNSNTNjN3gwX3JlYWQzMihEU1BTX1JFRyksIE5DUjUzYzd4MF9yZWFkMzIoVEVNUF9SRUcpLCAKKwkgICAgYnVzX3RvX3ZpcnQgKE5DUjUzYzd4MF9yZWFkMzIoVEVNUF9SRUcpKSwKKwkgICAgKGludCkgTkNSNTNjN3gwX3JlYWQ4KGhvc3RkYXRhLT5kbW9kZSksCisJICAgIChpbnQpIE5DUjUzYzd4MF9yZWFkOChTWEZFUl9SRUcpLCAKKwkgICAgKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkgPworCQkoaW50KSBOQ1I1M2M3eDBfcmVhZDgoU0NOVEwzX1JFR184MDApIDogMCwKKwkgICAgKHNiY2wgJiBTQkNMX0JTWSkgPyAiQlNZICIgOiAiIiwKKwkgICAgKHNiY2wgJiBTQkNMX1NFTCkgPyAiU0VMICIgOiAiIiwKKwkgICAgKHNiY2wgJiBTQkNMX1JFUSkgPyAiUkVRICIgOiAiIiwKKwkgICAgc3N0YXQyX3RvX3BoYXNlKE5DUjUzYzd4MF9yZWFkOCAoKChob3N0ZGF0YS0+Y2hpcCAvIDEwMCkgPT0gOCkgPworCSAgICAJU1NUQVQxX1JFRyA6IFNTVEFUMl9SRUcpKSwKKwkgICAgKE5DUjUzYzd4MF9yZWFkOCAoKGhvc3RkYXRhLT5jaGlwIC8gMTAwKSA9PSA4ID8gCisJCVNTVEFUMV9SRUcgOiBTU1RBVDJfUkVHKSAmIFNTVEFUMl9GRl9NQVNLKSA+PiBTU1RBVDJfRkZfU0hJRlQsCisJICAgICgoaG9zdGRhdGEtPmNoaXAgLyAxMDApID09IDgpID8gTkNSNTNjN3gwX3JlYWQ4IChTVEVTVDBfUkVHXzgwMCkgOgorCQlOQ1I1M2M3eDBfcmVhZDMyKFNDUkFUQ0hBX1JFR184MDApLAorCSAgICBob3N0ZGF0YS0+c2F2ZWQyX2RzYSk7CisJcHJpbnRrICgic2NzaSVkIDogRFNQIDB4JWx4ICh2aXJ0IDB4JXApIC0+XG4iLCBob3N0LT5ob3N0X25vLCAKKwkgICAgdmlydF90b19idXMoZHNwKSwgZHNwKTsKKyAgICAJZm9yIChpID0gNjsgaSA+IDA7IC0taSwgZHNwICs9IHNpemUpCisJICAgIHNpemUgPSBwcmludF9pbnNuIChob3N0LCBkc3AsICIiLCAxKTsKKwlpZiAoTkNSNTNjN3gwX3JlYWQ4IChTQ05UTDFfUkVHKSAmIFNDTlRMMV9DT04pICB7CisJICAgIGlmICgoaG9zdGRhdGEtPmNoaXAgLyAxMDApID09IDgpCisJICAgICAgICBwcmludGsgKCJzY3NpJWQgOiBjb25uZWN0ZWQgKFNESUQ9MHgleCwgU1NJRD0weCV4KVxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIE5DUjUzYzd4MF9yZWFkOCAoU0RJRF9SRUdfODAwKSwKKwkJICAgIE5DUjUzYzd4MF9yZWFkOCAoU1NJRF9SRUdfODAwKSk7CisJICAgIGVsc2UKKwkJcHJpbnRrICgic2NzaSVkIDogY29ubmVjdGVkIChTRElEPTB4JXgpXG4iLAorCQkgICAgaG9zdC0+aG9zdF9ubywgTkNSNTNjN3gwX3JlYWQ4IChTRElEX1JFR183MDApKTsKKwkgICAgcHJpbnRfZHNhIChob3N0LCBkc2EsICIiKTsKKwl9CisKKyNpZiAxCisJcHJpbnRfcXVldWVzIChob3N0KTsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBzaHV0ZG93biAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKKyAqIAorICogUHVycG9zZSA6IGRvZXMgYSBjbGVhbiAod2UgaG9wZSkgc2h1dGRvd24gb2YgdGhlIE5DUiBTQ1NJIAorICoJY2hpcC4gIFVzZSBwcmlvciB0byBkdW1waW5nIGNvcmUsIHVubG9hZGluZyB0aGUgTkNSIGRyaXZlciwKKyAqIAorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IAorc2h1dGRvd24gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIE5DUjUzYzd4MF9sb2NhbF9zZXR1cChob3N0KTsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisvKiBHZXQgaW4gYSBzdGF0ZSB3aGVyZSB3ZSBjYW4gcmVzZXQgdGhlIFNDU0kgYnVzICovCisgICAgbmNyX2hhbHQgKGhvc3QpOworICAgIG5jcl9zY3NpX3Jlc2V0IChob3N0KTsKKyAgICBob3N0ZGF0YS0+c29mdF9yZXNldChob3N0KTsKKworICAgIGRpc2FibGUgKGhvc3QpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBuY3Jfc2NzaV9yZXNldCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKKyAqCisgKiBQdXJwb3NlIDogcmVzZXQgdGhlIFNDU0kgYnVzLgorICovCisKK3N0YXRpYyB2b2lkIAorbmNyX3Njc2lfcmVzZXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfZGVjbGFyZSgpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgTkNSNTNjN3gwX2xvY2FsX3NldHVwKGhvc3QpOworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBOQ1I1M2M3eDBfd3JpdGU4KFNDTlRMMV9SRUcsIFNDTlRMMV9SU1QpOworICAgIHVkZWxheSgyNSk7CS8qIE1pbmltdW0gYW1vdW50IG9mIHRpbWUgdG8gYXNzZXJ0IFJTVCAqLworICAgIE5DUjUzYzd4MF93cml0ZTgoU0NOVEwxX1JFRywgMCk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBoYXJkX3Jlc2V0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqLworCitzdGF0aWMgdm9pZCAKK2hhcmRfcmVzZXQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgbmNyX3Njc2lfcmVzZXQoaG9zdCk7CisgICAgTkNSNTNjN3gwX2RyaXZlcl9pbml0IChob3N0KTsKKyAgICBpZiAoaG9zdGRhdGEtPnNvZnRfcmVzZXQpCisJaG9zdGRhdGEtPnNvZnRfcmVzZXQgKGhvc3QpOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisvKgorICogRnVuY3Rpb24gOiBTY3NpX0NtbmQgKnJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKyAqCWludCBmcmVlLCBpbnQgaXNzdWUpCisgKgorICogUHVycG9zZSA6IHJldHVybiBhIGxpbmtlZCBsaXN0ICh1c2luZyB0aGUgU0NwLmJ1ZmZlciBmaWVsZCBhcyBuZXh0LAorICoJc28gd2UgZG9uJ3QgcGVydHVyYiBob3N0ZGF0YS4gIFdlIGRvbid0IHVzZSBhIGZpZWxkIG9mIHRoZSAKKyAqCU5DUjUzYzd4MF9jbWQgc3RydWN0dXJlIHNpbmNlIHdlIG1heSBub3QgaGF2ZSBhbGxvY2F0ZWQgb25lIAorICoJZm9yIHRoZSBjb21tYW5kIGNhdXNpbmcgdGhlIHJlc2V0Likgb2YgU2NzaV9DbW5kIHN0cnVjdHVyZXMgdGhhdCAKKyAqICAJaGFkIHByb3BhZ2F0ZWQgYmVsb3cgdGhlIExpbnV4IGlzc3VlIHF1ZXVlIGxldmVsLiAgSWYgZnJlZSBpcyBzZXQsIAorICoJZnJlZSB0aGUgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggCisgKgl0aGUgU2NzaV9DbW5kIHN0cnVjdHVyZXMsIGFuZCBjbGVhbiB1cCBhbnkgaW50ZXJuYWwgCisgKglOQ1IgbGlzdHMgdGhhdCB0aGUgY29tbWFuZHMgd2VyZSBvbi4gIElmIGlzc3VlIGlzIHNldCwKKyAqCWFsc28gcmV0dXJuIGNvbW1hbmRzIGluIHRoZSBpc3N1ZSBxdWV1ZS4KKyAqCisgKiBSZXR1cm5zIDogbGlua2VkIGxpc3Qgb2YgY29tbWFuZHMKKyAqCisgKiBOT1RFIDogdGhlIGNhbGxlciBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIE5DUiBjaGlwIGlzIGhhbHRlZAorICoJaWYgdGhlIGZyZWUgZmxhZyBpcyBzZXQuIAorICovCisKK3N0YXRpYyBTY3NpX0NtbmQgKgorcmV0dXJuX291dHN0YW5kaW5nX2NvbW1hbmRzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgZnJlZSwgaW50IGlzc3VlKSB7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjOworICAgIGludCBpOworICAgIHUzMiAqbmNyY3VycmVudDsKKyAgICBTY3NpX0NtbmQgKmxpc3QgPSBOVUxMLCAqdG1wOworICAgIGZvciAoYyA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBob3N0ZGF0YS0+cnVubmluZ19saXN0OyBjOyAKKyAgICAJYyA9IChzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqKSBjLT5uZXh0KSAgeworCWlmIChjLT5jbWQtPlNDcC5idWZmZXIpIHsKKwkgICAgcHJpbnRrICgic2NzaSVkIDogbG9vcCBkZXRlY3RlZCBpbiBydW5uaW5nIGxpc3QhXG4iLCBob3N0LT5ob3N0X25vKTsKKwkgICAgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRrICgiRHVoPyBCYWQgdGhpbmdzIGhhcHBlbmluZyBpbiB0aGUgTkNSIGRyaXZlclxuIik7CisJICAgIGJyZWFrOworCX0KKworCWMtPmNtZC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgbGlzdDsKKwlsaXN0ID0gYy0+Y21kOworCWlmIChmcmVlKSB7CisgICAgCSAgICBjLT5uZXh0ID0gaG9zdGRhdGEtPmZyZWU7CisgICAgCSAgICBob3N0ZGF0YS0+ZnJlZSA9IGM7CisJfQorICAgIH0KKworICAgIGlmIChmcmVlKSB7IAorCWZvciAoaSA9IDAsIG5jcmN1cnJlbnQgPSAodTMyICopIGhvc3RkYXRhLT5zY2hlZHVsZTsgCisJICAgIGkgPCBob3N0LT5jYW5fcXVldWU7ICsraSwgbmNyY3VycmVudCArPSAyKSB7CisJICAgIG5jcmN1cnJlbnRbMF0gPSBob3N0ZGF0YS0+Tk9QX2luc247CisJICAgIG5jcmN1cnJlbnRbMV0gPSAweGRlYWRiZWVmOworCX0KKwlob3N0ZGF0YS0+bmNyY3VycmVudCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGlzc3VlKSB7CisJZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIHsKKwkgICAgaWYgKHRtcC0+U0NwLmJ1ZmZlcikgeworCQlwcmludGsgKCJzY3NpJWQgOiBsb29wIGRldGVjdGVkIGluIGlzc3VlIHF1ZXVlIVxuIiwgCisJCQlob3N0LT5ob3N0X25vKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgdG1wLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBsaXN0OworCSAgICBsaXN0ID0gdG1wOworCX0KKwlpZiAoZnJlZSkKKwkgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gTlVMTDsKKwkJCisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogc3RhdGljIGludCBkaXNhYmxlIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQorICoKKyAqIFB1cnBvc2UgOiBkaXNhYmxlcyB0aGUgZ2l2ZW4gTkNSIGhvc3QsIGNhdXNpbmcgYWxsIGNvbW1hbmRzCisgKiAJdG8gcmV0dXJuIGEgZHJpdmVyIGVycm9yLiAgQ2FsbCB0aGlzIHNvIHdlIGNhbiB1bmxvYWQgdGhlCisgKiAJbW9kdWxlIGR1cmluZyBkZXZlbG9wbWVudCBhbmQgdHJ5IGFnYWluLiAgRXZlbnR1YWxseSwgCisgKiAJd2Ugc2hvdWxkIGJlIGFibGUgdG8gZmluZCBjbGVhbiB3b3JrYXJvdW5kcyBmb3IgdGhlc2UKKyAqIAlwcm9ibGVtcy4KKyAqCisgKiBJbnB1dHMgOiBob3N0IC0gaG9zdGFkYXB0ZXIgdG8gdHdpZGRsZQorICoKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCAKK2Rpc2FibGUgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBTY3NpX0NtbmQgKm51a2VfbGlzdCwgKnRtcDsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgaWYgKGhvc3RkYXRhLT5zdGF0ZSAhPSBTVEFURV9IQUxURUQpCisJbmNyX2hhbHQgKGhvc3QpOworICAgIG51a2VfbGlzdCA9IHJldHVybl9vdXRzdGFuZGluZ19jb21tYW5kcyAoaG9zdCwgMSAvKiBmcmVlICovLCAxIC8qIGlzc3VlICovKTsKKyAgICBoYXJkX3Jlc2V0IChob3N0KTsKKyAgICBob3N0ZGF0YS0+c3RhdGUgPSBTVEFURV9ESVNBQkxFRDsKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgcHJpbnRrICgic2NzaSVkIDogbnVraW5nIGNvbW1hbmRzXG4iLCBob3N0LT5ob3N0X25vKTsKKyAgICBmb3IgKDsgbnVrZV9saXN0OyBudWtlX2xpc3QgPSB0bXApIHsKKwkgICAgdG1wID0gKFNjc2lfQ21uZCAqKSBudWtlX2xpc3QtPlNDcC5idWZmZXI7CisJICAgIG51a2VfbGlzdC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCSAgICBudWtlX2xpc3QtPnNjc2lfZG9uZShudWtlX2xpc3QpOworICAgIH0KKyAgICBwcmludGsgKCJzY3NpJWQgOiBkb25lLiBcbiIsIGhvc3QtPmhvc3Rfbm8pOworICAgIHByaW50ayAoS0VSTl9BTEVSVCAic2NzaSVkIDogZGlzYWJsZWQuICBVbmxvYWQgYW5kIHJlbG9hZFxuIiwKKyAgICAJaG9zdC0+aG9zdF9ubyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHN0YXRpYyBpbnQgbmNyX2hhbHQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBoYWx0cyB0aGUgU0NTSSBTQ1JJUFRTKHRtKSBwcm9jZXNzb3Igb24gdGhlIE5DUiBjaGlwCisgKgorICogSW5wdXRzIDogaG9zdCAtIFNDU0kgY2hpcCB0byBoYWx0CisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICovCisKK3N0YXRpYyBpbnQgCituY3JfaGFsdCAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIGlzdGF0LCB0bXA7CisgICAgc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSAqKQorCWhvc3QtPmhvc3RkYXRhWzBdOworICAgIGludCBzdGFnZTsKKyAgICBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCk7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgLyogU3RhZ2UgMCA6IGVhdCBhbGwgaW50ZXJydXB0cworICAgICAgIFN0YWdlIDEgOiBzZXQgQUJPUlQKKyAgICAgICBTdGFnZSAyIDogZWF0IGFsbCBidXQgYWJvcnQgaW50ZXJydXB0cworICAgICAgIFN0YWdlIDMgOiBlYXQgYWxsIGludGVycnVwdHMKKyAgICAgKi8KKyAgICBmb3IgKHN0YWdlID0gMDs7KSB7CisJaWYgKHN0YWdlID09IDEpIHsKKwkgICAgTkNSNTNjN3gwX3dyaXRlOChob3N0ZGF0YS0+aXN0YXQsIElTVEFUX0FCUlQpOworCSAgICArK3N0YWdlOworCX0KKwlpc3RhdCA9IE5DUjUzYzd4MF9yZWFkOCAoaG9zdGRhdGEtPmlzdGF0KTsKKwlpZiAoaXN0YXQgJiBJU1RBVF9TSVApIHsKKwkgICAgdG1wID0gTkNSNTNjN3gwX3JlYWQ4KFNTVEFUMF9SRUcpOworCX0gZWxzZSBpZiAoaXN0YXQgJiBJU1RBVF9ESVApIHsKKwkgICAgdG1wID0gTkNSNTNjN3gwX3JlYWQ4KERTVEFUX1JFRyk7CisJICAgIGlmIChzdGFnZSA9PSAyKSB7CisJCWlmICh0bXAgJiBEU1RBVF9BQlJUKSB7CisJCSAgICBOQ1I1M2M3eDBfd3JpdGU4KGhvc3RkYXRhLT5pc3RhdCwgMCk7CisJCSAgICArK3N0YWdlOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKEtFUk5fQUxFUlQgInNjc2klZCA6IGNvdWxkIG5vdCBoYWx0IE5DUiBjaGlwXG4iLCAKKwkJCWhvc3QtPmhvc3Rfbm8pOworCQkgICAgZGlzYWJsZSAoaG9zdCk7CisJICAgIAl9CisgICAgCSAgICB9CisJfQorCWlmICghKGlzdGF0ICYgKElTVEFUX1NJUHxJU1RBVF9ESVApKSkgeworCSAgICBpZiAoc3RhZ2UgPT0gMCkKKwkgICAgCSsrc3RhZ2U7CisJICAgIGVsc2UgaWYgKHN0YWdlID09IDMpCisJCWJyZWFrOworCX0KKyAgICB9CisgICAgaG9zdGRhdGEtPnN0YXRlID0gU1RBVEVfSEFMVEVEOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNpZiAwCisgICAgcHJpbnRfbG90cyAoaG9zdCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworLyogCisgKiBGdW5jdGlvbjogZXZlbnRfbmFtZSAoaW50IGV2ZW50KQorICogCisgKiBQdXJwb3NlOiBtYXAgZXZlbnQgZW51bSBpbnRvIHVzZXItcmVhZGFibGUgc3RyaW5ncy4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitldmVudF9uYW1lIChpbnQgZXZlbnQpIHsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBFVkVOVF9OT05FOgkJcmV0dXJuICJub25lIjsKKyAgICBjYXNlIEVWRU5UX0lTU1VFX1FVRVVFOglyZXR1cm4gInRvIGlzc3VlIHF1ZXVlIjsKKyAgICBjYXNlIEVWRU5UX1NUQVJUX1FVRVVFOglyZXR1cm4gInRvIHN0YXJ0IHF1ZXVlIjsKKyAgICBjYXNlIEVWRU5UX1NFTEVDVDoJCXJldHVybiAic2VsZWN0ZWQiOworICAgIGNhc2UgRVZFTlRfRElTQ09OTkVDVDoJcmV0dXJuICJkaXNjb25uZWN0ZWQiOworICAgIGNhc2UgRVZFTlRfUkVTRUxFQ1Q6CXJldHVybiAicmVzZWxlY3RlZCI7CisgICAgY2FzZSBFVkVOVF9DT01QTEVURToJcmV0dXJuICJjb21wbGV0ZWQiOworICAgIGNhc2UgRVZFTlRfSURMRToJCXJldHVybiAiaWRsZSI7CisgICAgY2FzZSBFVkVOVF9TRUxFQ1RfRkFJTEVEOglyZXR1cm4gInNlbGVjdCBmYWlsZWQiOworICAgIGNhc2UgRVZFTlRfQkVGT1JFX1NFTEVDVDoJcmV0dXJuICJiZWZvcmUgc2VsZWN0IjsKKyAgICBjYXNlIEVWRU5UX1JFU0VMRUNUX0ZBSUxFRDoJcmV0dXJuICJyZXNlbGVjdCBmYWlsZWQiOworICAgIGRlZmF1bHQ6CQkJcmV0dXJuICJ1bmtub3duIjsKKyAgICB9Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgZHVtcF9ldmVudHMgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNvdW50KQorICoKKyAqIFB1cnBvc2UgOiBwcmludCBsYXN0IGNvdW50IGV2ZW50cyB3aGljaCBoYXZlIG9jY3VycmVkLgorICovIAorc3RhdGljIHZvaWQKK2R1bXBfZXZlbnRzIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgY291bnQpIHsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopCisJaG9zdC0+aG9zdGRhdGFbMF07CisgICAgc3RydWN0IE5DUjUzYzd4MF9ldmVudCBldmVudDsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGlmIChob3N0ZGF0YS0+ZXZlbnRzKSB7CisJaWYgKGNvdW50ID4gaG9zdGRhdGEtPmV2ZW50X3NpemUpCisJICAgIGNvdW50ID0gaG9zdGRhdGEtPmV2ZW50X3NpemU7CisJZm9yIChpID0gaG9zdGRhdGEtPmV2ZW50X2luZGV4OyBjb3VudCA+IDA7IAorCSAgICBpID0gKGkgPyBpIC0gMSA6IGhvc3RkYXRhLT5ldmVudF9zaXplIC0xKSwgLS1jb3VudCkgeworLyoKKyAqIEJ5IGNvcHlpbmcgdGhlIGV2ZW50IHdlJ3JlIGN1cnJlbnRseSBleGFtaW5pbmcgd2l0aCBpbnRlcnJ1cHRzCisgKiBkaXNhYmxlZCwgd2UgY2FuIGRvIG11bHRpcGxlIHByaW50aygpLCBldGMuIG9wZXJhdGlvbnMgYW5kIAorICogc3RpbGwgYmUgZ3VhcmFudGVlZCB0aGF0IHRoZXkncmUgaGFwcGVuaW5nIG9uIHRoZSBzYW1lIAorICogZXZlbnQgc3RydWN0dXJlLgorICovCisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyNpZiAwCisJICAgIGV2ZW50ID0gaG9zdGRhdGEtPmV2ZW50c1tpXTsKKyNlbHNlCisJICAgIG1lbWNweSAoKHZvaWQgKikgJmV2ZW50LCAodm9pZCAqKSAmKGhvc3RkYXRhLT5ldmVudHNbaV0pLAorCQlzaXplb2YoZXZlbnQpKTsKKyNlbmRpZgorCisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgcHJpbnRrICgic2NzaSVkIDogJXMgZXZlbnQgJWQgYXQgJWxkIHNlY3MgJWxkIHVzZWNzIHRhcmdldCAlZCBsdW4gJWRcbiIsCisJCWhvc3QtPmhvc3Rfbm8sIGV2ZW50X25hbWUgKGV2ZW50LmV2ZW50KSwgY291bnQsCisJCShsb25nKSBldmVudC50aW1lLnR2X3NlYywgKGxvbmcpIGV2ZW50LnRpbWUudHZfdXNlYywKKwkJZXZlbnQudGFyZ2V0LCBldmVudC5sdW4pOworCSAgICBpZiAoZXZlbnQuZHNhKSAKKwkJcHJpbnRrICgiICAgICAgICAgZXZlbnQgZm9yIGRzYSAweCVseCAodmlydCAweCVwKVxuIiwgCisJCSAgICB2aXJ0X3RvX2J1cyhldmVudC5kc2EpLCBldmVudC5kc2EpOworCSAgICBpZiAoZXZlbnQucGlkICE9IC0xKSB7CisJCXByaW50ayAoIiAgICAgICAgIGV2ZW50IGZvciBwaWQgJWxkICIsIGV2ZW50LnBpZCk7CisJCXByaW50X2NvbW1hbmQgKGV2ZW50LmNtbmQpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIEZ1bmN0aW9uOiBjaGVja19hZGRyZXNzCisgKgorICogUHVycG9zZTogQ2hlY2sgdG8gc2VlIGlmIGEgcG9zc2libHkgY29ycnVwdCBwb2ludGVyIHdpbGwgZmF1bHQgdGhlIAorICoJa2VybmVsLgorICoKKyAqIElucHV0czogYWRkciAtIGFkZHJlc3M7IHNpemUgLSBzaXplIG9mIGFyZWEKKyAqCisgKiBSZXR1cm5zOiAwIGlmIGFyZWEgaXMgT0ssIC0xIG9uIGVycm9yLgorICoKKyAqIE5PVEVTOiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdnZlcmlmeSBvbiBrZXJuZWxzIAorICoJdGhhdCBoYXZlIGl0LgorICovCisKK3N0YXRpYyBpbnQgCitjaGVja19hZGRyZXNzICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBzaXplKSB7CisgICAgcmV0dXJuICh2aXJ0X3RvX3BoeXMoKHZvaWQgKilhZGRyKSA8IFBBR0VfU0laRSB8fCB2aXJ0X3RvX3BoeXMoKHZvaWQgKikoYWRkciArIHNpemUpKSA+IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkgPyAgLTEgOiAwKTsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IAorTkNSNTNjN3gwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkgeworICAgIHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKmhvc3RkYXRhID0gCisJKHN0cnVjdCBOQ1I1M2M3eDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisgICAgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCwgKnRtcDsKKyAgICBzaHV0ZG93biAoaG9zdCk7CisgICAgaWYgKGhvc3QtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCXsKKwkgICAgaW50IGlycV9jb3VudDsKKwkgICAgc3RydWN0IFNjc2lfSG9zdCAqdG1wOworCSAgICBmb3IgKGlycV9jb3VudCA9IDAsIHRtcCA9IGZpcnN0X2hvc3Q7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQorCQlpZiAodG1wLT5ob3N0dCA9PSB0aGVfdGVtcGxhdGUgJiYgdG1wLT5pcnEgPT0gaG9zdC0+aXJxKQorCQkgICAgKytpcnFfY291bnQ7CisJICAgIGlmIChpcnFfY291bnQgPT0gMSkKKwkJZnJlZV9pcnEoaG9zdC0+aXJxLCBOVUxMKTsKKwl9CisgICAgaWYgKGhvc3QtPmRtYV9jaGFubmVsICE9IERNQV9OT05FKQorCWZyZWVfZG1hKGhvc3QtPmRtYV9jaGFubmVsKTsKKyAgICBpZiAoaG9zdC0+aW9fcG9ydCkKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworICAgIAorICAgIGZvciAoY21kID0gKHN0cnVjdCBOQ1I1M2M3eDBfY21kICopIGhvc3RkYXRhLT5mcmVlOyBjbWQ7IGNtZCA9IHRtcCwgCisJLS1ob3N0ZGF0YS0+bnVtX2NtZHMpIHsKKwl0bXAgPSAoc3RydWN0IE5DUjUzYzd4MF9jbWQgKikgY21kLT5uZXh0OworICAgIC8qIAorICAgICAqIElmIHdlJ3JlIGdvaW5nIHRvIGxvb3AsIHRyeSB0byBzdG9wIGl0IHRvIGdldCBhIG1vcmUgYWNjdXJhdGUKKyAgICAgKiBjb3VudCBvZiB0aGUgbGVha2VkIGNvbW1hbmRzLgorICAgICAqLworCWNtZC0+bmV4dCA9IE5VTEw7CisJaWYgKGNtZC0+ZnJlZSkKKwkgICAgY21kLT5mcmVlICgodm9pZCAqKSBjbWQtPnJlYWwsIGNtZC0+c2l6ZSk7CisgICAgfQorICAgIGlmIChob3N0ZGF0YS0+bnVtX2NtZHMpCisJcHJpbnRrICgic2NzaSVkIDogbGVha2VkICVkIE5DUjUzYzd4MF9jbWQgc3RydWN0dXJlc1xuIiwKKwkgICAgaG9zdC0+aG9zdF9ubywgaG9zdGRhdGEtPm51bV9jbWRzKTsKKyAgICBpZiAoaG9zdGRhdGEtPmV2ZW50cykgCisJdmZyZWUgKCh2b2lkICopaG9zdGRhdGEtPmV2ZW50cyk7CisKKyAgICAvKiBYWFggVGhpcyBhc3N1bWVzIGRlZmF1bHQgY2FjaGUgbW9kZSB0byBiZSBJT01BUF9GVUxMX0NBQ0hJTkcsIHdoaWNoCisgICAgICogWFhYIG1heSBiZSBpbnZhbGlkIChDT05GSUdfMDYwX1dSSVRFVEhST1VHSCkKKyAgICAgKi8KKyAgICBrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKWhvc3RkYXRhLCA4MTkyLCBJT01BUF9GVUxMX0NBQ0hJTkcpOworICAgIGZyZWVfcGFnZXMgKCh1MzIpaG9zdGRhdGEsIDEpOworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIGRlZiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguaCBiL2RyaXZlcnMvc2NzaS81M2M3eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA5OGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5oCkBAIC0wLDAgKzEsMTYwOCBAQAorLyoKKyAqIDUzYzcxMCBkcml2ZXIuICBNb2RpZmllZCBmcm9tIERyZXcgRWNraGFyZHRzIGRyaXZlcgorICogZm9yIDUzYzgxMCBieSBSaWNoYXJkIEhpcnN0IFtyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWtdCisgKgorICogSSBoYXZlIGxlZnQgdGhlIGNvZGUgZm9yIHRoZSA1M2M4eHggZmFtaWx5IGluIGhlcmUsIGJlY2F1c2UgaXQgZGlkbid0CisgKiBzZWVtIHdvcnRoIHJlbW92aW5nIGl0LiAgVGhlIHBvc3NpYmlsaXR5IG9mIElPX01BUFBFRCBjaGlwcyByYXRoZXIKKyAqIHRoYW4gTUVNT1JZX01BUFBFRCByZW1haW5zLCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8gYWRkIHN1cHBvcnQgZm9yCisgKiA1M2M3MTAgY2hpcHMgb24gSW50ZWwgUENzIChzb21lIG9sZGVyIG1hY2hpbmVzIGhhdmUgdGhlbSBvbiB0aGUKKyAqIG1vdGhlcmJvYXJkKS4KKyAqCisgKiBOT1RFIFRIRVJFIE1BWSBCRSBQUk9CTEVNUyBXSVRIIENBU1RTIElOIHJlYWQ4IEFORCBDby4KKyAqLworCisvKgorICogTkNSIDUzY3s3LDh9MHgwIGRyaXZlciwgaGVhZGVyIGZpbGUKKyAqCisgKiBTcG9uc29yZWQgYnkKKyAqICAgICAgaVggTXVsdGl1c2VyIE11bHRpdGFza2luZyBNYWdhemluZQorICoJSGFubm92ZXIsIEdlcm1hbnkKKyAqCWhtQGl4LmRlCQorICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgZHJld0BQb29oU3RpY2tzLk9SRworICoJKzEgKDMwMykgNzg2LTc5NzUKKyAqCisgKiBUb2xlckFOVCBhbmQgU0NTSSBTQ1JJUFRTIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTkNSIENvcnBvcmF0aW9uLgorICogCisgKiBQUkUtQUxQSEEKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzQzcwMC81M0M3MDAtNjYKKyAqIFNDU0kgSS9PIFByb2Nlc3NvcgorICogRGF0YSBNYW51YWwKKyAqCisgKiBOQ1IgNTNDODEwCisgKiBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yIAorICogRGF0YSBNYW51YWwKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiArMSAoNzE5KSA1NzgtMzQwMAorICoKKyAqIFRvbGwgZnJlZSBsaXRlcmF0dXJlIG51bWJlcgorICogKzEgKDgwMCkgMzM0LTU0NTQKKyAqCisgKi8KKworI2lmbmRlZiBOQ1I1M2M3MTBfSAorI2RlZmluZSBOQ1I1M2M3MTBfSAorCisjaWZuZGVmIEhPU1RTX0MKKworLyogU0NTSSBjb250cm9sIDAgcncsIGRlZmF1bHQgPSAweGMwICovIAorI2RlZmluZSBTQ05UTDBfUkVHIAkJMHgwMAkKKyNkZWZpbmUgU0NOVEwwX0FSQjEJCTB4ODAJLyogMCAwID0gc2ltcGxlIGFyYml0cmF0aW9uICovCisjZGVmaW5lIFNDTlRMMF9BUkIyCQkweDQwCS8qIDEgMSA9IGZ1bGwgYXJiaXRyYXRpb24gKi8KKyNkZWZpbmUgU0NOVEwwX1NUUlQJCTB4MjAJLyogU3RhcnQgU2VxdWVuY2UgKi8KKyNkZWZpbmUgU0NOVEwwX1dBVE4JCTB4MTAJLyogU2VsZWN0IHdpdGggQVROICovCisjZGVmaW5lIFNDTlRMMF9FUEMJCTB4MDgJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworLyogQml0IDIgaXMgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworI2RlZmluZSBTQ05UTDBfRVBHXzcwMAkJMHgwNAkvKiBFbmFibGUgcGFyaXR5IGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgU0NOVEwwX0FBUAkJMHgwMgkvKiAgQVROLyBvbiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgU0NOVEwwX1RSRwkJMHgwMQkvKiBUYXJnZXQgbW9kZSAqLworCisvKiBTQ1NJIGNvbnRyb2wgMSBydywgZGVmYXVsdCA9IDB4MDAgKi8KKworI2RlZmluZSBTQ05UTDFfUkVHIAkJMHgwMQkKKyNkZWZpbmUgU0NOVEwxX0VYQwkJMHg4MAkvKiBFeHRyYSBDbG9jayBDeWNsZSBvZiBEYXRhIHNldHVwICovCisjZGVmaW5lIFNDTlRMMV9BREIJCTB4NDAJLyogIGNvbnRlbnRzIG9mIFNPREwgb24gYnVzICovCisjZGVmaW5lIFNDTlRMMV9FU1JfNzAwCQkweDIwCS8qIEVuYWJsZSBTSU9QIHJlc3BvbnNlIHRvIHNlbGVjdGlvbiAKKwkJCQkJICAgYW5kIHJlc2VsZWN0aW9uICovCisjZGVmaW5lIFNDTlRMMV9ESFBfODAwCQkweDIwCS8qIERpc2FibGUgaGFsdCBvbiBwYXJpdHkgZXJyb3Igb3IgQVROCisJCQkJCSAgIHRhcmdldCBtb2RlIG9ubHkgKi8KKyNkZWZpbmUgU0NOVEwxX0NPTgkJMHgxMAkvKiBDb25uZWN0ZWQgKi8KKyNkZWZpbmUgU0NOVEwxX1JTVAkJMHgwOAkvKiBTQ1NJIFJTVC8gKi8KKyNkZWZpbmUgU0NOVEwxX0FFU1AJCTB4MDQJLyogRm9yY2UgYmFkIHBhcml0eSAqLworI2RlZmluZSBTQ05UTDFfU05EXzcwMAkJMHgwMgkvKiBTdGFydCBTQ1NJIHNlbmQgKi8KKyNkZWZpbmUgU0NOVEwxX0lBUkJfODAwCQkweDAyCS8qIEltbWVkaWF0ZSBBcmJpdHJhdGlvbiwgc3RhcnQKKwkJCQkJICAgYXJiaXRyYXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIKKwkJCQkJICAgYnVzZnJlZSBpcyBkZXRlY3RlZCAqLworI2RlZmluZSBTQ05UTDFfUkNWXzcwMAkJMHgwMQkvKiBTdGFydCBTQ1NJIHJlY2VpdmUgKi8KKyNkZWZpbmUgU0NOVEwxX1NTVF84MDAJCTB4MDEJLyogU3RhcnQgU0NTSSB0cmFuc2ZlciAqLworCisvKiBTQ1NJIGNvbnRyb2wgMiBydywgKi8KKworI2RlZmluZSBTQ05UTDJfUkVHXzgwMAkJMHgwMgkKKyNkZWZpbmUgU0NOVEwyXzgwMF9TRFUJCTB4ODAJLyogU0NTSSBkaXNjb25uZWN0IHVuZXhwZWN0ZWQgKi8KKworLyogU0NTSSBjb250cm9sIDMgcncgKi8KKworI2RlZmluZSBTQ05UTDNfUkVHXzgwMCAJCTB4MDMJCisjZGVmaW5lIFNDTlRMM184MDBfU0NGX1NISUZUCTQKKyNkZWZpbmUgU0NOVEwzXzgwMF9TQ0ZfTUFTSwkweDcwCisjZGVmaW5lIFNDTlRMM184MDBfU0NGMgkJMHg0MAkvKiBTeW5jaHJvbm91cyBkaXZpc29yICovCisjZGVmaW5lIFNDTlRMM184MDBfU0NGMQkJMHgyMAkvKiAweDAwID0gU0NMSy8zICovCisjZGVmaW5lIFNDTlRMM184MDBfU0NGMAkJMHgxMAkvKiAweDEwID0gU0NMSy8xICovCisJCQkJCS8qIDB4MjAgPSBTQ0xLLzEuNSAKKwkJCQkJICAgMHgzMCA9IFNDTEsvMiAKKwkJCQkJICAgMHg0MCA9IFNDTEsvMyAqLworCSAgICAKKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0ZfU0hJRlQJMAorI2RlZmluZSBTQ05UTDNfODAwX0NDRl9NQVNLCTB4MDcKKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0YyCQkweDA0CS8qIDB4MDAgNTAuMDEgdG8gNjYgKi8KKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0YxCQkweDAyCS8qIDB4MDEgMTYuNjcgdG8gMjUgKi8KKyNkZWZpbmUgU0NOVEwzXzgwMF9DQ0YwCQkweDAxCS8qIDB4MDIJMjUuMDEgLSAzNy41IAorCQkJCQkgICAweDAzCTM3LjUxIC0gNTAgCisJCQkJCSAgIDB4MDQgNTAuMDEgLSA2NiAqLworCisvKiAgCisgKiBTQ1NJIGRlc3RpbmF0aW9uIElEIHJ3IC0gdGhlIGFwcHJvcHJpYXRlIGJpdCBpcyBzZXQgZm9yIHRoZSBzZWxlY3RlZAorICogdGFyZ2V0IElELiAgVGhpcyBpcyB3cml0dGVuIGJ5IHRoZSBTQ1NJIFNDUklQVFMgcHJvY2Vzc29yLgorICogZGVmYXVsdCA9IDB4MDAKKyAqLworI2RlZmluZSBTRElEX1JFR183MDAgIAkJMHgwMgkKKyNkZWZpbmUgU0RJRF9SRUdfODAwCQkweDA2CisKKyNkZWZpbmUgR1BfUkVHXzgwMAkJMHgwNwkvKiBHZW5lcmFsIHB1cnBvc2UgSU8gKi8KKyNkZWZpbmUgR1BfODAwX0lPMQkJMHgwMgorI2RlZmluZSBHUF84MDBfSU8yCQkweDAxCisKKy8qIFNDU0kgaW50ZXJydXB0IGVuYWJsZSBydywgZGVmYXVsdCA9IDB4MDAgKi8KKyNkZWZpbmUgU0lFTl9SRUdfNzAwCQkweDAzCQorI2RlZmluZSBTSUVOMF9SRUdfODAwCQkweDQwCisjZGVmaW5lIFNJRU5fTUEJCQkweDgwCS8qIFBoYXNlIG1pc21hdGNoIChpbmkpIG9yIEFUTiAodGd0KSAqLworI2RlZmluZSBTSUVOX0ZDCQkJMHg0MAkvKiBGdW5jdGlvbiBjb21wbGV0ZSAqLworI2RlZmluZSBTSUVOXzcwMF9TVE8JCTB4MjAJLyogU2VsZWN0aW9uIG9yIHJlc2VsZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lFTl84MDBfU0VMCQkweDIwCS8qIFNlbGVjdGVkICovCisjZGVmaW5lIFNJRU5fNzAwX1NFTAkJMHgxMAkvKiBTZWxlY3RlZCBvciByZXNlbGVjdGVkICovCisjZGVmaW5lIFNJRU5fODAwX1JFU0VMCQkweDEwCS8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgU0lFTl9TR0UJCTB4MDgJLyogU0NTSSBncm9zcyBlcnJvciAqLworI2RlZmluZSBTSUVOX1VEQwkJMHgwNAkvKiBVbmV4cGVjdGVkIGRpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgU0lFTl9SU1QJCTB4MDIJLyogU0NTSSBSU1QvIHJlY2VpdmVkICovCisjZGVmaW5lIFNJRU5fUEFSCQkweDAxCS8qIFBhcml0eSBlcnJvciAqLworCisvKiAKKyAqIFNDU0kgY2hpcCBJRCBydworICogTkNSNTNjNzAwIDogCisgKiAJV2hlbiBhcmJpdHJhdGluZywgdGhlIGhpZ2hlc3QgYml0IGlzIHVzZWQsIHdoZW4gcmVzZWxlY3Rpb24gb3Igc2VsZWN0aW9uCisgKiAJb2NjdXJzLCB0aGUgY2hpcCByZXNwb25kcyB0byBhbGwgSURzIGZvciB3aGljaCBhIGJpdCBpcyBzZXQuCisgKiAJZGVmYXVsdCA9IDB4MDAgCisgKiBOQ1I1M2M4MTAgOiAKKyAqCVVzZXMgYml0IG1hcHBpbmcKKyAqLworI2RlZmluZSBTQ0lEX1JFRwkJMHgwNAkKKy8qIEJpdCA3IGlzIHJlc2VydmVkIG9uIDgwMCBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgU0NJRF84MDBfUlJFCQkweDQwCS8qIEVuYWJsZSByZXNwb25zZSB0byByZXNlbGVjdGlvbiAqLworI2RlZmluZSBTQ0lEXzgwMF9TUkUJCTB4MjAJLyogRW5hYmxlIHJlc3BvbnNlIHRvIHNlbGVjdGlvbiAqLworLyogQml0cyBmb3VyIGFuZCB0aHJlZSBhcmUgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworI2RlZmluZSBTQ0lEXzgwMF9FTkNfTUFTSwkweDA3CS8qIEVuY29kZWQgU0NTSSBJRCAqLworCisvKiBTQ1NJIHRyYW5zZmVyIHJ3LCBkZWZhdWx0ID0gMHgwMCAqLworI2RlZmluZSBTWEZFUl9SRUcJCTB4MDUKKyNkZWZpbmUgU1hGRVJfREhQCQkweDgwCS8qIERpc2FibGUgaGFsdCBvbiBwYXJpdHkgKi8KKworI2RlZmluZSBTWEZFUl9UUDIJCTB4NDAJLyogVHJhbnNmZXIgcGVyaW9kIG1zYiAqLworI2RlZmluZSBTWEZFUl9UUDEJCTB4MjAKKyNkZWZpbmUgU1hGRVJfVFAwCQkweDEwCS8qIGxzYiAqLworI2RlZmluZSBTWEZFUl9UUF9NQVNLCQkweDcwCisvKiBGSVhNRSA6IFNYRkVSX1RQX1NISUZUID09IDUgaXMgcmlnaHQgZm9yICc4eHggY2hpcHMgKi8KKyNkZWZpbmUgU1hGRVJfVFBfU0hJRlQJCTUKKyNkZWZpbmUgU1hGRVJfVFBfNAkJMHgwMAkvKiBEaXZpc29ycyAqLworI2RlZmluZSBTWEZFUl9UUF81CQkweDEwPDwxCisjZGVmaW5lIFNYRkVSX1RQXzYJCTB4MjA8PDEKKyNkZWZpbmUgU1hGRVJfVFBfNwkJMHgzMDw8MQorI2RlZmluZSBTWEZFUl9UUF84CQkweDQwPDwxCisjZGVmaW5lIFNYRkVSX1RQXzkJCTB4NTA8PDEKKyNkZWZpbmUgU1hGRVJfVFBfMTAJCTB4NjA8PDEKKyNkZWZpbmUgU1hGRVJfVFBfMTEJCTB4NzA8PDEKKworI2RlZmluZSBTWEZFUl9NTzMJCTB4MDgJLyogTWF4IG9mZnNldCBtc2IgKi8KKyNkZWZpbmUgU1hGRVJfTU8yCQkweDA0CisjZGVmaW5lIFNYRkVSX01PMQkJMHgwMgorI2RlZmluZSBTWEZFUl9NTzAJCTB4MDEJLyogbHNiICovCisjZGVmaW5lIFNYRkVSX01PX01BU0sJCTB4MGYKKyNkZWZpbmUgU1hGRVJfTU9fU0hJRlQJCTAKKworLyogCisgKiBTQ1NJIG91dHB1dCBkYXRhIGxhdGNoIHJ3CisgKiBUaGUgY29udGVudHMgb2YgdGhpcyByZWdpc3RlciBhcmUgZHJpdmVuIG9udG8gdGhlIFNDU0kgYnVzIHdoZW4gCisgKiB0aGUgQXNzZXJ0IERhdGEgQnVzIGJpdCBvZiB0aGUgU0NOVEwxIHJlZ2lzdGVyIGlzIHNldCBhbmQgCisgKiB0aGUgQ0QsIElPLCBhbmQgTVNHIGJpdHMgb2YgdGhlIFNPQ0wgcmVnaXN0ZXIgbWF0Y2ggdGhlIFNDU0kgcGhhc2UKKyAqLworI2RlZmluZSBTT0RMX1JFR183MDAJCTB4MDYJCisjZGVmaW5lIFNPRExfUkVHXzgwMAkJMHg1NAorCisKKy8qIAorICogU0NTSSBvdXRwdXQgY29udHJvbCBsYXRjaCBydywgZGVmYXVsdCA9IDAgCisgKiBOb3RlIHRoYXQgd2hlbiB0aGUgY2hpcCBpcyBiZWluZyBtYW51YWxseSBwcm9ncmFtbWVkIGFzIGFuIGluaXRpYXRvciwKKyAqIHRoZSBNU0csIENELCBhbmQgSU8gYml0cyBtdXN0IGJlIHNldCBjb3JyZWN0bHkgZm9yIHRoZSBwaGFzZSB0aGUgdGFyZ2V0CisgKiBpcyBkcml2aW5nIHRoZSBidXMgaW4uICBPdGhlcndpc2Ugbm8gZGF0YSB0cmFuc2ZlciB3aWxsIG9jY3VyIGR1ZSB0byAKKyAqIHBoYXNlIG1pc21hdGNoLgorICovCisKKyNkZWZpbmUgU09DTF9SRUcJCTB4MDcKKyNkZWZpbmUgU09DTF9SRVEJCTB4ODAJLyogIFJFUSAqLworI2RlZmluZSBTT0NMX0FDSwkJMHg0MAkvKiAgQUNLICovCisjZGVmaW5lIFNPQ0xfQlNZCQkweDIwCS8qICBCU1kgKi8KKyNkZWZpbmUgU09DTF9TRUwJCTB4MTAJLyogIFNFTCAqLworI2RlZmluZSBTT0NMX0FUTgkJMHgwOAkvKiAgQVROICovCisjZGVmaW5lIFNPQ0xfTVNHCQkweDA0CS8qICBNU0cgKi8KKyNkZWZpbmUgU09DTF9DRAkJCTB4MDIJLyogIEMvRCAqLworI2RlZmluZSBTT0NMX0lPCQkJMHgwMQkvKiAgSS9PICovCisKKy8qIAorICogU0NTSSBmaXJzdCBieXRlIHJlY2VpdmVkIGxhdGNoIHJvIAorICogVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgZmlyc3QgYnl0ZSByZWNlaXZlZCBkdXJpbmcgYSBibG9jayBNT1ZFIAorICogU0NTSSBTQ1JJUFRTIGluc3RydWN0aW9uLCBpbmNsdWRpbmcKKyAqIAorICogSW5pdGlhdG9yIG1vZGUJVGFyZ2V0IG1vZGUKKyAqIE1lc3NhZ2UgaW4JCUNvbW1hbmQKKyAqIFN0YXR1cwkJTWVzc2FnZSBvdXQKKyAqIERhdGEgaW4JCURhdGEgb3V0CisgKgorICogSXQgYWxzbyBjb250YWlucyB0aGUgc2VsZWN0aW5nIG9yIHJlc2VsZWN0aW5nIGRldmljZSdzIElEIGFuZCBvdXIgCisgKiBJRC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgcmVnaXN0ZXIgdGhlIHZhcmlvdXMgSUYgY29uZGl0aW9uYWxzIGNhbiAKKyAqIG9wZXJhdGUgb24uCisgKi8KKyNkZWZpbmUgU0ZCUl9SRUcJCTB4MDgJCisKKy8qIAorICogU0NTSSBpbnB1dCBkYXRhIGxhdGNoIHJvCisgKiBJbiBpbml0aWF0b3IgbW9kZSwgZGF0YSBpcyBsYXRjaGVkIGludG8gdGhpcyByZWdpc3RlciBvbiB0aGUgcmlzaW5nCisgKiBlZGdlIG9mIFJFUS8uIEluIHRhcmdldCBtb2RlLCBkYXRhIGlzIGxhdGNoZWQgb24gdGhlIHJpc2luZyBlZGdlIG9mIAorICogQUNLLworICovCisjZGVmaW5lIFNJRExfUkVHXzcwMAkJMHgwOQorI2RlZmluZSBTSURMX1JFR184MDAJCTB4NTAKKworLyogCisgKiBTQ1NJIGJ1cyBkYXRhIGxpbmVzIHJvIAorICogVGhpcyByZWdpc3RlciByZWZsZWN0cyB0aGUgaW5zdGFudGFuZW91cyBzdGF0dXMgb2YgdGhlIFNDU0kgZGF0YSAKKyAqIGxpbmVzLiAgTm90ZSB0aGF0IFNDTlRMMCBtdXN0IGJlIHNldCB0byBkaXNhYmxlIHBhcml0eSBjaGVja2luZywgCisgKiBvdGhlcndpc2UgcmVhZGluZyB0aGlzIHJlZ2lzdGVyIHdpbGwgbGF0Y2ggbmV3IHBhcml0eS4KKyAqLworI2RlZmluZSBTQkRMX1JFR183MDAJCTB4MGEKKyNkZWZpbmUgU0JETF9SRUdfODAwCQkweDU4CisKKyNkZWZpbmUgU1NJRF9SRUdfODAwCQkweDBhCisjZGVmaW5lIFNTSURfODAwX1ZBTAkJMHg4MAkvKiBFeGFjdGx5IHR3byBiaXRzIGFzc2VydGVkIGF0IHNlbCAqLworI2RlZmluZSBTU0lEXzgwMF9FTkNJRF9NQVNLCTB4MDcJLyogRGV2aWNlIHdoaWNoIHBlcmZvcm1lZCBvcGVyYXRpb24gKi8KKworCisvKiAKKyAqIFNDU0kgYnVzIGNvbnRyb2wgbGluZXMgcncsIAorICogaW5zdGFudGFuZW91cyByZWFkb3V0IG9mIGNvbnRyb2wgbGluZXMgCisgKi8KKyNkZWZpbmUgU0JDTF9SRUcJCTB4MGIgCQorI2RlZmluZSBTQkNMX1JFUQkJMHg4MAkvKiAgUkVRIHJvICovCisjZGVmaW5lIFNCQ0xfQUNLCQkweDQwCS8qICBBQ0sgcm8gKi8KKyNkZWZpbmUgU0JDTF9CU1kJCTB4MjAJLyogIEJTWSBybyAqLworI2RlZmluZSBTQkNMX1NFTAkJMHgxMAkvKiAgU0VMIHJvICovCisjZGVmaW5lIFNCQ0xfQVROCQkweDA4CS8qICBBVE4gcm8gKi8KKyNkZWZpbmUgU0JDTF9NU0cJCTB4MDQJLyogIE1TRyBybyAqLworI2RlZmluZSBTQkNMX0NECQkJMHgwMgkvKiAgQy9EIHJvICovCisjZGVmaW5lIFNCQ0xfSU8JCQkweDAxCS8qICBJL08gcm8gKi8KKyNkZWZpbmUgU0JDTF9QSEFTRV9DTURPVVQJU0JDTF9DRAorI2RlZmluZSBTQkNMX1BIQVNFX0RBVEFJTglTQkNMX0lPCisjZGVmaW5lIFNCQ0xfUEhBU0VfREFUQU9VVAkwCisjZGVmaW5lIFNCQ0xfUEhBU0VfTVNHSU4JKFNCQ0xfQ0R8U0JDTF9JT3xTQkNMX01TRykKKyNkZWZpbmUgU0JDTF9QSEFTRV9NU0dPVVQJKFNCQ0xfQ0R8U0JDTF9NU0cpCisjZGVmaW5lIFNCQ0xfUEhBU0VfU1RBVElOCShTQkNMX0NEfFNCQ0xfSU8pCisjZGVmaW5lIFNCQ0xfUEhBU0VfTUFTSwkJKFNCQ0xfQ0R8U0JDTF9JT3xTQkNMX01TRykKKy8qIAorICogU3luY2hyb25vdXMgU0NTSSBDbG9jayBDb250cm9sIGJpdHMgCisgKiAwIC0gc2V0IGJ5IERDTlRMIAorICogMSAtIFNDTEsgLyAxLjAKKyAqIDIgLSBTQ0xLIC8gMS41CisgKiAzIC0gU0NMSyAvIDIuMCAKKyAqLworI2RlZmluZSBTQkNMX1NTQ0YxCQkweDAyCS8qIHdvLCAtNjYgb25seSAqLworI2RlZmluZSBTQkNMX1NTQ0YwCQkweDAxCS8qIHdvLCAtNjYgb25seSAqLworI2RlZmluZSBTQkNMX1NTQ0ZfTUFTSwkJMHgwMworCisvKiAKKyAqIFhYWCBub3RlIDogd2hlbiByZWFkaW5nIHRoZSBEU1RBVCBhbmQgU1RBVCByZWdpc3RlcnMgdG8gY2xlYXIgaW50ZXJydXB0cywKKyAqIGluc3VyZSB0aGF0IDEwIGNsb2NrcyBlbGFwc2UgYmV0d2VlbiB0aGUgdHdvICAKKyAqLworLyogRE1BIHN0YXR1cyBybyAqLworI2RlZmluZSBEU1RBVF9SRUcJCTB4MGMJCisjZGVmaW5lIERTVEFUX0RGRQkJMHg4MAkvKiBETUEgRklGTyBlbXB0eSAqLworI2RlZmluZSBEU1RBVF84MDBfTURQRQkJMHg0MAkvKiBNYXN0ZXIgRGF0YSBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgRFNUQVRfODAwX0JGCQkweDIwCS8qIEJ1cyBGYXVsdCAqLworI2RlZmluZSBEU1RBVF9BQlJUCQkweDEwCS8qIEFib3J0ZWQgLSBzZXQgb24gZXJyb3IgKi8KKyNkZWZpbmUgRFNUQVRfU1NJCQkweDA4CS8qIFNDUklQVFMgc2luZ2xlIHN0ZXAgaW50ZXJydXB0ICovCisjZGVmaW5lIERTVEFUX1NJUgkJMHgwNAkvKiBTQ1JJUFRTIGludGVycnVwdCByZWNlaXZlZCAtIAorCQkJCQkgICBzZXQgd2hlbiBJTlQgaW5zdHJ1Y3Rpb24gaXMgCisJCQkJCSAgIGV4ZWN1dGVkICovCisjZGVmaW5lIERTVEFUX1dURAkJMHgwMgkvKiBXYXRjaGRvZyB0aW1lb3V0IGRldGVjdGVkICovCisjZGVmaW5lIERTVEFUX09QQwkJMHgwMQkvKiBJbGxlZ2FsIGluc3RydWN0aW9uICovCisjZGVmaW5lIERTVEFUXzgwMF9JSUQJCTB4MDEJLyogU2FtZSB0aGluZywgZGlmZmVyZW50IG5hbWUgKi8KKworCisvKiBOQ1I1M2M4MDAgbW92ZXMgdGhpcyBzdHVmZiBpbnRvIFNJU1QwICovCisjZGVmaW5lIFNTVEFUMF9SRUcJCTB4MGQJLyogU0NTSSBzdGF0dXMgMCBybyAqLworI2RlZmluZSBTSVNUMF9SRUdfODAwCQkweDQyCQorI2RlZmluZSBTU1RBVDBfTUEJCTB4ODAJLyogaW5pIDogcGhhc2UgbWlzbWF0Y2gsCisJCQkJCSAqIHRndCA6IEFUTi8gYXNzZXJ0ZWQgCisJCQkJCSAqLworI2RlZmluZSBTU1RBVDBfQ01QCQkweDQwCS8qIGZ1bmN0aW9uIGNvbXBsZXRlICovCisjZGVmaW5lIFNTVEFUMF83MDBfU1RPCQkweDIwCS8qIFNlbGVjdGlvbiBvciByZXNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIFNJU1QwXzgwMF9TRUwJCTB4MjAJLyogU2VsZWN0ZWQgKi8KKyNkZWZpbmUgU1NUQVQwXzcwMF9TRUwJCTB4MTAJLyogU2VsZWN0ZWQgb3IgcmVzZWxlY3RlZCAqLworI2RlZmluZSBTSVNUMF84MDBfUlNMCQkweDEwCS8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgU1NUQVQwX1NHRQkJMHgwOAkvKiBTQ1NJIGdyb3NzIGVycm9yICovCisjZGVmaW5lIFNTVEFUMF9VREMJCTB4MDQJLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICovCisjZGVmaW5lIFNTVEFUMF9SU1QJCTB4MDIJLyogU0NTSSBSU1QvIHJlY2VpdmVkICovCisjZGVmaW5lIFNTVEFUMF9QQVIJCTB4MDEJLyogUGFyaXR5IGVycm9yICovCisKKy8qIEFuZCB1c2VzIFNTVEFUMCBmb3Igd2hhdCB3YXMgU1NUQVQxICovCisKKyNkZWZpbmUgU1NUQVQxX1JFRwkJMHgwZQkvKiBTQ1NJIHN0YXR1cyAxIHJvICovCisjZGVmaW5lIFNTVEFUMV9JTEYJCTB4ODAJLyogU0lETCBmdWxsICovCisjZGVmaW5lIFNTVEFUMV9PUkYJCTB4NDAJLyogU09EUiBmdWxsICovCisjZGVmaW5lIFNTVEFUMV9PTEYJCTB4MjAJLyogU09ETCBmdWxsICovCisjZGVmaW5lIFNTVEFUMV9BSVAJCTB4MTAJLyogQXJiaXRyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgU1NUQVQxX0xPQQkJMHgwOAkvKiBMb3N0IGFyYml0cmF0aW9uICovCisjZGVmaW5lIFNTVEFUMV9XT0EJCTB4MDQJLyogV29uIGFyYml0cmF0aW9uICovCisjZGVmaW5lIFNTVEFUMV9SU1QJCTB4MDIJLyogSW5zdGFudCByZWFkb3V0IG9mIFJTVC8gKi8KKyNkZWZpbmUgU1NUQVQxX1NEUAkJMHgwMQkvKiBJbnN0YW50IHJlYWRvdXQgb2YgU0RQLyAqLworCisjZGVmaW5lIFNTVEFUMl9SRUcJCTB4MGYJLyogU0NTSSBzdGF0dXMgMiBybyAqLworI2RlZmluZSBTU1RBVDJfRkYzCQkweDgwIAkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgU1NUQVQyX0ZGMgkJMHg0MAkvKiBkYXRhIEZJRk8gKi8KKyNkZWZpbmUgU1NUQVQyX0ZGMQkJMHgyMAkKKyNkZWZpbmUgU1NUQVQyX0ZGMAkJMHgxMAorI2RlZmluZSBTU1RBVDJfRkZfTUFTSwkJMHhmMAorI2RlZmluZSBTU1RBVDJfRkZfU0hJRlQJCTQKKworLyogCisgKiBMYXRjaGVkIHNpZ25hbHMsIGxhdGNoZWQgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiBSRVEvIGZvciBpbml0aWF0b3JzLAorICogQUNLLyBmb3IgdGFyZ2V0cy4KKyAqLworI2RlZmluZSBTU1RBVDJfU0RQCQkweDA4CS8qIFNEUCAqLworI2RlZmluZSBTU1RBVDJfTVNHCQkweDA0CS8qIE1TRyAqLworI2RlZmluZSBTU1RBVDJfQ0QJCTB4MDIJLyogQy9EICovCisjZGVmaW5lIFNTVEFUMl9JTwkJMHgwMQkvKiBJL08gKi8KKyNkZWZpbmUgU1NUQVQyX1BIQVNFX0NNRE9VVAlTU1RBVDJfQ0QKKyNkZWZpbmUgU1NUQVQyX1BIQVNFX0RBVEFJTglTU1RBVDJfSU8KKyNkZWZpbmUgU1NUQVQyX1BIQVNFX0RBVEFPVVQJMAorI2RlZmluZSBTU1RBVDJfUEhBU0VfTVNHSU4JKFNTVEFUMl9DRHxTU1RBVDJfSU98U1NUQVQyX01TRykKKyNkZWZpbmUgU1NUQVQyX1BIQVNFX01TR09VVAkoU1NUQVQyX0NEfFNTVEFUMl9NU0cpCisjZGVmaW5lIFNTVEFUMl9QSEFTRV9TVEFUSU4JKFNTVEFUMl9DRHxTU1RBVDJfSU8pCisjZGVmaW5lIFNTVEFUMl9QSEFTRV9NQVNLCShTU1RBVDJfQ0R8U1NUQVQyX0lPfFNTVEFUMl9NU0cpCisKKworLyogTkNSNTNjNzAwLTY2IG9ubHkgKi8KKyNkZWZpbmUgU0NSQVRDSEFfUkVHXzAwCQkweDEwICAgIC8qIHRocm91Z2ggIDB4MTMgU2NyYXRjaCBBIHJ3ICovCisvKiBOQ1I1M2M3MTAgYW5kIGhpZ2hlciAqLworI2RlZmluZSBEU0FfUkVHCQkJMHgxMAkvKiBEQVRBIHN0cnVjdHVyZSBhZGRyZXNzICovCisKKyNkZWZpbmUgQ1RFU1QwX1JFR183MDAJCTB4MTQJLyogQ2hpcCB0ZXN0IDAgcm8gKi8KKyNkZWZpbmUgQ1RFU1QwX1JFR184MDAJCTB4MTgJLyogQ2hpcCB0ZXN0IDAgcncsIGdlbmVyYWwgcHVycG9zZSAqLworLyogMHg4MCAtIDB4MDQgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIENURVNUMF83MDBfUlRSRwkJMHgwMgkvKiBSZWFsIHRhcmdldCBtb2RlICovCisjZGVmaW5lIENURVNUMF83MDBfRERJUgkJMHgwMQkvKiBEYXRhIGRpcmVjdGlvbiwgMSA9IAorCQkJCQkgKiBTQ1NJIGJ1cyB0byBob3N0LCAwICA9CisJCQkJCSAqIGhvc3QgdG8gU0NTSS4KKwkJCQkJICovCisKKyNkZWZpbmUgQ1RFU1QxX1JFR183MDAJCTB4MTUJLyogQ2hpcCB0ZXN0IDEgcm8gKi8KKyNkZWZpbmUgQ1RFU1QxX1JFR184MDAJCTB4MTkJLyogQ2hpcCB0ZXN0IDEgcm8gKi8KKyNkZWZpbmUgQ1RFU1QxX0ZNVDMJCTB4ODAJLyogSWRlbnRpZnkgd2hpY2ggYnl0ZSBsYW5lcyBhcmUgZW1wdHkgKi8KKyNkZWZpbmUgQ1RFU1QxX0ZNVDIJCTB4NDAgCS8qIGluIHRoZSBETUEgRklGTyAqLworI2RlZmluZSBDVEVTVDFfRk1UMQkJMHgyMAorI2RlZmluZSBDVEVTVDFfRk1UMAkJMHgxMAorCisjZGVmaW5lIENURVNUMV9GRkwzCQkweDA4CS8qIElkZW50aWZ5IHdoaWNoIGJ5dGVzIGxhbmVzIGFyZSBmdWxsICovCisjZGVmaW5lIENURVNUMV9GRkwyCQkweDA0CS8qIGluIHRoZSBETUEgRklGTyAqLworI2RlZmluZSBDVEVTVDFfRkZMMQkJMHgwMgorI2RlZmluZSBDVEVTVDFfRkZMMAkJMHgwMQorCisjZGVmaW5lIENURVNUMl9SRUdfNzAwCQkweDE2CS8qIENoaXAgdGVzdCAyIHJvICovCisjZGVmaW5lIENURVNUMl9SRUdfODAwCQkweDFhCS8qIENoaXAgdGVzdCAyIHJvICovCisKKyNkZWZpbmUgQ1RFU1QyXzgwMF9ERElSCQkweDgwCS8qIDEgPSBTQ1NJLT5ob3N0ICovCisjZGVmaW5lIENURVNUMl84MDBfU0lHUAkJMHg0MAkvKiBBIGNvcHkgb2YgU0lHUCBpbiBJU1RBVC4KKwkJCQkJICAgUmVhZGluZyB0aGlzIHJlZ2lzdGVyIGNsZWFycyAqLworI2RlZmluZSBDVEVTVDJfODAwX0NJTwkJMHgyMAkvKiBDb25maWd1cmVkIGFzIElPICovLgorI2RlZmluZSBDVEVTVDJfODAwX0NNCQkweDEwCS8qIENvbmZpZ3VyZWQgYXMgbWVtb3J5ICovCisKKy8qIDB4ODAgLSAweDQwIGFyZSByZXNlcnZlZCBvbiA3MDAgc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIENURVNUMl83MDBfU09GRgkJMHgyMAkvKiBTQ1NJIE9mZnNldCBDb21wYXJlLAorCQkJCQkgKiBBcyBhbiBpbml0aWF0b3IsIHRoaXMgYml0IGlzIAorCQkJCQkgKiBvbmUgd2hlbiB0aGUgc3luY2hyb25vdXMgb2Zmc2V0CisJCQkJCSAqIGlzIHplcm8sIGFzIGEgdGFyZ2V0IHRoaXMgYml0IAorCQkJCQkgKiBpcyBvbmUgd2hlbiB0aGUgc3luY2hyb25vdXMgCisJCQkJCSAqIG9mZnNldCBpcyBhdCB0aGUgbWF4aW11bQorCQkJCQkgKiBkZWZpbmVkIGluIFNYRkVSCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDJfNzAwX1NGUAkJMHgxMAkvKiBTQ1NJIEZJRk8gcGFyaXR5IGJpdCwKKwkJCQkJICogcmVhZGluZyBDVEVTVDMgdW5sb2FkcyBhIGJ5dGUKKwkJCQkJICogZnJvbSB0aGUgRklGTyBhbmQgc2V0cyB0aGlzCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDJfNzAwX0RGUAkJMHgwOAkvKiBETUEgRklGTyBwYXJpdHkgYml0LAorCQkJCQkgKiByZWFkaW5nIENURVNUNiB1bmxvYWRzIGEgYnl0ZQorCQkJCQkgKiBmcm9tIHRoZSBGSUZPIGFuZCBzZXRzIHRoaXMKKwkJCQkJICovCisjZGVmaW5lIENURVNUMl9URU9QCQkweDA0CS8qIFNDU0kgdHJ1ZSBlbmQgb2YgcHJvY2VzcywKKwkJCQkJICogaW5kaWNhdGVzIGEgdG90YWxseSBmaW5pc2hlZAorCQkJCQkgKiB0cmFuc2ZlcgorCQkJCQkgKi8KKyNkZWZpbmUgQ1RFU1QyX0RSRVEJCTB4MDIJLyogRGF0YSByZXF1ZXN0IHNpZ25hbCAqLworLyogMHgwMSBpcyByZXNlcnZlZCBvbiA3MDAgc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIENURVNUMl84MDBfREFDSwkJMHgwMQkKKworLyogCisgKiBDaGlwIHRlc3QgMyBybyAKKyAqIFVubG9hZHMgdGhlIGJvdHRvbSBieXRlIG9mIHRoZSBlaWdodCBkZWVwIFNDU0kgc3luY2hyb25vdXMgRklGTywKKyAqIGNoZWNrIFNTVEFUMiBGSUZPIGZ1bGwgYml0cyB0byBkZXRlcm1pbmUgc2l6ZS4gIE5vdGUgdGhhdCBhIEdST1NTCisgKiBlcnJvciByZXN1bHRzIGlmIGEgcmVhZCBpcyBhdHRlbXB0ZWQgb24gdGhpcyByZWdpc3Rlci4gIEFsc28gbm90ZSAKKyAqIHRoYXQgMTYgYW5kIDMyIGJpdCByZWFkcyBvZiB0aGlzIHJlZ2lzdGVyIHdpbGwgY2F1c2UgY29ycnVwdGlvbi4KKyAqLworI2RlZmluZSBDVEVTVDNfUkVHXzcwMAkJMHgxNwkKKy8qICBDaGlwIHRlc3QgMyBydyAqLworI2RlZmluZSBDVEVTVDNfUkVHXzgwMAkJMHgxYgorI2RlZmluZSBDVEVTVDNfODAwX1YzCQkweDgwCS8qIENoaXAgcmV2aXNpb24gKi8KKyNkZWZpbmUgQ1RFU1QzXzgwMF9WMgkJMHg0MAorI2RlZmluZSBDVEVTVDNfODAwX1YxCQkweDIwCisjZGVmaW5lIENURVNUM184MDBfVjAJCTB4MTAKKyNkZWZpbmUgQ1RFU1QzXzgwMF9GTEYJCTB4MDgJLyogRmx1c2ggRE1BIEZJRk8gKi8KKyNkZWZpbmUgQ1RFU1QzXzgwMF9DTEYJCTB4MDQJLyogQ2xlYXIgRE1BIEZJRk8gKi8KKyNkZWZpbmUgQ1RFU1QzXzgwMF9GTQkJMHgwMgkvKiBGZXRjaCBtb2RlIHBpbiAqLworLyogYml0IDAgaXMgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworCisjZGVmaW5lIENURVNUNF9SRUdfNzAwCQkweDE4CS8qIENoaXAgdGVzdCA0IHJ3ICovCisjZGVmaW5lIENURVNUNF9SRUdfODAwCQkweDIxCS8qIENoaXAgdGVzdCA0IHJ3ICovCisvKiAweDgwIGlzIHJlc2VydmVkIG9uIDcwMCBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgQ1RFU1Q0XzgwMF9CRElTCQkweDgwCS8qIEJ1cnN0IG1vZGUgZGlzYWJsZSAqLworI2RlZmluZSBDVEVTVDRfWk1PRAkJMHg0MAkvKiBIaWdoIGltcGVkYW5jZSBtb2RlICovCisjZGVmaW5lIENURVNUNF9TWk0JCTB4MjAJLyogU0NTSSBidXMgaGlnaCBpbXBlZGFuY2UgKi8KKyNkZWZpbmUgQ1RFU1Q0XzcwMF9TTEJFCQkweDEwCS8qIFNDU0kgbG9vcGJhY2sgZW5hYmxlZCAqLworI2RlZmluZSBDVEVTVDRfODAwX1NSVE0JCTB4MTAJLyogU2hhZG93IFJlZ2lzdGVyIFRlc3QgTW9kZSAqLworI2RlZmluZSBDVEVTVDRfNzAwX1NGV1IJCTB4MDgJLyogU0NTSSBGSUZPIHdyaXRlIGVuYWJsZSwgCisJCQkJCSAqIHJlZGlyZWN0cyB3cml0ZXMgZnJvbSBTT0RMCisJCQkJCSAqIHRvIHRoZSBTQ1NJIEZJRk8uCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDRfODAwX01QRUUJCTB4MDgJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZworCQkJCQkgICBkdXJpbmcgbWFzdGVyIGN5Y2xlcyBvbiBQQ0kKKwkJCQkJICAgYnVzICovCisKKy8qIAorICogVGhlc2UgYml0cyBzZW5kIHRoZSBjb250ZW50cyBvZiB0aGUgQ1RFU1Q2IHJlZ2lzdGVyIHRvIHRoZSBhcHByb3ByaWF0ZQorICogYnl0ZSBsYW5lIG9mIHRoZSAzMiBiaXQgRE1BIEZJRk8uICBOb3JtYWwgb3BlcmF0aW9uIGlzIHplcm8sIG90aGVyd2lzZSAKKyAqIHRoZSBoaWdoIGJpdCBtZWFucyB0aGUgbG93IHR3byBiaXRzIHNlbGVjdCB0aGUgYnl0ZSBsYW5lLgorICovCisjZGVmaW5lIENURVNUNF9GQkwyCQkweDA0CQorI2RlZmluZSBDVEVTVDRfRkJMMQkJMHgwMgorI2RlZmluZSBDVEVTVDRfRkJMMAkJMHgwMQkKKyNkZWZpbmUgQ1RFU1Q0X0ZCTF9NQVNLCQkweDA3CisjZGVmaW5lIENURVNUNF9GQkxfMAkJMHgwNAkvKiBTZWxlY3QgRE1BIEZJRk8gYnl0ZSBsYW5lIDAgKi8KKyNkZWZpbmUgQ1RFU1Q0X0ZCTF8xCQkweDA1CS8qIFNlbGVjdCBETUEgRklGTyBieXRlIGxhbmUgMSAqLworI2RlZmluZSBDVEVTVDRfRkJMXzIJCTB4MDYJLyogU2VsZWN0IERNQSBGSUZPIGJ5dGUgbGFuZSAyICovCisjZGVmaW5lIENURVNUNF9GQkxfMwkJMHgwNwkvKiBTZWxlY3QgRE1BIEZJRk8gYnl0ZSBsYW5lIDMgKi8KKyNkZWZpbmUgQ1RFU1Q0XzgwMF9TQVZFCQkoQ1RFU1Q0XzgwMF9CRElTKQorCisKKyNkZWZpbmUgQ1RFU1Q1X1JFR183MDAJCTB4MTkJLyogQ2hpcCB0ZXN0IDUgcncgKi8KKyNkZWZpbmUgQ1RFU1Q1X1JFR184MDAJCTB4MjIJLyogQ2hpcCB0ZXN0IDUgcncgKi8KKy8qIAorICogQ2xvY2sgQWRkcmVzcyBJbmNyZW1lbnRvci4gIFdoZW4gc2V0LCBpdCBpbmNyZW1lbnRzIHRoZSAKKyAqIEROQUQgcmVnaXN0ZXIgdG8gdGhlIG5leHQgYnVzIHNpemUgYm91bmRhcnkuICBJdCBhdXRvbWF0aWNhbGx5IAorICogcmVzZXRzIGl0c2VsZiB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCisgKi8KKyNkZWZpbmUgQ1RFU1Q1X0FEQ0sJCTB4ODAKKy8qCisgKiBDbG9jayBCeXRlIENvdW50ZXIuICBXaGVuIHNldCwgaXQgZGVjcmVtZW50cyB0aGUgREJDIHJlZ2lzdGVyIHRvCisgKiB0aGUgbmV4dCBidXMgc2l6ZSBib3VuZGFyeS4KKyAqLworI2RlZmluZSBDVEVTVDVfQkJDSwkJMHg0MAorLyoKKyAqIFJlc2V0IFNDU0kgT2Zmc2V0LiAgU2V0dGluZyB0aGlzIGJpdCB0byAxIGNsZWFycyB0aGUgY3VycmVudCBvZmZzZXQKKyAqIHBvaW50ZXIgaW4gdGhlIFNDU0kgc3luY2hyb25vdXMgb2Zmc2V0IGNvdW50ZXIgKFNTVEFUKS4gIFRoaXMgYml0CisgKiBpcyBzZXQgdG8gMSBpZiBhIFNDU0kgR3Jvc3MgRXJyb3IgQ29uZGl0aW9uIG9jY3Vycy4gIFRoZSBvZmZzZXQgc2hvdWxkCisgKiBiZSBjbGVhcmVkIHdoZW4gYSBzeW5jaHJvbm91cyB0cmFuc2ZlciBmYWlscy4gIFdoZW4gd3JpdHRlbiwgaXQgaXMgCisgKiBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgdGhlIFNDU0kgc3luY2hyb25vdXMgb2Zmc2V0IGNvdW50ZXIgaXMgCisgKiByZXNldC4KKyAqLworLyogQml0IDUgaXMgcmVzZXJ2ZWQgb24gODAwIHNlcmllcyBjaGlwcyAqLworI2RlZmluZSBDVEVTVDVfNzAwX1JPRkYJCTB4MjAKKy8qIAorICogTWFzdGVyIENvbnRyb2wgZm9yIFNldCBvciBSZXNldCBwdWxzZXMuIFdoZW4gMSwgY2F1c2VzIHRoZSBsb3cgCisgKiBmb3VyIGJpdHMgb2YgcmVnaXN0ZXIgdG8gc2V0IHdoZW4gc2V0LCAwIGNhdXNlcyB0aGUgbG93IGJpdHMgdG8KKyAqIGNsZWFyIHdoZW4gc2V0LgorICovCisjZGVmaW5lIENURVNUNV9NQVNSIAkJMHgxMAkKKyNkZWZpbmUgQ1RFU1Q1X0RESVIJCTB4MDgJLyogRE1BIGRpcmVjdGlvbiAqLworLyoKKyAqIEJpdHMgMi0wIGFyZSByZXNlcnZlZCBvbiA4MDAgc2VyaWVzIGNoaXBzCisgKi8KKyNkZWZpbmUgQ1RFU1Q1XzcwMF9FT1AJCTB4MDQJLyogRW5kIG9mIHByb2Nlc3MgKi8KKyNkZWZpbmUgQ1RFU1Q1XzcwMF9EUkVRCQkweDAyCS8qIERhdGEgcmVxdWVzdCAqLworI2RlZmluZSBDVEVTVDVfNzAwX0RBQ0sJCTB4MDEJLyogRGF0YSBhY2tub3dsZWRnZSAqLworCisvKiAKKyAqIENoaXAgdGVzdCA2IHJ3IC0gd3JpdGluZyB0byB0aGlzIHJlZ2lzdGVyIHdyaXRlcyB0byB0aGUgYnl0ZSAKKyAqIGxhbmUgaW4gdGhlIERNQSBGSUZPIGFzIGRldGVybWluZWQgYnkgdGhlIEZCTCBiaXRzIGluIHRoZSBDVEVTVDQKKyAqIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENURVNUNl9SRUdfNzAwCQkweDFhCisjZGVmaW5lIENURVNUNl9SRUdfODAwCQkweDIzCisKKyNkZWZpbmUgQ1RFU1Q3X1JFRwkJMHgxYgkvKiBDaGlwIHRlc3QgNyBydyAqLworLyogMHg4MCAtIDB4NDAgYXJlIHJlc2VydmVkIG9uIE5DUjUzYzcwMCBhbmQgTkNSNTNjNzAwLTY2IGNoaXBzICovCisjZGVmaW5lIENURVNUN18xMF9DRElTCQkweDgwCS8qIENhY2hlIGJ1cnN0IGRpc2FibGUgKi8KKyNkZWZpbmUgQ1RFU1Q3XzEwX1NDMQkJMHg0MAkvKiBTbm9vcCBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgQ1RFU1Q3XzEwX1NDMAkJMHgyMAkKKyNkZWZpbmUgQ1RFU1Q3XzEwX1NDX01BU0sJMHg2MAorLyogMHgyMCBpcyByZXNlcnZlZCBvbiB0aGUgTkNSNTNjNzAwICovCisjZGVmaW5lIENURVNUN18wMDYwX0ZNCQkweDIwCS8qIEZldGNoIG1vZGUgKi8KKyNkZWZpbmUgQ1RFU1Q3X1NURAkJMHgxMAkvKiBTZWxlY3Rpb24gdGltZW91dCBkaXNhYmxlICovCisjZGVmaW5lIENURVNUN19ERlAJCTB4MDgJLyogRE1BIEZJRk8gcGFyaXR5IGJpdCBmb3IgQ1RFU1Q2ICovCisjZGVmaW5lIENURVNUN19FVlAJCTB4MDQJLyogMSA9IGhvc3QgYnVzIGV2ZW4gcGFyaXR5LCAwID0gb2RkICovCisjZGVmaW5lIENURVNUN18xMF9UVDEJCTB4MDIJLyogVHJhbnNmZXIgdHlwZSAqLworI2RlZmluZSBDVEVTVDdfMDBfREMJCTB4MDIJLyogU2V0IHRvIGRyaXZlIERDIGxvdyBkdXJpbmcgaW5zdHJ1Y3Rpb24gCisJCQkJCSAgIGZldGNoICovCisjZGVmaW5lIENURVNUN19ESUZGCQkweDAxCS8qIERpZmZlcmVudGlhbCBtb2RlICovCisKKyNkZWZpbmUgQ1RFU1Q3X1NBVkUgKCBDVEVTVDdfRVZQIHwgQ1RFU1Q3X0RJRkYgKQorCisKKyNkZWZpbmUgVEVNUF9SRUcJCTB4MWMJLyogdGhyb3VnaCAweDFmIFRlbXBvcmFyeSBzdGFjayBydyAqLworCisjZGVmaW5lIERGSUZPX1JFRwkJMHgyMAkvKiBETUEgRklGTyBydyAqLworLyogCisgKiAweDgwIGlzIHJlc2VydmVkIG9uIHRoZSBOQ1I1M2M3MTAsIHRoZSBDTEYgYW5kIEZMRiBiaXRzIGhhdmUgYmVlbgorICogbW92ZWQgaW50byB0aGUgQ1RFU1Q4IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIERGSUZPXzAwX0ZMRgkJMHg4MAkvKiBGbHVzaCBETUEgRklGTyB0byBtZW1vcnkgKi8KKyNkZWZpbmUgREZJRk9fMDBfQ0xGCQkweDQwCS8qIENsZWFyIERNQSBhbmQgU0NTSSBGSUZPcyAqLworI2RlZmluZSBERklGT19CTzYJCTB4NDAKKyNkZWZpbmUgREZJRk9fQk81CQkweDIwCisjZGVmaW5lIERGSUZPX0JPNAkJMHgxMAorI2RlZmluZSBERklGT19CTzMJCTB4MDgKKyNkZWZpbmUgREZJRk9fQk8yCQkweDA0IAorI2RlZmluZSBERklGT19CTzEJCTB4MDIKKyNkZWZpbmUgREZJRk9fQk8wCQkweDAxCisjZGVmaW5lIERGSUZPXzEwX0JPX01BU0sJMHg3ZgkvKiA3IGJpdCBjb3VudGVyICovCisjZGVmaW5lIERGSUZPXzAwX0JPX01BU0sJMHgzZgkvKiA2IGJpdCBjb3VudGVyICovCisKKy8qIAorICogSW50ZXJydXB0IHN0YXR1cyBydyAKKyAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHJlZ2lzdGVyIHdoaWNoIGNhbiBiZSByZWFkIHdoaWxlIFNDU0kKKyAqIFNDUklQVFMgYXJlIGJlaW5nIGV4ZWN1dGVkLgorICovCisjZGVmaW5lIElTVEFUX1JFR183MDAJCTB4MjEKKyNkZWZpbmUgSVNUQVRfUkVHXzgwMAkJMHgxNAorI2RlZmluZSBJU1RBVF9BQlJUCQkweDgwCS8qIFNvZnR3YXJlIGFib3J0LCB3cml0ZSAKKwkJCQkJICoxIHRvIGFib3J0LCB3YWl0IGZvciBpbnRlcnJ1cHQuICovCisvKiAweDQwIGFuZCAweDIwIGFyZSByZXNlcnZlZCBvbiBOQ1I1M2M3MDAgYW5kIE5DUjUzYzcwMC02NiBjaGlwcyAqLworI2RlZmluZSBJU1RBVF8xMF9TUlNUCQkweDQwCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIElTVEFUXzEwX1NJR1AJCTB4MjAJLyogc2lnbmFsIHNjcmlwdCAqLworLyogMHgxMCBpcyByZXNlcnZlZCBvbiBOQ1I1M2M3MDAgc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIElTVEFUXzgwMF9TRU0JCTB4MTAJLyogc2VtYXBob3JlICovCisjZGVmaW5lIElTVEFUX0NPTgkJMHgwOAkvKiAxIHdoZW4gY29ubmVjdGVkICovCisjZGVmaW5lIElTVEFUXzgwMF9JTlRGCQkweDA0CS8qIEludGVycnVwdCBvbiB0aGUgZmx5ICovCisjZGVmaW5lIElTVEFUXzcwMF9QUkUJCTB4MDQJLyogUG9pbnRlciByZWdpc3RlciBlbXB0eS4KKwkJCQkJICogU2V0IHRvIDEgd2hlbiBEU1BTIGFuZCBEU1AKKwkJCQkJICogcmVnaXN0ZXJzIGFyZSBlbXB0eSBpbiBwaXBlbGluZQorCQkJCQkgKiBtb2RlLCBhbHdheXMgc2V0IG90aGVyd2lzZS4KKwkJCQkJICovCisjZGVmaW5lIElTVEFUX1NJUAkJMHgwMgkvKiBTQ1NJIGludGVycnVwdCBwZW5kaW5nIGZyb20KKwkJCQkJICogU0NTSSBwb3J0aW9uIG9mIFNJT1Agc2VlCisJCQkJCSAqIFNTVEFUMAorCQkJCQkgKi8KKyNkZWZpbmUgSVNUQVRfRElQCQkweDAxCS8qIERNQSBpbnRlcnJ1cHQgcGVuZGluZyAKKwkJCQkJICogc2VlIERTVEFUCisJCQkJCSAqLworCisvKiBOQ1I1M2M3MDAtNjYgYW5kIE5DUjUzYzcxMCBvbmx5ICovCisjZGVmaW5lIENURVNUOF9SRUcJCTB4MjIJLyogQ2hpcCB0ZXN0IDggcncgKi8KKyNkZWZpbmUgQ1RFU1Q4XzAwNjZfRUFTCQkweDgwCS8qIEVuYWJsZSBhbHRlcm5hdGUgU0NTSSBjbG9jaywKKwkJCQkJICogaWUgcmVhZCBmcm9tIFNDTEsvIHJhdGhlciB0aGFuIENMSy8KKwkJCQkJICovCisjZGVmaW5lIENURVNUOF8wMDY2X0VGTQkJMHg0MAkvKiBFbmFibGUgZmV0Y2ggYW5kIG1hc3RlciBvdXRwdXRzICovCisjZGVmaW5lIENURVNUOF8wMDY2X0dSUAkJMHgyMAkvKiBHZW5lcmF0ZSBSZWNlaXZlIFBhcml0eSBmb3IgCisJCQkJCSAqIHBhc3MgdGhyb3VnaC4gIFRoaXMgaW5zdXJlcyB0aGF0IAorCQkJCQkgKiBiYWQgcGFyaXR5IHdvbid0IHJlYWNoIHRoZSBob3N0IAorCQkJCQkgKiBidXMuCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9URQkJMHgxMAkvKiBUb2xlckFOVCBlbmFibGUuICBFbmFibGUgCisJCQkJCSAqIGFjdGl2ZSBuZWdhdGlvbiwgc2hvdWxkIG9ubHkKKwkJCQkJICogYmUgdXNlZCBmb3Igc2xvdyBTQ1NJIAorCQkJCQkgKiBub24tZGlmZmVyZW50aWFsLgorCQkJCQkgKi8KKyNkZWZpbmUgQ1RFU1Q4XzAwNjZfSFNDCQkweDA4CS8qIEhhbHQgU0NTSSBjbG9jayAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9TUkEJCTB4MDQJLyogU2hvcnRlbiBSRVEvQUNLIGZpbHRlcmluZywKKwkJCQkJICogbXVzdCBiZSBzZXQgZm9yIGZhc3QgU0NTSS1JSQorCQkJCQkgKiBzcGVlZHMuCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9EQVMJCTB4MDIJLyogRGlzYWJsZSBhdXRvbWF0aWMgdGFyZ2V0L2luaXRpYXRvcgorCQkJCQkgKiBzd2l0Y2hpbmcuCisJCQkJCSAqLworI2RlZmluZSBDVEVTVDhfMDA2Nl9MREUJCTB4MDEJLyogTGFzdCBkaXNjb25uZWN0IGVuYWJsZS4KKwkJCQkJICogVGhlIHN0YXR1cyBvZiBwZW5kaW5nIAorCQkJCQkgKiBkaXNjb25uZWN0IGlzIG1haW50YWluZWQgYnkKKwkJCQkJICogdGhlIGNvcmUsIGVsaW1pbmF0aW5nCisJCQkJCSAqIHRoZSBwb3NzaWJpbGl0eSBvZiBtaXNzaW5nIGEgCisJCQkJCSAqIHNlbGVjdGlvbiBvciByZXNlbGVjdGlvbgorCQkJCQkgKiB3aGlsZSB3YWl0aW5nIHRvIGZldGNoIGEgCisJCQkJCSAqIFdBSVQgRElTQ09OTkVDVCBvcGNvZGUuCisJCQkJCSAqLworCisjZGVmaW5lIENURVNUOF8xMF9WMwkJMHg4MAkvKiBDaGlwIHJldmlzaW9uICovCisjZGVmaW5lIENURVNUOF8xMF9WMgkJMHg0MAorI2RlZmluZSBDVEVTVDhfMTBfVjEJCTB4MjAJCisjZGVmaW5lIENURVNUOF8xMF9WMAkJMHgxMAorI2RlZmluZSBDVEVTVDhfMTBfVl9NQVNLCTB4ZjAJCisjZGVmaW5lIENURVNUOF8xMF9GTEYJCTB4MDgJLyogRmx1c2ggRklGT3MgKi8KKyNkZWZpbmUgQ1RFU1Q4XzEwX0NMRgkJMHgwNAkvKiBDbGVhciBGSUZPcyAqLworI2RlZmluZSBDVEVTVDhfMTBfRk0JCTB4MDIJLyogRmV0Y2ggcGluIG1vZGUgKi8KKyNkZWZpbmUgQ1RFU1Q4XzEwX1NNCQkweDAxCS8qIFNub29wIHBpbiBtb2RlICovCisKKworLyogCisgKiBUaGUgQ1RFU1Q5IHJlZ2lzdGVyIG1heSBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhCisgKiBOQ1I1M2M3MDAgYW5kIGEgTkNSNTNjNzEwLiAgCisgKgorICogV3JpdGUgMHhmZiB0byB0aGlzIHJlZ2lzdGVyLgorICogUmVhZCBpdC4KKyAqIElmIHRoZSBjb250ZW50cyBhcmUgMHhmZiwgaXQgaXMgYSBOQ1I1M2M3MDAKKyAqIElmIHRoZSBjb250ZW50cyBhcmUgMHgwMCwgaXQgaXMgYSBOQ1I1M2M3MDAtNjYgZmlyc3QgcmV2aXNpb24KKyAqIElmIHRoZSBjb250ZW50cyBhcmUgc29tZSBvdGhlciB2YWx1ZSwgaXQgaXMgc29tZSBvdGhlciBOQ1I1M2M3MDAtNjYKKyAqLworI2RlZmluZSBDVEVTVDlfUkVHXzAwCQkweDIzCS8qIENoaXAgdGVzdCA5IHJvICovCisjZGVmaW5lIExDUkNfUkVHXzEwCQkweDIzCQorCisvKgorICogMHgyNCB0aHJvdWdoIDB4MjcgYXJlIHRoZSBETUEgYnl0ZSBjb3VudGVyIHJlZ2lzdGVyLiAgSW5zdHJ1Y3Rpb25zCisgKiB3cml0ZSB0aGVpciBoaWdoIDggYml0cyBpbnRvIHRoZSBEQ01EIHJlZ2lzdGVyLCB0aGUgbG93IDI0IGJpdHMgaW50bworICogdGhlIERCQyByZWdpc3Rlci4KKyAqCisgKiBGdW5jdGlvbiBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbW1hbmQgdHlwZSBiZWluZyBleGVjdXRlZC4KKyAqLworCisgCisjZGVmaW5lIERCQ19SRUcJCQkweDI0CisvKiAKKyAqIEZvciBCbG9jayBNb3ZlIEluc3RydWN0aW9ucywgREJDIGlzIGEgMjQgYml0IHF1YW50aXR5IHJlcHJlc2VudGluZyAKKyAqICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorICogRm9yIFRyYW5zZmVyIENvbnRyb2wgSW5zdHJ1Y3Rpb25zLCBEQkMgaXMgYml0IGZpZWxkZWQgYXMgZm9sbG93cyA6IAorICovCisvKiBCaXRzIDIwIC0gMjMgc2hvdWxkIGJlIGNsZWFyICovCisjZGVmaW5lIERCQ19UQ0lfVFJVRQkJKDEgPDwgMTkpIAkvKiBKdW1wIHdoZW4gdHJ1ZSAqLworI2RlZmluZSBEQkNfVENJX0NPTVBBUkVfREFUQQkoMSA8PCAxOCkJLyogQ29tcGFyZSBkYXRhICovCisjZGVmaW5lIERCQ19UQ0lfQ09NUEFSRV9QSEFTRQkoMSA8PCAxNykJLyogQ29tcGFyZSBwaGFzZSB3aXRoIERDTUQgZmllbGQgKi8KKyNkZWZpbmUgREJDX1RDSV9XQUlUX0ZPUl9WQUxJRAkoMSA8PCAxNikJLyogV2FpdCBmb3IgUkVRICovCisvKiBCaXRzIDggLSAxNSBhcmUgcmVzZXJ2ZWQgb24gc29tZSBpbXBsZW1lbnRhdGlvbnMgPyAqLworI2RlZmluZSBEQkNfVENJX01BU0tfTUFTSwkweGZmMDAgCQkvKiBNYXNrIGZvciBkYXRhIGNvbXBhcmUgKi8KKyNkZWZpbmUgREJDX1RDSV9NQVNLX1NISUZUCTgKKyNkZWZpbmUgREJDX1RDSV9EQVRBX01BU0sJMHhmZgkJLyogRGF0YSB0byBiZSBjb21wYXJlZCAqLyAKKyNkZWZpbmUgREJDX1RDSV9EQVRBX1NISUZUCTAKKworI2RlZmluZSBEQkNfUldSSV9JTU1FRElBVEVfTUFTSwkweGZmMDAJCS8qIEltbWVkaWF0ZSBkYXRhICovCisjZGVmaW5lIERCQ19SV1JJX0lNTUVESUFURV9TSElGVCA4CQkvKiBBbW91bnQgdG8gc2hpZnQgKi8KKyNkZWZpbmUgREJDX1JXUklfQUREUkVTU19NQVNLCTB4M2YwMDAwCS8qIFJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgREJDX1JXUklfQUREUkVTU19TSElGVCAJMTYKKworCisvKgorICogRE1BIGNvbW1hbmQgci93CisgKi8KKyNkZWZpbmUgRENNRF9SRUcJCTB4MjcJCisjZGVmaW5lIERDTURfVFlQRV9NQVNLCQkweGMwCS8qIE1hc2tzIG9mZiB0eXBlICovCisjZGVmaW5lIERDTURfVFlQRV9CTUkJCTB4MDAJLyogSW5kaWNhdGVzIGEgQmxvY2sgTW92ZSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBEQ01EX0JNSV9JTwkJMHgwMQkvKiBJL08sIENELCBhbmQgTVNHIGJpdHMgc2VsZWN0aW5nICAgKi8KKyNkZWZpbmUgRENNRF9CTUlfQ0QJCTB4MDIJLyogdGhlIHBoYXNlIGZvciB0aGUgYmxvY2sgTU9WRSAgICAgICovCisjZGVmaW5lIERDTURfQk1JX01TRwkJMHgwNAkvKiBpbnN0cnVjdGlvbiAJCQkgICAgICovCisKKyNkZWZpbmUgRENNRF9CTUlfT1BfTUFTSwkweDE4CS8qIG1hc2sgZm9yIG9wY29kZSAqLworI2RlZmluZSBEQ01EX0JNSV9PUF9NT1ZFX1QJMHgwMAkvKiBNT1ZFICovCisjZGVmaW5lIERDTURfQk1JX09QX01PVkVfSQkweDA4CS8qIE1PVkUgSW5pdGlhdG9yICovCisKKyNkZWZpbmUgRENNRF9CTUlfSU5ESVJFQ1QJMHgyMAkvKiAgSW5kaXJlY3QgYWRkcmVzc2luZyAqLworCisjZGVmaW5lIERDTURfVFlQRV9UQ0kJCTB4ODAJLyogSW5kaWNhdGVzIGEgVHJhbnNmZXIgQ29udHJvbCAKKwkJCQkJICAgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgRENNRF9UQ0lfSU8JCTB4MDEJLyogSS9PLCBDRCwgYW5kIE1TRyBiaXRzIHNlbGVjdGluZyAgICovCisjZGVmaW5lIERDTURfVENJX0NECQkweDAyCS8qIHRoZSBwaGFzZSBmb3IgdGhlIGJsb2NrIE1PVkUgICAgICAqLworI2RlZmluZSBEQ01EX1RDSV9NU0cJCTB4MDQJLyogaW5zdHJ1Y3Rpb24gCQkJICAgICAqLworI2RlZmluZSBEQ01EX1RDSV9PUF9NQVNLCTB4MzgJLyogbWFzayBmb3Igb3Bjb2RlICovCisjZGVmaW5lIERDTURfVENJX09QX0pVTVAJMHgwMAkvKiBKVU1QICovCisjZGVmaW5lIERDTURfVENJX09QX0NBTEwJMHgwOAkvKiBDQUxMICovCisjZGVmaW5lIERDTURfVENJX09QX1JFVFVSTgkweDEwCS8qIFJFVFVSTiAqLworI2RlZmluZSBEQ01EX1RDSV9PUF9JTlQJCTB4MTgJLyogSU5UICovCisKKyNkZWZpbmUgRENNRF9UWVBFX1JXUkkJCTB4NDAJLyogSW5kaWNhdGVzIEkvTyBvciByZWdpc3RlciBSZWFkL1dyaXRlCisJCQkJCSAgIGluc3RydWN0aW9uICovCisjZGVmaW5lIERDTURfUldSSV9PUENfTUFTSwkweDM4CS8qIE9wY29kZSBtYXNrICovCisjZGVmaW5lIERDTURfUldSSV9PUENfV1JJVEUJMHgyOAkvKiBXcml0ZSBTRkJSIHRvIHJlZ2lzdGVyICovCisjZGVmaW5lIERDTURfUldSSV9PUENfUkVBRAkweDMwCS8qIFJlYWQgcmVnaXN0ZXIgdG8gU0ZCUiAqLworI2RlZmluZSBEQ01EX1JXUklfT1BDX01PRElGWQkweDM4CS8qIE1vZGlmeSBpbiBwbGFjZSAqLworCisjZGVmaW5lIERDTURfUldSSV9PUF9NQVNLCTB4MDcKKyNkZWZpbmUgRENNRF9SV1JJX09QX01PVkUJMHgwMAorI2RlZmluZSBEQ01EX1JXUklfT1BfU0hMCTB4MDEKKyNkZWZpbmUgRENNRF9SV1JJX09QX09SCQkweDAyCisjZGVmaW5lIERDTURfUldSSV9PUF9YT1IJMHgwMworI2RlZmluZSBEQ01EX1JXUklfT1BfQU5ECTB4MDQKKyNkZWZpbmUgRENNRF9SV1JJX09QX1NIUgkweDA1CisjZGVmaW5lIERDTURfUldSSV9PUF9BREQJMHgwNgorI2RlZmluZSBEQ01EX1JXUklfT1BfQUREQwkweDA3CisKKyNkZWZpbmUgRENNRF9UWVBFX01NSQkJMHhjMAkvKiBJbmRpY2F0ZXMgYSBNZW1vcnkgTW92ZSBpbnN0cnVjdGlvbiAKKwkJCQkJICAgKHRocmVlIHdvcmRzKSAqLworCisKKyNkZWZpbmUgRE5BRF9SRUcJCTB4MjgJLyogdGhyb3VnaCAweDJiIERNQSBuZXh0IGFkZHJlc3MgZm9yIAorCQkJCQkgICBkYXRhICovCisjZGVmaW5lIERTUF9SRUcJCQkweDJjCS8qIHRocm91Z2ggMHgyZiBETUEgU0NSSVBUUyBwb2ludGVyIHJ3ICovCisjZGVmaW5lIERTUFNfUkVHCQkweDMwCS8qIHRocm91Z2ggMHgzMyBETUEgU0NSSVBUUyBwb2ludGVyIAorCQkJCQkgICBzYXZlIHJ3ICovCisjZGVmaW5lIERNT0RFX1JFR18wMAkJMHgzNCAJLyogRE1BIG1vZGUgcncgKi8KKyNkZWZpbmUgRE1PREVfMDBfQkwxCTB4ODAJLyogQnVyc3QgbGVuZ3RoIGJpdHMgKi8KKyNkZWZpbmUgRE1PREVfMDBfQkwwCTB4NDAKKyNkZWZpbmUgRE1PREVfQkxfTUFTSwkweGMwCisvKiBCdXJzdCBsZW5ndGhzICg4MDApICovCisjZGVmaW5lIERNT0RFX0JMXzIJMHgwMAkvKiAyIHRyYW5zZmVyICovCisjZGVmaW5lIERNT0RFX0JMXzQJMHg0MAkvKiA0IHRyYW5zZmVycyAqLworI2RlZmluZSBETU9ERV9CTF84CTB4ODAJLyogOCB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgRE1PREVfQkxfMTYJMHhjMAkvKiAxNiB0cmFuc2ZlcnMgKi8KKworI2RlZmluZSBETU9ERV8xMF9CTF8xCTB4MDAJLyogMSB0cmFuc2ZlciAqLworI2RlZmluZSBETU9ERV8xMF9CTF8yCTB4NDAJLyogMiB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgRE1PREVfMTBfQkxfNAkweDgwCS8qIDQgdHJhbnNmZXJzICovCisjZGVmaW5lIERNT0RFXzEwX0JMXzgJMHhjMAkvKiA4IHRyYW5zZmVycyAqLworI2RlZmluZSBETU9ERV8xMF9GQzIJMHgyMAkvKiBEcml2ZW4gdG8gRkMyIHBpbiAqLworI2RlZmluZSBETU9ERV8xMF9GQzEJMHgxMAkvKiBEcml2ZW4gdG8gRkMxIHBpbiAqLworI2RlZmluZSBETU9ERV83MTBfUEQJMHgwOAkvKiBQcm9ncmFtL2RhdGEgb24gRkMwIHBpbiAqLworI2RlZmluZSBETU9ERV83MTBfVU8JMHgwMgkvKiBVc2VyIHByb2cuIG91dHB1dCAqLworCisjZGVmaW5lIERNT0RFXzcwMF9CVzE2CTB4MjAJLyogSG9zdCBidXN3aWR0aCA9IDE2ICovCisjZGVmaW5lIERNT0RFXzcwMF8yODYJMHgxMAkvKiAyODYgbW9kZSAqLworI2RlZmluZSBETU9ERV83MDBfSU9NCTB4MDgJLyogVHJhbnNmZXIgdG8gSU8gcG9ydCAqLworI2RlZmluZSBETU9ERV83MDBfRkFNCTB4MDQJLyogRml4ZWQgYWRkcmVzcyBtb2RlICovCisjZGVmaW5lIERNT0RFXzcwMF9QSVBFCTB4MDIJLyogUGlwZWxpbmUgbW9kZSBkaXNhYmxlcyAKKwkJCQkJICogYXV0b21hdGljIGZldGNoIC8gZXhlYyAKKwkJCQkJICovCisjZGVmaW5lIERNT0RFX01BTgkweDAxCQkvKiBNYW51YWwgc3RhcnQgbW9kZSwgCisJCQkJCSAqIHJlcXVpcmVzIGEgMSB0byBiZSB3cml0dGVuCisJCQkJCSAqIHRvIHRoZSBzdGFydCBETUEgYml0IGluIHRoZSBEQ05UTAorCQkJCQkgKiByZWdpc3RlciB0byBydW4gc2NyaXB0cyAKKwkJCQkJICovCisKKyNkZWZpbmUgRE1PREVfNzAwX1NBVkUgKCBETU9ERV8wMF9CTF9NQVNLIHwgRE1PREVfMDBfQlcxNiB8IERNT0RFXzAwXzI4NiApCisKKy8qIE5DUjUzYzgwMCBzZXJpZXMgb25seSAqLworI2RlZmluZSBTQ1JBVENIQV9SRUdfODAwCTB4MzQJLyogdGhyb3VnaCAweDM3IFNjcmF0Y2ggQSBydyAqLworLyogTkNSNTNjNzEwIG9ubHkgKi8KKyNkZWZpbmUgU0NSQVRDSEJfUkVHXzEwCQkweDM0CS8qIHRocm91Z2ggMHgzNyBzY3JhdGNoIEIgcncgKi8KKworI2RlZmluZSBETU9ERV9SRUdfMTAgICAgCTB4MzgJLyogRE1BIG1vZGUgcncsIE5DUjUzYzcxMCBhbmQgbmV3ZXIgKi8KKyNkZWZpbmUgRE1PREVfODAwX1NJT00JCTB4MjAJLyogU291cmNlIElPID0gMSAqLworI2RlZmluZSBETU9ERV84MDBfRElPTQkJMHgxMAkvKiBEZXN0aW5hdGlvbiBJTyA9IDEgKi8KKyNkZWZpbmUgRE1PREVfODAwX0VSTAkJMHgwOAkvKiBFbmFibGUgUmVhZCBMaW5lICovCisKKy8qIDM1LTM4IGFyZSByZXNlcnZlZCBvbiA3MDAgYW5kIDcwMC02NiBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgRElFTl9SRUcJCTB4MzkJLyogRE1BIGludGVycnVwdCBlbmFibGUgcncgKi8KKy8qIDB4ODAsIDB4NDAsIGFuZCAweDIwIGFyZSByZXNlcnZlZCBvbiA3MDAtc2VyaWVzIGNoaXBzICovCisjZGVmaW5lIERJRU5fODAwX01EUEUJCTB4NDAJLyogTWFzdGVyIGRhdGEgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIERJRU5fODAwX0JGCQkweDIwCS8qIEJVUyBmYXVsdCAqLworI2RlZmluZSBESUVOXzcwMF9CRgkJMHgyMAkvKiBCVVMgZmF1bHQgKi8KKyNkZWZpbmUgRElFTl9BQlJUCQkweDEwCS8qIEVuYWJsZSBhYm9ydGVkIGludGVycnVwdCAqLworI2RlZmluZSBESUVOX1NTSQkJMHgwOAkvKiBFbmFibGUgc2luZ2xlIHN0ZXAgaW50ZXJydXB0ICovCisjZGVmaW5lIERJRU5fU0lSCQkweDA0CS8qIEVuYWJsZSBTQ1JJUFRTIElOVCBjb21tYW5kIAorCQkJCQkgKiBpbnRlcnJ1cHQKKwkJCQkJICovCisvKiAweDAyIGlzIHJlc2VydmVkIG9uIDgwMCBzZXJpZXMgY2hpcHMgKi8KKyNkZWZpbmUgRElFTl83MDBfV1RECQkweDAyCS8qIEVuYWJsZSB3YXRjaGRvZyB0aW1lb3V0IGludGVycnVwdCAqLworI2RlZmluZSBESUVOXzcwMF9PUEMJCTB4MDEJLyogRW5hYmxlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gCisJCQkJCSAqIGludGVycnVwdCAKKwkJCQkJICovCisjZGVmaW5lIERJRU5fODAwX0lJRAkJMHgwMQkvKiAgU2FtZSBtZWFuaW5nLCBkaWZmZXJlbnQgbmFtZSAqLyAKKworLyoKKyAqIERNQSB3YXRjaGRvZyB0aW1lciBydworICogc2V0IGluIDE2IENMSyBpbnB1dCBwZXJpb2RzLgorICovCisjZGVmaW5lIERXVF9SRUcJCQkweDNhCisKKy8qIERNQSBjb250cm9sIHJ3ICovCisjZGVmaW5lIERDTlRMX1JFRwkJMHgzYgorI2RlZmluZSBEQ05UTF83MDBfQ0YxCQkweDgwCS8qIENsb2NrIGRpdmlzb3IgYml0cyAqLworI2RlZmluZSBEQ05UTF83MDBfQ0YwCQkweDQwCisjZGVmaW5lIERDTlRMXzcwMF9DRl9NQVNLCTB4YzAKKy8qIENsb2NrIGRpdmlzb3JzIAkJCSAgIERpdmlzb3IgU0NMSyByYW5nZSAoTUhaKSAqLworI2RlZmluZSBEQ05UTF83MDBfQ0ZfMgkJMHgwMCAgICAvKiAyLjAJICAgMzcuNTEtNTAuMDAgKi8KKyNkZWZpbmUgRENOVExfNzAwX0NGXzFfNQkweDQwCS8qIDEuNQkgICAyNS4wMS0zNy41MCAqLworI2RlZmluZSBEQ05UTF83MDBfQ0ZfMQkJMHg4MAkvKiAxLjAgICAgIDE2LjY3LTI1LjAwICovCisjZGVmaW5lIERDTlRMXzcwMF9DRl8zCQkweGMwCS8qIDMuMAkgICA1MC4wMS02Ni42NyAoNTNjNzAwLTY2KSAqLworCisjZGVmaW5lIERDTlRMXzcwMF9TMTYJCTB4MjAJLyogTG9hZCBzY3JpcHRzIDE2IGJpdHMgYXQgYSB0aW1lICovCisjZGVmaW5lIERDTlRMX1NTTQkJMHgxMAkvKiBTaW5nbGUgc3RlcCBtb2RlICovCisjZGVmaW5lIERDTlRMXzcwMF9MTE0JCTB4MDgJLyogTG93IGxldmVsIG1vZGUsIGNhbiBvbmx5IGJlIHNldCAKKwkJCQkJICogYWZ0ZXIgc2VsZWN0aW9uICovCisjZGVmaW5lIERDTlRMXzgwMF9JUlFNCQkweDA4CS8qIFRvdGVtIHBvbGUgSVJRIHBpbiAqLworI2RlZmluZSBEQ05UTF9TVEQJCTB4MDQJLyogU3RhcnQgRE1BIC8gU0NSSVBUUyAqLworLyogMHgwMiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBEQ05UTF8wMF9SU1QJCTB4MDEJLyogU29mdHdhcmUgcmVzZXQsIHJlc2V0cyBldmVyeXRoaW5nCisJCQkJCSAqIGJ1dCAyODYgbW9kZSBiaXQgIGluIERNT0RFLiBPbiB0aGUKKwkJCQkJICogTkNSNTNjNzEwLCB0aGlzIGJpdCBtb3ZlZCB0byBDVEVTVDgKKwkJCQkJICovCisjZGVmaW5lIERDTlRMXzEwX0NPTQkJMHgwMQkvKiA3MDAgc29mdHdhcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisjZGVmaW5lIERDTlRMXzEwX0VBCQkweDIwCS8qIEVuYWJsZSBBY2sgLSBuZWVkZWQgZm9yIE1WTUUxNnggKi8KKworI2RlZmluZSBEQ05UTF83MDBfU0FWRSAoIERDTlRMX0NGX01BU0sgfCBEQ05UTF9TMTYpCisKKworLyogTkNSNTNjNzAwLTY2IG9ubHkgKi8KKyNkZWZpbmUgU0NSQVRDSEJfUkVHXzAwCQkweDNjCS8qIHRocm91Z2ggMHgzZiBzY3JhdGNoIGIgcncgKi8KKyNkZWZpbmUgU0NSQVRDSEJfUkVHXzgwMAkweDVjCS8qIHRocm91Z2ggMHg1ZiBzY3JhdGNoIGIgcncgKi8KKy8qIE5DUjUzYzcxMCBvbmx5ICovCisjZGVmaW5lIEFEREVSX1JFR18xMAkJMHgzYwkvKiBBZGRlciwgTkNSNTNjNzEwIG9ubHkgKi8KKworI2RlZmluZSBTSUVOMV9SRUdfODAwCQkweDQxCisjZGVmaW5lIFNJRU4xXzgwMF9TVE8JCTB4MDQJLyogc2VsZWN0aW9uL3Jlc2VsZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lFTjFfODAwX0dFTgkJMHgwMgkvKiBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKyNkZWZpbmUgU0lFTjFfODAwX0hUSAkJMHgwMQkvKiBoYW5kc2hha2UgdG8gaGFuZHNoYWtlICovCisKKyNkZWZpbmUgU0lTVDFfUkVHXzgwMAkJMHg0MworI2RlZmluZSBTSVNUMV84MDBfU1RPCQkweDA0CS8qIHNlbGVjdGlvbi9yZXNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIFNJU1QxXzgwMF9HRU4JCTB4MDIJLyogZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisjZGVmaW5lIFNJU1QxXzgwMF9IVEgJCTB4MDEJLyogaGFuZHNoYWtlIHRvIGhhbmRzaGFrZSAqLworCisjZGVmaW5lIFNMUEFSX1JFR184MDAJCTB4NDQJLyogUGFyaXR5ICovCisKKyNkZWZpbmUgTUFDTlRMX1JFR184MDAJCTB4NDYJLyogTWVtb3J5IGFjY2VzcyBjb250cm9sICovCisjZGVmaW5lIE1BQ05UTF84MDBfVFlQMwkJMHg4MAorI2RlZmluZSBNQUNOVExfODAwX1RZUDIJCTB4NDAKKyNkZWZpbmUgTUFDTlRMXzgwMF9UWVAxCQkweDIwCisjZGVmaW5lIE1BQ05UTF84MDBfVFlQMAkJMHgxMAorI2RlZmluZSBNQUNOVExfODAwX0RXUgkJMHgwOAorI2RlZmluZSBNQUNOVExfODAwX0RSRAkJMHgwNAorI2RlZmluZSBNQUNOVExfODAwX1BTQ1BUCTB4MDIKKyNkZWZpbmUgTUFDTlRMXzgwMF9TQ1BUUwkweDAxCisKKyNkZWZpbmUgR1BDTlRMX1JFR184MDAJCTB4NDcJLyogR2VuZXJhbCBQdXJwb3NlIFBpbiBDb250cm9sICovCisKKy8qIFRpbWVvdXRzIGFyZSBleHByZXNzZWQgc3VjaCB0aGF0IDA9b2ZmLCAxPTEwMHVzLCBkb3VibGluZyBhZnRlciB0aGF0ICovCisjZGVmaW5lIFNUSU1FMF9SRUdfODAwCQkweDQ4CS8qIFNDU0kgVGltZXIgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBTVElNRTBfODAwX0hUSF9NQVNLCTB4ZjAJLyogSGFuZHNoYWtlIHRvIEhhbmRzaGFrZSB0aW1lb3V0ICovCisjZGVmaW5lIFNUSU1FMF84MDBfSFRIX1NISUZUCTQKKyNkZWZpbmUgU1RJTUUwXzgwMF9TRUxfTUFTSwkweDBmCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIFNUSU1FMF84MDBfU0VMX1NISUZUCTAKKworI2RlZmluZSBTVElNRTFfUkVHXzgwMAkJMHg0OQorI2RlZmluZSBTVElNRTFfODAwX0dFTl9NQVNLCTB4MGYJLyogR2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisKKyNkZWZpbmUgUkVTUElEX1JFR184MDAJCTB4NGEJLyogUmVzcG9uc2UgSUQsIGJpdCBmaWVsZGVkLiAgOAorCQkJCQkgICBiaXRzIG9uIG5hcnJvdyBjaGlwcywgMTYgb24gV0lERSAqLworCisjZGVmaW5lIFNURVNUMF9SRUdfODAwCQkweDRjCQorI2RlZmluZSBTVEVTVDBfODAwX1NMVAkJMHgwOAkvKiBTZWxlY3Rpb24gcmVzcG9uc2UgbG9naWMgdGVzdCAqLworI2RlZmluZSBTVEVTVDBfODAwX0FSVAkJMHgwNAkvKiBBcmJpdHJhdGlvbiBwcmlvcml0eSBlbmNvZGVyIHRlc3QgKi8KKyNkZWZpbmUgU1RFU1QwXzgwMF9TT1oJCTB4MDIJLyogU3luY2hyb25vdXMgb2Zmc2V0IHplcm8gKi8KKyNkZWZpbmUgU1RFU1QwXzgwMF9TT00JCTB4MDEJLyogU3luY2hyb25vdXMgb2Zmc2V0IG1heGltdW0gKi8KKworI2RlZmluZSBTVEVTVDFfUkVHXzgwMAkJMHg0ZAorI2RlZmluZSBTVEVTVDFfODAwX1NDTEsJCTB4ODAJLyogRGlzYWJsZSBTQ1NJIGNsb2NrICovCisKKyNkZWZpbmUgU1RFU1QyX1JFR184MDAJCTB4NGUJCisjZGVmaW5lIFNURVNUMl84MDBfU0NFCQkweDgwCS8qIEVuYWJsZSBTT0NML1NPREwgKi8KKyNkZWZpbmUgU1RFU1QyXzgwMF9ST0YJCTB4NDAJLyogUmVzZXQgU0NTSSBzeW5jIG9mZnNldCAqLworI2RlZmluZSBTVEVTVDJfODAwX1NMQgkJMHgxMAkvKiBFbmFibGUgU0NTSSBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIFNURVNUMl84MDBfU1pNCQkweDA4CS8qIFNDU0kgaGlnaCBpbXBlZGFuY2UgbW9kZSAqLworI2RlZmluZSBTVEVTVDJfODAwX0VYVAkJMHgwMgkvKiBFeHRlbmQgUkVRL0FDSyBmaWx0ZXIgMzAgdG8gNjBucyAqLworI2RlZmluZSBTVEVTVDJfODAwX0xPVwkJMHgwMQkvKiBTQ1NJIGxvdyBsZXZlbCBtb2RlICovCisKKyNkZWZpbmUgU1RFU1QzX1JFR184MDAJCTB4NGYJIAorI2RlZmluZSBTVEVTVDNfODAwX1RFCQkweDgwCS8qIEVuYWJsZSBhY3RpdmUgbmVnYXRpb24gKi8KKyNkZWZpbmUgU1RFU1QzXzgwMF9TVFIJCTB4NDAJLyogU0NTSSBGSUZPIHRlc3QgcmVhZCAqLworI2RlZmluZSBTVEVTVDNfODAwX0hTQwkJMHgyMAkvKiBIYWx0IFNDU0kgY2xvY2sgKi8KKyNkZWZpbmUgU1RFU1QzXzgwMF9EU0kJCTB4MTAJLyogRGlzYWJsZSBzaW5nbGUgaW5pdGlhdG9yIHJlc3BvbnNlICovCisjZGVmaW5lIFNURVNUM184MDBfVFRNCQkweDA0CS8qIFRpbWUgdGVzdCBtb2RlICovCisjZGVmaW5lIFNURVNUM184MDBfQ1NGCQkweDAyCS8qIENsZWFyIFNDU0kgRklGTyAqLworI2RlZmluZSBTVEVTVDNfODAwX1NUVwkJMHgwMQkvKiBTQ1NJIEZJRk8gdGVzdCB3cml0ZSAqLworCisjZGVmaW5lIE9QVElPTl9QQVJJVFkgCQkweDEJLyogRW5hYmxlIHBhcml0eSBjaGVja2luZyAqLworI2RlZmluZSBPUFRJT05fVEFHR0VEX1FVRVVFCTB4MgkvKiBFbmFibGUgU0NTSS1JSSB0YWdnZWQgcXVldWluZyAqLworI2RlZmluZSBPUFRJT05fNzAwCQkweDgJLyogQWx3YXlzIHJ1biBOQ1I1M2M3MDAgc2NyaXB0cyAqLworI2RlZmluZSBPUFRJT05fSU5URkxZCQkweDEwCS8qIFVzZSBJTlRGTFkgaW50ZXJydXB0cyAqLworI2RlZmluZSBPUFRJT05fREVCVUdfSU5UUgkweDIwCS8qIERlYnVnIGludGVycnVwdHMgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0lOSVRfT05MWQkweDQwCS8qIFJ1biBpbml0aWFsaXphdGlvbiBjb2RlIGFuZCAKKwkJCQkJICAgc2ltcGxlIHRlc3QgY29kZSwgcmV0dXJuCisJCQkJCSAgIERJRF9OT19DT05ORUNUIGlmIGFueSBTQ1NJCisJCQkJCSAgIGNvbW1hbmRzIGFyZSBhdHRlbXB0ZWQuICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19SRUFEX09OTFkJMHg4MAkvKiBSZXR1cm4gRElEX0VSUk9SIGlmIGFueSAKKwkJCQkJICAgU0NTSSB3cml0ZSBpcyBhdHRlbXB0ZWQgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX1RSQUNFCTB4MTAwCS8qIEFuaW1hdGVkIHRyYWNlIG1vZGUsIHByaW50IAorCQkJCQkgICBlYWNoIGFkZHJlc3MgYW5kIGluc3RydWN0aW9uIAorCQkJCQkgICBleGVjdXRlZCB0byBkZWJ1ZyBidWZmZXIuICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19TSU5HTEUJMHgyMDAJLyogc3RvcCBhZnRlciBleGVjdXRpbmcgb25lIAorCQkJCQkgICBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBPUFRJT05fU1lOQ0hST05PVVMJMHg0MDAJLyogRW5hYmxlIHN5bmMgU0NTSS4gICovCisjZGVmaW5lIE9QVElPTl9NRU1PUllfTUFQUEVECTB4ODAwCS8qIE5DUiByZWdpc3RlcnMgaGF2ZSB2YWxpZCAKKwkJCQkJICAgbWVtb3J5IG1hcHBpbmcgKi8KKyNkZWZpbmUgT1BUSU9OX0lPX01BUFBFRAkweDEwMDAgIC8qIE5DUiByZWdpc3RlcnMgaGF2ZSB2YWxpZAorCQkJCQkgICAgIEkvTyBtYXBwaW5nICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19QUk9CRV9PTkxZCTB4MjAwMCAgLyogUHJvYmUgb25seSwgZG9uJ3QgZXZlbiBpbml0ICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19URVNUU19PTkxZCTB4NDAwMCAgLyogUHJvYmUsIGluaXQsIHJ1biBzZWxlY3RlZCB0ZXN0cyAqLworI2RlZmluZSBPUFRJT05fREVCVUdfVEVTVDAJMHgwODAwMCAvKiBSdW4gdGVzdCAwICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19URVNUMQkweDEwMDAwIC8qIFJ1biB0ZXN0IDEgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX1RFU1QyCTB4MjAwMDAgLyogUnVuIHRlc3QgMiAqLworI2RlZmluZSBPUFRJT05fREVCVUdfRFVNUAkweDQwMDAwIC8qIER1bXAgY29tbWFuZHMgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX1RBUkdFVF9MSU1JVCAweDgwMDAwIC8qIE9ubHkgdGFsayB0byB0YXJnZXQrbHVucyBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX05DT01NQU5EU19MSU1JVCAweDEwMDAwMCAvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19TQ1JJUFQgMHgyMDAwMDAgLyogUHJpbnQgd2hlbiBjaGVja3BvaW50cyBhcmUgcGFzc2VkICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19GSVhVUCAweDQwMDAwMCAvKiBwcmludCBmaXh1cCB2YWx1ZXMgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0RTQSAweDgwMDAwMAorI2RlZmluZSBPUFRJT05fREVCVUdfQ09SUlVQVElPTgkweDEwMDAwMDAJLyogRGV0ZWN0IHNjcmlwdCBjb3JydXB0aW9uICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19TRFRSICAgICAgIDB4MjAwMDAwMAkvKiBEZWJ1ZyBTRFRSIHByb2JsZW0gKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX01JU01BVENIIAkweDQwMDAwMDAgCS8qIERlYnVnIHBoYXNlIG1pc21hdGNoZXMgKi8KKyNkZWZpbmUgT1BUSU9OX0RJU0NPTk5FQ1QJMHg4MDAwMDAwCS8qIEFsbG93IGRpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0RJU0NPTk5FQ1QgMHgxMDAwMDAwMAkKKyNkZWZpbmUgT1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VUyAweDIwMDAwMDAwCS8qIE5lZ290aWF0ZSBzeW5jLiB0cmFuc2ZlcnMKKwkJCQkJCSAgIG9uIHBvd2VyIHVwICovCisjZGVmaW5lIE9QVElPTl9ERUJVR19RVUVVRVMJMHg4MDAwMDAwMAkKKyNkZWZpbmUgT1BUSU9OX0RFQlVHX0FMTE9DQVRJT04gMHgxMDAwMDAwMDBMTAorI2RlZmluZSBPUFRJT05fREVCVUdfU1lOQ0hST05PVVMgMHgyMDAwMDAwMDBMTAkvKiBTYW5pdHkgY2hlY2sgU1hGRVIgYW5kIAorCQkJCQkJICAgU0NOVEwzIHJlZ2lzdGVycyAqLworI2RlZmluZSBPUFRJT05fTk9fQVNZTkMJMHg0MDAwMDAwMDBMTAkJLyogRG9uJ3QgYXV0b21hZ2ljYWxseSBzZW5kCisJCQkJCQkgICBTRFRSIGZvciBhc3luYyB0cmFuc2ZlcnMgd2hlbgorCQkJCQkJICAgd2UgaGF2ZW4ndCBiZWVuIHRvbGQgdG8gZG8KKwkJCQkJCSAgIGEgc3luY2hyb25vdXMgdHJhbnNmZXIuICovCisjZGVmaW5lIE9QVElPTl9OT19QUklOVF9SQUNFIDB4ODAwMDAwMDAwTEwJLyogRG9uJ3QgcHJpbnQgbWVzc2FnZSB3aGVuCisJCQkJCQkgICB0aGUgcmVzZWxlY3QvV0FJVCBESVNDT05ORUNUCisJCQkJCQkgICByYWNlIGNvbmRpdGlvbiBoaXRzICovCisjaWYgIWRlZmluZWQoUEVSTV9PUFRJT05TKQorI2RlZmluZSBQRVJNX09QVElPTlMgMAorI2VuZGlmCisJCQkJCisvKgorICogU29tZSBkYXRhIHdoaWNoIGlzIGFjY2Vzc2VkIGJ5IHRoZSBOQ1IgY2hpcCBtdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogRm9yIHNvbWUgaG9zdHMgdGhlIGRlZmF1bHQgaXMgbGVzcyB0aGFuIHRoYXQgKGVnLiA2OEsgdXNlcyAyLWJ5dGUpLgorICogQWxpZ25tZW50IGhhcyBvbmx5IGJlZW4gZm9yY2VkIHdoZXJlIGl0IGlzIGltcG9ydGFudDsgYWxzbyBpZiBvbmUKKyAqIDMyIGJpdCBzdHJ1Y3R1cmUgZmllbGQgaXMgYWxpZ25lZCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCBmb2xsb3dpbmcKKyAqIDMyIGJpdCBmaWVsZHMgYXJlIGFsc28gYWxpZ25lZC4gIFRha2UgY2FyZSB3aGVuIGFkZGluZyBmaWVsZHMKKyAqIHdoaWNoIGFyZSBvdGhlciB0aGFuIDMyIGJpdC4KKyAqLworCitzdHJ1Y3QgTkNSNTNjN3gwX3N5bmNocm9ub3VzIHsKKyAgICB1MzIgc2VsZWN0X2luZGlyZWN0CQkJLyogVmFsdWUgdXNlZCBmb3IgaW5kaXJlY3Qgc2VsZWN0aW9uICovCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisgICAgdTMyIHNzY2ZfNzEwOwkJCS8qIFVzZWQgdG8gc2V0IFNTQ0YgYml0cyBmb3IgNzEwICovCisgICAgdTMyIHNjcmlwdFs4XTsJCQkvKiBTaXplID8/IFNjcmlwdCB1c2VkIHdoZW4gdGFyZ2V0IGlzIAorCQkJCQkJcmVzZWxlY3RlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgc3luY2hyb25vdXNfd2FudFs1XTsJLyogUGVyIHRhcmdldCBkZXNpcmVkIFNEVFIgKi8KKy8qIAorICogU2V0X3N5bmNocm9ub3VzIHByb2dyYW1zIHRoZXNlLCBzZWxlY3RfaW5kaXJlY3QgYW5kIGN1cnJlbnQgc2V0dGluZ3MgYWZ0ZXIKKyAqIGludF9kZWJ1Z19zaG91bGQgc2hvdyBhIG1hdGNoLgorICovCisgICAgdW5zaWduZWQgY2hhciBzeGZlcl9zYW5pdHksIHNjbnRsM19zYW5pdHk7Cit9OworCisjZGVmaW5lIENNRF9GTEFHX1NEVFIgCQkxCS8qIEluaXRpYXRpbmcgc3luY2hyb25vdXMgCisJCQkJCSAgIHRyYW5zZmVyIG5lZ290aWF0aW9uICovCisjZGVmaW5lIENNRF9GTEFHX1dEVFIJCTIJLyogSW5pdGlhdGluZyB3aWRlIHRyYW5zZmVyCisJCQkJCSAgIG5lZ290aWF0aW9uICovCisjZGVmaW5lIENNRF9GTEFHX0RJRF9TRFRSCTQJLyogZGlkIFNEVFIgKi8KKyNkZWZpbmUgQ01EX0ZMQUdfRElEX1dEVFIJOAkvKiBkaWQgV0RUUiAqLworCitzdHJ1Y3QgTkNSNTNjN3gwX3RhYmxlX2luZGlyZWN0IHsKKyAgICB1MzIgY291bnQ7CisgICAgdm9pZCAqYWRkcmVzczsKK307CisKK2VudW0gbmNyX2V2ZW50IHsgCisgICAgRVZFTlRfTk9ORSA9IDAsCisvKiAKKyAqIE9yZGVyIGlzIElNUE9SVEFOVCwgc2luY2UgdGhlc2UgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBldmVudCBpbnRlcnJ1cHRzCisgKiBpbiA1M2M3LDh4eC5zY3IgCisgKi8KKworICAgIEVWRU5UX0lTU1VFX1FVRVVFID0gMHg1MDAwMDAwLAkvKiAwIENvbW1hbmQgd2FzIGFkZGVkIHRvIGlzc3VlIHF1ZXVlICovCisgICAgRVZFTlRfU1RBUlRfUVVFVUUsCQkJLyogMSBDb21tYW5kIG1vdmVkIHRvIHN0YXJ0IHF1ZXVlICovCisgICAgRVZFTlRfU0VMRUNULAkJCS8qIDIgQ29tbWFuZCBjb21wbGV0ZWQgc2VsZWN0aW9uICovCisgICAgRVZFTlRfRElTQ09OTkVDVCwJCQkvKiAzIENvbW1hbmQgZGlzY29ubmVjdGVkICovCisgICAgRVZFTlRfUkVTRUxFQ1QsCQkJLyogNCBDb21tYW5kIHJlc2VsZWN0ZWQgKi8KKyAgICBFVkVOVF9DT01QTEVURSwJCSAgICAgICAgLyogNSBDb21tYW5kIGNvbXBsZXRlZCAqLworICAgIEVWRU5UX0lETEUsCQkJCS8qIDYgKi8KKyAgICBFVkVOVF9TRUxFQ1RfRkFJTEVELAkJLyogNyAqLworICAgIEVWRU5UX0JFRk9SRV9TRUxFQ1QsCQkvKiA4ICovCisgICAgRVZFTlRfUkVTRUxFQ1RfRkFJTEVECQkvKiA5ICovCit9OworCitzdHJ1Y3QgTkNSNTNjN3gwX2V2ZW50IHsKKyAgICBlbnVtIG5jcl9ldmVudCBldmVudDsJLyogV2hhdCB0eXBlIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgY2hhciB0YXJnZXQ7CisgICAgdW5zaWduZWQgY2hhciBsdW47CisgICAgc3RydWN0IHRpbWV2YWwgdGltZTsJCisgICAgdTMyICpkc2E7CQkJLyogV2hhdCdzIGluIHRoZSBEU0EgcmVnaXN0ZXIgbm93ICh2aXJ0KSAqLworLyogCisgKiBBIGZldyB0aGluZ3MgZnJvbSB0aGF0IFNDU0kgcGlkIHNvIHdlIGtub3cgd2hhdCBoYXBwZW5lZCBhZnRlciAKKyAqIHRoZSBTY3NpX0NtbmQgc3RydWN0dXJlIGluIHF1ZXN0aW9uIG1heSBoYXZlIGRpc2FwcGVhcmVkLgorICovCisgICAgdW5zaWduZWQgbG9uZyBwaWQ7CQkvKiBUaGUgU0NTSSBQSUQgd2hpY2ggY2F1c2VkIHRoaXMgCisJCQkJICAgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNtbmRbMTJdOworfTsKKworLyoKKyAqIFRoaW5ncyBpbiB0aGUgTkNSNTNjN3gwX2NtZCBzdHJ1Y3R1cmUgYXJlIHNwbGl0IGludG8gdHdvIHBhcnRzIDoKKyAqCisgKiAxLiAgQSBmaXhlZCBwb3J0aW9uLCBmb3IgdGhpbmdzIHdoaWNoIGFyZSBub3QgYWNjZXNzZWQgZGlyZWN0bHkgYnkgc3RhdGljIE5DUgorICoJY29kZSAoaWUsIGFyZSByZWZlcmVuY2VkIG9ubHkgYnkgdGhlIExpbnV4IHNpZGUgb2YgdGhlIGRyaXZlciwKKyAqCW9yIG9ubHkgYnkgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvZGUpLiAgCisgKgorICogMi4gIFRoZSBEU0EgcG9ydGlvbiwgZm9yIHRoaW5ncyB3aGljaCBhcmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgc3RhdGljIE5DUgorICoJY29kZS4KKyAqCisgKiBUaGlzIGlzIGEgbGl0dGxlIHVnbHksIGJ1dCBpdCAKKyAqIDEuICBBdm9pZHMgY29uZmxpY3RzIGJldHdlZW4gdGhlIE5DUiBjb2RlJ3MgcGljdHVyZSBvZiB0aGUgc3RydWN0dXJlLCBhbmQgCisgKiAJTGludXggY29kZSdzIGlkZWEgb2Ygd2hhdCBpdCBsb29rcyBsaWtlLgorICoKKyAqIDIuICBNaW5pbWl6ZXMgdGhlIHBhaW4gaW4gdGhlIExpbnV4IHNpZGUgb2YgdGhlIGNvZGUgbmVlZGVkIAorICogCXRvIGNhbGN1bGF0ZSByZWFsIGRzYSBsb2NhdGlvbnMgZm9yIHRoaW5ncywgZXRjLgorICogCisgKi8KKworc3RydWN0IE5DUjUzYzd4MF9jbWQgeworICAgIHZvaWQgKnJlYWw7CQkJCS8qIFJlYWwsIHVuYWxpZ25lZCBhZGRyZXNzIGZvcgorCQkJCQkgICBmcmVlIGZ1bmN0aW9uICovCisgICAgdm9pZCAoKiBmcmVlKSh2b2lkICosIGludCk7CQkvKiBDb21tYW5kIHRvIGRlYWxsb2NhdGU7IE5VTEwKKwkJCQkJICAgZm9yIHN0cnVjdHVyZXMgYWxsb2NhdGVkIHdpdGgKKwkJCQkJICAgc2NzaV9yZWdpc3RlciwgZXRjLiAqLworICAgIFNjc2lfQ21uZCAqY21kOwkJCS8qIEFzc29jaWF0ZWQgU2NzaV9DbW5kIAorCQkJCQkgICBzdHJ1Y3R1cmUsIFNjc2lfQ21uZCBwb2ludHMKKwkJCQkJICAgYXQgTkNSNTNjN3gwX2NtZCB1c2luZyAKKwkJCQkJICAgaG9zdF9zY3JpYmJsZSBzdHJ1Y3R1cmUgKi8KKworICAgIGludCBzaXplOwkJCQkvKiBzY3NpX21hbGxvYydkIHNpemUgb2YgdGhpcyAKKwkJCQkJICAgc3RydWN0dXJlICovCisKKyAgICBpbnQgZmxhZ3M7CQkJCS8qIENNRF8qIGZsYWdzICovCisKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgY21uZFsxMl07CS8qIENEQiwgY29waWVkIGZyb20gU2NzaV9DbW5kICovCisgICAgaW50ICAgICAgICAgICAgICAgIHJlc3VsdDsJCS8qIENvcHkgdG8gU2NzaV9DbW5kIHdoZW4gZG9uZSAqLworCisgICAgc3RydWN0IHsJCQkJLyogUHJpdmF0ZSBub24tY2FjaGVkIGJvdW5jZSBidWZmZXIgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMjU2XTsKKwl1MzIJICAgICAgYWRkcjsKKyAgICAgICAgdTMyICAgICAgICAgICBsZW47CisgICAgfSBib3VuY2U7CisKKy8qCisgKiBTRFRSIGFuZCBXSURFIG1lc3NhZ2VzIGFyZSBhbiBlaXRoZXIvb3IgYWZmYWlyCisgKiBpbiB0aGlzIG1lc3NhZ2UsIHNpbmNlIHdlIHdpbGwgZ28gaW50byBtZXNzYWdlIG91dCBhbmQgc2VuZAorICogX3RoZSB3aG9sZSBtZXNzXyB3aXRob3V0IGRyb3BwaW5nIG91dCBvZiBtZXNzYWdlIG91dCB0byAKKyAqIGxldCB0aGUgdGFyZ2V0IGdvIGludG8gbWVzc2FnZSBpbiBhZnRlciBzZW5kaW5nIHRoZSBmaXJzdCAKKyAqIG1lc3NhZ2UuCisgKi8KKworICAgIHVuc2lnbmVkIGNoYXIgc2VsZWN0WzExXTsJCS8qIFNlbGVjdCBtZXNzYWdlLCBpbmNsdWRlcworCQkJCQkgICBJREVOVElGWQorCQkJCQkgICAob3B0aW9uYWwpIFFVRVVFIFRBRworIAkJCQkgCSAgIChvcHRpb25hbCkgU0RUUiBvciBXRFRSCisJCQkJCSAqLworCisKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX2NtZCAqbmV4dDsgLyogTGludXggbWFpbnRhaW5lZCBsaXN0cyAoZnJlZSwKKwkJCQkJICAgIHJ1bm5pbmcsIGV2ZW50dWFsbHkgZmluaXNoZWQgKi8KKyAgICAJCQkJCSAKKworICAgIHUzMiAqZGF0YV90cmFuc2Zlcl9zdGFydDsJCS8qIFN0YXJ0IG9mIGRhdGEgdHJhbnNmZXIgcm91dGluZXMgKi8KKyAgICB1MzIgKmRhdGFfdHJhbnNmZXJfZW5kOwkJLyogQWRkcmVzcyBhZnRlciBlbmQgb2YgZGF0YSB0cmFuc2ZlciBvCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgcm91dGluZXMgKi8KKy8qIAorICogVGhlIGZvbGxvd2luZyB0aHJlZSBmaWVsZHMgd2VyZSBtb3ZlZCBmcm9tIHRoZSBEU0EgcHJvcGVyIHRvIGhlcmUKKyAqIHNpbmNlIG9ubHkgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIE5DUiBjb2RlIHJlZmVycyB0byB0aGVtLCBtZWFuaW5nCisgKiB3ZSBkb24ndCBuZWVkIGRzYV8qIGFic29sdXRlcywgYW5kIGl0IGlzIHNpbXBsZXIgdG8gbGV0IHRoZSAKKyAqIGhvc3QgY29kZSByZWZlciB0byB0aGVtIGRpcmVjdGx5LgorICovCisKKy8qIAorICogSEFSRCBDT0RFRCA6IHJlc2lkdWFsIGFuZCBzYXZlZF9yZXNpZHVhbCBuZWVkIHRvIGFncmVlIHdpdGggdGhlIHNpemVzCisgKiB1c2VkIGluIE5DUjUzYzcsOHh4LnNjci4gIAorICogCisgKiBGSVhNRTogd2Ugd2FudCB0byBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIG9kZC1sZW5ndGggCisgKglzY2F0dGVyL2dhdGhlciBidWZmZXJzIGFuZCBhIFdJREUgdHJhbnNmZXIsIGluIHdoaWNoIGNhc2UgCisgKgl3ZSdsbCBuZWVkIHRvIHVzZSB0aGUgQ0hBSU4gTU9WRSBpbnN0cnVjdGlvbi4gIEljay4KKyAqLworICAgIHUzMiByZXNpZHVhbFs2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKwkJCQkJLyogUmVzaWR1YWwgZGF0YSB0cmFuc2ZlciB3aGljaAorCQkJCQkgICBhbGxvd3MgcG9pbnRlciBjb2RlIHRvIHdvcmsKKwkJCQkJICAgcmlnaHQuCisKKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgWzAtMV0gOiBDb25kaXRpb25hbCBjYWxsIHRvIAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJYXBwcm9wcmlhdGUgb3RoZXIgdHJhbnNmZXIgCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAlyb3V0aW5lLgorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBbMi0zXSA6IFJlc2lkdWFsIGJsb2NrIHRyYW5zZmVyCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAlpbnN0cnVjdGlvbi4KKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgWzQtNV0gOiBKdW1wIHRvIGluc3RydWN0aW9uCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAlhZnRlciBzcGxpY2UuCisJCQkJCSAqLworICAgIHUzMiBzYXZlZF9yZXNpZHVhbFs2XTsgCQkvKiBDb3B5IG9mIG9sZCByZXNpZHVhbCwgc28gd2UgCisJCQkJCSAgIGNhbiBnZXQgYW5vdGhlciBwYXJ0aWFsIAorCQkJCQkgICB0cmFuc2ZlciBhbmQgc3RpbGwgcmVjb3ZlciAKKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgKi8KKyAgICAJICAgIAkKKyAgICB1MzIgc2F2ZWRfZGF0YV9wb2ludGVyOwkJLyogU2F2ZWQgZGF0YSBwb2ludGVyICovCisKKyAgICB1MzIgZHNhX25leHRfYWRkcjsJCSAgICAgICAgLyogX0FkZHJlc3NfIG9mIGRzYV9uZXh0IGZpZWxkICAKKwkJCQkJICAgaW4gdGhpcyBkc2EgZm9yIFJJU0N5IAorCQkJCQkgICBzdHlsZSBjb25zdGFudC4gKi8KKworICAgIHUzMiBkc2FfYWRkcjsJCQkvKiBBZGRyZXNzIG9mIGRzYTsgUklTQ3kgc3R5bGUKKwkJCQkJICAgY29uc3RhbnQgKi8KKworICAgIHUzMiBkc2FbMF07CQkJCS8qIFZhcmlhYmxlIGxlbmd0aCAoZGVwZW5kaW5nCisJCQkJCSAgIG9uIGhvc3QgdHlwZSwgbnVtYmVyIG9mIHNjYXR0ZXIgLworCQkJCQkgICBnYXRoZXIgYnVmZmVycywgZXRjKS4gICovCit9OworCitzdHJ1Y3QgTkNSNTNjN3gwX2JyZWFrIHsKKyAgICB1MzIgKmFkZHJlc3MsIG9sZF9pbnN0cnVjdGlvblsyXTsKKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2JyZWFrICpuZXh0OworICAgIHVuc2lnbmVkIGNoYXIgb2xkX3NpemU7CQkvKiBTaXplIG9mIG9sZCBpbnN0cnVjdGlvbiAqLworfTsKKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIE5DUiBpcyBub3QgZXhlY3V0aW5nIGNvZGUgKi8KKyNkZWZpbmUgU1RBVEVfSEFMVEVECTAJCQorLyogCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgTkNSIGlzIGV4ZWN1dGluZyB0aGUgd2FpdCBmb3Igc2VsZWN0IC8gcmVzZWxlY3QgCisgKiBzY3JpcHQuICBPbmx5IHVzZWQgd2hlbiBydW5uaW5nIE5DUjUzYzcwMCBjb21wYXRpYmxlIHNjcmlwdHMsIG9ubHkgCisgKiBzdGF0ZSBkdXJpbmcgd2hpY2ggYW4gQUJPUlQgaXMgX25vdF8gY29uc2lkZXJlZCBhbiBlcnJvciBjb25kaXRpb24uCisgKi8KKyNkZWZpbmUgU1RBVEVfV0FJVElORwkxCQkKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBOQ1IgaXMgZXhlY3V0aW5nIG90aGVyIGNvZGUuICovCisjZGVmaW5lIFNUQVRFX1JVTk5JTkcJMgkJCisvKiAKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBOQ1Igd2FzIGJlaW5nIGFib3J0ZWQuCisgKi8KKyNkZWZpbmUgU1RBVEVfQUJPUlRJTkcJMworLyogSW5kaWNhdGVzIHRoYXQgdGhlIE5DUiB3YXMgc3VjY2Vzc2Z1bGx5IGFib3J0ZWQuICovCisjZGVmaW5lIFNUQVRFX0FCT1JURUQgNAorLyogSW5kaWNhdGVzIHRoYXQgdGhlIE5DUiBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gYSBmYXRhbCBlcnJvciAqLworI2RlZmluZSBTVEFURV9ESVNBQkxFRCA1CisKKy8qIAorICogV2hlcmUga25vd2xlZGdlIG9mIFNDU0kgU0NSSVBUKHRtKSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBuZWVkZWQgCisgKiBpbiBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgYW4gaW50ZXJydXB0IGhhbmRsZXIgZXhpc3RzIGZvciBlYWNoIAorICogZGlmZmVyZW50IFNDU0kgc2NyaXB0IHNvIHdlIGRvbid0IGhhdmUgbmFtZSBzcGFjZSBwcm9ibGVtcy4KKyAqIAorICogUmV0dXJuIHZhbHVlcyBvZiB0aGVzZSBoYW5kbGVycyBhcmUgYXMgZm9sbG93cyA6IAorICovCisjZGVmaW5lIFNQRUNJRklDX0lOVF9OT1RISU5HIAkwCS8qIGRvbid0IGV2ZW4gcmVzdGFydCAqLworI2RlZmluZSBTUEVDSUZJQ19JTlRfUkVTVEFSVAkxCS8qIHJlc3RhcnQgYXQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgU1BFQ0lGSUNfSU5UX0FCT1JUCTIJLyogcmVjb3ZlcmFibGUgZXJyb3IsIGFib3J0IGNtZCAqLworI2RlZmluZSBTUEVDSUZJQ19JTlRfUEFOSUMJMwkvKiB1bnJlY292ZXJhYmxlIGVycm9yLCBwYW5pYyAqLworI2RlZmluZSBTUEVDSUZJQ19JTlRfRE9ORQk0CS8qIG5vcm1hbCBjb21tYW5kIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgU1BFQ0lGSUNfSU5UX0JSRUFLCTUJLyogYnJlYWsgcG9pbnQgZW5jb3VudGVyZWQgKi8KKworc3RydWN0IE5DUjUzYzd4MF9ob3N0ZGF0YSB7CisgICAgaW50IHNpemU7CQkJCS8qIFNpemUgb2YgZW50aXJlIFNjc2lfSG9zdAorCQkJCQkgICBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgYm9hcmQ7CQkJCS8qIHNldCB0byBib2FyZCB0eXBlLCB1c2VmdWwgaWYgCisJCQkJCSAgIHdlIGhhdmUgaG9zdCBzcGVjaWZpYyB0aGluZ3MsCisJCQkJCSAgIGllLCBhIGdlbmVyYWwgcHVycG9zZSBJL08gCisJCQkJCSAgIGJpdCBpcyBiZWluZyB1c2VkIHRvIGVuYWJsZQorCQkJCQkgICB0ZXJtaW5hdGlvbiwgZXRjLiAqLworCisgICAgaW50IGNoaXA7CQkJCS8qIHNldCB0byBjaGlwIHR5cGU7IDcwMC02NiBpcworCQkJCQkgICA3MDAtNjYsIHJlc3QgYXJlIGxhc3QgdGhyZWUKKwkJCQkJICAgZGlnaXRzIG9mIHBhcnQgbnVtYmVyICovCisKKyAgICBjaGFyIHZhbGlkX2lkc1s4XTsJCQkvKiBWYWxpZCBTQ1NJIElEJ3MgZm9yIGFkYXB0ZXIgKi8KKworICAgIHUzMiAqZHNwOwkJCQkvKiBkc3AgdG8gcmVzdGFydCB3aXRoIGFmdGVyCisJCQkJCSAgIGFsbCBzdGFja2VkIGludGVycnVwdHMgYXJlCisJCQkJCSAgIGhhbmRsZWQuICovCisKKyAgICB1bnNpZ25lZCBkc3BfY2hhbmdlZDoxOwkJLyogSGFzIGRzcCBjaGFuZ2VkIHdpdGhpbiB0aGlzCisJCQkJCSAgIHNldCBvZiBzdGFja2VkIGludGVycnVwdHMgPyAqLworCisgICAgdW5zaWduZWQgY2hhciBkc3RhdDsJCS8qIE1vc3QgcmVjZW50IHZhbHVlIG9mIGRzdGF0ICovCisgICAgdW5zaWduZWQgZHN0YXRfdmFsaWQ6MTsKKworICAgIHVuc2lnbmVkIGV4cGVjdGluZ19paWQ6MTsJCS8qIEV4cGVjdCBJSUQgaW50ZXJydXB0ICovCisgICAgdW5zaWduZWQgZXhwZWN0aW5nX3N0bzoxOwkJLyogRXhwZWN0IFNUTyBpbnRlcnJ1cHQgKi8KKyAgICAKKyAgICAvKiAKKyAgICAgKiBUaGUgY29kZSBzdGF5cyBjbGVhbmVyIGlmIHdlIHVzZSB2YXJpYWJsZXMgd2l0aCBmdW5jdGlvbgorICAgICAqIHBvaW50ZXJzIGFuZCBvZmZzZXRzIHRoYXQgYXJlIHVuaXF1ZSBmb3IgdGhlIGRpZmZlcmVudAorICAgICAqIHNjcmlwdHMgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2xldyBvZiBzd2l0Y2goaG9zdGRhdGEtPmNoaXApIAorICAgICAqIHN0YXRlbWVudHMuCisgICAgICogCisgICAgICogSXQgYWxzbyBtZWFucyB0aGF0IHRoZSAjZGVmaW5lcyBmcm9tIHRoZSBTQ1NJIFNDUklQVFModG0pCisgICAgICogZG9uJ3QgaGF2ZSB0byBiZSB2aXNpYmxlIG91dHNpZGUgb2YgdGhlIHNjcmlwdC1zcGVjaWZpYworICAgICAqIGluc3RydWN0aW9ucywgcHJldmVudGluZyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgKCogaW5pdF9maXh1cCkoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisgICAgdm9pZCAoKiBpbml0X3NhdmVfcmVncykoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisgICAgdm9pZCAoKiBkc2FfZml4dXApKHN0cnVjdCBOQ1I1M2M3eDBfY21kICpjbWQpOworICAgIHZvaWQgKCogc29mdF9yZXNldCkoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisgICAgaW50ICgqIHJ1bl90ZXN0cykoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CisKKyAgICAvKgorICAgICAqIENhbGxlZCB3aGVuIERTVEFUX1NJUiBpcyBzZXQsIGluZGljYXRpbmcgYW4gaW50ZXJydXB0IGdlbmVyYXRlZAorICAgICAqIGJ5IHRoZSBJTlQgaW5zdHJ1Y3Rpb24sIHdoZXJlIHZhbHVlcyBhcmUgdW5pcXVlIGZvciBlYWNoIFNDU0kKKyAgICAgKiBzY3JpcHQuICBTaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgU1BFQ18qIHZhbHVlcy4KKyAgICAgKi8KKworICAgIGludCAoKiBkc3RhdF9zaXJfaW50cikoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IE5DUjUzYzd4MF9jbWQgKmNtZCk7CisKKyAgICBpbnQgZHNhX2xlbjsgLyogU2l6ZSBvZiBEU0Egc3RydWN0dXJlICovCisKKyAgICAvKgorICAgICAqIExvY2F0aW9uIG9mIERTQSBmaWVsZHMgZm9yIHRoZSBTQ1NJIFNDUklQVCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgCisgICAgICogY2hpcC4gIAorICAgICAqLworCisgICAgczMyIGRzYV9zdGFydDsJCQkKKyAgICBzMzIgZHNhX2VuZDsJCQkKKyAgICBzMzIgZHNhX25leHQ7CisgICAgczMyIGRzYV9wcmV2OworICAgIHMzMiBkc2FfY21uZDsKKyAgICBzMzIgZHNhX3NlbGVjdDsKKyAgICBzMzIgZHNhX21zZ291dDsKKyAgICBzMzIgZHNhX2NtZG91dDsKKyAgICBzMzIgZHNhX2RhdGFvdXQ7CisgICAgczMyIGRzYV9kYXRhaW47CisgICAgczMyIGRzYV9tc2dpbjsKKyAgICBzMzIgZHNhX21zZ291dF9vdGhlcjsKKyAgICBzMzIgZHNhX3dyaXRlX3N5bmM7CisgICAgczMyIGRzYV93cml0ZV9yZXN1bWU7CisgICAgczMyIGRzYV9jaGVja19yZXNlbGVjdDsKKyAgICBzMzIgZHNhX3N0YXR1czsKKyAgICBzMzIgZHNhX3NhdmVkX3BvaW50ZXI7CisgICAgczMyIGRzYV9qdW1wX2Rlc3Q7CisKKyAgICAvKiAKKyAgICAgKiBJbXBvcnRhbnQgZW50cnkgcG9pbnRzIHRoYXQgZ2VuZXJpYyBmaXh1cCBjb2RlIG5lZWRzCisgICAgICogdG8ga25vdyBhYm91dCwgZml4ZWQgdXAuCisgICAgICovCisKKyAgICBzMzIgRV9hY2NlcHRfbWVzc2FnZTsKKyAgICBzMzIgRV9jb21tYW5kX2NvbXBsZXRlOwkJCisgICAgczMyIEVfZGF0YV90cmFuc2ZlcjsKKyAgICBzMzIgRV9kc2FfY29kZV90ZW1wbGF0ZTsKKyAgICBzMzIgRV9kc2FfY29kZV90ZW1wbGF0ZV9lbmQ7CisgICAgczMyIEVfZW5kX2RhdGFfdHJhbnNmZXI7CisgICAgczMyIEVfbXNnX2luOworICAgIHMzMiBFX2luaXRpYXRvcl9hYm9ydDsKKyAgICBzMzIgRV9vdGhlcl90cmFuc2ZlcjsKKyAgICBzMzIgRV9vdGhlcl9pbjsKKyAgICBzMzIgRV9vdGhlcl9vdXQ7CisgICAgczMyIEVfdGFyZ2V0X2Fib3J0OworICAgIHMzMiBFX2RlYnVnX2JyZWFrOwkKKyAgICBzMzIgRV9yZWplY3RfbWVzc2FnZTsKKyAgICBzMzIgRV9yZXNwb25kX21lc3NhZ2U7CisgICAgczMyIEVfc2VsZWN0OworICAgIHMzMiBFX3NlbGVjdF9tc2dvdXQ7CisgICAgczMyIEVfdGVzdF8wOworICAgIHMzMiBFX3Rlc3RfMTsKKyAgICBzMzIgRV90ZXN0XzI7CisgICAgczMyIEVfdGVzdF8zOworICAgIHMzMiBFX2RzYV96ZXJvOworICAgIHMzMiBFX2NtZG91dF9jbWRvdXQ7CisgICAgczMyIEVfd2FpdF9yZXNlbGVjdDsKKyAgICBzMzIgRV9kc2FfY29kZV9iZWdpbjsKKworICAgIGxvbmcgbG9uZyBvcHRpb25zOwkJCS8qIEJpdGZpZWxkZWQgc2V0IG9mIG9wdGlvbnMgZW5hYmxlZCAqLworICAgIHZvbGF0aWxlIHUzMiB0ZXN0X2NvbXBsZXRlZDsJLyogVGVzdCBjb21wbGV0ZWQgKi8KKyAgICBpbnQgdGVzdF9ydW5uaW5nOwkJCS8qIFRlc3QgY3VycmVudGx5IHJ1bm5pbmcgKi8KKyAgICBzMzIgdGVzdF9zb3VyY2UKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKyAgICB2b2xhdGlsZSBzMzIgdGVzdF9kZXN0OworCisgICAgdm9sYXRpbGUgaW50IHN0YXRlOwkJCS8qIHN0YXRlIG9mIGRyaXZlciwgb25seSB1c2VkIGZvciAKKwkJCQkJICAgT1BUSU9OXzcwMCAqLworCisgICAgdW5zaWduZWQgY2hhciAgZG1vZGU7CQkvKiAKKwkJCQkJICogc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBETU9ERSAKKwkJCQkJICogcmVnaXN0ZXIgZm9yIHRoaXMgY2hpcC4KKwkJCQkJICovCisgICAgdW5zaWduZWQgY2hhciBpc3RhdDsJCS8qIAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAqIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgSVNUQVQgCisgICAgCSAgICAJICAgIAkgICAgCSAgICAJICogcmVnaXN0ZXIgZm9yIHRoaXMgY2hpcC4KKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgKi8KKyAgCisgICAgaW50IHNjc2lfY2xvY2s7CQkJLyogCisJCQkJCSAqIFNDU0kgY2xvY2sgaW4gSFouIDAgbWF5IGJlIHVzZWQgCisJCQkJCSAqIGZvciB1bmtub3duLCBhbHRob3VnaCB0aGlzIHdpbGwKKwkJCQkJICogZGlzYWJsZSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbi4KKwkJCQkJICovCisKKyAgICB2b2xhdGlsZSBpbnQgaW50cnM7CQkJLyogTnVtYmVyIG9mIGludGVycnVwdHMgKi8KKyAgICB2b2xhdGlsZSBpbnQgcmVzZXRzOwkJLyogTnVtYmVyIG9mIFNDU0kgcmVzZXRzICovCisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9kbW9kZTsJCisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9jdGVzdDQ7CisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9jdGVzdDc7CisgICAgdW5zaWduZWQgY2hhciBzYXZlZF9kY250bDsKKyAgICB1bnNpZ25lZCBjaGFyIHNhdmVkX3NjbnRsMzsKKworICAgIHVuc2lnbmVkIGNoYXIgdGhpc19pZF9tYXNrOworCisgICAgLyogRGVidWdnZXIgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgTkNSNTNjN3gwX2JyZWFrICpicmVha3BvaW50cywgLyogTGlua2VkIGxpc3Qgb2YgYWxsIGJyZWFrIHBvaW50cyAqLworCSpicmVha3BvaW50X2N1cnJlbnQ7CQkvKiBDdXJyZW50IGJyZWFrcG9pbnQgYmVpbmcgc3RlcHBlZCAKKwkJCQkJICAgdGhyb3VnaCwgTlVMTCBpZiB3ZSBhcmUgcnVubmluZyAKKwkJCQkJICAgbm9ybWFsbHkuICovCisjaWZkZWYgTkNSX0RFQlVHCisgICAgaW50IGRlYnVnX3NpemU7CQkJLyogU2l6ZSBvZiBkZWJ1ZyBidWZmZXIgKi8KKyAgICB2b2xhdGlsZSBpbnQgZGVidWdfY291bnQ7CQkvKiBDdXJyZW50IGRhdGEgY291bnQgKi8KKyAgICB2b2xhdGlsZSBjaGFyICpkZWJ1Z19idWY7CQkvKiBPdXRwdXQgcmluZyBidWZmZXIgKi8KKyAgICB2b2xhdGlsZSBjaGFyICpkZWJ1Z193cml0ZTsJCS8qIEN1cnJlbnQgd3JpdGUgcG9pbnRlciAqLworICAgIHZvbGF0aWxlIGNoYXIgKmRlYnVnX3JlYWQ7CQkvKiBDdXJyZW50IHJlYWQgcG9pbnRlciAqLworI2VuZGlmIC8qIGRlZiBOQ1JfREVCVUcgKi8KKworICAgIC8qIFhYWCAtIHByaW1pdGl2ZSBkZWJ1Z2dpbmcganVuaywgcmVtb3ZlIHdoZW4gd29ya2luZyA/ICovCisgICAgaW50IGRlYnVnX3ByaW50X2xpbWl0OwkJLyogTnVtYmVyIG9mIGNvbW1hbmRzIHRvIHByaW50CisJCQkJCSAgIG91dCBleGhhdXN0aXZlIGRlYnVnZ2luZworCQkJCQkgICBpbmZvcm1hdGlvbiBmb3IgaWYgCisJCQkJCSAgIE9QVElPTl9ERUJVR19EVU1QIGlzIHNldCAqLyAKKworICAgIHVuc2lnbmVkIGNoYXIgZGVidWdfbHVuX2xpbWl0WzE2XTsJLyogSWYgT1BUSU9OX0RFQlVHX1RBUkdFVF9MSU1JVAorCQkJCQkgICBzZXQsIHB1a2UgaWYgY29tbWFuZHMgYXJlIHNlbnQKKwkJCQkJICAgdG8gb3RoZXIgdGFyZ2V0L2x1biBjb21iaW5hdGlvbnMgKi8KKworICAgIGludCBkZWJ1Z19jb3VudF9saW1pdDsJCS8qIE51bWJlciBvZiBjb21tYW5kcyB0byBleGVjdXRlCisJCQkJCSAgIGJlZm9yZSBwdWtpbmcgdG8gbGltaXQgZGVidWdnaW5nIAorCQkJCQkgICBvdXRwdXQgKi8KKwkJCQkgICAgCisKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpZGxlOjE7CQkJLyogc2V0IHRvIDEgaWYgaWRsZSAqLworCisgICAgLyogCisgICAgICogVGFibGUgb2Ygc3luY2hyb25vdXMrd2lkZSB0cmFuc2ZlciBwYXJhbWV0ZXJzIHNldCBvbiBhIHBlci10YXJnZXQKKyAgICAgKiBiYXNpcy4KKyAgICAgKi8KKyAgICAKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgTkNSNTNjN3gwX3N5bmNocm9ub3VzIHN5bmNbMTZdCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisKKyAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKmlzc3VlX3F1ZXVlCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisJCQkJCQkvKiB3YWl0aW5nIHRvIGJlIGlzc3VlZCBieQorCQkJCQkJICAgTGludXggZHJpdmVyICovCisgICAgdm9sYXRpbGUgc3RydWN0IE5DUjUzYzd4MF9jbWQgKnJ1bm5pbmdfbGlzdDsJCisJCQkJCQkvKiBjb21tYW5kcyBydW5uaW5nLCBtYWludGFpbmVkCisJCQkJCQkgICBieSBMaW51eCBkcml2ZXIgKi8KKworICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpuY3JjdXJyZW50OwkvKiBjdXJyZW50bHkgY29ubmVjdGVkIAorCQkJCQkJICAgbmV4dXMsIE9OTFkgdmFsaWQgZm9yCisJCQkJCQkgICBOQ1I1M2M3MDAvTkNSNTNjNzAwLTY2CisJCQkJCQkgKi8KKworICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpzcGFyZTsJLyogcG9pbnRlciB0byBzcGFyZSwKKyAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgIGFsbG9jYXRlZCBhdCBwcm9iZSB0aW1lLAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgd2hpY2ggd2UgY2FuIHVzZSBmb3IgCisJCQkJCQkgICBpbml0aWFsaXphdGlvbiAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpmcmVlOworICAgIGludCBtYXhfY21kX3NpemU7CQkJCS8qIE1heGltdW0gc2l6ZSBvZiBOQ1I1M2M3eDBfY21kCisJCQkJCSAgICAJICAgYmFzZWQgb24gbnVtYmVyIG9mIAorCQkJCQkJICAgc2NhdHRlci9nYXRoZXIgc2VnbWVudHMsIGV0Yy4KKwkJCQkJCSAgICovCisgICAgdm9sYXRpbGUgaW50IG51bV9jbWRzOwkJCS8qIE51bWJlciBvZiBjb21tYW5kcyAKKwkJCQkJCSAgIGFsbG9jYXRlZCAqLworICAgIHZvbGF0aWxlIGludCBleHRyYV9hbGxvY2F0ZTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9hbGxvY2F0ZWRbMTZdOwkvKiBIYXZlIHdlIGFsbG9jYXRlZCBjb21tYW5kcworCQkJCQkJICAgZm9yIHRoaXMgdGFyZ2V0IHlldD8gIElmIG5vdCwKKwkJCQkJCSAgIGRvIHNvIEFTQVAgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGJ1c3lbMTZdWzhdOyAgICAgCS8qIG51bWJlciBvZiBjb21tYW5kcyAKKwkJCQkJCSAgIGV4ZWN1dGluZyBvbiBlYWNoIHRhcmdldAorICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICovCisgICAgLyogCisgICAgICogRXZlbnR1YWxseSwgSSdsbCBzd2l0Y2ggdG8gYSBjb3JvdXRpbmUgZm9yIGNhbGxpbmcgCisgICAgICogY21kLT5kb25lKGNtZCksIGV0Yy4gc28gdGhhdCB3ZSBjYW4gb3ZlcmxhcCBpbnRlcnJ1cHQKKyAgICAgKiBwcm9jZXNzaW5nIHdpdGggdGhpcyBjb2RlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLgorICAgICAqLworICAgIAorICAgIHZvbGF0aWxlIHN0cnVjdCBOQ1I1M2M3eDBfY21kICpmaW5pc2hlZF9xdWV1ZTsJCisJCQkJCQkKKyAgICAvKiBTaGFyZWQgdmFyaWFibGVzIGJldHdlZW4gU0NSSVBUIGFuZCBob3N0IGRyaXZlciAqLworICAgIHZvbGF0aWxlIHUzMiAqc2NoZWR1bGUKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsJCS8qIEFycmF5IG9mIEpVTVBzIHRvIGRzYV9iZWdpbgorCQkJCQkJICAgcm91dGluZXMgb2YgdmFyaW91cyBEU0FzLiAgCisJCQkJCQkgICBXaGVuIG5vdCBpbiB1c2UsIHJlcGxhY2UKKwkJCQkJCSAgIHdpdGgganVtcCB0byBuZXh0IHNsb3QgKi8KKworCisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBtc2dfYnVmWzE2XTsJCS8qIGJ1ZmZlciBmb3IgbWVzc2FnZXMKKwkJCQkJCSAgIG90aGVyIHRoYW4gdGhlIGNvbW1hbmQKKwkJCQkJCSAgIGNvbXBsZXRlIG1lc3NhZ2UgKi8KKworICAgIC8qIFBlci10YXJnZXQgZGVmYXVsdCBzeW5jaHJvbm91cyBhbmQgV0lERSBtZXNzYWdlcyAqLworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgc3luY2hyb25vdXNfd2FudFsxNl1bNV07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciB3aWRlX3dhbnRbMTZdWzRdOworCisgICAgLyogQml0IGZpZWxkZWQgc2V0IG9mIHRhcmdldHMgd2Ugd2FudCB0byBzcGVhayBzeW5jaHJvbm91c2x5IHdpdGggKi8gCisgICAgdm9sYXRpbGUgdTE2IGluaXRpYXRlX3NkdHI7CQorICAgIC8qIEJpdCBmaWVsZGVkIHNldCBvZiB0YXJnZXRzIHdlIHdhbnQgdG8gc3BlYWsgd2lkZSB3aXRoICovCisgICAgdm9sYXRpbGUgdTE2IGluaXRpYXRlX3dkdHI7CisgICAgLyogQml0IGZpZWxkZWQgbGlzdCBvZiB0YXJnZXRzIHdlJ3ZlIHRhbGtlZCB0by4gKi8KKyAgICB2b2xhdGlsZSB1MTYgdGFsa2VkX3RvOworCisgICAgLyogQXJyYXkgb2YgYml0LWZpZWxkZWQgbHVuIGxpc3RzIHRoYXQgd2UgbmVlZCB0byByZXF1ZXN0X3NlbnNlICovCisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciByZXF1ZXN0X3NlbnNlWzE2XTsKKworICAgIHUzMiBhZGRyX3JlY29ubmVjdF9kc2FfaGVhZAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwkJLyogUklTQ3kgc3R5bGUgY29uc3RhbnQsCisJCQkJCQkgICBhZGRyZXNzIG9mIGZvbGxvd2luZyAqLworICAgIHZvbGF0aWxlIHUzMiByZWNvbm5lY3RfZHNhX2hlYWQ7CQorICAgIC8qIERhdGEgaWRlbnRpZnlpbmcgbmV4dXMgd2UgYXJlIHRyeWluZyB0byBtYXRjaCBkdXJpbmcgcmVzZWxlY3Rpb24gKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlc2VsZWN0ZWRfaWRlbnRpZnk7IC8qIElERU5USUZZIG1lc3NhZ2UgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlc2VsZWN0ZWRfdGFnOwkvKiBzZWNvbmQgYnl0ZSBvZiBxdWV1ZSB0YWcgCisJCQkJCQkgICBtZXNzYWdlIG9yIDAgKi8KKworICAgIC8qIFRoZXNlIHdlcmUgc3RhdGljIHZhcmlhYmxlcyBiZWZvcmUgd2UgbW92ZWQgdGhlbSAqLworCisgICAgczMyIE5DUjUzYzd4eF96ZXJvCisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisgICAgczMyIE5DUjUzYzd4eF9zaW5rOworICAgIHUzMiBOT1BfaW5zbjsKKyAgICBjaGFyIE5DUjUzYzd4eF9tc2dfcmVqZWN0OworICAgIGNoYXIgTkNSNTNjN3h4X21zZ19hYm9ydDsKKyAgICBjaGFyIE5DUjUzYzd4eF9tc2dfbm9wOworCisgICAgLyoKKyAgICAgKiBGb2xsb3dpbmcgaXRlbSBpbnRyb2R1Y2VkIGJ5IFJHSCB0byBzdXBwb3J0IE5DUmM3MTAsIHdoaWNoIGlzCisgICAgICogVkVSWSBicmFpbi1kZWFkIHdoZW4gaXQgY29tZSB0byBtZW1vcnkgbW92ZXMKKyAgICAgKi8KKworCQkJICAvKiBEU0Egc2F2ZSBhcmVhIHVzZWQgb25seSBieSB0aGUgTkNSIGNoaXAgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNhdmVkMl9kc2EKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZW11bGF0ZWRfaW50Zmx5CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7CisKKyAgICB2b2xhdGlsZSBpbnQgZXZlbnRfc2l6ZSwgZXZlbnRfaW5kZXg7CisgICAgdm9sYXRpbGUgc3RydWN0IE5DUjUzYzd4MF9ldmVudCAqZXZlbnRzOworCisgICAgLyogSWYgd2UgbmVlZCB0byBnZW5lcmF0ZSBjb2RlIHRvIGtpbGwgb2ZmIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIAorICAgICAgIGNvbW1hbmQsIHRoaXMgaXMgd2hlcmUgd2UgZG8gaXQuIFNob3VsZCBoYXZlIGEgQk1JIGluc3RydWN0aW9uCisgICAgICAgdG8gc291cmNlIG9yIHNpbmsgdGhlIGN1cnJlbnQgZGF0YSwgZm9sbG93ZWQgYnkgYSBKVU1QCisgICAgICAgdG8gYWJvcnRfY29ubmVjdGVkICovCisKKyAgICB1MzIgKmFib3J0X3NjcmlwdDsKKworICAgIGludCBzY3JpcHRfY291bnQ7CQkJCS8qIFNpemUgb2Ygc2NyaXB0IGluIHdvcmRzICovCisgICAgdTMyIHNjcmlwdFswXTsJCQkJLyogUmVsb2NhdGVkIFNDU0kgc2NyaXB0ICovCisKK307CisKKyNkZWZpbmUgU0NTSV9JUlFfTk9ORQkyNTUKKyNkZWZpbmUgRE1BX05PTkUJMjU1CisjZGVmaW5lIElSUV9BVVRPCTI1NAorI2RlZmluZSBETUFfQVVUTwkyNTQKKworI2RlZmluZSBCT0FSRF9HRU5FUklDCTAKKworI2RlZmluZSBOQ1I1M2M3eDBfaW5zbl9zaXplKGluc24pCQkJCQlcCisgICAgKCgoaW5zbikgJiBEQ01EX1RZUEVfTUFTSykgPT0gRENNRF9UWVBFX01NSSA/IDMgOiAyKQorICAgIAorCisjZGVmaW5lIE5DUjUzYzd4MF9sb2NhbF9kZWNsYXJlKCkJCQkJCVwKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnk7CQkJXAorICAgIHVuc2lnbmVkIGludCBOQ1I1M2M3eDBfYWRkcmVzc19pbzsJCQkJCVwKKyAgICBpbnQgTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQKKworI2RlZmluZSBOQ1I1M2M3eDBfbG9jYWxfc2V0dXAoaG9zdCkJCQkJCVwKKyAgICBOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgPSAodm9pZCAqKSAoaG9zdCktPmJhc2U7CQkJXAorICAgIE5DUjUzYzd4MF9hZGRyZXNzX2lvID0gKHVuc2lnbmVkIGludCkgKGhvc3QpLT5pb19wb3J0OwkJXAorICAgIE5DUjUzYzd4MF9tZW1vcnlfbWFwcGVkID0gKChzdHJ1Y3QgTkNSNTNjN3gwX2hvc3RkYXRhICopIAkJXAorCWhvc3QtPmhvc3RkYXRhWzBdKS0+IG9wdGlvbnMgJiBPUFRJT05fTUVNT1JZX01BUFBFRCAKKworI2lmZGVmIEJJR19FTkRJQU4KKy8qIFRoZXNlIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBnaXZlbiB0aGF0IHdlIGFyZSBhbHdheXMgbWVtb3J5IG1hcHBlZCwKKyAqIGJ1dCB0aGV5IGRvbid0IGdpdmUgdGhlIHNhbWUgcHJvYmxlbXMgYXMgdGhlIHdyaXRlIG1hY3Jvcywgc28gbGVhdmUKKyAqIHRoZW0uICovCisjaWZkZWYgX19tYzY4MDAwX18KKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQ4KGFkZHJlc3MpIAkJCQkJXAorICAgICgodW5zaWduZWQgaW50KXJhd19pbmIoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMykpICkKKworI2RlZmluZSBOQ1I1M2M3eDBfcmVhZDE2KGFkZHJlc3MpIAkJCQkJXAorICAgICgodW5zaWduZWQgaW50KXJhd19pbncoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMikpKQorI2Vsc2UKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQ4KGFkZHJlc3MpIAkJCQkJXAorICAgIChOQ1I1M2M3eDBfbWVtb3J5X21hcHBlZCA/IAkJCQkJCVwKKwkodW5zaWduZWQgaW50KXJlYWRiKCh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKCh1MzIpKGFkZHJlc3MpXjMpKSA6CVwKKwlpbmIoTkNSNTNjN3gwX2FkZHJlc3NfaW8gKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIE5DUjUzYzd4MF9yZWFkMTYoYWRkcmVzcykgCQkJCQlcCisgICAgKE5DUjUzYzd4MF9tZW1vcnlfbWFwcGVkID8gCQkJCQkJXAorCSh1bnNpZ25lZCBpbnQpcmVhZHcoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMikpIDoJXAorCWludyhOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisjZW5kaWYgLyogbWM2ODAwMCAqLworI2Vsc2UKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQ4KGFkZHJlc3MpIAkJCQkJXAorICAgIChOQ1I1M2M3eDBfbWVtb3J5X21hcHBlZCA/IAkJCQkJCVwKKwkodW5zaWduZWQgaW50KXJlYWRiKCh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKHUzMikoYWRkcmVzcykpIDoJXAorCWluYihOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQxNihhZGRyZXNzKSAJCQkJCVwKKyAgICAoTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQgPyAJCQkJCQlcCisJKHVuc2lnbmVkIGludClyZWFkdygodTMyKU5DUjUzYzd4MF9hZGRyZXNzX21lbW9yeSArICh1MzIpKGFkZHJlc3MpKSA6CVwKKwlpbncoTkNSNTNjN3gwX2FkZHJlc3NfaW8gKyAoYWRkcmVzcykpKQorI2VuZGlmCisKKyNpZmRlZiBfX21jNjgwMDBfXworI2RlZmluZSBOQ1I1M2M3eDBfcmVhZDMyKGFkZHJlc3MpIAkJCQkJXAorICAgICgodW5zaWduZWQgaW50KSByYXdfaW5sKCh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKHUzMikoYWRkcmVzcykpKQorI2Vsc2UKKyNkZWZpbmUgTkNSNTNjN3gwX3JlYWQzMihhZGRyZXNzKSAJCQkJCVwKKyAgICAoTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQgPyAJCQkJCQlcCisJKHVuc2lnbmVkIGludCkgcmVhZGwoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAodTMyKShhZGRyZXNzKSkgOiAJXAorCWlubChOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisjZW5kaWYgLyogbWM2ODAwMCovCisKKyNpZmRlZiBCSUdfRU5ESUFOCisvKiBJZiB3ZSBhcmUgYmlnLWVuZGlhbiwgdGhlbiB3ZSBhcmUgbm90IEludGVsLCBzbyBwcm9iYWJseSBkb24ndCBoYXZlCisgKiBhbiBpL28gbWFwIGFzIHdlbGwgYXMgYSBtZW1vcnkgbWFwLiAgU28sIGxldCdzIGFzc3VtZSBtZW1vcnkgbWFwcGVkLgorICogQWxzbywgSSBhbSBoYXZpbmcgdGVycmlibGUgcHJvYmxlbXMgdHJ5aW5nIHRvIHBlcnN1YWRlIHRoZSBjb21waWxlcgorICogbm90IHRvIGxheSBkb3duIGNvZGUgd2hpY2ggZG9lcyBhIHJlYWQgYWZ0ZXIgd3JpdGUgZm9yIHRoZXNlIG1hY3Jvcy4KKyAqIElmIHlvdSByZW1vdmUgJ3ZvbGF0aWxlJyBmcm9tIHdyaXRlYigpIGFuZCBmcmllbmRzIGl0IGlzIG9rLi4uLgorICovCisKKyNkZWZpbmUgTkNSNTNjN3gwX3dyaXRlOChhZGRyZXNzLHZhbHVlKSAJCQkJXAorCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKQkJCQkJXAorCQkoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMykpID0gKHZhbHVlKQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTE2KGFkZHJlc3MsdmFsdWUpIAkJCQlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKQkJCQkJXAorCQkoKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAoKHUzMikoYWRkcmVzcyleMikpID0gKHZhbHVlKQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTMyKGFkZHJlc3MsdmFsdWUpIAkJCQlcCisJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopCQkJCQlcCisJCSgodTMyKU5DUjUzYzd4MF9hZGRyZXNzX21lbW9yeSArICgodTMyKShhZGRyZXNzKSkpID0gKHZhbHVlKQorCisjZWxzZQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTgoYWRkcmVzcyx2YWx1ZSkgCQkJCVwKKyAgICAoTkNSNTNjN3gwX21lbW9yeV9tYXBwZWQgPyAJCQkJCQlcCisgICAgICh7d3JpdGViKCh2YWx1ZSksICh1MzIpTkNSNTNjN3gwX2FkZHJlc3NfbWVtb3J5ICsgKHUzMikoYWRkcmVzcykpOyBtYigpO30pIDoJXAorCW91dGIoKHZhbHVlKSwgTkNSNTNjN3gwX2FkZHJlc3NfaW8gKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIE5DUjUzYzd4MF93cml0ZTE2KGFkZHJlc3MsdmFsdWUpIAkJCQlcCisgICAgKE5DUjUzYzd4MF9tZW1vcnlfbWFwcGVkID8gCQkJCQkJXAorICAgICAoe3dyaXRldygodmFsdWUpLCAodTMyKU5DUjUzYzd4MF9hZGRyZXNzX21lbW9yeSArICh1MzIpKGFkZHJlc3MpKTsgbWIoKTt9KSA6CVwKKwlvdXR3KCh2YWx1ZSksIE5DUjUzYzd4MF9hZGRyZXNzX2lvICsgKGFkZHJlc3MpKSkKKworI2RlZmluZSBOQ1I1M2M3eDBfd3JpdGUzMihhZGRyZXNzLHZhbHVlKSAJCQkJXAorICAgIChOQ1I1M2M3eDBfbWVtb3J5X21hcHBlZCA/IAkJCQkJCVwKKyAgICAgKHt3cml0ZWwoKHZhbHVlKSwgKHUzMilOQ1I1M2M3eDBfYWRkcmVzc19tZW1vcnkgKyAodTMyKShhZGRyZXNzKSk7IG1iKCk7fSkgOglcCisJb3V0bCgodmFsdWUpLCBOQ1I1M2M3eDBfYWRkcmVzc19pbyArIChhZGRyZXNzKSkpCisKKyNlbmRpZgorCisvKiBQYXRjaCBhcmJpdHJhcnkgMzIgYml0IHdvcmRzIGluIHRoZSBzY3JpcHQgKi8KKyNkZWZpbmUgcGF0Y2hfYWJzXzMyKHNjcmlwdCwgb2Zmc2V0LCBzeW1ib2wsIHZhbHVlKQkJCVwKKyAgICAJZm9yIChpID0gMDsgaSA8IChzaXplb2YgKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZiAJCVwKKyAgICAJICAgICh1MzIpKTsgKytpKSB7CQkJCQlcCisJICAgIChzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldIC0gKG9mZnNldCldICs9ICh2YWx1ZSk7CVwKKwkgICAgaWYgKGhvc3RkYXRhLT5vcHRpb25zICYgT1BUSU9OX0RFQlVHX0ZJWFVQKSAJCVwKKwkgICAgICBwcmludGsoInNjc2klZCA6ICVzIHJlZmVyZW5jZSAlZCBhdCAweCV4IGluICVzIGlzIG5vdyAweCV4XG4iLFwKKwkJaG9zdC0+aG9zdF9ubywgI3N5bWJvbCwgaSwgQV8jI3N5bWJvbCMjX3VzZWRbaV0gLSAJXAorCQkoaW50KShvZmZzZXQpLCAjc2NyaXB0LCAoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXSAtCVwKKwkJKG9mZnNldCldKTsJCQkJCQlcCisgICAgCX0KKworLyogUGF0Y2ggcmVhZC93cml0ZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGUgZmllbGQgKi8KKyNkZWZpbmUgcGF0Y2hfYWJzX3J3cmlfZGF0YShzY3JpcHQsIG9mZnNldCwgc3ltYm9sLCB2YWx1ZSkJCVwKKyAgICAJZm9yIChpID0gMDsgaSA8IChzaXplb2YgKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZiAJCVwKKyAgICAJICAgICh1MzIpKTsgKytpKQkJCQkJXAorICAgIAkgICAgKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV0gLSAob2Zmc2V0KV0gPQkJCVwKKwkgICAgCSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXSAtIChvZmZzZXQpXSAmIAkJXAorCSAgICAJfkRCQ19SV1JJX0lNTUVESUFURV9NQVNLKSB8IAkJCQlcCisgICAgCSAgICAJKCgodmFsdWUpIDw8IERCQ19SV1JJX0lNTUVESUFURV9TSElGVCkgJgkJXAorCQkgREJDX1JXUklfSU1NRURJQVRFX01BU0spCisKKy8qIFBhdGNoIHRyYW5zZmVyIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gZGF0YSBmaWVsZCAqLworI2RlZmluZSBwYXRjaF9hYnNfdGNpX2RhdGEoc2NyaXB0LCBvZmZzZXQsIHN5bWJvbCwgdmFsdWUpCSAgICAgICAgXAorICAgIAlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mIAkJXAorICAgIAkgICAgKHUzMikpOyArK2kpCQkJCQlcCisgICAgCSAgICAoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXSAtIChvZmZzZXQpXSA9CQkJXAorCSAgICAJKChzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldIC0gKG9mZnNldCldICYgCQlcCisJICAgIAl+REJDX1RDSV9EQVRBX01BU0spIHwgCQkJCQlcCisgICAgCSAgICAJKCgodmFsdWUpIDw8IERCQ19UQ0lfREFUQV9TSElGVCkgJgkJCVwKKwkJIERCQ19UQ0lfREFUQV9NQVNLKQorCisvKiBQYXRjaCBmaWVsZCBpbiBkc2Egc3RydWN0dXJlIChhc3NpZ25tZW50IHNob3VsZCBiZSArPT8pICovCisjZGVmaW5lIHBhdGNoX2RzYV8zMihkc2EsIHN5bWJvbCwgd29yZCwgdmFsdWUpCQkJCVwKKwl7CQkJCQkJCQlcCisJKGRzYSlbKGhvc3RkYXRhLT4jI3N5bWJvbCAtIGhvc3RkYXRhLT5kc2Ffc3RhcnQpIC8gc2l6ZW9mKHUzMikJXAorCSAgICArICh3b3JkKV0gPSAodmFsdWUpOwkJCQkJXAorCWlmIChob3N0ZGF0YS0+b3B0aW9ucyAmIE9QVElPTl9ERUJVR19EU0EpCQkJXAorCSAgICBwcmludGsoInNjc2kgOiBkc2EgJXMgc3ltYm9sICVzKCVkKSB3b3JkICVkIG5vdyAweCV4XG4iLAlcCisJCSNkc2EsICNzeW1ib2wsIGhvc3RkYXRhLT4jI3N5bWJvbCwgCQkJXAorCQkod29yZCksICh1MzIpICh2YWx1ZSkpOwkJCQkJXAorCX0KKworLyogUGFyYW5vaWQgcGVvcGxlIGNvdWxkIHVzZSBwYW5pYygpIGhlcmUuICovCisjZGVmaW5lIEZBVEFMKGhvc3QpIHNodXRkb3duKChob3N0KSk7CisKK2V4dGVybiBpbnQgbmNyNTNjN3h4X2luaXQoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50LCBpbnQgYm9hcmQsIGludCBjaGlwLAorCQkJICB1bnNpZ25lZCBsb25nIGJhc2UsIGludCBpb19wb3J0LCBpbnQgaXJxLCBpbnQgZG1hLAorCQkJICBsb25nIGxvbmcgb3B0aW9ucywgaW50IGNsb2NrKTsKKworI2VuZGlmIC8qIE5DUjUzYzcxMF9DICovCisjZW5kaWYgLyogTkNSNTNjNzEwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHguc2NyIGIvZHJpdmVycy9zY3NpLzUzYzd4eC5zY3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1Njk0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3eHguc2NyCkBAIC0wLDAgKzEsMTU5MSBAQAorI3VuZGVmIERFQlVHCisjdW5kZWYgRVZFTlRTCisjdW5kZWYgTk9fU0VMRUNUSU9OX1RJTUVPVVQKKyNkZWZpbmUgQklHX0VORElBTgorCis7IDUzYzcxMCBkcml2ZXIuICBNb2RpZmllZCBmcm9tIERyZXcgRWNraGFyZHRzIGRyaXZlcgorOyBmb3IgNTNjODEwIGJ5IFJpY2hhcmQgSGlyc3QgW3JpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51a10KKzsKKzsgSSBoYXZlIGxlZnQgdGhlIHNjcmlwdCBmb3IgdGhlIDUzYzh4eCBmYW1pbHkgaW4gaGVyZSwgYXMgaXQgaXMgbGlrZWx5Cis7IHRvIGJlIHVzZWZ1bCB0byBzZWUgd2hhdCBJIGNoYW5nZWQgd2hlbiBidWcgaHVudGluZy4KKworOyBOQ1IgNTNjODEwIGRyaXZlciwgbWFpbiBzY3JpcHQKKzsgU3BvbnNvcmVkIGJ5IAorOwlpWCBNdWx0aXVzZXIgTXVsdGl0YXNraW5nIE1hZ2F6aW5lCis7CWhtQGl4LmRlCis7Cis7IENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1IERyZXcgRWNraGFyZHQKKzsgICAgICBWaXNpb25hcnkgQ29tcHV0aW5nIAorOyAgICAgIChVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCis7ICAgICAgZHJld0BQb29oU3RpY2tzLk9SRworOyAgICAgICsxICgzMDMpIDc4Ni03OTc1Cis7Cis7IFRvbGVyQU5UIGFuZCBTQ1NJIFNDUklQVFMgYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBOQ1IgQ29ycG9yYXRpb24uCis7Cis7IFBSRS1BTFBIQQorOworOyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCis7Cis7IE5DUiA1M0M4MTAKKzsgUENJLVNDU0kgSS9PIFByb2Nlc3NvcgorOyBEYXRhIE1hbnVhbAorOworOyBOQ1IgNTNDNzEwIAorOyBTQ1NJIEkvTyBQcm9jZXNzb3IKKzsgUHJvZ3JhbW1lcnMgR3VpZGUKKzsKKzsgTkNSIE1pY3JvZWxlY3Ryb25pY3MKKzsgMTYzNSBBZXJvcGxhemEgRHJpdmUKKzsgQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKzsgMSsgKDcxOSkgNTc4LTM0MDAKKzsKKzsgVG9sbCBmcmVlIGxpdGVyYXR1cmUgbnVtYmVyCis7ICsxICg4MDApIDMzNC01NDU0Cis7Cis7IElNUE9SVEFOVCA6IFRoaXMgY29kZSBpcyBzZWxmIG1vZGlmeWluZyBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIG9mIAorOwl0aGUgTkNSNTNjNyw4eHggc2VyaWVzIGNoaXBzLiAgUGVyc29ucyBkZWJ1Z2dpbmcgdGhpcyBjb2RlIHdpdGgKKzsJdGhlIHJlbW90ZSBkZWJ1Z2dlciBzaG91bGQgdGFrZSB0aGlzIGludG8gYWNjb3VudCwgYW5kIE5PVCBzZXQKKzsJYnJlYWtwb2ludHMgaW4gbW9kaWZpZWQgaW5zdHJ1Y3Rpb25zLgorOworOyBEZXNpZ246Cis7IFRoZSBOQ1I1M2M3LDh4eCBmYW1pbHkgb2YgU0NTSSBjaGlwcyBhcmUgYnVzbWFzdGVycyB3aXRoIGFuIG9uYm9hcmQgCis7IG1pY3JvY29udHJvbGxlciB1c2luZyBhIHNpbXBsZSBpbnN0cnVjdGlvbiBzZXQuICAgCis7Cis7IFNvLCB0byBtaW5pbWl6ZSB0aGUgZWZmZWN0cyBvZiBpbnRlcnJ1cHQgbGF0ZW5jeSwgYW5kIHRvIG1heGltaXplIAorOyB0aHJvdWdocHV0LCB0aGlzIGRyaXZlciBvZmZsb2FkcyB0aGUgcHJhY3RpY2FsIG1heGltdW0gYW1vdW50IAorOyBvZiBwcm9jZXNzaW5nIHRvIHRoZSBTQ1NJIGNoaXAgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgYSBjb21tb24KKzsgc3RydWN0dXJlLgorOworOyBXaGVyZSB0cmFkZW9mZnMgd2VyZSBuZWVkZWQgYmV0d2VlbiBlZmZpY2llbmN5IG9uIHRoZSBvbGRlcgorOyBjaGlwcyBhbmQgdGhlIG5ld2VyIE5DUjUzYzgwMCBzZXJpZXMsIHRoZSBOQ1I1M2M4MDAgc2VyaWVzIAorOyB3YXMgY2hvc2VuLgorOworOyBXaGlsZSB0aGUgTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgbGFja2VkIHRoZSBmYWNpbGl0aWVzIHRvIGZ1bGx5Cis7IGF1dG9tYXRlIFNDU0kgdHJhbnNmZXJzIHdpdGhvdXQgaG9zdCBwcm9jZXNzb3IgaW50ZXJ2ZW50aW9uLCB0aGlzIAorOyBpc24ndCB0aGUgY2FzZSB3aXRoIHRoZSBOQ1I1M2M3MTAgYW5kIG5ld2VyIGNoaXBzIHdoaWNoIGFsbG93IAorOworOyAtIHJlYWRzIGFuZCB3cml0ZXMgdG8gdGhlIGludGVybmFsIHJlZ2lzdGVycyBmcm9tIHdpdGhpbiB0aGUgU0NTSQorOyAJc2NyaXB0cywgYWxsb3dpbmcgdGhlIFNDU0kgU0NSSVBUUyh0bSkgY29kZSB0byBzYXZlIHByb2Nlc3NvcgorOyAJc3RhdGUgc28gdGhhdCBtdWx0aXBsZSB0aHJlYWRzIG9mIGV4ZWN1dGlvbiBhcmUgcG9zc2libGUsIGFuZCBhbHNvCis7IAlwcm92aWRlIGFuIEFMVSBmb3IgbG9vcCBjb250cm9sLCBldGMuCis7IAorOyAtIHRhYmxlIGluZGlyZWN0IGFkZHJlc3NpbmcgZm9yIHNvbWUgaW5zdHJ1Y3Rpb25zLiBUaGlzIGFsbG93cyAKKzsJcG9pbnRlcnMgdG8gYmUgbG9jYXRlZCByZWxhdGl2ZSB0byB0aGUgRFNBICgoRGF0YSBTdHJ1Y3R1cmUKKzsJQWRkcmVzcykgcmVnaXN0ZXIuCis7Cis7IFRoZXNlIGZlYXR1cmVzIG1ha2UgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IGEgbWFpbGJveCBzdHlsZSBpbnRlcmZhY2UsCis7IHdoZXJlIHRoZSBzYW1lIHBpZWNlIG9mIGNvZGUgaXMgcnVuIHRvIGhhbmRsZSBJL08gZm9yIG11bHRpcGxlIHRocmVhZHMKKzsgYXQgb25jZSBtaW5pbWl6aW5nIG91ciBuZWVkIHRvIHJlbG9jYXRlIGNvZGUuICBTaW5jZSB0aGUgTkNSNTNjNzAwLworOyBOQ1I1M2M4MDAgc2VyaWVzIGhhdmUgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgZmVhdHVyZXMsIG1ha2luZyBhIAorOyBhIHN0YW5kYXJkIGluZ29pbmcvb3V0Z29pbmcgbWFpbGJveCBzeXN0ZW0sIGNvc3RseSwgSSd2ZSBtb2RpZmllZCBpdC4KKzsKKzsgLSBNYWlsYm94ZXMgYXJlIGEgbWl4dHVyZSBvZiBjb2RlIGFuZCBkYXRhLiAgVGhpcyBsZXRzIHVzIGdyZWF0bHkKKzsgCXNpbXBsaWZ5IHRoZSBOQ1I1M2M4MTAgY29kZSBhbmQgZG8gdGhpbmdzIHRoYXQgd291bGQgb3RoZXJ3aXNlCis7CW5vdCBiZSBwb3NzaWJsZS4KKzsKKzsgVGhlIHNhdmVkIGRhdGEgcG9pbnRlciBpcyBub3cgaW1wbGVtZW50ZWQgYXMgZm9sbG93cyA6Cis7Cis7IAlDb250cm9sIGZsb3cgaGFzIGJlZW4gYXJjaGl0ZWN0ZWQgc3VjaCB0aGF0IGlmIGNvbnRyb2wgcmVhY2hlcworOwltdW5nZV9zYXZlX2RhdGFfcG9pbnRlciwgb24gYSByZXN0b3JlIHBvaW50ZXJzIG1lc3NhZ2Ugb3IgCis7CXJlY29ubmVjdGlvbiwgYSBqdW1wIHRvIHRoZSBhZGRyZXNzIGZvcm1lcmx5IGluIHRoZSBURU1QIHJlZ2lzdGVyCis7CXdpbGwgYWxsb3cgdGhlIFNDU0kgY29tbWFuZCB0byByZXN1bWUgZXhlY3V0aW9uLgorOworCis7Cis7IE5vdGUgOiB0aGUgRFNBIHN0cnVjdHVyZXMgbXVzdCBiZSBhbGlnbmVkIG9uIDMyIGJpdCBib3VuZGFyaWVzLAorOyBzaW5jZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiBNT1ZFIE1FTU9SWSBpbnN0cnVjdGlvbnMgCis7IG11c3Qgc2hhcmUgdGhlIHNhbWUgYWxpZ25tZW50IGFuZCB0aGlzIGlzIHRoZSBhbGlnbm1lbnQgb2YgdGhlCis7IE5DUiByZWdpc3RlcnMuCis7CisKKzsgRm9yIHNvbWUgc3lzdGVtcyAoTVZNRTE2NiwgZm9yIGV4YW1wbGUpIGRtb2RlIGlzIGFsd2F5cyB0aGUgc2FtZSwgc28gZG9uJ3QKKzsgd2FzdGUgdGltZSB3cml0aW5nIGl0CisKKyNpZiAxCisjZGVmaW5lIERNT0RFX01FTU9SWV9UT19OQ1IKKyNkZWZpbmUgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2RlZmluZSBETU9ERV9OQ1JfVE9fTUVNT1JZCisjZWxzZQorI2RlZmluZSBETU9ERV9NRU1PUllfVE9fTkNSICAgIE1PVkUgZG1vZGVfbWVtb3J5X3RvX25jciBUTyBETU9ERQorI2RlZmluZSBETU9ERV9NRU1PUllfVE9fTUVNT1JZIE1PVkUgZG1vZGVfbWVtb3J5X3RvX21lbW9yeSBUTyBETU9ERQorI2RlZmluZSBETU9ERV9OQ1JfVE9fTUVNT1JZICAgIE1PVkUgZG1vZGVfbmNyX3RvX21lbW9yeSBUTyBETU9ERQorI2VuZGlmCisKK0FCU09MVVRFIGRzYV90ZW1wX2x1biA9IDAJCTsgUGF0Y2ggdG8gbHVuIGZvciBjdXJyZW50IGRzYQorQUJTT0xVVEUgZHNhX3RlbXBfbmV4dCA9IDAJCTsgUGF0Y2ggdG8gZHNhIG5leHQgZm9yIGN1cnJlbnQgZHNhCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX25leHQgPSAwCQk7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgZHNhIG5leHQgYWRkcmVzcyAKKwkJCQkJOyAJZm9yIGN1cnJlbnQgZHNhCitBQlNPTFVURSBkc2FfdGVtcF9zeW5jID0gMAkJOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci10YXJnZXQKKwkJCQkJOwlzeW5jIHJvdXRpbmUKK0FCU09MVVRFIGRzYV9zc2NmXzcxMCA9IDAJCTsgUGF0Y2ggdG8gYWRkcmVzcyBvZiBwZXItdGFyZ2V0CisJCQkJCTsJc3NjZiB2YWx1ZSAoNTNjNzEwKQorQUJTT0xVVEUgZHNhX3RlbXBfdGFyZ2V0ID0gMAkJOyBQYXRjaCB0byBpZCBmb3IgY3VycmVudCBkc2EKK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcG9pbnRlciA9IDA7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgcGVyLWNvbW1hbmQKKwkJCQkJOyAJc2F2ZWQgZGF0YSBwb2ludGVyCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX3Jlc2lkdWFsID0gMAk7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgcGVyLWNvbW1hbmQKKwkJCQkJOwljdXJyZW50IHJlc2lkdWFsIGNvZGUKK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwgPSAwOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci1jb21tYW5kCisJCQkJCTsgc2F2ZWQgcmVzaWR1YWwgY29kZQorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9uZXdfdmFsdWUgPSAwCTsgQWRkcmVzcyBvZiB2YWx1ZSBmb3IgSlVNUCBvcGVyYW5kCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX2FycmF5X3ZhbHVlID0gMCAJOyBBZGRyZXNzIHRvIGNvcHkgdG8KK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfZHNhX3ZhbHVlID0gMAk7IEFkZHJlc3Mgb2YgdGhpcyBEU0EgdmFsdWUKKworOworOyBPbmNlIGEgZGV2aWNlIGhhcyBpbml0aWF0ZWQgcmVzZWxlY3Rpb24sIHdlIG5lZWQgdG8gY29tcGFyZSBpdCAKKzsgYWdhaW5zdCB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGNvbW1hbmRzIHdoaWNoIGhhdmUgZGlzY29ubmVjdGVkCis7IGFuZCBhcmUgcGVuZGluZyByZXNlbGVjdGlvbi4gIFRoZXNlIGNvbW1hbmRzIGFyZSBtYWludGFpbmVkIGluIAorOyBhbiB1bm9yZGVyZWQgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIERTQSBzdHJ1Y3R1cmVzLCB0aHJvdWdoIHRoZQorOyBEU0EgcG9pbnRlcnMgYXQgdGhlaXIgJ2NlbnRlcnMnIGhlYWRlZCBieSB0aGUgcmVjb25uZWN0X2RzYV9oZWFkCis7IHBvaW50ZXIuCis7IAorOyBUbyBhdm9pZCBjb21wbGljYXRpb25zIGluIHJlbW92aW5nIGNvbW1hbmRzIGZyb20gdGhlIGxpc3QsCis7IEkgbWluaW1pemUgdGhlIGFtb3VudCBvZiBleHBlbnNpdmUgKGF0IGVpZ2h0IG9wZXJhdGlvbnMgcGVyCis7IGFkZGl0aW9uIEAgNTAwLTYwMG5zIGVhY2gpIHBvaW50ZXIgb3BlcmF0aW9ucyB3aGljaCBtdXN0Cis7IGJlIGRvbmUgaW4gdGhlIE5DUiBkcml2ZXIgYnkgcHJlY29tcHV0aW5nIHRoZW0gb24gdGhlIAorOyBob3N0IHByb2Nlc3NvciBkdXJpbmcgZHNhIHN0cnVjdHVyZSBnZW5lcmF0aW9uLgorOworOyBUaGUgZml4ZWQtdXAgcGVyIERTQSBjb2RlIGtub3dzIGhvdyB0byByZWNvZ25pemUgdGhlIG5leHVzCis7IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBTQ1NJIGNvbW1hbmQsIGFuZCBtb2RpZmllcworOyB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyBmb3IgdGhlIE1PVkUgTUVNT1JZIAorOyBpbnN0cnVjdGlvbiB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHJlc2VsZWN0ZWRfb2sgaXMgY2FsbGVkCis7IHRvIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBsaXN0LiAgU2ltaWxhcmx5LCBEU0EgaXMgCis7IGxvYWRlZCB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IERTQSBzdHJ1Y3R1cmUgYW5kCis7IHJlc2VsZWN0ZWRfY2hlY2tfbmV4dCBpcyBjYWxsZWQgaWYgYSBmYWlsdXJlIG9jY3Vycy4KKzsKKzsgUGVyaGFwcyBtb3JlIGNvbmNpc2VseSwgdGhlIG5ldCBlZmZlY3Qgb2YgdGhlIG1lc3MgaXMgCis7Cis7IGZvciAoZHNhID0gcmVjb25uZWN0X2RzYV9oZWFkLCBkZXN0ID0gJnJlY29ubmVjdF9kc2FfaGVhZCwgCis7ICAgICBzcmMgPSBOVUxMOyBkc2E7IGRlc3QgPSAmZHNhLT5uZXh0LCBkc2EgPSBkc2EtPm5leHQpIHsKKzsgCXNyYyA9ICZkc2EtPm5leHQ7Cis7IAlpZiAodGFyZ2V0X2lkID09IGRzYS0+aWQgJiYgdGFyZ2V0X2x1biA9PSBkc2EtPmx1bikgeworOyAJCSpkZXN0ID0gKnNyYzsKKzsgCQlicmVhazsKKzsgICAgICAgICB9CQorOyB9Cis7Cis7IGlmICghZHNhKQorOyAgICAgICAgICAgZXJyb3IgKGludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdCk7Cis7IGVsc2UgIAorOyAgICAgbG9uZ2ptcCAoZHNhLT5qdW1wX3Jlc3VtZSwgMCk7Cis7Cis7IAkKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCis7IERlZmluZSBEU0Egc3RydWN0dXJlIHVzZWQgZm9yIG1haWxib3hlcworRU5UUlkgZHNhX2NvZGVfdGVtcGxhdGUKK2RzYV9jb2RlX3RlbXBsYXRlOgorRU5UUlkgZHNhX2NvZGVfYmVnaW4KK2RzYV9jb2RlX2JlZ2luOgorOyBSR0g6IERvbid0IGNhcmUgYWJvdXQgVEVNUCBhbmQgRFNBIGhlcmUKKwlETU9ERV9NRU1PUllfVE9fTkNSCisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9kc2FfdmFsdWUsIGFkZHJfc2NyYXRjaAorCURNT0RFX01FTU9SWV9UT19NRU1PUlkKKyNpZiAoQ0hJUCA9PSA3MTApCisJTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBzYXZlZF9kc2EKKwk7IFdlIGFyZSBhYm91dCB0byBnbyBhbmQgc2VsZWN0IHRoZSBkZXZpY2UsIHNvIG11c3Qgc2V0IFNTQ0YgYml0cworCU1PVkUgTUVNT1JZIDQsIGRzYV9zc2NmXzcxMCwgYWRkcl9zY3JhdGNoCisjaWZkZWYgQklHX0VORElBTgorCU1PVkUgU0NSQVRDSDMgVE8gU0ZCUgorI2Vsc2UKKwlNT1ZFIFNDUkFUQ0gwIFRPIFNGQlIKKyNlbmRpZgorCU1PVkUgU0ZCUiBUTyBTQkNMCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2Vsc2UKKwlDQUxMIHNjcmF0Y2hfdG9fZHNhCisjZW5kaWYKKwlDQUxMIHNlbGVjdAorOyBIYW5kbGUgdGhlIHBoYXNlIG1pc21hdGNoIHdoaWNoIG1heSBoYXZlIHJlc3VsdGVkIGZyb20gdGhlIAorOyBNT1ZFIEZST00gZHNhX21zZ291dCBpZiB3ZSByZXR1cm5lZCBoZXJlLiAgVGhlIENMRUFSIEFUTiAKKzsgbWF5IG9yIG1heSBub3QgYmUgbmVjZXNzYXJ5LCBhbmQgd2Ugc2hvdWxkIHVwZGF0ZSBzY3JpcHRfYXNtLnBsCis7IHRvIGhhbmRsZSBtdWx0aXBsZSBwaWVjZXMuCisgICAgQ0xFQVIgQVROCisgICAgQ0xFQVIgQUNLCisKKzsgUmVwbGFjZSBzZWNvbmQgb3BlcmFuZCB3aXRoIGFkZHJlc3Mgb2YgSlVNUCBpbnN0cnVjdGlvbiBkZXN0IG9wZXJhbmQKKzsgaW4gc2NoZWR1bGUgdGFibGUgZm9yIHRoaXMgRFNBLiAgQmVjb21lcyBkc2FfanVtcF9kZXN0IGluIDUzYzcsOHh4LmMuCitFTlRSWSBkc2FfY29kZV9maXhfanVtcAorZHNhX2NvZGVfZml4X2p1bXA6CisJTU9WRSBNRU1PUlkgNCwgTk9QX2luc24sIDAKKwlKVU1QIHNlbGVjdF9kb25lCisKKzsgd3JvbmdfZHNhIGxvYWRzIHRoZSBEU0EgcmVnaXN0ZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGRzYV9uZXh0Cis7IGZpZWxkLgorOword3JvbmdfZHNhOgorI2lmIChDSElQID09IDcxMCkKKzsgICAgICAgICAgICAgICAgTk9URSBEU0EgaXMgY29ycnVwdCB3aGVuIHdlIGFycml2ZSBoZXJlIQorI2VuZGlmCis7CQlQYXRjaCB0aGUgTU9WRSBNRU1PUlkgSU5TVFJVQ1RJT04gc3VjaCB0aGF0IAorOwkJdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIE9MRCAKKzsJCW5leHQgcG9pbnRlci4KKzsKKwlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX25leHQsIHJlc2VsZWN0ZWRfb2tfcGF0Y2ggKyA4CisJRE1PREVfTUVNT1JZX1RPX05DUgorOworOyAJTW92ZSB0aGUgX2NvbnRlbnRzXyBvZiB0aGUgbmV4dCBwb2ludGVyIGludG8gdGhlIERTQSByZWdpc3RlciBhcyAKKzsJdGhlIG5leHQgSV9UX0wgb3IgSV9UX0xfUSB0dXBwbGUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZXN0YWJsaXNoZWQKKzsJbmV4dXMuCis7CisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfbmV4dCwgYWRkcl9zY3JhdGNoCisJRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmIChDSElQID09IDcxMCkKKwlNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHNhdmVkX2RzYQorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNlbHNlCisJQ0FMTCBzY3JhdGNoX3RvX2RzYQorI2VuZGlmCisJSlVNUCByZXNlbGVjdGVkX2NoZWNrX25leHQKKworQUJTT0xVVEUgZHNhX3NhdmVfZGF0YV9wb2ludGVyID0gMAorRU5UUlkgZHNhX2NvZGVfc2F2ZV9kYXRhX3BvaW50ZXIKK2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyOgorI2lmIChDSElQID09IDcxMCkKKwk7IFdoZW4gd2UgZ2V0IGhlcmUsIFRFTVAgaGFzIGJlZW4gc2F2ZWQgaW4ganVtcF90ZW1wKzQsIERTQSBpcyBjb3JydXB0CisJOyBXZSBNVVNUIHJldHVybiB3aXRoIERTQSBjb3JyZWN0CisgICAgCU1PVkUgTUVNT1JZIDQsIGp1bXBfdGVtcCs0LCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIKKzsgSEFSRCBDT0RFRCA6IDI0IGJ5dGVzIG5lZWRzIHRvIGFncmVlIHdpdGggNTNjNyw4eHguaAorICAgIAlNT1ZFIE1FTU9SWSAyNCwgZHNhX3RlbXBfYWRkcl9yZXNpZHVhbCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbAorICAgICAgICBDTEVBUiBBQ0sKKyNpZmRlZiBERUJVRworICAgICAgICBJTlQgaW50X2RlYnVnX3NhdmVkCisjZW5kaWYKKwlNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisJSlVNUCBqdW1wX3RlbXAKKyNlbHNlCisgICAgCURNT0RFX05DUl9UT19NRU1PUlkKKyAgICAJTU9WRSBNRU1PUlkgNCwgYWRkcl90ZW1wLCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIKKyAgICAJRE1PREVfTUVNT1JZX1RPX01FTU9SWQorOyBIQVJEIENPREVEIDogMjQgYnl0ZXMgbmVlZHMgdG8gYWdyZWUgd2l0aCA1M2M3LDh4eC5oCisgICAgCU1PVkUgTUVNT1JZIDI0LCBkc2FfdGVtcF9hZGRyX3Jlc2lkdWFsLCBkc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsCisgICAgICAgIENMRUFSIEFDSworI2lmZGVmIERFQlVHCisgICAgICAgIElOVCBpbnRfZGVidWdfc2F2ZWQKKyNlbmRpZgorICAgIAlSRVRVUk4KKyNlbmRpZgorQUJTT0xVVEUgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgPSAwCitFTlRSWSBkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzCitkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzOgorI2lmIChDSElQID09IDcxMCkKKwk7IFRFTVAgYW5kIERTQSBhcmUgY29ycnVwdCB3aGVuIHdlIGdldCBoZXJlLCBidXQgd2hvIGNhcmVzIQorICAgIAlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIsIGp1bXBfdGVtcCArIDQKKzsgSEFSRCBDT0RFRCA6IDI0IGJ5dGVzIG5lZWRzIHRvIGFncmVlIHdpdGggNTNjNyw4eHguaAorICAgIAlNT1ZFIE1FTU9SWSAyNCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbCwgZHNhX3RlbXBfYWRkcl9yZXNpZHVhbAorICAgICAgICBDTEVBUiBBQ0sKKwk7IFJlc3RvcmUgRFNBLCBub3RlIHdlIGRvbid0IGNhcmUgYWJvdXQgVEVNUAorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNpZmRlZiBERUJVRworICAgICAgICBJTlQgaW50X2RlYnVnX3Jlc3RvcmVkCisjZW5kaWYKKwlKVU1QIGp1bXBfdGVtcAorI2Vsc2UKKyAgICAJRE1PREVfTUVNT1JZX1RPX05DUgorICAgIAlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIsIGFkZHJfdGVtcAorICAgIAlETU9ERV9NRU1PUllfVE9fTUVNT1JZCis7IEhBUkQgQ09ERUQgOiAyNCBieXRlcyBuZWVkcyB0byBhZ3JlZSB3aXRoIDUzYzcsOHh4LmgKKyAgICAJTU9WRSBNRU1PUlkgMjQsIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwsIGRzYV90ZW1wX2FkZHJfcmVzaWR1YWwKKyAgICAgICAgQ0xFQVIgQUNLCisjaWZkZWYgREVCVUcKKyAgICAgICAgSU5UIGludF9kZWJ1Z19yZXN0b3JlZAorI2VuZGlmCisgICAgCVJFVFVSTgorI2VuZGlmCisKK0FCU09MVVRFIGRzYV9jaGVja19yZXNlbGVjdCA9IDAKKzsgZHNhX2NoZWNrX3Jlc2VsZWN0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgdGFyZ2V0IGFuZAorOyBsdW4gbWF0Y2ggdGhlIGN1cnJlbnQgRFNBCitFTlRSWSBkc2FfY29kZV9jaGVja19yZXNlbGVjdAorZHNhX2NvZGVfY2hlY2tfcmVzZWxlY3Q6CisjaWYgKENISVAgPT0gNzEwKQorCS8qIEFycml2ZXMgaGVyZSB3aXRoIERTQSBjb3JyZWN0ICovCisJLyogQXNzdW1lcyB3ZSBhcmUgYWx3YXlzIElEIDcgKi8KKwlNT1ZFIExDUkMgVE8gU0ZCUgkJOyBMQ1JDIGhhcyBvdXIgSUQgYW5kIGhpcyBJRCBiaXRzIHNldAorCUpVTVAgUkVMICh3cm9uZ19kc2EpLCBJRiBOT1QgZHNhX3RlbXBfdGFyZ2V0LCBBTkQgTUFTSyAweDgwCisjZWxzZQorCU1PVkUgU1NJRCBUTyBTRkJSCQk7IFNTSUQgY29udGFpbnMgMyBiaXQgdGFyZ2V0IElECis7IEZJWE1FIDogd2UgbmVlZCB0byBhY2NvbW1vZGF0ZSBiaXQgZmllbGRlZCBhbmQgYmluYXJ5IGhlcmUgZm9yICc3eHgvJzh4eCBjaGlwcworCUpVTVAgUkVMICh3cm9uZ19kc2EpLCBJRiBOT1QgZHNhX3RlbXBfdGFyZ2V0LCBBTkQgTUFTSyAweGY4CisjZW5kaWYKKzsKKzsgSGFjayAtIG1vdmUgdG8gc2NyYXRjaCBmaXJzdCwgc2luY2UgU0ZCUiBpcyBub3Qgd3JpdGVhYmxlCis7IAl2aWEgdGhlIENQVSBhbmQgaGVuY2UgYSBNT1ZFIE1FTU9SWSBpbnN0cnVjdGlvbi4KKzsKKwlETU9ERV9NRU1PUllfVE9fTkNSCisJTU9WRSBNRU1PUlkgMSwgcmVzZWxlY3RlZF9pZGVudGlmeSwgYWRkcl9zY3JhdGNoCisJRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmZGVmIEJJR19FTkRJQU4KKwk7IEJJRyBFTkRJQU4gT04gTVZNRTE2eAorCU1PVkUgU0NSQVRDSDMgVE8gU0ZCUgorI2Vsc2UKKwlNT1ZFIFNDUkFUQ0gwIFRPIFNGQlIKKyNlbmRpZgorOyBGSVhNRSA6IHdlIG5lZWQgdG8gYWNjb21tb2RhdGUgYml0IGZpZWxkZWQgYW5kIGJpbmFyeSBoZXJlIGZvciAnN3h4Lyc4eHggY2hpcHMKKzsgQXJlIHlvdSBzdXJlIGFib3V0IHRoYXQ/ICByaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWsKKwlKVU1QIFJFTCAod3JvbmdfZHNhKSwgSUYgTk9UIGRzYV90ZW1wX2x1biwgQU5EIE1BU0sgMHhmOAorOwkJUGF0Y2ggdGhlIE1PVkUgTUVNT1JZIElOU1RSVUNUSU9OIHN1Y2ggdGhhdAorOwkJdGhlIHNvdXJjZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoaXMgZHNhJ3MKKzsJCW5leHQgcG9pbnRlci4KKwlNT1ZFIE1FTU9SWSA0LCBkc2FfdGVtcF9hZGRyX25leHQsIHJlc2VsZWN0ZWRfb2tfcGF0Y2ggKyA0CisJQ0FMTCByZXNlbGVjdGVkX29rCisjaWYgKENISVAgPT0gNzEwKQorOwlSZXN0b3JlIERTQSBmb2xsb3dpbmcgbWVtb3J5IG1vdmVzIGluIHJlc2VsZWN0ZWRfb2sKKzsJZHNhX3RlbXBfc3luYyBkb2Vzbid0IHJlYWxseSBjYXJlIGFib3V0IERTQSwgYnV0IGl0IGhhcyBhbgorOwlvcHRpb25hbCBkZWJ1ZyBJTlQgc28gYSB2YWxpZCBEU0EgaXMgYSBnb29kIGlkZWEuCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCisJQ0FMTCBkc2FfdGVtcF9zeW5jCQorOyBSZWxlYXNlIEFDSyBvbiB0aGUgSURFTlRJRlkgbWVzc2FnZSBfYWZ0ZXJfIHdlJ3ZlIHNldCB0aGUgc3luY2hyb25vdXMgCis7IHRyYW5zZmVyIHBhcmFtZXRlcnMhIAorCUNMRUFSIEFDSworOyBJbXBsaWNpdGx5IHJlc3RvcmUgcG9pbnRlcnMgb24gcmVzZWxlY3Rpb24sIHNvIGEgUkVUVVJOCis7IHdpbGwgdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIHRoZSByaWdodCBzcG90LgorICAgIAlDQUxMIFJFTCAoZHNhX2NvZGVfcmVzdG9yZV9wb2ludGVycykKKyAgICAJUkVUVVJOCitFTlRSWSBkc2FfemVybworZHNhX3plcm86CitFTlRSWSBkc2FfY29kZV90ZW1wbGF0ZV9lbmQKK2RzYV9jb2RlX3RlbXBsYXRlX2VuZDoKKworOyBQZXJmb3JtIHNhbml0eSBjaGVjayBmb3IgZHNhX2ZpZWxkc19zdGFydCA9PSBkc2FfY29kZV90ZW1wbGF0ZV9lbmQgLSAKKzsgZHNhX3plcm8sIHB1a2UuCisKK0FCU09MVVRFIGRzYV9maWVsZHNfc3RhcnQgPSAgMAk7IFNhbml0eSBtYXJrZXIKKwkJCQk7IAlwYWQgNDggYnl0ZXMgKGZpeCB0aGlzIFJTTikKK0FCU09MVVRFIGRzYV9uZXh0ID0gNDgJCTsgbGVuIDQgTmV4dCBEU0EKKyAJCQkJOyBkZWwgNCBQcmV2aW91cyBEU0EgYWRkcmVzcworQUJTT0xVVEUgZHNhX2NtbmQgPSA1NgkJOyBsZW4gNCBTY3NpX0NtbmQgKiBmb3IgdGhpcyB0aHJlYWQuCitBQlNPTFVURSBkc2Ffc2VsZWN0ID0gNjAJOyBsZW4gNCBEZXZpY2UgSUQsIFBlcmlvZCwgT2Zmc2V0IGZvciAKKwkJCSAJOwl0YWJsZSBpbmRpcmVjdCBzZWxlY3QKK0FCU09MVVRFIGRzYV9tc2dvdXQgPSA2NAk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IG1vdmUgcGFyYW1ldGVyIGZvciAKKwkJCQk7ICAgICAgIHNlbGVjdCBtZXNzYWdlCitBQlNPTFVURSBkc2FfY21kb3V0ID0gNzIJOyBsZW4gOCB0YWJsZSBpbmRpcmVjdCBtb3ZlIHBhcmFtZXRlciBmb3IgCisJCQkJOwljb21tYW5kCitBQlNPTFVURSBkc2FfZGF0YW91dCA9IDgwCTsgbGVuIDQgY29kZSBwb2ludGVyIGZvciBkYXRhb3V0CitBQlNPTFVURSBkc2FfZGF0YWluID0gODQJOyBsZW4gNCBjb2RlIHBvaW50ZXIgZm9yIGRhdGFpbgorQUJTT0xVVEUgZHNhX21zZ2luID0gODgJCTsgbGVuIDggdGFibGUgaW5kaXJlY3QgbW92ZSBmb3IgbXNnaW4KK0FCU09MVVRFIGRzYV9zdGF0dXMgPSA5NiAJOyBsZW4gOCB0YWJsZSBpbmRpcmVjdCBtb3ZlIGZvciBzdGF0dXMgYnl0ZQorQUJTT0xVVEUgZHNhX21zZ291dF9vdGhlciA9IDEwNAk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IGZvciBub3JtYWwgbWVzc2FnZSBvdXQKKwkJCQk7IChTeW5jaHJvbm91cyB0cmFuc2ZlciBuZWdvdGlhdGlvbiwgZXRjKS4KK0FCU09MVVRFIGRzYV9lbmQgPSAxMTIKKworQUJTT0xVVEUgc2NoZWR1bGUgPSAwIAkJOyBBcnJheSBvZiBKVU1QIGRzYV9iZWdpbiBvciBKVU1QIChuZXh0KSwKKwkJCQk7IHRlcm1pbmF0ZWQgYnkgYSBjYWxsIHRvIEpVTVAgd2FpdF9yZXNlbGVjdAorCis7IExpbmtlZCBsaXN0cyBvZiBEU0Egc3RydWN0dXJlcworQUJTT0xVVEUgcmVjb25uZWN0X2RzYV9oZWFkID0gMAk7IExpbmsgbGlzdCBvZiBEU0FzIHdoaWNoIGNhbiByZWNvbm5lY3QKK0FCU09MVVRFIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkID0gMCA7IEFkZHJlc3Mgb2YgdmFyaWFibGUgY29udGFpbmluZworCQkJCTsgYWRkcmVzcyBvZiByZWNvbm5lY3RfZHNhX2hlYWQKKworOyBUaGVzZSBzZWxlY3QgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb2YgYSBNT1ZFIE1FTU9SWSBpbnN0cnVjdGlvbgorQUJTT0xVVEUgZG1vZGVfbWVtb3J5X3RvX21lbW9yeSA9IDB4MAorQUJTT0xVVEUgZG1vZGVfbWVtb3J5X3RvX25jciA9IDB4MAorQUJTT0xVVEUgZG1vZGVfbmNyX3RvX21lbW9yeSA9IDB4MAorCitBQlNPTFVURSBhZGRyX3NjcmF0Y2ggPSAweDAKK0FCU09MVVRFIGFkZHJfdGVtcCA9IDB4MAorI2lmIChDSElQID09IDcxMCkKK0FCU09MVVRFIHNhdmVkX2RzYSA9IDB4MAorQUJTT0xVVEUgZW11bGZseSA9IDB4MAorQUJTT0xVVEUgYWRkcl9kc2EgPSAweDAKKyNlbmRpZgorI2VuZGlmIC8qIENISVAgIT0gNzAwICYmIENISVAgIT0gNzAwNjYgKi8KKworOyBJbnRlcnJ1cHRzIC0gCis7IE1TQiBpbmRpY2F0ZXMgdHlwZQorOyAwCWhhbmRsZSBlcnJvciBjb25kaXRpb24KKzsgMSAJaGFuZGxlIG1lc3NhZ2UgCis7IDIgCWhhbmRsZSBub3JtYWwgY29uZGl0aW9uCis7IDMJZGVidWdnaW5nIGludGVycnVwdAorOyA0IAl0ZXN0aW5nIGludGVycnVwdCAKKzsgTmV4dCBieXRlIGluZGljYXRlcyBzcGVjaWZpYyBlcnJvcgorCis7IFhYWCBub3QgeWV0IGltcGxlbWVudGVkLCBJJ20gbm90IHN1cmUgaWYgSSB3YW50IHRvIC0gCis7IE5leHQgYnl0ZSBpbmRpY2F0ZXMgdGhlIHJvdXRpbmUgdGhlIGVycm9yIG9jY3VycmVkIGluCis7IFRoZSBMU0IgaW5kaWNhdGVzIHRoZSBzcGVjaWZpYyBwbGFjZSB0aGUgZXJyb3Igb2NjdXJyZWQKKyAKK0FCU09MVVRFIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSA9IDB4MDAwMDAwMDAJOyBVbmV4cGVjdGVkIHBoYXNlIGVuY291bnRlcmVkCitBQlNPTFVURSBpbnRfZXJyX3NlbGVjdGVkID0gMHgwMDAxMDAwMAkJOyBTRUxFQ1RFRCAobmVlIFJFU0VMRUNURUQpCitBQlNPTFVURSBpbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QgPSAweDAwMDIwMDAwIAorQUJTT0xVVEUgaW50X2Vycl9jaGVja19jb25kaXRpb24gPSAweDAwMDMwMDAwCQorQUJTT0xVVEUgaW50X2Vycl9ub19waGFzZSA9IDB4MDAwNDAwMDAKK0FCU09MVVRFIGludF9tc2dfd2R0ciA9IDB4MDEwMDAwMDAJCTsgV0RUUiBtZXNzYWdlIHJlY2VpdmVkCitBQlNPTFVURSBpbnRfbXNnX3NkdHIgPSAweDAxMDEwMDAwCQk7IFNEVFIgcmVjZWl2ZWQKK0FCU09MVVRFIGludF9tc2dfMSA9IDB4MDEwMjAwMDAJCQk7IHNpbmdsZSBieXRlIHNwZWNpYWwgbWVzc2FnZQorCQkJCQkJOyByZWNlaXZlZAorCitBQlNPTFVURSBpbnRfbm9ybV9zZWxlY3RfY29tcGxldGUgPSAweDAyMDAwMDAwCTsgU2VsZWN0IGNvbXBsZXRlLCByZXByb2dyYW0KKwkJCQkJCTsgcmVnaXN0ZXJzLgorQUJTT0xVVEUgaW50X25vcm1fcmVzZWxlY3RfY29tcGxldGUgPSAweDAyMDEwMDAwCTsgTmV4dXMgZXN0YWJsaXNoZWQKK0FCU09MVVRFIGludF9ub3JtX2NvbW1hbmRfY29tcGxldGUgPSAweDAyMDIwMDAwIDsgQ29tbWFuZCBjb21wbGV0ZQorQUJTT0xVVEUgaW50X25vcm1fZGlzY29ubmVjdGVkID0gMHgwMjAzMDAwMAk7IERpc2Nvbm5lY3RlZCAKK0FCU09MVVRFIGludF9ub3JtX2Fib3J0ZWQgPTB4MDIwNDAwMDAJCTsgQWJvcnRlZCAqZHNhCitBQlNPTFVURSBpbnRfbm9ybV9yZXNldCA9IDB4MDIwNTAwMDAJCTsgR2VuZXJhdGVkIEJVUyByZXNldC4KK0FCU09MVVRFIGludF9ub3JtX2VtdWxhdGVpbnRmbHkgPSAweDAyMDYwMDAwCTsgNTNDNzEwIEVtdWxhdGVkIGludGZseQorQUJTT0xVVEUgaW50X2RlYnVnX2JyZWFrID0gMHgwMzAwMDAwMAkJOyBCcmVhayBwb2ludAorI2lmZGVmIERFQlVHCitBQlNPTFVURSBpbnRfZGVidWdfc2NoZWR1bGVkID0gMHgwMzAxMDAwMAk7IG5ldyBJL08gc2NoZWR1bGVkIAorQUJTT0xVVEUgaW50X2RlYnVnX2lkbGUgPSAweDAzMDIwMDAwCQk7IHNjaGVkdWxlciBpcyBpZGxlCitBQlNPTFVURSBpbnRfZGVidWdfZHNhX2xvYWRlZCA9IDB4MDMwMzAwMDAJOyBkc2EgcmVsb2FkZWQKK0FCU09MVVRFIGludF9kZWJ1Z19yZXNlbGVjdGVkID0gMHgwMzA0MDAwMAk7IE5DUiByZXNlbGVjdGVkCitBQlNPTFVURSBpbnRfZGVidWdfaGVhZCA9IDB4MDMwNTAwMDAJCTsgaXNzdWUgaGVhZCBvdmVyd3JpdHRlbgorQUJTT0xVVEUgaW50X2RlYnVnX2Rpc2Nvbm5lY3RlZCA9IDB4MDMwNjAwMDAJOyBkaXNjb25uZWN0ZWQKK0FCU09MVVRFIGludF9kZWJ1Z19kaXNjb25uZWN0X21zZyA9IDB4MDMwNzAwMDAJOyBnb3QgbWVzc2FnZSB0byBkaXNjb25uZWN0CitBQlNPTFVURSBpbnRfZGVidWdfZHNhX3NjaGVkdWxlID0gMHgwMzA4MDAwMAk7IGluIGRzYV9zY2hlZHVsZQorQUJTT0xVVEUgaW50X2RlYnVnX3Jlc2VsZWN0X2NoZWNrID0gMHgwMzA5MDAwMCAgOyBDaGVjayBmb3IgcmVzZWxlY3Rpb24gb2YgRFNBCitBQlNPTFVURSBpbnRfZGVidWdfcmVzZWxlY3RlZF9vayA9IDB4MDMwYTAwMDAgCTsgUmVzZWxlY3Rpb24gYWNjZXB0ZWQKKyNlbmRpZgorQUJTT0xVVEUgaW50X2RlYnVnX3BhbmljID0gMHgwMzBiMDAwMAkJOyBQYW5pYyBkcml2ZXIKKyNpZmRlZiBERUJVRworQUJTT0xVVEUgaW50X2RlYnVnX3NhdmVkID0gMHgwMzBjMDAwMCAJCTsgc2F2ZS9yZXN0b3JlIHBvaW50ZXJzCitBQlNPTFVURSBpbnRfZGVidWdfcmVzdG9yZWQgPSAweDAzMGQwMDAwCitBQlNPTFVURSBpbnRfZGVidWdfc3luYyA9IDB4MDMwZTAwMDAJCTsgU2FuaXR5IGNoZWNrIHN5bmNocm9ub3VzIAorCQkJCQkJOyBwYXJhbWV0ZXJzLiAKK0FCU09MVVRFIGludF9kZWJ1Z19kYXRhaW4gPSAweDAzMGYwMDAwCQk7IGdvaW5nIGludG8gZGF0YSBpbiBwaGFzZSAKKwkJCQkJCTsgbm93LgorQUJTT0xVVEUgaW50X2RlYnVnX2NoZWNrX2RzYSA9IDB4MDMxMDAwMDAJOyBTYW5pdHkgY2hlY2sgRFNBIGFnYWluc3QKKwkJCQkJCTsgU0RJRC4KKyNlbmRpZgorCitBQlNPTFVURSBpbnRfdGVzdF8xID0gMHgwNDAwMDAwMAkJOyBUZXN0IDEgY29tcGxldGUKK0FCU09MVVRFIGludF90ZXN0XzIgPSAweDA0MDEwMDAwCQk7IFRlc3QgMiBjb21wbGV0ZQorQUJTT0xVVEUgaW50X3Rlc3RfMyA9IDB4MDQwMjAwMDAJCTsgVGVzdCAzIGNvbXBsZXRlCisKKworOyBUaGVzZSBzaG91bGQgc3RhcnQgd2l0aCAweDA1MDAwMDAwLCB3aXRoIGxvdyBiaXRzIGluY3JlbWVudGluZyBmb3IgCis7IGVhY2ggb25lLgorCisjaWZkZWYgRVZFTlRTCitBQlNPTFVURSBpbnRfRVZFTlRfU0VMRUNUID0gMAorQUJTT0xVVEUgaW50X0VWRU5UX0RJU0NPTk5FQ1QgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfUkVTRUxFQ1QgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfQ09NUExFVEUgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfSURMRSA9IDAKK0FCU09MVVRFIGludF9FVkVOVF9TRUxFQ1RfRkFJTEVEID0gMAorQUJTT0xVVEUgaW50X0VWRU5UX0JFRk9SRV9TRUxFQ1QgPSAwCitBQlNPTFVURSBpbnRfRVZFTlRfUkVTRUxFQ1RfRkFJTEVEID0gMAorI2VuZGlmCisJCQkJCQkKK0FCU09MVVRFIE5DUjUzYzd4eF9tc2dfYWJvcnQgPSAwCTsgUG9pbnRlciB0byBhYm9ydCBtZXNzYWdlCitBQlNPTFVURSBOQ1I1M2M3eHhfbXNnX3JlamVjdCA9IDAgICAgICAgOyBQb2ludGVyIHRvIHJlamVjdCBtZXNzYWdlCitBQlNPTFVURSBOQ1I1M2M3eHhfemVybwk9IDAJCTsgbG9uZyB3aXRoIHplcm8gaW4gaXQsIHVzZSBmb3Igc291cmNlCitBQlNPTFVURSBOQ1I1M2M3eHhfc2luayA9IDAJCTsgbG9uZyB0byBkdW1wIHdvcnRobGVzcyBkYXRhIGluCitBQlNPTFVURSBOT1BfaW5zbiA9IDAJCQk7IE5PUCBpbnN0cnVjdGlvbgorCis7IFBvaW50ZXIgdG8gbWVzc2FnZSwgcG90ZW50aWFsbHkgbXVsdGktYnl0ZQorQUJTT0xVVEUgbXNnX2J1ZiA9IDAKKworOyBQb2ludGVyIHRvIGhvbGRpbmcgYXJlYSBmb3IgcmVzZWxlY3Rpb24gaW5mb3JtYXRpb24KK0FCU09MVVRFIHJlc2VsZWN0ZWRfaWRlbnRpZnkgPSAwCitBQlNPTFVURSByZXNlbGVjdGVkX3RhZyA9IDAKKworOyBSZXF1ZXN0IHNlbnNlIGNvbW1hbmQgcG9pbnRlciwgaXQncyBhIDYgYnl0ZSBjb21tYW5kLCBzaG91bGQKKzsgYmUgY29uc3RhbnQgZm9yIGFsbCBjb21tYW5kcyBzaW5jZSB3ZSBhbHdheXMgd2FudCAxNiBieXRlcyBvZiAKKzsgc2Vuc2UgYW5kIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueSBmaWVsZHMgYXMgd2UgZGlkIHVuZGVyIAorOyBTQ1NJLUkgd2hlbiB3ZSBhY3R1YWxseSBjYXJlZCBhYm91dCB0aGUgTFVOIGZpZWxkLgorO0VYVEVSTkFMIE5DUjUzYzd4eF9zZW5zZQkJOyBSZXF1ZXN0IHNlbnNlIGNvbW1hbmQKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCis7IGRzYV9zY2hlZHVsZSAgCis7IFBVUlBPU0UgOiBhZnRlciBhIERJU0NPTk5FQ1QgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZCwgYW5kIHBvaW50ZXJzCis7CXNhdmVkLCBpbnNlcnQgdGhlIGN1cnJlbnQgRFNBIHN0cnVjdHVyZSBhdCB0aGUgaGVhZCBvZiB0aGUgCis7IAlkaXNjb25uZWN0ZWQgcXVldWUgYW5kIGZhbGwgdGhyb3VnaCB0byB0aGUgc2NoZWR1bGVyLgorOworOyBDQUxMUyA6IE9LCis7Cis7IElOUFVUUyA6IGRzYSAtIGN1cnJlbnQgRFNBIHN0cnVjdHVyZSwgcmVjb25uZWN0X2RzYV9oZWFkIC0gbGlzdAorOwlvZiBkaXNjb25uZWN0ZWQgY29tbWFuZHMKKzsKKzsgTU9ESUZJRVMgOiBTQ1JBVENILCByZWNvbm5lY3RfZHNhX2hlYWQKKzsgCis7IEVYSVRTIDogYWx3YXlzIHBhc3NlcyBjb250cm9sIHRvIHNjaGVkdWxlCisKK0VOVFJZIGRzYV9zY2hlZHVsZQorZHNhX3NjaGVkdWxlOgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19kc2Ffc2NoZWR1bGUKKyNlbmRpZgorCis7Cis7IENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBwb2ludGVyIHdpdGhpbiB0aGUgRFNBIAorOyBzdHJ1Y3R1cmUgb2YgdGhlIGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGluZworOworI2lmIChDSElQID09IDcxMCkKKyAgICA7IFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgRFNBIGZyb20gbWVtb3J5IC0gYWN0dWFsIERTQQorICAgIDsgcmVnaXN0ZXIgaXMgcHJvYmFibHkgY29ycnVwdAorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisjZWxzZQorICAgIENBTEwgZHNhX3RvX3NjcmF0Y2gKKyNlbmRpZgorICAgIE1PVkUgU0NSQVRDSDAgKyBkc2FfbmV4dCBUTyBTQ1JBVENIMAorICAgIE1PVkUgU0NSQVRDSDEgKyAwIFRPIFNDUkFUQ0gxIFdJVEggQ0FSUlkKKyAgICBNT1ZFIFNDUkFUQ0gyICsgMCBUTyBTQ1JBVENIMiBXSVRIIENBUlJZCisgICAgTU9WRSBTQ1JBVENIMyArIDAgVE8gU0NSQVRDSDMgV0lUSCBDQVJSWQorCis7IFBvaW50IHRoZSBuZXh0IGZpZWxkIG9mIHRoaXMgRFNBIHN0cnVjdHVyZSBhdCB0aGUgY3VycmVudCBkaXNjb25uZWN0ZWQgCis7IGxpc3QKKyAgICBETU9ERV9OQ1JfVE9fTUVNT1JZCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBkc2Ffc2NoZWR1bGVfaW5zZXJ0ICsgOAorICAgIERNT0RFX01FTU9SWV9UT19NRU1PUlkKK2RzYV9zY2hlZHVsZV9pbnNlcnQ6CisgICAgTU9WRSBNRU1PUlkgNCwgcmVjb25uZWN0X2RzYV9oZWFkLCAwIAorCis7IEFuZCB1cGRhdGUgdGhlIGhlYWQgcG9pbnRlci4KKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBjdXJyZW50IERTQSBmcm9tIG1lbW9yeSAtIGFjdHVhbCBEU0EKKyAgICA7IHJlZ2lzdGVyIGlzIHByb2JhYmx5IGNvcnJ1cHQKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfc2NyYXRjaAorI2Vsc2UKKyAgICBDQUxMIGRzYV90b19zY3JhdGNoCisjZW5kaWYKKyAgICBETU9ERV9OQ1JfVE9fTUVNT1JZCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCByZWNvbm5lY3RfZHNhX2hlYWQKKyAgICBETU9ERV9NRU1PUllfVE9fTUVNT1JZCisvKiBUZW1wb3JhcmlseSwgc2VlIHdoYXQgaGFwcGVucy4gKi8KKyNpZm5kZWYgT1JJR0lOQUwKKyNpZiAoQ0hJUCAhPSA3MTApCisgICAgTU9WRSBTQ05UTDIgJiAweDdmIFRPIFNDTlRMMgorI2VuZGlmCisgICAgQ0xFQVIgQUNLCisjZW5kaWYKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBUaW1lIHRvIGNvcnJlY3QgRFNBIGZvbGxvd2luZyBtZW1vcnkgbW92ZQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNlbmRpZgorICAgIFdBSVQgRElTQ09OTkVDVAorI2lmZGVmIEVWRU5UUworICAgIElOVCBpbnRfRVZFTlRfRElTQ09OTkVDVDsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19kaXNjb25uZWN0ZWQKKyNlbmRpZgorICAgIEpVTVAgc2NoZWR1bGUKKyNlbmRpZiAKKworOworOyBzZWxlY3QKKzsKKzsgUFVSUE9TRSA6IGVzdGFibGlzaCBhIG5leHVzIGZvciB0aGUgU0NTSSBjb21tYW5kIHJlZmVyZW5jZWQgYnkgRFNBLgorOwlPbiBzdWNjZXNzLCB0aGUgY3VycmVudCBEU0Egc3RydWN0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgaXNzdWUgCis7CXF1ZXVlLiAgVXN1YWxseSwgdGhpcyBpcyBlbnRlcmVkIGFzIGEgZmFsbC10aHJvdWdoIGZyb20gc2NoZWR1bGUsCis7CWFsdGhvdWdoIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgaGFuZGxpbmcgY29kZSB3aWxsIHdyaXRlCis7CXRoZSBzZWxlY3QgZW50cnkgYWRkcmVzcyB0byB0aGUgRFNQIHRvIHJlc3RhcnQgYSBjb21tYW5kIGFzIGEgCis7CVJFUVVFU1QgU0VOU0UuICBBIG1lc3NhZ2UgaXMgc2VudCAodXN1YWxseSBJREVOVElGWSwgYWx0aG91Z2gKKzsJYWRkaXRpb25hbCBTRFRSIG9yIFdEVFIgbWVzc2FnZXMgbWF5IGJlIHNlbnQpLiAgQ09NTUFORCBPVVQKKzsJaXMgaGFuZGxlZC4KKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBjb21tYW5kLCBpc3N1ZV9kc2FfaGVhZAorOworOyBDQUxMUyA6IE5PVCBPSworOworOyBNT0RJRklFUyA6IFNDUkFUQ0gsIGlzc3VlX2RzYV9oZWFkCis7Cis7IEVYSVRTIDogb24gcmVzZWxlY3Rpb24gb3Igc2VsZWN0aW9uLCBnbyB0byBzZWxlY3RfZmFpbGVkCis7CW90aGVyd2lzZSwgUkVUVVJOIHNvIGNvbnRyb2wgaXMgcGFzc2VkIGJhY2sgdG8gCis7CWRzYV9iZWdpbi4KKzsKKworRU5UUlkgc2VsZWN0CitzZWxlY3Q6CisKKyNpZmRlZiBFVkVOVFMKKyAgICBJTlQgaW50X0VWRU5UX0JFRk9SRV9TRUxFQ1QKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX3NjaGVkdWxlZAorI2VuZGlmCisgICAgQ0xFQVIgVEFSR0VUCisKKzsgWFhYCis7Cis7IEluIGVmZmVjdCwgU0VMRUNUSU9OIG9wZXJhdGlvbnMgYXJlIGJhY2tncm91bmRlZCwgd2l0aCBleGVjdXRpb24KKzsgY29udGludWluZyB1bnRpbCBjb2RlIHdoaWNoIHdhaXRzIGZvciBSRVEgb3IgYSBmYXRhbCBpbnRlcnJ1cHQgaXMgCis7IGVuY291bnRlcmVkLgorOworOyBTbywgZm9yIG1vcmUgcGVyZm9ybWFuY2UsIHdlIGNvdWxkIG92ZXJsYXAgdGhlIGNvZGUgd2hpY2ggcmVtb3ZlcyAKKzsgdGhlIGNvbW1hbmQgZnJvbSB0aGUgTkNScyBpc3N1ZSBxdWV1ZSB3aXRoIHRoZSBzZWxlY3Rpb24sIGJ1dCAKKzsgYXQgdGhpcyBwb2ludCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHRoZSBlcnJvciByZWNvdmVyeS4KKzsKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRW5hYmxlIHNlbGVjdGlvbiB0aW1lcgorI2lmZGVmIE5PX1NFTEVDVElPTl9USU1FT1VUCisgICAgTU9WRSBDVEVTVDcgJiAweGZmIFRPIENURVNUNworI2Vsc2UKKyAgICBNT1ZFIENURVNUNyAmIDB4ZWYgVE8gQ1RFU1Q3CisjZW5kaWYKKyNlbmRpZgorICAgIFNFTEVDVCBBVE4gRlJPTSBkc2Ffc2VsZWN0LCBzZWxlY3RfZmFpbGVkCisgICAgSlVNUCBzZWxlY3RfbXNnb3V0LCBXSEVOIE1TR19PVVQKK0VOVFJZIHNlbGVjdF9tc2dvdXQKK3NlbGVjdF9tc2dvdXQ6CisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisjZW5kaWYKKyAgICBNT1ZFIEZST00gZHNhX21zZ291dCwgV0hFTiBNU0dfT1VUCisjZWxzZQorRU5UUlkgc2VsZWN0X21zZ291dAorICAgIFNFTEVDVCBBVE4gMCwgc2VsZWN0X2ZhaWxlZAorc2VsZWN0X21zZ291dDoKKyAgICBNT1ZFIDAsIDAsIFdIRU4gTVNHT1VUCisjZW5kaWYKKworI2lmZGVmIEVWRU5UUworICAgSU5UIGludF9FVkVOVF9TRUxFQ1QKKyNlbmRpZgorICAgUkVUVVJOCisKKzsgCis7IHNlbGVjdF9kb25lCis7IAorOyBQVVJQT1NFOiBjb250aW51ZSBvbiB0byBub3JtYWwgZGF0YSB0cmFuc2ZlcjsgY2FsbGVkIGFzIHRoZSBleGl0IAorOwlwb2ludCBmcm9tIGRzYV9iZWdpbi4KKzsKKzsgSU5QVVRTOiBkc2EKKzsKKzsgQ0FMTFM6IE9LCis7Cis7CisKK3NlbGVjdF9kb25lOgorI2lmIChDSElQID09IDcxMCkKKzsgTk9URSBEU0EgaXMgY29ycnVwdCB3aGVuIHdlIGFycml2ZSBoZXJlIQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKK0VOVFJZIHNlbGVjdF9jaGVja19kc2EKK3NlbGVjdF9jaGVja19kc2E6CisgICAgSU5UIGludF9kZWJ1Z19jaGVja19kc2EKKyNlbmRpZgorCis7IEFmdGVyIGEgc3VjY2Vzc2Z1bCBzZWxlY3Rpb24sIHdlIHNob3VsZCBnZXQgZWl0aGVyIGEgQ01EIHBoYXNlIG9yIAorOyBzb21lIHRyYW5zZmVyIHJlcXVlc3QgbmVnb3RpYXRpb24gbWVzc2FnZS4KKworICAgIEpVTVAgY21kb3V0LCBXSEVOIENNRAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTiAKKworc2VsZWN0X21zZ19pbjoKKyAgICBDQUxMIG1zZ19pbiwgV0hFTiBNU0dfSU4KKyAgICBKVU1QIHNlbGVjdF9tc2dfaW4sIFdIRU4gTVNHX0lOCisKK2NtZG91dDoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIE5PVCBDTUQKKyNpZiAoQ0hJUCA9PSA3MDApCisgICAgSU5UIGludF9ub3JtX3NlbGVjdGVkCisjZW5kaWYKK0VOVFJZIGNtZG91dF9jbWRvdXQKK2NtZG91dF9jbWRvdXQ6CisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKyAgICBNT1ZFIEZST00gZHNhX2NtZG91dCwgV0hFTiBDTUQKKyNlbHNlCisgICAgTU9WRSAwLCAwLCBXSEVOIENNRAorI2VuZGlmIC8qIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpICovCisKKzsKKzsgZGF0YV90cmFuc2ZlciAgCis7IG90aGVyX291dAorOyBvdGhlcl9pbgorOyBvdGhlcl90cmFuc2ZlcgorOworOyBQVVJQT1NFIDogaGFuZGxlIHRoZSBtYWluIGRhdGEgdHJhbnNmZXIgZm9yIGEgU0NTSSBjb21tYW5kIGluIAorOwlzZXZlcmFsIHBhcnRzLiAgSW4gdGhlIGZpcnN0IHBhcnQsIGRhdGFfdHJhbnNmZXIsIERBVEFfSU4KKzsJYW5kIERBVEFfT1VUIHBoYXNlcyBhcmUgYWxsb3dlZCwgd2l0aCB0aGUgdXNlciBwcm92aWRlZAorOwljb2RlICh1c3VhbGx5IGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgc2NhdHRlci9nYXRoZXIKKzsJbGlzdCBhc3NvY2lhdGVkIHdpdGggYSBTQ1NJIGNvbW1hbmQpIGNhbGxlZCB0byBoYW5kbGUgdGhlc2UgCis7CXBoYXNlcy4KKzsKKzsJQWZ0ZXIgY29udHJvbCBoYXMgcGFzc2VkIHRvIG9uZSBvZiB0aGUgdXNlciBwcm92aWRlZCAKKzsJREFUQV9JTiBvciBEQVRBX09VVCByb3V0aW5lcywgYmFjayBjYWxscyBhcmUgbWFkZSB0byAKKzsJb3RoZXJfdHJhbnNmZXJfaW4gb3Igb3RoZXJfdHJhbnNmZXJfb3V0IHRvIGhhbmRsZSBub24tREFUQSBJTgorOwlhbmQgREFUQSBPVVQgcGhhc2VzIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgc3RhdGUgb2YgdGhlIGFjdGl2ZQorOwlkYXRhIHBvaW50ZXIgYmVpbmcgcHJlc2VydmVkIGluIFRFTVAuCis7Cis7CU9uIGNvbXBsZXRpb24sIHRoZSB1c2VyIGNvZGUgcGFzc2VzIGNvbnRyb2wgdG8gb3RoZXJfdHJhbnNmZXIKKzsJd2hpY2ggY2F1c2VzIERBVEFfSU4gYW5kIERBVEFfT1VUIHRvIHJlc3VsdCBpbiB1bmV4cGVjdGVkX3BoYXNlCis7CWludGVycnVwdHMgc28gdGhhdCBkYXRhIG92ZXJydW5zIG1heSBiZSB0cmFwcGVkLgorOworOyBJTlBVVFMgOiBEU0EgLSBTQ1NJIGNvbW1hbmQKKzsKKzsgQ0FMTFMgOiBPSyBpbiBkYXRhX3RyYW5zZmVyX3N0YXJ0LCBub3Qgb2sgaW4gb3RoZXJfb3V0IGFuZCBvdGhlcl9pbiwgb2sgaW4KKzsJb3RoZXJfdHJhbnNmZXIKKzsKKzsgTU9ESUZJRVMgOiBTQ1JBVENICis7Cis7IEVYSVRTIDogaWYgU1RBVFVTIElOIGlzIGRldGVjdGVkLCBzaWduaWZ5aW5nIGNvbW1hbmQgY29tcGxldGlvbiwKKzsJdGhlIE5DUiBqdW1wcyB0byBjb21tYW5kX2NvbXBsZXRlLiAgSWYgTVNHIElOIG9jY3VycywgYSAKKzsJQ0FMTCBpcyBtYWRlIHRvIG1zZ19pbi4gIE90aGVyd2lzZSwgb3RoZXJfdHJhbnNmZXIgcnVucyBpbiAKKzsJYW4gaW5maW5pdGUgbG9vcC4KKzsJCisKK0VOVFJZIGRhdGFfdHJhbnNmZXIKK2RhdGFfdHJhbnNmZXI6CisgICAgSlVNUCBjbWRvdXRfY21kb3V0LCBXSEVOIENNRAorICAgIENBTEwgbXNnX2luLCBXSEVOIE1TR19JTgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorICAgIEpVTVAgZG9fZGF0YW91dCwgV0hFTiBEQVRBX09VVAorICAgIEpVTVAgZG9fZGF0YWluLCBXSEVOIERBVEFfSU4KKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisgICAgSlVNUCBkYXRhX3RyYW5zZmVyCitFTlRSWSBlbmRfZGF0YV90cmFuc2ZlcgorZW5kX2RhdGFfdHJhbnNmZXI6CisKKzsKKzsgRklYTUU6IE9uIE5DUjUzYzcwMCBhbmQgTkNSNTNjNzAwLTY2IGNoaXBzLCBkb19kYXRhb3V0L2RvX2RhdGFpbiAKKzsgc2hvdWxkIGJlIGZpeGVkIHVwIHdoZW5ldmVyIHRoZSBuZXh1cyBjaGFuZ2VzIHNvIGl0IGNhbiBwb2ludCB0byB0aGUgCis7IGNvcnJlY3Qgcm91dGluZSBmb3IgdGhhdCBjb21tYW5kLgorOworCisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKzsgTmFzdHkganVtcCB0byBkc2EtPmRhdGFvdXQKK2RvX2RhdGFvdXQ6CisjaWYgKENISVAgPT0gNzEwKQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisjZWxzZQorICAgIENBTEwgZHNhX3RvX3NjcmF0Y2gKKyNlbmRpZgorICAgIE1PVkUgU0NSQVRDSDAgKyBkc2FfZGF0YW91dCBUTyBTQ1JBVENIMAkKKyAgICBNT1ZFIFNDUkFUQ0gxICsgMCBUTyBTQ1JBVENIMSBXSVRIIENBUlJZIAorICAgIE1PVkUgU0NSQVRDSDIgKyAwIFRPIFNDUkFUQ0gyIFdJVEggQ0FSUlkgCisgICAgTU9WRSBTQ1JBVENIMyArIDAgVE8gU0NSQVRDSDMgV0lUSCBDQVJSWSAKKyAgICBETU9ERV9OQ1JfVE9fTUVNT1JZCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBkYXRhb3V0X3RvX2p1bXAgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorZGF0YW91dF90b19qdW1wOgorICAgIE1PVkUgTUVNT1JZIDQsIDAsIGRhdGFvdXRfanVtcCArIDQgCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgVGltZSB0byBjb3JyZWN0IERTQSBmb2xsb3dpbmcgbWVtb3J5IG1vdmUKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisjZW5kaWYKK2RhdGFvdXRfanVtcDoKKyAgICBKVU1QIDAKKworOyBOYXN0eSBqdW1wIHRvIGRzYS0+ZHNhaW4KK2RvX2RhdGFpbjoKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX3NjcmF0Y2gKKyNlbHNlCisgICAgQ0FMTCBkc2FfdG9fc2NyYXRjaAorI2VuZGlmCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9kYXRhaW4gVE8gU0NSQVRDSDAJCisgICAgTU9WRSBTQ1JBVENIMSArIDAgVE8gU0NSQVRDSDEgV0lUSCBDQVJSWSAKKyAgICBNT1ZFIFNDUkFUQ0gyICsgMCBUTyBTQ1JBVENIMiBXSVRIIENBUlJZIAorICAgIE1PVkUgU0NSQVRDSDMgKyAwIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkgCisgICAgRE1PREVfTkNSX1RPX01FTU9SWQorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgZGF0YWluX3RvX2p1bXAgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorRU5UUlkgZGF0YWluX3RvX2p1bXAKK2RhdGFpbl90b19qdW1wOgorICAgIE1PVkUgTUVNT1JZIDQsIDAsIGRhdGFpbl9qdW1wICsgNAorI2lmIChDSElQID09IDcxMCkKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX2RhdGFpbgorI2VuZGlmCitkYXRhaW5fanVtcDoKKyAgICBKVU1QIDAKKyNlbmRpZiAvKiAoQ0hJUCAhPSA3MDApICYmIChDSElQICE9IDcwMDY2KSAqLworCisKKzsgTm90ZSB0aGF0IG90aGVyX291dCBhbmQgb3RoZXJfaW4gbG9vcCB1bnRpbCBhIG5vbi1kYXRhIHBoYXNlCis7IGlzIGRpc2NvdmVyZWQsIHNvIHdlIG9ubHkgZXhlY3V0ZSByZXR1cm4gc3RhdGVtZW50cyB3aGVuIHdlCis7IGNhbiBnbyBvbiB0byB0aGUgbmV4dCBkYXRhIHBoYXNlIGJsb2NrIG1vdmUgc3RhdGVtZW50LgorCitFTlRSWSBvdGhlcl9vdXQKK290aGVyX291dDoKKyNpZiAwCisgICAgSU5UIDB4MDNmZmRlYWQKKyNlbmRpZgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gQ01ECisgICAgSlVNUCBtc2dfaW5fcmVzdGFydCwgV0hFTiBNU0dfSU4gCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBNU0dfT1VUCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX0lOCisgICAgSlVNUCBjb21tYW5kX2NvbXBsZXRlLCBXSEVOIFNUQVRVUworICAgIEpVTVAgb3RoZXJfb3V0LCBXSEVOIE5PVCBEQVRBX09VVAorI2lmIChDSElQID09IDcxMCkKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFvdXQgY29kZS4KKyNlbmRpZgorICAgIFJFVFVSTgorCitFTlRSWSBvdGhlcl9pbgorb3RoZXJfaW46CisjaWYgMAorICAgIElOVCAweDAzZmZkZWFkCisjZW5kaWYKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIENNRAorICAgIEpVTVAgbXNnX2luX3Jlc3RhcnQsIFdIRU4gTVNHX0lOIAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gREFUQV9PVVQKKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisgICAgSlVNUCBvdGhlcl9pbiwgV0hFTiBOT1QgREFUQV9JTgorI2lmIChDSElQID09IDcxMCkKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFpbiBjb2RlLgorI2VuZGlmCisgICAgUkVUVVJOCisKKworRU5UUlkgb3RoZXJfdHJhbnNmZXIKK290aGVyX3RyYW5zZmVyOgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gQ01ECisgICAgQ0FMTCBtc2dfaW4sIFdIRU4gTVNHX0lOCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBNU0dfT1VUCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX09VVAorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gREFUQV9JTgorICAgIEpVTVAgY29tbWFuZF9jb21wbGV0ZSwgV0hFTiBTVEFUVVMKKyAgICBKVU1QIG90aGVyX3RyYW5zZmVyCisKKzsKKzsgbXNnX2luX3Jlc3RhcnQKKzsgbXNnX2luCis7IG11bmdlX21zZworOworOyBQVVJQT1NFIDogcHJvY2VzcyBtZXNzYWdlcyBmcm9tIGEgdGFyZ2V0LiAgbXNnX2luIGlzIGNhbGxlZCB3aGVuIHRoZSAKKzsJY2FsbGVyIGhhc24ndCByZWFkIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLiAgbXVuZ2VfbWVzc2FnZQorOwlpcyBjYWxsZWQgd2hlbiB0aGUgY2FsbGVyIGhhcyByZWFkIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLAorOwlhbmQgbGVmdCBpdCBpbiBTRkJSLiAgbXNnX2luX3Jlc3RhcnQgaXMgY2FsbGVkIHdoZW4gdGhlIGNhbGxlciAKKzsJaGFzbid0IHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UsIGFuZCB3aXNoZXMgUkVUVVJOCis7CXRvIHRyYW5zZmVyIGNvbnRyb2wgYmFjayB0byB0aGUgYWRkcmVzcyBvZiB0aGUgY29uZGl0aW9uYWwKKzsJQ0FMTCBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB0byB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgaXQuCis7Cis7CVZhcmlvdXMgaW50XyogaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkIHdoZW4gdGhlIGhvc3Qgc3lzdGVtCis7CW5lZWRzIHRvIGludGVydmVuZSwgYXMgaXMgdGhlIGNhc2Ugd2l0aCBTRFRSLCBXRFRSLCBhbmQKKzsJSU5JVElBVEUgUkVDT1ZFUlkgbWVzc2FnZXMuCis7Cis7CVdoZW4gdGhlIGhvc3Qgc3lzdGVtIGhhbmRsZXMgb25lIG9mIHRoZXNlIGludGVycnVwdHMsCis7CWl0IGNhbiByZXNwb25kIGJ5IHJlZW50ZXJpbmcgYXQgcmVqZWN0X21lc3NhZ2UsIAorOwl3aGljaCByZWplY3RzIHRoZSBtZXNzYWdlIGFuZCByZXR1cm5zIGNvbnRyb2wgdG8KKzsJdGhlIGNhbGxlciBvZiBtc2dfaW4gb3IgbXVuZ2VfbXNnLCBhY2NlcHRfbWVzc2FnZQorOwl3aGljaCBjbGVhcnMgQUNLIGFuZCByZXR1cm5zIGNvbnRyb2wsIG9yIHJlcGx5X21lc3NhZ2UKKzsJd2hpY2ggc2VuZHMgdGhlIG1lc3NhZ2UgcG9pbnRlZCB0byBieSB0aGUgRFNBIAorOwltc2dvdXRfb3RoZXIgdGFibGUgaW5kaXJlY3QgZmllbGQuCis7Cis7CURJU0NPTk5FQ1QgbWVzc2FnZXMgYXJlIGhhbmRsZWQgYnkgbW92aW5nIHRoZSBjb21tYW5kCis7CXRvIHRoZSByZWNvbm5lY3RfZHNhX3F1ZXVlLgorI2lmIChDSElQID09IDcxMCkKKzsgTk9URTogRFNBIHNob3VsZCBiZSB2YWxpZCB3aGVuIHdlIGdldCBoZXJlIC0gd2UgY2Fubm90IHNhdmUgYm90aCBpdAorOwlhbmQgVEVNUCBpbiB0aGlzIHJvdXRpbmUuCisjZW5kaWYKKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBDT01NQU5ELCBTRkJSIC0gZmlyc3QgYnl0ZSBvZiBtZXNzYWdlIChtdW5nZV9tc2cKKzsJb25seSkKKzsKKzsgQ0FMTFMgOiBOTy4gIFRoZSBURU1QIHJlZ2lzdGVyIGlzbid0IGJhY2tlZCB1cCB0byBhbGxvdyBuZXN0ZWQgY2FsbHMuCis7Cis7IE1PRElGSUVTIDogU0NSQVRDSCwgRFNBIG9uIERJU0NPTk5FQ1QKKzsKKzsgRVhJVFMgOiBPbiByZWNlaXB0IG9mIFNBVkUgREFUQSBQT0lOVEVSLCBSRVNUT1JFIFBPSU5URVJTLAorOwlhbmQgbm9ybWFsIHJldHVybiBmcm9tIG1lc3NhZ2UgaGFuZGxlcnMgcnVubmluZyB1bmRlcgorOwlMaW51eCwgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgUmVjZWlwdAorOwlvZiBESVNDT05ORUNUIG1lc3NhZ2VzIHBhc3MgY29udHJvbCB0byBkc2Ffc2NoZWR1bGUuCis7CitFTlRSWSBtc2dfaW5fcmVzdGFydAorbXNnX2luX3Jlc3RhcnQ6Cis7IFhYWCAtIGhhY2tpc2gKKzsKKzsgU2luY2UgaXQncyBlYXNpZXIgdG8gZGVidWcgY2hhbmdlcyB0byB0aGUgc3RhdGljYWxseSAKKzsgY29tcGlsZWQgY29kZSwgcmF0aGVyIHRoYW4gdGhlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCAKKzsgc3R1ZmYsIHN1Y2ggYXMKKzsKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7IAlDQUxMIG90aGVyX3osIFdIRU4gTk9UIGRhdGFfcGhhc2UKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7Cis7IEknZCBsaWtlIHRvIGhhdmUgY2VydGFpbiByb3V0aW5lcyAobm90YWJseSB0aGUgbWVzc2FnZSBoYW5kbGVyKQorOyByZXN0YXJ0IG9uIHRoZSBjb25kaXRpb25hbCBjYWxsIHJhdGhlciB0aGFuIHRoZSBuZXh0IGluc3RydWN0aW9uLgorOworOyBTbywgc3VidHJhY3QgOCBmcm9tIHRoZSByZXR1cm4gYWRkcmVzcworCisgICAgTU9WRSBURU1QMCArIDB4ZjggVE8gVEVNUDAKKyAgICBNT1ZFIFRFTVAxICsgMHhmZiBUTyBURU1QMSBXSVRIIENBUlJZCisgICAgTU9WRSBURU1QMiArIDB4ZmYgVE8gVEVNUDIgV0lUSCBDQVJSWQorICAgIE1PVkUgVEVNUDMgKyAweGZmIFRPIFRFTVAzIFdJVEggQ0FSUlkKKworRU5UUlkgbXNnX2luCittc2dfaW46CisgICAgTU9WRSAxLCBtc2dfYnVmLCBXSEVOIE1TR19JTgorCittdW5nZV9tc2c6CisgICAgSlVNUCBtdW5nZV9leHRlbmRlZCwgSUYgMHgwMQkJOyBFWFRFTkRFRCBNRVNTQUdFCisgICAgSlVNUCBtdW5nZV8yLCBJRiAweDIwLCBBTkQgTUFTSyAweGRmCTsgdHdvIGJ5dGUgbWVzc2FnZQorOworOyBYWFggLSBJJ3ZlIHNlZW4gYSBoYW5kZnVsIG9mIGJyb2tlbiBTQ1NJIGRldmljZXMgd2hpY2ggZmFpbCB0byBpc3N1ZQorOyAJYSBTQVZFIFBPSU5URVJTIG1lc3NhZ2UgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgaW4gdGhlIG1pZGRsZSBvZiAKKzsgCWEgdHJhbnNmZXIsIGFzc3VtaW5nIHRoYXQgdGhlIERBVEEgUE9JTlRFUiB3aWxsIGJlIGltcGxpY2l0bHkgCis7IAlyZXN0b3JlZC4gIAorOworOyBIaXN0b3JpY2FsbHksIEkndmUgb2Z0ZW4gZG9uZSBhbiBpbXBsaWNpdCBzYXZlIHdoZW4gdGhlIERJU0NPTk5FQ1QKKzsgbWVzc2FnZSBpcyBwcm9jZXNzZWQuICBXZSBtYXkgd2FudCB0byBjb25zaWRlciBoYXZpbmcgdGhlIG9wdGlvbiBvZiAKKzsgZG9pbmcgdGhhdCBoZXJlLiAKKzsKKyAgICBKVU1QIG11bmdlX3NhdmVfZGF0YV9wb2ludGVyLCBJRiAweDAyCTsgU0FWRSBEQVRBIFBPSU5URVIKKyAgICBKVU1QIG11bmdlX3Jlc3RvcmVfcG9pbnRlcnMsIElGIDB4MDMJOyBSRVNUT1JFIFBPSU5URVJTIAorICAgIEpVTVAgbXVuZ2VfZGlzY29ubmVjdCwgSUYgMHgwNAkJOyBESVNDT05ORUNUCisgICAgSU5UIGludF9tc2dfMSwgSUYgMHgwNwkJCTsgTUVTU0FHRSBSRUpFQ1QKKyAgICBJTlQgaW50X21zZ18xLCBJRiAweDBmCQkJOyBJTklUSUFURSBSRUNPVkVSWQorI2lmZGVmIEVWRU5UUyAKKyAgICBJTlQgaW50X0VWRU5UX1NFTEVDVF9GQUlMRUQgCisjZW5kaWYKKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlCisKK211bmdlXzI6CisgICAgSlVNUCByZWplY3RfbWVzc2FnZQorOworOyBUaGUgU0NTSSBzdGFuZGFyZCBhbGxvd3MgdGFyZ2V0cyB0byByZWNvdmVyIGZyb20gdHJhbnNpZW50IAorOyBlcnJvciBjb25kaXRpb25zIGJ5IGJhY2tpbmcgdXAgdGhlIGRhdGEgcG9pbnRlciB3aXRoIGEgCis7IFJFU1RPUkUgUE9JTlRFUlMgbWVzc2FnZS4gIAorOwkKKzsgU28sIHdlIG11c3Qgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgX3Jlc2lkdWFsXyBjb2RlIGFzIHdlbGwgYXMgCis7IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIuICBCZWNhdXNlIG9mIHRoaXMgbWVzc2luZXNzLAorOyBpdCBpcyBzaW1wbGVyIHRvIHB1dCBkeW5hbWljIGNvZGUgaW4gdGhlIGRzYSBmb3IgdGhpcyBhbmQgdG8KKzsganVzdCBkbyBhIHNpbXBsZSBqdW1wIGRvd24gdGhlcmUuIAorOworCittdW5nZV9zYXZlX2RhdGFfcG9pbnRlcjoKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBXZSBoYXZlIHNvbWV0aGluZyBpbiBURU1QIGhlcmUsIHNvIGZpcnN0IHdlIG11c3Qgc2F2ZSB0aGF0CisgICAgTU9WRSBURU1QMCBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisgICAgTU9WRSBURU1QMSBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisgICAgTU9WRSBURU1QMyBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBqdW1wX3RlbXAgKyA0CisgICAgOyBOb3cgcmVzdG9yZSBEU0EKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisjZW5kaWYKKyAgICBNT1ZFIERTQTAgKyBkc2Ffc2F2ZV9kYXRhX3BvaW50ZXIgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMAorICAgIE1PVkUgRFNBMSArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBEU0EyICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkgCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisgICAgTU9WRSBEU0EzICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDMKKworICAgIERNT0RFX05DUl9UT19NRU1PUlkKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGp1bXBfZHNhX3NhdmUgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQoranVtcF9kc2Ffc2F2ZToKKyAgICBKVU1QIDAKKworbXVuZ2VfcmVzdG9yZV9wb2ludGVyczoKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBUaGUgY29kZSBhdCBkc2FfcmVzdG9yZV9wb2ludGVycyB3aWxsIFJFVFVSTiwgYnV0IHdlIGRvbid0IGNhcmUKKyAgICA7IGFib3V0IFRFTVAgaGVyZSwgYXMgaXQgd2lsbCBvdmVyd3JpdGUgaXQgYW55d2F5LgorI2VuZGlmCisgICAgTU9WRSBEU0EwICsgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMAorICAgIE1PVkUgRFNBMSArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBEU0EyICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDIKKyAgICBNT1ZFIERTQTMgKyAweGZmIFRPIFNGQlIgV0lUSCBDQVJSWQorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMworCisgICAgRE1PREVfTkNSX1RPX01FTU9SWQorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwganVtcF9kc2FfcmVzdG9yZSArIDQKKyAgICBETU9ERV9NRU1PUllfVE9fTUVNT1JZCitqdW1wX2RzYV9yZXN0b3JlOgorICAgIEpVTVAgMAorCisKK211bmdlX2Rpc2Nvbm5lY3Q6CisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX2Rpc2Nvbm5lY3RfbXNnCisjZW5kaWYKKworLyogCisgKiBCZWZvcmUsIHdlIG92ZXJsYXBwZWQgcHJvY2Vzc2luZyB3aXRoIHdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QsIGJ1dAorICogZGVidWdnaW5nIHdhcyBiZWdpbm5pbmcgdG8gYXBwZWFyIG1lc3N5LiAgVGVtcG9yYXJpbHkgbW92ZSB0aGluZ3MKKyAqIHRvIGp1c3QgYmVmb3JlIHRoZSBXQUlUIERJU0NPTk5FQ1QuCisgKi8KKyAKKyNpZmRlZiBPUklHSU5BTAorI2lmIChDSElQID09IDcxMCkKKzsgRm9sbG93aW5nIGNsZWFycyBVbmV4cGVjdGVkIERpc2Nvbm5lY3QgYml0LiAgV2hhdCBkbyB3ZSBkbz8KKyNlbHNlCisgICAgTU9WRSBTQ05UTDIgJiAweDdmIFRPIFNDTlRMMgorI2VuZGlmCisgICAgQ0xFQVIgQUNLCisjZW5kaWYKKworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCisgICAgSlVNUCBkc2Ffc2NoZWR1bGUKKyNlbHNlCisgICAgV0FJVCBESVNDT05ORUNUCisgICAgSU5UIGludF9ub3JtX2Rpc2Nvbm5lY3RlZAorI2VuZGlmCisKK211bmdlX2V4dGVuZGVkOgorICAgIENMRUFSIEFDSworICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTgorICAgIE1PVkUgMSwgbXNnX2J1ZiArIDEsIFdIRU4gTVNHX0lOCisgICAgSlVNUCBtdW5nZV9leHRlbmRlZF8yLCBJRiAweDAyCisgICAgSlVNUCBtdW5nZV9leHRlbmRlZF8zLCBJRiAweDAzIAorICAgIEpVTVAgcmVqZWN0X21lc3NhZ2UKKworbXVuZ2VfZXh0ZW5kZWRfMjoKKyAgICBDTEVBUiBBQ0sKKyAgICBNT1ZFIDEsIG1zZ19idWYgKyAyLCBXSEVOIE1TR19JTgorICAgIEpVTVAgcmVqZWN0X21lc3NhZ2UsIElGIE5PVCAweDAyCTsgTXVzdCBiZSBXRFRSCisgICAgQ0xFQVIgQUNLCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMywgV0hFTiBNU0dfSU4KKyAgICBJTlQgaW50X21zZ193ZHRyCisKK211bmdlX2V4dGVuZGVkXzM6CisgICAgQ0xFQVIgQUNLCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMiwgV0hFTiBNU0dfSU4KKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlLCBJRiBOT1QgMHgwMQk7IE11c3QgYmUgU0RUUgorICAgIENMRUFSIEFDSworICAgIE1PVkUgMiwgbXNnX2J1ZiArIDMsIFdIRU4gTVNHX0lOCisgICAgSU5UIGludF9tc2dfc2R0cgorCitFTlRSWSByZWplY3RfbWVzc2FnZQorcmVqZWN0X21lc3NhZ2U6CisgICAgU0VUIEFUTgorICAgIENMRUFSIEFDSworICAgIE1PVkUgMSwgTkNSNTNjN3h4X21zZ19yZWplY3QsIFdIRU4gTVNHX09VVAorICAgIFJFVFVSTgorCitFTlRSWSBhY2NlcHRfbWVzc2FnZQorYWNjZXB0X21lc3NhZ2U6CisgICAgQ0xFQVIgQVROCisgICAgQ0xFQVIgQUNLCisgICAgUkVUVVJOCisKK0VOVFJZIHJlc3BvbmRfbWVzc2FnZQorcmVzcG9uZF9tZXNzYWdlOgorICAgIFNFVCBBVE4KKyAgICBDTEVBUiBBQ0sKKyAgICBNT1ZFIEZST00gZHNhX21zZ291dF9vdGhlciwgV0hFTiBNU0dfT1VUCisgICAgUkVUVVJOCisKKzsKKzsgY29tbWFuZF9jb21wbGV0ZQorOworOyBQVVJQT1NFIDogaGFuZGxlIGNvbW1hbmQgdGVybWluYXRpb24gd2hlbiBTVEFUVVMgSU4gaXMgZGV0ZWN0ZWQgYnkgcmVhZGluZworOwlhIHN0YXR1cyBieXRlIGZvbGxvd2VkIGJ5IGEgY29tbWFuZCB0ZXJtaW5hdGlvbiBtZXNzYWdlLiAKKzsKKzsJTm9ybWFsIHRlcm1pbmF0aW9uIHJlc3VsdHMgaW4gYW4gSU5URkxZIGluc3RydWN0aW9uLCBhbmQgCis7CXRoZSBob3N0IHN5c3RlbSBjYW4gcGljayBvdXQgd2hpY2ggY29tbWFuZCB0ZXJtaW5hdGVkIGJ5IAorOwlleGFtaW5pbmcgdGhlIE1FU1NBR0UgYW5kIFNUQVRVUyBidWZmZXJzIG9mIGFsbCBjdXJyZW50bHkgCis7CWV4ZWN1dGluZyBjb21tYW5kczsKKzsKKzsJQWJub3JtYWwgKENIRUNLX0NPTkRJVElPTikgdGVybWluYXRpb24gcmVzdWx0cyBpbiBhbgorOwlpbnRfZXJyX2NoZWNrX2NvbmRpdGlvbiBpbnRlcnJ1cHQgc28gdGhhdCBhIFJFUVVFU1QgU0VOU0UKKzsJY29tbWFuZCBjYW4gYmUgaXNzdWVkIG91dC1vZi1vcmRlciBzbyB0aGF0IG5vIG90aGVyIGNvbW1hbmQKKzsJY2xlYXJzIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uLgorOwkKKzsKKzsgSU5QVVRTIDogRFNBIC0gY29tbWFuZAkKKzsKKzsgQ0FMTFMgOiBPSworOworOyBFWElUUyA6IE9uIHN1Y2Nlc3NmdWwgdGVybWluYXRpb24sIGNvbnRyb2wgaXMgcGFzc2VkIHRvIHNjaGVkdWxlLgorOwlPbiBhYm5vcm1hbCB0ZXJtaW5hdGlvbiwgdGhlIHVzZXIgd2lsbCB1c3VhbGx5IG1vZGlmeSB0aGUgCis7CURTQSBmaWVsZHMgYW5kIGNvcnJlc3BvbmRpbmcgYnVmZmVycyBhbmQgcmV0dXJuIGNvbnRyb2wKKzsJdG8gc2VsZWN0LgorOworCitFTlRSWSBjb21tYW5kX2NvbXBsZXRlCitjb21tYW5kX2NvbXBsZXRlOgorICAgIE1PVkUgRlJPTSBkc2Ffc3RhdHVzLCBXSEVOIFNUQVRVUworI2lmIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCQk7IFNhdmUgc3RhdHVzCisjZW5kaWYgLyogKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikgKi8KK0VOVFJZIGNvbW1hbmRfY29tcGxldGVfbXNnaW4KK2NvbW1hbmRfY29tcGxldGVfbXNnaW46CisgICAgTU9WRSBGUk9NIGRzYV9tc2dpbiwgV0hFTiBNU0dfSU4KKzsgSW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgYmUgZXhwZWN0aW5nIGEgZGlzY29ubmVjdAorI2lmIChDSElQICE9IDcxMCkKKyAgICBNT1ZFIFNDTlRMMiAmIDB4N2YgVE8gU0NOVEwyCisjZWxzZQorICAgIDsgQWJvdmUgY29kZSBjbGVhcmVkIHRoZSBVbmV4cGVjdGVkIERpc2Nvbm5lY3QgYml0LCB3aGF0IGRvIHdlIGRvPworI2VuZGlmCisgICAgQ0xFQVIgQUNLCisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKyAgICBXQUlUIERJU0NPTk5FQ1QKKworOworOyBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IHdoZW4gYSBVTklUIEFUVEVOVElPTiBjb25kaXRpb24KKzsgaXMgcGVuZGluZywgYXMgaW5kaWNhdGVkIGJ5IGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cyBtZXNzYWdlLAorOyB0aGUgdGFyZ2V0IHNoYWxsIHJldmVydCB0byBhc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgU2luY2UKKzsgc3luY2hyb25vdXMgdHJhbnNmZXJzIHBhcmFtZXRlcnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgSU5JVElBVE9SL1RBUkdFVCAKKzsgYmFzaXMsIGFuZCByZXR1cm5pbmcgY29udHJvbCB0byBvdXIgc2NoZWR1bGVyIGNvdWxkIHdvcmsgb24gYSBjb21tYW5kCis7IHJ1bm5pbmcgb24gYW5vdGhlciBsdW4gb24gdGhhdCB0YXJnZXQgdXNpbmcgdGhlIG9sZCBwYXJhbWV0ZXJzLCB3ZSBtdXN0Cis7IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IHRoZW0gY2hhbmdlZCwgb3IgY2hhbmdlIHRoZW0gb3Vyc2VsdmVzLgorOworOyBPbmNlIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nIGlzIGltcGxlbWVudGVkLCB0aGluZ3Mgd2lsbCBiZSBldmVuIG1vcmUKKzsgaGFpcnksIHNpbmNlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIGV4aXN0IG9uIGEgcGVyLXRhcmdldC9sdW4KKzsgYmFzaXMsIGFuZCBpc3N1aW5nIGEgbmV3IGNvbW1hbmQgd2l0aCBhIGRpZmZlcmVudCB0YWcgd291bGQgY2xlYXIgaXQuCis7IEluIHRoZXNlIGNhc2VzLCB3ZSBtdXN0IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IGEgcmVxdWVzdCAKKzsgYWRkZWQgdG8gdGhlIEhFQUQgb2YgdGhlIHF1ZXVlIHdpdGggdGhlIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCwgb3Igd2UKKzsgbXVzdCBhdXRvbWF0aWNhbGx5IGlzc3VlIHRoZSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQuCisKKyNpZiAwCisgICAgTU9WRSBTQ1JBVENIMCBUTyBTRkJSCQkJCisgICAgSlVNUCBjb21tYW5kX2ZhaWxlZCwgSUYgMHgwMgorI2VuZGlmCisjaWYgKENISVAgPT0gNzEwKQorI2lmIGRlZmluZWQoTVZNRTE2eF9JTlRGTFkpCis7IEZvciBNVk1FMTZ4IChpZSBDSElQPTcxMCkgd2Ugd2lsbCBmb3JjZSBhbiBJTlRGTFkgYnkgdHJpZ2dlcmluZyBhIHNvZnR3YXJlCis7IGludGVycnVwdCAoU1c3KS4gIFdlIGNhbiB1c2UgU0NSQVRDSCwgYXMgd2UgYXJlIGFib3V0IHRvIGp1bXAgdG8KKzsgc2NoZWR1bGUsIHdoaWNoIGNvcnJ1cHRzIGl0IGFueXdheS4gIFdpbGwgcHJvYmFibHkgcmVtb3ZlIHRoaXMgbGF0ZXIsCis7IGJ1dCB3YW50IHRvIGNoZWNrIHBlcmZvcm1hbmNlIGVmZmVjdHMgZmlyc3QuCisKKyNkZWZpbmUgSU5URkxZX0FERFIgICAgIDB4ZmZmNDAwNzAKKworICAgIE1PVkUgMCBUTyBTQ1JBVENIMAorICAgIE1PVkUgMHg4MCBUTyBTQ1JBVENIMQorICAgIE1PVkUgMCBUTyBTQ1JBVENIMgorICAgIE1PVkUgMCBUTyBTQ1JBVENIMworICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgSU5URkxZX0FERFIKKyNlbHNlCisgICAgSU5UIGludF9ub3JtX2VtdWxhdGVpbnRmbHkKKyNlbmRpZgorI2Vsc2UKKyAgICBJTlRGTFkKKyNlbmRpZgorI2VuZGlmIC8qIChDSElQICE9IDcwMCkgJiYgKENISVAgIT0gNzAwNjYpICovCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgVGltZSB0byBjb3JyZWN0IERTQSBmb2xsb3dpbmcgbWVtb3J5IG1vdmUKKyAgICBNT1ZFIE1FTU9SWSA0LCBzYXZlZF9kc2EsIGFkZHJfZHNhCisjZW5kaWYKKyNpZmRlZiBFVkVOVFMKKyAgICBJTlQgaW50X0VWRU5UX0NPTVBMRVRFCisjZW5kaWYKKyNpZiAoQ0hJUCAhPSA3MDApICYmIChDSElQICE9IDcwMDY2KQorICAgIEpVTVAgc2NoZWR1bGUKK2NvbW1hbmRfZmFpbGVkOgorICAgIElOVCBpbnRfZXJyX2NoZWNrX2NvbmRpdGlvbgorI2Vsc2UKKyAgICBJTlQgaW50X25vcm1fY29tbWFuZF9jb21wbGV0ZQorI2VuZGlmCisKKzsKKzsgd2FpdF9yZXNlbGVjdAorOworOyBQVVJQT1NFIDogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgaWRsZSByb3V0aW5lLCB3aGVyZSBjb250cm9sIGxhbmRzCis7CXdoZW4gdGhlcmUgYXJlIG5vIG5ldyBwcm9jZXNzZXMgdG8gc2NoZWR1bGUuICB3YWl0X3Jlc2VsZWN0Cis7CXdhaXRzIGZvciByZXNlbGVjdGlvbiwgc2VsZWN0aW9uLCBhbmQgbmV3IGNvbW1hbmRzLgorOworOwlXaGVuIGEgc3VjY2Vzc2Z1bCByZXNlbGVjdGlvbiBvY2N1cnMsIHdpdGggdGhlIGFpZCAKKzsJb2YgZml4ZWQgdXAgY29kZSBpbiBlYWNoIERTQSwgd2FpdF9yZXNlbGVjdCB3YWxrcyB0aGUgCis7CXJlY29ubmVjdF9kc2FfcXVldWUsIGFza2luZyBlYWNoIGRzYSBpZiB0aGUgdGFyZ2V0IElECis7CWFuZCBMVU4gbWF0Y2ggaXRzLgorOworOwlJZiBhIG1hdGNoIGlzIGZvdW5kLCBhIGNhbGwgaXMgbWFkZSBiYWNrIHRvIHJlc2VsZWN0ZWRfb2ssCis7CXdoaWNoIHRocm91Z2ggdGhlIG1pcmFjbGVzIG9mIHNlbGYgbW9kaWZ5aW5nIGNvZGUsIGV4dHJhY3RzCis7CXRoZSBmb3VuZCBEU0EgZnJvbSB0aGUgcmVjb25uZWN0X2RzYV9xdWV1ZSBhbmQgdGhlbiAKKzsJcmV0dXJucyBjb250cm9sIHRvIHRoZSBEU0FzIHRocmVhZCBvZiBleGVjdXRpb24uCis7Cis7IElOUFVUUyA6IE5PTkUKKzsKKzsgQ0FMTFMgOiBPSworOworOyBNT0RJRklFUyA6IERTQSwKKzsKKzsgRVhJVFMgOiBPbiBzdWNjZXNzZnVsIHJlc2VsZWN0aW9uLCBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSAKKzsJRFNBIHdoaWNoIGNhbGxlZCByZXNlbGVjdGVkX29rLiAgSWYgdGhlIFdBSVQgUkVTRUxFQ1QKKzsJd2FzIGludGVycnVwdGVkIGJ5IGEgbmV3IGNvbW1hbmRzIGFycml2YWwgc2lnbmFsZWQgYnkgCis7CVNJR19QLCBjb250cm9sIGlzIHBhc3NlZCB0byBzY2hlZHVsZS4gIElmIHRoZSBOQ1IgaXMgCis7CXNlbGVjdGVkLCB0aGUgaG9zdCBzeXN0ZW0gaXMgaW50ZXJydXB0ZWQgd2l0aCBhbiAKKzsJaW50X2Vycl9zZWxlY3RlZCB3aGljaCBpcyB1c3VhbGx5IHJlc3BvbmRlZCB0byBieQorOwlzZXR0aW5nIERTUCB0byB0aGUgdGFyZ2V0X2Fib3J0IGFkZHJlc3MuCisKK0VOVFJZIHdhaXRfcmVzZWxlY3QKK3dhaXRfcmVzZWxlY3Q6CisjaWZkZWYgRVZFTlRTCisgICAgaW50IGludF9FVkVOVF9JRExFCisjZW5kaWYKKyNpZmRlZiBERUJVRworICAgIGludCBpbnRfZGVidWdfaWRsZQorI2VuZGlmCisgICAgV0FJVCBSRVNFTEVDVCB3YWl0X3Jlc2VsZWN0X2ZhaWxlZAorCityZXNlbGVjdGVkOgorI2lmZGVmIEVWRU5UUworICAgIGludCBpbnRfRVZFTlRfUkVTRUxFQ1QKKyNlbmRpZgorICAgIENMRUFSIFRBUkdFVAorICAgIERNT0RFX01FTU9SWV9UT19NRU1PUlkKKyAgICA7IFJlYWQgYWxsIGRhdGEgbmVlZGVkIHRvIHJlZXN0YWJsaXNoIHRoZSBuZXh1cyAtIAorICAgIE1PVkUgMSwgcmVzZWxlY3RlZF9pZGVudGlmeSwgV0hFTiBNU0dfSU4KKyAgICA7IFdlIHVzZWQgdG8gQ0xFQVIgQUNLIGhlcmUuCisjaWYgKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikKKyNpZmRlZiBERUJVRworICAgIGludCBpbnRfZGVidWdfcmVzZWxlY3RlZAorI2VuZGlmCisKKyAgICA7IFBvaW50IERTQSBhdCB0aGUgY3VycmVudCBoZWFkIG9mIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUuCisgICAgRE1PREVfTUVNT1JZX1RPX05DUgorICAgIE1PVkUgTUVNT1JZIDQsIHJlY29ubmVjdF9kc2FfaGVhZCwgYWRkcl9zY3JhdGNoCisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmIChDSElQID09IDcxMCkKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHNhdmVkX2RzYQorI2Vsc2UKKyAgICBDQUxMIHNjcmF0Y2hfdG9fZHNhCisjZW5kaWYKKworICAgIDsgRml4IHRoZSB1cGRhdGUtbmV4dCBwb2ludGVyIHNvIHRoYXQgdGhlIHJlY29ubmVjdF9kc2FfaGVhZAorICAgIDsgcG9pbnRlciBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGlmIHRoaXMgRFNBIGlzIGEgaGl0IAorICAgIDsgYW5kIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZS4KKworICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkLCByZXNlbGVjdGVkX29rX3BhdGNoICsgOAorI2lmIChDSElQID09IDcxMCkKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCisKK0VOVFJZIHJlc2VsZWN0ZWRfY2hlY2tfbmV4dAorcmVzZWxlY3RlZF9jaGVja19uZXh0OgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19yZXNlbGVjdF9jaGVjaworI2VuZGlmCisgICAgOyBDaGVjayBmb3IgYSBOVUxMIHBvaW50ZXIuCisgICAgTU9WRSBEU0EwIFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKyAgICBNT1ZFIERTQTEgVE8gU0ZCUgorICAgIEpVTVAgcmVzZWxlY3RlZF9ub3RfZW5kLCBJRiBOT1QgMAorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisgICAgSlVNUCByZXNlbGVjdGVkX25vdF9lbmQsIElGIE5PVCAwCisgICAgTU9WRSBEU0EzIFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3Jlc2VsZWN0CisKK3Jlc2VsZWN0ZWRfbm90X2VuZDoKKyAgICA7CisgICAgOyBYWFggdGhlIEFMVSBpcyBvbmx5IGVpZ2h0IGJpdHMgd2lkZSwgYW5kIHRoZSBhc3NlbWJsZXIKKyAgICA7IHdvbnQgZG8gdGhlIGRpcnQgd29yayBmb3IgdXMuICBBcyBsb25nIGFzIGRzYV9jaGVja19yZXNlbGVjdAorICAgIDsgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gc2lnbiBleHRlbmQgd2l0aCAxIGJpdHMgdG8gdGhlIGZ1bGwKKyAgICA7IDMyIGJpdCB3aWR0aCBvZiB0aGUgYWRkcmVzcy4KKyAgICA7CisgICAgOyBBIHBvdGVudGlhbCB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byBoYXZlIGEga25vd24gYWxpZ25tZW50IAorICAgIDsgb2YgdGhlIERTQSBzdHJ1Y3R1cmUgc3VjaCB0aGF0IHRoZSBiYXNlIGFkZHJlc3MgcGx1cyAKKyAgICA7IGRzYV9jaGVja19yZXNlbGVjdCBkb2Vzbid0IHJlcXVpcmUgY2FycnlpbmcgZnJvbSBieXRlcyAKKyAgICA7IGhpZ2hlciB0aGFuIHRoZSBMU0IuCisgICAgOworCisgICAgTU9WRSBEU0EwIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgKyBkc2FfY2hlY2tfcmVzZWxlY3QgVE8gU0NSQVRDSDAKKyAgICBNT1ZFIERTQTEgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiArIDB4ZmYgVE8gU0NSQVRDSDEgV0lUSCBDQVJSWQorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSICsgMHhmZiBUTyBTQ1JBVENIMiBXSVRIIENBUlJZCisgICAgTU9WRSBEU0EzIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgKyAweGZmIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkKKworICAgIERNT0RFX05DUl9UT19NRU1PUlkKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHJlc2VsZWN0ZWRfY2hlY2sgKyA0CisgICAgRE1PREVfTUVNT1JZX1RPX01FTU9SWQorI2lmIChDSElQID09IDcxMCkKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorI2VuZGlmCityZXNlbGVjdGVkX2NoZWNrOgorICAgIEpVTVAgMAorCisKKzsKKzsKKyNpZiAoQ0hJUCA9PSA3MTApCis7IFdlIGhhdmUgcHJvYmxlbXMgaGVyZSAtIHRoZSBtZW1vcnkgbW92ZSBjb3JydXB0cyBURU1QIGFuZCBEU0EuICBUaGlzCis7IHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gRFNBIGNvZGUsIGFuZCBwYXRjaGVkIGZyb20gbWFueSBwbGFjZXMuICBTY3JhdGNoCis7IGlzIHByb2JhYmx5IGZyZWUgd2hlbiBpdCBpcyBjYWxsZWQuCis7IFdlIGhhdmUgdG86Cis7ICAgY29weSB0ZW1wIHRvIHNjcmF0Y2gsIG9uZSBieXRlIGF0IGEgdGltZQorOyAgIHdyaXRlIHNjcmF0Y2ggdG8gcGF0Y2ggYSBqdW1wIGluIHBsYWNlIG9mIHRoZSByZXR1cm4KKzsgICBkbyB0aGUgbW92ZSBtZW1vcnkKKzsgICBqdW1wIHRvIHRoZSBwYXRjaGVkIGluIHJldHVybiBhZGRyZXNzCis7IERTQSBpcyBjb3JydXB0IHdoZW4gd2UgZ2V0IGhlcmUsIGFuZCBjYW4gYmUgbGVmdCBjb3JydXB0CisKK0VOVFJZIHJlc2VsZWN0ZWRfb2sKK3Jlc2VsZWN0ZWRfb2s6CisgICAgTU9WRSBURU1QMCBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisgICAgTU9WRSBURU1QMSBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisgICAgTU9WRSBURU1QMyBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCByZXNlbGVjdGVkX29rX2p1bXAgKyA0CityZXNlbGVjdGVkX29rX3BhdGNoOgorICAgIE1PVkUgTUVNT1JZIDQsIDAsIDAKK3Jlc2VsZWN0ZWRfb2tfanVtcDoKKyAgICBKVU1QIDAKKyNlbHNlCitFTlRSWSByZXNlbGVjdGVkX29rCityZXNlbGVjdGVkX29rOgorcmVzZWxlY3RlZF9va19wYXRjaDoKKyAgICBNT1ZFIE1FTU9SWSA0LCAwLCAwCQkJCTsgUGF0Y2hlZCA6IGZpcnN0IHdvcmQKKwkJCQkJCTsgCWlzIGFkZHJlc3Mgb2YgCisJCQkJCQk7ICAgICAgIHN1Y2Nlc3NmdWwgZHNhX25leHQKKwkJCQkJCTsgU2Vjb25kIHdvcmQgaXMgbGFzdCAKKwkJCQkJCTsJdW5zdWNjZXNzZnVsIGRzYV9uZXh0LAorCQkJCQkJOwlzdGFydGluZyB3aXRoIAorCQkJCQkJOyAgICAgICBkc2FfcmVjb25uZWN0X2hlYWQKKyAgICA7IFdlIHVzZWQgdG8gQ0xFQVIgQUNLIGhlcmUuCisjaWZkZWYgREVCVUcKKyAgICBJTlQgaW50X2RlYnVnX3Jlc2VsZWN0ZWRfb2sKKyNlbmRpZgorI2lmZGVmIERFQlVHCisgICAgSU5UIGludF9kZWJ1Z19jaGVja19kc2EKKyNlbmRpZgorICAgIFJFVFVSTgkJCQkJOyBSZXR1cm4gY29udHJvbCB0byB3aGVyZQorI2VuZGlmCisjZWxzZQorICAgIElOVCBpbnRfbm9ybV9yZXNlbGVjdGVkCisjZW5kaWYgLyogKENISVAgIT0gNzAwKSAmJiAoQ0hJUCAhPSA3MDA2NikgKi8KKworc2VsZWN0ZWQ6CisgICAgSU5UIGludF9lcnJfc2VsZWN0ZWQ7CisKKzsKKzsgQSBzZWxlY3Qgb3IgcmVzZWxlY3QgZmFpbHVyZSBjYW4gYmUgY2F1c2VkIGJ5IG9uZSBvZiB0d28gY29uZGl0aW9ucyA6IAorOyAxLiAgU0lHX1Agd2FzIHNldC4gIFRoaXMgd2lsbCBiZSB0aGUgY2FzZSBpZiB0aGUgdXNlciBoYXMgd3JpdHRlbgorOwlhIG5ldyB2YWx1ZSB0byBhIHByZXZpb3VzbHkgTlVMTCBoZWFkIG9mIHRoZSBpc3N1ZSBxdWV1ZS4KKzsKKzsgMi4gIFRoZSBOQ1I1M2M4MTAgd2FzIHNlbGVjdGVkIG9yIHJlc2VsZWN0ZWQgYnkgYW5vdGhlciBkZXZpY2UuCis7Cis7IDMuICBUaGUgYnVzIHdhcyBhbHJlYWR5IGJ1c3kgc2luY2Ugd2Ugd2VyZSBzZWxlY3RlZCBvciByZXNlbGVjdGVkCis7CWJlZm9yZSBzdGFydGluZyB0aGUgY29tbWFuZC4KKword2FpdF9yZXNlbGVjdF9mYWlsZWQ6CisjaWZkZWYgRVZFTlRTIAorCUlOVCBpbnRfRVZFTlRfUkVTRUxFQ1RfRkFJTEVECisjZW5kaWYKKzsgQ2hlY2sgc2VsZWN0ZWQgYml0LiAgCisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgTXVzdCB3b3JrIG91dCBob3cgdG8gdGVsbCBpZiB3ZSBhcmUgc2VsZWN0ZWQuLi4uCisjZWxzZQorICAgIE1PVkUgU0lTVDAgJiAweDIwIFRPIFNGQlIKKyAgICBKVU1QIHNlbGVjdGVkLCBJRiAweDIwCisjZW5kaWYKKzsgUmVhZGluZyBDVEVTVDIgY2xlYXJzIHRoZSBTSUdfUCBiaXQgaW4gdGhlIElTVEFUIHJlZ2lzdGVyLgorICAgIE1PVkUgQ1RFU1QyICYgMHg0MCBUTyBTRkJSCQorICAgIEpVTVAgc2NoZWR1bGUsIElGIDB4NDAKKzsgQ2hlY2sgY29ubmVjdGVkIGJpdC4gIAorOyBGSVhNRTogdGhpcyBuZWVkcyB0byBjaGFuZ2UgaWYgd2Ugc3VwcG9ydCB0YXJnZXQgbW9kZQorICAgIE1PVkUgSVNUQVQgJiAweDA4IFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MDgKKzsgRklYTUUgOiBTb21ldGhpbmcgYm9ndXMgaGFwcGVuZWQsIGFuZCB3ZSBzaG91bGRuJ3QgZmFpbCBzaWxlbnRseS4KKyNpZiAwCisgICAgSlVNUCBzY2hlZHVsZQorI2Vsc2UKKyAgICBJTlQgaW50X2RlYnVnX3BhbmljCisjZW5kaWYKKworCitzZWxlY3RfZmFpbGVkOgorI2lmIChDSElQID09IDcxMCkKKyAgICA7IERpc2FibGUgc2VsZWN0aW9uIHRpbWVyCisgICAgTU9WRSBDVEVTVDcgfCAweDEwIFRPIENURVNUNworI2VuZGlmCisjaWZkZWYgRVZFTlRTCisgIGludCBpbnRfRVZFTlRfU0VMRUNUX0ZBSUxFRAorI2VuZGlmCis7IE90aGVyd2lzZSwgbWFzayB0aGUgc2VsZWN0ZWQgYW5kIHJlc2VsZWN0ZWQgYml0cyBvZmYgU0lTVDAKKyNpZiAoQ0hJUCA9PTcxMCkKKyAgICA7IExldCdzIGFzc3VtZSB3ZSBkb24ndCBnZXQgc2VsZWN0ZWQgZm9yIG5vdworICAgIE1PVkUgU1NUQVQwICYgMHgxMCBUTyBTRkJSCisjZWxzZQorICAgIE1PVkUgU0lTVDAgJiAweDMwIFRPIFNGQlIKKyAgICBKVU1QIHNlbGVjdGVkLCBJRiAweDIwCisjZW5kaWYKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MTAgCis7IElmIFNJR1AgaXMgc2V0LCB0aGUgdXNlciBqdXN0IGdhdmUgdXMgYW5vdGhlciBjb21tYW5kLCBhbmQKKzsgd2Ugc2hvdWxkIHJlc3RhcnQgb3IgcmV0dXJuIHRvIHRoZSBzY2hlZHVsZXIuCis7IFJlYWRpbmcgQ1RFU1QyIGNsZWFycyB0aGUgU0lHX1AgYml0IGluIHRoZSBJU1RBVCByZWdpc3Rlci4KKyAgICBNT1ZFIENURVNUMiAmIDB4NDAgVE8gU0ZCUgkKKyAgICBKVU1QIHNlbGVjdCwgSUYgMHg0MAorOyBDaGVjayBjb25uZWN0ZWQgYml0LiAgCis7IEZJWE1FOiB0aGlzIG5lZWRzIHRvIGNoYW5nZSBpZiB3ZSBzdXBwb3J0IHRhcmdldCBtb2RlCis7IEZJWE1FOiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/IAorICAgIE1PVkUgSVNUQVQgJiAweDA4IFRPIFNGQlIKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MDgKKzsgRklYTUUgOiBTb21ldGhpbmcgYm9ndXMgaGFwcGVuZWQsIGFuZCB3ZSBzaG91bGRuJ3QgZmFpbCBzaWxlbnRseS4KKyNpZiAwCisgICAgSlVNUCBzY2hlZHVsZQorI2Vsc2UKKyAgICBJTlQgaW50X2RlYnVnX3BhbmljCisjZW5kaWYKKworOworOyB0ZXN0XzEKKzsgdGVzdF8yCis7Cis7IFBVUlBPU0UgOiBydW4gc29tZSB2ZXJpZmljYXRpb24gdGVzdHMgb24gdGhlIE5DUi4gIHRlc3RfMQorOwljb3BpZXMgdGVzdF9zcmMgdG8gdGVzdF9kZXN0IGFuZCBpbnRlcnJ1cHRzIHRoZSBob3N0Cis7CXByb2Nlc3NvciwgdGVzdGluZyBmb3IgY2FjaGUgY29oZXJlbmN5IGFuZCBpbnRlcnJ1cHQKKzsgCXByb2JsZW1zIGluIHRoZSBwcm9jZXNzZXMuCis7Cis7CXRlc3RfMiBydW5zIGEgY29tbWFuZCB3aXRoIG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIAorOwlEU0Egb24gZW50cnksIGFuZCBpcyB1c2VmdWwgZm9yIG1pc2NlbGxhbmVvdXMgZXhwZXJpbWVudGF0aW9uLgorOworCis7IFZlcmlmeSB0aGF0IGludGVycnVwdHMgYXJlIHdvcmtpbmcgY29ycmVjdGx5IGFuZCB0aGF0IHdlIGRvbid0IAorOyBoYXZlIGEgY2FjaGUgaW52YWxpZGF0aW9uIHByb2JsZW0uCisKK0FCU09MVVRFIHRlc3Rfc3JjID0gMCwgdGVzdF9kZXN0ID0gMAorRU5UUlkgdGVzdF8xCit0ZXN0XzE6CisgICAgTU9WRSBNRU1PUlkgNCwgdGVzdF9zcmMsIHRlc3RfZGVzdAorICAgIElOVCBpbnRfdGVzdF8xCisKKzsKKzsgUnVuIGFyYml0cmFyeSBjb21tYW5kcywgd2l0aCB0ZXN0IGNvZGUgZXN0YWJsaXNoaW5nIGEgRFNBCis7CisgCitFTlRSWSB0ZXN0XzIKK3Rlc3RfMjoKKyAgICBDTEVBUiBUQVJHRVQKKyNpZiAoQ0hJUCA9PSA3MTApCisgICAgOyBFbmFibGUgc2VsZWN0aW9uIHRpbWVyCisjaWZkZWYgTk9fU0VMRUNUSU9OX1RJTUVPVVQKKyAgICBNT1ZFIENURVNUNyAmIDB4ZmYgVE8gQ1RFU1Q3CisjZWxzZQorICAgIE1PVkUgQ1RFU1Q3ICYgMHhlZiBUTyBDVEVTVDcKKyNlbmRpZgorI2VuZGlmCisgICAgU0VMRUNUIEFUTiBGUk9NIDAsIHRlc3RfMl9mYWlsCisgICAgSlVNUCB0ZXN0XzJfbXNnb3V0LCBXSEVOIE1TR19PVVQKK0VOVFJZIHRlc3RfMl9tc2dvdXQKK3Rlc3RfMl9tc2dvdXQ6CisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisjZW5kaWYKKyAgICBNT1ZFIEZST00gOCwgV0hFTiBNU0dfT1VUCisgICAgTU9WRSBGUk9NIDE2LCBXSEVOIENNRCAKKyAgICBNT1ZFIEZST00gMjQsIFdIRU4gREFUQV9JTgorICAgIE1PVkUgRlJPTSAzMiwgV0hFTiBTVEFUVVMKKyAgICBNT1ZFIEZST00gNDAsIFdIRU4gTVNHX0lOCisjaWYgKENISVAgIT0gNzEwKQorICAgIE1PVkUgU0NOVEwyICYgMHg3ZiBUTyBTQ05UTDIKKyNlbmRpZgorICAgIENMRUFSIEFDSworICAgIFdBSVQgRElTQ09OTkVDVAordGVzdF8yX2ZhaWw6CisjaWYgKENISVAgPT0gNzEwKQorICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisjZW5kaWYKKyAgICBJTlQgaW50X3Rlc3RfMgorCitFTlRSWSBkZWJ1Z19icmVhaworZGVidWdfYnJlYWs6CisgICAgSU5UIGludF9kZWJ1Z19icmVhaworCis7Cis7IGluaXRpYXRvcl9hYm9ydAorOyB0YXJnZXRfYWJvcnQKKzsKKzsgUFVSUE9TRSA6IEFib3J0IHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV4dXMgZnJvbSB3aXRoIGluaXRpYXRvcgorOwlvciB0YXJnZXQgbW9kZS4KKzsKKzsgIAorCitFTlRSWSB0YXJnZXRfYWJvcnQKK3RhcmdldF9hYm9ydDoKKyAgICBTRVQgVEFSR0VUCisgICAgRElTQ09OTkVDVAorICAgIENMRUFSIFRBUkdFVAorICAgIEpVTVAgc2NoZWR1bGUKKyAgICAKK0VOVFJZIGluaXRpYXRvcl9hYm9ydAoraW5pdGlhdG9yX2Fib3J0OgorICAgIFNFVCBBVE4KKzsKKzsgVGhlIFNDU0ktSSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCB0YXJnZXRzIG1heSBnbyBpbnRvIE1TRyBvdXQgYXQgCis7IHRoZWlyIGxlaXN1cmUgdXBvbiByZWNlaXB0IG9mIHRoZSBBVE4gc2luZ2xlLiAgT24gYWxsIHZlcnNpb25zIG9mIHRoZSAKKzsgc3BlY2lmaWNhdGlvbiwgd2UgY2FuJ3QgY2hhbmdlIHBoYXNlcyB1bnRpbCBSRVEgdHJhbnNpdGlvbnMgdHJ1ZS0+ZmFsc2UsIAorOyBzbyB3ZSBuZWVkIHRvIHNpbmsvc291cmNlIG9uZSBieXRlIG9mIGRhdGEgdG8gYWxsb3cgdGhlIHRyYW5zaXRpb24uCis7Cis7IEZvciB0aGUgc2FrZSBvZiBzYWZldHksIHdlJ2xsIG9ubHkgc291cmNlIG9uZSBieXRlIG9mIGRhdGEgaW4gYWxsIAorOyBjYXNlcywgYnV0IHRvIGFjY29tbW9kYXRlIHRoZSBTQ1NJLUkgZGFpbiBicmFtYWdlLCB3ZSdsbCBzaW5rIGFuICAKKzsgYXJiaXRyYXJ5IG51bWJlciBvZiBieXRlcy4KKyAgICBKVU1QIHNwZXdfY21kLCBXSEVOIENNRAorICAgIEpVTVAgZWF0X21zZ2luLCBXSEVOIE1TR19JTgorICAgIEpVTVAgZWF0X2RhdGFpbiwgV0hFTiBEQVRBX0lOCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworICAgIEpVTVAgc3Bld19kYXRhb3V0LCBXSEVOIERBVEFfT1VUCisgICAgSlVNUCBzYXRlZAorc3Bld19jbWQ6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfemVybywgV0hFTiBDTUQKKyAgICBKVU1QIHNhdGVkCitlYXRfbXNnaW46CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfc2luaywgV0hFTiBNU0dfSU4KKyAgICBKVU1QIGVhdF9tc2dpbiwgV0hFTiBNU0dfSU4KKyAgICBKVU1QIHNhdGVkCitlYXRfc3RhdHVzOgorICAgIE1PVkUgMSwgTkNSNTNjN3h4X3NpbmssIFdIRU4gU1RBVFVTCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworICAgIEpVTVAgc2F0ZWQKK2VhdF9kYXRhaW46CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfc2luaywgV0hFTiBEQVRBX0lOCisgICAgSlVNUCBlYXRfZGF0YWluLCBXSEVOIERBVEFfSU4KKyAgICBKVU1QIHNhdGVkCitzcGV3X2RhdGFvdXQ6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfemVybywgV0hFTiBEQVRBX09VVAorc2F0ZWQ6CisjaWYgKENISVAgIT0gNzEwKQorICAgIE1PVkUgU0NOVEwyICYgMHg3ZiBUTyBTQ05UTDIKKyNlbmRpZgorICAgIE1PVkUgMSwgTkNSNTNjN3h4X21zZ19hYm9ydCwgV0hFTiBNU0dfT1VUCisgICAgV0FJVCBESVNDT05ORUNUCisgICAgSU5UIGludF9ub3JtX2Fib3J0ZWQKKworI2lmIChDSElQICE9IDcxMCkKKzsKKzsgZHNhX3RvX3NjcmF0Y2gKKzsgc2NyYXRjaF90b19kc2EKKzsKKzsgUFVSUE9TRSA6Cis7IAlUaGUgTkNSIGNoaXBzIGNhbm5vdCBkbyBhIG1vdmUgbWVtb3J5IGluc3RydWN0aW9uIHdpdGggdGhlIERTQSByZWdpc3RlciAKKzsgCWFzIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24uICBTbywgd2UgcHJvdmlkZSBhIGNvdXBsZSBvZiBzdWJyb3V0aW5lcworOyAJdGhhdCBsZXQgdXMgc3dpdGNoIGJldHdlZW4gdGhlIERTQSByZWdpc3RlciBhbmQgc2NyYXRjaCByZWdpc3Rlci4KKzsKKzsgCU1lbW9yeSBtb3ZlcyB0by9mcm9tIHRoZSBEU1BTICByZWdpc3RlciBhbHNvIGRvbid0IHdvcmssIGJ1dCB3ZSAKKzsgCWRvbid0IHVzZSB0aGVtLgorOworOworCisgCitkc2FfdG9fc2NyYXRjaDoKKyAgICBNT1ZFIERTQTAgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMAorICAgIE1PVkUgRFNBMSBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisgICAgTU9WRSBEU0EyIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDIKKyAgICBNT1ZFIERTQTMgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMworICAgIFJFVFVSTgorCitzY3JhdGNoX3RvX2RzYToKKyAgICBNT1ZFIFNDUkFUQ0gwIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgVE8gRFNBMAorICAgIE1PVkUgU0NSQVRDSDEgVE8gU0ZCUgorICAgIE1PVkUgU0ZCUiBUTyBEU0ExCisgICAgTU9WRSBTQ1JBVENIMiBUTyBTRkJSCisgICAgTU9WRSBTRkJSIFRPIERTQTIKKyAgICBNT1ZFIFNDUkFUQ0gzIFRPIFNGQlIKKyAgICBNT1ZFIFNGQlIgVE8gRFNBMworICAgIFJFVFVSTgorI2VuZGlmCisgCisjaWYgKENISVAgPT0gNzEwKQorOyBMaXR0bGUgcGF0Y2hlZCBqdW1wLCB1c2VkIHRvIG92ZXJjb21lIHByb2JsZW1zIHdpdGggVEVNUCBnZXR0aW5nCis7IGNvcnJ1cHRlZCBvbiBtZW1vcnkgbW92ZXMuCisKK2p1bXBfdGVtcDoKKyAgICBKVU1QIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpLzUzYzd4eF9kLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS81M2M3eHhfZC5oX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkMzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3eHhfZC5oX3NoaXBwZWQKQEAgLTAsMCArMSwyODc0IEBACisvKiBETyBOT1QgRURJVCAtIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdF9hc20ucGwgKi8KK3N0YXRpYyB1MzIgU0NSSVBUW10gPSB7CisvKgorCisKKworCisKKzsgNTNjNzEwIGRyaXZlci4gIE1vZGlmaWVkIGZyb20gRHJldyBFY2toYXJkdHMgZHJpdmVyCis7IGZvciA1M2M4MTAgYnkgUmljaGFyZCBIaXJzdCBbcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrXQorOworOyBJIGhhdmUgbGVmdCB0aGUgc2NyaXB0IGZvciB0aGUgNTNjOHh4IGZhbWlseSBpbiBoZXJlLCBhcyBpdCBpcyBsaWtlbHkKKzsgdG8gYmUgdXNlZnVsIHRvIHNlZSB3aGF0IEkgY2hhbmdlZCB3aGVuIGJ1ZyBodW50aW5nLgorCis7IE5DUiA1M2M4MTAgZHJpdmVyLCBtYWluIHNjcmlwdAorOyBTcG9uc29yZWQgYnkgCis7CWlYIE11bHRpdXNlciBNdWx0aXRhc2tpbmcgTWFnYXppbmUKKzsJaG1AaXguZGUKKzsKKzsgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUgRHJldyBFY2toYXJkdAorOyAgICAgIFZpc2lvbmFyeSBDb21wdXRpbmcgCis7ICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKzsgICAgICBkcmV3QFBvb2hTdGlja3MuT1JHCis7ICAgICAgKzEgKDMwMykgNzg2LTc5NzUKKzsKKzsgVG9sZXJBTlQgYW5kIFNDU0kgU0NSSVBUUyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE5DUiBDb3Jwb3JhdGlvbi4KKzsKKzsgUFJFLUFMUEhBCis7Cis7IEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCAKKzsKKzsgTkNSIDUzQzgxMAorOyBQQ0ktU0NTSSBJL08gUHJvY2Vzc29yCis7IERhdGEgTWFudWFsCis7Cis7IE5DUiA1M0M3MTAgCis7IFNDU0kgSS9PIFByb2Nlc3NvcgorOyBQcm9ncmFtbWVycyBHdWlkZQorOworOyBOQ1IgTWljcm9lbGVjdHJvbmljcworOyAxNjM1IEFlcm9wbGF6YSBEcml2ZQorOyBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorOyAxKyAoNzE5KSA1NzgtMzQwMAorOworOyBUb2xsIGZyZWUgbGl0ZXJhdHVyZSBudW1iZXIKKzsgKzEgKDgwMCkgMzM0LTU0NTQKKzsKKzsgSU1QT1JUQU5UIDogVGhpcyBjb2RlIGlzIHNlbGYgbW9kaWZ5aW5nIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2YgCis7CXRoZSBOQ1I1M2M3LDh4eCBzZXJpZXMgY2hpcHMuICBQZXJzb25zIGRlYnVnZ2luZyB0aGlzIGNvZGUgd2l0aAorOwl0aGUgcmVtb3RlIGRlYnVnZ2VyIHNob3VsZCB0YWtlIHRoaXMgaW50byBhY2NvdW50LCBhbmQgTk9UIHNldAorOwlicmVha3BvaW50cyBpbiBtb2RpZmllZCBpbnN0cnVjdGlvbnMuCis7Cis7IERlc2lnbjoKKzsgVGhlIE5DUjUzYzcsOHh4IGZhbWlseSBvZiBTQ1NJIGNoaXBzIGFyZSBidXNtYXN0ZXJzIHdpdGggYW4gb25ib2FyZCAKKzsgbWljcm9jb250cm9sbGVyIHVzaW5nIGEgc2ltcGxlIGluc3RydWN0aW9uIHNldC4gICAKKzsKKzsgU28sIHRvIG1pbmltaXplIHRoZSBlZmZlY3RzIG9mIGludGVycnVwdCBsYXRlbmN5LCBhbmQgdG8gbWF4aW1pemUgCis7IHRocm91Z2hwdXQsIHRoaXMgZHJpdmVyIG9mZmxvYWRzIHRoZSBwcmFjdGljYWwgbWF4aW11bSBhbW91bnQgCis7IG9mIHByb2Nlc3NpbmcgdG8gdGhlIFNDU0kgY2hpcCB3aGlsZSBzdGlsbCBtYWludGFpbmluZyBhIGNvbW1vbgorOyBzdHJ1Y3R1cmUuCis7Cis7IFdoZXJlIHRyYWRlb2ZmcyB3ZXJlIG5lZWRlZCBiZXR3ZWVuIGVmZmljaWVuY3kgb24gdGhlIG9sZGVyCis7IGNoaXBzIGFuZCB0aGUgbmV3ZXIgTkNSNTNjODAwIHNlcmllcywgdGhlIE5DUjUzYzgwMCBzZXJpZXMgCis7IHdhcyBjaG9zZW4uCis7Cis7IFdoaWxlIHRoZSBOQ1I1M2M3MDAgYW5kIE5DUjUzYzcwMC02NiBsYWNrZWQgdGhlIGZhY2lsaXRpZXMgdG8gZnVsbHkKKzsgYXV0b21hdGUgU0NTSSB0cmFuc2ZlcnMgd2l0aG91dCBob3N0IHByb2Nlc3NvciBpbnRlcnZlbnRpb24sIHRoaXMgCis7IGlzbid0IHRoZSBjYXNlIHdpdGggdGhlIE5DUjUzYzcxMCBhbmQgbmV3ZXIgY2hpcHMgd2hpY2ggYWxsb3cgCis7Cis7IC0gcmVhZHMgYW5kIHdyaXRlcyB0byB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJzIGZyb20gd2l0aGluIHRoZSBTQ1NJCis7IAlzY3JpcHRzLCBhbGxvd2luZyB0aGUgU0NTSSBTQ1JJUFRTKHRtKSBjb2RlIHRvIHNhdmUgcHJvY2Vzc29yCis7IAlzdGF0ZSBzbyB0aGF0IG11bHRpcGxlIHRocmVhZHMgb2YgZXhlY3V0aW9uIGFyZSBwb3NzaWJsZSwgYW5kIGFsc28KKzsgCXByb3ZpZGUgYW4gQUxVIGZvciBsb29wIGNvbnRyb2wsIGV0Yy4KKzsgCis7IC0gdGFibGUgaW5kaXJlY3QgYWRkcmVzc2luZyBmb3Igc29tZSBpbnN0cnVjdGlvbnMuIFRoaXMgYWxsb3dzIAorOwlwb2ludGVycyB0byBiZSBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoZSBEU0EgKChEYXRhIFN0cnVjdHVyZQorOwlBZGRyZXNzKSByZWdpc3Rlci4KKzsKKzsgVGhlc2UgZmVhdHVyZXMgbWFrZSBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBtYWlsYm94IHN0eWxlIGludGVyZmFjZSwKKzsgd2hlcmUgdGhlIHNhbWUgcGllY2Ugb2YgY29kZSBpcyBydW4gdG8gaGFuZGxlIEkvTyBmb3IgbXVsdGlwbGUgdGhyZWFkcworOyBhdCBvbmNlIG1pbmltaXppbmcgb3VyIG5lZWQgdG8gcmVsb2NhdGUgY29kZS4gIFNpbmNlIHRoZSBOQ1I1M2M3MDAvCis7IE5DUjUzYzgwMCBzZXJpZXMgaGF2ZSBhIHVuaXF1ZSBjb21iaW5hdGlvbiBvZiBmZWF0dXJlcywgbWFraW5nIGEgCis7IGEgc3RhbmRhcmQgaW5nb2luZy9vdXRnb2luZyBtYWlsYm94IHN5c3RlbSwgY29zdGx5LCBJJ3ZlIG1vZGlmaWVkIGl0LgorOworOyAtIE1haWxib3hlcyBhcmUgYSBtaXh0dXJlIG9mIGNvZGUgYW5kIGRhdGEuICBUaGlzIGxldHMgdXMgZ3JlYXRseQorOyAJc2ltcGxpZnkgdGhlIE5DUjUzYzgxMCBjb2RlIGFuZCBkbyB0aGluZ3MgdGhhdCB3b3VsZCBvdGhlcndpc2UKKzsJbm90IGJlIHBvc3NpYmxlLgorOworOyBUaGUgc2F2ZWQgZGF0YSBwb2ludGVyIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzIDoKKzsKKzsgCUNvbnRyb2wgZmxvdyBoYXMgYmVlbiBhcmNoaXRlY3RlZCBzdWNoIHRoYXQgaWYgY29udHJvbCByZWFjaGVzCis7CW11bmdlX3NhdmVfZGF0YV9wb2ludGVyLCBvbiBhIHJlc3RvcmUgcG9pbnRlcnMgbWVzc2FnZSBvciAKKzsJcmVjb25uZWN0aW9uLCBhIGp1bXAgdG8gdGhlIGFkZHJlc3MgZm9ybWVybHkgaW4gdGhlIFRFTVAgcmVnaXN0ZXIKKzsJd2lsbCBhbGxvdyB0aGUgU0NTSSBjb21tYW5kIHRvIHJlc3VtZSBleGVjdXRpb24uCis7CisKKzsKKzsgTm90ZSA6IHRoZSBEU0Egc3RydWN0dXJlcyBtdXN0IGJlIGFsaWduZWQgb24gMzIgYml0IGJvdW5kYXJpZXMsCis7IHNpbmNlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIE1PVkUgTUVNT1JZIGluc3RydWN0aW9ucyAKKzsgbXVzdCBzaGFyZSB0aGUgc2FtZSBhbGlnbm1lbnQgYW5kIHRoaXMgaXMgdGhlIGFsaWdubWVudCBvZiB0aGUKKzsgTkNSIHJlZ2lzdGVycy4KKzsKKworOyBGb3Igc29tZSBzeXN0ZW1zIChNVk1FMTY2LCBmb3IgZXhhbXBsZSkgZG1vZGUgaXMgYWx3YXlzIHRoZSBzYW1lLCBzbyBkb24ndAorOyB3YXN0ZSB0aW1lIHdyaXRpbmcgaXQKKworCisKKworCisKKworCisKKworCitBQlNPTFVURSBkc2FfdGVtcF9sdW4gPSAwCQk7IFBhdGNoIHRvIGx1biBmb3IgY3VycmVudCBkc2EKK0FCU09MVVRFIGRzYV90ZW1wX25leHQgPSAwCQk7IFBhdGNoIHRvIGRzYSBuZXh0IGZvciBjdXJyZW50IGRzYQorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9uZXh0ID0gMAkJOyBQYXRjaCB0byBhZGRyZXNzIG9mIGRzYSBuZXh0IGFkZHJlc3MgCisJCQkJCTsgCWZvciBjdXJyZW50IGRzYQorQUJTT0xVVEUgZHNhX3RlbXBfc3luYyA9IDAJCTsgUGF0Y2ggdG8gYWRkcmVzcyBvZiBwZXItdGFyZ2V0CisJCQkJCTsJc3luYyByb3V0aW5lCitBQlNPTFVURSBkc2Ffc3NjZl83MTAgPSAwCQk7IFBhdGNoIHRvIGFkZHJlc3Mgb2YgcGVyLXRhcmdldAorCQkJCQk7CXNzY2YgdmFsdWUgKDUzYzcxMCkKK0FCU09MVVRFIGRzYV90ZW1wX3RhcmdldCA9IDAJCTsgUGF0Y2ggdG8gaWQgZm9yIGN1cnJlbnQgZHNhCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIgPSAwOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci1jb21tYW5kCisJCQkJCTsgCXNhdmVkIGRhdGEgcG9pbnRlcgorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9yZXNpZHVhbCA9IDAJOyBQYXRjaCB0byBhZGRyZXNzIG9mIHBlci1jb21tYW5kCisJCQkJCTsJY3VycmVudCByZXNpZHVhbCBjb2RlCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsID0gMDsgUGF0Y2ggdG8gYWRkcmVzcyBvZiBwZXItY29tbWFuZAorCQkJCQk7IHNhdmVkIHJlc2lkdWFsIGNvZGUKK0FCU09MVVRFIGRzYV90ZW1wX2FkZHJfbmV3X3ZhbHVlID0gMAk7IEFkZHJlc3Mgb2YgdmFsdWUgZm9yIEpVTVAgb3BlcmFuZAorQUJTT0xVVEUgZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZSA9IDAgCTsgQWRkcmVzcyB0byBjb3B5IHRvCitBQlNPTFVURSBkc2FfdGVtcF9hZGRyX2RzYV92YWx1ZSA9IDAJOyBBZGRyZXNzIG9mIHRoaXMgRFNBIHZhbHVlCisKKzsKKzsgT25jZSBhIGRldmljZSBoYXMgaW5pdGlhdGVkIHJlc2VsZWN0aW9uLCB3ZSBuZWVkIHRvIGNvbXBhcmUgaXQgCis7IGFnYWluc3QgdGhlIHNpbmdseSBsaW5rZWQgbGlzdCBvZiBjb21tYW5kcyB3aGljaCBoYXZlIGRpc2Nvbm5lY3RlZAorOyBhbmQgYXJlIHBlbmRpbmcgcmVzZWxlY3Rpb24uICBUaGVzZSBjb21tYW5kcyBhcmUgbWFpbnRhaW5lZCBpbiAKKzsgYW4gdW5vcmRlcmVkIHNpbmdseSBsaW5rZWQgbGlzdCBvZiBEU0Egc3RydWN0dXJlcywgdGhyb3VnaCB0aGUKKzsgRFNBIHBvaW50ZXJzIGF0IHRoZWlyICdjZW50ZXJzJyBoZWFkZWQgYnkgdGhlIHJlY29ubmVjdF9kc2FfaGVhZAorOyBwb2ludGVyLgorOyAKKzsgVG8gYXZvaWQgY29tcGxpY2F0aW9ucyBpbiByZW1vdmluZyBjb21tYW5kcyBmcm9tIHRoZSBsaXN0LAorOyBJIG1pbmltaXplIHRoZSBhbW91bnQgb2YgZXhwZW5zaXZlIChhdCBlaWdodCBvcGVyYXRpb25zIHBlcgorOyBhZGRpdGlvbiBAIDUwMC02MDBucyBlYWNoKSBwb2ludGVyIG9wZXJhdGlvbnMgd2hpY2ggbXVzdAorOyBiZSBkb25lIGluIHRoZSBOQ1IgZHJpdmVyIGJ5IHByZWNvbXB1dGluZyB0aGVtIG9uIHRoZSAKKzsgaG9zdCBwcm9jZXNzb3IgZHVyaW5nIGRzYSBzdHJ1Y3R1cmUgZ2VuZXJhdGlvbi4KKzsKKzsgVGhlIGZpeGVkLXVwIHBlciBEU0EgY29kZSBrbm93cyBob3cgdG8gcmVjb2duaXplIHRoZSBuZXh1cworOyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgU0NTSSBjb21tYW5kLCBhbmQgbW9kaWZpZXMKKzsgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgZm9yIHRoZSBNT1ZFIE1FTU9SWSAKKzsgaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiByZXNlbGVjdGVkX29rIGlzIGNhbGxlZAorOyB0byByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSB0aGUgbGlzdC4gIFNpbWlsYXJseSwgRFNBIGlzIAorOyBsb2FkZWQgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBEU0Egc3RydWN0dXJlIGFuZAorOyByZXNlbGVjdGVkX2NoZWNrX25leHQgaXMgY2FsbGVkIGlmIGEgZmFpbHVyZSBvY2N1cnMuCis7Cis7IFBlcmhhcHMgbW9yZSBjb25jaXNlbHksIHRoZSBuZXQgZWZmZWN0IG9mIHRoZSBtZXNzIGlzIAorOworOyBmb3IgKGRzYSA9IHJlY29ubmVjdF9kc2FfaGVhZCwgZGVzdCA9ICZyZWNvbm5lY3RfZHNhX2hlYWQsIAorOyAgICAgc3JjID0gTlVMTDsgZHNhOyBkZXN0ID0gJmRzYS0+bmV4dCwgZHNhID0gZHNhLT5uZXh0KSB7Cis7IAlzcmMgPSAmZHNhLT5uZXh0OworOyAJaWYgKHRhcmdldF9pZCA9PSBkc2EtPmlkICYmIHRhcmdldF9sdW4gPT0gZHNhLT5sdW4pIHsKKzsgCQkqZGVzdCA9ICpzcmM7Cis7IAkJYnJlYWs7Cis7ICAgICAgICAgfQkKKzsgfQorOworOyBpZiAoIWRzYSkKKzsgICAgICAgICAgIGVycm9yIChpbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QpOworOyBlbHNlICAKKzsgICAgIGxvbmdqbXAgKGRzYS0+anVtcF9yZXN1bWUsIDApOworOworOyAJCisKKworOyBEZWZpbmUgRFNBIHN0cnVjdHVyZSB1c2VkIGZvciBtYWlsYm94ZXMKK0VOVFJZIGRzYV9jb2RlX3RlbXBsYXRlCitkc2FfY29kZV90ZW1wbGF0ZToKK0VOVFJZIGRzYV9jb2RlX2JlZ2luCitkc2FfY29kZV9iZWdpbjoKKzsgUkdIOiBEb24ndCBjYXJlIGFib3V0IFRFTVAgYW5kIERTQSBoZXJlCisJCisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9kc2FfdmFsdWUsIGFkZHJfc2NyYXRjaAorCithdCAweDAwMDAwMDAwIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCQorCisJTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBzYXZlZF9kc2EKKworYXQgMHgwMDAwMDAwMyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwk7IFdlIGFyZSBhYm91dCB0byBnbyBhbmQgc2VsZWN0IHRoZSBkZXZpY2UsIHNvIG11c3Qgc2V0IFNTQ0YgYml0cworCU1PVkUgTUVNT1JZIDQsIGRzYV9zc2NmXzcxMCwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwMDYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKwlNT1ZFIFNDUkFUQ0gzIFRPIFNGQlIKKworYXQgMHgwMDAwMDAwOSA6ICovCTB4NzIzNzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisJTU9WRSBTRkJSIFRPIFNCQ0wKKworYXQgMHgwMDAwMDAwYiA6ICovCTB4NmEwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDBkIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCUNBTEwgc2VsZWN0CisKK2F0IDB4MDAwMDAwMTAgOiAqLwkweDg4MDgwMDAwLDB4MDAwMDAxZjgsCisvKgorOyBIYW5kbGUgdGhlIHBoYXNlIG1pc21hdGNoIHdoaWNoIG1heSBoYXZlIHJlc3VsdGVkIGZyb20gdGhlIAorOyBNT1ZFIEZST00gZHNhX21zZ291dCBpZiB3ZSByZXR1cm5lZCBoZXJlLiAgVGhlIENMRUFSIEFUTiAKKzsgbWF5IG9yIG1heSBub3QgYmUgbmVjZXNzYXJ5LCBhbmQgd2Ugc2hvdWxkIHVwZGF0ZSBzY3JpcHRfYXNtLnBsCis7IHRvIGhhbmRsZSBtdWx0aXBsZSBwaWVjZXMuCisgICAgQ0xFQVIgQVROCisKK2F0IDB4MDAwMDAwMTIgOiAqLwkweDYwMDAwMDA4LDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMDE0IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKworOyBSZXBsYWNlIHNlY29uZCBvcGVyYW5kIHdpdGggYWRkcmVzcyBvZiBKVU1QIGluc3RydWN0aW9uIGRlc3Qgb3BlcmFuZAorOyBpbiBzY2hlZHVsZSB0YWJsZSBmb3IgdGhpcyBEU0EuICBCZWNvbWVzIGRzYV9qdW1wX2Rlc3QgaW4gNTNjNyw4eHguYy4KK0VOVFJZIGRzYV9jb2RlX2ZpeF9qdW1wCitkc2FfY29kZV9maXhfanVtcDoKKwlNT1ZFIE1FTU9SWSA0LCBOT1BfaW5zbiwgMAorCithdCAweDAwMDAwMDE2IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCUpVTVAgc2VsZWN0X2RvbmUKKworYXQgMHgwMDAwMDAxOSA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDIzMCwKKy8qCisKKzsgd3JvbmdfZHNhIGxvYWRzIHRoZSBEU0EgcmVnaXN0ZXIgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGRzYV9uZXh0Cis7IGZpZWxkLgorOword3JvbmdfZHNhOgorCis7ICAgICAgICAgICAgICAgIE5PVEUgRFNBIGlzIGNvcnJ1cHQgd2hlbiB3ZSBhcnJpdmUgaGVyZSEKKworOwkJUGF0Y2ggdGhlIE1PVkUgTUVNT1JZIElOU1RSVUNUSU9OIHN1Y2ggdGhhdCAKKzsJCXRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBPTEQgCis7CQluZXh0IHBvaW50ZXIuCis7CisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9uZXh0LCByZXNlbGVjdGVkX29rX3BhdGNoICsgOAorCithdCAweDAwMDAwMDFiIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA3ZWMsCisvKgorCQorOworOyAJTW92ZSB0aGUgX2NvbnRlbnRzXyBvZiB0aGUgbmV4dCBwb2ludGVyIGludG8gdGhlIERTQSByZWdpc3RlciBhcyAKKzsJdGhlIG5leHQgSV9UX0wgb3IgSV9UX0xfUSB0dXBwbGUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZXN0YWJsaXNoZWQKKzsJbmV4dXMuCis7CisJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfbmV4dCwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwMWUgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisJCisKKwlNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHNhdmVkX2RzYQorCithdCAweDAwMDAwMDIxIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDAyNCA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKwlKVU1QIHJlc2VsZWN0ZWRfY2hlY2tfbmV4dAorCithdCAweDAwMDAwMDI3IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwNmYwLAorLyoKKworQUJTT0xVVEUgZHNhX3NhdmVfZGF0YV9wb2ludGVyID0gMAorRU5UUlkgZHNhX2NvZGVfc2F2ZV9kYXRhX3BvaW50ZXIKK2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyOgorCisJOyBXaGVuIHdlIGdldCBoZXJlLCBURU1QIGhhcyBiZWVuIHNhdmVkIGluIGp1bXBfdGVtcCs0LCBEU0EgaXMgY29ycnVwdAorCTsgV2UgTVVTVCByZXR1cm4gd2l0aCBEU0EgY29ycmVjdAorICAgIAlNT1ZFIE1FTU9SWSA0LCBqdW1wX3RlbXArNCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9wb2ludGVyCisKK2F0IDB4MDAwMDAwMjkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDA5YzgsMHgwMDAwMDAwMCwKKy8qCis7IEhBUkQgQ09ERUQgOiAyNCBieXRlcyBuZWVkcyB0byBhZ3JlZSB3aXRoIDUzYzcsOHh4LmgKKyAgICAJTU9WRSBNRU1PUlkgMjQsIGRzYV90ZW1wX2FkZHJfcmVzaWR1YWwsIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwKKworYXQgMHgwMDAwMDAyYyA6ICovCTB4YzAwMDAwMTgsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwMmYgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCisKKworCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDAzMSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKwlKVU1QIGp1bXBfdGVtcAorCithdCAweDAwMDAwMDM0IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWM0LAorLyoKKworQUJTT0xVVEUgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgPSAwCitFTlRSWSBkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzCitkc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzOgorCisJOyBURU1QIGFuZCBEU0EgYXJlIGNvcnJ1cHQgd2hlbiB3ZSBnZXQgaGVyZSwgYnV0IHdobyBjYXJlcyEKKyAgICAJTU9WRSBNRU1PUlkgNCwgZHNhX3RlbXBfYWRkcl9zYXZlZF9wb2ludGVyLCBqdW1wX3RlbXAgKyA0CisKK2F0IDB4MDAwMDAwMzYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDljOCwKKy8qCis7IEhBUkQgQ09ERUQgOiAyNCBieXRlcyBuZWVkcyB0byBhZ3JlZSB3aXRoIDUzYzcsOHh4LmgKKyAgICAJTU9WRSBNRU1PUlkgMjQsIGRzYV90ZW1wX2FkZHJfc2F2ZWRfcmVzaWR1YWwsIGRzYV90ZW1wX2FkZHJfcmVzaWR1YWwKKworYXQgMHgwMDAwMDAzOSA6ICovCTB4YzAwMDAwMTgsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwM2MgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCTsgUmVzdG9yZSBEU0EsIG5vdGUgd2UgZG9uJ3QgY2FyZSBhYm91dCBURU1QCisJTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDNlIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCUpVTVAganVtcF90ZW1wCisKK2F0IDB4MDAwMDAwNDEgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA5YzQsCisvKgorCisKK0FCU09MVVRFIGRzYV9jaGVja19yZXNlbGVjdCA9IDAKKzsgZHNhX2NoZWNrX3Jlc2VsZWN0IGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgdGFyZ2V0IGFuZAorOyBsdW4gbWF0Y2ggdGhlIGN1cnJlbnQgRFNBCitFTlRSWSBkc2FfY29kZV9jaGVja19yZXNlbGVjdAorZHNhX2NvZGVfY2hlY2tfcmVzZWxlY3Q6CisKKwkKKwkKKwlNT1ZFIExDUkMgVE8gU0ZCUgkJOyBMQ1JDIGhhcyBvdXIgSUQgYW5kIGhpcyBJRCBiaXRzIHNldAorCithdCAweDAwMDAwMDQzIDogKi8JMHg3MjIzMDAwMCwweDAwMDAwMDAwLAorLyoKKwlKVU1QIFJFTCAod3JvbmdfZHNhKSwgSUYgTk9UIGRzYV90ZW1wX3RhcmdldCwgQU5EIE1BU0sgMHg4MAorCithdCAweDAwMDAwMDQ1IDogKi8JMHg4MDg0ODAwMCwweDAwZmZmZjUwLAorLyoKKworCisKKworCis7Cis7IEhhY2sgLSBtb3ZlIHRvIHNjcmF0Y2ggZmlyc3QsIHNpbmNlIFNGQlIgaXMgbm90IHdyaXRlYWJsZQorOyAJdmlhIHRoZSBDUFUgYW5kIGhlbmNlIGEgTU9WRSBNRU1PUlkgaW5zdHJ1Y3Rpb24uCis7CisJCisJTU9WRSBNRU1PUlkgMSwgcmVzZWxlY3RlZF9pZGVudGlmeSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwNDcgOiAqLwkweGMwMDAwMDAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisJCisKKwk7IEJJRyBFTkRJQU4gT04gTVZNRTE2eAorCU1PVkUgU0NSQVRDSDMgVE8gU0ZCUgorCithdCAweDAwMDAwMDRhIDogKi8JMHg3MjM3MDAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKzsgRklYTUUgOiB3ZSBuZWVkIHRvIGFjY29tbW9kYXRlIGJpdCBmaWVsZGVkIGFuZCBiaW5hcnkgaGVyZSBmb3IgJzd4eC8nOHh4IGNoaXBzCis7IEFyZSB5b3Ugc3VyZSBhYm91dCB0aGF0PyAgcmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrCisJSlVNUCBSRUwgKHdyb25nX2RzYSksIElGIE5PVCBkc2FfdGVtcF9sdW4sIEFORCBNQVNLIDB4ZjgKKworYXQgMHgwMDAwMDA0YyA6ICovCTB4ODA4NGY4MDAsMHgwMGZmZmYzNCwKKy8qCis7CQlQYXRjaCB0aGUgTU9WRSBNRU1PUlkgSU5TVFJVQ1RJT04gc3VjaCB0aGF0Cis7CQl0aGUgc291cmNlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhpcyBkc2EncworOwkJbmV4dCBwb2ludGVyLgorCU1PVkUgTUVNT1JZIDQsIGRzYV90ZW1wX2FkZHJfbmV4dCwgcmVzZWxlY3RlZF9va19wYXRjaCArIDQKKworYXQgMHgwMDAwMDA0ZSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwN2U4LAorLyoKKwlDQUxMIHJlc2VsZWN0ZWRfb2sKKworYXQgMHgwMDAwMDA1MSA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDc5OCwKKy8qCisKKzsJUmVzdG9yZSBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlcyBpbiByZXNlbGVjdGVkX29rCis7CWRzYV90ZW1wX3N5bmMgZG9lc24ndCByZWFsbHkgY2FyZSBhYm91dCBEU0EsIGJ1dCBpdCBoYXMgYW4KKzsJb3B0aW9uYWwgZGVidWcgSU5UIHNvIGEgdmFsaWQgRFNBIGlzIGEgZ29vZCBpZGVhLgorCU1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDA1MyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCUNBTEwgZHNhX3RlbXBfc3luYwkKKworYXQgMHgwMDAwMDA1NiA6ICovCTB4ODgwODAwMDAsMHgwMDAwMDAwMCwKKy8qCis7IFJlbGVhc2UgQUNLIG9uIHRoZSBJREVOVElGWSBtZXNzYWdlIF9hZnRlcl8gd2UndmUgc2V0IHRoZSBzeW5jaHJvbm91cyAKKzsgdHJhbnNmZXIgcGFyYW1ldGVycyEgCisJQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwNTggOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorOyBJbXBsaWNpdGx5IHJlc3RvcmUgcG9pbnRlcnMgb24gcmVzZWxlY3Rpb24sIHNvIGEgUkVUVVJOCis7IHdpbGwgdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIHRoZSByaWdodCBzcG90LgorICAgIAlDQUxMIFJFTCAoZHNhX2NvZGVfcmVzdG9yZV9wb2ludGVycykKKworYXQgMHgwMDAwMDA1YSA6ICovCTB4ODg4ODAwMDAsMHgwMGZmZmY2OCwKKy8qCisgICAgCVJFVFVSTgorCithdCAweDAwMDAwMDVjIDogKi8JMHg5MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKK0VOVFJZIGRzYV96ZXJvCitkc2FfemVybzoKK0VOVFJZIGRzYV9jb2RlX3RlbXBsYXRlX2VuZAorZHNhX2NvZGVfdGVtcGxhdGVfZW5kOgorCis7IFBlcmZvcm0gc2FuaXR5IGNoZWNrIGZvciBkc2FfZmllbGRzX3N0YXJ0ID09IGRzYV9jb2RlX3RlbXBsYXRlX2VuZCAtIAorOyBkc2FfemVybywgcHVrZS4KKworQUJTT0xVVEUgZHNhX2ZpZWxkc19zdGFydCA9ICAwCTsgU2FuaXR5IG1hcmtlcgorCQkJCTsgCXBhZCA0OCBieXRlcyAoZml4IHRoaXMgUlNOKQorQUJTT0xVVEUgZHNhX25leHQgPSA0OAkJOyBsZW4gNCBOZXh0IERTQQorIAkJCQk7IGRlbCA0IFByZXZpb3VzIERTQSBhZGRyZXNzCitBQlNPTFVURSBkc2FfY21uZCA9IDU2CQk7IGxlbiA0IFNjc2lfQ21uZCAqIGZvciB0aGlzIHRocmVhZC4KK0FCU09MVVRFIGRzYV9zZWxlY3QgPSA2MAk7IGxlbiA0IERldmljZSBJRCwgUGVyaW9kLCBPZmZzZXQgZm9yIAorCQkJIAk7CXRhYmxlIGluZGlyZWN0IHNlbGVjdAorQUJTT0xVVEUgZHNhX21zZ291dCA9IDY0CTsgbGVuIDggdGFibGUgaW5kaXJlY3QgbW92ZSBwYXJhbWV0ZXIgZm9yIAorCQkJCTsgICAgICAgc2VsZWN0IG1lc3NhZ2UKK0FCU09MVVRFIGRzYV9jbWRvdXQgPSA3Mgk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IG1vdmUgcGFyYW1ldGVyIGZvciAKKwkJCQk7CWNvbW1hbmQKK0FCU09MVVRFIGRzYV9kYXRhb3V0ID0gODAJOyBsZW4gNCBjb2RlIHBvaW50ZXIgZm9yIGRhdGFvdXQKK0FCU09MVVRFIGRzYV9kYXRhaW4gPSA4NAk7IGxlbiA0IGNvZGUgcG9pbnRlciBmb3IgZGF0YWluCitBQlNPTFVURSBkc2FfbXNnaW4gPSA4OAkJOyBsZW4gOCB0YWJsZSBpbmRpcmVjdCBtb3ZlIGZvciBtc2dpbgorQUJTT0xVVEUgZHNhX3N0YXR1cyA9IDk2IAk7IGxlbiA4IHRhYmxlIGluZGlyZWN0IG1vdmUgZm9yIHN0YXR1cyBieXRlCitBQlNPTFVURSBkc2FfbXNnb3V0X290aGVyID0gMTA0CTsgbGVuIDggdGFibGUgaW5kaXJlY3QgZm9yIG5vcm1hbCBtZXNzYWdlIG91dAorCQkJCTsgKFN5bmNocm9ub3VzIHRyYW5zZmVyIG5lZ290aWF0aW9uLCBldGMpLgorQUJTT0xVVEUgZHNhX2VuZCA9IDExMgorCitBQlNPTFVURSBzY2hlZHVsZSA9IDAgCQk7IEFycmF5IG9mIEpVTVAgZHNhX2JlZ2luIG9yIEpVTVAgKG5leHQpLAorCQkJCTsgdGVybWluYXRlZCBieSBhIGNhbGwgdG8gSlVNUCB3YWl0X3Jlc2VsZWN0CisKKzsgTGlua2VkIGxpc3RzIG9mIERTQSBzdHJ1Y3R1cmVzCitBQlNPTFVURSByZWNvbm5lY3RfZHNhX2hlYWQgPSAwCTsgTGluayBsaXN0IG9mIERTQXMgd2hpY2ggY2FuIHJlY29ubmVjdAorQUJTT0xVVEUgYWRkcl9yZWNvbm5lY3RfZHNhX2hlYWQgPSAwIDsgQWRkcmVzcyBvZiB2YXJpYWJsZSBjb250YWluaW5nCisJCQkJOyBhZGRyZXNzIG9mIHJlY29ubmVjdF9kc2FfaGVhZAorCis7IFRoZXNlIHNlbGVjdCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiBhIE1PVkUgTUVNT1JZIGluc3RydWN0aW9uCitBQlNPTFVURSBkbW9kZV9tZW1vcnlfdG9fbWVtb3J5ID0gMHgwCitBQlNPTFVURSBkbW9kZV9tZW1vcnlfdG9fbmNyID0gMHgwCitBQlNPTFVURSBkbW9kZV9uY3JfdG9fbWVtb3J5ID0gMHgwCisKK0FCU09MVVRFIGFkZHJfc2NyYXRjaCA9IDB4MAorQUJTT0xVVEUgYWRkcl90ZW1wID0gMHgwCisKK0FCU09MVVRFIHNhdmVkX2RzYSA9IDB4MAorQUJTT0xVVEUgZW11bGZseSA9IDB4MAorQUJTT0xVVEUgYWRkcl9kc2EgPSAweDAKKworCisKKzsgSW50ZXJydXB0cyAtIAorOyBNU0IgaW5kaWNhdGVzIHR5cGUKKzsgMAloYW5kbGUgZXJyb3IgY29uZGl0aW9uCis7IDEgCWhhbmRsZSBtZXNzYWdlIAorOyAyIAloYW5kbGUgbm9ybWFsIGNvbmRpdGlvbgorOyAzCWRlYnVnZ2luZyBpbnRlcnJ1cHQKKzsgNCAJdGVzdGluZyBpbnRlcnJ1cHQgCis7IE5leHQgYnl0ZSBpbmRpY2F0ZXMgc3BlY2lmaWMgZXJyb3IKKworOyBYWFggbm90IHlldCBpbXBsZW1lbnRlZCwgSSdtIG5vdCBzdXJlIGlmIEkgd2FudCB0byAtIAorOyBOZXh0IGJ5dGUgaW5kaWNhdGVzIHRoZSByb3V0aW5lIHRoZSBlcnJvciBvY2N1cnJlZCBpbgorOyBUaGUgTFNCIGluZGljYXRlcyB0aGUgc3BlY2lmaWMgcGxhY2UgdGhlIGVycm9yIG9jY3VycmVkCisgCitBQlNPTFVURSBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UgPSAweDAwMDAwMDAwCTsgVW5leHBlY3RlZCBwaGFzZSBlbmNvdW50ZXJlZAorQUJTT0xVVEUgaW50X2Vycl9zZWxlY3RlZCA9IDB4MDAwMTAwMDAJCTsgU0VMRUNURUQgKG5lZSBSRVNFTEVDVEVEKQorQUJTT0xVVEUgaW50X2Vycl91bmV4cGVjdGVkX3Jlc2VsZWN0ID0gMHgwMDAyMDAwMCAKK0FCU09MVVRFIGludF9lcnJfY2hlY2tfY29uZGl0aW9uID0gMHgwMDAzMDAwMAkKK0FCU09MVVRFIGludF9lcnJfbm9fcGhhc2UgPSAweDAwMDQwMDAwCitBQlNPTFVURSBpbnRfbXNnX3dkdHIgPSAweDAxMDAwMDAwCQk7IFdEVFIgbWVzc2FnZSByZWNlaXZlZAorQUJTT0xVVEUgaW50X21zZ19zZHRyID0gMHgwMTAxMDAwMAkJOyBTRFRSIHJlY2VpdmVkCitBQlNPTFVURSBpbnRfbXNnXzEgPSAweDAxMDIwMDAwCQkJOyBzaW5nbGUgYnl0ZSBzcGVjaWFsIG1lc3NhZ2UKKwkJCQkJCTsgcmVjZWl2ZWQKKworQUJTT0xVVEUgaW50X25vcm1fc2VsZWN0X2NvbXBsZXRlID0gMHgwMjAwMDAwMAk7IFNlbGVjdCBjb21wbGV0ZSwgcmVwcm9ncmFtCisJCQkJCQk7IHJlZ2lzdGVycy4KK0FCU09MVVRFIGludF9ub3JtX3Jlc2VsZWN0X2NvbXBsZXRlID0gMHgwMjAxMDAwMAk7IE5leHVzIGVzdGFibGlzaGVkCitBQlNPTFVURSBpbnRfbm9ybV9jb21tYW5kX2NvbXBsZXRlID0gMHgwMjAyMDAwMCA7IENvbW1hbmQgY29tcGxldGUKK0FCU09MVVRFIGludF9ub3JtX2Rpc2Nvbm5lY3RlZCA9IDB4MDIwMzAwMDAJOyBEaXNjb25uZWN0ZWQgCitBQlNPTFVURSBpbnRfbm9ybV9hYm9ydGVkID0weDAyMDQwMDAwCQk7IEFib3J0ZWQgKmRzYQorQUJTT0xVVEUgaW50X25vcm1fcmVzZXQgPSAweDAyMDUwMDAwCQk7IEdlbmVyYXRlZCBCVVMgcmVzZXQuCitBQlNPTFVURSBpbnRfbm9ybV9lbXVsYXRlaW50Zmx5ID0gMHgwMjA2MDAwMAk7IDUzQzcxMCBFbXVsYXRlZCBpbnRmbHkKK0FCU09MVVRFIGludF9kZWJ1Z19icmVhayA9IDB4MDMwMDAwMDAJCTsgQnJlYWsgcG9pbnQKKworQUJTT0xVVEUgaW50X2RlYnVnX3BhbmljID0gMHgwMzBiMDAwMAkJOyBQYW5pYyBkcml2ZXIKKworCitBQlNPTFVURSBpbnRfdGVzdF8xID0gMHgwNDAwMDAwMAkJOyBUZXN0IDEgY29tcGxldGUKK0FCU09MVVRFIGludF90ZXN0XzIgPSAweDA0MDEwMDAwCQk7IFRlc3QgMiBjb21wbGV0ZQorQUJTT0xVVEUgaW50X3Rlc3RfMyA9IDB4MDQwMjAwMDAJCTsgVGVzdCAzIGNvbXBsZXRlCisKKworOyBUaGVzZSBzaG91bGQgc3RhcnQgd2l0aCAweDA1MDAwMDAwLCB3aXRoIGxvdyBiaXRzIGluY3JlbWVudGluZyBmb3IgCis7IGVhY2ggb25lLgorCisKKwkJCQkJCQorQUJTT0xVVEUgTkNSNTNjN3h4X21zZ19hYm9ydCA9IDAJOyBQb2ludGVyIHRvIGFib3J0IG1lc3NhZ2UKK0FCU09MVVRFIE5DUjUzYzd4eF9tc2dfcmVqZWN0ID0gMCAgICAgICA7IFBvaW50ZXIgdG8gcmVqZWN0IG1lc3NhZ2UKK0FCU09MVVRFIE5DUjUzYzd4eF96ZXJvCT0gMAkJOyBsb25nIHdpdGggemVybyBpbiBpdCwgdXNlIGZvciBzb3VyY2UKK0FCU09MVVRFIE5DUjUzYzd4eF9zaW5rID0gMAkJOyBsb25nIHRvIGR1bXAgd29ydGhsZXNzIGRhdGEgaW4KK0FCU09MVVRFIE5PUF9pbnNuID0gMAkJCTsgTk9QIGluc3RydWN0aW9uCisKKzsgUG9pbnRlciB0byBtZXNzYWdlLCBwb3RlbnRpYWxseSBtdWx0aS1ieXRlCitBQlNPTFVURSBtc2dfYnVmID0gMAorCis7IFBvaW50ZXIgdG8gaG9sZGluZyBhcmVhIGZvciByZXNlbGVjdGlvbiBpbmZvcm1hdGlvbgorQUJTT0xVVEUgcmVzZWxlY3RlZF9pZGVudGlmeSA9IDAKK0FCU09MVVRFIHJlc2VsZWN0ZWRfdGFnID0gMAorCis7IFJlcXVlc3Qgc2Vuc2UgY29tbWFuZCBwb2ludGVyLCBpdCdzIGEgNiBieXRlIGNvbW1hbmQsIHNob3VsZAorOyBiZSBjb25zdGFudCBmb3IgYWxsIGNvbW1hbmRzIHNpbmNlIHdlIGFsd2F5cyB3YW50IDE2IGJ5dGVzIG9mIAorOyBzZW5zZSBhbmQgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55IGZpZWxkcyBhcyB3ZSBkaWQgdW5kZXIgCis7IFNDU0ktSSB3aGVuIHdlIGFjdHVhbGx5IGNhcmVkIGFib3V0IHRoZSBMVU4gZmllbGQuCis7RVhURVJOQUwgTkNSNTNjN3h4X3NlbnNlCQk7IFJlcXVlc3Qgc2Vuc2UgY29tbWFuZAorCisKKzsgZHNhX3NjaGVkdWxlICAKKzsgUFVSUE9TRSA6IGFmdGVyIGEgRElTQ09OTkVDVCBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLCBhbmQgcG9pbnRlcnMKKzsJc2F2ZWQsIGluc2VydCB0aGUgY3VycmVudCBEU0Egc3RydWN0dXJlIGF0IHRoZSBoZWFkIG9mIHRoZSAKKzsgCWRpc2Nvbm5lY3RlZCBxdWV1ZSBhbmQgZmFsbCB0aHJvdWdoIHRvIHRoZSBzY2hlZHVsZXIuCis7Cis7IENBTExTIDogT0sKKzsKKzsgSU5QVVRTIDogZHNhIC0gY3VycmVudCBEU0Egc3RydWN0dXJlLCByZWNvbm5lY3RfZHNhX2hlYWQgLSBsaXN0Cis7CW9mIGRpc2Nvbm5lY3RlZCBjb21tYW5kcworOworOyBNT0RJRklFUyA6IFNDUkFUQ0gsIHJlY29ubmVjdF9kc2FfaGVhZAorOyAKKzsgRVhJVFMgOiBhbHdheXMgcGFzc2VzIGNvbnRyb2wgdG8gc2NoZWR1bGUKKworRU5UUlkgZHNhX3NjaGVkdWxlCitkc2Ffc2NoZWR1bGU6CisKKworCisKKzsKKzsgQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IHBvaW50ZXIgd2l0aGluIHRoZSBEU0EgCis7IHN0cnVjdHVyZSBvZiB0aGUgY29tbWFuZCB0aGF0IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0aW5nCis7CisKKyAgICA7IFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgRFNBIGZyb20gbWVtb3J5IC0gYWN0dWFsIERTQQorICAgIDsgcmVnaXN0ZXIgaXMgcHJvYmFibHkgY29ycnVwdAorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwNWUgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9uZXh0IFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAwNjEgOiAqLwkweDdlMzQzMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDEgKyAwIFRPIFNDUkFUQ0gxIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDA2MyA6ICovCTB4N2YzNTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTQ1JBVENIMiArIDAgVE8gU0NSQVRDSDIgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMDY1IDogKi8JMHg3ZjM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gzICsgMCBUTyBTQ1JBVENIMyBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAwNjcgOiAqLwkweDdmMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorCis7IFBvaW50IHRoZSBuZXh0IGZpZWxkIG9mIHRoaXMgRFNBIHN0cnVjdHVyZSBhdCB0aGUgY3VycmVudCBkaXNjb25uZWN0ZWQgCis7IGxpc3QKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGRzYV9zY2hlZHVsZV9pbnNlcnQgKyA4CisKK2F0IDB4MDAwMDAwNjkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDFiOCwKKy8qCisgICAgCitkc2Ffc2NoZWR1bGVfaW5zZXJ0OgorICAgIE1PVkUgTUVNT1JZIDQsIHJlY29ubmVjdF9kc2FfaGVhZCwgMCAKKworYXQgMHgwMDAwMDA2YyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworOyBBbmQgdXBkYXRlIHRoZSBoZWFkIHBvaW50ZXIuCisKKyAgICA7IFJlYWQgd2hhdCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgRFNBIGZyb20gbWVtb3J5IC0gYWN0dWFsIERTQQorICAgIDsgcmVnaXN0ZXIgaXMgcHJvYmFibHkgY29ycnVwdAorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwNmYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCByZWNvbm5lY3RfZHNhX2hlYWQKKworYXQgMHgwMDAwMDA3MiA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAKKworCisKKworCisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAwNzUgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDc3IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisgICAgV0FJVCBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAwN2EgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKKworICAgIEpVTVAgc2NoZWR1bGUKKworYXQgMHgwMDAwMDA3YyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworOworOyBzZWxlY3QKKzsKKzsgUFVSUE9TRSA6IGVzdGFibGlzaCBhIG5leHVzIGZvciB0aGUgU0NTSSBjb21tYW5kIHJlZmVyZW5jZWQgYnkgRFNBLgorOwlPbiBzdWNjZXNzLCB0aGUgY3VycmVudCBEU0Egc3RydWN0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgaXNzdWUgCis7CXF1ZXVlLiAgVXN1YWxseSwgdGhpcyBpcyBlbnRlcmVkIGFzIGEgZmFsbC10aHJvdWdoIGZyb20gc2NoZWR1bGUsCis7CWFsdGhvdWdoIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgaGFuZGxpbmcgY29kZSB3aWxsIHdyaXRlCis7CXRoZSBzZWxlY3QgZW50cnkgYWRkcmVzcyB0byB0aGUgRFNQIHRvIHJlc3RhcnQgYSBjb21tYW5kIGFzIGEgCis7CVJFUVVFU1QgU0VOU0UuICBBIG1lc3NhZ2UgaXMgc2VudCAodXN1YWxseSBJREVOVElGWSwgYWx0aG91Z2gKKzsJYWRkaXRpb25hbCBTRFRSIG9yIFdEVFIgbWVzc2FnZXMgbWF5IGJlIHNlbnQpLiAgQ09NTUFORCBPVVQKKzsJaXMgaGFuZGxlZC4KKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBjb21tYW5kLCBpc3N1ZV9kc2FfaGVhZAorOworOyBDQUxMUyA6IE5PVCBPSworOworOyBNT0RJRklFUyA6IFNDUkFUQ0gsIGlzc3VlX2RzYV9oZWFkCis7Cis7IEVYSVRTIDogb24gcmVzZWxlY3Rpb24gb3Igc2VsZWN0aW9uLCBnbyB0byBzZWxlY3RfZmFpbGVkCis7CW90aGVyd2lzZSwgUkVUVVJOIHNvIGNvbnRyb2wgaXMgcGFzc2VkIGJhY2sgdG8gCis7CWRzYV9iZWdpbi4KKzsKKworRU5UUlkgc2VsZWN0CitzZWxlY3Q6CisKKworCisKKworCisKKworICAgIENMRUFSIFRBUkdFVAorCithdCAweDAwMDAwMDdlIDogKi8JMHg2MDAwMDIwMCwweDAwMDAwMDAwLAorLyoKKworOyBYWFgKKzsKKzsgSW4gZWZmZWN0LCBTRUxFQ1RJT04gb3BlcmF0aW9ucyBhcmUgYmFja2dyb3VuZGVkLCB3aXRoIGV4ZWN1dGlvbgorOyBjb250aW51aW5nIHVudGlsIGNvZGUgd2hpY2ggd2FpdHMgZm9yIFJFUSBvciBhIGZhdGFsIGludGVycnVwdCBpcyAKKzsgZW5jb3VudGVyZWQuCis7Cis7IFNvLCBmb3IgbW9yZSBwZXJmb3JtYW5jZSwgd2UgY291bGQgb3ZlcmxhcCB0aGUgY29kZSB3aGljaCByZW1vdmVzIAorOyB0aGUgY29tbWFuZCBmcm9tIHRoZSBOQ1JzIGlzc3VlIHF1ZXVlIHdpdGggdGhlIHNlbGVjdGlvbiwgYnV0IAorOyBhdCB0aGlzIHBvaW50IEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggdGhlIGVycm9yIHJlY292ZXJ5LgorOworCisKKworICAgIDsgRW5hYmxlIHNlbGVjdGlvbiB0aW1lcgorCisKKworICAgIE1PVkUgQ1RFU1Q3ICYgMHhlZiBUTyBDVEVTVDcKKworYXQgMHgwMDAwMDA4MCA6ICovCTB4N2MxYmVmMDAsMHgwMDAwMDAwMCwKKy8qCisKKworICAgIFNFTEVDVCBBVE4gRlJPTSBkc2Ffc2VsZWN0LCBzZWxlY3RfZmFpbGVkCisKK2F0IDB4MDAwMDAwODIgOiAqLwkweDQzMDAwMDNjLDB4MDAwMDA4MjgsCisvKgorICAgIEpVTVAgc2VsZWN0X21zZ291dCwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAwODQgOiAqLwkweDg2MGIwMDAwLDB4MDAwMDAyMTgsCisvKgorRU5UUlkgc2VsZWN0X21zZ291dAorc2VsZWN0X21zZ291dDoKKworICAgIDsgRGlzYWJsZSBzZWxlY3Rpb24gdGltZXIKKyAgICBNT1ZFIENURVNUNyB8IDB4MTAgVE8gQ1RFU1Q3CisKK2F0IDB4MDAwMDAwODYgOiAqLwkweDdhMWIxMDAwLDB4MDAwMDAwMDAsCisvKgorCisgICAgTU9WRSBGUk9NIGRzYV9tc2dvdXQsIFdIRU4gTVNHX09VVAorCithdCAweDAwMDAwMDg4IDogKi8JMHgxZTAwMDAwMCwweDAwMDAwMDQwLAorLyoKKworCisKKworCisKKworCisKKworICAgUkVUVVJOCisKK2F0IDB4MDAwMDAwOGEgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCis7IAorOyBzZWxlY3RfZG9uZQorOyAKKzsgUFVSUE9TRTogY29udGludWUgb24gdG8gbm9ybWFsIGRhdGEgdHJhbnNmZXI7IGNhbGxlZCBhcyB0aGUgZXhpdCAKKzsJcG9pbnQgZnJvbSBkc2FfYmVnaW4uCis7Cis7IElOUFVUUzogZHNhCis7Cis7IENBTExTOiBPSworOworOworCitzZWxlY3RfZG9uZToKKworOyBOT1RFIERTQSBpcyBjb3JydXB0IHdoZW4gd2UgYXJyaXZlIGhlcmUhCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMDhjIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKKworCisKKzsgQWZ0ZXIgYSBzdWNjZXNzZnVsIHNlbGVjdGlvbiwgd2Ugc2hvdWxkIGdldCBlaXRoZXIgYSBDTUQgcGhhc2Ugb3IgCis7IHNvbWUgdHJhbnNmZXIgcmVxdWVzdCBuZWdvdGlhdGlvbiBtZXNzYWdlLgorCisgICAgSlVNUCBjbWRvdXQsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwOGYgOiAqLwkweDgyMGIwMDAwLDB4MDAwMDAyNWMsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTiAKKworYXQgMHgwMDAwMDA5MSA6ICovCTB4OWYwMzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKK3NlbGVjdF9tc2dfaW46CisgICAgQ0FMTCBtc2dfaW4sIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwOTMgOiAqLwkweDhmMGIwMDAwLDB4MDAwMDA0MWMsCisvKgorICAgIEpVTVAgc2VsZWN0X21zZ19pbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDA5NSA6ICovCTB4ODcwYjAwMDAsMHgwMDAwMDI0YywKKy8qCisKK2NtZG91dDoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIE5PVCBDTUQKKworYXQgMHgwMDAwMDA5NyA6ICovCTB4OWEwMzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCitFTlRSWSBjbWRvdXRfY21kb3V0CitjbWRvdXRfY21kb3V0OgorCisgICAgTU9WRSBGUk9NIGRzYV9jbWRvdXQsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwOTkgOiAqLwkweDFhMDAwMDAwLDB4MDAwMDAwNDgsCisvKgorCisKKworCis7Cis7IGRhdGFfdHJhbnNmZXIgIAorOyBvdGhlcl9vdXQKKzsgb3RoZXJfaW4KKzsgb3RoZXJfdHJhbnNmZXIKKzsKKzsgUFVSUE9TRSA6IGhhbmRsZSB0aGUgbWFpbiBkYXRhIHRyYW5zZmVyIGZvciBhIFNDU0kgY29tbWFuZCBpbiAKKzsJc2V2ZXJhbCBwYXJ0cy4gIEluIHRoZSBmaXJzdCBwYXJ0LCBkYXRhX3RyYW5zZmVyLCBEQVRBX0lOCis7CWFuZCBEQVRBX09VVCBwaGFzZXMgYXJlIGFsbG93ZWQsIHdpdGggdGhlIHVzZXIgcHJvdmlkZWQKKzsJY29kZSAodXN1YWxseSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHNjYXR0ZXIvZ2F0aGVyCis7CWxpc3QgYXNzb2NpYXRlZCB3aXRoIGEgU0NTSSBjb21tYW5kKSBjYWxsZWQgdG8gaGFuZGxlIHRoZXNlIAorOwlwaGFzZXMuCis7Cis7CUFmdGVyIGNvbnRyb2wgaGFzIHBhc3NlZCB0byBvbmUgb2YgdGhlIHVzZXIgcHJvdmlkZWQgCis7CURBVEFfSU4gb3IgREFUQV9PVVQgcm91dGluZXMsIGJhY2sgY2FsbHMgYXJlIG1hZGUgdG8gCis7CW90aGVyX3RyYW5zZmVyX2luIG9yIG90aGVyX3RyYW5zZmVyX291dCB0byBoYW5kbGUgbm9uLURBVEEgSU4KKzsJYW5kIERBVEEgT1VUIHBoYXNlcyByZXNwZWN0aXZlbHksIHdpdGggdGhlIHN0YXRlIG9mIHRoZSBhY3RpdmUKKzsJZGF0YSBwb2ludGVyIGJlaW5nIHByZXNlcnZlZCBpbiBURU1QLgorOworOwlPbiBjb21wbGV0aW9uLCB0aGUgdXNlciBjb2RlIHBhc3NlcyBjb250cm9sIHRvIG90aGVyX3RyYW5zZmVyCis7CXdoaWNoIGNhdXNlcyBEQVRBX0lOIGFuZCBEQVRBX09VVCB0byByZXN1bHQgaW4gdW5leHBlY3RlZF9waGFzZQorOwlpbnRlcnJ1cHRzIHNvIHRoYXQgZGF0YSBvdmVycnVucyBtYXkgYmUgdHJhcHBlZC4KKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBjb21tYW5kCis7Cis7IENBTExTIDogT0sgaW4gZGF0YV90cmFuc2Zlcl9zdGFydCwgbm90IG9rIGluIG90aGVyX291dCBhbmQgb3RoZXJfaW4sIG9rIGluCis7CW90aGVyX3RyYW5zZmVyCis7Cis7IE1PRElGSUVTIDogU0NSQVRDSAorOworOyBFWElUUyA6IGlmIFNUQVRVUyBJTiBpcyBkZXRlY3RlZCwgc2lnbmlmeWluZyBjb21tYW5kIGNvbXBsZXRpb24sCis7CXRoZSBOQ1IganVtcHMgdG8gY29tbWFuZF9jb21wbGV0ZS4gIElmIE1TRyBJTiBvY2N1cnMsIGEgCis7CUNBTEwgaXMgbWFkZSB0byBtc2dfaW4uICBPdGhlcndpc2UsIG90aGVyX3RyYW5zZmVyIHJ1bnMgaW4gCis7CWFuIGluZmluaXRlIGxvb3AuCis7CQorCitFTlRSWSBkYXRhX3RyYW5zZmVyCitkYXRhX3RyYW5zZmVyOgorICAgIEpVTVAgY21kb3V0X2NtZG91dCwgV0hFTiBDTUQKKworYXQgMHgwMDAwMDA5YiA6ICovCTB4ODIwYjAwMDAsMHgwMDAwMDI2NCwKKy8qCisgICAgQ0FMTCBtc2dfaW4sIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAwOWQgOiAqLwkweDhmMGIwMDAwLDB4MDAwMDA0MWMsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorCithdCAweDAwMDAwMDlmIDogKi8JMHg5ZTBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIGRvX2RhdGFvdXQsIFdIRU4gREFUQV9PVVQKKworYXQgMHgwMDAwMDBhMSA6ICovCTB4ODAwYjAwMDAsMHgwMDAwMDJhNCwKKy8qCisgICAgSlVNUCBkb19kYXRhaW4sIFdIRU4gREFUQV9JTgorCithdCAweDAwMDAwMGEzIDogKi8JMHg4MTBiMDAwMCwweDAwMDAwMmZjLAorLyoKKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwYTUgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA2NWMsCisvKgorICAgIEpVTVAgZGF0YV90cmFuc2ZlcgorCithdCAweDAwMDAwMGE3IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMjZjLAorLyoKK0VOVFJZIGVuZF9kYXRhX3RyYW5zZmVyCitlbmRfZGF0YV90cmFuc2ZlcjoKKworOworOyBGSVhNRTogT24gTkNSNTNjNzAwIGFuZCBOQ1I1M2M3MDAtNjYgY2hpcHMsIGRvX2RhdGFvdXQvZG9fZGF0YWluIAorOyBzaG91bGQgYmUgZml4ZWQgdXAgd2hlbmV2ZXIgdGhlIG5leHVzIGNoYW5nZXMgc28gaXQgY2FuIHBvaW50IHRvIHRoZSAKKzsgY29ycmVjdCByb3V0aW5lIGZvciB0aGF0IGNvbW1hbmQuCis7CisKKworOyBOYXN0eSBqdW1wIHRvIGRzYS0+ZGF0YW91dAorZG9fZGF0YW91dDoKKworICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwYTkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9kYXRhb3V0IFRPIFNDUkFUQ0gwCQorCithdCAweDAwMDAwMGFjIDogKi8JMHg3ZTM0NTAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gxICsgMCBUTyBTQ1JBVENIMSBXSVRIIENBUlJZIAorCithdCAweDAwMDAwMGFlIDogKi8JMHg3ZjM1MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gyICsgMCBUTyBTQ1JBVENIMiBXSVRIIENBUlJZIAorCithdCAweDAwMDAwMGIwIDogKi8JMHg3ZjM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNDUkFUQ0gzICsgMCBUTyBTQ1JBVENIMyBXSVRIIENBUlJZIAorCithdCAweDAwMDAwMGIyIDogKi8JMHg3ZjM3MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGRhdGFvdXRfdG9fanVtcCArIDQKKworYXQgMHgwMDAwMDBiNCA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMmUwLAorLyoKKyAgICAKK2RhdGFvdXRfdG9fanVtcDoKKyAgICBNT1ZFIE1FTU9SWSA0LCAwLCBkYXRhb3V0X2p1bXAgKyA0IAorCithdCAweDAwMDAwMGI3IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAyZjgsCisvKgorCisgICAgOyBUaW1lIHRvIGNvcnJlY3QgRFNBIGZvbGxvd2luZyBtZW1vcnkgbW92ZQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDBiYSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworZGF0YW91dF9qdW1wOgorICAgIEpVTVAgMAorCithdCAweDAwMDAwMGJkIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworOyBOYXN0eSBqdW1wIHRvIGRzYS0+ZHNhaW4KK2RvX2RhdGFpbjoKKworICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9zY3JhdGNoCisKK2F0IDB4MDAwMDAwYmYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisgICAgTU9WRSBTQ1JBVENIMCArIGRzYV9kYXRhaW4gVE8gU0NSQVRDSDAJCisKK2F0IDB4MDAwMDAwYzIgOiAqLwkweDdlMzQ1NDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDEgKyAwIFRPIFNDUkFUQ0gxIFdJVEggQ0FSUlkgCisKK2F0IDB4MDAwMDAwYzQgOiAqLwkweDdmMzUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDIgKyAwIFRPIFNDUkFUQ0gyIFdJVEggQ0FSUlkgCisKK2F0IDB4MDAwMDAwYzYgOiAqLwkweDdmMzYwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0NSQVRDSDMgKyAwIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkgCisKK2F0IDB4MDAwMDAwYzggOiAqLwkweDdmMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgZGF0YWluX3RvX2p1bXAgKyA0CisKK2F0IDB4MDAwMDAwY2EgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDMzOCwKKy8qCisgICAgCitFTlRSWSBkYXRhaW5fdG9fanVtcAorZGF0YWluX3RvX2p1bXA6CisgICAgTU9WRSBNRU1PUlkgNCwgMCwgZGF0YWluX2p1bXAgKyA0CisKK2F0IDB4MDAwMDAwY2QgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDM1MCwKKy8qCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMGQwIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCitkYXRhaW5fanVtcDoKKyAgICBKVU1QIDAKKworYXQgMHgwMDAwMDBkMyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCis7IE5vdGUgdGhhdCBvdGhlcl9vdXQgYW5kIG90aGVyX2luIGxvb3AgdW50aWwgYSBub24tZGF0YSBwaGFzZQorOyBpcyBkaXNjb3ZlcmVkLCBzbyB3ZSBvbmx5IGV4ZWN1dGUgcmV0dXJuIHN0YXRlbWVudHMgd2hlbiB3ZQorOyBjYW4gZ28gb24gdG8gdGhlIG5leHQgZGF0YSBwaGFzZSBibG9jayBtb3ZlIHN0YXRlbWVudC4KKworRU5UUlkgb3RoZXJfb3V0CitvdGhlcl9vdXQ6CisKKworCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBDTUQKKworYXQgMHgwMDAwMDBkNSA6ICovCTB4OWEwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBtc2dfaW5fcmVzdGFydCwgV0hFTiBNU0dfSU4gCisKK2F0IDB4MDAwMDAwZDcgOiAqLwkweDg3MGIwMDAwLDB4MDAwMDAzZmMsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTVNHX09VVAorCithdCAweDAwMDAwMGQ5IDogKi8JMHg5ZTBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDBkYiA6ICovCTB4OTkwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBjb21tYW5kX2NvbXBsZXRlLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMGRkIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwNjVjLAorLyoKKyAgICBKVU1QIG90aGVyX291dCwgV0hFTiBOT1QgREFUQV9PVVQKKworYXQgMHgwMDAwMDBkZiA6ICovCTB4ODAwMzAwMDAsMHgwMDAwMDM1NCwKKy8qCisKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFvdXQgY29kZS4KKworICAgIFJFVFVSTgorCithdCAweDAwMDAwMGUxIDogKi8JMHg5MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworRU5UUlkgb3RoZXJfaW4KK290aGVyX2luOgorCisKKworICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gQ01ECisKK2F0IDB4MDAwMDAwZTMgOiAqLwkweDlhMGIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIEpVTVAgbXNnX2luX3Jlc3RhcnQsIFdIRU4gTVNHX0lOIAorCithdCAweDAwMDAwMGU1IDogKi8JMHg4NzBiMDAwMCwweDAwMDAwM2ZjLAorLyoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDBlNyA6ICovCTB4OWUwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX09VVAorCithdCAweDAwMDAwMGU5IDogKi8JMHg5ODBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIGNvbW1hbmRfY29tcGxldGUsIFdIRU4gU1RBVFVTCisKK2F0IDB4MDAwMDAwZWIgOiAqLwkweDgzMGIwMDAwLDB4MDAwMDA2NWMsCisvKgorICAgIEpVTVAgb3RoZXJfaW4sIFdIRU4gTk9UIERBVEFfSU4KKworYXQgMHgwMDAwMDBlZCA6ICovCTB4ODEwMzAwMDAsMHgwMDAwMDM4YywKKy8qCisKKzsgVEVNUCBzaG91bGQgYmUgT0ssIGFzIHdlIGdvdCBoZXJlIGZyb20gYSBjYWxsIGluIHRoZSB1c2VyIGRhdGFpbiBjb2RlLgorCisgICAgUkVUVVJOCisKK2F0IDB4MDAwMDAwZWYgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKK0VOVFJZIG90aGVyX3RyYW5zZmVyCitvdGhlcl90cmFuc2ZlcjoKKyAgICBJTlQgaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlLCBXSEVOIENNRAorCithdCAweDAwMDAwMGYxIDogKi8JMHg5YTBiMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBDQUxMIG1zZ19pbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDBmMyA6ICovCTB4OGYwYjAwMDAsMHgwMDAwMDQxYywKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAwZjUgOiAqLwkweDllMGIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gREFUQV9PVVQKKworYXQgMHgwMDAwMDBmNyA6ICovCTB4OTgwYjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9waGFzZSwgV0hFTiBEQVRBX0lOCisKK2F0IDB4MDAwMDAwZjkgOiAqLwkweDk5MGIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIEpVTVAgY29tbWFuZF9jb21wbGV0ZSwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDBmYiA6ICovCTB4ODMwYjAwMDAsMHgwMDAwMDY1YywKKy8qCisgICAgSlVNUCBvdGhlcl90cmFuc2ZlcgorCithdCAweDAwMDAwMGZkIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwM2M0LAorLyoKKworOworOyBtc2dfaW5fcmVzdGFydAorOyBtc2dfaW4KKzsgbXVuZ2VfbXNnCis7Cis7IFBVUlBPU0UgOiBwcm9jZXNzIG1lc3NhZ2VzIGZyb20gYSB0YXJnZXQuICBtc2dfaW4gaXMgY2FsbGVkIHdoZW4gdGhlIAorOwljYWxsZXIgaGFzbid0IHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UuICBtdW5nZV9tZXNzYWdlCis7CWlzIGNhbGxlZCB3aGVuIHRoZSBjYWxsZXIgaGFzIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UsCis7CWFuZCBsZWZ0IGl0IGluIFNGQlIuICBtc2dfaW5fcmVzdGFydCBpcyBjYWxsZWQgd2hlbiB0aGUgY2FsbGVyIAorOwloYXNuJ3QgcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSwgYW5kIHdpc2hlcyBSRVRVUk4KKzsJdG8gdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBjb25kaXRpb25hbAorOwlDQUxMIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciBpdC4KKzsKKzsJVmFyaW91cyBpbnRfKiBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgaG9zdCBzeXN0ZW0KKzsJbmVlZHMgdG8gaW50ZXJ2ZW5lLCBhcyBpcyB0aGUgY2FzZSB3aXRoIFNEVFIsIFdEVFIsIGFuZAorOwlJTklUSUFURSBSRUNPVkVSWSBtZXNzYWdlcy4KKzsKKzsJV2hlbiB0aGUgaG9zdCBzeXN0ZW0gaGFuZGxlcyBvbmUgb2YgdGhlc2UgaW50ZXJydXB0cywKKzsJaXQgY2FuIHJlc3BvbmQgYnkgcmVlbnRlcmluZyBhdCByZWplY3RfbWVzc2FnZSwgCis7CXdoaWNoIHJlamVjdHMgdGhlIG1lc3NhZ2UgYW5kIHJldHVybnMgY29udHJvbCB0bworOwl0aGUgY2FsbGVyIG9mIG1zZ19pbiBvciBtdW5nZV9tc2csIGFjY2VwdF9tZXNzYWdlCis7CXdoaWNoIGNsZWFycyBBQ0sgYW5kIHJldHVybnMgY29udHJvbCwgb3IgcmVwbHlfbWVzc2FnZQorOwl3aGljaCBzZW5kcyB0aGUgbWVzc2FnZSBwb2ludGVkIHRvIGJ5IHRoZSBEU0EgCis7CW1zZ291dF9vdGhlciB0YWJsZSBpbmRpcmVjdCBmaWVsZC4KKzsKKzsJRElTQ09OTkVDVCBtZXNzYWdlcyBhcmUgaGFuZGxlZCBieSBtb3ZpbmcgdGhlIGNvbW1hbmQKKzsJdG8gdGhlIHJlY29ubmVjdF9kc2FfcXVldWUuCisKKzsgTk9URTogRFNBIHNob3VsZCBiZSB2YWxpZCB3aGVuIHdlIGdldCBoZXJlIC0gd2UgY2Fubm90IHNhdmUgYm90aCBpdAorOwlhbmQgVEVNUCBpbiB0aGlzIHJvdXRpbmUuCisKKzsKKzsgSU5QVVRTIDogRFNBIC0gU0NTSSBDT01NQU5ELCBTRkJSIC0gZmlyc3QgYnl0ZSBvZiBtZXNzYWdlIChtdW5nZV9tc2cKKzsJb25seSkKKzsKKzsgQ0FMTFMgOiBOTy4gIFRoZSBURU1QIHJlZ2lzdGVyIGlzbid0IGJhY2tlZCB1cCB0byBhbGxvdyBuZXN0ZWQgY2FsbHMuCis7Cis7IE1PRElGSUVTIDogU0NSQVRDSCwgRFNBIG9uIERJU0NPTk5FQ1QKKzsKKzsgRVhJVFMgOiBPbiByZWNlaXB0IG9mIFNBVkUgREFUQSBQT0lOVEVSLCBSRVNUT1JFIFBPSU5URVJTLAorOwlhbmQgbm9ybWFsIHJldHVybiBmcm9tIG1lc3NhZ2UgaGFuZGxlcnMgcnVubmluZyB1bmRlcgorOwlMaW51eCwgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgUmVjZWlwdAorOwlvZiBESVNDT05ORUNUIG1lc3NhZ2VzIHBhc3MgY29udHJvbCB0byBkc2Ffc2NoZWR1bGUuCis7CitFTlRSWSBtc2dfaW5fcmVzdGFydAorbXNnX2luX3Jlc3RhcnQ6Cis7IFhYWCAtIGhhY2tpc2gKKzsKKzsgU2luY2UgaXQncyBlYXNpZXIgdG8gZGVidWcgY2hhbmdlcyB0byB0aGUgc3RhdGljYWxseSAKKzsgY29tcGlsZWQgY29kZSwgcmF0aGVyIHRoYW4gdGhlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCAKKzsgc3R1ZmYsIHN1Y2ggYXMKKzsKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7IAlDQUxMIG90aGVyX3osIFdIRU4gTk9UIGRhdGFfcGhhc2UKKzsgCU1PVkUgeCwgeSwgV0hFTiBkYXRhX3BoYXNlCis7Cis7IEknZCBsaWtlIHRvIGhhdmUgY2VydGFpbiByb3V0aW5lcyAobm90YWJseSB0aGUgbWVzc2FnZSBoYW5kbGVyKQorOyByZXN0YXJ0IG9uIHRoZSBjb25kaXRpb25hbCBjYWxsIHJhdGhlciB0aGFuIHRoZSBuZXh0IGluc3RydWN0aW9uLgorOworOyBTbywgc3VidHJhY3QgOCBmcm9tIHRoZSByZXR1cm4gYWRkcmVzcworCisgICAgTU9WRSBURU1QMCArIDB4ZjggVE8gVEVNUDAKKworYXQgMHgwMDAwMDBmZiA6ICovCTB4N2UxY2Y4MDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBURU1QMSArIDB4ZmYgVE8gVEVNUDEgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMTAxIDogKi8JMHg3ZjFkZmYwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFRFTVAyICsgMHhmZiBUTyBURU1QMiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxMDMgOiAqLwkweDdmMWVmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgVEVNUDMgKyAweGZmIFRPIFRFTVAzIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDEwNSA6ICovCTB4N2YxZmZmMDAsMHgwMDAwMDAwMCwKKy8qCisKK0VOVFJZIG1zZ19pbgorbXNnX2luOgorICAgIE1PVkUgMSwgbXNnX2J1ZiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDEwNyA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisKK211bmdlX21zZzoKKyAgICBKVU1QIG11bmdlX2V4dGVuZGVkLCBJRiAweDAxCQk7IEVYVEVOREVEIE1FU1NBR0UKKworYXQgMHgwMDAwMDEwOSA6ICovCTB4ODAwYzAwMDEsMHgwMDAwMDU3NCwKKy8qCisgICAgSlVNUCBtdW5nZV8yLCBJRiAweDIwLCBBTkQgTUFTSyAweGRmCTsgdHdvIGJ5dGUgbWVzc2FnZQorCithdCAweDAwMDAwMTBiIDogKi8JMHg4MDBjZGYyMCwweDAwMDAwNDY0LAorLyoKKzsKKzsgWFhYIC0gSSd2ZSBzZWVuIGEgaGFuZGZ1bCBvZiBicm9rZW4gU0NTSSBkZXZpY2VzIHdoaWNoIGZhaWwgdG8gaXNzdWUKKzsgCWEgU0FWRSBQT0lOVEVSUyBtZXNzYWdlIGJlZm9yZSBkaXNjb25uZWN0aW5nIGluIHRoZSBtaWRkbGUgb2YgCis7IAlhIHRyYW5zZmVyLCBhc3N1bWluZyB0aGF0IHRoZSBEQVRBIFBPSU5URVIgd2lsbCBiZSBpbXBsaWNpdGx5IAorOyAJcmVzdG9yZWQuICAKKzsKKzsgSGlzdG9yaWNhbGx5LCBJJ3ZlIG9mdGVuIGRvbmUgYW4gaW1wbGljaXQgc2F2ZSB3aGVuIHRoZSBESVNDT05ORUNUCis7IG1lc3NhZ2UgaXMgcHJvY2Vzc2VkLiAgV2UgbWF5IHdhbnQgdG8gY29uc2lkZXIgaGF2aW5nIHRoZSBvcHRpb24gb2YgCis7IGRvaW5nIHRoYXQgaGVyZS4gCis7CisgICAgSlVNUCBtdW5nZV9zYXZlX2RhdGFfcG9pbnRlciwgSUYgMHgwMgk7IFNBVkUgREFUQSBQT0lOVEVSCisKK2F0IDB4MDAwMDAxMGQgOiAqLwkweDgwMGMwMDAyLDB4MDAwMDA0NmMsCisvKgorICAgIEpVTVAgbXVuZ2VfcmVzdG9yZV9wb2ludGVycywgSUYgMHgwMwk7IFJFU1RPUkUgUE9JTlRFUlMgCisKK2F0IDB4MDAwMDAxMGYgOiAqLwkweDgwMGMwMDAzLDB4MDAwMDA1MTgsCisvKgorICAgIEpVTVAgbXVuZ2VfZGlzY29ubmVjdCwgSUYgMHgwNAkJOyBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAxMTEgOiAqLwkweDgwMGMwMDA0LDB4MDAwMDA1NmMsCisvKgorICAgIElOVCBpbnRfbXNnXzEsIElGIDB4MDcJCQk7IE1FU1NBR0UgUkVKRUNUCisKK2F0IDB4MDAwMDAxMTMgOiAqLwkweDk4MGMwMDA3LDB4MDEwMjAwMDAsCisvKgorICAgIElOVCBpbnRfbXNnXzEsIElGIDB4MGYJCQk7IElOSVRJQVRFIFJFQ09WRVJZCisKK2F0IDB4MDAwMDAxMTUgOiAqLwkweDk4MGMwMDBmLDB4MDEwMjAwMDAsCisvKgorCisKKworICAgIEpVTVAgcmVqZWN0X21lc3NhZ2UKKworYXQgMHgwMDAwMDExNyA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDYwNCwKKy8qCisKK211bmdlXzI6CisgICAgSlVNUCByZWplY3RfbWVzc2FnZQorCithdCAweDAwMDAwMTE5IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwNjA0LAorLyoKKzsKKzsgVGhlIFNDU0kgc3RhbmRhcmQgYWxsb3dzIHRhcmdldHMgdG8gcmVjb3ZlciBmcm9tIHRyYW5zaWVudCAKKzsgZXJyb3IgY29uZGl0aW9ucyBieSBiYWNraW5nIHVwIHRoZSBkYXRhIHBvaW50ZXIgd2l0aCBhIAorOyBSRVNUT1JFIFBPSU5URVJTIG1lc3NhZ2UuICAKKzsJCis7IFNvLCB3ZSBtdXN0IHNhdmUgYW5kIHJlc3RvcmUgdGhlIF9yZXNpZHVhbF8gY29kZSBhcyB3ZWxsIGFzIAorOyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyLiAgQmVjYXVzZSBvZiB0aGlzIG1lc3NpbmVzcywKKzsgaXQgaXMgc2ltcGxlciB0byBwdXQgZHluYW1pYyBjb2RlIGluIHRoZSBkc2EgZm9yIHRoaXMgYW5kIHRvCis7IGp1c3QgZG8gYSBzaW1wbGUganVtcCBkb3duIHRoZXJlLiAKKzsKKworbXVuZ2Vfc2F2ZV9kYXRhX3BvaW50ZXI6CisKKyAgICA7IFdlIGhhdmUgc29tZXRoaW5nIGluIFRFTVAgaGVyZSwgc28gZmlyc3Qgd2UgbXVzdCBzYXZlIHRoYXQKKyAgICBNT1ZFIFRFTVAwIFRPIFNGQlIKKworYXQgMHgwMDAwMDExYiA6ICovCTB4NzIxYzAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAxMWQgOiAqLwkweDZhMzQwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgVEVNUDEgVE8gU0ZCUgorCithdCAweDAwMDAwMTFmIDogKi8JMHg3MjFkMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDEKKworYXQgMHgwMDAwMDEyMSA6ICovCTB4NmEzNTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxMjMgOiAqLwkweDcyMWUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMgorCithdCAweDAwMDAwMTI1IDogKi8JMHg2YTM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFRFTVAzIFRPIFNGQlIKKworYXQgMHgwMDAwMDEyNyA6ICovCTB4NzIxZjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisKK2F0IDB4MDAwMDAxMjkgOiAqLwkweDZhMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwganVtcF90ZW1wICsgNAorCithdCAweDAwMDAwMTJiIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA5YzgsCisvKgorICAgIDsgTm93IHJlc3RvcmUgRFNBCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMTJlIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisgICAgTU9WRSBEU0EwICsgZHNhX3NhdmVfZGF0YV9wb2ludGVyIFRPIFNGQlIKKworYXQgMHgwMDAwMDEzMSA6ICovCTB4NzYxMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAxMzMgOiAqLwkweDZhMzQwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMSArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxMzUgOiAqLwkweDc3MTFmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMQorCithdCAweDAwMDAwMTM3IDogKi8JMHg2YTM1MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIERTQTIgKyAweGZmIFRPIFNGQlIgV0lUSCBDQVJSWSAKKworYXQgMHgwMDAwMDEzOSA6ICovCTB4NzcxMmZmMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gyCisKK2F0IDB4MDAwMDAxM2IgOiAqLwkweDZhMzYwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMyArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxM2QgOiAqLwkweDc3MTNmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMworCithdCAweDAwMDAwMTNmIDogKi8JMHg2YTM3MDAwMCwweDAwMDAwMDAwLAorLyoKKworICAgIAorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwganVtcF9kc2Ffc2F2ZSArIDQKKworYXQgMHgwMDAwMDE0MSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwNTE0LAorLyoKKyAgICAKK2p1bXBfZHNhX3NhdmU6CisgICAgSlVNUCAwCisKK2F0IDB4MDAwMDAxNDQgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCittdW5nZV9yZXN0b3JlX3BvaW50ZXJzOgorCisgICAgOyBUaGUgY29kZSBhdCBkc2FfcmVzdG9yZV9wb2ludGVycyB3aWxsIFJFVFVSTiwgYnV0IHdlIGRvbid0IGNhcmUKKyAgICA7IGFib3V0IFRFTVAgaGVyZSwgYXMgaXQgd2lsbCBvdmVyd3JpdGUgaXQgYW55d2F5LgorCisgICAgTU9WRSBEU0EwICsgZHNhX3Jlc3RvcmVfcG9pbnRlcnMgVE8gU0ZCUgorCithdCAweDAwMDAwMTQ2IDogKi8JMHg3NjEwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDAKKworYXQgMHgwMDAwMDE0OCA6ICovCTB4NmEzNDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBEU0ExICsgMHhmZiBUTyBTRkJSIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDE0YSA6ICovCTB4NzcxMWZmMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gxCisKK2F0IDB4MDAwMDAxNGMgOiAqLwkweDZhMzUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMiArIDB4ZmYgVE8gU0ZCUiBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxNGUgOiAqLwkweDc3MTJmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMgorCithdCAweDAwMDAwMTUwIDogKi8JMHg2YTM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIERTQTMgKyAweGZmIFRPIFNGQlIgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMTUyIDogKi8JMHg3NzEzZmYwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDMKKworYXQgMHgwMDAwMDE1NCA6ICovCTB4NmEzNzAwMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIGp1bXBfZHNhX3Jlc3RvcmUgKyA0CisKK2F0IDB4MDAwMDAxNTYgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDU2OCwKKy8qCisgICAgCitqdW1wX2RzYV9yZXN0b3JlOgorICAgIEpVTVAgMAorCithdCAweDAwMDAwMTU5IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworCittdW5nZV9kaXNjb25uZWN0OgorCisKKworCisKKworCisKKworIAorCisKKworCisKKworCisKKworCisgICAgSlVNUCBkc2Ffc2NoZWR1bGUKKworYXQgMHgwMDAwMDE1YiA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDE3OCwKKy8qCisKKworCisKKworbXVuZ2VfZXh0ZW5kZWQ6CisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAxNWQgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorICAgIElOVCBpbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UsIFdIRU4gTk9UIE1TR19JTgorCithdCAweDAwMDAwMTVmIDogKi8JMHg5ZjAzMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIDEsIG1zZ19idWYgKyAxLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMTYxIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAxLAorLyoKKyAgICBKVU1QIG11bmdlX2V4dGVuZGVkXzIsIElGIDB4MDIKKworYXQgMHgwMDAwMDE2MyA6ICovCTB4ODAwYzAwMDIsMHgwMDAwMDVhNCwKKy8qCisgICAgSlVNUCBtdW5nZV9leHRlbmRlZF8zLCBJRiAweDAzIAorCithdCAweDAwMDAwMTY1IDogKi8JMHg4MDBjMDAwMywweDAwMDAwNWQ0LAorLyoKKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlCisKK2F0IDB4MDAwMDAxNjcgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA2MDQsCisvKgorCittdW5nZV9leHRlbmRlZF8yOgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMTY5IDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIDEsIG1zZ19idWYgKyAyLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMTZiIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAyLAorLyoKKyAgICBKVU1QIHJlamVjdF9tZXNzYWdlLCBJRiBOT1QgMHgwMgk7IE11c3QgYmUgV0RUUgorCithdCAweDAwMDAwMTZkIDogKi8JMHg4MDA0MDAwMiwweDAwMDAwNjA0LAorLyoKKyAgICBDTEVBUiBBQ0sKKworYXQgMHgwMDAwMDE2ZiA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMywgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDE3MSA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMywKKy8qCisgICAgSU5UIGludF9tc2dfd2R0cgorCithdCAweDAwMDAwMTczIDogKi8JMHg5ODA4MDAwMCwweDAxMDAwMDAwLAorLyoKKworbXVuZ2VfZXh0ZW5kZWRfMzoKKyAgICBDTEVBUiBBQ0sKKworYXQgMHgwMDAwMDE3NSA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSAxLCBtc2dfYnVmICsgMiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDE3NyA6ICovCTB4MGYwMDAwMDEsMHgwMDAwMDAwMiwKKy8qCisgICAgSlVNUCByZWplY3RfbWVzc2FnZSwgSUYgTk9UIDB4MDEJOyBNdXN0IGJlIFNEVFIKKworYXQgMHgwMDAwMDE3OSA6ICovCTB4ODAwNDAwMDEsMHgwMDAwMDYwNCwKKy8qCisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAxN2IgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgMiwgbXNnX2J1ZiArIDMsIFdIRU4gTVNHX0lOCisKK2F0IDB4MDAwMDAxN2QgOiAqLwkweDBmMDAwMDAyLDB4MDAwMDAwMDMsCisvKgorICAgIElOVCBpbnRfbXNnX3NkdHIKKworYXQgMHgwMDAwMDE3ZiA6ICovCTB4OTgwODAwMDAsMHgwMTAxMDAwMCwKKy8qCisKK0VOVFJZIHJlamVjdF9tZXNzYWdlCityZWplY3RfbWVzc2FnZToKKyAgICBTRVQgQVROCisKK2F0IDB4MDAwMDAxODEgOiAqLwkweDU4MDAwMDA4LDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMTgzIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF9tc2dfcmVqZWN0LCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDE4NSA6ICovCTB4MGUwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgUkVUVVJOCisKK2F0IDB4MDAwMDAxODcgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCitFTlRSWSBhY2NlcHRfbWVzc2FnZQorYWNjZXB0X21lc3NhZ2U6CisgICAgQ0xFQVIgQVROCisKK2F0IDB4MDAwMDAxODkgOiAqLwkweDYwMDAwMDA4LDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMThiIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKyAgICBSRVRVUk4KKworYXQgMHgwMDAwMDE4ZCA6ICovCTB4OTAwODAwMDAsMHgwMDAwMDAwMCwKKy8qCisKK0VOVFJZIHJlc3BvbmRfbWVzc2FnZQorcmVzcG9uZF9tZXNzYWdlOgorICAgIFNFVCBBVE4KKworYXQgMHgwMDAwMDE4ZiA6ICovCTB4NTgwMDAwMDgsMHgwMDAwMDAwMCwKKy8qCisgICAgQ0xFQVIgQUNLCisKK2F0IDB4MDAwMDAxOTEgOiAqLwkweDYwMDAwMDQwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRlJPTSBkc2FfbXNnb3V0X290aGVyLCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDE5MyA6ICovCTB4MWUwMDAwMDAsMHgwMDAwMDA2OCwKKy8qCisgICAgUkVUVVJOCisKK2F0IDB4MDAwMDAxOTUgOiAqLwkweDkwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCis7Cis7IGNvbW1hbmRfY29tcGxldGUKKzsKKzsgUFVSUE9TRSA6IGhhbmRsZSBjb21tYW5kIHRlcm1pbmF0aW9uIHdoZW4gU1RBVFVTIElOIGlzIGRldGVjdGVkIGJ5IHJlYWRpbmcKKzsJYSBzdGF0dXMgYnl0ZSBmb2xsb3dlZCBieSBhIGNvbW1hbmQgdGVybWluYXRpb24gbWVzc2FnZS4gCis7Cis7CU5vcm1hbCB0ZXJtaW5hdGlvbiByZXN1bHRzIGluIGFuIElOVEZMWSBpbnN0cnVjdGlvbiwgYW5kIAorOwl0aGUgaG9zdCBzeXN0ZW0gY2FuIHBpY2sgb3V0IHdoaWNoIGNvbW1hbmQgdGVybWluYXRlZCBieSAKKzsJZXhhbWluaW5nIHRoZSBNRVNTQUdFIGFuZCBTVEFUVVMgYnVmZmVycyBvZiBhbGwgY3VycmVudGx5IAorOwlleGVjdXRpbmcgY29tbWFuZHM7Cis7Cis7CUFibm9ybWFsIChDSEVDS19DT05ESVRJT04pIHRlcm1pbmF0aW9uIHJlc3VsdHMgaW4gYW4KKzsJaW50X2Vycl9jaGVja19jb25kaXRpb24gaW50ZXJydXB0IHNvIHRoYXQgYSBSRVFVRVNUIFNFTlNFCis7CWNvbW1hbmQgY2FuIGJlIGlzc3VlZCBvdXQtb2Ytb3JkZXIgc28gdGhhdCBubyBvdGhlciBjb21tYW5kCis7CWNsZWFycyB0aGUgY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbi4KKzsJCis7Cis7IElOUFVUUyA6IERTQSAtIGNvbW1hbmQJCis7Cis7IENBTExTIDogT0sKKzsKKzsgRVhJVFMgOiBPbiBzdWNjZXNzZnVsIHRlcm1pbmF0aW9uLCBjb250cm9sIGlzIHBhc3NlZCB0byBzY2hlZHVsZS4KKzsJT24gYWJub3JtYWwgdGVybWluYXRpb24sIHRoZSB1c2VyIHdpbGwgdXN1YWxseSBtb2RpZnkgdGhlIAorOwlEU0EgZmllbGRzIGFuZCBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMgYW5kIHJldHVybiBjb250cm9sCis7CXRvIHNlbGVjdC4KKzsKKworRU5UUlkgY29tbWFuZF9jb21wbGV0ZQorY29tbWFuZF9jb21wbGV0ZToKKyAgICBNT1ZFIEZST00gZHNhX3N0YXR1cywgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDE5NyA6ICovCTB4MWIwMDAwMDAsMHgwMDAwMDA2MCwKKy8qCisKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDAJCTsgU2F2ZSBzdGF0dXMKKworYXQgMHgwMDAwMDE5OSA6ICovCTB4NmEzNDAwMDAsMHgwMDAwMDAwMCwKKy8qCisKK0VOVFJZIGNvbW1hbmRfY29tcGxldGVfbXNnaW4KK2NvbW1hbmRfY29tcGxldGVfbXNnaW46CisgICAgTU9WRSBGUk9NIGRzYV9tc2dpbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDE5YiA6ICovCTB4MWYwMDAwMDAsMHgwMDAwMDA1OCwKKy8qCis7IEluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGJlIGV4cGVjdGluZyBhIGRpc2Nvbm5lY3QKKworCisKKyAgICA7IEFib3ZlIGNvZGUgY2xlYXJlZCB0aGUgVW5leHBlY3RlZCBEaXNjb25uZWN0IGJpdCwgd2hhdCBkbyB3ZSBkbz8KKworICAgIENMRUFSIEFDSworCithdCAweDAwMDAwMTlkIDogKi8JMHg2MDAwMDA0MCwweDAwMDAwMDAwLAorLyoKKworICAgIFdBSVQgRElTQ09OTkVDVAorCithdCAweDAwMDAwMTlmIDogKi8JMHg0ODAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworOworOyBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IHdoZW4gYSBVTklUIEFUVEVOVElPTiBjb25kaXRpb24KKzsgaXMgcGVuZGluZywgYXMgaW5kaWNhdGVkIGJ5IGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cyBtZXNzYWdlLAorOyB0aGUgdGFyZ2V0IHNoYWxsIHJldmVydCB0byBhc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgU2luY2UKKzsgc3luY2hyb25vdXMgdHJhbnNmZXJzIHBhcmFtZXRlcnMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgSU5JVElBVE9SL1RBUkdFVCAKKzsgYmFzaXMsIGFuZCByZXR1cm5pbmcgY29udHJvbCB0byBvdXIgc2NoZWR1bGVyIGNvdWxkIHdvcmsgb24gYSBjb21tYW5kCis7IHJ1bm5pbmcgb24gYW5vdGhlciBsdW4gb24gdGhhdCB0YXJnZXQgdXNpbmcgdGhlIG9sZCBwYXJhbWV0ZXJzLCB3ZSBtdXN0Cis7IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IHRoZW0gY2hhbmdlZCwgb3IgY2hhbmdlIHRoZW0gb3Vyc2VsdmVzLgorOworOyBPbmNlIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nIGlzIGltcGxlbWVudGVkLCB0aGluZ3Mgd2lsbCBiZSBldmVuIG1vcmUKKzsgaGFpcnksIHNpbmNlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb25zIGV4aXN0IG9uIGEgcGVyLXRhcmdldC9sdW4KKzsgYmFzaXMsIGFuZCBpc3N1aW5nIGEgbmV3IGNvbW1hbmQgd2l0aCBhIGRpZmZlcmVudCB0YWcgd291bGQgY2xlYXIgaXQuCis7IEluIHRoZXNlIGNhc2VzLCB3ZSBtdXN0IGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IgdG8gZ2V0IGEgcmVxdWVzdCAKKzsgYWRkZWQgdG8gdGhlIEhFQUQgb2YgdGhlIHF1ZXVlIHdpdGggdGhlIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCwgb3Igd2UKKzsgbXVzdCBhdXRvbWF0aWNhbGx5IGlzc3VlIHRoZSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQuCisKKworCisKKworCisKKyAgICBJTlQgaW50X25vcm1fZW11bGF0ZWludGZseQorCithdCAweDAwMDAwMWExIDogKi8JMHg5ODA4MDAwMCwweDAyMDYwMDAwLAorLyoKKworCisKKworCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMWEzIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKKyAgICBKVU1QIHNjaGVkdWxlCisKK2F0IDB4MDAwMDAxYTYgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorY29tbWFuZF9mYWlsZWQ6CisgICAgSU5UIGludF9lcnJfY2hlY2tfY29uZGl0aW9uCisKK2F0IDB4MDAwMDAxYTggOiAqLwkweDk4MDgwMDAwLDB4MDAwMzAwMDAsCisvKgorCisKKworCis7Cis7IHdhaXRfcmVzZWxlY3QKKzsKKzsgUFVSUE9TRSA6IFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGlkbGUgcm91dGluZSwgd2hlcmUgY29udHJvbCBsYW5kcworOwl3aGVuIHRoZXJlIGFyZSBubyBuZXcgcHJvY2Vzc2VzIHRvIHNjaGVkdWxlLiAgd2FpdF9yZXNlbGVjdAorOwl3YWl0cyBmb3IgcmVzZWxlY3Rpb24sIHNlbGVjdGlvbiwgYW5kIG5ldyBjb21tYW5kcy4KKzsKKzsJV2hlbiBhIHN1Y2Nlc3NmdWwgcmVzZWxlY3Rpb24gb2NjdXJzLCB3aXRoIHRoZSBhaWQgCis7CW9mIGZpeGVkIHVwIGNvZGUgaW4gZWFjaCBEU0EsIHdhaXRfcmVzZWxlY3Qgd2Fsa3MgdGhlIAorOwlyZWNvbm5lY3RfZHNhX3F1ZXVlLCBhc2tpbmcgZWFjaCBkc2EgaWYgdGhlIHRhcmdldCBJRAorOwlhbmQgTFVOIG1hdGNoIGl0cy4KKzsKKzsJSWYgYSBtYXRjaCBpcyBmb3VuZCwgYSBjYWxsIGlzIG1hZGUgYmFjayB0byByZXNlbGVjdGVkX29rLAorOwl3aGljaCB0aHJvdWdoIHRoZSBtaXJhY2xlcyBvZiBzZWxmIG1vZGlmeWluZyBjb2RlLCBleHRyYWN0cworOwl0aGUgZm91bmQgRFNBIGZyb20gdGhlIHJlY29ubmVjdF9kc2FfcXVldWUgYW5kIHRoZW4gCis7CXJldHVybnMgY29udHJvbCB0byB0aGUgRFNBcyB0aHJlYWQgb2YgZXhlY3V0aW9uLgorOworOyBJTlBVVFMgOiBOT05FCis7Cis7IENBTExTIDogT0sKKzsKKzsgTU9ESUZJRVMgOiBEU0EsCis7Cis7IEVYSVRTIDogT24gc3VjY2Vzc2Z1bCByZXNlbGVjdGlvbiwgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgCis7CURTQSB3aGljaCBjYWxsZWQgcmVzZWxlY3RlZF9vay4gIElmIHRoZSBXQUlUIFJFU0VMRUNUCis7CXdhcyBpbnRlcnJ1cHRlZCBieSBhIG5ldyBjb21tYW5kcyBhcnJpdmFsIHNpZ25hbGVkIGJ5IAorOwlTSUdfUCwgY29udHJvbCBpcyBwYXNzZWQgdG8gc2NoZWR1bGUuICBJZiB0aGUgTkNSIGlzIAorOwlzZWxlY3RlZCwgdGhlIGhvc3Qgc3lzdGVtIGlzIGludGVycnVwdGVkIHdpdGggYW4gCis7CWludF9lcnJfc2VsZWN0ZWQgd2hpY2ggaXMgdXN1YWxseSByZXNwb25kZWQgdG8gYnkKKzsJc2V0dGluZyBEU1AgdG8gdGhlIHRhcmdldF9hYm9ydCBhZGRyZXNzLgorCitFTlRSWSB3YWl0X3Jlc2VsZWN0Cit3YWl0X3Jlc2VsZWN0OgorCisKKworCisKKworICAgIFdBSVQgUkVTRUxFQ1Qgd2FpdF9yZXNlbGVjdF9mYWlsZWQKKworYXQgMHgwMDAwMDFhYSA6ICovCTB4NTAwMDAwMDAsMHgwMDAwMDgwMCwKKy8qCisKK3Jlc2VsZWN0ZWQ6CisKKworCisgICAgQ0xFQVIgVEFSR0VUCisKK2F0IDB4MDAwMDAxYWMgOiAqLwkweDYwMDAwMjAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorICAgIDsgUmVhZCBhbGwgZGF0YSBuZWVkZWQgdG8gcmVlc3RhYmxpc2ggdGhlIG5leHVzIC0gCisgICAgTU9WRSAxLCByZXNlbGVjdGVkX2lkZW50aWZ5LCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMWFlIDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKyAgICA7IFdlIHVzZWQgdG8gQ0xFQVIgQUNLIGhlcmUuCisKKworCisKKworICAgIDsgUG9pbnQgRFNBIGF0IHRoZSBjdXJyZW50IGhlYWQgb2YgdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCByZWNvbm5lY3RfZHNhX2hlYWQsIGFkZHJfc2NyYXRjaAorCithdCAweDAwMDAwMWIwIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorCisgICAgTU9WRSBNRU1PUlkgNCwgYWRkcl9zY3JhdGNoLCBzYXZlZF9kc2EKKworYXQgMHgwMDAwMDFiMyA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKworICAgIDsgRml4IHRoZSB1cGRhdGUtbmV4dCBwb2ludGVyIHNvIHRoYXQgdGhlIHJlY29ubmVjdF9kc2FfaGVhZAorICAgIDsgcG9pbnRlciBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGlmIHRoaXMgRFNBIGlzIGEgaGl0IAorICAgIDsgYW5kIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZS4KKworICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfcmVjb25uZWN0X2RzYV9oZWFkLCByZXNlbGVjdGVkX29rX3BhdGNoICsgOAorCithdCAweDAwMDAwMWI2IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA3ZWMsCisvKgorCisgICAgOyBUaW1lIHRvIGNvcnJlY3QgRFNBIGZvbGxvd2luZyBtZW1vcnkgbW92ZQorICAgIE1PVkUgTUVNT1JZIDQsIHNhdmVkX2RzYSwgYWRkcl9kc2EKKworYXQgMHgwMDAwMDFiOSA6ICovCTB4YzAwMDAwMDQsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorLyoKKworCitFTlRSWSByZXNlbGVjdGVkX2NoZWNrX25leHQKK3Jlc2VsZWN0ZWRfY2hlY2tfbmV4dDoKKworCisKKyAgICA7IENoZWNrIGZvciBhIE5VTEwgcG9pbnRlci4KKyAgICBNT1ZFIERTQTAgVE8gU0ZCUgorCithdCAweDAwMDAwMWJjIDogKi8JMHg3MjEwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKworYXQgMHgwMDAwMDFiZSA6ICovCTB4ODAwNDAwMDAsMHgwMDAwMDczOCwKKy8qCisgICAgTU9WRSBEU0ExIFRPIFNGQlIKKworYXQgMHgwMDAwMDFjMCA6ICovCTB4NzIxMTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCByZXNlbGVjdGVkX25vdF9lbmQsIElGIE5PVCAwCisKK2F0IDB4MDAwMDAxYzIgOiAqLwkweDgwMDQwMDAwLDB4MDAwMDA3MzgsCisvKgorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxYzQgOiAqLwkweDcyMTIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIEpVTVAgcmVzZWxlY3RlZF9ub3RfZW5kLCBJRiBOT1QgMAorCithdCAweDAwMDAwMWM2IDogKi8JMHg4MDA0MDAwMCwweDAwMDAwNzM4LAorLyoKKyAgICBNT1ZFIERTQTMgVE8gU0ZCUgorCithdCAweDAwMDAwMWM4IDogKi8JMHg3MjEzMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHJlc2VsZWN0ZWRfbm90X2VuZCwgSUYgTk9UIDAKKworYXQgMHgwMDAwMDFjYSA6ICovCTB4ODAwNDAwMDAsMHgwMDAwMDczOCwKKy8qCisgICAgSU5UIGludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdAorCithdCAweDAwMDAwMWNjIDogKi8JMHg5ODA4MDAwMCwweDAwMDIwMDAwLAorLyoKKworcmVzZWxlY3RlZF9ub3RfZW5kOgorICAgIDsKKyAgICA7IFhYWCB0aGUgQUxVIGlzIG9ubHkgZWlnaHQgYml0cyB3aWRlLCBhbmQgdGhlIGFzc2VtYmxlcgorICAgIDsgd29udCBkbyB0aGUgZGlydCB3b3JrIGZvciB1cy4gIEFzIGxvbmcgYXMgZHNhX2NoZWNrX3Jlc2VsZWN0CisgICAgOyBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBzaWduIGV4dGVuZCB3aXRoIDEgYml0cyB0byB0aGUgZnVsbAorICAgIDsgMzIgYml0IHdpZHRoIG9mIHRoZSBhZGRyZXNzLgorICAgIDsKKyAgICA7IEEgcG90ZW50aWFsIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIGhhdmUgYSBrbm93biBhbGlnbm1lbnQgCisgICAgOyBvZiB0aGUgRFNBIHN0cnVjdHVyZSBzdWNoIHRoYXQgdGhlIGJhc2UgYWRkcmVzcyBwbHVzIAorICAgIDsgZHNhX2NoZWNrX3Jlc2VsZWN0IGRvZXNuJ3QgcmVxdWlyZSBjYXJyeWluZyBmcm9tIGJ5dGVzIAorICAgIDsgaGlnaGVyIHRoYW4gdGhlIExTQi4KKyAgICA7CisKKyAgICBNT1ZFIERTQTAgVE8gU0ZCUgorCithdCAweDAwMDAwMWNlIDogKi8JMHg3MjEwMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgKyBkc2FfY2hlY2tfcmVzZWxlY3QgVE8gU0NSQVRDSDAKKworYXQgMHgwMDAwMDFkMCA6ICovCTB4NmUzNDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBEU0ExIFRPIFNGQlIKKworYXQgMHgwMDAwMDFkMiA6ICovCTB4NzIxMTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSICsgMHhmZiBUTyBTQ1JBVENIMSBXSVRIIENBUlJZCisKK2F0IDB4MDAwMDAxZDQgOiAqLwkweDZmMzVmZjAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgRFNBMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxZDYgOiAqLwkweDcyMTIwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiArIDB4ZmYgVE8gU0NSQVRDSDIgV0lUSCBDQVJSWQorCithdCAweDAwMDAwMWQ4IDogKi8JMHg2ZjM2ZmYwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIERTQTMgVE8gU0ZCUgorCithdCAweDAwMDAwMWRhIDogKi8JMHg3MjEzMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgKyAweGZmIFRPIFNDUkFUQ0gzIFdJVEggQ0FSUlkKKworYXQgMHgwMDAwMDFkYyA6ICovCTB4NmYzN2ZmMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICAKKyAgICBNT1ZFIE1FTU9SWSA0LCBhZGRyX3NjcmF0Y2gsIHJlc2VsZWN0ZWRfY2hlY2sgKyA0CisKK2F0IDB4MDAwMDAxZGUgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDc5NCwKKy8qCisgICAgCisKKyAgICA7IFRpbWUgdG8gY29ycmVjdCBEU0EgZm9sbG93aW5nIG1lbW9yeSBtb3ZlCisgICAgTU9WRSBNRU1PUlkgNCwgc2F2ZWRfZHNhLCBhZGRyX2RzYQorCithdCAweDAwMDAwMWUxIDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisvKgorCityZXNlbGVjdGVkX2NoZWNrOgorICAgIEpVTVAgMAorCithdCAweDAwMDAwMWU0IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwMDAwLAorLyoKKworCis7Cis7CisKKzsgV2UgaGF2ZSBwcm9ibGVtcyBoZXJlIC0gdGhlIG1lbW9yeSBtb3ZlIGNvcnJ1cHRzIFRFTVAgYW5kIERTQS4gIFRoaXMKKzsgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBEU0EgY29kZSwgYW5kIHBhdGNoZWQgZnJvbSBtYW55IHBsYWNlcy4gIFNjcmF0Y2gKKzsgaXMgcHJvYmFibHkgZnJlZSB3aGVuIGl0IGlzIGNhbGxlZC4KKzsgV2UgaGF2ZSB0bzoKKzsgICBjb3B5IHRlbXAgdG8gc2NyYXRjaCwgb25lIGJ5dGUgYXQgYSB0aW1lCis7ICAgd3JpdGUgc2NyYXRjaCB0byBwYXRjaCBhIGp1bXAgaW4gcGxhY2Ugb2YgdGhlIHJldHVybgorOyAgIGRvIHRoZSBtb3ZlIG1lbW9yeQorOyAgIGp1bXAgdG8gdGhlIHBhdGNoZWQgaW4gcmV0dXJuIGFkZHJlc3MKKzsgRFNBIGlzIGNvcnJ1cHQgd2hlbiB3ZSBnZXQgaGVyZSwgYW5kIGNhbiBiZSBsZWZ0IGNvcnJ1cHQKKworRU5UUlkgcmVzZWxlY3RlZF9vaworcmVzZWxlY3RlZF9vazoKKyAgICBNT1ZFIFRFTVAwIFRPIFNGQlIKKworYXQgMHgwMDAwMDFlNiA6ICovCTB4NzIxYzAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gwCisKK2F0IDB4MDAwMDAxZTggOiAqLwkweDZhMzQwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgVEVNUDEgVE8gU0ZCUgorCithdCAweDAwMDAwMWVhIDogKi8JMHg3MjFkMDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFNGQlIgVE8gU0NSQVRDSDEKKworYXQgMHgwMDAwMDFlYyA6ICovCTB4NmEzNTAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBURU1QMiBUTyBTRkJSCisKK2F0IDB4MDAwMDAxZWUgOiAqLwkweDcyMWUwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgU0ZCUiBUTyBTQ1JBVENIMgorCithdCAweDAwMDAwMWYwIDogKi8JMHg2YTM2MDAwMCwweDAwMDAwMDAwLAorLyoKKyAgICBNT1ZFIFRFTVAzIFRPIFNGQlIKKworYXQgMHgwMDAwMDFmMiA6ICovCTB4NzIxZjAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgTU9WRSBTRkJSIFRPIFNDUkFUQ0gzCisKK2F0IDB4MDAwMDAxZjQgOiAqLwkweDZhMzcwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIE1PVkUgTUVNT1JZIDQsIGFkZHJfc2NyYXRjaCwgcmVzZWxlY3RlZF9va19qdW1wICsgNAorCithdCAweDAwMDAwMWY2IDogKi8JMHhjMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDA3ZjQsCisvKgorcmVzZWxlY3RlZF9va19wYXRjaDoKKyAgICBNT1ZFIE1FTU9SWSA0LCAwLCAwCisKK2F0IDB4MDAwMDAxZjkgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCityZXNlbGVjdGVkX29rX2p1bXA6CisgICAgSlVNUCAwCisKK2F0IDB4MDAwMDAxZmMgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorCisKKworCisKK3NlbGVjdGVkOgorICAgIElOVCBpbnRfZXJyX3NlbGVjdGVkOworCithdCAweDAwMDAwMWZlIDogKi8JMHg5ODA4MDAwMCwweDAwMDEwMDAwLAorLyoKKworOworOyBBIHNlbGVjdCBvciByZXNlbGVjdCBmYWlsdXJlIGNhbiBiZSBjYXVzZWQgYnkgb25lIG9mIHR3byBjb25kaXRpb25zIDogCis7IDEuICBTSUdfUCB3YXMgc2V0LiAgVGhpcyB3aWxsIGJlIHRoZSBjYXNlIGlmIHRoZSB1c2VyIGhhcyB3cml0dGVuCis7CWEgbmV3IHZhbHVlIHRvIGEgcHJldmlvdXNseSBOVUxMIGhlYWQgb2YgdGhlIGlzc3VlIHF1ZXVlLgorOworOyAyLiAgVGhlIE5DUjUzYzgxMCB3YXMgc2VsZWN0ZWQgb3IgcmVzZWxlY3RlZCBieSBhbm90aGVyIGRldmljZS4KKzsKKzsgMy4gIFRoZSBidXMgd2FzIGFscmVhZHkgYnVzeSBzaW5jZSB3ZSB3ZXJlIHNlbGVjdGVkIG9yIHJlc2VsZWN0ZWQKKzsJYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb21tYW5kLgorCit3YWl0X3Jlc2VsZWN0X2ZhaWxlZDoKKworCisKKzsgQ2hlY2sgc2VsZWN0ZWQgYml0LiAgCisKKyAgICA7IE11c3Qgd29yayBvdXQgaG93IHRvIHRlbGwgaWYgd2UgYXJlIHNlbGVjdGVkLi4uLgorCisKKworCis7IFJlYWRpbmcgQ1RFU1QyIGNsZWFycyB0aGUgU0lHX1AgYml0IGluIHRoZSBJU1RBVCByZWdpc3Rlci4KKyAgICBNT1ZFIENURVNUMiAmIDB4NDAgVE8gU0ZCUgkKKworYXQgMHgwMDAwMDIwMCA6ICovCTB4NzQxNjQwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBzY2hlZHVsZSwgSUYgMHg0MAorCithdCAweDAwMDAwMjAyIDogKi8JMHg4MDBjMDA0MCwweDAwMDAwMDAwLAorLyoKKzsgQ2hlY2sgY29ubmVjdGVkIGJpdC4gIAorOyBGSVhNRTogdGhpcyBuZWVkcyB0byBjaGFuZ2UgaWYgd2Ugc3VwcG9ydCB0YXJnZXQgbW9kZQorICAgIE1PVkUgSVNUQVQgJiAweDA4IFRPIFNGQlIKKworYXQgMHgwMDAwMDIwNCA6ICovCTB4NzQyMTA4MDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCByZXNlbGVjdGVkLCBJRiAweDA4CisKK2F0IDB4MDAwMDAyMDYgOiAqLwkweDgwMGMwMDA4LDB4MDAwMDA2YjAsCisvKgorOyBGSVhNRSA6IFNvbWV0aGluZyBib2d1cyBoYXBwZW5lZCwgYW5kIHdlIHNob3VsZG4ndCBmYWlsIHNpbGVudGx5LgorCisKKworICAgIElOVCBpbnRfZGVidWdfcGFuaWMKKworYXQgMHgwMDAwMDIwOCA6ICovCTB4OTgwODAwMDAsMHgwMzBiMDAwMCwKKy8qCisKKworCitzZWxlY3RfZmFpbGVkOgorCisgICAgOyBEaXNhYmxlIHNlbGVjdGlvbiB0aW1lcgorICAgIE1PVkUgQ1RFU1Q3IHwgMHgxMCBUTyBDVEVTVDcKKworYXQgMHgwMDAwMDIwYSA6ICovCTB4N2ExYjEwMDAsMHgwMDAwMDAwMCwKKy8qCisKKworCisKKzsgT3RoZXJ3aXNlLCBtYXNrIHRoZSBzZWxlY3RlZCBhbmQgcmVzZWxlY3RlZCBiaXRzIG9mZiBTSVNUMAorCisgICAgOyBMZXQncyBhc3N1bWUgd2UgZG9uJ3QgZ2V0IHNlbGVjdGVkIGZvciBub3cKKyAgICBNT1ZFIFNTVEFUMCAmIDB4MTAgVE8gU0ZCUgorCithdCAweDAwMDAwMjBjIDogKi8JMHg3NDBkMTAwMCwweDAwMDAwMDAwLAorLyoKKworCisKKworICAgIEpVTVAgcmVzZWxlY3RlZCwgSUYgMHgxMCAKKworYXQgMHgwMDAwMDIwZSA6ICovCTB4ODAwYzAwMTAsMHgwMDAwMDZiMCwKKy8qCis7IElmIFNJR1AgaXMgc2V0LCB0aGUgdXNlciBqdXN0IGdhdmUgdXMgYW5vdGhlciBjb21tYW5kLCBhbmQKKzsgd2Ugc2hvdWxkIHJlc3RhcnQgb3IgcmV0dXJuIHRvIHRoZSBzY2hlZHVsZXIuCis7IFJlYWRpbmcgQ1RFU1QyIGNsZWFycyB0aGUgU0lHX1AgYml0IGluIHRoZSBJU1RBVCByZWdpc3Rlci4KKyAgICBNT1ZFIENURVNUMiAmIDB4NDAgVE8gU0ZCUgkKKworYXQgMHgwMDAwMDIxMCA6ICovCTB4NzQxNjQwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBzZWxlY3QsIElGIDB4NDAKKworYXQgMHgwMDAwMDIxMiA6ICovCTB4ODAwYzAwNDAsMHgwMDAwMDFmOCwKKy8qCis7IENoZWNrIGNvbm5lY3RlZCBiaXQuICAKKzsgRklYTUU6IHRoaXMgbmVlZHMgdG8gY2hhbmdlIGlmIHdlIHN1cHBvcnQgdGFyZ2V0IG1vZGUKKzsgRklYTUU6IGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gCisgICAgTU9WRSBJU1RBVCAmIDB4MDggVE8gU0ZCUgorCithdCAweDAwMDAwMjE0IDogKi8JMHg3NDIxMDgwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHJlc2VsZWN0ZWQsIElGIDB4MDgKKworYXQgMHgwMDAwMDIxNiA6ICovCTB4ODAwYzAwMDgsMHgwMDAwMDZiMCwKKy8qCis7IEZJWE1FIDogU29tZXRoaW5nIGJvZ3VzIGhhcHBlbmVkLCBhbmQgd2Ugc2hvdWxkbid0IGZhaWwgc2lsZW50bHkuCisKKworCisgICAgSU5UIGludF9kZWJ1Z19wYW5pYworCithdCAweDAwMDAwMjE4IDogKi8JMHg5ODA4MDAwMCwweDAzMGIwMDAwLAorLyoKKworCis7Cis7IHRlc3RfMQorOyB0ZXN0XzIKKzsKKzsgUFVSUE9TRSA6IHJ1biBzb21lIHZlcmlmaWNhdGlvbiB0ZXN0cyBvbiB0aGUgTkNSLiAgdGVzdF8xCis7CWNvcGllcyB0ZXN0X3NyYyB0byB0ZXN0X2Rlc3QgYW5kIGludGVycnVwdHMgdGhlIGhvc3QKKzsJcHJvY2Vzc29yLCB0ZXN0aW5nIGZvciBjYWNoZSBjb2hlcmVuY3kgYW5kIGludGVycnVwdAorOyAJcHJvYmxlbXMgaW4gdGhlIHByb2Nlc3Nlcy4KKzsKKzsJdGVzdF8yIHJ1bnMgYSBjb21tYW5kIHdpdGggb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgCis7CURTQSBvbiBlbnRyeSwgYW5kIGlzIHVzZWZ1bCBmb3IgbWlzY2VsbGFuZW91cyBleHBlcmltZW50YXRpb24uCis7CisKKzsgVmVyaWZ5IHRoYXQgaW50ZXJydXB0cyBhcmUgd29ya2luZyBjb3JyZWN0bHkgYW5kIHRoYXQgd2UgZG9uJ3QgCis7IGhhdmUgYSBjYWNoZSBpbnZhbGlkYXRpb24gcHJvYmxlbS4KKworQUJTT0xVVEUgdGVzdF9zcmMgPSAwLCB0ZXN0X2Rlc3QgPSAwCitFTlRSWSB0ZXN0XzEKK3Rlc3RfMToKKyAgICBNT1ZFIE1FTU9SWSA0LCB0ZXN0X3NyYywgdGVzdF9kZXN0CisKK2F0IDB4MDAwMDAyMWEgOiAqLwkweGMwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKy8qCisgICAgSU5UIGludF90ZXN0XzEKKworYXQgMHgwMDAwMDIxZCA6ICovCTB4OTgwODAwMDAsMHgwNDAwMDAwMCwKKy8qCisKKzsKKzsgUnVuIGFyYml0cmFyeSBjb21tYW5kcywgd2l0aCB0ZXN0IGNvZGUgZXN0YWJsaXNoaW5nIGEgRFNBCis7CisgCitFTlRSWSB0ZXN0XzIKK3Rlc3RfMjoKKyAgICBDTEVBUiBUQVJHRVQKKworYXQgMHgwMDAwMDIxZiA6ICovCTB4NjAwMDAyMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICA7IEVuYWJsZSBzZWxlY3Rpb24gdGltZXIKKworCisKKyAgICBNT1ZFIENURVNUNyAmIDB4ZWYgVE8gQ1RFU1Q3CisKK2F0IDB4MDAwMDAyMjEgOiAqLwkweDdjMWJlZjAwLDB4MDAwMDAwMDAsCisvKgorCisKKyAgICBTRUxFQ1QgQVROIEZST00gMCwgdGVzdF8yX2ZhaWwKKworYXQgMHgwMDAwMDIyMyA6ICovCTB4NDMwMDAwMDAsMHgwMDAwMDhkYywKKy8qCisgICAgSlVNUCB0ZXN0XzJfbXNnb3V0LCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDIyNSA6ICovCTB4ODYwYjAwMDAsMHgwMDAwMDg5YywKKy8qCitFTlRSWSB0ZXN0XzJfbXNnb3V0Cit0ZXN0XzJfbXNnb3V0OgorCisgICAgOyBEaXNhYmxlIHNlbGVjdGlvbiB0aW1lcgorICAgIE1PVkUgQ1RFU1Q3IHwgMHgxMCBUTyBDVEVTVDcKKworYXQgMHgwMDAwMDIyNyA6ICovCTB4N2ExYjEwMDAsMHgwMDAwMDAwMCwKKy8qCisKKyAgICBNT1ZFIEZST00gOCwgV0hFTiBNU0dfT1VUCisKK2F0IDB4MDAwMDAyMjkgOiAqLwkweDFlMDAwMDAwLDB4MDAwMDAwMDgsCisvKgorICAgIE1PVkUgRlJPTSAxNiwgV0hFTiBDTUQgCisKK2F0IDB4MDAwMDAyMmIgOiAqLwkweDFhMDAwMDAwLDB4MDAwMDAwMTAsCisvKgorICAgIE1PVkUgRlJPTSAyNCwgV0hFTiBEQVRBX0lOCisKK2F0IDB4MDAwMDAyMmQgOiAqLwkweDE5MDAwMDAwLDB4MDAwMDAwMTgsCisvKgorICAgIE1PVkUgRlJPTSAzMiwgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDIyZiA6ICovCTB4MWIwMDAwMDAsMHgwMDAwMDAyMCwKKy8qCisgICAgTU9WRSBGUk9NIDQwLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMjMxIDogKi8JMHgxZjAwMDAwMCwweDAwMDAwMDI4LAorLyoKKworCisKKyAgICBDTEVBUiBBQ0sKKworYXQgMHgwMDAwMDIzMyA6ICovCTB4NjAwMDAwNDAsMHgwMDAwMDAwMCwKKy8qCisgICAgV0FJVCBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAyMzUgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgordGVzdF8yX2ZhaWw6CisKKyAgICA7IERpc2FibGUgc2VsZWN0aW9uIHRpbWVyCisgICAgTU9WRSBDVEVTVDcgfCAweDEwIFRPIENURVNUNworCithdCAweDAwMDAwMjM3IDogKi8JMHg3YTFiMTAwMCwweDAwMDAwMDAwLAorLyoKKworICAgIElOVCBpbnRfdGVzdF8yCisKK2F0IDB4MDAwMDAyMzkgOiAqLwkweDk4MDgwMDAwLDB4MDQwMTAwMDAsCisvKgorCitFTlRSWSBkZWJ1Z19icmVhaworZGVidWdfYnJlYWs6CisgICAgSU5UIGludF9kZWJ1Z19icmVhaworCithdCAweDAwMDAwMjNiIDogKi8JMHg5ODA4MDAwMCwweDAzMDAwMDAwLAorLyoKKworOworOyBpbml0aWF0b3JfYWJvcnQKKzsgdGFyZ2V0X2Fib3J0Cis7Cis7IFBVUlBPU0UgOiBBYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzIGZyb20gd2l0aCBpbml0aWF0b3IKKzsJb3IgdGFyZ2V0IG1vZGUuCis7Cis7ICAKKworRU5UUlkgdGFyZ2V0X2Fib3J0Cit0YXJnZXRfYWJvcnQ6CisgICAgU0VUIFRBUkdFVAorCithdCAweDAwMDAwMjNkIDogKi8JMHg1ODAwMDIwMCwweDAwMDAwMDAwLAorLyoKKyAgICBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAyM2YgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIENMRUFSIFRBUkdFVAorCithdCAweDAwMDAwMjQxIDogKi8JMHg2MDAwMDIwMCwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIHNjaGVkdWxlCisKK2F0IDB4MDAwMDAyNDMgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIAorRU5UUlkgaW5pdGlhdG9yX2Fib3J0Citpbml0aWF0b3JfYWJvcnQ6CisgICAgU0VUIEFUTgorCithdCAweDAwMDAwMjQ1IDogKi8JMHg1ODAwMDAwOCwweDAwMDAwMDAwLAorLyoKKzsKKzsgVGhlIFNDU0ktSSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCB0YXJnZXRzIG1heSBnbyBpbnRvIE1TRyBvdXQgYXQgCis7IHRoZWlyIGxlaXN1cmUgdXBvbiByZWNlaXB0IG9mIHRoZSBBVE4gc2luZ2xlLiAgT24gYWxsIHZlcnNpb25zIG9mIHRoZSAKKzsgc3BlY2lmaWNhdGlvbiwgd2UgY2FuJ3QgY2hhbmdlIHBoYXNlcyB1bnRpbCBSRVEgdHJhbnNpdGlvbnMgdHJ1ZS0+ZmFsc2UsIAorOyBzbyB3ZSBuZWVkIHRvIHNpbmsvc291cmNlIG9uZSBieXRlIG9mIGRhdGEgdG8gYWxsb3cgdGhlIHRyYW5zaXRpb24uCis7Cis7IEZvciB0aGUgc2FrZSBvZiBzYWZldHksIHdlJ2xsIG9ubHkgc291cmNlIG9uZSBieXRlIG9mIGRhdGEgaW4gYWxsIAorOyBjYXNlcywgYnV0IHRvIGFjY29tbW9kYXRlIHRoZSBTQ1NJLUkgZGFpbiBicmFtYWdlLCB3ZSdsbCBzaW5rIGFuICAKKzsgYXJiaXRyYXJ5IG51bWJlciBvZiBieXRlcy4KKyAgICBKVU1QIHNwZXdfY21kLCBXSEVOIENNRAorCithdCAweDAwMDAwMjQ3IDogKi8JMHg4MjBiMDAwMCwweDAwMDAwOTRjLAorLyoKKyAgICBKVU1QIGVhdF9tc2dpbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDI0OSA6ICovCTB4ODcwYjAwMDAsMHgwMDAwMDk1YywKKy8qCisgICAgSlVNUCBlYXRfZGF0YWluLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDI0YiA6ICovCTB4ODEwYjAwMDAsMHgwMDAwMDk4YywKKy8qCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMjRkIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwOTc0LAorLyoKKyAgICBKVU1QIHNwZXdfZGF0YW91dCwgV0hFTiBEQVRBX09VVAorCithdCAweDAwMDAwMjRmIDogKi8JMHg4MDBiMDAwMCwweDAwMDAwOWE0LAorLyoKKyAgICBKVU1QIHNhdGVkCisKK2F0IDB4MDAwMDAyNTEgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA5YWMsCisvKgorc3Bld19jbWQ6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfemVybywgV0hFTiBDTUQKKworYXQgMHgwMDAwMDI1MyA6ICovCTB4MGEwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBzYXRlZAorCithdCAweDAwMDAwMjU1IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWFjLAorLyoKK2VhdF9tc2dpbjoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF9zaW5rLCBXSEVOIE1TR19JTgorCithdCAweDAwMDAwMjU3IDogKi8JMHgwZjAwMDAwMSwweDAwMDAwMDAwLAorLyoKKyAgICBKVU1QIGVhdF9tc2dpbiwgV0hFTiBNU0dfSU4KKworYXQgMHgwMDAwMDI1OSA6ICovCTB4ODcwYjAwMDAsMHgwMDAwMDk1YywKKy8qCisgICAgSlVNUCBzYXRlZAorCithdCAweDAwMDAwMjViIDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWFjLAorLyoKK2VhdF9zdGF0dXM6CisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfc2luaywgV0hFTiBTVEFUVVMKKworYXQgMHgwMDAwMDI1ZCA6ICovCTB4MGIwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBlYXRfc3RhdHVzLCBXSEVOIFNUQVRVUworCithdCAweDAwMDAwMjVmIDogKi8JMHg4MzBiMDAwMCwweDAwMDAwOTc0LAorLyoKKyAgICBKVU1QIHNhdGVkCisKK2F0IDB4MDAwMDAyNjEgOiAqLwkweDgwMDgwMDAwLDB4MDAwMDA5YWMsCisvKgorZWF0X2RhdGFpbjoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF9zaW5rLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDI2MyA6ICovCTB4MDkwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgSlVNUCBlYXRfZGF0YWluLCBXSEVOIERBVEFfSU4KKworYXQgMHgwMDAwMDI2NSA6ICovCTB4ODEwYjAwMDAsMHgwMDAwMDk4YywKKy8qCisgICAgSlVNUCBzYXRlZAorCithdCAweDAwMDAwMjY3IDogKi8JMHg4MDA4MDAwMCwweDAwMDAwOWFjLAorLyoKK3NwZXdfZGF0YW91dDoKKyAgICBNT1ZFIDEsIE5DUjUzYzd4eF96ZXJvLCBXSEVOIERBVEFfT1VUCisKK2F0IDB4MDAwMDAyNjkgOiAqLwkweDA4MDAwMDAxLDB4MDAwMDAwMDAsCisvKgorc2F0ZWQ6CisKKworCisgICAgTU9WRSAxLCBOQ1I1M2M3eHhfbXNnX2Fib3J0LCBXSEVOIE1TR19PVVQKKworYXQgMHgwMDAwMDI2YiA6ICovCTB4MGUwMDAwMDEsMHgwMDAwMDAwMCwKKy8qCisgICAgV0FJVCBESVNDT05ORUNUCisKK2F0IDB4MDAwMDAyNmQgOiAqLwkweDQ4MDAwMDAwLDB4MDAwMDAwMDAsCisvKgorICAgIElOVCBpbnRfbm9ybV9hYm9ydGVkCisKK2F0IDB4MDAwMDAyNmYgOiAqLwkweDk4MDgwMDAwLDB4MDIwNDAwMDAsCisvKgorCisKKyAKKworOyBMaXR0bGUgcGF0Y2hlZCBqdW1wLCB1c2VkIHRvIG92ZXJjb21lIHByb2JsZW1zIHdpdGggVEVNUCBnZXR0aW5nCis7IGNvcnJ1cHRlZCBvbiBtZW1vcnkgbW92ZXMuCisKK2p1bXBfdGVtcDoKKyAgICBKVU1QIDAKKworYXQgMHgwMDAwMDI3MSA6ICovCTB4ODAwODAwMDAsMHgwMDAwMDAwMCwKK307CisKKyNkZWZpbmUgQV9OQ1I1M2M3eHhfbXNnX2Fib3J0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9OQ1I1M2M3eHhfbXNnX2Fib3J0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDI2YywKK307CisKKyNkZWZpbmUgQV9OQ1I1M2M3eHhfbXNnX3JlamVjdAkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfTkNSNTNjN3h4X21zZ19yZWplY3RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTg2LAorfTsKKworI2RlZmluZSBBX05DUjUzYzd4eF9zaW5rCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9OQ1I1M2M3eHhfc2lua191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyNTgsCisJMHgwMDAwMDI1ZSwKKwkweDAwMDAwMjY0LAorfTsKKworI2RlZmluZSBBX05DUjUzYzd4eF96ZXJvCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9OQ1I1M2M3eHhfemVyb191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyNTQsCisJMHgwMDAwMDI2YSwKK307CisKKyNkZWZpbmUgQV9OT1BfaW5zbgkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfTk9QX2luc25fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDE3LAorfTsKKworI2RlZmluZSBBX2FkZHJfZHNhCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9hZGRyX2RzYV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMGYsCisJMHgwMDAwMDAyNiwKKwkweDAwMDAwMDMzLAorCTB4MDAwMDAwNDAsCisJMHgwMDAwMDA1NSwKKwkweDAwMDAwMDc5LAorCTB4MDAwMDAwOGUsCisJMHgwMDAwMDBiYywKKwkweDAwMDAwMGQyLAorCTB4MDAwMDAxMzAsCisJMHgwMDAwMDFhNSwKKwkweDAwMDAwMWJiLAorCTB4MDAwMDAxZTMsCit9OworCisjZGVmaW5lIEFfYWRkcl9yZWNvbm5lY3RfZHNhX2hlYWQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2FkZHJfcmVjb25uZWN0X2RzYV9oZWFkX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDFiNywKK307CisKKyNkZWZpbmUgQV9hZGRyX3NjcmF0Y2gJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2FkZHJfc2NyYXRjaF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMDIsCisJMHgwMDAwMDAwNCwKKwkweDAwMDAwMDA4LAorCTB4MDAwMDAwMjAsCisJMHgwMDAwMDAyMiwKKwkweDAwMDAwMDQ5LAorCTB4MDAwMDAwNjAsCisJMHgwMDAwMDA2YSwKKwkweDAwMDAwMDcxLAorCTB4MDAwMDAwNzMsCisJMHgwMDAwMDBhYiwKKwkweDAwMDAwMGI1LAorCTB4MDAwMDAwYzEsCisJMHgwMDAwMDBjYiwKKwkweDAwMDAwMTJjLAorCTB4MDAwMDAxNDIsCisJMHgwMDAwMDE1NywKKwkweDAwMDAwMWIyLAorCTB4MDAwMDAxYjQsCisJMHgwMDAwMDFkZiwKKwkweDAwMDAwMWY3LAorfTsKKworI2RlZmluZSBBX2FkZHJfdGVtcAkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfYWRkcl90ZW1wX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfZG1vZGVfbWVtb3J5X3RvX21lbW9yeQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZG1vZGVfbWVtb3J5X3RvX21lbW9yeV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2Rtb2RlX21lbW9yeV90b19uY3IJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2Rtb2RlX21lbW9yeV90b19uY3JfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9kbW9kZV9uY3JfdG9fbWVtb3J5CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kbW9kZV9uY3JfdG9fbWVtb3J5X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfZHNhX2NoZWNrX3Jlc2VsZWN0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfY2hlY2tfcmVzZWxlY3RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMWQwLAorfTsKKworI2RlZmluZSBBX2RzYV9jbWRvdXQJMHgwMDAwMDA0OAorc3RhdGljIHUzMiBBX2RzYV9jbWRvdXRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDlhLAorfTsKKworI2RlZmluZSBBX2RzYV9jbW5kCTB4MDAwMDAwMzgKK3N0YXRpYyB1MzIgQV9kc2FfY21uZF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2RzYV9kYXRhaW4JMHgwMDAwMDA1NAorc3RhdGljIHUzMiBBX2RzYV9kYXRhaW5fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMGMyLAorfTsKKworI2RlZmluZSBBX2RzYV9kYXRhb3V0CTB4MDAwMDAwNTAKK3N0YXRpYyB1MzIgQV9kc2FfZGF0YW91dF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwYWMsCit9OworCisjZGVmaW5lIEFfZHNhX2VuZAkweDAwMDAwMDcwCitzdGF0aWMgdTMyIEFfZHNhX2VuZF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2RzYV9maWVsZHNfc3RhcnQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV9maWVsZHNfc3RhcnRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9kc2FfbXNnaW4JMHgwMDAwMDA1OAorc3RhdGljIHUzMiBBX2RzYV9tc2dpbl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxOWMsCit9OworCisjZGVmaW5lIEFfZHNhX21zZ291dAkweDAwMDAwMDQwCitzdGF0aWMgdTMyIEFfZHNhX21zZ291dF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwODksCit9OworCisjZGVmaW5lIEFfZHNhX21zZ291dF9vdGhlcgkweDAwMDAwMDY4CitzdGF0aWMgdTMyIEFfZHNhX21zZ291dF9vdGhlcl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxOTQsCit9OworCisjZGVmaW5lIEFfZHNhX25leHQJMHgwMDAwMDAzMAorc3RhdGljIHUzMiBBX2RzYV9uZXh0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA2MSwKK307CisKKyNkZWZpbmUgQV9kc2FfcmVzdG9yZV9wb2ludGVycwkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3Jlc3RvcmVfcG9pbnRlcnNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTQ2LAorfTsKKworI2RlZmluZSBBX2RzYV9zYXZlX2RhdGFfcG9pbnRlcgkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3NhdmVfZGF0YV9wb2ludGVyX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDEzMSwKK307CisKKyNkZWZpbmUgQV9kc2Ffc2VsZWN0CTB4MDAwMDAwM2MKK3N0YXRpYyB1MzIgQV9kc2Ffc2VsZWN0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA4MiwKK307CisKKyNkZWZpbmUgQV9kc2Ffc3NjZl83MTAJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV9zc2NmXzcxMF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMDcsCit9OworCisjZGVmaW5lIEFfZHNhX3N0YXR1cwkweDAwMDAwMDYwCitzdGF0aWMgdTMyIEFfZHNhX3N0YXR1c191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxOTgsCit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2RzYV90ZW1wX2FkZHJfZHNhX3ZhbHVlCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9hZGRyX2RzYV92YWx1ZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMDEsCit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9uZXdfdmFsdWUJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV90ZW1wX2FkZHJfbmV3X3ZhbHVlX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9uZXh0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9hZGRyX25leHRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDFjLAorCTB4MDAwMDAwNGYsCit9OworCisjZGVmaW5lIEFfZHNhX3RlbXBfYWRkcl9yZXNpZHVhbAkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3RlbXBfYWRkcl9yZXNpZHVhbF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMmQsCisJMHgwMDAwMDAzYiwKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9hZGRyX3NhdmVkX3BvaW50ZXIJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV90ZW1wX2FkZHJfc2F2ZWRfcG9pbnRlcl91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMmIsCisJMHgwMDAwMDAzNywKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9hZGRyX3NhdmVkX3Jlc2lkdWFsX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAyZSwKKwkweDAwMDAwMDNhLAorfTsKKworI2RlZmluZSBBX2RzYV90ZW1wX2x1bgkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZHNhX3RlbXBfbHVuX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA0YywKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9uZXh0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9uZXh0X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAxZiwKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF9zeW5jCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9kc2FfdGVtcF9zeW5jX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA1NywKK307CisKKyNkZWZpbmUgQV9kc2FfdGVtcF90YXJnZXQJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2RzYV90ZW1wX3RhcmdldF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwNDUsCit9OworCisjZGVmaW5lIEFfZW11bGZseQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfZW11bGZseV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2ludF9kZWJ1Z19icmVhawkweDAzMDAwMDAwCitzdGF0aWMgdTMyIEFfaW50X2RlYnVnX2JyZWFrX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDIzYywKK307CisKKyNkZWZpbmUgQV9pbnRfZGVidWdfcGFuaWMJMHgwMzBiMDAwMAorc3RhdGljIHUzMiBBX2ludF9kZWJ1Z19wYW5pY191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyMDksCisJMHgwMDAwMDIxOSwKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX2NoZWNrX2NvbmRpdGlvbgkweDAwMDMwMDAwCitzdGF0aWMgdTMyIEFfaW50X2Vycl9jaGVja19jb25kaXRpb25fdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMWE5LAorfTsKKworI2RlZmluZSBBX2ludF9lcnJfbm9fcGhhc2UJMHgwMDA0MDAwMAorc3RhdGljIHUzMiBBX2ludF9lcnJfbm9fcGhhc2VfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX3NlbGVjdGVkCTB4MDAwMTAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfZXJyX3NlbGVjdGVkX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDFmZiwKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX3VuZXhwZWN0ZWRfcGhhc2UJMHgwMDAwMDAwMAorc3RhdGljIHUzMiBBX2ludF9lcnJfdW5leHBlY3RlZF9waGFzZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwOTIsCisJMHgwMDAwMDA5OCwKKwkweDAwMDAwMGEwLAorCTB4MDAwMDAwZDYsCisJMHgwMDAwMDBkYSwKKwkweDAwMDAwMGRjLAorCTB4MDAwMDAwZTQsCisJMHgwMDAwMDBlOCwKKwkweDAwMDAwMGVhLAorCTB4MDAwMDAwZjIsCisJMHgwMDAwMDBmNiwKKwkweDAwMDAwMGY4LAorCTB4MDAwMDAwZmEsCisJMHgwMDAwMDE2MCwKK307CisKKyNkZWZpbmUgQV9pbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QJMHgwMDAyMDAwMAorc3RhdGljIHUzMiBBX2ludF9lcnJfdW5leHBlY3RlZF9yZXNlbGVjdF91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAxY2QsCit9OworCisjZGVmaW5lIEFfaW50X21zZ18xCTB4MDEwMjAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbXNnXzFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTE0LAorCTB4MDAwMDAxMTYsCit9OworCisjZGVmaW5lIEFfaW50X21zZ19zZHRyCTB4MDEwMTAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbXNnX3NkdHJfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMTgwLAorfTsKKworI2RlZmluZSBBX2ludF9tc2dfd2R0cgkweDAxMDAwMDAwCitzdGF0aWMgdTMyIEFfaW50X21zZ193ZHRyX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDE3NCwKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9hYm9ydGVkCTB4MDIwNDAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9hYm9ydGVkX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDI3MCwKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9jb21tYW5kX2NvbXBsZXRlCTB4MDIwMjAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9jb21tYW5kX2NvbXBsZXRlX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7Cit9OworCisjZGVmaW5lIEFfaW50X25vcm1fZGlzY29ubmVjdGVkCTB4MDIwMzAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9kaXNjb25uZWN0ZWRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9lbXVsYXRlaW50Zmx5CTB4MDIwNjAwMDAKK3N0YXRpYyB1MzIgQV9pbnRfbm9ybV9lbXVsYXRlaW50Zmx5X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDFhMiwKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9yZXNlbGVjdF9jb21wbGV0ZQkweDAyMDEwMDAwCitzdGF0aWMgdTMyIEFfaW50X25vcm1fcmVzZWxlY3RfY29tcGxldGVfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9yZXNldAkweDAyMDUwMDAwCitzdGF0aWMgdTMyIEFfaW50X25vcm1fcmVzZXRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9pbnRfbm9ybV9zZWxlY3RfY29tcGxldGUJMHgwMjAwMDAwMAorc3RhdGljIHUzMiBBX2ludF9ub3JtX3NlbGVjdF9jb21wbGV0ZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX2ludF90ZXN0XzEJMHgwNDAwMDAwMAorc3RhdGljIHUzMiBBX2ludF90ZXN0XzFfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMjFlLAorfTsKKworI2RlZmluZSBBX2ludF90ZXN0XzIJMHgwNDAxMDAwMAorc3RhdGljIHUzMiBBX2ludF90ZXN0XzJfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMjNhLAorfTsKKworI2RlZmluZSBBX2ludF90ZXN0XzMJMHgwNDAyMDAwMAorc3RhdGljIHUzMiBBX2ludF90ZXN0XzNfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKKyNkZWZpbmUgQV9tc2dfYnVmCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9tc2dfYnVmX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDEwOCwKKwkweDAwMDAwMTYyLAorCTB4MDAwMDAxNmMsCisJMHgwMDAwMDE3MiwKKwkweDAwMDAwMTc4LAorCTB4MDAwMDAxN2UsCit9OworCisjZGVmaW5lIEFfcmVjb25uZWN0X2RzYV9oZWFkCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9yZWNvbm5lY3RfZHNhX2hlYWRfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMDZkLAorCTB4MDAwMDAwNzQsCisJMHgwMDAwMDFiMSwKK307CisKKyNkZWZpbmUgQV9yZXNlbGVjdGVkX2lkZW50aWZ5CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9yZXNlbGVjdGVkX2lkZW50aWZ5X3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDA0OCwKKwkweDAwMDAwMWFmLAorfTsKKworI2RlZmluZSBBX3Jlc2VsZWN0ZWRfdGFnCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9yZXNlbGVjdGVkX3RhZ191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworfTsKKworI2RlZmluZSBBX3NhdmVkX2RzYQkweDAwMDAwMDAwCitzdGF0aWMgdTMyIEFfc2F2ZWRfZHNhX3VzZWRbXSBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSB7CisJMHgwMDAwMDAwNSwKKwkweDAwMDAwMDBlLAorCTB4MDAwMDAwMjMsCisJMHgwMDAwMDAyNSwKKwkweDAwMDAwMDMyLAorCTB4MDAwMDAwM2YsCisJMHgwMDAwMDA1NCwKKwkweDAwMDAwMDVmLAorCTB4MDAwMDAwNzAsCisJMHgwMDAwMDA3OCwKKwkweDAwMDAwMDhkLAorCTB4MDAwMDAwYWEsCisJMHgwMDAwMDBiYiwKKwkweDAwMDAwMGMwLAorCTB4MDAwMDAwZDEsCisJMHgwMDAwMDEyZiwKKwkweDAwMDAwMWE0LAorCTB4MDAwMDAxYjUsCisJMHgwMDAwMDFiYSwKKwkweDAwMDAwMWUyLAorfTsKKworI2RlZmluZSBBX3NjaGVkdWxlCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV9zY2hlZHVsZV91c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwN2QsCisJMHgwMDAwMDFhNywKKwkweDAwMDAwMjAzLAorCTB4MDAwMDAyNDQsCit9OworCisjZGVmaW5lIEFfdGVzdF9kZXN0CTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV90ZXN0X2Rlc3RfdXNlZFtdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKKwkweDAwMDAwMjFjLAorfTsKKworI2RlZmluZSBBX3Rlc3Rfc3JjCTB4MDAwMDAwMDAKK3N0YXRpYyB1MzIgQV90ZXN0X3NyY191c2VkW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAyMWIsCit9OworCisjZGVmaW5lIEVudF9hY2NlcHRfbWVzc2FnZQkweDAwMDAwNjI0CisjZGVmaW5lIEVudF9jbWRvdXRfY21kb3V0CTB4MDAwMDAyNjQKKyNkZWZpbmUgRW50X2NvbW1hbmRfY29tcGxldGUJMHgwMDAwMDY1YworI2RlZmluZSBFbnRfY29tbWFuZF9jb21wbGV0ZV9tc2dpbgkweDAwMDAwNjZjCisjZGVmaW5lIEVudF9kYXRhX3RyYW5zZmVyCTB4MDAwMDAyNmMKKyNkZWZpbmUgRW50X2RhdGFpbl90b19qdW1wCTB4MDAwMDAzMzQKKyNkZWZpbmUgRW50X2RlYnVnX2JyZWFrCTB4MDAwMDA4ZWMKKyNkZWZpbmUgRW50X2RzYV9jb2RlX2JlZ2luCTB4MDAwMDAwMDAKKyNkZWZpbmUgRW50X2RzYV9jb2RlX2NoZWNrX3Jlc2VsZWN0CTB4MDAwMDAxMGMKKyNkZWZpbmUgRW50X2RzYV9jb2RlX2ZpeF9qdW1wCTB4MDAwMDAwNTgKKyNkZWZpbmUgRW50X2RzYV9jb2RlX3Jlc3RvcmVfcG9pbnRlcnMJMHgwMDAwMDBkOAorI2RlZmluZSBFbnRfZHNhX2NvZGVfc2F2ZV9kYXRhX3BvaW50ZXIJMHgwMDAwMDBhNAorI2RlZmluZSBFbnRfZHNhX2NvZGVfdGVtcGxhdGUJMHgwMDAwMDAwMAorI2RlZmluZSBFbnRfZHNhX2NvZGVfdGVtcGxhdGVfZW5kCTB4MDAwMDAxNzgKKyNkZWZpbmUgRW50X2RzYV9zY2hlZHVsZQkweDAwMDAwMTc4CisjZGVmaW5lIEVudF9kc2FfemVybwkweDAwMDAwMTc4CisjZGVmaW5lIEVudF9lbmRfZGF0YV90cmFuc2ZlcgkweDAwMDAwMmE0CisjZGVmaW5lIEVudF9pbml0aWF0b3JfYWJvcnQJMHgwMDAwMDkxNAorI2RlZmluZSBFbnRfbXNnX2luCTB4MDAwMDA0MWMKKyNkZWZpbmUgRW50X21zZ19pbl9yZXN0YXJ0CTB4MDAwMDAzZmMKKyNkZWZpbmUgRW50X290aGVyX2luCTB4MDAwMDAzOGMKKyNkZWZpbmUgRW50X290aGVyX291dAkweDAwMDAwMzU0CisjZGVmaW5lIEVudF9vdGhlcl90cmFuc2ZlcgkweDAwMDAwM2M0CisjZGVmaW5lIEVudF9yZWplY3RfbWVzc2FnZQkweDAwMDAwNjA0CisjZGVmaW5lIEVudF9yZXNlbGVjdGVkX2NoZWNrX25leHQJMHgwMDAwMDZmMAorI2RlZmluZSBFbnRfcmVzZWxlY3RlZF9vawkweDAwMDAwNzk4CisjZGVmaW5lIEVudF9yZXNwb25kX21lc3NhZ2UJMHgwMDAwMDYzYworI2RlZmluZSBFbnRfc2VsZWN0CTB4MDAwMDAxZjgKKyNkZWZpbmUgRW50X3NlbGVjdF9tc2dvdXQJMHgwMDAwMDIxOAorI2RlZmluZSBFbnRfdGFyZ2V0X2Fib3J0CTB4MDAwMDA4ZjQKKyNkZWZpbmUgRW50X3Rlc3RfMQkweDAwMDAwODY4CisjZGVmaW5lIEVudF90ZXN0XzIJMHgwMDAwMDg3YworI2RlZmluZSBFbnRfdGVzdF8yX21zZ291dAkweDAwMDAwODljCisjZGVmaW5lIEVudF93YWl0X3Jlc2VsZWN0CTB4MDAwMDA2YTgKK3N0YXRpYyB1MzIgTEFCRUxQQVRDSEVTW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0geworCTB4MDAwMDAwMTEsCisJMHgwMDAwMDAxYSwKKwkweDAwMDAwMDFkLAorCTB4MDAwMDAwMjgsCisJMHgwMDAwMDAyYSwKKwkweDAwMDAwMDM1LAorCTB4MDAwMDAwMzgsCisJMHgwMDAwMDA0MiwKKwkweDAwMDAwMDUwLAorCTB4MDAwMDAwNTIsCisJMHgwMDAwMDA2YiwKKwkweDAwMDAwMDgzLAorCTB4MDAwMDAwODUsCisJMHgwMDAwMDA5MCwKKwkweDAwMDAwMDk0LAorCTB4MDAwMDAwOTYsCisJMHgwMDAwMDA5YywKKwkweDAwMDAwMDllLAorCTB4MDAwMDAwYTIsCisJMHgwMDAwMDBhNCwKKwkweDAwMDAwMGE2LAorCTB4MDAwMDAwYTgsCisJMHgwMDAwMDBiNiwKKwkweDAwMDAwMGI5LAorCTB4MDAwMDAwY2MsCisJMHgwMDAwMDBjZiwKKwkweDAwMDAwMGQ4LAorCTB4MDAwMDAwZGUsCisJMHgwMDAwMDBlMCwKKwkweDAwMDAwMGU2LAorCTB4MDAwMDAwZWMsCisJMHgwMDAwMDBlZSwKKwkweDAwMDAwMGY0LAorCTB4MDAwMDAwZmMsCisJMHgwMDAwMDBmZSwKKwkweDAwMDAwMTBhLAorCTB4MDAwMDAxMGMsCisJMHgwMDAwMDEwZSwKKwkweDAwMDAwMTEwLAorCTB4MDAwMDAxMTIsCisJMHgwMDAwMDExOCwKKwkweDAwMDAwMTFhLAorCTB4MDAwMDAxMmQsCisJMHgwMDAwMDE0MywKKwkweDAwMDAwMTU4LAorCTB4MDAwMDAxNWMsCisJMHgwMDAwMDE2NCwKKwkweDAwMDAwMTY2LAorCTB4MDAwMDAxNjgsCisJMHgwMDAwMDE2ZSwKKwkweDAwMDAwMTdhLAorCTB4MDAwMDAxYWIsCisJMHgwMDAwMDFiOCwKKwkweDAwMDAwMWJmLAorCTB4MDAwMDAxYzMsCisJMHgwMDAwMDFjNywKKwkweDAwMDAwMWNiLAorCTB4MDAwMDAxZTAsCisJMHgwMDAwMDFmOCwKKwkweDAwMDAwMjA3LAorCTB4MDAwMDAyMGYsCisJMHgwMDAwMDIxMywKKwkweDAwMDAwMjE3LAorCTB4MDAwMDAyMjQsCisJMHgwMDAwMDIyNiwKKwkweDAwMDAwMjQ4LAorCTB4MDAwMDAyNGEsCisJMHgwMDAwMDI0YywKKwkweDAwMDAwMjRlLAorCTB4MDAwMDAyNTAsCisJMHgwMDAwMDI1MiwKKwkweDAwMDAwMjU2LAorCTB4MDAwMDAyNWEsCisJMHgwMDAwMDI1YywKKwkweDAwMDAwMjYwLAorCTB4MDAwMDAyNjIsCisJMHgwMDAwMDI2NiwKKwkweDAwMDAwMjY4LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyCW9mZnNldDsKKwl2b2lkCQkqYWRkcmVzczsKK30gRVhURVJOQUxfUEFUQ0hFU1tdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHsKK307CisKK3N0YXRpYyB1MzIgSU5TVFJVQ1RJT05TIF9fYXR0cmlidXRlKCh1bnVzZWQpKQk9IDI5MDsKK3N0YXRpYyB1MzIgUEFUQ0hFUyBfX2F0dHJpYnV0ZSgodW51c2VkKSkJPSA3ODsKK3N0YXRpYyB1MzIgRVhURVJOQUxfUEFUQ0hFU19MRU4gX19hdHRyaWJ1dGUoKHVudXNlZCkpCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3eHhfdS5oX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvNTNjN3h4X3UuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzM3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvNTNjN3h4X3UuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTAyIEBACisjdW5kZWYgQV9OQ1I1M2M3eHhfbXNnX2Fib3J0CisjdW5kZWYgQV9OQ1I1M2M3eHhfbXNnX3JlamVjdAorI3VuZGVmIEFfTkNSNTNjN3h4X3NpbmsKKyN1bmRlZiBBX05DUjUzYzd4eF96ZXJvCisjdW5kZWYgQV9OT1BfaW5zbgorI3VuZGVmIEFfYWRkcl9kc2EKKyN1bmRlZiBBX2FkZHJfcmVjb25uZWN0X2RzYV9oZWFkCisjdW5kZWYgQV9hZGRyX3NjcmF0Y2gKKyN1bmRlZiBBX2FkZHJfdGVtcAorI3VuZGVmIEFfZG1vZGVfbWVtb3J5X3RvX21lbW9yeQorI3VuZGVmIEFfZG1vZGVfbWVtb3J5X3RvX25jcgorI3VuZGVmIEFfZG1vZGVfbmNyX3RvX21lbW9yeQorI3VuZGVmIEFfZHNhX2NoZWNrX3Jlc2VsZWN0CisjdW5kZWYgQV9kc2FfY21kb3V0CisjdW5kZWYgQV9kc2FfY21uZAorI3VuZGVmIEFfZHNhX2RhdGFpbgorI3VuZGVmIEFfZHNhX2RhdGFvdXQKKyN1bmRlZiBBX2RzYV9lbmQKKyN1bmRlZiBBX2RzYV9maWVsZHNfc3RhcnQKKyN1bmRlZiBBX2RzYV9tc2dpbgorI3VuZGVmIEFfZHNhX21zZ291dAorI3VuZGVmIEFfZHNhX21zZ291dF9vdGhlcgorI3VuZGVmIEFfZHNhX25leHQKKyN1bmRlZiBBX2RzYV9yZXN0b3JlX3BvaW50ZXJzCisjdW5kZWYgQV9kc2Ffc2F2ZV9kYXRhX3BvaW50ZXIKKyN1bmRlZiBBX2RzYV9zZWxlY3QKKyN1bmRlZiBBX2RzYV9zc2NmXzcxMAorI3VuZGVmIEFfZHNhX3N0YXR1cworI3VuZGVmIEFfZHNhX3RlbXBfYWRkcl9hcnJheV92YWx1ZQorI3VuZGVmIEFfZHNhX3RlbXBfYWRkcl9kc2FfdmFsdWUKKyN1bmRlZiBBX2RzYV90ZW1wX2FkZHJfbmV3X3ZhbHVlCisjdW5kZWYgQV9kc2FfdGVtcF9hZGRyX25leHQKKyN1bmRlZiBBX2RzYV90ZW1wX2FkZHJfcmVzaWR1YWwKKyN1bmRlZiBBX2RzYV90ZW1wX2FkZHJfc2F2ZWRfcG9pbnRlcgorI3VuZGVmIEFfZHNhX3RlbXBfYWRkcl9zYXZlZF9yZXNpZHVhbAorI3VuZGVmIEFfZHNhX3RlbXBfbHVuCisjdW5kZWYgQV9kc2FfdGVtcF9uZXh0CisjdW5kZWYgQV9kc2FfdGVtcF9zeW5jCisjdW5kZWYgQV9kc2FfdGVtcF90YXJnZXQKKyN1bmRlZiBBX2VtdWxmbHkKKyN1bmRlZiBBX2ludF9kZWJ1Z19icmVhaworI3VuZGVmIEFfaW50X2RlYnVnX3BhbmljCisjdW5kZWYgQV9pbnRfZXJyX2NoZWNrX2NvbmRpdGlvbgorI3VuZGVmIEFfaW50X2Vycl9ub19waGFzZQorI3VuZGVmIEFfaW50X2Vycl9zZWxlY3RlZAorI3VuZGVmIEFfaW50X2Vycl91bmV4cGVjdGVkX3BoYXNlCisjdW5kZWYgQV9pbnRfZXJyX3VuZXhwZWN0ZWRfcmVzZWxlY3QKKyN1bmRlZiBBX2ludF9tc2dfMQorI3VuZGVmIEFfaW50X21zZ19zZHRyCisjdW5kZWYgQV9pbnRfbXNnX3dkdHIKKyN1bmRlZiBBX2ludF9ub3JtX2Fib3J0ZWQKKyN1bmRlZiBBX2ludF9ub3JtX2NvbW1hbmRfY29tcGxldGUKKyN1bmRlZiBBX2ludF9ub3JtX2Rpc2Nvbm5lY3RlZAorI3VuZGVmIEFfaW50X25vcm1fZW11bGF0ZWludGZseQorI3VuZGVmIEFfaW50X25vcm1fcmVzZWxlY3RfY29tcGxldGUKKyN1bmRlZiBBX2ludF9ub3JtX3Jlc2V0CisjdW5kZWYgQV9pbnRfbm9ybV9zZWxlY3RfY29tcGxldGUKKyN1bmRlZiBBX2ludF90ZXN0XzEKKyN1bmRlZiBBX2ludF90ZXN0XzIKKyN1bmRlZiBBX2ludF90ZXN0XzMKKyN1bmRlZiBBX21zZ19idWYKKyN1bmRlZiBBX3JlY29ubmVjdF9kc2FfaGVhZAorI3VuZGVmIEFfcmVzZWxlY3RlZF9pZGVudGlmeQorI3VuZGVmIEFfcmVzZWxlY3RlZF90YWcKKyN1bmRlZiBBX3NhdmVkX2RzYQorI3VuZGVmIEFfc2NoZWR1bGUKKyN1bmRlZiBBX3Rlc3RfZGVzdAorI3VuZGVmIEFfdGVzdF9zcmMKKyN1bmRlZiBFbnRfYWNjZXB0X21lc3NhZ2UKKyN1bmRlZiBFbnRfY21kb3V0X2NtZG91dAorI3VuZGVmIEVudF9jb21tYW5kX2NvbXBsZXRlCisjdW5kZWYgRW50X2NvbW1hbmRfY29tcGxldGVfbXNnaW4KKyN1bmRlZiBFbnRfZGF0YV90cmFuc2ZlcgorI3VuZGVmIEVudF9kYXRhaW5fdG9fanVtcAorI3VuZGVmIEVudF9kZWJ1Z19icmVhaworI3VuZGVmIEVudF9kc2FfY29kZV9iZWdpbgorI3VuZGVmIEVudF9kc2FfY29kZV9jaGVja19yZXNlbGVjdAorI3VuZGVmIEVudF9kc2FfY29kZV9maXhfanVtcAorI3VuZGVmIEVudF9kc2FfY29kZV9yZXN0b3JlX3BvaW50ZXJzCisjdW5kZWYgRW50X2RzYV9jb2RlX3NhdmVfZGF0YV9wb2ludGVyCisjdW5kZWYgRW50X2RzYV9jb2RlX3RlbXBsYXRlCisjdW5kZWYgRW50X2RzYV9jb2RlX3RlbXBsYXRlX2VuZAorI3VuZGVmIEVudF9kc2Ffc2NoZWR1bGUKKyN1bmRlZiBFbnRfZHNhX3plcm8KKyN1bmRlZiBFbnRfZW5kX2RhdGFfdHJhbnNmZXIKKyN1bmRlZiBFbnRfaW5pdGlhdG9yX2Fib3J0CisjdW5kZWYgRW50X21zZ19pbgorI3VuZGVmIEVudF9tc2dfaW5fcmVzdGFydAorI3VuZGVmIEVudF9vdGhlcl9pbgorI3VuZGVmIEVudF9vdGhlcl9vdXQKKyN1bmRlZiBFbnRfb3RoZXJfdHJhbnNmZXIKKyN1bmRlZiBFbnRfcmVqZWN0X21lc3NhZ2UKKyN1bmRlZiBFbnRfcmVzZWxlY3RlZF9jaGVja19uZXh0CisjdW5kZWYgRW50X3Jlc2VsZWN0ZWRfb2sKKyN1bmRlZiBFbnRfcmVzcG9uZF9tZXNzYWdlCisjdW5kZWYgRW50X3NlbGVjdAorI3VuZGVmIEVudF9zZWxlY3RfbXNnb3V0CisjdW5kZWYgRW50X3RhcmdldF9hYm9ydAorI3VuZGVmIEVudF90ZXN0XzEKKyN1bmRlZiBFbnRfdGVzdF8yCisjdW5kZWYgRW50X3Rlc3RfMl9tc2dvdXQKKyN1bmRlZiBFbnRfd2FpdF9yZXNlbGVjdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMgYi9kcml2ZXJzL3Njc2kvQnVzTG9naWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI1MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKQEAgLTAsMCArMSwzNTc0IEBACisKKy8qCisKKyAgTGludXggRHJpdmVyIGZvciBCdXNMb2dpYyBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludCBTQ1NJIEhvc3QgQWRhcHRlcnMKKworICBDb3B5cmlnaHQgMTk5NS0xOTk4IGJ5IExlb25hcmQgTi4gWnVia29mZiA8bG56QGRhbmRlbGlvbi5jb20+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgZm9yIGNvbXBsZXRlIGRldGFpbHMuCisKKyAgVGhlIGF1dGhvciByZXNwZWN0ZnVsbHkgcmVxdWVzdHMgdGhhdCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIHNvZnR3YXJlIGJlCisgIHNlbnQgZGlyZWN0bHkgdG8gaGltIGZvciBldmFsdWF0aW9uIGFuZCB0ZXN0aW5nLgorCisgIFNwZWNpYWwgdGhhbmtzIHRvIFdheW5lIFllbiwgSmluLUxvbiBIb24sIGFuZCBBbGV4IFdpbiBvZiBCdXNMb2dpYywgd2hvc2UKKyAgYWR2aWNlIGhhcyBiZWVuIGludmFsdWFibGUsIHRvIERhdmlkIEdlbnR6ZWwsIGZvciB3cml0aW5nIHRoZSBvcmlnaW5hbCBMaW51eAorICBCdXNMb2dpYyBkcml2ZXIsIGFuZCB0byBQYXVsIEdvcnRtYWtlciwgZm9yIGJlaW5nIHN1Y2ggYSBkZWRpY2F0ZWQgdGVzdCBzaXRlLgorCisgIEZpbmFsbHksIHNwZWNpYWwgdGhhbmtzIHRvIE15bGV4L0J1c0xvZ2ljIGZvciBtYWtpbmcgdGhlIEZsYXNoUG9pbnQgU0NDQgorICBNYW5hZ2VyIGF2YWlsYWJsZSBhcyBmcmVlbHkgcmVkaXN0cmlidXRhYmxlIHNvdXJjZSBjb2RlLgorCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0RyaXZlclZlcnNpb24JCSIyLjEuMTYiCisjZGVmaW5lIEJ1c0xvZ2ljX0RyaXZlckRhdGUJCSIxOCBKdWx5IDIwMDIiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSAiQnVzTG9naWMuaCIKKyNpbmNsdWRlICJGbGFzaFBvaW50LmMiCisKKyNpZm5kZWYgRkFJTFVSRQorI2RlZmluZSBGQUlMVVJFICgtMSkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBCdXNfTG9naWNfdGVtcGxhdGU7CisKKy8qCisgIEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNDb3VudCBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgQnVzTG9naWMgRHJpdmVyCisgIE9wdGlvbnMgc3BlY2lmaWNhdGlvbnMgcHJvdmlkZWQgdmlhIHRoZSBMaW51eCBLZXJuZWwgQ29tbWFuZCBMaW5lIG9yIHZpYQorICB0aGUgTG9hZGFibGUgS2VybmVsIE1vZHVsZSBJbnN0YWxsYXRpb24gRmFjaWxpdHkuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNDb3VudDsKKworCisvKgorICBCdXNMb2dpY19Ecml2ZXJPcHRpb25zIGlzIGFuIGFycmF5IG9mIERyaXZlciBPcHRpb25zIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nCisgIEJ1c0xvZ2ljIERyaXZlciBPcHRpb25zIHNwZWNpZmljYXRpb25zIHByb3ZpZGVkIHZpYSB0aGUgTGludXggS2VybmVsIENvbW1hbmQKKyAgTGluZSBvciB2aWEgdGhlIExvYWRhYmxlIEtlcm5lbCBNb2R1bGUgSW5zdGFsbGF0aW9uIEZhY2lsaXR5LgorKi8KKworc3RhdGljIHN0cnVjdCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zIEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNbQnVzTG9naWNfTWF4SG9zdEFkYXB0ZXJzXTsKKworCisvKgorICBCdXNMb2dpYyBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcgYnkgaW5zbW9kLgorKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNoYXIgKkJ1c0xvZ2ljOworbW9kdWxlX3BhcmFtKEJ1c0xvZ2ljLCBjaGFycCwgMCk7CisjZW5kaWYKKworCisvKgorICBCdXNMb2dpY19Qcm9iZU9wdGlvbnMgaXMgYSBzZXQgb2YgUHJvYmUgT3B0aW9ucyB0byBiZSBhcHBsaWVkIGFjcm9zcworICBhbGwgQnVzTG9naWMgSG9zdCBBZGFwdGVycy4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgQnVzTG9naWNfUHJvYmVPcHRpb25zIEJ1c0xvZ2ljX1Byb2JlT3B0aW9uczsKKworCisvKgorICBCdXNMb2dpY19HbG9iYWxPcHRpb25zIGlzIGEgc2V0IG9mIEdsb2JhbCBPcHRpb25zIHRvIGJlIGFwcGxpZWQgYWNyb3NzCisgIGFsbCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzLgorKi8KKworc3RhdGljIHN0cnVjdCBCdXNMb2dpY19HbG9iYWxPcHRpb25zIEJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnM7CisKK3N0YXRpYyBMSVNUX0hFQUQoQnVzTG9naWNfaG9zdF9saXN0KTsKKworLyoKKyAgQnVzTG9naWNfUHJvYmVJbmZvQ291bnQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50OworCisKKy8qCisgIEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QgaXMgdGhlIGxpc3Qgb2YgSS9PIEFkZHJlc3NlcyBhbmQgQnVzIFByb2JlIEluZm9ybWF0aW9uCisgIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzLiAgSXQgaXMgaW5pdGlhbGl6ZWQgYnkKKyAgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2Ugb24gUENJIG1hY2hpbmVzIGFzIHdlbGwgYXMgZnJvbSB0aGUKKyAgbGlzdCBvZiBzdGFuZGFyZCBCdXNMb2dpYyBJL08gQWRkcmVzc2VzLgorKi8KKworc3RhdGljIHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8gKkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3Q7CisKKworLyoKKyAgQnVzTG9naWNfQ29tbWFuZEZhaWx1cmVSZWFzb24gaG9sZHMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHJlYXNvbiB3aHkgYQorICBjYWxsIHRvIEJ1c0xvZ2ljX0NvbW1hbmQgZmFpbGVkLiAgSXQgaXMgb25seSBub24tTlVMTCB3aGVuIEJ1c0xvZ2ljX0NvbW1hbmQKKyAgcmV0dXJucyBhIGZhaWx1cmUgY29kZS4KKyovCisKK3N0YXRpYyBjaGFyICpCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbjsKKworLyoKKyAgQnVzTG9naWNfQW5ub3VuY2VEcml2ZXIgYW5ub3VuY2VzIHRoZSBEcml2ZXIgVmVyc2lvbiBhbmQgRGF0ZSwgQXV0aG9yJ3MKKyAgTmFtZSwgQ29weXJpZ2h0IE5vdGljZSwgYW5kIEVsZWN0cm9uaWMgTWFpbCBBZGRyZXNzLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfQW5ub3VuY2VEcml2ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlCdXNMb2dpY19Bbm5vdW5jZSgiKioqKiogQnVzTG9naWMgU0NTSSBEcml2ZXIgVmVyc2lvbiAiIEJ1c0xvZ2ljX0RyaXZlclZlcnNpb24gIiBvZiAiIEJ1c0xvZ2ljX0RyaXZlckRhdGUgIiAqKioqKlxuIiwgSG9zdEFkYXB0ZXIpOworCUJ1c0xvZ2ljX0Fubm91bmNlKCJDb3B5cmlnaHQgMTk5NS0xOTk4IGJ5IExlb25hcmQgTi4gWnVia29mZiAiICI8bG56QGRhbmRlbGlvbi5jb20+XG4iLCBIb3N0QWRhcHRlcik7Cit9CisKKworLyoKKyAgQnVzTG9naWNfRHJpdmVySW5mbyByZXR1cm5zIHRoZSBIb3N0IEFkYXB0ZXIgTmFtZSB0byBpZGVudGlmeSB0aGlzIFNDU0kKKyAgRHJpdmVyIGFuZCBIb3N0IEFkYXB0ZXIuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqQnVzTG9naWNfRHJpdmVySW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0KQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIEhvc3QtPmhvc3RkYXRhOworCXJldHVybiBIb3N0QWRhcHRlci0+RnVsbE1vZGVsTmFtZTsKK30KKworLyoKKyAgQnVzTG9naWNfSW5pdGlhbGl6ZUNDQnMgaW5pdGlhbGl6ZXMgYSBncm91cCBvZiBDb21tYW5kIENvbnRyb2wgQmxvY2tzIChDQ0JzKQorICBmb3IgSG9zdCBBZGFwdGVyIGZyb20gdGhlIEJsb2NrU2l6ZSBieXRlcyBsb2NhdGVkIGF0IEJsb2NrUG9pbnRlci4gIFRoZSBuZXdseQorICBjcmVhdGVkIENDQnMgYXJlIGFkZGVkIHRvIEhvc3QgQWRhcHRlcidzIGZyZWUgbGlzdC4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX0luaXRpYWxpemVDQ0JzKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIsIHZvaWQgKkJsb2NrUG9pbnRlciwgaW50IEJsb2NrU2l6ZSwgZG1hX2FkZHJfdCBCbG9ja1BvaW50ZXJIYW5kbGUpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCID0gKHN0cnVjdCBCdXNMb2dpY19DQ0IgKikgQmxvY2tQb2ludGVyOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCW1lbXNldChCbG9ja1BvaW50ZXIsIDAsIEJsb2NrU2l6ZSk7CisJQ0NCLT5BbGxvY2F0aW9uR3JvdXBIZWFkID0gQmxvY2tQb2ludGVySGFuZGxlOworCUNDQi0+QWxsb2NhdGlvbkdyb3VwU2l6ZSA9IEJsb2NrU2l6ZTsKKwl3aGlsZSAoKEJsb2NrU2l6ZSAtPSBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0NDQikpID49IDApIHsKKwkJQ0NCLT5TdGF0dXMgPSBCdXNMb2dpY19DQ0JfRnJlZTsKKwkJQ0NCLT5Ib3N0QWRhcHRlciA9IEhvc3RBZGFwdGVyOworCQlDQ0ItPkRNQV9IYW5kbGUgPSAodTMyKSBCbG9ja1BvaW50ZXJIYW5kbGUgKyBvZmZzZXQ7CisJCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkgeworCQkJQ0NCLT5DYWxsYmFja0Z1bmN0aW9uID0gQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0I7CisJCQlDQ0ItPkJhc2VBZGRyZXNzID0gSG9zdEFkYXB0ZXItPkZsYXNoUG9pbnRJbmZvLkJhc2VBZGRyZXNzOworCQl9CisJCUNDQi0+TmV4dCA9IEhvc3RBZGFwdGVyLT5GcmVlX0NDQnM7CisJCUNDQi0+TmV4dEFsbCA9IEhvc3RBZGFwdGVyLT5BbGxfQ0NCczsKKwkJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IENDQjsKKwkJSG9zdEFkYXB0ZXItPkFsbF9DQ0JzID0gQ0NCOworCQlIb3N0QWRhcHRlci0+QWxsb2NhdGVkQ0NCcysrOworCQlDQ0IrKzsKKwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfQ0NCKTsKKwl9Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ3JlYXRlSW5pdGlhbENDQnMgYWxsb2NhdGVzIHRoZSBpbml0aWFsIENDQnMgZm9yIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBib29sZWFuIF9faW5pdCBCdXNMb2dpY19DcmVhdGVJbml0aWFsQ0NCcyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCWludCBCbG9ja1NpemUgPSBCdXNMb2dpY19DQ0JfQWxsb2NhdGlvbkdyb3VwU2l6ZSAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfQ0NCKTsKKwl2b2lkICpCbG9ja1BvaW50ZXI7CisJZG1hX2FkZHJfdCBCbG9ja1BvaW50ZXJIYW5kbGU7CisJd2hpbGUgKEhvc3RBZGFwdGVyLT5BbGxvY2F0ZWRDQ0JzIDwgSG9zdEFkYXB0ZXItPkluaXRpYWxDQ0JzKSB7CisJCUJsb2NrUG9pbnRlciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBCbG9ja1NpemUsICZCbG9ja1BvaW50ZXJIYW5kbGUpOworCQlpZiAoQmxvY2tQb2ludGVyID09IE5VTEwpIHsKKwkJCUJ1c0xvZ2ljX0Vycm9yKCJVTkFCTEUgVE8gQUxMT0NBVEUgQ0NCIEdST1VQIC0gREVUQUNISU5HXG4iLCBIb3N0QWRhcHRlcik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJQnVzTG9naWNfSW5pdGlhbGl6ZUNDQnMoSG9zdEFkYXB0ZXIsIEJsb2NrUG9pbnRlciwgQmxvY2tTaXplLCBCbG9ja1BvaW50ZXJIYW5kbGUpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKgorICBCdXNMb2dpY19EZXN0cm95Q0NCcyBkZWFsbG9jYXRlcyB0aGUgQ0NCcyBmb3IgSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfRGVzdHJveUNDQnMoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpOZXh0Q0NCID0gSG9zdEFkYXB0ZXItPkFsbF9DQ0JzLCAqQ0NCLCAqTGFzdF9DQ0IgPSBOVUxMOworCUhvc3RBZGFwdGVyLT5BbGxfQ0NCcyA9IE5VTEw7CisJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IE5VTEw7CisJd2hpbGUgKChDQ0IgPSBOZXh0Q0NCKSAhPSBOVUxMKSB7CisJCU5leHRDQ0IgPSBDQ0ItPk5leHRBbGw7CisJCWlmIChDQ0ItPkFsbG9jYXRpb25Hcm91cEhlYWQpIHsKKwkJCWlmIChMYXN0X0NDQikKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBMYXN0X0NDQi0+QWxsb2NhdGlvbkdyb3VwU2l6ZSwgTGFzdF9DQ0IsIExhc3RfQ0NCLT5BbGxvY2F0aW9uR3JvdXBIZWFkKTsKKwkJCUxhc3RfQ0NCID0gQ0NCOworCQl9CisJfQorCWlmIChMYXN0X0NDQikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChIb3N0QWRhcHRlci0+UENJX0RldmljZSwgTGFzdF9DQ0ItPkFsbG9jYXRpb25Hcm91cFNpemUsIExhc3RfQ0NCLCBMYXN0X0NDQi0+QWxsb2NhdGlvbkdyb3VwSGVhZCk7Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ3JlYXRlQWRkaXRpb25hbENDQnMgYWxsb2NhdGVzIEFkZGl0aW9uYWwgQ0NCcyBmb3IgSG9zdCBBZGFwdGVyLiAgSWYKKyAgYWxsb2NhdGlvbiBmYWlscyBhbmQgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBDQ0JzIGF2YWlsYWJsZSwgdGhlIERyaXZlciBRdWV1ZQorICBEZXB0aCBpcyBkZWNyZWFzZWQgdG8gYSBrbm93biBzYWZlIHZhbHVlIHRvIGF2b2lkIHBvdGVudGlhbCBkZWFkbG9ja3Mgd2hlbgorICBtdWx0aXBsZSBob3N0IGFkYXB0ZXJzIHNoYXJlIHRoZSBzYW1lIElSUSBDaGFubmVsLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfQ3JlYXRlQWRkaXRpb25hbENDQnMoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciwgaW50IEFkZGl0aW9uYWxDQ0JzLCBib29sZWFuIFN1Y2Nlc3NNZXNzYWdlUCkKK3sKKwlpbnQgQmxvY2tTaXplID0gQnVzTG9naWNfQ0NCX0FsbG9jYXRpb25Hcm91cFNpemUgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0NDQik7CisJaW50IFByZXZpb3VzbHlBbGxvY2F0ZWQgPSBIb3N0QWRhcHRlci0+QWxsb2NhdGVkQ0NCczsKKwl2b2lkICpCbG9ja1BvaW50ZXI7CisJZG1hX2FkZHJfdCBCbG9ja1BvaW50ZXJIYW5kbGU7CisJaWYgKEFkZGl0aW9uYWxDQ0JzIDw9IDApCisJCXJldHVybjsKKwl3aGlsZSAoSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMgLSBQcmV2aW91c2x5QWxsb2NhdGVkIDwgQWRkaXRpb25hbENDQnMpIHsKKwkJQmxvY2tQb2ludGVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIEJsb2NrU2l6ZSwgJkJsb2NrUG9pbnRlckhhbmRsZSk7CisJCWlmIChCbG9ja1BvaW50ZXIgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlCdXNMb2dpY19Jbml0aWFsaXplQ0NCcyhIb3N0QWRhcHRlciwgQmxvY2tQb2ludGVyLCBCbG9ja1NpemUsIEJsb2NrUG9pbnRlckhhbmRsZSk7CisJfQorCWlmIChIb3N0QWRhcHRlci0+QWxsb2NhdGVkQ0NCcyA+IFByZXZpb3VzbHlBbGxvY2F0ZWQpIHsKKwkJaWYgKFN1Y2Nlc3NNZXNzYWdlUCkKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQWxsb2NhdGVkICVkIGFkZGl0aW9uYWwgQ0NCcyAodG90YWwgbm93ICVkKVxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5BbGxvY2F0ZWRDQ0JzIC0gUHJldmlvdXNseUFsbG9jYXRlZCwgSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMpOworCQlyZXR1cm47CisJfQorCUJ1c0xvZ2ljX05vdGljZSgiRmFpbGVkIHRvIGFsbG9jYXRlIGFkZGl0aW9uYWwgQ0NCc1xuIiwgSG9zdEFkYXB0ZXIpOworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCA+IEhvc3RBZGFwdGVyLT5BbGxvY2F0ZWRDQ0JzIC0gSG9zdEFkYXB0ZXItPlRhcmdldERldmljZUNvdW50KSB7CisJCUhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoID0gSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMgLSBIb3N0QWRhcHRlci0+VGFyZ2V0RGV2aWNlQ291bnQ7CisJCUhvc3RBZGFwdGVyLT5TQ1NJX0hvc3QtPmNhbl9xdWV1ZSA9IEhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoOworCX0KK30KKworLyoKKyAgQnVzTG9naWNfQWxsb2NhdGVDQ0IgYWxsb2NhdGVzIGEgQ0NCIGZyb20gSG9zdCBBZGFwdGVyJ3MgZnJlZSBsaXN0LAorICBhbGxvY2F0aW5nIG1vcmUgbWVtb3J5IGZyb20gdGhlIEtlcm5lbCBpZiBuZWNlc3NhcnkuICBUaGUgSG9zdCBBZGFwdGVyJ3MKKyAgTG9jayBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWNxdWlyZWQgYnkgdGhlIGNhbGxlci4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgQnVzTG9naWNfQ0NCICpCdXNMb2dpY19BbGxvY2F0ZUNDQihzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIKKwkJCQkJCSAqSG9zdEFkYXB0ZXIpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgU2VyaWFsTnVtYmVyID0gMDsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpDQ0I7CisJQ0NCID0gSG9zdEFkYXB0ZXItPkZyZWVfQ0NCczsKKwlpZiAoQ0NCICE9IE5VTEwpIHsKKwkJQ0NCLT5TZXJpYWxOdW1iZXIgPSArK1NlcmlhbE51bWJlcjsKKwkJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IENDQi0+TmV4dDsKKwkJQ0NCLT5OZXh0ID0gTlVMTDsKKwkJaWYgKEhvc3RBZGFwdGVyLT5GcmVlX0NDQnMgPT0gTlVMTCkKKwkJCUJ1c0xvZ2ljX0NyZWF0ZUFkZGl0aW9uYWxDQ0JzKEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+SW5jcmVtZW50YWxDQ0JzLCB0cnVlKTsKKwkJcmV0dXJuIENDQjsKKwl9CisJQnVzTG9naWNfQ3JlYXRlQWRkaXRpb25hbENDQnMoSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JbmNyZW1lbnRhbENDQnMsIHRydWUpOworCUNDQiA9IEhvc3RBZGFwdGVyLT5GcmVlX0NDQnM7CisJaWYgKENDQiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlDQ0ItPlNlcmlhbE51bWJlciA9ICsrU2VyaWFsTnVtYmVyOworCUhvc3RBZGFwdGVyLT5GcmVlX0NDQnMgPSBDQ0ItPk5leHQ7CisJQ0NCLT5OZXh0ID0gTlVMTDsKKwlyZXR1cm4gQ0NCOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IgZGVhbGxvY2F0ZXMgYSBDQ0IsIHJldHVybmluZyBpdCB0byB0aGUgSG9zdCBBZGFwdGVyJ3MKKyAgZnJlZSBsaXN0LiAgVGhlIEhvc3QgQWRhcHRlcidzIExvY2sgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGFjcXVpcmVkIGJ5IHRoZQorICBjYWxsZXIuCisqLworCitzdGF0aWMgdm9pZCBCdXNMb2dpY19EZWFsbG9jYXRlQ0NCKHN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyID0gQ0NCLT5Ib3N0QWRhcHRlcjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBDQ0ItPkNvbW1hbmQ7CisKKwlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQlwY2lfdW5tYXBfc2coSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsCisJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJY21kLT51c2Vfc2csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBDQ0ItPkRhdGFQb2ludGVyLAorCQkJCUNDQi0+RGF0YUxlbmd0aCwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfQorCXBjaV91bm1hcF9zaW5nbGUoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIENDQi0+U2Vuc2VEYXRhUG9pbnRlciwKKwkJCUNDQi0+U2Vuc2VEYXRhTGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJQ0NCLT5Db21tYW5kID0gTlVMTDsKKwlDQ0ItPlN0YXR1cyA9IEJ1c0xvZ2ljX0NDQl9GcmVlOworCUNDQi0+TmV4dCA9IEhvc3RBZGFwdGVyLT5GcmVlX0NDQnM7CisJSG9zdEFkYXB0ZXItPkZyZWVfQ0NCcyA9IENDQjsKK30KKworCisvKgorICBCdXNMb2dpY19Db21tYW5kIHNlbmRzIHRoZSBjb21tYW5kIE9wZXJhdGlvbkNvZGUgdG8gSG9zdEFkYXB0ZXIsIG9wdGlvbmFsbHkKKyAgcHJvdmlkaW5nIFBhcmFtZXRlckxlbmd0aCBieXRlcyBvZiBQYXJhbWV0ZXJEYXRhIGFuZCByZWNlaXZpbmcgYXQgbW9zdAorICBSZXBseUxlbmd0aCBieXRlcyBvZiBSZXBseURhdGE7IGFueSBleGNlc3MgcmVwbHkgZGF0YSBpcyByZWNlaXZlZCBidXQKKyAgZGlzY2FyZGVkLgorCisgIE9uIHN1Y2Nlc3MsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlcGx5IGJ5dGVzIHJlYWQgZnJvbQorICB0aGUgSG9zdCBBZGFwdGVyIChpbmNsdWRpbmcgYW55IGRpc2NhcmRlZCBkYXRhKTsgb24gZmFpbHVyZSwgaXQgcmV0dXJucworICAtMSBpZiB0aGUgY29tbWFuZCB3YXMgaW52YWxpZCwgb3IgLTIgaWYgYSB0aW1lb3V0IG9jY3VycmVkLgorCisgIEJ1c0xvZ2ljX0NvbW1hbmQgaXMgY2FsbGVkIGV4Y2x1c2l2ZWx5IGR1cmluZyBob3N0IGFkYXB0ZXIgZGV0ZWN0aW9uIGFuZAorICBpbml0aWFsaXphdGlvbiwgc28gcGVyZm9ybWFuY2UgYW5kIGxhdGVuY3kgYXJlIG5vdCBjcml0aWNhbCwgYW5kIGV4Y2x1c2l2ZQorICBhY2Nlc3MgdG8gdGhlIEhvc3QgQWRhcHRlciBoYXJkd2FyZSBpcyBhc3N1bWVkLiAgT25jZSB0aGUgaG9zdCBhZGFwdGVyIGFuZAorICBkcml2ZXIgYXJlIGluaXRpYWxpemVkLCB0aGUgb25seSBIb3N0IEFkYXB0ZXIgY29tbWFuZCB0aGF0IGlzIGlzc3VlZCBpcyB0aGUKKyAgc2luZ2xlIGJ5dGUgRXhlY3V0ZSBNYWlsYm94IENvbW1hbmQgb3BlcmF0aW9uIGNvZGUsIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUKKyAgd2FpdGluZyBmb3IgdGhlIEhvc3QgQWRhcHRlciBSZWFkeSBiaXQgdG8gYmUgc2V0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0NvbW1hbmQoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciwgZW51bSBCdXNMb2dpY19PcGVyYXRpb25Db2RlIE9wZXJhdGlvbkNvZGUsIHZvaWQgKlBhcmFtZXRlckRhdGEsIGludCBQYXJhbWV0ZXJMZW5ndGgsIHZvaWQgKlJlcGx5RGF0YSwgaW50IFJlcGx5TGVuZ3RoKQoreworCXVuc2lnbmVkIGNoYXIgKlBhcmFtZXRlclBvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKSBQYXJhbWV0ZXJEYXRhOworCXVuc2lnbmVkIGNoYXIgKlJlcGx5UG9pbnRlciA9ICh1bnNpZ25lZCBjaGFyICopIFJlcGx5RGF0YTsKKwl1bmlvbiBCdXNMb2dpY19TdGF0dXNSZWdpc3RlciBTdGF0dXNSZWdpc3RlcjsKKwl1bmlvbiBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3RlciBJbnRlcnJ1cHRSZWdpc3RlcjsKKwl1bnNpZ25lZCBsb25nIFByb2Nlc3NvckZsYWdzID0gMDsKKwlpbnQgUmVwbHlCeXRlcyA9IDAsIFJlc3VsdDsKKwlsb25nIFRpbWVvdXRDb3VudGVyOworCS8qCisJICAgQ2xlYXIgb3V0IHRoZSBSZXBseSBEYXRhIGlmIHByb3ZpZGVkLgorCSAqLworCWlmIChSZXBseUxlbmd0aCA+IDApCisJCW1lbXNldChSZXBseURhdGEsIDAsIFJlcGx5TGVuZ3RoKTsKKwkvKgorCSAgIElmIHRoZSBJUlEgQ2hhbm5lbCBoYXMgbm90IHlldCBiZWVuIGFjcXVpcmVkLCB0aGVuIGludGVycnVwdHMgbXVzdCBiZQorCSAgIGRpc2FibGVkIHdoaWxlIGlzc3VpbmcgaG9zdCBhZGFwdGVyIGNvbW1hbmRzIHNpbmNlIGEgQ29tbWFuZCBDb21wbGV0ZQorCSAgIGludGVycnVwdCBjb3VsZCBvY2N1ciBpZiB0aGUgSVJRIENoYW5uZWwgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBieSBhbm90aGVyCisJICAgQnVzTG9naWMgSG9zdCBBZGFwdGVyIG9yIGFub3RoZXIgZHJpdmVyIHNoYXJpbmcgdGhlIHNhbWUgSVJRIENoYW5uZWwuCisJICovCisJaWYgKCFIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWxBY3F1aXJlZCkgeworCQlsb2NhbF9pcnFfc2F2ZShQcm9jZXNzb3JGbGFncyk7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJfQorCS8qCisJICAgV2FpdCBmb3IgdGhlIEhvc3QgQWRhcHRlciBSZWFkeSBiaXQgdG8gYmUgc2V0IGFuZCB0aGUgQ29tbWFuZC9QYXJhbWV0ZXIKKwkgICBSZWdpc3RlciBCdXN5IGJpdCB0byBiZSByZXNldCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorCSAqLworCVRpbWVvdXRDb3VudGVyID0gMTAwMDA7CisJd2hpbGUgKC0tVGltZW91dENvdW50ZXIgPj0gMCkgeworCQlTdGF0dXNSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkU3RhdHVzUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQlpZiAoU3RhdHVzUmVnaXN0ZXIuc3IuSG9zdEFkYXB0ZXJSZWFkeSAmJiAhU3RhdHVzUmVnaXN0ZXIuc3IuQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyQnVzeSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJaWYgKFRpbWVvdXRDb3VudGVyIDwgMCkgeworCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJUaW1lb3V0IHdhaXRpbmcgZm9yIEhvc3QgQWRhcHRlciBSZWFkeSI7CisJCVJlc3VsdCA9IC0yOworCQlnb3RvIERvbmU7CisJfQorCS8qCisJICAgV3JpdGUgdGhlIE9wZXJhdGlvbkNvZGUgdG8gdGhlIENvbW1hbmQvUGFyYW1ldGVyIFJlZ2lzdGVyLgorCSAqLworCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckNvbW1hbmRDb21wbGV0ZWQgPSBmYWxzZTsKKwlCdXNMb2dpY19Xcml0ZUNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlcihIb3N0QWRhcHRlciwgT3BlcmF0aW9uQ29kZSk7CisJLyoKKwkgICBXcml0ZSBhbnkgYWRkaXRpb25hbCBQYXJhbWV0ZXIgQnl0ZXMuCisJICovCisJVGltZW91dENvdW50ZXIgPSAxMDAwMDsKKwl3aGlsZSAoUGFyYW1ldGVyTGVuZ3RoID4gMCAmJiAtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJLyoKKwkJICAgV2FpdCAxMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgdGhlIEhvc3QgQWRhcHRlciBlbm91Z2ggdGltZSB0byBkZXRlcm1pbmUKKwkJICAgd2hldGhlciB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIHRvIHRoZSBDb21tYW5kL1BhcmFtZXRlciBSZWdpc3RlciB3YXMKKwkJICAgdmFsaWQgb3Igbm90LiAgSWYgdGhlIENvbW1hbmQgQ29tcGxldGUgYml0IGlzIHNldCBpbiB0aGUgSW50ZXJydXB0CisJCSAgIFJlZ2lzdGVyLCB0aGVuIHRoZSBDb21tYW5kIEludmFsaWQgYml0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIgd2lsbCBiZQorCQkgICByZXNldCBpZiB0aGUgT3BlcmF0aW9uIENvZGUgb3IgUGFyYW1ldGVyIHdhcyB2YWxpZCBhbmQgdGhlIGNvbW1hbmQKKwkJICAgaGFzIGNvbXBsZXRlZCwgb3Igc2V0IGlmIHRoZSBPcGVyYXRpb24gQ29kZSBvciBQYXJhbWV0ZXIgd2FzIGludmFsaWQuCisJCSAgIElmIHRoZSBEYXRhIEluIFJlZ2lzdGVyIFJlYWR5IGJpdCBpcyBzZXQgaW4gdGhlIFN0YXR1cyBSZWdpc3RlciwgdGhlbgorCQkgICB0aGUgT3BlcmF0aW9uIENvZGUgd2FzIHZhbGlkLCBhbmQgZGF0YSBpcyB3YWl0aW5nIHRvIGJlIHJlYWQgYmFjaworCQkgICBmcm9tIHRoZSBIb3N0IEFkYXB0ZXIuICBPdGhlcndpc2UsIHdhaXQgZm9yIHRoZSBDb21tYW5kL1BhcmFtZXRlcgorCQkgICBSZWdpc3RlciBCdXN5IGJpdCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyIHRvIGJlIHJlc2V0LgorCQkgKi8KKwkJdWRlbGF5KDEwMCk7CisJCUludGVycnVwdFJlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRJbnRlcnJ1cHRSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCVN0YXR1c1JlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRTdGF0dXNSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCWlmIChJbnRlcnJ1cHRSZWdpc3Rlci5pci5Db21tYW5kQ29tcGxldGUpCisJCQlicmVhazsKKwkJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckNvbW1hbmRDb21wbGV0ZWQpCisJCQlicmVhazsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRhdGFJblJlZ2lzdGVyUmVhZHkpCisJCQlicmVhazsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlckJ1c3kpCisJCQljb250aW51ZTsKKwkJQnVzTG9naWNfV3JpdGVDb21tYW5kUGFyYW1ldGVyUmVnaXN0ZXIoSG9zdEFkYXB0ZXIsICpQYXJhbWV0ZXJQb2ludGVyKyspOworCQlQYXJhbWV0ZXJMZW5ndGgtLTsKKwl9CisJaWYgKFRpbWVvdXRDb3VudGVyIDwgMCkgeworCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJUaW1lb3V0IHdhaXRpbmcgZm9yIFBhcmFtZXRlciBBY2NlcHRhbmNlIjsKKwkJUmVzdWx0ID0gLTI7CisJCWdvdG8gRG9uZTsKKwl9CisJLyoKKwkgICBUaGUgTW9kaWZ5IEkvTyBBZGRyZXNzIGNvbW1hbmQgZG9lcyBub3QgY2F1c2UgYSBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdC4KKwkgKi8KKwlpZiAoT3BlcmF0aW9uQ29kZSA9PSBCdXNMb2dpY19Nb2RpZnlJT0FkZHJlc3MpIHsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkNvbW1hbmRJbnZhbGlkKSB7CisJCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJNb2RpZnkgSS9PIEFkZHJlc3MgSW52YWxpZCI7CisJCQlSZXN1bHQgPSAtMTsKKwkJCWdvdG8gRG9uZTsKKwkJfQorCQlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUNvbmZpZ3VyYXRpb24pCisJCQlCdXNMb2dpY19Ob3RpY2UoIkJ1c0xvZ2ljX0NvbW1hbmQoJTAyWCkgU3RhdHVzID0gJTAyWDogIiAiKE1vZGlmeSBJL08gQWRkcmVzcylcbiIsIEhvc3RBZGFwdGVyLCBPcGVyYXRpb25Db2RlLCBTdGF0dXNSZWdpc3Rlci5BbGwpOworCQlSZXN1bHQgPSAwOworCQlnb3RvIERvbmU7CisJfQorCS8qCisJICAgU2VsZWN0IGFuIGFwcHJvcHJpYXRlIHRpbWVvdXQgdmFsdWUgZm9yIGF3YWl0aW5nIGNvbW1hbmQgY29tcGxldGlvbi4KKwkgKi8KKwlzd2l0Y2ggKE9wZXJhdGlvbkNvZGUpIHsKKwljYXNlIEJ1c0xvZ2ljX0lucXVpcmVJbnN0YWxsZWREZXZpY2VzSUQwdG83OgorCWNhc2UgQnVzTG9naWNfSW5xdWlyZUluc3RhbGxlZERldmljZXNJRDh0bzE1OgorCWNhc2UgQnVzTG9naWNfSW5xdWlyZVRhcmdldERldmljZXM6CisJCS8qIEFwcHJveGltYXRlbHkgNjAgc2Vjb25kcy4gKi8KKwkJVGltZW91dENvdW50ZXIgPSA2MCAqIDEwMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBcHByb3hpbWF0ZWx5IDEgc2Vjb25kLiAqLworCQlUaW1lb3V0Q291bnRlciA9IDEwMDAwOworCQlicmVhazsKKwl9CisJLyoKKwkgICBSZWNlaXZlIGFueSBSZXBseSBCeXRlcywgd2FpdGluZyBmb3IgZWl0aGVyIHRoZSBDb21tYW5kIENvbXBsZXRlIGJpdCB0bworCSAgIGJlIHNldCBpbiB0aGUgSW50ZXJydXB0IFJlZ2lzdGVyLCBvciBmb3IgdGhlIEludGVycnVwdCBIYW5kbGVyIHRvIHNldCB0aGUKKwkgICBIb3N0IEFkYXB0ZXIgQ29tbWFuZCBDb21wbGV0ZWQgYml0IGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCSAqLworCXdoaWxlICgtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJSW50ZXJydXB0UmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZEludGVycnVwdFJlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKEludGVycnVwdFJlZ2lzdGVyLmlyLkNvbW1hbmRDb21wbGV0ZSkKKwkJCWJyZWFrOworCQlpZiAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQ29tbWFuZENvbXBsZXRlZCkKKwkJCWJyZWFrOworCQlpZiAoU3RhdHVzUmVnaXN0ZXIuc3IuRGF0YUluUmVnaXN0ZXJSZWFkeSkgeworCQkJaWYgKCsrUmVwbHlCeXRlcyA8PSBSZXBseUxlbmd0aCkKKwkJCQkqUmVwbHlQb2ludGVyKysgPSBCdXNMb2dpY19SZWFkRGF0YUluUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQkJZWxzZQorCQkJCUJ1c0xvZ2ljX1JlYWREYXRhSW5SZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCX0KKwkJaWYgKE9wZXJhdGlvbkNvZGUgPT0gQnVzTG9naWNfRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNICYmIFN0YXR1c1JlZ2lzdGVyLnNyLkhvc3RBZGFwdGVyUmVhZHkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmIChUaW1lb3V0Q291bnRlciA8IDApIHsKKwkJQnVzTG9naWNfQ29tbWFuZEZhaWx1cmVSZWFzb24gPSAiVGltZW91dCB3YWl0aW5nIGZvciBDb21tYW5kIENvbXBsZXRlIjsKKwkJUmVzdWx0ID0gLTI7CisJCWdvdG8gRG9uZTsKKwl9CisJLyoKKwkgICBDbGVhciBhbnkgcGVuZGluZyBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdC4KKwkgKi8KKwlCdXNMb2dpY19JbnRlcnJ1cHRSZXNldChIb3N0QWRhcHRlcik7CisJLyoKKwkgICBQcm92aWRlIHRyYWNpbmcgaW5mb3JtYXRpb24gaWYgcmVxdWVzdGVkLgorCSAqLworCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlQ29uZmlndXJhdGlvbikgeworCQlpbnQgaTsKKwkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19Db21tYW5kKCUwMlgpIFN0YXR1cyA9ICUwMlg6ICUyZCA9PT4gJTJkOiIsIEhvc3RBZGFwdGVyLCBPcGVyYXRpb25Db2RlLCBTdGF0dXNSZWdpc3Rlci5BbGwsIFJlcGx5TGVuZ3RoLCBSZXBseUJ5dGVzKTsKKwkJaWYgKFJlcGx5TGVuZ3RoID4gUmVwbHlCeXRlcykKKwkJCVJlcGx5TGVuZ3RoID0gUmVwbHlCeXRlczsKKwkJZm9yIChpID0gMDsgaSA8IFJlcGx5TGVuZ3RoOyBpKyspCisJCQlCdXNMb2dpY19Ob3RpY2UoIiAlMDJYIiwgSG9zdEFkYXB0ZXIsICgodW5zaWduZWQgY2hhciAqKSBSZXBseURhdGEpW2ldKTsKKwkJQnVzTG9naWNfTm90aWNlKCJcbiIsIEhvc3RBZGFwdGVyKTsKKwl9CisJLyoKKwkgICBQcm9jZXNzIENvbW1hbmQgSW52YWxpZCBjb25kaXRpb25zLgorCSAqLworCWlmIChTdGF0dXNSZWdpc3Rlci5zci5Db21tYW5kSW52YWxpZCkgeworCQkvKgorCQkgICBTb21lIGVhcmx5IEJ1c0xvZ2ljIEhvc3QgQWRhcHRlcnMgbWF5IG5vdCByZWNvdmVyIHByb3Blcmx5IGZyb20KKwkJICAgYSBDb21tYW5kIEludmFsaWQgY29uZGl0aW9uLCBzbyBpZiB0aGlzIGFwcGVhcnMgdG8gYmUgdGhlIGNhc2UsCisJCSAgIGEgU29mdCBSZXNldCBpcyBpc3N1ZWQgdG8gdGhlIEhvc3QgQWRhcHRlci4gIFBvdGVudGlhbGx5IGludmFsaWQKKwkJICAgY29tbWFuZHMgYXJlIG5ldmVyIGF0dGVtcHRlZCBhZnRlciBNYWlsYm94IEluaXRpYWxpemF0aW9uIGlzCisJCSAgIHBlcmZvcm1lZCwgc28gdGhlcmUgc2hvdWxkIGJlIG5vIEhvc3QgQWRhcHRlciBzdGF0ZSBsb3N0IGJ5IGEKKwkJICAgU29mdCBSZXNldCBpbiByZXNwb25zZSB0byBhIENvbW1hbmQgSW52YWxpZCBjb25kaXRpb24uCisJCSAqLworCQl1ZGVsYXkoMTAwMCk7CisJCVN0YXR1c1JlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRTdGF0dXNSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJCWlmIChTdGF0dXNSZWdpc3Rlci5zci5Db21tYW5kSW52YWxpZCB8fAorCQkgICAgU3RhdHVzUmVnaXN0ZXIuc3IuUmVzZXJ2ZWQgfHwKKwkJICAgIFN0YXR1c1JlZ2lzdGVyLnNyLkRhdGFJblJlZ2lzdGVyUmVhZHkgfHwKKwkJICAgIFN0YXR1c1JlZ2lzdGVyLnNyLkNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlckJ1c3kgfHwgIVN0YXR1c1JlZ2lzdGVyLnNyLkhvc3RBZGFwdGVyUmVhZHkgfHwgIVN0YXR1c1JlZ2lzdGVyLnNyLkluaXRpYWxpemF0aW9uUmVxdWlyZWQgfHwgU3RhdHVzUmVnaXN0ZXIuc3IuRGlhZ25vc3RpY0FjdGl2ZSB8fCBTdGF0dXNSZWdpc3Rlci5zci5EaWFnbm9zdGljRmFpbHVyZSkgeworCQkJQnVzTG9naWNfU29mdFJlc2V0KEhvc3RBZGFwdGVyKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJfQorCQlCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiA9ICJDb21tYW5kIEludmFsaWQiOworCQlSZXN1bHQgPSAtMTsKKwkJZ290byBEb25lOworCX0KKwkvKgorCSAgIEhhbmRsZSBFeGNlc3MgUGFyYW1ldGVycyBTdXBwbGllZCBjb25kaXRpb25zLgorCSAqLworCWlmIChQYXJhbWV0ZXJMZW5ndGggPiAwKSB7CisJCUJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uID0gIkV4Y2VzcyBQYXJhbWV0ZXJzIFN1cHBsaWVkIjsKKwkJUmVzdWx0ID0gLTE7CisJCWdvdG8gRG9uZTsKKwl9CisJLyoKKwkgICBJbmRpY2F0ZSB0aGUgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworCUJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uID0gTlVMTDsKKwlSZXN1bHQgPSBSZXBseUJ5dGVzOworCS8qCisJICAgUmVzdG9yZSB0aGUgaW50ZXJydXB0IHN0YXR1cyBpZiBuZWNlc3NhcnkgYW5kIHJldHVybi4KKwkgKi8KKyAgICAgIERvbmU6CisJaWYgKCFIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWxBY3F1aXJlZCkKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoUHJvY2Vzc29yRmxhZ3MpOworCXJldHVybiBSZXN1bHQ7Cit9CisKKworLyoKKyAgQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBIGFwcGVuZHMgYSBzaW5nbGUgSVNBIEkvTyBBZGRyZXNzIHRvIHRoZSBsaXN0CisgIG9mIEkvTyBBZGRyZXNzIGFuZCBCdXMgUHJvYmUgSW5mb3JtYXRpb24gdG8gYmUgY2hlY2tlZCBmb3IgcG90ZW50aWFsIEJ1c0xvZ2ljCisgIEhvc3QgQWRhcHRlcnMuCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKHVuc2lnbmVkIGxvbmcgSU9fQWRkcmVzcykKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm87CisJaWYgKEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ID49IEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycykKKwkJcmV0dXJuOworCVByb2JlSW5mbyA9ICZCdXNMb2dpY19Qcm9iZUluZm9MaXN0W0J1c0xvZ2ljX1Byb2JlSW5mb0NvdW50KytdOworCVByb2JlSW5mby0+SG9zdEFkYXB0ZXJUeXBlID0gQnVzTG9naWNfTXVsdGlNYXN0ZXI7CisJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19JU0FfQnVzOworCVByb2JlSW5mby0+SU9fQWRkcmVzcyA9IElPX0FkZHJlc3M7CisJUHJvYmVJbmZvLT5QQ0lfRGV2aWNlID0gTlVMTDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdElTQSBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcyBhbmQKKyAgQnVzIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBTQ1NJIEhvc3QgQWRhcHRlcnMKKyAgb25seSBmcm9tIHRoZSBsaXN0IG9mIHN0YW5kYXJkIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIElTQSBJL08gQWRkcmVzc2VzLgorKi8KKworc3RhdGljIHZvaWQgX19pbml0IEJ1c0xvZ2ljX0luaXRpYWxpemVQcm9iZUluZm9MaXN0SVNBKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcgorCQkJCQkJICAgICAgICpQcm90b3R5cGVIb3N0QWRhcHRlcikKK3sKKwkvKgorCSAgIElmIEJ1c0xvZ2ljIERyaXZlciBPcHRpb25zIHNwZWNpZmljYXRpb25zIHJlcXVlc3RlZCB0aGF0IElTQSBCdXMgUHJvYmVzCisJICAgYmUgaW5oaWJpdGVkLCBkbyBub3QgcHJvY2VlZCBmdXJ0aGVyLgorCSAqLworCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Qcm9iZUlTQSkKKwkJcmV0dXJuOworCS8qCisJICAgQXBwZW5kIHRoZSBsaXN0IG9mIHN0YW5kYXJkIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIElTQSBJL08gQWRkcmVzc2VzLgorCSAqLworCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzMwIDogY2hlY2tfcmVnaW9uKDB4MzMwLCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkKKwkJQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKDB4MzMwKTsKKwlpZiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA/IEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Qcm9iZTMzNCA6IGNoZWNrX3JlZ2lvbigweDMzNCwgQnVzTG9naWNfTXVsdGlNYXN0ZXJBZGRyZXNzQ291bnQpID09IDApCisJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDMzNCk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUyMzAgOiBjaGVja19yZWdpb24oMHgyMzAsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKQorCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgyMzApOworCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMjM0IDogY2hlY2tfcmVnaW9uKDB4MjM0LCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkKKwkJQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKDB4MjM0KTsKKwlpZiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA/IEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Qcm9iZTEzMCA6IGNoZWNrX3JlZ2lvbigweDEzMCwgQnVzTG9naWNfTXVsdGlNYXN0ZXJBZGRyZXNzQ291bnQpID09IDApCisJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDEzMCk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUxMzQgOiBjaGVja19yZWdpb24oMHgxMzQsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKQorCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgxMzQpOworfQorCisKKyNpZmRlZiBDT05GSUdfUENJCisKKworLyoKKyAgQnVzTG9naWNfU29ydFByb2JlSW5mbyBzb3J0cyBhIHNlY3Rpb24gb2YgQnVzTG9naWNfUHJvYmVJbmZvTGlzdCBpbiBvcmRlcgorICBvZiBpbmNyZWFzaW5nIFBDSSBCdXMgYW5kIERldmljZSBOdW1iZXIuCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQnVzTG9naWNfU29ydFByb2JlSW5mbyhzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm9MaXN0LCBpbnQgUHJvYmVJbmZvQ291bnQpCit7CisJaW50IExhc3RJbnRlcmNoYW5nZSA9IFByb2JlSW5mb0NvdW50IC0gMSwgQm91bmQsIGo7CisJd2hpbGUgKExhc3RJbnRlcmNoYW5nZSA+IDApIHsKKwkJQm91bmQgPSBMYXN0SW50ZXJjaGFuZ2U7CisJCUxhc3RJbnRlcmNoYW5nZSA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBCb3VuZDsgaisrKSB7CisJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8xID0gJlByb2JlSW5mb0xpc3Rbal07CisJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8yID0gJlByb2JlSW5mb0xpc3RbaiArIDFdOworCQkJaWYgKFByb2JlSW5mbzEtPkJ1cyA+IFByb2JlSW5mbzItPkJ1cyB8fCAoUHJvYmVJbmZvMS0+QnVzID09IFByb2JlSW5mbzItPkJ1cyAmJiAoUHJvYmVJbmZvMS0+RGV2aWNlID4gUHJvYmVJbmZvMi0+RGV2aWNlKSkpIHsKKwkJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvIFRlbXBQcm9iZUluZm87CisJCQkJbWVtY3B5KCZUZW1wUHJvYmVJbmZvLCBQcm9iZUluZm8xLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOworCQkJCW1lbWNweShQcm9iZUluZm8xLCBQcm9iZUluZm8yLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOworCQkJCW1lbWNweShQcm9iZUluZm8yLCAmVGVtcFByb2JlSW5mbywgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8pKTsKKwkJCQlMYXN0SW50ZXJjaGFuZ2UgPSBqOworCQkJfQorCQl9CisJfQorfQorCisKKy8qCisgIEJ1c0xvZ2ljX0luaXRpYWxpemVNdWx0aU1hc3RlclByb2JlSW5mbyBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcworICBhbmQgQnVzIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBNdWx0aU1hc3RlcgorICBTQ1NJIEhvc3QgQWRhcHRlcnMgYnkgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2Ugb24gUENJCisgIG1hY2hpbmVzIGFzIHdlbGwgYXMgZnJvbSB0aGUgbGlzdCBvZiBzdGFuZGFyZCBCdXNMb2dpYyBNdWx0aU1hc3RlciBJU0EKKyAgSS9PIEFkZHJlc3Nlcy4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBQQ0kgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycyBmb3VuZC4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IEJ1c0xvZ2ljX0luaXRpYWxpemVNdWx0aU1hc3RlclByb2JlSW5mbyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIKKwkJCQkJCQkgICpQcm90b3R5cGVIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcmltYXJ5UHJvYmVJbmZvID0gJkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3RbQnVzTG9naWNfUHJvYmVJbmZvQ291bnRdOworCWludCBOb25QcmltYXJ5UENJTXVsdGlNYXN0ZXJJbmRleCA9IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ICsgMTsKKwlpbnQgTm9uUHJpbWFyeVBDSU11bHRpTWFzdGVyQ291bnQgPSAwLCBQQ0lNdWx0aU1hc3RlckNvdW50ID0gMDsKKwlib29sZWFuIEZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlciA9IGZhbHNlOworCWJvb2xlYW4gRm9yY2VCdXNEZXZpY2VTY2FubmluZ09yZGVyQ2hlY2tlZCA9IGZhbHNlOworCWJvb2xlYW4gU3RhbmRhcmRBZGRyZXNzU2Vlbls2XTsKKwlzdHJ1Y3QgcGNpX2RldiAqUENJX0RldmljZSA9IE5VTEw7CisJaW50IGk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ID49IEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycykKKwkJcmV0dXJuIDA7CisJQnVzTG9naWNfUHJvYmVJbmZvQ291bnQrKzsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlTdGFuZGFyZEFkZHJlc3NTZWVuW2ldID0gZmFsc2U7CisJLyoKKwkgICBJdGVyYXRlIG92ZXIgdGhlIE11bHRpTWFzdGVyIFBDSSBIb3N0IEFkYXB0ZXJzLiAgRm9yIGVhY2ggZW51bWVyYXRlZCBob3N0CisJICAgYWRhcHRlciwgZGV0ZXJtaW5lIHdoZXRoZXIgaXRzIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0IGlzIGVuYWJsZWQgYW5kIGlmCisJICAgc28sIHdoZXRoZXIgaXQgaXMgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3MuICBBIGhvc3QgYWRhcHRlciB0aGF0IGlzCisJICAgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3Mgd2lsbCBhbHdheXMgYmUgdGhlIHByZWZlcnJlZCBib290IGRldmljZS4KKwkgICBUaGUgTXVsdGlNYXN0ZXIgQklPUyB3aWxsIGZpcnN0IHJlY29nbml6ZSBhIGhvc3QgYWRhcHRlciBhdCB0aGUgUHJpbWFyeSBJL08KKwkgICBBZGRyZXNzLCB0aGVuIGFueSBvdGhlciBQQ0kgaG9zdCBhZGFwdGVycywgYW5kIGZpbmFsbHkgYW55IGhvc3QgYWRhcHRlcnMKKwkgICBsb2NhdGVkIGF0IHRoZSByZW1haW5pbmcgc3RhbmRhcmQgSVNBIEkvTyBBZGRyZXNzZXMuICBXaGVuIGEgUENJIGhvc3QKKwkgICBhZGFwdGVyIGlzIGZvdW5kIHdpdGggaXRzIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0IGVuYWJsZWQsIGEgY29tbWFuZCBpcworCSAgIGlzc3VlZCB0byBkaXNhYmxlIHRoZSBJU0EgQ29tcGF0aWJsZSBJL08gUG9ydCwgYW5kIGl0IGlzIG5vdGVkIHRoYXQgdGhlCisJICAgcGFydGljdWxhciBzdGFuZGFyZCBJU0EgSS9PIEFkZHJlc3MgbmVlZCBub3QgYmUgcHJvYmVkLgorCSAqLworCVByaW1hcnlQcm9iZUluZm8tPklPX0FkZHJlc3MgPSAwOworCXdoaWxlICgoUENJX0RldmljZSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0JVU0xPR0lDLCBQQ0lfREVWSUNFX0lEX0JVU0xPR0lDX01VTFRJTUFTVEVSLCBQQ0lfRGV2aWNlKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyID0gUHJvdG90eXBlSG9zdEFkYXB0ZXI7CisJCXN0cnVjdCBCdXNMb2dpY19QQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uIFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb247CisJCWVudW0gQnVzTG9naWNfSVNBQ29tcGF0aWJsZUlPUG9ydCBNb2RpZnlJT0FkZHJlc3NSZXF1ZXN0OworCQl1bnNpZ25lZCBjaGFyIEJ1czsKKwkJdW5zaWduZWQgY2hhciBEZXZpY2U7CisJCXVuc2lnbmVkIGludCBJUlFfQ2hhbm5lbDsKKwkJdW5zaWduZWQgbG9uZyBCYXNlQWRkcmVzczA7CisJCXVuc2lnbmVkIGxvbmcgQmFzZUFkZHJlc3MxOworCQl1bnNpZ25lZCBsb25nIElPX0FkZHJlc3M7CisJCXVuc2lnbmVkIGxvbmcgUENJX0FkZHJlc3M7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKFBDSV9EZXZpY2UpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soUENJX0RldmljZSwgKHU2NCkgMHhmZmZmZmZmZikpCisJCQljb250aW51ZTsKKworCQlCdXMgPSBQQ0lfRGV2aWNlLT5idXMtPm51bWJlcjsKKwkJRGV2aWNlID0gUENJX0RldmljZS0+ZGV2Zm4gPj4gMzsKKwkJSVJRX0NoYW5uZWwgPSBQQ0lfRGV2aWNlLT5pcnE7CisJCUlPX0FkZHJlc3MgPSBCYXNlQWRkcmVzczAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoUENJX0RldmljZSwgMCk7CisJCVBDSV9BZGRyZXNzID0gQmFzZUFkZHJlc3MxID0gcGNpX3Jlc291cmNlX3N0YXJ0KFBDSV9EZXZpY2UsIDEpOworCisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoUENJX0RldmljZSwgMCkgJiBJT1JFU09VUkNFX01FTSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBCYXNlIEFkZHJlc3MwIDB4JVggbm90IEkvTyBmb3IgIiAiTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVyXG4iLCBOVUxMLCBCYXNlQWRkcmVzczApOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBJT19BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoUENJX0RldmljZSwgMSkgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEJhc2UgQWRkcmVzczEgMHglWCBub3QgTWVtb3J5IGZvciAiICJNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJcbiIsIE5VTEwsIEJhc2VBZGRyZXNzMSk7CisJCQlCdXNMb2dpY19FcnJvcigiYXQgUENJIEJ1cyAlZCBEZXZpY2UgJWQgUENJIEFkZHJlc3MgMHglWFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UsIFBDSV9BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChJUlFfQ2hhbm5lbCA9PSAwKSB7CisJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IElSUSBDaGFubmVsICVkIGludmFsaWQgZm9yICIgIk11bHRpTWFzdGVyIEhvc3QgQWRhcHRlclxuIiwgTlVMTCwgSVJRX0NoYW5uZWwpOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBJT19BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlUHJvYmUpIHsKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWM6IFBDSSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIgIiAiZGV0ZWN0ZWQgYXRcbiIsIE5VTEwpOworCQkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpYzogUENJIEJ1cyAlZCBEZXZpY2UgJWQgSS9PIEFkZHJlc3MgIiAiMHglWCBQQ0kgQWRkcmVzcyAweCVYXG4iLCBOVUxMLCBCdXMsIERldmljZSwgSU9fQWRkcmVzcywgUENJX0FkZHJlc3MpOworCQl9CisJCS8qCisJCSAgIElzc3VlIHRoZSBJbnF1aXJlIFBDSSBIb3N0IEFkYXB0ZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byBkZXRlcm1pbmUKKwkJICAgdGhlIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0LiAgSWYgdGhlIElTQSBDb21wYXRpYmxlIEkvTyBQb3J0IGlzCisJCSAgIGtub3duIGFuZCBlbmFibGVkLCBub3RlIHRoYXQgdGhlIHBhcnRpY3VsYXIgU3RhbmRhcmQgSVNBIEkvTworCQkgICBBZGRyZXNzIHNob3VsZCBub3QgYmUgcHJvYmVkLgorCQkgKi8KKwkJSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgPSBJT19BZGRyZXNzOworCQlCdXNMb2dpY19JbnRlcnJ1cHRSZXNldChIb3N0QWRhcHRlcik7CisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbiwgTlVMTCwgMCwgJlBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24sIHNpemVvZihQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uKSkKKwkJICAgID09IHNpemVvZihQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uKSkgeworCQkJaWYgKFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24uSVNBQ29tcGF0aWJsZUlPUG9ydCA8IDYpCisJCQkJU3RhbmRhcmRBZGRyZXNzU2VlbltQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLklTQUNvbXBhdGlibGVJT1BvcnRdID0gdHJ1ZTsKKwkJfSBlbHNlCisJCQlQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLklTQUNvbXBhdGlibGVJT1BvcnQgPSBCdXNMb2dpY19JT19EaXNhYmxlOworCQkvKgorCQkgKiBJc3N1ZSB0aGUgTW9kaWZ5IEkvTyBBZGRyZXNzIGNvbW1hbmQgdG8gZGlzYWJsZSB0aGUgSVNBIENvbXBhdGlibGUKKwkJICogSS9PIFBvcnQuICBPbiBQQ0kgSG9zdCBBZGFwdGVycywgdGhlIE1vZGlmeSBJL08gQWRkcmVzcyBjb21tYW5kCisJCSAqIGFsbG93cyBtb2RpZmljYXRpb24gb2YgdGhlIElTQSBjb21wYXRpYmxlIEkvTyBBZGRyZXNzIHRoYXQgdGhlIEhvc3QKKwkJICogQWRhcHRlciByZXNwb25kcyB0bzsgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBQQ0kgY29tcGxpYW50IEkvTyBBZGRyZXNzCisJCSAqIGFzc2lnbmVkIGF0IHN5c3RlbSBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCU1vZGlmeUlPQWRkcmVzc1JlcXVlc3QgPSBCdXNMb2dpY19JT19EaXNhYmxlOworCQlCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19Nb2RpZnlJT0FkZHJlc3MsICZNb2RpZnlJT0FkZHJlc3NSZXF1ZXN0LCBzaXplb2YoTW9kaWZ5SU9BZGRyZXNzUmVxdWVzdCksIE5VTEwsIDApOworCQkvKgorCQkgICBGb3IgdGhlIGZpcnN0IE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlciBlbnVtZXJhdGVkLCBpc3N1ZSB0aGUgRmV0Y2gKKwkJICAgSG9zdCBBZGFwdGVyIExvY2FsIFJBTSBjb21tYW5kIHRvIHJlYWQgYnl0ZSA0NSBvZiB0aGUgQXV0b1NDU0kgYXJlYSwKKwkJICAgZm9yIHRoZSBzZXR0aW5nIG9mIHRoZSAiVXNlIEJ1cyBBbmQgRGV2aWNlICMgRm9yIFBDSSBTY2FubmluZyBTZXEuIgorCQkgICBvcHRpb24uICBJc3N1ZSB0aGUgSW5xdWlyZSBCb2FyZCBJRCBjb21tYW5kIHNpbmNlIHRoaXMgb3B0aW9uIGlzCisJCSAgIG9ubHkgdmFsaWQgZm9yIHRoZSBCVC05NDgvOTU4Lzk1OEQuCisJCSAqLworCQlpZiAoIUZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlckNoZWNrZWQpIHsKKwkJCXN0cnVjdCBCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0IEZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3Q7CisJCQlzdHJ1Y3QgQnVzTG9naWNfQXV0b1NDU0lCeXRlNDUgQXV0b1NDU0lCeXRlNDU7CisJCQlzdHJ1Y3QgQnVzTG9naWNfQm9hcmRJRCBCb2FyZElEOworCQkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlT2Zmc2V0ID0gQnVzTG9naWNfQXV0b1NDU0lfQmFzZU9mZnNldCArIDQ1OworCQkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlQ291bnQgPSBzaXplb2YoQXV0b1NDU0lCeXRlNDUpOworCQkJQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNLCAmRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdCwgc2l6ZW9mKEZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QpLCAmQXV0b1NDU0lCeXRlNDUsIHNpemVvZihBdXRvU0NTSUJ5dGU0NSkpOworCQkJQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZUJvYXJkSUQsIE5VTEwsIDAsICZCb2FyZElELCBzaXplb2YoQm9hcmRJRCkpOworCQkJaWYgKEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMXN0RGlnaXQgPT0gJzUnKQorCQkJCUZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlciA9IEF1dG9TQ1NJQnl0ZTQ1LkZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlcjsKKwkJCUZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlckNoZWNrZWQgPSB0cnVlOworCQl9CisJCS8qCisJCSAgIERldGVybWluZSB3aGV0aGVyIHRoaXMgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVyIGhhcyBpdHMgSVNBCisJCSAgIENvbXBhdGlibGUgSS9PIFBvcnQgZW5hYmxlZCBhbmQgaXMgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3MuCisJCSAgIElmIGl0IGRvZXMsIHRoZW4gaXQgaXMgdGhlIFByaW1hcnkgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVyIGFuZCBtdXN0CisJCSAgIGJlIHJlY29nbml6ZWQgZmlyc3QuICBJZiBpdCBkb2VzIG5vdCwgdGhlbiBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdAorCQkgICBmb3IgcHJvYmluZyBhZnRlciBhbnkgUHJpbWFyeSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIgaXMgcHJvYmVkLgorCQkgKi8KKwkJaWYgKFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24uSVNBQ29tcGF0aWJsZUlPUG9ydCA9PSBCdXNMb2dpY19JT18zMzApIHsKKwkJCVByaW1hcnlQcm9iZUluZm8tPkhvc3RBZGFwdGVyVHlwZSA9IEJ1c0xvZ2ljX011bHRpTWFzdGVyOworCQkJUHJpbWFyeVByb2JlSW5mby0+SG9zdEFkYXB0ZXJCdXNUeXBlID0gQnVzTG9naWNfUENJX0J1czsKKwkJCVByaW1hcnlQcm9iZUluZm8tPklPX0FkZHJlc3MgPSBJT19BZGRyZXNzOworCQkJUHJpbWFyeVByb2JlSW5mby0+UENJX0FkZHJlc3MgPSBQQ0lfQWRkcmVzczsKKwkJCVByaW1hcnlQcm9iZUluZm8tPkJ1cyA9IEJ1czsKKwkJCVByaW1hcnlQcm9iZUluZm8tPkRldmljZSA9IERldmljZTsKKwkJCVByaW1hcnlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQlQcmltYXJ5UHJvYmVJbmZvLT5QQ0lfRGV2aWNlID0gUENJX0RldmljZTsKKwkJCVBDSU11bHRpTWFzdGVyQ291bnQrKzsKKwkJfSBlbHNlIGlmIChCdXNMb2dpY19Qcm9iZUluZm9Db3VudCA8IEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycykgeworCQkJc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyAqUHJvYmVJbmZvID0gJkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3RbQnVzTG9naWNfUHJvYmVJbmZvQ291bnQrK107CisJCQlQcm9iZUluZm8tPkhvc3RBZGFwdGVyVHlwZSA9IEJ1c0xvZ2ljX011bHRpTWFzdGVyOworCQkJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19QQ0lfQnVzOworCQkJUHJvYmVJbmZvLT5JT19BZGRyZXNzID0gSU9fQWRkcmVzczsKKwkJCVByb2JlSW5mby0+UENJX0FkZHJlc3MgPSBQQ0lfQWRkcmVzczsKKwkJCVByb2JlSW5mby0+QnVzID0gQnVzOworCQkJUHJvYmVJbmZvLT5EZXZpY2UgPSBEZXZpY2U7CisJCQlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQlQcm9iZUluZm8tPlBDSV9EZXZpY2UgPSBQQ0lfRGV2aWNlOworCQkJTm9uUHJpbWFyeVBDSU11bHRpTWFzdGVyQ291bnQrKzsKKwkJCVBDSU11bHRpTWFzdGVyQ291bnQrKzsKKwkJfSBlbHNlCisJCQlCdXNMb2dpY19XYXJuaW5nKCJCdXNMb2dpYzogVG9vIG1hbnkgSG9zdCBBZGFwdGVycyAiICJkZXRlY3RlZFxuIiwgTlVMTCk7CisJfQorCS8qCisJICAgSWYgdGhlIEF1dG9TQ1NJICJVc2UgQnVzIEFuZCBEZXZpY2UgIyBGb3IgUENJIFNjYW5uaW5nIFNlcS4iIG9wdGlvbiBpcyBPTgorCSAgIGZvciB0aGUgZmlyc3QgZW51bWVyYXRlZCBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIsIGFuZCBpZiB0aGF0IGhvc3QgYWRhcHRlcgorCSAgIGlzIGEgQlQtOTQ4Lzk1OC85NThELCB0aGVuIHRoZSBNdWx0aU1hc3RlciBCSU9TIHdpbGwgcmVjb2duaXplIE11bHRpTWFzdGVyCisJICAgSG9zdCBBZGFwdGVycyBpbiB0aGUgb3JkZXIgb2YgaW5jcmVhc2luZyBQQ0kgQnVzIGFuZCBEZXZpY2UgTnVtYmVyLiAgSW4KKwkgICB0aGF0IGNhc2UsIHNvcnQgdGhlIHByb2JlIGluZm9ybWF0aW9uIGludG8gdGhlIHNhbWUgb3JkZXIgdGhlIEJJT1MgdXNlcy4KKwkgICBJZiB0aGlzIG9wdGlvbiBpcyBPRkYsIHRoZW4gdGhlIE11bHRpTWFzdGVyIEJJT1Mgd2lsbCByZWNvZ25pemUgTXVsdGlNYXN0ZXIKKwkgICBIb3N0IEFkYXB0ZXJzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnVtZXJhdGVkIGJ5IHRoZSBQQ0kgQklPUywgYW5kIGhlbmNlCisJICAgbm8gc29ydGluZyBpcyBuZWNlc3NhcnkuCisJICovCisJaWYgKEZvcmNlQnVzRGV2aWNlU2Nhbm5pbmdPcmRlcikKKwkJQnVzTG9naWNfU29ydFByb2JlSW5mbygmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtOb25QcmltYXJ5UENJTXVsdGlNYXN0ZXJJbmRleF0sIE5vblByaW1hcnlQQ0lNdWx0aU1hc3RlckNvdW50KTsKKwkvKgorCSAgIElmIG5vIFBDSSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIgaXMgYXNzaWduZWQgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3MsCisJICAgdGhlbiB0aGUgUHJpbWFyeSBJL08gQWRkcmVzcyBtdXN0IGJlIHByb2JlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnkgUENJCisJICAgaG9zdCBhZGFwdGVycyBhcmUgcHJvYmVkLgorCSAqLworCWlmICghQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVJU0EpCisJCWlmIChQcmltYXJ5UHJvYmVJbmZvLT5JT19BZGRyZXNzID09IDAgJiYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUzMzAgOiBjaGVja19yZWdpb24oMHgzMzAsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKSkgeworCQkJUHJpbWFyeVByb2JlSW5mby0+SG9zdEFkYXB0ZXJUeXBlID0gQnVzTG9naWNfTXVsdGlNYXN0ZXI7CisJCQlQcmltYXJ5UHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19JU0FfQnVzOworCQkJUHJpbWFyeVByb2JlSW5mby0+SU9fQWRkcmVzcyA9IDB4MzMwOworCQl9CisJLyoKKwkgICBBcHBlbmQgdGhlIGxpc3Qgb2Ygc3RhbmRhcmQgQnVzTG9naWMgTXVsdGlNYXN0ZXIgSVNBIEkvTyBBZGRyZXNzZXMsCisJICAgb21pdHRpbmcgdGhlIFByaW1hcnkgSS9PIEFkZHJlc3Mgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkLgorCSAqLworCWlmICghQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVJU0EpIHsKKwkJaWYgKCFTdGFuZGFyZEFkZHJlc3NTZWVuWzFdICYmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzM0IDogY2hlY2tfcmVnaW9uKDB4MzM0LCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkpCisJCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgzMzQpOworCQlpZiAoIVN0YW5kYXJkQWRkcmVzc1NlZW5bMl0gJiYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUyMzAgOiBjaGVja19yZWdpb24oMHgyMzAsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKSkKKwkJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDIzMCk7CisJCWlmICghU3RhbmRhcmRBZGRyZXNzU2VlblszXSAmJiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA/IEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Qcm9iZTIzNCA6IGNoZWNrX3JlZ2lvbigweDIzNCwgQnVzTG9naWNfTXVsdGlNYXN0ZXJBZGRyZXNzQ291bnQpID09IDApKQorCQkJQnVzTG9naWNfQXBwZW5kUHJvYmVBZGRyZXNzSVNBKDB4MjM0KTsKKwkJaWYgKCFTdGFuZGFyZEFkZHJlc3NTZWVuWzRdICYmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTGltaXRlZFByb2JlSVNBID8gQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMTMwIDogY2hlY2tfcmVnaW9uKDB4MTMwLCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCkgPT0gMCkpCisJCQlCdXNMb2dpY19BcHBlbmRQcm9iZUFkZHJlc3NJU0EoMHgxMzApOworCQlpZiAoIVN0YW5kYXJkQWRkcmVzc1NlZW5bNV0gJiYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5MaW1pdGVkUHJvYmVJU0EgPyBCdXNMb2dpY19Qcm9iZU9wdGlvbnMuUHJvYmUxMzQgOiBjaGVja19yZWdpb24oMHgxMzQsIEJ1c0xvZ2ljX011bHRpTWFzdGVyQWRkcmVzc0NvdW50KSA9PSAwKSkKKwkJCUJ1c0xvZ2ljX0FwcGVuZFByb2JlQWRkcmVzc0lTQSgweDEzNCk7CisJfQorCS8qCisJICAgSXRlcmF0ZSBvdmVyIHRoZSBvbGRlciBub24tY29tcGxpYW50IE11bHRpTWFzdGVyIFBDSSBIb3N0IEFkYXB0ZXJzLAorCSAgIG5vdGluZyB0aGUgUENJIGJ1cyBsb2NhdGlvbiBhbmQgYXNzaWduZWQgSVJRIENoYW5uZWwuCisJICovCisJUENJX0RldmljZSA9IE5VTEw7CisJd2hpbGUgKChQQ0lfRGV2aWNlID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQlVTTE9HSUMsIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfTVVMVElNQVNURVJfTkMsIFBDSV9EZXZpY2UpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgQnVzOworCQl1bnNpZ25lZCBjaGFyIERldmljZTsKKwkJdW5zaWduZWQgaW50IElSUV9DaGFubmVsOworCQl1bnNpZ25lZCBsb25nIElPX0FkZHJlc3M7CisKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKFBDSV9EZXZpY2UpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soUENJX0RldmljZSwgKHU2NCkgMHhmZmZmZmZmZikpCisJCQljb250aW51ZTsKKworCQlCdXMgPSBQQ0lfRGV2aWNlLT5idXMtPm51bWJlcjsKKwkJRGV2aWNlID0gUENJX0RldmljZS0+ZGV2Zm4gPj4gMzsKKwkJSVJRX0NoYW5uZWwgPSBQQ0lfRGV2aWNlLT5pcnE7CisJCUlPX0FkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoUENJX0RldmljZSwgMCk7CisKKwkJaWYgKElPX0FkZHJlc3MgPT0gMCB8fCBJUlFfQ2hhbm5lbCA9PSAwKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBCdXNMb2dpY19Qcm9iZUluZm9Db3VudDsgaSsrKSB7CisJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8gPSAmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtpXTsKKwkJCWlmIChQcm9iZUluZm8tPklPX0FkZHJlc3MgPT0gSU9fQWRkcmVzcyAmJiBQcm9iZUluZm8tPkhvc3RBZGFwdGVyVHlwZSA9PSBCdXNMb2dpY19NdWx0aU1hc3RlcikgeworCQkJCVByb2JlSW5mby0+SG9zdEFkYXB0ZXJCdXNUeXBlID0gQnVzTG9naWNfUENJX0J1czsKKwkJCQlQcm9iZUluZm8tPlBDSV9BZGRyZXNzID0gMDsKKwkJCQlQcm9iZUluZm8tPkJ1cyA9IEJ1czsKKwkJCQlQcm9iZUluZm8tPkRldmljZSA9IERldmljZTsKKwkJCQlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQkJUHJvYmVJbmZvLT5QQ0lfRGV2aWNlID0gUENJX0RldmljZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gUENJTXVsdGlNYXN0ZXJDb3VudDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplRmxhc2hQb2ludFByb2JlSW5mbyBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcworICBhbmQgQnVzIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBGbGFzaFBvaW50CisgIEhvc3QgQWRhcHRlcnMgYnkgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UuICBJdCByZXR1cm5zIHRoZQorICBudW1iZXIgb2YgRmxhc2hQb2ludCBIb3N0IEFkYXB0ZXJzIGZvdW5kLgorKi8KKworc3RhdGljIGludCBfX2luaXQgQnVzTG9naWNfSW5pdGlhbGl6ZUZsYXNoUG9pbnRQcm9iZUluZm8oc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkJICpQcm90b3R5cGVIb3N0QWRhcHRlcikKK3sKKwlpbnQgRmxhc2hQb2ludEluZGV4ID0gQnVzTG9naWNfUHJvYmVJbmZvQ291bnQsIEZsYXNoUG9pbnRDb3VudCA9IDA7CisJc3RydWN0IHBjaV9kZXYgKlBDSV9EZXZpY2UgPSBOVUxMOworCS8qCisJICAgSW50ZXJyb2dhdGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgZm9yIGFueSBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMuCisJICovCisJd2hpbGUgKChQQ0lfRGV2aWNlID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQlVTTE9HSUMsIFBDSV9ERVZJQ0VfSURfQlVTTE9HSUNfRkxBU0hQT0lOVCwgUENJX0RldmljZSkpICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgY2hhciBCdXM7CisJCXVuc2lnbmVkIGNoYXIgRGV2aWNlOworCQl1bnNpZ25lZCBpbnQgSVJRX0NoYW5uZWw7CisJCXVuc2lnbmVkIGxvbmcgQmFzZUFkZHJlc3MwOworCQl1bnNpZ25lZCBsb25nIEJhc2VBZGRyZXNzMTsKKwkJdW5zaWduZWQgbG9uZyBJT19BZGRyZXNzOworCQl1bnNpZ25lZCBsb25nIFBDSV9BZGRyZXNzOworCisJCWlmIChwY2lfZW5hYmxlX2RldmljZShQQ0lfRGV2aWNlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKFBDSV9EZXZpY2UsICh1NjQpIDB4ZmZmZmZmZmYpKQorCQkJY29udGludWU7CisKKwkJQnVzID0gUENJX0RldmljZS0+YnVzLT5udW1iZXI7CisJCURldmljZSA9IFBDSV9EZXZpY2UtPmRldmZuID4+IDM7CisJCUlSUV9DaGFubmVsID0gUENJX0RldmljZS0+aXJxOworCQlJT19BZGRyZXNzID0gQmFzZUFkZHJlc3MwID0gcGNpX3Jlc291cmNlX3N0YXJ0KFBDSV9EZXZpY2UsIDApOworCQlQQ0lfQWRkcmVzcyA9IEJhc2VBZGRyZXNzMSA9IHBjaV9yZXNvdXJjZV9zdGFydChQQ0lfRGV2aWNlLCAxKTsKKyNpZm5kZWYgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoUENJX0RldmljZSwgMCkgJiBJT1JFU09VUkNFX01FTSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBCYXNlIEFkZHJlc3MwIDB4JVggbm90IEkvTyBmb3IgIiAiRmxhc2hQb2ludCBIb3N0IEFkYXB0ZXJcbiIsIE5VTEwsIEJhc2VBZGRyZXNzMCk7CisJCQlCdXNMb2dpY19FcnJvcigiYXQgUENJIEJ1cyAlZCBEZXZpY2UgJWQgSS9PIEFkZHJlc3MgMHglWFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UsIElPX0FkZHJlc3MpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhQQ0lfRGV2aWNlLCAxKSAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogQmFzZSBBZGRyZXNzMSAweCVYIG5vdCBNZW1vcnkgZm9yICIgIkZsYXNoUG9pbnQgSG9zdCBBZGFwdGVyXG4iLCBOVUxMLCBCYXNlQWRkcmVzczEpOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIFBDSSBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBQQ0lfQWRkcmVzcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoSVJRX0NoYW5uZWwgPT0gMCkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJUlEgQ2hhbm5lbCAlZCBpbnZhbGlkIGZvciAiICJGbGFzaFBvaW50IEhvc3QgQWRhcHRlclxuIiwgTlVMTCwgSVJRX0NoYW5uZWwpOworCQkJQnVzTG9naWNfRXJyb3IoImF0IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzIDB4JVhcbiIsIE5VTEwsIEJ1cywgRGV2aWNlLCBJT19BZGRyZXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlUHJvYmUpIHsKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWM6IEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVyICIgImRldGVjdGVkIGF0XG4iLCBOVUxMKTsKKwkJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWM6IFBDSSBCdXMgJWQgRGV2aWNlICVkIEkvTyBBZGRyZXNzICIgIjB4JVggUENJIEFkZHJlc3MgMHglWFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UsIElPX0FkZHJlc3MsIFBDSV9BZGRyZXNzKTsKKwkJfQorCQlpZiAoQnVzTG9naWNfUHJvYmVJbmZvQ291bnQgPCBCdXNMb2dpY19NYXhIb3N0QWRhcHRlcnMpIHsKKwkJCXN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8gKlByb2JlSW5mbyA9ICZCdXNMb2dpY19Qcm9iZUluZm9MaXN0W0J1c0xvZ2ljX1Byb2JlSW5mb0NvdW50KytdOworCQkJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlclR5cGUgPSBCdXNMb2dpY19GbGFzaFBvaW50OworCQkJUHJvYmVJbmZvLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBCdXNMb2dpY19QQ0lfQnVzOworCQkJUHJvYmVJbmZvLT5JT19BZGRyZXNzID0gSU9fQWRkcmVzczsKKwkJCVByb2JlSW5mby0+UENJX0FkZHJlc3MgPSBQQ0lfQWRkcmVzczsKKwkJCVByb2JlSW5mby0+QnVzID0gQnVzOworCQkJUHJvYmVJbmZvLT5EZXZpY2UgPSBEZXZpY2U7CisJCQlQcm9iZUluZm8tPklSUV9DaGFubmVsID0gSVJRX0NoYW5uZWw7CisJCQlQcm9iZUluZm8tPlBDSV9EZXZpY2UgPSBQQ0lfRGV2aWNlOworCQkJRmxhc2hQb2ludENvdW50Kys7CisJCX0gZWxzZQorCQkJQnVzTG9naWNfV2FybmluZygiQnVzTG9naWM6IFRvbyBtYW55IEhvc3QgQWRhcHRlcnMgIiAiZGV0ZWN0ZWRcbiIsIE5VTEwpOworI2Vsc2UKKwkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBGbGFzaFBvaW50IEhvc3QgQWRhcHRlciBkZXRlY3RlZCBhdCAiICJQQ0kgQnVzICVkIERldmljZSAlZFxuIiwgTlVMTCwgQnVzLCBEZXZpY2UpOworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEkvTyBBZGRyZXNzIDB4JVggUENJIEFkZHJlc3MgMHglWCwgaXJxICVkLCAiICJidXQgRmxhc2hQb2ludFxuIiwgTlVMTCwgSU9fQWRkcmVzcywgUENJX0FkZHJlc3MsIElSUV9DaGFubmVsKTsKKwkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBzdXBwb3J0IHdhcyBvbWl0dGVkIGluIHRoaXMga2VybmVsICIgImNvbmZpZ3VyYXRpb24uXG4iLCBOVUxMKTsKKyNlbmRpZgorCX0KKwkvKgorCSAgIFRoZSBGbGFzaFBvaW50IEJJT1Mgd2lsbCBzY2FuIGZvciBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgaW4gdGhlIG9yZGVyIG9mCisJICAgaW5jcmVhc2luZyBQQ0kgQnVzIGFuZCBEZXZpY2UgTnVtYmVyLCBzbyBzb3J0IHRoZSBwcm9iZSBpbmZvcm1hdGlvbiBpbnRvCisJICAgdGhlIHNhbWUgb3JkZXIgdGhlIEJJT1MgdXNlcy4KKwkgKi8KKwlCdXNMb2dpY19Tb3J0UHJvYmVJbmZvKCZCdXNMb2dpY19Qcm9iZUluZm9MaXN0W0ZsYXNoUG9pbnRJbmRleF0sIEZsYXNoUG9pbnRDb3VudCk7CisJcmV0dXJuIEZsYXNoUG9pbnRDb3VudDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdCBpbml0aWFsaXplcyB0aGUgbGlzdCBvZiBJL08gQWRkcmVzcyBhbmQgQnVzCisgIFByb2JlIEluZm9ybWF0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIHBvdGVudGlhbCBCdXNMb2dpYyBTQ1NJIEhvc3QgQWRhcHRlcnMgYnkKKyAgaW50ZXJyb2dhdGluZyB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2Ugb24gUENJIG1hY2hpbmVzIGFzIHdlbGwgYXMgZnJvbSB0aGUKKyAgbGlzdCBvZiBzdGFuZGFyZCBCdXNMb2dpYyBNdWx0aU1hc3RlciBJU0EgSS9PIEFkZHJlc3Nlcy4gIEJ5IGRlZmF1bHQsIGlmIGJvdGgKKyAgRmxhc2hQb2ludCBhbmQgUENJIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMgYXJlIHByZXNlbnQsIHRoaXMgZHJpdmVyIHdpbGwKKyAgcHJvYmUgZm9yIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBmaXJzdCB1bmxlc3MgdGhlIEJJT1MgcHJpbWFyeSBkaXNrIGlzCisgIGNvbnRyb2xsZWQgYnkgdGhlIGZpcnN0IFBDSSBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXIsIGluIHdoaWNoIGNhc2UKKyAgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycyB3aWxsIGJlIHByb2JlZCBmaXJzdC4gIFRoZSBCdXNMb2dpYyBEcml2ZXIgT3B0aW9ucworICBzcGVjaWZpY2F0aW9ucyAiTXVsdGlNYXN0ZXJGaXJzdCIgYW5kICJGbGFzaFBvaW50Rmlyc3QiIGNhbiBiZSB1c2VkIHRvIGZvcmNlCisgIGEgcGFydGljdWxhciBwcm9iZSBvcmRlci4KKyovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIKKwkJCQkJCSAgICAqUHJvdG90eXBlSG9zdEFkYXB0ZXIpCit7CisJLyoKKwkgICBJZiBhIFBDSSBCSU9TIGlzIHByZXNlbnQsIGludGVycm9nYXRlIGl0IGZvciBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludAorCSAgIEhvc3QgQWRhcHRlcnM7IG90aGVyd2lzZSwgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgSVNBIE11bHRpTWFzdGVyIHByb2JlLgorCSAqLworCWlmICghQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVQQ0kpIHsKKwkJaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5NdWx0aU1hc3RlckZpcnN0KSB7CisJCQlCdXNMb2dpY19Jbml0aWFsaXplTXVsdGlNYXN0ZXJQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQkJQnVzTG9naWNfSW5pdGlhbGl6ZUZsYXNoUG9pbnRQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQl9IGVsc2UgaWYgKEJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5GbGFzaFBvaW50Rmlyc3QpIHsKKwkJCUJ1c0xvZ2ljX0luaXRpYWxpemVGbGFzaFBvaW50UHJvYmVJbmZvKFByb3RvdHlwZUhvc3RBZGFwdGVyKTsKKwkJCUJ1c0xvZ2ljX0luaXRpYWxpemVNdWx0aU1hc3RlclByb2JlSW5mbyhQcm90b3R5cGVIb3N0QWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlpbnQgRmxhc2hQb2ludENvdW50ID0gQnVzTG9naWNfSW5pdGlhbGl6ZUZsYXNoUG9pbnRQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQkJaW50IFBDSU11bHRpTWFzdGVyQ291bnQgPSBCdXNMb2dpY19Jbml0aWFsaXplTXVsdGlNYXN0ZXJQcm9iZUluZm8oUHJvdG90eXBlSG9zdEFkYXB0ZXIpOworCQkJaWYgKEZsYXNoUG9pbnRDb3VudCA+IDAgJiYgUENJTXVsdGlNYXN0ZXJDb3VudCA+IDApIHsKKwkJCQlzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICpQcm9iZUluZm8gPSAmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtGbGFzaFBvaW50Q291bnRdOworCQkJCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSBQcm90b3R5cGVIb3N0QWRhcHRlcjsKKwkJCQlzdHJ1Y3QgQnVzTG9naWNfRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdCBGZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0OworCQkJCXN0cnVjdCBCdXNMb2dpY19CSU9TRHJpdmVNYXBCeXRlIERyaXZlME1hcEJ5dGU7CisJCQkJd2hpbGUgKFByb2JlSW5mby0+SG9zdEFkYXB0ZXJCdXNUeXBlICE9IEJ1c0xvZ2ljX1BDSV9CdXMpCisJCQkJCVByb2JlSW5mbysrOworCQkJCUhvc3RBZGFwdGVyLT5JT19BZGRyZXNzID0gUHJvYmVJbmZvLT5JT19BZGRyZXNzOworCQkJCUZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QuQnl0ZU9mZnNldCA9IEJ1c0xvZ2ljX0JJT1NfQmFzZU9mZnNldCArIEJ1c0xvZ2ljX0JJT1NfRHJpdmVNYXBPZmZzZXQgKyAwOworCQkJCUZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QuQnl0ZUNvdW50ID0gc2l6ZW9mKERyaXZlME1hcEJ5dGUpOworCQkJCUJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0ZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTSwgJkZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QsIHNpemVvZihGZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0KSwgJkRyaXZlME1hcEJ5dGUsIHNpemVvZihEcml2ZTBNYXBCeXRlKSk7CisJCQkJLyoKKwkJCQkgICBJZiB0aGUgTWFwIEJ5dGUgZm9yIEJJT1MgRHJpdmUgMCBpbmRpY2F0ZXMgdGhhdCBCSU9TIERyaXZlIDAKKwkJCQkgICBpcyBjb250cm9sbGVkIGJ5IHRoaXMgUENJIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlciwgdGhlbgorCQkJCSAgIHJldmVyc2UgdGhlIHByb2JlIG9yZGVyIHNvIHRoYXQgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycyBhcmUKKwkJCQkgICBwcm9iZWQgYmVmb3JlIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycy4KKwkJCQkgKi8KKwkJCQlpZiAoRHJpdmUwTWFwQnl0ZS5EaXNrR2VvbWV0cnkgIT0gQnVzTG9naWNfQklPU19EaXNrX05vdF9JbnN0YWxsZWQpIHsKKwkJCQkJc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyBTYXZlZFByb2JlSW5mb1tCdXNMb2dpY19NYXhIb3N0QWRhcHRlcnNdOworCQkJCQlpbnQgTXVsdGlNYXN0ZXJDb3VudCA9IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50IC0gRmxhc2hQb2ludENvdW50OworCQkJCQltZW1jcHkoU2F2ZWRQcm9iZUluZm8sIEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QsIEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8pKTsKKwkJCQkJbWVtY3B5KCZCdXNMb2dpY19Qcm9iZUluZm9MaXN0WzBdLCAmU2F2ZWRQcm9iZUluZm9bRmxhc2hQb2ludENvdW50XSwgTXVsdGlNYXN0ZXJDb3VudCAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvKSk7CisJCQkJCW1lbWNweSgmQnVzTG9naWNfUHJvYmVJbmZvTGlzdFtNdWx0aU1hc3RlckNvdW50XSwgJlNhdmVkUHJvYmVJbmZvWzBdLCBGbGFzaFBvaW50Q291bnQgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZQorCQlCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdElTQShQcm90b3R5cGVIb3N0QWRhcHRlcik7Cit9CisKKworI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KKworCisvKgorICBCdXNMb2dpY19GYWlsdXJlIHByaW50cyBhIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlLCBhbmQgdGhlbiByZXR1cm5zIGZhbHNlLgorKi8KKworc3RhdGljIGJvb2xlYW4gQnVzTG9naWNfRmFpbHVyZShzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyLCBjaGFyICpFcnJvck1lc3NhZ2UpCit7CisJQnVzTG9naWNfQW5ub3VuY2VEcml2ZXIoSG9zdEFkYXB0ZXIpOworCWlmIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJCdXNUeXBlID09IEJ1c0xvZ2ljX1BDSV9CdXMpIHsKKwkJQnVzTG9naWNfRXJyb3IoIldoaWxlIGNvbmZpZ3VyaW5nIEJ1c0xvZ2ljIFBDSSBIb3N0IEFkYXB0ZXIgYXRcbiIsIEhvc3RBZGFwdGVyKTsKKwkJQnVzTG9naWNfRXJyb3IoIkJ1cyAlZCBEZXZpY2UgJWQgSS9PIEFkZHJlc3MgMHglWCBQQ0kgQWRkcmVzcyAweCVYOlxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5CdXMsIEhvc3RBZGFwdGVyLT5EZXZpY2UsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBIb3N0QWRhcHRlci0+UENJX0FkZHJlc3MpOworCX0gZWxzZQorCQlCdXNMb2dpY19FcnJvcigiV2hpbGUgY29uZmlndXJpbmcgQnVzTG9naWMgSG9zdCBBZGFwdGVyIGF0ICIgIkkvTyBBZGRyZXNzIDB4JVg6XG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MpOworCUJ1c0xvZ2ljX0Vycm9yKCIlcyBGQUlMRUQgLSBERVRBQ0hJTkdcbiIsIEhvc3RBZGFwdGVyLCBFcnJvck1lc3NhZ2UpOworCWlmIChCdXNMb2dpY19Db21tYW5kRmFpbHVyZVJlYXNvbiAhPSBOVUxMKQorCQlCdXNMb2dpY19FcnJvcigiQURESVRJT05BTCBGQUlMVVJFIElORk8gLSAlc1xuIiwgSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworLyoKKyAgQnVzTG9naWNfUHJvYmVIb3N0QWRhcHRlciBwcm9iZXMgZm9yIGEgQnVzTG9naWMgSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIGJvb2xlYW4gX19pbml0IEJ1c0xvZ2ljX1Byb2JlSG9zdEFkYXB0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwl1bmlvbiBCdXNMb2dpY19TdGF0dXNSZWdpc3RlciBTdGF0dXNSZWdpc3RlcjsKKwl1bmlvbiBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3RlciBJbnRlcnJ1cHRSZWdpc3RlcjsKKwl1bmlvbiBCdXNMb2dpY19HZW9tZXRyeVJlZ2lzdGVyIEdlb21ldHJ5UmVnaXN0ZXI7CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgYXJlIFByb2JlZCBieSB0aGUgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIuCisJICovCisJaWYgKEJ1c0xvZ2ljX0ZsYXNoUG9pbnRIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpKSB7CisJCXN0cnVjdCBGbGFzaFBvaW50X0luZm8gKkZsYXNoUG9pbnRJbmZvID0gJkhvc3RBZGFwdGVyLT5GbGFzaFBvaW50SW5mbzsKKwkJRmxhc2hQb2ludEluZm8tPkJhc2VBZGRyZXNzID0gKHUzMikgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3M7CisJCUZsYXNoUG9pbnRJbmZvLT5JUlFfQ2hhbm5lbCA9IEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbDsKKwkJRmxhc2hQb2ludEluZm8tPlByZXNlbnQgPSBmYWxzZTsKKwkJaWYgKCEoRmxhc2hQb2ludF9Qcm9iZUhvc3RBZGFwdGVyKEZsYXNoUG9pbnRJbmZvKSA9PSAwICYmIEZsYXNoUG9pbnRJbmZvLT5QcmVzZW50KSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBGbGFzaFBvaW50IEhvc3QgQWRhcHRlciBkZXRlY3RlZCBhdCAiICJQQ0kgQnVzICVkIERldmljZSAlZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5CdXMsIEhvc3RBZGFwdGVyLT5EZXZpY2UpOworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJL08gQWRkcmVzcyAweCVYIFBDSSBBZGRyZXNzIDB4JVgsICIgImJ1dCBGbGFzaFBvaW50XG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIEhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyk7CisJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IFByb2JlIEZ1bmN0aW9uIGZhaWxlZCB0byB2YWxpZGF0ZSBpdC5cbiIsIEhvc3RBZGFwdGVyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZVByb2JlKQorCQkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19Qcm9iZSgweCVYKTogRmxhc2hQb2ludCBGb3VuZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzKTsKKwkJLyoKKwkJICAgSW5kaWNhdGUgdGhlIEhvc3QgQWRhcHRlciBQcm9iZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCQkgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCS8qCisJICAgUmVhZCB0aGUgU3RhdHVzLCBJbnRlcnJ1cHQsIGFuZCBHZW9tZXRyeSBSZWdpc3RlcnMgdG8gdGVzdCBpZiB0aGVyZSBhcmUgSS9PCisJICAgcG9ydHMgdGhhdCByZXNwb25kLCBhbmQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZnJvbSBhCisJICAgQnVzTG9naWMgSG9zdCBBZGFwdGVyLiAgQSBub25leGlzdGVudCBJL08gcG9ydCB3aWxsIHJldHVybiAweEZGLCBpbiB3aGljaAorCSAgIGNhc2UgdGhlcmUgaXMgZGVmaW5pdGVseSBubyBCdXNMb2dpYyBIb3N0IEFkYXB0ZXIgYXQgdGhpcyBiYXNlIEkvTyBBZGRyZXNzLgorCSAgIFRoZSB0ZXN0IGhlcmUgaXMgYSBzdWJzZXQgb2YgdGhhdCB1c2VkIGJ5IHRoZSBCdXNMb2dpYyBIb3N0IEFkYXB0ZXIgQklPUy4KKwkgKi8KKwlTdGF0dXNSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkU3RhdHVzUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCUludGVycnVwdFJlZ2lzdGVyLkFsbCA9IEJ1c0xvZ2ljX1JlYWRJbnRlcnJ1cHRSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJR2VvbWV0cnlSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkR2VvbWV0cnlSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJaWYgKEJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VQcm9iZSkKKwkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19Qcm9iZSgweCVYKTogU3RhdHVzIDB4JTAyWCwgSW50ZXJydXB0IDB4JTAyWCwgIiAiR2VvbWV0cnkgMHglMDJYXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIFN0YXR1c1JlZ2lzdGVyLkFsbCwgSW50ZXJydXB0UmVnaXN0ZXIuQWxsLCBHZW9tZXRyeVJlZ2lzdGVyLkFsbCk7CisJaWYgKFN0YXR1c1JlZ2lzdGVyLkFsbCA9PSAwIHx8IFN0YXR1c1JlZ2lzdGVyLnNyLkRpYWdub3N0aWNBY3RpdmUgfHwgU3RhdHVzUmVnaXN0ZXIuc3IuQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyQnVzeSB8fCBTdGF0dXNSZWdpc3Rlci5zci5SZXNlcnZlZCB8fCBTdGF0dXNSZWdpc3Rlci5zci5Db21tYW5kSW52YWxpZCB8fCBJbnRlcnJ1cHRSZWdpc3Rlci5pci5SZXNlcnZlZCAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgICBDaGVjayB0aGUgdW5kb2N1bWVudGVkIEdlb21ldHJ5IFJlZ2lzdGVyIHRvIHRlc3QgaWYgdGhlcmUgaXMgYW4gSS9PIHBvcnQKKwkgICB0aGF0IHJlc3BvbmRlZC4gIEFkYXB0ZWMgSG9zdCBBZGFwdGVycyBkbyBub3QgaW1wbGVtZW50IHRoZSBHZW9tZXRyeQorCSAgIFJlZ2lzdGVyLCBzbyB0aGlzIHRlc3QgaGVscHMgc2VydmUgdG8gYXZvaWQgaW5jb3JyZWN0bHkgcmVjb2duaXppbmcgYW4KKwkgICBBZGFwdGVjIDE1NDJBIG9yIDE1NDJCIGFzIGEgQnVzTG9naWMuICBVbmZvcnR1bmF0ZWx5LCB0aGUgQWRhcHRlYyAxNTQyQworCSAgIHNlcmllcyBkb2VzIHJlc3BvbmQgdG8gdGhlIEdlb21ldHJ5IFJlZ2lzdGVyIEkvTyBwb3J0LCBidXQgaXQgd2lsbCBiZQorCSAgIHJlamVjdGVkIGxhdGVyIHdoZW4gdGhlIElucXVpcmUgRXh0ZW5kZWQgU2V0dXAgSW5mb3JtYXRpb24gY29tbWFuZCBpcworCSAgIGlzc3VlZCBpbiBCdXNMb2dpY19DaGVja0hvc3RBZGFwdGVyLiAgVGhlIEFNSSBGYXN0RGlzayBIb3N0IEFkYXB0ZXIgaXMgYQorCSAgIEJ1c0xvZ2ljIGNsb25lIHRoYXQgaW1wbGVtZW50cyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZWFybGllciBCdXNMb2dpYworCSAgIEhvc3QgQWRhcHRlcnMsIGluY2x1ZGluZyB0aGUgdW5kb2N1bWVudGVkIGNvbW1hbmRzLCBhbmQgaXMgdGhlcmVmb3JlCisJICAgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAgSG93ZXZlciwgdGhlIEFNSSBGYXN0RGlzayBhbHdheXMgcmV0dXJucyAweDAwCisJICAgdXBvbiByZWFkaW5nIHRoZSBHZW9tZXRyeSBSZWdpc3Rlciwgc28gdGhlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIG9wdGlvbgorCSAgIHNob3VsZCBhbHdheXMgYmUgbGVmdCBkaXNhYmxlZCBvbiB0aGUgQU1JIEZhc3REaXNrLgorCSAqLworCWlmIChHZW9tZXRyeVJlZ2lzdGVyLkFsbCA9PSAweEZGKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgICBJbmRpY2F0ZSB0aGUgSG9zdCBBZGFwdGVyIFByb2JlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoKKyAgQnVzTG9naWNfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyIGlzc3VlcyBhIEhhcmR3YXJlIFJlc2V0IHRvIHRoZSBIb3N0IEFkYXB0ZXIKKyAgYW5kIHdhaXRzIGZvciBIb3N0IEFkYXB0ZXIgRGlhZ25vc3RpY3MgdG8gY29tcGxldGUuICBJZiBIYXJkUmVzZXQgaXMgdHJ1ZSwgYQorICBIYXJkIFJlc2V0IGlzIHBlcmZvcm1lZCB3aGljaCBhbHNvIGluaXRpYXRlcyBhIFNDU0kgQnVzIFJlc2V0LiAgT3RoZXJ3aXNlLCBhCisgIFNvZnQgUmVzZXQgaXMgcGVyZm9ybWVkIHdoaWNoIG9ubHkgcmVzZXRzIHRoZSBIb3N0IEFkYXB0ZXIgd2l0aG91dCBmb3JjaW5nIGEKKyAgU0NTSSBCdXMgUmVzZXQuCisqLworCitzdGF0aWMgYm9vbGVhbiBCdXNMb2dpY19IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkgKkhvc3RBZGFwdGVyLCBib29sZWFuIEhhcmRSZXNldCkKK3sKKwl1bmlvbiBCdXNMb2dpY19TdGF0dXNSZWdpc3RlciBTdGF0dXNSZWdpc3RlcjsKKwlpbnQgVGltZW91dENvdW50ZXI7CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgYXJlIEhhcmQgUmVzZXQgYnkgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyLgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkgeworCQlzdHJ1Y3QgRmxhc2hQb2ludF9JbmZvICpGbGFzaFBvaW50SW5mbyA9ICZIb3N0QWRhcHRlci0+Rmxhc2hQb2ludEluZm87CisJCUZsYXNoUG9pbnRJbmZvLT5Ib3N0U29mdFJlc2V0ID0gIUhhcmRSZXNldDsKKwkJRmxhc2hQb2ludEluZm8tPlJlcG9ydERhdGFVbmRlcnJ1biA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5DYXJkSGFuZGxlID0gRmxhc2hQb2ludF9IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIoRmxhc2hQb2ludEluZm8pOworCQlpZiAoSG9zdEFkYXB0ZXItPkNhcmRIYW5kbGUgPT0gRmxhc2hQb2ludF9CYWRDYXJkSGFuZGxlKQorCQkJcmV0dXJuIGZhbHNlOworCQkvKgorCQkgICBJbmRpY2F0ZSB0aGUgSG9zdCBBZGFwdGVyIEhhcmQgUmVzZXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKwkJICovCisJCXJldHVybiB0cnVlOworCX0KKwkvKgorCSAgIElzc3VlIGEgSGFyZCBSZXNldCBvciBTb2Z0IFJlc2V0IENvbW1hbmQgdG8gdGhlIEhvc3QgQWRhcHRlci4gIFRoZSBIb3N0CisJICAgQWRhcHRlciBzaG91bGQgcmVzcG9uZCBieSBzZXR0aW5nIERpYWdub3N0aWMgQWN0aXZlIGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisJICovCisJaWYgKEhhcmRSZXNldCkKKwkJQnVzTG9naWNfSGFyZFJlc2V0KEhvc3RBZGFwdGVyKTsKKwllbHNlCisJCUJ1c0xvZ2ljX1NvZnRSZXNldChIb3N0QWRhcHRlcik7CisJLyoKKwkgICBXYWl0IHVudGlsIERpYWdub3N0aWMgQWN0aXZlIGlzIHNldCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorCSAqLworCVRpbWVvdXRDb3VudGVyID0gNSAqIDEwMDAwOworCXdoaWxlICgtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRpYWdub3N0aWNBY3RpdmUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlSGFyZHdhcmVSZXNldCkKKwkJQnVzTG9naWNfTm90aWNlKCJCdXNMb2dpY19IYXJkd2FyZVJlc2V0KDB4JVgpOiBEaWFnbm9zdGljIEFjdGl2ZSwgIiAiU3RhdHVzIDB4JTAyWFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBTdGF0dXNSZWdpc3Rlci5BbGwpOworCWlmIChUaW1lb3V0Q291bnRlciA8IDApCisJCXJldHVybiBmYWxzZTsKKwkvKgorCSAgIFdhaXQgMTAwIG1pY3Jvc2Vjb25kcyB0byBhbGxvdyBjb21wbGV0aW9uIG9mIGFueSBpbml0aWFsIGRpYWdub3N0aWMKKwkgICBhY3Rpdml0eSB3aGljaCBtaWdodCBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIFN0YXR1cyBSZWdpc3RlcgorCSAgIHVucHJlZGljdGFibGUuCisJICovCisJdWRlbGF5KDEwMCk7CisJLyoKKwkgICBXYWl0IHVudGlsIERpYWdub3N0aWMgQWN0aXZlIGlzIHJlc2V0IGluIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisJICovCisJVGltZW91dENvdW50ZXIgPSAxMCAqIDEwMDAwOworCXdoaWxlICgtLVRpbWVvdXRDb3VudGVyID49IDApIHsKKwkJU3RhdHVzUmVnaXN0ZXIuQWxsID0gQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJaWYgKCFTdGF0dXNSZWdpc3Rlci5zci5EaWFnbm9zdGljQWN0aXZlKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUhhcmR3YXJlUmVzZXQpCisJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWNfSGFyZHdhcmVSZXNldCgweCVYKTogRGlhZ25vc3RpYyBDb21wbGV0ZWQsICIgIlN0YXR1cyAweCUwMlhcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+SU9fQWRkcmVzcywgU3RhdHVzUmVnaXN0ZXIuQWxsKTsKKwlpZiAoVGltZW91dENvdW50ZXIgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgICBXYWl0IHVudGlsIGF0IGxlYXN0IG9uZSBvZiB0aGUgRGlhZ25vc3RpYyBGYWlsdXJlLCBIb3N0IEFkYXB0ZXIgUmVhZHksCisJICAgb3IgRGF0YSBJbiBSZWdpc3RlciBSZWFkeSBiaXRzIGlzIHNldCBpbiB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorCSAqLworCVRpbWVvdXRDb3VudGVyID0gMTAwMDA7CisJd2hpbGUgKC0tVGltZW91dENvdW50ZXIgPj0gMCkgeworCQlTdGF0dXNSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkU3RhdHVzUmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQlpZiAoU3RhdHVzUmVnaXN0ZXIuc3IuRGlhZ25vc3RpY0ZhaWx1cmUgfHwgU3RhdHVzUmVnaXN0ZXIuc3IuSG9zdEFkYXB0ZXJSZWFkeSB8fCBTdGF0dXNSZWdpc3Rlci5zci5EYXRhSW5SZWdpc3RlclJlYWR5KQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUhhcmR3YXJlUmVzZXQpCisJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWNfSGFyZHdhcmVSZXNldCgweCVYKTogSG9zdCBBZGFwdGVyIFJlYWR5LCAiICJTdGF0dXMgMHglMDJYXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIFN0YXR1c1JlZ2lzdGVyLkFsbCk7CisJaWYgKFRpbWVvdXRDb3VudGVyIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCS8qCisJICAgSWYgRGlhZ25vc3RpYyBGYWlsdXJlIGlzIHNldCBvciBIb3N0IEFkYXB0ZXIgUmVhZHkgaXMgcmVzZXQsIHRoZW4gYW4KKwkgICBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIEhvc3QgQWRhcHRlciBkaWFnbm9zdGljcy4gIElmIERhdGEgSW4gUmVnaXN0ZXIKKwkgICBSZWFkeSBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgYW4gRXJyb3IgQ29kZSBhdmFpbGFibGUuCisJICovCisJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRpYWdub3N0aWNGYWlsdXJlIHx8ICFTdGF0dXNSZWdpc3Rlci5zci5Ib3N0QWRhcHRlclJlYWR5KSB7CisJCUJ1c0xvZ2ljX0NvbW1hbmRGYWlsdXJlUmVhc29uID0gTlVMTDsKKwkJQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIkhBUkQgUkVTRVQgRElBR05PU1RJQ1MiKTsKKwkJQnVzTG9naWNfRXJyb3IoIkhPU1QgQURBUFRFUiBTVEFUVVMgUkVHSVNURVIgPSAlMDJYXG4iLCBIb3N0QWRhcHRlciwgU3RhdHVzUmVnaXN0ZXIuQWxsKTsKKwkJaWYgKFN0YXR1c1JlZ2lzdGVyLnNyLkRhdGFJblJlZ2lzdGVyUmVhZHkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgRXJyb3JDb2RlID0gQnVzTG9naWNfUmVhZERhdGFJblJlZ2lzdGVyKEhvc3RBZGFwdGVyKTsKKwkJCUJ1c0xvZ2ljX0Vycm9yKCJIT1NUIEFEQVBURVIgRVJST1IgQ09ERSA9ICVkXG4iLCBIb3N0QWRhcHRlciwgRXJyb3JDb2RlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qCisJICAgSW5kaWNhdGUgdGhlIEhvc3QgQWRhcHRlciBIYXJkIFJlc2V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ2hlY2tIb3N0QWRhcHRlciBjaGVja3MgdG8gYmUgc3VyZSB0aGlzIHJlYWxseSBpcyBhIEJ1c0xvZ2ljCisgIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBib29sZWFuIF9faW5pdCBCdXNMb2dpY19DaGVja0hvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0V4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbiBFeHRlbmRlZFNldHVwSW5mb3JtYXRpb247CisJdW5zaWduZWQgY2hhciBSZXF1ZXN0ZWRSZXBseUxlbmd0aDsKKwlib29sZWFuIFJlc3VsdCA9IHRydWU7CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgZG8gbm90IHJlcXVpcmUgdGhpcyBwcm90ZWN0aW9uLgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJcmV0dXJuIHRydWU7CisJLyoKKwkgICBJc3N1ZSB0aGUgSW5xdWlyZSBFeHRlbmRlZCBTZXR1cCBJbmZvcm1hdGlvbiBjb21tYW5kLiAgT25seSBnZW51aW5lCisJICAgQnVzTG9naWMgSG9zdCBBZGFwdGVycyBhbmQgdHJ1ZSBjbG9uZXMgc3VwcG9ydCB0aGlzIGNvbW1hbmQuICBBZGFwdGVjIDE1NDJDCisJICAgc2VyaWVzIEhvc3QgQWRhcHRlcnMgdGhhdCByZXNwb25kIHRvIHRoZSBHZW9tZXRyeSBSZWdpc3RlciBJL08gcG9ydCB3aWxsCisJICAgZmFpbCB0aGlzIGNvbW1hbmQuCisJICovCisJUmVxdWVzdGVkUmVwbHlMZW5ndGggPSBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZUV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbiwgJlJlcXVlc3RlZFJlcGx5TGVuZ3RoLCBzaXplb2YoUmVxdWVzdGVkUmVwbHlMZW5ndGgpLCAmRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLCBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbikpCisJCVJlc3VsdCA9IGZhbHNlOworCS8qCisJICAgUHJvdmlkZSB0cmFjaW5nIGluZm9ybWF0aW9uIGlmIHJlcXVlc3RlZCBhbmQgcmV0dXJuLgorCSAqLworCWlmIChCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlUHJvYmUpCisJCUJ1c0xvZ2ljX05vdGljZSgiQnVzTG9naWNfQ2hlY2soMHglWCk6IE11bHRpTWFzdGVyICVzXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIChSZXN1bHQgPyAiRm91bmQiIDogIk5vdCBGb3VuZCIpKTsKKwlyZXR1cm4gUmVzdWx0OworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1JlYWRIb3N0QWRhcHRlckNvbmZpZ3VyYXRpb24gcmVhZHMgdGhlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24KKyAgZnJvbSBIb3N0IEFkYXB0ZXIgYW5kIGluaXRpYWxpemVzIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorKi8KKworc3RhdGljIGJvb2xlYW4gX19pbml0IEJ1c0xvZ2ljX1JlYWRIb3N0QWRhcHRlckNvbmZpZ3VyYXRpb24oc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkJICAgICpIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfQm9hcmRJRCBCb2FyZElEOworCXN0cnVjdCBCdXNMb2dpY19Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb247CisJc3RydWN0IEJ1c0xvZ2ljX1NldHVwSW5mb3JtYXRpb24gU2V0dXBJbmZvcm1hdGlvbjsKKwlzdHJ1Y3QgQnVzTG9naWNfRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uIEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbjsKKwl1bnNpZ25lZCBjaGFyIEhvc3RBZGFwdGVyTW9kZWxOdW1iZXJbNV07CisJdW5zaWduZWQgY2hhciBGaXJtd2FyZVZlcnNpb24zcmREaWdpdDsKKwl1bnNpZ25lZCBjaGFyIEZpcm13YXJlVmVyc2lvbkxldHRlcjsKKwlzdHJ1Y3QgQnVzTG9naWNfUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbiBQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uOworCXN0cnVjdCBCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0IEZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3Q7CisJc3RydWN0IEJ1c0xvZ2ljX0F1dG9TQ1NJRGF0YSBBdXRvU0NTSURhdGE7CisJdW5pb24gQnVzTG9naWNfR2VvbWV0cnlSZWdpc3RlciBHZW9tZXRyeVJlZ2lzdGVyOworCXVuc2lnbmVkIGNoYXIgUmVxdWVzdGVkUmVwbHlMZW5ndGg7CisJdW5zaWduZWQgY2hhciAqVGFyZ2V0UG9pbnRlciwgQ2hhcmFjdGVyOworCWludCBUYXJnZXRJRCwgaTsKKwkvKgorCSAgIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gZm9yIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBpcyBwcm92aWRlZCBpbiB0aGUKKwkgICBGbGFzaFBvaW50X0luZm8gc3RydWN0dXJlIGJ5IHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlcidzIFByb2JlIEZ1bmN0aW9uLgorCSAgIEluaXRpYWxpemUgZmllbGRzIGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlIGZyb20gdGhlIEZsYXNoUG9pbnRfSW5mbworCSAgIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJc3RydWN0IEZsYXNoUG9pbnRfSW5mbyAqRmxhc2hQb2ludEluZm8gPSAmSG9zdEFkYXB0ZXItPkZsYXNoUG9pbnRJbmZvOworCQlUYXJnZXRQb2ludGVyID0gSG9zdEFkYXB0ZXItPk1vZGVsTmFtZTsKKwkJKlRhcmdldFBvaW50ZXIrKyA9ICdCJzsKKwkJKlRhcmdldFBvaW50ZXIrKyA9ICdUJzsKKwkJKlRhcmdldFBvaW50ZXIrKyA9ICctJzsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihGbGFzaFBvaW50SW5mby0+TW9kZWxOdW1iZXIpOyBpKyspCisJCQkqVGFyZ2V0UG9pbnRlcisrID0gRmxhc2hQb2ludEluZm8tPk1vZGVsTnVtYmVyW2ldOworCQkqVGFyZ2V0UG9pbnRlcisrID0gJ1wwJzsKKwkJc3RyY3B5KEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIEZsYXNoUG9pbnRfRmlybXdhcmVWZXJzaW9uKTsKKwkJSG9zdEFkYXB0ZXItPlNDU0lfSUQgPSBGbGFzaFBvaW50SW5mby0+U0NTSV9JRDsKKwkJSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkID0gRmxhc2hQb2ludEluZm8tPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkOworCQlIb3N0QWRhcHRlci0+UGFyaXR5Q2hlY2tpbmdFbmFibGVkID0gRmxhc2hQb2ludEluZm8tPlBhcml0eUNoZWNraW5nRW5hYmxlZDsKKwkJSG9zdEFkYXB0ZXItPkJ1c1Jlc2V0RW5hYmxlZCA9ICFGbGFzaFBvaW50SW5mby0+SG9zdFNvZnRSZXNldDsKKwkJSG9zdEFkYXB0ZXItPkxldmVsU2Vuc2l0aXZlSW50ZXJydXB0ID0gdHJ1ZTsKKwkJSG9zdEFkYXB0ZXItPkhvc3RXaWRlU0NTSSA9IEZsYXNoUG9pbnRJbmZvLT5Ib3N0V2lkZVNDU0k7CisJCUhvc3RBZGFwdGVyLT5Ib3N0RGlmZmVyZW50aWFsU0NTSSA9IGZhbHNlOworCQlIb3N0QWRhcHRlci0+SG9zdFN1cHBvcnRzU0NBTSA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5Ib3N0VWx0cmFTQ1NJID0gdHJ1ZTsKKwkJSG9zdEFkYXB0ZXItPkV4dGVuZGVkTFVOU3VwcG9ydCA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5UZXJtaW5hdGlvbkluZm9WYWxpZCA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5Mb3dCeXRlVGVybWluYXRlZCA9IEZsYXNoUG9pbnRJbmZvLT5Mb3dCeXRlVGVybWluYXRlZDsKKwkJSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA9IEZsYXNoUG9pbnRJbmZvLT5IaWdoQnl0ZVRlcm1pbmF0ZWQ7CisJCUhvc3RBZGFwdGVyLT5TQ0FNX0VuYWJsZWQgPSBGbGFzaFBvaW50SW5mby0+U0NBTV9FbmFibGVkOworCQlIb3N0QWRhcHRlci0+U0NBTV9MZXZlbDIgPSBGbGFzaFBvaW50SW5mby0+U0NBTV9MZXZlbDI7CisJCUhvc3RBZGFwdGVyLT5Ecml2ZXJTY2F0dGVyR2F0aGVyTGltaXQgPSBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQ7CisJCUhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzID0gKEhvc3RBZGFwdGVyLT5Ib3N0V2lkZVNDU0kgPyAxNiA6IDgpOworCQlIb3N0QWRhcHRlci0+TWF4TG9naWNhbFVuaXRzID0gMzI7CisJCUhvc3RBZGFwdGVyLT5Jbml0aWFsQ0NCcyA9IDQgKiBCdXNMb2dpY19DQ0JfQWxsb2NhdGlvbkdyb3VwU2l6ZTsKKwkJSG9zdEFkYXB0ZXItPkluY3JlbWVudGFsQ0NCcyA9IEJ1c0xvZ2ljX0NDQl9BbGxvY2F0aW9uR3JvdXBTaXplOworCQlIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCA9IDI1NTsKKwkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyUXVldWVEZXB0aCA9IEhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoOworCQlIb3N0QWRhcHRlci0+U3luY2hyb25vdXNQZXJtaXR0ZWQgPSBGbGFzaFBvaW50SW5mby0+U3luY2hyb25vdXNQZXJtaXR0ZWQ7CisJCUhvc3RBZGFwdGVyLT5GYXN0UGVybWl0dGVkID0gRmxhc2hQb2ludEluZm8tPkZhc3RQZXJtaXR0ZWQ7CisJCUhvc3RBZGFwdGVyLT5VbHRyYVBlcm1pdHRlZCA9IEZsYXNoUG9pbnRJbmZvLT5VbHRyYVBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPldpZGVQZXJtaXR0ZWQgPSBGbGFzaFBvaW50SW5mby0+V2lkZVBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPkRpc2Nvbm5lY3RQZXJtaXR0ZWQgPSBGbGFzaFBvaW50SW5mby0+RGlzY29ubmVjdFBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgPSAweEZGRkY7CisJCWdvdG8gQ29tbW9uOworCX0KKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIEJvYXJkIElEIGNvbW1hbmQuCisJICovCisJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVCb2FyZElELCBOVUxMLCAwLCAmQm9hcmRJRCwgc2l6ZW9mKEJvYXJkSUQpKSAhPSBzaXplb2YoQm9hcmRJRCkpCisJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiSU5RVUlSRSBCT0FSRCBJRCIpOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgQ29uZmlndXJhdGlvbiBjb21tYW5kLgorCSAqLworCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlQ29uZmlndXJhdGlvbiwgTlVMTCwgMCwgJkNvbmZpZ3VyYXRpb24sIHNpemVvZihDb25maWd1cmF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKENvbmZpZ3VyYXRpb24pKQorCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgQ09ORklHVVJBVElPTiIpOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgU2V0dXAgSW5mb3JtYXRpb24gY29tbWFuZC4KKwkgKi8KKwlSZXF1ZXN0ZWRSZXBseUxlbmd0aCA9IHNpemVvZihTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZVNldHVwSW5mb3JtYXRpb24sICZSZXF1ZXN0ZWRSZXBseUxlbmd0aCwgc2l6ZW9mKFJlcXVlc3RlZFJlcGx5TGVuZ3RoKSwgJlNldHVwSW5mb3JtYXRpb24sIHNpemVvZihTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKFNldHVwSW5mb3JtYXRpb24pKQorCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgU0VUVVAgSU5GT1JNQVRJT04iKTsKKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIEV4dGVuZGVkIFNldHVwIEluZm9ybWF0aW9uIGNvbW1hbmQuCisJICovCisJUmVxdWVzdGVkUmVwbHlMZW5ndGggPSBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZUV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbiwgJlJlcXVlc3RlZFJlcGx5TGVuZ3RoLCBzaXplb2YoUmVxdWVzdGVkUmVwbHlMZW5ndGgpLCAmRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLCBzaXplb2YoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbikpCisJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiSU5RVUlSRSBFWFRFTkRFRCBTRVRVUCBJTkZPUk1BVElPTiIpOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgRmlybXdhcmUgVmVyc2lvbiAzcmQgRGlnaXQgY29tbWFuZC4KKwkgKi8KKwlGaXJtd2FyZVZlcnNpb24zcmREaWdpdCA9ICdcMCc7CisJaWYgKEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMXN0RGlnaXQgPiAnMCcpCisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlRmlybXdhcmVWZXJzaW9uM3JkRGlnaXQsIE5VTEwsIDAsICZGaXJtd2FyZVZlcnNpb24zcmREaWdpdCwgc2l6ZW9mKEZpcm13YXJlVmVyc2lvbjNyZERpZ2l0KSkKKwkJICAgICE9IHNpemVvZihGaXJtd2FyZVZlcnNpb24zcmREaWdpdCkpCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgRklSTVdBUkUgM1JEIERJR0lUIik7CisJLyoKKwkgICBJc3N1ZSB0aGUgSW5xdWlyZSBIb3N0IEFkYXB0ZXIgTW9kZWwgTnVtYmVyIGNvbW1hbmQuCisJICovCisJaWYgKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5CdXNUeXBlID09ICdBJyAmJiBCb2FyZElELkZpcm13YXJlVmVyc2lvbjFzdERpZ2l0ID09ICcyJykKKwkJLyogQnVzTG9naWMgQlQtNTQyQiBJU0EgMi54eCAqLworCQlzdHJjcHkoSG9zdEFkYXB0ZXJNb2RlbE51bWJlciwgIjU0MkIiKTsKKwllbHNlIGlmIChFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uQnVzVHlwZSA9PSAnRScgJiYgQm9hcmRJRC5GaXJtd2FyZVZlcnNpb24xc3REaWdpdCA9PSAnMicgJiYgKEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMm5kRGlnaXQgPD0gJzEnIHx8IChCb2FyZElELkZpcm13YXJlVmVyc2lvbjJuZERpZ2l0ID09ICcyJyAmJiBGaXJtd2FyZVZlcnNpb24zcmREaWdpdCA9PSAnMCcpKSkKKwkJLyogQnVzTG9naWMgQlQtNzQyQSBFSVNBIDIuMXggb3IgMi4yMCAqLworCQlzdHJjcHkoSG9zdEFkYXB0ZXJNb2RlbE51bWJlciwgIjc0MkEiKTsKKwllbHNlIGlmIChFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uQnVzVHlwZSA9PSAnRScgJiYgQm9hcmRJRC5GaXJtd2FyZVZlcnNpb24xc3REaWdpdCA9PSAnMCcpCisJCS8qIEFNSSBGYXN0RGlzayBFSVNBIFNlcmllcyA0NDEgMC54ICovCisJCXN0cmNweShIb3N0QWRhcHRlck1vZGVsTnVtYmVyLCAiNzQ3QSIpOworCWVsc2UgeworCQlSZXF1ZXN0ZWRSZXBseUxlbmd0aCA9IHNpemVvZihIb3N0QWRhcHRlck1vZGVsTnVtYmVyKTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVIb3N0QWRhcHRlck1vZGVsTnVtYmVyLCAmUmVxdWVzdGVkUmVwbHlMZW5ndGgsIHNpemVvZihSZXF1ZXN0ZWRSZXBseUxlbmd0aCksICZIb3N0QWRhcHRlck1vZGVsTnVtYmVyLCBzaXplb2YoSG9zdEFkYXB0ZXJNb2RlbE51bWJlcikpCisJCSAgICAhPSBzaXplb2YoSG9zdEFkYXB0ZXJNb2RlbE51bWJlcikpCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgSE9TVCBBREFQVEVSIE1PREVMIE5VTUJFUiIpOworCX0KKwkvKgorCSAgIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgbW9kZWwgbnVtYmVyCisJICAgYW5kIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGVpciBmaXJtd2FyZSBhcyBmb2xsb3dzOgorCisJICAgNS54eCAgICAgICBCdXNMb2dpYyAiVyIgU2VyaWVzIEhvc3QgQWRhcHRlcnM6CisJICAgQlQtOTQ4Lzk1OC85NThECisJICAgNC54eCAgICAgICBCdXNMb2dpYyAiQyIgU2VyaWVzIEhvc3QgQWRhcHRlcnM6CisJICAgQlQtOTQ2Qy85NTZDLzk1NkNELzc0N0MvNzU3Qy83NTdDRC80NDVDLzU0NUMvNTQwQ0YKKwkgICAzLnh4ICAgICAgIEJ1c0xvZ2ljICJTIiBTZXJpZXMgSG9zdCBBZGFwdGVyczoKKwkgICBCVC03NDdTLzc0N0QvNzU3Uy83NTdELzQ0NVMvNTQ1Uy81NDJECisJICAgQlQtNTQyQi83NDJBIChyZXZpc2lvbiBIKQorCSAgIDIueHggICAgICAgQnVzTG9naWMgIkEiIFNlcmllcyBIb3N0IEFkYXB0ZXJzOgorCSAgIEJULTU0MkIvNzQyQSAocmV2aXNpb24gRyBhbmQgYmVsb3cpCisJICAgMC54eCAgICAgICBBTUkgRmFzdERpc2sgVkxCL0VJU0EgQnVzTG9naWMgQ2xvbmUgSG9zdCBBZGFwdGVyCisJICovCisJLyoKKwkgICBTYXZlIHRoZSBNb2RlbCBOYW1lIGFuZCBIb3N0IEFkYXB0ZXIgTmFtZSBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkgKi8KKwlUYXJnZXRQb2ludGVyID0gSG9zdEFkYXB0ZXItPk1vZGVsTmFtZTsKKwkqVGFyZ2V0UG9pbnRlcisrID0gJ0InOworCSpUYXJnZXRQb2ludGVyKysgPSAnVCc7CisJKlRhcmdldFBvaW50ZXIrKyA9ICctJzsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEhvc3RBZGFwdGVyTW9kZWxOdW1iZXIpOyBpKyspIHsKKwkJQ2hhcmFjdGVyID0gSG9zdEFkYXB0ZXJNb2RlbE51bWJlcltpXTsKKwkJaWYgKENoYXJhY3RlciA9PSAnICcgfHwgQ2hhcmFjdGVyID09ICdcMCcpCisJCQlicmVhazsKKwkJKlRhcmdldFBvaW50ZXIrKyA9IENoYXJhY3RlcjsKKwl9CisJKlRhcmdldFBvaW50ZXIrKyA9ICdcMCc7CisJLyoKKwkgICBTYXZlIHRoZSBGaXJtd2FyZSBWZXJzaW9uIGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCSAqLworCVRhcmdldFBvaW50ZXIgPSBIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uOworCSpUYXJnZXRQb2ludGVyKysgPSBCb2FyZElELkZpcm13YXJlVmVyc2lvbjFzdERpZ2l0OworCSpUYXJnZXRQb2ludGVyKysgPSAnLic7CisJKlRhcmdldFBvaW50ZXIrKyA9IEJvYXJkSUQuRmlybXdhcmVWZXJzaW9uMm5kRGlnaXQ7CisJaWYgKEZpcm13YXJlVmVyc2lvbjNyZERpZ2l0ICE9ICcgJyAmJiBGaXJtd2FyZVZlcnNpb24zcmREaWdpdCAhPSAnXDAnKQorCQkqVGFyZ2V0UG9pbnRlcisrID0gRmlybXdhcmVWZXJzaW9uM3JkRGlnaXQ7CisJKlRhcmdldFBvaW50ZXIgPSAnXDAnOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgRmlybXdhcmUgVmVyc2lvbiBMZXR0ZXIgY29tbWFuZC4KKwkgKi8KKwlpZiAoc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICIzLjMiKSA+PSAwKSB7CisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlRmlybXdhcmVWZXJzaW9uTGV0dGVyLCBOVUxMLCAwLCAmRmlybXdhcmVWZXJzaW9uTGV0dGVyLCBzaXplb2YoRmlybXdhcmVWZXJzaW9uTGV0dGVyKSkKKwkJICAgICE9IHNpemVvZihGaXJtd2FyZVZlcnNpb25MZXR0ZXIpKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJJTlFVSVJFIEZJUk1XQVJFIFZFUlNJT04gTEVUVEVSIik7CisJCWlmIChGaXJtd2FyZVZlcnNpb25MZXR0ZXIgIT0gJyAnICYmIEZpcm13YXJlVmVyc2lvbkxldHRlciAhPSAnXDAnKQorCQkJKlRhcmdldFBvaW50ZXIrKyA9IEZpcm13YXJlVmVyc2lvbkxldHRlcjsKKwkJKlRhcmdldFBvaW50ZXIgPSAnXDAnOworCX0KKwkvKgorCSAgIFNhdmUgdGhlIEhvc3QgQWRhcHRlciBTQ1NJIElEIGluIHRoZSBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCSAqLworCUhvc3RBZGFwdGVyLT5TQ1NJX0lEID0gQ29uZmlndXJhdGlvbi5Ib3N0QWRhcHRlcklEOworCS8qCisJICAgRGV0ZXJtaW5lIHRoZSBCdXMgVHlwZSBhbmQgc2F2ZSBpdCBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZSwgZGV0ZXJtaW5lCisJICAgYW5kIHNhdmUgdGhlIElSUSBDaGFubmVsIGlmIG5lY2Vzc2FyeSwgYW5kIGRldGVybWluZSBhbmQgc2F2ZSB0aGUgRE1BCisJICAgQ2hhbm5lbCBmb3IgSVNBIEhvc3QgQWRhcHRlcnMuCisJICovCisJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQnVzVHlwZSA9IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQnVzVHlwZXNbSG9zdEFkYXB0ZXItPk1vZGVsTmFtZVszXSAtICc0J107CisJaWYgKEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9PSAwKSB7CisJCWlmIChDb25maWd1cmF0aW9uLklSUV9DaGFubmVsOSkKKwkJCUhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9IDk7CisJCWVsc2UgaWYgKENvbmZpZ3VyYXRpb24uSVJRX0NoYW5uZWwxMCkKKwkJCUhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9IDEwOworCQllbHNlIGlmIChDb25maWd1cmF0aW9uLklSUV9DaGFubmVsMTEpCisJCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSAxMTsKKwkJZWxzZSBpZiAoQ29uZmlndXJhdGlvbi5JUlFfQ2hhbm5lbDEyKQorCQkJSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsID0gMTI7CisJCWVsc2UgaWYgKENvbmZpZ3VyYXRpb24uSVJRX0NoYW5uZWwxNCkKKwkJCUhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCA9IDE0OworCQllbHNlIGlmIChDb25maWd1cmF0aW9uLklSUV9DaGFubmVsMTUpCisJCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSAxNTsKKwl9CisJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPT0gQnVzTG9naWNfSVNBX0J1cykgeworCQlpZiAoQ29uZmlndXJhdGlvbi5ETUFfQ2hhbm5lbDUpCisJCQlIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWwgPSA1OworCQllbHNlIGlmIChDb25maWd1cmF0aW9uLkRNQV9DaGFubmVsNikKKwkJCUhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCA9IDY7CisJCWVsc2UgaWYgKENvbmZpZ3VyYXRpb24uRE1BX0NoYW5uZWw3KQorCQkJSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsID0gNzsKKwl9CisJLyoKKwkgICBEZXRlcm1pbmUgd2hldGhlciBFeHRlbmRlZCBUcmFuc2xhdGlvbiBpcyBlbmFibGVkIGFuZCBzYXZlIGl0IGluCisJICAgdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUuCisJICovCisJR2VvbWV0cnlSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkR2VvbWV0cnlSZWdpc3RlcihIb3N0QWRhcHRlcik7CisJSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkID0gR2VvbWV0cnlSZWdpc3Rlci5nci5FeHRlbmRlZFRyYW5zbGF0aW9uRW5hYmxlZDsKKwkvKgorCSAgIFNhdmUgdGhlIFNjYXR0ZXIgR2F0aGVyIExpbWl0cywgTGV2ZWwgU2Vuc2l0aXZlIEludGVycnVwdCBmbGFnLCBXaWRlCisJICAgU0NTSSBmbGFnLCBEaWZmZXJlbnRpYWwgU0NTSSBmbGFnLCBTQ0FNIFN1cHBvcnRlZCBmbGFnLCBhbmQKKwkgICBVbHRyYSBTQ1NJIGZsYWcgaW4gdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUuCisJICovCisJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyU2NhdHRlckdhdGhlckxpbWl0ID0gRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLlNjYXR0ZXJHYXRoZXJMaW1pdDsKKwlIb3N0QWRhcHRlci0+RHJpdmVyU2NhdHRlckdhdGhlckxpbWl0ID0gSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyU2NhdHRlckdhdGhlckxpbWl0OworCWlmIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJTY2F0dGVyR2F0aGVyTGltaXQgPiBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQpCisJCUhvc3RBZGFwdGVyLT5Ecml2ZXJTY2F0dGVyR2F0aGVyTGltaXQgPSBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQ7CisJaWYgKEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5NaXNjLkxldmVsU2Vuc2l0aXZlSW50ZXJydXB0KQorCQlIb3N0QWRhcHRlci0+TGV2ZWxTZW5zaXRpdmVJbnRlcnJ1cHQgPSB0cnVlOworCUhvc3RBZGFwdGVyLT5Ib3N0V2lkZVNDU0kgPSBFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uSG9zdFdpZGVTQ1NJOworCUhvc3RBZGFwdGVyLT5Ib3N0RGlmZmVyZW50aWFsU0NTSSA9IEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5Ib3N0RGlmZmVyZW50aWFsU0NTSTsKKwlIb3N0QWRhcHRlci0+SG9zdFN1cHBvcnRzU0NBTSA9IEV4dGVuZGVkU2V0dXBJbmZvcm1hdGlvbi5Ib3N0U3VwcG9ydHNTQ0FNOworCUhvc3RBZGFwdGVyLT5Ib3N0VWx0cmFTQ1NJID0gRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLkhvc3RVbHRyYVNDU0k7CisJLyoKKwkgICBEZXRlcm1pbmUgd2hldGhlciBFeHRlbmRlZCBMVU4gRm9ybWF0IENDQnMgYXJlIHN1cHBvcnRlZCBhbmQgc2F2ZSB0aGUKKwkgICBpbmZvcm1hdGlvbiBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA9PSAnNScgfHwgKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb25bMF0gPT0gJzQnICYmIEhvc3RBZGFwdGVyLT5Ib3N0V2lkZVNDU0kpKQorCQlIb3N0QWRhcHRlci0+RXh0ZW5kZWRMVU5TdXBwb3J0ID0gdHJ1ZTsKKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIFBDSSBIb3N0IEFkYXB0ZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byByZWFkIHRoZQorCSAgIFRlcm1pbmF0aW9uIEluZm9ybWF0aW9uIGZyb20gIlciIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID09ICc1JykgeworCQlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZVBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24sIE5VTEwsIDAsICZQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLCBzaXplb2YoUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbikpCisJCSAgICAhPSBzaXplb2YoUENJSG9zdEFkYXB0ZXJJbmZvcm1hdGlvbikpCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgUENJIEhPU1QgQURBUFRFUiBJTkZPUk1BVElPTiIpOworCQkvKgorCQkgICBTYXZlIHRoZSBUZXJtaW5hdGlvbiBJbmZvcm1hdGlvbiBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkJICovCisJCWlmIChQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLkdlbmVyaWNJbmZvVmFsaWQpIHsKKwkJCUhvc3RBZGFwdGVyLT5UZXJtaW5hdGlvbkluZm9WYWxpZCA9IHRydWU7CisJCQlIb3N0QWRhcHRlci0+TG93Qnl0ZVRlcm1pbmF0ZWQgPSBQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uLkxvd0J5dGVUZXJtaW5hdGVkOworCQkJSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA9IFBDSUhvc3RBZGFwdGVySW5mb3JtYXRpb24uSGlnaEJ5dGVUZXJtaW5hdGVkOworCQl9CisJfQorCS8qCisJICAgSXNzdWUgdGhlIEZldGNoIEhvc3QgQWRhcHRlciBMb2NhbCBSQU0gY29tbWFuZCB0byByZWFkIHRoZSBBdXRvU0NTSSBkYXRhCisJICAgZnJvbSAiVyIgYW5kICJDIiBzZXJpZXMgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycy4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA+PSAnNCcpIHsKKwkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlT2Zmc2V0ID0gQnVzTG9naWNfQXV0b1NDU0lfQmFzZU9mZnNldDsKKwkJRmV0Y2hIb3N0QWRhcHRlckxvY2FsUkFNUmVxdWVzdC5CeXRlQ291bnQgPSBzaXplb2YoQXV0b1NDU0lEYXRhKTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0ZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTSwgJkZldGNoSG9zdEFkYXB0ZXJMb2NhbFJBTVJlcXVlc3QsIHNpemVvZihGZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0KSwgJkF1dG9TQ1NJRGF0YSwgc2l6ZW9mKEF1dG9TQ1NJRGF0YSkpCisJCSAgICAhPSBzaXplb2YoQXV0b1NDU0lEYXRhKSkKKwkJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiRkVUQ0ggSE9TVCBBREFQVEVSIExPQ0FMIFJBTSIpOworCQkvKgorCQkgICBTYXZlIHRoZSBQYXJpdHkgQ2hlY2tpbmcgRW5hYmxlZCwgQnVzIFJlc2V0IEVuYWJsZWQsIGFuZCBUZXJtaW5hdGlvbgorCQkgICBJbmZvcm1hdGlvbiBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKwkJICovCisJCUhvc3RBZGFwdGVyLT5QYXJpdHlDaGVja2luZ0VuYWJsZWQgPSBBdXRvU0NTSURhdGEuUGFyaXR5Q2hlY2tpbmdFbmFibGVkOworCQlIb3N0QWRhcHRlci0+QnVzUmVzZXRFbmFibGVkID0gQXV0b1NDU0lEYXRhLkJ1c1Jlc2V0RW5hYmxlZDsKKwkJaWYgKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb25bMF0gPT0gJzQnKSB7CisJCQlIb3N0QWRhcHRlci0+VGVybWluYXRpb25JbmZvVmFsaWQgPSB0cnVlOworCQkJSG9zdEFkYXB0ZXItPkxvd0J5dGVUZXJtaW5hdGVkID0gQXV0b1NDU0lEYXRhLkxvd0J5dGVUZXJtaW5hdGVkOworCQkJSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA9IEF1dG9TQ1NJRGF0YS5IaWdoQnl0ZVRlcm1pbmF0ZWQ7CisJCX0KKwkJLyoKKwkJICAgU2F2ZSB0aGUgV2lkZSBQZXJtaXR0ZWQsIEZhc3QgUGVybWl0dGVkLCBTeW5jaHJvbm91cyBQZXJtaXR0ZWQsCisJCSAgIERpc2Nvbm5lY3QgUGVybWl0dGVkLCBVbHRyYSBQZXJtaXR0ZWQsIGFuZCBTQ0FNIEluZm9ybWF0aW9uIGluIHRoZQorCQkgICBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlLgorCQkgKi8KKwkJSG9zdEFkYXB0ZXItPldpZGVQZXJtaXR0ZWQgPSBBdXRvU0NTSURhdGEuV2lkZVBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPkZhc3RQZXJtaXR0ZWQgPSBBdXRvU0NTSURhdGEuRmFzdFBlcm1pdHRlZDsKKwkJSG9zdEFkYXB0ZXItPlN5bmNocm9ub3VzUGVybWl0dGVkID0gQXV0b1NDU0lEYXRhLlN5bmNocm9ub3VzUGVybWl0dGVkOworCQlIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZCA9IEF1dG9TQ1NJRGF0YS5EaXNjb25uZWN0UGVybWl0dGVkOworCQlpZiAoSG9zdEFkYXB0ZXItPkhvc3RVbHRyYVNDU0kpCisJCQlIb3N0QWRhcHRlci0+VWx0cmFQZXJtaXR0ZWQgPSBBdXRvU0NTSURhdGEuVWx0cmFQZXJtaXR0ZWQ7CisJCWlmIChIb3N0QWRhcHRlci0+SG9zdFN1cHBvcnRzU0NBTSkgeworCQkJSG9zdEFkYXB0ZXItPlNDQU1fRW5hYmxlZCA9IEF1dG9TQ1NJRGF0YS5TQ0FNX0VuYWJsZWQ7CisJCQlIb3N0QWRhcHRlci0+U0NBTV9MZXZlbDIgPSBBdXRvU0NTSURhdGEuU0NBTV9MZXZlbDI7CisJCX0KKwl9CisJLyoKKwkgICBJbml0aWFsaXplIGZpZWxkcyBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZSBmb3IgIlMiIGFuZCAiQSIgc2VyaWVzCisJICAgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycy4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA8ICc0JykgeworCQlpZiAoU2V0dXBJbmZvcm1hdGlvbi5TeW5jaHJvbm91c0luaXRpYXRpb25FbmFibGVkKSB7CisJCQlIb3N0QWRhcHRlci0+U3luY2hyb25vdXNQZXJtaXR0ZWQgPSAweEZGOworCQkJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPT0gQnVzTG9naWNfRUlTQV9CdXMpIHsKKwkJCQlpZiAoRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uLk1pc2MuRmFzdE9uRUlTQSkKKwkJCQkJSG9zdEFkYXB0ZXItPkZhc3RQZXJtaXR0ZWQgPSAweEZGOworCQkJCWlmIChzdHJjbXAoSG9zdEFkYXB0ZXItPk1vZGVsTmFtZSwgIkJULTc1NyIpID09IDApCisJCQkJCUhvc3RBZGFwdGVyLT5XaWRlUGVybWl0dGVkID0gMHhGRjsKKwkJCX0KKwkJfQorCQlIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZCA9IDB4RkY7CisJCUhvc3RBZGFwdGVyLT5QYXJpdHlDaGVja2luZ0VuYWJsZWQgPSBTZXR1cEluZm9ybWF0aW9uLlBhcml0eUNoZWNraW5nRW5hYmxlZDsKKwkJSG9zdEFkYXB0ZXItPkJ1c1Jlc2V0RW5hYmxlZCA9IHRydWU7CisJfQorCS8qCisJICAgRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBUYXJnZXQgSURzIGFuZCBMb2dpY2FsIFVuaXRzIHN1cHBvcnRlZCBieQorCSAgIHRoaXMgZHJpdmVyIGZvciBXaWRlIGFuZCBOYXJyb3cgSG9zdCBBZGFwdGVycy4KKwkgKi8KKwlIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlcyA9IChIb3N0QWRhcHRlci0+SG9zdFdpZGVTQ1NJID8gMTYgOiA4KTsKKwlIb3N0QWRhcHRlci0+TWF4TG9naWNhbFVuaXRzID0gKEhvc3RBZGFwdGVyLT5FeHRlbmRlZExVTlN1cHBvcnQgPyAzMiA6IDgpOworCS8qCisJICAgU2VsZWN0IGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIE1haWxib3ggQ291bnQsIERyaXZlciBRdWV1ZSBEZXB0aCwKKwkgICBJbml0aWFsIENDQnMsIGFuZCBJbmNyZW1lbnRhbCBDQ0JzIHZhcmlhYmxlcyBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCBTdHJpY3QKKwkgICBSb3VuZCBSb2JpbiBNb2RlIGlzIHN1cHBvcnRlZC4gIElmIFN0cmljdCBSb3VuZCBSb2JpbiBNb2RlIGlzIHN1cHBvcnRlZCwKKwkgICB0aGVuIHRoZXJlIGlzIG5vIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGluIHVzaW5nIHRoZSBtYXhpbXVtIHBvc3NpYmxlCisJICAgbnVtYmVyIG9mIE91dGdvaW5nIGFuZCBJbmNvbWluZyBNYWlsYm94ZXMgYW5kIGFsbG93aW5nIHRoZSBUYWdnZWQgYW5kCisJICAgVW50YWdnZWQgUXVldWUgRGVwdGhzIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIHV0aWxpemF0aW9uLiAgSWYgU3RyaWN0IFJvdW5kCisJICAgUm9iaW4gTW9kZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIHRoZSBIb3N0IEFkYXB0ZXIgbXVzdCBzY2FuIGFsbCB0aGUKKwkgICBPdXRnb2luZyBNYWlsYm94ZXMgd2hlbmV2ZXIgYW4gT3V0Z29pbmcgTWFpbGJveCBlbnRyeSBpcyBtYWRlLCB3aGljaCBjYW4KKwkgICBjYXVzZSBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkuICBUaGUgaG9zdCBhZGFwdGVycyBhY3R1YWxseSBoYXZlCisJICAgcm9vbSB0byBzdG9yZSB0aGUgZm9sbG93aW5nIG51bWJlciBvZiBDQ0JzIGludGVybmFsbHk7IHRoYXQgaXMsIHRoZXkgY2FuCisJICAgaW50ZXJuYWxseSBxdWV1ZSBhbmQgbWFuYWdlIHRoaXMgbWFueSBhY3RpdmUgY29tbWFuZHMgb24gdGhlIFNDU0kgYnVzCisJICAgc2ltdWx0YW5lb3VzbHkuICBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMgZGVtb25zdHJhdGUgdGhhdCB0aGUgRHJpdmVyIFF1ZXVlCisJICAgRGVwdGggc2hvdWxkIGJlIHNldCB0byB0aGUgTWFpbGJveCBDb3VudCwgcmF0aGVyIHRoYW4gdGhlIEhvc3QgQWRhcHRlcgorCSAgIFF1ZXVlIERlcHRoIChpbnRlcm5hbCBDQ0IgY2FwYWNpdHkpLCBhcyBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBoYXZlIHRoZQorCSAgIHF1ZXVlZCBjb21tYW5kcyB3YWl0aW5nIGluIE91dGdvaW5nIE1haWxib3hlcyBpZiBuZWNlc3NhcnkgdGhhbiB0byBibG9jaworCSAgIHRoZSBwcm9jZXNzIGluIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBTQ1NJIFN1YnN5c3RlbS4KKworCSAgIDE5MiAgICAgICAgICBCVC05NDgvOTU4Lzk1OEQKKwkgICAxMDAgICAgICAgICAgQlQtOTQ2Qy85NTZDLzk1NkNELzc0N0MvNzU3Qy83NTdDRC80NDVDCisJICAgNTAgICBCVC01NDVDLzU0MENGCisJICAgMzAgICBCVC03NDdTLzc0N0QvNzU3Uy83NTdELzQ0NVMvNTQ1Uy81NDJELzU0MkIvNzQyQQorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID09ICc1JykKKwkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyUXVldWVEZXB0aCA9IDE5MjsKKwllbHNlIGlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID09ICc0JykKKwkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyUXVldWVEZXB0aCA9IChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJCdXNUeXBlICE9IEJ1c0xvZ2ljX0lTQV9CdXMgPyAxMDAgOiA1MCk7CisJZWxzZQorCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJRdWV1ZURlcHRoID0gMzA7CisJaWYgKHN0cmNtcChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCAiMy4zMSIpID49IDApIHsKKwkJSG9zdEFkYXB0ZXItPlN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydCA9IHRydWU7CisJCUhvc3RBZGFwdGVyLT5NYWlsYm94Q291bnQgPSBCdXNMb2dpY19NYXhNYWlsYm94ZXM7CisJfSBlbHNlIHsKKwkJSG9zdEFkYXB0ZXItPlN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydCA9IGZhbHNlOworCQlIb3N0QWRhcHRlci0+TWFpbGJveENvdW50ID0gMzI7CisJfQorCUhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoID0gSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudDsKKwlIb3N0QWRhcHRlci0+SW5pdGlhbENDQnMgPSA0ICogQnVzTG9naWNfQ0NCX0FsbG9jYXRpb25Hcm91cFNpemU7CisJSG9zdEFkYXB0ZXItPkluY3JlbWVudGFsQ0NCcyA9IEJ1c0xvZ2ljX0NDQl9BbGxvY2F0aW9uR3JvdXBTaXplOworCS8qCisJICAgVGFnZ2VkIFF1ZXVpbmcgc3VwcG9ydCBpcyBhdmFpbGFibGUgYW5kIG9wZXJhdGVzIHByb3Blcmx5IG9uIGFsbCAiVyIgc2VyaWVzCisJICAgTXVsdGlNYXN0ZXIgSG9zdCBBZGFwdGVycywgb24gIkMiIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzIHdpdGgKKwkgICBmaXJtd2FyZSB2ZXJzaW9uIDQuMjIgYW5kIGFib3ZlLCBhbmQgb24gIlMiIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0CisJICAgQWRhcHRlcnMgd2l0aCBmaXJtd2FyZSB2ZXJzaW9uIDMuMzUgYW5kIGFib3ZlLgorCSAqLworCUhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMDsKKwlzd2l0Y2ggKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb25bMF0pIHsKKwljYXNlICc1JzoKKwkJSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgPSAweEZGRkY7CisJCWJyZWFrOworCWNhc2UgJzQnOgorCQlpZiAoc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICI0LjIyIikgPj0gMCkKKwkJCUhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMHhGRkZGOworCQlicmVhazsKKwljYXNlICczJzoKKwkJaWYgKHN0cmNtcChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCAiMy4zNSIpID49IDApCisJCQlIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9IDB4RkZGRjsKKwkJYnJlYWs7CisJfQorCS8qCisJICAgRGV0ZXJtaW5lIHRoZSBIb3N0IEFkYXB0ZXIgQklPUyBBZGRyZXNzIGlmIHRoZSBCSU9TIGlzIGVuYWJsZWQgYW5kCisJICAgc2F2ZSBpdCBpbiB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4gIFRoZSBCSU9TIGlzIGRpc2FibGVkIGlmIHRoZQorCSAgIEJJT1NfQWRkcmVzcyBpcyAwLgorCSAqLworCUhvc3RBZGFwdGVyLT5CSU9TX0FkZHJlc3MgPSBFeHRlbmRlZFNldHVwSW5mb3JtYXRpb24uQklPU19BZGRyZXNzIDw8IDEyOworCS8qCisJICAgSVNBIEhvc3QgQWRhcHRlcnMgcmVxdWlyZSBCb3VuY2UgQnVmZmVycyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMTZNQiBtZW1vcnkuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPT0gQnVzTG9naWNfSVNBX0J1cyAmJiAodm9pZCAqKSBoaWdoX21lbW9yeSA+ICh2b2lkICopIE1BWF9ETUFfQUREUkVTUykKKwkJSG9zdEFkYXB0ZXItPkJvdW5jZUJ1ZmZlcnNSZXF1aXJlZCA9IHRydWU7CisJLyoKKwkgICBCdXNMb2dpYyBCVC00NDVTIEhvc3QgQWRhcHRlcnMgcHJpb3IgdG8gYm9hcmQgcmV2aXNpb24gRSBoYXZlIGEgaGFyZHdhcmUKKwkgICBidWcgd2hlcmVieSB3aGVuIHRoZSBCSU9TIGlzIGVuYWJsZWQsIHRyYW5zZmVycyB0by9mcm9tIHRoZSBzYW1lIGFkZHJlc3MKKwkgICByYW5nZSB0aGUgQklPUyBvY2N1cGllcyBtb2R1bG8gMTZNQiBhcmUgaGFuZGxlZCBpbmNvcnJlY3RseS4gIE9ubHkgcHJvcGVybHkKKwkgICBmdW5jdGlvbmluZyBCVC00NDVTIEhvc3QgQWRhcHRlcnMgaGF2ZSBmaXJtd2FyZSB2ZXJzaW9uIDMuMzcsIHNvIHJlcXVpcmUKKwkgICB0aGF0IElTQSBCb3VuY2UgQnVmZmVycyBiZSB1c2VkIGZvciB0aGUgYnVnZ3kgQlQtNDQ1UyBtb2RlbHMgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gMTZNQiBtZW1vcnkuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5CSU9TX0FkZHJlc3MgPiAwICYmIHN0cmNtcChIb3N0QWRhcHRlci0+TW9kZWxOYW1lLCAiQlQtNDQ1UyIpID09IDAgJiYgc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICIzLjM3IikgPCAwICYmICh2b2lkICopIGhpZ2hfbWVtb3J5ID4gKHZvaWQgKikgTUFYX0RNQV9BRERSRVNTKQorCQlIb3N0QWRhcHRlci0+Qm91bmNlQnVmZmVyc1JlcXVpcmVkID0gdHJ1ZTsKKwkvKgorCSAgIEluaXRpYWxpemUgcGFyYW1ldGVycyBjb21tb24gdG8gTXVsdGlNYXN0ZXIgYW5kIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycy4KKwkgKi8KKyAgICAgIENvbW1vbjoKKwkvKgorCSAgIEluaXRpYWxpemUgdGhlIEhvc3QgQWRhcHRlciBGdWxsIE1vZGVsIE5hbWUgZnJvbSB0aGUgTW9kZWwgTmFtZS4KKwkgKi8KKwlzdHJjcHkoSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUsICJCdXNMb2dpYyAiKTsKKwlzdHJjYXQoSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUsIEhvc3RBZGFwdGVyLT5Nb2RlbE5hbWUpOworCS8qCisJICAgU2VsZWN0IGFuIGFwcHJvcHJpYXRlIHZhbHVlIGZvciB0aGUgVGFnZ2VkIFF1ZXVlIERlcHRoIGVpdGhlciBmcm9tIGEKKwkgICBCdXNMb2dpYyBEcml2ZXIgT3B0aW9ucyBzcGVjaWZpY2F0aW9uLCBvciBiYXNlZCBvbiB3aGV0aGVyIHRoaXMgSG9zdAorCSAgIEFkYXB0ZXIgcmVxdWlyZXMgdGhhdCBJU0EgQm91bmNlIEJ1ZmZlcnMgYmUgdXNlZC4gIFRoZSBUYWdnZWQgUXVldWUgRGVwdGgKKwkgICBpcyBsZWZ0IGF0IDAgZm9yIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uIGluIEJ1c0xvZ2ljX1NlbGVjdFF1ZXVlRGVwdGhzLgorCSAgIEluaXRpYWxpemUgdGhlIFVudGFnZ2VkIFF1ZXVlIERlcHRoLgorCSAqLworCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJdW5zaWduZWQgY2hhciBRdWV1ZURlcHRoID0gMDsKKwkJaWYgKEhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zICE9IE5VTEwgJiYgSG9zdEFkYXB0ZXItPkRyaXZlck9wdGlvbnMtPlF1ZXVlRGVwdGhbVGFyZ2V0SURdID4gMCkKKwkJCVF1ZXVlRGVwdGggPSBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+UXVldWVEZXB0aFtUYXJnZXRJRF07CisJCWVsc2UgaWYgKEhvc3RBZGFwdGVyLT5Cb3VuY2VCdWZmZXJzUmVxdWlyZWQpCisJCQlRdWV1ZURlcHRoID0gQnVzTG9naWNfVGFnZ2VkUXVldWVEZXB0aEJCOworCQlIb3N0QWRhcHRlci0+UXVldWVEZXB0aFtUYXJnZXRJRF0gPSBRdWV1ZURlcHRoOworCX0KKwlpZiAoSG9zdEFkYXB0ZXItPkJvdW5jZUJ1ZmZlcnNSZXF1aXJlZCkKKwkJSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCA9IEJ1c0xvZ2ljX1VudGFnZ2VkUXVldWVEZXB0aEJCOworCWVsc2UKKwkJSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCA9IEJ1c0xvZ2ljX1VudGFnZ2VkUXVldWVEZXB0aDsKKwlpZiAoSG9zdEFkYXB0ZXItPkRyaXZlck9wdGlvbnMgIT0gTlVMTCkKKwkJSG9zdEFkYXB0ZXItPkNvbW1vblF1ZXVlRGVwdGggPSBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+Q29tbW9uUXVldWVEZXB0aDsKKwlpZiAoSG9zdEFkYXB0ZXItPkNvbW1vblF1ZXVlRGVwdGggPiAwICYmIEhvc3RBZGFwdGVyLT5Db21tb25RdWV1ZURlcHRoIDwgSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCkKKwkJSG9zdEFkYXB0ZXItPlVudGFnZ2VkUXVldWVEZXB0aCA9IEhvc3RBZGFwdGVyLT5Db21tb25RdWV1ZURlcHRoOworCS8qCisJICAgVGFnZ2VkIFF1ZXVpbmcgaXMgb25seSBhbGxvd2VkIGlmIERpc2Nvbm5lY3QvUmVjb25uZWN0IGlzIHBlcm1pdHRlZC4KKwkgICBUaGVyZWZvcmUsIG1hc2sgdGhlIFRhZ2dlZCBRdWV1aW5nIFBlcm1pdHRlZCBEZWZhdWx0IGJpdHMgd2l0aCB0aGUKKwkgICBEaXNjb25uZWN0L1JlY29ubmVjdCBQZXJtaXR0ZWQgYml0cy4KKwkgKi8KKwlIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmPSBIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZDsKKwkvKgorCSAgIENvbWJpbmUgdGhlIGRlZmF1bHQgVGFnZ2VkIFF1ZXVpbmcgUGVybWl0dGVkIGJpdHMgd2l0aCBhbnkgQnVzTG9naWMgRHJpdmVyCisJICAgT3B0aW9ucyBUYWdnZWQgUXVldWluZyBzcGVjaWZpY2F0aW9uLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyAhPSBOVUxMKQorCQlIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9CisJCSAgICAoSG9zdEFkYXB0ZXItPkRyaXZlck9wdGlvbnMtPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZE1hc2spIHwgKEhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkICYgfkhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkTWFzayk7CisKKwkvKgorCSAgIFNlbGVjdCBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgQnVzIFNldHRsZSBUaW1lIGVpdGhlciBmcm9tIGEgQnVzTG9naWMKKwkgICBEcml2ZXIgT3B0aW9ucyBzcGVjaWZpY2F0aW9uLCBvciBmcm9tIEJ1c0xvZ2ljX0RlZmF1bHRCdXNTZXR0bGVUaW1lLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyAhPSBOVUxMICYmIEhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zLT5CdXNTZXR0bGVUaW1lID4gMCkKKwkJSG9zdEFkYXB0ZXItPkJ1c1NldHRsZVRpbWUgPSBIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucy0+QnVzU2V0dGxlVGltZTsKKwllbHNlCisJCUhvc3RBZGFwdGVyLT5CdXNTZXR0bGVUaW1lID0gQnVzTG9naWNfRGVmYXVsdEJ1c1NldHRsZVRpbWU7CisJLyoKKwkgICBJbmRpY2F0ZSByZWFkaW5nIHRoZSBIb3N0IEFkYXB0ZXIgQ29uZmlndXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworCXJldHVybiB0cnVlOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1JlcG9ydEhvc3RBZGFwdGVyQ29uZmlndXJhdGlvbiByZXBvcnRzIHRoZSBjb25maWd1cmF0aW9uIG9mCisgIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBib29sZWFuIF9faW5pdCBCdXNMb2dpY19SZXBvcnRIb3N0QWRhcHRlckNvbmZpZ3VyYXRpb24oc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkJICAgICAgKkhvc3RBZGFwdGVyKQoreworCXVuc2lnbmVkIHNob3J0IEFsbFRhcmdldHNNYXNrID0gKDEgPDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXMpIC0gMTsKKwl1bnNpZ25lZCBzaG9ydCBTeW5jaHJvbm91c1Blcm1pdHRlZCwgRmFzdFBlcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBVbHRyYVBlcm1pdHRlZCwgV2lkZVBlcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBEaXNjb25uZWN0UGVybWl0dGVkLCBUYWdnZWRRdWV1aW5nUGVybWl0dGVkOworCWJvb2xlYW4gQ29tbW9uU3luY2hyb25vdXNOZWdvdGlhdGlvbiwgQ29tbW9uVGFnZ2VkUXVldWVEZXB0aDsKKwljaGFyIFN5bmNocm9ub3VzU3RyaW5nW0J1c0xvZ2ljX01heFRhcmdldERldmljZXMgKyAxXTsKKwljaGFyIFdpZGVTdHJpbmdbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlcyArIDFdOworCWNoYXIgRGlzY29ubmVjdFN0cmluZ1tCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzICsgMV07CisJY2hhciBUYWdnZWRRdWV1aW5nU3RyaW5nW0J1c0xvZ2ljX01heFRhcmdldERldmljZXMgKyAxXTsKKwljaGFyICpTeW5jaHJvbm91c01lc3NhZ2UgPSBTeW5jaHJvbm91c1N0cmluZzsKKwljaGFyICpXaWRlTWVzc2FnZSA9IFdpZGVTdHJpbmc7CisJY2hhciAqRGlzY29ubmVjdE1lc3NhZ2UgPSBEaXNjb25uZWN0U3RyaW5nOworCWNoYXIgKlRhZ2dlZFF1ZXVpbmdNZXNzYWdlID0gVGFnZ2VkUXVldWluZ1N0cmluZzsKKwlpbnQgVGFyZ2V0SUQ7CisJQnVzTG9naWNfSW5mbygiQ29uZmlndXJpbmcgQnVzTG9naWMgTW9kZWwgJXMgJXMlcyVzJXMgU0NTSSBIb3N0IEFkYXB0ZXJcbiIsCisJCSAgICAgIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+TW9kZWxOYW1lLAorCQkgICAgICBCdXNMb2dpY19Ib3N0QWRhcHRlckJ1c05hbWVzW0hvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGVdLCAoSG9zdEFkYXB0ZXItPkhvc3RXaWRlU0NTSSA/ICIgV2lkZSIgOiAiIiksIChIb3N0QWRhcHRlci0+SG9zdERpZmZlcmVudGlhbFNDU0kgPyAiIERpZmZlcmVudGlhbCIgOiAiIiksIChIb3N0QWRhcHRlci0+SG9zdFVsdHJhU0NTSSA/ICIgVWx0cmEiIDogIiIpKTsKKwlCdXNMb2dpY19JbmZvKCIgIEZpcm13YXJlIFZlcnNpb246ICVzLCBJL08gQWRkcmVzczogMHglWCwgIiAiSVJRIENoYW5uZWw6ICVkLyVzXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCwgKEhvc3RBZGFwdGVyLT5MZXZlbFNlbnNpdGl2ZUludGVycnVwdCA/ICJMZXZlbCIgOiAiRWRnZSIpKTsKKwlpZiAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQnVzVHlwZSAhPSBCdXNMb2dpY19QQ0lfQnVzKSB7CisJCUJ1c0xvZ2ljX0luZm8oIiAgRE1BIENoYW5uZWw6ICIsIEhvc3RBZGFwdGVyKTsKKwkJaWYgKEhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCA+IDApCisJCQlCdXNMb2dpY19JbmZvKCIlZCwgIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCk7CisJCWVsc2UKKwkJCUJ1c0xvZ2ljX0luZm8oIk5vbmUsICIsIEhvc3RBZGFwdGVyKTsKKwkJaWYgKEhvc3RBZGFwdGVyLT5CSU9TX0FkZHJlc3MgPiAwKQorCQkJQnVzTG9naWNfSW5mbygiQklPUyBBZGRyZXNzOiAweCVYLCAiLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkJJT1NfQWRkcmVzcyk7CisJCWVsc2UKKwkJCUJ1c0xvZ2ljX0luZm8oIkJJT1MgQWRkcmVzczogTm9uZSwgIiwgSG9zdEFkYXB0ZXIpOworCX0gZWxzZSB7CisJCUJ1c0xvZ2ljX0luZm8oIiAgUENJIEJ1czogJWQsIERldmljZTogJWQsIEFkZHJlc3M6ICIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+QnVzLCBIb3N0QWRhcHRlci0+RGV2aWNlKTsKKwkJaWYgKEhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyA+IDApCisJCQlCdXNMb2dpY19JbmZvKCIweCVYLCAiLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPlBDSV9BZGRyZXNzKTsKKwkJZWxzZQorCQkJQnVzTG9naWNfSW5mbygiVW5hc3NpZ25lZCwgIiwgSG9zdEFkYXB0ZXIpOworCX0KKwlCdXNMb2dpY19JbmZvKCJIb3N0IEFkYXB0ZXIgU0NTSSBJRDogJWRcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+U0NTSV9JRCk7CisJQnVzTG9naWNfSW5mbygiICBQYXJpdHkgQ2hlY2tpbmc6ICVzLCBFeHRlbmRlZCBUcmFuc2xhdGlvbjogJXNcbiIsIEhvc3RBZGFwdGVyLCAoSG9zdEFkYXB0ZXItPlBhcml0eUNoZWNraW5nRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpLCAoSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikpOworCUFsbFRhcmdldHNNYXNrICY9IH4oMSA8PCBIb3N0QWRhcHRlci0+U0NTSV9JRCk7CisJU3luY2hyb25vdXNQZXJtaXR0ZWQgPSBIb3N0QWRhcHRlci0+U3luY2hyb25vdXNQZXJtaXR0ZWQgJiBBbGxUYXJnZXRzTWFzazsKKwlGYXN0UGVybWl0dGVkID0gSG9zdEFkYXB0ZXItPkZhc3RQZXJtaXR0ZWQgJiBBbGxUYXJnZXRzTWFzazsKKwlVbHRyYVBlcm1pdHRlZCA9IEhvc3RBZGFwdGVyLT5VbHRyYVBlcm1pdHRlZCAmIEFsbFRhcmdldHNNYXNrOworCWlmICgoQnVzTG9naWNfTXVsdGlNYXN0ZXJIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpICYmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID49ICc0JyB8fCBIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJCdXNUeXBlID09IEJ1c0xvZ2ljX0VJU0FfQnVzKSkgfHwgQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJQ29tbW9uU3luY2hyb25vdXNOZWdvdGlhdGlvbiA9IGZhbHNlOworCQlpZiAoU3luY2hyb25vdXNQZXJtaXR0ZWQgPT0gMCkgeworCQkJU3luY2hyb25vdXNNZXNzYWdlID0gIkRpc2FibGVkIjsKKwkJCUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24gPSB0cnVlOworCQl9IGVsc2UgaWYgKFN5bmNocm9ub3VzUGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKSB7CisJCQlpZiAoRmFzdFBlcm1pdHRlZCA9PSAwKSB7CisJCQkJU3luY2hyb25vdXNNZXNzYWdlID0gIlNsb3ciOworCQkJCUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24gPSB0cnVlOworCQkJfSBlbHNlIGlmIChGYXN0UGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKSB7CisJCQkJaWYgKFVsdHJhUGVybWl0dGVkID09IDApIHsKKwkJCQkJU3luY2hyb25vdXNNZXNzYWdlID0gIkZhc3QiOworCQkJCQlDb21tb25TeW5jaHJvbm91c05lZ290aWF0aW9uID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKFVsdHJhUGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKSB7CisJCQkJCVN5bmNocm9ub3VzTWVzc2FnZSA9ICJVbHRyYSI7CisJCQkJCUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24gPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIUNvbW1vblN5bmNocm9ub3VzTmVnb3RpYXRpb24pIHsKKwkJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKQorCQkJCVN5bmNocm9ub3VzU3RyaW5nW1RhcmdldElEXSA9ICgoIShTeW5jaHJvbm91c1Blcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkpID8gJ04nIDogKCEoRmFzdFBlcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkgPyAnUycgOiAoIShVbHRyYVBlcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkgPyAnRicgOiAnVScpKSk7CisJCQlTeW5jaHJvbm91c1N0cmluZ1tIb3N0QWRhcHRlci0+U0NTSV9JRF0gPSAnIyc7CisJCQlTeW5jaHJvbm91c1N0cmluZ1tIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlc10gPSAnXDAnOworCQl9CisJfSBlbHNlCisJCVN5bmNocm9ub3VzTWVzc2FnZSA9IChTeW5jaHJvbm91c1Blcm1pdHRlZCA9PSAwID8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7CisJV2lkZVBlcm1pdHRlZCA9IEhvc3RBZGFwdGVyLT5XaWRlUGVybWl0dGVkICYgQWxsVGFyZ2V0c01hc2s7CisJaWYgKFdpZGVQZXJtaXR0ZWQgPT0gMCkKKwkJV2lkZU1lc3NhZ2UgPSAiRGlzYWJsZWQiOworCWVsc2UgaWYgKFdpZGVQZXJtaXR0ZWQgPT0gQWxsVGFyZ2V0c01hc2spCisJCVdpZGVNZXNzYWdlID0gIkVuYWJsZWQiOworCWVsc2UgeworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCVdpZGVTdHJpbmdbVGFyZ2V0SURdID0gKChXaWRlUGVybWl0dGVkICYgKDEgPDwgVGFyZ2V0SUQpKSA/ICdZJyA6ICdOJyk7CisJCVdpZGVTdHJpbmdbSG9zdEFkYXB0ZXItPlNDU0lfSURdID0gJyMnOworCQlXaWRlU3RyaW5nW0hvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzXSA9ICdcMCc7CisJfQorCURpc2Nvbm5lY3RQZXJtaXR0ZWQgPSBIb3N0QWRhcHRlci0+RGlzY29ubmVjdFBlcm1pdHRlZCAmIEFsbFRhcmdldHNNYXNrOworCWlmIChEaXNjb25uZWN0UGVybWl0dGVkID09IDApCisJCURpc2Nvbm5lY3RNZXNzYWdlID0gIkRpc2FibGVkIjsKKwllbHNlIGlmIChEaXNjb25uZWN0UGVybWl0dGVkID09IEFsbFRhcmdldHNNYXNrKQorCQlEaXNjb25uZWN0TWVzc2FnZSA9ICJFbmFibGVkIjsKKwllbHNlIHsKKwkJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspCisJCQlEaXNjb25uZWN0U3RyaW5nW1RhcmdldElEXSA9ICgoRGlzY29ubmVjdFBlcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkgPyAnWScgOiAnTicpOworCQlEaXNjb25uZWN0U3RyaW5nW0hvc3RBZGFwdGVyLT5TQ1NJX0lEXSA9ICcjJzsKKwkJRGlzY29ubmVjdFN0cmluZ1tIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlc10gPSAnXDAnOworCX0KKwlUYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiBBbGxUYXJnZXRzTWFzazsKKwlpZiAoVGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9PSAwKQorCQlUYWdnZWRRdWV1aW5nTWVzc2FnZSA9ICJEaXNhYmxlZCI7CisJZWxzZSBpZiAoVGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9PSBBbGxUYXJnZXRzTWFzaykKKwkJVGFnZ2VkUXVldWluZ01lc3NhZ2UgPSAiRW5hYmxlZCI7CisJZWxzZSB7CisJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKQorCQkJVGFnZ2VkUXVldWluZ1N0cmluZ1tUYXJnZXRJRF0gPSAoKFRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiAoMSA8PCBUYXJnZXRJRCkpID8gJ1knIDogJ04nKTsKKwkJVGFnZ2VkUXVldWluZ1N0cmluZ1tIb3N0QWRhcHRlci0+U0NTSV9JRF0gPSAnIyc7CisJCVRhZ2dlZFF1ZXVpbmdTdHJpbmdbSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXNdID0gJ1wwJzsKKwl9CisJQnVzTG9naWNfSW5mbygiICBTeW5jaHJvbm91cyBOZWdvdGlhdGlvbjogJXMsIFdpZGUgTmVnb3RpYXRpb246ICVzXG4iLCBIb3N0QWRhcHRlciwgU3luY2hyb25vdXNNZXNzYWdlLCBXaWRlTWVzc2FnZSk7CisJQnVzTG9naWNfSW5mbygiICBEaXNjb25uZWN0L1JlY29ubmVjdDogJXMsIFRhZ2dlZCBRdWV1aW5nOiAlc1xuIiwgSG9zdEFkYXB0ZXIsIERpc2Nvbm5lY3RNZXNzYWdlLCBUYWdnZWRRdWV1aW5nTWVzc2FnZSk7CisJaWYgKEJ1c0xvZ2ljX011bHRpTWFzdGVySG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkgeworCQlCdXNMb2dpY19JbmZvKCIgIFNjYXR0ZXIvR2F0aGVyIExpbWl0OiAlZCBvZiAlZCBzZWdtZW50cywgIiAiTWFpbGJveGVzOiAlZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5Ecml2ZXJTY2F0dGVyR2F0aGVyTGltaXQsIEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlclNjYXR0ZXJHYXRoZXJMaW1pdCwgSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudCk7CisJCUJ1c0xvZ2ljX0luZm8oIiAgRHJpdmVyIFF1ZXVlIERlcHRoOiAlZCwgIiAiSG9zdCBBZGFwdGVyIFF1ZXVlIERlcHRoOiAlZFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5Ecml2ZXJRdWV1ZURlcHRoLCBIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJRdWV1ZURlcHRoKTsKKwl9IGVsc2UKKwkJQnVzTG9naWNfSW5mbygiICBEcml2ZXIgUXVldWUgRGVwdGg6ICVkLCAiICJTY2F0dGVyL0dhdGhlciBMaW1pdDogJWQgc2VnbWVudHNcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCwgSG9zdEFkYXB0ZXItPkRyaXZlclNjYXR0ZXJHYXRoZXJMaW1pdCk7CisJQnVzTG9naWNfSW5mbygiICBUYWdnZWQgUXVldWUgRGVwdGg6ICIsIEhvc3RBZGFwdGVyKTsKKwlDb21tb25UYWdnZWRRdWV1ZURlcHRoID0gdHJ1ZTsKKwlmb3IgKFRhcmdldElEID0gMTsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJaWYgKEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXSAhPSBIb3N0QWRhcHRlci0+UXVldWVEZXB0aFswXSkgeworCQkJQ29tbW9uVGFnZ2VkUXVldWVEZXB0aCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwlpZiAoQ29tbW9uVGFnZ2VkUXVldWVEZXB0aCkgeworCQlpZiAoSG9zdEFkYXB0ZXItPlF1ZXVlRGVwdGhbMF0gPiAwKQorCQkJQnVzTG9naWNfSW5mbygiJWQiLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPlF1ZXVlRGVwdGhbMF0pOworCQllbHNlCisJCQlCdXNMb2dpY19JbmZvKCJBdXRvbWF0aWMiLCBIb3N0QWRhcHRlcik7CisJfSBlbHNlCisJCUJ1c0xvZ2ljX0luZm8oIkluZGl2aWR1YWwiLCBIb3N0QWRhcHRlcik7CisJQnVzTG9naWNfSW5mbygiLCBVbnRhZ2dlZCBRdWV1ZSBEZXB0aDogJWRcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+VW50YWdnZWRRdWV1ZURlcHRoKTsKKwlpZiAoSG9zdEFkYXB0ZXItPlRlcm1pbmF0aW9uSW5mb1ZhbGlkKSB7CisJCWlmIChIb3N0QWRhcHRlci0+SG9zdFdpZGVTQ1NJKQorCQkJQnVzTG9naWNfSW5mbygiICBTQ1NJIEJ1cyBUZXJtaW5hdGlvbjogJXMiLCBIb3N0QWRhcHRlciwgKEhvc3RBZGFwdGVyLT5Mb3dCeXRlVGVybWluYXRlZCA/IChIb3N0QWRhcHRlci0+SGlnaEJ5dGVUZXJtaW5hdGVkID8gIkJvdGggRW5hYmxlZCIgOiAiTG93IEVuYWJsZWQiKQorCQkJCQkJCQkJCSAgOiAoSG9zdEFkYXB0ZXItPkhpZ2hCeXRlVGVybWluYXRlZCA/ICJIaWdoIEVuYWJsZWQiIDogIkJvdGggRGlzYWJsZWQiKSkpOworCQllbHNlCisJCQlCdXNMb2dpY19JbmZvKCIgIFNDU0kgQnVzIFRlcm1pbmF0aW9uOiAlcyIsIEhvc3RBZGFwdGVyLCAoSG9zdEFkYXB0ZXItPkxvd0J5dGVUZXJtaW5hdGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikpOworCQlpZiAoSG9zdEFkYXB0ZXItPkhvc3RTdXBwb3J0c1NDQU0pCisJCQlCdXNMb2dpY19JbmZvKCIsIFNDQU06ICVzIiwgSG9zdEFkYXB0ZXIsIChIb3N0QWRhcHRlci0+U0NBTV9FbmFibGVkID8gKEhvc3RBZGFwdGVyLT5TQ0FNX0xldmVsMiA/ICJFbmFibGVkLCBMZXZlbCAyIiA6ICJFbmFibGVkLCBMZXZlbCAxIikKKwkJCQkJCQkJICA6ICJEaXNhYmxlZCIpKTsKKwkJQnVzTG9naWNfSW5mbygiXG4iLCBIb3N0QWRhcHRlcik7CisJfQorCS8qCisJICAgSW5kaWNhdGUgcmVwb3J0aW5nIHRoZSBIb3N0IEFkYXB0ZXIgY29uZmlndXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworCXJldHVybiB0cnVlOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX0FjcXVpcmVSZXNvdXJjZXMgYWNxdWlyZXMgdGhlIHN5c3RlbSByZXNvdXJjZXMgbmVjZXNzYXJ5IHRvIHVzZQorICBIb3N0IEFkYXB0ZXIuCisqLworCitzdGF0aWMgYm9vbGVhbiBfX2luaXQgQnVzTG9naWNfQWNxdWlyZVJlc291cmNlcyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCWlmIChIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPT0gMCkgeworCQlCdXNMb2dpY19FcnJvcigiTk8gTEVHQUwgSU5URVJSVVBUIENIQU5ORUwgQVNTSUdORUQgLSBERVRBQ0hJTkdcbiIsIEhvc3RBZGFwdGVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKgorCSAgIEFjcXVpcmUgc2hhcmVkIGFjY2VzcyB0byB0aGUgSVJRIENoYW5uZWwuCisJICovCisJaWYgKHJlcXVlc3RfaXJxKEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCwgQnVzTG9naWNfSW50ZXJydXB0SGFuZGxlciwgU0FfU0hJUlEsIEhvc3RBZGFwdGVyLT5GdWxsTW9kZWxOYW1lLCBIb3N0QWRhcHRlcikgPCAwKSB7CisJCUJ1c0xvZ2ljX0Vycm9yKCJVTkFCTEUgVE8gQUNRVUlSRSBJUlEgQ0hBTk5FTCAlZCAtIERFVEFDSElOR1xuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5JUlFfQ2hhbm5lbCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsQWNxdWlyZWQgPSB0cnVlOworCS8qCisJICAgQWNxdWlyZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBETUEgQ2hhbm5lbC4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsID4gMCkgeworCQlpZiAocmVxdWVzdF9kbWEoSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsLCBIb3N0QWRhcHRlci0+RnVsbE1vZGVsTmFtZSkgPCAwKSB7CisJCQlCdXNMb2dpY19FcnJvcigiVU5BQkxFIFRPIEFDUVVJUkUgRE1BIENIQU5ORUwgJWQgLSBERVRBQ0hJTkdcbiIsIEhvc3RBZGFwdGVyLCBIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWwpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXNldF9kbWFfbW9kZShIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWwsIERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKEhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbCk7CisJCUhvc3RBZGFwdGVyLT5ETUFfQ2hhbm5lbEFjcXVpcmVkID0gdHJ1ZTsKKwl9CisJLyoKKwkgICBJbmRpY2F0ZSB0aGUgU3lzdGVtIFJlc291cmNlIEFjcXVpc2l0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisJICovCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoKKyAgQnVzTG9naWNfUmVsZWFzZVJlc291cmNlcyByZWxlYXNlcyBhbnkgc3lzdGVtIHJlc291cmNlcyBwcmV2aW91c2x5IGFjcXVpcmVkCisgIGJ5IEJ1c0xvZ2ljX0FjcXVpcmVSZXNvdXJjZXMuCisqLworCitzdGF0aWMgdm9pZCBCdXNMb2dpY19SZWxlYXNlUmVzb3VyY2VzKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJLyoKKwkgICBSZWxlYXNlIHNoYXJlZCBhY2Nlc3MgdG8gdGhlIElSUSBDaGFubmVsLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWxBY3F1aXJlZCkKKwkJZnJlZV9pcnEoSG9zdEFkYXB0ZXItPklSUV9DaGFubmVsLCBIb3N0QWRhcHRlcik7CisJLyoKKwkgICBSZWxlYXNlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIERNQSBDaGFubmVsLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RE1BX0NoYW5uZWxBY3F1aXJlZCkKKwkJZnJlZV9kbWEoSG9zdEFkYXB0ZXItPkRNQV9DaGFubmVsKTsKKwkvKgorCSAgIFJlbGVhc2UgYW55IGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0cyBub3QgcmVsZWFzZWQgZWxzZXdoZXJlCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5NYWlsYm94U3BhY2UpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIEhvc3RBZGFwdGVyLT5NYWlsYm94U2l6ZSwgSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZSwgSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZUhhbmRsZSk7CisJSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZSA9IE5VTEw7CisJSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZUhhbmRsZSA9IDA7CisJSG9zdEFkYXB0ZXItPk1haWxib3hTaXplID0gMDsKK30KKworCisvKgorICBCdXNMb2dpY19Jbml0aWFsaXplSG9zdEFkYXB0ZXIgaW5pdGlhbGl6ZXMgSG9zdCBBZGFwdGVyLiAgVGhpcyBpcyB0aGUgb25seQorICBmdW5jdGlvbiBjYWxsZWQgZHVyaW5nIFNDU0kgSG9zdCBBZGFwdGVyIGRldGVjdGlvbiB3aGljaCBtb2RpZmllcyB0aGUgc3RhdGUKKyAgb2YgdGhlIEhvc3QgQWRhcHRlciBmcm9tIGl0cyBpbml0aWFsIHBvd2VyIG9uIG9yIGhhcmQgcmVzZXQgc3RhdGUuCisqLworCitzdGF0aWMgYm9vbGVhbiBCdXNMb2dpY19Jbml0aWFsaXplSG9zdEFkYXB0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCSAgICAgICpIb3N0QWRhcHRlcikKK3sKKwlzdHJ1Y3QgQnVzTG9naWNfRXh0ZW5kZWRNYWlsYm94UmVxdWVzdCBFeHRlbmRlZE1haWxib3hSZXF1ZXN0OworCWVudW0gQnVzTG9naWNfUm91bmRSb2Jpbk1vZGVSZXF1ZXN0IFJvdW5kUm9iaW5Nb2RlUmVxdWVzdDsKKwllbnVtIEJ1c0xvZ2ljX1NldENDQkZvcm1hdFJlcXVlc3QgU2V0Q0NCRm9ybWF0UmVxdWVzdDsKKwlpbnQgVGFyZ2V0SUQ7CisJLyoKKwkgICBJbml0aWFsaXplIHRoZSBwb2ludGVycyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgQ0NCcyB0aGF0IGFyZSBxdWV1ZWQgZm9yCisJICAgY29tcGxldGlvbiBwcm9jZXNzaW5nLgorCSAqLworCUhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQiA9IE5VTEw7CisJSG9zdEFkYXB0ZXItPkxhc3RDb21wbGV0ZWRDQ0IgPSBOVUxMOworCS8qCisJICAgSW5pdGlhbGl6ZSB0aGUgQnVzIERldmljZSBSZXNldCBQZW5kaW5nIENDQiwgVGFnZ2VkIFF1ZXVpbmcgQWN0aXZlLAorCSAgIENvbW1hbmQgU3VjY2Vzc2Z1bCBGbGFnLCBBY3RpdmUgQ29tbWFuZHMsIGFuZCBDb21tYW5kcyBTaW5jZSBSZXNldAorCSAgIGZvciBlYWNoIFRhcmdldCBEZXZpY2UuCisJICovCisJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJSG9zdEFkYXB0ZXItPkJ1c0RldmljZVJlc2V0UGVuZGluZ0NDQltUYXJnZXRJRF0gPSBOVUxMOworCQlIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdLlRhZ2dlZFF1ZXVpbmdBY3RpdmUgPSBmYWxzZTsKKwkJSG9zdEFkYXB0ZXItPlRhcmdldEZsYWdzW1RhcmdldElEXS5Db21tYW5kU3VjY2Vzc2Z1bEZsYWcgPSBmYWxzZTsKKwkJSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSA9IDA7CisJCUhvc3RBZGFwdGVyLT5Db21tYW5kc1NpbmNlUmVzZXRbVGFyZ2V0SURdID0gMDsKKwl9CisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgZG8gbm90IHVzZSBPdXRnb2luZyBhbmQgSW5jb21pbmcgTWFpbGJveGVzLgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJZ290byBEb25lOworCS8qCisJICAgSW5pdGlhbGl6ZSB0aGUgT3V0Z29pbmcgYW5kIEluY29taW5nIE1haWxib3ggcG9pbnRlcnMuCisJICovCisJSG9zdEFkYXB0ZXItPk1haWxib3hTaXplID0gSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudCAqIChzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX091dGdvaW5nTWFpbGJveCkgKyBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveCkpOworCUhvc3RBZGFwdGVyLT5NYWlsYm94U3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChIb3N0QWRhcHRlci0+UENJX0RldmljZSwgSG9zdEFkYXB0ZXItPk1haWxib3hTaXplLCAmSG9zdEFkYXB0ZXItPk1haWxib3hTcGFjZUhhbmRsZSk7CisJaWYgKEhvc3RBZGFwdGVyLT5NYWlsYm94U3BhY2UgPT0gTlVMTCkKKwkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJNQUlMQk9YIEFMTE9DQVRJT04iKTsKKwlIb3N0QWRhcHRlci0+Rmlyc3RPdXRnb2luZ01haWxib3ggPSAoc3RydWN0IEJ1c0xvZ2ljX091dGdvaW5nTWFpbGJveCAqKSBIb3N0QWRhcHRlci0+TWFpbGJveFNwYWNlOworCUhvc3RBZGFwdGVyLT5MYXN0T3V0Z29pbmdNYWlsYm94ID0gSG9zdEFkYXB0ZXItPkZpcnN0T3V0Z29pbmdNYWlsYm94ICsgSG9zdEFkYXB0ZXItPk1haWxib3hDb3VudCAtIDE7CisJSG9zdEFkYXB0ZXItPk5leHRPdXRnb2luZ01haWxib3ggPSBIb3N0QWRhcHRlci0+Rmlyc3RPdXRnb2luZ01haWxib3g7CisJSG9zdEFkYXB0ZXItPkZpcnN0SW5jb21pbmdNYWlsYm94ID0gKHN0cnVjdCBCdXNMb2dpY19JbmNvbWluZ01haWxib3ggKikgKEhvc3RBZGFwdGVyLT5MYXN0T3V0Z29pbmdNYWlsYm94ICsgMSk7CisJSG9zdEFkYXB0ZXItPkxhc3RJbmNvbWluZ01haWxib3ggPSBIb3N0QWRhcHRlci0+Rmlyc3RJbmNvbWluZ01haWxib3ggKyBIb3N0QWRhcHRlci0+TWFpbGJveENvdW50IC0gMTsKKwlIb3N0QWRhcHRlci0+TmV4dEluY29taW5nTWFpbGJveCA9IEhvc3RBZGFwdGVyLT5GaXJzdEluY29taW5nTWFpbGJveDsKKworCS8qCisJICAgSW5pdGlhbGl6ZSB0aGUgT3V0Z29pbmcgYW5kIEluY29taW5nIE1haWxib3ggc3RydWN0dXJlcy4KKwkgKi8KKwltZW1zZXQoSG9zdEFkYXB0ZXItPkZpcnN0T3V0Z29pbmdNYWlsYm94LCAwLCBIb3N0QWRhcHRlci0+TWFpbGJveENvdW50ICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3gpKTsKKwltZW1zZXQoSG9zdEFkYXB0ZXItPkZpcnN0SW5jb21pbmdNYWlsYm94LCAwLCBIb3N0QWRhcHRlci0+TWFpbGJveENvdW50ICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19JbmNvbWluZ01haWxib3gpKTsKKwkvKgorCSAgIEluaXRpYWxpemUgdGhlIEhvc3QgQWRhcHRlcidzIFBvaW50ZXIgdG8gdGhlIE91dGdvaW5nL0luY29taW5nIE1haWxib3hlcy4KKwkgKi8KKwlFeHRlbmRlZE1haWxib3hSZXF1ZXN0Lk1haWxib3hDb3VudCA9IEhvc3RBZGFwdGVyLT5NYWlsYm94Q291bnQ7CisJRXh0ZW5kZWRNYWlsYm94UmVxdWVzdC5CYXNlTWFpbGJveEFkZHJlc3MgPSAodTMyKSBIb3N0QWRhcHRlci0+TWFpbGJveFNwYWNlSGFuZGxlOworCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19Jbml0aWFsaXplRXh0ZW5kZWRNYWlsYm94LCAmRXh0ZW5kZWRNYWlsYm94UmVxdWVzdCwgc2l6ZW9mKEV4dGVuZGVkTWFpbGJveFJlcXVlc3QpLCBOVUxMLCAwKSA8IDApCisJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiTUFJTEJPWCBJTklUSUFMSVpBVElPTiIpOworCS8qCisJICAgRW5hYmxlIFN0cmljdCBSb3VuZCBSb2JpbiBNb2RlIGlmIHN1cHBvcnRlZCBieSB0aGUgSG9zdCBBZGFwdGVyLiAgSW4KKwkgICBTdHJpY3QgUm91bmQgUm9iaW4gTW9kZSwgdGhlIEhvc3QgQWRhcHRlciBvbmx5IGxvb2tzIGF0IHRoZSBuZXh0IE91dGdvaW5nCisJICAgTWFpbGJveCBmb3IgZWFjaCBuZXcgY29tbWFuZCwgcmF0aGVyIHRoYW4gc2Nhbm5pbmcgdGhyb3VnaCBhbGwgdGhlCisJICAgT3V0Z29pbmcgTWFpbGJveGVzIHRvIGZpbmQgYW55IHRoYXQgaGF2ZSBuZXcgY29tbWFuZHMgaW4gdGhlbS4gIFN0cmljdAorCSAgIFJvdW5kIFJvYmluIE1vZGUgaXMgc2lnbmlmaWNhbnRseSBtb3JlIGVmZmljaWVudC4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPlN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydCkgeworCQlSb3VuZFJvYmluTW9kZVJlcXVlc3QgPSBCdXNMb2dpY19TdHJpY3RSb3VuZFJvYmluTW9kZTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0VuYWJsZVN0cmljdFJvdW5kUm9iaW5Nb2RlLCAmUm91bmRSb2Jpbk1vZGVSZXF1ZXN0LCBzaXplb2YoUm91bmRSb2Jpbk1vZGVSZXF1ZXN0KSwgTlVMTCwgMCkgPCAwKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJFTkFCTEUgU1RSSUNUIFJPVU5EIFJPQklOIE1PREUiKTsKKwl9CisJLyoKKwkgICBGb3IgSG9zdCBBZGFwdGVycyB0aGF0IHN1cHBvcnQgRXh0ZW5kZWQgTFVOIEZvcm1hdCBDQ0JzLCBpc3N1ZSB0aGUgU2V0IENDQgorCSAgIEZvcm1hdCBjb21tYW5kIHRvIGFsbG93IDMyIExvZ2ljYWwgVW5pdHMgcGVyIFRhcmdldCBEZXZpY2UuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5FeHRlbmRlZExVTlN1cHBvcnQpIHsKKwkJU2V0Q0NCRm9ybWF0UmVxdWVzdCA9IEJ1c0xvZ2ljX0V4dGVuZGVkTFVORm9ybWF0Q0NCOworCQlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfU2V0Q0NCRm9ybWF0LCAmU2V0Q0NCRm9ybWF0UmVxdWVzdCwgc2l6ZW9mKFNldENDQkZvcm1hdFJlcXVlc3QpLCBOVUxMLCAwKSA8IDApCisJCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIlNFVCBDQ0IgRk9STUFUIik7CisJfQorCS8qCisJICAgQW5ub3VuY2UgU3VjY2Vzc2Z1bCBJbml0aWFsaXphdGlvbi4KKwkgKi8KKyAgICAgIERvbmU6CisJaWYgKCFIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJJbml0aWFsaXplZCkgeworCQlCdXNMb2dpY19JbmZvKCIqKiogJXMgSW5pdGlhbGl6ZWQgU3VjY2Vzc2Z1bGx5ICoqKlxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyLT5GdWxsTW9kZWxOYW1lKTsKKwkJQnVzTG9naWNfSW5mbygiXG4iLCBIb3N0QWRhcHRlcik7CisJfSBlbHNlCisJCUJ1c0xvZ2ljX1dhcm5pbmcoIioqKiAlcyBJbml0aWFsaXplZCBTdWNjZXNzZnVsbHkgKioqXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckluaXRpYWxpemVkID0gdHJ1ZTsKKwkvKgorCSAgIEluZGljYXRlIHRoZSBIb3N0IEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKgorICBCdXNMb2dpY19UYXJnZXREZXZpY2VJbnF1aXJ5IGlucXVpcmVzIGFib3V0IHRoZSBUYXJnZXQgRGV2aWNlcyBhY2Nlc3NpYmxlCisgIHRocm91Z2ggSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIGJvb2xlYW4gX19pbml0IEJ1c0xvZ2ljX1RhcmdldERldmljZUlucXVpcnkoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkgICAqSG9zdEFkYXB0ZXIpCit7CisJdTE2IEluc3RhbGxlZERldmljZXM7CisJdTggSW5zdGFsbGVkRGV2aWNlc0lEMHRvN1s4XTsKKwlzdHJ1Y3QgQnVzTG9naWNfU2V0dXBJbmZvcm1hdGlvbiBTZXR1cEluZm9ybWF0aW9uOworCXU4IFN5bmNocm9ub3VzUGVyaW9kW0J1c0xvZ2ljX01heFRhcmdldERldmljZXNdOworCXVuc2lnbmVkIGNoYXIgUmVxdWVzdGVkUmVwbHlMZW5ndGg7CisJaW50IFRhcmdldElEOworCS8qCisJICAgV2FpdCBhIGZldyBzZWNvbmRzIGJldHdlZW4gdGhlIEhvc3QgQWRhcHRlciBIYXJkIFJlc2V0IHdoaWNoIGluaXRpYXRlcworCSAgIGEgU0NTSSBCdXMgUmVzZXQgYW5kIGlzc3VpbmcgYW55IFNDU0kgQ29tbWFuZHMuICBTb21lIFNDU0kgZGV2aWNlcyBnZXQKKwkgICBjb25mdXNlZCBpZiB0aGV5IHJlY2VpdmUgU0NTSSBDb21tYW5kcyB0b28gc29vbiBhZnRlciBhIFNDU0kgQnVzIFJlc2V0LgorCSAqLworCUJ1c0xvZ2ljX0RlbGF5KEhvc3RBZGFwdGVyLT5CdXNTZXR0bGVUaW1lKTsKKwkvKgorCSAgIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBkbyBub3QgcHJvdmlkZSBmb3IgVGFyZ2V0IERldmljZSBJbnF1aXJ5LgorCSAqLworCWlmIChCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJcmV0dXJuIHRydWU7CisJLyoKKwkgICBJbmhpYml0IHRoZSBUYXJnZXQgRGV2aWNlIElucXVpcnkgaWYgcmVxdWVzdGVkLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyAhPSBOVUxMICYmIEhvc3RBZGFwdGVyLT5Ecml2ZXJPcHRpb25zLT5Mb2NhbE9wdGlvbnMuSW5oaWJpdFRhcmdldElucXVpcnkpCisJCXJldHVybiB0cnVlOworCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgVGFyZ2V0IERldmljZXMgY29tbWFuZCBmb3IgaG9zdCBhZGFwdGVycyB3aXRoIGZpcm13YXJlCisJICAgdmVyc2lvbiA0LjI1IG9yIGxhdGVyLCBvciB0aGUgSW5xdWlyZSBJbnN0YWxsZWQgRGV2aWNlcyBJRCAwIHRvIDcgY29tbWFuZAorCSAgIGZvciBvbGRlciBob3N0IGFkYXB0ZXJzLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgU3luY2hyb25vdXMgVHJhbnNmZXIKKwkgICBOZWdvdGlhdGlvbiBzbyB0aGF0IHRoZSBJbnF1aXJlIFNldHVwIEluZm9ybWF0aW9uIGFuZCBJbnF1aXJlIFN5bmNocm9ub3VzCisJICAgUGVyaW9kIGNvbW1hbmRzIHdpbGwgcmV0dXJuIHZhbGlkIGRhdGEuICBUaGUgSW5xdWlyZSBUYXJnZXQgRGV2aWNlcyBjb21tYW5kCisJICAgaXMgcHJlZmVyYWJsZSB0byBJbnF1aXJlIEluc3RhbGxlZCBEZXZpY2VzIElEIDAgdG8gNyBzaW5jZSBpdCBvbmx5IHByb2JlcworCSAgIExvZ2ljYWwgVW5pdCAwIG9mIGVhY2ggVGFyZ2V0IERldmljZS4KKwkgKi8KKwlpZiAoc3RyY21wKEhvc3RBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sICI0LjI1IikgPj0gMCkgeworCisJCS8qCisJCSAqIElzc3VlIGEgSW5xdWlyZSBUYXJnZXQgRGV2aWNlcyBjb21tYW5kLiAgSW5xdWlyZSBUYXJnZXQgRGV2aWNlcyBvbmx5CisJCSAqIHRlc3RzIExvZ2ljYWwgVW5pdCAwIG9mIGVhY2ggVGFyZ2V0IERldmljZSB1bmxpa2UgdGhlIElucXVpcmUgSW5zdGFsbGVkCisJCSAqIERldmljZXMgY29tbWFuZHMgd2hpY2ggdGVzdCBMb2dpY2FsIFVuaXRzIDAgLSA3LiAgVHdvIGJ5dGVzIGFyZQorCQkgKiByZXR1cm5lZCwgd2hlcmUgYnl0ZSAwIGJpdCAwIHNldCBpbmRpY2F0ZXMgdGhhdCBUYXJnZXQgRGV2aWNlIDAgZXhpc3RzLAorCQkgKiBhbmQgc28gb24uCisJCSAqLworCisJCWlmIChCdXNMb2dpY19Db21tYW5kKEhvc3RBZGFwdGVyLCBCdXNMb2dpY19JbnF1aXJlVGFyZ2V0RGV2aWNlcywgTlVMTCwgMCwgJkluc3RhbGxlZERldmljZXMsIHNpemVvZihJbnN0YWxsZWREZXZpY2VzKSkKKwkJICAgICE9IHNpemVvZihJbnN0YWxsZWREZXZpY2VzKSkKKwkJCXJldHVybiBCdXNMb2dpY19GYWlsdXJlKEhvc3RBZGFwdGVyLCAiSU5RVUlSRSBUQVJHRVQgREVWSUNFUyIpOworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCUhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uVGFyZ2V0RXhpc3RzID0gKEluc3RhbGxlZERldmljZXMgJiAoMSA8PCBUYXJnZXRJRCkgPyB0cnVlIDogZmFsc2UpOworCX0gZWxzZSB7CisKKwkJLyoKKwkJICogSXNzdWUgYW4gSW5xdWlyZSBJbnN0YWxsZWQgRGV2aWNlcyBjb21tYW5kLiAgRm9yIGVhY2ggVGFyZ2V0IERldmljZSwKKwkJICogYSBieXRlIGlzIHJldHVybmVkIHdoZXJlIGJpdCAwIHNldCBpbmRpY2F0ZXMgdGhhdCBMb2dpY2FsIFVuaXQgMAorCQkgKiBleGlzdHMsIGJpdCAxIHNldCBpbmRpY2F0ZXMgdGhhdCBMb2dpY2FsIFVuaXQgMSBleGlzdHMsIGFuZCBzbyBvbi4KKwkJICovCisKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVJbnN0YWxsZWREZXZpY2VzSUQwdG83LCBOVUxMLCAwLCAmSW5zdGFsbGVkRGV2aWNlc0lEMHRvNywgc2l6ZW9mKEluc3RhbGxlZERldmljZXNJRDB0bzcpKQorCQkgICAgIT0gc2l6ZW9mKEluc3RhbGxlZERldmljZXNJRDB0bzcpKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJJTlFVSVJFIElOU1RBTExFRCBERVZJQ0VTIElEIDAgVE8gNyIpOworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCA4OyBUYXJnZXRJRCsrKQorCQkJSG9zdEFkYXB0ZXItPlRhcmdldEZsYWdzW1RhcmdldElEXS5UYXJnZXRFeGlzdHMgPSAoSW5zdGFsbGVkRGV2aWNlc0lEMHRvN1tUYXJnZXRJRF0gIT0gMCA/IHRydWUgOiBmYWxzZSk7CisJfQorCS8qCisJICAgSXNzdWUgdGhlIElucXVpcmUgU2V0dXAgSW5mb3JtYXRpb24gY29tbWFuZC4KKwkgKi8KKwlSZXF1ZXN0ZWRSZXBseUxlbmd0aCA9IHNpemVvZihTZXR1cEluZm9ybWF0aW9uKTsKKwlpZiAoQnVzTG9naWNfQ29tbWFuZChIb3N0QWRhcHRlciwgQnVzTG9naWNfSW5xdWlyZVNldHVwSW5mb3JtYXRpb24sICZSZXF1ZXN0ZWRSZXBseUxlbmd0aCwgc2l6ZW9mKFJlcXVlc3RlZFJlcGx5TGVuZ3RoKSwgJlNldHVwSW5mb3JtYXRpb24sIHNpemVvZihTZXR1cEluZm9ybWF0aW9uKSkKKwkgICAgIT0gc2l6ZW9mKFNldHVwSW5mb3JtYXRpb24pKQorCQlyZXR1cm4gQnVzTG9naWNfRmFpbHVyZShIb3N0QWRhcHRlciwgIklOUVVJUkUgU0VUVVAgSU5GT1JNQVRJT04iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJSG9zdEFkYXB0ZXItPlN5bmNocm9ub3VzT2Zmc2V0W1RhcmdldElEXSA9IChUYXJnZXRJRCA8IDggPyBTZXR1cEluZm9ybWF0aW9uLlN5bmNocm9ub3VzVmFsdWVzSUQwdG83W1RhcmdldElEXS5PZmZzZXQgOiBTZXR1cEluZm9ybWF0aW9uLlN5bmNocm9ub3VzVmFsdWVzSUQ4dG8xNVtUYXJnZXRJRCAtIDhdLk9mZnNldCk7CisJaWYgKHN0cmNtcChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCAiNS4wNkwiKSA+PSAwKQorCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCUhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uV2lkZVRyYW5zZmVyc0FjdGl2ZSA9IChUYXJnZXRJRCA8IDggPyAoU2V0dXBJbmZvcm1hdGlvbi5XaWRlVHJhbnNmZXJzQWN0aXZlSUQwdG83ICYgKDEgPDwgVGFyZ2V0SUQpCisJCQkJCQkJCQkJCQkgID8gdHJ1ZSA6IGZhbHNlKQorCQkJCQkJCQkJCSAgOiAoU2V0dXBJbmZvcm1hdGlvbi5XaWRlVHJhbnNmZXJzQWN0aXZlSUQ4dG8xNSAmICgxIDw8IChUYXJnZXRJRCAtIDgpKQorCQkJCQkJCQkJCSAgICAgPyB0cnVlIDogZmFsc2UpKTsKKwkvKgorCSAgIElzc3VlIHRoZSBJbnF1aXJlIFN5bmNocm9ub3VzIFBlcmlvZCBjb21tYW5kLgorCSAqLworCWlmIChIb3N0QWRhcHRlci0+RmlybXdhcmVWZXJzaW9uWzBdID49ICczJykgeworCisJCS8qIElzc3VlIGEgSW5xdWlyZSBTeW5jaHJvbm91cyBQZXJpb2QgY29tbWFuZC4gIEZvciBlYWNoIFRhcmdldCBEZXZpY2UsCisJCSAqIGEgYnl0ZSBpcyByZXR1cm5lZCB3aGljaCByZXByZXNlbnRzIHRoZSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2QKKwkJICogaW4gdW5pdHMgb2YgMTAgbmFub3NlY29uZHMuCisJCSAqLworCisJCVJlcXVlc3RlZFJlcGx5TGVuZ3RoID0gc2l6ZW9mKFN5bmNocm9ub3VzUGVyaW9kKTsKKwkJaWYgKEJ1c0xvZ2ljX0NvbW1hbmQoSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX0lucXVpcmVTeW5jaHJvbm91c1BlcmlvZCwgJlJlcXVlc3RlZFJlcGx5TGVuZ3RoLCBzaXplb2YoUmVxdWVzdGVkUmVwbHlMZW5ndGgpLCAmU3luY2hyb25vdXNQZXJpb2QsIHNpemVvZihTeW5jaHJvbm91c1BlcmlvZCkpCisJCSAgICAhPSBzaXplb2YoU3luY2hyb25vdXNQZXJpb2QpKQorCQkJcmV0dXJuIEJ1c0xvZ2ljX0ZhaWx1cmUoSG9zdEFkYXB0ZXIsICJJTlFVSVJFIFNZTkNIUk9OT1VTIFBFUklPRCIpOworCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJCUhvc3RBZGFwdGVyLT5TeW5jaHJvbm91c1BlcmlvZFtUYXJnZXRJRF0gPSBTeW5jaHJvbm91c1BlcmlvZFtUYXJnZXRJRF07CisJfSBlbHNlCisJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKQorCQkJaWYgKFNldHVwSW5mb3JtYXRpb24uU3luY2hyb25vdXNWYWx1ZXNJRDB0bzdbVGFyZ2V0SURdLk9mZnNldCA+IDApCisJCQkJSG9zdEFkYXB0ZXItPlN5bmNocm9ub3VzUGVyaW9kW1RhcmdldElEXSA9IDIwICsgNSAqIFNldHVwSW5mb3JtYXRpb24uU3luY2hyb25vdXNWYWx1ZXNJRDB0bzdbVGFyZ2V0SURdCisJCQkJICAgIC5UcmFuc2ZlclBlcmlvZDsKKwkvKgorCSAgIEluZGljYXRlIHRoZSBUYXJnZXQgRGV2aWNlIElucXVpcnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAgQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RTdHJ1Y3R1cmUgaW5pdGlhbGl6ZXMgdGhlIGZpZWxkcyBpbiB0aGUgU0NTSSBIb3N0CisgIHN0cnVjdHVyZS4gIFRoZSBiYXNlLCBpb19wb3J0LCBuX2lvX3BvcnRzLCBpcnEsIGFuZCBkbWFfY2hhbm5lbCBmaWVsZHMgaW4gdGhlCisgIFNDU0kgSG9zdCBzdHJ1Y3R1cmUgYXJlIGludGVudGlvbmFsbHkgbGVmdCB1bmluaXRpYWxpemVkLCBhcyB0aGlzIGRyaXZlcgorICBoYW5kbGVzIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIHRoZXNlIHJlc291cmNlcyBleHBsaWNpdGx5LCBhcyB3ZWxsIGFzCisgIGVuc3VyaW5nIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIEhvc3QgQWRhcHRlciBoYXJkd2FyZSBhbmQgZGF0YSBzdHJ1Y3R1cmVzCisgIHRocm91Z2ggZXhwbGljaXQgYWNxdWlzaXRpb24gYW5kIHJlbGVhc2Ugb2YgdGhlIEhvc3QgQWRhcHRlcidzIExvY2suCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RTdHJ1Y3R1cmUoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCQkgICAgKkhvc3RBZGFwdGVyLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0KQoreworCUhvc3QtPm1heF9pZCA9IEhvc3RBZGFwdGVyLT5NYXhUYXJnZXREZXZpY2VzOworCUhvc3QtPm1heF9sdW4gPSBIb3N0QWRhcHRlci0+TWF4TG9naWNhbFVuaXRzOworCUhvc3QtPm1heF9jaGFubmVsID0gMDsKKwlIb3N0LT51bmlxdWVfaWQgPSBIb3N0QWRhcHRlci0+SU9fQWRkcmVzczsKKwlIb3N0LT50aGlzX2lkID0gSG9zdEFkYXB0ZXItPlNDU0lfSUQ7CisJSG9zdC0+Y2FuX3F1ZXVlID0gSG9zdEFkYXB0ZXItPkRyaXZlclF1ZXVlRGVwdGg7CisJSG9zdC0+c2dfdGFibGVzaXplID0gSG9zdEFkYXB0ZXItPkRyaXZlclNjYXR0ZXJHYXRoZXJMaW1pdDsKKwlIb3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IEhvc3RBZGFwdGVyLT5Cb3VuY2VCdWZmZXJzUmVxdWlyZWQ7CisJSG9zdC0+Y21kX3Blcl9sdW4gPSBIb3N0QWRhcHRlci0+VW50YWdnZWRRdWV1ZURlcHRoOworfQorCisvKgorICBCdXNMb2dpY19TbGF2ZUNvbmZpZ3VyZSB3aWxsIGFjdHVhbGx5IHNldCB0aGUgcXVldWUgZGVwdGggb24gaW5kaXZpZHVhbAorICBzY3NpIGRldmljZXMgYXMgdGhleSBhcmUgcGVybWFuZW50bHkgYWRkZWQgdG8gdGhlIGRldmljZSBjaGFpbi4gIFdlCisgIHNoYW1lbGVzc2x5IHJpcCBvZmYgdGhlIFNlbGVjdFF1ZXVlRGVwdGhzIGNvZGUgdG8gbWFrZSB0aGlzIHdvcmsgbW9zdGx5CisgIGxpa2UgaXQgdXNlZCB0by4gIFNpbmNlIHdlIGRvbid0IGdldCBjYWxsZWQgb25jZSBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuCisgIGJ1dCBpbnN0ZWFkIGdldCBjYWxsZWQgZm9yIGVhY2ggZGV2aWNlLCB3ZSBoYXZlIHRvIGRvIHRoaW5ncyBhIGJpdAorICBkaWZmZXJlbnRseS4KKyovCitzdGF0aWMgaW50IEJ1c0xvZ2ljX1NsYXZlQ29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqRGV2aWNlKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIERldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IFRhcmdldElEID0gRGV2aWNlLT5pZDsKKwlpbnQgUXVldWVEZXB0aCA9IEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXTsKKworCWlmIChIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdLlRhZ2dlZFF1ZXVpbmdTdXBwb3J0ZWQgJiYgKEhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkICYgKDEgPDwgVGFyZ2V0SUQpKSkgeworCQlpZiAoUXVldWVEZXB0aCA9PSAwKQorCQkJUXVldWVEZXB0aCA9IEJ1c0xvZ2ljX01heEF1dG9tYXRpY1RhZ2dlZFF1ZXVlRGVwdGg7CisJCUhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXSA9IFF1ZXVlRGVwdGg7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKERldmljZSwgTVNHX1NJTVBMRV9UQUcsIFF1ZXVlRGVwdGgpOworCX0gZWxzZSB7CisJCUhvc3RBZGFwdGVyLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkICY9IH4oMSA8PCBUYXJnZXRJRCk7CisJCVF1ZXVlRGVwdGggPSBIb3N0QWRhcHRlci0+VW50YWdnZWRRdWV1ZURlcHRoOworCQlIb3N0QWRhcHRlci0+UXVldWVEZXB0aFtUYXJnZXRJRF0gPSBRdWV1ZURlcHRoOworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChEZXZpY2UsIDAsIFF1ZXVlRGVwdGgpOworCX0KKwlRdWV1ZURlcHRoID0gMDsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykKKwkJaWYgKEhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uVGFyZ2V0RXhpc3RzKSB7CisJCQlRdWV1ZURlcHRoICs9IEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXTsKKwkJfQorCWlmIChRdWV1ZURlcHRoID4gSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMpCisJCUJ1c0xvZ2ljX0NyZWF0ZUFkZGl0aW9uYWxDQ0JzKEhvc3RBZGFwdGVyLCBRdWV1ZURlcHRoIC0gSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgQnVzTG9naWNfRGV0ZWN0SG9zdEFkYXB0ZXIgcHJvYmVzIGZvciBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzIGF0IHRoZSBzdGFuZGFyZAorICBJL08gQWRkcmVzc2VzIHdoZXJlIHRoZXkgbWF5IGJlIGxvY2F0ZWQsIGluaXRpYWxpemluZywgcmVnaXN0ZXJpbmcsIGFuZAorICByZXBvcnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXIgaXQgZmluZHMuICBJdAorICByZXR1cm5zIHRoZSBudW1iZXIgb2YgQnVzTG9naWMgSG9zdCBBZGFwdGVycyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kCisgIHJlZ2lzdGVyZWQuCisqLworCitzdGF0aWMgaW50IF9faW5pdCBCdXNMb2dpY19pbml0KHZvaWQpCit7CisJaW50IEJ1c0xvZ2ljSG9zdEFkYXB0ZXJDb3VudCA9IDAsIERyaXZlck9wdGlvbnNJbmRleCA9IDAsIFByb2JlSW5kZXg7CisJc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpQcm90b3R5cGVIb3N0QWRhcHRlcjsKKworI2lmZGVmIE1PRFVMRQorCWlmIChCdXNMb2dpYykKKwkJQnVzTG9naWNfU2V0dXAoQnVzTG9naWMpOworI2VuZGlmCisKKwlpZiAoQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmUpCisJCXJldHVybiAtRU5PREVWOworCUJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QgPSAoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyAqKQorCSAgICBrbWFsbG9jKEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycyAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QgPT0gTlVMTCkgeworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IFVuYWJsZSB0byBhbGxvY2F0ZSBQcm9iZSBJbmZvIExpc3RcbiIsIE5VTEwpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QsIDAsIEJ1c0xvZ2ljX01heEhvc3RBZGFwdGVycyAqIHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvKSk7CisJUHJvdG90eXBlSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopCisJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciksIEdGUF9BVE9NSUMpOworCWlmIChQcm90b3R5cGVIb3N0QWRhcHRlciA9PSBOVUxMKSB7CisJCWtmcmVlKEJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3QpOworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IFVuYWJsZSB0byBhbGxvY2F0ZSBQcm90b3R5cGUgIiAiSG9zdCBBZGFwdGVyXG4iLCBOVUxMKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChQcm90b3R5cGVIb3N0QWRhcHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcikpOworI2lmZGVmIE1PRFVMRQorCWlmIChCdXNMb2dpYyAhPSBOVUxMKQorCQlCdXNMb2dpY19TZXR1cChCdXNMb2dpYyk7CisjZW5kaWYKKwlCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdChQcm90b3R5cGVIb3N0QWRhcHRlcik7CisJZm9yIChQcm9iZUluZGV4ID0gMDsgUHJvYmVJbmRleCA8IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50OyBQcm9iZUluZGV4KyspIHsKKwkJc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyAqUHJvYmVJbmZvID0gJkJ1c0xvZ2ljX1Byb2JlSW5mb0xpc3RbUHJvYmVJbmRleF07CisJCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSBQcm90b3R5cGVIb3N0QWRhcHRlcjsKKwkJc3RydWN0IFNjc2lfSG9zdCAqSG9zdDsKKwkJaWYgKFByb2JlSW5mby0+SU9fQWRkcmVzcyA9PSAwKQorCQkJY29udGludWU7CisJCW1lbXNldChIb3N0QWRhcHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcikpOworCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJUeXBlID0gUHJvYmVJbmZvLT5Ib3N0QWRhcHRlclR5cGU7CisJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckJ1c1R5cGUgPSBQcm9iZUluZm8tPkhvc3RBZGFwdGVyQnVzVHlwZTsKKwkJSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgPSBQcm9iZUluZm8tPklPX0FkZHJlc3M7CisJCUhvc3RBZGFwdGVyLT5QQ0lfQWRkcmVzcyA9IFByb2JlSW5mby0+UENJX0FkZHJlc3M7CisJCUhvc3RBZGFwdGVyLT5CdXMgPSBQcm9iZUluZm8tPkJ1czsKKwkJSG9zdEFkYXB0ZXItPkRldmljZSA9IFByb2JlSW5mby0+RGV2aWNlOworCQlIb3N0QWRhcHRlci0+SVJRX0NoYW5uZWwgPSBQcm9iZUluZm8tPklSUV9DaGFubmVsOworCQlIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50ID0gQnVzTG9naWNfSG9zdEFkYXB0ZXJBZGRyZXNzQ291bnRbSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyVHlwZV07CisJCS8qCisJCSAgIFByb2JlIHRoZSBIb3N0IEFkYXB0ZXIuICBJZiB1bnN1Y2Nlc3NmdWwsIGFib3J0IGZ1cnRoZXIgaW5pdGlhbGl6YXRpb24uCisJCSAqLworCQlpZiAoIUJ1c0xvZ2ljX1Byb2JlSG9zdEFkYXB0ZXIoSG9zdEFkYXB0ZXIpKQorCQkJY29udGludWU7CisJCS8qCisJCSAgIEhhcmQgUmVzZXQgdGhlIEhvc3QgQWRhcHRlci4gIElmIHVuc3VjY2Vzc2Z1bCwgYWJvcnQgZnVydGhlcgorCQkgICBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCWlmICghQnVzTG9naWNfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyLCB0cnVlKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgICBDaGVjayB0aGUgSG9zdCBBZGFwdGVyLiAgSWYgdW5zdWNjZXNzZnVsLCBhYm9ydCBmdXJ0aGVyIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKwkJaWYgKCFCdXNMb2dpY19DaGVja0hvc3RBZGFwdGVyKEhvc3RBZGFwdGVyKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgICBJbml0aWFsaXplIHRoZSBEcml2ZXIgT3B0aW9ucyBmaWVsZCBpZiBwcm92aWRlZC4KKwkJICovCisJCWlmIChEcml2ZXJPcHRpb25zSW5kZXggPCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zQ291bnQpCisJCQlIb3N0QWRhcHRlci0+RHJpdmVyT3B0aW9ucyA9ICZCdXNMb2dpY19Ecml2ZXJPcHRpb25zW0RyaXZlck9wdGlvbnNJbmRleCsrXTsKKwkJLyoKKwkJICAgQW5ub3VuY2UgdGhlIERyaXZlciBWZXJzaW9uIGFuZCBEYXRlLCBBdXRob3IncyBOYW1lLCBDb3B5cmlnaHQgTm90aWNlLAorCQkgICBhbmQgRWxlY3Ryb25pYyBNYWlsIEFkZHJlc3MuCisJCSAqLworCQlCdXNMb2dpY19Bbm5vdW5jZURyaXZlcihIb3N0QWRhcHRlcik7CisJCS8qCisJCSAgIFJlZ2lzdGVyIHVzYWdlIG9mIHRoZSBJL08gQWRkcmVzcyByYW5nZS4gIEZyb20gdGhpcyBwb2ludCBvbndhcmQsIGFueQorCQkgICBmYWlsdXJlIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBkdWUgdG8gYSBwcm9ibGVtIHdpdGggdGhlIEhvc3QgQWRhcHRlciwKKwkJICAgcmF0aGVyIHRoYW4gZHVlIHRvIGhhdmluZyBtaXN0YWtlbmx5IGlkZW50aWZpZWQgdGhpcyBwb3J0IGFzIGJlbG9uZ2luZworCQkgICB0byBhIEJ1c0xvZ2ljIEhvc3QgQWRhcHRlci4gIFRoZSBJL08gQWRkcmVzcyByYW5nZSB3aWxsIG5vdCBiZQorCQkgICByZWxlYXNlZCwgdGhlcmVieSBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhcworCQkgICBhbnkgb3RoZXIgdHlwZSBvZiBIb3N0IEFkYXB0ZXIuCisJCSAqLworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50LCAiQnVzTG9naWMiKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgICBSZWdpc3RlciB0aGUgU0NTSSBIb3N0IHN0cnVjdHVyZS4KKwkJICovCisKKwkJSG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmQnVzX0xvZ2ljX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyKSk7CisJCWlmIChIb3N0ID09IE5VTEwpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzLCBIb3N0QWRhcHRlci0+QWRkcmVzc0NvdW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCUhvc3RBZGFwdGVyID0gKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqKSBIb3N0LT5ob3N0ZGF0YTsKKwkJbWVtY3B5KEhvc3RBZGFwdGVyLCBQcm90b3R5cGVIb3N0QWRhcHRlciwgc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcikpOworCQlIb3N0QWRhcHRlci0+U0NTSV9Ib3N0ID0gSG9zdDsKKwkJSG9zdEFkYXB0ZXItPkhvc3ROdW1iZXIgPSBIb3N0LT5ob3N0X25vOworCQkvKgorCQkgICBBZGQgSG9zdCBBZGFwdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBCdXNMb2dpYworCQkgICBIb3N0IEFkYXB0ZXJzLgorCQkgKi8KKwkJbGlzdF9hZGRfdGFpbCgmSG9zdEFkYXB0ZXItPmhvc3RfbGlzdCwgJkJ1c0xvZ2ljX2hvc3RfbGlzdCk7CisKKwkJLyoKKwkJICAgUmVhZCB0aGUgSG9zdCBBZGFwdGVyIENvbmZpZ3VyYXRpb24sIENvbmZpZ3VyZSB0aGUgSG9zdCBBZGFwdGVyLAorCQkgICBBY3F1aXJlIHRoZSBTeXN0ZW0gUmVzb3VyY2VzIG5lY2Vzc2FyeSB0byB1c2UgdGhlIEhvc3QgQWRhcHRlciwgdGhlbgorCQkgICBDcmVhdGUgdGhlIEluaXRpYWwgQ0NCcywgSW5pdGlhbGl6ZSB0aGUgSG9zdCBBZGFwdGVyLCBhbmQgZmluYWxseQorCQkgICBwZXJmb3JtIFRhcmdldCBEZXZpY2UgSW5xdWlyeS4KKwkJICovCisJCWlmIChCdXNMb2dpY19SZWFkSG9zdEFkYXB0ZXJDb25maWd1cmF0aW9uKEhvc3RBZGFwdGVyKSAmJgorCQkgICAgQnVzTG9naWNfUmVwb3J0SG9zdEFkYXB0ZXJDb25maWd1cmF0aW9uKEhvc3RBZGFwdGVyKSAmJiBCdXNMb2dpY19BY3F1aXJlUmVzb3VyY2VzKEhvc3RBZGFwdGVyKSAmJiBCdXNMb2dpY19DcmVhdGVJbml0aWFsQ0NCcyhIb3N0QWRhcHRlcikgJiYgQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyKSAmJiBCdXNMb2dpY19UYXJnZXREZXZpY2VJbnF1aXJ5KEhvc3RBZGFwdGVyKSkgeworCQkJLyoKKwkJCSAgIEluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICBSZWxlYXNlIGFuZAorCQkJICAgcmUtcmVnaXN0ZXIgdXNhZ2Ugb2YgdGhlIEkvTyBBZGRyZXNzIHJhbmdlIHNvIHRoYXQgdGhlIE1vZGVsCisJCQkgICBOYW1lIG9mIHRoZSBIb3N0IEFkYXB0ZXIgd2lsbCBhcHBlYXIsIGFuZCBpbml0aWFsaXplIHRoZSBTQ1NJCisJCQkgICBIb3N0IHN0cnVjdHVyZS4KKwkJCSAqLworCQkJcmVsZWFzZV9yZWdpb24oSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MsIEhvc3RBZGFwdGVyLT5BZGRyZXNzQ291bnQpOworCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihIb3N0QWRhcHRlci0+SU9fQWRkcmVzcywgSG9zdEFkYXB0ZXItPkFkZHJlc3NDb3VudCwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQnVzTG9naWM6IFJlbGVhc2UgYW5kIHJlLXJlZ2lzdGVyIG9mICIgInBvcnQgMHglMDRseCBmYWlsZWQgXG4iLCAodW5zaWduZWQgbG9uZykgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MpOworCQkJCUJ1c0xvZ2ljX0Rlc3Ryb3lDQ0JzKEhvc3RBZGFwdGVyKTsKKwkJCQlCdXNMb2dpY19SZWxlYXNlUmVzb3VyY2VzKEhvc3RBZGFwdGVyKTsKKwkJCQlsaXN0X2RlbCgmSG9zdEFkYXB0ZXItPmhvc3RfbGlzdCk7CisJCQkJc2NzaV9ob3N0X3B1dChIb3N0KTsKKwkJCX0gZWxzZSB7CisJCQkJQnVzTG9naWNfSW5pdGlhbGl6ZUhvc3RTdHJ1Y3R1cmUoSG9zdEFkYXB0ZXIsIEhvc3QpOworCQkJCXNjc2lfYWRkX2hvc3QoSG9zdCwgTlVMTCk7CisJCQkJc2NzaV9zY2FuX2hvc3QoSG9zdCk7CisJCQkJQnVzTG9naWNIb3N0QWRhcHRlckNvdW50Kys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICAgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIEhvc3QgQWRhcHRlciBDb25maWd1cmF0aW9uIFF1ZXJ5aW5nLCBIb3N0CisJCQkgICBBZGFwdGVyIENvbmZpZ3VyYXRpb24sIFJlc291cmNlIEFjcXVpc2l0aW9uLCBDQ0IgQ3JlYXRpb24sIEhvc3QKKwkJCSAgIEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24sIG9yIFRhcmdldCBEZXZpY2UgSW5xdWlyeSwgc28gcmVtb3ZlIEhvc3QKKwkJCSAgIEFkYXB0ZXIgZnJvbSB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIEJ1c0xvZ2ljIEhvc3QgQWRhcHRlcnMsIGRlc3Ryb3kKKwkJCSAgIHRoZSBDQ0JzLCBSZWxlYXNlIHRoZSBTeXN0ZW0gUmVzb3VyY2VzLCBhbmQgVW5yZWdpc3RlciB0aGUgU0NTSQorCQkJICAgSG9zdC4KKwkJCSAqLworCQkJQnVzTG9naWNfRGVzdHJveUNDQnMoSG9zdEFkYXB0ZXIpOworCQkJQnVzTG9naWNfUmVsZWFzZVJlc291cmNlcyhIb3N0QWRhcHRlcik7CisJCQlsaXN0X2RlbCgmSG9zdEFkYXB0ZXItPmhvc3RfbGlzdCk7CisJCQlzY3NpX2hvc3RfcHV0KEhvc3QpOworCQl9CisJfQorCWtmcmVlKFByb3RvdHlwZUhvc3RBZGFwdGVyKTsKKwlrZnJlZShCdXNMb2dpY19Qcm9iZUluZm9MaXN0KTsKKwlCdXNMb2dpY19Qcm9iZUluZm9MaXN0ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICBCdXNMb2dpY19SZWxlYXNlSG9zdEFkYXB0ZXIgcmVsZWFzZXMgYWxsIHJlc291cmNlcyBwcmV2aW91c2x5IGFjcXVpcmVkIHRvCisgIHN1cHBvcnQgYSBzcGVjaWZpYyBIb3N0IEFkYXB0ZXIsIGluY2x1ZGluZyB0aGUgSS9PIEFkZHJlc3MgcmFuZ2UsIGFuZAorICB1bnJlZ2lzdGVycyB0aGUgQnVzTG9naWMgSG9zdCBBZGFwdGVyLgorKi8KKworc3RhdGljIGludCBfX2V4aXQgQnVzTG9naWNfUmVsZWFzZUhvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqSG9zdCA9IEhvc3RBZGFwdGVyLT5TQ1NJX0hvc3Q7CisKKwlzY3NpX3JlbW92ZV9ob3N0KEhvc3QpOworCisJLyoKKwkgICBGbGFzaFBvaW50IEhvc3QgQWRhcHRlcnMgbXVzdCBmaXJzdCBiZSByZWxlYXNlZCBieSB0aGUgRmxhc2hQb2ludAorCSAgIFNDQ0IgTWFuYWdlci4KKwkgKi8KKwlpZiAoQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpCisJCUZsYXNoUG9pbnRfUmVsZWFzZUhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyLT5DYXJkSGFuZGxlKTsKKwkvKgorCSAgIERlc3Ryb3kgdGhlIENDQnMgYW5kIHJlbGVhc2UgYW55IHN5c3RlbSByZXNvdXJjZXMgYWNxdWlyZWQgdG8KKwkgICBzdXBwb3J0IEhvc3QgQWRhcHRlci4KKwkgKi8KKwlCdXNMb2dpY19EZXN0cm95Q0NCcyhIb3N0QWRhcHRlcik7CisJQnVzTG9naWNfUmVsZWFzZVJlc291cmNlcyhIb3N0QWRhcHRlcik7CisJLyoKKwkgICBSZWxlYXNlIHVzYWdlIG9mIHRoZSBJL08gQWRkcmVzcyByYW5nZS4KKwkgKi8KKwlyZWxlYXNlX3JlZ2lvbihIb3N0QWRhcHRlci0+SU9fQWRkcmVzcywgSG9zdEFkYXB0ZXItPkFkZHJlc3NDb3VudCk7CisJLyoKKwkgICBSZW1vdmUgSG9zdCBBZGFwdGVyIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzLgorCSAqLworCWxpc3RfZGVsKCZIb3N0QWRhcHRlci0+aG9zdF9saXN0KTsKKworCXNjc2lfaG9zdF9wdXQoSG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAgQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0IgcXVldWVzIENDQiBmb3IgY29tcGxldGlvbiBwcm9jZXNzaW5nLgorKi8KKworc3RhdGljIHZvaWQgQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0Ioc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSBDQ0ItPkhvc3RBZGFwdGVyOworCUNDQi0+U3RhdHVzID0gQnVzTG9naWNfQ0NCX0NvbXBsZXRlZDsKKwlDQ0ItPk5leHQgPSBOVUxMOworCWlmIChIb3N0QWRhcHRlci0+Rmlyc3RDb21wbGV0ZWRDQ0IgPT0gTlVMTCkgeworCQlIb3N0QWRhcHRlci0+Rmlyc3RDb21wbGV0ZWRDQ0IgPSBDQ0I7CisJCUhvc3RBZGFwdGVyLT5MYXN0Q29tcGxldGVkQ0NCID0gQ0NCOworCX0gZWxzZSB7CisJCUhvc3RBZGFwdGVyLT5MYXN0Q29tcGxldGVkQ0NCLT5OZXh0ID0gQ0NCOworCQlIb3N0QWRhcHRlci0+TGFzdENvbXBsZXRlZENDQiA9IENDQjsKKwl9CisJSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW0NDQi0+VGFyZ2V0SURdLS07Cit9CisKKworLyoKKyAgQnVzTG9naWNfQ29tcHV0ZVJlc3VsdENvZGUgY29tcHV0ZXMgYSBTQ1NJIFN1YnN5c3RlbSBSZXN1bHQgQ29kZSBmcm9tCisgIHRoZSBIb3N0IEFkYXB0ZXIgU3RhdHVzIGFuZCBUYXJnZXQgRGV2aWNlIFN0YXR1cy4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfQ29tcHV0ZVJlc3VsdENvZGUoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciwgZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlclN0YXR1cyBIb3N0QWRhcHRlclN0YXR1cywgZW51bSBCdXNMb2dpY19UYXJnZXREZXZpY2VTdGF0dXMgVGFyZ2V0RGV2aWNlU3RhdHVzKQoreworCWludCBIb3N0U3RhdHVzOworCXN3aXRjaCAoSG9zdEFkYXB0ZXJTdGF0dXMpIHsKKwljYXNlIEJ1c0xvZ2ljX0NvbW1hbmRDb21wbGV0ZWROb3JtYWxseToKKwljYXNlIEJ1c0xvZ2ljX0xpbmtlZENvbW1hbmRDb21wbGV0ZWQ6CisJY2FzZSBCdXNMb2dpY19MaW5rZWRDb21tYW5kQ29tcGxldGVkV2l0aEZsYWc6CisJCUhvc3RTdGF0dXMgPSBESURfT0s7CisJCWJyZWFrOworCWNhc2UgQnVzTG9naWNfU0NTSVNlbGVjdGlvblRpbWVvdXQ6CisJCUhvc3RTdGF0dXMgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCWNhc2UgQnVzTG9naWNfSW52YWxpZE91dGdvaW5nTWFpbGJveEFjdGlvbkNvZGU6CisJY2FzZSBCdXNMb2dpY19JbnZhbGlkQ29tbWFuZE9wZXJhdGlvbkNvZGU6CisJY2FzZSBCdXNMb2dpY19JbnZhbGlkQ29tbWFuZFBhcmFtZXRlcjoKKwkJQnVzTG9naWNfV2FybmluZygiQnVzTG9naWMgRHJpdmVyIFByb3RvY29sIEVycm9yIDB4JTAyWFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyU3RhdHVzKTsKKwljYXNlIEJ1c0xvZ2ljX0RhdGFVbmRlclJ1bjoKKwljYXNlIEJ1c0xvZ2ljX0RhdGFPdmVyUnVuOgorCWNhc2UgQnVzTG9naWNfVW5leHBlY3RlZEJ1c0ZyZWU6CisJY2FzZSBCdXNMb2dpY19MaW5rZWRDQ0JoYXNJbnZhbGlkTFVOOgorCWNhc2UgQnVzTG9naWNfQXV0b1JlcXVlc3RTZW5zZUZhaWxlZDoKKwljYXNlIEJ1c0xvZ2ljX1RhZ2dlZFF1ZXVpbmdNZXNzYWdlUmVqZWN0ZWQ6CisJY2FzZSBCdXNMb2dpY19VbnN1cHBvcnRlZE1lc3NhZ2VSZWNlaXZlZDoKKwljYXNlIEJ1c0xvZ2ljX0hvc3RBZGFwdGVySGFyZHdhcmVGYWlsZWQ6CisJY2FzZSBCdXNMb2dpY19UYXJnZXREZXZpY2VSZWNvbm5lY3RlZEltcHJvcGVybHk6CisJY2FzZSBCdXNMb2dpY19BYm9ydFF1ZXVlR2VuZXJhdGVkOgorCWNhc2UgQnVzTG9naWNfSG9zdEFkYXB0ZXJTb2Z0d2FyZUVycm9yOgorCWNhc2UgQnVzTG9naWNfSG9zdEFkYXB0ZXJIYXJkd2FyZVRpbWVvdXRFcnJvcjoKKwljYXNlIEJ1c0xvZ2ljX1NDU0lQYXJpdHlFcnJvckRldGVjdGVkOgorCQlIb3N0U3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwljYXNlIEJ1c0xvZ2ljX0ludmFsaWRCdXNQaGFzZVJlcXVlc3RlZDoKKwljYXNlIEJ1c0xvZ2ljX1RhcmdldEZhaWxlZFJlc3BvbnNlVG9BVE46CisJY2FzZSBCdXNMb2dpY19Ib3N0QWRhcHRlckFzc2VydGVkUlNUOgorCWNhc2UgQnVzTG9naWNfT3RoZXJEZXZpY2VBc3NlcnRlZFJTVDoKKwljYXNlIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQXNzZXJ0ZWRCdXNEZXZpY2VSZXNldDoKKwkJSG9zdFN0YXR1cyA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQnVzTG9naWNfV2FybmluZygiVW5rbm93biBIb3N0IEFkYXB0ZXIgU3RhdHVzIDB4JTAyWFxuIiwgSG9zdEFkYXB0ZXIsIEhvc3RBZGFwdGVyU3RhdHVzKTsKKwkJSG9zdFN0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoSG9zdFN0YXR1cyA8PCAxNikgfCBUYXJnZXREZXZpY2VTdGF0dXM7Cit9CisKKworLyoKKyAgQnVzTG9naWNfU2NhbkluY29taW5nTWFpbGJveGVzIHNjYW5zIHRoZSBJbmNvbWluZyBNYWlsYm94ZXMgc2F2aW5nIGFueQorICBJbmNvbWluZyBNYWlsYm94IGVudHJpZXMgZm9yIGNvbXBsZXRpb24gcHJvY2Vzc2luZy4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX1NjYW5JbmNvbWluZ01haWxib3hlcyhzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCS8qCisJICAgU2NhbiB0aHJvdWdoIHRoZSBJbmNvbWluZyBNYWlsYm94ZXMgaW4gU3RyaWN0IFJvdW5kIFJvYmluIGZhc2hpb24sIHNhdmluZworCSAgIGFueSBjb21wbGV0ZWQgQ0NCcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgSXQgaXMgZXNzZW50aWFsIHRoYXQgZm9yIGVhY2gKKwkgICBDQ0IgYW5kIFNDU0kgQ29tbWFuZCBpc3N1ZWQsIGNvbW1hbmQgY29tcGxldGlvbiBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZAorCSAgIGV4YWN0bHkgb25jZS4gIFRoZXJlZm9yZSwgb25seSBJbmNvbWluZyBNYWlsYm94ZXMgd2l0aCBjb21wbGV0aW9uIGNvZGUKKwkgICBDb21tYW5kIENvbXBsZXRlZCBXaXRob3V0IEVycm9yLCBDb21tYW5kIENvbXBsZXRlZCBXaXRoIEVycm9yLCBvciBDb21tYW5kCisJICAgQWJvcnRlZCBBdCBIb3N0IFJlcXVlc3QgYXJlIHNhdmVkIGZvciBjb21wbGV0aW9uIHByb2Nlc3NpbmcuICBXaGVuIGFuCisJICAgSW5jb21pbmcgTWFpbGJveCBoYXMgYSBjb21wbGV0aW9uIGNvZGUgb2YgQWJvcnRlZCBDb21tYW5kIE5vdCBGb3VuZCwgdGhlCisJICAgQ0NCIGhhZCBhbHJlYWR5IGNvbXBsZXRlZCBvciBiZWVuIGFib3J0ZWQgYmVmb3JlIHRoZSBjdXJyZW50IEFib3J0IHJlcXVlc3QKKwkgICB3YXMgcHJvY2Vzc2VkLCBhbmQgc28gY29tcGxldGlvbiBwcm9jZXNzaW5nIGhhcyBhbHJlYWR5IG9jY3VycmVkIGFuZCBubworCSAgIGZ1cnRoZXIgYWN0aW9uIHNob3VsZCBiZSB0YWtlbi4KKwkgKi8KKwlzdHJ1Y3QgQnVzTG9naWNfSW5jb21pbmdNYWlsYm94ICpOZXh0SW5jb21pbmdNYWlsYm94ID0gSG9zdEFkYXB0ZXItPk5leHRJbmNvbWluZ01haWxib3g7CisJZW51bSBCdXNMb2dpY19Db21wbGV0aW9uQ29kZSBDb21wbGV0aW9uQ29kZTsKKwl3aGlsZSAoKENvbXBsZXRpb25Db2RlID0gTmV4dEluY29taW5nTWFpbGJveC0+Q29tcGxldGlvbkNvZGUpICE9IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveEZyZWUpIHsKKwkJLyoKKwkJICAgV2UgYXJlIG9ubHkgYWxsb3dlZCB0byBkbyB0aGlzIGJlY2F1c2Ugd2UgbGltaXQgb3VyIGFyY2hpdGVjdHVyZXMgd2UKKwkJICAgcnVuIG9uIHRvIG1hY2hpbmVzIHdoZXJlIGJ1c190b192aXJ0KCkgYWN0dWFsbHkgd29ya3MuICBUaGVyZSAqbmVlZHMqCisJCSAgIHRvIGJlIGEgZG1hX2FkZHJfdG9fdmlydCgpIGluIHRoZSBuZXcgUENJIERNQSBtYXBwaW5nIGludGVyZmFjZSB0bworCQkgICByZXBsYWNlIGJ1c190b192aXJ0KCkgb3IgZWxzZSB0aGlzIGNvZGUgaXMgZ29pbmcgdG8gYmVjb21lIHZlcnkKKwkJICAgaW5uZWZmaWNpZW50LgorCQkgKi8KKwkJc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCID0gKHN0cnVjdCBCdXNMb2dpY19DQ0IgKikgQnVzX3RvX1ZpcnR1YWwoTmV4dEluY29taW5nTWFpbGJveC0+Q0NCKTsKKwkJaWYgKENvbXBsZXRpb25Db2RlICE9IEJ1c0xvZ2ljX0Fib3J0ZWRDb21tYW5kTm90Rm91bmQpIHsKKwkJCWlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfQWN0aXZlIHx8IENDQi0+U3RhdHVzID09IEJ1c0xvZ2ljX0NDQl9SZXNldCkgeworCQkJCS8qCisJCQkJICAgU2F2ZSB0aGUgQ29tcGxldGlvbiBDb2RlIGZvciB0aGlzIENDQiBhbmQgcXVldWUgdGhlIENDQgorCQkJCSAgIGZvciBjb21wbGV0aW9uIHByb2Nlc3NpbmcuCisJCQkJICovCisJCQkJQ0NCLT5Db21wbGV0aW9uQ29kZSA9IENvbXBsZXRpb25Db2RlOworCQkJCUJ1c0xvZ2ljX1F1ZXVlQ29tcGxldGVkQ0NCKENDQik7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICAgSWYgYSBDQ0IgZXZlciBhcHBlYXJzIGluIGFuIEluY29taW5nIE1haWxib3ggYW5kIGlzIG5vdCBtYXJrZWQKKwkJCQkgICBhcyBzdGF0dXMgQWN0aXZlIG9yIFJlc2V0LCB0aGVuIHRoZXJlIGlzIG1vc3QgbGlrZWx5IGEgYnVnIGluCisJCQkJICAgdGhlIEhvc3QgQWRhcHRlciBmaXJtd2FyZS4KKwkJCQkgKi8KKwkJCQlCdXNMb2dpY19XYXJuaW5nKCJJbGxlZ2FsIENDQiAjJWxkIHN0YXR1cyAlZCBpbiAiICJJbmNvbWluZyBNYWlsYm94XG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIENDQi0+U3RhdHVzKTsKKwkJCX0KKwkJfQorCQlOZXh0SW5jb21pbmdNYWlsYm94LT5Db21wbGV0aW9uQ29kZSA9IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveEZyZWU7CisJCWlmICgrK05leHRJbmNvbWluZ01haWxib3ggPiBIb3N0QWRhcHRlci0+TGFzdEluY29taW5nTWFpbGJveCkKKwkJCU5leHRJbmNvbWluZ01haWxib3ggPSBIb3N0QWRhcHRlci0+Rmlyc3RJbmNvbWluZ01haWxib3g7CisJfQorCUhvc3RBZGFwdGVyLT5OZXh0SW5jb21pbmdNYWlsYm94ID0gTmV4dEluY29taW5nTWFpbGJveDsKK30KKworCisvKgorICBCdXNMb2dpY19Qcm9jZXNzQ29tcGxldGVkQ0NCcyBpdGVyYXRlcyBvdmVyIHRoZSBjb21wbGV0ZWQgQ0NCcyBmb3IgSG9zdAorICBBZGFwdGVyIHNldHRpbmcgdGhlIFNDU0kgQ29tbWFuZCBSZXN1bHQgQ29kZXMsIGRlYWxsb2NhdGluZyB0aGUgQ0NCcywgYW5kCisgIGNhbGxpbmcgdGhlIFNDU0kgU3Vic3lzdGVtIENvbXBsZXRpb24gUm91dGluZXMuICBUaGUgSG9zdCBBZGFwdGVyJ3MgTG9jaworICBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWNxdWlyZWQgYnkgdGhlIGNhbGxlci4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX1Byb2Nlc3NDb21wbGV0ZWRDQ0JzKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJaWYgKEhvc3RBZGFwdGVyLT5Qcm9jZXNzQ29tcGxldGVkQ0NCc0FjdGl2ZSkKKwkJcmV0dXJuOworCUhvc3RBZGFwdGVyLT5Qcm9jZXNzQ29tcGxldGVkQ0NCc0FjdGl2ZSA9IHRydWU7CisJd2hpbGUgKEhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQiAhPSBOVUxMKSB7CisJCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQiA9IEhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQjsKKwkJc3RydWN0IHNjc2lfY21uZCAqQ29tbWFuZCA9IENDQi0+Q29tbWFuZDsKKwkJSG9zdEFkYXB0ZXItPkZpcnN0Q29tcGxldGVkQ0NCID0gQ0NCLT5OZXh0OworCQlpZiAoSG9zdEFkYXB0ZXItPkZpcnN0Q29tcGxldGVkQ0NCID09IE5VTEwpCisJCQlIb3N0QWRhcHRlci0+TGFzdENvbXBsZXRlZENDQiA9IE5VTEw7CisJCS8qCisJCSAgIFByb2Nlc3MgdGhlIENvbXBsZXRlZCBDQ0IuCisJCSAqLworCQlpZiAoQ0NCLT5PcGNvZGUgPT0gQnVzTG9naWNfQnVzRGV2aWNlUmVzZXQpIHsKKwkJCWludCBUYXJnZXRJRCA9IENDQi0+VGFyZ2V0SUQ7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJCdXMgRGV2aWNlIFJlc2V0IENDQiAjJWxkIHRvIFRhcmdldCAiICIlZCBDb21wbGV0ZWRcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgVGFyZ2V0SUQpOworCQkJQnVzTG9naWNfSW5jcmVtZW50RXJyb3JDb3VudGVyKCZIb3N0QWRhcHRlci0+VGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQnVzRGV2aWNlUmVzZXRzQ29tcGxldGVkKTsKKwkJCUhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF0uVGFnZ2VkUXVldWluZ0FjdGl2ZSA9IGZhbHNlOworCQkJSG9zdEFkYXB0ZXItPkNvbW1hbmRzU2luY2VSZXNldFtUYXJnZXRJRF0gPSAwOworCQkJSG9zdEFkYXB0ZXItPkxhc3RSZXNldENvbXBsZXRlZFtUYXJnZXRJRF0gPSBqaWZmaWVzOworCQkJLyoKKwkJCSAgIFBsYWNlIENDQiBiYWNrIG9uIHRoZSBIb3N0IEFkYXB0ZXIncyBmcmVlIGxpc3QuCisJCQkgKi8KKwkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKyNpZiAwCQkJCS8qIHRoaXMgbmVlZHMgdG8gYmUgcmVkb25lIGRpZmZlcmVudCBmb3IgbmV3IEVIICovCisJCQkvKgorCQkJICAgQnVzIERldmljZSBSZXNldCBDQ0JzIGhhdmUgdGhlIENvbW1hbmQgZmllbGQgbm9uLU5VTEwgb25seSB3aGVuIGEKKwkJCSAgIEJ1cyBEZXZpY2UgUmVzZXQgd2FzIHJlcXVlc3RlZCBmb3IgYSBDb21tYW5kIHRoYXQgZGlkIG5vdCBoYXZlIGEKKwkJCSAgIGN1cnJlbnRseSBhY3RpdmUgQ0NCIGluIHRoZSBIb3N0IEFkYXB0ZXIgKGkuZS4sIGEgU3luY2hyb25vdXMKKwkJCSAgIEJ1cyBEZXZpY2UgUmVzZXQpLCBhbmQgaGVuY2Ugd291bGQgbm90IGhhdmUgaXRzIENvbXBsZXRpb24gUm91dGluZQorCQkJICAgY2FsbGVkIG90aGVyd2lzZS4KKwkJCSAqLworCQkJd2hpbGUgKENvbW1hbmQgIT0gTlVMTCkgeworCQkJCXN0cnVjdCBzY3NpX2NtbmQgKk5leHRDb21tYW5kID0gQ29tbWFuZC0+cmVzZXRfY2hhaW47CisJCQkJQ29tbWFuZC0+cmVzZXRfY2hhaW4gPSBOVUxMOworCQkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCQlDb21tYW5kLT5zY3NpX2RvbmUoQ29tbWFuZCk7CisJCQkJQ29tbWFuZCA9IE5leHRDb21tYW5kOworCQkJfQorI2VuZGlmCisJCQkvKgorCQkJICAgSXRlcmF0ZSBvdmVyIHRoZSBDQ0JzIGZvciB0aGlzIEhvc3QgQWRhcHRlciBwZXJmb3JtaW5nIGNvbXBsZXRpb24KKwkJCSAgIHByb2Nlc3NpbmcgZm9yIGFueSBDQ0JzIG1hcmtlZCBhcyBSZXNldCBmb3IgdGhpcyBUYXJnZXQuCisJCQkgKi8KKwkJCWZvciAoQ0NCID0gSG9zdEFkYXB0ZXItPkFsbF9DQ0JzOyBDQ0IgIT0gTlVMTDsgQ0NCID0gQ0NCLT5OZXh0QWxsKQorCQkJCWlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfUmVzZXQgJiYgQ0NCLT5UYXJnZXRJRCA9PSBUYXJnZXRJRCkgeworCQkJCQlDb21tYW5kID0gQ0NCLT5Db21tYW5kOworCQkJCQlCdXNMb2dpY19EZWFsbG9jYXRlQ0NCKENDQik7CisJCQkJCUhvc3RBZGFwdGVyLT5BY3RpdmVDb21tYW5kc1tUYXJnZXRJRF0tLTsKKwkJCQkJQ29tbWFuZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCQlDb21tYW5kLT5zY3NpX2RvbmUoQ29tbWFuZCk7CisJCQkJfQorCQkJSG9zdEFkYXB0ZXItPkJ1c0RldmljZVJlc2V0UGVuZGluZ0NDQltUYXJnZXRJRF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAgIFRyYW5zbGF0ZSB0aGUgQ29tcGxldGlvbiBDb2RlLCBIb3N0IEFkYXB0ZXIgU3RhdHVzLCBhbmQgVGFyZ2V0CisJCQkgICBEZXZpY2UgU3RhdHVzIGludG8gYSBTQ1NJIFN1YnN5c3RlbSBSZXN1bHQgQ29kZS4KKwkJCSAqLworCQkJc3dpdGNoIChDQ0ItPkNvbXBsZXRpb25Db2RlKSB7CisJCQljYXNlIEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveEZyZWU6CisJCQljYXNlIEJ1c0xvZ2ljX0Fib3J0ZWRDb21tYW5kTm90Rm91bmQ6CisJCQljYXNlIEJ1c0xvZ2ljX0ludmFsaWRDQ0I6CisJCQkJQnVzTG9naWNfV2FybmluZygiQ0NCICMlbGQgdG8gVGFyZ2V0ICVkIEltcG9zc2libGUgU3RhdGVcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgQ0NCLT5UYXJnZXRJRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJ1c0xvZ2ljX0NvbW1hbmRDb21wbGV0ZWRXaXRob3V0RXJyb3I6CisJCQkJSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3NbQ0NCLT5UYXJnZXRJRF0KKwkJCQkgICAgLkNvbW1hbmRzQ29tcGxldGVkKys7CisJCQkJSG9zdEFkYXB0ZXItPlRhcmdldEZsYWdzW0NDQi0+VGFyZ2V0SURdCisJCQkJICAgIC5Db21tYW5kU3VjY2Vzc2Z1bEZsYWcgPSB0cnVlOworCQkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQnVzTG9naWNfQ29tbWFuZEFib3J0ZWRBdEhvc3RSZXF1ZXN0OgorCQkJCUJ1c0xvZ2ljX1dhcm5pbmcoIkNDQiAjJWxkIHRvIFRhcmdldCAlZCBBYm9ydGVkXG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIENDQi0+VGFyZ2V0SUQpOworCQkJCUJ1c0xvZ2ljX0luY3JlbWVudEVycm9yQ291bnRlcigmSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3NbQ0NCLT5UYXJnZXRJRF0KKwkJCQkJCQkgICAgICAgLkNvbW1hbmRBYm9ydHNDb21wbGV0ZWQpOworCQkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQnVzTG9naWNfQ29tbWFuZENvbXBsZXRlZFdpdGhFcnJvcjoKKwkJCQlDb21tYW5kLT5yZXN1bHQgPSBCdXNMb2dpY19Db21wdXRlUmVzdWx0Q29kZShIb3N0QWRhcHRlciwgQ0NCLT5Ib3N0QWRhcHRlclN0YXR1cywgQ0NCLT5UYXJnZXREZXZpY2VTdGF0dXMpOworCQkJCWlmIChDQ0ItPkhvc3RBZGFwdGVyU3RhdHVzICE9IEJ1c0xvZ2ljX1NDU0lTZWxlY3Rpb25UaW1lb3V0KSB7CisJCQkJCUhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzW0NDQi0+VGFyZ2V0SURdCisJCQkJCSAgICAuQ29tbWFuZHNDb21wbGV0ZWQrKzsKKwkJCQkJaWYgKEJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VFcnJvcnMpIHsKKwkJCQkJCWludCBpOworCQkJCQkJQnVzTG9naWNfTm90aWNlKCJDQ0IgIyVsZCBUYXJnZXQgJWQ6IFJlc3VsdCAlWCBIb3N0ICIKKwkJCQkJCQkJIkFkYXB0ZXIgU3RhdHVzICUwMlggIiAiVGFyZ2V0IFN0YXR1cyAlMDJYXG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIENDQi0+VGFyZ2V0SUQsIENvbW1hbmQtPnJlc3VsdCwgQ0NCLT5Ib3N0QWRhcHRlclN0YXR1cywgQ0NCLT5UYXJnZXREZXZpY2VTdGF0dXMpOworCQkJCQkJQnVzTG9naWNfTm90aWNlKCJDREIgICAiLCBIb3N0QWRhcHRlcik7CisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgQ0NCLT5DREJfTGVuZ3RoOyBpKyspCisJCQkJCQkJQnVzTG9naWNfTm90aWNlKCIgJTAyWCIsIEhvc3RBZGFwdGVyLCBDQ0ItPkNEQltpXSk7CisJCQkJCQlCdXNMb2dpY19Ob3RpY2UoIlxuIiwgSG9zdEFkYXB0ZXIpOworCQkJCQkJQnVzTG9naWNfTm90aWNlKCJTZW5zZSAiLCBIb3N0QWRhcHRlcik7CisJCQkJCQlmb3IgKGkgPSAwOyBpIDwgQ0NCLT5TZW5zZURhdGFMZW5ndGg7IGkrKykKKwkJCQkJCQlCdXNMb2dpY19Ob3RpY2UoIiAlMDJYIiwgSG9zdEFkYXB0ZXIsIENvbW1hbmQtPnNlbnNlX2J1ZmZlcltpXSk7CisJCQkJCQlCdXNMb2dpY19Ob3RpY2UoIlxuIiwgSG9zdEFkYXB0ZXIpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAgIFdoZW4gYW4gSU5RVUlSWSBjb21tYW5kIGNvbXBsZXRlcyBub3JtYWxseSwgc2F2ZSB0aGUKKwkJCSAgIENtZFF1ZSAoVGFnZ2VkIFF1ZXVpbmcgU3VwcG9ydGVkKSBhbmQgV0J1czE2ICgxNiBCaXQKKwkJCSAgIFdpZGUgRGF0YSBUcmFuc2ZlcnMgU3VwcG9ydGVkKSBiaXRzLgorCQkJICovCisJCQlpZiAoQ0NCLT5DREJbMF0gPT0gSU5RVUlSWSAmJiBDQ0ItPkNEQlsxXSA9PSAwICYmIENDQi0+SG9zdEFkYXB0ZXJTdGF0dXMgPT0gQnVzTG9naWNfQ29tbWFuZENvbXBsZXRlZE5vcm1hbGx5KSB7CisJCQkJc3RydWN0IEJ1c0xvZ2ljX1RhcmdldEZsYWdzICpUYXJnZXRGbGFncyA9ICZIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbQ0NCLT5UYXJnZXRJRF07CisJCQkJc3RydWN0IFNDU0lfSW5xdWlyeSAqSW5xdWlyeVJlc3VsdCA9IChzdHJ1Y3QgU0NTSV9JbnF1aXJ5ICopIENvbW1hbmQtPnJlcXVlc3RfYnVmZmVyOworCQkJCVRhcmdldEZsYWdzLT5UYXJnZXRFeGlzdHMgPSB0cnVlOworCQkJCVRhcmdldEZsYWdzLT5UYWdnZWRRdWV1aW5nU3VwcG9ydGVkID0gSW5xdWlyeVJlc3VsdC0+Q21kUXVlOworCQkJCVRhcmdldEZsYWdzLT5XaWRlVHJhbnNmZXJzU3VwcG9ydGVkID0gSW5xdWlyeVJlc3VsdC0+V0J1czE2OworCQkJfQorCQkJLyoKKwkJCSAgIFBsYWNlIENDQiBiYWNrIG9uIHRoZSBIb3N0IEFkYXB0ZXIncyBmcmVlIGxpc3QuCisJCQkgKi8KKwkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKwkJCS8qCisJCQkgICBDYWxsIHRoZSBTQ1NJIENvbW1hbmQgQ29tcGxldGlvbiBSb3V0aW5lLgorCQkJICovCisJCQlDb21tYW5kLT5zY3NpX2RvbmUoQ29tbWFuZCk7CisJCX0KKwl9CisJSG9zdEFkYXB0ZXItPlByb2Nlc3NDb21wbGV0ZWRDQ0JzQWN0aXZlID0gZmFsc2U7Cit9CisKKworLyoKKyAgQnVzTG9naWNfSW50ZXJydXB0SGFuZGxlciBoYW5kbGVzIGhhcmR3YXJlIGludGVycnVwdHMgZnJvbSBCdXNMb2dpYyBIb3N0CisgIEFkYXB0ZXJzLgorKi8KKworc3RhdGljIGlycXJldHVybl90IEJ1c0xvZ2ljX0ludGVycnVwdEhhbmRsZXIoaW50IElSUV9DaGFubmVsLCB2b2lkICpEZXZpY2VJZGVudGlmaWVyLCBzdHJ1Y3QgcHRfcmVncyAqSW50ZXJydXB0UmVnaXN0ZXJzKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIERldmljZUlkZW50aWZpZXI7CisJdW5zaWduZWQgbG9uZyBQcm9jZXNzb3JGbGFnczsKKwkvKgorCSAgIEFjcXVpcmUgZXhjbHVzaXZlIGFjY2VzcyB0byBIb3N0IEFkYXB0ZXIuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrLCBQcm9jZXNzb3JGbGFncyk7CisJLyoKKwkgICBIYW5kbGUgSW50ZXJydXB0cyBhcHByb3ByaWF0ZWx5IGZvciBlYWNoIEhvc3QgQWRhcHRlciB0eXBlLgorCSAqLworCWlmIChCdXNMb2dpY19NdWx0aU1hc3Rlckhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJdW5pb24gQnVzTG9naWNfSW50ZXJydXB0UmVnaXN0ZXIgSW50ZXJydXB0UmVnaXN0ZXI7CisJCS8qCisJCSAgIFJlYWQgdGhlIEhvc3QgQWRhcHRlciBJbnRlcnJ1cHQgUmVnaXN0ZXIuCisJCSAqLworCQlJbnRlcnJ1cHRSZWdpc3Rlci5BbGwgPSBCdXNMb2dpY19SZWFkSW50ZXJydXB0UmVnaXN0ZXIoSG9zdEFkYXB0ZXIpOworCQlpZiAoSW50ZXJydXB0UmVnaXN0ZXIuaXIuSW50ZXJydXB0VmFsaWQpIHsKKwkJCS8qCisJCQkgICBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGFuZCByZXNldCB0aGUgSG9zdCBBZGFwdGVyCisJCQkgICBJbnRlcnJ1cHQgUmVnaXN0ZXIuCisJCQkgKi8KKwkJCUJ1c0xvZ2ljX0ludGVycnVwdFJlc2V0KEhvc3RBZGFwdGVyKTsKKwkJCS8qCisJCQkgICBQcm9jZXNzIHZhbGlkIEV4dGVybmFsIFNDU0kgQnVzIFJlc2V0IGFuZCBJbmNvbWluZyBNYWlsYm94CisJCQkgICBMb2FkZWQgSW50ZXJydXB0cy4gIENvbW1hbmQgQ29tcGxldGUgSW50ZXJydXB0cyBhcmUgbm90ZWQsCisJCQkgICBhbmQgT3V0Z29pbmcgTWFpbGJveCBBdmFpbGFibGUgSW50ZXJydXB0cyBhcmUgaWdub3JlZCwgYXMKKwkJCSAgIHRoZXkgYXJlIG5ldmVyIGVuYWJsZWQuCisJCQkgKi8KKwkJCWlmIChJbnRlcnJ1cHRSZWdpc3Rlci5pci5FeHRlcm5hbEJ1c1Jlc2V0KQorCQkJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckV4dGVybmFsUmVzZXQgPSB0cnVlOworCQkJZWxzZSBpZiAoSW50ZXJydXB0UmVnaXN0ZXIuaXIuSW5jb21pbmdNYWlsYm94TG9hZGVkKQorCQkJCUJ1c0xvZ2ljX1NjYW5JbmNvbWluZ01haWxib3hlcyhIb3N0QWRhcHRlcik7CisJCQllbHNlIGlmIChJbnRlcnJ1cHRSZWdpc3Rlci5pci5Db21tYW5kQ29tcGxldGUpCisJCQkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyQ29tbWFuZENvbXBsZXRlZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgICBDaGVjayBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgaW50ZXJydXB0IGZvciB0aGlzIEhvc3QgQWRhcHRlci4KKwkJICovCisJCWlmIChGbGFzaFBvaW50X0ludGVycnVwdFBlbmRpbmcoSG9zdEFkYXB0ZXItPkNhcmRIYW5kbGUpKQorCQkJc3dpdGNoIChGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdChIb3N0QWRhcHRlci0+Q2FyZEhhbmRsZSkpIHsKKwkJCWNhc2UgRmxhc2hQb2ludF9Ob3JtYWxJbnRlcnJ1cHQ6CisJCQkJYnJlYWs7CisJCQljYXNlIEZsYXNoUG9pbnRfRXh0ZXJuYWxCdXNSZXNldDoKKwkJCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJFeHRlcm5hbFJlc2V0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRmxhc2hQb2ludF9JbnRlcm5hbEVycm9yOgorCQkJCUJ1c0xvZ2ljX1dhcm5pbmcoIkludGVybmFsIEZsYXNoUG9pbnQgRXJyb3IgZGV0ZWN0ZWQiICIgLSBSZXNldHRpbmcgSG9zdCBBZGFwdGVyXG4iLCBIb3N0QWRhcHRlcik7CisJCQkJSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVySW50ZXJuYWxFcnJvciA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCS8qCisJICAgUHJvY2VzcyBhbnkgY29tcGxldGVkIENDQnMuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5GaXJzdENvbXBsZXRlZENDQiAhPSBOVUxMKQorCQlCdXNMb2dpY19Qcm9jZXNzQ29tcGxldGVkQ0NCcyhIb3N0QWRhcHRlcik7CisJLyoKKwkgICBSZXNldCB0aGUgSG9zdCBBZGFwdGVyIGlmIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyRXh0ZXJuYWxSZXNldCkgeworCQlCdXNMb2dpY19XYXJuaW5nKCJSZXNldHRpbmcgJXMgZHVlIHRvIEV4dGVybmFsIFNDU0kgQnVzIFJlc2V0XG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCQlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJkhvc3RBZGFwdGVyLT5FeHRlcm5hbEhvc3RBZGFwdGVyUmVzZXRzKTsKKwkJQnVzTG9naWNfUmVzZXRIb3N0QWRhcHRlcihIb3N0QWRhcHRlciwgZmFsc2UpOworCQlIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJFeHRlcm5hbFJlc2V0ID0gZmFsc2U7CisJfSBlbHNlIGlmIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJJbnRlcm5hbEVycm9yKSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlJlc2V0dGluZyAlcyBkdWUgdG8gSG9zdCBBZGFwdGVyIEludGVybmFsIEVycm9yXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCQlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJkhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckludGVybmFsRXJyb3JzKTsKKwkJQnVzTG9naWNfUmVzZXRIb3N0QWRhcHRlcihIb3N0QWRhcHRlciwgdHJ1ZSk7CisJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckludGVybmFsRXJyb3IgPSBmYWxzZTsKKwl9CisJLyoKKwkgICBSZWxlYXNlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gSG9zdCBBZGFwdGVyLgorCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrLCBQcm9jZXNzb3JGbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1dyaXRlT3V0Z29pbmdNYWlsYm94IHBsYWNlcyBDQ0IgYW5kIEFjdGlvbiBDb2RlIGludG8gYW4gT3V0Z29pbmcKKyAgTWFpbGJveCBmb3IgZXhlY3V0aW9uIGJ5IEhvc3QgQWRhcHRlci4gIFRoZSBIb3N0IEFkYXB0ZXIncyBMb2NrIHNob3VsZAorICBhbHJlYWR5IGhhdmUgYmVlbiBhY3F1aXJlZCBieSB0aGUgY2FsbGVyLgorKi8KKworc3RhdGljIGJvb2xlYW4gQnVzTG9naWNfV3JpdGVPdXRnb2luZ01haWxib3goc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyCisJCQkJCSAgICAgKkhvc3RBZGFwdGVyLCBlbnVtIEJ1c0xvZ2ljX0FjdGlvbkNvZGUgQWN0aW9uQ29kZSwgc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCKQoreworCXN0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3ggKk5leHRPdXRnb2luZ01haWxib3g7CisJTmV4dE91dGdvaW5nTWFpbGJveCA9IEhvc3RBZGFwdGVyLT5OZXh0T3V0Z29pbmdNYWlsYm94OworCWlmIChOZXh0T3V0Z29pbmdNYWlsYm94LT5BY3Rpb25Db2RlID09IEJ1c0xvZ2ljX091dGdvaW5nTWFpbGJveEZyZWUpIHsKKwkJQ0NCLT5TdGF0dXMgPSBCdXNMb2dpY19DQ0JfQWN0aXZlOworCQkvKgorCQkgICBUaGUgQ0NCIGZpZWxkIG11c3QgYmUgd3JpdHRlbiBiZWZvcmUgdGhlIEFjdGlvbiBDb2RlIGZpZWxkIHNpbmNlCisJCSAgIHRoZSBIb3N0IEFkYXB0ZXIgaXMgb3BlcmF0aW5nIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgbG9ja2luZyBjb2RlCisJCSAgIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBzaW11bHRhbmVvdXMgYWNjZXNzIGJ5IHRoZSBIb3N0IEFkYXB0ZXIuCisJCSAqLworCQlOZXh0T3V0Z29pbmdNYWlsYm94LT5DQ0IgPSBDQ0ItPkRNQV9IYW5kbGU7CisJCU5leHRPdXRnb2luZ01haWxib3gtPkFjdGlvbkNvZGUgPSBBY3Rpb25Db2RlOworCQlCdXNMb2dpY19TdGFydE1haWxib3hDb21tYW5kKEhvc3RBZGFwdGVyKTsKKwkJaWYgKCsrTmV4dE91dGdvaW5nTWFpbGJveCA+IEhvc3RBZGFwdGVyLT5MYXN0T3V0Z29pbmdNYWlsYm94KQorCQkJTmV4dE91dGdvaW5nTWFpbGJveCA9IEhvc3RBZGFwdGVyLT5GaXJzdE91dGdvaW5nTWFpbGJveDsKKwkJSG9zdEFkYXB0ZXItPk5leHRPdXRnb2luZ01haWxib3ggPSBOZXh0T3V0Z29pbmdNYWlsYm94OworCQlpZiAoQWN0aW9uQ29kZSA9PSBCdXNMb2dpY19NYWlsYm94U3RhcnRDb21tYW5kKSB7CisJCQlIb3N0QWRhcHRlci0+QWN0aXZlQ29tbWFuZHNbQ0NCLT5UYXJnZXRJRF0rKzsKKwkJCWlmIChDQ0ItPk9wY29kZSAhPSBCdXNMb2dpY19CdXNEZXZpY2VSZXNldCkKKwkJCQlIb3N0QWRhcHRlci0+VGFyZ2V0U3RhdGlzdGljc1tDQ0ItPlRhcmdldElEXS5Db21tYW5kc0F0dGVtcHRlZCsrOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIEVycm9yIEhhbmRsaW5nIChFSCkgc3VwcG9ydCAqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJdW5zaWduZWQgaW50IGlkID0gU0NwbnQtPmRldmljZS0+aWQ7CisJc3RydWN0IEJ1c0xvZ2ljX1RhcmdldFN0YXRpc3RpY3MgKnN0YXRzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzW2lkXTsKKwlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJnN0YXRzLT5Ib3N0QWRhcHRlclJlc2V0c1JlcXVlc3RlZCk7CisKKwlyZXR1cm4gQnVzTG9naWNfUmVzZXRIb3N0QWRhcHRlcihIb3N0QWRhcHRlciwgZmFsc2UpOworfQorCisvKgorICBCdXNMb2dpY19RdWV1ZUNvbW1hbmQgY3JlYXRlcyBhIENDQiBmb3IgQ29tbWFuZCBhbmQgcGxhY2VzIGl0IGludG8gYW4KKyAgT3V0Z29pbmcgTWFpbGJveCBmb3IgZXhlY3V0aW9uIGJ5IHRoZSBhc3NvY2lhdGVkIEhvc3QgQWRhcHRlci4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfUXVldWVDb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKkNvbW1hbmQsIHZvaWQgKCpDb21wbGV0aW9uUm91dGluZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlciA9IChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKikgQ29tbWFuZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tDb21tYW5kLT5kZXZpY2UtPmlkXTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0U3RhdGlzdGljcyAqVGFyZ2V0U3RhdGlzdGljcyA9IEhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzOworCXVuc2lnbmVkIGNoYXIgKkNEQiA9IENvbW1hbmQtPmNtbmQ7CisJaW50IENEQl9MZW5ndGggPSBDb21tYW5kLT5jbWRfbGVuOworCWludCBUYXJnZXRJRCA9IENvbW1hbmQtPmRldmljZS0+aWQ7CisJaW50IExvZ2ljYWxVbml0ID0gQ29tbWFuZC0+ZGV2aWNlLT5sdW47CisJdm9pZCAqQnVmZmVyUG9pbnRlciA9IENvbW1hbmQtPnJlcXVlc3RfYnVmZmVyOworCWludCBCdWZmZXJMZW5ndGggPSBDb21tYW5kLT5yZXF1ZXN0X2J1ZmZsZW47CisJaW50IFNlZ21lbnRDb3VudCA9IENvbW1hbmQtPnVzZV9zZzsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpDQ0I7CisJLyoKKwkgICBTQ1NJIFJFUVVFU1RfU0VOU0UgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBIb3N0CisJICAgQWRhcHRlciBmb3IgYW55IGVycm9ycywgc28gdGhleSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGV4cGxpY2l0bHkgdW5sZXNzCisJICAgdGhlIFNlbnNlIERhdGEgaXMgemVybyBpbmRpY2F0aW5nIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQuCisJICovCisJaWYgKENEQlswXSA9PSBSRVFVRVNUX1NFTlNFICYmIENvbW1hbmQtPnNlbnNlX2J1ZmZlclswXSAhPSAwKSB7CisJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJQ29tcGxldGlvblJvdXRpbmUoQ29tbWFuZCk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAgIEFsbG9jYXRlIGEgQ0NCIGZyb20gdGhlIEhvc3QgQWRhcHRlcidzIGZyZWUgbGlzdC4gIEluIHRoZSB1bmxpa2VseSBldmVudAorCSAgIHRoYXQgdGhlcmUgYXJlIG5vbmUgYXZhaWxhYmxlIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgd2FpdCAxIHNlY29uZAorCSAgIGFuZCB0cnkgYWdhaW4uICBJZiB0aGF0IGZhaWxzLCB0aGUgSG9zdCBBZGFwdGVyIGlzIHByb2JhYmx5IGh1bmcgc28gc2lnbmFsCisJICAgYW4gZXJyb3IgYXMgYSBIb3N0IEFkYXB0ZXIgSGFyZCBSZXNldCBzaG91bGQgYmUgaW5pdGlhdGVkIHNvb24uCisJICovCisJQ0NCID0gQnVzTG9naWNfQWxsb2NhdGVDQ0IoSG9zdEFkYXB0ZXIpOworCWlmIChDQ0IgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJQnVzTG9naWNfRGVsYXkoMSk7CisJCXNwaW5fbG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJQ0NCID0gQnVzTG9naWNfQWxsb2NhdGVDQ0IoSG9zdEFkYXB0ZXIpOworCQlpZiAoQ0NCID09IE5VTEwpIHsKKwkJCUNvbW1hbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCUNvbXBsZXRpb25Sb3V0aW5lKENvbW1hbmQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgICBJbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhlIEJ1c0xvZ2ljIENvbW1hbmQgQ29udHJvbCBCbG9jayAoQ0NCKS4KKwkgKi8KKwlpZiAoU2VnbWVudENvdW50ID09IDAgJiYgQnVmZmVyTGVuZ3RoICE9IDApIHsKKwkJQ0NCLT5PcGNvZGUgPSBCdXNMb2dpY19Jbml0aWF0b3JDQ0I7CisJCUNDQi0+RGF0YUxlbmd0aCA9IEJ1ZmZlckxlbmd0aDsKKwkJQ0NCLT5EYXRhUG9pbnRlciA9IHBjaV9tYXBfc2luZ2xlKEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLAorCQkJCUJ1ZmZlclBvaW50ZXIsIEJ1ZmZlckxlbmd0aCwKKwkJCQlDb21tYW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfSBlbHNlIGlmIChTZWdtZW50Q291bnQgIT0gMCkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKlNjYXR0ZXJMaXN0ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBCdWZmZXJQb2ludGVyOworCQlpbnQgU2VnbWVudCwgQ291bnQ7CisKKwkJQ291bnQgPSBwY2lfbWFwX3NnKEhvc3RBZGFwdGVyLT5QQ0lfRGV2aWNlLCBTY2F0dGVyTGlzdCwgU2VnbWVudENvdW50LAorCQkJCUNvbW1hbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJQ0NCLT5PcGNvZGUgPSBCdXNMb2dpY19Jbml0aWF0b3JDQ0JfU2NhdHRlckdhdGhlcjsKKwkJQ0NCLT5EYXRhTGVuZ3RoID0gQ291bnQgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1NjYXR0ZXJHYXRoZXJTZWdtZW50KTsKKwkJaWYgKEJ1c0xvZ2ljX011bHRpTWFzdGVySG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSkKKwkJCUNDQi0+RGF0YVBvaW50ZXIgPSAodW5zaWduZWQgaW50KSBDQ0ItPkRNQV9IYW5kbGUgKyAoKHVuc2lnbmVkIGxvbmcpICZDQ0ItPlNjYXR0ZXJHYXRoZXJMaXN0IC0gKHVuc2lnbmVkIGxvbmcpIENDQik7CisJCWVsc2UKKwkJCUNDQi0+RGF0YVBvaW50ZXIgPSBWaXJ0dWFsX3RvXzMyQml0X1ZpcnR1YWwoQ0NCLT5TY2F0dGVyR2F0aGVyTGlzdCk7CisJCWZvciAoU2VnbWVudCA9IDA7IFNlZ21lbnQgPCBDb3VudDsgU2VnbWVudCsrKSB7CisJCQlDQ0ItPlNjYXR0ZXJHYXRoZXJMaXN0W1NlZ21lbnRdLlNlZ21lbnRCeXRlQ291bnQgPSBzZ19kbWFfbGVuKFNjYXR0ZXJMaXN0ICsgU2VnbWVudCk7CisJCQlDQ0ItPlNjYXR0ZXJHYXRoZXJMaXN0W1NlZ21lbnRdLlNlZ21lbnREYXRhUG9pbnRlciA9IHNnX2RtYV9hZGRyZXNzKFNjYXR0ZXJMaXN0ICsgU2VnbWVudCk7CisJCX0KKwl9IGVsc2UgeworCQlDQ0ItPk9wY29kZSA9IEJ1c0xvZ2ljX0luaXRpYXRvckNDQjsKKwkJQ0NCLT5EYXRhTGVuZ3RoID0gQnVmZmVyTGVuZ3RoOworCQlDQ0ItPkRhdGFQb2ludGVyID0gMDsKKwl9CisJc3dpdGNoIChDREJbMF0pIHsKKwljYXNlIFJFQURfNjoKKwljYXNlIFJFQURfMTA6CisJCUNDQi0+RGF0YURpcmVjdGlvbiA9IEJ1c0xvZ2ljX0RhdGFJbkxlbmd0aENoZWNrZWQ7CisJCVRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kcysrOworCQlCdXNMb2dpY19JbmNyZW1lbnRCeXRlQ291bnRlcigmVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uVG90YWxCeXRlc1JlYWQsIEJ1ZmZlckxlbmd0aCk7CisJCUJ1c0xvZ2ljX0luY3JlbWVudFNpemVCdWNrZXQoVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0cywgQnVmZmVyTGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV82OgorCWNhc2UgV1JJVEVfMTA6CisJCUNDQi0+RGF0YURpcmVjdGlvbiA9IEJ1c0xvZ2ljX0RhdGFPdXRMZW5ndGhDaGVja2VkOworCQlUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRzKys7CisJCUJ1c0xvZ2ljX0luY3JlbWVudEJ5dGVDb3VudGVyKCZUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzV3JpdHRlbiwgQnVmZmVyTGVuZ3RoKTsKKwkJQnVzTG9naWNfSW5jcmVtZW50U2l6ZUJ1Y2tldChUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0cywgQnVmZmVyTGVuZ3RoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0NCLT5EYXRhRGlyZWN0aW9uID0gQnVzTG9naWNfVW5jaGVja2VkRGF0YVRyYW5zZmVyOworCQlicmVhazsKKwl9CisJQ0NCLT5DREJfTGVuZ3RoID0gQ0RCX0xlbmd0aDsKKwlDQ0ItPkhvc3RBZGFwdGVyU3RhdHVzID0gMDsKKwlDQ0ItPlRhcmdldERldmljZVN0YXR1cyA9IDA7CisJQ0NCLT5UYXJnZXRJRCA9IFRhcmdldElEOworCUNDQi0+TG9naWNhbFVuaXQgPSBMb2dpY2FsVW5pdDsKKwlDQ0ItPlRhZ0VuYWJsZSA9IGZhbHNlOworCUNDQi0+TGVnYWN5VGFnRW5hYmxlID0gZmFsc2U7CisJLyoKKwkgICBCdXNMb2dpYyByZWNvbW1lbmRzIHRoYXQgYWZ0ZXIgYSBSZXNldCB0aGUgZmlyc3QgY291cGxlIG9mIGNvbW1hbmRzIHRoYXQKKwkgICBhcmUgc2VudCB0byBhIFRhcmdldCBEZXZpY2UgYmUgc2VudCBpbiBhIG5vbiBUYWdnZWQgUXVldWUgZmFzaGlvbiBzbyB0aGF0CisJICAgdGhlIEhvc3QgQWRhcHRlciBhbmQgVGFyZ2V0IERldmljZSBjYW4gZXN0YWJsaXNoIFN5bmNocm9ub3VzIGFuZCBXaWRlCisJICAgVHJhbnNmZXIgYmVmb3JlIFF1ZXVlIFRhZyBtZXNzYWdlcyBjYW4gaW50ZXJmZXJlIHdpdGggdGhlIFN5bmNocm9ub3VzIGFuZAorCSAgIFdpZGUgTmVnb3RpYXRpb24gbWVzc2FnZXMuICBCeSB3YWl0aW5nIHRvIGVuYWJsZSBUYWdnZWQgUXVldWluZyB1bnRpbCBhZnRlcgorCSAgIHRoZSBmaXJzdCBCdXNMb2dpY19NYXhUYWdnZWRRdWV1ZURlcHRoIGNvbW1hbmRzIGhhdmUgYmVlbiBxdWV1ZWQsIGl0IGlzCisJICAgYXNzdXJlZCB0aGF0IGFmdGVyIGEgUmVzZXQgYW55IHBlbmRpbmcgY29tbWFuZHMgYXJlIHJlcXVldWVkIGJlZm9yZSBUYWdnZWQKKwkgICBRdWV1aW5nIGlzIGVuYWJsZWQgYW5kIHRoYXQgdGhlIFRhZ2dlZCBRdWV1aW5nIG1lc3NhZ2Ugd2lsbCBub3Qgb2NjdXIgd2hpbGUKKwkgICB0aGUgcGFydGl0aW9uIHRhYmxlIGlzIGJlaW5nIHByaW50ZWQuICBJbiBhZGRpdGlvbiwgc29tZSBkZXZpY2VzIGRvIG5vdAorCSAgIHByb3Blcmx5IGhhbmRsZSB0aGUgdHJhbnNpdGlvbiBmcm9tIG5vbi10YWdnZWQgdG8gdGFnZ2VkIGNvbW1hbmRzLCBzbyBpdCBpcworCSAgIG5lY2Vzc2FyeSB0byB3YWl0IHVudGlsIHRoZXJlIGFyZSBubyBwZW5kaW5nIGNvbW1hbmRzIGZvciBhIHRhcmdldCBkZXZpY2UKKwkgICBiZWZvcmUgcXVldWluZyB0YWdnZWQgY29tbWFuZHMuCisJICovCisJaWYgKEhvc3RBZGFwdGVyLT5Db21tYW5kc1NpbmNlUmVzZXRbVGFyZ2V0SURdKysgPj0KKwkgICAgQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aCAmJiAhVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdBY3RpdmUgJiYgSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSA9PSAwICYmIFRhcmdldEZsYWdzLT5UYWdnZWRRdWV1aW5nU3VwcG9ydGVkICYmIChIb3N0QWRhcHRlci0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmICgxIDw8IFRhcmdldElEKSkpIHsKKwkJVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdBY3RpdmUgPSB0cnVlOworCQlCdXNMb2dpY19Ob3RpY2UoIlRhZ2dlZCBRdWV1aW5nIG5vdyBhY3RpdmUgZm9yIFRhcmdldCAlZFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwl9CisJaWYgKFRhcmdldEZsYWdzLT5UYWdnZWRRdWV1aW5nQWN0aXZlKSB7CisJCWVudW0gQnVzTG9naWNfUXVldWVUYWcgUXVldWVUYWcgPSBCdXNMb2dpY19TaW1wbGVRdWV1ZVRhZzsKKwkJLyoKKwkJICAgV2hlbiB1c2luZyBUYWdnZWQgUXVldWluZyB3aXRoIFNpbXBsZSBRdWV1ZSBUYWdzLCBpdCBhcHBlYXJzIHRoYXQgZGlzaworCQkgICBkcml2ZSBjb250cm9sbGVycyBkbyBub3QgZ3VhcmFudGVlIHRoYXQgYSBxdWV1ZWQgY29tbWFuZCB3aWxsIG5vdAorCQkgICByZW1haW4gaW4gYSBkaXNjb25uZWN0ZWQgc3RhdGUgaW5kZWZpbml0ZWx5IGlmIGNvbW1hbmRzIHRoYXQgcmVhZCBvcgorCQkgICB3cml0ZSBuZWFyZXIgdGhlIGhlYWQgcG9zaXRpb24gY29udGludWUgdG8gYXJyaXZlIHdpdGhvdXQgaW50ZXJydXB0aW9uLgorCQkgICBUaGVyZWZvcmUsIGZvciBlYWNoIFRhcmdldCBEZXZpY2UgdGhpcyBkcml2ZXIga2VlcHMgdHJhY2sgb2YgdGhlIGxhc3QKKwkJICAgdGltZSBlaXRoZXIgdGhlIHF1ZXVlIHdhcyBlbXB0eSBvciBhbiBPcmRlcmVkIFF1ZXVlIFRhZyB3YXMgaXNzdWVkLiAgSWYKKwkJICAgbW9yZSB0aGFuIDQgc2Vjb25kcyAob25lIGZpZnRoIG9mIHRoZSAyMCBzZWNvbmQgZGlzayB0aW1lb3V0KSBoYXZlCisJCSAgIGVsYXBzZWQgc2luY2UgdGhpcyBsYXN0IHNlcXVlbmNlIHBvaW50LCB0aGlzIGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQKKwkJICAgd2l0aCBhbiBPcmRlcmVkIFF1ZXVlIFRhZyByYXRoZXIgdGhhbiBhIFNpbXBsZSBRdWV1ZSBUYWcsIHdoaWNoIGZvcmNlcworCQkgICB0aGUgVGFyZ2V0IERldmljZSB0byBjb21wbGV0ZSBhbGwgcHJldmlvdXNseSBxdWV1ZWQgY29tbWFuZHMgYmVmb3JlCisJCSAgIHRoaXMgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuCisJCSAqLworCQlpZiAoSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSA9PSAwKQorCQkJSG9zdEFkYXB0ZXItPkxhc3RTZXF1ZW5jZVBvaW50W1RhcmdldElEXSA9IGppZmZpZXM7CisJCWVsc2UgaWYgKGppZmZpZXMgLSBIb3N0QWRhcHRlci0+TGFzdFNlcXVlbmNlUG9pbnRbVGFyZ2V0SURdID4gNCAqIEhaKSB7CisJCQlIb3N0QWRhcHRlci0+TGFzdFNlcXVlbmNlUG9pbnRbVGFyZ2V0SURdID0gamlmZmllczsKKwkJCVF1ZXVlVGFnID0gQnVzTG9naWNfT3JkZXJlZFF1ZXVlVGFnOworCQl9CisJCWlmIChIb3N0QWRhcHRlci0+RXh0ZW5kZWRMVU5TdXBwb3J0KSB7CisJCQlDQ0ItPlRhZ0VuYWJsZSA9IHRydWU7CisJCQlDQ0ItPlF1ZXVlVGFnID0gUXVldWVUYWc7CisJCX0gZWxzZSB7CisJCQlDQ0ItPkxlZ2FjeVRhZ0VuYWJsZSA9IHRydWU7CisJCQlDQ0ItPkxlZ2FjeVF1ZXVlVGFnID0gUXVldWVUYWc7CisJCX0KKwl9CisJbWVtY3B5KENDQi0+Q0RCLCBDREIsIENEQl9MZW5ndGgpOworCUNDQi0+U2Vuc2VEYXRhTGVuZ3RoID0gc2l6ZW9mKENvbW1hbmQtPnNlbnNlX2J1ZmZlcik7CisJQ0NCLT5TZW5zZURhdGFQb2ludGVyID0gcGNpX21hcF9zaW5nbGUoSG9zdEFkYXB0ZXItPlBDSV9EZXZpY2UsIENvbW1hbmQtPnNlbnNlX2J1ZmZlciwgQ0NCLT5TZW5zZURhdGFMZW5ndGgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJQ0NCLT5Db21tYW5kID0gQ29tbWFuZDsKKwlDb21tYW5kLT5zY3NpX2RvbmUgPSBDb21wbGV0aW9uUm91dGluZTsKKwlpZiAoQnVzTG9naWNfTXVsdGlNYXN0ZXJIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpKSB7CisJCS8qCisJCSAgIFBsYWNlIHRoZSBDQ0IgaW4gYW4gT3V0Z29pbmcgTWFpbGJveC4gIFRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBTQ1NJCisJCSAgIFN1YnN5c3RlbSBzaG91bGQgbm90IGF0dGVtcHQgdG8gcXVldWUgbW9yZSBjb21tYW5kcyB0aGFuIGNhbiBiZSBwbGFjZWQKKwkJICAgaW4gT3V0Z29pbmcgTWFpbGJveGVzLCBzbyB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIG9uZSBmcmVlLiAgSW4gdGhlCisJCSAgIHVubGlrZWx5IGV2ZW50IHRoYXQgdGhlcmUgYXJlIG5vbmUgYXZhaWxhYmxlLCB3YWl0IDEgc2Vjb25kIGFuZCB0cnkKKwkJICAgYWdhaW4uICBJZiB0aGF0IGZhaWxzLCB0aGUgSG9zdCBBZGFwdGVyIGlzIHByb2JhYmx5IGh1bmcgc28gc2lnbmFsIGFuCisJCSAgIGVycm9yIGFzIGEgSG9zdCBBZGFwdGVyIEhhcmQgUmVzZXQgc2hvdWxkIGJlIGluaXRpYXRlZCBzb29uLgorCQkgKi8KKwkJaWYgKCFCdXNMb2dpY19Xcml0ZU91dGdvaW5nTWFpbGJveChIb3N0QWRhcHRlciwgQnVzTG9naWNfTWFpbGJveFN0YXJ0Q29tbWFuZCwgQ0NCKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKEhvc3RBZGFwdGVyLT5TQ1NJX0hvc3QtPmhvc3RfbG9jayk7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJVbmFibGUgdG8gd3JpdGUgT3V0Z29pbmcgTWFpbGJveCAtICIgIlBhdXNpbmcgZm9yIDEgc2Vjb25kXG4iLCBIb3N0QWRhcHRlcik7CisJCQlCdXNMb2dpY19EZWxheSgxKTsKKwkJCXNwaW5fbG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJCWlmICghQnVzTG9naWNfV3JpdGVPdXRnb2luZ01haWxib3goSG9zdEFkYXB0ZXIsIEJ1c0xvZ2ljX01haWxib3hTdGFydENvbW1hbmQsIENDQikpIHsKKwkJCQlCdXNMb2dpY19XYXJuaW5nKCJTdGlsbCB1bmFibGUgdG8gd3JpdGUgT3V0Z29pbmcgTWFpbGJveCAtICIgIkhvc3QgQWRhcHRlciBEZWFkP1xuIiwgSG9zdEFkYXB0ZXIpOworCQkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKwkJCQlDb21tYW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJQ29tbWFuZC0+c2NzaV9kb25lKENvbW1hbmQpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICAgQ2FsbCB0aGUgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIgdG8gc3RhcnQgZXhlY3V0aW9uIG9mIHRoZSBDQ0IuCisJCSAqLworCQlDQ0ItPlN0YXR1cyA9IEJ1c0xvZ2ljX0NDQl9BY3RpdmU7CisJCUhvc3RBZGFwdGVyLT5BY3RpdmVDb21tYW5kc1tUYXJnZXRJRF0rKzsKKwkJVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQ29tbWFuZHNBdHRlbXB0ZWQrKzsKKwkJRmxhc2hQb2ludF9TdGFydENDQihIb3N0QWRhcHRlci0+Q2FyZEhhbmRsZSwgQ0NCKTsKKwkJLyoKKwkJICAgVGhlIENvbW1hbmQgbWF5IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgYW5kIEJ1c0xvZ2ljX1F1ZXVlQ29tcGxldGVkQ0NCCisJCSAgIGJlZW4gY2FsbGVkLCBvciBpdCBtYXkgc3RpbGwgYmUgcGVuZGluZy4KKwkJICovCisJCWlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfQ29tcGxldGVkKQorCQkJQnVzTG9naWNfUHJvY2Vzc0NvbXBsZXRlZENDQnMoSG9zdEFkYXB0ZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICBCdXNMb2dpY19BYm9ydENvbW1hbmQgYWJvcnRzIENvbW1hbmQgaWYgcG9zc2libGUuCisqLworCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0Fib3J0Q29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpDb21tYW5kKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIENvbW1hbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlpbnQgVGFyZ2V0SUQgPSBDb21tYW5kLT5kZXZpY2UtPmlkOworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQjsKKwlCdXNMb2dpY19JbmNyZW1lbnRFcnJvckNvdW50ZXIoJkhvc3RBZGFwdGVyLT5UYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzUmVxdWVzdGVkKTsKKwkvKgorCSAgIElmIHRoaXMgQ29tbWFuZCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHRoZW4gbm8gQWJvcnQgaXMgbmVjZXNzYXJ5LgorCSAqLworCWlmIChDb21tYW5kLT5zZXJpYWxfbnVtYmVyICE9IENvbW1hbmQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCkgeworCQlCdXNMb2dpY19XYXJuaW5nKCJVbmFibGUgdG8gQWJvcnQgQ29tbWFuZCB0byBUYXJnZXQgJWQgLSAiICJBbHJlYWR5IENvbXBsZXRlZFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCS8qCisJICAgQXR0ZW1wdCB0byBmaW5kIGFuIEFjdGl2ZSBDQ0IgZm9yIHRoaXMgQ29tbWFuZC4gIElmIG5vIEFjdGl2ZSBDQ0IgZm9yIHRoaXMKKwkgICBDb21tYW5kIGlzIGZvdW5kLCB0aGVuIG5vIEFib3J0IGlzIG5lY2Vzc2FyeS4KKwkgKi8KKwlmb3IgKENDQiA9IEhvc3RBZGFwdGVyLT5BbGxfQ0NCczsgQ0NCICE9IE5VTEw7IENDQiA9IENDQi0+TmV4dEFsbCkKKwkJaWYgKENDQi0+Q29tbWFuZCA9PSBDb21tYW5kKQorCQkJYnJlYWs7CisJaWYgKENDQiA9PSBOVUxMKSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDb21tYW5kIHRvIFRhcmdldCAlZCAtICIgIk5vIENDQiBGb3VuZFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfSBlbHNlIGlmIChDQ0ItPlN0YXR1cyA9PSBCdXNMb2dpY19DQ0JfQ29tcGxldGVkKSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDb21tYW5kIHRvIFRhcmdldCAlZCAtICIgIkNDQiBDb21wbGV0ZWRcbiIsIEhvc3RBZGFwdGVyLCBUYXJnZXRJRCk7CisJCXJldHVybiBTVUNDRVNTOworCX0gZWxzZSBpZiAoQ0NCLT5TdGF0dXMgPT0gQnVzTG9naWNfQ0NCX1Jlc2V0KSB7CisJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDb21tYW5kIHRvIFRhcmdldCAlZCAtICIgIkNDQiBSZXNldFxuIiwgSG9zdEFkYXB0ZXIsIFRhcmdldElEKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCWlmIChCdXNMb2dpY19NdWx0aU1hc3Rlckhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikpIHsKKwkJLyoKKwkJICAgQXR0ZW1wdCB0byBBYm9ydCB0aGlzIENDQi4gIE11bHRpTWFzdGVyIEZpcm13YXJlIHZlcnNpb25zIHByaW9yIHRvIDUueHgKKwkJICAgZG8gbm90IGdlbmVyYXRlIEFib3J0IFRhZyBtZXNzYWdlcywgYnV0IG9ubHkgZ2VuZXJhdGUgdGhlIG5vbi10YWdnZWQKKwkJICAgQWJvcnQgbWVzc2FnZS4gIFNpbmNlIG5vbi10YWdnZWQgY29tbWFuZHMgYXJlIG5vdCBzZW50IGJ5IHRoZSBIb3N0CisJCSAgIEFkYXB0ZXIgdW50aWwgdGhlIHF1ZXVlIG9mIG91dHN0YW5kaW5nIHRhZ2dlZCBjb21tYW5kcyBoYXMgY29tcGxldGVkLAorCQkgICBhbmQgdGhlIEFib3J0IG1lc3NhZ2UgaXMgdHJlYXRlZCBhcyBhIG5vbi10YWdnZWQgY29tbWFuZCwgaXQgaXMKKwkJICAgZWZmZWN0aXZlbHkgaW1wb3NzaWJsZSB0byBhYm9ydCBjb21tYW5kcyB3aGVuIFRhZ2dlZCBRdWV1aW5nIGlzIGFjdGl2ZS4KKwkJICAgRmlybXdhcmUgdmVyc2lvbiA1Lnh4IGRvZXMgZ2VuZXJhdGUgQWJvcnQgVGFnIG1lc3NhZ2VzLCBzbyBpdCBpcworCQkgICBwb3NzaWJsZSB0byBhYm9ydCBjb21tYW5kcyB3aGVuIFRhZ2dlZCBRdWV1aW5nIGlzIGFjdGl2ZS4KKwkJICovCisJCWlmIChIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdLlRhZ2dlZFF1ZXVpbmdBY3RpdmUgJiYgSG9zdEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvblswXSA8ICc1JykgeworCQkJQnVzTG9naWNfV2FybmluZygiVW5hYmxlIHRvIEFib3J0IENDQiAjJWxkIHRvIFRhcmdldCAlZCAtICIgIkFib3J0IFRhZyBOb3QgU3VwcG9ydGVkXG4iLCBIb3N0QWRhcHRlciwgQ0NCLT5TZXJpYWxOdW1iZXIsIFRhcmdldElEKTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9IGVsc2UgaWYgKEJ1c0xvZ2ljX1dyaXRlT3V0Z29pbmdNYWlsYm94KEhvc3RBZGFwdGVyLCBCdXNMb2dpY19NYWlsYm94QWJvcnRDb21tYW5kLCBDQ0IpKSB7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJBYm9ydGluZyBDQ0IgIyVsZCB0byBUYXJnZXQgJWRcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgVGFyZ2V0SUQpOworCQkJQnVzTG9naWNfSW5jcmVtZW50RXJyb3JDb3VudGVyKCZIb3N0QWRhcHRlci0+VGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQ29tbWFuZEFib3J0c0F0dGVtcHRlZCk7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCUJ1c0xvZ2ljX1dhcm5pbmcoIlVuYWJsZSB0byBBYm9ydCBDQ0IgIyVsZCB0byBUYXJnZXQgJWQgLSAiICJObyBPdXRnb2luZyBNYWlsYm94ZXNcbiIsIEhvc3RBZGFwdGVyLCBDQ0ItPlNlcmlhbE51bWJlciwgVGFyZ2V0SUQpOworCQkJcmV0dXJuIEZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgICBDYWxsIHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciB0byBhYm9ydCBleGVjdXRpb24gb2YgdGhlIENDQi4KKwkJICovCisJCUJ1c0xvZ2ljX1dhcm5pbmcoIkFib3J0aW5nIENDQiAjJWxkIHRvIFRhcmdldCAlZFxuIiwgSG9zdEFkYXB0ZXIsIENDQi0+U2VyaWFsTnVtYmVyLCBUYXJnZXRJRCk7CisJCUJ1c0xvZ2ljX0luY3JlbWVudEVycm9yQ291bnRlcigmSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkNvbW1hbmRBYm9ydHNBdHRlbXB0ZWQpOworCQlGbGFzaFBvaW50X0Fib3J0Q0NCKEhvc3RBZGFwdGVyLT5DYXJkSGFuZGxlLCBDQ0IpOworCQkvKgorCQkgICBUaGUgQWJvcnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCBhbmQKKwkJICAgQnVzTG9naWNfUXVldWVDb21wbGV0ZWRDQ0IgYmVlbiBjYWxsZWQsIG9yIGl0CisJCSAgIG1heSBzdGlsbCBiZSBwZW5kaW5nLgorCQkgKi8KKwkJaWYgKENDQi0+U3RhdHVzID09IEJ1c0xvZ2ljX0NDQl9Db21wbGV0ZWQpIHsKKwkJCUJ1c0xvZ2ljX1Byb2Nlc3NDb21wbGV0ZWRDQ0JzKEhvc3RBZGFwdGVyKTsKKwkJfQorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX1Jlc2V0SG9zdEFkYXB0ZXIgcmVzZXRzIEhvc3QgQWRhcHRlciBpZiBwb3NzaWJsZSwgbWFya2luZyBhbGwKKyAgY3VycmVudGx5IGV4ZWN1dGluZyBTQ1NJIENvbW1hbmRzIGFzIGhhdmluZyBiZWVuIFJlc2V0LgorKi8KKworc3RhdGljIGludCBCdXNMb2dpY19SZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIsIGJvb2xlYW4gSGFyZFJlc2V0KQoreworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkNDQjsKKwlpbnQgVGFyZ2V0SUQ7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gUmVzZXQgYW5kIFJlaW5pdGlhbGl6ZSB0aGUgSG9zdCBBZGFwdGVyLgorCSAqLworCisJaWYgKCEoQnVzTG9naWNfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKEhvc3RBZGFwdGVyLCBIYXJkUmVzZXQpICYmIEJ1c0xvZ2ljX0luaXRpYWxpemVIb3N0QWRhcHRlcihIb3N0QWRhcHRlcikpKSB7CisJCUJ1c0xvZ2ljX0Vycm9yKCJSZXNldHRpbmcgJXMgRmFpbGVkXG4iLCBIb3N0QWRhcHRlciwgSG9zdEFkYXB0ZXItPkZ1bGxNb2RlbE5hbWUpOworCQlyZXR1cm4gRkFJTFVSRTsKKwl9CisKKwkvKgorCSAqIERlYWxsb2NhdGUgYWxsIGN1cnJlbnRseSBleGVjdXRpbmcgQ0NCcy4KKwkgKi8KKworCWZvciAoQ0NCID0gSG9zdEFkYXB0ZXItPkFsbF9DQ0JzOyBDQ0IgIT0gTlVMTDsgQ0NCID0gQ0NCLT5OZXh0QWxsKQorCQlpZiAoQ0NCLT5TdGF0dXMgPT0gQnVzTG9naWNfQ0NCX0FjdGl2ZSkKKwkJCUJ1c0xvZ2ljX0RlYWxsb2NhdGVDQ0IoQ0NCKTsKKwkvKgorCSAqIFdhaXQgYSBmZXcgc2Vjb25kcyBiZXR3ZWVuIHRoZSBIb3N0IEFkYXB0ZXIgSGFyZCBSZXNldCB3aGljaAorCSAqIGluaXRpYXRlcyBhIFNDU0kgQnVzIFJlc2V0IGFuZCBpc3N1aW5nIGFueSBTQ1NJIENvbW1hbmRzLiAgU29tZQorCSAqIFNDU0kgZGV2aWNlcyBnZXQgY29uZnVzZWQgaWYgdGhleSByZWNlaXZlIFNDU0kgQ29tbWFuZHMgdG9vIHNvb24KKwkgKiBhZnRlciBhIFNDU0kgQnVzIFJlc2V0LgorCSAqLworCisJaWYgKEhhcmRSZXNldCkgeworCQlzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPlNDU0lfSG9zdC0+aG9zdF9sb2NrKTsKKwkJQnVzTG9naWNfRGVsYXkoSG9zdEFkYXB0ZXItPkJ1c1NldHRsZVRpbWUpOworCQlzcGluX2xvY2tfaXJxKEhvc3RBZGFwdGVyLT5TQ1NJX0hvc3QtPmhvc3RfbG9jayk7CisJfQorCisJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJSG9zdEFkYXB0ZXItPkxhc3RSZXNldEF0dGVtcHRlZFtUYXJnZXRJRF0gPSBqaWZmaWVzOworCQlIb3N0QWRhcHRlci0+TGFzdFJlc2V0Q29tcGxldGVkW1RhcmdldElEXSA9IGppZmZpZXM7CisJfQorCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICBCdXNMb2dpY19CSU9TRGlza1BhcmFtZXRlcnMgcmV0dXJucyB0aGUgSGVhZHMvU2VjdG9ycy9DeWxpbmRlcnMgQklPUyBEaXNrCisgIFBhcmFtZXRlcnMgZm9yIERpc2suICBUaGUgZGVmYXVsdCBkaXNrIGdlb21ldHJ5IGlzIDY0IGhlYWRzLCAzMiBzZWN0b3JzLCBhbmQKKyAgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBjeWxpbmRlcnMgc28gYXMgbm90IHRvIGV4Y2VlZCBkcml2ZSBjYXBhY2l0eS4gIEluCisgIG9yZGVyIGZvciBkaXNrcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiAxIEdCIHRvIGJlIGFkZHJlc3NhYmxlIGJ5IHRoZSBCSU9TCisgIHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBCSU9TIGxpbWl0YXRpb24gb2YgMTAyNCBjeWxpbmRlcnMsIEV4dGVuZGVkIFRyYW5zbGF0aW9uCisgIG1heSBiZSBlbmFibGVkIGluIEF1dG9TQ1NJIG9uIEZsYXNoUG9pbnQgSG9zdCBBZGFwdGVycyBhbmQgb24gIlciIGFuZCAiQyIKKyAgc2VyaWVzIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMsIG9yIGJ5IGEgZGlwIHN3aXRjaCBzZXR0aW5nIG9uICJTIiBhbmQgIkEiCisgIHNlcmllcyBNdWx0aU1hc3RlciBIb3N0IEFkYXB0ZXJzLiAgV2l0aCBFeHRlbmRlZCBUcmFuc2xhdGlvbiBlbmFibGVkLCBkcml2ZXMKKyAgYmV0d2VlbiAxIEdCIGluY2x1c2l2ZSBhbmQgMiBHQiBleGNsdXNpdmUgYXJlIGdpdmVuIGEgZGlzayBnZW9tZXRyeSBvZiAxMjgKKyAgaGVhZHMgYW5kIDMyIHNlY3RvcnMsIGFuZCBkcml2ZXMgYWJvdmUgMiBHQiBpbmNsdXNpdmUgYXJlIGdpdmVuIGEgZGlzaworICBnZW9tZXRyeSBvZiAyNTUgaGVhZHMgYW5kIDYzIHNlY3RvcnMuICBIb3dldmVyLCBpZiB0aGUgQklPUyBkZXRlY3RzIHRoYXQgdGhlCisgIEV4dGVuZGVkIFRyYW5zbGF0aW9uIHNldHRpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIGdlb21ldHJ5IGluIHRoZSBwYXJ0aXRpb24KKyAgdGFibGUsIHRoZW4gdGhlIHRyYW5zbGF0aW9uIGluZmVycmVkIGZyb20gdGhlIHBhcnRpdGlvbiB0YWJsZSB3aWxsIGJlIHVzZWQgYnkKKyAgdGhlIEJJT1MsIGFuZCBhIHdhcm5pbmcgbWF5IGJlIGRpc3BsYXllZC4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfQklPU0Rpc2tQYXJhbWV0ZXJzKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqRGV2aWNlLCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICpQYXJhbWV0ZXJzKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBCSU9TX0Rpc2tQYXJhbWV0ZXJzICpEaXNrUGFyYW1ldGVycyA9IChzdHJ1Y3QgQklPU19EaXNrUGFyYW1ldGVycyAqKSBQYXJhbWV0ZXJzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpZiAoSG9zdEFkYXB0ZXItPkV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkICYmIGNhcGFjaXR5ID49IDIgKiAxMDI0ICogMTAyNCAvKiAxIEdCIGluIDUxMiBieXRlIHNlY3RvcnMgKi8gKSB7CisJCWlmIChjYXBhY2l0eSA+PSA0ICogMTAyNCAqIDEwMjQgLyogMiBHQiBpbiA1MTIgYnl0ZSBzZWN0b3JzICovICkgeworCQkJRGlza1BhcmFtZXRlcnMtPkhlYWRzID0gMjU1OworCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSA2MzsKKwkJfSBlbHNlIHsKKwkJCURpc2tQYXJhbWV0ZXJzLT5IZWFkcyA9IDEyODsKKwkJCURpc2tQYXJhbWV0ZXJzLT5TZWN0b3JzID0gMzI7CisJCX0KKwl9IGVsc2UgeworCQlEaXNrUGFyYW1ldGVycy0+SGVhZHMgPSA2NDsKKwkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSAzMjsKKwl9CisJRGlza1BhcmFtZXRlcnMtPkN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChEaXNrUGFyYW1ldGVycy0+SGVhZHMgKiBEaXNrUGFyYW1ldGVycy0+U2VjdG9ycyk7CisJYnVmID0gc2NzaV9iaW9zX3B0YWJsZShEZXZpY2UpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLyoKKwkgICBJZiB0aGUgYm9vdCBzZWN0b3IgcGFydGl0aW9uIHRhYmxlIGZsYWcgaXMgdmFsaWQsIHNlYXJjaCBmb3IgYSBwYXJ0aXRpb24KKwkgICB0YWJsZSBlbnRyeSB3aG9zZSBlbmRfaGVhZCBtYXRjaGVzIG9uZSBvZiB0aGUgc3RhbmRhcmQgQnVzTG9naWMgZ2VvbWV0cnkKKwkgICB0cmFuc2xhdGlvbnMgKDY0LzMyLCAxMjgvMzIsIG9yIDI1NS82MykuCisJICovCisJaWYgKCoodW5zaWduZWQgc2hvcnQgKikgKGJ1ZiArIDY0KSA9PSAweEFBNTUpIHsKKwkJc3RydWN0IHBhcnRpdGlvbiAqRmlyc3RQYXJ0aXRpb25FbnRyeSA9IChzdHJ1Y3QgcGFydGl0aW9uICopIGJ1ZjsKKwkJc3RydWN0IHBhcnRpdGlvbiAqUGFydGl0aW9uRW50cnkgPSBGaXJzdFBhcnRpdGlvbkVudHJ5OworCQlpbnQgU2F2ZWRDeWxpbmRlcnMgPSBEaXNrUGFyYW1ldGVycy0+Q3lsaW5kZXJzLCBQYXJ0aXRpb25OdW1iZXI7CisJCXVuc2lnbmVkIGNoYXIgUGFydGl0aW9uRW50cnlFbmRIZWFkID0gMCwgUGFydGl0aW9uRW50cnlFbmRTZWN0b3IgPSAwOworCQlmb3IgKFBhcnRpdGlvbk51bWJlciA9IDA7IFBhcnRpdGlvbk51bWJlciA8IDQ7IFBhcnRpdGlvbk51bWJlcisrKSB7CisJCQlQYXJ0aXRpb25FbnRyeUVuZEhlYWQgPSBQYXJ0aXRpb25FbnRyeS0+ZW5kX2hlYWQ7CisJCQlQYXJ0aXRpb25FbnRyeUVuZFNlY3RvciA9IFBhcnRpdGlvbkVudHJ5LT5lbmRfc2VjdG9yICYgMHgzRjsKKwkJCWlmIChQYXJ0aXRpb25FbnRyeUVuZEhlYWQgPT0gNjQgLSAxKSB7CisJCQkJRGlza1BhcmFtZXRlcnMtPkhlYWRzID0gNjQ7CisJCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSAzMjsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoUGFydGl0aW9uRW50cnlFbmRIZWFkID09IDEyOCAtIDEpIHsKKwkJCQlEaXNrUGFyYW1ldGVycy0+SGVhZHMgPSAxMjg7CisJCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSAzMjsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoUGFydGl0aW9uRW50cnlFbmRIZWFkID09IDI1NSAtIDEpIHsKKwkJCQlEaXNrUGFyYW1ldGVycy0+SGVhZHMgPSAyNTU7CisJCQkJRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMgPSA2MzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCVBhcnRpdGlvbkVudHJ5Kys7CisJCX0KKwkJaWYgKFBhcnRpdGlvbk51bWJlciA9PSA0KSB7CisJCQlQYXJ0aXRpb25FbnRyeUVuZEhlYWQgPSBGaXJzdFBhcnRpdGlvbkVudHJ5LT5lbmRfaGVhZDsKKwkJCVBhcnRpdGlvbkVudHJ5RW5kU2VjdG9yID0gRmlyc3RQYXJ0aXRpb25FbnRyeS0+ZW5kX3NlY3RvciAmIDB4M0Y7CisJCX0KKwkJRGlza1BhcmFtZXRlcnMtPkN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChEaXNrUGFyYW1ldGVycy0+SGVhZHMgKiBEaXNrUGFyYW1ldGVycy0+U2VjdG9ycyk7CisJCWlmIChQYXJ0aXRpb25OdW1iZXIgPCA0ICYmIFBhcnRpdGlvbkVudHJ5RW5kU2VjdG9yID09IERpc2tQYXJhbWV0ZXJzLT5TZWN0b3JzKSB7CisJCQlpZiAoRGlza1BhcmFtZXRlcnMtPkN5bGluZGVycyAhPSBTYXZlZEN5bGluZGVycykKKwkJCQlCdXNMb2dpY19XYXJuaW5nKCJBZG9wdGluZyBHZW9tZXRyeSAlZC8lZCBmcm9tIFBhcnRpdGlvbiBUYWJsZVxuIiwgSG9zdEFkYXB0ZXIsIERpc2tQYXJhbWV0ZXJzLT5IZWFkcywgRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMpOworCQl9IGVsc2UgaWYgKFBhcnRpdGlvbkVudHJ5RW5kSGVhZCA+IDAgfHwgUGFydGl0aW9uRW50cnlFbmRTZWN0b3IgPiAwKSB7CisJCQlCdXNMb2dpY19XYXJuaW5nKCJXYXJuaW5nOiBQYXJ0aXRpb24gVGFibGUgYXBwZWFycyB0byAiICJoYXZlIEdlb21ldHJ5ICVkLyVkIHdoaWNoIGlzXG4iLCBIb3N0QWRhcHRlciwgUGFydGl0aW9uRW50cnlFbmRIZWFkICsgMSwgUGFydGl0aW9uRW50cnlFbmRTZWN0b3IpOworCQkJQnVzTG9naWNfV2FybmluZygibm90IGNvbXBhdGlibGUgd2l0aCBjdXJyZW50IEJ1c0xvZ2ljICIgIkhvc3QgQWRhcHRlciBHZW9tZXRyeSAlZC8lZFxuIiwgSG9zdEFkYXB0ZXIsIERpc2tQYXJhbWV0ZXJzLT5IZWFkcywgRGlza1BhcmFtZXRlcnMtPlNlY3RvcnMpOworCQl9CisJfQorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAgQnVnTG9naWNfUHJvY0RpcmVjdG9yeUluZm8gaW1wbGVtZW50cyAvcHJvYy9zY3NpL0J1c0xvZ2ljLzxOPi4KKyovCisKK3N0YXRpYyBpbnQgQnVzTG9naWNfUHJvY0RpcmVjdG9yeUluZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKlByb2NCdWZmZXIsIGNoYXIgKipTdGFydFBvaW50ZXIsIG9mZl90IE9mZnNldCwgaW50IEJ5dGVzQXZhaWxhYmxlLCBpbnQgV3JpdGVGbGFnKQoreworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICopIHNob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0U3RhdGlzdGljcyAqVGFyZ2V0U3RhdGlzdGljczsKKwlpbnQgVGFyZ2V0SUQsIExlbmd0aDsKKwljaGFyICpCdWZmZXI7CisKKwlUYXJnZXRTdGF0aXN0aWNzID0gSG9zdEFkYXB0ZXItPlRhcmdldFN0YXRpc3RpY3M7CisJaWYgKFdyaXRlRmxhZykgeworCQlIb3N0QWRhcHRlci0+RXh0ZXJuYWxIb3N0QWRhcHRlclJlc2V0cyA9IDA7CisJCUhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckludGVybmFsRXJyb3JzID0gMDsKKwkJbWVtc2V0KFRhcmdldFN0YXRpc3RpY3MsIDAsIEJ1c0xvZ2ljX01heFRhcmdldERldmljZXMgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1RhcmdldFN0YXRpc3RpY3MpKTsKKwkJcmV0dXJuIDA7CisJfQorCUJ1ZmZlciA9IEhvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyOworCUxlbmd0aCA9IEhvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyTGVuZ3RoOworCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIlxuXAorQ3VycmVudCBEcml2ZXIgUXVldWUgRGVwdGg6CSVkXG5cCitDdXJyZW50bHkgQWxsb2NhdGVkIENDQnM6CSVkXG4iLCBIb3N0QWRhcHRlci0+RHJpdmVyUXVldWVEZXB0aCwgSG9zdEFkYXB0ZXItPkFsbG9jYXRlZENDQnMpOworCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIlxuXG5cCisJCQkgICBEQVRBIFRSQU5TRkVSIFNUQVRJU1RJQ1NcblwKK1xuXAorVGFyZ2V0CVRhZ2dlZCBRdWV1aW5nCVF1ZXVlIERlcHRoICBBY3RpdmUgIEF0dGVtcHRlZAlDb21wbGV0ZWRcblwKKz09PT09PQk9PT09PT09PT09PT09PQk9PT09PT09PT09PSAgPT09PT09ICA9PT09PT09PT0JPT09PT09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIgICUyZAklcyIsIFRhcmdldElELCAoVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdTdXBwb3J0ZWQgPyAoVGFyZ2V0RmxhZ3MtPlRhZ2dlZFF1ZXVpbmdBY3RpdmUgPyAiICAgIEFjdGl2ZSIgOiAoSG9zdEFkYXB0ZXItPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWQgJiAoMSA8PCBUYXJnZXRJRCkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJICAgID8gIiAgUGVybWl0dGVkIiA6ICIgICBEaXNhYmxlZCIpKQorCQkJCQkJCQkJICA6ICJOb3QgU3VwcG9ydGVkIikpOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sCisJCQkJICAiCSAgICAlM2QgICAgICAgJTN1ICAgICU5dQklOXVcbiIsIEhvc3RBZGFwdGVyLT5RdWV1ZURlcHRoW1RhcmdldElEXSwgSG9zdEFkYXB0ZXItPkFjdGl2ZUNvbW1hbmRzW1RhcmdldElEXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQ29tbWFuZHNBdHRlbXB0ZWQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkNvbW1hbmRzQ29tcGxldGVkKTsKKwl9CisJTGVuZ3RoICs9IHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLCAiXG5cCitUYXJnZXQgIFJlYWQgQ29tbWFuZHMgIFdyaXRlIENvbW1hbmRzICAgVG90YWwgQnl0ZXMgUmVhZCAgICBUb3RhbCBCeXRlcyBXcml0dGVuXG5cCis9PT09PT0gID09PT09PT09PT09PT0gID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIgICUyZAkgICU5dQkgJTl1IiwgVGFyZ2V0SUQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kcywgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uV3JpdGVDb21tYW5kcyk7CisJCWlmIChUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzUmVhZC5CaWxsaW9ucyA+IDApCisJCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIgICAgICU5dSUwOXUiLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzUmVhZC5CaWxsaW9ucywgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uVG90YWxCeXRlc1JlYWQuVW5pdHMpOworCQllbHNlCisJCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICIJCSU5dSIsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlRvdGFsQnl0ZXNSZWFkLlVuaXRzKTsKKwkJaWYgKFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlRvdGFsQnl0ZXNXcml0dGVuLkJpbGxpb25zID4gMCkKKwkJCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIiAgICU5dSUwOXVcbiIsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlRvdGFsQnl0ZXNXcml0dGVuLkJpbGxpb25zLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ub3RhbEJ5dGVzV3JpdHRlbi5Vbml0cyk7CisJCWVsc2UKKwkJCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIgkgICAgICU5dVxuIiwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uVG90YWxCeXRlc1dyaXR0ZW4uVW5pdHMpOworCX0KKwlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICJcblwKK1RhcmdldCAgQ29tbWFuZCAgICAwLTFLQiAgICAgIDEtMktCICAgICAgMi00S0IgICAgICA0LThLQiAgICAgOC0xNktCXG5cCis9PT09PT0gID09PT09PT0gID09PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09PSAgPT09PT09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0KKwkJICAgIHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLAorCQkJICAgICIgICUyZAkgUmVhZAkgJTl1ICAlOXUgICU5dSAgJTl1ICAlOXVcbiIsIFRhcmdldElELAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbMF0sCisJCQkgICAgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1sxXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1syXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1szXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uUmVhZENvbW1hbmRTaXplQnVja2V0c1s0XSk7CisJCUxlbmd0aCArPQorCQkgICAgc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sCisJCQkgICAgIiAgJTJkCSBXcml0ZQkgJTl1ICAlOXUgICU5dSAgJTl1ICAlOXVcbiIsIFRhcmdldElELAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzBdLAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzFdLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1syXSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uV3JpdGVDb21tYW5kU2l6ZUJ1Y2tldHNbM10sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzRdKTsKKwl9CisJTGVuZ3RoICs9IHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLCAiXG5cCitUYXJnZXQgIENvbW1hbmQgICAxNi0zMktCICAgIDMyLTY0S0IgICA2NC0xMjhLQiAgIDEyOC0yNTZLQiAgIDI1NktCK1xuXAorPT09PT09ICA9PT09PT09ICA9PT09PT09PT0gID09PT09PT09PSAgPT09PT09PT09ICA9PT09PT09PT0gID09PT09PT09PVxuIik7CisJZm9yIChUYXJnZXRJRCA9IDA7IFRhcmdldElEIDwgSG9zdEFkYXB0ZXItPk1heFRhcmdldERldmljZXM7IFRhcmdldElEKyspIHsKKwkJc3RydWN0IEJ1c0xvZ2ljX1RhcmdldEZsYWdzICpUYXJnZXRGbGFncyA9ICZIb3N0QWRhcHRlci0+VGFyZ2V0RmxhZ3NbVGFyZ2V0SURdOworCQlpZiAoIVRhcmdldEZsYWdzLT5UYXJnZXRFeGlzdHMpCisJCQljb250aW51ZTsKKwkJTGVuZ3RoICs9CisJCSAgICBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwKKwkJCSAgICAiICAlMmQJIFJlYWQJICU5dSAgJTl1ICAlOXUgICU5dSAgJTl1XG4iLCBUYXJnZXRJRCwKKwkJCSAgICBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5SZWFkQ29tbWFuZFNpemVCdWNrZXRzWzVdLAorCQkJICAgIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbNl0sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbN10sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbOF0sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLlJlYWRDb21tYW5kU2l6ZUJ1Y2tldHNbOV0pOworCQlMZW5ndGggKz0KKwkJICAgIHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLAorCQkJICAgICIgICUyZAkgV3JpdGUJICU5dSAgJTl1ICAlOXUgICU5dSAgJTl1XG4iLCBUYXJnZXRJRCwKKwkJCSAgICBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1s1XSwKKwkJCSAgICBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1s2XSwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uV3JpdGVDb21tYW5kU2l6ZUJ1Y2tldHNbN10sIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLldyaXRlQ29tbWFuZFNpemVCdWNrZXRzWzhdLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Xcml0ZUNvbW1hbmRTaXplQnVja2V0c1s5XSk7CisJfQorCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIlxuXG5cCisJCQkgICBFUlJPUiBSRUNPVkVSWSBTVEFUSVNUSUNTXG5cCitcblwKKwkgIENvbW1hbmQgQWJvcnRzICAgICAgQnVzIERldmljZSBSZXNldHMJICBIb3N0IEFkYXB0ZXIgUmVzZXRzXG5cCitUYXJnZXQJUmVxdWVzdGVkIENvbXBsZXRlZCAgUmVxdWVzdGVkIENvbXBsZXRlZCAgUmVxdWVzdGVkIENvbXBsZXRlZFxuXAorICBJRAlcXFxcXFxcXCBBdHRlbXB0ZWQgLy8vLyAgXFxcXFxcXFwgQXR0ZW1wdGVkIC8vLy8gIFxcXFxcXFxcIEF0dGVtcHRlZCAvLy8vXG5cCis9PT09PT0JID09PT09ID09PT09ID09PT09ICAgID09PT09ID09PT09ID09PT09CSAgID09PT09ID09PT09ID09PT09XG4iKTsKKwlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBIb3N0QWRhcHRlci0+TWF4VGFyZ2V0RGV2aWNlczsgVGFyZ2V0SUQrKykgeworCQlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgKlRhcmdldEZsYWdzID0gJkhvc3RBZGFwdGVyLT5UYXJnZXRGbGFnc1tUYXJnZXRJRF07CisJCWlmICghVGFyZ2V0RmxhZ3MtPlRhcmdldEV4aXN0cykKKwkJCWNvbnRpbnVlOworCQlMZW5ndGggKz0gc3ByaW50ZigmQnVmZmVyW0xlbmd0aF0sICJcCisgICUyZAkgJTVkICU1ZCAlNWQgICAgJTVkICU1ZCAlNWQJICAgJTVkICU1ZCAlNWRcbiIsIFRhcmdldElELCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzUmVxdWVzdGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzQXR0ZW1wdGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Db21tYW5kQWJvcnRzQ29tcGxldGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5CdXNEZXZpY2VSZXNldHNSZXF1ZXN0ZWQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkJ1c0RldmljZVJlc2V0c0F0dGVtcHRlZCwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uQnVzRGV2aWNlUmVzZXRzQ29tcGxldGVkLCBUYXJnZXRTdGF0aXN0aWNzW1RhcmdldElEXS5Ib3N0QWRhcHRlclJlc2V0c1JlcXVlc3RlZCwgVGFyZ2V0U3RhdGlzdGljc1tUYXJnZXRJRF0uSG9zdEFkYXB0ZXJSZXNldHNBdHRlbXB0ZWQsIFRhcmdldFN0YXRpc3RpY3NbVGFyZ2V0SURdLkhvc3RBZGFwdGVyUmVzZXRzQ29tcGxldGVkKTsKKwl9CisJTGVuZ3RoICs9IHNwcmludGYoJkJ1ZmZlcltMZW5ndGhdLCAiXG5FeHRlcm5hbCBIb3N0IEFkYXB0ZXIgUmVzZXRzOiAlZFxuIiwgSG9zdEFkYXB0ZXItPkV4dGVybmFsSG9zdEFkYXB0ZXJSZXNldHMpOworCUxlbmd0aCArPSBzcHJpbnRmKCZCdWZmZXJbTGVuZ3RoXSwgIkhvc3QgQWRhcHRlciBJbnRlcm5hbCBFcnJvcnM6ICVkXG4iLCBIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJJbnRlcm5hbEVycm9ycyk7CisJaWYgKExlbmd0aCA+PSBCdXNMb2dpY19NZXNzYWdlQnVmZmVyU2l6ZSkKKwkJQnVzTG9naWNfRXJyb3IoIk1lc3NhZ2UgQnVmZmVyIGxlbmd0aCAlZCBleGNlZWRzIHNpemUgJWRcbiIsIEhvc3RBZGFwdGVyLCBMZW5ndGgsIEJ1c0xvZ2ljX01lc3NhZ2VCdWZmZXJTaXplKTsKKwlpZiAoKExlbmd0aCAtPSBPZmZzZXQpIDw9IDApCisJCXJldHVybiAwOworCWlmIChMZW5ndGggPj0gQnl0ZXNBdmFpbGFibGUpCisJCUxlbmd0aCA9IEJ5dGVzQXZhaWxhYmxlOworCW1lbWNweShQcm9jQnVmZmVyLCBIb3N0QWRhcHRlci0+TWVzc2FnZUJ1ZmZlciArIE9mZnNldCwgTGVuZ3RoKTsKKwkqU3RhcnRQb2ludGVyID0gUHJvY0J1ZmZlcjsKKwlyZXR1cm4gTGVuZ3RoOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX01lc3NhZ2UgcHJpbnRzIERyaXZlciBNZXNzYWdlcy4KKyovCisKK3N0YXRpYyB2b2lkIEJ1c0xvZ2ljX01lc3NhZ2UoZW51bSBCdXNMb2dpY19NZXNzYWdlTGV2ZWwgTWVzc2FnZUxldmVsLCBjaGFyICpGb3JtYXQsIHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIsIC4uLikKK3sKKwlzdGF0aWMgY2hhciBCdWZmZXJbQnVzTG9naWNfTGluZUJ1ZmZlclNpemVdOworCXN0YXRpYyBib29sZWFuIEJlZ2lubmluZ09mTGluZSA9IHRydWU7CisJdmFfbGlzdCBBcmd1bWVudHM7CisJaW50IExlbmd0aCA9IDA7CisJdmFfc3RhcnQoQXJndW1lbnRzLCBIb3N0QWRhcHRlcik7CisJTGVuZ3RoID0gdnNwcmludGYoQnVmZmVyLCBGb3JtYXQsIEFyZ3VtZW50cyk7CisJdmFfZW5kKEFyZ3VtZW50cyk7CisJaWYgKE1lc3NhZ2VMZXZlbCA9PSBCdXNMb2dpY19Bbm5vdW5jZUxldmVsKSB7CisJCXN0YXRpYyBpbnQgQW5ub3VuY2VtZW50TGluZXMgPSAwOworCQlzdHJjcHkoJkhvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyW0hvc3RBZGFwdGVyLT5NZXNzYWdlQnVmZmVyTGVuZ3RoXSwgQnVmZmVyKTsKKwkJSG9zdEFkYXB0ZXItPk1lc3NhZ2VCdWZmZXJMZW5ndGggKz0gTGVuZ3RoOworCQlpZiAoKytBbm5vdW5jZW1lbnRMaW5lcyA8PSAyKQorCQkJcHJpbnRrKCIlc3Njc2k6ICVzIiwgQnVzTG9naWNfTWVzc2FnZUxldmVsTWFwW01lc3NhZ2VMZXZlbF0sIEJ1ZmZlcik7CisJfSBlbHNlIGlmIChNZXNzYWdlTGV2ZWwgPT0gQnVzTG9naWNfSW5mb0xldmVsKSB7CisJCXN0cmNweSgmSG9zdEFkYXB0ZXItPk1lc3NhZ2VCdWZmZXJbSG9zdEFkYXB0ZXItPk1lc3NhZ2VCdWZmZXJMZW5ndGhdLCBCdWZmZXIpOworCQlIb3N0QWRhcHRlci0+TWVzc2FnZUJ1ZmZlckxlbmd0aCArPSBMZW5ndGg7CisJCWlmIChCZWdpbm5pbmdPZkxpbmUpIHsKKwkJCWlmIChCdWZmZXJbMF0gIT0gJ1xuJyB8fCBMZW5ndGggPiAxKQorCQkJCXByaW50aygiJXNzY3NpJWQ6ICVzIiwgQnVzTG9naWNfTWVzc2FnZUxldmVsTWFwW01lc3NhZ2VMZXZlbF0sIEhvc3RBZGFwdGVyLT5Ib3N0TnVtYmVyLCBCdWZmZXIpOworCQl9IGVsc2UKKwkJCXByaW50aygiJXMiLCBCdWZmZXIpOworCX0gZWxzZSB7CisJCWlmIChCZWdpbm5pbmdPZkxpbmUpIHsKKwkJCWlmIChIb3N0QWRhcHRlciAhPSBOVUxMICYmIEhvc3RBZGFwdGVyLT5Ib3N0QWRhcHRlckluaXRpYWxpemVkKQorCQkJCXByaW50aygiJXNzY3NpJWQ6ICVzIiwgQnVzTG9naWNfTWVzc2FnZUxldmVsTWFwW01lc3NhZ2VMZXZlbF0sIEhvc3RBZGFwdGVyLT5Ib3N0TnVtYmVyLCBCdWZmZXIpOworCQkJZWxzZQorCQkJCXByaW50aygiJXMlcyIsIEJ1c0xvZ2ljX01lc3NhZ2VMZXZlbE1hcFtNZXNzYWdlTGV2ZWxdLCBCdWZmZXIpOworCQl9IGVsc2UKKwkJCXByaW50aygiJXMiLCBCdWZmZXIpOworCX0KKwlCZWdpbm5pbmdPZkxpbmUgPSAoQnVmZmVyW0xlbmd0aCAtIDFdID09ICdcbicpOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCBwYXJzZXMgYW4gaW5kaXZpZHVhbCBvcHRpb24ga2V5d29yZC4gIEl0IHJldHVybnMgdHJ1ZQorICBhbmQgdXBkYXRlcyB0aGUgcG9pbnRlciBpZiB0aGUga2V5d29yZCBpcyByZWNvZ25pemVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCisqLworCitzdGF0aWMgYm9vbGVhbiBfX2luaXQgQnVzTG9naWNfUGFyc2VLZXl3b3JkKGNoYXIgKipTdHJpbmdQb2ludGVyLCBjaGFyICpLZXl3b3JkKQoreworCWNoYXIgKlBvaW50ZXIgPSAqU3RyaW5nUG9pbnRlcjsKKwl3aGlsZSAoKktleXdvcmQgIT0gJ1wwJykgeworCQljaGFyIFN0cmluZ0NoYXIgPSAqUG9pbnRlcisrOworCQljaGFyIEtleXdvcmRDaGFyID0gKktleXdvcmQrKzsKKwkJaWYgKFN0cmluZ0NoYXIgPj0gJ0EnICYmIFN0cmluZ0NoYXIgPD0gJ1onKQorCQkJU3RyaW5nQ2hhciArPSAnYScgLSAnWic7CisJCWlmIChLZXl3b3JkQ2hhciA+PSAnQScgJiYgS2V5d29yZENoYXIgPD0gJ1onKQorCQkJS2V5d29yZENoYXIgKz0gJ2EnIC0gJ1onOworCQlpZiAoU3RyaW5nQ2hhciAhPSBLZXl3b3JkQ2hhcikKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJKlN0cmluZ1BvaW50ZXIgPSBQb2ludGVyOworCXJldHVybiB0cnVlOworfQorCisKKy8qCisgIEJ1c0xvZ2ljX1BhcnNlRHJpdmVyT3B0aW9ucyBoYW5kbGVzIHByb2Nlc3Npbmcgb2YgQnVzTG9naWMgRHJpdmVyIE9wdGlvbnMKKyAgc3BlY2lmaWNhdGlvbnMuCisKKyAgQnVzTG9naWMgRHJpdmVyIE9wdGlvbnMgbWF5IGJlIHNwZWNpZmllZCBlaXRoZXIgdmlhIHRoZSBMaW51eCBLZXJuZWwgQ29tbWFuZAorICBMaW5lIG9yIHZpYSB0aGUgTG9hZGFibGUgS2VybmVsIE1vZHVsZSBJbnN0YWxsYXRpb24gRmFjaWxpdHkuICBEcml2ZXIgT3B0aW9ucworICBmb3IgbXVsdGlwbGUgaG9zdCBhZGFwdGVycyBtYXkgYmUgc3BlY2lmaWVkIGVpdGhlciBieSBzZXBhcmF0aW5nIHRoZSBvcHRpb24KKyAgc3RyaW5ncyBieSBhIHNlbWljb2xvbiwgb3IgYnkgc3BlY2lmeWluZyBtdWx0aXBsZSAiQnVzTG9naWM9IiBzdHJpbmdzIG9uIHRoZQorICBjb21tYW5kIGxpbmUuICBJbmRpdmlkdWFsIG9wdGlvbiBzcGVjaWZpY2F0aW9ucyBmb3IgYSBzaW5nbGUgaG9zdCBhZGFwdGVyIGFyZQorICBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgVGhlIFByb2JpbmcgYW5kIERlYnVnZ2luZyBPcHRpb25zIGFwcGx5IHRvIGFsbCBob3N0CisgIGFkYXB0ZXJzIHdoZXJlYXMgdGhlIHJlbWFpbmluZyBvcHRpb25zIGFwcGx5IGluZGl2aWR1YWxseSBvbmx5IHRvIHRoZQorICBzZWxlY3RlZCBob3N0IGFkYXB0ZXIuCisKKyAgVGhlIEJ1c0xvZ2ljIERyaXZlciBQcm9iaW5nIE9wdGlvbnMgYXJlIGRlc2NyaWJlZCBpbgorICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvQnVzTG9naWMudHh0Pi4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IEJ1c0xvZ2ljX1BhcnNlRHJpdmVyT3B0aW9ucyhjaGFyICpPcHRpb25zU3RyaW5nKQoreworCXdoaWxlICh0cnVlKSB7CisJCXN0cnVjdCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zICpEcml2ZXJPcHRpb25zID0gJkJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNbQnVzTG9naWNfRHJpdmVyT3B0aW9uc0NvdW50KytdOworCQlpbnQgVGFyZ2V0SUQ7CisJCW1lbXNldChEcml2ZXJPcHRpb25zLCAwLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnMpKTsKKwkJd2hpbGUgKCpPcHRpb25zU3RyaW5nICE9ICdcMCcgJiYgKk9wdGlvbnNTdHJpbmcgIT0gJzsnKSB7CisJCQkvKiBQcm9iaW5nIE9wdGlvbnMuICovCisJCQlpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiSU86IikpIHsKKwkJCQl1bnNpZ25lZCBsb25nIElPX0FkZHJlc3MgPSBzaW1wbGVfc3RydG91bChPcHRpb25zU3RyaW5nLCAmT3B0aW9uc1N0cmluZywgMCk7CisJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLkxpbWl0ZWRQcm9iZUlTQSA9IHRydWU7CisJCQkJc3dpdGNoIChJT19BZGRyZXNzKSB7CisJCQkJY2FzZSAweDMzMDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzMwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDMzNDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMzM0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDIzMDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMjMwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDIzNDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMjM0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDEzMDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMTMwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDEzNDoKKwkJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLlByb2JlMTM0ID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJbnZhbGlkIERyaXZlciBPcHRpb25zICIgIihpbnZhbGlkIEkvTyBBZGRyZXNzIDB4JVgpXG4iLCBOVUxMLCBJT19BZGRyZXNzKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfSBlbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJOb1Byb2JlSVNBIikpCisJCQkJQnVzTG9naWNfUHJvYmVPcHRpb25zLk5vUHJvYmVJU0EgPSB0cnVlOworCQkJZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiTm9Qcm9iZVBDSSIpKQorCQkJCUJ1c0xvZ2ljX1Byb2JlT3B0aW9ucy5Ob1Byb2JlUENJID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIk5vUHJvYmUiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Qcm9iZSA9IHRydWU7CisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJOb1NvcnRQQ0kiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Tb3J0UENJID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIk11bHRpTWFzdGVyRmlyc3QiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTXVsdGlNYXN0ZXJGaXJzdCA9IHRydWU7CisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJGbGFzaFBvaW50Rmlyc3QiKSkKKwkJCQlCdXNMb2dpY19Qcm9iZU9wdGlvbnMuRmxhc2hQb2ludEZpcnN0ID0gdHJ1ZTsKKwkJCS8qIFRhZ2dlZCBRdWV1aW5nIE9wdGlvbnMuICovCisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJRdWV1ZURlcHRoOlsiKSB8fCBCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJRRDpbIikpIHsKKwkJCQlmb3IgKFRhcmdldElEID0gMDsgVGFyZ2V0SUQgPCBCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzOyBUYXJnZXRJRCsrKSB7CisJCQkJCXVuc2lnbmVkIHNob3J0IFF1ZXVlRGVwdGggPSBzaW1wbGVfc3RydG91bChPcHRpb25zU3RyaW5nLCAmT3B0aW9uc1N0cmluZywgMCk7CisJCQkJCWlmIChRdWV1ZURlcHRoID4gQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aCkgeworCQkJCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJbnZhbGlkIERyaXZlciBPcHRpb25zICIgIihpbnZhbGlkIFF1ZXVlIERlcHRoICVkKVxuIiwgTlVMTCwgUXVldWVEZXB0aCk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQlEcml2ZXJPcHRpb25zLT5RdWV1ZURlcHRoW1RhcmdldElEXSA9IFF1ZXVlRGVwdGg7CisJCQkJCWlmICgqT3B0aW9uc1N0cmluZyA9PSAnLCcpCisJCQkJCQlPcHRpb25zU3RyaW5nKys7CisJCQkJCWVsc2UgaWYgKCpPcHRpb25zU3RyaW5nID09ICddJykKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlIHsKKwkJCQkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogSW52YWxpZCBEcml2ZXIgT3B0aW9ucyAiICIoJywnIG9yICddJyBleHBlY3RlZCBhdCAnJXMnKVxuIiwgTlVMTCwgT3B0aW9uc1N0cmluZyk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKk9wdGlvbnNTdHJpbmcgIT0gJ10nKSB7CisJCQkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogSW52YWxpZCBEcml2ZXIgT3B0aW9ucyAiICIoJ10nIGV4cGVjdGVkIGF0ICclcycpXG4iLCBOVUxMLCBPcHRpb25zU3RyaW5nKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfSBlbHNlCisJCQkJCU9wdGlvbnNTdHJpbmcrKzsKKwkJCX0gZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiUXVldWVEZXB0aDoiKSB8fCBCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJRRDoiKSkgeworCQkJCXVuc2lnbmVkIHNob3J0IFF1ZXVlRGVwdGggPSBzaW1wbGVfc3RydG91bChPcHRpb25zU3RyaW5nLCAmT3B0aW9uc1N0cmluZywgMCk7CisJCQkJaWYgKFF1ZXVlRGVwdGggPT0gMCB8fCBRdWV1ZURlcHRoID4gQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aCkgeworCQkJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEludmFsaWQgRHJpdmVyIE9wdGlvbnMgIiAiKGludmFsaWQgUXVldWUgRGVwdGggJWQpXG4iLCBOVUxMLCBRdWV1ZURlcHRoKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCURyaXZlck9wdGlvbnMtPkNvbW1vblF1ZXVlRGVwdGggPSBRdWV1ZURlcHRoOworCQkJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyspCisJCQkJCURyaXZlck9wdGlvbnMtPlF1ZXVlRGVwdGhbVGFyZ2V0SURdID0gUXVldWVEZXB0aDsKKwkJCX0gZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiVGFnZ2VkUXVldWluZzoiKSB8fCBCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJUUToiKSkgeworCQkJCWlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJEZWZhdWx0IikpIHsKKwkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCA9IDB4MDAwMDsKKwkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZE1hc2sgPSAweDAwMDA7CisJCQkJfSBlbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJFbmFibGUiKSkgeworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMHhGRkZGOworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkTWFzayA9IDB4RkZGRjsKKwkJCQl9IGVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIkRpc2FibGUiKSkgeworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkID0gMHgwMDAwOworCQkJCQlEcml2ZXJPcHRpb25zLT5UYWdnZWRRdWV1aW5nUGVybWl0dGVkTWFzayA9IDB4RkZGRjsKKwkJCQl9IGVsc2UgeworCQkJCQl1bnNpZ25lZCBzaG9ydCBUYXJnZXRCaXQ7CisJCQkJCWZvciAoVGFyZ2V0SUQgPSAwLCBUYXJnZXRCaXQgPSAxOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyssIFRhcmdldEJpdCA8PD0gMSkKKwkJCQkJCXN3aXRjaCAoKk9wdGlvbnNTdHJpbmcrKykgeworCQkJCQkJY2FzZSAnWSc6CisJCQkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCB8PSBUYXJnZXRCaXQ7CisJCQkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZE1hc2sgfD0gVGFyZ2V0Qml0OworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAnTic6CisJCQkJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmPSB+VGFyZ2V0Qml0OworCQkJCQkJCURyaXZlck9wdGlvbnMtPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWRNYXNrIHw9IFRhcmdldEJpdDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgJ1gnOgorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlPcHRpb25zU3RyaW5nLS07CisJCQkJCQkJVGFyZ2V0SUQgPSBCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qIE1pc2NlbGxhbmVvdXMgT3B0aW9ucy4gKi8KKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIkJ1c1NldHRsZVRpbWU6IikgfHwgQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiQlNUOiIpKSB7CisJCQkJdW5zaWduZWQgc2hvcnQgQnVzU2V0dGxlVGltZSA9IHNpbXBsZV9zdHJ0b3VsKE9wdGlvbnNTdHJpbmcsICZPcHRpb25zU3RyaW5nLCAwKTsKKwkJCQlpZiAoQnVzU2V0dGxlVGltZSA+IDUgKiA2MCkgeworCQkJCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IEludmFsaWQgRHJpdmVyIE9wdGlvbnMgIiAiKGludmFsaWQgQnVzIFNldHRsZSBUaW1lICVkKVxuIiwgTlVMTCwgQnVzU2V0dGxlVGltZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlEcml2ZXJPcHRpb25zLT5CdXNTZXR0bGVUaW1lID0gQnVzU2V0dGxlVGltZTsKKwkJCX0gZWxzZSBpZiAoQnVzTG9naWNfUGFyc2VLZXl3b3JkKCZPcHRpb25zU3RyaW5nLCAiSW5oaWJpdFRhcmdldElucXVpcnkiKSkKKwkJCQlEcml2ZXJPcHRpb25zLT5Mb2NhbE9wdGlvbnMuSW5oaWJpdFRhcmdldElucXVpcnkgPSB0cnVlOworCQkJLyogRGVidWdnaW5nIE9wdGlvbnMuICovCisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJUcmFjZVByb2JlIikpCisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZVByb2JlID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIlRyYWNlSGFyZHdhcmVSZXNldCIpKQorCQkJCUJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VIYXJkd2FyZVJlc2V0ID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIlRyYWNlQ29uZmlndXJhdGlvbiIpKQorCQkJCUJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VDb25maWd1cmF0aW9uID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKEJ1c0xvZ2ljX1BhcnNlS2V5d29yZCgmT3B0aW9uc1N0cmluZywgIlRyYWNlRXJyb3JzIikpCisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUVycm9ycyA9IHRydWU7CisJCQllbHNlIGlmIChCdXNMb2dpY19QYXJzZUtleXdvcmQoJk9wdGlvbnNTdHJpbmcsICJEZWJ1ZyIpKSB7CisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZVByb2JlID0gdHJ1ZTsKKwkJCQlCdXNMb2dpY19HbG9iYWxPcHRpb25zLlRyYWNlSGFyZHdhcmVSZXNldCA9IHRydWU7CisJCQkJQnVzTG9naWNfR2xvYmFsT3B0aW9ucy5UcmFjZUNvbmZpZ3VyYXRpb24gPSB0cnVlOworCQkJCUJ1c0xvZ2ljX0dsb2JhbE9wdGlvbnMuVHJhY2VFcnJvcnMgPSB0cnVlOworCQkJfQorCQkJaWYgKCpPcHRpb25zU3RyaW5nID09ICcsJykKKwkJCQlPcHRpb25zU3RyaW5nKys7CisJCQllbHNlIGlmICgqT3B0aW9uc1N0cmluZyAhPSAnOycgJiYgKk9wdGlvbnNTdHJpbmcgIT0gJ1wwJykgeworCQkJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogVW5leHBlY3RlZCBEcml2ZXIgT3B0aW9uICclcycgIiAiaWdub3JlZFxuIiwgTlVMTCwgT3B0aW9uc1N0cmluZyk7CisJCQkJKk9wdGlvbnNTdHJpbmcgPSAnXDAnOworCQkJfQorCQl9CisJCWlmICghKEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnNDb3VudCA9PSAwIHx8IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50ID09IDAgfHwgQnVzTG9naWNfRHJpdmVyT3B0aW9uc0NvdW50ID09IEJ1c0xvZ2ljX1Byb2JlSW5mb0NvdW50KSkgeworCQkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBJbnZhbGlkIERyaXZlciBPcHRpb25zICIgIihhbGwgb3Igbm8gSS9PIEFkZHJlc3NlcyBtdXN0IGJlIHNwZWNpZmllZClcbiIsIE5VTEwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICAgVGFnZ2VkIFF1ZXVpbmcgaXMgZGlzYWJsZWQgd2hlbiB0aGUgUXVldWUgRGVwdGggaXMgMSBzaW5jZSBxdWV1aW5nCisJCSAgIG11bHRpcGxlIGNvbW1hbmRzIGlzIG5vdCBwb3NzaWJsZS4KKwkJICovCisJCWZvciAoVGFyZ2V0SUQgPSAwOyBUYXJnZXRJRCA8IEJ1c0xvZ2ljX01heFRhcmdldERldmljZXM7IFRhcmdldElEKyspCisJCQlpZiAoRHJpdmVyT3B0aW9ucy0+UXVldWVEZXB0aFtUYXJnZXRJRF0gPT0gMSkgeworCQkJCXVuc2lnbmVkIHNob3J0IFRhcmdldEJpdCA9IDEgPDwgVGFyZ2V0SUQ7CisJCQkJRHJpdmVyT3B0aW9ucy0+VGFnZ2VkUXVldWluZ1Blcm1pdHRlZCAmPSB+VGFyZ2V0Qml0OworCQkJCURyaXZlck9wdGlvbnMtPlRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWRNYXNrIHw9IFRhcmdldEJpdDsKKwkJCX0KKwkJaWYgKCpPcHRpb25zU3RyaW5nID09ICc7JykKKwkJCU9wdGlvbnNTdHJpbmcrKzsKKwkJaWYgKCpPcHRpb25zU3RyaW5nID09ICdcMCcpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgIEdldCBpdCBhbGwgc3RhcnRlZAorKi8KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgQnVzX0xvZ2ljX3RlbXBsYXRlID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lID0gIkJ1c0xvZ2ljIiwKKwkucHJvY19pbmZvID0gQnVzTG9naWNfUHJvY0RpcmVjdG9yeUluZm8sCisJLm5hbWUgPSAiQnVzTG9naWMiLAorCS5pbmZvID0gQnVzTG9naWNfRHJpdmVySW5mbywKKwkucXVldWVjb21tYW5kID0gQnVzTG9naWNfUXVldWVDb21tYW5kLAorCS5zbGF2ZV9jb25maWd1cmUgPSBCdXNMb2dpY19TbGF2ZUNvbmZpZ3VyZSwKKwkuYmlvc19wYXJhbSA9IEJ1c0xvZ2ljX0JJT1NEaXNrUGFyYW1ldGVycywKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gQnVzTG9naWNfaG9zdF9yZXNldCwKKyNpZiAwCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBCdXNMb2dpY19BYm9ydENvbW1hbmQsCisjZW5kaWYKKwkudW5jaGVja2VkX2lzYV9kbWEgPSAxLAorCS5tYXhfc2VjdG9ycyA9IDEyOCwKKwkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKKy8qCisgIEJ1c0xvZ2ljX1NldHVwIGhhbmRsZXMgcHJvY2Vzc2luZyBvZiBLZXJuZWwgQ29tbWFuZCBMaW5lIEFyZ3VtZW50cy4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IEJ1c0xvZ2ljX1NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1szXTsKKworCSh2b2lkKSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaWYgKGludHNbMF0gIT0gMCkgeworCQlCdXNMb2dpY19FcnJvcigiQnVzTG9naWM6IE9ic29sZXRlIENvbW1hbmQgTGluZSBFbnRyeSAiICJGb3JtYXQgSWdub3JlZFxuIiwgTlVMTCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyID09IE5VTEwgfHwgKnN0ciA9PSAnXDAnKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gQnVzTG9naWNfUGFyc2VEcml2ZXJPcHRpb25zKHN0cik7Cit9CisKKy8qCisgKiBFeGl0IGZ1bmN0aW9uLiAgRGVsZXRlcyBhbGwgaG9zdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZHJpdmVyLgorICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBCdXNMb2dpY19leGl0KHZvaWQpCit7CisJc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpoYSwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGEsIG5leHQsICZCdXNMb2dpY19ob3N0X2xpc3QsIGhvc3RfbGlzdCkKKwkJQnVzTG9naWNfUmVsZWFzZUhvc3RBZGFwdGVyKGhhKTsKK30KKworX19zZXR1cCgiQnVzTG9naWM9IiwgQnVzTG9naWNfU2V0dXApOworCittb2R1bGVfaW5pdChCdXNMb2dpY19pbml0KTsKK21vZHVsZV9leGl0KEJ1c0xvZ2ljX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmggYi9kcml2ZXJzL3Njc2kvQnVzTG9naWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWFhNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmgKQEAgLTAsMCArMSwxMzU5IEBACisvKgorCisgIExpbnV4IERyaXZlciBmb3IgQnVzTG9naWMgTXVsdGlNYXN0ZXIgYW5kIEZsYXNoUG9pbnQgU0NTSSBIb3N0IEFkYXB0ZXJzCisKKyAgQ29weXJpZ2h0IDE5OTUtMTk5OCBieSBMZW9uYXJkIE4uIFp1YmtvZmYgPGxuekBkYW5kZWxpb24uY29tPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGZvciBjb21wbGV0ZSBkZXRhaWxzLgorCisgIFRoZSBhdXRob3IgcmVzcGVjdGZ1bGx5IHJlcXVlc3RzIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBzb2Z0d2FyZSBiZQorICBzZW50IGRpcmVjdGx5IHRvIGhpbSBmb3IgZXZhbHVhdGlvbiBhbmQgdGVzdGluZy4KKworICBTcGVjaWFsIHRoYW5rcyB0byBXYXluZSBZZW4sIEppbi1Mb24gSG9uLCBhbmQgQWxleCBXaW4gb2YgQnVzTG9naWMsIHdob3NlCisgIGFkdmljZSBoYXMgYmVlbiBpbnZhbHVhYmxlLCB0byBEYXZpZCBHZW50emVsLCBmb3Igd3JpdGluZyB0aGUgb3JpZ2luYWwgTGludXgKKyAgQnVzTG9naWMgZHJpdmVyLCBhbmQgdG8gUGF1bCBHb3J0bWFrZXIsIGZvciBiZWluZyBzdWNoIGEgZGVkaWNhdGVkIHRlc3Qgc2l0ZS4KKworICBGaW5hbGx5LCBzcGVjaWFsIHRoYW5rcyB0byBNeWxleC9CdXNMb2dpYyBmb3IgbWFraW5nIHRoZSBGbGFzaFBvaW50IFNDQ0IKKyAgTWFuYWdlciBhdmFpbGFibGUgYXMgZnJlZWx5IHJlZGlzdHJpYnV0YWJsZSBzb3VyY2UgY29kZS4KKworKi8KKworI2lmbmRlZiBfQlVTTE9HSUNfSAorI2RlZmluZSBfQlVTTE9HSUNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZm5kZWYgUEFDS0VECisjZGVmaW5lIFBBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCisKKy8qCisgIEZsYXNoUG9pbnQgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIEludGVsIHg4NiBBcmNoaXRlY3R1cmUgd2l0aAorICBDT05GSUdfUENJIHNldC4KKyovCisKKyNpZm5kZWYgX19pMzg2X18KKyN1bmRlZiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQKKyNkZWZpbmUgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfUENJCisjdW5kZWYgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisjZGVmaW5lIENPTkZJR19TQ1NJX09NSVRfRkxBU0hQT0lOVAorI2RlZmluZSBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdElTQSBCdXNMb2dpY19Jbml0aWFsaXplUHJvYmVJbmZvTGlzdAorI2VuZGlmCisKKworLyoKKyAgRGVmaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBCdXNMb2dpYyBIb3N0IEFkYXB0ZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfTWF4SG9zdEFkYXB0ZXJzCQkxNgorCisKKy8qCisgIERlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgVGFyZ2V0IERldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzCQkxNgorCisKKy8qCisgIERlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgU2NhdHRlci9HYXRoZXIgU2VnbWVudHMgdXNlZCBieSB0aGlzIGRyaXZlci4KKyAgRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UsIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgbGltaXQgYmUgYXQgbGVhc3QgYXMKKyAgbGFyZ2UgYXMgdGhlIGxhcmdlc3Qgc2luZ2xlIHJlcXVlc3QgZ2VuZXJhdGVkIGJ5IHRoZSBJL08gU3Vic3lzdGVtLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXQJCTEyOAorCisKKy8qCisgIERlZmluZSB0aGUgbWF4aW11bSwgbWF4aW11bSBhdXRvbWF0aWMsIG1pbmltdW0gYXV0b21hdGljLCBhbmQgZGVmYXVsdCBRdWV1ZQorICBEZXB0aCB0byBhbGxvdyBmb3IgVGFyZ2V0IERldmljZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZXkgc3VwcG9ydAorICBUYWdnZWQgUXVldWluZyBhbmQgd2hldGhlciBvciBub3QgSVNBIEJvdW5jZSBCdWZmZXJzIGFyZSByZXF1aXJlZC4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfTWF4VGFnZ2VkUXVldWVEZXB0aAkJNjQKKyNkZWZpbmUgQnVzTG9naWNfTWF4QXV0b21hdGljVGFnZ2VkUXVldWVEZXB0aAkyOAorI2RlZmluZSBCdXNMb2dpY19NaW5BdXRvbWF0aWNUYWdnZWRRdWV1ZURlcHRoCTcKKyNkZWZpbmUgQnVzTG9naWNfVGFnZ2VkUXVldWVEZXB0aEJCCQkzCisjZGVmaW5lIEJ1c0xvZ2ljX1VudGFnZ2VkUXVldWVEZXB0aAkJMworI2RlZmluZSBCdXNMb2dpY19VbnRhZ2dlZFF1ZXVlRGVwdGhCQgkJMgorCisKKy8qCisgIERlZmluZSB0aGUgZGVmYXVsdCBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBhIEhvc3QgQWRhcHRlcgorICBIYXJkIFJlc2V0IHdoaWNoIGluaXRpYXRlcyBhIFNDU0kgQnVzIFJlc2V0IGFuZCBpc3N1aW5nIGFueSBTQ1NJIGNvbW1hbmRzLgorICBTb21lIFNDU0kgZGV2aWNlcyBnZXQgY29uZnVzZWQgaWYgdGhleSByZWNlaXZlIFNDU0kgY29tbWFuZHMgdG9vIHNvb24gYWZ0ZXIKKyAgYSBTQ1NJIEJ1cyBSZXNldC4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfRGVmYXVsdEJ1c1NldHRsZVRpbWUJCTIKKworCisvKgorICBEZWZpbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIE1haWxib3hlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBNdWx0aU1hc3RlcgorICBIb3N0IEFkYXB0ZXJzLiAgVGhpcyBudW1iZXIgaXMgY2hvc2VuIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIEhvc3QKKyAgQWRhcHRlciBRdWV1ZSBEZXB0aCBhbmQgc21hbGwgZW5vdWdoIHNvIHRoYXQgdGhlIEhvc3QgQWRhcHRlciBzdHJ1Y3R1cmUKKyAgZG9lcyBub3QgY3Jvc3MgYW4gYWxsb2NhdGlvbiBibG9jayBzaXplIGJvdW5kYXJ5LgorKi8KKworI2RlZmluZSBCdXNMb2dpY19NYXhNYWlsYm94ZXMJCQkyMTEKKworCisvKgorICBEZWZpbmUgdGhlIG51bWJlciBvZiBDQ0JzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBhcyBhIGdyb3VwIHRvIG9wdGltaXplCisgIEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbi4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfQ0NCX0FsbG9jYXRpb25Hcm91cFNpemUJNworCisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIExpbmUgYW5kIE1lc3NhZ2UgQnVmZmVyIFNpemVzLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19MaW5lQnVmZmVyU2l6ZQkJCTEwMAorI2RlZmluZSBCdXNMb2dpY19NZXNzYWdlQnVmZmVyU2l6ZQkJOTcwMAorCisKKy8qCisgIERlZmluZSB0aGUgRHJpdmVyIE1lc3NhZ2UgTGV2ZWxzLgorKi8KKworZW51bSBCdXNMb2dpY19NZXNzYWdlTGV2ZWwgeworCUJ1c0xvZ2ljX0Fubm91bmNlTGV2ZWwgPSAwLAorCUJ1c0xvZ2ljX0luZm9MZXZlbCA9IDEsCisJQnVzTG9naWNfTm90aWNlTGV2ZWwgPSAyLAorCUJ1c0xvZ2ljX1dhcm5pbmdMZXZlbCA9IDMsCisJQnVzTG9naWNfRXJyb3JMZXZlbCA9IDQKK307CisKK3N0YXRpYyBjaGFyICpCdXNMb2dpY19NZXNzYWdlTGV2ZWxNYXBbXSA9IHsgS0VSTl9OT1RJQ0UsIEtFUk5fTk9USUNFLCBLRVJOX05PVElDRSwgS0VSTl9XQVJOSU5HLCBLRVJOX0VSUiB9OworCisKKy8qCisgIERlZmluZSBEcml2ZXIgTWVzc2FnZSBtYWNyb3MuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0Fubm91bmNlKEZvcm1hdCwgQXJndW1lbnRzLi4uKSBcCisgIEJ1c0xvZ2ljX01lc3NhZ2UoQnVzTG9naWNfQW5ub3VuY2VMZXZlbCwgRm9ybWF0LCAjI0FyZ3VtZW50cykKKworI2RlZmluZSBCdXNMb2dpY19JbmZvKEZvcm1hdCwgQXJndW1lbnRzLi4uKSBcCisgIEJ1c0xvZ2ljX01lc3NhZ2UoQnVzTG9naWNfSW5mb0xldmVsLCBGb3JtYXQsICMjQXJndW1lbnRzKQorCisjZGVmaW5lIEJ1c0xvZ2ljX05vdGljZShGb3JtYXQsIEFyZ3VtZW50cy4uLikgXAorICBCdXNMb2dpY19NZXNzYWdlKEJ1c0xvZ2ljX05vdGljZUxldmVsLCBGb3JtYXQsICMjQXJndW1lbnRzKQorCisjZGVmaW5lIEJ1c0xvZ2ljX1dhcm5pbmcoRm9ybWF0LCBBcmd1bWVudHMuLi4pIFwKKyAgQnVzTG9naWNfTWVzc2FnZShCdXNMb2dpY19XYXJuaW5nTGV2ZWwsIEZvcm1hdCwgIyNBcmd1bWVudHMpCisKKyNkZWZpbmUgQnVzTG9naWNfRXJyb3IoRm9ybWF0LCBBcmd1bWVudHMuLi4pIFwKKyAgQnVzTG9naWNfTWVzc2FnZShCdXNMb2dpY19FcnJvckxldmVsLCBGb3JtYXQsICMjQXJndW1lbnRzKQorCisKKy8qCisgIERlZmluZSB0aGUgdHlwZXMgb2YgQnVzTG9naWMgSG9zdCBBZGFwdGVycyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIHRoZSBudW1iZXIKKyAgb2YgSS9PIEFkZHJlc3NlcyByZXF1aXJlZCBieSBlYWNoIHR5cGUuCisqLworCitlbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyVHlwZSB7CisJQnVzTG9naWNfTXVsdGlNYXN0ZXIgPSAxLAorCUJ1c0xvZ2ljX0ZsYXNoUG9pbnQgPSAyCit9IFBBQ0tFRDsKKworI2RlZmluZSBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudAk0CisjZGVmaW5lIEJ1c0xvZ2ljX0ZsYXNoUG9pbnRBZGRyZXNzQ291bnQJCTI1NgorCitzdGF0aWMgaW50IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQWRkcmVzc0NvdW50WzNdID0geyAwLCBCdXNMb2dpY19NdWx0aU1hc3RlckFkZHJlc3NDb3VudCwgQnVzTG9naWNfRmxhc2hQb2ludEFkZHJlc3NDb3VudCB9OworCisKKy8qCisgIERlZmluZSBtYWNyb3MgZm9yIHRlc3RpbmcgdGhlIEhvc3QgQWRhcHRlciBUeXBlLgorKi8KKworI2lmbmRlZiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQKKworI2RlZmluZSBCdXNMb2dpY19NdWx0aU1hc3Rlckhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikgXAorICAoSG9zdEFkYXB0ZXItPkhvc3RBZGFwdGVyVHlwZSA9PSBCdXNMb2dpY19NdWx0aU1hc3RlcikKKworI2RlZmluZSBCdXNMb2dpY19GbGFzaFBvaW50SG9zdEFkYXB0ZXJQKEhvc3RBZGFwdGVyKSBcCisgIChIb3N0QWRhcHRlci0+SG9zdEFkYXB0ZXJUeXBlID09IEJ1c0xvZ2ljX0ZsYXNoUG9pbnQpCisKKyNlbHNlCisKKyNkZWZpbmUgQnVzTG9naWNfTXVsdGlNYXN0ZXJIb3N0QWRhcHRlclAoSG9zdEFkYXB0ZXIpIFwKKyAgKHRydWUpCisKKyNkZWZpbmUgQnVzTG9naWNfRmxhc2hQb2ludEhvc3RBZGFwdGVyUChIb3N0QWRhcHRlcikgXAorICAoZmFsc2UpCisKKyNlbmRpZgorCisKKy8qCisgIERlZmluZSB0aGUgcG9zc2libGUgSG9zdCBBZGFwdGVyIEJ1cyBUeXBlcy4KKyovCisKK2VudW0gQnVzTG9naWNfSG9zdEFkYXB0ZXJCdXNUeXBlIHsKKwlCdXNMb2dpY19Vbmtub3duX0J1cyA9IDAsCisJQnVzTG9naWNfSVNBX0J1cyA9IDEsCisJQnVzTG9naWNfRUlTQV9CdXMgPSAyLAorCUJ1c0xvZ2ljX1BDSV9CdXMgPSAzLAorCUJ1c0xvZ2ljX1ZFU0FfQnVzID0gNCwKKwlCdXNMb2dpY19NQ0FfQnVzID0gNQorfSBQQUNLRUQ7CisKK3N0YXRpYyBjaGFyICpCdXNMb2dpY19Ib3N0QWRhcHRlckJ1c05hbWVzW10gPSB7ICJVbmtub3duIiwgIklTQSIsICJFSVNBIiwgIlBDSSIsICJWRVNBIiwgIk1DQSIgfTsKKworc3RhdGljIGVudW0gQnVzTG9naWNfSG9zdEFkYXB0ZXJCdXNUeXBlIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQnVzVHlwZXNbXSA9IHsKKwlCdXNMb2dpY19WRVNBX0J1cywJLyogQlQtNHh4ICovCisJQnVzTG9naWNfSVNBX0J1cywJLyogQlQtNXh4ICovCisJQnVzTG9naWNfTUNBX0J1cywJLyogQlQtNnh4ICovCisJQnVzTG9naWNfRUlTQV9CdXMsCS8qIEJULTd4eCAqLworCUJ1c0xvZ2ljX1Vua25vd25fQnVzLAkvKiBCVC04eHggKi8KKwlCdXNMb2dpY19QQ0lfQnVzCS8qIEJULTl4eCAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBwb3NzaWJsZSBIb3N0IEFkYXB0ZXIgQklPUyBEaXNrIEdlb21ldHJ5IFRyYW5zbGF0aW9ucy4KKyovCisKK2VudW0gQnVzTG9naWNfQklPU19EaXNrR2VvbWV0cnlUcmFuc2xhdGlvbiB7CisJQnVzTG9naWNfQklPU19EaXNrX05vdF9JbnN0YWxsZWQgPSAwLAorCUJ1c0xvZ2ljX0JJT1NfRGlza19JbnN0YWxsZWRfNjR4MzIgPSAxLAorCUJ1c0xvZ2ljX0JJT1NfRGlza19JbnN0YWxsZWRfMTI4eDMyID0gMiwKKwlCdXNMb2dpY19CSU9TX0Rpc2tfSW5zdGFsbGVkXzI1NXg2MyA9IDMKK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSBhIEJvb2xlYW4gZGF0YSB0eXBlLgorKi8KKwordHlwZWRlZiBlbnVtIHsKKwlmYWxzZSwKKwl0cnVlCit9IFBBQ0tFRCBib29sZWFuOworCisvKgorICBEZWZpbmUgYSAxMF4xOCBTdGF0aXN0aWNzIEJ5dGUgQ291bnRlciBkYXRhIHR5cGUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfQnl0ZUNvdW50ZXIgeworCXVuc2lnbmVkIGludCBVbml0czsKKwl1bnNpZ25lZCBpbnQgQmlsbGlvbnM7Cit9OworCisKKy8qCisgIERlZmluZSB0aGUgc3RydWN0dXJlIGZvciBJL08gQWRkcmVzcyBhbmQgQnVzIFByb2JpbmcgSW5mb3JtYXRpb24uCisqLworCitzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvIHsKKwllbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyVHlwZSBIb3N0QWRhcHRlclR5cGU7CisJZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlckJ1c1R5cGUgSG9zdEFkYXB0ZXJCdXNUeXBlOworCXVuc2lnbmVkIGxvbmcgSU9fQWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIFBDSV9BZGRyZXNzOworCXN0cnVjdCBwY2lfZGV2ICpQQ0lfRGV2aWNlOworCXVuc2lnbmVkIGNoYXIgQnVzOworCXVuc2lnbmVkIGNoYXIgRGV2aWNlOworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw7Cit9OworCisvKgorICBEZWZpbmUgdGhlIFByb2JlIE9wdGlvbnMuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfUHJvYmVPcHRpb25zIHsKKwlib29sZWFuIE5vUHJvYmU6MTsJLyogQml0IDAgKi8KKwlib29sZWFuIE5vUHJvYmVJU0E6MTsJLyogQml0IDEgKi8KKwlib29sZWFuIE5vUHJvYmVQQ0k6MTsJLyogQml0IDIgKi8KKwlib29sZWFuIE5vU29ydFBDSToxOwkvKiBCaXQgMyAqLworCWJvb2xlYW4gTXVsdGlNYXN0ZXJGaXJzdDoxOwkvKiBCaXQgNCAqLworCWJvb2xlYW4gRmxhc2hQb2ludEZpcnN0OjE7CS8qIEJpdCA1ICovCisJYm9vbGVhbiBMaW1pdGVkUHJvYmVJU0E6MTsJLyogQml0IDYgKi8KKwlib29sZWFuIFByb2JlMzMwOjE7CS8qIEJpdCA3ICovCisJYm9vbGVhbiBQcm9iZTMzNDoxOwkvKiBCaXQgOCAqLworCWJvb2xlYW4gUHJvYmUyMzA6MTsJLyogQml0IDkgKi8KKwlib29sZWFuIFByb2JlMjM0OjE7CS8qIEJpdCAxMCAqLworCWJvb2xlYW4gUHJvYmUxMzA6MTsJLyogQml0IDExICovCisJYm9vbGVhbiBQcm9iZTEzNDoxOwkvKiBCaXQgMTIgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgR2xvYmFsIE9wdGlvbnMuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfR2xvYmFsT3B0aW9ucyB7CisJYm9vbGVhbiBUcmFjZVByb2JlOjE7CS8qIEJpdCAwICovCisJYm9vbGVhbiBUcmFjZUhhcmR3YXJlUmVzZXQ6MTsJLyogQml0IDEgKi8KKwlib29sZWFuIFRyYWNlQ29uZmlndXJhdGlvbjoxOwkvKiBCaXQgMiAqLworCWJvb2xlYW4gVHJhY2VFcnJvcnM6MTsJLyogQml0IDMgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgTG9jYWwgT3B0aW9ucy4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19Mb2NhbE9wdGlvbnMgeworCWJvb2xlYW4gSW5oaWJpdFRhcmdldElucXVpcnk6MTsJLyogQml0IDAgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgQnVzTG9naWMgU0NTSSBIb3N0IEFkYXB0ZXIgSS9PIFJlZ2lzdGVyIE9mZnNldHMuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3Rlck9mZnNldAkJMAkvKiBXTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19TdGF0dXNSZWdpc3Rlck9mZnNldAkJMAkvKiBSTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19Db21tYW5kUGFyYW1ldGVyUmVnaXN0ZXJPZmZzZXQJMQkvKiBXTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19EYXRhSW5SZWdpc3Rlck9mZnNldAkJMQkvKiBSTyByZWdpc3RlciAqLworI2RlZmluZSBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3Rlck9mZnNldAkyCS8qIFJPIHJlZ2lzdGVyICovCisjZGVmaW5lIEJ1c0xvZ2ljX0dlb21ldHJ5UmVnaXN0ZXJPZmZzZXQJCTMJLyogUk8gcmVnaXN0ZXIgKi8KKworLyoKKyAgRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHdyaXRlLW9ubHkgQ29udHJvbCBSZWdpc3Rlci4KKyovCisKK3VuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciBBbGw7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhcjo0OwkvKiBCaXRzIDAtMyAqLworCQlib29sZWFuIFNDU0lCdXNSZXNldDoxOwkvKiBCaXQgNCAqLworCQlib29sZWFuIEludGVycnVwdFJlc2V0OjE7CS8qIEJpdCA1ICovCisJCWJvb2xlYW4gU29mdFJlc2V0OjE7CS8qIEJpdCA2ICovCisJCWJvb2xlYW4gSGFyZFJlc2V0OjE7CS8qIEJpdCA3ICovCisJfSBjcjsKK307CisKKy8qCisgIERlZmluZSB0aGUgc3RydWN0dXJlIG9mIHRoZSByZWFkLW9ubHkgU3RhdHVzIFJlZ2lzdGVyLgorKi8KKwordW5pb24gQnVzTG9naWNfU3RhdHVzUmVnaXN0ZXIgeworCXVuc2lnbmVkIGNoYXIgQWxsOworCXN0cnVjdCB7CisJCWJvb2xlYW4gQ29tbWFuZEludmFsaWQ6MTsJLyogQml0IDAgKi8KKwkJYm9vbGVhbiBSZXNlcnZlZDoxOwkvKiBCaXQgMSAqLworCQlib29sZWFuIERhdGFJblJlZ2lzdGVyUmVhZHk6MTsJLyogQml0IDIgKi8KKwkJYm9vbGVhbiBDb21tYW5kUGFyYW1ldGVyUmVnaXN0ZXJCdXN5OjE7CS8qIEJpdCAzICovCisJCWJvb2xlYW4gSG9zdEFkYXB0ZXJSZWFkeToxOwkvKiBCaXQgNCAqLworCQlib29sZWFuIEluaXRpYWxpemF0aW9uUmVxdWlyZWQ6MTsJLyogQml0IDUgKi8KKwkJYm9vbGVhbiBEaWFnbm9zdGljRmFpbHVyZToxOwkvKiBCaXQgNiAqLworCQlib29sZWFuIERpYWdub3N0aWNBY3RpdmU6MTsJLyogQml0IDcgKi8KKwl9IHNyOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJlYWQtb25seSBJbnRlcnJ1cHQgUmVnaXN0ZXIuCisqLworCit1bmlvbiBCdXNMb2dpY19JbnRlcnJ1cHRSZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciBBbGw7CisJc3RydWN0IHsKKwkJYm9vbGVhbiBJbmNvbWluZ01haWxib3hMb2FkZWQ6MTsJLyogQml0IDAgKi8KKwkJYm9vbGVhbiBPdXRnb2luZ01haWxib3hBdmFpbGFibGU6MTsJLyogQml0IDEgKi8KKwkJYm9vbGVhbiBDb21tYW5kQ29tcGxldGU6MTsJLyogQml0IDIgKi8KKwkJYm9vbGVhbiBFeHRlcm5hbEJ1c1Jlc2V0OjE7CS8qIEJpdCAzICovCisJCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6MzsJLyogQml0cyA0LTYgKi8KKwkJYm9vbGVhbiBJbnRlcnJ1cHRWYWxpZDoxOwkvKiBCaXQgNyAqLworCX0gaXI7Cit9OworCisvKgorICBEZWZpbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcmVhZC1vbmx5IEdlb21ldHJ5IFJlZ2lzdGVyLgorKi8KKwordW5pb24gQnVzTG9naWNfR2VvbWV0cnlSZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciBBbGw7CisJc3RydWN0IHsKKwkJZW51bSBCdXNMb2dpY19CSU9TX0Rpc2tHZW9tZXRyeVRyYW5zbGF0aW9uIERyaXZlMEdlb21ldHJ5OjI7CS8qIEJpdHMgMC0xICovCisJCWVudW0gQnVzTG9naWNfQklPU19EaXNrR2VvbWV0cnlUcmFuc2xhdGlvbiBEcml2ZTFHZW9tZXRyeToyOwkvKiBCaXRzIDItMyAqLworCQl1bnNpZ25lZCBjaGFyOjM7CS8qIEJpdHMgNC02ICovCisJCWJvb2xlYW4gRXh0ZW5kZWRUcmFuc2xhdGlvbkVuYWJsZWQ6MTsJLyogQml0IDcgKi8KKwl9IGdyOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBCdXNMb2dpYyBTQ1NJIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyIE9wZXJhdGlvbiBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfT3BlcmF0aW9uQ29kZSB7CisJQnVzTG9naWNfVGVzdENvbW1hbmRDb21wbGV0ZUludGVycnVwdCA9IDB4MDAsCisJQnVzTG9naWNfSW5pdGlhbGl6ZU1haWxib3ggPSAweDAxLAorCUJ1c0xvZ2ljX0V4ZWN1dGVNYWlsYm94Q29tbWFuZCA9IDB4MDIsCisJQnVzTG9naWNfRXhlY3V0ZUJJT1NDb21tYW5kID0gMHgwMywKKwlCdXNMb2dpY19JbnF1aXJlQm9hcmRJRCA9IDB4MDQsCisJQnVzTG9naWNfRW5hYmxlT3V0Z29pbmdNYWlsYm94QXZhaWxhYmxlSW50ID0gMHgwNSwKKwlCdXNMb2dpY19TZXRTQ1NJU2VsZWN0aW9uVGltZW91dCA9IDB4MDYsCisJQnVzTG9naWNfU2V0UHJlZW1wdFRpbWVPbkJ1cyA9IDB4MDcsCisJQnVzTG9naWNfU2V0VGltZU9mZkJ1cyA9IDB4MDgsCisJQnVzTG9naWNfU2V0QnVzVHJhbnNmZXJSYXRlID0gMHgwOSwKKwlCdXNMb2dpY19JbnF1aXJlSW5zdGFsbGVkRGV2aWNlc0lEMHRvNyA9IDB4MEEsCisJQnVzTG9naWNfSW5xdWlyZUNvbmZpZ3VyYXRpb24gPSAweDBCLAorCUJ1c0xvZ2ljX0VuYWJsZVRhcmdldE1vZGUgPSAweDBDLAorCUJ1c0xvZ2ljX0lucXVpcmVTZXR1cEluZm9ybWF0aW9uID0gMHgwRCwKKwlCdXNMb2dpY19Xcml0ZUFkYXB0ZXJMb2NhbFJBTSA9IDB4MUEsCisJQnVzTG9naWNfUmVhZEFkYXB0ZXJMb2NhbFJBTSA9IDB4MUIsCisJQnVzTG9naWNfV3JpdGVCdXNNYXN0ZXJDaGlwRklGTyA9IDB4MUMsCisJQnVzTG9naWNfUmVhZEJ1c01hc3RlckNoaXBGSUZPID0gMHgxRCwKKwlCdXNMb2dpY19FY2hvQ29tbWFuZERhdGEgPSAweDFGLAorCUJ1c0xvZ2ljX0hvc3RBZGFwdGVyRGlhZ25vc3RpYyA9IDB4MjAsCisJQnVzTG9naWNfU2V0QWRhcHRlck9wdGlvbnMgPSAweDIxLAorCUJ1c0xvZ2ljX0lucXVpcmVJbnN0YWxsZWREZXZpY2VzSUQ4dG8xNSA9IDB4MjMsCisJQnVzTG9naWNfSW5xdWlyZVRhcmdldERldmljZXMgPSAweDI0LAorCUJ1c0xvZ2ljX0Rpc2FibGVIb3N0QWRhcHRlckludGVycnVwdCA9IDB4MjUsCisJQnVzTG9naWNfSW5pdGlhbGl6ZUV4dGVuZGVkTWFpbGJveCA9IDB4ODEsCisJQnVzTG9naWNfRXhlY3V0ZVNDU0lDb21tYW5kID0gMHg4MywKKwlCdXNMb2dpY19JbnF1aXJlRmlybXdhcmVWZXJzaW9uM3JkRGlnaXQgPSAweDg0LAorCUJ1c0xvZ2ljX0lucXVpcmVGaXJtd2FyZVZlcnNpb25MZXR0ZXIgPSAweDg1LAorCUJ1c0xvZ2ljX0lucXVpcmVQQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uID0gMHg4NiwKKwlCdXNMb2dpY19JbnF1aXJlSG9zdEFkYXB0ZXJNb2RlbE51bWJlciA9IDB4OEIsCisJQnVzTG9naWNfSW5xdWlyZVN5bmNocm9ub3VzUGVyaW9kID0gMHg4QywKKwlCdXNMb2dpY19JbnF1aXJlRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uID0gMHg4RCwKKwlCdXNMb2dpY19FbmFibGVTdHJpY3RSb3VuZFJvYmluTW9kZSA9IDB4OEYsCisJQnVzTG9naWNfU3RvcmVIb3N0QWRhcHRlckxvY2FsUkFNID0gMHg5MCwKKwlCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU0gPSAweDkxLAorCUJ1c0xvZ2ljX1N0b3JlTG9jYWxEYXRhSW5FRVBST00gPSAweDkyLAorCUJ1c0xvZ2ljX1VwbG9hZEF1dG9TQ1NJQ29kZSA9IDB4OTQsCisJQnVzTG9naWNfTW9kaWZ5SU9BZGRyZXNzID0gMHg5NSwKKwlCdXNMb2dpY19TZXRDQ0JGb3JtYXQgPSAweDk2LAorCUJ1c0xvZ2ljX1dyaXRlSW5xdWlyeUJ1ZmZlciA9IDB4OUEsCisJQnVzTG9naWNfUmVhZElucXVpcnlCdWZmZXIgPSAweDlCLAorCUJ1c0xvZ2ljX0ZsYXNoUk9NVXBsb2FkRG93bmxvYWQgPSAweEE3LAorCUJ1c0xvZ2ljX1JlYWRTQ0FNRGF0YSA9IDB4QTgsCisJQnVzTG9naWNfV3JpdGVTQ0FNRGF0YSA9IDB4QTkKK307CisKKy8qCisgIERlZmluZSB0aGUgSW5xdWlyZSBCb2FyZCBJRCByZXBseSBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfQm9hcmRJRCB7CisJdW5zaWduZWQgY2hhciBCb2FyZFR5cGU7CS8qIEJ5dGUgMCAqLworCXVuc2lnbmVkIGNoYXIgQ3VzdG9tRmVhdHVyZXM7CS8qIEJ5dGUgMSAqLworCXVuc2lnbmVkIGNoYXIgRmlybXdhcmVWZXJzaW9uMXN0RGlnaXQ7CS8qIEJ5dGUgMiAqLworCXVuc2lnbmVkIGNoYXIgRmlybXdhcmVWZXJzaW9uMm5kRGlnaXQ7CS8qIEJ5dGUgMyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBJbnF1aXJlIENvbmZpZ3VyYXRpb24gcmVwbHkgc3RydWN0dXJlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX0NvbmZpZ3VyYXRpb24geworCXVuc2lnbmVkIGNoYXI6NTsJLyogQnl0ZSAwIEJpdHMgMC00ICovCisJYm9vbGVhbiBETUFfQ2hhbm5lbDU6MTsJLyogQnl0ZSAwIEJpdCA1ICovCisJYm9vbGVhbiBETUFfQ2hhbm5lbDY6MTsJLyogQnl0ZSAwIEJpdCA2ICovCisJYm9vbGVhbiBETUFfQ2hhbm5lbDc6MTsJLyogQnl0ZSAwIEJpdCA3ICovCisJYm9vbGVhbiBJUlFfQ2hhbm5lbDk6MTsJLyogQnl0ZSAxIEJpdCAwICovCisJYm9vbGVhbiBJUlFfQ2hhbm5lbDEwOjE7CS8qIEJ5dGUgMSBCaXQgMSAqLworCWJvb2xlYW4gSVJRX0NoYW5uZWwxMToxOwkvKiBCeXRlIDEgQml0IDIgKi8KKwlib29sZWFuIElSUV9DaGFubmVsMTI6MTsJLyogQnl0ZSAxIEJpdCAzICovCisJdW5zaWduZWQgY2hhcjoxOwkvKiBCeXRlIDEgQml0IDQgKi8KKwlib29sZWFuIElSUV9DaGFubmVsMTQ6MTsJLyogQnl0ZSAxIEJpdCA1ICovCisJYm9vbGVhbiBJUlFfQ2hhbm5lbDE1OjE7CS8qIEJ5dGUgMSBCaXQgNiAqLworCXVuc2lnbmVkIGNoYXI6MTsJLyogQnl0ZSAxIEJpdCA3ICovCisJdW5zaWduZWQgY2hhciBIb3N0QWRhcHRlcklEOjQ7CS8qIEJ5dGUgMiBCaXRzIDAtMyAqLworCXVuc2lnbmVkIGNoYXI6NDsJLyogQnl0ZSAyIEJpdHMgNC03ICovCit9OworCisvKgorICBEZWZpbmUgdGhlIElucXVpcmUgU2V0dXAgSW5mb3JtYXRpb24gcmVwbHkgc3RydWN0dXJlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX1N5bmNocm9ub3VzVmFsdWUgeworCXVuc2lnbmVkIGNoYXIgT2Zmc2V0OjQ7CS8qIEJpdHMgMC0zICovCisJdW5zaWduZWQgY2hhciBUcmFuc2ZlclBlcmlvZDozOwkvKiBCaXRzIDQtNiAqLworCWJvb2xlYW4gU3luY2hyb25vdXM6MTsJLyogQml0IDcgKi8KK307CisKK3N0cnVjdCBCdXNMb2dpY19TZXR1cEluZm9ybWF0aW9uIHsKKwlib29sZWFuIFN5bmNocm9ub3VzSW5pdGlhdGlvbkVuYWJsZWQ6MTsJLyogQnl0ZSAwIEJpdCAwICovCisJYm9vbGVhbiBQYXJpdHlDaGVja2luZ0VuYWJsZWQ6MTsJLyogQnl0ZSAwIEJpdCAxICovCisJdW5zaWduZWQgY2hhcjo2OwkvKiBCeXRlIDAgQml0cyAyLTcgKi8KKwl1bnNpZ25lZCBjaGFyIEJ1c1RyYW5zZmVyUmF0ZTsJLyogQnl0ZSAxICovCisJdW5zaWduZWQgY2hhciBQcmVlbXB0VGltZU9uQnVzOwkvKiBCeXRlIDIgKi8KKwl1bnNpZ25lZCBjaGFyIFRpbWVPZmZCdXM7CS8qIEJ5dGUgMyAqLworCXVuc2lnbmVkIGNoYXIgTWFpbGJveENvdW50OwkvKiBCeXRlIDQgKi8KKwl1bnNpZ25lZCBjaGFyIE1haWxib3hBZGRyZXNzWzNdOwkvKiBCeXRlcyA1LTcgKi8KKwlzdHJ1Y3QgQnVzTG9naWNfU3luY2hyb25vdXNWYWx1ZSBTeW5jaHJvbm91c1ZhbHVlc0lEMHRvN1s4XTsJLyogQnl0ZXMgOC0xNSAqLworCXVuc2lnbmVkIGNoYXIgRGlzY29ubmVjdFBlcm1pdHRlZElEMHRvNzsJLyogQnl0ZSAxNiAqLworCXVuc2lnbmVkIGNoYXIgU2lnbmF0dXJlOwkvKiBCeXRlIDE3ICovCisJdW5zaWduZWQgY2hhciBDaGFyYWN0ZXJEOwkvKiBCeXRlIDE4ICovCisJdW5zaWduZWQgY2hhciBIb3N0QnVzVHlwZTsJLyogQnl0ZSAxOSAqLworCXVuc2lnbmVkIGNoYXIgV2lkZVRyYW5zZmVyc1Blcm1pdHRlZElEMHRvNzsJLyogQnl0ZSAyMCAqLworCXVuc2lnbmVkIGNoYXIgV2lkZVRyYW5zZmVyc0FjdGl2ZUlEMHRvNzsJLyogQnl0ZSAyMSAqLworCXN0cnVjdCBCdXNMb2dpY19TeW5jaHJvbm91c1ZhbHVlIFN5bmNocm9ub3VzVmFsdWVzSUQ4dG8xNVs4XTsJLyogQnl0ZXMgMjItMjkgKi8KKwl1bnNpZ25lZCBjaGFyIERpc2Nvbm5lY3RQZXJtaXR0ZWRJRDh0bzE1OwkvKiBCeXRlIDMwICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDMxICovCisJdW5zaWduZWQgY2hhciBXaWRlVHJhbnNmZXJzUGVybWl0dGVkSUQ4dG8xNTsJLyogQnl0ZSAzMiAqLworCXVuc2lnbmVkIGNoYXIgV2lkZVRyYW5zZmVyc0FjdGl2ZUlEOHRvMTU7CS8qIEJ5dGUgMzMgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgSW5pdGlhbGl6ZSBFeHRlbmRlZCBNYWlsYm94IHJlcXVlc3Qgc3RydWN0dXJlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX0V4dGVuZGVkTWFpbGJveFJlcXVlc3QgeworCXVuc2lnbmVkIGNoYXIgTWFpbGJveENvdW50OwkvKiBCeXRlIDAgKi8KKwl1MzIgQmFzZU1haWxib3hBZGRyZXNzOwkvKiBCeXRlcyAxLTQgKi8KK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSB0aGUgSW5xdWlyZSBQQ0kgSG9zdCBBZGFwdGVyIEluZm9ybWF0aW9uIHJlcGx5IHR5cGUuICBUaGUgSVNBCisgIENvbXBhdGlibGUgSS9PIFBvcnQgdmFsdWVzIGFyZSBkZWZpbmVkIGhlcmUgYW5kIGFyZSBhbHNvIHVzZWQgd2l0aAorICB0aGUgTW9kaWZ5IEkvTyBBZGRyZXNzIGNvbW1hbmQuCisqLworCitlbnVtIEJ1c0xvZ2ljX0lTQUNvbXBhdGlibGVJT1BvcnQgeworCUJ1c0xvZ2ljX0lPXzMzMCA9IDAsCisJQnVzTG9naWNfSU9fMzM0ID0gMSwKKwlCdXNMb2dpY19JT18yMzAgPSAyLAorCUJ1c0xvZ2ljX0lPXzIzNCA9IDMsCisJQnVzTG9naWNfSU9fMTMwID0gNCwKKwlCdXNMb2dpY19JT18xMzQgPSA1LAorCUJ1c0xvZ2ljX0lPX0Rpc2FibGUgPSA2LAorCUJ1c0xvZ2ljX0lPX0Rpc2FibGUyID0gNworfSBQQUNLRUQ7CisKK3N0cnVjdCBCdXNMb2dpY19QQ0lIb3N0QWRhcHRlckluZm9ybWF0aW9uIHsKKwllbnVtIEJ1c0xvZ2ljX0lTQUNvbXBhdGlibGVJT1BvcnQgSVNBQ29tcGF0aWJsZUlPUG9ydDsJLyogQnl0ZSAwICovCisJdW5zaWduZWQgY2hhciBQQ0lBc3NpZ25lZElSUUNoYW5uZWw7CS8qIEJ5dGUgMSAqLworCWJvb2xlYW4gTG93Qnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAyIEJpdCAwICovCisJYm9vbGVhbiBIaWdoQnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAyIEJpdCAxICovCisJdW5zaWduZWQgY2hhcjoyOwkvKiBCeXRlIDIgQml0cyAyLTMgKi8KKwlib29sZWFuIEpQMToxOwkJLyogQnl0ZSAyIEJpdCA0ICovCisJYm9vbGVhbiBKUDI6MTsJCS8qIEJ5dGUgMiBCaXQgNSAqLworCWJvb2xlYW4gSlAzOjE7CQkvKiBCeXRlIDIgQml0IDYgKi8KKwlib29sZWFuIEdlbmVyaWNJbmZvVmFsaWQ6MTsJLyogQnl0ZSAyIEJpdCA3ICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDMgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgSW5xdWlyZSBFeHRlbmRlZCBTZXR1cCBJbmZvcm1hdGlvbiByZXBseSBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfRXh0ZW5kZWRTZXR1cEluZm9ybWF0aW9uIHsKKwl1bnNpZ25lZCBjaGFyIEJ1c1R5cGU7CS8qIEJ5dGUgMCAqLworCXVuc2lnbmVkIGNoYXIgQklPU19BZGRyZXNzOwkvKiBCeXRlIDEgKi8KKwl1bnNpZ25lZCBzaG9ydCBTY2F0dGVyR2F0aGVyTGltaXQ7CS8qIEJ5dGVzIDItMyAqLworCXVuc2lnbmVkIGNoYXIgTWFpbGJveENvdW50OwkvKiBCeXRlIDQgKi8KKwl1MzIgQmFzZU1haWxib3hBZGRyZXNzOwkvKiBCeXRlcyA1LTggKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyOjI7CS8qIEJ5dGUgOSBCaXRzIDAtMSAqLworCQlib29sZWFuIEZhc3RPbkVJU0E6MTsJLyogQnl0ZSA5IEJpdCAyICovCisJCXVuc2lnbmVkIGNoYXI6MzsJLyogQnl0ZSA5IEJpdHMgMy01ICovCisJCWJvb2xlYW4gTGV2ZWxTZW5zaXRpdmVJbnRlcnJ1cHQ6MTsJLyogQnl0ZSA5IEJpdCA2ICovCisJCXVuc2lnbmVkIGNoYXI6MTsJLyogQnl0ZSA5IEJpdCA3ICovCisJfSBNaXNjOworCXVuc2lnbmVkIGNoYXIgRmlybXdhcmVSZXZpc2lvblszXTsJLyogQnl0ZXMgMTAtMTIgKi8KKwlib29sZWFuIEhvc3RXaWRlU0NTSToxOwkvKiBCeXRlIDEzIEJpdCAwICovCisJYm9vbGVhbiBIb3N0RGlmZmVyZW50aWFsU0NTSToxOwkvKiBCeXRlIDEzIEJpdCAxICovCisJYm9vbGVhbiBIb3N0U3VwcG9ydHNTQ0FNOjE7CS8qIEJ5dGUgMTMgQml0IDIgKi8KKwlib29sZWFuIEhvc3RVbHRyYVNDU0k6MTsJLyogQnl0ZSAxMyBCaXQgMyAqLworCWJvb2xlYW4gSG9zdFNtYXJ0VGVybWluYXRpb246MTsJLyogQnl0ZSAxMyBCaXQgNCAqLworCXVuc2lnbmVkIGNoYXI6MzsJLyogQnl0ZSAxMyBCaXRzIDUtNyAqLworfSBQQUNLRUQ7CisKKy8qCisgIERlZmluZSB0aGUgRW5hYmxlIFN0cmljdCBSb3VuZCBSb2JpbiBNb2RlIHJlcXVlc3QgdHlwZS4KKyovCisKK2VudW0gQnVzTG9naWNfUm91bmRSb2Jpbk1vZGVSZXF1ZXN0IHsKKwlCdXNMb2dpY19BZ2dyZXNzaXZlUm91bmRSb2Jpbk1vZGUgPSAwLAorCUJ1c0xvZ2ljX1N0cmljdFJvdW5kUm9iaW5Nb2RlID0gMQorfSBQQUNLRUQ7CisKKworLyoKKyAgRGVmaW5lIHRoZSBGZXRjaCBIb3N0IEFkYXB0ZXIgTG9jYWwgUkFNIHJlcXVlc3QgdHlwZS4KKyovCisKKyNkZWZpbmUgQnVzTG9naWNfQklPU19CYXNlT2Zmc2V0CQkwCisjZGVmaW5lIEJ1c0xvZ2ljX0F1dG9TQ1NJX0Jhc2VPZmZzZXQJCTY0CisKK3N0cnVjdCBCdXNMb2dpY19GZXRjaEhvc3RBZGFwdGVyTG9jYWxSQU1SZXF1ZXN0IHsKKwl1bnNpZ25lZCBjaGFyIEJ5dGVPZmZzZXQ7CS8qIEJ5dGUgMCAqLworCXVuc2lnbmVkIGNoYXIgQnl0ZUNvdW50OwkvKiBCeXRlIDEgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIExvY2FsIFJBTSBBdXRvU0NTSSBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfQXV0b1NDU0lEYXRhIHsKKwl1bnNpZ25lZCBjaGFyIEludGVybmFsRmFjdG9yeVNpZ25hdHVyZVsyXTsJLyogQnl0ZXMgMC0xICovCisJdW5zaWduZWQgY2hhciBJbmZvcm1hdGlvbkJ5dGVDb3VudDsJLyogQnl0ZSAyICovCisJdW5zaWduZWQgY2hhciBIb3N0QWRhcHRlclR5cGVbNl07CS8qIEJ5dGVzIDMtOCAqLworCXVuc2lnbmVkIGNoYXI6ODsJLyogQnl0ZSA5ICovCisJYm9vbGVhbiBGbG9wcHlFbmFibGVkOjE7CS8qIEJ5dGUgMTAgQml0IDAgKi8KKwlib29sZWFuIEZsb3BweVNlY29uZGFyeToxOwkvKiBCeXRlIDEwIEJpdCAxICovCisJYm9vbGVhbiBMZXZlbFNlbnNpdGl2ZUludGVycnVwdDoxOwkvKiBCeXRlIDEwIEJpdCAyICovCisJdW5zaWduZWQgY2hhcjoyOwkvKiBCeXRlIDEwIEJpdHMgMy00ICovCisJdW5zaWduZWQgY2hhciBTeXN0ZW1SQU1BcmVhRm9yQklPUzozOwkvKiBCeXRlIDEwIEJpdHMgNS03ICovCisJdW5zaWduZWQgY2hhciBETUFfQ2hhbm5lbDo3OwkvKiBCeXRlIDExIEJpdHMgMC02ICovCisJYm9vbGVhbiBETUFfQXV0b0NvbmZpZ3VyYXRpb246MTsJLyogQnl0ZSAxMSBCaXQgNyAqLworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw6NzsJLyogQnl0ZSAxMiBCaXRzIDAtNiAqLworCWJvb2xlYW4gSVJRX0F1dG9Db25maWd1cmF0aW9uOjE7CS8qIEJ5dGUgMTIgQml0IDcgKi8KKwl1bnNpZ25lZCBjaGFyIERNQV9UcmFuc2ZlclJhdGU7CS8qIEJ5dGUgMTMgKi8KKwl1bnNpZ25lZCBjaGFyIFNDU0lfSUQ7CS8qIEJ5dGUgMTQgKi8KKwlib29sZWFuIExvd0J5dGVUZXJtaW5hdGVkOjE7CS8qIEJ5dGUgMTUgQml0IDAgKi8KKwlib29sZWFuIFBhcml0eUNoZWNraW5nRW5hYmxlZDoxOwkvKiBCeXRlIDE1IEJpdCAxICovCisJYm9vbGVhbiBIaWdoQnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAxNSBCaXQgMiAqLworCWJvb2xlYW4gTm9pc3lDYWJsaW5nRW52aXJvbm1lbnQ6MTsJLyogQnl0ZSAxNSBCaXQgMyAqLworCWJvb2xlYW4gRmFzdFN5bmNocm9ub3VzTmVnb3RpYXRpb246MTsJLyogQnl0ZSAxNSBCaXQgNCAqLworCWJvb2xlYW4gQnVzUmVzZXRFbmFibGVkOjE7CS8qIEJ5dGUgMTUgQml0IDUgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSAxNSBCaXQgNiAqLworCWJvb2xlYW4gQWN0aXZlTmVnYXRpb25FbmFibGVkOjE7CS8qIEJ5dGUgMTUgQml0IDcgKi8KKwl1bnNpZ25lZCBjaGFyIEJ1c09uRGVsYXk7CS8qIEJ5dGUgMTYgKi8KKwl1bnNpZ25lZCBjaGFyIEJ1c09mZkRlbGF5OwkvKiBCeXRlIDE3ICovCisJYm9vbGVhbiBIb3N0QWRhcHRlckJJT1NFbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDAgKi8KKwlib29sZWFuIEJJT1NSZWRpcmVjdGlvbk9mSU5UMTlFbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDEgKi8KKwlib29sZWFuIEV4dGVuZGVkVHJhbnNsYXRpb25FbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDIgKi8KKwlib29sZWFuIE1hcFJlbW92YWJsZUFzRml4ZWRFbmFibGVkOjE7CS8qIEJ5dGUgMTggQml0IDMgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSAxOCBCaXQgNCAqLworCWJvb2xlYW4gQklPU1N1cHBvcnRzTW9yZVRoYW4yRHJpdmVzRW5hYmxlZDoxOwkvKiBCeXRlIDE4IEJpdCA1ICovCisJYm9vbGVhbiBCSU9TSW50ZXJydXB0TW9kZUVuYWJsZWQ6MTsJLyogQnl0ZSAxOCBCaXQgNiAqLworCWJvb2xlYW4gRmxvcHRpY2FsU3VwcG9ydEVuYWJsZWQ6MTsJLyogQnl0ZSAxOSBCaXQgNyAqLworCXVuc2lnbmVkIHNob3J0IERldmljZUVuYWJsZWQ7CS8qIEJ5dGVzIDE5LTIwICovCisJdW5zaWduZWQgc2hvcnQgV2lkZVBlcm1pdHRlZDsJLyogQnl0ZXMgMjEtMjIgKi8KKwl1bnNpZ25lZCBzaG9ydCBGYXN0UGVybWl0dGVkOwkvKiBCeXRlcyAyMy0yNCAqLworCXVuc2lnbmVkIHNob3J0IFN5bmNocm9ub3VzUGVybWl0dGVkOwkvKiBCeXRlcyAyNS0yNiAqLworCXVuc2lnbmVkIHNob3J0IERpc2Nvbm5lY3RQZXJtaXR0ZWQ7CS8qIEJ5dGVzIDI3LTI4ICovCisJdW5zaWduZWQgc2hvcnQgU2VuZFN0YXJ0VW5pdENvbW1hbmQ7CS8qIEJ5dGVzIDI5LTMwICovCisJdW5zaWduZWQgc2hvcnQgSWdub3JlSW5CSU9TU2NhbjsJLyogQnl0ZXMgMzEtMzIgKi8KKwl1bnNpZ25lZCBjaGFyIFBDSUludGVycnVwdFBpbjoyOwkvKiBCeXRlIDMzIEJpdHMgMC0xICovCisJdW5zaWduZWQgY2hhciBIb3N0QWRhcHRlcklPUG9ydEFkZHJlc3M6MjsJLyogQnl0ZSAzMyBCaXRzIDItMyAqLworCWJvb2xlYW4gU3RyaWN0Um91bmRSb2Jpbk1vZGVFbmFibGVkOjE7CS8qIEJ5dGUgMzMgQml0IDQgKi8KKwlib29sZWFuIFZFU0FCdXNTcGVlZEdyZWF0ZXJUaGFuMzNNSHo6MTsJLyogQnl0ZSAzMyBCaXQgNSAqLworCWJvb2xlYW4gVkVTQUJ1cnN0V3JpdGVFbmFibGVkOjE7CS8qIEJ5dGUgMzMgQml0IDYgKi8KKwlib29sZWFuIFZFU0FCdXJzdFJlYWRFbmFibGVkOjE7CS8qIEJ5dGUgMzMgQml0IDcgKi8KKwl1bnNpZ25lZCBzaG9ydCBVbHRyYVBlcm1pdHRlZDsJLyogQnl0ZXMgMzQtMzUgKi8KKwl1bnNpZ25lZCBpbnQ6MzI7CS8qIEJ5dGVzIDM2LTM5ICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDQwICovCisJdW5zaWduZWQgY2hhciBBdXRvU0NTSU1heGltdW1MVU47CS8qIEJ5dGUgNDEgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSA0MiBCaXQgMCAqLworCWJvb2xlYW4gU0NBTV9Eb21pbmFudDoxOwkvKiBCeXRlIDQyIEJpdCAxICovCisJYm9vbGVhbiBTQ0FNX0VuYWJsZWQ6MTsJLyogQnl0ZSA0MiBCaXQgMiAqLworCWJvb2xlYW4gU0NBTV9MZXZlbDI6MTsJLyogQnl0ZSA0MiBCaXQgMyAqLworCXVuc2lnbmVkIGNoYXI6NDsJLyogQnl0ZSA0MiBCaXRzIDQtNyAqLworCWJvb2xlYW4gSU5UMTNFeHRlbnNpb25FbmFibGVkOjE7CS8qIEJ5dGUgNDMgQml0IDAgKi8KKwkgYm9vbGVhbjoxOwkJLyogQnl0ZSA0MyBCaXQgMSAqLworCWJvb2xlYW4gQ0RST01Cb290RW5hYmxlZDoxOwkvKiBCeXRlIDQzIEJpdCAyICovCisJdW5zaWduZWQgY2hhcjo1OwkvKiBCeXRlIDQzIEJpdHMgMy03ICovCisJdW5zaWduZWQgY2hhciBCb290VGFyZ2V0SUQ6NDsJLyogQnl0ZSA0NCBCaXRzIDAtMyAqLworCXVuc2lnbmVkIGNoYXIgQm9vdENoYW5uZWw6NDsJLyogQnl0ZSA0NCBCaXRzIDQtNyAqLworCXVuc2lnbmVkIGNoYXIgRm9yY2VCdXNEZXZpY2VTY2FubmluZ09yZGVyOjE7CS8qIEJ5dGUgNDUgQml0IDAgKi8KKwl1bnNpZ25lZCBjaGFyOjc7CS8qIEJ5dGUgNDUgQml0cyAxLTcgKi8KKwl1bnNpZ25lZCBzaG9ydCBOb25UYWdnZWRUb0FsdGVybmF0ZUxVTlBlcm1pdHRlZDsJLyogQnl0ZXMgNDYtNDcgKi8KKwl1bnNpZ25lZCBzaG9ydCBSZW5lZ290aWF0ZVN5bmNBZnRlckNoZWNrQ29uZGl0aW9uOwkvKiBCeXRlcyA0OC00OSAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbMTBdOwkvKiBCeXRlcyA1MC01OSAqLworCXVuc2lnbmVkIGNoYXIgTWFudWZhY3R1cmluZ0RpYWdub3N0aWNbMl07CS8qIEJ5dGVzIDYwLTYxICovCisJdW5zaWduZWQgc2hvcnQgQ2hlY2tzdW07CS8qIEJ5dGVzIDYyLTYzICovCit9IFBBQ0tFRDsKKworLyoKKyAgRGVmaW5lIHRoZSBIb3N0IEFkYXB0ZXIgTG9jYWwgUkFNIEF1dG8gU0NTSSBCeXRlIDQ1IHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19BdXRvU0NTSUJ5dGU0NSB7CisJdW5zaWduZWQgY2hhciBGb3JjZUJ1c0RldmljZVNjYW5uaW5nT3JkZXI6MTsJLyogQml0IDAgKi8KKwl1bnNpZ25lZCBjaGFyOjc7CS8qIEJpdHMgMS03ICovCit9OworCisvKgorICBEZWZpbmUgdGhlIEhvc3QgQWRhcHRlciBMb2NhbCBSQU0gQklPUyBEcml2ZSBNYXAgQnl0ZSBzdHJ1Y3R1cmUuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0JJT1NfRHJpdmVNYXBPZmZzZXQJCTE3CisKK3N0cnVjdCBCdXNMb2dpY19CSU9TRHJpdmVNYXBCeXRlIHsKKwl1bnNpZ25lZCBjaGFyIFRhcmdldElEQml0MzoxOwkvKiBCaXQgMCAqLworCXVuc2lnbmVkIGNoYXI6MjsJLyogQml0cyAxLTIgKi8KKwllbnVtIEJ1c0xvZ2ljX0JJT1NfRGlza0dlb21ldHJ5VHJhbnNsYXRpb24gRGlza0dlb21ldHJ5OjI7CS8qIEJpdHMgMy00ICovCisJdW5zaWduZWQgY2hhciBUYXJnZXRJRDozOwkvKiBCaXRzIDUtNyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBTZXQgQ0NCIEZvcm1hdCByZXF1ZXN0IHR5cGUuICBFeHRlbmRlZCBMVU4gRm9ybWF0IENDQnMgYXJlCisgIG5lY2Vzc2FyeSB0byBzdXBwb3J0IG1vcmUgdGhhbiA4IExvZ2ljYWwgVW5pdHMgcGVyIFRhcmdldCBEZXZpY2UuCisqLworCitlbnVtIEJ1c0xvZ2ljX1NldENDQkZvcm1hdFJlcXVlc3QgeworCUJ1c0xvZ2ljX0xlZ2FjeUxVTkZvcm1hdENDQiA9IDAsCisJQnVzTG9naWNfRXh0ZW5kZWRMVU5Gb3JtYXRDQ0IgPSAxCit9IFBBQ0tFRDsKKworLyoKKyAgRGVmaW5lIHRoZSBPdXRnb2luZyBNYWlsYm94IEFjdGlvbiBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfQWN0aW9uQ29kZSB7CisJQnVzTG9naWNfT3V0Z29pbmdNYWlsYm94RnJlZSA9IDB4MDAsCisJQnVzTG9naWNfTWFpbGJveFN0YXJ0Q29tbWFuZCA9IDB4MDEsCisJQnVzTG9naWNfTWFpbGJveEFib3J0Q29tbWFuZCA9IDB4MDIKK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSB0aGUgSW5jb21pbmcgTWFpbGJveCBDb21wbGV0aW9uIENvZGVzLiAgVGhlIE11bHRpTWFzdGVyIEZpcm13YXJlCisgIG9ubHkgdXNlcyBjb2RlcyAwIC0gNC4gIFRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciBoYXMgbm8gbWFpbGJveGVzLCBzbworICBjb21wbGV0aW9uIGNvZGVzIGFyZSBzdG9yZWQgaW4gdGhlIENDQjsgaXQgb25seSB1c2VzIGNvZGVzIDEsIDIsIDQsIGFuZCA1LgorKi8KKworZW51bSBCdXNMb2dpY19Db21wbGV0aW9uQ29kZSB7CisJQnVzTG9naWNfSW5jb21pbmdNYWlsYm94RnJlZSA9IDB4MDAsCisJQnVzTG9naWNfQ29tbWFuZENvbXBsZXRlZFdpdGhvdXRFcnJvciA9IDB4MDEsCisJQnVzTG9naWNfQ29tbWFuZEFib3J0ZWRBdEhvc3RSZXF1ZXN0ID0gMHgwMiwKKwlCdXNMb2dpY19BYm9ydGVkQ29tbWFuZE5vdEZvdW5kID0gMHgwMywKKwlCdXNMb2dpY19Db21tYW5kQ29tcGxldGVkV2l0aEVycm9yID0gMHgwNCwKKwlCdXNMb2dpY19JbnZhbGlkQ0NCID0gMHgwNQorfSBQQUNLRUQ7CisKKy8qCisgIERlZmluZSB0aGUgQ29tbWFuZCBDb250cm9sIEJsb2NrIChDQ0IpIE9wY29kZXMuCisqLworCitlbnVtIEJ1c0xvZ2ljX0NDQl9PcGNvZGUgeworCUJ1c0xvZ2ljX0luaXRpYXRvckNDQiA9IDB4MDAsCisJQnVzTG9naWNfVGFyZ2V0Q0NCID0gMHgwMSwKKwlCdXNMb2dpY19Jbml0aWF0b3JDQ0JfU2NhdHRlckdhdGhlciA9IDB4MDIsCisJQnVzTG9naWNfSW5pdGlhdG9yQ0NCX1Jlc2lkdWFsRGF0YUxlbmd0aCA9IDB4MDMsCisJQnVzTG9naWNfSW5pdGlhdG9yQ0NCX1NjYXR0ZXJHYXRoZXJSZXNpZHVhbCA9IDB4MDQsCisJQnVzTG9naWNfQnVzRGV2aWNlUmVzZXQgPSAweDgxCit9IFBBQ0tFRDsKKworCisvKgorICBEZWZpbmUgdGhlIENDQiBEYXRhIERpcmVjdGlvbiBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfRGF0YURpcmVjdGlvbiB7CisJQnVzTG9naWNfVW5jaGVja2VkRGF0YVRyYW5zZmVyID0gMCwKKwlCdXNMb2dpY19EYXRhSW5MZW5ndGhDaGVja2VkID0gMSwKKwlCdXNMb2dpY19EYXRhT3V0TGVuZ3RoQ2hlY2tlZCA9IDIsCisJQnVzTG9naWNfTm9EYXRhVHJhbnNmZXIgPSAzCit9OworCisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIFN0YXR1cyBDb2Rlcy4gIFRoZSBNdWx0aU1hc3RlciBGaXJtd2FyZSBkb2VzIG5vdAorICByZXR1cm4gc3RhdHVzIGNvZGUgMHgwQzsgaXQgdXNlcyAweDEyIGZvciBib3RoIG92ZXJydW5zIGFuZCB1bmRlcnJ1bnMuCisqLworCitlbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyU3RhdHVzIHsKKwlCdXNMb2dpY19Db21tYW5kQ29tcGxldGVkTm9ybWFsbHkgPSAweDAwLAorCUJ1c0xvZ2ljX0xpbmtlZENvbW1hbmRDb21wbGV0ZWQgPSAweDBBLAorCUJ1c0xvZ2ljX0xpbmtlZENvbW1hbmRDb21wbGV0ZWRXaXRoRmxhZyA9IDB4MEIsCisJQnVzTG9naWNfRGF0YVVuZGVyUnVuID0gMHgwQywKKwlCdXNMb2dpY19TQ1NJU2VsZWN0aW9uVGltZW91dCA9IDB4MTEsCisJQnVzTG9naWNfRGF0YU92ZXJSdW4gPSAweDEyLAorCUJ1c0xvZ2ljX1VuZXhwZWN0ZWRCdXNGcmVlID0gMHgxMywKKwlCdXNMb2dpY19JbnZhbGlkQnVzUGhhc2VSZXF1ZXN0ZWQgPSAweDE0LAorCUJ1c0xvZ2ljX0ludmFsaWRPdXRnb2luZ01haWxib3hBY3Rpb25Db2RlID0gMHgxNSwKKwlCdXNMb2dpY19JbnZhbGlkQ29tbWFuZE9wZXJhdGlvbkNvZGUgPSAweDE2LAorCUJ1c0xvZ2ljX0xpbmtlZENDQmhhc0ludmFsaWRMVU4gPSAweDE3LAorCUJ1c0xvZ2ljX0ludmFsaWRDb21tYW5kUGFyYW1ldGVyID0gMHgxQSwKKwlCdXNMb2dpY19BdXRvUmVxdWVzdFNlbnNlRmFpbGVkID0gMHgxQiwKKwlCdXNMb2dpY19UYWdnZWRRdWV1aW5nTWVzc2FnZVJlamVjdGVkID0gMHgxQywKKwlCdXNMb2dpY19VbnN1cHBvcnRlZE1lc3NhZ2VSZWNlaXZlZCA9IDB4MUQsCisJQnVzTG9naWNfSG9zdEFkYXB0ZXJIYXJkd2FyZUZhaWxlZCA9IDB4MjAsCisJQnVzTG9naWNfVGFyZ2V0RmFpbGVkUmVzcG9uc2VUb0FUTiA9IDB4MjEsCisJQnVzTG9naWNfSG9zdEFkYXB0ZXJBc3NlcnRlZFJTVCA9IDB4MjIsCisJQnVzTG9naWNfT3RoZXJEZXZpY2VBc3NlcnRlZFJTVCA9IDB4MjMsCisJQnVzTG9naWNfVGFyZ2V0RGV2aWNlUmVjb25uZWN0ZWRJbXByb3Blcmx5ID0gMHgyNCwKKwlCdXNMb2dpY19Ib3N0QWRhcHRlckFzc2VydGVkQnVzRGV2aWNlUmVzZXQgPSAweDI1LAorCUJ1c0xvZ2ljX0Fib3J0UXVldWVHZW5lcmF0ZWQgPSAweDI2LAorCUJ1c0xvZ2ljX0hvc3RBZGFwdGVyU29mdHdhcmVFcnJvciA9IDB4MjcsCisJQnVzTG9naWNfSG9zdEFkYXB0ZXJIYXJkd2FyZVRpbWVvdXRFcnJvciA9IDB4MzAsCisJQnVzTG9naWNfU0NTSVBhcml0eUVycm9yRGV0ZWN0ZWQgPSAweDM0Cit9IFBBQ0tFRDsKKworCisvKgorICBEZWZpbmUgdGhlIFNDU0kgVGFyZ2V0IERldmljZSBTdGF0dXMgQ29kZXMuCisqLworCitlbnVtIEJ1c0xvZ2ljX1RhcmdldERldmljZVN0YXR1cyB7CisJQnVzTG9naWNfT3BlcmF0aW9uR29vZCA9IDB4MDAsCisJQnVzTG9naWNfQ2hlY2tDb25kaXRpb24gPSAweDAyLAorCUJ1c0xvZ2ljX0RldmljZUJ1c3kgPSAweDA4Cit9IFBBQ0tFRDsKKworLyoKKyAgRGVmaW5lIHRoZSBRdWV1ZSBUYWcgQ29kZXMuCisqLworCitlbnVtIEJ1c0xvZ2ljX1F1ZXVlVGFnIHsKKwlCdXNMb2dpY19TaW1wbGVRdWV1ZVRhZyA9IDAsCisJQnVzTG9naWNfSGVhZE9mUXVldWVUYWcgPSAxLAorCUJ1c0xvZ2ljX09yZGVyZWRRdWV1ZVRhZyA9IDIsCisJQnVzTG9naWNfUmVzZXJ2ZWRRVCA9IDMKK307CisKKy8qCisgIERlZmluZSB0aGUgU0NTSSBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sgKENEQikuCisqLworCisjZGVmaW5lIEJ1c0xvZ2ljX0NEQl9NYXhMZW5ndGgJCQkxMgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0NTSV9DREJfVFtCdXNMb2dpY19DREJfTWF4TGVuZ3RoXTsKKworCisvKgorICBEZWZpbmUgdGhlIFNjYXR0ZXIvR2F0aGVyIFNlZ21lbnQgc3RydWN0dXJlIHJlcXVpcmVkIGJ5IHRoZSBNdWx0aU1hc3RlcgorICBGaXJtd2FyZSBJbnRlcmZhY2UgYW5kIHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlci4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19TY2F0dGVyR2F0aGVyU2VnbWVudCB7CisJdTMyIFNlZ21lbnRCeXRlQ291bnQ7CS8qIEJ5dGVzIDAtMyAqLworCXUzMiBTZWdtZW50RGF0YVBvaW50ZXI7CS8qIEJ5dGVzIDQtNyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBEcml2ZXIgQ0NCIFN0YXR1cyBDb2Rlcy4KKyovCisKK2VudW0gQnVzTG9naWNfQ0NCX1N0YXR1cyB7CisJQnVzTG9naWNfQ0NCX0ZyZWUgPSAwLAorCUJ1c0xvZ2ljX0NDQl9BY3RpdmUgPSAxLAorCUJ1c0xvZ2ljX0NDQl9Db21wbGV0ZWQgPSAyLAorCUJ1c0xvZ2ljX0NDQl9SZXNldCA9IDMKK30gUEFDS0VEOworCisKKy8qCisgIERlZmluZSB0aGUgMzIgQml0IE1vZGUgQ29tbWFuZCBDb250cm9sIEJsb2NrIChDQ0IpIHN0cnVjdHVyZS4gIFRoZSBmaXJzdCA0MAorICBieXRlcyBhcmUgZGVmaW5lZCBieSBhbmQgY29tbW9uIHRvIGJvdGggdGhlIE11bHRpTWFzdGVyIEZpcm13YXJlIGFuZCB0aGUKKyAgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIuICBUaGUgbmV4dCA2MCBieXRlcyBhcmUgZGVmaW5lZCBieSB0aGUgRmxhc2hQb2ludAorICBTQ0NCIE1hbmFnZXIuICBUaGUgcmVtYWluaW5nIGNvbXBvbmVudHMgYXJlIGRlZmluZWQgYnkgdGhlIExpbnV4IEJ1c0xvZ2ljCisgIERyaXZlci4gIEV4dGVuZGVkIExVTiBGb3JtYXQgQ0NCcyBkaWZmZXIgZnJvbSBMZWdhY3kgTFVOIEZvcm1hdCAzMiBCaXQgTW9kZQorICBDQ0JzIG9ubHkgaW4gaGF2aW5nIHRoZSBUYWdFbmFibGUgYW5kIFF1ZXVlVGFnIGZpZWxkcyBtb3ZlZCBmcm9tIGJ5dGUgMTcgdG8KKyAgYnl0ZSAxLCBhbmQgdGhlIExvZ2ljYWwgVW5pdCBmaWVsZCBpbiBieXRlIDE3IGV4cGFuZGVkIHRvIDYgYml0cy4gIEluIHRoZW9yeSwKKyAgRXh0ZW5kZWQgTFVOIEZvcm1hdCBDQ0JzIGNhbiBzdXBwb3J0IHVwIHRvIDY0IExvZ2ljYWwgVW5pdHMsIGJ1dCBpbiBwcmFjdGljZQorICBtYW55IGRldmljZXMgd2lsbCByZXNwb25kIGltcHJvcGVybHkgdG8gTG9naWNhbCBVbml0cyBiZXR3ZWVuIDMyIGFuZCA2MywgYW5kCisgIHRoZSBTQ1NJLTIgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIEJpdCA1IGFzIExVTlRBUi4gIEV4dGVuZGVkIExVTiBGb3JtYXQgQ0NCcworICBhcmUgdXNlZCBieSByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIE11bHRpTWFzdGVyIEZpcm13YXJlLCBhcyB3ZWxsIGFzIGJ5IHRoZQorICBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlcjsgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyIG9ubHkgc3VwcG9ydHMgMzIgTG9naWNhbAorICBVbml0cy4gIFNpbmNlIDY0IExvZ2ljYWwgVW5pdHMgYXJlIHVubGlrZWx5IHRvIGJlIG5lZWRlZCBpbiBwcmFjdGljZSwgYW5kCisgIHNpbmNlIHRoZXkgYXJlIHByb2JsZW1hdGljIGZvciB0aGUgYWJvdmUgcmVhc29ucywgYW5kIHNpbmNlIGxpbWl0aW5nIHRoZW0gdG8KKyAgNSBiaXRzIHNpbXBsaWZpZXMgdGhlIENDQiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cworICAzMiBMb2dpY2FsIFVuaXRzIHBlciBUYXJnZXQgRGV2aWNlLgorKi8KKworc3RydWN0IEJ1c0xvZ2ljX0NDQiB7CisJLyoKKwkgICBNdWx0aU1hc3RlciBGaXJtd2FyZSBhbmQgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIgQ29tbW9uIFBvcnRpb24uCisJICovCisJZW51bSBCdXNMb2dpY19DQ0JfT3Bjb2RlIE9wY29kZTsJLyogQnl0ZSAwICovCisJdW5zaWduZWQgY2hhcjozOwkvKiBCeXRlIDEgQml0cyAwLTIgKi8KKwllbnVtIEJ1c0xvZ2ljX0RhdGFEaXJlY3Rpb24gRGF0YURpcmVjdGlvbjoyOwkvKiBCeXRlIDEgQml0cyAzLTQgKi8KKwlib29sZWFuIFRhZ0VuYWJsZToxOwkvKiBCeXRlIDEgQml0IDUgKi8KKwllbnVtIEJ1c0xvZ2ljX1F1ZXVlVGFnIFF1ZXVlVGFnOjI7CS8qIEJ5dGUgMSBCaXRzIDYtNyAqLworCXVuc2lnbmVkIGNoYXIgQ0RCX0xlbmd0aDsJLyogQnl0ZSAyICovCisJdW5zaWduZWQgY2hhciBTZW5zZURhdGFMZW5ndGg7CS8qIEJ5dGUgMyAqLworCXUzMiBEYXRhTGVuZ3RoOwkJLyogQnl0ZXMgNC03ICovCisJdTMyIERhdGFQb2ludGVyOwkvKiBCeXRlcyA4LTExICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDEyICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDEzICovCisJZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlclN0YXR1cyBIb3N0QWRhcHRlclN0YXR1czsJLyogQnl0ZSAxNCAqLworCWVudW0gQnVzTG9naWNfVGFyZ2V0RGV2aWNlU3RhdHVzIFRhcmdldERldmljZVN0YXR1czsJLyogQnl0ZSAxNSAqLworCXVuc2lnbmVkIGNoYXIgVGFyZ2V0SUQ7CS8qIEJ5dGUgMTYgKi8KKwl1bnNpZ25lZCBjaGFyIExvZ2ljYWxVbml0OjU7CS8qIEJ5dGUgMTcgQml0cyAwLTQgKi8KKwlib29sZWFuIExlZ2FjeVRhZ0VuYWJsZToxOwkvKiBCeXRlIDE3IEJpdCA1ICovCisJZW51bSBCdXNMb2dpY19RdWV1ZVRhZyBMZWdhY3lRdWV1ZVRhZzoyOwkvKiBCeXRlIDE3IEJpdHMgNi03ICovCisJU0NTSV9DREJfVCBDREI7CQkvKiBCeXRlcyAxOC0yOSAqLworCXVuc2lnbmVkIGNoYXI6ODsJLyogQnl0ZSAzMCAqLworCXVuc2lnbmVkIGNoYXI6ODsJLyogQnl0ZSAzMSAqLworCXVuc2lnbmVkIGludDozMjsJLyogQnl0ZXMgMzItMzUgKi8KKwl1MzIgU2Vuc2VEYXRhUG9pbnRlcjsJLyogQnl0ZXMgMzYtMzkgKi8KKwkvKgorCSAgIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyIERlZmluZWQgUG9ydGlvbi4KKwkgKi8KKwl2b2lkICgqQ2FsbGJhY2tGdW5jdGlvbikgKHN0cnVjdCBCdXNMb2dpY19DQ0IgKik7CS8qIEJ5dGVzIDQwLTQzICovCisJdTMyIEJhc2VBZGRyZXNzOwkvKiBCeXRlcyA0NC00NyAqLworCWVudW0gQnVzTG9naWNfQ29tcGxldGlvbkNvZGUgQ29tcGxldGlvbkNvZGU7CS8qIEJ5dGUgNDggKi8KKyNpZm5kZWYgQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDQ5ICovCisJdW5zaWduZWQgc2hvcnQgT1NfRmxhZ3M7CS8qIEJ5dGVzIDUwLTUxICovCisJdW5zaWduZWQgY2hhciBQcml2YXRlWzQ4XTsJLyogQnl0ZXMgNTItOTkgKi8KKyNlbmRpZgorCS8qCisJICAgQnVzTG9naWMgTGludXggRHJpdmVyIERlZmluZWQgUG9ydGlvbi4KKwkgKi8KKwlkbWFfYWRkcl90IEFsbG9jYXRpb25Hcm91cEhlYWQ7CisJdW5zaWduZWQgaW50IEFsbG9jYXRpb25Hcm91cFNpemU7CisJdTMyIERNQV9IYW5kbGU7CisJZW51bSBCdXNMb2dpY19DQ0JfU3RhdHVzIFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIFNlcmlhbE51bWJlcjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpDb21tYW5kOworCXN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXI7CisJc3RydWN0IEJ1c0xvZ2ljX0NDQiAqTmV4dDsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpOZXh0QWxsOworCXN0cnVjdCBCdXNMb2dpY19TY2F0dGVyR2F0aGVyU2VnbWVudAorCSBTY2F0dGVyR2F0aGVyTGlzdFtCdXNMb2dpY19TY2F0dGVyR2F0aGVyTGltaXRdOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSAzMiBCaXQgTW9kZSBPdXRnb2luZyBNYWlsYm94IHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3ggeworCXUzMiBDQ0I7CQkvKiBCeXRlcyAwLTMgKi8KKwl1bnNpZ25lZCBpbnQ6MjQ7CS8qIEJ5dGVzIDQtNiAqLworCWVudW0gQnVzTG9naWNfQWN0aW9uQ29kZSBBY3Rpb25Db2RlOwkvKiBCeXRlIDcgKi8KK307CisKKy8qCisgIERlZmluZSB0aGUgMzIgQml0IE1vZGUgSW5jb21pbmcgTWFpbGJveCBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfSW5jb21pbmdNYWlsYm94IHsKKwl1MzIgQ0NCOwkJLyogQnl0ZXMgMC0zICovCisJZW51bSBCdXNMb2dpY19Ib3N0QWRhcHRlclN0YXR1cyBIb3N0QWRhcHRlclN0YXR1czsJLyogQnl0ZSA0ICovCisJZW51bSBCdXNMb2dpY19UYXJnZXREZXZpY2VTdGF0dXMgVGFyZ2V0RGV2aWNlU3RhdHVzOwkvKiBCeXRlIDUgKi8KKwl1bnNpZ25lZCBjaGFyOjg7CS8qIEJ5dGUgNiAqLworCWVudW0gQnVzTG9naWNfQ29tcGxldGlvbkNvZGUgQ29tcGxldGlvbkNvZGU7CS8qIEJ5dGUgNyAqLworfTsKKworCisvKgorICBEZWZpbmUgdGhlIEJ1c0xvZ2ljIERyaXZlciBPcHRpb25zIHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19Ecml2ZXJPcHRpb25zIHsKKwl1bnNpZ25lZCBzaG9ydCBUYWdnZWRRdWV1aW5nUGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IFRhZ2dlZFF1ZXVpbmdQZXJtaXR0ZWRNYXNrOworCXVuc2lnbmVkIHNob3J0IEJ1c1NldHRsZVRpbWU7CisJc3RydWN0IEJ1c0xvZ2ljX0xvY2FsT3B0aW9ucyBMb2NhbE9wdGlvbnM7CisJdW5zaWduZWQgY2hhciBDb21tb25RdWV1ZURlcHRoOworCXVuc2lnbmVkIGNoYXIgUXVldWVEZXB0aFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKK307CisKKy8qCisgIERlZmluZSB0aGUgSG9zdCBBZGFwdGVyIFRhcmdldCBGbGFncyBzdHJ1Y3R1cmUuCisqLworCitzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgeworCWJvb2xlYW4gVGFyZ2V0RXhpc3RzOjE7CisJYm9vbGVhbiBUYWdnZWRRdWV1aW5nU3VwcG9ydGVkOjE7CisJYm9vbGVhbiBXaWRlVHJhbnNmZXJzU3VwcG9ydGVkOjE7CisJYm9vbGVhbiBUYWdnZWRRdWV1aW5nQWN0aXZlOjE7CisJYm9vbGVhbiBXaWRlVHJhbnNmZXJzQWN0aXZlOjE7CisJYm9vbGVhbiBDb21tYW5kU3VjY2Vzc2Z1bEZsYWc6MTsKKwlib29sZWFuIFRhcmdldEluZm9SZXBvcnRlZDoxOworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBIb3N0IEFkYXB0ZXIgVGFyZ2V0IFN0YXRpc3RpY3Mgc3RydWN0dXJlLgorKi8KKworI2RlZmluZSBCdXNMb2dpY19TaXplQnVja2V0cwkJCTEwCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEJ1c0xvZ2ljX0NvbW1hbmRTaXplQnVja2V0c19UW0J1c0xvZ2ljX1NpemVCdWNrZXRzXTsKKworc3RydWN0IEJ1c0xvZ2ljX1RhcmdldFN0YXRpc3RpY3MgeworCXVuc2lnbmVkIGludCBDb21tYW5kc0F0dGVtcHRlZDsKKwl1bnNpZ25lZCBpbnQgQ29tbWFuZHNDb21wbGV0ZWQ7CisJdW5zaWduZWQgaW50IFJlYWRDb21tYW5kczsKKwl1bnNpZ25lZCBpbnQgV3JpdGVDb21tYW5kczsKKwlzdHJ1Y3QgQnVzTG9naWNfQnl0ZUNvdW50ZXIgVG90YWxCeXRlc1JlYWQ7CisJc3RydWN0IEJ1c0xvZ2ljX0J5dGVDb3VudGVyIFRvdGFsQnl0ZXNXcml0dGVuOworCUJ1c0xvZ2ljX0NvbW1hbmRTaXplQnVja2V0c19UIFJlYWRDb21tYW5kU2l6ZUJ1Y2tldHM7CisJQnVzTG9naWNfQ29tbWFuZFNpemVCdWNrZXRzX1QgV3JpdGVDb21tYW5kU2l6ZUJ1Y2tldHM7CisJdW5zaWduZWQgc2hvcnQgQ29tbWFuZEFib3J0c1JlcXVlc3RlZDsKKwl1bnNpZ25lZCBzaG9ydCBDb21tYW5kQWJvcnRzQXR0ZW1wdGVkOworCXVuc2lnbmVkIHNob3J0IENvbW1hbmRBYm9ydHNDb21wbGV0ZWQ7CisJdW5zaWduZWQgc2hvcnQgQnVzRGV2aWNlUmVzZXRzUmVxdWVzdGVkOworCXVuc2lnbmVkIHNob3J0IEJ1c0RldmljZVJlc2V0c0F0dGVtcHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBCdXNEZXZpY2VSZXNldHNDb21wbGV0ZWQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJSZXNldHNSZXF1ZXN0ZWQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJSZXNldHNBdHRlbXB0ZWQ7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJSZXNldHNDb21wbGV0ZWQ7Cit9OworCisvKgorICBEZWZpbmUgdGhlIEZsYXNoUG9pbnQgQ2FyZCBIYW5kbGUgZGF0YSB0eXBlLgorKi8KKworI2RlZmluZSBGbGFzaFBvaW50X0JhZENhcmRIYW5kbGUJCTB4RkZGRkZGRkYKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRmxhc2hQb2ludF9DYXJkSGFuZGxlX1Q7CisKKworLyoKKyAgRGVmaW5lIHRoZSBGbGFzaFBvaW50IEluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIFRoaXMgc3RydWN0dXJlIGlzIGRlZmluZWQKKyAgYnkgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyLgorKi8KKworc3RydWN0IEZsYXNoUG9pbnRfSW5mbyB7CisJdTMyIEJhc2VBZGRyZXNzOwkvKiBCeXRlcyAwLTMgKi8KKwlib29sZWFuIFByZXNlbnQ7CS8qIEJ5dGUgNCAqLworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw7CS8qIEJ5dGUgNSAqLworCXVuc2lnbmVkIGNoYXIgU0NTSV9JRDsJLyogQnl0ZSA2ICovCisJdW5zaWduZWQgY2hhciBTQ1NJX0xVTjsJLyogQnl0ZSA3ICovCisJdW5zaWduZWQgc2hvcnQgRmlybXdhcmVSZXZpc2lvbjsJLyogQnl0ZXMgOC05ICovCisJdW5zaWduZWQgc2hvcnQgU3luY2hyb25vdXNQZXJtaXR0ZWQ7CS8qIEJ5dGVzIDEwLTExICovCisJdW5zaWduZWQgc2hvcnQgRmFzdFBlcm1pdHRlZDsJLyogQnl0ZXMgMTItMTMgKi8KKwl1bnNpZ25lZCBzaG9ydCBVbHRyYVBlcm1pdHRlZDsJLyogQnl0ZXMgMTQtMTUgKi8KKwl1bnNpZ25lZCBzaG9ydCBEaXNjb25uZWN0UGVybWl0dGVkOwkvKiBCeXRlcyAxNi0xNyAqLworCXVuc2lnbmVkIHNob3J0IFdpZGVQZXJtaXR0ZWQ7CS8qIEJ5dGVzIDE4LTE5ICovCisJYm9vbGVhbiBQYXJpdHlDaGVja2luZ0VuYWJsZWQ6MTsJLyogQnl0ZSAyMCBCaXQgMCAqLworCWJvb2xlYW4gSG9zdFdpZGVTQ1NJOjE7CS8qIEJ5dGUgMjAgQml0IDEgKi8KKwlib29sZWFuIEhvc3RTb2Z0UmVzZXQ6MTsJLyogQnl0ZSAyMCBCaXQgMiAqLworCWJvb2xlYW4gRXh0ZW5kZWRUcmFuc2xhdGlvbkVuYWJsZWQ6MTsJLyogQnl0ZSAyMCBCaXQgMyAqLworCWJvb2xlYW4gTG93Qnl0ZVRlcm1pbmF0ZWQ6MTsJLyogQnl0ZSAyMCBCaXQgNCAqLworCWJvb2xlYW4gSGlnaEJ5dGVUZXJtaW5hdGVkOjE7CS8qIEJ5dGUgMjAgQml0IDUgKi8KKwlib29sZWFuIFJlcG9ydERhdGFVbmRlcnJ1bjoxOwkvKiBCeXRlIDIwIEJpdCA2ICovCisJYm9vbGVhbiBTQ0FNX0VuYWJsZWQ6MTsJLyogQnl0ZSAyMCBCaXQgNyAqLworCWJvb2xlYW4gU0NBTV9MZXZlbDI6MTsJLyogQnl0ZSAyMSBCaXQgMCAqLworCXVuc2lnbmVkIGNoYXI6NzsJLyogQnl0ZSAyMSBCaXRzIDEtNyAqLworCXVuc2lnbmVkIGNoYXIgRmFtaWx5OwkvKiBCeXRlIDIyICovCisJdW5zaWduZWQgY2hhciBCdXNUeXBlOwkvKiBCeXRlIDIzICovCisJdW5zaWduZWQgY2hhciBNb2RlbE51bWJlclszXTsJLyogQnl0ZXMgMjQtMjYgKi8KKwl1bnNpZ25lZCBjaGFyIFJlbGF0aXZlQ2FyZE51bWJlcjsJLyogQnl0ZSAyNyAqLworCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRbNF07CS8qIEJ5dGVzIDI4LTMxICovCisJdW5zaWduZWQgaW50IE9TX1Jlc2VydmVkOwkvKiBCeXRlcyAzMi0zNSAqLworCXVuc2lnbmVkIGNoYXIgVHJhbnNsYXRpb25JbmZvWzRdOwkvKiBCeXRlcyAzNi0zOSAqLworCXVuc2lnbmVkIGludCBSZXNlcnZlZDJbNV07CS8qIEJ5dGVzIDQwLTU5ICovCisJdW5zaWduZWQgaW50IFNlY29uZGFyeVJhbmdlOwkvKiBCeXRlcyA2MC02MyAqLworfTsKKworLyoKKyAgRGVmaW5lIHRoZSBCdXNMb2dpYyBEcml2ZXIgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4KKyovCisKK3N0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciB7CisJc3RydWN0IFNjc2lfSG9zdCAqU0NTSV9Ib3N0OworCXN0cnVjdCBwY2lfZGV2ICpQQ0lfRGV2aWNlOworCWVudW0gQnVzTG9naWNfSG9zdEFkYXB0ZXJUeXBlIEhvc3RBZGFwdGVyVHlwZTsKKwllbnVtIEJ1c0xvZ2ljX0hvc3RBZGFwdGVyQnVzVHlwZSBIb3N0QWRhcHRlckJ1c1R5cGU7CisJdW5zaWduZWQgbG9uZyBJT19BZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgUENJX0FkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQgQWRkcmVzc0NvdW50OworCXVuc2lnbmVkIGNoYXIgSG9zdE51bWJlcjsKKwl1bnNpZ25lZCBjaGFyIE1vZGVsTmFtZVs5XTsKKwl1bnNpZ25lZCBjaGFyIEZpcm13YXJlVmVyc2lvbls2XTsKKwl1bnNpZ25lZCBjaGFyIEZ1bGxNb2RlbE5hbWVbMThdOworCXVuc2lnbmVkIGNoYXIgQnVzOworCXVuc2lnbmVkIGNoYXIgRGV2aWNlOworCXVuc2lnbmVkIGNoYXIgSVJRX0NoYW5uZWw7CisJdW5zaWduZWQgY2hhciBETUFfQ2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyIFNDU0lfSUQ7CisJYm9vbGVhbiBJUlFfQ2hhbm5lbEFjcXVpcmVkOjE7CisJYm9vbGVhbiBETUFfQ2hhbm5lbEFjcXVpcmVkOjE7CisJYm9vbGVhbiBFeHRlbmRlZFRyYW5zbGF0aW9uRW5hYmxlZDoxOworCWJvb2xlYW4gUGFyaXR5Q2hlY2tpbmdFbmFibGVkOjE7CisJYm9vbGVhbiBCdXNSZXNldEVuYWJsZWQ6MTsKKwlib29sZWFuIExldmVsU2Vuc2l0aXZlSW50ZXJydXB0OjE7CisJYm9vbGVhbiBIb3N0V2lkZVNDU0k6MTsKKwlib29sZWFuIEhvc3REaWZmZXJlbnRpYWxTQ1NJOjE7CisJYm9vbGVhbiBIb3N0U3VwcG9ydHNTQ0FNOjE7CisJYm9vbGVhbiBIb3N0VWx0cmFTQ1NJOjE7CisJYm9vbGVhbiBFeHRlbmRlZExVTlN1cHBvcnQ6MTsKKwlib29sZWFuIFRlcm1pbmF0aW9uSW5mb1ZhbGlkOjE7CisJYm9vbGVhbiBMb3dCeXRlVGVybWluYXRlZDoxOworCWJvb2xlYW4gSGlnaEJ5dGVUZXJtaW5hdGVkOjE7CisJYm9vbGVhbiBCb3VuY2VCdWZmZXJzUmVxdWlyZWQ6MTsKKwlib29sZWFuIFN0cmljdFJvdW5kUm9iaW5Nb2RlU3VwcG9ydDoxOworCWJvb2xlYW4gU0NBTV9FbmFibGVkOjE7CisJYm9vbGVhbiBTQ0FNX0xldmVsMjoxOworCWJvb2xlYW4gSG9zdEFkYXB0ZXJJbml0aWFsaXplZDoxOworCWJvb2xlYW4gSG9zdEFkYXB0ZXJFeHRlcm5hbFJlc2V0OjE7CisJYm9vbGVhbiBIb3N0QWRhcHRlckludGVybmFsRXJyb3I6MTsKKwlib29sZWFuIFByb2Nlc3NDb21wbGV0ZWRDQ0JzQWN0aXZlOworCXZvbGF0aWxlIGJvb2xlYW4gSG9zdEFkYXB0ZXJDb21tYW5kQ29tcGxldGVkOworCXVuc2lnbmVkIHNob3J0IEhvc3RBZGFwdGVyU2NhdHRlckdhdGhlckxpbWl0OworCXVuc2lnbmVkIHNob3J0IERyaXZlclNjYXR0ZXJHYXRoZXJMaW1pdDsKKwl1bnNpZ25lZCBzaG9ydCBNYXhUYXJnZXREZXZpY2VzOworCXVuc2lnbmVkIHNob3J0IE1heExvZ2ljYWxVbml0czsKKwl1bnNpZ25lZCBzaG9ydCBNYWlsYm94Q291bnQ7CisJdW5zaWduZWQgc2hvcnQgSW5pdGlhbENDQnM7CisJdW5zaWduZWQgc2hvcnQgSW5jcmVtZW50YWxDQ0JzOworCXVuc2lnbmVkIHNob3J0IEFsbG9jYXRlZENDQnM7CisJdW5zaWduZWQgc2hvcnQgRHJpdmVyUXVldWVEZXB0aDsKKwl1bnNpZ25lZCBzaG9ydCBIb3N0QWRhcHRlclF1ZXVlRGVwdGg7CisJdW5zaWduZWQgc2hvcnQgVW50YWdnZWRRdWV1ZURlcHRoOworCXVuc2lnbmVkIHNob3J0IENvbW1vblF1ZXVlRGVwdGg7CisJdW5zaWduZWQgc2hvcnQgQnVzU2V0dGxlVGltZTsKKwl1bnNpZ25lZCBzaG9ydCBTeW5jaHJvbm91c1Blcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBGYXN0UGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IFVsdHJhUGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IFdpZGVQZXJtaXR0ZWQ7CisJdW5zaWduZWQgc2hvcnQgRGlzY29ubmVjdFBlcm1pdHRlZDsKKwl1bnNpZ25lZCBzaG9ydCBUYWdnZWRRdWV1aW5nUGVybWl0dGVkOworCXVuc2lnbmVkIHNob3J0IEV4dGVybmFsSG9zdEFkYXB0ZXJSZXNldHM7CisJdW5zaWduZWQgc2hvcnQgSG9zdEFkYXB0ZXJJbnRlcm5hbEVycm9yczsKKwl1bnNpZ25lZCBzaG9ydCBUYXJnZXREZXZpY2VDb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBNZXNzYWdlQnVmZmVyTGVuZ3RoOworCXUzMiBCSU9TX0FkZHJlc3M7CisJc3RydWN0IEJ1c0xvZ2ljX0RyaXZlck9wdGlvbnMgKkRyaXZlck9wdGlvbnM7CisJc3RydWN0IEZsYXNoUG9pbnRfSW5mbyBGbGFzaFBvaW50SW5mbzsKKwlGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCBDYXJkSGFuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgaG9zdF9saXN0OworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkFsbF9DQ0JzOworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkZyZWVfQ0NCczsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpGaXJzdENvbXBsZXRlZENDQjsKKwlzdHJ1Y3QgQnVzTG9naWNfQ0NCICpMYXN0Q29tcGxldGVkQ0NCOworCXN0cnVjdCBCdXNMb2dpY19DQ0IgKkJ1c0RldmljZVJlc2V0UGVuZGluZ0NDQltCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwlzdHJ1Y3QgQnVzTG9naWNfVGFyZ2V0RmxhZ3MgVGFyZ2V0RmxhZ3NbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgY2hhciBRdWV1ZURlcHRoW0J1c0xvZ2ljX01heFRhcmdldERldmljZXNdOworCXVuc2lnbmVkIGNoYXIgU3luY2hyb25vdXNQZXJpb2RbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgY2hhciBTeW5jaHJvbm91c09mZnNldFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwl1bnNpZ25lZCBjaGFyIEFjdGl2ZUNvbW1hbmRzW0J1c0xvZ2ljX01heFRhcmdldERldmljZXNdOworCXVuc2lnbmVkIGludCBDb21tYW5kc1NpbmNlUmVzZXRbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgbG9uZyBMYXN0U2VxdWVuY2VQb2ludFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwl1bnNpZ25lZCBsb25nIExhc3RSZXNldEF0dGVtcHRlZFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwl1bnNpZ25lZCBsb25nIExhc3RSZXNldENvbXBsZXRlZFtCdXNMb2dpY19NYXhUYXJnZXREZXZpY2VzXTsKKwlzdHJ1Y3QgQnVzTG9naWNfT3V0Z29pbmdNYWlsYm94ICpGaXJzdE91dGdvaW5nTWFpbGJveDsKKwlzdHJ1Y3QgQnVzTG9naWNfT3V0Z29pbmdNYWlsYm94ICpMYXN0T3V0Z29pbmdNYWlsYm94OworCXN0cnVjdCBCdXNMb2dpY19PdXRnb2luZ01haWxib3ggKk5leHRPdXRnb2luZ01haWxib3g7CisJc3RydWN0IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveCAqRmlyc3RJbmNvbWluZ01haWxib3g7CisJc3RydWN0IEJ1c0xvZ2ljX0luY29taW5nTWFpbGJveCAqTGFzdEluY29taW5nTWFpbGJveDsKKwlzdHJ1Y3QgQnVzTG9naWNfSW5jb21pbmdNYWlsYm94ICpOZXh0SW5jb21pbmdNYWlsYm94OworCXN0cnVjdCBCdXNMb2dpY19UYXJnZXRTdGF0aXN0aWNzIFRhcmdldFN0YXRpc3RpY3NbQnVzTG9naWNfTWF4VGFyZ2V0RGV2aWNlc107CisJdW5zaWduZWQgY2hhciAqTWFpbGJveFNwYWNlOworCWRtYV9hZGRyX3QgTWFpbGJveFNwYWNlSGFuZGxlOworCXVuc2lnbmVkIGludCBNYWlsYm94U2l6ZTsKKwl1bnNpZ25lZCBsb25nIENDQl9PZmZzZXQ7CisJY2hhciBNZXNzYWdlQnVmZmVyW0J1c0xvZ2ljX01lc3NhZ2VCdWZmZXJTaXplXTsKK307CisKKy8qCisgIERlZmluZSBhIHN0cnVjdHVyZSBmb3IgdGhlIEJJT1MgRGlzayBQYXJhbWV0ZXJzLgorKi8KKworc3RydWN0IEJJT1NfRGlza1BhcmFtZXRlcnMgeworCWludCBIZWFkczsKKwlpbnQgU2VjdG9yczsKKwlpbnQgQ3lsaW5kZXJzOworfTsKKworLyoKKyAgRGVmaW5lIGEgc3RydWN0dXJlIGZvciB0aGUgU0NTSSBJbnF1aXJ5IGNvbW1hbmQgcmVzdWx0cy4KKyovCisKK3N0cnVjdCBTQ1NJX0lucXVpcnkgeworCXVuc2lnbmVkIGNoYXIgUGVyaXBoZXJhbERldmljZVR5cGU6NTsJLyogQnl0ZSAwIEJpdHMgMC00ICovCisJdW5zaWduZWQgY2hhciBQZXJpcGhlcmFsUXVhbGlmaWVyOjM7CS8qIEJ5dGUgMCBCaXRzIDUtNyAqLworCXVuc2lnbmVkIGNoYXIgRGV2aWNlVHlwZU1vZGlmaWVyOjc7CS8qIEJ5dGUgMSBCaXRzIDAtNiAqLworCWJvb2xlYW4gUk1COjE7CQkvKiBCeXRlIDEgQml0IDcgKi8KKwl1bnNpZ25lZCBjaGFyIEFOU0lfQXBwcm92ZWRWZXJzaW9uOjM7CS8qIEJ5dGUgMiBCaXRzIDAtMiAqLworCXVuc2lnbmVkIGNoYXIgRUNNQV9WZXJzaW9uOjM7CS8qIEJ5dGUgMiBCaXRzIDMtNSAqLworCXVuc2lnbmVkIGNoYXIgSVNPX1ZlcnNpb246MjsJLyogQnl0ZSAyIEJpdHMgNi03ICovCisJdW5zaWduZWQgY2hhciBSZXNwb25zZURhdGFGb3JtYXQ6NDsJLyogQnl0ZSAzIEJpdHMgMC0zICovCisJdW5zaWduZWQgY2hhcjoyOwkvKiBCeXRlIDMgQml0cyA0LTUgKi8KKwlib29sZWFuIFRybUlPUDoxOwkvKiBCeXRlIDMgQml0IDYgKi8KKwlib29sZWFuIEFFTkM6MTsJCS8qIEJ5dGUgMyBCaXQgNyAqLworCXVuc2lnbmVkIGNoYXIgQWRkaXRpb25hbExlbmd0aDsJLyogQnl0ZSA0ICovCisJdW5zaWduZWQgY2hhcjo4OwkvKiBCeXRlIDUgKi8KKwl1bnNpZ25lZCBjaGFyOjg7CS8qIEJ5dGUgNiAqLworCWJvb2xlYW4gU2Z0UmU6MTsJLyogQnl0ZSA3IEJpdCAwICovCisJYm9vbGVhbiBDbWRRdWU6MTsJLyogQnl0ZSA3IEJpdCAxICovCisJIGJvb2xlYW46MTsJCS8qIEJ5dGUgNyBCaXQgMiAqLworCWJvb2xlYW4gTGlua2VkOjE7CS8qIEJ5dGUgNyBCaXQgMyAqLworCWJvb2xlYW4gU3luYzoxOwkJLyogQnl0ZSA3IEJpdCA0ICovCisJYm9vbGVhbiBXQnVzMTY6MTsJLyogQnl0ZSA3IEJpdCA1ICovCisJYm9vbGVhbiBXQnVzMzI6MTsJLyogQnl0ZSA3IEJpdCA2ICovCisJYm9vbGVhbiBSZWxBZHI6MTsJLyogQnl0ZSA3IEJpdCA3ICovCisJdW5zaWduZWQgY2hhciBWZW5kb3JJZGVudGlmaWNhdGlvbls4XTsJLyogQnl0ZXMgOC0xNSAqLworCXVuc2lnbmVkIGNoYXIgUHJvZHVjdElkZW50aWZpY2F0aW9uWzE2XTsJLyogQnl0ZXMgMTYtMzEgKi8KKwl1bnNpZ25lZCBjaGFyIFByb2R1Y3RSZXZpc2lvbkxldmVsWzRdOwkvKiBCeXRlcyAzMi0zNSAqLworfTsKKworCisvKgorICBEZWZpbmUgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYW4gYWJzdHJhY3Rpb24gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlCisgIEhvc3QgQWRhcHRlciBJL08gUmVnaXN0ZXJzLgorKi8KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1NDU0lCdXNSZXNldChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXVuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciBDb250cm9sUmVnaXN0ZXI7CisJQ29udHJvbFJlZ2lzdGVyLkFsbCA9IDA7CisJQ29udHJvbFJlZ2lzdGVyLmNyLlNDU0lCdXNSZXNldCA9IHRydWU7CisJb3V0YihDb250cm9sUmVnaXN0ZXIuQWxsLCBIb3N0QWRhcHRlci0+SU9fQWRkcmVzcyArIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3Rlck9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCdXNMb2dpY19JbnRlcnJ1cHRSZXNldChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXVuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciBDb250cm9sUmVnaXN0ZXI7CisJQ29udHJvbFJlZ2lzdGVyLkFsbCA9IDA7CisJQ29udHJvbFJlZ2lzdGVyLmNyLkludGVycnVwdFJlc2V0ID0gdHJ1ZTsKKwlvdXRiKENvbnRyb2xSZWdpc3Rlci5BbGwsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfQ29udHJvbFJlZ2lzdGVyT2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1NvZnRSZXNldChzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXVuaW9uIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3RlciBDb250cm9sUmVnaXN0ZXI7CisJQ29udHJvbFJlZ2lzdGVyLkFsbCA9IDA7CisJQ29udHJvbFJlZ2lzdGVyLmNyLlNvZnRSZXNldCA9IHRydWU7CisJb3V0YihDb250cm9sUmVnaXN0ZXIuQWxsLCBIb3N0QWRhcHRlci0+SU9fQWRkcmVzcyArIEJ1c0xvZ2ljX0NvbnRyb2xSZWdpc3Rlck9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCdXNMb2dpY19IYXJkUmVzZXQoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwl1bmlvbiBCdXNMb2dpY19Db250cm9sUmVnaXN0ZXIgQ29udHJvbFJlZ2lzdGVyOworCUNvbnRyb2xSZWdpc3Rlci5BbGwgPSAwOworCUNvbnRyb2xSZWdpc3Rlci5jci5IYXJkUmVzZXQgPSB0cnVlOworCW91dGIoQ29udHJvbFJlZ2lzdGVyLkFsbCwgSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgKyBCdXNMb2dpY19Db250cm9sUmVnaXN0ZXJPZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgQnVzTG9naWNfUmVhZFN0YXR1c1JlZ2lzdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqSG9zdEFkYXB0ZXIpCit7CisJcmV0dXJuIGluYihIb3N0QWRhcHRlci0+SU9fQWRkcmVzcyArIEJ1c0xvZ2ljX1N0YXR1c1JlZ2lzdGVyT2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1dyaXRlQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlcgorCQkJCQkJCSAgKkhvc3RBZGFwdGVyLCB1bnNpZ25lZCBjaGFyIFZhbHVlKQoreworCW91dGIoVmFsdWUsIEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfQ29tbWFuZFBhcmFtZXRlclJlZ2lzdGVyT2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIEJ1c0xvZ2ljX1JlYWREYXRhSW5SZWdpc3RlcihzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIgKkhvc3RBZGFwdGVyKQoreworCXJldHVybiBpbmIoSG9zdEFkYXB0ZXItPklPX0FkZHJlc3MgKyBCdXNMb2dpY19EYXRhSW5SZWdpc3Rlck9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBCdXNMb2dpY19SZWFkSW50ZXJydXB0UmVnaXN0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlyZXR1cm4gaW5iKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfSW50ZXJydXB0UmVnaXN0ZXJPZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgQnVzTG9naWNfUmVhZEdlb21ldHJ5UmVnaXN0ZXIoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlyZXR1cm4gaW5iKEhvc3RBZGFwdGVyLT5JT19BZGRyZXNzICsgQnVzTG9naWNfR2VvbWV0cnlSZWdpc3Rlck9mZnNldCk7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX1N0YXJ0TWFpbGJveENvbW1hbmQgaXNzdWVzIGFuIEV4ZWN1dGUgTWFpbGJveCBDb21tYW5kLCB3aGljaAorICBub3RpZmllcyB0aGUgSG9zdCBBZGFwdGVyIHRoYXQgYW4gZW50cnkgaGFzIGJlZW4gbWFkZSBpbiBhbiBPdXRnb2luZworICBNYWlsYm94LgorKi8KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX1N0YXJ0TWFpbGJveENvbW1hbmQoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyICpIb3N0QWRhcHRlcikKK3sKKwlCdXNMb2dpY19Xcml0ZUNvbW1hbmRQYXJhbWV0ZXJSZWdpc3RlcihIb3N0QWRhcHRlciwgQnVzTG9naWNfRXhlY3V0ZU1haWxib3hDb21tYW5kKTsKK30KKworLyoKKyAgQnVzTG9naWNfRGVsYXkgd2FpdHMgZm9yIFNlY29uZHMgdG8gZWxhcHNlLgorKi8KKworc3RhdGljIGlubGluZSB2b2lkIEJ1c0xvZ2ljX0RlbGF5KGludCBTZWNvbmRzKQoreworCW1kZWxheSgxMDAwICogU2Vjb25kcyk7Cit9CisKKy8qCisgIFZpcnR1YWxfdG9fQnVzIGFuZCBCdXNfdG9fVmlydHVhbCBtYXAgYmV0d2VlbiBLZXJuZWwgVmlydHVhbCBBZGRyZXNzZXMKKyAgYW5kIFBDSS9WTEIvRUlTQS9JU0EgQnVzIEFkZHJlc3Nlcy4KKyovCisKK3N0YXRpYyBpbmxpbmUgdTMyIFZpcnR1YWxfdG9fQnVzKHZvaWQgKlZpcnR1YWxBZGRyZXNzKQoreworCXJldHVybiAodTMyKSB2aXJ0X3RvX2J1cyhWaXJ0dWFsQWRkcmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqQnVzX3RvX1ZpcnR1YWwodTMyIEJ1c0FkZHJlc3MpCit7CisJcmV0dXJuICh2b2lkICopIGJ1c190b192aXJ0KEJ1c0FkZHJlc3MpOworfQorCisvKgorICBWaXJ0dWFsX3RvXzMyQml0X1ZpcnR1YWwgbWFwcyBiZXR3ZWVuIEtlcm5lbCBWaXJ0dWFsIEFkZHJlc3NlcyBhbmQKKyAgMzIgYml0IEtlcm5lbCBWaXJ0dWFsIEFkZHJlc3Nlcy4gIFRoaXMgYXZvaWRzIGNvbXBpbGF0aW9uIHdhcm5pbmdzCisgIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLgorKi8KKworc3RhdGljIGlubGluZSB1MzIgVmlydHVhbF90b18zMkJpdF9WaXJ0dWFsKHZvaWQgKlZpcnR1YWxBZGRyZXNzKQoreworCXJldHVybiAodTMyKSAodW5zaWduZWQgbG9uZykgVmlydHVhbEFkZHJlc3M7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX0luY3JlbWVudEVycm9yQ291bnRlciBpbmNyZW1lbnRzIEVycm9yIENvdW50ZXIgYnkgMSwgc3RvcHBpbmcgYXQKKyAgNjU1MzUgcmF0aGVyIHRoYW4gd3JhcHBpbmcgYXJvdW5kIHRvIDAuCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgQnVzTG9naWNfSW5jcmVtZW50RXJyb3JDb3VudGVyKHVuc2lnbmVkIHNob3J0ICpFcnJvckNvdW50ZXIpCit7CisJaWYgKCpFcnJvckNvdW50ZXIgPCA2NTUzNSkKKwkJKCpFcnJvckNvdW50ZXIpKys7Cit9CisKKy8qCisgIEJ1c0xvZ2ljX0luY3JlbWVudEJ5dGVDb3VudGVyIGluY3JlbWVudHMgQnl0ZSBDb3VudGVyIGJ5IEFtb3VudC4KKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCdXNMb2dpY19JbmNyZW1lbnRCeXRlQ291bnRlcihzdHJ1Y3QgQnVzTG9naWNfQnl0ZUNvdW50ZXIKKwkJCQkJCSAqQnl0ZUNvdW50ZXIsIHVuc2lnbmVkIGludCBBbW91bnQpCit7CisJQnl0ZUNvdW50ZXItPlVuaXRzICs9IEFtb3VudDsKKwlpZiAoQnl0ZUNvdW50ZXItPlVuaXRzID4gOTk5OTk5OTk5KSB7CisJCUJ5dGVDb3VudGVyLT5Vbml0cyAtPSAxMDAwMDAwMDAwOworCQlCeXRlQ291bnRlci0+QmlsbGlvbnMrKzsKKwl9Cit9CisKKy8qCisgIEJ1c0xvZ2ljX0luY3JlbWVudFNpemVCdWNrZXQgaW5jcmVtZW50cyB0aGUgQnVja2V0IGZvciBBbW91bnQuCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgQnVzTG9naWNfSW5jcmVtZW50U2l6ZUJ1Y2tldChCdXNMb2dpY19Db21tYW5kU2l6ZUJ1Y2tldHNfVCBDb21tYW5kU2l6ZUJ1Y2tldHMsIHVuc2lnbmVkIGludCBBbW91bnQpCit7CisJaW50IEluZGV4ID0gMDsKKwlpZiAoQW1vdW50IDwgOCAqIDEwMjQpIHsKKwkJaWYgKEFtb3VudCA8IDIgKiAxMDI0KQorCQkJSW5kZXggPSAoQW1vdW50IDwgMSAqIDEwMjQgPyAwIDogMSk7CisJCWVsc2UKKwkJCUluZGV4ID0gKEFtb3VudCA8IDQgKiAxMDI0ID8gMiA6IDMpOworCX0gZWxzZSBpZiAoQW1vdW50IDwgMTI4ICogMTAyNCkgeworCQlpZiAoQW1vdW50IDwgMzIgKiAxMDI0KQorCQkJSW5kZXggPSAoQW1vdW50IDwgMTYgKiAxMDI0ID8gNCA6IDUpOworCQllbHNlCisJCQlJbmRleCA9IChBbW91bnQgPCA2NCAqIDEwMjQgPyA2IDogNyk7CisJfSBlbHNlCisJCUluZGV4ID0gKEFtb3VudCA8IDI1NiAqIDEwMjQgPyA4IDogOSk7CisJQ29tbWFuZFNpemVCdWNrZXRzW0luZGV4XSsrOworfQorCisvKgorICBEZWZpbmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBGbGFzaFBvaW50IEZpcm13YXJlIChTQ0NCIE1hbmFnZXIpLgorKi8KKworI2RlZmluZSBGbGFzaFBvaW50X0Zpcm13YXJlVmVyc2lvbgkJIjUuMDIiCisKKy8qCisgIERlZmluZSB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIEZsYXNoUG9pbnRfSGFuZGxlSW50ZXJydXB0LgorKi8KKworI2RlZmluZSBGbGFzaFBvaW50X05vcm1hbEludGVycnVwdAkJMHgwMAorI2RlZmluZSBGbGFzaFBvaW50X0ludGVybmFsRXJyb3IJCTB4RkUKKyNkZWZpbmUgRmxhc2hQb2ludF9FeHRlcm5hbEJ1c1Jlc2V0CQkweEZGCisKKy8qCisgIERlZmluZSBwcm90b3R5cGVzIGZvciB0aGUgZm9yd2FyZCByZWZlcmVuY2VkIEJ1c0xvZ2ljIERyaXZlcgorICBJbnRlcm5hbCBGdW5jdGlvbnMuCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqQnVzTG9naWNfRHJpdmVySW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBCdXNMb2dpY19RdWV1ZUNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLCB2b2lkICgqQ29tcGxldGlvblJvdXRpbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgQnVzTG9naWNfQklPU0Rpc2tQYXJhbWV0ZXJzKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHNlY3Rvcl90LCBpbnQgKik7CitzdGF0aWMgaW50IEJ1c0xvZ2ljX1Byb2NEaXJlY3RvcnlJbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQpOworc3RhdGljIGludCBCdXNMb2dpY19TbGF2ZUNvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBCdXNMb2dpY19RdWV1ZUNvbXBsZXRlZENDQihzdHJ1Y3QgQnVzTG9naWNfQ0NCICopOworc3RhdGljIGlycXJldHVybl90IEJ1c0xvZ2ljX0ludGVycnVwdEhhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludCBCdXNMb2dpY19SZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqLCBib29sZWFuIEhhcmRSZXNldCk7CitzdGF0aWMgdm9pZCBCdXNMb2dpY19NZXNzYWdlKGVudW0gQnVzTG9naWNfTWVzc2FnZUxldmVsLCBjaGFyICosIHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqLCAuLi4pOworc3RhdGljIGludCBfX2luaXQgQnVzTG9naWNfU2V0dXAoY2hhciAqKTsKKworI2VuZGlmCQkJCS8qIF9CVVNMT0dJQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvRmxhc2hQb2ludC5jIGIvZHJpdmVycy9zY3NpL0ZsYXNoUG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE2OTVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL0ZsYXNoUG9pbnQuYwpAQCAtMCwwICsxLDEyMTU5IEBACisvKgorCisgIEZsYXNoUG9pbnQuYyAtLSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciBmb3IgTGludXgKKworICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEZsYXNoUG9pbnQgU0NDQiBNYW5hZ2VyIGZyb20gQnVzTG9naWMncyBGbGFzaFBvaW50CisgIERyaXZlciBEZXZlbG9wZXIncyBLaXQsIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyBieSBMZW9uYXJkIE4uIFp1YmtvZmYgZm9yCisgIExpbnV4IGNvbXBhdGliaWxpdHkuICBJdCB3YXMgcHJvdmlkZWQgYnkgQnVzTG9naWMgaW4gdGhlIGZvcm0gb2YgMTYgc2VwYXJhdGUKKyAgc291cmNlIGZpbGVzLCB3aGljaCB3b3VsZCBoYXZlIHVubmVjZXNzYXJpbHkgY2x1dHRlcmVkIHRoZSBzY3NpIGRpcmVjdG9yeSwgc28KKyAgdGhlIGluZGl2aWR1YWwgZmlsZXMgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gdGhpcyBzaW5nbGUgZmlsZS4KKworICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKworKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKworI2lmbmRlZiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQKKworCisjZGVmaW5lIFVOSVgKKyNkZWZpbmUgRldfVFlQRQkJX1NDQ0JfTUdSXworI2RlZmluZSBNQVhfQ0FSRFMJOAorI3VuZGVmIEJVU1RZUEVfUENJCisKKworI2RlZmluZSBPU19JblBvcnRCeXRlKHBvcnQpCQlpbmIocG9ydCkKKyNkZWZpbmUgT1NfSW5Qb3J0V29yZChwb3J0KQkJaW53KHBvcnQpCisjZGVmaW5lIE9TX0luUG9ydExvbmcocG9ydCkJCWlubChwb3J0KQorI2RlZmluZSBPU19PdXRQb3J0Qnl0ZShwb3J0LCB2YWx1ZSkJb3V0Yih2YWx1ZSwgcG9ydCkKKyNkZWZpbmUgT1NfT3V0UG9ydFdvcmQocG9ydCwgdmFsdWUpCW91dHcodmFsdWUsIHBvcnQpCisjZGVmaW5lIE9TX091dFBvcnRMb25nKHBvcnQsIHZhbHVlKQlvdXRsKHZhbHVlLCBwb3J0KQorI2RlZmluZSBPU19Mb2NrKHgpCisjZGVmaW5lIE9TX1VuTG9jayh4KQorCisKKy8qCisgIERlZmluZSBuYW1lIHJlcGxhY2VtZW50cyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBMaW51eCBCdXNMb2dpYyBEcml2ZXIuCisqLworCisjZGVmaW5lIFNjY2JNZ3Jfc2Vuc2VfYWRhcHRlcgkJRmxhc2hQb2ludF9Qcm9iZUhvc3RBZGFwdGVyCisjZGVmaW5lIFNjY2JNZ3JfY29uZmlnX2FkYXB0ZXIJCUZsYXNoUG9pbnRfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyCisjZGVmaW5lIFNjY2JNZ3JfdW5sb2FkX2NhcmQJCUZsYXNoUG9pbnRfUmVsZWFzZUhvc3RBZGFwdGVyCisjZGVmaW5lIFNjY2JNZ3Jfc3RhcnRfc2NjYgkJRmxhc2hQb2ludF9TdGFydENDQgorI2RlZmluZSBTY2NiTWdyX2Fib3J0X3NjY2IJCUZsYXNoUG9pbnRfQWJvcnRDQ0IKKyNkZWZpbmUgU2NjYk1ncl9teV9pbnQJCQlGbGFzaFBvaW50X0ludGVycnVwdFBlbmRpbmcKKyNkZWZpbmUgU2NjYk1ncl9pc3IJCQlGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdAorCisKKy8qCisgIERlZmluZSBuYW1lIHJlcGxhY2VtZW50cyB0byBhdm9pZCBrZXJuZWwgbmFtZXNwYWNlIHBvbGx1dGlvbi4KKyovCisKKyNkZWZpbmUgQkxfQ2FyZAkJCQlGUFRfQkxfQ2FyZAorI2RlZmluZSBCdXNNYXN0ZXJJbml0CQkJRlBUX0J1c01hc3RlckluaXQKKyNkZWZpbmUgQ2FsY0NyYzE2CQkJRlBUX0NhbGNDcmMxNgorI2RlZmluZSBDYWxjTHJjCQkJCUZQVF9DYWxjTHJjCisjZGVmaW5lIENoa0lmQ2hpcEluaXRpYWxpemVkCQlGUFRfQ2hrSWZDaGlwSW5pdGlhbGl6ZWQKKyNkZWZpbmUgRGlhZ0J1c01hc3RlcgkJCUZQVF9EaWFnQnVzTWFzdGVyCisjZGVmaW5lIERpYWdFRVBST00JCQlGUFRfRGlhZ0VFUFJPTQorI2RlZmluZSBEaWFnWGJvdwkJCUZQVF9EaWFnWGJvdworI2RlZmluZSBHZXRUYXJMdW4JCQlGUFRfR2V0VGFyTHVuCisjZGVmaW5lIFJOVlJhbURhdGEJCQlGUFRfUk5WUmFtRGF0YQorI2RlZmluZSBSZFN0YWNrCQkJCUZQVF9SZFN0YWNrCisjZGVmaW5lIFNjY2JNZ3JUYWJsZUluaXRBbGwJCUZQVF9TY2NiTWdyVGFibGVJbml0QWxsCisjZGVmaW5lIFNjY2JNZ3JUYWJsZUluaXRDYXJkCQlGUFRfU2NjYk1nclRhYmxlSW5pdENhcmQKKyNkZWZpbmUgU2NjYk1nclRhYmxlSW5pdFRhcmdldAkJRlBUX1NjY2JNZ3JUYWJsZUluaXRUYXJnZXQKKyNkZWZpbmUgU2NjYk1ncl9iYWRfaXNyCQkJRlBUX1NjY2JNZ3JfYmFkX2lzcgorI2RlZmluZSBTY2NiTWdyX3Njc2lfcmVzZXQJCUZQVF9TY2NiTWdyX3Njc2lfcmVzZXQKKyNkZWZpbmUgU2NjYk1ncl90aW1lcl9leHBpcmVkCQlGUFRfU2NjYk1ncl90aW1lcl9leHBpcmVkCisjZGVmaW5lIFNlbmRNc2cJCQkJRlBUX1NlbmRNc2cKKyNkZWZpbmUgV2FpdAkJCQlGUFRfV2FpdAorI2RlZmluZSBXYWl0MVNlY29uZAkJCUZQVF9XYWl0MVNlY29uZAorI2RlZmluZSBXclN0YWNrCQkJCUZQVF9XclN0YWNrCisjZGVmaW5lIFhib3dJbml0CQkJRlBUX1hib3dJbml0CisjZGVmaW5lIGF1dG9DbWRDbXBsdAkJCUZQVF9hdXRvQ21kQ21wbHQKKyNkZWZpbmUgYXV0b0xvYWREZWZhdWx0TWFwCQlGUFRfYXV0b0xvYWREZWZhdWx0TWFwCisjZGVmaW5lIGJ1c01zdHJEYXRhWGZlclN0YXJ0CQlGUFRfYnVzTXN0ckRhdGFYZmVyU3RhcnQKKyNkZWZpbmUgYnVzTXN0clNHRGF0YVhmZXJTdGFydAkJRlBUX2J1c01zdHJTR0RhdGFYZmVyU3RhcnQKKyNkZWZpbmUgYnVzTXN0clRpbWVPdXQJCQlGUFRfYnVzTXN0clRpbWVPdXQKKyNkZWZpbmUgZGF0YVhmZXJQcm9jZXNzb3IJCUZQVF9kYXRhWGZlclByb2Nlc3NvcgorI2RlZmluZSBkZWZhdWx0X2ludGVuYQkJCUZQVF9kZWZhdWx0X2ludGVuYQorI2RlZmluZSBob3N0RGF0YVhmZXJBYm9ydAkJRlBUX2hvc3REYXRhWGZlckFib3J0CisjZGVmaW5lIGhvc3REYXRhWGZlclJlc3RhcnQJCUZQVF9ob3N0RGF0YVhmZXJSZXN0YXJ0CisjZGVmaW5lIGluaXNjaQkJCQlGUFRfaW5pc2NpCisjZGVmaW5lIG1iQ2FyZHMJCQkJRlBUX21iQ2FyZHMKKyNkZWZpbmUgbnZSYW1JbmZvCQkJRlBUX252UmFtSW5mbworI2RlZmluZSBwaGFzZUJ1c0ZyZWUJCQlGUFRfcGhhc2VCdXNGcmVlCisjZGVmaW5lIHBoYXNlQ2hrRmlmbwkJCUZQVF9waGFzZUNoa0ZpZm8KKyNkZWZpbmUgcGhhc2VDb21tYW5kCQkJRlBUX3BoYXNlQ29tbWFuZAorI2RlZmluZSBwaGFzZURhdGFJbgkJCUZQVF9waGFzZURhdGFJbgorI2RlZmluZSBwaGFzZURhdGFPdXQJCQlGUFRfcGhhc2VEYXRhT3V0CisjZGVmaW5lIHBoYXNlRGVjb2RlCQkJRlBUX3BoYXNlRGVjb2RlCisjZGVmaW5lIHBoYXNlSWxsZWdhbAkJCUZQVF9waGFzZUlsbGVnYWwKKyNkZWZpbmUgcGhhc2VNc2dJbgkJCUZQVF9waGFzZU1zZ0luCisjZGVmaW5lIHBoYXNlTXNnT3V0CQkJRlBUX3BoYXNlTXNnT3V0CisjZGVmaW5lIHBoYXNlU3RhdHVzCQkJRlBUX3BoYXNlU3RhdHVzCisjZGVmaW5lIHF1ZXVlQWRkU2NjYgkJCUZQVF9xdWV1ZUFkZFNjY2IKKyNkZWZpbmUgcXVldWVDbWRDb21wbGV0ZQkJRlBUX3F1ZXVlQ21kQ29tcGxldGUKKyNkZWZpbmUgcXVldWVEaXNjb25uZWN0CQkJRlBUX3F1ZXVlRGlzY29ubmVjdAorI2RlZmluZSBxdWV1ZUZpbmRTY2NiCQkJRlBUX3F1ZXVlRmluZFNjY2IKKyNkZWZpbmUgcXVldWVGbHVzaFNjY2IJCQlGUFRfcXVldWVGbHVzaFNjY2IKKyNkZWZpbmUgcXVldWVGbHVzaFRhcmdTY2NiCQlGUFRfcXVldWVGbHVzaFRhcmdTY2NiCisjZGVmaW5lIHF1ZXVlU2VhcmNoU2VsZWN0CQlGUFRfcXVldWVTZWFyY2hTZWxlY3QKKyNkZWZpbmUgcXVldWVTZWxlY3RGYWlsCQkJRlBUX3F1ZXVlU2VsZWN0RmFpbAorI2RlZmluZSBzX1BoYXNlVGJsCQkJRlBUX3NfUGhhc2VUYmwKKyNkZWZpbmUgc2NhbUhBU3RyaW5nCQkJRlBUX3NjYW1IQVN0cmluZworI2RlZmluZSBzY2FtSW5mbwkJCUZQVF9zY2FtSW5mbworI2RlZmluZSBzY2FyYgkJCQlGUFRfc2NhcmIKKyNkZWZpbmUgc2Nhc2lkCQkJCUZQVF9zY2FzaWQKKyNkZWZpbmUgc2NidXNmCQkJCUZQVF9zY2J1c2YKKyNkZWZpbmUgc2NjYk1nclRibAkJCUZQVF9zY2NiTWdyVGJsCisjZGVmaW5lIHNjaGtkZAkJCQlGUFRfc2Noa2RkCisjZGVmaW5lIHNjaW5pCQkJCUZQVF9zY2luaQorI2RlZmluZSBzY2lzbwkJCQlGUFRfc2Npc28KKyNkZWZpbmUgc2NtYWNoaWQJCQlGUFRfc2NtYWNoaWQKKyNkZWZpbmUgc2NzYXZkaQkJCQlGUFRfc2NzYXZkaQorI2RlZmluZSBzY3NlbAkJCQlGUFRfc2NzZWwKKyNkZWZpbmUgc2NzZWxsCQkJCUZQVF9zY3NlbGwKKyNkZWZpbmUgc2NzZW5kaQkJCQlGUFRfc2NzZW5kaQorI2RlZmluZSBzY3ZhbHEJCQkJRlBUX3NjdmFscQorI2RlZmluZSBzY3dpcm9kCQkJCUZQVF9zY3dpcm9kCisjZGVmaW5lIHNjd2lyb3MJCQkJRlBUX3Njd2lyb3MKKyNkZWZpbmUgc2N3dHNlbAkJCQlGUFRfc2N3dHNlbAorI2RlZmluZSBzY3hmZXJjCQkJCUZQVF9zY3hmZXJjCisjZGVmaW5lIHNkZWNtCQkJCUZQVF9zZGVjbQorI2RlZmluZSBzZm0JCQkJRlBUX3NmbQorI2RlZmluZSBzaGFuZGVtCQkJCUZQVF9zaGFuZGVtCisjZGVmaW5lIHNpbml0cwkJCQlGUFRfc2luaXRzCisjZGVmaW5lIHNpc3luY24JCQkJRlBUX3Npc3luY24KKyNkZWZpbmUgc2lzeW5jcgkJCQlGUFRfc2lzeW5jcgorI2RlZmluZSBzaXdpZG4JCQkJRlBUX3Npd2lkbgorI2RlZmluZSBzaXdpZHIJCQkJRlBUX3Npd2lkcgorI2RlZmluZSBzcmVzCQkJCUZQVF9zcmVzCisjZGVmaW5lIHNyZXNiCQkJCUZQVF9zcmVzYgorI2RlZmluZSBzc2VsCQkJCUZQVF9zc2VsCisjZGVmaW5lIHNzZW5zcwkJCQlGUFRfc3NlbnNzCisjZGVmaW5lIHNzc3luY3YJCQkJRlBUX3Nzc3luY3YKKyNkZWZpbmUgc3RzeW5jbgkJCQlGUFRfc3RzeW5jbgorI2RlZmluZSBzdHdpZG4JCQkJRlBUX3N0d2lkbgorI2RlZmluZSBzeGZycAkJCQlGUFRfc3hmcnAKKyNkZWZpbmUgdXRpbEVFUmVhZAkJCUZQVF91dGlsRUVSZWFkCisjZGVmaW5lIHV0aWxFRVJlYWRPcmcJCQlGUFRfdXRpbEVFUmVhZE9yZworI2RlZmluZSB1dGlsRUVTZW5kQ21kQWRkcgkJRlBUX3V0aWxFRVNlbmRDbWRBZGRyCisjZGVmaW5lIHV0aWxFRVdyaXRlCQkJRlBUX3V0aWxFRVdyaXRlCisjZGVmaW5lIHV0aWxFRVdyaXRlT25PZmYJCUZQVF91dGlsRUVXcml0ZU9uT2ZmCisjZGVmaW5lIHV0aWxVcGRhdGVSZXNpZHVhbAkJRlBUX3V0aWxVcGRhdGVSZXNpZHVhbAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgZ2xvYmFscy5oICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIENvbW1vbiBzaGFyZWQgZ2xvYmFsIGRlZmluZXMuCisgKgorICogICAkRGF0ZTogMTk5Ni8wOS8wNCAwMToyNjoxMyAkCisgKgorICogICAkUmV2aXNpb246IDEuMTEgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9fR0xPQkFMU19IX18KKyNkZWZpbmUgX19HTE9CQUxTX0hfXworCisjZGVmaW5lIF9VQ0JfTUdSXyAgMQorI2RlZmluZSBfU0NDQl9NR1JfIDIKKworLyojaW5jbHVkZSA8b3NmbGFncy5oPiovCisKKyNkZWZpbmUgTUFYX0NEQkxFTiAgMTIKKworI2RlZmluZSBTQ0FNX0xFVl8yCTEKKworI2RlZmluZSBDUkNNQVNLCTB4QTAwMQorCisvKiAgSW4geW91ciBvc2ZsYWdzLmggZmlsZSwgcGxlYXNlIEVOU1VSRSB0aGF0IG9ubHkgT05FIE9TIEZMQUcgCisgICAgaXMgb24gYXQgYSB0aW1lICEhISBBbHNvLCBwbGVhc2UgbWFrZSBzdXJlIHlvdSB0dXJuIHNldCB0aGUgCisgCSB2YXJpYWJsZSBGV19UWVBFIHRvIGVpdGhlciBfVUNCX01HUl8gb3IgX1NDQ0JfTUdSXyAgISEhICovCisKKyNpZiBkZWZpbmVkKERPUykgfHwgZGVmaW5lZChXSU45NV8xNikgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoT1RIRVJfMTYpCisgICAjZGVmaW5lICAgICAgIENPTVBJTEVSXzE2X0JJVCAxCisjZWxpZiBkZWZpbmVkKE5FVFdBUkUpIHx8IGRlZmluZWQoTlQpIHx8IGRlZmluZWQoV0lOOTVfMzIpIHx8IGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPVEhFUl8zMikgfHwgZGVmaW5lZChTT0xBUklTX1JFQUxfTU9ERSkKKyAgICNkZWZpbmUgICAgICAgQ09NUElMRVJfMzJfQklUIDEKKyNlbmRpZgorCisKKyNkZWZpbmUgICAgIEJMX1ZFTkRPUl9JRCAgICAgIDB4MTA0QgorI2RlZmluZSAgICAgRlBfREVWSUNFX0lEICAgICAgMHg4MTMwCisjZGVmaW5lICAgICBNTV9ERVZJQ0VfSUQgICAgICAweDEwNDAKKworCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAgICAgICAgICAgKCEoRkFMU0UpKQorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICAgICAgICAgICAgMAorI2VuZGlmCisKKyNkZWZpbmUgRkFJTFVSRSAgICAgICAgIDB4RkZGRkZGRkZMCisKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSU5UOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKiBQVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0KiBQVVNIT1JUOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICogUFVMT05HOwordHlwZWRlZiB2b2lkICogICAgICAgICAgUFZPSUQ7CisKKworI2lmIGRlZmluZWQoQ09NUElMRVJfMTZfQklUKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZhciAgICAgICAqIHVjaGFyX3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZmFyICAgICAgKiB1c2hvcnRfcHRyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGZhciAgICAgICAqIHVsb25nX3B0cjsKKyNlbmRpZiAgLyogMTZfQklUX0NPTVBJTEVSICovCisKKyNpZiBkZWZpbmVkKENPTVBJTEVSXzMyX0JJVCkKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgKiB1Y2hhcl9wdHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICogdXNob3J0X3B0cjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICAgKiB1bG9uZ19wdHI7CisjZW5kaWYgIC8qIDMyX0JJVF9DT01QSUxFUiAqLworCisKKy8qCSAJCQlORVcgVFlQRSBERUZJTklUSU9OUyAoc2hhcmVkIHdpdGggTXlsZXggTm9ydGgpCisKKyoqICBVc2UgZm9sbG93aW5nIHR5cGUgZGVmaW5lcyB0byBhdm9pZCBjb25mdXNpb24gaW4gMTYgYW5kIDMyLWJpdAorKiogIGVudmlyb25tZW50cy4gIEF2b2lkIHVzaW5nICdpbnQnIGFzIGl0IGRlbm90ZXMgMTYgYml0cyBpbiAxNi1iaXQKKyoqICBlbnZpcm9ubWVudCBhbmQgMzIgaW4gMzItYml0IGVudmlyb25tZW50cy4KKworKi8KKworI2RlZmluZSBzMDhiaXRzCWNoYXIKKyNkZWZpbmUgczE2Yml0cyAJc2hvcnQKKyNkZWZpbmUgczMyYml0cwlsb25nCisKKyNkZWZpbmUgdTA4Yml0cwl1bnNpZ25lZCBzMDhiaXRzCisjZGVmaW5lIHUxNmJpdHMJdW5zaWduZWQgczE2Yml0cworI2RlZmluZSB1MzJiaXRzCXVuc2lnbmVkIHMzMmJpdHMKKworI2lmIGRlZmluZWQoQ09NUElMRVJfMTZfQklUKQorCit0eXBlZGVmIHUwOGJpdHMgZmFyIAkqIHB1MDhiaXRzOwordHlwZWRlZiB1MTZiaXRzIGZhciAJKiBwdTE2Yml0czsKK3R5cGVkZWYgdTMyYml0cyBmYXIJKiBwdTMyYml0czsKKworI2VuZGlmCS8qIENPTVBJTEVSXzE2X0JJVCAqLworCisjaWYgZGVmaW5lZChDT01QSUxFUl8zMl9CSVQpCisKK3R5cGVkZWYgdTA4Yml0cyAJKiBwdTA4Yml0czsKK3R5cGVkZWYgdTE2Yml0cyAJKiBwdTE2Yml0czsKK3R5cGVkZWYgdTMyYml0cyAJKiBwdTMyYml0czsKKworI2VuZGlmCS8qIENPTVBJTEVSXzMyX0JJVCAqLworCisKKyNkZWZpbmUgQklUKHgpICAgICAgICAgICgoVUNIQVIpKDE8PCh4KSkpICAgIC8qIHNpbmdsZS1iaXQgbWFzayBpbiBiaXQgcG9zaXRpb24geCAqLworI2RlZmluZSBCSVRXKHgpICAgICAgICAgICgoVVNIT1JUKSgxPDwoeCkpKSAgLyogc2luZ2xlLWJpdCBtYXNrIGluIGJpdCBwb3NpdGlvbiB4ICovCisKKworCisjaWYgZGVmaW5lZChET1MpCisvKiNpbmNsdWRlIDxkb3MuaD4qLworCSN1bmRlZiBpbnBvcnRiICAgICAgICAgIC8qIHVuZGVmaW5lIGZvciBCb3JsYW5kIExpYiAqLworCSN1bmRlZiBpbnBvcnQgICAgICAgICAgIC8qIHRoZXkgbWF5IGhhdmUgZGVmaW5lIEkvTyBmdW5jdGlvbiBpbiBMSUIgKi8KKwkjdW5kZWYgb3V0cG9ydGIKKwkjdW5kZWYgb3V0cG9ydAorCisJI2RlZmluZSBPU19JblBvcnRCeXRlKGlvcG9ydCkgCQlpbnBvcnRiKGlvcG9ydCkKKwkjZGVmaW5lIE9TX0luUG9ydFdvcmQoaW9wb3J0KSAJCWlucG9ydChpb3BvcnQpCisJI2RlZmluZSBPU19JblBvcnRMb25nKGlvcG9ydCkJCQlpbnBvcnRxKGlvcG9ydCwgdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydEJ5dGUoaW9wb3J0LCB2YWwpIG91dHBvcnRiKGlvcG9ydCwgdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydFdvcmQoaW9wb3J0LCB2YWwpCW91dHBvcnQoaW9wb3J0LCB2YWwpCisJI2RlZmluZSBPU19PdXRQb3J0TG9uZyhpb3BvcnQpCQlvdXRwb3J0cShpb3BvcnQsIHZhbCkKKyNlbmRpZgkvKiBET1MgKi8KKworI2lmIGRlZmluZWQoTkVUV0FSRSkgfHwgZGVmaW5lZChPVEhFUl8zMikgfHwgIGRlZmluZWQoT1RIRVJfMTYpCisJZXh0ZXJuIHUwOGJpdHMJT1NfSW5Qb3J0Qnl0ZSh1MzJiaXRzIGlvcG9ydCk7CisJZXh0ZXJuIHUxNmJpdHMJT1NfSW5Qb3J0V29yZCh1MzJiaXRzIGlvcG9ydCk7CisJZXh0ZXJuIHUzMmJpdHMJT1NfSW5Qb3J0TG9uZyh1MzJiaXRzIGlvcG9ydCk7CisKKwlleHRlcm4gT1NfSW5Qb3J0Qnl0ZUJ1ZmZlcih1MzJiaXRzIGlvcG9ydCwgcHUwOGJpdHMgYnVmZmVyLCB1MzJiaXRzIGNvdW50KTsKKwlleHRlcm4gT1NfSW5Qb3J0V29yZEJ1ZmZlcih1MzJiaXRzIGlvcG9ydCwgcHUxNmJpdHMgYnVmZmVyLCB1MzJiaXRzIGNvdW50KTsKKwlleHRlcm4gT1NfT3V0UG9ydEJ5dGUodTMyYml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwlleHRlcm4gT1NfT3V0UG9ydFdvcmQodTMyYml0cyBpb3BvcnQsIHUxNmJpdHMgdmFsKTsKKwlleHRlcm4gT1NfT3V0UG9ydExvbmcodTMyYml0cyBpb3BvcnQsIHUzMmJpdHMgdmFsKTsKKwlleHRlcm4gT1NfT3V0UG9ydEJ5dGVCdWZmZXIodTMyYml0cyBpb3BvcnQsIHB1MDhiaXRzIGJ1ZmZlciwgdTMyYml0cyBjb3VudCk7CisJZXh0ZXJuIE9TX091dFBvcnRXb3JkQnVmZmVyKHUzMmJpdHMgaW9wb3J0LCBwdTE2Yml0cyBidWZmZXIsIHUzMmJpdHMgY291bnQpOworI2VuZGlmCS8qIE5FVFdBUkUgfHwgT1RIRVJfMzIgfHwgT1RIRVJfMTYgKi8KKworI2lmIGRlZmluZWQgKE5UKSB8fCBkZWZpbmVkKFdJTjk1XzMyKSB8fCBkZWZpbmVkKFdJTjk1XzE2KQorCSNpZiBkZWZpbmVkKE5UKQorCisJCWV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdTA4Yml0cyBTY3NpUG9ydFJlYWRQb3J0VWNoYXIocHUwOGJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB1MTZiaXRzIFNjc2lQb3J0UmVhZFBvcnRVc2hvcnQocHUxNmJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB1MzJiaXRzIFNjc2lQb3J0UmVhZFBvcnRVbG9uZyhwdTMyYml0cyBpb3BvcnQpOworCQlleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgU2NzaVBvcnRXcml0ZVBvcnRVY2hhcihwdTA4Yml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIFNjc2lQb3J0V3JpdGVQb3J0VXNob3J0KHB1MTZiaXRzIHBvcnQsIHUxNmJpdHMgdmFsKTsKKwkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIFNjc2lQb3J0V3JpdGVQb3J0VWxvbmcocHUzMmJpdHMgcG9ydCwgdTMyYml0cyB2YWwpOworCisJI2Vsc2UKKworCQlleHRlcm4gdTA4Yml0cyBTY3NpUG9ydFJlYWRQb3J0VWNoYXIocHUwOGJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIHUxNmJpdHMgU2NzaVBvcnRSZWFkUG9ydFVzaG9ydChwdTE2Yml0cyBpb3BvcnQpOworCQlleHRlcm4gdTMyYml0cyBTY3NpUG9ydFJlYWRQb3J0VWxvbmcocHUzMmJpdHMgaW9wb3J0KTsKKwkJZXh0ZXJuIHZvaWQgU2NzaVBvcnRXcml0ZVBvcnRVY2hhcihwdTA4Yml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwkJZXh0ZXJuIHZvaWQgU2NzaVBvcnRXcml0ZVBvcnRVc2hvcnQocHUxNmJpdHMgcG9ydCwgdTE2Yml0cyB2YWwpOworCQlleHRlcm4gdm9pZCBTY3NpUG9ydFdyaXRlUG9ydFVsb25nKHB1MzJiaXRzIHBvcnQsIHUzMmJpdHMgdmFsKTsKKwkjZW5kaWYKKworCisJI2RlZmluZSBPU19JblBvcnRCeXRlKGlvcG9ydCkgU2NzaVBvcnRSZWFkUG9ydFVjaGFyKChwdTA4Yml0cykgaW9wb3J0KQorCSNkZWZpbmUgT1NfSW5Qb3J0V29yZChpb3BvcnQpIFNjc2lQb3J0UmVhZFBvcnRVc2hvcnQoKHB1MTZiaXRzKSBpb3BvcnQpCisJI2RlZmluZSBPU19JblBvcnRMb25nKGlvcG9ydCkgU2NzaVBvcnRSZWFkUG9ydFVsb25nKChwdTMyYml0cykgaW9wb3J0KQorCisJI2RlZmluZSBPU19PdXRQb3J0Qnl0ZShpb3BvcnQsIHZhbCkgU2NzaVBvcnRXcml0ZVBvcnRVY2hhcigocHUwOGJpdHMpIGlvcG9ydCwgKHUwOGJpdHMpIHZhbCkKKwkjZGVmaW5lIE9TX091dFBvcnRXb3JkKGlvcG9ydCwgdmFsKSBTY3NpUG9ydFdyaXRlUG9ydFVzaG9ydCgocHUxNmJpdHMpIGlvcG9ydCwgKHUxNmJpdHMpIHZhbCkKKwkjZGVmaW5lIE9TX091dFBvcnRMb25nKGlvcG9ydCwgdmFsKSBTY3NpUG9ydFdyaXRlUG9ydFVsb25nKChwdTMyYml0cykgaW9wb3J0LCAodTMyYml0cykgdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydEJ5dGVCdWZmZXIoaW9wb3J0LCBidWZmZXIsIGNvdW50KSBcCisJCVNjc2lQb3J0V3JpdGVQb3J0QnVmZmVyVWNoYXIoKHB1MDhiaXRzKSZwb3J0LCAocHUwOGJpdHMpIGJ1ZmZlciwgKHUzMmJpdHMpIGNvdW50KQorCSNkZWZpbmUgT1NfT3V0UG9ydFdvcmRCdWZmZXIoaW9wb3J0LCBidWZmZXIsIGNvdW50KSBcCisJCVNjc2lQb3J0V3JpdGVQb3J0QnVmZmVyVXNob3J0KChwdTE2Yml0cykmcG9ydCwgKHB1MTZiaXRzKSBidWZmZXIsICh1MzJiaXRzKSBjb3VudCkKKworCSNkZWZpbmUgT1NfTG9jayh4KQorCSNkZWZpbmUgT1NfVW5Mb2NrKHgpCisjZW5kaWYgLyogTlQgfHwgV0lOOTVfMzIgfHwgV0lOOTVfMTYgKi8KKworI2lmIGRlZmluZWQgKFVOSVgpICYmICFkZWZpbmVkKE9TX0luUG9ydEJ5dGUpCisJI2RlZmluZSBPU19JblBvcnRCeXRlKGlvcG9ydCkgICAgaW5iKCh1MTZiaXRzKWlvcG9ydCkKKwkjZGVmaW5lIE9TX0luUG9ydFdvcmQoaW9wb3J0KSAgICBpbncoKHUxNmJpdHMpaW9wb3J0KQorCSNkZWZpbmUgT1NfSW5Qb3J0TG9uZyhpb3BvcnQpICAgIGlubCgodTE2Yml0cylpb3BvcnQpCisJI2RlZmluZSBPU19PdXRQb3J0Qnl0ZShpb3BvcnQsdmFsKSAgb3V0YigodTE2Yml0cylpb3BvcnQsICh1MDhiaXRzKXZhbCkKKwkjZGVmaW5lIE9TX091dFBvcnRXb3JkKGlvcG9ydCx2YWwpICBvdXR3KCh1MTZiaXRzKWlvcG9ydCwgKHUxNmJpdHMpdmFsKQorCSNkZWZpbmUgT1NfT3V0UG9ydExvbmcoaW9wb3J0LHZhbCkgIG91dGwoKHUxNmJpdHMpaW9wb3J0LCAodTMyYml0cyl2YWwpCisKKwkjZGVmaW5lIE9TX0xvY2soeCkKKwkjZGVmaW5lIE9TX1VuTG9jayh4KQorI2VuZGlmIC8qIFVOSVggKi8KKworCisjaWYgZGVmaW5lZChPUzIpCisJZXh0ZXJuIHUwOGJpdHMJaW5iKHUzMmJpdHMgaW9wb3J0KTsKKwlleHRlcm4gdTE2Yml0cwlpbncodTMyYml0cyBpb3BvcnQpOworCWV4dGVybiB2b2lkCW91dGIodTMyYml0cyBpb3BvcnQsIHUwOGJpdHMgdmFsKTsKKwlleHRlcm4gdm9pZAlvdXR3KHUzMmJpdHMgaW9wb3J0LCB1MTZiaXRzIHZhbCk7CisKKwkjZGVmaW5lIE9TX0luUG9ydEJ5dGUoaW9wb3J0KQkJCWluYihpb3BvcnQpCisJI2RlZmluZSBPU19JblBvcnRXb3JkKGlvcG9ydCkJCQlpbncoaW9wb3J0KQorCSNkZWZpbmUgT1NfT3V0UG9ydEJ5dGUoaW9wb3J0LCB2YWwpCW91dGIoaW9wb3J0LCB2YWwpCisJI2RlZmluZSBPU19PdXRQb3J0V29yZChpb3BvcnQsIHZhbCkJb3V0dyhpb3BvcnQsIHZhbCkKKwlleHRlcm4gdTMyYml0cwlPU19JblBvcnRMb25nKHUzMmJpdHMgaW9wb3J0KTsKKwlleHRlcm4gdm9pZAlPU19PdXRQb3J0TG9uZyh1MzJiaXRzIGlvcG9ydCwgdTMyYml0cyB2YWwpOworCisJI2RlZmluZSBPU19Mb2NrKHgpCisJI2RlZmluZSBPU19VbkxvY2soeCkKKyNlbmRpZiAvKiBPUzIgKi8KKworI2lmIGRlZmluZWQoU09MQVJJU19SRUFMX01PREUpCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICAgIGluYih1bnNpZ25lZCBsb25nIGlvcG9ydCk7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgICBpbncodW5zaWduZWQgbG9uZyBpb3BvcnQpOworCisjZGVmaW5lIE9TX0luUG9ydEJ5dGUoaW9wb3J0KSAgICBpbmIoaW9wb3J0KQorI2RlZmluZSBPU19JblBvcnRXb3JkKGlvcG9ydCkgICAgaW53KGlvcG9ydCkKKworZXh0ZXJuIHZvaWQgT1NfT3V0UG9ydEJ5dGUodW5zaWduZWQgbG9uZyBpb3BvcnQsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK2V4dGVybiB2b2lkIE9TX091dFBvcnRXb3JkKHVuc2lnbmVkIGxvbmcgaW9wb3J0LCB1bnNpZ25lZCBzaG9ydCB2YWwpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgIE9TX0luUG9ydExvbmcodW5zaWduZWQgbG9uZyBpb3BvcnQpOworZXh0ZXJuIHZvaWQgICAgIE9TX091dFBvcnRMb25nKHVuc2lnbmVkIGxvbmcgaW9wb3J0LCB1bnNpZ25lZCBsb25nIHZhbCk7CisKKyNkZWZpbmUgT1NfTG9jayh4KQorI2RlZmluZSBPU19VbkxvY2soeCkKKworI2VuZGlmICAvKiBTT0xBUklTX1JFQUxfTU9ERSAqLworCisjZW5kaWYgIC8qIF9fR0xPQkFMU19IX18gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICBzY2NibWdyLmggICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgQ29tbW9uIHNoYXJlZCBTQ0NCIEludGVyZmFjZSBkZWZpbmVzIGFuZCBTQ0NCIAorICoJCQkJCQkgTWFuYWdlciBzcGVjaWZpY3MgZGVmaW5lcy4KKyAqCisgKiAgICREYXRlOiAxOTk2LzEwLzI0IDIzOjA5OjMzICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS4xNCAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1NDQ0JfSF9fCisjZGVmaW5lIF9fU0NDQl9IX18KKworLyojaW5jbHVkZSA8b3NmbGFncy5oPiovCisvKiNpbmNsdWRlIDxnbG9iYWxzLmg+Ki8KKworI2lmIGRlZmluZWQoQlVHQlVHKQorI2RlZmluZSBkZWJ1Z19zaXplIDMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9TKQorCisgICB0eXBlZGVmIHN0cnVjdCBfU0NDQiBuZWFyICpQU0NDQjsKKwkjaWYgKEZXX1RZUEUgPT0gX1NDQ0JfTUdSXykKKyAgIAl0eXBlZGVmIHZvaWQgKCpDQUxMX0JLX0ZOKShQU0NDQik7CisJI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoT1MyKQorCisgICB0eXBlZGVmIHN0cnVjdCBfU0NDQiBmYXIgKlBTQ0NCOworCSNpZiAoRldfVFlQRSA9PSBfU0NDQl9NR1JfKQorICAgCXR5cGVkZWYgdm9pZCAoZmFyICpDQUxMX0JLX0ZOKShQU0NDQik7CisJI2VuZGlmCisKKyNlbHNlCisKKyAgIHR5cGVkZWYgc3RydWN0IF9TQ0NCICpQU0NDQjsKKwkjaWYgKEZXX1RZUEUgPT0gX1NDQ0JfTUdSXykKKyAgIAl0eXBlZGVmIHZvaWQgKCpDQUxMX0JLX0ZOKShQU0NDQik7CisJI2VuZGlmCisKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IFNDQ0JNZ3JfaW5mbyB7CisgICBVTE9ORyAgICBzaV9iYXNlYWRkcjsKKyAgIFVDSEFSICAgIHNpX3ByZXNlbnQ7CisgICBVQ0hBUiAgICBzaV9pbnR2ZWN0OworICAgVUNIQVIgICAgc2lfaWQ7CisgICBVQ0hBUiAgICBzaV9sdW47CisgICBVU0hPUlQgICBzaV9md19yZXZpc2lvbjsKKyAgIFVTSE9SVCAgIHNpX3Blcl90YXJnX2luaXRfc3luYzsKKyAgIFVTSE9SVCAgIHNpX3Blcl90YXJnX2Zhc3RfbmVnbzsKKyAgIFVTSE9SVCAgIHNpX3Blcl90YXJnX3VsdHJhX25lZ287CisgICBVU0hPUlQgICBzaV9wZXJfdGFyZ19ub19kaXNjOworICAgVVNIT1JUICAgc2lfcGVyX3Rhcmdfd2lkZV9uZWdvOworICAgVVNIT1JUICAgc2lfZmxhZ3M7CisgICBVQ0hBUiAgICBzaV9jYXJkX2ZhbWlseTsKKyAgIFVDSEFSICAgIHNpX2J1c3R5cGU7CisgICBVQ0hBUiAgICBzaV9jYXJkX21vZGVsWzNdOworICAgVUNIQVIgICAgc2lfcmVsYXRpdmVfY2FyZG51bTsKKyAgIFVDSEFSICAgIHNpX3Jlc2VydmVkWzRdOworICAgVUxPTkcgICAgc2lfT1NfcmVzZXJ2ZWQ7CisgICBVQ0hBUiAgICBzaV9YbGF0SW5mb1s0XTsKKyAgIFVMT05HICAgIHNpX3Jlc2VydmVkMls1XTsKKyAgIFVMT05HICAgIHNpX3NlY29uZGFyeV9yYW5nZTsKK30gU0NDQk1HUl9JTkZPOworCisjaWYgZGVmaW5lZChET1MpCisgICB0eXBlZGVmIFNDQ0JNR1JfSU5GTyAqICAgICAgUFNDQ0JNR1JfSU5GTzsKKyNlbHNlCisgICAjaWYgZGVmaW5lZCAoQ09NUElMRVJfMTZfQklUKQorICAgdHlwZWRlZiBTQ0NCTUdSX0lORk8gZmFyICogIFBTQ0NCTUdSX0lORk87CisgICAjZWxzZQorICAgdHlwZWRlZiBTQ0NCTUdSX0lORk8gKiAgICAgIFBTQ0NCTUdSX0lORk87CisgICAjZW5kaWYKKyNlbmRpZiAvLyBkZWZpbmVkKERPUykKKworCisKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorCSNkZWZpbmUgU0NTSV9QQVJJVFlfRU5BCQkgIDB4MDAwMQorCSNkZWZpbmUgTE9XX0JZVEVfVEVSTQkJICAweDAwMTAKKwkjZGVmaW5lIEhJR0hfQllURV9URVJNCQkgIDB4MDAyMAorCSNkZWZpbmUgQlVTVFlQRV9QQ0kJICAweDMKKyNlbmRpZgorCisjZGVmaW5lIFNVUFBPUlRfMTZUQVJfMzJMVU4JICAweDAwMDIKKyNkZWZpbmUgU09GVF9SRVNFVAkJICAweDAwMDQKKyNkZWZpbmUgRVhURU5ERURfVFJBTlNMQVRJT04JICAweDAwMDgKKyNkZWZpbmUgUE9TVF9BTExfVU5ERVJSUlVOUwkgIDB4MDA0MAorI2RlZmluZSBGTEFHX1NDQU1fRU5BQkxFRAkgIDB4MDA4MAorI2RlZmluZSBGTEFHX1NDQU1fTEVWRUwyCSAgMHgwMTAwCisKKworCisKKyNkZWZpbmUgSEFSUE9PTl9GQU1JTFkgICAgICAgIDB4MDIKKworCisjZGVmaW5lIElTQV9CVVNfQ0FSRCAgICAgICAgICAweDAxCisjZGVmaW5lIEVJU0FfQlVTX0NBUkQgICAgICAgICAweDAyCisjZGVmaW5lIFBDSV9CVVNfQ0FSRCAgICAgICAgICAweDAzCisjZGVmaW5lIFZFU0FfQlVTX0NBUkQgICAgICAgICAweDA0CisKKy8qIFNDQ0Igc3RydWMgdXNlZCBmb3IgYm90aCBTQ0NCIGFuZCBVQ0IgbWFuYWdlciBjb21waWxlcyEgCisgKiBUaGUgVUNCIE1hbmFnZXIgdHJlYXRzIHRoZSBTQ0NCIGFzIGl0J3MgJ25hdGl2ZSBoYXJkd2FyZSBzdHJ1Y3R1cmUnIAorICovCisKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBfU0NDQiB7CisgICBVQ0hBUiBPcGVyYXRpb25Db2RlOworICAgVUNIQVIgQ29udHJvbEJ5dGU7CisgICBVQ0hBUiBDZGJMZW5ndGg7CisgICBVQ0hBUiBSZXF1ZXN0U2Vuc2VMZW5ndGg7CisgICBVTE9ORyBEYXRhTGVuZ3RoOworICAgVUxPTkcgRGF0YVBvaW50ZXI7CisgICBVQ0hBUiBDY2JSZXNbMl07CisgICBVQ0hBUiBIb3N0U3RhdHVzOworICAgVUNIQVIgVGFyZ2V0U3RhdHVzOworICAgVUNIQVIgVGFyZ0lEOworICAgVUNIQVIgTHVuOworICAgVUNIQVIgQ2RiWzEyXTsKKyAgIFVDSEFSIENjYlJlczE7CisgICBVQ0hBUiBSZXNlcnZlZDE7CisgICBVTE9ORyBSZXNlcnZlZDI7CisgICBVTE9ORyBTZW5zZVBvaW50ZXI7CisKKworICAgQ0FMTF9CS19GTiBTY2NiQ2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgLyogVk9JRCAoKlNjY2JDYWxsYmFjaykoKTsgKi8KKyAgIFVMT05HICBTY2NiSU9Qb3J0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElkZW50aWZpZXMgYm9hcmQgYmFzZSBwb3J0ICovCisgICBVQ0hBUiAgU2NjYlN0YXR1czsKKyAgIFVDSEFSICBTQ0NCUmVzMjsKKyAgIFVTSE9SVCBTY2NiT1NGbGFnczsKKworCisgICBVTE9ORyAgIFNjY2JfWGZlckNudDsgICAgICAgICAgICAvKiBhY3R1YWwgdHJhbnNmZXIgY291bnQgKi8KKyAgIFVMT05HICAgU2NjYl9BVEM7CisgICBVTE9ORyAgIFNjY2JWaXJ0RGF0YVB0cjsgICAgICAgICAvKiB2aXJ0dWFsIGFkZHIgZm9yIE9TLzIgKi8KKyAgIFVMT05HICAgU2NjYl9yZXMxOworICAgVVNIT1JUICBTY2NiX01HUkZsYWdzOworICAgVVNIT1JUICBTY2NiX3Nnc2VnOworICAgVUNIQVIgICBTY2NiX3Njc2ltc2c7ICAgICAgICAgICAgLyogaWRlbnRpZnkgbXNnIGZvciBzZWxlY3Rpb24gKi8KKyAgIFVDSEFSICAgU2NjYl90YWc7CisgICBVQ0hBUiAgIFNjY2Jfc2NzaXN0YXQ7CisgICBVQ0hBUiAgIFNjY2JfaWRtc2c7ICAgICAgICAgICAgICAvKiBpbWFnZSBvZiBsYXN0IG1zZyBpbiAqLworICAgUFNDQ0IgICBTY2NiX2ZvcndhcmRsaW5rOworICAgUFNDQ0IgICBTY2NiX2JhY2tsaW5rOworICAgVUxPTkcgICBTY2NiX3NhdmVkQVRDOworICAgVUNIQVIgICBTYXZlX0NkYls2XTsKKyAgIFVDSEFSICAgU2F2ZV9DZGJMZW47CisgICBVQ0hBUiAgIFNjY2JfWGZlclN0YXRlOworICAgVUxPTkcgICBTY2NiX1NHb2Zmc2V0OworI2lmIChGV19UWVBFID09IF9VQ0JfTUdSXykKKyAgIFBVQ0IgICAgU2NjYl91Y2JfcHRyOworI2VuZGlmCisgICB9IFNDQ0I7CisKKyNkZWZpbmUgU0NDQl9TSVpFIHNpemVvZihTQ0NCKQorCisjcHJhZ21hIHBhY2soKQorCisKKworI2RlZmluZSBTQ1NJX0lOSVRJQVRPUl9DT01NQU5EICAgIDB4MDAKKyNkZWZpbmUgVEFSR0VUX01PREVfQ09NTUFORCAgICAgICAweDAxCisjZGVmaW5lIFNDQVRURVJfR0FUSEVSX0NPTU1BTkQgICAgMHgwMgorI2RlZmluZSBSRVNJRFVBTF9DT01NQU5EICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUkVTSURVQUxfU0dfQ09NTUFORCAgICAgICAweDA0CisjZGVmaW5lIFJFU0VUX0NPTU1BTkQgICAgICAgICAgICAgMHg4MQorCisKKyNkZWZpbmUgRl9VU0VfQ01EX1EgICAgICAgICAgICAgIDB4MjAgICAgIC8qSW5pZGNhdGVzIFRBR0dFRCBjb21tYW5kLiAqLworI2RlZmluZSBUQUdfVFlQRV9NQVNLICAgICAgICAgICAgMHhDMCAgICAgLypUeXBlIG9mIHRhZyBtc2cgdG8gc2VuZC4gKi8KKyNkZWZpbmUgVEFHX1FfTUFTSyAgICAgICAgICAgICAgIDB4RTAKKyNkZWZpbmUgU0NDQl9EQVRBX1hGRVJfT1VUICAgICAgIDB4MTAgICAgIC8qIFdyaXRlICovCisjZGVmaW5lIFNDQ0JfREFUQV9YRkVSX0lOICAgICAgICAweDA4ICAgICAvKiBSZWFkICovCisKKworI2RlZmluZSBGT1VSVEVFTl9CWVRFUyAgICAgICAgICAgMHgwMCAgICAgLyogUmVxdWVzdCBTZW5zZSBCdWZmZXIgc2l6ZSAqLworI2RlZmluZSBOT19BVVRPX1JFUVVFU1RfU0VOU0UgICAgMHgwMSAgICAgLyogTm8gUmVxdWVzdCBTZW5zZSBCdWZmZXIgKi8KKworCisjZGVmaW5lIEJVU19GUkVFX1NUICAgICAwICAgICAgIAorI2RlZmluZSBTRUxFQ1RfU1QgICAgICAgMQorI2RlZmluZSBTRUxFQ1RfQkRSX1NUICAgMiAgICAgLyogU2VsZWN0IHdcIEJ1cyBEZXZpY2UgUmVzZXQgKi8KKyNkZWZpbmUgU0VMRUNUX1NOX1NUICAgIDMgICAgIC8qIFNlbGVjdCB3XCBTeW5jIE5lZ28gKi8KKyNkZWZpbmUgU0VMRUNUX1dOX1NUICAgIDQgICAgIC8qIFNlbGVjdCB3XCBXaWRlIERhdGEgTmVnbyAqLworI2RlZmluZSBTRUxFQ1RfUV9TVCAgICAgNSAgICAgLyogU2VsZWN0IHdcIFRhZ2dlZCBRJ2luZyAqLworI2RlZmluZSBDT01NQU5EX1NUICAgICAgNgorI2RlZmluZSBEQVRBX09VVF9TVCAgICAgNworI2RlZmluZSBEQVRBX0lOX1NUICAgICAgOAorI2RlZmluZSBESVNDT05ORUNUX1NUICAgOQorI2RlZmluZSBTVEFUVVNfU1QgICAgICAgMTAKKyNkZWZpbmUgQUJPUlRfU1QgICAgICAgIDExCisjZGVmaW5lIE1FU1NBR0VfU1QgICAgICAxMgorCisKKyNkZWZpbmUgRl9IT1NUX1hGRVJfRElSICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRl9BTExfWEZFUlJFRCAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRl9TR19YRkVSICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRl9BVVRPX1NFTlNFICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRl9PRERfQkFMTF9DTlQgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRl9OT19EQVRBX1lFVCAgICAgICAgICAgICAgICAgIDB4ODAKKworCisjZGVmaW5lIEZfU1RBVFVTTE9BREVEICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEZfTVNHTE9BREVEICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEZfREVWX1NFTEVDVEVEICAgICAgICAgICAgICAgICAweDA0CisKKworI2RlZmluZSBTQ0NCX0NPTVBMRVRFICAgICAgICAgICAgICAgMHgwMCAgLyogU0NDQiBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciAqLworI2RlZmluZSBTQ0NCX0RBVEFfVU5ERVJfUlVOICAgICAgICAgMHgwQworI2RlZmluZSBTQ0NCX1NFTEVDVElPTl9USU1FT1VUICAgICAgMHgxMSAgLyogU2V0IFNDU0kgc2VsZWN0aW9uIHRpbWVkIG91dCAqLworI2RlZmluZSBTQ0NCX0RBVEFfT1ZFUl9SVU4gICAgICAgICAgMHgxMgorI2RlZmluZSBTQ0NCX1VORVhQRUNURURfQlVTX0ZSRUUgICAgMHgxMyAgLyogVGFyZ2V0IGRyb3BwZWQgU0NTSSBCU1kgKi8KKyNkZWZpbmUgU0NDQl9QSEFTRV9TRVFVRU5DRV9GQUlMICAgIDB4MTQgIC8qIFRhcmdldCBidXMgcGhhc2Ugc2VxdWVuY2UgZmFpbHVyZSAqLworCisjZGVmaW5lIFNDQ0JfSU5WQUxJRF9PUF9DT0RFICAgICAgICAweDE2ICAvKiBTQ0NCIGludmFsaWQgb3BlcmF0aW9uIGNvZGUgKi8KKyNkZWZpbmUgU0NDQl9JTlZBTElEX1NDQ0IgICAgICAgICAgIDB4MUEgIC8qIEludmFsaWQgU0NDQiAtIGJhZCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0NDQl9HUk9TU19GV19FUlIgICAgICAgICAgIDB4MjcgIC8qIE1ham9yIHByb2JsZW0hICovCisjZGVmaW5lIFNDQ0JfQk1fRVJSICAgICAgICAgICAgICAgICAweDMwICAvKiBCdXNNYXN0ZXIgZXJyb3IuICovCisjZGVmaW5lIFNDQ0JfUEFSSVRZX0VSUiAgICAgICAgICAgICAweDM0ICAvKiBTQ1NJIHBhcml0eSBlcnJvciAqLworCisKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pICAKKyAgICNkZWZpbmUgIEhCQV9BVVRPX1NFTlNFX0ZBSUwgICAgICAgIDB4MUIgIAorICAgI2RlZmluZSAgSEJBX1RRX1JFSkVDVEVEICAgICAgICAgICAgMHgxQyAgCisgICAjZGVmaW5lICBIQkFfVU5TVVBQT1JURURfTVNHICAgICAgICAgMHgxRCAgCisgICAjZGVmaW5lICBIQkFfSFdfRVJST1IgICAgICAgICAgICAgICAweDIwICAKKyAgICNkZWZpbmUgIEhCQV9BVE5fTk9UX1JFU1BPTkRFRCAgICAgIDB4MjEgIAorICAgI2RlZmluZSAgSEJBX1NDU0lfUkVTRVRfQllfQURBUFRFUiAgMHgyMgorICAgI2RlZmluZSAgSEJBX1NDU0lfUkVTRVRfQllfVEFSR0VUICAgMHgyMworICAgI2RlZmluZSAgSEJBX1dST05HX0NPTk5FQ1RJT04gICAgICAgMHgyNAorICAgI2RlZmluZSAgSEJBX0JVU19ERVZJQ0VfUkVTRVQgICAgICAgMHgyNQorICAgI2RlZmluZSAgSEJBX0FCT1JUX1FVRVVFICAgICAgICAgICAgMHgyNgorCisjZWxzZSAvLyB0aGVzZSBhcmUgbm90IGRlZmluZWQgaW4gQlVESS9VQ0IKKworICAgI2RlZmluZSBTQ0NCX0lOVkFMSURfRElSRUNUSU9OICAgICAgMHgxOCAgLyogSW52YWxpZCB0YXJnZXQgZGlyZWN0aW9uICovCisgICAjZGVmaW5lIFNDQ0JfRFVQTElDQVRFX1NDQ0IgICAgICAgICAweDE5ICAvKiBEdXBsaWNhdGUgU0NDQiAqLworICAgI2RlZmluZSBTQ0NCX1NDU0lfUlNUICAgICAgICAgICAgICAgMHgzNSAgLyogU0NTSSBSRVNFVCBkZXRlY3RlZC4gKi8KKworI2VuZGlmIC8vIChGV19UWVBFPT1fVUNCX01HUl8pICAKKworCisjZGVmaW5lIFNDQ0JfSU5fUFJPQ0VTUyAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0NDQl9TVUNDRVNTICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTQ0NCX0FCT1JUICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNDQ0JfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU0NDQl9FUlJPUiAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTQ0NCX0lOVkFMSUQgICAgICAgICAgICAgICAweDA1CisKKyNkZWZpbmUgU0NDQl9TSVpFIHNpemVvZihTQ0NCKQorCisKKworCisjaWYgKEZXX1RZUEUgPT0gX1VDQl9NR1JfKQorCXZvaWQgU2NjYk1ncl9zdGFydF9zY2NiKENBUkRfSEFORExFIHBDdXJyQ2FyZCwgUFVDQiBwX3VjYik7CisJczMyYml0cyBTY2NiTWdyX2Fib3J0X3NjY2IoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkLCBQVUNCIHBfdWNiKTsKKwl1MDhiaXRzIFNjY2JNZ3JfbXlfaW50KENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJczMyYml0cyBTY2NiTWdyX2lzcihDQVJEX0hBTkRMRSBwQ3VyckNhcmQpOworCXZvaWQgU2NjYk1ncl9zY3NpX3Jlc2V0KENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3RpbWVyX2V4cGlyZWQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKTsKKwl2b2lkIFNjY2JNZ3JfdW5sb2FkX2NhcmQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKTsKKwl2b2lkIFNjY2JNZ3JfcmVzdG9yZV9mb3JlaWduX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3Jlc3RvcmVfbmF0aXZlX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3NhdmVfZm9yZWlnbl9zdGF0ZShQQURBUFRFUl9JTkZPIHBBZGFwdGVySW5mbyk7CisKKyNlbmRpZgorCisKKyNpZiAoRldfVFlQRSA9PSBfU0NDQl9NR1JfKQorCisgI2lmIGRlZmluZWQgKERPUykKKwlpbnQgICAgU2NjYk1ncl9zZW5zZV9hZGFwdGVyKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKTsKKwlVU0hPUlQgU2NjYk1ncl9jb25maWdfYWRhcHRlcihQU0NDQk1HUl9JTkZPIHBDYXJkSW5mbyk7CisJdm9pZCAgU2NjYk1ncl9zdGFydF9zY2NiKFVTSE9SVCBwQ3VyckNhcmQsIFBTQ0NCIHBfU0NDQik7CisJaW50ICAgU2NjYk1ncl9hYm9ydF9zY2NiKFVTSE9SVCBwQ3VyckNhcmQsIFBTQ0NCIHBfU0NDQik7CisJVUNIQVIgU2NjYk1ncl9teV9pbnQoVVNIT1JUIHBDdXJyQ2FyZCk7CisJaW50ICAgU2NjYk1ncl9pc3IoVVNIT1JUIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9zY3NpX3Jlc2V0KFVTSE9SVCBwQ3VyckNhcmQpOworCXZvaWQgIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChVU0hPUlQgcEN1cnJDYXJkKTsKKwlVU0hPUlQgU2NjYk1ncl9zdGF0dXMoVVNIT1JUIHBDdXJyQ2FyZCk7CisJdm9pZCBTY2NiTWdyX3VubG9hZF9jYXJkKFVTSE9SVCBwQ3VyckNhcmQpOworCisgI2Vsc2UgICAgLy9ub24tRE9TCisKKwlpbnQgICBTY2NiTWdyX3NlbnNlX2FkYXB0ZXIoUFNDQ0JNR1JfSU5GTyBwQ2FyZEluZm8pOworCVVMT05HIFNjY2JNZ3JfY29uZmlnX2FkYXB0ZXIoUFNDQ0JNR1JfSU5GTyBwQ2FyZEluZm8pOworCXZvaWQgIFNjY2JNZ3Jfc3RhcnRfc2NjYihVTE9ORyBwQ3VyckNhcmQsIFBTQ0NCIHBfU0NDQik7CisJaW50ICAgU2NjYk1ncl9hYm9ydF9zY2NiKFVMT05HIHBDdXJyQ2FyZCwgUFNDQ0IgcF9TQ0NCKTsKKwlVQ0hBUiBTY2NiTWdyX215X2ludChVTE9ORyBwQ3VyckNhcmQpOworCWludCAgIFNjY2JNZ3JfaXNyKFVMT05HIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9zY3NpX3Jlc2V0KFVMT05HIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9lbmFibGVfaW50KFVMT05HIHBDdXJyQ2FyZCk7CisJdm9pZCAgU2NjYk1ncl9kaXNhYmxlX2ludChVTE9ORyBwQ3VyckNhcmQpOworCXZvaWQgIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChVTE9ORyBwQ3VyckNhcmQpOworCXZvaWQgU2NjYk1ncl91bmxvYWRfY2FyZChVTE9ORyBwQ3VyckNhcmQpOworCisgICNlbmRpZgorI2VuZGlmICAvLyAoRldfVFlQRSA9PSBfU0NDQl9NR1JfKQorCisjZW5kaWYgIC8qIF9fU0NDQl9IX18gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICBibHgzMC5oICAkCisgKgorICogICBEZXNjcmlwdGlvbjogVGhpcyBtb2R1bGUgY29udGFpbnMgU0NDQi9VQ0IgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICogICAgICAgICAgICAgICAgc3BlY2lmaWMgc3R1ZmYuCisgKgorICogICAkRGF0ZTogMTk5Ni8xMS8xMyAxODozNDoyMiAkCisgKgorICogICAkUmV2aXNpb246IDEuMTAgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2lmbmRlZiBfX2JseDMwX0hfXworI2RlZmluZSBfX2JseDMwX0hfXworCisvKiNpbmNsdWRlIDxnbG9iYWxzLmg+Ki8KKworI2RlZmluZSAgT1JJT05fRldfUkVWICAgICAgMzExMAorCisKKworCisjZGVmaW5lIEhBUlBfUkVWRCAgICAxCisKKworI2lmIGRlZmluZWQoRE9TKQorI2RlZmluZSBRVUVVRV9ERVBUSCAgICAgOCsxICAgICAgICAgICAgLyoxIGZvciBOb3JtYWwgZGlzY29ubmVjdCAwIGZvciBRJ2luZy4gKi8KKyNlbHNlCisjZGVmaW5lIFFVRVVFX0RFUFRIICAgICAyNTQrMSAgICAgICAgICAgIC8qMSBmb3IgTm9ybWFsIGRpc2Nvbm5lY3QgMzIgZm9yIFEnaW5nLiAqLworI2VuZGlmICAgLy8gZGVmaW5lZChET1MpCisKKyNkZWZpbmUJTUFYX01CX0NBUkRTCTQJCQkJCS8qIE1heC4gbm8gb2YgY2FyZHMgc3VwcG9lcnRlZCBvbiBNb3RoZXIgQm9hcmQgKi8KKworI2RlZmluZSBXSURFX1NDU0kgICAgICAgMQorCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisgICAjaWYgZGVmaW5lZChET1MpCisgICAgICAjZGVmaW5lIE1BWF9TQ1NJX1RBUiAgICAxNgorICAgICAgI2RlZmluZSBNQVhfTFVOICAgICAgICAgOAorCQkjZGVmaW5lIExVTl9NQVNLCQkJMHgwNworICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgTUFYX1NDU0lfVEFSICAgIDE2CisgICAgICAjZGVmaW5lIE1BWF9MVU4gICAgICAgICAzMgorCQkjZGVmaW5lIExVTl9NQVNLCQkJMHgxZgorCQorICAgI2VuZGlmCisjZWxzZQorICAgI2RlZmluZSBNQVhfU0NTSV9UQVIgICAgOAorICAgI2RlZmluZSBNQVhfTFVOICAgICAgICAgOAorCSNkZWZpbmUgTFVOX01BU0sJCQkweDA3CisjZW5kaWYgCisKKyNpZiBkZWZpbmVkKEhBUlBfUkVWQSkKKyNkZWZpbmUgU0dfQlVGX0NOVCAgICAgIDE1ICAgICAgICAgICAgIC8qTnVtYmVyIG9mIHByZWZldGNoZWQgZWxlbWVudHMuICovCisjZWxzZQorI2RlZmluZSBTR19CVUZfQ05UICAgICAgMTYgICAgICAgICAgICAgLypOdW1iZXIgb2YgcHJlZmV0Y2hlZCBlbGVtZW50cy4gKi8KKyNlbmRpZgorCisjZGVmaW5lIFNHX0VMRU1FTlRfU0laRSA4ICAgICAgICAgICAgICAvKkVpZ2h0IGJ5dGUgcGVyIGVsZW1lbnQuICovCisjZGVmaW5lIFNHX0xPQ0FMX01BU0sgICAweDAwMDAwMDAwTAorI2RlZmluZSBTR19FTEVNRU5UX01BU0sgMHhGRkZGRkZGRkwKKworCisjaWYgKEZXX1RZUEUgPT0gX1VDQl9NR1JfKQorCSNkZWZpbmUgT1BDX0RFQ09ERV9OT1JNQUwgICAgICAgMHgwZjdmCisjZW5kaWYgICAvLyBfVUNCX01HUl8KKworCisKKyNpZiBkZWZpbmVkKERPUykKKworLyojaW5jbHVkZSA8ZG9zLmg+Ki8KKwkjZGVmaW5lIFJEX0hBUlBPT04oaW9wb3J0KSAgICAgICAgICAoT1NfSW5Qb3J0Qnl0ZShpb3BvcnQpKQorCSNkZWZpbmUgUkRXX0hBUlBPT04oaW9wb3J0KSAgICAgICAgIChPU19JblBvcnRXb3JkKGlvcG9ydCkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgKE9TX091dFBvcnRCeXRlKGlvcG9ydCx2YWwpKQorCSNkZWZpbmUgV1JXX0hBUlBPT04oaW9wb3J0LHZhbCkgICAgIChPU19PdXRQb3J0V29yZChpb3BvcnQsdmFsKSkKKworCSNkZWZpbmUgUkRfSEFSUDMyKHBvcnQsb2Zmc2V0LGRhdGEpICBhc217ZGIgNjZoOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggYXg7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiBkeCxwb3J0OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBkeCwgb2Zmc2V0OyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGF4LGR4OyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiB3b3JkIHB0ciBkYXRhLGF4O1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcCBheH0KKworCSNkZWZpbmUgV1JfSEFSUDMyKHBvcnQsb2Zmc2V0LGRhdGEpIGFzbXtkYiA2Nmg7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggYXg7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiBkeCxwb3J0OyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBkeCwgb2Zmc2V0OyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiBheCx3b3JkIHB0ciBkYXRhO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBkeCxheDsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiIDY2aDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcCBheH0KKyNlbmRpZgkvKiBET1MgKi8KKworI2lmIGRlZmluZWQoTkVUV0FSRSkgfHwgZGVmaW5lZChPVEhFUl8zMikgfHwgIGRlZmluZWQoT1RIRVJfMTYpCisJI2RlZmluZSBSRF9IQVJQT09OKGlvcG9ydCkgICAgIE9TX0luUG9ydEJ5dGUoKHVuc2lnbmVkIGxvbmcpaW9wb3J0KQorCSNkZWZpbmUgUkRXX0hBUlBPT04oaW9wb3J0KSAgICBPU19JblBvcnRXb3JkKCh1bnNpZ25lZCBsb25nKWlvcG9ydCkKKwkjZGVmaW5lIFJEX0hBUlAzMihpb3BvcnQsb2Zmc2V0LGRhdGEpIChkYXRhID0gT1NfSW5Qb3J0TG9uZyhpb3BvcnQgKyBvZmZzZXQpKQorCSNkZWZpbmUgV1JfSEFSUE9PTihpb3BvcnQsdmFsKSBPU19PdXRQb3J0Qnl0ZSgoVUxPTkcpaW9wb3J0LChVQ0hBUikgdmFsKQorCSNkZWZpbmUgV1JXX0hBUlBPT04oaW9wb3J0LHZhbCkgIE9TX091dFBvcnRXb3JkKChVTE9ORylpb3BvcnQsKFVTSE9SVCl2YWwpCisJI2RlZmluZSBXUl9IQVJQMzIoaW9wb3J0LG9mZnNldCxkYXRhKSAgT1NfT3V0UG9ydExvbmcoKGlvcG9ydCArIG9mZnNldCksIGRhdGEpCisjZW5kaWYJLyogTkVUV0FSRSB8fCBPVEhFUl8zMiB8fCBPVEhFUl8xNiAqLworCisjaWYgZGVmaW5lZChOVCkgfHwgZGVmaW5lZChXSU45NV8zMikgfHwgZGVmaW5lZChXSU45NV8xNikKKwkjZGVmaW5lIFJEX0hBUlBPT04oaW9wb3J0KSAgICAgICAgICBPU19JblBvcnRCeXRlKChVTE9ORylpb3BvcnQpCisJI2RlZmluZSBSRFdfSEFSUE9PTihpb3BvcnQpICAgICAgICAgT1NfSW5Qb3J0V29yZCgoVUxPTkcpaW9wb3J0KQorCSNkZWZpbmUgUkRfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgKGRhdGEgPSBPU19JblBvcnRMb25nKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgT1NfT3V0UG9ydEJ5dGUoKFVMT05HKWlvcG9ydCwoVUNIQVIpIHZhbCkKKwkjZGVmaW5lIFdSV19IQVJQT09OKGlvcG9ydCx2YWwpICAgICBPU19PdXRQb3J0V29yZCgoVUxPTkcpaW9wb3J0LChVU0hPUlQpdmFsKQorCSNkZWZpbmUgV1JfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgIE9TX091dFBvcnRMb25nKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSwgZGF0YSkKKyNlbmRpZiAvKiBOVCB8fCBXSU45NV8zMiB8fCBXSU45NV8xNiAqLworCisjaWYgZGVmaW5lZCAoVU5JWCkKKwkjZGVmaW5lIFJEX0hBUlBPT04oaW9wb3J0KSAgICAgICAgICBPU19JblBvcnRCeXRlKCh1MzJiaXRzKWlvcG9ydCkKKwkjZGVmaW5lIFJEV19IQVJQT09OKGlvcG9ydCkgICAgICAgICBPU19JblBvcnRXb3JkKCh1MzJiaXRzKWlvcG9ydCkKKwkjZGVmaW5lIFJEX0hBUlAzMihpb3BvcnQsb2Zmc2V0LGRhdGEpIChkYXRhID0gT1NfSW5Qb3J0TG9uZygodTMyYml0cykoaW9wb3J0ICsgb2Zmc2V0KSkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgT1NfT3V0UG9ydEJ5dGUoKHUzMmJpdHMpaW9wb3J0LCh1MDhiaXRzKSB2YWwpCisJI2RlZmluZSBXUldfSEFSUE9PTihpb3BvcnQsdmFsKSAgICAgICBPU19PdXRQb3J0V29yZCgodTMyYml0cylpb3BvcnQsKHUxNmJpdHMpdmFsKQorCSNkZWZpbmUgV1JfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgIE9TX091dFBvcnRMb25nKCh1MzJiaXRzKShpb3BvcnQgKyBvZmZzZXQpLCBkYXRhKQorI2VuZGlmIC8qIFVOSVggKi8KKworI2lmIGRlZmluZWQoT1MyKQorCSNkZWZpbmUgUkRfSEFSUE9PTihpb3BvcnQpICAgICAgICAgIE9TX0luUG9ydEJ5dGUoKHVuc2lnbmVkIGxvbmcpaW9wb3J0KQorCSNkZWZpbmUgUkRXX0hBUlBPT04oaW9wb3J0KSAgICAgICAgIE9TX0luUG9ydFdvcmQoKHVuc2lnbmVkIGxvbmcpaW9wb3J0KQorCSNkZWZpbmUgUkRfSEFSUDMyKGlvcG9ydCxvZmZzZXQsZGF0YSkgKGRhdGEgPSBPU19JblBvcnRMb25nKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSkpCisJI2RlZmluZSBXUl9IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgT1NfT3V0UG9ydEJ5dGUoKFVMT05HKWlvcG9ydCwoVUNIQVIpIHZhbCkKKwkjZGVmaW5lIFdSV19IQVJQT09OKGlvcG9ydCx2YWwpICAgICAgIE9TX091dFBvcnRXb3JkKChVTE9ORylpb3BvcnQsKFVTSE9SVCl2YWwpCisJI2RlZmluZSBXUl9IQVJQMzIoaW9wb3J0LG9mZnNldCxkYXRhKSAgT1NfT3V0UG9ydExvbmcoKChVTE9ORykoaW9wb3J0ICsgb2Zmc2V0KSksIGRhdGEpCisjZW5kaWYgLyogT1MyICovCisKKyNpZiBkZWZpbmVkKFNPTEFSSVNfUkVBTF9NT0RFKQorCisJI2RlZmluZSBSRF9IQVJQT09OKGlvcG9ydCkgICAgICAgICAgT1NfSW5Qb3J0Qnl0ZSgodW5zaWduZWQgbG9uZylpb3BvcnQpCisJI2RlZmluZSBSRFdfSEFSUE9PTihpb3BvcnQpICAgICAgICAgT1NfSW5Qb3J0V29yZCgodW5zaWduZWQgbG9uZylpb3BvcnQpCisJI2RlZmluZSBSRF9IQVJQMzIoaW9wb3J0LG9mZnNldCxkYXRhKSAoZGF0YSA9IE9TX0luUG9ydExvbmcoKFVMT05HKShpb3BvcnQgKyBvZmZzZXQpKSkKKwkjZGVmaW5lIFdSX0hBUlBPT04oaW9wb3J0LHZhbCkgICAgICBPU19PdXRQb3J0Qnl0ZSgoVUxPTkcpaW9wb3J0LChVQ0hBUikgdmFsKQorCSNkZWZpbmUgV1JXX0hBUlBPT04oaW9wb3J0LHZhbCkgICAgICAgT1NfT3V0UG9ydFdvcmQoKFVMT05HKWlvcG9ydCwoVVNIT1JUKXZhbCkKKwkjZGVmaW5lIFdSX0hBUlAzMihpb3BvcnQsb2Zmc2V0LGRhdGEpICBPU19PdXRQb3J0TG9uZygoVUxPTkcpKGlvcG9ydCArIG9mZnNldCksIChVTE9ORylkYXRhKQorCisjZW5kaWYgIC8qIFNPTEFSSVNfUkVBTF9NT0RFICovCisKKyNlbmRpZiAgLyogX19CTFgzMF9IX18gKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICB0YXJnZXQuaCAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBEZWZpbml0aW9ucyBmb3IgVGFyZ2V0IHJlbGF0ZWQgc3RydWN0dXJlcworICoKKyAqICAgJERhdGU6IDE5OTYvMTIvMTEgMjI6MDY6MjAgJAorICoKKyAqICAgJFJldmlzaW9uOiAxLjkgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19UQVJHRVRfXworI2RlZmluZSBfX1RBUkdFVF9fCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworLyojaW5jbHVkZSA8Ymx4MzAuaD4qLworCisKKyNkZWZpbmUgIFRBUl9TWU5DX01BU0sgICAgIChCSVQoNykrQklUKDYpKQorI2RlZmluZSAgU1lOQ19VTktOT1dOICAgICAgMHgwMAorI2RlZmluZSAgU1lOQ19UUllJTkcgICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgIFNZTkNfU1VQUE9SVEVEICAgIChCSVQoNykrQklUKDYpKQorCisjZGVmaW5lICBUQVJfV0lERV9NQVNLICAgICAoQklUKDUpK0JJVCg0KSkKKyNkZWZpbmUgIFdJREVfRElTQUJMRUQgICAgIDB4MDAKKyNkZWZpbmUgIFdJREVfRU5BQkxFRCAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lICBXSURFX05FR09DSUFURUQgICBCSVQoNSkKKworI2RlZmluZSAgVEFSX1RBR19RX01BU0sgICAgKEJJVCgzKStCSVQoMikpCisjZGVmaW5lICBUQUdfUV9VTktOT1dOICAgICAweDAwCisjZGVmaW5lICBUQUdfUV9UUllJTkcgICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSAgVEFHX1FfUkVKRUNUICAgICAgQklUKDMpCisjZGVmaW5lICBUQUdfUV9TVVBQT1JURUQgICAoQklUKDMpK0JJVCgyKSkKKworI2RlZmluZSAgVEFSX0FMTE9XX0RJU0MgICAgQklUKDApCisKKworI2RlZmluZSAgRUVfU1lOQ19NQVNLICAgICAgKEJJVCgwKStCSVQoMSkpCisjZGVmaW5lICBFRV9TWU5DX0FTWU5DICAgICAweDAwCisjZGVmaW5lICBFRV9TWU5DXzVNQiAgICAgICBCSVQoMCkKKyNkZWZpbmUgIEVFX1NZTkNfMTBNQiAgICAgIEJJVCgxKQorI2RlZmluZSAgRUVfU1lOQ18yME1CICAgICAgKEJJVCgwKStCSVQoMSkpCisKKyNkZWZpbmUgIEVFX0FMTE9XX0RJU0MgICAgIEJJVCg2KQorI2RlZmluZSAgRUVfV0lERV9TQ1NJICAgICAgQklUKDcpCisKKworI2lmIGRlZmluZWQoRE9TKQorICAgdHlwZWRlZiBzdHJ1Y3QgU0NDQk1ncl90YXJfaW5mbyBuZWFyICpQU0NDQk1ncl90YXJfaW5mbzsKKworI2VsaWYgZGVmaW5lZChPUzIpCisgICB0eXBlZGVmIHN0cnVjdCBTQ0NCTWdyX3Rhcl9pbmZvIGZhciAqUFNDQ0JNZ3JfdGFyX2luZm87CisKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCBTQ0NCTWdyX3Rhcl9pbmZvICpQU0NDQk1ncl90YXJfaW5mbzsKKworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgU0NDQk1ncl90YXJfaW5mbyB7CisKKyAgIFBTQ0NCICAgIFRhclNlbFFfSGVhZDsKKyAgIFBTQ0NCICAgIFRhclNlbFFfVGFpbDsKKyAgIFVDSEFSICAgIFRhckxVTl9DQTsgICAgICAgIC8qQ29udGluZ2VudCBBbGxnaWFuY2UgKi8KKyAgIFVDSEFSICAgIFRhclRhZ1FfQ250OworICAgVUNIQVIgICAgVGFyU2VsUV9DbnQ7CisgICBVQ0hBUiAgICBUYXJTdGF0dXM7CisgICBVQ0hBUiAgICBUYXJFRVZhbHVlOworICAgVUNIQVIgCVRhclN5bmNDdHJsOworICAgVUNIQVIgCVRhclJlc2VydmVkWzJdOwkJCS8qIGZvciBhbGlnbm1lbnQgKi8gCisgICBVQ0hBUiAJTHVuRGlzY1FfSWR4W01BWF9MVU5dOworICAgVUNIQVIgICAgVGFyTFVOQnVzeVtNQVhfTFVOXTsKK30gU0NDQk1HUl9UQVJfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgTlZSQU1JbmZvIHsKKwlVQ0hBUgkJbmlNb2RlbDsJCQkJCQkJCS8qIE1vZGVsIE5vLiBvZiBjYXJkICovCisJVUNIQVIJCW5pQ2FyZE5vOwkJCQkJCQkvKiBDYXJkIG5vLiAqLworI2lmIGRlZmluZWQoRE9TKQorCVVTSE9SVAluaUJhc2VBZGRyOwkJCQkJCQkvKiBQb3J0IEFkZHJlc3Mgb2YgY2FyZCAqLworI2Vsc2UKKwlVTE9ORwkJbmlCYXNlQWRkcjsJCQkJCQkJLyogUG9ydCBBZGRyZXNzIG9mIGNhcmQgKi8KKyNlbmRpZgorCVVDSEFSCQluaVN5c0NvbmY7CQkJCQkJCS8qIEFkYXB0ZXIgQ29uZmlndXJhdGlvbiBieXRlIC0gQnl0ZSAxNiBvZiBlZXByb20gbWFwICovCisJVUNIQVIJCW5pU2NzaUNvbmY7CQkJCQkJCS8qIFNDU0kgQ29uZmlndXJhdGlvbiBieXRlIC0gQnl0ZSAxNyBvZiBlZXByb20gbWFwICovCisJVUNIQVIJCW5pU2NhbUNvbmY7CQkJCQkJCS8qIFNDQU0gQ29uZmlndXJhdGlvbiBieXRlIC0gQnl0ZSAyMCBvZiBlZXByb20gbWFwICovCisJVUNIQVIJCW5pQWRhcElkOwkJCQkJCQkvKiBIb3N0IEFkYXB0ZXIgSUQgLSBCeXRlIDI0IG9mIGVlcnBvbSBtYXAgKi8KKwlVQ0hBUgkJbmlTeW5jVGJsW01BWF9TQ1NJX1RBUiAvIDJdOwkvKiBTeW5jL1dpZGUgYnl0ZSBvZiB0YXJnZXRzICovCisJVUNIQVIJCW5pU2NhbVRibFtNQVhfU0NTSV9UQVJdWzRdOwkvKiBDb21wcmVzc2VkIFNjYW0gbmFtZSBzdHJpbmcgb2YgVGFyZ2V0cyAqLworfU5WUkFNSU5GTzsKKworI2lmIGRlZmluZWQoRE9TKQordHlwZWRlZiBOVlJBTUlORk8gbmVhciAqUE5WUmFtSW5mbzsKKyNlbGlmIGRlZmluZWQgKE9TMikKK3R5cGVkZWYgTlZSQU1JTkZPIGZhciAqUE5WUmFtSW5mbzsKKyNlbHNlCit0eXBlZGVmIE5WUkFNSU5GTyAqUE5WUmFtSW5mbzsKKyNlbmRpZgorCisjZGVmaW5lCU1PREVMX0xUCQkxCisjZGVmaW5lCU1PREVMX0RMCQkyCisjZGVmaW5lCU1PREVMX0xXCQkzCisjZGVmaW5lCU1PREVMX0RXCQk0CisKKwordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgeworICAgUFNDQ0IgY3VycmVudFNDQ0I7CisjaWYgKEZXX1RZUEU9PV9TQ0NCX01HUl8pCisgICBQU0NDQk1HUl9JTkZPIGNhcmRJbmZvOworI2Vsc2UKKyAgIFBBREFQVEVSX0lORk8gY2FyZEluZm87CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGlvUG9ydDsKKyNlbHNlCisgICBVTE9ORyBpb1BvcnQ7CisjZW5kaWYKKworICAgVVNIT1JUIGNtZENvdW50ZXI7CisgICBVQ0hBUiAgZGlzY1FDb3VudDsKKyAgIFVDSEFSICB0YWdRX0xzdDsgCisgICBVQ0hBUiBjYXJkSW5kZXg7CisgICBVQ0hBUiBzY2FuSW5kZXg7CisgICBVQ0hBUiBnbG9iYWxGbGFnczsKKyAgIFVDSEFSIG91cklkOworICAgUE5WUmFtSW5mbyBwTnZSYW1JbmZvOworICAgUFNDQ0IgZGlzY1FfVGJsW1FVRVVFX0RFUFRIXTsgCisgICAgICAKK31TQ0NCQ0FSRDsKKworI2lmIGRlZmluZWQoRE9TKQordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgbmVhciAqUFNDQ0JjYXJkOworI2VsaWYgZGVmaW5lZCAoT1MyKQordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgZmFyICpQU0NDQmNhcmQ7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgU0NDQmNhcmQgKlBTQ0NCY2FyZDsKKyNlbmRpZgorCisKKyNkZWZpbmUgRl9UQUdfU1RBUlRFRAkJMHgwMQorI2RlZmluZSBGX0NPTkxVTl9JTwkJCTB4MDIKKyNkZWZpbmUgRl9ET19SRU5FR08JCQkweDA0CisjZGVmaW5lIEZfTk9fRklMVEVSCQkJMHgwOAorI2RlZmluZSBGX0dSRUVOX1BDCQkJMHgxMAorI2RlZmluZSBGX0hPU1RfWEZFUl9BQ1QJCTB4MjAKKyNkZWZpbmUgRl9ORVdfU0NDQl9DTUQJCTB4NDAKKyNkZWZpbmUgRl9VUERBVEVfRUVQUk9NCQkweDgwCisKKworI2RlZmluZSAgSURfU1RSSU5HX0xFTkdUSCAgMzIKKyNkZWZpbmUgIFRZUEVfQ09ERTAgICAgICAgIDB4NjMgICAgICAgICAgIC8qTGV2ZWwyIE1zdHIgKGJpdHMgNy02KSwgICovCisKKyNkZWZpbmUgIFRZUEVfQ09ERTEgICAgICAgIDAwICAgICAgICAgICAgIC8qTm8gSUQgeWV0ICovCisKKyNkZWZpbmUgIFNMVl9UWVBFX0NPREUwICAgIDB4QTMgICAgICAgICAgIC8qUHJpb3JpdHkgQml0IHNldCAoYml0cyA3LTYpLCAgKi8KKworI2RlZmluZSAgQVNTSUdOX0lEICAgMHgwMAorI2RlZmluZSAgU0VUX1BfRkxBRyAgMHgwMQorI2RlZmluZSAgQ0ZHX0NNUExUICAgMHgwMworI2RlZmluZSAgRE9NX01TVFIgICAgMHgwRgorI2RlZmluZSAgU1lOQ19QVFJOICAgMHgxRgorCisjZGVmaW5lICBJRF8wXzcgICAgICAweDE4CisjZGVmaW5lICBJRF84X0YgICAgICAweDExCisjZGVmaW5lICBJRF8xMF8xNyAgICAweDEyCisjZGVmaW5lICBJRF8xOF8xRiAgICAweDBCCisjZGVmaW5lICBNSVNDX0NPREUgICAweDE0CisjZGVmaW5lICBDTFJfUF9GTEFHICAweDE4CisjZGVmaW5lICBMT0NBVEVfT04gICAweDEyCisjZGVmaW5lICBMT0NBVEVfT0ZGICAweDBCCisKKyNkZWZpbmUgIExWTF8xX01TVCAgIDB4MDAKKyNkZWZpbmUgIExWTF8yX01TVCAgIDB4NDAKKyNkZWZpbmUgIERPTV9MVkxfMiAgIDB4QzAKKworCisjZGVmaW5lICBJTklUX1NFTFREICAweDAxCisjZGVmaW5lICBMRVZFTDJfVEFSICAweDAyCisKKworZW51bSBzY2FtX2lkX3N0IHsgSUQwLElEMSxJRDIsSUQzLElENCxJRDUsSUQ2LElENyxJRDgsSUQ5LElEMTAsSUQxMSxJRDEyLAorICAgICAgICAgICAgICAgICAgSUQxMyxJRDE0LElEMTUsSURfVU5VU0VELElEX1VOQVNTSUdORUQsSURfQVNTSUdORUQsTEVHQUNZLAorICAgICAgICAgICAgICAgICAgQ0xSX1BSSU9SSVRZLE5PX0lEX0FWQUlMIH07CisKK3R5cGVkZWYgc3RydWN0IFNDQ0JzY2FtX2luZm8geworCisgICBVQ0hBUiAgICBpZF9zdHJpbmdbSURfU1RSSU5HX0xFTkdUSF07CisgICBlbnVtIHNjYW1faWRfc3Qgc3RhdGU7CisgICAgCit9IFNDQ0JTQ0FNX0lORk8sICpQU0NDQlNDQU1fSU5GTzsKKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIHNjc2kyLmggICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIEhBUlBPT04gQVNJQy4KKyAqCisgKiAgICREYXRlOiAxOTk2LzExLzEzIDE4OjMyOjU3ICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS40ICQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fU0NTSV9IX18KKyNkZWZpbmUgX19TQ1NJX0hfXworCisKKworI2RlZmluZSAgU0NTSV9URVNUX1VOSVRfUkVBRFkgICAgMHgwMAorI2RlZmluZSAgU0NTSV9SRVpFUk9fVU5JVCAgICAgICAgMHgwMQorI2RlZmluZSAgU0NTSV9SRVFVRVNUX1NFTlNFICAgICAgMHgwMworI2RlZmluZSAgU0NTSV9GT1JNQVRfVU5JVCAgICAgICAgMHgwNAorI2RlZmluZSAgU0NTSV9SRUFTU0lHTiAgICAgICAgICAgMHgwNworI2RlZmluZSAgU0NTSV9SRUFEICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgU0NTSV9XUklURSAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSAgU0NTSV9TRUVLICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSAgU0NTSV9JTlFVSVJZICAgICAgICAgICAgMHgxMgorI2RlZmluZSAgU0NTSV9NT0RFX1NFTEVDVCAgICAgICAgMHgxNQorI2RlZmluZSAgU0NTSV9SRVNFUlZFX1VOSVQgICAgICAgMHgxNgorI2RlZmluZSAgU0NTSV9SRUxFQVNFX1VOSVQgICAgICAgMHgxNworI2RlZmluZSAgU0NTSV9NT0RFX1NFTlNFICAgICAgICAgMHgxQQorI2RlZmluZSAgU0NTSV9TVEFSVF9TVE9QX1VOSVQgICAgMHgxQgorI2RlZmluZSAgU0NTSV9TRU5EX0RJQUdOT1NUSUMgICAgMHgxRAorI2RlZmluZSAgU0NTSV9SRUFEX0NBUEFDSVRZICAgICAgMHgyNQorI2RlZmluZSAgU0NTSV9SRUFEX0VYVEVOREVEICAgICAgMHgyOAorI2RlZmluZSAgU0NTSV9XUklURV9FWFRFTkRFRCAgICAgMHgyQQorI2RlZmluZSAgU0NTSV9TRUVLX0VYVEVOREVEICAgICAgMHgyQgorI2RlZmluZSAgU0NTSV9XUklURV9BTkRfVkVSSUZZICAgMHgyRQorI2RlZmluZSAgU0NTSV9WRVJJRlkgICAgICAgICAgICAgMHgyRgorI2RlZmluZSAgU0NTSV9SRUFEX0RFRkVDVF9EQVRBICAgMHgzNworI2RlZmluZSAgU0NTSV9XUklURV9CVUZGRVIgICAgICAgMHgzQgorI2RlZmluZSAgU0NTSV9SRUFEX0JVRkZFUiAgICAgICAgMHgzQworI2RlZmluZSAgU0NTSV9SRUNWX0RJQUdOT1NUSUMgICAgMHgxQworI2RlZmluZSAgU0NTSV9SRUFEX0xPTkcgICAgICAgICAgMHgzRQorI2RlZmluZSAgU0NTSV9XUklURV9MT05HICAgICAgICAgMHgzRgorI2RlZmluZSAgU0NTSV9MQVNUX1NDU0lfQ01ORCAgICAgU0NTSV9XUklURV9MT05HCisjZGVmaW5lICBTQ1NJX0lOVkFMSURfQ01ORCAgICAgICAweEZGCisKKworCisjZGVmaW5lICBTU0dPT0QgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lICBTU0NIRUNLICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICBTU0NPTkRfTUVUICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICBTU0JVU1kgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lICBTU1JFU0VSVkFUSU9OX0NPTkZMSUNUICAweDE4CisjZGVmaW5lICBTU0NNRF9URVJNICAgICAgICAgICAgICAweDIyCisjZGVmaW5lICBTU1FfRlVMTCAgICAgICAgICAgICAgICAweDI4CisKKworI2RlZmluZSAgU0tOT19TRU4gICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgU0tSRUNPVl9FUlIgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgU0tOT1RfUkRZICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgU0tNRURfRVJSICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSAgU0tIV19FUlIgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSAgU0tJTExfUkVRICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSAgU0tVTklUX0FUVE4gICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgU0tEQVRBX1BST1RFQ1QgICAgICAgICAgMHgwNworI2RlZmluZSAgU0tCTE5LX0NISyAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSAgU0tDUFlfQUJPUlQgICAgICAgICAgICAgMHgwQQorI2RlZmluZSAgU0tBQk9SVF9DTUQgICAgICAgICAgICAgMHgwQgorI2RlZmluZSAgU0tFUVVBTCAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSAgU0tWT0xfT1ZGICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSAgU0tNSVNfQ01QICAgICAgICAgICAgICAgMHgwRQorCisKKyNkZWZpbmUgIFNNQ01EX0NPTVAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgIFNNRVhUICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgIFNNU0FWRV9EQVRBX1BUUiAgICAgICAgIDB4MDIKKyNkZWZpbmUgIFNNUkVTVF9EQVRBX1BUUiAgICAgICAgIDB4MDMKKyNkZWZpbmUgIFNNRElTQyAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgIFNNSU5JVF9ERVRFQ19FUlIgICAgICAgIDB4MDUKKyNkZWZpbmUgIFNNQUJPUlQgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgIFNNUkVKRUNUICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgIFNNTk9fT1AgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgIFNNUEFSSVRZICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgIFNNREVWX1JFU0VUICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUJU01BQk9SVF9UQUcJCQkJCTB4MEQKKyNkZWZpbmUJU01JTklUX1JFQ09WRVJZCQkJMHgwRgorI2RlZmluZQlTTVJFTF9SRUNPVkVSWQkJCQkweDEwCisKKyNkZWZpbmUgIFNNSURFTlQgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgIERJU0NfUFJJViAgICAgICAgICAgICAgIDB4NDAKKworCisjZGVmaW5lICBTTVNZTkMgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICBTTTEwTUJTICAgICAgICAgICAgICAgICAweDE5ICAgICAvKiAxMDBucyAgICAgICAgICAgKi8KKyNkZWZpbmUgIFNNNU1CUyAgICAgICAgICAgICAgICAgIDB4MzIgICAgIC8qIDIwMG5zICAgICAgICAgICAqLworI2RlZmluZSAgU01PRkZTRVQgICAgICAgICAgICAgICAgMHgwRiAgICAgLyogTWF4b2Zmc2V0IHZhbHVlICovCisjZGVmaW5lICBTTVdEVFIgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lICBTTThCSVQgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lICBTTTE2QklUICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICBTTTMyQklUICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICBTTUlHTk9SV1IgICAgICAgICAgICAgICAweDIzICAgICAvKiBJZ25vcmUgV2lkZSBSZXNpZHVlICovCisKKworI2RlZmluZSAgQVJCSVRSQVRJT05fREVMQVkgICAgICAgMHgwMSAgICAgLyogMi40dXMgdXNpbmcgYSA0ME1oeiBjbG9jayAqLworI2RlZmluZSAgQlVTX1NFVFRMRV9ERUxBWSAgICAgICAgMHgwMSAgICAgLyogNDAwbnMgKi8KKyNkZWZpbmUgIEJVU19DTEVBUl9ERUxBWSAgICAgICAgIDB4MDEgICAgIC8qIDgwMG5zICovCisKKworCisjZGVmaW5lICBTUEhBU0VfVE8gICAgICAgICAgICAgICAweDBBICAvKiAxMCBzZWNvbmQgdGltZW91dCB3YWl0aW5nIGZvciAqLworI2RlZmluZSAgU0NNRF9UTyAgICAgICAgICAgICAgICAgMHgwRiAgLyogT3ZlcmFsbCBjb21tYW5kIHRpbWVvdXQgKi8KKworCisKKyNkZWZpbmUgIFNJWF9CWVRFX0NNRCAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgIFRFTl9CWVRFX0NNRCAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgIFRXRUxWRV9CWVRFX0NNRCAgICAgICAgIDB4MEMKKworI2RlZmluZSAgQVNZTkMgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgUEVSSTI1TlMgICAgICAgICAgICAgICAgMHgwNiAgLyogMjUvNG5zIHRvIG5leHQgY2xvY2sgZm9yIHhib3cuICovCisjZGVmaW5lICBTWU5DMTBNQlMgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lICBTWU5DNU1CUyAgICAgICAgICAgICAgICAweDMyCisjZGVmaW5lICBNQVhfT0ZGU0VUICAgICAgICAgICAgICAweDBGICAvKiBNYXhieXRlb2Zmc2V0IGZvciBTeW5jIFhmZXJzICovCisKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGVlcHJvbS5oICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIERlZmluaXRpb25zIGZvciBFRVBST00gcmVsYXRlZCBzdHJ1Y3R1cmVzCisgKgorICogICAkRGF0ZTogMTk5Ni8xMS8xMyAxODoyODozOSAkCisgKgorICogICAkUmV2aXNpb246IDEuNCAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0VFUFJPTV9fCisjZGVmaW5lIF9fRUVQUk9NX18KKworLyojaW5jbHVkZSA8Z2xvYmFscy5oPiovCisKKyNkZWZpbmUgIEVFUFJPTV9XRF9DTlQgICAgIDI1NgorCisjZGVmaW5lICBFRVBST01fQ0hFQ0tfU1VNICAwCisjZGVmaW5lICBGV19TSUdOQVRVUkUgICAgICAyCisjZGVmaW5lICBNT0RFTF9OVU1CXzAgICAgICA0CisjZGVmaW5lICBNT0RFTF9OVU1CXzEgICAgICA1CisjZGVmaW5lICBNT0RFTF9OVU1CXzIgICAgICA2CisjZGVmaW5lICBNT0RFTF9OVU1CXzMgICAgICA3CisjZGVmaW5lICBNT0RFTF9OVU1CXzQgICAgICA4CisjZGVmaW5lICBNT0RFTF9OVU1CXzUgICAgICA5CisjZGVmaW5lICBJT19CQVNFX0FERFIgICAgICAxMAorI2RlZmluZSAgSVJRX05VTUJFUiAgICAgICAgMTIKKyNkZWZpbmUgIFBDSV9JTlRfUElOICAgICAgIDEzCisjZGVmaW5lICBCVVNfREVMQVkgICAgICAgICAxNCAgICAgICAvKk9uIHRpbWUgaW4gYnl0ZSAxNCBvZmYgZGVsYXkgaW4gMTUgKi8KKyNkZWZpbmUgIFNZU1RFTV9DT05GSUcgICAgIDE2CisjZGVmaW5lICBTQ1NJX0NPTkZJRyAgICAgICAxNworI2RlZmluZSAgQklPU19DT05GSUcgICAgICAgMTgKKyNkZWZpbmUgIFNQSU5fVVBfREVMQVkgICAgIDE5CisjZGVmaW5lICBTQ0FNX0NPTkZJRyAgICAgICAyMAorI2RlZmluZSAgQURBUFRFUl9TQ1NJX0lEICAgMjQKKworCisjZGVmaW5lICBJR05PUkVfQl9TQ0FOICAgICAzMgorI2RlZmluZSAgU0VORF9TVEFSVF9FTkEgICAgMzQKKyNkZWZpbmUgIERFVklDRV9FTkFCTEUgICAgIDM2CisKKyNkZWZpbmUgIFNZTkNfUkFURV9UQkwgICAgIDM4CisjZGVmaW5lICBTWU5DX1JBVEVfVEJMMDEgICAzOAorI2RlZmluZSAgU1lOQ19SQVRFX1RCTDIzICAgNDAKKyNkZWZpbmUgIFNZTkNfUkFURV9UQkw0NSAgIDQyCisjZGVmaW5lICBTWU5DX1JBVEVfVEJMNjcgICA0NAorI2RlZmluZSAgU1lOQ19SQVRFX1RCTDg5ICAgNDYKKyNkZWZpbmUgIFNZTkNfUkFURV9UQkxhYiAgIDQ4CisjZGVmaW5lICBTWU5DX1JBVEVfVEJMY2QgICA1MAorI2RlZmluZSAgU1lOQ19SQVRFX1RCTGVmICAgNTIKKworCisKKyNkZWZpbmUgIEVFX1NDQU1CQVNFICAgICAgMjU2IAorCisKKworICAgI2RlZmluZSAgRE9NX01BU1RFUiAgICAgKEJJVCgwKSArIEJJVCgxKSkKKyAgICNkZWZpbmUgIFNDQU1fRU5BQkxFRCAgIEJJVCgyKQorICAgI2RlZmluZSAgU0NBTV9MRVZFTDIgICAgQklUKDMpCisKKworCSNkZWZpbmUJUkVORUdPX0VOQQkJQklUVygxMCkKKwkjZGVmaW5lCUNPTk5JT19FTkEJCUJJVFcoMTEpCisgICAjZGVmaW5lICBHUkVFTl9QQ19FTkEgICBCSVRXKDEyKQorCisKKyAgICNkZWZpbmUgIEFVVE9fUkFURV8wMCAgIDAwCisgICAjZGVmaW5lICBBVVRPX1JBVEVfMDUgICAwMQorICAgI2RlZmluZSAgQVVUT19SQVRFXzEwICAgMDIKKyAgICNkZWZpbmUgIEFVVE9fUkFURV8yMCAgIDAzCisKKyAgICNkZWZpbmUgIFdJREVfTkVHT19CSVQgICAgIEJJVCg3KQorICAgI2RlZmluZSAgRElTQ19FTkFCTEVfQklUICAgQklUKDYpCisKKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGhhcnBvb24uaCAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgSEFSUE9PTiBBU0lDLgorICoKKyAqICAgJERhdGU6IDE5OTcvMDcvMDkgMjE6NDQ6MzYgJAorICoKKyAqICAgJFJldmlzaW9uOiAxLjkgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyojaW5jbHVkZSA8Z2xvYmFscy5oPiovCisKKyNpZm5kZWYgX19IQVJQT09OX18KKyNkZWZpbmUgX19IQVJQT09OX18KKworCisgICAjZGVmaW5lICBocF92ZW5kb3JfaWRfMCAgICAgICAweDAwCQkvKiBMU0IgKi8KKyAgICAgICNkZWZpbmUgIE9SSU9OX1ZFTkRfMCAgIDB4NEIKKyAKKyAgICNkZWZpbmUgIGhwX3ZlbmRvcl9pZF8xICAgICAgIDB4MDEJCS8qIE1TQiAqLworICAgICAgI2RlZmluZSAgT1JJT05fVkVORF8xICAgMHgxMAorCisgICAjZGVmaW5lICBocF9kZXZpY2VfaWRfMCAgICAgICAweDAyCQkvKiBMU0IgKi8KKyAgICAgICNkZWZpbmUgIE9SSU9OX0RFVl8wICAgIDB4MzAgCisKKyAgICNkZWZpbmUgIGhwX2RldmljZV9pZF8xICAgICAgIDB4MDMJCS8qIE1TQiAqLworICAgICAgI2RlZmluZSAgT1JJT05fREVWXzEgICAgMHg4MSAKKworCS8qIFN1YiBWZW5kb3IgSUQgYW5kIFN1YiBEZXZpY2UgSUQgb25seSBhdmFpbGFibGUgaW4KKwkJSGFycG9vbiBWZXJzaW9uIDIgYW5kIGhpZ2hlciAqLworCisgICAjZGVmaW5lICBocF9zdWJfdmVuZG9yX2lkXzAgICAweDA0CQkvKiBMU0IgKi8KKyAgICNkZWZpbmUgIGhwX3N1Yl92ZW5kb3JfaWRfMSAgIDB4MDUJCS8qIE1TQiAqLworICAgI2RlZmluZSAgaHBfc3ViX2RldmljZV9pZF8wICAgMHgwNgkJLyogTFNCICovCisgICAjZGVmaW5lICBocF9zdWJfZGV2aWNlX2lkXzEgICAweDA3CQkvKiBNU0IgKi8KKworCisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfbG8gICAgICAweDA4CisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfbG1pICAgICAweDA5CisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfaG1pICAgICAweDBBCisgICAjZGVmaW5lICBocF9kdWFsX2FkZHJfaGkgICAgICAweDBCCisKKyAgICNkZWZpbmUgIGhwX3NlbWFwaG9yZSAgICAgICAgIDB4MEMKKyAgICAgICNkZWZpbmUgU0NDQl9NR1JfQUNUSVZFICAgIEJJVCgwKQorICAgICAgI2RlZmluZSBUSUNLTEVfTUUgICAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lIFNDQ0JfTUdSX1BSRVNFTlQgICBCSVQoMykKKyAgICAgICNkZWZpbmUgQklPU19JTl9VU0UgICAgICAgIEJJVCg0KQorCisgICAjZGVmaW5lICBocF91c2VyX2RlZmluZWRfRCAgICAweDBECisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkX0UgICAgICAgIDB4MEUKKworICAgI2RlZmluZSAgaHBfc3lzX2N0cmwgICAgICAgICAgMHgwRgorCisgICAgICAjZGVmaW5lICBTVE9QX0NMSyAgICAgICAgICBCSVQoMCkgICAgICAvKlR1cm4gb2ZmIEJ1c01hc3RlciBDbG9jayAqLworICAgICAgI2RlZmluZSAgRFJWUl9SU1QgICAgICAgICAgQklUKDEpICAgICAgLypGaXJtd2FyZSBSZXNldCB0byA4MEMxNSBjaGlwICovCisgICAgICAjZGVmaW5lICBIQUxUX01BQ0ggICAgICAgICBCSVQoMykgICAgICAvKkhhbHQgU3RhdGUgTWFjaGluZSAgICAgICovCisgICAgICAjZGVmaW5lICBIQVJEX0FCT1JUICAgICAgICBCSVQoNCkgICAgICAvKkhhcmQgQWJvcnQgICAgICAgICAgICAgICovCisgICAgICAjZGVmaW5lICBESUFHX01PREUgICAgICAgICBCSVQoNSkgICAgICAvKkRpYWdub3N0aWMgTW9kZSAgICAgICAgICovCisKKyAgICAgICNkZWZpbmUgIEJNX0FCT1JUX1RNT1VUICAgIDB4NTAgICAgICAgIC8qSGFsdCBTdGF0ZSBtYWNoaW5lIHRpbWUgb3V0ICovCisKKyAgICNkZWZpbmUgIGhwX3N5c19jZmcgICAgICAgICAgIDB4MTAKKworICAgICAgI2RlZmluZSAgRE9OVF9SU1RfRklGTyAgICAgQklUKDcpICAgICAgLypEb24ndCByZXNldCBGSUZPICAgICAgKi8KKworCisgICAjZGVmaW5lICBocF9ob3N0X2N0cmwwICAgICAgICAweDExCisKKyAgICAgICNkZWZpbmUgIERVQUxfQUREUl9NT0RFICAgIEJJVCgwKSAgIC8qRW5hYmxlIDY0LWJpdCBhZGRyZXNzZXMgKi8KKyAgICAgICNkZWZpbmUgIElPX01FTV9TUEFDRSAgICAgIEJJVCgxKSAgIC8qSS9PIE1lbW9yeSBTcGFjZSAgICAqLworICAgICAgI2RlZmluZSAgUkVTT1VSQ0VfTE9DSyAgICAgQklUKDIpICAgLypFbmFibGUgUmVzb3VyY2UgTG9jayAqLworICAgICAgI2RlZmluZSAgSUdOT1JfQUNDRVNTX0VSUiAgQklUKDMpICAgLypJZ25vcmUgQWNjZXNzIEVycm9yICovCisgICAgICAjZGVmaW5lICBIT1NUX0lOVF9FREdFICAgICBCSVQoNCkgICAvKkhvc3QgaW50ZXJydXB0IGxldmVsL2VkZ2UgbW9kZSBzZWwgKi8KKyAgICAgICNkZWZpbmUgIFNJWF9DTE9DS1MgICAgICAgIEJJVCg1KSAgIC8qNiBDbG9ja3MgYmV0d2VlbiBTdHJvYmUgICAqLworICAgICAgI2RlZmluZSAgRE1BX0VWRU5fUEFSSVRZICAgQklUKDYpICAgLypFbmFibGUgRE1BIEVuZW4gUGFyaXR5ICovCisKKy8qCisgICAgICAjZGVmaW5lICBCVVJTVF9NT0RFICAgICAgICBCSVQoMCkKKyovCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzEyICAgICAgIDB4MTIKKworICAgI2RlZmluZSAgaHBfaG9zdF9ibGtfY250ICAgICAgMHgxMworCisgICAgICAjZGVmaW5lICBYRkVSX0JMSzEgICAgICAgICAweDAwICAgICAvKiAgICAgMCAwIDAgIDEgYnl0ZSBwZXIgYmxvY2sqLworICAgICAgI2RlZmluZSAgWEZFUl9CTEsyICAgICAgICAgMHgwMSAgICAgLyogICAgIDAgMCAxICAyIGJ5dGUgcGVyIGJsb2NrKi8KKyAgICAgICNkZWZpbmUgIFhGRVJfQkxLNCAgICAgICAgIDB4MDIgICAgIC8qICAgICAwIDEgMCAgNCBieXRlIHBlciBibG9jayovCisgICAgICAjZGVmaW5lICBYRkVSX0JMSzggICAgICAgICAweDAzICAgICAvKiAgICAgMCAxIDEgIDggYnl0ZSBwZXIgYmxvY2sqLworICAgICAgI2RlZmluZSAgWEZFUl9CTEsxNiAgICAgICAgMHgwNCAgICAgLyogICAgIDEgMCAwIDE2IGJ5dGUgcGVyIGJsb2NrKi8KKyAgICAgICNkZWZpbmUgIFhGRVJfQkxLMzIgICAgICAgIDB4MDUgICAgIC8qICAgICAxIDAgMSAzMiBieXRlIHBlciBibG9jayovCisgICAgICAjZGVmaW5lICBYRkVSX0JMSzY0ICAgICAgICAweDA2ICAgICAvKiAgICAgMSAxIDAgNjQgYnl0ZSBwZXIgYmxvY2sqLworICAgCisgICAgICAjZGVmaW5lICBCTV9USFJFU0hPTEQgICAgICAweDQwICAgICAvKiBQQ0kgbW9kZSBjYW4gb25seSB4ZmVyIDE2IGJ5dGVzKi8KKworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8xNCAgICAgICAweDE0CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8xNSAgICAgICAweDE1CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8xNiAgICAgICAweDE2CisKKyAgICNkZWZpbmUgIGhwX2ludF9tYXNrICAgICAgICAgIDB4MTcKKworICAgICAgI2RlZmluZSAgSU5UX0NNRF9DT01QTCAgICAgQklUKDApICAgLyogRE1BIGNvbW1hbmQgY29tcGxldGUgICAqLworICAgICAgI2RlZmluZSAgSU5UX0VYVF9TVEFUVVMgICAgQklUKDEpICAgLyogRXh0ZW5kZWQgU3RhdHVzIFNldCAgICAqLworICAgICAgI2RlZmluZSAgSU5UX1NDU0kgICAgICAgICAgQklUKDIpICAgLyogU2NzaSBibG9jayBpbnRlcnJ1cHQgICAqLworICAgICAgI2RlZmluZSAgSU5UX0ZJRk9fUkRZICAgICAgQklUKDQpICAgLyogRklGTyBkYXRhIHJlYWR5ICAgICAgICAqLworCisKKyAgICNkZWZpbmUgIGhwX3hmZXJfY250X2xvICAgICAgIDB4MTgKKyAgICNkZWZpbmUgIGhwX3hmZXJfY250X21pICAgICAgIDB4MTkKKyAgICNkZWZpbmUgIGhwX3hmZXJfY250X2hpICAgICAgIDB4MUEKKyAgICNkZWZpbmUgIGhwX3hmZXJfY21kICAgICAgICAgIDB4MUIKKworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUX0RNQSAgICAgMHgwMCAgICAgLyogICAgIDAgMCAwIFRyYW5zZmVyIEhvc3QgLT4gRE1BICovCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV9IT1NUICAgICAweDAxICAgICAvKiAgICAgMCAwIDEgVHJhbnNmZXIgRE1BICAtPiBIb3N0ICovCisgICAgICAjZGVmaW5lICBYRkVSX0hPU1RfTVBVICAgICAweDAyICAgICAvKiAgICAgMCAxIDAgVHJhbnNmZXIgSG9zdCAtPiBNUFUgICovCisgICAgICAjZGVmaW5lICBYRkVSX01QVV9IT1NUICAgICAweDAzICAgICAvKiAgICAgMCAxIDEgVHJhbnNmZXIgTVBVICAtPiBIb3N0ICovCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV9NUFUgICAgICAweDA0ICAgICAvKiAgICAgMSAwIDAgVHJhbnNmZXIgRE1BICAtPiBNUFUgICovCisgICAgICAjZGVmaW5lICBYRkVSX01QVV9ETUEgICAgICAweDA1ICAgICAvKiAgICAgMSAwIDEgVHJhbnNmZXIgTVBVICAtPiBETUEgICovCisgICAgICAjZGVmaW5lICBTRVRfU0VNQVBIT1JFICAgICAweDA2ICAgICAvKiAgICAgMSAxIDAgU2V0IFNlbWFwaG9yZSAgICAgICAgICovCisgICAgICAjZGVmaW5lICBYRkVSX05PUCAgICAgICAgICAweDA3ICAgICAvKiAgICAgMSAxIDEgVHJhbnNmZXIgTk9QICAgICAgICAgICovCisgICAgICAjZGVmaW5lICBYRkVSX01CX01QVSAgICAgICAweDA2ICAgICAvKiAgICAgMSAxIDAgVHJhbnNmZXIgTUIgLT4gTVBVICovCisgICAgICAjZGVmaW5lICBYRkVSX01CX0RNQSAgICAgICAweDA3ICAgICAvKiAgICAgMSAxIDEgVHJhbnNmZXIgTUIgLT4gRE1BICovCisKKworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUX0FVVE8gICAgMHgwMCAgICAgLyogICAgIDAgMCBBdXRvIFRyYW5zZmVyIFNpemUgICAqLworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUXzhCSVQgICAgMHgwOCAgICAgLyogICAgIDAgMSA4IEJJVCBUcmFuc2ZlciBTaXplICAqLworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUXzE2QklUICAgMHgxMCAgICAgLyogICAgIDEgMCAxNiBCSVQgVHJhbnNmZXIgU2l6ZSAqLworICAgICAgI2RlZmluZSAgWEZFUl9IT1NUXzMyQklUICAgMHgxOCAgICAgLyogICAgIDEgMSAzMiBCSVQgVHJhbnNmZXIgU2l6ZSAqLworCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV84QklUICAgICAweDIwICAgICAvKiAgICAgMCAxIDggQklUICBUcmFuc2ZlciBTaXplICovCisgICAgICAjZGVmaW5lICBYRkVSX0RNQV8xNkJJVCAgICAweDQwICAgICAvKiAgICAgMSAwIDE2IEJJVCBUcmFuc2ZlciBTaXplICovCisKKyAgICAgICNkZWZpbmUgIERJU0FCTEVfSU5UICAgICAgIEJJVCg3KSAgIC8qRG8gbm90IGludGVycnVwdCBhdCBlbmQgb2YgY21kLiAqLworCisgICAgICAjZGVmaW5lICBIT1NUX1dSVF9DTUQgICAgICAoKERJU0FCTEVfSU5UICsgWEZFUl9IT1NUX0RNQSArIFhGRVJfSE9TVF9BVVRPICsgWEZFUl9ETUFfOEJJVCkpCisgICAgICAjZGVmaW5lICBIT1NUX1JEX0NNRCAgICAgICAoKERJU0FCTEVfSU5UICsgWEZFUl9ETUFfSE9TVCArIFhGRVJfSE9TVF9BVVRPICsgWEZFUl9ETUFfOEJJVCkpCisgICAgICAjZGVmaW5lICBXSURFX0hPU1RfV1JUX0NNRCAoKERJU0FCTEVfSU5UICsgWEZFUl9IT1NUX0RNQSArIFhGRVJfSE9TVF9BVVRPICsgWEZFUl9ETUFfMTZCSVQpKQorICAgICAgI2RlZmluZSAgV0lERV9IT1NUX1JEX0NNRCAgKChESVNBQkxFX0lOVCArIFhGRVJfRE1BX0hPU1QgKyBYRkVSX0hPU1RfQVVUTyArIFhGRVJfRE1BXzE2QklUKSkKKworICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2xvICAgICAgMHgxQworICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2xtaSAgICAgMHgxRAorICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2htaSAgICAgMHgxRQorICAgI2RlZmluZSAgaHBfaG9zdF9hZGRyX2hpICAgICAgMHgxRgorCisgICAjZGVmaW5lICBocF9waW9fZGF0YSAgICAgICAgICAweDIwCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8yMSAgICAgICAweDIxCisgICAjZGVmaW5lICBocF9lZV9jdHJsICAgICAgICAgICAweDIyCisKKyAgICAgICNkZWZpbmUgIEVYVF9BUkJfQUNLICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgU0NTSV9URVJNX0VOQV9IICAgQklUKDYpICAgLyogU0NTSSBoaWdoIGJ5dGUgdGVybWluYXRvciAqLworICAgICAgI2RlZmluZSAgU0VFX01TICAgICAgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBTRUVfQ1MgICAgICAgICAgICBCSVQoMykKKyAgICAgICNkZWZpbmUgIFNFRV9DTEsgICAgICAgICAgIEJJVCgyKQorICAgICAgI2RlZmluZSAgU0VFX0RPICAgICAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lICBTRUVfREkgICAgICAgICAgICBCSVQoMCkKKworICAgICAgI2RlZmluZSAgRUVfUkVBRCAgICAgICAgICAgMHgwNgorICAgICAgI2RlZmluZSAgRUVfV1JJVEUgICAgICAgICAgMHgwNQorICAgICAgI2RlZmluZSAgRVdFTiAgICAgICAgICAgICAgMHgwNAorICAgICAgI2RlZmluZSAgRVdFTl9BRERSICAgICAgICAgMHgwM0MwCisgICAgICAjZGVmaW5lICBFV0RTICAgICAgICAgICAgICAweDA0CisgICAgICAjZGVmaW5lICBFV0RTX0FERFIgICAgICAgICAweDAwMDAKKworICAgI2RlZmluZSAgaHBfYnJkY3RsICAgICAgICAgICAgMHgyMworCisgICAgICAjZGVmaW5lICBEQVRfNyAgICAgICAgICAgICBCSVQoNykKKyAgICAgICNkZWZpbmUgIERBVF82ICAgICAgICAgICAgIEJJVCg2KQorICAgICAgI2RlZmluZSAgREFUXzUgICAgICAgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBCUkRfU1RCICAgICAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIEJSRF9DUyAgICAgICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgQlJEX1dSICAgICAgICAgICAgQklUKDIpCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzI0ICAgICAgIDB4MjQKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzI1ICAgICAgIDB4MjUKKworCisKKworICAgI2RlZmluZSAgaHBfYm1fY3RybCAgICAgICAgICAgMHgyNgorCisgICAgICAjZGVmaW5lICBTQ1NJX1RFUk1fRU5BX0wgICBCSVQoMCkgICAvKkVuYWJsZS9EaXNhYmxlIGV4dGVybmFsIHRlcm1pbmF0b3JzICovCisgICAgICAjZGVmaW5lICBGTFVTSF9YRkVSX0NOVFIgICBCSVQoMSkgICAvKkZsdXNoIHRyYW5zZmVyIGNvdW50ZXIgKi8KKyAgICAgICNkZWZpbmUgIEJNX1hGRVJfTUlOXzggICAgIEJJVCgyKSAgIC8qRW5hYmxlIGJ1cyBtYXN0ZXIgdHJhbnNmZXIgb2YgOSAqLworICAgICAgI2RlZmluZSAgQklPU19FTkEgICAgICAgICAgQklUKDMpICAgLypFbmFibGUgQklPUy9GTEFTSCBFbmFibGUgKi8KKyAgICAgICNkZWZpbmUgIEZPUkNFMV9YRkVSICAgICAgIEJJVCg1KSAgIC8qQWx3YXlzIHhmZXIgb25lIGJ5dGUgaW4gYnl0ZSBtb2RlICovCisgICAgICAjZGVmaW5lICBGQVNUX1NJTkdMRSAgICAgICBCSVQoNikgICAvKj8/ICovCisKKyAgICAgICNkZWZpbmUgIEJNQ1RSTF9ERUZBVUxUICAgIChGT1JDRTFfWEZFUnxGQVNUX1NJTkdMRXxTQ1NJX1RFUk1fRU5BX0wpCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzI3ICAgICAgIDB4MjcKKworICAgI2RlZmluZSAgaHBfc2dfYWRkciAgICAgICAgICAgMHgyOAorICAgI2RlZmluZSAgaHBfcGFnZV9jdHJsICAgICAgICAgMHgyOQorCisgICAgICAjZGVmaW5lICBTQ0FUVEVSX0VOICAgICAgICBCSVQoMCkgICAKKyAgICAgICNkZWZpbmUgIFNHUkFNX0FSQU0gICAgICAgIEJJVCgxKSAgIAorICAgICAgI2RlZmluZSAgQklPU19TSEFET1cgICAgICAgQklUKDIpICAgCisgICAgICAjZGVmaW5lICBHX0lOVF9ESVNBQkxFICAgICBCSVQoMykgICAvKiBFbmFibGUvRGlzYWJsZSBhbGwgSW50ZXJydXB0cyAqLworICAgICAgI2RlZmluZSAgTkFSUk9XX1NDU0lfQ0FSRCAgQklUKDQpICAgLyogTkFSUk9XL1dJREUgU0NTSSBjb25maWcgcGluICovCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzJBICAgICAgIDB4MkEKKyAgICNkZWZpbmUgIGhwX3BjaV9jbWRfY2ZnICAgICAgIDB4MkIKKworICAgICAgI2RlZmluZSAgSU9fU1BBQ0VfRU5BICAgICAgQklUKDApICAgLyplbmFibGUgSS9PIHNwYWNlICovCisgICAgICAjZGVmaW5lICBNRU1fU1BBQ0VfRU5BICAgICBCSVQoMSkgICAvKmVuYWJsZSBtZW1vcnkgc3BhY2UgKi8KKyAgICAgICNkZWZpbmUgIEJVU19NU1RSX0VOQSAgICAgIEJJVCgyKSAgIC8qZW5hYmxlIGJ1cyBtYXN0ZXIgb3BlcmF0aW9uICovCisgICAgICAjZGVmaW5lICBNRU1fV0lfRU5BICAgICAgICBCSVQoNCkgICAvKmVuYWJsZSBXcml0ZSBhbmQgSW52YWxpZGF0ZSAqLworICAgICAgI2RlZmluZSAgUEFSX0VSUl9SRVNQICAgICAgQklUKDYpICAgLyplbmFibGUgcGFyaXR5IGVycm9yIHJlc3BvbmNlLiAqLworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8yQyAgICAgICAweDJDCisKKyAgICNkZWZpbmUgIGhwX3BjaV9zdGF0X2NmZyAgICAgIDB4MkQKKworICAgICAgI2RlZmluZSAgREFUQV9QQVJJVFlfRVJSICAgQklUKDApICAgCisgICAgICAjZGVmaW5lICBSRUNfVEFSR0VUX0FCT1JUICBCSVQoNCkgICAvKnJlY2VpdmVkIFRhcmdldCBhYm9ydCAqLworICAgICAgI2RlZmluZSAgUkVDX01BU1RFUl9BQk9SVCAgQklUKDUpICAgLypyZWNlaXZlZCBNYXN0ZXIgYWJvcnQgKi8KKyAgICAgICNkZWZpbmUgIFNJR19TWVNURU1fRVJSICAgIEJJVCg2KSAgIAorICAgICAgI2RlZmluZSAgREVURUNURURfUEFSX0VSUiAgQklUKDcpICAgCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzJFICAgICAgIDB4MkUKKworICAgI2RlZmluZSAgaHBfc3lzX3N0YXR1cyAgICAgICAgMHgyRgorCisgICAgICAjZGVmaW5lICBTTFZfREFUQV9SRFkgICAgICBCSVQoMCkgICAvKlNsYXZlIGRhdGEgcmVhZHkgKi8KKyAgICAgICNkZWZpbmUgIFhGRVJfQ05UX1pFUk8gICAgIEJJVCgxKSAgIC8qVHJhbnNmZXIgY291bnRlciA9IDAgKi8KKyAgICAgICNkZWZpbmUgIEJNX0ZJRk9fRU1QVFkgICAgIEJJVCgyKSAgIC8qRklGTyBlbXB0eSAqLworICAgICAgI2RlZmluZSAgQk1fRklGT19GVUxMICAgICAgQklUKDMpICAgLypGSUZPIGZ1bGwgKi8KKyAgICAgICNkZWZpbmUgIEhPU1RfT1BfRE9ORSAgICAgIEJJVCg0KSAgIC8qaG9zdCBvcGVyYXRpb24gZG9uZSAqLworICAgICAgI2RlZmluZSAgRE1BX09QX0RPTkUgICAgICAgQklUKDUpICAgLypETUEgb3BlcmF0aW9uIGRvbmUgKi8KKyAgICAgICNkZWZpbmUgIFNMVl9PUF9ET05FICAgICAgIEJJVCg2KSAgIC8qU2xhdmUgb3BlcmF0aW9uIGRvbmUgKi8KKyAgICAgICNkZWZpbmUgIFBXUl9PTl9GTEFHICAgICAgIEJJVCg3KSAgIC8qUG93ZXIgb24gZmxhZyAqLworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8zMCAgICAgICAweDMwCisKKyAgICNkZWZpbmUgIGhwX2hvc3Rfc3RhdHVzMCAgICAgIDB4MzEKKworICAgICAgI2RlZmluZSAgSE9TVF9URVJNICAgICAgICAgQklUKDUpICAgLypIb3N0IFRlcm1pbmFsIENvdW50ICovCisgICAgICAjZGVmaW5lICBIT1NUX1RSU0hMRCAgICAgICBCSVQoNikgICAvKkhvc3QgVGhyZXNob2xkICAgICAgKi8KKyAgICAgICNkZWZpbmUgIENPTk5FQ1RFRF8yX0hPU1QgIEJJVCg3KSAgIC8qQ29ubmVjdGVkIHRvIEhvc3QgICAqLworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF8zMiAgICAgICAweDMyCisKKyAgICNkZWZpbmUgIGhwX3Jldl9udW0gICAgICAgICAgIDB4MzMKKworICAgICAgI2RlZmluZSAgUkVWX0FfQ09OU1QgICAgICAgMHgwRQorICAgICAgI2RlZmluZSAgUkVWX0JfQ09OU1QgICAgICAgMHgwRQorCisgICAjZGVmaW5lICBocF9zdGFja19kYXRhICAgICAgICAweDM0CisgICAjZGVmaW5lICBocF9zdGFja19hZGRyICAgICAgICAweDM1CisKKyAgICNkZWZpbmUgIGhwX2V4dF9zdGF0dXMgICAgICAgIDB4MzYKKworICAgICAgI2RlZmluZSAgQk1fRk9SQ0VfT0ZGICAgICAgQklUKDApICAgLypCdXMgTWFzdGVyIGlzIGZvcmNlZCB0byBnZXQgb2ZmICovCisgICAgICAjZGVmaW5lICBQQ0lfVEdUX0FCT1JUICAgICBCSVQoMCkgICAvKlBDSSBidXMgbWFzdGVyIHRyYW5zYWN0aW9uIGFib3J0ZWQgKi8KKyAgICAgICNkZWZpbmUgIFBDSV9ERVZfVE1PVVQgICAgIEJJVCgxKSAgIC8qUENJIERldmljZSBUaW1lIG91dCAqLworICAgICAgI2RlZmluZSAgRklGT19UQ19OT1RfWkVSTyAgQklUKDIpICAgLypGSUZPIG9yIHRyYW5zZmVyIGNvdW50ZXIgbm90IHplcm8gKi8KKyAgICAgICNkZWZpbmUgIENISVBfUlNUX09DQ1VSICAgIEJJVCgzKSAgIC8qQ2hpcCByZXNldCBvY2N1cnMgKi8KKyAgICAgICNkZWZpbmUgIENNRF9BQk9SVEVEICAgICAgIEJJVCg0KSAgIC8qQ29tbWFuZCBhYm9ydGVkICovCisgICAgICAjZGVmaW5lICBCTV9QQVJJVFlfRVJSICAgICBCSVQoNSkgICAvKnBhcml0eSBlcnJvciBvbiBkYXRhIHJlY2VpdmVkICAgKi8KKyAgICAgICNkZWZpbmUgIFBJT19PVkVSUlVOICAgICAgIEJJVCg2KSAgIC8qU2xhdmUgZGF0YSBvdmVycnVuICovCisgICAgICAjZGVmaW5lICBCTV9DTURfQlVTWSAgICAgICBCSVQoNykgICAvKkJ1cyBtYXN0ZXIgdHJhbnNmZXIgY29tbWFuZCBidXN5ICovCisgICAgICAjZGVmaW5lICBCQURfRVhUX1NUQVRVUyAgICAoQk1fRk9SQ0VfT0ZGIHwgUENJX0RFVl9UTU9VVCB8IENNRF9BQk9SVEVEIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJNX1BBUklUWV9FUlIgfCBQSU9fT1ZFUlJVTikKKworICAgI2RlZmluZSAgaHBfaW50X3N0YXR1cyAgICAgICAgMHgzNworICAgICAgCisgICAgICAjZGVmaW5lICBCTV9DTURfQ01QTCAgICAgICBCSVQoMCkgICAvKkJ1cyBNYXN0ZXIgY29tbWFuZCBjb21wbGV0ZSAqLworICAgICAgI2RlZmluZSAgRVhUX1NUQVRVU19PTiAgICAgQklUKDEpICAgLypFeHRlbmRlZCBzdGF0dXMgaXMgdmFsaWQgKi8KKyAgICAgICNkZWZpbmUgIFNDU0lfSU5URVJSVVBUICAgIEJJVCgyKSAgIC8qR2xvYmFsIGluZGljYXRpb24gb2YgYSBTQ1NJIGludC4gKi8KKyAgICAgICNkZWZpbmUgIEJNX0ZJRk9fUkRZICAgICAgIEJJVCg0KSAgIAorICAgICAgI2RlZmluZSAgSU5UX0FTU0VSVEVEICAgICAgQklUKDUpICAgLyogKi8KKyAgICAgICNkZWZpbmUgIFNSQU1fQlVTWSAgICAgICAgIEJJVCg2KSAgIC8qU2NhdHRlci9HYXRoZXIgUkFNIGJ1c3kgKi8KKyAgICAgICNkZWZpbmUgIENNRF9SRUdfQlVTWSAgICAgIEJJVCg3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgICNkZWZpbmUgIGhwX2ZpZm9fY250ICAgICAgICAgIDB4MzgKKyAgICNkZWZpbmUgIGhwX2N1cnJfaG9zdF9jbnQgICAgIDB4MzkKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzNBICAgICAgIDB4M0EKKyAgICNkZWZpbmUgIGhwX2ZpZm9faW5fYWRkciAgICAgIDB4M0IKKworICAgI2RlZmluZSAgaHBfZmlmb19vdXRfYWRkciAgICAgMHgzQworICAgI2RlZmluZSAgaHBfcmVzZXJ2ZWRfM0QgICAgICAgMHgzRAorICAgI2RlZmluZSAgaHBfcmVzZXJ2ZWRfM0UgICAgICAgMHgzRQorICAgI2RlZmluZSAgaHBfcmVzZXJ2ZWRfM0YgICAgICAgMHgzRgorCisKKworICAgZXh0ZXJuIFVTSE9SVCBkZWZhdWx0X2ludGVuYTsKKworICAgI2RlZmluZSAgaHBfaW50ZW5hCQkgMHg0MAorCisgICAgICAjZGVmaW5lICBSRVNFVAkJIEJJVFcoNykKKyAgICAgICNkZWZpbmUgIFBST0dfSExUCQkgQklUVyg2KSAgCisgICAgICAjZGVmaW5lICBQQVJJVFkJCSBCSVRXKDUpCisgICAgICAjZGVmaW5lICBGSUZPCQkgQklUVyg0KQorICAgICAgI2RlZmluZSAgU0VMCQkgQklUVygzKQorICAgICAgI2RlZmluZSAgU0NBTV9TRUwJCSBCSVRXKDIpIAorICAgICAgI2RlZmluZSAgUlNFTAkJIEJJVFcoMSkKKyAgICAgICNkZWZpbmUgIFRJTUVPVVQJCSBCSVRXKDApCisgICAgICAjZGVmaW5lICBCVVNfRlJFRQkJIEJJVFcoMTUpCisgICAgICAjZGVmaW5lICBYRkVSX0NOVF8wCSBCSVRXKDE0KQorICAgICAgI2RlZmluZSAgUEhBU0UJCSBCSVRXKDEzKQorICAgICAgI2RlZmluZSAgSVVOS1dOCQkgQklUVygxMikKKyAgICAgICNkZWZpbmUgIElDTURfQ09NUAkgQklUVygxMSkKKyAgICAgICNkZWZpbmUgIElUSUNLTEUJCSBCSVRXKDEwKQorICAgICAgI2RlZmluZSAgSURPX1NUUlQJCSBCSVRXKDkpCisgICAgICAjZGVmaW5lICBJVEFSX0RJU0MJIEJJVFcoOCkKKyAgICAgICNkZWZpbmUgIEFVVE9fSU5UCQkgKEJJVFcoMTIpK0JJVFcoMTEpK0JJVFcoMTApK0JJVFcoOSkrQklUVyg4KSkKKyAgICAgICNkZWZpbmUgIENMUl9BTExfSU5UCSAweEZGRkYKKyAgICAgICNkZWZpbmUgIENMUl9BTExfSU5UXzEJIDB4RkYwMAorCisgICAjZGVmaW5lICBocF9pbnRzdGF0CQkgMHg0MgorCisgICAjZGVmaW5lICBocF9zY3Npc2lnICAgICAgICAgICAweDQ0CisKKyAgICAgICNkZWZpbmUgIFNDU0lfU0VMICAgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgU0NTSV9CU1kgICAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBTQ1NJX1JFUSAgICAgICAgICBCSVQoNSkKKyAgICAgICNkZWZpbmUgIFNDU0lfQUNLICAgICAgICAgIEJJVCg0KQorICAgICAgI2RlZmluZSAgU0NTSV9BVE4gICAgICAgICAgQklUKDMpCisgICAgICAjZGVmaW5lICBTQ1NJX0NEICAgICAgICAgICBCSVQoMikKKyAgICAgICNkZWZpbmUgIFNDU0lfTVNHICAgICAgICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgU0NTSV9JT0JJVCAgICAgICAgQklUKDApCisKKyAgICAgICNkZWZpbmUgIFNfU0NTSV9QSFogICAgICAgIChCSVQoMikrQklUKDEpK0JJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfQ01EX1BIICAgICAgICAgIChCSVQoMikgICAgICAgICAgICAgICkKKyAgICAgICNkZWZpbmUgIFNfTVNHT19QSCAgICAgICAgIChCSVQoMikrQklUKDEpICAgICAgICkKKyAgICAgICNkZWZpbmUgIFNfU1RBVF9QSCAgICAgICAgIChCSVQoMikgICAgICAgK0JJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfTVNHSV9QSCAgICAgICAgIChCSVQoMikrQklUKDEpK0JJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfREFUQUlfUEggICAgICAgICggICAgICAgICAgICAgIEJJVCgwKSkKKyAgICAgICNkZWZpbmUgIFNfREFUQU9fUEggICAgICAgIDB4MDAKKyAgICAgICNkZWZpbmUgIFNfSUxMX1BIICAgICAgICAgICggICAgICAgQklUKDEpICAgICAgICkKKworICAgI2RlZmluZSAgaHBfc2NzaWN0cmxfMCAgICAgICAgMHg0NQorCisgICAgICAjZGVmaW5lICBOT19BUkIgICAgICAgICAgICBCSVQoNykKKyAgICAgICNkZWZpbmUgIFNFTF9UQVIgICAgICAgICAgIEJJVCg2KQorICAgICAgI2RlZmluZSAgRU5BX0FUTiAgICAgICAgICAgQklUKDQpCisgICAgICAjZGVmaW5lICBFTkFfUkVTRUwgICAgICAgICBCSVQoMikKKyAgICAgICNkZWZpbmUgIFNDU0lfUlNUICAgICAgICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgRU5BX1NDQU1fU0VMICAgICAgQklUKDApCisKKworCisgICAjZGVmaW5lICBocF9wb3J0Y3RybF8wICAgICAgICAweDQ2CisKKyAgICAgICNkZWZpbmUgIFNDU0lfUE9SVCAgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgU0NTSV9JTkJJVCAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBETUFfUE9SVCAgICAgICAgICBCSVQoNSkKKyAgICAgICNkZWZpbmUgIERNQV9SRCAgICAgICAgICAgIEJJVCg0KQorICAgICAgI2RlZmluZSAgSE9TVF9QT1JUICAgICAgICAgQklUKDMpCisgICAgICAjZGVmaW5lICBIT1NUX1dSVCAgICAgICAgICBCSVQoMikKKyAgICAgICNkZWZpbmUgIFNDU0lfQlVTX0VOICAgICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgU1RBUlRfVE8gICAgICAgICAgQklUKDApCisKKyAgICNkZWZpbmUgIGhwX3Njc2lyZXNldCAgICAgICAgIDB4NDcKKworICAgICAgI2RlZmluZSAgU0NTSV9UQVIgICAgICAgICAgQklUKDcpCisgICAgICAjZGVmaW5lICBTQ1NJX0lOSSAgICAgICAgICBCSVQoNikKKyAgICAgICNkZWZpbmUgIFNDQU1fRU4gICAgICAgICAgIEJJVCg1KQorICAgICAgI2RlZmluZSAgQUNLX0hPTEQgICAgICAgICAgQklUKDQpCisgICAgICAjZGVmaW5lICBETUFfUkVTRVQgICAgICAgICBCSVQoMykKKyAgICAgICNkZWZpbmUgIEhQU0NTSV9SRVNFVCAgICAgIEJJVCgyKQorICAgICAgI2RlZmluZSAgUFJPR19SRVNFVCAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lICBGSUZPX0NMUiAgICAgICAgICBCSVQoMCkKKworICAgI2RlZmluZSAgaHBfeGZlcmNudF8wICAgICAgICAgMHg0OAorICAgI2RlZmluZSAgaHBfeGZlcmNudF8xICAgICAgICAgMHg0OQorICAgI2RlZmluZSAgaHBfeGZlcmNudF8yICAgICAgICAgMHg0QQorICAgI2RlZmluZSAgaHBfeGZlcmNudF8zICAgICAgICAgMHg0QgorCisgICAjZGVmaW5lICBocF9maWZvZGF0YV8wICAgICAgICAweDRDCisgICAjZGVmaW5lICBocF9maWZvZGF0YV8xICAgICAgICAweDRECisgICAjZGVmaW5lICBocF9hZGRzdGF0ICAgICAgICAgICAweDRFCisKKyAgICAgICNkZWZpbmUgIFNDQU1fVElNRVIgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgQVVUT19SVU5OSU5HICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBGQVNUX1NZTkMgICAgICAgICBCSVQoNSkKKyAgICAgICNkZWZpbmUgIFNDU0lfTU9ERTggICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgU0NTSV9QQVJfRVJSICAgICAgQklUKDApCisKKyAgICNkZWZpbmUgIGhwX3ByZ21jbnRfMCAgICAgICAgIDB4NEYKKworICAgICAgI2RlZmluZSAgQVVUT19QQ19NQVNLICAgICAgMHgzRgorCisgICAjZGVmaW5lICBocF9zZWxmaWRfMCAgICAgICAgICAweDUwCisgICAjZGVmaW5lICBocF9zZWxmaWRfMSAgICAgICAgICAweDUxCisgICAjZGVmaW5lICBocF9hcmJfaWQgICAgICAgICAgICAweDUyCisKKyAgICAgICNkZWZpbmUgIEFSQl9JRCAgICAgICAgICAgIChCSVQoMykgKyBCSVQoMikgKyBCSVQoMSkgKyBCSVQoMCkpCisKKyAgICNkZWZpbmUgIGhwX3NlbGVjdF9pZCAgICAgICAgIDB4NTMKKworICAgICAgI2RlZmluZSAgUkVTRUxfSUQgICAgICAgICAgKEJJVCg3KSArIEJJVCg2KSArIEJJVCg1KSArIEJJVCg0KSkKKyAgICAgICNkZWZpbmUgIFNFTEVDVF9JRCAgICAgICAgIChCSVQoMykgKyBCSVQoMikgKyBCSVQoMSkgKyBCSVQoMCkpCisKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnX2Jhc2UgICAgIDB4NTQKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzEyICAgICAgIDB4NTQKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzEzICAgICAgIDB4NTUKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzE0ICAgICAgIDB4NTYKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzE1ICAgICAgIDB4NTcKKworICAgI2RlZmluZSAgaHBfc3luY3RhcmdfOCAgICAgICAgMHg1OAorICAgI2RlZmluZSAgaHBfc3luY3RhcmdfOSAgICAgICAgMHg1OQorICAgI2RlZmluZSAgaHBfc3luY3RhcmdfMTAgICAgICAgMHg1QQorICAgI2RlZmluZSAgaHBfc3luY3RhcmdfMTEgICAgICAgMHg1QgorCisgICAjZGVmaW5lICBocF9zeW5jdGFyZ180ICAgICAgICAweDVDCisgICAjZGVmaW5lICBocF9zeW5jdGFyZ181ICAgICAgICAweDVECisgICAjZGVmaW5lICBocF9zeW5jdGFyZ182ICAgICAgICAweDVFCisgICAjZGVmaW5lICBocF9zeW5jdGFyZ183ICAgICAgICAweDVGCisKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzAgICAgICAgIDB4NjAKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzEgICAgICAgIDB4NjEKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzIgICAgICAgIDB4NjIKKyAgICNkZWZpbmUgIGhwX3N5bmN0YXJnXzMgICAgICAgIDB4NjMKKworICAgICAgI2RlZmluZSAgUkFURV8yME1CICAgICAgICAgMHgwMAorICAgICAgI2RlZmluZSAgUkFURV8xME1CICAgICAgICAgKCAgICAgICAgICAgICAgQklUKDUpKQorICAgICAgI2RlZmluZSAgUkFURV82XzZNQiAgICAgICAgKCAgICAgICBCSVQoNikgICAgICAgKSAgIAorICAgICAgI2RlZmluZSAgUkFURV81TUIgICAgICAgICAgKCAgICAgICBCSVQoNikrQklUKDUpKQorICAgICAgI2RlZmluZSAgUkFURV80TUIgICAgICAgICAgKEJJVCg3KSAgICAgICAgICAgICAgKQorICAgICAgI2RlZmluZSAgUkFURV8zXzMzTUIgICAgICAgKEJJVCg3KSAgICAgICArQklUKDUpKQorICAgICAgI2RlZmluZSAgUkFURV8yXzg1TUIgICAgICAgKEJJVCg3KStCSVQoNikgICAgICAgKQorICAgICAgI2RlZmluZSAgUkFURV8yXzVNQiAgICAgICAgKEJJVCg3KStCSVQoNSkrQklUKDYpKQorICAgICAgI2RlZmluZSAgTkVYVF9DTEsgICAgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBTTE9XRVNUX1NZTkMgICAgICAoQklUKDcpK0JJVCg2KStCSVQoNSkpCisgICAgICAjZGVmaW5lICBOQVJST1dfU0NTSSAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIFNZTkNfT0ZGU0VUICAgICAgIChCSVQoMykgKyBCSVQoMikgKyBCSVQoMSkgKyBCSVQoMCkpCisgICAgICAjZGVmaW5lICBERUZBVUxUX0FTWU5DICAgICAweDAwCisgICAgICAjZGVmaW5lICBERUZBVUxUX09GRlNFVCAgICAweDBGCisKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8wICAgICAgIDB4NjQKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8xICAgICAgIDB4NjUKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8yICAgICAgIDB4NjYKKyAgICNkZWZpbmUgIGhwX2F1dG9zdGFydF8zICAgICAgIDB4NjcKKworCisKKyAgICAgICNkZWZpbmUgIERJU0FCTEUgIDB4MDAKKyAgICAgICNkZWZpbmUgIEFVVE9fSU1NRUQgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBTRUxFQ1QgICBCSVQoNikKKyAgICAgICNkZWZpbmUgIFJFU0VMRUNUIChCSVQoNikrQklUKDUpKQorICAgICAgI2RlZmluZSAgQlVTRlJFRSAgQklUKDcpCisgICAgICAjZGVmaW5lICBYRkVSXzAgICAoQklUKDcpK0JJVCg1KSkKKyAgICAgICNkZWZpbmUgIEVORF9EQVRBIChCSVQoNykrQklUKDYpKQorICAgICAgI2RlZmluZSAgTVNHX1BIWiAgKEJJVCg3KStCSVQoNikrQklUKDUpKQorCisgICAjZGVmaW5lICBocF9ncF9yZWdfMCAgICAgICAgICAweDY4CisgICAjZGVmaW5lICBocF9ncF9yZWdfMSAgICAgICAgICAweDY5CisgICAjZGVmaW5lICBocF9ncF9yZWdfMiAgICAgICAgICAweDZBCisgICAjZGVmaW5lICBocF9ncF9yZWdfMyAgICAgICAgICAweDZCCisKKyAgICNkZWZpbmUgIGhwX3NlbHRpbWVvdXQgICAgICAgIDB4NkMKKworCisgICAgICAjZGVmaW5lICBUT18ybXMgICAgICAgICAgICAweDU0ICAgICAgLyogMi4wNTAzbXMgKi8KKyAgICAgICNkZWZpbmUgIFRPXzRtcyAgICAgICAgICAgIDB4NjcgICAgICAvKiAzLjk5NTltcyAqLworCisgICAgICAjZGVmaW5lICBUT181bXMgICAgICAgICAgICAweDAzICAgICAgLyogNC45MTUybXMgKi8KKyAgICAgICNkZWZpbmUgIFRPXzEwbXMgICAgICAgICAgIDB4MDcgICAgICAvKiAxMS54eHhtcyAqLworICAgICAgI2RlZmluZSAgVE9fMjUwbXMgICAgICAgICAgMHg5OSAgICAgIC8qIDI1MC42OG1zICovCisgICAgICAjZGVmaW5lICBUT18yOTBtcyAgICAgICAgICAweEIxICAgICAgLyogMjg5Ljk5bXMgKi8KKyAgICAgICNkZWZpbmUgIFRPXzM1MG1zICAgICAgICAgIDB4RDYgICAgICAvKiAzNTAuNjJtcyAqLworICAgICAgI2RlZmluZSAgVE9fNDE3bXMgICAgICAgICAgMHhGRiAgICAgIC8qIDQxNy43OW1zICovCisKKyAgICNkZWZpbmUgIGhwX2Nsa2N0cmxfMCAgICAgICAgIDB4NkQKKworICAgICAgI2RlZmluZSAgUFdSX0RXTiAgICAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBBQ1RkZWFzc2VydCAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIEFUTm9uRXJyICAgICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgQ0xLXzMwTUhaICAgICAgICAgQklUKDEpCisgICAgICAjZGVmaW5lICBDTEtfNDBNSFogICAgICAgICAoQklUKDEpICsgQklUKDApKQorICAgICAgI2RlZmluZSAgQ0xLXzUwTUhaICAgICAgICAgQklUKDIpCisKKyAgICAgICNkZWZpbmUgIENMS0NUUkxfREVGQVVMVCAgIChBQ1RkZWFzc2VydCB8IENMS180ME1IWikKKworICAgI2RlZmluZSAgaHBfZmlmb3JlYWQgICAgICAgICAgMHg2RQorICAgI2RlZmluZSAgaHBfZmlmb3dyaXRlICAgICAgICAgMHg2RgorCisgICAjZGVmaW5lICBocF9vZmZzZXRjdHIgICAgICAgICAweDcwCisgICAjZGVmaW5lICBocF94ZmVyc3RhdCAgICAgICAgICAweDcxCisKKyAgICAgICNkZWZpbmUgIEZJRk9fRlVMTCAgICAgICAgIEJJVCg3KQorICAgICAgI2RlZmluZSAgRklGT19FTVBUWSAgICAgICAgQklUKDYpCisgICAgICAjZGVmaW5lICBGSUZPX01BU0sgICAgICAgICAweDNGICAgLyogTWFzayBmb3IgdGhlIEZJRk8gY291bnQgdmFsdWUuICovCisgICAgICAjZGVmaW5lICBGSUZPX0xFTiAgICAgICAgICAweDIwCisKKyAgICNkZWZpbmUgIGhwX3BvcnRjdHJsXzEgICAgICAgIDB4NzIKKworICAgICAgI2RlZmluZSAgRVZFTl9IT1NUX1AgICAgICAgQklUKDUpCisgICAgICAjZGVmaW5lICBJTlZUX1NDU0kgICAgICAgICBCSVQoNCkKKyAgICAgICNkZWZpbmUgIENIS19TQ1NJX1AgICAgICAgIEJJVCgzKQorICAgICAgI2RlZmluZSAgSE9TVF9NT0RFOCAgICAgICAgQklUKDApCisgICAgICAjZGVmaW5lICBIT1NUX01PREUxNiAgICAgICAweDAwCisKKyAgICNkZWZpbmUgIGhwX3hmZXJfcGFkICAgICAgICAgIDB4NzMKKworICAgICAgI2RlZmluZSAgSURfVU5MT0NLICAgICAgICAgQklUKDMpCisgICAgICAjZGVmaW5lICBYRkVSX1BBRCAgICAgICAgICBCSVQoMikKKworICAgI2RlZmluZSAgaHBfc2NzaWRhdGFfMCAgICAgICAgMHg3NAorICAgI2RlZmluZSAgaHBfc2NzaWRhdGFfMSAgICAgICAgMHg3NQorICAgI2RlZmluZSAgaHBfdGltZXJfMCAgICAgICAgICAgMHg3NgorICAgI2RlZmluZSAgaHBfdGltZXJfMSAgICAgICAgICAgMHg3NworCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83OCAgICAgICAweDc4CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83OSAgICAgICAweDc5CisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83QSAgICAgICAweDdBCisgICAjZGVmaW5lICBocF9yZXNlcnZlZF83QiAgICAgICAweDdCCisKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdDICAgICAgIDB4N0MKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdEICAgICAgIDB4N0QKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdFICAgICAgIDB4N0UKKyAgICNkZWZpbmUgIGhwX3Jlc2VydmVkXzdGICAgICAgIDB4N0YKKworICAgI2RlZmluZSAgaHBfYXJhbUJhc2UgICAgICAgICAgMHg4MAorICAgI2RlZmluZSAgQklPU19EQVRBX09GRlNFVCAgICAgMHg2MAorICAgI2RlZmluZSAgQklPU19SRUxBVElWRV9DQVJEICAgMHg2NAorCisKKworCisgICAgICAjZGVmaW5lICBBVVRPX0xFTiAweDgwCisgICAgICAjZGVmaW5lICBBUjAgICAgICAweDAwCisgICAgICAjZGVmaW5lICBBUjEgICAgICBCSVRXKDgpCisgICAgICAjZGVmaW5lICBBUjIgICAgICBCSVRXKDkpCisgICAgICAjZGVmaW5lICBBUjMgICAgICAoQklUVyg5KSArIEJJVFcoOCkpCisgICAgICAjZGVmaW5lICBTREFUQSAgICBCSVRXKDEwKQorCisgICAgICAjZGVmaW5lICBOT1BfT1AgICAweDAwICAgICAgICAvKiBOb3AgY29tbWFuZCAqLworCisgICAgICAjZGVmaW5lICBDUkRfT1AgICBCSVRXKDExKSAgICAgLyogQ21wIFJlZy4gdy8gRGF0YSAqLworCisgICAgICAjZGVmaW5lICBDUlJfT1AgICBCSVRXKDEyKSAgICAgLyogQ21wIFJlZy4gdy4gUmVnLiAqLworCisgICAgICAjZGVmaW5lICBDQkVfT1AgICAoQklUVygxNCkrQklUVygxMikrQklUVygxMSkpIC8qIENtcCBTQ1NJIGNtZCBjbGFzcyAmIEJyYW5jaCBFUSAqLworICAgICAgCisgICAgICAjZGVmaW5lICBDQk5fT1AgICAoQklUVygxNCkrQklUVygxMykpICAvKiBDbXAgU0NTSSBjbWQgY2xhc3MgJiBCcmFuY2ggTk9UIEVRICovCisgICAgICAKKyAgICAgICNkZWZpbmUgIENQRV9PUCAgIChCSVRXKDE0KStCSVRXKDExKSkgIC8qIENtcCBTQ1NJIHBocyAmIEJyYW5jaCBFUSAqLworCisgICAgICAjZGVmaW5lICBDUE5fT1AgICAoQklUVygxNCkrQklUVygxMikpICAvKiBDbXAgU0NTSSBwaHMgJiBCcmFuY2ggTk9UIEVRICovCisKKworICAgICAgI2RlZmluZSAgQURBVEFfT1VUICAgMHgwMCAgICAgCisgICAgICAjZGVmaW5lICBBREFUQV9JTiAgICBCSVRXKDgpCisgICAgICAjZGVmaW5lICBBQ09NTUFORCAgICBCSVRXKDEwKQorICAgICAgI2RlZmluZSAgQVNUQVRVUyAgICAgKEJJVFcoMTApK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBTVNHX09VVCAgICAoQklUVygxMCkrQklUVyg5KSkKKyAgICAgICNkZWZpbmUgIEFNU0dfSU4gICAgIChCSVRXKDEwKStCSVRXKDkpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBSUxMRUdBTCAgICAoQklUVyg5KStCSVRXKDgpKQorCisKKyAgICAgICNkZWZpbmUgIEJSSF9PUCAgIEJJVFcoMTMpICAgLyogQnJhbmNoICovCisKKyAgICAgIAorICAgICAgI2RlZmluZSAgQUxXQVlTICAgMHgwMAorICAgICAgI2RlZmluZSAgRVFVQUwgICAgQklUVyg4KQorICAgICAgI2RlZmluZSAgTk9UX0VRICAgQklUVyg5KQorCisgICAgICAjZGVmaW5lICBUQ0JfT1AgICAoQklUVygxMykrQklUVygxMSkpICAgIC8qIFRlc3QgY29uZGl0aW9uICYgYnJhbmNoICovCisKKyAgICAgIAorICAgICAgI2RlZmluZSAgQVROX1NFVCAgICAgQklUVyg4KQorICAgICAgI2RlZmluZSAgQVROX1JFU0VUICAgQklUVyg5KQorICAgICAgI2RlZmluZSAgWEZFUl9DTlQgICAgKEJJVFcoOSkrQklUVyg4KSkKKyAgICAgICNkZWZpbmUgIEZJRk9fMCAgICAgIEJJVFcoMTApCisgICAgICAjZGVmaW5lICBGSUZPX05PVDAgICAoQklUVygxMCkrQklUVyg4KSkKKyAgICAgICNkZWZpbmUgIFRfVVNFX1NZTkMwIChCSVRXKDEwKStCSVRXKDkpKQorCisKKyAgICAgICNkZWZpbmUgIE1QTV9PUCAgIEJJVFcoMTUpICAgICAgICAvKiBNYXRjaCBwaGFzZSBhbmQgbW92ZSBkYXRhICovCisKKyAgICAgICNkZWZpbmUgIE1EUl9PUCAgIChCSVRXKDEyKStCSVRXKDExKSkgLyogTW92ZSBkYXRhIHRvIFJlZy4gKi8KKworICAgICAgI2RlZmluZSAgTVJSX09QICAgQklUVygxNCkgICAgICAgIC8qIE1vdmUgRFJlZy4gdG8gUmVnLiAqLworCisKKyAgICAgICNkZWZpbmUgIFNfSURSRUcgIChCSVQoMikrQklUKDEpK0JJVCgwKSkKKworCisgICAgICAjZGVmaW5lICBEX0FSMCAgICAweDAwCisgICAgICAjZGVmaW5lICBEX0FSMSAgICBCSVQoMCkKKyAgICAgICNkZWZpbmUgIERfQVIyICAgIEJJVCgxKQorICAgICAgI2RlZmluZSAgRF9BUjMgICAgKEJJVCgxKSArIEJJVCgwKSkKKyAgICAgICNkZWZpbmUgIERfU0RBVEEgIEJJVCgyKQorICAgICAgI2RlZmluZSAgRF9CVUNLRVQgKEJJVCgyKSArIEJJVCgxKSArIEJJVCgwKSkKKworCisgICAgICAjZGVmaW5lICBBRFJfT1AgICAoQklUVygxMykrQklUVygxMikpIC8qIExvZ2ljYWwgQU5EIFJlZy4gdy4gRGF0YSAqLworCisgICAgICAjZGVmaW5lICBBRFNfT1AgICAoQklUVygxNCkrQklUVygxMykrQklUVygxMikpIAorCisgICAgICAjZGVmaW5lICBPRFJfT1AgICAoQklUVygxMykrQklUVygxMikrQklUVygxMSkpICAKKworICAgICAgI2RlZmluZSAgT0RTX09QICAgKEJJVFcoMTQpK0JJVFcoMTMpK0JJVFcoMTIpK0JJVFcoMTEpKSAgCisKKyAgICAgICNkZWZpbmUgIFNUUl9PUCAgIChCSVRXKDE1KStCSVRXKDE0KSkgLyogU3RvcmUgdG8gQV9SZWcuICovCisKKyAgICAgICNkZWZpbmUgIEFJTlRfRU5BMSAgIDB4MDAKKyAgICAgICNkZWZpbmUgIEFJTlRfU1RBVDEgIEJJVFcoOCkKKyAgICAgICNkZWZpbmUgIEFTQ1NJX1NJRyAgIEJJVFcoOSkKKyAgICAgICNkZWZpbmUgIEFTQ1NJX0NOVEwgIChCSVRXKDkpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBUE9SVF9DTlRMICBCSVRXKDEwKQorICAgICAgI2RlZmluZSAgQVJTVF9DTlRMICAgKEJJVFcoMTApK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBWEZFUkNOVDAgICAoQklUVygxMCkrQklUVyg5KSkKKyAgICAgICNkZWZpbmUgIEFYRkVSQ05UMSAgIChCSVRXKDEwKStCSVRXKDkpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBWEZFUkNOVDIgICBCSVRXKDExKQorICAgICAgI2RlZmluZSAgQUZJRk9fREFUQSAgKEJJVFcoMTEpK0JJVFcoOCkpCisgICAgICAjZGVmaW5lICBBU0NTSVNFTElEICAoQklUVygxMSkrQklUVyg5KSkKKyAgICAgICNkZWZpbmUgIEFTQ1NJU1lOQzAgIChCSVRXKDExKStCSVRXKDkpK0JJVFcoOCkpCisKKworICAgICAgI2RlZmluZSAgUkFUX09QICAgICAgKEJJVFcoMTQpK0JJVFcoMTMpK0JJVFcoMTEpKQorCisgICAgICAjZGVmaW5lICBTU0lfT1AgICAgICAoQklUVygxNSkrQklUVygxMSkpCisKKworICAgICAgI2RlZmluZSAgU1NJX0lUQVJfRElTQwkoSVRBUl9ESVNDID4+IDgpCisgICAgICAjZGVmaW5lICBTU0lfSURPX1NUUlQJKElET19TVFJUID4+IDgpCisgICAgICAjZGVmaW5lICBTU0lfSURJX1NUUlQJKElET19TVFJUID4+IDgpCisKKyAgICAgICNkZWZpbmUgIFNTSV9JQ01EX0NPTVAJKElDTURfQ09NUCA+PiA4KQorICAgICAgI2RlZmluZSAgU1NJX0lUSUNLTEUJKElUSUNLTEUgPj4gOCkKKworICAgICAgI2RlZmluZSAgU1NJX0lVTktXTgkoSVVOS1dOID4+IDgpCisgICAgICAjZGVmaW5lICBTU0lfSU5PX0NDCShJVU5LV04gPj4gOCkKKyAgICAgICNkZWZpbmUgIFNTSV9JUkZBSUwJKElVTktXTiA+PiA4KQorCisKKyAgICAgICNkZWZpbmUgIE5QICAgIDB4MTAgICAgIC8qTmV4dCBQaGFzZSAqLworICAgICAgI2RlZmluZSAgTlRDTUQgMHgwMiAgICAgLypOb24tIFRhZ2dlZCBDb21tYW5kIHN0YXJ0ICovCisgICAgICAjZGVmaW5lICBDTURQWiAweDA0ICAgICAvKkNvbW1hbmQgcGhhc2UgKi8KKyAgICAgICNkZWZpbmUgIERJTlQgIDB4MTIgICAgIC8qRGF0YSBPdXQvSW4gaW50ZXJydXB0ICovCisgICAgICAjZGVmaW5lICBESSAgICAweDEzICAgICAvKkRhdGEgT3V0ICovCisgICAgICAjZGVmaW5lICBNSSAgICAweDE0ICAgICAvKk1lc3NhZ2UgSW4gKi8KKyAgICAgICNkZWZpbmUgIERDICAgIDB4MTkgICAgIC8qRGlzY29ubmVjdCBNZXNzYWdlICovCisgICAgICAjZGVmaW5lICBTVCAgICAweDFEICAgICAvKlN0YXR1cyBQaGFzZSAqLworICAgICAgI2RlZmluZSAgVU5LTldOIDB4MjQgICAgLypVbmtub3duIGJ1cyBhY3Rpb24gKi8KKyAgICAgICNkZWZpbmUgIENDICAgIDB4MjUgICAgIC8qQ29tbWFuZCBDb21wbGV0aW9uIGZhaWx1cmUgKi8KKyAgICAgICNkZWZpbmUgIFRJQ0sgIDB4MjYgICAgIC8qTmV3IHRhcmdldCByZXNlbGVjdGVkIHVzLiAqLworICAgICAgI2RlZmluZSAgUkZBSUwgMHgyNyAgICAgLypSZXNlbGVjdGlvbiBmYWlsZWQgKi8KKyAgICAgICNkZWZpbmUgIFNFTENISyAweDI4ICAgICAvKlNlbGVjdCAmIENoZWNrIFNDU0kgSUQgbGF0Y2ggcmVnICovCisKKworICAgICAgI2RlZmluZSAgSURfTVNHX1NUUlQgICAgaHBfYXJhbUJhc2UgKyAweDAwCisgICAgICAjZGVmaW5lICBOT05fVEFHX0lEX01TRyBocF9hcmFtQmFzZSArIDB4MDYKKyAgICAgICNkZWZpbmUgIENNRF9TVFJUICAgICAgIGhwX2FyYW1CYXNlICsgMHgwOAorICAgICAgI2RlZmluZSAgU1lOQ19NU0dTICAgICAgaHBfYXJhbUJhc2UgKyAweDA4CisKKworCisKKworICAgICAgI2RlZmluZSAgVEFHX1NUUlQgICAgICAgICAgMHgwMAorICAgICAgI2RlZmluZSAgU0VMRUNUSU9OX1NUQVJUICAgMHgwMAorICAgICAgI2RlZmluZSAgRElTQ09OTkVDVF9TVEFSVCAgMHgxMC8yCisgICAgICAjZGVmaW5lICBFTkRfREFUQV9TVEFSVCAgICAweDE0LzIKKyAgICAgICNkZWZpbmUgIE5PTlRBR19TVFJUICAgICAgIDB4MDIvMgorICAgICAgI2RlZmluZSAgQ01EX09OTFlfU1RSVCAgICAgQ01EUFovMgorICAgICAgI2RlZmluZSAgVElDS0xFX1NUUlQgICAgIFRJQ0svMgorICAgICAgI2RlZmluZSAgU0VMQ0hLX1NUUlQgICAgIFNFTENISy8yCisKKworCisKKyNkZWZpbmUgbUVFUFJPTV9DTEtfREVMQVkocG9ydCkgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRzdGF0XzEpKQorCisjZGVmaW5lIG1XQUlUXzEwTVMocG9ydCkgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRzdGF0XzEpKQorCisKKyNkZWZpbmUgQ0xSX1hGRVJfQ05UKHBvcnQpIChXUl9IQVJQT09OKHBvcnQraHBfeGZlcmNudF8wLCAweDAwKSkKKworI2RlZmluZSBTRVRfWEZFUl9DTlQocG9ydCwgZGF0YSkgKFdSX0hBUlAzMihwb3J0LGhwX3hmZXJjbnRfMCxkYXRhKSkKKworI2RlZmluZSBHRVRfWEZFUl9DTlQocG9ydCwgeGZlcmNudCkge1JEX0hBUlAzMihwb3J0LGhwX3hmZXJjbnRfMCx4ZmVyY250KTsgeGZlcmNudCAmPSAweEZGRkZGRjt9CisvKiAjZGVmaW5lIEdFVF9YRkVSX0NOVChwb3J0LCB4ZmVyY250KSAoeGZlcmNudCA9IFJEX0hBUlBPT04ocG9ydCtocF94ZmVyY250XzIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVyY250IDw8PSAxNixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVyY250IHw9IFJEV19IQVJQT09OKChVU0hPUlQpKHBvcnQraHBfeGZlcmNudF8wKSkpCisgKi8KKyNpZiBkZWZpbmVkKERPUykKKyNkZWZpbmUgSFBfU0VUVVBfQUREUl9DTlQocG9ydCxhZGRyLGNvdW50KSAoV1JXX0hBUlBPT04oKFVTSE9SVCkocG9ydCtocF9ob3N0X2FkZHJfbG8pLCAoVVNIT1JUKShhZGRyICYgMHgwMDAwRkZGRkwpKSxcCisgICAgICAgICBhZGRyID4+PSAxNixcCisgICAgICAgICBXUldfSEFSUE9PTigoVVNIT1JUKShwb3J0K2hwX2hvc3RfYWRkcl9obWkpLCAoVVNIT1JUKShhZGRyICYgMHgwMDAwRkZGRkwpKSxcCisgICAgICAgICBXUl9IQVJQMzIocG9ydCxocF94ZmVyY250XzAsY291bnQpLFwKKyAgICAgICAgIFdSV19IQVJQT09OKChVU0hPUlQpKHBvcnQraHBfeGZlcl9jbnRfbG8pLCAoVVNIT1JUKShjb3VudCAmIDB4MDAwMEZGRkZMKSksXAorICAgICAgICAgY291bnQgPj49IDE2LFwKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9oaSwgKGNvdW50ICYgMHhGRikpKQorI2Vsc2UKKyNkZWZpbmUgSFBfU0VUVVBfQUREUl9DTlQocG9ydCxhZGRyLGNvdW50KSAoV1JXX0hBUlBPT04oKHBvcnQraHBfaG9zdF9hZGRyX2xvKSwgKFVTSE9SVCkoYWRkciAmIDB4MDAwMEZGRkZMKSksXAorICAgICAgICAgYWRkciA+Pj0gMTYsXAorICAgICAgICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaG9zdF9hZGRyX2htaSksIChVU0hPUlQpKGFkZHIgJiAweDAwMDBGRkZGTCkpLFwKKyAgICAgICAgIFdSX0hBUlAzMihwb3J0LGhwX3hmZXJjbnRfMCxjb3VudCksXAorICAgICAgICAgV1JXX0hBUlBPT04oKHBvcnQraHBfeGZlcl9jbnRfbG8pLCAoVVNIT1JUKShjb3VudCAmIDB4MDAwMEZGRkZMKSksXAorICAgICAgICAgY291bnQgPj49IDE2LFwKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9oaSwgKGNvdW50ICYgMHhGRikpKQorI2VuZGlmCisKKyNkZWZpbmUgQUNDRVBUX01TRyhwb3J0KSB7d2hpbGUoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpe31cCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCBTX0lMTF9QSCk7fQorCisKKyNkZWZpbmUgQUNDRVBUX01TR19BVE4ocG9ydCkge3doaWxlKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfUkVRKXt9XAorICAgICAgICAgICAgICAgICAgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywgKFNfSUxMX1BIfFNDU0lfQVROKSk7fQorCisjZGVmaW5lIEFDQ0VQVF9TVEFUKHBvcnQpIHt3aGlsZShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSl7fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIFNfSUxMX1BIKTt9CisKKyNkZWZpbmUgQUNDRVBUX1NUQVRfQVROKHBvcnQpIHt3aGlsZShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSl7fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIChTX0lMTF9QSHxTQ1NJX0FUTikpO30KKworI2RlZmluZSBESVNBQkxFX0FVVE8ocG9ydCkgKFdSX0hBUlBPT04ocG9ydCtocF9zY3NpcmVzZXQsIFBST0dfUkVTRVQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpcmVzZXQsIDB4MDApKQorCisjZGVmaW5lIEFSQU1fQUNDRVNTKHBfcG9ydCkgKFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSB8IFNHUkFNX0FSQU0pKSkKKworI2RlZmluZSBTR1JBTV9BQ0NFU1MocF9wb3J0KSAoV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpICYgflNHUkFNX0FSQU0pKSkKKworI2RlZmluZSBNRElTQUJMRV9JTlQocF9wb3J0KSAoV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpIHwgR19JTlRfRElTQUJMRSkpKQorCisjZGVmaW5lIE1FTkFCTEVfSU5UKHBfcG9ydCkgKFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSkpCisKKworCisjZW5kaWYKKworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKK3ZvaWQgUmVhZE5WUmFtKFBTQ0NCY2FyZCBwQ3VyckNhcmQsUFVDQiBwX3VjYik7Cit2b2lkIFdyaXRlTlZSYW0oUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKTsKK3ZvaWQgVXBkYXRlQ2hlY2tTdW0odTMyYml0cyBiYXNlcG9ydCk7CisjZW5kaWYgLy8gKEZXX1RZUEU9PV9VQ0JfTUdSXykKKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgc2ZtKFVTSE9SVCBwb3J0LCBQU0NDQiBwY3VyclNDQ0IpOwordm9pZCAgc2NzaVN0YXJ0QXV0byhVU0hPUlQgcG9ydCk7CitVQ0hBUiBzaXN5bmNuKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIHN5bmNGbGFnKTsKK3ZvaWQgIHNzZWwoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzcmVzKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpOwordm9pZCAgc2RlY20oVUNIQVIgbWVzc2FnZSwgVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzaGFuZGVtKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIHN0c3luY24oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzaXN5bmNyKFVTSE9SVCBwb3J0LFVDSEFSIHN5bmNfcHVsc2UsIFVDSEFSIG9mZnNldCk7Cit2b2lkICBzc3N5bmN2KFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfaWQsIFVDSEFSIHBfc3luY192YWx1ZSwgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvKTsKK3ZvaWQgIHNyZXNiKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgc3hmcnAoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHNjaGtkZChVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK1VDSEFSIFJkU3RhY2soVVNIT1JUIHBvcnQsIFVDSEFSIGluZGV4KTsKK3ZvaWQgIFdyU3RhY2soVVNIT1JUIHBvcnRCYXNlLCBVQ0hBUiBpbmRleCwgVUNIQVIgZGF0YSk7CitVQ0hBUiBDaGtJZkNoaXBJbml0aWFsaXplZChVU0hPUlQgaW9Qb3J0KTsKKworI2lmIGRlZmluZWQoVjMwMikKK1VDSEFSIEdldFRhckx1bihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBvdXJfdGFyZ2V0LCBQU0NDQmNhcmQgcEN1cnJDYXJkLCBQVUNIQVIgdGFnLCBQVUNIQVIgbHVuKTsKKyNlbmRpZgorCit2b2lkIFNlbmRNc2coVVNIT1JUIHBvcnQsIFVDSEFSIG1lc3NhZ2UpOwordm9pZCAgcXVldWVGbHVzaFRhcmdTY2NiKFVDSEFSIHBfY2FyZCwgVUNIQVIgdGhpc1RhcmcsIFVDSEFSIGVycm9yX2NvZGUpOworVUNIQVIgc2NzZWxsRE9TKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHRhcmdfaWQpOworI2Vsc2UKK1VDSEFSIHNmbShVTE9ORyBwb3J0LCBQU0NDQiBwY3VyclNDQ0IpOwordm9pZCAgc2NzaVN0YXJ0QXV0byhVTE9ORyBwb3J0KTsKK1VDSEFSIHNpc3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBzeW5jRmxhZyk7Cit2b2lkICBzc2VsKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzcmVzKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0JjYXJkIHBDdXJyQ2FyZCk7Cit2b2lkICBzZGVjbShVQ0hBUiBtZXNzYWdlLCBVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgc2hhbmRlbShVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQsUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIHN0c3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHNpc3luY3IoVUxPTkcgcG9ydCxVQ0hBUiBzeW5jX3B1bHNlLCBVQ0hBUiBvZmZzZXQpOwordm9pZCAgc3NzeW5jdihVTE9ORyBwX3BvcnQsIFVDSEFSIHBfaWQsIFVDSEFSIHBfc3luY192YWx1ZSwgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvKTsKK3ZvaWQgIHNyZXNiKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzeGZycChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBzY2hrZGQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK1VDSEFSIFJkU3RhY2soVUxPTkcgcG9ydCwgVUNIQVIgaW5kZXgpOwordm9pZCAgV3JTdGFjayhVTE9ORyBwb3J0QmFzZSwgVUNIQVIgaW5kZXgsIFVDSEFSIGRhdGEpOworVUNIQVIgQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoVUxPTkcgaW9Qb3J0KTsKKworI2lmIGRlZmluZWQoVjMwMikKK1VDSEFSIEdldFRhckx1bihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIG91cl90YXJnZXQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFBVQ0hBUiB0YXIsIFBVQ0hBUiBsdW4pOworI2VuZGlmCisKK3ZvaWQgU2VuZE1zZyhVTE9ORyBwb3J0LCBVQ0hBUiBtZXNzYWdlKTsKK3ZvaWQgIHF1ZXVlRmx1c2hUYXJnU2NjYihVQ0hBUiBwX2NhcmQsIFVDSEFSIHRoaXNUYXJnLCBVQ0hBUiBlcnJvcl9jb2RlKTsKKyNlbmRpZgorCit2b2lkICBzc2Vuc3MoUFNDQ0JjYXJkIHBDdXJyQ2FyZCk7Cit2b2lkICBzaW5pdHMoUFNDQ0IgcF9zY2NiLCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgUk5WUmFtRGF0YShQTlZSYW1JbmZvIHBOdlJhbUluZm8pOworCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisgICAjaWYgZGVmaW5lZChET1MpCisgICBVQ0hBUiBzaXdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBzdHdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBzaXdpZHIoVVNIT1JUIHBvcnQsIFVDSEFSIHdpZHRoKTsKKyAgICNlbHNlCisgICBVQ0hBUiBzaXdpZG4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgIHZvaWQgIHN0d2lkbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgdm9pZCAgc2l3aWRyKFVMT05HIHBvcnQsIFVDSEFSIHdpZHRoKTsKKyAgICNlbmRpZgorI2VuZGlmCisKKwordm9pZCAgcXVldWVTZWxlY3RGYWlsKFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBxdWV1ZURpc2Nvbm5lY3QoUFNDQ0IgcF9TQ0NCLCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgcXVldWVDbWRDb21wbGV0ZShQU0NDQmNhcmQgcEN1cnJDYXJkLCBQU0NDQiBwX1NDQ0IsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBxdWV1ZVNlYXJjaFNlbGVjdChQU0NDQmNhcmQgcEN1cnJDYXJkLCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgcXVldWVGbHVzaFNjY2IoVUNIQVIgcF9jYXJkLCBVQ0hBUiBlcnJvcl9jb2RlKTsKK3ZvaWQgIHF1ZXVlQWRkU2NjYihQU0NDQiBwX1NDQ0IsIFVDSEFSIGNhcmQpOworVUNIQVIgcXVldWVGaW5kU2NjYihQU0NDQiBwX1NDQ0IsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICB1dGlsVXBkYXRlUmVzaWR1YWwoUFNDQ0IgcF9TQ0NCKTsKK1VTSE9SVCBDYWxjQ3JjMTYoVUNIQVIgYnVmZmVyW10pOworVUNIQVIgIENhbGNMcmMoVUNIQVIgYnVmZmVyW10pOworCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgIFdhaXQxU2Vjb25kKFVTSE9SVCBwX3BvcnQpOwordm9pZCAgV2FpdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RlbGF5KTsKK3ZvaWQgIHV0aWxFRVdyaXRlT25PZmYoVVNIT1JUIHBfcG9ydCxVQ0hBUiBwX21vZGUpOwordm9pZCAgdXRpbEVFV3JpdGUoVVNIT1JUIHBfcG9ydCwgVVNIT1JUIGVlX2RhdGEsIFVTSE9SVCBlZV9hZGRyKTsKK1VTSE9SVCB1dGlsRUVSZWFkKFVTSE9SVCBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKTsKK1VTSE9SVCB1dGlsRUVSZWFkT3JnKFVTSE9SVCBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKTsKK3ZvaWQgIHV0aWxFRVNlbmRDbWRBZGRyKFVTSE9SVCBwX3BvcnQsIFVDSEFSIGVlX2NtZCwgVVNIT1JUIGVlX2FkZHIpOworI2Vsc2UKK3ZvaWQgIFdhaXQxU2Vjb25kKFVMT05HIHBfcG9ydCk7Cit2b2lkICBXYWl0KFVMT05HIHBfcG9ydCwgVUNIQVIgcF9kZWxheSk7Cit2b2lkICB1dGlsRUVXcml0ZU9uT2ZmKFVMT05HIHBfcG9ydCxVQ0hBUiBwX21vZGUpOwordm9pZCAgdXRpbEVFV3JpdGUoVUxPTkcgcF9wb3J0LCBVU0hPUlQgZWVfZGF0YSwgVVNIT1JUIGVlX2FkZHIpOworVVNIT1JUIHV0aWxFRVJlYWQoVUxPTkcgcF9wb3J0LCBVU0hPUlQgZWVfYWRkcik7CitVU0hPUlQgdXRpbEVFUmVhZE9yZyhVTE9ORyBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKTsKK3ZvaWQgIHV0aWxFRVNlbmRDbWRBZGRyKFVMT05HIHBfcG9ydCwgVUNIQVIgZWVfY21kLCBVU0hPUlQgZWVfYWRkcik7CisjZW5kaWYKKworCisKKyNpZiBkZWZpbmVkKE9TMikKKyAgIHZvaWQgIGZhciBwaGFzZURhdGFPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgIHZvaWQgIGZhciBwaGFzZURhdGFJbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgdm9pZCAgZmFyIHBoYXNlQ29tbWFuZChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgdm9pZCAgZmFyIHBoYXNlU3RhdHVzKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBmYXIgcGhhc2VNc2dPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgIHZvaWQgIGZhciBwaGFzZU1zZ0luKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICB2b2lkICBmYXIgcGhhc2VJbGxlZ2FsKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisjZWxzZQorICAgI2lmIGRlZmluZWQoRE9TKQorICAgICAgdm9pZCAgcGhhc2VEYXRhT3V0KFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VEYXRhSW4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZUNvbW1hbmQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZVN0YXR1cyhVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlTXNnT3V0KFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VNc2dJbihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlSWxsZWdhbChVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICNlbHNlCisgICAgICB2b2lkICBwaGFzZURhdGFPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlRGF0YUluKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZUNvbW1hbmQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKKyAgICAgIHZvaWQgIHBoYXNlU3RhdHVzKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAgICB2b2lkICBwaGFzZU1zZ091dChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VNc2dJbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpOworICAgICAgdm9pZCAgcGhhc2VJbGxlZ2FsKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7CisgICAjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChET1MpCit2b2lkICBwaGFzZURlY29kZShVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHBoYXNlQ2hrRmlmbyhVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHBoYXNlQnVzRnJlZShVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpOworI2Vsc2UKK3ZvaWQgIHBoYXNlRGVjb2RlKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBwaGFzZUNoa0ZpZm8oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKTsKK3ZvaWQgIHBoYXNlQnVzRnJlZShVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCk7CisjZW5kaWYKKworCisKKworI2lmIGRlZmluZWQoRE9TKQordm9pZCAgWGJvd0luaXQoVVNIT1JUIHBvcnQsIFVDSEFSIHNjYW1GbGcpOwordm9pZCAgQnVzTWFzdGVySW5pdChVU0hPUlQgcF9wb3J0KTsKK2ludCAgIERpYWdYYm93KFVTSE9SVCBwb3J0KTsKK2ludCAgIERpYWdCdXNNYXN0ZXIoVVNIT1JUIHBvcnQpOwordm9pZCAgRGlhZ0VFUFJPTShVU0hPUlQgcF9wb3J0KTsKKyNlbHNlCit2b2lkICBYYm93SW5pdChVTE9ORyBwb3J0LCBVQ0hBUiBzY2FtRmxnKTsKK3ZvaWQgIEJ1c01hc3RlckluaXQoVUxPTkcgcF9wb3J0KTsKK2ludCAgIERpYWdYYm93KFVMT05HIHBvcnQpOworaW50ICAgRGlhZ0J1c01hc3RlcihVTE9ORyBwb3J0KTsKK3ZvaWQgIERpYWdFRVBST00oVUxPTkcgcF9wb3J0KTsKKyNlbmRpZgorCisKKworCisjaWYgZGVmaW5lZChET1MpCit2b2lkICBidXNNc3RyQWJvcnQoVVNIT1JUIHBvcnQpOworVUNIQVIgYnVzTXN0clRpbWVPdXQoVVNIT1JUIHBvcnQpOwordm9pZCAgZGF0YVhmZXJQcm9jZXNzb3IoVVNIT1JUIHBvcnQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpOwordm9pZCAgYnVzTXN0clNHRGF0YVhmZXJTdGFydChVU0hPUlQgcG9ydCwgUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIGJ1c01zdHJEYXRhWGZlclN0YXJ0KFVTSE9SVCBwb3J0LCBQU0NDQiBwQ3VyclNDQ0IpOwordm9pZCAgaG9zdERhdGFYZmVyQWJvcnQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0IgcEN1cnJTQ0NCKTsKKyNlbHNlCit2b2lkICBidXNNc3RyQWJvcnQoVUxPTkcgcG9ydCk7CitVQ0hBUiBidXNNc3RyVGltZU91dChVTE9ORyBwb3J0KTsKK3ZvaWQgIGRhdGFYZmVyUHJvY2Vzc29yKFVMT05HIHBvcnQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpOwordm9pZCAgYnVzTXN0clNHRGF0YVhmZXJTdGFydChVTE9ORyBwb3J0LCBQU0NDQiBwQ3VyclNDQ0IpOwordm9pZCAgYnVzTXN0ckRhdGFYZmVyU3RhcnQoVUxPTkcgcG9ydCwgUFNDQ0IgcEN1cnJTQ0NCKTsKK3ZvaWQgIGhvc3REYXRhWGZlckFib3J0KFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0IgcEN1cnJTQ0NCKTsKKyNlbmRpZgordm9pZCAgaG9zdERhdGFYZmVyUmVzdGFydChQU0NDQiBjdXJyU0NDQik7CisKKworI2lmIGRlZmluZWQgKERPUykKK1VDSEFSIFNjY2JNZ3JfYmFkX2lzcihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVTSE9SVCBwX2ludCk7CisjZWxzZQorVUNIQVIgU2NjYk1ncl9iYWRfaXNyKFVMT05HIHBfcG9ydCwgVUNIQVIgcF9jYXJkLCBQU0NDQmNhcmQgcEN1cnJDYXJkLCBVU0hPUlQgcF9pbnQpOworCisjZW5kaWYKKwordm9pZCAgU2NjYk1nclRhYmxlSW5pdEFsbCh2b2lkKTsKK3ZvaWQgIFNjY2JNZ3JUYWJsZUluaXRDYXJkKFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBTY2NiTWdyVGFibGVJbml0VGFyZ2V0KFVDSEFSIHBfY2FyZCwgVUNIQVIgdGFyZ2V0KTsKKworCisKK3ZvaWQgIHNjaW5pKFVDSEFSIHBfY2FyZCwgVUNIQVIgcF9vdXJfaWQsIFVDSEFSIHBfcG93ZXJfdXApOworCisjaWYgZGVmaW5lZChET1MpCitpbnQgICBzY2FyYihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX3NlbF90eXBlKTsKK3ZvaWQgIHNjYnVzZihVU0hPUlQgcF9wb3J0KTsKK3ZvaWQgIHNjc2VsKFVTSE9SVCBwX3BvcnQpOwordm9pZCAgc2Nhc2lkKFVDSEFSIHBfY2FyZCwgVVNIT1JUIHBfcG9ydCk7CitVQ0hBUiBzY3hmZXJjKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfZGF0YSk7CitVQ0hBUiBzY3NlbmRpKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfaWRfc3RyaW5nW10pOworVUNIQVIgc2Npc28oVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9pZF9zdHJpbmdbXSk7Cit2b2lkICBzY3dpcm9kKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfZGF0YV9iaXQpOwordm9pZCAgc2N3aXJvcyhVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KTsKK1VDSEFSIHNjdmFscShVQ0hBUiBwX3F1aW50ZXQpOworVUNIQVIgc2NzZWxsKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHRhcmdfaWQpOwordm9pZCAgc2N3dHNlbChVU0hPUlQgcF9wb3J0KTsKK3ZvaWQgIGluaXNjaShVQ0hBUiBwX2NhcmQsIFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfb3VyX2lkKTsKK3ZvaWQgIHNjc2F2ZGkoVUNIQVIgcF9jYXJkLCBVU0hPUlQgcF9wb3J0KTsKKyNlbHNlCitpbnQgICBzY2FyYihVTE9ORyBwX3BvcnQsIFVDSEFSIHBfc2VsX3R5cGUpOwordm9pZCAgc2NidXNmKFVMT05HIHBfcG9ydCk7Cit2b2lkICBzY3NlbChVTE9ORyBwX3BvcnQpOwordm9pZCAgc2Nhc2lkKFVDSEFSIHBfY2FyZCwgVUxPTkcgcF9wb3J0KTsKK1VDSEFSIHNjeGZlcmMoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGEpOworVUNIQVIgc2NzZW5kaShVTE9ORyBwX3BvcnQsIFVDSEFSIHBfaWRfc3RyaW5nW10pOworVUNIQVIgc2Npc28oVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKTsKK3ZvaWQgIHNjd2lyb2QoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KTsKK3ZvaWQgIHNjd2lyb3MoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KTsKK1VDSEFSIHNjdmFscShVQ0hBUiBwX3F1aW50ZXQpOworVUNIQVIgc2NzZWxsKFVMT05HIHBfcG9ydCwgVUNIQVIgdGFyZ19pZCk7Cit2b2lkICBzY3d0c2VsKFVMT05HIHBfcG9ydCk7Cit2b2lkICBpbmlzY2koVUNIQVIgcF9jYXJkLCBVTE9ORyBwX3BvcnQsIFVDSEFSIHBfb3VyX2lkKTsKK3ZvaWQgIHNjc2F2ZGkoVUNIQVIgcF9jYXJkLCBVTE9ORyBwX3BvcnQpOworI2VuZGlmCitVQ0hBUiBzY21hY2hpZChVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfaWRfc3RyaW5nW10pOworCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgIGF1dG9DbWRDbXBsdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpOwordm9pZCAgYXV0b0xvYWREZWZhdWx0TWFwKFVTSE9SVCBwX3BvcnQpOworI2Vsc2UKK3ZvaWQgIGF1dG9DbWRDbXBsdChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCk7Cit2b2lkICBhdXRvTG9hZERlZmF1bHRNYXAoVUxPTkcgcF9wb3J0KTsKKyNlbmRpZgorCisKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorCXZvaWQgIE9TX3N0YXJ0X3RpbWVyKHVuc2lnbmVkIGxvbmcgaW9wb3J0LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCXZvaWQgIE9TX3N0b3BfdGltZXIodW5zaWduZWQgbG9uZyBpb3BvcnQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisJdm9pZCAgT1NfZGlzYWJsZV9pbnQodW5zaWduZWQgY2hhciBpbnR2ZWMpOworCXZvaWQgIE9TX2VuYWJsZV9pbnQodW5zaWduZWQgY2hhciBpbnR2ZWMpOworCXZvaWQgIE9TX2RlbGF5KHVuc2lnbmVkIGxvbmcgY291bnQpOworCWludCAgIE9TX1ZpcnRUb1BoeXModTMyYml0cyBDYXJkSGFuZGxlLCB1MzJiaXRzICpwaHlzYWRkciwgdTMyYml0cyAqdmlydGFkZHIpOworCSNpZiAhKGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoU09MQVJJU19SRUFMX01PREUpKSAKKwl2b2lkICBPU19Mb2NrKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKTsKKwl2b2lkICBPU19VbkxvY2soUFNDQ0JNR1JfSU5GTyBwQ2FyZEluZm8pOworI2VuZGlmIC8vIGlmIEZXX1RZUEUgPT0gLi4uCisKKyNlbmRpZgorCitleHRlcm4gU0NDQkNBUkQgQkxfQ2FyZFtNQVhfQ0FSRFNdOworZXh0ZXJuIFNDQ0JNR1JfVEFSX0lORk8gc2NjYk1nclRibFtNQVhfQ0FSRFNdW01BWF9TQ1NJX1RBUl07CisKKworI2lmIGRlZmluZWQoT1MyKQorICAgZXh0ZXJuIHZvaWQgKGZhciAqc19QaGFzZVRibFs4XSkgKFVMT05HLCBVQ0hBUik7CisjZWxzZQorICAgI2lmIGRlZmluZWQoRE9TKQorICAgICAgZXh0ZXJuIHZvaWQgKCpzX1BoYXNlVGJsWzhdKSAoVVNIT1JULCBVQ0hBUik7CisgICAjZWxzZQorICAgICAgZXh0ZXJuIHZvaWQgKCpzX1BoYXNlVGJsWzhdKSAoVUxPTkcsIFVDSEFSKTsKKyAgICNlbmRpZgorI2VuZGlmCisKK2V4dGVybiBTQ0NCU0NBTV9JTkZPIHNjYW1JbmZvW01BWF9TQ1NJX1RBUl07CitleHRlcm4gTlZSQU1JTkZPIG52UmFtSW5mb1tNQVhfTUJfQ0FSRFNdOworI2lmIGRlZmluZWQoRE9TKSB8fCBkZWZpbmVkKE9TMikKK2V4dGVybiBVQ0hBUiB0ZW1wX2lkX3N0cmluZ1tJRF9TVFJJTkdfTEVOR1RIXTsKKyNlbmRpZgorZXh0ZXJuIFVDSEFSIHNjYW1IQVN0cmluZ1tdOworCisKK2V4dGVybiBVQ0hBUiBtYkNhcmRzOworI2lmIGRlZmluZWQoQlVHQlVHKQorZXh0ZXJuIFVDSEFSIGRlYnVnX2ludFtNQVhfQ0FSRFNdW2RlYnVnX3NpemVdOworZXh0ZXJuIFVDSEFSIGRlYnVnX2luZGV4W01BWF9DQVJEU107Cit2b2lkIERlYnVnX0xvYWQoVUNIQVIgcF9jYXJkLCBVQ0hBUiBwX2J1Z19kYXRhKTsKKyNlbmRpZgorCisjaWYgKEZXX1RZUEU9PV9TQ0NCX01HUl8pCisjaWYgZGVmaW5lZChET1MpCisgICBleHRlcm4gVUNIQVIgZmlyc3RfdGltZTsKKyNlbmRpZgorI2VuZGlmIC8qIChGV19UWVBFPT1fU0NDQl9NR1JfKSAqLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKyNpZiBkZWZpbmVkKERPUykKKyAgIGV4dGVybiB1MDhiaXRzIGZpcnN0X3RpbWU7CisjZW5kaWYKKyNlbmRpZiAvKiAoRldfVFlQRT09X1VDQl9NR1JfKSAqLworCisjaWYgZGVmaW5lZChCVUdCVUcpCit2b2lkIERlYnVnX0xvYWQoVUNIQVIgcF9jYXJkLCBVQ0hBUiBwX2J1Z19kYXRhKTsKKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgaW50IFNjY2JHbG9iYWxGbGFnczsKKworCisjaWRlbnQgIiRJZDogc2NjYi5jIDEuMTggMTk5Ny8wNi8xMCAxNjo0NzowNCBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgc2NjYi5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyByZWxhdGluZyB0byBoYW5kbGluZyBvZiB0aGUgU0NDQiBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgICAgICBiZXR3ZWVuIHRoZSBkZXZpY2UgZHJpdmVyIGFuZCB0aGUgSEFSUE9PTi4KKyAqCisgKiAgICREYXRlOiAxOTk3LzA2LzEwIDE2OjQ3OjA0ICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS4xOCAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyojaW5jbHVkZSA8Z2xvYmFscy5oPiovCisKKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorCS8qI2luY2x1ZGUgPGJ1ZGkuaD4qLworCS8qI2luY2x1ZGUgPGJ1ZGlvY3RsLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8c2NzaTIuaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKworCisjaWYgKEZXX1RZUEU9PV9TQ0NCX01HUl8pCisjZGVmaW5lIG1PU19Mb2NrKGNhcmQpICAgIE9TX0xvY2soKFBTQ0NCTUdSX0lORk8pKCgoUFNDQ0JjYXJkKWNhcmQpLT5jYXJkSW5mbykpCisjZGVmaW5lIG1PU19VbkxvY2soY2FyZCkgIE9TX1VuTG9jaygoUFNDQ0JNR1JfSU5GTykoKChQU0NDQmNhcmQpY2FyZCktPmNhcmRJbmZvKSkKKyNlbHNlIC8qIEZXX1RZUEU9PV9VQ0JfTUdSXyAqLworI2RlZmluZSBtT1NfTG9jayhjYXJkKSAgICBPU19Mb2NrKCh1MzJiaXRzKSgoKFBTQ0NCY2FyZCljYXJkKS0+aW9Qb3J0KSkKKyNkZWZpbmUgbU9TX1VuTG9jayhjYXJkKSAgT1NfVW5Mb2NrKCh1MzJiaXRzKSgoKFBTQ0NCY2FyZCljYXJkKS0+aW9Qb3J0KSkKKyNlbmRpZgorCisKKy8qCitleHRlcm4gU0NDQk1HUl9UQVJfSU5GTyBzY2NiTWdyVGJsW01BWF9DQVJEU11bTUFYX1NDU0lfVEFSXTsKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CisKK2V4dGVybiBOVlJBTUlORk8gbnZSYW1JbmZvW01BWF9NQl9DQVJEU107CitleHRlcm4gVUNIQVIgbWJDYXJkczsKKworI2lmIGRlZmluZWQgKE9TMikKKyAgIGV4dGVybiB2b2lkIChmYXIgKnNfUGhhc2VUYmxbOF0pIChVTE9ORywgVUNIQVIpOworI2Vsc2UKKyAgICNpZiBkZWZpbmVkKERPUykKKyAgICAgIGV4dGVybiB2b2lkICgqc19QaGFzZVRibFs4XSkgKFVTSE9SVCwgVUNIQVIpOworICAgI2Vsc2UKKyAgICAgIGV4dGVybiB2b2lkICgqc19QaGFzZVRibFs4XSkgKFVMT05HLCBVQ0hBUik7CisgICAjZW5kaWYKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKEJVR0JVRykKK2V4dGVybiBVQ0hBUiBkZWJ1Z19pbnRbTUFYX0NBUkRTXVtkZWJ1Z19zaXplXTsKK2V4dGVybiBVQ0hBUiBkZWJ1Z19pbmRleFtNQVhfQ0FSRFNdOwordm9pZCBEZWJ1Z19Mb2FkKFVDSEFSIHBfY2FyZCwgVUNIQVIgcF9idWdfZGF0YSk7CisjZW5kaWYKKyovCisKKyNpZiAoRldfVFlQRT09X1NDQ0JfTUdSXykKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2NjYk1ncl9zZW5zZV9hZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGFuZC9vciBTZWFyY2ggZm9yIGNhcmRzIGFuZCByZXR1cm4gaW5mbyB0byBjYWxsZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgU2NjYk1ncl9zZW5zZV9hZGFwdGVyKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKQoreworI2lmIGRlZmluZWQoRE9TKQorI2Vsc2UKKyAgIHN0YXRpYyBVQ0hBUiBmaXJzdF90aW1lID0gMTsKKyNlbmRpZgorCisgICBVQ0hBUiBpLGosaWQsU2NhbUZsZzsKKyAgIFVTSE9SVCB0ZW1wLHRlbXAyLHRlbXAzLHRlbXA0LHRlbXA1LHRlbXA2OworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGlvcG9ydDsKKyNlbHNlCisgICBVTE9ORyBpb3BvcnQ7CisjZW5kaWYKKwlQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGlvcG9ydCA9IChVU0hPUlQpcENhcmRJbmZvLT5zaV9iYXNlYWRkcjsKKyNlbHNlCisgICBpb3BvcnQgPSBwQ2FyZEluZm8tPnNpX2Jhc2VhZGRyOworI2VuZGlmCisKKworICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3ZlbmRvcl9pZF8wKSAhPSBPUklPTl9WRU5EXzApCisgICAgICByZXR1cm4oKGludClGQUlMVVJFKTsKKworICAgaWYgKChSRF9IQVJQT09OKGlvcG9ydCtocF92ZW5kb3JfaWRfMSkgIT0gT1JJT05fVkVORF8xKSkKKyAgICAgIHJldHVybigoaW50KUZBSUxVUkUpOworCisgICBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX2RldmljZV9pZF8wKSAhPSBPUklPTl9ERVZfMCkpCisgICAgICByZXR1cm4oKGludClGQUlMVVJFKTsKKworICAgaWYgKChSRF9IQVJQT09OKGlvcG9ydCtocF9kZXZpY2VfaWRfMSkgIT0gT1JJT05fREVWXzEpKQorICAgICAgcmV0dXJuKChpbnQpRkFJTFVSRSk7CisKKworICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3Jldl9udW0pICE9IDB4MGYpeworCisvKiBGb3IgbmV3IEhhcnBvb24gdGhlbiBjaGVjayBmb3Igc3ViX2RldmljZSBJRCBMU0IKKyAgIHRoZSBiaXRzKDAtMykgbXVzdCBiZSBhbGwgWkVSTyBmb3IgY29tcGF0aWJsZSB3aXRoCisgICBjdXJyZW50IHZlcnNpb24gb2YgU0NDQk1nciwgZWxzZSBza2lwIHRoaXMgSGFycG9vbgorCWRldmljZS4gKi8KKworCSAgIGlmIChSRF9IQVJQT09OKGlvcG9ydCtocF9zdWJfZGV2aWNlX2lkXzApICYgMHgwZikKKwkgICAgICByZXR1cm4oKGludClGQUlMVVJFKTsKKwl9CisKKyAgIGlmIChmaXJzdF90aW1lKQorICAgICAgeworICAgICAgU2NjYk1nclRhYmxlSW5pdEFsbCgpOworICAgICAgZmlyc3RfdGltZSA9IDA7CisJCW1iQ2FyZHMgPSAwOworICAgICAgfQorCisJaWYoUmRTdGFjayhpb3BvcnQsIDApICE9IDB4MDApIHsKKwkJaWYoQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoaW9wb3J0KSA9PSBGQUxTRSkKKwkJeworCQkJcEN1cnJOdlJhbSA9IE5VTEw7CisJCSAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSwgMHgwMCk7CisJCQlYYm93SW5pdChpb3BvcnQsIDApOyAgICAgICAgICAgICAvKk11c3QgSW5pdCB0aGUgU0NTSSBiZWZvcmUgYXR0ZW1wdGluZyAqLworCQkJRGlhZ0VFUFJPTShpb3BvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYobWJDYXJkcyA8IE1BWF9NQl9DQVJEUykgeworCQkJCXBDdXJyTnZSYW0gPSAmbnZSYW1JbmZvW21iQ2FyZHNdOworCQkJCW1iQ2FyZHMrKzsKKwkJCQlwQ3Vyck52UmFtLT5uaUJhc2VBZGRyID0gaW9wb3J0OworCQkJCVJOVlJhbURhdGEocEN1cnJOdlJhbSk7CisJCQl9ZWxzZQorCQkJCXJldHVybigoaW50KSBGQUlMVVJFKTsKKwkJfQorCX1lbHNlCisJCXBDdXJyTnZSYW0gPSBOVUxMOworI2lmIGRlZmluZWQgKE5PX0JJT1NfT1BUSU9OKQorCXBDdXJyTnZSYW0gPSBOVUxMOworICAgWGJvd0luaXQoaW9wb3J0LCAwKTsgICAgICAgICAgICAgICAgLypNdXN0IEluaXQgdGhlIFNDU0kgYmVmb3JlIGF0dGVtcHRpbmcgKi8KKyAgIERpYWdFRVBST00oaW9wb3J0KTsKKyNlbmRpZiAgLyogTm8gQklPUyBPcHRpb24gKi8KKworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfY2xrY3RybF8wLCBDTEtDVFJMX0RFRkFVTFQpOworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworCisJaWYocEN1cnJOdlJhbSkKKwkJcENhcmRJbmZvLT5zaV9pZCA9IHBDdXJyTnZSYW0tPm5pQWRhcElkOworCWVsc2UKKwkgICBwQ2FyZEluZm8tPnNpX2lkID0gKFVDSEFSKSh1dGlsRUVSZWFkKGlvcG9ydCwgKEFEQVBURVJfU0NTSV9JRC8yKSkgJgorICAgCSAgIChVQ0hBUikweDBGRik7CisKKyAgIHBDYXJkSW5mby0+c2lfbHVuID0gMHgwMDsKKyAgIHBDYXJkSW5mby0+c2lfZndfcmV2aXNpb24gPSBPUklPTl9GV19SRVY7CisgICB0ZW1wMiA9IDB4MDAwMDsKKyAgIHRlbXAzID0gMHgwMDAwOworICAgdGVtcDQgPSAweDAwMDA7CisgICB0ZW1wNSA9IDB4MDAwMDsKKyAgIHRlbXA2ID0gMHgwMDAwOworCisgICBmb3IgKGlkID0gMDsgaWQgPCAoMTYvMik7IGlkKyspIHsKKworCQlpZihwQ3Vyck52UmFtKXsKKwkJCXRlbXAgPSAoVVNIT1JUKSBwQ3Vyck52UmFtLT5uaVN5bmNUYmxbaWRdOworCQkJdGVtcCA9ICgodGVtcCAmIDB4MDMpICsgKCh0ZW1wIDw8IDQpICYgMHhjMCkpICsKKwkJCQkJICgoKHRlbXAgPDwgNCkgJiAweDAzMDApICsgKCh0ZW1wIDw8IDgpICYgMHhjMDAwKSk7CisJCX1lbHNlCisJICAgICAgdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCAoVVNIT1JUKSgoU1lOQ19SQVRFX1RCTC8yKStpZCkpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgdGVtcCA+Pj04LGkrKykgeworCisgICAgICAgICB0ZW1wMiA+Pj0gMTsKKyAgICAgICAgIHRlbXAzID4+PSAxOworICAgICAgICAgdGVtcDQgPj49IDE7CisgICAgICAgICB0ZW1wNSA+Pj0gMTsKKyAgICAgICAgIHRlbXA2ID4+PSAxOworCSBzd2l0Y2ggKHRlbXAgJiAweDMpCisJICAgeworCSAgIGNhc2UgQVVUT19SQVRFXzIwOgkvKiBTeW5jaHJvbm91cywgMjAgbWVnYS10cmFuc2ZlcnMvc2Vjb25kICovCisJICAgICB0ZW1wNiB8PSAweDgwMDA7CS8qIEZhbGwgdGhyb3VnaCAqLworCSAgIGNhc2UgQVVUT19SQVRFXzEwOgkvKiBTeW5jaHJvbm91cywgMTAgbWVnYS10cmFuc2ZlcnMvc2Vjb25kICovCisJICAgICB0ZW1wNSB8PSAweDgwMDA7CS8qIEZhbGwgdGhyb3VnaCAqLworCSAgIGNhc2UgQVVUT19SQVRFXzA1OgkvKiBTeW5jaHJvbm91cywgNSBtZWdhLXRyYW5zZmVycy9zZWNvbmQgKi8KKwkgICAgIHRlbXAyIHw9IDB4ODAwMDsJLyogRmFsbCB0aHJvdWdoICovCisJICAgY2FzZSBBVVRPX1JBVEVfMDA6CS8qIEFzeW5jaHJvbm91cyAqLworCSAgICAgYnJlYWs7CisJICAgfQorCisgICAgICAgICBpZiAodGVtcCAmIERJU0NfRU5BQkxFX0JJVCkKKwkgICB0ZW1wMyB8PSAweDgwMDA7CisKKyAgICAgICAgIGlmICh0ZW1wICYgV0lERV9ORUdPX0JJVCkKKwkgICB0ZW1wNCB8PSAweDgwMDA7CisKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgcENhcmRJbmZvLT5zaV9wZXJfdGFyZ19pbml0X3N5bmMgPSB0ZW1wMjsKKyAgIHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfbm9fZGlzYyA9IHRlbXAzOworICAgcENhcmRJbmZvLT5zaV9wZXJfdGFyZ193aWRlX25lZ28gPSB0ZW1wNDsKKyAgIHBDYXJkSW5mby0+c2lfcGVyX3RhcmdfZmFzdF9uZWdvID0gdGVtcDU7CisgICBwQ2FyZEluZm8tPnNpX3Blcl90YXJnX3VsdHJhX25lZ28gPSB0ZW1wNjsKKworCWlmKHBDdXJyTnZSYW0pCisJCWkgPSBwQ3Vyck52UmFtLT5uaVN5c0NvbmY7CisJZWxzZQorCSAgIGkgPSAoVUNIQVIpKHV0aWxFRVJlYWQoaW9wb3J0LCAoU1lTVEVNX0NPTkZJRy8yKSkpOworCisJaWYocEN1cnJOdlJhbSkKKwkJU2NhbUZsZyA9IHBDdXJyTnZSYW0tPm5pU2NhbUNvbmY7CisJZWxzZQorCSAgIFNjYW1GbGcgPSAoVUNIQVIpIHV0aWxFRVJlYWQoaW9wb3J0LCBTQ0FNX0NPTkZJRy8yKTsKKworICAgcENhcmRJbmZvLT5zaV9mbGFncyA9IDB4MDAwMDsKKworICAgaWYgKGkgJiAweDAxKQorICAgICAgcENhcmRJbmZvLT5zaV9mbGFncyB8PSBTQ1NJX1BBUklUWV9FTkE7CisKKyAgIGlmICghKGkgJiAweDAyKSkKKyAgICAgIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gU09GVF9SRVNFVDsKKworICAgaWYgKGkgJiAweDEwKQorICAgICAgcENhcmRJbmZvLT5zaV9mbGFncyB8PSBFWFRFTkRFRF9UUkFOU0xBVElPTjsKKworICAgaWYgKFNjYW1GbGcgJiBTQ0FNX0VOQUJMRUQpCisgICAgIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gRkxBR19TQ0FNX0VOQUJMRUQ7CisKKyAgIGlmIChTY2FtRmxnICYgU0NBTV9MRVZFTDIpCisgICAgIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gRkxBR19TQ0FNX0xFVkVMMjsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9ibV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0wpOworICAgaWYgKGkgJiAweDA0KSB7CisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfTDsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2JtX2N0cmwsIGogKTsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0gpOworICAgaWYgKGkgJiAweDA4KSB7CisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworICAgaWYgKCEoUkRfSEFSUE9PTihpb3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpKQorCisgICAgICBwQ2FyZEluZm8tPnNpX2ZsYWdzIHw9IFNVUFBPUlRfMTZUQVJfMzJMVU47CisKKyAgIHBDYXJkSW5mby0+c2lfY2FyZF9mYW1pbHkgPSBIQVJQT09OX0ZBTUlMWTsKKyAgIHBDYXJkSW5mby0+c2lfYnVzdHlwZSA9IEJVU1RZUEVfUENJOworCisJaWYocEN1cnJOdlJhbSl7CisgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzBdID0gJzknOworCQlzd2l0Y2gocEN1cnJOdlJhbS0+bmlNb2RlbCAmIDB4MGYpeworCQkJY2FzZSBNT0RFTF9MVDoKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsxXSA9ICczJzsKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9ICcwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTU9ERUxfTFc6CisJCSAgIAlwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMV0gPSAnNSc7CisJCSAgIAlwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMl0gPSAnMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVMX0RMOgorCQkgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzFdID0gJzMnOworCQkgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzJdID0gJzInOworCQkJCWJyZWFrOworCQkJY2FzZSBNT0RFTF9EVzoKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsxXSA9ICc1JzsKKwkJICAgCXBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9ICcyJzsKKwkJCQlicmVhazsKKwkJfQorCX1lbHNleworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMC8yKSk7CisgICAJcENhcmRJbmZvLT5zaV9jYXJkX21vZGVsWzBdID0gKFVDSEFSKSh0ZW1wID4+IDgpOworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMi8yKSk7CisKKyAgIAlwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMV0gPSAoVUNIQVIpKHRlbXAgJiAweDAwRkYpOworCSAgIHBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9IChVQ0hBUikodGVtcCA+PiA4KTsKKwl9CisKKyAgIGlmIChwQ2FyZEluZm8tPnNpX2NhcmRfbW9kZWxbMV0gPT0gJzMnKQorICAgICB7CisgICAgICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwpICYgQklUKDcpKQorCSBwQ2FyZEluZm8tPnNpX2ZsYWdzIHw9IExPV19CWVRFX1RFUk07CisgICAgIH0KKyAgIGVsc2UgaWYgKHBDYXJkSW5mby0+c2lfY2FyZF9tb2RlbFsyXSA9PSAnMCcpCisgICAgIHsKKyAgICAgICB0ZW1wID0gUkRfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQpOworICAgICAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAodGVtcCAmIH5CSVQoNCkpKTsKKyAgICAgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCkgJiBCSVQoNykpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gTE9XX0JZVEVfVEVSTTsKKyAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF94ZmVyX3BhZCwgKHRlbXAgfCBCSVQoNCkpKTsKKyAgICAgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCkgJiBCSVQoNykpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gSElHSF9CWVRFX1RFUk07CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQsIHRlbXApOworICAgICB9CisgICBlbHNlCisgICAgIHsKKyAgICAgICB0ZW1wID0gUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCk7CisgICAgICAgdGVtcDIgPSBSRF9IQVJQT09OKGlvcG9ydCtocF94ZmVyX3BhZCk7CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCwgKHRlbXAgfCBTRUVfQ1MpKTsKKyAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF94ZmVyX3BhZCwgKHRlbXAyIHwgQklUKDQpKSk7CisgICAgICAgdGVtcDMgPSAwOworICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJIHsKKwkgICB0ZW1wMyA8PD0gMTsKKwkgICBpZiAoIShSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIEJJVCg3KSkpCisJICAgICB0ZW1wMyB8PSAxOworCSAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAodGVtcDIgJiB+QklUKDQpKSk7CisJICAgV1JfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQsICh0ZW1wMiB8IEJJVCg0KSkpOworCSB9CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCwgdGVtcCk7CisgICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfeGZlcl9wYWQsIHRlbXAyKTsKKyAgICAgICBpZiAoISh0ZW1wMyAmIEJJVCg3KSkpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gTE9XX0JZVEVfVEVSTTsKKyAgICAgICBpZiAoISh0ZW1wMyAmIEJJVCg2KSkpCisJIHBDYXJkSW5mby0+c2lfZmxhZ3MgfD0gSElHSF9CWVRFX1RFUk07CisgICAgIH0KKworCisgICBBUkFNX0FDQ0VTUyhpb3BvcnQpOworCisgICBmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKworICAgICAgcENhcmRJbmZvLT5zaV9YbGF0SW5mb1tpXSA9CisgICAgICAgICBSRF9IQVJQT09OKGlvcG9ydCtocF9hcmFtQmFzZStCSU9TX0RBVEFfT0ZGU0VUK2kpOworICAgICAgfQorCisJLyogcmV0dXJuIHdpdGggLTEgaWYgbm8gc29ydCwgZWxzZSByZXR1cm4gd2l0aAorCSAgIGxvZ2ljYWwgY2FyZCBudW1iZXIgc29ydGVkIGJ5IEJJT1MgKHplcm8tYmFzZWQpICovCisKKwlwQ2FyZEluZm8tPnNpX3JlbGF0aXZlX2NhcmRudW0gPQorCShVQ0hBUikoUkRfSEFSUE9PTihpb3BvcnQraHBfYXJhbUJhc2UrQklPU19SRUxBVElWRV9DQVJEKS0xKTsKKworICAgU0dSQU1fQUNDRVNTKGlvcG9ydCk7CisKKyAgIHNfUGhhc2VUYmxbMF0gPSBwaGFzZURhdGFPdXQ7CisgICBzX1BoYXNlVGJsWzFdID0gcGhhc2VEYXRhSW47CisgICBzX1BoYXNlVGJsWzJdID0gcGhhc2VJbGxlZ2FsOworICAgc19QaGFzZVRibFszXSA9IHBoYXNlSWxsZWdhbDsKKyAgIHNfUGhhc2VUYmxbNF0gPSBwaGFzZUNvbW1hbmQ7CisgICBzX1BoYXNlVGJsWzVdID0gcGhhc2VTdGF0dXM7CisgICBzX1BoYXNlVGJsWzZdID0gcGhhc2VNc2dPdXQ7CisgICBzX1BoYXNlVGJsWzddID0gcGhhc2VNc2dJbjsKKworICAgcENhcmRJbmZvLT5zaV9wcmVzZW50ID0gMHgwMTsKKworI2lmIGRlZmluZWQoQlVHQlVHKQorCisKKyAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ0FSRFM7IGkrKykgeworCisgICAgICBmb3IgKGlkPTA7IGlkPGRlYnVnX3NpemU7IGlkKyspCisgICAgICAgICBkZWJ1Z19pbnRbaV1baWRdID0gIChVQ0hBUikweDAwOworICAgICAgZGVidWdfaW5kZXhbaV0gPSAwOworICAgICAgfQorCisjZW5kaWYKKworICAgcmV0dXJuKDApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JNZ3JfY29uZmlnX2FkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgYWRhcHRlciBmb3Igbm9ybWFsIG9wZXJhdGlvbiAoaGFyZCByZXNldCkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVU0hPUlQgU2NjYk1ncl9jb25maWdfYWRhcHRlcihQU0NDQk1HUl9JTkZPIHBDYXJkSW5mbykKKyNlbHNlCitVTE9ORyBTY2NiTWdyX2NvbmZpZ19hZGFwdGVyKFBTQ0NCTUdSX0lORk8gcENhcmRJbmZvKQorI2VuZGlmCit7CisgICBQU0NDQmNhcmQgQ3VyckNhcmQgPSBOVUxMOworCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKyAgIFVDSEFSIGksaix0aGlzQ2FyZCwgU2NhbUZsZzsKKyAgIFVTSE9SVCB0ZW1wLHN5bmNfYml0X21hcCxpZDsKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCBpb3BvcnQ7CisjZWxzZQorICAgVUxPTkcgaW9wb3J0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGlvcG9ydCA9IChVU0hPUlQpcENhcmRJbmZvLT5zaV9iYXNlYWRkcjsKKyNlbHNlCisgICBpb3BvcnQgPSBwQ2FyZEluZm8tPnNpX2Jhc2VhZGRyOworI2VuZGlmCisKKyAgIGZvcih0aGlzQ2FyZCA9MDsgdGhpc0NhcmQgPD0gTUFYX0NBUkRTOyB0aGlzQ2FyZCsrKSB7CisKKyAgICAgIGlmICh0aGlzQ2FyZCA9PSBNQVhfQ0FSRFMpIHsKKworCSByZXR1cm4oRkFJTFVSRSk7CisgICAgICAgICB9CisKKyAgICAgIGlmIChCTF9DYXJkW3RoaXNDYXJkXS5pb1BvcnQgPT0gaW9wb3J0KSB7CisKKyAgICAgICAgIEN1cnJDYXJkID0gJkJMX0NhcmRbdGhpc0NhcmRdOworICAgICAgICAgU2NjYk1nclRhYmxlSW5pdENhcmQoQ3VyckNhcmQsdGhpc0NhcmQpOworICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKEJMX0NhcmRbdGhpc0NhcmRdLmlvUG9ydCA9PSAweDAwKSB7CisKKyAgICAgICAgIEJMX0NhcmRbdGhpc0NhcmRdLmlvUG9ydCA9IGlvcG9ydDsKKyAgICAgICAgIEN1cnJDYXJkID0gJkJMX0NhcmRbdGhpc0NhcmRdOworCisJCQlpZihtYkNhcmRzKQorCQkJCWZvcihpID0gMDsgaSA8IG1iQ2FyZHM7IGkrKyl7CisJCQkJCWlmKEN1cnJDYXJkLT5pb1BvcnQgPT0gbnZSYW1JbmZvW2ldLm5pQmFzZUFkZHIpCisJCQkJCQlDdXJyQ2FyZC0+cE52UmFtSW5mbyA9ICZudlJhbUluZm9baV07CisJCQkJfQorICAgICAgICAgU2NjYk1nclRhYmxlSW5pdENhcmQoQ3VyckNhcmQsdGhpc0NhcmQpOworICAgICAgICAgQ3VyckNhcmQtPmNhcmRJbmRleCA9IHRoaXNDYXJkOworICAgICAgICAgQ3VyckNhcmQtPmNhcmRJbmZvID0gcENhcmRJbmZvOworCisJIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisJcEN1cnJOdlJhbSA9IEN1cnJDYXJkLT5wTnZSYW1JbmZvOworCisJaWYocEN1cnJOdlJhbSl7CisJCVNjYW1GbGcgPSBwQ3Vyck52UmFtLT5uaVNjYW1Db25mOworCX0KKwllbHNleworCSAgIFNjYW1GbGcgPSAoVUNIQVIpIHV0aWxFRVJlYWQoaW9wb3J0LCBTQ0FNX0NPTkZJRy8yKTsKKwl9CisKKworICAgQnVzTWFzdGVySW5pdChpb3BvcnQpOworICAgWGJvd0luaXQoaW9wb3J0LCBTY2FtRmxnKTsKKworI2lmIGRlZmluZWQgKE5PX0JJT1NfT1BUSU9OKQorCisKKyAgIGlmIChEaWFnWGJvdyhpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisgICBpZiAoRGlhZ0J1c01hc3Rlcihpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisKKyNlbmRpZiAgLyogTm8gQklPUyBPcHRpb24gKi8KKworICAgYXV0b0xvYWREZWZhdWx0TWFwKGlvcG9ydCk7CisKKworICAgZm9yIChpID0gMCxpZCA9IDB4MDE7IGkgIT0gcENhcmRJbmZvLT5zaV9pZDsgaSsrLGlkIDw8PSAxKXt9CisKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbGZpZF8wLCBpZCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zZWxmaWRfMSwgMHgwMCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9hcmJfaWQsIHBDYXJkSW5mby0+c2lfaWQpOworICAgQ3VyckNhcmQtPm91cklkID0gcENhcmRJbmZvLT5zaV9pZDsKKworICAgaSA9IChVQ0hBUikgcENhcmRJbmZvLT5zaV9mbGFnczsKKyAgIGlmIChpICYgU0NTSV9QQVJJVFlfRU5BKQorICAgICAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3BvcnRjdHJsXzEsKEhPU1RfTU9ERTggfCBDSEtfU0NTSV9QKSk7CisKKyAgIGogPSAoUkRfSEFSUE9PTihpb3BvcnQraHBfYm1fY3RybCkgJiB+U0NTSV9URVJNX0VOQV9MKTsKKyAgIGlmIChpICYgTE9XX0JZVEVfVEVSTSkKKyAgICAgIGogfD0gU0NTSV9URVJNX0VOQV9MOworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfYm1fY3RybCwgaik7CisKKyAgIGogPSAoUkRfSEFSUE9PTihpb3BvcnQraHBfZWVfY3RybCkgJiB+U0NTSV9URVJNX0VOQV9IKTsKKyAgIGlmIChpICYgSElHSF9CWVRFX1RFUk0pCisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworCisgICBpZiAoIShwQ2FyZEluZm8tPnNpX2ZsYWdzICYgU09GVF9SRVNFVCkpIHsKKworICAgICAgc3Jlc2IoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgc2NpbmkodGhpc0NhcmQsIHBDYXJkSW5mby0+c2lfaWQsIDApOworICAgICAgfQorCisKKworICAgaWYgKHBDYXJkSW5mby0+c2lfZmxhZ3MgJiBQT1NUX0FMTF9VTkRFUlJSVU5TKQorICAgICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfTk9fRklMVEVSOworCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU3lzQ29uZiAmIDB4MTApCisJCQlDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTWVNURU1fQ09ORklHLzIpKSAmIEdSRUVOX1BDX0VOQSkKKyAgIAkgICBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisKKwkvKiBTZXQgZ2xvYmFsIGZsYWcgdG8gaW5kaWNhdGUgUmUtTmVnb3RpYXRpb24gdG8gYmUgZG9uZSBvbiBhbGwKKwkJY2tlY2sgY29uZGl0aW9uICovCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU2NzaUNvbmYgJiAweDA0KQorCQkJQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKwllbHNleworCSAgIGlmICh1dGlsRUVSZWFkKGlvcG9ydCwgKFNDU0lfQ09ORklHLzIpKSAmIFJFTkVHT19FTkEpCisgICAJICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKworCWlmKHBDdXJyTnZSYW0peworCQlpZihwQ3Vyck52UmFtLT5uaVNjc2lDb25mICYgMHgwOCkKKwkJCUN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTQ1NJX0NPTkZJRy8yKSkgJiBDT05OSU9fRU5BKQorICAgCSAgIEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisKKworICAgdGVtcCA9IHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfbm9fZGlzYzsKKworICAgZm9yIChpID0gMCxpZCA9IDE7IGkgPCBNQVhfU0NTSV9UQVI7IGkrKywgaWQgPDw9IDEpIHsKKworICAgICAgaWYgKHRlbXAgJiBpZCkKKwkgc2NjYk1nclRibFt0aGlzQ2FyZF1baV0uVGFyU3RhdHVzIHw9IFRBUl9BTExPV19ESVNDOworICAgICAgfQorCisgICBzeW5jX2JpdF9tYXAgPSAweDAwMDE7CisKKyAgIGZvciAoaWQgPSAwOyBpZCA8IChNQVhfU0NTSV9UQVIvMik7IGlkKyspIHsKKworCQlpZihwQ3Vyck52UmFtKXsKKwkJCXRlbXAgPSAoVVNIT1JUKSBwQ3Vyck52UmFtLT5uaVN5bmNUYmxbaWRdOworCQkJdGVtcCA9ICgodGVtcCAmIDB4MDMpICsgKCh0ZW1wIDw8IDQpICYgMHhjMCkpICsKKwkJCQkJICgoKHRlbXAgPDwgNCkgJiAweDAzMDApICsgKCh0ZW1wIDw8IDgpICYgMHhjMDAwKSk7CisJCX1lbHNlCisJICAgICAgdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCAoVVNIT1JUKSgoU1lOQ19SQVRFX1RCTC8yKStpZCkpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgdGVtcCA+Pj04LGkrKykgeworCisgICAgICAgICBpZiAocENhcmRJbmZvLT5zaV9wZXJfdGFyZ19pbml0X3N5bmMgJiBzeW5jX2JpdF9tYXApIHsKKworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJFRVZhbHVlID0gKFVDSEFSKXRlbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgeworCSAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpZCoyK2ldLlRhclN0YXR1cyB8PSBTWU5DX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyRUVWYWx1ZSA9CisgICAgICAgICAgICAgICAoVUNIQVIpKHRlbXAgJiB+RUVfU1lOQ19NQVNLKTsKKyAgICAgICAgICAgIH0KKworI2lmIGRlZmluZWQoV0lERV9TQ1NJKQorLyogICAgICAgICBpZiAoKHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfd2lkZV9uZWdvICYgc3luY19iaXRfbWFwKSB8fAorICAgICAgICAgICAgKGlkKjIraSA+PSA4KSl7CisqLworICAgICAgICAgaWYgKHBDYXJkSW5mby0+c2lfcGVyX3Rhcmdfd2lkZV9uZWdvICYgc3luY19iaXRfbWFwKXsKKworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJFRVZhbHVlIHw9IEVFX1dJREVfU0NTSTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsgLyogTkFSUk9XIFNDU0kgKi8KKyAgICAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyU3RhdHVzIHw9IFdJREVfTkVHT0NJQVRFRDsKKyAgICAgICAgICAgIH0KKworI2Vsc2UKKyAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyU3RhdHVzIHw9IFdJREVfTkVHT0NJQVRFRDsKKyNlbmRpZgorCisKKwkgc3luY19iaXRfbWFwIDw8PSAxOworCisKKworICAgICAgICAgfQorICAgICAgfQorCisgICBXUl9IQVJQT09OKChpb3BvcnQraHBfc2VtYXBob3JlKSwKKyAgICAgIChVQ0hBUikoUkRfSEFSUE9PTigoaW9wb3J0K2hwX3NlbWFwaG9yZSkpIHwgU0NDQl9NR1JfUFJFU0VOVCkpOworCisjaWYgZGVmaW5lZChET1MpCisgICByZXR1cm4oKFVTSE9SVClDdXJyQ2FyZCk7CisjZWxzZQorICAgcmV0dXJuKChVTE9ORylDdXJyQ2FyZCk7CisjZW5kaWYKK30KKworI2Vsc2UgIAkJCS8qIGVuZCAoRldfVFlQRT09X1NDQ0JfTUdSXykgICovCisKKworCitTVEFUSUMgczE2Yml0cyBGUF9QcmVzZW5jZUNoZWNrKFBNR1JfSU5GTyBwTWdySW5mbykKK3sKKwlQTUdSX0VOVFJZUE5UUwlwTWdyX0VudHJ5UG50cyA9ICZwTWdySW5mby0+bWlfRnVuY3Rpb25zOworCisgICAgICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3Byb2JlX2FkYXB0ZXIgPSBwcm9iZV9hZGFwdGVyOworICAgICAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9pbml0X2FkYXB0ZXIgPSBpbml0X2FkYXB0ZXI7CisgICAgICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3N0YXJ0X1VDQiA9IFNjY2JNZ3Jfc3RhcnRfc2NjYjsKKyAgICAgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3JfYnVpbGRfVUNCID0gYnVpbGRfVUNCOworICAgICAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9hYm9ydF9VQ0IgPSBTY2NiTWdyX2Fib3J0X3NjY2I7CisgICAgICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX215X2ludCA9IFNjY2JNZ3JfbXlfaW50OworICAgICAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9pc3IgPSBTY2NiTWdyX2lzcjsKKyAgICAgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3Jfc2NzaV9yZXNldCA9IFNjY2JNZ3Jfc2NzaV9yZXNldDsKKyAgICAgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3JfdGltZXJfZXhwaXJlZCA9IFNjY2JNZ3JfdGltZXJfZXhwaXJlZDsKKyNpZm5kZWYgTk9fSU9DVExTCisJICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3VubG9hZF9jYXJkID0gU2NjYk1ncl91bmxvYWRfY2FyZDsKKwkgIHBNZ3JfRW50cnlQbnRzLT5VQ0JNZ3Jfc2F2ZV9mb3JlaWduX3N0YXRlID0KKwkgIAkJCQkJCQkJCVNjY2JNZ3Jfc2F2ZV9mb3JlaWduX3N0YXRlOworCSAgcE1ncl9FbnRyeVBudHMtPlVDQk1ncl9yZXN0b3JlX2ZvcmVpZ25fc3RhdGUgPQorCSAgCQkJCQkJCQkJU2NjYk1ncl9yZXN0b3JlX2ZvcmVpZ25fc3RhdGU7CisJICBwTWdyX0VudHJ5UG50cy0+VUNCTWdyX3Jlc3RvcmVfbmF0aXZlX3N0YXRlID0KKwkgIAkJCQkJCQkJCVNjY2JNZ3JfcmVzdG9yZV9uYXRpdmVfc3RhdGU7CisjZW5kaWYgLypOT19JT0NUTFMqLworCisgICAgICBwTWdySW5mby0+bWlfU0dMaXN0Rm9ybWF0PTB4MDE7CisgICAgICBwTWdySW5mby0+bWlfRGF0YVB0ckZvcm1hdD0weDAxOworICAgICAgcE1nckluZm8tPm1pX01heFNHRWxlbWVudHM9ICh1MTZiaXRzKSAweGZmZmZmZmZmOworICAgICAgcE1nckluZm8tPm1pX01nclByaXZhdGVMZW49c2l6ZW9mKFNDQ0IpOworICAgICAgcE1nckluZm8tPm1pX1BDSVZlbmRvcklEPUJMX1ZFTkRPUl9JRDsKKyAgICAgIHBNZ3JJbmZvLT5taV9QQ0lEZXZpY2VJRD1GUF9ERVZJQ0VfSUQ7CisgICAgICBwTWdySW5mby0+bWlfTWdyQXR0cmlidXRlcz0gQVRUUl9JT19NQVBQRUQgKworCQkJCQkJCQkJCQkgQVRUUl9QSFlTSUNBTF9BRERSRVNTICsKKwkJCQkJCQkJCQkJIEFUVFJfVklSVFVBTF9BRERSRVNTICsKKwkJCQkJCQkJCQkJIEFUVFJfT1ZFUkxBUFBFRF9JT19JT0NUTFNfT0s7CisgICAgICBwTWdySW5mby0+bWlfSW9SYW5nZUxlbiA9IDI1NjsKKyAgICAgIHJldHVybigwKTsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHByb2JlX2FkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgYW5kL29yIFNlYXJjaCBmb3IgY2FyZHMgYW5kIHJldHVybiBpbmZvIHRvIGNhbGxlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitTVEFUSUMgczMyYml0cyBwcm9iZV9hZGFwdGVyKFBBREFQVEVSX0lORk8gcEFkYXB0ZXJJbmZvKQoreworICAgdTE2Yml0cyB0ZW1wLHRlbXAyLHRlbXAzLHRlbXA0OworICAgdTA4Yml0cyBpLGosaWQ7CisKKyNpZiBkZWZpbmVkKERPUykKKyNlbHNlCisgICBzdGF0aWMgdTA4Yml0cyBmaXJzdF90aW1lID0gMTsKKyNlbmRpZgorICAgQkFTRV9QT1JUIGlvcG9ydDsKKwlQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisKKyAgIGlvcG9ydCA9IChCQVNFX1BPUlQpcEFkYXB0ZXJJbmZvLT5haV9iYXNlYWRkcjsKKworCisKKyAgIGlmIChSRF9IQVJQT09OKGlvcG9ydCtocF92ZW5kb3JfaWRfMCkgIT0gT1JJT05fVkVORF8wKQorICAgICAgcmV0dXJuKDEpOworCisgICBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX3ZlbmRvcl9pZF8xKSAhPSBPUklPTl9WRU5EXzEpKQorICAgICAgcmV0dXJuKDIpOworCisgICBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX2RldmljZV9pZF8wKSAhPSBPUklPTl9ERVZfMCkpCisgICAgICByZXR1cm4oMyk7CisKKyAgIGlmICgoUkRfSEFSUE9PTihpb3BvcnQraHBfZGV2aWNlX2lkXzEpICE9IE9SSU9OX0RFVl8xKSkKKyAgICAgIHJldHVybig0KTsKKworCisgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfcmV2X251bSkgIT0gMHgwZil7CisKKworLyogRm9yIG5ldyBIYXJwb29uIHRoZW4gY2hlY2sgZm9yIHN1Yl9kZXZpY2UgSUQgTFNCCisgICB0aGUgYml0cygwLTMpIG11c3QgYmUgYWxsIFpFUk8gZm9yIGNvbXBhdGlibGUgd2l0aAorICAgY3VycmVudCB2ZXJzaW9uIG9mIFNDQ0JNZ3IsIGVsc2Ugc2tpcCB0aGlzIEhhcnBvb24KKwlkZXZpY2UuICovCisKKwkgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfc3ViX2RldmljZV9pZF8wKSAmIDB4MGYpCisJICAgICAgcmV0dXJuKDUpOworCX0KKworICAgaWYgKGZpcnN0X3RpbWUpIHsKKworICAgICAgU2NjYk1nclRhYmxlSW5pdEFsbCgpOworICAgICAgZmlyc3RfdGltZSA9IDA7CisJCW1iQ2FyZHMgPSAwOworICAgICAgfQorCisJaWYoUmRTdGFjayhpb3BvcnQsIDApICE9IDB4MDApIHsKKwkJaWYoQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoaW9wb3J0KSA9PSBGQUxTRSkKKwkJeworCQkJcEN1cnJOdlJhbSA9IE5VTEw7CisJCSAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSwgMHgwMCk7CisJCQlYYm93SW5pdChpb3BvcnQsIDApOyAgICAgICAgICAgICAgICAvKk11c3QgSW5pdCB0aGUgU0NTSSBiZWZvcmUgYXR0ZW1wdGluZyAqLworCQkJRGlhZ0VFUFJPTShpb3BvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYobWJDYXJkcyA8IE1BWF9NQl9DQVJEUykgeworCQkJCXBDdXJyTnZSYW0gPSAmbnZSYW1JbmZvW21iQ2FyZHNdOworCQkJCW1iQ2FyZHMrKzsKKwkJCQlwQ3Vyck52UmFtLT5uaUJhc2VBZGRyID0gaW9wb3J0OworCQkJCVJOVlJhbURhdGEocEN1cnJOdlJhbSk7CisJCQl9ZWxzZQorCQkJCXJldHVybigoaW50KSBGQUlMVVJFKTsKKwkJfQorCX1lbHNlCisJCXBDdXJyTnZSYW0gPSBOVUxMOworCisjaWYgZGVmaW5lZCAoTk9fQklPU19PUFRJT04pCisJcEN1cnJOdlJhbSA9IE5VTEw7CisgICBYYm93SW5pdChpb3BvcnQsIDApOyAgICAgICAgICAgICAgICAvKk11c3QgSW5pdCB0aGUgU0NTSSBiZWZvcmUgYXR0ZW1wdGluZyAqLworICAgRGlhZ0VFUFJPTShpb3BvcnQpOworI2VuZGlmICAvKiBObyBCSU9TIE9wdGlvbiAqLworCisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zeXNfY3RybCwgMHgwMCk7CisKKwlpZihwQ3Vyck52UmFtKQorCQlwQWRhcHRlckluZm8tPmFpX2lkID0gcEN1cnJOdlJhbS0+bmlBZGFwSWQ7CisJZWxzZQorICAgCXBBZGFwdGVySW5mby0+YWlfaWQgPSAodTA4Yml0cykodXRpbEVFUmVhZChpb3BvcnQsIChBREFQVEVSX1NDU0lfSUQvMikpICYKKyAgICAgIAkodTA4Yml0cykweDBGRik7CisKKyAgIHBBZGFwdGVySW5mby0+YWlfbHVuID0gMHgwMDsKKyAgIHBBZGFwdGVySW5mby0+YWlfZndfcmV2aXNpb25bMF0gPSAnMyc7CisgICBwQWRhcHRlckluZm8tPmFpX2Z3X3JldmlzaW9uWzFdID0gJzEnOworICAgcEFkYXB0ZXJJbmZvLT5haV9md19yZXZpc2lvblsyXSA9ICcxJzsKKyAgIHBBZGFwdGVySW5mby0+YWlfZndfcmV2aXNpb25bM10gPSAnICc7CisgICBwQWRhcHRlckluZm8tPmFpX051bUNoYW5uZWxzID0gMTsKKworICAgdGVtcDIgPSAweDAwMDA7CisgICB0ZW1wMyA9IDB4MDAwMDsKKyAgIHRlbXA0ID0gMHgwMDAwOworCisgICBmb3IgKGlkID0gMDsgaWQgPCAoMTYvMik7IGlkKyspIHsKKworCQlpZihwQ3Vyck52UmFtKXsKKwkJCXRlbXAgPSAoVVNIT1JUKSBwQ3Vyck52UmFtLT5uaVN5bmNUYmxbaWRdOworCQkJdGVtcCA9ICgodGVtcCAmIDB4MDMpICsgKCh0ZW1wIDw8IDQpICYgMHhjMCkpICsKKwkJCQkJICgoKHRlbXAgPDwgNCkgJiAweDAzMDApICsgKCh0ZW1wIDw8IDgpICYgMHhjMDAwKSk7CisJCX1lbHNlCisJICAgICAgdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCAodTE2Yml0cykoKFNZTkNfUkFURV9UQkwvMikraWQpKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IHRlbXAgPj49OCxpKyspIHsKKworICAgICAgICAgaWYgKCh0ZW1wICYgMHgwMykgIT0gQVVUT19SQVRFXzAwKSB7CisKKyAgICAgICAgICAgIHRlbXAyID4+PSAweDAxOworICAgICAgICAgICAgdGVtcDIgfD0gMHg4MDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRlbXAyID4+PSAweDAxOworICAgICAgICAgICAgfQorCisgICAgICAgICBpZiAodGVtcCAmIERJU0NfRU5BQkxFX0JJVCkgeworCisgICAgICAgICAgICB0ZW1wMyA+Pj0gMHgwMTsKKyAgICAgICAgICAgIHRlbXAzIHw9IDB4ODAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0ZW1wMyA+Pj0gMHgwMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKHRlbXAgJiBXSURFX05FR09fQklUKSB7CisKKyAgICAgICAgICAgIHRlbXA0ID4+PSAweDAxOworICAgICAgICAgICAgdGVtcDQgfD0gMHg4MDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRlbXA0ID4+PSAweDAxOworICAgICAgICAgICAgfQorCisgICAgICAgICB9CisgICAgICB9CisKKyAgIHBBZGFwdGVySW5mby0+YWlfcGVyX3RhcmdfaW5pdF9zeW5jID0gdGVtcDI7CisgICBwQWRhcHRlckluZm8tPmFpX3Blcl90YXJnX25vX2Rpc2MgPSB0ZW1wMzsKKyAgIHBBZGFwdGVySW5mby0+YWlfcGVyX3Rhcmdfd2lkZV9uZWdvID0gdGVtcDQ7CisJaWYocEN1cnJOdlJhbSkKKwkJaSA9IHBDdXJyTnZSYW0tPm5pU3lzQ29uZjsKKwllbHNlCisgICAJaSA9ICh1MDhiaXRzKSh1dGlsRUVSZWFkKGlvcG9ydCwgKFNZU1RFTV9DT05GSUcvMikpKTsKKworICAgLyoKKyAgICoqIGludGVycnVwdHMgYWx3YXlzIGxldmVsLXRyaWdnZXJlZCBmb3IgRmxhc2hQb2ludAorICAgKi8KKyAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IExFVkVMX1RSSUc7CisKKyAgIGlmIChpICYgMHgwMSkKKyAgICAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IFNDU0lfUEFSSVRZX0VOQTsKKworCWlmIChpICYgMHgwMikJLyogU0NTSSBCdXMgcmVzZXQgaW4gQXV0b1NDU0kgU2V0ID8gKi8KKwl7CisJCWlmKHBDdXJyTnZSYW0pCisJCXsKKwkJCWogPSBwQ3Vyck52UmFtLT5uaVNjYW1Db25mOworCQl9CisJCWVsc2UKKwkJeworCQlqID0gKHUwOGJpdHMpIHV0aWxFRVJlYWQoaW9wb3J0LCBTQ0FNX0NPTkZJRy8yKTsKKwkJfQorCQlpZihqICYgU0NBTV9FTkFCTEVEKQorCQl7CisJCQlpZihqICYgU0NBTV9MRVZFTDIpCisJCQl7CisJCQkJcEFkYXB0ZXJJbmZvLT5haV9zdGF0ZWluZm8gfD0gU0NBTTJfRU5BOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IFNDQU0xX0VOQTsKKwkJCX0KKwkJfQorCX0KKyAgIGogPSAoUkRfSEFSUE9PTihpb3BvcnQraHBfYm1fY3RybCkgJiB+U0NTSV9URVJNX0VOQV9MKTsKKyAgIGlmIChpICYgMHgwNCkgeworICAgICAgaiB8PSBTQ1NJX1RFUk1fRU5BX0w7CisgICAgICBwQWRhcHRlckluZm8tPmFpX3N0YXRlaW5mbyB8PSBMT1dfQllURV9URVJNX0VOQTsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2JtX2N0cmwsIGogKTsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0gpOworICAgaWYgKGkgJiAweDA4KSB7CisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgICAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IEhJR0hfQllURV9URVJNX0VOQTsKKyAgICAgIH0KKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworCWlmKFJEX0hBUlBPT04oaW9wb3J0ICsgaHBfcGFnZV9jdHJsKSAmIEJJT1NfU0hBRE9XKQorCXsKKwkJcEFkYXB0ZXJJbmZvLT5haV9GbGFzaFJvbVNpemUgPSA2NCAqIDEwMjQ7CS8qIDY0ayBST00gKi8KKwl9CisJZWxzZQorCXsKKwkJcEFkYXB0ZXJJbmZvLT5haV9GbGFzaFJvbVNpemUgPSAzMiAqIDEwMjQ7CS8qIDMyayBST00gKi8KKwl9CisKKyAgIHBBZGFwdGVySW5mby0+YWlfc3RhdGVpbmZvIHw9IChGQVNUMjBfRU5BIHwgVEFHX1FVRVVFX0VOQSk7CisgICBpZiAoIShSRF9IQVJQT09OKGlvcG9ydCtocF9wYWdlX2N0cmwpICYgTkFSUk9XX1NDU0lfQ0FSRCkpCisJeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9hdHRyaWJ1dGVzIHw9IChXSURFX0NBUEFCTEUgfCBGQVNUMjBfQ0FQQUJMRQorCQkJCQkJCQkJCQkJCXwgU0NBTTJfQ0FQQUJMRQorCQkJCQkJCQkJCQkJCXwgVEFHX1FVRVVFX0NBUEFCTEUKKwkJCQkJCQkJCQkJCQl8IFNVUFJFU1NfVU5ERVJSUlVOU19DQVBBQkxFCisJCQkJCQkJCQkJCQkJfCBTQ1NJX1BBUklUWV9DQVBBQkxFKTsKKwkJcEFkYXB0ZXJJbmZvLT5haV9NYXhUYXJnID0gMTY7CisJCXBBZGFwdGVySW5mby0+YWlfTWF4THVuICA9IDMyOworCX0KKwllbHNlCisJeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9hdHRyaWJ1dGVzIHw9IChGQVNUMjBfQ0FQQUJMRSB8IFNDQU0yX0NBUEFCTEUKKwkJCQkJCQkJCQkJCQl8IFRBR19RVUVVRV9DQVBBQkxFCisJCQkJCQkJCQkJCQkJfCBTVVBSRVNTX1VOREVSUlJVTlNfQ0FQQUJMRQorCQkJCQkJCQkJCQkJCXwgU0NTSV9QQVJJVFlfQ0FQQUJMRSk7CisJCXBBZGFwdGVySW5mby0+YWlfTWF4VGFyZyA9IDg7CisJCXBBZGFwdGVySW5mby0+YWlfTWF4THVuICA9IDg7CisJfQorCisgICBwQWRhcHRlckluZm8tPmFpX3Byb2R1Y3RfZmFtaWx5ID0gSEFSUE9PTl9GQU1JTFk7CisgICBwQWRhcHRlckluZm8tPmFpX0hCQWJ1c3R5cGUgPSBCVVNUWVBFX1BDSTsKKworICAgZm9yIChpPTA7aTxDQVJEX01PREVMX05BTUVMRU47aSsrKQorICAgeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsW2ldPScgJzsgLyogaW5pdGlhbGl6ZSB0aGUgYWlfY2FyZF9tb2RlbCAqLworICAgfQorCisJaWYocEN1cnJOdlJhbSl7CisJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzBdID0gJzknOworCQlzd2l0Y2gocEN1cnJOdlJhbS0+bmlNb2RlbCAmIDB4MGYpeworCQkJY2FzZSBNT0RFTF9MVDoKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsxXSA9ICczJzsKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsyXSA9ICcwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTU9ERUxfTFc6CisJCQlwQWRhcHRlckluZm8tPmFpX2NhcmRfbW9kZWxbMV0gPSAnNSc7CisJCQlwQWRhcHRlckluZm8tPmFpX2NhcmRfbW9kZWxbMl0gPSAnMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVMX0RMOgorCQkJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzFdID0gJzMnOworCQkJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzJdID0gJzInOworCQkJCWJyZWFrOworCQkJY2FzZSBNT0RFTF9EVzoKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsxXSA9ICc1JzsKKwkJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsyXSA9ICcyJzsKKwkJCQlicmVhazsKKwkJfQorCX1lbHNleworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMC8yKSk7CisJCXBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFswXSA9ICh1MDhiaXRzKSh0ZW1wID4+IDgpOworCSAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKE1PREVMX05VTUJfMi8yKSk7CisKKwkJcEFkYXB0ZXJJbmZvLT5haV9jYXJkX21vZGVsWzFdID0gKHUwOGJpdHMpKHRlbXAgJiAweDAwRkYpOworCSAgIHBBZGFwdGVySW5mby0+YWlfY2FyZF9tb2RlbFsyXSA9ICh1MDhiaXRzKSh0ZW1wID4+IDgpOworCX0KKworCisKKyAgIHBBZGFwdGVySW5mby0+YWlfRmliZXJQcm9kdWN0VHlwZSA9IDA7CisKKyAgIHBBZGFwdGVySW5mby0+YWlfc2Vjb25kYXJ5X3JhbmdlID0gMDsKKworICAgZm9yIChpPTA7aTxXT1JMRF9XSURFX05BTUVMRU47aSsrKQorICAgeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV93b3JsZHdpZGVuYW1lW2ldPSdcMCc7CisgICB9CisKKyAgIGZvciAoaT0wO2k8VkVORE9SX05BTUVMRU47aSsrKQorICAgeworICAgICAgcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbaV09J1wwJzsKKyAgIH0KKyAgIAlwQWRhcHRlckluZm8tPmFpX3ZlbmRvcnN0cmluZ1swXT0nQic7CisgICAJcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbMV09J1UnOworICAgCXBBZGFwdGVySW5mby0+YWlfdmVuZG9yc3RyaW5nWzJdPSdTJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX3ZlbmRvcnN0cmluZ1szXT0nTCc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbNF09J08nOworICAgCXBBZGFwdGVySW5mby0+YWlfdmVuZG9yc3RyaW5nWzVdPSdHJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX3ZlbmRvcnN0cmluZ1s2XT0nSSc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV92ZW5kb3JzdHJpbmdbN109J0MnOworCisJZm9yIChpPTA7aTxGQU1JTFlfTkFNRUxFTjtpKyspCisJeworCSAgIHBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1tpXT0nXDAnOworCX0KKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbMF09J0YnOworICAgCXBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1sxXT0nTCc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV9BZGFwdGVyRmFtaWx5U3RyaW5nWzJdPSdBJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbM109J1MnOworICAgCXBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1s0XT0nSCc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV9BZGFwdGVyRmFtaWx5U3RyaW5nWzVdPSdQJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbNl09J08nOworICAgCXBBZGFwdGVySW5mby0+YWlfQWRhcHRlckZhbWlseVN0cmluZ1s3XT0nSSc7CisgICAJcEFkYXB0ZXJJbmZvLT5haV9BZGFwdGVyRmFtaWx5U3RyaW5nWzhdPSdOJzsKKyAgIAlwQWRhcHRlckluZm8tPmFpX0FkYXB0ZXJGYW1pbHlTdHJpbmdbOV09J1QnOworCisgICBBUkFNX0FDQ0VTUyhpb3BvcnQpOworCisgICBmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKworICAgICAgcEFkYXB0ZXJJbmZvLT5haV9YbGF0SW5mb1tpXSA9CisgICAgICAgICBSRF9IQVJQT09OKGlvcG9ydCtocF9hcmFtQmFzZStCSU9TX0RBVEFfT0ZGU0VUK2kpOworICAgICAgfQorCisJLyogcmV0dXJuIHdpdGggLTEgaWYgbm8gc29ydCwgZWxzZSByZXR1cm4gd2l0aAorCSAgIGxvZ2ljYWwgY2FyZCBudW1iZXIgc29ydGVkIGJ5IEJJT1MgKHplcm8tYmFzZWQpICovCisKKworCXBBZGFwdGVySW5mby0+YWlfcmVsYXRpdmVfY2FyZG51bSA9IAorICAgICAgKHUwOGJpdHMpKFJEX0hBUlBPT04oaW9wb3J0K2hwX2FyYW1CYXNlK0JJT1NfUkVMQVRJVkVfQ0FSRCktMSk7IAorCisgICBTR1JBTV9BQ0NFU1MoaW9wb3J0KTsKKworICAgc19QaGFzZVRibFswXSA9IHBoYXNlRGF0YU91dDsKKyAgIHNfUGhhc2VUYmxbMV0gPSBwaGFzZURhdGFJbjsKKyAgIHNfUGhhc2VUYmxbMl0gPSBwaGFzZUlsbGVnYWw7CisgICBzX1BoYXNlVGJsWzNdID0gcGhhc2VJbGxlZ2FsOworICAgc19QaGFzZVRibFs0XSA9IHBoYXNlQ29tbWFuZDsKKyAgIHNfUGhhc2VUYmxbNV0gPSBwaGFzZVN0YXR1czsKKyAgIHNfUGhhc2VUYmxbNl0gPSBwaGFzZU1zZ091dDsKKyAgIHNfUGhhc2VUYmxbN10gPSBwaGFzZU1zZ0luOworCisgICBwQWRhcHRlckluZm8tPmFpX3ByZXNlbnQgPSAweDAxOworCisjaWYgZGVmaW5lZChCVUdCVUcpCisKKworICAgZm9yIChpID0gMDsgaSA8IE1BWF9DQVJEUzsgaSsrKSB7CisKKyAgICAgIGZvciAoaWQ9MDsgaWQ8ZGVidWdfc2l6ZTsgaWQrKykKKyAgICAgICAgIGRlYnVnX2ludFtpXVtpZF0gPSAgKHUwOGJpdHMpMHgwMDsKKyAgICAgIGRlYnVnX2luZGV4W2ldID0gMDsKKyAgICAgIH0KKworI2VuZGlmCisKKyAgIHJldHVybigwKTsKK30KKworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBpbml0X2FkYXB0ZXIsIGV4cG9ydGVkIHRvIEJVREkgdmlhIFVDQk1ncl9pbml0X2FkYXB0ZXIgZW50cnkKKyAqCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGFkYXB0ZXIgZm9yIG5vcm1hbCBvcGVyYXRpb24gKGhhcmQgcmVzZXQpLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1NUQVRJQyBDQVJEX0hBTkRMRSBpbml0X2FkYXB0ZXIoUEFEQVBURVJfSU5GTyBwQ2FyZEluZm8pCit7CisgICBQU0NDQmNhcmQgQ3VyckNhcmQ7CisJUE5WUmFtSW5mbyBwQ3Vyck52UmFtOworICAgdTA4Yml0cyBpLGosdGhpc0NhcmQsIFNjYW1GbGc7CisgICB1MTZiaXRzIHRlbXAsc3luY19iaXRfbWFwLGlkOworICAgQkFTRV9QT1JUIGlvcG9ydDsKKworICAgaW9wb3J0ID0gKEJBU0VfUE9SVClwQ2FyZEluZm8tPmFpX2Jhc2VhZGRyOworCisgICBmb3IodGhpc0NhcmQgPTA7IHRoaXNDYXJkIDw9IE1BWF9DQVJEUzsgdGhpc0NhcmQrKykgeworCisgICAgICBpZiAodGhpc0NhcmQgPT0gTUFYX0NBUkRTKSB7CisKKyAgICAgICAgIHJldHVybihGQUlMVVJFKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKEJMX0NhcmRbdGhpc0NhcmRdLmlvUG9ydCA9PSBpb3BvcnQpIHsKKworICAgICAgICAgQ3VyckNhcmQgPSAmQkxfQ2FyZFt0aGlzQ2FyZF07CisgICAgICAgICBTY2NiTWdyVGFibGVJbml0Q2FyZChDdXJyQ2FyZCx0aGlzQ2FyZCk7CisgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSBpZiAoQkxfQ2FyZFt0aGlzQ2FyZF0uaW9Qb3J0ID09IDB4MDApIHsKKworICAgICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uaW9Qb3J0ID0gaW9wb3J0OworICAgICAgICAgQ3VyckNhcmQgPSAmQkxfQ2FyZFt0aGlzQ2FyZF07CisKKwkJCWlmKG1iQ2FyZHMpCisJCQkJZm9yKGkgPSAwOyBpIDwgbWJDYXJkczsgaSsrKXsKKwkJCQkJaWYoQ3VyckNhcmQtPmlvUG9ydCA9PSBudlJhbUluZm9baV0ubmlCYXNlQWRkcikKKwkJCQkJCUN1cnJDYXJkLT5wTnZSYW1JbmZvID0gJm52UmFtSW5mb1tpXTsKKwkJCQl9CisgICAgICAgICBTY2NiTWdyVGFibGVJbml0Q2FyZChDdXJyQ2FyZCx0aGlzQ2FyZCk7CisgICAgICAgICBDdXJyQ2FyZC0+Y2FyZEluZGV4ID0gdGhpc0NhcmQ7CisgICAgICAgICBDdXJyQ2FyZC0+Y2FyZEluZm8gPSBwQ2FyZEluZm87CisKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisJcEN1cnJOdlJhbSA9IEN1cnJDYXJkLT5wTnZSYW1JbmZvOworCisgICAKKwlpZihwQ3Vyck52UmFtKXsKKwkJU2NhbUZsZyA9IHBDdXJyTnZSYW0tPm5pU2NhbUNvbmY7CisJfQorCWVsc2V7CisJICAgU2NhbUZsZyA9IChVQ0hBUikgdXRpbEVFUmVhZChpb3BvcnQsIFNDQU1fQ09ORklHLzIpOworCX0KKwkKKworICAgQnVzTWFzdGVySW5pdChpb3BvcnQpOworICAgWGJvd0luaXQoaW9wb3J0LCBTY2FtRmxnKTsKKworI2lmIGRlZmluZWQgKE5PX0JJT1NfT1BUSU9OKQorCisKKyAgIGlmIChEaWFnWGJvdyhpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisgICBpZiAoRGlhZ0J1c01hc3Rlcihpb3BvcnQpKSByZXR1cm4oRkFJTFVSRSk7CisKKyNlbmRpZiAgLyogTm8gQklPUyBPcHRpb24gKi8KKworICAgYXV0b0xvYWREZWZhdWx0TWFwKGlvcG9ydCk7CisKKworICAgZm9yIChpID0gMCxpZCA9IDB4MDE7IGkgIT0gcENhcmRJbmZvLT5haV9pZDsgaSsrLGlkIDw8PSAxKXt9CisKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX3NlbGZpZF8wLCBpZCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zZWxmaWRfMSwgMHgwMCk7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9hcmJfaWQsIHBDYXJkSW5mby0+YWlfaWQpOworICAgQ3VyckNhcmQtPm91cklkID0gKHVuc2lnbmVkIGNoYXIpIHBDYXJkSW5mby0+YWlfaWQ7CisKKyAgIGkgPSAodTA4Yml0cykgcENhcmRJbmZvLT5haV9zdGF0ZWluZm87CisgICBpZiAoaSAmIFNDU0lfUEFSSVRZX0VOQSkKKyAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9wb3J0Y3RybF8xLChIT1NUX01PREU4IHwgQ0hLX1NDU0lfUCkpOworCisgICBqID0gKFJEX0hBUlBPT04oaW9wb3J0K2hwX2JtX2N0cmwpICYgflNDU0lfVEVSTV9FTkFfTCk7CisgICBpZiAoaSAmIExPV19CWVRFX1RFUk1fRU5BKQorICAgICAgaiB8PSBTQ1NJX1RFUk1fRU5BX0w7CisgICBXUl9IQVJQT09OKGlvcG9ydCtocF9ibV9jdHJsLCBqKTsKKworICAgaiA9IChSRF9IQVJQT09OKGlvcG9ydCtocF9lZV9jdHJsKSAmIH5TQ1NJX1RFUk1fRU5BX0gpOworICAgaWYgKGkgJiBISUdIX0JZVEVfVEVSTV9FTkEpCisgICAgICBqIHw9IFNDU0lfVEVSTV9FTkFfSDsKKyAgIFdSX0hBUlBPT04oaW9wb3J0K2hwX2VlX2N0cmwsIGogKTsKKworCisgICBpZiAoIShwQ2FyZEluZm8tPmFpX3N0YXRlaW5mbyAmIE5PX1JFU0VUX0lOX0lOSVQpKSB7CisKKyAgICAgIHNyZXNiKGlvcG9ydCx0aGlzQ2FyZCk7CisKKyAgICAgICAgIHNjaW5pKHRoaXNDYXJkLCAodTA4Yml0cykgcENhcmRJbmZvLT5haV9pZCwgMCk7CisgICAgICB9CisKKworCisgICBpZiAocENhcmRJbmZvLT5haV9zdGF0ZWluZm8gJiBTVVBSRVNTX1VOREVSUlJVTlNfRU5BKQorICAgICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfTk9fRklMVEVSOworCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU3lzQ29uZiAmIDB4MTApCisJCQlDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTWVNURU1fQ09ORklHLzIpKSAmIEdSRUVOX1BDX0VOQSkKKyAgIAkgICBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9HUkVFTl9QQzsKKwl9CisKKwkvKiBTZXQgZ2xvYmFsIGZsYWcgdG8gaW5kaWNhdGUgUmUtTmVnb3RpYXRpb24gdG8gYmUgZG9uZSBvbiBhbGwKKwkJY2tlY2sgY29uZGl0aW9uICovCisJaWYocEN1cnJOdlJhbSl7CisJCWlmKHBDdXJyTnZSYW0tPm5pU2NzaUNvbmYgJiAweDA0KQorCQkJQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKwllbHNleworCSAgIGlmICh1dGlsRUVSZWFkKGlvcG9ydCwgKFNDU0lfQ09ORklHLzIpKSAmIFJFTkVHT19FTkEpCisgICAJICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfRE9fUkVORUdPOworCX0KKworCWlmKHBDdXJyTnZSYW0peworCQlpZihwQ3Vyck52UmFtLT5uaVNjc2lDb25mICYgMHgwOCkKKwkJCUN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisJZWxzZXsKKwkgICBpZiAodXRpbEVFUmVhZChpb3BvcnQsIChTQ1NJX0NPTkZJRy8yKSkgJiBDT05OSU9fRU5BKQorICAgCSAgIEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX0NPTkxVTl9JTzsKKwl9CisKKyAgIHRlbXAgPSBwQ2FyZEluZm8tPmFpX3Blcl90YXJnX25vX2Rpc2M7CisKKyAgIGZvciAoaSA9IDAsaWQgPSAxOyBpIDwgTUFYX1NDU0lfVEFSOyBpKyssIGlkIDw8PSAxKSB7CisKKyAgICAgIGlmICh0ZW1wICYgaWQpCisgICAgICAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpXS5UYXJTdGF0dXMgfD0gVEFSX0FMTE9XX0RJU0M7CisgICAgICB9CisKKyAgIHN5bmNfYml0X21hcCA9IDB4MDAwMTsKKworICAgZm9yIChpZCA9IDA7IGlkIDwgKE1BWF9TQ1NJX1RBUi8yKTsgaWQrKyl7CisKKwkJaWYocEN1cnJOdlJhbSl7CisJCQl0ZW1wID0gKFVTSE9SVCkgcEN1cnJOdlJhbS0+bmlTeW5jVGJsW2lkXTsKKwkJCXRlbXAgPSAoKHRlbXAgJiAweDAzKSArICgodGVtcCA8PCA0KSAmIDB4YzApKSArCisJCQkJCSAoKCh0ZW1wIDw8IDQpICYgMHgwMzAwKSArICgodGVtcCA8PCA4KSAmIDB4YzAwMCkpOworCQl9ZWxzZQorCSAgICAgIHRlbXAgPSB1dGlsRUVSZWFkKGlvcG9ydCwgKHUxNmJpdHMpKChTWU5DX1JBVEVfVEJMLzIpK2lkKSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyB0ZW1wID4+PTgsaSsrKXsKKworICAgICAgICAgaWYgKHBDYXJkSW5mby0+YWlfcGVyX3RhcmdfaW5pdF9zeW5jICYgc3luY19iaXRfbWFwKXsKKworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJFRVZhbHVlID0gKHUwOGJpdHMpdGVtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpZCoyK2ldLlRhclN0YXR1cyB8PSBTWU5DX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIHNjY2JNZ3JUYmxbdGhpc0NhcmRdW2lkKjIraV0uVGFyRUVWYWx1ZSA9CisgICAgICAgICAgICAgICAodTA4Yml0cykodGVtcCAmIH5FRV9TWU5DX01BU0spOworICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisvKiAgICAgICAgIGlmICgocENhcmRJbmZvLT5haV9wZXJfdGFyZ193aWRlX25lZ28gJiBzeW5jX2JpdF9tYXApIHx8CisgICAgICAgICAgICAoaWQqMitpID49IDgpKXsKKyovCisgICAgICAgICBpZiAocENhcmRJbmZvLT5haV9wZXJfdGFyZ193aWRlX25lZ28gJiBzeW5jX2JpdF9tYXApeworCisgICAgICAgICAgICBzY2NiTWdyVGJsW3RoaXNDYXJkXVtpZCoyK2ldLlRhckVFVmFsdWUgfD0gRUVfV0lERV9TQ1NJOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgeyAvKiBOQVJST1cgU0NTSSAqLworICAgICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJTdGF0dXMgfD0gV0lERV9ORUdPQ0lBVEVEOworICAgICAgICAgICAgfQorCisjZWxzZQorICAgICAgICAgc2NjYk1nclRibFt0aGlzQ2FyZF1baWQqMitpXS5UYXJTdGF0dXMgfD0gV0lERV9ORUdPQ0lBVEVEOworI2VuZGlmCisKKworICAgICAgICAgc3luY19iaXRfbWFwIDw8PSAxOworICAgICAgICAgfQorICAgICAgfQorCisKKyAgIHBDYXJkSW5mby0+YWlfU0dMaXN0Rm9ybWF0PTB4MDE7CisgICBwQ2FyZEluZm8tPmFpX0RhdGFQdHJGb3JtYXQ9MHgwMTsKKyAgIHBDYXJkSW5mby0+YWlfQUVOX21hc2sgJj0gU0NTSV9SRVNFVF9DT01QTEVURTsKKworICAgV1JfSEFSUE9PTigoaW9wb3J0K2hwX3NlbWFwaG9yZSksCisgICAgICAodTA4Yml0cykoUkRfSEFSUE9PTigoaW9wb3J0K2hwX3NlbWFwaG9yZSkpIHwgU0NDQl9NR1JfUFJFU0VOVCkpOworCisgICByZXR1cm4oKHUzMmJpdHMpQ3VyckNhcmQpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogYnVpbGRfdWNiLCBleHBvcnRlZCB0byBCVURJIHZpYSBVQ0JNZ3JfYnVpbGRfdWNiIGVudHJ5CisgKgorICogRGVzY3JpcHRpb246IHByZXBhcmUgZncgcG9ydGlvbiBvZiB1Y2IuIGRvIG5vdCBzdGFydCwgcmVzb3VyY2Ugbm90IGd1YXJhbnRlZWQKKyAqICAgICAgICAgICAgIHNvIGRvbid0IG1hbmlwdWxhdGUgYW55dGhpbmcgdGhhdCdzIGRlcml2ZWQgZnJvbSBzdGF0ZXMgd2hpY2gKKyAqICAgICAgICAgICAgIG1heSBjaGFuZ2UKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGJ1aWxkX1VDQihDQVJEX0hBTkRMRSBwQ3VyckNhcmQsIFBVQ0IgcF91Y2IpCit7CisKKyAgIHUwOGJpdHMgdGhpc0NhcmQ7CisgICB1MDhiaXRzIGksajsKKworICAgUFNDQ0IgcF9zY2NiOworCisKKyAgIHRoaXNDYXJkID0gKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmNhcmRJbmRleDsKKworCisgICBwX3NjY2I9KFBTQ0NCKXBfdWNiLT5VQ0JfTWdyUHJpdmF0ZVB0cjsKKworCisgICBwX3NjY2ItPlNjY2JfdWNiX3B0cj1wX3VjYjsKKworICAgc3dpdGNoIChwX3VjYi0+VUNCX29wY29kZSAmIChPUENfREVWSUNFX1JFU0VUK09QQ19YRkVSX1NHK09QQ19DSEtfUkVTSURVQUwpKQorICAgeworICAgICAgY2FzZSBPUENfREVWSUNFX1JFU0VUOgorICAgICAgICAgcF9zY2NiLT5PcGVyYXRpb25Db2RlPVJFU0VUX0NPTU1BTkQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDX1hGRVJfU0c6CisgICAgICAgICBwX3NjY2ItPk9wZXJhdGlvbkNvZGU9U0NBVFRFUl9HQVRIRVJfQ09NTUFORDsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBPUENfWEZFUl9TRytPUENfQ0hLX1JFU0lEVUFMOgorICAgICAgICAgcF9zY2NiLT5PcGVyYXRpb25Db2RlPVJFU0lEVUFMX1NHX0NPTU1BTkQ7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgT1BDX0NIS19SRVNJRFVBTDoKKworCSAgICAgIHBfc2NjYi0+T3BlcmF0aW9uQ29kZT1SRVNJRFVBTF9DT01NQU5EOworCSAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgICAgICBwX3NjY2ItPk9wZXJhdGlvbkNvZGU9U0NTSV9JTklUSUFUT1JfQ09NTUFORDsKKwkgICAgICBicmVhazsKKyAgIH0KKworICAgaWYgKHBfdWNiLT5VQ0Jfb3Bjb2RlICYgT1BDX1RRX0VOQUJMRSkKKyAgIHsKKyAgICAgIHBfc2NjYi0+Q29udHJvbEJ5dGUgPSAodTA4Yml0cykoKHBfdWNiLT5VQ0Jfb3Bjb2RlICYgT1BDX1RRX01BU0spPj4yKSB8IEZfVVNFX0NNRF9ROworICAgfQorICAgZWxzZQorICAgeworICAgICAgcF9zY2NiLT5Db250cm9sQnl0ZSA9IDA7CisgICB9CisKKworICAgcF9zY2NiLT5DZGJMZW5ndGggPSAodTA4Yml0cylwX3VjYi0+VUNCX2NkYmxlbjsKKworICAgaWYgKHBfdWNiLT5VQ0Jfb3Bjb2RlICYgT1BDX05PX0FVVE9fU0VOU0UpCisgICB7CisgICAgICBwX3NjY2ItPlJlcXVlc3RTZW5zZUxlbmd0aCA9IDA7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwX3NjY2ItPlJlcXVlc3RTZW5zZUxlbmd0aCA9ICh1bnNpZ25lZCBjaGFyKSBwX3VjYi0+VUNCX3NlbnNlbGVuOworICAgfQorCisKKyAgIGlmIChwX3VjYi0+VUNCX29wY29kZSAmIE9QQ19YRkVSX1NHKQorICAgeworICAgICAgcF9zY2NiLT5EYXRhUG9pbnRlcj1wX3VjYi0+VUNCX3ZpcnRfZGF0YXB0cjsKKyAgICAgIHBfc2NjYi0+RGF0YUxlbmd0aCA9ICgoKHUzMmJpdHMpcF91Y2ItPlVDQl9OdW1TZ0VsZW1lbnRzKTw8Myk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBwX3NjY2ItPkRhdGFQb2ludGVyPXBfdWNiLT5VQ0JfcGh5c19kYXRhcHRyOworICAgICAgcF9zY2NiLT5EYXRhTGVuZ3RoPXBfdWNiLT5VQ0JfZGF0YWxlbjsKKyAgIH07CisKKyAgIHBfc2NjYi0+SG9zdFN0YXR1cz0wOworICAgcF9zY2NiLT5UYXJnZXRTdGF0dXM9MDsKKyAgIHBfc2NjYi0+VGFyZ0lEPSh1bnNpZ25lZCBjaGFyKXBfdWNiLT5VQ0JfdGFyZ2lkOworICAgcF9zY2NiLT5MdW49KHVuc2lnbmVkIGNoYXIpIHBfdWNiLT5VQ0JfbHVuOworICAgcF9zY2NiLT5TY2NiSU9Qb3J0PSgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmlvUG9ydDsKKworICAgaj1wX3VjYi0+VUNCX2NkYmxlbjsKKyAgIGZvciAoaT0wO2k8ajtpKyspCisgICB7CisgICAgICBwX3NjY2ItPkNkYltpXSA9IHBfdWNiLT5VQ0JfY2RiW2ldOworICAgfQorCisgICBwX3NjY2ItPlNlbnNlUG9pbnRlcj1wX3VjYi0+VUNCX3BoeXNfc2Vuc2VwdHI7CisKKyAgIHNpbml0cyhwX3NjY2IsdGhpc0NhcmQpOworCit9CisjaWZuZGVmIE5PX0lPQ1RMUworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBHZXREZXZTeW5jUmF0ZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1NUQVRJQyAgaW50IEdldERldlN5bmNSYXRlKFBTQ0NCY2FyZCBwQ3VyckNhcmQsUFVDQiBwX3VjYikKK3sKKwlzdHJ1Y3QgX1NZTkNfUkFURV9JTkZPICogcFN5bmNTdHI7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisJQkFTRV9QT1JUIGlvcG9ydDsKKwl1MDhiaXRzIHNjc2lJRCwgajsKKworI2lmIChGV19UWVBFICE9IF9TQ0NCX01HUl8pCisJaWYoIHBfdWNiLT5VQ0JfdGFyZ2lkID49IHBDdXJyQ2FyZC0+Y2FyZEluZm8tPmFpX01heFRhcmcgKQorCXsKKwkJcmV0dXJuKDEpOworCX0KKyNlbmRpZgorCisJaW9wb3J0ICA9IHBDdXJyQ2FyZC0+aW9Qb3J0OworCXBTeW5jU3RyCT0gKHN0cnVjdCBfU1lOQ19SQVRFX0lORk8gKikgcF91Y2ItPlVDQl92aXJ0X2RhdGFwdHI7CisJc2NzaUlEID0gKHUwOGJpdHMpIHBfdWNiLT5VQ0JfdGFyZ2lkOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcEN1cnJDYXJkLT5jYXJkSW5kZXhdW3Njc2lJRF07CisJaiA9IGN1cnJUYXJfSW5mby0+VGFyU3luY0N0cmw7CisKKwlzd2l0Y2ggKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykKKwl7CisJCWNhc2UgRUVfU1lOQ19BU1lOQzoKKwkJCXBTeW5jU3RyLT5SZXF1ZXN0TWVnYVhmZXJSYXRlID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIEVFX1NZTkNfNU1COgorCQkJcFN5bmNTdHItPlJlcXVlc3RNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDUwIDogMTAwOworCQkJYnJlYWs7CisJCWNhc2UgRUVfU1lOQ18xME1COgorCQkJcFN5bmNTdHItPlJlcXVlc3RNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDEwMCA6IDIwMDsKKwkJCWJyZWFrOworCQljYXNlIEVFX1NZTkNfMjBNQjoKKwkJCXBTeW5jU3RyLT5SZXF1ZXN0TWVnYVhmZXJSYXRlID0gKGogJiBOQVJST1dfU0NTSSkgPyAyMDAgOiA0MDA7CisJCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChqID4+IDUpICYgMHgwNykKKwl7CisJCWNhc2UgMHgwMDoKKwkJCWlmKChqICYgMHgwNykgPT0gMHgwMCkKKwkJCXsKKwkJCQlwU3luY1N0ci0+QWN0dWFsTWVnYVhmZXJSYXRlID0gMHgwMDsJLyogQXN5bmMgTW9kZSAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBTeW5jU3RyLT5BY3R1YWxNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDIwMCA6IDQwMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDE6CisJCQlwU3luY1N0ci0+QWN0dWFsTWVnYVhmZXJSYXRlID0gKGogJiBOQVJST1dfU0NTSSkgPyAxMDAgOiAyMDA7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gNjYgOiAxMjI7CisJCQlicmVhazsKKwkJY2FzZSAweDAzOgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gNTAgOiAxMDA7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gNDAgOiA4MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDU6CisJCQlwU3luY1N0ci0+QWN0dWFsTWVnYVhmZXJSYXRlID0gKGogJiBOQVJST1dfU0NTSSkgPyAzMyA6IDY2OworCQkJYnJlYWs7CisJCWNhc2UgMHgwNjoKKwkJCXBTeW5jU3RyLT5BY3R1YWxNZWdhWGZlclJhdGUgPSAoaiAmIE5BUlJPV19TQ1NJKSA/IDI4IDogNTY7CisJCQlicmVhazsKKwkJY2FzZSAweDA3OgorCQkJcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZSA9IChqICYgTkFSUk9XX1NDU0kpID8gMjUgOiA1MDsKKwkJCWJyZWFrOworCX0KKwlwU3luY1N0ci0+TmVnb3RpYXRlZE9mZnNldCA9IGogJiAweDBmOworCisJcmV0dXJuKDApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTZXREZXZTeW5jUmF0ZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK1NUQVRJQyBpbnQgU2V0RGV2U3luY1JhdGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCwgUFVDQiBwX3VjYikKK3sKKwlzdHJ1Y3QgX1NZTkNfUkFURV9JTkZPICogcFN5bmNTdHI7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisJQkFTRV9QT1JUIGlvUG9ydDsKKwl1MDhiaXRzIHNjc2lJRCwgaSwgaiwgc3luY1ZhbDsKKwl1MTZiaXRzIHN5bmNPZmZzZXQsIGFjdHVhbFhmZXJSYXRlOworCXVuaW9uIHsKKwkJdTA4Yml0cyB0ZW1wYlsyXTsKKwkJdTE2Yml0cyB0ZW1wdzsKKwl9dGVtcDI7CisKKyNpZiAoRldfVFlQRSAhPSBfU0NDQl9NR1JfKQorCWlmKCBwX3VjYi0+VUNCX3RhcmdpZCA+PSBwQ3VyckNhcmQtPmNhcmRJbmZvLT5haV9NYXhUYXJnICkKKwl7CisJCXJldHVybigxKTsKKwl9CisjZW5kaWYKKworCWlvUG9ydCAgPSBwQ3VyckNhcmQtPmlvUG9ydDsKKwlwU3luY1N0cgk9IChzdHJ1Y3QgX1NZTkNfUkFURV9JTkZPICopIHBfdWNiLT5VQ0JfdmlydF9kYXRhcHRyOworCXNjc2lJRCA9ICh1MDhiaXRzKSBwX3VjYi0+VUNCX3RhcmdpZDsKKyAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BDdXJyQ2FyZC0+Y2FyZEluZGV4XVtzY3NpSURdOworCWkgPSBSRF9IQVJQT09OKGlvUG9ydCtocF94ZmVyX3BhZCk7CQkvKiBTYXZlIGN1cnJlbnQgdmFsdWUgKi8KKwlXUl9IQVJQT09OKGlvUG9ydCtocF94ZmVyX3BhZCwgKGkgfCBJRF9VTkxPQ0spKTsKKwlXUl9IQVJQT09OKGlvUG9ydCtocF9zZWxlY3RfaWQsICgoc2NzaUlEIDw8IDQpIHwgc2NzaUlEKSk7CisJaiA9IFJEX0hBUlBPT04oaW9Qb3J0K2hwX3N5bmN0YXJnXzApOworCVdSX0hBUlBPT04oaW9Qb3J0K2hwX3hmZXJfcGFkLCBpKTsJCS8qIHJlc3RvcmUgdmFsdWUgKi8KKworCWFjdHVhbFhmZXJSYXRlID0gcFN5bmNTdHItPkFjdHVhbE1lZ2FYZmVyUmF0ZTsKKwlpZighKGogJiBOQVJST1dfU0NTSSkpCisJeworCQlhY3R1YWxYZmVyUmF0ZSA8PD0gMTsKKwl9CisJaWYoYWN0dWFsWGZlclJhdGUgPT0gMHgwMCkKKwl7CisJCXN5bmNWYWwgPSBFRV9TWU5DX0FTWU5DOwkJCS8qIEFzeW5jIE1vZGUgKi8KKwl9CisJaWYoYWN0dWFsWGZlclJhdGUgPT0gMHgwMjAwKQorCXsKKwkJc3luY1ZhbCA9IEVFX1NZTkNfMjBNQjsJCQkJLyogMjAvNDAgTUIgTW9kZSAqLworCX0KKwlpZihhY3R1YWxYZmVyUmF0ZSA+IDB4MDA1MCAmJiBhY3R1YWxYZmVyUmF0ZSA8IDB4MDIwMCApCisJeworCQlzeW5jVmFsID0gRUVfU1lOQ18xME1COwkJCQkvKiAxMC8yMCBNQiBNb2RlICovCisJfQorCWVsc2UKKwl7CisJCXN5bmNWYWwgPSBFRV9TWU5DXzVNQjsJCQkJLyogNS8xMCBNQiBNb2RlICovCisJfQorCWlmKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmJiBFRV9TWU5DX01BU0sgPT0gc3luY1ZhbCkKKwkJcmV0dXJuKDApOworCWN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSA9IChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiAhRUVfU1lOQ19NQVNLKQorCQkJCQkJCQkJCQl8IHN5bmNWYWw7CisJc3luY09mZnNldCA9IChTWU5DX1JBVEVfVEJMICsgc2NzaUlEKSAvIDI7CisJdGVtcDIudGVtcHcgPSB1dGlsRUVSZWFkKGlvUG9ydCwgc3luY09mZnNldCk7CisJaWYoc2NzaUlEICYgMHgwMSkKKwl7CisJCXRlbXAyLnRlbXBiWzBdID0gKHRlbXAyLnRlbXBiWzBdICYgIUVFX1NZTkNfTUFTSykgfCBzeW5jVmFsOworCX0KKwllbHNlCisJeworCQl0ZW1wMi50ZW1wYlsxXSA9ICh0ZW1wMi50ZW1wYlsxXSAmICFFRV9TWU5DX01BU0spIHwgc3luY1ZhbDsKKwl9CisJdXRpbEVFV3JpdGVPbk9mZihpb1BvcnQsIDEpOworCXV0aWxFRVdyaXRlKGlvUG9ydCwgdGVtcDIudGVtcHcsIHN5bmNPZmZzZXQpOworCXV0aWxFRVdyaXRlT25PZmYoaW9Qb3J0LCAwKTsKKwlVcGRhdGVDaGVja1N1bShpb1BvcnQpOworCisJcmV0dXJuKDApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogR2V0RGV2V2lkZU1vZGUKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgR2V0RGV2V2lkZU1vZGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKQoreworCXUwOGJpdHMgKnBEYXRhOworCisJcERhdGEgPSAodTA4Yml0cyAqKXBfdWNiLT5VQ0JfdmlydF9kYXRhcHRyOworCWlmKHNjY2JNZ3JUYmxbcEN1cnJDYXJkLT5jYXJkSW5kZXhdW3BfdWNiLT5VQ0JfdGFyZ2lkXS5UYXJFRVZhbHVlCisJCQkJJiBFRV9XSURFX1NDU0kpCisJeworCQkqcERhdGEgPSAxOworCX0KKwllbHNlCisJeworCQkqcERhdGEgPSAwOworCX0KKworCXJldHVybigwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2V0RGV2V2lkZU1vZGUKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgU2V0RGV2V2lkZU1vZGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKQoreworCXUwOGJpdHMgKnBEYXRhOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCUJBU0VfUE9SVCBpb1BvcnQ7CisJdTA4Yml0cyBzY3NpSUQsIHNjc2lXaWRlTW9kZTsKKwl1MTZiaXRzIHN5bmNPZmZzZXQ7CisJdW5pb24geworCQl1MDhiaXRzIHRlbXBiWzJdOworCQl1MTZiaXRzIHRlbXB3OworCX10ZW1wMjsKKworI2lmIChGV19UWVBFICE9IF9TQ0NCX01HUl8pCisJaWYoICEocEN1cnJDYXJkLT5jYXJkSW5mby0+YWlfYXR0cmlidXRlcyAmIFdJREVfQ0FQQUJMRSkgKQorCXsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmKCBwX3VjYi0+VUNCX3RhcmdpZCA+PSBwQ3VyckNhcmQtPmNhcmRJbmZvLT5haV9NYXhUYXJnICkKKwl7CisJCXJldHVybigxKTsKKwl9CisjZW5kaWYKKworCWlvUG9ydCAgPSBwQ3VyckNhcmQtPmlvUG9ydDsKKwlwRGF0YSA9ICh1MDhiaXRzICopcF91Y2ItPlVDQl92aXJ0X2RhdGFwdHI7CisJc2NzaUlEID0gKHUwOGJpdHMpIHBfdWNiLT5VQ0JfdGFyZ2lkOworCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BDdXJyQ2FyZC0+Y2FyZEluZGV4XVtzY3NpSURdOworCisJaWYoKnBEYXRhKQorCXsKKwkJaWYoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfV0lERV9TQ1NJKQorCQl7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzY3NpV2lkZU1vZGUgPSBFRV9XSURFX1NDU0k7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoIShjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiBFRV9XSURFX1NDU0kpKQorCQl7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzY3NpV2lkZU1vZGUgPSAwOworCQl9CisJfQorCWN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSA9IChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiAhRUVfV0lERV9TQ1NJKQorCQkJCQkJCQkJCQl8IHNjc2lXaWRlTW9kZTsKKworCXN5bmNPZmZzZXQgPSAoU1lOQ19SQVRFX1RCTCArIHNjc2lJRCkgLyAyOworCXRlbXAyLnRlbXB3ID0gdXRpbEVFUmVhZChpb1BvcnQsIHN5bmNPZmZzZXQpOworCWlmKHNjc2lJRCAmIDB4MDEpCisJeworCQl0ZW1wMi50ZW1wYlswXSA9ICh0ZW1wMi50ZW1wYlswXSAmICFFRV9XSURFX1NDU0kpIHwgc2NzaVdpZGVNb2RlOworCX0KKwllbHNlCisJeworCQl0ZW1wMi50ZW1wYlsxXSA9ICh0ZW1wMi50ZW1wYlsxXSAmICFFRV9XSURFX1NDU0kpIHwgc2NzaVdpZGVNb2RlOworCX0KKwl1dGlsRUVXcml0ZU9uT2ZmKGlvUG9ydCwgMSk7CisJdXRpbEVFV3JpdGUoaW9Qb3J0LCB0ZW1wMi50ZW1wdywgc3luY09mZnNldCk7CisJdXRpbEVFV3JpdGVPbk9mZihpb1BvcnQsIDApOworCVVwZGF0ZUNoZWNrU3VtKGlvUG9ydCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFJlYWROVlJhbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgUmVhZE5WUmFtKFBTQ0NCY2FyZCBwQ3VyckNhcmQsUFVDQiBwX3VjYikKK3sKKwl1MDhiaXRzICpwZGF0YTsKKwl1MTZiaXRzIGksbnVtd3JkcyxudW1ieXRlcyxvZmZzZXQsdGVtcDsKKwl1MDhiaXRzIE9uZU1vcmUgPSBGQUxTRTsKKyNpZiBkZWZpbmVkKERPUykKKwl1MTZiaXRzIGlvcG9ydDsKKyNlbHNlCisJdTMyYml0cyBpb3BvcnQ7CisjZW5kaWYKKworCW51bWJ5dGVzID0gKHUxNmJpdHMpIHBfdWNiLT5VQ0JfZGF0YWxlbjsKKwlpb3BvcnQgID0gcEN1cnJDYXJkLT5pb1BvcnQ7CisgICBwZGF0YSAgID0gKHUwOGJpdHMgKikgcF91Y2ItPlVDQl92aXJ0X2RhdGFwdHI7CisJb2Zmc2V0ICA9ICh1MTZiaXRzKSAocF91Y2ItPlVDQl9JT0NUTFBhcmFtc1swXSk7CisKKworCisgICBpZiAob2Zmc2V0ICYgMHgxKQorCXsKKwkgICAgKigodTE2Yml0cyopIHBkYXRhKSA9IHV0aWxFRVJlYWQoaW9wb3J0LCh1MTZiaXRzKSgob2Zmc2V0IC0gMSkgLyAyKSk7IC8qIDE2IGJpdCByZWFkICovCisJCSAqcGRhdGEgPSAqKHBkYXRhICsgMSk7CisJCSArK29mZnNldDsKKyAgIAkgKytwZGF0YTsKKwkJIC0tbnVtYnl0ZXM7CisJfQorCisJbnVtd3JkcyA9IG51bWJ5dGVzIC8gMjsKKwlpZiAobnVtYnl0ZXMgJiAxKQorCSAJT25lTW9yZSA9IFRSVUU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtd3JkczsgaSsrKQorCXsKKyAgIAkqKCh1MTZiaXRzKikgcGRhdGEpID0gdXRpbEVFUmVhZChpb3BvcnQsKHUxNmJpdHMpKG9mZnNldCAvIDIpKTsKKwkJcGRhdGEgKz0gMjsKKwkJb2Zmc2V0ICs9IDI7CisgICB9CisJaWYgKE9uZU1vcmUpCisJeworCQktLXBkYXRhOworCQktLSBvZmZzZXQ7CisgICAJdGVtcCA9IHV0aWxFRVJlYWQoaW9wb3J0LCh1MTZiaXRzKShvZmZzZXQgLyAyKSk7CisJCSpwZGF0YSA9ICh1MDhiaXRzKSAodGVtcCk7CisJfQorCit9IC8qIGVuZCBwcm9jIFJlYWROVlJhbSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFdyaXRlTlZSYW0KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFdyaXRlTlZSYW0oUFNDQ0JjYXJkIHBDdXJyQ2FyZCxQVUNCIHBfdWNiKQoreworCXUwOGJpdHMgKnBkYXRhOworCXUxNmJpdHMgaSxudW13cmRzLG51bWJ5dGVzLG9mZnNldCwgZWVwcm9tX2VuZDsKKwl1MDhiaXRzIE9uZU1vcmUgPSBGQUxTRTsKKwl1bmlvbiB7CisJCXUwOGJpdHMgIHRlbXBiWzJdOworCQl1MTZiaXRzICB0ZW1wdzsKKwl9IHRlbXAyOworCisjaWYgZGVmaW5lZChET1MpCisJdTE2Yml0cyBpb3BvcnQ7CisjZWxzZQorCXUzMmJpdHMgaW9wb3J0OworI2VuZGlmCisKKwludW1ieXRlcyA9ICh1MTZiaXRzKSBwX3VjYi0+VUNCX2RhdGFsZW47CisJaW9wb3J0ICA9IHBDdXJyQ2FyZC0+aW9Qb3J0OworICAgcGRhdGEgICA9ICh1MDhiaXRzICopIHBfdWNiLT5VQ0JfdmlydF9kYXRhcHRyOworCW9mZnNldCAgPSAodTE2Yml0cykgKHBfdWNiLT5VQ0JfSU9DVExQYXJhbXNbMF0pOworCisgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBlZXByb21fZW5kID0gNTEyOworICAgZWxzZQorICAgICAgZWVwcm9tX2VuZCA9IDc2ODsKKwkKKwlpZihvZmZzZXQgPiBlZXByb21fZW5kKQorCQlyZXR1cm47CisKKwlpZigob2Zmc2V0ICsgbnVtYnl0ZXMpID4gZWVwcm9tX2VuZCkKKwkJbnVtYnl0ZXMgPSBlZXByb21fZW5kIC0gb2Zmc2V0OworCisgICAgdXRpbEVFV3JpdGVPbk9mZihpb3BvcnQsMSk7ICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byB0aGUgRUVQUk9NICovCisKKworCisgICBpZiAob2Zmc2V0ICYgMHgxKQorCXsKKwkgICAgdGVtcDIudGVtcHcgPSB1dGlsRUVSZWFkKGlvcG9ydCwodTE2Yml0cykoKG9mZnNldCAtIDEpIC8gMikpOyAvKiAxNiBiaXQgcmVhZCAqLworCQkgdGVtcDIudGVtcGJbMV0gPSAqcGRhdGE7CisJICAgIHV0aWxFRVdyaXRlKGlvcG9ydCwgdGVtcDIudGVtcHcsICh1MTZiaXRzKSgob2Zmc2V0IC0xKSAvIDIpKTsKKwkJICpwZGF0YSA9ICoocGRhdGEgKyAxKTsKKwkJICsrb2Zmc2V0OworICAgCSArK3BkYXRhOworCQkgLS1udW1ieXRlczsKKwl9CisKKwludW13cmRzID0gbnVtYnl0ZXMgLyAyOworCWlmIChudW1ieXRlcyAmIDEpCisJIAlPbmVNb3JlID0gVFJVRTsKKworCWZvciAoaSA9IDA7IGkgPCBudW13cmRzOyBpKyspCisJeworICAgCXV0aWxFRVdyaXRlKGlvcG9ydCwgKigocHUxNmJpdHMpcGRhdGEpLCh1MTZiaXRzKShvZmZzZXQgLyAyKSk7CisJCXBkYXRhICs9IDI7CisJCW9mZnNldCArPSAyOworICAgfQorCWlmIChPbmVNb3JlKQorCXsKKworICAgCXRlbXAyLnRlbXB3ID0gdXRpbEVFUmVhZChpb3BvcnQsKHUxNmJpdHMpKG9mZnNldCAvIDIpKTsKKwkJdGVtcDIudGVtcGJbMF0gPSAqcGRhdGE7CisgICAJdXRpbEVFV3JpdGUoaW9wb3J0LCB0ZW1wMi50ZW1wdywgKHUxNmJpdHMpKG9mZnNldCAvIDIpKTsKKwl9CisgICB1dGlsRUVXcml0ZU9uT2ZmKGlvcG9ydCwwKTsgICAvKiBUdXJuIG9mZiB3cml0ZSBhY2Nlc3MgKi8KKyAgIFVwZGF0ZUNoZWNrU3VtKCh1MzJiaXRzKWlvcG9ydCk7CisKK30gLyogZW5kIHByb2MgV3JpdGVOVlJhbSAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogVXBkYXRlQ2hlY2tTdW0KKyAqCisgKiBEZXNjcmlwdGlvbjogVXBkYXRlIENoZWNrIFN1bSBpbiBFRVBST00KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwordm9pZCBVcGRhdGVDaGVja1N1bSh1MzJiaXRzIGJhc2Vwb3J0KQoreworCVVTSE9SVCBpLHN1bV9kYXRhLCBlZXByb21fZW5kOworCisJc3VtX2RhdGEgPSAweDAwMDA7CisKKworICAgaWYgKFJEX0hBUlBPT04oYmFzZXBvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBlZXByb21fZW5kID0gNTEyOworICAgZWxzZQorICAgICAgZWVwcm9tX2VuZCA9IDc2ODsKKworCWZvciAoaSA9IDE7IGkgPCBlZXByb21fZW5kLzI7IGkrKykKKwl7CisJCXN1bV9kYXRhICs9IHV0aWxFRVJlYWQoYmFzZXBvcnQsIGkpOworCX0KKworICAgdXRpbEVFV3JpdGVPbk9mZihiYXNlcG9ydCwxKTsgICAvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIHRoZSBFRVBST00gKi8KKworICAgdXRpbEVFV3JpdGUoYmFzZXBvcnQsIHN1bV9kYXRhLCBFRVBST01fQ0hFQ0tfU1VNLzIpOworICAgdXRpbEVFV3JpdGVPbk9mZihiYXNlcG9ydCwwKTsgICAvKiBUdXJuIG9mZiB3cml0ZSBhY2Nlc3MgKi8KK30KKwordm9pZCBTY2NiTWdyX3NhdmVfZm9yZWlnbl9zdGF0ZShQQURBUFRFUl9JTkZPIHBBZGFwdGVySW5mbykKK3sKK30KKworCit2b2lkIFNjY2JNZ3JfcmVzdG9yZV9mb3JlaWduX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCkKK3sKK30KKwordm9pZCBTY2NiTWdyX3Jlc3RvcmVfbmF0aXZlX3N0YXRlKENBUkRfSEFORExFIHBDdXJyQ2FyZCkKK3sKK30KKworI2VuZGlmIC8qIE5PX0lPQ1RMUyAqLworCisjZW5kaWYgLyogKEZXX1RZUEU9PV9VQ0JfTUdSXykgICAqLworCisjaWZuZGVmIE5PX0lPQ1RMUworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCit2b2lkIFNjY2JNZ3JfdW5sb2FkX2NhcmQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgU2NjYk1ncl91bmxvYWRfY2FyZChVU0hPUlQgcEN1cnJDYXJkKQorI2Vsc2UKK3ZvaWQgU2NjYk1ncl91bmxvYWRfY2FyZChVTE9ORyBwQ3VyckNhcmQpCisjZW5kaWYKKyNlbmRpZgoreworCVVDSEFSIGk7CisjaWYgZGVmaW5lZChET1MpCisJVVNIT1JUIHBvcnRCYXNlOworCVVTSE9SVCByZWdPZmZzZXQ7CisjZWxzZQorCVVMT05HIHBvcnRCYXNlOworCVVMT05HIHJlZ09mZnNldDsKKyNlbmRpZgorCVVMT05HIHNjYW1EYXRhOworI2lmIGRlZmluZWQoT1MyKQorCVVMT05HIGZhciAqcFNjYW1UYmw7CisjZWxzZQorCVVMT05HICpwU2NhbVRibDsKKyNlbmRpZgorCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKworCXBDdXJyTnZSYW0gPSAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5wTnZSYW1JbmZvOworCisJaWYocEN1cnJOdlJhbSl7CisJCVdyU3RhY2socEN1cnJOdlJhbS0+bmlCYXNlQWRkciwgMCwgcEN1cnJOdlJhbS0+bmlNb2RlbCk7CisJCVdyU3RhY2socEN1cnJOdlJhbS0+bmlCYXNlQWRkciwgMSwgcEN1cnJOdlJhbS0+bmlTeXNDb25mKTsKKwkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCAyLCBwQ3Vyck52UmFtLT5uaVNjc2lDb25mKTsKKwkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCAzLCBwQ3Vyck52UmFtLT5uaVNjYW1Db25mKTsKKwkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCA0LCBwQ3Vyck52UmFtLT5uaUFkYXBJZCk7CisKKwkJZm9yKGkgPSAwOyBpIDwgTUFYX1NDU0lfVEFSIC8gMjsgaSsrKQorCQkJV3JTdGFjayhwQ3Vyck52UmFtLT5uaUJhc2VBZGRyLCAoVUNIQVIpKGkrNSksIHBDdXJyTnZSYW0tPm5pU3luY1RibFtpXSk7CisKKwkJcG9ydEJhc2UgPSBwQ3Vyck52UmFtLT5uaUJhc2VBZGRyOworCisJCWZvcihpID0gMDsgaSA8IE1BWF9TQ1NJX1RBUjsgaSsrKXsKKwkJCXJlZ09mZnNldCA9IGhwX2FyYW1CYXNlICsgNjQgKyBpKjQ7CisjaWYgZGVmaW5lZChPUzIpCisJCQlwU2NhbVRibCA9IChVTE9ORyBmYXIgKikgJnBDdXJyTnZSYW0tPm5pU2NhbVRibFtpXTsKKyNlbHNlCisJCQlwU2NhbVRibCA9IChVTE9ORyAqKSAmcEN1cnJOdlJhbS0+bmlTY2FtVGJsW2ldOworI2VuZGlmCisJCQlzY2FtRGF0YSA9ICpwU2NhbVRibDsKKwkJCVdSX0hBUlAzMihwb3J0QmFzZSwgcmVnT2Zmc2V0LCBzY2FtRGF0YSk7CisJCX0KKworCX1lbHNleworCQlXclN0YWNrKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmlvUG9ydCwgMCwgMCk7CisJfQorfQorI2VuZGlmIC8qIE5PX0lPQ1RMUyAqLworCisKK3ZvaWQgUk5WUmFtRGF0YShQTlZSYW1JbmZvIHBOdlJhbUluZm8pCit7CisJVUNIQVIgaTsKKyNpZiBkZWZpbmVkKERPUykKKwlVU0hPUlQgcG9ydEJhc2U7CisJVVNIT1JUIHJlZ09mZnNldDsKKyNlbHNlCisJVUxPTkcgcG9ydEJhc2U7CisJVUxPTkcgcmVnT2Zmc2V0OworI2VuZGlmCisJVUxPTkcgc2NhbURhdGE7CisjaWYgZGVmaW5lZCAoT1MyKQorCVVMT05HIGZhciAqcFNjYW1UYmw7CisjZWxzZQorCVVMT05HICpwU2NhbVRibDsKKyNlbmRpZgorCisJcE52UmFtSW5mby0+bmlNb2RlbCAgICA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMCk7CisJcE52UmFtSW5mby0+bmlTeXNDb25mICA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMSk7CisJcE52UmFtSW5mby0+bmlTY3NpQ29uZiA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMik7CisJcE52UmFtSW5mby0+bmlTY2FtQ29uZiA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgMyk7CisJcE52UmFtSW5mby0+bmlBZGFwSWQgICA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgNCk7CisKKwlmb3IoaSA9IDA7IGkgPCBNQVhfU0NTSV9UQVIgLyAyOyBpKyspCisJCXBOdlJhbUluZm8tPm5pU3luY1RibFtpXSA9IFJkU3RhY2socE52UmFtSW5mby0+bmlCYXNlQWRkciwgKFVDSEFSKShpKzUpKTsKKworCXBvcnRCYXNlID0gcE52UmFtSW5mby0+bmlCYXNlQWRkcjsKKworCWZvcihpID0gMDsgaSA8IE1BWF9TQ1NJX1RBUjsgaSsrKXsKKwkJcmVnT2Zmc2V0ID0gaHBfYXJhbUJhc2UgKyA2NCArIGkqNDsKKwkJUkRfSEFSUDMyKHBvcnRCYXNlLCByZWdPZmZzZXQsIHNjYW1EYXRhKTsKKyNpZiBkZWZpbmVkKE9TMikKKwkJcFNjYW1UYmwgPSAoVUxPTkcgZmFyICopICZwTnZSYW1JbmZvLT5uaVNjYW1UYmxbaV07CisjZWxzZQorCQlwU2NhbVRibCA9IChVTE9ORyAqKSAmcE52UmFtSW5mby0+bmlTY2FtVGJsW2ldOworI2VuZGlmCisJCSpwU2NhbVRibCA9IHNjYW1EYXRhOworCX0KKworfQorCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBSZFN0YWNrKFVTSE9SVCBwb3J0QmFzZSwgVUNIQVIgaW5kZXgpCisjZWxzZQorVUNIQVIgUmRTdGFjayhVTE9ORyBwb3J0QmFzZSwgVUNIQVIgaW5kZXgpCisjZW5kaWYKK3sKKwlXUl9IQVJQT09OKHBvcnRCYXNlICsgaHBfc3RhY2tfYWRkciwgaW5kZXgpOworCXJldHVybihSRF9IQVJQT09OKHBvcnRCYXNlICsgaHBfc3RhY2tfZGF0YSkpOworfQorCisjaWYgZGVmaW5lZChET1MpCit2b2lkIFdyU3RhY2soVVNIT1JUIHBvcnRCYXNlLCBVQ0hBUiBpbmRleCwgVUNIQVIgZGF0YSkKKyNlbHNlCit2b2lkIFdyU3RhY2soVUxPTkcgcG9ydEJhc2UsIFVDSEFSIGluZGV4LCBVQ0hBUiBkYXRhKQorI2VuZGlmCit7CisJV1JfSEFSUE9PTihwb3J0QmFzZSArIGhwX3N0YWNrX2FkZHIsIGluZGV4KTsKKwlXUl9IQVJQT09OKHBvcnRCYXNlICsgaHBfc3RhY2tfZGF0YSwgZGF0YSk7Cit9CisKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCit1MDhiaXRzIENoa0lmQ2hpcEluaXRpYWxpemVkKEJBU0VfUE9SVCBpb1BvcnQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgQ2hrSWZDaGlwSW5pdGlhbGl6ZWQoVVNIT1JUIGlvUG9ydCkKKyNlbHNlCitVQ0hBUiBDaGtJZkNoaXBJbml0aWFsaXplZChVTE9ORyBpb1BvcnQpCisjZW5kaWYKKyNlbmRpZgoreworCWlmKChSRF9IQVJQT09OKGlvUG9ydCArIGhwX2FyYl9pZCkgJiAweDBmKSAhPSBSZFN0YWNrKGlvUG9ydCwgNCkpCisJCXJldHVybihGQUxTRSk7CisJaWYoKFJEX0hBUlBPT04oaW9Qb3J0ICsgaHBfY2xrY3RybF8wKSAmIENMS0NUUkxfREVGQVVMVCkKKwkJCQkJCQkJIT0gQ0xLQ1RSTF9ERUZBVUxUKQorCQlyZXR1cm4oRkFMU0UpOworCWlmKChSRF9IQVJQT09OKGlvUG9ydCArIGhwX3NlbHRpbWVvdXQpID09IFRPXzI1MG1zKSB8fAorCQkoUkRfSEFSUE9PTihpb1BvcnQgKyBocF9zZWx0aW1lb3V0KSA9PSBUT18yOTBtcykpCisJCXJldHVybihUUlVFKTsKKwlyZXR1cm4oRkFMU0UpOworCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX3N0YXJ0X3NjY2IKKyAqCisgKiBEZXNjcmlwdGlvbjogU3RhcnQgYSBjb21tYW5kIHBvaW50ZWQgdG8gYnkgcF9TY2NiLiBXaGVuIHRoZQorICogICAgICAgICAgICAgIGNvbW1hbmQgaXMgY29tcGxldGVkIGl0IHdpbGwgYmUgcmV0dXJuZWQgdmlhIHRoZQorICogICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQordm9pZCBTY2NiTWdyX3N0YXJ0X3NjY2IoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkLCBQVUNCIHBfdWNiKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgU2NjYk1ncl9zdGFydF9zY2NiKFVTSE9SVCBwQ3VyckNhcmQsIFBTQ0NCIHBfU2NjYikKKyNlbHNlCit2b2lkIFNjY2JNZ3Jfc3RhcnRfc2NjYihVTE9ORyBwQ3VyckNhcmQsIFBTQ0NCIHBfU2NjYikKKyNlbmRpZgorI2VuZGlmCit7CisjaWYgZGVmaW5lZChET1MpCisgICBVU0hPUlQgaW9wb3J0OworI2Vsc2UKKyAgIFVMT05HIGlvcG9ydDsKKyNlbmRpZgorICAgVUNIQVIgdGhpc0NhcmQsIGx1bjsKKwlQU0NDQiBwU2F2ZVNjY2I7CisgICBDQUxMX0JLX0ZOIGNhbGxiYWNrOworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKyAgIFBTQ0NCIHBfU2NjYjsKKyNlbmRpZgorCisgICBtT1NfTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisgICB0aGlzQ2FyZCA9ICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jYXJkSW5kZXg7CisgICBpb3BvcnQgPSAoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+aW9Qb3J0OworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKyAgIHBfU2NjYiA9IChQU0NDQilwX3VjYi0+VUNCX01nclByaXZhdGVQdHI7CisjZW5kaWYKKworCWlmKChwX1NjY2ItPlRhcmdJRCA+IE1BWF9TQ1NJX1RBUikgfHwgKHBfU2NjYi0+THVuID4gTUFYX0xVTikpCisJeworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkJcF91Y2ItPlVDQl9oYmFzdGF0ID0gU0NDQl9DT01QTEVURTsKKwkJcF91Y2ItPlVDQl9zdGF0dXM9U0NDQl9FUlJPUjsKKwkJY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworCQlpZiAoY2FsbGJhY2spCisJCQljYWxsYmFjayhwX3VjYik7CisjZW5kaWYKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorCQlwX1NjY2ItPkhvc3RTdGF0dXMgPSBTQ0NCX0NPTVBMRVRFOworCQlwX1NjY2ItPlNjY2JTdGF0dXMgPSBTQ0NCX0VSUk9SOworCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfU2NjYi0+U2NjYkNhbGxiYWNrOworCQlpZiAoY2FsbGJhY2spCisJCQljYWxsYmFjayhwX1NjY2IpOworI2VuZGlmCisKKwkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCXJldHVybjsKKwl9CisKKyNpZiAoRldfVFlQRT09X1NDQ0JfTUdSXykKKyAgIHNpbml0cyhwX1NjY2IsdGhpc0NhcmQpOworI2VuZGlmCisKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCisjaWZuZGVmIE5PX0lPQ1RMUworCisgICBpZiAocF91Y2ItPlVDQl9vcGNvZGUgJiBPUENfSU9DVEwpCisJeworCisJCXN3aXRjaCAocF91Y2ItPlVDQl9JT0NUTENvbW1hbmQpIAorCQl7CisJCQljYXNlIFJFQURfTlZSQU06CisJCQkJUmVhZE5WUmFtKChQU0NDQmNhcmQpcEN1cnJDYXJkLHBfdWNiKTsKKwkJCQlwX3VjYi0+VUNCX3N0YXR1cz1VQ0JfU1VDQ0VTUzsKKwkJCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfdWNiLT5VQ0JfY2FsbGJhY2s7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQljYWxsYmFjayhwX3VjYik7CisJCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCQkJcmV0dXJuOworCisJCQljYXNlIFdSSVRFX05WUkFNOgorCQkJCVdyaXRlTlZSYW0oKFBTQ0NCY2FyZClwQ3VyckNhcmQscF91Y2IpOworCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzPVVDQl9TVUNDRVNTOworCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisKKwkJCWNhc2UgU0VORF9TQ1NJX1BBU1NUSFJVOgorI2lmIChGV19UWVBFICE9IF9TQ0NCX01HUl8pCisJCQkJaWYoIHBfdWNiLT5VQ0JfdGFyZ2lkID49CisJCQkJICAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmNhcmRJbmZvLT5haV9NYXhUYXJnICkKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX0VSUk9SOworCQkJCQlwX3VjYi0+VUNCX2hiYXN0YXQgPSBIQVNUQVRfSFdfRVJST1I7CisJCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQkJY2FsbGJhY2socF91Y2IpOworCQkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKyNlbmRpZgorCQkJCWJyZWFrOworCisJCQljYXNlIEhBUkRfUkVTRVQ6CisJCQkJcF91Y2ItPlVDQl9zdGF0dXMgPSBVQ0JfSU5WQUxJRDsKKwkJCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfdWNiLT5VQ0JfY2FsbGJhY2s7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQljYWxsYmFjayhwX3VjYik7CisJCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBHRVRfREVWSUNFX1NZTkNSQVRFOgorCQkJCWlmKCAhR2V0RGV2U3luY1JhdGUoKFBTQ0NCY2FyZClwQ3VyckNhcmQscF91Y2IpICkKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX1NVQ0NFU1M7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX0VSUk9SOworCQkJCQlwX3VjYi0+VUNCX2hiYXN0YXQgPSBIQVNUQVRfSFdfRVJST1I7CisJCQkJfQorCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFNFVF9ERVZJQ0VfU1lOQ1JBVEU6CisJCQkJaWYoICFTZXREZXZTeW5jUmF0ZSgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCxwX3VjYikgKQorCQkJCXsKKwkJCQkJcF91Y2ItPlVDQl9zdGF0dXMgPSBVQ0JfU1VDQ0VTUzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcF91Y2ItPlVDQl9zdGF0dXMgPSBVQ0JfRVJST1I7CisJCQkJCXBfdWNiLT5VQ0JfaGJhc3RhdCA9IEhBU1RBVF9IV19FUlJPUjsKKwkJCQl9CisJCQkJY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworCQkJCWlmIChjYWxsYmFjaykKKwkJCQkJY2FsbGJhY2socF91Y2IpOworCQkJCW1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgR0VUX1dJREVfTU9ERToKKwkJCQlpZiggIUdldERldldpZGVNb2RlKChQU0NDQmNhcmQpcEN1cnJDYXJkLHBfdWNiKSApCisJCQkJeworCQkJCQlwX3VjYi0+VUNCX3N0YXR1cyA9IFVDQl9TVUNDRVNTOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwX3VjYi0+VUNCX3N0YXR1cyA9IFVDQl9FUlJPUjsKKwkJCQkJcF91Y2ItPlVDQl9oYmFzdGF0ID0gSEFTVEFUX0hXX0VSUk9SOworCQkJCX0KKwkJCQljYWxsYmFjayA9IChDQUxMX0JLX0ZOKXBfdWNiLT5VQ0JfY2FsbGJhY2s7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCQljYWxsYmFjayhwX3VjYik7CisJCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBTRVRfV0lERV9NT0RFOgorCQkJCWlmKCAhU2V0RGV2V2lkZU1vZGUoKFBTQ0NCY2FyZClwQ3VyckNhcmQscF91Y2IpICkKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX1NVQ0NFU1M7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzID0gVUNCX0VSUk9SOworCQkJCQlwX3VjYi0+VUNCX2hiYXN0YXQgPSBIQVNUQVRfSFdfRVJST1I7CisJCQkJfQorCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCXBfdWNiLT5VQ0Jfc3RhdHVzPVVDQl9JTlZBTElEOworCQkJCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF91Y2ItPlVDQl9jYWxsYmFjazsKKwkJCQlpZiAoY2FsbGJhY2spCisJCQkJCWNhbGxiYWNrKHBfdWNiKTsKKwkJCQltT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKwkJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLyogTk9fSU9DVExTICovCisjZW5kaWYgLyogKEZXX1RZUEU9PV9VQ0JfTUdSXykgKi8KKworCisgICBpZiAoISgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jbWRDb3VudGVyKQorICAgICAgeworICAgICAgV1JfSEFSUE9PTihpb3BvcnQraHBfc2VtYXBob3JlLCAoUkRfSEFSUE9PTihpb3BvcnQraHBfc2VtYXBob3JlKQorICAgICAgICAgfCBTQ0NCX01HUl9BQ1RJVkUpKTsKKworICAgICAgaWYgKCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5nbG9iYWxGbGFncyAmIEZfR1JFRU5fUEMpCisgICAgICAgICB7CisJCSBXUl9IQVJQT09OKGlvcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisJCSBXUl9IQVJQT09OKGlvcG9ydCtocF9zeXNfY3RybCwgMHgwMCk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmNtZENvdW50ZXIrKzsKKworICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSkgJiBCSU9TX0lOX1VTRSkgeworCisgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9zZW1hcGhvcmUsIChSRF9IQVJQT09OKGlvcG9ydCtocF9zZW1hcGhvcmUpCisgICAgICAgICB8IFRJQ0tMRV9NRSkpOworCQlpZihwX1NjY2ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkKKwkJCXsKKwkJCQlwU2F2ZVNjY2IgPSAoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0I7CisJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcF9TY2NiOworCQkJCXF1ZXVlU2VsZWN0RmFpbCgmQkxfQ2FyZFt0aGlzQ2FyZF0sIHRoaXNDYXJkKTsKKwkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwU2F2ZVNjY2I7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkgICAgICBxdWV1ZUFkZFNjY2IocF9TY2NiLHRoaXNDYXJkKTsKKwkJCX0KKyAgICAgIH0KKworICAgZWxzZSBpZiAoKFJEX0hBUlBPT04oaW9wb3J0K2hwX3BhZ2VfY3RybCkgJiBHX0lOVF9ESVNBQkxFKSkgeworCisJCQlpZihwX1NjY2ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkKKwkJCQl7CisJCQkJCXBTYXZlU2NjYiA9ICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jdXJyZW50U0NDQjsKKwkJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcF9TY2NiOworCQkJCQlxdWV1ZVNlbGVjdEZhaWwoJkJMX0NhcmRbdGhpc0NhcmRdLCB0aGlzQ2FyZCk7CisJCQkJCSgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jdXJyZW50U0NDQiA9IHBTYXZlU2NjYjsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkgICAgICBxdWV1ZUFkZFNjY2IocF9TY2NiLHRoaXNDYXJkKTsKKwkJCQl9CisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICBNRElTQUJMRV9JTlQoaW9wb3J0KTsKKworCQlpZigoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmIAorCQkJKChzY2NiTWdyVGJsW3RoaXNDYXJkXVtwX1NjY2ItPlRhcmdJRF0uVGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpCisJCQlsdW4gPSBwX1NjY2ItPkx1bjsKKwkJZWxzZQorCQkJbHVuID0gMDsKKyAgICAgIGlmICgoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID09IE5VTEwpICYmCisgICAgICAgICAoc2NjYk1nclRibFt0aGlzQ2FyZF1bcF9TY2NiLT5UYXJnSURdLlRhclNlbFFfQ250ID09IDApICYmCisgICAgICAgICAoc2NjYk1nclRibFt0aGlzQ2FyZF1bcF9TY2NiLT5UYXJnSURdLlRhckxVTkJ1c3lbbHVuXQorICAgICAgICAgPT0gRkFMU0UpKSB7CisKKyAgICAgICAgICAgICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5jdXJyZW50U0NDQiA9IHBfU2NjYjsKKwkJCSAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworI2lmIGRlZmluZWQoRE9TKQorICAgICAgICAgICAgc3NlbCgoVVNIT1JUKXBfU2NjYi0+U2NjYklPUG9ydCx0aGlzQ2FyZCk7CisjZWxzZQorCSAgICBzc2VsKHBfU2NjYi0+U2NjYklPUG9ydCx0aGlzQ2FyZCk7CisjZW5kaWYKKwkJCSAgIG1PU19Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSB7CisKKwkJCWlmKHBfU2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNFVF9DT01NQU5EKQorCQkJCXsKKwkJCQkJcFNhdmVTY2NiID0gKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCOworCQkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwX1NjY2I7CisJCQkJCXF1ZXVlU2VsZWN0RmFpbCgmQkxfQ2FyZFt0aGlzQ2FyZF0sIHRoaXNDYXJkKTsKKwkJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcFNhdmVTY2NiOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJICAgICAgICAgCXF1ZXVlQWRkU2NjYihwX1NjY2IsdGhpc0NhcmQpOworCQkJCX0KKyAgICAgICAgIH0KKworCisgICAgICBNRU5BQkxFX0lOVChpb3BvcnQpOworICAgICAgfQorCisgICBtT1NfVW5Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX2Fib3J0X3NjY2IKKyAqCisgKiBEZXNjcmlwdGlvbjogQWJvcnQgdGhlIGNvbW1hbmQgcG9pbnRlZCB0byBieSBwX1NjY2IuICBXaGVuIHRoZQorICogICAgICAgICAgICAgIGNvbW1hbmQgaXMgY29tcGxldGVkIGl0IHdpbGwgYmUgcmV0dXJuZWQgdmlhIHRoZQorICogICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorczMyYml0cyBTY2NiTWdyX2Fib3J0X3NjY2IoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkLCBQVUNCIHBfdWNiKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK2ludCBTY2NiTWdyX2Fib3J0X3NjY2IoVVNIT1JUIHBDdXJyQ2FyZCwgUFNDQ0IgcF9TY2NiKQorI2Vsc2UKK2ludCBTY2NiTWdyX2Fib3J0X3NjY2IoVUxPTkcgcEN1cnJDYXJkLCBQU0NDQiBwX1NjY2IpCisjZW5kaWYKKyNlbmRpZgorCit7CisjaWYgZGVmaW5lZChET1MpCisJVVNIT1JUIGlvcG9ydDsKKyNlbHNlCisJVUxPTkcgaW9wb3J0OworI2VuZGlmCisKKwlVQ0hBUiB0aGlzQ2FyZDsKKwlDQUxMX0JLX0ZOIGNhbGxiYWNrOworCVVDSEFSIFRJRDsKKwlQU0NDQiBwU2F2ZVNDQ0I7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisKKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorCVBTQ0NCICAgIHBfU2NjYjsKKwlwX1NjY2I9KFBTQ0NCKXBfdWNiLT5VQ0JfTWdyUHJpdmF0ZVB0cjsKKyNlbmRpZgorCisJaW9wb3J0ID0gKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydDsKKworCXRoaXNDYXJkID0gKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Y2FyZEluZGV4OworCisJbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisJaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX3BhZ2VfY3RybCkgJiBHX0lOVF9ESVNBQkxFKQorCXsKKwkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJfQorCisJZWxzZQorCXsKKworCQlpZiAocXVldWVGaW5kU2NjYihwX1NjY2IsdGhpc0NhcmQpKQorCQl7CisKKwkJCW1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisJCQkoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jbWRDb3VudGVyLS07CisKKwkJCWlmICghKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Y21kQ291bnRlcikKKwkJCQlXUl9IQVJQT09OKGlvcG9ydCtocF9zZW1hcGhvcmUsKFJEX0hBUlBPT04oaW9wb3J0K2hwX3NlbWFwaG9yZSkKKwkJCQkJJiAoVUNIQVIpKH4oU0NDQl9NR1JfQUNUSVZFIHwgVElDS0xFX01FKSkgKSk7CisKKyNpZiAoRldfVFlQRT09X1NDQ0JfTUdSXykKKwkJCXBfU2NjYi0+U2NjYlN0YXR1cyA9IFNDQ0JfQUJPUlQ7CisJCQljYWxsYmFjayA9IHBfU2NjYi0+U2NjYkNhbGxiYWNrOworCQkJY2FsbGJhY2socF9TY2NiKTsKKyNlbHNlCisJCQlwX3VjYi0+VUNCX3N0YXR1cz1TQ0NCX0FCT1JUOworCQkJY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworCQkJY2FsbGJhY2socF91Y2IpOworI2VuZGlmCisKKwkJCXJldHVybigwKTsKKwkJfQorCisJCWVsc2UKKwkJeworCQkJbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisKKwkJCWlmICgoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jdXJyZW50U0NDQiA9PSBwX1NjY2IpCisJCQl7CisJCQkJcF9TY2NiLT5TY2NiU3RhdHVzID0gU0NDQl9BQk9SVDsKKwkJCQlyZXR1cm4oMCk7CisKKwkJCX0KKworCQkJZWxzZQorCQkJeworCisJCQkJVElEID0gcF9TY2NiLT5UYXJnSUQ7CisKKworCQkJCWlmKHBfU2NjYi0+U2NjYl90YWcpCisJCQkJeworCQkJCQlNRElTQUJMRV9JTlQoaW9wb3J0KTsKKwkJCQkJaWYgKCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5kaXNjUV9UYmxbcF9TY2NiLT5TY2NiX3RhZ109PXBfU2NjYikKKwkJCQkJeworCQkJCQkJcF9TY2NiLT5TY2NiU3RhdHVzID0gU0NDQl9BQk9SVDsKKwkJCQkJCXBfU2NjYi0+U2NjYl9zY3Npc3RhdCA9IEFCT1JUX1NUOworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCisJCQkJCQlwX3VjYi0+VUNCX3N0YXR1cz1TQ0NCX0FCT1JUOworI2VuZGlmCisJCQkJCQlwX1NjY2ItPlNjY2Jfc2NzaW1zZyA9IFNNQUJPUlRfVEFHOworCisJCQkJCQlpZigoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwX1NjY2I7CisJCQkJCQkJc3NlbChpb3BvcnQsIHRoaXNDYXJkKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwU2F2ZVNDQ0IgPSAoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0I7CisJCQkJCQkJKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCID0gcF9TY2NiOworCQkJCQkJCXF1ZXVlU2VsZWN0RmFpbCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQsIHRoaXNDYXJkKTsKKwkJCQkJCQkoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPSBwU2F2ZVNDQ0I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJTUVOQUJMRV9JTlQoaW9wb3J0KTsKKwkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFt0aGlzQ2FyZF1bcF9TY2NiLT5UYXJnSURdOworCisJCQkJCWlmKEJMX0NhcmRbdGhpc0NhcmRdLmRpc2NRX1RibFtjdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtwX1NjY2ItPkx1bl1dIAorCQkJCQkJCT09IHBfU2NjYikKKwkJCQkJeworCQkJCQkJcF9TY2NiLT5TY2NiU3RhdHVzID0gU0NDQl9BQk9SVDsKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oLTEpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JNZ3JfbXlfaW50CisgKgorICogRGVzY3JpcHRpb246IERvIGEgcXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgcGVuZGluZworICogICAgICAgICAgICAgIGludGVycnVwdCBmb3IgdGhpcyBjYXJkIGFuZCBkaXNhYmxlIHRoZSBJUlEgUGluIGlmIHNvLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQordTA4Yml0cyBTY2NiTWdyX215X2ludChDQVJEX0hBTkRMRSBwQ3VyckNhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgU2NjYk1ncl9teV9pbnQoVVNIT1JUIHBDdXJyQ2FyZCkKKyNlbHNlCitVQ0hBUiBTY2NiTWdyX215X2ludChVTE9ORyBwQ3VyckNhcmQpCisjZW5kaWYKKyNlbmRpZgoreworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGlvcG9ydDsKKyNlbHNlCisgICBVTE9ORyBpb3BvcnQ7CisjZW5kaWYKKworICAgaW9wb3J0ID0gKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+aW9Qb3J0OworCisgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfaW50X3N0YXR1cykgJiBJTlRfQVNTRVJURUQpCisgICB7CisKKyNpZiBkZWZpbmVkKERPUykKKyAgICAgIE1ESVNBQkxFX0lOVChpb3BvcnQpOworI2VuZGlmCisKKyAgICAgIHJldHVybihUUlVFKTsKKyAgIH0KKworICAgZWxzZQorCisgICAgICByZXR1cm4oRkFMU0UpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2NjYk1ncl9pc3IKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBpcyBvdXIgZW50cnkgcG9pbnQgd2hlbiBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgYnkgdGhlIGNhcmQgYW5kIHRoZSB1cHBlciBsZXZlbCBkcml2ZXIgcGFzc2VzIGl0IG9uIHRvCisgKiAgICAgICAgICAgICAgdXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCitzMzJiaXRzIFNjY2JNZ3JfaXNyKENBUkRfSEFORExFIHBDdXJyQ2FyZCkKKyNlbHNlCisjaWYgZGVmaW5lZChET1MpCitpbnQgU2NjYk1ncl9pc3IoVVNIT1JUIHBDdXJyQ2FyZCkKKyNlbHNlCitpbnQgU2NjYk1ncl9pc3IoVUxPTkcgcEN1cnJDYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworICAgVUNIQVIgdGhpc0NhcmQscmVzdWx0LGJtX3N0YXR1cywgYm1faW50X3N0OworICAgVVNIT1JUIGhwX2ludDsKKyAgIFVDSEFSIGksIHRhcmdldDsKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCBpb3BvcnQ7CisjZWxzZQorICAgVUxPTkcgaW9wb3J0OworI2VuZGlmCisKKyAgIG1PU19Mb2NrKChQU0NDQmNhcmQpcEN1cnJDYXJkKTsKKworICAgdGhpc0NhcmQgPSAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jYXJkSW5kZXg7CisgICBpb3BvcnQgPSAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5pb1BvcnQ7CisKKyAgIE1ESVNBQkxFX0lOVChpb3BvcnQpOworCisjaWYgZGVmaW5lZChCVUdCVUcpCisgICBXUl9IQVJQT09OKGlvcG9ydCtocF91c2VyX2RlZmluZWRfRCwgUkRfSEFSUE9PTihpb3BvcnQraHBfaW50X3N0YXR1cykpOworI2VuZGlmCisKKyAgIGlmICgoYm1faW50X3N0PVJEX0hBUlBPT04oaW9wb3J0K2hwX2ludF9zdGF0dXMpKSAmIEVYVF9TVEFUVVNfT04pCisJCWJtX3N0YXR1cyA9IFJEX0hBUlBPT04oaW9wb3J0K2hwX2V4dF9zdGF0dXMpICYgKFVDSEFSKUJBRF9FWFRfU1RBVFVTOworICAgZWxzZQorICAgICAgYm1fc3RhdHVzID0gMDsKKworICAgV1JfSEFSUE9PTihpb3BvcnQraHBfaW50X21hc2ssIChJTlRfQ01EX0NPTVBMIHwgU0NTSV9JTlRFUlJVUFQpKTsKKworICAgbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisKKyAgIHdoaWxlICgoaHBfaW50ID0gUkRXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSkgJiBkZWZhdWx0X2ludGVuYSkgfAorCSAgYm1fc3RhdHVzKQorICAgICB7CisKKyAgICAgICBjdXJyU0NDQiA9ICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCOworCisjaWYgZGVmaW5lZChCVUdCVUcpCisgICBEZWJ1Z19Mb2FkKHRoaXNDYXJkLChVQ0hBUikgMFhGRik7CisgICBEZWJ1Z19Mb2FkKHRoaXNDYXJkLGJtX2ludF9zdCk7CisKKyAgIERlYnVnX0xvYWQodGhpc0NhcmQsaHBfaW50XzApOworICAgRGVidWdfTG9hZCh0aGlzQ2FyZCxocF9pbnRfMSk7CisjZW5kaWYKKworCisgICAgICBpZiAoaHBfaW50ICYgKEZJRk8gfCBUSU1FT1VUIHwgUkVTRVQgfCBTQ0FNX1NFTCkgfHwgYm1fc3RhdHVzKSB7CisgICAgICAgICByZXN1bHQgPSBTY2NiTWdyX2JhZF9pc3IoaW9wb3J0LHRoaXNDYXJkLCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCksaHBfaW50KTsKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIChGSUZPIHwgVElNRU9VVCB8IFJFU0VUIHwgU0NBTV9TRUwpKTsKKyAgICAgICAgIGJtX3N0YXR1cyA9IDA7CisKKyAgICAgICAgIGlmIChyZXN1bHQpIHsKKworCQkJICAgbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworICAgICAgICAgICAgTUVOQUJMRV9JTlQoaW9wb3J0KTsKKwkJCSAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworICAgICAgICAgICAgcmV0dXJuKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKworICAgICAgZWxzZSBpZiAoaHBfaW50ICYgSUNNRF9DT01QKSB7CisKKyAgICAgICAgIGlmICggIShocF9pbnQgJiBCVVNfRlJFRSkgKSB7CisgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgQnVzRnJlZSBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgY29tbWFuZC4gIFdlCisgICAgICAgICAgICAgICBtdXN0IGFsc28gY2hlY2sgZm9yIGJlaW5nIHJlc2VsZWN0ZWQgc2luY2UgdGhlIEJ1c0ZyZWUKKyAgICAgICAgICAgICAgIG1heSBub3Qgc2hvdyB1cCBpZiBhbm90aGVyIGRldmljZSByZXNlbGVjdHMgdXMgaW4gMS41dXMgb3IKKyAgICAgICAgICAgICAgIGxlc3MuICBTUlIgV2VkbmVzZGF5LCAzLzgvMTk5NS4KKwkgICAgICAgICAqLworCSAgIHdoaWxlICghKFJEV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUlNFTCkpKSA7CisJIH0KKworICAgICAgICAgaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKQorCisgICAgICAgICAgICBwaGFzZUNoa0ZpZm8oaW9wb3J0LCB0aGlzQ2FyZCk7CisKKy8qICAgICAgICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwKKyAgICAgICAgICAgIChCVVNfRlJFRSB8IElDTURfQ09NUCB8IElUQVJfRElTQyB8IFhGRVJfQ05UXzApKTsKKyAgICAgICAgICovCisKKwkJIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIENMUl9BTExfSU5UXzEpOworCisgICAgICAgICBhdXRvQ21kQ21wbHQoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKGhwX2ludCAmIElUQVJfRElTQykKKyAgICAgICAgIHsKKworICAgICAgICAgaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKSB7CisKKyAgICAgICAgICAgIHBoYXNlQ2hrRmlmbyhpb3BvcnQsIHRoaXNDYXJkKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihpb3BvcnQraHBfZ3BfcmVnXzEpID09IFNNU0FWRV9EQVRBX1BUUikgeworCisgICAgICAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9ncF9yZWdfMSwgMHgwMCk7CisgICAgICAgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgfD0gRl9OT19EQVRBX1lFVDsKKworICAgICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2F2ZWRBVEMgPSBjdXJyU0NDQi0+U2NjYl9BVEM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gRElTQ09OTkVDVF9TVDsKKyAgICAgICAgIHF1ZXVlRGlzY29ubmVjdChjdXJyU0NDQix0aGlzQ2FyZCk7CisKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBCdXNGcmVlIGJlZm9yZSBzdGFydGluZyBhIG5ldyBjb21tYW5kLiAgV2UKKyAgICAgICAgICAgICAgIG11c3QgYWxzbyBjaGVjayBmb3IgYmVpbmcgcmVzZWxlY3RlZCBzaW5jZSB0aGUgQnVzRnJlZQorICAgICAgICAgICAgICAgbWF5IG5vdCBzaG93IHVwIGlmIGFub3RoZXIgZGV2aWNlIHJlc2VsZWN0cyB1cyBpbiAxLjV1cyBvcgorICAgICAgICAgICAgICAgbGVzcy4gIFNSUiBXZWRuZXNkYXksIDMvOC8xOTk1LgorICAgICAgICAgICAgICovCisJICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSU0VMKSkgJiYKKwkJICAhKChSRFdfSEFSUE9PTigoaW9wb3J0K2hwX2ludHN0YXQpKSAmIFBIQVNFKSAmJgorCQkgICAgUkRfSEFSUE9PTigoaW9wb3J0K2hwX3Njc2lzaWcpKSA9PQorCQkgICAgKFNDU0lfQlNZIHwgU0NTSV9SRVEgfCBTQ1NJX0NEIHwgU0NTSV9NU0cgfCBTQ1NJX0lPQklUKSkpIDsKKworCSAgIC8qCisJICAgICBUaGUgYWRkaXRpb25hbCBsb29wIGV4aXQgY29uZGl0aW9uIGFib3ZlIGRldGVjdHMgYSB0aW1pbmcgcHJvYmxlbQorCSAgICAgd2l0aCB0aGUgcmV2aXNpb24gRC9FIGhhcnBvb24gY2hpcHMuICBUaGUgY2FsbGVyIHNob3VsZCByZXNldCB0aGUKKwkgICAgIGhvc3QgYWRhcHRlciB0byByZWNvdmVyIHdoZW4gMHhGRSBpcyByZXR1cm5lZC4KKwkgICAqLworCSAgIGlmICghKFJEV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUlNFTCkpKQorCSAgICAgeworCSAgICAgICBtT1NfTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7CisJICAgICAgIE1FTkFCTEVfSU5UKGlvcG9ydCk7CisJICAgICAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCSAgICAgICByZXR1cm4gMHhGRTsKKwkgICAgIH0KKworICAgICAgICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgSVRBUl9ESVNDKSk7CisKKworICAgICAgICAgKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisKKyAgICAgIAl9CisKKworICAgICAgZWxzZSBpZiAoaHBfaW50ICYgUlNFTCkgeworCisgICAgICAgICBXUldfSEFSUE9PTigoaW9wb3J0K2hwX2ludHN0YXQpLCAoUFJPR19ITFQgfCBSU0VMIHwgUEhBU0UgfCBCVVNfRlJFRSkpOworCisgICAgICAgICBpZiAoUkRXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSkgJiBJVEFSX0RJU0MpCisJCSAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5nbG9iYWxGbGFncyAmIEZfSE9TVF9YRkVSX0FDVCkKKwkJCSAgICAgIHsKKyAgICAgICAgICAgICAgIHBoYXNlQ2hrRmlmbyhpb3BvcnQsIHRoaXNDYXJkKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04oaW9wb3J0K2hwX2dwX3JlZ18xKSA9PSBTTVNBVkVfREFUQV9QVFIpCisJCQkgICAgICB7CisgICAgICAgICAgICAgICBXUl9IQVJQT09OKGlvcG9ydCtocF9ncF9yZWdfMSwgMHgwMCk7CisgICAgICAgICAgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgfD0gRl9OT19EQVRBX1lFVDsKKyAgICAgICAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX3NhdmVkQVRDID0gY3VyclNDQ0ItPlNjY2JfQVRDOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXUldfSEFSUE9PTigoaW9wb3J0K2hwX2ludHN0YXQpLCAoQlVTX0ZSRUUgfCBJVEFSX0RJU0MpKTsKKyAgICAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gRElTQ09OTkVDVF9TVDsKKyAgICAgICAgICAgIHF1ZXVlRGlzY29ubmVjdChjdXJyU0NDQix0aGlzQ2FyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIHNyZXMoaW9wb3J0LHRoaXNDYXJkLCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCkpOworICAgICAgICAgcGhhc2VEZWNvZGUoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKChocF9pbnQgJiBJRE9fU1RSVCkgJiYgKCEoaHBfaW50ICYgQlVTX0ZSRUUpKSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwgKElET19TVFJUIHwgWEZFUl9DTlRfMCkpOworICAgICAgICAgICAgcGhhc2VEZWNvZGUoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKCAoaHBfaW50ICYgSVVOS1dOKSB8fCAoaHBfaW50ICYgUFJPR19ITFQpICkKKwkJICAgeworCSAJICAgV1JXX0hBUlBPT04oKGlvcG9ydCtocF9pbnRzdGF0KSwgKFBIQVNFIHwgSVVOS1dOIHwgUFJPR19ITFQpKTsKKwkgCSAgIGlmICgoUkRfSEFSUE9PTihpb3BvcnQraHBfcHJnbWNudF8wKSAmIChVQ0hBUikweDNmKTwgKFVDSEFSKVNFTENISykKKwkgICAgCQl7CisJICAgIAkJcGhhc2VEZWNvZGUoaW9wb3J0LHRoaXNDYXJkKTsKKwkgICAgCQl9CisJIAkgICBlbHNlCisJICAgIAkJeworICAgLyogSGFycG9vbiBwcm9ibGVtIHNvbWUgU0NTSSB0YXJnZXQgZGV2aWNlIHJlc3BvbmQgdG8gc2VsZWN0aW9uCisgICB3aXRoIHNob3J0IEJVU1kgcHVsc2UgKDw0MDBucykgdGhpcyB3aWxsIG1ha2UgdGhlIEhhcnBvb24gaXMgbm90IGFibGUKKyAgIHRvIGxhdGNoIHRoZSBjb3JyZWN0IFRhcmdldCBJRCBpbnRvIHJlZy4geDUzLgorICAgVGhlIHdvcmsgYXJvdW5kIHJlcXVpcmUgdG8gY29ycmVjdCB0aGlzIHJlZy4gQnV0IHdoZW4gd3JpdGUgdG8gdGhpcworICAgcmVnLiAoMHg1MykgYWxzbyBpbmNyZW1lbnQgdGhlIEZJRk8gd3JpdGUgYWRkciByZWcgKDB4NmYpLCB0aHVzIHdlCisgICBuZWVkIHRvIHJlYWQgdGhpcyByZWcgZmlyc3QgdGhlbiByZXN0b3JlIGl0IGxhdGVyLiBBZnRlciB1cGRhdGUgdG8gMHg1MyAqLworCisJICAgIAkJaSA9IChVQ0hBUikoUkRfSEFSUE9PTihpb3BvcnQraHBfZmlmb3dyaXRlKSk7CisJICAgIAkJdGFyZ2V0ID0gKFVDSEFSKShSRF9IQVJQT09OKGlvcG9ydCtocF9ncF9yZWdfMykpOworCSAgICAJCVdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAoVUNIQVIpIElEX1VOTE9DSyk7CisJICAgIAkJV1JfSEFSUE9PTihpb3BvcnQraHBfc2VsZWN0X2lkLCAoVUNIQVIpKHRhcmdldCB8IHRhcmdldDw8NCkpOworCSAgICAJCVdSX0hBUlBPT04oaW9wb3J0K2hwX3hmZXJfcGFkLCAoVUNIQVIpIDB4MDApOworCSAgICAJCVdSX0hBUlBPT04oaW9wb3J0K2hwX2ZpZm93cml0ZSwgaSk7CisJICAgIAkJV1JfSEFSUE9PTihpb3BvcnQraHBfYXV0b3N0YXJ0XzMsIChBVVRPX0lNTUVEK1RBR19TVFJUKSk7CisJICAgIAkJfQorCSAJICAgfQorCisgICAgICBlbHNlIGlmIChocF9pbnQgJiBYRkVSX0NOVF8wKSB7CisKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIFhGRVJfQ05UXzApOworCisgICAgICAgICBzY2hrZGQoaW9wb3J0LHRoaXNDYXJkKTsKKworICAgICAgICAgfQorCisKKyAgICAgIGVsc2UgaWYgKGhwX2ludCAmIEJVU19GUkVFKSB7CisKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIEJVU19GUkVFKTsKKworICAgICAgICAJaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKSB7CisKKyAgICAgICAgICAgCWhvc3REYXRhWGZlckFib3J0KGlvcG9ydCx0aGlzQ2FyZCxjdXJyU0NDQik7CisJCQkJfQorCisgICAgICAgICBwaGFzZUJ1c0ZyZWUoaW9wb3J0LHRoaXNDYXJkKTsKKwkJCX0KKworCisgICAgICBlbHNlIGlmIChocF9pbnQgJiBJVElDS0xFKSB7CisKKyAgICAgICAgIFdSV19IQVJQT09OKChpb3BvcnQraHBfaW50c3RhdCksIElUSUNLTEUpOworICAgICAgICAgKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisgICAgICAgICB9CisKKworCisgICAgICBpZiAoKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Z2xvYmFsRmxhZ3MgJiBGX05FV19TQ0NCX0NNRCkgeworCisKKyAgICAgICAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICY9IH5GX05FV19TQ0NCX0NNRDsKKworCisgICAgICAgICBpZiAoKChQU0NDQmNhcmQpcEN1cnJDYXJkKS0+Y3VycmVudFNDQ0IgPT0gTlVMTCkgeworCisgICAgICAgICAgICBxdWV1ZVNlYXJjaFNlbGVjdCgoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLHRoaXNDYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmN1cnJlbnRTQ0NCICE9IE5VTEwpIHsKKyAgICAgICAgICAgICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICY9IH5GX05FV19TQ0NCX0NNRDsKKyAgICAgICAgICAgIHNzZWwoaW9wb3J0LHRoaXNDYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIH0KKworICAgICAgfSAgLyplbmQgd2hpbGUgKi8KKworICAgbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworICAgTUVOQUJMRV9JTlQoaW9wb3J0KTsKKyAgIG1PU19VbkxvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisgICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JfYmFkX2lzcgorICoKKyAqIERlc2NyaXB0aW9uOiBTb21lIHR5cGUgb2YgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCB3aGljaCBpcyBzbGlnaHRseQorICogICAgICAgICAgICAgIG91dCBvZiB0aGUgb3JkaW5hcnkuICBXZSB3aWxsIG5vdyBkZWNvZGUgaXQgZnVsbHksIGluCisgKiAgICAgICAgICAgICAgdGhpcyByb3V0aW5lLiAgVGhpcyBpcyBicm9rZW4gdXAgaW4gYW4gYXR0ZW1wdCB0byBzYXZlCisgKiAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0aW1lLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK1VDSEFSIFNjY2JNZ3JfYmFkX2lzcihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVTSE9SVCBwX2ludCkKKyNlbHNlCitVQ0hBUiBTY2NiTWdyX2JhZF9pc3IoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVTSE9SVCBwX2ludCkKKyNlbmRpZgoreworI2lmIGRlZmluZWQoSEFSUF9SRVZYKQorICAgVUxPTkcgdGltZXI7CisjZW5kaWYKK1VDSEFSIHRlbXAsIFNjYW1GbGc7CitQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CitQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisKKworICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX2V4dF9zdGF0dXMpICYKKyAgICAgICAgIChCTV9GT1JDRV9PRkYgfCBQQ0lfREVWX1RNT1VUIHwgQk1fUEFSSVRZX0VSUiB8IFBJT19PVkVSUlVOKSApCisgICAgICB7CisKKyAgICAgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKQorICAgICAgICAgeworCisgICAgICAgICBob3N0RGF0YVhmZXJBYm9ydChwX3BvcnQscF9jYXJkLCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BjaV9zdGF0X2NmZykgJiBSRUNfTUFTVEVSX0FCT1JUKQorCisgICAgICAgICB7CisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wY2lfc3RhdF9jZmcsCisgICAgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGNpX3N0YXRfY2ZnKSAmIH5SRUNfTUFTVEVSX0FCT1JUKSk7CisKKyAgICAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2hvc3RfYmxrX2NudCwgMHgwMCk7CisKKyAgICAgICAgIH0KKworICAgICAgaWYgKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgIT0gTlVMTCkKKyAgICAgICAgIHsKKworICAgICAgICAgaWYgKCFwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5Ib3N0U3RhdHVzKQorICAgICAgICAgICAgcEN1cnJDYXJkLT5jdXJyZW50U0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfQk1fRVJSOworCisgICAgICAgICBzeGZycChwX3BvcnQscF9jYXJkKTsKKworCSAgICAgdGVtcCA9IChVQ0hBUikoUkRfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCkgJgorCQkJCQkJCShFWFRfQVJCX0FDSyB8IFNDU0lfVEVSTV9FTkFfSCkpOworICAgICAgCVdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsICgoVUNIQVIpdGVtcCB8IFNFRV9NUyB8IFNFRV9DUykpOworICAgICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgdGVtcCk7CisKKyAgICAgICAgIGlmICghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUkVTRVQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHBoYXNlRGVjb2RlKHBfcG9ydCxwX2NhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorCisKKyAgIGVsc2UgaWYgKHBfaW50ICYgUkVTRVQpCisgICAgICAgICB7CisKKwkJCQlXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisJCQkJV1JfSEFSUE9PTihwX3BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworICAgICAgICAgICBpZiAocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9IT1NUX1hGRVJfQUNUKQorCisgICAgICAgICAgICAgICBob3N0RGF0YVhmZXJBYm9ydChwX3BvcnQscF9jYXJkLCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKTsKKyAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgIERJU0FCTEVfQVVUTyhwX3BvcnQpOworCisgICAgICAgICAgIHNyZXNiKHBfcG9ydCxwX2NhcmQpOworCisgICAgICAgICAgIHdoaWxlKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2ljdHJsXzApICYgU0NTSV9SU1QpIHt9CisKKwkJCQlwQ3Vyck52UmFtID0gcEN1cnJDYXJkLT5wTnZSYW1JbmZvOworCQkJCWlmKHBDdXJyTnZSYW0peworCQkJCQlTY2FtRmxnID0gcEN1cnJOdlJhbS0+bmlTY2FtQ29uZjsKKwkJCQl9CisJCQkJZWxzZXsKKwkJCQkgICBTY2FtRmxnID0gKFVDSEFSKSB1dGlsRUVSZWFkKHBfcG9ydCwgU0NBTV9DT05GSUcvMik7CisJCQkJfQorCisgICAgICAgICAgIFhib3dJbml0KHBfcG9ydCwgU2NhbUZsZyk7CisKKyAgICAgICAgICAgICAgIHNjaW5pKHBfY2FyZCwgcEN1cnJDYXJkLT5vdXJJZCwgMCk7CisKKyAgICAgICAgICAgcmV0dXJuKDB4RkYpOworICAgICAgICAgfQorCisKKyAgIGVsc2UgaWYgKHBfaW50ICYgRklGTykgeworCisgICAgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLCBGSUZPKTsKKworI2lmIGRlZmluZWQoSEFSUF9SRVZYKQorCisgICAgICBmb3IgKHRpbWVyPTB4MDBGRkZGRkZMOyB0aW1lciAhPSAweDAwMDAwMDAwTDsgdGltZXItLSkgeworCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBpZiAoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBCVVNfRlJFRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorCisKKyAgICAgIGlmICggKFJEX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpICYmCisgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9maWZvcmVhZCkgIT0KKyAgICAgICAgICAgIFJEX0hBUlBPT04ocF9wb3J0K2hwX2ZpZm93cml0ZSkpICYmCisgICAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF94ZmVyY250XzApKQorICAgICAgICAgKQorCisgICAgICAgICAgICBXUl9IQVJQT09OKChwX3BvcnQraHBfeGZlcnN0YXQpLCAweDAxKTsKKworLyogICAgICBlbHNlCisgKi8KKy8qICAgICAgICAgc3hmcnAocF9wb3J0LHBfY2FyZCk7CisgKi8KKyNlbHNlCisgICAgICBpZiAocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorICAgICAgICAgc3hmcnAocF9wb3J0LHBfY2FyZCk7CisjZW5kaWYKKyAgICAgIH0KKworICAgZWxzZSBpZiAocF9pbnQgJiBUSU1FT1VUKQorICAgICAgeworCisgICAgICBESVNBQkxFX0FVVE8ocF9wb3J0KTsKKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwKKwkJICAoUFJPR19ITFQgfCBUSU1FT1VUIHwgU0VMIHxCVVNfRlJFRSB8IFBIQVNFIHwgSVVOS1dOKSk7CisKKyAgICAgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX1NFTEVDVElPTl9USU1FT1VUOworCisKKwkJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5UYXJnSURdOworCQlpZigocEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKQorCSAgICAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5MdW5dID0gRkFMU0U7CisJCWVsc2UKKwkgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbMF0gPSBGQUxTRTsKKworCisgICAgICBpZiAoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKQorICAgICAgICAgeworCSAgICAgICBjdXJyVGFyX0luZm8tPlRhclN5bmNDdHJsID0gMDsKKyAgICAgICAgIGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICY9IH5UQVJfU1lOQ19NQVNLOworICAgICAgICAgfQorCisgICAgICBpZiAoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfV0lERV9TQ1NJKQorICAgICAgICAgeworICAgICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisgICAgICAgICB9CisKKyAgICAgIHNzc3luY3YocF9wb3J0LCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5UYXJnSUQsIE5BUlJPV19TQ1NJLGN1cnJUYXJfSW5mbyk7CisKKyAgICAgIHF1ZXVlQ21kQ29tcGxldGUocEN1cnJDYXJkLCBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLCBwX2NhcmQpOworCisgICAgICB9CisKKyNpZiBkZWZpbmVkKFNDQU1fTEVWXzIpCisKKyAgIGVsc2UgaWYgKHBfaW50ICYgU0NBTV9TRUwpCisgICAgICB7CisKKyAgICAgIHNjYXJiKHBfcG9ydCxMRVZFTDJfVEFSKTsKKyAgICAgIHNjc2VsKHBfcG9ydCk7CisgICAgICBzY2FzaWQocF9jYXJkLCBwX3BvcnQpOworCisgICAgICBzY2J1c2YocF9wb3J0KTsKKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgU0NBTV9TRUwpOworICAgICAgfQorI2VuZGlmCisKKyAgIHJldHVybigweDAwKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX3Njc2lfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjogQSBTQ1NJIGJ1cyByZXNldCB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgYWxsIG91dHN0YW5kaW5nCisgKiAgICAgICAgICAgICAgU2NjYnMgd2lsbCBiZSByZXR1cm5lZCB2aWEgdGhlIGNhbGxiYWNrLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQordm9pZCBTY2NiTWdyX3Njc2lfcmVzZXQoQ0FSRF9IQU5ETEUgcEN1cnJDYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgU2NjYk1ncl9zY3NpX3Jlc2V0KFVTSE9SVCBwQ3VyckNhcmQpCisjZWxzZQordm9pZCBTY2NiTWdyX3Njc2lfcmVzZXQoVUxPTkcgcEN1cnJDYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFVDSEFSIHRoaXNDYXJkOworCisgICB0aGlzQ2FyZCA9ICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmNhcmRJbmRleDsKKworICAgbU9TX0xvY2soKFBTQ0NCY2FyZClwQ3VyckNhcmQpOworCisgICBpZiAoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmdsb2JhbEZsYWdzICYgRl9HUkVFTl9QQykKKyAgICAgIHsKKyAgICAgIFdSX0hBUlBPT04oKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisgICAgICBXUl9IQVJQT09OKCgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5pb1BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworICAgICAgfQorCisgICBzcmVzYigoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5pb1BvcnQsdGhpc0NhcmQpOworCisgICBpZiAoUkRfSEFSUE9PTigoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5pb1BvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkKKyAgICAgIHsKKyAgICAgIFdSX0hBUlBPT04oKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAgICAoUkRfSEFSUE9PTigoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+aW9Qb3J0K2hwX3BhZ2VfY3RybCkKKyAgICAgICAgICYgflNDQVRURVJfRU4pKTsKKworICAgICAgV1JfSEFSUE9PTigoKFBTQ0NCY2FyZCkgcEN1cnJDYXJkKS0+aW9Qb3J0K2hwX3NnX2FkZHIsMHgwMCk7CisKKyAgICAgICgoUFNDQ0JjYXJkKSBwQ3VyckNhcmQpLT5nbG9iYWxGbGFncyAmPSB+Rl9IT1NUX1hGRVJfQUNUOworICAgICAgYnVzTXN0clRpbWVPdXQoKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCk7CisKKyAgICAgIFdSX0hBUlBPT04oKChQU0NDQmNhcmQpIHBDdXJyQ2FyZCktPmlvUG9ydCtocF9pbnRfbWFzaywKKyAgICAgICAgIChJTlRfQ01EX0NPTVBMIHwgU0NTSV9JTlRFUlJVUFQpKTsKKyAgICAgIH0KKworLyoKKyAgICAgIGlmICh1dGlsRUVSZWFkKCgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPmlvUG9ydCwgKFNDQU1fQ09ORklHLzIpKQorICAgICAgICAgICAgJiBTQ0FNX0VOQUJMRUQpCisqLworICAgICAgICAgc2NpbmkodGhpc0NhcmQsICgoUFNDQ0JjYXJkKXBDdXJyQ2FyZCktPm91cklkLCAwKTsKKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCisgICAoKFBTQ0NCY2FyZClwQ3VyckNhcmQpLT5jYXJkSW5mby0+YWlfQUVOX3JvdXRpbmUoMHgwMSxwQ3VyckNhcmQsMCwwLDAsMCk7CisjZW5kaWYKKworICAgbU9TX1VuTG9jaygoUFNDQ0JjYXJkKXBDdXJyQ2FyZCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2NjYk1ncl90aW1lcl9leHBpcmVkCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gYWxsb3cgbWUgdG8ga2lsbCBteSBvd24gam9iIHRoYXQgaGFzIG5vdAorICogICAgICAgICAgICAgIHlldCBjb21wbGV0ZWQsIGFuZCBoYXMgY2F1c2UgYSB0aW1lb3V0IHRvIG9jY3VyLiAgVGhpcworICogICAgICAgICAgICAgIHRpbWVvdXQgaGFzIGNhdXNlZCB0aGUgdXBwZXIgbGV2ZWwgZHJpdmVyIHRvIGNhbGwgdGhpcworICogICAgICAgICAgICAgIGZ1bmN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIChGV19UWVBFPT1fVUNCX01HUl8pCit2b2lkIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChDQVJEX0hBTkRMRSBwQ3VyckNhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBTY2NiTWdyX3RpbWVyX2V4cGlyZWQoVVNIT1JUIHBDdXJyQ2FyZCkKKyNlbHNlCit2b2lkIFNjY2JNZ3JfdGltZXJfZXhwaXJlZChVTE9ORyBwQ3VyckNhcmQpCisjZW5kaWYKKyNlbmRpZgoreworfQorCisjaWYgZGVmaW5lZChET1MpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyX3N0YXR1cworICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBTQ0NCJ3MuCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgRE9TIGVudmlyb21lbnQsIHdoaWNoIG5lZWRzIHRoaXMKKyAqICAgICAgICAgICAgICB0byBoZWxwIHRoZW0ga2VlcCBwcm90ZWN0ZWQgYW5kIHJlYWwgbW9kZSBjb21tYW5kcyBzdGFpZ2h0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVVNIT1JUIFNjY2JNZ3Jfc3RhdHVzKFVTSE9SVCBwQ3VyckNhcmQpCit7CisgICByZXR1cm4oQkxfQ2FyZFtwQ3VyckNhcmRdLmNtZENvdW50ZXIpOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFNjY2JNZ3JUYWJsZUluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogSW5pdGlhbGl6ZSBhbGwgU2NjYiBtYW5hZ2VyIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU2NjYk1nclRhYmxlSW5pdEFsbCgpCit7CisgICBVQ0hBUiB0aGlzQ2FyZDsKKworICAgZm9yICh0aGlzQ2FyZCA9IDA7IHRoaXNDYXJkIDwgTUFYX0NBUkRTOyB0aGlzQ2FyZCsrKQorICAgICAgeworICAgICAgU2NjYk1nclRhYmxlSW5pdENhcmQoJkJMX0NhcmRbdGhpc0NhcmRdLHRoaXNDYXJkKTsKKworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uaW9Qb3J0ICAgICAgPSAweDAwOworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uY2FyZEluZm8gICAgPSBOVUxMOworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0uY2FyZEluZGV4ICAgPSAweEZGOworICAgICAgQkxfQ2FyZFt0aGlzQ2FyZF0ub3VySWQgICAgICAgPSAweDAwOworCQlCTF9DYXJkW3RoaXNDYXJkXS5wTnZSYW1JbmZvCT0gTlVMTDsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyVGFibGVJbml0CisgKgorICogRGVzY3JpcHRpb246IEluaXRpYWxpemUgYWxsIFNjY2IgbWFuYWdlciBkYXRhIHN0cnVjdHVyZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNjY2JNZ3JUYWJsZUluaXRDYXJkKFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFVDSEFSIHBfY2FyZCkKK3sKKyAgIFVDSEFSIHNjc2lJRCwgcXRhZzsKKworCWZvciAocXRhZyA9IDA7IHF0YWcgPCBRVUVVRV9ERVBUSDsgcXRhZysrKQorCXsKKwkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSA9IE5VTEw7CisJfQorCisgICBmb3IgKHNjc2lJRCA9IDA7IHNjc2lJRCA8IE1BWF9TQ1NJX1RBUjsgc2NzaUlEKyspCisgICAgICB7CisgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJTdGF0dXMgPSAwOworICAgICAgc2NjYk1nclRibFtwX2NhcmRdW3Njc2lJRF0uVGFyRUVWYWx1ZSA9IDA7CisgICAgICBTY2NiTWdyVGFibGVJbml0VGFyZ2V0KHBfY2FyZCwgc2NzaUlEKTsKKyAgICAgIH0KKworICAgcEN1cnJDYXJkLT5zY2FuSW5kZXggPSAweDAwOworICAgcEN1cnJDYXJkLT5jdXJyZW50U0NDQiA9IE5VTEw7CisgICBwQ3VyckNhcmQtPmdsb2JhbEZsYWdzID0gMHgwMDsKKyAgIHBDdXJyQ2FyZC0+Y21kQ291bnRlciAgPSAweDAwOworCXBDdXJyQ2FyZC0+dGFnUV9Mc3QgPSAweDAxOworCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudCA9IDA7IAorCisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTY2NiTWdyVGFibGVJbml0CisgKgorICogRGVzY3JpcHRpb246IEluaXRpYWxpemUgYWxsIFNjY2IgbWFuYWdlciBkYXRhIHN0cnVjdHVyZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNjY2JNZ3JUYWJsZUluaXRUYXJnZXQoVUNIQVIgcF9jYXJkLCBVQ0hBUiB0YXJnZXQpCit7CisKKwlVQ0hBUiBsdW4sIHF0YWc7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVt0YXJnZXRdOworCisJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudCA9IDA7CisJY3VyclRhcl9JbmZvLT5UYXJTeW5jQ3RybCA9IDA7CisKKwljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9IE5VTEw7CisJY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBOVUxMOworCWN1cnJUYXJfSW5mby0+VGFyVGFnUV9DbnQgPSAwOworCWN1cnJUYXJfSW5mby0+VGFyTFVOX0NBID0gRkFMU0U7CisKKworCWZvciAobHVuID0gMDsgbHVuIDwgTUFYX0xVTjsgbHVuKyspCisJeworCQljdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IEZBTFNFOworCQljdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtsdW5dID0gMDsKKwl9CisKKwlmb3IgKHF0YWcgPSAwOyBxdGFnIDwgUVVFVUVfREVQVEg7IHF0YWcrKykKKwl7CisJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbcXRhZ10gIT0gTlVMTCkKKwkJeworCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+VGFyZ0lEID09IHRhcmdldCkKKwkJCXsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3F0YWddID0gTlVMTDsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJfQorCQl9CisJfQorfQorCisjaWYgZGVmaW5lZChCVUdCVUcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2F2ZSB0aGUgY3VycmVudCBieXRlIGluIHRoZSBkZWJ1ZyBhcnJheQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3ZvaWQgRGVidWdfTG9hZChVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfYnVnX2RhdGEpCit7CisgICBkZWJ1Z19pbnRbcF9jYXJkXVtkZWJ1Z19pbmRleFtwX2NhcmRdXSA9IHBfYnVnX2RhdGE7CisgICBkZWJ1Z19pbmRleFtwX2NhcmRdKys7CisKKyAgIGlmIChkZWJ1Z19pbmRleFtwX2NhcmRdID09IGRlYnVnX3NpemUpCisKKyAgICAgIGRlYnVnX2luZGV4W3BfY2FyZF0gPSAwOworfQorCisjZW5kaWYKKyNpZGVudCAiJElkOiBzY2NiX2RhdC5jIDEuMTAgMTk5Ny8wMi8yMiAwMzoxNjowMiBhd2luIEV4cCAkIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoKKyAqICAgQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBNeWxleCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYm90aCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYW5kIGEgQlNELXN0eWxlIGNvcHlyaWdodDsgc2VlIExJQ0VOU0UuRmxhc2hQb2ludCBmb3IgZGV0YWlscy4KKyAqCisgKiAgICRXb3JrZmlsZTogICBzY2NiX2RhdC5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyByZWxhdGluZyB0byBoYW5kbGluZyBvZiB0aGUgU0NDQiBpbnRlcmZhY2UgCisgKiAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGUgZGV2aWNlIGRyaXZlciBhbmQgdGhlIEhBUlBPT04uCisgKgorICogICAkRGF0ZTogMTk5Ny8wMi8yMiAwMzoxNjowMiAkCisgKgorICogICAkUmV2aXNpb246IDEuMTAgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworLyoKKyoqICBJTVBPUlRBTlQgTk9URSEhIQorKioKKyoqICBZb3UgTVVTVCBwcmVhc3NpZ24gYWxsIGRhdGEgdG8gYSB2YWxpZCB2YWx1ZSBvciB6ZXJvLiAgVGhpcyBpcworKiogIHJlcXVpcmVkIGR1ZSB0byB0aGUgTVMgY29tcGlsZXIgYnVnIHVuZGVyIE9TLzIgYW5kIFNvbGFyaXMgUmVhbC1Nb2RlCisqKiAgZHJpdmVyIGVudmlyb25tZW50LgorKi8KKworCitTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdID0geyB7IHsgMCB9IH0gfTsKK1NDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXSA9IHsgeyAwIH0gfTsKK1NDQ0JTQ0FNX0lORk8gc2NhbUluZm9bTUFYX1NDU0lfVEFSXSA9IHsgeyB7IDAgfSB9IH07CitOVlJBTUlORk8gbnZSYW1JbmZvW01BWF9NQl9DQVJEU10gPSB7IHsgMCB9IH07CisKKworI2lmIGRlZmluZWQoT1MyKQordm9pZCAoZmFyICpzX1BoYXNlVGJsWzhdKSAoVUxPTkcsIFVDSEFSKSA9IHsgMCB9OworVUNIQVIgdGVtcF9pZF9zdHJpbmdbSURfU1RSSU5HX0xFTkdUSF0gPSB7IDAgfTsKKyNlbGlmIGRlZmluZWQoU09MQVJJU19SRUFMX01PREUpIHx8IGRlZmluZWQoX19TVERDX18pCit2b2lkICgqc19QaGFzZVRibFs4XSkgKFVMT05HLCBVQ0hBUikgPSB7IDAgfTsKKyNlbHNlCit2b2lkICgqc19QaGFzZVRibFs4XSkgKCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgZmlyc3RfdGltZSA9IDA7CisjZW5kaWYKKworVUNIQVIgbWJDYXJkcyA9IDA7CitVQ0hBUiBzY2FtSEFTdHJpbmdbXSA9IHsweDYzLCAweDA3LCAnQicsICdVJywgJ1MnLCAnTCcsICdPJywgJ0cnLCAnSScsICdDJywgXAorCQkJCQkJCQknICcsICdCJywgJ1QnLCAnLScsICc5JywgJzMnLCAnMCcsIFwKKwkJCQkJCQkJMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgXAorCQkJCQkJCQkweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwfTsKKworVVNIT1JUIGRlZmF1bHRfaW50ZW5hID0gMDsKKworI2lmIGRlZmluZWQoQlVHQlVHKQorVUNIQVIgICAgZGVidWdfaW50W01BWF9DQVJEU11bZGVidWdfc2l6ZV0gPSB7IDAgfTsKK1VDSEFSICAgIGRlYnVnX2luZGV4W01BWF9DQVJEU10gPSB7IDAgfTsKK1VDSEFSICAgIHJlc2VydmVkXzFbM10gPSB7IDAgfTsKKyNlbmRpZgorI2lkZW50ICIkSWQ6IHNjc2kuYyAxLjIzIDE5OTcvMDcvMDkgMjE6NDI6NTQgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIHNjc2kuYyAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIFNDU0kgYnVzIGZ1bmN0aW9ucyBzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgc2VsZWN0aW9uL3Jlc2VsZWN0aW9uLCBzeW5jIG5lZ290aWF0aW9uLCBtZXNzYWdlLWluCisgKiAgICAgICAgICAgICAgICAgZGVjb2RpbmcuCisgKgorICogICAkRGF0ZTogMTk5Ny8wNy8wOSAyMTo0Mjo1NCAkCisgKgorICogICAkUmV2aXNpb246IDEuMjMgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKworLyoKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CitleHRlcm4gU0NDQk1HUl9UQVJfSU5GTyBzY2NiTWdyVGJsW01BWF9DQVJEU11bTUFYX1NDU0lfVEFSXTsKKyNpZiBkZWZpbmVkKEJVR0JVRykKK3ZvaWQgRGVidWdfTG9hZChVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfYnVnX2RhdGEpOworI2VuZGlmCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzZmV0bQorICoKKyAqIERlc2NyaXB0aW9uOiBSZWFkIGluIGEgbWVzc2FnZSBieXRlIGZyb20gdGhlIFNDU0kgYnVzLCBhbmQgY2hlY2sKKyAqICAgICAgICAgICAgICBmb3IgYSBwYXJpdHkgZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzZm0oVVNIT1JUIHBvcnQsIFBTQ0NCIHBDdXJyU0NDQikKKyNlbHNlCitVQ0hBUiBzZm0oVUxPTkcgcG9ydCwgUFNDQ0IgcEN1cnJTQ0NCKQorI2VuZGlmCit7CisJVUNIQVIgbWVzc2FnZTsKKwlVU0hPUlQgVGltZU91dExvb3A7CisKKwlUaW1lT3V0TG9vcCA9IDA7CisJd2hpbGUoICghKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfUkVRKSkgJiYKKwkJCShUaW1lT3V0TG9vcCsrIDwgMjAwMDApICl7fQorCisKKwlXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworCW1lc3NhZ2UgPSBSRF9IQVJQT09OKHBvcnQraHBfc2NzaWRhdGFfMCk7CisKKwlXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywgU0NTSV9BQ0sgKyBTX01TR0lfUEgpOworCisKKwlpZiAoVGltZU91dExvb3AgPiAyMDAwMCkKKwkJbWVzc2FnZSA9IDB4MDA7ICAgLyogZm9yY2UgbWVzc2FnZSBieXRlID0gMCBpZiBUaW1lIE91dCBvbiBSZXEgKi8KKworCWlmICgoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgUEFSSVRZKSAmJgorCQkoUkRfSEFSUE9PTihwb3J0K2hwX2FkZHN0YXQpICYgU0NTSV9QQVJfRVJSKSkKKwl7CisJCVdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworCQlXUl9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQsIDApOworCQlXUl9IQVJQT09OKHBvcnQraHBfZmlmb3JlYWQsIDApOworCQlXUl9IQVJQT09OKHBvcnQraHBfZmlmb3dyaXRlLCAwKTsKKwkJaWYgKHBDdXJyU0NDQiAhPSBOVUxMKQorCQl7CisJCQlwQ3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9IFNNUEFSSVRZOworCQl9CisJCW1lc3NhZ2UgPSAweDAwOworCQlkbworCQl7CisJCQlBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKwkJCVRpbWVPdXRMb29wID0gMDsKKwkJCXdoaWxlKCAoIShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkpICYmCisJCQkJKFRpbWVPdXRMb29wKysgPCAyMDAwMCkgKXt9CisJCQlpZiAoVGltZU91dExvb3AgPiAyMDAwMCkKKwkJCXsKKwkJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEFSSVRZKTsKKwkJCQlyZXR1cm4obWVzc2FnZSk7CisJCQl9CisJCQlpZiAoKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNfU0NTSV9QSFopICE9IFNfTVNHSV9QSCkKKwkJCXsKKwkJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEFSSVRZKTsKKwkJCQlyZXR1cm4obWVzc2FnZSk7CisJCQl9CisJCQlXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworCQkJUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lkYXRhXzApOworCisJCQlXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywgKFNDU0lfQUNLICsgU19JTExfUEgpKTsKKworCQl9d2hpbGUoMSk7CisKKwl9CisJV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIChTQ1NJX0FDSyArIFNfSUxMX1BIKSk7CisJV1JfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0LCAwKTsKKwlXUl9IQVJQT09OKHBvcnQraHBfZmlmb3JlYWQsIDApOworCVdSX0hBUlBPT04ocG9ydCtocF9maWZvd3JpdGUsIDApOworCXJldHVybihtZXNzYWdlKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzc2VsCisgKgorICogRGVzY3JpcHRpb246IExvYWQgdXAgYXV0b21hdGlvbiBhbmQgc2VsZWN0IHRhcmdldCBkZXZpY2UuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNzZWwoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHNzZWwoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVDSEFSIGF1dG9fbG9hZGVkLCBpLCB0YXJnZXQsICp0aGVDQ0I7CisjZWxpZiBkZWZpbmVkKE9TMikKKyAgIFVDSEFSIGF1dG9fbG9hZGVkLCBpLCB0YXJnZXQ7CisgICBVQ0hBUiBmYXIgKnRoZUNDQjsKKyNlbHNlCisgICBVQ0hBUiBhdXRvX2xvYWRlZCwgaSwgdGFyZ2V0LCAqdGhlQ0NCOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCBjZGJfcmVnOworI2Vsc2UKKyAgIFVMT05HIGNkYl9yZWc7CisjZW5kaWYKKyAgIFBTQ0NCY2FyZCBDdXJyQ2FyZDsKKyAgIFBTQ0NCIGN1cnJTQ0NCOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworICAgVUNIQVIgbGFzdFRhZywgbHVuOworCisgICBDdXJyQ2FyZCA9ICZCTF9DYXJkW3BfY2FyZF07CisgICBjdXJyU0NDQiA9IEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKyAgIHRhcmdldCA9IGN1cnJTQ0NCLT5UYXJnSUQ7CisgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RhcmdldF07CisgICBsYXN0VGFnID0gQ3VyckNhcmQtPnRhZ1FfTHN0OworCisgICBBUkFNX0FDQ0VTUyhwb3J0KTsKKworCisJaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9SRUpFQ1QpCisJCWN1cnJTQ0NCLT5Db250cm9sQnl0ZSAmPSB+Rl9VU0VfQ01EX1E7CisKKwlpZigoKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJiAKKwkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKworCSAgIGx1biA9IGN1cnJTQ0NCLT5MdW47CisJZWxzZQorCQlsdW4gPSAwOworCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtsdW5dID0gVFJVRTsKKworI2Vsc2UKKworICAgaWYgKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfVEFHX1NUQVJURUQpCisgICAgICB7CisgICAgICBpZiAoIShjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBGX1VTRV9DTURfUSkpCisgICAgICAgICB7CisgICAgICAJaWYgKChjdXJyVGFyX0luZm8tPlRhckxVTl9DQSA9PSBGQUxTRSkKKyAgICAgIAkgICAgJiYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKQorICAgICAgCSAgICA9PSBUQUdfUV9UUllJTkcpKQorICAgICAgICAgICAgeworCisJICAgICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyVGFnUV9DbnQgIT0wKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgCQkgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAgICAJCXF1ZXVlU2VsZWN0RmFpbChDdXJyQ2FyZCxwX2NhcmQpOworCQkJCQkgICBTR1JBTV9BQ0NFU1MocG9ydCk7CisgICAgICAgICAJCSAgIHJldHVybjsKKyAgICAgICAgIAkJICAgfQorCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgIAkJICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAJCSAgfQorCisgICAJICAgICAgfSAgLypFbmQgbm9uLXRhZ2dlZCAqLworCisJICAgICAgZWxzZSB7CisJICAgICAgICAgY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5W2x1bl0gPSBUUlVFOworCSAgICAgICAgIH0KKworCSAgICAgIH0gIC8qIVVzZSBjbWQgUSBUYWdnZWQgKi8KKworCSAgIGVsc2UgeworICAgCSAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyTFVOX0NBID09IFRSVUUpCisgICAgICAgICAgICAgICB7CisgICAgICAJICAgICAgcXVldWVTZWxlY3RGYWlsKEN1cnJDYXJkLHBfY2FyZCk7CisJCQkJICAgU0dSQU1fQUNDRVNTKHBvcnQpOworICAgICAgCSAgICAgIHJldHVybjsKKwkgICAgICAgICAgICB9CisKKwkgICAgICAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtsdW5dID0gVFJVRTsKKworICAgCSAgICAgfSAgLyplbHNlIHVzZSBjbWQgUSB0YWdnZWQgKi8KKworICAgICAgfSAgLyppZiBnbG9iIHRhZ2dlZCBzdGFydGVkICovCisKKyAgIGVsc2UgeworICAgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgIH0KKworI2VuZGlmIC8qIERPUyAqLworCisKKworCWlmKCgoKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJiAKKwkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSAKKwkJfHwgKCEoY3VyclNDQ0ItPkNvbnRyb2xCeXRlICYgRl9VU0VfQ01EX1EpKSkpCisJeworCQlpZihDdXJyQ2FyZC0+ZGlzY1FDb3VudCA+PSBRVUVVRV9ERVBUSCkKKwkJeworCQkJY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5W2x1bl0gPSBUUlVFOworCQkJcXVldWVTZWxlY3RGYWlsKEN1cnJDYXJkLHBfY2FyZCk7CisJCQlTR1JBTV9BQ0NFU1MocG9ydCk7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpID0gMTsgaSA8IFFVRVVFX0RFUFRIOyBpKyspCisJCXsKKwkJCWlmICgrK2xhc3RUYWcgPj0gUVVFVUVfREVQVEgpIGxhc3RUYWcgPSAxOworCQkJaWYgKEN1cnJDYXJkLT5kaXNjUV9UYmxbbGFzdFRhZ10gPT0gTlVMTCkKKwkJCXsKKwkJCQlDdXJyQ2FyZC0+dGFnUV9Mc3QgPSBsYXN0VGFnOworCQkJCWN1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4W2x1bl0gPSBsYXN0VGFnOworCQkJCUN1cnJDYXJkLT5kaXNjUV9UYmxbbGFzdFRhZ10gPSBjdXJyU0NDQjsKKwkJCQlDdXJyQ2FyZC0+ZGlzY1FDb3VudCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmKGkgPT0gUVVFVUVfREVQVEgpCisJCXsKKwkJCWN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtsdW5dID0gVFJVRTsKKwkJCXF1ZXVlU2VsZWN0RmFpbChDdXJyQ2FyZCxwX2NhcmQpOworCQkJU0dSQU1fQUNDRVNTKHBvcnQpOworCQkJcmV0dXJuOworCQl9CisJfQorCisKKworICAgYXV0b19sb2FkZWQgPSBGQUxTRTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3NlbGVjdF9pZCwgdGFyZ2V0KTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9ncF9yZWdfMywgdGFyZ2V0KTsgIC8qIFVzZSBieSBuZXcgYXV0b21hdGlvbiBsb2dpYyAqLworCisgICBpZiAoY3VyclNDQ0ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkgeworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQpLCAoTVBNX09QK0FNU0dfT1VUKworICAgICAgICAgICAgICAgCSAoY3VyclNDQ0ItPlNjY2JfaWRtc2cgJiB+RElTQ19QUklWKSkpOworCisgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCsyKSxCUkhfT1ArQUxXQVlTK05QKTsKKworICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9IFNNREVWX1JFU0VUOworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKyAgICAgIGF1dG9fbG9hZGVkID0gVFJVRTsKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gU0VMRUNUX0JEUl9TVDsKKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykKKyAgICAgICAgIHsKKwkgICAgICAgY3VyclRhcl9JbmZvLT5UYXJTeW5jQ3RybCA9IDA7CisJICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJj0gflRBUl9TWU5DX01BU0s7CisJICAgICAgfQorCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisKKyAgICAgIGlmIChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiBFRV9XSURFX1NDU0kpCisgICAgICAgICB7CisgICAgICAJY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisgICAgICAJfQorI2VuZGlmCisKKyAgICAgIHNzc3luY3YocG9ydCwgdGFyZ2V0LCBOQVJST1dfU0NTSSxjdXJyVGFyX0luZm8pOworICAgICAgU2NjYk1nclRhYmxlSW5pdFRhcmdldChwX2NhcmQsIHRhcmdldCk7CisKKyAgICAgIH0KKworCQllbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IEFCT1JUX1NUKQorCQl7CisJCQlXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCksIChNUE1fT1ArQU1TR19PVVQrCisJCQkJCQkJCShjdXJyU0NDQi0+U2NjYl9pZG1zZyAmIH5ESVNDX1BSSVYpKSk7CisKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKzIpLEJSSF9PUCtBTFdBWVMrQ01EUFopOworCisJCQlXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMCksIChNUE1fT1ArQU1TR19PVVQrCisJCQkJCQkJCSgoKFVDSEFSKShjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBUQUdfVFlQRV9NQVNLKQorCQkJCQkJCQk+PiA2KSB8IChVQ0hBUikweDIwKSkpOworCQkJV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzIpLAorCQkJCQkJCShNUE1fT1ArQU1TR19PVVQrY3VyclNDQ0ItPlNjY2JfdGFnKSk7CisJCQlXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNCksIChCUkhfT1ArQUxXQVlTK05QICkpOworCisJCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKwkJCWF1dG9fbG9hZGVkID0gVFJVRTsKKwkJCisJCX0KKworI2lmIGRlZmluZWQoV0lERV9TQ1NJKQorCisKKyAgIGVsc2UgaWYgKCEoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBXSURFX05FR09DSUFURUQpKSAgeworICAgICAgYXV0b19sb2FkZWQgPSBzaXdpZG4ocG9ydCxwX2NhcmQpOworICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfV05fU1Q7CisgICAgICB9CisKKyNlbmRpZgorCisKKyAgIGVsc2UgaWYgKCEoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1NZTkNfTUFTSykKKyAgICAgID09IFNZTkNfU1VQUE9SVEVEKSkgIHsKKyAgICAgIGF1dG9fbG9hZGVkID0gc2lzeW5jbihwb3J0LHBfY2FyZCwgRkFMU0UpOworICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfU05fU1Q7CisgICAgICB9CisKKworICAgaWYgKCFhdXRvX2xvYWRlZCkKKyAgICAgIHsKKworI2lmICFkZWZpbmVkKERPUykKKyAgICAgIGlmIChjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBGX1VTRV9DTURfUSkKKyAgICAgICAgIHsKKworICAgICAgICAgQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfVEFHX1NUQVJURUQ7CisKKyAgICAgICAgIGlmICgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykKKyAgICAgICAgICAgID09IFRBR19RX1JFSkVDVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJTQ0NCLT5Db250cm9sQnl0ZSAmPSB+Rl9VU0VfQ01EX1E7CisKKyAgICAgICAgICAgIC8qIEZpeCB1cCB0aGUgc3RhcnQgaW5zdHJ1Y3Rpb24gd2l0aCBhIGp1bXAgdG8KKyAgICAgICAgICAgICAgIE5vbi1UYWctQ01EIGhhbmRsaW5nICovCisgICAgICAgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCksQlJIX09QK0FMV0FZUytOVENNRCk7CisKKyAgICAgICAgICAgIFdSV19IQVJQT09OKChwb3J0K05PTl9UQUdfSURfTVNHKSwKKwkgICAgICAgICAgICAgICAgICAgICAoTVBNX09QK0FNU0dfT1VUK2N1cnJTQ0NCLT5TY2NiX2lkbXNnKSk7CisKKwkgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKworCSAgICAgICAgIC8qIFNldHVwIG91ciBTVEFURSBzbyB3ZSBrbm93IHdoYXQgaGFwcGVuZCB3aGVuCisgICAgICAgICAgICAgICB0aGUgd2hlZWxzIGZhbGwgb2ZmLiAqLworICAgICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfU1Q7CisKKwkgICAgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKSwgKE1QTV9PUCtBTVNHX09VVCtjdXJyU0NDQi0+U2NjYl9pZG1zZykpOworCisgICAgICAgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCsyKSwgKE1QTV9PUCtBTVNHX09VVCsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKFVDSEFSKShjdXJyU0NDQi0+Q29udHJvbEJ5dGUgJiBUQUdfVFlQRV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgPj4gNikgfCAoVUNIQVIpMHgyMCkpKTsKKworCQkJCWZvciAoaSA9IDE7IGkgPCBRVUVVRV9ERVBUSDsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKCsrbGFzdFRhZyA+PSBRVUVVRV9ERVBUSCkgbGFzdFRhZyA9IDE7CisJCQkJCWlmIChDdXJyQ2FyZC0+ZGlzY1FfVGJsW2xhc3RUYWddID09IE5VTEwpCisJCQkJCXsKKwkJCQkJCVdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKzYpLAorCQkJCQkJCShNUE1fT1ArQU1TR19PVVQrbGFzdFRhZykpOworCQkJCQkJQ3VyckNhcmQtPnRhZ1FfTHN0ID0gbGFzdFRhZzsKKwkJCQkJCWN1cnJTQ0NCLT5TY2NiX3RhZyA9IGxhc3RUYWc7CisJCQkJCQlDdXJyQ2FyZC0+ZGlzY1FfVGJsW2xhc3RUYWddID0gY3VyclNDQ0I7CisJCQkJCQlDdXJyQ2FyZC0+ZGlzY1FDb3VudCsrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKworICAgICAgICAgICAgaWYgKCBpID09IFFVRVVFX0RFUFRIICkKKyAgICAgICAgICAgICAgIHsKKyAgIAkgICAgICAgICBjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisgICAgICAgICAgICAgICBxdWV1ZVNlbGVjdEZhaWwoQ3VyckNhcmQscF9jYXJkKTsKKwkJCQkgICBTR1JBTV9BQ0NFU1MocG9ydCk7CisgICAJICAgICAgICAgcmV0dXJuOworICAgCSAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfUV9TVDsKKworICAgCSAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMywgKFNFTEVDVCtTRUxDSEtfU1RSVCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICBlbHNlCisgICAgICAgICB7CisjZW5kaWYgICAvKiAhRE9TICovCisKKyAgICAgICAgIFdSV19IQVJQT09OKChwb3J0K0lEX01TR19TVFJUKSxCUkhfT1ArQUxXQVlTK05UQ01EKTsKKworICAgICAgCVdSV19IQVJQT09OKChwb3J0K05PTl9UQUdfSURfTVNHKSwKKyAgICAgICAgICAgIChNUE1fT1ArQU1TR19PVVQrY3VyclNDQ0ItPlNjY2JfaWRtc2cpKTsKKworICAgICAgICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBTRUxFQ1RfU1Q7CisKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMywgKFNFTEVDVCtTRUxDSEtfU1RSVCkpOworI2lmICFkZWZpbmVkKERPUykKKyAgICAgICAgIH0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKE9TMikKKyAgICAgIHRoZUNDQiA9IChVQ0hBUiBmYXIgKikmY3VyclNDQ0ItPkNkYlswXTsKKyNlbHNlCisgICAgICB0aGVDQ0IgPSAoVUNIQVIgKikmY3VyclNDQ0ItPkNkYlswXTsKKyNlbmRpZgorCisgICAgICBjZGJfcmVnID0gcG9ydCArIENNRF9TVFJUOworCisgICAgICBmb3IgKGk9MDsgaSA8IGN1cnJTQ0NCLT5DZGJMZW5ndGg7IGkrKykKKyAgICAgICAgIHsKKyAgICAgICAgIFdSV19IQVJQT09OKGNkYl9yZWcsIChNUE1fT1AgKyBBQ09NTUFORCArICp0aGVDQ0IpKTsKKyAgICAgICAgIGNkYl9yZWcgKz0yOworICAgICAgICAgdGhlQ0NCKys7CisgICAgICAgICB9CisKKyAgICAgIGlmIChjdXJyU0NDQi0+Q2RiTGVuZ3RoICE9IFRXRUxWRV9CWVRFX0NNRCkKKyAgICAgICAgIFdSV19IQVJQT09OKGNkYl9yZWcsIChCUkhfT1ArQUxXQVlTKyAgICBOUCkpOworCisgICAgICB9ICAvKiBhdXRvX2xvYWRlZCAqLworCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisgICBXUldfSEFSUE9PTigocG9ydCtocF9maWZvcmVhZCksIChVU0hPUlQpIDB4MDApOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0LCAweDAwKTsKKyNlbmRpZgorCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgKFBST0dfSExUIHwgVElNRU9VVCB8IFNFTCB8IEJVU19GUkVFKSk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLChTQ1NJX1BPUlQpKTsKKworCisgICBpZiAoIShjdXJyU0NDQi0+U2NjYl9NR1JGbGFncyAmIEZfREVWX1NFTEVDVEVEKSkKKyAgICAgIHsKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpY3RybF8wLCAoU0VMX1RBUiB8IEVOQV9BVE4gfCBFTkFfUkVTRUwgfCBFTkFfU0NBTV9TRUwpKTsKKyAgICAgIH0KKyAgIGVsc2UKKyAgICAgIHsKKworLyogICAgICBhdXRvX2xvYWRlZCA9ICAoUkRfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zKSAmIChVQ0hBUikweDFGKTsKKyAgICAgIGF1dG9fbG9hZGVkIHw9IEFVVE9fSU1NRUQ7ICovCisgICAgICBhdXRvX2xvYWRlZCA9IEFVVE9fSU1NRUQ7CisKKyAgICAgIERJU0FCTEVfQVVUTyhwb3J0KTsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCBhdXRvX2xvYWRlZCk7CisgICAgICB9CisKKyAgIFNHUkFNX0FDQ0VTUyhwb3J0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzcmVzCisgKgorICogRGVzY3JpcHRpb246IEhvb2t1cCB0aGUgY29ycmVjdCBDQ0IgYW5kIGhhbmRsZSB0aGUgaW5jb21pbmcgbWVzc2FnZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNyZXMoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0JjYXJkIHBDdXJyQ2FyZCkKKyNlbHNlCit2b2lkIHNyZXMoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBQU0NDQmNhcmQgcEN1cnJDYXJkKQorI2VuZGlmCit7CisKKyNpZiBkZWZpbmVkKFYzMDIpCisjaWZkZWYgRE9TCisgICBVQ0hBUiBvdXJfdGFyZ2V0LG1lc3NhZ2UsIG1zZ1JldHJ5Q291bnQ7CisgICBleHRlcm4gVUNIQVIgbHVuLCB0YWc7CisjZWxzZQorICAgVUNIQVIgb3VyX3RhcmdldCxtZXNzYWdlLGx1bix0YWcsIG1zZ1JldHJ5Q291bnQ7CisjZW5kaWYKKworI2Vsc2UgIC8qIFYzMDIgKi8KKyAgIFVDSEFSIG91cl90YXJnZXQsIG1lc3NhZ2UsIGx1biA9IDAsIHRhZywgbXNnUmV0cnlDb3VudDsKKyNlbmRpZiAvKiBWMzAyICovCisKKworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCVBTQ0NCIGN1cnJTQ0NCOworCisKKworCisJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCXsKKwkJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5UYXJnSURdOworCQlESVNBQkxFX0FVVE8ocG9ydCk7CisKKworCQlXUl9IQVJQT09OKChwb3J0K2hwX3Njc2ljdHJsXzApLChFTkFfUkVTRUwgfCBFTkFfU0NBTV9TRUwpKTsKKworCisJCWN1cnJTQ0NCID0gcEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKwkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1dOX1NUKQorCQl7CisJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+VEFSX1dJREVfTUFTSzsKKwkJCWN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gQlVTX0ZSRUVfU1Q7CisJCX0KKwkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1NOX1NUKQorCQl7CisJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+VEFSX1NZTkNfTUFTSzsKKwkJCWN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gQlVTX0ZSRUVfU1Q7CisJCX0KKwkJaWYoKChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpKQorCQl7CisgICAgICAJY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5W2N1cnJTQ0NCLT5MdW5dID0gRkFMU0U7CisJCQlpZihjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCAhPSBBQk9SVF9TVCkKKwkJCXsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRX1RibFtjdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtjdXJyU0NDQi0+THVuXV0gCisJCQkJCQkJCQkJCQkJPSBOVUxMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCSAgICAgIGN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVswXSA9IEZBTFNFOworCQkJaWYoY3VyclNDQ0ItPlNjY2JfdGFnKQorCQkJeworCQkJCWlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ICE9IEFCT1JUX1NUKQorCQkJCXsKKwkJCQkJcEN1cnJDYXJkLT5kaXNjUUNvdW50LS07CisJCQkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW2N1cnJTQ0NCLT5TY2NiX3RhZ10gPSBOVUxMOworCQkJCX0KKwkJCX1lbHNlCisJCQl7CisJCQkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgIT0gQUJPUlRfU1QpCisJCQkJeworCQkJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQkJcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKworICAgICAgcXVldWVTZWxlY3RGYWlsKCZCTF9DYXJkW3BfY2FyZF0scF9jYXJkKTsKKwl9CisKKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKwlXUldfSEFSUE9PTigocG9ydCtocF9maWZvcmVhZCksIChVU0hPUlQpIDB4MDApOworI2VuZGlmCisKKworCW91cl90YXJnZXQgPSAoVUNIQVIpKFJEX0hBUlBPT04ocG9ydCtocF9zZWxlY3RfaWQpID4+IDQpOworCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bb3VyX3RhcmdldF07CisKKworCW1zZ1JldHJ5Q291bnQgPSAwOworCWRvCisJeworCisjaWYgZGVmaW5lZChWMzAyKQorCisJCW1lc3NhZ2UgPSBHZXRUYXJMdW4ocG9ydCwgcF9jYXJkLCBvdXJfdGFyZ2V0LCBwQ3VyckNhcmQsICZ0YWcsICZsdW4pOworCisjZWxzZSAvKiBWMzAyICovCisKKwkJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtvdXJfdGFyZ2V0XTsKKwkJdGFnID0gMDsKKworCisJCXdoaWxlKCEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpKQorCQl7CisJCQlpZiAoISAoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9CU1kpKQorCQkJeworCisJCQkJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBIQVNFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEhBU0UpOworCQlpZiAoKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNfU0NTSV9QSFopID09IFNfTVNHSV9QSCkKKwkJeworCisJCQltZXNzYWdlID0gc2ZtKHBvcnQscEN1cnJDYXJkLT5jdXJyZW50U0NDQik7CisJCQlpZiAobWVzc2FnZSkKKwkJCXsKKworCQkJCWlmIChtZXNzYWdlIDw9ICgweDgwIHwgTFVOX01BU0spKQorCQkJCXsKKwkJCQkJbHVuID0gbWVzc2FnZSAmIChVQ0hBUilMVU5fTUFTSzsKKworI2lmICFkZWZpbmVkKERPUykKKwkJCQkJaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9UUllJTkcpCisJCQkJCXsKKwkJCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250ICE9IDApCisJCQkJCQl7CisKKwkJCQkJCQlpZiAoIShjdXJyVGFyX0luZm8tPlRhckxVTl9DQSkpCisJCQkJCQkJeworCQkJCQkJCQlBQ0NFUFRfTVNHKHBvcnQpOyAgICAvKlJlbGVhc2UgdGhlIEFDSyBmb3IgSUQgbXNnLiAqLworCisKKwkJCQkJCQkJbWVzc2FnZSA9IHNmbShwb3J0LHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpOworCQkJCQkJCQlpZiAobWVzc2FnZSkKKwkJCQkJCQkJeworCQkJCQkJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWVsc2UKKyAgIAkJCQkJCQkJbWVzc2FnZSA9IEZBTFNFOworCisJCQkJCQkJCWlmKG1lc3NhZ2UgIT0gRkFMU0UpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXRhZyA9IHNmbShwb3J0LHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpOworCisJCQkJCQkJCQlpZiAoISh0YWcpKSAKKwkJCQkJCQkJCQltZXNzYWdlID0gRkFMU0U7CisJCQkJCQkJCX0KKworCQkJCQkJCX0gLypDLkEuIGV4aXN0cyEgKi8KKworCQkJCQkJfSAvKkVuZCBRIGNudCAhPSAwICovCisKKwkJCQkJfSAvKkVuZCBUYWcgY21kcyBzdXBwb3J0ZWQhICovCisjZW5kaWYgLyogIURPUyAqLworCisJCQkJfSAvKkVuZCB2YWxpZCBJRCBtZXNzYWdlLiAgKi8KKworCQkJCWVsc2UKKwkJCQl7CisKKwkJCQkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCQkJfQorCisJCQl9IC8qIEVuZCBnb29kIGlkIG1lc3NhZ2UuICovCisKKwkJCWVsc2UKKwkJCXsKKworCQkJCW1lc3NhZ2UgPSBGQUxTRTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCisJCSAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChQSEFTRSB8IFJFU0VUKSkgJiYKKwkJCSAgIShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkgJiYKKwkJCSAgKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQlNZKSkgOworCisJCQlyZXR1cm47CisJCX0KKwkKKyNlbmRpZiAvKiBWMzAyICovCisKKwkJaWYobWVzc2FnZSA9PSBGQUxTRSkKKwkJeworCQkJbXNnUmV0cnlDb3VudCsrOworCQkJaWYobXNnUmV0cnlDb3VudCA9PSAxKQorCQkJeworCQkJCVNlbmRNc2cocG9ydCwgU01QQVJJVFkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVNlbmRNc2cocG9ydCwgU01ERVZfUkVTRVQpOworCisJCQkJc3NzeW5jdihwb3J0LCBvdXJfdGFyZ2V0LCBOQVJST1dfU0NTSSxjdXJyVGFyX0luZm8pOworCisJCQkJaWYgKHNjY2JNZ3JUYmxbcF9jYXJkXVtvdXJfdGFyZ2V0XS5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSAKKwkJCQl7CisJCQkKKwkJCQkJc2NjYk1nclRibFtwX2NhcmRdW291cl90YXJnZXRdLlRhclN0YXR1cyAmPSB+VEFSX1NZTkNfTUFTSzsKKworCQkJCX0KKworCQkJCWlmIChzY2NiTWdyVGJsW3BfY2FyZF1bb3VyX3RhcmdldF0uVGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkgCisJCQkJeworCisJCQkJCXNjY2JNZ3JUYmxbcF9jYXJkXVtvdXJfdGFyZ2V0XS5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisJCQkJfQorCisKKwkJCQlxdWV1ZUZsdXNoVGFyZ1NjY2IocF9jYXJkLCBvdXJfdGFyZ2V0LCBTQ0NCX0NPTVBMRVRFKTsKKwkJCQlTY2NiTWdyVGFibGVJbml0VGFyZ2V0KHBfY2FyZCxvdXJfdGFyZ2V0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9d2hpbGUobWVzc2FnZSA9PSBGQUxTRSk7CisKKworCisJaWYoKChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJeworCQljdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9IFRSVUU7CisJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBwQ3VyckNhcmQtPmRpc2NRX1RibFtjdXJyVGFyX0luZm8tPkx1bkRpc2NRX0lkeFtsdW5dXTsKKwkJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCQl7CisJCQlBQ0NFUFRfTVNHKHBvcnQpOworCQl9CisJCWVsc2UgCisJCXsKKwkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVswXSA9IFRSVUU7CisKKworCQlpZiAodGFnKQorCQl7CisJCQlpZiAocEN1cnJDYXJkLT5kaXNjUV9UYmxbdGFnXSAhPSBOVUxMKQorCQkJeworCQkJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBwQ3VyckNhcmQtPmRpc2NRX1RibFt0YWddOworCQkgCQljdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250LS07CisJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQkJfQorCQl9ZWxzZQorCQl7CisJCQlwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCID0gcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dOworCQkJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCQkJeworCQkJCUFDQ0VQVF9NU0cocG9ydCk7CisJCQl9CisJCQllbHNlIAorCQkJeworCQkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQkJfQorCQl9CisJfQorCisJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQiAhPSBOVUxMKQorCXsKKwkJaWYocEN1cnJDYXJkLT5jdXJyZW50U0NDQi0+U2NjYl9zY3Npc3RhdCA9PSBBQk9SVF9TVCkKKwkJeworCQkvKiBEdXJpbmcgQWJvcnQgVGFnIGNvbW1hbmQsIHRoZSB0YXJnZXQgY291bGQgaGF2ZSBnb3QgcmUtc2VsZWN0ZWQKKwkJCWFuZCBjb21wbGV0ZWQgdGhlIGNvbW1hbmQuIENoZWNrIHRoZSBzZWxlY3QgUSBhbmQgcmVtb3ZlIHRoZSBDQ0IKKwkJCWlmIGl0IGlzIGluIHRoZSBTZWxlY3QgUSAqLworCQkJcXVldWVGaW5kU2NjYihwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLCBwX2NhcmQpOworCQl9CisJfQorCisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChQSEFTRSB8IFJFU0VUKSkgJiYKKwkgICEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpICYmCisJICAoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9CU1kpKSA7Cit9CisKKyNpZiBkZWZpbmVkKFYzMDIpCisKKyNpZiBkZWZpbmVkKERPUykKK1VDSEFSIEdldFRhckx1bihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBvdXJfdGFyZ2V0LCBQU0NDQmNhcmQgcEN1cnJDYXJkLCBQVUNIQVIgdGFnLCBQVUNIQVIgbHVuKQorI2Vsc2UKK1VDSEFSIEdldFRhckx1bihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIG91cl90YXJnZXQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQsIFBVQ0hBUiB0YWcsIFBVQ0hBUiBsdW4pCisjZW5kaWYKK3sKKyAgIFVDSEFSIG1lc3NhZ2U7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKworCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bb3VyX3RhcmdldF07CisJKnRhZyA9IDA7CisKKworCXdoaWxlKCEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpKQorCXsKKwkJaWYgKCEgKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQlNZKSkKKwkJeworCisJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEhBU0UpOworCQkJcmV0dXJuKFRSVUUpOworCQl9CisJfQorCisJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBIQVNFKTsKKwlpZiAoKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNfU0NTSV9QSFopID09IFNfTVNHSV9QSCkKKwl7CisKKwkJbWVzc2FnZSA9IHNmbShwb3J0LHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpOworCQlpZiAobWVzc2FnZSkKKwkJeworCisJCQlpZiAobWVzc2FnZSA8PSAoMHg4MCB8IExVTl9NQVNLKSkKKwkJCXsKKwkJCQkqbHVuID0gbWVzc2FnZSAmIChVQ0hBUilMVU5fTUFTSzsKKworI2lmICFkZWZpbmVkKERPUykKKwkJCQlpZiAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spID09IFRBR19RX1RSWUlORykKKwkJCQl7CisJCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250ICE9IDApCisJCQkJCXsKKworCQkJCQkJaWYgKCEoY3VyclRhcl9JbmZvLT5UYXJMVU5fQ0EpKQorCQkJCQkJeworCQkJCQkJCUFDQ0VQVF9NU0cocG9ydCk7ICAgIC8qUmVsZWFzZSB0aGUgQUNLIGZvciBJRCBtc2cuICovCisKKworCQkJCQkJCW1lc3NhZ2UgPSBzZm0ocG9ydCxwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKTsKKwkJCQkJCQlpZiAobWVzc2FnZSkKKwkJCQkJCQl7CisJCQkJCQkJCUFDQ0VQVF9NU0cocG9ydCk7CisJCQkJCQkJfQorCisJCQkJCQkJZWxzZQorICAgCQkJCQkJCXJldHVybihGQUxTRSk7CisKKwkJCQkJCQkqdGFnID0gc2ZtKHBvcnQscEN1cnJDYXJkLT5jdXJyZW50U0NDQik7CisKKwkJCQkJCQlpZiAoISgqdGFnKSkgcmV0dXJuKEZBTFNFKTsKKworCQkJCQkJfSAvKkMuQS4gZXhpc3RzISAqLworCisJCQkJCX0gLypFbmQgUSBjbnQgIT0gMCAqLworCisJCQkJfSAvKkVuZCBUYWcgY21kcyBzdXBwb3J0ZWQhICovCisjZW5kaWYgLyogIURPUyAqLworCisJCQl9IC8qRW5kIHZhbGlkIElEIG1lc3NhZ2UuICAqLworCisJCQllbHNlCisJCQl7CisKKwkJCQlBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKwkJCX0KKworCQl9IC8qIEVuZCBnb29kIGlkIG1lc3NhZ2UuICovCisKKwkJZWxzZQorCQl7CisKKwkJCXJldHVybihGQUxTRSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCXJldHVybihUUlVFKTsKKwl9CisJcmV0dXJuKFRSVUUpOworfQorCisjZW5kaWYgLyogVjMwMiAqLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIFNlbmRNc2coVVNIT1JUIHBvcnQsIFVDSEFSIG1lc3NhZ2UpCisjZWxzZQordm9pZCBTZW5kTXNnKFVMT05HIHBvcnQsIFVDSEFSIG1lc3NhZ2UpCisjZW5kaWYKK3sKKwl3aGlsZSghKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfUkVRKSkKKwl7CisJCWlmICghIChSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX0JTWSkpCisJCXsKKworCQkJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBIQVNFKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCVdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBQSEFTRSk7CisJaWYgKChSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTX1NDU0lfUEhaKSA9PSBTX01TR09fUEgpCisJeworCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgUEhBU0UgfCBYRkVSX0NOVF8wKSk7CisKKworCQlXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9CVVNfRU4pOworCisJCVdSX0hBUlBPT04ocG9ydCtocF9zY3NpZGF0YV8wLG1lc3NhZ2UpOworCisJCVdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworCisJCUFDQ0VQVF9NU0cocG9ydCk7CisKKwkJV1JfSEFSUE9PTihwb3J0K2hwX3BvcnRjdHJsXzAsIDB4MDApOworCisJCWlmICgobWVzc2FnZSA9PSBTTUFCT1JUKSB8fCAobWVzc2FnZSA9PSBTTURFVl9SRVNFVCkgfHwKKwkJCQkobWVzc2FnZSA9PSBTTUFCT1JUX1RBRykgKQorCQl7CisJCQl3aGlsZSghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFBIQVNFKSkpIHt9CisKKwkJCWlmIChSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiBCVVNfRlJFRSkKKwkJCXsKKwkJCVdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBCVVNfRlJFRSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNkZWNtCisgKgorICogRGVzY3JpcHRpb246IERldGVybWluZSB0aGUgcHJvcGVyIHJlc3BvbmNlIHRvIHRoZSBtZXNzYWdlIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgdGFyZ2V0IGRldmljZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNkZWNtKFVDSEFSIG1lc3NhZ2UsIFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBzZGVjbShVQ0hBUiBtZXNzYWdlLCBVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKwlQU0NDQiBjdXJyU0NDQjsKKwlQU0NDQmNhcmQgQ3VyckNhcmQ7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisJQ3VyckNhcmQgPSAmQkxfQ2FyZFtwX2NhcmRdOworCWN1cnJTQ0NCID0gQ3VyckNhcmQtPmN1cnJlbnRTQ0NCOworCisJY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworCWlmIChtZXNzYWdlID09IFNNUkVTVF9EQVRBX1BUUikKKwl7CisJCWlmICghKGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfTk9fREFUQV9ZRVQpKQorCQl7CisJCQljdXJyU0NDQi0+U2NjYl9BVEMgPSBjdXJyU0NDQi0+U2NjYl9zYXZlZEFUQzsKKworCQkJaG9zdERhdGFYZmVyUmVzdGFydChjdXJyU0NDQik7CisJCX0KKworCQlBQ0NFUFRfTVNHKHBvcnQpOworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwl9CisKKwllbHNlIGlmIChtZXNzYWdlID09IFNNQ01EX0NPTVApCisJeworCisKKwkJaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9RX1NUKQorCQl7CisJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+KFVDSEFSKVRBUl9UQUdfUV9NQVNLOworCQkJY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgfD0gKFVDSEFSKVRBR19RX1JFSkVDVDsKKwkJfQorCisJCUFDQ0VQVF9NU0cocG9ydCk7CisKKwl9CisKKwllbHNlIGlmICgobWVzc2FnZSA9PSBTTU5PX09QKSB8fCAobWVzc2FnZSA+PSBTTUlERU5UKSAKKwkJCXx8IChtZXNzYWdlID09IFNNSU5JVF9SRUNPVkVSWSkgfHwgKG1lc3NhZ2UgPT0gU01SRUxfUkVDT1ZFUlkpKQorCXsKKworCQlBQ0NFUFRfTVNHKHBvcnQpOworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwl9CisKKwllbHNlIGlmIChtZXNzYWdlID09IFNNUkVKRUNUKQorCXsKKworCQlpZiAoKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkgfHwKKwkJCQkoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1dOX1NUKSB8fAorCQkJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfU1lOQ19NQVNLKSA9PSBTWU5DX1RSWUlORyApIHx8CisJCQkJKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9UUllJTkcgKSApCisKKwkJeworCQkJV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIEJVU19GUkVFKTsKKworCQkJQUNDRVBUX01TRyhwb3J0KTsKKworCisJCQl3aGlsZSAoKCEoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpKSAmJgorCQkJCSghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKSkpIHt9CisKKwkJCWlmKGN1cnJTQ0NCLT5MdW4gPT0gMHgwMCkKKwkJCXsKKwkJCQlpZiAoKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkpCisJCQkJeworCisJCQkJCWN1cnJUYXJfSW5mby0+VGFyU3RhdHVzIHw9IChVQ0hBUilTWU5DX1NVUFBPUlRFRDsKKworCQkJCQljdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJj0gfkVFX1NZTkNfTUFTSzsKKwkJCQl9CisKKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKwkJCQllbHNlIGlmICgoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1dOX1NUKSkKKwkJCQl7CisKKworCQkJCQljdXJyVGFyX0luZm8tPlRhclN0YXR1cyA9IChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmCisJCQkJCQkJCQkJCQkJfldJREVfRU5BQkxFRCkgfCBXSURFX05FR09DSUFURUQ7CisKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICY9IH5FRV9XSURFX1NDU0k7CisKKwkJCQl9CisjZW5kaWYKKworCQkJCWVsc2UgaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSA9PSBUQUdfUV9UUllJTkcgKQorCQkJCXsKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgPSAoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJgorCQkJCQkJCQkJCQkJCX4oVUNIQVIpVEFSX1RBR19RX01BU0spIHwgVEFHX1FfUkVKRUNUOworCisKKwkJCQkJY3VyclNDQ0ItPkNvbnRyb2xCeXRlICY9IH5GX1VTRV9DTURfUTsKKwkJCQkJQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQkJQ3VyckNhcmQtPmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddID0gTlVMTDsKKwkJCQkJY3VyclNDQ0ItPlNjY2JfdGFnID0gMHgwMDsKKworCQkJCX0KKwkJCX0KKworCQkJaWYgKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKQorCQkJeworCisKKwkJCQlpZihjdXJyU0NDQi0+THVuID09IDB4MDApCisJCQkJeworCQkJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQlVTX0ZSRUUpOworCQkJCQlDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisJCQkJfQorCQkJfQorCisJCQllbHNlIAorCQkJeworCisJCQkJaWYoKEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJCQkoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpCisJCQkJCWN1cnJUYXJfSW5mby0+VGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQljdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbMF0gPSBUUlVFOworCisKKwkJCQljdXJyU0NDQi0+Q29udHJvbEJ5dGUgJj0gfihVQ0hBUilGX1VTRV9DTURfUTsKKworCQkJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCisJCQl9CisJCX0KKworCQllbHNlCisJCXsKKwkJCUFDQ0VQVF9NU0cocG9ydCk7CisKKwkJCXdoaWxlICgoIShSRF9IQVJQT09OKHBvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkpICYmCisJCQkJKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgQlVTX0ZSRUUpKSkge30KKwkKKwkJCWlmICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKSkKKwkJCXsKKwkJCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYgKG1lc3NhZ2UgPT0gU01FWFQpCisJeworCisJCUFDQ0VQVF9NU0cocG9ydCk7CisJCXNoYW5kZW0ocG9ydCxwX2NhcmQsY3VyclNDQ0IpOworCX0KKworCWVsc2UgaWYgKG1lc3NhZ2UgPT0gU01JR05PUldSKQorCXsKKworCQlBQ0NFUFRfTVNHKHBvcnQpOyAgICAgICAgICAvKiBBQ0sgdGhlIFJFU0lEVUUgTVNHICovCisKKwkJbWVzc2FnZSA9IHNmbShwb3J0LGN1cnJTQ0NCKTsKKworCQlpZihjdXJyU0NDQi0+U2NjYl9zY3NpbXNnICE9IFNNUEFSSVRZKQorCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJfQorCisKKwllbHNlCisJeworCisJCWN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9QSEFTRV9TRVFVRU5DRV9GQUlMOworCQljdXJyU0NDQi0+U2NjYl9zY3NpbXNnID0gU01SRUpFQ1Q7CisKKwkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzaGFuZGVtCisgKgorICogRGVzY3JpcHRpb246IERlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIGV4dGVuZGVkIG1lc3NhZ2UuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzaGFuZGVtKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCIHBDdXJyU0NDQikKKyNlbHNlCit2b2lkIHNoYW5kZW0oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBQU0NDQiBwQ3VyclNDQ0IpCisjZW5kaWYKK3sKKwlVQ0hBUiBsZW5ndGgsbWVzc2FnZTsKKworCWxlbmd0aCA9IHNmbShwb3J0LHBDdXJyU0NDQik7CisJaWYgKGxlbmd0aCkgCisJeworCisJCUFDQ0VQVF9NU0cocG9ydCk7CisJCW1lc3NhZ2UgPSBzZm0ocG9ydCxwQ3VyclNDQ0IpOworCQlpZiAobWVzc2FnZSkgCisJCXsKKworCQkJaWYgKG1lc3NhZ2UgPT0gU01TWU5DKSAKKwkJCXsKKworCQkJCWlmIChsZW5ndGggPT0gMHgwMykKKwkJCQl7CisKKwkJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCQkJc3RzeW5jbihwb3J0LHBfY2FyZCk7CisJCQkJfQorCQkJCWVsc2UgCisJCQkJeworCisJCQkJCXBDdXJyU0NDQi0+U2NjYl9zY3NpbXNnID0gU01SRUpFQ1Q7CisJCQkJCUFDQ0VQVF9NU0dfQVROKHBvcnQpOworCQkJCX0KKwkJCX0KKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKwkJCWVsc2UgaWYgKG1lc3NhZ2UgPT0gU01XRFRSKSAKKwkJCXsKKworCQkJCWlmIChsZW5ndGggPT0gMHgwMikKKwkJCQl7CisKKwkJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCQkJc3R3aWRuKHBvcnQscF9jYXJkKTsKKwkJCQl9CisJCQkJZWxzZSAKKwkJCQl7CisKKwkJCQkJcEN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPSBTTVJFSkVDVDsKKwkJCQkJQUNDRVBUX01TR19BVE4ocG9ydCk7CisKKwkJCQkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQllbHNlIAorCQkJeworCisJCQkJcEN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPSBTTVJFSkVDVDsKKwkJCQlBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKworCQkJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYocEN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgIT0gU01QQVJJVFkpCisJCQkJQUNDRVBUX01TRyhwb3J0KTsKKwkJCVdSX0hBUlBPT04ocG9ydCtocF9hdXRvc3RhcnRfMSwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworCQl9CisJfWVsc2UKKwl7CisJCQlpZihwQ3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9PSBTTVBBUklUWSkKKwkJCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2lzeW5jbgorICoKKyAqIERlc2NyaXB0aW9uOiBSZWFkIGluIGEgbWVzc2FnZSBieXRlIGZyb20gdGhlIFNDU0kgYnVzLCBhbmQgY2hlY2sKKyAqICAgICAgICAgICAgICBmb3IgYSBwYXJpdHkgZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzaXN5bmNuKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFVDSEFSIHN5bmNGbGFnKQorI2Vsc2UKK1VDSEFSIHNpc3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkLCBVQ0hBUiBzeW5jRmxhZykKKyNlbmRpZgoreworICAgUFNDQ0IgY3VyclNDQ0I7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworICAgaWYgKCEoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1NZTkNfTUFTSykgPT0gU1lOQ19UUllJTkcpKSB7CisKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQpLAorICAgICAgICAgICAgICAgICAoTVBNX09QK0FNU0dfT1VUKyhjdXJyU0NDQi0+U2NjYl9pZG1zZyAmIH4oVUNIQVIpRElTQ19QUklWKSkpOworCisgICAgICBXUldfSEFSUE9PTigocG9ydCtJRF9NU0dfU1RSVCsyKSxCUkhfT1ArQUxXQVlTK0NNRFBaKTsKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzApLCAoTVBNX09QK0FNU0dfT1VUK1NNRVhUICkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzIpLCAoTVBNX09QK0FNU0dfT1VUKzB4MDMgICkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzQpLCAoTVBNX09QK0FNU0dfT1VUK1NNU1lOQykpOworCisKKyAgICAgIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzIwTUIpCisKKwkgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzYpLCAoTVBNX09QK0FNU0dfT1VUKyAxMikpOworCisgICAgICBlbHNlIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzEwTUIpCisKKwkgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzYpLCAoTVBNX09QK0FNU0dfT1VUKyAyNSkpOworCisgICAgICBlbHNlIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzVNQikKKworCSBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNiksIChNUE1fT1ArQU1TR19PVVQrIDUwKSk7CisKKyAgICAgIGVsc2UKKwkgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzYpLCAoTVBNX09QK0FNU0dfT1VUKyAwMCkpOworCisKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys4KSwgKFJBVF9PUCAgICAgICAgICAgICAgICApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUysxMCksKE1QTV9PUCtBTVNHX09VVCtERUZBVUxUX09GRlNFVCkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEyKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworCisKKwkJaWYoc3luY0ZsYWcgPT0gRkFMU0UpCisJCXsKKwkJICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoU0VMRUNUK1NFTENIS19TVFJUKSk7CisJICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgPSAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYKKyAgIAkgICAgICB+KFVDSEFSKVRBUl9TWU5DX01BU0spIHwgKFVDSEFSKVNZTkNfVFJZSU5HKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoQVVUT19JTU1FRCArIENNRF9PTkxZX1NUUlQpKTsKKwkJfQorCisKKyAgICAgIHJldHVybihUUlVFKTsKKyAgICAgIH0KKworICAgZWxzZSB7CisKKyAgICAgIGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzIHw9CSAoVUNIQVIpU1lOQ19TVVBQT1JURUQ7CisgICAgICBjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJj0gfkVFX1NZTkNfTUFTSzsKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgICB9Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzdHN5bmNuCisgKgorICogRGVzY3JpcHRpb246IFRoZSBoYXMgc2VudCB1cyBhIFN5bmMgTmVnbyBtZXNzYWdlIHNvIGhhbmRsZSBpdCBhcworICogICAgICAgICAgICAgIG5lY2Vzc2FyeS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHN0c3luY24oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHN0c3luY24oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBVQ0hBUiBzeW5jX21zZyxvZmZzZXQsc3luY19yZWcsb3VyX3N5bmNfbXNnOworICAgUFNDQ0IgY3VyclNDQ0I7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworICAgc3luY19tc2cgPSBzZm0ocG9ydCxjdXJyU0NDQik7CisKKwlpZigoc3luY19tc2cgPT0gMHgwMCkgJiYgKGN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPT0gU01QQVJJVFkpKQorCXsKKwkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCXJldHVybjsKKwl9CisKKyAgIEFDQ0VQVF9NU0cocG9ydCk7CisKKworICAgb2Zmc2V0ID0gc2ZtKHBvcnQsY3VyclNDQ0IpOworCisJaWYoKG9mZnNldCA9PSAweDAwKSAmJiAoY3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyA9PSBTTVBBUklUWSkpCisJeworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwkJcmV0dXJuOworCX0KKworICAgaWYgKChjdXJyVGFyX0luZm8tPlRhckVFVmFsdWUgJiBFRV9TWU5DX01BU0spID09IEVFX1NZTkNfMjBNQikKKworICAgICAgb3VyX3N5bmNfbXNnID0gMTI7ICAgICAgICAgICAgICAvKiBTZXR1cCBvdXIgTWVzc2FnZSB0byAyMG1iL3MgKi8KKworICAgZWxzZSBpZiAoKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykgPT0gRUVfU1lOQ18xME1CKQorCisgICAgICBvdXJfc3luY19tc2cgPSAyNTsgICAgICAgICAgICAgIC8qIFNldHVwIG91ciBNZXNzYWdlIHRvIDEwbWIvcyAqLworCisgICBlbHNlIGlmICgoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSA9PSBFRV9TWU5DXzVNQikKKworICAgICAgb3VyX3N5bmNfbXNnID0gNTA7ICAgICAgICAgICAgICAvKiBTZXR1cCBvdXIgTWVzc2FnZSB0byA1bWIvcyAqLworICAgZWxzZQorCisgICAgICBvdXJfc3luY19tc2cgPSAwOyAgICAgICAgICAgICAgIC8qIE1lc3NhZ2UgPSBBc3luYyAqLworCisgICBpZiAoc3luY19tc2cgPCBvdXJfc3luY19tc2cpIHsKKyAgICAgIHN5bmNfbXNnID0gb3VyX3N5bmNfbXNnOyAgICAvKmlmIGZhc3RlciwgdGhlbiBzZXQgdG8gbWF4LiAqLworICAgICAgfQorCisgICBpZiAob2Zmc2V0ID09IEFTWU5DKQorICAgICAgc3luY19tc2cgPSBBU1lOQzsKKworICAgaWYgKG9mZnNldCA+IE1BWF9PRkZTRVQpCisgICAgICBvZmZzZXQgPSBNQVhfT0ZGU0VUOworCisgICBzeW5jX3JlZyA9IDB4MDA7CisKKyAgIGlmIChzeW5jX21zZyA+IDEyKQorCisgICAgICBzeW5jX3JlZyA9IDB4MjA7ICAgICAgICAvKiBVc2UgMTBNQi9zICovCisKKyAgIGlmIChzeW5jX21zZyA+IDI1KQorCisgICAgICBzeW5jX3JlZyA9IDB4NDA7ICAgICAgICAvKiBVc2UgNi42TUIvcyAqLworCisgICBpZiAoc3luY19tc2cgPiAzOCkKKworICAgICAgc3luY19yZWcgPSAweDYwOyAgICAgICAgLyogVXNlIDVNQi9zICovCisKKyAgIGlmIChzeW5jX21zZyA+IDUwKQorCisgICAgICBzeW5jX3JlZyA9IDB4ODA7ICAgICAgICAvKiBVc2UgNE1CL3MgKi8KKworICAgaWYgKHN5bmNfbXNnID4gNjIpCisKKyAgICAgIHN5bmNfcmVnID0gMHhBMDsgICAgICAgIC8qIFVzZSAzLjMzTUIvcyAqLworCisgICBpZiAoc3luY19tc2cgPiA3NSkKKworICAgICAgc3luY19yZWcgPSAweEMwOyAgICAgICAgLyogVXNlIDIuODVNQi9zICovCisKKyAgIGlmIChzeW5jX21zZyA+IDg3KQorCisgICAgICBzeW5jX3JlZyA9IDB4RTA7ICAgICAgICAvKiBVc2UgMi41TUIvcyAqLworCisgICBpZiAoc3luY19tc2cgPiAxMDApIHsKKworICAgICAgc3luY19yZWcgPSAweDAwOyAgICAgICAgLyogVXNlIEFTWU5DICovCisgICAgICBvZmZzZXQgPSAweDAwOworICAgICAgfQorCisKKyNpZiBkZWZpbmVkKFdJREVfU0NTSSkKKyAgIGlmIChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFdJREVfRU5BQkxFRCkKKworICAgICAgc3luY19yZWcgfD0gb2Zmc2V0OworCisgICBlbHNlCisKKyAgICAgIHN5bmNfcmVnIHw9IChvZmZzZXQgfCBOQVJST1dfU0NTSSk7CisKKyNlbHNlCisgICBzeW5jX3JlZyB8PSAob2Zmc2V0IHwgTkFSUk9XX1NDU0kpOworI2VuZGlmCisKKyAgIHNzc3luY3YocG9ydCxjdXJyU0NDQi0+VGFyZ0lELHN5bmNfcmVnLGN1cnJUYXJfSW5mbyk7CisKKworICAgaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkgeworCisKKyAgICAgIEFDQ0VQVF9NU0cocG9ydCk7CisKKyAgICAgIGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzID0gKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmCisgICAgICAgICB+KFVDSEFSKVRBUl9TWU5DX01BU0spIHwgKFVDSEFSKVNZTkNfU1VQUE9SVEVEKTsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisgICAgICB9CisKKyAgIGVsc2UgeworCisKKyAgICAgIEFDQ0VQVF9NU0dfQVROKHBvcnQpOworCisgICAgICBzaXN5bmNyKHBvcnQsc3luY19tc2csb2Zmc2V0KTsKKworICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgPSAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYKKyAgICAgICAgIH4oVUNIQVIpVEFSX1NZTkNfTUFTSykgfCAoVUNIQVIpU1lOQ19TVVBQT1JURUQpOworICAgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNpc3luY3IKKyAqCisgKiBEZXNjcmlwdGlvbjogQW5zd2VyIHRoZSB0YXJnZXRzIHN5bmMgbWVzc2FnZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNpc3luY3IoVVNIT1JUIHBvcnQsVUNIQVIgc3luY19wdWxzZSwgVUNIQVIgb2Zmc2V0KQorI2Vsc2UKK3ZvaWQgc2lzeW5jcihVTE9ORyBwb3J0LFVDSEFSIHN5bmNfcHVsc2UsIFVDSEFSIG9mZnNldCkKKyNlbmRpZgoreworICAgQVJBTV9BQ0NFU1MocG9ydCk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMCksIChNUE1fT1ArQU1TR19PVVQrU01FWFQgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMiksIChNUE1fT1ArQU1TR19PVVQrMHgwMyAgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNCksIChNUE1fT1ArQU1TR19PVVQrU01TWU5DKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNiksIChNUE1fT1ArQU1TR19PVVQrc3luY19wdWxzZSkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzgpLCAoUkFUX09QICAgICAgICAgICAgICAgICkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEwKSwoTVBNX09QK0FNU0dfT1VUK29mZnNldCkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEyKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworICAgU0dSQU1fQUNDRVNTKHBvcnQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVF8xKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoQVVUT19JTU1FRCtDTURfT05MWV9TVFJUKSk7CisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IEFVVE9fSU5UKSkpIHt9Cit9CisKKworCisjaWYgZGVmaW5lZChXSURFX1NDU0kpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNpd2lkbgorICoKKyAqIERlc2NyaXB0aW9uOiBSZWFkIGluIGEgbWVzc2FnZSBieXRlIGZyb20gdGhlIFNDU0kgYnVzLCBhbmQgY2hlY2sKKyAqICAgICAgICAgICAgICBmb3IgYSBwYXJpdHkgZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzaXdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCitVQ0hBUiBzaXdpZG4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBQU0NDQiBjdXJyU0NDQjsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdOworCisgICBpZiAoISgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfV0lERV9NQVNLKSA9PSBXSURFX05FR09DSUFURUQpKSB7CisKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQpLAorCSAgICAgICAgICAgICAgKE1QTV9PUCtBTVNHX09VVCsoY3VyclNDQ0ItPlNjY2JfaWRtc2cgJiB+KFVDSEFSKURJU0NfUFJJVikpKTsKKworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrSURfTVNHX1NUUlQrMiksQlJIX09QK0FMV0FZUytDTURQWik7CisKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUyswKSwgKE1QTV9PUCtBTVNHX09VVCtTTUVYVCApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUysyKSwgKE1QTV9PUCtBTVNHX09VVCsweDAyICApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys0KSwgKE1QTV9PUCtBTVNHX09VVCtTTVdEVFIpKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys2KSwgKFJBVF9PUCAgICAgICAgICAgICAgICApKTsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K1NZTkNfTVNHUys4KSwgKE1QTV9PUCtBTVNHX09VVCsgU00xNkJJVCkpOworICAgICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEwKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QrU0VMQ0hLX1NUUlQpKTsKKworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyA9ICgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJgorICAgICAgICAgfihVQ0hBUilUQVJfV0lERV9NQVNLKSB8IChVQ0hBUilXSURFX0VOQUJMRUQpOworCisgICAgICByZXR1cm4oVFJVRSk7CisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyA9ICgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJgorICAgICAgICAgICAgICAgfihVQ0hBUilUQVJfV0lERV9NQVNLKSB8IFdJREVfTkVHT0NJQVRFRCk7CisKKyAgICAgIGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmPSB+RUVfV0lERV9TQ1NJOworICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgIH0KK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHN0d2lkbgorICoKKyAqIERlc2NyaXB0aW9uOiBUaGUgaGFzIHNlbnQgdXMgYSBXaWRlIE5lZ28gbWVzc2FnZSBzbyBoYW5kbGUgaXQgYXMKKyAqICAgICAgICAgICAgICBuZWNlc3NhcnkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzdHdpZG4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHN0d2lkbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKyAgIFVDSEFSIHdpZHRoOworICAgUFNDQ0IgY3VyclNDQ0I7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXTsKKworICAgd2lkdGggPSBzZm0ocG9ydCxjdXJyU0NDQik7CisKKwlpZigod2lkdGggPT0gMHgwMCkgJiYgKGN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPT0gU01QQVJJVFkpKQorCXsKKwkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCXJldHVybjsKKwl9CisKKworICAgaWYgKCEoY3VyclRhcl9JbmZvLT5UYXJFRVZhbHVlICYgRUVfV0lERV9TQ1NJKSkKKyAgICAgIHdpZHRoID0gMDsKKworICAgaWYgKHdpZHRoKSB7CisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyB8PSBXSURFX0VOQUJMRUQ7CisgICAgICB3aWR0aCA9IDA7CisgICAgICB9CisgICBlbHNlIHsKKyAgICAgIHdpZHRoID0gTkFSUk9XX1NDU0k7CisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+V0lERV9FTkFCTEVEOworICAgICAgfQorCisKKyAgIHNzc3luY3YocG9ydCxjdXJyU0NDQi0+VGFyZ0lELHdpZHRoLGN1cnJUYXJfSW5mbyk7CisKKworICAgaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9XTl9TVCkKKwl7CisKKworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyB8PQkgV0lERV9ORUdPQ0lBVEVEOworCisJICAgaWYgKCEoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1NZTkNfTUFTSykgPT0gU1lOQ19TVVBQT1JURUQpKQorCQl7CisJICAgICAgQUNDRVBUX01TR19BVE4ocG9ydCk7CisJCSAgIEFSQU1fQUNDRVNTKHBvcnQpOworCSAgICAgCXNpc3luY24ocG9ydCxwX2NhcmQsIFRSVUUpOworCSAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gU0VMRUNUX1NOX1NUOworCQkgICBTR1JBTV9BQ0NFU1MocG9ydCk7CisJCX0KKwkJZWxzZQorCQl7CisJICAgICAgQUNDRVBUX01TRyhwb3J0KTsKKyAgCQkgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0RJU0NPTk5FQ1RfU1RBUlQpKTsKKwkJfQorICAgfQorCisgICBlbHNlIHsKKworCisgICAgICBBQ0NFUFRfTVNHX0FUTihwb3J0KTsKKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkKKyAgICAgIAkgd2lkdGggPSBTTTE2QklUOworICAgICAgZWxzZQorICAgICAgCSB3aWR0aCA9IFNNOEJJVDsKKworICAgICAgc2l3aWRyKHBvcnQsd2lkdGgpOworCisgICAgICBjdXJyVGFyX0luZm8tPlRhclN0YXR1cyB8PSAoV0lERV9ORUdPQ0lBVEVEIHwgV0lERV9FTkFCTEVEKTsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzaXdpZHIKKyAqCisgKiBEZXNjcmlwdGlvbjogQW5zd2VyIHRoZSB0YXJnZXRzIFdpZGUgbmVnbyBtZXNzYWdlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2l3aWRyKFVTSE9SVCBwb3J0LCBVQ0hBUiB3aWR0aCkKKyNlbHNlCit2b2lkIHNpd2lkcihVTE9ORyBwb3J0LCBVQ0hBUiB3aWR0aCkKKyNlbmRpZgoreworICAgQVJBTV9BQ0NFU1MocG9ydCk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMCksIChNUE1fT1ArQU1TR19PVVQrU01FWFQgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrMiksIChNUE1fT1ArQU1TR19PVVQrMHgwMiAgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNCksIChNUE1fT1ArQU1TR19PVVQrU01XRFRSKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrNiksIChSQVRfT1AgICAgICAgICAgICAgICAgKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtTWU5DX01TR1MrOCksKE1QTV9PUCtBTVNHX09VVCt3aWR0aCkpOworICAgV1JXX0hBUlBPT04oKHBvcnQrU1lOQ19NU0dTKzEwKSwoQlJIX09QK0FMV0FZUytOUCAgICAgICkpOworICAgU0dSQU1fQUNDRVNTKHBvcnQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVF8xKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8zLCAoQVVUT19JTU1FRCtDTURfT05MWV9TVFJUKSk7CisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IEFVVE9fSU5UKSkpIHt9Cit9CisKKyNlbmRpZgorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc3NzeW5jdgorICoKKyAqIERlc2NyaXB0aW9uOiBXcml0ZSB0aGUgZGVzaXJlZCB2YWx1ZSB0byB0aGUgU3luYyBSZWdpc3RlciBmb3IgdGhlCisgKiAgICAgICAgICAgICAgSUQgc3BlY2lmaWVkLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc3NzeW5jdihVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2lkLCBVQ0hBUiBwX3N5bmNfdmFsdWUsUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvKQorI2Vsc2UKK3ZvaWQgc3NzeW5jdihVTE9ORyBwX3BvcnQsIFVDSEFSIHBfaWQsIFVDSEFSIHBfc3luY192YWx1ZSxQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm8pCisjZW5kaWYKK3sKKyAgIFVDSEFSIGluZGV4OworCisgICBpbmRleCA9IHBfaWQ7CisKKyAgIHN3aXRjaCAoaW5kZXgpIHsKKworICAgICAgY2FzZSAwOgorCSBpbmRleCA9IDEyOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18wICovCisJIGJyZWFrOworICAgICAgY2FzZSAxOgorCSBpbmRleCA9IDEzOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18xICovCisJIGJyZWFrOworICAgICAgY2FzZSAyOgorCSBpbmRleCA9IDE0OyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18yICovCisJIGJyZWFrOworICAgICAgY2FzZSAzOgorCSBpbmRleCA9IDE1OyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18zICovCisJIGJyZWFrOworICAgICAgY2FzZSA0OgorCSBpbmRleCA9IDg7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ180ICovCisJIGJyZWFrOworICAgICAgY2FzZSA1OgorCSBpbmRleCA9IDk7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ181ICovCisJIGJyZWFrOworICAgICAgY2FzZSA2OgorCSBpbmRleCA9IDEwOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ182ICovCisJIGJyZWFrOworICAgICAgY2FzZSA3OgorCSBpbmRleCA9IDExOyAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ183ICovCisJIGJyZWFrOworICAgICAgY2FzZSA4OgorCSBpbmRleCA9IDQ7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ184ICovCisJIGJyZWFrOworICAgICAgY2FzZSA5OgorCSBpbmRleCA9IDU7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ185ICovCisJIGJyZWFrOworICAgICAgY2FzZSAxMDoKKwkgaW5kZXggPSA2OyAgICAgICAgICAgICAgLyogaHBfc3luY3RhcmdfMTAgKi8KKwkgYnJlYWs7CisgICAgICBjYXNlIDExOgorCSBpbmRleCA9IDc7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18xMSAqLworCSBicmVhazsKKyAgICAgIGNhc2UgMTI6CisJIGluZGV4ID0gMDsgICAgICAgICAgICAgIC8qIGhwX3N5bmN0YXJnXzEyICovCisJIGJyZWFrOworICAgICAgY2FzZSAxMzoKKwkgaW5kZXggPSAxOyAgICAgICAgICAgICAgLyogaHBfc3luY3RhcmdfMTMgKi8KKwkgYnJlYWs7CisgICAgICBjYXNlIDE0OgorCSBpbmRleCA9IDI7ICAgICAgICAgICAgICAvKiBocF9zeW5jdGFyZ18xNCAqLworCSBicmVhazsKKyAgICAgIGNhc2UgMTU6CisJIGluZGV4ID0gMzsgICAgICAgICAgICAgIC8qIGhwX3N5bmN0YXJnXzE1ICovCisKKyAgICAgIH0KKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc3luY3RhcmdfYmFzZStpbmRleCwgcF9zeW5jX3ZhbHVlKTsKKworCWN1cnJUYXJfSW5mby0+VGFyU3luY0N0cmwgPSBwX3N5bmNfdmFsdWU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc3Jlc2IKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVzZXQgdGhlIGRlc2lyZWQgY2FyZCdzIFNDU0kgYnVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc3Jlc2IoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHNyZXNiKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgoreworICAgVUNIQVIgc2NzaUlELCBpOworCisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCkgfCBHX0lOVF9ESVNBQkxFKSk7CisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQ0xSX0FMTF9JTlQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaWN0cmxfMCwgU0NTSV9SU1QpOworCisgICBzY3NpSUQgPSBSRF9IQVJQT09OKHBvcnQraHBfc2VsdGltZW91dCk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfc2VsdGltZW91dCxUT181bXMpOworICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFRJTUVPVVQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwoU0NTSV9QT1JUIHwgU1RBUlRfVE8pKTsKKworICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgVElNRU9VVCkpIHt9CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zZWx0aW1lb3V0LHNjc2lJRCk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpY3RybF8wLCBFTkFfU0NBTV9TRUwpOworCisgICBXYWl0KHBvcnQsIFRPXzVtcyk7CisKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVCk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9pbnRfbWFzaywgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRfbWFzaykgfCAweDAwKSk7CisKKyAgIGZvciAoc2NzaUlEID0gMDsgc2NzaUlEIDwgTUFYX1NDU0lfVEFSOyBzY3NpSUQrKykKKyAgICAgIHsKKyAgICAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXTsKKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1NZTkNfTUFTSykKKyAgICAgICAgIHsKKwkgICAgICAJY3VyclRhcl9JbmZvLT5UYXJTeW5jQ3RybCA9IDA7CisJICAgICAgCWN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICY9IH5UQVJfU1lOQ19NQVNLOworCSAgICAgIH0KKworICAgICAgaWYgKGN1cnJUYXJfSW5mby0+VGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkKKyAgICAgICAgIHsKKyAgICAgIAljdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmPSB+VEFSX1dJREVfTUFTSzsKKyAgICAgIAl9CisKKyAgICAgIHNzc3luY3YocG9ydCwgc2NzaUlELCBOQVJST1dfU0NTSSxjdXJyVGFyX0luZm8pOworCisgICAgICBTY2NiTWdyVGFibGVJbml0VGFyZ2V0KHBfY2FyZCwgc2NzaUlEKTsKKyAgICAgIH0KKworICAgQkxfQ2FyZFtwX2NhcmRdLnNjYW5JbmRleCA9IDB4MDA7CisgICBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0IgPSBOVUxMOworICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICY9IH4oRl9UQUdfU1RBUlRFRCB8IEZfSE9TVF9YRkVSX0FDVCAKKwkJCQkJCQkJCQkJCQl8IEZfTkVXX1NDQ0JfQ01EKTsKKyAgIEJMX0NhcmRbcF9jYXJkXS5jbWRDb3VudGVyICA9IDB4MDA7CisJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgPSAweDAwOworICAgQkxfQ2FyZFtwX2NhcmRdLnRhZ1FfTHN0ID0gMHgwMTsgCisKKwlmb3IoaSA9IDA7IGkgPCBRVUVVRV9ERVBUSDsgaSsrKQorCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2ldID0gTlVMTDsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCwKKyAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc3NlbnNzCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGZvciB0aGUgQXV0byBTZW5zZSBjb21tYW5kLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc3NlbnNzKFBTQ0NCY2FyZCBwQ3VyckNhcmQpCit7CisgICBVQ0hBUiBpOworICAgUFNDQ0IgY3VyclNDQ0I7CisKKyAgIGN1cnJTQ0NCID0gcEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKworCisgICBjdXJyU0NDQi0+U2F2ZV9DZGJMZW4gPSBjdXJyU0NDQi0+Q2RiTGVuZ3RoOworCisgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisKKyAgICAgIGN1cnJTQ0NCLT5TYXZlX0NkYltpXSA9IGN1cnJTQ0NCLT5DZGJbaV07CisgICAgICB9CisKKyAgIGN1cnJTQ0NCLT5DZGJMZW5ndGggPSBTSVhfQllURV9DTUQ7CisgICBjdXJyU0NDQi0+Q2RiWzBdICAgID0gU0NTSV9SRVFVRVNUX1NFTlNFOworICAgY3VyclNDQ0ItPkNkYlsxXSAgICA9IGN1cnJTQ0NCLT5DZGJbMV0gJiAoVUNIQVIpMHhFMDsgLypLZWVwIExVTi4gKi8KKyAgIGN1cnJTQ0NCLT5DZGJbMl0gICAgPSAweDAwOworICAgY3VyclNDQ0ItPkNkYlszXSAgICA9IDB4MDA7CisgICBjdXJyU0NDQi0+Q2RiWzRdICAgID0gY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aDsKKyAgIGN1cnJTQ0NCLT5DZGJbNV0gICAgPSAweDAwOworCisgICBjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID0gKHVuc2lnbmVkIGxvbmcpY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aDsKKworICAgY3VyclNDQ0ItPlNjY2JfQVRDID0gMHgwMDsKKworICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlIHw9IEZfQVVUT19TRU5TRTsKKworICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICY9IH5GX1NHX1hGRVI7CisKKyAgIGN1cnJTQ0NCLT5TY2NiX2lkbXNnID0gY3VyclNDQ0ItPlNjY2JfaWRtc2cgJiB+KFVDSEFSKURJU0NfUFJJVjsKKworICAgY3VyclNDQ0ItPkNvbnRyb2xCeXRlID0gMHgwMDsKKworICAgY3VyclNDQ0ItPlNjY2JfTUdSRmxhZ3MgJj0gRl9TVEFUVVNMT0FERUQ7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzeGZycAorICoKKyAqIERlc2NyaXB0aW9uOiBUcmFuc2ZlciBkYXRhIGludG8gdGhlIGJpdCBidWNrZXQgdW50aWwgdGhlIGRldmljZQorICogICAgICAgICAgICAgIGRlY2lkZXMgdG8gc3dpdGNoIHBoYXNlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzeGZycChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBzeGZycChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgoreworICAgVUNIQVIgY3Vycl9waHo7CisKKworICAgRElTQUJMRV9BVVRPKHBfcG9ydCk7CisKKyAgIGlmIChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpIHsKKworICAgICAgaG9zdERhdGFYZmVyQWJvcnQocF9wb3J0LHBfY2FyZCxCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0IpOworCisgICAgICB9CisKKyAgIC8qIElmIHRoZSBBdXRvbWF0aW9uIGhhbmRsZWQgdGhlIGVuZCBvZiB0aGUgdHJhbnNmZXIgdGhlbiBkbyBub3QKKyAgICAgIG1hdGNoIHRoZSBwaGFzZSBvciB3ZSB3aWxsIGdldCBvdXQgb2Ygc3luYyB3aXRoIHRoZSBJU1IuICAgICAgICovCisKKyAgIGlmIChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFhGRVJfQ05UXzAgfCBBVVRPX0lOVCkpCisgICAgICByZXR1cm47CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJjbnRfMCwgMHgwMCk7CisKKyAgIGN1cnJfcGh6ID0gUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiAoVUNIQVIpU19TQ1NJX1BIWjsKKworICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgWEZFUl9DTlRfMCk7CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgY3Vycl9waHopOworCisgICB3aGlsZSAoICEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSRVNFVCkpICYmCisgICAgICAoY3Vycl9waHogPT0gKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgKFVDSEFSKVNfU0NTSV9QSFopKSApCisgICAgICB7CisgICAgICBpZiAoY3Vycl9waHogJiAoVUNIQVIpU0NTSV9JT0JJVCkKKyAgICAgICAgIHsKKyAgICAgIAlXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLCAoU0NTSV9QT1JUIHwgSE9TVF9QT1JUIHwgU0NTSV9JTkJJVCkpOworCisJICAgICAgaWYgKCEoUkRfSEFSUE9PTihwX3BvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkpCisgICAgICAgICAgICB7CisJICAgICAgICAgUkRfSEFSUE9PTihwX3BvcnQraHBfZmlmb2RhdGFfMCk7CisJICAgICAgICAgfQorCSAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgIAlXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLCAoU0NTSV9QT1JUIHwgSE9TVF9QT1JUIHwgSE9TVF9XUlQpKTsKKyAgIAkgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkKKyAgICAgICAgICAgIHsKKwkgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9maWZvZGF0YV8wLDB4RkEpOworCSAgICAgICAgIH0KKwkgICAgICB9CisgICAgICB9IC8qIEVuZCBvZiBXaGlsZSBsb29wIGZvciBwYWRkaW5nIGRhdGEgSS9PIHBoYXNlICovCisKKyAgICAgIHdoaWxlICggIShSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFJFU0VUKSkpCisgICAgICAgICB7CisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkKKyAgICAgIAkgICBicmVhazsKKyAgICAgICAgIH0KKworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcG9ydGN0cmxfMCwgKFNDU0lfUE9SVCB8IEhPU1RfUE9SVCB8IFNDU0lfSU5CSVQpKTsKKyAgICAgIHdoaWxlICghKFJEX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKQorICAgICAgICAgeworICAgICAgICAgUkRfSEFSUE9PTihwX3BvcnQraHBfZmlmb2RhdGFfMCk7CisgICAgICAgICB9CisKKyAgICAgIGlmICggIShSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChCVVNfRlJFRSB8IFJFU0VUKSkpCisgICAgICAgICB7CisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9hdXRvc3RhcnRfMCwgKEFVVE9fSU1NRUQrRElTQ09OTkVDVF9TVEFSVCkpOworICAgICAgICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBBVVRPX0lOVCkpIHt9CisKKyAgICAgICAgIGlmIChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIChJQ01EX0NPTVAgfCBJVEFSX0RJU0MpKQorICAgCSAgIHdoaWxlICghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUlNFTCkpKSA7CisgICAgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2Noa2RkCisgKgorICogRGVzY3JpcHRpb246IE1ha2Ugc3VyZSBkYXRhIGhhcyBiZWVuIGZsdXNoZWQgZnJvbSBib3RoIEZJRk9zIGFuZCBhYm9ydAorICogICAgICAgICAgICAgIHRoZSBvcGVyYXRpb25zIGlmIG5lY2Vzc2FyeS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2Noa2RkKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBzY2hrZGQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBVU0hPUlQgVGltZU91dExvb3A7CisJVUNIQVIgc1BoYXNlOworCisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKworICAgaWYgKChjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCAhPSBEQVRBX09VVF9TVCkgJiYKKyAgICAgICAoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgIT0gREFUQV9JTl9TVCkpIHsKKyAgICAgIHJldHVybjsKKyAgICAgIH0KKworCisKKyAgIGlmIChjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX09ERF9CQUxMX0NOVCkKKyAgICAgIHsKKworICAgICAgY3VyclNDQ0ItPlNjY2JfQVRDICs9IChjdXJyU0NDQi0+U2NjYl9YZmVyQ250LTEpOworCisgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID0gMTsKKworICAgICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICY9IH5GX09ERF9CQUxMX0NOVDsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ZpZm9yZWFkKSwgKFVTSE9SVCkgMHgwMCk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQsIDB4MDApOworICAgICAgfQorCisgICBlbHNlCisgICAgICB7CisKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX0FUQyArPSBjdXJyU0NDQi0+U2NjYl9YZmVyQ250OworCisgICAgICBjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID0gMDsKKyAgICAgIH0KKworICAgaWYgKChSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiBQQVJJVFkpICYmCisgICAgICAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpIHsKKworICAgICAgY3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX1BBUklUWV9FUlI7CisgICAgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgUEFSSVRZKTsKKyAgICAgIH0KKworCisgICBob3N0RGF0YVhmZXJBYm9ydChwb3J0LHBfY2FyZCxjdXJyU0NDQik7CisKKworICAgd2hpbGUgKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQUNLKSB7fQorCisgICBUaW1lT3V0TG9vcCA9IDA7CisKKyAgIHdoaWxlKFJEX0hBUlBPT04ocG9ydCtocF94ZmVyc3RhdCkgJiBGSUZPX0VNUFRZKQorICAgICAgeworICAgICAgaWYgKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIEJVU19GUkVFKSB7CisJICAgICAgcmV0dXJuOworICAgCSAgIH0KKyAgICAgIGlmIChSRF9IQVJQT09OKHBvcnQraHBfb2Zmc2V0Y3RyKSAmIChVQ0hBUikweDFGKSB7CisJICAgICAgYnJlYWs7CisgICAJICAgfQorICAgICAgaWYgKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIFJFU0VUKSB7CisJICAgICAgcmV0dXJuOworICAgCSAgIH0KKyAgICAgIGlmICgoUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpIHx8IChUaW1lT3V0TG9vcCsrPjB4MzAwMCkgKQorICAgCSAgIGJyZWFrOworICAgICAgfQorCisJc1BoYXNlID0gUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcpICYgKFNDU0lfQlNZIHwgU19TQ1NJX1BIWik7CisgICBpZiAoKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKSAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX29mZnNldGN0cikgJiAoVUNIQVIpMHgxRikgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAoc1BoYXNlID09IChTQ1NJX0JTWSB8IFNfREFUQU9fUEgpKSB8fAorICAgICAgKHNQaGFzZSA9PSAoU0NTSV9CU1kgfCBTX0RBVEFJX1BIKSkpCisgICAgICB7CisKKwkgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworCSAgIGlmICghKGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQUxMX1hGRVJSRUQpKQorICAgICAgICAgeworCSAgICAgIGlmIChjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX0hPU1RfWEZFUl9ESVIpIHsKKwkgICAgICAgICBwaGFzZURhdGFJbihwb3J0LHBfY2FyZCk7CisJICAgICAgCX0KKworCSAgIAllbHNlIHsKKwkgICAgICAgcGhhc2VEYXRhT3V0KHBvcnQscF9jYXJkKTsKKwkgICAgICAgCX0KKwkgICAJfQorCQllbHNlCisgICAgICAJeworCSAgIAlzeGZycChwb3J0LHBfY2FyZCk7CisJICAgCWlmICghKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmCisJCSAgICAgIChCVVNfRlJFRSB8IElDTURfQ09NUCB8IElUQVJfRElTQyB8IFJFU0VUKSkpCisgICAgICAgICB7CisgICAJCVdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBBVVRPX0lOVCk7CisJCSAgIHBoYXNlRGVjb2RlKHBvcnQscF9jYXJkKTsKKwkJICAgfQorCSAgIH0KKworICAgfQorCisgICBlbHNlIHsKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCAweDAwKTsKKyAgICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzaW5pdHMKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgU0NDQiBtYW5hZ2VyIGZpZWxkcyBpbiB0aGlzIFNDQ0IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHNpbml0cyhQU0NDQiBwX3NjY2IsIFVDSEFSIHBfY2FyZCkKK3sKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworCWlmKChwX3NjY2ItPlRhcmdJRCA+IE1BWF9TQ1NJX1RBUikgfHwgKHBfc2NjYi0+THVuID4gTUFYX0xVTikpCisJeworCQlyZXR1cm47CisJfQorICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwX3NjY2ItPlRhcmdJRF07CisKKyAgIHBfc2NjYi0+U2NjYl9YZmVyU3RhdGUgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9YZmVyQ250ICAgICAgID0gcF9zY2NiLT5EYXRhTGVuZ3RoOworCisgICBpZiAoKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBTQ0FUVEVSX0dBVEhFUl9DT01NQU5EKSB8fAorICAgICAgKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNJRFVBTF9TR19DT01NQU5EKSkgeworCisgICAgICBwX3NjY2ItPlNjY2JfU0dvZmZzZXQgICA9IDA7CisgICAgICBwX3NjY2ItPlNjY2JfWGZlclN0YXRlICA9IEZfU0dfWEZFUjsKKyAgICAgIHBfc2NjYi0+U2NjYl9YZmVyQ250ICAgID0gMHgwMDsKKyAgICAgIH0KKworICAgaWYgKHBfc2NjYi0+RGF0YUxlbmd0aCA9PSAweDAwKQorCisgICAgICBwX3NjY2ItPlNjY2JfWGZlclN0YXRlIHw9IEZfQUxMX1hGRVJSRUQ7CisKKyAgIGlmIChwX3NjY2ItPkNvbnRyb2xCeXRlICYgRl9VU0VfQ01EX1EpCisgICAgICB7CisgICAgICBpZiAoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spID09IFRBR19RX1JFSkVDVCkKKyAgICAgICAgIHBfc2NjYi0+Q29udHJvbEJ5dGUgJj0gfkZfVVNFX0NNRF9ROworCisgICAgICBlbHNlCisJICAgICAgY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgfD0gVEFHX1FfVFJZSU5HOworICAgICAgfQorCisvKiAgICAgIEZvciAhc2luZ2xlIFNDU0kgZGV2aWNlIGluIHN5c3RlbSAgJiBkZXZpY2UgYWxsb3cgRGlzY29ubmVjdAorCW9yIGNvbW1hbmQgaXMgdGFnX3EgdHlwZSB0aGVuIHNlbmQgQ21kIHdpdGggRGlzY29ubmVjdCBFbmFibGUKKwllbHNlIHNlbmQgQ21kIHdpdGggRGlzY29ubmVjdCBEaXNhYmxlICovCisKKy8qCisgICBpZiAoKCghKEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmIEZfU0lOR0xFX0RFVklDRSkpICYmCisgICAgICAoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfQUxMT1dfRElTQykpIHx8CisgICAgICAoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQUdfUV9UUllJTkcpKSB7CisqLworICAgaWYgKChjdXJyVGFyX0luZm8tPlRhclN0YXR1cyAmIFRBUl9BTExPV19ESVNDKSB8fAorICAgICAgKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFHX1FfVFJZSU5HKSkgeworICAgICAgcF9zY2NiLT5TY2NiX2lkbXNnICAgICAgPSAoVUNIQVIpKFNNSURFTlQgfCBESVNDX1BSSVYpIHwgcF9zY2NiLT5MdW47CisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICBwX3NjY2ItPlNjY2JfaWRtc2cgICAgICA9IChVQ0hBUilTTUlERU5UIHwgcF9zY2NiLT5MdW47CisgICAgICB9CisKKyAgIHBfc2NjYi0+SG9zdFN0YXR1cyAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+VGFyZ2V0U3RhdHVzICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl90YWcgICAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9NR1JGbGFncyAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9zZ3NlZyAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9BVEMgICAgICAgICAgID0gMHgwMDsKKyAgIHBfc2NjYi0+U2NjYl9zYXZlZEFUQyAgICAgID0gMHgwMDsKKy8qCisgICBwX3NjY2ItPlNjY2JWaXJ0RGF0YVB0ciAgICA9IDB4MDA7CisgICBwX3NjY2ItPlNjY2JfZm9yd2FyZGxpbmsgICA9IE5VTEw7CisgICBwX3NjY2ItPlNjY2JfYmFja2xpbmsgICAgICA9IE5VTEw7CisgKi8KKyAgIHBfc2NjYi0+U2NjYl9zY3Npc3RhdCAgICAgID0gQlVTX0ZSRUVfU1Q7CisgICBwX3NjY2ItPlNjY2JTdGF0dXMgICAgICAgICA9IFNDQ0JfSU5fUFJPQ0VTUzsKKyAgIHBfc2NjYi0+U2NjYl9zY3NpbXNnICAgICAgID0gU01OT19PUDsKKworfQorCisKKyNpZGVudCAiJElkOiBwaGFzZS5jIDEuMTEgMTk5Ny8wMS8zMSAwMjowODo0OSBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgcGhhc2UuYyAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgdG8gaW5pdGlhbGx5IGhhbmRsZSB0aGUgU0NTSSBidXMgcGhhc2Ugd2hlbgorICogICAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgYXNzZXJ0cyByZXF1ZXN0IChhbmQgdGhlIGF1dG9tYXRpb24gaXMgbm90CisgKiAgICAgICAgICAgICAgICAgZW5hYmxlZCB0byBoYW5kbGUgdGhlIHNpdHVhdGlvbikuCisgKgorICogICAkRGF0ZTogMTk5Ny8wMS8zMSAwMjowODo0OSAkCisgKgorICogICAkUmV2aXNpb246IDEuMTEgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworCisvKgorZXh0ZXJuIFNDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXTsKK2V4dGVybiBTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdOworCisjaWYgZGVmaW5lZChPUzIpCisgICBleHRlcm4gdm9pZCAoZmFyICpzX1BoYXNlVGJsWzhdKSAoVUxPTkcsIFVDSEFSKTsKKyNlbHNlCisgICAjaWYgZGVmaW5lZChET1MpCisgICAgICBleHRlcm4gdm9pZCAoKnNfUGhhc2VUYmxbOF0pIChVU0hPUlQsIFVDSEFSKTsKKyAgICNlbHNlCisgICAgICBleHRlcm4gdm9pZCAoKnNfUGhhc2VUYmxbOF0pIChVTE9ORywgVUNIQVIpOworICAgI2VuZGlmCisjZW5kaWYKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFBoYXNlIERlY29kZQorICoKKyAqIERlc2NyaXB0aW9uOiBEZXRlcm1pbmUgdGhlIHBoYXNlIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VEZWNvZGUoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VEZWNvZGUoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKyAgIHVuc2lnbmVkIGNoYXIgcGhhc2VfcmVmOworI2lmIGRlZmluZWQoT1MyKQorICAgdm9pZCAoZmFyICpwaGFzZSkgKFVMT05HLCBVQ0hBUik7CisjZWxzZQorICAgI2lmIGRlZmluZWQoRE9TKQorICAgICAgdm9pZCAoKnBoYXNlKSAoVVNIT1JULCBVQ0hBUik7CisgICAjZWxzZQorICAgICAgdm9pZCAoKnBoYXNlKSAoVUxPTkcsIFVDSEFSKTsKKyAgICNlbmRpZgorI2VuZGlmCisKKworICAgRElTQUJMRV9BVVRPKHBfcG9ydCk7CisKKyAgIHBoYXNlX3JlZiA9IChVQ0hBUikgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgU19TQ1NJX1BIWik7CisKKyAgIHBoYXNlID0gc19QaGFzZVRibFtwaGFzZV9yZWZdOworCisgICAoKnBoYXNlKShwX3BvcnQsIHBfY2FyZCk7ICAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZWN0IHBoYXNlIGZ1bmMgKi8KK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IERhdGEgT3V0IFBoYXNlCisgKgorICogRGVzY3JpcHRpb246IFN0YXJ0IHVwIGJvdGggdGhlIEJ1c01hc3RlciBhbmQgWGJvdy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKE9TMikKK3ZvaWQgZmFyIHBoYXNlRGF0YU91dChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBwaGFzZURhdGFPdXQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHBoYXNlRGF0YU91dChVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKKyNlbmRpZgoreworCisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisgICBpZiAoY3VyclNDQ0IgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgIHJldHVybjsgIC8qIEV4aXQgaWYgTm8gU0NDQiByZWNvcmQgKi8KKyAgICAgIH0KKworICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBEQVRBX09VVF9TVDsKKyAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmPSB+KEZfSE9TVF9YRkVSX0RJUiB8IEZfTk9fREFUQV9ZRVQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKworICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFhGRVJfQ05UXzApOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzAsIChFTkRfREFUQStFTkRfREFUQV9TVEFSVCkpOworCisgICBkYXRhWGZlclByb2Nlc3Nvcihwb3J0LCAmQkxfQ2FyZFtwX2NhcmRdKTsKKworI2lmIGRlZmluZWQoTk9CVUdCVUcpCisgICBpZiAoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgWEZFUl9DTlRfMCkKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBYRkVSX0NOVF8wKTsKKworI2VuZGlmCisKKworICAgaWYgKGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPT0gMCkgeworCisKKyAgICAgIGlmICgoY3VyclNDQ0ItPkNvbnRyb2xCeXRlICYgU0NDQl9EQVRBX1hGRVJfT1VUKSAmJgorCSAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpCisJIGN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9EQVRBX09WRVJfUlVOOworCisgICAgICBzeGZycChwb3J0LHBfY2FyZCk7CisgICAgICBpZiAoIShSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSRVNFVCkpKQorCSAgICBwaGFzZURlY29kZShwb3J0LHBfY2FyZCk7CisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogRGF0YSBJbiBQaGFzZQorICoKKyAqIERlc2NyaXB0aW9uOiBTdGFydHVwIHRoZSBCdXNNYXN0ZXIgYW5kIHRoZSBYQk9XLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoT1MyKQordm9pZCBmYXIgcGhhc2VEYXRhSW4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VEYXRhSW4oVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHBoYXNlRGF0YUluKFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgorI2VuZGlmCit7CisKKyAgIFBTQ0NCIGN1cnJTQ0NCOworCisgICBjdXJyU0NDQiA9IEJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQjsKKworICAgaWYgKGN1cnJTQ0NCID09IE5VTEwpCisgICAgICB7CisgICAgICByZXR1cm47ICAvKiBFeGl0IGlmIE5vIFNDQ0IgcmVjb3JkICovCisgICAgICB9CisKKworICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBEQVRBX0lOX1NUOworICAgY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlIHw9IEZfSE9TVF9YRkVSX0RJUjsKKyAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmPSB+Rl9OT19EQVRBX1lFVDsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3BvcnRjdHJsXzAsIFNDU0lfUE9SVCk7CisKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBYRkVSX0NOVF8wKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8wLCAoRU5EX0RBVEErRU5EX0RBVEFfU1RBUlQpKTsKKworICAgZGF0YVhmZXJQcm9jZXNzb3IocG9ydCwgJkJMX0NhcmRbcF9jYXJkXSk7CisKKyAgIGlmIChjdXJyU0NDQi0+U2NjYl9YZmVyQ250ID09IDApIHsKKworCisgICAgICBpZiAoKGN1cnJTQ0NCLT5Db250cm9sQnl0ZSAmIFNDQ0JfREFUQV9YRkVSX0lOKSAmJgorCSAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpCisJIGN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9EQVRBX09WRVJfUlVOOworCisgICAgICBzeGZycChwb3J0LHBfY2FyZCk7CisgICAgICBpZiAoIShSRFdfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSkgJiAoQlVTX0ZSRUUgfCBSRVNFVCkpKQorCSAgICBwaGFzZURlY29kZShwb3J0LHBfY2FyZCk7CisKKyAgICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQ29tbWFuZCBQaGFzZQorICoKKyAqIERlc2NyaXB0aW9uOiBMb2FkIHRoZSBDREIgaW50byB0aGUgYXV0b21hdGlvbiBhbmQgc3RhcnQgaXQgdXAuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChPUzIpCit2b2lkIGZhciBwaGFzZUNvbW1hbmQoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBwaGFzZUNvbW1hbmQoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VDb21tYW5kKFVMT05HIHBfcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworI2lmIGRlZmluZWQoRE9TKQorICAgVVNIT1JUIGNkYl9yZWc7CisjZWxzZQorICAgVUxPTkcgY2RiX3JlZzsKKyNlbmRpZgorICAgVUNIQVIgaTsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKyAgIGlmIChjdXJyU0NDQi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNFVF9DT01NQU5EKSB7CisKKyAgICAgIGN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9QSEFTRV9TRVFVRU5DRV9GQUlMOworICAgICAgY3VyclNDQ0ItPkNkYkxlbmd0aCA9IFNJWF9CWVRFX0NNRDsKKyAgICAgIH0KKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgMHgwMCk7CisKKyAgIEFSQU1fQUNDRVNTKHBfcG9ydCk7CisKKworICAgY2RiX3JlZyA9IHBfcG9ydCArIENNRF9TVFJUOworCisgICBmb3IgKGk9MDsgaSA8IGN1cnJTQ0NCLT5DZGJMZW5ndGg7IGkrKykgeworCisgICAgICBpZiAoY3VyclNDQ0ItPk9wZXJhdGlvbkNvZGUgPT0gUkVTRVRfQ09NTUFORCkKKworCSBXUldfSEFSUE9PTihjZGJfcmVnLCAoTVBNX09QICsgQUNPTU1BTkQgKyAweDAwKSk7CisKKyAgICAgIGVsc2UKKwkgV1JXX0hBUlBPT04oY2RiX3JlZywgKE1QTV9PUCArIEFDT01NQU5EICsgY3VyclNDQ0ItPkNkYltpXSkpOworICAgICAgY2RiX3JlZyArPTI7CisgICAgICB9CisKKyAgIGlmIChjdXJyU0NDQi0+Q2RiTGVuZ3RoICE9IFRXRUxWRV9CWVRFX0NNRCkKKyAgICAgIFdSV19IQVJQT09OKGNkYl9yZWcsIChCUkhfT1ArQUxXQVlTKyAgICBOUCkpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLChTQ1NJX1BPUlQpKTsKKworICAgY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPSBDT01NQU5EX1NUOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9hdXRvc3RhcnRfMywgKEFVVE9fSU1NRUQgfCBDTURfT05MWV9TVFJUKSk7CisgICBTR1JBTV9BQ0NFU1MocF9wb3J0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBTdGF0dXMgcGhhc2UKKyAqCisgKiBEZXNjcmlwdGlvbjogQnJpbmcgaW4gdGhlIHN0YXR1cyBhbmQgY29tbWFuZCBjb21wbGV0ZSBtZXNzYWdlIGJ5dGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChPUzIpCit2b2lkIGZhciBwaGFzZVN0YXR1cyhVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQorI2lmIGRlZmluZWQoRE9TKQordm9pZCBwaGFzZVN0YXR1cyhVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VTdGF0dXMoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIC8qIFN0YXJ0LXVwIHRoZSBhdXRvbWF0aW9uIHRvIGZpbmlzaCBvZmYgdGhpcyBjb21tYW5kIGFuZCBsZXQgdGhlCisgICAgICBpc3IgaGFuZGxlIHRoZSBpbnRlcnJ1cHQgZm9yIGNvbW1hbmQgY29tcGxldGUgd2hlbiBpdCBjb21lcyBpbi4KKyAgICAgIFdlIGNvdWxkIHdhaXQgaGVyZSBmb3IgdGhlIGludGVycnVwdCB0byBiZSBnZW5lcmF0ZWQ/CisgICAgKi8KKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIDB4MDApOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzAsIChBVVRPX0lNTUVEK0VORF9EQVRBX1NUQVJUKSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUGhhc2UgTWVzc2FnZSBPdXQKKyAqCisgKiBEZXNjcmlwdGlvbjogU2VuZCBvdXQgb3VyIG1lc3NhZ2UgKGlmIHdlIGhhdmUgb25lKSBhbmQgaGFuZGxlIHdoYXRldmVyCisgKiAgICAgICAgICAgICAgZWxzZSBpcyBpbnZvbGVkLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoT1MyKQordm9pZCBmYXIgcGhhc2VNc2dPdXQoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VNc2dPdXQoVVNIT1JUIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbHNlCit2b2lkIHBoYXNlTXNnT3V0KFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCkKKyNlbmRpZgorI2VuZGlmCit7CisJVUNIQVIgbWVzc2FnZSxzY3NpSUQ7CisJUFNDQ0IgY3VyclNDQ0I7CisJUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisJY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKwlpZiAoY3VyclNDQ0IgIT0gTlVMTCkgeworCisJCW1lc3NhZ2UgPSBjdXJyU0NDQi0+U2NjYl9zY3NpbXNnOworCQlzY3NpSUQgPSBjdXJyU0NDQi0+VGFyZ0lEOworCisJCWlmIChtZXNzYWdlID09IFNNREVWX1JFU0VUKSAKKwkJeworCisKKwkJCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXTsKKwkJCWN1cnJUYXJfSW5mby0+VGFyU3luY0N0cmwgPSAwOworCQkJc3NzeW5jdihwb3J0LCBzY3NpSUQsIE5BUlJPV19TQ1NJLGN1cnJUYXJfSW5mbyk7CisKKwkJCWlmIChzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJFRVZhbHVlICYgRUVfU1lOQ19NQVNLKSAKKwkJCXsKKworCQkJCXNjY2JNZ3JUYmxbcF9jYXJkXVtzY3NpSURdLlRhclN0YXR1cyAmPSB+VEFSX1NZTkNfTUFTSzsKKworCQkJfQorCisJCQlpZiAoc2NjYk1nclRibFtwX2NhcmRdW3Njc2lJRF0uVGFyRUVWYWx1ZSAmIEVFX1dJREVfU0NTSSkgCisJCQl7CisKKwkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJTdGF0dXMgJj0gflRBUl9XSURFX01BU0s7CisJCQl9CisKKworCQkJcXVldWVGbHVzaFNjY2IocF9jYXJkLFNDQ0JfQ09NUExFVEUpOworCQkJU2NjYk1nclRhYmxlSW5pdFRhcmdldChwX2NhcmQsc2NzaUlEKTsKKwkJfQorCQllbHNlIGlmIChjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCA9PSBBQk9SVF9TVCkKKwkJeworCQkJY3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0NPTVBMRVRFOworCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddICE9IE5VTEwpCisJCQl7CisJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddID0gTlVMTDsKKwkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bc2NzaUlEXS5UYXJUYWdRX0NudC0tOworCQkJfQorCQkJCQkKKwkJfQorCisJCWVsc2UgaWYgKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0IDwgQ09NTUFORF9TVCkgCisJCXsKKworCisJCQlpZihtZXNzYWdlID09IFNNTk9fT1ApCisJCQl7CisJCQkJY3VyclNDQ0ItPlNjY2JfTUdSRmxhZ3MgfD0gRl9ERVZfU0VMRUNURUQ7CisJCQorCQkJCXNzZWwocG9ydCxwX2NhcmQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbHNlIAorCQl7CisKKworCQkJaWYgKG1lc3NhZ2UgPT0gU01BQk9SVCkKKworCQkJCXF1ZXVlRmx1c2hTY2NiKHBfY2FyZCxTQ0NCX0NPTVBMRVRFKTsKKwkJfQorCisJfQorCWVsc2UgCisJeworCQltZXNzYWdlID0gU01BQk9SVDsKKwl9CisKKwlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgUEhBU0UgfCBYRkVSX0NOVF8wKSk7CisKKworCVdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCBTQ1NJX0JVU19FTik7CisKKwlXUl9IQVJQT09OKHBvcnQraHBfc2NzaWRhdGFfMCxtZXNzYWdlKTsKKworCVdSX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworCisJQUNDRVBUX01TRyhwb3J0KTsKKworCVdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCAweDAwKTsKKworCWlmICgobWVzc2FnZSA9PSBTTUFCT1JUKSB8fCAobWVzc2FnZSA9PSBTTURFVl9SRVNFVCkgfHwgCisJCQkJKG1lc3NhZ2UgPT0gU01BQk9SVF9UQUcpICkgCisJeworCisJCXdoaWxlKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgKEJVU19GUkVFIHwgUEhBU0UpKSkge30KKworCQlpZiAoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgQlVTX0ZSRUUpIAorCQl7CisJCQlXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQlVTX0ZSRUUpOworCisJCQlpZiAoY3VyclNDQ0IgIT0gTlVMTCkgCisJCQl7CisKKwkJCQlpZigoQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKQorCQkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IEZBTFNFOworCQkJCWVsc2UKKwkJCQkJc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbMF0gPSBGQUxTRTsKKworCQkJCXF1ZXVlQ21kQ29tcGxldGUoJkJMX0NhcmRbcF9jYXJkXSxjdXJyU0NDQiwgcF9jYXJkKTsKKwkJCX0KKworCQkJZWxzZSAKKwkJCXsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisJCQl9CisJCX0KKworCQllbHNlIAorCQl7CisKKwkJCXN4ZnJwKHBvcnQscF9jYXJkKTsKKwkJfQorCX0KKworCWVsc2UgCisJeworCisJCWlmKG1lc3NhZ2UgPT0gU01QQVJJVFkpCisJCXsKKwkJCWN1cnJTQ0NCLT5TY2NiX3Njc2ltc2cgPSBTTU5PX09QOworCQkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzeGZycChwb3J0LHBfY2FyZCk7CisJCX0KKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogTWVzc2FnZSBJbiBwaGFzZQorICoKKyAqIERlc2NyaXB0aW9uOiBCcmluZyBpbiB0aGUgbWVzc2FnZSBhbmQgZGV0ZXJtaW5lIHdoYXQgdG8gZG8gd2l0aCBpdC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKE9TMikKK3ZvaWQgZmFyIHBoYXNlTXNnSW4oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VNc2dJbihVU0hPUlQgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKK3ZvaWQgcGhhc2VNc2dJbihVTE9ORyBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKKyNlbmRpZgoreworCVVDSEFSIG1lc3NhZ2U7CisJUFNDQ0IgY3VyclNDQ0I7CisKKwljdXJyU0NDQiA9IEJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQjsKKworCWlmIChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpIAorCXsKKworCQlwaGFzZUNoa0ZpZm8ocG9ydCwgcF9jYXJkKTsKKwl9CisKKwltZXNzYWdlID0gUkRfSEFSUE9PTihwb3J0K2hwX3Njc2lkYXRhXzApOworCWlmICgobWVzc2FnZSA9PSBTTURJU0MpIHx8IChtZXNzYWdlID09IFNNU0FWRV9EQVRBX1BUUikpIAorCXsKKworCQlXUl9IQVJQT09OKHBvcnQraHBfYXV0b3N0YXJ0XzEsIChBVVRPX0lNTUVEK0VORF9EQVRBX1NUQVJUKSk7CisKKwl9CisKKwllbHNlIAorCXsKKworCQltZXNzYWdlID0gc2ZtKHBvcnQsY3VyclNDQ0IpOworCQlpZiAobWVzc2FnZSkgCisJCXsKKworCisJCQlzZGVjbShtZXNzYWdlLHBvcnQscF9jYXJkKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaW1zZyAhPSBTTVBBUklUWSkKKwkJCQlBQ0NFUFRfTVNHKHBvcnQpOworCQkJV1JfSEFSUE9PTihwb3J0K2hwX2F1dG9zdGFydF8xLCAoQVVUT19JTU1FRCtESVNDT05ORUNUX1NUQVJUKSk7CisJCX0KKwl9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBJbGxlZ2FsIHBoYXNlCisgKgorICogRGVzY3JpcHRpb246IFRhcmdldCBzd2l0Y2hlZCB0byBzb21lIGlsbGVnYWwgcGhhc2UsIHNvIGFsbCB3ZSBjYW4gZG8KKyAqICAgICAgICAgICAgICBpcyByZXBvcnQgYW4gZXJyb3IgYmFjayB0byB0aGUgaG9zdCAoaWYgdGhhdCBpcyBwb3NzaWJsZSkKKyAqICAgICAgICAgICAgICBhbmQgc2VuZCBhbiBBQk9SVCBtZXNzYWdlIHRvIHRoZSBtaXNiZWhhdmluZyB0YXJnZXQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChPUzIpCit2b2lkIGZhciBwaGFzZUlsbGVnYWwoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2Vsc2UKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VJbGxlZ2FsKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBwaGFzZUlsbGVnYWwoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworCisgICBjdXJyU0NDQiA9IEJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQjsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lzaWcsIFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSk7CisgICBpZiAoY3VyclNDQ0IgIT0gTlVMTCkgeworCisgICAgICBjdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfUEhBU0VfU0VRVUVOQ0VfRkFJTDsKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID0gQUJPUlRfU1Q7CisgICAgICBjdXJyU0NDQi0+U2NjYl9zY3NpbXNnID0gU01BQk9SVDsKKyAgICAgIH0KKworICAgQUNDRVBUX01TR19BVE4ocG9ydCk7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBQaGFzZSBDaGVjayBGSUZPCisgKgorICogRGVzY3JpcHRpb246IE1ha2Ugc3VyZSBkYXRhIGhhcyBiZWVuIGZsdXNoZWQgZnJvbSBib3RoIEZJRk9zIGFuZCBhYm9ydAorICogICAgICAgICAgICAgIHRoZSBvcGVyYXRpb25zIGlmIG5lY2Vzc2FyeS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VDaGtGaWZvKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBwaGFzZUNoa0ZpZm8oVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBVTE9ORyB4ZmVyY250OworICAgUFNDQ0IgY3VyclNDQ0I7CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworCisgICBpZiAoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gREFUQV9JTl9TVCkKKyAgICAgIHsKKworICAgICAgd2hpbGUoKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKSAmJgorCSAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkpIHt9CisKKworICAgICAgaWYgKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKQorICAgICAgICAgeworCSAgICAgIGN1cnJTQ0NCLT5TY2NiX0FUQyArPSBjdXJyU0NDQi0+U2NjYl9YZmVyQ250OworCisJICAgICAgY3VyclNDQ0ItPlNjY2JfWGZlckNudCA9IDA7CisKKwkgICAgICBpZiAoKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIFBBUklUWSkgJiYKKwkgICAgICAgICAgICAoY3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gU0NDQl9DT01QTEVURSkpCisgICAgICAgICAgICB7CisJICAgICAgICAgY3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX1BBUklUWV9FUlI7CisJICAgICAgICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIFBBUklUWSk7CisJICAgICAgICAgfQorCisJICAgICAgaG9zdERhdGFYZmVyQWJvcnQocG9ydCxwX2NhcmQsY3VyclNDQ0IpOworCisJICAgICAgZGF0YVhmZXJQcm9jZXNzb3IocG9ydCwgJkJMX0NhcmRbcF9jYXJkXSk7CisKKwkgICAgICB3aGlsZSgoIShSRF9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQpICYgRklGT19FTVBUWSkpICYmCisJICAgICAgICAgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSkge30KKworCSAgICAgIH0KKyAgICAgIH0gIC8qRW5kIERhdGEgSW4gc3BlY2lmaWMgY29kZS4gKi8KKworCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGFzbSB7IG1vdiBkeCxwb3J0OworICAgICAgYWRkIGR4LGhwX3hmZXJjbnRfMjsKKyAgICAgIGluICBhbCxkeDsKKyAgICAgIGRlYyBkeDsKKyAgICAgIHhvciBhaCxhaDsKKyAgICAgIG1vdiB3b3JkIHB0ciB4ZmVyY250KzIsYXg7CisgICAgICBpbiAgYWwsZHg7CisgICAgICBkZWMgZHg7CisgICAgICBtb3YgYWgsYWw7CisgICAgICBpbiAgYWwsZHg7CisgICAgICBtb3Ygd29yZCBwdHIgeGZlcmNudCxheDsKKyAgICAgIH0KKyNlbHNlCisgICBHRVRfWEZFUl9DTlQocG9ydCx4ZmVyY250KTsKKyNlbmRpZgorCisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyY250XzAsIDB4MDApOworCisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLCAweDAwKTsKKworICAgY3VyclNDQ0ItPlNjY2JfQVRDICs9IChjdXJyU0NDQi0+U2NjYl9YZmVyQ250IC0geGZlcmNudCk7CisKKyAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPSB4ZmVyY250OworCisgICBpZiAoKFJEV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpKSAmIFBBUklUWSkgJiYKKyAgICAgIChjdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSBTQ0NCX0NPTVBMRVRFKSkgeworCisgICAgICBjdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfUEFSSVRZX0VSUjsKKyAgICAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBQQVJJVFkpOworICAgICAgfQorCisKKyAgIGhvc3REYXRhWGZlckFib3J0KHBvcnQscF9jYXJkLGN1cnJTQ0NCKTsKKworCisgICBXUl9IQVJQT09OKHBvcnQraHBfZmlmb3dyaXRlLCAweDAwKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9maWZvcmVhZCwgMHgwMCk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQsIDB4MDApOworCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgWEZFUl9DTlRfMCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUGhhc2UgQnVzIEZyZWUKKyAqCisgKiBEZXNjcmlwdGlvbjogV2UganVzdCB3ZW50IGJ1cyBmcmVlIHNvIGZpZ3VyZSBvdXQgaWYgaXQgd2FzCisgKiAgICAgICAgICAgICAgYmVjYXVzZSBvZiBjb21tYW5kIGNvbXBsZXRlIG9yIGZyb20gYSBkaXNjb25uZWN0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgcGhhc2VCdXNGcmVlKFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBwaGFzZUJ1c0ZyZWUoVUxPTkcgcG9ydCwgVUNIQVIgcF9jYXJkKQorI2VuZGlmCit7CisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisKKyAgIGlmIChjdXJyU0NDQiAhPSBOVUxMKQorICAgICAgeworCisgICAgICBESVNBQkxFX0FVVE8ocG9ydCk7CisKKworICAgICAgaWYgKGN1cnJTQ0NCLT5PcGVyYXRpb25Db2RlID09IFJFU0VUX0NPTU1BTkQpCisgICAgICAgICB7CisKKwkJCWlmKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkoKHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkKKwkgICAJCSBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IEZBTFNFOworCQkJZWxzZQorCQkgICAJIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gRkFMU0U7CisKKwkgICAgICBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sIGN1cnJTQ0NCLCBwX2NhcmQpOworCisJICAgICAgcXVldWVTZWFyY2hTZWxlY3QoJkJMX0NhcmRbcF9jYXJkXSxwX2NhcmQpOworCisJICAgICAgfQorCisgICAgICBlbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9TTl9TVCkKKwkgICAgICB7CisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyB8PQorCQkJICAgICAgICAgKFVDSEFSKVNZTkNfU1VQUE9SVEVEOworCSAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJFRVZhbHVlICY9IH5FRV9TWU5DX01BU0s7CisJICAgICAgfQorCisgICAgICBlbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9XTl9TVCkKKwkgICAgICB7CisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyA9CisJCSAgICAgICAgICAgIChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uCisJCSAgIFRhclN0YXR1cyAmIH5XSURFX0VOQUJMRUQpIHwgV0lERV9ORUdPQ0lBVEVEOworCisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJj0gfkVFX1dJREVfU0NTSTsKKwkgICAgICB9CisKKyNpZiAhZGVmaW5lZChET1MpCisgICAgICBlbHNlIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9RX1NUKQorCSAgICAgIHsKKwkgICAgICAvKiBNYWtlIHN1cmUgdGhpcyBpcyBub3QgYSBwaG9ueSBCVVNfRlJFRS4gIElmIHdlIHdlcmUKKwkgICAgICByZXNlbGVjdGVkIG9yIGlmIEJVU1kgaXMgTk9UIG9uIHRoZW4gdGhpcyBpcyBhCisJICAgICAgdmFsaWQgQlVTIEZSRUUuICBTUlIgV2VkbmVzZGF5LCA1LzEwLzE5OTUuICAgICAqLworCisJICAgICAgaWYgKCghKFJEX0hBUlBPT04ocG9ydCtocF9zY3Npc2lnKSAmIFNDU0lfQlNZKSkgfHwKKwkgICAgICAgICAoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgUlNFTCkpCisJICAgICAgICAgeworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJj0gflRBUl9UQUdfUV9NQVNLOworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgfD0gVEFHX1FfUkVKRUNUOworCSAgICAgICAgIH0KKworCSAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkgICAgICAgICByZXR1cm47CisJICAgICAgICAgfQorICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIGVsc2UKKwkgICAgICB7CisKKwkgICAgICBjdXJyU0NDQi0+U2NjYl9zY3Npc3RhdCA9IEJVU19GUkVFX1NUOworCisgICAgICAgICBpZiAoIWN1cnJTQ0NCLT5Ib3N0U3RhdHVzKQorCSAgICAgICAgIHsKKwkgICAgICAgICBjdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfUEhBU0VfU0VRVUVOQ0VfRkFJTDsKKwkgICAgICAgICB9CisKKwkJCWlmKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkoKHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkKKwkgICAJCSBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IEZBTFNFOworCQkJZWxzZQorCQkgICAJIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gRkFMU0U7CisKKwkgICAgICBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sIGN1cnJTQ0NCLCBwX2NhcmQpOworCSAgICAgIHJldHVybjsKKwkgICAgICB9CisKKworICAgICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisgICAgICB9IC8qZW5kIGlmICE9bnVsbCAqLworfQorCisKKworCisjaWRlbnQgIiRJZDogYXV0b21hdGUuYyAxLjE0IDE5OTcvMDEvMzEgMDI6MTE6NDYgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGF1dG9tYXRlLmMgICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgRnVuY3Rpb25zIHJlbGF0aW5nIHRvIHByb2dyYW1taW5nIHRoZSBhdXRvbWF0aW9uIG9mCisgKiAgICAgICAgICAgICAgICAgdGhlIEhBUlBPT04uCisgKgorICogICAkRGF0ZTogMTk5Ny8wMS8zMSAwMjoxMTo0NiAkCisgKgorICogICAkUmV2aXNpb246IDEuMTQgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworLyoKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CitleHRlcm4gU0NDQk1HUl9UQVJfSU5GTyBzY2NiTWdyVGJsW01BWF9DQVJEU11bTUFYX1NDU0lfVEFSXTsKK2V4dGVybiBTQ0NCQ0FSRCBCTF9DYXJkW01BWF9DQVJEU107CisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBBdXRvIExvYWQgRGVmYXVsdCBNYXAKKyAqCisgKiBEZXNjcmlwdGlvbjogTG9hZCB0aGUgQXV0b21hdGlvbiBSQU0gd2l0aCB0aGUgZGVmdWFsdCBtYXAgdmFsdWVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgYXV0b0xvYWREZWZhdWx0TWFwKFVTSE9SVCBwX3BvcnQpCisjZWxzZQordm9pZCBhdXRvTG9hZERlZmF1bHRNYXAoVUxPTkcgcF9wb3J0KQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChET1MpCisgICBVU0hPUlQgbWFwX2FkZHI7CisjZWxzZQorICAgVUxPTkcgbWFwX2FkZHI7CisjZW5kaWYKKworICAgQVJBTV9BQ0NFU1MocF9wb3J0KTsKKyAgIG1hcF9hZGRyID0gcF9wb3J0ICsgaHBfYXJhbUJhc2U7CisKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FNU0dfT1VUKyAweEMwKSk7ICAvKklEIE1FU1NBR0UgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FNU0dfT1VUKyAweDIwKSk7ICAvKlNJTVBMRSBUQUcgUVVFVUVJTkcgTVNHICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgUkFUX09QKTsgICAgICAgICAgICAgICAgICAgLypSRVNFVCBBVFRFTlRJT04gKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FNU0dfT1VUKyAweDAwKSk7ICAvKlRBRyBJRCBNU0cgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDAgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDEgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDIgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDMgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDQgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDUgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDYgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDcgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDggKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDkgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVBNX09QK0FDT01NQU5EKyAweDAwKSk7ICAvKkNEQiBCWVRFIDEwICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKE1QTV9PUCtBQ09NTUFORCsgMHgwMCkpOyAgLypDREIgQllURSAxMSAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUEVfT1ArQURBVEFfT1VUKyBESU5UKSk7IC8qSlVNUCBJRiBEQVRBIE9VVCAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChUQ0JfT1ArRklGT18wKyBESSkpOyAgICAgLypKVU1QIElGIE5PIERBVEEgSU4gRklGTyAqLworICAgbWFwX2FkZHIgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGlzIG1lYW5zIEFZTkMgREFUQSBJTiAqLworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArICAgU1NJX0lET19TVFJUKSk7IC8qU1RPUCBBTkQgSU5URVJSVVBUICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKENQRV9PUCtBREFUQV9JTitESU5UKSk7ICAgLypKVU1QIElGIE5PVCBEQVRBIElOIFBIWiAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUE5fT1ArQU1TR19JTisgIFNUKSk7ICAgIC8qSUYgTk9UIE1TRyBJTiBDSEVDSyA0IERBVEEgSU4gKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1JEX09QK1NEQVRBKyAgICAweDAyKSk7ICAvKlNBVkUgREFUQSBQVFIgTVNHPyAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChCUkhfT1ArTk9UX0VRKyAgIERDKSk7ICAgIC8qR08gQ0hFQ0sgRk9SIERJU0NPTk5FQ1QgTVNHICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKE1SUl9PUCtTREFUQSsgICAgRF9BUjEpKTsgLypTQVZFIERBVEEgUFRSUyBNU0cgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1BOX09QK0FNU0dfSU4rICBTVCkpOyAgICAvKklGIE5PVCBNU0cgSU4gQ0hFQ0sgREFUQSBJTiAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUkRfT1ArU0RBVEErICAgIDB4MDQpKTsgIC8qRElTQ09OTkVDVCBNU0c/ICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKEJSSF9PUCtOT1RfRVErICAgVU5LTldOKSk7LypVS05LTk9XTiBNU0cgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVJSX09QK1NEQVRBKyAgICBEX0JVQ0tFVCkpOy8qWEZFUiBESVNDT05ORUNUIE1TRyAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArICAgICAgICAgIFNTSV9JVEFSX0RJU0MpKTsvKlNUT1AgQU5EIElOVEVSUlVQVCAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUE5fT1ArQVNUQVRVUysgIFVOS05XTikpOy8qSlVNUCBJRiBOT1QgU1RBVFVTIFBIWi4gKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoTVJSX09QK1NEQVRBKyAgRF9BUjApKTsgICAvKkdFVCBTVEFUVVMgQllURSAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChDUE5fT1ArQU1TR19JTisgIENDKSk7ICAgIC8qRVJST1IgSUYgTk9UIE1TRyBJTiBQSFogKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1JEX09QK1NEQVRBKyAgICAweDAwKSk7ICAvKkNIRUNLIEZPUiBDTUQgQ09NUExFVEUgTVNHLiAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChCUkhfT1ArTk9UX0VRKyAgIENDKSk7ICAgIC8qRVJST1IgSUYgTk9UIENNRCBDT01QTEVURSBNU0cuICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKE1SUl9PUCtTREFUQSsgIERfQlVDS0VUKSk7LypHRVQgQ01EIENPTVBMRVRFIE1TRyAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArICAgICAgIFNTSV9JQ01EX0NPTVApKTsvKkVORCBPRiBDT01NQU5EICovCisgICBtYXBfYWRkciArPTI7CisKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoU1NJX09QKyBTU0lfSVVOS1dOKSk7ICAvKlJFQ0VJVkVEIFVOS05PV04gTVNHIEJZVEUgKi8KKyAgIG1hcF9hZGRyICs9MjsKKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoU1NJX09QKyBTU0lfSU5PX0NDKSk7ICAvKk5PIENPTU1BTkQgQ09NUExFVEUgQUZURVIgU1RBVFVTICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKFNTSV9PUCsgU1NJX0lUSUNLTEUpKTsgLypCSU9TIFRpY2tsZWQgdGhlIE1nciAqLworICAgbWFwX2FkZHIgKz0yOworICAgV1JXX0hBUlBPT04obWFwX2FkZHIsIChTU0lfT1ArIFNTSV9JUkZBSUwpKTsgIC8qRVhQRUNURUQgSUQvVEFHIE1FU1NBR0VTIEFORCAqLworICAgbWFwX2FkZHIgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRElETidUIEdFVCBPTkUgKi8KKyAgIFdSV19IQVJQT09OKG1hcF9hZGRyLCAoQ1JSX09QK0FSMysgIFNfSURSRUcpKTsgLyogY29tcCBTQ1NJIFNFTCBJRCAmIEFSMyovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKEJSSF9PUCtFUVVBTCsgICAweDAwKSk7ICAgIC8qU0VMIElEIE9LIHRoZW4gQ29udGkuICovCisgICBtYXBfYWRkciArPTI7CisgICBXUldfSEFSUE9PTihtYXBfYWRkciwgKFNTSV9PUCsgU1NJX0lOT19DQykpOyAgLypOTyBDT01NQU5EIENPTVBMRVRFIEFGVEVSIFNUQVRVUyAqLworCisKKworICAgU0dSQU1fQUNDRVNTKHBfcG9ydCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IEF1dG8gQ29tbWFuZCBDb21wbGV0ZQorICoKKyAqIERlc2NyaXB0aW9uOiBQb3N0IGNvbW1hbmQgYmFjayB0byBob3N0IGFuZCBmaW5kIGFub3RoZXIgY29tbWFuZAorICogICAgICAgICAgICAgIHRvIGV4ZWN1dGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGF1dG9DbWRDbXBsdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZWxzZQordm9pZCBhdXRvQ21kQ21wbHQoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2NhcmQpCisjZW5kaWYKK3sKKyAgIFBTQ0NCIGN1cnJTQ0NCOworICAgVUNIQVIgc3RhdHVzX2J5dGU7CisKKyAgIGN1cnJTQ0NCID0gQkxfQ2FyZFtwX2NhcmRdLmN1cnJlbnRTQ0NCOworCisgICBzdGF0dXNfYnl0ZSA9IFJEX0hBUlBPT04ocF9wb3J0K2hwX2dwX3JlZ18wKTsKKworICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTl9DQSA9IEZBTFNFOworCisgICBpZiAoc3RhdHVzX2J5dGUgIT0gU1NHT09EKSB7CisKKyAgICAgIGlmIChzdGF0dXNfYnl0ZSA9PSBTU1FfRlVMTCkgeworCisKKwkJCWlmKCgoQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkJKChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpKQorCQkJeworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5W2N1cnJTQ0NCLT5MdW5dID0gVFJVRTsKKwkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLkx1bkRpc2NRX0lkeFtjdXJyU0NDQi0+THVuXV0gPSBOVUxMOworCQkJfQorCQkJZWxzZQorCQkJeworCSAgICAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gVFJVRTsKKwkJCQlpZihjdXJyU0NDQi0+U2NjYl90YWcpCisJCQkJeworCQkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtjdXJyU0NDQi0+U2NjYl90YWddID0gTlVMTDsKKwkJCQl9ZWxzZQorCQkJCXsKKwkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLkx1bkRpc2NRX0lkeFswXV0gPSBOVUxMOworCQkJCX0KKwkJCX0KKworICAgICAgICAgY3VyclNDQ0ItPlNjY2JfTUdSRmxhZ3MgfD0gRl9TVEFUVVNMT0FERUQ7CisKKyAgICAgICAgIHF1ZXVlU2VsZWN0RmFpbCgmQkxfQ2FyZFtwX2NhcmRdLHBfY2FyZCk7CisKKyAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKworICAgICAgaWYoY3VyclNDQ0ItPlNjY2Jfc2NzaXN0YXQgPT0gU0VMRUNUX1NOX1NUKQorICAgICAgICAgeworICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyB8PQorICAgICAgICAgICAgKFVDSEFSKVNZTkNfU1VQUE9SVEVEOworCisJICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJj0gfkVFX1NZTkNfTUFTSzsKKyAgICAgICAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKworCQkJaWYoKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkoKHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJCQl7CisJICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbY3VyclNDQ0ItPkx1bl0gPSBUUlVFOworCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uTHVuRGlzY1FfSWR4W2N1cnJTQ0NCLT5MdW5dXSA9IE5VTEw7CisJCQl9CisJCQllbHNlCisJCQl7CisJICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbMF0gPSBUUlVFOworCQkJCWlmKGN1cnJTQ0NCLT5TY2NiX3RhZykKKwkJCQl7CisJCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2N1cnJTQ0NCLT5TY2NiX3RhZ10gPSBOVUxMOworCQkJCX1lbHNlCisJCQkJeworCQkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uTHVuRGlzY1FfSWR4WzBdXSA9IE5VTEw7CisJCQkJfQorCQkJfQorICAgICAgICAgcmV0dXJuOworCisgICAgICAgICB9CisKKyAgICAgIGlmKGN1cnJTQ0NCLT5TY2NiX3Njc2lzdGF0ID09IFNFTEVDVF9XTl9TVCkKKyAgICAgICAgIHsKKworCSAgICAgIHNjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5UYXJTdGF0dXMgPQorCSAgICAgICAgIChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uCisJICAgICAgICAgVGFyU3RhdHVzICYgfldJREVfRU5BQkxFRCkgfCBXSURFX05FR09DSUFURUQ7CisKKwkgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyRUVWYWx1ZSAmPSB+RUVfV0lERV9TQ1NJOworICAgICAgICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisJCQlpZigoKEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKwkJCXsKKwkgICAgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IFRSVUU7CisJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbY3VyclNDQ0ItPkx1bl1dID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkgICAgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVswXSA9IFRSVUU7CisJCQkJaWYoY3VyclNDQ0ItPlNjY2JfdGFnKQorCQkJCXsKKwkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbY3VyclNDQ0ItPlNjY2JfdGFnXSA9IE5VTEw7CisJCQkJfWVsc2UKKwkJCQl7CisJCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCQl9CisJCQl9CisgICAgICAgICByZXR1cm47CisgICAgICAKKyAgICAgICAgIH0KKyAgICAgCisJICAgaWYgKHN0YXR1c19ieXRlID09IFNTQ0hFQ0spIAorCQl7CisJCQlpZihCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0RPX1JFTkVHTykKKwkJCXsKKwkJCQlpZiAoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJiBFRV9TWU5DX01BU0spCisJCQkJeworCQkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICY9IH5UQVJfU1lOQ19NQVNLOworCQkJCX0KKwkJCQlpZiAoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckVFVmFsdWUgJiBFRV9XSURFX1NDU0kpCisJCQkJeworCQkJCQlzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICY9IH5UQVJfV0lERV9NQVNLOworCQkJCX0KKwkJCX0KKwkJfQorCisgICAgICBpZiAoIShjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX0FVVE9fU0VOU0UpKSB7CisKKyAgICAgICAgIGN1cnJTQ0NCLT5TY2NiU3RhdHVzID0gU0NDQl9FUlJPUjsKKyAgICAgICAgIGN1cnJTQ0NCLT5UYXJnZXRTdGF0dXMgPSBzdGF0dXNfYnl0ZTsKKworICAgICAgICAgaWYgKHN0YXR1c19ieXRlID09IFNTQ0hFQ0spIHsKKworICAgICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTl9DQQorICAgICAgICAgICAgICAgPSBUUlVFOworICAgICAKKworI2lmIChGV19UWVBFPT1fU0NDQl9NR1JfKQorICAgICAgICAgICAgaWYgKGN1cnJTQ0NCLT5SZXF1ZXN0U2Vuc2VMZW5ndGggIT0gTk9fQVVUT19SRVFVRVNUX1NFTlNFKSB7CisKKyAgICAgICAgICAgICAgIGlmIChjdXJyU0NDQi0+UmVxdWVzdFNlbnNlTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICBjdXJyU0NDQi0+UmVxdWVzdFNlbnNlTGVuZ3RoID0gMTQ7CisKKyAgICAgICAgICAgICAgIHNzZW5zcygmQkxfQ2FyZFtwX2NhcmRdKTsKKyAgICAgICAgICAgICAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKworIAkJCQkJaWYoKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKwkJCQkJeworCQkJICAgICAgICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbY3VyclNDQ0ItPkx1bl0gPSBUUlVFOworCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uTHVuRGlzY1FfSWR4W2N1cnJTQ0NCLT5MdW5dXSA9IE5VTEw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJICAgCQkgICAgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVswXSA9IFRSVUU7CisJCQkJCQlpZihjdXJyU0NDQi0+U2NjYl90YWcpCisJCQkJCQl7CisJCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2N1cnJTQ0NCLT5TY2NiX3RhZ10gPSBOVUxMOworCQkJCQkJfWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZihCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudCAhPSAwKQorCQkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLkx1bkRpc2NRX0lkeFswXV0gPSBOVUxMOworCQkJCQkJfQorCQkJCQl9CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICB9CisjZWxzZQorCQkJCSAgIGlmICgoIShjdXJyU0NDQi0+U2NjYl91Y2JfcHRyLT5VQ0Jfb3Bjb2RlICYgT1BDX05PX0FVVE9fU0VOU0UpKSAmJgorCQkJICAgCQkoY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aCkpCisJCQkJICAgeworCQkJCSAgIAlzc2Vuc3MoJkJMX0NhcmRbcF9jYXJkXSk7CisJCQkJICAgICAgQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisJCQkJCQlpZigoKEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJgorCQkJCQkJCSgoc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhclN0YXR1cyAmIFRBUl9UQUdfUV9NQVNLKSAhPSBUQUdfUV9UUllJTkcpKSkKKwkJCQkJCXsKKwkgICAgICAJCQkgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVtjdXJyU0NDQi0+THVuXSA9IFRSVUU7CisJCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQkJQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQtLTsKKwkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbY3VyclNDQ0ItPkx1bl1dID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkgICAgICAJCQkgICBzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyTFVOQnVzeVswXSA9IFRSVUU7CisJCQkJCQkJaWYoY3VyclNDQ0ItPlNjY2JfdGFnKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRQ291bnQgIT0gMCkKKwkJCQkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50LS07CisJCQkJCQkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbY3VyclNDQ0ItPlNjY2JfdGFnXSA9IE5VTEw7CisJCQkJCQkJfWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWlmKEJMX0NhcmRbcF9jYXJkXS5kaXNjUUNvdW50ICE9IDApCisJCQkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FDb3VudC0tOworCQkJCQkJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3NjY2JNZ3JUYmxbcF9jYXJkXVtjdXJyU0NDQi0+VGFyZ0lEXS5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJICAgICAgcmV0dXJuOworCQkJCSAgIH0KKworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKworCWlmKChCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJKChzY2NiTWdyVGJsW3BfY2FyZF1bY3VyclNDQ0ItPlRhcmdJRF0uVGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpCisJICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbY3VyclNDQ0ItPkx1bl0gPSBGQUxTRTsKKwllbHNlCisJICAgc2NjYk1nclRibFtwX2NhcmRdW2N1cnJTQ0NCLT5UYXJnSURdLlRhckxVTkJ1c3lbMF0gPSBGQUxTRTsKKworCisgICBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sIGN1cnJTQ0NCLCBwX2NhcmQpOworfQorI2lkZW50ICIkSWQ6IGJ1c21zdHIuYyAxLjggMTk5Ny8wMS8zMSAwMjoxMDoyNyBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgYnVzbXN0ci5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyB0byBzdGFydCwgc3RvcCwgYW5kIGFib3J0IEJ1c01hc3RlciBvcGVyYXRpb25zLgorICoKKyAqICAgJERhdGU6IDE5OTcvMDEvMzEgMDI6MTA6MjcgJAorICoKKyAqICAgJFJldmlzaW9uOiAxLjggJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworCisvKgorZXh0ZXJuIFNDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXTsKK2V4dGVybiBTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdOworKi8KKworI2RlZmluZSBTSE9SVF9XQUlUICAgMHgwMDAwMDAwRgorI2RlZmluZSBMT05HX1dBSVQgICAgMHgwMDAwRkZGRkwKKworI2lmIGRlZmluZWQoQlVHQlVHKQordm9pZCBEZWJ1Z19Mb2FkKFVDSEFSIHBfY2FyZCwgVUNIQVIgcF9idWdfZGF0YSk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogRGF0YSBUcmFuc2ZlciBQcm9jZXNzb3IKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHBlcmZvcm1zIHR3byB0YXNrcy4KKyAqICAgICAgICAgICAgICAoMSkgU3RhcnQgZGF0YSB0cmFuc2ZlciBieSBjYWxsaW5nIEhPU1RfREFUQV9YRkVSX1NUQVJUCisgKiAgICAgICAgICAgICAgZnVuY3Rpb24uICBPbmNlIGRhdGEgdHJhbnNmZXIgaXMgc3RhcnRlZCwgKDIpIERlcGVuZHMKKyAqICAgICAgICAgICAgICBvbiB0aGUgdHlwZSBvZiBkYXRhIHRyYW5zZmVyIG1vZGUgU2NhdHRlci9HYXRoZXIgbW9kZQorICogICAgICAgICAgICAgIG9yIE5PTiBTY2F0dGVyL0dhdGhlciBtb2RlLiAgSW4gTk9OIFNjYXR0ZXIvR2F0aGVyIG1vZGUsCisgKiAgICAgICAgICAgICAgdGhpcyByb3V0aW5lIGNoZWNrcyBTY2NiX01HUkZsYWcgKEZfSE9TVF9YRkVSX0FDVCBiaXQpIGZvcgorICogICAgICAgICAgICAgIGRhdGEgdHJhbnNmZXIgZG9uZS4gIEluIFNjYXR0ZXIvR2F0aGVyIG1vZGUsIHRoaXMgcm91dGluZQorICogICAgICAgICAgICAgIGNoZWNrcyBidXMgbWFzdGVyIGNvbW1hbmQgY29tcGxldGUgYW5kIGR1YWwgcmFuayBidXN5CisgKiAgICAgICAgICAgICAgYml0IHRvIGtlZXAgY2hhaW5pbmcgU0MgdHJhbnNmZXIgY29tbWFuZC4gIFNpbWlsYXJseSwKKyAqICAgICAgICAgICAgICBpbiBTY2F0dGVyL0dhdGhlciBtb2RlLCBpdCBjaGVja3MgU2NjYl9NR1JGbGFnCisgKiAgICAgICAgICAgICAgKEZfSE9TVF9YRkVSX0FDVCBiaXQpIGZvciBkYXRhIHRyYW5zZmVyIGRvbmUuCisgKiAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgZGF0YVhmZXJQcm9jZXNzb3IoVVNIT1JUIHBvcnQsIFBTQ0NCY2FyZCBwQ3VyckNhcmQpCisjZWxzZQordm9pZCBkYXRhWGZlclByb2Nlc3NvcihVTE9ORyBwb3J0LCBQU0NDQmNhcmQgcEN1cnJDYXJkKQorI2VuZGlmCit7CisgICBQU0NDQiBjdXJyU0NDQjsKKworICAgY3VyclNDQ0IgPSBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCOworCisgICAgICBpZiAoY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKQorCQkJeworCQkJaWYgKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpCisKKwkJCQl7CisJCSAgIAljdXJyU0NDQi0+U2NjYl9zZ3NlZyArPSAoVUNIQVIpU0dfQlVGX0NOVDsKKyAgICAgICAgIAljdXJyU0NDQi0+U2NjYl9TR29mZnNldCA9IDB4MDA7IAorIAkJCQl9CisJCQlwQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfSE9TVF9YRkVSX0FDVDsKKyAgICAgICAgIAorICAgICAgICAgYnVzTXN0clNHRGF0YVhmZXJTdGFydChwb3J0LCBjdXJyU0NDQik7CisJCQl9CisKKyAgICAgIGVsc2UKKwkJCXsKKwkJCWlmICghKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX0hPU1RfWEZFUl9BQ1QpKQorCQkJCXsKKwkJCQlwQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfSE9TVF9YRkVSX0FDVDsKKyAgICAgICAgIAorICAgICAgICAgCWJ1c01zdHJEYXRhWGZlclN0YXJ0KHBvcnQsIGN1cnJTQ0NCKTsKKyAgICAgICAgIAl9CisJCQl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQnVzTWFzdGVyIFNjYXR0ZXIgR2F0aGVyIERhdGEgVHJhbnNmZXIgU3RhcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGJ1c01zdHJTR0RhdGFYZmVyU3RhcnQoVVNIT1JUIHBfcG9ydCwgUFNDQ0IgcGN1cnJTQ0NCKQorI2Vsc2UKK3ZvaWQgYnVzTXN0clNHRGF0YVhmZXJTdGFydChVTE9ORyBwX3BvcnQsIFBTQ0NCIHBjdXJyU0NDQikKKyNlbmRpZgoreworICAgVUxPTkcgY291bnQsYWRkcix0bXBTR0NudDsKKyAgIFVJTlQgc2dfaW5kZXg7CisgICBVQ0hBUiBzZ19jb3VudCwgaTsKKyNpZiBkZWZpbmVkKERPUykKKyAgIFVTSE9SVCByZWdfb2Zmc2V0OworI2Vsc2UKKyAgIFVMT05HIHJlZ19vZmZzZXQ7CisjZW5kaWYKKworCisgICBpZiAocGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfSE9TVF9YRkVSX0RJUikgeworCisgICAgICBjb3VudCA9ICAoKFVMT05HKSBIT1NUX1JEX0NNRCk8PDI0OworICAgICAgfQorCisgICBlbHNlIHsKKyAgICAgIGNvdW50ID0gICgoVUxPTkcpIEhPU1RfV1JUX0NNRCk8PDI0OworICAgICAgfQorCisgICBzZ19jb3VudCA9IDA7CisgICB0bXBTR0NudCA9IDA7CisgICBzZ19pbmRleCA9IHBjdXJyU0NDQi0+U2NjYl9zZ3NlZzsKKyAgIHJlZ19vZmZzZXQgPSBocF9hcmFtQmFzZTsKKworCisJaSA9IChVQ0hBUikgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiB+KFNHUkFNX0FSQU18U0NBVFRFUl9FTikpOworCisKKwlXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsIGkpOworCisgICB3aGlsZSAoKHNnX2NvdW50IDwgKFVDSEFSKVNHX0JVRl9DTlQpICYmCisgICAgICAoKFVMT05HKShzZ19pbmRleCAqIChVSU5UKVNHX0VMRU1FTlRfU0laRSkgPCBwY3VyclNDQ0ItPkRhdGFMZW5ndGgpICkgeworCisjaWYgZGVmaW5lZChDT01QSUxFUl8xNl9CSVQpICYmICFkZWZpbmVkKERPUykKKyAgICAgIHRtcFNHQ250ICs9ICooKChVTE9ORyBmYXIgKilwY3VyclNDQ0ItPkRhdGFQb2ludGVyKSsKKyAgICAgICAgIChzZ19pbmRleCAqIDIpKTsKKworICAgICAgY291bnQgfD0gKigoKFVMT05HIGZhciAqKXBjdXJyU0NDQi0+RGF0YVBvaW50ZXIpKworICAgICAgICAgKHNnX2luZGV4ICogMikpOworCisgICAgICBhZGRyID0gKigoKFVMT05HIGZhciAqKXBjdXJyU0NDQi0+RGF0YVBvaW50ZXIpKworICAgICAgICAgKChzZ19pbmRleCAqIDIpICsgMSkpOworCisjZWxzZQorICAgICAgdG1wU0dDbnQgKz0gKigoKFVMT05HICopcGN1cnJTQ0NCLT5EYXRhUG9pbnRlcikrCisgICAgICAgICAoc2dfaW5kZXggKiAyKSk7CisKKyAgICAgIGNvdW50IHw9ICooKChVTE9ORyAqKXBjdXJyU0NDQi0+RGF0YVBvaW50ZXIpKworICAgICAgICAgKHNnX2luZGV4ICogMikpOworCisgICAgICBhZGRyID0gKigoKFVMT05HICopcGN1cnJTQ0NCLT5EYXRhUG9pbnRlcikrCisgICAgICAgICAoKHNnX2luZGV4ICogMikgKyAxKSk7CisjZW5kaWYKKworCisgICAgICBpZiAoKCFzZ19jb3VudCkgJiYgKHBjdXJyU0NDQi0+U2NjYl9TR29mZnNldCkpIHsKKworICAgICAgICAgYWRkciArPSAoKGNvdW50ICYgMHgwMEZGRkZGRkwpIC0gcGN1cnJTQ0NCLT5TY2NiX1NHb2Zmc2V0KTsKKyAgICAgICAgIGNvdW50ID0gKGNvdW50ICYgMHhGRjAwMDAwMEwpIHwgcGN1cnJTQ0NCLT5TY2NiX1NHb2Zmc2V0OworCisgICAgICAgICB0bXBTR0NudCA9IGNvdW50ICYgMHgwMEZGRkZGRkw7CisgICAgICAgICB9CisKKyAgICAgIFdSX0hBUlAzMihwX3BvcnQscmVnX29mZnNldCxhZGRyKTsKKyAgICAgIHJlZ19vZmZzZXQgKz00OworCisgICAgICBXUl9IQVJQMzIocF9wb3J0LHJlZ19vZmZzZXQsY291bnQpOworICAgICAgcmVnX29mZnNldCArPTQ7CisKKyAgICAgIGNvdW50ICY9IDB4RkYwMDAwMDBMOworICAgICAgc2dfaW5kZXgrKzsKKyAgICAgIHNnX2NvdW50Kys7CisKKyAgICAgIH0gLypFbmQgV2hpbGUgKi8KKworICAgcGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPSB0bXBTR0NudDsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2dfYWRkciwoc2dfY291bnQ8PDQpKTsKKworICAgaWYgKHBjdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX0hPU1RfWEZFUl9ESVIpIHsKKworICAgICAgV1JfSEFSUDMyKHBfcG9ydCxocF94ZmVyY250XzAsdG1wU0dDbnQpOworCisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsKERNQV9QT1JUIHwgU0NTSV9QT1JUIHwgU0NTSV9JTkJJVCkpOworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgU19EQVRBSV9QSCk7CisgICAgICB9CisKKyAgIGVsc2UgeworCisKKyAgICAgIGlmICgoIShSRF9IQVJQT09OKHBfcG9ydCtocF9zeW5jdGFyZ18wKSAmIE5BUlJPV19TQ1NJKSkgJiYKKyAgICAgICAgICh0bXBTR0NudCAmIDB4MDAwMDAwMDAxKSkKKyAgICAgICAgIHsKKworICAgICAgICAgcGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX09ERF9CQUxMX0NOVDsKKyAgICAgICAgIHRtcFNHQ250LS07CisgICAgICAgICB9CisKKworICAgICAgV1JfSEFSUDMyKHBfcG9ydCxocF94ZmVyY250XzAsdG1wU0dDbnQpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLChTQ1NJX1BPUlQgfCBETUFfUE9SVCB8IERNQV9SRCkpOworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgU19EQVRBT19QSCk7CisgICAgICB9CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLCAoVUNIQVIpIChpIHwgU0NBVFRFUl9FTikpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQnVzTWFzdGVyIERhdGEgVHJhbnNmZXIgU3RhcnQKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoRE9TKQordm9pZCBidXNNc3RyRGF0YVhmZXJTdGFydChVU0hPUlQgcF9wb3J0LCBQU0NDQiBwY3VyclNDQ0IpCisjZWxzZQordm9pZCBidXNNc3RyRGF0YVhmZXJTdGFydChVTE9ORyBwX3BvcnQsIFBTQ0NCIHBjdXJyU0NDQikKKyNlbmRpZgoreworICAgVUxPTkcgYWRkcixjb3VudDsKKworICAgaWYgKCEocGN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQVVUT19TRU5TRSkpIHsKKworICAgICAgY291bnQgPSBwY3VyclNDQ0ItPlNjY2JfWGZlckNudDsKKworICAgICAgYWRkciA9IChVTE9ORykgcGN1cnJTQ0NCLT5EYXRhUG9pbnRlciArIHBjdXJyU0NDQi0+U2NjYl9BVEM7CisgICAgICB9CisKKyAgIGVsc2UgeworICAgICAgYWRkciA9IHBjdXJyU0NDQi0+U2Vuc2VQb2ludGVyOworICAgICAgY291bnQgPSBwY3VyclNDQ0ItPlJlcXVlc3RTZW5zZUxlbmd0aDsKKworICAgICAgfQorCisjaWYgZGVmaW5lZChET1MpCisgICBhc20geyBtb3YgZHgscF9wb3J0OworICAgICAgICAgbW92IGF4LHdvcmQgcHRyIGNvdW50OworICAgICAgICAgYWRkIGR4LGhwX3hmZXJfY250X2xvOworICAgICAgICAgb3V0IGR4LGFsOworICAgICAgICAgaW5jIGR4OworICAgICAgICAgeGNoZyBhaCxhbAorICAgICAgICAgb3V0IGR4LGFsOworICAgICAgICAgaW5jIGR4OworICAgICAgICAgbW92IGF4LHdvcmQgcHRyIGNvdW50KzI7CisgICAgICAgICBvdXQgZHgsYWw7CisgICAgICAgICBpbmMgZHg7CisgICAgICAgICBpbmMgZHg7CisgICAgICAgICBtb3YgYXgsd29yZCBwdHIgYWRkcjsKKyAgICAgICAgIG91dCBkeCxhbDsKKyAgICAgICAgIGluYyBkeDsKKyAgICAgICAgIHhjaGcgYWgsYWwKKyAgICAgICAgIG91dCBkeCxhbDsKKyAgICAgICAgIGluYyBkeDsKKyAgICAgICAgIG1vdiBheCx3b3JkIHB0ciBhZGRyKzI7CisgICAgICAgICBvdXQgZHgsYWw7CisgICAgICAgICBpbmMgZHg7CisgICAgICAgICB4Y2hnIGFoLGFsCisgICAgICAgICBvdXQgZHgsYWw7CisgICAgICAgICB9CisKKyAgIFdSX0hBUlAzMihwX3BvcnQsaHBfeGZlcmNudF8wLGNvdW50KTsKKworI2Vsc2UKKyAgIEhQX1NFVFVQX0FERFJfQ05UKHBfcG9ydCxhZGRyLGNvdW50KTsKKyNlbmRpZgorCisKKyAgIGlmIChwY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9IT1NUX1hGRVJfRElSKSB7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsKERNQV9QT1JUIHwgU0NTSV9QT1JUIHwgU0NTSV9JTkJJVCkpOworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgU19EQVRBSV9QSCk7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3hmZXJfY21kLAorICAgICAgICAgKFhGRVJfRE1BX0hPU1QgfCBYRkVSX0hPU1RfQVVUTyB8IFhGRVJfRE1BXzhCSVQpKTsKKyAgICAgIH0KKworICAgZWxzZSB7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsKFNDU0lfUE9SVCB8IERNQV9QT1JUIHwgRE1BX1JEKSk7CisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCBTX0RBVEFPX1BIKTsKKworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfeGZlcl9jbWQsCisgICAgICAgICAoWEZFUl9IT1NUX0RNQSB8IFhGRVJfSE9TVF9BVVRPIHwgWEZFUl9ETUFfOEJJVCkpOworCisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogQnVzTWFzdGVyIFRpbWVvdXQgSGFuZGxlcgorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIGJ1cyBtYXN0ZXIgY29tbWFuZCBidXN5IHRpbWUKKyAqICAgICAgICAgICAgICAgb3V0IGlzIGRldGVjdGVkLiAgVGhpcyByb3V0aW5lcyBpc3N1ZSBoYWx0IHN0YXRlIG1hY2hpbmUKKyAqICAgICAgICAgICAgICAgd2l0aCBhIHNvZnR3YXJlIHRpbWUgb3V0IGZvciBjb21tYW5kIGJ1c3kuICBJZiBjb21tYW5kIGJ1c3kKKyAqICAgICAgICAgICAgICAgaXMgc3RpbGwgYXNzZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgdGltZSBvdXQsIGl0IGlzc3VlcworICogICAgICAgICAgICAgICBoYXJkIGFib3J0IHdpdGggYW5vdGhlciBzb2Z0d2FyZSB0aW1lIG91dC4gIEl0IGhhcmQgYWJvcnQKKyAqICAgICAgICAgICAgICAgY29tbWFuZCBidXN5IGlzIGFsc28gdGltZSBvdXQsIGl0J2xsIGp1c3QgZ2l2ZSB1cC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBidXNNc3RyVGltZU91dChVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK1VDSEFSIGJ1c01zdHJUaW1lT3V0KFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgVUxPTkcgdGltZW91dDsKKworICAgdGltZW91dCA9IExPTkdfV0FJVDsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc3lzX2N0cmwsIEhBTFRfTUFDSCk7CisKKyAgIHdoaWxlICgoIShSRF9IQVJQT09OKHBfcG9ydCtocF9leHRfc3RhdHVzKSAmIENNRF9BQk9SVEVEKSkgJiYgdGltZW91dC0tKSB7fQorCisgICAKKyAgIAorICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3N5c19jdHJsLCBIQVJEX0FCT1JUKTsKKworICAgICAgdGltZW91dCA9IExPTkdfV0FJVDsKKyAgICAgIHdoaWxlICgoUkRfSEFSUE9PTihwX3BvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkgJiYgdGltZW91dC0tKSB7fQorICAgICAgfQorCisgICBSRF9IQVJQT09OKHBfcG9ydCtocF9pbnRfc3RhdHVzKTsgICAgICAgICAgIC8qQ2xlYXIgY29tbWFuZCBjb21wbGV0ZSAqLworCisgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkgeworICAgICAgcmV0dXJuKFRSVUUpOworICAgICAgfQorCisgICBlbHNlIHsKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogSG9zdCBEYXRhIFRyYW5zZmVyIEFib3J0CisgKgorICogRGVzY3JpcHRpb246IEFib3J0IGFueSBpbiBwcm9ncmVzcyB0cmFuc2Zlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGhvc3REYXRhWGZlckFib3J0KFVTSE9SVCBwb3J0LCBVQ0hBUiBwX2NhcmQsIFBTQ0NCIHBDdXJyU0NDQikKKyNlbHNlCit2b2lkIGhvc3REYXRhWGZlckFib3J0KFVMT05HIHBvcnQsIFVDSEFSIHBfY2FyZCwgUFNDQ0IgcEN1cnJTQ0NCKQorI2VuZGlmCit7CisKKyAgIFVMT05HIHRpbWVvdXQ7CisgICBVTE9ORyByZW1haW5fY250OworICAgVUlOVCBzZ19wdHI7CisKKyAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyAmPSB+Rl9IT1NUX1hGRVJfQUNUOworCisgICBpZiAocEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQVVUT19TRU5TRSkgeworCisKKyAgICAgIGlmICghKFJEX0hBUlBPT04ocG9ydCtocF9pbnRfc3RhdHVzKSAmIElOVF9DTURfQ09NUEwpKSB7CisKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX2JtX2N0cmwpIHwgRkxVU0hfWEZFUl9DTlRSKSk7CisgICAgICAgICB0aW1lb3V0ID0gTE9OR19XQUlUOworCisgICAgICAgICB3aGlsZSAoKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSAmJiB0aW1lb3V0LS0pIHt9CisKKyAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX2JtX2N0cmwpICYgfkZMVVNIX1hGRVJfQ05UUikpOworCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgICAgaWYgKGJ1c01zdHJUaW1lT3V0KHBvcnQpKSB7CisKKyAgICAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkKKworICAgICAgICAgICAgICAgICAgcEN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9CTV9FUlI7CisKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9pbnRfc3RhdHVzKSAmIElOVF9FWFRfU1RBVFVTKSAKKworICAgICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJBRF9FWFRfU1RBVFVTKSAKKworICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSAweDAwKQorCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyNpZiBkZWZpbmVkKEJVR0JVRykKKyAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9kdWFsX2FkZHJfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICBSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgIGVsc2UgaWYgKHBDdXJyU0NDQi0+U2NjYl9YZmVyQ250KSB7CisKKyAgICAgIGlmIChwQ3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKSB7CisKKworICAgICAgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfcGFnZV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCkgJgorICAgICAgICAgICAgflNDQVRURVJfRU4pKTsKKworICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3NnX2FkZHIsMHgwMCk7CisKKyAgICAgICAgIHNnX3B0ciA9IHBDdXJyU0NDQi0+U2NjYl9zZ3NlZyArIFNHX0JVRl9DTlQ7CisKKyAgICAgICAgIGlmIChzZ19wdHIgPiAoVUlOVCkocEN1cnJTQ0NCLT5EYXRhTGVuZ3RoIC8gU0dfRUxFTUVOVF9TSVpFKSkgeworCisgICAgICAgICAgICBzZ19wdHIgPSAoVUlOVCkocEN1cnJTQ0NCLT5EYXRhTGVuZ3RoIC8gU0dfRUxFTUVOVF9TSVpFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgcmVtYWluX2NudCA9IHBDdXJyU0NDQi0+U2NjYl9YZmVyQ250OworCisgICAgICAgICB3aGlsZSAocmVtYWluX2NudCA8IDB4MDEwMDAwMDBMKSB7CisKKyAgICAgICAgICAgIHNnX3B0ci0tOworCisjaWYgZGVmaW5lZChDT01QSUxFUl8xNl9CSVQpICYmICFkZWZpbmVkKERPUykKKyAgICAgICAgICAgIGlmIChyZW1haW5fY250ID4gKFVMT05HKSgqKCgoVUxPTkcgZmFyICopcEN1cnJTQ0NCLT4KKyAgICAgICAgICAgICAgIERhdGFQb2ludGVyKSArIChzZ19wdHIgKiAyKSkpKSB7CisKKyAgICAgICAgICAgICAgIHJlbWFpbl9jbnQgLT0gKFVMT05HKSgqKCgoVUxPTkcgZmFyICopcEN1cnJTQ0NCLT4KKyAgICAgICAgICAgICAgICAgIERhdGFQb2ludGVyKSArIChzZ19wdHIgKiAyKSkpOworICAgICAgICAgICAgICAgfQorCisjZWxzZQorICAgICAgICAgICAgaWYgKHJlbWFpbl9jbnQgPiAoVUxPTkcpKCooKChVTE9ORyAqKXBDdXJyU0NDQi0+CisgICAgICAgICAgICAgICBEYXRhUG9pbnRlcikgKyAoc2dfcHRyICogMikpKSkgeworCisgICAgICAgICAgICAgICByZW1haW5fY250IC09IChVTE9ORykoKigoKFVMT05HICopcEN1cnJTQ0NCLT4KKyAgICAgICAgICAgICAgICAgIERhdGFQb2ludGVyKSArIChzZ19wdHIgKiAyKSkpOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgIGlmIChyZW1haW5fY250IDwgMHgwMTAwMDAwMEwpIHsKKworCisgICAgICAgICAgICBwQ3VyclNDQ0ItPlNjY2JfU0dvZmZzZXQgPSByZW1haW5fY250OworCisgICAgICAgICAgICBwQ3VyclNDQ0ItPlNjY2Jfc2dzZWcgPSAoVVNIT1JUKXNnX3B0cjsKKworCisgICAgICAgICAgICBpZiAoKFVMT05HKShzZ19wdHIgKiBTR19FTEVNRU5UX1NJWkUpID09IHBDdXJyU0NDQi0+RGF0YUxlbmd0aCAKKyAgICAgICAgICAgICAgICAmJiAocmVtYWluX2NudCA9PSAwKSkKKworICAgICAgICAgICAgICAgcEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX0FMTF9YRkVSUkVEOworICAgICAgICAgICAgfQorCisgICAgICAgICBlbHNlIHsKKworCisgICAgICAgICAgICBpZiAocEN1cnJTQ0NCLT5Ib3N0U3RhdHVzID09IDB4MDApIHsKKworICAgICAgICAgICAgICAgcEN1cnJTQ0NCLT5Ib3N0U3RhdHVzID0gU0NDQl9HUk9TU19GV19FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKworICAgICAgaWYgKCEocEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfSE9TVF9YRkVSX0RJUikpIHsKKworCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgICAgYnVzTXN0clRpbWVPdXQocG9ydCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2ludF9zdGF0dXMpICYgSU5UX0VYVF9TVEFUVVMpIHsKKworICAgICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJBRF9FWFRfU1RBVFVTKSB7CisKKyAgICAgICAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkgeworCisgICAgICAgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyNpZiBkZWZpbmVkKEJVR0JVRykKKyAgICAgICAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9kdWFsX2FkZHJfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICBSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgZWxzZSB7CisKKworICAgICAgICAgaWYgKChSRF9IQVJQT09OKHBvcnQraHBfZmlmb19jbnQpKSA+PSBCTV9USFJFU0hPTEQpIHsKKworICAgICAgICAgICAgdGltZW91dCA9IFNIT1JUX1dBSVQ7CisKKyAgICAgICAgICAgIHdoaWxlICgoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpICYmCisgICAgICAgICAgICAgICAoKFJEX0hBUlBPT04ocG9ydCtocF9maWZvX2NudCkpID49IEJNX1RIUkVTSE9MRCkgJiYKKyAgICAgICAgICAgICAgIHRpbWVvdXQtLSkge30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSB7CisKKyAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsLCAoUkRfSEFSUE9PTihwb3J0K2hwX2JtX2N0cmwpIHwKKyAgICAgICAgICAgICAgIEZMVVNIX1hGRVJfQ05UUikpOworCisgICAgICAgICAgICB0aW1lb3V0ID0gTE9OR19XQUlUOworCisgICAgICAgICAgICB3aGlsZSAoKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSAmJgorICAgICAgICAgICAgICAgdGltZW91dC0tKSB7fQorCisgICAgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfYm1fY3RybCwgKFJEX0hBUlBPT04ocG9ydCtocF9ibV9jdHJsKSAmCisgICAgICAgICAgICAgICB+RkxVU0hfWEZFUl9DTlRSKSk7CisKKworICAgICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJNX0NNRF9CVVNZKSB7CisKKyAgICAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkgeworCisgICAgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnVzTXN0clRpbWVPdXQocG9ydCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGlmIChSRF9IQVJQT09OKHBvcnQraHBfaW50X3N0YXR1cykgJiBJTlRfRVhUX1NUQVRVUykgeworCisgICAgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQkFEX0VYVF9TVEFUVVMpIHsKKworICAgICAgICAgICAgICAgaWYgKHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSAweDAwKSB7CisKKyAgICAgICAgICAgICAgICAgIHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfQk1fRVJSOworI2lmIGRlZmluZWQoQlVHQlVHKQorICAgICAgICAgICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2R1YWxfYWRkcl9sbywKKyAgICAgICAgICAgICAgICAgICAgIFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgfQorCisgICBlbHNlIHsKKworCisgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgdGltZW91dCA9IExPTkdfV0FJVDsKKworICAgICAgICAgd2hpbGUgKChSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykgJiBCTV9DTURfQlVTWSkgJiYgdGltZW91dC0tKSB7fQorCisgICAgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2V4dF9zdGF0dXMpICYgQk1fQ01EX0JVU1kpIHsKKworICAgICAgICAgICAgaWYgKHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9PSAweDAwKSB7CisKKyAgICAgICAgICAgICAgIHBDdXJyU0NDQi0+SG9zdFN0YXR1cyA9IFNDQ0JfQk1fRVJSOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidXNNc3RyVGltZU91dChwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworCisgICAgICBpZiAoUkRfSEFSUE9PTihwb3J0K2hwX2ludF9zdGF0dXMpICYgSU5UX0VYVF9TVEFUVVMpIHsKKworICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9leHRfc3RhdHVzKSAmIEJBRF9FWFRfU1RBVFVTKSB7CisKKyAgICAgICAgICAgIGlmIChwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPT0gMHgwMCkgeworCisgICAgICAgICAgICAgICBwQ3VyclNDQ0ItPkhvc3RTdGF0dXMgPSBTQ0NCX0JNX0VSUjsKKyNpZiBkZWZpbmVkKEJVR0JVRykKKyAgICAgICAgICAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9kdWFsX2FkZHJfbG8sCisgICAgICAgICAgICAgICAgICBSRF9IQVJQT09OKHBvcnQraHBfZXh0X3N0YXR1cykpOworI2VuZGlmCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIH0KKworICAgICAgaWYgKHBDdXJyU0NDQi0+U2NjYl9YZmVyU3RhdGUgJiBGX1NHX1hGRVIpIHsKKworICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCwgKFJEX0hBUlBPT04ocG9ydCtocF9wYWdlX2N0cmwpICYKKyAgICAgICAgICAgICAgICAgflNDQVRURVJfRU4pKTsKKworICAgICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3NnX2FkZHIsMHgwMCk7CisKKyAgICAgICAgIHBDdXJyU0NDQi0+U2NjYl9zZ3NlZyArPSBTR19CVUZfQ05UOworCisgICAgICAgICBwQ3VyclNDQ0ItPlNjY2JfU0dvZmZzZXQgPSAweDAwOyAKKworCisgICAgICAgICBpZiAoKFVMT05HKShwQ3VyclNDQ0ItPlNjY2Jfc2dzZWcgKiBTR19FTEVNRU5UX1NJWkUpID49CisgICAgICAgICAgICBwQ3VyclNDQ0ItPkRhdGFMZW5ndGgpIHsKKworICAgICAgICAgICAgcEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX0FMTF9YRkVSUkVEOworCisgICAgICAgICAgICBwQ3VyclNDQ0ItPlNjY2Jfc2dzZWcgPSAoVVNIT1JUKShwQ3VyclNDQ0ItPkRhdGFMZW5ndGggLyBTR19FTEVNRU5UX1NJWkUpOworCisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgeworCisgICAgICAgICBpZiAoIShwQ3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9BVVRPX1NFTlNFKSkKKworICAgICAgICAgICAgcEN1cnJTQ0NCLT5TY2NiX1hmZXJTdGF0ZSB8PSBGX0FMTF9YRkVSUkVEOworICAgICAgICAgfQorICAgICAgfQorCisgICBXUl9IQVJQT09OKHBvcnQraHBfaW50X21hc2ssKElOVF9DTURfQ09NUEwgfCBTQ1NJX0lOVEVSUlVQVCkpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogSG9zdCBEYXRhIFRyYW5zZmVyIFJlc3RhcnQKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVzZXQgdGhlIGF2YWlsYWJsZSBjb3VudCBkdWUgdG8gYSByZXN0b3JlIGRhdGEKKyAqICAgICAgICAgICAgICBwb2ludGVycyBtZXNzYWdlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaG9zdERhdGFYZmVyUmVzdGFydChQU0NDQiBjdXJyU0NDQikKK3sKKyAgIFVMT05HIGRhdGFfY291bnQ7CisgICBVSU5UICBzZ19pbmRleDsKKyNpZiBkZWZpbmVkKENPTVBJTEVSXzE2X0JJVCkgJiYgIWRlZmluZWQoRE9TKQorICAgVUxPTkcgZmFyICpzZ19wdHI7CisjZWxzZQorICAgVUxPTkcgKnNnX3B0cjsKKyNlbmRpZgorCisgICBpZiAoY3VyclNDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKSB7CisKKyAgICAgIGN1cnJTQ0NCLT5TY2NiX1hmZXJDbnQgPSAwOworCisgICAgICBzZ19pbmRleCA9IDB4ZmZmZjsgICAgICAgICAvKkluZGV4IGJ5IGxvbmcgd29yZHMgaW50byBzZyBsaXN0LiAqLworICAgICAgZGF0YV9jb3VudCA9IDA7ICAgICAgICAgICAgLypSdW5uaW5nIGNvdW50IG9mIFNHIHhmZXIgY291bnRzLiAqLworCisjaWYgZGVmaW5lZChDT01QSUxFUl8xNl9CSVQpICYmICFkZWZpbmVkKERPUykKKyAgICAgIHNnX3B0ciA9IChVTE9ORyBmYXIgKiljdXJyU0NDQi0+RGF0YVBvaW50ZXI7CisjZWxzZQorICAgICAgc2dfcHRyID0gKFVMT05HICopY3VyclNDQ0ItPkRhdGFQb2ludGVyOworI2VuZGlmCisKKyAgICAgIHdoaWxlIChkYXRhX2NvdW50IDwgY3VyclNDQ0ItPlNjY2JfQVRDKSB7CisKKyAgICAgICAgIHNnX2luZGV4Kys7CisgICAgICAgICBkYXRhX2NvdW50ICs9ICooc2dfcHRyKyhzZ19pbmRleCAqIDIpKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKGRhdGFfY291bnQgPT0gY3VyclNDQ0ItPlNjY2JfQVRDKSB7CisKKyAgICAgICAgIGN1cnJTQ0NCLT5TY2NiX1NHb2Zmc2V0ID0gMDsKKyAgICAgICAgIHNnX2luZGV4Kys7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICAgY3VyclNDQ0ItPlNjY2JfU0dvZmZzZXQgPSBkYXRhX2NvdW50IC0gY3VyclNDQ0ItPlNjY2JfQVRDOworICAgICAgICAgfQorCisgICAgICBjdXJyU0NDQi0+U2NjYl9zZ3NlZyA9IChVU0hPUlQpc2dfaW5kZXg7CisgICAgICB9CisKKyAgIGVsc2UgeworICAgICAgY3VyclNDQ0ItPlNjY2JfWGZlckNudCA9IGN1cnJTQ0NCLT5EYXRhTGVuZ3RoIC0gY3VyclNDQ0ItPlNjY2JfQVRDOworICAgICAgfQorfQorI2lkZW50ICIkSWQ6IHNjYW0uYyAxLjE3IDE5OTcvMDMvMjAgMjM6NDk6MzcgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIHNjYW0uYyAgJAorICoKKyAqICAgRGVzY3JpcHRpb246ICBGdW5jdGlvbnMgcmVsYXRpbmcgdG8gaGFuZGxpbmcgb2YgdGhlIFNDQU0gc2VsZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgYW5kIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSBTQ1NJIElEcyB0byBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgIHRvIGFsbCBwZXJzcGVjdGl2ZSBTQ1NJIHRhcmdldHMuCisgKgorICogICAkRGF0ZTogMTk5Ny8wMy8yMCAyMzo0OTozNyAkCisgKgorICogICAkUmV2aXNpb246IDEuMTcgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKworCisvKgorZXh0ZXJuIFNDQ0JNR1JfVEFSX0lORk8gc2NjYk1nclRibFtNQVhfQ0FSRFNdW01BWF9TQ1NJX1RBUl07CitleHRlcm4gU0NDQkNBUkQgQkxfQ2FyZFtNQVhfQ0FSRFNdOworZXh0ZXJuIFNDQ0JTQ0FNX0lORk8gc2NhbUluZm9bTUFYX1NDU0lfVEFSXTsKK2V4dGVybiBOVlJBTUlORk8gbnZSYW1JbmZvW01BWF9NQl9DQVJEU107CisjaWYgZGVmaW5lZChET1MpIHx8IGRlZmluZWQoT1MyKQorZXh0ZXJuIFVDSEFSIHRlbXBfaWRfc3RyaW5nW0lEX1NUUklOR19MRU5HVEhdOworI2VuZGlmCitleHRlcm4gVUNIQVIgc2NhbUhBU3RyaW5nW107CisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2NpbmkKKyAqCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgYWxsIGRhdGEgc3RydWN0dXJlcyBuZWNlc3NhcnkgZm9yIFNDQU0gc2VsZWN0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBzY2luaShVQ0hBUiBwX2NhcmQsIFVDSEFSIHBfb3VyX2lkLCBVQ0hBUiBwX3Bvd2VyX3VwKQoreworCisjaWYgZGVmaW5lZChTQ0FNX0xFVl8yKQorICAgVUNIQVIgbG9zZXIsYXNzaWduZWRfaWQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKERPUykKKworICAgVVNIT1JUIHBfcG9ydDsKKyNlbHNlCisgICBVTE9ORyBwX3BvcnQ7CisjZW5kaWYKKworICAgVUNIQVIgaSxrLFNjYW1GbGcgOworICAgUFNDQ0JjYXJkIGN1cnJDYXJkOworCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKworICAgY3VyckNhcmQgPSAmQkxfQ2FyZFtwX2NhcmRdOworICAgcF9wb3J0ID0gY3VyckNhcmQtPmlvUG9ydDsKKwlwQ3Vyck52UmFtID0gY3VyckNhcmQtPnBOdlJhbUluZm87CisKKworCWlmKHBDdXJyTnZSYW0peworCQlTY2FtRmxnID0gcEN1cnJOdlJhbS0+bmlTY2FtQ29uZjsKKwkJaSA9IHBDdXJyTnZSYW0tPm5pU3lzQ29uZjsKKwl9CisJZWxzZXsKKwkgICBTY2FtRmxnID0gKFVDSEFSKSB1dGlsRUVSZWFkKHBfcG9ydCwgU0NBTV9DT05GSUcvMik7CisJICAgaSA9IChVQ0hBUikodXRpbEVFUmVhZChwX3BvcnQsIChTWVNURU1fQ09ORklHLzIpKSk7CisJfQorCWlmKCEoaSAmIDB4MDIpKQkvKiBjaGVjayBpZiByZXNldCBidXMgaW4gQXV0b1NDU0kgcGFyYW1ldGVyIHNldCAqLworCQlyZXR1cm47CisKKyAgIGluaXNjaShwX2NhcmQscF9wb3J0LCBwX291cl9pZCk7CisKKyAgIC8qIEZvcmNlIHRvIHdhaXQgMSBzZWMgYWZ0ZXIgU0NTSSBidXMgcmVzZXQuIFNvbWUgU0NBTSBkZXZpY2UgRlcKKyAgICAgIHRvbyBzbG93IHRvIHJldHVybiB0byBTQ0FNIHNlbGVjdGlvbiAqLworCisgICAvKiBpZiAocF9wb3dlcl91cCkKKyAgICAgICAgIFdhaXQxU2Vjb25kKHBfcG9ydCk7CisgICAgICBlbHNlCisgICAgICAgICBXYWl0KHBfcG9ydCwgVE9fMjUwbXMpOyAqLworCisgICBXYWl0MVNlY29uZChwX3BvcnQpOworCisjaWYgZGVmaW5lZChTQ0FNX0xFVl8yKQorCisgICBpZiAoKFNjYW1GbGcgJiBTQ0FNX0VOQUJMRUQpICYmIChTY2FtRmxnICYgU0NBTV9MRVZFTDIpKQorICAgICAgeworICAgICAgd2hpbGUgKCEoc2NhcmIocF9wb3J0LElOSVRfU0VMVEQpKSkge30KKworICAgICAgc2NzZWwocF9wb3J0KTsKKworICAgICAgZG8geworICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsU1lOQ19QVFJOKTsKKyAgICAgICAgIHNjeGZlcmMocF9wb3J0LERPTV9NU1RSKTsKKyAgICAgICAgIGxvc2VyID0gc2NzZW5kaShwX3BvcnQsJnNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0pOworICAgICAgICAgfSB3aGlsZSAoIGxvc2VyID09IDB4RkYgKTsKKworICAgICAgc2NidXNmKHBfcG9ydCk7CisKKyAgICAgIGlmICgocF9wb3dlcl91cCkgJiYgKCFsb3NlcikpCisgICAgICAgICB7CisgICAgICAgICBzcmVzYihwX3BvcnQscF9jYXJkKTsKKyAgICAgICAgIFdhaXQocF9wb3J0LCBUT18yNTBtcyk7CisKKyAgICAgICAgIHdoaWxlICghKHNjYXJiKHBfcG9ydCxJTklUX1NFTFREKSkpIHt9CisKKyAgICAgICAgIHNjc2VsKHBfcG9ydCk7CisKKyAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHNjeGZlcmMocF9wb3J0LCBTWU5DX1BUUk4pOworICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsIERPTV9NU1RSKTsKKyAgICAgICAgICAgIGxvc2VyID0gc2NzZW5kaShwX3BvcnQsJnNjYW1JbmZvW3Bfb3VyX2lkXS4KKyAgICAgICAgICAgICAgIGlkX3N0cmluZ1swXSk7CisgICAgICAgICAgICB9IHdoaWxlICggbG9zZXIgPT0gMHhGRiApOworCisgICAgICAgICBzY2J1c2YocF9wb3J0KTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgZWxzZQorICAgICAgeworICAgICAgbG9zZXIgPSBGQUxTRTsKKyAgICAgIH0KKworCisgICBpZiAoIWxvc2VyKQorICAgICAgeworCisjZW5kaWYgIC8qIFNDQU1fTEVWXzIgKi8KKworICAgICAgc2NhbUluZm9bcF9vdXJfaWRdLnN0YXRlID0gSURfQVNTSUdORUQ7CisKKworCQlpZiAoU2NhbUZsZyAmIFNDQU1fRU5BQkxFRCkKKwkJeworCisJICAgICAgZm9yIChpPTA7IGkgPCBNQVhfU0NTSV9UQVI7IGkrKykKKyAgCQkgICB7CisgICAgICAJICAgaWYgKChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9VTkFTU0lHTkVEKSB8fAorICAJICAgICAgCSAgIChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9VTlVTRUQpKQorCSAgCSAgICAgIHsKKyAgIAkgICAgIAkgICBpZiAoc2NzZWxsKHBfcG9ydCxpKSkKKyAgICAgIAkgIAkgICB7CisgICAgICAgICAgICAJICAgc2NhbUluZm9baV0uc3RhdGUgPSBMRUdBQ1k7CisgIAkgICAgICAgICAgICAJaWYgKChzY2FtSW5mb1tpXS5pZF9zdHJpbmdbMF0gIT0gMHhGRikgfHwKKyAgICAgCSAgICAgICAgICAgIAkoc2NhbUluZm9baV0uaWRfc3RyaW5nWzFdICE9IDB4RkEpKQorCSAgICAgCSAgICAgICAgIHsKKworICAgCSAgICAgICAgCSAgICAgIHNjYW1JbmZvW2ldLmlkX3N0cmluZ1swXSA9IDB4RkY7CisgICAgICAJICAgICAgICAJICAgc2NhbUluZm9baV0uaWRfc3RyaW5nWzFdID0gMHhGQTsKKwkJCQkJCQlpZihwQ3Vyck52UmFtID09IE5VTEwpCisJICAgICAgICAgCSAgICAgICAgIGN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX1VQREFURV9FRVBST007CisgICAgICAgICAgICAgICAJfQorCSAgCSAgICAgICAgIH0KKyAgIAkgIAkgICB9CisgICAgICAJfQorCisJICAgICAgc3Jlc2IocF9wb3J0LHBfY2FyZCk7CisgICAgICAJV2FpdDFTZWNvbmQocF9wb3J0KTsKKyAgICAgICAgIHdoaWxlICghKHNjYXJiKHBfcG9ydCxJTklUX1NFTFREKSkpIHt9CisgICAgICAgICBzY3NlbChwX3BvcnQpOworICAgICAgICAgc2Nhc2lkKHBfY2FyZCwgcF9wb3J0KTsKKyAgICAgICAgIH0KKworI2lmIGRlZmluZWQoU0NBTV9MRVZfMikKKworICAgICAgfQorCisgICBlbHNlIGlmICgobG9zZXIpICYmIChTY2FtRmxnICYgU0NBTV9FTkFCTEVEKSkKKyAgICAgIHsKKyAgICAgIHNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0gPSBTTFZfVFlQRV9DT0RFMDsKKyAgICAgIGFzc2lnbmVkX2lkID0gRkFMU0U7CisgICAgICBzY3d0c2VsKHBfcG9ydCk7CisKKyAgICAgIGRvIHsKKyAgICAgICAgIHdoaWxlIChzY3hmZXJjKHBfcG9ydCwweDAwKSAhPSBTWU5DX1BUUk4pIHt9CisKKyAgICAgICAgIGkgPSBzY3hmZXJjKHBfcG9ydCwweDAwKTsKKyAgICAgICAgIGlmIChpID09IEFTU0lHTl9JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKHNjc2VuZGkocF9wb3J0LCZzY2FtSW5mb1twX291cl9pZF0uaWRfc3RyaW5nWzBdKSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpID0gc2N4ZmVyYyhwX3BvcnQsMHgwMCk7CisgICAgICAgICAgICAgICAgICBpZiAoc2N2YWxxKGkpKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgayA9IHNjeGZlcmMocF9wb3J0LDB4MDApOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoc2N2YWxxKGspKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VyckNhcmQtPm91cklkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVUNIQVIpKGk8PDMpKyhrICYgKFVDSEFSKTcpKSAmIChVQ0hBUikgMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXNjaShwX2NhcmQsIHBfcG9ydCwgcF9vdXJfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbUluZm9bY3VyckNhcmQtPm91cklkXS5zdGF0ZSA9IElEX0FTU0lHTkVEOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbUluZm9bY3VyckNhcmQtPm91cklkXS5pZF9zdHJpbmdbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU0xWX1RZUEVfQ09ERTA7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZF9pZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGkgPT0gU0VUX1BfRkxBRykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICghKHNjc2VuZGkocF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgJnNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW1JbmZvW3Bfb3VyX2lkXS5pZF9zdHJpbmdbMF0gfD0gMHg4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH13aGlsZSAoIWFzc2lnbmVkX2lkKTsKKworICAgICAgd2hpbGUgKHNjeGZlcmMocF9wb3J0LDB4MDApICE9IENGR19DTVBMVCkge30KKyAgICAgIH0KKworI2VuZGlmICAgLyogU0NBTV9MRVZfMiAqLworICAgaWYgKFNjYW1GbGcgJiBTQ0FNX0VOQUJMRUQpCisgICAgICB7CisgICAgICBzY2J1c2YocF9wb3J0KTsKKyAgICAgIGlmIChjdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX1VQREFURV9FRVBST00pCisgICAgICAgICB7CisgICAgICAgICBzY3NhdmRpKHBfY2FyZCwgcF9wb3J0KTsKKyAgICAgICAgIGN1cnJDYXJkLT5nbG9iYWxGbGFncyAmPSB+Rl9VUERBVEVfRUVQUk9NOworICAgICAgICAgfQorICAgICAgfQorCisKKyNpZiBkZWZpbmVkKERPUykKKyAgIGZvciAoaT0wOyBpIDwgTUFYX1NDU0lfVEFSOyBpKyspCisgICB7CisgICAgIAlpZiAoKChTY2FtRmxnICYgU0NBTV9FTkFCTEVEKSAmJiAoc2NhbUluZm9baV0uc3RhdGUgPT0gTEVHQUNZKSkKKwkJCXx8IChpICE9IHBfb3VyX2lkKSkKKyAgICAgICAgCXsKKyAgICAgICAgIHNjc2VsbERPUyhwX3BvcnQsaSk7CisgIAkgICAgICB9CisgIAl9CisjZW5kaWYKKworLyoKKyAgIGZvciAoaT0wLGs9MDsgaSA8IE1BWF9TQ1NJX1RBUjsgaSsrKQorICAgICAgeworICAgICAgaWYgKChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9BU1NJR05FRCkgfHwKKyAgICAgICAgIChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBMRUdBQ1kpKQorICAgICAgICAgaysrOworICAgICAgfQorCisgICBpZiAoaz09MikKKyAgICAgIGN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX1NJTkdMRV9ERVZJQ0U7CisgICBlbHNlCisgICAgICBjdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJj0gfkZfU0lOR0xFX0RFVklDRTsKKyovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2NhcmIKKyAqCisgKiBEZXNjcmlwdGlvbjogR2FpbiBjb250cm9sIG9mIHRoZSBidXMgYW5kIHdhaXQgU0NBTSBzZWxlY3QgdGltZSAoMjUwbXMpCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitpbnQgc2NhcmIoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9zZWxfdHlwZSkKKyNlbHNlCitpbnQgc2NhcmIoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX3NlbF90eXBlKQorI2VuZGlmCit7CisgICBpZiAocF9zZWxfdHlwZSA9PSBJTklUX1NFTFREKQorICAgICAgeworCisgICAgICB3aGlsZSAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiAoU0NTSV9TRUwgfCBTQ1NJX0JTWSkpIHt9CisKKworICAgICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9TRUwpCisgICAgICAgICByZXR1cm4oRkFMU0UpOworCisgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgIT0gMDApCisgICAgICAgICByZXR1cm4oRkFMU0UpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgfCBTQ1NJX0JTWSkpOworCisgICAgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1NFTCkgeworCisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJgorICAgICAgICAgICAgflNDU0lfQlNZKSk7CisgICAgICAgICByZXR1cm4oRkFMU0UpOworICAgICAgICAgfQorCisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcsIChSRF9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnKSB8IFNDU0lfU0VMKSk7CisKKyAgICAgIGlmIChSRF9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wKSAhPSAwMCkgeworCisgICAgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJgorICAgICAgICAgICAgfihTQ1NJX0JTWSB8IFNDU0lfU0VMKSkpOworICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsIChSRF9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzApCisgICAgICAmIH5BQ1RkZWFzc2VydCkpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXJlc2V0LCBTQ0FNX0VOKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIDB4MDApOworI2lmIGRlZmluZWQoV0lERV9TQ1NJKQorICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMSwgMHgwMCk7CisjZW5kaWYKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsIFNDU0lfQlVTX0VOKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpIHwgU0NTSV9NU0cpKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpCisgICAgICAmIH5TQ1NJX0JTWSkpOworCisgICBXYWl0KHBfcG9ydCxUT18yNTBtcyk7CisKKyAgIHJldHVybihUUlVFKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY2J1c2YKKyAqCisgKiBEZXNjcmlwdGlvbjogUmVsZWFzZSB0aGUgU0NTSSBidXMgYW5kIGRpc2FibGUgU0NBTSBzZWxlY3Rpb24uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjYnVzZihVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK3ZvaWQgc2NidXNmKFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLAorICAgICAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgfCBHX0lOVF9ESVNBQkxFKSk7CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCwgMHgwMCk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzAsIChSRF9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wKQorICAgICAgJiB+U0NTSV9CVVNfRU4pKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgMHgwMCk7CisKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXJlc2V0LCAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lyZXNldCkKKyAgICAgICYgflNDQU1fRU4pKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfY2xrY3RybF8wLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfY2xrY3RybF8wKQorICAgICAgfCBBQ1RkZWFzc2VydCkpOworCisjaWYgZGVmaW5lZChTQ0FNX0xFVl8yKQorICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgKEJVU19GUkVFIHwgQVVUT19JTlQgfCBTQ0FNX1NFTCkpOworI2Vsc2UKKyAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCksIChCVVNfRlJFRSB8IEFVVE9fSU5UKSk7CisjZW5kaWYKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLAorICAgICAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiB+R19JTlRfRElTQUJMRSkpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2Nhc2lkCisgKgorICogRGVzY3JpcHRpb246IEFzc2lnbiBhbiBJRCB0byBhbGwgdGhlIFNDQU0gZGV2aWNlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2Nhc2lkKFVDSEFSIHBfY2FyZCwgVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIHNjYXNpZChVQ0hBUiBwX2NhcmQsIFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworI2lmIGRlZmluZWQoRE9TKSB8fCBkZWZpbmVkKE9TMikKKyAgIC8qIFVzZSBleHRlcm5hbCBkZWZpbmVkIGluIGdsb2JhbCBzcGFjZSBhcmVhLCBpbnN0ZWFkIG9mIFN0YWNrCisgICAgICBzcGFjZS4gV0lOLzk1IERPUyBkb2Vzbm90IHdvcmsgVElOWSBtb2RlLiBUaGUgT1MgZG9lc25vdCBpbnRpYWxpemUKKyAgICAgIFNTIGVxdWFsIHRvIERTLiBUaHVzIHRoZSBhcnJheSBhbGxvY2F0ZWQgb24gc3RhY2sgZG9lc25vdCBnZXQKKyAgICAgIGFjY2VzcyBjb3JyZWN0bHkgKi8KKyNlbHNlCisgICBVQ0hBUiB0ZW1wX2lkX3N0cmluZ1tJRF9TVFJJTkdfTEVOR1RIXTsKKyNlbmRpZgorCisgICBVQ0hBUiBpLGssc2NhbV9pZDsKKwlVQ0hBUiBjcmNCeXRlc1szXTsKKwlQTlZSYW1JbmZvIHBDdXJyTnZSYW07CisJdXNob3J0X3B0ciBwQ3JjQnl0ZXM7CisKKwlwQ3Vyck52UmFtID0gQkxfQ2FyZFtwX2NhcmRdLnBOdlJhbUluZm87CisKKyAgIGk9RkFMU0U7CisKKyAgIHdoaWxlICghaSkKKyAgICAgIHsKKworICAgICAgZm9yIChrPTA7IGsgPCBJRF9TVFJJTkdfTEVOR1RIOyBrKyspCisgICAgICAgICB7CisgICAgICAgICB0ZW1wX2lkX3N0cmluZ1trXSA9IChVQ0hBUikgMHgwMDsKKyAgICAgICAgIH0KKworICAgICAgc2N4ZmVyYyhwX3BvcnQsU1lOQ19QVFJOKTsKKyAgICAgIHNjeGZlcmMocF9wb3J0LEFTU0lHTl9JRCk7CisKKyAgICAgIGlmICghKHNjaXNvKHBfcG9ydCwmdGVtcF9pZF9zdHJpbmdbMF0pKSkKKyAgICAgICAgIHsKKwkJCWlmKHBDdXJyTnZSYW0peworCQkJCXBDcmNCeXRlcyA9ICh1c2hvcnRfcHRyKSZjcmNCeXRlc1swXTsKKwkJCQkqcENyY0J5dGVzID0gQ2FsY0NyYzE2KCZ0ZW1wX2lkX3N0cmluZ1swXSk7CisJCQkJY3JjQnl0ZXNbMl0gPSBDYWxjTHJjKCZ0ZW1wX2lkX3N0cmluZ1swXSk7CisJCQkJdGVtcF9pZF9zdHJpbmdbMV0gPSBjcmNCeXRlc1syXTsKKwkJCQl0ZW1wX2lkX3N0cmluZ1syXSA9IGNyY0J5dGVzWzBdOworCQkJCXRlbXBfaWRfc3RyaW5nWzNdID0gY3JjQnl0ZXNbMV07CisJCQkJZm9yKGsgPSA0OyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorCQkJCQl0ZW1wX2lkX3N0cmluZ1trXSA9IChVQ0hBUikgMHgwMDsKKwkJCX0KKyAgICAgICAgIGkgPSBzY21hY2hpZChwX2NhcmQsdGVtcF9pZF9zdHJpbmcpOworCisgICAgICAgICBpZiAoaSA9PSBDTFJfUFJJT1JJVFkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzY3hmZXJjKHBfcG9ydCxNSVNDX0NPREUpOworICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsQ0xSX1BfRkxBRyk7CisgICAgICAgICAgICBpID0gRkFMU0U7ICAvKk5vdCB0aGUgbGFzdCBJRCB5ZXQuICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgIGVsc2UgaWYgKGkgIT0gTk9fSURfQVZBSUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA8IDggKQorICAgICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsSURfMF83KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHNjeGZlcmMocF9wb3J0LElEXzhfRik7CisKKyAgICAgICAgICAgIHNjYW1faWQgPSAoaSAmIChVQ0hBUikgMHgwNyk7CisKKworICAgICAgICAgICAgZm9yIChrPTE7IGsgPCAweDA4OyBrIDw8PSAxKQorICAgICAgICAgICAgICAgaWYgKCEoIGsgJiBpICkpCisgICAgICAgICAgICAgICAgICBzY2FtX2lkICs9IDB4MDg7ICAgICAgICAvKkNvdW50IG51bWJlciBvZiB6ZXJvcyBpbiBEQjAtMy4gKi8KKworICAgICAgICAgICAgc2N4ZmVyYyhwX3BvcnQsc2NhbV9pZCk7CisKKyAgICAgICAgICAgIGkgPSBGQUxTRTsgIC8qTm90IHRoZSBsYXN0IElEIHlldC4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgaSA9IFRSVUU7CisgICAgICAgICB9CisKKyAgICAgIH0gIC8qRW5kIHdoaWxlICovCisKKyAgIHNjeGZlcmMocF9wb3J0LFNZTkNfUFRSTik7CisgICBzY3hmZXJjKHBfcG9ydCxDRkdfQ01QTFQpOworfQorCisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjc2VsCisgKgorICogRGVzY3JpcHRpb246IFNlbGVjdCBhbGwgdGhlIFNDQU0gZGV2aWNlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgc2NzZWwoVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIHNjc2VsKFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCBTQ1NJX1NFTCk7CisgICBzY3dpcm9zKHBfcG9ydCwgU0NTSV9NU0cpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoU0NTSV9TRUwgfCBTQ1NJX0JTWSkpOworCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcsIChTQ1NJX1NFTCB8IFNDU0lfQlNZIHwgU0NTSV9JT0JJVCB8IFNDU0lfQ0QpKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIChVQ0hBUikoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgfAorICAgICAgKFVDSEFSKShCSVQoNykrQklUKDYpKSkpOworCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcsIChTQ1NJX0JTWSB8IFNDU0lfSU9CSVQgfCBTQ1NJX0NEKSk7CisgICBzY3dpcm9zKHBfcG9ydCwgU0NTSV9TRUwpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wLCAoVUNIQVIpKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzApICYKKyAgICAgIH4oVUNIQVIpQklUKDYpKSk7CisgICBzY3dpcm9kKHBfcG9ydCwgQklUKDYpKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFNDU0lfU0VMIHwgU0NTSV9CU1kgfCBTQ1NJX0lPQklUIHwgU0NTSV9DRCkpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2N4ZmVyYworICoKKyAqIERlc2NyaXB0aW9uOiBIYW5kc2hha2UgdGhlIHBfZGF0YSAoREI0LTApIGFjcm9zcyB0aGUgYnVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgc2N4ZmVyYyhVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RhdGEpCisjZWxzZQorVUNIQVIgc2N4ZmVyYyhVTE9ORyBwX3BvcnQsIFVDSEFSIHBfZGF0YSkKKyNlbmRpZgoreworICAgVUNIQVIgY3Vycl9kYXRhLCByZXRfZGF0YTsKKworICAgY3Vycl9kYXRhID0gcF9kYXRhIHwgQklUKDcpIHwgQklUKDUpOyAgIC8qU3RhcnQgd2l0aCBEQjcgJiBEQjUgYXNzZXJ0ZWQuICovCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIGN1cnJfZGF0YSk7CisKKyAgIGN1cnJfZGF0YSAmPSB+QklUKDcpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wLCBjdXJyX2RhdGEpOworCisgICBzY3dpcm9kKHBfcG9ydCxCSVQoNykpOyAgICAgICAgICAgICAgLypXYWl0IGZvciBEQjcgdG8gYmUgcmVsZWFzZWQuICovCisJd2hpbGUgKCEoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgJiBCSVQoNSkpKTsKKworICAgcmV0X2RhdGEgPSAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCkgJiAoVUNIQVIpIDB4MUYpOworCisgICBjdXJyX2RhdGEgfD0gQklUKDYpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpZGF0YV8wLCBjdXJyX2RhdGEpOworCisgICBjdXJyX2RhdGEgJj0gfkJJVCg1KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCwgY3Vycl9kYXRhKTsKKworICAgc2N3aXJvZChwX3BvcnQsQklUKDUpKTsgICAgICAgICAgICAgIC8qV2FpdCBmb3IgREI1IHRvIGJlIHJlbGVhc2VkLiAqLworCisgICBjdXJyX2RhdGEgJj0gfihCSVQoNCl8QklUKDMpfEJJVCgyKXxCSVQoMSl8QklUKDApKTsgLypSZWxlYXNlIGRhdGEgYml0cyAqLworICAgY3Vycl9kYXRhIHw9IEJJVCg3KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWRhdGFfMCwgY3Vycl9kYXRhKTsKKworICAgY3Vycl9kYXRhICY9IH5CSVQoNik7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzAsIGN1cnJfZGF0YSk7CisKKyAgIHNjd2lyb2QocF9wb3J0LEJJVCg2KSk7ICAgICAgICAgICAgICAvKldhaXQgZm9yIERCNiB0byBiZSByZWxlYXNlZC4gKi8KKworICAgcmV0dXJuKHJldF9kYXRhKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3NlbmRpCisgKgorICogRGVzY3JpcHRpb246IFRyYW5zZmVyIG91ciBJZGVudGlmaWNhdGlvbiBzdHJpbmcgdG8gZGV0ZXJtaW5lIGlmIHdlCisgKiAgICAgICAgICAgICAgd2lsbCBiZSB0aGUgZG9taW5hbnQgbWFzdGVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQorVUNIQVIgc2NzZW5kaShVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQorI2Vsc2UKK1VDSEFSIHNjc2VuZGkoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQorI2VuZGlmCit7CisgICBVQ0hBUiByZXRfZGF0YSxieXRlX2NudCxiaXRfY250LGRlZmVyOworCisgICBkZWZlciA9IEZBTFNFOworCisgICBmb3IgKGJ5dGVfY250ID0gMDsgYnl0ZV9jbnQgPCBJRF9TVFJJTkdfTEVOR1RIOyBieXRlX2NudCsrKSB7CisKKyAgICAgIGZvciAoYml0X2NudCA9IDB4ODA7IGJpdF9jbnQgIT0gMCA7IGJpdF9jbnQgPj49IDEpIHsKKworICAgICAgICAgaWYgKGRlZmVyKQorICAgICAgICAgICAgcmV0X2RhdGEgPSBzY3hmZXJjKHBfcG9ydCwwMCk7CisKKyAgICAgICAgIGVsc2UgaWYgKHBfaWRfc3RyaW5nW2J5dGVfY250XSAmIGJpdF9jbnQpCisKKyAgICAgICAgICAgICAgIHJldF9kYXRhID0gc2N4ZmVyYyhwX3BvcnQsMDIpOworCisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgcmV0X2RhdGEgPSBzY3hmZXJjKHBfcG9ydCwwMSk7CisgICAgICAgICAgICAgICBpZiAocmV0X2RhdGEgJiAwMikKKyAgICAgICAgICAgICAgICAgIGRlZmVyID0gVFJVRTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgaWYgKChyZXRfZGF0YSAmIDB4MUMpID09IDB4MTApCisgICAgICAgICAgICByZXR1cm4oMHgwMCk7ICAvKkVuZCBvZiBpc29sYXRpb24gc3RhZ2UsIHdlIHdvbiEgKi8KKworICAgICAgICAgaWYgKHJldF9kYXRhICYgMHgxQykKKyAgICAgICAgICAgIHJldHVybigweEZGKTsKKworICAgICAgICAgaWYgKChkZWZlcikgJiYgKCEocmV0X2RhdGEgJiAweDFGKSkpCisgICAgICAgICAgICByZXR1cm4oMHgwMSk7ICAvKkVuZCBvZiBpc29sYXRpb24gc3RhZ2UsIHdlIGxvc3QuICovCisKKyAgICAgICAgIH0gLypiaXQgbG9vcCAqLworCisgICAgICB9IC8qYnl0ZSBsb29wICovCisKKyAgIGlmIChkZWZlcikKKyAgICAgIHJldHVybigweDAxKTsgIC8qV2UgbG9zdCAqLworICAgZWxzZQorICAgICAgcmV0dXJuKDApOyAgLypXZSBXT04hIFllZWVzc3NzISAqLworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2Npc28KKyAqCisgKiBEZXNjcmlwdGlvbjogVHJhbnNmZXIgdGhlIElkZW50aWZpY2F0aW9uIHN0cmluZy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK1VDSEFSIHNjaXNvKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfaWRfc3RyaW5nW10pCisjZWxzZQorVUNIQVIgc2Npc28oVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQorI2VuZGlmCit7CisgICBVQ0hBUiByZXRfZGF0YSx0aGVfZGF0YSxieXRlX2NudCxiaXRfY250OworCisgICB0aGVfZGF0YSA9IDA7CisKKyAgIGZvciAoYnl0ZV9jbnQgPSAwOyBieXRlX2NudCA8IElEX1NUUklOR19MRU5HVEg7IGJ5dGVfY250KyspIHsKKworICAgICAgZm9yIChiaXRfY250ID0gMDsgYml0X2NudCA8IDg7IGJpdF9jbnQrKykgeworCisgICAgICAgICByZXRfZGF0YSA9IHNjeGZlcmMocF9wb3J0LDApOworCisgICAgICAgICBpZiAocmV0X2RhdGEgJiAweEZDKQorICAgICAgICAgICAgcmV0dXJuKDB4RkYpOworCisgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgdGhlX2RhdGEgPDw9IDE7CisgICAgICAgICAgICBpZiAocmV0X2RhdGEgJiBCSVQoMSkpIHsKKyAgICAgICAgICAgICAgIHRoZV9kYXRhIHw9IDE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGlmICgocmV0X2RhdGEgJiAweDFGKSA9PSAwKQorCSAgIHsKKy8qCisJCQkJaWYoYml0X2NudCAhPSAwIHx8IGJpdF9jbnQgIT0gOCkKKwkJCQl7CisJCQkJCWJ5dGVfY250ID0gMDsKKwkJCQkJYml0X2NudCA9IDA7CisJCQkJCXNjeGZlcmMocF9wb3J0LCBTWU5DX1BUUk4pOworCQkJCQlzY3hmZXJjKHBfcG9ydCwgQVNTSUdOX0lEKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorKi8KKyAgICAgICAgICAgIGlmIChieXRlX2NudCkKKyAgICAgICAgICAgICAgIHJldHVybigweDAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJldHVybigweEZGKTsKKwkgICB9CisKKyAgICAgICAgIH0gLypiaXQgbG9vcCAqLworCisgICAgICBwX2lkX3N0cmluZ1tieXRlX2NudF0gPSB0aGVfZGF0YTsKKworICAgICAgfSAvKmJ5dGUgbG9vcCAqLworCisgICByZXR1cm4oMCk7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3dpcm9kCisgKgorICogRGVzY3JpcHRpb246IFNhbXBsZSB0aGUgU0NTSSBkYXRhIGJ1cyBtYWtpbmcgc3VyZSB0aGUgc2lnbmFsIGhhcyBiZWVuCisgKiAgICAgICAgICAgICAgZGVhc3NlcnRlZCBmb3IgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHNhbXBsZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjd2lyb2QoVVNIT1JUIHBfcG9ydCwgVUNIQVIgcF9kYXRhX2JpdCkKKyNlbHNlCit2b2lkIHNjd2lyb2QoVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX2RhdGFfYml0KQorI2VuZGlmCit7CisgICBVQ0hBUiBpOworCisgICBpID0gMDsKKyAgIHdoaWxlICggaSA8IE1BWF9TQ1NJX1RBUiApIHsKKworICAgICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lkYXRhXzApICYgcF9kYXRhX2JpdCkKKworICAgICAgICAgaSA9IDA7CisKKyAgICAgIGVsc2UKKworICAgICAgICAgaSsrOworCisgICAgICB9Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3dpcm9zCisgKgorICogRGVzY3JpcHRpb246IFNhbXBsZSB0aGUgU0NTSSBTaWduYWwgbGluZXMgbWFraW5nIHN1cmUgdGhlIHNpZ25hbCBoYXMgYmVlbgorICogICAgICAgICAgICAgIGRlYXNzZXJ0ZWQgZm9yIHRoZSBjb3JyZWN0IG51bWJlciBvZiBjb25zZWN1dGl2ZSBzYW1wbGVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBzY3dpcm9zKFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfZGF0YV9iaXQpCisjZWxzZQordm9pZCBzY3dpcm9zKFVMT05HIHBfcG9ydCwgVUNIQVIgcF9kYXRhX2JpdCkKKyNlbmRpZgoreworICAgVUNIQVIgaTsKKworICAgaSA9IDA7CisgICB3aGlsZSAoIGkgPCBNQVhfU0NTSV9UQVIgKSB7CisKKyAgICAgIGlmIChSRF9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnKSAmIHBfZGF0YV9iaXQpCisKKyAgICAgICAgIGkgPSAwOworCisgICAgICBlbHNlCisKKyAgICAgICAgIGkrKzsKKworICAgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjdmFscQorICoKKyAqIERlc2NyaXB0aW9uOiBNYWtlIHN1cmUgd2UgcmVjZWl2ZWQgYSB2YWxpZCBkYXRhIGJ5dGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQ0hBUiBzY3ZhbHEoVUNIQVIgcF9xdWludGV0KQoreworICAgVUNIQVIgY291bnQ7CisKKyAgIGZvciAoY291bnQ9MTsgY291bnQgPCAweDA4OyBjb3VudDw8PTEpIHsKKyAgICAgIGlmICghKHBfcXVpbnRldCAmIGNvdW50KSkKKyAgICAgICAgIHBfcXVpbnRldCAtPSAweDgwOworICAgICAgfQorCisgICBpZiAocF9xdWludGV0ICYgMHgxOCkKKyAgICAgIHJldHVybihGQUxTRSk7CisKKyAgIGVsc2UKKyAgICAgIHJldHVybihUUlVFKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBzY3NlbGwKKyAqCisgKiBEZXNjcmlwdGlvbjogU2VsZWN0IHRoZSBzcGVjaWZpZWQgZGV2aWNlIElEIHVzaW5nIGEgc2VsZWN0aW9uIHRpbWVvdXQKKyAqICAgICAgICAgICAgICBsZXNzIHRoYW4gNG1zLiAgSWYgc29tZWJvZHkgcmVzcG9uZHMgdGhlbiBpdCBpcyBhIGxlZ2FjeQorICogICAgICAgICAgICAgIGRyaXZlIGFuZCB0aGlzIElEIG11c3QgYmUgbWFya2VkIGFzIHN1Y2guCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVQ0hBUiBzY3NlbGwoVVNIT1JUIHBfcG9ydCwgVUNIQVIgdGFyZ19pZCkKKyNlbHNlCitVQ0hBUiBzY3NlbGwoVUxPTkcgcF9wb3J0LCBVQ0hBUiB0YXJnX2lkKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChET1MpCisgICBVU0hPUlQgaTsKKyNlbHNlCisgICBVTE9ORyBpOworI2VuZGlmCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwKKyAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpIHwgR19JTlRfRElTQUJMRSkpOworCisgICBBUkFNX0FDQ0VTUyhwX3BvcnQpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9hZGRzdGF0LChSRF9IQVJQT09OKHBfcG9ydCtocF9hZGRzdGF0KSB8IFNDQU1fVElNRVIpKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQsVE9fNG1zKTsKKworCisgICBmb3IgKGkgPSBwX3BvcnQrQ01EX1NUUlQ7IGkgPCBwX3BvcnQrQ01EX1NUUlQrMTI7IGkrPTIpIHsKKyAgICAgIFdSV19IQVJQT09OKGksIChNUE1fT1ArQUNPTU1BTkQpKTsKKyAgICAgIH0KKyAgIFdSV19IQVJQT09OKGksIChCUkhfT1ArQUxXQVlTKyAgICBOUCkpOworCisgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLAorCSAgICAgICAoUkVTRVQgfCBUSU1FT1VUIHwgU0VMIHwgQlVTX0ZSRUUgfCBBVVRPX0lOVCkpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zZWxlY3RfaWQsIHRhcmdfaWQpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLCBTQ1NJX1BPUlQpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfYXV0b3N0YXJ0XzMsIChTRUxFQ1QgfCBDTURfT05MWV9TVFJUKSk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zY3NpY3RybF8wLCAoU0VMX1RBUiB8IEVOQV9SRVNFTCkpOworCisKKyAgIHdoaWxlICghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYKKwkgICAgKFJFU0VUIHwgUFJPR19ITFQgfCBUSU1FT1VUIHwgQVVUT19JTlQpKSkge30KKworICAgaWYgKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgUkVTRVQpCisgICAgICAgICBXYWl0KHBfcG9ydCwgVE9fMjUwbXMpOworCisgICBESVNBQkxFX0FVVE8ocF9wb3J0KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCwoUkRfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCkgJiB+U0NBTV9USU1FUikpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2VsdGltZW91dCxUT18yOTBtcyk7CisKKyAgIFNHUkFNX0FDQ0VTUyhwX3BvcnQpOworCisgICBpZiAoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiAoUkVTRVQgfCBUSU1FT1VUKSApIHsKKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwKKwkJICAoUkVTRVQgfCBUSU1FT1VUIHwgU0VMIHwgQlVTX0ZSRUUgfCBQSEFTRSkpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSk7CisKKyAgICAgIHJldHVybihGQUxTRSk7ICAvKk5vIGxlZ2FjeSBkZXZpY2UgKi8KKyAgICAgIH0KKworICAgZWxzZSB7CisKKyAgICAgIHdoaWxlKCEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBCVVNfRlJFRSkpIHsKKwkJCQlpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZykgJiBTQ1NJX1JFUSkKKwkJCQkJeworCQkJCQlXUl9IQVJQT09OKHBfcG9ydCtocF9zY3Npc2lnLCAoU0NTSV9BQ0sgKyBTX0lMTF9QSCkpOworICAgICAgCQkJQUNDRVBUX01TRyhwX3BvcnQpOworCQkJCQl9CisJCX0KKworICAgICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwgQ0xSX0FMTF9JTlRfMSk7CisKKyAgICAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCwKKyAgICAgICAgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpICYgfkdfSU5UX0RJU0FCTEUpKTsKKworICAgICAgcmV0dXJuKFRSVUUpOyAgLypGb3VuZCBvbmUgb2YgdGhlbSBvbGRpZXMhICovCisgICAgICB9Cit9CisKKyNpZiBkZWZpbmVkKERPUykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjc2VsbCBmb3IgRE9TCisgKgorICogRGVzY3JpcHRpb246IFNlbGVjdCB0aGUgc3BlY2lmaWVkIGRldmljZSBJRCB1c2luZyBhIHNlbGVjdGlvbiB0aW1lb3V0CisgKiAgICAgICAgICAgICAgbGVzcyB0aGFuIDJtcy4gIFRoaXMgd2FzIHNwZWNpYWxseSByZXF1aXJlZCB0byBzb2x2ZQorICogICAgICAgICAgICAgIHRoZSBwcm9ibGVtIHdpdGggUGxleHRvciAxMlggQ0QtUk9NIGRyaXZlLiBUaGlzIGRyaXZlCisgKgkJCQkJIHdhcyByZXNwb25kaW5nIHRoZSBTZWxlY3Rpb24gYXQgdGhlIGVuZCBvZiA0bXMgYW5kIAorICoJCQkJCSBoYW5naW5nIHRoZSBzeXN0ZW0uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQ0hBUiBzY3NlbGxET1MoVVNIT1JUIHBfcG9ydCwgVUNIQVIgdGFyZ19pZCkKK3sKKyAgIFVTSE9SVCBpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSB8IEdfSU5UX0RJU0FCTEUpKTsKKworICAgQVJBTV9BQ0NFU1MocF9wb3J0KTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCwoUkRfSEFSUE9PTihwX3BvcnQraHBfYWRkc3RhdCkgfCBTQ0FNX1RJTUVSKSk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zZWx0aW1lb3V0LFRPXzJtcyk7CisKKworICAgZm9yIChpID0gcF9wb3J0K0NNRF9TVFJUOyBpIDwgcF9wb3J0K0NNRF9TVFJUKzEyOyBpKz0yKSB7CisgICAgICBXUldfSEFSUE9PTihpLCAoTVBNX09QK0FDT01NQU5EKSk7CisgICAgICB9CisgICBXUldfSEFSUE9PTihpLCAoQlJIX09QK0FMV0FZUysgICAgTlApKTsKKworICAgV1JXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSwKKwkgICAgICAgKFJFU0VUIHwgVElNRU9VVCB8IFNFTCB8IEJVU19GUkVFIHwgQVVUT19JTlQpKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2VsZWN0X2lkLCB0YXJnX2lkKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcG9ydGN0cmxfMCwgU0NTSV9QT1JUKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2F1dG9zdGFydF8zLCAoU0VMRUNUIHwgQ01EX09OTFlfU1RSVCkpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaWN0cmxfMCwgKFNFTF9UQVIgfCBFTkFfUkVTRUwpKTsKKworCisgICB3aGlsZSAoIShSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmCisJICAgIChSRVNFVCB8IFBST0dfSExUIHwgVElNRU9VVCB8IEFVVE9fSU5UKSkpIHt9CisKKyAgIGlmIChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIFJFU0VUKQorICAgICAgICAgV2FpdChwX3BvcnQsIFRPXzI1MG1zKTsKKworICAgRElTQUJMRV9BVVRPKHBfcG9ydCk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2FkZHN0YXQsKFJEX0hBUlBPT04ocF9wb3J0K2hwX2FkZHN0YXQpICYgflNDQU1fVElNRVIpKTsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQsVE9fMjkwbXMpOworCisgICBTR1JBTV9BQ0NFU1MocF9wb3J0KTsKKworICAgaWYgKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgKFJFU0VUIHwgVElNRU9VVCkgKSB7CisKKyAgICAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCksCisJCSAgKFJFU0VUIHwgVElNRU9VVCB8IFNFTCB8IEJVU19GUkVFIHwgUEhBU0UpKTsKKworICAgICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsLAorICAgICAgICAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiB+R19JTlRfRElTQUJMRSkpOworCisgICAgICByZXR1cm4oRkFMU0UpOyAgLypObyBsZWdhY3kgZGV2aWNlICovCisgICAgICB9CisKKyAgIGVsc2UgeworCisgICAgICB3aGlsZSghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgQlVTX0ZSRUUpKSB7CisJCQkJaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2lzaWcpICYgU0NTSV9SRVEpCisJCQkJCXsKKwkJCQkJV1JfSEFSUE9PTihwX3BvcnQraHBfc2NzaXNpZywgKFNDU0lfQUNLICsgU19JTExfUEgpKTsKKyAgICAgIAkJCUFDQ0VQVF9NU0cocF9wb3J0KTsKKwkJCQkJfQorCQl9CisKKyAgICAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCksIENMUl9BTExfSU5UXzEpOworCisgICAgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsCisgICAgICAgICAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIH5HX0lOVF9ESVNBQkxFKSk7CisKKyAgICAgIHJldHVybihUUlVFKTsgIC8qRm91bmQgb25lIG9mIHRoZW0gb2xkaWVzISAqLworICAgICAgfQorfQorI2VuZGlmICAvKiBET1MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogc2N3dHNlbAorICoKKyAqIERlc2NyaXB0aW9uOiBXYWl0IHRvIGJlIHNlbGVjdGVkIGJ5IGFub3RoZXIgU0NBTSBpbml0aWF0b3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjd3RzZWwoVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIHNjd3RzZWwoVUxPTkcgcF9wb3J0KQorI2VuZGlmCit7CisgICB3aGlsZSghKFJEV19IQVJQT09OKChwX3BvcnQraHBfaW50c3RhdCkpICYgU0NBTV9TRUwpKSB7fQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IGluaXNjaQorICoKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCB0aGUgZGF0YSBTdHJ1Y3R1cmUgd2l0aCB0aGUgaW5mbyBmcm9tIHRoZSBFRVBST00uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIGluaXNjaShVQ0hBUiBwX2NhcmQsIFVTSE9SVCBwX3BvcnQsIFVDSEFSIHBfb3VyX2lkKQorI2Vsc2UKK3ZvaWQgaW5pc2NpKFVDSEFSIHBfY2FyZCwgVUxPTkcgcF9wb3J0LCBVQ0hBUiBwX291cl9pZCkKKyNlbmRpZgoreworICAgVUNIQVIgaSxrLG1heF9pZDsKKyAgIFVTSE9SVCBlZV9kYXRhOworCVBOVlJhbUluZm8gcEN1cnJOdlJhbTsKKworCXBDdXJyTnZSYW0gPSBCTF9DYXJkW3BfY2FyZF0ucE52UmFtSW5mbzsKKworICAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiBOQVJST1dfU0NTSV9DQVJEKQorICAgICAgbWF4X2lkID0gMHgwODsKKworICAgZWxzZQorICAgICAgbWF4X2lkID0gMHgxMDsKKworCWlmKHBDdXJyTnZSYW0peworCQlmb3IoaSA9IDA7IGkgPCBtYXhfaWQ7IGkrKyl7CisKKwkJCWZvcihrID0gMDsgayA8IDQ7IGsrKykKKwkJCQlzY2FtSW5mb1tpXS5pZF9zdHJpbmdba10gPSBwQ3Vyck52UmFtLT5uaVNjYW1UYmxbaV1ba107CisJCQlmb3IoayA9IDQ7IGsgPCBJRF9TVFJJTkdfTEVOR1RIOyBrKyspCisJCQkJc2NhbUluZm9baV0uaWRfc3RyaW5nW2tdID0gKFVDSEFSKSAweDAwOworCisJICAgICAgaWYoc2NhbUluZm9baV0uaWRfc3RyaW5nWzBdID09IDB4MDApCisgICAgICAJICAgc2NhbUluZm9baV0uc3RhdGUgPSBJRF9VTlVTRUQ7ICAvKkRlZmF1bHQgdG8gdW51c2VkIElELiAqLworCSAgICAgIGVsc2UKKyAgIAkgICAgICBzY2FtSW5mb1tpXS5zdGF0ZSA9IElEX1VOQVNTSUdORUQ7ICAvKkRlZmF1bHQgdG8gdW5hc3NpZ25lZCBJRC4gKi8KKworCQl9CisJfWVsc2UgeworCSAgIGZvciAoaT0wOyBpIDwgbWF4X2lkOyBpKyspCisgICAJICAgeworICAgICAgCWZvciAoaz0wOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgays9MikKKwkgICAgICAgICB7CisgICAJICAgICAgZWVfZGF0YSA9IHV0aWxFRVJlYWQocF9wb3J0LCAoVVNIT1JUKSgoRUVfU0NBTUJBU0UvMikgKworICAgICAgCSAgICAgKFVTSE9SVCkgKGkqKChVU0hPUlQpSURfU1RSSU5HX0xFTkdUSC8yKSkgKyAoVVNIT1JUKShrLzIpKSk7CisgICAgICAgICAJc2NhbUluZm9baV0uaWRfc3RyaW5nW2tdID0gKFVDSEFSKSBlZV9kYXRhOworCSAgICAgICAgIGVlX2RhdGEgPj49IDg7CisgICAJICAgICAgc2NhbUluZm9baV0uaWRfc3RyaW5nW2srMV0gPSAoVUNIQVIpIGVlX2RhdGE7CisgICAgICAJICAgfQorCisJICAgICAgaWYgKChzY2FtSW5mb1tpXS5pZF9zdHJpbmdbMF0gPT0gMHgwMCkgfHwKKyAgIAkgICAgICAgKHNjYW1JbmZvW2ldLmlkX3N0cmluZ1swXSA9PSAweEZGKSkKKworICAgICAgCSAgIHNjYW1JbmZvW2ldLnN0YXRlID0gSURfVU5VU0VEOyAgLypEZWZhdWx0IHRvIHVudXNlZCBJRC4gKi8KKworCSAgICAgIGVsc2UKKyAgIAkgICAgICBzY2FtSW5mb1tpXS5zdGF0ZSA9IElEX1VOQVNTSUdORUQ7ICAvKkRlZmF1bHQgdG8gdW5hc3NpZ25lZCBJRC4gKi8KKworICAgICAgCX0KKwl9CisJZm9yKGsgPSAwOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorCQlzY2FtSW5mb1twX291cl9pZF0uaWRfc3RyaW5nW2tdID0gc2NhbUhBU3RyaW5nW2tdOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjbWFjaGlkCisgKgorICogRGVzY3JpcHRpb246IE1hdGNoIHRoZSBEZXZpY2UgSUQgc3RyaW5nIHdpdGggb3VyIHZhbHVlcyBzdG9yZWQgaW4KKyAqICAgICAgICAgICAgICB0aGUgRUVQUk9NLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVUNIQVIgc2NtYWNoaWQoVUNIQVIgcF9jYXJkLCBVQ0hBUiBwX2lkX3N0cmluZ1tdKQoreworCisgICBVQ0hBUiBpLGssbWF0Y2g7CisKKworICAgZm9yIChpPTA7IGkgPCBNQVhfU0NTSV9UQVI7IGkrKykgeworCisjaWYgIWRlZmluZWQoU0NBTV9MRVZfMikKKyAgICAgIGlmIChzY2FtSW5mb1tpXS5zdGF0ZSA9PSBJRF9VTkFTU0lHTkVEKQorICAgICAgICAgeworI2VuZGlmCisgICAgICAgICBtYXRjaCA9IFRSVUU7CisKKyAgICAgICAgIGZvciAoaz0wOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfaWRfc3RyaW5nW2tdICE9IHNjYW1JbmZvW2ldLmlkX3N0cmluZ1trXSkKKyAgICAgICAgICAgICAgIG1hdGNoID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgIGlmIChtYXRjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHNjYW1JbmZvW2ldLnN0YXRlID0gSURfQVNTSUdORUQ7CisgICAgICAgICAgICByZXR1cm4oaSk7CisgICAgICAgICAgICB9CisKKyNpZiAhZGVmaW5lZChTQ0FNX0xFVl8yKQorICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgIH0KKworCisKKyAgIGlmIChwX2lkX3N0cmluZ1swXSAmIEJJVCg1KSkKKyAgICAgIGkgPSA4OworICAgZWxzZQorICAgICAgaSA9IE1BWF9TQ1NJX1RBUjsKKworICAgaWYgKCgocF9pZF9zdHJpbmdbMF0gJiAweDA2KSA9PSAweDAyKSB8fCAoKHBfaWRfc3RyaW5nWzBdICYgMHgwNikgPT0gMHgwNCkpCisgICAgICBtYXRjaCA9IHBfaWRfc3RyaW5nWzFdICYgKFVDSEFSKSAweDFGOworICAgZWxzZQorICAgICAgbWF0Y2ggPSA3OworCisgICB3aGlsZSAoaSA+IDApCisgICAgICB7CisgICAgICBpLS07CisKKyAgICAgIGlmIChzY2FtSW5mb1ttYXRjaF0uc3RhdGUgPT0gSURfVU5VU0VEKQorICAgICAgICAgeworICAgICAgICAgZm9yIChrPTA7IGsgPCBJRF9TVFJJTkdfTEVOR1RIOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzY2FtSW5mb1ttYXRjaF0uaWRfc3RyaW5nW2tdID0gcF9pZF9zdHJpbmdba107CisgICAgICAgICAgICB9CisKKyAgICAgICAgIHNjYW1JbmZvW21hdGNoXS5zdGF0ZSA9IElEX0FTU0lHTkVEOworCisJCQlpZihCTF9DYXJkW3BfY2FyZF0ucE52UmFtSW5mbyA9PSBOVUxMKQorCSAgICAgICAgIEJMX0NhcmRbcF9jYXJkXS5nbG9iYWxGbGFncyB8PSBGX1VQREFURV9FRVBST007CisgICAgICAgICByZXR1cm4obWF0Y2gpOworCisgICAgICAgICB9CisKKworICAgICAgbWF0Y2gtLTsKKworICAgICAgaWYgKG1hdGNoID09IDB4RkYpCisJeworICAgICAgICAgaWYgKHBfaWRfc3RyaW5nWzBdICYgQklUKDUpKQorICAgICAgICAgICAgbWF0Y2ggPSA3OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF0Y2ggPSBNQVhfU0NTSV9UQVItMTsKKwl9CisgICAgICB9CisKKworCisgICBpZiAocF9pZF9zdHJpbmdbMF0gJiBCSVQoNykpCisgICAgICB7CisgICAgICByZXR1cm4oQ0xSX1BSSU9SSVRZKTsKKyAgICAgIH0KKworCisgICBpZiAocF9pZF9zdHJpbmdbMF0gJiBCSVQoNSkpCisgICAgICBpID0gODsKKyAgIGVsc2UKKyAgICAgIGkgPSBNQVhfU0NTSV9UQVI7CisKKyAgIGlmICgoKHBfaWRfc3RyaW5nWzBdICYgMHgwNikgPT0gMHgwMikgfHwgKChwX2lkX3N0cmluZ1swXSAmIDB4MDYpID09IDB4MDQpKQorICAgICAgbWF0Y2ggPSBwX2lkX3N0cmluZ1sxXSAmIChVQ0hBUikgMHgxRjsKKyAgIGVsc2UKKyAgICAgIG1hdGNoID0gNzsKKworICAgd2hpbGUgKGkgPiAwKQorICAgICAgeworCisgICAgICBpLS07CisKKyAgICAgIGlmIChzY2FtSW5mb1ttYXRjaF0uc3RhdGUgPT0gSURfVU5BU1NJR05FRCkKKyAgICAgICAgIHsKKyAgICAgICAgIGZvciAoaz0wOyBrIDwgSURfU1RSSU5HX0xFTkdUSDsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgc2NhbUluZm9bbWF0Y2hdLmlkX3N0cmluZ1trXSA9IHBfaWRfc3RyaW5nW2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICBzY2FtSW5mb1ttYXRjaF0uaWRfc3RyaW5nWzBdIHw9IEJJVCg3KTsKKyAgICAgICAgIHNjYW1JbmZvW21hdGNoXS5zdGF0ZSA9IElEX0FTU0lHTkVEOworCQkJaWYoQkxfQ2FyZFtwX2NhcmRdLnBOdlJhbUluZm8gPT0gTlVMTCkKKwkgICAgICAgICBCTF9DYXJkW3BfY2FyZF0uZ2xvYmFsRmxhZ3MgfD0gRl9VUERBVEVfRUVQUk9NOworICAgICAgICAgcmV0dXJuKG1hdGNoKTsKKworICAgICAgICAgfQorCisKKyAgICAgIG1hdGNoLS07CisKKyAgICAgIGlmIChtYXRjaCA9PSAweEZGKQorCXsKKyAgICAgICAgIGlmIChwX2lkX3N0cmluZ1swXSAmIEJJVCg1KSkKKyAgICAgICAgICAgIG1hdGNoID0gNzsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hdGNoID0gTUFYX1NDU0lfVEFSLTE7CisJfQorICAgICAgfQorCisgICByZXR1cm4oTk9fSURfQVZBSUwpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IHNjc2F2ZGkKKyAqCisgKiBEZXNjcmlwdGlvbjogU2F2ZSBvZmYgdGhlIGRldmljZSBTQ0FNIElEIHN0cmluZ3MuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCit2b2lkIHNjc2F2ZGkoVUNIQVIgcF9jYXJkLCBVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK3ZvaWQgc2NzYXZkaShVQ0hBUiBwX2NhcmQsIFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgVUNIQVIgaSxrLG1heF9pZDsKKyAgIFVTSE9SVCBlZV9kYXRhLHN1bV9kYXRhOworCisKKyAgIHN1bV9kYXRhID0gMHgwMDAwOworCisgICBmb3IgKGkgPSAxOyBpIDwgRUVfU0NBTUJBU0UvMjsgaSsrKQorICAgICAgeworICAgICAgc3VtX2RhdGEgKz0gdXRpbEVFUmVhZChwX3BvcnQsIGkpOworICAgICAgfQorCisKKyAgIHV0aWxFRVdyaXRlT25PZmYocF9wb3J0LDEpOyAgIC8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIEVFUFJPTSAqLworCisgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBtYXhfaWQgPSAweDA4OworCisgICBlbHNlCisgICAgICBtYXhfaWQgPSAweDEwOworCisgICBmb3IgKGk9MDsgaSA8IG1heF9pZDsgaSsrKQorICAgICAgeworCisgICAgICBmb3IgKGs9MDsgayA8IElEX1NUUklOR19MRU5HVEg7IGsrPTIpCisgICAgICAgICB7CisgICAgICAgICBlZV9kYXRhID0gc2NhbUluZm9baV0uaWRfc3RyaW5nW2srMV07CisgICAgICAgICBlZV9kYXRhIDw8PSA4OworICAgICAgICAgZWVfZGF0YSB8PSBzY2FtSW5mb1tpXS5pZF9zdHJpbmdba107CisgICAgICAgICBzdW1fZGF0YSArPSBlZV9kYXRhOworICAgICAgICAgdXRpbEVFV3JpdGUocF9wb3J0LCBlZV9kYXRhLCAoVVNIT1JUKSgoRUVfU0NBTUJBU0UvMikgKworICAgICAgICAgICAgKFVTSE9SVCkoaSooKFVTSE9SVClJRF9TVFJJTkdfTEVOR1RILzIpKSArIChVU0hPUlQpKGsvMikpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIHN1bV9kYXRhLCBFRVBST01fQ0hFQ0tfU1VNLzIpOworICAgdXRpbEVFV3JpdGVPbk9mZihwX3BvcnQsMCk7ICAgLyogVHVybiBvZmYgd3JpdGUgYWNjZXNzICovCit9CisjaWRlbnQgIiRJZDogZGlhZ25vc2UuYyAxLjEwIDE5OTcvMDYvMTAgMTY6NTE6NDcgbW9oYW4gRXhwICQiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogICBDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IE15bGV4IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBib3RoIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbmQgYSBCU0Qtc3R5bGUgY29weXJpZ2h0OyBzZWUgTElDRU5TRS5GbGFzaFBvaW50IGZvciBkZXRhaWxzLgorICoKKyAqICAgJFdvcmtmaWxlOiAgIGRpYWdub3NlLmMgICQKKyAqCisgKiAgIERlc2NyaXB0aW9uOiAgRGlhZ25vc3RpYyBmdW50aW9ucyBmb3IgdGVzdGluZyB0aGUgaW50ZWdyaXR5IG9mCisgKiAgICAgICAgICAgICAgICAgdGhlIEhBUlBPT04uCisgKgorICogICAkRGF0ZTogMTk5Ny8wNi8xMCAxNjo1MTo0NyAkCisgKgorICogICAkUmV2aXNpb246IDEuMTAgJAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxlZXByb20uaD4qLworLyojaW5jbHVkZSA8aGFycG9vbi5oPiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFhib3dJbml0CisgKgorICogRGVzY3JpcHRpb246IFNldHVwIHRoZSBYYm93IGZvciBub3JtYWwgb3BlcmF0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBYYm93SW5pdChVU0hPUlQgcG9ydCwgVUNIQVIgU2NhbUZsZykKKyNlbHNlCit2b2lkIFhib3dJbml0KFVMT05HIHBvcnQsIFVDSEFSIFNjYW1GbGcpCisjZW5kaWYKK3sKK1VDSEFSIGk7CisKKwlpID0gUkRfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCk7CisJV1JfSEFSUE9PTihwb3J0K2hwX3BhZ2VfY3RybCwgKFVDSEFSKSAoaSB8IEdfSU5UX0RJU0FCTEUpKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3Njc2lyZXNldCwweDAwKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8xLEhPU1RfTU9ERTgpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXJlc2V0LChETUFfUkVTRVQgfCBIUFNDU0lfUkVTRVQgfCBQUk9HX1JFU0VUIHwgXAorCQkJCSBGSUZPX0NMUikpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXJlc2V0LFNDU0lfSU5JKTsKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX2Nsa2N0cmxfMCxDTEtDVFJMX0RFRkFVTFQpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2NzaXNpZywweDAwKTsgICAgICAgICAvKiAgQ2xlYXIgYW55IHNpZ25hbHMgd2UgbWlnaHQgKi8KKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zY3NpY3RybF8wLEVOQV9TQ0FNX1NFTCk7CisKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludHN0YXQpLCBDTFJfQUxMX0lOVCk7CisKKyNpZiBkZWZpbmVkKFNDQU1fTEVWXzIpCisgICBkZWZhdWx0X2ludGVuYSA9IFJFU0VUIHwgUlNFTCB8IFBST0dfSExUIHwgVElNRU9VVCB8CisJCSAgICBCVVNfRlJFRSB8IFhGRVJfQ05UXzAgfCBBVVRPX0lOVDsKKworICAgaWYgKChTY2FtRmxnICYgU0NBTV9FTkFCTEVEKSAmJiAoU2NhbUZsZyAmIFNDQU1fTEVWRUwyKSkKKwkJZGVmYXVsdF9pbnRlbmEgfD0gU0NBTV9TRUw7CisKKyNlbHNlCisgICBkZWZhdWx0X2ludGVuYSA9IFJFU0VUIHwgUlNFTCB8IFBST0dfSExUIHwgVElNRU9VVCB8CisJCSAgICBCVVNfRlJFRSB8IFhGRVJfQ05UXzAgfCBBVVRPX0lOVDsKKyNlbmRpZgorICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50ZW5hKSwgZGVmYXVsdF9pbnRlbmEpOworCisgICBXUl9IQVJQT09OKHBvcnQraHBfc2VsdGltZW91dCxUT18yOTBtcyk7CisKKyAgIC8qIFR1cm4gb24gU0NTSV9NT0RFOCBmb3IgbmFycm93IGNhcmRzIHRvIGZpeCB0aGUKKyAgICAgIHN0cmFwcGluZyBpc3N1ZSB3aXRoIHRoZSBEVUFMIENIQU5ORUwgY2FyZCAqLworICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9wYWdlX2N0cmwpICYgTkFSUk9XX1NDU0lfQ0FSRCkKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF9hZGRzdGF0LFNDU0lfTU9ERTgpOworCisjaWYgZGVmaW5lZChOT19CSU9TX09QVElPTikKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzAsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzEsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzIsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzMsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzQsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzUsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzYsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzcsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzgsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzksTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzEwLE5BUlJPV19TQ1NJKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zeW5jdGFyZ18xMSxOQVJST1dfU0NTSSk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfc3luY3RhcmdfMTIsTkFSUk9XX1NDU0kpOworICAgV1JfSEFSUE9PTihwb3J0K2hwX3N5bmN0YXJnXzEzLE5BUlJPV19TQ1NJKTsKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zeW5jdGFyZ18xNCxOQVJST1dfU0NTSSk7CisgICBXUl9IQVJQT09OKHBvcnQraHBfc3luY3RhcmdfMTUsTkFSUk9XX1NDU0kpOworCisjZW5kaWYKKwlXUl9IQVJQT09OKHBvcnQraHBfcGFnZV9jdHJsLCBpKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IEJ1c01hc3RlckluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogSW5pdGlhbGl6ZSB0aGUgQnVzTWFzdGVyIGZvciBub3JtYWwgb3BlcmF0aW9ucy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgQnVzTWFzdGVySW5pdChVU0hPUlQgcF9wb3J0KQorI2Vsc2UKK3ZvaWQgQnVzTWFzdGVySW5pdChVTE9ORyBwX3BvcnQpCisjZW5kaWYKK3sKKworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9zeXNfY3RybCwgRFJWUl9SU1QpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfc3lzX2N0cmwsIDB4MDApOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9ob3N0X2Jsa19jbnQsIFhGRVJfQkxLNjQpOworCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2JtX2N0cmwsIChCTUNUUkxfREVGQVVMVCkpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCAoU0NTSV9URVJNX0VOQV9IKSk7CisKKworI2lmIGRlZmluZWQoTlQpCisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3BjaV9jbWRfY2ZnLCAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGNpX2NtZF9jZmcpCisgICAgICAmIH5NRU1fU1BBQ0VfRU5BKSk7CisKKyNlbmRpZgorCisgICBSRF9IQVJQT09OKHBfcG9ydCtocF9pbnRfc3RhdHVzKTsgICAgICAgIC8qQ2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2ludF9tYXNrLCAoSU5UX0NNRF9DT01QTCB8IFNDU0lfSU5URVJSVVBUKSk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwsIChSRF9IQVJQT09OKHBfcG9ydCtocF9wYWdlX2N0cmwpICYKKyAgICAgIH5TQ0FUVEVSX0VOKSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogRGlhZ1hib3cKKyAqCisgKiBEZXNjcmlwdGlvbjogVGVzdCBYYm93IGludGVncml0eS4gIE5vbi16ZXJvIHJldHVybiBpbmRpY2F0ZXMgYW4gZXJyb3IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitpbnQgRGlhZ1hib3coVVNIT1JUIHBvcnQpCisjZWxzZQoraW50IERpYWdYYm93KFVMT05HIHBvcnQpCisjZW5kaWYKK3sKKyAgIHVuc2lnbmVkIGNoYXIgZmlmb19jbnQsbG9vcF9jbnQ7CisKKyAgIHVuc2lnbmVkIGNoYXIgZmlmb2RhdGFbNV07CisgICBmaWZvZGF0YVswXSA9IDB4MDA7CisgICBmaWZvZGF0YVsxXSA9IDB4RkY7CisgICBmaWZvZGF0YVsyXSA9IDB4NTU7CisgICBmaWZvZGF0YVszXSA9IDB4QUE7CisgICBmaWZvZGF0YVs0XSA9IDB4MDA7CisKKworICAgV1JXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCksIENMUl9BTExfSU5UKTsKKyAgIFdSV19IQVJQT09OKChwb3J0K2hwX2ludGVuYSksIDB4MDAwMCk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9zZWx0aW1lb3V0LFRPXzVtcyk7CisKKyAgIFdSX0hBUlBPT04ocG9ydCtocF9wb3J0Y3RybF8wLFNUQVJUX1RPKTsKKworCisgICBmb3IoZmlmb2RhdGFbNF0gPSAweDAxOyBmaWZvZGF0YVs0XSAhPSAoVUNIQVIpIDA7IGZpZm9kYXRhWzRdID0gZmlmb2RhdGFbNF0gPDwgMSkgeworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfc2VsZmlkXzAsZmlmb2RhdGFbNF0pOworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3NlbGZpZF8xLGZpZm9kYXRhWzRdKTsKKworICAgICAgaWYgKChSRF9IQVJQT09OKHBvcnQraHBfc2VsZmlkXzApICE9IGZpZm9kYXRhWzRdKSB8fAorICAgICAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfc2VsZmlkXzEpICE9IGZpZm9kYXRhWzRdKSkKKyAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKworCisgICBmb3IobG9vcF9jbnQgPSAwOyBsb29wX2NudCA8IDQ7IGxvb3BfY250KyspIHsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3BvcnRjdHJsXzAsKEhPU1RfUE9SVCB8IEhPU1RfV1JUIHwgU1RBUlRfVE8pKTsKKworCisgICAgICBmb3IgKGZpZm9fY250ID0gMDsgZmlmb19jbnQgPCBGSUZPX0xFTjsgZmlmb19jbnQrKykgeworCisgICAgICAgICBXUl9IQVJQT09OKHBvcnQraHBfZmlmb2RhdGFfMCwgZmlmb2RhdGFbbG9vcF9jbnRdKTsKKyAgICAgICAgIH0KKworCisgICAgICBpZiAoIShSRF9IQVJQT09OKHBvcnQraHBfeGZlcnN0YXQpICYgRklGT19GVUxMKSkKKyAgICAgICAgIHJldHVybigxKTsKKworCisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfcG9ydGN0cmxfMCwoSE9TVF9QT1JUIHwgU1RBUlRfVE8pKTsKKworICAgICAgZm9yIChmaWZvX2NudCA9IDA7IGZpZm9fY250IDwgRklGT19MRU47IGZpZm9fY250KyspIHsKKworICAgICAgICAgaWYgKFJEX0hBUlBPT04ocG9ydCtocF9maWZvZGF0YV8wKSAhPSBmaWZvZGF0YVtsb29wX2NudF0pCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICB9CisKKworICAgICAgaWYgKCEoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJzdGF0KSAmIEZJRk9fRU1QVFkpKQorICAgICAgICAgcmV0dXJuKDEpOworICAgICAgfQorCisKKyAgIHdoaWxlKCEoUkRXX0hBUlBPT04oKHBvcnQraHBfaW50c3RhdCkpICYgVElNRU9VVCkpIHt9CisKKworICAgV1JfSEFSUE9PTihwb3J0K2hwX3NlbHRpbWVvdXQsVE9fMjkwbXMpOworCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRzdGF0KSwgQ0xSX0FMTF9JTlQpOworCisgICBXUldfSEFSUE9PTigocG9ydCtocF9pbnRlbmEpLCBkZWZhdWx0X2ludGVuYSk7CisKKyAgIHJldHVybigwKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBEaWFnQnVzTWFzdGVyCisgKgorICogRGVzY3JpcHRpb246IFRlc3QgQnVzTWFzdGVyIGludGVncml0eS4gIE5vbi16ZXJvIHJldHVybiBpbmRpY2F0ZXMgYW4KKyAqICAgICAgICAgICAgICBlcnJvci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK2ludCBEaWFnQnVzTWFzdGVyKFVTSE9SVCBwb3J0KQorI2Vsc2UKK2ludCBEaWFnQnVzTWFzdGVyKFVMT05HIHBvcnQpCisjZW5kaWYKK3sKKyAgIFVDSEFSIHRlc3RkYXRhOworCisgICBmb3IodGVzdGRhdGEgPSAoVUNIQVIpIDE7IHRlc3RkYXRhICE9IChVQ0hBUikwOyB0ZXN0ZGF0YSA9IHRlc3RkYXRhIDw8IDEpIHsKKworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX3hmZXJfY250X2xvLHRlc3RkYXRhKTsKKyAgICAgIFdSX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9taSx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfeGZlcl9jbnRfaGksdGVzdGRhdGEpOworICAgICAgV1JfSEFSUE9PTihwb3J0K2hwX2hvc3RfYWRkcl9sbyx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2xtaSx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2htaSx0ZXN0ZGF0YSk7CisgICAgICBXUl9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2hpLHRlc3RkYXRhKTsKKworICAgICAgaWYgKChSRF9IQVJQT09OKHBvcnQraHBfeGZlcl9jbnRfbG8pICE9IHRlc3RkYXRhKSAgIHx8CisgICAgICAgICAgKFJEX0hBUlBPT04ocG9ydCtocF94ZmVyX2NudF9taSkgIT0gdGVzdGRhdGEpICAgfHwKKyAgICAgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX3hmZXJfY250X2hpKSAhPSB0ZXN0ZGF0YSkgICB8fAorICAgICAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2xvKSAhPSB0ZXN0ZGF0YSkgIHx8CisgICAgICAgICAgKFJEX0hBUlBPT04ocG9ydCtocF9ob3N0X2FkZHJfbG1pKSAhPSB0ZXN0ZGF0YSkgfHwKKyAgICAgICAgICAoUkRfSEFSUE9PTihwb3J0K2hwX2hvc3RfYWRkcl9obWkpICE9IHRlc3RkYXRhKSB8fAorICAgICAgICAgIChSRF9IQVJQT09OKHBvcnQraHBfaG9zdF9hZGRyX2hpKSAhPSB0ZXN0ZGF0YSkpCisKKyAgICAgICAgIHJldHVybigxKTsKKyAgICAgIH0KKyAgIFJEX0hBUlBPT04ocG9ydCtocF9pbnRfc3RhdHVzKTsgICAgICAgIC8qQ2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgIHJldHVybigwKTsKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IERpYWdFRVBST00KKyAqCisgKiBEZXNjcmlwdGlvbjogVmVyZml5IGNoZWNrc3VtIGFuZCAnS2V5JyBhbmQgaW5pdGlhbGl6ZSB0aGUgRUVQUk9NIGlmCisgKiAgICAgICAgICAgICAgbmVjZXNzYXJ5LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoRE9TKQordm9pZCBEaWFnRUVQUk9NKFVTSE9SVCBwX3BvcnQpCisjZWxzZQordm9pZCBEaWFnRUVQUk9NKFVMT05HIHBfcG9ydCkKKyNlbmRpZgorCit7CisgICBVU0hPUlQgaW5kZXgsdGVtcCxtYXhfd2RfY250OworCisgICBpZiAoUkRfSEFSUE9PTihwX3BvcnQraHBfcGFnZV9jdHJsKSAmIE5BUlJPV19TQ1NJX0NBUkQpCisgICAgICBtYXhfd2RfY250ID0gRUVQUk9NX1dEX0NOVDsKKyAgIGVsc2UKKyAgICAgIG1heF93ZF9jbnQgPSBFRVBST01fV0RfQ05UICogMjsKKworICAgdGVtcCA9IHV0aWxFRVJlYWQocF9wb3J0LCBGV19TSUdOQVRVUkUvMik7CisKKyAgIGlmICh0ZW1wID09IDB4NDY0MSkgeworCisgICAgICBmb3IgKGluZGV4ID0gMjsgaW5kZXggPCBtYXhfd2RfY250OyBpbmRleCsrKSB7CisKKyAgICAgICAgIHRlbXAgKz0gdXRpbEVFUmVhZChwX3BvcnQsIGluZGV4KTsKKworICAgICAgICAgfQorCisgICAgICBpZiAodGVtcCA9PSB1dGlsRUVSZWFkKHBfcG9ydCwgRUVQUk9NX0NIRUNLX1NVTS8yKSkgeworCisgICAgICAgICByZXR1cm47ICAgICAgICAgIC8qRUVQUk9NIGlzIE9rYXkgc28gcmV0dXJuIG5vdyEgKi8KKyAgICAgICAgIH0KKyAgICAgIH0KKworCisgICB1dGlsRUVXcml0ZU9uT2ZmKHBfcG9ydCwoVUNIQVIpMSk7CisKKyAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1heF93ZF9jbnQ7IGluZGV4KyspIHsKKworICAgICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDAwMDAsIGluZGV4KTsKKyAgICAgIH0KKworICAgdGVtcCA9IDA7CisKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg0NjQxLCBGV19TSUdOQVRVUkUvMik7CisgICB0ZW1wICs9IDB4NDY0MTsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgzOTIwLCBNT0RFTF9OVU1CXzAvMik7CisgICB0ZW1wICs9IDB4MzkyMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgzMDMzLCBNT0RFTF9OVU1CXzIvMik7CisgICB0ZW1wICs9IDB4MzAzMzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDIwLCBNT0RFTF9OVU1CXzQvMik7CisgICB0ZW1wICs9IDB4MjAyMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg3MEQzLCBTWVNURU1fQ09ORklHLzIpOworICAgdGVtcCArPSAweDcwRDM7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MDAxMCwgQklPU19DT05GSUcvMik7CisgICB0ZW1wICs9IDB4MDAxMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgwMDAzLCBTQ0FNX0NPTkZJRy8yKTsKKyAgIHRlbXAgKz0gMHgwMDAzOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDAwMDcsIEFEQVBURVJfU0NTSV9JRC8yKTsKKyAgIHRlbXAgKz0gMHgwMDA3OworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MDAwMCwgSUdOT1JFX0JfU0NBTi8yKTsKKyAgIHRlbXAgKz0gMHgwMDAwOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDAwMDAsIFNFTkRfU1RBUlRfRU5BLzIpOworICAgdGVtcCArPSAweDAwMDA7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MDAwMCwgREVWSUNFX0VOQUJMRS8yKTsKKyAgIHRlbXAgKz0gMHgwMDAwOworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDAxLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDIzLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDQ1LzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDY3LzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTDg5LzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTGFiLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTGNkLzIpOworICAgdGVtcCArPSAweDQyNDI7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NDI0MiwgU1lOQ19SQVRFX1RCTGVmLzIpOworICAgdGVtcCArPSAweDQyNDI7CisKKworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDZDNDYsIDY0LzIpOyAgLypQUk9EVUNUIElEICovCisgICB0ZW1wICs9IDB4NkM0NjsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg3MzYxLCA2Ni8yKTsgIC8qIEZsYXNoUG9pbnQgTFQgICAqLworICAgdGVtcCArPSAweDczNjE7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NTA2OCwgNjgvMik7CisgICB0ZW1wICs9IDB4NTA2ODsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg2OTZGLCA3MC8yKTsKKyAgIHRlbXAgKz0gMHg2OTZGOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDc0NkUsIDcyLzIpOworICAgdGVtcCArPSAweDc0NkU7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NEMyMCwgNzQvMik7CisgICB0ZW1wICs9IDB4NEMyMDsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDU0LCA3Ni8yKTsKKyAgIHRlbXAgKz0gMHgyMDU0OworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDIwMjAsIDc4LzIpOworICAgdGVtcCArPSAweDIwMjA7CisKKyAgIGluZGV4ID0gKChFRV9TQ0FNQkFTRS8yKSsoNyoxNikpOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAoMHgwNzAwK1RZUEVfQ09ERTApLCBpbmRleCk7CisgICB0ZW1wICs9ICgweDA3MDArVFlQRV9DT0RFMCk7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDU1NDIsIGluZGV4KTsgICAgICAgICAgICAvKlZlbmRvciBJRCBjb2RlICovCisgICB0ZW1wICs9IDB4NTU0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJVU0xPR0lDICAgICAgKi8KKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NEM1MywgaW5kZXgpOworICAgdGVtcCArPSAweDRDNTM7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDQ3NEYsIGluZGV4KTsKKyAgIHRlbXAgKz0gMHg0NzRGOworICAgaW5kZXgrKzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHg0MzQ5LCBpbmRleCk7CisgICB0ZW1wICs9IDB4NDM0OTsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NTQ0MiwgaW5kZXgpOyAgICAgICAgICAgIC8qVmVuZG9yIHVuaXF1ZSBjb2RlICovCisgICB0ZW1wICs9IDB4NTQ0MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlQtIDkzMCAgICAgICAgICAgKi8KKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MjAyRCwgaW5kZXgpOworICAgdGVtcCArPSAweDIwMkQ7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDMzMzksIGluZGV4KTsKKyAgIHRlbXAgKz0gMHgzMzM5OworICAgaW5kZXgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlNlcmlhbCAjICAgICAgICAgICovCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MjAzMCwgaW5kZXgpOyAgICAgICAgICAgICAvKiAwMTIzNDU2NyAgICAgICAgICovCisgICB0ZW1wICs9IDB4MjAzMDsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4NTQ1MywgaW5kZXgpOworICAgdGVtcCArPSAweDU0NTM7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDU2NDUsIGluZGV4KTsKKyAgIHRlbXAgKz0gMHg1NjQ1OworICAgaW5kZXgrKzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDQ1LCBpbmRleCk7CisgICB0ZW1wICs9IDB4MjA0NTsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MjAyRiwgaW5kZXgpOworICAgdGVtcCArPSAweDIwMkY7CisgICBpbmRleCsrOworICAgdXRpbEVFV3JpdGUocF9wb3J0LCAweDRGNEEsIGluZGV4KTsKKyAgIHRlbXAgKz0gMHg0RjRBOworICAgaW5kZXgrKzsKKyAgIHV0aWxFRVdyaXRlKHBfcG9ydCwgMHgyMDRFLCBpbmRleCk7CisgICB0ZW1wICs9IDB4MjA0RTsKKyAgIGluZGV4Kys7CisgICB1dGlsRUVXcml0ZShwX3BvcnQsIDB4MzUzOSwgaW5kZXgpOworICAgdGVtcCArPSAweDM1Mzk7CisKKworCisgICB1dGlsRUVXcml0ZShwX3BvcnQsIHRlbXAsIEVFUFJPTV9DSEVDS19TVU0vMik7CisKKyAgIHV0aWxFRVdyaXRlT25PZmYocF9wb3J0LChVQ0hBUikwKTsKKworfQorCisjaWRlbnQgIiRJZDogdXRpbGl0eS5jIDEuMjMgMTk5Ny8wNi8xMCAxNjo1NTowNiBtb2hhbiBFeHAgJCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiAgIENvcHlyaWdodCAxOTk1LTE5OTYgYnkgTXlsZXggQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGJvdGggdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFuZCBhIEJTRC1zdHlsZSBjb3B5cmlnaHQ7IHNlZSBMSUNFTlNFLkZsYXNoUG9pbnQgZm9yIGRldGFpbHMuCisgKgorICogICAkV29ya2ZpbGU6ICAgdXRpbGl0eS5jICAkCisgKgorICogICBEZXNjcmlwdGlvbjogIFV0aWxpdHkgZnVuY3Rpb25zIHJlbGF0aW5nIHRvIHF1ZXVlaW5nIGFuZCBFRVBST00KKyAqICAgICAgICAgICAgICAgICBtYW5pcHVsYXRpb24gYW5kIGFueSBvdGhlciBnYXJiYWdlIGZ1bmN0aW9ucy4KKyAqCisgKiAgICREYXRlOiAxOTk3LzA2LzEwIDE2OjU1OjA2ICQKKyAqCisgKiAgICRSZXZpc2lvbjogMS4yMyAkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qI2luY2x1ZGUgPGdsb2JhbHMuaD4qLworCisjaWYgKEZXX1RZUEU9PV9VQ0JfTUdSXykKKwkvKiNpbmNsdWRlIDxidWRpLmg+Ki8KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzY2NibWdyLmg+Ki8KKy8qI2luY2x1ZGUgPGJseDMwLmg+Ki8KKy8qI2luY2x1ZGUgPHRhcmdldC5oPiovCisvKiNpbmNsdWRlIDxzY3NpMi5oPiovCisvKiNpbmNsdWRlIDxoYXJwb29uLmg+Ki8KKworCisvKgorZXh0ZXJuIFNDQ0JDQVJEIEJMX0NhcmRbTUFYX0NBUkRTXTsKK2V4dGVybiBTQ0NCTUdSX1RBUl9JTkZPIHNjY2JNZ3JUYmxbTUFYX0NBUkRTXVtNQVhfU0NTSV9UQVJdOworZXh0ZXJuIHVuc2lnbmVkIGludCBTY2NiR2xvYmFsRmxhZ3M7CisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBRdWV1ZSBTZWFyY2ggU2VsZWN0CisgKgorICogRGVzY3JpcHRpb246IFRyeSB0byBmaW5kIGEgbmV3IGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgcXVldWVTZWFyY2hTZWxlY3QoUFNDQ0JjYXJkIHBDdXJyQ2FyZCwgVUNIQVIgcF9jYXJkKQoreworICAgVUNIQVIgc2Nhbl9wdHIsIGx1bjsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKwlQU0NDQiBwT2xkU2NjYjsKKworICAgc2Nhbl9wdHIgPSBwQ3VyckNhcmQtPnNjYW5JbmRleDsKKwlkbyAKKwl7CisJCWN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bc2Nhbl9wdHJdOworCQlpZigocEN1cnJDYXJkLT5nbG9iYWxGbGFncyAmIEZfQ09OTFVOX0lPKSAmJiAKKwkJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkKKwkJeworCQkJaWYgKGN1cnJUYXJfSW5mby0+VGFyU2VsUV9DbnQgIT0gMCkKKwkJCXsKKworCQkJCXNjYW5fcHRyKys7CisJCQkJaWYgKHNjYW5fcHRyID09IE1BWF9TQ1NJX1RBUikKKwkJCQkJc2Nhbl9wdHIgPSAwOworCQkJCQorCQkJCWZvcihsdW49MDsgbHVuIDwgTUFYX0xVTjsgbHVuKyspCisJCQkJeworCQkJCQlpZihjdXJyVGFyX0luZm8tPlRhckxVTkJ1c3lbbHVuXSA9PSBGQUxTRSkKKwkJCQkJeworCisJCQkJCQlwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCID0gY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQ7CisJCQkJCQlwT2xkU2NjYiA9IE5VTEw7CisKKwkJCQkJCXdoaWxlKChwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCICE9IE5VTEwpICYmCisJCQkJCQkJCSAobHVuICE9IHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0ItPkx1bikpCisJCQkJCQl7CisJCQkJCQkJcE9sZFNjY2IgPSBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCOworCQkJCQkJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSAoUFNDQ0IpKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpLT4KKwkJCQkJCQkJCQkJCQkJCQkJU2NjYl9mb3J3YXJkbGluazsKKwkJCQkJCX0KKwkJCQkJCWlmKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPT0gTlVMTCkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCWlmKHBPbGRTY2NiICE9IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJcE9sZFNjY2ItPlNjY2JfZm9yd2FyZGxpbmsgPSAoUFNDQ0IpKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IpLT4KKwkJCQkJCQkJCQkJCQkJCQkJU2NjYl9mb3J3YXJkbGluazsKKwkJCQkJCQlwT2xkU2NjYi0+U2NjYl9iYWNrbGluayA9IChQU0NDQikocEN1cnJDYXJkLT5jdXJyZW50U0NDQiktPgorCQkJCQkJCQkJCQkJCQkJCQlTY2NiX2JhY2tsaW5rOworCQkJCQkJCWN1cnJUYXJfSW5mby0+VGFyU2VsUV9DbnQtLTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9IChQU0NDQikocEN1cnJDYXJkLT5jdXJyZW50U0NDQiktPlNjY2JfZm9yd2FyZGxpbms7CisJCQkJCQorCQkJCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9PSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBOVUxMOworCQkJCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfQ250ID0gMDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudC0tOworCQkJCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZC0+U2NjYl9iYWNrbGluayA9IChQU0NDQilOVUxMOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJcEN1cnJDYXJkLT5zY2FuSW5kZXggPSBzY2FuX3B0cjsKKworCQkJCQlwQ3VyckNhcmQtPmdsb2JhbEZsYWdzIHw9IEZfTkVXX1NDQ0JfQ01EOworCisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQllbHNlIAorCQkJeworCQkJCXNjYW5fcHRyKys7CisJCQkJaWYgKHNjYW5fcHRyID09IE1BWF9TQ1NJX1RBUikgeworCQkJCQlzY2FuX3B0ciA9IDA7CisJCQkJfQorCQkJfQorCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKGN1cnJUYXJfSW5mby0+VGFyU2VsUV9DbnQgIT0gMCkgJiYKKwkJCQkoY3VyclRhcl9JbmZvLT5UYXJMVU5CdXN5WzBdID09IEZBTFNFKSkKKwkJCXsKKworCQkJCXBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZDsKKworCQkJCWN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkID0gKFBTQ0NCKShwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKS0+U2NjYl9mb3J3YXJkbGluazsKKworCQkJCWlmIChjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9PSBOVUxMKQorCQkJCXsKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBOVUxMOworCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfQ250ID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudC0tOworCQkJCQljdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZC0+U2NjYl9iYWNrbGluayA9IChQU0NDQilOVUxMOworCQkJCX0KKworCQkJCXNjYW5fcHRyKys7CisJCQkJaWYgKHNjYW5fcHRyID09IE1BWF9TQ1NJX1RBUikKKwkJCQkJc2Nhbl9wdHIgPSAwOworCisJCQkJcEN1cnJDYXJkLT5zY2FuSW5kZXggPSBzY2FuX3B0cjsKKworCQkJCXBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgfD0gRl9ORVdfU0NDQl9DTUQ7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZWxzZSAKKwkJCXsKKwkJCQlzY2FuX3B0cisrOworCQkJCWlmIChzY2FuX3B0ciA9PSBNQVhfU0NTSV9UQVIpIAorCQkJCXsKKwkJCQkJc2Nhbl9wdHIgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKHNjYW5fcHRyICE9IHBDdXJyQ2FyZC0+c2NhbkluZGV4KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBRdWV1ZSBTZWxlY3QgRmFpbAorICoKKyAqIERlc2NyaXB0aW9uOiBBZGQgdGhlIGN1cnJlbnQgU0NDQiB0byB0aGUgaGVhZCBvZiB0aGUgUXVldWUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHF1ZXVlU2VsZWN0RmFpbChQU0NDQmNhcmQgcEN1cnJDYXJkLCBVQ0hBUiBwX2NhcmQpCit7CisgICBVQ0hBUiB0aGlzVGFyZzsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgaWYgKHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgIT0gTlVMTCkKKwkgIHsKKwkgIHRoaXNUYXJnID0gKFVDSEFSKSgoKFBTQ0NCKShwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCKSktPlRhcmdJRCk7CisgICAgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RoaXNUYXJnXTsKKworICAgICAgcEN1cnJDYXJkLT5jdXJyZW50U0NDQi0+U2NjYl9iYWNrbGluayA9IChQU0NDQilOVUxMOworCisgICAgICBwQ3VyckNhcmQtPmN1cnJlbnRTQ0NCLT5TY2NiX2ZvcndhcmRsaW5rID0gY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQ7CisKKwkgIGlmIChjdXJyVGFyX0luZm8tPlRhclNlbFFfQ250ID09IDApCisJCSB7CisJCSBjdXJyVGFyX0luZm8tPlRhclNlbFFfVGFpbCA9IHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0I7CisJCSB9CisKKwkgIGVsc2UKKwkJIHsKKwkJIGN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkLT5TY2NiX2JhY2tsaW5rID0gcEN1cnJDYXJkLT5jdXJyZW50U0NDQjsKKwkJIH0KKworCisJICBjdXJyVGFyX0luZm8tPlRhclNlbFFfSGVhZCA9IHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0I7CisKKwkgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBOVUxMOworCSAgY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudCsrOworCSAgfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUXVldWUgQ29tbWFuZCBDb21wbGV0ZQorICoKKyAqIERlc2NyaXB0aW9uOiBDYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IFNDQ0IuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHF1ZXVlQ21kQ29tcGxldGUoUFNDQ0JjYXJkIHBDdXJyQ2FyZCwgUFNDQ0IgcF9zY2NiLCBVQ0hBUiBwX2NhcmQpCit7CisKKyNpZiAoRldfVFlQRT09X1VDQl9NR1JfKQorCisgICB1MDhiaXRzIFNDU0ljbWQ7CisgICBDQUxMX0JLX0ZOIGNhbGxiYWNrOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisgICBQVUNCIHBfdWNiOworICAgcF91Y2I9cF9zY2NiLT5TY2NiX3VjYl9wdHI7CisKKyAgIFNDU0ljbWQgPSBwX3NjY2ItPkNkYlswXTsKKworCisgICBpZiAoIShwX3NjY2ItPlNjY2JfWGZlclN0YXRlICYgRl9BTExfWEZFUlJFRCkpCisgICB7CisKKyAgICAgIGlmICgocF91Y2ItPlVDQl9vcGNvZGUgJiBPUENfQ0hLX1VOREVSX09WRVJfUlVOKSAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAocF9zY2NiLT5Ib3N0U3RhdHVzID09IFNDQ0JfQ09NUExFVEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgKHBfc2NjYi0+VGFyZ2V0U3RhdHVzICE9IFNTQ0hFQ0spKQorCisgICAgICAgICBpZiAoKFNDU0ljbWQgPT0gU0NTSV9SRUFEKSAgICAgICAgICAgICB8fAorICAgICAgICAgICAgIChTQ1NJY21kID09IFNDU0lfV1JJVEUpICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAoU0NTSWNtZCA9PSBTQ1NJX1JFQURfRVhURU5ERUQpICAgIHx8CisgICAgICAgICAgICAgKFNDU0ljbWQgPT0gU0NTSV9XUklURV9FWFRFTkRFRCkgICB8fAorICAgICAgICAgICAgIChTQ1NJY21kID09IFNDU0lfV1JJVEVfQU5EX1ZFUklGWSkgfHwKKyAgICAgICAgICAgICAoU0NTSWNtZCA9PSBTQ1NJX1NUQVJUX1NUT1BfVU5JVCkgIHx8CisgICAgICAgICAgICAgKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX05PX0ZJTFRFUikKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgIHBfc2NjYi0+SG9zdFN0YXR1cyA9IFNDQ0JfREFUQV9VTkRFUl9SVU47CisgICB9CisKKyAgIHBfdWNiLT5VQ0Jfc3RhdHVzPVNDQ0JfU1VDQ0VTUzsKKworICAgaWYgKChwX3VjYi0+VUNCX2hiYXN0YXQ9cF9zY2NiLT5Ib3N0U3RhdHVzKSB8fCAocF91Y2ItPlVDQl9zY3Npc3RhdD1wX3NjY2ItPlRhcmdldFN0YXR1cykpCisgICB7CisgICAgICBwX3VjYi0+VUNCX3N0YXR1cz1TQ0NCX0VSUk9SOworICAgfQorCisgICBpZiAoKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNJRFVBTF9TR19DT01NQU5EKSB8fAorICAgICAgKHBfc2NjYi0+T3BlcmF0aW9uQ29kZSA9PSBSRVNJRFVBTF9DT01NQU5EKSkKKyAgIHsKKworICAgICAgICAgdXRpbFVwZGF0ZVJlc2lkdWFsKHBfc2NjYik7CisKKyAgICAgICAgIHBfdWNiLT5VQ0JfZGF0YWxlbj1wX3NjY2ItPkRhdGFMZW5ndGg7CisgICB9CisKKyAgIHBDdXJyQ2FyZC0+Y21kQ291bnRlci0tOworICAgaWYgKCFwQ3VyckNhcmQtPmNtZENvdW50ZXIpCisgICB7CisKKyAgICAgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9HUkVFTl9QQykKKyAgICAgIHsKKyAgICAgICAgIFdSX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfY2xrY3RybF8wLChQV1JfRFdOIHwgQ0xLQ1RSTF9ERUZBVUxUKSk7CisgICAgICAgICBXUl9IQVJQT09OKHBDdXJyQ2FyZC0+aW9Qb3J0K2hwX3N5c19jdHJsLCBTVE9QX0NMSyk7CisgICAgICB9CisKKyAgICAgIFdSX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfc2VtYXBob3JlLAorICAgICAgKFJEX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfc2VtYXBob3JlKSAmIH5TQ0NCX01HUl9BQ1RJVkUpKTsKKyAgIH0KKworCWlmKHBDdXJyQ2FyZC0+ZGlzY1FDb3VudCAhPSAwKQorCXsKKyAgICAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bcF9zY2NiLT5UYXJnSURdOworCQlpZigoKHBDdXJyQ2FyZC0+Z2xvYmFsRmxhZ3MgJiBGX0NPTkxVTl9JTykgJiYKKwkJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJCXsKKwkJCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudC0tOworCQkJcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbcF9zY2NiLT5MdW5dXSA9IE5VTEw7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihwX3NjY2ItPlNjY2JfdGFnKQorCQkJeworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudC0tOworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW3Bfc2NjYi0+U2NjYl90YWddID0gTlVMTDsKKwkJCX1lbHNlCisJCQl7CisJCQkJcEN1cnJDYXJkLT5kaXNjUUNvdW50LS07CisJCQkJcEN1cnJDYXJkLT5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dID0gTlVMTDsKKwkJCX0KKwkJfQorCisJfQorICAgY2FsbGJhY2sgPSAoQ0FMTF9CS19GTilwX3VjYi0+VUNCX2NhbGxiYWNrOworICAgY2FsbGJhY2socF91Y2IpOworICAgcEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKyAgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBOVUxMOworfQorCisKKworCisjZWxzZQorCisgICBVQ0hBUiBpLCBTQ1NJY21kOworICAgQ0FMTF9CS19GTiBjYWxsYmFjazsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgU0NTSWNtZCA9IHBfc2NjYi0+Q2RiWzBdOworCisKKyAgIGlmICghKHBfc2NjYi0+U2NjYl9YZmVyU3RhdGUgJiBGX0FMTF9YRkVSUkVEKSkgeworCisJICBpZiAoKHBfc2NjYi0+Q29udHJvbEJ5dGUgJiAoU0NDQl9EQVRBX1hGRVJfT1VUIHwgU0NDQl9EQVRBX1hGRVJfSU4pKSAmJgorCQkgKHBfc2NjYi0+SG9zdFN0YXR1cyA9PSBTQ0NCX0NPTVBMRVRFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkJIChwX3NjY2ItPlRhcmdldFN0YXR1cyAhPSBTU0NIRUNLKSkKKworCQkgaWYgKChTQ1NJY21kID09IFNDU0lfUkVBRCkgICAgICAgICAgICAgfHwKKwkJCSAoU0NTSWNtZCA9PSBTQ1NJX1dSSVRFKSAgICAgICAgICAgIHx8CisJCQkgKFNDU0ljbWQgPT0gU0NTSV9SRUFEX0VYVEVOREVEKSAgICB8fAorCQkJIChTQ1NJY21kID09IFNDU0lfV1JJVEVfRVhURU5ERUQpICAgfHwKKwkJCSAoU0NTSWNtZCA9PSBTQ1NJX1dSSVRFX0FORF9WRVJJRlkpIHx8CisJCQkgKFNDU0ljbWQgPT0gU0NTSV9TVEFSVF9TVE9QX1VOSVQpICB8fAorCQkJIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9OT19GSUxURVIpCisJCQkpCisJCQkgICBwX3NjY2ItPkhvc3RTdGF0dXMgPSBTQ0NCX0RBVEFfVU5ERVJfUlVOOworCSAgfQorCisKKwlpZihwX3NjY2ItPlNjY2JTdGF0dXMgPT0gU0NDQl9JTl9QUk9DRVNTKQorCXsKKwkgICBpZiAocF9zY2NiLT5Ib3N0U3RhdHVzIHx8IHBfc2NjYi0+VGFyZ2V0U3RhdHVzKQorCQkgIHBfc2NjYi0+U2NjYlN0YXR1cyA9IFNDQ0JfRVJST1I7CisJICAgZWxzZQorCQkgIHBfc2NjYi0+U2NjYlN0YXR1cyA9IFNDQ0JfU1VDQ0VTUzsKKwl9CisKKyAgIGlmIChwX3NjY2ItPlNjY2JfWGZlclN0YXRlICYgRl9BVVRPX1NFTlNFKSB7CisKKwkgIHBfc2NjYi0+Q2RiTGVuZ3RoID0gcF9zY2NiLT5TYXZlX0NkYkxlbjsKKwkgIGZvciAoaT0wOyBpIDwgNjsgaSsrKSB7CisJCSBwX3NjY2ItPkNkYltpXSA9IHBfc2NjYi0+U2F2ZV9DZGJbaV07CisJCSB9CisJICB9CisKKyAgIGlmICgocF9zY2NiLT5PcGVyYXRpb25Db2RlID09IFJFU0lEVUFMX1NHX0NPTU1BTkQpIHx8CisJICAocF9zY2NiLT5PcGVyYXRpb25Db2RlID09IFJFU0lEVUFMX0NPTU1BTkQpKSB7CisKKwkJIHV0aWxVcGRhdGVSZXNpZHVhbChwX3NjY2IpOworCQkgfQorCisgICBwQ3VyckNhcmQtPmNtZENvdW50ZXItLTsKKyAgIGlmICghcEN1cnJDYXJkLT5jbWRDb3VudGVyKSB7CisKKwkgIGlmIChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9HUkVFTl9QQykgeworCQkgV1JfSEFSUE9PTihwQ3VyckNhcmQtPmlvUG9ydCtocF9jbGtjdHJsXzAsKFBXUl9EV04gfCBDTEtDVFJMX0RFRkFVTFQpKTsKKwkJIFdSX0hBUlBPT04ocEN1cnJDYXJkLT5pb1BvcnQraHBfc3lzX2N0cmwsIFNUT1BfQ0xLKTsKKwkJIH0KKworCSAgV1JfSEFSUE9PTihwQ3VyckNhcmQtPmlvUG9ydCtocF9zZW1hcGhvcmUsCisJICAoUkRfSEFSUE9PTihwQ3VyckNhcmQtPmlvUG9ydCtocF9zZW1hcGhvcmUpICYgflNDQ0JfTUdSX0FDVElWRSkpOworCisJICB9CisKKwlpZihwQ3VyckNhcmQtPmRpc2NRQ291bnQgIT0gMCkKKwl7CisgICAgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3Bfc2NjYi0+VGFyZ0lEXTsKKwkJaWYoKChwQ3VyckNhcmQtPmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCQkoKGN1cnJUYXJfSW5mby0+VGFyU3RhdHVzICYgVEFSX1RBR19RX01BU0spICE9IFRBR19RX1RSWUlORykpKQorCQl7CisJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW2N1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4W3Bfc2NjYi0+THVuXV0gPSBOVUxMOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYocF9zY2NiLT5TY2NiX3RhZykKKwkJCXsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRQ291bnQtLTsKKwkJCQlwQ3VyckNhcmQtPmRpc2NRX1RibFtwX3NjY2ItPlNjY2JfdGFnXSA9IE5VTEw7CisJCQl9ZWxzZQorCQkJeworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FDb3VudC0tOworCQkJCXBDdXJyQ2FyZC0+ZGlzY1FfVGJsW2N1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4WzBdXSA9IE5VTEw7CisJCQl9CisJCX0KKworCX0KKworCWNhbGxiYWNrID0gKENBTExfQktfRk4pcF9zY2NiLT5TY2NiQ2FsbGJhY2s7CisgICBjYWxsYmFjayhwX3NjY2IpOworICAgcEN1cnJDYXJkLT5nbG9iYWxGbGFncyB8PSBGX05FV19TQ0NCX0NNRDsKKyAgIHBDdXJyQ2FyZC0+Y3VycmVudFNDQ0IgPSBOVUxMOworfQorI2VuZGlmIC8qICggaWYgRldfVFlQRT09Li4uKSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFF1ZXVlIERpc2Nvbm5lY3QKKyAqCisgKiBEZXNjcmlwdGlvbjogQWRkIFNDQ0IgdG8gb3VyIGRpc2Nvbm5lY3QgYXJyYXkuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBxdWV1ZURpc2Nvbm5lY3QoUFNDQ0IgcF9zY2NiLCBVQ0hBUiBwX2NhcmQpCit7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKwljdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3Bfc2NjYi0+VGFyZ0lEXTsKKworCWlmKCgoQkxfQ2FyZFtwX2NhcmRdLmdsb2JhbEZsYWdzICYgRl9DT05MVU5fSU8pICYmCisJCSgoY3VyclRhcl9JbmZvLT5UYXJTdGF0dXMgJiBUQVJfVEFHX1FfTUFTSykgIT0gVEFHX1FfVFJZSU5HKSkpCisJeworCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW2N1cnJUYXJfSW5mby0+THVuRGlzY1FfSWR4W3Bfc2NjYi0+THVuXV0gPSBwX3NjY2I7CisJfQorCWVsc2UKKwl7CisJCWlmIChwX3NjY2ItPlNjY2JfdGFnKQorCQl7CisJCQlCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3Bfc2NjYi0+U2NjYl90YWddID0gcF9zY2NiOworCQkJc2NjYk1nclRibFtwX2NhcmRdW3Bfc2NjYi0+VGFyZ0lEXS5UYXJMVU5CdXN5WzBdID0gRkFMU0U7CisJCQlzY2NiTWdyVGJsW3BfY2FyZF1bcF9zY2NiLT5UYXJnSURdLlRhclRhZ1FfQ250Kys7CisJCX1lbHNlCisJCXsKKwkJCUJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbY3VyclRhcl9JbmZvLT5MdW5EaXNjUV9JZHhbMF1dID0gcF9zY2NiOworCQl9CisJfQorCUJMX0NhcmRbcF9jYXJkXS5jdXJyZW50U0NDQiA9IE5VTEw7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUXVldWUgRmx1c2ggU0NDQgorICoKKyAqIERlc2NyaXB0aW9uOiBGbHVzaCBhbGwgU0NDQidzIGJhY2sgdG8gdGhlIGhvc3QgZHJpdmVyIGZvciB0aGlzIHRhcmdldC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgIHF1ZXVlRmx1c2hTY2NiKFVDSEFSIHBfY2FyZCwgVUNIQVIgZXJyb3JfY29kZSkKK3sKKyAgIFVDSEFSIHF0YWcsdGhpc1Rhcmc7CisgICBQU0NDQiBjdXJyU0NDQjsKKyAgIFBTQ0NCTWdyX3Rhcl9pbmZvIGN1cnJUYXJfSW5mbzsKKworICAgY3VyclNDQ0IgPSBCTF9DYXJkW3BfY2FyZF0uY3VycmVudFNDQ0I7CisJaWYoY3VyclNDQ0IgIT0gTlVMTCkKKwl7CisJICAgdGhpc1RhcmcgPSAoVUNIQVIpY3VyclNDQ0ItPlRhcmdJRDsKKyAgIAljdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RoaXNUYXJnXTsKKworCSAgIGZvciAocXRhZz0wOyBxdGFnPFFVRVVFX0RFUFRIOyBxdGFnKyspIHsKKworCQkgIGlmIChCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3F0YWddICYmIAorCQkJCQkoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+VGFyZ0lEID09IHRoaXNUYXJnKSkKKwkJCSB7CisKKwkJCSBCTF9DYXJkW3BfY2FyZF0uZGlzY1FfVGJsW3F0YWddLT5Ib3N0U3RhdHVzID0gKFVDSEFSKWVycm9yX2NvZGU7CisJCQkKKwkJCSBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSwgcF9jYXJkKTsKKworCQkJIEJMX0NhcmRbcF9jYXJkXS5kaXNjUV9UYmxbcXRhZ10gPSBOVUxMOworCQkJIGN1cnJUYXJfSW5mby0+VGFyVGFnUV9DbnQtLTsKKworCQkJIH0KKwkJICB9CisJfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFF1ZXVlIEZsdXNoIFRhcmdldCBTQ0NCCisgKgorICogRGVzY3JpcHRpb246IEZsdXNoIGFsbCBTQ0NCJ3MgYmFjayB0byB0aGUgaG9zdCBkcml2ZXIgZm9yIHRoaXMgdGFyZ2V0LgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCAgcXVldWVGbHVzaFRhcmdTY2NiKFVDSEFSIHBfY2FyZCwgVUNIQVIgdGhpc1RhcmcsIFVDSEFSIGVycm9yX2NvZGUpCit7CisgICBVQ0hBUiBxdGFnOworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworCisgICBjdXJyVGFyX0luZm8gPSAmc2NjYk1nclRibFtwX2NhcmRdW3RoaXNUYXJnXTsKKworICAgZm9yIChxdGFnPTA7IHF0YWc8UVVFVUVfREVQVEg7IHF0YWcrKykgeworCisJICBpZiAoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSAmJiAKKwkJCQkoQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+VGFyZ0lEID09IHRoaXNUYXJnKSkKKwkJIHsKKworCQkgQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXS0+SG9zdFN0YXR1cyA9IChVQ0hBUillcnJvcl9jb2RlOworCisJCSBxdWV1ZUNtZENvbXBsZXRlKCZCTF9DYXJkW3BfY2FyZF0sQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSwgcF9jYXJkKTsKKworCQkgQkxfQ2FyZFtwX2NhcmRdLmRpc2NRX1RibFtxdGFnXSA9IE5VTEw7CisJCSBjdXJyVGFyX0luZm8tPlRhclRhZ1FfQ250LS07CisKKwkJIH0KKwkgIH0KKworfQorCisKKworCisKK3ZvaWQgcXVldWVBZGRTY2NiKFBTQ0NCIHBfU0NDQiwgVUNIQVIgcF9jYXJkKQoreworICAgUFNDQ0JNZ3JfdGFyX2luZm8gY3VyclRhcl9JbmZvOworICAgY3VyclRhcl9JbmZvID0gJnNjY2JNZ3JUYmxbcF9jYXJkXVtwX1NDQ0ItPlRhcmdJRF07CisKKyAgIHBfU0NDQi0+U2NjYl9mb3J3YXJkbGluayA9IE5VTEw7CisKKyAgIHBfU0NDQi0+U2NjYl9iYWNrbGluayA9IGN1cnJUYXJfSW5mby0+VGFyU2VsUV9UYWlsOworCisgICBpZiAoY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudCA9PSAwKSB7CisKKwkgIGN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkID0gcF9TQ0NCOworCSAgfQorCisgICBlbHNlIHsKKworCSAgY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwtPlNjY2JfZm9yd2FyZGxpbmsgPSBwX1NDQ0I7CisJICB9CisKKworICAgY3VyclRhcl9JbmZvLT5UYXJTZWxRX1RhaWwgPSBwX1NDQ0I7CisgICBjdXJyVGFyX0luZm8tPlRhclNlbFFfQ250Kys7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUXVldWUgRmluZCBTQ0NCCisgKgorICogRGVzY3JpcHRpb246IFNlYXJjaCB0aGUgdGFyZ2V0IHNlbGVjdCBRdWV1ZSBmb3IgdGhpcyBTQ0NCLCBhbmQKKyAqICAgICAgICAgICAgICByZW1vdmUgaXQgaWYgZm91bmQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQ0hBUiBxdWV1ZUZpbmRTY2NiKFBTQ0NCIHBfU0NDQiwgVUNIQVIgcF9jYXJkKQoreworICAgUFNDQ0IgcV9wdHI7CisgICBQU0NDQk1ncl90YXJfaW5mbyBjdXJyVGFyX0luZm87CisKKyAgIGN1cnJUYXJfSW5mbyA9ICZzY2NiTWdyVGJsW3BfY2FyZF1bcF9TQ0NCLT5UYXJnSURdOworCisgICBxX3B0ciA9IGN1cnJUYXJfSW5mby0+VGFyU2VsUV9IZWFkOworCisgICB3aGlsZShxX3B0ciAhPSBOVUxMKSB7CisKKwkgIGlmIChxX3B0ciA9PSBwX1NDQ0IpIHsKKworCisJCSBpZiAoY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQgPT0gcV9wdHIpIHsKKworCQkJY3VyclRhcl9JbmZvLT5UYXJTZWxRX0hlYWQgPSBxX3B0ci0+U2NjYl9mb3J3YXJkbGluazsKKwkJCX0KKworCQkgaWYgKGN1cnJUYXJfSW5mby0+VGFyU2VsUV9UYWlsID09IHFfcHRyKSB7CisKKwkJCWN1cnJUYXJfSW5mby0+VGFyU2VsUV9UYWlsID0gcV9wdHItPlNjY2JfYmFja2xpbms7CisJCQl9CisKKwkJIGlmIChxX3B0ci0+U2NjYl9mb3J3YXJkbGluayAhPSBOVUxMKSB7CisJCQlxX3B0ci0+U2NjYl9mb3J3YXJkbGluay0+U2NjYl9iYWNrbGluayA9IHFfcHRyLT5TY2NiX2JhY2tsaW5rOworCQkJfQorCisJCSBpZiAocV9wdHItPlNjY2JfYmFja2xpbmsgIT0gTlVMTCkgeworCQkJcV9wdHItPlNjY2JfYmFja2xpbmstPlNjY2JfZm9yd2FyZGxpbmsgPSBxX3B0ci0+U2NjYl9mb3J3YXJkbGluazsKKwkJCX0KKworCQkgY3VyclRhcl9JbmZvLT5UYXJTZWxRX0NudC0tOworCisJCSByZXR1cm4oVFJVRSk7CisJCSB9CisKKwkgIGVsc2UgeworCQkgcV9wdHIgPSBxX3B0ci0+U2NjYl9mb3J3YXJkbGluazsKKwkJIH0KKwkgIH0KKworCisgICByZXR1cm4oRkFMU0UpOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogVXRpbGl0eSBVcGRhdGUgUmVzaWR1YWwgQ291bnQKKyAqCisgKiBEZXNjcmlwdGlvbjogVXBkYXRlIHRoZSBYZmVyQ250IHRvIHRoZSByZW1haW5pbmcgYnl0ZSBjb3VudC4KKyAqICAgICAgICAgICAgICBJZiB3ZSB0cmFuc2ZlcnJlZCBhbGwgdGhlIGRhdGEgdGhlbiBqdXN0IHdyaXRlIHplcm8uCisgKiAgICAgICAgICAgICAgSWYgTm9uLVNHIHRyYW5zZmVyIHRoZW4gcmVwb3J0IFRvdGFsIENudCAtIEFjdHVhbCBUcmFuc2ZlcgorICogICAgICAgICAgICAgIENudC4gIEZvciBTRyB0cmFuc2ZlcnMgYWRkIHRoZSBjb3VudCBmaWVsZHMgb2YgYWxsCisgKiAgICAgICAgICAgICAgcmVtYWluaW5nIFNHIGVsZW1lbnRzLCBhcyB3ZWxsIGFzIGFueSBwYXJ0aWFsIHJlbWFpbmluZworICogICAgICAgICAgICAgIGVsZW1lbnQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICB1dGlsVXBkYXRlUmVzaWR1YWwoUFNDQ0IgcF9TQ0NCKQoreworICAgVUxPTkcgcGFydGlhbF9jbnQ7CisgICBVSU5UICBzZ19pbmRleDsKKyNpZiBkZWZpbmVkKENPTVBJTEVSXzE2X0JJVCkgJiYgIWRlZmluZWQoRE9TKQorICAgVUxPTkcgZmFyICpzZ19wdHI7CisjZWxzZQorICAgVUxPTkcgKnNnX3B0cjsKKyNlbmRpZgorCisgICBpZiAocF9TQ0NCLT5TY2NiX1hmZXJTdGF0ZSAmIEZfQUxMX1hGRVJSRUQpIHsKKworCSAgcF9TQ0NCLT5EYXRhTGVuZ3RoID0gMHgwMDAwOworCSAgfQorCisgICBlbHNlIGlmIChwX1NDQ0ItPlNjY2JfWGZlclN0YXRlICYgRl9TR19YRkVSKSB7CisKKwkJIHBhcnRpYWxfY250ID0gMHgwMDAwOworCisJCSBzZ19pbmRleCA9IHBfU0NDQi0+U2NjYl9zZ3NlZzsKKworI2lmIGRlZmluZWQoQ09NUElMRVJfMTZfQklUKSAmJiAhZGVmaW5lZChET1MpCisJCSBzZ19wdHIgPSAoVUxPTkcgZmFyICopcF9TQ0NCLT5EYXRhUG9pbnRlcjsKKyNlbHNlCisJCSBzZ19wdHIgPSAoVUxPTkcgKilwX1NDQ0ItPkRhdGFQb2ludGVyOworI2VuZGlmCisKKwkJIGlmIChwX1NDQ0ItPlNjY2JfU0dvZmZzZXQpIHsKKworCQkJcGFydGlhbF9jbnQgPSBwX1NDQ0ItPlNjY2JfU0dvZmZzZXQ7CisJCQlzZ19pbmRleCsrOworCQkJfQorCisJCSB3aGlsZSAoICgoVUxPTkcpc2dfaW5kZXggKiAoVUxPTkcpU0dfRUxFTUVOVF9TSVpFKSA8CisJCQlwX1NDQ0ItPkRhdGFMZW5ndGggKSB7CisKKwkJCXBhcnRpYWxfY250ICs9ICooc2dfcHRyKyhzZ19pbmRleCAqIDIpKTsKKwkJCXNnX2luZGV4Kys7CisJCQl9CisKKwkJIHBfU0NDQi0+RGF0YUxlbmd0aCA9IHBhcnRpYWxfY250OworCQkgfQorCisJICBlbHNlIHsKKworCQkgcF9TQ0NCLT5EYXRhTGVuZ3RoIC09IHBfU0NDQi0+U2NjYl9BVEM7CisJCSB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogV2FpdCAxIFNlY29uZAorICoKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciAxIHNlY29uZC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgV2FpdDFTZWNvbmQoVVNIT1JUIHBfcG9ydCkKKyNlbHNlCit2b2lkIFdhaXQxU2Vjb25kKFVMT05HIHBfcG9ydCkKKyNlbmRpZgoreworICAgVUNIQVIgaTsKKworICAgZm9yKGk9MDsgaSA8IDQ7IGkrKykgeworCisJICBXYWl0KHBfcG9ydCwgVE9fMjUwbXMpOworCisJICBpZiAoKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2ljdHJsXzApICYgU0NTSV9SU1QpKQorCQkgYnJlYWs7CisKKwkgIGlmKChSRFdfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpKSAmIFNDQU1fU0VMKSkKKwkJIGJyZWFrOworCSAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFdhaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogV2FpdCB0aGUgZGVzaXJlZCBkZWxheS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgV2FpdChVU0hPUlQgcF9wb3J0LCBVQ0hBUiBwX2RlbGF5KQorI2Vsc2UKK3ZvaWQgV2FpdChVTE9ORyBwX3BvcnQsIFVDSEFSIHBfZGVsYXkpCisjZW5kaWYKK3sKKyAgIFVDSEFSIG9sZF90aW1lcjsKKyAgIFVDSEFSIGdyZWVuX2ZsYWc7CisKKyAgIG9sZF90aW1lciA9IFJEX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQpOworCisgICBncmVlbl9mbGFnPVJEX0hBUlBPT04ocF9wb3J0K2hwX2Nsa2N0cmxfMCk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsIENMS0NUUkxfREVGQVVMVCk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQscF9kZWxheSk7CisgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLCBUSU1FT1VUKTsKKyAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50ZW5hKSwgKGRlZmF1bHRfaW50ZW5hICYgflRJTUVPVVQpKTsKKworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wLAorCSAgKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BvcnRjdHJsXzApIHwgU1RBUlRfVE8pKTsKKworICAgd2hpbGUgKCEoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBUSU1FT1VUKSkgeworCisJICBpZiAoKFJEX0hBUlBPT04ocF9wb3J0K2hwX3Njc2ljdHJsXzApICYgU0NTSV9SU1QpKQorCQkgYnJlYWs7CisKKwkgIGlmICgoUkRXX0hBUlBPT04oKHBfcG9ydCtocF9pbnRzdGF0KSkgJiBTQ0FNX1NFTCkpCisJCSBicmVhazsKKwkgIH0KKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfcG9ydGN0cmxfMCwKKwkgIChSRF9IQVJQT09OKHBfcG9ydCtocF9wb3J0Y3RybF8wKSAmIH5TVEFSVF9UTykpOworCisgICBXUldfSEFSUE9PTigocF9wb3J0K2hwX2ludHN0YXQpLCBUSU1FT1VUKTsKKyAgIFdSV19IQVJQT09OKChwX3BvcnQraHBfaW50ZW5hKSwgZGVmYXVsdF9pbnRlbmEpOworCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9jbGtjdHJsXzAsZ3JlZW5fZmxhZyk7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX3NlbHRpbWVvdXQsb2xkX3RpbWVyKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZ1bmN0aW9uOiBFbmFibGUvRGlzYWJsZSBXcml0ZSB0byBFRVBST00KKyAqCisgKiBEZXNjcmlwdGlvbjogVGhlIEVFUFJPTSBtdXN0IGZpcnN0IGJlIGVuYWJsZWQgZm9yIHdyaXRlcworICogICAgICAgICAgICAgIEEgdG90YWwgb2YgOSBjbG9ja3MgYXJlIG5lZWRlZC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgdXRpbEVFV3JpdGVPbk9mZihVU0hPUlQgcF9wb3J0LFVDSEFSIHBfbW9kZSkKKyNlbHNlCit2b2lkIHV0aWxFRVdyaXRlT25PZmYoVUxPTkcgcF9wb3J0LFVDSEFSIHBfbW9kZSkKKyNlbmRpZgoreworICAgVUNIQVIgZWVfdmFsdWU7CisKKyAgIGVlX3ZhbHVlID0gKFVDSEFSKShSRF9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsKSAmIChFWFRfQVJCX0FDSyB8IFNDU0lfVEVSTV9FTkFfSCkpOworCisgICBpZiAocF9tb2RlKQorCisJICB1dGlsRUVTZW5kQ21kQWRkcihwX3BvcnQsIEVXRU4sIEVXRU5fQUREUik7CisKKyAgIGVsc2UKKworCisJICB1dGlsRUVTZW5kQ21kQWRkcihwX3BvcnQsIEVXRFMsIEVXRFNfQUREUik7CisKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIChlZV92YWx1ZSB8IFNFRV9NUykpOyAvKlR1cm4gb2ZmIENTICovCisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7ICAgICAgIC8qVHVybiBvZmYgTWFzdGVyIFNlbGVjdCAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFdyaXRlIEVFUFJPTQorICoKKyAqIERlc2NyaXB0aW9uOiBXcml0ZSBhIHdvcmQgdG8gdGhlIEVFUFJPTSBhdCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgYWRkcmVzcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgdXRpbEVFV3JpdGUoVVNIT1JUIHBfcG9ydCwgVVNIT1JUIGVlX2RhdGEsIFVTSE9SVCBlZV9hZGRyKQorI2Vsc2UKK3ZvaWQgdXRpbEVFV3JpdGUoVUxPTkcgcF9wb3J0LCBVU0hPUlQgZWVfZGF0YSwgVVNIT1JUIGVlX2FkZHIpCisjZW5kaWYKK3sKKworICAgVUNIQVIgZWVfdmFsdWU7CisgICBVU0hPUlQgaTsKKworICAgZWVfdmFsdWUgPSAoVUNIQVIpKChSRF9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsKSAmIChFWFRfQVJCX0FDSyB8IFNDU0lfVEVSTV9FTkFfSCkpfAorCQkgICAoU0VFX01TIHwgU0VFX0NTKSk7CisKKworCisgICB1dGlsRUVTZW5kQ21kQWRkcihwX3BvcnQsIEVFX1dSSVRFLCBlZV9hZGRyKTsKKworCisgICBlZV92YWx1ZSB8PSAoU0VFX01TICsgU0VFX0NTKTsKKworICAgZm9yKGkgPSAweDgwMDA7IGkgIT0gMDsgaT4+PTEpIHsKKworCSAgaWYgKGkgJiBlZV9kYXRhKQorCSBlZV92YWx1ZSB8PSBTRUVfRE87CisJICBlbHNlCisJIGVlX3ZhbHVlICY9IH5TRUVfRE87CisKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIGVlX3ZhbHVlIHw9IFNFRV9DTEs7ICAgICAgICAgIC8qIENsb2NrICBkYXRhISAqLworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgZWVfdmFsdWUgJj0gflNFRV9DTEs7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICB9CisgICBlZV92YWx1ZSAmPSAoRVhUX0FSQl9BQ0sgfCBTQ1NJX1RFUk1fRU5BX0gpOworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgKGVlX3ZhbHVlIHwgU0VFX01TKSk7CisKKyAgIFdhaXQocF9wb3J0LCBUT18xMG1zKTsKKworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgKGVlX3ZhbHVlIHwgU0VFX01TIHwgU0VFX0NTKSk7IC8qIFNldCBDUyB0byBFRVBST00gKi8KKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIChlZV92YWx1ZSB8IFNFRV9NUykpOyAgICAgICAvKiBUdXJuIG9mZiBDUyAqLworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOyAgICAgICAvKiBUdXJuIG9mZiBNYXN0ZXIgU2VsZWN0ICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb246IFJlYWQgRUVQUk9NCisgKgorICogRGVzY3JpcHRpb246IFJlYWQgYSB3b3JkIGZyb20gdGhlIEVFUFJPTSBhdCB0aGUgZGVzaXJlZAorICogICAgICAgICAgICAgIGFkZHJlc3MuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVU0hPUlQgdXRpbEVFUmVhZChVU0hPUlQgcF9wb3J0LCBVU0hPUlQgZWVfYWRkcikKKyNlbHNlCitVU0hPUlQgdXRpbEVFUmVhZChVTE9ORyBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKQorI2VuZGlmCit7CisgICBVU0hPUlQgaSwgZWVfZGF0YTEsIGVlX2RhdGEyOworCisJaSA9IDA7CisJZWVfZGF0YTEgPSB1dGlsRUVSZWFkT3JnKHBfcG9ydCwgZWVfYWRkcik7CisJZG8KKwl7CisJCWVlX2RhdGEyID0gdXRpbEVFUmVhZE9yZyhwX3BvcnQsIGVlX2FkZHIpOworCisJCWlmKGVlX2RhdGExID09IGVlX2RhdGEyKQorCQkJcmV0dXJuKGVlX2RhdGExKTsKKworCQllZV9kYXRhMSA9IGVlX2RhdGEyOworCQlpKys7CisKKwl9d2hpbGUoaSA8IDQpOworCisJcmV0dXJuKGVlX2RhdGExKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogUmVhZCBFRVBST00gT3JpZ2luYWwgCisgKgorICogRGVzY3JpcHRpb246IFJlYWQgYSB3b3JkIGZyb20gdGhlIEVFUFJPTSBhdCB0aGUgZGVzaXJlZAorICogICAgICAgICAgICAgIGFkZHJlc3MuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChET1MpCitVU0hPUlQgdXRpbEVFUmVhZE9yZyhVU0hPUlQgcF9wb3J0LCBVU0hPUlQgZWVfYWRkcikKKyNlbHNlCitVU0hPUlQgdXRpbEVFUmVhZE9yZyhVTE9ORyBwX3BvcnQsIFVTSE9SVCBlZV9hZGRyKQorI2VuZGlmCit7CisKKyAgIFVDSEFSIGVlX3ZhbHVlOworICAgVVNIT1JUIGksIGVlX2RhdGE7CisKKyAgIGVlX3ZhbHVlID0gKFVDSEFSKSgoUkRfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCkgJiAoRVhUX0FSQl9BQ0sgfCBTQ1NJX1RFUk1fRU5BX0gpKXwKKwkJICAgKFNFRV9NUyB8IFNFRV9DUykpOworCisKKyAgIHV0aWxFRVNlbmRDbWRBZGRyKHBfcG9ydCwgRUVfUkVBRCwgZWVfYWRkcik7CisKKworICAgZWVfdmFsdWUgfD0gKFNFRV9NUyArIFNFRV9DUyk7CisgICBlZV9kYXRhID0gMDsKKworICAgZm9yKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKKworCSAgZWVfdmFsdWUgfD0gU0VFX0NMSzsgICAgICAgICAgLyogQ2xvY2sgIGRhdGEhICovCisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBlZV92YWx1ZSAmPSB+U0VFX0NMSzsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKworCSAgZWVfZGF0YSA8PD0gMTsKKworCSAgaWYgKFJEX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwpICYgU0VFX0RJKQorCQkgZWVfZGF0YSB8PSAxOworCSAgfQorCisgICBlZV92YWx1ZSAmPSB+KFNFRV9NUyArIFNFRV9DUyk7CisgICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCAoZWVfdmFsdWUgfCBTRUVfTVMpKTsgLypUdXJuIG9mZiBDUyAqLworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOyAgIC8qVHVybiBvZmYgTWFzdGVyIFNlbGVjdCAqLworCisgICByZXR1cm4oZWVfZGF0YSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGdW5jdGlvbjogU2VuZCBFRSBjb21tYW5kIGFuZCBBZGRyZXNzIHRvIHRoZSBFRVBST00KKyAqCisgKiBEZXNjcmlwdGlvbjogVHJhbnNmZXJzIHRoZSBjb3JyZWN0IGNvbW1hbmQgYW5kIHNlbmRzIHRoZSBhZGRyZXNzCisgKiAgICAgICAgICAgICAgdG8gdGhlIGVlcHJvbS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKERPUykKK3ZvaWQgdXRpbEVFU2VuZENtZEFkZHIoVVNIT1JUIHBfcG9ydCwgVUNIQVIgZWVfY21kLCBVU0hPUlQgZWVfYWRkcikKKyNlbHNlCit2b2lkIHV0aWxFRVNlbmRDbWRBZGRyKFVMT05HIHBfcG9ydCwgVUNIQVIgZWVfY21kLCBVU0hPUlQgZWVfYWRkcikKKyNlbmRpZgoreworICAgVUNIQVIgZWVfdmFsdWU7CisgICBVQ0hBUiBuYXJyb3dfZmxnOworCisgICBVU0hPUlQgaTsKKworCisgICBuYXJyb3dfZmxnPSAoVUNIQVIpKFJEX0hBUlBPT04ocF9wb3J0K2hwX3BhZ2VfY3RybCkgJiBOQVJST1dfU0NTSV9DQVJEKTsKKworCisgICBlZV92YWx1ZSA9IFNFRV9NUzsKKyAgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKworICAgZWVfdmFsdWUgfD0gU0VFX0NTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IENTIHRvIEVFUFJPTSAqLworICAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCisKKyAgIGZvcihpID0gMHgwNDsgaSAhPSAwOyBpPj49MSkgeworCisJICBpZiAoaSAmIGVlX2NtZCkKKwkJIGVlX3ZhbHVlIHw9IFNFRV9ETzsKKwkgIGVsc2UKKwkJIGVlX3ZhbHVlICY9IH5TRUVfRE87CisKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIGVlX3ZhbHVlIHw9IFNFRV9DTEs7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsb2NrICBkYXRhISAqLworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgZWVfdmFsdWUgJj0gflNFRV9DTEs7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICB9CisKKworICAgaWYgKG5hcnJvd19mbGcpCisJICBpID0gMHgwMDgwOworCisgICBlbHNlCisJICBpID0gMHgwMjAwOworCisKKyAgIHdoaWxlIChpICE9IDApIHsKKworCSAgaWYgKGkgJiBlZV9hZGRyKQorCQkgZWVfdmFsdWUgfD0gU0VFX0RPOworCSAgZWxzZQorCQkgZWVfdmFsdWUgJj0gflNFRV9ETzsKKworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgV1JfSEFSUE9PTihwX3BvcnQraHBfZWVfY3RybCwgZWVfdmFsdWUpOworCSAgZWVfdmFsdWUgfD0gU0VFX0NMSzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xvY2sgIGRhdGEhICovCisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBXUl9IQVJQT09OKHBfcG9ydCtocF9lZV9jdHJsLCBlZV92YWx1ZSk7CisJICBlZV92YWx1ZSAmPSB+U0VFX0NMSzsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKwkgIFdSX0hBUlBPT04ocF9wb3J0K2hwX2VlX2N0cmwsIGVlX3ZhbHVlKTsKKworCSAgaSA+Pj0gMTsKKwkgIH0KK30KKworVVNIT1JUIENhbGNDcmMxNihVQ0hBUiBidWZmZXJbXSkKK3sKKyAgIFVTSE9SVCBjcmM9MDsKKwlpbnQgaSxqOworICAgVVNIT1JUIGNoOworICAgZm9yIChpPTA7IGkgPCBJRF9TVFJJTkdfTEVOR1RIOyBpKyspCisgICB7CisgICAgICBjaCA9IChVU0hPUlQpIGJ1ZmZlcltpXTsKKwkgICBmb3Ioaj0wOyBqIDwgODsgaisrKQorCSAgIHsKKwkJICAgaWYgKChjcmMgXiBjaCkgJiAxKQorICAgICAgICAgICAgY3JjID0gKGNyYyA+PiAxKSBeIENSQ01BU0s7CisJCSAgIGVsc2UKKyAgICAgICAgICAgIGNyYyA+Pj0gMTsKKwkJICAgY2ggPj49IDE7CisJICAgfQorICAgfQorCXJldHVybihjcmMpOworfQorCitVQ0hBUiBDYWxjTHJjKFVDSEFSIGJ1ZmZlcltdKQoreworCWludCBpOworCVVDSEFSIGxyYzsKKwlscmMgPSAwOworCWZvcihpID0gMDsgaSA8IElEX1NUUklOR19MRU5HVEg7IGkrKykKKwkJbHJjIF49IGJ1ZmZlcltpXTsKKwlyZXR1cm4obHJjKTsKK30KKworCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgaW5saW5lIGRlZmluaXRpb25zIGF2b2lkIHR5cGUgY29uZmxpY3RzLgorKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitGbGFzaFBvaW50X19Qcm9iZUhvc3RBZGFwdGVyKHN0cnVjdCBGbGFzaFBvaW50X0luZm8gKkZsYXNoUG9pbnRJbmZvKQoreworICByZXR1cm4gRmxhc2hQb2ludF9Qcm9iZUhvc3RBZGFwdGVyKChQU0NDQk1HUl9JTkZPKSBGbGFzaFBvaW50SW5mbyk7Cit9CisKKworc3RhdGljIGlubGluZSBGbGFzaFBvaW50X0NhcmRIYW5kbGVfVAorRmxhc2hQb2ludF9fSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBGbGFzaFBvaW50X0luZm8gKkZsYXNoUG9pbnRJbmZvKQoreworICByZXR1cm4gRmxhc2hQb2ludF9IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIoKFBTQ0NCTUdSX0lORk8pIEZsYXNoUG9pbnRJbmZvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitGbGFzaFBvaW50X19SZWxlYXNlSG9zdEFkYXB0ZXIoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QgQ2FyZEhhbmRsZSkKK3sKKyAgRmxhc2hQb2ludF9SZWxlYXNlSG9zdEFkYXB0ZXIoQ2FyZEhhbmRsZSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitGbGFzaFBvaW50X19TdGFydENDQihGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCBDYXJkSGFuZGxlLCBzdHJ1Y3QgQnVzTG9naWNfQ0NCICpDQ0IpCit7CisgIEZsYXNoUG9pbnRfU3RhcnRDQ0IoQ2FyZEhhbmRsZSwgKFBTQ0NCKSBDQ0IpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorRmxhc2hQb2ludF9fQWJvcnRDQ0IoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QgQ2FyZEhhbmRsZSwgc3RydWN0IEJ1c0xvZ2ljX0NDQiAqQ0NCKQoreworICBGbGFzaFBvaW50X0Fib3J0Q0NCKENhcmRIYW5kbGUsIChQU0NDQikgQ0NCKTsKK30KKworCitzdGF0aWMgaW5saW5lIGJvb2xlYW4KK0ZsYXNoUG9pbnRfX0ludGVycnVwdFBlbmRpbmcoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QgQ2FyZEhhbmRsZSkKK3sKKyAgcmV0dXJuIEZsYXNoUG9pbnRfSW50ZXJydXB0UGVuZGluZyhDYXJkSGFuZGxlKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorRmxhc2hQb2ludF9fSGFuZGxlSW50ZXJydXB0KEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9UIENhcmRIYW5kbGUpCit7CisgIHJldHVybiBGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdChDYXJkSGFuZGxlKTsKK30KKworCisjZGVmaW5lIEZsYXNoUG9pbnRfUHJvYmVIb3N0QWRhcHRlcgkgICAgRmxhc2hQb2ludF9fUHJvYmVIb3N0QWRhcHRlcgorI2RlZmluZSBGbGFzaFBvaW50X0hhcmR3YXJlUmVzZXRIb3N0QWRhcHRlciBGbGFzaFBvaW50X19IYXJkd2FyZVJlc2V0SG9zdEFkYXB0ZXIKKyNkZWZpbmUgRmxhc2hQb2ludF9SZWxlYXNlSG9zdEFkYXB0ZXIJICAgIEZsYXNoUG9pbnRfX1JlbGVhc2VIb3N0QWRhcHRlcgorI2RlZmluZSBGbGFzaFBvaW50X1N0YXJ0Q0NCCQkgICAgRmxhc2hQb2ludF9fU3RhcnRDQ0IKKyNkZWZpbmUgRmxhc2hQb2ludF9BYm9ydENDQgkJICAgIEZsYXNoUG9pbnRfX0Fib3J0Q0NCCisjZGVmaW5lIEZsYXNoUG9pbnRfSW50ZXJydXB0UGVuZGluZwkgICAgRmxhc2hQb2ludF9fSW50ZXJydXB0UGVuZGluZworI2RlZmluZSBGbGFzaFBvaW50X0hhbmRsZUludGVycnVwdAkgICAgRmxhc2hQb2ludF9fSGFuZGxlSW50ZXJydXB0CisKKworLyoKKyAgRmxhc2hQb2ludF9JbnF1aXJlVGFyZ2V0SW5mbyByZXR1cm5zIHRoZSBTeW5jaHJvbm91cyBQZXJpb2QsIFN5bmNocm9ub3VzCisgIE9mZnNldCwgYW5kIFdpZGUgVHJhbnNmZXJzIEFjdGl2ZSBpbmZvcm1hdGlvbiBmb3IgVGFyZ2V0SUQgb24gQ2FyZEhhbmRsZS4KKyovCisKK3ZvaWQgRmxhc2hQb2ludF9JbnF1aXJlVGFyZ2V0SW5mbyhGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCBDYXJkSGFuZGxlLAorCQkJCSAgaW50IFRhcmdldElELAorCQkJCSAgdW5zaWduZWQgY2hhciAqU3luY2hyb25vdXNQZXJpb2QsCisJCQkJICB1bnNpZ25lZCBjaGFyICpTeW5jaHJvbm91c09mZnNldCwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKldpZGVUcmFuc2ZlcnNBY3RpdmUpCit7CisgIFNDQ0JNR1JfVEFSX0lORk8gKlRhcmdldEluZm8gPQorICAgICZzY2NiTWdyVGJsWygoU0NDQkNBUkQgKilDYXJkSGFuZGxlKS0+Y2FyZEluZGV4XVtUYXJnZXRJRF07CisgIGlmICgoVGFyZ2V0SW5mby0+VGFyU3luY0N0cmwgJiBTWU5DX09GRlNFVCkgPiAwKQorICAgIHsKKyAgICAgICpTeW5jaHJvbm91c1BlcmlvZCA9IDUgKiAoKFRhcmdldEluZm8tPlRhclN5bmNDdHJsID4+IDUpICsgMSk7CisgICAgICAqU3luY2hyb25vdXNPZmZzZXQgPSBUYXJnZXRJbmZvLT5UYXJTeW5jQ3RybCAmIFNZTkNfT0ZGU0VUOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpTeW5jaHJvbm91c1BlcmlvZCA9IDA7CisgICAgICAqU3luY2hyb25vdXNPZmZzZXQgPSAwOworICAgIH0KKyAgKldpZGVUcmFuc2ZlcnNBY3RpdmUgPSAoVGFyZ2V0SW5mby0+VGFyU3luY0N0cmwgJiBOQVJST1dfU0NTSSA/IDAgOiAxKTsKK30KKworCisjZWxzZSAgLyogQ09ORklHX1NDU0lfT01JVF9GTEFTSFBPSU5UICovCisKKworLyoKKyAgRGVmaW5lIHByb3RvdHlwZXMgZm9yIHRoZSBGbGFzaFBvaW50IFNDQ0IgTWFuYWdlciBGdW5jdGlvbnMuCisqLworCitleHRlcm4gdW5zaWduZWQgY2hhciBGbGFzaFBvaW50X1Byb2JlSG9zdEFkYXB0ZXIoc3RydWN0IEZsYXNoUG9pbnRfSW5mbyAqKTsKK2V4dGVybiBGbGFzaFBvaW50X0NhcmRIYW5kbGVfVAorICAgICAgIEZsYXNoUG9pbnRfSGFyZHdhcmVSZXNldEhvc3RBZGFwdGVyKHN0cnVjdCBGbGFzaFBvaW50X0luZm8gKik7CitleHRlcm4gdm9pZCBGbGFzaFBvaW50X1N0YXJ0Q0NCKEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9ULCBzdHJ1Y3QgQnVzTG9naWNfQ0NCICopOworZXh0ZXJuIGludCBGbGFzaFBvaW50X0Fib3J0Q0NCKEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9ULCBzdHJ1Y3QgQnVzTG9naWNfQ0NCICopOworZXh0ZXJuIGJvb2xlYW4gRmxhc2hQb2ludF9JbnRlcnJ1cHRQZW5kaW5nKEZsYXNoUG9pbnRfQ2FyZEhhbmRsZV9UKTsKK2V4dGVybiBpbnQgRmxhc2hQb2ludF9IYW5kbGVJbnRlcnJ1cHQoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QpOworZXh0ZXJuIHZvaWQgRmxhc2hQb2ludF9SZWxlYXNlSG9zdEFkYXB0ZXIoRmxhc2hQb2ludF9DYXJkSGFuZGxlX1QpOworZXh0ZXJuIHZvaWQgRmxhc2hQb2ludF9JbnF1aXJlVGFyZ2V0SW5mbyhGbGFzaFBvaW50X0NhcmRIYW5kbGVfVCwKKwkJCQkJIGludCwgdW5zaWduZWQgY2hhciAqLAorCQkJCQkgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOworCisKKyNlbmRpZiAvKiBDT05GSUdfU0NTSV9PTUlUX0ZMQVNIUE9JTlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYjMyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0wLDAgKzEsMTgwMiBAQAorbWVudSAiU0NTSSBkZXZpY2Ugc3VwcG9ydCIKKworY29uZmlnIFNDU0kKKwl0cmlzdGF0ZSAiU0NTSSBkZXZpY2Ugc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugd2FudCB0byB1c2UgYSBTQ1NJIGhhcmQgZGlzaywgU0NTSSB0YXBlIGRyaXZlLCBTQ1NJIENELVJPTSBvcgorCSAgYW55IG90aGVyIFNDU0kgZGV2aWNlIHVuZGVyIExpbnV4LCBzYXkgWSBhbmQgbWFrZSBzdXJlIHRoYXQgeW91IGtub3cKKwkgIHRoZSBuYW1lIG9mIHlvdXIgU0NTSSBob3N0IGFkYXB0ZXIgKHRoZSBjYXJkIGluc2lkZSB5b3VyIGNvbXB1dGVyCisJICB0aGF0ICJzcGVha3MiIHRoZSBTQ1NJIHByb3RvY29sLCBhbHNvIGNhbGxlZCBTQ1NJIGNvbnRyb2xsZXIpLAorCSAgYmVjYXVzZSB5b3Ugd2lsbCBiZSBhc2tlZCBmb3IgaXQuCisKKwkgIFlvdSBhbHNvIG5lZWQgdG8gc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIGRldmljZSB3aGljaCBzcGVha3MKKwkgIHRoZSBTQ1NJIHByb3RvY29sLiAgRXhhbXBsZXMgb2YgdGhpcyBpbmNsdWRlIHRoZSBwYXJhbGxlbCBwb3J0CisJICB2ZXJzaW9uIG9mIHRoZSBJT01FR0EgWklQIGRyaXZlLCBVU0Igc3RvcmFnZSBkZXZpY2VzLCBGaWJyZQorCSAgQ2hhbm5lbCwgRmlyZVdpcmUgc3RvcmFnZSBhbmQgdGhlIElERS1TQ1NJIGVtdWxhdGlvbiBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9zY3NpLnR4dD4uCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjc2lfbW9kLgorCisJICBIb3dldmVyLCBkbyBub3QgY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbQorCSAgKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGlzIGxvY2F0ZWQgb24gYSBTQ1NJIGRldmljZS4KKworY29uZmlnIFNDU0lfUFJPQ19GUworCWJvb2wgImxlZ2FjeSAvcHJvYy9zY3NpLyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSSAmJiBQUk9DX0ZTCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgdmFyaW91cyBmaWxlcyBpbgorCSAgL3Byb2Mvc2NzaS4gIEluIExpbnV4IDIuNiB0aGlzIGhhcyBiZWVuIHN1cGVyY2VlZGVkIGJ5CisJICBmaWxlcyBpbiBzeXNmcyBidXQgbWFueSBsZWdhY3kgYXBwbGljYXRpb25zIHJlbHkgb24gdGhpcy4KKworCSAgSWYgdW51c3VyZSBzYXkgWS4KKworY29tbWVudCAiU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkiCisJZGVwZW5kcyBvbiBTQ1NJCisKK2NvbmZpZyBCTEtfREVWX1NECisJdHJpc3RhdGUgIlNDU0kgZGlzayBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSB3YW50IHRvIHVzZSBTQ1NJIGhhcmQgZGlza3MsIEZpYnJlIENoYW5uZWwgZGlza3MsCisJICBVU0Igc3RvcmFnZSBvciB0aGUgU0NTSSBvciBwYXJhbGxlbCBwb3J0IHZlcnNpb24gb2YKKwkgIHRoZSBJT01FR0EgWklQIGRyaXZlLCBzYXkgWSBhbmQgcmVhZCB0aGUgU0NTSS1IT1dUTywKKwkgIHRoZSBEaXNrLUhPV1RPIGFuZCB0aGUgTXVsdGktRGlzay1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFRoaXMgaXMgTk9UIGZvciBTQ1NJCisJICBDRC1ST01zLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc2NzaS50eHQ+LgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZF9tb2QuCisKKwkgIERvIG5vdCBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlIGlmIHlvdXIgcm9vdCBmaWxlIHN5c3RlbQorCSAgKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGlzIGxvY2F0ZWQgb24gYSBTQ1NJIGRpc2suCisJICBJbiB0aGlzIGNhc2UsIGRvIG5vdCBjb21waWxlIHRoZSBkcml2ZXIgZm9yIHlvdXIgU0NTSSBob3N0IGFkYXB0ZXIKKwkgIChiZWxvdykgYXMgYSBtb2R1bGUgZWl0aGVyLgorCitjb25maWcgQ0hSX0RFVl9TVAorCXRyaXN0YXRlICJTQ1NJIHRhcGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugd2FudCB0byB1c2UgYSBTQ1NJIHRhcGUgZHJpdmUgdW5kZXIgTGludXgsIHNheSBZIGFuZCByZWFkIHRoZQorCSAgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dD4gaW4gdGhlIGtlcm5lbCBzb3VyY2UuICBUaGlzIGlzIE5PVAorCSAgZm9yIFNDU0kgQ0QtUk9Ncy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Njc2kudHh0Pi4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzdC4KKworY29uZmlnIENIUl9ERVZfT1NTVAorCXRyaXN0YXRlICJTQ1NJIE9uU3RyZWFtIFNDLXgwIHRhcGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGUgT25TdHJlYW0gU0MteDAgU0NTSSB0YXBlIGRyaXZlcyBjYW4gbm90IGJlIGRyaXZlbiBieSB0aGUKKwkgIHN0YW5kYXJkIHN0IGRyaXZlciwgYnV0IGluc3RlYWQgbmVlZCB0aGlzIHNwZWNpYWwgb3NzdCBkcml2ZXIgYW5kCisJICB1c2UgdGhlICAvZGV2L29zc3RYIGNoYXIgZGV2aWNlIG5vZGVzIChtYWpvciAyMDYpLiAgVmlhIHVzYi1zdG9yYWdlCisJICBhbmQgaWRlLXNjc2ksIHlvdSBtYXkgYmUgYWJsZSB0byBkcml2ZSB0aGUgVVNCLXgwIGFuZCBESS14MCBkcml2ZXMKKwkgIGFzIHdlbGwuICBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbyBhIHNlY29uZCBnZW5lcmF0aW9uIG9mIE9uU3RyZWFtCisJICB0YXBlIGRyaXZlcyAoQURSLXgwKSB0aGF0IHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTQ1NJLTIgY29tbWFuZHMgZm9yCisJICB0YXBlcyAoUUlDLTE1NykgYW5kIGNhbiBiZSBkcml2ZW4gYnkgdGhlIHN0YW5kYXJkIGRyaXZlciBzdC4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCB5b3UgbWF5IGhhdmUgYSBsb29rIGF0IHRoZSBTQ1NJLUhPV1RPCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+ICBhbmQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9vc3N0LnR4dD4gIGluIHRoZSBrZXJuZWwgc291cmNlLgorCSAgTW9yZSBpbmZvIG9uIHRoZSBPblN0cmVhbSBkcml2ZXIgbWF5IGJlIGZvdW5kIG9uCisJICA8aHR0cDovL2xpbnV4MS5vbnN0cmVhbS5ubC90ZXN0Lz4KKwkgIFBsZWFzZSBhbHNvIGhhdmUgYSBsb29rIGF0IHRoZSBzdGFuZGFyZCBzdCBkb2N1LCBhcyBtb3N0IG9mIGl0CisJICBhcHBsaWVzIHRvIG9zc3QgYXMgd2VsbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Njc2kudHh0Pi4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvc3N0LgorCitjb25maWcgQkxLX0RFVl9TUgorCXRyaXN0YXRlICJTQ1NJIENEUk9NIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgU0NTSSBvciBGaXJlV2lyZSBDRC1ST00gdW5kZXIgTGludXgsCisJICBzYXkgWSBhbmQgcmVhZCB0aGUgU0NTSS1IT1dUTyBhbmQgdGhlIENEUk9NLUhPV1RPIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBBbHNvIG1ha2Ugc3VyZSB0byBzYXkKKwkgIFkgb3IgTSB0byAiSVNPIDk2NjAgQ0QtUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGxhdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc2NzaS50eHQ+LgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzcl9tb2QuCisKK2NvbmZpZyBCTEtfREVWX1NSX1ZFTkRPUgorCWJvb2wgIkVuYWJsZSB2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucyAoZm9yIFNDU0kgQ0RST00pIgorCWRlcGVuZHMgb24gQkxLX0RFVl9TUgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNhZ2Ugb2YgdmVuZG9yIHNwZWNpZmljIFNDU0kgY29tbWFuZHMuIFRoaXMgaXMKKwkgIHJlcXVpcmVkIHRvIHN1cHBvcnQgbXVsdGlzZXNzaW9uIENEcyB3aXRoIG9sZCBORUMvVE9TSElCQSBjZHJvbQorCSAgZHJpdmVzIChhbmQgSFAgV3JpdGVycykuIElmIHlvdSBoYXZlIHN1Y2ggYSBkcml2ZSBhbmQgZ2V0IHRoZSBmaXJzdAorCSAgc2Vzc2lvbiBvbmx5LCB0cnkgc2F5aW5nIFkgaGVyZTsgZXZlcnlib2R5IGVsc2Ugc2F5cyBOLgorCitjb25maWcgQ0hSX0RFVl9TRworCXRyaXN0YXRlICJTQ1NJIGdlbmVyaWMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugd2FudCB0byB1c2UgU0NTSSBzY2FubmVycywgc3ludGhlc2l6ZXJzIG9yIENELXdyaXRlcnMgb3IganVzdAorCSAgYWJvdXQgYW55dGhpbmcgaGF2aW5nICJTQ1NJIiBpbiBpdHMgbmFtZSBvdGhlciB0aGFuIGhhcmQgZGlza3MsCisJICBDRC1ST01zIG9yIHRhcGVzLCBzYXkgWSBoZXJlLiBUaGVzZSB3b24ndCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbAorCSAgZGlyZWN0bHksIHNvIHlvdSBuZWVkIHNvbWUgYWRkaXRpb25hbCBzb2Z0d2FyZSB3aGljaCBrbm93cyBob3cgdG8KKwkgIHRhbGsgdG8gdGhlc2UgZGV2aWNlcyB1c2luZyB0aGUgU0NTSSBwcm90b2NvbDoKKworCSAgRm9yIHNjYW5uZXJzLCBsb29rIGF0IFNBTkUgKDxodHRwOi8vd3d3Lm1vc3RhbmcuY29tL3NhbmUvPikuIEZvciBDRAorCSAgd3JpdGVyIHNvZnR3YXJlIGxvb2sgYXQgQ2RydG9vbHMKKwkgICg8aHR0cDovL3d3dy5mb2t1cy5nbWQuZGUvcmVzZWFyY2gvY2MvZ2xvbmUvZW1wbG95ZWVzL2pvZXJnLnNjaGlsbGluZy9wcml2YXRlL2NkcmVjb3JkLmh0bWw+KQorCSAgYW5kIGZvciBidXJuaW5nIGEgImRpc2sgYXQgb25jZSI6IENEUkRBTworCSAgKDxodHRwOi8vY2RyZGFvLnNvdXJjZWZvcmdlLm5ldC8+KS4gQ2RwYXJhbm9pYSBpcyBhIGhpZ2gKKwkgIHF1YWxpdHkgZGlnaXRhbCByZWFkZXIgb2YgYXVkaW8gQ0RzICg8aHR0cDovL3d3dy54aXBoLm9yZy9wYXJhbm9pYS8+KS4KKwkgIEZvciBvdGhlciBkZXZpY2VzLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91J2xsIGhhdmUgdG8gd3JpdGUgdGhlCisJICBkcml2ZXIgc29mdHdhcmUgeW91cnNlbGYuIFBsZWFzZSByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1nZW5lcmljLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9zY3NpLnR4dD4uIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2cuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbW1lbnQgIlNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcyIKKwlkZXBlbmRzIG9uIFNDU0kKKworY29uZmlnIFNDU0lfTVVMVElfTFVOCisJYm9vbCAiUHJvYmUgYWxsIExVTnMgb24gZWFjaCBTQ1NJIGRldmljZSIKKwlkZXBlbmRzIG9uIFNDU0kKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFNDU0kgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbW9yZSB0aGFuIG9uZSBMVU4gKExvZ2ljYWwKKwkgIFVuaXQgTnVtYmVyKSwgZS5nLiBhIENEIGp1a2Vib3gsIGFuZCBvbmx5IG9uZSBMVU4gaXMgZGV0ZWN0ZWQsIHlvdQorCSAgY2FuIHNheSBZIGhlcmUgdG8gZm9yY2UgdGhlIFNDU0kgZHJpdmVyIHRvIHByb2JlIGZvciBtdWx0aXBsZSBMVU5zLgorCSAgQSBTQ1NJIGRldmljZSB3aXRoIG11bHRpcGxlIExVTnMgYWN0cyBsb2dpY2FsbHkgbGlrZSBtdWx0aXBsZSBTQ1NJCisJICBkZXZpY2VzLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBTQ1NJIGRldmljZXMgaGF2ZSBvbmx5IG9uZSBMVU4sIGFuZAorCSAgc28gbW9zdCBwZW9wbGUgY2FuIHNheSBOIGhlcmUuIFRoZSBtYXhfbHVucyBib290L21vZHVsZSBwYXJhbWV0ZXIgCisJICBhbGxvd3MgdG8gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nLgorCitjb25maWcgU0NTSV9DT05TVEFOVFMKKwlib29sICJWZXJib3NlIFNDU0kgZXJyb3IgcmVwb3J0aW5nIChrZXJuZWwgc2l6ZSArPTEySykiCisJZGVwZW5kcyBvbiBTQ1NJCisJaGVscAorCSAgVGhlIGVycm9yIG1lc3NhZ2VzIHJlZ2FyZGluZyB5b3VyIFNDU0kgaGFyZHdhcmUgd2lsbCBiZSBlYXNpZXIgdG8KKwkgIHVuZGVyc3RhbmQgaWYgeW91IHNheSBZIGhlcmU7IGl0IHdpbGwgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dAorCSAgMTIgS0IuIElmIGluIGRvdWJ0LCBzYXkgWS4KKworY29uZmlnIFNDU0lfTE9HR0lORworCWJvb2wgIlNDU0kgbG9nZ2luZyBmYWNpbGl0eSIKKwlkZXBlbmRzIG9uIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIHR1cm5zIG9uIGEgbG9nZ2luZyBmYWNpbGl0eSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlYnVnIGEgbnVtYmVyCisJICBvZiBTQ1NJIHJlbGF0ZWQgcHJvYmxlbXMuCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBubyBsb2dnaW5nIG91dHB1dCB3aWxsIGFwcGVhciBieSBkZWZhdWx0LCBidXQgeW91CisJICBjYW4gZW5hYmxlIGxvZ2dpbmcgYnkgc2F5aW5nIFkgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGFuZAorCSAgIlN5c2N0bCBzdXBwb3J0IiBiZWxvdyBhbmQgZXhlY3V0aW5nIHRoZSBjb21tYW5kCisKKwkgIGVjaG8gInNjc2kgbG9nIHRva2VuIFtsZXZlbF0iID4gL3Byb2Mvc2NzaS9zY3NpCisKKwkgIGF0IGJvb3QgdGltZSBhZnRlciB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0gaGFzIGJlZW4gbW91bnRlZC4KKworCSAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB0aGF0IGNhbiBiZSB1c2VkIGZvciAndG9rZW4nICh5b3UgY2FuCisJICBmaW5kIHRoZW0gaW4gdGhlIHNvdXJjZTogPGZpbGU6ZHJpdmVycy9zY3NpL3Njc2kuYz4pLCBhbmQgdGhpcworCSAgYWxsb3dzIHlvdSB0byBzZWxlY3QgdGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHlvdSB3YW50LCBhbmQgdGhlCisJICBsZXZlbCBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUgbGV2ZWwgb2YgdmVyYm9zaXR5LgorCisJICBJZiB5b3Ugc2F5IE4gaGVyZSwgaXQgbWF5IGJlIGhhcmRlciB0byB0cmFjayBkb3duIHNvbWUgdHlwZXMgb2YgU0NTSQorCSAgcHJvYmxlbXMuIElmIHlvdSBzYXkgWSBoZXJlIHlvdXIga2VybmVsIHdpbGwgYmUgc29tZXdoYXQgbGFyZ2VyLCBidXQKKwkgIHRoZXJlIHNob3VsZCBiZSBubyBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGltcGFjdCBhcyBsb25nIGFzIHlvdSBoYXZlCisJICBsb2dnaW5nIHR1cm5lZCBvZmYuCisKK21lbnUgIlNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBTQ1NJCisKK2NvbmZpZyBTQ1NJX1NQSV9BVFRSUworCXRyaXN0YXRlICJQYXJhbGxlbCBTQ1NJIChTUEkpIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIgorCWRlcGVuZHMgb24gU0NTSQorCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIGV4cG9ydCB0cmFuc3BvcnQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQKKwkgIGVhY2ggYXR0YWNoZWQgU0NTSSBkZXZpY2UgdG8gc3lzZnMsIHNheSBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfRkNfQVRUUlMKKwl0cmlzdGF0ZSAiRmliZXJDaGFubmVsIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIgorCWRlcGVuZHMgb24gU0NTSQorCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIGV4cG9ydCB0cmFuc3BvcnQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQKKwkgIGVhY2ggYXR0YWNoZWQgRmliZXJDaGFubmVsIGRldmljZSB0byBzeXNmcywgc2F5IFkuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgU0NTSV9JU0NTSV9BVFRSUworCXRyaXN0YXRlICJpU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcyIKKwlkZXBlbmRzIG9uIFNDU0kKKwloZWxwCisJICBJZiB5b3Ugd2lzaCB0byBleHBvcnQgdHJhbnNwb3J0LXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0CisJICBlYWNoIGF0dGFjaGVkIGlTQ1NJIGRldmljZSB0byBzeXNmcywgc2F5IFkuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitlbmRtZW51CisKK21lbnUgIlNDU0kgbG93LWxldmVsIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBTQ1NJIT1uCisKK2NvbmZpZyBTR0lXRDkzX1NDU0kKKwl0cmlzdGF0ZSAiU0dJIFdEOTNDOTMgU0NTSSBEcml2ZXIiCisJZGVwZW5kcyBvbiBTR0lfSVAyMiAmJiBTQ1NJCisgIAloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFdlc3Rlcm4gRGlnaXRhbCBXRDkzIFNDU0kgY29udHJvbGxlciBvbgorCSAgYW4gU0dJIE1JUFMgc3lzdGVtLCBzYXkgWS4gIE90aGVyd2lzZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX0RFQ05DUgorCXRyaXN0YXRlICJERUMgTkNSNTNDOTQgU2NzaSBEcml2ZXIiCisJZGVwZW5kcyBvbiBNQUNIX0RFQ1NUQVRJT04gJiYgU0NTSSAmJiBUQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgTkNSNTNDOTQgU0NTSSBjb250cm9sbGVyIGNoaXBzIG9uIElPQVNJQworCSAgYmFzZWQgVFVSQk9jaGFubmVsIERFQ3N0YXRpb25zIGFuZCBUVVJCT2NoYW5uZWwgUE1BWi1BIGNhcmRzLgorCitjb25maWcgU0NTSV9ERUNTSUkKKwl0cmlzdGF0ZSAiREVDIFNJSSBTY3NpIERyaXZlciIKKwlkZXBlbmRzIG9uIE1BQ0hfREVDU1RBVElPTiAmJiBTQ1NJICYmIE1JUFMzMgorCitjb25maWcgQkxLX0RFVl8zV19YWFhYX1JBSUQKKwl0cmlzdGF0ZSAiM3dhcmUgNS82LzcvOHh4eCBBVEEtUkFJRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICAzd2FyZSBpcyB0aGUgb25seSBoYXJkd2FyZSBBVEEtUmFpZCBwcm9kdWN0IGluIExpbnV4IHRvIGRhdGUuCisJICBUaGlzIGNhcmQgaXMgMiw0LCBvciA4IGNoYW5uZWwgbWFzdGVyIG1vZGUgc3VwcG9ydCBvbmx5LgorCSAgU0NTSSBzdXBwb3J0IHJlcXVpcmVkISEhCisKKwkgIDxodHRwOi8vd3d3LjN3YXJlLmNvbS8+CisKKwkgIFBsZWFzZSByZWFkIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCisJICA8ZmlsZTpkcml2ZXJzL3Njc2kvM3cteHh4eC5jPi4KKworY29uZmlnIFNDU0lfM1dfOVhYWAorCXRyaXN0YXRlICIzd2FyZSA5eHh4IFNBVEEtUkFJRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgOTAwMCBzZXJpZXMgM3dhcmUgU0FUQS1SQUlEIGNhcmRzLgorCisJICA8aHR0cDovL3d3dy5hbWNjLmNvbT4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YKKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS8zdy05eHh4LmM+LgorCitjb25maWcgU0NTSV83MDAwRkFTU1QKKwl0cmlzdGF0ZSAiNzAwMEZBU1NUIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFdlc3Rlcm4gRGlnaXRhbCA3MDAwIFNDU0kgaG9zdCBhZGFwdGVyCisJICBmYW1pbHkuICBTb21lIGluZm9ybWF0aW9uIGlzIGluIHRoZSBzb3VyY2U6CisJICA8ZmlsZTpkcml2ZXJzL3Njc2kvd2Q3MDAwLmM+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ZDcwMDAuCisKK2NvbmZpZyBTQ1NJX0FDQVJECisJdHJpc3RhdGUgIkFDQVJEIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEFDQVJEIFNDU0kgaG9zdCBhZGFwdGVyLgorCSAgU3VwcG9ydCBDaGlwIDxBVFA4NzAgQVRQODc2IEFUUDg4MCBBVFA4ODU+CisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhdHA4NzB1LgorCitjb25maWcgU0NTSV9BSEExNTJYCisJdHJpc3RhdGUgIkFkYXB0ZWMgQUhBMTUyWC8yODI1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSSAmJiAhNjRCSVQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQUhBLTE1MTAsIEFIQS0xNTIwLCBBSEEtMTUyMiwgYW5kIEFIQS0yODI1CisJICBTQ1NJIGhvc3QgYWRhcHRlcnMuIEl0IGFsc28gd29ya3MgZm9yIHRoZSBBVkEtMTUwNSwgYnV0IHRoZSBJUlEgZXRjLgorCSAgbXVzdCBiZSBtYW51YWxseSBzcGVjaWZpZWQgaW4gdGhpcyBjYXNlLgorCisJICBJdCBpcyBleHBsYWluZWQgaW4gc2VjdGlvbiAzLjMgb2YgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBZb3UgbWlnaHQgYWxzbyB3YW50IHRvCisJICByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9haGExNTJ4LnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE1MnguCisKK2NvbmZpZyBTQ1NJX0FIQTE1NDIKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSEExNTQyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYSBTQ1NJIGhvc3QgYWRhcHRlci4gIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uCisJICAzLjQgb2YgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgTm90ZSB0aGF0IFRyYW50b3Igd2FzCisJICBwdXJjaGFzZWQgYnkgQWRhcHRlYywgYW5kIHNvbWUgZm9ybWVyIFRyYW50b3IgcHJvZHVjdHMgYXJlIGJlaW5nCisJICBzb2xkIHVuZGVyIHRoZSBBZGFwdGVjIG5hbWUuICBJZiBpdCBkb2Vzbid0IHdvcmsgb3V0IG9mIHRoZSBib3gsIHlvdQorCSAgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4gPGZpbGU6ZHJpdmVycy9zY3NpL2FoYTE1NDIuaD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE1NDIuCisKK2NvbmZpZyBTQ1NJX0FIQTE3NDAKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSEExNzQwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGEgU0NTSSBob3N0IGFkYXB0ZXIuICBJdCBpcyBleHBsYWluZWQgaW4gc2VjdGlvbgorCSAgMy41IG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL2FoYTE3NDAuaD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFoYTE3NDAuCisKK2NvbmZpZyBTQ1NJX0FBQ1JBSUQKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBQUNSQUlEIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJICYmIFBDSQorCitzb3VyY2UgImRyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eCIKKworY29uZmlnIFNDU0lfQUlDN1hYWF9PTEQKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSUM3eHh4IHN1cHBvcnQgKG9sZCBkcml2ZXIpIgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSApICYmIFNDU0kKKwloZWxwCisJICBXQVJOSU5HIFRoaXMgZHJpdmVyIGlzIGFuIG9sZGVyIGFpYzd4eHggZHJpdmVyIGFuZCBpcyBubyBsb25nZXIKKwkgIHVuZGVyIGFjdGl2ZSBkZXZlbG9wbWVudC4gIEFkYXB0ZWMsIEluYy4gaXMgd3JpdGluZyBhIG5ldyBkcml2ZXIgdG8KKwkgIHRha2UgdGhlIHBsYWNlIG9mIHRoaXMgb25lLCBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB3aGVuZXZlcgorCSAgcG9zc2libGUsIHBlb3BsZSBzaG91bGQgdXNlIHRoZSBuZXcgQWRhcHRlYyB3cml0dGVuIGRyaXZlciBpbnN0ZWFkCisJICBvZiB0aGlzIG9uZS4gIFRoaXMgZHJpdmVyIHdpbGwgZXZlbnR1YWxseSBiZSBwaGFzZWQgb3V0IGVudGlyZWx5LgorCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSB2YXJpb3VzIGFpYzd4eHggYmFzZWQgQWRhcHRlYyBTQ1NJCisJICBjb250cm9sbGVycy4gVGhlc2UgaW5jbHVkZSB0aGUgMjc0eCBFSVNBIGNhcmRzOyAyODR4IFZMQiBjYXJkczsKKwkgIDI5MDIsIDI5MTAsIDI5M3gsIDI5NHgsIDM5NHgsIDM5ODUgYW5kIHNldmVyYWwgb3RoZXIgUENJIGFuZAorCSAgbW90aGVyYm9hcmQgYmFzZWQgU0NTSSBjb250cm9sbGVycyBmcm9tIEFkYXB0ZWMuIEl0IGRvZXMgbm90IHN1cHBvcnQKKwkgIHRoZSBBQUEtMTN4IFJBSUQgY29udHJvbGxlcnMgZnJvbSBBZGFwdGVjLCBub3Igd2lsbCBpdCBsaWtlbHkgZXZlcgorCSAgc3VwcG9ydCB0aGVtLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAyOTIwIGNhcmRzIGZyb20gQWRhcHRlYyB0aGF0CisJICB1c2UgdGhlIEZ1dHVyZSBEb21haW4gU0NTSSBjb250cm9sbGVyIGNoaXAuIEZvciB0aG9zZSBjYXJkcywgeW91CisJICBuZWVkIHRoZSAiRnV0dXJlIERvbWFpbiAxNnh4IFNDU0kgc3VwcG9ydCIgZHJpdmVyLgorCisJICBJbiBnZW5lcmFsLCBpZiB0aGUgY29udHJvbGxlciBpcyBiYXNlZCBvbiBhbiBBZGFwdGVjIFNDU0kgY29udHJvbGxlcgorCSAgY2hpcCBmcm9tIHRoZSBhaWM3Nzd4IHNlcmllcyBvciB0aGUgYWljNzh4eCBzZXJpZXMsIHRoaXMgZHJpdmVyCisJICBzaG91bGQgd29yay4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoZSA3ODEwIHdoaWNoIGlzIHNwZWNpZmljYWxseQorCSAgbm90IHN1cHBvcnRlZCAodGhhdCdzIHRoZSBSQUlEIGNvbnRyb2xsZXIgY2hpcCBvbiB0aGUgQUFBLTEzeAorCSAgY2FyZHMpLgorCisJICBOb3RlIHRoYXQgdGhlIEFIQTI5MjAgU0NTSSBob3N0IGFkYXB0ZXIgaXMgKm5vdCogc3VwcG9ydGVkIGJ5IHRoaXMKKwkgIGRyaXZlcjsgY2hvb3NlICJGdXR1cmUgRG9tYWluIDE2eHggU0NTSSBzdXBwb3J0IiBpbnN0ZWFkIGlmIHlvdSBoYXZlCisJICBvbmUgb2YgdGhvc2UuCisKKwkgIEluZm9ybWF0aW9uIG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgY29udHJvbGxlciBjYW4gYmUKKwkgIGZvdW5kIGJ5IGNoZWNraW5nIHRoZSBoZWxwIGZpbGUgZm9yIGVhY2ggb2YgdGhlIGF2YWlsYWJsZQorCSAgY29uZmlndXJhdGlvbiBvcHRpb25zLiBZb3Ugc2hvdWxkIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4X29sZC50eHQ+IGF0IGEgbWluaW11bSBiZWZvcmUKKwkgIGNvbnRhY3RpbmcgdGhlIG1haW50YWluZXIgd2l0aCBhbnkgcXVlc3Rpb25zLiAgVGhlIFNDU0ktSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjYW4gYWxzbworCSAgYmUgb2YgZ3JlYXQgaGVscC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWljN3h4eF9vbGQuCisKK3NvdXJjZSAiZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3OXh4IgorCisjIEFsbCB0aGUgSTJPIGNvZGUgYW5kIGRyaXZlcnMgZG8gbm90IHNlZW0gdG8gYmUgNjRiaXQgc2FmZS4KK2NvbmZpZyBTQ1NJX0RQVF9JMk8KKwl0cmlzdGF0ZSAiQWRhcHRlYyBJMk8gUkFJRCBzdXBwb3J0ICIKKwlkZXBlbmRzIG9uICE2NEJJVCAmJiBTQ1NJICYmIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBvZiBBZGFwdGVjJ3MgSTJPIGJhc2VkIFJBSUQgY29udHJvbGxlcnMgYXMgCisJICB3ZWxsIGFzIHRoZSBEUFQgU21hcnRSYWlkIFYgY2FyZHMuICBUaGlzIGlzIGFuIEFkYXB0ZWMgbWFpbnRhaW5lZAorCSAgZHJpdmVyIGJ5IERlYW5uYSBCb25kcy4gIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvZHB0aS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkcHRfaTJvLgorCitjb25maWcgU0NTSV9BRFZBTlNZUworCXRyaXN0YXRlICJBZHZhblN5cyBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoSVNBIHx8IEVJU0EgfHwgUENJKSAmJiBTQ1NJICYmIEJST0tFTgorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGFsbCBTQ1NJIGhvc3QgYWRhcHRlcnMgbWFudWZhY3R1cmVkIGJ5CisJICBBZHZhblN5cy4gSXQgaXMgZG9jdW1lbnRlZCBpbiB0aGUga2VybmVsIHNvdXJjZSBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL2FkdmFuc3lzLmM+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZHZhbnN5cy4KKworY29uZmlnIFNDU0lfSU4yMDAwCisJdHJpc3RhdGUgIkFsd2F5cyBJTjIwMDAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGFuIElTQSBidXMgU0NTSSBob3N0IGFkYXB0ZXIuICBZb3UnbGwgZmluZCBtb3JlCisJICBpbmZvcm1hdGlvbiBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dD4uIElmIGl0IGRvZXNuJ3Qgd29yaworCSAgb3V0IG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlIGp1bXBlcnMgZm9yIElSUSBvcgorCSAgYWRkcmVzcyBzZWxlY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGluMjAwMC4KKworc291cmNlICJkcml2ZXJzL3Njc2kvbWVnYXJhaWQvS2NvbmZpZy5tZWdhcmFpZCIKKworY29uZmlnIFNDU0lfU0FUQQorCWJvb2wgIlNlcmlhbCBBVEEgKFNBVEEpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgZmFtaWx5IHN1cHBvcnRzIFNlcmlhbCBBVEEgaG9zdCBjb250cm9sbGVycworCSAgYW5kIGRldmljZXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX1NBVEFfQUhDSQorCXRyaXN0YXRlICJBSENJIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEFIQ0kgU2VyaWFsIEFUQS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9TVlcKKwl0cmlzdGF0ZSAiU2VydmVyV29ya3MgRnJvZG8gLyBBcHBsZSBLMiBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBCcm9hZGNvbS9TZXJ2ZXJ3b3Jrcy9BcHBsZSBLMgorCSAgU0FUQSBzdXBwb3J0LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9BVEFfUElJWAorCXRyaXN0YXRlICJJbnRlbCBQSUlYL0lDSCBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBJQ0g1IFNlcmlhbCBBVEEuCisJICBJZiBQQVRBIHN1cHBvcnQgd2FzIGVuYWJsZWQgcHJldmlvdXNseSwgdGhpcyBlbmFibGVzCisJICBzdXBwb3J0IGZvciBzZWxlY3QgSW50ZWwgUElJWC9JQ0ggUEFUQSBob3N0IGNvbnRyb2xsZXJzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX05WCisJdHJpc3RhdGUgIk5WSURJQSBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgTlZJRElBIFNlcmlhbCBBVEEuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX1NBVEFfUFJPTUlTRQorCXRyaXN0YXRlICJQcm9taXNlIFNBVEEgVFgyL1RYNCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSV9TQVRBICYmIFBDSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgUHJvbWlzZSBTZXJpYWwgQVRBIFRYMi9UWDQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX1NBVEFfUVNUT1IKKwl0cmlzdGF0ZSAiUGFjaWZpYyBEaWdpdGFsIFNBVEEgUVN0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFBhY2lmaWMgRGlnaXRhbCBTZXJpYWwgQVRBIFFTdG9yLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX1NYNAorCXRyaXN0YXRlICJQcm9taXNlIFNBVEEgU1g0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgUHJvbWlzZSBTZXJpYWwgQVRBIFNYNC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9TSUwKKwl0cmlzdGF0ZSAiU2lsaWNvbiBJbWFnZSBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgU2lsaWNvbiBJbWFnZSBTZXJpYWwgQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX1NJUworCXRyaXN0YXRlICJTaVMgOTY0LzE4MCBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgU2lTIFNlcmlhbCBBVEEgOTY0LzE4MC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9VTEkKKwl0cmlzdGF0ZSAiVUxpIEVsZWN0cm9uaWNzIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBVTGkgRWxlY3Ryb25pY3MgU0FUQS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfU0FUQV9WSUEKKwl0cmlzdGF0ZSAiVklBIFNBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfU0FUQSAmJiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFZJQSBTZXJpYWwgQVRBLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9TQVRBX1ZJVEVTU0UKKwl0cmlzdGF0ZSAiVklURVNTRSBWU0MtNzE3NCBTQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1NBVEEgJiYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBWaXRlc3NlIFZTQzcxNzQgU2VyaWFsIEFUQS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfQlVTTE9HSUMKKwl0cmlzdGF0ZSAiQnVzTG9naWMgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBKSAmJiBTQ1NJICYmIChCUk9LRU4gfHwgIVNQQVJDNjQpCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBCdXNMb2dpYyBNdWx0aU1hc3RlciBhbmQgRmxhc2hQb2ludCBTQ1NJIEhvc3QKKwkgIEFkYXB0ZXJzLiBDb25zdWx0IHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgYW5kIHRoZSBmaWxlcworCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL0J1c0xvZ2ljLnR4dD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvRmxhc2hQb2ludC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBCdXNMb2dpYy4KKworY29uZmlnIFNDU0lfT01JVF9GTEFTSFBPSU5UCisJYm9vbCAiT21pdCBGbGFzaFBvaW50IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX0JVU0xPR0lDCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBvbWl0IHRoZSBGbGFzaFBvaW50IHN1cHBvcnQgZnJvbSB0aGUKKwkgIEJ1c0xvZ2ljIFNDU0kgZHJpdmVyLiBUaGUgRmxhc2hQb2ludCBTQ0NCIE1hbmFnZXIgY29kZSBpcworCSAgc3Vic3RhbnRpYWwsIHNvIHVzZXJzIG9mIE11bHRpTWFzdGVyIEhvc3QgQWRhcHRlcnMgbWF5IHdpc2ggdG8gb21pdAorCSAgaXQuCisKKyMKKyMgVGhpcyBpcyBtYXJrZWQgYnJva2VuIGJlY2F1c2UgaXQgdXNlcyBvdmVyIDRrQiBvZiBzdGFjayBpbgorIyBqdXN0IHR3byByb3V0aW5lczoKKyMgICAgIDIwNzYgIENwcVRzUHJvY2Vzc0lNUUVudHJ5CisjICAgICAyMDUyICBQZWVrSU1RRW50cnkKKyMKK2NvbmZpZyBTQ1NJX0NQUUZDVFMKKwl0cmlzdGF0ZSAiQ29tcGFxIEZpYnJlIENoYW5uZWwgNjQtYml0LzY2TWh6IEhCQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgQlJPS0VOCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIGluIHN1cHBvcnQgZm9yIHRoZSBDb21wYXEgU3RvcmFnZVdvcmtzIEZpYnJlCisJICBDaGFubmVsIDY0LWJpdC82Nk1oeiBIb3N0IEJ1cyBBZGFwdGVyLgorCitjb25maWcgU0NTSV9ETVgzMTkxRAorCXRyaXN0YXRlICJETVgzMTkxRCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgRG9tZXggRE1YMzE5MUQgU0NTSSBIb3N0IEFkYXB0ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkbXgzMTkxZC4KKworY29uZmlnIFNDU0lfRFRDMzI4MAorCXRyaXN0YXRlICJEVEMzMTgwLzMyODAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIERUQyAzMTgwLzMyODAgU0NTSSBIb3N0IEFkYXB0ZXJzLiAgUGxlYXNlIHJlYWQKKwkgIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgYW5kIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvZHRjM3g4MC50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkdGMuCisKK2NvbmZpZyBTQ1NJX0VBVEEKKwl0cmlzdGF0ZSAiRUFUQSBJU0EvRUlTQS9QQ0kgKERQVCBhbmQgZ2VuZXJpYyBFQVRBL0RNQS1jb21wbGlhbnQgYm9hcmRzKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiAoQlJPS0VOIHx8ICFTUEFSQzY0KQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBFQVRBL0RNQS1jb21wbGlhbnQgU0NTSSBob3N0IGFkYXB0ZXJzLiAgRFBUCisJICBJU0EgYW5kIGFsbCBFSVNBIEkvTyBhZGRyZXNzZXMgYXJlIHByb2JlZCBsb29raW5nIGZvciB0aGUgIkVBVEEiCisJICBzaWduYXR1cmUuIFRoZSBhZGRyZXNzZXMgb2YgYWxsIHRoZSBQQ0kgU0NTSSBjb250cm9sbGVycyByZXBvcnRlZAorICAgICAgICAgIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIGFyZSBwcm9iZWQgYXMgd2VsbC4KKworCSAgWW91IHdhbnQgdG8gcmVhZCB0aGUgc3RhcnQgb2YgPGZpbGU6ZHJpdmVycy9zY3NpL2VhdGEuYz4gYW5kIHRoZQorCSAgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVhdGEuCisKK2NvbmZpZyBTQ1NJX0VBVEFfVEFHR0VEX1FVRVVFCisJYm9vbCAiZW5hYmxlIHRhZ2dlZCBjb21tYW5kIHF1ZXVlaW5nIgorCWRlcGVuZHMgb24gU0NTSV9FQVRBCisJaGVscAorCSAgVGhpcyBpcyBhIGZlYXR1cmUgb2YgU0NTSS0yIHdoaWNoIGltcHJvdmVzIHBlcmZvcm1hbmNlOiB0aGUgaG9zdAorCSAgYWRhcHRlciBjYW4gc2VuZCBzZXZlcmFsIFNDU0kgY29tbWFuZHMgdG8gYSBkZXZpY2UncyBxdWV1ZSBldmVuIGlmCisJICBwcmV2aW91cyBjb21tYW5kcyBoYXZlbid0IGZpbmlzaGVkIHlldC4KKwkgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgImVhdGE9dGM6eSIgYm9vdCBvcHRpb24uCisKK2NvbmZpZyBTQ1NJX0VBVEFfTElOS0VEX0NPTU1BTkRTCisJYm9vbCAiZW5hYmxlIGVsZXZhdG9yIHNvcnRpbmciCisJZGVwZW5kcyBvbiBTQ1NJX0VBVEEKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGVsZXZhdG9yIHNvcnRpbmcgZm9yIGFsbCBwcm9iZWQgU0NTSSBkaXNrcyBhbmQKKwkgIENELVJPTXMuIEl0IGRlZmluaXRlbHkgcmVkdWNlcyB0aGUgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIHdoZW4gZG9pbmcKKwkgIHJhbmRvbSBzZWVrcywgYnV0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVzdWx0IGluIGEgbm90aWNlYWJsZQorCSAgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IHlvdXIgbWlsZWFnZSBtYXkgdmFyeS4uLgorCSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAiZWF0YT1sYzp5IiBib290IG9wdGlvbi4KKworY29uZmlnIFNDU0lfRUFUQV9NQVhfVEFHUworCWludCAibWF4aW11bSBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIgorCWRlcGVuZHMgb24gU0NTSV9FQVRBCisJZGVmYXVsdCAiMTYiCisJaGVscAorCSAgVGhpcyBzcGVjaWZpZXMgaG93IG1hbnkgU0NTSSBjb21tYW5kcyBjYW4gYmUgbWF4aW1hbGx5IHF1ZXVlZCBmb3IKKwkgIGVhY2ggcHJvYmVkIFNDU0kgZGV2aWNlLiBZb3Ugc2hvdWxkIHJlZHVjZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxNgorCSAgb25seSBpZiB5b3UgaGF2ZSBkaXNrcyB3aXRoIGJ1Z2d5IG9yIGxpbWl0ZWQgdGFnZ2VkIGNvbW1hbmQgc3VwcG9ydC4KKwkgIE1pbmltdW0gaXMgMiBhbmQgbWF4aW11bSBpcyA2Mi4gVGhpcyB2YWx1ZSBpcyBhbHNvIHRoZSB3aW5kb3cgc2l6ZQorCSAgdXNlZCBieSB0aGUgZWxldmF0b3Igc29ydGluZyBvcHRpb24gYWJvdmUuIFRoZSBlZmZlY3RpdmUgdmFsdWUgdXNlZAorCSAgYnkgdGhlIGRyaXZlciBmb3IgZWFjaCBwcm9iZWQgU0NTSSBkZXZpY2UgaXMgcmVwb3J0ZWQgYXQgYm9vdCB0aW1lLgorCSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAiZWF0YT1tcTo4IiBib290IG9wdGlvbi4KKworY29uZmlnIFNDU0lfRUFUQV9QSU8KKwl0cmlzdGF0ZSAiRUFUQS1QSU8gKG9sZCBEUFQgUE0yMDAxLCBQTTIwMTJBKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiBCUk9LRU4KKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwgRUFUQS1QSU8gcHJvdG9jb2wgY29tcGxpYW50IFNDU0kgSG9zdAorCSAgQWRhcHRlcnMgbGlrZSB0aGUgRFBUIFBNMjAwMSBhbmQgdGhlIFBNMjAxMkEuICBFQVRBLURNQSBjb21wbGlhbnQKKwkgIGhvc3QgYWRhcHRlcnMgY291bGQgYWxzbyB1c2UgdGhpcyBkcml2ZXIgYnV0IGFyZSBkaXNjb3VyYWdlZCBmcm9tCisJICBkb2luZyBzbywgc2luY2UgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBoYXJkIGRpc2tzIGFuZCBsYWNrcworCSAgbnVtZXJvdXMgZmVhdHVyZXMuICBZb3UgbWlnaHQgd2FudCB0byBoYXZlIGEgbG9vayBhdCB0aGUgU0NTSS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVhdGFfcGlvLgorCitjb25maWcgU0NTSV9GVVRVUkVfRE9NQUlOCisJdHJpc3RhdGUgIkZ1dHVyZSBEb21haW4gMTZ4eCBTQ1NJL0FIQS0yOTIwQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBQQ0kpICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIEZ1dHVyZSBEb21haW4ncyAxNi1iaXQgU0NTSSBob3N0IGFkYXB0ZXJzCisJICAoVE1DLTE2NjAvMTY4MCwgVE1DLTE2NTAvMTY3MCwgVE1DLTMyNjAsIFRNQy0xNjEwTS9NRVIvTUVYKSBhbmQKKwkgIG90aGVyIGFkYXB0ZXJzIGJhc2VkIG9uIHRoZSBGdXR1cmUgRG9tYWluIGNoaXBzZXRzIChRdWFudHVtCisJICBJU0EtMjAwUywgSVNBLTI1ME1HOyBBZGFwdGVjIEFIQS0yOTIwQTsgYW5kIGF0IGxlYXN0IG9uZSBJQk0gYm9hcmQpLgorCSAgSXQgaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gMy43IG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTk9URTogTmV3ZXIgQWRhcHRlYyBBSEEtMjkyMEMgYm9hcmRzIHVzZSB0aGUgQWRhcHRlYyBBSUMtNzg1MCBjaGlwCisJICBhbmQgc2hvdWxkIHVzZSB0aGUgYWljN3h4eCBkcml2ZXIgKCJBZGFwdGVjIEFJQzd4eHggY2hpcHNldCBTQ1NJCisJICBjb250cm9sbGVyIHN1cHBvcnQiKS4gVGhpcyBGdXR1cmUgRG9tYWluIGRyaXZlciB3b3JrcyB3aXRoIHRoZSBvbGRlcgorCSAgQWRhcHRlYyBBSEEtMjkyMEEgYm9hcmRzIHdpdGggYSBGdXR1cmUgRG9tYWluIGNoaXAgb24gdGhlbS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZmRvbWFpbi4KKworY29uZmlnIFNDU0lfRkRfTUNTCisJdHJpc3RhdGUgIkZ1dHVyZSBEb21haW4gTUNTLTYwMC83MDAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUNBX0xFR0FDWSAmJiBTQ1NJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBGdXR1cmUgRG9tYWluIE1DUyA2MDAvNzAwIE1DQSBTQ1NJIGFkYXB0ZXJzLgorCSAgU29tZSBQUy8yIGNvbXB1dGVycyBhcmUgZXF1aXBwZWQgd2l0aCBJQk0gRmFzdCBTQ1NJIEFkYXB0ZXIvQSB3aGljaAorCSAgaXMgaWRlbnRpY2FsIHRvIHRoZSBNQ1MgNzAwIGFuZCBoZW5jZSBhbHNvIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIFJlcGx5IFNCMTYvU0NTSSBjYXJkICh0aGUgU0NTSSBwYXJ0KS4KKwkgIEl0IHN1cHBvcnRzIG11bHRpcGxlIGFkYXB0ZXJzIGluIHRoZSBzYW1lIHN5c3RlbS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZmRfbWNzLgorCitjb25maWcgU0NTSV9HRFRICisJdHJpc3RhdGUgIkludGVsL0lDUCAoZm9ybWVyIEdEVCBTQ1NJIERpc2sgQXJyYXkpIFJBSUQgQ29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiAoQlJPS0VOIHx8ICFTUEFSQzY0KQorCS0tLWhlbHAtLS0KKwkgIEZvcm1lcmx5IGNhbGxlZCBHRFQgU0NTSSBEaXNrIEFycmF5IENvbnRyb2xsZXIgU3VwcG9ydC4KKworCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgUkFJRC9TQ1NJIERpc2sgQXJyYXkgQ29udHJvbGxlcnMgKEVJU0EvSVNBL1BDSSkgCisJICBtYW51ZmFjdHVyZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24vSUNQIHZvcnRleCBHbWJILiBJdCBpcyBkb2N1bWVudGVkCisJICBpbiB0aGUga2VybmVsIHNvdXJjZSBpbiA8ZmlsZTpkcml2ZXJzL3Njc2kvZ2R0aC5jPiBhbmQKKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS9nZHRoLmguPgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnZHRoLgorCitjb25maWcgU0NTSV9HRU5FUklDX05DUjUzODAKKwl0cmlzdGF0ZSAiR2VuZXJpYyBOQ1I1MzgwLzUzYzQwMCBTQ1NJIFBJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgb2xkIE5DUiA1M2M4MCBzZXJpZXMgb2YgU0NTSSBjb250cm9sbGVycworCSAgb24gYm9hcmRzIHVzaW5nIFBJTy4gTW9zdCBib2FyZHMgc3VjaCBhcyB0aGUgVHJhbnRvciBUMTMwIGZpdCB0aGlzCisJICBjYXRlZ29yeSwgYWxvbmcgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBJU0EgOGJpdCBjb250cm9sbGVycyBzaGlwcGVkCisJICBmb3IgZnJlZSB3aXRoIFNDU0kgc2Nhbm5lcnMuIElmIHlvdSBoYXZlIGEgUEFTMTYsIFQxMjggb3IgRE1YMzE5MQorCSAgeW91IHNob3VsZCBzZWxlY3QgdGhlIHNwZWNpZmljIGRyaXZlciBmb3IgdGhhdCBjYXJkIHJhdGhlciB0aGFuCisJICBnZW5lcmljIDUzODAgc3VwcG9ydC4KKworCSAgSXQgaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gMy44IG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5oPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ19OQ1I1MzgwLgorCitjb25maWcgU0NTSV9HRU5FUklDX05DUjUzODBfTU1JTworCXRyaXN0YXRlICJHZW5lcmljIE5DUjUzODAvNTNjNDAwIFNDU0kgTU1JTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgb2xkIE5DUiA1M2M4MCBzZXJpZXMgb2YgU0NTSSBjb250cm9sbGVycworCSAgb24gYm9hcmRzIHVzaW5nIG1lbW9yeSBtYXBwZWQgSS9PLiAKKwkgIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIDMuOCBvZiB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBJZiBpdCBkb2Vzbid0IHdvcmsgb3V0CisJICBvZiB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS9nX05DUjUzODAuaD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdfTkNSNTM4MF9tbWlvLgorCitjb25maWcgU0NTSV9HRU5FUklDX05DUjUzQzQwMAorCWJvb2wgIkVuYWJsZSBOQ1I1M2M0MDAgZXh0ZW5zaW9ucyIKKwlkZXBlbmRzIG9uIFNDU0lfR0VORVJJQ19OQ1I1MzgwCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGNlcnRhaW4gb3B0aW1pemF0aW9ucyBmb3IgdGhlIE5DUjUzYzQwMCBTQ1NJIGNhcmRzLgorCSAgWW91IG1pZ2h0IGFzIHdlbGwgdHJ5IGl0IG91dC4gIE5vdGUgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG9ubHkgcHJvYmUKKwkgIGZvciB0aGUgVHJhbnRvciBUMTMwQiBpbiBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uOyB5b3UgbWlnaHQgaGF2ZQorCSAgdG8gcGFzcyBhIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUgaWYgaXQgZG9lcworCSAgbm90IGRldGVjdCB5b3VyIGNhcmQuICBTZWUgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9nX05DUjUzODAudHh0PiBmb3IgZGV0YWlscy4KKworY29uZmlnIFNDU0lfSUJNTUNBCisJdHJpc3RhdGUgIklCTU1DQSBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0FfTEVHQUNZICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBJQk0gU0NTSSBhZGFwdGVyIGZvdW5kIGluIG1hbnkgb2YgdGhlIFBTLzIKKwkgIHNlcmllcyBjb21wdXRlcnMuICBUaGVzZSBtYWNoaW5lcyBoYXZlIGFuIE1DQSBidXMsIHNvIHlvdSBuZWVkIHRvCisJICBhbnN3ZXIgWSB0byAiTUNBIHN1cHBvcnQiIGFzIHdlbGwgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbWNhLnR4dD4uCisKKwkgIElmIHRoZSBhZGFwdGVyIGlzbid0IGZvdW5kIGR1cmluZyBib290IChhIGNvbW1vbiBwcm9ibGVtIGZvciBtb2RlbHMKKwkgIDU2LCA1NywgNzYsIGFuZCA3NykgeW91J2xsIG5lZWQgdG8gdXNlIHRoZSAnaWJtbWNhc2NzaT08cHVuPicga2VybmVsCisJICBvcHRpb24sIHdoZXJlIDxwdW4+IGlzIHRoZSBpZCBvZiB0aGUgU0NTSSBzdWJzeXN0ZW0gKHVzdWFsbHkgNywgYnV0CisJICBpZiB0aGF0IGRvZXNuJ3Qgd29yayBjaGVjayB5b3VyIHJlZmVyZW5jZSBkaXNrZXR0ZSkuICBPd25lcnMgb2YKKwkgIG1vZGVsIDk1IHdpdGggYSBMRUQtbWF0cml4LWRpc3BsYXkgY2FuIGluIGFkZGl0aW9uIGFjdGl2YXRlIHNvbWUKKwkgIGFjdGl2aXR5IGluZm8gbGlrZSB1bmRlciBPUy8yLCBidXQgbW9yZSBpbmZvcm1hdGl2ZSwgYnkgc2V0dGluZworCSAgJ2libW1jYXNjc2k9ZGlzcGxheScgYXMgYW4gYWRkaXRpb25hbCBrZXJuZWwgcGFyYW1ldGVyLiAgVHJ5ICJtYW4KKwkgIGJvb3RwYXJhbSIgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgYWJvdXQgaG93IHRvCisJICBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaWJtbWNhLgorCitjb25maWcgSUJNTUNBX1NDU0lfT1JERVJfU1RBTkRBUkQKKwlib29sICJTdGFuZGFyZCBTQ1NJLW9yZGVyIgorCWRlcGVuZHMgb24gU0NTSV9JQk1NQ0EKKwktLS1oZWxwLS0tCisJICBJbiB0aGUgUEMtd29ybGQgYW5kIGluIG1vc3QgbW9kZXJuIFNDU0ktQklPUy1zZXR1cHMsIFNDU0ktaGFyZCBkaXNrcworCSAgYXJlIGFzc2lnbmVkIHRvIHRoZSBkcml2ZSBsZXR0ZXJzLCBzdGFydGluZyB3aXRoIHRoZSBsb3dlc3QgU0NTSS1pZAorCSAgKHBoeXNpY2FsIG51bWJlciAtLSBwdW4pIHRvIGJlIGRyaXZlIEM6LCBhcyBzZWVuIGZyb20gRE9TIGFuZAorCSAgc2ltaWxhciBvcGVyYXRpbmcgc3lzdGVtcy4gV2hlbiBsb29raW5nIGludG8gcGFwZXJzIGRlc2NyaWJpbmcgdGhlCisJICBBTlNJLVNDU0ktc3RhbmRhcmQsIHRoaXMgYXNzaWdubWVudCBvZiBkcml2ZXMgYXBwZWFycyB0byBiZSB3cm9uZy4KKwkgIFRoZSBTQ1NJLXN0YW5kYXJkIGZvbGxvd3MgYSBoYXJkd2FyZS1oaWVyYXJjaHkgd2hpY2ggc2F5cyB0aGF0IGlkIDcKKwkgIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBhbmQgaWQgMCB0aGUgbG93ZXN0LiBUaGVyZWZvcmUsIHRoZSBob3N0CisJICBhZGFwdGVycyBhcmUgc3RpbGwgdG9kYXkgZXZlcnl3aGVyZSBwbGFjZWQgYXMgU0NTSS1pZCA3IGJ5IGRlZmF1bHQuCisJICBJbiB0aGUgU0NTSS1zdGFuZGFyZCwgdGhlIGRyaXZlIGxldHRlcnMgZXhwcmVzcyB0aGUgcHJpb3JpdHkgb2YgdGhlCisJICBkaXNrLiBDOiBzaG91bGQgYmUgdGhlIGhhcmQgZGlzaywgb3IgYSBwYXJ0aXRpb24gb24gaXQsIHdpdGggdGhlCisJICBoaWdoZXN0IHByaW9yaXR5LiBUaGlzIG11c3QgdGhlcmVmb3JlIGJlIHRoZSBkaXNrIHdpdGggdGhlIGhpZ2hlc3QKKwkgIFNDU0ktaWQgKGUuZy4gNikgYW5kIG5vdCB0aGUgb25lIHdpdGggdGhlIGxvd2VzdCEgSUJNLUJJT1Mga2VwdCB0aGUKKwkgIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIFNDU0ktc3RhbmRhcmQgYXMgYWxzbyBpbmR1c3RyaWFsLSBhbmQKKwkgIHByb2Nlc3MtY29udHJvbC1tYWNoaW5lcywgbGlrZSBWTUUtQ1BVcyBydW5uaW5nIHVuZGVyIHJlYWx0aW1lLU9TZXMKKwkgIChlLmcuIEx5bnhPUywgT1M5KSBkby4KKworCSAgSWYgeW91IGxpa2UgdG8gcnVuIExpbnV4IG9uIHlvdXIgTUNBLW1hY2hpbmUgd2l0aCB0aGUgc2FtZQorCSAgYXNzaWdubWVudCBvZiBoYXJkIGRpc2tzIGFzIHNlZW4gZnJvbSBlLmcuIERPUyBvciBPUy8yIG9uIHlvdXIKKwkgIG1hY2hpbmUsIHdoaWNoIGlzIGluIGFkZGl0aW9uIGNvbmZvcm1hbnQgdG8gdGhlIFNDU0ktc3RhbmRhcmQsIHlvdQorCSAgbXVzdCBzYXkgWSBoZXJlLiBUaGlzIGlzIGFsc28gbmVjZXNzYXJ5IGZvciBNQ0EtTGludXggdXNlcnMgd2hvIHdhbnQKKwkgIHRvIGtlZXAgZG93bndhcmQgY29tcGF0aWJpbGl0eSB0byBvbGRlciByZWxlYXNlcyBvZiB0aGUKKwkgIElCTS1NQ0EtU0NTSS1kcml2ZXIgKG9sZGVyIHRoYW4gZHJpdmVyLXJlbGVhc2UgMi4wMCBhbmQgb2xkZXIgdGhhbgorCSAgSnVuZSAxOTk3KS4KKworCSAgSWYgeW91IGxpa2UgdG8gaGF2ZSB0aGUgbG93ZXN0IFNDU0ktaWQgYXNzaWduZWQgYXMgZHJpdmUgQzosIGFzCisJICBtb2Rlcm4gU0NTSS1CSU9TZXMgZG8sIHdoaWNoIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHN0YW5kYXJkLCBidXQKKwkgIGlzIHdpZGVzcHJlYWQgYW5kIGNvbW1vbiBpbiB0aGUgUEMtd29ybGQgb2YgdG9kYXksIHlvdSBtdXN0IHNheSBOCisJICBoZXJlLiBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSUJNTUNBX1NDU0lfREVWX1JFU0VUCisJYm9vbCAiUmVzZXQgU0NTSS1kZXZpY2VzIGF0IGJvb3R0aW1lIgorCWRlcGVuZHMgb24gU0NTSV9JQk1NQ0EKKwktLS1oZWxwLS0tCisJICBCeSBkZWZhdWx0LCBTQ1NJLWRldmljZXMgYXJlIHJlc2V0IHdoZW4gdGhlIG1hY2hpbmUgaXMgcG93ZXJlZCBvbi4KKwkgIEhvd2V2ZXIsIHNvbWUgZGV2aWNlcyBleGlzdCwgbGlrZSBzcGVjaWFsLWNvbnRyb2wtZGV2aWNlcywKKwkgIFNDU0ktQ05DLW1hY2hpbmVzLCBTQ1NJLXByaW50ZXIgb3Igc2Nhbm5lcnMgb2Ygb2xkZXIgdHlwZSwgdGhhdCBkbworCSAgbm90IHJlc2V0IHdoZW4gc3dpdGNoZWQgb24uIElmIHlvdSBzYXkgWSBoZXJlLCBlYWNoIGRldmljZSBjb25uZWN0ZWQKKwkgIHRvIHlvdXIgU0NTSS1idXMgd2lsbCBiZSBpc3N1ZWQgYSByZXNldC1jb21tYW5kIGFmdGVyIGl0IGhhcyBiZWVuCisJICBwcm9iZWQsIHdoaWxlIHRoZSBrZXJuZWwgaXMgYm9vdGluZy4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aAorCSAgbW9yZSBtb2Rlcm4gZGV2aWNlcywgbGlrZSBoYXJkIGRpc2tzLCB3aGljaCBkbyBub3QgYXBwcmVjaWF0ZSB0aGVzZQorCSAgcmVzZXQgY29tbWFuZHMsIGFuZCBjYW4gY2F1c2UgeW91ciBzeXN0ZW0gdG8gaGFuZy4gU28gc2F5IFkgb25seSBpZgorCSAgeW91IGtub3cgdGhhdCBvbmUgb2YgeW91ciBvbGRlciBkZXZpY2VzIG5lZWRzIGl0OyBOIGlzIHRoZSBzYWZlCisJICBhbnN3ZXIuCisKK2NvbmZpZyBTQ1NJX0lQUworCXRyaXN0YXRlICJJQk0gU2VydmVSQUlEIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIElCTSBTZXJ2ZVJBSUQgaGFyZHdhcmUgUkFJRCBjb250cm9sbGVycy4KKwkgIFNlZSA8aHR0cDovL3d3dy5kZXZlbG9wZXIuaWJtLmNvbS93ZWxjb21lL25ldGZpbml0eS9zZXJ2ZXJhaWQuaHRtbD4KKwkgIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkKKwkgIHdpdGhvdXQgbW9kaWZpY2F0aW9uIHBsZWFzZSBjb250YWN0IHRoZSBhdXRob3IgYnkgZW1haWwgYXQKKwkgIDxpcHNsaW51eEBhZGFwdGVjLmNvbT4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwcy4KKworY29uZmlnIFNDU0lfSUJNVlNDU0kKKwl0cmlzdGF0ZSAiSUJNIFZpcnR1YWwgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMgfHwgUFBDX0lTRVJJRVMKKwloZWxwCisJICBUaGlzIGlzIHRoZSBJQk0gUE9XRVIgVmlydHVhbCBTQ1NJIENsaWVudAorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpYm12c2NzaWMuCisKK2NvbmZpZyBTQ1NJX0lOSVRJTworCXRyaXN0YXRlICJJbml0aW8gOTEwMFUoVykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgSW5pdGlvIDkxWFhVKFcpIFNDU0kgaG9zdCBhZGFwdGVyLiAgUGxlYXNlCisJICByZWFkIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW5pdGlvLgorCitjb25maWcgU0NTSV9JTklBMTAwCisJdHJpc3RhdGUgIkluaXRpbyBJTkktQTEwMFUyVyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBJbml0aW8gSU5JLUExMDBVMlcgU0NTSSBob3N0IGFkYXB0ZXIuCisJICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGExMDB1MncuCisKK2NvbmZpZyBTQ1NJX1BQQQorCXRyaXN0YXRlICJJT01FR0EgcGFyYWxsZWwgcG9ydCAocHBhIC0gb2xkZXIgZHJpdmVzKSIKKwlkZXBlbmRzIG9uIFNDU0kgJiYgUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIG9sZGVyIHZlcnNpb25zIG9mIElPTUVHQSdzIHBhcmFsbGVsIHBvcnQgWklQCisJICBkcml2ZSAoYSAxMDAgTUIgcmVtb3ZhYmxlIG1lZGlhIGRldmljZSkuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNheSBOIGhlcmUgaWYgeW91IGhhdmUgdGhlIFNDU0kgdmVyc2lvbiBvZiB0aGUgWklQCisJICBkcml2ZTogaXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc2FpZCBZIHRvIHRoZQorCSAgZ2VuZXJpYyAiU0NTSSBkaXNrIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgSWYgeW91IGhhdmUgdGhlIFpJUCBQbHVzIGRyaXZlIG9yIGEgbW9yZSByZWNlbnQgcGFyYWxsZWwgcG9ydCBaSVAKKwkgIGRyaXZlIChpZiB0aGUgc3VwcGxpZWQgY2FibGUgd2l0aCB0aGUgZHJpdmUgaXMgbGFiZWxlZCAiQXV0b0RldGVjdCIpCisJICB0aGVuIHlvdSBzaG91bGQgc2F5IE4gaGVyZSBhbmQgWSB0byAiSU9NRUdBIHBhcmFsbGVsIHBvcnQgKGltbSAtCisJICBuZXdlciBkcml2ZXMpIiwgYmVsb3cuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIGFuZCBob3cgdG8gdXNlIGl0IHlvdSBzaG91bGQKKwkgIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3BwYS50eHQ+LiAgWW91IHNob3VsZCBhbHNvIHJlYWQKKwkgIHRoZSBTQ1NJLUhPV1RPLCB3aGljaCBpcyBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIHlvdSB1c2UgdGhpcyBkcml2ZXIsCisJICB5b3Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIHVzZSB0aGUgcGFyYWxsZWwgcG9ydCBmb3Igb3RoZXIgdGFza3MsCisJICBzdWNoIGFzIGEgcHJpbnRlcjsgaXQgaXMgc2FmZSB0byBjb21waWxlIGJvdGggZHJpdmVycyBpbnRvIHRoZQorCSAga2VybmVsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcGEuCisKK2NvbmZpZyBTQ1NJX0lNTQorCXRyaXN0YXRlICJJT01FR0EgcGFyYWxsZWwgcG9ydCAoaW1tIC0gbmV3ZXIgZHJpdmVzKSIKKwlkZXBlbmRzIG9uIFNDU0kgJiYgUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIG5ld2VyIHZlcnNpb25zIG9mIElPTUVHQSdzIHBhcmFsbGVsIHBvcnQgWklQCisJICBkcml2ZSAoYSAxMDAgTUIgcmVtb3ZhYmxlIG1lZGlhIGRldmljZSkuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNheSBOIGhlcmUgaWYgeW91IGhhdmUgdGhlIFNDU0kgdmVyc2lvbiBvZiB0aGUgWklQCisJICBkcml2ZTogaXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc2FpZCBZIHRvIHRoZQorCSAgZ2VuZXJpYyAiU0NTSSBkaXNrIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgSWYgeW91IGhhdmUgdGhlIFpJUCBQbHVzIGRyaXZlIG9yIGEgbW9yZSByZWNlbnQgcGFyYWxsZWwgcG9ydCBaSVAKKwkgIGRyaXZlIChpZiB0aGUgc3VwcGxpZWQgY2FibGUgd2l0aCB0aGUgZHJpdmUgaXMgbGFiZWxlZCAiQXV0b0RldGVjdCIpCisJICB0aGVuIHlvdSBzaG91bGQgc2F5IFkgaGVyZTsgaWYgeW91IGhhdmUgYW4gb2xkZXIgWklQIGRyaXZlLCBzYXkgTgorCSAgaGVyZSBhbmQgWSB0byAiSU9NRUdBIFBhcmFsbGVsIFBvcnQgKHBwYSAtIG9sZGVyIGRyaXZlcykiLCBhYm92ZS4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgYW5kIGhvdyB0byB1c2UgaXQgeW91IHNob3VsZAorCSAgcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvcHBhLnR4dD4uICBZb3Ugc2hvdWxkIGFsc28gcmVhZAorCSAgdGhlIFNDU0ktSE9XVE8sIHdoaWNoIGlzIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgSWYgeW91IHVzZSB0aGlzIGRyaXZlciwKKwkgIHlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBwYXJhbGxlbCBwb3J0IGZvciBvdGhlciB0YXNrcywKKwkgIHN1Y2ggYXMgYSBwcmludGVyOyBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgYm90aCBkcml2ZXJzIGludG8gdGhlCisJICBrZXJuZWwuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGltbS4KKworY29uZmlnIFNDU0lfSVpJUF9FUFAxNgorCWJvb2wgInBwYS9pbW0gb3B0aW9uIC0gVXNlIHNsb3cgKGJ1dCBzYWZlKSBFUFAtMTYiCisJZGVwZW5kcyBvbiBQQVJQT1JUICYmIChTQ1NJX1BQQSB8fCBTQ1NJX0lNTSkKKwktLS1oZWxwLS0tCisJICBFUFAgKEVuaGFuY2VkIFBhcmFsbGVsIFBvcnQpIGlzIGEgc3RhbmRhcmQgZm9yIHBhcmFsbGVsIHBvcnRzIHdoaWNoCisJICBhbGxvd3MgdGhlbSB0byBhY3QgYXMgZXhwYW5zaW9uIGJ1c2VzIHRoYXQgY2FuIGhhbmRsZSB1cCB0byA2NAorCSAgcGVyaXBoZXJhbCBkZXZpY2VzLgorCisJICBTb21lIHBhcmFsbGVsIHBvcnQgY2hpcHNldHMgYXJlIHNsb3dlciB0aGFuIHRoZWlyIG1vdGhlcmJvYXJkLCBhbmQKKwkgIHNvIHdlIGhhdmUgdG8gY29udHJvbCB0aGUgc3RhdGUgb2YgdGhlIGNoaXBzZXQncyBGSUZPIHF1ZXVlIGV2ZXJ5CisJICBub3cgYW5kIHRoZW4gdG8gYXZvaWQgZGF0YSBsb3NzLiBUaGlzIHdpbGwgYmUgZG9uZSBpZiB5b3Ugc2F5IFkKKwkgIGhlcmUuCisKKwkgIEdlbmVyYWxseSwgc2F5aW5nIFkgaXMgdGhlIHNhZmUgb3B0aW9uIGFuZCBzbG93cyB0aGluZ3MgZG93biBhIGJpdC4KKworY29uZmlnIFNDU0lfSVpJUF9TTE9XX0NUUgorCWJvb2wgInBwYS9pbW0gb3B0aW9uIC0gQXNzdW1lIHNsb3cgcGFycG9ydCBjb250cm9sIHJlZ2lzdGVyIgorCWRlcGVuZHMgb24gUEFSUE9SVCAmJiAoU0NTSV9QUEEgfHwgU0NTSV9JTU0pCisJaGVscAorCSAgU29tZSBwYXJhbGxlbCBwb3J0cyBhcmUga25vd24gdG8gaGF2ZSBleGNlc3NpdmUgZGVsYXlzIGJldHdlZW4KKwkgIGNoYW5naW5nIHRoZSBwYXJhbGxlbCBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGdvb2QgZGF0YSBiZWluZworCSAgYXZhaWxhYmxlIG9uIHRoZSBwYXJhbGxlbCBwb3J0IGRhdGEvc3RhdHVzIHJlZ2lzdGVyLiBUaGlzIG9wdGlvbgorCSAgZm9yY2VzIGEgc21hbGwgZGVsYXkgKDEuMCB1c2VjIHRvIGJlIGV4YWN0KSBhZnRlciBjaGFuZ2luZyB0aGUKKwkgIGNvbnRyb2wgcmVnaXN0ZXIgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0LiBFbmFibGluZyB0aGlzIG9wdGlvbiBtYXkKKwkgIHJlc3VsdCBpbiBhIGJpZyBkcm9wIGluIHBlcmZvcm1hbmNlIGJ1dCBzb21lIHZlcnkgb2xkIHBhcmFsbGVsIHBvcnRzCisJICAoZm91bmQgaW4gMzg2IHZpbnRhZ2UgbWFjaGluZXMpIHdpbGwgbm90IHdvcmsgcHJvcGVybHkuCisKKwkgIEdlbmVyYWxseSwgc2F5aW5nIE4gaXMgZmluZS4KKworY29uZmlnIFNDU0lfTkNSNTNDNDA2QQorCXRyaXN0YXRlICJOQ1I1M2M0MDZhIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgTkNSNTNjNDA2YSBTQ1NJIGhvc3QgYWRhcHRlci4gIEZvciB1c2VyCisJICBjb25maWd1cmFibGUgcGFyYW1ldGVycywgY2hlY2sgb3V0IDxmaWxlOmRyaXZlcnMvc2NzaS9OQ1I1M2M0MDZhLmM+CisJICBpbiB0aGUga2VybmVsIHNvdXJjZS4gIEFsc28gcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIE5DUjUzYzQwNi4KKworY29uZmlnIFNDU0lfTkNSX0Q3MDAKKwl0cmlzdGF0ZSAiTkNSIER1YWwgNzAwIE1DQSBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0EgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBNaWNyb0NoYW5uZWwgRHVhbCA3MDAgY2FyZCBwcm9kdWNlZCBieQorCSAgTkNSIGFuZCBjb21tb25seSB1c2VkIGluIDM0NXgvMzV4eC80MTAwIGNsYXNzIG1hY2hpbmVzLiAgSXQgYWx3YXlzCisJICB0cmllcyB0byBuZWdvdGlhdGUgc3luYyBhbmQgdXNlcyB0YWcgY29tbWFuZCBxdWV1ZWluZy4KKworCSAgVW5sZXNzIHlvdSBoYXZlIGFuIE5DUiBtYW51ZmFjdHVyZWQgbWFjaGluZSwgdGhlIGNoYW5jZXMgYXJlIHRoYXQKKwkgIHlvdSBkbyBub3QgaGF2ZSB0aGlzIFNDU0kgY2FyZCwgc28gc2F5IE4uCisKK2NvbmZpZyA1M0M3MDBfSU9fTUFQUEVECisJYm9vbAorCWRlcGVuZHMgb24gU0NTSV9OQ1JfRDcwMAorCWRlZmF1bHQgeQorCitjb25maWcgU0NTSV9MQVNJNzAwCisJdHJpc3RhdGUgIkhQIExhc2kgU0NTSSBzdXBwb3J0IGZvciA1M2M3MDAvNzEwIgorCWRlcGVuZHMgb24gR1NDICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9TUElfQVRUUlMKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgU0NTSSBjb250cm9sbGVyIGluIHRoZSBMYXNpIGNoaXAgZm91bmQgaW4KKwkgIG1hbnkgUEEtUklTQyB3b3Jrc3RhdGlvbnMgJiBzZXJ2ZXJzLiAgSWYgeW91IGRvIG5vdCBrbm93IHdoZXRoZXIgeW91CisJICBoYXZlIGEgTGFzaSBjaGlwLCBpdCBpcyBzYWZlIHRvIHNheSAiWSIgaGVyZS4KKworY29uZmlnIDUzQzcwMF9NRU1fTUFQUEVECisJYm9vbAorCWRlcGVuZHMgb24gU0NTSV9MQVNJNzAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyA1M0M3MDBfTEVfT05fQkUKKwlib29sCisJZGVwZW5kcyBvbiBTQ1NJX0xBU0k3MDAKKwlkZWZhdWx0IHkKKworY29uZmlnIFNDU0lfU1lNNTNDOFhYXzIKKwl0cmlzdGF0ZSAiU1lNNTNDOFhYIFZlcnNpb24gMiBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSB3aG9sZSBOQ1I1M0M4WFgvU1lNNTNDOFhYIGZhbWlseSBvZgorCSAgUENJLVNDU0kgY29udHJvbGxlcnMuICBJdCBhbHNvIHN1cHBvcnRzIHRoZSBzdWJzZXQgb2YgTFNJNTNDMTBYWAorCSAgVWx0cmEtMTYwIGNvbnRyb2xsZXJzIHRoYXQgYXJlIGJhc2VkIG9uIHRoZSBTWU01M0M4WFggU0NSSVBUUworCSAgbGFuZ3VhZ2UuICBJdCBkb2VzIG5vdCBzdXBwb3J0IExTSTUzQzEwWFggVWx0cmEtMzIwIFBDSS1YIFNDU0kKKwkgIGNvbnRyb2xsZXJzOyB5b3UgbmVlZCB0byB1c2UgdGhlIEZ1c2lvbiBNUFQgZHJpdmVyIGZvciB0aGF0LgorCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvc3ltNTNjOHh4XzIudHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBTQ1NJX1NZTTUzQzhYWF9ETUFfQUREUkVTU0lOR19NT0RFCisJaW50ICJETUEgYWRkcmVzc2luZyBtb2RlIgorCWRlcGVuZHMgb24gU0NTSV9TWU01M0M4WFhfMgorCWRlZmF1bHQgIjEiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIFBDSS1TQ1NJIGNoaXBzIHRoYXQgYXJlIFBDSSBEQUMKKwkgIGNhcGFibGUgKDg3NUEsIDg5NUEsIDg5NiwgMTAxMC0zMywgMTAxMC02NiwgMTAwMCkuCisKKwkgIFdoZW4gc2V0IHRvIDAsIHRoZSBkcml2ZXIgd2lsbCBwcm9ncmFtIHRoZSBjaGlwIHRvIG9ubHkgcGVyZm9ybQorCSAgMzItYml0IERNQS4gIFdoZW4gc2V0IHRvIDEsIHRoZSBjaGlwIHdpbGwgYmUgYWJsZSB0byBwZXJmb3JtIERNQQorCSAgdG8gYWRkcmVzc2VzIHVwIHRvIDFUQi4gIFdoZW4gc2V0IHRvIDIsIHRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlCisJICBmdWxsIDY0LWJpdCBETUEgYWRkcmVzcyByYW5nZSwgYnV0IGNhbiBvbmx5IGFkZHJlc3MgMTYgc2VnbWVudHMKKwkgIG9mIDQgR0IgZWFjaC4gIFRoaXMgbGltaXRzIHRoZSB0b3RhbCBhZGRyZXNzYWJsZSByYW5nZSB0byA2NCBHQi4KKworCSAgTW9zdCBtYWNoaW5lcyB3aXRoIGxlc3MgdGhhbiA0R0Igb2YgbWVtb3J5IHNob3VsZCB1c2UgYSBzZXR0aW5nCisJICBvZiAwIGZvciBiZXN0IHBlcmZvcm1hbmNlLiAgSWYgeW91ciBtYWNoaW5lIGhhcyA0R0Igb2YgbWVtb3J5CisJICBvciBtb3JlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byAxICh0aGUgZGVmYXVsdCkuCisKKwkgIFRoZSBzdGlsbCBleHBlcmltZW50YWwgdmFsdWUgMiAoNjQgYml0IERNQSBhZGRyZXNzaW5nIHdpdGggMTYKKwkgIHggNEdCIHNlZ21lbnRzIGxpbWl0YXRpb24pIGNhbiBiZSB1c2VkIG9uIHN5c3RlbXMgdGhhdCByZXF1aXJlCisJICBQQ0kgYWRkcmVzcyBiaXRzIHBhc3QgYml0IDM5IHRvIGJlIHNldCBmb3IgdGhlIGFkZHJlc3Npbmcgb2YKKwkgIG1lbW9yeSB1c2luZyBQQ0kgREFDIGN5Y2xlcy4KKworY29uZmlnIFNDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUworCWludCAiZGVmYXVsdCB0YWdnZWQgY29tbWFuZCBxdWV1ZSBkZXB0aCIKKwlkZXBlbmRzIG9uIFNDU0lfU1lNNTNDOFhYXzIKKwlkZWZhdWx0ICIxNiIKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb21tYW5kIHF1ZXVlIGRlcHRoIHRoZQorCSAgZHJpdmVyIHdpbGwgYW5ub3VuY2UgdG8gdGhlIGdlbmVyaWMgU0NTSSBsYXllciBmb3IgZGV2aWNlcworCSAgdGhhdCBzdXBwb3J0IHRhZ2dlZCBjb21tYW5kIHF1ZXVlaW5nLiBUaGlzIHZhbHVlIGNhbiBiZSBjaGFuZ2VkCisJICBmcm9tIHRoZSBib290IGNvbW1hbmQgbGluZS4gIFRoaXMgaXMgYSBzb2Z0IGxpbWl0IHRoYXQgY2Fubm90CisJICBleGNlZWQgQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTLgorCitjb25maWcgU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MKKwlpbnQgIm1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBjb21tYW5kcyIKKwlkZXBlbmRzIG9uIFNDU0lfU1lNNTNDOFhYXzIKKwlkZWZhdWx0ICI2NCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbW1hbmRzCisJICB0aGF0IGNhbiBiZSBxdWV1ZWQgdG8gYW55IGRldmljZSwgd2hlbiB0YWdnZWQgY29tbWFuZCBxdWV1aW5nIGlzCisJICBwb3NzaWJsZS4gVGhlIGRyaXZlciBzdXBwb3J0cyB1cCB0byAyNTYgcXVldWVkIGNvbW1hbmRzIHBlciBkZXZpY2UuCisJICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBjb21waWxlZC1pbiBoYXJkIGxpbWl0LgorCitjb25maWcgU0NTSV9TWU01M0M4WFhfSU9NQVBQRUQKKwlib29sICJ1c2UgcG9ydCBJTyIKKwlkZXBlbmRzIG9uIFNDU0lfU1lNNTNDOFhYXzIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIGRyaXZlciB3aWxsIHVzZSBwb3J0IElPIHRvIGFjY2VzcworCSAgdGhlIGNhcmQuICBUaGlzIGlzIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoZW4gdXNpbmcgbWVtb3J5CisJICBtYXBwZWQgSU8uICBNb3N0IHBlb3BsZSBzaG91bGQgYW5zd2VyIE4uCisKK2NvbmZpZyBTQ1NJX0lQUgorCXRyaXN0YXRlICJJQk0gUG93ZXIgTGludXggUkFJRCBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCXNlbGVjdCBGV19MT0FERVIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgSUJNIFBvd2VyIExpbnV4IGZhbWlseSBSQUlEIGFkYXB0ZXJzLgorCSAgVGhpcyBpbmNsdWRlcyBJQk0gcFNlcmllcyA1NzEyLCA1NzAzLCA1NzA5LCBhbmQgNTcwQSwgYXMgd2VsbAorCSAgYXMgSUJNIGlTZXJpZXMgNTcwMiwgNTcwMywgNTcwOSwgYW5kIDU3MEEuCisKK2NvbmZpZyBTQ1NJX0lQUl9UUkFDRQorCWJvb2wgImVuYWJsZSBkcml2ZXIgaW50ZXJuYWwgdHJhY2UiCisJZGVwZW5kcyBvbiBTQ1NJX0lQUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgZHJpdmVyIHdpbGwgdHJhY2UgYWxsIGNvbW1hbmRzIGlzc3VlZAorCSAgdG8gdGhlIGFkYXB0ZXIuIFBlcmZvcm1hbmNlIGltcGFjdCBpcyBtaW5pbWFsLiBUcmFjZSBjYW4gYmUKKwkgIGR1bXBlZCB1c2luZyAvc3lzL2J1cy9jbGFzcy9zY3NpX2hvc3QvaG9zdFhYL3RyYWNlLgorCitjb25maWcgU0NTSV9JUFJfRFVNUAorCWJvb2wgImVuYWJsZSBhZGFwdGVyIGR1bXAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfSVBSCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGFkYXB0ZXIgY3Jhc2ggZHVtcC4KKwkgIElmIHlvdSBlbmFibGUgdGhpcyBzdXBwb3J0LCB0aGUgaXByZHVtcCBkYWVtb24gY2FuIGJlIHVzZWQKKwkgIHRvIGNhcHR1cmUgYWRhcHRlciBmYWlsdXJlIGFuYWx5c2lzIGluZm9ybWF0aW9uLgorCitjb25maWcgU0NTSV9aQUxPTgorCXRyaXN0YXRlICJaYWxvbiBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBHU0MgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCWhlbHAKKwkgIFRoZSBaYWxvbiBpcyBhIEdTQy9IU0MgYnVzIGludGVyZmFjZSBjaGlwIHRoYXQgc2l0cyBiZXR3ZWVuIHRoZQorCSAgUEEtUklTQyBwcm9jZXNzb3IgYW5kIHRoZSBOQ1IgNTNjNzIwIFNDU0kgY29udHJvbGxlciBvbiBDMTAwLAorCSAgQzExMCwgSjIwMCwgSjIxMCBhbmQgc29tZSBELCBLICYgUi1jbGFzcyBtYWNoaW5lcy4gIEl0J3MgYWxzbworCSAgdXNlZCBvbiB0aGUgYWRkLWluIEJsdWVmaXNoLCBCYXJyYWN1ZGEgJiBTaHJpa2UgU0NTSSBjYXJkcy4KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIG1hY2hpbmVzIG9yIGNhcmRzLgorCitjb25maWcgU0NTSV9OQ1JfUTcyMAorCXRyaXN0YXRlICJOQ1IgUXVhZCA3MjAgTUNBIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1DQSAmJiBTQ1NJCisJc2VsZWN0IFNDU0lfU1BJX0FUVFJTCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE1pY3JvQ2hhbm5lbCBRdWFkIDcyMCBjYXJkIHByb2R1Y2VkIGJ5CisJICBOQ1IgYW5kIGNvbW1vbmx5IHVzZWQgaW4gMzQ1eC8zNXh4LzQxMDAgY2xhc3MgbWFjaGluZXMuICBJdCBhbHdheXMKKwkgIHRyaWVzIHRvIG5lZ290aWF0ZSBzeW5jIGFuZCB1c2VzIHRhZyBjb21tYW5kIHF1ZXVlaW5nLgorCisJICBVbmxlc3MgeW91IGhhdmUgYW4gTkNSIG1hbnVmYWN0dXJlZCBtYWNoaW5lLCB0aGUgY2hhbmNlcyBhcmUgdGhhdAorCSAgeW91IGRvIG5vdCBoYXZlIHRoaXMgU0NTSSBjYXJkLCBzbyBzYXkgTi4KKworY29uZmlnIFNDU0lfTkNSNTNDOFhYX0RFRkFVTFRfVEFHUworCWludCAiICBkZWZhdWx0IHRhZ2dlZCBjb21tYW5kIHF1ZXVlIGRlcHRoIgorCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCisJZGVmYXVsdCAiOCIKKwktLS1oZWxwLS0tCisJICAiVGFnZ2VkIGNvbW1hbmQgcXVldWluZyIgaXMgYSBmZWF0dXJlIG9mIFNDU0ktMiB3aGljaCBpbXByb3ZlcworCSAgcGVyZm9ybWFuY2U6IHRoZSBob3N0IGFkYXB0ZXIgY2FuIHNlbmQgc2V2ZXJhbCBTQ1NJIGNvbW1hbmRzIHRvIGEKKwkgIGRldmljZSdzIHF1ZXVlIGV2ZW4gaWYgcHJldmlvdXMgY29tbWFuZHMgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQuCisJICBCZWNhdXNlIHRoZSBkZXZpY2UgaXMgaW50ZWxsaWdlbnQsIGl0IGNhbiBvcHRpbWl6ZSBpdHMgb3BlcmF0aW9ucworCSAgKGxpa2UgaGVhZCBwb3NpdGlvbmluZykgYmFzZWQgb24gaXRzIG93biByZXF1ZXN0IHF1ZXVlLiBTb21lIFNDU0kKKwkgIGRldmljZXMgZG9uJ3QgaW1wbGVtZW50IHRoaXMgcHJvcGVybHk7IGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhpcworCSAgZmVhdHVyZSwgZW50ZXIgMCBvciAxIGhlcmUgKGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoKS4KKworCSAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOCBhbmQgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSBtb3N0IGhhcmQgZGlza3MuCisJICBUaGlzIHZhbHVlIGNhbiBiZSBvdmVycmlkZGVuIGZyb20gdGhlIGJvb3QgY29tbWFuZCBsaW5lIHVzaW5nIHRoZQorCSAgJ3RhZ3MnIG9wdGlvbiBhcyBmb2xsb3dzIChleGFtcGxlKToKKwkgICduY3I1M2M4eHg9dGFnczo0L3QydDNxMTYvdDB1MnExMCcgd2lsbCBzZXQgZGVmYXVsdCBxdWV1ZSBkZXB0aCB0bworCSAgNCwgc2V0IHF1ZXVlIGRlcHRoIHRvIDE2IGZvciB0YXJnZXQgMiBhbmQgdGFyZ2V0IDMgb24gY29udHJvbGxlciAwCisJICBhbmQgc2V0IHF1ZXVlIGRlcHRoIHRvIDEwIGZvciB0YXJnZXQgMCAvIGx1biAyIG9uIGNvbnRyb2xsZXIgMS4KKworCSAgVGhlIG5vcm1hbCBhbnN3ZXIgdGhlcmVmb3JlIGlzIHRvIGdvIHdpdGggdGhlIGRlZmF1bHQgOCBhbmQgdG8gdXNlCisJICBhIGJvb3QgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgZGV2aWNlcyB0aGF0IG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50CisJICBjb21tYW5kIHF1ZXVlIGRlcHRoLgorCisJICBUaGVyZSBpcyBubyBzYWZlIG9wdGlvbiBvdGhlciB0aGFuIHVzaW5nIGdvb2QgU0NTSSBkZXZpY2VzLgorCitjb25maWcgU0NTSV9OQ1I1M0M4WFhfTUFYX1RBR1MKKwlpbnQgIiAgbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIgorCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCisJZGVmYXVsdCAiMzIiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21tYW5kcworCSAgdGhhdCBjYW4gYmUgcXVldWVkIHRvIGFueSBkZXZpY2UsIHdoZW4gdGFnZ2VkIGNvbW1hbmQgcXVldWluZyBpcworCSAgcG9zc2libGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMyLiBNaW5pbXVtIGlzIDIsIG1heGltdW0gaXMgNjQuCisJICBNb2Rlcm4gaGFyZCBkaXNrcyBhcmUgYWJsZSB0byBzdXBwb3J0IDY0IHRhZ3MgYW5kIGV2ZW4gbW9yZSwgYnV0CisJICBkbyBub3Qgc2VlbSB0byBiZSBmYXN0ZXIgd2hlbiBtb3JlIHRoYW4gMzIgdGFncyBhcmUgYmVpbmcgdXNlZC4KKworCSAgU28sIHRoZSBub3JtYWwgYW5zd2VyIGhlcmUgaXMgdG8gZ28gd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSAzMiB1bmxlc3MKKwkgIHlvdSBhcmUgdXNpbmcgdmVyeSBsYXJnZSBoYXJkIGRpc2tzIHdpdGggbGFyZ2UgY2FjaGUgKD49IDEgTUIpIHRoYXQKKwkgIGFyZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgdGhhbiAzMiB0YWdnZWQgY29tbWFuZHMuCisKKwkgIFRoZXJlIGlzIG5vIHNhZmUgb3B0aW9uIGFuZCB0aGUgZGVmYXVsdCBhbnN3ZXIgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBTQ1NJX05DUjUzQzhYWF9TWU5DCisJaW50ICIgIHN5bmNocm9ub3VzIHRyYW5zZmVycyBmcmVxdWVuY3kgaW4gTUh6IgorCWRlcGVuZHMgb24gU0NTSV9aQUxPTiB8fCBTQ1NJX05DUl9RNzIwCisJZGVmYXVsdCAiMjAiCisJLS0taGVscC0tLQorCSAgVGhlIFNDU0kgUGFyYWxsZWwgSW50ZXJmYWNlLTIgU3RhbmRhcmQgZGVmaW5lcyA1IGNsYXNzZXMgb2YgdHJhbnNmZXIKKwkgIHJhdGVzOiBGQVNULTUsIEZBU1QtMTAsIEZBU1QtMjAsIEZBU1QtNDAgYW5kIEZBU1QtODAuICBUaGUgbnVtYmVycworCSAgYXJlIHJlc3BlY3RpdmVseSB0aGUgbWF4aW11bSBkYXRhIHRyYW5zZmVyIHJhdGVzIGluIG1lZ2EtdHJhbnNmZXJzCisJICBwZXIgc2Vjb25kIGZvciBlYWNoIGNsYXNzLiAgRm9yIGV4YW1wbGUsIGEgRkFTVC0yMCBXaWRlIDE2IGRldmljZSBpcworCSAgYWJsZSB0byB0cmFuc2ZlciBkYXRhIGF0IDIwIG1pbGxpb24gMTYgYml0IHBhY2tldHMgcGVyIHNlY29uZCBmb3IgYQorCSAgdG90YWwgcmF0ZSBvZiA0MCBNQi9zLgorCisJICBZb3UgbWF5IHNwZWNpZnkgMCBpZiB5b3Ugd2FudCB0byBvbmx5IHVzZSBhc3luY2hyb25vdXMgZGF0YQorCSAgdHJhbnNmZXJzLiBUaGlzIGlzIHRoZSBzYWZlc3QgYW5kIHNsb3dlc3Qgb3B0aW9uLiBPdGhlcndpc2UsIHNwZWNpZnkKKwkgIGEgdmFsdWUgYmV0d2VlbiA1IGFuZCA4MCwgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHlvdXIgU0NTSQorCSAgY29udHJvbGxlci4gIFRoZSBoaWdoZXIgdGhlIG51bWJlciwgdGhlIGZhc3RlciB0aGUgZGF0YSB0cmFuc2Zlci4KKwkgIE5vdGUgdGhhdCA4MCBzaG91bGQgbm9ybWFsbHkgYmUgb2sgc2luY2UgdGhlIGRyaXZlciBkZWNyZWFzZXMgdGhlCisJICB2YWx1ZSBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0byB0aGUgY29udHJvbGxlcidzIGNhcGFiaWxpdGllcy4KKworCSAgWW91ciBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBpcyBpZ25vcmVkIGZvciBjb250cm9sbGVycyB3aXRoIE5WUkFNLAorCSAgc2luY2UgdGhlIGRyaXZlciB3aWxsIGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIgc2V0LXVwLiAgSXQKKwkgIGFsc28gY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgYSBib290IHNldHVwIG9wdGlvbiwgYXMgZm9sbG93cworCSAgKGV4YW1wbGUpOiAnbmNyNTNjOHh4PXN5bmM6MTInIHdpbGwgYWxsb3cgdGhlIGRyaXZlciB0byBuZWdvdGlhdGUKKwkgIGZvciBGQVNULTIwIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgKDIwIG1lZ2EtdHJhbnNmZXJzIHBlcgorCSAgc2Vjb25kKS4KKworCSAgVGhlIG5vcm1hbCBhbnN3ZXIgdGhlcmVmb3JlIGlzIG5vdCB0byBnbyB3aXRoIHRoZSBkZWZhdWx0IGJ1dCB0bworCSAgc2VsZWN0IHRoZSBtYXhpbXVtIHZhbHVlIDgwIGFsbG93aW5nIHRoZSBkcml2ZXIgdG8gdXNlIHRoZSBtYXhpbXVtCisJICB2YWx1ZSBzdXBwb3J0ZWQgYnkgZWFjaCBjb250cm9sbGVyLiBJZiB0aGlzIGNhdXNlcyBwcm9ibGVtcyB3aXRoCisJICB5b3VyIFNDU0kgZGV2aWNlcywgeW91IHNob3VsZCBjb21lIGJhY2sgYW5kIGRlY3JlYXNlIHRoZSB2YWx1ZS4KKworCSAgVGhlcmUgaXMgbm8gc2FmZSBvcHRpb24gb3RoZXIgdGhhbiB1c2luZyBnb29kIGNhYmxpbmcsIHJpZ2h0CisJICB0ZXJtaW5hdGlvbnMgYW5kIFNDU0kgY29uZm9ybWFudCBkZXZpY2VzLgorCitjb25maWcgU0NTSV9OQ1I1M0M4WFhfUFJPRklMRQorCWJvb2wgIiAgZW5hYmxlIHByb2ZpbGluZyIKKwlkZXBlbmRzIG9uIFNDU0lfWkFMT04gfHwgU0NTSV9OQ1JfUTcyMAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZW5hYmxlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBnYXRoZXJpbmcuCisJICBUaGVzZSBzdGF0aXN0aWNzIGFyZSBub3QgdmVyeSBhY2N1cmF0ZSBkdWUgdG8gdGhlIGxvdyBmcmVxdWVuY3kKKwkgIG9mIHRoZSBrZXJuZWwgY2xvY2sgKDEwMCBIeiBvbiBpMzg2KSBhbmQgaGF2ZSBwZXJmb3JtYW5jZSBpbXBhY3QKKwkgIG9uIHN5c3RlbXMgdGhhdCB1c2UgdmVyeSBmYXN0IGRldmljZXMuCisKKwkgIFRoZSBub3JtYWwgYW5zd2VyIHRoZXJlZm9yZSBpcyBOLgorCitjb25maWcgU0NTSV9OQ1I1M0M4WFhfTk9fRElTQ09OTkVDVAorCWJvb2wgIiAgbm90IGFsbG93IHRhcmdldHMgdG8gZGlzY29ubmVjdCIKKwlkZXBlbmRzIG9uIChTQ1NJX1pBTE9OIHx8IFNDU0lfTkNSX1E3MjApICYmIFNDU0lfTkNSNTNDOFhYX0RFRkFVTFRfVEFHUz0wCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgb25seSBwcm92aWRlZCBmb3Igc2FmZXR5IGlmIHlvdSBzdXNwZWN0IHNvbWUgU0NTSQorCSAgZGV2aWNlIG9mIHlvdXJzIHRvIG5vdCBzdXBwb3J0IHByb3Blcmx5IHRoZSB0YXJnZXQtZGlzY29ubmVjdAorCSAgZmVhdHVyZS4gSW4gdGhhdCBjYXNlLCB5b3Ugd291bGQgc2F5IFkgaGVyZS4gSW4gZ2VuZXJhbCBob3dldmVyLCB0bworCSAgbm90IGFsbG93IHRhcmdldHMgdG8gZGlzY29ubmVjdCBpcyBub3QgcmVhc29uYWJsZSBpZiB0aGVyZSBpcyBtb3JlCisJICB0aGFuIDEgZGV2aWNlIG9uIGEgU0NTSSBidXMuIFRoZSBub3JtYWwgYW5zd2VyIHRoZXJlZm9yZSBpcyBOLgorCitjb25maWcgU0NTSV9NQ0FfNTNDOVgKKwl0cmlzdGF0ZSAiTkNSIE1DQSA1M0M5eCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNQ0FfTEVHQUNZICYmIFNDU0kgJiYgQlJPS0VOX09OX1NNUAorCWhlbHAKKwkgIFNvbWUgTWljcm9DaGFubmVsIG1hY2hpbmVzLCBub3RhYmx5IHRoZSBOQ1IgMzV4eCBsaW5lLCB1c2UgYSBTQ1NJCisJICBjb250cm9sbGVyIGJhc2VkIG9uIHRoZSBOQ1IgNTNDOTQuICBUaGlzIGRyaXZlciB3aWxsIGFsbG93IHVzZSBvZgorCSAgdGhlIGNvbnRyb2xsZXIgb24gdGhlIDM1NTAsIGFuZCB2ZXJ5IHBvc3NpYmx5IG90aGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWNhXzUzYzl4LgorCitjb25maWcgU0NTSV9QQVMxNgorCXRyaXN0YXRlICJQQVMxNiBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYSBTQ1NJIGhvc3QgYWRhcHRlci4gIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uCisJICAzLjEwIG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL3BhczE2Lmg+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwYXMxNi4KKworY29uZmlnIFNDU0lfUENJMjAwMAorCXRyaXN0YXRlICJQQ0kyMDAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBCUk9LRU4KKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBQQ0kyMDAwSSBFSURFIGludGVyZmFjZSBjYXJkIHdoaWNoIGFjdHMgYXMgYQorCSAgU0NTSSBob3N0IGFkYXB0ZXIuICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaTIwMDAuCisKK2NvbmZpZyBTQ1NJX1BDSTIyMjBJCisJdHJpc3RhdGUgIlBDSTIyMjBpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSSAmJiBCUk9LRU4KKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBQQ0kyMjIwaSBFSURFIGludGVyZmFjZSBjYXJkIHdoaWNoIGFjdHMgYXMgYQorCSAgU0NTSSBob3N0IGFkYXB0ZXIuICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaTIyMjBpLgorCitjb25maWcgU0NTSV9QU0kyNDBJCisJdHJpc3RhdGUgIlBTSTI0MGkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgUFNJMjQwaSBFSURFIGludGVyZmFjZSBjYXJkIHdoaWNoIGFjdHMgYXMgYQorCSAgU0NTSSBob3N0IGFkYXB0ZXIuICBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBzaTI0MGkuCisKK2NvbmZpZyBTQ1NJX1FMT0dJQ19GQVMKKwl0cmlzdGF0ZSAiUWxvZ2ljIEZBUyBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBJU0EsIFZMQiwgYW5kIFBDTUNJQSB2ZXJzaW9ucyBvZiB0aGUgUWxvZ2ljCisJICBGYXN0U0NTSSEgY2FyZHMgYXMgd2VsbCBhcyBhbnkgb3RoZXIgY2FyZCBiYXNlZCBvbiB0aGUgRkFTWFggY2hpcAorCSAgKGluY2x1ZGluZyB0aGUgQ29udHJvbCBDb25jZXB0cyBTQ1NJL0lERS9TSU8vUElPL0ZEQyBjYXJkcykuCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgTk9UIHN1cHBvcnQgdGhlIFBDSSB2ZXJzaW9ucyBvZiB0aGVzZSBjYXJkcy4gVGhlCisJICBQQ0kgdmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgUWxvZ2ljIElTUCBkcml2ZXIgKCJRbG9naWMgSVNQCisJICBTQ1NJIHN1cHBvcnQiKSwgYmVsb3cuCisKKwkgIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIGlzIGNvbnRhaW5lZCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Fsb2dpY2Zhcy50eHQ+LiAgWW91IHNob3VsZCBhbHNvIHJlYWQgdGhlCisJICBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljZmFzLgorCitjb25maWcgU0NTSV9RTE9HSUNfSVNQCisJdHJpc3RhdGUgIlFsb2dpYyBJU1AgU0NTSSBzdXBwb3J0IChvbGQgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIEJST0tFTgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHdvcmtzIGZvciBhbGwgUUxvZ2ljIFBDSSBTQ1NJIGhvc3QgYWRhcHRlcnMgKElRLVBDSSwKKwkgIElRLVBDSS0xMCwgSVFfUENJLUQpIGV4Y2VwdCBmb3IgdGhlIFBDSS1iYXNpYyBjYXJkLiAgKFRoaXMgbGF0dGVyCisJICBjYXJkIGlzIHN1cHBvcnRlZCBieSB0aGUgIkFNNTMvNzlDOTc0IFBDSSBTQ1NJIiBkcml2ZXIuKQorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgbWFrZSBzdXJlIHRvIGNob29zZSAiQklPUyIgYXQgdGhlIHF1ZXN0aW9uICJQQ0kKKwkgIGFjY2VzcyBtb2RlIi4KKworCSAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zY3NpL3Fsb2dpY2lzcC50eHQ+LiAgWW91CisJICBzaG91bGQgYWxzbyByZWFkIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljaXNwLgorCisJICBUaGVzZSBkYXlzIHRoZSBoYXJkd2FyZSBpcyBhbHNvIHN1cHBvcnRlZCBieSB0aGUgbW9yZSBtb2Rlcm4gcWxhMTI4MAorCSAgZHJpdmVyLiAgSW4gZG91YnQgdXNlIHRoYXQgb25lIGluc3RlYWQgb2YgcWxvZ2ljaXNwLgorCitjb25maWcgU0NTSV9RTE9HSUNfRkMKKwl0cmlzdGF0ZSAiUWxvZ2ljIElTUCBGQyBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBRTG9naWMgSVNQMjEwMCBTQ1NJLUZDUCBob3N0IGFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHFsb2dpY2ZjLgorCitjb25maWcgU0NTSV9RTE9HSUNfRkNfRklSTVdBUkUKKwlib29sICJJbmNsdWRlIGxvYWRhYmxlIGZpcm13YXJlIGluIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNDU0lfUUxPR0lDX0ZDCisgIAloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIElTUDJYMDAgRmFicmljIEluaXRpYXRvci9UYXJnZXQgRmlybXdhcmUsIHdpdGgKKwkgIGV4cGFuZGVkIExVTiBhZGRyZXNzaW5nIGFuZCBGY1RhcGUgKEZDUC0yKSBzdXBwb3J0LCBpbiB0aGUKKwkgIHFsb2dpY2ZjIGRyaXZlci4gVGhpcyBpcyByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3Jtcy4KKworY29uZmlnIFNDU0lfUUxPR0lDXzEyODAKKwl0cmlzdGF0ZSAiUWxvZ2ljIFFMQSAxMjQwLzF4ODAvMXgxNjAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhIFFMb2dpYyBJU1AxMjQwLzF4ODAvMXgxNjAgU0NTSSBob3N0IGFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHFsYTEyODAuCisKK2NvbmZpZyBTQ1NJX1FMT0dJQ18xMjgwXzEwNDAKKwlib29sICJRbG9naWMgUUxBIDEwMjAvMTA0MCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1FMT0dJQ18xMjgwICYmIFNDU0lfUUxPR0lDX0lTUCE9eQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBRTG9naWMgSVNQMTAyMC8xMDQwIFNDU0kgaG9zdCBhZGFwdGVyIGFuZAorCSAgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBvbGQgZHJpdmVyLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGluCisJICB0aGUgcWxhMTI4MCBkcml2ZXIgZm9yIHRob3NlIGhvc3QgYWRhcHRlcnMuCisKK2NvbmZpZyBTQ1NJX1FMT0dJQ1BUSQorCXRyaXN0YXRlICJQVEkgUWxvZ2ljLCBJU1AgRHJpdmVyIgorCWRlcGVuZHMgb24gU0JVUyAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgU0JVUyBTQ1NJIGNvbnRyb2xsZXJzIGZyb20gUFRJIG9yIFFMb2dpYy4gVGhlc2UKKwkgIGNvbnRyb2xsZXJzIGFyZSBrbm93biB1bmRlciBTb2xhcmlzIGFzIHFwdGkgYW5kIGluIHRoZSBvcGVucHJvbSBhcworCSAgUFRJLHB0aXNwIG9yIFFMR0MsaXNwLiBOb3RlIHRoYXQgUENJIFFMb2dpYyBTQ1NJIGNvbnRyb2xsZXJzIGFyZQorCSAgZHJpdmVuIGJ5IGEgZGlmZmVyZW50IGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljcHRpLgorCitzb3VyY2UgImRyaXZlcnMvc2NzaS9xbGEyeHh4L0tjb25maWciCisKK2NvbmZpZyBTQ1NJX1NFQUdBVEUKKwl0cmlzdGF0ZSAiU2VhZ2F0ZSBTVC0wMiBhbmQgRnV0dXJlIERvbWFpbiBUTUMtOHh4IFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NiAmJiBJU0EgJiYgU0NTSSAmJiBCUk9LRU4KKwktLS1oZWxwLS0tCisJICBUaGVzZSBhcmUgOC1iaXQgU0NTSSBjb250cm9sbGVyczsgdGhlIFNULTAxIGlzIGFsc28gc3VwcG9ydGVkIGJ5CisJICB0aGlzIGRyaXZlci4gIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIDMuOSBvZiB0aGUgU0NTSS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBJZiBpdAorCSAgZG9lc24ndCB3b3JrIG91dCBvZiB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KKwkgIDxmaWxlOmRyaXZlcnMvc2NzaS9zZWFnYXRlLmg+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZWFnYXRlLgorCisjIGRlZmluaXRlbHkgbG9va3Mgbm90IDY0Yml0IHNhZmU6Citjb25maWcgU0NTSV9TSU03MTAKKwl0cmlzdGF0ZSAiU2ltcGxlIDUzYzcxMCBTQ1NJIHN1cHBvcnQgKENvbXBhcSwgTkNSIG1hY2hpbmVzKSIKKwlkZXBlbmRzIG9uIChFSVNBIHx8IE1DQSkgJiYgU0NTSQorCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGZvciBOQ1I1M2M3MTAgYmFzZWQgU0NTSSBob3N0IGFkYXB0ZXJzLgorCisJICBJdCBjdXJyZW50bHkgc3VwcG9ydHMgQ29tcGFxIEVJU0EgY2FyZHMgYW5kIE5DUiBNQ0EgY2FyZHMKKworY29uZmlnIDUzQzcwMF9JT19NQVBQRUQKKwlib29sCisJZGVwZW5kcyBvbiBTQ1NJX1NJTTcxMAorCWRlZmF1bHQgeQorCitjb25maWcgU0NTSV9TWU01M0M0MTYKKwl0cmlzdGF0ZSAiU3ltYmlvcyA1M2M0MTYgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBzeW01M2M0MTYgU0NTSSBob3N0IGFkYXB0ZXIsIHRoZSBTQ1NJCisJICBhZGFwdGVyIHRoYXQgY29tZXMgd2l0aCBzb21lIEhQIHNjYW5uZXJzLiBUaGlzIGRyaXZlciByZXF1aXJlcyB0aGF0CisJICB0aGUgc3ltNTNjNDE2IGlzIGNvbmZpZ3VyZWQgZmlyc3QgdXNpbmcgc29tZSBzb3J0IG9mIFBuUAorCSAgY29uZmlndXJhdGlvbiBwcm9ncmFtIChlLmcuIGlzYXBucCkgb3IgYnkgYSBQblAgYXdhcmUgQklPUy4gSWYgeW91CisJICBhcmUgdXNpbmcgaXNhcG5wIHRoZW4geW91IG5lZWQgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZQorCSAgYW5kIHRoZW4gbG9hZCBpdCB1c2luZyBpbnNtb2QgYWZ0ZXIgaXNhcG5wIGhhcyBydW4uIFRoZSBwYXJhbWV0ZXJzCisJICBvZiB0aGUgY29uZmlndXJlZCBjYXJkKHMpIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGRyaXZlci4gVGhlIGZvcm1hdAorCSAgaXM6CisKKwkgIGluc21vZCBzeW01M2M0MTYgc3ltNTNjNDE2PTxiYXNlPiw8aXJxPiBbc3ltNTNjNDE2XzE9PGJhc2U+LDxpcnE+XQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW01M2M0MTYuCisKK2NvbmZpZyBTQ1NJX0RDMzk1eAorCXRyaXN0YXRlICJUZWtyYW0gREMzOTUoVS9VVy9GKSBhbmQgREMzMTUoVSkgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgUENJIFNDU0kgaG9zdCBhZGFwdGVycyBiYXNlZCBvbiB0aGUgQVNJQworCSAgVFJNLVMxMDQwIGNoaXAsIGUuZyBUZWtyYW0gREMzOTUoVS9VVy9GKSBhbmQgREMzMTUoVSkgdmFyaWFudHMuCisKKwkgIFRoaXMgZHJpdmVyIHdvcmtzLCBidXQgaXMgc3RpbGwgaW4gZXhwZXJpbWVudGFsIHN0YXR1cy4gU28gYmV0dGVyCisJICBoYXZlIGEgYm9vdGFibGUgZGlzayBhbmQgYSBiYWNrdXAgaW4gY2FzZSBvZiBlbWVyZ2VuY3kuCisKKwkgIERvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9kYzM5NXgudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZGMzOTV4LgorCitjb25maWcgU0NTSV9EQzM5MFQKKwl0cmlzdGF0ZSAiVGVrcmFtIERDMzkwKFQpIGFuZCBBbTUzLzc5Qzk3NCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFBDSSBTQ1NJIGhvc3QgYWRhcHRlcnMgYmFzZWQgb24gdGhlIEFtNTNDOTc0QQorCSAgY2hpcCwgZS5nLiBUZWtyYW0gREMzOTAoVCksIERhd2lDb250cm9sIDI5NzQgYW5kIHNvbWUgb25ib2FyZAorCSAgUENzY3NpL1BDbmV0IChBbTUzLzc5Qzk3NCkgc29sdXRpb25zLgorCisJICBEb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvdG1zY3NpbS50eHQ+LgorCisJICBOb3RlIHRoYXQgdGhpcyBkcml2ZXIgZG9lcyBOT1Qgc3VwcG9ydCBUZWtyYW0gREMzOTBXL1UvRiwgd2hpY2ggYXJlCisJICBiYXNlZCBvbiBOQ1IvU3ltYmlvcyBjaGlwcy4gVXNlICJOQ1I1M0M4WFggU0NTSSBzdXBwb3J0IiBmb3IgdGhvc2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRtc2NzaW0uCisKK2NvbmZpZyBTQ1NJX1QxMjgKKwl0cmlzdGF0ZSAiVHJhbnRvciBUMTI4L1QxMjhGL1QyMjggU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGEgU0NTSSBob3N0IGFkYXB0ZXIuIEl0IGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uCisJICAzLjExIG9mIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL3QxMjguaD4uICBOb3RlIHRoYXQgVHJhbnRvciB3YXMgcHVyY2hhc2VkIGJ5CisJICBBZGFwdGVjLCBhbmQgc29tZSBmb3JtZXIgVHJhbnRvciBwcm9kdWN0cyBhcmUgYmVpbmcgc29sZCB1bmRlciB0aGUKKwkgIEFkYXB0ZWMgbmFtZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdDEyOC4KKworY29uZmlnIFNDU0lfVTE0XzM0RgorCXRyaXN0YXRlICJVbHRyYVN0b3IgMTRGLzM0RiBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBVbHRyYVN0b3IgMTRGIGFuZCAzNEYgU0NTSS0yIGhvc3QgYWRhcHRlcnMuCisJICBUaGUgc291cmNlIGF0IDxmaWxlOmRyaXZlcnMvc2NzaS91MTQtMzRmLmM+IGNvbnRhaW5zIHNvbWUKKwkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaGFyZHdhcmUuICBJZiB0aGUgZHJpdmVyIGRvZXNuJ3Qgd29yayBvdXQgb2YKKwkgIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6IGRyaXZlcnMvc2NzaS91MTQtMzRmLmM+LiAgUmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbworCSAgYW5vdGhlciBkcml2ZXIgZm9yIHRoZSBzYW1lIGhhcmR3YXJlOiAiVWx0cmFTdG9yIFNDU0kgc3VwcG9ydCIsCisJICBiZWxvdy4gIFlvdSBzaG91bGQgc2F5IFkgdG8gYm90aCBvbmx5IGlmIHlvdSB3YW50IDI0RiBzdXBwb3J0IGFzCisJICB3ZWxsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1MTQtMzRmLgorCitjb25maWcgU0NTSV9VMTRfMzRGX1RBR0dFRF9RVUVVRQorCWJvb2wgImVuYWJsZSB0YWdnZWQgY29tbWFuZCBxdWV1ZWluZyIKKwlkZXBlbmRzIG9uIFNDU0lfVTE0XzM0RgorCWhlbHAKKwkgIFRoaXMgaXMgYSBmZWF0dXJlIG9mIFNDU0ktMiB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZTogdGhlIGhvc3QKKwkgIGFkYXB0ZXIgY2FuIHNlbmQgc2V2ZXJhbCBTQ1NJIGNvbW1hbmRzIHRvIGEgZGV2aWNlJ3MgcXVldWUgZXZlbiBpZgorCSAgcHJldmlvdXMgY29tbWFuZHMgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQuCisJICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJ1MTQtMzRmPXRjOnkiIGJvb3Qgb3B0aW9uLgorCitjb25maWcgU0NTSV9VMTRfMzRGX0xJTktFRF9DT01NQU5EUworCWJvb2wgImVuYWJsZSBlbGV2YXRvciBzb3J0aW5nIgorCWRlcGVuZHMgb24gU0NTSV9VMTRfMzRGCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBlbGV2YXRvciBzb3J0aW5nIGZvciBhbGwgcHJvYmVkIFNDU0kgZGlza3MgYW5kCisJICBDRC1ST01zLiBJdCBkZWZpbml0ZWx5IHJlZHVjZXMgdGhlIGF2ZXJhZ2Ugc2VlayBkaXN0YW5jZSB3aGVuIGRvaW5nCisJICByYW5kb20gc2Vla3MsIGJ1dCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlc3VsdCBpbiBhIG5vdGljZWFibGUKKwkgIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuLi4KKwkgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgInUxNC0zNGY9bGM6eSIgYm9vdCBvcHRpb24uCisKK2NvbmZpZyBTQ1NJX1UxNF8zNEZfTUFYX1RBR1MKKwlpbnQgIm1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBjb21tYW5kcyIKKwlkZXBlbmRzIG9uIFNDU0lfVTE0XzM0RgorCWRlZmF1bHQgIjgiCisJaGVscAorCSAgVGhpcyBzcGVjaWZpZXMgaG93IG1hbnkgU0NTSSBjb21tYW5kcyBjYW4gYmUgbWF4aW1hbGx5IHF1ZXVlZCBmb3IKKwkgIGVhY2ggcHJvYmVkIFNDU0kgZGV2aWNlLiBZb3Ugc2hvdWxkIHJlZHVjZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiA4CisJICBvbmx5IGlmIHlvdSBoYXZlIGRpc2tzIHdpdGggYnVnZ3kgb3IgbGltaXRlZCB0YWdnZWQgY29tbWFuZCBzdXBwb3J0LgorCSAgTWluaW11bSBpcyAyIGFuZCBtYXhpbXVtIGlzIDE0LiBUaGlzIHZhbHVlIGlzIGFsc28gdGhlIHdpbmRvdyBzaXplCisJICB1c2VkIGJ5IHRoZSBlbGV2YXRvciBzb3J0aW5nIG9wdGlvbiBhYm92ZS4gVGhlIGVmZmVjdGl2ZSB2YWx1ZSB1c2VkCisJICBieSB0aGUgZHJpdmVyIGZvciBlYWNoIHByb2JlZCBTQ1NJIGRldmljZSBpcyByZXBvcnRlZCBhdCBib290IHRpbWUuCisJICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJ1MTQtMzRmPW1xOjgiIGJvb3Qgb3B0aW9uLgorCitjb25maWcgU0NTSV9VTFRSQVNUT1IKKwl0cmlzdGF0ZSAiVWx0cmFTdG9yIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NiAmJiBJU0EgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhU3RvciAxNEYsIDI0RiBhbmQgMzRGIFNDU0ktMiBob3N0CisJICBhZGFwdGVyIGZhbWlseS4gIFRoaXMgZHJpdmVyIGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIDMuMTIgb2YgdGhlCisJICBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIElmIGl0IGRvZXNuJ3Qgd29yayBvdXQKKwkgIG9mIHRoZSBib3gsIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2Ugc29tZSBzZXR0aW5ncyBpbgorCSAgPGZpbGU6ZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5oPi4KKworCSAgTm90ZSB0aGF0IHRoZXJlIGlzIGFsc28gYW5vdGhlciBkcml2ZXIgZm9yIHRoZSBzYW1lIGhhcmR3YXJlOgorCSAgIlVsdHJhU3RvciAxNEYvMzRGIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdWx0cmFzdG9yLgorCitjb25maWcgU0NTSV9OU1AzMgorCXRyaXN0YXRlICJXb3JrYml0IE5pbmphU0NTSS0zMkJpL1VERSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgITY0QklUCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgV29ya2JpdCBOaW5qYVNDU0ktMzJCaS9VREUgUENJL0NhcmRidXMKKwkgIFNDU0kgaG9zdCBhZGFwdGVyLiBQbGVhc2UgcmVhZCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5zcDMyLgorCitjb25maWcgU0NTSV9ERUJVRworCXRyaXN0YXRlICJTQ1NJIGRlYnVnZ2luZyBob3N0IHNpbXVsYXRvciIKKwlkZXBlbmRzIG9uIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIGEgaG9zdCBhZGFwdGVyIHNpbXVsYXRvciB0aGF0IGNhbiBzaW11bGF0ZSBtdWx0aXBsZSBob3N0cworCSAgZWFjaCB3aXRoIG11bHRpcGxlIGR1bW15IFNDU0kgZGV2aWNlcyAoZGlza3MpLiBJdCBkZWZhdWx0cyB0byBvbmUKKwkgIGhvc3QgYWRhcHRlciB3aXRoIG9uZSBkdW1teSBTQ1NJIGRpc2suIEVhY2ggZHVtbXkgZGlzayB1c2VzIGtlcm5lbAorCSAgUkFNIGFzIHN0b3JhZ2UgKGkuZS4gaXQgaXMgYSByYW1kaXNrKS4gVG8gc2F2ZSBzcGFjZSB3aGVuIG11bHRpcGxlCisJICBkdW1teSBkaXNrcyBhcmUgc2ltdWxhdGVkLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGtlcm5lbCBSQU0gZm9yIAorCSAgdGhlaXIgc3RvcmFnZS4gU2VlIDxodHRwOi8vd3d3LnRvcnF1ZS5uZXQvc2cvc2RlYnVnLmh0bWw+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4gVGhpcyBkcml2ZXIgaXMgcHJpbWFyaWx5IG9mIHVzZSB0byB0aG9zZSB0ZXN0aW5nIHRoZQorCSAgU0NTSSBhbmQgYmxvY2sgc3Vic3lzdGVtcy4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfTUVTSAorCXRyaXN0YXRlICJNRVNIIChQb3dlciBNYWMgaW50ZXJuYWwgU0NTSSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQzMyICYmIFBQQ19QTUFDICYmIFNDU0kKKwloZWxwCisJICBNYW55IFBvd2VyIE1hY2ludG9zaGVzIGFuZCBjbG9uZXMgaGF2ZSBhIE1FU0ggKE1hY2ludG9zaCBFbmhhbmNlZAorCSAgU0NTSSBIYXJkd2FyZSkgU0NTSSBidXMgYWRhcHRvciAodGhlIDcyMDAgZG9lc24ndCwgYnV0IGFsbCBvZiB0aGUKKwkgIG90aGVyIFBvd2VyIE1hY2ludG9zaGVzIGRvKS4gU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGlzIFNDU0kKKwkgIGFkYXB0b3IuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1lc2guCisKK2NvbmZpZyBTQ1NJX01FU0hfU1lOQ19SQVRFCisJaW50ICJtYXhpbXVtIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJhdGUgKE1CL3MpICgwID0gYXN5bmMpIgorCWRlcGVuZHMgb24gU0NTSV9NRVNICisJZGVmYXVsdCAiNSIKKwloZWxwCisJICBPbiBQb3dlciBNYWNpbnRvc2hlcyAoYW5kIGNsb25lcykgd2hlcmUgdGhlIE1FU0ggU0NTSSBidXMgYWRhcHRvcgorCSAgZHJpdmVzIGEgYnVzIHdoaWNoIGlzIGVudGlyZWx5IGludGVybmFsIHRvIHRoZSBtYWNoaW5lIChzdWNoIGFzIHRoZQorCSAgNzUwMCwgNzYwMCwgODUwMCwgZXRjLiksIHRoZSBNRVNIIGlzIGNhcGFibGUgb2Ygc3luY2hyb25vdXMKKwkgIG9wZXJhdGlvbiBhdCB1cCB0byAxMCBNQi9zLiBPbiBtYWNoaW5lcyB3aGVyZSB0aGUgU0NTSSBidXMKKwkgIGNvbnRyb2xsZWQgYnkgdGhlIE1FU0ggY2FuIGhhdmUgZXh0ZXJuYWwgZGV2aWNlcyBjb25uZWN0ZWQsIGl0IGlzCisJICB1c3VhbGx5IHJhdGVkIGF0IDUgTUIvcy4gNSBpcyBhIHNhZmUgdmFsdWUgaGVyZSB1bmxlc3MgeW91IGtub3cgdGhlCisJICBNRVNIIFNDU0kgYnVzIGlzIGludGVybmFsIG9ubHk7IGluIHRoYXQgY2FzZSB5b3UgY2FuIHNheSAxMC4gU2F5IDAKKwkgIHRvIGRpc2FibGUgc3luY2hyb25vdXMgb3BlcmF0aW9uLgorCitjb25maWcgU0NTSV9NRVNIX1JFU0VUX0RFTEFZX01TCisJaW50ICJpbml0aWFsIGJ1cyByZXNldCBkZWxheSAobXMpICgwID0gbm8gcmVzZXQpIgorCWRlcGVuZHMgb24gU0NTSV9NRVNICisJZGVmYXVsdCAiNDAwMCIKKworY29uZmlnIFNDU0lfTUFDNTNDOTQKKwl0cmlzdGF0ZSAiNTNDOTQgKFBvd2VyIE1hYyBleHRlcm5hbCBTQ1NJKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDMzIgJiYgUFBDX1BNQUMgJiYgU0NTSQorCWhlbHAKKwkgIE9uIFBvd2VyIE1hY2ludG9zaGVzIChhbmQgY2xvbmVzKSB3aXRoIHR3byBTQ1NJIGJ1c2VzLCB0aGUgZXh0ZXJuYWwKKwkgIFNDU0kgYnVzIGlzIHVzdWFsbHkgY29udHJvbGxlZCBieSBhIDUzQzk0IFNDU0kgYnVzIGFkYXB0b3IuIE9sZGVyCisJICBtYWNoaW5lcyB3aGljaCBvbmx5IGhhdmUgb25lIFNDU0kgYnVzLCBzdWNoIGFzIHRoZSA3MjAwLCBhbHNvIHVzZQorCSAgdGhlIDUzQzk0LiBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSA1M0M5NC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWFjNTNjOTQuCisKK3NvdXJjZSAiZHJpdmVycy9zY3NpL2FybS9LY29uZmlnIgorCitjb25maWcgSkFaWl9FU1AKKwlib29sICJNSVBTIEpBWlogRkFTMjE2IFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1BQ0hfSkFaWiAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgb25ib2FyZCBTQ1NJIGhvc3QgYWRhcHRlciBvZiBNSVBTIE1hZ251bQorCSAgNDAwMCwgQWNlciBQSUNBLCBPbGl2ZXR0aSBNNzAwLTEwIGFuZCBhIGZldyBvdGhlciBpZGVudGljYWwgT0VNCisJICBzeXN0ZW1zLgorCitjb25maWcgQTMwMDBfU0NTSQorCXRyaXN0YXRlICJBMzAwMCBXRDMzQzkzQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQU1JR0EgJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIDMwMDAgYW5kIGhhdmUgU0NTSSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUKKwkgIGJ1aWx0LWluIFNDU0kgY29udHJvbGxlciwgc2F5IFkuIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdkMzNjOTMuCisKK2NvbmZpZyBBMjA5MV9TQ1NJCisJdHJpc3RhdGUgIkEyMDkxL0E1OTAgV0QzM0M5M0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFpPUlJPICYmIFNDU0kKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIENvbW1vZG9yZSBBMjA5MSBTQ1NJIGNvbnRyb2xsZXIsIHNheSBZLiBPdGhlcndpc2UsCisJICBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2QzM2M5My4KKworY29uZmlnIEdWUDExX1NDU0kKKwl0cmlzdGF0ZSAiR1ZQIFNlcmllcyBJSSBXRDMzQzkzQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgR3JlYXQgVmFsbGV5IFByb2R1Y3RzIFNlcmllcyBJSSBTQ1NJIGNvbnRyb2xsZXIsCisJICBhbnN3ZXIgWS4gQWxzbyBzYXkgWSBpZiB5b3UgaGF2ZSBhIGxhdGVyIG1vZGVsIG9mIEdWUCBTQ1NJCisJICBjb250cm9sbGVyIChzdWNoIGFzIHRoZSBHVlAgQTQwMDggb3IgYSBDb21ibyBib2FyZCkuIE90aGVyd2lzZSwKKwkgIGFuc3dlciBOLiBUaGlzIGRyaXZlciBkb2VzIE5PVCB3b3JrIGZvciB0aGUgVC1SZXggc2VyaWVzIG9mCisJICBhY2NlbGVyYXRvcnMgZnJvbSBUZWtNYWdpYyBhbmQgR1ZQLU0uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGd2cDExLgorCitjb25maWcgQ1lCRVJTVE9STV9TQ1NJCisJdHJpc3RhdGUgIkN5YmVyU3Rvcm0gU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIHdpdGggYW4gb3JpZ2luYWwgKE1rSSkgUGhhc2U1IEN5YmVyc3Rvcm0KKwkgIGFjY2VsZXJhdG9yIGJvYXJkIGFuZCB0aGUgb3B0aW9uYWwgQ3liZXJzdG9ybSBTQ1NJIGNvbnRyb2xsZXIsCisJICBhbnN3ZXIgWS4gT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIENZQkVSU1RPUk1JSV9TQ1NJCisJdHJpc3RhdGUgIkN5YmVyU3Rvcm0gTWsgSUkgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIHdpdGggYSBQaGFzZTUgQ3liZXJzdG9ybSBNa0lJIGFjY2VsZXJhdG9yIGJvYXJkCisJICBhbmQgdGhlIG9wdGlvbmFsIEN5YmVyc3Rvcm0gU0NTSSBjb250cm9sbGVyLCBzYXkgWS4gT3RoZXJ3aXNlLAorCSAgYW5zd2VyIE4uCisKK2NvbmZpZyBCTFoyMDYwX1NDU0kKKwl0cmlzdGF0ZSAiQmxpenphcmQgMjA2MCBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBaT1JSTyAmJiBTQ1NJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQW1pZ2Egd2l0aCBhIFBoYXNlNSBCbGl6emFyZCAyMDYwIGFjY2VsZXJhdG9yIGJvYXJkCisJICBhbmQgd2FudCB0byB1c2UgdGhlIG9uYm9hcmQgU0NTSSBjb250cm9sbGVyLCBzYXkgWS4gT3RoZXJ3aXNlLAorCSAgYW5zd2VyIE4uCisKK2NvbmZpZyBCTFoxMjMwX1NDU0kKKwl0cmlzdGF0ZSAiQmxpenphcmQgMTIzMElWLzEyNjAgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIDEyMDAgd2l0aCBhIFBoYXNlNSBCbGl6emFyZCAxMjMwSVYgb3IgQmxpenphcmQKKwkgIDEyNjAgYWNjZWxlcmF0b3IsIGFuZCB0aGUgb3B0aW9uYWwgU0NTSSBtb2R1bGUsIHNheSBZLiBPdGhlcndpc2UsCisJICBzYXkgTi4KKworY29uZmlnIEZBU1RMQU5FX1NDU0kKKwl0cmlzdGF0ZSAiRmFzdGxhbmUgU0NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIHRoZSBQaGFzZTUgRmFzdGxhbmUgWjMgU0NTSSBjb250cm9sbGVyLCBvciBwbGFuIHRvIHVzZQorCSAgb25lIGluIHRoZSBuZWFyIGZ1dHVyZSwgc2F5IFkgdG8gdGhpcyBxdWVzdGlvbi4gT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfQU1JR0E3WFgKKwlib29sICJBbWlnYSBOQ1I1M2M3MTAgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQU1JR0EgJiYgU0NTSSAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdmFyaW91cyBOQ1I1M2M3MTAtYmFzZWQgU0NTSSBjb250cm9sbGVycyBvbiB0aGUgQW1pZ2EuCisJICBUaGlzIGluY2x1ZGVzOgorCSAgICAtIHRoZSBidWlsdGluIFNDU0kgY29udHJvbGxlciBvbiB0aGUgQW1pZ2EgNDAwMFQsCisJICAgIC0gdGhlIEFtaWdhIDQwOTEgWm9ycm8gSUlJIFNDU0ktMiBjb250cm9sbGVyLAorCSAgICAtIHRoZSBNYWNyb1N5c3RlbSBEZXZlbG9wbWVudCdzIFdhcnBFbmdpbmUgQW1pZ2EgU0NTSS0yIGNvbnRyb2xsZXIKKwkgICAgICAoaW5mbyBhdAorCSAgICAgIDxodHRwOi8vd3d3Lmx5c2F0b3IubGl1LnNlL2FtaWdhL2FyL2d1aWRlL2FyMzEwLmd1aWRlP0ZFQVRVUkU1PiksCisJICAgIC0gdGhlIFNDU0kgY29udHJvbGxlciBvbiB0aGUgUGhhc2U1IEJsaXp6YXJkIFBvd2VyVVAgNjAzZSsKKwkgICAgICBhY2NlbGVyYXRvciBjYXJkIGZvciB0aGUgQW1pZ2EgMTIwMCwKKwkgICAgLSB0aGUgU0NTSSBjb250cm9sbGVyIG9uIHRoZSBHVlAgVHVyYm8gMDQwLzA2MCBhY2NlbGVyYXRvci4KKwkgIE5vdGUgdGhhdCBhbGwgb2YgdGhlIGFib3ZlIFNDU0kgY29udHJvbGxlcnMsIGV4Y2VwdCBmb3IgdGhlIGJ1aWx0aW4KKwkgIFNDU0kgY29udHJvbGxlciBvbiB0aGUgQW1pZ2EgNDAwMFQsIHJlc2lkZSBvbiB0aGUgWm9ycm8gZXhwYW5zaW9uCisJICBidXMsIHNvIHlvdSBhbHNvIGhhdmUgdG8gZW5hYmxlIFpvcnJvIGJ1cyBzdXBwb3J0IGlmIHlvdSB3YW50IHRvIHVzZQorCSAgdGhlbS4KKworY29uZmlnIE9LVEFHT05fU0NTSQorCXRyaXN0YXRlICJCU0MgT2t0YWdvbiBTQ1NJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBaT1JSTyAmJiBTQ1NJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBoYXZlIHRoZSBCU0MgT2t0YWdvbiBTQ1NJIGRpc2sgY29udHJvbGxlciBmb3IgdGhlIEFtaWdhLCBzYXkKKwkgIFkgdG8gdGhpcyBxdWVzdGlvbi4gIElmIHlvdSdyZSBpbiBkb3VidCBhYm91dCB3aGV0aGVyIHlvdSBoYXZlIG9uZSwKKwkgIHNlZSB0aGUgcGljdHVyZSBhdAorCSAgPGh0dHA6Ly9hbWlnYS5yZXNvdXJjZS5jeC9leHAvc2VhcmNoLnBsP3Byb2R1Y3Q9b2t0YWdvbj4uCisKK2NvbmZpZyBBVEFSSV9TQ1NJCisJdHJpc3RhdGUgIkF0YXJpIG5hdGl2ZSBTQ1NJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVEFSSSAmJiBTQ1NJICYmIEJST0tFTgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGFuIEF0YXJpIHdpdGggYnVpbHQtaW4gTkNSNTM4MCBTQ1NJIGNvbnRyb2xsZXIgKFRULAorCSAgRmFsY29uLCAuLi4pIHNheSBZIHRvIGdldCBpdCBzdXBwb3J0ZWQuIE9mIGNvdXJzZSBhbHNvLCBpZiB5b3UgaGF2ZQorCSAgYSBjb21wYXRpYmxlIFNDU0kgY29udHJvbGxlciAoZS5nLiBmb3IgTWVkdXNhKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXRhcmlfc2NzaS4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgYm90aCBzdHlsZXMgb2YgTkNSIGludGVncmF0aW9uIGludG8gdGhlCisJICBzeXN0ZW06IHRoZSBUVCBzdHlsZSAoc2VwYXJhdGUgRE1BKSwgYW5kIHRoZSBGYWxjb24gc3R5bGUgKHZpYQorCSAgU1QtRE1BLCByZXBsYWNpbmcgQUNTSSkuICBJdCBkb2VzIE5PVCBzdXBwb3J0IG90aGVyIHNjaGVtZXMsIGxpa2UKKwkgIGluIHRoZSBIYWRlcyAod2l0aG91dCBETUEpLgorCitjb25maWcgQVRBUklfU0NTSV9UT1NISUJBX0RFTEFZCisJYm9vbCAiTG9uZyBkZWxheXMgZm9yIFRvc2hpYmEgQ0QtUk9NcyIKKwlkZXBlbmRzIG9uIEFUQVJJX1NDU0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpbmNyZWFzZXMgdGhlIGRlbGF5IGFmdGVyIGEgU0NTSSBhcmJpdHJhdGlvbiB0bworCSAgYWNjb21tb2RhdGUgc29tZSBmbGFreSBUb3NoaWJhIENELVJPTSBkcml2ZXMuIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8KKwkgIHVzZSBhIFRvc2hpYmEgQ0QtUk9NIGRyaXZlOyBvdGhlcndpc2UsIHRoZSBvcHRpb24gaXMgbm90IG5lZWRlZCBhbmQKKwkgIHdvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSBhIGJpdCwgc28gc2F5IE4uCisKK2NvbmZpZyBBVEFSSV9TQ1NJX1JFU0VUX0JPT1QKKwlib29sICJSZXNldCBTQ1NJLWRldmljZXMgYXQgYm9vdHRpbWUiCisJZGVwZW5kcyBvbiBBVEFSSV9TQ1NJCisJaGVscAorCSAgUmVzZXQgdGhlIGRldmljZXMgb24geW91ciBBdGFyaSB3aGVuZXZlciBpdCBib290cy4gIFRoaXMgbWFrZXMgdGhlCisJICBib290IHByb2Nlc3MgZnJhY3Rpb25hbGx5IGxvbmdlciBidXQgbWF5IGFzc2lzdCByZWNvdmVyeSBmcm9tIGVycm9ycworCSAgdGhhdCBsZWF2ZSB0aGUgZGV2aWNlcyB3aXRoIFNDU0kgb3BlcmF0aW9ucyBwYXJ0d2F5IGNvbXBsZXRlZC4KKworY29uZmlnIFRUX0RNQV9FTVVMCisJYm9vbCAiSGFkZXMgU0NTSSBETUEgZW11bGF0b3IiCisJZGVwZW5kcyBvbiBBVEFSSV9TQ1NJICYmIEhBREVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBjb2RlIHdoaWNoIGVtdWxhdGVzIHRoZSBUVCBTQ1NJIERNQSBjaGlwIG9uIHRoZQorCSAgSGFkZXMuIFRoaXMgaW5jcmVhc2VzIHRoZSBTQ1NJIHRyYW5zZmVyIHJhdGVzIGF0IGxlYXN0IHRlbiB0aW1lcworCSAgY29tcGFyZWQgdG8gUElPIHRyYW5zZmVycy4KKworY29uZmlnIE1BQ19TQ1NJCisJYm9vbCAiTWFjaW50b3NoIE5DUjUzODAgU0NTSSIKKwlkZXBlbmRzIG9uIE1BQyAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBpcyB0aGUgTkNSIDUzODAgU0NTSSBjb250cm9sbGVyIGluY2x1ZGVkIG9uIG1vc3Qgb2YgdGhlIDY4MDMwCisJICBiYXNlZCBNYWNpbnRvc2hlcy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0NTSV9NQUNfRVNQCisJdHJpc3RhdGUgIk1hY2ludG9zaCBOQ1I1M2M5WzQ2XSBTQ1NJIgorCWRlcGVuZHMgb24gTUFDICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHRoZSBOQ1IgNTNjOXggU0NTSSBjb250cm9sbGVyIGZvdW5kIG9uIG1vc3Qgb2YgdGhlIDY4MDQwCisJICBiYXNlZCBNYWNpbnRvc2hlcy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYWNfZXNwLgorCitjb25maWcgTVZNRTE0N19TQ1NJCisJYm9vbCAiV0QzM0M5MyBTQ1NJIGRyaXZlciBmb3IgTVZNRTE0NyIKKwlkZXBlbmRzIG9uIE1WTUUxNDcgJiYgU0NTSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBvbi1ib2FyZCBTQ1NJIGNvbnRyb2xsZXIgb24gdGhlIE1vdG9yb2xhIE1WTUUxNDcKKwkgIHNpbmdsZS1ib2FyZCBjb21wdXRlci4KKworY29uZmlnIE1WTUUxNnhfU0NTSQorCWJvb2wgIk5DUjUzQzcxMCBTQ1NJIGRyaXZlciBmb3IgTVZNRTE2eCIKKwlkZXBlbmRzIG9uIE1WTUUxNnggJiYgU0NTSSAmJiBCUk9LRU4KKwloZWxwCisJICBUaGUgTW90b3JvbGEgTVZNRTE2MiwgMTY2LCAxNjcsIDE3MiBhbmQgMTc3IGJvYXJkcyB1c2UgdGhlIE5DUjUzQzcxMAorCSAgU0NTSSBjb250cm9sbGVyIGNoaXAuICBBbG1vc3QgZXZlcnlvbmUgdXNpbmcgb25lIG9mIHRoZXNlIGJvYXJkcworCSAgd2lsbCB3YW50IHRvIHNheSBZIHRvIHRoaXMgcXVlc3Rpb24uCisKK2NvbmZpZyBCVk1FNjAwMF9TQ1NJCisJYm9vbCAiTkNSNTNDNzEwIFNDU0kgZHJpdmVyIGZvciBCVk1FNjAwMCIKKwlkZXBlbmRzIG9uIEJWTUU2MDAwICYmIFNDU0kgJiYgQlJPS0VOCisJaGVscAorCSAgVGhlIEJWTUU0MDAwIGFuZCBCVk1FNjAwMCBib2FyZHMgZnJvbSBCVk0gTHRkIHVzZSB0aGUgTkNSNTNDNzEwCisJICBTQ1NJIGNvbnRyb2xsZXIgY2hpcC4gIEFsbW9zdCBldmVyeW9uZSB1c2luZyBvbmUgb2YgdGhlc2UgYm9hcmRzCisJICB3aWxsIHdhbnQgdG8gc2F5IFkgdG8gdGhpcyBxdWVzdGlvbi4KKworY29uZmlnIFNDU0lfTkNSNTNDN3h4X0ZBU1QKKwlib29sICJhbGxvdyBGQVNULVNDU0kgWzEwTUh6XSIKKwlkZXBlbmRzIG9uIFNDU0lfQU1JR0E3WFggfHwgTVZNRTE2eF9TQ1NJIHx8IEJWTUU2MDAwX1NDU0kKKwloZWxwCisJICBUaGlzIHdpbGwgZW5hYmxlIDEwTUh6IEZBU1QtU0NTSSB0cmFuc2ZlcnMgd2l0aCB5b3VyIGhvc3QKKwkgIGFkYXB0ZXIuIFNvbWUgc3lzdGVtcyBoYXZlIHByb2JsZW1zIHdpdGggdGhhdCBzcGVlZCwgc28gaXQncyBzYWZlc3QKKwkgIHRvIHNheSBOIGhlcmUuCisKK2NvbmZpZyBTVU4zX1NDU0kKKwl0cmlzdGF0ZSAiU3VuMyBOQ1I1MzgwIFNDU0kiCisJZGVwZW5kcyBvbiBTVU4zICYmIFNDU0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgT0JJTyAob25ib2FyZCBpbykgTkNSNTM4MAorCSAgU0NTSSBjb250cm9sbGVyIGZvdW5kIGluIHRoZSBTdW4gMy81MCBhbmQgMy82MCwgYXMgd2VsbCBhcyBmb3IKKwkgICJTdW4zIiB0eXBlIFZNRSBzY3NpIGNvbnRyb2xsZXJzIGFsc28gYmFzZWQgb24gdGhlIE5DUjUzODAuCisJICBHZW5lcmFsIExpbnV4IGluZm9ybWF0aW9uIG9uIHRoZSBTdW4gMyBzZXJpZXMgKG5vdyBkaXNjb250aW51ZWQpCisJICBpcyBhdCA8aHR0cDovL3d3dy5hbmdlbGZpcmUuY29tL2NhMi90ZWNoNjhrL3N1bjMuaHRtbD4uCisKK2NvbmZpZyBTVU4zWF9FU1AKKwlib29sICJTdW4zeCBFU1AgU0NTSSIKKwlkZXBlbmRzIG9uIFNVTjNYICYmIFNDU0kKKwloZWxwCisJICBUaGUgRVNQIHdhcyBhbiBvbi1ib2FyZCBTQ1NJIGNvbnRyb2xsZXIgdXNlZCBvbiBTdW4gMy84MAorCSAgbWFjaGluZXMuICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgaXQuCisKK2NvbmZpZyBTQ1NJX1NVTkVTUAorCXRyaXN0YXRlICJTcGFyYyBFU1AgU2NzaSBEcml2ZXIiCisJZGVwZW5kcyBvbiBTQlVTICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBTdW4gRVNQIFNDU0kgaG9zdCBhZGFwdGVyLiBUaGUgRVNQCisJICBjaGlwc2V0IGlzIHByZXNlbnQgaW4gbW9zdCBTUEFSQyBTQlVTLWJhc2VkIGNvbXB1dGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXNwLgorCisjICAgICAgYm9vbCAnQ3liZXJzdG9ybSBNayBJSUkgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpJyBDT05GSUdfQ1lCRVJTVE9STUlJSV9TQ1NJCisKK2NvbmZpZyBaRkNQCisJdHJpc3RhdGUgIkZDUCBob3N0IGJ1cyBhZGFwdGVyIGRyaXZlciBmb3IgSUJNIGVTZXJ2ZXIgelNlcmllcyIKKwlkZXBlbmRzIG9uIEFSQ0hfUzM5MCAmJiBRRElPICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9GQ19BVFRSUworCWhlbHAKKyAgICAgICAgICBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgU0NTSSBkZXZpY2VzIGF0dGFjaGVkIHRvIHlvdXIgSUJNIGVTZXJ2ZXIKKyAgICAgICAgICB6U2VyaWVzIGJ5IG1lYW5zIG9mIEZpYnJlIENoYW5uZWwgaW50ZXJmYWNlcyBzYXkgWS4KKyAgICAgICAgICBGb3IgZGV0YWlscyBwbGVhc2UgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgYnkgSUJNIGF0CisgICAgICAgICAgPGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpbnV4MzkwPgorCisgICAgICAgICAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuIFRoaXMgbW9kdWxlIHdpbGwgYmUKKyAgICAgICAgICBjYWxsZWQgemZjcC4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZQorICAgICAgICAgIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LgorCitlbmRtZW51CisKK3NvdXJjZSAiZHJpdmVycy9zY3NpL3BjbWNpYS9LY29uZmlnIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmY2VlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtMCwwICsxLDE4NCBAQAorIworIyBNYWtlZmlsZSBmb3IgbGludXgvZHJpdmVycy9zY3NpCisjCisjIDMwIE1heSAyMDAwLCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIworIyAyMCBTZXAgMjAwMCwgVG9yYmVuIE1hdGhpYXNlbiA8dG1tQGltYWdlLmRrPgorIyBDaGFuZ2VkIGxpbmsgb3JkZXIgdG8gcmVmbGVjdCBuZXcgc2NzaSBpbml0aWFsaXphdGlvbi4KKyMKKyMgKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqIQorIyBUaGUgbGluayBvcmRlciBtdXN0IGJlLCBTQ1NJIENvcmUsIFNDU0kgSEJBIGRyaXZlcnMsIGFuZAorIyBsYXN0bHkgU0NTSSBwZXJpcGhlcmFsIGRyaXZlcnMgKGRpc2svdGFwZS9jZHJvbS9ldGMuKSB0bworIyBzYXRpc2Z5IGNlcnRhaW4gaW5pdGlhbGl6YXRpb24gYXNzdW1wdGlvbnMgaW4gdGhlIFNDU0kgbGF5ZXIuCisjICohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEqISohKiEKKworCitDRkxBR1NfYWhhMTUyeC5vID0gICAtREFIQTE1MlhfU1RBVCAtREFVVE9DT05GCitDRkxBR1NfZ2R0aC5vICAgID0gIyAtRERFQlVHX0dEVEg9MiAtRF9fU0VSSUFMX18gLURfX0NPTTJfXyAtREdEVEhfU1RBVElTVElDUworQ0ZMQUdTX3NlYWdhdGUubyA9ICAgLURBUkJJVFJBVEUgLURQQVJJVFkgLURTRUFHQVRFX1VTRV9BU00KKworc3ViZGlyLSQoQ09ORklHX1BDTUNJQSkJCSs9IHBjbWNpYQorCitvYmotJChDT05GSUdfU0NTSSkJCSs9IHNjc2lfbW9kLm8KKworIyAtLS0gTk9URSBPUkRFUklORyBIRVJFIC0tLQorIyBGb3Iga2VybmVsIG5vbi1tb2R1bGFyIGxpbmssIHRyYW5zcG9ydCBhdHRyaWJ1dGVzIG5lZWQgdG8KKyMgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGRyaXZlcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK29iai0kKENPTkZJR19TQ1NJX1NQSV9BVFRSUykJKz0gc2NzaV90cmFuc3BvcnRfc3BpLm8KK29iai0kKENPTkZJR19TQ1NJX0ZDX0FUVFJTKSAJKz0gc2NzaV90cmFuc3BvcnRfZmMubworb2JqLSQoQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMpCSs9IHNjc2lfdHJhbnNwb3J0X2lzY3NpLm8KKworb2JqLSQoQ09ORklHX1NDU0lfQU1JR0E3WFgpCSs9IGFtaWdhN3h4Lm8JNTNjN3h4Lm8KK29iai0kKENPTkZJR19BMzAwMF9TQ1NJKQkrPSBhMzAwMC5vCXdkMzNjOTMubworb2JqLSQoQ09ORklHX0EyMDkxX1NDU0kpCSs9IGEyMDkxLm8Jd2QzM2M5My5vCitvYmotJChDT05GSUdfR1ZQMTFfU0NTSSkJKz0gZ3ZwMTEubwl3ZDMzYzkzLm8KK29iai0kKENPTkZJR19NVk1FMTQ3X1NDU0kpCSs9IG12bWUxNDcubwl3ZDMzYzkzLm8KK29iai0kKENPTkZJR19TR0lXRDkzX1NDU0kpCSs9IHNnaXdkOTMubwl3ZDMzYzkzLm8KK29iai0kKENPTkZJR19DWUJFUlNUT1JNX1NDU0kpCSs9IE5DUjUzQzl4Lm8JY3liZXJzdG9ybS5vCitvYmotJChDT05GSUdfQ1lCRVJTVE9STUlJX1NDU0kpCSs9IE5DUjUzQzl4Lm8JY3liZXJzdG9ybUlJLm8KK29iai0kKENPTkZJR19CTFoyMDYwX1NDU0kpCSs9IE5DUjUzQzl4Lm8JYmx6MjA2MC5vCitvYmotJChDT05GSUdfQkxaMTIzMF9TQ1NJKQkrPSBOQ1I1M0M5eC5vCWJsejEyMzAubworb2JqLSQoQ09ORklHX0ZBU1RMQU5FX1NDU0kpCSs9IE5DUjUzQzl4Lm8JZmFzdGxhbmUubworb2JqLSQoQ09ORklHX09LVEFHT05fU0NTSSkJKz0gTkNSNTNDOXgubwlva3RhZ29uX2VzcC5vCW9rdGFnb25faW8ubworb2JqLSQoQ09ORklHX0FUQVJJX1NDU0kpCSs9IGF0YXJpX3Njc2kubworb2JqLSQoQ09ORklHX01BQ19TQ1NJKQkJKz0gbWFjX3Njc2kubworb2JqLSQoQ09ORklHX1NDU0lfTUFDX0VTUCkJKz0gbWFjX2VzcC5vCU5DUjUzQzl4Lm8KK29iai0kKENPTkZJR19TVU4zX1NDU0kpCQkrPSBzdW4zX3Njc2kubyAgc3VuM19zY3NpX3ZtZS5vCitvYmotJChDT05GSUdfTVZNRTE2eF9TQ1NJKQkrPSBtdm1lMTZ4Lm8JNTNjN3h4Lm8KK29iai0kKENPTkZJR19CVk1FNjAwMF9TQ1NJKQkrPSBidm1lNjAwMC5vCTUzYzd4eC5vCitvYmotJChDT05GSUdfU0NTSV9TSU03MTApCSs9IDUzYzcwMC5vCXNpbTcxMC5vCitvYmotJChDT05GSUdfU0NTSV9BRFZBTlNZUykJKz0gYWR2YW5zeXMubworb2JqLSQoQ09ORklHX1NDU0lfUENJMjAwMCkJKz0gcGNpMjAwMC5vCitvYmotJChDT05GSUdfU0NTSV9QQ0kyMjIwSSkJKz0gcGNpMjIyMGkubworb2JqLSQoQ09ORklHX1NDU0lfUFNJMjQwSSkJKz0gcHNpMjQwaS5vCitvYmotJChDT05GSUdfU0NTSV9CVVNMT0dJQykJKz0gQnVzTG9naWMubworb2JqLSQoQ09ORklHX1NDU0lfRFBUX0kyTykJKz0gZHB0X2kyby5vCitvYmotJChDT05GSUdfU0NTSV9VMTRfMzRGKQkrPSB1MTQtMzRmLm8KK29iai0kKENPTkZJR19TQ1NJX1VMVFJBU1RPUikJKz0gdWx0cmFzdG9yLm8KK29iai0kKENPTkZJR19TQ1NJX0FIQTE1MlgpCSs9IGFoYTE1Mngubworb2JqLSQoQ09ORklHX1NDU0lfQUhBMTU0MikJKz0gYWhhMTU0Mi5vCitvYmotJChDT05GSUdfU0NTSV9BSEExNzQwKQkrPSBhaGExNzQwLm8KK29iai0kKENPTkZJR19TQ1NJX0FJQzdYWFgpCSs9IGFpYzd4eHgvCitvYmotJChDT05GSUdfU0NTSV9BSUM3OVhYKQkrPSBhaWM3eHh4Lworb2JqLSQoQ09ORklHX1NDU0lfQUFDUkFJRCkJKz0gYWFjcmFpZC8KK29iai0kKENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEKQkrPSBhaWM3eHh4X29sZC5vCitvYmotJChDT05GSUdfU0NTSV9JUFMpCQkrPSBpcHMubworb2JqLSQoQ09ORklHX1NDU0lfRkRfTUNTKQkrPSBmZF9tY3Mubworb2JqLSQoQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTikrPSBmZG9tYWluLm8KK29iai0kKENPTkZJR19TQ1NJX0lOMjAwMCkJKz0gaW4yMDAwLm8KK29iai0kKENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCkgKz0gZ19OQ1I1MzgwLm8KK29iai0kKENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPKSArPSBnX05DUjUzODBfbW1pby5vCitvYmotJChDT05GSUdfU0NTSV9OQ1I1M0M0MDZBKQkrPSBOQ1I1M2M0MDZhLm8KK29iai0kKENPTkZJR19TQ1NJX05DUl9ENzAwKQkrPSA1M2M3MDAubyBOQ1JfRDcwMC5vCitvYmotJChDT05GSUdfU0NTSV9OQ1JfUTcyMCkJKz0gTkNSX1E3MjBfbW9kLm8KK29iai0kKENPTkZJR19TQ1NJX1NZTTUzQzQxNikJKz0gc3ltNTNjNDE2Lm8KK29iai0kKENPTkZJR19TQ1NJX1FMT0dJQ19GQVMpCSs9IHFsb2dpY2ZhczQwOC5vCXFsb2dpY2Zhcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1FMT0dJQykJKz0gcWxvZ2ljZmFzNDA4Lm8KK29iai0kKENPTkZJR19TQ1NJX1FMT0dJQ19JU1ApCSs9IHFsb2dpY2lzcC5vIAorb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDX0ZDKQkrPSBxbG9naWNmYy5vIAorb2JqLSQoQ09ORklHX1NDU0lfUUxPR0lDXzEyODApCSs9IHFsYTEyODAubyAKK29iai0kKENPTkZJR19TQ1NJX1FMQTJYWFgpCSs9IHFsYTJ4eHgvCitvYmotJChDT05GSUdfU0NTSV9QQVMxNikJKz0gcGFzMTYubworb2JqLSQoQ09ORklHX1NDU0lfU0VBR0FURSkJKz0gc2VhZ2F0ZS5vCitvYmotJChDT05GSUdfU0NTSV9GRF84eHgpCSs9IHNlYWdhdGUubworb2JqLSQoQ09ORklHX1NDU0lfVDEyOCkJCSs9IHQxMjgubworb2JqLSQoQ09ORklHX1NDU0lfRE1YMzE5MUQpCSs9IGRteDMxOTFkLm8KK29iai0kKENPTkZJR19TQ1NJX0RUQzMyODApCSs9IGR0Yy5vCitvYmotJChDT05GSUdfU0NTSV9TWU01M0M4WFhfMikJKz0gc3ltNTNjOHh4XzIvCitvYmotJChDT05GSUdfU0NTSV9aQUxPTikJKz0gemFsb243eHgubworb2JqLSQoQ09ORklHX1NDU0lfRUFUQV9QSU8pCSs9IGVhdGFfcGlvLm8KK29iai0kKENPTkZJR19TQ1NJXzcwMDBGQVNTVCkJKz0gd2Q3MDAwLm8KK29iai0kKENPTkZJR19TQ1NJX01DQV81M0M5WCkJKz0gTkNSNTNDOXgubwltY2FfNTNjOXgubworb2JqLSQoQ09ORklHX1NDU0lfSUJNTUNBKQkrPSBpYm1tY2Eubworb2JqLSQoQ09ORklHX1NDU0lfRUFUQSkJCSs9IGVhdGEubworb2JqLSQoQ09ORklHX1NDU0lfREMzOTV4KQkrPSBkYzM5NXgubworb2JqLSQoQ09ORklHX1NDU0lfREMzOTBUKQkrPSB0bXNjc2ltLm8KK29iai0kKENPTkZJR19NRUdBUkFJRF9MRUdBQ1kpCSs9IG1lZ2FyYWlkLm8KK29iai0kKENPTkZJR19NRUdBUkFJRF9ORVdHRU4pCSs9IG1lZ2FyYWlkLworb2JqLSQoQ09ORklHX1NDU0lfQUNBUkQpCSs9IGF0cDg3MHUubworb2JqLSQoQ09ORklHX1NDU0lfU1VORVNQKQkrPSBlc3Aubworb2JqLSQoQ09ORklHX1NDU0lfR0RUSCkJCSs9IGdkdGgubworb2JqLSQoQ09ORklHX1NDU0lfSU5JVElPKQkrPSBpbml0aW8ubworb2JqLSQoQ09ORklHX1NDU0lfSU5JQTEwMCkJKz0gYTEwMHUydy5vCitvYmotJChDT05GSUdfU0NTSV9RTE9HSUNQVEkpCSs9IHFsb2dpY3B0aS5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVTQ1NJKQkrPSBpZGUtc2NzaS5vCitvYmotJChDT05GSUdfU0NTSV9NRVNIKQkJKz0gbWVzaC5vCitvYmotJChDT05GSUdfU0NTSV9NQUM1M0M5NCkJKz0gbWFjNTNjOTQubworb2JqLSQoQ09ORklHX1NDU0lfUExVVE8pCSs9IHBsdXRvLm8KK29iai0kKENPTkZJR19TQ1NJX0RFQ05DUikJKz0gTkNSNTNDOXgubwlkZWNfZXNwLm8KK29iai0kKENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCkgKz0gM3cteHh4eC5vCitvYmotJChDT05GSUdfU0NTSV8zV185WFhYKQkrPSAzdy05eHh4Lm8KK29iai0kKENPTkZJR19TQ1NJX1BQQSkJCSs9IHBwYS5vCitvYmotJChDT05GSUdfU0NTSV9JTU0pCQkrPSBpbW0ubworb2JqLSQoQ09ORklHX0pBWlpfRVNQKQkJKz0gTkNSNTNDOXgubwlqYXp6X2VzcC5vCitvYmotJChDT05GSUdfU1VOM1hfRVNQKQkJKz0gTkNSNTNDOXgubwlzdW4zeF9lc3Aubworb2JqLSQoQ09ORklHX1NDU0lfREVCVUcpCSs9IHNjc2lfZGVidWcubworb2JqLSQoQ09ORklHX1NDU0lfRkNBTCkJCSs9IGZjYWwubworb2JqLSQoQ09ORklHX1NDU0lfQ1BRRkNUUykJKz0gY3BxZmMubworb2JqLSQoQ09ORklHX1NDU0lfTEFTSTcwMCkJKz0gNTNjNzAwLm8gbGFzaTcwMC5vCitvYmotJChDT05GSUdfU0NTSV9OU1AzMikJKz0gbnNwMzIubworb2JqLSQoQ09ORklHX1NDU0lfSVBSKQkJKz0gaXByLm8KK29iai0kKENPTkZJR19TQ1NJX0lCTVZTQ1NJKQkrPSBpYm12c2NzaS8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfQUhDSSkJKz0gbGliYXRhLm8gYWhjaS5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1NWVykJKz0gbGliYXRhLm8gc2F0YV9zdncubworb2JqLSQoQ09ORklHX1NDU0lfQVRBX1BJSVgpCSs9IGxpYmF0YS5vIGF0YV9waWl4Lm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSkJKz0gbGliYXRhLm8gc2F0YV9wcm9taXNlLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfUVNUT1IpCSs9IGxpYmF0YS5vIHNhdGFfcXN0b3Iubworb2JqLSQoQ09ORklHX1NDU0lfU0FUQV9TSUwpCSs9IGxpYmF0YS5vIHNhdGFfc2lsLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfVklBKQkrPSBsaWJhdGEubyBzYXRhX3ZpYS5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1ZJVEVTU0UpCSs9IGxpYmF0YS5vIHNhdGFfdnNjLm8KK29iai0kKENPTkZJR19TQ1NJX1NBVEFfU0lTKQkrPSBsaWJhdGEubyBzYXRhX3Npcy5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1NYNCkJKz0gbGliYXRhLm8gc2F0YV9zeDQubworb2JqLSQoQ09ORklHX1NDU0lfU0FUQV9OVikJKz0gbGliYXRhLm8gc2F0YV9udi5vCitvYmotJChDT05GSUdfU0NTSV9TQVRBX1VMSSkJKz0gbGliYXRhLm8gc2F0YV91bGkubworCitvYmotJChDT05GSUdfQVJNKQkJKz0gYXJtLworCitvYmotJChDT05GSUdfQ0hSX0RFVl9TVCkJKz0gc3Qubworb2JqLSQoQ09ORklHX0NIUl9ERVZfT1NTVCkJKz0gb3NzdC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9TRCkJKz0gc2RfbW9kLm8KK29iai0kKENPTkZJR19CTEtfREVWX1NSKQkrPSBzcl9tb2Qubworb2JqLSQoQ09ORklHX0NIUl9ERVZfU0cpCSs9IHNnLm8KKworc2NzaV9tb2QteQkJCSs9IHNjc2kubyBob3N0cy5vIHNjc2lfaW9jdGwubyBjb25zdGFudHMubyBcCisJCQkJICAgc2NzaWNhbS5vIHNjc2lfZXJyb3IubyBzY3NpX2xpYi5vIFwKKwkJCQkgICBzY3NpX3NjYW4ubyBzY3NpX3N5c2ZzLm8gXAorCQkJCSAgIHNjc2lfZGV2aW5mby5vCitzY3NpX21vZC0kKENPTkZJR19TWVNDVEwpCSs9IHNjc2lfc3lzY3RsLm8KK3Njc2lfbW9kLSQoQ09ORklHX1NDU0lfUFJPQ19GUykJKz0gc2NzaV9wcm9jLm8KKworc2RfbW9kLW9ianMJOj0gc2Qubworc3JfbW9kLW9ianMJOj0gc3IubyBzcl9pb2N0bC5vIHNyX3ZlbmRvci5vCituY3I1M2M4eHgtZmxhZ3MtJChDT05GSUdfU0NTSV9aQUxPTikgXAorCQk6PSAtRENPTkZJR19OQ1I1M0M4WFhfUFJFRkVUQ0ggLURTQ1NJX05DUl9CSUdfRU5ESUFOIFwKKwkJCS1EQ09ORklHX1NDU0lfTkNSNTNDOFhYX05PX1dPUkRfVFJBTlNGRVJTCitDRkxBR1NfbmNyNTNjOHh4Lm8JOj0gJChuY3I1M2M4eHgtZmxhZ3MteSkgJChuY3I1M2M4eHgtZmxhZ3MtbSkKK3phbG9uN3h4LW9ianMJOj0gemFsb24ubyBuY3I1M2M4eHgubworTkNSX1E3MjBfbW9kLW9ianMJOj0gTkNSX1E3MjAubyBuY3I1M2M4eHgubworY3BxZmMtb2Jqcwk6PSBjcHFmY1RTaW5pdC5vIGNwcWZjVFNjb250cm9sLm8gY3BxZmNUU2kyYy5vIFwKKwkJICAgY3BxZmNUU3dvcmtlci5vIGNwcWZjVFN0cmlnZ2VyLm8KK2xpYmF0YS1vYmpzCTo9IGxpYmF0YS1jb3JlLm8gbGliYXRhLXNjc2kubworCisjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCitjbGVhbi1maWxlcyA6PQk1M2M3eHhfZC5oIDUzYzcwMF9kLmgJXAorCQk1M2M3eHhfdS5oIDUzYzcwMF91LmgKKworJChvYmopLzUzYzd4eC5vOiAgICQob2JqKS81M2M3eHhfZC5oICQob2JqKS81M2M3eHhfdS5oCiskKG9iaikvNTNjNzAwLm8gJChNT0RWRVJESVIpLyQob2JqKS81M2M3MDAudmVyOiAkKG9iaikvNTNjNzAwX2QuaAorCisjIElmIHlvdSB3YW50IHRvIHBsYXkgd2l0aCB0aGUgZmlybXdhcmUsIHVuY29tbWVudAorIyBHRU5FUkFURV9GSVJNV0FSRSA6PSAxCisKK2lmZGVmIEdFTkVSQVRFX0ZJUk1XQVJFCisKKyQob2JqKS81M2M3eHhfZC5oOiAkKHNyYykvNTNjN3h4LnNjciAkKHNyYykvc2NyaXB0X2FzbS5wbAorCSQoQ1BQKSAtdHJhZGl0aW9uYWwgLURDSElQPTcxMCAtIDwgJDwgfCBncmVwIC12ICdeIycgfCAkKFBFUkwpIC1zICQoc3JjKS9zY3JpcHRfYXNtLnBsIC1uY3I3eDBfZmFtaWx5ICRAICQoQDpfZC5oPV91LmgpCisKKyQob2JqKS81M2M3eHhfdS5oOiAkKG9iaikvNTNjN3h4X2QuaAorCiskKG9iaikvNTNjNzAwX2QuaDogJChzcmMpLzUzYzcwMC5zY3IgJChzcmMpL3NjcmlwdF9hc20ucGwKKwkkKFBFUkwpIC1zICQoc3JjKS9zY3JpcHRfYXNtLnBsIC1uY3I3eDBfZmFtaWx5ICRAICQoQDpfZC5oPV91LmgpIDwgJDwKKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzFhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCkBAIC0wLDAgKzEsMjg2MiBAQAorLyogCisgKiBOQ1IgNTM4MCBnZW5lcmljIGRyaXZlciByb3V0aW5lcy4gIFRoZXNlIHNob3VsZCBtYWtlIGl0ICp0cml2aWFsKgorICogICAgICB0byBpbXBsZW1lbnQgNTM4MCBTQ1NJIGRyaXZlcnMgdW5kZXIgTGludXggd2l0aCBhIG5vbi10cmFudG9yCisgKiAgICAgIGFyY2hpdGVjdHVyZS4KKyAqCisgKiAgICAgIE5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyBhbHNvIHdvcmsgd2l0aCBOUjUzYzQwMCBmYW1pbHkgY2hpcHMuCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSA2LiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICRMb2c6IE5DUjUzODAuYyx2ICQKKworICogUmV2aXNpb24gMS4xMCAxOTk4LzkvMglBbGFuIENveAorICoJCQkJKGFsYW5AcmVkaGF0LmNvbSkKKyAqIEZpeGVkIHVwIHRoZSB0aW1lciBsb2NrdXBzIHJlcG9ydGVkIHNvIGZhci4gVGhpbmdzIHN0aWxsIHN1Y2suIExvb2tpbmcgCisgKiBmb3J3YXJkIHRvIDIuMyBhbmQgcGVyIGRldmljZSByZXF1ZXN0IHF1ZXVlcy4gVGhlbiBpdCdsbCBiZSBwb3NzaWJsZSB0bworICogU01QIHRocmVhZCB0aGlzIGJlYXN0IGFuZCBpbXByb3ZlIGxpZmUgbm8gZW5kLgorIAorICogUmV2aXNpb24gMS45ICAxOTk3LzcvMjcJUm9uYWxkIHZhbiBDdWlqbGVuYm9yZworICoJCQkJKHJvbmFsZC52YW4uY3VpamxlbmJvcmdAdGlwLm5sIG9yIG51dHR5QGRkcy5ubCkKKyAqIChob3BlZnVsbHkpIGZpeGVkIGFuZCBlbmhhbmNlZCBVU0xFRVAKKyAqIGFkZGVkIHN1cHBvcnQgZm9yIERUQzMxODFFIGNhcmQgKGZvciBNdXN0ZWsgc2Nhbm5lcikKKyAqCisKKyAqIFJldmlzaW9uIDEuOAkJCUluZ21hciBCYXVtZ2FydAorICoJCQkJKGluZ21hckBnb256by5zY2h3YWJlbi5kZSkKKyAqIGFkZGVkIHN1cHBvcnQgZm9yIE5DUjUzQzQwMGEgY2FyZAorICoKKworICogUmV2aXNpb24gMS43ICAxOTk2LzMvMiAgICAgICBSYXkgVmFuIFRhc3NsZSAocmF5dnRAY29tbS5tb3QuY29tKQorICogYWRkZWQgcHJvY19pbmZvCisgKiBhZGRlZCBzdXBwb3J0IG5lZWRlZCBmb3IgRFRDIDMxODAvMzI4MAorICogZml4ZWQgYSBjb3VwbGUgb2YgYnVncworICoKKworICogUmV2aXNpb24gMS41ICAxOTk0LzAxLzE5ICAwOToxNDo1NyAgZHJldworICogRml4ZWQgdWRlbGF5KCkgaGFjayB0aGF0IHdhcyBiZWluZyB1c2VkIG9uIERBVEFPVVQgcGhhc2VzCisgKiBpbnN0ZWFkIG9mIGEgcHJvcGVyIHdhaXQgZm9yIHRoZSBmaW5hbCBoYW5kc2hha2UuCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzAxLzE5ICAwNjo0NDoyNSAgZHJldworICogKioqIGVtcHR5IGxvZyBtZXNzYWdlICoqKgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8wMS8xOSAgMDU6MjQ6NDAgIGRyZXcKKyAqIEFkZGVkIHN1cHBvcnQgZm9yIFRDUiBMQVNUX0JZVEVfU0VOVCBiaXQuCisgKgorICogUmV2aXNpb24gMS4yICAxOTk0LzAxLzE1ICAwNjoxNDoxMSAgZHJldworICogUkVBTCBETUEgc3VwcG9ydCwgYnVnIGZpeGVzLgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMS8xNSAgMDY6MDA6NTQgIGRyZXcKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKworLyoKKyAqIEZ1cnRoZXIgZGV2ZWxvcG1lbnQgLyB0ZXN0aW5nIHRoYXQgc2hvdWxkIGJlIGRvbmUgOiAKKyAqIDEuICBDbGVhbnVwIHRoZSBOQ1I1MzgwX3RyYW5zZmVyX2RtYSBmdW5jdGlvbiBhbmQgRE1BIG9wZXJhdGlvbiBjb21wbGV0ZQorICogICAgIGNvZGUgc28gdGhhdCBldmVyeXRoaW5nIGRvZXMgdGhlIHNhbWUgdGhpbmcgdGhhdCdzIGRvbmUgYXQgdGhlIAorICogICAgIGVuZCBvZiBhIHBzZXVkby1ETUEgcmVhZCBvcGVyYXRpb24uCisgKgorICogMi4gIEZpeCBSRUFMX0RNQSAoaW50ZXJydXB0IGRyaXZlbiwgcG9sbGVkIHdvcmtzIGZpbmUpIC0KKyAqICAgICBiYXNpY2FsbHksIHRyYW5zZmVyIHNpemUgbmVlZHMgdG8gYmUgcmVkdWNlZCBieSBvbmUgCisgKiAgICAgYW5kIHRoZSBsYXN0IGJ5dGUgcmVhZCBhcyBpcyBkb25lIHdpdGggUFNFVURPX0RNQS4KKyAqIAorICogNC4gIFRlc3QgU0NTSS1JSSB0YWdnZWQgcXVldWVpbmcgKEkgaGF2ZSBubyBkZXZpY2VzIHdoaWNoIHN1cHBvcnQgCisgKiAgICAgIHRhZ2dlZCBxdWV1ZWluZykKKyAqCisgKiA1LiAgVGVzdCBsaW5rZWQgY29tbWFuZCBoYW5kbGluZyBjb2RlIGFmdGVyIEVyaWMgaXMgcmVhZHkgd2l0aCAKKyAqICAgICAgdGhlIGhpZ2ggbGV2ZWwgY29kZS4KKyAqLworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKKyNkZWZpbmUgTElTVCh4LHkpIHtwcmludGsoIkxJTkU6JWQgICBBZGRpbmcgJXAgdG8gJXBcbiIsIF9fTElORV9fLCAodm9pZCopKHgpLCAodm9pZCopKHkpKTsgaWYgKCh4KT09KHkpKSB1ZGVsYXkoNSk7IH0KKyNkZWZpbmUgUkVNT1ZFKHcseCx5LHopIHtwcmludGsoIkxJTkU6JWQgICBSZW1vdmluZzogJXAtPiVwICAlcC0+JXAgXG4iLCBfX0xJTkVfXywgKHZvaWQqKSh3KSwgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSwgKHZvaWQqKSh6KSk7IGlmICgoeCk9PSh5KSkgdWRlbGF5KDUpOyB9CisjZWxzZQorI2RlZmluZSBMSVNUKHgseSkKKyNkZWZpbmUgUkVNT1ZFKHcseCx5LHopCisjZW5kaWYKKworI2lmbmRlZiBub3R5ZXQKKyN1bmRlZiBMSU5LRUQKKyN1bmRlZiBSRUFMX0RNQQorI2VuZGlmCisKKyNpZmRlZiBSRUFMX0RNQV9QT0xMCisjdW5kZWYgUkVBRF9PVkVSUlVOUworI2RlZmluZSBSRUFEX09WRVJSVU5TCisjZW5kaWYKKworI2lmZGVmIEJPQVJEX1JFUVVJUkVTX05PX0RFTEFZCisjZGVmaW5lIGlvX3JlY292ZXJ5X2RlbGF5KHgpCisjZWxzZQorI2RlZmluZSBpb19yZWNvdmVyeV9kZWxheSh4KQl1ZGVsYXkoeCkKKyNlbmRpZgorCisvKgorICogRGVzaWduCisgKgorICogVGhpcyBpcyBhIGdlbmVyaWMgNTM4MCBkcml2ZXIuICBUbyB1c2UgaXQgb24gYSBkaWZmZXJlbnQgcGxhdGZvcm0sIAorICogb25lIHNpbXBseSB3cml0ZXMgYXBwcm9wcmlhdGUgc3lzdGVtIHNwZWNpZmljIG1hY3JvcyAoaWUsIGRhdGEKKyAqIHRyYW5zZmVyIC0gc29tZSBQQydzIHdpbGwgdXNlIHRoZSBJL08gYnVzLCA2OEsncyBtdXN0IHVzZSAKKyAqIG1lbW9yeSBtYXBwZWQpIGFuZCBkcm9wcyB0aGlzIGZpbGUgaW4gdGhlaXIgJ0MnIHdyYXBwZXIuCisgKgorICogKE5vdGUgZnJvbSBoY2g6ICB1bmZvcnR1bmF0ZWx5IGl0IHdhcyBub3QgZW5vdWdoIGZvciB0aGUgZGlmZmVyZW50CisgKiBtNjhrIGZvbGtzIGFuZCBpbnN0ZWFkIG9mIGltcHJvdmluZyB0aGlzIGRyaXZlciB0aGV5IGNvcGllZCBpdAorICogYW5kIGhhY2tlZCBpdCB1cCBmb3IgdGhlaXIgbmVlZHMuICBBcyBhIGNvbnNlcXVlbmNlIHRoZXkgbG9zdAorICogbW9zdCB1cGRhdGVzIHRvIHRoaXMgZHJpdmVyLiAgTWF5YmUgc29tZW9uZSB3aWxsIGZpeCBhbGwgdGhlc2UKKyAqIGRyaXZlcnMgdG8gdXNlIGEgY29tbW9uIGNvcmUgb25lIGRheS4uKQorICoKKyAqIEFzIGZhciBhcyBjb21tYW5kIHF1ZXVlaW5nLCB0d28gcXVldWVzIGFyZSBtYWludGFpbmVkIGZvciAKKyAqIGVhY2ggNTM4MCBpbiB0aGUgc3lzdGVtIC0gY29tbWFuZHMgdGhhdCBoYXZlbid0IGJlZW4gaXNzdWVkIHlldCwKKyAqIGFuZCBjb21tYW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nLiAgVGhpcyBtZWFucyB0aGF0IGFuIAorICogdW5saW1pdGVkIG51bWJlciBvZiBjb21tYW5kcyBtYXkgYmUgcXVldWVkLCBsZXR0aW5nIAorICogbW9yZSBjb21tYW5kcyBwcm9wYWdhdGUgZnJvbSB0aGUgaGlnaGVyIGRyaXZlciBsZXZlbHMgZ2l2aW5nIGhpZ2hlciAKKyAqIHRocm91Z2hwdXQuICBOb3RlIHRoYXQgYm90aCBJX1RfTCBhbmQgSV9UX0xfUSBuZXh1c2VzIGFyZSBzdXBwb3J0ZWQsIAorICogYWxsb3dpbmcgbXVsdGlwbGUgY29tbWFuZHMgdG8gcHJvcGFnYXRlIGFsbCB0aGUgd2F5IHRvIGEgU0NTSS1JSSBkZXZpY2UgCisgKiB3aGlsZSBhIGNvbW1hbmQgaXMgYWxyZWFkeSBleGVjdXRpbmcuCisgKgorICoKKyAqIElzc3VlcyBzcGVjaWZpYyB0byB0aGUgTkNSNTM4MCA6IAorICoKKyAqIFdoZW4gdXNlZCBpbiBhIFBJTyBvciBwc2V1ZG8tZG1hIG1vZGUsIHRoZSBOQ1I1MzgwIGlzIGEgYnJhaW5kZWFkIAorICogcGllY2Ugb2YgaGFyZHdhcmUgdGhhdCByZXF1aXJlcyB5b3UgdG8gc2l0IGluIGEgbG9vcCBwb2xsaW5nIGZvciAKKyAqIHRoZSBSRVEgc2lnbmFsIGFzIGxvbmcgYXMgeW91IGFyZSBjb25uZWN0ZWQuICBTb21lIGRldmljZXMgYXJlIAorICogYnJhaW4gZGVhZCAoaWUsIG1hbnkgVEVYRUwgQ0QgUk9NIGRyaXZlcykgYW5kIHdvbid0IGRpc2Nvbm5lY3QgCisgKiB3aGlsZSBkb2luZyBsb25nIHNlZWsgb3BlcmF0aW9ucy4KKyAqIAorICogVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiBkZXZpY2VzIHRoYXQgaGF2ZQorICogZGlzY29ubmVjdGVkLiAgSWYgdGhlIGRldmljZSBoYXNuJ3QgZGlzY29ubmVjdGVkLCBmb3IgY29tbWFuZHMgdGhhdAorICogc2hvdWxkIGRpc2Nvbm5lY3QsIHdlIGRvIHNvbWV0aGluZyBsaWtlIAorICoKKyAqIHdoaWxlICghUkVRIGlzIGFzc2VydGVkKSB7IHNsZWVwIGZvciBOIHVzZWNzOyBwb2xsIGZvciBNIHVzZWNzIH0KKyAqIAorICogU29tZSB0d2Vha2luZyBvZiBOIGFuZCBNIG5lZWRzIHRvIGJlIGRvbmUuICBBbiBhbGdvcml0aG0gYmFzZWQgCisgKiBvbiAidGltZSB0byBkYXRhIiB3b3VsZCBnaXZlIHRoZSBiZXN0IHJlc3VsdHMgYXMgbG9uZyBhcyBzaG9ydCB0aW1lCisgKiB0byBkYXRhcyAoaWUsIG9uIHRoZSBzYW1lIHRyYWNrKSB3ZXJlIGNvbnNpZGVyZWQsIGhvd2V2ZXIgdGhlc2UgCisgKiBicm9rZW4gZGV2aWNlcyBhcmUgdGhlIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiB0aGUgcnVsZSBhbmQgSSdkIHJhdGhlcgorICogc3BlbmQgbXkgdGltZSBvcHRpbWl6aW5nIGZvciB0aGUgbm9ybWFsIGNhc2UuCisgKgorICogQXJjaGl0ZWN0dXJlIDoKKyAqCisgKiBBdCB0aGUgaGVhcnQgb2YgdGhlIGRlc2lnbiBpcyBhIGNvcm91dGluZSwgTkNSNTM4MF9tYWluLAorICogd2hpY2ggaXMgc3RhcnRlZCBmcm9tIGEgd29ya3F1ZXVlIGZvciBlYWNoIE5DUjUzODAgaG9zdCBpbiB0aGUKKyAqIHN5c3RlbS4gIEl0IGF0dGVtcHRzIHRvIGVzdGFibGlzaCBJX1RfTCBvciBJX1RfTF9RIG5leHVzZXMgYnkKKyAqIHJlbW92aW5nIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBpc3N1ZSBxdWV1ZSBhbmQgY2FsbGluZworICogTkNSNTM4MF9zZWxlY3QoKSBpZiBhIG5leHVzIGlzIG5vdCBlc3RhYmxpc2hlZC4gCisgKgorICogT25jZSBhIG5leHVzIGlzIGVzdGFibGlzaGVkLCB0aGUgTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcigpCisgKiBwaGFzZSBnb2VzIHRocm91Z2ggdGhlIHZhcmlvdXMgcGhhc2VzIGFzIGluc3RydWN0ZWQgYnkgdGhlIHRhcmdldC4KKyAqIGlmIHRoZSB0YXJnZXQgZ29lcyBpbnRvIE1TRyBJTiBhbmQgc2VuZHMgYSBESVNDT05ORUNUIG1lc3NhZ2UsCisgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGludG8gdGhlIHBlciBpbnN0YW5jZSBkaXNjb25uZWN0ZWQKKyAqIHF1ZXVlLCBhbmQgTkNSNTM4MF9tYWluIHRyaWVzIHRvIGZpbmQgbW9yZSB3b3JrLiAgSWYgdGhlIHRhcmdldCBpcyAKKyAqIGlkbGUgZm9yIHRvbyBsb25nLCB0aGUgc3lzdGVtIHdpbGwgdHJ5IHRvIHNsZWVwLgorICoKKyAqIElmIGEgY29tbWFuZCBoYXMgZGlzY29ubmVjdGVkLCBldmVudHVhbGx5IGFuIGludGVycnVwdCB3aWxsIHRyaWdnZXIsCisgKiBjYWxsaW5nIE5DUjUzODBfaW50cigpICB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCBOQ1I1MzgwX3Jlc2VsZWN0CisgKiB0byByZWVzdGFibGlzaCBhIG5leHVzLiAgVGhpcyB3aWxsIHJ1biBtYWluIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBPbiBjb21tYW5kIHRlcm1pbmF0aW9uLCB0aGUgZG9uZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyAKKyAqIGFwcHJvcHJpYXRlLgorICoKKyAqIFNDU0kgcG9pbnRlcnMgYXJlIG1haW50YWluZWQgaW4gdGhlIFNDcCBmaWVsZCBvZiBTQ1NJIGNvbW1hbmQgCisgKiBzdHJ1Y3R1cmVzLCBiZWluZyBpbml0aWFsaXplZCBhZnRlciB0aGUgY29tbWFuZCBpcyBjb25uZWN0ZWQKKyAqIGluIE5DUjUzODBfc2VsZWN0LCBhbmQgc2V0IGFzIGFwcHJvcHJpYXRlIGluIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIuCisgKiBOb3RlIHRoYXQgaW4gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgYW4gaW1wbGljaXQgU0FWRSBQT0lOVEVSUyBvcGVyYXRpb24KKyAqIGlzIGRvbmUsIHNpbmNlIHNvbWUgQlJPS0VOIGRpc2tzIGZhaWwgdG8gaXNzdWUgYW4gZXhwbGljaXQgU0FWRSBQT0lOVEVSUy4KKyAqLworCisvKgorICogVXNpbmcgdGhpcyBmaWxlIDoKKyAqIFRoaXMgZmlsZSBhIHNrZWxldG9uIExpbnV4IFNDU0kgZHJpdmVyIGZvciB0aGUgTkNSIDUzODAgc2VyaWVzCisgKiBvZiBjaGlwcy4gIFRvIHVzZSBpdCwgeW91IHdyaXRlIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMgCisgKiBhbmQgbWFjcm9zIGFuZCBpbmNsdWRlIHRoaXMgZmlsZSBpbiB5b3VyIGRyaXZlci4KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udHJvbCBvcHRpb25zIDogCisgKiBBVVRPUFJPQkVfSVJRIC0gaWYgZGVmaW5lZCwgdGhlIE5DUjUzODBfcHJvYmVfaXJxKCkgZnVuY3Rpb24gd2lsbCBiZSAKKyAqICAgICAgZGVmaW5lZC4KKyAqIAorICogQVVUT1NFTlNFIC0gaWYgZGVmaW5lZCwgUkVRVUVTVCBTRU5TRSB3aWxsIGJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5CisgKiAgICAgIGZvciBjb21tYW5kcyB0aGF0IHJldHVybiB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cy4gCisgKgorICogRElGRkVSRU5USUFMIC0gaWYgZGVmaW5lZCwgTkNSNTNjODEgY2hpcHMgd2lsbCB1c2UgZXh0ZXJuYWwgZGlmZmVyZW50aWFsCisgKiAgICAgIHRyYW5zY2VpdmVycy4gCisgKgorICogRE9OVF9VU0VfSU5UUiAtIGlmIGRlZmluZWQsIG5ldmVyIHVzZSBpbnRlcnJ1cHRzLCBldmVuIGlmIHdlIHByb2JlIG9yCisgKiAgICAgIG92ZXJyaWRlLWNvbmZpZ3VyZSBhbiBJUlEuCisgKgorICogTElNSVRfVFJBTlNGRVJTSVpFIC0gaWYgZGVmaW5lZCwgbGltaXQgdGhlIHBzZXVkby1kbWEgdHJhbnNmZXJzIHRvIDUxMgorICogICAgICBieXRlcyBhdCBhIHRpbWUuICBTaW5jZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGR1cmluZworICogICAgICB0aGVzZSB0cmFuc2ZlcnMsIHdlIG1pZ2h0IG5lZWQgdGhpcyB0byBnaXZlIHJlYXNvbmFibGUgaW50ZXJydXB0CisgKiAgICAgIHNlcnZpY2UgdGltZSBpZiB0aGUgdHJhbnNmZXIgc2l6ZSBnZXRzIHRvbyBsYXJnZS4KKyAqCisgKiBMSU5LRUQgLSBpZiBkZWZpbmVkLCBsaW5rZWQgY29tbWFuZHMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBQU0VVRE9fRE1BIC0gaWYgZGVmaW5lZCwgUFNFVURPIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogUkVBTF9ETUEgLSBpZiBkZWZpbmVkLCBSRUFMIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogUkVBTF9ETUFfUE9MTCAtIGlmIGRlZmluZWQsIFJFQUwgRE1BIGlzIHVzZWQgYnV0IHRoZSBkcml2ZXIgZG9lc24ndAorICogICAgICByZWx5IG9uIHBoYXNlIG1pc21hdGNoIGFuZCBFT1AgaW50ZXJydXB0cyB0byBkZXRlcm1pbmUgZW5kIAorICogICAgICBvZiBwaGFzZS4KKyAqCisgKiBVTlNBRkUgLSBsZWF2ZSBpbnRlcnJ1cHRzIGVuYWJsZWQgZHVyaW5nIHBzZXVkby1ETUEgdHJhbnNmZXJzLiAgWW91CisgKiAgICAgICAgICBvbmx5IHJlYWxseSB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSdyZSBoYXZpbmcgYSBwcm9ibGVtIHdpdGgKKyAqICAgICAgICAgIGRyb3BwZWQgY2hhcmFjdGVycyBkdXJpbmcgaGlnaCBzcGVlZCBjb21tdW5pY2F0aW9ucywgYW5kIGV2ZW4KKyAqICAgICAgICAgIHRoZW4sIHlvdSdyZSBnb2luZyB0byBiZSBiZXR0ZXIgb2ZmIHR3aWRkbGluZyB3aXRoIHRyYW5zZmVyc2l6ZQorICogICAgICAgICAgaW4gdGhlIGhpZ2ggbGV2ZWwgY29kZS4KKyAqCisgKiBEZWZhdWx0cyBmb3IgdGhlc2Ugd2lsbCBiZSBwcm92aWRlZCBhbHRob3VnaCB0aGUgdXNlciBtYXkgd2FudCB0byBhZGp1c3QgCisgKiB0aGVzZSB0byBhbGxvY2F0ZSBDUFUgcmVzb3VyY2VzIHRvIHRoZSBTQ1NJIGRyaXZlciBvciAicmVhbCIgY29kZS4KKyAqIAorICogVVNMRUVQX1NMRUVQIC0gYW1vdW50IG9mIHRpbWUsIGluIGppZmZpZXMsIHRvIHNsZWVwCisgKgorICogVVNMRUVQX1BPTEwgLSBhbW91bnQgb2YgdGltZSwgaW4gamlmZmllcywgdG8gcG9sbAorICoKKyAqIFRoZXNlIG1hY3JvcyBNVVNUIGJlIGRlZmluZWQgOgorICogTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkgLSBkZWNsYXJlIGFueSBsb2NhbCB2YXJpYWJsZXMgbmVlZGVkIGZvciB5b3VyCisgKiAgICAgIHRyYW5zZmVyIHJvdXRpbmVzLgorICoKKyAqIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpIC0gaW5pdGlhbGl6ZSBhbnkgbG9jYWwgdmFyaWFibGVzIG5lZWRlZCBmcm9tIGEgZ2l2ZW4KKyAqICAgICAgaW5zdGFuY2Ugb2YgdGhlIGhvc3QgYWRhcHRlciBmb3IgTkNSNTM4MF97cmVhZCx3cml0ZSxwcmVhZCxwd3JpdGV9CisgKiAKKyAqIE5DUjUzODBfcmVhZChyZWdpc3RlcikgIC0gcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIKKyAqCisgKiBOQ1I1MzgwX3dyaXRlKHJlZ2lzdGVyLCB2YWx1ZSkgLSB3cml0ZSB0byB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgCisgKgorICogTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgIC0gYWRkaXRpb25hbCBmaWVsZHMgbmVlZGVkIGZvciB0aGlzIAorICogICAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNSNTM4MAorICoKKyAqIEVpdGhlciByZWFsIERNQSAqb3IqIHBzZXVkbyBETUEgbWF5IGJlIGltcGxlbWVudGVkCisgKiBSRUFMIGZ1bmN0aW9ucyA6IAorICogTkNSNTM4MF9SRUFMX0RNQSBzaG91bGQgYmUgZGVmaW5lZCBpZiByZWFsIERNQSBpcyB0byBiZSB1c2VkLgorICogTm90ZSB0aGF0IHRoZSBETUEgc2V0dXAgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyAKKyAqICAgICAgdGhhdCB0aGV5IHdlcmUgYWJsZSB0byBwcm9ncmFtIHRoZSBjb250cm9sbGVyIGZvci4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCBnZW5lcmljIGkzODYvUEMgdmVyc2lvbnMgb2YgdGhlc2UgbWFjcm9zIGFyZSAKKyAqICAgICAgYXZhaWxhYmxlIGFzIE5DUjUzODBfaTM4Nl9kbWFfd3JpdGVfc2V0dXAsCisgKiAgICAgIE5DUjUzODBfaTM4Nl9kbWFfcmVhZF9zZXR1cCwgYW5kIE5DUjUzODBfaTM4Nl9kbWFfcmVzaWR1YWwuCisgKgorICogTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIHNyYywgY291bnQpIC0gaW5pdGlhbGl6ZQorICogTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZHN0LCBjb3VudCkgLSBpbml0aWFsaXplCisgKiBOQ1I1MzgwX2RtYV9yZXNpZHVhbChpbnN0YW5jZSk7IC0gcmVzaWR1YWwgY291bnQKKyAqCisgKiBQU0VVRE8gZnVuY3Rpb25zIDoKKyAqIE5DUjUzODBfcHdyaXRlKGluc3RhbmNlLCBzcmMsIGNvdW50KQorICogTkNSNTM4MF9wcmVhZChpbnN0YW5jZSwgZHN0LCBjb3VudCk7CisgKgorICogVGhlIGdlbmVyaWMgZHJpdmVyIGlzIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTkNSNTM4MF9pbml0KGluc3RhbmNlKSwKKyAqIGFmdGVyIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIGhvc3Qgc3BlY2lmaWMgZmllbGRzIGFuZCBJRC4gIElmIHRoZSAKKyAqIGRyaXZlciB3aXNoZXMgdG8gYXV0b3Byb2JlIGZvciBhbiBJUlEgbGluZSwgdGhlIE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLAorICogcG9zc2libGUpIGZ1bmN0aW9uIG1heSBiZSB1c2VkLgorICovCisKK3N0YXRpYyBpbnQgZG9fYWJvcnQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBkb19yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKKworLyoKKyAqCWluaXRpYWxpemVfU0NwCQktCWluaXQgdGhlIHNjc2kgcG9pbnRlciBmaWVsZAorICoJQGNtZDogY29tbWFuZCBibG9jayB0byBzZXQgdXAKKyAqCisgKglTZXQgdXAgdGhlIGludGVybmFsIGZpZWxkcyBpbiB0aGUgU0NTSSBjb21tYW5kLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdGlhbGl6ZV9TQ3AoU2NzaV9DbW5kICogY21kKQoreworCS8qIAorCSAqIEluaXRpYWxpemUgdGhlIFNjc2kgUG9pbnRlciBmaWVsZCBzbyB0aGF0IGFsbCBvZiB0aGUgY29tbWFuZHMgaW4gdGhlIAorCSAqIHZhcmlvdXMgcXVldWVzIGFyZSB2YWxpZC4KKwkgKi8KKworCWlmIChjbWQtPnVzZV9zZykgeworCQljbWQtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+YnVmZmVyOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCQljbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSsKKwkJCSAgICAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCX0gZWxzZSB7CisJCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQljbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJfQorfQorCisvKioKKyAqCU5DUjUzODBfcG9sbF9wb2xpdGVseQktCXdhaXQgZm9yIE5DUjUzODAgc3RhdHVzIGJpdHMKKyAqCUBpbnN0YW5jZTogY29udHJvbGxlciB0byBwb2xsCisgKglAcmVnOiA1MzgwIHJlZ2lzdGVyIHRvIHBvbGwKKyAqCUBiaXQ6IEJpdG1hc2sgdG8gY2hlY2sKKyAqCUB2YWw6IFZhbHVlIHJlcXVpcmVkIHRvIGV4aXQKKyAqCisgKglQb2xscyB0aGUgTkNSNTM4MCBpbiBhIHJlYXNvbmFibHkgZWZmaWNpZW50IG1hbm5lciB3YWl0aW5nIGZvcgorICoJYW4gZXZlbnQgdG8gb2NjdXIsIGFmdGVyIGEgc2hvcnQgcXVpY2sgcG9sbCB3ZSBiZWdpbiBnaXZpbmcgdGhlCisgKglDUFUgYmFjayBpbiBub24gSVJRIGNvbnRleHRzCisgKgorICoJUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworIAorc3RhdGljIGludCBOQ1I1MzgwX3BvbGxfcG9saXRlbHkoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcsIGludCBiaXQsIGludCB2YWwsIGludCB0KQoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCWludCBuID0gNTAwOwkJLyogQXQgYWJvdXQgOHVTIGEgY3ljbGUgZm9yIHRoZSBjcHUgYWNjZXNzICovCisJdW5zaWduZWQgbG9uZyBlbmQgPSBqaWZmaWVzICsgdDsKKwlpbnQgcjsKKwkKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCXdoaWxlKCBuLS0gPiAwKQorCXsKKwkJciA9IE5DUjUzODBfcmVhZChyZWcpOworCQlpZigociAmIGJpdCkgPT0gdmFsKQorCQkJcmV0dXJuIDA7CisJCWNwdV9yZWxheCgpOworCX0KKwkKKwkvKiB0IHRpbWUgeWV0ID8gKi8KKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpKQorCXsKKwkJciA9IE5DUjUzODBfcmVhZChyZWcpOworCQlpZigociAmIGJpdCkgPT0gdmFsKQorCQkJcmV0dXJuIDA7CisJCWlmKCFpbl9pbnRlcnJ1cHQoKSkKKwkJCXlpZWxkKCk7CisJCWVsc2UKKwkJCWNwdV9yZWxheCgpOworCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfSBwaGFzZXNbXSA9IHsKKwl7UEhBU0VfREFUQU9VVCwgIkRBVEFPVVQifSwgCisJe1BIQVNFX0RBVEFJTiwgIkRBVEFJTiJ9LCAKKwl7UEhBU0VfQ01ET1VULCAiQ01ET1VUIn0sIAorCXtQSEFTRV9TVEFUSU4sICJTVEFUSU4ifSwgCisJe1BIQVNFX01TR09VVCwgIk1TR09VVCJ9LCAKKwl7UEhBU0VfTVNHSU4sICJNU0dJTiJ9LCAKKwl7UEhBU0VfVU5LTk9XTiwgIlVOS05PV04ifQorfTsKKworI2lmZGVmIE5ERUJVRworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBtYXNrOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IHNpZ25hbHNbXSA9IHsgCisJe1NSX0RCUCwgIlBBUklUWSJ9LCAKKwl7U1JfUlNULCAiUlNUIn0sIAorCXtTUl9CU1ksICJCU1kifSwgCisJe1NSX1JFUSwgIlJFUSJ9LCAKKwl7U1JfTVNHLCAiTVNHIn0sIAorCXtTUl9DRCwgIkNEIn0sIAorCXtTUl9JTywgIklPIn0sIAorCXtTUl9TRUwsICJTRUwifSwgCisJezAsIE5VTEx9Cit9LCAKK2Jhc3JzW10gPSB7CisJe0JBU1JfQVROLCAiQVROIn0sIAorCXtCQVNSX0FDSywgIkFDSyJ9LCAKKwl7MCwgTlVMTH0KK30sIAoraWNyc1tdID0geyAKKwl7SUNSX0FTU0VSVF9SU1QsICJBU1NFUlQgUlNUIn0sIAorCXtJQ1JfQVNTRVJUX0FDSywgIkFTU0VSVCBBQ0sifSwgCisJe0lDUl9BU1NFUlRfQlNZLCAiQVNTRVJUIEJTWSJ9LCAKKwl7SUNSX0FTU0VSVF9TRUwsICJBU1NFUlQgU0VMIn0sIAorCXtJQ1JfQVNTRVJUX0FUTiwgIkFTU0VSVCBBVE4ifSwgCisJe0lDUl9BU1NFUlRfREFUQSwgIkFTU0VSVCBEQVRBIn0sIAorCXswLCBOVUxMfQorfSwgCittcnNbXSA9IHsgCisJe01SX0JMT0NLX0RNQV9NT0RFLCAiTU9ERSBCTE9DSyBETUEifSwgCisJe01SX1RBUkdFVCwgIk1PREUgVEFSR0VUIn0sIAorCXtNUl9FTkFCTEVfUEFSX0NIRUNLLCAiTU9ERSBQQVJJVFkgQ0hFQ0sifSwgCisJe01SX0VOQUJMRV9QQVJfSU5UUiwgIk1PREUgUEFSSVRZIElOVFIifSwgCisJe01SX01PTklUT1JfQlNZLCAiTU9ERSBNT05JVE9SIEJTWSJ9LCAKKwl7TVJfRE1BX01PREUsICJNT0RFIERNQSJ9LCAKKwl7TVJfQVJCSVRSQVRFLCAiTU9ERSBBUkJJVFJBVElPTiJ9LCAKKwl7MCwgTlVMTH0KK307CisKKy8qKgorICoJTkNSNTM4MF9wcmludAktCXByaW50IHNjc2kgYnVzIHNpZ25hbHMKKyAqCUBpbnN0YW5jZToJYWRhcHRlciBzdGF0ZSB0byBkdW1wCisgKgorICoJUHJpbnQgdGhlIFNDU0kgYnVzIHNpZ25hbHMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICoKKyAqCUxvY2tzOiBjYWxsZXIgaG9sZHMgaG9zdGRhdGEgbG9jayAobm90IGVzc2VudGlhbCkKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBkYXRhLCBiYXNyLCBtciwgaWNyLCBpOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJZGF0YSA9IE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpOworCXN0YXR1cyA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKwltciA9IE5DUjUzODBfcmVhZChNT0RFX1JFRyk7CisJaWNyID0gTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRyk7CisJYmFzciA9IE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpOworCisJcHJpbnRrKCJTVEFUVVNfUkVHOiAlMDJ4ICIsIHN0YXR1cyk7CisJZm9yIChpID0gMDsgc2lnbmFsc1tpXS5tYXNrOyArK2kpCisJCWlmIChzdGF0dXMgJiBzaWduYWxzW2ldLm1hc2spCisJCQlwcmludGsoIiwlcyIsIHNpZ25hbHNbaV0ubmFtZSk7CisJcHJpbnRrKCJcbkJBU1I6ICUwMnggIiwgYmFzcik7CisJZm9yIChpID0gMDsgYmFzcnNbaV0ubWFzazsgKytpKQorCQlpZiAoYmFzciAmIGJhc3JzW2ldLm1hc2spCisJCQlwcmludGsoIiwlcyIsIGJhc3JzW2ldLm5hbWUpOworCXByaW50aygiXG5JQ1I6ICUwMnggIiwgaWNyKTsKKwlmb3IgKGkgPSAwOyBpY3JzW2ldLm1hc2s7ICsraSkKKwkJaWYgKGljciAmIGljcnNbaV0ubWFzaykKKwkJCXByaW50aygiLCVzIiwgaWNyc1tpXS5uYW1lKTsKKwlwcmludGsoIlxuTU9ERTogJTAyeCAiLCBtcik7CisJZm9yIChpID0gMDsgbXJzW2ldLm1hc2s7ICsraSkKKwkJaWYgKG1yICYgbXJzW2ldLm1hc2spCisJCQlwcmludGsoIiwlcyIsIG1yc1tpXS5uYW1lKTsKKwlwcmludGsoIlxuIik7Cit9CisKKworLyogCisgKglOQ1I1MzgwX3ByaW50X3BoYXNlCS0Jc2hvdyBTQ1NJIHBoYXNlCisgKglAaW5zdGFuY2U6IGFkYXB0ZXIgdG8gZHVtcAorICoKKyAqIAlQcmludCB0aGUgY3VycmVudCBTQ1NJIHBoYXNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcHJpbnRfcGhhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJaW50IGk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlzdGF0dXMgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRyk7CisJaWYgKCEoc3RhdHVzICYgU1JfUkVRKSkKKwkJcHJpbnRrKCJzY3NpJWQgOiBSRVEgbm90IGFzc2VydGVkLCBwaGFzZSB1bmtub3duLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyAocGhhc2VzW2ldLnZhbHVlICE9IFBIQVNFX1VOS05PV04pICYmIChwaGFzZXNbaV0udmFsdWUgIT0gKHN0YXR1cyAmIFBIQVNFX01BU0spKTsgKytpKTsKKwkJcHJpbnRrKCJzY3NpJWQgOiBwaGFzZSAlc1xuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHBoYXNlc1tpXS5uYW1lKTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIG5lZWQgdHdlYWtpbmcsIGFuZCB3b3VsZCBwcm9iYWJseSB3b3JrIGJlc3QgYXMgcGVyLWRldmljZSAKKyAqIGZsYWdzIGluaXRpYWxpemVkIGRpZmZlcmVudGx5IGZvciBkaXNrLCB0YXBlLCBjZCwgZXRjIGRldmljZXMuCisgKiBQZW9wbGUgd2l0aCBicm9rZW4gZGV2aWNlcyBhcmUgZnJlZSB0byBleHBlcmltZW50IGFzIHRvIHdoYXQgZ2l2ZXMKKyAqIHRoZSBiZXN0IHJlc3VsdHMgZm9yIHRoZW0uCisgKgorICogVVNMRUVQX1NMRUVQIHNob3VsZCBiZSBhIG1pbmltdW0gc2VlayB0aW1lLgorICoKKyAqIFVTTEVFUF9QT0xMIHNob3VsZCBiZSBhIG1heGltdW0gcm90YXRpb25hbCBsYXRlbmN5LgorICovCisjaWZuZGVmIFVTTEVFUF9TTEVFUAorLyogMjAgbXMgKHJlYXNvbmFibGUgaGFyZCBkaXNrIHNwZWVkKSAqLworI2RlZmluZSBVU0xFRVBfU0xFRVAgKDIwKkhaLzEwMDApCisjZW5kaWYKKy8qIDMwMCBSUE0gKGZsb3BweSBzcGVlZCkgKi8KKyNpZm5kZWYgVVNMRUVQX1BPTEwKKyNkZWZpbmUgVVNMRUVQX1BPTEwgKDIwMCpIWi8xMDAwKQorI2VuZGlmCisjaWZuZGVmIFVTTEVFUF9XQUlUTE9ORworLyogUnZDOiAocmVhc29uYWJsZSB0aW1lIHRvIHdhaXQgb24gc2VsZWN0IGVycm9yKSAqLworI2RlZmluZSBVU0xFRVBfV0FJVExPTkcgVVNMRUVQX1NMRUVQCisjZW5kaWYKKworLyogCisgKiBGdW5jdGlvbiA6IGludCBzaG91bGRfZGlzY29ubmVjdCAodW5zaWduZWQgY2hhciBjbWQpCisgKgorICogUHVycG9zZSA6IGRlY2lkZSB3ZWF0aGVyIGEgY29tbWFuZCB3b3VsZCBub3JtYWxseSBkaXNjb25uZWN0IG9yIAorICogICAgICBub3QsIHNpbmNlIGlmIGl0IHdvbid0IGRpc2Nvbm5lY3Qgd2Ugc2hvdWxkIGdvIHRvIHNsZWVwLgorICoKKyAqIElucHV0IDogY21kIC0gb3Bjb2RlIG9mIFNDU0kgY29tbWFuZAorICoKKyAqIFJldHVybnMgOiBESVNDT05ORUNUX0xPTkcgaWYgd2Ugc2hvdWxkIGRpc2Nvbm5lY3QgZm9yIGEgcmVhbGx5IGxvbmcgCisgKiAgICAgIHRpbWUgKGllIGFsd2F5cywgc2xlZXAsIGxvb2sgZm9yIFJFUSBhY3RpdmUsIHNsZWVwKSwgCisgKiAgICAgIERJU0NPTk5FQ1RfVElNRV9UT19EQVRBIGlmIHdlIHdvdWxkIG9ubHkgZGlzY29ubmVjdCBmb3IgYSBub3JtYWwKKyAqICAgICAgdGltZS10by1kYXRhIGRlbGF5LCBESVNDT05ORUNUX05PTkUgaWYgdGhpcyBjb21tYW5kIHdvdWxkIHJldHVybgorICogICAgICBpbW1lZGlhdGVseS4KKyAqCisgKiAgICAgIEZ1dHVyZSBzbGVlcCBhbGdvcml0aG1zIGJhc2VkIG9uIHRpbWUgdG8gZGF0YSBjYW4gZXhwbG9pdCAKKyAqICAgICAgc29tZXRoaW5nIGxpa2UgdGhpcyBzbyB0aGV5IGNhbiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gIm5vcm1hbCIgCisgKiAgICAgIChpZSwgcmVhZCwgd3JpdGUsIHNlZWspIGFuZCB1bnVzdWFsIGNvbW1hbmRzIChpZSwgKiBmb3JtYXQpLgorICoKKyAqIE5vdGUgOiBXZSBkb24ndCBkZWFsIHdpdGggY29tbWFuZHMgdGhhdCBoYW5kbGUgYW4gaW1tZWRpYXRlIGRpc2Nvbm5lY3QsCisgKiAgICAgICAgCisgKi8KKworc3RhdGljIGludCBzaG91bGRfZGlzY29ubmVjdCh1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkVBRF82OgorCWNhc2UgV1JJVEVfNjoKKwljYXNlIFNFRUtfNjoKKwljYXNlIFJFQURfMTA6CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFNFRUtfMTA6CisJCXJldHVybiBESVNDT05ORUNUX1RJTUVfVE9fREFUQTsKKwljYXNlIEZPUk1BVF9VTklUOgorCWNhc2UgU0VBUkNIX0hJR0g6CisJY2FzZSBTRUFSQ0hfTE9XOgorCWNhc2UgU0VBUkNIX0VRVUFMOgorCQlyZXR1cm4gRElTQ09OTkVDVF9MT05HOworCWRlZmF1bHQ6CisJCXJldHVybiBESVNDT05ORUNUX05PTkU7CisJfQorfQorCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3NldF90aW1lcihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlob3N0ZGF0YS0+dGltZV9leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0ZGF0YS0+Y29yb3V0aW5lLCB0aW1lb3V0KTsKK30KKworCitzdGF0aWMgaW50IHByb2JlX2lycSBfX2luaXRkYXRhID0gMDsKKworLyoqCisgKglwcm9iZV9pbnRyCS0JaGVscGVyIGZvciBJUlEgYXV0b3Byb2JlCisgKglAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKglAZGV2X2lkOiB1bnVzZWQKKyAqCUByZWdzOiB1bnVzZWQKKyAqCisgKglTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoZSBJUlEgaW4gcXVlc3Rpb24gd2FzIHJlY2VpdmVkLiBUaGlzIGlzCisgKgl1c2VkIGJ5IHRoZSBJUlEgcHJvYmUgY29kZS4KKyAqLworIAorc3RhdGljIGlycXJldHVybl90IF9faW5pdCBwcm9iZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJvYmVfaXJxID0gaXJxOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKglOQ1I1MzgwX3Byb2JlX2lycQktCWZpbmQgdGhlIElSUSBvZiBhbiBOQ1I1MzgwCisgKglAaW5zdGFuY2U6IE5DUjUzODAgY29udHJvbGxlcgorICoJQHBvc3NpYmxlOiBiaXRtYXNrIG9mIElTQSBJUlEgbGluZXMKKyAqCisgKglBdXRvcHJvYmUgZm9yIHRoZSBJUlEgbGluZSB1c2VkIGJ5IHRoZSBOQ1I1MzgwIGJ5IHRyaWdnZXJpbmcgYW4gSVJRCisgKglhbmQgdGhlbiBsb29raW5nIHRvIHNlZSB3aGF0IGludGVycnVwdCBhY3R1YWxseSB0dXJuZWQgdXAuCisgKgorICoJTG9ja3M6IG5vbmUsIGlycXMgbXVzdCBiZSBlbmFibGVkIG9uIGVudHJ5CisgKi8KKworc3RhdGljIGludCBfX2luaXQgTkNSNTM4MF9wcm9iZV9pcnEoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCBwb3NzaWJsZSkKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgdHJ5aW5nX2lycXMsIGksIG1hc2s7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlmb3IgKHRyeWluZ19pcnFzID0gaSA9IDAsIG1hc2sgPSAxOyBpIDwgMTY7ICsraSwgbWFzayA8PD0gMSkKKwkJaWYgKChtYXNrICYgcG9zc2libGUpICYmIChyZXF1ZXN0X2lycShpLCAmcHJvYmVfaW50ciwgU0FfSU5URVJSVVBULCAiTkNSLXByb2JlIiwgTlVMTCkgPT0gMCkpCisJCQl0cnlpbmdfaXJxcyB8PSBtYXNrOworCisJdGltZW91dCA9IGppZmZpZXMgKyAoMjUwICogSFogLyAxMDAwKTsKKwlwcm9iZV9pcnEgPSBTQ1NJX0lSUV9OT05FOworCisJLyoKKwkgKiBBIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgd2hlbmV2ZXIgQlNZID0gZmFsc2UsIFNFTCA9IHRydWUKKwkgKiBhbmQgYSBiaXQgc2V0IGluIHRoZSBTRUxFQ1RfRU5BQkxFX1JFRyBpcyBhc3NlcnRlZCBvbiB0aGUgCisJICogU0NTSSBidXMuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIGJ1cyBpcyBvbmx5IGRyaXZlbiB3aGVuIHRoZSBwaGFzZSBjb250cm9sIHNpZ25hbHMKKwkgKiAoSS9PLCBDL0QsIGFuZCBNU0cpIG1hdGNoIHRob3NlIGluIHRoZSBUQ1IsIHNvIHdlIG11c3QgcmVzZXQgdGhhdAorCSAqIHRvIHplcm8uCisJICovCisKKwlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCU5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9TRUwpOworCisJd2hpbGUgKHByb2JlX2lycSA9PSBTQ1NJX0lSUV9OT05FICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCXsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwkKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCAwKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJZm9yIChpID0gMCwgbWFzayA9IDE7IGkgPCAxNjsgKytpLCBtYXNrIDw8PSAxKQorCQlpZiAodHJ5aW5nX2lycXMgJiBtYXNrKQorCQkJZnJlZV9pcnEoaSwgTlVMTCk7CisKKwlyZXR1cm4gcHJvYmVfaXJxOworfQorCisvKioKKyAqCU5DUjU4MzgwX3ByaW50X29wdGlvbnMJLQlzaG93IG9wdGlvbnMKKyAqCUBpbnN0YW5jZTogdW51c2VkIGZvciBub3cKKyAqCisgKglDYWxsZWQgYnkgcHJvYmUgY29kZSBpbmRpY2F0aW5nIHRoZSBOQ1I1MzgwIGRyaXZlciBvcHRpb25zIHRoYXQgCisgKgl3ZXJlIHNlbGVjdGVkLiBBdCBzb21lIHBvaW50IHRoaXMgd2lsbCBzd2l0Y2ggdG8gcnVudGltZSBvcHRpb25zCisgKglyZWFkIGZyb20gdGhlIGFkYXB0ZXIgaW4gcXVlc3Rpb24KKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBOQ1I1MzgwX3ByaW50X29wdGlvbnMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJcHJpbnRrKCIgZ2VuZXJpYyBvcHRpb25zIgorI2lmZGVmIEFVVE9QUk9CRV9JUlEKKwkgICAgICAgIiBBVVRPUFJPQkVfSVJRIgorI2VuZGlmCisjaWZkZWYgQVVUT1NFTlNFCisJICAgICAgICIgQVVUT1NFTlNFIgorI2VuZGlmCisjaWZkZWYgRElGRkVSRU5USUFMCisJICAgICAgICIgRElGRkVSRU5USUFMIgorI2VuZGlmCisjaWZkZWYgUkVBTF9ETUEKKwkgICAgICAgIiBSRUFMIERNQSIKKyNlbmRpZgorI2lmZGVmIFJFQUxfRE1BX1BPTEwKKwkgICAgICAgIiBSRUFMIERNQSBQT0xMIgorI2VuZGlmCisjaWZkZWYgUEFSSVRZCisJICAgICAgICIgUEFSSVRZIgorI2VuZGlmCisjaWZkZWYgUFNFVURPX0RNQQorCSAgICAgICAiIFBTRVVETyBETUEiCisjZW5kaWYKKyNpZmRlZiBVTlNBRkUKKwkgICAgICAgIiBVTlNBRkUgIgorI2VuZGlmCisJICAgICk7CisJcHJpbnRrKCIgVVNMRUVQLCBVU0xFRVBfUE9MTD0lZCBVU0xFRVBfU0xFRVA9JWQiLCBVU0xFRVBfUE9MTCwgVVNMRUVQX1NMRUVQKTsKKwlwcmludGsoIiBnZW5lcmljIHJlbGVhc2U9JWQiLCBOQ1I1MzgwX1BVQkxJQ19SRUxFQVNFKTsKKwlpZiAoKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGEpLT5mbGFncyAmIEZMQUdfTkNSNTNDNDAwKSB7CisJCXByaW50aygiIG5jcjUzYzQwMCByZWxlYXNlPSVkIiwgTkNSNTNDNDAwX1BVQkxJQ19SRUxFQVNFKTsKKwl9Cit9CisKKy8qKgorICoJTkNSNTM4MF9wcmludF9zdGF0dXMgCS0JZHVtcCBjb250cm9sbGVyIGluZm8KKyAqCUBpbnN0YW5jZTogY29udHJvbGxlciB0byBkdW1wCisgKgorICoJUHJpbnQgY29tbWFuZHMgaW4gdGhlIHZhcmlvdXMgcXVldWVzLCBjYWxsZWQgZnJvbSBOQ1I1MzgwX2Fib3J0IAorICoJYW5kIE5DUjUzODBfZGVidWcgdG8gYWlkIGRlYnVnZ2luZy4KKyAqCisgKglMb2NrczogY2FsbGVkIGZ1bmN0aW9ucyBkaXNhYmxlIGlycXMKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X3N0YXR1cyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlOQ1I1MzgwX2RwcmludChOREVCVUdfQU5ZLCBpbnN0YW5jZSk7CisJTkNSNTM4MF9kcHJpbnRfcGhhc2UoTkRFQlVHX0FOWSwgaW5zdGFuY2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIC9wcm9jL3Njc2kvW2R0YyBwYXMxNiB0MTI4IGdlbmVyaWNdL1swLUFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEXQorICoKKyAqICpidWZmZXI6IEkvTyBidWZmZXIKKyAqICoqc3RhcnQ6IGlmIGlub3V0ID09IEZBTFNFIHBvaW50ZXIgaW50byBidWZmZXIgd2hlcmUgdXNlciByZWFkIHNob3VsZCBzdGFydAorICogb2Zmc2V0OiBjdXJyZW50IG9mZnNldAorICogbGVuZ3RoOiBsZW5ndGggb2YgYnVmZmVyCisgKiBob3N0bm86IFNjc2lfSG9zdCBob3N0X25vCisgKiBpbm91dDogVFJVRSAtIHVzZXIgaXMgd3JpdGluZzsgRkFMU0UgLSB1c2VyIGlzIHJlYWRpbmcKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbgorICovCisKKyN1bmRlZiBTUFJJTlRGCisjZGVmaW5lIFNQUklOVEYoYXJncy4uLikgZG8geyBpZihwb3MgPCBidWZmZXIgKyBsZW5ndGgtODApIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncyk7IH0gd2hpbGUoMCkKK3N0YXRpYworY2hhciAqbHByaW50X1Njc2lfQ21uZChTY3NpX0NtbmQgKiBjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYworY2hhciAqbHByaW50X2NvbW1hbmQodW5zaWduZWQgY2hhciAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7CitzdGF0aWMKK2NoYXIgKmxwcmludF9vcGNvZGUoaW50IG9wY29kZSwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMKK2ludCBOQ1I1MzgwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJU2NzaV9DbW5kICpwdHI7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwlpZiAoaW5vdXQpIHsJCS8qIEhhcyBkYXRhIGJlZW4gd3JpdHRlbiB0byB0aGUgZmlsZSA/ICovCisjaWZkZWYgRFRDX1BVQkxJQ19SRUxFQVNFCisJCWR0Y193bWF4aSA9IGR0Y19tYXhpID0gMDsKKyNlbmRpZgorI2lmZGVmIFBBUzE2X1BVQkxJQ19SRUxFQVNFCisJCXBhc193bWF4aSA9IHBhc19tYXhpID0gMDsKKyNlbmRpZgorCQlyZXR1cm4gKC1FTk9TWVMpOwkvKiBDdXJyZW50bHkgdGhpcyBpcyBhIG5vLW9wICovCisJfQorCVNQUklOVEYoIk5DUjUzODAgY29yZSByZWxlYXNlPSVkLiAgICIsIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworCWlmICgoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YSktPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApCisJCVNQUklOVEYoIm5jcjUzYzQwMCByZWxlYXNlPSVkLiAgIiwgTkNSNTNDNDAwX1BVQkxJQ19SRUxFQVNFKTsKKyNpZmRlZiBEVENfUFVCTElDX1JFTEVBU0UKKwlTUFJJTlRGKCJEVEMgMzE4MC8zMjgwIHJlbGVhc2UgJWQiLCBEVENfUFVCTElDX1JFTEVBU0UpOworI2VuZGlmCisjaWZkZWYgVDEyOF9QVUJMSUNfUkVMRUFTRQorCVNQUklOVEYoIlQxMjggcmVsZWFzZSAlZCIsIFQxMjhfUFVCTElDX1JFTEVBU0UpOworI2VuZGlmCisjaWZkZWYgR0VORVJJQ19OQ1I1MzgwX1BVQkxJQ19SRUxFQVNFCisJU1BSSU5URigiR2VuZXJpYzUzODAgcmVsZWFzZSAlZCIsIEdFTkVSSUNfTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSk7CisjZW5kaWYKKyNpZmRlZiBQQVMxNl9QVUJMSUNfUkVMRUFTRQorCVNQUklOVEYoIlBBUzE2IHJlbGVhc2U9JWQiLCBQQVMxNl9QVUJMSUNfUkVMRUFTRSk7CisjZW5kaWYKKworCVNQUklOVEYoIlxuQmFzZSBBZGRyOiAweCUwNWxYICAgICIsIChsb25nKSBpbnN0YW5jZS0+YmFzZSk7CisJU1BSSU5URigiaW9fcG9ydDogJTA0eCAgICAgICIsIChpbnQpIGluc3RhbmNlLT5pb19wb3J0KTsKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQlTUFJJTlRGKCJJUlE6IE5vbmUuXG4iKTsKKwllbHNlCisJCVNQUklOVEYoIklSUTogJWQuXG4iLCBpbnN0YW5jZS0+aXJxKTsKKworI2lmZGVmIERUQ19QVUJMSUNfUkVMRUFTRQorCVNQUklOVEYoIkhpZ2h3YXRlciBJL08gYnVzeV9zcGluX2NvdW50cyAtLSB3cml0ZTogJWQgIHJlYWQ6ICVkXG4iLCBkdGNfd21heGksIGR0Y19tYXhpKTsKKyNlbmRpZgorI2lmZGVmIFBBUzE2X1BVQkxJQ19SRUxFQVNFCisJU1BSSU5URigiSGlnaHdhdGVyIEkvTyBidXN5X3NwaW5fY291bnRzIC0tIHdyaXRlOiAlZCAgcmVhZDogJWRcbiIsIHBhc193bWF4aSwgcGFzX21heGkpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycShpbnN0YW5jZS0+aG9zdF9sb2NrKTsKKwlpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpCisJCVNQUklOVEYoInNjc2klZDogbm8gY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJZWxzZQorCQlwb3MgPSBscHJpbnRfU2NzaV9DbW5kKChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZCwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJU1BSSU5URigic2NzaSVkOiBpc3N1ZV9xdWV1ZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCWZvciAocHRyID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IHB0cjsgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCXBvcyA9IGxwcmludF9TY3NpX0NtbmQocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCVNQUklOVEYoInNjc2klZDogZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7IHB0cjsgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCXBvcyA9IGxwcmludF9TY3NpX0NtbmQocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKwlzcGluX3VubG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisJCisJKnN0YXJ0ID0gYnVmZmVyOworCWlmIChwb3MgLSBidWZmZXIgPCBvZmZzZXQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHBvcyAtIGJ1ZmZlciAtIG9mZnNldCA8IGxlbmd0aCkKKwkJcmV0dXJuIHBvcyAtIGJ1ZmZlciAtIG9mZnNldDsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgY2hhciAqbHByaW50X1Njc2lfQ21uZChTY3NpX0NtbmQgKiBjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCVNQUklOVEYoInNjc2klZCA6IGRlc3RpbmF0aW9uIHRhcmdldCAlZCwgbHVuICVkXG4iLCBjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwlTUFJJTlRGKCIgICAgICAgIGNvbW1hbmQgPSAiKTsKKwlwb3MgPSBscHJpbnRfY29tbWFuZChjbWQtPmNtbmQsIHBvcywgYnVmZmVyLCBsZW5ndGgpOworCXJldHVybiAocG9zKTsKK30KKworc3RhdGljIGNoYXIgKmxwcmludF9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBzOworCXBvcyA9IGxwcmludF9vcGNvZGUoY29tbWFuZFswXSwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJZm9yIChpID0gMSwgcyA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsgaSA8IHM7ICsraSkKKwkJU1BSSU5URigiJTAyeCAiLCBjb21tYW5kW2ldKTsKKwlTUFJJTlRGKCJcbiIpOworCXJldHVybiAocG9zKTsKK30KKworc3RhdGljIGNoYXIgKmxwcmludF9vcGNvZGUoaW50IG9wY29kZSwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJU1BSSU5URigiJTJkICgweCUwMngpIiwgb3Bjb2RlLCBvcGNvZGUpOworCXJldHVybiAocG9zKTsKK30KKworCisvKioKKyAqCU5DUjUzODBfaW5pdAktCWluaXRpYWxpc2UgYW4gTkNSNTM4MAorICoJQGluc3RhbmNlOiBhZGFwdGVyIHRvIGNvbmZpZ3VyZQorICoJQGZsYWdzOiBjb250cm9sIGZsYWdzCisgKgorICoJSW5pdGlhbGl6ZXMgKmluc3RhbmNlIGFuZCBjb3JyZXNwb25kaW5nIDUzODAgY2hpcCwKKyAqICAgICAgd2l0aCBmbGFncyBPUidkIGludG8gdGhlIGluaXRpYWwgZmxhZ3MgdmFsdWUuCisgKgorICoJTm90ZXMgOiBJIGFzc3VtZSB0aGF0IHRoZSBob3N0LCBob3N0bm8sIGFuZCBpZCBiaXRzIGhhdmUgYmVlbgorICogICAgICBzZXQgY29ycmVjdGx5LiAgSSBkb24ndCBjYXJlIGFib3V0IHRoZSBpcnEgYW5kIG90aGVyIGZpZWxkcy4gCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzCisgKgorICoJTG9ja3M6IGludGVycnVwdHMgbXVzdCBiZSBlbmFibGVkIHdoZW4gd2UgYXJlIGNhbGxlZCAKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBOQ1I1MzgwX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCBmbGFncykKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlpbnQgaSwgcGFzczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCWlmKGluX2ludGVycnVwdCgpKQorCQlwcmludGsoS0VSTl9FUlIgIk5DUjUzODBfaW5pdCBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZiFcbiIpOworCS8qIAorCSAqIE9uIE5DUjUzQzQwMCBib2FyZHMsIE5DUjUzODAgcmVnaXN0ZXJzIGFyZSBtYXBwZWQgOCBwYXN0IAorCSAqIHRoZSBiYXNlIGFkZHJlc3MuCisJICovCisKKyNpZmRlZiBOQ1I1M0M0MDAKKwlpZiAoZmxhZ3MgJiBGTEFHX05DUjUzQzQwMCkKKwkJaW5zdGFuY2UtPk5DUjUzODBfaW5zdGFuY2VfbmFtZSArPSBOQ1I1M0M0MDBfYWRkcmVzc19hZGp1c3Q7CisjZW5kaWYKKworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaG9zdGRhdGEtPmFib3J0ZWQgPSAwOworCWhvc3RkYXRhLT5pZF9tYXNrID0gMSA8PCBpbnN0YW5jZS0+dGhpc19pZDsKKwlmb3IgKGkgPSBob3N0ZGF0YS0+aWRfbWFzazsgaSA8PSAweDgwOyBpIDw8PSAxKQorCQlpZiAoaSA+IGhvc3RkYXRhLT5pZF9tYXNrKQorCQkJaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrIHw9IGk7CisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFJFQUxfRE1BCisJaG9zdGRhdGEtPmRtYWxlbiA9IDA7CisjZW5kaWYKKwlob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ID0gMDsKKwlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBOVUxMOworCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworCQorCUlOSVRfV09SSygmaG9zdGRhdGEtPmNvcm91dGluZSwgTkNSNTM4MF9tYWluLCBob3N0ZGF0YSk7CisJCisjaWZkZWYgTkNSNTM4MF9TVEFUUworCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJaG9zdGRhdGEtPnRpbWVfcmVhZFtpXSA9IDA7CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2ldID0gMDsKKwkJaG9zdGRhdGEtPmJ5dGVzX3JlYWRbaV0gPSAwOworCQlob3N0ZGF0YS0+Ynl0ZXNfd3JpdGVbaV0gPSAwOworCX0KKwlob3N0ZGF0YS0+dGltZWJhc2UgPSAwOworCWhvc3RkYXRhLT5wZW5kaW5ndyA9IDA7CisJaG9zdGRhdGEtPnBlbmRpbmdyID0gMDsKKyNlbmRpZgorCisJLyogVGhlIENIRUNLIGNvZGUgc2VlbXMgdG8gYnJlYWsgdGhlIDUzQzQwMC4gV2lsbCBjaGVjayBpdCBsYXRlciBtYXliZSAqLworCWlmIChmbGFncyAmIEZMQUdfTkNSNTNDNDAwKQorCQlob3N0ZGF0YS0+ZmxhZ3MgPSBGTEFHX0hBU19MQVNUX0JZVEVfU0VOVCB8IGZsYWdzOworCWVsc2UKKwkJaG9zdGRhdGEtPmZsYWdzID0gRkxBR19DSEVDS19MQVNUX0JZVEVfU0VOVCB8IGZsYWdzOworCisJaG9zdGRhdGEtPmhvc3QgPSBpbnN0YW5jZTsKKwlob3N0ZGF0YS0+dGltZV9leHBpcmVzID0gMDsKKworI2lmbmRlZiBBVVRPU0VOU0UKKwlpZiAoKGluc3RhbmNlLT5jbWRfcGVyX2x1biA+IDEpIHx8IGluc3RhbmNlLT5jYW5fcXVldWUgPiAxKQorCQkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogV0FSTklORyA6IHN1cHBvcnQgZm9yIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzIGVuYWJsZWRcbiIgIiAgICAgICAgIHdpdGhvdXQgQVVUT1NFTlNFIG9wdGlvbiwgY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbnMgbWF5XG4iCisJCSAgICAJICAgIiAgICAgICAgIGJlIGluY29ycmVjdGx5IGNsZWFyZWQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisjZW5kaWYJCQkJLyogZGVmIEFVVE9TRU5TRSAqLworCisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKyNpZmRlZiBOQ1I1M0M0MDAKKwlpZiAoaG9zdGRhdGEtPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApIHsKKwkJTkNSNTM4MF93cml0ZShDNDAwX0NPTlRST0xfU1RBVFVTX1JFRywgQ1NSX0JBU0UpOworCX0KKyNlbmRpZgorCisJLyogCisJICogRGV0ZWN0IGFuZCBjb3JyZWN0IGJ1cyB3ZWRnZSBwcm9ibGVtcy4KKwkgKgorCSAqIElmIHRoZSBzeXN0ZW0gY3Jhc2hlZCwgaXQgbWF5IGhhdmUgY3Jhc2hlZCBpbiBhIHN0YXRlIAorCSAqIHdoZXJlIGEgU0NTSSBjb21tYW5kIHdhcyBzdGlsbCBleGVjdXRpbmcsIGFuZCB0aGUgCisJICogU0NTSSBidXMgaXMgbm90IGluIGEgQlVTIEZSRUUgU1RBVEUuCisJICoKKwkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSdsbCB0cnkgdG8gYWJvcnQgdGhlIGN1cnJlbnRseQorCSAqIGVzdGFibGlzaGVkIG5leHVzIHdoaWNoIHdlIGtub3cgbm90aGluZyBhYm91dCwgYW5kIHRoYXQKKwkgKiBmYWlsaW5nLCBkbyBhIGhhcmQgcmVzZXQgb2YgdGhlIFNDU0kgYnVzIAorCSAqLworCisJZm9yIChwYXNzID0gMTsgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkgJiYgcGFzcyA8PSA2OyArK3Bhc3MpIHsKKwkJc3dpdGNoIChwYXNzKSB7CisJCWNhc2UgMToKKwkJY2FzZSAzOgorCQljYXNlIDU6CisJCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IFNDU0kgYnVzIGJ1c3ksIHdhaXRpbmcgdXAgdG8gZml2ZSBzZWNvbmRzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQl0aW1lb3V0ID0gamlmZmllcyArIDUgKiBIWjsKKwkJCU5DUjUzODBfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfQlNZLCAwLCA1KkhaKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IGJ1cyBidXN5LCBhdHRlbXB0aW5nIGFib3J0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQlkb19hYm9ydChpbnN0YW5jZSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBidXMgYnVzeSwgYXR0ZW1wdGluZyByZXNldFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJZG9fcmVzZXQoaW5zdGFuY2UpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiBidXMgbG9ja2VkIHNvbGlkIG9yIGludmFsaWQgb3ZlcnJpZGVcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJTkNSNTM4MF9leGl0CS0JcmVtb3ZlIGFuIE5DUjUzODAKKyAqCUBpbnN0YW5jZTogYWRhcHRlciB0byByZW1vdmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgTkNSNTM4MF9leGl0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZob3N0ZGF0YS0+Y29yb3V0aW5lKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCisvKioKKyAqCU5DUjUzODBfcXVldWVfY29tbWFuZCAJCS0JcXVldWUgYSBjb21tYW5kCisgKglAY21kOiBTQ1NJIGNvbW1hbmQKKyAqCUBkb25lOiBjb21wbGV0aW9uIGhhbmRsZXIKKyAqCisgKiAgICAgIGNtZCBpcyBhZGRlZCB0byB0aGUgcGVyIGluc3RhbmNlIGlzc3VlX3F1ZXVlLCB3aXRoIG1pbm9yIAorICogICAgICB0d2lkZGxpbmcgZG9uZSB0byB0aGUgaG9zdCBzcGVjaWZpYyBmaWVsZHMgb2YgY21kLiAgSWYgdGhlIAorICogICAgICBtYWluIGNvcm91dGluZSBpcyBub3QgcnVubmluZywgaXQgaXMgcmVzdGFydGVkLgorICoKKyAqCUxvY2tzOiBob3N0IGxvY2sgdGFrZW4gYnkgY2FsbGVyCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkgCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCVNjc2lfQ21uZCAqdG1wOworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCQlwcmludGsoInNjc2klZCA6IFdSSVRFIGF0dGVtcHRlZCB3aXRoIE5PX1dSSVRFIGRlYnVnZ2luZyBmbGFnIHNldFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQlkb25lKGNtZCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgkJCQkvKiAoTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFKSAqLworCisjaWZkZWYgTkNSNTM4MF9TVEFUUworCXN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisJCWNhc2UgV1JJVEU6CisJCWNhc2UgV1JJVEVfNjoKKwkJY2FzZSBXUklURV8xMDoKKwkJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkJaG9zdGRhdGEtPmJ5dGVzX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQlob3N0ZGF0YS0+cGVuZGluZ3crKzsKKwkJCWJyZWFrOworCQljYXNlIFJFQUQ6CisJCWNhc2UgUkVBRF82OgorCQljYXNlIFJFQURfMTA6CisJCQlob3N0ZGF0YS0+dGltZV9yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkJaG9zdGRhdGEtPmJ5dGVzX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCWhvc3RkYXRhLT5wZW5kaW5ncisrOworCQkJYnJlYWs7CisJfQorI2VuZGlmCisKKwkvKiAKKwkgKiBXZSB1c2UgdGhlIGhvc3Rfc2NyaWJibGUgZmllbGQgYXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNvbW1hbmQgIAorCSAqIGluIGEgcXVldWUgCisJICovCisKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwkvKiAKKwkgKiBJbnNlcnQgdGhlIGNtZCBpbnRvIHRoZSBpc3N1ZSBxdWV1ZS4gTm90ZSB0aGF0IFJFUVVFU1QgU0VOU0UgCisJICogY29tbWFuZHMgYXJlIGFkZGVkIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBzaW5jZSBhbnkgY29tbWFuZCB3aWxsCisJICogY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYW5kIHRoZSAKKwkgKiBzZW5zZSBkYXRhIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCB3aGlsZSB0aGUgY29uZGl0aW9uIGV4aXN0cy4KKwkgKi8KKworCWlmICghKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSkgfHwgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSkgeworCQlMSVNUKGNtZCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKKwkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBjbWQ7CisJfSBlbHNlIHsKKwkJZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgdG1wLT5ob3N0X3NjcmliYmxlOyB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZSk7CisJCUxJU1QoY21kLCB0bXApOworCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBjbWQ7CisJfQorCWRwcmludGsoTkRFQlVHX1FVRVVFUywgKCJzY3NpJWQgOiBjb21tYW5kIGFkZGVkIHRvICVzIG9mIHF1ZXVlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSA/ICJoZWFkIiA6ICJ0YWlsIikpOworCisJLyogUnVuIHRoZSBjb3JvdXRpbmUgaWYgaXQgaXNuJ3QgYWxyZWFkeSBydW5uaW5nLiAqLworCS8qIEtpY2sgb2ZmIGNvbW1hbmQgcHJvY2Vzc2luZyAqLworCXNjaGVkdWxlX3dvcmsoJmhvc3RkYXRhLT5jb3JvdXRpbmUpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJTkNSNTM4MF9tYWluCS0JTkNSIHN0YXRlIG1hY2hpbmVzCisgKgorICoJTkNSNTM4MF9tYWluIGlzIGEgY29yb3V0aW5lIHRoYXQgcnVucyBhcyBsb25nIGFzIG1vcmUgd29yayBjYW4gCisgKiAgICAgIGJlIGRvbmUgb24gdGhlIE5DUjUzODAgaG9zdCBhZGFwdGVycyBpbiBhIHN5c3RlbS4gIEJvdGggCisgKiAgICAgIE5DUjUzODBfcXVldWVfY29tbWFuZCgpIGFuZCBOQ1I1MzgwX2ludHIoKSB3aWxsIHRyeSB0byBzdGFydCBpdCAKKyAqICAgICAgaW4gY2FzZSBpdCBpcyBub3QgcnVubmluZy4KKyAqIAorICoJTG9ja3M6IGNhbGxlZCBhcyBpdHMgb3duIHRocmVhZCB3aXRoIG5vIGxvY2tzIGhlbGQuIFRha2VzIHRoZQorICoJaG9zdCBsb2NrIGFuZCBjYWxsZWQgcm91dGluZXMgbWF5IHRha2UgdGhlIGlzYSBkbWEgbG9jay4KKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX21haW4odm9pZCAqcCkKK3sKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBwOworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gaG9zdGRhdGEtPmhvc3Q7CisJU2NzaV9DbW5kICp0bXAsICpwcmV2OworCWludCBkb25lOworCQorCXNwaW5fbG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisJZG8geworCQkvKiBMb2NrIGhlbGQgaGVyZSAqLworCQlkb25lID0gMTsKKwkJaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkICYmICFob3N0ZGF0YS0+c2VsZWN0aW5nKSB7CisJCQlkcHJpbnRrKE5ERUJVR19NQUlOLCAoInNjc2klZCA6IG5vdCBjb25uZWN0ZWRcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCQkvKgorCQkJICogU2VhcmNoIHRocm91Z2ggdGhlIGlzc3VlX3F1ZXVlIGZvciBhIGNvbW1hbmQgZGVzdGluZWQKKwkJCSAqIGZvciBhIHRhcmdldCB0aGF0J3Mgbm90IGJ1c3kuCisJCQkgKi8KKwkJCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHByZXYgPSBOVUxMOyB0bXA7IHByZXYgPSB0bXAsIHRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlKSAKKwkJCXsKKwkJCQlpZiAocHJldiAhPSB0bXApCisJCQkJCWRwcmludGsoTkRFQlVHX0xJU1RTLCAoIk1BSU4gdG1wPSVwICAgdGFyZ2V0PSVkICAgYnVzeT0lZCBsdW49JWRcbiIsIHRtcCwgdG1wLT50YXJnZXQsIGhvc3RkYXRhLT5idXN5W3RtcC0+dGFyZ2V0XSwgdG1wLT5sdW4pKTsKKwkJCQkvKiAgV2hlbiB3ZSBmaW5kIG9uZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGlzc3VlIHF1ZXVlLiAqLworCQkJCWlmICghKGhvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCB0bXAtPmRldmljZS0+bHVuKSkpIHsKKwkJCQkJaWYgKHByZXYpIHsKKwkJCQkJCVJFTU9WRShwcmV2LCBwcmV2LT5ob3N0X3NjcmliYmxlLCB0bXAsIHRtcC0+aG9zdF9zY3JpYmJsZSk7CisJCQkJCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gdG1wLT5ob3N0X3NjcmliYmxlOworCQkJCQl9IGVsc2UgeworCQkJCQkJUkVNT1ZFKC0xLCBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHRtcCwgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlOworCQkJCQl9CisJCQkJCXRtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwkJCQkJLyogCisJCQkJCSAqIEF0dGVtcHQgdG8gZXN0YWJsaXNoIGFuIElfVF9MIG5leHVzIGhlcmUuIAorCQkJCQkgKiBPbiBzdWNjZXNzLCBpbnN0YW5jZS0+aG9zdGRhdGEtPmNvbm5lY3RlZCBpcyBzZXQuCisJCQkJCSAqIE9uIGZhaWx1cmUsIHdlIG11c3QgYWRkIHRoZSBjb21tYW5kIGJhY2sgdG8gdGhlCisJCQkJCSAqICAgaXNzdWUgcXVldWUgc28gd2UgY2FuIGtlZXAgdHJ5aW5nLiAKKwkJCQkJICovCisJCQkJCWRwcmludGsoTkRFQlVHX01BSU58TkRFQlVHX1FVRVVFUywgKCJzY3NpJWQgOiBtYWluKCkgOiBjb21tYW5kIGZvciB0YXJnZXQgJWQgbHVuICVkIHJlbW92ZWQgZnJvbSBpc3N1ZV9xdWV1ZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHRtcC0+dGFyZ2V0LCB0bXAtPmx1bikpOworCQorCQkJCQkvKgorCQkJCQkgKiBBIHN1Y2Nlc3NmdWwgc2VsZWN0aW9uIGlzIGRlZmluZWQgYXMgb25lIHRoYXQgCisJCQkJCSAqIGxlYXZlcyB1cyB3aXRoIHRoZSBjb21tYW5kIGNvbm5lY3RlZCBhbmQgCisJCQkJCSAqIGluIGhvc3RkYXRhLT5jb25uZWN0ZWQsIE9SIGhhcyB0ZXJtaW5hdGVkIHRoZQorCQkJCQkgKiBjb21tYW5kLgorCQkJCQkgKgorCQkJCQkgKiBXaXRoIHN1Y2Nlc3NmdWwgY29tbWFuZHMsIHdlIGZhbGwgdGhyb3VnaAorCQkJCQkgKiBhbmQgc2VlIGlmIHdlIGNhbiBkbyBhbiBpbmZvcm1hdGlvbiB0cmFuc2ZlciwKKwkJCQkJICogd2l0aCBmYWlsdXJlcyB3ZSB3aWxsIHJlc3RhcnQuCisJCQkJCSAqLworCQkJCQlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwkJCQkJLyogUnZDOiBoYXZlIHRvIHByZXNldCB0aGlzIHRvIGluZGljYXRlIGEgbmV3IGNvbW1hbmQgaXMgYmVpbmcgcGVyZm9ybWVkICovCisKKwkJCQkJaWYgKCFOQ1I1MzgwX3NlbGVjdChpbnN0YW5jZSwgdG1wLAorCQkJCQkJCSAgICAvKiAKKwkJCQkJCQkgICAgICogUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhcmUgaXNzdWVkIHdpdGhvdXQgdGFnZ2VkCisJCQkJCQkJICAgICAqIHF1ZXVlaW5nLCBldmVuIG9uIFNDU0ktSUkgZGV2aWNlcyBiZWNhdXNlIHRoZSAKKwkJCQkJCQkgICAgICogY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbiBleGlzdHMgZm9yIHRoZSAKKwkJCQkJCQkgICAgICogZW50aXJlIHVuaXQuCisJCQkJCQkJICAgICAqLworCQkJCQkJCSAgICAodG1wLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpID8gVEFHX05PTkUgOiBUQUdfTkVYVCkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJTElTVCh0bXAsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQkJCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJCQkJCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSB0bXA7CisJCQkJCQlkb25lID0gMDsKKwkJCQkJCWRwcmludGsoTkRFQlVHX01BSU58TkRFQlVHX1FVRVVFUywgKCJzY3NpJWQgOiBtYWluKCk6IHNlbGVjdCgpIGZhaWxlZCwgcmV0dXJuZWQgdG8gaXNzdWVfcXVldWVcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCQkJCX0KKwkJCQkJLyogbG9jayBoZWxkIGhlcmUgc3RpbGwgKi8KKwkJCQl9CS8qIGlmIHRhcmdldC9sdW4gaXMgbm90IGJ1c3kgKi8KKwkJCX0JLyogZm9yICovCisJCQkvKiBleGl0ZWQgbG9ja2VkICovCisJCX0JLyogaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSAqLworCQlpZiAoaG9zdGRhdGEtPnNlbGVjdGluZykgeworCQkJdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOworCQkJLyogU2VsZWN0aW9uIHdpbGwgZHJvcCBhbmQgcmV0YWtlIHRoZSBsb2NrICovCisJCQlpZiAoIU5DUjUzODBfc2VsZWN0KGluc3RhbmNlLCB0bXAsICh0bXAtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgPyBUQUdfTk9ORSA6IFRBR19ORVhUKSkgeworCQkJCS8qIE9rID8/ICovCisJCQl9IGVsc2UgeworCQkJCS8qIFJ2QzogZGV2aWNlIGZhaWxlZCwgc28gd2Ugd2FpdCBhIGxvbmcgdGltZQorCQkJCSAgIHRoaXMgaXMgbmVlZGVkIGZvciBNdXN0ZWsgc2Nhbm5lcnMsIHRoYXQKKwkJCQkgICBkbyBub3QgcmVzcG9uZCB0byBjb21tYW5kcyBpbW1lZGlhdGVseQorCQkJCSAgIGFmdGVyIGEgc2NhbiAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IGRldmljZSAlZCBkaWQgbm90IHJlc3BvbmQgaW4gdGltZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHRtcC0+ZGV2aWNlLT5pZCk7CisJCQkJTElTVCh0bXAsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQkJdG1wLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IHRtcDsKKwkJCQlOQ1I1MzgwX3NldF90aW1lcihob3N0ZGF0YSwgVVNMRUVQX1dBSVRMT05HKTsKKwkJCX0KKwkJfQkvKiBpZiBob3N0ZGF0YS0+c2VsZWN0aW5nICovCisJCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkCisjaWZkZWYgUkVBTF9ETUEKKwkJICAgICYmICFob3N0ZGF0YS0+ZG1hbGVuCisjZW5kaWYKKwkJICAgICYmICghaG9zdGRhdGEtPnRpbWVfZXhwaXJlcyB8fCB0aW1lX2JlZm9yZV9lcShob3N0ZGF0YS0+dGltZV9leHBpcmVzLCBqaWZmaWVzKSkKKwkJICAgICkgeworCQkJZHByaW50ayhOREVCVUdfTUFJTiwgKCJzY3NpJWQgOiBtYWluKCkgOiBwZXJmb3JtaW5nIGluZm9ybWF0aW9uIHRyYW5zZmVyXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcihpbnN0YW5jZSk7CisJCQlkcHJpbnRrKE5ERUJVR19NQUlOLCAoInNjc2klZCA6IG1haW4oKSA6IGRvbmUgc2V0IGZhbHNlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJZG9uZSA9IDA7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIWRvbmUpOworCQorCXNwaW5fdW5sb2NrX2lycShpbnN0YW5jZS0+aG9zdF9sb2NrKTsKK30KKworI2lmbmRlZiBET05UX1VTRV9JTlRSCisKKy8qKgorICogCU5DUjUzODBfaW50cgktCWdlbmVyaWMgTkNSNTM4MCBpcnEgaGFuZGxlcgorICoJQGlycTogaW50ZXJydXB0IG51bWJlcgorICoJQGRldl9pZDogZGV2aWNlIGluZm8KKyAqCUByZWdzOiByZWdpc3RlcnMgKHVudXNlZCkKKyAqCisgKglIYW5kbGUgaW50ZXJydXB0cywgcmVlc3RhYmxpc2hpbmcgSV9UX0wgb3IgSV9UX0xfUSBuZXh1c2VzCisgKiAgICAgIGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgYW5kIHJlc3RhcnRpbmcgTkNSNTM4MF9tYWluKCkgCisgKiAgICAgIGFzIHJlcXVpcmVkLgorICoKKyAqCUxvY2tzOiB0YWtlcyB0aGUgbmVlZGVkIGluc3RhbmNlIGxvY2tzCisgKi8KKworc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopZGV2X2lkOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJaW50IGRvbmU7CisJdW5zaWduZWQgY2hhciBiYXNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKE5ERUJVR19JTlRSLCAoInNjc2kgOiBOQ1I1MzgwIGlycSAlZCB0cmlnZ2VyZWRcbiIsIGlycSkpOworCisJZG8geworCQlkb25lID0gMTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkvKiBMb29rIGZvciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwkJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisJCWJhc3IgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKTsKKwkJLyogWFhYIGRpc3BhdGNoIHRvIGFwcHJvcHJpYXRlIHJvdXRpbmUgaWYgZm91bmQgYW5kIGRvbmU9MCAqLworCQlpZiAoYmFzciAmIEJBU1JfSVJRKSB7CisJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfSU5UUiwgaW5zdGFuY2UpOworCQkJaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMIHwgU1JfSU8pKSA9PSAoU1JfU0VMIHwgU1JfSU8pKSB7CisJCQkJZG9uZSA9IDA7CisJCQkJZHByaW50ayhOREVCVUdfSU5UUiwgKCJzY3NpJWQgOiBTRUwgaW50ZXJydXB0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCU5DUjUzODBfcmVzZWxlY3QoaW5zdGFuY2UpOworCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCQkJfSBlbHNlIGlmIChiYXNyICYgQkFTUl9QQVJJVFlfRVJST1IpIHsKKwkJCQlkcHJpbnRrKE5ERUJVR19JTlRSLCAoInNjc2klZCA6IFBBUklUWSBpbnRlcnJ1cHRcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCQkJKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJCQl9IGVsc2UgaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SU1QpID09IFNSX1JTVCkgeworCQkJCWRwcmludGsoTkRFQlVHX0lOVFIsICgic2NzaSVkIDogUkVTRVQgaW50ZXJydXB0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCQkJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorCQkJCS8qCisJCQkJICogV2Ugc2hvdWxkIG9ubHkgZ2V0IFBIQVNFIE1JU01BVENIIGFuZCBFT1AgaW50ZXJydXB0cworCQkJCSAqIGlmIHdlIGhhdmUgRE1BIGVuYWJsZWQsIHNvIGRvIGEgc2FuaXR5IGNoZWNrIGJhc2VkIG9uCisJCQkJICogdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aGUgTU9ERSByZWdpc3Rlci4KKwkJCQkgKi8KKworCQkJCWlmICgoTkNSNTM4MF9yZWFkKE1PREVfUkVHKSAmIE1SX0RNQSkgJiYgKChiYXNyICYgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSB8fCAhKGJhc3IgJiBCQVNSX1BIQVNFX01BVENIKSkpIHsKKwkJCQkJaW50IHRyYW5zZmVyZWQ7CisKKwkJCQkJaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJCQkJcGFuaWMoInNjc2klZCA6IHJlY2VpdmVkIGVuZCBvZiBETUEgaW50ZXJydXB0IHdpdGggbm8gY29ubmVjdGVkIGNtZFxuIiwgaW5zdGFuY2UtPmhvc3Rubyk7CisKKwkJCQkJdHJhbnNmZXJlZCA9IChob3N0ZGF0YS0+ZG1hbGVuIC0gTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpKTsKKwkJCQkJaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gdHJhbnNmZXJyZWQ7CisJCQkJCWhvc3RkYXRhLT5jb25uZWN0ZWQtPlNDcC5wdHIgKz0gdHJhbnNmZXJyZWQ7CisJCQkJCWhvc3RkYXRhLT5kbWFsZW4gPSAwOworCisJCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCQkJCQkJCQorCQkJCQkvKiBGSVhNRTogd2UgbmVlZCB0byBwb2xsIGJyaWVmbHkgdGhlbiBkZWZlciBhIHdvcmtxdWV1ZSB0YXNrICEgKi8KKwkJCQkJTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGhvc3RkYXRhLCBCVVNfQU5EX1NUQVRVU19SRUcsIEJBU1JfQUNLLCAwLCAyKkhaKTsKKworCQkJCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCQl9CisjZWxzZQorCQkJCWRwcmludGsoTkRFQlVHX0lOVFIsICgic2NzaSA6IHVua25vd24gaW50ZXJydXB0LCBCQVNSIDB4JVgsIE1SIDB4JVgsIFNSIDB4JXhcbiIsIGJhc3IsIE5DUjUzODBfcmVhZChNT0RFX1JFRyksIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkpOworCQkJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworI2VuZGlmCisJCQl9CisJCX0JLyogaWYgQkFTUl9JUlEgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmKCFkb25lKQorCQkJc2NoZWR1bGVfd29yaygmaG9zdGRhdGEtPmNvcm91dGluZSk7CisJfSB3aGlsZSAoIWRvbmUpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2VuZGlmIAorCisvKioKKyAqCWNvbGxlY3Rfc3RhdHMJCS0JY29sbGVjdCBzdGF0cyBvbiBhIHNjc2kgY29tbWFuZAorICoJQGhvc3RkYXRhOiBhZGFwdGVyIAorICoJQGNtZDogY29tbWFuZCBiZWluZyBpc3N1ZWQKKyAqCisgKglVcGRhdGUgdGhlIHN0YXRpc3RpY2FsIGRhdGEgYnkgcGFyc2luZyB0aGUgY29tbWFuZCBpbiBxdWVzdGlvbgorICovCisgCitzdGF0aWMgdm9pZCBjb2xsZWN0X3N0YXRzKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSwgU2NzaV9DbW5kICogY21kKSAKK3sKKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwljYXNlIFdSSVRFOgorCWNhc2UgV1JJVEVfNjoKKwljYXNlIFdSSVRFXzEwOgorCQlob3N0ZGF0YS0+dGltZV93cml0ZVtjbWQtPmRldmljZS0+aWRdICs9IChqaWZmaWVzIC0gaG9zdGRhdGEtPnRpbWViYXNlKTsKKwkJaG9zdGRhdGEtPnBlbmRpbmd3LS07CisJCWJyZWFrOworCWNhc2UgUkVBRDoKKwljYXNlIFJFQURfNjoKKwljYXNlIFJFQURfMTA6CisJCWhvc3RkYXRhLT50aW1lX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCWhvc3RkYXRhLT5wZW5kaW5nci0tOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIAorICogICAgICBpbnQgdGFnKTsKKyAqCisgKiBQdXJwb3NlIDogZXN0YWJsaXNoZXMgSV9UX0wgb3IgSV9UX0xfUSBuZXh1cyBmb3IgbmV3IG9yIGV4aXN0aW5nIGNvbW1hbmQsCisgKiAgICAgIGluY2x1ZGluZyBBUkJJVFJBVElPTiwgU0VMRUNUSU9OLCBhbmQgaW5pdGlhbCBtZXNzYWdlIG91dCBmb3IgCisgKiAgICAgIElERU5USUZZIGFuZCBxdWV1ZSBtZXNzYWdlcy4gCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW50aWF0aW9uIG9mIHRoZSA1MzgwIGRyaXZlciBvbiB3aGljaCB0aGlzIAorICogICAgICB0YXJnZXQgbGl2ZXMsIGNtZCAtIFNDU0kgY29tbWFuZCB0byBleGVjdXRlLCB0YWcgLSBzZXQgdG8gVEFHX05FWFQgZm9yIAorICogICAgICBuZXcgdGFnLCBUQUdfTk9ORSBmb3IgdW50YWdnZWQgcXVldWVpbmcsIG90aGVyd2lzZSBzZXQgdG8gdGhlIHRhZyBmb3IgCisgKiAgICAgIHRoZSBjb21tYW5kIHRoYXQgaXMgcHJlc2VudGx5IGNvbm5lY3RlZC4KKyAqIAorICogUmV0dXJucyA6IC0xIGlmIHNlbGVjdGlvbiBjb3VsZCBub3QgZXhlY3V0ZSBmb3Igc29tZSByZWFzb24sCisgKiAgICAgIDAgaWYgc2VsZWN0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQgYmVjYXVzZSB0aGUgdGFyZ2V0IAorICogICAgICBkaWQgbm90IHJlc3BvbmQuCisgKgorICogU2lkZSBlZmZlY3RzIDogCisgKiAgICAgIElmIGJ1cyBidXN5LCBhcmJpdHJhdGlvbiBmYWlsZWQsIGV0YywgTkNSNTM4MF9zZWxlY3QoKSB3aWxsIGV4aXQgCisgKiAgICAgICAgICAgICAgd2l0aCByZWdpc3RlcnMgYXMgdGhleSBzaG91bGQgaGF2ZSBiZWVuIG9uIGVudHJ5IC0gaWUKKyAqICAgICAgICAgICAgICBTRUxFQ1RfRU5BQkxFIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHksIHRoZSBOQ1I1MzgwCisgKiAgICAgICAgICAgICAgd2lsbCBjZWFzZSB0byBkcml2ZSBhbnkgU0NTSSBidXMgc2lnbmFscy4KKyAqCisgKiAgICAgIElmIHN1Y2Nlc3NmdWwgOiBJX1RfTCBvciBJX1RfTF9RIG5leHVzIHdpbGwgYmUgZXN0YWJsaXNoZWQsIAorICogICAgICAgICAgICAgIGluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbCBiZSBzZXQgdG8gY21kLiAgCisgKiAgICAgICAgICAgICAgU0VMRUNUIGludGVycnVwdCB3aWxsIGJlIGRpc2FibGVkLgorICoKKyAqICAgICAgSWYgZmFpbGVkIChubyB0YXJnZXQpIDogY21kLT5zY3NpX2RvbmUoKSB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSAKKyAqICAgICAgICAgICAgICBjbWQtPnJlc3VsdCBob3N0IGJ5dGUgc2V0IHRvIERJRF9CQURfVEFSR0VULgorICoKKyAqCUxvY2tzOiBjYWxsZXIgaG9sZHMgaG9zdGRhdGEgbG9jayBpbiBJUlEgbW9kZQorICovCisgCitzdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKiBjbWQsIGludCB0YWcpIAoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciB0bXBbM10sIHBoYXNlOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKwlpbnQgZXJyOworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaWYgKGhvc3RkYXRhLT5zZWxlY3RpbmcpCisJCWdvdG8gcGFydDI7CisKKwlob3N0ZGF0YS0+cmVzdGFydF9zZWxlY3QgPSAwOworCisJTkNSNTM4MF9kcHJpbnQoTkRFQlVHX0FSQklUUkFUSU9OLCBpbnN0YW5jZSk7CisJZHByaW50ayhOREVCVUdfQVJCSVRSQVRJT04sICgic2NzaSVkIDogc3RhcnRpbmcgYXJiaXRyYXRpb24sIGlkID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+dGhpc19pZCkpOworCisJLyogCisJICogU2V0IHRoZSBwaGFzZSBiaXRzIHRvIDAsIG90aGVyd2lzZSB0aGUgTkNSNTM4MCB3b24ndCBkcml2ZSB0aGUgCisJICogZGF0YSBidXMgZHVyaW5nIFNFTEVDVElPTi4KKwkgKi8KKworCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKworCS8qIAorCSAqIFN0YXJ0IGFyYml0cmF0aW9uLgorCSAqLworCisJTkNSNTM4MF93cml0ZShPVVRQVVRfREFUQV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9BUkJJVFJBVEUpOworCisKKwkvKiBXZSBjYW4gYmUgcmVsYXhlZCBoZXJlLCBpbnRlcnJ1cHRzIGFyZSBvbiwgd2UgYXJlCisJICAgaW4gd29ya3F1ZXVlIGNvbnRleHQsIHRoZSBiaXJkcyBhcmUgc2luZ2luZyBpbiB0aGUgdHJlZXMgKi8KKwlzcGluX3VubG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisJZXJyID0gTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGluc3RhbmNlLCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9BUkJJVFJBVElPTl9QUk9HUkVTUywgSUNSX0FSQklUUkFUSU9OX1BST0dSRVNTLCA1KkhaKTsKKwlzcGluX2xvY2tfaXJxKGluc3RhbmNlLT5ob3N0X2xvY2spOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpOiBhcmJpdHJhdGlvbiB0aW1lb3V0IGF0ICVkXG4iLCBfX0xJTkVfXyk7CisJCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCQlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWRwcmludGsoTkRFQlVHX0FSQklUUkFUSU9OLCAoInNjc2klZCA6IGFyYml0cmF0aW9uIGNvbXBsZXRlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJLyogCisJICogVGhlIGFyYml0cmF0aW9uIGRlbGF5IGlzIDIuMnVzLCBidXQgdGhpcyBpcyBhIG1pbmltdW0gYW5kIHRoZXJlIGlzIAorCSAqIG5vIG1heGltdW0gc28gd2UgY2FuIHNhZmVseSBzbGVlcCBmb3IgY2VpbCgyLjIpIHVzZWNzIHRvIGFjY29tbW9kYXRlCisJICogdGhlIGludGVncmFsIG5hdHVyZSBvZiB1ZGVsYXkoKS4KKwkgKgorCSAqLworCisJdWRlbGF5KDMpOworCisJLyogQ2hlY2sgZm9yIGxvc3QgYXJiaXRyYXRpb24gKi8KKwlpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8IChOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKSAmIGhvc3RkYXRhLT5pZF9oaWdoZXJfbWFzaykgfHwgKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpKSB7CisJCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCQlkcHJpbnRrKE5ERUJVR19BUkJJVFJBVElPTiwgKCJzY3NpJWQgOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBNUl9BUkJJVFJBVEVcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1NFTCk7CisKKwlpZiAoIShob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX0RUQzMxODFFKSAmJgorCSAgICAvKiBSdkM6IERUQzMxODFFIGhhcyBzb21lIHRyb3VibGUgd2l0aCB0aGlzCisJICAgICAqICAgICAgc28gd2Ugc2ltcGx5IHJlbW92ZWQgaXQuIFNlZW1zIHRvIHdvcmsgd2l0aAorCSAgICAgKiAgICAgIG9ubHkgTXVzdGVrIHNjYW5uZXIgYXR0YWNoZWQKKwkgICAgICovCisJICAgIChOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKSAmIElDUl9BUkJJVFJBVElPTl9MT1NUKSkgeworCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJZHByaW50ayhOREVCVUdfQVJCSVRSQVRJT04sICgic2NzaSVkIDogbG9zdCBhcmJpdHJhdGlvbiwgZGVhc3NlcnRpbmcgSUNSX0FTU0VSVF9TRUxcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwkvKiAKKwkgKiBBZ2FpbiwgYnVzIGNsZWFyICsgYnVzIHNldHRsZSB0aW1lIGlzIDEuMnVzLCBob3dldmVyLCB0aGlzIGlzIAorCSAqIGEgbWluaW11bSBzbyB3ZSdsbCB1ZGVsYXkgY2VpbCgxLjIpCisJICovCisKKwl1ZGVsYXkoMik7CisKKwlkcHJpbnRrKE5ERUJVR19BUkJJVFJBVElPTiwgKCJzY3NpJWQgOiB3b24gYXJiaXRyYXRpb25cbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisKKwkvKiAKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHdvbiBhcmJpdHJhdGlvbiwgc3RhcnQgU2VsZWN0aW9uIHByb2Nlc3MsIGFzc2VydGluZyAKKwkgKiB0aGUgaG9zdCBhbmQgdGFyZ2V0IElEJ3Mgb24gdGhlIFNDU0kgYnVzLgorCSAqLworCisJTkNSNTM4MF93cml0ZShPVVRQVVRfREFUQV9SRUcsIChob3N0ZGF0YS0+aWRfbWFzayB8ICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCkpKTsKKworCS8qIAorCSAqIFJhaXNlIEFUTiB3aGlsZSBTRUwgaXMgdHJ1ZSBiZWZvcmUgQlNZIGdvZXMgZmFsc2UgZnJvbSBhcmJpdHJhdGlvbiwKKwkgKiBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBndWFyYW50ZWUgdGhhdCB3ZSdsbCBnZXQgYSBNRVNTQUdFIE9VVAorCSAqIHBoYXNlIGltbWVkaWF0ZWx5IGFmdGVyIHNlbGVjdGlvbi4KKwkgKi8KKworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0JTWSB8IElDUl9BU1NFUlRfREFUQSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9TRUwpKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKworCS8qIAorCSAqIFJlc2VsZWN0IGludGVycnVwdHMgbXVzdCBiZSB0dXJuZWQgb2ZmIHByaW9yIHRvIHRoZSBkcm9wcGluZyBvZiBCU1ksCisJICogb3RoZXJ3aXNlIHdlIHdpbGwgdHJpZ2dlciBhbiBpbnRlcnJ1cHQuCisJICovCisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKwkvKgorCSAqIFRoZSBpbml0aWF0b3Igc2hhbGwgdGhlbiB3YWl0IGF0IGxlYXN0IHR3byBkZXNrZXcgZGVsYXlzIGFuZCByZWxlYXNlIAorCSAqIHRoZSBCU1kgc2lnbmFsLgorCSAqLworCXVkZWxheSgxKTsJCS8qIHdpbmdlbCAtLSB3YWl0IHR3byBidXMgZGVza2V3IGRlbGF5ID4yKjQ1bnMgKi8KKworCS8qIFJlc2V0IEJTWSAqLworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMKSk7CisKKwkvKiAKKwkgKiBTb21ldGhpbmcgd2VpcmQgaGFwcGVucyB3aGVuIHdlIGNlYXNlIHRvIGRyaXZlIEJTWSAtIGxvb2tzCisJICogbGlrZSB0aGUgYm9hcmQvY2hpcCBpcyBsZXR0aW5nIHVzIGRvIGFub3RoZXIgcmVhZCBiZWZvcmUgdGhlIAorCSAqIGFwcHJvcHJpYXRlIHByb3BhZ2F0aW9uIGRlbGF5IGhhcyBleHBpcmVkLCBhbmQgd2UncmUgY29uZnVzaW5nCisJICogYSBCU1kgc2lnbmFsIGZyb20gb3Vyc2VsdmVzIGFzIHRoZSB0YXJnZXQncyByZXNwb25zZSB0byBTRUxFQ1RJT04uCisJICoKKwkgKiBBIHNtYWxsIGRlbGF5ICh0aGUgJ0MrKycgZnJvbnRlbmQgYnJlYWtzIHRoZSBwaXBlbGluZSB3aXRoIGFuCisJICogdW5uZWNlc3NhcnkganVtcCwgbWFraW5nIGl0IHdvcmsgb24gbXkgMzg2LTMzL1RyYW50b3IgVDEyOCwgdGhlCisJICogdGlnaHRlciAnQycgY29kZSBicmVha3MgYW5kIHJlcXVpcmVzIHRoaXMpIHNvbHZlcyB0aGUgcHJvYmxlbSAtIAorCSAqIHRoZSAxIHVzIGRlbGF5IGlzIGFyYml0cmFyeSwgYW5kIG9ubHkgdXNlZCBiZWNhdXNlIHRoaXMgZGVsYXkgd2lsbCAKKwkgKiBiZSB0aGUgc2FtZSBvbiBvdGhlciBwbGF0Zm9ybXMgYW5kIHNpbmNlIGl0IHdvcmtzIGhlcmUsIGl0IHNob3VsZCAKKwkgKiB3b3JrIHRoZXJlLgorCSAqCisJICogd2luZ2VsIHN1Z2dlc3RzIHRoYXQgdGhpcyBjb3VsZCBiZSBkdWUgdG8gZmFpbGluZyB0byB3YWl0CisJICogb25lIGRlc2tldyBkZWxheS4KKwkgKi8KKworCXVkZWxheSgxKTsKKworCWRwcmludGsoTkRFQlVHX1NFTEVDVElPTiwgKCJzY3NpJWQgOiBzZWxlY3RpbmcgdGFyZ2V0ICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkKSk7CisKKwkvKiAKKwkgKiBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIGNhbGxzIGZvciBhIDI1MCBtcyB0aW1lb3V0IGZvciB0aGUgYWN0dWFsIAorCSAqIHNlbGVjdGlvbi4KKwkgKi8KKworCXRpbWVvdXQgPSBqaWZmaWVzICsgKDI1MCAqIEhaIC8gMTAwMCk7CisKKwkvKiAKKwkgKiBYWFggdmVyeSBpbnRlcmVzdGluZyAtIHdlJ3JlIHNlZWluZyBhIGJvdW5jZSB3aGVyZSB0aGUgQlNZIHdlIAorCSAqIGFzc2VydGVkIGlzIGJlaW5nIHJlZmxlY3RlZCAvIHN0aWxsIGFzc2VydGVkIChwcm9wYWdhdGlvbiBkZWxheT8pCisJICogYW5kIGl0J3MgZGV0ZWN0aW5nIGFzIHRydWUuICBTaWdoLgorCSAqLworCisJaG9zdGRhdGEtPnNlbGVjdF90aW1lID0gMDsJLyogd2UgY291bnQgdGhlIGNsb2NrIHRpY2tzIGF0IHdoaWNoIHdlIHBvbGxlZCAqLworCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBjbWQ7CisKK3BhcnQyOgorCS8qIFJ2QzogaGVyZSB3ZSBlbnRlciBhZnRlciBhIHNsZWVwaW5nIHBlcmlvZCwgb3IgaW1tZWRpYXRlbHkgYWZ0ZXIKKwkgICBleGVjdXRpb24gb2YgcGFydCAxCisJICAgd2UgcG9sbCBvbmx5IG9uY2UgZWNoIGNsb2NrIHRpY2sgKi8KKwl2YWx1ZSA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIChTUl9CU1kgfCBTUl9JTyk7CisKKwlpZiAoIXZhbHVlICYmIChob3N0ZGF0YS0+c2VsZWN0X3RpbWUgPCBIWi80KSkgeworCQkvKiBSdkM6IHdlIHN0aWxsIG11c3Qgd2FpdCBmb3IgYSBkZXZpY2UgcmVzcG9uc2UgKi8KKwkJaG9zdGRhdGEtPnNlbGVjdF90aW1lKys7CS8qIGFmdGVyIDI1IHRpY2tzIHRoZSBkZXZpY2UgaGFzIGZhaWxlZCAqLworCQlOQ1I1MzgwX3NldF90aW1lcihob3N0ZGF0YSwgMSk7CisJCXJldHVybiAwOwkvKiBSdkM6IHdlIHJldHVybiBoZXJlIHdpdGggaG9zdGRhdGEtPnNlbGVjdGluZyBzZXQsCisJCQkJICAgdG8gZ28gdG8gc2xlZXAgKi8KKwl9CisKKwlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsvKiBjbGVhciB0aGlzIHBvaW50ZXIsIGJlY2F1c2Ugd2UgcGFzc2VkIHRoZQorCQkJCQkgICB3YWl0aW5nIHBlcmlvZCAqLworCWlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgKFNSX1NFTCB8IFNSX0lPKSkgPT0gKFNSX1NFTCB8IFNSX0lPKSkgeworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQlOQ1I1MzgwX3Jlc2VsZWN0KGluc3RhbmNlKTsKKwkJcHJpbnRrKCJzY3NpJWQgOiByZXNlbGVjdGlvbiBhZnRlciB3b24gYXJiaXRyYXRpb24/XG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiAKKwkgKiBObyBsZXNzIHRoYW4gdHdvIGRlc2tldyBkZWxheXMgYWZ0ZXIgdGhlIGluaXRpYXRvciBkZXRlY3RzIHRoZSAKKwkgKiBCU1kgc2lnbmFsIGlzIHRydWUsIGl0IHNoYWxsIHJlbGVhc2UgdGhlIFNFTCBzaWduYWwgYW5kIG1heSAKKwkgKiBjaGFuZ2UgdGhlIERBVEEgQlVTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2luZ2VsCisJICovCisKKwl1ZGVsYXkoMSk7CisKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisKKwlpZiAoIShOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpKSB7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCWlmIChob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZCA6IHdlaXJkbmVzc1xuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJaWYgKGhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiXHRyZXN0YXJ0IHNlbGVjdFxuIik7CisJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfU0VMRUNUSU9OLCBpbnN0YW5jZSk7CisJCQlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY21kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQlkcHJpbnRrKE5ERUJVR19TRUxFQ1RJT04sICgic2NzaSVkIDogdGFyZ2V0IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gMjUwbXNcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCWhvc3RkYXRhLT50YXJnZXRzX3ByZXNlbnQgfD0gKDEgPDwgY21kLT5kZXZpY2UtPmlkKTsKKworCS8qCisJICogU2luY2Ugd2UgZm9sbG93ZWQgdGhlIFNDU0kgc3BlYywgYW5kIHJhaXNlZCBBVE4gd2hpbGUgU0VMIAorCSAqIHdhcyB0cnVlIGJ1dCBiZWZvcmUgQlNZIHdhcyBmYWxzZSBkdXJpbmcgc2VsZWN0aW9uLCB0aGUgaW5mb3JtYXRpb24KKwkgKiB0cmFuc2ZlciBwaGFzZSBzaG91bGQgYmUgYSBNRVNTQUdFIE9VVCBwaGFzZSBzbyB0aGF0IHdlIGNhbiBzZW5kIHRoZQorCSAqIElERU5USUZZIG1lc3NhZ2UuCisJICogCisJICogSWYgU0NTSS1JSSB0YWdnZWQgcXVldWluZyBpcyBlbmFibGVkLCB3ZSBhbHNvIHNlbmQgYSBTSU1QTEVfUVVFVUVfVEFHCisJICogbWVzc2FnZSAoMiBieXRlcykgd2l0aCBhIHRhZyBJRCB0aGF0IHdlIGluY3JlbWVudCB3aXRoIGV2ZXJ5IGNvbW1hbmQKKwkgKiB1bnRpbCBpdCB3cmFwcyBiYWNrIHRvIDAuCisJICoKKwkgKiBYWFggLSBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBhcmUgc29tZSBicm9rZW4gU0NTSS1JSSBkZXZpY2VzLAorCSAqICAgICAgIHdoaWNoIGNsYWltIHRvIHN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmcgYnV0IGZhaWwgd2hlbiBtb3JlIHRoYW4KKwkgKiAgICAgICBzb21lIG51bWJlciBvZiBjb21tYW5kcyBhcmUgaXNzdWVkIGF0IG9uY2UuCisJICovCisKKwkvKiBXYWl0IGZvciBzdGFydCBvZiBSRVEvQUNLIGhhbmRzaGFrZSAqLworCisJc3Bpbl91bmxvY2tfaXJxKGluc3RhbmNlLT5ob3N0X2xvY2spOworCWVyciA9IE5DUjUzODBfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfUkVRLCBTUl9SRVEsIEhaKTsKKwlzcGluX2xvY2tfaXJxKGluc3RhbmNlLT5ob3N0X2xvY2spOworCQorCWlmKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2klZDogdGltZW91dCBhdCBOQ1I1MzgwLmM6JWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBfX0xJTkVfXyk7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJZHByaW50ayhOREVCVUdfU0VMRUNUSU9OLCAoInNjc2klZCA6IHRhcmdldCAlZCBzZWxlY3RlZCwgZ29pbmcgaW50byBNRVNTQUdFIE9VVCBwaGFzZS5cbiIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQpKTsKKwl0bXBbMF0gPSBJREVOVElGWSgoKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkgPyAwIDogMSksIGNtZC0+ZGV2aWNlLT5sdW4pOworCisJbGVuID0gMTsKKwljbWQtPnRhZyA9IDA7CisKKwkvKiBTZW5kIG1lc3NhZ2UocykgKi8KKwlkYXRhID0gdG1wOworCXBoYXNlID0gUEhBU0VfTVNHT1VUOworCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwlkcHJpbnRrKE5ERUJVR19TRUxFQ1RJT04sICgic2NzaSVkIDogbmV4dXMgZXN0YWJsaXNoZWQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCS8qIFhYWCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgaGVyZSAqLworCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKworCWlmIChjbWQtPlNDcC5wdHIgIT0gKGNoYXIgKiljbWQtPnNlbnNlX2J1ZmZlcikgeworCQlpbml0aWFsaXplX1NDcChjbWQpOworCX0KKworCXJldHVybiAwOworCisJLyogU2VsZWN0aW9uIGZhaWxlZCAqLworZmFpbGVkOgorCXJldHVybiAtMTsKKworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfdHJhbnNmZXJfcGlvIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKiAgICAgIHVuc2lnbmVkIGNoYXIgKnBoYXNlLCBpbnQgKmNvdW50LCB1bnNpZ25lZCBjaGFyICoqZGF0YSkKKyAqCisgKiBQdXJwb3NlIDogdHJhbnNmZXJzIGRhdGEgaW4gZ2l2ZW4gcGhhc2UgdXNpbmcgcG9sbGVkIEkvTworICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgZHJpdmVyLCAqcGhhc2UgLSBwb2ludGVyIHRvIAorICogICAgICB3aGF0IHBoYXNlIGlzIGV4cGVjdGVkLCAqY291bnQgLSBwb2ludGVyIHRvIG51bWJlciBvZiAKKyAqICAgICAgYnl0ZXMgdG8gdHJhbnNmZXIsICoqZGF0YSAtIHBvaW50ZXIgdG8gZGF0YSBwb2ludGVyLgorICogCisgKiBSZXR1cm5zIDogLTEgd2hlbiBkaWZmZXJlbnQgcGhhc2UgaXMgZW50ZXJlZCB3aXRob3V0IHRyYW5zZmVycmluZworICogICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcywgMCBpZiBhbGwgYnl0ZXMgb3IgdHJhbnNmZXJlZCBvciBleGl0CisgKiAgICAgIGlzIGluIHNhbWUgcGhhc2UuCisgKgorICogICAgICBBbHNvLCAqcGhhc2UsICpjb3VudCwgKmRhdGEgYXJlIG1vZGlmaWVkIGluIHBsYWNlLgorICoKKyAqIFhYWCBOb3RlIDogaGFuZGxpbmcgZm9yIGJ1cyBmcmVlIG1heSBiZSB1c2VmdWwuCisgKi8KKworLyoKKyAqIE5vdGUgOiB0aGlzIGNvZGUgaXMgbm90IGFzIHF1aWNrIGFzIGl0IGNvdWxkIGJlLCBob3dldmVyIGl0IAorICogSVMgMTAwJSByZWxpYWJsZSwgYW5kIGZvciB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgd2hlcmUgc3BlZWQKKyAqIGNvdW50cywgd2Ugd2lsbCBhbHdheXMgZG8gYSBwc2V1ZG8gRE1BIG9yIERNQSB0cmFuc2Zlci4KKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfdHJhbnNmZXJfcGlvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwl1bnNpZ25lZCBjaGFyIHAgPSAqcGhhc2UsIHRtcDsKKwlpbnQgYyA9ICpjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkID0gKmRhdGE7CisJLyoKKwkgKiAgICAgIFJ2Qzogc29tZSBhZG1pbmlzdHJhdGl2ZSBkYXRhIHRvIHByb2Nlc3MgcG9sbGluZyB0aW1lCisJICovCisJaW50IGJyZWFrX2FsbG93ZWQgPSAwOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlpZiAoIShwICYgU1JfSU8pKQorCQlkcHJpbnRrKE5ERUJVR19QSU8sICgic2NzaSVkIDogcGlvIHdyaXRlICVkIGJ5dGVzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgYykpOworCWVsc2UKKwkJZHByaW50ayhOREVCVUdfUElPLCAoInNjc2klZCA6IHBpbyByZWFkICVkIGJ5dGVzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgYykpOworCisJLyogCisJICogVGhlIE5DUjUzODAgY2hpcCB3aWxsIG9ubHkgZHJpdmUgdGhlIFNDU0kgYnVzIHdoZW4gdGhlIAorCSAqIHBoYXNlIHNwZWNpZmllZCBpbiB0aGUgYXBwcm9wcmlhdGUgYml0cyBvZiB0aGUgVEFSR0VUIENPTU1BTkQKKwkgKiBSRUdJU1RFUiBtYXRjaCB0aGUgU1RBVFVTIFJFR0lTVEVSCisJICovCisKKwkgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUihwKSk7CisKKwkvKiBSdkM6IGRvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNlc3NhcnksIGJ1dCBvdGhlciBTQ1NJIEkvTyBpcyBzaG9ydAorCSAqICAgICAgc28gYnJlYWtzIGFyZSBub3QgbmVjZXNzYXJ5IHRoZXJlCisJICovCisJaWYgKChwID09IFBIQVNFX0RBVEFJTikgfHwgKHAgPT0gUEhBU0VfREFUQU9VVCkpIHsKKwkJYnJlYWtfYWxsb3dlZCA9IDE7CisJfQorCWRvIHsKKwkJLyogCisJCSAqIFdhaXQgZm9yIGFzc2VydGlvbiBvZiBSRVEsIGFmdGVyIHdoaWNoIHRoZSBwaGFzZSBiaXRzIHdpbGwgYmUgCisJCSAqIHZhbGlkIAorCQkgKi8KKworCQkvKiBSdkM6IHdlIHNpbXBseSBwb2xsIG9uY2UsIGFmdGVyIHRoYXQgd2Ugc3RvcCB0ZW1wb3JhcmlseQorCQkgKiAgICAgIGFuZCBsZXQgdGhlIGRldmljZSBidWZmZXIgZmlsbCB1cAorCQkgKiAgICAgIGlmIGJyZWFraW5nIGlzIG5vdCBhbGxvd2VkLCB3ZSBrZWVwIHBvbGxpbmcgYXMgbG9uZyBhcyBuZWVkZWQKKwkJICovCisKKwkJLyogRklYTUUgKi8KKwkJd2hpbGUgKCEoKHRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkgJiBTUl9SRVEpICYmICFicmVha19hbGxvd2VkKTsKKwkJaWYgKCEodG1wICYgU1JfUkVRKSkgeworCQkJLyogdGltZW91dCBjb25kaXRpb24gKi8KKwkJCU5DUjUzODBfc2V0X3RpbWVyKGhvc3RkYXRhLCBVU0xFRVBfU0xFRVApOworCQkJYnJlYWs7CisJCX0KKworCQlkcHJpbnRrKE5ERUJVR19IQU5EU0hBS0UsICgic2NzaSVkIDogUkVRIGRldGVjdGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJCS8qIENoZWNrIGZvciBwaGFzZSBtaXNtYXRjaCAqLworCQlpZiAoKHRtcCAmIFBIQVNFX01BU0spICE9IHApIHsKKwkJCWRwcmludGsoTkRFQlVHX0hBTkRTSEFLRSwgKCJzY3NpJWQgOiBwaGFzZSBtaXNtYXRjaFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJCU5DUjUzODBfZHByaW50X3BoYXNlKE5ERUJVR19IQU5EU0hBS0UsIGluc3RhbmNlKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIERvIGFjdHVhbCB0cmFuc2ZlciBmcm9tIFNDU0kgYnVzIHRvIC8gZnJvbSBtZW1vcnkgKi8KKwkJaWYgKCEocCAmIFNSX0lPKSkKKwkJCU5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCAqZCk7CisJCWVsc2UKKwkJCSpkID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisKKwkJKytkOworCisJCS8qIAorCQkgKiBUaGUgU0NTSSBzdGFuZGFyZCBzdWdnZXN0cyB0aGF0IGluIE1TR09VVCBwaGFzZSwgdGhlIGluaXRpYXRvcgorCQkgKiBzaG91bGQgZHJvcCBBVE4gb24gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSBwaGFzZQorCQkgKiBhZnRlciBSRVEgaGFzIGJlZW4gYXNzZXJ0ZWQgZm9yIHRoZSBoYW5kc2hha2UgYnV0IGJlZm9yZQorCQkgKiB0aGUgaW5pdGlhdG9yIHJhaXNlcyBBQ0suCisJCSAqLworCisJCWlmICghKHAgJiBTUl9JTykpIHsKKwkJCWlmICghKChwICYgU1JfTVNHKSAmJiBjID4gMSkpIHsKKwkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEpOworCQkJCU5DUjUzODBfZHByaW50KE5ERUJVR19QSU8sIGluc3RhbmNlKTsKKwkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FDSyk7CisJCQl9IGVsc2UgeworCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfREFUQSB8IElDUl9BU1NFUlRfQVROKTsKKwkJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfUElPLCBpbnN0YW5jZSk7CisJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4gfCBJQ1JfQVNTRVJUX0FDSyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlOQ1I1MzgwX2RwcmludChOREVCVUdfUElPLCBpbnN0YW5jZSk7CisJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FDSyk7CisJCX0KKworCQkvKiBGSVhNRSAtIGlmIHRoaXMgZmFpbHMgYnVzIHJlc2V0ID8/ICovCisJCU5DUjUzODBfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfUkVRLCAwLCA1KkhaKTsKKwkJZHByaW50ayhOREVCVUdfSEFORFNIQUtFLCAoInNjc2klZCA6IHJlcSBmYWxzZSwgaGFuZHNoYWtlIGNvbXBsZXRlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisvKgorICogV2UgaGF2ZSBzZXZlcmFsIHNwZWNpYWwgY2FzZXMgdG8gY29uc2lkZXIgZHVyaW5nIFJFUS9BQ0sgaGFuZHNoYWtpbmcgOiAKKyAqIDEuICBXZSB3ZXJlIGluIE1TR09VVCBwaGFzZSwgYW5kIHdlIGFyZSBvbiB0aGUgbGFzdCBieXRlIG9mIHRoZSAKKyAqICAgICAgbWVzc2FnZS4gIEFUTiBtdXN0IGJlIGRyb3BwZWQgYXMgQUNLIGlzIGRyb3BwZWQuCisgKgorICogMi4gIFdlIGFyZSBpbiBhIE1TR0lOIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlICAKKyAqICAgICAgbWVzc2FnZS4gIFdlIG11c3QgZXhpdCB3aXRoIEFDSyBhc3NlcnRlZCwgc28gdGhhdCB0aGUgY2FsbGluZworICogICAgICBjb2RlIG1heSByYWlzZSBBVE4gYmVmb3JlIGRyb3BwaW5nIEFDSyB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisgKgorICogMy4gIEFDSyBhbmQgQVROIGFyZSBjbGVhciBhbmQgdGhlIHRhcmdldCBtYXkgcHJvY2VlZCBhcyBub3JtYWwuCisgKi8KKwkJaWYgKCEocCA9PSBQSEFTRV9NU0dJTiAmJiBjID09IDEpKSB7CisJCQlpZiAocCA9PSBQSEFTRV9NU0dPVVQgJiYgYyA+IDEpCisJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCQkJZWxzZQorCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCX0KKwl9IHdoaWxlICgtLWMpOworCisJZHByaW50ayhOREVCVUdfUElPLCAoInNjc2klZCA6IHJlc2lkdWFsICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgYykpOworCisJKmNvdW50ID0gYzsKKwkqZGF0YSA9IGQ7CisJdG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworCWlmICh0bXAgJiBTUl9SRVEpCisJCSpwaGFzZSA9IHRtcCAmIFBIQVNFX01BU0s7CisJZWxzZQorCQkqcGhhc2UgPSBQSEFTRV9VTktOT1dOOworCisJaWYgKCFjIHx8ICgqcGhhc2UgPT0gcCkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCisvKioKKyAqCWRvX3Jlc2V0CS0JaXNzdWUgYSByZXNldCBjb21tYW5kCisgKglAaG9zdDogYWRhcHRlciB0byByZXNldAorICoKKyAqCUlzc3VlIGEgcmVzZXQgc2VxdWVuY2UgdG8gdGhlIE5DUjUzODAgYW5kIHRyeSBhbmQgZ2V0IHRoZSBidXMKKyAqCWJhY2sgaW50byBzYW5lIHNoYXBlLgorICoKKyAqCUxvY2tzOiBjYWxsZXIgaG9sZHMgcXVldWUgbG9jaworICovCisgCitzdGF0aWMgdm9pZCBkb19yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSB7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChob3N0KTsKKworCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSykpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfUlNUKTsKKwl1ZGVsYXkoMjUpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGRvX2Fib3J0IChTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBhYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzLiAgU2hvdWxkIG9ubHkgYmUgCisgKiAgICAgIGNhbGxlZCBmcm9tIGEgcm91dGluZSB3aGljaCBjYW4gZHJvcCBpbnRvIGEgCisgKiAKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKgorICogTG9ja3M6IHF1ZXVlIGxvY2sgaGVsZCBieSBjYWxsZXIKKyAqCUZJWE1FOiBzb3J0IHRoaXMgb3V0IGFuZCBnZXQgbmV3X2VoIHJ1bm5pbmcKKyAqLworCitzdGF0aWMgaW50IGRvX2Fib3J0KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwl1bnNpZ25lZCBjaGFyICptc2dwdHIsIHBoYXNlLCB0bXA7CisJaW50IGxlbjsKKwlpbnQgcmM7CisJTkNSNTM4MF9zZXR1cChob3N0KTsKKworCisJLyogUmVxdWVzdCBtZXNzYWdlIG91dCBwaGFzZSAqLworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKworCS8qIAorCSAqIFdhaXQgZm9yIHRoZSB0YXJnZXQgdG8gaW5kaWNhdGUgYSB2YWxpZCBwaGFzZSBieSBhc3NlcnRpbmcgCisJICogUkVRLiAgT25jZSB0aGlzIGhhcHBlbnMsIHdlJ2xsIGhhdmUgZWl0aGVyIGEgTVNHT1VUIHBoYXNlIAorCSAqIGFuZCBjYW4gaW1tZWRpYXRlbHkgc2VuZCB0aGUgQUJPUlQgbWVzc2FnZSwgb3Igd2UnbGwgaGF2ZSBzb21lIAorCSAqIG90aGVyIHBoYXNlIGFuZCB3aWxsIGhhdmUgdG8gc291cmNlL3NpbmsgZGF0YS4KKwkgKiAKKwkgKiBXZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGF0IHZhbHVlIHdhcyBvbiB0aGUgYnVzIG9yIHdoYXQgdmFsdWUKKwkgKiB0aGUgdGFyZ2V0IHNlZXMsIHNvIHdlIGp1c3QgaGFuZHNoYWtlLgorCSAqLworCisJcmMgPSBOQ1I1MzgwX3BvbGxfcG9saXRlbHkoaG9zdCwgU1RBVFVTX1JFRywgU1JfUkVRLCBTUl9SRVEsIDYwICogSFopOworCQorCWlmKHJjIDwgMCkKKwkJcmV0dXJuIC0xOworCisJdG1wID0gKHVuc2lnbmVkIGNoYXIpcmM7CisJCisJTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUih0bXApKTsKKworCWlmICgodG1wICYgUEhBU0VfTUFTSykgIT0gUEhBU0VfTVNHT1VUKSB7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9BQ0spOworCQlyYyA9IE5DUjUzODBfcG9sbF9wb2xpdGVseShob3N0LCBTVEFUVVNfUkVHLCBTUl9SRVEsIDAsIDMqSFopOworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisJCWlmKHJjID09IC0xKQorCQkJcmV0dXJuIC0xOworCX0KKwl0bXAgPSBBQk9SVDsKKwltc2dwdHIgPSAmdG1wOworCWxlbiA9IDE7CisJcGhhc2UgPSBQSEFTRV9NU0dPVVQ7CisJTkNSNTM4MF90cmFuc2Zlcl9waW8oaG9zdCwgJnBoYXNlLCAmbGVuLCAmbXNncHRyKTsKKworCS8qCisJICogSWYgd2UgZ290IGhlcmUsIGFuZCB0aGUgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LAorCSAqIHdlJ3JlIGFib3V0IHRvIGdvIGludG8gYnVzIGZyZWUgc3RhdGUuCisJICovCisKKwlyZXR1cm4gbGVuID8gLTEgOiAwOworfQorCisjaWYgZGVmaW5lZChSRUFMX0RNQSkgfHwgZGVmaW5lZChQU0VVRE9fRE1BKSB8fCBkZWZpbmVkIChSRUFMX0RNQV9QT0xMKQorLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIGVpdGhlciByZWFsCisgKiAgICAgIG9yIHBzZXVkbyBETUEuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW5jZSBvZiBkcml2ZXIsICpwaGFzZSAtIHBvaW50ZXIgdG8gCisgKiAgICAgIHdoYXQgcGhhc2UgaXMgZXhwZWN0ZWQsICpjb3VudCAtIHBvaW50ZXIgdG8gbnVtYmVyIG9mIAorICogICAgICBieXRlcyB0byB0cmFuc2ZlciwgKipkYXRhIC0gcG9pbnRlciB0byBkYXRhIHBvaW50ZXIuCisgKiAKKyAqIFJldHVybnMgOiAtMSB3aGVuIGRpZmZlcmVudCBwaGFzZSBpcyBlbnRlcmVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nCisgKiAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzLCAwIGlmIGFsbCBieXRlcyBvciB0cmFuc2ZlcmVkIG9yIGV4aXQKKyAqICAgICAgaXMgaW4gc2FtZSBwaGFzZS4KKyAqCisgKiAgICAgIEFsc28sICpwaGFzZSwgKmNvdW50LCAqZGF0YSBhcmUgbW9kaWZpZWQgaW4gcGxhY2UuCisgKgorICoJTG9ja3M6IGlvX3JlcXVlc3QgbG9jayBoZWxkIGJ5IGNhbGxlcgorICovCisKKworc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKipkYXRhKSB7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJcmVnaXN0ZXIgaW50IGMgPSAqY291bnQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBwID0gKnBoYXNlOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmQgPSAqZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgZm9vOworI2lmIGRlZmluZWQoUkVBTF9ETUFfUE9MTCkKKwlpbnQgY250LCB0b1BJTzsKKwl1bnNpZ25lZCBjaGFyIHNhdmVkX2RhdGEgPSAwLCBvdmVycnVuID0gMCwgcmVzaWR1ZTsKKyNlbmRpZgorCisJc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCU5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworCisJaWYgKCh0bXAgPSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSykpICE9IHApIHsKKwkJKnBoYXNlID0gdG1wOworCQlyZXR1cm4gLTE7CisJfQorI2lmIGRlZmluZWQoUkVBTF9ETUEpIHx8IGRlZmluZWQoUkVBTF9ETUFfUE9MTCkKKyNpZmRlZiBSRUFEX09WRVJSVU5TCisJaWYgKHAgJiBTUl9JTykgeworCQljIC09IDI7CisJfQorI2VuZGlmCisJZHByaW50ayhOREVCVUdfRE1BLCAoInNjc2klZCA6IGluaXRpYWxpemluZyBETUEgY2hhbm5lbCAlZCBmb3IgJXMsICVkIGJ5dGVzICVzICUweFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5kbWFfY2hhbm5lbCwgKHAgJiBTUl9JTykgPyAicmVhZGluZyIgOiAid3JpdGluZyIsIGMsIChwICYgU1JfSU8pID8gInRvIiA6ICJmcm9tIiwgKHVuc2lnbmVkKSBkKSk7CisJaG9zdGRhdGEtPmRtYV9sZW4gPSAocCAmIFNSX0lPKSA/IE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdGFuY2UsIGQsIGMpIDogTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGQsIGMpOworI2VuZGlmCisKKwlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgUEhBU0VfU1JfVE9fVENSKHApKTsKKworI2lmZGVmIFJFQUxfRE1BCisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSB8IE1SX0RNQV9NT0RFIHwgTVJfRU5BQkxFX0VPUF9JTlRSIHwgTVJfTU9OSVRPUl9CU1kpOworI2VsaWYgZGVmaW5lZChSRUFMX0RNQV9QT0xMKQorCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UgfCBNUl9ETUFfTU9ERSk7CisjZWxzZQorCS8qCisJICogTm90ZSA6IG9uIG15IHNhbXBsZSBib2FyZCwgd2F0Y2gtZG9nIHRpbWVvdXRzIG9jY3VycmVkIHdoZW4gaW50ZXJydXB0cworCSAqIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgYSBzaW5nbGUgRE1BIHRyYW5zZmVyLCBmcm9tIAorCSAqIGJlZm9yZSB0aGUgc2V0dGluZyBvZiBETUEgbW9kZSB0byBhZnRlciB0cmFuc2ZlciBvZiB0aGUgbGFzdCBieXRlLgorCSAqLworCisjaWYgZGVmaW5lZChQU0VVRE9fRE1BKSAmJiBkZWZpbmVkKFVOU0FGRSkKKwlzcGluX3VubG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisjZW5kaWYKKwkvKiBLTEwgTWF5IG5lZWQgZW9wIGFuZCBwYXJpdHkgaW4gNTNjNDAwICovCisJaWYgKGhvc3RkYXRhLT5mbGFncyAmIEZMQUdfTkNSNTNDNDAwKQorCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFIHwgTVJfRE1BX01PREUgfCBNUl9FTkFCTEVfUEFSX0NIRUNLIHwgTVJfRU5BQkxFX1BBUl9JTlRSIHwgTVJfRU5BQkxFX0VPUF9JTlRSIHwgTVJfRE1BX01PREUgfCBNUl9NT05JVE9SX0JTWSk7CisJZWxzZQorCQlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFIHwgTVJfRE1BX01PREUpOworI2VuZGlmCQkJCS8qIGRlZiBSRUFMX0RNQSAqLworCisJZHByaW50ayhOREVCVUdfRE1BLCAoInNjc2klZCA6IG1vZGUgcmVnID0gMHglWFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIE5DUjUzODBfcmVhZChNT0RFX1JFRykpKTsKKworCS8qIAorCSAqCU9uIHRoZSBQQVMxNiBhdCBsZWFzdCBJL08gcmVjb3ZlcnkgZGVsYXlzIGFyZSBub3QgbmVlZGVkIGhlcmUuCisJICoJRXZlcnlvbmUgZWxzZSBzZWVtcyB0byB3YW50IHRoZW0uCisJICovCisKKwlpZiAocCAmIFNSX0lPKSB7CisJCWlvX3JlY292ZXJ5X2RlbGF5KDEpOworCQlOQ1I1MzgwX3dyaXRlKFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcsIDApOworCX0gZWxzZSB7CisJCWlvX3JlY292ZXJ5X2RlbGF5KDEpOworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEpOworCQlpb19yZWNvdmVyeV9kZWxheSgxKTsKKwkJTkNSNTM4MF93cml0ZShTVEFSVF9ETUFfU0VORF9SRUcsIDApOworCQlpb19yZWNvdmVyeV9kZWxheSgxKTsKKwl9CisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpCisJZG8geworCQl0bXAgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKTsKKwl9IHdoaWxlICgodG1wICYgQkFTUl9QSEFTRV9NQVRDSCkgJiYgISh0bXAgJiAoQkFTUl9CVVNZX0VSUk9SIHwgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSkpOworCisvKgorICAgQXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlJ3ZlIGNvbXBsZXRlZCBETUEsIG9yIHdlIGhhdmUgYSBwaGFzZSBtaXNtYXRjaCwKKyAgIG9yIHdlJ3ZlIHVuZXhwZWN0ZWRseSBsb3N0IEJVU1kgKHdoaWNoIGlzIGEgcmVhbCBlcnJvcikuCisKKyAgIEZvciB3cml0ZSBETUFzLCB3ZSB3YW50IHRvIHdhaXQgdW50aWwgdGhlIGxhc3QgYnl0ZSBoYXMgYmVlbgorICAgdHJhbnNmZXJyZWQgb3V0IG92ZXIgdGhlIGJ1cyBiZWZvcmUgd2UgdHVybiBvZmYgRE1BIG1vZGUuICBBbGFzLCB0aGVyZQorICAgc2VlbXMgdG8gYmUgbm8gdGVycmlibHkgZ29vZCB3YXkgb2YgZG9pbmcgdGhpcyBvbiBhIDUzODAgdW5kZXIgYWxsCisgICBjb25kaXRpb25zLiAgRm9yIG5vbi1zY2F0dGVyLWdhdGhlciBvcGVyYXRpb25zLCB3ZSBjYW4gd2FpdCB1bnRpbCBSRVEKKyAgIGFuZCBBQ0sgYm90aCBnbyBmYWxzZSwgb3IgdW50aWwgYSBwaGFzZSBtaXNtYXRjaCBvY2N1cnMuICBHYXRoZXItd3JpdGVzCisgICBhcmUgbmFzdGllciwgc2luY2UgdGhlIGRldmljZSB3aWxsIGJlIGV4cGVjdGluZyBtb3JlIGRhdGEgdGhhbiB3ZQorICAgYXJlIHByZXBhcmVkIHRvIHNlbmQgaXQsIGFuZCBSRVEgd2lsbCByZW1haW4gYXNzZXJ0ZWQuICBPbiBhIDUzQzhbMDFdIHdlCisgICBjb3VsZCB0ZXN0IExBU1QgQklUIFNFTlQgdG8gYXNzdXJlIHRyYW5zZmVyIChJIGltYWdpbmUgdGhpcyBpcyBwcmVjaXNlbHkKKyAgIHdoeSB0aGlzIHNpZ25hbCB3YXMgYWRkZWQgdG8gdGhlIG5ld2VyIGNoaXBzKSBidXQgb24gdGhlIG9sZGVyIDUzOFswMV0KKyAgIHRoaXMgc2lnbmFsIGRvZXMgbm90IGV4aXN0LiAgVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgbGFjayBpcyBhIHdhdGNoZG9nOworICAgd2UgYmFpbCBvdXQgb2YgdGhlIHdhaXQtbG9vcCBhZnRlciBhIG1vZGVzdCBhbW91bnQgb2Ygd2FpdC10aW1lIGlmCisgICB0aGUgdXN1YWwgZXhpdCBjb25kaXRpb25zIGFyZSBub3QgbWV0LiAgTm90IGEgdGVycmlibHkgY2xlYW4gb3IKKyAgIGNvcnJlY3Qgc29sdXRpb24gOi0lCisKKyAgIFJlYWRzIGFyZSBlcXVhbGx5IHRyaWNreSBkdWUgdG8gYSBuYXN0eSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgTkNSNTM4MC4KKyAgIElmIHRoZSBjaGlwIGlzIGluIERNQSBtb2RlIGZvciBhbiBSRUFELCBpdCB3aWxsIHJlc3BvbmQgdG8gYSB0YXJnZXQncworICAgUkVRIGJ5IGxhdGNoaW5nIHRoZSBTQ1NJIGRhdGEgaW50byB0aGUgSU5QVVQgREFUQSByZWdpc3RlciBhbmQgYXNzZXJ0aW5nCisgICBBQ0ssIGV2ZW4gaWYgaXQgaGFzIF9hbHJlYWR5XyBiZWVuIG5vdGlmaWVkIGJ5IHRoZSBETUEgY29udHJvbGxlciB0aGF0CisgICB0aGUgY3VycmVudCBETUEgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCEgIElmIHRoZSBOQ1I1MzgwIGlzIHRoZW4gdGFrZW4KKyAgIG91dCBvZiBETUEgbW9kZSwgdGhpcyBhbHJlYWR5LWFja25vd2xlZGdlZCBieXRlIGlzIGxvc3QuCisKKyAgIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgIm9uZSBETUEgdHJhbnNmZXIgcGVyIGNvbW1hbmQiIHJlYWRzLCBiZWNhdXNlCisgICB0aGUgc2l0dWF0aW9uIHdpbGwgbmV2ZXIgYXJpc2UuLi4gZWl0aGVyIGFsbCBvZiB0aGUgZGF0YSBpcyBETUEnZWQKKyAgIHByb3Blcmx5LCBvciB0aGUgdGFyZ2V0IHN3aXRjaGVzIHRvIE1FU1NBR0UgSU4gcGhhc2UgdG8gc2lnbmFsIGEKKyAgIGRpc2Nvbm5lY3Rpb24gKGVpdGhlciBvcGVyYXRpb24gYnJpbmdpbmcgdGhlIERNQSB0byBhIGNsZWFuIGhhbHQpLgorICAgSG93ZXZlciwgaW4gb3JkZXIgdG8gaGFuZGxlIHNjYXR0ZXItcmVhZHMsIHdlIG11c3Qgd29yayBhcm91bmQgdGhlCisgICBwcm9ibGVtLiAgVGhlIGNob3NlbiBmaXggaXMgdG8gRE1BIE4tMiBieXRlcywgdGhlbiBjaGVjayBmb3IgdGhlCisgICBjb25kaXRpb24gYmVmb3JlIHRha2luZyB0aGUgTkNSNTM4MCBvdXQgb2YgRE1BIG1vZGUuICBPbmUgb3IgdHdvIGV4dHJhCisgICBieXRlcyBhcmUgdHJhbnNmZXJyZWQgdmlhIFBJTyBhcyBuZWNlc3NhcnkgdG8gZmlsbCBvdXQgdGhlIG9yaWdpbmFsCisgICByZXF1ZXN0LgorICovCisKKwlpZiAocCAmIFNSX0lPKSB7CisjaWZkZWYgUkVBRF9PVkVSUlVOUworCQl1ZGVsYXkoMTApOworCQlpZiAoKChOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIChCQVNSX1BIQVNFX01BVENIIHwgQkFTUl9BQ0spKSA9PSAoQkFTUl9QSEFTRV9NQVRDSCB8IEJBU1JfQUNLKSkpIHsKKwkJCXNhdmVkX2RhdGEgPSBOQ1I1MzgwX3JlYWQoSU5QVVRfREFUQV9SRUdJU1RFUik7CisJCQlvdmVycnVuID0gMTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJaW50IGxpbWl0ID0gMTAwOworCQl3aGlsZSAoKCh0bXAgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSkgJiBCQVNSX0FDSykgfHwgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSkpIHsKKwkJCWlmICghKHRtcCAmIEJBU1JfUEhBU0VfTUFUQ0gpKQorCQkJCWJyZWFrOworCQkJaWYgKC0tbGltaXQgPCAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJZHByaW50ayhOREVCVUdfRE1BLCAoInNjc2klZCA6IHBvbGxlZCBETUEgdHJhbnNmZXIgY29tcGxldGUsIGJhc3IgMHglWCwgc3IgMHglWFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIHRtcCwgTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKSk7CisKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJcmVzaWR1ZSA9IE5DUjUzODBfZG1hX3Jlc2lkdWFsKGluc3RhbmNlKTsKKwljIC09IHJlc2lkdWU7CisJKmNvdW50IC09IGM7CisJKmRhdGEgKz0gYzsKKwkqcGhhc2UgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBQSEFTRV9NQVNLOworCisjaWZkZWYgUkVBRF9PVkVSUlVOUworCWlmICgqcGhhc2UgPT0gcCAmJiAocCAmIFNSX0lPKSAmJiByZXNpZHVlID09IDApIHsKKwkJaWYgKG92ZXJydW4pIHsKKwkJCWRwcmludGsoTkRFQlVHX0RNQSwgKCJHb3QgYW4gaW5wdXQgb3ZlcnJ1biwgdXNpbmcgc2F2ZWQgYnl0ZVxuIikpOworCQkJKipkYXRhID0gc2F2ZWRfZGF0YTsKKwkJCSpkYXRhICs9IDE7CisJCQkqY291bnQgLT0gMTsKKwkJCWNudCA9IHRvUElPID0gMTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiTm8gb3ZlcnJ1bj8/XG4iKTsKKwkJCWNudCA9IHRvUElPID0gMjsKKwkJfQorCQlkcHJpbnRrKE5ERUJVR19ETUEsICgiRG9pbmcgJWQtYnl0ZSBQSU8gdG8gMHglWFxuIiwgY250LCAqZGF0YSkpOworCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgcGhhc2UsICZjbnQsIGRhdGEpOworCQkqY291bnQgLT0gdG9QSU8gLSBjbnQ7CisJfQorI2VuZGlmCisKKwlkcHJpbnRrKE5ERUJVR19ETUEsICgiUmV0dXJuIHdpdGggZGF0YSBwdHIgPSAweCVYLCBjb3VudCAlZCwgbGFzdCAweCVYLCBuZXh0IDB4JVhcbiIsICpkYXRhLCAqY291bnQsICooKmRhdGEgKyAqY291bnQgLSAxKSwgKigqZGF0YSArICpjb3VudCkpKTsKKwlyZXR1cm4gMDsKKworI2VsaWYgZGVmaW5lZChSRUFMX0RNQSkKKwlyZXR1cm4gMDsKKyNlbHNlCQkJCS8qIGRlZmluZWQoUkVBTF9ETUFfUE9MTCkgKi8KKwlpZiAocCAmIFNSX0lPKSB7CisjaWZkZWYgRE1BX1dPUktTX1JJR0hUCisJCWZvbyA9IE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGQsIGMpOworI2Vsc2UKKwkJaW50IGRpZmYgPSAxOworCQlpZiAoaG9zdGRhdGEtPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApIHsKKwkJCWRpZmYgPSAwOworCQl9CisJCWlmICghKGZvbyA9IE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGQsIGMgLSBkaWZmKSkpIHsKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBkaXNhYmxlIERNQSBtb2RlIGFmdGVyIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJpbmcgCisJCQkgKiB3aGF0IHdlIHBsYW4gdG8gYmUgdGhlIGxhc3QgYnl0ZSwgc2luY2UgdGhhdCB3b3VsZCBvcGVuIHVwCisJCQkgKiBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGlmIHRoZSB0YXJnZXQgYXNzZXJ0ZWQgUkVRIGJlZm9yZSAKKwkJCSAqIHdlIGdvdCB0aGUgRE1BIG1vZGUgcmVzZXQsIHRoZSBOQ1I1MzgwIHdvdWxkIGhhdmUgbGF0Y2hlZAorCQkJICogYW4gYWRkaXRpb25hbCBieXRlIGludG8gdGhlIElOUFVUIERBVEEgcmVnaXN0ZXIgYW5kIHdlJ2QKKwkJCSAqIGhhdmUgZHJvcHBlZCBpdC4KKwkJCSAqIAorCQkJICogVGhlIHdvcmthcm91bmQgd2FzIHRvIHRyYW5zZmVyIG9uZSBmZXdlciBieXRlcyB0aGFuIHdlIAorCQkJICogaW50ZW5kZWQgdG8gd2l0aCB0aGUgcHNldWRvLURNQSByZWFkIGZ1bmN0aW9uLCB3YWl0IGZvciAKKwkJCSAqIHRoZSBjaGlwIHRvIGxhdGNoIHRoZSBsYXN0IGJ5dGUsIHJlYWQgaXQsIGFuZCB0aGVuIGRpc2FibGUKKwkJCSAqIHBzZXVkby1ETUEgbW9kZS4KKwkJCSAqIAorCQkJICogQWZ0ZXIgUkVRIGlzIGFzc2VydGVkLCB0aGUgTkNSNTM4MCBhc3NlcnRzIERSUSBhbmQgQUNLLgorCQkJICogUkVRIGlzIGRlYXNzZXJ0ZWQgd2hlbiBBQ0sgaXMgYXNzZXJ0ZWQsIGFuZCBub3QgcmVhc3NlcnRlZAorCQkJICogdW50aWwgQUNLIGdvZXMgZmFsc2UuICBTaW5jZSB0aGUgTkNSNTM4MCB3b24ndCBsb3dlciBBQ0sKKwkJCSAqIHVudGlsIERBQ0sgaXMgYXNzZXJ0ZWQsIHdoaWNoIHdvbid0IGhhcHBlbiB1bmxlc3Mgd2UgdHdpZGRsZQorCQkJICogdGhlIERNQSBwb3J0IG9yIHdlIHRha2UgdGhlIE5DUjUzODAgb3V0IG9mIERNQSBtb2RlLCB3ZSAKKwkJCSAqIGNhbiBndWFyYW50ZWUgdGhhdCB3ZSB3b24ndCBoYW5kc2hha2UgYW5vdGhlciBleHRyYSAKKwkJCSAqIGJ5dGUuCisJCQkgKi8KKworCQkJaWYgKCEoaG9zdGRhdGEtPmZsYWdzICYgRkxBR19OQ1I1M0M0MDApKSB7CisJCQkJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkpOworCQkJCS8qIFdhaXQgZm9yIGNsZWFuIGhhbmRzaGFrZSAqLworCQkJCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCQkJCWRbYyAtIDFdID0gTkNSNTM4MF9yZWFkKElOUFVUX0RBVEFfUkVHKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKyNpZmRlZiBETUFfV09SS1NfUklHSFQKKwkJZm9vID0gTkNSNTM4MF9wd3JpdGUoaW5zdGFuY2UsIGQsIGMpOworI2Vsc2UKKwkJaW50IHRpbWVvdXQ7CisJCWRwcmludGsoTkRFQlVHX0M0MDBfUFdSSVRFLCAoIkFib3V0IHRvIHB3cml0ZSAlZCBieXRlc1xuIiwgYykpOworCQlpZiAoIShmb28gPSBOQ1I1MzgwX3B3cml0ZShpbnN0YW5jZSwgZCwgYykpKSB7CisJCQkvKgorCQkJICogV2FpdCBmb3IgdGhlIGxhc3QgYnl0ZSB0byBiZSBzZW50LiAgSWYgUkVRIGlzIGJlaW5nIGFzc2VydGVkIGZvciAKKwkJCSAqIHRoZSBieXRlIHdlJ3JlIGludGVyZXN0ZWQsIHdlJ2xsIEFDSyBpdCBhbmQgaXQgd2lsbCBnbyBmYWxzZS4gIAorCQkJICovCisJCQlpZiAoIShob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX0hBU19MQVNUX0JZVEVfU0VOVCkpIHsKKwkJCQl0aW1lb3V0ID0gMjAwMDA7CisJCQkJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkgJiYgKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9QSEFTRV9NQVRDSCkpOworCisJCQkJaWYgKCF0aW1lb3V0KQorCQkJCQlkcHJpbnRrKE5ERUJVR19MQVNUX0JZVEVfU0VOVCwgKCJzY3NpJWQgOiB0aW1lZCBvdXQgb24gbGFzdCBieXRlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJCQkJaWYgKGhvc3RkYXRhLT5mbGFncyAmIEZMQUdfQ0hFQ0tfTEFTVF9CWVRFX1NFTlQpIHsKKwkJCQkJaG9zdGRhdGEtPmZsYWdzICY9IH5GTEFHX0NIRUNLX0xBU1RfQllURV9TRU5UOworCQkJCQlpZiAoTkNSNTM4MF9yZWFkKFRBUkdFVF9DT01NQU5EX1JFRykgJiBUQ1JfTEFTVF9CWVRFX1NFTlQpIHsKKwkJCQkJCWhvc3RkYXRhLT5mbGFncyB8PSBGTEFHX0hBU19MQVNUX0JZVEVfU0VOVDsKKwkJCQkJCWRwcmludGsoTkRFQlVHX0xBU1RfV1JJVEVfU0VOVCwgKCJzY3NpJWQgOiBsYXN0IGJpdCBzZW50IHdvcmtzXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrKE5ERUJVR19DNDAwX1BXUklURSwgKCJXYWl0aW5nIGZvciBMQVNUQllURVxuIikpOworCQkJCXdoaWxlICghKE5DUjUzODBfcmVhZChUQVJHRVRfQ09NTUFORF9SRUcpICYgVENSX0xBU1RfQllURV9TRU5UKSk7CisJCQkJZHByaW50ayhOREVCVUdfQzQwMF9QV1JJVEUsICgiR290IExBU1RCWVRFXG4iKSk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJaWYgKCghKHAgJiBTUl9JTykpICYmIChob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX05DUjUzQzQwMCkpIHsKKwkJZHByaW50ayhOREVCVUdfQzQwMF9QV1JJVEUsICgiNTNDNDAwdzogQ2hlY2tpbmcgZm9yIElSUVxuIikpOworCQlpZiAoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0lSUSkgeworCQkJZHByaW50ayhOREVCVUdfQzQwMF9QV1JJVEUsICgiNTNDNDAwdzogICAgZ290IGl0LCByZWFkaW5nIHJlc2V0IGludGVycnVwdCByZWdcbiIpKTsKKwkJCU5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIjUzQzQwMHc6ICAgIElSUSBOT1QgVEhFUkUhXG4iKTsKKwkJfQorCX0KKwkqZGF0YSA9IGQgKyBjOworCSpjb3VudCA9IDA7CisJKnBoYXNlID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSzsKKyNpZiBkZWZpbmVkKFBTRVVET19ETUEpICYmIGRlZmluZWQoVU5TQUZFKQorCXNwaW5fbG9ja19pcnEoaW5zdGFuY2UtPmhvc3RfbG9jayk7CisjZW5kaWYJCQkJLyogZGVmaW5lZChSRUFMX0RNQV9QT0xMKSAqLworCXJldHVybiBmb287CisjZW5kaWYJCQkJLyogZGVmIFJFQUxfRE1BICovCit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChSRUFMX0RNQSkgfCBkZWZpbmVkKFBTRVVET19ETUEpICovCisKKy8qCisgKiBGdW5jdGlvbiA6IE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBydW4gdGhyb3VnaCB0aGUgdmFyaW91cyBTQ1NJIHBoYXNlcyBhbmQgZG8gYXMgdGhlIHRhcmdldCAKKyAqICAgICAgZGlyZWN0cyB1cyB0by4gIE9wZXJhdGVzIG9uIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQsIAorICogICAgICBpbnN0YW5jZS0+Y29ubmVjdGVkLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBpbnN0YW5jZSBmb3Igd2hpY2ggd2UgYXJlIGRvaW5nIGNvbW1hbmRzCisgKgorICogU2lkZSBlZmZlY3RzIDogU0NTSSB0aGluZ3MgaGFwcGVuLCB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlIHdpbGwgYmUgCisgKiAgICAgIG1vZGlmaWVkIGlmIGEgY29tbWFuZCBkaXNjb25uZWN0cywgKmluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbAorICogICAgICBjaGFuZ2UuCisgKgorICogWFhYIE5vdGUgOiB3ZSBuZWVkIHRvIHdhdGNoIGZvciBidXMgZnJlZSBvciBhIHJlc2V0IGNvbmRpdGlvbiBoZXJlIAorICogICAgICB0byByZWNvdmVyIGZyb20gYW4gdW5leHBlY3RlZCBidXMgZnJlZSBjb25kaXRpb24uCisgKgorICogTG9ja3M6IGlvX3JlcXVlc3RfbG9jayBoZWxkIGJ5IGNhbGxlciBpbiBJUlEgbW9kZQorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciBtc2dvdXQgPSBOT1A7CisJaW50IHNpbmsgPSAwOworCWludCBsZW47CisjaWYgZGVmaW5lZChQU0VVRE9fRE1BKSB8fCBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpCisJaW50IHRyYW5zZmVyc2l6ZTsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgY2hhciBwaGFzZSwgdG1wLCBleHRlbmRlZF9tc2dbMTBdLCBvbGRfcGhhc2UgPSAweGZmOworCVNjc2lfQ21uZCAqY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkOworCS8qIFJ2Qzogd2UgbmVlZCB0byBzZXQgdGhlIGVuZCBvZiB0aGUgcG9sbGluZyB0aW1lICovCisJdW5zaWduZWQgbG9uZyBwb2xsX3RpbWUgPSBqaWZmaWVzICsgVVNMRUVQX1BPTEw7CisKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCXdoaWxlICgxKSB7CisJCXRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKwkJLyogV2Ugb25seSBoYXZlIGEgdmFsaWQgU0NTSSBwaGFzZSB3aGVuIFJFUSBpcyBhc3NlcnRlZCAqLworCQlpZiAodG1wICYgU1JfUkVRKSB7CisJCQlwaGFzZSA9ICh0bXAgJiBQSEFTRV9NQVNLKTsKKwkJCWlmIChwaGFzZSAhPSBvbGRfcGhhc2UpIHsKKwkJCQlvbGRfcGhhc2UgPSBwaGFzZTsKKwkJCQlOQ1I1MzgwX2RwcmludF9waGFzZShOREVCVUdfSU5GT1JNQVRJT04sIGluc3RhbmNlKTsKKwkJCX0KKwkJCWlmIChzaW5rICYmIChwaGFzZSAhPSBQSEFTRV9NU0dPVVQpKSB7CisJCQkJTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUih0bXApKTsKKworCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9BQ0spOworCQkJCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKwkJCQlzaW5rID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXN3aXRjaCAocGhhc2UpIHsKKwkJCWNhc2UgUEhBU0VfREFUQUlOOgorCQkJY2FzZSBQSEFTRV9EQVRBT1VUOgorI2lmIChOREVCVUcgJiBOREVCVUdfTk9fREFUQU9VVCkKKwkJCQlwcmludGsoInNjc2klZCA6IE5ERUJVR19OT19EQVRBT1VUIHNldCwgYXR0ZW1wdGVkIERBVEFPVVQgYWJvcnRlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJCXNpbmsgPSAxOworCQkJCWRvX2Fib3J0KGluc3RhbmNlKTsKKwkJCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCQljbWQtPmRvbmUoY21kKTsKKwkJCQlyZXR1cm47CisjZW5kaWYKKwkJCQkvKiAKKwkJCQkgKiBJZiB0aGVyZSBpcyBubyByb29tIGxlZnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZQorCQkJCSAqIHNjYXR0ZXItZ2F0aGVyIGxpc3QsIG1vdmUgb250byB0aGUgbmV4dCBvbmUuCisJCQkJICovCisKKwkJCQlpZiAoIWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkJCQkrK2NtZC0+U0NwLmJ1ZmZlcjsKKwkJCQkJLS1jbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCQkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQkJCWNtZC0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpKworCQkJCQkJICAgICAgIGNtZC0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCQkJCQlkcHJpbnRrKE5ERUJVR19JTkZPUk1BVElPTiwgKCJzY3NpJWQgOiAlZCBieXRlcyBhbmQgJWQgYnVmZmVycyBsZWZ0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5TQ3AudGhpc19yZXNpZHVhbCwgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIFRoZSBwcmVmZXJyZWQgdHJhbnNmZXIgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIAorCQkJCSAqIFBTRVVETy1ETUEgZm9yIHN5c3RlbXMgdGhhdCBhcmUgc3RyaWN0bHkgUElPLAorCQkJCSAqIHNpbmNlIHdlIGNhbiBsZXQgdGhlIGhhcmR3YXJlIGRvIHRoZSBoYW5kc2hha2luZy4KKwkJCQkgKgorCQkJCSAqIEZvciB0aGlzIHRvIHdvcmssIHdlIG5lZWQgdG8ga25vdyB0aGUgdHJhbnNmZXJzaXplCisJCQkJICogYWhlYWQgb2YgdGltZSwgc2luY2UgdGhlIHBzZXVkby1ETUEgY29kZSB3aWxsIHNpdAorCQkJCSAqIGluIGFuIHVuY29uZGl0aW9uYWwgbG9vcC4KKwkJCQkgKi8KKworI2lmIGRlZmluZWQoUFNFVURPX0RNQSkgfHwgZGVmaW5lZChSRUFMX0RNQV9QT0xMKQorCQkJCS8qIEtMTAorCQkJCSAqIFBTRVVET19ETUEgaXMgZGVmaW5lZCBoZXJlLiBJZiB0aGlzIGlzIHRoZSBnX05DUjUzODAKKwkJCQkgKiBkcml2ZXIgdGhlbiBpdCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLCBzbyB0aGUKKwkJCQkgKiBGTEFHX05PX1BTRVVET19ETUEgaXMgdXNlZCB0byBpbmhpYml0IFBETUEgaW4gdGhlIGJhc2UKKwkJCQkgKiBOQ1I1MzgwIGNhc2UuICBJIHRoaW5rIHRoaXMgaXMgYSBmYWlybHkgY2xlYW4gc29sdXRpb24uCisJCQkJICogV2Ugc3VwcGxlbWVudCB0aGVzZSAyIGlmJ3Mgd2l0aCB0aGUgZmxhZy4KKwkJCQkgKi8KKyNpZmRlZiBOQ1I1MzgwX2RtYV94ZmVyX2xlbgorCQkJCWlmICghY21kLT5kZXZpY2UtPmJvcmtlbiAmJiAhKGhvc3RkYXRhLT5mbGFncyAmIEZMQUdfTk9fUFNFVURPX0RNQSkgJiYgKHRyYW5zZmVyc2l6ZSA9IE5DUjUzODBfZG1hX3hmZXJfbGVuKGluc3RhbmNlLCBjbWQpKSAhPSAwKSB7CisjZWxzZQorCQkJCXRyYW5zZmVyc2l6ZSA9IGNtZC0+dHJhbnNmZXJzaXplOworCisjaWZkZWYgTElNSVRfVFJBTlNGRVJTSVpFCS8qIElmIHdlIGhhdmUgcHJvYmxlbXMgd2l0aCBpbnRlcnJ1cHQgc2VydmljZSAqLworCQkJCWlmICh0cmFuc2ZlcnNpemUgPiA1MTIpCisJCQkJCXRyYW5zZmVyc2l6ZSA9IDUxMjsKKyNlbmRpZgkJCQkvKiBMSU1JVF9UUkFOU0ZFUlNJWkUgKi8KKworCQkJCWlmICghY21kLT5kZXZpY2UtPmJvcmtlbiAmJiB0cmFuc2ZlcnNpemUgJiYgIShob3N0ZGF0YS0+ZmxhZ3MgJiBGTEFHX05PX1BTRVVET19ETUEpICYmIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgIShjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICUgdHJhbnNmZXJzaXplKSkgeworCQkJCQkvKiBMaW1pdCB0cmFuc2ZlcnMgdG8gMzJLLCBmb3IgeHg0MDAgJiB4eDQwNgorCQkJCQkgKiBwc2V1ZG9ETUEgdGhhdCB0cmFuc2ZlcnMgaW4gMTI4IGJ5dGVzIGJsb2Nrcy4gKi8KKwkJCQkJaWYgKHRyYW5zZmVyc2l6ZSA+IDMyICogMTAyNCkKKwkJCQkJCXRyYW5zZmVyc2l6ZSA9IDMyICogMTAyNDsKKyNlbmRpZgorCQkJCQlsZW4gPSB0cmFuc2ZlcnNpemU7CisJCQkJCWlmIChOQ1I1MzgwX3RyYW5zZmVyX2RtYShpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAodW5zaWduZWQgY2hhciAqKikgJmNtZC0+U0NwLnB0cikpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBJZiB0aGUgd2F0Y2hkb2cgdGltZXIgZmlyZXMsIGFsbCBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcworCQkJCQkJICogZGV2aWNlIHdpbGwgdXNlIHRoZSBwb2xsZWQtSU8uCisJCQkJCQkgKi8KKwkJCQkJCXByaW50aygic2NzaSVkIDogc3dpdGNoaW5nIHRhcmdldCAlZCBsdW4gJWQgdG8gc2xvdyBoYW5kc2hha2VcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQkJY21kLT5kZXZpY2UtPmJvcmtlbiA9IDE7CisJCQkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisJCQkJCQlzaW5rID0gMTsKKwkJCQkJCWRvX2Fib3J0KGluc3RhbmNlKTsKKwkJCQkJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCQkJY21kLT5kb25lKGNtZCk7CisJCQkJCQkvKiBYWFggLSBuZWVkIHRvIHNvdXJjZSBvciBzaW5rIGRhdGEgaGVyZSwgYXMgYXBwcm9wcmlhdGUgKi8KKwkJCQkJfSBlbHNlCisJCQkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IHRyYW5zZmVyc2l6ZSAtIGxlbjsKKwkJCQl9IGVsc2UKKyNlbmRpZgkJCQkvKiBkZWZpbmVkKFBTRVVET19ETUEpIHx8IGRlZmluZWQoUkVBTF9ETUFfUE9MTCkgKi8KKwkJCQkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgKGludCAqKSAmY21kLT5TQ3AudGhpc19yZXNpZHVhbCwgKHVuc2lnbmVkIGNoYXIgKiopCisJCQkJCQkJICAgICAmY21kLT5TQ3AucHRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhBU0VfTVNHSU46CisJCQkJbGVuID0gMTsKKwkJCQlkYXRhID0gJnRtcDsKKwkJCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCQkJY21kLT5TQ3AuTWVzc2FnZSA9IHRtcDsKKworCQkJCXN3aXRjaCAodG1wKSB7CisJCQkJCS8qCisJCQkJCSAqIExpbmtpbmcgbGV0cyB1cyByZWR1Y2UgdGhlIHRpbWUgcmVxdWlyZWQgdG8gZ2V0IHRoZSAKKwkJCQkJICogbmV4dCBjb21tYW5kIG91dCB0byB0aGUgZGV2aWNlLCBob3BlZnVsbHkgdGhpcyB3aWxsCisJCQkJCSAqIG1lYW4gd2UgZG9uJ3Qgd2FzdGUgYW5vdGhlciByZXZvbHV0aW9uIGR1ZSB0byB0aGUgZGVsYXlzCisJCQkJCSAqIHJlcXVpcmVkIGJ5IEFSQklUUkFUSU9OIGFuZCBhbm90aGVyIFNFTEVDVElPTi4KKwkJCQkJICoKKwkJCQkJICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcHJvcG9zYWwsIGxvdyBsZXZlbCBkcml2ZXJzCisJCQkJCSAqIG1lcmVseSBoYXZlIHRvIHN0YXJ0IHRoZSBuZXh0IGNvbW1hbmQsIHBvaW50ZWQgdG8gYnkgCisJCQkJCSAqIG5leHRfbGluaywgZG9uZSgpIGlzIGNhbGxlZCBhcyB3aXRoIHVubGlua2VkIGNvbW1hbmRzLgorCQkJCQkgKi8KKyNpZmRlZiBMSU5LRUQKKwkJCQljYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisJCQkJY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKwkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCWRwcmludGsoTkRFQlVHX0xJTktFRCwgKCJzY3NpJWQgOiB0YXJnZXQgJWQgbHVuICVkIGxpbmtlZCBjb21tYW5kIGNvbXBsZXRlLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bikpOworCQkJCQkvKiAKKwkJCQkJICogU2FuaXR5IGNoZWNrIDogQSBsaW5rZWQgY29tbWFuZCBzaG91bGQgb25seSB0ZXJtaW5hdGUgd2l0aAorCQkJCQkgKiBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIG1vcmUgbGlua2VkIGNvbW1hbmRzCisJCQkJCSAqIGF2YWlsYWJsZS4KKwkJCQkJICovCisJCQkJCWlmICghY21kLT5uZXh0X2xpbmspIHsKKwkJCQkJCXByaW50aygic2NzaSVkIDogdGFyZ2V0ICVkIGx1biAlZCBsaW5rZWQgY29tbWFuZCBjb21wbGV0ZSwgbm8gbmV4dF9saW5rXG4iIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQkJc2luayA9IDE7CisJCQkJCQlkb19hYm9ydChpbnN0YW5jZSk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJaW5pdGlhbGl6ZV9TQ3AoY21kLT5uZXh0X2xpbmspOworCQkJCQkvKiBUaGUgbmV4dCBjb21tYW5kIGlzIHN0aWxsIHBhcnQgb2YgdGhpcyBwcm9jZXNzICovCisJCQkJCWNtZC0+bmV4dF9saW5rLT50YWcgPSBjbWQtPnRhZzsKKwkJCQkJY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJCQkJZHByaW50ayhOREVCVUdfTElOS0VELCAoInNjc2klZCA6IHRhcmdldCAlZCBsdW4gJWQgbGlua2VkIHJlcXVlc3QgZG9uZSwgY2FsbGluZyBzY3NpX2RvbmUoKS5cbiIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pKTsKKwkJCQkJY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKwkJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCQkJY21kID0gaG9zdGRhdGEtPmNvbm5lY3RlZDsKKwkJCQkJYnJlYWs7CisjZW5kaWYJCQkJLyogZGVmIExJTktFRCAqLworCQkJCWNhc2UgQUJPUlQ6CisJCQkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCQkJCQkvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJCQkJc2luayA9IDE7CisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJCQlkcHJpbnRrKE5ERUJVR19RVUVVRVMsICgic2NzaSVkIDogY29tbWFuZCBmb3IgdGFyZ2V0ICVkLCBsdW4gJWQgY29tcGxldGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKSk7CisJCQkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCisJCQkJCS8qIAorCQkJCQkgKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdCB0aGluZyB0byBkbyBoZXJlIGlzIDogCisJCQkJCSAqIAorCQkJCQkgKiBJZiB0aGUgY29tbWFuZCB0aGF0IGp1c3QgZXhlY3V0ZWQgaXMgTk9UIGEgcmVxdWVzdCAKKwkJCQkJICogc2Vuc2UsIHRoZSBvYnZpb3VzIHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgcmVzdWx0CisJCQkJCSAqIGNvZGUgdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3RvcmVkIHBhcmFtZXRlcnMuCisJCQkJCSAqIAorCQkJCQkgKiBJZiBpdCB3YXMgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQsIHdlIG5lZWQgc29tZSB3YXkgCisJCQkJCSAqIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgZmFpbHVyZSBjb2RlIG9mIHRoZSBvcmlnaW5hbAorCQkJCQkgKiBhbmQgdGhlIGZhaWx1cmUgY29kZSBvZiB0aGUgUkVRVUVTVCBzZW5zZSAtIHRoZSBvYnZpb3VzCisJCQkJCSAqIGNhc2UgaXMgc3VjY2Vzcywgd2hlcmUgd2UgZmFsbCB0aHJvdWdoIGFuZCBsZWF2ZSB0aGUgcmVzdWx0CisJCQkJCSAqIGNvZGUgdW5jaGFuZ2VkLgorCQkJCQkgKiAKKwkJCQkJICogVGhlIG5vbi1vYnZpb3VzIHBsYWNlIGlzIHdoZXJlIHRoZSBSRVFVRVNUIFNFTlNFIGZhaWxlZCAKKwkJCQkJICovCisKKwkJCQkJaWYgKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKQorCQkJCQkJY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJCQkJZWxzZSBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSAhPSBHT09EKQorCQkJCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKworI2lmZGVmIEFVVE9TRU5TRQorCQkJCQlpZiAoKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKSAmJiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBDSEVDS19DT05ESVRJT04pKSB7CisJCQkJCQlkcHJpbnRrKE5ERUJVR19BVVRPU0VOU0UsICgic2NzaSVkIDogcGVyZm9ybWluZyByZXF1ZXN0IHNlbnNlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQkJCQkJY21kLT5jbW5kWzBdID0gUkVRVUVTVF9TRU5TRTsKKwkJCQkJCWNtZC0+Y21uZFsxXSAmPSAweGUwOworCQkJCQkJY21kLT5jbW5kWzJdID0gMDsKKwkJCQkJCWNtZC0+Y21uZFszXSA9IDA7CisJCQkJCQljbWQtPmNtbmRbNF0gPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCQkJCQkJY21kLT5jbW5kWzVdID0gMDsKKworCQkJCQkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwkJCQkJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQkJCQkJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5zZW5zZV9idWZmZXI7CisJCQkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKTsKKworCQkJCQkJTElTVChjbWQsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQkJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKQorCQkJCQkJICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkJCQkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IChTY3NpX0NtbmQgKikgY21kOworCQkJCQkJZHByaW50ayhOREVCVUdfUVVFVUVTLCAoInNjc2klZCA6IFJFUVVFU1QgU0VOU0UgYWRkZWQgdG8gaGVhZCBvZiBpc3N1ZSBxdWV1ZVxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJCQkJfSBlbHNlCisjZW5kaWYJCQkJLyogZGVmIEFVVE9TRU5TRSAqLworCQkJCQl7CisJCQkJCQljb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworCQkJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCQkJfQorCisJCQkJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJCQkJLyogCisJCQkJCSAqIFJlc3RvcmUgcGhhc2UgYml0cyB0byAwIHNvIGFuIGludGVycnVwdGVkIHNlbGVjdGlvbiwgCisJCQkJCSAqIGFyYml0cmF0aW9uIGNhbiByZXN1bWUuCisJCQkJCSAqLworCQkJCQlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisKKwkJCQkJd2hpbGUgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJCQkJYmFycmllcigpOworCQkJCQlyZXR1cm47CisJCQkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCXN3aXRjaCAoaG9zdGRhdGEtPmxhc3RfbWVzc2FnZSkgeworCQkJCQljYXNlIEhFQURfT0ZfUVVFVUVfVEFHOgorCQkJCQljYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCQkJCQljYXNlIFNJTVBMRV9RVUVVRV9UQUc6CisJCQkJCQljbWQtPmRldmljZS0+c2ltcGxlX3RhZ3MgPSAwOworCQkJCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQljYXNlIERJU0NPTk5FQ1Q6eworCQkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkJCQkJY21kLT5kZXZpY2UtPmRpc2Nvbm5lY3QgPSAxOworCQkJCQkJTElTVChjbWQsIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpOworCQkJCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJCSAgICBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworCQkJCQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCQkJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gY21kOworCQkJCQkJZHByaW50ayhOREVCVUdfUVVFVUVTLCAoInNjc2klZCA6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCBsdW4gJWQgd2FzIG1vdmVkIGZyb20gY29ubmVjdGVkIHRvIiAiICB0aGUgZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKSk7CisJCQkJCQkvKiAKKwkJCQkJCSAqIFJlc3RvcmUgcGhhc2UgYml0cyB0byAwIHNvIGFuIGludGVycnVwdGVkIHNlbGVjdGlvbiwgCisJCQkJCQkgKiBhcmJpdHJhdGlvbiBjYW4gcmVzdW1lLgorCQkJCQkJICovCisJCQkJCQlOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisKKwkJCQkJCS8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCQkJCQlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCQkJCQkvKiBXYWl0IGZvciBidXMgZnJlZSB0byBhdm9pZCBuYXN0eSB0aW1lb3V0cyAtIEZJWE1FIHRpbWVvdXQgISovCisJCQkJCQkvKiBOQ1I1MzhfcG9sbF9wb2xpdGVseShpbnN0YW5jZSwgU1RBVFVTX1JFRywgU1JfQlNZLCAwLCAzMCAqIEhaKTsgKi8KKwkJCQkJCXdoaWxlICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSAmJiAhaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwkJCQkJCQliYXJyaWVyKCk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJLyogCisJCQkJCSAqIFRoZSBTQ1NJIGRhdGEgcG9pbnRlciBpcyAqSU1QTElDSVRMWSogc2F2ZWQgb24gYSBkaXNjb25uZWN0CisJCQkJCSAqIG9wZXJhdGlvbiwgaW4gdmlvbGF0aW9uIG9mIHRoZSBTQ1NJIHNwZWMgc28gd2UgY2FuIHNhZmVseSAKKwkJCQkJICogaWdub3JlIFNBVkUvUkVTVE9SRSBwb2ludGVycyBjYWxscy4KKwkJCQkJICoKKwkJCQkJICogVW5mb3J0dW5hdGVseSwgc29tZSBkaXNrcyB2aW9sYXRlIHRoZSBTQ1NJIHNwZWMgYW5kIAorCQkJCQkgKiBkb24ndCBpc3N1ZSB0aGUgcmVxdWlyZWQgU0FWRV9QT0lOVEVSUyBtZXNzYWdlIGJlZm9yZQorCQkJCQkgKiBkaXNjb25uZWN0aW5nLCBhbmQgd2UgaGF2ZSB0byBicmVhayBzcGVjIHRvIHJlbWFpbiAKKwkJCQkJICogY29tcGF0aWJsZS4KKwkJCQkJICovCisJCQkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJCQkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCQkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKy8qIAorICogRXh0ZW5kZWQgbWVzc2FnZXMgYXJlIHNlbnQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorICogQnl0ZSAgICAgICAgIAorICogMCAgICAgICAgICAgIEVYVEVOREVEX01FU1NBR0UgPT0gMQorICogMSAgICAgICAgICAgIGxlbmd0aCAoaW5jbHVkZXMgb25lIGJ5dGUgZm9yIGNvZGUsIGRvZXNuJ3QgCisgKiAgICAgICAgICAgICAgaW5jbHVkZSBmaXJzdCB0d28gYnl0ZXMpCisgKiAyICAgICAgICAgICAgY29kZQorICogMy4ubGVuZ3RoKzEgIGFyZ3VtZW50cworICoKKyAqIFN0YXJ0IHRoZSBleHRlbmRlZCBtZXNzYWdlIGJ1ZmZlciB3aXRoIHRoZSBFWFRFTkRFRF9NRVNTQUdFCisgKiBieXRlLCBzaW5jZSBwcmludF9tc2coKSB3YW50cyB0aGUgd2hvbGUgdGhpbmcuICAKKyAqLworCQkJCQlleHRlbmRlZF9tc2dbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCQkJCQkvKiBBY2NlcHQgZmlyc3QgYnl0ZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCQkJZHByaW50ayhOREVCVUdfRVhURU5ERUQsICgic2NzaSVkIDogcmVjZWl2aW5nIGV4dGVuZGVkIG1lc3NhZ2VcbiIsIGluc3RhbmNlLT5ob3N0X25vKSk7CisKKwkJCQkJbGVuID0gMjsKKwkJCQkJZGF0YSA9IGV4dGVuZGVkX21zZyArIDE7CisJCQkJCXBoYXNlID0gUEhBU0VfTVNHSU47CisJCQkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKworCQkJCQlkcHJpbnRrKE5ERUJVR19FWFRFTkRFRCwgKCJzY3NpJWQgOiBsZW5ndGg9JWQsIGNvZGU9MHglMDJ4XG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgKGludCkgZXh0ZW5kZWRfbXNnWzFdLCAoaW50KSBleHRlbmRlZF9tc2dbMl0pKTsKKworCQkJCQlpZiAoIWxlbiAmJiBleHRlbmRlZF9tc2dbMV0gPD0gKHNpemVvZihleHRlbmRlZF9tc2cpIC0gMSkpIHsKKwkJCQkJCS8qIEFjY2VwdCB0aGlyZCBieXRlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCQkJCWxlbiA9IGV4dGVuZGVkX21zZ1sxXSAtIDE7CisJCQkJCQlkYXRhID0gZXh0ZW5kZWRfbXNnICsgMzsKKwkJCQkJCXBoYXNlID0gUEhBU0VfTVNHSU47CisKKwkJCQkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJCQkJCWRwcmludGsoTkRFQlVHX0VYVEVOREVELCAoInNjc2klZCA6IG1lc3NhZ2UgcmVjZWl2ZWQsIHJlc2lkdWFsICVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgbGVuKSk7CisKKwkJCQkJCXN3aXRjaCAoZXh0ZW5kZWRfbXNnWzJdKSB7CisJCQkJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQkJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQkJCQljYXNlIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVI6CisJCQkJCQljYXNlIEVYVEVOREVEX0VYVEVOREVEX0lERU5USUZZOgorCQkJCQkJCXRtcCA9IDA7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAobGVuKSB7CisJCQkJCQlwcmludGsoInNjc2klZDogZXJyb3IgcmVjZWl2aW5nIGV4dGVuZGVkIG1lc3NhZ2VcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJCQkJCXRtcCA9IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoInNjc2klZDogZXh0ZW5kZWQgbWVzc2FnZSBjb2RlICUwMnggbGVuZ3RoICVkIGlzIHRvbyBsb25nXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgZXh0ZW5kZWRfbXNnWzJdLCBleHRlbmRlZF9tc2dbMV0pOworCQkJCQkJdG1wID0gMDsKKwkJCQkJfQorCQkJCQkvKiBGYWxsIHRocm91Z2ggdG8gcmVqZWN0IG1lc3NhZ2UgKi8KKworCQkJCQkvKiAKKwkJCQkJICogSWYgd2UgZ2V0IHNvbWV0aGluZyB3ZWlyZCB0aGF0IHdlIGFyZW4ndCBleHBlY3RpbmcsIAorCQkJCQkgKiByZWplY3QgaXQuCisJCQkJCSAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWlmICghdG1wKSB7CisJCQkJCQlwcmludGsoInNjc2klZDogcmVqZWN0aW5nIG1lc3NhZ2UgIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJCQkJcHJpbnRfbXNnKGV4dGVuZGVkX21zZyk7CisJCQkJCQlwcmludGsoIlxuIik7CisJCQkJCX0gZWxzZSBpZiAodG1wICE9IEVYVEVOREVEX01FU1NBR0UpCisJCQkJCQlwcmludGsoInNjc2klZDogcmVqZWN0aW5nIHVua25vd24gbWVzc2FnZSAlMDJ4IGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCB0bXAsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50aygic2NzaSVkOiByZWplY3RpbmcgdW5rbm93biBleHRlbmRlZCBtZXNzYWdlIGNvZGUgJTAyeCwgbGVuZ3RoICVkIGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBleHRlbmRlZF9tc2dbMV0sIGV4dGVuZGVkX21zZ1swXSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCQkJCQltc2dvdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwkJCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCQkJCQlicmVhazsKKwkJCQl9CS8qIHN3aXRjaCAodG1wKSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBQSEFTRV9NU0dPVVQ6CisJCQkJbGVuID0gMTsKKwkJCQlkYXRhID0gJm1zZ291dDsKKwkJCQlob3N0ZGF0YS0+bGFzdF9tZXNzYWdlID0gbXNnb3V0OworCQkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJCQlpZiAobXNnb3V0ID09IEFCT1JUKSB7CisJCQkJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJCQkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJCWNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisJCQkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQkJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQltc2dvdXQgPSBOT1A7CisJCQkJYnJlYWs7CisJCQljYXNlIFBIQVNFX0NNRE9VVDoKKwkJCQlsZW4gPSBjbWQtPmNtZF9sZW47CisJCQkJZGF0YSA9IGNtZC0+Y21uZDsKKwkJCQkvKiAKKwkJCQkgKiBYWFggZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9uIG1hY2hpbmVzIHdpdGggYSAKKwkJCQkgKiBQU0VVRE8tRE1BIGFyY2hpdGVjdHVyZSB3ZSBzaG91bGQgcHJvYmFibHkgCisJCQkJICogdXNlIHRoZSBkbWEgdHJhbnNmZXIgZnVuY3Rpb24uICAKKwkJCQkgKi8KKwkJCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCQkJaWYgKCFjbWQtPmRldmljZS0+ZGlzY29ubmVjdCAmJiBzaG91bGRfZGlzY29ubmVjdChjbWQtPmNtbmRbMF0pKSB7CisJCQkJCU5DUjUzODBfc2V0X3RpbWVyKGhvc3RkYXRhLCBVU0xFRVBfU0xFRVApOworCQkJCQlkcHJpbnRrKE5ERUJVR19VU0xFRVAsICgic2NzaSVkIDogaXNzdWVkIGNvbW1hbmQsIHNsZWVwaW5nIHVudGlsICV1bFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGhvc3RkYXRhLT50aW1lX2V4cGlyZXMpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUEhBU0VfU1RBVElOOgorCQkJCWxlbiA9IDE7CisJCQkJZGF0YSA9ICZ0bXA7CisJCQkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQkJCWNtZC0+U0NwLlN0YXR1cyA9IHRtcDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCJzY3NpJWQgOiB1bmtub3duIHBoYXNlXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQkJTkNSNTM4MF9kcHJpbnQoTkRFQlVHX0FMTCwgaW5zdGFuY2UpOworCQkJfQkvKiBzd2l0Y2gocGhhc2UpICovCisJCX0JCS8qIGlmICh0bXAgKiBTUl9SRVEpICovCisJCWVsc2UgeworCQkJLyogUnZDOiBnbyB0byBzbGVlcCBpZiBwb2xsaW5nIHRpbWUgZXhwaXJlZAorCQkJICovCisJCQlpZiAoIWNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcG9sbF90aW1lKSkgeworCQkJCU5DUjUzODBfc2V0X3RpbWVyKGhvc3RkYXRhLCBVU0xFRVBfU0xFRVApOworCQkJCWRwcmludGsoTkRFQlVHX1VTTEVFUCwgKCJzY3NpJWQgOiBwb2xsIHRpbWVkIG91dCwgc2xlZXBpbmcgdW50aWwgJXVsXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaG9zdGRhdGEtPnRpbWVfZXhwaXJlcykpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0JCQkvKiB3aGlsZSAoMSkgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogZG9lcyByZXNlbGVjdGlvbiwgaW5pdGlhbGl6aW5nIHRoZSBpbnN0YW5jZS0+Y29ubmVjdGVkIAorICogICAgICBmaWVsZCB0byBwb2ludCB0byB0aGUgU2NzaV9DbW5kIGZvciB3aGljaCB0aGUgSV9UX0wgb3IgSV9UX0xfUSAKKyAqICAgICAgbmV4dXMgaGFzIGJlZW4gcmVlc3RhYmxpc2hlZCwKKyAqICAgICAgCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICogTG9ja3M6IGlvX3JlcXVlc3RfbG9jayBoZWxkIGJ5IGNhbGxlciBpZiBJUlEgZHJpdmVuCisgKi8KKworc3RhdGljIHZvaWQgTkNSNTM4MF9yZXNlbGVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKQorCSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciB0YXJnZXRfbWFzazsKKwl1bnNpZ25lZCBjaGFyIGx1biwgcGhhc2U7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyIG1zZ1szXTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCVNjc2lfQ21uZCAqdG1wID0gTlVMTCwgKnByZXY7CisJaW50IGFib3J0ID0gMDsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCS8qCisJICogRGlzYWJsZSBhcmJpdHJhdGlvbiwgZXRjLiBzaW5jZSB0aGUgaG9zdCBhZGFwdGVyIG9idmlvdXNseQorCSAqIGxvc3QsIGFuZCB0ZWxsIGFuIGludGVycnVwdGVkIE5DUjUzODBfc2VsZWN0KCkgdG8gcmVzdGFydC4KKwkgKi8KKworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCWhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCA9IDE7CisKKwl0YXJnZXRfbWFzayA9IE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpICYgfihob3N0ZGF0YS0+aWRfbWFzayk7CisJZHByaW50ayhOREVCVUdfU0VMRUNUSU9OLCAoInNjc2klZCA6IHJlc2VsZWN0XG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJLyogCisJICogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBkZXRlY3RlZCB0aGF0IG91ciBTQ1NJIElEIGlzIG9uIHRoZSBidXMsCisJICogU0VMIGlzIHRydWUgYW5kIEJTWSB3YXMgZmFsc2UgZm9yIGF0IGxlYXN0IG9uZSBidXMgc2V0dGxlIGRlbGF5CisJICogKDQwMCBucykuCisJICoKKwkgKiBXZSBtdXN0IGFzc2VydCBCU1kgb3Vyc2VsdmVzLCB1bnRpbCB0aGUgdGFyZ2V0IGRyb3BzIHRoZSBTRUwKKwkgKiBzaWduYWwuCisJICovCisKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0JTWSk7CisKKwkvKiBGSVhNRTogdGltZW91dCB0b28gbG9uZywgbXVzdCBmYWlsIHRvIHdvcmtxdWV1ZSAqLwkKKwlpZihOQ1I1MzgwX3BvbGxfcG9saXRlbHkoaW5zdGFuY2UsIFNUQVRVU19SRUcsIFNSX1NFTCwgMCwgMipIWik8MCkKKwkJYWJvcnQgPSAxOworCQkKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJLyoKKwkgKiBXYWl0IGZvciB0YXJnZXQgdG8gZ28gaW50byBNU0dJTi4KKwkgKiBGSVhNRTogdGltZW91dCBuZWVkZWQgYW5kIGZhaWwgdG8gd29yayBxdWVldQorCSAqLworCisJaWYoTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGluc3RhbmNlLCBTVEFUVVNfUkVHLCBTUl9SRVEsIFNSX1JFUSwgMipIWikpCisJCWFib3J0ID0gMTsKKworCWxlbiA9IDE7CisJZGF0YSA9IG1zZzsKKwlwaGFzZSA9IFBIQVNFX01TR0lOOworCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKworCWlmICghKG1zZ1swXSAmIDB4ODApKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkIDogZXhwZWN0aW5nIElERU5USUZZIG1lc3NhZ2UsIGdvdCAiLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCXByaW50X21zZyhtc2cpOworCQlhYm9ydCA9IDE7CisJfSBlbHNlIHsKKwkJLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCWx1biA9IChtc2dbMF0gJiAweDA3KTsKKworCQkvKiAKKwkJICogV2UgbmVlZCB0byBhZGQgY29kZSBmb3IgU0NTSS1JSSB0byB0cmFjayB3aGljaCBkZXZpY2VzIGhhdmUKKwkJICogSV9UX0xfUSBuZXh1c2VzIGVzdGFibGlzaGVkLCBhbmQgd2hpY2ggaGF2ZSBzaW1wbGUgSV9UX0wKKwkJICogbmV4dXNlcyBzbyB3ZSBjYW4gY2hvc2UgdG8gZG8gYWRkaXRpb25hbCBkYXRhIHRyYW5zZmVyLgorCQkgKi8KKworCQkvKiAKKwkJICogRmluZCB0aGUgY29tbWFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBJX1RfTCBvciBJX1RfTF9RICBuZXh1cyB3ZSAKKwkJICoganVzdCByZWVzdGFibGlzaGVkLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKwkJICovCisKKworCQlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgcHJldiA9IE5VTEw7IHRtcDsgcHJldiA9IHRtcCwgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpCisJCQlpZiAoKHRhcmdldF9tYXNrID09ICgxIDw8IHRtcC0+ZGV2aWNlLT5pZCkpICYmIChsdW4gPT0gdG1wLT5kZXZpY2UtPmx1bikKKwkJCSAgICApIHsKKwkJCQlpZiAocHJldikgeworCQkJCQlSRU1PVkUocHJldiwgcHJldi0+aG9zdF9zY3JpYmJsZSwgdG1wLCB0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gdG1wLT5ob3N0X3NjcmliYmxlOworCQkJCX0gZWxzZSB7CisJCQkJCVJFTU9WRSgtMSwgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgdG1wLCB0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGU7CisJCQkJfQorCQkJCXRtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmICghdG1wKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IHdhcm5pbmcgOiB0YXJnZXQgYml0bWFzayAlMDJ4IGx1biAlZCBub3QgaW4gZGlzY29ubmVjdF9xdWV1ZS5cbiIsIGluc3RhbmNlLT5ob3N0X25vLCB0YXJnZXRfbWFzaywgbHVuKTsKKwkJCS8qIAorCQkJICogU2luY2Ugd2UgaGF2ZSBhbiBlc3RhYmxpc2hlZCBuZXh1cyB0aGF0IHdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGgsCisJCQkgKiB3ZSBtdXN0IGFib3J0IGl0LiAgCisJCQkgKi8KKwkJCWFib3J0ID0gMTsKKwkJfQorCX0KKworCWlmIChhYm9ydCkgeworCQlkb19hYm9ydChpbnN0YW5jZSk7CisJfSBlbHNlIHsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IHRtcDsKKwkJZHByaW50ayhOREVCVUdfUkVTRUxFQ1RJT04sICgic2NzaSVkIDogbmV4dXMgZXN0YWJsaXNoZWQsIHRhcmdldCA9ICVkLCBsdW4gPSAlZCwgdGFnID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCB0bXAtPnRhcmdldCwgdG1wLT5sdW4sIHRtcC0+dGFnKSk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfZG1hX2NvbXBsZXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyIHdoZW4gRE1BIGZpbmlzaGVzIG9yIGEgcGhhc2UKKyAqICAgICAgbWlzbWF0Y2ggb2NjdXJzICh3aGljaCB3b3VsZCBmaW5pc2ggdGhlIERNQSB0cmFuc2ZlcikuICAKKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gdGhlIFNjc2lfQ21uZCBzdHJ1Y3R1cmUgZm9yIHdoaWNoIHRoZSBJX1RfTAorICogICAgICBuZXh1cyBoYXMgYmVlbiByZWVzdGFibGlzaGVkLCBvbiBmYWlsdXJlIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KKworI2lmZGVmIFJFQUxfRE1BCitzdGF0aWMgdm9pZCBOQ1I1MzgwX2RtYV9jb21wbGV0ZShOQ1I1MzgwX2luc3RhbmNlICogaW5zdGFuY2UpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKiBpbnN0YW5jZS0+aG9zdGRhdGEpOworCWludCB0cmFuc2ZlcnJlZDsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCS8qCisJICogWFhYIHRoaXMgbWlnaHQgbm90IGJlIHJpZ2h0LgorCSAqCisJICogV2FpdCBmb3IgZmluYWwgYnl0ZSB0byB0cmFuc2ZlciwgaWUgd2FpdCBmb3IgQUNLIHRvIGdvIGZhbHNlLgorCSAqCisJICogV2Ugc2hvdWxkIHVzZSB0aGUgTGFzdCBCeXRlIFNlbnQgYml0LCB1bmZvcnR1bmF0ZWx5IHRoaXMgaXMgCisJICogbm90IGF2YWlsYWJsZSBvbiB0aGUgNTM4MC81MzgxIChvbmx5IHRoZSB2YXJpb3VzIENNT1MgY2hpcHMpCisJICoKKwkgKiBGSVhNRTogdGltZW91dCwgYW5kIG5lZWQgdG8gaGFuZGxlIGxvbmcgdGltZW91dC9pcnEgY2FzZQorCSAqLworCisJTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KGluc3RhbmNlLCBCVVNfQU5EX1NUQVRVU19SRUcsIEJBU1JfQUNLLCAwLCA1KkhaKTsKKworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKwkvKgorCSAqIFRoZSBvbmx5IHBsYWNlcyB3ZSBzaG91bGQgc2VlIGEgcGhhc2UgbWlzbWF0Y2ggYW5kIGhhdmUgdG8gc2VuZAorCSAqIGRhdGEgZnJvbSB0aGUgc2FtZSBzZXQgb2YgcG9pbnRlcnMgd2lsbCBiZSB0aGUgZGF0YSB0cmFuc2ZlcgorCSAqIHBoYXNlcy4gIFNvLCByZXNpZHVhbCwgcmVxdWVzdGVkIGxlbmd0aCBhcmUgb25seSBpbXBvcnRhbnQgaGVyZS4KKwkgKi8KKworCWlmICghKGhvc3RkYXRhLT5jb25uZWN0ZWQtPlNDcC5waGFzZSAmIFNSX0NEKSkgeworCQl0cmFuc2ZlcnJlZCA9IGluc3RhbmNlLT5kbWFsZW4gLSBOQ1I1MzgwX2RtYV9yZXNpZHVhbCgpOworCQlob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AudGhpc19yZXNpZHVhbCAtPSB0cmFuc2ZlcnJlZDsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnB0ciArPSB0cmFuc2ZlcnJlZDsKKwl9Cit9CisjZW5kaWYJCQkJLyogZGVmIFJFQUxfRE1BICovCisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2Fib3J0IChTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogYWJvcnQgYSBjb21tYW5kCisgKgorICogSW5wdXRzIDogY21kIC0gdGhlIFNjc2lfQ21uZCB0byBhYm9ydCwgY29kZSAtIGNvZGUgdG8gc2V0IHRoZSAKKyAqICAgICAgaG9zdCBieXRlIG9mIHRoZSByZXN1bHQgZmllbGQgdG8sIGlmIHplcm8gRElEX0FCT1JURUQgaXMgCisgKiAgICAgIHVzZWQuCisgKgorICogUmV0dXJucyA6IDAgLSBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoKKyAqCVhYWCAtIHRoZXJlIGlzIG5vIHdheSB0byBhYm9ydCB0aGUgY29tbWFuZCB0aGF0IGlzIGN1cnJlbnRseSAKKyAqCWNvbm5lY3RlZCwgeW91IGhhdmUgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBJZiB0aGlzIGlzIAorICoJYSBwcm9ibGVtLCB3ZSBjb3VsZCBpbXBsZW1lbnQgbG9uZ2ptcCgpIC8gc2V0am1wKCksIHNldGptcCgpCisgKgljYWxsZWQgd2hlcmUgdGhlIGxvb3Agc3RhcnRlZCBpbiBOQ1I1MzgwX21haW4oKS4KKyAqCisgKiBMb2NrczogaG9zdCBsb2NrIHRha2VuIGJ5IGNhbGxlcgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9hYm9ydChTY3NpX0NtbmQgKiBjbWQpIHsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisJU2NzaV9DbW5kICp0bXAsICoqcHJldjsKKwkKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBhYm9ydGluZyBjb21tYW5kXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcHJpbnRfU2NzaV9DbW5kKGNtZCk7CisKKwlOQ1I1MzgwX3ByaW50X3N0YXR1cyhpbnN0YW5jZSk7CisKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCWRwcmludGsoTkRFQlVHX0FCT1JULCAoInNjc2klZCA6IGFib3J0IGNhbGxlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwlkcHJpbnRrKE5ERUJVR19BQk9SVCwgKCIgICAgICAgIGJhc3IgMHglWCwgc3IgMHglWFxuIiwgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyksIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkpOworCisjaWYgMAorLyoKKyAqIENhc2UgMSA6IElmIHRoZSBjb21tYW5kIGlzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQsIAorICogd2UnbGwgc2V0IHRoZSBhYm9ydGVkIGZsYWcgYW5kIHJldHVybiBjb250cm9sIHNvIHRoYXQgCisgKiBpbmZvcm1hdGlvbiB0cmFuc2ZlciByb3V0aW5lIGNhbiBleGl0IGNsZWFubHkuCisgKi8KKworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkID09IGNtZCkgeworCQlkcHJpbnRrKE5ERUJVR19BQk9SVCwgKCJzY3NpJWQgOiBhYm9ydGluZyBjb25uZWN0ZWQgY29tbWFuZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJaG9zdGRhdGEtPmFib3J0ZWQgPSAxOworLyoKKyAqIFdlIHNob3VsZCBwZXJmb3JtIEJTWSBjaGVja2luZywgYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IHNsaXBwZWQKKyAqIGludG8gQlVTIEZSRUUuCisgKi8KKworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0FTU0VSVF9BVE4pOworLyogCisgKiBTaW5jZSB3ZSBjYW4ndCBjaGFuZ2UgcGhhc2VzIHVudGlsIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCAKKyAqIGhhbmRzaGFrZSwgd2UgaGF2ZSB0byBzb3VyY2Ugb3Igc2luayBhIGJ5dGUgb2YgZGF0YSBpZiB0aGUgY3VycmVudAorICogcGhhc2UgaXMgbm90IE1TR09VVC4KKyAqLworCisvKiAKKyAqIFJldHVybiBjb250cm9sIHRvIHRoZSBleGVjdXRpbmcgTkNSIGRyaXZlIHNvIHdlIGNhbiBjbGVhciB0aGUKKyAqIGFib3J0ZWQgZmxhZyBhbmQgZ2V0IGJhY2sgaW50byBvdXIgbWFpbiBsb29wLgorICovCisKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKy8qIAorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gaXNzdWVkIHlldCwgd2Ugc2ltcGx5IHJlbW92ZSBpdCAKKyAqICAgICAgICAgIGZyb20gdGhlIGlzc3VlIHF1ZXVlLgorICovCisgCisJZHByaW50ayhOREVCVUdfQUJPUlQsICgic2NzaSVkIDogYWJvcnQgZ29pbmcgaW50byBsb29wLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwlmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmIChob3N0ZGF0YS0+aXNzdWVfcXVldWUpLCB0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgdG1wOyBwcmV2ID0gKFNjc2lfQ21uZCAqKikgJiAodG1wLT5ob3N0X3NjcmliYmxlKSwgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpCisJCWlmIChjbWQgPT0gdG1wKSB7CisJCQlSRU1PVkUoNSwgKnByZXYsIHRtcCwgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCSgqcHJldikgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZTsKKwkJCXRtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQl0bXAtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJCWRwcmludGsoTkRFQlVHX0FCT1JULCAoInNjc2klZCA6IGFib3J0IHJlbW92ZWQgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKwkJCXRtcC0+ZG9uZSh0bXApOworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKyNpZiAoTkRFQlVHICAmIE5ERUJVR19BQk9SVCkKKwkvKiBLTEwgKi8KKwkJZWxzZSBpZiAocHJldiA9PSB0bXApCisJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IExPT1BcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKyNlbmRpZgorCisvKiAKKyAqIENhc2UgMyA6IElmIGFueSBjb21tYW5kcyBhcmUgY29ubmVjdGVkLCB3ZSdyZSBnb2luZyB0byBmYWlsIHRoZSBhYm9ydAorICogICAgICAgICAgYW5kIGxldCB0aGUgaGlnaCBsZXZlbCBTQ1NJIGRyaXZlciByZXRyeSBhdCBhIGxhdGVyIHRpbWUgb3IgCisgKiAgICAgICAgICBpc3N1ZSBhIHJlc2V0LgorICoKKyAqICAgICAgICAgIFRpbWVvdXRzLCBhbmQgdGhlcmVmb3JlIGFib3J0ZWQgY29tbWFuZHMsIHdpbGwgYmUgaGlnaGx5IHVubGlrZWx5CisgKiAgICAgICAgICBhbmQgaGFuZGxpbmcgdGhlbSBjbGVhbmx5IGluIHRoaXMgc2l0dWF0aW9uIHdvdWxkIG1ha2UgdGhlIGNvbW1vbgorICogICAgICAgICAgY2FzZSBvZiBub3Jlc2V0cyBsZXNzIGVmZmljaWVudCwgYW5kIHdvdWxkIHBvbGx1dGUgb3VyIGNvZGUuICBTbywKKyAqICAgICAgICAgIHdlIGZhaWwuCisgKi8KKworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJCWRwcmludGsoTkRFQlVHX0FCT1JULCAoInNjc2klZCA6IGFib3J0IGZhaWxlZCwgY29tbWFuZCBjb25uZWN0ZWQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKy8qCisgKiBDYXNlIDQ6IElmIHRoZSBjb21tYW5kIGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzLCBhbmQgCisgKiAgICAgIHRoZXJlIGFyZSBubyBjb25uZWN0ZWQgY29tbWFuZHMsIHdlIHJlY29ubmVjdCB0aGUgSV9UX0wgb3IgCisgKiAgICAgIElfVF9MX1EgbmV4dXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBnbyBpbnRvIG1lc3NhZ2Ugb3V0LCBhbmQgc2VuZCAKKyAqICAgICAgYW4gYWJvcnQgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGNhc2UgaXMgZXNwZWNpYWxseSB1Z2x5LiBJbiBvcmRlciB0byByZWVzdGFibGlzaCB0aGUgbmV4dXMsIHdlCisgKiBuZWVkIHRvIGNhbGwgTkNSNTM4MF9zZWxlY3QoKS4gIFRoZSBlYXNpZXN0IHdheSB0byBpbXBsZW1lbnQgdGhpcyAKKyAqIGZ1bmN0aW9uIHdhcyB0byBhYm9ydCBpZiB0aGUgYnVzIHdhcyBidXN5LCBhbmQgbGV0IHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgdHJpZ2dlcmVkIG9uIHRoZSBTRUwgZm9yIHJlc2VsZWN0IHRha2UgY2FyZSBvZiBsb3N0IGFyYml0cmF0aW9ucworICogd2hlcmUgbmVjZXNzYXJ5LCBtZWFuaW5nIGludGVycnVwdHMgbmVlZCB0byBiZSBlbmFibGVkLgorICoKKyAqIFdoZW4gaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwgdGhlIHF1ZXVlcyBtYXkgY2hhbmdlIC0gc28gd2UgCisgKiBjYW4ndCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlIGJlZm9yZSBzZWxlY3RpbmcgaXQKKyAqIGJlY2F1c2UgdGhhdCBjb3VsZCBjYXVzZSBhIGZhaWx1cmUgaW4gaGFzaGluZyB0aGUgbmV4dXMgaWYgdGhhdCAKKyAqIGRldmljZSByZXNlbGVjdGVkLgorICogCisgKiBTaW5jZSB0aGUgcXVldWVzIG1heSBjaGFuZ2UsIHdlIGNhbid0IHVzZSB0aGUgcG9pbnRlcnMgZnJvbSB3aGVuIHdlCisgKiBmaXJzdCBsb2NhdGUgaXQuCisgKgorICogU28sIHdlIG11c3QgZmlyc3QgbG9jYXRlIHRoZSBjb21tYW5kLCBhbmQgaWYgTkNSNTM4MF9zZWxlY3QoKQorICogc3VjY2VlZHMsIHRoZW4gaXNzdWUgdGhlIGFib3J0LCByZWxvY2F0ZSB0aGUgY29tbWFuZCBhbmQgcmVtb3ZlCisgKiBpdCBmcm9tIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUuCisgKi8KKworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOyB0bXA7IHRtcCA9IChTY3NpX0NtbmQgKikgdG1wLT5ob3N0X3NjcmliYmxlKQorCQlpZiAoY21kID09IHRtcCkgeworCQkJZHByaW50ayhOREVCVUdfQUJPUlQsICgic2NzaSVkIDogYWJvcnRpbmcgZGlzY29ubmVjdGVkIGNvbW1hbmQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubykpOworCisJCQlpZiAoTkNSNTM4MF9zZWxlY3QoaW5zdGFuY2UsIGNtZCwgKGludCkgY21kLT50YWcpKQorCQkJCXJldHVybiBGQUlMRUQ7CisJCQlkcHJpbnRrKE5ERUJVR19BQk9SVCwgKCJzY3NpJWQgOiBuZXh1cyByZWVzdGFibGlzaGVkLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pKTsKKworCQkJZG9fYWJvcnQoaW5zdGFuY2UpOworCisJCQlmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmIChob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKSwgdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOyB0bXA7IHByZXYgPSAoU2NzaV9DbW5kICoqKSAmICh0bXAtPmhvc3Rfc2NyaWJibGUpLCB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZSkKKwkJCQlpZiAoY21kID09IHRtcCkgeworCQkJCQlSRU1PVkUoNSwgKnByZXYsIHRtcCwgdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQkJKnByZXYgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZTsKKwkJCQkJdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJCQkJdG1wLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJCXRtcC0+ZG9uZSh0bXApOworCQkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCQl9CisJCX0KKy8qCisgKiBDYXNlIDUgOiBJZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQgaW4gYW55IG9mIAorICogICAgICAgICAgdGhlIHF1ZXVlcy4KKyAqCisgKiBXZSBwcm9iYWJseSByZWFjaGVkIHRoaXMgcG9pbnQgYmVjYXVzZSBvZiBhbiB1bmxpa2VseSByYWNlIGNvbmRpdGlvbgorICogYmV0d2VlbiB0aGUgY29tbWFuZCBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGFib3J0aW9uIGNvZGUsCisgKiBzbyB3ZSB3b24ndCBwYW5pYywgYnV0IHdlIHdpbGwgbm90aWZ5IHRoZSB1c2VyIGluIGNhc2Ugc29tZXRoaW5nIHJlYWxseQorICogYnJva2UuCisgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiB3YXJuaW5nIDogU0NTSSBjb21tYW5kIHByb2JhYmx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIKKwkJCSIgICAgICAgICBiZWZvcmUgYWJvcnRpb25cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlyZXR1cm4gRkFJTEVEOworfQorCisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9idXNfcmVzZXQgKFNjc2lfQ21uZCAqY21kKQorICogCisgKiBQdXJwb3NlIDogcmVzZXQgdGhlIFNDU0kgYnVzLgorICoKKyAqIFJldHVybnMgOiBTVUNDRVNTCisgKgorICogTG9ja3M6IGhvc3QgbG9jayB0YWtlbiBieSBjYWxsZXIKKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkgeworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoY21kLT5kZXZpY2UtPmhvc3QpOworCisJTkNSNTM4MF9wcmludF9zdGF0dXMoY21kLT5kZXZpY2UtPmhvc3QpOworCWRvX3Jlc2V0KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2RldmljZV9yZXNldCAoU2NzaV9DbW5kICpjbWQpCisgKiAKKyAqIFB1cnBvc2UgOiByZXNldCBhIFNDU0kgZGV2aWNlCisgKgorICogUmV0dXJucyA6IEZBSUxFRAorICoKKyAqIExvY2tzOiBpb19yZXF1ZXN0X2xvY2sgaGVsZCBieSBjYWxsZXIKKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkgeworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9ob3N0X3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkKKyAqIAorICogUHVycG9zZSA6IHJlc2V0IGEgU0NTSSBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDogRkFJTEVECisgKgorICogTG9ja3M6IGlvX3JlcXVlc3RfbG9jayBoZWxkIGJ5IGNhbGxlcgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkgeworCXJldHVybiBGQUlMRUQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5oIGIvZHJpdmVycy9zY3NpL05DUjUzODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTEwM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzODAuaApAQCAtMCwwICsxLDQzMiBAQAorLyogCisgKiBOQ1IgNTM4MCBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcKKyAqCShVbml4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqIAlkcmV3QGNvbG9yYWRvLmVkdQorICogICAgICArMSAoMzAzKSA2NjYtNTgzNgorICoKKyAqIERJU1RSSUJVVElPTiBSRUxFQVNFIDcKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisvKgorICogJExvZzogTkNSNTM4MC5oLHYgJAorICovCisKKyNpZm5kZWYgTkNSNTM4MF9ICisjZGVmaW5lIE5DUjUzODBfSAorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSA3CisjZGVmaW5lIE5DUjUzQzQwMF9QVUJMSUNfUkVMRUFTRSAyCisKKyNkZWZpbmUgTkRFQlVHX0FSQklUUkFUSU9OCTB4MQorI2RlZmluZSBOREVCVUdfQVVUT1NFTlNFCTB4MgorI2RlZmluZSBOREVCVUdfRE1BCQkweDQKKyNkZWZpbmUgTkRFQlVHX0hBTkRTSEFLRQkweDgKKyNkZWZpbmUgTkRFQlVHX0lORk9STUFUSU9OCTB4MTAKKyNkZWZpbmUgTkRFQlVHX0lOSVQJCTB4MjAKKyNkZWZpbmUgTkRFQlVHX0lOVFIJCTB4NDAKKyNkZWZpbmUgTkRFQlVHX0xJTktFRAkJMHg4MAorI2RlZmluZSBOREVCVUdfTUFJTgkJMHgxMDAKKyNkZWZpbmUgTkRFQlVHX05PX0RBVEFPVVQJMHgyMDAKKyNkZWZpbmUgTkRFQlVHX05PX1dSSVRFCQkweDQwMAorI2RlZmluZSBOREVCVUdfUElPCQkweDgwMAorI2RlZmluZSBOREVCVUdfUFNFVURPX0RNQQkweDEwMDAKKyNkZWZpbmUgTkRFQlVHX1FVRVVFUwkJMHgyMDAwCisjZGVmaW5lIE5ERUJVR19SRVNFTEVDVElPTgkweDQwMDAKKyNkZWZpbmUgTkRFQlVHX1NFTEVDVElPTgkweDgwMDAKKyNkZWZpbmUgTkRFQlVHX1VTTEVFUAkJMHgxMDAwMAorI2RlZmluZSBOREVCVUdfTEFTVF9CWVRFX1NFTlQJMHgyMDAwMAorI2RlZmluZSBOREVCVUdfUkVTVEFSVF9TRUxFQ1QJMHg0MDAwMAorI2RlZmluZSBOREVCVUdfRVhURU5ERUQJCTB4ODAwMDAKKyNkZWZpbmUgTkRFQlVHX0M0MDBfUFJFQUQJMHgxMDAwMDAKKyNkZWZpbmUgTkRFQlVHX0M0MDBfUFdSSVRFCTB4MjAwMDAwCisjZGVmaW5lIE5ERUJVR19MSVNUUwkJMHg0MDAwMDAKKworI2RlZmluZSBOREVCVUdfQU5ZCQkweEZGRkZGRkZGVUwKKworLyogCisgKiBUaGUgY29udGVudHMgb2YgdGhlIE9VVFBVVCBEQVRBIHJlZ2lzdGVyIGFyZSBhc3NlcnRlZCBvbiB0aGUgYnVzIHdoZW4KKyAqIGVpdGhlciBhcmJpdHJhdGlvbiBpcyBvY2N1cnJpbmcgb3IgdGhlIHBoYXNlLWluZGljYXRpbmcgc2lnbmFscyAoCisgKiBJTywgQ0QsIE1TRykgaW4gdGhlIFRBUkdFVCBDT01NQU5EIHJlZ2lzdGVyIGFuZCB0aGUgQVNTRVJUIERBVEEKKyAqIGJpdCBpbiB0aGUgSU5JVElBVE9SIENPTU1BTkQgcmVnaXN0ZXIgaXMgc2V0LgorICovCisKKyNkZWZpbmUgT1VUUFVUX0RBVEFfUkVHICAgICAgICAgMAkvKiB3byBEQVRBIGxpbmVzIG9uIFNDU0kgYnVzICovCisjZGVmaW5lIENVUlJFTlRfU0NTSV9EQVRBX1JFRyAgIDAJLyogcm8gc2FtZSAqLworCisjZGVmaW5lIElOSVRJQVRPUl9DT01NQU5EX1JFRwkxCS8qIHJ3ICovCisjZGVmaW5lIElDUl9BU1NFUlRfUlNUCQkweDgwCS8qIHJ3IFNldCB0byBhc3NlcnQgUlNUICAqLworI2RlZmluZSBJQ1JfQVJCSVRSQVRJT05fUFJPR1JFU1MgMHg0MAkvKiBybyBJbmRpY2F0ZXMgYXJiaXRyYXRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgSUNSX1RSSV9TVEFURQkJMHg0MAkvKiB3byBTZXQgdG8gdHJpLXN0YXRlIGRyaXZlcnMgKi8KKyNkZWZpbmUgSUNSX0FSQklUUkFUSU9OX0xPU1QJMHgyMAkvKiBybyBJbmRpY2F0ZXMgYXJiaXRyYXRpb24gbG9zdCAqLworI2RlZmluZSBJQ1JfRElGRl9FTkFCTEUJCTB4MjAJLyogd28gU2V0IHRvIGVuYWJsZSBkaWZmLiBkcml2ZXJzICovCisjZGVmaW5lIElDUl9BU1NFUlRfQUNLCQkweDEwCS8qIHJ3IGluaSBTZXQgdG8gYXNzZXJ0IEFDSyAqLworI2RlZmluZSBJQ1JfQVNTRVJUX0JTWQkJMHgwOAkvKiBydyBTZXQgdG8gYXNzZXJ0IEJTWSAqLworI2RlZmluZSBJQ1JfQVNTRVJUX1NFTCAJCTB4MDQJLyogcncgU2V0IHRvIGFzc2VydCBTRUwgKi8KKyNkZWZpbmUgSUNSX0FTU0VSVF9BVE4JCTB4MDIJLyogcncgU2V0IHRvIGFzc2VydCBBVE4gKi8KKyNkZWZpbmUgSUNSX0FTU0VSVF9EQVRBCQkweDAxCS8qIHJ3IFNDU0lfREFUQV9SRUcgaXMgYXNzZXJ0ZWQgKi8KKworI2lmZGVmIERJRkZFUkVOVElBTAorI2RlZmluZSBJQ1JfQkFTRQkJSUNSX0RJRkZfRU5BQkxFCisjZWxzZQorI2RlZmluZSBJQ1JfQkFTRQkJMAorI2VuZGlmCisKKyNkZWZpbmUgTU9ERV9SRUcJCTIKKy8qCisgKiBOb3RlIDogQkxPQ0tfRE1BIGNvZGUgd2lsbCBrZWVwIERSUSBhc3NlcnRlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSAKKyAqIHRyYW5zZmVyLCBjYXVzaW5nIHRoZSBjaGlwIHRvIGhvZyB0aGUgYnVzLiAgWW91IHByb2JhYmx5IGRvbid0IHdhbnQgCisgKiB0aGlzLgorICovCisjZGVmaW5lIE1SX0JMT0NLX0RNQV9NT0RFCTB4ODAJLyogcncgYmxvY2sgbW9kZSBETUEgKi8KKyNkZWZpbmUgTVJfVEFSR0VUCQkweDQwCS8qIHJ3IHRhcmdldCBtb2RlICovCisjZGVmaW5lIE1SX0VOQUJMRV9QQVJfQ0hFQ0sJMHgyMAkvKiBydyBlbmFibGUgcGFyaXR5IGNoZWNraW5nICovCisjZGVmaW5lIE1SX0VOQUJMRV9QQVJfSU5UUgkweDEwCS8qIHJ3IGVuYWJsZSBiYWQgcGFyaXR5IGludGVycnVwdCAqLworI2RlZmluZSBNUl9FTkFCTEVfRU9QX0lOVFIJMHgwOAkvKiBydyBlbmFibGUgZW9wIGludGVycnVwdCAqLworI2RlZmluZSBNUl9NT05JVE9SX0JTWQkJMHgwNAkvKiBydyBlbmFibGUgaW50IG9uIHVuZXhwZWN0ZWQgYnN5IGZhaWwgKi8KKyNkZWZpbmUgTVJfRE1BX01PREUJCTB4MDIJLyogcncgRE1BIC8gcHNldWRvIERNQSBtb2RlICovCisjZGVmaW5lIE1SX0FSQklUUkFURQkJMHgwMQkvKiBydyBzdGFydCBhcmJpdHJhdGlvbiAqLworCisjaWZkZWYgUEFSSVRZCisjZGVmaW5lIE1SX0JBU0UJCQlNUl9FTkFCTEVfUEFSX0NIRUNLCisjZWxzZQorI2RlZmluZSBNUl9CQVNFCQkJMAorI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0NPTU1BTkRfUkVHCTMKKyNkZWZpbmUgVENSX0xBU1RfQllURV9TRU5UCTB4ODAJLyogcm8gRE1BIGRvbmUgKi8KKyNkZWZpbmUgVENSX0FTU0VSVF9SRVEJCTB4MDgJLyogdGd0IHJ3IGFzc2VydCBSRVEgKi8KKyNkZWZpbmUgVENSX0FTU0VSVF9NU0cJCTB4MDQJLyogdGd0IHJ3IGFzc2VydCBNU0cgKi8KKyNkZWZpbmUgVENSX0FTU0VSVF9DRAkJMHgwMgkvKiB0Z3QgcncgYXNzZXJ0IENEICovCisjZGVmaW5lIFRDUl9BU1NFUlRfSU8JCTB4MDEJLyogdGd0IHJ3IGFzc2VydCBJTyAqLworCisjZGVmaW5lIFNUQVRVU19SRUcJCTQJLyogcm8gKi8KKy8qCisgKiBOb3RlIDogYSBzZXQgYml0IGluZGljYXRlcyBhbiBhY3RpdmUgc2lnbmFsLCBkcml2ZW4gYnkgdXMgb3IgYW5vdGhlciAKKyAqIGRldmljZS4KKyAqLworI2RlZmluZSBTUl9SU1QJCQkweDgwCisjZGVmaW5lIFNSX0JTWQkJCTB4NDAKKyNkZWZpbmUgU1JfUkVRCQkJMHgyMAorI2RlZmluZSBTUl9NU0cJCQkweDEwCisjZGVmaW5lIFNSX0NECQkJMHgwOAorI2RlZmluZSBTUl9JTwkJCTB4MDQKKyNkZWZpbmUgU1JfU0VMCQkJMHgwMgorI2RlZmluZSBTUl9EQlAJCQkweDAxCisKKy8qCisgKiBTZXR0aW5nIGEgYml0IGluIHRoaXMgcmVnaXN0ZXIgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgdG8gYmUgZ2VuZXJhdGVkIHdoZW4gCisgKiBCU1kgaXMgZmFsc2UgYW5kIFNFTCB0cnVlIGFuZCB0aGlzIGJpdCBpcyBhc3NlcnRlZCAgb24gdGhlIGJ1cy4KKyAqLworI2RlZmluZSBTRUxFQ1RfRU5BQkxFX1JFRwk0CS8qIHdvICovCisKKyNkZWZpbmUgQlVTX0FORF9TVEFUVVNfUkVHCTUJLyogcm8gKi8KKyNkZWZpbmUgQkFTUl9FTkRfRE1BX1RSQU5TRkVSCTB4ODAJLyogcm8gc2V0IG9uIGVuZCBvZiB0cmFuc2ZlciAqLworI2RlZmluZSBCQVNSX0RSUQkJMHg0MAkvKiBybyBtaXJyb3Igb2YgRFJRIHBpbiAqLworI2RlZmluZSBCQVNSX1BBUklUWV9FUlJPUgkweDIwCS8qIHJvIHBhcml0eSBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBCQVNSX0lSUQkJMHgxMAkvKiBybyBtaXJyb3Igb2YgSVJRIHBpbiAqLworI2RlZmluZSBCQVNSX1BIQVNFX01BVENICTB4MDgJLyogcm8gU2V0IHdoZW4gTVNHIENEIElPIG1hdGNoIFRDUiAqLworI2RlZmluZSBCQVNSX0JVU1lfRVJST1IJCTB4MDQJLyogcm8gVW5leHBlY3RlZCBjaGFuZ2UgdG8gaW5hY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgQkFTUl9BVE4gCQkweDAyCS8qIHJvIEJVUyBzdGF0dXMgKi8KKyNkZWZpbmUgQkFTUl9BQ0sJCTB4MDEJLyogcm8gQlVTIHN0YXR1cyAqLworCisvKiBXcml0ZSBhbnkgdmFsdWUgdG8gdGhpcyByZWdpc3RlciB0byBzdGFydCBhIERNQSBzZW5kICovCisjZGVmaW5lIFNUQVJUX0RNQV9TRU5EX1JFRwk1CS8qIHdvICovCisKKy8qIAorICogVXNlZCBpbiBETUEgdHJhbnNmZXIgbW9kZSwgZGF0YSBpcyBsYXRjaGVkIGZyb20gdGhlIFNDU0kgYnVzIG9uCisgKiB0aGUgZmFsbGluZyBlZGdlIG9mIFJFUSAoaW5pKSBvciBBQ0sgKHRndCkKKyAqLworI2RlZmluZSBJTlBVVF9EQVRBX1JFRwkJCTYJLyogcm8gKi8KKworLyogV3JpdGUgYW55IHZhbHVlIHRvIHRoaXMgcmVnaXN0ZXIgdG8gc3RhcnQgYSBETUEgcmVjZWl2ZSAqLworI2RlZmluZSBTVEFSVF9ETUFfVEFSR0VUX1JFQ0VJVkVfUkVHCTYJLyogd28gKi8KKworLyogUmVhZCB0aGlzIHJlZ2lzdGVyIHRvIGNsZWFyIGludGVycnVwdCBjb25kaXRpb25zICovCisjZGVmaW5lIFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHCTcJLyogcm8gKi8KKworLyogV3JpdGUgYW55IHZhbHVlIHRvIHRoaXMgcmVnaXN0ZXIgdG8gc3RhcnQgYW4gaW5pIG1vZGUgRE1BIHJlY2VpdmUgKi8KKyNkZWZpbmUgU1RBUlRfRE1BX0lOSVRJQVRPUl9SRUNFSVZFX1JFRyA3CS8qIHdvICovCisKKyNkZWZpbmUgQzQwMF9DT05UUk9MX1NUQVRVU19SRUcgTkNSNTNDNDAwX3JlZ2lzdGVyX29mZnNldC04CS8qIHJ3ICovCisKKyNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAweDgwCS8qIHdvICBSZXNldHMgNTNjNDAwICovCisjZGVmaW5lIENTUl81M0M4MF9SRUcgICAgICAgICAgMHg4MAkvKiBybyAgNTM4MCByZWdpc3RlcnMgYnVzeSAqLworI2RlZmluZSBDU1JfVFJBTlNfRElSICAgICAgICAgIDB4NDAJLyogcncgIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICovCisjZGVmaW5lIENTUl9TQ1NJX0JVRkZfSU5UUiAgICAgMHgyMAkvKiBydyAgRW5hYmxlIGludCBvbiB0cmFuc2ZlciByZWFkeSAqLworI2RlZmluZSBDU1JfNTNDODBfSU5UUiAgICAgICAgIDB4MTAJLyogcncgIEVuYWJsZSA1M2M4MCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIENTUl9TSEFSRURfSU5UUiAgICAgICAgMHgwOAkvKiBydyAgSW50ZXJydXB0IHNoYXJpbmcgKi8KKyNkZWZpbmUgQ1NSX0hPU1RfQlVGX05PVF9SRFkgICAweDA0CS8qIHJvICBJcyBIb3N0IGJ1ZmZlciByZWFkeSAqLworI2RlZmluZSBDU1JfU0NTSV9CVUZfUkRZICAgICAgIDB4MDIJLyogcm8gIFNDU0kgYnVmZmVyIHJlYWQgKi8KKyNkZWZpbmUgQ1NSX0dBVEVEXzUzQzgwX0lSUSAgICAweDAxCS8qIHJvICBMYXN0IGJsb2NrIHhmZXJyZWQgKi8KKworI2lmIDAKKyNkZWZpbmUgQ1NSX0JBU0UgQ1NSX1NDU0lfQlVGRl9JTlRSIHwgQ1NSXzUzQzgwX0lOVFIKKyNlbHNlCisjZGVmaW5lIENTUl9CQVNFIENTUl81M0M4MF9JTlRSCisjZW5kaWYKKworLyogTnVtYmVyIG9mIDEyOC1ieXRlIGJsb2NrcyB0byBiZSB0cmFuc2ZlcnJlZCAqLworI2RlZmluZSBDNDAwX0JMT0NLX0NPVU5URVJfUkVHICAgTkNSNTNDNDAwX3JlZ2lzdGVyX29mZnNldC03CS8qIHJ3ICovCisKKy8qIFJlc3VtZSB0cmFuc2ZlciBhZnRlciBkaXNjb25uZWN0ICovCisjZGVmaW5lIEM0MDBfUkVTVU1FX1RSQU5TRkVSX1JFRyBOQ1I1M0M0MDBfcmVnaXN0ZXJfb2Zmc2V0LTYJLyogd28gKi8KKworLyogQWNjZXNzIHRvIGhvc3QgYnVmZmVyIHN0YWNrICovCisjZGVmaW5lIEM0MDBfSE9TVF9CVUZGRVIgICAgICAgICBOQ1I1M0M0MDBfcmVnaXN0ZXJfb2Zmc2V0LTQJLyogcncgKi8KKworCisvKiBOb3RlIDogUEhBU0VfKiBtYWNyb3MgYXJlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIFNUQVRVUyByZWdpc3RlciAqLworI2RlZmluZSBQSEFTRV9NQVNLIAkoU1JfTVNHIHwgU1JfQ0QgfCBTUl9JTykKKworI2RlZmluZSBQSEFTRV9EQVRBT1VUCQkwCisjZGVmaW5lIFBIQVNFX0RBVEFJTgkJU1JfSU8KKyNkZWZpbmUgUEhBU0VfQ01ET1VUCQlTUl9DRAorI2RlZmluZSBQSEFTRV9TVEFUSU4JCShTUl9DRCB8IFNSX0lPKQorI2RlZmluZSBQSEFTRV9NU0dPVVQJCShTUl9NU0cgfCBTUl9DRCkKKyNkZWZpbmUgUEhBU0VfTVNHSU4JCShTUl9NU0cgfCBTUl9DRCB8IFNSX0lPKQorI2RlZmluZSBQSEFTRV9VTktOT1dOCQkweGZmCisKKy8qIAorICogQ29udmVydCBzdGF0dXMgcmVnaXN0ZXIgcGhhc2UgdG8gc29tZXRoaW5nIHdlIGNhbiB1c2UgdG8gc2V0IHBoYXNlIGluIAorICogdGhlIHRhcmdldCByZWdpc3RlciBzbyB3ZSBjYW4gZ2V0IHBoYXNlIG1pc21hdGNoIGludGVycnVwdHMgb24gRE1BIAorICogdHJhbnNmZXJzLgorICovCisKKyNkZWZpbmUgUEhBU0VfU1JfVE9fVENSKHBoYXNlKSAoKHBoYXNlKSA+PiAyKQorCisvKgorICogVGhlIGludGVybmFsIHNob3VsZF9kaXNjb25uZWN0KCkgZnVuY3Rpb24gcmV0dXJucyB0aGVzZSBiYXNlZCBvbiB0aGUgCisgKiBleHBlY3RlZCBsZW5ndGggb2YgYSBkaXNjb25uZWN0IGlmIGEgZGV2aWNlIHN1cHBvcnRzIGRpc2Nvbm5lY3QvCisgKiByZWNvbm5lY3QuCisgKi8KKworI2RlZmluZSBESVNDT05ORUNUX05PTkUJCTAKKyNkZWZpbmUgRElTQ09OTkVDVF9USU1FX1RPX0RBVEEJMQorI2RlZmluZSBESVNDT05ORUNUX0xPTkcJCTIKKworLyogCisgKiBUaGVzZSBhcmUgInNwZWNpYWwiIHZhbHVlcyBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgcGFzc2VkIHRvIE5DUjUzODBfc2VsZWN0LgorICovCisKKyNkZWZpbmUgVEFHX05FWFQJLTEJLyogVXNlIG5leHQgZnJlZSB0YWcgKi8KKyNkZWZpbmUgVEFHX05PTkUJLTIJLyogCisJCQkJICogRXN0YWJsaXNoIElfVF9MIG5leHVzIGluc3RlYWQgb2YgSV9UX0xfUQorCQkJCSAqIGV2ZW4gb24gU0NTSS1JSSBkZXZpY2VzLgorCQkJCSAqLworCisvKgorICogVGhlc2UgYXJlICJzcGVjaWFsIiB2YWx1ZXMgZm9yIHRoZSBpcnEgYW5kIGRtYV9jaGFubmVsIGZpZWxkcyBvZiB0aGUgCisgKiBTY3NpX0hvc3Qgc3RydWN0dXJlCisgKi8KKworI2RlZmluZSBTQ1NJX0lSUV9OT05FCTI1NQorI2RlZmluZSBETUFfTk9ORQkyNTUKKyNkZWZpbmUgSVJRX0FVVE8JMjU0CisjZGVmaW5lIERNQV9BVVRPCTI1NAorI2RlZmluZSBQT1JUX0FVVE8JMHhmZmZmCS8qIGF1dG9wcm9iZSBpbyBwb3J0IGZvciA1M2M0MDBhICovCisKKyNkZWZpbmUgRkxBR19IQVNfTEFTVF9CWVRFX1NFTlQJCTEJLyogTkNSNTNjODEgb3IgYmV0dGVyICovCisjZGVmaW5lIEZMQUdfQ0hFQ0tfTEFTVF9CWVRFX1NFTlQJMgkvKiBPbmx5IHRlc3Qgb25jZSAqLworI2RlZmluZSBGTEFHX05DUjUzQzQwMAkJCTQJLyogTkNSNTNjNDAwICovCisjZGVmaW5lIEZMQUdfTk9fUFNFVURPX0RNQQkJOAkvKiBJbmhpYml0IERNQSAqLworI2RlZmluZSBGTEFHX0RUQzMxODFFCQkJMTYJLyogRFRDMzE4MUUgKi8KKworI2lmbmRlZiBBU00KK3N0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhIHsKKwlOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkczsJCS8qIGltcGxlbWVudGF0aW9uIHNwZWNpZmljICovCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsJCQkvKiBIb3N0IGJhY2twb2ludGVyICovCisJdW5zaWduZWQgY2hhciBpZF9tYXNrLCBpZF9oaWdoZXJfbWFzazsJLyogMSA8PCBpZCwgYWxsIGJpdHMgZ3JlYXRlciAqLworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0c19wcmVzZW50OwkJLyogdGFyZ2V0cyB3ZSBoYXZlIGNvbm5lY3RlZAorCQkJCQkJICAgdG8sIHNvIHdlIGNhbiBjYWxsIGEgc2VsZWN0CisJCQkJCQkgICBmYWlsdXJlIGEgcmV0cnlhYmxlIGNvbmRpdGlvbiAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYnVzeVs4XTsJCS8qIGluZGV4ID0gdGFyZ2V0LCBiaXQgPSBsdW4gKi8KKyNpZiBkZWZpbmVkKFJFQUxfRE1BKSB8fCBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpCisJdm9sYXRpbGUgaW50IGRtYV9sZW47CQkJLyogcmVxdWVzdGVkIGxlbmd0aCBvZiBETUEgKi8KKyNlbmRpZgorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgbGFzdF9tZXNzYWdlOwkvKiBsYXN0IG1lc3NhZ2UgT1VUICovCisJdm9sYXRpbGUgU2NzaV9DbW5kICpjb25uZWN0ZWQ7CQkvKiBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQgKi8KKwl2b2xhdGlsZSBTY3NpX0NtbmQgKmlzc3VlX3F1ZXVlOwkvKiB3YWl0aW5nIHRvIGJlIGlzc3VlZCAqLworCXZvbGF0aWxlIFNjc2lfQ21uZCAqZGlzY29ubmVjdGVkX3F1ZXVlOwkvKiB3YWl0aW5nIGZvciByZWNvbm5lY3QgKi8KKwl2b2xhdGlsZSBpbnQgcmVzdGFydF9zZWxlY3Q7CQkvKiB3ZSBoYXZlIGRpc2Nvbm5lY3RlZCwKKwkJCQkJCSAgIHVzZWQgdG8gcmVzdGFydCAKKwkJCQkJCSAgIE5DUjUzODBfc2VsZWN0KCkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBhYm9ydGVkOjE7CQkvKiBmbGFnLCBzYXlzIGFib3J0ZWQgKi8KKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lX2V4cGlyZXM7CQkvKiBpbiBqaWZmaWVzLCBzZXQgcHJpb3IgdG8gc2xlZXBpbmcgKi8KKwlpbnQgc2VsZWN0X3RpbWU7CQkJLyogdGltZXIgaW4gc2VsZWN0IGZvciB0YXJnZXQgcmVzcG9uc2UgKi8KKwl2b2xhdGlsZSBTY3NpX0NtbmQgKnNlbGVjdGluZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29yb3V0aW5lOwkJLyogb3VyIGNvLXJvdXRpbmUgKi8KKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisJdW5zaWduZWQgdGltZWJhc2U7CQkJLyogQmFzZSBmb3IgdGltZSBjYWxjcyAqLworCWxvbmcgdGltZV9yZWFkWzhdOwkJCS8qIHRpbWUgdG8gZG8gcmVhZHMgKi8KKwlsb25nIHRpbWVfd3JpdGVbOF07CQkJLyogdGltZSB0byBkbyB3cml0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWRbOF07CQkvKiBieXRlcyByZWFkICovCisJdW5zaWduZWQgbG9uZyBieXRlc193cml0ZVs4XTsJCS8qIGJ5dGVzIHdyaXR0ZW4gKi8KKwl1bnNpZ25lZCBwZW5kaW5ncjsKKwl1bnNpZ25lZCBwZW5kaW5ndzsKKyNlbmRpZgorfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBkcHJpbnRrKGEsYikJCQlkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBOQ1I1MzgwX2RwcmludChhLGIpCQlkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBOQ1I1MzgwX2RwcmludF9waGFzZShhLGIpCWRvIHt9IHdoaWxlKDApCisKKyNpZiBkZWZpbmVkKEFVVE9QUk9CRV9JUlEpCitzdGF0aWMgaW50IE5DUjUzODBfcHJvYmVfaXJxKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcG9zc2libGUpOworI2VuZGlmCitzdGF0aWMgaW50IE5DUjUzODBfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IGZsYWdzKTsKK3N0YXRpYyB2b2lkIE5DUjUzODBfZXhpdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitzdGF0aWMgdm9pZCBOQ1I1MzgwX2luZm9ybWF0aW9uX3RyYW5zZmVyKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKyNpZm5kZWYgRE9OVF9VU0VfSU5UUgorc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgTkNSNTM4MF9tYWluKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X29wdGlvbnMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOworI2lmZGVmIE5ERUJVRworc3RhdGljIHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKyNlbmRpZgorc3RhdGljIGludCBOQ1I1MzgwX2Fib3J0KFNjc2lfQ21uZCAqIGNtZCk7CitzdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCk7CitzdGF0aWMgaW50IE5DUjUzODBfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBjbWQpOworc3RhdGljIGludCBOQ1I1MzgwX2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBjbWQpOworc3RhdGljIGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IE5DUjUzODBfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKK29mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KTsKKworc3RhdGljIHZvaWQgTkNSNTM4MF9yZXNlbGVjdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CitzdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKiBjbWQsIGludCB0YWcpOworI2lmIGRlZmluZWQoUFNFVURPX0RNQSkgfHwgZGVmaW5lZChSRUFMX0RNQSkgfHwgZGVmaW5lZChSRUFMX0RNQV9QT0xMKQorc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKipkYXRhKTsKKyNlbmRpZgorc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKipkYXRhKTsKKworI2lmIChkZWZpbmVkKFJFQUxfRE1BKSB8fCBkZWZpbmVkKFJFQUxfRE1BX1BPTEwpKQorCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9fYWxwaGFfXykKKworLyoqCisgKglOQ1I1MzgwX3BjX2RtYV9zZXR1cAkJLQlzZXR1cCBJU0EgRE1BCisgKglAaW5zdGFuY2U6IGFkYXB0ZXIgdG8gc2V0IHVwCisgKglAcHRyOiBibG9jayB0byB0cmFuc2ZlciAodmlydHVhbCBhZGRyZXNzKQorICoJQGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqCUBtb2RlOiBETUEgY29udHJvbGxlciBtb2RlIHRvIHVzZQorICoKKyAqCVByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyIHJlYWR5IHRvIHBlcmZvcm0gYW4gSVNBIERNQSB0cmFuc2ZlcgorICoJb24gdGhpcyBjaGlwLgorICoKKyAqCUxvY2tzOiB0YWtlcyBhbmQgcmVsZWFzZXMgdGhlIElTQSBETUEgbG9jay4KKyAqLworIAorc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzODBfcGNfZG1hX3NldHVwKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpwdHIsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgY2hhciBtb2RlKQoreworCXVuc2lnbmVkIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cyhwdHIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5zdGFuY2UtPmRtYV9jaGFubmVsIDw9IDMpIHsKKwkJaWYgKGNvdW50ID4gNjU1MzYpCisJCQljb3VudCA9IDY1NTM2OworCQlsaW1pdCA9IDY1NTM2IC0gKGJ1c19hZGRyICYgMHhGRkZGKTsKKwl9IGVsc2UgeworCQlpZiAoY291bnQgPiA2NTUzNiAqIDIpCisJCQljb3VudCA9IDY1NTM2ICogMjsKKwkJbGltaXQgPSA2NTUzNiAqIDIgLSAoYnVzX2FkZHIgJiAweDFGRkZGKTsKKwl9CisKKwlpZiAoY291bnQgPiBsaW1pdCkKKwkJY291bnQgPSBsaW1pdDsKKworCWlmICgoY291bnQgJiAxKSB8fCAoYnVzX2FkZHIgJiAxKSkKKwkJcGFuaWMoInNjc2klZCA6IGF0dGVtcHRlZCB1bmFsaWduZWQgRE1BIHRyYW5zZmVyXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShpbnN0YW5jZS0+ZG1hX2NoYW5uZWwpOworCWNsZWFyX2RtYV9mZihpbnN0YW5jZS0+ZG1hX2NoYW5uZWwpOworCXNldF9kbWFfYWRkcihpbnN0YW5jZS0+ZG1hX2NoYW5uZWwsIGJ1c19hZGRyKTsKKwlzZXRfZG1hX2NvdW50KGluc3RhbmNlLT5kbWFfY2hhbm5lbCwgY291bnQpOworCXNldF9kbWFfbW9kZShpbnN0YW5jZS0+ZG1hX2NoYW5uZWwsIG1vZGUpOworCWVuYWJsZV9kbWEoaW5zdGFuY2UtPmRtYV9jaGFubmVsKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICoJTkNSNTM4MF9wY19kbWFfd3JpdGVfc2V0dXAJCS0Jc2V0dXAgSVNBIERNQSB3cml0ZQorICoJQGluc3RhbmNlOiBhZGFwdGVyIHRvIHNldCB1cAorICoJQHB0cjogYmxvY2sgdG8gdHJhbnNmZXIgKHZpcnR1YWwgYWRkcmVzcykKKyAqCUBjb3VudDogbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyCisgKgorICoJUHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIgcmVhZHkgdG8gcGVyZm9ybSBhbiBJU0EgRE1BIHdyaXRlIHRvIHRoZQorICoJU0NTSSBjb250cm9sbGVyLgorICoKKyAqCUxvY2tzOiBjYWxsZWQgcm91dGluZXMgdGFrZSBhbmQgcmVsZWFzZSB0aGUgSVNBIERNQSBsb2NrLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBOQ1I1MzgwX3BjX2RtYV93cml0ZV9zZXR1cChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIE5DUjUzODBfcGNfZG1hX3NldHVwKGluc3RhbmNlLCBzcmMsIGNvdW50LCBETUFfTU9ERV9XUklURSk7Cit9CisKKy8qKgorICoJTkNSNTM4MF9wY19kbWFfcmVhZF9zZXR1cAkJLQlzZXR1cCBJU0EgRE1BIHJlYWQKKyAqCUBpbnN0YW5jZTogYWRhcHRlciB0byBzZXQgdXAKKyAqCUBwdHI6IGJsb2NrIHRvIHRyYW5zZmVyICh2aXJ0dWFsIGFkZHJlc3MpCisgKglAY291bnQ6IG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICoKKyAqCVByb2dyYW0gdGhlIERNQSBjb250cm9sbGVyIHJlYWR5IHRvIHBlcmZvcm0gYW4gSVNBIERNQSByZWFkIGZyb20gdGhlCisgKglTQ1NJIGNvbnRyb2xsZXIuCisgKgorICoJTG9ja3M6IGNhbGxlZCByb3V0aW5lcyB0YWtlIGFuZCByZWxlYXNlIHRoZSBJU0EgRE1BIGxvY2suCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzODBfcGNfZG1hX3JlYWRfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgaW50IGNvdW50KQoreworCXJldHVybiBOQ1I1MzgwX3BjX2RtYV9zZXR1cChpbnN0YW5jZSwgc3JjLCBjb3VudCwgRE1BX01PREVfUkVBRCk7Cit9CisKKy8qKgorICoJTkNSNTM4MF9wY19kbWFfcmVzaWR1YWwJCS0JcmV0dXJuIGJ5dGVzIGxlZnQgCisgKglAaW5zdGFuY2U6IGFkYXB0ZXIKKyAqCisgKglSZXBvcnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBvdmVyIGFmdGVyIHRoZSBETUEgd2FzIHRlcm1pbmF0ZWQuCisgKgorICoJTG9ja3M6IHRha2VzIGFuZCByZWxlYXNlcyB0aGUgSVNBIERNQSBsb2NrLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBOQ1I1MzgwX3BjX2RtYV9yZXNpZHVhbChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0bXA7CisKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGluc3RhbmNlLT5kbWFfY2hhbm5lbCk7CisJdG1wID0gZ2V0X2RtYV9yZXNpZHVlKGluc3RhbmNlLT5kbWFfY2hhbm5lbCk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJcmV0dXJuIHRtcDsKK30KKyNlbmRpZgkJCQkvKiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19hbHBoYV9fKSAqLworI2VuZGlmCQkJCS8qIGRlZmluZWQoUkVBTF9ETUEpICAqLworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkJCQkvKiBuZGVmIEFTTSAqLworI2VuZGlmCQkJCS8qIE5DUjUzODBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmMgYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzg2NjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzQzl4LmMKQEAgLTAsMCArMSwzNjQ5IEBACisvKiBOQ1I1M0M5eC5jOiAgR2VuZXJpYyBTQ1NJIGRyaXZlciBjb2RlIGZvciBOQ1I1M0M5eCBjaGlwcy4KKyAqCisgKiBPcmlnaW5hbGx5IGVzcC5jIDogRW5oYW5jZWRTY3NpUHJvY2Vzc29yIFN1biBTQ1NJIGRyaXZlciBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKgorICogTW9zdCBETUEgZGVwZW5kZW5jaWVzIHB1dCBpbiBkcml2ZXIgc3BlY2lmaWMgZmlsZXMgYnkgCisgKiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFNldCB1cCB0byB1c2UgZXNwX3JlYWQvZXNwX3dyaXRlIChwcmVwcm9jZXNzb3IgbWFjcm9zIGluIE5DUjUzYzl4LmgpIGJ5CisgKiBUeW1tIFR3aWxsbWFuICh0eW1tQGNvZS5taXNzb3VyaS5lZHUpCisgKi8KKworLyogVE9ETzoKKyAqCisgKiAxKSBNYXliZSBkaXNhYmxlIHBhcml0eSBjaGVja2luZyBpbiBjb25maWcgcmVnaXN0ZXIgb25lIGZvciBTQ1NJMQorICogICAgdGFyZ2V0cy4gIChHaWxtb3JlIHNheXMgcGFyaXR5IGVycm9yIG9uIHRoZSBTQnVzIGNhbiBsb2NrIHVwCisgKiAgICBvbGQgc3VuNGMncykKKyAqIDIpIEFkZCBzdXBwb3J0IGZvciBETUEyIHBpcGVsaW5pbmcuCisgKiAzKSBBZGQgdGFnZ2VkIHF1ZXVlaW5nLgorICogNCkgTWF5YmUgY2hhbmdlIHVzZSBvZiAiZXNwIiB0byBzb21ldGhpbmcgbW9yZSAiTkNSIidpc2guCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBDb21tYW5kIHBoYXNlIGVudW1lcmF0aW9uLiAqLworZW51bSB7CisJbm90X2lzc3VlZCAgICA9IDB4MDAsICAvKiBTdGlsbCBpbiB0aGUgaXNzdWVfU0MgcXVldWUuICAgICAgICAgICovCisKKwkvKiBWYXJpb3VzIGZvcm1zIG9mIHNlbGVjdGluZyBhIHRhcmdldC4gKi8KKyNkZWZpbmUgaW5fc2xjdF9tYXNrICAgIDB4MTAKKwlpbl9zbGN0X25vcm0gID0gMHgxMCwgIC8qIEVTUCBpcyBhcmJpdHJhdGluZywgbm9ybWFsIHNlbGVjdGlvbiAgKi8KKwlpbl9zbGN0X3N0b3AgID0gMHgxMSwgIC8qIEVTUCB3aWxsIHNlbGVjdCwgdGhlbiBzdG9wIHdpdGggSVJRICAgKi8KKwlpbl9zbGN0X21zZyAgID0gMHgxMiwgIC8qIHNlbGVjdCwgdGhlbiBzZW5kIGEgbWVzc2FnZSAgICAgICAgICAgKi8KKwlpbl9zbGN0X3RhZyAgID0gMHgxMywgIC8qIHNlbGVjdCBhbmQgc2VuZCB0YWdnZWQgcXVldWUgbXNnICAgICAgKi8KKwlpbl9zbGN0X3NuZWcgID0gMHgxNCwgIC8qIHNlbGVjdCBhbmQgYWNxdWlyZSBzeW5jIGNhcGFiaWxpdGllcyAgKi8KKworCS8qIEFueSBwb3N0IHNlbGVjdGlvbiBhY3Rpdml0eS4gKi8KKyNkZWZpbmUgaW5fcGhhc2VzX21hc2sgIDB4MjAKKwlpbl9kYXRhaW4gICAgID0gMHgyMCwgIC8qIERhdGEgaXMgdHJhbnNmZXJyaW5nIGZyb20gdGhlIGJ1cyAgICAgKi8KKwlpbl9kYXRhb3V0ICAgID0gMHgyMSwgIC8qIERhdGEgaXMgdHJhbnNmZXJyaW5nIHRvIHRoZSBidXMgICAgICAgKi8KKwlpbl9kYXRhX2RvbmUgID0gMHgyMiwgIC8qIExhc3QgRE1BIGRhdGEgb3BlcmF0aW9uIGRvbmUgKG1heWJlKSAgKi8KKwlpbl9tc2dpbiAgICAgID0gMHgyMywgIC8qIEVhdGluZyBtZXNzYWdlIGZyb20gdGFyZ2V0ICAgICAgICAgICAgKi8KKwlpbl9tc2dpbmNvbnQgID0gMHgyNCwgIC8qIEVhdGluZyBtb3JlIG1zZyBieXRlcyBmcm9tIHRhcmdldCAgICAgKi8KKwlpbl9tc2dpbmRvbmUgID0gMHgyNSwgIC8qIERlY2lkZSB3aGF0IHRvIGRvIHdpdGggd2hhdCB3ZSBnb3QgICAgKi8KKwlpbl9tc2dvdXQgICAgID0gMHgyNiwgIC8qIFNlbmRpbmcgbWVzc2FnZSB0byB0YXJnZXQgICAgICAgICAgICAgKi8KKwlpbl9tc2dvdXRkb25lID0gMHgyNywgIC8qIERvbmUgc2VuZGluZyBtc2cgb3V0ICAgICAgICAgICAgICAgICAgKi8KKwlpbl9jbWRiZWdpbiAgID0gMHgyOCwgIC8qIFNlbmRpbmcgY21kIGFmdGVyIGFibm9ybWFsIHNlbGVjdGlvbiAgKi8KKwlpbl9jbWRlbmQgICAgID0gMHgyOSwgIC8qIERvbmUgc2VuZGluZyBzbG93IGNtZCAgICAgICAgICAgICAgICAgKi8KKwlpbl9zdGF0dXMgICAgID0gMHgyYSwgIC8qIFdhcyBpbiBzdGF0dXMgcGhhc2UsIGZpbmlzaGluZyBjbWQgICAgKi8KKwlpbl9mcmVlaW5nICAgID0gMHgyYiwgIC8qIGZyZWVpbmcgdGhlIGJ1cyBmb3IgY21kIGNtcGx0IG9yIGRpc2MgKi8KKwlpbl90aGVfZGFyayAgID0gMHgyYywgIC8qIERvbid0IGtub3cgd2hhdCBidXMgcGhhc2Ugd2UgYXJlIGluICAgKi8KKworCS8qIFNwZWNpYWwgc3RhdGVzLCBpZS4gbm90IG5vcm1hbCBidXMgdHJhbnNpdGlvbnMuLi4gKi8KKyNkZWZpbmUgaW5fc3BlY19tYXNrICAgIDB4ODAKKwlpbl9hYm9ydG9uZSAgID0gMHg4MCwgIC8qIEFib3J0aW5nIG9uZSBjb21tYW5kIGN1cnJlbnRseSAgICAgICAgKi8KKwlpbl9hYm9ydGFsbCAgID0gMHg4MSwgIC8qIEJsb3dpbmcgYXdheSBhbGwgY29tbWFuZHMgd2UgaGF2ZSAgICAgKi8KKwlpbl9yZXNldGRldiAgID0gMHg4MiwgIC8qIFNDU0kgdGFyZ2V0IHJlc2V0IGluIHByb2dyZXNzICAgICAgICAgKi8KKwlpbl9yZXNldGJ1cyAgID0gMHg4MywgIC8qIFNDU0kgYnVzIHJlc2V0IGluIHByb2dyZXNzICAgICAgICAgICAgKi8KKwlpbl90Z3RlcnJvciAgID0gMHg4NCwgIC8qIFRhcmdldCBkaWQgc29tZXRoaW5nIHN0dXBpZCAgICAgICAgICAgKi8KK307CisKK2VudW0geworCS8qIFplcm8gaGFzIHNwZWNpYWwgbWVhbmluZywgc2VlIHNraXBhaGVhZFsxMl0uICovCisvKjAqLwlkb19uZXZlciwKKworLyoxKi8JZG9fcGhhc2VfZGV0ZXJtaW5lLAorLyoyKi8JZG9fcmVzZXRfYnVzLAorLyozKi8JZG9fcmVzZXRfY29tcGxldGUsCisvKjQqLwlkb193b3JrX2J1cywKKy8qNSovCWRvX2ludHJfZW5kCit9OworCisvKiBUaGUgbWFzdGVyIHJpbmcgb2YgYWxsIGVzcCBob3N0cyB3ZSBhcmUgbWFuYWdpbmcgaW4gdGhpcyBkcml2ZXIuICovCitzdHJ1Y3QgTkNSX0VTUCAqZXNwY2hhaW47CitpbnQgbmVzcHMgPSAwLCBlc3BzX2luX3VzZSA9IDAsIGVzcHNfcnVubmluZyA9IDA7CisKK2lycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKTsKKworLyogRGVidWdnaW5nIHJvdXRpbmVzICovCitzdGF0aWMgc3RydWN0IGVzcF9jbWRzdHJpbmdzIHsKKwl1bmNoYXIgY21kY2hhcjsKKwljaGFyICp0ZXh0OworfSBlc3BfY21kX3N0cmluZ3NbXSA9IHsKKwkvKiBNaXNjZWxsYW5lb3VzICovCisJeyBFU1BfQ01EX05VTEwsICJFU1BfTk9QIiwgfSwKKwl7IEVTUF9DTURfRkxVU0gsICJGSUZPX0ZMVVNIIiwgfSwKKwl7IEVTUF9DTURfUkMsICJSU1RFU1AiLCB9LAorCXsgRVNQX0NNRF9SUywgIlJTVFNDU0kiLCB9LAorCS8qIERpc2Nvbm5lY3RlZCBTdGF0ZSBHcm91cCAqLworCXsgRVNQX0NNRF9SU0VMLCAiUkVTTENUU0VRIiwgfSwKKwl7IEVTUF9DTURfU0VMLCAiU0xDVE5BVE4iLCB9LAorCXsgRVNQX0NNRF9TRUxBLCAiU0xDVEFUTiIsIH0sCisJeyBFU1BfQ01EX1NFTEFTLCAiU0xDVEFUTlNUT1AiLCB9LAorCXsgRVNQX0NNRF9FU0VMLCAiRU5TTENUUkVTRUwiLCB9LAorCXsgRVNQX0NNRF9EU0VMLCAiRElTU0VMUkVTRUwiLCB9LAorCXsgRVNQX0NNRF9TQTMsICJTTENUQVROMyIsIH0sCisJeyBFU1BfQ01EX1JTRUwzLCAiUkVTTENUU0VRIiwgfSwKKwkvKiBUYXJnZXQgU3RhdGUgR3JvdXAgKi8KKwl7IEVTUF9DTURfU01TRywgIlNORE1TRyIsIH0sCisJeyBFU1BfQ01EX1NTVEFULCAiU05EU1RBVFVTIiwgfSwKKwl7IEVTUF9DTURfU0RBVEEsICJTTkREQVRBIiwgfSwKKwl7IEVTUF9DTURfRFNFUSwgIkRJU0NTRVEiLCB9LAorCXsgRVNQX0NNRF9UU0VRLCAiVEVSTVNFUSIsIH0sCisJeyBFU1BfQ01EX1RDQ1NFUSwgIlRSR1RDTURDT01QU0VRIiwgfSwKKwl7IEVTUF9DTURfRENOQ1QsICJESVNDIiwgfSwKKwl7IEVTUF9DTURfUk1TRywgIlJDVk1TRyIsIH0sCisJeyBFU1BfQ01EX1JDTUQsICJSQ1ZDTUQiLCB9LAorCXsgRVNQX0NNRF9SREFUQSwgIlJDVkRBVEEiLCB9LAorCXsgRVNQX0NNRF9SQ1NFUSwgIlJDVkNNRFNFUSIsIH0sCisJLyogSW5pdGlhdG9yIFN0YXRlIEdyb3VwICovCisJeyBFU1BfQ01EX1RJLCAiVFJBTlNJTkZPIiwgfSwKKwl7IEVTUF9DTURfSUNDU0VRLCAiSU5JQ01EU0VRQ09NUCIsIH0sCisJeyBFU1BfQ01EX01PSywgIk1TR0FDQ0VQVEVEIiwgfSwKKwl7IEVTUF9DTURfVFBBRCwgIlRQQUQiLCB9LAorCXsgRVNQX0NNRF9TQVROLCAiU0FUTiIsIH0sCisJeyBFU1BfQ01EX1JBVE4sICJSQVROIiwgfSwKK307CisjZGVmaW5lIE5VTV9FU1BfQ09NTUFORFMgICgoc2l6ZW9mKGVzcF9jbWRfc3RyaW5ncykpIC8gKHNpemVvZihzdHJ1Y3QgZXNwX2NtZHN0cmluZ3MpKSkKKworLyogUHJpbnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhbiBFU1AgY29tbWFuZCAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9jbWQodW5jaGFyIGVzcGNtZCkKK3sKKwl1bmNoYXIgZG1hX2JpdCA9IGVzcGNtZCAmIEVTUF9DTURfRE1BOworCWludCBpOworCisJZXNwY21kICY9IH5kbWFfYml0OworCWZvcihpPTA7IGk8TlVNX0VTUF9DT01NQU5EUzsgaSsrKQorCQlpZihlc3BfY21kX3N0cmluZ3NbaV0uY21kY2hhciA9PSBlc3BjbWQpCisJCQlicmVhazsKKwlpZihpPT1OVU1fRVNQX0NPTU1BTkRTKQorCQlwcmludGsoIkVTUF9Vbmtub3duIik7CisJZWxzZQorCQlwcmludGsoIiVzJXMiLCBlc3BfY21kX3N0cmluZ3NbaV0udGV4dCwKKwkJICAgICAgICgoZG1hX2JpdCkgPyAiK0RNQSIgOiAiIikpOworfQorCisvKiBQcmludCB0aGUgc3RhdHVzIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfc3RhdHJlZyh1bmNoYXIgc3RhdHJlZykKK3sKKwl1bmNoYXIgcGhhc2U7CisKKwlwcmludGsoIlNUQVRVUzwiKTsKKwlwaGFzZSA9IHN0YXRyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKwlwcmludGsoIiVzLCIsIChwaGFzZSA9PSBFU1BfRE9QID8gIkRBVEEtT1VUIiA6CisJCSAgICAgICAocGhhc2UgPT0gRVNQX0RJUCA/ICJEQVRBLUlOIiA6CisJCQkocGhhc2UgPT0gRVNQX0NNRFAgPyAiQ09NTUFORCIgOgorCQkJIChwaGFzZSA9PSBFU1BfU1RBVFAgPyAiU1RBVFVTIiA6CisJCQkgIChwaGFzZSA9PSBFU1BfTU9QID8gIk1TRy1PVVQiIDoKKwkJCSAgIChwaGFzZSA9PSBFU1BfTUlQID8gIk1TR19JTiIgOgorCQkJICAgICJ1bmtub3duIikpKSkpKSk7CisJaWYoc3RhdHJlZyAmIEVTUF9TVEFUX1RET05FKQorCQlwcmludGsoIlRSQU5TX0RPTkUsIik7CisJaWYoc3RhdHJlZyAmIEVTUF9TVEFUX1RDTlQpCisJCXByaW50aygiVENPVU5UX1pFUk8sIik7CisJaWYoc3RhdHJlZyAmIEVTUF9TVEFUX1BFUlIpCisJCXByaW50aygiUF9FUlJPUiwiKTsKKwlpZihzdGF0cmVnICYgRVNQX1NUQVRfU1BBTSkKKwkJcHJpbnRrKCJTUEFNLCIpOworCWlmKHN0YXRyZWcgJiBFU1BfU1RBVF9JTlRSKQorCQlwcmludGsoIklSUSwiKTsKKwlwcmludGsoIj4iKTsKK30KKworLyogUHJpbnQgdGhlIGludGVycnVwdCByZWdpc3RlcidzIHZhbHVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X2lyZWcodW5jaGFyIGludHJlZykKK3sKKwlwcmludGsoIklOVFJFRzwgIik7CisJaWYoaW50cmVnICYgRVNQX0lOVFJfUykKKwkJcHJpbnRrKCJTTENUX05BVE4gIik7CisJaWYoaW50cmVnICYgRVNQX0lOVFJfU0FUTikKKwkJcHJpbnRrKCJTTENUX0FUTiAiKTsKKwlpZihpbnRyZWcgJiBFU1BfSU5UUl9SU0VMKQorCQlwcmludGsoIlJTTENUICIpOworCWlmKGludHJlZyAmIEVTUF9JTlRSX0ZET05FKQorCQlwcmludGsoIkZET05FICIpOworCWlmKGludHJlZyAmIEVTUF9JTlRSX0JTRVJWKQorCQlwcmludGsoIkJTRVJWICIpOworCWlmKGludHJlZyAmIEVTUF9JTlRSX0RDKQorCQlwcmludGsoIkRJU0NOQ1QgIik7CisJaWYoaW50cmVnICYgRVNQX0lOVFJfSUMpCisJCXByaW50aygiSUxMX0NNRCAiKTsKKwlpZihpbnRyZWcgJiBFU1BfSU5UUl9TUikKKwkJcHJpbnRrKCJTQ1NJX0JVU19SRVNFVCAiKTsKKwlwcmludGsoIj4iKTsKK30KKworLyogUHJpbnQgdGhlIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXJzIGNvbnRlbnRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X3NlcXJlZyh1bmNoYXIgc3RlcHJlZykKK3sKKwlzdGVwcmVnICY9IEVTUF9TVEVQX1ZCSVRTOworCXByaW50aygiU1RFUDwlcz4iLAorCSAgICAgICAoc3RlcHJlZyA9PSBFU1BfU1RFUF9BU0VMID8gIlNMQ1RfQVJCX0NNUExUIiA6CisJCShzdGVwcmVnID09IEVTUF9TVEVQX1NJRCA/ICIxQllURV9NU0dfU0VOVCIgOgorCQkgKHN0ZXByZWcgPT0gRVNQX1NURVBfTkNNRCA/ICJOT1RfSU5fQ01EX1BIQVNFIiA6CisJCSAgKHN0ZXByZWcgPT0gRVNQX1NURVBfUFBDID8gIkNNRF9CWVRFU19MT1NUIiA6CisJCSAgIChzdGVwcmVnID09IEVTUF9TVEVQX0ZJTkk0ID8gIkNNRF9TRU5UX09LIiA6CisJCSAgICAiVU5LTk9XTiIpKSkpKSk7Cit9CisKK3N0YXRpYyBjaGFyICpwaGFzZV9zdHJpbmcoaW50IHBoYXNlKQoreworCXN3aXRjaChwaGFzZSkgeworCWNhc2Ugbm90X2lzc3VlZDoKKwkJcmV0dXJuICJVTklTU1VFRCI7CisJY2FzZSBpbl9zbGN0X25vcm06CisJCXJldHVybiAiU0xDVE5PUk0iOworCWNhc2UgaW5fc2xjdF9zdG9wOgorCQlyZXR1cm4gIlNMQ1RTVE9QIjsKKwljYXNlIGluX3NsY3RfbXNnOgorCQlyZXR1cm4gIlNMQ1RNU0ciOworCWNhc2UgaW5fc2xjdF90YWc6CisJCXJldHVybiAiU0xDVFRBRyI7CisJY2FzZSBpbl9zbGN0X3NuZWc6CisJCXJldHVybiAiU0xDVFNORUciOworCWNhc2UgaW5fZGF0YWluOgorCQlyZXR1cm4gIkRBVEFJTiI7CisJY2FzZSBpbl9kYXRhb3V0OgorCQlyZXR1cm4gIkRBVEFPVVQiOworCWNhc2UgaW5fZGF0YV9kb25lOgorCQlyZXR1cm4gIkRBVEFET05FIjsKKwljYXNlIGluX21zZ2luOgorCQlyZXR1cm4gIk1TR0lOIjsKKwljYXNlIGluX21zZ2luY29udDoKKwkJcmV0dXJuICJNU0dJTkNPTlQiOworCWNhc2UgaW5fbXNnaW5kb25lOgorCQlyZXR1cm4gIk1TR0lORE9ORSI7CisJY2FzZSBpbl9tc2dvdXQ6CisJCXJldHVybiAiTVNHT1VUIjsKKwljYXNlIGluX21zZ291dGRvbmU6CisJCXJldHVybiAiTVNHT1VURE9ORSI7CisJY2FzZSBpbl9jbWRiZWdpbjoKKwkJcmV0dXJuICJDTURCRUdJTiI7CisJY2FzZSBpbl9jbWRlbmQ6CisJCXJldHVybiAiQ01ERU5EIjsKKwljYXNlIGluX3N0YXR1czoKKwkJcmV0dXJuICJTVEFUVVMiOworCWNhc2UgaW5fZnJlZWluZzoKKwkJcmV0dXJuICJGUkVFSU5HIjsKKwljYXNlIGluX3RoZV9kYXJrOgorCQlyZXR1cm4gIkNMVUVMRVNTIjsKKwljYXNlIGluX2Fib3J0b25lOgorCQlyZXR1cm4gIkFCT1JUT05FIjsKKwljYXNlIGluX2Fib3J0YWxsOgorCQlyZXR1cm4gIkFCT1JUQUxMIjsKKwljYXNlIGluX3Jlc2V0ZGV2OgorCQlyZXR1cm4gIlJFU0VUREVWIjsKKwljYXNlIGluX3Jlc2V0YnVzOgorCQlyZXR1cm4gIlJFU0VUQlVTIjsKKwljYXNlIGluX3RndGVycm9yOgorCQlyZXR1cm4gIlRHVEVSUk9SIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX07Cit9CisKKyNpZmRlZiBERUJVR19TVEFURV9NQUNISU5FCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2FkdmFuY2VfcGhhc2UoU2NzaV9DbW5kICpzLCBpbnQgbmV3cGhhc2UpCit7CisJRVNQTE9HKCgiPCVzPiIsIHBoYXNlX3N0cmluZyhuZXdwaGFzZSkpKTsKKwlzLT5TQ3Auc2VudF9jb21tYW5kID0gcy0+U0NwLnBoYXNlOworCXMtPlNDcC5waGFzZSA9IG5ld3BoYXNlOworfQorI2Vsc2UKKyNkZWZpbmUgZXNwX2FkdmFuY2VfcGhhc2UoX19zLCBfX25ld3BoYXNlKSBcCisJKF9fcyktPlNDcC5zZW50X2NvbW1hbmQgPSAoX19zKS0+U0NwLnBoYXNlOyBcCisJKF9fcyktPlNDcC5waGFzZSA9IChfX25ld3BoYXNlKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfRVNQX0NNRFMKK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY21kKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICB1bmNoYXIgY21kKQoreworCWVzcC0+ZXNwY21kbG9nW2VzcC0+ZXNwY21kZW50XSA9IGNtZDsKKwllc3AtPmVzcGNtZGVudCA9IChlc3AtPmVzcGNtZGVudCArIDEpICYgMzE7CisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY21uZCwgY21kKTsKK30KKyNlbHNlCisjZGVmaW5lIGVzcF9jbWQoX19lc3AsIF9fZXJlZ3MsIF9fY21kKQllc3Bfd3JpdGUoKF9fZXJlZ3MpLT5lc3BfY21uZCwgKF9fY21kKSkKKyNlbmRpZgorCisvKiBIb3cgd2UgdXNlIHRoZSB2YXJpb3VzIExpbnV4IFNDU0kgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvcGVyYXRpb24uCisgKgorICogc3RydWN0IHNjc2lfY21uZDoKKyAqCisgKiAgIFdlIGtlZXAgdHJhY2sgb2YgdGhlIHN5bmNyb25vdXMgY2FwYWJpbGl0aWVzIG9mIGEgdGFyZ2V0CisgKiAgIGluIHRoZSBkZXZpY2UgbWVtYmVyLCB1c2luZyBzeW5jX21pbl9wZXJpb2QgYW5kCisgKiAgIHN5bmNfbWF4X29mZnNldC4gIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHdlIGRpcmVjdGx5IHdyaXRlCisgKiAgIGludG8gdGhlIEVTUCByZWdpc3RlcnMgd2hpbGUgcnVubmluZyBhIGNvbW1hbmQuICBJZiBvZmZzZXQKKyAqICAgaXMgemVybyB0aGUgRVNQIHdpbGwgdXNlIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCisgKiAgIElmIHRoZSBib3JrZW4gZmxhZyBpcyBzZXQgd2UgYXNzdW1lIHdlIHNob3VsZG4ndCBldmVuIGJvdGhlcgorICogICB0cnlpbmcgdG8gbmVnb3RpYXRlIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlciBhcyB0aGlzIHRhcmdldAorICogICBpcyByZWFsbHkgc3R1cGlkLiAgSWYgd2Ugbm90aWNlIHRoZSB0YXJnZXQgaXMgZHJvcHBpbmcgdGhlCisgKiAgIGJ1cywgYW5kIHdlIGhhdmUgYmVlbiBhbGxvd2luZyBpdCB0byBkaXNjb25uZWN0LCB3ZSBjbGVhcgorICogICB0aGUgZGlzY29ubmVjdCBmbGFnLgorICovCisKKy8qIE1hbmlwdWxhdGlvbiBvZiB0aGUgRVNQIGNvbW1hbmQgcXVldWVzLiAgVGhhbmtzIHRvIHRoZSBhaGExNTJ4IGRyaXZlcgorICogYW5kIGl0cyBhdXRob3IsIEp1ZXJnZW4gRS4gRmlzY2hlciwgZm9yIHRoZSBtZXRob2RzIHVzZWQgaGVyZS4KKyAqIE5vdGUgdGhhdCB0aGVzZSBhcmUgcGVyLUVTUCBxdWV1ZXMsIG5vdCBnbG9iYWwgcXVldWVzIGxpa2UKKyAqIHRoZSBhaGExNTJ4IGRyaXZlciB1c2VzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKK3sKKwlTY3NpX0NtbmQgKmVuZDsKKworCW5ld19TQy0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIE5VTEw7CisJaWYoISpTQykKKwkJKlNDID0gbmV3X1NDOworCWVsc2UgeworCQlmb3IoZW5kPSpTQztlbmQtPmhvc3Rfc2NyaWJibGU7ZW5kPShTY3NpX0NtbmQgKillbmQtPmhvc3Rfc2NyaWJibGUpCisJCQk7CisJCWVuZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIG5ld19TQzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKK3sKKwluZXdfU0MtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSAqU0M7CisJKlNDID0gbmV3X1NDOworfQorCitzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX2ZpcnN0X1NDKFNjc2lfQ21uZCAqKlNDKQoreworCVNjc2lfQ21uZCAqcHRyOworCisJcHRyID0gKlNDOworCWlmKHB0cikKKwkJKlNDID0gKFNjc2lfQ21uZCAqKSAoKlNDKS0+aG9zdF9zY3JpYmJsZTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX1NDKFNjc2lfQ21uZCAqKlNDLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKQoreworCVNjc2lfQ21uZCAqcHRyLCAqcHJldjsKKworCWZvcihwdHIgPSAqU0MsIHByZXYgPSBOVUxMOworCSAgICBwdHIgJiYgKChwdHItPmRldmljZS0+aWQgIT0gdGFyZ2V0KSB8fCAocHRyLT5kZXZpY2UtPmx1biAhPSBsdW4pKTsKKwkgICAgcHJldiA9IHB0ciwgcHRyID0gKFNjc2lfQ21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCTsKKwlpZihwdHIpIHsKKwkJaWYocHJldikKKwkJCXByZXYtPmhvc3Rfc2NyaWJibGU9cHRyLT5ob3N0X3NjcmliYmxlOworCQllbHNlCisJCQkqU0M9KFNjc2lfQ21uZCAqKXB0ci0+aG9zdF9zY3JpYmJsZTsKKwl9CisJcmV0dXJuIHB0cjsKK30KKworLyogUmVzZXR0aW5nIHZhcmlvdXMgcGllY2VzIG9mIHRoZSBFU1Agc2NzaSBkcml2ZXIgY2hpcHNldCAqLworCisvKiBSZXNldCB0aGUgRVNQIGNoaXAsIF9ub3RfIHRoZSBTQ1NJIGJ1cy4gKi8KK3N0YXRpYyB2b2lkIGVzcF9yZXNldF9lc3Aoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlpbnQgZmFtaWx5X2NvZGUsIHZlcnNpb24sIGk7CisJdm9sYXRpbGUgaW50IHRyYXNoOworCisJLyogTm93IHJlc2V0IHRoZSBFU1AgY2hpcCAqLworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9SQyk7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwgfCBFU1BfQ01EX0RNQSk7CisJaWYoZXNwLT5lcmV2ID09IGZhc3QpCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzIsIEVTUF9DT05GSUcyX0ZFTkFCKTsKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCB8IEVTUF9DTURfRE1BKTsKKworCS8qIFRoaXMgaXMgdGhlIG9ubHkgcG9pbnQgYXQgd2hpY2ggaXQgaXMgcmVsaWFibGUgdG8gcmVhZAorCSAqIHRoZSBJRC1jb2RlIGZvciBhIGZhc3QgRVNQIGNoaXAgdmFyaWFudC4KKwkgKi8KKwllc3AtPm1heF9wZXJpb2QgPSAoKDM1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJaWYoZXNwLT5lcmV2ID09IGZhc3QpIHsKKwkJY2hhciAqZXJldjJzdHJpbmdbXSA9IHsKKwkJCSJFbXVsZXggRkFTMjM2IiwKKwkJCSJFbXVsZXggRlBFU1AxMDBBIiwKKwkJCSJmYXN0IiwKKwkJCSJRTG9naWMgRkFTMzY2IiwKKwkJCSJFbXVsZXggRkFTMjE2IiwKKwkJCSJTeW1iaW9zIExvZ2ljIDUzQ0Y5eC0yIiwKKwkJCSJ1bmtub3duISIKKwkJfTsKKwkJCQorCQl2ZXJzaW9uID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF91aWQpOworCQlmYW1pbHlfY29kZSA9ICh2ZXJzaW9uICYgMHhmOCkgPj4gMzsKKwkJaWYoZmFtaWx5X2NvZGUgPT0gMHgwMikgeworCQkgICAgICAgIGlmICgodmVyc2lvbiAmIDcpID09IDIpCisJCQkgICAgICAgIGVzcC0+ZXJldiA9IGZhczIxNjsJCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkgICAgICAgIGVzcC0+ZXJldiA9IGZhczIzNjsKKwkJfSBlbHNlIGlmKGZhbWlseV9jb2RlID09IDB4MGEpCisJCQllc3AtPmVyZXYgPSBmYXMzNjY7IC8qIFZlcnNpb24gaXMgdXN1YWxseSAnNScuICovCisJCWVsc2UgaWYoZmFtaWx5X2NvZGUgPT0gMHgwMCkgeworCQkJaWYgKCh2ZXJzaW9uICYgNykgPT0gMikKKwkJCQllc3AtPmVyZXYgPSBmYXMxMDBhOyAvKiBOQ1I1M0M5WCAqLworCQkJZWxzZQorCQkJCWVzcC0+ZXJldiA9IGVzcHVua25vd247CisJCX0gZWxzZSBpZihmYW1pbHlfY29kZSA9PSAweDE0KSB7CisJCQlpZiAoKHZlcnNpb24gJiA3KSA9PSAyKQorCQkJCWVzcC0+ZXJldiA9IGZzYzsKKwkJICAgICAgICBlbHNlCisJCQkJZXNwLT5lcmV2ID0gZXNwdW5rbm93bjsKKwkJfSBlbHNlIGlmKGZhbWlseV9jb2RlID09IDB4MDApIHsKKwkJCWlmICgodmVyc2lvbiAmIDcpID09IDIpCisJCQkJZXNwLT5lcmV2ID0gZmFzMTAwYTsgLyogTkNSNTNDOVggKi8KKwkJCWVsc2UKKwkJCQllc3AtPmVyZXYgPSBlc3B1bmtub3duOworCQl9IGVsc2UKKwkJCWVzcC0+ZXJldiA9IGVzcHVua25vd247CisJCUVTUExPRygoImVzcCVkOiBGQVNUIGNoaXAgaXMgJXMgKGZhbWlseT0lZCwgdmVyc2lvbj0lZClcbiIsCisJCQllc3AtPmVzcF9pZCwgZXJldjJzdHJpbmdbZXNwLT5lcmV2IC0gZmFzMjM2XSwKKwkJCWZhbWlseV9jb2RlLCAodmVyc2lvbiAmIDcpKSk7CisKKwkJZXNwLT5taW5fcGVyaW9kID0gKCg0ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJfSBlbHNlIHsKKwkJZXNwLT5taW5fcGVyaW9kID0gKCg1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJfQorCisJLyogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmYWN0LCBlc3AtPmNmYWN0KTsKKwllc3AtPnByZXZfc3RwID0gMDsKKwllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIDApOworCWVzcC0+cHJldl9zb2ZmID0gMDsKKwllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zb2ZmLCAwKTsKKwllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90aW1lbywgZXNwLT5uZWdfZGVmcCk7CisJZXNwLT5tYXhfcGVyaW9kID0gKGVzcC0+bWF4X3BlcmlvZCArIDMpPj4yOworCWVzcC0+bWluX3BlcmlvZCA9IChlc3AtPm1pbl9wZXJpb2QgKyAzKT4+MjsKKworCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIGVzcC0+Y29uZmlnMSk7CisJc3dpdGNoKGVzcC0+ZXJldikgeworCWNhc2UgZXNwMTAwOgorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCWNhc2UgZXNwMTAwYToKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKKwkJYnJlYWs7CisJY2FzZSBlc3AyMzY6CisJCS8qIFNsb3cgMjM2ICovCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzIsIGVzcC0+Y29uZmlnMik7CisJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7CisJCWJyZWFrOworCWNhc2UgZmFzMzY2OgorCQlwYW5pYygiZXNwOiBGQVMzNjYgc3VwcG9ydCBub3QgcHJlc2VudCwgcGxlYXNlIG5vdGlmeSAiCisJCSAgICAgICJqb25na0Bjcy51dHdlbnRlLm5sIik7CisJCWJyZWFrOworCWNhc2UgZmFzMjE2OgorCWNhc2UgZmFzMjM2OgorCWNhc2UgZnNjOgorCQkvKiBGYXN0IEVTUCB2YXJpYW50cyAqLworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCBlc3AtPmNvbmZpZzIpOworCQlmb3IoaT0wOyBpPDg7IGkrKykKKwkJCWVzcC0+Y29uZmlnM1tpXSB8PSBFU1BfQ09ORklHM19GQ0xLOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgZXNwLT5wcmV2X2NmZzMpOworCQlpZihlc3AtPmRpZmYpCisJCQllc3AtPnJhZGVsYXkgPSAwOworCQllbHNlCisJCQllc3AtPnJhZGVsYXkgPSAxNjsKKwkJLyogRGlmZmVyZW50IHRpbWVvdXQgY29uc3RhbnQgZm9yIHRoZXNlIGNoaXBzICovCisJCWVzcC0+bmVnX2RlZnAgPQorCQkJRlNDX05FR19ERUZQKGVzcC0+Y2ZyZXEsCisJCQkJICAgICAoZXNwLT5jZmFjdCA9PSBFU1BfQ0NGX0YwID8KKwkJCQkgICAgICBFU1BfQ0NGX0Y3ICsgMSA6IGVzcC0+Y2ZhY3QpKTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfdGltZW8sIGVzcC0+bmVnX2RlZnApOworCQkvKiBFbmFibGUgQWN0aXZlIE5lZ290aWF0aW9uIGlmIHBvc3NpYmxlICovCisJCWlmKChlc3AtPmVyZXYgPT0gZnNjKSAmJiAhZXNwLT5kaWZmKQorCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnNCwgRVNQX0NPTkZJRzRfRUFOKTsKKwkJYnJlYWs7CisJY2FzZSBmYXMxMDBhOgorCQkvKiBGYXN0IDEwMGEgKi8KKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKKwkJZm9yKGk9MDsgaTw4OyBpKyspCisJCQllc3AtPmNvbmZpZzNbaV0gfD0gRVNQX0NPTkZJRzNfRkNMT0NLOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgZXNwLT5wcmV2X2NmZzMpOworCQllc3AtPnJhZGVsYXkgPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImVzcDogd2hhdCBjb3VsZCBpdCBiZS4uLiBJIHdvbmRlci4uLiIpOworCQlicmVhazsKKwl9OworCisJLyogRWF0IGFueSBiaXRyb3QgaW4gdGhlIGNoaXAgKi8KKwl0cmFzaCA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKKwl1ZGVsYXkoMTAwKTsKK30KKworLyogVGhpcyBwbGFjZXMgdGhlIEVTUCBpbnRvIGEga25vd24gc3RhdGUgYXQgYm9vdCB0aW1lLiAqLwordm9pZCBlc3BfYm9vdHVwX3Jlc2V0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJdm9sYXRpbGUgdW5jaGFyIHRyYXNoOworCisJLyogUmVzZXQgdGhlIERNQSAqLworCWlmKGVzcC0+ZG1hX3Jlc2V0KQorCQllc3AtPmRtYV9yZXNldChlc3ApOworCisJLyogUmVzZXQgdGhlIEVTUCAqLworCWVzcF9yZXNldF9lc3AoZXNwLCBlcmVncyk7CisKKwkvKiBSZXNldCB0aGUgU0NTSSBidXMsIGJ1dCB0ZWxsIEVTUCBub3QgdG8gZ2VuZXJhdGUgYW4gaXJxICovCisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMSkgfCBFU1BfQ09ORklHMV9TUlJESVNBQikpOworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9SUyk7CisJdWRlbGF5KDQwMCk7CisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgZXNwLT5jb25maWcxKTsKKworCS8qIEVhdCBhbnkgYml0cm90IGluIHRoZSBjaGlwIGFuZCB3ZSBhcmUgZG9uZS4uLiAqLworCXRyYXNoID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworfQorCisvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBiYXNpYyBkYXRhIHN1Y2ggYXMgU0NTSSBjaGlwIGZyZXF1ZW5jeQorICogZGF0YSBhbmQgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UKKyAqLworc3RydWN0IE5DUl9FU1AqIGVzcF9hbGxvY2F0ZShTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQsIHZvaWQgKmVzcF9kZXYpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcCwgKmVsaW5rOworCXN0cnVjdCBTY3NpX0hvc3QgKmVzcF9ob3N0OworCisJZXNwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSX0VTUCkpOworCWlmKCFlc3BfaG9zdCkKKwkJcGFuaWMoIkNhbm5vdCByZWdpc3RlciBFU1AgU0NTSSBob3N0Iik7CisJZXNwID0gKHN0cnVjdCBOQ1JfRVNQICopIGVzcF9ob3N0LT5ob3N0ZGF0YTsKKwlpZighZXNwKQorCQlwYW5pYygiTm8gZXNwIGluIGhvc3RkYXRhIik7CisJZXNwLT5laG9zdCA9IGVzcF9ob3N0OworCWVzcC0+ZWRldiA9IGVzcF9kZXY7CisJZXNwLT5lc3BfaWQgPSBuZXNwcysrOworCisJLyogU2V0IGJpdHNoaWZ0IHZhbHVlIChvbmx5IHVzZWQgb24gQW1pZ2Egd2l0aCBtdWx0aXBsZSBFU1BzKSAqLworCWVzcC0+c2hpZnQgPSAyOworCisJLyogUHV0IGludG8gdGhlIGNoYWluIG9mIGVzcCBjaGlwcyBkZXRlY3RlZCAqLworCWlmKGVzcGNoYWluKSB7CisJCWVsaW5rID0gZXNwY2hhaW47CisJCXdoaWxlKGVsaW5rLT5uZXh0KSBlbGluayA9IGVsaW5rLT5uZXh0OworCQllbGluay0+bmV4dCA9IGVzcDsKKwl9IGVsc2UgeworCQllc3BjaGFpbiA9IGVzcDsKKwl9CisJZXNwLT5uZXh0ID0gTlVMTDsKKworCXJldHVybiBlc3A7Cit9CisKK3ZvaWQgZXNwX2RlYWxsb2NhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZWxpbms7CisKKwlpZihlc3BjaGFpbiA9PSBlc3ApIHsKKwkJZXNwY2hhaW4gPSBOVUxMOworCX0gZWxzZSB7CisJCWZvcihlbGluayA9IGVzcGNoYWluOyBlbGluayAmJiAoZWxpbmstPm5leHQgIT0gZXNwKTsgZWxpbmsgPSBlbGluay0+bmV4dCk7CisJCWlmKGVsaW5rKSAKKwkJCWVsaW5rLT5uZXh0ID0gZXNwLT5uZXh0OworCX0KKwluZXNwcy0tOworfQorCisvKiBDb21wbGV0ZSBpbml0aWFsaXphdGlvbiBvZiBFU1Agc3RydWN0dXJlIGFuZCBkZXZpY2UKKyAqIENhbGxlciBtdXN0IGhhdmUgaW5pdGlhbGl6ZWQgYXBwcm9wcmlhdGUgcGFydHMgb2YgdGhlIEVTUCBzdHJ1Y3R1cmUKKyAqIGJldHdlZW4gdGhlIGNhbGwgdG8gZXNwX2FsbG9jYXRlIGFuZCB0aGlzIGZ1bmN0aW9uLgorICovCit2b2lkIGVzcF9pbml0aWFsaXplKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IEVTUF9yZWdzICplcmVncyA9IGVzcC0+ZXJlZ3M7CisJdW5zaWduZWQgaW50IGZtaHo7CisJdW5jaGFyIGNjZjsKKwlpbnQgaTsKKwkKKwkvKiBDaGVjayBvdXQgdGhlIGNsb2NrIHByb3BlcnRpZXMgb2YgdGhlIGNoaXAuICovCisKKwkvKiBUaGlzIGlzIGdldHRpbmcgbWVzc3kgYnV0IGl0IGhhcyB0byBiZSBkb25lCisJICogY29ycmVjdGx5IG9yIGVsc2UgeW91IGdldCB3ZWlyZCBiZWhhdmlvciBhbGwKKwkgKiBvdmVyIHRoZSBwbGFjZS4gIFdlIGFyZSB0cnlpbmcgdG8gYmFzaWNhbGx5CisJICogZmlndXJlIG91dCB0aHJlZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24uCisJICoKKwkgKiBhKSBDbG9jayBDb252ZXJzaW9uIEZhY3RvcgorCSAqCisJICogICAgVGhpcyBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dAorCSAqICAgIGNyeXN0YWwgY2xvY2sgZnJlcXVlbmN5IGdvaW5nIGludG8gdGhlCisJICogICAgRVNQIG9uIHRoaXMgbWFjaGluZS4gIEFueSBvcGVyYXRpb24gd2hvc2UKKwkgKiAgICB0aW1pbmcgaXMgbG9uZ2VyIHRoYW4gNDAwbnMgZGVwZW5kcyBvbiB0aGlzCisJICogICAgdmFsdWUgYmVpbmcgY29ycmVjdC4gIEZvciBleGFtcGxlLCB5b3UnbGwKKwkgKiAgICBnZXQgYmxpcHMgZm9yIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBkdXJpbmcKKwkgKiAgICBoaWdoIGxvYWQgb3Igd2l0aCBtdWx0aXBsZSB0YXJnZXRzIGlmIHRoaXMKKwkgKiAgICBpcyBub3Qgc2V0IGNvcnJlY3RseS4KKwkgKgorCSAqIGIpIFNlbGVjdGlvbiBUaW1lLU91dAorCSAqCisJICogICAgVGhlIEVTUCBpc24ndCB2ZXJ5IGJyaWdodCBhbmQgd2lsbCBhcmJpdHJhdGUKKwkgKiAgICBmb3IgdGhlIGJ1cyBhbmQgdHJ5IHRvIHNlbGVjdCBhIHRhcmdldAorCSAqICAgIGZvcmV2ZXIgaWYgeW91IGxldCBpdC4gIFRoaXMgdmFsdWUgdGVsbHMKKwkgKiAgICB0aGUgRVNQIHdoZW4gaXQgaGFzIHRha2VuIHRvbyBsb25nIHRvCisJICogICAgbmVnb3RpYXRlIGFuZCB0aGF0IGl0IHNob3VsZCBpbnRlcnJ1cHQKKwkgKiAgICB0aGUgQ1BVIHNvIHdlIGNhbiBzZWUgd2hhdCBoYXBwZW5lZC4KKwkgKiAgICBUaGUgdmFsdWUgaXMgY29tcHV0ZWQgYXMgZm9sbG93cyAoZnJvbQorCSAqICAgIE5DUi9TeW1iaW9zIGNoaXAgZG9jcykuCisJICoKKwkgKiAgICAgICAgICAoVGltZSBPdXQgUGVyaW9kKSAqICAoSW5wdXQgQ2xvY2spCisJICogICAgU1RPID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICAgICAgICAgICg4MTkyKSAqIChDbG9jayBDb252ZXJzaW9uIEZhY3RvcikKKwkgKgorCSAqICAgIFlvdSB1c3VhbGx5IHdhbnQgdGhlIHRpbWUgb3V0IHBlcmlvZCB0byBiZQorCSAqICAgIGFyb3VuZCAyNTBtcywgSSB0aGluayB3ZSdsbCBzZXQgaXQgYSBsaXR0bGUKKwkgKiAgICBiaXQgaGlnaGVyIHRvIGFjY291bnQgZm9yIGZ1bGx5IGxvYWRlZCBTQ1NJCisJICogICAgYnVzJ3MgYW5kIHNsb3cgZGV2aWNlcyB0aGF0IGRvbid0IHJlc3BvbmQgc28KKwkgKiAgICBxdWlja2x5IHRvIHNlbGVjdGlvbiBhdHRlbXB0cy4gKHllYWgsIEkga25vdworCSAqICAgIHRoaXMgaXMgb3V0IG9mIHNwZWMuIGJ1dCB0aGVyZSBpcyBhIGxvdCBvZgorCSAqICAgIGJ1Z2d5IHBpZWNlcyBvZiBmaXJtd2FyZSBvdXQgdGhlcmUgc28gYml0ZSBtZSkKKwkgKgorCSAqIGMpIEltcGVyaWNhbCBjb25zdGFudHMgZm9yIHN5bmNocm9ub3VzIG9mZnNldAorCSAqICAgIGFuZCB0cmFuc2ZlciBwZXJpb2QgcmVnaXN0ZXIgdmFsdWVzCisJICoKKwkgKiAgICBUaGlzIGVudGFpbHMgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IHN5bmMKKwkgKiAgICBwZXJpb2Qgd2UgY291bGQgZXZlciBoYW5kbGUgb24gdGhpcyBFU1AuCisJICovCisJCisJZm1oeiA9IGVzcC0+Y2ZyZXE7CisKKwlpZihmbWh6IDw9ICg1MDAwMDAwKSkKKwkJY2NmID0gMDsKKwllbHNlCisJCWNjZiA9ICgoKDUwMDAwMDAgLSAxKSArIChmbWh6KSkvKDUwMDAwMDApKTsKKwlpZighY2NmIHx8IGNjZiA+IDgpIHsKKwkJLyogSWYgd2UgY2FuJ3QgZmluZCBhbnl0aGluZyByZWFzb25hYmxlLAorCQkgKiBqdXN0IGFzc3VtZSAyME1IWi4gIFRoaXMgaXMgdGhlIGNsb2NrCisJCSAqIGZyZXF1ZW5jeSBvZiB0aGUgb2xkZXIgc3VuNGMncyB3aGVyZSBJJ3ZlCisJCSAqIGJlZW4gdW5hYmxlIHRvIGZpbmQgdGhlIGNsb2NrLWZyZXF1ZW5jeQorCQkgKiBQUk9NIHByb3BlcnR5LiAgQWxsIG90aGVyIG1hY2hpbmVzIHByb3ZpZGUKKwkJICogdXNlZnVsIHZhbHVlcyBpdCBzZWVtcy4KKwkJICovCisJCWNjZiA9IEVTUF9DQ0ZfRjQ7CisJCWZtaHogPSAoMjAwMDAwMDApOworCX0KKwlpZihjY2Y9PShFU1BfQ0NGX0Y3KzEpKQorCQllc3AtPmNmYWN0ID0gRVNQX0NDRl9GMDsKKwllbHNlIGlmKGNjZiA9PSBFU1BfQ0NGX05FVkVSKQorCQllc3AtPmNmYWN0ID0gRVNQX0NDRl9GMjsKKwllbHNlCisJCWVzcC0+Y2ZhY3QgPSBjY2Y7CisJZXNwLT5jZnJlcSA9IGZtaHo7CisJZXNwLT5jY3ljbGUgPSBFU1BfTUhaX1RPX0NZQ0xFKGZtaHopOworCWVzcC0+Y3RpY2sgPSBFU1BfVElDSyhjY2YsIGVzcC0+Y2N5Y2xlKTsKKwllc3AtPm5lZ19kZWZwID0gRVNQX05FR19ERUZQKGZtaHosIGNjZik7CisJZXNwLT5zeW5jX2RlZnAgPSBTWU5DX0RFRlBfU0xPVzsKKworCXByaW50aygiU0NTSSBJRCAlZCBDbGsgJWRNSHogQ0NGPSVkIFRPdXQgJWQgIiwKKwkgICAgICAgZXNwLT5zY3NpX2lkLCAoZXNwLT5jZnJlcSAvIDEwMDAwMDApLAorCSAgICAgICBjY2YsIChpbnQpIGVzcC0+bmVnX2RlZnApOworCisJLyogRmlsbCBpbiBlaG9zdCBkYXRhICovCisJZXNwLT5laG9zdC0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKWVyZWdzOworCWVzcC0+ZWhvc3QtPnRoaXNfaWQgPSBlc3AtPnNjc2lfaWQ7CisJZXNwLT5laG9zdC0+aXJxID0gZXNwLT5pcnE7CisKKwkvKiBTQ1NJIGlkIG1hc2sgKi8KKwllc3AtPnNjc2lfaWRfbWFzayA9ICgxIDw8IGVzcC0+c2NzaV9pZCk7CisKKwkvKiBQcm9iZSB0aGUgcmV2aXNpb24gb2YgdGhpcyBlc3AgKi8KKwllc3AtPmNvbmZpZzEgPSAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IChlc3AtPnNjc2lfaWQgJiA3KSk7CisJZXNwLT5jb25maWcyID0gKEVTUF9DT05GSUcyX1NDU0kyRU5BQiB8IEVTUF9DT05GSUcyX1JFR1BBUklUWSk7CisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKKwlpZigoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmcyKSAmIH4oRVNQX0NPTkZJRzJfTUFHSUMpKSAhPQorCSAgIChFU1BfQ09ORklHMl9TQ1NJMkVOQUIgfCBFU1BfQ09ORklHMl9SRUdQQVJJVFkpKSB7CisJCXByaW50aygiTkNSNTNDOTAoZXNwMTAwKVxuIik7CisJCWVzcC0+ZXJldiA9IGVzcDEwMDsKKwl9IGVsc2UgeworCQllc3AtPmNvbmZpZzIgPSAwOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCAwKTsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgNSk7CisJCWlmKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMykgIT0gNSkgeworCQkJcHJpbnRrKCJOQ1I1M0M5MEEoZXNwMTAwYSlcbiIpOworCQkJZXNwLT5lcmV2ID0gZXNwMTAwYTsKKwkJfSBlbHNlIHsKKwkJCWludCB0YXJnZXQ7CisKKwkJCWZvcih0YXJnZXQ9MDsgdGFyZ2V0PDg7IHRhcmdldCsrKQorCQkJCWVzcC0+Y29uZmlnM1t0YXJnZXRdID0gMDsKKwkJCWVzcC0+cHJldl9jZmczID0gMDsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIDApOworCQkJaWYoY2NmID4gRVNQX0NDRl9GNSkgeworCQkJCXByaW50aygiTkNSNTNDOVhGKGVzcGZhc3QpXG4iKTsKKwkJCQllc3AtPmVyZXYgPSBmYXN0OworCQkJCWVzcC0+c3luY19kZWZwID0gU1lOQ19ERUZQX0ZBU1Q7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiTkNSNTNDOXgoZXNwMjM2KVxuIik7CisJCQkJZXNwLT5lcmV2ID0gZXNwMjM2OworCQkJfQorCQl9CisJfQkJCQkKKworCS8qIEluaXRpYWxpemUgdGhlIGNvbW1hbmQgcXVldWVzICovCisJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwllc3AtPmRpc2Nvbm5lY3RlZF9TQyA9IE5VTEw7CisJZXNwLT5pc3N1ZV9TQyA9IE5VTEw7CisKKwkvKiBDbGVhciB0aGUgc3RhdGUgbWFjaGluZXMuICovCisJZXNwLT50YXJnZXRzX3ByZXNlbnQgPSAwOworCWVzcC0+cmVzZXR0aW5nX2J1cyA9IDA7CisJZXNwLT5zbmlwID0gMDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVzcC0+cmVzZXRfcXVldWUpOworCisJZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA9IDA7CisJZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJZXNwLT5lc3BjbWRsb2dbaV0gPSAwOworCWVzcC0+ZXNwY21kZW50ID0gMDsKKwlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWVzcC0+Y3VyX21zZ291dFtpXSA9IDA7CisJCWVzcC0+Y3VyX21zZ2luW2ldID0gMDsKKwl9CisJZXNwLT5wcmV2bXNnb3V0ID0gZXNwLT5wcmV2bXNnaW4gPSAwOworCWVzcC0+bXNnb3V0X2xlbiA9IGVzcC0+bXNnaW5fbGVuID0gMDsKKworCS8qIENsZWFyIHRoZSBvbmUgYmVoaW5kIGNhY2hlcyB0byBob2xkIHVubWF0Y2hhYmxlIHZhbHVlcy4gKi8KKwllc3AtPnByZXZfc29mZiA9IGVzcC0+cHJldl9zdHAgPSBlc3AtPnByZXZfY2ZnMyA9IDB4ZmY7CisKKwkvKiBSZXNldCB0aGUgdGhpbmcgYmVmb3JlIHdlIHRyeSBhbnl0aGluZy4uLiAqLworCWVzcF9ib290dXBfcmVzZXQoZXNwLCBlcmVncyk7CisKKwllc3BzX2luX3VzZSsrOworfQorCisvKiBUaGUgaW5mbyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aGF0ZXZlciB1c2VmdWwKKyAqIGluZm9ybWF0aW9uIHRoZSBkZXZlbG9wZXIgc2VlcyBmaXQuICBJZiBub3QgcHJvdmlkZWQsIHRoZW4KKyAqIHRoZSBuYW1lIGZpZWxkIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICovCitjb25zdCBjaGFyICplc3BfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisKKwllc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgaG9zdC0+aG9zdGRhdGE7CisJc3dpdGNoKGVzcC0+ZXJldikgeworCWNhc2UgZXNwMTAwOgorCQlyZXR1cm4gIkVTUDEwMCAoTkNSNTNDOTApIjsKKwljYXNlIGVzcDEwMGE6CisJCXJldHVybiAiRVNQMTAwQSAoTkNSNTNDOTBBKSI7CisJY2FzZSBlc3AyMzY6CisJCXJldHVybiAiRVNQMjM2IChOQ1I1M0M5eCkiOworCWNhc2UgZmFzMjE2OgorCQlyZXR1cm4gIkVtdWxleCBGQVMyMTYiOworCWNhc2UgZmFzMjM2OgorCQlyZXR1cm4gIkVtdWxleCBGQVMyMzYiOworCWNhc2UgZmFzMzY2OgorCQlyZXR1cm4gIlFMb2dpYyBGQVMzNjYiOworCWNhc2UgZmFzMTAwYToKKwkJcmV0dXJuICJGUEVTUDEwMEEiOworCWNhc2UgZnNjOgorCQlyZXR1cm4gIlN5bWJpb3MgTG9naWMgNTNDRjl4LTIiOworCWRlZmF1bHQ6CisJCXBhbmljKCJCb2dvbiBFU1AgcmV2aXNpb24iKTsKKwl9OworfQorCisvKiBGcm9tIFdvbGZnYW5nIFN0YW5nbG1laWVyJ3MgTkNSIHNjc2kgZHJpdmVyLiAqLworc3RydWN0IGluZm9fc3RyCit7CisJY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaWYgKGluZm8tPnBvcyArIGxlbiA+IGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+bGVuZ3RoIC0gaW5mby0+cG9zOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCWlmIChpbmZvLT5wb3MgPCBpbmZvLT5vZmZzZXQpIHsKKwkJZGF0YSArPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwkJbGVuICAtPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyICsgaW5mby0+cG9zLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCX0KK30KKworc3RhdGljIGludCBjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbODFdOworCWludCBsZW47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGVzcF9ob3N0X2luZm8oc3RydWN0IE5DUl9FU1AgKmVzcCwgY2hhciAqcHRyLCBvZmZfdCBvZmZzZXQsIGludCBsZW4pCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBpbmZvX3N0ciBpbmZvOworCWludCBpOworCisJaW5mby5idWZmZXIJPSBwdHI7CisJaW5mby5sZW5ndGgJPSBsZW47CisJaW5mby5vZmZzZXQJPSBvZmZzZXQ7CisJaW5mby5wb3MJPSAwOworCisJY29weV9pbmZvKCZpbmZvLCAiRVNQIEhvc3QgQWRhcHRlcjpcbiIpOworCWNvcHlfaW5mbygmaW5mbywgIlx0RVNQIE1vZGVsXHRcdCIpOworCXN3aXRjaChlc3AtPmVyZXYpIHsKKwljYXNlIGVzcDEwMDoKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNQMTAwIChOQ1I1M0M5MClcbiIpOworCQlicmVhazsKKwljYXNlIGVzcDEwMGE6CisJCWNvcHlfaW5mbygmaW5mbywgIkVTUDEwMEEgKE5DUjUzQzkwQSlcbiIpOworCQlicmVhazsKKwljYXNlIGVzcDIzNjoKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNQMjM2IChOQ1I1M0M5eClcbiIpOworCQlicmVhazsKKwljYXNlIGZhczIxNjoKKwkJY29weV9pbmZvKCZpbmZvLCAiRW11bGV4IEZBUzIxNlxuIik7CisJCWJyZWFrOworCWNhc2UgZmFzMjM2OgorCQljb3B5X2luZm8oJmluZm8sICJFbXVsZXggRkFTMjM2XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmYXMxMDBhOgorCQljb3B5X2luZm8oJmluZm8sICJGUEVTUDEwMEFcbiIpOworCQlicmVhazsKKwljYXNlIGZhc3Q6CisJCWNvcHlfaW5mbygmaW5mbywgIkdlbmVyaWMgRkFTVFxuIik7CisJCWJyZWFrOworCWNhc2UgZmFzMzY2OgorCQljb3B5X2luZm8oJmluZm8sICJRTG9naWMgRkFTMzY2XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBmc2M6CisJCWNvcHlfaW5mbygmaW5mbywgIlN5bWJpb3MgTG9naWMgNTNDOXgtMlxuIik7CisJCWJyZWFrOworCWNhc2UgZXNwdW5rbm93bjoKKwlkZWZhdWx0OgorCQljb3B5X2luZm8oJmluZm8sICJVbmtub3duIVxuIik7CisJCWJyZWFrOworCX07CisJY29weV9pbmZvKCZpbmZvLCAiXHRMaXZlIFRhcmdldHNcdFx0WyAiKTsKKwlmb3IoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCWlmKGVzcC0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgaSkpCisJCQljb3B5X2luZm8oJmluZm8sICIlZCAiLCBpKTsKKwl9CisJY29weV9pbmZvKCZpbmZvLCAiXVxuXG4iKTsKKwkKKwkvKiBOb3cgZGVzY3JpYmUgdGhlIHN0YXRlIG9mIGVhY2ggZXhpc3RpbmcgdGFyZ2V0LiAqLworCWNvcHlfaW5mbygmaW5mbywgIlRhcmdldCAjXHRjb25maWczXHRcdFN5bmMgQ2FwYWJpbGl0aWVzXHREaXNjb25uZWN0XG4iKTsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBlc3AtPmVob3N0KSB7CisJCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gc2Rldi0+aG9zdGRhdGE7CisJCXVpbnQgaWQgPSBzZGV2LT5pZDsKKworCQlpZiAoIShlc3AtPnRhcmdldHNfcHJlc2VudCAmICgxIDw8IGlkKSkpCisJCQljb250aW51ZTsKKworCQljb3B5X2luZm8oJmluZm8sICIlZFx0XHQiLCBpZCk7CisJCWNvcHlfaW5mbygmaW5mbywgIiUwOGx4XHQiLCBlc3AtPmNvbmZpZzNbaWRdKTsKKwkJY29weV9pbmZvKCZpbmZvLCAiWyUwMmx4LCUwMmx4XVx0XHRcdCIsCisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQsCisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QpOworCQljb3B5X2luZm8oJmluZm8sICIlc1xuIiwgZXNwX2Rldi0+ZGlzY29ubmVjdCA/ICJ5ZXMiIDogIm5vIik7CisJfQorCisJcmV0dXJuIGluZm8ucG9zID4gaW5mby5vZmZzZXQ/IGluZm8ucG9zIC0gaW5mby5vZmZzZXQgOiAwOworfQorCisvKiBFU1AgcHJvYyBmaWxlc3lzdGVtIGNvZGUuICovCitpbnQgZXNwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICBpbnQgaW5vdXQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKXNob3N0LT5ob3N0ZGF0YTsKKworCWlmKGlub3V0KQorCQlyZXR1cm4gLUVJTlZBTDsgLyogbm90IHlldCAqLworCWlmKHN0YXJ0KQorCQkqc3RhcnQgPSBidWZmZXI7CisJcmV0dXJuIGVzcF9ob3N0X2luZm8oZXNwLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgZXNwX2dldF9kbWFidWZzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJaWYoc3AtPnVzZV9zZyA9PSAwKSB7CisJCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNwLT5yZXF1ZXN0X2J1ZmZsZW47CisJCXNwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+cmVxdWVzdF9idWZmZXI7CisJCXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJCWlmIChlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lKQorCQkJZXNwLT5kbWFfbW11X2dldF9zY3NpX29uZShlc3AsIHNwKTsKKwkJZWxzZQorCQkJc3AtPlNDcC5wdHIgPQorCQkJCShjaGFyICopIHZpcnRfdG9fcGh5cyhzcC0+cmVxdWVzdF9idWZmZXIpOworCX0gZWxzZSB7CisJCXNwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+YnVmZmVyOworCQlzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBzcC0+dXNlX3NnIC0gMTsKKwkJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gc3AtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJaWYgKGVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wpCisJCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsKGVzcCwgc3ApOworCQllbHNlCisJCQlzcC0+U0NwLnB0ciA9CisJCQkJKGNoYXIgKikgdmlydF90b19waHlzKChwYWdlX2FkZHJlc3Moc3AtPlNDcC5idWZmZXItPnBhZ2UpICsgc3AtPlNDcC5idWZmZXItPm9mZnNldCkpOworCX0KK30KKworc3RhdGljIHZvaWQgZXNwX3JlbGVhc2VfZG1hYnVmcyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCWlmKHNwLT51c2Vfc2cgPT0gMCkgeworCQlpZiAoZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUpCisJCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZShlc3AsIHNwKTsKKwl9IGVsc2UgeworCQlpZiAoZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wpCisJCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbChlc3AsIHNwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9yZXN0b3JlX3BvaW50ZXJzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKKworCXNwLT5TQ3AucHRyID0gZXAtPnNhdmVkX3B0cjsKKwlzcC0+U0NwLmJ1ZmZlciA9IGVwLT5zYXZlZF9idWZmZXI7CisJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWw7CisJc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWw7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9zYXZlX3BvaW50ZXJzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKKworCWVwLT5zYXZlZF9wdHIgPSBzcC0+U0NwLnB0cjsKKwllcC0+c2F2ZWRfYnVmZmVyID0gc3AtPlNDcC5idWZmZXI7CisJZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWwgPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWwgPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Cit9CisKKy8qIFNvbWUgcnVsZXM6CisgKgorICogICAxKSBOZXZlciBldmVyIHBhbmljIHdoaWxlIHNvbWV0aGluZyBpcyBsaXZlIG9uIHRoZSBidXMuCisgKiAgICAgIElmIHRoZXJlIGlzIHRvIGJlIGFueSBjaGFuY2Ugb2Ygc3luY2luZyB0aGUgZGlza3MgdGhpcworICogICAgICBydWxlIGlzIHRvIGJlIG9iZXllZC4KKyAqCisgKiAgIDIpIEFueSB0YXJnZXQgdGhhdCBjYXVzZXMgYSBmb3VsIGNvbmRpdGlvbiB3aWxsIG5vIGxvbmdlcgorICogICAgICBoYXZlIHN5bmNocm9ub3VzIHRyYW5zZmVycyBkb25lIHRvIGl0LCBubyBxdWVzdGlvbnMKKyAqICAgICAgYXNrZWQuCisgKgorICogICAzKSBLZWVwIHJlZ2lzdGVyIGFjY2Vzc2VzIHRvIGEgbWluaW11bS4gIFRoaW5rIGFib3V0IHNvbWUKKyAqICAgICAgZGF5IHdoZW4gd2UgaGF2ZSBYYnVzIG1hY2hpbmVzIHRoaXMgaXMgcnVubmluZyBvbiBhbmQKKyAqICAgICAgdGhlIEVTUCBjaGlwIGlzIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIG1hY2hpbmUgb24gYQorICogICAgICBkaWZmZXJlbnQgYm9hcmQgZnJvbSB0aGUgY3B1IHdoZXJlIHRoaXMgaXMgcnVubmluZy4KKyAqLworCisvKiBGaXJlIG9mZiBhIGNvbW1hbmQuICBXZSBhc3N1bWUgdGhlIGJ1cyBpcyBmcmVlIGFuZCB0aGF0IHRoZSBvbmx5CisgKiBjYXNlIHdoZXJlIHdlIGNvdWxkIHNlZSBhbiBpbnRlcnJ1cHQgaXMgd2hlcmUgd2UgaGF2ZSBkaXNjb25uZWN0ZWQKKyAqIGNvbW1hbmRzIGFjdGl2ZSBhbmQgdGhleSBhcmUgdHJ5aW5nIHRvIHJlc2VsZWN0IHVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX2NoZWNrX2NtZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCXN3aXRjaChzcC0+Y21kX2xlbikgeworCWNhc2UgNjoKKwljYXNlIDEwOgorCWNhc2UgMTI6CisJCWVzcC0+ZXNwX3Nsb3djbWQgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVzcC0+ZXNwX3Nsb3djbWQgPSAxOworCQllc3AtPmVzcF9zY21kbGVmdCA9IHNwLT5jbWRfbGVuOworCQllc3AtPmVzcF9zY21kcCA9ICZzcC0+Y21uZFswXTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3N5bmNfbmVnb19tc2coc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IHBlcmlvZCwgaW50IG9mZnNldCkKK3sKKwllc3AtPmN1cl9tc2dvdXRbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCWVzcC0+Y3VyX21zZ291dFsxXSA9IDM7CisJZXNwLT5jdXJfbXNnb3V0WzJdID0gRVhURU5ERURfU0RUUjsKKwllc3AtPmN1cl9tc2dvdXRbM10gPSBwZXJpb2Q7CisJZXNwLT5jdXJfbXNnb3V0WzRdID0gb2Zmc2V0OworCWVzcC0+bXNnb3V0X2xlbiA9IDU7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9leGVjX2NtZChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXN0cnVjdCBFU1BfcmVncyAqZXJlZ3MgPSBlc3AtPmVyZWdzOworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2OworCVNjc2lfQ21uZCAqU0NwdHI7CisJU2NzaV9EZXZpY2UgKlNEcHRyOworCXZvbGF0aWxlIHVuY2hhciAqY21kcCA9IGVzcC0+ZXNwX2NvbW1hbmQ7CisJdW5zaWduZWQgY2hhciB0aGVfZXNwX2NvbW1hbmQ7CisJaW50IGx1biwgdGFyZ2V0OworCWludCBpOworCisJLyogSG9sZCBvZmYgaWYgd2UgaGF2ZSBkaXNjb25uZWN0ZWQgY29tbWFuZHMgYW5kCisJICogYW4gSVJRIGlzIHNob3dpbmcuLi4KKwkgKi8KKwlpZihlc3AtPmRpc2Nvbm5lY3RlZF9TQyAmJiBlc3AtPmRtYV9pcnFfcChlc3ApKQorCQlyZXR1cm47CisKKwkvKiBHcmFiIGZpcnN0IG1lbWJlciBvZiB0aGUgaXNzdWUgcXVldWUuICovCisJU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0MgPSByZW1vdmVfZmlyc3RfU0MoJmVzcC0+aXNzdWVfU0MpOworCisJLyogU2FmZSB0byBwYW5pYyBoZXJlIGJlY2F1c2UgY3VycmVudF9TQyBpcyBudWxsLiAqLworCWlmKCFTQ3B0cikKKwkJcGFuaWMoImVzcDogZXNwX2V4ZWNfY21kIGFuZCBpc3N1ZSBxdWV1ZSBpcyBOVUxMIik7CisKKwlTRHB0ciA9IFNDcHRyLT5kZXZpY2U7CisJZXNwX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKKwlsdW4gPSBTQ3B0ci0+ZGV2aWNlLT5sdW47CisJdGFyZ2V0ID0gU0NwdHItPmRldmljZS0+aWQ7CisKKwllc3AtPnNuaXAgPSAwOworCWVzcC0+bXNnb3V0X2xlbiA9IDA7CisKKwkvKiBTZW5kIGl0IG91dCB3aG9sZSwgb3IgcGllY2UgYnkgcGllY2U/ICAgVGhlIEVTUAorCSAqIG9ubHkga25vd3MgaG93IHRvIGF1dG9tYXRpY2FsbHkgc2VuZCBvdXQgNiwgMTAsCisJICogYW5kIDEyIGJ5dGUgY29tbWFuZHMuICBJIHVzZWQgdG8gdGhpbmsgdGhhdCB0aGUKKwkgKiBMaW51eCBTQ1NJIGNvZGUgd291bGQgbmV2ZXIgdGhyb3cgYW55dGhpbmcgb3RoZXIKKwkgKiB0aGFuIHRoYXQgdG8gdXMsIGJ1dCB0aGVuIGFnYWluIHRoZXJlIGlzIHRoZQorCSAqIFNDU0kgZ2VuZXJpYyBkcml2ZXIgd2hpY2ggY2FuIHNlbmQgdXMgYW55dGhpbmcuCisJICovCisJZXNwX2NoZWNrX2NtZChlc3AsIFNDcHRyKTsKKworCS8qIElmIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgRVNQIHdpbGwgbGVhdmUKKwkgKiBBVE4gYXNzZXJ0ZWQsIGNhdXNpbmcgdGhlIHRhcmdldCB0byBnbyBpbnRvIG1lc3NhZ2Ugb3V0CisJICogcGhhc2UuICBUaGUgRVNQIHdpbGwgZmVlZCB0aGUgdGFyZ2V0IHRoZSBpZGVudGlmeSBhbmQgdGhlbgorCSAqIHRoZSB0YXJnZXQgY2FuIG9ubHkgbGVnYWxseSBnbyB0byBvbmUgb2YgY29tbWFuZCwKKwkgKiBkYXRhaW4vb3V0LCBzdGF0dXMsIG9yIG1lc3NhZ2UgaW4gcGhhc2UsIG9yIHN0YXkgaW4gbWVzc2FnZQorCSAqIG91dCBwaGFzZSAoc2hvdWxkIHdlIGJlIHRyeWluZyB0byBzZW5kIGEgc3luYyBuZWdvdGlhdGlvbgorCSAqIG1lc3NhZ2UgYWZ0ZXIgdGhlIGlkZW50aWZ5KS4gIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGRyb3AKKwkgKiBCU1ksIGJ1dCBzb21lIGJ1Z2d5IHRhcmdldHMgZG8gYW5kIHdlIGNoZWNrIGZvciB0aGlzCisJICogY29uZGl0aW9uIGluIHRoZSBzZWxlY3Rpb24gY29tcGxldGUgY29kZS4gIE1vc3Qgb2YgdGhlIHRpbWUKKwkgKiB3ZSdsbCBtYWtlIHRoZSBjb21tYW5kIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGUgRVNQIGFuZCBpdAorCSAqIHdpbGwgbm90IGludGVycnVwdCB1cyB1bnRpbCBpdCBmaW5pc2hlcyBjb21tYW5kIHBoYXNlLCB3ZQorCSAqIGNhbm5vdCBkbyB0aGlzIGZvciBjb21tYW5kIHNpemVzIHRoZSBFU1AgZG9lcyBub3QKKwkgKiB1bmRlcnN0YW5kIGFuZCBpbiB0aGlzIGNhc2Ugd2UnbGwgZ2V0IGludGVycnVwdGVkIHJpZ2h0CisJICogd2hlbiB0aGUgdGFyZ2V0IGdvZXMgaW50byBjb21tYW5kIHBoYXNlLgorCSAqCisJICogSXQgaXMgYWJzb2x1dGVseSBfaWxsZWdhbF8gaW4gdGhlIHByZXNlbmNlIG9mIFNDU0ktMiBkZXZpY2VzCisJICogdG8gdXNlIHRoZSBFU1Agc2VsZWN0IHcvbyBBVE4gY29tbWFuZC4gIFdoZW4gU0NTSS0yIGRldmljZXMgYXJlCisJICogcHJlc2VudCBvbiB0aGUgYnVzIHdlIF9tdXN0XyBhbHdheXMgZ28gc3RyYWlnaHQgdG8gbWVzc2FnZSBvdXQKKwkgKiBwaGFzZSB3aXRoIGFuIGlkZW50aWZ5IG1lc3NhZ2UgZm9yIHRoZSB0YXJnZXQuICBCZWluZyB0aGF0CisJICogc2VsZWN0aW9uIGF0dGVtcHRzIGluIFNDU0ktMSB3L28gQVROIHdhcyBhbiBvcHRpb24sIGRvaW5nIFNDU0ktMgorCSAqIHNlbGVjdGlvbnMgc2hvdWxkIG5vdCBjb25mdXNlIFNDU0ktMSB3ZSBob3BlLgorCSAqLworCisJaWYoZXNwX2Rldi0+c3luYykgeworCQkvKiB0aGlzIHRhcmdldHMgc3luYyBpcyBrbm93biAqLworI2lmZGVmIENPTkZJR19TQ1NJX01BQ19FU1AKK2RvX3N5bmNfa25vd246CisjZW5kaWYKKwkJaWYoZXNwX2Rldi0+ZGlzY29ubmVjdCkKKwkJCSpjbWRwKysgPSBJREVOVElGWSgxLCBsdW4pOworCQllbHNlCisJCQkqY21kcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKKworCQlpZihlc3AtPmVzcF9zbG93Y21kKSB7CisJCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBUyB8IEVTUF9DTURfRE1BKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X3N0b3ApOworCQl9IGVsc2UgeworCQkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOworCQl9CisJfSBlbHNlIGlmKCEoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMTw8dGFyZ2V0KSkgfHwgIShlc3BfZGV2LT5kaXNjb25uZWN0KSkgeworCQkvKiBBZnRlciB0aGUgYm9vdHVwIFNDU0kgY29kZSBzZW5kcyBib3RoIHRoZQorCQkgKiBURVNUX1VOSVRfUkVBRFkgYW5kIElOUVVJUlkgY29tbWFuZHMgd2Ugd2FudAorCQkgKiB0byBhdCBsZWFzdCBhdHRlbXB0IGFsbG93aW5nIHRoZSBkZXZpY2UgdG8KKwkJICogZGlzY29ubmVjdC4KKwkJICovCisJCUVTUE1JU0MoKCJlc3A6IFNlbGVjdGluZyBkZXZpY2UgZm9yIGZpcnN0IHRpbWUuIHRhcmdldD0lZCAiCisJCQkgImx1bj0lZFxuIiwgdGFyZ2V0LCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJaWYoIVNEcHRyLT5ib3JrZW4gJiYgIWVzcF9kZXYtPmRpc2Nvbm5lY3QpCisJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKKworCQkqY21kcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKKwkJZXNwLT5wcmV2bXNnb3V0ID0gTk9QOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9ub3JtKTsKKwkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKKworCQkvKiBUYWtlIG5vIGNoYW5jZXMuLi4gKi8KKwkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwl9IGVsc2UgeworCQlpbnQgdG9zaGliYV9jZHJvbV9od2J1Z193a2Fyb3VuZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU0NTSV9NQUNfRVNQCisJCS8qIE5ldmVyIGFsbG93IHN5bmNocm9ub3VzIHRyYW5zZmVycyAoZGlzY29ubmVjdCBPSykgb24KKwkJICogTWFjaW50b3NoLiBXZWxsLCBtYXliZSBsYXRlciB3aGVuIHdlIGZpZ3VyZWQgb3V0IGhvdyB0byAKKwkJICogZG8gRE1BIG9uIHRoZSBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgaXQgLi4uCisJCSAqLworCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKKwkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJZXNwX2Rldi0+c3luYyA9IDE7CisJCWVzcC0+c25pcCA9IDA7CisJCWdvdG8gZG9fc3luY19rbm93bjsKKyNlbmRpZgorCQkvKiBXZSd2ZSB0YWxrZWQgdG8gdGhpcyBndXkgYmVmb3JlLAorCQkgKiBidXQgbmV2ZXIgbmVnb3RpYXRlZC4gIExldCdzIHRyeQorCQkgKiBzeW5jIG5lZ290aWF0aW9uLgorCQkgKi8KKwkJaWYoIVNEcHRyLT5ib3JrZW4pIHsKKwkJCWlmKChTRHB0ci0+dHlwZSA9PSBUWVBFX1JPTSkgJiYKKwkJCSAgICghc3RybmNtcChTRHB0ci0+dmVuZG9yLCAiVE9TSElCQSIsIDcpKSkgeworCQkJCS8qIE5pY2UgdHJ5IHN1Y2tlci4uLiAqLworCQkJCUVTUE1JU0MoKCJlc3AlZDogRGlzYWJsaW5nIHN5bmMgZm9yIGJ1Z2d5ICIKKwkJCQkJICJUb3NoaWJhIENEUk9NLlxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJCQl0b3NoaWJhX2Nkcm9tX2h3YnVnX3drYXJvdW5kID0gMTsKKwkJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBlc3AtPnN5bmNfZGVmcCwgMTUpOworCQkJfQorCQl9IGVsc2UgeworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOworCQl9CisJCWVzcF9kZXYtPnN5bmMgPSAxOworCQllc3AtPnNuaXAgPSAxOworCisJCS8qIEEgZml4IGZvciBicm9rZW4gU0NTSTEgdGFyZ2V0cywgd2hlbiB0aGV5IGRpc2Nvbm5lY3QKKwkJICogdGhleSBsb2NrIHVwIHRoZSBidXMgYW5kIGNvbmZ1c2UgRVNQLiAgU28gZGlzYWxsb3cKKwkJICogZGlzY29ubmVjdHMgZm9yIFNDU0kxIHRhcmdldHMgZm9yIG5vdyB1bnRpbCB3ZQorCQkgKiBmaW5kIGEgYmV0dGVyIGZpeC4KKwkJICoKKwkJICogQWRkZW5kdW06IFRoaXMgaXMgZnVubnksIEkgZmlndXJlZCBvdXQgd2hhdCB3YXMgZ29pbmcKKwkJICogICAgICAgICAgIG9uLiAgVGhlIGJsb3R6ZWQgU0NTSTEgdGFyZ2V0IHdvdWxkIGRpc2Nvbm5lY3QsCisJCSAqICAgICAgICAgICBvbmUgb2YgdGhlIG90aGVyIFNDU0kyIHRhcmdldHMgb3IgYm90aCB3b3VsZCBiZQorCQkgKiAgICAgICAgICAgZGlzY29ubmVjdGVkIGFzIHdlbGwuICBUaGUgU0NTSTEgdGFyZ2V0IHdvdWxkCisJCSAqICAgICAgICAgICBzdGF5IGRpc2Nvbm5lY3RlZCBsb25nIGVub3VnaCB0aGF0IHdlIHN0YXJ0CisJCSAqICAgICAgICAgICB1cCBhIGNvbW1hbmQgb24gb25lIG9mIHRoZSBTQ1NJMiB0YXJnZXRzLiAgQXMKKwkJICogICAgICAgICAgIHRoZSBFU1AgaXMgYXJiaXRyYXRpbmcgZm9yIHRoZSBidXMgdGhlIFNDU0kxCisJCSAqICAgICAgICAgICB0YXJnZXQgYmVnaW5zIHRvIGFyYml0cmF0ZSBhcyB3ZWxsIHRvIHJlc2VsZWN0CisJCSAqICAgICAgICAgICB0aGUgRVNQLiAgVGhlIFNDU0kxIHRhcmdldCByZWZ1c2VzIHRvIGRyb3AgaXQncworCQkgKiAgICAgICAgICAgSUQgYml0IG9uIHRoZSBkYXRhIGJ1cyBldmVuIHRob3VnaCB0aGUgRVNQIGlzCisJCSAqICAgICAgICAgICBhdCBJRCA3IGFuZCBpcyB0aGUgb2J2aW91cyB3aW5uZXIgZm9yIGFueQorCQkgKiAgICAgICAgICAgYXJiaXRyYXRpb24uICBUaGUgRVNQIGlzIGEgcG9vciBzcG9ydCBhbmQgcmVmdXNlcworCQkgKiAgICAgICAgICAgdG8gbG9zZSBhcmJpdHJhdGlvbiwgaXQgd2lsbCBjb250aW51ZSBpbmRlZmluaXRlbHkKKwkJICogICAgICAgICAgIHRyeWluZyB0byBhcmJpdHJhdGUgZm9yIHRoZSBidXMgYW5kIGNhbiBvbmx5IGJlCisJCSAqICAgICAgICAgICBzdG9wcGVkIHZpYSBhIGNoaXAgcmVzZXQgb3IgU0NTSSBidXMgcmVzZXQuCisJCSAqICAgICAgICAgICBUaGVyZWZvcmUgX25vXyBkaXNjb25uZWN0cyBmb3IgU0NTSTEgdGFyZ2V0cworCQkgKiAgICAgICAgICAgdGhhbmsgeW91IHZlcnkgbXVjaC4gOy0pCisJCSAqLworCQlpZigoKFNEcHRyLT5zY3NpX2xldmVsIDwgMykgJiYgKFNEcHRyLT50eXBlICE9IFRZUEVfVEFQRSkpIHx8CisJCSAgIHRvc2hpYmFfY2Ryb21faHdidWdfd2thcm91bmQgfHwgU0RwdHItPmJvcmtlbikgeworCQkJRVNQTUlTQygoS0VSTl9JTkZPICJlc3AlZDogRGlzYWJsaW5nIERJU0NPTk5FQ1QgZm9yIHRhcmdldCAlZCAiCisJCQkJICJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMDsKKwkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOworCQl9IGVsc2UgeworCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7CisJCX0KKworCQkvKiBFU1AgZmlmbyBpcyBvbmx5IHNvIGJpZy4uLgorCQkgKiBNYWtlIHRoaXMgbG9vayBsaWtlIGEgc2xvdyBjb21tYW5kLgorCQkgKi8KKwkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7CisJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gU0NwdHItPmNtZF9sZW47CisJCWVzcC0+ZXNwX3NjbWRwID0gJlNDcHRyLT5jbW5kWzBdOworCisJCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEFTIHwgRVNQX0NNRF9ETUEpOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9tc2cpOworCX0KKworCWlmKCFlc3AtPmVzcF9zbG93Y21kKQorCQlmb3IoaSA9IDA7IGkgPCBTQ3B0ci0+Y21kX2xlbjsgaSsrKQorCQkJKmNtZHArKyA9IFNDcHRyLT5jbW5kW2ldOworCisJZXNwX3dyaXRlKGVyZWdzLT5lc3BfYnVzaWQsICh0YXJnZXQgJiA3KSk7CisJaWYgKGVzcC0+cHJldl9zb2ZmICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCSAgICBlc3AtPnByZXZfc3RwICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKKwkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKKwkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1t0YXJnZXRdKSkgeworCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOworCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIGVzcC0+cHJldl9zdHApOyAKKwkJaWYoZXNwLT5lcmV2ID4gZXNwMTAwYSkgeworCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbdGFyZ2V0XTsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKKwkJfQorCX0KKwlpID0gKGNtZHAgLSBlc3AtPmVzcF9jb21tYW5kKTsKKworCS8qIFNldCB1cCB0aGUgRE1BIGFuZCBFU1AgY291bnRlcnMgKi8KKwlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJaW50IGogPSAwOworCisJCS8qIAorCQkgKiBYWFggTVNjaDoKKwkJICoKKwkJICogSXQgc2VlbXMgdGhpcyBpcyByZXF1aXJlZCwgYXQgbGVhc3QgdG8gY2xlYW4gdXAKKwkJICogYWZ0ZXIgZmFpbGVkIGNvbW1hbmRzIHdoZW4gdXNpbmcgUElPIG1vZGUgLi4uCisJCSAqLworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCisJCWZvcig7ajxpO2orKykKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmVzcF9jb21tYW5kW2pdKTsKKwkJdGhlX2VzcF9jb21tYW5kICY9IH5FU1BfQ01EX0RNQTsKKworCQkvKiBUZWxsIEVTUCB0byAiZ28iLiAqLworCQllc3BfY21kKGVzcCwgZXJlZ3MsIHRoZV9lc3BfY29tbWFuZCk7CisJfSBlbHNlIHsKKwkJLyogU2V0IHVwIHRoZSBFU1AgY291bnRlcnMgKi8KKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfdGNsb3csIGkpOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90Y21lZCwgMCk7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGkpOworCisJCS8qIFRlbGwgRVNQIHRvICJnbyIuICovCisJCWVzcF9jbWQoZXNwLCBlcmVncywgdGhlX2VzcF9jb21tYW5kKTsKKwl9Cit9CisKKy8qIFF1ZXVlIGEgU0NTSSBjb21tYW5kIGRlbGl2ZXJlZCBmcm9tIHRoZSBtaWQtbGV2ZWwgTGludXggU0NTSSBjb2RlLiAqLworaW50IGVzcF9xdWV1ZShTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisKKwkvKiBTZXQgdXAgZnVuYyBwdHIgYW5kIGluaXRpYWwgZHJpdmVyIGNtZC1waGFzZS4gKi8KKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+U0NwLnBoYXNlID0gbm90X2lzc3VlZDsKKworCWVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmKGVzcC0+ZG1hX2xlZF9vbikKKwkJZXNwLT5kbWFfbGVkX29uKGVzcCk7CisKKwkvKiBXZSB1c2UgdGhlIHNjcmF0Y2ggYXJlYS4gKi8KKwlFU1BRVUVVRSgoImVzcF9xdWV1ZTogdGFyZ2V0PSVkIGx1bj0lZCAiLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmx1bikpOworCUVTUERJU0MoKCJOPCUwMngsJTAyeD4iLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmx1bikpOworCisJZXNwX2dldF9kbWFidWZzKGVzcCwgU0NwbnQpOworCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgU0NwbnQpOyAvKiBGSVhNRSBmb3IgdGFnIHF1ZXVlaW5nICovCisKKwlTQ3BudC0+U0NwLlN0YXR1cyAgICAgICAgICAgPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlICAgICAgICAgID0gMHhmZjsKKwlTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCAgICAgPSAwOworCisJLyogUGxhY2UgaW50byBvdXIgcXVldWUuICovCisJaWYoU0NwbnQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgeworCQlFU1BRVUVVRSgoIlJRU0VOU0VcbiIpKTsKKwkJcHJlcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOworCX0gZWxzZSB7CisJCUVTUFFVRVVFKCgiXG4iKSk7CisJCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOworCX0KKworCS8qIFJ1biBpdCBub3cgaWYgd2UgY2FuLiAqLworCWlmKCFlc3AtPmN1cnJlbnRfU0MgJiYgIWVzcC0+cmVzZXR0aW5nX2J1cykKKwkJZXNwX2V4ZWNfY21kKGVzcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRHVtcCBkcml2ZXIgc3RhdGUuICovCitzdGF0aWMgdm9pZCBlc3BfZHVtcF9jbWQoU2NzaV9DbW5kICpTQ3B0cikKK3sKKwlFU1BMT0coKCJbdGd0PCUwMng+IGx1bjwlMDJ4PiAiCisJCSJwcGhhc2U8JXM+IGNwaGFzZTwlcz5dIiwKKwkJU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1biwKKwkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kKSwKKwkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3AucGhhc2UpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIAorCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworI2lmZGVmIERFQlVHX0VTUF9DTURTCisJaW50IGk7CisjZW5kaWYKKworCUVTUExPRygoImVzcCVkOiBkdW1waW5nIHN0YXRlXG4iLCBlc3AtPmVzcF9pZCkpOworCQorCS8qIFByaW50IERNQSBzdGF0dXMgKi8KKwllc3AtPmRtYV9kdW1wX3N0YXRlKGVzcCk7CisKKwlFU1BMT0coKCJlc3AlZDogU1cgW3NyZWc8JTAyeD4gc3N0ZXA8JTAyeD4gaXJlZzwlMDJ4Pl1cbiIsCisJCWVzcC0+ZXNwX2lkLCBlc3AtPnNyZWcsIGVzcC0+c2VxcmVnLCBlc3AtPmlyZWcpKTsKKwlFU1BMT0coKCJlc3AlZDogSFcgcmVyZWFkIFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAorCQllc3AtPmVzcF9pZCwgZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpLCBlc3BfcmVhZChlcmVncy0+ZXNwX3NzdGVwKSwKKwkJZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpKSk7CisjaWZkZWYgREVCVUdfRVNQX0NNRFMKKwlwcmludGsoImVzcCVkOiBsYXN0IEVTUCBjbWRzIFsiLCBlc3AtPmVzcF9pZCk7CisJaSA9IChlc3AtPmVzcGNtZGVudCAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7CisJZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7CisJcHJpbnRrKCI+Iik7CisJaSA9IChpIC0gMSkgJiAzMTsKKwlwcmludGsoIjwiKTsKKwllc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsKKwlwcmludGsoIj4iKTsKKwlpID0gKGkgLSAxKSAmIDMxOworCXByaW50aygiPCIpOworCWVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOworCXByaW50aygiPiIpOworCWkgPSAoaSAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7CisJZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7CisJcHJpbnRrKCI+Iik7CisJcHJpbnRrKCJdXG4iKTsKKyNlbmRpZiAvKiAoREVCVUdfRVNQX0NNRFMpICovCisKKwlpZihTQ3B0cikgeworCQlFU1BMT0coKCJlc3AlZDogY3VycmVudCBjb21tYW5kICIsIGVzcC0+ZXNwX2lkKSk7CisJCWVzcF9kdW1wX2NtZChTQ3B0cik7CisJfQorCUVTUExPRygoIlxuIikpOworCVNDcHRyID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZCAiLCBlc3AtPmVzcF9pZCkpOworCXdoaWxlKFNDcHRyKSB7CisJCWVzcF9kdW1wX2NtZChTQ3B0cik7CisJCVNDcHRyID0gKFNjc2lfQ21uZCAqKSBTQ3B0ci0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXG4iKSk7Cit9CisKKy8qIEFib3J0IGEgY29tbWFuZC4gIFRoZSBob3N0X2xvY2sgaXMgYWNxdWlyZWQgYnkgY2FsbGVyLiAqLworaW50IGVzcF9hYm9ydChTY3NpX0NtbmQgKlNDcHRyKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IEVTUF9yZWdzICplcmVncyA9IGVzcC0+ZXJlZ3M7CisJaW50IGRvbjsKKworCUVTUExPRygoImVzcCVkOiBBYm9ydGluZyBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOworCWVzcF9kdW1wX3N0YXRlKGVzcCwgZXJlZ3MpOworCisJLyogV2hlZWUsIGlmIHRoaXMgaXMgdGhlIGN1cnJlbnQgY29tbWFuZCBvbiB0aGUgYnVzLCB0aGUKKwkgKiBiZXN0IHdlIGNhbiBkbyBpcyBhc3NlcnQgQVROIGFuZCB3YWl0IGZvciBtc2dvdXQgcGhhc2UuCisJICogVGhpcyBzaG91bGQgZXZlbiBmaXggYSBodW5nIFNDU0kgYnVzIHdoZW4gd2UgbG9zZSBzdGF0ZQorCSAqIGluIHRoZSBkcml2ZXIgYW5kIHRpbWVvdXQgYmVjYXVzZSB0aGUgZXZlbnR1YWwgcGhhc2UgY2hhbmdlCisJICogd2lsbCBjYXVzZSB0aGUgRVNQIHRvIChldmVudHVhbGx5KSBnaXZlIGFuIGludGVycnVwdC4KKwkgKi8KKwlpZihlc3AtPmN1cnJlbnRfU0MgPT0gU0NwdHIpIHsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gQUJPUlQ7CisJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCWVzcC0+bXNnb3V0X2N0ciA9IDA7CisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9TQVROKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLyogSWYgaXQgaXMgc3RpbGwgaW4gdGhlIGlzc3VlIHF1ZXVlIHRoZW4gd2UgY2FuIHNhZmVseQorCSAqIGNhbGwgdGhlIGNvbXBsZXRpb24gcm91dGluZSBhbmQgcmVwb3J0IGFib3J0IHN1Y2Nlc3MuCisJICovCisJZG9uID0gZXNwLT5kbWFfcG9ydHNfcChlc3ApOworCWlmKGRvbikgeworCQllc3AtPmRtYV9pbnRzX29mZihlc3ApOworCQlzeW5jaHJvbml6ZV9pcnEoZXNwLT5pcnEpOworCX0KKwlpZihlc3AtPmlzc3VlX1NDKSB7CisJCVNjc2lfQ21uZCAqKnByZXYsICp0aGlzOworCQlmb3IocHJldiA9ICgmZXNwLT5pc3N1ZV9TQyksIHRoaXMgPSBlc3AtPmlzc3VlX1NDOworCQkgICAgdGhpczsKKwkJICAgIHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKHRoaXMtPmhvc3Rfc2NyaWJibGUpLAorCQkgICAgdGhpcyA9IChTY3NpX0NtbmQgKikgdGhpcy0+aG9zdF9zY3JpYmJsZSkgeworCQkJaWYodGhpcyA9PSBTQ3B0cikgeworCQkJCSpwcmV2ID0gKFNjc2lfQ21uZCAqKSB0aGlzLT5ob3N0X3NjcmliYmxlOworCQkJCXRoaXMtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCB0aGlzKTsKKwkJCQl0aGlzLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJdGhpcy0+ZG9uZSh0aGlzKTsKKwkJCQlpZihkb24pCisJCQkJCWVzcC0+ZG1hX2ludHNfb24oZXNwKTsKKwkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCX0KKwkJfQorCX0KKworCS8qIFl1Y2ssIHRoZSBjb21tYW5kIHRvIGFib3J0IGlzIGRpc2Nvbm5lY3RlZCwgaXQgaXMgbm90CisJICogd29ydGggdHJ5aW5nIHRvIGFib3J0IGl0IG5vdyBpZiBzb21ldGhpbmcgZWxzZSBpcyBsaXZlCisJICogb24gdGhlIGJ1cyBhdCB0aGlzIHRpbWUuICBTbywgd2UgbGV0IHRoZSBTQ1NJIGNvZGUgd2FpdAorCSAqIGEgbGl0dGxlIGJpdCBhbmQgdHJ5IGFnYWluIGxhdGVyLgorCSAqLworCWlmKGVzcC0+Y3VycmVudF9TQykgeworCQlpZihkb24pCisJCQllc3AtPmRtYV9pbnRzX29uKGVzcCk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyogSXQncyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHJlLWVzdGFibGlzaAorCSAqIHRoZSBuZXh1cyBhbmQgdGVsbCB0aGUgZGV2aWNlIHRvIGFib3J0LiAgSG93ZXZlciwgd2UgcmVhbGx5CisJICogY2Fubm90ICdyZWNvbm5lY3QnIHBlciBzZS4gIERvbid0IHRyeSB0byBiZSBmYW5jeSwganVzdAorCSAqIGluZGljYXRlIGZhaWx1cmUsIHdoaWNoIGNhdXNlcyBvdXIgY2FsbGVyIHRvIHJlc2V0IHRoZSB3aG9sZQorCSAqIGJ1cy4KKwkgKi8KKworCWlmKGRvbikKKwkJZXNwLT5kbWFfaW50c19vbihlc3ApOworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qIFdlJ3ZlIHNlbnQgRVNQX0NNRF9SUyB0byB0aGUgRVNQLCB0aGUgaW50ZXJydXB0IGhhZCBqdXN0CisgKiBhcnJpdmVkIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgU0NTSSBidXMgcmVzZXQuICBPdXIgam9iCisgKiBpcyB0byBjbGVhbiBvdXQgdGhlIGNvbW1hbmQgcXVldWVzIGFuZCBiZWdpbiByZS1leGVjdXRpb24KKyAqIG9mIFNDU0kgY29tbWFuZHMgb25jZSBtb3JlLgorICovCitzdGF0aWMgaW50IGVzcF9maW5pc2hfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCSAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqc3AgPSBlc3AtPmN1cnJlbnRfU0M7CisKKwkvKiBDbGVhbiB1cCBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQsIGlmIGFueS4gKi8KKwlpZiAoc3AgIT0gTlVMTCkgeworCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgc3ApOworCQlzcC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCXNwLT5zY3NpX2RvbmUoc3ApOworCQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOworCX0KKworCS8qIENsZWFuIHVwIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgdGhleSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQKKwkgKiBieSB0aGUgYnVzIHJlc2V0LgorCSAqLworCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQykgeworCQl3aGlsZSgoc3AgPSByZW1vdmVfZmlyc3RfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDKSkgIT0gTlVMTCkgeworCQkJZXNwX3JlbGVhc2VfZG1hYnVmcyhlc3AsIHNwKTsKKwkJCXNwLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJCXNwLT5zY3NpX2RvbmUoc3ApOworCQl9CisJfQorCisJLyogU0NTSSBidXMgcmVzZXQgaXMgY29tcGxldGUuICovCisJZXNwLT5yZXNldHRpbmdfYnVzID0gMDsKKwl3YWtlX3VwKCZlc3AtPnJlc2V0X3F1ZXVlKTsKKworCS8qIE9rLCBub3cgaXQgaXMgc2FmZSB0byBnZXQgY29tbWFuZHMgZ29pbmcgb25jZSBtb3JlLiAqLworCWlmKGVzcC0+aXNzdWVfU0MpCisJCWVzcF9leGVjX2NtZChlc3ApOworCisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19yZXNldGJ1cyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlFU1BMT0coKCJlc3AlZDogUmVzZXR0aW5nIHNjc2kgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOworCWVzcC0+cmVzZXR0aW5nX2J1cyA9IDE7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1JTKTsKKworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogUmVzZXQgRVNQIGNoaXAsIHJlc2V0IGhhbmdpbmcgYnVzLCB0aGVuIGtpbGwgYWN0aXZlIGFuZAorICogZGlzY29ubmVjdGVkIGNvbW1hbmRzIGZvciB0YXJnZXRzIHdpdGhvdXQgc29mdCByZXNldC4KKyAqCisgKiBUaGUgaG9zdF9sb2NrIGlzIGFjcXVpcmVkIGJ5IGNhbGxlci4KKyAqLworaW50IGVzcF9yZXNldChTY3NpX0NtbmQgKlNDcHRyKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkodm9pZCkgZXNwX2RvX3Jlc2V0YnVzKGVzcCwgZXNwLT5lcmVncyk7CisKKwlzcGluX3VubG9ja19pcnEoZXNwLT5laG9zdC0+aG9zdF9sb2NrKTsKKworCXdhaXRfZXZlbnQoZXNwLT5yZXNldF9xdWV1ZSwgKGVzcC0+cmVzZXR0aW5nX2J1cyA9PSAwKSk7CisKKwlzcGluX2xvY2tfaXJxKGVzcC0+ZWhvc3QtPmhvc3RfbG9jayk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogSW50ZXJuYWwgRVNQIGRvbmUgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCBlc3BfZG9uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZXJyb3IpCit7CisJU2NzaV9DbW5kICpkb25lX1NDOworCisJaWYoZXNwLT5jdXJyZW50X1NDKSB7CisJCWRvbmVfU0MgPSBlc3AtPmN1cnJlbnRfU0M7CisJCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7CisJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBkb25lX1NDKTsKKwkJZG9uZV9TQy0+cmVzdWx0ID0gZXJyb3I7CisJCWRvbmVfU0MtPnNjc2lfZG9uZShkb25lX1NDKTsKKworCQkvKiBCdXMgaXMgZnJlZSwgaXNzdWUgYW55IGNvbW1hbmRzIGluIHRoZSBxdWV1ZS4gKi8KKwkJaWYoZXNwLT5pc3N1ZV9TQyAmJiAhZXNwLT5jdXJyZW50X1NDKQorCQkJZXNwX2V4ZWNfY21kKGVzcCk7CisJfSBlbHNlIHsKKwkJLyogUGFuaWMgaXMgc2FmZSBhcyBjdXJyZW50X1NDIGlzIG51bGwgc28gd2UgbWF5IHN0aWxsCisJCSAqIGJlIGFibGUgdG8gYWNjZXB0IG1vcmUgY29tbWFuZHMgdG8gc3luYyBkaXNrIGJ1ZmZlcnMuCisJCSAqLworCQlFU1BMT0coKCJwYW5pY2luZ1xuIikpOworCQlwYW5pYygiZXNwOiBkb25lKCkgY2FsbGVkIHdpdGggTlVMTCBlc3AtPmN1cnJlbnRfU0MiKTsKKwl9Cit9CisKKy8qIFdoZWVlLCBFU1AgaW50ZXJydXB0IGVuZ2luZS4gKi8gIAorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3BoYXNlX2RldGVybWluZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCAKKwkJCQkgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOworc3RhdGljIGludCBlc3BfZG9fZGF0YV9maW5hbGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitzdGF0aWMgaW50IGVzcF9zZWxlY3RfY29tcGxldGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitzdGF0aWMgaW50IGVzcF9kb19zdGF0dXMoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitzdGF0aWMgaW50IGVzcF9kb19tc2dpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ2luZG9uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ291dChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKK3N0YXRpYyBpbnQgZXNwX2RvX2NtZGJlZ2luKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOworCisjZGVmaW5lIHNyZWdfZGF0YWlucChfX3NyZWcpICAoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ESVApCisjZGVmaW5lIHNyZWdfZGF0YW91dHAoX19zcmVnKSAoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApCisKKy8qIFdlIHRyeSB0byBhdm9pZCBzb21lIGludGVycnVwdHMgYnkganVtcGluZyBhaGVhZCBhbmQgc2VlIGlmIHRoZSBFU1AKKyAqIGhhcyBnb3R0ZW4gZmFyIGVub3VnaCB5ZXQuICBIZW5jZSB0aGUgZm9sbG93aW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBza2lwYWhlYWQxKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICAgIFNjc2lfQ21uZCAqc2NwLCBpbnQgcHJldl9waGFzZSwgaW50IG5ld19waGFzZSkKK3sKKwlpZihzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZSkKKwkJcmV0dXJuIDA7CisKKwlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7CisJCS8qIFllcywgd2UgYXJlIGFibGUgdG8gc2F2ZSBhbiBpbnRlcnJ1cHQuICovCisJCWVzcC0+c3JlZyA9IChlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykgJiB+KEVTUF9TVEFUX0lOVFIpKTsKKwkJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworCQlpZighKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKSkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gZG9fcmVzZXRfY29tcGxldGU7CisJfQorCS8qIEhvIGh1bSwgdGFyZ2V0IGlzIHRha2luZyBmb3JldmVyLi4uICovCisJc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gbmV3X3BoYXNlOyAvKiBzbyB3ZSBkb24ndCByZWN1cnNlLi4uICovCisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2lwYWhlYWQyKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkgICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICAgIFNjc2lfQ21uZCAqc2NwLCBpbnQgcHJldl9waGFzZTEsIGludCBwcmV2X3BoYXNlMiwKKwkJCSAgICAgaW50IG5ld19waGFzZSkKK3sKKwlpZihzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTEgJiYKKwkgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTIpCisJCXJldHVybiAwOworCWlmKGVzcC0+ZG1hX2lycV9wKGVzcCkpIHsKKwkJLyogWWVzLCB3ZSBhcmUgYWJsZSB0byBzYXZlIGFuIGludGVycnVwdC4gKi8KKwkJZXNwLT5zcmVnID0gKGVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKSAmIH4oRVNQX1NUQVRfSU5UUikpOworCQllc3AtPmlyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7CisJCWlmKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBkb19yZXNldF9jb21wbGV0ZTsKKwl9CisJLyogSG8gaHVtLCB0YXJnZXQgaXMgdGFraW5nIGZvcmV2ZXIuLi4gKi8KKwlzY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBuZXdfcGhhc2U7IC8qIHNvIHdlIGRvbid0IHJlY3Vyc2UuLi4gKi8KKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIE1pc2MuIGVzcCBoZWxwZXIgbWFjcm9zLiAqLworI2RlZmluZSBlc3Bfc2V0Y291bnQoX19lcmVncywgX19jbnQpIFwKKwllc3Bfd3JpdGUoKF9fZXJlZ3MpLT5lc3BfdGNsb3csICgoX19jbnQpICYgMHhmZikpOyBcCisJZXNwX3dyaXRlKChfX2VyZWdzKS0+ZXNwX3RjbWVkLCAoKChfX2NudCkgPj4gOCkgJiAweGZmKSkKKworI2RlZmluZSBlc3BfZ2V0Y291bnQoX19lcmVncykgXAorCSgoZXNwX3JlYWQoKF9fZXJlZ3MpLT5lc3BfdGNsb3cpJjB4ZmYpIHwgXAorCSAoKGVzcF9yZWFkKChfX2VyZWdzKS0+ZXNwX3RjbWVkKSYweGZmKSA8PCA4KSkKKworI2RlZmluZSBmY291bnQoX19lc3AsIF9fZXJlZ3MpIFwKKwkoZXNwX3JlYWQoKF9fZXJlZ3MpLT5lc3BfZmZsYWdzKSAmIEVTUF9GRl9GQllURVMpCisKKyNkZWZpbmUgZm56ZXJvKF9fZXNwLCBfX2VyZWdzKSBcCisJKGVzcF9yZWFkKChfX2VyZWdzKS0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfT05PVFpFUk8pCisKKy8qIFhYWCBzcGVjdWxhdGl2ZSBub3BzIHVubmVjZXNzYXJ5IHdoZW4gY29udGludWluZyBhbWlkc3QgYSBkYXRhIHBoYXNlCisgKiBYWFggZXZlbiBvbiBlc3AxMDAhISEgIGFub3RoZXIgY2FzZSBvZiBmbG9vZGluZyB0aGUgYnVzIHdpdGggSS9PIHJlZworICogWFhYIHdyaXRlcy4uLgorICovCisjZGVmaW5lIGVzcF9tYXliZV9ub3AoX19lc3AsIF9fZXJlZ3MpIFwKKwlpZigoX19lc3ApLT5lcmV2ID09IGVzcDEwMCkgXAorCQllc3BfY21kKChfX2VzcCksIChfX2VyZWdzKSwgRVNQX0NNRF9OVUxMKQorCisjZGVmaW5lIHNyZWdfdG9fZGF0YXBoYXNlKF9fc3JlZykgXAorCSgoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApID8gaW5fZGF0YW91dCA6IGluX2RhdGFpbikKKworLyogVGhlIEVTUDEwMCB3aGVuIGluIHN5bmNocm9ub3VzIGRhdGEgcGhhc2UsIGNhbiBtaXN0YWtlIGEgbG9uZyBmaW5hbAorICogUkVRIHB1bHNlIGZyb20gdGhlIHRhcmdldCBhcyBhbiBleHRyYSBieXRlLCBpdCBwbGFjZXMgd2hhdGV2ZXIgaXMgb24KKyAqIHRoZSBkYXRhIGxpbmVzIGludG8gdGhlIGZpZm8uICBGb3Igbm93LCB3ZSB3aWxsIGFzc3VtZSB3aGVuIHRoaXMKKyAqIGhhcHBlbnMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgYml0IHF1aXJreSBhbmQgd2UgZG9uJ3Qgd2FudCB0bworICogYmUgdGFsa2luZyBzeW5jaHJvbm91c2x5IHRvIGl0IGFueXdheXMuICBSZWdhcmRsZXNzLCB3ZSBuZWVkIHRvCisgKiB0ZWxsIHRoZSBFU1AgdG8gZWF0IHRoZSBleHRyYW5lb3VzIGJ5dGUgc28gdGhhdCB3ZSBjYW4gcHJvY2VlZAorICogdG8gdGhlIG5leHQgcGhhc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVzcDEwMF9zeW5jX2h3YnVnKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkJICAgIFNjc2lfQ21uZCAqc3AsIGludCBmaWZvY250KQoreworCS8qIERvIG5vdCB0b3VjaCB0aGlzIHBpZWNlIG9mIGNvZGUuICovCisJaWYoKCEoZXNwLT5lcmV2ID09IGVzcDEwMCkpIHx8CisJICAgKCEoc3JlZ19kYXRhaW5wKChlc3AtPnNyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykpKSAmJiAhZmlmb2NudCkgJiYKKwkgICAgIShzcmVnX2RhdGFvdXRwKGVzcC0+c3JlZykgJiYgIWZuemVybyhlc3AsIGVyZWdzKSkpKSB7CisJCWlmKHNwLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKKwkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIEFzeW5jIG1vZGUgZm9yIHRoaXMgZ3V5LiAqLworCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisKKwkJLyogQWNrIHRoZSBib2d1cyBieXRlLCBidXQgc2V0IEFUTiBmaXJzdC4gKi8KKwkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiBUaGlzIGNsb3NlcyB0aGUgd2luZG93IGR1cmluZyBhIHNlbGVjdGlvbiB3aXRoIGEgcmVzZWxlY3QgcGVuZGluZywgYmVjYXVzZQorICogd2UgdXNlIERNQSBmb3IgdGhlIHNlbGVjdGlvbiBwcm9jZXNzIHRoZSBGSUZPIHNob3VsZCBob2xkIHRoZSBjb3JyZWN0CisgKiBjb250ZW50cyBpZiB3ZSBnZXQgcmVzZWxlY3RlZCBkdXJpbmcgdGhpcyBwcm9jZXNzLiAgU28gd2UganVzdCBuZWVkIHRvCisgKiBhY2sgdGhlIHBvc3NpYmxlIGlsbGVnYWwgY21kIGludGVycnVwdCBwZW5kaW5nIG9uIHRoZSBlc3AxMDAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQkJIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJdm9sYXRpbGUgdW5jaGFyIGp1bms7CisKKwlpZihlc3AtPmVyZXYgIT0gZXNwMTAwKQorCQlyZXR1cm4gMDsKKwlqdW5rID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworCisJaWYoanVuayAmIEVTUF9JTlRSX1NSKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyB2ZXJpZmllcyB0aGUgQlVTSUQgYml0cyBkdXJpbmcgYSByZXNlbGVjdGlvbiBzbyB0aGF0IHdlIGtub3cgd2hpY2gKKyAqIHRhcmdldCBpcyB0YWxraW5nIHRvIHVzLgorICovCitzdGF0aWMgaW5saW5lIGludCByZWNvbm5lY3RfdGFyZ2V0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJaW50IGl0LCBtZSA9IGVzcC0+c2NzaV9pZF9tYXNrLCB0YXJnID0gMDsKKworCWlmKDIgIT0gZmNvdW50KGVzcCwgZXJlZ3MpKQorCQlyZXR1cm4gLTE7CisJaXQgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKwlpZighKGl0ICYgbWUpKQorCQlyZXR1cm4gLTE7CisJaXQgJj0gfm1lOworCWlmKGl0ICYgKGl0IC0gMSkpCisJCXJldHVybiAtMTsKKwl3aGlsZSghKGl0ICYgMSkpCisJCXRhcmcrKywgaXQgPj49IDE7CisJcmV0dXJuIHRhcmc7Cit9CisKKy8qIFRoaXMgdmVyaWZpZXMgdGhlIGlkZW50aWZ5IGZyb20gdGhlIHRhcmdldCBzbyB0aGF0IHdlIGtub3cgd2hpY2ggbHVuIGlzCisgKiBiZWluZyByZWNvbm5lY3RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmVjb25uZWN0X2x1bihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWludCBsdW47CisKKwlpZigoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spICE9IEVTUF9NSVApCisJCXJldHVybiAtMTsKKwlsdW4gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKworCS8qIFllcywgeW91IHJlYWQgdGhpcyBjb3JyZWN0bHkuICBXZSByZXBvcnQgbHVuIG9mIHplcm8KKwkgKiBpZiB3ZSBzZWUgcGFyaXR5IGVycm9yLiAgRVNQIHJlcG9ydHMgcGFyaXR5IGVycm9yIGZvcgorCSAqIHRoZSBsdW4gYnl0ZSwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGhvcGUgdG8gcmVjb3ZlcgorCSAqIGJlY2F1c2UgdGhlIHRhcmdldCBpcyBjb25uZWN0ZWQuCisJICovCisJaWYoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBmb3IgaWxsZWdhbCBiaXRzIGJlaW5nIHNldCBpbiB0aGUgbHVuLiAqLworCWlmKChsdW4gJiAweDQwKSB8fCAhKGx1biAmIDB4ODApKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbHVuICYgNzsKK30KKworLyogVGhpcyBwdXRzIHRoZSBkcml2ZXIgaW4gYSBzdGF0ZSB3aGVyZSBpdCBjYW4gcmV2aXRhbGl6ZSBhIGNvbW1hbmQgdGhhdAorICogaXMgYmVpbmcgY29udGludWVkIGR1ZSB0byByZXNlbGVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9jb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MsCisJCQkgICAgICAgU2NzaV9DbW5kICpzcCkKK3sKKwlTY3NpX0RldmljZSAqZHAgPSBzcC0+ZGV2aWNlOworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gZHAtPmhvc3RkYXRhOworCisJaWYoZXNwLT5wcmV2X3NvZmYgICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCSAgIGVzcC0+cHJldl9zdHAgICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKKwkgICAoZXNwLT5lcmV2ID4gZXNwMTAwYSAmJgorCSAgICBlc3AtPnByZXZfY2ZnMyAhPSBlc3AtPmNvbmZpZzNbc3AtPmRldmljZS0+aWRdKSkgeworCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOworCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIGVzcC0+cHJldl9zdHApOworCQlpZihlc3AtPmVyZXYgPiBlc3AxMDBhKSB7CisJCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1tzcC0+ZGV2aWNlLT5pZF07CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7CisJCX0gCisJfQorCWVzcC0+Y3VycmVudF9TQyA9IHNwOworfQorCisvKiBUaGlzIHdpbGwgcGxhY2UgdGhlIGN1cnJlbnQgd29ya2luZyBjb21tYW5kIGJhY2sgaW50byB0aGUgaXNzdWUgcXVldWUKKyAqIGlmIHdlIGFyZSB0byByZWNlaXZlIGEgcmVzZWxlY3Rpb24gYW1pZHN0IGEgc2VsZWN0aW9uIGF0dGVtcHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcmVjb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJaWYoIWVzcC0+ZGlzY29ubmVjdGVkX1NDKQorCQlFU1BMT0coKCJlc3AlZDogV2VpcmQsIGJlaW5nIHJlc2VsZWN0ZWQgYnV0IGRpc2Nvbm5lY3RlZCAiCisJCQkiY29tbWFuZCBxdWV1ZSBpcyBlbXB0eS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJZXNwLT5zbmlwID0gMDsKKwllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOworCXNwLT5TQ3AucGhhc2UgPSBub3RfaXNzdWVkOworCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgc3ApOworfQorCisvKiBCZWdpbiBtZXNzYWdlIGluIHBoYXNlLiAqLworc3RhdGljIGludCBlc3BfZG9fbXNnaW4oc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCWVzcF9tYXliZV9ub3AoZXNwLCBlcmVncyk7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKKwllc3AtPm1zZ2luX2xlbiA9IDE7CisJZXNwLT5tc2dpbl9jdHIgPSAwOworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW5kb25lKTsKKwlyZXR1cm4gZG9fd29ya19idXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHZhbmNlX3NnKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJKytzcC0+U0NwLmJ1ZmZlcjsKKwktLXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwlzcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBzcC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCWlmIChlc3AtPmRtYV9hZHZhbmNlX3NnKQorCQllc3AtPmRtYV9hZHZhbmNlX3NnIChzcCk7CisJZWxzZQorCQlzcC0+U0NwLnB0ciA9IChjaGFyICopIHZpcnRfdG9fcGh5cygocGFnZV9hZGRyZXNzKHNwLT5TQ3AuYnVmZmVyLT5wYWdlKSArIHNwLT5TQ3AuYnVmZmVyLT5vZmZzZXQpKTsKKworfQorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB3YXkgSSd2ZSBjb2RlZCB0aGVzZSByb3V0aW5lcyBpcyB0aGF0IEkgX2Fsd2F5c18KKyAqIGNoZWNrIGZvciBhIGRpc2Nvbm5lY3QgZHVyaW5nIGFueSBhbmQgYWxsIGluZm9ybWF0aW9uIHRyYW5zZmVyCisgKiBwaGFzZXMuICBUaGUgU0NTSSBzdGFuZGFyZCBzdGF0ZXMgdGhhdCB0aGUgdGFyZ2V0IF9jYW5fIGNhdXNlIGEgQlVTCisgKiBGUkVFIGNvbmRpdGlvbiBieSBkcm9wcGluZyBhbGwgTVNHL0NEL0lPL0JTWSBzaWduYWxzLiAgQWxzbyBub3RlCisgKiB0aGF0IGR1cmluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMgdGhlIHRhcmdldCBjb250cm9scyBldmVyeQorICogY2hhbmdlIGluIHBoYXNlLCB0aGUgb25seSB0aGluZyB0aGUgaW5pdGlhdG9yIGNhbiBkbyBpcyAiYXNrIiBmb3IKKyAqIGEgbWVzc2FnZSBvdXQgcGhhc2UgYnkgZHJpdmluZyBBVE4gdHJ1ZS4gIFRoZSB0YXJnZXQgY2FuLCBhbmQgc29tZXRpbWVzCisgKiB3aWxsLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHJlcXVlc3Qgc28gd2UgY2Fubm90IGFzc3VtZSBhbnl0aGluZyB3aGVuCisgKiB3ZSB0cnkgdG8gZm9yY2UgYSBtZXNzYWdlIG91dCBwaGFzZSB0byBhYm9ydC9yZXNldCBhIHRhcmdldC4gIE1vc3Qgb2YKKyAqIHRoZSB0aW1lIHRoZSB0YXJnZXQgd2lsbCBldmVudHVhbGx5IGJlIG5pY2UgYW5kIGdvIHRvIG1lc3NhZ2Ugb3V0LCBzbworICogd2UgbWF5IGhhdmUgdG8gaG9sZCBvbiB0byBvdXIgc3RhdGUgYWJvdXQgd2hhdCB3ZSB3YW50IHRvIHRlbGwgdGhlIHRhcmdldAorICogZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCisgKi8KKworLyogSSB0aGluayBJIGhhdmUgdGhpbmdzIHdvcmtpbmcgaGVyZSBjb3JyZWN0bHkuICBFdmVuIHBhcnRpYWwgdHJhbnNmZXJzCisgKiB3aXRoaW4gYSBidWZmZXIgb3Igc3ViLWJ1ZmZlciBzaG91bGQgbm90IHVwc2V0IHVzIGF0IGFsbCBubyBtYXR0ZXIKKyAqIGhvdyBiYWQgdGhlIHRhcmdldCBhbmQvb3IgRVNQIGZ1Y2tzIHRoaW5ncyB1cC4KKyAqLworc3RhdGljIGludCBlc3BfZG9fZGF0YShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IHRoaXNwaGFzZSwgaG11Y2g7CisKKwlFU1BEQVRBKCgiZXNwX2RvX2RhdGE6ICIpKTsKKwllc3BfbWF5YmVfbm9wKGVzcCwgZXJlZ3MpOworCXRoaXNwaGFzZSA9IHNyZWdfdG9fZGF0YXBoYXNlKGVzcC0+c3JlZyk7CisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIHRoaXNwaGFzZSk7CisJRVNQREFUQSgoIm5ld3BoYXNlPCVzPiAiLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikgPyAiREFUQUlOIiA6ICJEQVRBT1VUIikpOworCWhtdWNoID0gZXNwLT5kbWFfY2FuX3RyYW5zZmVyKGVzcCwgU0NwdHIpOworCisJLyoKKwkgKiBYWFggTVNjaDogY2F0ZXIgZm9yIFBJTyB0cmFuc2ZlciBoZXJlOyBQSU8gdXNlZCBpZiBobXVjaCA9PSAwCisJICovCisJaWYgKGhtdWNoKSB7CS8qIERNQSAqLworCQkvKgorCQkgKiBETUEKKwkJICovCisJCUVTUERBVEEoKCJobXVjaDwlZD4gIiwgaG11Y2gpKTsKKwkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKKwkJZXNwX3NldGNvdW50KGVyZWdzLCAoZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA/CisJCQkJICAgICAoaG11Y2ggKyAweDQwKSA6IGhtdWNoKSk7CisJCWVzcC0+ZG1hX3NldHVwKGVzcCwgKF9fdTMyKSgodW5zaWduZWQgbG9uZylTQ3B0ci0+U0NwLnB0ciksIAorCQkJICAgICAgIGhtdWNoLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikpOworCQlFU1BEQVRBKCgiRE1BfFRJIC0tPiBkb19pbnRyX2VuZFxuIikpOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisJCXJldHVybiBkb19pbnRyX2VuZDsKKwkJLyoKKwkJICogZW5kIERNQQorCQkgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBQSU8KKwkJICovCisJCWludCBvbGRwaGFzZSwgaSA9IDA7IC8qIG9yIHdoZXJlIHdlIGxlZnQgb2ZmIGxhc3QgdGltZSA/PyBlc3AtPmN1cnJlbnRfZGF0YSA/PyAqLworCQlpbnQgZmlmb2NudCA9IDA7CisKKwkJb2xkcGhhc2UgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9QTUFTSzsKKworCQkvKgorCQkgKiBwb2xsZWQgdHJhbnNmZXI7IHVnbHksIGNhbiB3ZSBtYWtlIHRoaXMgaGFwcGVuIGluIGEgRFJRIAorCQkgKiBpbnRlcnJ1cHQgaGFuZGxlciA/PworCQkgKiByZXF1aXJlcyBrZWVwaW5nIHRyYWNrIG9mIHN0YXRlIGluZm9ybWF0aW9uIGluIGhvc3Qgb3IgCisJCSAqIGNvbW1hbmQgc3RydWN0IQorCQkgKiBQcm9ibGVtOiBJJ3ZlIG5ldmVyIHNlZW4gYSBEUlEgaGFwcGVuIG9uIE1hYywgbm90IGV2ZW4KKwkJICogd2l0aCBFU1BfQ01EX0RNQSAuLi4KKwkJICovCisKKwkJLyogZmlndXJlIG91dCBob3cgbXVjaCBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCAqLworCQlobXVjaCA9IFNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJRVNQREFUQSgoImhtdWNoPCVkPiBwaW8gIiwgaG11Y2gpKTsKKwkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKKworCQkvKiB0ZWxsIHRoZSBFU1AgLi4uICovCisJCWVzcF9zZXRjb3VudChlcmVncywgaG11Y2gpOworCisJCS8qIGxvb3AgKi8KKwkJd2hpbGUgKGhtdWNoKSB7CisJCQlpbnQgaiwgZmlmb19zdHVjayA9IDAsIG5ld3BoYXNlOworCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZW91dDsKKyNpZiAwCisJCQlpZiAoIGkgJSAxMCApCisJCQkJRVNQREFUQSgoIlxyIikpOworCQkJZWxzZQorCQkJCUVTUERBVEEoKCAvKiJcbiIqLyAiXHIiKSk7CisjZW5kaWYKKyNpZiAwCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisjZW5kaWYKKwkJCWlmKHRoaXNwaGFzZSA9PSBpbl9kYXRhaW4pIHsKKwkJCQkvKiAnZ28nIC4uLiAqLyAKKwkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCisJCQkJLyogd2FpdCBmb3IgZGF0YSAqLworCQkJCXRpbWVvdXQgPSAxMDAwMDAwOworCQkJCXdoaWxlICghKChlc3AtPnNyZWc9ZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpKSAmIEVTUF9TVEFUX0lOVFIpICYmIC0tdGltZW91dCkKKwkJCQkJdWRlbGF5KDIpOworCQkJCWlmICh0aW1lb3V0ID09IDApCisJCQkJCXByaW50aygiRFJRIGRhdGFpbiB0aW1lb3V0ISBcbiIpOworCisJCQkJbmV3cGhhc2UgPSBlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKworCQkJCS8qIHNlZSBob3cgbXVjaCB3ZSBnb3QgLi4uICovCisJCQkJZmlmb2NudCA9IChlc3BfcmVhZChlcmVncy0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfRkJZVEVTKTsKKworCQkJCWlmICghZmlmb2NudCkKKwkJCQkJZmlmb19zdHVjaysrOworCQkJCWVsc2UKKwkJCQkJZmlmb19zdHVjayA9IDA7CisKKwkJCQlFU1BEQVRBKCgiXHJnb3QgJWQgc3QgJXggcGggJXgiLCBmaWZvY250LCBlc3AtPnNyZWcsIG5ld3BoYXNlKSk7CisKKwkJCQkvKiByZWFkIGZpZm8gKi8KKwkJCQlmb3Ioaj0wO2o8Zmlmb2NudDtqKyspCisJCQkJCVNDcHRyLT5TQ3AucHRyW2krK10gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKKworCQkJCUVTUERBVEEoKCIoJWQpICIsIGkpKTsKKworCQkJCS8qIGhvdyBtYW55IHRvIGdvID8/ICovCisJCQkJaG11Y2ggLT0gZmlmb2NudDsKKworCQkJCS8qIGJyZWFrIGlmIHN0YXR1cyBwaGFzZSAhISAqLworCQkJCWlmKG5ld3BoYXNlID09IEVTUF9TVEFUUCkgeworCQkJCQkvKiBjbGVhciBpbnQuICovCisJCQkJCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKyNkZWZpbmUgTUFYX0ZJRk8gOAorCQkJCS8qIGhvdyBtdWNoIHdpbGwgZml0ID8gKi8KKwkJCQlpbnQgdGhpc19jb3VudCA9IE1BWF9GSUZPIC0gZmlmb2NudDsKKwkJCQlpZiAodGhpc19jb3VudCA+IGhtdWNoKQorCQkJCQl0aGlzX2NvdW50ID0gaG11Y2g7CisKKwkJCQkvKiBmaWxsIGZpZm8gKi8KKwkJCQlmb3Ioaj0wO2o8dGhpc19jb3VudDtqKyspCisJCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBTQ3B0ci0+U0NwLnB0cltpKytdKTsKKworCQkJCS8qIGhvdyBtYW55IGxlZnQgaWYgdGhpcyBnb2VzIG91dCA/PyAqLworCQkJCWhtdWNoIC09IHRoaXNfY291bnQ7CisKKwkJCQkvKiAnZ28nIC4uLiAqLyAKKwkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCisJCQkJLyogd2FpdCBmb3IgJ2dvdCBpdCcgKi8KKwkJCQl0aW1lb3V0ID0gMTAwMDAwMDsKKwkJCQl3aGlsZSAoISgoZXNwLT5zcmVnPWVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKSkgJiBFU1BfU1RBVF9JTlRSKSAmJiAtLXRpbWVvdXQpCisJCQkJCXVkZWxheSgyKTsKKwkJCQlpZiAodGltZW91dCA9PSAwKQorCQkJCQlwcmludGsoIkRSUSBkYXRhb3V0IHRpbWVvdXQhICBcbiIpOworCisJCQkJbmV3cGhhc2UgPSBlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKworCQkJCS8qIG5lZWQgdG8gY2hlY2sgaG93IG11Y2ggd2FzIHNlbnQgPz8gKi8KKwkJCQlmaWZvY250ID0gKGVzcF9yZWFkKGVyZWdzLT5lc3BfZmZsYWdzKSAmIEVTUF9GRl9GQllURVMpOworCisJCQkJRVNQREFUQSgoIlxyc2VudCAlZCBzdCAleCBwaCAleCIsIHRoaXNfY291bnQgLSBmaWZvY250LCBlc3AtPnNyZWcsIG5ld3BoYXNlKSk7CisKKwkJCQlFU1BEQVRBKCgiKCVkKSAiLCBpKSk7CisKKwkJCQkvKiBicmVhayBpZiBzdGF0dXMgcGhhc2UgISEgKi8KKwkJCQlpZihuZXdwaGFzZSA9PSBFU1BfU1RBVFApIHsKKwkJCQkJLyogY2xlYXIgaW50LiAqLworCQkJCQllc3AtPmlyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQorCisJCQkvKiBjbGVhciBpbnQuICovCisJCQllc3AtPmlyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7CisKKwkJCUVTUERBVEEoKCJpciAleCAuLi4gIiwgZXNwLT5pcmVnKSk7CisKKwkJCWlmIChobXVjaCA9PSAwKQorCQkJCUVTUERBVEEoKCJkb25lISBcbiIpKTsKKworI2lmIDAKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgorCisJCQkvKiBjaGVjayBuZXcgYnVzIHBoYXNlICovCisJCQlpZiAobmV3cGhhc2UgIT0gb2xkcGhhc2UgJiYgaSA8IGVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplKSB7CisJCQkJLyogc29tZXRoaW5nIGhhcHBlbmVkOyBkaXNjb25uZWN0ID8/ICovCisJCQkJRVNQREFUQSgoInBoYXNlIGNoYW5nZSwgZHJvcHBlZCBvdXQgd2l0aCAlZCBkb25lIC4uLiAiLCBpKSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIGNoZWNrIGludC4gc3RhdHVzICovCisJCQlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpIHsKKwkJCQkvKiBkaXNjb25uZWN0ICovCisJCQkJRVNQREFUQSgoImRpc2Nvbm5lY3Q7ICVkIHRyYW5zZmVycmVkIC4uLiAiLCBpKSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0ZET05FKSB7CisJCQkJLyogZnVuY3Rpb24gZG9uZSAqLworCQkJCUVTUERBVEEoKCJmdW5jdGlvbiBkb25lOyAlZCB0cmFuc2ZlcnJlZCAuLi4gIiwgaSkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBYWFggZml4bWU6IGJhaWwgb3V0IG9uIHN0YWxsICovCisJCQlpZiAoZmlmb19zdHVjayA+IDEwKSB7CisJCQkJLyogd2UncmUgc3R1Y2sgKi8KKwkJCQlFU1BEQVRBKCgiZmlmbyBzdGFsbDsgJWQgdHJhbnNmZXJyZWQgLi4uICIsIGkpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCUVTUERBVEEoKCJcbiIpKTsKKwkJLyogY2hlY2sgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uID8/ICovCisKKwkJaWYgKHRoaXNwaGFzZSA9PSBpbl9kYXRhb3V0KQorCQkJaG11Y2ggKz0gZmlmb2NudDsgLyogc3R1Y2s/PyBhZGp1c3QgZGF0YSBwb2ludGVyIC4uLiovCisKKwkJLyogdGVsbCBkb19kYXRhX2ZpbmFsZSBob3cgbXVjaCB3YXMgdHJhbnNmZXJyZWQgKi8KKwkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgLT0gaG11Y2g7CisKKwkJLyogc3RpbGwgbm90IGNvbXBsZXRlbHkgc3VyZSBvbiB0aGlzIG9uZSAuLi4gKi8JCQorCQlyZXR1cm4gLypkb19pbnRyX2VuZCovIGRvX3dvcmtfYnVzIC8qZG9fcGhhc2VfZGV0ZXJtaW5lKi8gOworCisJCS8qCisJCSAqIGVuZCBQSU8KKwkJICovCisJfQorCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogU2VlIGhvdyBzdWNjZXNzZnVsIHRoZSBkYXRhIHRyYW5zZmVyIHdhcy4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX2RhdGFfZmluYWxlKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkgICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlpbnQgYm9ndXNfZGF0YSA9IDAsIGJ5dGVzX3NlbnQgPSAwLCBmaWZvY250LCBlY291bnQgPSAwOworCisJaWYoZXNwLT5kbWFfbGVkX29mZikKKwkJZXNwLT5kbWFfbGVkX29mZihlc3ApOworCisJRVNQREFUQSgoImVzcF9kb19kYXRhX2ZpbmFsZTogIikpOworCisJaWYoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhaW4pIHsKKwkJaWYoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikgeworCQkJLyogWXVjaywgcGFyaXR5IGVycm9yLiAgVGhlIEVTUCBhc3NlcnRzIEFUTgorCQkJICogc28gdGhhdCB3ZSBjYW4gZ28gdG8gbWVzc2FnZSBvdXQgcGhhc2UKKwkJCSAqIGltbWVkaWF0ZWx5IGFuZCBpbmZvcm0gdGhlIHRhcmdldCB0aGF0CisJCQkgKiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorCQkJICovCisJCQlFU1BMT0coKCJlc3AlZDogZGF0YSBiYWQgcGFyaXR5IGRldGVjdGVkLlxuIiwKKwkJCQllc3AtPmVzcF9pZCkpOworCQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gSU5JVElBVE9SX0VSUk9SOworCQkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJfQorCQlpZihlc3AtPmRtYV9kcmFpbikKKwkJCWVzcC0+ZG1hX2RyYWluKGVzcCk7CisJfQorCWlmKGVzcC0+ZG1hX2ludmFsaWRhdGUpCisJCWVzcC0+ZG1hX2ludmFsaWRhdGUoZXNwKTsKKworCS8qIFRoaXMgY291bGQgaGFwcGVuIGZvciB0aGUgYWJvdmUgcGFyaXR5IGVycm9yIGNhc2UuICovCisJaWYoIShlc3AtPmlyZWcgPT0gRVNQX0lOVFJfQlNFUlYpKSB7CisJCS8qIFBsZWFzZSBnbyB0byBtc2dvdXQgcGhhc2UsIHBsZWFzZSBwbGVhc2UgcGxlYXNlLi4uICovCisJCUVTUExPRygoImVzcCVkOiAhQlNFUlYgYWZ0ZXIgZGF0YSwgcHJvYmFibHkgdG8gbXNnb3V0XG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7CisJfQkKKworCS8qIENoZWNrIGZvciBwYXJ0aWFsIHRyYW5zZmVycyBhbmQgb3RoZXIgaG9ycmlibGUgZXZlbnRzLiAqLworCWZpZm9jbnQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUyk7CisJZWNvdW50ID0gZXNwX2dldGNvdW50KGVyZWdzKTsKKwlpZihlc3AtPmZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kKQorCQllY291bnQgLT0gMHg0MDsKKwlieXRlc19zZW50ID0gZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemU7CisKKwlFU1BEQVRBKCgidHJhbnNfc3o9JWQsICIsIGJ5dGVzX3NlbnQpKTsKKwlpZighKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1RDTlQpKQorCQlieXRlc19zZW50IC09IGVjb3VudDsKKwlpZihTQ3B0ci0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpCisJCWJ5dGVzX3NlbnQgLT0gZmlmb2NudDsKKworCUVTUERBVEEoKCJieXRlc19zZW50PSVkIChlY291bnQ9JWQsIGZpZm9jbnQ9JWQpLCAiLCBieXRlc19zZW50LAorCQkgZWNvdW50LCBmaWZvY250KSk7CisKKwkvKiBJZiB3ZSB3ZXJlIGluIHN5bmNocm9ub3VzIG1vZGUsIGNoZWNrIGZvciBwZWN1bGlhcml0aWVzLiAqLworCWlmKGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkKKwkJYm9ndXNfZGF0YSA9IGVzcDEwMF9zeW5jX2h3YnVnKGVzcCwgZXJlZ3MsIFNDcHRyLCBmaWZvY250KTsKKwllbHNlCisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisKKwkvKiBVbnRpbCB3ZSBhcmUgc3VyZSBvZiB3aGF0IGhhcyBoYXBwZW5lZCwgd2UgYXJlIGNlcnRhaW5seQorCSAqIGluIHRoZSBkYXJrLgorCSAqLworCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisKKwkvKiBDaGVjayBmb3IgcHJlbWF0dXJlIGludGVycnVwdCBjb25kaXRpb24uIENhbiBoYXBwZW4gb24gRkFTMng2CisJICogY2hpcHMuIFFMb2dpYyByZWNvbW1lbmRzIGEgd29ya2Fyb3VuZCBieSBvdmVycHJvZ3JhbW1pbmcgdGhlCisJICogdHJhbnNmZXIgY291bnRlcnMsIGJ1dCB0aGlzIG1ha2VzIGRvaW5nIHNjYXR0ZXItZ2F0aGVyIGltcG9zc2libGUuCisJICogVW50aWwgdGhlcmUgaXMgYSB3YXkgdG8gZGlzYWJsZSBzY2F0dGVyLWdhdGhlciBmb3IgYSBzaW5nbGUgdGFyZ2V0LAorCSAqIGFuZCBub3Qgb25seSBmb3IgdGhlIGVudGlyZSBob3N0IGFkYXB0ZXIgYXMgaXQgaXMgbm93LCB0aGUgd29ya2Fyb3VuZAorCSAqIGlzIHdheSB0byBleHBlbnNpdmUgcGVyZm9ybWFuY2Ugd2lzZS4KKwkgKiBJbnN0ZWFkLCBpdCB0dXJucyBvdXQgdGhhdCB3aGVuIHRoaXMgaGFwcGVucyB0aGUgdGFyZ2V0IGhhcyBkaXNjb25uZWN0ZWQKKwkgKiBhbHJlYWR5IGJ1dCBpdCBkb2Vzbid0IHNob3cgaW4gdGhlIGludGVycnVwdCByZWdpc3Rlci4gQ29tcGVuc2F0ZSBmb3IKKwkgKiB0aGF0IGhlcmUgdG8gdHJ5IGFuZCBhdm9pZCBhIFNDU0kgYnVzIHJlc2V0LgorCSAqLworCWlmKCFlc3AtPmZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kICYmIChmaWZvY250ID09IDEpICYmCisJICAgc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpKSB7CisJCUVTUExPRygoImVzcCVkOiBQcmVtYXR1cmUgaW50ZXJydXB0LCBlbmFibGluZyB3b3JrYXJvdW5kXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKyNpZiAwCisJCS8qIERpc2FibGUgc2NhdHRlci1nYXRoZXIgb3BlcmF0aW9ucywgdGhleSBhcmUgbm90IHBvc3NpYmxlCisJCSAqIHdoZW4gdXNpbmcgdGhpcyB3b3JrYXJvdW5kLgorCQkgKi8KKwkJZXNwLT5laG9zdC0+c2dfdGFibGVzaXplID0gMDsKKwkJZXNwLT5laG9zdC0+dXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORzsKKwkJZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA9IDE7CisJCWJ5dGVzX3NlbnQgPSAwOworCQlpZihTQ3B0ci0+dXNlX3NnKSB7CisJCQlFU1BMT0coKCJlc3AlZDogQWJvcnRpbmcgc2NhdHRlci1nYXRoZXIgb3BlcmF0aW9uXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBBQk9SVDsKKwkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCQllc3AtPm1zZ291dF9jdHIgPSAwOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOworCQkJZXNwX3NldGNvdW50KGVyZWdzLCAweGZmZmYpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RQQUQgfCBFU1BfQ01EX0RNQSk7CisJCQlyZXR1cm4gZG9faW50cl9lbmQ7CisJCX0KKyNlbHNlCisJCS8qIEp1c3Qgc2V0IHRoZSBkaXNjb25uZWN0ZWQgYml0LiBUaGF0J3Mgd2hhdCBhcHBlYXJzIHRvCisJCSAqIGhhcHBlbiBhbnl3YXkuIFRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgcGljayBpdCB1cCB3aGVuCisJCSAqIHdlIHJldHVybi4KKwkJICovCisJCWVzcC0+aXJlZyB8PSBFU1BfSU5UUl9EQzsKKyNlbmRpZgorICAgICAgICB9CisKKwlpZihieXRlc19zZW50IDwgMCkgeworCQkvKiBJJ3ZlIHNlZW4gdGhpcyBoYXBwZW4gZHVlIHRvIGxvc3Qgc3RhdGUgaW4gdGhpcworCQkgKiBkcml2ZXIuICBObyBpZGVhIHdoeSBpdCBoYXBwZW5lZCwgYnV0IGFsbG93aW5nCisJCSAqIHRoaXMgdmFsdWUgdG8gYmUgbmVnYXRpdmUgY2F1c2VkIHRoaW5ncyB0bworCQkgKiBsb2NrIHVwLiAgVGhpcyBhbGxvd3MgZ3JlYXRlciBjaGFuY2Ugb2YgcmVjb3ZlcnkuCisJCSAqIEluIGZhY3QgZXZlcnkgdGltZSBJJ3ZlIHNlZW4gdGhpcywgaXQgaGFzIGJlZW4KKwkJICogYSBkcml2ZXIgYnVnIHdpdGhvdXQgcXVlc3Rpb24uCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogeWllZWUsIGJ5dGVzX3NlbnQgPCAwIVxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJRVNQTE9HKCgiZXNwJWQ6IGNzej0lZCBmaWZvY291bnQ9JWQgZWNvdW50PSVkXG4iLAorCQkJZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cnJlbnRfdHJhbnNmZXJfc2l6ZSwgZmlmb2NudCwgZWNvdW50KSk7CisJCUVTUExPRygoImVzcCVkOiB1c2Vfc2c9JWQgcHRyPSVwIHRoaXNfcmVzaWR1YWw9JWRcbiIsCisJCQllc3AtPmVzcF9pZCwKKwkJCVNDcHRyLT51c2Vfc2csIFNDcHRyLT5TQ3AucHRyLCBTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwpKTsKKwkJRVNQTE9HKCgiZXNwJWQ6IEZvcmNpbmcgYXN5bmMgZm9yIHRhcmdldCAlZFxuIiwgZXNwLT5lc3BfaWQsIAorCQkJU0NwdHItPmRldmljZS0+aWQpKTsKKwkJU0NwdHItPmRldmljZS0+Ym9ya2VuID0gMTsKKwkJZXNwX2Rldi0+c3luYyA9IDA7CisJCWJ5dGVzX3NlbnQgPSAwOworCX0KKworCS8qIFVwZGF0ZSB0aGUgc3RhdGUgb2Ygb3VyIHRyYW5zZmVyLiAqLworCVNDcHRyLT5TQ3AucHRyICs9IGJ5dGVzX3NlbnQ7CisJU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsIC09IGJ5dGVzX3NlbnQ7CisJaWYoU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsIDwgMCkgeworCQkvKiBzaGl0ICovCisJCUVTUExPRygoImVzcCVkOiBEYXRhIHRyYW5zZmVyIG92ZXJydW4uXG4iLCBlc3AtPmVzcF9pZCkpOworCQlTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgPSAwOworCX0KKworCS8qIE1heWJlIGNvbnRpbnVlLiAqLworCWlmKCFib2d1c19kYXRhKSB7CisJCUVTUERBVEEoKCIhYm9ndXNfZGF0YSwgIikpOworCQkvKiBOTyBNQVRURVIgV0hBVCwgd2UgYWR2YW5jZSB0aGUgc2NhdHRlcmxpc3QsCisJCSAqIGlmIHRoZSB0YXJnZXQgc2hvdWxkIGRlY2lkZSB0byBkaXNjb25uZWN0CisJCSAqIGluIGJldHdlZW4gc2NhdHRlciBjaHVua3MgKHdoaWNoIGlzIGNvbW1vbikKKwkJICogd2UgY291bGQgZGllIGhvcnJpYmx5ISAgSSB1c2VkIHRvIGhhdmUgdGhlIHNnCisJCSAqIGFkdmFuY2Ugb2NjdXIgb25seSBpZiB3ZSBhcmUgZ29pbmcgYmFjayBpbnRvCisJCSAqIChvciBhcmUgc3RheWluZyBpbikgYSBkYXRhIHBoYXNlLCB5b3UgY2FuCisJCSAqIGltYWdpbmUgdGhlIGhlbGwgSSB3ZW50IHRocm91Z2ggdHJ5aW5nIHRvCisJCSAqIGZpZ3VyZSB0aGlzIG91dC4KKwkJICovCisJCWlmKCFTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgU0NwdHItPlNDcC5idWZmZXJzX3Jlc2lkdWFsKQorCQkJYWR2YW5jZV9zZyhlc3AsIFNDcHRyKTsKKyNpZmRlZiBERUJVR19FU1BfREFUQQorCQlpZihzcmVnX2RhdGFpbnAoZXNwLT5zcmVnKSB8fCBzcmVnX2RhdGFvdXRwKGVzcC0+c3JlZykpIHsKKwkJCUVTUERBVEEoKCJ0byBtb3JlIGRhdGFcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCUVTUERBVEEoKCJ0byBuZXcgcGhhc2VcbiIpKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOworCX0KKwkvKiBCb2d1cyBkYXRhLCBqdXN0IHdhaXQgZm9yIG5leHQgaW50ZXJydXB0LiAqLworCUVTUExPRygoImVzcCVkOiBib2d1c19kYXRhIGR1cmluZyBlbmQgb2YgZGF0YSBwaGFzZVxuIiwKKwkJZXNwLT5lc3BfaWQpKTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKKy8qIFdlIHJlY2VpdmVkIGEgbm9uLWdvb2Qgc3RhdHVzIHJldHVybiBhdCB0aGUgZW5kIG9mCisgKiBydW5uaW5nIGEgU0NTSSBjb21tYW5kLiAgVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSBpZgorICogd2Ugc2hvdWxkIGNsZWFyIG91ciBzeW5jaHJvbm91cyB0cmFuc2ZlciBzdGF0ZSBmb3IKKyAqIHN1Y2ggYSBkZXZpY2Ugd2hlbiB0aGF0IGhhcHBlbnMuCisgKgorICogVGhlIGlkZWEgaXMgdGhhdCB3aGVuIHNwaW5uaW5nIHVwIGEgZGlzayBvciByZXdpbmRpbmcKKyAqIGEgdGFwZSwgd2UgZG9uJ3Qgd2FudCB0byBnbyBpbnRvIGEgbG9vcCByZS1uZWdvdGlhdGluZworICogc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzIG92ZXIgYW5kIG92ZXIuCisgKi8KK3N0YXRpYyBpbnQgZXNwX3Nob3VsZF9jbGVhcl9zeW5jKFNjc2lfQ21uZCAqc3ApCit7CisJdW5jaGFyIGNtZDEgPSBzcC0+Y21uZFswXTsKKwl1bmNoYXIgY21kMiA9IHNwLT5kYXRhX2NtbmRbMF07CisKKwkvKiBUaGVzZSBjYXNlcyBhcmUgZm9yIHNwaW5uaW5nIHVwIGEgZGlzayBhbmQKKwkgKiB3YWl0aW5nIGZvciB0aGF0IHNwaW51cCB0byBjb21wbGV0ZS4KKwkgKi8KKwlpZihjbWQxID09IFNUQVJUX1NUT1AgfHwKKwkgICBjbWQyID09IFNUQVJUX1NUT1ApCisJCXJldHVybiAwOworCisJaWYoY21kMSA9PSBURVNUX1VOSVRfUkVBRFkgfHwKKwkgICBjbWQyID09IFRFU1RfVU5JVF9SRUFEWSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPbmUgbW9yZSBzcGVjaWFsIGNhc2UgZm9yIFNDU0kgdGFwZSBkcml2ZXMsCisJICogdGhpcyBpcyB3aGF0IGlzIHVzZWQgdG8gcHJvYmUgdGhlIGRldmljZSBmb3IKKwkgKiBjb21wbGV0aW9uIG9mIGEgcmV3aW5kIG9yIHRhcGUgbG9hZCBvcGVyYXRpb24uCisJICovCisJaWYoc3AtPmRldmljZS0+dHlwZSA9PSBUWVBFX1RBUEUpIHsKKwkJaWYoY21kMSA9PSBNT0RFX1NFTlNFIHx8CisJCSAgIGNtZDIgPT0gTU9ERV9TRU5TRSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKiBFaXRoZXIgYSBjb21tYW5kIGlzIGNvbXBsZXRpbmcgb3IgYSB0YXJnZXQgaXMgZHJvcHBpbmcgb2ZmIHRoZSBidXMKKyAqIHRvIGNvbnRpbnVlIHRoZSBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGNhbiBkbyBvdGhlciB3b3JrLgorICovCitzdGF0aWMgaW50IGVzcF9kb19mcmVlYnVzKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlpbnQgcnZhbDsKKworCXJ2YWwgPSBza2lwYWhlYWQyKGVzcCwgZXJlZ3MsIFNDcHRyLCBpbl9zdGF0dXMsIGluX21zZ2luZG9uZSwgaW5fZnJlZWluZyk7CisJaWYocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZihlc3AtPmlyZWcgIT0gRVNQX0lOVFJfREMpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IFRhcmdldCB3aWxsIG5vdCBkaXNjb25uZWN0XG4iLCBlc3AtPmVzcF9pZCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOyAvKiB0YXJnZXQgd2lsbCBub3QgZHJvcCBCU1kuLi4gKi8KKwl9CisJZXNwLT5tc2dvdXRfbGVuID0gMDsKKwllc3AtPnByZXZtc2dvdXQgPSBOT1A7CisJaWYoZXNwLT5wcmV2bXNnaW4gPT0gQ09NTUFORF9DT01QTEVURSkgeworCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCQkvKiBOb3JtYWwgZW5kIG9mIG5leHVzLiAqLworCQlpZihlc3AtPmRpc2Nvbm5lY3RlZF9TQykKKwkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9FU0VMKTsKKworCQlpZihTQ3B0ci0+U0NwLlN0YXR1cyAhPSBHT09EICYmCisJCSAgIFNDcHRyLT5TQ3AuU3RhdHVzICE9IENPTkRJVElPTl9HT09EICYmCisJCSAgICgoMTw8U0NwdHItPmRldmljZS0+aWQpICYgZXNwLT50YXJnZXRzX3ByZXNlbnQpICYmCisJCSAgIGVzcF9kZXYtPnN5bmMgJiYgZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7CisJCQkvKiBTQ1NJIHN0YW5kYXJkIHNheXMgdGhhdCB0aGUgc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzCisJCQkgKiBzaG91bGQgYmUgcmVuZWdvdGlhdGVkIGF0IHRoaXMgcG9pbnQuICBNb3N0IGxpa2VseQorCQkJICogd2UgYXJlIGFib3V0IHRvIHJlcXVlc3Qgc2Vuc2UgZnJvbSB0aGlzIHRhcmdldAorCQkJICogaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGF2b2lkIHVzaW5nIHN5bmMKKwkJCSAqIHRyYW5zZmVycyB1bnRpbCB3ZSBhcmUgc3VyZSBvZiB0aGUgY3VycmVudCB0YXJnZXQKKwkJCSAqIHN0YXRlLgorCQkJICovCisJCQlFU1BNSVNDKCgiZXNwOiBTdGF0dXMgPCVkPiBmb3IgdGFyZ2V0ICVkIGx1biAlZFxuIiwKKwkJCQkgU0NwdHItPlNDcC5TdGF0dXMsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKworCQkJLyogQnV0IGRvbid0IGRvIHRoaXMgd2hlbiBzcGlubmluZyB1cCBhIGRpc2sgYXQKKwkJCSAqIGJvb3QgdGltZSB3aGlsZSB3ZSBwb2xsIGZvciBjb21wbGV0aW9uIGFzIGl0CisJCQkgKiBmaWxscyB1cCB0aGUgY29uc29sZSB3aXRoIG1lc3NhZ2VzLiAgQWxzbywgdGFwZXMKKwkJCSAqIGNhbiByZXBvcnQgbm90IHJlYWR5IG1hbnkgdGltZXMgcmlnaHQgYWZ0ZXIKKwkJCSAqIGxvYWRpbmcgdXAgYSB0YXBlLgorCQkJICovCisJCQlpZihlc3Bfc2hvdWxkX2NsZWFyX3N5bmMoU0NwdHIpICE9IDApCisJCQkJZXNwX2Rldi0+c3luYyA9IDA7CisJCX0KKwkJRVNQRElTQygoIkY8JTAyeCwlMDJ4PiIsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJZXNwX2RvbmUoZXNwLCAoKFNDcHRyLT5TQ3AuU3RhdHVzICYgMHhmZikgfAorCQkJICAgICAgICgoU0NwdHItPlNDcC5NZXNzYWdlICYgMHhmZik8PDgpIHwKKwkJCSAgICAgICAoRElEX09LIDw8IDE2KSkpOworCX0gZWxzZSBpZihlc3AtPnByZXZtc2dpbiA9PSBESVNDT05ORUNUKSB7CisJCS8qIE5vcm1hbCBkaXNjb25uZWN0LiAqLworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRVNFTCk7CisJCUVTUERJU0MoKCJEPCUwMngsJTAyeD4iLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCWFwcGVuZF9TQygmZXNwLT5kaXNjb25uZWN0ZWRfU0MsIFNDcHRyKTsKKwkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwkJaWYoZXNwLT5pc3N1ZV9TQykKKwkJCWVzcF9leGVjX2NtZChlc3ApOworCX0gZWxzZSB7CisJCS8qIERyaXZlciBidWcsIHdlIGRvIG5vdCBleHBlY3QgYSBkaXNjb25uZWN0IGhlcmUKKwkJICogYW5kIHNob3VsZCBub3QgaGF2ZSBhZHZhbmNlZCB0aGUgc3RhdGUgZW5naW5lCisJCSAqIHRvIGluX2ZyZWVpbmcuCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogbGFzdCBtc2cgbm90IGRpc2MgYW5kIG5vdCBjbWQgY21wbHQuXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKKwl9CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCisvKiBXaGVuIGEgcmVzZWxlY3Qgb2NjdXJzLCBhbmQgd2UgY2Fubm90IGZpbmQgdGhlIGNvbW1hbmQgdG8KKyAqIHJlY29ubmVjdCB0byBpbiBvdXIgcXVldWVzLCB3ZSBkbyB0aGlzLgorICovCitzdGF0aWMgaW50IGVzcF9iYWRfcmVjb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJU2NzaV9DbW5kICpzcDsKKworCUVTUExPRygoImVzcCVkOiBFaWVlZWUsIHJlY29ubmVjdGluZyB1bmtub3duIGNvbW1hbmQhXG4iLAorCQllc3AtPmVzcF9pZCkpOworCUVTUExPRygoIlFVRVVFIERVTVBcbiIpKTsKKwlzcCA9IGVzcC0+aXNzdWVfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGlzc3VlX1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJd2hpbGUoc3ApIHsKKwkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7CisJCXNwID0gKFNjc2lfQ21uZCAqKSBzcC0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXVxuIikpOworCXNwID0gZXNwLT5jdXJyZW50X1NDOworCUVTUExPRygoImVzcCVkOiBjdXJyZW50X1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJd2hpbGUoc3ApIHsKKwkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7CisJCXNwID0gKFNjc2lfQ21uZCAqKSBzcC0+aG9zdF9zY3JpYmJsZTsKKwl9CisJRVNQTE9HKCgiXVxuIikpOworCXNwID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZF9TQ1siLCBlc3AtPmVzcF9pZCkpOworCXdoaWxlKHNwKSB7CisJCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOworCQlzcCA9IChTY3NpX0NtbmQgKikgc3AtPmhvc3Rfc2NyaWJibGU7CisJfQorCUVTUExPRygoIl1cbiIpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCisvKiBEbyB0aGUgbmVlZHkgd2hlbiBhIHRhcmdldCB0cmllcyB0byByZWNvbm5lY3QgdG8gdXMuICovCitzdGF0aWMgaW50IGVzcF9kb19yZWNvbm5lY3Qoc3RydWN0IE5DUl9FU1AgKmVzcCwgCisJCQkgICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlpbnQgbHVuLCB0YXJnZXQ7CisJU2NzaV9DbW5kICpTQ3B0cjsKKworCS8qIENoZWNrIGZvciBhbGwgYm9ndXMgY29uZGl0aW9ucyBmaXJzdC4gKi8KKwl0YXJnZXQgPSByZWNvbm5lY3RfdGFyZ2V0KGVzcCwgZXJlZ3MpOworCWlmKHRhcmdldCA8IDApIHsKKwkJRVNQRElTQygoImJhZCBidXMgYml0c1xuIikpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKwlsdW4gPSByZWNvbm5lY3RfbHVuKGVzcCwgZXJlZ3MpOworCWlmKGx1biA8IDApIHsKKwkJRVNQRElTQygoInRhcmdldD0lMngsIGJhZCBpZGVudGlmeSBtc2dcbiIsIHRhcmdldCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKworCS8qIFRoaW5ncyBsb29rIG9rLi4uICovCisJRVNQRElTQygoIlI8JTAyeCwlMDJ4PiIsIHRhcmdldCwgbHVuKSk7CisKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCWlmKGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoZXNwLCBlcmVncykpCisJCXJldHVybiBkb19yZXNldF9idXM7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOworCisJU0NwdHIgPSByZW1vdmVfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDLCAodW5jaGFyKSB0YXJnZXQsICh1bmNoYXIpIGx1bik7CisJaWYoIVNDcHRyKQorCQlyZXR1cm4gZXNwX2JhZF9yZWNvbm5lY3QoZXNwKTsKKworCWVzcF9jb25uZWN0KGVzcCwgZXJlZ3MsIFNDcHRyKTsKKwllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKworCS8qIFJlY29ubmVjdCBpbXBsaWVzIGEgcmVzdG9yZSBwb2ludGVycyBvcGVyYXRpb24uICovCisJZXNwX3Jlc3RvcmVfcG9pbnRlcnMoZXNwLCBTQ3B0cik7CisKKwllc3AtPnNuaXAgPSAwOworCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCisvKiBFbmQgb2YgTkVYVVMgKGhvcGVmdWxseSksIHBpY2sgdXAgc3RhdHVzICsgbWVzc2FnZSBieXRlIHRoZW4gbGVhdmUgaWYKKyAqIGFsbCBnb2VzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3N0YXR1cyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IGludHIsIHJ2YWw7CisKKwlydmFsID0gc2tpcGFoZWFkMShlc3AsIGVyZWdzLCBTQ3B0ciwgaW5fdGhlX2RhcmssIGluX3N0YXR1cyk7CisJaWYocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpbnRyID0gZXNwLT5pcmVnOworCUVTUFNUQVQoKCJlc3BfZG9fc3RhdHVzOiAiKSk7CisJaWYoaW50ciAhPSBFU1BfSU5UUl9EQykgeworCQlpbnQgbWVzc2FnZV9vdXQgPSAwOyAvKiBmb3IgcGFyaXR5IHByb2JsZW1zICovCisKKwkJLyogQWNrIHRoZSBtZXNzYWdlLiAqLworCQlFU1BTVEFUKCgiYWNrIG1zZywgIikpOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKworCQlpZihlc3AtPmRtYV9wb2xsKQorCQkJZXNwLT5kbWFfcG9sbChlc3AsICh1bnNpZ25lZCBjaGFyICopIGVzcC0+ZXNwX2NvbW1hbmQpOworCisJCUVTUFNUQVQoKCJnb3Qgc29tZXRoaW5nLCAiKSk7CisJCS8qIEVTUCBjaGltZXMgaW4gd2l0aCBvbmUgb2YKKwkJICoKKwkJICogMSkgZnVuY3Rpb24gZG9uZSBpbnRlcnJ1cHQ6CisJCSAqCWJvdGggc3RhdHVzIGFuZCBtZXNzYWdlIGluIGJ5dGVzCisJCSAqCWFyZSBhdmFpbGFibGUKKwkJICoKKwkJICogMikgYnVzIHNlcnZpY2UgaW50ZXJydXB0OgorCQkgKglvbmx5IHN0YXR1cyBieXRlIHdhcyBhY3F1aXJlZAorCQkgKgorCQkgKiAzKSBBbnl0aGluZyBlbHNlOgorCQkgKgljYW4ndCBoYXBwZW4sIGJ1dCB3ZSB0ZXN0IGZvciBpdAorCQkgKglhbnl3YXlzCisJCSAqCisJCSAqIEFMU086IElmIGJhZCBwYXJpdHkgd2FzIGRldGVjdGVkIG9uIGVpdGhlcgorCQkgKiAgICAgICB0aGUgc3RhdHVzIF9vcl8gdGhlIG1lc3NhZ2UgYnl0ZSB0aGVuCisJCSAqICAgICAgIHRoZSBFU1AgaGFzIGFzc2VydGVkIEFUTiBvbiB0aGUgYnVzCisJCSAqICAgICAgIGFuZCB3ZSBtdXN0IHRoZXJlZm9yZSB3YWl0IGZvciB0aGUKKwkJICogICAgICAgbmV4dCBwaGFzZSBjaGFuZ2UuCisJCSAqLworCQlpZihpbnRyICYgRVNQX0lOVFJfRkRPTkUpIHsKKwkJCS8qIFdlIGdvdCBpdCBhbGwsIGhhbGxlanVsaWEuICovCisJCQlFU1BTVEFUKCgiZ290IGJvdGgsICIpKTsKKwkJCVNDcHRyLT5TQ3AuU3RhdHVzID0gZXNwLT5lc3BfY29tbWFuZFswXTsKKwkJCVNDcHRyLT5TQ3AuTWVzc2FnZSA9IGVzcC0+ZXNwX2NvbW1hbmRbMV07CisJCQllc3AtPnByZXZtc2dpbiA9IFNDcHRyLT5TQ3AuTWVzc2FnZTsKKwkJCWVzcC0+Y3VyX21zZ2luWzBdID0gU0NwdHItPlNDcC5NZXNzYWdlOworCQkJaWYoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikgeworCQkJCS8qIFRoZXJlIHdhcyBiYWQgcGFyaXR5IGZvciB0aGUKKwkJCQkgKiBtZXNzYWdlIGJ5dGUsIHRoZSBzdGF0dXMgYnl0ZQorCQkJCSAqIHdhcyBvay4KKwkJCQkgKi8KKwkJCQltZXNzYWdlX291dCA9IE1TR19QQVJJVFlfRVJST1I7CisJCQl9CisJCX0gZWxzZSBpZihpbnRyID09IEVTUF9JTlRSX0JTRVJWKSB7CisJCQkvKiBPbmx5IGdvdCBzdGF0dXMgYnl0ZS4gKi8KKwkJCUVTUExPRygoImVzcCVkOiBnb3Qgc3RhdHVzIG9ubHksICIsIGVzcC0+ZXNwX2lkKSk7CisJCQlpZighKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpKSB7CisJCQkJU0NwdHItPlNDcC5TdGF0dXMgPSBlc3AtPmVzcF9jb21tYW5kWzBdOworCQkJCVNDcHRyLT5TQ3AuTWVzc2FnZSA9IDB4ZmY7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBzdGF0dXMgYnl0ZSBoYWQgYmFkIHBhcml0eS4KKwkJCQkgKiB3ZSBsZWF2ZSB0aGUgc2NzaV9wb2ludGVyIFN0YXR1cworCQkJCSAqIGZpZWxkIGFsb25lIGFzIHdlIHNldCBpdCB0byBhIGRlZmF1bHQKKwkJCQkgKiBvZiBDSEVDS19DT05ESVRJT04gaW4gZXNwX3F1ZXVlLgorCQkJCSAqLworCQkJCW1lc3NhZ2Vfb3V0ID0gSU5JVElBVE9SX0VSUk9SOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGV2ZXIuICovCisJCQlFU1BTVEFUKCgiZ290IGJvbGl4ZWRcbiIpKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKKwkJfQorCisJCWlmKCFtZXNzYWdlX291dCkgeworCQkJRVNQU1RBVCgoInN0YXR1cz0lMnggbXNnPSUyeCwgIiwgU0NwdHItPlNDcC5TdGF0dXMsCisJCQkJU0NwdHItPlNDcC5NZXNzYWdlKSk7CisJCQlpZihTQ3B0ci0+U0NwLk1lc3NhZ2UgPT0gQ09NTUFORF9DT01QTEVURSkgeworCQkJCUVTUFNUQVQoKCJhbmQgd2FzIENPTU1BTkRfQ09NUExFVEVcbiIpKTsKKwkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fZnJlZWluZyk7CisJCQkJcmV0dXJuIGVzcF9kb19mcmVlYnVzKGVzcCwgZXJlZ3MpOworCQkJfSBlbHNlIHsKKwkJCQlFU1BMT0coKCJlc3AlZDogYW5kIF9ub3RfIENPTU1BTkRfQ09NUExFVEVcbiIsCisJCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQkJZXNwLT5tc2dpbl9sZW4gPSBlc3AtPm1zZ2luX2N0ciA9IDE7CisJCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luZG9uZSk7CisJCQkJcmV0dXJuIGVzcF9kb19tc2dpbmRvbmUoZXNwLCBlcmVncyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBXaXRoIGx1Y2sgd2UnbGwgYmUgYWJsZSB0byBsZXQgdGhlIHRhcmdldAorCQkJICoga25vdyB0aGF0IGJhZCBwYXJpdHkgaGFwcGVuZWQsIGl0IHdpbGwga25vdworCQkJICogd2hpY2ggYnl0ZSBjYXVzZWQgdGhlIHByb2JsZW1zIGFuZCBzZW5kIGl0CisJCQkgKiBhZ2Fpbi4gIEZvciB0aGUgY2FzZSB3aGVyZSB0aGUgc3RhdHVzIGJ5dGUKKwkJCSAqIHJlY2VpdmVzIGJhZCBwYXJpdHksIEkgZG8gbm90IGJlbGlldmUgbW9zdAorCQkJICogdGFyZ2V0cyByZWNvdmVyIHZlcnkgd2VsbC4gIFdlJ2xsIHNlZS4KKwkJCSAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IGJhZCBwYXJpdHkgc29tZXdoZXJlIG1vdXQ9JTJ4XG4iLAorCQkJCWVzcC0+ZXNwX2lkLCBtZXNzYWdlX291dCkpOworCQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gbWVzc2FnZV9vdXQ7CisJCQllc3AtPm1zZ291dF9sZW4gPSBlc3AtPm1zZ291dF9jdHIgPSAxOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgZGlzY29ubmVjdCBub3csIGFsbCBoZWxsIGJyZWFrcyBsb29zZS4gKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IHdob29wcywgZGlzY29ubmVjdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7CisJfQorfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9zdGF0dXMoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCSAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCXVuY2hhciB0aGVjbWQgPSBFU1BfQ01EX0lDQ1NFUTsKKworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisKKwlpZihlc3AtPmRvX3Bpb19jbWRzKSB7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fc3RhdHVzKTsKKwkJZXNwX2NtZChlc3AsIGVyZWdzLCB0aGVjbWQpOworCQl3aGlsZSghKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpOworCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CisgICAgICAgICAgICAgICAgd2hpbGUoIShlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKTsKKyAgICAgICAgICAgICAgICBlc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CisJfSBlbHNlIHsKKwkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+ZXNwX2NvbW1hbmRbMV0gPSAweGZmOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90Y2xvdywgMik7CisJCWVzcF93cml0ZShlcmVncy0+ZXNwX3RjbWVkLCAwKTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkKGVzcCwgZXNwLT5lc3BfY29tbWFuZF9kdm1hLCAyKTsKKwkJdGhlY21kIHw9IEVTUF9DTURfRE1BOworCQllc3BfY21kKGVzcCwgZXJlZ3MsIHRoZWNtZCk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gZXNwX2RvX3N0YXR1cyhlc3AsIGVyZWdzKTsKK30KKworc3RhdGljIGludCBlc3BfZGlzY29ubmVjdF9hbWlkc3RfcGhhc2VzKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkJCXN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpzcCA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IHNwLT5kZXZpY2UtPmhvc3RkYXRhOworCisJLyogVGhpcyBtZWFucyByZWFsIHByb2JsZW1zIGlmIHdlIHNlZSB0aGlzCisJICogaGVyZS4gIFVubGVzcyB3ZSB3ZXJlIGFjdHVhbGx5IHRyeWluZworCSAqIHRvIGZvcmNlIHRoZSBkZXZpY2UgdG8gYWJvcnQvcmVzZXQuCisJICovCisJRVNQTE9HKCgiZXNwJWQ6IERpc2Nvbm5lY3QgYW1pZHN0IHBoYXNlcywgIiwgZXNwLT5lc3BfaWQpKTsKKwlFU1BMT0coKCJwcGhhc2U8JXM+IGNwaGFzZTwlcz4sICIsCisJCXBoYXNlX3N0cmluZyhzcC0+U0NwLnBoYXNlKSwKKwkJcGhhc2Vfc3RyaW5nKHNwLT5TQ3Auc2VudF9jb21tYW5kKSkpOworCisJaWYoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9FU0VMKTsKKworCXN3aXRjaChlc3AtPmN1cl9tc2dvdXRbMF0pIHsKKwlkZWZhdWx0OgorCQkvKiBXZSBkaWRuJ3QgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGF0IGFsbC4gKi8KKwkJRVNQTE9HKCgiZGV2aWNlIGlzIGJvbGl4ZWRcbiIpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX3RndGVycm9yKTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX0VSUk9SIDw8IDE2KSk7CisJCWJyZWFrOworCisJY2FzZSBCVVNfREVWSUNFX1JFU0VUOgorCQlFU1BMT0coKCJkZXZpY2UgcmVzZXQgc3VjY2Vzc2Z1bFxuIikpOworCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQllc3BfZGV2LT5zeW5jID0gMDsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX3Jlc2V0ZGV2KTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX1JFU0VUIDw8IDE2KSk7CisJCWJyZWFrOworCisJY2FzZSBBQk9SVDoKKwkJRVNQTE9HKCgiZGV2aWNlIGFib3J0IHN1Y2Nlc3NmdWxcbiIpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX2Fib3J0b25lKTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX0FCT1JUIDw8IDE2KSk7CisJCWJyZWFrOworCisJfTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX21zZ291dChzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXQpOworCXJldHVybiBlc3BfZG9fbXNnb3V0KGVzcCwgZXJlZ3MpOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9tc2dpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luKTsKKwlyZXR1cm4gZXNwX2RvX21zZ2luKGVzcCwgZXJlZ3MpOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9jbWQoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCSBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fY21kYmVnaW4pOworCXJldHVybiBlc3BfZG9fY21kYmVnaW4oZXNwLCBlcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX2JhZHBoYXNlKHN0cnVjdCBOQ1JfRVNQICplc3AsCisJCQkgICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCUVTUExPRygoImVzcCVkOiBCaXphcnJlIGJ1cyBwaGFzZSAlMnguXG4iLCBlc3AtPmVzcF9pZCwKKwkJZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCit0eXBlZGVmIGludCAoKmVzcGZ1bmNfdCkoc3RydWN0IE5DUl9FU1AgKiwKKwkJCSBzdHJ1Y3QgRVNQX3JlZ3MgKik7CisKK3N0YXRpYyBlc3BmdW5jX3QgcGhhc2VfdmVjdG9yW10gPSB7CisJZXNwX2RvX2RhdGEsCQkvKiBFU1BfRE9QICovCisJZXNwX2RvX2RhdGEsCQkvKiBFU1BfRElQICovCisJZXNwX2VudGVyX2NtZCwJCS8qIEVTUF9DTURQICovCisJZXNwX2VudGVyX3N0YXR1cywJLyogRVNQX1NUQVRQICovCisJZXNwX2VudGVyX2JhZHBoYXNlLAkvKiBFU1BfU1RBVF9QTVNHICovCisJZXNwX2VudGVyX2JhZHBoYXNlLAkvKiBFU1BfU1RBVF9QTVNHIHwgRVNQX1NUQVRfUElPICovCisJZXNwX2VudGVyX21zZ291dCwJLyogRVNQX01PUCAqLworCWVzcF9lbnRlcl9tc2dpbiwJLyogRVNQX01JUCAqLworfTsKKworLyogVGhlIHRhcmdldCBoYXMgY29udHJvbCBvZiB0aGUgYnVzIGFuZCB3ZSBoYXZlIHRvIHNlZSB3aGVyZSBpdCBoYXMKKyAqIHRha2VuIHVzLgorICovCitzdGF0aWMgaW50IGVzcF9kb19waGFzZV9kZXRlcm1pbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQkgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJaWYgKChlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykgIT0gMCkKKwkJcmV0dXJuIGVzcF9kaXNjb25uZWN0X2FtaWRzdF9waGFzZXMoZXNwLCBlcmVncyk7CisJcmV0dXJuIHBoYXNlX3ZlY3Rvcltlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTS10oZXNwLCBlcmVncyk7Cit9CisKKy8qIEZpcnN0IGludGVycnVwdCBhZnRlciBleGVjJ2luZyBhIGNtZCBjb21lcyBoZXJlLiAqLworc3RhdGljIGludCBlc3Bfc2VsZWN0X2NvbXBsZXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCWludCBjbWRfYnl0ZXNfc2VudCwgZmNudDsKKworCWZjbnQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUyk7CisJY21kX2J5dGVzX3NlbnQgPSBlc3AtPmRtYV9ieXRlc19zZW50KGVzcCwgZmNudCk7CisJaWYoZXNwLT5kbWFfaW52YWxpZGF0ZSkKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZShlc3ApOworCisJLyogTGV0J3MgY2hlY2sgdG8gc2VlIGlmIGEgcmVzZWxlY3QgaGFwcGVuZWQKKwkgKiB3aGlsZSB3ZSB3ZSdyZSB0cnlpbmcgdG8gc2VsZWN0LiAgVGhpcyBtdXN0CisJICogYmUgY2hlY2tlZCBmaXJzdC4KKwkgKi8KKwlpZihlc3AtPmlyZWcgPT0gKEVTUF9JTlRSX1JTRUwgfCBFU1BfSU5UUl9GRE9ORSkpIHsKKwkJZXNwX3JlY29ubmVjdChlc3AsIFNDcHRyKTsKKwkJcmV0dXJuIGVzcF9kb19yZWNvbm5lY3QoZXNwLCBlcmVncyk7CisJfQorCisJLyogTG9va3MgbGlrZSB0aGluZ3Mgd29ya2VkLCB3ZSBzaG91bGQgc2VlIGEgYnVzIHNlcnZpY2UgJgorCSAqIGEgZnVuY3Rpb24gY29tcGxldGUgaW50ZXJydXB0IGF0IHRoaXMgcG9pbnQuICBOb3RlIHdlCisJICogYXJlIGRvaW5nIGEgZGlyZWN0IGNvbXBhcmlzb24gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCisJICogYmUgZm9vbGVkIGludG8gdGhpbmtpbmcgc2VsZWN0aW9uIHdhcyBzdWNjZXNzZnVsIGlmCisJICogRVNQX0lOVFJfREMgaXMgc2V0LCBzZWUgYmVsb3cuCisJICovCisJaWYoZXNwLT5pcmVnID09IChFU1BfSU5UUl9GRE9ORSB8IEVTUF9JTlRSX0JTRVJWKSkgeworCQkvKiB0YXJnZXQgc3BlYWtzLi4uICovCisJCWVzcC0+dGFyZ2V0c19wcmVzZW50IHw9ICgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCk7CisKKwkJLyogV2hhdCBpZiB0aGUgdGFyZ2V0IGlnbm9yZXMgdGhlIHNkdHI/ICovCisJCWlmKGVzcC0+c25pcCkKKwkJCWVzcF9kZXYtPnN5bmMgPSAxOworCisJCS8qIFNlZSBob3cgZmFyLCBpZiBhdCBhbGwsIHdlIGdvdCBpbiBnZXR0aW5nCisJCSAqIHRoZSBpbmZvcm1hdGlvbiBvdXQgdG8gdGhlIHRhcmdldC4KKwkJICovCisJCXN3aXRjaChlc3AtPnNlcXJlZykgeworCQlkZWZhdWx0OgorCisJCWNhc2UgRVNQX1NURVBfQVNFTDoKKwkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCBidXQKKwkJCSAqIHdlIGFyZSBpbiBzb21lIHBoYXNlIHdoaWNoIGlzIG5vdCBjb21tYW5kCisJCQkgKiBwaGFzZSBub3IgaXMgaXQgbWVzc2FnZSBvdXQgcGhhc2UuCisJCQkgKgorCQkJICogWFhYIFdlJ3ZlIGNvbmZ1c2VkIHRoZSB0YXJnZXQsIG9idmlvdXNseS4KKwkJCSAqIFhYWCBTbyBjbGVhciBpdCdzIHN0YXRlLCBidXQgd2UgYWxzbyBlbmQKKwkJCSAqIFhYWCB1cCBjbGVhcmluZyBldmVyeW9uZSBlbHNlcy4gIFRoYXQgaXNuJ3QKKwkJCSAqIFhYWCBzbyBuaWNlLiAgSSdkIGxpa2UgdG8ganVzdCByZXNldCB0aGlzCisJCQkgKiBYWFggdGFyZ2V0LCBidXQgaWYgSSBjYW5ub3QgZXZlbiBnZXQgaXQncworCQkJICogWFhYIGF0dGVudGlvbiBhbmQgZmluaXNoIHNlbGVjdGlvbiB0byB0YWxrCisJCQkgKiBYWFggdG8gaXQsIHRoZXJlIGlzIG5vdCBtdWNoIG1vcmUgSSBjYW4gZG8uCisJCQkgKiBYWFggSWYgd2UgaGF2ZSBhIGxvYWRlZCBidXMgd2UncmUgZ29pbmcgdG8KKwkJCSAqIFhYWCBzcGVuZCB0aGUgbmV4dCBzZWNvbmQgb3Igc28gcmVuZWdvdGlhdGluZworCQkJICogWFhYIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCisJCQkgKi8KKwkJCUVTUExPRygoImVzcCVkOiBTVEVQX0FTRUwgZm9yIHRndCAlZFxuIiwKKwkJCQllc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKKworCQljYXNlIEVTUF9TVEVQX1NJRDoKKwkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCB3ZW50CisJCQkgKiB0byBtZXNzYWdlIG91dCBwaGFzZSwgc2VudCBvbmUgbWVzc2FnZQorCQkJICogYnl0ZSwgdGhlbiB3ZSBzdG9wcGVkLiAgQVROIGlzIGFzc2VydGVkCisJCQkgKiBvbiB0aGUgU0NTSSBidXMgYW5kIHRoZSB0YXJnZXQgaXMgc3RpbGwKKwkJCSAqIHRoZXJlIGhhbmdpbmcgb24uICBUaGlzIGlzIGEgbGVnYWwKKwkJCSAqIHNlcXVlbmNlIHN0ZXAgaWYgd2UgZ2F2ZSB0aGUgRVNQIGEgc2VsZWN0CisJCQkgKiBhbmQgc3RvcCBjb21tYW5kLgorCQkJICoKKwkJCSAqIFhYWCBTZWUgYWJvdmUsIEkgY291bGQgc2V0IHRoZSBib3JrZW4gZmxhZworCQkJICogWFhYIGluIHRoZSBkZXZpY2Ugc3RydWN0IGFuZCByZXRyeSB0aGUKKwkJCSAqIFhYWCBjb21tYW5kLiAgQnV0IHdvdWxkIHRoYXQgaGVscCBmb3IKKwkJCSAqIFhYWCB0YWdnZWQgY2FwYWJsZSB0YXJnZXRzPworCQkJICovCisKKwkJY2FzZSBFU1BfU1RFUF9OQ01EOgorCQkJLyogQXJiaXRyYXRpb24gd29uLCB0YXJnZXQgc2VsZWN0ZWQsIG1heWJlCisJCQkgKiBzZW50IHRoZSBvbmUgbWVzc2FnZSBieXRlIGluIG1lc3NhZ2Ugb3V0CisJCQkgKiBwaGFzZSwgYnV0IHdlIGRpZCBub3QgZ28gdG8gY29tbWFuZCBwaGFzZQorCQkJICogaW4gdGhlIGVuZC4gIEFjdHVhbGx5LCB3ZSBjb3VsZCBoYXZlIHNlbnQKKwkJCSAqIG9ubHkgc29tZSBvZiB0aGUgbWVzc2FnZSBieXRlcyBpZiB3ZSB0cmllZAorCQkJICogdG8gc2VuZCBvdXQgdGhlIGVudGlyZSBpZGVudGlmeSBhbmQgdGFnCisJCQkgKiBtZXNzYWdlIHVzaW5nIEVTUF9DTURfU0EzLgorCQkJICovCisJCQljbWRfYnl0ZXNfc2VudCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEVTUF9TVEVQX1BQQzoKKwkJCS8qIE5vLCBub3QgdGhlIHBvd2VyUEMgcGluaGVhZC4gIEFyYml0cmF0aW9uCisJCQkgKiB3b24sIGFsbCBtZXNzYWdlIGJ5dGVzIHNlbnQgaWYgd2Ugd2VudCB0bworCQkJICogbWVzc2FnZSBvdXQgcGhhc2UsIHdlbnQgdG8gY29tbWFuZCBwaGFzZQorCQkJICogYnV0IG9ubHkgcGFydCBvZiB0aGUgY29tbWFuZCB3YXMgc2VudC4KKwkJCSAqCisJCQkgKiBYWFggSSd2ZSBzZWVuIHRoaXMsIGJ1dCB1c3VhbGx5IGluIGNvbmp1bmN0aW9uCisJCQkgKiBYWFggd2l0aCBhIGdyb3NzIGVycm9yIHdoaWNoIGFwcGVhcnMgdG8gaGF2ZQorCQkJICogWFhYIG9jY3VycmVkIGJldHdlZW4gdGhlIHRpbWUgSSB0b2xkIHRoZQorCQkJICogWFhYIEVTUCB0byBhcmJpdHJhdGUgYW5kIHdoZW4gSSBnb3QgdGhlCisJCQkgKiBYWFggaW50ZXJydXB0LiAgQ291bGQgSSBoYXZlIG1pc2xvYWRlZCB0aGUKKwkJCSAqIFhYWCBjb21tYW5kIGJ5dGVzIGludG8gdGhlIGZpZm8/ICBBY3R1YWxseSwKKwkJCSAqIFhYWCBJIG1vc3QgbGlrZWx5IG1pc3NlZCBhIHBoYXNlLCBhbmQgdGhlcmVmb3JlCisJCQkgKiBYWFggd2VudCBpbnRvIG5ldmVyIG5ldmVyIGxhbmQgYW5kIGRpZG4ndCBldmVuCisJCQkgKiBYWFgga25vdyBpdC4gIFRoYXQgd2FzIHRoZSBvbGQgZHJpdmVyIHRob3VnaC4KKwkJCSAqIFhYWCBXaGF0IGlzIGV2ZW4gbW9yZSBwZWN1bGlhciBpcyB0aGF0IHRoZSBFU1AKKwkJCSAqIFhYWCBzaG93ZWQgdGhlIHByb3BlciBmdW5jdGlvbiBjb21wbGV0ZSBhbmQKKwkJCSAqIFhYWCBidXMgc2VydmljZSBiaXRzIGluIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisJCQkgKi8KKworCQljYXNlIEVTUF9TVEVQX0ZJTkk0OgorCQljYXNlIEVTUF9TVEVQX0ZJTkk1OgorCQljYXNlIEVTUF9TVEVQX0ZJTkk2OgorCQljYXNlIEVTUF9TVEVQX0ZJTkk3OgorCQkJLyogQWNjb3VudCBmb3IgdGhlIGlkZW50aWZ5IG1lc3NhZ2UgKi8KKwkJCWlmKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9ub3JtKQorCQkJCWNtZF9ieXRlc19zZW50IC09IDE7CisJCX07CisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9OVUxMKTsKKworCQkvKiBCZSBjYXJlZnVsLCB3ZSBjb3VsZCByZWFsbHkgZ2V0IGZ1Y2tlZCBkdXJpbmcgc3luY2hyb25vdXMKKwkJICogZGF0YSB0cmFuc2ZlcnMgaWYgd2UgdHJ5IHRvIGZsdXNoIHRoZSBmaWZvIG5vdy4KKwkJICovCisJCWlmKCFmY250ICYmIC8qIEZpZm8gaXMgZW1wdHkgYW5kLi4uICovCisJCSAgIC8qIGVpdGhlciB3ZSBhcmUgbm90IGRvaW5nIHN5bmNocm9ub3VzIHRyYW5zZmVycyBvci4uLiAqLworCQkgICAoIWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAorCQkgICAgLyogV2UgYXJlIG5vdCBnb2luZyBpbnRvIGRhdGEgaW4gcGhhc2UuICovCisJCSAgICAoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSAhPSBFU1BfRElQKSkpCisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOyAvKiBmbHVzaCBpcyBzYWZlICovCisKKwkJLyogU2VlIGhvdyBmYXIgd2UgZ290IGlmIHRoaXMgaXMgbm90IGEgc2xvdyBjb21tYW5kLiAqLworCQlpZighZXNwLT5lc3Bfc2xvd2NtZCkgeworCQkJaWYoY21kX2J5dGVzX3NlbnQgPCAwKQorCQkJCWNtZF9ieXRlc19zZW50ID0gMDsKKwkJCWlmKGNtZF9ieXRlc19zZW50ICE9IFNDcHRyLT5jbWRfbGVuKSB7CisJCQkJLyogQ3JhcG9sYSwgbWFyayBpdCBhcyBhIHNsb3djbWQKKwkJCQkgKiBzbyB0aGF0IHdlIGhhdmUgc29tZSBjaGFuY2Ugb2YKKwkJCQkgKiBrZWVwaW5nIHRoZSBjb21tYW5kIGFsaXZlIHdpdGgKKwkJCQkgKiBnb29kIGx1Y2suCisJCQkJICoKKwkJCQkgKiBYWFggQWN0dWFsbHksIGlmIHdlIGRpZG4ndCBzZW5kIGl0IGFsbAorCQkJCSAqIFhYWCB0aGlzIG1lYW5zIGVpdGhlciB3ZSBkaWRuJ3Qgc2V0IHRoaW5ncworCQkJCSAqIFhYWCB1cCBwcm9wZXJseSAoZHJpdmVyIGJ1Zykgb3IgdGhlIHRhcmdldAorCQkJCSAqIFhYWCBvciB0aGUgRVNQIGRldGVjdGVkIHBhcml0eSBvbiBvbmUgb2YKKwkJCQkgKiBYWFggdGhlIGNvbW1hbmQgYnl0ZXMuICBUaGlzIG1ha2VzIG11Y2gKKwkJCQkgKiBYWFggbW9yZSBzZW5zZSwgYW5kIHRoZXJlZm9yZSB0aGlzIGNvZGUKKwkJCQkgKiBYWFggc2hvdWxkIGJlIGNoYW5nZWQgdG8gc2VuZCBvdXQgYQorCQkJCSAqIFhYWCBwYXJpdHkgZXJyb3IgbWVzc2FnZSBvciBpZiB0aGUgc3RhdHVzCisJCQkJICogWFhYIHJlZ2lzdGVyIHNob3dzIG5vIHBhcml0eSBlcnJvciB0aGVuCisJCQkJICogWFhYIGp1c3QgZXhwZWN0IHRoZSB0YXJnZXQgdG8gYnJpbmcgdGhlCisJCQkJICogWFhYIGJ1cyBpbnRvIG1lc3NhZ2UgaW4gcGhhc2Ugc28gdGhhdCBpdAorCQkJCSAqIFhYWCBjYW4gc2VuZCB1cyB0aGUgcGFyaXR5IGVycm9yIG1lc3NhZ2UuCisJCQkJICogWFhYIFNDU0kgc3Vja3MuLi4KKwkJCQkgKi8KKwkJCQllc3AtPmVzcF9zbG93Y21kID0gMTsKKwkJCQllc3AtPmVzcF9zY21kcCA9ICYoU0NwdHItPmNtbmRbY21kX2J5dGVzX3NlbnRdKTsKKwkJCQllc3AtPmVzcF9zY21kbGVmdCA9IChTQ3B0ci0+Y21kX2xlbiAtIGNtZF9ieXRlc19zZW50KTsKKwkJCX0KKwkJfQorCisJCS8qIE5vdyBmaWd1cmUgb3V0IHdoZXJlIHdlIHdlbnQuICovCisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOworCX0KKworCS8qIERpZCB0aGUgdGFyZ2V0IGV2ZW4gbWFrZSBpdD8gKi8KKwlpZihlc3AtPmlyZWcgPT0gRVNQX0lOVFJfREMpIHsKKwkJLyogd2hlZWUuLi4gbm9ib2R5IHRoZXJlIG9yIHRoZXkgZGlkbid0IGxpa2UKKwkJICogd2hhdCB3ZSB0b2xkIGl0IHRvIGRvLCBjbGVhbiB1cC4KKwkJICovCisKKwkJLyogSWYgYW55b25lIGlzIG9mZiB0aGUgYnVzLCBidXQgd29ya2luZyBvbgorCQkgKiBhIGNvbW1hbmQgaW4gdGhlIGJhY2tncm91bmQgZm9yIHVzLCB0ZWxsCisJCSAqIHRoZSBFU1AgdG8gbGlzdGVuIGZvciB0aGVtLgorCQkgKi8KKwkJaWYoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRVNFTCk7CisKKwkJaWYoKCgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCkgJiBlc3AtPnRhcmdldHNfcHJlc2VudCkgJiYKKwkJICAgZXNwLT5zZXFyZWcgJiYgZXNwLT5jdXJfbXNnb3V0WzBdID09IEVYVEVOREVEX01FU1NBR0UgJiYKKwkJICAgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9tc2cgfHwKKwkJICAgIFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9zdG9wKSkgeworCQkJLyogc2hpdCAqLworCQkJZXNwLT5zbmlwID0gMDsKKwkJCUVTUExPRygoImVzcCVkOiBGYWlsZWQgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gZm9yIHRhcmdldCAlZCAiCisJCQkJImx1biAlZFxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQkJZXNwX2Rldi0+c3luYyA9IDE7IC8qIHNvIHdlIGRvbid0IG5lZ290aWF0ZSBhZ2FpbiAqLworCisJCQkvKiBSdW4gdGhlIGNvbW1hbmQgYWdhaW4sIHRoaXMgdGltZSB0aG91Z2ggd2UKKwkJCSAqIHdvbid0IHRyeSB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKwkJCSAqCisJCQkgKiBYWFggSSdkIGxpa2UgdG8gZG8gc29tZXRoaW5nIGxpa2Ugc2VuZCBhbgorCQkJICogWFhYIElOSVRJQVRPUl9FUlJPUiBvciBBQk9SVCBtZXNzYWdlIHRvIHRoZQorCQkJICogWFhYIHRhcmdldCB0byB0ZWxsIGl0LCAiU29ycnkgSSBjb25mdXNlZCB5b3UsCisJCQkgKiBYWFggcGxlYXNlIGNvbWUgYmFjayBhbmQgSSB3aWxsIGJlIG5pY2VyIG5leHQKKwkJCSAqIFhYWCB0aW1lIi4gIEJ1dCB0aGF0IHJlcXVpcmVzIGhhdmluZyB0aGUgdGFyZ2V0CisJCQkgKiBYWFggb24gdGhlIGJ1cywgYW5kIGl0IGhhcyBkcm9wcGVkIEJTWSBvbiB1cy4KKwkJCSAqLworCQkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBub3RfaXNzdWVkKTsKKwkJCXByZXBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcHRyKTsKKwkJCWVzcF9leGVjX2NtZChlc3ApOworCQkJcmV0dXJuIGRvX2ludHJfZW5kOworCQl9CisKKwkJLyogT2ssIHRoaXMgaXMgbm9ybWFsLCB0aGlzIGlzIHdoYXQgd2Ugc2VlIGR1cmluZyBib290CisJCSAqIG9yIHdoZW5ldmVyIHdoZW4gd2UgYXJlIHNjYW5uaW5nIHRoZSBidXMgZm9yIHRhcmdldHMuCisJCSAqIEJ1dCBmaXJzdCBtYWtlIHN1cmUgdGhhdCBpcyByZWFsbHkgd2hhdCBpcyBoYXBwZW5pbmcuCisJCSAqLworCQlpZigoKDE8PFNDcHRyLT5kZXZpY2UtPmlkKSAmIGVzcC0+dGFyZ2V0c19wcmVzZW50KSkgeworCQkJRVNQTE9HKCgiZXNwJWQ6IFdhcm5pbmcsIGxpdmUgdGFyZ2V0ICVkIG5vdCByZXNwb25kaW5nIHRvICIKKwkJCQkic2VsZWN0aW9uLlxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7CisKKwkJCS8qIFRoaXMgX0NBTl8gaGFwcGVuLiAgVGhlIFNDU0kgc3RhbmRhcmQgc3RhdGVzIHRoYXQKKwkJCSAqIHRoZSB0YXJnZXQgaXMgdG8gX25vdF8gcmVzcG9uZCB0byBzZWxlY3Rpb24gaWYKKwkJCSAqIF9pdF8gZGV0ZWN0cyBiYWQgcGFyaXR5IG9uIHRoZSBidXMgZm9yIGFueSByZWFzb24uCisJCQkgKiBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0IGlmIHdlJ3ZlIHRhbGtlZCBzdWNjZXNzZnVsbHkKKwkJCSAqIHRvIHRoaXMgdGFyZ2V0IGJlZm9yZSwgYmFkIHBhcml0eSBpcyB0aGUgcHJvYmxlbS4KKwkJCSAqLworCQkJZXNwX2RvbmUoZXNwLCAoRElEX1BBUklUWSA8PCAxNikpOworCQl9IGVsc2UgeworCQkJLyogRWxzZSwgdGhlcmUgcmVhbGx5IGlzbid0IGFueW9uZSB0aGVyZS4gKi8KKwkJCUVTUE1JU0MoKCJlc3A6IHNlbGVjdGlvbiBmYWlsdXJlLCBtYXliZSBub2JvZHkgdGhlcmU/XG4iKSk7CisJCQlFU1BNSVNDKCgiZXNwOiB0YXJnZXQgJWQgbHVuICVkXG4iLAorCQkJCSBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCQllc3BfZG9uZShlc3AsIChESURfQkFEX1RBUkdFVCA8PCAxNikpOworCQl9CisJCXJldHVybiBkb19pbnRyX2VuZDsKKwl9CisKKworCUVTUExPRygoImVzcCVkOiBTZWxlY3Rpb24gZmFpbHVyZS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJcHJpbnRrKCJlc3AlZDogQ3VycmVudGx5IC0tICIsIGVzcC0+ZXNwX2lkKTsKKwllc3BfcHJpbnRfaXJlZyhlc3AtPmlyZWcpOworCXByaW50aygiICIpOworCWVzcF9wcmludF9zdGF0cmVnKGVzcC0+c3JlZyk7CisJcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3NlcXJlZyhlc3AtPnNlcXJlZyk7CisJcHJpbnRrKCJcbiIpOworCXByaW50aygiZXNwJWQ6IE5ldyAtLSAiLCBlc3AtPmVzcF9pZCk7CisJZXNwLT5zcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpOworCWVzcC0+c2VxcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zc3RlcCk7CisJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOworCWVzcF9wcmludF9pcmVnKGVzcC0+aXJlZyk7CisJcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3N0YXRyZWcoZXNwLT5zcmVnKTsKKwlwcmludGsoIiAiKTsKKwllc3BfcHJpbnRfc2VxcmVnKGVzcC0+c2VxcmVnKTsKKwlwcmludGsoIlxuIik7CisJRVNQTE9HKCgiZXNwJWQ6IHJlc2V0dGluZyBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7CisJcmV0dXJuIGRvX3Jlc2V0X2J1czsgLyogdWdoLi4uICovCit9CisKKy8qIENvbnRpbnVlIHJlYWRpbmcgYnl0ZXMgZm9yIG1zZ2luIHBoYXNlLiAqLworc3RhdGljIGludCBlc3BfZG9fbXNnaW5jb250KHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJaWYoZXNwLT5pcmVnICYgRVNQX0lOVFJfQlNFUlYpIHsKKwkJLyogaW4gdGhlIHJpZ2h0IHBoYXNlIHRvbz8gKi8KKwkJaWYoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfTUlQKSB7CisJCQkvKiBwaGV3Li4uICovCisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmRvbmUpOworCQkJcmV0dXJuIGRvX2ludHJfZW5kOworCQl9CisKKwkJLyogV2UgY2hhbmdlZCBwaGFzZSBidXQgRVNQIHNob3dzIGJ1cyBzZXJ2aWNlLAorCQkgKiBpbiB0aGlzIGNhc2UgaXQgaXMgbW9zdCBsaWtlbHkgdGhhdCB3ZSwgdGhlCisJCSAqIGhhY2tlciB3aG8gaGFzIGJlZW4gdXAgZm9yIDIwaHJzIHN0cmFpZ2h0CisJCSAqIHN0YXJpbmcgYXQgdGhlIHNjcmVlbiwgZHJvd25lZCBpbiBjb2ZmZWUKKwkJICogc21lbGxpbmcgbGlrZSByZXRjaGVkIGNpZ2FyZXR0ZSBhc2hlcworCQkgKiBoYXZlIG1pc2NvZGVkIHNvbWV0aGluZy4uLi4uIHNvLCB0cnkgdG8KKwkJICogcmVjb3ZlciBhcyBiZXN0IHdlIGNhbi4KKwkJICovCisJCUVTUExPRygoImVzcCVkOiBtZXNzYWdlIGluIG1pcy1jYXJyaWFnZS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCXJldHVybiBkb19waGFzZV9kZXRlcm1pbmU7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2luZ2xlYnl0ZV9tc2coc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWVzcC0+cHJldm1zZ2luID0gZXNwLT5jdXJfbXNnaW5bMF07CisJaWYoZXNwLT5jdXJfbXNnaW5bMF0gJiAweDgwKSB7CisJCS8qIHdoZWVlLi4uICovCisJCUVTUExPRygoImVzcCVkOiB0YXJnZXQgc2VuZHMgaWRlbnRpZnkgYW1pZHN0IHBoYXNlc1xuIiwKKwkJCWVzcC0+ZXNwX2lkKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYoKChlc3AtPmN1cl9tc2dpblswXSAmIDB4ZjApID09IDB4MjApIHx8CisJCSAgKGVzcC0+Y3VyX21zZ2luWzBdID09IEVYVEVOREVEX01FU1NBR0UpKSB7CisJCWVzcC0+bXNnaW5fbGVuID0gMjsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmNvbnQpOworCQlyZXR1cm4gMDsKKwl9CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJc3dpdGNoKGVzcC0+Y3VyX21zZ2luWzBdKSB7CisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3Qgd2FudCB0byBoZWFyIGFib3V0IGl0LiAqLworCQlFU1BMT0coKCJlc3AlZDogbXNnICUwMnggd2hpY2ggd2UgZG9uJ3Qga25vdyBhYm91dFxuIiwgZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cl9tc2dpblswXSkpOworCQlyZXR1cm4gTUVTU0FHRV9SRUpFQ1Q7CisKKwljYXNlIE5PUDoKKwkJRVNQTE9HKCgiZXNwJWQ6IHRhcmdldCAlZCBzZW5kcyBhIG5vcFxuIiwgZXNwLT5lc3BfaWQsCisJCQllc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCS8qIEluIHRoaXMgY2FzZSB3ZSBtaWdodCBhbHNvIGhhdmUgdG8gYmFja3VwIHRoZQorCQkgKiAic2xvdyBjb21tYW5kIiBwb2ludGVyLiAgSXQgaXMgcmFyZSB0byBnZXQgc3VjaAorCQkgKiBhIHNhdmUvcmVzdG9yZSBwb2ludGVyIHNlcXVlbmNlIHNvIGVhcmx5IGluIHRoZQorCQkgKiBidXMgdHJhbnNpdGlvbiBzZXF1ZW5jZXMsIGJ1dCBjb3ZlciBpdC4KKwkJICovCisJCWlmKGVzcC0+ZXNwX3Nsb3djbWQpIHsKKwkJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gZXNwLT5jdXJyZW50X1NDLT5jbWRfbGVuOworCQkJZXNwLT5lc3Bfc2NtZHAgPSAmZXNwLT5jdXJyZW50X1NDLT5jbW5kWzBdOworCQl9CisJCWVzcF9yZXN0b3JlX3BvaW50ZXJzKGVzcCwgZXNwLT5jdXJyZW50X1NDKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNBVkVfUE9JTlRFUlM6CisJCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgZXNwLT5jdXJyZW50X1NDKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJY2FzZSBESVNDT05ORUNUOgorCQkvKiBGcmVlaW5nIHRoZSBidXMsIGxldCBpdCBnby4gKi8KKwkJZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpbl9mcmVlaW5nOworCQlyZXR1cm4gMDsKKworCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCUVTUE1JU0MoKCJtc2cgcmVqZWN0LCAiKSk7CisJCWlmKGVzcC0+cHJldm1zZ291dCA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7CisJCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCQkJLyogRG9lc24ndCBsb29rIGxpa2UgdGhpcyB0YXJnZXQgY2FuCisJCQkgKiBkbyBzeW5jaHJvbm91cyBvciBXSURFIHRyYW5zZmVycy4KKwkJCSAqLworCQkJRVNQU0RUUigoImdvdCByZWplY3QsIHdhcyB0cnlpbmcgbmVnbywgY2xlYXJpbmcgc3luYy9XSURFXG4iKSk7CisJCQllc3BfZGV2LT5zeW5jID0gMTsKKwkJCWVzcF9kZXYtPndpZGUgPSAxOworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCUVTUE1JU0MoKCJub3Qgc3luYyBuZWdvLCBzZW5kaW5nIEFCT1JUXG4iKSk7CisJCQlyZXR1cm4gQUJPUlQ7CisJCX0KKwl9OworfQorCisvKiBUYXJnZXQgbmVnb3RpYXRlcyBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIGJlZm9yZSB3ZSBkbywgdGhpcworICogaXMgbGVnYWwgYWx0aG91Z2ggdmVyeSBzdHJhbmdlLiAgV2hhdCBpcyBldmVuIGZ1bm5pZXIgaXMgdGhhdAorICogdGhlIFNDU0kyIHN0YW5kYXJkIHNwZWNpZmljYWxseSByZWNvbW1lbmRzIGFnYWluc3QgdGFyZ2V0cyBkb2luZworICogdGhpcyBiZWNhdXNlIHNvIG1hbnkgaW5pdGlhdG9ycyBjYW5ub3QgY29wZSB3aXRoIHRoaXMgb2NjdXJyaW5nLgorICovCitzdGF0aWMgaW50IHRhcmdldF93aXRoX2FudHNfaW5fcGFudHMoc3RydWN0IE5DUl9FU1AgKmVzcCwKKwkJCQkgICAgIFNjc2lfQ21uZCAqU0NwdHIsCisJCQkJICAgICBzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldikKK3sKKwlpZihlc3BfZGV2LT5zeW5jIHx8IFNDcHRyLT5kZXZpY2UtPmJvcmtlbikgeworCQkvKiBzb3JyeSwgbm8gY2FuIGRvICovCisJCUVTUFNEVFIoKCJmb3JjaW5nIHRvIGFzeW5jLCAiKSk7CisJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJZXNwX2Rldi0+c3luYyA9IDE7CisJCWVzcC0+c25pcCA9IDE7CisJCUVTUExPRygoImVzcCVkOiBob3BpbmcgZm9yIG1zZ291dFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7CisJfQorCisJLyogT2ssIHdlJ2xsIGNoZWNrIHRoZW0gb3V0Li4uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcmVwb3J0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJaW50IG1zZzMsIG1zZzQ7CisJY2hhciAqdHlwZTsKKworCW1zZzMgPSBlc3AtPmN1cl9tc2dpblszXTsKKwltc2c0ID0gZXNwLT5jdXJfbXNnaW5bNF07CisJaWYobXNnNCkgeworCQlpbnQgaHogPSAxMDAwMDAwMDAwIC8gKG1zZzMgKiA0KTsKKwkJaW50IGludGVnZXIgPSBoeiAvIDEwMDAwMDA7CisJCWludCBmcmFjdGlvbiA9IChoeiAtIChpbnRlZ2VyICogMTAwMDAwMCkpIC8gMTAwMDA7CisJCWlmKChtc2czICogNCkgPCAyMDApIHsKKwkJCXR5cGUgPSAiRkFTVCI7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gInN5bmNocm9ub3VzIjsKKwkJfQorCisJCS8qIERvIG5vdCB0cmFuc2Zvcm0gdGhpcyBiYWNrIGludG8gb25lIGJpZyBwcmludGsKKwkJICogYWdhaW4sIGl0IHRyaWdnZXJzIGEgYnVnIGluIG91ciBzcGFyYzY0LWdjYzI3MgorCQkgKiBzaWJsaW5nIGNhbGwgb3B0aW1pemF0aW9uLiAgLURhdmVNCisJCSAqLworCQlFU1BMT0coKEtFUk5fSU5GTyAiZXNwJWQ6IHRhcmdldCAlZCAiLAorCQkJZXNwLT5lc3BfaWQsIGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5pZCkpOworCQlFU1BMT0coKCJbcGVyaW9kICVkbnMgb2Zmc2V0ICVkICVkLiUwMmRNSHogIiwKKwkJCShpbnQpIG1zZzMgKiA0LCAoaW50KSBtc2c0LAorCQkJaW50ZWdlciwgZnJhY3Rpb24pKTsKKwkJRVNQTE9HKCgiJXMgU0NTSSVzXVxuIiwgdHlwZSwKKwkJCSgoKG1zZzMgKiA0KSA8IDIwMCkgPyAiLUlJIiA6ICIiKSkpOworCX0gZWxzZSB7CisJCUVTUExPRygoS0VSTl9JTkZPICJlc3AlZDogdGFyZ2V0ICVkIGFzeW5jaHJvbm91c1xuIiwKKwkJCWVzcC0+ZXNwX2lkLCBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbXVsdGlieXRlX21zZyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLAorCQkJICAgICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCXVuY2hhciByZWd2YWwgPSAwOworCWludCBtZXNzYWdlX291dCA9IDA7CisKKwlFU1BTRFRSKCgiY2hrIG11bHRpYnl0ZSBtc2c6ICIpKTsKKwlpZihlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9TRFRSKSB7CisJCWludCBwZXJpb2QgPSBlc3AtPmN1cl9tc2dpblszXTsKKwkJaW50IG9mZnNldCA9IGVzcC0+Y3VyX21zZ2luWzRdOworCisJCUVTUFNEVFIoKCJpcyBzeW5jIG5lZ28gcmVzcG9uc2UsICIpKTsKKwkJaWYoIWVzcC0+c25pcCkgeworCQkJaW50IHJ2YWw7CisKKwkJCS8qIFRhcmdldCBuZWdvdGlhdGVzIGZpcnN0ISAqLworCQkJRVNQU0RUUigoInRhcmdldCBqdW1wcyB0aGUgZ3VuLCAiKSk7CisJCQltZXNzYWdlX291dCA9IEVYVEVOREVEX01FU1NBR0U7IC8qIHdlIG11c3QgcmVzcG9uZCAqLworCQkJcnZhbCA9IHRhcmdldF93aXRoX2FudHNfaW5fcGFudHMoZXNwLCBTQ3B0ciwgZXNwX2Rldik7CisJCQlpZihydmFsKQorCQkJCXJldHVybiBydmFsOworCQl9CisKKwkJRVNQU0RUUigoImV4YW1pbmluZyBzZHRyLCAiKSk7CisKKwkJLyogT2Zmc2V0IGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBFU1AgZmlmbyBzaXplLiAqLworCQlpZihvZmZzZXQgPiAxNSkgeworCQkJRVNQU0RUUigoIm9mZnNldCB0b28gYmlnICUyeCwgIiwgb2Zmc2V0KSk7CisJCQlvZmZzZXQgPSAxNTsKKwkJCUVTUFNEVFIoKCJzZW5kaW5nIGJhY2sgbmV3IG9mZnNldFxuIikpOworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIHBlcmlvZCwgb2Zmc2V0KTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisKKwkJaWYob2Zmc2V0ICYmIHBlcmlvZCA+IGVzcC0+bWF4X3BlcmlvZCkgeworCQkJLyogWWVlZSwgYXN5bmMgZm9yIHRoaXMgc2xvdyBkZXZpY2UuICovCisJCQlFU1BTRFRSKCgicGVyaW9kIHRvbyBsb25nICUyeCwgIiwgcGVyaW9kKSk7CisJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisJCQlFU1BTRFRSKCgiaG9waW5nIGZvciBtc2dvdXRcbiIpKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7CisJCX0gZWxzZSBpZiAob2Zmc2V0ICYmIHBlcmlvZCA8IGVzcC0+bWluX3BlcmlvZCkgeworCQkJRVNQU0RUUigoInBlcmlvZCB0b28gc2hvcnQgJTJ4LCAiLCBwZXJpb2QpKTsKKwkJCXBlcmlvZCA9IGVzcC0+bWluX3BlcmlvZDsKKwkJCWlmKGVzcC0+ZXJldiA+IGVzcDIzNikKKwkJCQlyZWd2YWwgPSA0OworCQkJZWxzZQorCQkJCXJlZ3ZhbCA9IDU7CisJCX0gZWxzZSBpZihvZmZzZXQpIHsKKwkJCWludCB0bXA7CisKKwkJCUVTUFNEVFIoKCJwZXJpb2QgaXMgb2ssICIpKTsKKwkJCXRtcCA9IGVzcC0+Y2N5Y2xlIC8gMTAwMDsKKwkJCXJlZ3ZhbCA9ICgoKHBlcmlvZCA8PCAyKSArIHRtcCAtIDEpIC8gdG1wKTsKKwkJCWlmKHJlZ3ZhbCAmJiAoZXNwLT5lcmV2ID4gZXNwMjM2KSkgeworCQkJCWlmKHBlcmlvZCA+PSA1MCkKKwkJCQkJcmVndmFsLS07CisJCQl9CisJCX0KKworCQlpZihvZmZzZXQpIHsKKwkJCXVuY2hhciBiaXQ7CisKKwkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IChyZWd2YWwgJiAweDFmKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IChvZmZzZXQgfCBlc3AtPnJhZGVsYXkpOworCQkJaWYoZXNwLT5lcmV2ID4gZXNwMjM2KSB7CisJCQkJaWYoZXNwLT5lcmV2ID09IGZhczEwMGEpCisJCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZBU1Q7CisJCQkJZWxzZQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GU0NTSTsKKwkJCQlpZihwZXJpb2QgPCA1MCkKKwkJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSB8PSBiaXQ7CisJCQkJZWxzZQorCQkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH5iaXQ7CisJCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOworCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKKwkJCX0KKwkJCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOworCQkJZXNwLT5wcmV2X3N0cCA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX3N0cCwgZXNwLT5wcmV2X3N0cCk7CisKKwkJCUVTUFNEVFIoKCJzb2ZmPSUyeCBzdHA9JTJ4IGNmZzM9JTJ4XG4iLAorCQkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCwKKwkJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QsCisJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSkpOworCisJCQllc3AtPnNuaXAgPSAwOworCQl9IGVsc2UgaWYoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7CisJCQl1bmNoYXIgYml0OworCisJCQkvKiBiYWNrIHRvIGFzeW5jIG1vZGUgKi8KKwkJCUVTUFNEVFIoKCJ1bmFjY2FwdGFibGUgc3luYyBuZWdvLCBmb3JjaW5nIGFzeW5jXG4iKSk7CisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKKwkJCWVzcC0+cHJldl9zb2ZmID0gMDsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX3NvZmYsIDApOworCQkJZXNwLT5wcmV2X3N0cCA9IDA7CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIDApOworCQkJaWYoZXNwLT5lcmV2ID4gZXNwMjM2KSB7CisJCQkJaWYoZXNwLT5lcmV2ID09IGZhczEwMGEpCisJCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZBU1Q7CisJCQkJZWxzZQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GU0NTSTsKKwkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH5iaXQ7CisJCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOworCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKKwkJCX0KKwkJfQorCisJCXN5bmNfcmVwb3J0KGVzcCk7CisKKwkJRVNQU0RUUigoImNoayBtdWx0aWJ5dGUgbXNnOiBzeW5jIGlzIGtub3duLCAiKSk7CisJCWVzcF9kZXYtPnN5bmMgPSAxOworCisJCWlmKG1lc3NhZ2Vfb3V0KSB7CisJCQlFU1BMT0coKCJlc3AlZDogc2VuZGluZyBzZHRyIGJhY2ssIGhvcGluZyBmb3IgbXNnb3V0XG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgcGVyaW9kLCBvZmZzZXQpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisKKwkJRVNQU0RUUigoInJldHVybmluZyB6ZXJvXG4iKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7IC8qIC4uLm9yIGVsc2UhICovCisJCXJldHVybiAwOworCX0gZWxzZSBpZihlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9XRFRSKSB7CisJCUVTUExPRygoImVzcCVkOiBBSUVFRSB3aWRlIG1zZyByZWNlaXZlZFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwl9IGVsc2UgaWYoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUikgeworCQlFU1BMT0coKCJlc3AlZDogcmVqZWN0aW5nIG1vZGlmeSBkYXRhIHB0ciBtc2dcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIG1lc3NhZ2Vfb3V0OworfQorCitzdGF0aWMgaW50IGVzcF9kb19tc2dpbmRvbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCWludCBtZXNzYWdlX291dCA9IDAsIGl0ID0gMCwgcnZhbDsKKworCXJ2YWwgPSBza2lwYWhlYWQxKGVzcCwgZXJlZ3MsIFNDcHRyLCBpbl9tc2dpbiwgaW5fbXNnaW5kb25lKTsKKwlpZihydmFsKQorCQlyZXR1cm4gcnZhbDsKKwlpZihTQ3B0ci0+U0NwLnNlbnRfY29tbWFuZCAhPSBpbl9zdGF0dXMpIHsKKwkJaWYoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykpIHsKKwkJCWlmKGVzcC0+bXNnaW5fbGVuICYmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSkgeworCQkJCW1lc3NhZ2Vfb3V0ID0gTVNHX1BBUklUWV9FUlJPUjsKKwkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOworCQkJfSBlbHNlIGlmKChpdCA9IChlc3BfcmVhZChlcmVncy0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfRkJZVEVTKSkhPTEpIHsKKwkJCQkvKiBXZSBjZXJ0YWlubHkgZHJvcHBlZCB0aGUgYmFsbCBzb21ld2hlcmUuICovCisJCQkJbWVzc2FnZV9vdXQgPSBJTklUSUFUT1JfRVJST1I7CisJCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKKwkJCX0gZWxzZSBpZighZXNwLT5tc2dpbl9sZW4pIHsKKwkJCQlpdCA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfZmRhdGEpOworCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBpdCBpcyBvayBhbmQgd2Ugd2FudCBpdCAqLworCQkJCWl0ID0gZXNwLT5jdXJfbXNnaW5bZXNwLT5tc2dpbl9jdHJdID0KKwkJCQkJZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7CisJCQkJZXNwLT5tc2dpbl9jdHIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZG9fd29ya19idXM7CisJCX0KKwl9IGVsc2UgeworCQlpdCA9IGVzcC0+Y3VyX21zZ2luWzBdOworCX0KKwlpZighbWVzc2FnZV9vdXQgJiYgZXNwLT5tc2dpbl9sZW4pIHsKKwkJaWYoZXNwLT5tc2dpbl9jdHIgPCBlc3AtPm1zZ2luX2xlbikgeworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX21zZ2luY29udCk7CisJCX0gZWxzZSBpZihlc3AtPm1zZ2luX2xlbiA9PSAxKSB7CisJCQltZXNzYWdlX291dCA9IGNoZWNrX3NpbmdsZWJ5dGVfbXNnKGVzcCwgZXJlZ3MpOworCQl9IGVsc2UgaWYoZXNwLT5tc2dpbl9sZW4gPT0gMikgeworCQkJaWYoZXNwLT5jdXJfbXNnaW5bMF0gPT0gRVhURU5ERURfTUVTU0FHRSkgeworCQkJCWlmKChpdCsyKSA+PSAxNSkgeworCQkJCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOworCQkJCX0gZWxzZSB7CisJCQkJCWVzcC0+bXNnaW5fbGVuID0gKGl0ICsgMik7CisJCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsgLyogZm9vIG9uIHlvdSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJbWVzc2FnZV9vdXQgPSBjaGVja19tdWx0aWJ5dGVfbXNnKGVzcCwgZXJlZ3MpOworCQl9CisJfQorCWlmKG1lc3NhZ2Vfb3V0IDwgMCkgeworCQlyZXR1cm4gLW1lc3NhZ2Vfb3V0OworCX0gZWxzZSBpZihtZXNzYWdlX291dCkgeworCQlpZigoKG1lc3NhZ2Vfb3V0ICE9IDEpICYmCisJCSAgICAoKG1lc3NhZ2Vfb3V0IDwgMHgyMCkgfHwgKG1lc3NhZ2Vfb3V0ICYgMHg4MCkpKSkKKwkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCWVzcC0+Y3VyX21zZ291dFswXSA9IG1lc3NhZ2Vfb3V0OworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfU0FUTik7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCWVzcC0+bXNnaW5fbGVuID0gMDsKKwl9CisJZXNwLT5zcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpOworCWVzcC0+c3JlZyAmPSB+KEVTUF9TVEFUX0lOVFIpOworCWlmKChlc3AtPnNyZWcgJiAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpKSA9PSAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpKQorCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTU9LKTsKKwlpZigoU0NwdHItPlNDcC5zZW50X2NvbW1hbmQgPT0gaW5fbXNnaW5kb25lKSAmJgorCSAgICAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9mcmVlaW5nKSkKKwkJcmV0dXJuIGVzcF9kb19mcmVlYnVzKGVzcCwgZXJlZ3MpOworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGludCBlc3BfZG9fY21kYmVnaW4oc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCisJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX2NtZGVuZCk7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKKwl0bXAgPSAqZXNwLT5lc3Bfc2NtZHArKzsKKwllc3AtPmVzcF9zY21kbGVmdC0tOworCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCB0bXApOworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19jbWRkb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOworCWlmKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0JTRVJWKSB7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKKwl9CisJRVNQTE9HKCgiZXNwJWQ6IGluIGRvX2NtZGRvbmUoKSBidXQgZGlkbid0IGdldCBCU0VSViBpbnRlcnJ1cHQuXG4iLAorCQllc3AtPmVzcF9pZCkpOworCXJldHVybiBkb19yZXNldF9idXM7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2RvX21zZ291dChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisJc3dpdGNoKGVzcC0+bXNnb3V0X2xlbikgeworCWNhc2UgMToKKwkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFswXSk7CisJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsxXSk7CisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCQl9IGVsc2UgeworCQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07CisJCQllc3AtPmRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgMiwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDIpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSA0OgorCQllc3AtPnNuaXAgPSAxOworCQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsxXSk7CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzJdKTsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbM10pOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKKwkJfSBlbHNlIHsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07CisJCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOworCQkJZXNwLT5lc3BfY29tbWFuZFsyXSA9IGVzcC0+Y3VyX21zZ291dFsyXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbM10gPSBlc3AtPmN1cl9tc2dvdXRbM107CisJCQllc3AtPmRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgNCwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDQpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSA1OgorCQllc3AtPnNuaXAgPSAxOworCQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsxXSk7CisJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzJdKTsKKwkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbM10pOworCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFs0XSk7CisJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOworCQl9IGVsc2UgeworCQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07CisJCQllc3AtPmVzcF9jb21tYW5kWzJdID0gZXNwLT5jdXJfbXNnb3V0WzJdOworCQkJZXNwLT5lc3BfY29tbWFuZFszXSA9IGVzcC0+Y3VyX21zZ291dFszXTsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbNF0gPSBlc3AtPmN1cl9tc2dvdXRbNF07CisJCQllc3AtPmRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgNSwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDUpOworCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogd2hvb3BzICovCisJCUVTUE1JU0MoKCJib2d1cyBtc2dvdXQgc2VuZGluZyBOT1BcbiIpKTsKKwkJZXNwLT5jdXJfbXNnb3V0WzBdID0gTk9QOworCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzBdKTsKKwkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKKwkJYnJlYWs7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0ZG9uZSk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19tc2dvdXRkb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIAorCQkJICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQoreworCWlmKChlc3AtPm1zZ291dF9sZW4gPiAxKSAmJiBlc3AtPmRtYV9iYXJyaWVyKQorCQllc3AtPmRtYV9iYXJyaWVyKGVzcCk7CisKKwlpZighKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSkgeworCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCk7CisJCXN3aXRjaChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgeworCQljYXNlIEVTUF9NT1A6CisJCQkvKiB3aG9vcHMsIHBhcml0eSBlcnJvciAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IHN0aWxsIGluIG1zZ291dCwgcGFyaXR5IGVycm9yIGFzc3VtZWRcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCWlmKGVzcC0+bXNnb3V0X2xlbiA+IDEpCisJCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXQpOworCQkJcmV0dXJuIGRvX3dvcmtfYnVzOworCisJCWNhc2UgRVNQX0RJUDoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZighZmNvdW50KGVzcCwgZXJlZ3MpICYmCisJCQkgICAhKCgoc3RydWN0IGVzcF9kZXZpY2UgKillc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aG9zdGRhdGEpLT5zeW5jX21heF9vZmZzZXQpKQorCQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7CisJCQlicmVhazsKKworCQl9OworCX0KKworCS8qIElmIHdlIHNlbnQgb3V0IGEgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gbWVzc2FnZSwgdXBkYXRlCisJICogb3VyIHN0YXRlLgorCSAqLworCWlmKGVzcC0+Y3VyX21zZ291dFsyXSA9PSBFWFRFTkRFRF9NRVNTQUdFICYmCisJICAgZXNwLT5jdXJfbXNnb3V0WzRdID09IEVYVEVOREVEX1NEVFIpIHsKKwkJZXNwLT5zbmlwID0gMTsgLyogYW5hbCByZXRlbnRpdmVuZXNzLi4uICovCisJfQorCisJZXNwLT5wcmV2bXNnb3V0ID0gZXNwLT5jdXJfbXNnb3V0WzBdOworCWVzcC0+bXNnb3V0X2xlbiA9IDA7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2J1c191bmV4cGVjdGVkKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJRVNQTE9HKCgiZXNwJWQ6IGNvbW1hbmQgaW4gd2VpcmQgc3RhdGUgJTJ4XG4iLAorCQllc3AtPmVzcF9pZCwgZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCitzdGF0aWMgZXNwZnVuY190IGJ1c192ZWN0b3JbXSA9IHsKKwllc3BfZG9fZGF0YV9maW5hbGUsCisJZXNwX2RvX2RhdGFfZmluYWxlLAorCWVzcF9idXNfdW5leHBlY3RlZCwKKwllc3BfZG9fbXNnaW4sCisJZXNwX2RvX21zZ2luY29udCwKKwllc3BfZG9fbXNnaW5kb25lLAorCWVzcF9kb19tc2dvdXQsCisJZXNwX2RvX21zZ291dGRvbmUsCisJZXNwX2RvX2NtZGJlZ2luLAorCWVzcF9kb19jbWRkb25lLAorCWVzcF9kb19zdGF0dXMsCisJZXNwX2RvX2ZyZWVidXMsCisJZXNwX2RvX3BoYXNlX2RldGVybWluZSwKKwllc3BfYnVzX3VuZXhwZWN0ZWQsCisJZXNwX2J1c191bmV4cGVjdGVkLAorCWVzcF9idXNfdW5leHBlY3RlZCwKK307CisKKy8qIFRoaXMgaXMgdGhlIHNlY29uZCB0aWVyIGluIG91ciBkdWFsLWxldmVsIFNDU0kgc3RhdGUgbWFjaGluZS4gKi8KK3N0YXRpYyBpbnQgZXNwX3dvcmtfYnVzKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCit7CisJU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwl1bnNpZ25lZCBpbnQgcGhhc2U7CisKKwlFU1BCVVMoKCJlc3Bfd29ya19idXM6ICIpKTsKKwlpZighU0NwdHIpIHsKKwkJRVNQQlVTKCgicmVjb25uZWN0XG4iKSk7CisJCXJldHVybiBlc3BfZG9fcmVjb25uZWN0KGVzcCwgZXJlZ3MpOworCX0KKwlwaGFzZSA9IFNDcHRyLT5TQ3AucGhhc2U7CisJaWYgKChwaGFzZSAmIDB4ZjApID09IGluX3BoYXNlc19tYXNrKQorCQlyZXR1cm4gYnVzX3ZlY3RvclsocGhhc2UgJiAweDBmKV0oZXNwLCBlcmVncyk7CisJZWxzZSBpZigocGhhc2UgJiAweGYwKSA9PSBpbl9zbGN0X21hc2spCisJCXJldHVybiBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCwgZXJlZ3MpOworCWVsc2UKKwkJcmV0dXJuIGVzcF9idXNfdW5leHBlY3RlZChlc3AsIGVyZWdzKTsKK30KKworc3RhdGljIGVzcGZ1bmNfdCBpc3ZjX3ZlY3RvcltdID0geworCU5VTEwsCisJZXNwX2RvX3BoYXNlX2RldGVybWluZSwKKwllc3BfZG9fcmVzZXRidXMsCisJZXNwX2ZpbmlzaF9yZXNldCwKKwllc3Bfd29ya19idXMKK307CisKKy8qIE1haW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFuIGVzcCBhZGFwdGVyLiAqLwordm9pZCBlc3BfaGFuZGxlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IEVTUF9yZWdzICplcmVnczsKKwlTY3NpX0NtbmQgKlNDcHRyOworCWludCB3aGF0X25leHQgPSBkb19pbnRyX2VuZDsKKwllcmVncyA9IGVzcC0+ZXJlZ3M7CisJU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisKKwlpZihlc3AtPmRtYV9pcnFfZW50cnkpCisJCWVzcC0+ZG1hX2lycV9lbnRyeShlc3ApOworCisJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwllc3AtPnNyZWcgPSBlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cyk7CisJZXNwLT5zcmVnICY9ICh+RVNQX1NUQVRfSU5UUik7CisJZXNwLT5zZXFyZWcgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9zc3RlcCkgJiBFU1BfU1RFUF9WQklUUyk7CisJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOyAgIC8qIFVubGF0Y2ggaW50ciBhbmQgc3RhdCByZWdzICovCisJRVNQSVJRKCgiaGFuZGxlX2lycTogW3NyZWc8JTAyeD4gc3N0ZXA8JTAyeD4gaXJlZzwlMDJ4Pl1cbiIsCisJCWVzcC0+c3JlZywgZXNwLT5zZXFyZWcsIGVzcC0+aXJlZykpOworCWlmKGVzcC0+c3JlZyAmIChFU1BfU1RBVF9TUEFNKSkgeworCQkvKiBHcm9zcyBlcnJvciwgY291bGQgYmUgZHVlIHRvIG9uZSBvZjoKKwkJICoKKwkJICogLSB0b3Agb2YgZmlmbyBvdmVyd3JpdHRlbiwgY291bGQgYmUgYmVjYXVzZQorCQkgKiAgIHdlIHRyaWVkIHRvIGRvIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgd2l0aAorCQkgKiAgIGFuIG9mZnNldCBncmVhdGVyIHRoYW4gRVNQIGZpZm8gc2l6ZQorCQkgKgorCQkgKiAtIHRvcCBvZiBjb21tYW5kIHJlZ2lzdGVyIG92ZXJ3cml0dGVuCisJCSAqCisJCSAqIC0gRE1BIHNldHVwIHRvIGdvIGluIG9uZSBkaXJlY3Rpb24sIFNDU0kKKwkJICogICBidXMgcG9pbnRzIGluIHRoZSBvdGhlciwgd2hvb3BzCisJCSAqCisJCSAqIC0gd2VpcmQgcGhhc2UgY2hhbmdlIGR1cmluZyBhc3luY2hyb25vdXMKKwkJICogICBkYXRhIHBoYXNlIHdoaWxlIHdlIGFyZSBpbml0aWF0b3IKKwkJICovCisJCUVTUExPRygoImVzcCVkOiBHcm9zcyBlcnJvciBzcmVnPSUyeFxuIiwgZXNwLT5lc3BfaWQsIGVzcC0+c3JlZykpOworCisJCS8qIElmIGEgY29tbWFuZCBpcyBsaXZlIG9uIHRoZSBidXMgd2UgY2Fubm90IHNhZmVseQorCQkgKiByZXNldCB0aGUgYnVzLCBzbyB3ZSdsbCBqdXN0IGxldCB0aGUgcGllY2VzIGZhbGwKKwkJICogd2hlcmUgdGhleSBtYXkuICBIZXJlIHdlIGFyZSBob3BpbmcgdGhhdCB0aGUKKwkJICogdGFyZ2V0IHdpbGwgYmUgYWJsZSB0byBjbGVhbmx5IGdvIGF3YXkgc29vbgorCQkgKiBzbyB3ZSBjYW4gc2FmZWx5IHJlc2V0IHRoaW5ncy4KKwkJICovCisJCWlmKCFTQ3B0cikgeworCQkJRVNQTE9HKCgiZXNwJWQ6IE5vIGN1cnJlbnQgY21kIGR1cmluZyBncm9zcyBlcnJvciwgIgorCQkJCSJyZXNldHRpbmcgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOworCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOworCQkJZ290byBzdGF0ZV9tYWNoaW5lOworCQl9CisJfQorCisJLyogTm8gY3VycmVudCBjbWQgaXMgb25seSB2YWxpZCBhdCB0aGlzIHBvaW50IHdoZW4gdGhlcmUgYXJlCisJICogY29tbWFuZHMgb2ZmIHRoZSBidXMgb3Igd2UgYXJlIHRyeWluZyBhIHJlc2V0LgorCSAqLworCWlmKCFTQ3B0ciAmJiAhZXNwLT5kaXNjb25uZWN0ZWRfU0MgJiYgIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpIHsKKwkJLyogUGFuaWMgaXMgc2FmZSwgc2luY2UgY3VycmVudF9TQyBpcyBudWxsLiAqLworCQlFU1BMT0coKCJlc3AlZDogbm8gY29tbWFuZCBpbiBlc3BfaGFuZGxlKClcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCXBhbmljKCJlc3BfaGFuZGxlOiBjdXJyZW50X1NDID09IHBlbmd1aW4gd2l0aGluIGludGVycnVwdCEiKTsKKwl9CisKKwlpZihlc3AtPmlyZWcgJiAoRVNQX0lOVFJfSUMpKSB7CisJCS8qIElsbGVnYWwgY29tbWFuZCBmZWQgdG8gRVNQLiAgT3V0c2lkZSBvZiBvYnZpb3VzCisJCSAqIHNvZnR3YXJlIGJ1Z3MgdGhhdCBjb3VsZCBjYXVzZSB0aGlzLCB0aGVyZSBpcworCQkgKiBhIGNvbmRpdGlvbiB3aXRoIEVTUDEwMCB3aGVyZSB3ZSBjYW4gY29uZnVzZSB0aGUKKwkJICogRVNQIGludG8gYW4gZXJyb25lb3VzIGlsbGVnYWwgY29tbWFuZCBpbnRlcnJ1cHQKKwkJICogYmVjYXVzZSBpdCBkb2VzIG5vdCBzY3JhcGUgdGhlIEZJRk8gcHJvcGVybHkKKwkJICogZm9yIHJlc2VsZWN0aW9uLiAgU2VlIGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoKQorCQkgKiB0byBzZWUgaG93IHdlIHRyeSB2ZXJ5IGhhcmQgdG8gYXZvaWQgdGhpcy4KKwkJICovCisJCUVTUExPRygoImVzcCVkOiBpbnZhbGlkIGNvbW1hbmRcbiIsIGVzcC0+ZXNwX2lkKSk7CisKKwkJZXNwX2R1bXBfc3RhdGUoZXNwLCBlcmVncyk7CisKKwkJaWYoU0NwdHIpIHsKKwkJCS8qIERldmljZXMgd2l0aCB2ZXJ5IGJ1Z2d5IGZpcm13YXJlIGNhbiBkcm9wIEJTWQorCQkJICogZHVyaW5nIGEgc2NhdHRlciBsaXN0IGludGVycnVwdCB3aGVuIHVzaW5nIHN5bmMKKwkJCSAqIG1vZGUgdHJhbnNmZXJzLiAgV2UgY29udGludWUgdGhlIHRyYW5zZmVyIGFzCisJCQkgKiBleHBlY3RlZCwgdGhlIHRhcmdldCBkcm9wcyB0aGUgYnVzLCB0aGUgRVNQCisJCQkgKiBnZXRzIGNvbmZ1c2VkLCBhbmQgd2UgZ2V0IGEgaWxsZWdhbCBjb21tYW5kCisJCQkgKiBpbnRlcnJ1cHQgYmVjYXVzZSB0aGUgYnVzIGlzIGluIHRoZSBkaXNjb25uZWN0ZWQKKwkJCSAqIHN0YXRlIG5vdyBhbmQgRVNQX0NNRF9USSBpcyBvbmx5IGFsbG93ZWQgd2hlbgorCQkJICogYSBuZXh1cyBpcyBhbGl2ZSBvbiB0aGUgYnVzLgorCQkJICovCisJCQlFU1BMT0coKCJlc3AlZDogRm9yY2luZyBhc3luYyBhbmQgZGlzYWJsaW5nIGRpc2Nvbm5lY3QgZm9yICIKKwkJCQkidGFyZ2V0ICVkXG4iLCBlc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKKwkJCVNDcHRyLT5kZXZpY2UtPmJvcmtlbiA9IDE7IC8qIGZvbyBvbiB5b3UgKi8KKwkJfQorCisJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwl9IGVsc2UgaWYoIShlc3AtPmlyZWcgJiB+KEVTUF9JTlRSX0ZET05FIHwgRVNQX0lOVFJfQlNFUlYgfCBFU1BfSU5UUl9EQykpKSB7CisJCWludCBwaGFzZTsKKworCQlpZihTQ3B0cikgeworCQkJcGhhc2UgPSBTQ3B0ci0+U0NwLnBoYXNlOworCQkJaWYocGhhc2UgJiBpbl9waGFzZXNfbWFzaykgeworCQkJCXdoYXRfbmV4dCA9IGVzcF93b3JrX2J1cyhlc3AsIGVyZWdzKTsKKwkJCX0gZWxzZSBpZihwaGFzZSAmIGluX3NsY3RfbWFzaykgeworCQkJCXdoYXRfbmV4dCA9IGVzcF9zZWxlY3RfY29tcGxldGUoZXNwLCBlcmVncyk7CisJCQl9IGVsc2UgeworCQkJCUVTUExPRygoImVzcCVkOiBpbnRlcnJ1cHQgZm9yIG5vIGdvb2QgcmVhc29uLi4uXG4iLAorCQkJCQllc3AtPmVzcF9pZCkpOworCQkJCXdoYXRfbmV4dCA9IGRvX2ludHJfZW5kOworCQkJfQorCQl9IGVsc2UgeworCQkJRVNQTE9HKCgiZXNwJWQ6IEJTRVJWIG9yIEZET05FIG9yIERDIHdoaWxlIFNDcHRyPT1OVUxMXG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJCX0KKwl9IGVsc2UgaWYoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IFNDU0kgYnVzIHJlc2V0IGludGVycnVwdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfY29tcGxldGU7CisJfSBlbHNlIGlmKGVzcC0+aXJlZyAmIChFU1BfSU5UUl9TIHwgRVNQX0lOVFJfU0FUTikpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IEFJRUVFIHdlIGhhdmUgYmVlbiBzZWxlY3RlZCBieSBhbm90aGVyIGluaXRpYXRvciFcbiIsCisJCQllc3AtPmVzcF9pZCkpOworCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJfSBlbHNlIGlmKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1JTRUwpIHsKKwkJaWYoIVNDcHRyKSB7CisJCQkvKiBUaGlzIGlzIG9rLiAqLworCQkJd2hhdF9uZXh0ID0gZXNwX2RvX3JlY29ubmVjdChlc3AsIGVyZWdzKTsKKwkJfSBlbHNlIGlmKFNDcHRyLT5TQ3AucGhhc2UgJiBpbl9zbGN0X21hc2spIHsKKwkJCS8qIE9ubHkgc2VsZWN0aW9uIGNvZGUga25vd3MgaG93IHRvIGNsZWFuCisJCQkgKiB1cCBwcm9wZXJseS4KKwkJCSAqLworCQkJRVNQRElTQygoIlJlc2VsZWN0ZWQgZHVyaW5nIHNlbGVjdGlvbiBhdHRlbXB0XG4iKSk7CisJCQl3aGF0X25leHQgPSBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCwgZXJlZ3MpOworCQl9IGVsc2UgeworCQkJRVNQTE9HKCgiZXNwJWQ6IFJlc2VsZWN0ZWQgd2hpbGUgYnVzIGlzIGJ1c3lcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJfQorCX0KKworCS8qIFRoaXMgaXMgdGllci1vbmUgaW4gb3VyIGR1YWwgbGV2ZWwgU0NTSSBzdGF0ZSBtYWNoaW5lLiAqLworc3RhdGVfbWFjaGluZToKKwl3aGlsZSh3aGF0X25leHQgIT0gZG9faW50cl9lbmQpIHsKKwkJaWYgKHdoYXRfbmV4dCA+PSBkb19waGFzZV9kZXRlcm1pbmUgJiYKKwkJICAgIHdoYXRfbmV4dCA8IGRvX2ludHJfZW5kKQorCQkJd2hhdF9uZXh0ID0gaXN2Y192ZWN0b3Jbd2hhdF9uZXh0XShlc3AsIGVyZWdzKTsKKwkJZWxzZSB7CisJCQkvKiBzdGF0ZSBpcyBjb21wbGV0ZWx5IGxvc3QgOy0oICovCisJCQlFU1BMT0coKCJlc3AlZDogaW50ZXJydXB0IGVuZ2luZSBsb3NlcyBzdGF0ZSwgcmVzZXR0aW5nIGJ1c1xuIiwKKwkJCQllc3AtPmVzcF9pZCkpOworCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOworCQl9CisJfQorCWlmKGVzcC0+ZG1hX2lycV9leGl0KQorCQllc3AtPmRtYV9pcnFfZXhpdChlc3ApOworfQorCisjaWZuZGVmIENPTkZJR19TTVAKK2lycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYWdhaW47CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCisJLyogSGFuZGxlIGFsbCBFU1AgaW50ZXJydXB0cyBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CityZXBlYXQ6CisJYWdhaW4gPSAwOworCWZvcl9lYWNoX2VzcChlc3ApIHsKKyNpZm5kZWYgX19taXBzX18JICAgIAorCQlpZigoKGVzcCktPmlycSAmIDB4ZmYpID09IGlycSkgeworI2VuZGlmCQkgICAgCisJCQlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7CisJCQkJYWdhaW4gPSAxOworCisJCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKKworCQkJCUVTUElSUSgoIkklZCgiLCBlc3AtPmVzcF9pZCkpOworCQkJCWVzcF9oYW5kbGUoZXNwKTsKKwkJCQlFU1BJUlEoKCIpIikpOworCisJCQkJZXNwLT5kbWFfaW50c19vbihlc3ApOworCQkJfQorI2lmbmRlZiBfX21pcHNfXwkJICAgIAorCQl9CisjZW5kaWYJICAgIAorCX0KKwlpZihhZ2FpbikKKwkJZ290byByZXBlYXQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbHNlCisvKiBGb3IgU01QIHdlIG9ubHkgc2VydmljZSBvbmUgRVNQIG9uIHRoZSBsaXN0IGxpc3QgYXQgb3VyIElSUSBsZXZlbCEgKi8KK2lycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisJCisJLyogSGFuZGxlIGFsbCBFU1AgaW50ZXJydXB0cyBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJZm9yX2VhY2hfZXNwKGVzcCkgeworCQlpZigoKGVzcCktPmlycSAmIDB4ZikgPT0gaXJxKSB7CisJCQlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7CisJCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKKworCQkJCUVTUElSUSgoIklbJWQ6JWRdKCIsCisJCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZXNwLT5lc3BfaWQpKTsKKwkJCQllc3BfaGFuZGxlKGVzcCk7CisJCQkJRVNQSVJRKCgiKSIpKTsKKworCQkJCWVzcC0+ZG1hX2ludHNfb24oZXNwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK2ludCBlc3Bfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKlNEcHRyKQoreworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKworCWlmICghZXNwX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGVzcF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgZXNwX2RldmljZSkpOworCVNEcHRyLT5ob3N0ZGF0YSA9IGVzcF9kZXY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXNwX3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKlNEcHRyKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0RwdHItPmhvc3QtPmhvc3RkYXRhOworCisJZXNwLT50YXJnZXRzX3ByZXNlbnQgJj0gfigxIDw8IFNEcHRyLT5pZCk7CisJa2ZyZWUoU0RwdHItPmhvc3RkYXRhKTsKKwlTRHB0ci0+aG9zdGRhdGEgPSBOVUxMOworfQorCisjaWZkZWYgTU9EVUxFCitpbnQgaW5pdF9tb2R1bGUodm9pZCkgeyByZXR1cm4gMDsgfQordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKSB7fQordm9pZCBlc3BfcmVsZWFzZSh2b2lkKQoreworCWVzcHNfaW5fdXNlLS07CisJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7Cit9CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChlc3BfYWJvcnQpOworRVhQT1JUX1NZTUJPTChlc3BfYWxsb2NhdGUpOworRVhQT1JUX1NZTUJPTChlc3BfZGVhbGxvY2F0ZSk7CitFWFBPUlRfU1lNQk9MKGVzcF9pbml0aWFsaXplKTsKK0VYUE9SVF9TWU1CT0woZXNwX2ludHIpOworRVhQT1JUX1NZTUJPTChlc3BfcXVldWUpOworRVhQT1JUX1NZTUJPTChlc3BfcmVzZXQpOworRVhQT1JUX1NZTUJPTChlc3Bfc2xhdmVfYWxsb2MpOworRVhQT1JUX1NZTUJPTChlc3Bfc2xhdmVfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGVzcHNfaW5fdXNlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmggYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmU3ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzQzl4LmgKQEAgLTAsMCArMSw2NjkgQEAKKy8qIE5DUjUzQzl4LmM6ICBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgTkNSNTNDOXggZ2VuZXJpYyBkcml2ZXIuCisgKgorICogT3JpZ2luYWx5IGVzcC5oOiAgRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgdGhlIFNwYXJjIEVTUCAKKyAqICAgICAgICAgICAgICAgICAgIChFbmhhbmNlZCBTQ1NJIFByb2Nlc3NvcikgZHJpdmVyIHVuZGVyIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKgorICogR2VuZXJhbGl6YXRpb24gYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykKKyAqCisgKiBNb3JlIGdlbmVyYWxpemF0aW9uIChmb3IgaTM4NiBzdHVmZikgYnkgVHltbSBUd2lsbG1hbiAodHltbUBjb21wdXRlci5vcmcpCisgKi8KKworI2lmbmRlZiBOQ1I1M0M5WF9ICisjZGVmaW5lIE5DUjUzQzlYX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBkandlaXMgZm9yIG1hYyBkcml2ZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NQUMpCisjZGVmaW5lIFBBRF9TSVpFIDE1CisjZWxzZQorI2RlZmluZSBQQURfU0laRSAzCisjZW5kaWYKKworLyogSGFuZGxlIG11bHRpcGxlIGhvc3RhZGFwdGVycyBvbiBBbWlnYQorICogZ2VuZXJhbGx5IFBBRF9TSVpFID0gMworICogYnV0IHRoZXJlIGlzIG9uZSBleGNlcHRpb246IE9rdGFnb24gKFBBRF9TSVpFID0gMSkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PS1RBR09OX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX09LVEFHT05fU0NTSV9NT0RVTEUpCisjdW5kZWYgUEFEX1NJWkUKKyNpZiBkZWZpbmVkKENPTkZJR19CTFoxMjMwX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX0JMWjEyMzBfU0NTSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19CTFoyMDYwX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX0JMWjIwNjBfU0NTSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DWUJFUlNUT1JNX1NDU0kpIHx8IGRlZmluZWQoQ09ORklHX0NZQkVSU1RPUk1fU0NTSV9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DWUJFUlNUT1JNSUlfU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfQ1lCRVJTVE9STUlJX1NDU0lfTU9EVUxFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfRkFTVExBTkVfU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfRkFTVExBTkVfU0NTSV9NT0RVTEUpCisjZGVmaW5lIE1VTFRJUExFX1BBRF9TSVpFUworI2Vsc2UKKyNkZWZpbmUgUEFEX1NJWkUgMQorI2VuZGlmCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKworI2RlZmluZSBERUJVR19FU1AKKy8qICNkZWZpbmUgREVCVUdfRVNQX0RBVEEgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1FVRVVFICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9ESVNDT05ORUNUICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9TVEFUVVMgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1BIQVNFUyAqLworLyogI2RlZmluZSBERUJVR19FU1BfV09SS0JVUyAqLworLyogI2RlZmluZSBERUJVR19TVEFURV9NQUNISU5FICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9DTURTICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9JUlFTICovCisvKiAjZGVmaW5lIERFQlVHX1NEVFIgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1NHICovCisKKy8qIFVzZSB0aGUgZm9sbG93aW5nIHRvIHNwcmlua2xlIGRlYnVnZ2luZyBtZXNzYWdlcyBpbiBhIHdheSB3aGljaAorICogc3VpdHMgeW91IGlmIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYmVjb21lIHRvbyB2ZXJib3NlIHdoZW4KKyAqIHRyeWluZyB0byB0cmFjayBkb3duIGEgc3BlY2lmaWMgcHJvYmxlbS4KKyAqLworLyogI2RlZmluZSBERUJVR19FU1BfTUlTQyAqLworCisjaWYgZGVmaW5lZChERUJVR19FU1ApCisjZGVmaW5lIEVTUExPRyhmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BMT0coZm9vKQorI2VuZGlmIC8qIChERUJVR19FU1ApICovCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9EQVRBKQorI2RlZmluZSBFU1BEQVRBKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUERBVEEoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9RVUVVRSkKKyNkZWZpbmUgRVNQUVVFVUUoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQUVVFVUUoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9ESVNDT05ORUNUKQorI2RlZmluZSBFU1BESVNDKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUERJU0MoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9TVEFUVVMpCisjZGVmaW5lIEVTUFNUQVQoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQU1RBVChmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX1BIQVNFUykKKyNkZWZpbmUgRVNQUEhBU0UoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQUEhBU0UoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9XT1JLQlVTKQorI2RlZmluZSBFU1BCVVMoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQQlVTKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfSVJRUykKKyNkZWZpbmUgRVNQSVJRKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUElSUShmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfU0RUUikKKyNkZWZpbmUgRVNQU0RUUihmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BTRFRSKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfTUlTQykKKyNkZWZpbmUgRVNQTUlTQyhmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BNSVNDKGZvbykKKyNlbmRpZgorCisvKgorICogcGFkZGluZyBmb3IgcmVnaXN0ZXIgc3RydWN0dXJlCisgKi8KKyNpZmRlZiBDT05GSUdfSkFaWl9FU1AKKyNkZWZpbmUgRVJFR1NfUEFEKG4pCisjZWxzZQorI2lmbmRlZiBNVUxUSVBMRV9QQURfU0laRVMKKyNkZWZpbmUgRVJFR1NfUEFEKG4pICAgIHVuY2hhciBuW1BBRF9TSVpFXTsKKyNlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBFU1AgU0NTSSBjb250cm9sbGVycyBoYXZlIHRoZWlyIHJlZ2lzdGVyIHNldHMgaW4gdGhyZWUKKyAqICJjbGFzc2VzIjoKKyAqCisgKiAxKSBSZWdpc3RlcnMgd2hpY2ggYXJlIGJvdGggcmVhZCBhbmQgd3JpdGUuCisgKiAyKSBSZWdpc3RlcnMgd2hpY2ggYXJlIHJlYWQgb25seS4KKyAqIDMpIFJlZ2lzdGVycyB3aGljaCBhcmUgd3JpdGUgb25seS4KKyAqCisgKiBZZXQsIHRoZXkgYWxsIGxpdmUgd2l0aGluIHRoZSBzYW1lIElPIHNwYWNlLgorICovCisKKyNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKworI2lmbmRlZiBNVUxUSVBMRV9QQURfU0laRVMKKworI2lmZGVmIENPTkZJR19DUFVfSEFTX1dCCisjaW5jbHVkZSA8YXNtL3diZmx1c2guaD4KKyNkZWZpbmUgZXNwX3dyaXRlKF9fcmVnLCBfX3ZhbCkgZG97KF9fcmVnKSA9IChfX3ZhbCk7IHdiZmx1c2goKTt9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBlc3Bfd3JpdGUoX19yZWcsIF9fdmFsKSAoKF9fcmVnKSA9IChfX3ZhbCkpCisjZW5kaWYKKyNkZWZpbmUgZXNwX3JlYWQoX19yZWcpIChfX3JlZykKKworc3RydWN0IEVTUF9yZWdzIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjZXNzICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICBPZmZzZXQgKi8KKyAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX3RjbG93OyAgLyogcncgIExvdyBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDAwICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKHRscGFkMSk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF90Y21lZDsgIC8qIHJ3ICBNaWQgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChmZHBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9mZGF0YTsgIC8qIHJ3ICBGSUZPIGRhdGEgYml0cyAgICAgICAgICAgICAgICAgMHgwOCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjYnBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jbW5kOyAgIC8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChzdHBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9zdGF0dXM7IC8qIHJvICBFU1Agc3RhdHVzIHJlZ2lzdGVyICAgICAgICAgICAgMHgxMCAgICovCisjZGVmaW5lIGVzcF9idXNpZCAgIGVzcF9zdGF0dXMgIC8qIHdvICBCdXMgSUQgZm9yIHNlbGVjdC9yZXNlbGVjdCAgICAgMHgxMCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChpcnFwZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9pbnRycHQ7IC8qIHJvICBLaW5kIG9mIGludGVycnVwdCAgICAgICAgICAgICAgMHgxNCAgICovCisjZGVmaW5lIGVzcF90aW1lbyAgIGVzcF9pbnRycHQgIC8qIHdvICBUaW1lb3V0IHZhbHVlIGZvciBzZWxlY3QvcmVzZWwgMHgxNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChzc3BhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9zc3RlcDsgIC8qIHJvICBTZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICAgICAgICAgMHgxOCAgICovCisjZGVmaW5lIGVzcF9zdHAgICAgIGVzcF9zc3RlcCAgIC8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChmZnBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9mZmxhZ3M7IC8qIHJvICBCaXRzIG9mIGN1cnJlbnQgRklGTyBpbmZvICAgICAgMHgxYyAgICovCisjZGVmaW5lIGVzcF9zb2ZmICAgIGVzcF9mZmxhZ3MgIC8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZjFwZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmcxOyAgIC8qIHJ3ICBGaXJzdCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgyMCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZnBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmFjdDsgIC8qIHdvICBDbG9jayBjb252ZXJzaW9uIGZhY3RvciAgICAgICAgMHgyNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjdHBhZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jdGVzdDsgIC8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZjJwZCk7CisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmcyOyAgIC8qIHJ3ICBTZWNvbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgyYyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRChjZjNwZCk7CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGlzIG9ubHkgZm91bmQgb24gdGhlIDUzQzlYIHNlcmllcyBTQ1NJIGNoaXBzICovCisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9jZmczOyAgIC8qIHJ3ICBUaGlyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgzMCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNmNHBkKTsKKyAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NmZzQ7ICAgLyogcncgIEZvdXJ0aCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDM0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkVHU19QQUQodGhwZCk7CisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBmb3VuZCBvbiBhbGwgY2hpcHMgZXhjZXB0IHRoZSBOQ1I1M0M5MCAoRVNQMTAwKSAqLworICAgIHZvbGF0aWxlIHVuY2hhciBlc3BfdGNoaTsgICAvKiBydyAgSGlnaCBiaXRzIG9mIHRyYW5zZmVyIGNvdW50ICAgIDB4MzggICovCisjZGVmaW5lIGVzcF91aWQgICAgIGVzcF90Y2hpICAgIC8qIHJvICBVbmlxdWUgSUQgY29kZSAgICAgICAgICAgICAgICAgMHgzOCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGZncGFkKTsgICAgCisgICAgdm9sYXRpbGUgdW5jaGFyIGVzcF9mZ3JuZDsgIC8qIHJ3ICBEYXRhIGJhc2UgZm9yIGZpZm8gICAgICAgICAgICAgMHgzYyAgKi8KK307CisKKyNlbHNlIC8qIE1VTFRJUExFX1BBRF9TSVpFUyAqLworCisjZGVmaW5lIGVzcF93cml0ZShfX3JlZywgX192YWwpICgqKF9fcmVnKSA9IChfX3ZhbCkpCisjZGVmaW5lIGVzcF9yZWFkKF9fcmVnKSAoKihfX3JlZykpCisKK3N0cnVjdCBFU1BfcmVncyB7CisgICAgdW5zaWduZWQgY2hhciBpb19hZGRyWzY0XTsgLyogZHVtbXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2Nlc3MgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgIE9mZnNldCAqLworI2RlZmluZSBlc3BfdGNsb3cgICBpb19hZGRyICAgICAgICAgICAgICAgICAgICAgIC8qIHJ3ICBMb3cgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwMCAgICovCisjZGVmaW5lIGVzcF90Y21lZCAgIGlvX2FkZHIgKyAoMTw8KGVzcC0+c2hpZnQpKSAgLyogcncgIE1pZCBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDA0ICAgKi8KKyNkZWZpbmUgZXNwX2ZkYXRhICAgaW9fYWRkciArICgyPDwoZXNwLT5zaGlmdCkpICAvKiBydyAgRklGTyBkYXRhIGJpdHMgICAgICAgICAgICAgICAgIDB4MDggICAqLworI2RlZmluZSBlc3BfY21uZCAgICBpb19hZGRyICsgKDM8PChlc3AtPnNoaWZ0KSkgIC8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCisjZGVmaW5lIGVzcF9zdGF0dXMgIGlvX2FkZHIgKyAoNDw8KGVzcC0+c2hpZnQpKSAgLyogcm8gIEVTUCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgICAweDEwICAgKi8KKyNkZWZpbmUgZXNwX2J1c2lkICAgZXNwX3N0YXR1cyAgICAgICAgICAgICAgICAgICAvKiB3byAgQnVzIElEIGZvciBzZWxlY3QvcmVzZWxlY3QgICAgIDB4MTAgICAqLworI2RlZmluZSBlc3BfaW50cnB0ICBpb19hZGRyICsgKDU8PChlc3AtPnNoaWZ0KSkgIC8qIHJvICBLaW5kIG9mIGludGVycnVwdCAgICAgICAgICAgICAgMHgxNCAgICovCisjZGVmaW5lIGVzcF90aW1lbyAgIGVzcF9pbnRycHQgICAgICAgICAgICAgICAgICAgLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KKyNkZWZpbmUgZXNwX3NzdGVwICAgaW9fYWRkciArICg2PDwoZXNwLT5zaGlmdCkpICAvKiBybyAgU2VxdWVuY2Ugc3RlcCByZWdpc3RlciAgICAgICAgIDB4MTggICAqLworI2RlZmluZSBlc3Bfc3RwICAgICBlc3Bfc3N0ZXAgICAgICAgICAgICAgICAgICAgIC8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCisjZGVmaW5lIGVzcF9mZmxhZ3MgIGlvX2FkZHIgKyAoNzw8KGVzcC0+c2hpZnQpKSAgLyogcm8gIEJpdHMgb2YgY3VycmVudCBGSUZPIGluZm8gICAgICAweDFjICAgKi8KKyNkZWZpbmUgZXNwX3NvZmYgICAgZXNwX2ZmbGFncyAgICAgICAgICAgICAgICAgICAvKiB3byAgU3luYyBvZmZzZXQgICAgICAgICAgICAgICAgICAgIDB4MWMgICAqLworI2RlZmluZSBlc3BfY2ZnMSAgICBpb19hZGRyICsgKDg8PChlc3AtPnNoaWZ0KSkgIC8qIHJ3ICBGaXJzdCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgyMCAgICovCisjZGVmaW5lIGVzcF9jZmFjdCAgIGlvX2FkZHIgKyAoOTw8KGVzcC0+c2hpZnQpKSAgLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KKyNkZWZpbmUgZXNwX2N0ZXN0ICAgaW9fYWRkciArICgxMDw8KGVzcC0+c2hpZnQpKSAvKiB3byAgQ2hpcCB0ZXN0IHJlZ2lzdGVyICAgICAgICAgICAgIDB4MjggICAqLworI2RlZmluZSBlc3BfY2ZnMiAgICBpb19hZGRyICsgKDExPDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBTZWNvbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgyYyAgICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGlzIG9ubHkgZm91bmQgb24gdGhlIDUzQzlYIHNlcmllcyBTQ1NJIGNoaXBzICovCisjZGVmaW5lIGVzcF9jZmczICAgIGlvX2FkZHIgKyAoMTI8PChlc3AtPnNoaWZ0KSkgLyogcncgIFRoaXJkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDMwICAqLworI2RlZmluZSBlc3BfY2ZnNCAgICBpb19hZGRyICsgKDEzPDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBGb3VydGggY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgzNCAgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgZm91bmQgb24gYWxsIGNoaXBzIGV4Y2VwdCB0aGUgTkNSNTNDOTAgKEVTUDEwMCkgKi8KKyNkZWZpbmUgZXNwX3RjaGkgICAgaW9fYWRkciArICgxNDw8KGVzcC0+c2hpZnQpKSAvKiBydyAgSGlnaCBiaXRzIG9mIHRyYW5zZmVyIGNvdW50ICAgIDB4MzggICovCisjZGVmaW5lIGVzcF91aWQgICAgIGVzcF90Y2hpICAgICAgICAgICAgICAgICAgICAgLyogcm8gIFVuaXF1ZSBJRCBjb2RlICAgICAgICAgICAgICAgICAweDM4ICAqLworI2RlZmluZSBlc3BfZmdybmQgICBpb19hZGRyICsgKDE1PDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBEYXRhIGJhc2UgZm9yIGZpZm8gICAgICAgICAgICAgMHgzYyAgKi8KK307CisKKyNlbmRpZgorCisjZWxzZSAvKiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykgKi8KKworI2RlZmluZSBlc3Bfd3JpdGUoX19yZWcsIF9fdmFsKSBvdXRiKChfX3ZhbCksIChfX3JlZykpCisjZGVmaW5lIGVzcF9yZWFkKF9fcmVnKSBpbmIoKF9fcmVnKSkKKworc3RydWN0IEVTUF9yZWdzIHsKKyAgICB1bnNpZ25lZCBpbnQgaW9fYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY2VzcyAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgT2Zmc2V0ICovCisjZGVmaW5lIGVzcF90Y2xvdyAgIGlvX2FkZHIgICAgICAvKiBydyAgTG93IGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDAgICAqLworI2RlZmluZSBlc3BfdGNtZWQgICBpb19hZGRyICsgMSAgLyogcncgIE1pZCBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDA0ICAgKi8KKyNkZWZpbmUgZXNwX2ZkYXRhICAgaW9fYWRkciArIDIgIC8qIHJ3ICBGSUZPIGRhdGEgYml0cyAgICAgICAgICAgICAgICAgMHgwOCAgICovCisjZGVmaW5lIGVzcF9jbW5kICAgIGlvX2FkZHIgKyAzICAvKiBydyAgU0NTSSBjb21tYW5kIGJpdHMgICAgICAgICAgICAgIDB4MGMgICAqLworI2RlZmluZSBlc3Bfc3RhdHVzICBpb19hZGRyICsgNCAgLyogcm8gIEVTUCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgICAweDEwICAgKi8KKyNkZWZpbmUgZXNwX2J1c2lkICAgZXNwX3N0YXR1cyAgIC8qIHdvICBCdXMgSUQgZm9yIHNlbGVjdC9yZXNlbGVjdCAgICAgMHgxMCAgICovCisjZGVmaW5lIGVzcF9pbnRycHQgIGlvX2FkZHIgKyA1ICAvKiBybyAgS2luZCBvZiBpbnRlcnJ1cHQgICAgICAgICAgICAgIDB4MTQgICAqLworI2RlZmluZSBlc3BfdGltZW8gICBlc3BfaW50cnB0ICAgLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KKyNkZWZpbmUgZXNwX3NzdGVwICAgaW9fYWRkciArIDYgIC8qIHJvICBTZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICAgICAgICAgMHgxOCAgICovCisjZGVmaW5lIGVzcF9zdHAgICAgIGVzcF9zc3RlcCAgICAvKiB3byAgVHJhbnNmZXIgcGVyaW9kIHBlciBzeW5jICAgICAgIDB4MTggICAqLworI2RlZmluZSBlc3BfZmZsYWdzICBpb19hZGRyICsgNyAgLyogcm8gIEJpdHMgb2YgY3VycmVudCBGSUZPIGluZm8gICAgICAweDFjICAgKi8KKyNkZWZpbmUgZXNwX3NvZmYgICAgZXNwX2ZmbGFncyAgIC8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCisjZGVmaW5lIGVzcF9jZmcxICAgIGlvX2FkZHIgKyA4ICAvKiBydyAgRmlyc3QgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MjAgICAqLworI2RlZmluZSBlc3BfY2ZhY3QgICBpb19hZGRyICsgOSAgLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KKyNkZWZpbmUgZXNwX2N0ZXN0ICAgaW9fYWRkciArIDEwIC8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCisjZGVmaW5lIGVzcF9jZmcyICAgIGlvX2FkZHIgKyAxMSAvKiBydyAgU2Vjb25kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgIDB4MmMgICAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBvbmx5IGZvdW5kIG9uIHRoZSA1M0M5WCBzZXJpZXMgU0NTSSBjaGlwcyAqLworI2RlZmluZSBlc3BfY2ZnMyAgICBpb19hZGRyICsgMTIgLyogcncgIFRoaXJkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDMwICAqLworI2RlZmluZSBlc3BfY2ZnNCAgICBpb19hZGRyICsgMTMgLyogcncgIEZvdXJ0aCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDM0ICAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBmb3VuZCBvbiBhbGwgY2hpcHMgZXhjZXB0IHRoZSBOQ1I1M0M5MCAoRVNQMTAwKSAqLworI2RlZmluZSBlc3BfdGNoaSAgICBpb19hZGRyICsgMTQgLyogcncgIEhpZ2ggYml0cyBvZiB0cmFuc2ZlciBjb3VudCAgICAweDM4ICAqLworI2RlZmluZSBlc3BfdWlkICAgICBlc3BfdGNoaSAgICAgLyogcm8gIFVuaXF1ZSBJRCBjb2RlICAgICAgICAgICAgICAgICAweDM4ICAqLworI2RlZmluZSBlc3BfZmdybmQgICBpb19hZGRyICsgMTUgLyogcncgIERhdGEgYmFzZSBmb3IgZmlmbyAgICAgICAgICAgICAweDNjICAqLworfTsKKworI2VuZGlmIC8qICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKSAqLworCisvKiBWYXJpb3VzIHJldmlzaW9ucyBvZiB0aGUgRVNQIGJvYXJkLiAqLworZW51bSBlc3BfcmV2IHsKKyAgZXNwMTAwICAgICA9IDB4MDAsICAvKiBOQ1I1M0M5MCAtIHZlcnkgYnJva2VuICovCisgIGVzcDEwMGEgICAgPSAweDAxLCAgLyogTkNSNTNDOTBBICovCisgIGVzcDIzNiAgICAgPSAweDAyLAorICBmYXMyMzYgICAgID0gMHgwMywKKyAgZmFzMTAwYSAgICA9IDB4MDQsCisgIGZhc3QgICAgICAgPSAweDA1LAorICBmYXMzNjYgICAgID0gMHgwNiwKKyAgZmFzMjE2ICAgICA9IDB4MDcsCisgIGZzYyAgICAgICAgPSAweDA4LCAgLyogU1lNNTNDOTQtMiAqLworICBlc3B1bmtub3duID0gMHgwOQorfTsKKworLyogV2UgYWxsb2NhdGUgb25lIG9mIHRoZXNlIGZvciBlYWNoIHNjc2kgZGV2aWNlIGFuZCBhdHRhY2ggaXQgdG8KKyAqIFNEcHRyLT5ob3N0ZGF0YSBmb3IgdXNlIGluIHRoZSBkcml2ZXIKKyAqLworc3RydWN0IGVzcF9kZXZpY2UgeworICB1bnNpZ25lZCBjaGFyIHN5bmNfbWluX3BlcmlvZDsKKyAgdW5zaWduZWQgY2hhciBzeW5jX21heF9vZmZzZXQ7CisgIHVuc2lnbmVkIHN5bmM6MTsKKyAgdW5zaWduZWQgd2lkZToxOworICB1bnNpZ25lZCBkaXNjb25uZWN0OjE7Cit9OworCisvKiBXZSBnZXQgb25lIG9mIHRoZXNlIGZvciBlYWNoIEVTUCBwcm9iZWQuICovCitzdHJ1Y3QgTkNSX0VTUCB7CisgIHN0cnVjdCBOQ1JfRVNQICpuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBOZXh0IEVTUCBvbiBwcm9iZWQgb3IgTlVMTCAqLworICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzOwkgICAgICAgICAgLyogQWxsIGVzcCByZWdpc3RlcnMgKi8KKyAgaW50IGRtYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdobyBJIGRvIHRyYW5zZmVycyB3aXRoLiAqLworICB2b2lkICpkcmVnczsJCSAgCQkgIC8qIEFuZCBoaXMgcmVnaXN0ZXJzLiAqLworICBzdHJ1Y3QgU2NzaV9Ib3N0ICplaG9zdDsgICAgICAgICAgICAgICAgLyogQmFja3BvaW50ZXIgdG8gU0NTSSBIb3N0ICovCisKKyAgdm9pZCAqZWRldjsgICAgICAgIAkJICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY29udHJvbGxlciBiYXNlL1NCdXMgKi8KKyAgaW50IGVzcF9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuaXF1ZSBwZXItRVNQIElEIG51bWJlciAqLworCisgIC8qIEVTUCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworICB1bnNpZ25lZCBjaGFyIGNvbmZpZzE7ICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgMXN0IGNvbmZpZyByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyIGNvbmZpZzI7ICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgMm5kIGNvbmZpZyByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyIGNvbmZpZzNbMTZdOyAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgM3JkIGNvbmZpZyByZWdpc3RlciAqLworCisgIC8qIFRoZSBjdXJyZW50IGNvbW1hbmQgd2UgYXJlIHNlbmRpbmcgdG8gdGhlIEVTUCBjaGlwLiAgVGhpcyBlc3BfY29tbWFuZAorICAgKiBwdHIgbmVlZHMgdG8gYmUgbWFwcGVkIGluIERWTUEgYXJlYSBzbyB3ZSBjYW4gc2VuZCBjb21tYW5kcyBhbmQgcmVhZAorICAgKiBmcm9tIHRoZSBFU1AgZmlmbyB3aXRob3V0IGJ1cm5pbmcgcHJlY2lvdXMgQ1BVIGN5Y2xlcy4gIFByb2dyYW1tZWQgSS9PCisgICAqIHN1Y2tzIHdoZW4gd2UgaGF2ZSB0aGUgRFZNQSB0byBkbyBpdCBmb3IgdXMuICBUaGUgRVNQIGlzIHN0dXBpZCBhbmQgd2lsbAorICAgKiBvbmx5IHNlbmQgb3V0IDYsIDEwLCBhbmQgMTIgYnl0ZSBTQ1NJIGNvbW1hbmRzLCBvdGhlcnMgd2UgbmVlZCB0byBzZW5kCisgICAqIG9uZSBieXRlIGF0IGEgdGltZS4gIGVzcF9zbG93Y21kIGJlaW5nIHNldCBzYXlzIHRoYXQgd2UgYXJlIGRvaW5nIG9uZQorICAgKiBvZiB0aGUgY29tbWFuZCB0eXBlcyBFU1AgZG9lc24ndCB1bmRlcnN0YW5kLCBlc3Bfc2NtZHAga2VlcHMgdHJhY2sgb2YKKyAgICogd2hpY2ggYnl0ZSB3ZSBhcmUgc2VuZGluZywgZXNwX3NjbWRsZWZ0IHNheXMgaG93IG1hbnkgYnl0ZXMgdG8gZ28uCisgICAqLworICB2b2xhdGlsZSB1bmNoYXIgKmVzcF9jb21tYW5kOyAgICAgICAgICAgLyogTG9jYXRpb24gb2YgY29tbWFuZCAoQ1BVIHZpZXcpICAqLworICBfX3UzMiAgICAgICAgICAgIGVzcF9jb21tYW5kX2R2bWE7ICAgICAgLyogTG9jYXRpb24gb2YgY29tbWFuZCAoRFZNQSB2aWV3KSAqLworICB1bnNpZ25lZCBjaGFyIGVzcF9jbGVuOyAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoaXMgY29tbWFuZCAqLworICB1bnNpZ25lZCBjaGFyIGVzcF9zbG93Y21kOworICB1bnNpZ25lZCBjaGFyICplc3Bfc2NtZHA7CisgIHVuc2lnbmVkIGNoYXIgZXNwX3NjbWRsZWZ0OworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBhbiBJUlEuIFVwb24gZXZlcnkKKyAgICogSVJRIGVudHJ5IHdlIHN5bmNocm9uaXplIHRoZXNlIHdpdGggdGhlIGhhcmR3YXJlIHJlZ2lzdGVycy4KKyAgICovCisgIHVuY2hhciBpcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIEVTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgdW5jaGFyIHNyZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbWUgZm9yIEVTUCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgdW5jaGFyIHNlcXJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBFU1Agc2VxdWVuY2UgcmVnaXN0ZXIgKi8KKworICAvKiBUaGUgZm9sbG93aW5nIGlzIHNldCB3aGVuIGEgcHJlbWF0dXJlIGludGVycnVwdCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQKKyAgICogaW4gc29tZSBGQVMgcmV2aXNpb25zLgorICAgKi8KKyAgdW5jaGFyIGZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kOworCisgIC8qIFRvIHNhdmUgcmVnaXN0ZXIgd3JpdGVzIHRvIHRoZSBFU1AsIHdoaWNoIGNhbiBiZSBleHBlbnNpdmUsIHdlCisgICAqIGtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIHZhbHVlIHRoYXQgdmFyaW91cyByZWdpc3RlcnMgaGFkIGZvcgorICAgKiB0aGUgbGFzdCB0YXJnZXQgd2UgY29ubmVjdGVkIHRvLiAgSWYgdGhleSBhcmUgdGhlIHNhbWUgZm9yIHRoZQorICAgKiBjdXJyZW50IHRhcmdldCwgd2Ugc2tpcCB0aGUgcmVnaXN0ZXIgd3JpdGVzIGFzIHRoZXkgYXJlIG5vdCBuZWVkZWQuCisgICAqLworICB1bmNoYXIgcHJldl9zb2ZmLCBwcmV2X3N0cCwgcHJldl9jZmczOworCisgIC8qIEZvciBlYWNoIHRhcmdldCB3ZSBrZWVwIHRyYWNrIG9mIHNhdmUvcmVzdG9yZSBkYXRhCisgICAqIHBvaW50ZXIgaW5mb3JtYXRpb24uICBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgbWFqb3JseQorICAgKiB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciB0YWdnZWQgcXVldWVpbmcuICAtRGF2ZU0KKyAgICovCisgIHN0cnVjdCBlc3BfcG9pbnRlcnMgeworCSAgY2hhciAqc2F2ZWRfcHRyOworCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzYXZlZF9idWZmZXI7CisJICBpbnQgc2F2ZWRfdGhpc19yZXNpZHVhbDsKKwkgIGludCBzYXZlZF9idWZmZXJzX3Jlc2lkdWFsOworICB9IGRhdGFfcG9pbnRlcnNbMTZdIC8qWFhYIFtNQVhfVEFHU19QRVJfVEFSR0VUXSovOworCisgIC8qIENsb2NrIHBlcmlvZHMsIGZyZXF1ZW5jaWVzLCBzeW5jaHJvbml6YXRpb24sIGV0Yy4gKi8KKyAgdW5zaWduZWQgaW50IGNmcmVxOyAgICAgICAgICAgICAgICAgICAgLyogQ2xvY2sgZnJlcXVlbmN5IGluIEhaICovCisgIHVuc2lnbmVkIGludCBjZmFjdDsgICAgICAgICAgICAgICAgICAgIC8qIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICovCisgIHVuc2lnbmVkIGludCBjY3ljbGU7ICAgICAgICAgICAgICAgICAgIC8qIE9uZSBFU1AgY2xvY2sgY3ljbGUgKi8KKyAgdW5zaWduZWQgaW50IGN0aWNrOyAgICAgICAgICAgICAgICAgICAgLyogT25lIEVTUCBjbG9jayB0aW1lICovCisgIHVuc2lnbmVkIGludCByYWRlbGF5OyAgICAgICAgICAgICAgICAgIC8qIEZBU1QgY2hpcCByZXEvYWNrIGRlbGF5ICovCisgIHVuc2lnbmVkIGludCBuZWdfZGVmcDsgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgbmVnb3RpYXRpb24gcGVyaW9kICovCisgIHVuc2lnbmVkIGludCBzeW5jX2RlZnA7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgc3luYyB0cmFuc2ZlciBwZXJpb2QgKi8KKyAgdW5zaWduZWQgaW50IG1heF9wZXJpb2Q7ICAgICAgICAgICAgICAgLyogbG9uZ2VzdCBvdXIgcGVyaW9kIGNhbiBiZSAqLworICB1bnNpZ25lZCBpbnQgbWluX3BlcmlvZDsgICAgICAgICAgICAgICAvKiBzaG9ydGVzdCBwZXJpb2Qgd2UgY2FuIHdpdGhzdGFuZCAqLworICAvKiBGb3Igc2xvdyB0byBtZWRpdW0gc3BlZWQgaW5wdXQgY2xvY2sgcmF0ZXMgd2Ugc2hvb3QgZm9yIDVtYi9zLAorICAgKiBidXQgZm9yIGhpZ2ggaW5wdXQgY2xvY2sgcmF0ZXMgd2UgdHJ5IHRvIGRvIDEwbWIvcyBhbHRob3VnaCBJCisgICAqIGRvbid0IHRoaW5rIGEgdHJhbnNmZXIgY2FuIGV2ZW4gcnVuIHRoYXQgZmFzdCB3aXRoIGFuIEVTUCBldmVuCisgICAqIHdpdGggRE1BMiBzY2F0dGVyIGdhdGhlciBwaXBlbGluaW5nLgorICAgKi8KKyNkZWZpbmUgU1lOQ19ERUZQX1NMT1cgICAgICAgICAgICAweDMyICAgLyogNW1iL3MgICovCisjZGVmaW5lIFNZTkNfREVGUF9GQVNUICAgICAgICAgICAgMHgxOSAgIC8qIDEwbWIvcyAqLworCisgIHVuc2lnbmVkIGludCBzbmlwOyAgICAgICAgICAgICAgICAgICAgICAvKiBTeW5jLiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworICB1bnNpZ25lZCBpbnQgd25pcDsgICAgICAgICAgICAgICAgICAgICAgLyogV0lERSBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworICB1bnNpZ25lZCBpbnQgdGFyZ2V0c19wcmVzZW50OyAgICAgICAgICAgLyogdGFyZ2V0cyBzcG9rZW4gdG8gYmVmb3JlICovCisKKyAgaW50IGN1cnJlbnRfdHJhbnNmZXJfc2l6ZTsgICAgICAgICAgICAgIC8qIFNldCBhdCBiZWdpbm5pbmcgb2YgZGF0YSBkbWEgKi8KKworICB1bmNoYXIgZXNwY21kbG9nWzMyXTsgICAgICAgICAgICAgICAgICAgLyogTG9nIG9mIGN1cnJlbnQgZXNwIGNtZHMgc2VudC4gKi8KKyAgdW5jaGFyIGVzcGNtZGVudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgZW50cnkgaW4gZXNwIGNtZCBsb2cuICovCisKKyAgLyogTWlzYy4gaW5mbyBhYm91dCB0aGlzIEVTUCAqLworICBlbnVtIGVzcF9yZXYgZXJldjsgICAgICAgICAgICAgICAgICAgICAgLyogRVNQIHJldmlzaW9uICovCisgIGludCBpcnE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJUlEgZm9yIHRoaXMgRVNQICovCisgIGludCBzY3NpX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXaG8gYW0gSSBhcyBpbml0aWF0b3I/ICovCisgIGludCBzY3NpX2lkX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXRtYXNrIG9mICdtZScuICovCisgIGludCBkaWZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgU0NTSSBidXM/ICovCisgIGludCBzbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbG90IHRoZSBhZGFwdGVyIG9jY3VwaWVzICovCisKKyAgLyogT3VyIGNvbW1hbmQgcXVldWVzLCBvbmx5IG9uZSBjbWQgbGl2ZXMgaW4gdGhlIGN1cnJlbnRfU0MgcXVldWUuICovCisgIFNjc2lfQ21uZCAqaXNzdWVfU0M7ICAgICAgICAgICAvKiBDb21tYW5kcyB0byBiZSBpc3N1ZWQgKi8KKyAgU2NzaV9DbW5kICpjdXJyZW50X1NDOyAgICAgICAgIC8qIFdobyBpcyBjdXJyZW50bHkgd29ya2luZyB0aGUgYnVzICovCisgIFNjc2lfQ21uZCAqZGlzY29ubmVjdGVkX1NDOyAgICAvKiBDb21tYW5kcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzICovCisKKyAgLyogTWVzc2FnZSBnb28gKi8KKyAgdW5jaGFyIGN1cl9tc2dvdXRbMTZdOworICB1bmNoYXIgY3VyX21zZ2luWzE2XTsKKyAgdW5jaGFyIHByZXZtc2dvdXQsIHByZXZtc2dpbjsKKyAgdW5jaGFyIG1zZ291dF9sZW4sIG1zZ2luX2xlbjsKKyAgdW5jaGFyIG1zZ291dF9jdHIsIG1zZ2luX2N0cjsKKworICAvKiBTdGF0ZXMgdGhhdCB3ZSBjYW5ub3Qga2VlcCBpbiB0aGUgcGVyIGNtZCBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGV5CisgICAqIGNhbm5vdCBiZSBhc3Nvc2NpYXRlZCB3aXRoIGFueSBzcGVjaWZpYyBjb21tYW5kLgorICAgKi8KKyAgdW5jaGFyIHJlc2V0dGluZ19idXM7CisgIHdhaXRfcXVldWVfaGVhZF90IHJlc2V0X3F1ZXVlOworCisgIHVuY2hhciBkb19waW9fY21kczsJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwaW8gKi8KKworICAvKiBIb3cgbXVjaCBiaXRzIGRvIHdlIGhhdmUgdG8gc2hpZnQgdGhlIHJlZ2lzdGVycyAqLworICB1bnNpZ25lZCBjaGFyIHNoaWZ0OworCisgIC8qIEZ1bmN0aW9ucyBoYW5kbGluZyBETUEKKyAgICovIAorICAvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKyAgaW50ICAoKmRtYV9ieXRlc19zZW50KShzdHJ1Y3QgTkNSX0VTUCAqLCBpbnQpOworICBpbnQgICgqZG1hX2Nhbl90cmFuc2Zlcikoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOworICB2b2lkICgqZG1hX2R1bXBfc3RhdGUpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2luaXRfcmVhZCkoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7CisgIHZvaWQgKCpkbWFfaW5pdF93cml0ZSkoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7CisgIHZvaWQgKCpkbWFfaW50c19vZmYpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2ludHNfb24pKHN0cnVjdCBOQ1JfRVNQICopOworICBpbnQgICgqZG1hX2lycV9wKShzdHJ1Y3QgTkNSX0VTUCAqKTsKKyAgaW50ICAoKmRtYV9wb3J0c19wKShzdHJ1Y3QgTkNSX0VTUCAqKTsKKyAgdm9pZCAoKmRtYV9zZXR1cCkoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCwgaW50KTsKKworICAvKiBPcHRpb25hbCBmdW5jdGlvbnMgKGkuZS4gbWF5IGJlIGluaXRpYWxpemVkIHRvIDApICovCisgIHZvaWQgKCpkbWFfYmFycmllcikoc3RydWN0IE5DUl9FU1AgKik7CisgIHZvaWQgKCpkbWFfZHJhaW4pKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2ludmFsaWRhdGUpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2lycV9lbnRyeSkoc3RydWN0IE5DUl9FU1AgKik7CisgIHZvaWQgKCpkbWFfaXJxX2V4aXQpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2xlZF9vZmYpKHN0cnVjdCBOQ1JfRVNQICopOworICB2b2lkICgqZG1hX2xlZF9vbikoc3RydWN0IE5DUl9FU1AgKik7CisgIHZvaWQgKCpkbWFfcG9sbCkoc3RydWN0IE5DUl9FU1AgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgdm9pZCAoKmRtYV9yZXNldCkoc3RydWN0IE5DUl9FU1AgKik7CisgICAgCisgIC8qIE9wdGlvbmFsIHZpcnR1YWwgRE1BIGZ1bmN0aW9ucyAqLworICB2b2lkICgqZG1hX21tdV9nZXRfc2NzaV9vbmUpKHN0cnVjdCBOQ1JfRVNQICosIFNjc2lfQ21uZCAqKTsKKyAgdm9pZCAoKmRtYV9tbXVfZ2V0X3Njc2lfc2dsKShzdHJ1Y3QgTkNSX0VTUCAqLCBTY3NpX0NtbmQgKik7CisgIHZvaWQgKCpkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUpKHN0cnVjdCBOQ1JfRVNQICosIFNjc2lfQ21uZCAqKTsKKyAgdm9pZCAoKmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCkoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOworICB2b2lkICgqZG1hX2FkdmFuY2Vfc2cpKFNjc2lfQ21uZCAqKTsKK307CisKKy8qIEJpdGZpZWxkIG1lYW5pbmdzIGZvciB0aGUgYWJvdmUgcmVnaXN0ZXJzLiAqLworCisvKiBFU1AgY29uZmlnIHJlZyAxLCByZWFkLXdyaXRlLCBmb3VuZCBvbiBhbGwgRVNQIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX0lEICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIE15IEJVUyBJRCBiaXRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX0NIVEVTVCAgICAweDA4ICAgICAgICAgICAgIC8qIEVuYWJsZSBFU1AgY2hpcCB0ZXN0cyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QRU5BQkxFICAgMHgxMCAgICAgICAgICAgICAvKiBFbmFibGUgcGFyaXR5IGNoZWNrcyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QQVJURVNUICAgMHgyMCAgICAgICAgICAgICAvKiBQYXJpdHkgdGVzdCBtb2RlIGVuYWJsZWQ/ICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NSUkRJU0FCICAweDQwICAgICAgICAgICAgIC8qIERpc2FibGUgU0NTSSByZXNldCByZXBvcnRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NMQ0FCTEUgICAweDgwICAgICAgICAgICAgIC8qIEVuYWJsZSBzbG93IGNhYmxlIG1vZGUgKi8KKworLyogRVNQIGNvbmZpZyByZWcgMiwgcmVhZC13cml0ZSwgZm91bmQgb25seSBvbiBlc3AxMDBhK2VzcDIwMCtlc3AyMzYrZnNjIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0RNQVBBUklUWSAweDAxICAgICAgICAgICAgIC8qIGVuYWJsZSBETUEgUGFyaXR5ICgyMDAsMjM2LGZzYykgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfUkVHUEFSSVRZIDB4MDIgICAgICAgICAgICAgLyogZW5hYmxlIHJlZyBQYXJpdHkgKDIwMCwyMzYsZnNjKSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9CQURQQVJJVFkgMHgwNCAgICAgICAgICAgICAvKiBCYWQgcGFyaXR5IHRhcmdldCBhYm9ydCAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfU0NTSTJFTkFCIDB4MDggICAgICAgICAgICAgLyogRW5hYmxlIFNDU0ktMiBmZWF0dXJlcyAodG1vZGUgb25seSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfSEkgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogSGlnaCBJbXBlZGFuY2UgRFJFUSA/Pz8gICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0hNRUZFTkFCICAweDEwICAgICAgICAgICAgIC8qIEhNRSBmZWF0dXJlcyBlbmFibGUgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfQkNNICAgICAgIDB4MjAgICAgICAgICAgICAgLyogRW5hYmxlIGJ5dGUtY3RybCAoMjM2LGZzYykgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9GRU5BQiAgICAgMHg0MCAgICAgICAgICAgICAvKiBFbmFibGUgZmVhdHVyZXMgKGZhczEwMCxlc3AyMTYsZnNjKSAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUcyX1NQTCAgICAgICAweDQwICAgICAgICAgICAgIC8qIEVuYWJsZSBzdGF0dXMtcGhhc2UgbGF0Y2ggKGVzcDIzNikgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9SRkIgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBSZXNlcnZlIEZJRk8gYnl0ZSAoZnNjKSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9NQUdJQyAgICAgMHhlMCAgICAgICAgICAgICAvKiBJbnZhbGlkIGJpdHMuLi4gKi8KKworLyogRVNQIGNvbmZpZyByZWdpc3RlciAzIHJlYWQtd3JpdGUsIGZvdW5kIG9ubHkgZXNwMjM2K2ZhczIzNitmYXMxMDBhK2ZzYyBjaGlwcyAqLworI2RlZmluZSBFU1BfQ09ORklHM19GQ0xPQ0sgICAgMHgwMSAgICAgICAgICAgICAvKiBGQVNUIFNDU0kgY2xvY2sgcmF0ZSAoZXNwMTAwYS9mYXMzNjYpICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RFTSAgICAgICAweDAxICAgICAgICAgICAgIC8qIEVuYWJsZSB0aHJlc2gtOCBtb2RlIChlc3AvZmFzMjM2L2ZzYykgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZBU1QgICAgICAweDAyICAgICAgICAgICAgIC8qIEVuYWJsZSBGQVNUIFNDU0kgICAgIChlc3AxMDBhKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19BRE1BICAgICAgMHgwMiAgICAgICAgICAgICAvKiBFbmFibGUgYWx0ZXJuYXRlLWRtYSAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19URU5CICAgICAgMHgwNCAgICAgICAgICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwMTAwYSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfU1JCICAgICAgIDB4MDQgICAgICAgICAgICAgLyogU2F2ZSByZXNpZHVhbCBieXRlICAgKGVzcC9mYXMyMzYvZnNjKSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfVE1TICAgICAgIDB4MDggICAgICAgICAgICAgLyogVGhyZWUtYnl0ZSBtc2cncyBvayAgKGVzcDEwMGEpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZDTEsgICAgICAweDA4ICAgICAgICAgICAgIC8qIEZhc3QgU0NTSSBjbG9jayByYXRlIChlc3AvZmFzMjM2L2ZzYykgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lETVNHICAgICAweDEwICAgICAgICAgICAgIC8qIElEIG1lc3NhZ2UgY2hlY2tpbmcgIChlc3AxMDBhKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19GU0NTSSAgICAgMHgxMCAgICAgICAgICAgICAvKiBFbmFibGUgRkFTVCBTQ1NJICAgICAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19HVE0gICAgICAgMHgyMCAgICAgICAgICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19UQk1TICAgICAgMHg0MCAgICAgICAgICAgICAvKiBUaHJlZS1ieXRlIG1zZydzIG9rICAoZXNwL2ZhczIzNi9mc2MpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19JTVMgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBJRCBtc2cgY2hrJ25nICAgICAgICAoZXNwL2ZhczIzNi9mc2MpICAqLworCisvKiBFU1AgY29uZmlnIHJlZ2lzdGVyIDQgcmVhZC13cml0ZSwgZm91bmQgb25seSBvbiBmc2MgY2hpcHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzRfQkJURSAgICAgIDB4MDEgICAgICAgICAgICAgLyogQmFjay10by1CYWNrIHRyYW5zZmVyIGVuYWJsZSAqLworI2RlZmluZSBFU1BfQ09ORklHNF9URVNUICAgICAgMHgwMiAgICAgICAgICAgICAvKiBUcmFuc2ZlciBjb3VudGVyIHRlc3QgbW9kZSAqLworI2RlZmluZSBFU1BfQ09ORklHNF9FQU4gICAgICAgMHgwNCAgICAgICAgICAgICAvKiBFbmFibGUgQWN0aXZlIE5lZ290aWF0aW9uICovCisKKy8qIEVTUCBjb21tYW5kIHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KKy8qIEdyb3VwIDEgY29tbWFuZHM6ICBUaGVzZSBtYXkgYmUgc2VudCBhdCBhbnkgcG9pbnQgaW4gdGltZSB0byB0aGUgRVNQCisgKiAgICAgICAgICAgICAgICAgICAgY2hpcC4gIE5vbmUgb2YgdGhlbSBjYW4gZ2VuZXJhdGUgaW50ZXJydXB0cyAnY2VwdAorICogICAgICAgICAgICAgICAgICAgIHRoZSAiU0NTSSBidXMgcmVzZXQiIGNvbW1hbmQgaWYgeW91IGhhdmUgbm90IGRpc2FibGVkCisgKiAgICAgICAgICAgICAgICAgICAgU0NTSSByZXNldCBpbnRlcnJ1cHRzIGluIHRoZSBjb25maWcxIEVTUCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBFU1BfQ01EX05VTEwgICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBOdWxsIGNvbW1hbmQsIGllLiBhIG5vcCAqLworI2RlZmluZSBFU1BfQ01EX0ZMVVNIICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBGSUZPIEZsdXNoICovCisjZGVmaW5lIEVTUF9DTURfUkMgICAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIENoaXAgcmVzZXQgKi8KKyNkZWZpbmUgRVNQX0NNRF9SUyAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgLyogU0NTSSBidXMgcmVzZXQgKi8KKworLyogR3JvdXAgMiBjb21tYW5kczogIEVTUCBtdXN0IGJlIGFuIGluaXRpYXRvciBhbmQgY29ubmVjdGVkIHRvIGEgdGFyZ2V0CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIHRoZXNlIGNvbW1hbmRzIHRvIHdvcmsuCisgKi8KKyNkZWZpbmUgRVNQX0NNRF9USSAgICAgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogVHJhbnNmZXIgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRVNQX0NNRF9JQ0NTRVEgICAgICAgIDB4MTEgICAgICAgICAgICAgLyogSW5pdGlhdG9yIGNtZCBjb21wbGV0ZSBzZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX01PSyAgICAgICAgICAgMHgxMiAgICAgICAgICAgICAvKiBNZXNzYWdlIG9raWUtZG9raWUgKi8KKyNkZWZpbmUgRVNQX0NNRF9UUEFEICAgICAgICAgIDB4MTggICAgICAgICAgICAgLyogVHJhbnNmZXIgUGFkICovCisjZGVmaW5lIEVTUF9DTURfU0FUTiAgICAgICAgICAweDFhICAgICAgICAgICAgIC8qIFNldCBBVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9SQVROICAgICAgICAgIDB4MWIgICAgICAgICAgICAgLyogRGUtYXNzZXJ0IEFUTiAqLworCisvKiBHcm91cCAzIGNvbW1hbmRzOiAgRVNQIG11c3QgYmUgaW4gdGhlIE1TR09VVCBvciBNU0dJTiBzdGF0ZSBhbmQgYmUgY29ubmVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgdG8gYSB0YXJnZXQgYXMgdGhlIGluaXRpYXRvciBmb3IgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KKyAqLworI2RlZmluZSBFU1BfQ01EX1NNU0cgICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBTZW5kIG1lc3NhZ2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9TU1RBVCAgICAgICAgIDB4MjEgICAgICAgICAgICAgLyogU2VuZCBzdGF0dXMgKi8KKyNkZWZpbmUgRVNQX0NNRF9TREFUQSAgICAgICAgIDB4MjIgICAgICAgICAgICAgLyogU2VuZCBkYXRhICovCisjZGVmaW5lIEVTUF9DTURfRFNFUSAgICAgICAgICAweDIzICAgICAgICAgICAgIC8qIERpc2NvbnRpbnVlIFNlcXVlbmNlICovCisjZGVmaW5lIEVTUF9DTURfVFNFUSAgICAgICAgICAweDI0ICAgICAgICAgICAgIC8qIFRlcm1pbmF0ZSBTZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX1RDQ1NFUSAgICAgICAgMHgyNSAgICAgICAgICAgICAvKiBUYXJnZXQgY21kIGNtcGx0IHNlcXVlbmNlICovCisjZGVmaW5lIEVTUF9DTURfRENOQ1QgICAgICAgICAweDI3ICAgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgRVNQX0NNRF9STVNHICAgICAgICAgIDB4MjggICAgICAgICAgICAgLyogUmVjZWl2ZSBNZXNzYWdlICovCisjZGVmaW5lIEVTUF9DTURfUkNNRCAgICAgICAgICAweDI5ICAgICAgICAgICAgIC8qIFJlY2VpdmUgQ29tbWFuZCAqLworI2RlZmluZSBFU1BfQ01EX1JEQVRBICAgICAgICAgMHgyYSAgICAgICAgICAgICAvKiBSZWNlaXZlIERhdGEgKi8KKyNkZWZpbmUgRVNQX0NNRF9SQ1NFUSAgICAgICAgIDB4MmIgICAgICAgICAgICAgLyogUmVjZWl2ZSBjbWQgc2VxdWVuY2UgKi8KKworLyogR3JvdXAgNCBjb21tYW5kczogIFRoZSBFU1AgbXVzdCBiZSBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlIGFuZCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgbm90IGJlIGNvbm5lY3RlZCB0byBhbnkgdGFyZ2V0cyBhcyBpbml0aWF0b3IgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KKyAqLworI2RlZmluZSBFU1BfQ01EX1JTRUwgICAgICAgICAgMHg0MCAgICAgICAgICAgICAvKiBSZXNlbGVjdCAqLworI2RlZmluZSBFU1BfQ01EX1NFTCAgICAgICAgICAgMHg0MSAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9vIEFUTiAqLworI2RlZmluZSBFU1BfQ01EX1NFTEEgICAgICAgICAgMHg0MiAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9TRUxBUyAgICAgICAgIDB4NDMgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICYgU1RPUCAqLworI2RlZmluZSBFU1BfQ01EX0VTRUwgICAgICAgICAgMHg0NCAgICAgICAgICAgICAvKiBFbmFibGUgc2VsZWN0aW9uICovCisjZGVmaW5lIEVTUF9DTURfRFNFTCAgICAgICAgICAweDQ1ICAgICAgICAgICAgIC8qIERpc2FibGUgc2VsZWN0aW9ucyAqLworI2RlZmluZSBFU1BfQ01EX1NBMyAgICAgICAgICAgMHg0NiAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4zICovCisjZGVmaW5lIEVTUF9DTURfUlNFTDMgICAgICAgICAweDQ3ICAgICAgICAgICAgIC8qIFJlc2VsZWN0MyAqLworCisvKiBUaGlzIGJpdCBlbmFibGVzIHRoZSBFU1AncyBETUEgKi8KKyNkZWZpbmUgRVNQX0NNRF9ETUEgICAgICAgICAgIDB4ODAgICAgICAgICAgICAgLyogRG8gRE1BPyAqLworCisvKiBFU1Agc3RhdHVzIHJlZ2lzdGVyIHJlYWQtb25seSAqLworI2RlZmluZSBFU1BfU1RBVF9QSU8gICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBJTyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUENEICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogQ0QgcGhhc2UgYml0ICovCisjZGVmaW5lIEVTUF9TVEFUX1BNU0cgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIE1TRyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUE1BU0sgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogTWFzayBvZiBwaGFzZSBiaXRzICovCisjZGVmaW5lIEVTUF9TVEFUX1RET05FICAgICAgICAweDA4ICAgICAgICAgICAgIC8qIFRyYW5zZmVyIENvbXBsZXRlZCAqLworI2RlZmluZSBFU1BfU1RBVF9UQ05UICAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBDb3VudGVyIElzIFplcm8gKi8KKyNkZWZpbmUgRVNQX1NUQVRfUEVSUiAgICAgICAgIDB4MjAgICAgICAgICAgICAgLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIEVTUF9TVEFUX1NQQU0gICAgICAgICAweDQwICAgICAgICAgICAgIC8qIFJlYWwgYmFkIGVycm9yICovCisvKiBUaGlzIGluZGljYXRlcyB0aGUgJ2ludGVycnVwdCBwZW5kaW5nJyBjb25kaXRpb24sIGl0IGlzIGEgcmVzZXJ2ZWQKKyAqIGJpdCBvbiBvbGQgcmV2cyBvZiB0aGUgRVNQIChFU1AxMDAsIEVTUDEwMEEsIEZBUzEwMEEpLgorICovCisjZGVmaW5lIEVTUF9TVEFUX0lOVFIgICAgICAgICAweDgwICAgICAgICAgICAgIC8qIEludGVycnVwdCAqLworCisvKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNhbiBiZSBtYXNrZWQgd2l0aCBFU1BfU1RBVF9QTUFTSyBhbmQgY29tcGFyZWQKKyAqIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHBoYXNlIHRoZSBFU1AKKyAqIChhdCBsZWFzdCB0aGlua3MgaXQpIGlzIGluLiAgRm9yIG91ciBwdXJwb3NlcyB3ZSBhbHNvIGFkZCBvdXIgb3duCisgKiBzb2Z0d2FyZSAnZG9uZScgYml0IGZvciBvdXIgcGhhc2UgbWFuYWdlbWVudCBlbmdpbmUuCisgKi8KKyNkZWZpbmUgRVNQX0RPUCAgICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgT3V0ICAqLworI2RlZmluZSBFU1BfRElQICAgKEVTUF9TVEFUX1BJTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBJbiAgICovCisjZGVmaW5lIEVTUF9DTURQICAoRVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kICAgKi8KKyNkZWZpbmUgRVNQX1NUQVRQIChFU1BfU1RBVF9QQ0R8RVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgIC8qIFN0YXR1cyAgICAqLworI2RlZmluZSBFU1BfTU9QICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgLyogTWVzc2FnZSBPdXQgKi8KKyNkZWZpbmUgRVNQX01JUCAgIChFU1BfU1RBVF9QTVNHfEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pIC8qIE1lc3NhZ2UgSW4gKi8KKworLyogRVNQIGludGVycnVwdCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX0lOVFJfUyAgICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogU2VsZWN0IHcvbyBBVE4gKi8KKyNkZWZpbmUgRVNQX0lOVFJfU0FUTiAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICovCisjZGVmaW5lIEVTUF9JTlRSX1JTRUwgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgRVNQX0lOVFJfRkRPTkUgICAgICAgIDB4MDggICAgICAgICAgICAgLyogRnVuY3Rpb24gZG9uZSAqLworI2RlZmluZSBFU1BfSU5UUl9CU0VSViAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBCdXMgc2VydmljZSAqLworI2RlZmluZSBFU1BfSU5UUl9EQyAgICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBEaXNjb25uZWN0ICovCisjZGVmaW5lIEVTUF9JTlRSX0lDICAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIElsbGVnYWwgY29tbWFuZCBnaXZlbiAqLworI2RlZmluZSBFU1BfSU5UUl9TUiAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAqLworCisvKiBJbnRlcnJ1cHQgc3RhdHVzIG1hY3JvcyAqLworI2RlZmluZSBFU1BfU1JFU0VUX0lSUShlc3ApICAoKGVzcCktPmludHJlZyAmIChFU1BfSU5UUl9TUikpCisjZGVmaW5lIEVTUF9JTExDTURfSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX0lDKSkKKyNkZWZpbmUgRVNQX1NFTEVDVF9XSVRIX0FUTl9JUlEoZXNwKSAgICAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfU0FUTikpCisjZGVmaW5lIEVTUF9TRUxFQ1RfV0lUSE9VVF9BVE5fSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1MpKQorI2RlZmluZSBFU1BfU0VMRUNUSU9OX0lSUShlc3ApICAoKEVTUF9TRUxFQ1RfV0lUSF9BVE5fSVJRKGVzcCkpIHx8ICAgICAgICAgXAorCQkJCSAoRVNQX1NFTEVDVF9XSVRIT1VUX0FUTl9JUlEoZXNwKSkpCisjZGVmaW5lIEVTUF9SRVNFTEVDVElPTl9JUlEoZXNwKSAgICAgICAgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1JTRUwpKQorCisvKiBFU1Agc2VxdWVuY2Ugc3RlcCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX1NURVBfVkJJVFMgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogVmFsaWQgYml0cyAqLworI2RlZmluZSBFU1BfU1RFUF9BU0VMICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBTZWxlY3Rpb24mQXJiaXRyYXRlIGNtcGx0ICovCisjZGVmaW5lIEVTUF9TVEVQX1NJRCAgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIE9uZSBtc2cgYnl0ZSBzZW50ICovCisjZGVmaW5lIEVTUF9TVEVQX05DTUQgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIFdhcyBub3QgaW4gY29tbWFuZCBwaGFzZSAqLworI2RlZmluZSBFU1BfU1RFUF9QUEMgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBFYXJseSBwaGFzZSBjaGcgY2F1c2VkIGNtbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnl0ZXMgdG8gYmUgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVNQX1NURVBfRklOSTQgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogQ29tbWFuZCB3YXMgc2VudCBvayAqLworCisvKiBIbyBodW0sIHNvbWUgRVNQJ3Mgc2V0IHRoZSBzdGVwIHJlZ2lzdGVyIHRvIHRoaXMgYXMgd2VsbC4uLiAqLworI2RlZmluZSBFU1BfU1RFUF9GSU5JNSAgICAgICAgMHgwNQorI2RlZmluZSBFU1BfU1RFUF9GSU5JNiAgICAgICAgMHgwNgorI2RlZmluZSBFU1BfU1RFUF9GSU5JNyAgICAgICAgMHgwNworI2RlZmluZSBFU1BfU1RFUF9TT00gICAgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBTeW5jaHJvbm91cyBPZmZzZXQgTWF4ICovCisKKy8qIEVTUCBjaGlwLXRlc3QgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLworI2RlZmluZSBFU1BfVEVTVF9UQVJHICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBUYXJnZXQgdGVzdCBtb2RlICovCisjZGVmaW5lIEVTUF9URVNUX0lOSSAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIEluaXRpYXRvciB0ZXN0IG1vZGUgKi8KKyNkZWZpbmUgRVNQX1RFU1RfVFMgICAgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogVHJpc3RhdGUgdGVzdCBtb2RlICovCisKKy8qIEVTUCB1bmlxdWUgSUQgcmVnaXN0ZXIgcmVhZC1vbmx5LCBmb3VuZCBvbiBmYXMyMzYrZmFzMTAwYStmc2Mgb25seSAqLworI2RlZmluZSBFU1BfVUlEX0YxMDBBICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBGQVMxMDBBICAqLworI2RlZmluZSBFU1BfVUlEX0YyMzYgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBGQVMyMzYgICAqLworI2RlZmluZSBFU1BfVUlEX0ZTQyAgICAgICAgICAgMHhhMiAgICAgICAgICAgICAvKiBOQ1I1M0NGOXgtMiAgKi8KKyNkZWZpbmUgRVNQX1VJRF9SRVYgICAgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogRVNQIHJldmlzaW9uICovCisjZGVmaW5lIEVTUF9VSURfRkFNICAgICAgICAgICAweGY4ICAgICAgICAgICAgIC8qIEVTUCBmYW1pbHkgICAqLworCisvKiBFU1AgZmlmbyBmbGFncyByZWdpc3RlciByZWFkLW9ubHkgKi8KKy8qIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGltcGxpZXMgYSAxNiBieXRlIEZJRk8gb24gdGhlIEVTUC4gKi8KKyNkZWZpbmUgRVNQX0ZGX0ZCWVRFUyAgICAgICAgIDB4MWYgICAgICAgICAgICAgLyogTnVtIGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgRVNQX0ZGX09OT1RaRVJPICAgICAgIDB4MjAgICAgICAgICAgICAgLyogb2Zmc2V0IGN0ciBub3QgemVybyAoZXNwMTAwLGZzYykgKi8KKyNkZWZpbmUgRVNQX0ZGX1NTVEVQICAgICAgICAgIDB4ZTAgICAgICAgICAgICAgLyogU2VxdWVuY2Ugc3RlcCAqLworCisvKiBFU1AgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgcmVnaXN0ZXIgd3JpdGUtb25seSAqLworI2RlZmluZSBFU1BfQ0NGX0YwICAgICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiAzNS4wMU1IeiAtIDQwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfTkVWRVIgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIFNldCBpdCB0byB0aGlzIGFuZCBkaWUgKi8KKyNkZWZpbmUgRVNQX0NDRl9GMiAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogMTBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GMyAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgLyogMTAuMDFNSHogLSAxNU1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y0ICAgICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiAxNS4wMU1IeiAtIDIwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfRjUgICAgICAgICAgICAweDA1ICAgICAgICAgICAgIC8qIDIwLjAxTUh6IC0gMjVNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNiAgICAgICAgICAgIDB4MDYgICAgICAgICAgICAgLyogMjUuMDFNSHogLSAzME1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y3ICAgICAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiAzMC4wMU1IeiAtIDM1TUh6ICovCisKKyNkZWZpbmUgRVNQX0JVU19USU1FT1VUICAgICAgICAyNzUgICAgICAgICAgICAgLyogSW4gbWlsbGktc2Vjb25kcyAqLworI2RlZmluZSBFU1BfVElNRU9fQ09OU1QgICAgICAgODE5MgorI2RlZmluZSBGU0NfVElNRU9fQ09OU1QgICAgICAgNzY2OAorI2RlZmluZSBFU1BfTkVHX0RFRlAobWh6LCBjZmFjdCkgXAorICAgICAgICAoKEVTUF9CVVNfVElNRU9VVCAqICgobWh6KSAvIDEwMDApKSAvICg4MTkyICogKGNmYWN0KSkpCisjZGVmaW5lIEZTQ19ORUdfREVGUChtaHosIGNmYWN0KSBcCisgICAgICAgICgoRVNQX0JVU19USU1FT1VUICogKChtaHopIC8gMTAwMCkpIC8gKDc2NjggKiAoY2ZhY3QpKSkKKyNkZWZpbmUgRVNQX01IWl9UT19DWUNMRShtaGVydHopICAoKDEwMDAwMDAwMDApIC8gKChtaGVydHopIC8gMTAwMCkpCisjZGVmaW5lIEVTUF9USUNLKGNjZiwgY3ljbGUpICAoKDc2ODIgKiAoY2NmKSAqIChjeWNsZSkgLyAxMDAwKSkKKworCisvKiBVR0xZLCBVR0xZLCBVR0xZISAqLworZXh0ZXJuIGludCBuZXNwcywgZXNwc19pbl91c2UsIGVzcHNfcnVubmluZzsKKworLyogRm9yIG91ciBpbnRlcnJ1cHQgZW5naW5lLiAqLworI2RlZmluZSBmb3JfZWFjaF9lc3AoZXNwKSBcCisgICAgICAgIGZvcigoZXNwKSA9IGVzcGNoYWluOyAoZXNwKTsgKGVzcCkgPSAoZXNwKS0+bmV4dCkKKworCisvKiBFeHRlcm5hbCBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGVzcF9ib290dXBfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7CitleHRlcm4gc3RydWN0IE5DUl9FU1AgKmVzcF9hbGxvY2F0ZShTY3NpX0hvc3RfVGVtcGxhdGUgKiwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIGVzcF9kZWFsbG9jYXRlKHN0cnVjdCBOQ1JfRVNQICopOworZXh0ZXJuIHZvaWQgZXNwX3JlbGVhc2Uodm9pZCk7CitleHRlcm4gdm9pZCBlc3BfaW5pdGlhbGl6ZShzdHJ1Y3QgTkNSX0VTUCAqKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBlc3BfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gY29uc3QgY2hhciAqZXNwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBpbnQgZXNwX3F1ZXVlKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2V4dGVybiBpbnQgZXNwX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2V4dGVybiBpbnQgZXNwX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK2V4dGVybiBpbnQgZXNwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJCSBpbnQgaW5vdXQpOworZXh0ZXJuIGludCBlc3Bfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKik7CitleHRlcm4gdm9pZCBlc3Bfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqKTsKKyNlbmRpZiAvKiAhKE5DUjUzQzlYX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTNjNDA2YS5jIGIvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjg1ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYwpAQCAtMCwwICsxLDExMTAgQEAKKy8qIAorICogIE5DUjUzYzQwNi5jCisgKiAgTG93LWxldmVsIFNDU0kgZHJpdmVyIGZvciBOQ1I1M2M0MDZhIGNoaXAuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2IE5vcm11bmRzIFNhdW1hbmlzIChub3JtdW5kc0BmaS5pYm0uY29tKQorICogCisgKiAgTElMTyBjb21tYW5kIGxpbmUgdXNhZ2U6IG5jcjUzYzQwNmE9PFBPUlRCQVNFPlssPElSUT5bLDxGQVNUUElPPl1dCisgKiAgU3BlY2lmeSBJUlEgPSAwIGZvciBub24taW50ZXJydXB0IGRyaXZlbiBtb2RlLgorICogIEZBU1RQSU8gPSAxIGZvciBmYXN0IHBpbyBtb2RlLCAwIGZvciBzbG93IG1vZGUuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogIGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNkZWZpbmUgTkNSNTNDNDA2QV9ERUJVRyAwCisjZGVmaW5lIFZFUkJPU0VfTkNSNTNDNDA2QV9ERUJVRyAwCisKKy8qIFNldCB0aGlzIHRvIDEgZm9yIFBJTyBtb2RlIChyZWNvbW1lbmRlZCkgb3IgdG8gMCBmb3IgRE1BIG1vZGUgKi8KKyNkZWZpbmUgVVNFX1BJTyAxCisKKyNkZWZpbmUgVVNFX0JJT1MgMAorCQkJCS8qICNkZWZpbmUgQklPU19BRERSIDB4RDgwMDAgKi8vKiBkZWZpbmUgdGhpcyBpZiBhdXRvcHJvYmUgZmFpbHMgKi8KKwkJCQkvKiAjZGVmaW5lIFBPUlRfQkFTRSAweDMzMCAqLy8qIGRlZmluZSB0aGlzIGlmIGF1dG9wcm9iZSBmYWlscyAqLworCQkJCS8qICNkZWZpbmUgSVJRX0xFViAgIDAJKi8vKiBkZWZpbmUgdGhpcyBpZiBhdXRvcHJvYmUgZmFpbHMgKi8KKyNkZWZpbmUgRE1BX0NIQU4gIDUJCS8qIHRoaXMgaXMgaWdub3JlZCBpZiBETUEgaXMgZGlzYWJsZWQgKi8KKworLyogU2V0IHRoaXMgdG8gMCBpZiB5b3UgZW5jb3VudGVyIGtlcm5lbCBsb2NrdXBzIHdoaWxlIHRyYW5zZmVycmluZyAKKyAqIGRhdGEgaW4gUElPIG1vZGUgKi8KKyNkZWZpbmUgVVNFX0ZBU1RfUElPIDEKKworLyogPT09PT09PT09PT09PSBFbmQgb2YgdXNlciBjb25maWd1cmFibGUgcGFyYW1ldGVycyA9PT09PT09PT09PT09ICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIFdBVENIRE9HIDUwMDAwMDAKKworI2RlZmluZSBTWU5DX01PREUgMAkJLyogU3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZSAqLworCisjaWYgREVCVUcKKyN1bmRlZiBOQ1I1M0M0MDZBX0RFQlVHCisjZGVmaW5lIE5DUjUzQzQwNkFfREVCVUcgMQorI2VuZGlmCisKKyNpZiBVU0VfUElPCisjZGVmaW5lIFVTRV9ETUEgMAorI2Vsc2UKKyNkZWZpbmUgVVNFX0RNQSAxCisjZW5kaWYKKworLyogRGVmYXVsdCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEMxX0lNRyAgIDB4MDcJCS8qIElEPTcgKi8KKyNkZWZpbmUgQzJfSU1HICAgMHg0OAkJLyogRkUgU0NTSTIgKi8KKyNpZiBVU0VfRE1BCisjZGVmaW5lIEMzX0lNRyAgIDB4MjEJCS8qIENEQiBURSAqLworI2Vsc2UKKyNkZWZpbmUgQzNfSU1HICAgMHgyMAkJLyogQ0RCICovCisjZW5kaWYKKyNkZWZpbmUgQzRfSU1HICAgMHgwNAkJLyogQU5FICovCisjZGVmaW5lIEM1X0lNRyAgIDB4YjYJCS8qIEFBIFBJIFNJRSBQT0wgKi8KKworI2RlZmluZSBSRUcwIChvdXRiKEM0X0lNRywgQ09ORklHNCkpCisjZGVmaW5lIFJFRzEgKG91dGIoQzVfSU1HLCBDT05GSUc1KSkKKworI2lmIE5DUjUzQzQwNkFfREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2VuZGlmCisKKyNpZiBWRVJCT1NFX05DUjUzQzQwNkFfREVCVUcKKyNkZWZpbmUgVkRFQih4KSB4CisjZWxzZQorI2RlZmluZSBWREVCKHgpCisjZW5kaWYKKworI2RlZmluZSBMT0FEX0RNQV9DT1VOVChjb3VudCkgXAorICBvdXRiKGNvdW50ICYgMHhmZiwgVENfTFNCKTsgXAorICBvdXRiKChjb3VudCA+PiA4KSAmIDB4ZmYsIFRDX01TQik7IFwKKyAgb3V0YigoY291bnQgPj4gMTYpICYgMHhmZiwgVENfSElHSCk7CisKKy8qIENoaXAgY29tbWFuZHMgKi8KKyNkZWZpbmUgRE1BX09QICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIFNDU0lfTk9QICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRkxVU0hfRklGTyAgICAgICAgICAgMHgwMQorI2RlZmluZSBDSElQX1JFU0VUICAgICAgICAgICAweDAyCisjZGVmaW5lIFNDU0lfUkVTRVQgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUkVTRUxFQ1QgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTRUxFQ1RfTk9fQVROICAgICAgICAweDQxCisjZGVmaW5lIFNFTEVDVF9BVE4gICAgICAgICAgIDB4NDIKKyNkZWZpbmUgU0VMRUNUX0FUTl9TVE9QICAgICAgMHg0MworI2RlZmluZSBFTkFCTEVfU0VMICAgICAgICAgICAweDQ0CisjZGVmaW5lIERJU0FCTEVfU0VMICAgICAgICAgIDB4NDUKKyNkZWZpbmUgU0VMRUNUX0FUTjMgICAgICAgICAgMHg0NgorI2RlZmluZSBSRVNFTEVDVDMgICAgICAgICAgICAweDQ3CisjZGVmaW5lIFRSQU5TRkVSX0lORk8gICAgICAgIDB4MTAKKyNkZWZpbmUgSU5JVF9DTURfQ09NUExFVEUgICAgMHgxMQorI2RlZmluZSBNU0dfQUNDRVBUICAgICAgICAgICAweDEyCisjZGVmaW5lIFRSQU5TRkVSX1BBRCAgICAgICAgIDB4MTgKKyNkZWZpbmUgU0VUX0FUTiAgICAgICAgICAgICAgMHgxYQorI2RlZmluZSBSRVNFVF9BVE4gICAgICAgICAgICAweDFiCisjZGVmaW5lIFNFTkRfTVNHICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0VORF9TVEFUVVMgICAgICAgICAgMHgyMQorI2RlZmluZSBTRU5EX0RBVEEgICAgICAgICAgICAweDIyCisjZGVmaW5lIERJU0NPTk5fU0VRICAgICAgICAgIDB4MjMKKyNkZWZpbmUgVEVSTUlOQVRFX1NFUSAgICAgICAgMHgyNAorI2RlZmluZSBUQVJHX0NNRF9DT01QTEVURSAgICAweDI1CisjZGVmaW5lIERJU0NPTk4gICAgICAgICAgICAgIDB4MjcKKyNkZWZpbmUgUkVDVl9NU0cgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBSRUNWX0NNRCAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFJFQ1ZfREFUQSAgICAgICAgICAgIDB4MmEKKyNkZWZpbmUgUkVDVl9DTURfU0VRICAgICAgICAgMHgyYgorI2RlZmluZSBUQVJHRVRfQUJPUlRfRE1BICAgICAweDA0CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgZm9sbG93aW5nIHdpbGwgc2V0IHRoZSBtb25pdG9yIGJvcmRlciBjb2xvciAodXNlZnVsIHRvIGZpbmQKKyAgIHdoZXJlIHNvbWV0aGluZyBjcmFzaGVkIG9yIGdldHMgc3R1Y2sgYXQgKi8KKy8qIDEgPSBibHVlCisgICAyID0gZ3JlZW4KKyAgIDMgPSBjeWFuCisgICA0ID0gcmVkCisgICA1ID0gbWFnZW50YQorICAgNiA9IHllbGxvdworICAgNyA9IHdoaXRlCisqLworCisjaWYgTkNSNTNDNDA2QV9ERUJVRworI2RlZmluZSBydHJjKGkpIHtpbmIoMHgzZGEpO291dGIoMHgzMSwweDNjMCk7b3V0YigoaSksMHgzYzApO30KKyNlbHNlCisjZGVmaW5lIHJ0cmMoaSkge30KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZW51bSBQaGFzZSB7CisJaWRsZSwKKwlkYXRhX291dCwKKwlkYXRhX2luLAorCWNvbW1hbmRfcGgsCisJc3RhdHVzX3BoLAorCW1lc3NhZ2Vfb3V0LAorCW1lc3NhZ2VfaW4KK307CisKKy8qIFN0YXRpYyBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBOQ1I1M2M0MDZhX2ludHIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGlycXJldHVybl90IGRvX05DUjUzYzQwNmFfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCBjaGlwX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBjYWxjX3BvcnRfYWRkcih2b2lkKTsKKyNpZm5kZWYgSVJRX0xFVgorc3RhdGljIGludCBpcnFfcHJvYmUodm9pZCk7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmIFVTRV9CSU9TCitzdGF0aWMgdm9pZCAqYmlvc19iYXNlOworI2VuZGlmCisKKyNpZiBQT1JUX0JBU0UKK3N0YXRpYyBpbnQgcG9ydF9iYXNlID0gUE9SVF9CQVNFOworI2Vsc2UKK3N0YXRpYyBpbnQgcG9ydF9iYXNlOworI2VuZGlmCisKKyNpZiBJUlFfTEVWCitzdGF0aWMgaW50IGlycV9sZXZlbCA9IElSUV9MRVY7CisjZWxzZQorc3RhdGljIGludCBpcnFfbGV2ZWwgPSAtMTsJLyogMCBpcyAnbm8gaXJxJywgc28gdXNlIC0xIGZvciAndW5pbml0aWFsaXplZCcgKi8KKyNlbmRpZgorCisjaWYgVVNFX0RNQQorc3RhdGljIGludCBkbWFfY2hhbjsKKyNlbmRpZgorCisjaWYgVVNFX1BJTworc3RhdGljIGludCBmYXN0X3BpbyA9IFVTRV9GQVNUX1BJTzsKKyNlbmRpZgorCitzdGF0aWMgU2NzaV9DbW5kICpjdXJyZW50X1NDOworc3RhdGljIGNoYXIgaW5mb19tc2dbMjU2XTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogcG9zc2libGUgQklPUyBsb2NhdGlvbnMgKi8KKyNpZiBVU0VfQklPUworc3RhdGljIHZvaWQgKmFkZHJlc3Nlc1tdID0geworCSh2b2lkICopIDB4ZDgwMDAsCisJKHZvaWQgKikgMHhjODAwMAorfTsKKyNkZWZpbmUgQUREUkVTU19DT1VOVCAoc2l6ZW9mKCBhZGRyZXNzZXMgKSAvIHNpemVvZiggdW5zaWduZWQgKSkKKyNlbmRpZgkJCQkvKiBVU0VfQklPUyAqLworCisvKiBwb3NzaWJsZSBpL28gcG9ydCBhZGRyZXNzZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDIzMCwgMHgzMzAsIDB4MjgwLCAweDI5MCwgMHgzMzAsIDB4MzQwLCAweDMwMCwgMHgzMTAsIDB4MzQ4LCAweDM1MCB9OworI2RlZmluZSBQT1JUX0NPVU5UIChzaXplb2YoIHBvcnRzICkgLyBzaXplb2YoIHVuc2lnbmVkIHNob3J0ICkpCisKKy8qIHBvc3NpYmxlIGludGVycnVwdCBjaGFubmVscyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGludHJzW10gPSB7IDEwLCAxMSwgMTIsIDE1IH07CisjZGVmaW5lIElOVFJfQ09VTlQgKHNpemVvZiggaW50cnMgKSAvIHNpemVvZiggdW5zaWduZWQgc2hvcnQgKSkKKworLyogc2lnbmF0dXJlcyBmb3IgTkNSIDUzYzQwNmEgYmFzZWQgY29udHJvbGxlcnMgKi8KKyNpZiBVU0VfQklPUworc3RydWN0IHNpZ25hdHVyZSB7CisJY2hhciAqc2lnbmF0dXJlOworCWludCBzaWdfb2Zmc2V0OworCWludCBzaWdfbGVuZ3RoOworfSBzaWduYXR1cmVzW10gX19pbml0ZGF0YSA9IHsKKwkvKiAgICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgNSAgICAgICAgIDYgKi8KKwkvKiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgKi8KKwl7CisiQ29weXJpZ2h0IChDKSBBY2N1bG9naWMsIEluYy5cclxuMi44TSBEaXNrZXR0ZSBFeHRlbnNpb24gQmlvcyB2ZXIgNC4wNC4wMyAwMy8wMS8xOTkzIiwgNjEsIDgyfSx9OworCisjZGVmaW5lIFNJR05BVFVSRV9DT1VOVCAoc2l6ZW9mKCBzaWduYXR1cmVzICkgLyBzaXplb2YoIHN0cnVjdCBzaWduYXR1cmUgKSkKKyNlbmRpZgkJCQkvKiBVU0VfQklPUyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBTZXQgMCAqLworc3RhdGljIGludCBUQ19MU0I7CQkvKiB0cmFuc2ZlciBjb3VudGVyIGxzYiAgICAgICAgICovCitzdGF0aWMgaW50IFRDX01TQjsJCS8qIHRyYW5zZmVyIGNvdW50ZXIgbXNiICovCitzdGF0aWMgaW50IFNDU0lfRklGTzsJCS8qIHNjc2kgZmlmbyByZWdpc3RlciAgICovCitzdGF0aWMgaW50IENNRF9SRUc7CQkvKiBjb21tYW5kIHJlZ2lzdGVyICAgICAgICAgICAgICovCitzdGF0aWMgaW50IFNUQVRfUkVHOwkJLyogc3RhdHVzIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworc3RhdGljIGludCBERVNUX0lEOwkJLyogc2VsZWN0aW9uL3Jlc2VsZWN0aW9uIGJ1cyBpZCAqLworc3RhdGljIGludCBJTlRfUkVHOwkJLyogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAgICAqLworc3RhdGljIGludCBTUlRJTU9VVDsJCS8qIHNlbGVjdC9yZXNlbGVjdCB0aW1lb3V0IHJlZyAgKi8KK3N0YXRpYyBpbnQgU0VRX1JFRzsJCS8qIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgICAgICAgKi8KK3N0YXRpYyBpbnQgU1lOQ1BSRDsJCS8qIHN5bmNocm9ub3VzIHRyYW5zZmVyIHBlcmlvZCAgKi8KK3N0YXRpYyBpbnQgRklGT19GTEFHUzsJCS8qIGluZGljYXRlcyAjIG9mIGJ5dGVzIGluIGZpZm8gKi8KK3N0YXRpYyBpbnQgU1lOQ09GRjsJCS8qIHN5bmNocm9ub3VzIG9mZnNldCByZWdpc3RlciAgKi8KK3N0YXRpYyBpbnQgQ09ORklHMTsJCS8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAgICAgKi8KK3N0YXRpYyBpbnQgQ0xLQ09OVjsJCS8qIGNsb2NrIGNvbnZlcnNpb24gcmVnICovCisJCQkJLypzdGF0aWMgaW50IFRFU1RSRUc7Ki8vKiB0ZXN0IG1vZGUgcmVnaXN0ZXIgICAgICAgICAgICovCitzdGF0aWMgaW50IENPTkZJRzI7CQkvKiBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgICAgICovCitzdGF0aWMgaW50IENPTkZJRzM7CQkvKiBDb25maWd1cmF0aW9uIDMgUmVnaXN0ZXIgICAgICovCitzdGF0aWMgaW50IENPTkZJRzQ7CQkvKiBDb25maWd1cmF0aW9uIDQgUmVnaXN0ZXIgICAgICovCitzdGF0aWMgaW50IFRDX0hJR0g7CQkvKiBUcmFuc2ZlciBDb3VudGVyIEhpZ2ggKi8KKwkJCQkvKnN0YXRpYyBpbnQgRklGT19CT1RUT007Ki8vKiBSZXNlcnZlIEZJRk8gYnl0ZSByZWdpc3RlciAgICovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgU2V0IDEgKi8KKwkJCQkvKnN0YXRpYyBpbnQgSlVNUEVSX1NFTlNFOyovLyogSnVtcGVyIHNlbnNlIHBvcnQgcmVnIChyL3cpICovCisJCQkJLypzdGF0aWMgaW50IFNSQU1fUFRSOyovLyogU1JBTSBhZGRyZXNzIHBvaW50ZXIgcmVnIChyL3cpICovCisJCQkJLypzdGF0aWMgaW50IFNSQU1fREFUQTsqLy8qIFNSQU0gZGF0YSByZWdpc3RlciAoci93KSAqLworc3RhdGljIGludCBQSU9fRklGTzsJCS8qIFBJTyBGSUZPIHJlZ2lzdGVycyAoci93KSAqLworCQkJCS8qc3RhdGljIGludCBQSU9fRklGTzE7Ki8vKiAgKi8KKwkJCQkvKnN0YXRpYyBpbnQgUElPX0ZJRk8yOyovLyogICovCisJCQkJLypzdGF0aWMgaW50IFBJT19GSUZPMzsqLy8qICAqLworc3RhdGljIGludCBQSU9fU1RBVFVTOwkJLyogUElPIHN0YXR1cyAoci93KSAqLworCQkJCS8qc3RhdGljIGludCBBVEFfQ01EOyovLyogQVRBIGNvbW1hbmQvc3RhdHVzIHJlZyAoci93KSAqLworCQkJCS8qc3RhdGljIGludCBBVEFfRVJSOyovLyogQVRBIGZlYXR1cmVzL2Vycm9yIHJlZ2lzdGVyIChyL3cpICovCitzdGF0aWMgaW50IFBJT19GTEFHOwkJLyogUElPIGZsYWcgaW50ZXJydXB0IGVuYWJsZSAoci93KSAqLworc3RhdGljIGludCBDT05GSUc1OwkJLyogQ29uZmlndXJhdGlvbiA1IHJlZ2lzdGVyIChyL3cpICovCisJCQkJLypzdGF0aWMgaW50IFNJR05BVFVSRTsqLy8qIFNpZ25hdHVyZSBSZWdpc3RlciAocikgKi8KKwkJCQkvKnN0YXRpYyBpbnQgQ09ORklHNjsqLy8qIENvbmZpZ3VyYXRpb24gNiByZWdpc3RlciAocikgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmIFVTRV9ETUEKK3N0YXRpYyBfX2lubGluZV9fIGludCBOQ1I1M2M0MDZhX2RtYV9zZXR1cCh1bnNpZ25lZCBjaGFyICpwdHIsIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgY2hhciBtb2RlKQoreworCXVuc2lnbmVkIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJVkRFQihwcmludGsoImRtYTogYmVmb3JlIGNvdW50PSVkICAgIiwgY291bnQpKTsKKwlpZiAoZG1hX2NoYW4gPD0gMykgeworCQlpZiAoY291bnQgPiA2NTUzNikKKwkJCWNvdW50ID0gNjU1MzY7CisJCWxpbWl0ID0gNjU1MzYgLSAoKCh1bnNpZ25lZCkgcHRyKSAmIDB4RkZGRik7CisJfSBlbHNlIHsKKwkJaWYgKGNvdW50ID4gKDY1NTM2IDw8IDEpKQorCQkJY291bnQgPSAoNjU1MzYgPDwgMSk7CisJCWxpbWl0ID0gKDY1NTM2IDw8IDEpIC0gKCgodW5zaWduZWQpIHB0cikgJiAweDFGRkZGKTsKKwl9CisKKwlpZiAoY291bnQgPiBsaW1pdCkKKwkJY291bnQgPSBsaW1pdDsKKworCVZERUIocHJpbnRrKCJhZnRlciBjb3VudD0lZFxuIiwgY291bnQpKTsKKwlpZiAoKGNvdW50ICYgMSkgfHwgKCgodW5zaWduZWQpIHB0cikgJiAxKSkKKwkJcGFuaWMoIk5DUjUzYzQwNmE6IGF0dGVtcHRlZCB1bmFsaWduZWQgRE1BIHRyYW5zZmVyXG4iKTsKKworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShkbWFfY2hhbik7CisJY2xlYXJfZG1hX2ZmKGRtYV9jaGFuKTsKKwlzZXRfZG1hX2FkZHIoZG1hX2NoYW4sIChsb25nKSBwdHIpOworCXNldF9kbWFfY291bnQoZG1hX2NoYW4sIGNvdW50KTsKKwlzZXRfZG1hX21vZGUoZG1hX2NoYW4sIG1vZGUpOworCWVuYWJsZV9kbWEoZG1hX2NoYW4pOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgTkNSNTNjNDA2YV9kbWFfd3JpdGUodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIE5DUjUzYzQwNmFfZG1hX3NldHVwKHNyYywgY291bnQsIERNQV9NT0RFX1dSSVRFKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzYzQwNmFfZG1hX3JlYWQodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJcmV0dXJuIE5DUjUzYzQwNmFfZG1hX3NldHVwKHNyYywgY291bnQsIERNQV9NT0RFX1JFQUQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgTkNSNTNjNDA2YV9kbWFfcmVzaWR1YWwodm9pZCkKK3sKKwlyZWdpc3RlciBpbnQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGRtYV9jaGFuKTsKKwl0bXAgPSBnZXRfZG1hX3Jlc2lkdWUoZG1hX2NoYW4pOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJcmV0dXJuIHRtcDsKK30KKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisKKyNpZiBVU0VfUElPCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgTkNSNTNjNDA2YV9waW9fcmVhZCh1bnNpZ25lZCBjaGFyICpyZXF1ZXN0LCB1bnNpZ25lZCBpbnQgcmVxbGVuKQoreworCWludCBpOworCWludCBsZW47CQkvKiBjdXJyZW50IHNjc2kgZmlmbyBzaXplICovCisKKwlSRUcxOworCXdoaWxlIChyZXFsZW4pIHsKKwkJaSA9IGluYihQSU9fU1RBVFVTKTsKKwkJLyogICAgVkRFQihwcmludGsoInBpb19zdGF0dXM9JXhcbiIsIGkpKTsgKi8KKwkJaWYgKGkgJiAweDgwKQorCQkJcmV0dXJuIDA7CisKKwkJc3dpdGNoIChpICYgMHgxZSkgeworCQlkZWZhdWx0OgorCQljYXNlIDB4MTA6CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwOgorCQkJbGVuID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODoKKwkJCWxlbiA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJbGVuID0gODQ7CisJCQlicmVhazsKKwkJY2FzZSAweGU6CisJCQlsZW4gPSAxMjg7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoaSAmIDB4NDApICYmIGxlbiA9PSAwKSB7CS8qIGZpZm8gZW1wdHkgYW5kIGludGVycnVwdCBvY2N1cnJlZCAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gcmVxbGVuKQorCQkJCWxlbiA9IHJlcWxlbjsKKworCQkJaWYgKGZhc3RfcGlvICYmIGxlbiA+IDMpIHsKKwkJCQlpbnNsKFBJT19GSUZPLCByZXF1ZXN0LCBsZW4gPj4gMik7CisJCQkJcmVxdWVzdCArPSBsZW4gJiAweGZjOworCQkJCXJlcWxlbiAtPSBsZW4gJiAweGZjOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJKnJlcXVlc3QrKyA9IGluYihQSU9fRklGTyk7CisJCQkJCXJlcWxlbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IE5DUjUzYzQwNmFfcGlvX3dyaXRlKHVuc2lnbmVkIGNoYXIgKnJlcXVlc3QsIHVuc2lnbmVkIGludCByZXFsZW4pCit7CisJaW50IGkgPSAwOworCWludCBsZW47CQkvKiBjdXJyZW50IHNjc2kgZmlmbyBzaXplICovCisKKwlSRUcxOworCXdoaWxlIChyZXFsZW4gJiYgIShpICYgMHg0MCkpIHsKKwkJaSA9IGluYihQSU9fU1RBVFVTKTsKKwkJLyogICAgVkRFQihwcmludGsoInBpb19zdGF0dXM9JXhcbiIsIGkpKTsgKi8KKwkJaWYgKGkgJiAweDgwKQkvKiBlcnJvciAqLworCQkJcmV0dXJuIDA7CisKKwkJc3dpdGNoIChpICYgMHgxZSkgeworCQljYXNlIDB4MTA6CisJCQlsZW4gPSAxMjg7CisJCQlicmVhazsKKwkJY2FzZSAweDA6CisJCQlsZW4gPSA4NDsKKwkJCWJyZWFrOworCQljYXNlIDB4ODoKKwkJCWxlbiA9IDQyOworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJbGVuID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIDB4ZToKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChsZW4pIHsKKwkJCWlmIChsZW4gPiByZXFsZW4pCisJCQkJbGVuID0gcmVxbGVuOworCisJCQlpZiAoZmFzdF9waW8gJiYgbGVuID4gMykgeworCQkJCW91dHNsKFBJT19GSUZPLCByZXF1ZXN0LCBsZW4gPj4gMik7CisJCQkJcmVxdWVzdCArPSBsZW4gJiAweGZjOworCQkJCXJlcWxlbiAtPSBsZW4gJiAweGZjOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJb3V0YigqcmVxdWVzdCsrLCBQSU9fRklGTyk7CisJCQkJCXJlcWxlbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBVU0VfUElPICovCisKK3N0YXRpYyBpbnQgX19pbml0IE5DUjUzYzQwNmFfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJaW50IHByZXNlbnQgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gTlVMTDsKKyNpZm5kZWYgUE9SVF9CQVNFCisJaW50IGk7CisjZW5kaWYKKworI2lmIFVTRV9CSU9TCisJaW50IGlpLCBqajsKKwliaW9zX2Jhc2UgPSAwOworCS8qIGxvb2sgZm9yIGEgdmFsaWQgc2lnbmF0dXJlICovCisJZm9yIChpaSA9IDA7IGlpIDwgQUREUkVTU19DT1VOVCAmJiAhYmlvc19iYXNlOyBpaSsrKQorCQlmb3IgKGpqID0gMDsgKGpqIDwgU0lHTkFUVVJFX0NPVU5UKSAmJiAhYmlvc19iYXNlOyBqaisrKQorCQkJaWYgKCFtZW1jbXAoKHZvaWQgKikgYWRkcmVzc2VzW2lpXSArIHNpZ25hdHVyZXNbampdLnNpZ19vZmZzZXQsICh2b2lkICopIHNpZ25hdHVyZXNbampdLnNpZ25hdHVyZSwgKGludCkgc2lnbmF0dXJlc1tqal0uc2lnX2xlbmd0aCkpCisJCQkJYmlvc19iYXNlID0gYWRkcmVzc2VzW2lpXTsKKworCWlmICghYmlvc19iYXNlKSB7CisJCXByaW50aygiTkNSNTNjNDA2YTogQklPUyBzaWduYXR1cmUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCKHByaW50aygiTkNSNTNjNDA2YSBCSU9TIGZvdW5kIGF0IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpIGJpb3NfYmFzZSk7CisJICAgICk7CisjZW5kaWYJCQkJLyogVVNFX0JJT1MgKi8KKworI2lmZGVmIFBPUlRfQkFTRQorCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydF9iYXNlLCAweDEwLCAiTkNSNTNjNDA2YSIpKQkvKiBwb3J0cyBhbHJlYWR5IHNuYXRjaGVkICovCisJCXBvcnRfYmFzZSA9IDA7CisKKyNlbHNlCQkJCS8qIGF1dG9kZXRlY3QgKi8KKwlpZiAocG9ydF9iYXNlKSB7CS8qIExJTE8gb3ZlcnJpZGUgKi8KKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTAsICJOQ1I1M2M0MDZhIikpCisJCQlwb3J0X2Jhc2UgPSAwOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBQT1JUX0NPVU5UICYmICFwb3J0X2Jhc2U7IGkrKykgeworCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0c1tpXSwgMHgxMCwgIk5DUjUzYzQwNmEiKSkgeworCQkJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IHBvcnQgMHgleCBpbiB1c2VcbiIsIHBvcnRzW2ldKSk7CisJCQl9IGVsc2UgeworCQkJCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBwb3J0IDB4JXggYXZhaWxhYmxlXG4iLCBwb3J0c1tpXSkpOworCQkJCW91dGIoQzVfSU1HLCBwb3J0c1tpXSArIDB4MGQpOwkvKiByZWcgc2V0IDEgKi8KKwkJCQlpZiAoKGluYihwb3J0c1tpXSArIDB4MGUpIF4gaW5iKHBvcnRzW2ldICsgMHgwZSkpID09IDcgJiYgKGluYihwb3J0c1tpXSArIDB4MGUpIF4gaW5iKHBvcnRzW2ldICsgMHgwZSkpID09IDcgJiYgKGluYihwb3J0c1tpXSArIDB4MGUpICYgMHhmOCkgPT0gMHg1OCkgeworCQkJCQlwb3J0X2Jhc2UgPSBwb3J0c1tpXTsKKwkJCQkJVkRFQihwcmludGsoIk5DUjUzYzQwNmE6IFNpZyByZWdpc3RlciB2YWxpZFxuIikpOworCQkJCQlWREVCKHByaW50aygicG9ydF9iYXNlPTB4JXhcbiIsIHBvcnRfYmFzZSkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVsZWFzZV9yZWdpb24ocG9ydHNbaV0sIDB4MTApOworCQkJfQorCQl9CisJfQorI2VuZGlmCQkJCS8qIFBPUlRfQkFTRSAqLworCisJaWYgKCFwb3J0X2Jhc2UpIHsJLyogbm8gcG9ydHMgZm91bmQgKi8KKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBubyBhdmFpbGFibGUgcG9ydHMgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhIGRldGVjdGVkXG4iKSk7CisKKwljYWxjX3BvcnRfYWRkcigpOworCWNoaXBfaW5pdCgpOworCisjaWZuZGVmIElSUV9MRVYKKwlpZiAoaXJxX2xldmVsIDwgMCkgewkvKiBMSUxPIG92ZXJyaWRlIGlmID49IDAgKi8KKwkJaXJxX2xldmVsID0gaXJxX3Byb2JlKCk7CisJCWlmIChpcnFfbGV2ZWwgPCAwKSB7CS8qIFRyb3VibGUgKi8KKwkJCXByaW50aygiTkNSNTNjNDA2YTogSVJRIHByb2JsZW0sIGlycV9sZXZlbD0lZCwgZ2l2aW5nIHVwXG4iLCBpcnFfbGV2ZWwpOworCQkJZ290byBlcnJfcmVsZWFzZTsKKwkJfQorCX0KKyNlbmRpZgorCisJREVCKHByaW50aygiTkNSNTNjNDA2YTogdXNpbmcgcG9ydF9iYXNlIDB4JXhcbiIsIHBvcnRfYmFzZSkpOworCisJcHJlc2VudCA9IDE7CisJdHBudC0+cHJvY19uYW1lID0gIk5DUjUzYzQwNmEiOworCisJc2hwbnQgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIDApOworCWlmICghc2hwbnQpIHsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBVbmFibGUgdG8gcmVnaXN0ZXIgaG9zdCwgZ2l2aW5nIHVwLlxuIik7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJaWYgKGlycV9sZXZlbCA+IDApIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGlycV9sZXZlbCwgZG9fTkNSNTNjNDA2YV9pbnRyLCAwLCAiTkNSNTNjNDA2YSIsIHNocG50KSkgeworCQkJcHJpbnRrKCJOQ1I1M2M0MDZhOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICVkXG4iLCBpcnFfbGV2ZWwpOworCQkJZ290byBlcnJfZnJlZV9zY3NpOworCQl9CisJCXRwbnQtPmNhbl9xdWV1ZSA9IDE7CisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IGFsbG9jYXRlZCBJUlEgJWRcbiIsIGlycV9sZXZlbCkpOworCX0gZWxzZSBpZiAoaXJxX2xldmVsID09IDApIHsKKwkJdHBudC0+Y2FuX3F1ZXVlID0gMDsKKwkJREVCKHByaW50aygiTkNSNTNjNDA2YTogTm8gaW50ZXJydXB0cyBkZXRlY3RlZFxuIikpOworCQlwcmludGsoIk5DUjUzYzQwNmEgZHJpdmVyIG5vIGxvbmdlciBzdXBwb3J0cyBwb2xsaW5nIGludGVyZmFjZVxuIik7CisJCXByaW50aygiUGxlYXNlIGVtYWlsIGxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorI2lmIFVTRV9ETUEKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBObyBpbnRlcnJ1cHRzIGZvdW5kIGFuZCBETUEgbW9kZSBkZWZpbmVkLiBHaXZpbmcgdXAuXG4iKTsKKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisJCWdvdG8gZXJyX2ZyZWVfc2NzaTsKKwl9IGVsc2UgeworCQlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBTaG91bGRuJ3QgZ2V0IGhlcmUhXG4iKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2NzaTsKKwl9CisKKyNpZiBVU0VfRE1BCisJZG1hX2NoYW4gPSBETUFfQ0hBTjsKKwlpZiAocmVxdWVzdF9kbWEoZG1hX2NoYW4sICJOQ1I1M2M0MDZhIikgIT0gMCkgeworCQlwcmludGsoIk5DUjUzYzQwNmE6IHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbCAlZFxuIiwgZG1hX2NoYW4pOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlERUIocHJpbnRrKCJBbGxvY2F0ZWQgRE1BIGNoYW5uZWwgJWRcbiIsIGRtYV9jaGFuKSk7CisjZW5kaWYJCQkJLyogVVNFX0RNQSAqLworCisJc2hwbnQtPmlycSA9IGlycV9sZXZlbDsKKwlzaHBudC0+aW9fcG9ydCA9IHBvcnRfYmFzZTsKKwlzaHBudC0+bl9pb19wb3J0ID0gMHgxMDsKKyNpZiBVU0VfRE1BCisJc2hwbnQtPmRtYSA9IGRtYV9jaGFuOworI2VuZGlmCisKKyNpZiBVU0VfRE1BCisJc3ByaW50ZihpbmZvX21zZywgIk5DUjUzYzQwNmEgYXQgMHgleCwgSVJRICVkLCBETUEgY2hhbm5lbCAlZC4iLCBwb3J0X2Jhc2UsIGlycV9sZXZlbCwgZG1hX2NoYW4pOworI2Vsc2UKKwlzcHJpbnRmKGluZm9fbXNnLCAiTkNSNTNjNDA2YSBhdCAweCV4LCBJUlEgJWQsICVzIFBJTyBtb2RlLiIsIHBvcnRfYmFzZSwgaXJxX2xldmVsLCBmYXN0X3BpbyA/ICJmYXN0IiA6ICJzbG93Iik7CisjZW5kaWYKKworCXJldHVybiAocHJlc2VudCk7CisKKyNpZiBVU0VfRE1BCisgICAgICBlcnJfZnJlZV9pcnE6CisJaWYgKGlycV9sZXZlbCkKKwkJZnJlZV9pcnEoaXJxX2xldmVsLCBzaHBudCk7CisjZW5kaWYKKyAgICAgIGVycl9mcmVlX3Njc2k6CisJc2NzaV91bnJlZ2lzdGVyKHNocG50KTsKKyAgICAgIGVycl9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgTkNSNTNjNDA2YV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKyNpZmRlZiBVU0VfRE1BCisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworI2VuZGlmCisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxlZCBmcm9tIGluaXQvbWFpbi5jICovCitzdGF0aWMgaW50IF9faW5pdCBOQ1I1M2M0MDZhX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgc2l6ZV90IHNldHVwX2lkeCA9IDA7CisJc2l6ZV90IGk7CisJaW50IGludHNbNF07CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBTZXR1cCBjYWxsZWRcbiIpOworCSAgICApOworCisJaWYgKHNldHVwX2lkeCA+PSBQT1JUX0NPVU5UIC0gMSkgeworCQlwcmludGsoIk5DUjUzYzQwNmE6IFNldHVwIGNhbGxlZCB0b28gbWFueSB0aW1lcy4gIEJhZCBMSUxPIHBhcmFtcz9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZ2V0X29wdGlvbnMoc3RyLCA0LCBpbnRzKTsKKwlpZiAoaW50c1swXSA8IDEgfHwgaW50c1swXSA+IDMpIHsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBNYWxmb3JtZWQgY29tbWFuZCBsaW5lXG4iKTsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBVc2FnZTogbmNyNTNjNDA2YT08UE9SVEJBU0U+Wyw8SVJRPlssPEZBU1RQSU8+XV1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IFBPUlRfQ09VTlQgJiYgIXBvcnRfYmFzZTsgaSsrKQorCQlpZiAocG9ydHNbaV0gPT0gaW50c1sxXSkgeworCQkJcG9ydF9iYXNlID0gaW50c1sxXTsKKwkJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IFNwZWNpZmllZCBwb3J0X2Jhc2UgMHgleFxuIiwgcG9ydF9iYXNlKTsKKwkJCSAgICApCisJCX0KKwlpZiAoIXBvcnRfYmFzZSkgeworCQlwcmludGsoIk5DUjUzYzQwNmE6IEludmFsaWQgUE9SVEJBU0UgMHgleCBzcGVjaWZpZWRcbiIsIGludHNbMV0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaW50c1swXSA+IDEpIHsKKwkJaWYgKGludHNbMl0gPT0gMCkgeworCQkJaXJxX2xldmVsID0gMDsKKwkJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IFNwZWNpZmllZCBpcnEgJWRcbiIsIGlycV9sZXZlbCk7CisJCQkgICAgKQorCQl9IGVsc2UKKwkJCWZvciAoaSA9IDA7IGkgPCBJTlRSX0NPVU5UICYmIGlycV9sZXZlbCA8IDA7IGkrKykKKwkJCQlpZiAoaW50cnNbaV0gPT0gaW50c1syXSkgeworCQkJCQlpcnFfbGV2ZWwgPSBpbnRzWzJdOworCQkJCQlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBTcGVjaWZpZWQgaXJxICVkXG4iLCBwb3J0X2Jhc2UpOworCQkJCQkgICAgKQorCQkJCX0KKwkJaWYgKGlycV9sZXZlbCA8IDApCisJCQlwcmludGsoIk5DUjUzYzQwNmE6IEludmFsaWQgSVJRICVkIHNwZWNpZmllZFxuIiwgaW50c1syXSk7CisJfQorCisJaWYgKGludHNbMF0gPiAyKQorCQlmYXN0X3BpbyA9IGludHNbM107CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBwb3J0X2Jhc2U9MHgleCwgaXJxPSVkLCBmYXN0X3Bpbz0lZFxuIiwgcG9ydF9iYXNlLCBpcnFfbGV2ZWwsIGZhc3RfcGlvKTspCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5jcjUzYzQwNmE9IiwgTkNSNTNjNDA2YV9zZXR1cCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpOQ1I1M2M0MDZhX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0Nob3N0KQoreworCURFQihwcmludGsoIk5DUjUzYzQwNmFfaW5mbyBjYWxsZWRcbiIpKTsKKwlyZXR1cm4gKGluZm9fbXNnKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHdhaXRfaW50cih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaSA9IGppZmZpZXMgKyBXQVRDSERPRzsKKworCXdoaWxlICh0aW1lX2FmdGVyKGksIGppZmZpZXMpICYmICEoaW5iKFNUQVRfUkVHKSAmIDB4ZTApKSB7CS8qIHdhaXQgZm9yIGEgcHNldWRvLWludGVycnVwdCAqLworCQljcHVfcmVsYXgoKTsKKwkJYmFycmllcigpOworCX0KKworCWlmICh0aW1lX2JlZm9yZV9lcShpLCBqaWZmaWVzKSkgewkvKiBUaW1lZCBvdXQgKi8KKwkJcnRyYygwKTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX1RJTUVfT1VUIDw8IDE2OworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5zY3NpX2RvbmUoY3VycmVudF9TQyk7CisJCXJldHVybjsKKwl9CisKKwlOQ1I1M2M0MDZhX2ludHIoMCwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBOQ1I1M2M0MDZhX3F1ZXVlKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlpbnQgaTsKKworCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhX3F1ZXVlIGNhbGxlZFxuIikpOworCURFQihwcmludGsoImNtZD0lMDJ4LCBjbWRfbGVuPSUwMngsIHRhcmdldD0lMDJ4LCBsdW49JTAyeCwgYnVmZmxlbj0lZFxuIiwgU0NwbnQtPmNtbmRbMF0sIFNDcG50LT5jbWRfbGVuLCBTQ3BudC0+dGFyZ2V0LCBTQ3BudC0+bHVuLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKSk7CisKKyNpZiAwCisJVkRFQihmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkgICAgIHByaW50aygiY21kWyVkXT0lMDJ4ICAiLCBpLCBTQ3BudC0+Y21uZFtpXSkpOworCVZERUIocHJpbnRrKCJcbiIpKTsKKyNlbmRpZgorCisJY3VycmVudF9TQyA9IFNDcG50OworCWN1cnJlbnRfU0MtPnNjc2lfZG9uZSA9IGRvbmU7CisJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gY29tbWFuZF9waDsKKwljdXJyZW50X1NDLT5TQ3AuU3RhdHVzID0gMDsKKwljdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9IDA7CisKKwkvKiBXZSBhcmUgbG9ja2VkIGhlcmUgYWxyZWFkeSBieSB0aGUgbWlkIGxheWVyICovCisJUkVHMDsKKwlvdXRiKFNDcG50LT5kZXZpY2UtPmlkLCBERVNUX0lEKTsJLyogc2V0IGRlc3RpbmF0aW9uICovCisJb3V0YihGTFVTSF9GSUZPLCBDTURfUkVHKTsJLyogcmVzZXQgdGhlIGZpZm9zICovCisKKwlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykgeworCQlvdXRiKFNDcG50LT5jbW5kW2ldLCBTQ1NJX0ZJRk8pOworCX0KKwlvdXRiKFNFTEVDVF9OT19BVE4sIENNRF9SRUcpOworCisJcnRyYygxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBOQ1I1M2M0MDZhX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCURFQihwcmludGsoIk5DUjUzYzQwNmFfYWJvcnQgY2FsbGVkXG4iKSk7CisJcmV0dXJuIEZBSUxFRDsJCS8qIERvbid0IGtub3cgaG93IHRvIGFib3J0ICovCit9CisKK3N0YXRpYyBpbnQgTkNSNTNjNDA2YV9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCURFQihwcmludGsoIk5DUjUzYzQwNmFfcmVzZXQgY2FsbGVkXG4iKSk7CisJb3V0YihDNF9JTUcsIENPTkZJRzQpOwkvKiBTZWxlY3QgcmVnIHNldCAwICovCisJb3V0YihDSElQX1JFU0VULCBDTURfUkVHKTsKKwlvdXRiKFNDU0lfTk9QLCBDTURfUkVHKTsJLyogcmVxdWlyZWQgYWZ0ZXIgcmVzZXQgKi8KKwlvdXRiKFNDU0lfUkVTRVQsIENNRF9SRUcpOworCWNoaXBfaW5pdCgpOworCisJcnRyYygyKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBOQ1I1M2M0MDZhX2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IE5DUjUzYzQwNmFfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgTkNSNTNjNDA2YV9iaW9zcGFybShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRpc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQkJICAgICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm9fYXJyYXkpCit7CisJaW50IHNpemU7CisKKwlERUIocHJpbnRrKCJOQ1I1M2M0MDZhX2Jpb3NwYXJtIGNhbGxlZFxuIikpOworCisJc2l6ZSA9IGNhcGFjaXR5OworCWluZm9fYXJyYXlbMF0gPSA2NDsJLyogaGVhZHMgKi8KKwlpbmZvX2FycmF5WzFdID0gMzI7CS8qIHNlY3RvcnMgKi8KKwlpbmZvX2FycmF5WzJdID0gc2l6ZSA+PiAxMTsJLyogY3lsaW5kZXJzICovCisJaWYgKGluZm9fYXJyYXlbMl0gPiAxMDI0KSB7CS8qIGJpZyBkaXNrICovCisJCWluZm9fYXJyYXlbMF0gPSAyNTU7CisJCWluZm9fYXJyYXlbMV0gPSA2MzsKKwkJaW5mb19hcnJheVsyXSA9IHNpemUgLyAoMjU1ICogNjMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX05DUjUzYzQwNmFfaW50cihpbnQgdW51c2VkLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlOQ1I1M2M0MDZhX2ludHIoMCwgZGV2X2lkLCByZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBOQ1I1M2M0MDZhX2ludHIoaW50IHVudXNlZCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlERUIodW5zaWduZWQgY2hhciBmaWZvX3NpemU7CisJICAgICkKKwkgICAgREVCKHVuc2lnbmVkIGNoYXIgc2VxX3JlZzsKKwkgICAgKQorCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBpbnRfcmVnOworI2lmIFVTRV9QSU8KKwl1bnNpZ25lZCBjaGFyIHBpb19zdGF0dXM7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7CisJdW5zaWduZWQgaW50IHNnY291bnQ7CisjZW5kaWYKKworCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhX2ludHIgY2FsbGVkXG4iKSk7CisKKyNpZiBVU0VfUElPCisJUkVHMTsKKwlwaW9fc3RhdHVzID0gaW5iKFBJT19TVEFUVVMpOworI2VuZGlmCisJUkVHMDsKKwlzdGF0dXMgPSBpbmIoU1RBVF9SRUcpOworCURFQihzZXFfcmVnID0gaW5iKFNFUV9SRUcpKTsKKwlpbnRfcmVnID0gaW5iKElOVF9SRUcpOworCURFQihmaWZvX3NpemUgPSBpbmIoRklGT19GTEFHUykgJiAweDFmKTsKKworI2lmIE5DUjUzQzQwNkFfREVCVUcKKwlwcmludGsoInN0YXR1cz0lMDJ4LCBzZXFfcmVnPSUwMngsIGludF9yZWc9JTAyeCwgZmlmb19zaXplPSUwMngiLCBzdGF0dXMsIHNlcV9yZWcsIGludF9yZWcsIGZpZm9fc2l6ZSk7CisjaWYgKFVTRV9ETUEpCisJcHJpbnRrKCJcbiIpOworI2Vsc2UKKwlwcmludGsoIiwgcGlvPSUwMnhcbiIsIHBpb19zdGF0dXMpOworI2VuZGlmCQkJCS8qIFVTRV9ETUEgKi8KKyNlbmRpZgkJCQkvKiBOQ1I1M0M0MDZBX0RFQlVHICovCisKKwlpZiAoaW50X3JlZyAmIDB4ODApIHsJLyogU0NTSSByZXNldCBpbnRyICovCisJCXJ0cmMoMyk7CisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IHJlc2V0IGludHIgcmVjZWl2ZWRcbiIpKTsKKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaWRsZTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQljdXJyZW50X1NDLT5zY3NpX2RvbmUoY3VycmVudF9TQyk7CisJCXJldHVybjsKKwl9CisjaWYgVVNFX1BJTworCWlmIChwaW9fc3RhdHVzICYgMHg4MCkgeworCQlwcmludGsoIk5DUjUzQzQwNkE6IFdhcm5pbmc6IFBJTyBlcnJvciFcbiIpOworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWN1cnJlbnRfU0MtPnNjc2lfZG9uZShjdXJyZW50X1NDKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgkJCQkvKiBVU0VfUElPICovCisKKwlpZiAoc3RhdHVzICYgMHgyMCkgewkvKiBQYXJpdHkgZXJyb3IgKi8KKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBXYXJuaW5nOiBwYXJpdHkgZXJyb3IhXG4iKTsKKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaWRsZTsKKwkJY3VycmVudF9TQy0+cmVzdWx0ID0gRElEX1BBUklUWSA8PCAxNjsKKwkJY3VycmVudF9TQy0+c2NzaV9kb25lKGN1cnJlbnRfU0MpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0YXR1cyAmIDB4NDApIHsJLyogR3Jvc3MgZXJyb3IgKi8KKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBXYXJuaW5nOiBncm9zcyBlcnJvciFcbiIpOworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWN1cnJlbnRfU0MtPnNjc2lfZG9uZShjdXJyZW50X1NDKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbnRfcmVnICYgMHgyMCkgewkvKiBEaXNjb25uZWN0ICovCisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IGRpc2Nvbm5lY3QgaW50ciByZWNlaXZlZFxuIikpOworCQlpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICE9IG1lc3NhZ2VfaW4pIHsJLyogVW5leHBlY3RlZCBkaXNjb25uZWN0ICovCisJCQljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJfSBlbHNlIHsJLyogQ29tbWFuZCBjb21wbGV0ZSwgcmV0dXJuIHN0YXR1cyBhbmQgbWVzc2FnZSAqLworCQkJY3VycmVudF9TQy0+cmVzdWx0ID0gKGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKQorCQkJICAgIHwgKChjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNik7CisJCX0KKworCQlydHJjKDApOworCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X1NDLT5zY3NpX2RvbmUoY3VycmVudF9TQyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHN0YXR1cyAmIDB4MDcpIHsJLyogc2NzaSBwaGFzZSAqLworCWNhc2UgMHgwMDoJCS8qIERBVEEtT1VUICovCisJCWlmIChpbnRfcmVnICYgMHgxMCkgewkvKiBUYXJnZXQgcmVxdWVzdGluZyBpbmZvIHRyYW5zZmVyICovCisJCQlydHJjKDUpOworCQkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gZGF0YV9vdXQ7CisJCQlWREVCKHByaW50aygiTkNSNTNjNDA2YTogRGF0YS1PdXQgcGhhc2VcbiIpKTsKKwkJCW91dGIoRkxVU0hfRklGTywgQ01EX1JFRyk7CisJCQlMT0FEX0RNQV9DT1VOVChjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW4pOwkvKiBNYXggdHJhbnNmZXIgc2l6ZSAqLworI2lmIFVTRV9ETUEJCQkvKiBObyBzL2cgc3VwcG9ydCBmb3IgRE1BICovCisJCQlOQ1I1M2M0MDZhX2RtYV93cml0ZShjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciwgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmbGVuKTsKKyNlbmRpZgkJCQkvKiBVU0VfRE1BICovCisJCQlvdXRiKFRSQU5TRkVSX0lORk8gfCBETUFfT1AsIENNRF9SRUcpOworI2lmIFVTRV9QSU8KKwkJCWlmICghY3VycmVudF9TQy0+dXNlX3NnKQkvKiBEb24ndCB1c2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlOQ1I1M2M0MDZhX3Bpb193cml0ZShjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlciwgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWVsc2UgewkvKiB1c2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlzZ2NvdW50ID0gY3VycmVudF9TQy0+dXNlX3NnOworCQkJCXNnbGlzdCA9IGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyOworCQkJCXdoaWxlIChzZ2NvdW50LS0pIHsKKwkJCQkJTkNSNTNjNDA2YV9waW9fd3JpdGUocGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCwgc2dsaXN0LT5sZW5ndGgpOworCQkJCQlzZ2xpc3QrKzsKKwkJCQl9CisJCQl9CisJCQlSRUcwOworI2VuZGlmCQkJCS8qIFVTRV9QSU8gKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMToJCS8qIERBVEEtSU4gKi8KKwkJaWYgKGludF9yZWcgJiAweDEwKSB7CS8qIFRhcmdldCByZXF1ZXN0aW5nIGluZm8gdHJhbnNmZXIgKi8KKwkJCXJ0cmMoNik7CisJCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBkYXRhX2luOworCQkJVkRFQihwcmludGsoIk5DUjUzYzQwNmE6IERhdGEtSW4gcGhhc2VcbiIpKTsKKwkJCW91dGIoRkxVU0hfRklGTywgQ01EX1JFRyk7CisJCQlMT0FEX0RNQV9DT1VOVChjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW4pOwkvKiBNYXggdHJhbnNmZXIgc2l6ZSAqLworI2lmIFVTRV9ETUEJCQkvKiBObyBzL2cgc3VwcG9ydCBmb3IgRE1BICovCisJCQlOQ1I1M2M0MDZhX2RtYV9yZWFkKGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyLCBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZsZW4pOworI2VuZGlmCQkJCS8qIFVTRV9ETUEgKi8KKwkJCW91dGIoVFJBTlNGRVJfSU5GTyB8IERNQV9PUCwgQ01EX1JFRyk7CisjaWYgVVNFX1BJTworCQkJaWYgKCFjdXJyZW50X1NDLT51c2Vfc2cpCS8qIERvbid0IHVzZSBzY2F0dGVyLWdhdGhlciAqLworCQkJCU5DUjUzYzQwNmFfcGlvX3JlYWQoY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIsIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmxlbik7CisJCQllbHNlIHsJLyogVXNlIHNjYXR0ZXItZ2F0aGVyICovCisJCQkJc2djb3VudCA9IGN1cnJlbnRfU0MtPnVzZV9zZzsKKwkJCQlzZ2xpc3QgPSBjdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCQl3aGlsZSAoc2djb3VudC0tKSB7CisJCQkJCU5DUjUzYzQwNmFfcGlvX3JlYWQocGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCwgc2dsaXN0LT5sZW5ndGgpOworCQkJCQlzZ2xpc3QrKzsKKwkJCQl9CisJCQl9CisJCQlSRUcwOworI2VuZGlmCQkJCS8qIFVTRV9QSU8gKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMjoJCS8qIENPTU1BTkQgKi8KKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gY29tbWFuZF9waDsKKwkJcHJpbnRrKCJOQ1I1M2M0MDZhOiBXYXJuaW5nOiBVbmtub3duIGludGVycnVwdCBvY2N1cnJlZCBpbiBjb21tYW5kIHBoYXNlIVxuIik7CisJCWJyZWFrOworCisJY2FzZSAweDAzOgkJLyogU1RBVFVTICovCisJCXJ0cmMoNyk7CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IHN0YXR1c19waDsKKwkJVkRFQihwcmludGsoIk5DUjUzYzQwNmE6IFN0YXR1cyBwaGFzZVxuIikpOworCQlvdXRiKEZMVVNIX0ZJRk8sIENNRF9SRUcpOworCQlvdXRiKElOSVRfQ01EX0NPTVBMRVRFLCBDTURfUkVHKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDQ6CQkvKiBSZXNlcnZlZCAqLworCWNhc2UgMHgwNToJCS8qIFJlc2VydmVkICovCisJCXByaW50aygiTkNSNTNjNDA2YTogV0FSTklORzogUmVzZXJ2ZWQgcGhhc2UhISFcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgwNjoJCS8qIE1FU1NBR0UtT1VUICovCisJCURFQihwcmludGsoIk5DUjUzYzQwNmE6IE1lc3NhZ2UtT3V0IHBoYXNlXG4iKSk7CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IG1lc3NhZ2Vfb3V0OworCQlvdXRiKFNFVF9BVE4sIENNRF9SRUcpOwkvKiBSZWplY3QgdGhlIG1lc3NhZ2UgKi8KKwkJb3V0YihNU0dfQUNDRVBULCBDTURfUkVHKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDc6CQkvKiBNRVNTQUdFLUlOICovCisJCXJ0cmMoNCk7CisJCVZERUIocHJpbnRrKCJOQ1I1M2M0MDZhOiBNZXNzYWdlLUluIHBoYXNlXG4iKSk7CisJCWN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IG1lc3NhZ2VfaW47CisKKwkJY3VycmVudF9TQy0+U0NwLlN0YXR1cyA9IGluYihTQ1NJX0ZJRk8pOworCQljdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9IGluYihTQ1NJX0ZJRk8pOworCisJCVZERUIocHJpbnRrKCJTQ1NJIEZJRk8gc2l6ZT0lZFxuIiwgaW5iKEZJRk9fRkxBR1MpICYgMHgxZikpOworCQlERUIocHJpbnRrKCJTdGF0dXMgPSAlMDJ4ICBNZXNzYWdlID0gJTAyeFxuIiwgY3VycmVudF9TQy0+U0NwLlN0YXR1cywgY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UpKTsKKworCQlpZiAoY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UgPT0gU0FWRV9QT0lOVEVSUyB8fCBjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9PSBESVNDT05ORUNUKSB7CisJCQlvdXRiKFNFVF9BVE4sIENNRF9SRUcpOwkvKiBSZWplY3QgbWVzc2FnZSAqLworCQkJREVCKHByaW50aygiRGlzY2FyZGluZyBTQVZFX1BPSU5URVJTIG1lc3NhZ2VcbiIpKTsKKwkJfQorCQlvdXRiKE1TR19BQ0NFUFQsIENNRF9SRUcpOworCQlicmVhazsKKwl9Cit9CisKKyNpZm5kZWYgSVJRX0xFVgorc3RhdGljIGludCBpcnFfcHJvYmUodm9pZCkKK3sKKwlpbnQgaXJxcywgaXJxOworCXVuc2lnbmVkIGxvbmcgaTsKKworCWluYihJTlRfUkVHKTsJCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwlpcnFzID0gcHJvYmVfaXJxX29uKCk7CisKKwkvKiBJbnZhbGlkIGNvbW1hbmQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQgKi8KKwlSRUcwOworCW91dGIoMHhmZiwgQ01EX1JFRyk7CisKKwkvKiBXYWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIG9jY3VyICovCisJaSA9IGppZmZpZXMgKyBXQVRDSERPRzsKKwl3aGlsZSAodGltZV9hZnRlcihpLCBqaWZmaWVzKSAmJiAhKGluYihTVEFUX1JFRykgJiAweDgwKSkKKwkJYmFycmllcigpOworCWlmICh0aW1lX2JlZm9yZV9lcShpLCBqaWZmaWVzKSkgewkvKiBUaW1lZCBvdXQsIG11c3QgYmUgaGFyZHdhcmUgdHJvdWJsZSAqLworCQlwcm9iZV9pcnFfb2ZmKGlycXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKworCS8qIEtpY2sgdGhlIGNoaXAgKi8KKwlvdXRiKENISVBfUkVTRVQsIENNRF9SRUcpOworCW91dGIoU0NTSV9OT1AsIENNRF9SRUcpOworCWNoaXBfaW5pdCgpOworCisJcmV0dXJuIGlycTsKK30KKyNlbmRpZgkJCQkvKiBJUlFfTEVWICovCisKK3N0YXRpYyB2b2lkIGNoaXBfaW5pdCh2b2lkKQoreworCVJFRzE7CisjaWYgVVNFX0RNQQorCW91dGIoMHgwMCwgUElPX1NUQVRVUyk7CisjZWxzZQkJCQkvKiBVU0VfUElPICovCisJb3V0YigweDAxLCBQSU9fU1RBVFVTKTsKKyNlbmRpZgorCW91dGIoMHgwMCwgUElPX0ZMQUcpOworCisJb3V0YihDNF9JTUcsIENPTkZJRzQpOwkvKiBSRUcwOyAqLworCW91dGIoQzNfSU1HLCBDT05GSUczKTsKKwlvdXRiKEMyX0lNRywgQ09ORklHMik7CisJb3V0YihDMV9JTUcsIENPTkZJRzEpOworCisJb3V0YigweDA1LCBDTEtDT05WKTsJLyogY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgKi8KKwlvdXRiKDB4OUMsIFNSVElNT1VUKTsJLyogU2VsZWN0aW9uIHRpbWVvdXQgKi8KKwlvdXRiKDB4MDUsIFNZTkNQUkQpOwkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBwZXJpb2QgKi8KKwlvdXRiKFNZTkNfTU9ERSwgU1lOQ09GRik7CS8qIHN5bmNocm9ub3VzIG1vZGUgKi8KK30KKworc3RhdGljIHZvaWQgX19pbml0IGNhbGNfcG9ydF9hZGRyKHZvaWQpCit7CisJLyogQ29udHJvbCBSZWdpc3RlciBTZXQgMCAqLworCVRDX0xTQiA9IChwb3J0X2Jhc2UgKyAweDAwKTsKKwlUQ19NU0IgPSAocG9ydF9iYXNlICsgMHgwMSk7CisJU0NTSV9GSUZPID0gKHBvcnRfYmFzZSArIDB4MDIpOworCUNNRF9SRUcgPSAocG9ydF9iYXNlICsgMHgwMyk7CisJU1RBVF9SRUcgPSAocG9ydF9iYXNlICsgMHgwNCk7CisJREVTVF9JRCA9IChwb3J0X2Jhc2UgKyAweDA0KTsKKwlJTlRfUkVHID0gKHBvcnRfYmFzZSArIDB4MDUpOworCVNSVElNT1VUID0gKHBvcnRfYmFzZSArIDB4MDUpOworCVNFUV9SRUcgPSAocG9ydF9iYXNlICsgMHgwNik7CisJU1lOQ1BSRCA9IChwb3J0X2Jhc2UgKyAweDA2KTsKKwlGSUZPX0ZMQUdTID0gKHBvcnRfYmFzZSArIDB4MDcpOworCVNZTkNPRkYgPSAocG9ydF9iYXNlICsgMHgwNyk7CisJQ09ORklHMSA9IChwb3J0X2Jhc2UgKyAweDA4KTsKKwlDTEtDT05WID0gKHBvcnRfYmFzZSArIDB4MDkpOworCS8qIFRFU1RSRUcgICAgICAgICAgPSAocG9ydF9iYXNlKzB4MEEpOyAqLworCUNPTkZJRzIgPSAocG9ydF9iYXNlICsgMHgwQik7CisJQ09ORklHMyA9IChwb3J0X2Jhc2UgKyAweDBDKTsKKwlDT05GSUc0ID0gKHBvcnRfYmFzZSArIDB4MEQpOworCVRDX0hJR0ggPSAocG9ydF9iYXNlICsgMHgwRSk7CisJLyogRklGT19CT1RUT00gICAgICA9IChwb3J0X2Jhc2UrMHgwRik7ICovCisKKwkvKiBDb250cm9sIFJlZ2lzdGVyIFNldCAxICovCisJLyogSlVNUEVSX1NFTlNFICAgICA9IChwb3J0X2Jhc2UrMHgwMCk7ICovCisJLyogU1JBTV9QVFIgICAgICAgICA9IChwb3J0X2Jhc2UrMHgwMSk7ICovCisJLyogU1JBTV9EQVRBICAgICAgICA9IChwb3J0X2Jhc2UrMHgwMik7ICovCisJUElPX0ZJRk8gPSAocG9ydF9iYXNlICsgMHgwNCk7CisJLyogUElPX0ZJRk8xICAgICAgICA9IChwb3J0X2Jhc2UrMHgwNSk7ICovCisJLyogUElPX0ZJRk8yICAgICAgICA9IChwb3J0X2Jhc2UrMHgwNik7ICovCisJLyogUElPX0ZJRk8zICAgICAgICA9IChwb3J0X2Jhc2UrMHgwNyk7ICovCisJUElPX1NUQVRVUyA9IChwb3J0X2Jhc2UgKyAweDA4KTsKKwkvKiBBVEFfQ01EICAgICAgICAgID0gKHBvcnRfYmFzZSsweDA5KTsgKi8KKwkvKiBBVEFfRVJSICAgICAgICAgID0gKHBvcnRfYmFzZSsweDBBKTsgKi8KKwlQSU9fRkxBRyA9IChwb3J0X2Jhc2UgKyAweDBCKTsKKwlDT05GSUc1ID0gKHBvcnRfYmFzZSArIDB4MEQpOworCS8qIFNJR05BVFVSRSAgICAgICAgPSAocG9ydF9iYXNlKzB4MEUpOyAqLworCS8qIENPTkZJRzYgICAgICAgICAgPSAocG9ydF9iYXNlKzB4MEYpOyAqLworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIE5PVEU6ICBzY2F0dGVyLWdhdGhlciBzdXBwb3J0IG9ubHkgd29ya3MgaW4gUElPIG1vZGUuCisgKiBVc2UgU0dfTk9ORSBpZiBETUEgbW9kZSBpcyBlbmFibGVkIQorICovCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gCit7CisgICAgIC5wcm9jX25hbWUgICAgICAgICAJPSAiTkNSNTNjNDA2YSIJCS8qIHByb2NfbmFtZSAqLywgICAgICAgIAorICAgICAubmFtZSAgICAgICAgICAgICAgCT0gIk5DUjUzYzQwNmEiCQkvKiBuYW1lICovLCAgICAgICAgICAgICAKKyAgICAgLmRldGVjdCAgICAgICAgICAgIAk9IE5DUjUzYzQwNmFfZGV0ZWN0CS8qIGRldGVjdCAqLywgICAgICAgICAgIAorICAgICAucmVsZWFzZSAgICAgICAgICAgIAk9IE5DUjUzYzQwNmFfcmVsZWFzZSwKKyAgICAgLmluZm8gICAgICAgICAgICAgIAk9IE5DUjUzYzQwNmFfaW5mbwkJLyogaW5mbyAqLywgICAgICAgICAgICAgCisgICAgIC5xdWV1ZWNvbW1hbmQgICAgICAJPSBOQ1I1M2M0MDZhX3F1ZXVlCS8qIHF1ZXVlY29tbWFuZCAqLywgICAgIAorICAgICAuZWhfYWJvcnRfaGFuZGxlciAgCT0gTkNSNTNjNDA2YV9hYm9ydAkvKiBhYm9ydCAqLywgICAgICAgICAgICAKKyAgICAgLmVoX2J1c19yZXNldF9oYW5kbGVyICAgICAgPSBOQ1I1M2M0MDZhX2J1c19yZXNldAkvKiByZXNldCAqLywgICAgICAgICAgICAKKyAgICAgLmVoX2RldmljZV9yZXNldF9oYW5kbGVyICAgPSBOQ1I1M2M0MDZhX2RldmljZV9yZXNldAkvKiByZXNldCAqLywgICAgICAgICAgICAKKyAgICAgLmVoX2hvc3RfcmVzZXRfaGFuZGxlciAgICAgPSBOQ1I1M2M0MDZhX2hvc3RfcmVzZXQJLyogcmVzZXQgKi8sICAgICAgICAgICAgCisgICAgIC5iaW9zX3BhcmFtICAgICAgICAJPSBOQ1I1M2M0MDZhX2Jpb3NwYXJtCS8qIGJpb3NwYXJtICovLCAgICAgICAgIAorICAgICAuY2FuX3F1ZXVlICAgICAgICAgCT0gMQkJCS8qIGNhbl9xdWV1ZSAqLywgICAgICAgIAorICAgICAudGhpc19pZCAgICAgICAgICAgCT0gNwkJCS8qIFNDU0kgSUQgb2YgdGhlIGNoaXAgKi8sCisgICAgIC5zZ190YWJsZXNpemUgICAgICAJPSAzMgkJCS8qU0dfQUxMKi8gLypTR19OT05FKi8sIAorICAgICAuY21kX3Blcl9sdW4gICAgICAgCT0gMQkJCS8qIGNvbW1hbmRzIHBlciBsdW4gKi8sIAorICAgICAudW5jaGVja2VkX2lzYV9kbWEgCT0gMQkJCS8qIHVuY2hlY2tlZF9pc2FfZG1hICovLAorICAgICAudXNlX2NsdXN0ZXJpbmcgICAgCT0gRU5BQkxFX0NMVVNURVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBnZXQgYSB1bmlmb3JtIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogNAorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTQKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDQKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtNAorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYyBiL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzc1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYwpAQCAtMCwwICsxLDQwNiBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBOQ1IgRHVhbCA3MDAgTUNBIFNDU0kgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqICAKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIE5vdGVzOgorICoKKyAqIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBpbiB0aGUgY2hpcCBzcGVjaWZpYyBtb2R1bGUsIDUzYzcwMC5vCisgKgorICogVE9ETyBMaXN0OgorICoKKyAqIDEuIEV4dHJhY3QgdGhlIFNDU0kgSUQgZnJvbSB0aGUgdm95YWdlciBDTU9TIHRhYmxlIChuZWNlc3NhcnkgdG8KKyAqICAgIHN1cHBvcnQgbXVsdGktaG9zdCBlbnZpcm9ubWVudHMuCisgKgorICogKi8KKworCisvKiBDSEFOR0VMT0cgCisgKgorICogVmVyc2lvbiAyLjIKKyAqCisgKiBBZGRlZCBtY2Ffc2V0X2FkYXB0ZXJfbmFtZSgpLgorICoKKyAqIFZlcnNpb24gMi4xCisgKgorICogTW9kdWxhcmlzZSB0aGUgZHJpdmVyIGludG8gYSBCb2FyZCBwaWVjZSAodGhpcyBmaWxlKSBhbmQgYSBjaGlwCisgKiBwaWVjZSA1M2M3MDAuW2NoXSBhbmQgNTNjNzAwLnNjciwgYWRkZWQgbW9kdWxlIG9wdGlvbnMuICBZb3UgY2FuCisgKiBub3cgc3BlY2lmeSB0aGUgc2NzaSBpZCBieSB0aGUgcGFyYW1ldGVycworICoKKyAqIE5DUl9ENzAwPXNsb3Q6PG4+IFtzaW9wOjxuPl0gaWQ6PG4+IC4uLi4KKyAqCisgKiBUaGV5IG5lZWQgdG8gYmUgY29tbWEgc2VwYXJhdGVkIGlmIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbAorICoKKyAqIFZlcnNpb24gMi4wCisgKgorICogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBUQ1EgKFRhZyBDb21tYW5kIFF1ZXVlaW5nKS4gIFRDUSBpcyBmdWxsCisgKiBmZWF0dXJlZCBhbmQgdXNlcyB0aGUgY2xvY2sgYWxnb3JpdGhtIHRvIGtlZXAgdHJhY2sgb2Ygb3V0c3RhbmRpbmcKKyAqIHRhZ3MgYW5kIGd1YXJkIGFnYWluc3QgaW5kaXZpZHVhbCB0YWcgc3RhcnZhdGlvbi4gIEFsc28gZml4ZWQgYSBidWcKKyAqIGluIGFsbCBvZiB0aGUgMS54IHZlcnNpb25zIHdoZXJlIHRoZSBENzAwX2RhdGFfcmVzaWR1ZSgpIGZ1bmN0aW9uCisgKiB3YXMgcmV0dXJuaW5nIHJlc3VsdHMgb2ZmIGJ5IDMyIGJ5dGVzIChhbmQgdGh1cyBjYXVzaW5nIHRoZSBzYW1lIDMyCisgKiBieXRlcyB0byBiZSB3cml0dGVuIHR3aWNlIGNvcnJ1cHRpbmcgdGhlIGRhdGEgYmxvY2spLiAgSXQgdHVybnMgb3V0CisgKiB0aGUgNTNjNzAwIG9ubHkgaGFzIGEgNiBiaXQgREJDIGFuZCBERklGTyByZWdpc3RlcnMgbm90IDcgYml0IG9uZXMKKyAqIGxpa2UgdGhlIDUzYzcxMCAoVGhlIDcxMCBpcyB0aGUgb25seSBkYXRhIG1hbnVhbCBzdGlsbCBhdmFpbGFibGUsCisgKiB3aGljaCBJJ2QgYmVlbiB1c2luZyB0byBwcm9ncmFtIHRoZSA3MDApLgorICoKKyAqIFZlcnNpb24gMS4yCisgKgorICogTXVjaCBpbXByb3ZlZCBtZXNzYWdlIGhhbmRsaW5nIGVuZ2luZQorICoKKyAqIFZlcnNpb24gMS4xCisgKgorICogQWRkIGNvZGUgdG8gaGFuZGxlIHNlbGVjdGlvbiByZWFzb25hYmx5IGNvcnJlY3RseS4gIEJ5IHRoZSB0aW1lIHdlCisgKiBnZXQgdGhlIHNlbGVjdGlvbiBpbnRlcnJ1cHQsIHdlJ3ZlIGFscmVhZHkgcmVzcG9uZGVkLCBidXQgZHJvcCBvZmYgdGhlCisgKiBidXMgYW5kIGhvcGUgdGhlIHNlbGVjdG9yIHdpbGwgZ28gYXdheS4KKyAqCisgKiBWZXJzaW9uIDEuMDoKKyAqCisgKiAgIEluaXRpYWwgcmVsZWFzZS4gIEZ1bGx5IGZ1bmN0aW9uYWwgZXhjZXB0IGZvciBwcm9jZnMgYW5kIHRhZworICogY29tbWFuZCBxdWV1ZWluZy4gIEhhcyBvbmx5IGJlZW4gdGVzdGVkIG9uIGNhcmRzIHdpdGggNTNjNzAwLTY2CisgKiBjaGlwcyBhbmQgb25seSBzaW5nbGUgZW5kZWQuIEZlYXR1cmVzIGFyZQorICoKKyAqIDEuIFN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzIHRvIG9mZnNldCA4IChsaW1pdCBvZiA3MDAtNjYpIGFuZAorICogICAgMTAwbnMgKDEwTUh6KSBsaW1pdCBvZiBTQ1NJLTIKKyAqCisgKiAyLiBEaXNjb25uZWN0aW9uIGFuZCByZXNlbGVjdGlvbgorICoKKyAqIFRlc3Rpbmc6CisgKiAKKyAqICBJJ3ZlIG9ubHkgcmVhbGx5IHRlc3RlZCB0aGlzIHdpdGggdGhlIDcwMC02NiBjaGlwLCBidXQgaGF2ZSBkb25lCisgKiBzb2FrIHRlc3RzIGluIG11bHRpLWRldmljZSBlbnZpcm9ubWVudHMgdG8gdmVyaWZ5IHRoYXQKKyAqIGRpc2Nvbm5lY3Rpb25zIGFuZCByZXNlbGVjdGlvbnMgYXJlIGJlaW5nIHByb2Nlc3NlZCBjb3JyZWN0bHkuCisgKiAqLworCisjZGVmaW5lIE5DUl9ENzAwX1ZFUlNJT04gIjIuMiIKKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjaW5jbHVkZSAiNTNjNzAwLmgiCisjaW5jbHVkZSAiTkNSX0Q3MDAuaCIKKworc3RhdGljIGNoYXIgKk5DUl9ENzAwOwkJLyogY29tbWFuZCBsaW5lIGZyb20gaW5zbW9kICovCisKK01PRFVMRV9BVVRIT1IoIkphbWVzIEJvdHRvbWxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQ1IgRHVhbDcwMCBTQ1NJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKE5DUl9ENzAwLCBjaGFycCwgMCk7CisKK3N0YXRpYyBfX3U4IF9faW5pdGRhdGEgaWRfYXJyYXlbMiooTUNBX01BWF9TTE9UX05SICsgMSldID0KKwl7IFswIC4uLiAyKihNQ0FfTUFYX1NMT1RfTlIgKyAxKS0xXSA9IDcgfTsKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBBUkdfU0VQICcgJworI2Vsc2UKKyNkZWZpbmUgQVJHX1NFUCAnLCcKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdAorcGFyYW1fc2V0dXAoY2hhciAqc3RyaW5nKQoreworCWNoYXIgKnBvcyA9IHN0cmluZywgKm5leHQ7CisJaW50IHNsb3QgPSAtMSwgc2lvcCA9IC0xOworCisJd2hpbGUocG9zICE9IE5VTEwgJiYgKG5leHQgPSBzdHJjaHIocG9zLCAnOicpKSAhPSBOVUxMKSB7CisJCWludCB2YWwgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKCsrbmV4dCwgTlVMTCwgMCk7CisKKwkJaWYoIXN0cm5jbXAocG9zLCAic2xvdDoiLCA1KSkKKwkJCXNsb3QgPSB2YWw7CisJCWVsc2UgaWYoIXN0cm5jbXAocG9zLCAic2lvcDoiLCA1KSkKKwkJCXNpb3AgPSB2YWw7CisJCWVsc2UgaWYoIXN0cm5jbXAocG9zLCAiaWQ6IiwgMykpIHsKKwkJCWlmKHNsb3QgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOQ1IgRDcwMDogTXVzdCBzcGVjaWZ5IHNsb3QgZm9yIGlkIHBhcmFtZXRlclxuIik7CisJCQl9IGVsc2UgaWYoc2xvdCA+IE1DQV9NQVhfU0xPVF9OUikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5DUiBENzAwOiBJbGxlZ2FsIHNsb3QgJWQgZm9yIGlkICVkXG4iLCBzbG90LCB2YWwpOworCQkJfSBlbHNlIHsKKwkJCQlpZihzaW9wICE9IDAgJiYgc2lvcCAhPSAxKSB7CisJCQkJCWlkX2FycmF5W3Nsb3QqMl0gPSB2YWw7CisJCQkJCWlkX2FycmF5W3Nsb3QqMiArIDFdID12YWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWRfYXJyYXlbc2xvdCoyICsgc2lvcF0gPSB2YWw7CisJCQkJfQorCQkJfQorCQl9CisJCWlmKChwb3MgPSBzdHJjaHIocG9zLCBBUkdfU0VQKSkgIT0gTlVMTCkKKwkJCXBvcysrOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogSG9zdCB0ZW1wbGF0ZS4gIFRoZSA1M2M3MDAgcm91dGluZSBOQ1JfNzAwX2RldGVjdCB3aWxsCisgKiBmaWxsIGluIGFsbCBvZiB0aGUgbWlzc2luZyByb3V0aW5lcyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgTkNSX0Q3MDBfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiTkNSIER1YWwgNzAwIE1DQSIsCisJLnByb2NfbmFtZQkJPSAiTkNSX0Q3MDAiLAorCS50aGlzX2lkCQk9IDcsCit9OworCisvKiBXZSBuZWVkcyB0aGlzIGhlbHBlciBiZWNhdXNlIHdlIGhhdmUgdHdvIGhvc3RzIHBlciBzdHJ1Y3QgZGV2aWNlICovCitzdHJ1Y3QgTkNSX0Q3MDBfcHJpdmF0ZSB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0c1syXTsKKwljaGFyCQkJbmFtZVszMF07CisJY2hhcgkJCXBhZDsKK307CisKK3N0YXRpYyBpbnQgCitOQ1JfRDcwMF9wcm9iZV9vbmUoc3RydWN0IE5DUl9ENzAwX3ByaXZhdGUgKnAsIGludCBzaW9wLCBpbnQgaXJxLAorCQkgICBpbnQgc2xvdCwgdTMyIHJlZ2lvbiwgaW50IGRpZmZlcmVudGlhbCkKK3sKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJaW50IHJldDsKKworCWhvc3RkYXRhID0ga21hbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0ZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5DUiBENzAwOiBTSU9QJWQ6IEZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IgorCQkgICAgICAgImRhdGEsIGRldGF0Y2hpbmdcbiIsIHNpb3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGhvc3RkYXRhLCAwLCBzaXplb2YoKmhvc3RkYXRhKSk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJlZ2lvbiwgNjQsICJOQ1JfRDcwMCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkNSIEQ3MDA6IEZhaWxlZCB0byByZXNlcnZlIElPIHJlZ2lvbiAweCV4XG4iLAorCQkJCXJlZ2lvbik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcmVnaW9uX2ZhaWxlZDsKKwl9CisJCQorCS8qIEZpbGwgaW4gdGhlIHRocmVlIHJlcXVpcmVkIHBpZWNlcyBvZiBob3N0ZGF0YSAqLworCWhvc3RkYXRhLT5iYXNlID0gcmVnaW9uOworCWhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPSAoKCgxPDxzaW9wKSAmIGRpZmZlcmVudGlhbCkgIT0gMCk7CisJaG9zdGRhdGEtPmNsb2NrID0gTkNSX0Q3MDBfQ0xPQ0tfTUhaOworCisJTkNSXzcwMF9zZXRfaW9fbWFwcGVkKGhvc3RkYXRhKTsKKworCS8qIGFuZCByZWdpc3RlciB0aGUgc2lvcCAqLworCWhvc3QgPSBOQ1JfNzAwX2RldGVjdCgmTkNSX0Q3MDBfZHJpdmVyX3RlbXBsYXRlLCBob3N0ZGF0YSwgcC0+ZGV2KTsKKwlpZiAoIWhvc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkZXRlY3RfZmFpbGVkOworCX0KKworCXAtPmhvc3RzW3Npb3BdID0gaG9zdDsKKwkvKiBGSVhNRTogcmVhZCB0aGlzIGZyb20gU1VTICovCisJaG9zdC0+dGhpc19pZCA9IGlkX2FycmF5W3Nsb3QgKiAyICsgc2lvcF07CisJaG9zdC0+aXJxID0gaXJxOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7CisKKyBkZXRlY3RfZmFpbGVkOgorCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmJhc2UsIDY0KTsKKyByZWdpb25fZmFpbGVkOgorCWtmcmVlKGhvc3RkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK05DUl9ENzAwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IE5DUl9ENzAwX3ByaXZhdGUgKnAgPSAoc3RydWN0IE5DUl9ENzAwX3ByaXZhdGUgKilkYXRhOworCWludCBpLCBmb3VuZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAocC0+aG9zdHNbaV0gJiYKKwkJICAgIE5DUl83MDBfaW50cihpcnEsIHAtPmhvc3RzW2ldLCByZWdzKSA9PSBJUlFfSEFORExFRCkKKwkJCWZvdW5kKys7CisKKwlyZXR1cm4gZm91bmQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCisvKiBEZXRlY3QgYSBENzAwIGNhcmQuICBOb3RlLCBiZWNhdXNlIG9mIHRoZSBzZXR1cCAtLS0gdGhlIGNoaXBzIGFyZQorICogZXNzZW50aWFsbHkgY29ubmVjdGVjZCB0byB0aGUgTUNBIGJ1cyBpbmRlcGVuZGVudGx5LCBpdCBpcyBlYXNpZXIKKyAqIHRvIHNldCB0aGVtIHVwIGFzIHR3byBzZXBhcmF0ZSBob3N0IGFkYXB0ZXJzLCByYXRoZXIgdGhhbiBvbmUKKyAqIGFkYXB0ZXIgd2l0aCB0d28gY2hhbm5lbHMgKi8KK3N0YXRpYyBpbnQKK05DUl9ENzAwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgTkNSX0Q3MDBfcHJpdmF0ZSAqcDsKKwlpbnQgZGlmZmVyZW50aWFsOworCXN0YXRpYyBpbnQgYmFubmVyID0gMTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldiA9IHRvX21jYV9kZXZpY2UoZGV2KTsKKwlpbnQgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaXJxLCBpOworCWludCBwb3MzaiwgcG9zM2ssIHBvczNhLCBwb3MzYiwgcG9zNDsKKwlfX3UzMiBiYXNlX2FkZHIsIG9mZnNldF9hZGRyOworCisJLyogZW5hYmxlIGJvYXJkIGludGVycnVwdCAqLworCXBvczQgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDQpOworCXBvczQgfD0gMHg0OworCW1jYV9kZXZpY2Vfd3JpdGVfcG9zKG1jYV9kZXYsIDQsIHBvczQpOworCisJbWNhX2RldmljZV93cml0ZV9wb3MobWNhX2RldiwgNiwgOSk7CisJcG9zM2ogPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDMpOworCW1jYV9kZXZpY2Vfd3JpdGVfcG9zKG1jYV9kZXYsIDYsIDEwKTsKKwlwb3MzayA9IG1jYV9kZXZpY2VfcmVhZF9wb3MobWNhX2RldiwgMyk7CisJbWNhX2RldmljZV93cml0ZV9wb3MobWNhX2RldiwgNiwgMCk7CisJcG9zM2EgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDMpOworCW1jYV9kZXZpY2Vfd3JpdGVfcG9zKG1jYV9kZXYsIDYsIDEpOworCXBvczNiID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCAzKTsKKworCWJhc2VfYWRkciA9ICgocG9zM2ogPDwgOCkgfCBwb3MzaykgJiAweGZmZmZmZmYwOworCW9mZnNldF9hZGRyID0gKChwb3MzYSA8PCA4KSB8IHBvczNiKSAmIDB4ZmZmZmZmNzA7CisKKwlpcnEgPSAocG9zNCAmIDB4MykgKyAxMTsKKwlpZihpcnEgPj0gMTMpCisJCWlycSsrOworCWlmKGJhbm5lcikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5DUiBENzAwOiBEcml2ZXIgVmVyc2lvbiAiIE5DUl9ENzAwX1ZFUlNJT04gIlxuIgorCQkgICAgICAgIk5DUiBENzAwOiAgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb21cbiIKKwkJICAgICAgICJOQ1IgRDcwMDpcbiIpOworCQliYW5uZXIgPSAwOworCX0KKwkvKiBub3cgZG8gdGhlIGJ1cyByZWxhdGVkIHRyYW5zZm9ybXMgKi8KKwlpcnEgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pcnEobWNhX2RldiwgaXJxKTsKKwliYXNlX2FkZHIgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pb3BvcnQobWNhX2RldiwgYmFzZV9hZGRyKTsKKwlvZmZzZXRfYWRkciA9IG1jYV9kZXZpY2VfdHJhbnNmb3JtX2lvcG9ydChtY2FfZGV2LCBvZmZzZXRfYWRkcik7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk5DUiBENzAwOiBmb3VuZCBpbiBzbG90ICVkICBpcnEgPSAlZCAgSS9PIGJhc2UgPSAweCV4XG4iLCBzbG90LCBpcnEsIG9mZnNldF9hZGRyKTsKKworCS8qb3V0YihCT0FSRF9SRVNFVCwgYmFzZV9hZGRyKTsqLworCisJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCSh2b2lkKWluYihiYXNlX2FkZHIgKyAweDA4KTsKKwkvKiBnZXQgbW9kY3RsLCB1c2VkIGxhdGVyIGZvciBzZXR0aW5nIGRpZmYgYml0cyAqLworCXN3aXRjaChkaWZmZXJlbnRpYWwgPSAoaW5iKGJhc2VfYWRkciArIDB4MDgpID4+IDYpKSB7CisJY2FzZSAweDAwOgorCQkvKiBvbmx5IFNJT1AxIGRpZmZlcmVudGlhbCAqLworCQlkaWZmZXJlbnRpYWwgPSAweDAyOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCS8qIEJvdGggU0lPUHMgZGlmZmVyZW50aWFsICovCisJCWRpZmZlcmVudGlhbCA9IDB4MDM7CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJLyogTm8gU0lPUHMgZGlmZmVyZW50aWFsICovCisJCWRpZmZlcmVudGlhbCA9IDB4MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiRDcwMDogVU5FWFBFQ1RFRCBESUZGRVJFTlRJQUwgUkVTVUxUIDB4JTAyeFxuIiwKKwkJICAgICAgIGRpZmZlcmVudGlhbCk7CisJCWRpZmZlcmVudGlhbCA9IDB4MDA7CisJCWJyZWFrOworCX0KKworCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHAsICdcMCcsIHNpemVvZigqcCkpOworCXAtPmRldiA9IGRldjsKKwlzbnByaW50ZihwLT5uYW1lLCBzaXplb2YocC0+bmFtZSksICJENzAwKCVzKSIsIGRldi0+YnVzX2lkKTsKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBOQ1JfRDcwMF9pbnRyLCBTQV9TSElSUSwgcC0+bmFtZSwgcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJENzAwOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOworCQlrZnJlZShwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogcGx1bWIgaW4gYm90aCA3MDAgY2hpcHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWludCBlcnI7CisKKwkJaWYgKChlcnIgPSBOQ1JfRDcwMF9wcm9iZV9vbmUocCwgaSwgc2xvdCwgaXJxLAorCQkJCQkgICAgICBvZmZzZXRfYWRkciArICgweDgwICogaSksCisJCQkJCSAgICAgIGRpZmZlcmVudGlhbCkpICE9IDApCisJCQlwcmludGsoIkQ3MDA6IFNJT1AlZDogcHJvYmUgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkJICAgICAgIGksIGVycik7CisJCWVsc2UKKwkJCWZvdW5kKys7CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlrZnJlZShwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMSk7CisJbWNhX2RldmljZV9zZXRfbmFtZShtY2FfZGV2LCAiTkNSX0Q3MDAiKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK05DUl9ENzAwX3JlbW92ZV9vbmUoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCU5DUl83MDBfcmVsZWFzZShob3N0KTsKKwlrZnJlZSgoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF0pOworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJcmVsZWFzZV9yZWdpb24oaG9zdC0+YmFzZSwgNjQpOworfQorCitzdGF0aWMgaW50CitOQ1JfRDcwMF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfRDcwMF9wcml2YXRlICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlOQ1JfRDcwMF9yZW1vdmVfb25lKHAtPmhvc3RzW2ldKTsKKworCWtmcmVlKHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc2hvcnQgTkNSX0Q3MDBfaWRfdGFibGVbXSA9IHsgTkNSX0Q3MDBfTUNBX0lELCAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgbWNhX2RyaXZlciBOQ1JfRDcwMF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gTkNSX0Q3MDBfaWRfdGFibGUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gIk5DUl9ENzAwIiwKKwkJLmJ1cwkJPSAmbWNhX2J1c190eXBlLAorCQkucHJvYmUJCT0gTkNSX0Q3MDBfcHJvYmUsCisJCS5yZW1vdmUJCT0gTkNSX0Q3MDBfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBOQ1JfRDcwMF9pbml0KHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJaWYgKE5DUl9ENzAwKQorCQlwYXJhbV9zZXR1cChOQ1JfRDcwMCk7CisjZW5kaWYKKworCXJldHVybiBtY2FfcmVnaXN0ZXJfZHJpdmVyKCZOQ1JfRDcwMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgTkNSX0Q3MDBfZXhpdCh2b2lkKQoreworCW1jYV91bnJlZ2lzdGVyX2RyaXZlcigmTkNSX0Q3MDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoTkNSX0Q3MDBfaW5pdCk7Cittb2R1bGVfZXhpdChOQ1JfRDcwMF9leGl0KTsKKworX19zZXR1cCgiTkNSX0Q3MDA9IiwgcGFyYW1fc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUl9ENzAwLmggYi9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY3YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL05DUl9ENzAwLmgKQEAgLTAsMCArMSwyOSBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBOQ1IgRHVhbCA3MDAgTUNBIFNDU0kgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqLworCisjaWZuZGVmIF9OQ1JfRDcwMF9ICisjZGVmaW5lIF9OQ1JfRDcwMF9ICisKKy8qIERvbid0IHR1cm4gb24gZGVidWdnaW5nIG1lc3NhZ2VzICovCisjdW5kZWYgTkNSX0Q3MDBfREVCVUcKKworLyogVGhlIE1DQSBpZGVudGlmaWVyICovCisjZGVmaW5lIE5DUl9ENzAwX01DQV9JRAkJMHgwMDkyCisKKy8qIERlZmluZXMgZm9yIHRoZSBCb2FyZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUJQk9BUkRfUkVTRVQJCTB4ODAJLyogYm9hcmQgbGV2ZWwgcmVzZXQgKi8KKyNkZWZpbmUgQUREX1BBUkVOQgkJMHgwNAkvKiBBZGRyZXNzIFBhcml0eSBFbmFibGVkICovCisjZGVmaW5lIERBVF9QQVJFTkIJCTB4MDEJLyogRGF0YSBQYXJpdHkgRW5hYmxlZCAqLworI2RlZmluZSBTRkJLX0VOQgkJMHgxMAkvKiBTRkRCSyBJbnRlcnJ1cHQgRW5hYmxlZCAqLworI2RlZmluZSBMRUQwR1JFRU4JCTB4MjAJLyogTGVkIDAgKHJlZCAwOyBncmVlbiAxKSAqLworI2RlZmluZSBMRUQxR1JFRU4JCTB4NDAJLyogTGVkIDEgKHJlZCAwOyBncmVlbiAxKSAqLworI2RlZmluZSBMRUQwUkVECQkJMHhERgkvKiBMZWQgMCAocmVkIDA7IGdyZWVuIDEpICovCisjZGVmaW5lIExFRDFSRUQJCQkweEJGCS8qIExlZCAxIChyZWQgMDsgZ3JlZW4gMSkgKi8KKworI2RlZmluZSBOQ1JfRDcwMF9DTE9DS19NSFoJNTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSX1E3MjAuYyBiL2RyaXZlcnMvc2NzaS9OQ1JfUTcyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMThlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvTkNSX1E3MjAuYwpAQCAtMCwwICsxLDM3NyBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBOQ1IgUXVhZCA3MjAgTUNBIFNDU0kgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAibmNyNTNjOHh4LmgiCisKKyNpbmNsdWRlICJOQ1JfUTcyMC5oIgorCitzdGF0aWMgc3RydWN0IG5jcl9jaGlwIHE3MjBfY2hpcCBfX2luaXRkYXRhID0geworCS5yZXZpc2lvbl9pZCA9CTB4MGYsCisJLmJ1cnN0X21heCA9CTMsCisJLm9mZnNldF9tYXggPQk4LAorCS5ucl9kaXZpc29yID0JNCwKKwkuZmVhdHVyZXMgPQlGRV9XSURFIHwgRkVfRElGRiB8IEZFX1ZBUkNMSywKK307CisKK01PRFVMRV9BVVRIT1IoIkphbWVzIEJvdHRvbWxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQ1IgUXVhZCA3MjAgU0NTSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBOQ1JfUTcyMF9WRVJTSU9OCQkiMC45IgorCisvKiBXZSBuZWVkcyB0aGlzIGhlbHBlciBiZWNhdXNlIHdlIGhhdmUgdXAgdG8gZm91ciBob3N0cyBwZXIgc3RydWN0IGRldmljZSAqLworc3RydWN0IE5DUl9RNzIwX3ByaXZhdGUgeworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJdm9pZCBfX2lvbWVtICoJCW1lbV9iYXNlOworCV9fdTMyCQkJcGh5c19tZW1fYmFzZTsKKwlfX3UzMgkJCW1lbV9zaXplOworCV9fdTgJCQlpcnE7CisJX191OAkJCXNpb3BzOworCV9fdTgJCQlpcnFfZW5hYmxlOworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3RzWzRdOworfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgTkNSX1E3MjBfdHBudCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lCQk9ICJOQ1JfUTcyMCIsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QKK05DUl9RNzIwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwID0gKHN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICopZGF0YTsKKwlfX3U4IHNpciA9IChyZWFkYihwLT5tZW1fYmFzZSArIDB4MGQpICYgMHhmMCkgPj4gNDsKKwlfX3U4IHNpb3A7CisKKwlzaXIgfD0gfnAtPmlycV9lbmFibGU7CisKKwlpZihzaXIgPT0gMHhmZikKKwkJcmV0dXJuIElSUV9OT05FOworCisKKwl3aGlsZSgoc2lvcCA9IGZmeihzaXIpKSA8IHAtPnNpb3BzKSB7CisJCXNpciB8PSAxPDxzaW9wOworCQluY3I1M2M4eHhfaW50cihpcnEsIHAtPmhvc3RzW3Npb3BdLCByZWdzKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdAorTkNSX1E3MjBfcHJvYmVfb25lKHN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwLCBpbnQgc2lvcCwKKwkJaW50IGlycSwgaW50IHNsb3QsIF9fdTMyIHBhZGRyLCB2b2lkIF9faW9tZW0gKnZhZGRyKQoreworCXN0cnVjdCBuY3JfZGV2aWNlIGRldmljZTsKKwlfX3U4IHNjc2lfaWQ7CisJc3RhdGljIGludCB1bml0ID0gMDsKKwlfX3U4IHNjc3IxID0gcmVhZGIodmFkZHIgKyBOQ1JfUTcyMF9TQ1NSX09GRlNFVCArIDEpOworCV9fdTggZGlmZmVyZW50aWFsID0gcmVhZGIodmFkZHIgKyBOQ1JfUTcyMF9TQ1NSX09GRlNFVCkgJiAweDIwOworCV9fdTggdmVyc2lvbjsKKwlpbnQgZXJyb3I7CisKKwlzY3NpX2lkID0gc2NzcjEgPj4gNDsKKwkvKiBlbmFibGUgYnVyc3QgbGVuZ3RoIDE2IChGSVhNRTogc2hvdWxkIGFsbG93IHRoaXMpICovCisJc2NzcjEgfD0gMHgwMjsKKwkvKiBmb3JjZSBhIHNpb3AgcmVzZXQgKi8KKwlzY3NyMSB8PSAweDA0OworCXdyaXRlYihzY3NyMSwgdmFkZHIgKyBOQ1JfUTcyMF9TQ1NSX09GRlNFVCArIDEpOworCXVkZWxheSgxMCk7CisJdmVyc2lvbiA9IHJlYWRiKHZhZGRyICsgMHgxOCkgPj4gNDsKKworCW1lbXNldCgmZGV2aWNlLCAwLCBzaXplb2Yoc3RydWN0IG5jcl9kZXZpY2UpKTsKKwkJLyogSW5pdGlhbGlzZSBuY3JfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGl0ZW1zIHJlcXVpcmVkIGJ5IG5jcl9hdHRhY2guICovCisJZGV2aWNlLmNoaXAJCT0gcTcyMF9jaGlwOworCWRldmljZS5jaGlwLnJldmlzaW9uX2lkCT0gdmVyc2lvbjsKKwlkZXZpY2UuaG9zdF9pZAkJPSBzY3NpX2lkOworCWRldmljZS5kZXYJCT0gcC0+ZGV2OworCWRldmljZS5zbG90LmJhc2UJPSBwYWRkcjsKKwlkZXZpY2Uuc2xvdC5iYXNlX2MJPSBwYWRkcjsKKwlkZXZpY2Uuc2xvdC5iYXNlX3YJPSB2YWRkcjsKKwlkZXZpY2Uuc2xvdC5pcnEJCT0gaXJxOworCWRldmljZS5kaWZmZXJlbnRpYWwJPSBkaWZmZXJlbnRpYWwgPyAyIDogMDsKKwlwcmludGsoIlE3MjAgcHJvYmUgdW5pdCAlZCAoc2lvcCVkKSBhdCAweCVseCwgZGlmZiA9ICVkLCB2ZXJzID0gJWRcbiIsIHVuaXQsIHNpb3AsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXBhZGRyLCBkaWZmZXJlbnRpYWwsIHZlcnNpb24pOworCisJcC0+aG9zdHNbc2lvcF0gPSBuY3JfYXR0YWNoKCZOQ1JfUTcyMF90cG50LCB1bml0KyssICZkZXZpY2UpOworCQorCWlmICghcC0+aG9zdHNbc2lvcF0pIAorCQlnb3RvIGZhaWw7CisKKwlwLT5pcnFfZW5hYmxlIHw9ICgxPDxzaW9wKTsKKwlzY3NyMSA9IHJlYWRiKHZhZGRyICsgTkNSX1E3MjBfU0NTUl9PRkZTRVQgKyAxKTsKKwkvKiBjbGVhciB0aGUgZGlzYWJsZSBpbnRlcnJ1cHQgYml0ICovCisJc2NzcjEgJj0gfjB4MDE7CisJd3JpdGViKHNjc3IxLCB2YWRkciArIE5DUl9RNzIwX1NDU1JfT0ZGU0VUICsgMSk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3QocC0+aG9zdHNbc2lvcF0sIHAtPmRldik7CisJaWYgKGVycm9yKQorCQluY3I1M2M4eHhfcmVsZWFzZShwLT5ob3N0c1tzaW9wXSk7CisJZWxzZQorCQlzY3NpX3NjYW5faG9zdChwLT5ob3N0c1tzaW9wXSk7CisJcmV0dXJuIGVycm9yOworCisgZmFpbDoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogRGV0ZWN0IGEgUTcyMCBjYXJkLiAgTm90ZSwgYmVjYXVzZSBvZiB0aGUgc2V0dXAgLS0tIHRoZSBjaGlwcyBhcmUKKyAqIGVzc2VudGlhbGx5IGNvbm5lY3RlY2QgdG8gdGhlIE1DQSBidXMgaW5kZXBlbmRlbnRseSwgaXQgaXMgZWFzaWVyCisgKiB0byBzZXQgdGhlbSB1cCBhcyB0d28gc2VwYXJhdGUgaG9zdCBhZGFwdGVycywgcmF0aGVyIHRoYW4gb25lCisgKiBhZGFwdGVyIHdpdGggdHdvIGNoYW5uZWxzICovCitzdGF0aWMgaW50IF9faW5pdAorTkNSX1E3MjBfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwOworCXN0YXRpYyBpbnQgYmFubmVyID0gMTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldiA9IHRvX21jYV9kZXZpY2UoZGV2KTsKKwlpbnQgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaXJxLCBpLCBzaW9wczsKKwlfX3U4IHBvczIsIHBvczQsIGFzcjIsIGFzcjksIGFzcjEwOworCV9fdTE2IGlvX2Jhc2U7CisJX191MzIgYmFzZV9hZGRyLCBtZW1fc2l6ZTsKKwl2b2lkIF9faW9tZW0gKm1lbV9iYXNlOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlwb3MyID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCAyKTsKKwkvKiBlbmFibGUgZGV2aWNlICovCisJcG9zMiB8PSAgTkNSX1E3MjBfUE9TMl9CT0FSRF9FTkFCTEUgfCBOQ1JfUTcyMF9QT1MyX0lOVEVSUlVQVF9FTkFCTEU7CisJbWNhX2RldmljZV93cml0ZV9wb3MobWNhX2RldiwgMiwgcG9zMik7CisKKwlpb19iYXNlID0gKHBvczIgJiBOQ1JfUTcyMF9QT1MyX0lPX01BU0spIDw8IE5DUl9RNzIwX1BPUzJfSU9fU0hJRlQ7CisKKworCWlmKGJhbm5lcikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5DUiBRNzIwOiBEcml2ZXIgVmVyc2lvbiAiIE5DUl9RNzIwX1ZFUlNJT04gIlxuIgorCQkgICAgICAgIk5DUiBRNzIwOiAgQ29weXJpZ2h0IChjKSAyMDAzIGJ5IEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb21cbiIKKwkJICAgICAgICJOQ1IgUTcyMDpcbiIpOworCQliYW5uZXIgPSAwOworCX0KKwlpb19iYXNlID0gbWNhX2RldmljZV90cmFuc2Zvcm1faW9wb3J0KG1jYV9kZXYsIGlvX2Jhc2UpOworCisJLyogT0ssIHRoaXMgaXMgcGhhc2Ugb25lIG9mIHRoZSBib290c3RyYXAsIHdlIG5vdyBrbm93IHRoZQorCSAqIEkvTyBzcGFjZSBiYXNlIGFkZHJlc3MuICBBbGwgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisJICogYXJlIG1hcHBlZCBoZXJlIChpbmNsdWRpbmcgcG9zKSAqLworCisJLyogc2FuaXR5IGNoZWNrIEkvTyBtYXBwaW5nICovCisJaSA9IGluYihpb19iYXNlKSB8IChpbmIoaW9fYmFzZSsxKTw8OCk7CisJaWYoaSAhPSBOQ1JfUTcyMF9NQ0FfSUQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOQ1JfUTcyMCwgYWRhcHRlciBmYWlsZWQgdG8gSS9PIG1hcCByZWdpc3RlcnMgY29ycmVjdGx5IGF0IDB4JXgoMHgleClcbiIsIGlvX2Jhc2UsIGkpOworCQlrZnJlZShwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogUGhhc2UgSUksIGZpbmQgdGhlIHJhbSBiYXNlIGFuZCBtZW1vcnkgbWFwIHRoZSBib2FyZCByZWdpc3RlciAqLworCXBvczQgPSBpbmIoaW9fYmFzZSArIDQpOworCS8qIGVuYWJsZSBzdHJlYW1pbmcgZGF0YSAqLworCXBvczQgfD0gMHgwMTsKKwlvdXRiKHBvczQsIGlvX2Jhc2UgKyA0KTsKKwliYXNlX2FkZHIgPSAocG9zNCAmIDB4N2UpIDw8IDIwOworCWJhc2VfYWRkciArPSAocG9zNCAmIDB4ODApIDw8IDIzOworCWFzcjEwID0gaW5iKGlvX2Jhc2UgKyAweDEyKTsKKwliYXNlX2FkZHIgKz0gKGFzcjEwICYgMHg4MCkgPDwgMjQ7CisJYmFzZV9hZGRyICs9IChhc3IxMCAmIDB4NzApIDw8IDIzOworCisJLyogT0ssIGdvdCB0aGUgYmFzZSBhZGRyLCBub3cgd2UgbmVlZCB0byBmaW5kIHRoZSByYW0gc2l6ZSwKKwkgKiBlbmFibGUgYW5kIG1hcCBpdCAqLworCWFzcjkgPSBpbmIoaW9fYmFzZSArIDB4MTEpOworCWkgPSAoYXNyOSAmIDB4YzApID4+IDY7CisJaWYoaSA9PSAwKQorCQltZW1fc2l6ZSA9IDEwMjQ7CisJZWxzZQorCQltZW1fc2l6ZSA9IDEgPDwgKDE5ICsgaSk7CisKKwkvKiBlbmFibGUgdGhlIHNyYW0gbWFwcGluZyAqLworCWFzcjkgfD0gMHgyMDsKKworCS8qIGRpc2FibGUgdGhlIHJvbSBtYXBwaW5nICovCisJYXNyOSAmPSB+MHgxMDsKKworCW91dGIoYXNyOSwgaW9fYmFzZSArIDB4MTEpOworCisJaWYoIXJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlX2FkZHIsIG1lbV9zaXplLCAiTkNSX1E3MjAiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5DUl9RNzIwOiBGYWlsZWQgdG8gY2xhaW0gbWVtb3J5IHJlZ2lvbiAweCVseFxuLTB4JWx4IiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKShiYXNlX2FkZHIgKyBtZW1fc2l6ZSkpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwkKKwlpZiAoZG1hX2RlY2xhcmVfY29oZXJlbnRfbWVtb3J5KGRldiwgYmFzZV9hZGRyLCBiYXNlX2FkZHIsCisJCQkJCW1lbV9zaXplLCBETUFfTUVNT1JZX01BUCkKKwkgICAgIT0gRE1BX01FTU9SWV9NQVApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOQ1JfUTcyMDogRE1BIGRlY2xhcmUgbWVtb3J5IGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKworCS8qIFRoZSBmaXJzdCAxayBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBpcyBhIG1lbW9yeSBtYXAgb2YgdGhlIHJlZ2lzdGVycworCSAqLworCW1lbV9iYXNlID0gZG1hX21hcmtfZGVjbGFyZWRfbWVtb3J5X29jY3VwaWVkKGRldiwgYmFzZV9hZGRyLAorCQkJCQkJCSAgICAxMDI0KTsKKwlpZiAoSVNfRVJSKG1lbV9iYXNlKSkgeworCQlwcmludGsoIk5DUl9RNzIwIGZhaWxlZCB0byByZXNlcnZlIG1lbW9yeSBtYXBwZWQgcmVnaW9uXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwkvKiBub3cgYWxzbyBlbmFibGUgYWNjZXNzZXMgaW4gYXNyIDIgKi8KKwlhc3IyID0gaW5iKGlvX2Jhc2UgKyAweDBhKTsKKworCWFzcjIgfD0gMHgwMTsKKworCW91dGIoYXNyMiwgaW9fYmFzZSArIDB4MGEpOworCisJLyogZ2V0IHRoZSBudW1iZXIgb2YgU0lPUHMgKHRoaXMgc2hvdWxkIGJlIDIgb3IgNCkgKi8KKwlzaW9wcyA9ICgoYXNyMiAmIDB4ZTApID4+IDUpICsgMTsKKworCS8qIHNhbml0eSBjaGVjayBtYXBwaW5nIChhZ2FpbikgKi8KKwlpID0gcmVhZHcobWVtX2Jhc2UpOworCWlmKGkgIT0gTkNSX1E3MjBfTUNBX0lEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkNSX1E3MjAsIGFkYXB0ZXIgZmFpbGVkIHRvIG1lbW9yeSBtYXAgcmVnaXN0ZXJzIGNvcnJlY3RseSBhdCAweCVseCgweCV4KVxuIiwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLCBpKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlpcnEgPSByZWFkYihtZW1fYmFzZSArIDUpICYgMHgwZjsKKwkKKwkKKwkvKiBub3cgZG8gdGhlIGJ1cyByZWxhdGVkIHRyYW5zZm9ybXMgKi8KKwlpcnEgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pcnEobWNhX2RldiwgaXJxKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiTkNSIFE3MjA6IGZvdW5kIGluIHNsb3QgJWQgIGlycSA9ICVkICBtZW0gYmFzZSA9IDB4JWx4IHNpb3BzID0gJWRcbiIsIHNsb3QsIGlycSwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLCBzaW9wcyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJOQ1IgUTcyMDogT24gYm9hcmQgcmFtICVka1xuIiwgbWVtX3NpemUvMTAyNCk7CisKKwlwLT5kZXYgPSBkZXY7CisJcC0+bWVtX2Jhc2UgPSBtZW1fYmFzZTsKKwlwLT5waHlzX21lbV9iYXNlID0gYmFzZV9hZGRyOworCXAtPm1lbV9zaXplID0gbWVtX3NpemU7CisJcC0+aXJxID0gaXJxOworCXAtPnNpb3BzID0gc2lvcHM7CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBOQ1JfUTcyMF9pbnRyLCBTQV9TSElSUSwgIk5DUl9RNzIwIiwgcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOQ1JfUTcyMDogcmVxdWVzdCBpcnEgJWQgZmFpbGVkXG4iLCBpcnEpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwkvKiBkaXNhYmxlIGFsbCB0aGUgc2lvcCBpbnRlcnJ1cHRzICovCisJZm9yKGkgPSAwOyBpIDwgc2lvcHM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnJlZ19zY3NyMSA9IG1lbV9iYXNlICsgTkNSX1E3MjBfQ0hJUF9SRUdJU1RFUl9PRkZTRVQKKwkJCSsgaSpOQ1JfUTcyMF9TSU9QX1NISUZUICsgTkNSX1E3MjBfU0NTUl9PRkZTRVQgKyAxOworCQlfX3U4IHNjc3IxID0gcmVhZGIocmVnX3Njc3IxKTsKKwkJc2NzcjEgfD0gMHgwMTsKKwkJd3JpdGViKHNjc3IxLCByZWdfc2NzcjEpOworCX0KKworCS8qIHBsdW1iIGluIGFsbCA3MjAgY2hpcHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2lvcHM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnNpb3Bfdl9iYXNlID0gbWVtX2Jhc2UgKyBOQ1JfUTcyMF9DSElQX1JFR0lTVEVSX09GRlNFVAorCQkJKyBpKk5DUl9RNzIwX1NJT1BfU0hJRlQ7CisJCV9fdTMyIHNpb3BfcF9iYXNlID0gYmFzZV9hZGRyICsgTkNSX1E3MjBfQ0hJUF9SRUdJU1RFUl9PRkZTRVQKKwkJCSsgaSpOQ1JfUTcyMF9TSU9QX1NISUZUOworCQlfX3UxNiBwb3J0ID0gaW9fYmFzZSArIE5DUl9RNzIwX0NISVBfUkVHSVNURVJfT0ZGU0VUCisJCQkrIGkqTkNSX1E3MjBfU0lPUF9TSElGVDsKKwkJaW50IGVycjsKKworCQlvdXRiKDB4ZmYsIHBvcnQgKyAweDQwKTsKKwkJb3V0YigweDA3LCBwb3J0ICsgMHg0MSk7CisJCWlmICgoZXJyID0gTkNSX1E3MjBfcHJvYmVfb25lKHAsIGksIGlycSwgc2xvdCwKKwkJCQkJICAgICAgc2lvcF9wX2Jhc2UsIHNpb3Bfdl9iYXNlKSkgIT0gMCkKKwkJCXByaW50aygiUTcyMDogU0lPUCVkOiBwcm9iZSBmYWlsZWQsIGVycm9yID0gJWRcbiIsCisJCQkgICAgICAgaSwgZXJyKTsKKwkJZWxzZQorCQkJZm91bmQrKzsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCWtmcmVlKHApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltY2FfZGV2aWNlX3NldF9jbGFpbShtY2FfZGV2LCAxKTsKKwltY2FfZGV2aWNlX3NldF9uYW1lKG1jYV9kZXYsICJOQ1JfUTcyMCIpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHApOworCisJcmV0dXJuIDA7CisKKyBvdXRfcmVsZWFzZToKKwlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoZGV2KTsKKyBvdXRfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2VfYWRkciwgbWVtX3NpemUpOworIG91dF9mcmVlOgorCWtmcmVlKHApOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorTkNSX1E3MjBfcmVtb3ZlX29uZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisJbmNyNTNjOHh4X3JlbGVhc2UoaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0CitOQ1JfUTcyMF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBOQ1JfUTcyMF9wcml2YXRlICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcC0+c2lvcHM7IGkrKykKKwkJaWYocC0+aG9zdHNbaV0pCisJCQlOQ1JfUTcyMF9yZW1vdmVfb25lKHAtPmhvc3RzW2ldKTsKKworCWRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeShkZXYpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwLT5waHlzX21lbV9iYXNlLCBwLT5tZW1fc2l6ZSk7CisJZnJlZV9pcnEocC0+aXJxLCBwKTsKKwlrZnJlZShwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNob3J0IE5DUl9RNzIwX2lkX3RhYmxlW10gPSB7IE5DUl9RNzIwX01DQV9JRCwgMCB9OworCitzdGF0aWMgc3RydWN0IG1jYV9kcml2ZXIgTkNSX1E3MjBfZHJpdmVyID0geworCS5pZF90YWJsZSA9IE5DUl9RNzIwX2lkX3RhYmxlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJOQ1JfUTcyMCIsCisJCS5idXMJCT0gJm1jYV9idXNfdHlwZSwKKwkJLnByb2JlCQk9IE5DUl9RNzIwX3Byb2JlLAorCQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKE5DUl9RNzIwX3JlbW92ZSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitOQ1JfUTcyMF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG5jcjUzYzh4eF9pbml0KCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG1jYV9yZWdpc3Rlcl9kcml2ZXIoJk5DUl9RNzIwX2RyaXZlcik7CisJaWYgKHJldCkKKwkJbmNyNTNjOHh4X2V4aXQoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK05DUl9RNzIwX2V4aXQodm9pZCkKK3sKKwltY2FfdW5yZWdpc3Rlcl9kcml2ZXIoJk5DUl9RNzIwX2RyaXZlcik7CisJbmNyNTNjOHh4X2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoTkNSX1E3MjBfaW5pdCk7Cittb2R1bGVfZXhpdChOQ1JfUTcyMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1JfUTcyMC5oIGIvZHJpdmVycy9zY3NpL05DUl9RNzIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5MjA5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1JfUTcyMC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KKworLyogTkNSIFF1YWQgNzIwIE1DQSBTQ1NJIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCisgKi8KKworI2lmbmRlZiBfTkNSX1E3MjBfSAorI2RlZmluZSBfTkNSX1E3MjBfSAorCisvKiBUaGUgTUNBIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgTkNSX1E3MjBfTUNBX0lECQkweDA3MjAKKworI2RlZmluZSBOQ1JfUTcyMF9DTE9DS19NSFoJMzAKKworI2RlZmluZSBOQ1JfUTcyMF9QT1MyX0JPQVJEX0VOQUJMRQkweDAxCisjZGVmaW5lIE5DUl9RNzIwX1BPUzJfSU5URVJSVVBUX0VOQUJMRQkweDAyCisjZGVmaW5lIE5DUl9RNzIwX1BPUzJfUEFSSVRZX0RJU0FCTEUJMHgwNAorI2RlZmluZSBOQ1JfUTcyMF9QT1MyX0lPX01BU0sJCTB4ZjgKKyNkZWZpbmUgTkNSX1E3MjBfUE9TMl9JT19TSElGVAkJOAorCisjZGVmaW5lIE5DUl9RNzIwX0NISVBfUkVHSVNURVJfT0ZGU0VUCTB4MjAwCisjZGVmaW5lIE5DUl9RNzIwX1NDU1JfT0ZGU0VUCQkweDA3MAorI2RlZmluZSBOQ1JfUTcyMF9TSU9QX1NISUZUCQkweDA4MAorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5jIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ0MDNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpAQCAtMCwwICsxLDEyMDIgQEAKKy8qCisgKiBJbml0aW8gQTEwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OCBJbml0aW8gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IENocmlzdG9waCBIZWxsd2lnCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogV2hlcmUgdGhpcyBTb2Z0d2FyZSBpcyBjb21iaW5lZCB3aXRoIHNvZnR3YXJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFuZCB0aGUgdGVybXMgb2YgdGhlIEdQTCB3b3VsZCByZXF1aXJlIHRoZSAKKyAqIGNvbWJpbmVkIHdvcmsgdG8gYWxzbyBiZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCwgdGhlIHRlcm1zCisgKiBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2Ugd2lsbCBhcHBseSBpbiBhZGRpdGlvbiB0byB0aG9zZSBvZiB0aGUKKyAqIEdQTCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHRoYXQKKyAqIGNvbmZsaWN0IHdpdGgsIG9yIGFyZSBleHByZXNzbHkgcHJvaGliaXRlZCBieSwgdGhlIEdQTC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBSZXZpc2lvbiBIaXN0b3J5OgorICogMDcvMDIvOTggaGwJLSB2LjkxbiBJbml0aWFsIGRyaXZlcnMuCisgKiAwOS8xNC85OCBobCAtIHYxLjAxIFN1cHBvcnQgbmV3IEtlcm5lbC4KKyAqIDA5LzIyLzk4IGhsIC0gdjEuMDFhIFN1cHBvcnQgcmVzZXQuCisgKiAwOS8yNC85OCBobCAtIHYxLjAxYiBGaXhlZCByZXNldC4KKyAqIDEwLzA1Lzk4IGhsIC0gdjEuMDIgc3BsaXQgdGhlIHNvdXJjZSBjb2RlIGFuZCByZWxlYXNlLgorICogMTIvMTkvOTggYnYgLSB2MS4wMmEgVXNlIHNwaW5sb2NrcyBmb3IgMi4xLjk1IGFuZCB1cAorICogMDEvMzEvOTkgYnYgLSB2MS4wMmIgVXNlIG1kZWxheSBpbnN0ZWFkIG9mIHdhaXRGb3JQYXVzZQorICogMDgvMDgvOTkgYnYgLSB2MS4wMmMgVXNlIHdhaXRGb3JQYXVzZSBhZ2Fpbi4KKyAqIDA2LzI1LzAyIERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4gLSB2MS4wMmQKKyAqICAgICAgICAgIC0gUmVtb3ZlIGxpbWl0IG9uIG51bWJlciBvZiBjb250cm9sbGVycworICogICAgICAgICAgLSBQb3J0IHRvIERNQSBtYXBwaW5nIEFQSQorICogICAgICAgICAgLSBDbGVhbiB1cCBpbnRlcnJ1cHQgaGFuZGxlciByZWdpc3RyYXRpb24KKyAqICAgICAgICAgIC0gRml4IG1lbW9yeSBsZWFrcworICogICAgICAgICAgLSBGaXggYWxsb2NhdGlvbiBvZiBzY3NpIGhvc3Qgc3RydWN0cyBhbmQgcHJpdmF0ZSBkYXRhCisgKiAxMS8xOC8wMyBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KKyAqCSAgICAtIFBvcnQgdG8gbmV3IHByb2JpbmcgQVBJCisgKgkgICAgLSBGaXggc29tZSBtb3JlIGxlYWtzIGluIGluaXQgZmFpbHVyZSBjYXNlcworICogOS8yOC8wNCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KKyAqCSAgICAtIG1lcmdlIHRoZSB0d28gc291cmNlIGZpbGVzCisgKgkgICAgLSByZW1vdmUgaW50ZXJuYWwgcXVldWVpbmcgY29kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImExMDB1MncuaCIKKworCisjZGVmaW5lIEpJRkZJRVNfVE9fTVModCkgKCh0KSAqIDEwMDAgLyBIWikKKyNkZWZpbmUgTVNfVE9fSklGRklFUyhqKSAoKGogKiBIWikgLyAxMDAwKQorCitzdGF0aWMgT1JDX1NDQiAqb3JjX2FsbG9jX3NjYihPUkNfSENTICogaGNzcCk7CitzdGF0aWMgdm9pZCBpbmlhMTAwU0NCUG9zdChCWVRFICogcEhjYiwgQllURSAqIHBTY2IpOworCitzdGF0aWMgTlZSQU0gbnZyYW0sICpudnJhbXAgPSAmbnZyYW07CitzdGF0aWMgVUNIQVIgZGZ0TnZSYW1bNjRdID0KK3sKKy8qLS0tLS0tLS0tLWhlYWRlciAtLS0tLS0tLS0tLS0tKi8KKwkweDAxLAkJCS8qIDB4MDA6IFN1YiBTeXN0ZW0gVmVuZG9yIElEIDAgKi8KKwkweDExLAkJCS8qIDB4MDE6IFN1YiBTeXN0ZW0gVmVuZG9yIElEIDEgKi8KKwkweDYwLAkJCS8qIDB4MDI6IFN1YiBTeXN0ZW0gSUQgMCAgICAgICAgKi8KKwkweDEwLAkJCS8qIDB4MDM6IFN1YiBTeXN0ZW0gSUQgMSAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4MDQ6IFN1YkNsYXNzICAgICAgICAgICAgICAgKi8KKwkweDAxLAkJCS8qIDB4MDU6IFZlbmRvciBJRCAwICAgICAgICAgICAgKi8KKwkweDExLAkJCS8qIDB4MDY6IFZlbmRvciBJRCAxICAgICAgICAgICAgKi8KKwkweDYwLAkJCS8qIDB4MDc6IERldmljZSBJRCAwICAgICAgICAgICAgKi8KKwkweDEwLAkJCS8qIDB4MDg6IERldmljZSBJRCAxICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4MDk6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4MEE6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAxLAkJCS8qIDB4MEI6IFJldmlzaW9uIG9mIERhdGEgU3RydWN0dXJlICAgICAqLworCQkJCS8qIC0tIEhvc3QgQWRhcHRlciBTdHJ1Y3R1cmUgLS0tICovCisJMHgwMSwJCQkvKiAweDBDOiBOdW1iZXIgT2YgU0NTSSBDaGFubmVsICovCisJMHgwMSwJCQkvKiAweDBEOiBCSU9TIENvbmZpZ3VyYXRpb24gMSAgICovCisJMHgwMCwJCQkvKiAweDBFOiBCSU9TIENvbmZpZ3VyYXRpb24gMiAgICovCisJMHgwMCwJCQkvKiAweDBGOiBCSU9TIENvbmZpZ3VyYXRpb24gMyAgICovCisJCQkJLyogLS0tIFNDU0kgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gLS0tICovCisJMHgwNywJCQkvKiAweDEwOiBIL0EgSUQgICAgICAgICAgICAgICAgICovCisJMHg4MywJCQkvKiAweDExOiBDaGFubmVsIENvbmZpZ3VyYXRpb24gICovCisJMHgyMCwJCQkvKiAweDEyOiBNQVggVEFHIHBlciB0YXJnZXQgICAgICovCisJMHgwQSwJCQkvKiAweDEzOiBTQ1NJIFJlc2V0IFJlY292ZXJpbmcgdGltZSAgICAgKi8KKwkweDAwLAkJCS8qIDB4MTQ6IENoYW5uZWwgQ29uZmlndXJhdGlvbjQgKi8KKwkweDAwLAkJCS8qIDB4MTU6IENoYW5uZWwgQ29uZmlndXJhdGlvbjUgKi8KKwkJCQkvKiBTQ1NJIENoYW5uZWwgMCBUYXJnZXQgQ29uZmlndXJhdGlvbiAgKi8KKwkJCQkvKiAweDE2LTB4MjUgICAgICAgICAgICAgICAgICAgICovCisJMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwKKwkweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LCAweEM4LAorCQkJCS8qIC0tLSBTQ1NJIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIC0tLSAqLworCTB4MDcsCQkJLyogMHgyNjogSC9BIElEICAgICAgICAgICAgICAgICAqLworCTB4ODMsCQkJLyogMHgyNzogQ2hhbm5lbCBDb25maWd1cmF0aW9uICAqLworCTB4MjAsCQkJLyogMHgyODogTUFYIFRBRyBwZXIgdGFyZ2V0ICAgICAqLworCTB4MEEsCQkJLyogMHgyOTogU0NTSSBSZXNldCBSZWNvdmVyaW5nIHRpbWUgICAgICovCisJMHgwMCwJCQkvKiAweDJBOiBDaGFubmVsIENvbmZpZ3VyYXRpb240ICovCisJMHgwMCwJCQkvKiAweDJCOiBDaGFubmVsIENvbmZpZ3VyYXRpb241ICovCisJCQkJLyogU0NTSSBDaGFubmVsIDEgVGFyZ2V0IENvbmZpZ3VyYXRpb24gICovCisJCQkJLyogMHgyQy0weDNCICAgICAgICAgICAgICAgICAgICAqLworCTB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsIDB4QzgsCisJMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwgMHhDOCwKKwkweDAwLAkJCS8qIDB4M0M6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4M0Q6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwLAkJCS8qIDB4M0U6IFJlc2VydmVkICAgICAgICAgICAgICAgKi8KKwkweDAwCQkJLyogMHgzRjogQ2hlY2tzdW0gICAgICAgICAgICAgICAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdEZvclBhdXNlKHVuc2lnbmVkIGFtb3VudCkKK3sKKwlVTE9ORyB0aGVfdGltZSA9IGppZmZpZXMgKyBNU19UT19KSUZGSUVTKGFtb3VudCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHRoZV90aW1lKSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgd2FpdENoaXBSZWFkeShPUkNfSENTICogaGNzcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CS8qIFdhaXQgMSBzZWNvbmQgZm9yIHJlcG9ydCB0aW1lb3V0ICAgICAqLworCQlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSENUUkwpICYgSE9TVFNUT1ApCS8qIFdhaXQgSE9TVFNUT1Agc2V0ICovCisJCQlyZXR1cm4gMTsKKwkJd2FpdEZvclBhdXNlKDEwMCk7CS8qIHdhaXQgMTAwbXMgYmVmb3JlIHRyeSBhZ2FpbiAgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgd2FpdEZXUmVhZHkoT1JDX0hDUyAqIGhjc3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBXYWl0IDEgc2Vjb25kIGZvciByZXBvcnQgdGltZW91dCAgICAgKi8KKwkJaWYgKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0hTVFVTKSAmIFJSRUFEWSkJCS8qIFdhaXQgUkVBRFkgc2V0ICovCisJCQlyZXR1cm4gMTsKKwkJd2FpdEZvclBhdXNlKDEwMCk7CS8qIHdhaXQgMTAwbXMgYmVmb3JlIHRyeSBhZ2FpbiAgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgd2FpdFNDU0lSU1Rkb25lKE9SQ19IQ1MgKiBoY3NwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsJLyogV2FpdCAxIHNlY29uZCBmb3IgcmVwb3J0IHRpbWVvdXQgICAgICovCisJCWlmICghKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0hDVFJMKSAmIFNDU0lSU1QpKQkvKiBXYWl0IFNDU0lSU1QgZG9uZSAqLworCQkJcmV0dXJuIDE7CisJCXdhaXRGb3JQYXVzZSgxMDApOwkvKiB3YWl0IDEwMG1zIGJlZm9yZSB0cnkgYWdhaW4gICovCisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIHdhaXRIRE9vZmYoT1JDX0hDUyAqIGhjc3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBXYWl0IDEgc2Vjb25kIGZvciByZXBvcnQgdGltZW91dCAgICAgKi8KKwkJaWYgKCEoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSENUUkwpICYgSERPKSkJCS8qIFdhaXQgSERPIG9mZiAqLworCQkJcmV0dXJuIDE7CisJCXdhaXRGb3JQYXVzZSgxMDApOwkvKiB3YWl0IDEwMG1zIGJlZm9yZSB0cnkgYWdhaW4gICovCisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIHdhaXRIRElzZXQoT1JDX0hDUyAqIGhjc3AsIFVDSEFSICogcERhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBXYWl0IDEgc2Vjb25kIGZvciByZXBvcnQgdGltZW91dCAgICAgKi8KKwkJaWYgKCgqcERhdGEgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19IU1RVUykpICYgSERJKQorCQkJcmV0dXJuIDE7CS8qIFdhaXQgSERJIHNldCAqLworCQl3YWl0Rm9yUGF1c2UoMTAwKTsJLyogd2FpdCAxMDBtcyBiZWZvcmUgdHJ5IGFnYWluICAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBnZXRfRldfdmVyc2lvbihPUkNfSENTICogaGNzcCkKK3sKKwlVQ0hBUiBiRGF0YTsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0IHNWZXJzaW9uOworCQl1bnNpZ25lZCBjaGFyIGNWZXJzaW9uWzJdOworCX0gVmVyc2lvbjsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgT1JDX0NNRF9WRVJTSU9OKTsKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAod2FpdEhESXNldChoY3NwLCAmYkRhdGEpID09IDApCS8qIFdhaXQgSERJIHNldCAgICovCisJCXJldHVybiAwOworCVZlcnNpb24uY1ZlcnNpb25bMF0gPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19IREFUQSk7CisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hTVFVTLCBiRGF0YSk7CS8qIENsZWFyIEhESSAgICAgICAgICAgICovCisKKwlpZiAod2FpdEhESXNldChoY3NwLCAmYkRhdGEpID09IDApCS8qIFdhaXQgSERJIHNldCAgICovCisJCXJldHVybiAwOworCVZlcnNpb24uY1ZlcnNpb25bMV0gPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19IREFUQSk7CisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hTVFVTLCBiRGF0YSk7CS8qIENsZWFyIEhESSAgICAgICAgICAgICovCisKKwlyZXR1cm4gKFZlcnNpb24uc1ZlcnNpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIHNldF9OVlJBTShPUkNfSENTICogaGNzcCwgdW5zaWduZWQgY2hhciBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgT1JDX0NNRF9TRVRfTlZNKTsJLyogV3JpdGUgY29tbWFuZCAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IQ1RSTCwgSERPKTsKKwlpZiAod2FpdEhET29mZihoY3NwKSA9PSAwKQkvKiBXYWl0IEhETyBvZmYgICAqLworCQlyZXR1cm4gMDsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgYWRkcmVzcyk7CS8qIFdyaXRlIGFkZHJlc3MgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSERBVEEsIHZhbHVlKTsJLyogV3JpdGUgdmFsdWUgICovCisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hDVFJMLCBIRE8pOworCWlmICh3YWl0SERPb2ZmKGhjc3ApID09IDApCS8qIFdhaXQgSERPIG9mZiAgICovCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgZ2V0X05WUkFNKE9SQ19IQ1MgKiBoY3NwLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgKnBEYXRhSW4pCit7CisJdW5zaWduZWQgY2hhciBiRGF0YTsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgT1JDX0NNRF9HRVRfTlZNKTsJLyogV3JpdGUgY29tbWFuZCAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IQ1RSTCwgSERPKTsKKwlpZiAod2FpdEhET29mZihoY3NwKSA9PSAwKQkvKiBXYWl0IEhETyBvZmYgICAqLworCQlyZXR1cm4gMDsKKworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IREFUQSwgYWRkcmVzcyk7CS8qIFdyaXRlIGFkZHJlc3MgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAod2FpdEhESXNldChoY3NwLCAmYkRhdGEpID09IDApCS8qIFdhaXQgSERJIHNldCAgICovCisJCXJldHVybiAwOworCSpwRGF0YUluID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSERBVEEpOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IU1RVUywgYkRhdGEpOwkvKiBDbGVhciBIREkgICAgKi8KKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgb3JjX2V4ZWNfc2NiKE9SQ19IQ1MgKiBoY3NwLCBPUkNfU0NCICogc2NicCkKK3sKKwlzY2JwLT5TQ0JfU3RhdHVzID0gT1JDU0NCX1BPU1Q7CisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX1BRVUVVRSwgc2NicC0+U0NCX1NjYklkeCk7CisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFJlYWQgU0NTSSBIL0EgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZyb20gc2VyaWFsIEVFUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzZTJfcmRfYWxsKE9SQ19IQ1MgKiBoY3NwKQoreworCWludCBpOworCVVDSEFSICpucCwgY2hrc3VtID0gMDsKKworCW5wID0gKFVDSEFSICopIG52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgbnArKykgewkvKiA8MDE+ICovCisJCWlmIChnZXRfTlZSQU0oaGNzcCwgKHVuc2lnbmVkIGNoYXIpIGksIG5wKSA9PSAwKQorCQkJcmV0dXJuIC0xOworLy8gICAgICAqbnArKyA9IGdldF9OVlJBTShoY3NwLCAodW5zaWduZWQgY2hhciApIGkpOworCX0KKworLyotLS0tLS0gSXMgY2tlY2tzdW0gb2sgPyAtLS0tLS0qLworCW5wID0gKFVDSEFSICopIG52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykKKwkJY2hrc3VtICs9ICpucCsrOworCisJaWYgKG52cmFtcC0+Q2hlY2tTdW0gIT0gKFVDSEFSKSBjaGtzdW0pCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFVwZGF0ZSBTQ1NJIEgvQSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZnJvbSBzZXJpYWwgRUVQUk9NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2UyX3VwZGF0ZV9hbGwoT1JDX0hDUyAqIGhjc3ApCit7CQkJCS8qIHNldHVwIGRlZmF1bHQgcGF0dGVybiAgKi8KKwlpbnQgaTsKKwlVQ0hBUiAqbnAsICpucDEsIGNoa3N1bSA9IDA7CisKKwkvKiBDYWxjdWxhdGUgY2hlY2tzdW0gZmlyc3QgICAqLworCW5wID0gKFVDSEFSICopIGRmdE52UmFtOworCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKQorCQljaGtzdW0gKz0gKm5wKys7CisJKm5wID0gY2hrc3VtOworCisJbnAgPSAoVUNIQVIgKikgZGZ0TnZSYW07CisJbnAxID0gKFVDSEFSICopIG52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgbnArKywgbnAxKyspIHsKKwkJaWYgKCpucCAhPSAqbnAxKSB7CisJCQlzZXRfTlZSQU0oaGNzcCwgKHVuc2lnbmVkIGNoYXIpIGksICpucCk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uIG5hbWUgIDogcmVhZF9lZXByb20KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmVhZF9lZXByb20oT1JDX0hDUyAqIGhjc3ApCit7CisJaWYgKHNlMl9yZF9hbGwoaGNzcCkgIT0gMSkgeworCQlzZTJfdXBkYXRlX2FsbChoY3NwKTsJLyogc2V0dXAgZGVmYXVsdCBwYXR0ZXJuICAgICAgICAqLworCQlzZTJfcmRfYWxsKGhjc3ApOwkvKiBsb2FkIGFnYWluICAgICAgICAgICAgICAgICAgICovCisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgbG9hZF9GVyhPUkNfSENTICogaGNzcCkKK3sKKwlVMzIgZERhdGE7CisJVVNIT1JUIHdCSU9TQWRkcmVzczsKKwlVU0hPUlQgaTsKKwlVQ0hBUiAqcERhdGEsIGJEYXRhOworCisKKwliRGF0YSA9IE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0dDRkcpOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HQ0ZHLCBiRGF0YSB8IEVFUFJHKTsJLyogRW5hYmxlIEVFUFJPTSBwcm9ncmFtbWluZyAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjIsIDB4MDApOworCU9SQ19XUlNIT1JUKGhjc3AtPkhDU19CYXNlICsgT1JDX0VCSU9TQURSMCwgMHgwMCk7CisJaWYgKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0VCSU9TREFUQSkgIT0gMHg1NSkgeworCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfR0NGRywgYkRhdGEpOwkvKiBEaXNhYmxlIEVFUFJPTSBwcm9ncmFtbWluZyAqLworCQlyZXR1cm4gMDsKKwl9CisJT1JDX1dSU0hPUlQoaGNzcC0+SENTX0Jhc2UgKyBPUkNfRUJJT1NBRFIwLCAweDAxKTsKKwlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfRUJJT1NEQVRBKSAhPSAweEFBKSB7CisJCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HQ0ZHLCBiRGF0YSk7CS8qIERpc2FibGUgRUVQUk9NIHByb2dyYW1taW5nICovCisJCXJldHVybiAwOworCX0KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfUklTQ0NUTCwgUFJHTVJTVCB8IERPV05MT0FEKTsJLyogRW5hYmxlIFNSQU0gcHJvZ3JhbW1pbmcgKi8KKwlwRGF0YSA9IChVQ0hBUiAqKSAmIGREYXRhOworCWREYXRhID0gMDsJCS8qIEluaXRpYWwgRlcgYWRkcmVzcyB0byAwICovCisJT1JDX1dSU0hPUlQoaGNzcC0+SENTX0Jhc2UgKyBPUkNfRUJJT1NBRFIwLCAweDEwKTsKKwkqcERhdGEgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19FQklPU0RBVEEpOwkJLyogUmVhZCBmcm9tIEJJT1MgKi8KKwlPUkNfV1JTSE9SVChoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjAsIDB4MTEpOworCSoocERhdGEgKyAxKSA9IE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX0VCSU9TREFUQSk7CS8qIFJlYWQgZnJvbSBCSU9TICovCisJT1JDX1dSU0hPUlQoaGNzcC0+SENTX0Jhc2UgKyBPUkNfRUJJT1NBRFIwLCAweDEyKTsKKwkqKHBEYXRhICsgMikgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19FQklPU0RBVEEpOwkvKiBSZWFkIGZyb20gQklPUyAqLworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjIsICoocERhdGEgKyAyKSk7CisJT1JDX1dSTE9ORyhoY3NwLT5IQ1NfQmFzZSArIE9SQ19GV0JBU0VBRFIsIGREYXRhKTsJLyogV3JpdGUgRlcgYWRkcmVzcyAqLworCisJd0JJT1NBZGRyZXNzID0gKFVTSE9SVCkgZERhdGE7CS8qIEZXIGNvZGUgbG9jYXRlIGF0IEJJT1MgYWRkcmVzcyArID8gKi8KKwlmb3IgKGkgPSAwLCBwRGF0YSA9IChVQ0hBUiAqKSAmIGREYXRhOwkvKiBEb3dubG9hZCB0aGUgY29kZSAgICAqLworCSAgICAgaSA8IDB4MTAwMDsJLyogRmlybXdhcmUgY29kZSBzaXplID0gNEsgICAgICAqLworCSAgICAgaSsrLCB3QklPU0FkZHJlc3MrKykgeworCQlPUkNfV1JTSE9SVChoY3NwLT5IQ1NfQmFzZSArIE9SQ19FQklPU0FEUjAsIHdCSU9TQWRkcmVzcyk7CisJCSpwRGF0YSsrID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfRUJJT1NEQVRBKTsJLyogUmVhZCBmcm9tIEJJT1MgKi8KKwkJaWYgKChpICUgNCkgPT0gMykgeworCQkJT1JDX1dSTE9ORyhoY3NwLT5IQ1NfQmFzZSArIE9SQ19SSVNDUkFNLCBkRGF0YSk7CS8qIFdyaXRlIGV2ZXJ5IDQgYnl0ZXMgKi8KKwkJCXBEYXRhID0gKFVDSEFSICopICYgZERhdGE7CisJCX0KKwl9CisKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfUklTQ0NUTCwgUFJHTVJTVCB8IERPV05MT0FEKTsJLyogUmVzZXQgcHJvZ3JhbSBjb3VudCAwICovCisJd0JJT1NBZGRyZXNzIC09IDB4MTAwMDsJLyogUmVzZXQgdGhlIEJJT1MgYWRkZHJlc3MgICAgICAqLworCWZvciAoaSA9IDAsIHBEYXRhID0gKFVDSEFSICopICYgZERhdGE7CS8qIENoZWNrIHRoZSBjb2RlICAgICAgICovCisJICAgICBpIDwgMHgxMDAwOwkvKiBGaXJtd2FyZSBjb2RlIHNpemUgPSA0SyAgICAgICovCisJICAgICBpKyssIHdCSU9TQWRkcmVzcysrKSB7CisJCU9SQ19XUlNIT1JUKGhjc3AtPkhDU19CYXNlICsgT1JDX0VCSU9TQURSMCwgd0JJT1NBZGRyZXNzKTsKKwkJKnBEYXRhKysgPSBPUkNfUkQoaGNzcC0+SENTX0Jhc2UsIE9SQ19FQklPU0RBVEEpOwkvKiBSZWFkIGZyb20gQklPUyAqLworCQlpZiAoKGkgJSA0KSA9PSAzKSB7CisJCQlpZiAoT1JDX1JETE9ORyhoY3NwLT5IQ1NfQmFzZSwgT1JDX1JJU0NSQU0pICE9IGREYXRhKSB7CisJCQkJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX1JJU0NDVEwsIFBSR01SU1QpOwkvKiBSZXNldCBwcm9ncmFtIHRvIDAgKi8KKwkJCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfR0NGRywgYkRhdGEpOwkvKkRpc2FibGUgRUVQUk9NIHByb2dyYW1taW5nICovCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwRGF0YSA9IChVQ0hBUiAqKSAmIGREYXRhOworCQl9CisJfQorCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19SSVNDQ1RMLCBQUkdNUlNUKTsJLyogUmVzZXQgcHJvZ3JhbSB0byAwICAgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfR0NGRywgYkRhdGEpOwkvKiBEaXNhYmxlIEVFUFJPTSBwcm9ncmFtbWluZyAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2V0dXBfU0NCcyhPUkNfSENTICogaGNzcCkKK3sKKwlPUkNfU0NCICpwVmlyU2NiOworCWludCBpOworCUVTQ0IgKnBWaXJFc2NiOworCWRtYV9hZGRyX3QgcFBoeXNFc2NiOworCisJLyogU2V0dXAgU0NCIEhDU19CYXNlIGFuZCBTQ0IgU2l6ZSByZWdpc3RlcnMgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfU0NCU0laRSwgT1JDX01BWFFVRVVFKTsJLyogVG90YWwgbnVtYmVyIG9mIFNDQnMgKi8KKwkvKiBTQ0IgSENTX0Jhc2UgYWRkcmVzcyAwICAgICAgKi8KKwlPUkNfV1JMT05HKGhjc3AtPkhDU19CYXNlICsgT1JDX1NDQkJBU0UwLCBoY3NwLT5IQ1NfcGh5c1NjYkFycmF5KTsKKwkvKiBTQ0IgSENTX0Jhc2UgYWRkcmVzcyAxICAgICAgKi8KKwlPUkNfV1JMT05HKGhjc3AtPkhDU19CYXNlICsgT1JDX1NDQkJBU0UxLCBoY3NwLT5IQ1NfcGh5c1NjYkFycmF5KTsKKworCS8qIHNldHVwIHNjYXR0ZXIgbGlzdCBhZGRyZXNzIHdpdGggb25lIGJ1ZmZlciAqLworCXBWaXJTY2IgPSBoY3NwLT5IQ1NfdmlyU2NiQXJyYXk7CisJcFZpckVzY2IgPSBoY3NwLT5IQ1NfdmlyRXNjYkFycmF5OworCisJZm9yIChpID0gMDsgaSA8IE9SQ19NQVhRVUVVRTsgaSsrKSB7CisJCXBQaHlzRXNjYiA9IChoY3NwLT5IQ1NfcGh5c0VzY2JBcnJheSArIChzaXplb2YoRVNDQikgKiBpKSk7CisJCXBWaXJTY2ItPlNDQl9TR1BBZGRyID0gKFUzMikgcFBoeXNFc2NiOworCQlwVmlyU2NiLT5TQ0JfU2Vuc2VQQWRkciA9IChVMzIpIHBQaHlzRXNjYjsKKwkJcFZpclNjYi0+U0NCX0VTY2IgPSBwVmlyRXNjYjsKKwkJcFZpclNjYi0+U0NCX1NjYklkeCA9IGk7CisJCXBWaXJTY2IrKzsKKwkJcFZpckVzY2IrKzsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbml0QUZsYWcoT1JDX0hDUyAqIGhjc3ApCit7CisJVUNIQVIgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQloY3NwLT5CaXRBbGxvY0ZsYWdbaV1bal0gPSAweGZmZmZmZmZmOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0X29yY2hpZChPUkNfSENTICogaGNzcCkKK3sKKwlVQllURSAqcmVhZEJ5dGVwOworCVVTSE9SVCByZXZpc2lvbjsKKwlVQ0hBUiBpOworCisJaW5pdEFGbGFnKGhjc3ApOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HSU1TSywgMHhGRik7CS8qIERpc2FibGUgYWxsIGludGVycnVwdCAgICAgICAgKi8KKwlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSFNUVVMpICYgUlJFQURZKSB7CS8qIE9yY2hpZCBpcyByZWFkeSAgICAgICAgICAgICAgKi8KKwkJcmV2aXNpb24gPSBnZXRfRldfdmVyc2lvbihoY3NwKTsKKwkJaWYgKHJldmlzaW9uID09IDB4RkZGRikgeworCQkJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hDVFJMLCBERVZSU1QpOwkvKiBSZXNldCBIb3N0IEFkYXB0ZXIgICAqLworCQkJaWYgKHdhaXRDaGlwUmVhZHkoaGNzcCkgPT0gMCkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWxvYWRfRlcoaGNzcCk7CS8qIERvd25sb2FkIEZXICAgICAgICAgICAgICAgICAgKi8KKwkJCXNldHVwX1NDQnMoaGNzcCk7CS8qIFNldHVwIFNDQiBIQ1NfQmFzZSBhbmQgU0NCIFNpemUgcmVnaXN0ZXJzICovCisJCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIDApOwkvKiBjbGVhciBIT1NUU1RPUCAgICAgICAqLworCQkJaWYgKHdhaXRGV1JlYWR5KGhjc3ApID09IDApCisJCQkJcmV0dXJuICgtMSk7CisJCQkvKiBXYWl0IGZvciBmaXJtd2FyZSByZWFkeSAgICAgKi8KKwkJfSBlbHNlIHsKKwkJCXNldHVwX1NDQnMoaGNzcCk7CS8qIFNldHVwIFNDQiBIQ1NfQmFzZSBhbmQgU0NCIFNpemUgcmVnaXN0ZXJzICovCisJCX0KKwl9IGVsc2UgewkJLyogT3JjaGlkIGlzIG5vdCBSZWFkeSAgICAgICAgICAqLworCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIERFVlJTVCk7CS8qIFJlc2V0IEhvc3QgQWRhcHRlciAgICovCisJCWlmICh3YWl0Q2hpcFJlYWR5KGhjc3ApID09IDApCisJCQlyZXR1cm4gKC0xKTsKKwkJbG9hZF9GVyhoY3NwKTsJLyogRG93bmxvYWQgRlcgICAgICAgICAgICAgICAgICAqLworCQlzZXR1cF9TQ0JzKGhjc3ApOwkvKiBTZXR1cCBTQ0IgSENTX0Jhc2UgYW5kIFNDQiBTaXplIHJlZ2lzdGVycyAqLworCQlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CS8qIERvIEhhcmR3YXJlIFJlc2V0ICYgICovCisKKwkJLyogICAgIGNsZWFyIEhPU1RTVE9QICAqLworCQlpZiAod2FpdEZXUmVhZHkoaGNzcCkgPT0gMCkJCS8qIFdhaXQgZm9yIGZpcm13YXJlIHJlYWR5ICAgICAgKi8KKwkJCXJldHVybiAoLTEpOworCX0KKworLyotLS0tLS0tLS0tLS0tIGdldCBzZXJpYWwgRUVQcm9tIHNldHR0aW5nIC0tLS0tLS0qLworCisJcmVhZF9lZXByb20oaGNzcCk7CisKKwlpZiAobnZyYW1wLT5SZXZpc2lvbiAhPSAxKQorCQlyZXR1cm4gKC0xKTsKKworCWhjc3AtPkhDU19TQ1NJX0lEID0gbnZyYW1wLT5TQ1NJMElkOworCWhjc3AtPkhDU19CSU9TID0gbnZyYW1wLT5CSU9TQ29uZmlnMTsKKwloY3NwLT5IQ1NfTWF4VGFyID0gTUFYX1RBUkdFVFM7CisJcmVhZEJ5dGVwID0gKFVDSEFSICopICYgKG52cmFtcC0+VGFyZ2V0MDBDb25maWcpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgcmVhZEJ5dGVwKyssIGkrKykgeworCQloY3NwLT5UYXJnZXRGbGFnW2ldID0gKnJlYWRCeXRlcDsKKwkJaGNzcC0+TWF4aW11bVRhZ3NbaV0gPSBPUkNfTUFYVEFHUzsKKwl9CQkJLyogZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJaWYgKG52cmFtcC0+U0NTSTBDb25maWcgJiBOQ0NfQlVTUkVTRVQpIHsJLyogUmVzZXQgU0NTSSBidXMgICAgICAgICAgICAgICAqLworCQloY3NwLT5IQ1NfRmxhZ3MgfD0gSENGX1NDU0lfUkVTRVQ7CisJfQorCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19HSU1TSywgMHhGQik7CS8qIGVuYWJsZSBSUCBGSUZPIGludGVycnVwdCAgICAgKi8KKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IG9yY19yZXNldF9zY3NpX2J1cworIERlc2NyaXB0aW9uICAgIDogUmVzZXQgcmVnaXN0ZXJzLCByZXNldCBhIGhhbmdpbmcgYnVzIGFuZAorICAgICAgICAgICAgICAgICAga2lsbCBhY3RpdmUgYW5kIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBmb3IgdGFyZ2V0IHcvbyBzb2Z0IHJlc2V0CisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgb3JjX3Jlc2V0X3Njc2lfYnVzKE9SQ19IQ1MgKiBwSENCKQorewkJCQkvKiBJIG5lZWQgSG9zdCBDb250cm9sIEJsb2NrIEluZm9ybWF0aW9uICovCisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBIQ0ItPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisKKwlpbml0QUZsYWcocEhDQik7CisJLyogcmVzZXQgc2NzaSBidXMgKi8KKwlPUkNfV1IocEhDQi0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIFNDU0lSU1QpOworCWlmICh3YWl0U0NTSVJTVGRvbmUocEhDQikgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IG9yY19kZXZpY2VfcmVzZXQKKyBEZXNjcmlwdGlvbiAgICA6IFJlc2V0IHJlZ2lzdGVycywgcmVzZXQgYSBoYW5naW5nIGJ1cyBhbmQKKyAgICAgICAgICAgICAgICAgIGtpbGwgYWN0aXZlIGFuZCBkaXNjb25uZWN0ZWQgY29tbWFuZHMgZm9yIHRhcmdldCB3L28gc29mdCByZXNldAorIElucHV0ICAgICAgICAgIDogcEhDQiAgLSAgICAgICBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKKyBPdXRwdXQgICAgICAgICA6IE5vbmUuCisgUmV0dXJuICAgICAgICAgOiBwU1JCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IGJsb2NrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG9yY19kZXZpY2VfcmVzZXQoT1JDX0hDUyAqIHBIQ0IsIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgdGFyZ2V0KQorewkJCQkvKiBJIG5lZWQgSG9zdCBDb250cm9sIEJsb2NrIEluZm9ybWF0aW9uICovCisJT1JDX1NDQiAqcFNjYjsKKwlFU0NCICpwVmlyRXNjYjsKKwlPUkNfU0NCICpwVmlyU2NiOworCVVDSEFSIGk7CisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBIQ0ItPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisJcFNjYiA9IChPUkNfU0NCICopIE5VTEw7CisJcFZpckVzY2IgPSAoRVNDQiAqKSBOVUxMOworCisJLyogc2V0dXAgc2NhdHRlciBsaXN0IGFkZHJlc3Mgd2l0aCBvbmUgYnVmZmVyICovCisJcFZpclNjYiA9IHBIQ0ItPkhDU192aXJTY2JBcnJheTsKKworCWluaXRBRmxhZyhwSENCKTsKKwkvKiBkZXZpY2UgcmVzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT1JDX01BWFFVRVVFOyBpKyspIHsKKwkJcFZpckVzY2IgPSBwVmlyU2NiLT5TQ0JfRVNjYjsKKwkJaWYgKChwVmlyU2NiLT5TQ0JfU3RhdHVzKSAmJiAocFZpckVzY2ItPlNDQl9TcmIgPT0gU0NwbnQpKQorCQkJYnJlYWs7CisJCXBWaXJTY2IrKzsKKwl9CisKKwlpZiAoaSA9PSBPUkNfTUFYUVVFVUUpIHsKKwkJcHJpbnRrKCJVbmFibGUgdG8gUmVzZXQgLSBObyBTQ0IgRm91bmRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJaWYgKChwU2NiID0gb3JjX2FsbG9jX3NjYihwSENCKSkgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEhDQi0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcFNjYi0+U0NCX09wY29kZSA9IE9SQ19CVVNERVZSU1Q7CisJcFNjYi0+U0NCX1RhcmdldCA9IHRhcmdldDsKKwlwU2NiLT5TQ0JfSGFTdGF0ID0gMDsKKwlwU2NiLT5TQ0JfVGFTdGF0ID0gMDsKKwlwU2NiLT5TQ0JfU3RhdHVzID0gMHgwOworCXBTY2ItPlNDQl9MaW5rID0gMHhGRjsKKwlwU2NiLT5TQ0JfUmVzZXJ2ZWQwID0gMDsKKwlwU2NiLT5TQ0JfUmVzZXJ2ZWQxID0gMDsKKwlwU2NiLT5TQ0JfWGZlckxlbiA9IDA7CisJcFNjYi0+U0NCX1NHTGVuID0gMDsKKworCXBWaXJFc2NiLT5TQ0JfU3JiID0gTlVMTDsKKwlwVmlyRXNjYi0+U0NCX1NyYiA9IFNDcG50OworCW9yY19leGVjX3NjYihwSENCLCBwU2NiKTsJLyogU3RhcnQgZXhlY3V0ZSBTQ0IgICAgICAgICAgICAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwSENCLT5CaXRBbGxvY0ZsYWdMb2NrKSwgZmxhZ3MpOworCXJldHVybiBTVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgT1JDX1NDQiAqX19vcmNfYWxsb2Nfc2NiKE9SQ19IQ1MgKiBoY3NwKQoreworCU9SQ19TQ0IgKnBUbXBTY2I7CisJVUNIQVIgQ2g7CisJVUxPTkcgaWR4OworCVVDSEFSIGluZGV4OworCVVDSEFSIGk7CisKKwlDaCA9IGhjc3AtPkhDU19JbmRleDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDMyOyBpbmRleCsrKSB7CisJCQlpZiAoKGhjc3AtPkJpdEFsbG9jRmxhZ1tDaF1baV0gPj4gaW5kZXgpICYgMHgwMSkgeworCQkJCWhjc3AtPkJpdEFsbG9jRmxhZ1tDaF1baV0gJj0gfigxIDw8IGluZGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZHggPSBpbmRleCArIDMyICogaTsKKwkJcFRtcFNjYiA9IChPUkNfU0NCICopICgoVUxPTkcpIGhjc3AtPkhDU192aXJTY2JBcnJheSArIChpZHggKiBzaXplb2YoT1JDX1NDQikpKTsKKwkJcmV0dXJuIChwVG1wU2NiKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIE9SQ19TQ0IgKm9yY19hbGxvY19zY2IoT1JDX0hDUyAqIGhjc3ApCit7CisJT1JDX1NDQiAqcFRtcFNjYjsKKwlVTE9ORyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaGNzcC0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwlwVG1wU2NiID0gX19vcmNfYWxsb2Nfc2NiKGhjc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihoY3NwLT5CaXRBbGxvY0ZsYWdMb2NrKSwgZmxhZ3MpOworCXJldHVybiAocFRtcFNjYik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG9yY19yZWxlYXNlX3NjYihPUkNfSENTICogaGNzcCwgT1JDX1NDQiAqIHNjYnApCit7CisJVUxPTkcgZmxhZ3M7CisJVUNIQVIgSW5kZXg7CisJVUNIQVIgaTsKKwlVQ0hBUiBDaDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaGNzcC0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwlDaCA9IGhjc3AtPkhDU19JbmRleDsKKwlJbmRleCA9IHNjYnAtPlNDQl9TY2JJZHg7CisJaSA9IEluZGV4IC8gMzI7CisJSW5kZXggJT0gMzI7CisJaGNzcC0+Qml0QWxsb2NGbGFnW0NoXVtpXSB8PSAoMSA8PCBJbmRleCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uIG5hbWUgIDogYWJvcnRfU0NCCisgRGVzY3JpcHRpb24gICAgOiBBYm9ydCBhIHF1ZXVlZCBjb21tYW5kLgorCSAgICAgICAgICAgICAgICAgKGNvbW1hbmRzIHRoYXQgYXJlIG9uIHRoZSBidXMgY2FuJ3QgYmUgYWJvcnRlZCBlYXNpbHkpCisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYWJvcnRfU0NCKE9SQ19IQ1MgKiBoY3NwLCBPUkNfU0NCICogcFNjYikKK3sKKwl1bnNpZ25lZCBjaGFyIGJEYXRhLCBiU3RhdHVzOworCisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hEQVRBLCBPUkNfQ01EX0FCT1JUX1NDQik7CS8qIFdyaXRlIGNvbW1hbmQgKi8KKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSENUUkwsIEhETyk7CisJaWYgKHdhaXRIRE9vZmYoaGNzcCkgPT0gMCkJLyogV2FpdCBIRE8gb2ZmICAgKi8KKwkJcmV0dXJuIDA7CisKKwlPUkNfV1IoaGNzcC0+SENTX0Jhc2UgKyBPUkNfSERBVEEsIHBTY2ItPlNDQl9TY2JJZHgpOwkvKiBXcml0ZSBhZGRyZXNzICovCisJT1JDX1dSKGhjc3AtPkhDU19CYXNlICsgT1JDX0hDVFJMLCBIRE8pOworCWlmICh3YWl0SERPb2ZmKGhjc3ApID09IDApCS8qIFdhaXQgSERPIG9mZiAgICovCisJCXJldHVybiAwOworCisJaWYgKHdhaXRIRElzZXQoaGNzcCwgJmJEYXRhKSA9PSAwKQkvKiBXYWl0IEhESSBzZXQgICAqLworCQlyZXR1cm4gMDsKKwliU3RhdHVzID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfSERBVEEpOworCU9SQ19XUihoY3NwLT5IQ1NfQmFzZSArIE9SQ19IU1RVUywgYkRhdGEpOwkvKiBDbGVhciBIREkgICAgKi8KKworCWlmIChiU3RhdHVzID09IDEpCS8qIDAgLSBTdWNjZXNzZnVsbHkgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gMDsJLyogMSAtIEZhaWwgICAgICAgICAgICAgICAgICAgICAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBfYWJvcnQKKyBEZXNjcmlwdGlvbiAgICA6IEFib3J0IGEgcXVldWVkIGNvbW1hbmQuCisJICAgICAgICAgICAgICAgICAoY29tbWFuZHMgdGhhdCBhcmUgb24gdGhlIGJ1cyBjYW4ndCBiZSBhYm9ydGVkIGVhc2lseSkKKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogcFNSQiAgLSAgICAgICBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBvcmNfYWJvcnRfc3JiKE9SQ19IQ1MgKiBoY3NwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlFU0NCICpwVmlyRXNjYjsKKwlPUkNfU0NCICpwVmlyU2NiOworCVVDSEFSIGk7CisJVUxPTkcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisKKwlwVmlyU2NiID0gaGNzcC0+SENTX3ZpclNjYkFycmF5OworCisJZm9yIChpID0gMDsgaSA8IE9SQ19NQVhRVUVVRTsgaSsrLCBwVmlyU2NiKyspIHsKKwkJcFZpckVzY2IgPSBwVmlyU2NiLT5TQ0JfRVNjYjsKKwkJaWYgKChwVmlyU2NiLT5TQ0JfU3RhdHVzKSAmJiAocFZpckVzY2ItPlNDQl9TcmIgPT0gU0NwbnQpKSB7CisJCQlpZiAocFZpclNjYi0+U0NCX1RhZ01zZyA9PSAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGFib3J0X1NDQihoY3NwLCBwVmlyU2NiKSkgeworCQkJCQlwVmlyRXNjYi0+U0NCX1NyYiA9IE5VTEw7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihoY3NwLT5CaXRBbGxvY0ZsYWdMb2NrKSwgZmxhZ3MpOworCQkJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJCQl9IGVsc2UgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaGNzcC0+Qml0QWxsb2NGbGFnTG9jayksIGZsYWdzKTsKKwkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkJpdEFsbG9jRmxhZ0xvY2spLCBmbGFncyk7CisJcmV0dXJuIEZBSUxFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUm91dGluZSBEZXNjcmlwdGlvbjoKKwkgIFRoaXMgaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoZSBPcmNoaWQgU0NTSSBhZGFwdGVyLgorCSAgSXQgcmVhZHMgdGhlIGludGVycnVwdCByZWdpc3RlciB0byBkZXRlcm1pbmUgaWYgdGhlIGFkYXB0ZXIgaXMgaW5kZWVkCisJICB0aGUgc291cmNlIG9mIHRoZSBpbnRlcnJ1cHQgYW5kIGNsZWFycyB0aGUgaW50ZXJydXB0IGF0IHRoZSBkZXZpY2UuCisgQXJndW1lbnRzOgorCSAgSHdEZXZpY2VFeHRlbnNpb24gLSBIQkEgbWluaXBvcnQgZHJpdmVyJ3MgYWRhcHRlciBkYXRhIHN0b3JhZ2UKKyBSZXR1cm4gVmFsdWU6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG9yY19pbnRlcnJ1cHQoCisJCQkgIE9SQ19IQ1MgKiBoY3NwCispCit7CisJQllURSBiU2NiSWR4OworCU9SQ19TQ0IgKnBTY2I7CisKKwlpZiAoT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfUlFVRVVFQ05UKSA9PSAwKSB7CisJCXJldHVybjsJCS8vIDA7CisKKwl9CisJZG8geworCQliU2NiSWR4ID0gT1JDX1JEKGhjc3AtPkhDU19CYXNlLCBPUkNfUlFVRVVFKTsKKworCQlwU2NiID0gKE9SQ19TQ0IgKikgKChVTE9ORykgaGNzcC0+SENTX3ZpclNjYkFycmF5ICsgKFVMT05HKSAoc2l6ZW9mKE9SQ19TQ0IpICogYlNjYklkeCkpOworCQlwU2NiLT5TQ0JfU3RhdHVzID0gMHgwOworCisJCWluaWExMDBTQ0JQb3N0KChCWVRFICopIGhjc3AsIChCWVRFICopIHBTY2IpOworCX0gd2hpbGUgKE9SQ19SRChoY3NwLT5IQ1NfQmFzZSwgT1JDX1JRVUVVRUNOVCkpOworCXJldHVybjsJCQkvLzE7CisKK30JCQkJLyogRW5kIG9mIEkxMDYwSW50ZXJydXB0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpbmlhMTAwQnVpbGRTQ0IKKyBEZXNjcmlwdGlvbiAgICA6IAorIElucHV0ICAgICAgICAgIDogcEhDQiAgLSAgICAgICBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKKyBPdXRwdXQgICAgICAgICA6IE5vbmUuCisgUmV0dXJuICAgICAgICAgOiBwU1JCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IGJsb2NrLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbmlhMTAwQnVpbGRTQ0IoT1JDX0hDUyAqIHBIQ0IsIE9SQ19TQ0IgKiBwU0NCLCBzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CQkJCS8qIENyZWF0ZSBjb3JyZXNwb25kaW5nIFNDQiAgICAgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBTcmJTRzsKKwlPUkNfU0cgKnBTRzsJCS8qIFBvaW50ZXIgdG8gU0cgbGlzdCAgICAgICAgICAgKi8KKwlpbnQgaSwgY291bnRfc2c7CisJRVNDQiAqcEVTY2I7CisKKwlwRVNjYiA9IHBTQ0ItPlNDQl9FU2NiOworCXBFU2NiLT5TQ0JfU3JiID0gU0NwbnQ7CisJcFNHID0gTlVMTDsKKworCXBTQ0ItPlNDQl9PcGNvZGUgPSBPUkNfRVhFQ1NDU0k7CisJcFNDQi0+U0NCX0ZsYWdzID0gU0NGX05PX0RDSEs7CS8qIENsZWFyIGRvbmUgYml0ICAgICAgICAgICAgICAgKi8KKwlwU0NCLT5TQ0JfVGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJcFNDQi0+U0NCX0x1biA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwlwU0NCLT5TQ0JfUmVzZXJ2ZWQwID0gMDsKKwlwU0NCLT5TQ0JfUmVzZXJ2ZWQxID0gMDsKKwlwU0NCLT5TQ0JfU0dMZW4gPSAwOworCisJaWYgKChwU0NCLT5TQ0JfWGZlckxlbiA9IChVMzIpIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pKSB7CisJCXBTRyA9IChPUkNfU0cgKikgJiBwRVNjYi0+RVNDQl9TR0xpc3RbMF07CisJCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCQlwU3JiU0cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCWNvdW50X3NnID0gcGNpX21hcF9zZyhwSENCLT5wZGV2LCBwU3JiU0csIFNDcG50LT51c2Vfc2csCisJCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlwU0NCLT5TQ0JfU0dMZW4gPSAoVTMyKSAoY291bnRfc2cgKiA4KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudF9zZzsgaSsrLCBwU0crKywgcFNyYlNHKyspIHsKKwkJCQlwU0ctPlNHX1B0ciA9IChVMzIpIHNnX2RtYV9hZGRyZXNzKHBTcmJTRyk7CisJCQkJcFNHLT5TR19MZW4gPSAoVTMyKSBzZ19kbWFfbGVuKHBTcmJTRyk7CisJCQl9CisJCX0gZWxzZSBpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7LyogTm9uIFNHICovCisJCQlwU0NCLT5TQ0JfU0dMZW4gPSAweDg7CisJCQlTQ3BudC0+U0NwLmRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShwSENCLT5wZGV2LAorCQkJCQlTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlwU0ctPlNHX1B0ciA9IChVMzIpIFNDcG50LT5TQ3AuZG1hX2hhbmRsZTsKKwkJCXBTRy0+U0dfTGVuID0gKFUzMikgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJfSBlbHNlIHsKKwkJCXBTQ0ItPlNDQl9TR0xlbiA9IDA7CisJCQlwU0ctPlNHX1B0ciA9IDA7CisJCQlwU0ctPlNHX0xlbiA9IDA7CisJCX0KKwl9CisJcFNDQi0+U0NCX1NHUEFkZHIgPSAoVTMyKSBwU0NCLT5TQ0JfU2Vuc2VQQWRkcjsKKwlwU0NCLT5TQ0JfSGFTdGF0ID0gMDsKKwlwU0NCLT5TQ0JfVGFTdGF0ID0gMDsKKwlwU0NCLT5TQ0JfTGluayA9IDB4RkY7CisJcFNDQi0+U0NCX1NlbnNlTGVuID0gU0VOU0VfU0laRTsKKwlwU0NCLT5TQ0JfQ0RCTGVuID0gU0NwbnQtPmNtZF9sZW47CisJaWYgKHBTQ0ItPlNDQl9DREJMZW4gPj0gSU1BWF9DREIpIHsKKwkJcHJpbnRrKCJtYXggY2RiIGxlbmd0aD0gJXhcYiIsIFNDcG50LT5jbWRfbGVuKTsKKwkJcFNDQi0+U0NCX0NEQkxlbiA9IElNQVhfQ0RCOworCX0KKwlwU0NCLT5TQ0JfSWRlbnQgPSBTQ3BudC0+ZGV2aWNlLT5sdW4gfCBESVNDX0FMTE9XOworCWlmIChTQ3BudC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CS8qIFRhZyBTdXBwb3J0ICAgICAgICAgICAgICAgICAgKi8KKwkJcFNDQi0+U0NCX1RhZ01zZyA9IFNJTVBMRV9RVUVVRV9UQUc7CS8qIERvIHNpbXBsZSB0YWcgb25seSAgICovCisJfSBlbHNlIHsKKwkJcFNDQi0+U0NCX1RhZ01zZyA9IDA7CS8qIE5vIHRhZyBzdXBwb3J0ICAgICAgICAgICAgICAgKi8KKwl9CisJbWVtY3B5KCZwU0NCLT5TQ0JfQ0RCWzBdLCAmU0NwbnQtPmNtbmQsIHBTQ0ItPlNDQl9DREJMZW4pOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpbmlhMTAwX3F1ZXVlCisgRGVzY3JpcHRpb24gICAgOiBRdWV1ZSBhIGNvbW1hbmQgYW5kIHNldHVwIGludGVycnVwdHMgZm9yIGEgZnJlZSBidXMuCisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaW5pYTEwMF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlyZWdpc3RlciBPUkNfU0NCICpwU0NCOworCU9SQ19IQ1MgKnBIQ0I7CQkvKiBQb2ludCB0byBIb3N0IGFkYXB0ZXIgY29udHJvbCBibG9jayAqLworCisJcEhDQiA9IChPUkNfSENTICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCS8qIEdldCBmcmVlIFNDU0kgY29udHJvbCBibG9jayAgKi8KKwlpZiAoKHBTQ0IgPSBvcmNfYWxsb2Nfc2NiKHBIQ0IpKSA9PSBOVUxMKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCWluaWExMDBCdWlsZFNDQihwSENCLCBwU0NCLCBTQ3BudCk7CisJb3JjX2V4ZWNfc2NiKHBIQ0IsIHBTQ0IpOwkvKiBTdGFydCBleGVjdXRlIFNDQiAgICAgICAgICAgICovCisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBfYWJvcnQKKyBEZXNjcmlwdGlvbiAgICA6IEFib3J0IGEgcXVldWVkIGNvbW1hbmQuCisJICAgICAgICAgICAgICAgICAoY29tbWFuZHMgdGhhdCBhcmUgb24gdGhlIGJ1cyBjYW4ndCBiZSBhYm9ydGVkIGVhc2lseSkKKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogcFNSQiAgLSAgICAgICBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbmlhMTAwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlPUkNfSENTICpoY3NwOworCisJaGNzcCA9IChPUkNfSENTICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJldHVybiBvcmNfYWJvcnRfc3JiKGhjc3AsIFNDcG50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiBpbmlhMTAwX3Jlc2V0CisgRGVzY3JpcHRpb24gICAgOiBSZXNldCByZWdpc3RlcnMsIHJlc2V0IGEgaGFuZ2luZyBidXMgYW5kCisgICAgICAgICAgICAgICAgICBraWxsIGFjdGl2ZSBhbmQgZGlzY29ubmVjdGVkIGNvbW1hbmRzIGZvciB0YXJnZXQgdy9vIHNvZnQgcmVzZXQKKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogcFNSQiAgLSAgICAgICBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbmlhMTAwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CQkJCS8qIEkgbmVlZCBIb3N0IENvbnRyb2wgQmxvY2sgSW5mb3JtYXRpb24gKi8KKwlPUkNfSENTICpwSENCOworCXBIQ0IgPSAoT1JDX0hDUyAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gb3JjX3Jlc2V0X3Njc2lfYnVzKHBIQ0IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBfZGV2aWNlX3Jlc2V0CisgRGVzY3JpcHRpb24gICAgOiBSZXNldCB0aGUgZGV2aWNlCisgSW5wdXQgICAgICAgICAgOiBwSENCICAtICAgICAgIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IHBTUkIgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIHJlcXVlc3QgYmxvY2suCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaW5pYTEwMF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQorewkJCQkvKiBJIG5lZWQgSG9zdCBDb250cm9sIEJsb2NrIEluZm9ybWF0aW9uICovCisJT1JDX0hDUyAqcEhDQjsKKwlwSENCID0gKE9SQ19IQ1MgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJcmV0dXJuIG9yY19kZXZpY2VfcmVzZXQocEhDQiwgU0NwbnQsIFNDcG50LT5kZXZpY2UtPmlkKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGluaWExMDBTQ0JQb3N0CisgRGVzY3JpcHRpb24gICAgOiBUaGlzIGlzIGNhbGxiYWNrIHJvdXRpbmUgYmUgY2FsbGVkIHdoZW4gb3JjIGZpbmlzaCBvbmUKKwkJCVNDU0kgY29tbWFuZC4KKyBJbnB1dCAgICAgICAgICA6IHBIQ0IgIC0gICAgICAgUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgY29udHJvbCBibG9jay4KKwkJICBwU0NCICAtICAgICAgIFBvaW50ZXIgdG8gU0NTSSBjb250cm9sIGJsb2NrLgorIE91dHB1dCAgICAgICAgIDogTm9uZS4KKyBSZXR1cm4gICAgICAgICA6IE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaWExMDBTQ0JQb3N0KEJZVEUgKiBwSGNiLCBCWVRFICogcFNjYikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwU1JCOwkvKiBQb2ludGVyIHRvIFNDU0kgcmVxdWVzdCBibG9jayAqLworCU9SQ19IQ1MgKnBIQ0I7CisJT1JDX1NDQiAqcFNDQjsKKwlFU0NCICpwRVNjYjsKKworCXBIQ0IgPSAoT1JDX0hDUyAqKSBwSGNiOworCXBTQ0IgPSAoT1JDX1NDQiAqKSBwU2NiOworCXBFU2NiID0gcFNDQi0+U0NCX0VTY2I7CisJaWYgKChwU1JCID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcEVTY2ItPlNDQl9TcmIpID09IDApIHsKKwkJcHJpbnRrKCJpbmlhMTAwU0NCUG9zdDogU1JCIHBvaW50ZXIgaXMgZW1wdHlcbiIpOworCQlvcmNfcmVsZWFzZV9zY2IocEhDQiwgcFNDQik7CS8qIFJlbGVhc2UgU0NCIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KKwkJcmV0dXJuOworCX0KKwlwRVNjYi0+U0NCX1NyYiA9IE5VTEw7CisKKwlzd2l0Y2ggKHBTQ0ItPlNDQl9IYVN0YXQpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4YToJCS8qIExpbmtlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgYW5kIGxpbmtlZCBub3JtYWxseSAqLworCWNhc2UgMHhiOgkJLyogTGlua2VkIGNvbW1hbmQgY29tcGxldGUgd2l0aG91dCBlcnJvciBpbnRlcnJ1cHQgZ2VuZXJhdGVkICovCisJCXBTQ0ItPlNDQl9IYVN0YXQgPSAwOworCQlicmVhazsKKworCWNhc2UgMHgxMToJCS8qIFNlbGVjdGlvbiB0aW1lIG91dC1UaGUgaW5pdGlhdG9yIHNlbGVjdGlvbiBvciB0YXJnZXQKKwkJCQkgICByZXNlbGVjdGlvbiB3YXMgbm90IGNvbXBsZXRlIHdpdGhpbiB0aGUgU0NTSSBUaW1lIG91dCBwZXJpb2QgKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9USU1FX09VVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTQ6CQkvKiBUYXJnZXQgYnVzIHBoYXNlIHNlcXVlbmNlIGZhaWx1cmUtQW4gaW52YWxpZCBidXMgcGhhc2Ugb3IgYnVzCisJCQkJICAgcGhhc2Ugc2VxdWVuY2Ugd2FzIHJlcXVlc3RlZCBieSB0aGUgdGFyZ2V0LiBUaGUgaG9zdCBhZGFwdGVyCisJCQkJICAgd2lsbCBnZW5lcmF0ZSBhIFNDU0kgUmVzZXQgQ29uZGl0aW9uLCBub3RpZnlpbmcgdGhlIGhvc3Qgd2l0aAorCQkJCSAgIGEgU0NSRCBpbnRlcnJ1cHQgKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MWE6CQkvKiBTQ0IgQWJvcnRlZC4gMDcvMjEvOTggKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9BQk9SVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTI6CQkvKiBEYXRhIG92ZXJydW4vdW5kZXJydW4tVGhlIHRhcmdldCBhdHRlbXB0ZWQgdG8gdHJhbnNmZXIgbW9yZSBkYXRhCisJCQkJICAgdGhhbiB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBEYXRhIExlbmd0aCBmaWVsZCBvciB0aGUgc3VtIG9mIHRoZQorCQkJCSAgIFNjYXR0ZXIgLyBHYXRoZXIgRGF0YSBMZW5ndGggZmllbGRzLiAqLworCWNhc2UgMHgxMzoJCS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUtVGhlIHRhcmdldCBkcm9wcGVkIHRoZSBTQ1NJIEJTWSBhdCBhbiB1bmV4cGVjdGVkIHRpbWUuICovCisJY2FzZSAweDE2OgkJLyogSW52YWxpZCBDQ0IgT3BlcmF0aW9uIENvZGUtVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIENDQiB3YXMgaW52YWxpZC4gKi8KKworCWRlZmF1bHQ6CisJCXByaW50aygiaW5pYTEwMDogJXggJXhcbiIsIHBTQ0ItPlNDQl9IYVN0YXQsIHBTQ0ItPlNDQl9UYVN0YXQpOworCQlwU0NCLT5TQ0JfSGFTdGF0ID0gRElEX0VSUk9SOwkvKiBDb3VsZG4ndCBmaW5kIGFueSBiZXR0ZXIgKi8KKwkJYnJlYWs7CisJfQorCisJaWYgKHBTQ0ItPlNDQl9UYVN0YXQgPT0gMikgewkvKiBDaGVjayBjb25kaXRpb24gICAgICAgICAgICAgICovCisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSAmcFNSQi0+c2Vuc2VfYnVmZmVyWzBdLAorCQkgICAodW5zaWduZWQgY2hhciAqKSAmcEVTY2ItPkVTQ0JfU0dMaXN0WzBdLCBTRU5TRV9TSVpFKTsKKwl9CisJcFNSQi0+cmVzdWx0ID0gcFNDQi0+U0NCX1RhU3RhdCB8IChwU0NCLT5TQ0JfSGFTdGF0IDw8IDE2KTsKKworCWlmIChwU1JCLT51c2Vfc2cpIHsKKwkJcGNpX3VubWFwX3NnKHBIQ0ItPnBkZXYsCisJCQkgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwU1JCLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgcFNSQi0+dXNlX3NnLCBwU1JCLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfSBlbHNlIGlmIChwU1JCLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKHBIQ0ItPnBkZXYsIHBTUkItPlNDcC5kbWFfaGFuZGxlLAorCQkJCSBwU1JCLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJIHBTUkItPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9CisKKwlwU1JCLT5zY3NpX2RvbmUocFNSQik7CS8qIE5vdGlmeSBzeXN0ZW0gRE9ORSAgICAgICAgICAgKi8KKworCW9yY19yZWxlYXNlX3NjYihwSENCLCBwU0NCKTsJLyogUmVsZWFzZSBTQ0IgZm9yIGN1cnJlbnQgY2hhbm5lbCAqLworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgKG1haW4gcm91dGluZSBvZiB0aGUgZHJpdmVyKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW5pYTEwMF9pbnRyKGludCBpcnFubywgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWRldmlkOworCU9SQ19IQ1MgKnBIY2IgPSAoT1JDX0hDUyAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlvcmNfaW50ZXJydXB0KHBIY2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGluaWExMDBfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiaW5pYTEwMCIsCisJLm5hbWUJCQk9IGluaWExMDBfUkVWSUQsCisJLnF1ZXVlY29tbWFuZAkJPSBpbmlhMTAwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gaW5pYTEwMF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBpbmlhMTAwX2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBpbmlhMTAwX2RldmljZV9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLnRoaXNfaWQJCT0gMSwKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4gCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaW5pYTEwMF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlPUkNfSENTICpwSENCOworCXVuc2lnbmVkIGxvbmcgcG9ydCwgYmlvczsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCXUzMiBzejsKKwl1bnNpZ25lZCBsb25nIGRCaW9zQWRyOworCWNoYXIgKnBiQmlvc0FkcjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBvdXQ7CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIHNldCAzMmJpdCBETUEgIgorCQkJCSAgICAib24gaW5pYTEwMCBhZGFwdGVyLCBpZ25vcmluZy5cbiIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0LCAyNTYsICJpbmlhMTAwIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5pYTEwMDogaW8gcG9ydCAweCVseCwgaXMgYnVzeS5cbiIsIHBvcnQpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwkvKiA8MDI+IHJlYWQgZnJvbSBiYXNlIGFkZHJlc3MgKyAweDUwIG9mZnNldCB0byBnZXQgdGhlIGJpb3MgYmFsdWUuICovCisJYmlvcyA9IE9SQ19SRFdPUkQocG9ydCwgMHg1MCk7CisKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpbmlhMTAwX3RlbXBsYXRlLCBzaXplb2YoT1JDX0hDUykpOworCWlmICghc2hvc3QpCisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCisJcEhDQiA9IChPUkNfSENTICopc2hvc3QtPmhvc3RkYXRhOworCXBIQ0ItPnBkZXYgPSBwZGV2OworCXBIQ0ItPkhDU19CYXNlID0gcG9ydDsKKwlwSENCLT5IQ1NfQklPUyA9IGJpb3M7CisJc3Bpbl9sb2NrX2luaXQoJnBIQ0ItPkJpdEFsbG9jRmxhZ0xvY2spOworCisJLyogR2V0IHRvdGFsIG1lbW9yeSBuZWVkZWQgZm9yIFNDQiAqLworCXN6ID0gT1JDX01BWFFVRVVFICogc2l6ZW9mKE9SQ19TQ0IpOworCXBIQ0ItPkhDU192aXJTY2JBcnJheSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHN6LAorCQkJJnBIQ0ItPkhDU19waHlzU2NiQXJyYXkpOworCWlmICghcEhDQi0+SENTX3ZpclNjYkFycmF5KSB7CisJCXByaW50aygiaW5pYTEwMDogU0NCIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJZ290byBvdXRfaG9zdF9wdXQ7CisJfQorCW1lbXNldChwSENCLT5IQ1NfdmlyU2NiQXJyYXksIDAsIHN6KTsKKworCS8qIEdldCB0b3RhbCBtZW1vcnkgbmVlZGVkIGZvciBFU0NCICovCisJc3ogPSBPUkNfTUFYUVVFVUUgKiBzaXplb2YoRVNDQik7CisJcEhDQi0+SENTX3ZpckVzY2JBcnJheSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHN6LAorCQkJJnBIQ0ItPkhDU19waHlzRXNjYkFycmF5KTsKKwlpZiAoIXBIQ0ItPkhDU192aXJFc2NiQXJyYXkpIHsKKwkJcHJpbnRrKCJpbmlhMTAwOiBFU0NCIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJZ290byBvdXRfZnJlZV9zY2JfYXJyYXk7CisJfQorCW1lbXNldChwSENCLT5IQ1NfdmlyRXNjYkFycmF5LCAwLCBzeik7CisKKwlkQmlvc0FkciA9IHBIQ0ItPkhDU19CSU9TOworCWRCaW9zQWRyID0gKGRCaW9zQWRyIDw8IDQpOworCXBiQmlvc0FkciA9IHBoeXNfdG9fdmlydChkQmlvc0Fkcik7CisJaWYgKGluaXRfb3JjaGlkKHBIQ0IpKSB7CS8qIEluaXRpYWxpemUgb3JjaGlkIGNoaXAgKi8KKwkJcHJpbnRrKCJpbmlhMTAwOiBpbml0aWFsIG9yY2hpZCBmYWlsISFcbiIpOworCQlnb3RvIG91dF9mcmVlX2VzY2JfYXJyYXk7CisJfQorCisJc2hvc3QtPmlvX3BvcnQgPSBwSENCLT5IQ1NfQmFzZTsKKwlzaG9zdC0+bl9pb19wb3J0ID0gMHhmZjsKKwlzaG9zdC0+Y2FuX3F1ZXVlID0gT1JDX01BWFFVRVVFOworCXNob3N0LT51bmlxdWVfaWQgPSBzaG9zdC0+aW9fcG9ydDsKKwlzaG9zdC0+bWF4X2lkID0gcEhDQi0+SENTX01heFRhcjsKKwlzaG9zdC0+bWF4X2x1biA9IDE2OworCXNob3N0LT5pcnEgPSBwSENCLT5IQ1NfSW50ciA9IHBkZXYtPmlycTsKKwlzaG9zdC0+dGhpc19pZCA9IHBIQ0ItPkhDU19TQ1NJX0lEOwkvKiBBc3NpZ24gSENTIGluZGV4ICovCisJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IFRPVEFMX1NHX0VOVFJZOworCisJLyogSW5pdGlhbCBvcmMgY2hpcCAgICAgICAgICAgKi8KKwllcnJvciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaW5pYTEwMF9pbnRyLCBTQV9TSElSUSwKKwkJCSJpbmlhMTAwIiwgc2hvc3QpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5pYTEwMDogdW5hYmxlIHRvIGdldCBpcnEgJWRcbiIsCisJCQkJcGRldi0+aXJxKTsKKwkJZ290byBvdXRfZnJlZV9lc2NiX2FycmF5OworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZnJlZV9pcnE7CisKKwlzY3NpX3NjYW5faG9zdChzaG9zdCk7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9pcnE6CisgICAgICAgIGZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKyBvdXRfZnJlZV9lc2NiX2FycmF5OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgT1JDX01BWFFVRVVFICogc2l6ZW9mKEVTQ0IpLAorCQkJcEhDQi0+SENTX3ZpckVzY2JBcnJheSwgcEhDQi0+SENTX3BoeXNFc2NiQXJyYXkpOworIG91dF9mcmVlX3NjYl9hcnJheToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIE9SQ19NQVhRVUVVRSAqIHNpemVvZihPUkNfU0NCKSwKKwkJCXBIQ0ItPkhDU192aXJTY2JBcnJheSwgcEhDQi0+SENTX3BoeXNTY2JBcnJheSk7Cisgb3V0X2hvc3RfcHV0OgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworIG91dF9yZWxlYXNlX3JlZ2lvbjoKKyAgICAgICAgcmVsZWFzZV9yZWdpb24ocG9ydCwgMjU2KTsKKyBvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpbmlhMTAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJT1JDX0hDUyAqcEhDQiA9IChPUkNfSENTICopc2hvc3QtPmhvc3RkYXRhOworCisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisKKyAgICAgICAgZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgT1JDX01BWFFVRVVFICogc2l6ZW9mKEVTQ0IpLAorCQkJcEhDQi0+SENTX3ZpckVzY2JBcnJheSwgcEhDQi0+SENTX3BoeXNFc2NiQXJyYXkpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgT1JDX01BWFFVRVVFICogc2l6ZW9mKE9SQ19TQ0IpLAorCQkJcEhDQi0+SENTX3ZpclNjYkFycmF5LCBwSENCLT5IQ1NfcGh5c1NjYkFycmF5KTsKKyAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIDI1Nik7CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK30gCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpbmlhMTAwX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9JTklULCAweDEwNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW5pYTEwMF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGluaWExMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaW5pYTEwMCIsCisJLmlkX3RhYmxlCT0gaW5pYTEwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBpbmlhMTAwX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGluaWExMDBfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbmlhMTAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpbmlhMTAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW5pYTEwMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpbmlhMTAwX3BjaV9kcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkluaXRpbyBBMTAwVTJXIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJbml0aW8gQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworbW9kdWxlX2luaXQoaW5pYTEwMF9pbml0KTsKK21vZHVsZV9leGl0KGluaWExMDBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5oIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU0MmQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuaApAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIEluaXRpbyBBMTAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4IEluaXRpbyBDb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFdoZXJlIHRoaXMgU29mdHdhcmUgaXMgY29tYmluZWQgd2l0aCBzb2Z0d2FyZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogUmV2aXNpb24gSGlzdG9yeToKKyAqIDA2LzE4Lzk4IEhMLCBJbml0aWFsIHByb2R1Y3Rpb24gVmVyc2lvbiAxLjAyCisgKiAxMi8xOS85OCBidiwgVXNlIHNwaW5sb2NrcyBmb3IgMi4xLjk1IGFuZCB1cAorICogMDYvMjUvMDIgRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgorICoJIC0gVGhpcyBhbmQgdGhlIGk2MHVzY3NpLmggZmlsZSBhcmUgYWxtb3N0IGlkZW50aWNhbCwKKyAqCSAgIG1lcmdlZCB0aGVtIGludG8gYSBzaW5nbGUgaGVhZGVyIHVzZWQgYnkgYm90aCAuYyBmaWxlcy4KKyAqLworCisjZGVmaW5lIGluaWExMDBfUkVWSUQgIkluaXRpbyBJTkktQTEwMFUyVyBTQ1NJIGRldmljZSBkcml2ZXI7IFJldmlzaW9uOiAxLjAyZCIKKworI2RlZmluZSBVTE9ORyAgIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgVVNIT1JUICB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSBVQ0hBUiAgIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgQllURSAgICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIFdPUkQgICAgdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUgRFdPUkQgICB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFVCWVRFICAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBVV09SRCAgIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIFVEV09SRCAgdW5zaWduZWQgbG9uZworI2RlZmluZSBVMzIgICAgIHUzMgorCisjaWYgMQorI2RlZmluZSBPUkNfTUFYUVVFVUUJCTI0NQorI2RlZmluZSBPUkNfTUFYVEFHUwkJNjQKKyNlbHNlCisjZGVmaW5lIE9SQ19NQVhRVUVVRQkJMjUKKyNkZWZpbmUgT1JDX01BWFRBR1MJCTgKKyNlbmRpZgorCisjZGVmaW5lIFRPVEFMX1NHX0VOVFJZCQkzMgorI2RlZmluZSBNQVhfVEFSR0VUUwkJMTYKKyNkZWZpbmUgSU1BWF9DREIJCQkxNQorI2RlZmluZSBTRU5TRV9TSVpFCQkxNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgIFNjYXR0ZXItR2F0aGVyIEVsZW1lbnQgU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBPUkNfU0dfU3RydWMgeworCVUzMiBTR19QdHI7CQkvKiBEYXRhIFBvaW50ZXIgKi8KKwlVMzIgU0dfTGVuOwkJLyogRGF0YSBMZW5ndGggKi8KK30gT1JDX1NHOworCisvKiBTQ1NJIHJlbGF0ZWQgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBESVNDX05PVF9BTExPVyAgICAgICAgICAweDgwCS8qIERpc2Nvbm5lY3QgaXMgbm90IGFsbG93ZWQgICAgKi8KKyNkZWZpbmUgRElTQ19BTExPVyAgICAgICAgICAgICAgMHhDMAkvKiBEaXNjb25uZWN0IGlzIGFsbG93ZWQgICAgICAgICovCisKKworI2RlZmluZSBPUkNfT0ZGU0VUX1NDQgkJCTE2CisjZGVmaW5lIE9SQ19NQVhfU0NCUwkJICAgIDI1MAorI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgICAgMgorI2RlZmluZSBNQVhfRVNDQl9FTEUJCQkJNjQKKyNkZWZpbmUgVENGX0RSVl8yNTVfNjMgICAgIDB4MDQwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIE9yY2hpZCBIb3N0IENvbW1hbmQgU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE9SQ19DTURfTk9QCQkweDAwCS8qIEhvc3QgY29tbWFuZCAtIE5PUCAgICAgICAgICAgICAqLworI2RlZmluZSBPUkNfQ01EX1ZFUlNJT04JCTB4MDEJLyogSG9zdCBjb21tYW5kIC0gR2V0IEYvVyB2ZXJzaW9uICovCisjZGVmaW5lIE9SQ19DTURfRUNITwkJMHgwMgkvKiBIb3N0IGNvbW1hbmQgLSBFQ0hPICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JDX0NNRF9TRVRfTlZNCQkweDAzCS8qIEhvc3QgY29tbWFuZCAtIFNldCBOVlJBTSAgICAgICAqLworI2RlZmluZSBPUkNfQ01EX0dFVF9OVk0JCTB4MDQJLyogSG9zdCBjb21tYW5kIC0gR2V0IE5WUkFNICAgICAgICovCisjZGVmaW5lIE9SQ19DTURfR0VUX0JVU19TVEFUVVMJMHgwNQkvKiBIb3N0IGNvbW1hbmQgLSBHZXQgU0NTSSBidXMgc3RhdHVzICovCisjZGVmaW5lIE9SQ19DTURfQUJPUlRfU0NCCTB4MDYJLyogSG9zdCBjb21tYW5kIC0gQWJvcnQgU0NCICAgICAgICovCisjZGVmaW5lIE9SQ19DTURfSVNTVUVfU0NCCTB4MDcJLyogSG9zdCBjb21tYW5kIC0gSXNzdWUgU0NCICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICBPcmNoaWQgUmVnaXN0ZXIgU2V0ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT1JDX0dJTlRTCTB4QTAJLyogR2xvYmFsIEludGVycnVwdCBTdGF0dXMgICAgICAgICovCisjZGVmaW5lIFFJTlQJCTB4MDQJLyogUmVwbHkgUXVldWUgSW50ZXJydXB0ICAqLworI2RlZmluZSBPUkNfR0lNU0sJMHhBMQkvKiBHbG9iYWwgSW50ZXJydXB0IE1BU0sgICovCisjZGVmaW5lIE1RSU5UCQkweDA0CS8qIE1hc2sgUmVwbHkgUXVldWUgSW50ZXJydXB0ICAgICAqLworI2RlZmluZQlPUkNfR0NGRwkweEEyCS8qIEdsb2JhbCBDb25maWd1cmUgICAgICAgICAgICAgICAqLworI2RlZmluZSBFRVBSRwkJMHgwMQkvKiBFbmFibGUgRUVQUk9NIHByb2dyYW1taW5nICovCisjZGVmaW5lCU9SQ19HU1RBVAkweEEzCS8qIEdsb2JhbCBzdGF0dXMgICAgICAgICAgKi8KKyNkZWZpbmUgV0lERUJVUwkJMHgxMAkvKiBXaWRlIFNDU0kgRGV2aWNlcyBjb25uZWN0ZWQgICAgKi8KKyNkZWZpbmUgT1JDX0hEQVRBCTB4QTQJLyogSG9zdCBEYXRhICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SQ19IQ1RSTAkweEE1CS8qIEhvc3QgQ29udHJvbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ1NJUlNUCQkweDgwCS8qIFNDU0kgYnVzIHJlc2V0ICAgICAgICAgKi8KKyNkZWZpbmUgSERPCQkJMHg0MAkvKiBIb3N0IGRhdGEgb3V0ICAgICAgICAgICovCisjZGVmaW5lIEhPU1RTVE9QCQkweDAyCS8qIEhvc3Qgc3RvcCBSSVNDIGVuZ2luZSAgKi8KKyNkZWZpbmUgREVWUlNUCQkweDAxCS8qIERldmljZSByZXNldCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPUkNfSFNUVVMJMHhBNgkvKiBIb3N0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSERJCQkJMHgwMgkvKiBIb3N0IGRhdGEgaW4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlJFQURZCQkweDAxCS8qIFJJU0MgZW5naW5lIGlzIHJlYWR5IHRvIHJlY2VpdmUgKi8KKyNkZWZpbmUJT1JDX05WUkFNCTB4QTcJLyogTnZyYW0gcG9ydCBhZGRyZXNzICAgICAgICAgICAgICovCisjZGVmaW5lIFNFMkNTCQkweDAwOAorI2RlZmluZSBTRTJDTEsJCTB4MDA0CisjZGVmaW5lIFNFMkRPCQkweDAwMgorI2RlZmluZSBTRTJESQkJMHgwMDEKKyNkZWZpbmUgT1JDX1BRVUVVRQkweEE4CS8qIFBvc3RpbmcgcXVldWUgRklGTyAgICAgICAgICAgICAqLworI2RlZmluZSBPUkNfUFFDTlQJMHhBOQkvKiBQb3N0aW5nIHF1ZXVlIEZJRk8gQ250ICovCisjZGVmaW5lIE9SQ19SUVVFVUUJMHhBQQkvKiBSZXBseSBxdWV1ZSBGSUZPICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JDX1JRVUVVRUNOVAkweEFCCS8qIFJlcGx5IHF1ZXVlIEZJRk8gQ250ICAgICAgICAgICAqLworI2RlZmluZQlPUkNfRldCQVNFQURSCTB4QUMJLyogRmlybXdhcmUgYmFzZSBhZGRyZXNzICAqLworCisjZGVmaW5lCU9SQ19FQklPU0FEUjAgMHhCMAkvKiBFeHRlcm5hbCBCaW9zIGFkZHJlc3MgKi8KKyNkZWZpbmUJT1JDX0VCSU9TQURSMSAweEIxCS8qIEV4dGVybmFsIEJpb3MgYWRkcmVzcyAqLworI2RlZmluZQlPUkNfRUJJT1NBRFIyIDB4QjIJLyogRXh0ZXJuYWwgQmlvcyBhZGRyZXNzICovCisjZGVmaW5lCU9SQ19FQklPU0RBVEEgMHhCMwkvKiBFeHRlcm5hbCBCaW9zIGFkZHJlc3MgKi8KKworI2RlZmluZQlPUkNfU0NCU0laRQkweEI3CS8qIFNDQiBzaXplIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZQlPUkNfU0NCQkFTRTAJMHhCOAkvKiBTQ0IgYmFzZSBhZGRyZXNzIDAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJT1JDX1NDQkJBU0UxCTB4QkMJLyogU0NCIGJhc2UgYWRkcmVzcyAxICAgICAgICAgICAgICovCisKKyNkZWZpbmUJT1JDX1JJU0NDVEwJMHhFMAkvKiBSSVNDIENvbnRyb2wgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFJHTVJTVAkJMHgwMDIKKyNkZWZpbmUgRE9XTkxPQUQJCTB4MDAxCisjZGVmaW5lCU9SQ19QUkdNQ1RSMAkweEUyCS8qIFJJU0MgcHJvZ3JhbSBjb3VudGVyICAgICAgICAgICAqLworI2RlZmluZQlPUkNfUFJHTUNUUjEJMHhFMwkvKiBSSVNDIHByb2dyYW0gY291bnRlciAgICAgICAgICAgKi8KKyNkZWZpbmUJT1JDX1JJU0NSQU0JMHhFQwkvKiBSSVNDIFJBTSBkYXRhIHBvcnQgNCBieXRlcyAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb3JjX2V4dGVuZGVkX3NjYiB7CS8qIEV4dGVuZGVkIFNDQiAgICAgICAgICAgICAgICAgKi8KKwlPUkNfU0cgRVNDQl9TR0xpc3RbVE9UQUxfU0dfRU5UUlldOwkvKjAgU3RhcnQgb2YgU0cgbGlzdCAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ0JfU3JiOwkvKjUwIFNSQiBQb2ludGVyICovCit9IEVTQ0I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQlTQ1NJIENvbnRyb2wgQmxvY2sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IG9yY19zY2IgewkvKiBTY3NpX0N0cmxfQmxrICAgICAgICAgICAgICAgICovCisJVUJZVEUgU0NCX09wY29kZTsJLyowMCBTQ0IgY29tbWFuZCBjb2RlJnJlc2lkdWFsICAqLworCVVCWVRFIFNDQl9GbGFnczsJLyowMSBTQ0IgRmxhZ3MgICAgICAgICAgICAgICAgICAqLworCVVCWVRFIFNDQl9UYXJnZXQ7CS8qMDIgVGFyZ2V0IElkICAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfTHVuOwkJLyowMyBMdW4gICAgICAgICAgICAgICAgICAgICAgICAqLworCVUzMiBTQ0JfUmVzZXJ2ZWQwOwkvKjA0IFJlc2VydmVkIGZvciBPUkNISUQgbXVzdCAwICovCisJVTMyIFNDQl9YZmVyTGVuOwkvKjA4IERhdGEgVHJhbnNmZXIgTGVuZ3RoICAgICAgICovCisJVTMyIFNDQl9SZXNlcnZlZDE7CS8qMEMgUmVzZXJ2ZWQgZm9yIE9SQ0hJRCBtdXN0IDAgKi8KKwlVMzIgU0NCX1NHTGVuOwkJLyoxMCBTRyBsaXN0ICMgKiA4ICAgICAgICAgICAgICAqLworCVUzMiBTQ0JfU0dQQWRkcjsJLyoxNCBTRyBMaXN0IEJ1ZiBwaHlzaWNhbCBBZGRyICAqLworCVUzMiBTQ0JfU0dQQWRkckhpZ2g7CS8qMTggU0cgQnVmZmVyIGhpZ2ggcGh5c2ljYWwgQWRkciAqLworCVVCWVRFIFNDQl9IYVN0YXQ7CS8qMUMgSG9zdCBTdGF0dXMgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfVGFTdGF0OwkvKjFEIFRhcmdldCBTdGF0dXMgICAgICAgICAgICAgICovCisJVUJZVEUgU0NCX1N0YXR1czsJLyoxRSBTQ0Igc3RhdHVzICAgICAgICAgICAgICAgICAqLworCVVCWVRFIFNDQl9MaW5rOwkJLyoxRiBMaW5rIHBvaW50ZXIsIGRlZmF1bHQgMHhGRiAqLworCVVCWVRFIFNDQl9TZW5zZUxlbjsJLyoyMCBTZW5zZSBBbGxvY2F0aW9uIExlbmd0aCAgICAqLworCVVCWVRFIFNDQl9DREJMZW47CS8qMjEgQ0RCIExlbmd0aCAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfSWRlbnQ7CS8qMjIgSWRlbnRpZnkgICAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfVGFnTXNnOwkvKjIzIFRhZyBNZXNzYWdlICAgICAgICAgICAgICAgICovCisJVUJZVEUgU0NCX0NEQltJTUFYX0NEQl07CS8qMjQgU0NTSSBDREJzICAgICAgICAgICAgICAgICAgKi8KKwlVQllURSBTQ0JfU2NiSWR4OwkvKjNDIEluZGV4IGZvciB0aGlzIE9SQ1NDQiAgICAgICovCisJVTMyIFNDQl9TZW5zZVBBZGRyOwkvKjM0IFNlbnNlIEJ1ZmZlciBwaHlzaWNhbCBBZGRyICovCisKKwlFU0NCICpTQ0JfRVNjYjsJCS8qMzggRXh0ZW5kZWQgU0NCIFBvaW50ZXIgICAgICAgKi8KKyNpZm5kZWYgQUxQSEEKKwlVQllURSBTQ0JfUmVzZXJ2ZWQyWzRdOwkvKjNFIFJlc2VydmVkIGZvciBEcml2ZXIgdXNlICAgICovCisjZW5kaWYKK30gT1JDX1NDQjsKKworLyogT3Bjb2RlcyBvZiBPUkNTQ0JfT3Bjb2RlICovCisjZGVmaW5lIE9SQ19FWEVDU0NTSQkweDAwCS8qIFNDU0kgaW5pdGlhdG9yIGNvbW1hbmQgd2l0aCByZXNpZHVhbCAqLworI2RlZmluZSBPUkNfQlVTREVWUlNUCTB4MDEJLyogU0NTSSBCdXMgRGV2aWNlIFJlc2V0ICAqLworCisvKiBTdGF0dXMgb2YgT1JDU0NCX1N0YXR1cyAqLworI2RlZmluZSBPUkNTQ0JfQ09NUExFVEUJMHgwMAkvKiBTQ0IgcmVxdWVzdCBjb21wbGV0ZWQgICovCisjZGVmaW5lIE9SQ1NDQl9QT1NUCTB4MDEJLyogU0NCIGlzIHBvc3RlZCBieSB0aGUgSE9TVCAgICAgICovCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBPUkNTQ0JfRmxhZ3MgKi8KKyNkZWZpbmUgU0NGX0RJU0lOVAkweDAxCS8qIERpc2FibGUgSE9TVCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NGX0RJUgkJMHgxOAkvKiBEaXJlY3Rpb24gYml0cyAgICAgICAgICovCisjZGVmaW5lIFNDRl9OT19EQ0hLCTB4MDAJLyogRGlyZWN0aW9uIGRldGVybWluZWQgYnkgU0NTSSAgICovCisjZGVmaW5lIFNDRl9ESU4JCTB4MDgJLyogRnJvbSBUYXJnZXQgdG8gSW5pdGlhdG9yICAgICAgICovCisjZGVmaW5lIFNDRl9ET1VUCTB4MTAJLyogRnJvbSBJbml0aWF0b3IgdG8gVGFyZ2V0ICAgICAgICovCisjZGVmaW5lIFNDRl9OT19YRgkweDE4CS8qIE5vIGRhdGEgdHJhbnNmZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ0ZfUE9MTCAgIDB4NDAKKworLyogRXJyb3IgQ29kZXMgZm9yIE9SQ1NDQl9IYVN0YXQgKi8KKyNkZWZpbmUgSE9TVF9TRUxfVE9VVAkweDExCisjZGVmaW5lIEhPU1RfRE9fRFUJMHgxMgorI2RlZmluZSBIT1NUX0JVU19GUkVFCTB4MTMKKyNkZWZpbmUgSE9TVF9CQURfUEhBUwkweDE0CisjZGVmaW5lIEhPU1RfSU5WX0NNRAkweDE2CisjZGVmaW5lIEhPU1RfU0NTSV9SU1QJMHgxQgorI2RlZmluZSBIT1NUX0RFVl9SU1QJMHgxQworCisKKy8qIEVycm9yIENvZGVzIGZvciBPUkNTQ0JfVGFTdGF0ICovCisjZGVmaW5lIFRBUkdFVF9DSEtfQ09ORAkweDAyCisjZGVmaW5lIFRBUkdFVF9CVVNZCTB4MDgKKyNkZWZpbmUgVEFSR0VUX1RBR19GVUxMCTB4MjgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJVGFyZ2V0IERldmljZSBDb250cm9sIFN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgT1JDX1Rhcl9DdHJsX1N0cnVjIHsKKwlVQllURSBUQ1NfRHJ2REFTRDsJLyogNiAqLworCVVCWVRFIFRDU19EcnZTQ1NJOwkvKiA3ICovCisJVUJZVEUgVENTX0RydkhlYWQ7CS8qIDggKi8KKwlVV09SRCBUQ1NfRHJ2RmxhZ3M7CS8qIDQgKi8KKwlVQllURSBUQ1NfRHJ2U2VjdG9yOwkvKiA3ICovCit9IE9SQ19UQ1M7CisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBUQ0ZfRHJ2RmxhZ3MgKi8KKyNkZWZpbmUJVENTX0RGX05PREFTRF9TVVBUCTB4MjAJLyogU3VwcHJlc3MgT1MvMiBEQVNEIE1nciBzdXBwb3J0ICovCisjZGVmaW5lCVRDU19ERl9OT1NDU0lfU1VQVAkweDQwCS8qIFN1cHByZXNzIE9TLzIgU0NTSSBNZ3Igc3VwcG9ydCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICBIb3N0IEFkYXB0ZXIgQ29udHJvbCBTdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IE9SQ19IYV9DdHJsX1N0cnVjIHsKKwlVU0hPUlQgSENTX0Jhc2U7CS8qIDAwICovCisJVUJZVEUgSENTX0luZGV4OwkvKiAwMiAqLworCVVCWVRFIEhDU19JbnRyOwkJLyogMDQgKi8KKwlVQllURSBIQ1NfU0NTSV9JRDsJLyogMDYgICAgSC9BIFNDU0kgSUQgKi8KKwlVQllURSBIQ1NfQklPUzsJCS8qIDA3ICAgIEJJT1MgY29uZmlndXJhdGlvbiAqLworCisJVUJZVEUgSENTX0ZsYWdzOwkvKiAwQiAqLworCVVCWVRFIEhDU19IQUNvbmZpZzE7CS8qIDFCICAgIFNDU0kwTUFYVGFncyAqLworCVVCWVRFIEhDU19NYXhUYXI7CS8qIDFCICAgIFNDU0kwTUFYVGFncyAqLworCisJVVNIT1JUIEhDU19Vbml0czsJLyogTnVtYmVyIG9mIHVuaXRzIHRoaXMgYWRhcHRlciAgKi8KKwlVU0hPUlQgSENTX0FGbGFnczsJLyogQWRhcHRlciBpbmZvLiBkZWZpbmVkIGZsYWdzICAgKi8KKwlVTE9ORyBIQ1NfVGltZW91dDsJLyogQWRhcHRlciB0aW1lb3V0IHZhbHVlICAgKi8KKwlPUkNfU0NCICpIQ1NfdmlyU2NiQXJyYXk7CS8qIDI4IFZpcnR1YWwgUG9pbnRlciB0byBTQ0IgYXJyYXkgKi8KKwlkbWFfYWRkcl90IEhDU19waHlzU2NiQXJyYXk7CS8qIFNjYiBQaHlzaWNhbCBhZGRyZXNzICovCisJRVNDQiAqSENTX3ZpckVzY2JBcnJheTsJLyogVmlydHVhbCBwb2ludGVyIHRvIEVTQ0IgU2NhdHRlciBsaXN0ICovCisJZG1hX2FkZHJfdCBIQ1NfcGh5c0VzY2JBcnJheTsJLyogc2NhdHRlciBsaXN0IFBoeXNpY2FsIGFkZHJlc3MgKi8KKwlVQllURSBUYXJnZXRGbGFnWzE2XTsJLyogMzAgIHRhcmdldCBjb25maWd1cmF0aW9uLCBUQ0ZfRU5fVEFHICovCisJVUJZVEUgTWF4aW11bVRhZ3NbMTZdOwkvKiA0MCAgT1JDX01BWF9TQ0JTICovCisJVUJZVEUgQWN0aXZlVGFnc1sxNl1bMTZdOwkvKiA1MCAqLworCU9SQ19UQ1MgSENTX1Rjc1sxNl07CS8qIDI4ICovCisJVTMyIEJpdEFsbG9jRmxhZ1tNQVhfQ0hBTk5FTFNdWzhdOwkvKiBNYXggU1RCIGlzIDI1NiwgU28gMjU2LzMyICovCisJc3BpbmxvY2tfdCBCaXRBbGxvY0ZsYWdMb2NrOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworfSBPUkNfSENTOworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgSENTX0ZsYWdzICovCisKKyNkZWZpbmUgSENGX1NDU0lfUkVTRVQJMHgwMQkvKiBTQ1NJIEJVUyBSRVNFVCAgICAgICAgICovCisjZGVmaW5lIEhDRl9QQVJJVFkgICAgCTB4MDIJLyogcGFyaXR5IGNhcmQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDRl9MVkRTICAgICAJMHgxMAkvKiBwYXJpdHkgY2FyZCAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQml0IERlZmluaXRpb24gZm9yIFRhcmdldEZsYWcgKi8KKworI2RlZmluZSBUQ0ZfRU5fMjU1CSAgICAweDA4CisjZGVmaW5lIFRDRl9FTl9UQUcJICAgIDB4MTAKKyNkZWZpbmUgVENGX0JVU1kJICAgICAgMHgyMAorI2RlZmluZSBUQ0ZfRElTQ09OTkVDVAkweDQwCisjZGVmaW5lIFRDRl9TUElOX1VQCSAgMHg4MAorCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgSENTX0FGbGFncyAqLworI2RlZmluZQlIQ1NfQUZfSUdOT1JFCQkweDAxCS8qIEFkYXB0ZXIgaWdub3JlICAgICAgICAgKi8KKyNkZWZpbmUJSENTX0FGX0RJU0FCTEVfUkVTRVQJMHgxMAkvKiBBZGFwdGVyIGRpc2FibGUgcmVzZXQgICovCisjZGVmaW5lCUhDU19BRl9ESVNBQkxFX0FEUFQJMHg4MAkvKiBBZGFwdGVyIGRpc2FibGUgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX05WUkFNIHsKKy8qLS0tLS0tLS0tLWhlYWRlciAtLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBVQ0hBUiBTdWJWZW5kb3JJRDA7ICAgICAvKiAwMCAtIFN1YiBWZW5kb3IgSUQgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFN1YlZlbmRvcklEMTsgICAgIC8qIDAwIC0gU3ViIFZlbmRvciBJRCAgICAgICAgICAgKi8KKyAgICAgICAgVUNIQVIgU3ViU3lzSUQwOyAgICAgICAgLyogMDIgLSBTdWIgU3lzdGVtIElEICAgICAgICAgICAqLworICAgICAgICBVQ0hBUiBTdWJTeXNJRDE7ICAgICAgICAvKiAwMiAtIFN1YiBTeXN0ZW0gSUQgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFN1YkNsYXNzOyAgICAgICAgIC8qIDA0IC0gU3ViIENsYXNzICAgICAgICAgICAgICAgKi8KKyAgICAgICAgVUNIQVIgVmVuZG9ySUQwOyAgICAgICAgLyogMDUgLSBWZW5kb3IgSUQgICAgICAgICAgICAgICAqLworICAgICAgICBVQ0hBUiBWZW5kb3JJRDE7ICAgICAgICAvKiAwNSAtIFZlbmRvciBJRCAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIERldmljZUlEMDsgICAgICAgIC8qIDA3IC0gRGV2aWNlIElEICAgICAgICAgICAgICAgKi8KKyAgICAgICAgVUNIQVIgRGV2aWNlSUQxOyAgICAgICAgLyogMDcgLSBEZXZpY2UgSUQgICAgICAgICAgICAgICAqLworICAgICAgICBVQ0hBUiBSZXNlcnZlZDBbMl07ICAgICAvKiAwOSAtIFJlc2VydmVkICAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFJldmlzaW9uOyAgICAgICAgIC8qIDBCIC0gUmV2aXNpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgLyogLS0tLUhvc3QgQWRhcHRlciBTdHJ1Y3R1cmUgLS0tLSAqLworICAgICAgICBVQ0hBUiBOdW1PZkNoOyAgICAgICAgICAvKiAwQyAtIE51bWJlciBvZiBTQ1NJIGNoYW5uZWwgICovCisgICAgICAgIFVDSEFSIEJJT1NDb25maWcxOyAgICAgIC8qIDBEIC0gQklPUyBjb25maWd1cmF0aW9uIDEgICAgKi8KKyAgICAgICAgVUNIQVIgQklPU0NvbmZpZzI7ICAgICAgLyogMEUgLSBCSU9TIGJvb3QgY2hhbm5lbCZ0YXJnZXQgSUQgKi8KKyAgICAgICAgVUNIQVIgQklPU0NvbmZpZzM7ICAgICAgLyogMEYgLSBCSU9TIGNvbmZpZ3VyYXRpb24gMyAgICAqLworICAgICAgICAvKiAtLS0tU0NTSSBjaGFubmVsIFN0cnVjdHVyZSAtLS0tICovCisgICAgICAgIC8qIGZyb20gIkNUUkwtSSBTQ1NJIEhvc3QgQWRhcHRlciBTZXRVcCBtZW51ICIgICovCisgICAgICAgIFVDSEFSIFNDU0kwSWQ7ICAgICAgICAgIC8qIDEwIC0gQ2hhbm5lbCAwIFNDU0kgSUQgICAgICAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTBDb25maWc7ICAgICAgLyogMTEgLSBDaGFubmVsIDAgU0NTSSBjb25maWd1cmF0aW9uICovCisgICAgICAgIFVDSEFSIFNDU0kwTWF4VGFnczsgICAgIC8qIDEyIC0gQ2hhbm5lbCAwIE1heGltdW0gdGFncyAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTBSZXNldFRpbWU7ICAgLyogMTMgLSBDaGFubmVsIDAgUmVzZXQgcmVjb3ZlcmluZyB0aW1lICovCisgICAgICAgIFVDSEFSIFJlc2VydmVkZm9yQ2hhbm5lbDBbMl07ICAgLyogMTQgLSBSZXNlcnZlZCAgICAgICAgICAgICAgICAqLworCisgICAgICAgIC8qIC0tLS1TQ1NJIHRhcmdldCBTdHJ1Y3R1cmUgLS0tLSAgKi8KKyAgICAgICAgLyogZnJvbSAiQ1RSTC1JIFNDU0kgZGV2aWNlIFNldFVwIG1lbnUgIiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFRhcmdldDAwQ29uZmlnOyAgIC8qIDE2IC0gQ2hhbm5lbCAwIFRhcmdldCAwIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwMUNvbmZpZzsgICAvKiAxNyAtIENoYW5uZWwgMCBUYXJnZXQgMSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MDJDb25maWc7ICAgLyogMTggLSBDaGFubmVsIDAgVGFyZ2V0IDIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDAzQ29uZmlnOyAgIC8qIDE5IC0gQ2hhbm5lbCAwIFRhcmdldCAzIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwNENvbmZpZzsgICAvKiAxQSAtIENoYW5uZWwgMCBUYXJnZXQgNCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MDVDb25maWc7ICAgLyogMUIgLSBDaGFubmVsIDAgVGFyZ2V0IDUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDA2Q29uZmlnOyAgIC8qIDFDIC0gQ2hhbm5lbCAwIFRhcmdldCA2IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwN0NvbmZpZzsgICAvKiAxRCAtIENoYW5uZWwgMCBUYXJnZXQgNyBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MDhDb25maWc7ICAgLyogMUUgLSBDaGFubmVsIDAgVGFyZ2V0IDggY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDA5Q29uZmlnOyAgIC8qIDFGIC0gQ2hhbm5lbCAwIFRhcmdldCA5IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwQUNvbmZpZzsgICAvKiAyMCAtIENoYW5uZWwgMCBUYXJnZXQgQSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MEJDb25maWc7ICAgLyogMjEgLSBDaGFubmVsIDAgVGFyZ2V0IEIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDBDQ29uZmlnOyAgIC8qIDIyIC0gQ2hhbm5lbCAwIFRhcmdldCBDIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQwRENvbmZpZzsgICAvKiAyMyAtIENoYW5uZWwgMCBUYXJnZXQgRCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MEVDb25maWc7ICAgLyogMjQgLSBDaGFubmVsIDAgVGFyZ2V0IEUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDBGQ29uZmlnOyAgIC8qIDI1IC0gQ2hhbm5lbCAwIFRhcmdldCBGIGNvbmZpZyAqLworCisgICAgICAgIFVDSEFSIFNDU0kxSWQ7ICAgICAgICAgIC8qIDI2IC0gQ2hhbm5lbCAxIFNDU0kgSUQgICAgICAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTFDb25maWc7ICAgICAgLyogMjcgLSBDaGFubmVsIDEgU0NTSSBjb25maWd1cmF0aW9uICovCisgICAgICAgIFVDSEFSIFNDU0kxTWF4VGFnczsgICAgIC8qIDI4IC0gQ2hhbm5lbCAxIE1heGltdW0gdGFncyAgKi8KKyAgICAgICAgVUNIQVIgU0NTSTFSZXNldFRpbWU7ICAgLyogMjkgLSBDaGFubmVsIDEgUmVzZXQgcmVjb3ZlcmluZyB0aW1lICovCisgICAgICAgIFVDSEFSIFJlc2VydmVkZm9yQ2hhbm5lbDFbMl07ICAgLyogMkEgLSBSZXNlcnZlZCAgICAgICAgICAgICAgICAqLworCisgICAgICAgIC8qIC0tLS1TQ1NJIHRhcmdldCBTdHJ1Y3R1cmUgLS0tLSAgKi8KKyAgICAgICAgLyogZnJvbSAiQ1RSTC1JIFNDU0kgZGV2aWNlIFNldFVwIG1lbnUgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIFVDSEFSIFRhcmdldDEwQ29uZmlnOyAgIC8qIDJDIC0gQ2hhbm5lbCAxIFRhcmdldCAwIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxMUNvbmZpZzsgICAvKiAyRCAtIENoYW5uZWwgMSBUYXJnZXQgMSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MTJDb25maWc7ICAgLyogMkUgLSBDaGFubmVsIDEgVGFyZ2V0IDIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDEzQ29uZmlnOyAgIC8qIDJGIC0gQ2hhbm5lbCAxIFRhcmdldCAzIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxNENvbmZpZzsgICAvKiAzMCAtIENoYW5uZWwgMSBUYXJnZXQgNCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MTVDb25maWc7ICAgLyogMzEgLSBDaGFubmVsIDEgVGFyZ2V0IDUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDE2Q29uZmlnOyAgIC8qIDMyIC0gQ2hhbm5lbCAxIFRhcmdldCA2IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxN0NvbmZpZzsgICAvKiAzMyAtIENoYW5uZWwgMSBUYXJnZXQgNyBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MThDb25maWc7ICAgLyogMzQgLSBDaGFubmVsIDEgVGFyZ2V0IDggY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDE5Q29uZmlnOyAgIC8qIDM1IC0gQ2hhbm5lbCAxIFRhcmdldCA5IGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxQUNvbmZpZzsgICAvKiAzNiAtIENoYW5uZWwgMSBUYXJnZXQgQSBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MUJDb25maWc7ICAgLyogMzcgLSBDaGFubmVsIDEgVGFyZ2V0IEIgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDFDQ29uZmlnOyAgIC8qIDM4IC0gQ2hhbm5lbCAxIFRhcmdldCBDIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiBUYXJnZXQxRENvbmZpZzsgICAvKiAzOSAtIENoYW5uZWwgMSBUYXJnZXQgRCBjb25maWcgKi8KKyAgICAgICAgVUNIQVIgVGFyZ2V0MUVDb25maWc7ICAgLyogM0EgLSBDaGFubmVsIDEgVGFyZ2V0IEUgY29uZmlnICovCisgICAgICAgIFVDSEFSIFRhcmdldDFGQ29uZmlnOyAgIC8qIDNCIC0gQ2hhbm5lbCAxIFRhcmdldCBGIGNvbmZpZyAqLworICAgICAgICBVQ0hBUiByZXNlcnZlZFszXTsgICAgICAvKiAzQyAtIFJlc2VydmVkICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0gQ2hlY2tTdW0gLS0tLS0tLS0tLSAgICAgICAqLworICAgICAgICBVQ0hBUiBDaGVja1N1bTsgICAgICAgICAvKiAzRiAtIENoZWNrc3VtIG9mIE5WUmFtICAgICAgICovCit9IE5WUkFNLCAqUE5WUkFNOworCisvKiBCaW9zIENvbmZpZ3VyYXRpb24gZm9yIG52cmFtLT5CSU9TQ29uZmlnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQkNfQklPU0VOQUJMRSAgMHgwMSAgICAvKiBCSU9TIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJDX0NEUk9NICAgICAgIDB4MDIgICAgLyogU3VwcG9ydCBib290YWJsZSBDRFJPTSAqLworI2RlZmluZSBOQkNfUkVNT1ZBQkxFICAgMHgwNCAgICAvKiBTdXBwb3J0IHJlbW92YWJsZSBkcml2ZSAgICAgICAgKi8KKworLyogQmlvcyBDb25maWd1cmF0aW9uIGZvciBudnJhbS0+QklPU0NvbmZpZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJCX1RBUkdFVF9NQVNLIDB4MEYgICAgLyogQm9vdCBTQ1NJIHRhcmdldCBJRCBudW1iZXIgICAgICovCisjZGVmaW5lIE5CQl9DSEFOTF9NQVNLICAweEYwICAgIC8qIEJvb3QgU0NTSSBjaGFubmVsIG51bWJlciAgICAgICAqLworCisvKiBCaXQgZGVmaW5pdGlvbiBmb3IgbnZyYW0tPlNDU0lDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQ0NfQlVTUkVTRVQgICAgMHgwMSAgICAvKiBSZXNldCBTQ1NJIGJ1cyBhdCBwb3dlciB1cCAgICAgKi8KKyNkZWZpbmUgTkNDX1BBUklUWUNISyAgIDB4MDIgICAgLyogU0NTSSBwYXJpdHkgZW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIE5DQ19MVkRTICAgICAgICAweDEwICAgIC8qIEVuYWJsZSBMVkRTICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOQ0NfQUNUVEVSTTEgICAgMHgyMCAgICAvKiBFbmFibGUgYWN0aXZlIHRlcm1pbmF0b3IgMSAgICAgKi8KKyNkZWZpbmUgTkNDX0FDVFRFUk0yICAgIDB4NDAgICAgLyogRW5hYmxlIGFjdGl2ZSB0ZXJtaW5hdG9yIDIgICAgICovCisjZGVmaW5lIE5DQ19BVVRPVEVSTSAgICAweDgwICAgIC8qIEVuYWJsZSBhdXRvIHRlcm1pbmF0aW9uICAgICAgICAqLworCisvKiBCaXQgZGVmaW5pdGlvbiBmb3IgbnZyYW0tPlRhcmdldHhDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOVENfUEVSSU9EICAgICAgMHgwNyAgICAvKiBNYXhpbXVtIFN5bmMuIFNwZWVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDXzFHSUdBICAgICAgIDB4MDggICAgLyogMjU1IGhlYWQgLyA2MyBzZWN0b3JzICg2NC8zMikgKi8KKyNkZWZpbmUgTlRDX05PX1NZTkMgICAgIDB4MTAgICAgLyogTk8gU1lOQy4gTkVHTyAgICAgICAgICAqLworI2RlZmluZSBOVENfTk9fV0lERVNZTkMgMHgyMCAgICAvKiBOTyBXSURFIFNZTkMuIE5FR08gICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDX0RJU0NfRU5BQkxFIDB4NDAgICAgLyogRW5hYmxlIFNDU0kgZGlzY29ubmVjdCAqLworI2RlZmluZSBOVENfU1BJTlVQICAgICAgMHg4MCAgICAvKiBTdGFydCBkaXNrIGRyaXZlICAgICAgICAgICAgICAgKi8KKworLyogRGVmYXVsdCBOVlJhbSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJDX0RFRkFVTFQgICAgIChOQkNfRU5BQkxFKQorI2RlZmluZSBOQ0NfREVGQVVMVCAgICAgKE5DQ19CVVNSRVNFVCB8IE5DQ19BVVRPVEVSTSB8IE5DQ19QQVJJVFlDSEspCisjZGVmaW5lIE5DQ19NQVhfVEFHUyAgICAweDIwICAgIC8qIE1heGltdW0gdGFncyBwZXIgdGFyZ2V0ICAgICAgICAqLworI2RlZmluZSBOQ0NfUkVTRVRfVElNRSAgMHgwQSAgICAvKiBTQ1NJIFJFU0VUIHJlY292ZXJpbmcgdGltZSAgICAgKi8KKyNkZWZpbmUgTlRDX0RFRkFVTFQgICAgIChOVENfMUdJR0EgfCBOVENfTk9fV0lERVNZTkMgfCBOVENfRElTQ19FTkFCTEUpCisKKyNkZWZpbmUgT1JDX1JEKHgseSkgICAgICAgICAgICAgKFVDSEFSKShpbmIoICAoaW50KSgoVUxPTkcpKChVTE9ORyl4KyhVQ0hBUil5KSkgKSkKKyNkZWZpbmUgT1JDX1JEV09SRCh4LHkpICAgICAgICAgKHNob3J0KShpbmwoKGludCkoKFVMT05HKSgoVUxPTkcpeCsoVUNIQVIpeSkpICkpCisjZGVmaW5lIE9SQ19SRExPTkcoeCx5KSAgICAgICAgIChsb25nKShpbmwoKGludCkoKFVMT05HKSgoVUxPTkcpeCsoVUNIQVIpeSkpICkpCisKKyNkZWZpbmUgT1JDX1dSKCAgICAgYWRyLGRhdGEpICAgb3V0YiggKFVDSEFSKShkYXRhKSwgKGludCkoYWRyKSkKKyNkZWZpbmUgT1JDX1dSU0hPUlQoYWRyLGRhdGEpICAgb3V0dyggKFVXT1JEKShkYXRhKSwgKGludCkoYWRyKSkKKyNkZWZpbmUgT1JDX1dSTE9ORyggYWRyLGRhdGEpICAgb3V0bCggKFVMT05HKShkYXRhKSwgKGludCkoYWRyKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5jIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyOGEyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hMjA5MS5jCkBAIC0wLDAgKzEsMjYwIEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAid2QzM2M5My5oIgorI2luY2x1ZGUgImEyMDkxLmgiCisKKyNpbmNsdWRlPGxpbnV4L3N0YXQuaD4KKworI2RlZmluZSBETUEocHRyKSAoKGEyMDkxX3Njc2lyZWdzICopKChwdHIpLT5iYXNlKSkKKyNkZWZpbmUgSERBVEEocHRyKSAoKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopKChwdHIpLT5ob3N0ZGF0YSkpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhMjA5MV9pbnRyIChpbnQgaXJxLCB2b2lkICpfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGludCBzdGF0dXM7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSAoc3RydWN0IFNjc2lfSG9zdCAqKV9pbnN0YW5jZTsKKworICAgIHN0YXR1cyA9IERNQShpbnN0YW5jZSktPklTVFI7CisgICAgaWYgKCEoc3RhdHVzICYgKElTVFJfSU5UX0Z8SVNUUl9JTlRfUCkpIHx8ICEoc3RhdHVzICYgSVNUUl9JTlRTKSkKKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgd2QzM2M5M19pbnRyKGluc3RhbmNlKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3NldHVwIChTY3NpX0NtbmQgKmNtZCwgaW50IGRpcl9pbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX2J1cyhjbWQtPlNDcC5wdHIpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7CisKKyAgICAvKiBkb24ndCBhbGxvdyBETUEgaWYgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgYmFkICovCisgICAgaWYgKGFkZHIgJiBBMjA5MV9YRkVSX01BU0sgfHwKKwkoIWRpcl9pbiAmJiBtbV9lbmRfb2ZfY2h1bmsgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKSkKKyAgICB7CisJSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICsgNTExKQorCSAgICAmIH4weDFmZjsKKwlIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyID0KKwkgICAga21hbGxvYyAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiwgR0ZQX0tFUk5FTCk7CisJCisJLyogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5OyB1c2UgUElPICovCisJaWYgKCFIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyKSB7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9sZW4gPSAwOworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvdW5jZSBidWZmZXIgKi8KKwlhZGRyID0gdmlydF90b19idXMoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisKKwkvKiB0aGUgYm91bmNlIGJ1ZmZlciBtYXkgbm90IGJlIGluIHRoZSBmaXJzdCAxNk0gb2YgcGh5c21lbSAqLworCWlmIChhZGRyICYgQTIwOTFfWEZFUl9NQVNLKSB7CisJICAgIC8qIHdlIGNvdWxkIHVzZSBjaGlwbWVtLi4uIG1heWJlIGxhdGVyICovCisJICAgIGtmcmVlIChIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyKTsKKwkgICAgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlciA9IE5VTEw7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9sZW4gPSAwOworCSAgICByZXR1cm4gMTsKKwl9CisKKwlpZiAoIWRpcl9pbikgeworCSAgICAvKiBjb3B5IHRvIGJvdW5jZSBidWZmZXIgZm9yIGEgd3JpdGUgKi8KKwkgICAgaWYgKGNtZC0+dXNlX3NnKQorI2lmIDAKKwkJcGFuaWMgKCJzY3NpJWRkbWE6IGluY29tcGxldGUgcy9nIHN1cHBvcnQiLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3Rfbm8pOworI2Vsc2UKKwkJbWVtY3B5IChIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkJY21kLT5TQ3AucHRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyNlbmRpZgorCSAgICBlbHNlCisJCW1lbWNweSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJCWNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9CisgICAgfQorCisgICAgLyogc2V0dXAgZG1hIGRpcmVjdGlvbiAqLworICAgIGlmICghZGlyX2luKQorCWNudHIgfD0gQ05UUl9ERElSOworCisgICAgLyogcmVtZW1iZXIgZGlyZWN0aW9uICovCisgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfZGlyID0gZGlyX2luOworCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+Q05UUiA9IGNudHI7CisKKyAgICAvKiBzZXR1cCBETUEgKnBoeXNpY2FsKiBhZGRyZXNzICovCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+QUNSID0gYWRkcjsKKworICAgIGlmIChkaXJfaW4peworCS8qIGludmFsaWRhdGUgYW55IGNhY2hlICovCisJY2FjaGVfY2xlYXIgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIH1lbHNleworCS8qIHB1c2ggYW55IGRpcnR5IGNhY2hlICovCisJY2FjaGVfcHVzaCAoYWRkciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisgICAgICB9CisgICAgLyogc3RhcnQgRE1BICovCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+U1RfRE1BID0gMTsKKworICAgIC8qIHJldHVybiBzdWNjZXNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zdG9wIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpTQ3BudCwgCisJCSAgICAgIGludCBzdGF0dXMpCit7CisgICAgLyogZGlzYWJsZSBTQ1NJIGludGVycnVwdHMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gQ05UUl9QRE1EOworCisgICAgaWYgKCFIREFUQShpbnN0YW5jZSktPmRtYV9kaXIpCisJICAgIGNudHIgfD0gQ05UUl9ERElSOworCisgICAgLyogZGlzYWJsZSBTQ1NJIGludGVycnVwdHMgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gY250cjsKKworICAgIC8qIGZsdXNoIGlmIHdlIHdlcmUgcmVhZGluZyAqLworICAgIGlmIChIREFUQShpbnN0YW5jZSktPmRtYV9kaXIpIHsKKwlETUEoaW5zdGFuY2UpLT5GTFVTSCA9IDE7CisJd2hpbGUgKCEoRE1BKGluc3RhbmNlKS0+SVNUUiAmIElTVFJfRkVfRkxHKSkKKwkgICAgOworICAgIH0KKworICAgIC8qIGNsZWFyIGEgcG9zc2libGUgaW50ZXJydXB0ICovCisgICAgRE1BKGluc3RhbmNlKS0+Q0lOVCA9IDE7CisKKyAgICAvKiBzdG9wIERNQSAqLworICAgIERNQShpbnN0YW5jZSktPlNQX0RNQSA9IDE7CisKKyAgICAvKiByZXN0b3JlIHRoZSBDT05UUk9MIGJpdHMgKG1pbnVzIHRoZSBkaXJlY3Rpb24gZmxhZykgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKworICAgIC8qIGNvcHkgZnJvbSBhIGJvdW5jZSBidWZmZXIsIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChzdGF0dXMgJiYgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcikgeworCWlmIChTQ3BudCAmJiBTQ3BudC0+dXNlX3NnKSB7CisjaWYgMAorCSAgICBwYW5pYyAoInNjc2klZDogaW5jb21wbGV0ZSBzL2cgc3VwcG9ydCIsCisJCSAgIGluc3RhbmNlLT5ob3N0X25vKTsKKyNlbHNlCisJICAgIGlmKCBIREFUQShpbnN0YW5jZSktPmRtYV9kaXIgKQorCQltZW1jcHkgKFNDcG50LT5TQ3AucHRyLCAKKwkJCUhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIsCisJCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCSAgICBrZnJlZSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIgPSBOVUxMOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwkgICAgCisjZW5kaWYKKwl9IGVsc2UgeworCSAgICBpZiAoSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyICYmIFNDcG50KQorCQltZW1jcHkgKFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCUhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIsCisJCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKworCSAgICBrZnJlZSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIgPSBOVUxMOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwl9CisgICAgfQorfQorCitpbnQgX19pbml0IGEyMDkxX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FsbGVkID0gMDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisgICAgc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7CisgICAgd2QzM2M5M19yZWdzIHJlZ3M7CisgICAgaW50IG51bV9hMjA5MSA9IDA7CisKKyAgICBpZiAoIU1BQ0hfSVNfQU1JR0EgfHwgY2FsbGVkKQorCXJldHVybiAwOworICAgIGNhbGxlZCA9IDE7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiQTIwOTEiOworICAgIHRwbnQtPnByb2NfaW5mbyA9ICZ3ZDMzYzkzX3Byb2NfaW5mbzsKKworICAgIHdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkpIHsKKwlpZiAoei0+aWQgIT0gWk9SUk9fUFJPRF9DQk1fQTU5MF9BMjA5MV8xICYmCisJICAgIHotPmlkICE9IFpPUlJPX1BST0RfQ0JNX0E1OTBfQTIwOTFfMikKKwkgICAgY29udGludWU7CisJYWRkcmVzcyA9IHotPnJlc291cmNlLnN0YXJ0OworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1NiwgIndkMzNjOTMiKSkKKwkgICAgY29udGludWU7CisKKwlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKKwlpZiAoaW5zdGFuY2UgPT0gTlVMTCkgeworCSAgICByZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgMjU2KTsKKwkgICAgY29udGludWU7CisJfQorCWluc3RhbmNlLT5iYXNlID0gWlRXT19WQUREUihhZGRyZXNzKTsKKwlpbnN0YW5jZS0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCWluc3RhbmNlLT51bmlxdWVfaWQgPSB6LT5zbG90YWRkcjsKKwlETUEoaW5zdGFuY2UpLT5EQVdSID0gREFXUl9BMjA5MTsKKwlyZWdzLlNBU1IgPSAmKERNQShpbnN0YW5jZSktPlNBU1IpOworCXJlZ3MuU0NNRCA9ICYoRE1BKGluc3RhbmNlKS0+U0NNRCk7CisJd2QzM2M5M19pbml0KGluc3RhbmNlLCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzhfMTApOworCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgYTIwOTFfaW50ciwgU0FfU0hJUlEsICJBMjA5MSBTQ1NJIiwKKwkJICAgIGluc3RhbmNlKTsKKwlETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKwludW1fYTIwOTErKzsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtX2EyMDkxOworfQorCitzdGF0aWMgaW50IGEyMDkxX2J1c19yZXNldChTY3NpX0NtbmQgKmNtZCkKK3sKKwkvKiBGSVhNRSBwZXJmb3JtIGJ1cy1zcGVjaWZpYyByZXNldCAqLworCXdkMzNjOTNfaG9zdF9yZXNldChjbWQpOworCXJldHVybiBTVUNDRVNTOworfQorCisjZGVmaW5lIEhPU1RTX0MKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiQTI5MDEiLAorCS5uYW1lCQkJPSAiQ29tbW9kb3JlIEEyMDkxL0E1OTAgU0NTSSIsCisJLmRldGVjdAkJCT0gYTIwOTFfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGEyMDkxX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYTIwOTFfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSB3ZDMzYzkzX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworaW50IGEyMDkxX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJRE1BKGluc3RhbmNlKS0+Q05UUiA9IDA7CisJcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoaW5zdGFuY2UtPmJhc2UpLCAyNTYpOworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgaW5zdGFuY2UpOworCXdkMzNjOTNfcmVsZWFzZSgpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5oIGIvZHJpdmVycy9zY3NpL2EyMDkxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5OTM5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hMjA5MS5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgQTIwOTFfSAorI2RlZmluZSBBMjA5MV9ICisKKy8qICRJZDogYTIwOTEuaCx2IDEuNCAxOTk3LzAxLzE5IDIzOjA3OjA5IGRhdmVtIEV4cCAkCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBDb21tb2RvcmUgQTIwOTEgWm9ycm8gSUkgU0NTSSBjb250cm9sbGVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYW5kIChDKSAxOTkzLCBIYW1pc2ggTWFjZG9uYWxkLCBzZWUgYTIwOTEuYyBmb3IgbW9yZSBpbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYTIwOTFfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBhMjA5MV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICp3ZDMzYzkzX2luZm8odm9pZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IHdkMzNjOTNfYWJvcnQoU2NzaV9DbW5kICopOworaW50IHdkMzNjOTNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKy8qCisgKiBpZiB0aGUgdHJhbnNmZXIgYWRkcmVzcyBBTkRlZCB3aXRoIHRoaXMgcmVzdWx0cyBpbiBhIG5vbi16ZXJvCisgKiByZXN1bHQsIHRoZW4gd2UgY2FuJ3QgdXNlIERNQS4KKyAqLworI2RlZmluZSBBMjA5MV9YRkVSX01BU0sgICgweGZmMDAwMDAxKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDFbNjRdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBJU1RSOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBDTlRSOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQyWzYwXTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgICAgICAgV1RDOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICAgICBBQ1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDNbNl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIERBV1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDQ7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNBU1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDU7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNDTUQ7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDZbNzZdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTVF9ETUE7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIFNQX0RNQTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgQ0lOVDsKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgcGFkN1syXTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgRkxVU0g7Cit9IGEyMDkxX3Njc2lyZWdzOworCisjZGVmaW5lIERBV1JfQTIwOTEJCSgzKQorCisvKiBDTlRSIGJpdHMuICovCisjZGVmaW5lIENOVFJfVENFTgkJKDE8PDcpCisjZGVmaW5lIENOVFJfUFJFU1QJCSgxPDw2KQorI2RlZmluZSBDTlRSX1BETUQJCSgxPDw1KQorI2RlZmluZSBDTlRSX0lOVEVOCQkoMTw8NCkKKyNkZWZpbmUgQ05UUl9ERElSCQkoMTw8MykKKworLyogSVNUUiBiaXRzLiAqLworI2RlZmluZSBJU1RSX0lOVFgJCSgxPDw4KQorI2RlZmluZSBJU1RSX0lOVF9GCQkoMTw8NykKKyNkZWZpbmUgSVNUUl9JTlRTCQkoMTw8NikKKyNkZWZpbmUgSVNUUl9FX0lOVAkJKDE8PDUpCisjZGVmaW5lIElTVFJfSU5UX1AJCSgxPDw0KQorI2RlZmluZSBJU1RSX1VFX0lOVAkJKDE8PDMpCisjZGVmaW5lIElTVFJfT0VfSU5UCQkoMTw8MikKKyNkZWZpbmUgSVNUUl9GRl9GTEcJCSgxPDwxKQorI2RlZmluZSBJU1RSX0ZFX0ZMRwkJKDE8PDApCisKKyNlbmRpZiAvKiBBMjA5MV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTMwMDAuYyBiL2RyaXZlcnMvc2NzaS9hMzAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTg5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYTMwMDAuYwpAQCAtMCwwICsxLDI0NSBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIndkMzNjOTMuaCIKKyNpbmNsdWRlICJhMzAwMC5oIgorCisjaW5jbHVkZTxsaW51eC9zdGF0Lmg+CisKKyNkZWZpbmUgRE1BKHB0cikgKChhMzAwMF9zY3NpcmVncyAqKSgocHRyKS0+YmFzZSkpCisjZGVmaW5lIEhEQVRBKHB0cikgKChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSgocHRyKS0+aG9zdGRhdGEpKQorCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqYTMwMDBfaG9zdCA9IE5VTEw7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhMzAwMF9pbnRyIChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IERNQShhMzAwMF9ob3N0KS0+SVNUUjsKKworCWlmICghKHN0YXR1cyAmIElTVFJfSU5UX1ApKQorCQlyZXR1cm4gSVJRX05PTkU7CisJaWYgKHN0YXR1cyAmIElTVFJfSU5UUykKKwl7CisJCXNwaW5fbG9ja19pcnFzYXZlKGEzMDAwX2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl3ZDMzYzkzX2ludHIgKGEzMDAwX2hvc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGEzMDAwX2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXByaW50aygiTm9uLXNlcnZpY2VkIEEzMDAwIFNDU0ktaW50ZXJydXB0PyBJU1RSID0gJTAyeFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3NldHVwIChTY3NpX0NtbmQgKmNtZCwgaW50IGRpcl9pbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjbnRyID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0X3RvX2J1cyhjbWQtPlNDcC5wdHIpOworCisgICAgLyoKKyAgICAgKiBpZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBoYXMgdGhlIHdyb25nIGFsaWdubWVudCwgb3IgaWYKKyAgICAgKiBwaHlzaWNhbCBhZGRyZXNzIGlzIGJhZCwgb3IgaWYgaXQgaXMgYSB3cml0ZSBhbmQgYXQgdGhlCisgICAgICogZW5kIG9mIGEgcGh5c2ljYWwgbWVtb3J5IGNodW5rLCB0aGVuIGFsbG9jYXRlIGEgYm91bmNlCisgICAgICogYnVmZmVyCisgICAgICovCisgICAgaWYgKGFkZHIgJiBBMzAwMF9YRkVSX01BU0sgfHwKKwkoIWRpcl9pbiAmJiBtbV9lbmRfb2ZfY2h1bmsgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKSkKKyAgICB7CisJSERBVEEoYTMwMDBfaG9zdCktPmRtYV9ib3VuY2VfbGVuID0gKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgKyA1MTEpCisJICAgICYgfjB4MWZmOworCUhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciA9CisJICAgIGttYWxsb2MgKEhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2xlbiwgR0ZQX0tFUk5FTCk7CisJCisJLyogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5OyB1c2UgUElPICovCisJaWYgKCFIREFUQShhMzAwMF9ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpIHsKKwkgICAgSERBVEEoYTMwMDBfaG9zdCktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJaWYgKCFkaXJfaW4pIHsKKwkgICAgLyogY29weSB0byBib3VuY2UgYnVmZmVyIGZvciBhIHdyaXRlICovCisJICAgIGlmIChjbWQtPnVzZV9zZykgeworCQltZW1jcHkgKEhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJCWNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJICAgIH0gZWxzZQorCQltZW1jcHkgKEhEQVRBKGEzMDAwX2hvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJCWNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9CisKKwlhZGRyID0gdmlydF90b19idXMoSERBVEEoYTMwMDBfaG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyKTsKKyAgICB9CisKKyAgICAvKiBzZXR1cCBkbWEgZGlyZWN0aW9uICovCisgICAgaWYgKCFkaXJfaW4pCisJY250ciB8PSBDTlRSX0RESVI7CisKKyAgICAvKiByZW1lbWJlciBkaXJlY3Rpb24gKi8KKyAgICBIREFUQShhMzAwMF9ob3N0KS0+ZG1hX2RpciA9IGRpcl9pbjsKKworICAgIERNQShhMzAwMF9ob3N0KS0+Q05UUiA9IGNudHI7CisKKyAgICAvKiBzZXR1cCBETUEgKnBoeXNpY2FsKiBhZGRyZXNzICovCisgICAgRE1BKGEzMDAwX2hvc3QpLT5BQ1IgPSBhZGRyOworCisgICAgaWYgKGRpcl9pbikKKyAgCS8qIGludmFsaWRhdGUgYW55IGNhY2hlICovCisJY2FjaGVfY2xlYXIgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIGVsc2UKKwkvKiBwdXNoIGFueSBkaXJ0eSBjYWNoZSAqLworCWNhY2hlX3B1c2ggKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCisgICAgLyogc3RhcnQgRE1BICovCisgICAgbWIoKTsJCQkvKiBtYWtlIHN1cmUgc2V0dXAgaXMgY29tcGxldGVkICovCisgICAgRE1BKGEzMDAwX2hvc3QpLT5TVF9ETUEgPSAxOworICAgIG1iKCk7CQkJLyogbWFrZSBzdXJlIERNQSBoYXMgc3RhcnRlZCBiZWZvcmUgbmV4dCBJTyAqLworCisgICAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX3N0b3AgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKlNDcG50LAorCQkgICAgICBpbnQgc3RhdHVzKQoreworICAgIC8qIGRpc2FibGUgU0NTSSBpbnRlcnJ1cHRzICovCisgICAgdW5zaWduZWQgc2hvcnQgY250ciA9IENOVFJfUERNRDsKKworICAgIGlmICghSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyKQorCWNudHIgfD0gQ05UUl9ERElSOworCisgICAgRE1BKGluc3RhbmNlKS0+Q05UUiA9IGNudHI7CisgICAgbWIoKTsJCQkvKiBtYWtlIHN1cmUgQ05UUiBpcyB1cGRhdGVkIGJlZm9yZSBuZXh0IElPICovCisKKyAgICAvKiBmbHVzaCBpZiB3ZSB3ZXJlIHJlYWRpbmcgKi8KKyAgICBpZiAoSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyKSB7CisJRE1BKGluc3RhbmNlKS0+RkxVU0ggPSAxOworCW1iKCk7CQkJLyogZG9uJ3QgYWxsb3cgcHJlZmV0Y2ggKi8KKwl3aGlsZSAoIShETUEoaW5zdGFuY2UpLT5JU1RSICYgSVNUUl9GRV9GTEcpKQorCSAgICBiYXJyaWVyKCk7CisJbWIoKTsJCQkvKiBubyBJTyB1bnRpbCBGTFVTSCBpcyBkb25lICovCisgICAgfQorCisgICAgLyogY2xlYXIgYSBwb3NzaWJsZSBpbnRlcnJ1cHQgKi8KKyAgICAvKiBJIHRoaW5rIHRoYXQgdGhpcyBDSU5UIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUKKyAgICAgKiB1c2luZyB0aGUgdGVybWluYWwgY291bnQgZmVhdHVyZXMuICAgSE0gNyBNYXIgMTk5NAorICAgICAqLworICAgIERNQShpbnN0YW5jZSktPkNJTlQgPSAxOworCisgICAgLyogc3RvcCBETUEgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5TUF9ETUEgPSAxOworICAgIG1iKCk7CQkJLyogbWFrZSBzdXJlIERNQSBpcyBzdG9wcGVkIGJlZm9yZSBuZXh0IElPICovCisKKyAgICAvKiByZXN0b3JlIHRoZSBDT05UUk9MIGJpdHMgKG1pbnVzIHRoZSBkaXJlY3Rpb24gZmxhZykgKi8KKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKyAgICBtYigpOwkJCS8qIG1ha2Ugc3VyZSBDTlRSIGlzIHVwZGF0ZWQgYmVmb3JlIG5leHQgSU8gKi8KKworICAgIC8qIGNvcHkgZnJvbSBhIGJvdW5jZSBidWZmZXIsIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChzdGF0dXMgJiYgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcikgeworCWlmIChTQ3BudCAmJiBTQ3BudC0+dXNlX3NnKSB7CisJICAgIGlmIChIREFUQShpbnN0YW5jZSktPmRtYV9kaXIgJiYgU0NwbnQpCisJCW1lbWNweSAoU0NwbnQtPlNDcC5wdHIsCisJCQlIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkgICAga2ZyZWUgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyID0gTlVMTDsKKwkgICAgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IDA7CisJfSBlbHNlIHsKKwkgICAgaWYgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2RpciAmJiBTQ3BudCkKKwkJbWVtY3B5IChTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQlIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyLAorCQkJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwkgICAga2ZyZWUgKEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCSAgICBIREFUQShpbnN0YW5jZSktPmRtYV9ib3VuY2VfYnVmZmVyID0gTlVMTDsKKwkgICAgSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IDA7CisJfQorICAgIH0KK30KKworaW50IF9faW5pdCBhMzAwMF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHdkMzNjOTNfcmVncyByZWdzOworCisgICAgaWYgICghTUFDSF9JU19BTUlHQSB8fCAhQU1JR0FIV19QUkVTRU5UKEEzMDAwX1NDU0kpKQorCXJldHVybiAwOworICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKDB4REQwMDAwLCAyNTYsICJ3ZDMzYzkzIikpCisJcmV0dXJuIDA7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiQTMwMDAiOworICAgIHRwbnQtPnByb2NfaW5mbyA9ICZ3ZDMzYzkzX3Byb2NfaW5mbzsKKworICAgIGEzMDAwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKKyAgICBpZiAoYTMwMDBfaG9zdCA9PSBOVUxMKQorCWdvdG8gZmFpbF9yZWdpc3RlcjsKKworICAgIGEzMDAwX2hvc3QtPmJhc2UgPSBaVFdPX1ZBRERSKDB4REQwMDAwKTsKKyAgICBhMzAwMF9ob3N0LT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisgICAgRE1BKGEzMDAwX2hvc3QpLT5EQVdSID0gREFXUl9BMzAwMDsKKyAgICByZWdzLlNBU1IgPSAmKERNQShhMzAwMF9ob3N0KS0+U0FTUik7CisgICAgcmVncy5TQ01EID0gJihETUEoYTMwMDBfaG9zdCktPlNDTUQpOworICAgIHdkMzNjOTNfaW5pdChhMzAwMF9ob3N0LCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTXzEyXzE1KTsKKyAgICBpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMzAwMF9pbnRyLCBTQV9TSElSUSwgIkEzMDAwIFNDU0kiLAorCQkgICAgYTMwMDBfaW50cikpCisgICAgICAgIGdvdG8gZmFpbF9pcnE7CisgICAgRE1BKGEzMDAwX2hvc3QpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKKworICAgIHJldHVybiAxOworCitmYWlsX2lycToKKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyAgICBzY3NpX3VucmVnaXN0ZXIoYTMwMDBfaG9zdCk7CitmYWlsX3JlZ2lzdGVyOgorICAgIHJlbGVhc2VfbWVtX3JlZ2lvbigweEREMDAwMCwgMjU2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhMzAwMF9idXNfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJLyogRklYTUUgcGVyZm9ybSBidXMtc3BlY2lmaWMgcmVzZXQgKi8KKwl3ZDMzYzkzX2hvc3RfcmVzZXQoY21kKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworI2RlZmluZSBIT1NUU19DCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gIkEzMDAwIiwKKwkubmFtZQkJCT0gIkFtaWdhIDMwMDAgYnVpbHQtaW4gU0NTSSIsCisJLmRldGVjdAkJCT0gYTMwMDBfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGEzMDAwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYTMwMDBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSB3ZDMzYzkzX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitpbnQgYTMwMDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyAgICBETUEoaW5zdGFuY2UpLT5DTlRSID0gMDsKKyAgICByZWxlYXNlX21lbV9yZWdpb24oMHhERDAwMDAsIDI1Nik7CisgICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMzAwMF9pbnRyKTsKKyAgICByZXR1cm4gMTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2EzMDAwLmggYi9kcml2ZXJzL3Njc2kvYTMwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVkYTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2EzMDAwLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBBMzAwMF9ICisjZGVmaW5lIEEzMDAwX0gKKworLyogJElkOiBhMzAwMC5oLHYgMS40IDE5OTcvMDEvMTkgMjM6MDc6MTAgZGF2ZW0gRXhwICQKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIEFtaWdhIDMwMDAgYnVpbHQtaW4gU0NTSSBjb250cm9sbGVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYW5kIChDKSAxOTkzLCBIYW1pc2ggTWFjZG9uYWxkLCBzZWUgYTMwMDAuYyBmb3IgbW9yZSBpbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYTMwMDBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBhMzAwMF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICp3ZDMzYzkzX2luZm8odm9pZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IHdkMzNjOTNfYWJvcnQoU2NzaV9DbW5kICopOworaW50IHdkMzNjOTNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKy8qCisgKiBpZiB0aGUgdHJhbnNmZXIgYWRkcmVzcyBBTkRlZCB3aXRoIHRoaXMgcmVzdWx0cyBpbiBhIG5vbi16ZXJvCisgKiByZXN1bHQsIHRoZW4gd2UgY2FuJ3QgdXNlIERNQS4KKyAqLworI2RlZmluZSBBMzAwMF9YRkVSX01BU0sgICgweDAwMDAwMDAzKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDFbMl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIERBV1I7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50ICAgICAgIFdUQzsKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgcGFkMlsyXTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgQ05UUjsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgICAgQUNSOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQzWzJdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTVF9ETUE7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDRbMl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIEZMVVNIOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQ1WzJdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBDSU5UOworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQ2WzJdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBJU1RSOworCSAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDdbMzBdOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBTUF9ETUE7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDg7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNBU1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDk7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNDTUQ7Cit9IGEzMDAwX3Njc2lyZWdzOworCisjZGVmaW5lIERBV1JfQTMwMDAJCSgzKQorCisvKiBDTlRSIGJpdHMuICovCisjZGVmaW5lIENOVFJfVENFTgkJKDE8PDUpCisjZGVmaW5lIENOVFJfUFJFU1QJCSgxPDw0KQorI2RlZmluZSBDTlRSX1BETUQJCSgxPDwzKQorI2RlZmluZSBDTlRSX0lOVEVOCQkoMTw8MikKKyNkZWZpbmUgQ05UUl9ERElSCQkoMTw8MSkKKyNkZWZpbmUgQ05UUl9JT19EWAkJKDE8PDApCisKKy8qIElTVFIgYml0cy4gKi8KKyNkZWZpbmUgSVNUUl9JTlRYCQkoMTw8OCkKKyNkZWZpbmUgSVNUUl9JTlRfRgkJKDE8PDcpCisjZGVmaW5lIElTVFJfSU5UUwkJKDE8PDYpCisjZGVmaW5lIElTVFJfRV9JTlQJCSgxPDw1KQorI2RlZmluZSBJU1RSX0lOVF9QCQkoMTw8NCkKKyNkZWZpbmUgSVNUUl9VRV9JTlQJCSgxPDwzKQorI2RlZmluZSBJU1RSX09FX0lOVAkJKDE8PDIpCisjZGVmaW5lIElTVFJfRkZfRkxHCQkoMTw8MSkKKyNkZWZpbmUgSVNUUl9GRV9GTEcJCSgxPDwwKQorCisjZW5kaWYgLyogQTMwMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQxMzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjIEFkYXB0ZWMgYWFjcmFpZAorCitvYmotJChDT05GSUdfU0NTSV9BQUNSQUlEKSA6PSBhYWNyYWlkLm8KKworYWFjcmFpZC1vYmpzCTo9IGxpbml0Lm8gYWFjaGJhLm8gY29tbWN0cmwubyBjb21taW5pdC5vIGNvbW1zdXAubyBcCisJCSAgIGRwY3N1cC5vIHJ4Lm8gc2EubyBya3QubworCitFWFRSQV9DRkxBR1MJOj0gLUlkcml2ZXJzL3Njc2kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1JFQURNRSBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGIwZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvUkVBRE1FCkBAIC0wLDAgKzEsNjYgQEAKK0FBQ1JBSUQgRHJpdmVyIGZvciBMaW51eCAodGFrZSB0d28pCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGFhY3JhaWQgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgQWRhcHRlYyAoaHR0cDovL3d3dy5hZGFwdGVjLmNvbSkKK1JBSUQgY29udHJvbGxlcnMuIFRoaXMgaXMgYSBtYWpvciByZXdyaXRlIGZyb20gdGhlIG9yaWdpbmFsIAorQWRhcHRlYyBzdXBwbGllZCBkcml2ZXIuIEl0IGhhcyBzaWduZmljYW50bHkgY2xlYW5lZCB1cCBib3RoIHRoZSBjb2RlCithbmQgdGhlIHJ1bm5pbmcgYmluYXJ5IHNpemUgKHRoZSBtb2R1bGUgaXMgbGVzcyB0aGFuIGhhbGYgdGhlIHNpemUgb2YKK3RoZSBvcmlnaW5hbCkuCisKK1N1cHBvcnRlZCBDYXJkcy9DaGlwc2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUFkYXB0ZWMgMjAyMFMKKwlBZGFwdGVjIDIwMjVTCisJQWRhcHRlYyAyMTIwUworCUFkYXB0ZWMgMjIwMFMKKwlBZGFwdGVjIDIyMzBTCisJQWRhcHRlYyAyMjQwUworCUFkYXB0ZWMgMjQxMFNBCisJQWRhcHRlYyAyNjEwU0EKKwlBZGFwdGVjIDI4MTBTQQorCUFkYXB0ZWMgMjE2MTBTQQorCUFkYXB0ZWMgMzIzMFMKKwlBZGFwdGVjIDMyNDBTCisJQWRhcHRlYyA0MDAwU0FTCisJQWRhcHRlYyA0MDA1U0FTCisJQWRhcHRlYyA0ODAwU0FTCisJQWRhcHRlYyA0ODA1U0FTCisJQWRhcHRlYyA1NDAwUworCURlbGwgUEVSQyAyIFF1YWQgQ2hhbm5lbAorCURlbGwgUEVSQyAyL1NpCisJRGVsbCBQRVJDIDMvU2kKKwlEZWxsIFBFUkMgMy9EaQorCURlbGwgQ0VSQyAyCisJSFAgTmV0UkFJRC00TQorCUxlZ2VuZCBTMjIwCisJTGVnZW5kIFMyMzAKKworUGVvcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgkodXBkYXRlcyBmb3IgbmV3LXN0eWxlIFBDSSBwcm9iaW5nIGFuZCBTQ1NJIGhvc3QgcmVnaXN0cmF0aW9uLAorCQkJCQkgc21hbGwgY2xlYW51cHMvZml4ZXMpCitNYXR0IERvbXNjaCA8bWF0dF9kb21zY2hAZGVsbC5jb20+CShyZXZpc2lvbiBpb2N0bCwgYWRhcHRlciBtZXNzYWdlcykKK0RlYW5uYSBCb25kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9uLURBU0Qgc3VwcG9ydCwgUEFFIGZpYnMgYW5kIDY0IGJpdCwgYWRkZWQgbmV3IGFkYXB0ZWMgY29udHJvbGxlcnMKKwkJCQkJIGFkZGVkIG5ldyBpb2N0bHMsIGNoYW5nZWQgc2NzaSBpbnRlcmZhY2UgdG8gdXNlIG5ldyBlcnJvciBoYW5kbGVyLAorCQkJCQkgaW5jcmVhc2VkIHRoZSBudW1iZXIgb2YgZmlicyBhbmQgb3V0c3RhbmRpbmcgY29tbWFuZHMgdG8gYSBjb250YWluZXIpCisKKwkJCQkJKGZpeGVkIDY0Yml0IGFuZCA2NEcgbWVtb3J5IG1vZGVsLCBjaGFuZ2VkIGNvbmZ1c2luZyBuYW1pbmcgY29udmVudGlvbgorCQkJCQkgd2hlcmUgZmlicyB0aGF0IGdvIHRvIHRoZSBoYXJkd2FyZSBhcmUgY29uc2lzdGVudGx5IGNhbGxlZCBod19maWJzIGFuZAorCQkJCQkgbm90IGp1c3QgZmlicyBsaWtlIHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIgdHJhY2tpbmcgc3RydWN0dXJlKQorTWFyayBTYWx5enluIDxNYXJrX1NhbHl6eW5AYWRhcHRlYy5jb20+IEZpeGVkIHBhbmljIGlzc3VlcyBhbmQgYWRkZWQgc29tZSBuZXcgcHJvZHVjdCBpZHMgZm9yIHVwY29taW5nIGhiYXMuCisKK09yaWdpbmFsIERyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWRhcHRlYyBVbml4IE9FTSBQcm9kdWN0IEdyb3VwCisKK01haWxpbmcgTGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcgKEludGVyZXN0ZWQgcGFydGllcyB0cm9sbCBoZXJlKQorQWxzbyBub3RlIHRoaXMgaXMgdmVyeSBkaWZmZXJlbnQgdG8gQnJpYW4ncyBvcmlnaW5hbCBkcml2ZXIKK3NvIGRvbid0IGV4cGVjdCBoaW0gdG8gc3VwcG9ydCBpdC4KK0FkYXB0ZWMgZG9lcyBzdXBwb3J0IHRoaXMgZHJpdmVyLiAgQ29udGFjdCBlaXRoZXIgdGVjaCBzdXBwb3J0IG9yIE1hcmsgU2FseXp5bi4KKworT3JpZ2luYWwgYnkgQnJpYW4gQm9lcm5lciBGZWJydWFyeSAyMDAxCitSZXdyaXR0ZW4gYnkgQWxhbiBDb3gsIE5vdmVtYmVyIDIwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL1RPRE8gYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODU2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorbwlUZXN0aW5nCitvCU1vcmUgdGVzdGluZworbwlGZWF0dXJlIHJlcXVlc3Q6IGRpc3BsYXkgdGhlIGZpcm13YXJlL2Jpb3MvZXRjIHJldmlzaW9ucyBpbiB0aGUKKwkvcHJvYyBpbmZvCitvCURyb3AgaXJxX21hc2ssIGJhc2ljYWxseSB1bnVzZWQKK28JSS9PIHNpemUgaW5jcmVhc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYzM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0wLDAgKzEsMjAzNyBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAiYWFjcmFpZC5oIgorCisvKiB2YWx1ZXMgZm9yIGlucWRfcGR0OiBQZXJpcGhlcmFsIGRldmljZSB0eXBlIGluIHBsYWluIEVuZ2xpc2ggKi8KKyNkZWZpbmUJSU5RRF9QRFRfREEJMHgwMAkvKiBEaXJlY3QtYWNjZXNzIChESVNLKSBkZXZpY2UgKi8KKyNkZWZpbmUJSU5RRF9QRFRfUFJPQwkweDAzCS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKyNkZWZpbmUJSU5RRF9QRFRfQ0hOR1IJMHgwOAkvKiBDaGFuZ2VyIChqdWtlYm94LCBzY3NpMikgKi8KKyNkZWZpbmUJSU5RRF9QRFRfQ09NTQkweDA5CS8qIENvbW11bmljYXRpb24gZGV2aWNlIChzY3NpMikgKi8KKyNkZWZpbmUJSU5RRF9QRFRfTk9MVU4yIDB4MWYJLyogVW5rbm93biBEZXZpY2UgKHNjc2kyKSAqLworI2RlZmluZQlJTlFEX1BEVF9OT0xVTgkweDdmCS8qIExvZ2ljYWwgVW5pdCBOb3QgUHJlc2VudCAqLworCisjZGVmaW5lCUlOUURfUERUX0RNQVNLCTB4MUYJLyogUGVyaXBoZXJhbCBEZXZpY2UgVHlwZSBNYXNrICovCisjZGVmaW5lCUlOUURfUERUX1FNQVNLCTB4RTAJLyogUGVyaXBoZXJhbCBEZXZpY2UgUXVhbGlmZXIgTWFzayAqLworCisjZGVmaW5lIE1BWF9GSUJfREFUQSAoc2l6ZW9mKHN0cnVjdCBod19maWIpIC0gc2l6ZW9mKEZJQl9IRUFERVIpKQorCisjZGVmaW5lIE1BWF9EUklWRVJfU0dfU0VHTUVOVF9DT1VOVCAxNworCisvKgorICoJU2Vuc2UgY29kZXMKKyAqLworIAorI2RlZmluZSBTRU5DT0RFX05PX1NFTlNFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTRU5DT0RFX0VORF9PRl9EQVRBICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTRU5DT0RFX0JFQ09NSU5HX1JFQURZICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTRU5DT0RFX0lOSVRfQ01EX1JFUVVJUkVEICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTRU5DT0RFX1BBUkFNX0xJU1RfTEVOR1RIX0VSUk9SICAgICAgICAgMHgxQQorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBTRU5DT0RFX0xCQV9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfQ0RCX0ZJRUxEICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBTRU5DT0RFX0xVTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfUEFSQU1fRklFTEQgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBTRU5DT0RFX1BBUkFNX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBTRU5DT0RFX1BBUkFNX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBTRU5DT0RFX1JFU0VUX09DQ1VSUkVEICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBTRU5DT0RFX0xVTl9OT1RfU0VMRl9DT05GSUdVUkVEX1lFVCAgICAgMHgzRQorI2RlZmluZSBTRU5DT0RFX0lOUVVJUllfREFUQV9DSEFOR0VEICAgICAgICAgICAgMHgzRgorI2RlZmluZSBTRU5DT0RFX1NBVklOR19QQVJBTVNfTk9UX1NVUFBPUlRFRCAgICAgMHgzOQorI2RlZmluZSBTRU5DT0RFX0RJQUdOT1NUSUNfRkFJTFVSRSAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFICAgICAgICAgMHg0NAorI2RlZmluZSBTRU5DT0RFX0lOVkFMSURfTUVTU0FHRV9FUlJPUiAgICAgICAgICAgMHg0OQorI2RlZmluZSBTRU5DT0RFX0xVTl9GQUlMRURfU0VMRl9DT05GSUcgICAgICAgICAgMHg0YworI2RlZmluZSBTRU5DT0RFX09WRVJMQVBQRURfQ09NTUFORCAgICAgICAgICAgICAgMHg0RQorCisvKgorICoJQWRkaXRpb25hbCBzZW5zZSBjb2RlcworICovCisgCisjZGVmaW5lIEFTRU5DT0RFX05PX1NFTlNFICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0VORF9PRl9EQVRBICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEFTRU5DT0RFX0JFQ09NSU5HX1JFQURZICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFTRU5DT0RFX0lOSVRfQ01EX1JFUVVJUkVEICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFTRU5DT0RFX1BBUkFNX0xJU1RfTEVOR1RIX0VSUk9SICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfQ09NTUFORCAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xCQV9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfQ0RCX0ZJRUxEICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xVTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfUEFSQU1fRklFTEQgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX1BBUkFNX05PVF9TVVBQT1JURUQgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFTRU5DT0RFX1BBUkFNX1ZBTFVFX0lOVkFMSUQgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFTRU5DT0RFX1JFU0VUX09DQ1VSUkVEICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xVTl9OT1RfU0VMRl9DT05GSUdVUkVEX1lFVCAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOUVVJUllfREFUQV9DSEFOR0VEICAgICAgICAgICAweDAzCisjZGVmaW5lIEFTRU5DT0RFX1NBVklOR19QQVJBTVNfTk9UX1NVUFBPUlRFRCAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0RJQUdOT1NUSUNfRkFJTFVSRSAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0lOVkFMSURfTUVTU0FHRV9FUlJPUiAgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX0xVTl9GQUlMRURfU0VMRl9DT05GSUcgICAgICAgICAweDAwCisjZGVmaW5lIEFTRU5DT0RFX09WRVJMQVBQRURfQ09NTUFORCAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgQllURTAoeCkgKHVuc2lnbmVkIGNoYXIpKHgpCisjZGVmaW5lIEJZVEUxKHgpICh1bnNpZ25lZCBjaGFyKSgoeCkgPj4gOCkKKyNkZWZpbmUgQllURTIoeCkgKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAxNikKKyNkZWZpbmUgQllURTMoeCkgKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAyNCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICBTIFQgUiBVIEMgVCBTIC8gVCBZIFAgRSBEIEUgRiBTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU0NTSSBpbnF1aXJ5IGRhdGEgKi8KK3N0cnVjdCBpbnF1aXJ5X2RhdGEgeworCXU4IGlucWRfcGR0OwkvKiBQZXJpcGhlcmFsIHF1YWxpZmllciB8IFBlcmlwaGVyYWwgRGV2aWNlIFR5cGUgICovCisJdTggaW5xZF9kdHE7CS8qIFJNQiB8IERldmljZSBUeXBlIFF1YWxpZmllciAgKi8KKwl1OCBpbnFkX3ZlcjsJLyogSVNPIHZlcnNpb24gfCBFQ01BIHZlcnNpb24gfCBBTlNJLWFwcHJvdmVkIHZlcnNpb24gKi8KKwl1OCBpbnFkX3JkZjsJLyogQUVOQyB8IFRybUlPUCB8IFJlc3BvbnNlIGRhdGEgZm9ybWF0ICovCisJdTggaW5xZF9sZW47CS8qIEFkZGl0aW9uYWwgbGVuZ3RoIChuLTQpICovCisJdTggaW5xZF9wYWQxWzJdOy8qIFJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisJdTggaW5xZF9wYWQyOwkvKiBSZWxBZHIgfCBXQnVzMzIgfCBXQnVzMTYgfCAgU3luYyAgfCBMaW5rZWQgfFJlc2VydmVkfCBDbWRRdWUgfCBTZnRSZSAqLworCXU4IGlucWRfdmlkWzhdOwkvKiBWZW5kb3IgSUQgKi8KKwl1OCBpbnFkX3BpZFsxNl07LyogUHJvZHVjdCBJRCAqLworCXU4IGlucWRfcHJsWzRdOwkvKiBQcm9kdWN0IFJldmlzaW9uIExldmVsICovCit9OworCisvKgorICogICAgICAgICAgICAgIE0gTyBEIFUgTCBFICAgRyBMIE8gQiBBIEwgUworICovCisgCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2coc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwKiBzZ21hcCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2c2NChzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kLCBzdHJ1Y3Qgc2dtYXA2NCogcHNnKTsKK3N0YXRpYyBpbnQgYWFjX3NlbmRfc3JiX2ZpYihzdHJ1Y3Qgc2NzaV9jbW5kKiBzY3NpY21kKTsKKyNpZmRlZiBBQUNfREVUQUlMRURfU1RBVFVTX0lORk8KK3N0YXRpYyBjaGFyICphYWNfZ2V0X3N0YXR1c19zdHJpbmcodTMyIHN0YXR1cyk7CisjZW5kaWYKKworLyoKKyAqCU5vbiBkYXNkIHNlbGVjdGlvbiBpcyBoYW5kbGVkIGVudGlyZWx5IGluIGFhY2hiYSBub3cKKyAqLwkKKyAKK3N0YXRpYyBpbnQgbm9uZGFzZCA9IC0xOworc3RhdGljIGludCBkYWNtb2RlID0gLTE7CisKK3N0YXRpYyBpbnQgY29tbWl0ID0gLTE7CisKK21vZHVsZV9wYXJhbShub25kYXNkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub25kYXNkLCAiQ29udHJvbCBzY2FubmluZyBvZiBoYmEgZm9yIG5vbmRhc2QgZGV2aWNlcy4gMD1vZmYsIDE9b24iKTsKK21vZHVsZV9wYXJhbShkYWNtb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkYWNtb2RlLCAiQ29udHJvbCB3aGV0aGVyIGRtYSBhZGRyZXNzaW5nIGlzIHVzaW5nIDY0IGJpdCBEQUMuIDA9b2ZmLCAxPW9uIik7Cittb2R1bGVfcGFyYW0oY29tbWl0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb21taXQsICJDb250cm9sIHdoZXRoZXIgYSBDT01NSVRfQ09ORklHIGlzIGlzc3VlZCB0byB0aGUgYWRhcHRlciBmb3IgZm9yZWlnbiBhcnJheXMuXG5UaGlzIGlzIHR5cGljYWxseSBuZWVkZWQgaW4gc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGEgQklPUy4gMD1vZmYsIDE9b24iKTsKKworLyoqCisgKglhYWNfZ2V0X2NvbmZpZ19zdGF0dXMJLQljaGVjayB0aGUgYWRhcHRlciBjb25maWd1cmF0aW9uCisgKglAY29tbW9uOiBhZGFwdGVyIHRvIHF1ZXJ5CisgKgorICoJUXVlcnkgY29uZmlnIHN0YXR1cywgYW5kIGNvbW1pdCB0aGUgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQuCisgKi8KK2ludCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXMoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZmliICogZmlicHRyOworCisJaWYgKCEoZmlicHRyID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGZpYnB0cik7CisJeworCQlzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzICpkaW5mbzsKKwkJZGluZm8gPSAoc3RydWN0IGFhY19nZXRfY29uZmlnX3N0YXR1cyAqKSBmaWJfZGF0YShmaWJwdHIpOworCisJCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwkJZGluZm8tPnR5cGUgPSBjcHVfdG9fbGUzMihDVF9HRVRfQ09ORklHX1NUQVRVUyk7CisJCWRpbmZvLT5jb3VudCA9IGNwdV90b19sZTMyKHNpemVvZigoKHN0cnVjdCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXNfcmVzcCAqKU5VTEwpLT5kYXRhKSk7CisJfQorCisJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyQ29tbWFuZCwKKwkJCSAgICBmaWJwdHIsCisJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzKSwKKwkJCSAgICBGc2FOb3JtYWwsCisJCQkgICAgMSwgMSwKKwkJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX2dldF9jb25maWdfc3RhdHVzOiBTZW5kRklCIGZhaWxlZC5cbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXNfcmVzcCAqcmVwbHkKKwkJICA9IChzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzX3Jlc3AgKikgZmliX2RhdGEoZmlicHRyKTsKKwkJZHByaW50aygoS0VSTl9XQVJOSU5HCisJCSAgImFhY19nZXRfY29uZmlnX3N0YXR1czogcmVzcG9uc2U9JWQgc3RhdHVzPSVkIGFjdGlvbj0lZFxuIiwKKwkJICBsZTMyX3RvX2NwdShyZXBseS0+cmVzcG9uc2UpLAorCQkgIGxlMzJfdG9fY3B1KHJlcGx5LT5zdGF0dXMpLAorCQkgIGxlMzJfdG9fY3B1KHJlcGx5LT5kYXRhLmFjdGlvbikpKTsKKwkJaWYgKChsZTMyX3RvX2NwdShyZXBseS0+cmVzcG9uc2UpICE9IFNUX09LKSB8fAorCQkgICAgIChsZTMyX3RvX2NwdShyZXBseS0+c3RhdHVzKSAhPSBDVF9PSykgfHwKKwkJICAgICAobGUzMl90b19jcHUocmVwbHktPmRhdGEuYWN0aW9uKSA+IENGQUNUX1BBVVNFKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX2dldF9jb25maWdfc3RhdHVzOiBXaWxsIG5vdCBpc3N1ZSB0aGUgQ29tbWl0IENvbmZpZ3VyYXRpb25cbiIpOworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJfQorCX0KKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwkvKiBTZW5kIGEgQ1RfQ09NTUlUX0NPTkZJRyB0byBlbmFibGUgZGlzY292ZXJ5IG9mIGRldmljZXMgKi8KKwlpZiAoc3RhdHVzID49IDApIHsKKwkJaWYgKGNvbW1pdCA9PSAxKSB7CisJCQlzdHJ1Y3QgYWFjX2NvbW1pdF9jb25maWcgKiBkaW5mbzsKKwkJCWZpYl9pbml0KGZpYnB0cik7CisJCQlkaW5mbyA9IChzdHJ1Y3QgYWFjX2NvbW1pdF9jb25maWcgKikgZmliX2RhdGEoZmlicHRyKTsKKwkKKwkJCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwkJCWRpbmZvLT50eXBlID0gY3B1X3RvX2xlMzIoQ1RfQ09NTUlUX0NPTkZJRyk7CisJCisJCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kLAorCQkJCSAgICBmaWJwdHIsCisJCQkJICAgIHNpemVvZiAoc3RydWN0IGFhY19jb21taXRfY29uZmlnKSwKKwkJCQkgICAgRnNhTm9ybWFsLAorCQkJCSAgICAxLCAxLAorCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCQl9IGVsc2UgaWYgKGNvbW1pdCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICJhYWNfZ2V0X2NvbmZpZ19zdGF0dXM6IEZvcmVpZ24gZGV2aWNlIGNvbmZpZ3VyYXRpb25zIGFyZSBiZWluZyBpZ25vcmVkXG4iKTsKKwkJfQorCX0KKwlmaWJfZnJlZShmaWJwdHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJYWFjX2dldF9jb250YWluZXJzCS0JbGlzdCBjb250YWluZXJzCisgKglAY29tbW9uOiBhZGFwdGVyIHRvIHByb2JlCisgKgorICoJTWFrZSBhIGxpc3Qgb2YgYWxsIGNvbnRhaW5lcnMgb24gdGhpcyBjb250cm9sbGVyCisgKi8KK2ludCBhYWNfZ2V0X2NvbnRhaW5lcnMoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvICpmc2FfZGV2X3B0cjsKKwl1MzIgaW5kZXg7IAorCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBmaWIgKiBmaWJwdHI7CisJdW5zaWduZWQgaW5zdGFuY2U7CisJc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50ICpkaW5mbzsKKwlzdHJ1Y3QgYWFjX2dldF9jb250YWluZXJfY291bnRfcmVzcCAqZHJlc3A7CisJaW50IG1heGltdW1fbnVtX2NvbnRhaW5lcnMgPSBNQVhJTVVNX05VTV9DT05UQUlORVJTOworCisJaW5zdGFuY2UgPSBkZXYtPnNjc2lfaG9zdF9wdHItPnVuaXF1ZV9pZDsKKworCWlmICghKGZpYnB0ciA9IGZpYl9hbGxvYyhkZXYpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWJfaW5pdChmaWJwdHIpOworCWRpbmZvID0gKHN0cnVjdCBhYWNfZ2V0X2NvbnRhaW5lcl9jb3VudCAqKSBmaWJfZGF0YShmaWJwdHIpOworCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwlkaW5mby0+dHlwZSA9IGNwdV90b19sZTMyKENUX0dFVF9DT05UQUlORVJfQ09VTlQpOworCisJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyQ29tbWFuZCwKKwkJICAgIGZpYnB0ciwKKwkJICAgIHNpemVvZiAoc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50KSwKKwkJICAgIEZzYU5vcm1hbCwKKwkJICAgIDEsIDEsCisJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJZHJlc3AgPSAoc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50X3Jlc3AgKilmaWJfZGF0YShmaWJwdHIpOworCQltYXhpbXVtX251bV9jb250YWluZXJzID0gbGUzMl90b19jcHUoZHJlc3AtPkNvbnRhaW5lclN3aXRjaEVudHJpZXMpOworCQlmaWJfY29tcGxldGUoZmlicHRyKTsKKwl9CisKKwlpZiAobWF4aW11bV9udW1fY29udGFpbmVycyA8IE1BWElNVU1fTlVNX0NPTlRBSU5FUlMpCisJCW1heGltdW1fbnVtX2NvbnRhaW5lcnMgPSBNQVhJTVVNX05VTV9DT05UQUlORVJTOworCisJZnNhX2Rldl9wdHIgPSAoc3RydWN0IGZzYV9kZXZfaW5mbyAqKSBrbWFsbG9jKAorCSAgc2l6ZW9mKCpmc2FfZGV2X3B0cikgKiBtYXhpbXVtX251bV9jb250YWluZXJzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZzYV9kZXZfcHRyKSB7CisJCWZpYl9mcmVlKGZpYnB0cik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZnNhX2Rldl9wdHIsIDAsIHNpemVvZigqZnNhX2Rldl9wdHIpICogbWF4aW11bV9udW1fY29udGFpbmVycyk7CisKKwlkZXYtPmZzYV9kZXYgPSBmc2FfZGV2X3B0cjsKKwlkZXYtPm1heGltdW1fbnVtX2NvbnRhaW5lcnMgPSBtYXhpbXVtX251bV9jb250YWluZXJzOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZGV2LT5tYXhpbXVtX251bV9jb250YWluZXJzOyBpbmRleCsrKSB7CisJCXN0cnVjdCBhYWNfcXVlcnlfbW91bnQgKmRpbmZvOworCQlzdHJ1Y3QgYWFjX21vdW50ICpkcmVzcDsKKworCQlmc2FfZGV2X3B0cltpbmRleF0uZGV2bmFtZVswXSA9ICdcMCc7CisKKwkJZmliX2luaXQoZmlicHRyKTsKKwkJZGluZm8gPSAoc3RydWN0IGFhY19xdWVyeV9tb3VudCAqKSBmaWJfZGF0YShmaWJwdHIpOworCisJCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fTmFtZVNlcnZlKTsKKwkJZGluZm8tPmNvdW50ID0gY3B1X3RvX2xlMzIoaW5kZXgpOworCQlkaW5mby0+dHlwZSA9IGNwdV90b19sZTMyKEZUX0ZJTEVTWVMpOworCisJCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsCisJCQkJICAgIGZpYnB0ciwKKwkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYWFjX3F1ZXJ5X21vdW50KSwKKwkJCQkgICAgRnNhTm9ybWFsLAorCQkJCSAgICAxLCAxLAorCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJaWYgKHN0YXR1cyA8IDAgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhYWNfZ2V0X2NvbnRhaW5lcnM6IFNlbmRGSUIgZmFpbGVkLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlkcmVzcCA9IChzdHJ1Y3QgYWFjX21vdW50ICopZmliX2RhdGEoZmlicHRyKTsKKworCQlkcHJpbnRrICgoS0VSTl9ERUJVRworCQkgICJWTV9OYW1lU2VydmUgY2lkPSVkIHN0YXR1cz0lZCB2b2w9JWQgc3RhdGU9JWQgY2FwPSV1XG4iLAorCQkgIChpbnQpaW5kZXgsIChpbnQpbGUzMl90b19jcHUoZHJlc3AtPnN0YXR1cyksCisJCSAgKGludClsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnZvbCksCisJCSAgKGludClsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSwKKwkJICAodW5zaWduZWQpbGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5jYXBhY2l0eSkpKTsKKwkJaWYgKChsZTMyX3RvX2NwdShkcmVzcC0+c3RhdHVzKSA9PSBTVF9PSykgJiYKKwkJICAgIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnZvbCkgIT0gQ1RfTk9ORSkgJiYKKwkJICAgIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSAhPSBGU0NTX0hJRERFTikpIHsKKwkJCWZzYV9kZXZfcHRyW2luZGV4XS52YWxpZCA9IDE7CisJCQlmc2FfZGV2X3B0cltpbmRleF0udHlwZSA9IGxlMzJfdG9fY3B1KGRyZXNwLT5tbnRbMF0udm9sKTsKKwkJCWZzYV9kZXZfcHRyW2luZGV4XS5zaXplID0gbGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5jYXBhY2l0eSk7CisJCQlpZiAobGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5zdGF0ZSkgJiBGU0NTX1JFQURPTkxZKQorCQkJCSAgICBmc2FfZGV2X3B0cltpbmRleF0ucm8gPSAxOworCQl9CisJCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCQkvKgorCQkgKglJZiB0aGVyZSBhcmUgbm8gbW9yZSBjb250YWluZXJzLCB0aGVuIHN0b3AgYXNraW5nLgorCQkgKi8KKwkJaWYgKChpbmRleCArIDEpID49IGxlMzJfdG9fY3B1KGRyZXNwLT5jb3VudCkpeworCQkJYnJlYWs7CisJCX0KKwl9CisJZmliX2ZyZWUoZmlicHRyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBhYWNfaW9fZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaWNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gc2NzaWNtZC0+ZGV2aWNlLT5ob3N0OworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jb250YWluZXJfbmFtZV9jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICogZmlicHRyKQoreworCXN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqIGdldF9uYW1lX3JlcGx5OworCXN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpY21kOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJnZXRfY29udGFpbmVyX25hbWVfY2FsbGJhY2tbY3B1ICVkXTogdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcykpOworCWlmIChmaWJwdHIgPT0gTlVMTCkKKwkJQlVHKCk7CisKKwlnZXRfbmFtZV9yZXBseSA9IChzdHJ1Y3QgYWFjX2dldF9uYW1lX3Jlc3AgKikgZmliX2RhdGEoZmlicHRyKTsKKwkvKiBGYWlsdXJlIGlzIGlycmVsZXZhbnQsIHVzaW5nIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCAqLworCWlmICgobGUzMl90b19jcHUoZ2V0X25hbWVfcmVwbHktPnN0YXR1cykgPT0gQ1RfT0spCisJICYmIChnZXRfbmFtZV9yZXBseS0+ZGF0YVswXSAhPSAnXDAnKSkgeworCQlpbnQgICAgY291bnQ7CisJCWNoYXIgKiBkcDsKKwkJY2hhciAqIHNwID0gZ2V0X25hbWVfcmVwbHktPmRhdGE7CisJCXNwW3NpemVvZigoKHN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqKU5VTEwpLT5kYXRhKS0xXSA9ICdcMCc7CisJCXdoaWxlICgqc3AgPT0gJyAnKQorCQkJKytzcDsKKwkJY291bnQgPSBzaXplb2YoKChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopTlVMTCktPmlucWRfcGlkKTsKKwkJZHAgPSAoKHN0cnVjdCBpbnF1aXJ5X2RhdGEgKilzY3NpY21kLT5yZXF1ZXN0X2J1ZmZlciktPmlucWRfcGlkOworCQlpZiAoKnNwKSBkbyB7CisJCQkqZHArKyA9ICgqc3ApID8gKnNwKysgOiAnICc7CisJCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwl9CisJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKKworCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCWZpYl9mcmVlKGZpYnB0cik7CisJYWFjX2lvX2RvbmUoc2NzaWNtZCk7Cit9CisKKy8qKgorICoJYWFjX2dldF9jb250YWluZXJfbmFtZQktCWdldCBjb250YWluZXIgbmFtZSwgbm9uZSBibG9ja2luZy4KKyAqLworc3RhdGljIGludCBhYWNfZ2V0X2NvbnRhaW5lcl9uYW1lKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpY21kLCBpbnQgY2lkKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGFhY19nZXRfbmFtZSAqZGluZm87CisJc3RydWN0IGZpYiAqIGNtZF9maWJjb250ZXh0OworCXN0cnVjdCBhYWNfZGV2ICogZGV2OworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICghKGNtZF9maWJjb250ZXh0ID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGNtZF9maWJjb250ZXh0KTsKKwlkaW5mbyA9IChzdHJ1Y3QgYWFjX2dldF9uYW1lICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKworCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ29udGFpbmVyQ29uZmlnKTsKKwlkaW5mby0+dHlwZSA9IGNwdV90b19sZTMyKENUX1JFQURfTkFNRSk7CisJZGluZm8tPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJZGluZm8tPmNvdW50ID0gY3B1X3RvX2xlMzIoc2l6ZW9mKCgoc3RydWN0IGFhY19nZXRfbmFtZV9yZXNwICopTlVMTCktPmRhdGEpKTsKKworCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsIAorCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJICBzaXplb2YgKHN0cnVjdCBhYWNfZ2V0X25hbWUpLAorCQkgIEZzYU5vcm1hbCwgCisJCSAgMCwgMSwgCisJCSAgKGZpYl9jYWxsYmFjaykgZ2V0X2NvbnRhaW5lcl9uYW1lX2NhbGxiYWNrLCAKKwkJICAodm9pZCAqKSBzY3NpY21kKTsKKwkKKwkvKgorCSAqCUNoZWNrIHRoYXQgdGhlIGNvbW1hbmQgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyCisJICovCisJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIAorCQlyZXR1cm4gMDsKKwkJCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX2dldF9jb250YWluZXJfbmFtZTogZmliX3NlbmQgZmFpbGVkIHdpdGggc3RhdHVzOiAlZC5cbiIsIHN0YXR1cyk7CisJZmliX2NvbXBsZXRlKGNtZF9maWJjb250ZXh0KTsKKwlmaWJfZnJlZShjbWRfZmliY29udGV4dCk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqCXByb2JlX2NvbnRhaW5lcgkJLQlxdWVyeSBhIGxvZ2ljYWwgdm9sdW1lCisgKglAZGV2OiBkZXZpY2UgdG8gcXVlcnkKKyAqCUBjaWQ6IGNvbnRhaW5lciBpZGVudGlmaWVyCisgKgorICoJUXVlcmllcyB0aGUgY29udHJvbGxlciBhYm91dCB0aGUgZ2l2ZW4gdm9sdW1lLiBUaGUgdm9sdW1lIGluZm9ybWF0aW9uCisgKglpcyB1cGRhdGVkIGluIHRoZSBzdHJ1Y3QgZnNhX2Rldl9pbmZvIHN0cnVjdHVyZSByYXRoZXIgdGhhbiByZXR1cm5lZC4KKyAqLworIAorc3RhdGljIGludCBwcm9iZV9jb250YWluZXIoc3RydWN0IGFhY19kZXYgKmRldiwgaW50IGNpZCkKK3sKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvICpmc2FfZGV2X3B0cjsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhYWNfcXVlcnlfbW91bnQgKmRpbmZvOworCXN0cnVjdCBhYWNfbW91bnQgKmRyZXNwOworCXN0cnVjdCBmaWIgKiBmaWJwdHI7CisJdW5zaWduZWQgaW5zdGFuY2U7CisKKwlmc2FfZGV2X3B0ciA9IGRldi0+ZnNhX2RldjsKKwlpbnN0YW5jZSA9IGRldi0+c2NzaV9ob3N0X3B0ci0+dW5pcXVlX2lkOworCisJaWYgKCEoZmlicHRyID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGZpYnB0cik7CisKKwlkaW5mbyA9IChzdHJ1Y3QgYWFjX3F1ZXJ5X21vdW50ICopZmliX2RhdGEoZmlicHRyKTsKKworCWRpbmZvLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fTmFtZVNlcnZlKTsKKwlkaW5mby0+Y291bnQgPSBjcHVfdG9fbGUzMihjaWQpOworCWRpbmZvLT50eXBlID0gY3B1X3RvX2xlMzIoRlRfRklMRVNZUyk7CisKKwlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kLAorCQkJICAgIGZpYnB0ciwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFhY19xdWVyeV9tb3VudCksCisJCQkgICAgRnNhTm9ybWFsLAorCQkJICAgIDEsIDEsCisJCQkgICAgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogcHJvYmVfY29udGFpbmVycyBxdWVyeSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkcmVzcCA9IChzdHJ1Y3QgYWFjX21vdW50ICopIGZpYl9kYXRhKGZpYnB0cik7CisKKwlpZiAoKGxlMzJfdG9fY3B1KGRyZXNwLT5zdGF0dXMpID09IFNUX09LKSAmJgorCSAgICAobGUzMl90b19jcHUoZHJlc3AtPm1udFswXS52b2wpICE9IENUX05PTkUpICYmCisJICAgIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSAhPSBGU0NTX0hJRERFTikpIHsKKwkJZnNhX2Rldl9wdHJbY2lkXS52YWxpZCA9IDE7CisJCWZzYV9kZXZfcHRyW2NpZF0udHlwZSA9IGxlMzJfdG9fY3B1KGRyZXNwLT5tbnRbMF0udm9sKTsKKwkJZnNhX2Rldl9wdHJbY2lkXS5zaXplID0gbGUzMl90b19jcHUoZHJlc3AtPm1udFswXS5jYXBhY2l0eSk7CisJCWlmIChsZTMyX3RvX2NwdShkcmVzcC0+bW50WzBdLnN0YXRlKSAmIEZTQ1NfUkVBRE9OTFkpCisJCQlmc2FfZGV2X3B0cltjaWRdLnJvID0gMTsKKwl9CisKK2Vycm9yOgorCWZpYl9jb21wbGV0ZShmaWJwdHIpOworCWZpYl9mcmVlKGZpYnB0cik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBMb2NhbCBTdHJ1Y3R1cmUgdG8gc2V0IFNDU0kgaW5xdWlyeSBkYXRhIHN0cmluZ3MgKi8KK3N0cnVjdCBzY3NpX2lucSB7CisJY2hhciB2aWRbOF07ICAgICAgICAgLyogVmVuZG9yIElEICovCisJY2hhciBwaWRbMTZdOyAgICAgICAgLyogUHJvZHVjdCBJRCAqLworCWNoYXIgcHJsWzRdOyAgICAgICAgIC8qIFByb2R1Y3QgUmV2aXNpb24gTGV2ZWwgKi8KK307CisKKy8qKgorICoJSW5xU3RyQ29weQktCXN0cmluZyBtZXJnZQorICoJQGE6CXN0cmluZyB0byBjb3B5IGZyb20KKyAqCUBiOglzdHJpbmcgdG8gY29weSB0bworICoKKyAqIAlDb3B5IGEgU3RyaW5nIGZyb20gb25lIGxvY2F0aW9uIHRvIGFub3RoZXIKKyAqCXdpdGhvdXQgY29weWluZyBcMAorICovCisKK3N0YXRpYyB2b2lkIGlucXN0cmNweShjaGFyICphLCBjaGFyICpiKQoreworCisJd2hpbGUoKmEgIT0gKGNoYXIpMCkgCisJCSpiKysgPSAqYSsrOworfQorCitzdGF0aWMgY2hhciAqY29udGFpbmVyX3R5cGVzW10gPSB7CisgICAgICAgICJOb25lIiwKKyAgICAgICAgIlZvbHVtZSIsCisgICAgICAgICJNaXJyb3IiLAorICAgICAgICAiU3RyaXBlIiwKKyAgICAgICAgIlJBSUQ1IiwKKyAgICAgICAgIlNTUlciLAorICAgICAgICAiU1NSTyIsCisgICAgICAgICJNb3JwaCIsCisgICAgICAgICJMZWdhY3kiLAorICAgICAgICAiUkFJRDQiLAorICAgICAgICAiUkFJRDEwIiwgICAgICAgICAgICAgCisgICAgICAgICJSQUlEMDAiLCAgICAgICAgICAgICAKKyAgICAgICAgIlYtTUlSUk9SUyIsICAgICAgICAgIAorICAgICAgICAiUFNFVURPIFI0IiwgICAgICAgICAgCisJIlJBSUQ1MCIsCisgICAgICAgICJVbmtub3duIgorfTsKKworCisKKy8qIEZ1bmN0aW9uOiBzZXRpbnFzdHIKKyAqCisgKiBBcmd1bWVudHM6IFsxXSBwb2ludGVyIHRvIHZvaWQgWzFdIGludAorICoKKyAqIFB1cnBvc2U6IFNldHMgU0NTSSBpbnF1aXJ5IGRhdGEgc3RyaW5ncyBmb3IgdmVuZG9yLCBwcm9kdWN0CisgKiBhbmQgcmV2aXNpb24gbGV2ZWwuIEFsbG93cyBzdHJpbmdzIHRvIGJlIHNldCBpbiBwbGF0Zm9ybSBkZXBlbmRhbnQKKyAqIGZpbGVzIGluc3RlYWQgb2YgaW4gT1MgZGVwZW5kYW50IGRyaXZlciBzb3VyY2UuCisgKi8KKworc3RhdGljIHZvaWQgc2V0aW5xc3RyKGludCBkZXZ0eXBlLCB2b2lkICpkYXRhLCBpbnQgdGluZGV4KQoreworCXN0cnVjdCBzY3NpX2lucSAqc3RyOworCXN0cnVjdCBhYWNfZHJpdmVyX2lkZW50ICptcDsKKworCW1wID0gYWFjX2dldF9kcml2ZXJfaWRlbnQoZGV2dHlwZSk7CisgICAKKwlzdHIgPSAoc3RydWN0IHNjc2lfaW5xICopKGRhdGEpOyAvKiBjYXN0IGRhdGEgdG8gc2NzaSBpbnEgYmxvY2sgKi8KKworCWlucXN0cmNweSAobXAtPnZuYW1lLCBzdHItPnZpZCk7IAorCWlucXN0cmNweSAobXAtPm1vZGVsLCBzdHItPnBpZCk7IC8qIGxhc3Qgc2l4IGNoYXJzIHJlc2VydmVkIGZvciB2b2wgdHlwZSAqLworCisJaWYgKHRpbmRleCA8IChzaXplb2YoY29udGFpbmVyX3R5cGVzKS9zaXplb2YoY2hhciAqKSkpeworCQljaGFyICpmaW5kaXQgPSBzdHItPnBpZDsKKworCQlmb3IgKCA7ICpmaW5kaXQgIT0gJyAnOyBmaW5kaXQrKyk7IC8qIHdhbGsgdGlsbCB3ZSBmaW5kIGEgc3BhY2UgKi8KKwkJLyogUkFJRCBpcyBzdXBlcmZsdW91cyBpbiB0aGUgY29udGV4dCBvZiBhIFJBSUQgZGV2aWNlICovCisJCWlmIChtZW1jbXAoZmluZGl0LTQsICJSQUlEIiwgNCkgPT0gMCkKKwkJCSooZmluZGl0IC09IDQpID0gJyAnOworCQlpbnFzdHJjcHkgKGNvbnRhaW5lcl90eXBlc1t0aW5kZXhdLCBmaW5kaXQgKyAxKTsKKwl9CisJaW5xc3RyY3B5ICgiVjEuMCIsIHN0ci0+cHJsKTsKK30KKwordm9pZCBzZXRfc2Vuc2UodTggKnNlbnNlX2J1ZiwgdTggc2Vuc2Vfa2V5LCB1OCBzZW5zZV9jb2RlLAorCQkgICAgdTggYV9zZW5zZV9jb2RlLCB1OCBpbmNvcnJlY3RfbGVuZ3RoLAorCQkgICAgdTggYml0X3BvaW50ZXIsIHUxNiBmaWVsZF9wb2ludGVyLAorCQkgICAgdTMyIHJlc2lkdWUpCit7CisJc2Vuc2VfYnVmWzBdID0gMHhGMDsJLyogU2Vuc2UgZGF0YSB2YWxpZCwgZXJyIGNvZGUgNzBoIChjdXJyZW50IGVycm9yKSAqLworCXNlbnNlX2J1ZlsxXSA9IDA7CS8qIFNlZ21lbnQgbnVtYmVyLCBhbHdheXMgemVybyAqLworCisJaWYgKGluY29ycmVjdF9sZW5ndGgpIHsKKwkJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5IHwgMHgyMDsvKiBTZXQgSUxJIGJpdCB8IHNlbnNlIGtleSAqLworCQlzZW5zZV9idWZbM10gPSBCWVRFMyhyZXNpZHVlKTsKKwkJc2Vuc2VfYnVmWzRdID0gQllURTIocmVzaWR1ZSk7CisJCXNlbnNlX2J1Zls1XSA9IEJZVEUxKHJlc2lkdWUpOworCQlzZW5zZV9idWZbNl0gPSBCWVRFMChyZXNpZHVlKTsKKwl9IGVsc2UKKwkJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5OwkvKiBTZW5zZSBrZXkgKi8KKworCWlmIChzZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKQorCQlzZW5zZV9idWZbN10gPSAxMDsJLyogQWRkaXRpb25hbCBzZW5zZSBsZW5ndGggKi8KKwllbHNlCisJCXNlbnNlX2J1Zls3XSA9IDY7CS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCisKKwlzZW5zZV9idWZbMTJdID0gc2Vuc2VfY29kZTsJLyogQWRkaXRpb25hbCBzZW5zZSBjb2RlICovCisJc2Vuc2VfYnVmWzEzXSA9IGFfc2Vuc2VfY29kZTsJLyogQWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllciAqLworCWlmIChzZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKSB7CisJCXNlbnNlX2J1ZlsxNV0gPSAwOworCisJCWlmIChzZW5zZV9jb2RlID09IFNFTkNPREVfSU5WQUxJRF9QQVJBTV9GSUVMRCkKKwkJCXNlbnNlX2J1ZlsxNV0gPSAweDgwOy8qIFN0ZCBzZW5zZSBrZXkgc3BlY2lmaWMgZmllbGQgKi8KKwkJLyogSWxsZWdhbCBwYXJhbWV0ZXIgaXMgaW4gdGhlIHBhcmFtZXRlciBibG9jayAqLworCisJCWlmIChzZW5zZV9jb2RlID09IFNFTkNPREVfSU5WQUxJRF9DREJfRklFTEQpCisJCQlzZW5zZV9idWZbMTVdID0gMHhjMDsvKiBTdGQgc2Vuc2Uga2V5IHNwZWNpZmljIGZpZWxkICovCisJCS8qIElsbGVnYWwgcGFyYW1ldGVyIGlzIGluIHRoZSBDREIgYmxvY2sgKi8KKwkJc2Vuc2VfYnVmWzE1XSB8PSBiaXRfcG9pbnRlcjsKKwkJc2Vuc2VfYnVmWzE2XSA9IGZpZWxkX3BvaW50ZXIgPj4gODsJLyogTVNCICovCisJCXNlbnNlX2J1ZlsxN10gPSBmaWVsZF9wb2ludGVyOwkJLyogTFNCICovCisJfQorfQorCitpbnQgYWFjX2dldF9hZGFwdGVyX2luZm8oc3RydWN0IGFhY19kZXYqIGRldikKK3sKKwlzdHJ1Y3QgZmliKiBmaWJwdHI7CisJc3RydWN0IGFhY19hZGFwdGVyX2luZm8qIGluZm87CisJaW50IHJjb2RlOworCXUzMiB0bXA7CisJaWYgKCEoZmlicHRyID0gZmliX2FsbG9jKGRldikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpYl9pbml0KGZpYnB0cik7CisJaW5mbyA9IChzdHJ1Y3QgYWFjX2FkYXB0ZXJfaW5mbyopIGZpYl9kYXRhKGZpYnB0cik7CisKKwltZW1zZXQoaW5mbywwLHNpemVvZihzdHJ1Y3QgYWFjX2FkYXB0ZXJfaW5mbykpOworCisJcmNvZGUgPSBmaWJfc2VuZChSZXF1ZXN0QWRhcHRlckluZm8sCisJCQlmaWJwdHIsIAorCQkJc2l6ZW9mKHN0cnVjdCBhYWNfYWRhcHRlcl9pbmZvKSwKKwkJCUZzYU5vcm1hbCwgCisJCQkxLCAxLCAKKwkJCU5VTEwsIAorCQkJTlVMTCk7CisKKwltZW1jcHkoJmRldi0+YWRhcHRlcl9pbmZvLCBpbmZvLCBzaXplb2Yoc3RydWN0IGFhY19hZGFwdGVyX2luZm8pKTsKKworCXRtcCA9IGxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbHJldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDoga2VybmVsICVkLiVkLSVkWyVkXVxuIiwgCisJCQlkZXYtPm5hbWUsIAorCQkJZGV2LT5pZCwKKwkJCXRtcD4+MjQsCisJCQkodG1wPj4xNikmMHhmZiwKKwkJCXRtcCYweGZmLAorCQkJbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8ua2VybmVsYnVpbGQpKTsKKwl0bXAgPSBsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5tb25pdG9ycmV2KTsKKwlwcmludGsoS0VSTl9JTkZPICIlcyVkOiBtb25pdG9yICVkLiVkLSVkWyVkXVxuIiwgCisJCQlkZXYtPm5hbWUsIGRldi0+aWQsCisJCQl0bXA+PjI0LCh0bXA+PjE2KSYweGZmLHRtcCYweGZmLAorCQkJbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8ubW9uaXRvcmJ1aWxkKSk7CisJdG1wID0gbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8uYmlvc3Jldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDogYmlvcyAlZC4lZC0lZFslZF1cbiIsIAorCQkJZGV2LT5uYW1lLCBkZXYtPmlkLAorCQkJdG1wPj4yNCwodG1wPj4xNikmMHhmZix0bXAmMHhmZiwKKwkJCWxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLmJpb3NidWlsZCkpOworCWlmIChsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5zZXJpYWxbMF0pICE9IDB4QkFEMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDogc2VyaWFsICV4XG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmlkLAorCQkJbGUzMl90b19jcHUoZGV2LT5hZGFwdGVyX2luZm8uc2VyaWFsWzBdKSk7CisKKwlkZXYtPm5vbmRhc2Rfc3VwcG9ydCA9IDA7CisJZGV2LT5yYWlkX3Njc2lfbW9kZSA9IDA7CisJaWYoZGV2LT5hZGFwdGVyX2luZm8ub3B0aW9ucyAmIEFBQ19PUFRfTk9OREFTRCl7CisJCWRldi0+bm9uZGFzZF9zdXBwb3J0ID0gMTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBmaXJtd2FyZSBzdXBwb3J0cyBST01CIFJBSUQvU0NTSSBtb2RlIGFuZCB3ZSBhcmUgY3VycmVudGx5CisJICogaW4gUkFJRC9TQ1NJIG1vZGUsIHNldCB0aGUgZmxhZy4gRm9yIG5vdyBpZiBpbiB0aGlzIG1vZGUgd2Ugd2lsbAorCSAqIGZvcmNlIG5vbmRhc2Qgc3VwcG9ydCBvbi4gSWYgd2UgZGVjaWRlIHRvIGFsbG93IHRoZSBub24tZGFzZCBmbGFnCisJICogYWRkaXRpb25hbCBjaGFuZ2VzIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUgdG8gc3VwcG9ydAorCSAqIFJBSUQvU0NTSS4gIHRoZSBmdW5jdGlvbiBhYWNfc2NzaV9jbWQgaW4gdGhpcyBtb2R1bGUgd2lsbCBoYXZlIHRvIGJlCisJICogY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBuZXcgZGV2LT5yYWlkX3Njc2lfbW9kZSBmbGFnIGluc3RlYWQgb2YKKwkgKiBsZWFjaGluZyBvZmYgb2YgdGhlIGRldi0+bm9uZGFzZF9zdXBwb3J0IGZsYWcuIEFsc28gaW4gbGluaXQuYyB0aGUKKwkgKiBmdW5jdGlvbiBhYWNfZGV0ZWN0IHdpbGwgaGF2ZSB0byBiZSBtb2RpZmllZCB3aGVyZSBpdCBzZXRzIHVwIHRoZQorCSAqIG1heCBudW1iZXIgb2YgY2hhbm5lbHMgYmFzZWQgb24gdGhlIGFhYy0+bm9uZGFzZF9zdXBwb3J0IGZsYWcgb25seS4KKwkgKi8KKwlpZiAoKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX1NDU0lfTUFOQUdFRCkgJiYKKwkgICAgKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX1JBSURfU0NTSV9NT0RFKSkgeworCQlkZXYtPm5vbmRhc2Rfc3VwcG9ydCA9IDE7CisJCWRldi0+cmFpZF9zY3NpX21vZGUgPSAxOworCX0KKwlpZiAoZGV2LT5yYWlkX3Njc2lfbW9kZSAhPSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyVkOiBST01CIFJBSUQvU0NTSSBtb2RlIGVuYWJsZWRcbiIsCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlkKTsKKwkJCisJaWYobm9uZGFzZCAhPSAtMSkgeyAgCisJCWRldi0+bm9uZGFzZF9zdXBwb3J0ID0gKG5vbmRhc2QhPTApOworCX0KKwlpZihkZXYtPm5vbmRhc2Rfc3VwcG9ydCAhPSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlZDogTm9uLURBU0Qgc3VwcG9ydCBlbmFibGVkLlxuIixkZXYtPm5hbWUsIGRldi0+aWQpOworCX0KKworCWRldi0+ZGFjX3N1cHBvcnQgPSAwOworCWlmKCAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgKGRldi0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX1NHTUFQX0hPU1Q2NCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlcyVkOiA2NGJpdCBzdXBwb3J0IGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aWQpOworCQlkZXYtPmRhY19zdXBwb3J0ID0gMTsKKwl9CisKKwlpZihkYWNtb2RlICE9IC0xKSB7CisJCWRldi0+ZGFjX3N1cHBvcnQgPSAoZGFjbW9kZSE9MCk7CisJfQorCWlmKGRldi0+ZGFjX3N1cHBvcnQgIT0gMCkgeworCQlpZiAoIXBjaV9zZXRfZG1hX21hc2soZGV2LT5wZGV2LCAweEZGRkZGRkZGRkZGRkZGRkZVTEwpICYmCisJCQkhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldi0+cGRldiwgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyIlcyVkOiA2NCBCaXQgREFDIGVuYWJsZWRcbiIsCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlkKTsKKwkJfSBlbHNlIGlmICghcGNpX3NldF9kbWFfbWFzayhkZXYtPnBkZXYsIDB4RkZGRkZGRkZVTEwpICYmCisJCQkhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldi0+cGRldiwgMHhGRkZGRkZGRlVMTCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8iJXMlZDogRE1BIG1hc2sgc2V0IGZhaWxlZCwgNjQgQml0IERBQyBkaXNhYmxlZFxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aWQpOworCQkJZGV2LT5kYWNfc3VwcG9ydCA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzJWQ6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iLAorCQkJCWRldi0+bmFtZSwgZGV2LT5pZCk7CisJCQlyY29kZSA9IC1FTk9NRU07CisJCX0KKwl9CisKKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCisJcmV0dXJuIHJjb2RlOworfQorCisKK3N0YXRpYyB2b2lkIHJlYWRfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2OworCXN0cnVjdCBhYWNfcmVhZF9yZXBseSAqcmVhZHJlcGx5OworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CisJdTMyIGxiYTsKKwl1MzIgY2lkOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisKKwlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWNpZCA9IElEX0xVTl9UT19DT05UQUlORVIoc2NzaWNtZC0+ZGV2aWNlLT5pZCwgc2NzaWNtZC0+ZGV2aWNlLT5sdW4pOworCisJbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOworCWRwcmludGsoKEtFUk5fREVCVUcgInJlYWRfY2FsbGJhY2tbY3B1ICVkXTogbGJhID0gJXUsIHQgPSAlbGQuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGxiYSwgamlmZmllcykpOworCisJaWYgKGZpYnB0ciA9PSBOVUxMKQorCQlCVUcoKTsKKwkJCisJaWYoc2NzaWNtZC0+dXNlX3NnKQorCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAKKwkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpY21kLT5idWZmZXIsCisJCQlzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJZWxzZSBpZihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBzY3NpY21kLT5TQ3AuZG1hX2hhbmRsZSwKKwkJCQkgc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJcmVhZHJlcGx5ID0gKHN0cnVjdCBhYWNfcmVhZF9yZXBseSAqKWZpYl9kYXRhKGZpYnB0cik7CisJaWYgKGxlMzJfdG9fY3B1KHJlYWRyZXBseS0+c3RhdHVzKSA9PSBTVF9PSykKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZF9jYWxsYmFjazogcmVhZCBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLAorCQkJCWxlMzJfdG9fY3B1KHJlYWRyZXBseS0+c3RhdHVzKSk7CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJc2V0X3NlbnNlKCh1OCAqKSAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJCQkgICAgSEFSRFdBUkVfRVJST1IsCisJCQkJICAgIFNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsCisJCQkJICAgIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLCAwLCAwLAorCQkJCSAgICAwLCAwKTsKKwkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgKHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSA+IHNpemVvZihzY3NpY21kLT5zZW5zZV9idWZmZXIpKQorCQkgICAgPyBzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKQorCQkgICAgOiBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkpOworCX0KKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCisJYWFjX2lvX2RvbmUoc2NzaWNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBmaWIgKiBmaWJwdHIpCit7CisJc3RydWN0IGFhY19kZXYgKmRldjsKKwlzdHJ1Y3QgYWFjX3dyaXRlX3JlcGx5ICp3cml0ZXJlcGx5OworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CisJdTMyIGxiYTsKKwl1MzIgY2lkOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwljaWQgPSBJRF9MVU5fVE9fQ09OVEFJTkVSKHNjc2ljbWQtPmRldmljZS0+aWQsIHNjc2ljbWQtPmRldmljZS0+bHVuKTsKKworCWxiYSA9ICgoc2NzaWNtZC0+Y21uZFsxXSAmIDB4MUYpIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzJdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFszXTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJ3cml0ZV9jYWxsYmFja1tjcHUgJWRdOiBsYmEgPSAldSwgdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbGJhLCBqaWZmaWVzKSk7CisJaWYgKGZpYnB0ciA9PSBOVUxMKQorCQlCVUcoKTsKKworCWlmKHNjc2ljbWQtPnVzZV9zZykKKwkJcGNpX3VubWFwX3NnKGRldi0+cGRldiwgCisJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NzaWNtZC0+YnVmZmVyLAorCQkJc2NzaWNtZC0+dXNlX3NnLAorCQkJc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWVsc2UgaWYoc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgc2NzaWNtZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJIHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJd3JpdGVyZXBseSA9IChzdHJ1Y3QgYWFjX3dyaXRlX3JlcGx5ICopIGZpYl9kYXRhKGZpYnB0cik7CisJaWYgKGxlMzJfdG9fY3B1KHdyaXRlcmVwbHktPnN0YXR1cykgPT0gU1RfT0spCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndyaXRlX2NhbGxiYWNrOiB3cml0ZSBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLCB3cml0ZXJlcGx5LT5zdGF0dXMpOworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCXNldF9zZW5zZSgodTggKikgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkJICAgIEhBUkRXQVJFX0VSUk9SLAorCQkJCSAgICBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLAorCQkJCSAgICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCwKKwkJCQkgICAgMCwgMCk7CisJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLCAKKwkJCQlzaXplb2Yoc3RydWN0IHNlbnNlX2RhdGEpKTsKKwl9CisKKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCWFhY19pb19kb25lKHNjc2ljbWQpOworfQorCitpbnQgYWFjX3JlYWQoc3RydWN0IHNjc2lfY21uZCAqIHNjc2ljbWQsIGludCBjaWQpCit7CisJdTMyIGxiYTsKKwl1MzIgY291bnQ7CisJaW50IHN0YXR1czsKKworCXUxNiBmaWJzaXplOworCXN0cnVjdCBhYWNfZGV2ICpkZXY7CisJc3RydWN0IGZpYiAqIGNtZF9maWJjb250ZXh0OworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvKgorCSAqCUdldCBibG9jayBhZGRyZXNzIGFuZCB0cmFuc2ZlciBsZW5ndGgKKwkgKi8KKwlpZiAoc2NzaWNtZC0+Y21uZFswXSA9PSBSRUFEXzYpCS8qIDYgYnl0ZSBjb21tYW5kICovCisJeworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJhYWNoYmE6IHJlY2VpdmVkIGEgcmVhZCg2KSBjb21tYW5kIG9uIGlkICVkLlxuIiwgY2lkKSk7CisKKwkJbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOworCQljb3VudCA9IHNjc2ljbWQtPmNtbmRbNF07CisKKwkJaWYgKGNvdW50ID09IDApCisJCQljb3VudCA9IDI1NjsKKwl9IGVsc2UgeworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJhYWNoYmE6IHJlY2VpdmVkIGEgcmVhZCgxMCkgY29tbWFuZCBvbiBpZCAlZC5cbiIsIGNpZCkpOworCisJCWxiYSA9IChzY3NpY21kLT5jbW5kWzJdIDw8IDI0KSB8IChzY3NpY21kLT5jbW5kWzNdIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzRdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFs1XTsKKwkJY291bnQgPSAoc2NzaWNtZC0+Y21uZFs3XSA8PCA4KSB8IHNjc2ljbWQtPmNtbmRbOF07CisJfQorCWRwcmludGsoKEtFUk5fREVCVUcgImFhY19yZWFkW2NwdSAlZF06IGxiYSA9ICV1LCB0ID0gJWxkLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBsYmEsIGppZmZpZXMpKTsKKwkvKgorCSAqCUFsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBGaWIKKwkgKi8KKwlpZiAoIShjbWRfZmliY29udGV4dCA9IGZpYl9hbGxvYyhkZXYpKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZmliX2luaXQoY21kX2ZpYmNvbnRleHQpOworCisJaWYoZGV2LT5kYWNfc3VwcG9ydCA9PSAxKSB7CisJCXN0cnVjdCBhYWNfcmVhZDY0ICpyZWFkY21kOworCQlyZWFkY21kID0gKHN0cnVjdCBhYWNfcmVhZDY0ICopIGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKwkJcmVhZGNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0N0SG9zdFJlYWQ2NCk7CisJCXJlYWRjbWQtPmNpZCA9IGNwdV90b19sZTE2KGNpZCk7CisJCXJlYWRjbWQtPnNlY3Rvcl9jb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwkJcmVhZGNtZC0+YmxvY2sgPSBjcHVfdG9fbGUzMihsYmEpOworCQlyZWFkY21kLT5wYWQgICA9IDA7CisJCXJlYWRjbWQtPmZsYWdzID0gMDsgCisKKwkJYWFjX2J1aWxkX3NnNjQoc2NzaWNtZCwgJnJlYWRjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3JlYWQ2NCkgKyAKKwkJCSgobGUzMl90b19jcHUocmVhZGNtZC0+c2cuY291bnQpIC0gMSkgKiAKKwkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5NjQpKTsKKwkJQlVHX09OIChmaWJzaXplID4gKHNpemVvZihzdHJ1Y3QgaHdfZmliKSAtIAorCQkJCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSk7CisJCS8qCisJCSAqCU5vdyBzZW5kIHRoZSBGaWIgdG8gdGhlIGFkYXB0ZXIKKwkJICovCisJCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQ2NCwgCisJCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJCSAgZmlic2l6ZSwgCisJCQkgIEZzYU5vcm1hbCwgCisJCQkgIDAsIDEsIAorCQkJICAoZmliX2NhbGxiYWNrKSByZWFkX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFhY19yZWFkICpyZWFkY21kOworCQlyZWFkY21kID0gKHN0cnVjdCBhYWNfcmVhZCAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJCXJlYWRjbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUzMihWTV9DdEJsb2NrUmVhZCk7CisJCXJlYWRjbWQtPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJCXJlYWRjbWQtPmJsb2NrID0gY3B1X3RvX2xlMzIobGJhKTsKKwkJcmVhZGNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihjb3VudCAqIDUxMik7CisKKwkJaWYgKGNvdW50ICogNTEyID4gKDY0ICogMTAyNCkpCisJCQlCVUcoKTsKKworCQlhYWNfYnVpbGRfc2coc2NzaWNtZCwgJnJlYWRjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3JlYWQpICsgCisJCQkoKGxlMzJfdG9fY3B1KHJlYWRjbWQtPnNnLmNvdW50KSAtIDEpICogCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeSkpOworCQlCVUdfT04gKGZpYnNpemUgPiAoc2l6ZW9mKHN0cnVjdCBod19maWIpIC0gCisJCQkJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKTsKKwkJLyoKKwkJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgorCQkgKi8KKwkJc3RhdHVzID0gZmliX3NlbmQoQ29udGFpbmVyQ29tbWFuZCwgCisJCQkgIGNtZF9maWJjb250ZXh0LCAKKwkJCSAgZmlic2l6ZSwgCisJCQkgIEZzYU5vcm1hbCwgCisJCQkgIDAsIDEsIAorCQkJICAoZmliX2NhbGxiYWNrKSByZWFkX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfQorCisJCisKKwkvKgorCSAqCUNoZWNrIHRoYXQgdGhlIGNvbW1hbmQgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyCisJICovCisJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIAorCQlyZXR1cm4gMDsKKwkJCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX3JlYWQ6IGZpYl9zZW5kIGZhaWxlZCB3aXRoIHN0YXR1czogJWQuXG4iLCBzdGF0dXMpOworCS8qCisJICoJRm9yIHNvbWUgcmVhc29uLCB0aGUgRmliIGRpZG4ndCBxdWV1ZSwgcmV0dXJuIFFVRVVFX0ZVTEwKKwkgKi8KKwlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMOworCWFhY19pb19kb25lKHNjc2ljbWQpOworCWZpYl9jb21wbGV0ZShjbWRfZmliY29udGV4dCk7CisJZmliX2ZyZWUoY21kX2ZpYmNvbnRleHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFhY193cml0ZShzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaWNtZCwgaW50IGNpZCkKK3sKKwl1MzIgbGJhOworCXUzMiBjb3VudDsKKwlpbnQgc3RhdHVzOworCXUxNiBmaWJzaXplOworCXN0cnVjdCBhYWNfZGV2ICpkZXY7CisJc3RydWN0IGZpYiAqIGNtZF9maWJjb250ZXh0OworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvKgorCSAqCUdldCBibG9jayBhZGRyZXNzIGFuZCB0cmFuc2ZlciBsZW5ndGgKKwkgKi8KKwlpZiAoc2NzaWNtZC0+Y21uZFswXSA9PSBXUklURV82KQkvKiA2IGJ5dGUgY29tbWFuZCAqLworCXsKKwkJbGJhID0gKChzY3NpY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwgKHNjc2ljbWQtPmNtbmRbMl0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzNdOworCQljb3VudCA9IHNjc2ljbWQtPmNtbmRbNF07CisJCWlmIChjb3VudCA9PSAwKQorCQkJY291bnQgPSAyNTY7CisJfSBlbHNlIHsKKwkJZHByaW50aygoS0VSTl9ERUJVRyAiYWFjaGJhOiByZWNlaXZlZCBhIHdyaXRlKDEwKSBjb21tYW5kIG9uIGlkICVkLlxuIiwgY2lkKSk7CisJCWxiYSA9IChzY3NpY21kLT5jbW5kWzJdIDw8IDI0KSB8IChzY3NpY21kLT5jbW5kWzNdIDw8IDE2KSB8IChzY3NpY21kLT5jbW5kWzRdIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFs1XTsKKwkJY291bnQgPSAoc2NzaWNtZC0+Y21uZFs3XSA8PCA4KSB8IHNjc2ljbWQtPmNtbmRbOF07CisJfQorCWRwcmludGsoKEtFUk5fREVCVUcgImFhY193cml0ZVtjcHUgJWRdOiBsYmEgPSAldSwgdCA9ICVsZC5cbiIsCisJICBzbXBfcHJvY2Vzc29yX2lkKCksICh1bnNpZ25lZCBsb25nIGxvbmcpbGJhLCBqaWZmaWVzKSk7CisJLyoKKwkgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEZpYiB0aGVuIHNldHVwIGEgQmxvY2tXcml0ZSBjb21tYW5kCisJICovCisJaWYgKCEoY21kX2ZpYmNvbnRleHQgPSBmaWJfYWxsb2MoZGV2KSkpIHsKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlhYWNfaW9fZG9uZShzY3NpY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCWZpYl9pbml0KGNtZF9maWJjb250ZXh0KTsKKworCWlmKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgeworCQlzdHJ1Y3QgYWFjX3dyaXRlNjQgKndyaXRlY21kOworCQl3cml0ZWNtZCA9IChzdHJ1Y3QgYWFjX3dyaXRlNjQgKikgZmliX2RhdGEoY21kX2ZpYmNvbnRleHQpOworCQl3cml0ZWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0N0SG9zdFdyaXRlNjQpOworCQl3cml0ZWNtZC0+Y2lkID0gY3B1X3RvX2xlMTYoY2lkKTsKKwkJd3JpdGVjbWQtPnNlY3Rvcl9jb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsgCisJCXdyaXRlY21kLT5ibG9jayA9IGNwdV90b19sZTMyKGxiYSk7CisJCXdyaXRlY21kLT5wYWQJPSAwOworCQl3cml0ZWNtZC0+ZmxhZ3MJPSAwOworCisJCWFhY19idWlsZF9zZzY0KHNjc2ljbWQsICZ3cml0ZWNtZC0+c2cpOworCQlmaWJzaXplID0gc2l6ZW9mKHN0cnVjdCBhYWNfd3JpdGU2NCkgKyAKKwkJCSgobGUzMl90b19jcHUod3JpdGVjbWQtPnNnLmNvdW50KSAtIDEpICogCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeTY0KSk7CisJCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kNjQsIAorCQkJICBjbWRfZmliY29udGV4dCwgCisJCQkgIGZpYnNpemUsIAorCQkJICBGc2FOb3JtYWwsIAorCQkJICAwLCAxLCAKKwkJCSAgKGZpYl9jYWxsYmFjaykgd3JpdGVfY2FsbGJhY2ssIAorCQkJICAodm9pZCAqKSBzY3NpY21kKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWFjX3dyaXRlICp3cml0ZWNtZDsKKwkJd3JpdGVjbWQgPSAoc3RydWN0IGFhY193cml0ZSAqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJCXdyaXRlY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoVk1fQ3RCbG9ja1dyaXRlKTsKKwkJd3JpdGVjbWQtPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJCXdyaXRlY21kLT5ibG9jayA9IGNwdV90b19sZTMyKGxiYSk7CisJCXdyaXRlY21kLT5jb3VudCA9IGNwdV90b19sZTMyKGNvdW50ICogNTEyKTsKKwkJd3JpdGVjbWQtPnNnLmNvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJCS8qIC0+c3RhYmxlIGlzIG5vdCB1c2VkIC0gaXQgZGlkIG1lYW4gd2hpY2ggdHlwZSBvZiB3cml0ZSAqLworCisJCWlmIChjb3VudCAqIDUxMiA+ICg2NCAqIDEwMjQpKSB7CisJCQlCVUcoKTsKKwkJfQorCisJCWFhY19idWlsZF9zZyhzY3NpY21kLCAmd3JpdGVjbWQtPnNnKTsKKwkJZmlic2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWFjX3dyaXRlKSArIAorCQkJKChsZTMyX3RvX2NwdSh3cml0ZWNtZC0+c2cuY291bnQpIC0gMSkgKiAKKwkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5KSk7CisJCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChDb250YWluZXJDb21tYW5kLCAKKwkJCSAgY21kX2ZpYmNvbnRleHQsIAorCQkJICBmaWJzaXplLCAKKwkJCSAgRnNhTm9ybWFsLCAKKwkJCSAgMCwgMSwgCisJCQkgIChmaWJfY2FsbGJhY2spIHdyaXRlX2NhbGxiYWNrLCAKKwkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfQorCisJLyoKKwkgKglDaGVjayB0aGF0IHRoZSBjb21tYW5kIHF1ZXVlZCB0byB0aGUgY29udHJvbGxlcgorCSAqLworCWlmIChzdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCXsKKwkJZHByaW50aygid3JpdGUgcXVldWVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImFhY193cml0ZTogZmliX3NlbmQgZmFpbGVkIHdpdGggc3RhdHVzOiAlZFxuIiwgc3RhdHVzKTsKKwkvKgorCSAqCUZvciBzb21lIHJlYXNvbiwgdGhlIEZpYiBkaWRuJ3QgcXVldWUsIHJldHVybiBRVUVVRV9GVUxMCisJICovCisJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfVEFTS19TRVRfRlVMTDsKKwlhYWNfaW9fZG9uZShzY3NpY21kKTsKKworCWZpYl9jb21wbGV0ZShjbWRfZmliY29udGV4dCk7CisJZmliX2ZyZWUoY21kX2ZpYmNvbnRleHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeW5jaHJvbml6ZV9jYWxsYmFjayh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZmliICpmaWJwdHIpCit7CisJc3RydWN0IGFhY19zeW5jaHJvbml6ZV9yZXBseSAqc3luY2hyb25pemVyZXBseTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwljbWQgPSBjb250ZXh0OworCisJZHByaW50aygoS0VSTl9ERUJVRyAic3luY2hyb25pemVfY2FsbGJhY2tbY3B1ICVkXTogdCA9ICVsZC5cbiIsIAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcykpOworCUJVR19PTihmaWJwdHIgPT0gTlVMTCk7CisKKworCXN5bmNocm9uaXplcmVwbHkgPSBmaWJfZGF0YShmaWJwdHIpOworCWlmIChsZTMyX3RvX2NwdShzeW5jaHJvbml6ZXJlcGx5LT5zdGF0dXMpID09IENUX09LKQorCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IAorCQkJQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfR09PRDsKKwllbHNlIHsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwkJdTMyIGNpZCA9IElEX0xVTl9UT19DT05UQUlORVIoc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSAgICAgInN5bmNocm9uaXplX2NhbGxiYWNrOiBzeW5jaHJvbml6ZSBmYWlsZWQsIHN0YXR1cyA9ICVkXG4iLAorCQkgICAgIGxlMzJfdG9fY3B1KHN5bmNocm9uaXplcmVwbHktPnN0YXR1cykpOworCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IAorCQkJQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQlzZXRfc2Vuc2UoKHU4ICopJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkJICAgIEhBUkRXQVJFX0VSUk9SLAorCQkJCSAgICBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLAorCQkJCSAgICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCwKKwkJCQkgICAgMCwgMCk7CisJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgbWluKHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSwgCisJCQkgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpKTsKKwl9CisKKwlmaWJfY29tcGxldGUoZmlicHRyKTsKKwlmaWJfZnJlZShmaWJwdHIpOworCWFhY19pb19kb25lKGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgYWFjX3N5bmNocm9uaXplKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQsIGludCBjaWQpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZmliICpjbWRfZmliY29udGV4dDsKKwlzdHJ1Y3QgYWFjX3N5bmNocm9uaXplICpzeW5jaHJvbml6ZWNtZDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOworCWludCBhY3RpdmUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFdhaXQgZm9yIGFsbCBjb21tYW5kcyB0byBjb21wbGV0ZSB0byB0aGlzIHNwZWNpZmljCisJICogdGFyZ2V0IChibG9jaykuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmc2Rldi0+Y21kX2xpc3QsIGxpc3QpCisJCWlmIChjbWQgIT0gc2NzaWNtZCAmJiBjbWQtPnNlcmlhbF9udW1iZXIgIT0gMCkgeworCQkJKythY3RpdmU7CisJCQlicmVhazsKKwkJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Rldi0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqCVlpZWxkIHRoZSBwcm9jZXNzb3IgKHJlcXVldWUgZm9yIGxhdGVyKQorCSAqLworCWlmIChhY3RpdmUpCisJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CisKKwkvKgorCSAqCUFsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBGaWIKKwkgKi8KKwlpZiAoIShjbWRfZmliY29udGV4dCA9IAorCSAgICBmaWJfYWxsb2MoKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkpKSAKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwlmaWJfaW5pdChjbWRfZmliY29udGV4dCk7CisKKwlzeW5jaHJvbml6ZWNtZCA9IGZpYl9kYXRhKGNtZF9maWJjb250ZXh0KTsKKwlzeW5jaHJvbml6ZWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0NvbnRhaW5lckNvbmZpZyk7CisJc3luY2hyb25pemVjbWQtPnR5cGUgPSBjcHVfdG9fbGUzMihDVF9GTFVTSF9DQUNIRSk7CisJc3luY2hyb25pemVjbWQtPmNpZCA9IGNwdV90b19sZTMyKGNpZCk7CisJc3luY2hyb25pemVjbWQtPmNvdW50ID0gCisJICAgICBjcHVfdG9fbGUzMihzaXplb2YoKChzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5ICopTlVMTCktPmRhdGEpKTsKKworCS8qCisJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgorCSAqLworCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsCisJCSAgY21kX2ZpYmNvbnRleHQsCisJCSAgc2l6ZW9mKHN0cnVjdCBhYWNfc3luY2hyb25pemUpLAorCQkgIEZzYU5vcm1hbCwKKwkJICAwLCAxLAorCQkgIChmaWJfY2FsbGJhY2spc3luY2hyb25pemVfY2FsbGJhY2ssCisJCSAgKHZvaWQgKilzY3NpY21kKTsKKworCS8qCisJICoJQ2hlY2sgdGhhdCB0aGUgY29tbWFuZCBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIKKwkgKi8KKwlpZiAoc3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkiYWFjX3N5bmNocm9uaXplOiBmaWJfc2VuZCBmYWlsZWQgd2l0aCBzdGF0dXM6ICVkLlxuIiwgc3RhdHVzKTsKKwlmaWJfY29tcGxldGUoY21kX2ZpYmNvbnRleHQpOworCWZpYl9mcmVlKGNtZF9maWJjb250ZXh0KTsKKwlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKK30KKworLyoqCisgKglhYWNfc2NzaV9jbWQoKQkJLQlQcm9jZXNzIFNDU0kgY29tbWFuZAorICoJQHNjc2ljbWQ6CQlTQ1NJIGNvbW1hbmQgYmxvY2sKKyAqCisgKglFbXVsYXRlIGEgU0NTSSBjb21tYW5kIGFuZCBxdWV1ZSB0aGUgcmVxdWlyZWQgcmVxdWVzdCBmb3IgdGhlCisgKglhYWNyYWlkIGZpcm13YXJlLgorICovCisgCitpbnQgYWFjX3Njc2lfY21kKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpY21kKQoreworCXUzMiBjaWQgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBzY3NpY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IGFhY19kZXYgKmRldiA9IChzdHJ1Y3QgYWFjX2RldiAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBmc2FfZGV2X2luZm8gKmZzYV9kZXZfcHRyID0gZGV2LT5mc2FfZGV2OworCWludCBjYXJkdHlwZSA9IGRldi0+Y2FyZHR5cGU7CisJaW50IHJldDsKKwkKKwkvKgorCSAqCUlmIHRoZSBidXMsIGlkIG9yIGx1biBpcyBvdXQgb2YgcmFuZ2UsIHJldHVybiBmYWlsCisJICoJVGVzdCBkb2VzIG5vdCBhcHBseSB0byBJRCAxNiwgdGhlIHBzZXVkbyBpZCBmb3IgdGhlIGNvbnRyb2xsZXIKKwkgKglpdHNlbGYuCisJICovCisJaWYgKHNjc2ljbWQtPmRldmljZS0+aWQgIT0gaG9zdC0+dGhpc19pZCkgeworCQlpZiAoKHNjc2ljbWQtPmRldmljZS0+Y2hhbm5lbCA9PSAwKSApeworCQkJaWYoIChzY3NpY21kLT5kZXZpY2UtPmlkID49IGRldi0+bWF4aW11bV9udW1fY29udGFpbmVycykgfHwgKHNjc2ljbWQtPmRldmljZS0+bHVuICE9IDApKXsgCisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJY2lkID0gSURfTFVOX1RPX0NPTlRBSU5FUihzY3NpY21kLT5kZXZpY2UtPmlkLCBzY3NpY21kLT5kZXZpY2UtPmx1bik7CisKKwkJCS8qCisJCQkgKglJZiB0aGUgdGFyZ2V0IGNvbnRhaW5lciBkb2Vzbid0IGV4aXN0LCBpdCBtYXkgaGF2ZQorCQkJICoJYmVlbiBuZXdseSBjcmVhdGVkCisJCQkgKi8KKwkJCWlmICgoZnNhX2Rldl9wdHJbY2lkXS52YWxpZCAmIDEpID09IDApIHsKKwkJCQlzd2l0Y2ggKHNjc2ljbWQtPmNtbmRbMF0pIHsKKwkJCQljYXNlIElOUVVJUlk6CisJCQkJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQkJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwkJCQkJcHJvYmVfY29udGFpbmVyKGRldiwgY2lkKTsKKwkJCQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQkJCQlpZiAoZnNhX2Rldl9wdHJbY2lkXS52YWxpZCA9PSAwKSB7CisJCQkJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCQkJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqCUlmIHRoZSB0YXJnZXQgY29udGFpbmVyIHN0aWxsIGRvZXNuJ3QgZXhpc3QsIAorCQkJICoJcmV0dXJuIGZhaWx1cmUKKwkJCSAqLworCQkJaWYgKGZzYV9kZXZfcHRyW2NpZF0udmFsaWQgPT0gMCkgeworCQkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQkJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsgIC8qIGNoZWNrIGZvciBwaHlzaWNhbCBub24tZGFzZCBkZXZpY2VzICovCisJCQlpZihkZXYtPm5vbmRhc2Rfc3VwcG9ydCA9PSAxKXsKKwkJCQlyZXR1cm4gYWFjX3NlbmRfc3JiX2ZpYihzY3NpY21kKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCS8qCisJICogZWxzZSBDb21tYW5kIGZvciB0aGUgY29udHJvbGxlciBpdHNlbGYKKwkgKi8KKwllbHNlIGlmICgoc2NzaWNtZC0+Y21uZFswXSAhPSBJTlFVSVJZKSAmJgkvKiBvbmx5IElOUVVJUlkgJiBUVVIgY21uZCBzdXBwb3J0ZWQgZm9yIGNvbnRyb2xsZXIgKi8KKwkJKHNjc2ljbWQtPmNtbmRbMF0gIT0gVEVTVF9VTklUX1JFQURZKSkgCisJeworCQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgIk9ubHkgSU5RVUlSWSAmIFRVUiBjb21tYW5kIHN1cHBvcnRlZCBmb3IgY29udHJvbGxlciwgcmN2ZCA9IDB4JXguXG4iLCBzY3NpY21kLT5jbW5kWzBdKSk7CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJc2V0X3NlbnNlKCh1OCAqKSAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJCSAgICBJTExFR0FMX1JFUVVFU1QsCisJCQkgICAgU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsCisJCQkgICAgQVNFTkNPREVfSU5WQUxJRF9DT01NQU5ELCAwLCAwLCAwLCAwKTsKKwkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgKHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSA+IHNpemVvZihzY3NpY21kLT5zZW5zZV9idWZmZXIpKQorCQkgICAgPyBzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKQorCQkgICAgOiBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkpOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCXJldHVybiAwOworCX0KKworCisJLyogSGFuZGxlIGNvbW1hbmRzIGhlcmUgdGhhdCBkb24ndCByZWFsbHkgcmVxdWlyZSBnb2luZyBvdXQgdG8gdGhlIGFkYXB0ZXIgKi8KKwlzd2l0Y2ggKHNjc2ljbWQtPmNtbmRbMF0pIHsKKwljYXNlIElOUVVJUlk6CisJeworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhICppbnFfZGF0YV9wdHI7CisKKwkJZHByaW50aygoS0VSTl9ERUJVRyAiSU5RVUlSWSBjb21tYW5kLCBJRDogJWQuXG4iLCBzY3NpY21kLT5kZXZpY2UtPmlkKSk7CisJCWlucV9kYXRhX3B0ciA9IChzdHJ1Y3QgaW5xdWlyeV9kYXRhICopc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCW1lbXNldChpbnFfZGF0YV9wdHIsIDAsIHNpemVvZiAoc3RydWN0IGlucXVpcnlfZGF0YSkpOworCisJCWlucV9kYXRhX3B0ci0+aW5xZF92ZXIgPSAyOwkvKiBjbGFpbSBjb21wbGlhbmNlIHRvIFNDU0ktMiAqLworCQlpbnFfZGF0YV9wdHItPmlucWRfZHRxID0gMHg4MDsJLyogc2V0IFJNQiBiaXQgdG8gb25lIGluZGljYXRpbmcgdGhhdCB0aGUgbWVkaXVtIGlzIHJlbW92YWJsZSAqLworCQlpbnFfZGF0YV9wdHItPmlucWRfcmRmID0gMjsJLyogQSByZXNwb25zZSBkYXRhIGZvcm1hdCB2YWx1ZSBvZiB0d28gaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgc2hhbGwgYmUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gU0NTSS0yICovCisJCWlucV9kYXRhX3B0ci0+aW5xZF9sZW4gPSAzMTsKKwkJLypGb3JtYXQgZm9yICJwYWQyIiBpcyAgUmVsQWRyIHwgV0J1czMyIHwgV0J1czE2IHwgIFN5bmMgIHwgTGlua2VkIHxSZXNlcnZlZHwgQ21kUXVlIHwgU2Z0UmUgKi8KKwkJaW5xX2RhdGFfcHRyLT5pbnFkX3BhZDI9IDB4MzIgOwkgLypXQnVzMTZ8U3luY3xDbWRRdWUgKi8KKwkJLyoKKwkJICoJU2V0IHRoZSBWZW5kb3IsIFByb2R1Y3QsIGFuZCBSZXZpc2lvbiBMZXZlbAorCQkgKglzZWU6IDx2ZW5kb3I+LmMgaS5lLiBhYWMuYworCQkgKi8KKwkJaWYgKHNjc2ljbWQtPmRldmljZS0+aWQgPT0gaG9zdC0+dGhpc19pZCkgeworCQkJc2V0aW5xc3RyKGNhcmR0eXBlLCAodm9pZCAqKSAoaW5xX2RhdGFfcHRyLT5pbnFkX3ZpZCksIChzaXplb2YoY29udGFpbmVyX3R5cGVzKS9zaXplb2YoY2hhciAqKSkpOworCQkJaW5xX2RhdGFfcHRyLT5pbnFkX3BkdCA9IElOUURfUERUX1BST0M7CS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKwkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzZXRpbnFzdHIoY2FyZHR5cGUsICh2b2lkICopIChpbnFfZGF0YV9wdHItPmlucWRfdmlkKSwgZnNhX2Rldl9wdHJbY2lkXS50eXBlKTsKKwkJaW5xX2RhdGFfcHRyLT5pbnFkX3BkdCA9IElOUURfUERUX0RBOwkvKiBEaXJlY3QvcmFuZG9tIGFjY2VzcyBkZXZpY2UgKi8KKwkJcmV0dXJuIGFhY19nZXRfY29udGFpbmVyX25hbWUoc2NzaWNtZCwgY2lkKTsKKwl9CisJY2FzZSBSRUFEX0NBUEFDSVRZOgorCXsKKwkJdTMyIGNhcGFjaXR5OworCQljaGFyICpjcDsKKworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJSRUFEIENBUEFDSVRZIGNvbW1hbmQuXG4iKSk7CisJCWlmIChmc2FfZGV2X3B0cltjaWRdLnNpemUgPD0gMHgxMDAwMDAwMDBMTCkKKwkJCWNhcGFjaXR5ID0gZnNhX2Rldl9wdHJbY2lkXS5zaXplIC0gMTsKKwkJZWxzZQorCQkJY2FwYWNpdHkgPSAodTMyKS0xOworCQljcCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCQljcFswXSA9IChjYXBhY2l0eSA+PiAyNCkgJiAweGZmOworCQljcFsxXSA9IChjYXBhY2l0eSA+PiAxNikgJiAweGZmOworCQljcFsyXSA9IChjYXBhY2l0eSA+PiA4KSAmIDB4ZmY7CisJCWNwWzNdID0gKGNhcGFjaXR5ID4+IDApICYgMHhmZjsKKwkJY3BbNF0gPSAwOworCQljcFs1XSA9IDA7CisJCWNwWzZdID0gMjsKKwkJY3BbN10gPSAwOworCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIE1PREVfU0VOU0U6CisJeworCQljaGFyICptb2RlX2J1ZjsKKworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJNT0RFIFNFTlNFIGNvbW1hbmQuXG4iKSk7CisJCW1vZGVfYnVmID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCW1vZGVfYnVmWzBdID0gMzsJLyogTW9kZSBkYXRhIGxlbmd0aCAqLworCQltb2RlX2J1ZlsxXSA9IDA7CS8qIE1lZGl1bSB0eXBlIC0gZGVmYXVsdCAqLworCQltb2RlX2J1ZlsyXSA9IDA7CS8qIERldmljZS1zcGVjaWZpYyBwYXJhbSwgYml0IDg6IDAvMSA9IHdyaXRlIGVuYWJsZWQvcHJvdGVjdGVkICovCisJCW1vZGVfYnVmWzNdID0gMDsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKi8KKworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgTU9ERV9TRU5TRV8xMDoKKwl7CisJCWNoYXIgKm1vZGVfYnVmOworCisJCWRwcmludGsoKEtFUk5fREVCVUcgIk1PREUgU0VOU0UgMTAgYnl0ZSBjb21tYW5kLlxuIikpOworCQltb2RlX2J1ZiA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCQltb2RlX2J1ZlswXSA9IDA7CS8qIE1vZGUgZGF0YSBsZW5ndGggKE1TQikgKi8KKwkJbW9kZV9idWZbMV0gPSA2OwkvKiBNb2RlIGRhdGEgbGVuZ3RoIChMU0IpICovCisJCW1vZGVfYnVmWzJdID0gMDsJLyogTWVkaXVtIHR5cGUgLSBkZWZhdWx0ICovCisJCW1vZGVfYnVmWzNdID0gMDsJLyogRGV2aWNlLXNwZWNpZmljIHBhcmFtLCBiaXQgODogMC8xID0gd3JpdGUgZW5hYmxlZC9wcm90ZWN0ZWQgKi8KKwkJbW9kZV9idWZbNF0gPSAwOwkvKiByZXNlcnZlZCAqLworCQltb2RlX2J1Zls1XSA9IDA7CS8qIHJlc2VydmVkICovCisJCW1vZGVfYnVmWzZdID0gMDsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKE1TQikgKi8KKwkJbW9kZV9idWZbN10gPSAwOwkvKiBCbG9jayBkZXNjcmlwdG9yIGxlbmd0aCAoTFNCKSAqLworCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSRVFVRVNUX1NFTlNFOgorCQlkcHJpbnRrKChLRVJOX0RFQlVHICJSRVFVRVNUIFNFTlNFIGNvbW1hbmQuXG4iKSk7CisJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLCBzaXplb2YgKHN0cnVjdCBzZW5zZV9kYXRhKSk7CisJCW1lbXNldCgmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc2Vuc2VfZGF0YSkpOworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCXJldHVybiAwOworCisJY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKKwkJZHByaW50aygoS0VSTl9ERUJVRyAiTE9DSyBjb21tYW5kLlxuIikpOworCQlpZiAoc2NzaWNtZC0+Y21uZFs0XSkKKwkJCWZzYV9kZXZfcHRyW2NpZF0ubG9ja2VkID0gMTsKKwkJZWxzZQorCQkJZnNhX2Rldl9wdHJbY2lkXS5sb2NrZWQgPSAwOworCisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0dPT0Q7CisJCXNjc2ljbWQtPnNjc2lfZG9uZShzY3NpY21kKTsKKwkJcmV0dXJuIDA7CisJLyoKKwkgKglUaGVzZSBjb21tYW5kcyBhcmUgYWxsIE5vLU9wcworCSAqLworCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCWNhc2UgUkVTRVJWRToKKwljYXNlIFJFTEVBU0U6CisJY2FzZSBSRVpFUk9fVU5JVDoKKwljYXNlIFJFQVNTSUdOX0JMT0NLUzoKKwljYXNlIFNFRUtfMTA6CisJY2FzZSBTVEFSVF9TVE9QOgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOworCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoc2NzaWNtZC0+Y21uZFswXSkgCisJeworCQljYXNlIFJFQURfNjoKKwkJY2FzZSBSRUFEXzEwOgorCQkJLyoKKwkJCSAqCUhhY2sgdG8ga2VlcCB0cmFjayBvZiBvcmRpbmFsIG51bWJlciBvZiB0aGUgZGV2aWNlIHRoYXQKKwkJCSAqCWNvcnJlc3BvbmRzIHRvIGEgY29udGFpbmVyLiBOZWVkZWQgdG8gY29udmVydAorCQkJICoJY29udGFpbmVycyB0byAvZGV2L3NkIGRldmljZSBuYW1lcworCQkJICovCisJCQkgCisJCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwkJCWlmICAoc2NzaWNtZC0+cmVxdWVzdC0+cnFfZGlzaykKKwkJCQltZW1jcHkoZnNhX2Rldl9wdHJbY2lkXS5kZXZuYW1lLAorCQkJCQlzY3NpY21kLT5yZXF1ZXN0LT5ycV9kaXNrLT5kaXNrX25hbWUsCisJCQkJCTgpOworCisJCQlyZXQgPSBhYWNfcmVhZChzY3NpY21kLCBjaWQpOworCQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIHJldDsKKworCQljYXNlIFdSSVRFXzY6CisJCWNhc2UgV1JJVEVfMTA6CisJCQlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwkJCXJldCA9IGFhY193cml0ZShzY3NpY21kLCBjaWQpOworCQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIHJldDsKKworCQljYXNlIFNZTkNIUk9OSVpFX0NBQ0hFOgorCQkJLyogSXNzdWUgRklCIHRvIHRlbGwgRmlybXdhcmUgdG8gZmx1c2ggaXQncyBjYWNoZSAqLworCQkJcmV0dXJuIGFhY19zeW5jaHJvbml6ZShzY3NpY21kLCBjaWQpOworCQkJCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICoJVW5oYW5kbGVkIGNvbW1hbmRzCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuaGFuZGxlZCBTQ1NJIENvbW1hbmQ6IDB4JXguXG4iLCBzY3NpY21kLT5jbW5kWzBdKTsKKwkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCXNldF9zZW5zZSgodTggKikgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkJSUxMRUdBTF9SRVFVRVNULCBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCwKKwkJCQlBU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsIDAsIDAsIDAsIDApOworCQkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCQkgIChzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkgPiBzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKSkKKwkJCSAgICA/IHNpemVvZihzY3NpY21kLT5zZW5zZV9idWZmZXIpCisJCQkgICAgOiBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSkpOworCQkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Rpc2soc3RydWN0IGFhY19kZXYgKmRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYWFjX3F1ZXJ5X2Rpc2sgcWQ7CisJc3RydWN0IGZzYV9kZXZfaW5mbyAqZnNhX2Rldl9wdHI7CisKKwlmc2FfZGV2X3B0ciA9IGRldi0+ZnNhX2RldjsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnFkLCBhcmcsIHNpemVvZiAoc3RydWN0IGFhY19xdWVyeV9kaXNrKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChxZC5jbnVtID09IC0xKQorCQlxZC5jbnVtID0gSURfTFVOX1RPX0NPTlRBSU5FUihxZC5pZCwgcWQubHVuKTsKKwllbHNlIGlmICgocWQuYnVzID09IC0xKSAmJiAocWQuaWQgPT0gLTEpICYmIChxZC5sdW4gPT0gLTEpKSAKKwl7CisJCWlmIChxZC5jbnVtIDwgMCB8fCBxZC5jbnVtID49IGRldi0+bWF4aW11bV9udW1fY29udGFpbmVycykKKwkJCXJldHVybiAtRUlOVkFMOworCQlxZC5pbnN0YW5jZSA9IGRldi0+c2NzaV9ob3N0X3B0ci0+aG9zdF9ubzsKKwkJcWQuYnVzID0gMDsKKwkJcWQuaWQgPSBDT05UQUlORVJfVE9fSUQocWQuY251bSk7CisJCXFkLmx1biA9IENPTlRBSU5FUl9UT19MVU4ocWQuY251bSk7CisJfQorCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisKKwlxZC52YWxpZCA9IGZzYV9kZXZfcHRyW3FkLmNudW1dLnZhbGlkOworCXFkLmxvY2tlZCA9IGZzYV9kZXZfcHRyW3FkLmNudW1dLmxvY2tlZDsKKwlxZC5kZWxldGVkID0gZnNhX2Rldl9wdHJbcWQuY251bV0uZGVsZXRlZDsKKworCWlmIChmc2FfZGV2X3B0cltxZC5jbnVtXS5kZXZuYW1lWzBdID09ICdcMCcpCisJCXFkLnVubWFwcGVkID0gMTsKKwllbHNlCisJCXFkLnVubWFwcGVkID0gMDsKKworCXN0cmxjcHkocWQubmFtZSwgZnNhX2Rldl9wdHJbcWQuY251bV0uZGV2bmFtZSwKKwkgIG1pbihzaXplb2YocWQubmFtZSksIHNpemVvZihmc2FfZGV2X3B0cltxZC5jbnVtXS5kZXZuYW1lKSArIDEpKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcWQsIHNpemVvZiAoc3RydWN0IGFhY19xdWVyeV9kaXNrKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZvcmNlX2RlbGV0ZV9kaXNrKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFhY19kZWxldGVfZGlzayBkZDsKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvICpmc2FfZGV2X3B0cjsKKworCWZzYV9kZXZfcHRyID0gZGV2LT5mc2FfZGV2OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkZCwgYXJnLCBzaXplb2YgKHN0cnVjdCBhYWNfZGVsZXRlX2Rpc2spKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZGQuY251bSA+PSBkZXYtPm1heGltdW1fbnVtX2NvbnRhaW5lcnMpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICoJTWFyayB0aGlzIGNvbnRhaW5lciBhcyBiZWluZyBkZWxldGVkLgorCSAqLworCWZzYV9kZXZfcHRyW2RkLmNudW1dLmRlbGV0ZWQgPSAxOworCS8qCisJICoJTWFyayB0aGUgY29udGFpbmVyIGFzIG5vIGxvbmdlciB2YWxpZAorCSAqLworCWZzYV9kZXZfcHRyW2RkLmNudW1dLnZhbGlkID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWxldGVfZGlzayhzdHJ1Y3QgYWFjX2RldiAqZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhYWNfZGVsZXRlX2Rpc2sgZGQ7CisJc3RydWN0IGZzYV9kZXZfaW5mbyAqZnNhX2Rldl9wdHI7CisKKwlmc2FfZGV2X3B0ciA9IGRldi0+ZnNhX2RldjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZGQsIGFyZywgc2l6ZW9mIChzdHJ1Y3QgYWFjX2RlbGV0ZV9kaXNrKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGRkLmNudW0gPj0gZGV2LT5tYXhpbXVtX251bV9jb250YWluZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqCUlmIHRoZSBjb250YWluZXIgaXMgbG9ja2VkLCBpdCBjYW4gbm90IGJlIGRlbGV0ZWQgYnkgdGhlIEFQSS4KKwkgKi8KKwlpZiAoZnNhX2Rldl9wdHJbZGQuY251bV0ubG9ja2VkKQorCQlyZXR1cm4gLUVCVVNZOworCWVsc2UgeworCQkvKgorCQkgKglNYXJrIHRoZSBjb250YWluZXIgYXMgbm8gbG9uZ2VyIGJlaW5nIHZhbGlkLgorCQkgKi8KKwkJZnNhX2Rldl9wdHJbZGQuY251bV0udmFsaWQgPSAwOworCQlmc2FfZGV2X3B0cltkZC5jbnVtXS5kZXZuYW1lWzBdID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgYWFjX2Rldl9pb2N0bChzdHJ1Y3QgYWFjX2RldiAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGU0FDVExfUVVFUllfRElTSzoKKwkJcmV0dXJuIHF1ZXJ5X2Rpc2soZGV2LCBhcmcpOworCWNhc2UgRlNBQ1RMX0RFTEVURV9ESVNLOgorCQlyZXR1cm4gZGVsZXRlX2Rpc2soZGV2LCBhcmcpOworCWNhc2UgRlNBQ1RMX0ZPUkNFX0RFTEVURV9ESVNLOgorCQlyZXR1cm4gZm9yY2VfZGVsZXRlX2Rpc2soZGV2LCBhcmcpOworCWNhc2UgRlNBQ1RMX0dFVF9DT05UQUlORVJTOgorCQlyZXR1cm4gYWFjX2dldF9jb250YWluZXJzKGRldik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCisvKioKKyAqCisgKiBhYWNfc3JiX2NhbGxiYWNrCisgKiBAY29udGV4dDogdGhlIGNvbnRleHQgc2V0IGluIHRoZSBmaWIgLSBoZXJlIGl0IGlzIHNjc2kgY21kCisgKiBAZmlicHRyOiBwb2ludGVyIHRvIHRoZSBmaWIKKyAqCisgKiBIYW5kbGVzIHRoZSBjb21wbGV0aW9uIG9mIGEgc2NzaSBjb21tYW5kIHRvIGEgbm9uIGRhc2QgZGV2aWNlCisgKgorICovCisKK3N0YXRpYyB2b2lkIGFhY19zcmJfY2FsbGJhY2sodm9pZCAqY29udGV4dCwgc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2OworCXN0cnVjdCBhYWNfc3JiX3JlcGx5ICpzcmJyZXBseTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOworCisJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNvbnRleHQ7CisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmIChmaWJwdHIgPT0gTlVMTCkKKwkJQlVHKCk7CisKKwlzcmJyZXBseSA9IChzdHJ1Y3QgYWFjX3NyYl9yZXBseSAqKSBmaWJfZGF0YShmaWJwdHIpOworCisJc2NzaWNtZC0+c2Vuc2VfYnVmZmVyWzBdID0gJ1wwJzsgIC8qIEluaXRpYWxpemUgc2Vuc2UgdmFsaWQgZmxhZyB0byBmYWxzZSAqLworCS8qCisJICoJQ2FsY3VsYXRlIHJlc2lkIGZvciBzZyAKKwkgKi8KKwkgCisJc2NzaWNtZC0+cmVzaWQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4gLSAKKwkJbGUzMl90b19jcHUoc3JicmVwbHktPmRhdGFfeGZlcl9sZW5ndGgpOworCisJaWYoc2NzaWNtZC0+dXNlX3NnKQorCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAKKwkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpY21kLT5idWZmZXIsCisJCQlzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJZWxzZSBpZihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBzY3NpY21kLT5TQ3AuZG1hX2hhbmRsZSwgc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJc2NzaWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJLyoKKwkgKiBGaXJzdCBjaGVjayB0aGUgZmliIHN0YXR1cworCSAqLworCisJaWYgKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zdGF0dXMpICE9IFNUX09LKXsKKwkJaW50IGxlbjsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjX3NyYl9jYWxsYmFjazogc3JiIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsIGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zdGF0dXMpKTsKKwkJbGVuID0gKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zZW5zZV9kYXRhX3NpemUpID4gCisJCQkJc2l6ZW9mKHNjc2ljbWQtPnNlbnNlX2J1ZmZlcikpID8KKwkJCQlzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKSA6IAorCQkJCWxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zZW5zZV9kYXRhX3NpemUpOworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsIHNyYnJlcGx5LT5zZW5zZV9kYXRhLCBsZW4pOworCX0KKworCS8qCisJICogTmV4dCBjaGVjayB0aGUgc3JiIHN0YXR1cworCSAqLworCXN3aXRjaCggKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zcmJfc3RhdHVzKSkmMHgzZil7CisJY2FzZSBTUkJfU1RBVFVTX0VSUk9SX1JFQ09WRVJZOgorCWNhc2UgU1JCX1NUQVRVU19QRU5ESU5HOgorCWNhc2UgU1JCX1NUQVRVU19TVUNDRVNTOgorCQlpZihzY3NpY21kLT5jbW5kWzBdID09IElOUVVJUlkgKXsKKwkJCXU4IGI7CisJCQl1OCBiMTsKKwkJCS8qIFdlIGNhbid0IGV4cG9zZSBkaXNrIGRldmljZXMgYmVjYXVzZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhleQorCQkJICogYXJlIHRoZSByYXcgY29udGFpbmVyIGRyaXZlcyBvciBzdGFuZCBhbG9uZSBkcml2ZXMuICBJZiB0aGV5IGhhdmUKKwkJCSAqIHRoZSByZW1vdmFibGUgYml0IHNldCB0aGVuIHdlIHNob3VsZCBleHBvc2UgdGhlbSB0aG91Z2guCisJCQkgKi8KKwkJCWIgPSAoKih1OCopc2NzaWNtZC0+YnVmZmVyKSYweDFmOworCQkJYjEgPSAoKHU4KilzY3NpY21kLT5idWZmZXIpWzFdOworCQkJaWYoIGI9PVRZUEVfVEFQRSB8fCBiPT1UWVBFX1dPUk0gfHwgYj09VFlQRV9ST00gfHwgYj09VFlQRV9NT0R8fCBiPT1UWVBFX01FRElVTV9DSEFOR0VSIAorCQkJCQl8fCAoYj09VFlQRV9ESVNLICYmIChiMSYweDgwKSkgKXsKKwkJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCQkvKgorCQkJICogV2Ugd2lsbCBhbGxvdyBkaXNrIGRldmljZXMgaWYgaW4gUkFJRC9TQ1NJIG1vZGUgYW5kCisJCQkgKiB0aGUgY2hhbm5lbCBpcyAyCisJCQkgKi8KKwkJCX0gZWxzZSBpZiAoKGRldi0+cmFpZF9zY3NpX21vZGUpICYmCisJCQkJCShzY3NpY21kLT5kZXZpY2UtPmNoYW5uZWwgPT0gMikpIHsKKwkJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCAKKwkJCQkJCUNPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJCX0gZWxzZSB7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTYgfCAKKwkJCQkJCUNPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJfQorCQlicmVhazsKKwljYXNlIFNSQl9TVEFUVVNfREFUQV9PVkVSUlVOOgorCQlzd2l0Y2goc2NzaWNtZC0+Y21uZFswXSl7CisJCWNhc2UgIFJFQURfNjoKKwkJY2FzZSAgV1JJVEVfNjoKKwkJY2FzZSAgUkVBRF8xMDoKKwkJY2FzZSAgV1JJVEVfMTA6CisJCWNhc2UgIFJFQURfMTI6CisJCWNhc2UgIFdSSVRFXzEyOgorCQkJaWYobGUzMl90b19jcHUoc3JicmVwbHktPmRhdGFfeGZlcl9sZW5ndGgpIDwgc2NzaWNtZC0+dW5kZXJmbG93ICkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkciYWFjcmFpZDogU0NTSSBDTUQgdW5kZXJmbG93XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBTQ1NJIENNRCBEYXRhIE92ZXJydW5cbiIpOworCQkJfQorCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQkJYnJlYWs7CisJCWNhc2UgSU5RVUlSWTogeworCQkJdTggYjsKKwkJCXU4IGIxOworCQkJLyogV2UgY2FuJ3QgZXhwb3NlIGRpc2sgZGV2aWNlcyBiZWNhdXNlIHdlIGNhbid0IHRlbGwgd2hldGhlciB0aGV5CisJCQkqIGFyZSB0aGUgcmF3IGNvbnRhaW5lciBkcml2ZXMgb3Igc3RhbmQgYWxvbmUgZHJpdmVzCisJCQkqLworCQkJYiA9ICgqKHU4KilzY3NpY21kLT5idWZmZXIpJjB4MGY7CisJCQliMSA9ICgodTgqKXNjc2ljbWQtPmJ1ZmZlcilbMV07CisJCQlpZiggYj09VFlQRV9UQVBFIHx8IGI9PVRZUEVfV09STSB8fCBiPT1UWVBFX1JPTSB8fCBiPT1UWVBFX01PRHx8IGI9PVRZUEVfTUVESVVNX0NIQU5HRVIKKwkJCQkJfHwgKGI9PVRZUEVfRElTSyAmJiAoYjEmMHg4MCkpICl7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQkJLyoKKwkJCSAqIFdlIHdpbGwgYWxsb3cgZGlzayBkZXZpY2VzIGlmIGluIFJBSUQvU0NTSSBtb2RlIGFuZAorCQkJICogdGhlIGNoYW5uZWwgaXMgMgorCQkJICovCisJCQl9IGVsc2UgaWYgKChkZXYtPnJhaWRfc2NzaV9tb2RlKSAmJgorCQkJCQkoc2NzaWNtZC0+ZGV2aWNlLT5jaGFubmVsID09IDIpKSB7CisJCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgCisJCQkJCQlDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCQl9IGVsc2UgeworCQkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2IHwgCisJCQkJCQlDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX0FCT1JURUQ6CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNiB8IEFCT1JUIDw8IDg7CisJCWJyZWFrOworCWNhc2UgU1JCX1NUQVRVU19BQk9SVF9GQUlMRUQ6CisJCS8vIE5vdCBzdXJlIGFib3V0IHRoaXMgb25lIC0gYnV0IGFzc3VtaW5nIHRoZSBoYmEgd2FzIHRyeWluZyB0byBhYm9ydCBmb3Igc29tZSByZWFzb24KKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgQUJPUlQgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX1BBUklUWV9FUlJPUjoKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX1BBUklUWSA8PCAxNiB8IE1TR19QQVJJVFlfRVJST1IgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX05PX0RFVklDRToKKwljYXNlIFNSQl9TVEFUVVNfSU5WQUxJRF9QQVRIX0lEOgorCWNhc2UgU1JCX1NUQVRVU19JTlZBTElEX1RBUkdFVF9JRDoKKwljYXNlIFNSQl9TVEFUVVNfSU5WQUxJRF9MVU46CisJY2FzZSBTUkJfU1RBVFVTX1NFTEVDVElPTl9USU1FT1VUOgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJYnJlYWs7CisKKwljYXNlIFNSQl9TVEFUVVNfQ09NTUFORF9USU1FT1VUOgorCWNhc2UgU1JCX1NUQVRVU19USU1FT1VUOgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfVElNRV9PVVQgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCWJyZWFrOworCisJY2FzZSBTUkJfU1RBVFVTX0JVU1k6CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4OworCQlicmVhazsKKworCWNhc2UgU1JCX1NUQVRVU19CVVNfUkVTRVQ6CisJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgODsKKwkJYnJlYWs7CisKKwljYXNlIFNSQl9TVEFUVVNfTUVTU0FHRV9SRUpFQ1RFRDoKKwkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgTUVTU0FHRV9SRUpFQ1QgPDwgODsKKwkJYnJlYWs7CisJY2FzZSBTUkJfU1RBVFVTX1JFUVVFU1RfRkxVU0hFRDoKKwljYXNlIFNSQl9TVEFUVVNfRVJST1I6CisJY2FzZSBTUkJfU1RBVFVTX0lOVkFMSURfUkVRVUVTVDoKKwljYXNlIFNSQl9TVEFUVVNfUkVRVUVTVF9TRU5TRV9GQUlMRUQ6CisJY2FzZSBTUkJfU1RBVFVTX05PX0hCQToKKwljYXNlIFNSQl9TVEFUVVNfVU5FWFBFQ1RFRF9CVVNfRlJFRToKKwljYXNlIFNSQl9TVEFUVVNfUEhBU0VfU0VRVUVOQ0VfRkFJTFVSRToKKwljYXNlIFNSQl9TVEFUVVNfQkFEX1NSQl9CTE9DS19MRU5HVEg6CisJY2FzZSBTUkJfU1RBVFVTX0RFTEFZRURfUkVUUlk6CisJY2FzZSBTUkJfU1RBVFVTX0JBRF9GVU5DVElPTjoKKwljYXNlIFNSQl9TVEFUVVNfTk9UX1NUQVJURUQ6CisJY2FzZSBTUkJfU1RBVFVTX05PVF9JTl9VU0U6CisJY2FzZSBTUkJfU1RBVFVTX0ZPUkNFX0FCT1JUOgorCWNhc2UgU1JCX1NUQVRVU19ET01BSU5fVkFMSURBVElPTl9GQUlMOgorCWRlZmF1bHQ6CisjaWZkZWYgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPCisJCXByaW50aygiYWFjcmFpZDogU1JCIEVSUk9SKCV1KSAlcyBzY3NpIGNtZCAweCV4IC0gc2NzaSBzdGF0dXMgMHgleFxuIiwKKwkJCWxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zcmJfc3RhdHVzKSAmIDB4M0YsCisJCQlhYWNfZ2V0X3N0YXR1c19zdHJpbmcoCisJCQkJbGUzMl90b19jcHUoc3JicmVwbHktPnNyYl9zdGF0dXMpICYgMHgzRiksIAorCQkJc2NzaWNtZC0+Y21uZFswXSwgCisJCQlsZTMyX3RvX2NwdShzcmJyZXBseS0+c2NzaV9zdGF0dXMpKTsKKyNlbmRpZgorCQlzY3NpY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDg7CisJCWJyZWFrOworCX0KKwlpZiAobGUzMl90b19jcHUoc3JicmVwbHktPnNjc2lfc3RhdHVzKSA9PSAweDAyICl7ICAvLyBDaGVjayBDb25kaXRpb24KKwkJaW50IGxlbjsKKwkJc2NzaWNtZC0+cmVzdWx0IHw9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJbGVuID0gKGxlMzJfdG9fY3B1KHNyYnJlcGx5LT5zZW5zZV9kYXRhX3NpemUpID4gCisJCQkJc2l6ZW9mKHNjc2ljbWQtPnNlbnNlX2J1ZmZlcikpID8KKwkJCQlzaXplb2Yoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyKSA6CisJCQkJbGUzMl90b19jcHUoc3JicmVwbHktPnNlbnNlX2RhdGFfc2l6ZSk7CisjaWZkZWYgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPCisJCWRwcmludGsoKEtFUk5fV0FSTklORyAiYWFjX3NyYl9jYWxsYmFjazogY2hlY2sgY29uZGl0aW9uLCBzdGF0dXMgPSAlZCBsZW49JWRcbiIsIAorCQkJCQlsZTMyX3RvX2NwdShzcmJyZXBseS0+c3RhdHVzKSwgbGVuKSk7CisjZW5kaWYKKwkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgc3JicmVwbHktPnNlbnNlX2RhdGEsIGxlbik7CisJCQorCX0KKwkvKgorCSAqIE9SIGluIHRoZSBzY3NpIHN0YXR1cyAoYWxyZWFkeSBzaGlmdGVkIHVwIGEgYml0KQorCSAqLworCXNjc2ljbWQtPnJlc3VsdCB8PSBsZTMyX3RvX2NwdShzcmJyZXBseS0+c2NzaV9zdGF0dXMpOworCisJZmliX2NvbXBsZXRlKGZpYnB0cik7CisJZmliX2ZyZWUoZmlicHRyKTsKKwlhYWNfaW9fZG9uZShzY3NpY21kKTsKK30KKworLyoqCisgKgorICogYWFjX3NlbmRfc2NiX2ZpYgorICogQHNjc2ljbWQ6IHRoZSBzY3NpIGNvbW1hbmQgYmxvY2sKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBmb3JtIGEgRklCIGFuZCBmaWxsIGluIHRoZSBhYWNfc3JiIGZyb20gdGhlIAorICogc2NzaWNtZCBwYXNzZWQgaW4uCisgKi8KKworc3RhdGljIGludCBhYWNfc2VuZF9zcmJfZmliKHN0cnVjdCBzY3NpX2NtbmQqIHNjc2ljbWQpCit7CisJc3RydWN0IGZpYiogY21kX2ZpYmNvbnRleHQ7CisJc3RydWN0IGFhY19kZXYqIGRldjsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhYWNfc3JiICpzcmJjbWQ7CisJdTE2IGZpYnNpemU7CisJdTMyIGZsYWc7CisJdTMyIHRpbWVvdXQ7CisKKwlpZiggc2NzaWNtZC0+ZGV2aWNlLT5pZCA+IDE1IHx8IHNjc2ljbWQtPmRldmljZS0+bHVuID4gNykgeworCQlzY3NpY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJc2NzaWNtZC0+c2NzaV9kb25lKHNjc2ljbWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN3aXRjaChzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbil7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlmbGFnID0gU1JCX0RhdGFPdXQ7CisJCWJyZWFrOworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCWZsYWcgPSBTUkJfRGF0YUluIHwgU1JCX0RhdGFPdXQ7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlmbGFnID0gU1JCX0RhdGFJbjsKKwkJYnJlYWs7CisJY2FzZSBETUFfTk9ORToKKwlkZWZhdWx0OgkvKiBzaHV0cyB1cCBzb21lIHZlcnNpb25zIG9mIGdjYyAqLworCQlmbGFnID0gU1JCX05vRGF0YVhmZXI7CisJCWJyZWFrOworCX0KKworCisJLyoKKwkgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEZpYiB0aGVuIHNldHVwIGEgQmxvY2tXcml0ZSBjb21tYW5kCisJICovCisJaWYgKCEoY21kX2ZpYmNvbnRleHQgPSBmaWJfYWxsb2MoZGV2KSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlmaWJfaW5pdChjbWRfZmliY29udGV4dCk7CisKKwlzcmJjbWQgPSAoc3RydWN0IGFhY19zcmIqKSBmaWJfZGF0YShjbWRfZmliY29udGV4dCk7CisJc3JiY21kLT5mdW5jdGlvbiA9IGNwdV90b19sZTMyKFNSQkZfRXhlY3V0ZVNjc2kpOworCXNyYmNtZC0+Y2hhbm5lbCAgPSBjcHVfdG9fbGUzMihhYWNfbG9naWNhbF90b19waHlzKHNjc2ljbWQtPmRldmljZS0+Y2hhbm5lbCkpOworCXNyYmNtZC0+aWQgICA9IGNwdV90b19sZTMyKHNjc2ljbWQtPmRldmljZS0+aWQpOworCXNyYmNtZC0+bHVuICAgICAgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5kZXZpY2UtPmx1bik7CisJc3JiY21kLT5mbGFncyAgICA9IGNwdV90b19sZTMyKGZsYWcpOworCXRpbWVvdXQgPSAoc2NzaWNtZC0+dGltZW91dC1qaWZmaWVzKS9IWjsKKwlpZih0aW1lb3V0ID09IDApeworCQl0aW1lb3V0ID0gMTsKKwl9CisJc3JiY21kLT50aW1lb3V0ICA9IGNwdV90b19sZTMyKHRpbWVvdXQpOyAgLy8gdGltZW91dCBpbiBzZWNvbmRzCisJc3JiY21kLT5yZXRyeV9saW1pdCA9IDA7IC8qIE9ic29sZXRlIHBhcmFtZXRlciAqLworCXNyYmNtZC0+Y2RiX3NpemUgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5jbWRfbGVuKTsKKwkKKwlpZiggZGV2LT5kYWNfc3VwcG9ydCA9PSAxICkgeworCQlhYWNfYnVpbGRfc2c2NChzY3NpY21kLCAoc3RydWN0IHNnbWFwNjQqKSAmc3JiY21kLT5zZyk7CisJCXNyYmNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJCW1lbXNldChzcmJjbWQtPmNkYiwgMCwgc2l6ZW9mKHNyYmNtZC0+Y2RiKSk7CisJCW1lbWNweShzcmJjbWQtPmNkYiwgc2NzaWNtZC0+Y21uZCwgc2NzaWNtZC0+Y21kX2xlbik7CisJCS8qCisJCSAqCUJ1aWxkIFNjYXR0ZXIvR2F0aGVyIGxpc3QKKwkJICovCisJCWZpYnNpemUgPSBzaXplb2YgKHN0cnVjdCBhYWNfc3JiKSAtIHNpemVvZiAoc3RydWN0IHNnZW50cnkpICsKKwkJCSgobGUzMl90b19jcHUoc3JiY21kLT5zZy5jb3VudCkgJiAweGZmKSAqIAorCQkJIHNpemVvZiAoc3RydWN0IHNnZW50cnk2NCkpOworCQlCVUdfT04gKGZpYnNpemUgPiAoc2l6ZW9mKHN0cnVjdCBod19maWIpIC0gCisJCQkJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKTsKKworCQkvKgorCQkgKglOb3cgc2VuZCB0aGUgRmliIHRvIHRoZSBhZGFwdGVyCisJCSAqLworCQlzdGF0dXMgPSBmaWJfc2VuZChTY3NpUG9ydENvbW1hbmQ2NCwgY21kX2ZpYmNvbnRleHQsIAorCQkJCWZpYnNpemUsIEZzYU5vcm1hbCwgMCwgMSwKKwkJCQkgIChmaWJfY2FsbGJhY2spIGFhY19zcmJfY2FsbGJhY2ssIAorCQkJCSAgKHZvaWQgKikgc2NzaWNtZCk7CisJfSBlbHNlIHsKKwkJYWFjX2J1aWxkX3NnKHNjc2ljbWQsIChzdHJ1Y3Qgc2dtYXAqKSZzcmJjbWQtPnNnKTsKKwkJc3JiY21kLT5jb3VudCA9IGNwdV90b19sZTMyKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwkJbWVtc2V0KHNyYmNtZC0+Y2RiLCAwLCBzaXplb2Yoc3JiY21kLT5jZGIpKTsKKwkJbWVtY3B5KHNyYmNtZC0+Y2RiLCBzY3NpY21kLT5jbW5kLCBzY3NpY21kLT5jbWRfbGVuKTsKKwkJLyoKKwkJICoJQnVpbGQgU2NhdHRlci9HYXRoZXIgbGlzdAorCQkgKi8KKwkJZmlic2l6ZSA9IHNpemVvZiAoc3RydWN0IGFhY19zcmIpICsgCisJCQkoKChsZTMyX3RvX2NwdShzcmJjbWQtPnNnLmNvdW50KSAmIDB4ZmYpIC0gMSkgKiAKKwkJCSBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5KSk7CisJCUJVR19PTiAoZmlic2l6ZSA+IChzaXplb2Yoc3RydWN0IGh3X2ZpYikgLSAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpOworCisJCS8qCisJCSAqCU5vdyBzZW5kIHRoZSBGaWIgdG8gdGhlIGFkYXB0ZXIKKwkJICovCisJCXN0YXR1cyA9IGZpYl9zZW5kKFNjc2lQb3J0Q29tbWFuZCwgY21kX2ZpYmNvbnRleHQsIGZpYnNpemUsIEZzYU5vcm1hbCwgMCwgMSwKKwkJCQkgIChmaWJfY2FsbGJhY2spIGFhY19zcmJfY2FsbGJhY2ssICh2b2lkICopIHNjc2ljbWQpOworCX0KKwkvKgorCSAqCUNoZWNrIHRoYXQgdGhlIGNvbW1hbmQgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyCisJICovCisJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpeworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhYWNfc3JiOiBmaWJfc2VuZCBmYWlsZWQgd2l0aCBzdGF0dXM6ICVkXG4iLCBzdGF0dXMpOworCWZpYl9jb21wbGV0ZShjbWRfZmliY29udGV4dCk7CisJZmliX2ZyZWUoY21kX2ZpYmNvbnRleHQpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhYWNfYnVpbGRfc2coc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwKiBwc2cpCit7CisJc3RydWN0IGFhY19kZXYgKmRldjsKKwl1bnNpZ25lZCBsb25nIGJ5dGVfY291bnQgPSAwOworCisJZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2NzaWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkvLyBHZXQgcmlkIG9mIG9sZCBkYXRhCisJcHNnLT5jb3VudCA9IDA7CisJcHNnLT5zZ1swXS5hZGRyID0gMDsKKwlwc2ctPnNnWzBdLmNvdW50ID0gMDsgIAorCWlmIChzY3NpY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJaW50IGk7CisJCWludCBzZ19jb3VudDsKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyOworCisJCXNnX2NvdW50ID0gcGNpX21hcF9zZyhkZXYtPnBkZXYsIHNnLCBzY3NpY21kLT51c2Vfc2csCisJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXBzZy0+Y291bnQgPSBjcHVfdG9fbGUzMihzZ19jb3VudCk7CisKKwkJYnl0ZV9jb3VudCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IHNnX2NvdW50OyBpKyspIHsKKwkJCXBzZy0+c2dbaV0uYWRkciA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQlwc2ctPnNnW2ldLmNvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJYnl0ZV9jb3VudCArPSBzZ19kbWFfbGVuKHNnKTsKKwkJCXNnKys7CisJCX0KKwkJLyogaGJhIHdhbnRzIHRoZSBzaXplIHRvIGJlIGV4YWN0ICovCisJCWlmKGJ5dGVfY291bnQgPiBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4peworCQkJcHNnLT5zZ1tpLTFdLmNvdW50IC09IChieXRlX2NvdW50IC0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWJ5dGVfY291bnQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgdW5kZXJmbG93ICovCisJCWlmKHNjc2ljbWQtPnVuZGVyZmxvdyAmJiAoYnl0ZV9jb3VudCA8IHNjc2ljbWQtPnVuZGVyZmxvdykpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBjbWQgbGVuICUwOGxYIGNtZCB1bmRlcmZsb3cgJTA4WFxuIiwKKwkJCQkJYnl0ZV9jb3VudCwgc2NzaWNtZC0+dW5kZXJmbG93KTsKKwkJfQorCX0KKwllbHNlIGlmKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlkbWFfYWRkcl90IGFkZHI7IAorCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXBzZy0+Y291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJcHNnLT5zZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJCXBzZy0+c2dbMF0uY291bnQgPSBjcHVfdG9fbGUzMihzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOyAgCisJCXNjc2ljbWQtPlNDcC5kbWFfaGFuZGxlID0gYWRkcjsKKwkJYnl0ZV9jb3VudCA9IHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisJcmV0dXJuIGJ5dGVfY291bnQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWFjX2J1aWxkX3NnNjQoc3RydWN0IHNjc2lfY21uZCogc2NzaWNtZCwgc3RydWN0IHNnbWFwNjQqIHBzZykKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2OworCXVuc2lnbmVkIGxvbmcgYnl0ZV9jb3VudCA9IDA7CisJdTY0IGxlX2FkZHI7CisKKwlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCS8vIEdldCByaWQgb2Ygb2xkIGRhdGEKKwlwc2ctPmNvdW50ID0gMDsKKwlwc2ctPnNnWzBdLmFkZHJbMF0gPSAwOworCXBzZy0+c2dbMF0uYWRkclsxXSA9IDA7CisJcHNnLT5zZ1swXS5jb3VudCA9IDA7CisJaWYgKHNjc2ljbWQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQlpbnQgaTsKKwkJaW50IHNnX2NvdW50OworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NzaWNtZC0+cmVxdWVzdF9idWZmZXI7CisKKwkJc2dfY291bnQgPSBwY2lfbWFwX3NnKGRldi0+cGRldiwgc2csIHNjc2ljbWQtPnVzZV9zZywKKwkJCXNjc2ljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJcHNnLT5jb3VudCA9IGNwdV90b19sZTMyKHNnX2NvdW50KTsKKworCQlieXRlX2NvdW50ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgeworCQkJbGVfYWRkciA9IGNwdV90b19sZTY0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQlwc2ctPnNnW2ldLmFkZHJbMV0gPSAodTMyKShsZV9hZGRyPj4zMik7CisJCQlwc2ctPnNnW2ldLmFkZHJbMF0gPSAodTMyKShsZV9hZGRyICYgMHhmZmZmZmZmZik7CisJCQlwc2ctPnNnW2ldLmNvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJYnl0ZV9jb3VudCArPSBzZ19kbWFfbGVuKHNnKTsKKwkJCXNnKys7CisJCX0KKwkJLyogaGJhIHdhbnRzIHRoZSBzaXplIHRvIGJlIGV4YWN0ICovCisJCWlmKGJ5dGVfY291bnQgPiBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW4peworCQkJcHNnLT5zZ1tpLTFdLmNvdW50IC09IChieXRlX2NvdW50IC0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWJ5dGVfY291bnQgPSBzY3NpY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwkJLyogQ2hlY2sgZm9yIGNvbW1hbmQgdW5kZXJmbG93ICovCisJCWlmKHNjc2ljbWQtPnVuZGVyZmxvdyAmJiAoYnl0ZV9jb3VudCA8IHNjc2ljbWQtPnVuZGVyZmxvdykpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJhYWNyYWlkOiBjbWQgbGVuICUwOGxYIGNtZCB1bmRlcmZsb3cgJTA4WFxuIiwKKwkJCQkJYnl0ZV9jb3VudCwgc2NzaWNtZC0+dW5kZXJmbG93KTsKKwkJfQorCX0KKwllbHNlIGlmKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlkbWFfYWRkcl90IGFkZHI7IAorCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCXNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQlzY3NpY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXBzZy0+Y291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJbGVfYWRkciA9IGNwdV90b19sZTY0KGFkZHIpOworCQlwc2ctPnNnWzBdLmFkZHJbMV0gPSAodTMyKShsZV9hZGRyPj4zMik7CisJCXBzZy0+c2dbMF0uYWRkclswXSA9ICh1MzIpKGxlX2FkZHIgJiAweGZmZmZmZmZmKTsKKwkJcHNnLT5zZ1swXS5jb3VudCA9IGNwdV90b19sZTMyKHNjc2ljbWQtPnJlcXVlc3RfYnVmZmxlbik7ICAKKwkJc2NzaWNtZC0+U0NwLmRtYV9oYW5kbGUgPSBhZGRyOworCQlieXRlX2NvdW50ID0gc2NzaWNtZC0+cmVxdWVzdF9idWZmbGVuOworCX0KKwlyZXR1cm4gYnl0ZV9jb3VudDsKK30KKworI2lmZGVmIEFBQ19ERVRBSUxFRF9TVEFUVVNfSU5GTworCitzdHJ1Y3QgYWFjX3NyYl9zdGF0dXNfaW5mbyB7CisJdTMyCXN0YXR1czsKKwljaGFyCSpzdHI7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWFjX3NyYl9zdGF0dXNfaW5mbyBzcmJfc3RhdHVzX2luZm9bXSA9IHsKKwl7IFNSQl9TVEFUVVNfUEVORElORywJCSJQZW5kaW5nIFN0YXR1cyJ9LAorCXsgU1JCX1NUQVRVU19TVUNDRVNTLAkJIlN1Y2Nlc3MifSwKKwl7IFNSQl9TVEFUVVNfQUJPUlRFRCwJCSJBYm9ydGVkIENvbW1hbmQifSwKKwl7IFNSQl9TVEFUVVNfQUJPUlRfRkFJTEVELAkiQWJvcnQgRmFpbGVkIn0sCisJeyBTUkJfU1RBVFVTX0VSUk9SLAkJIkVycm9yIEV2ZW50In0sIAorCXsgU1JCX1NUQVRVU19CVVNZLAkJIkRldmljZSBCdXN5In0sCisJeyBTUkJfU1RBVFVTX0lOVkFMSURfUkVRVUVTVCwJIkludmFsaWQgUmVxdWVzdCJ9LAorCXsgU1JCX1NUQVRVU19JTlZBTElEX1BBVEhfSUQsCSJJbnZhbGlkIFBhdGggSUQifSwKKwl7IFNSQl9TVEFUVVNfTk9fREVWSUNFLAkJIk5vIERldmljZSJ9LAorCXsgU1JCX1NUQVRVU19USU1FT1VULAkJIlRpbWVvdXQifSwKKwl7IFNSQl9TVEFUVVNfU0VMRUNUSU9OX1RJTUVPVVQsCSJTZWxlY3Rpb24gVGltZW91dCJ9LAorCXsgU1JCX1NUQVRVU19DT01NQU5EX1RJTUVPVVQsCSJDb21tYW5kIFRpbWVvdXQifSwKKwl7IFNSQl9TVEFUVVNfTUVTU0FHRV9SRUpFQ1RFRCwJIk1lc3NhZ2UgUmVqZWN0ZWQifSwKKwl7IFNSQl9TVEFUVVNfQlVTX1JFU0VULAkJIkJ1cyBSZXNldCJ9LAorCXsgU1JCX1NUQVRVU19QQVJJVFlfRVJST1IsCSJQYXJpdHkgRXJyb3IifSwKKwl7IFNSQl9TVEFUVVNfUkVRVUVTVF9TRU5TRV9GQUlMRUQsIlJlcXVlc3QgU2Vuc2UgRmFpbGVkIn0sCisJeyBTUkJfU1RBVFVTX05PX0hCQSwJCSJObyBIQkEifSwKKwl7IFNSQl9TVEFUVVNfREFUQV9PVkVSUlVOLAkiRGF0YSBPdmVycnVuL0RhdGEgVW5kZXJydW4ifSwKKwl7IFNSQl9TVEFUVVNfVU5FWFBFQ1RFRF9CVVNfRlJFRSwiVW5leHBlY3RlZCBCdXMgRnJlZSJ9LAorCXsgU1JCX1NUQVRVU19QSEFTRV9TRVFVRU5DRV9GQUlMVVJFLCJQaGFzZSBFcnJvciJ9LAorCXsgU1JCX1NUQVRVU19CQURfU1JCX0JMT0NLX0xFTkdUSCwiQmFkIFNyYiBCbG9jayBMZW5ndGgifSwKKwl7IFNSQl9TVEFUVVNfUkVRVUVTVF9GTFVTSEVELAkiUmVxdWVzdCBGbHVzaGVkIn0sCisJeyBTUkJfU1RBVFVTX0RFTEFZRURfUkVUUlksCSJEZWxheWVkIFJldHJ5In0sCisJeyBTUkJfU1RBVFVTX0lOVkFMSURfTFVOLAkiSW52YWxpZCBMVU4ifSwgCisJeyBTUkJfU1RBVFVTX0lOVkFMSURfVEFSR0VUX0lELAkiSW52YWxpZCBUQVJHRVQgSUQifSwKKwl7IFNSQl9TVEFUVVNfQkFEX0ZVTkNUSU9OLAkiQmFkIEZ1bmN0aW9uIn0sCisJeyBTUkJfU1RBVFVTX0VSUk9SX1JFQ09WRVJZLAkiRXJyb3IgUmVjb3ZlcnkifSwKKwl7IFNSQl9TVEFUVVNfTk9UX1NUQVJURUQsCSJOb3QgU3RhcnRlZCJ9LAorCXsgU1JCX1NUQVRVU19OT1RfSU5fVVNFLAkiTm90IEluIFVzZSJ9LAorICAgIAl7IFNSQl9TVEFUVVNfRk9SQ0VfQUJPUlQsCSJGb3JjZSBBYm9ydCJ9LAorCXsgU1JCX1NUQVRVU19ET01BSU5fVkFMSURBVElPTl9GQUlMLCJEb21haW4gVmFsaWRhdGlvbiBGYWlsdXJlIn0sCisJeyAweGZmLAkJCQkiVW5rbm93biBFcnJvciJ9Cit9OworCitjaGFyICphYWNfZ2V0X3N0YXR1c19zdHJpbmcodTMyIHN0YXR1cykKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGkgPCAoc2l6ZW9mKHNyYl9zdGF0dXNfaW5mbykvc2l6ZW9mKHN0cnVjdCBhYWNfc3JiX3N0YXR1c19pbmZvKSk7IGkrKyApeworCQlpZihzcmJfc3RhdHVzX2luZm9baV0uc3RhdHVzID09IHN0YXR1cyl7CisJCQlyZXR1cm4gc3JiX3N0YXR1c19pbmZvW2ldLnN0cjsKKwkJfQorCX0KKworCXJldHVybiAiQmFkIFN0YXR1cyBDb2RlIjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwZDkwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaApAQCAtMCwwICsxLDE2MjMgQEAKKyNpZiAoIWRlZmluZWQoZHByaW50aykpCisjIGRlZmluZSBkcHJpbnRrKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICBEIEUgRiBJIE4gRSBTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWElNVU1fTlVNX0NPTlRBSU5FUlMJMzIKKworI2RlZmluZSBBQUNfTlVNX0ZJQgkJKDI1NiArIDY0KQorI2RlZmluZSBBQUNfTlVNX0lPX0ZJQgkJMTAwCisKKyNkZWZpbmUgQUFDX01BWF9MVU4JCSg4KQorCisjZGVmaW5lIEFBQ19NQVhfSE9TVFBIWVNNRU1QQUdFUyAoMHhmZmZmZikKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBjb252ZXJ0IGZyb20gcGh5c2ljYWwgY2hhbm5lbHMgdG8gdmlydHVhbCBjaGFubmVscworICovCisjZGVmaW5lIENPTlRBSU5FUl9DSEFOTkVMCQkoMCkKKyNkZWZpbmUgSURfTFVOX1RPX0NPTlRBSU5FUihpZCwgbHVuKQkoaWQpCisjZGVmaW5lIENPTlRBSU5FUl9UT19DSEFOTkVMKGNvbnQpCShDT05UQUlORVJfQ0hBTk5FTCkKKyNkZWZpbmUgQ09OVEFJTkVSX1RPX0lEKGNvbnQpCQkoY29udCkKKyNkZWZpbmUgQ09OVEFJTkVSX1RPX0xVTihjb250KQkJKDApCisKKyNkZWZpbmUgYWFjX3BoeXNfdG9fbG9naWNhbCh4KSAgKHgrMSkKKyNkZWZpbmUgYWFjX2xvZ2ljYWxfdG9fcGh5cyh4KSAgKHg/eC0xOjApCisKKy8qICNkZWZpbmUgQUFDX0RFVEFJTEVEX1NUQVRVU19JTkZPICovCisKK3N0cnVjdCBkaXNrcGFybQoreworCWludCBoZWFkczsKKwlpbnQgc2VjdG9yczsKKwlpbnQgY3lsaW5kZXJzOworfTsKKworCisvKgorICoJRE9OJ1QgQ0hBTkdFIFRIRSBPUkRFUiwgdGhpcyBpcyBzZXQgYnkgdGhlIGZpcm13YXJlCisgKi8KKyAKKyNkZWZpbmUJCUNUX05PTkUJCQkwCisjZGVmaW5lCQlDVF9WT0xVTUUJCTEKKyNkZWZpbmUJCUNUX01JUlJPUgkJMgorI2RlZmluZQkJQ1RfU1RSSVBFCQkzCisjZGVmaW5lCQlDVF9SQUlENQkJNAorI2RlZmluZQkJQ1RfU1NSVwkJCTUKKyNkZWZpbmUJCUNUX1NTUk8JCQk2CisjZGVmaW5lCQlDVF9NT1JQSAkJNworI2RlZmluZQkJQ1RfUEFTU1RIUlUJCTgKKyNkZWZpbmUJCUNUX1JBSUQ0CQk5CisjZGVmaW5lCQlDVF9SQUlEMTAJCTEwCS8qIHN0cmlwZSBvZiBtaXJyb3IgKi8KKyNkZWZpbmUJCUNUX1JBSUQwMAkJMTEJLyogc3RyaXBlIG9mIHN0cmlwZSAqLworI2RlZmluZQkJQ1RfVk9MVU1FX09GX01JUlJPUlMJMTIJLyogdm9sdW1lIG9mIG1pcnJvciAqLworI2RlZmluZQkJQ1RfUFNFVURPX1JBSUQJCTEzCS8qIHJlYWxseSByYWlkNCAqLworI2RlZmluZQkJQ1RfTEFTVF9WT0xVTUVfVFlQRQkxNAorI2RlZmluZSAJQ1RfT0sgICAgICAgIAkJMjE4CisKKy8qCisgKglUeXBlcyBvZiBvYmplY3RzIGFkZHJlc3NhYmxlIGluIHNvbWUgZmFzaGlvbiBieSB0aGUgY2xpZW50LgorICoJVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRob3NlIG9iamVjdHMgaGFuZGxlZCBqdXN0IGJ5IHRoZSBmaWxlc3lzdGVtCisgKglhbmQgaW5jbHVkZXMgInJhdyIgb2JqZWN0cyB0aGF0IGFuIGFkbWluaXN0cmF0b3Igd291bGQgdXNlIHRvCisgKgljb25maWd1cmUgY29udGFpbmVycyBhbmQgZmlsZXN5c3RlbXMuCisgKi8KKworI2RlZmluZQkJRlRfUkVHCQkxCS8qIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZQkJRlRfRElSCQkyCS8qIGRpcmVjdG9yeSAqLworI2RlZmluZQkJRlRfQkxLCQkzCS8qICJibG9jayIgZGV2aWNlIC0gcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJCUZUX0NIUgkJNAkvKiAiY2hhcmFjdGVyIHNwZWNpYWwiIGRldmljZSAtIHJlc2VydmVkICovCisjZGVmaW5lCQlGVF9MTksJCTUJLyogc3ltYm9saWMgbGluayAqLworI2RlZmluZQkJRlRfU09DSwkJNgkvKiBzb2NrZXQgKi8KKyNkZWZpbmUJCUZUX0ZJRk8JCTcJLyogZmlmbyAqLworI2RlZmluZQkJRlRfRklMRVNZUwk4CS8qIEFEQVBURUMncyAiRlNBIih0bSkgZmlsZXN5c3RlbSAqLworI2RlZmluZQkJRlRfRFJJVkUJOQkvKiBwaHlzaWNhbCBkaXNrIC0gYWRkcmVzc2FibGUgaW4gc2NzaSBieSBidXMvaWQvbHVuICovCisjZGVmaW5lCQlGVF9TTElDRQkxMAkvKiB2aXJ0dWFsIGRpc2sgLSByYXcgdm9sdW1lIC0gc2xpY2UgKi8KKyNkZWZpbmUJCUZUX1BBUlRJVElPTgkxMQkvKiBGU0EgcGFydGl0aW9uIC0gY2FydmVkIG91dCBvZiBhIHNsaWNlIC0gYnVpbGRpbmcgYmxvY2sgZm9yIGNvbnRhaW5lcnMgKi8KKyNkZWZpbmUJCUZUX1ZPTFVNRQkxMgkvKiBDb250YWluZXIgLSBWb2x1bWUgU2V0ICovCisjZGVmaW5lCQlGVF9TVFJJUEUJMTMJLyogQ29udGFpbmVyIC0gU3RyaXBlIFNldCAqLworI2RlZmluZQkJRlRfTUlSUk9SCTE0CS8qIENvbnRhaW5lciAtIE1pcnJvciBTZXQgKi8KKyNkZWZpbmUJCUZUX1JBSUQ1CTE1CS8qIENvbnRhaW5lciAtIFJhaWQgNSBTZXQgKi8KKyNkZWZpbmUJCUZUX0RBVEFCQVNFCTE2CS8qIFN0b3JhZ2Ugb2JqZWN0IHdpdGggImZvcmVpZ24iIGNvbnRlbnQgbWFuYWdlciAqLworCisvKgorICoJSG9zdCBzaWRlIG1lbW9yeSBzY2F0dGVyIGdhdGhlciBsaXN0CisgKglVc2VkIGJ5IHRoZSBhZGFwdGVyIGZvciByZWFkLCB3cml0ZSwgYW5kIHJlYWRkaXJwbHVzIG9wZXJhdGlvbnMKKyAqCVdlIGhhdmUgc2VwYXJhdGUgMzIgYW5kIDY0IGJpdCB2ZXJzaW9uIGJlY2F1c2UgZXZlbgorICoJb24gNjQgYml0IHN5c3RlbXMgbm90IGFsbCBjYXJkcyBzdXBwb3J0IHRoZSA2NCBiaXQgdmVyc2lvbgorICovCitzdHJ1Y3Qgc2dlbnRyeSB7CisJdTMyCWFkZHI7CS8qIDMyLWJpdCBhZGRyZXNzLiAqLworCXUzMgljb3VudDsJLyogTGVuZ3RoLiAqLworfTsKKworc3RydWN0IHNnZW50cnk2NCB7CisJdTMyCWFkZHJbMl07CS8qIDY0LWJpdCBhZGRyLiAyIHBpZWNlcyBmb3IgZGF0YSBhbGlnbm1lbnQgKi8KKwl1MzIJY291bnQ7CS8qIExlbmd0aC4gKi8KK307CisKKy8qCisgKglTR01BUAorICoKKyAqCVRoaXMgaXMgdGhlIFNHTUFQIHN0cnVjdHVyZSBmb3IgYWxsIGNvbW1hbmRzIHRoYXQgdXNlCisgKgkzMi1iaXQgYWRkcmVzc2luZy4KKyAqLworCitzdHJ1Y3Qgc2dtYXAgeworCXUzMgkJY291bnQ7CisJc3RydWN0IHNnZW50cnkJc2dbMV07IAorfTsKKworc3RydWN0IHNnbWFwNjQgeworCXUzMgkJY291bnQ7CisJc3RydWN0IHNnZW50cnk2NCBzZ1sxXTsKK307CisKK3N0cnVjdCBjcmVhdGlvbl9pbmZvCit7CisJdTggCQlidWlsZG51bTsJCS8qIGUuZy4sIDU4OCAqLworCXU4IAkJdXNlYzsJCQkvKiBlLmcuLCA1ODggKi8KKwl1OAkgCXZpYTsJCQkvKiBlLmcuLCAxID0gRlNVLAorCQkJCQkJICogCSAyID0gQVBJCisJCQkJCQkgKi8KKwl1OAkgCXllYXI7CQkgCS8qIGUuZy4sIDE5OTcgPSA5NyAqLworCXUzMgkJZGF0ZTsJCQkvKgorCQkJCQkJICogdW5zaWduZWQgCU1vbnRoCQk6NDsJLy8gMSAtIDEyCisJCQkJCQkgKiB1bnNpZ25lZCAJRGF5CQk6NjsJLy8gMSAtIDMyCisJCQkJCQkgKiB1bnNpZ25lZCAJSG91cgkJOjY7CS8vIDAgLSAyMworCQkJCQkJICogdW5zaWduZWQgCU1pbnV0ZQkJOjY7CS8vIDAgLSA2MAorCQkJCQkJICogdW5zaWduZWQgCVNlY29uZAkJOjY7CS8vIDAgLSA2MAorCQkJCQkJICovCisJdTMyCQlzZXJpYWxbMl07CQkJLyogZS5nLiwgMHgxREVBREIwQkZBRkFGMDAxICovCit9OworCisKKy8qCisgKglEZWZpbmUgYWxsIHRoZSBjb25zdGFudHMgbmVlZGVkIGZvciB0aGUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqLworCisvKgorICoJRGVmaW5lIGhvdyBtYW55IHF1ZXVlIGVudHJpZXMgZWFjaCBxdWV1ZSB3aWxsIGhhdmUgYW5kIHRoZSB0b3RhbAorICoJbnVtYmVyIG9mIGVudHJpZXMgZm9yIHRoZSBlbnRpcmUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UuIEFsc28gZGVmaW5lCisgKglob3cgbWFueSBxdWV1ZXMgd2Ugc3VwcG9ydC4KKyAqCisgKglUaGlzIGhhcyB0byBtYXRjaCB0aGUgY29udHJvbGxlcgorICovCisKKyNkZWZpbmUgTlVNQkVSX09GX0NPTU1fUVVFVUVTICA4ICAgLy8gNCBjb21tYW5kOyA0IHJlc3BvbnNlCisjZGVmaW5lIEhPU1RfSElHSF9DTURfRU5UUklFUyAgNAorI2RlZmluZSBIT1NUX05PUk1fQ01EX0VOVFJJRVMgIDgKKyNkZWZpbmUgQURBUF9ISUdIX0NNRF9FTlRSSUVTICA0CisjZGVmaW5lIEFEQVBfTk9STV9DTURfRU5UUklFUyAgNTEyCisjZGVmaW5lIEhPU1RfSElHSF9SRVNQX0VOVFJJRVMgNAorI2RlZmluZSBIT1NUX05PUk1fUkVTUF9FTlRSSUVTIDUxMgorI2RlZmluZSBBREFQX0hJR0hfUkVTUF9FTlRSSUVTIDQKKyNkZWZpbmUgQURBUF9OT1JNX1JFU1BfRU5UUklFUyA4CisKKyNkZWZpbmUgVE9UQUxfUVVFVUVfRU5UUklFUyAgXAorICAgIChIT1NUX05PUk1fQ01EX0VOVFJJRVMgKyBIT1NUX0hJR0hfQ01EX0VOVFJJRVMgKyBBREFQX05PUk1fQ01EX0VOVFJJRVMgKyBBREFQX0hJR0hfQ01EX0VOVFJJRVMgKyBcCisJICAgIEhPU1RfTk9STV9SRVNQX0VOVFJJRVMgKyBIT1NUX0hJR0hfUkVTUF9FTlRSSUVTICsgQURBUF9OT1JNX1JFU1BfRU5UUklFUyArIEFEQVBfSElHSF9SRVNQX0VOVFJJRVMpCisKKworLyoKKyAqCVNldCB0aGUgcXVldWVzIG9uIGEgMTYgYnl0ZSBhbGlnbm1lbnQKKyAqLworIAorI2RlZmluZSBRVUVVRV9BTElHTk1FTlQJCTE2CisKKy8qCisgKglUaGUgcXVldWUgaGVhZGVycyBkZWZpbmUgdGhlIENvbW11bmljYXRpb24gUmVnaW9uIHF1ZXVlcy4gVGhlc2UKKyAqCWFyZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYW5kIGFjY2Vzc2libGUgYnkgYm90aCB0aGUgYWRhcHRlciBhbmQgdGhlCisgKglob3N0LiBFdmVuIHRob3VnaCBhbGwgcXVldWUgaGVhZGVycyBhcmUgaW4gdGhlIHNhbWUgY29udGlndW91cyBibG9jaworICoJdGhleSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGluZGl2aWR1YWwgdW5pdHMgaW4gdGhlIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCitzdHJ1Y3QgYWFjX2VudHJ5IHsKKwl1MzIgc2l6ZTsgICAgICAgICAgLyogU2l6ZSBpbiBieXRlcyBvZiBGaWIgd2hpY2ggdGhpcyBRRSBwb2ludHMgdG8gKi8KKwl1MzIgYWRkcjsgLyogUmVjZWl2ZXIgYWRkcmVzcyBvZiB0aGUgRklCICovCit9OworCisvKgorICoJVGhlIGFkYXB0ZXIgYXNzdW1lcyB0aGUgUHJvZHVjZXJJbmRleCBhbmQgQ29uc3VtZXJJbmRleCBhcmUgZ3JvdXBlZAorICoJYWRqYWNlbnRseSBhbmQgaW4gdGhhdCBvcmRlci4KKyAqLworIAorc3RydWN0IGFhY19xaGRyIHsKKwl1NjQgaGVhZGVyX2FkZHI7CQkvKiBBZGRyZXNzIHRvIGhhbmQgdGhlIGFkYXB0ZXIgdG8gYWNjZXNzIHRvIHRoaXMgcXVldWUgaGVhZCAqLworCXUzMiAqcHJvZHVjZXI7CQkJLyogVGhlIHByb2R1Y2VyIGluZGV4IGZvciB0aGlzIHF1ZXVlIChob3N0IGFkZHJlc3MpICovCisJdTMyICpjb25zdW1lcjsJCQkvKiBUaGUgY29uc3VtZXIgaW5kZXggZm9yIHRoaXMgcXVldWUgKGhvc3QgYWRkcmVzcykgKi8KK307CisKKy8qCisgKglEZWZpbmUgYWxsIHRoZSBldmVudHMgd2hpY2ggdGhlIGFkYXB0ZXIgd291bGQgbGlrZSB0byBub3RpZnkKKyAqCXRoZSBob3N0IG9mLgorICovCisgCisjZGVmaW5lCQlIb3N0Tm9ybUNtZFF1ZQkJMQkvKiBDaGFuZ2UgaW4gaG9zdCBub3JtYWwgcHJpb3JpdHkgY29tbWFuZCBxdWV1ZSAqLworI2RlZmluZQkJSG9zdEhpZ2hDbWRRdWUJCTIJLyogQ2hhbmdlIGluIGhvc3QgaGlnaCBwcmlvcml0eSBjb21tYW5kIHF1ZXVlICovCisjZGVmaW5lCQlIb3N0Tm9ybVJlc3BRdWUJCTMJLyogQ2hhbmdlIGluIGhvc3Qgbm9ybWFsIHByaW9yaXR5IHJlc3BvbnNlIHF1ZXVlICovCisjZGVmaW5lCQlIb3N0SGlnaFJlc3BRdWUJCTQJLyogQ2hhbmdlIGluIGhvc3QgaGlnaCBwcmlvcml0eSByZXNwb25zZSBxdWV1ZSAqLworI2RlZmluZQkJQWRhcE5vcm1SZXNwTm90RnVsbAk1CisjZGVmaW5lCQlBZGFwSGlnaFJlc3BOb3RGdWxsCTYKKyNkZWZpbmUJCUFkYXBOb3JtQ21kTm90RnVsbAk3CisjZGVmaW5lCQlBZGFwSGlnaENtZE5vdEZ1bGwJOAorI2RlZmluZQkJU3luY2hDb21tYW5kQ29tcGxldGUJOQorI2RlZmluZQkJQWRhcEludGVybmFsRXJyb3IJMHhmZSAgICAvKiBUaGUgYWRhcHRlciBkZXRlY3RlZCBhbiBpbnRlcm5hbCBlcnJvciBzaHV0dGluZyBkb3duICovCisKKy8qCisgKglEZWZpbmUgYWxsIHRoZSBldmVudHMgdGhlIGhvc3Qgd2lzaGVzIHRvIG5vdGlmeSB0aGUKKyAqCWFkYXB0ZXIgb2YuIFRoZSBmaXJzdCBmb3VyIHZhbHVlcyBtdWNoIG1hdGNoIHRoZSBRaWQgdGhlCisgKgljb3JyZXNwb25kaW5nIHF1ZXVlLgorICovCisKKyNkZWZpbmUJCUFkYXBOb3JtQ21kUXVlCQkyCisjZGVmaW5lCQlBZGFwSGlnaENtZFF1ZQkJMworI2RlZmluZQkJQWRhcE5vcm1SZXNwUXVlCQk2CisjZGVmaW5lCQlBZGFwSGlnaFJlc3BRdWUJCTcKKyNkZWZpbmUJCUhvc3RTaHV0ZG93bgkJOAorI2RlZmluZQkJSG9zdFBvd2VyRmFpbAkJOQorI2RlZmluZQkJRmF0YWxDb21tRXJyb3IJCTEwCisjZGVmaW5lCQlIb3N0Tm9ybVJlc3BOb3RGdWxsCTExCisjZGVmaW5lCQlIb3N0SGlnaFJlc3BOb3RGdWxsCTEyCisjZGVmaW5lCQlIb3N0Tm9ybUNtZE5vdEZ1bGwJMTMKKyNkZWZpbmUJCUhvc3RIaWdoQ21kTm90RnVsbAkxNAorI2RlZmluZQkJRmFzdElvCQkJMTUKKyNkZWZpbmUJCUFkYXBQcmludGZEb25lCQkxNgorCisvKgorICoJRGVmaW5lIGFsbCB0aGUgcXVldWVzIHRoYXQgdGhlIGFkYXB0ZXIgYW5kIGhvc3QgdXNlIHRvIGNvbW11bmljYXRlCisgKglOdW1iZXIgdGhlbSB0byBtYXRjaCB0aGUgcGh5c2ljYWwgcXVldWUgbGF5b3V0LgorICovCisKK2VudW0gYWFjX3F1ZXVlX3R5cGVzIHsKKyAgICAgICAgSG9zdE5vcm1DbWRRdWV1ZSA9IDAsCS8qIEFkYXB0ZXIgdG8gaG9zdCBub3JtYWwgcHJpb3JpdHkgY29tbWFuZCB0cmFmZmljICovCisgICAgICAgIEhvc3RIaWdoQ21kUXVldWUsCS8qIEFkYXB0ZXIgdG8gaG9zdCBoaWdoIHByaW9yaXR5IGNvbW1hbmQgdHJhZmZpYyAqLworICAgICAgICBBZGFwTm9ybUNtZFF1ZXVlLAkvKiBIb3N0IHRvIGFkYXB0ZXIgbm9ybWFsIHByaW9yaXR5IGNvbW1hbmQgdHJhZmZpYyAqLworICAgICAgICBBZGFwSGlnaENtZFF1ZXVlLAkvKiBIb3N0IHRvIGFkYXB0ZXIgaGlnaCBwcmlvcml0eSBjb21tYW5kIHRyYWZmaWMgKi8KKyAgICAgICAgSG9zdE5vcm1SZXNwUXVldWUsCS8qIEFkYXB0ZXIgdG8gaG9zdCBub3JtYWwgcHJpb3JpdHkgcmVzcG9uc2UgdHJhZmZpYyAqLworICAgICAgICBIb3N0SGlnaFJlc3BRdWV1ZSwJLyogQWRhcHRlciB0byBob3N0IGhpZ2ggcHJpb3JpdHkgcmVzcG9uc2UgdHJhZmZpYyAqLworICAgICAgICBBZGFwTm9ybVJlc3BRdWV1ZSwJLyogSG9zdCB0byBhZGFwdGVyIG5vcm1hbCBwcmlvcml0eSByZXNwb25zZSB0cmFmZmljICovCisgICAgICAgIEFkYXBIaWdoUmVzcFF1ZXVlCS8qIEhvc3QgdG8gYWRhcHRlciBoaWdoIHByaW9yaXR5IHJlc3BvbnNlIHRyYWZmaWMgKi8KK307CisKKy8qCisgKglBc3NpZ24gdHlwZSB2YWx1ZXMgdG8gdGhlIEZTQSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlcworICovCisKKyNkZWZpbmUJCUZJQl9NQUdJQwkweDAwMDEKKworLyoKKyAqCURlZmluZSB0aGUgcHJpb3JpdHkgbGV2ZWxzIHRoZSBGU0EgY29tbXVuaWNhdGlvbiByb3V0aW5lcyBzdXBwb3J0LgorICovCisKKyNkZWZpbmUJCUZzYU5vcm1hbAkxCisjZGVmaW5lCQlGc2FIaWdoCQkyCisKKy8qCisgKiBEZWZpbmUgdGhlIEZJQi4gVGhlIEZJQiBpcyB0aGUgd2hlcmUgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSBhbmQKKyAqIGNvbW1hbmQgaW5mb3JtYXRpb24gYXJlIHB1dCB0byB0aGUgYXBwbGljYXRpb24gb24gdGhlIEZTQSBhZGFwdGVyLgorICovCisKK3N0cnVjdCBhYWNfZmliaGRyIHsKKwl1MzIgWGZlclN0YXRlOwkJCS8vIEN1cnJlbnQgdHJhbnNmZXIgc3RhdGUgZm9yIHRoaXMgQ0NCCisJdTE2IENvbW1hbmQ7CQkJLy8gUm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGRlc3RpbmF0aW9uCisJdTggU3RydWN0VHlwZTsJCQkvLyBUeXBlIEZJQgorCXU4IEZsYWdzOwkJCS8vIEZsYWdzIGZvciBGSUIKKwl1MTYgU2l6ZTsJCQkvLyBTaXplIG9mIHRoaXMgRklCIGluIGJ5dGVzCisJdTE2IFNlbmRlclNpemU7CQkJLy8gU2l6ZSBvZiB0aGUgRklCIGluIHRoZSBzZW5kZXIgKGZvciByZXNwb25zZSBzaXppbmcpCisJdTMyIFNlbmRlckZpYkFkZHJlc3M7CQkvLyBIb3N0IGRlZmluZWQgZGF0YSBpbiB0aGUgRklCCisJdTMyIFJlY2VpdmVyRmliQWRkcmVzczsJCS8vIExvZ2ljYWwgYWRkcmVzcyBvZiB0aGlzIEZJQiBmb3IgdGhlIGFkYXB0ZXIKKwl1MzIgU2VuZGVyRGF0YTsJCQkvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSBzZW5kZXIgdG8gc3RvcmUgZGF0YQorCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJICAgIHUzMiBfUmVjZWl2ZXJUaW1lU3RhcnQ7IAkvLyBUaW1lc3RhbXAgZm9yIHJlY2VpcHQgb2YgZmliCisJCSAgICB1MzIgX1JlY2VpdmVyVGltZURvbmU7CS8vIFRpbWVzdGFtcCBmb3IgY29tcGxldGlvbiBvZiBmaWIKKwkJfSBfczsKKwl9IF91OworfTsKKworI2RlZmluZSBGSUJfREFUQV9TSVpFX0lOX0JZVEVTICg1MTIgLSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKQorCisKK3N0cnVjdCBod19maWIgeworCXN0cnVjdCBhYWNfZmliaGRyIGhlYWRlcjsKKwl1OCBkYXRhW0ZJQl9EQVRBX1NJWkVfSU5fQllURVNdOwkJLy8gQ29tbWFuZCBzcGVjaWZpYyBkYXRhCit9OworCisvKgorICoJRklCIGNvbW1hbmRzCisgKi8KKworI2RlZmluZSAJVGVzdENvbW1hbmRSZXNwb25zZQkJMQorI2RlZmluZQkJVGVzdEFkYXB0ZXJDb21tYW5kCQkyCisvKgorICoJTG93bGV2ZWwgYW5kIGNvbW0gY29tbWFuZHMKKyAqLworI2RlZmluZQkJTGFzdFRlc3RDb21tYW5kCQkJMTAwCisjZGVmaW5lCQlSZWluaXRIb3N0Tm9ybUNvbW1hbmRRdWV1ZQkxMDEKKyNkZWZpbmUJCVJlaW5pdEhvc3RIaWdoQ29tbWFuZFF1ZXVlCTEwMgorI2RlZmluZQkJUmVpbml0SG9zdEhpZ2hSZXNwUXVldWUJCTEwMworI2RlZmluZQkJUmVpbml0SG9zdE5vcm1SZXNwUXVldWUJCTEwNAorI2RlZmluZQkJUmVpbml0QWRhcE5vcm1Db21tYW5kUXVldWUJMTA1CisjZGVmaW5lCQlSZWluaXRBZGFwSGlnaENvbW1hbmRRdWV1ZQkxMDcKKyNkZWZpbmUJCVJlaW5pdEFkYXBIaWdoUmVzcFF1ZXVlCQkxMDgKKyNkZWZpbmUJCVJlaW5pdEFkYXBOb3JtUmVzcFF1ZXVlCQkxMDkKKyNkZWZpbmUJCUludGVyZmFjZVNodXRkb3duCQkxMTAKKyNkZWZpbmUJCURtYUNvbW1hbmRGaWIJCQkxMjAKKyNkZWZpbmUJCVN0YXJ0UHJvZmlsZQkJCTEyMQorI2RlZmluZQkJVGVybVByb2ZpbGUJCQkxMjIKKyNkZWZpbmUJCVNwZWVkVGVzdAkJCTEyMworI2RlZmluZQkJVGFrZUFCcmVha1B0CQkJMTI0CisjZGVmaW5lCQlSZXF1ZXN0UGVyZkRhdGEJCQkxMjUKKyNkZWZpbmUJCVNldEludGVycnVwdERlZlRpbWVyCQkxMjYKKyNkZWZpbmUJCVNldEludGVycnVwdERlZkNvdW50CQkxMjcKKyNkZWZpbmUJCUdldEludGVycnVwdERlZlN0YXR1cwkJMTI4CisjZGVmaW5lCQlMYXN0Q29tbUNvbW1hbmQJCQkxMjkKKy8qCisgKglGaWxlc3lzdGVtIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJCU51RmlsZVN5c3RlbQkJCTMwMAorI2RlZmluZQkJVUZTCQkJCTMwMQorI2RlZmluZQkJSG9zdEZpbGVTeXN0ZW0JCQkzMDIKKyNkZWZpbmUJCUxhc3RGaWxlU3lzdGVtQ29tbWFuZAkJMzAzCisvKgorICoJQ29udGFpbmVyIENvbW1hbmRzCisgKi8KKyNkZWZpbmUJCUNvbnRhaW5lckNvbW1hbmQJCTUwMAorI2RlZmluZQkJQ29udGFpbmVyQ29tbWFuZDY0CQk1MDEKKy8qCisgKglDbHVzdGVyIENvbW1hbmRzCisgKi8KKyNkZWZpbmUJCUNsdXN0ZXJDb21tYW5kCSAJCTU1MAorLyoKKyAqCVNjc2kgUG9ydCBjb21tYW5kcyAoc2NzaSBwYXNzdGhyb3VnaCkKKyAqLworI2RlZmluZQkJU2NzaVBvcnRDb21tYW5kCQkJNjAwCisjZGVmaW5lCQlTY3NpUG9ydENvbW1hbmQ2NAkJNjAxCisvKgorICoJTWlzYyBob3VzZSBrZWVwaW5nIGFuZCBnZW5lcmljIGFkYXB0ZXIgaW5pdGlhdGVkIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJCUFpZlJlcXVlc3QJCQk3MDAKKyNkZWZpbmUJCUNoZWNrUmV2aXNpb24JCQk3MDEKKyNkZWZpbmUJCUZzYUhvc3RTaHV0ZG93bgkJCTcwMgorI2RlZmluZQkJUmVxdWVzdEFkYXB0ZXJJbmZvCQk3MDMKKyNkZWZpbmUJCUlzQWRhcHRlclBhdXNlZAkJCTcwNAorI2RlZmluZQkJU2VuZEhvc3RUaW1lCQkJNzA1CisjZGVmaW5lCQlMYXN0TWlzY0NvbW1hbmQJCQk3MDYKKworLy8KKy8vIENvbW1hbmRzIHRoYXQgd2lsbCB0YXJnZXQgdGhlIGZhaWxvdmVyIGxldmVsIG9uIHRoZSBGU0EgYWRhcHRlcgorLy8KKworZW51bSBmaWJfeGZlcl9zdGF0ZSB7CisJSG9zdE93bmVkIAkJCT0gKDE8PDApLAorCUFkYXB0ZXJPd25lZCAJCQk9ICgxPDwxKSwKKwlGaWJJbml0aWFsaXplZCAJCQk9ICgxPDwyKSwKKwlGaWJFbXB0eSAJCQk9ICgxPDwzKSwKKwlBbGxvY2F0ZWRGcm9tUG9vbCAJCT0gKDE8PDQpLAorCVNlbnRGcm9tSG9zdCAJCQk9ICgxPDw1KSwKKwlTZW50RnJvbUFkYXB0ZXIgCQk9ICgxPDw2KSwKKwlSZXNwb25zZUV4cGVjdGVkIAkJPSAoMTw8NyksCisJTm9SZXNwb25zZUV4cGVjdGVkIAkJPSAoMTw8OCksCisJQWRhcHRlclByb2Nlc3NlZCAJCT0gKDE8PDkpLAorCUhvc3RQcm9jZXNzZWQgCQkJPSAoMTw8MTApLAorCUhpZ2hQcmlvcml0eSAJCQk9ICgxPDwxMSksCisJTm9ybWFsUHJpb3JpdHkgCQkJPSAoMTw8MTIpLAorCUFzeW5jCQkJCT0gKDE8PDEzKSwKKwlBc3luY0lvCQkJCT0gKDE8PDEzKSwJLy8gcnBiZml4OiByZW1vdmUgd2l0aCBuZXcgcmVnaW1lCisJUGFnZUZpbGVJbwkJCT0gKDE8PDE0KSwJLy8gcnBiZml4OiByZW1vdmUgd2l0aCBuZXcgcmVnaW1lCisJU2h1dGRvd25SZXF1ZXN0CQkJPSAoMTw8MTUpLAorCUxhenlXcml0ZQkJCT0gKDE8PDE2KSwJLy8gcnBiZml4OiByZW1vdmUgd2l0aCBuZXcgcmVnaW1lCisJQWRhcHRlck1pY3JvRmliCQkJPSAoMTw8MTcpLAorCUJJT1NGaWJQYXRoCQkJPSAoMTw8MTgpLAorCUZhc3RSZXNwb25zZUNhcGFibGUJCT0gKDE8PDE5KSwKKwlBcGlGaWIJCQkJPSAoMTw8MjApCS8vIEl0cyBhbiBBUEkgRmliLgorfTsKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgZGVmaW5lcyBuZWVkcyB0byBiZSB1cGRhdGVkIGFueSB0aW1lIHRoZXJlIGlzIGFuCisgKglpbmNvbXBhdGlibGUgY2hhbmdlIG1hZGUgdG8gdGhlIGFhY19pbml0IHN0cnVjdHVyZS4KKyAqLworCisjZGVmaW5lIEFEQVBURVJfSU5JVF9TVFJVQ1RfUkVWSVNJT04JCTMKKworc3RydWN0IGFhY19pbml0Cit7CisJdTMyCUluaXRTdHJ1Y3RSZXZpc2lvbjsKKwl1MzIJTWluaVBvcnRSZXZpc2lvbjsKKwl1MzIJZnNyZXY7CisJdTMyCUNvbW1IZWFkZXJBZGRyZXNzOworCXUzMglGYXN0SW9Db21tQXJlYUFkZHJlc3M7CisJdTMyCUFkYXB0ZXJGaWJzUGh5c2ljYWxBZGRyZXNzOworCXUzMglBZGFwdGVyRmlic1ZpcnR1YWxBZGRyZXNzOworCXUzMglBZGFwdGVyRmlic1NpemU7CisJdTMyCUFkYXB0ZXJGaWJBbGlnbjsKKwl1MzIJcHJpbnRmYnVmOworCXUzMglwcmludGZidWZzaXo7CisJdTMyCUhvc3RQaHlzTWVtUGFnZXM7CQkvLyBudW1iZXIgb2YgNGsgcGFnZXMgb2YgaG9zdCBwaHlzaWNhbCBtZW1vcnkKKwl1MzIJSG9zdEVsYXBzZWRTZWNvbmRzOwkJLy8gbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMTk3MC4KK307CisKK2VudW0gYWFjX2xvZ19sZXZlbCB7CisJTE9HX0FBQ19JTklUCQkJPSAxMCwKKwlMT0dfQUFDX0lORk9STUFUSU9OQUwJCT0gMjAsCisJTE9HX0FBQ19XQVJOSU5HCQkJPSAzMCwKKwlMT0dfQUFDX0xPV19FUlJPUgkJPSA0MCwKKwlMT0dfQUFDX01FRElVTV9FUlJPUgkJPSA1MCwKKwlMT0dfQUFDX0hJR0hfRVJST1IJCT0gNjAsCisJTE9HX0FBQ19QQU5JQwkJCT0gNzAsCisJTE9HX0FBQ19ERUJVRwkJCT0gODAsCisJTE9HX0FBQ19XSU5EQkdfUFJJTlQJCT0gOTAKK307CisKKyNkZWZpbmUgRlNBRlNfTlRDX0dFVF9BREFQVEVSX0ZJQl9DT05URVhUCTB4MDMwYgorI2RlZmluZSBGU0FGU19OVENfRklCX0NPTlRFWFQJCQkweDAzMGMKKworc3RydWN0IGFhY19kZXY7CisKK3N0cnVjdCBhZGFwdGVyX29wcworeworCXZvaWQgKCphZGFwdGVyX2ludGVycnVwdCkoc3RydWN0IGFhY19kZXYgKmRldik7CisJdm9pZCAoKmFkYXB0ZXJfbm90aWZ5KShzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgZXZlbnQpOworCWludCAgKCphZGFwdGVyX3N5bmNfY21kKShzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnN0YXR1cyk7CisJaW50ICAoKmFkYXB0ZXJfY2hlY2tfaGVhbHRoKShzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK307CisKKy8qCisgKglEZWZpbmUgd2hpY2ggaW50ZXJydXB0IGhhbmRsZXIgbmVlZHMgdG8gYmUgaW5zdGFsbGVkCisgKi8KKworc3RydWN0IGFhY19kcml2ZXJfaWRlbnQKK3sKKwlpbnQgCSgqaW5pdCkoc3RydWN0IGFhY19kZXYgKmRldik7CisJY2hhciAqCW5hbWU7CisJY2hhciAqCXZuYW1lOworCWNoYXIgKgltb2RlbDsKKwl1MTYJY2hhbm5lbHM7CisJaW50CXF1aXJrczsKK307CisvKgorICogU29tZSBhZGFwdGVyIGZpcm13YXJlIG5lZWRzIGNvbW11bmljYXRpb24gbWVtb3J5IAorICogYmVsb3cgMmdpZy4gVGhpcyB0ZWxscyB0aGUgaW5pdCBmdW5jdGlvbiB0byBzZXQgdGhlCisgKiBkbWEgbWFzayBzdWNoIHRoYXQgZmliIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCB3aGVyZSB0aGUKKyAqIGFkYXB0ZXIgZmlybXdhcmUgY2FuIGdldCB0byBpdC4KKyAqLworI2RlZmluZSBBQUNfUVVJUktfMzFCSVQJMHgwMDAxCisKKy8qCisgKiBTb21lIGFkYXB0ZXIgZmlybXdhcmUsIHdoZW4gdGhlIHJhaWQgY2FyZCdzIGNhY2hlIGlzIHR1cm5lZCBvZmYsIGNhbiBub3QKKyAqIHNwbGl0IHVwIHNjYXR0ZXIgZ2F0aGVycyBpbiBvcmRlciB0byBkZWFsIHdpdGggdGhlIGxpbWl0cyBvZiB0aGUKKyAqIHVuZGVybHlpbmcgQ0hJTS4gVGhpcyBsaW1pdCBpcyAzNCBzY2F0dGVyIGdhdGhlciBlbGVtZW50cy4KKyAqLworI2RlZmluZSBBQUNfUVVJUktfMzRTRwkweDAwMDIKKworLyoKKyAqIFRoaXMgYWRhcHRlciBpcyBhIHNsYXZlIChubyBGaXJtd2FyZSkKKyAqLworI2RlZmluZSBBQUNfUVVJUktfU0xBVkUgMHgwMDA0CisKKy8qCisgKiBUaGlzIGFkYXB0ZXIgaXMgYSBtYXN0ZXIuCisgKi8KKyNkZWZpbmUgQUFDX1FVSVJLX01BU1RFUiAweDAwMDgKKworLyoKKyAqCVRoZSBhZGFwdGVyIGludGVyZmFjZSBzcGVjcyBhbGwgcXVldWVzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUKKyAqCXBoeXNpY2FsbHkgY29udGlnb3VzIGJsb2NrLiBUaGUgaG9zdCBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZQorICoJY29tbXVpY2F0aW9uIHF1ZXVlcyB3aWxsIGFzc3VtZSB0aGV5IGFyZSBlYWNoIGEgc2VwYXJhdGUgcGh5c2ljYWxseQorICoJY29udGlnb3VzIG1lbW9yeSByZWdpb24gdGhhdCB3aWxsIHN1cHBvcnQgdGhlbSBhbGwgYmVpbmcgb25lIGJpZworICoJY29udGlnb3VzIGJsb2NrLiAKKyAqCVRoZXJlIGlzIGEgY29tbWFuZCBhbmQgcmVzcG9uc2UgcXVldWUgZm9yIGVhY2ggbGV2ZWwgYW5kIGRpcmVjdGlvbiBvZgorICoJY29tbXVpY2F0aW9uLiBUaGVzZSByZWdpb25zIGFyZSBhY2Nlc3NlZCBieSBib3RoIHRoZSBob3N0IGFuZCBhZGFwdGVyLgorICovCisgCitzdHJ1Y3QgYWFjX3F1ZXVlIHsKKwl1NjQJCSAJbG9naWNhbDsJLyphZGRyZXNzIHdlIGdpdmUgdGhlIGFkYXB0ZXIgKi8KKwlzdHJ1Y3QgYWFjX2VudHJ5CSpiYXNlOwkJLypzeXN0ZW0gdmlydHVhbCBhZGRyZXNzICovCisJc3RydWN0IGFhY19xaGRyIAloZWFkZXJzOyAgICAgICAJLypwcm9kdWNlcixjb25zdW1lciBxIGhlYWRlcnMqLworCXUzMgkgCQllbnRyaWVzOwkvKk51bWJlciBvZiBxdWV1ZSBlbnRyaWVzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJcWZ1bGw7CQkvKkV2ZW50IHRvIHdhaXQgb24gaWYgcSBmdWxsICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJY21kcmVhZHk7CS8qQ21kIHJlYWR5IGZyb20gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgYWRhcHRlciB0byBob3N0IGNvbW1hbmQgcXVldWVzLiAqLyAKKwlzcGlubG9ja190CSAJKmxvY2s7CQkvKiBTcGlubG9jayBmb3IgdGhpcyBxdWV1ZSBtdXN0IHRha2UgdGhpcyBsb2NrIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIGxvY2sgKi8KKwlzcGlubG9ja190CQlsb2NrZGF0YTsJLyogQWN0dWFsIGxvY2sgKHVzZWQgb25seSBvbiBvbmUgc2lkZSBvZiB0aGUgbG9jaykgKi8KKwl1bnNpZ25lZCBsb25nCQlTYXZlZElycWw7ICAgICAJLyogUHJldmlvdXMgSVJRTCB3aGVuIHRoZSBzcGluIGxvY2sgaXMgdGFrZW4gKi8KKwl1MzIJCQlwYWRkaW5nOwkvKiBQYWRkaW5nIC0gRklYTUUgLSBjYW4gcmVtb3ZlIEkgYmVsaWV2ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgCWNtZHE7CSAgIAkvKiBBIHF1ZXVlIG9mIEZJQnMgd2hpY2ggbmVlZCB0byBiZSBwcmNlc3NlZCBieSB0aGUgRlMgdGhyZWFkLiBUaGlzIGlzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLyogb25seSB2YWxpZCBmb3IgY29tbWFuZCBxdWV1ZXMgd2hpY2ggcmVjZWl2ZSBlbnRyaWVzIGZyb20gdGhlIGFkYXB0ZXIuICovCisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5ncTsJLyogQSBxdWV1ZSBvZiBvdXRzdGFuZGluZyBmaWIncyB0byB0aGUgYWRhcHRlci4gKi8KKwl1MzIJCQludW1wZW5kaW5nOwkvKiBOdW1iZXIgb2YgZW50cmllcyBvbiBvdXRzdGFuZGluZyBxdWV1ZS4gKi8KKwlzdHJ1Y3QgYWFjX2RldiAqCWRldjsJCS8qIEJhY2sgcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZSAqLworfTsKKworLyoKKyAqCU1lc3NhZ2UgcXVldWVzLiBUaGUgb3JkZXIgaGVyZSBpcyBpbXBvcnRhbnQsIHNlZSBhbHNvIHRoZSAKKyAqCXF1ZXVlIHR5cGUgb3JkZXJpbmcKKyAqLworCitzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrCit7CisJc3RydWN0IGFhY19xdWV1ZSBxdWV1ZVs4XTsKK307CisKKy8qCisgKglTYVAxIE1lc3NhZ2UgVW5pdCBSZWdpc3RlcnMKKyAqLworIAorc3RydWN0IHNhX2RyYXdicmlkZ2VfQ1NSIHsKKwkJCQkvKglPZmZzZXQgCXwgIE5hbWUgKi8KKwlfX2xlMzIJcmVzZXJ2ZWRbMTBdOwkvKgkwMGgtMjdoIHwgIFJlc2VydmVkICovCisJdTgJTFVUX09mZnNldDsJLyoJMjhoCXwgIExvb2t1cCBUYWJsZSBPZmZzZXQgKi8KKwl1OAlyZXNlcnZlZDFbM107CS8qIAkyOWgtMmJoCXwgIFJlc2VydmVkICovCisJX19sZTMyCUxVVF9EYXRhOwkvKgkyY2gJfCAgTG9vdXAgVGFibGUgRGF0YSAqLworCV9fbGUzMglyZXNlcnZlZDJbMjZdOwkvKgkzMGgtOTdoCXwgIFJlc2VydmVkICovCisJX19sZTE2CVBSSUNMRUFSSVJROwkvKgk5OGgJfCAgUHJpbWFyeSBDbGVhciBJcnEgKi8KKwlfX2xlMTYJU0VDQ0xFQVJJUlE7CS8qCTlhaAl8ICBTZWNvbmRhcnkgQ2xlYXIgSXJxICovCisJX19sZTE2CVBSSVNFVElSUTsJLyoJOWNoCXwgIFByaW1hcnkgU2V0IElycSAqLworCV9fbGUxNglTRUNTRVRJUlE7CS8qCTllaAl8ICBTZWNvbmRhcnkgU2V0IElycSAqLworCV9fbGUxNglQUklDTEVBUklSUU1BU0s7LyoJYTBoCXwgIFByaW1hcnkgQ2xlYXIgSXJxIE1hc2sgKi8KKwlfX2xlMTYJU0VDQ0xFQVJJUlFNQVNLOy8qCWEyaAl8ICBTZWNvbmRhcnkgQ2xlYXIgSXJxIE1hc2sgKi8KKwlfX2xlMTYJUFJJU0VUSVJRTUFTSzsJLyoJYTRoCXwgIFByaW1hcnkgU2V0IElycSBNYXNrICovCisJX19sZTE2CVNFQ1NFVElSUU1BU0s7CS8qCWE2aAl8ICBTZWNvbmRhcnkgU2V0IElycSBNYXNrICovCisJX19sZTMyCU1BSUxCT1gwOwkvKglhOGgJfCAgU2NyYXRjaHBhZCAwICovCisJX19sZTMyCU1BSUxCT1gxOwkvKglhY2gJfCAgU2NyYXRjaHBhZCAxICovCisJX19sZTMyCU1BSUxCT1gyOwkvKgliMGgJfCAgU2NyYXRjaHBhZCAyICovCisJX19sZTMyCU1BSUxCT1gzOwkvKgliNGgJfCAgU2NyYXRjaHBhZCAzICovCisJX19sZTMyCU1BSUxCT1g0OwkvKgliOGgJfCAgU2NyYXRjaHBhZCA0ICovCisJX19sZTMyCU1BSUxCT1g1OwkvKgliY2gJfCAgU2NyYXRjaHBhZCA1ICovCisJX19sZTMyCU1BSUxCT1g2OwkvKgljMGgJfCAgU2NyYXRjaHBhZCA2ICovCisJX19sZTMyCU1BSUxCT1g3OwkvKgljNGgJfCAgU2NyYXRjaHBhZCA3ICovCisJX19sZTMyCVJPTV9TZXR1cF9EYXRhOwkvKgljOGggCXwgIFJvbSBTZXR1cCBhbmQgRGF0YSAqLworCV9fbGUzMglST01fQ29udHJvbF9BZGRyOy8qCWNjaCAJfCAgUm9tIENvbnRyb2wgYW5kIEFkZHJlc3MgKi8KKwlfX2xlMzIJcmVzZXJ2ZWQzWzEyXTsJLyoJZDBoLWZmaAl8ICByZXNlcnZlZCAqLworCV9fbGUzMglMVVRbNjRdOwkvKiAgICAxMDBoLTFmZmgJfCAgTG9va3VwIFRhYmxlIEVudHJpZXMgKi8KK307CisKKyNkZWZpbmUgTWFpbGJveDAJU2FEYkNTUi5NQUlMQk9YMAorI2RlZmluZSBNYWlsYm94MQlTYURiQ1NSLk1BSUxCT1gxCisjZGVmaW5lIE1haWxib3gyCVNhRGJDU1IuTUFJTEJPWDIKKyNkZWZpbmUgTWFpbGJveDMJU2FEYkNTUi5NQUlMQk9YMworI2RlZmluZSBNYWlsYm94NAlTYURiQ1NSLk1BSUxCT1g0CisjZGVmaW5lIE1haWxib3g1CVNhRGJDU1IuTUFJTEJPWDUKKyNkZWZpbmUgTWFpbGJveDcJU2FEYkNTUi5NQUlMQk9YNworCQorI2RlZmluZSBEb29yYmVsbFJlZ19wIFNhRGJDU1IuUFJJU0VUSVJRCisjZGVmaW5lIERvb3JiZWxsUmVnX3MgU2FEYkNTUi5TRUNTRVRJUlEKKyNkZWZpbmUgRG9vcmJlbGxDbHJSZWdfcCBTYURiQ1NSLlBSSUNMRUFSSVJRCisKKworI2RlZmluZQlET09SQkVMTF8wCTB4MDAwMQorI2RlZmluZSBET09SQkVMTF8xCTB4MDAwMgorI2RlZmluZSBET09SQkVMTF8yCTB4MDAwNAorI2RlZmluZSBET09SQkVMTF8zCTB4MDAwOAorI2RlZmluZSBET09SQkVMTF80CTB4MDAxMAorI2RlZmluZSBET09SQkVMTF81CTB4MDAyMAorI2RlZmluZSBET09SQkVMTF82CTB4MDA0MAorCisJCisjZGVmaW5lIFByaW50ZlJlYWR5CURPT1JCRUxMXzUKKyNkZWZpbmUgUHJpbnRmRG9uZQlET09SQkVMTF81CisJCitzdHJ1Y3Qgc2FfcmVnaXN0ZXJzIHsKKwlzdHJ1Y3Qgc2FfZHJhd2JyaWRnZV9DU1IJU2FEYkNTUjsJCQkvKiA5OGggLSBjNGggKi8KK307CisJCisKKyNkZWZpbmUgU2FfTUlOSVBPUlRfUkVWSVNJT04JCQkxCisKKyNkZWZpbmUgc2FfcmVhZHcoQUVQLCBDU1IpCQlyZWFkbCgmKChBRVApLT5yZWdzLnNhLT5DU1IpKQorI2RlZmluZSBzYV9yZWFkbChBRVAsICBDU1IpCQlyZWFkbCgmKChBRVApLT5yZWdzLnNhLT5DU1IpKQorI2RlZmluZSBzYV93cml0ZXcoQUVQLCBDU1IsIHZhbHVlKQl3cml0ZXcodmFsdWUsICYoKEFFUCktPnJlZ3Muc2EtPkNTUikpCisjZGVmaW5lIHNhX3dyaXRlbChBRVAsIENTUiwgdmFsdWUpCXdyaXRlbCh2YWx1ZSwgJigoQUVQKS0+cmVncy5zYS0+Q1NSKSkKKworLyoKKyAqCVJ4IE1lc3NhZ2UgVW5pdCBSZWdpc3RlcnMKKyAqLworCitzdHJ1Y3QgcnhfbXVfcmVnaXN0ZXJzIHsKKwkJCSAgICAvKglMb2NhbCAgfCBQQ0kqfCBOYW1lICovCisJX19sZTMyCUFSU1I7CSAgICAvKgkxMzAwaCAgfCAwMGggfCBBUElDIFJlZ2lzdGVyIFNlbGVjdCBSZWdpc3RlciAqLworCV9fbGUzMglyZXNlcnZlZDA7ICAvKgkxMzA0aCAgfCAwNGggfCBSZXNlcnZlZCAqLworCV9fbGUzMglBV1I7CSAgICAvKgkxMzA4aCAgfCAwOGggfCBBUElDIFdpbmRvdyBSZWdpc3RlciAqLworCV9fbGUzMglyZXNlcnZlZDE7ICAvKgkxMzBDaCAgfCAwQ2ggfCBSZXNlcnZlZCAqLworCV9fbGUzMglJTVJ4WzJdOyAgICAvKgkxMzEwaCAgfCAxMGggfCBJbmJvdW5kIE1lc3NhZ2UgUmVnaXN0ZXJzICovCisJX19sZTMyCU9NUnhbMl07ICAgIC8qCTEzMThoICB8IDE4aCB8IE91dGJvdW5kIE1lc3NhZ2UgUmVnaXN0ZXJzICovCisJX19sZTMyCUlEUjsJICAgIC8qCTEzMjBoICB8IDIwaCB8IEluYm91bmQgRG9vcmJlbGwgUmVnaXN0ZXIgKi8KKwlfX2xlMzIJSUlTUjsJICAgIC8qCTEzMjRoICB8IDI0aCB8IEluYm91bmQgSW50ZXJydXB0IAorCQkJCQkJU3RhdHVzIFJlZ2lzdGVyICovCisJX19sZTMyCUlJTVI7CSAgICAvKgkxMzI4aCAgfCAyOGggfCBJbmJvdW5kIEludGVycnVwdCAKKwkJCQkJIAlNYXNrIFJlZ2lzdGVyICovCisJX19sZTMyCU9EUjsJICAgIC8qCTEzMkNoICB8IDJDaCB8IE91dGJvdW5kIERvb3JiZWxsIFJlZ2lzdGVyICovCisJX19sZTMyCU9JU1I7CSAgICAvKgkxMzMwaCAgfCAzMGggfCBPdXRib3VuZCBJbnRlcnJ1cHQgCisJCQkJCQlTdGF0dXMgUmVnaXN0ZXIgKi8KKwlfX2xlMzIJT0lNUjsJICAgIC8qCTEzMzRoICB8IDM0aCB8IE91dGJvdW5kIEludGVycnVwdCAKKwkJCQkJCU1hc2sgUmVnaXN0ZXIgKi8KKwkJCSAgICAvKiAqIE11c3QgYWNjZXNzIHRocm91Z2ggQVRVIEluYm91bmQgCisJCQkgICAgIAkgVHJhbnNsYXRpb24gV2luZG93ICovCit9OworCitzdHJ1Y3QgcnhfaW5ib3VuZCB7CisJX19sZTMyCU1haWxib3hbOF07Cit9OworCisjZGVmaW5lCUluYm91bmRNYWlsYm94MAkJSW5kZXhSZWdzLk1haWxib3hbMF0KKyNkZWZpbmUJSW5ib3VuZE1haWxib3gxCQlJbmRleFJlZ3MuTWFpbGJveFsxXQorI2RlZmluZQlJbmJvdW5kTWFpbGJveDIJCUluZGV4UmVncy5NYWlsYm94WzJdCisjZGVmaW5lCUluYm91bmRNYWlsYm94MwkJSW5kZXhSZWdzLk1haWxib3hbM10KKyNkZWZpbmUJSW5ib3VuZE1haWxib3g0CQlJbmRleFJlZ3MuTWFpbGJveFs0XQorI2RlZmluZQlJbmJvdW5kTWFpbGJveDUJCUluZGV4UmVncy5NYWlsYm94WzVdCisjZGVmaW5lCUluYm91bmRNYWlsYm94NgkJSW5kZXhSZWdzLk1haWxib3hbNl0KKworI2RlZmluZQlJTkJPVU5ERE9PUkJFTExfMAkweDAwMDAwMDAxCisjZGVmaW5lIElOQk9VTkRET09SQkVMTF8xCTB4MDAwMDAwMDIKKyNkZWZpbmUgSU5CT1VORERPT1JCRUxMXzIJMHgwMDAwMDAwNAorI2RlZmluZSBJTkJPVU5ERE9PUkJFTExfMwkweDAwMDAwMDA4CisjZGVmaW5lIElOQk9VTkRET09SQkVMTF80CTB4MDAwMDAwMTAKKyNkZWZpbmUgSU5CT1VORERPT1JCRUxMXzUJMHgwMDAwMDAyMAorI2RlZmluZSBJTkJPVU5ERE9PUkJFTExfNgkweDAwMDAwMDQwCisKKyNkZWZpbmUJT1VUQk9VTkRET09SQkVMTF8wCTB4MDAwMDAwMDEKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF8xCTB4MDAwMDAwMDIKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF8yCTB4MDAwMDAwMDQKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF8zCTB4MDAwMDAwMDgKKyNkZWZpbmUgT1VUQk9VTkRET09SQkVMTF80CTB4MDAwMDAwMTAKKworI2RlZmluZSBJbmJvdW5kRG9vcmJlbGxSZWcJTVVuaXQuSURSCisjZGVmaW5lIE91dGJvdW5kRG9vcmJlbGxSZWcJTVVuaXQuT0RSCisKK3N0cnVjdCByeF9yZWdpc3RlcnMgeworCXN0cnVjdCByeF9tdV9yZWdpc3RlcnMJCU1Vbml0OwkJLyogMTMwMGggLSAxMzM0aCAqLworCV9fbGUzMgkJCQlyZXNlcnZlZDFbNl07CS8qIDEzMzhoIC0gMTM0Y2ggKi8KKwlzdHJ1Y3QgcnhfaW5ib3VuZAkJSW5kZXhSZWdzOworfTsKKworI2RlZmluZSByeF9yZWFkYihBRVAsIENTUikJCXJlYWRiKCYoKEFFUCktPnJlZ3MucngtPkNTUikpCisjZGVmaW5lIHJ4X3JlYWRsKEFFUCwgQ1NSKQkJcmVhZGwoJigoQUVQKS0+cmVncy5yeC0+Q1NSKSkKKyNkZWZpbmUgcnhfd3JpdGViKEFFUCwgQ1NSLCB2YWx1ZSkJd3JpdGViKHZhbHVlLCAmKChBRVApLT5yZWdzLnJ4LT5DU1IpKQorI2RlZmluZSByeF93cml0ZWwoQUVQLCBDU1IsIHZhbHVlKQl3cml0ZWwodmFsdWUsICYoKEFFUCktPnJlZ3MucngtPkNTUikpCisKKy8qCisgKglSa3QgTWVzc2FnZSBVbml0IFJlZ2lzdGVycyAoc2FtZSBhcyBSeCwgZXhjZXB0IGEgbGFyZ2VyIHJlc2VydmUgcmVnaW9uKQorICovCisKKyNkZWZpbmUgcmt0X211X3JlZ2lzdGVycyByeF9tdV9yZWdpc3RlcnMKKyNkZWZpbmUgcmt0X2luYm91bmQgcnhfaW5ib3VuZAorCitzdHJ1Y3Qgcmt0X3JlZ2lzdGVycyB7CisJc3RydWN0IHJrdF9tdV9yZWdpc3RlcnMJCU1Vbml0OwkJIC8qIDEzMDBoIC0gMTMzNGggKi8KKwlfX2xlMzIJCQkJcmVzZXJ2ZWQxWzEwMTBdOyAvKiAxMzM4aCAtIDIyZmNoICovCisJc3RydWN0IHJrdF9pbmJvdW5kCQlJbmRleFJlZ3M7CSAvKiAyMzAwaCAtICovCit9OworCisjZGVmaW5lIHJrdF9yZWFkYihBRVAsIENTUikJCXJlYWRiKCYoKEFFUCktPnJlZ3Mucmt0LT5DU1IpKQorI2RlZmluZSBya3RfcmVhZGwoQUVQLCBDU1IpCQlyZWFkbCgmKChBRVApLT5yZWdzLnJrdC0+Q1NSKSkKKyNkZWZpbmUgcmt0X3dyaXRlYihBRVAsIENTUiwgdmFsdWUpCXdyaXRlYih2YWx1ZSwgJigoQUVQKS0+cmVncy5ya3QtPkNTUikpCisjZGVmaW5lIHJrdF93cml0ZWwoQUVQLCBDU1IsIHZhbHVlKQl3cml0ZWwodmFsdWUsICYoKEFFUCktPnJlZ3Mucmt0LT5DU1IpKQorCitzdHJ1Y3QgZmliOworCit0eXBlZGVmIHZvaWQgKCpmaWJfY2FsbGJhY2spKHZvaWQgKmN0eHQsIHN0cnVjdCBmaWIgKmZpYmN0eCk7CisKK3N0cnVjdCBhYWNfZmliX2NvbnRleHQgeworCXMxNgkgCQl0eXBlOwkJLy8gdXNlZCBmb3IgdmVyaWZpY2F0aW9uIG9mIHN0cnVjdHVyZQkKKwlzMTYJIAkJc2l6ZTsKKwl1MzIJCQl1bmlxdWU7CQkvLyB1bmlxdWUgdmFsdWUgcmVwcmVzZW50aW5nIHRoaXMgY29udGV4dAorCXVsb25nCQkJamlmZmllczsJLy8gdXNlZCBmb3IgY2xlYW51cCAtIGRtYiBjaGFuZ2VkIHRvIHVsb25nCisJc3RydWN0IGxpc3RfaGVhZAluZXh0OwkJLy8gdXNlZCB0byBsaW5rIGNvbnRleHQncyBpbnRvIGEgbGlua2VkIGxpc3QKKwlzdHJ1Y3Qgc2VtYXBob3JlIAl3YWl0X3NlbTsJLy8gdGhpcyBpcyB1c2VkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGZpYiB0byBhcnJpdmUuCisJaW50CQkJd2FpdDsJCS8vIFNldCB0byB0cnVlIHdoZW4gdGhyZWFkIGlzIGluIFdhaXRGb3JTaW5nbGVPYmplY3QKKwl1bnNpZ25lZCBsb25nCQljb3VudDsJCS8vIHRvdGFsIG51bWJlciBvZiBGSUJzIG9uIEZpYkxpc3QKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZpYl9saXN0OwkvLyB0aGlzIGhvbGRzIGZpYnMgYW5kIHRoZWlyIGF0dGFjaGQgaHdfZmlicworfTsKKworc3RydWN0IHNlbnNlX2RhdGEgeworCXU4IGVycm9yX2NvZGU7CQkvKiA3MGggKGN1cnJlbnQgZXJyb3JzKSwgNzFoKGRlZmVycmVkIGVycm9ycykgKi8KKwl1OCB2YWxpZDoxOwkJLyogQSB2YWxpZCBiaXQgb2Ygb25lIGluZGljYXRlcyB0aGF0IHRoZSBpbmZvcm1hdGlvbiAgKi8KKwkJCQkvKiBmaWVsZCBjb250YWlucyB2YWxpZCBpbmZvcm1hdGlvbiBhcyBkZWZpbmVkIGluIHRoZQorCQkJCSAqIFNDU0ktMiBTdGFuZGFyZC4KKwkJCQkgKi8KKwl1OCBzZWdtZW50X251bWJlcjsJLyogT25seSB1c2VkIGZvciBDT1BZLCBDT01QQVJFLCBvciBDT1BZIEFORCBWRVJJRlkgQ29tbWFuZHMgKi8KKwl1OCBzZW5zZV9rZXk6NDsJCS8qIFNlbnNlIEtleSAqLworCXU4IHJlc2VydmVkOjE7CisJdTggSUxJOjE7CQkvKiBJbmNvcnJlY3QgTGVuZ3RoIEluZGljYXRvciAqLworCXU4IEVPTToxOwkJLyogRW5kIE9mIE1lZGl1bSAtIHJlc2VydmVkIGZvciByYW5kb20gYWNjZXNzIGRldmljZXMgKi8KKwl1OCBmaWxlbWFyazoxOwkJLyogRmlsZW1hcmsgLSByZXNlcnZlZCBmb3IgcmFuZG9tIGFjY2VzcyBkZXZpY2VzICovCisKKwl1OCBpbmZvcm1hdGlvbls0XTsJLyogZm9yIGRpcmVjdC1hY2Nlc3MgZGV2aWNlcywgY29udGFpbnMgdGhlIHVuc2lnbmVkIAorCQkJCSAqIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvciByZXNpZHVlIGFzc29jaWF0ZWQgd2l0aCAKKwkJCQkgKiB0aGUgc2Vuc2Uga2V5IAorCQkJCSAqLworCXU4IGFkZF9zZW5zZV9sZW47CS8qIG51bWJlciBvZiBhZGRpdGlvbmFsIHNlbnNlIGJ5dGVzIHRvIGZvbGxvdyB0aGlzIGZpZWxkICovCisJdTggY21uZF9pbmZvWzRdOwkvKiBub3QgdXNlZCAqLworCXU4IEFTQzsJCQkvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgKi8KKwl1OCBBU0NROwkJLyogQWRkaXRpb25hbCBTZW5zZSBDb2RlIFF1YWxpZmllciAqLworCXU4IEZSVUM7CQkvKiBGaWVsZCBSZXBsYWNlYWJsZSBVbml0IENvZGUgLSBub3QgdXNlZCAqLworCXU4IGJpdF9wdHI6MzsJCS8qIGluZGljYXRlcyB3aGljaCBieXRlIG9mIHRoZSBDREIgb3IgcGFyYW1ldGVyIGRhdGEKKwkJCQkgKiB3YXMgaW4gZXJyb3IKKwkJCQkgKi8KKwl1OCBCUFY6MTsJCS8qIGJpdCBwb2ludGVyIHZhbGlkIChCUFYpOiAxLSBpbmRpY2F0ZXMgdGhhdCAKKwkJCQkgKiB0aGUgYml0X3B0ciBmaWVsZCBoYXMgdmFsaWQgdmFsdWUKKwkJCQkgKi8KKwl1OCByZXNlcnZlZDI6MjsKKwl1OCBDRDoxOwkJLyogY29tbWFuZCBkYXRhIGJpdDogMS0gaWxsZWdhbCBwYXJhbWV0ZXIgaW4gQ0RCLgorCQkJCSAqIDAtIGlsbGVnYWwgcGFyYW1ldGVyIGluIGRhdGEuCisJCQkJICovCisJdTggU0tTVjoxOworCXU4IGZpZWxkX3B0clsyXTsJLyogYnl0ZSBvZiB0aGUgQ0RCIG9yIHBhcmFtZXRlciBkYXRhIGluIGVycm9yICovCit9OworCitzdHJ1Y3QgZnNhX2Rldl9pbmZvIHsKKwl1NjQJCWxhc3Q7CisJdTY0CQlzaXplOworCXUzMgkJdHlwZTsKKwl1MTYJCXF1ZXVlX2RlcHRoOworCXU4CQl2YWxpZDsKKwl1OAkJcm87CisJdTgJCWxvY2tlZDsKKwl1OAkJZGVsZXRlZDsKKwljaGFyCQlkZXZuYW1lWzhdOworCXN0cnVjdCBzZW5zZV9kYXRhIHNlbnNlX2RhdGE7Cit9OworCitzdHJ1Y3QgZmliIHsKKwl2b2lkCQkJKm5leHQ7CS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgYWxsb2NhdG9yICovCisJczE2CQkJdHlwZTsKKwlzMTYJCQlzaXplOworCS8qCisJICoJVGhlIEFkYXB0ZXIgdGhhdCB0aGlzIEkvTyBpcyBkZXN0aW5lZCBmb3IuCisJICovCisJc3RydWN0IGFhY19kZXYgCQkqZGV2OworCS8qCisJICoJVGhpcyBpcyB0aGUgZXZlbnQgdGhlIHNlbmRmaWIgcm91dGluZSB3aWxsIHdhaXQgb24gaWYgdGhlCisJICoJY2FsbGVyIGRpZCBub3QgcGFzcyBvbmUgYW5kIHRoaXMgaXMgc3luY2ggaW8uCisJICovCisJc3RydWN0IHNlbWFwaG9yZSAJZXZlbnRfd2FpdDsKKwlzcGlubG9ja190CQlldmVudF9sb2NrOworCisJdTMyCQkJZG9uZTsJLyogZ2V0cyBzZXQgdG8gMSB3aGVuIGZpYiBpcyBjb21wbGV0ZSAqLworCWZpYl9jYWxsYmFjayAJCWNhbGxiYWNrOworCXZvaWQgCQkJKmNhbGxiYWNrX2RhdGE7CisJdTMyCQkJZmxhZ3M7IC8vIHUzMiBkbWIgd2FzIHVsb25nCisJLyoKKwkgKglUaGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gcHV0IHRoaXMgZmliIGNvbnRleHQgb250byB0aGUgCisJICoJT3V0c3RhbmRpbmcgSS9PIHF1ZXVlLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisJLyoKKwkgKglBbmQgZm9yIHRoZSBpbnRlcm5hbCBpc3N1ZS9yZXBseSBxdWV1ZXMgKHdlIG1heSBiZSBhYmxlCisJICoJdG8gbWVyZ2UgdGhlc2UgdHdvKQorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJZmlibGluazsKKwl2b2lkIAkJCSpkYXRhOworCXN0cnVjdCBod19maWIJCSpod19maWI7CQkvKiBBY3R1YWwgc2hhcmVkIG9iamVjdCAqLworCWRtYV9hZGRyX3QJCWh3X2ZpYl9wYTsJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaHdfZmliKi8KK307CisKKy8qCisgKglBZGFwdGVyIEluZm9ybWF0aW9uIEJsb2NrCisgKgorICoJVGhpcyBpcyByZXR1cm5lZCBieSB0aGUgUmVxdWVzdEFkYXB0ZXJJbmZvIGJsb2NrCisgKi8KKyAKK3N0cnVjdCBhYWNfYWRhcHRlcl9pbmZvCit7CisJdTMyCXBsYXRmb3JtOworCXUzMgljcHU7CisJdTMyCXN1YmNwdTsKKwl1MzIJY2xvY2s7CisJdTMyCWV4ZWNtZW07CisJdTMyCWJ1ZmZlcm1lbTsKKwl1MzIJdG90YWxtZW07CisJdTMyCWtlcm5lbHJldjsKKwl1MzIJa2VybmVsYnVpbGQ7CisJdTMyCW1vbml0b3JyZXY7CisJdTMyCW1vbml0b3JidWlsZDsKKwl1MzIJaHdyZXY7CisJdTMyCWh3YnVpbGQ7CisJdTMyCWJpb3NyZXY7CisJdTMyCWJpb3NidWlsZDsKKwl1MzIJY2x1c3RlcjsKKwl1MzIJY2x1c3RlcmNoYW5uZWxtYXNrOyAKKwl1MzIJc2VyaWFsWzJdOworCXUzMgliYXR0ZXJ5OworCXUzMglvcHRpb25zOworCXUzMglPRU07Cit9OworCisvKgorICogQmF0dGVyeSBwbGF0Zm9ybXMKKyAqLworI2RlZmluZSBBQUNfQkFUX1JFUV9QUkVTRU5UCSgxKQorI2RlZmluZSBBQUNfQkFUX1JFUV9OT1RQUkVTRU5UCSgyKQorI2RlZmluZSBBQUNfQkFUX09QVF9QUkVTRU5UCSgzKQorI2RlZmluZSBBQUNfQkFUX09QVF9OT1RQUkVTRU5UCSg0KQorI2RlZmluZSBBQUNfQkFUX05PVF9TVVBQT1JURUQJKDUpCisvKgorICogY3B1IHR5cGVzCisgKi8KKyNkZWZpbmUgQUFDX0NQVV9TSU1VTEFUT1IJKDEpCisjZGVmaW5lIEFBQ19DUFVfSTk2MAkJKDIpCisjZGVmaW5lIEFBQ19DUFVfU1RST05HQVJNCSgzKQorCisvKgorICogU3VwcG9ydGVkIE9wdGlvbnMKKyAqLworI2RlZmluZSBBQUNfT1BUX1NOQVBTSE9UCQljcHVfdG9fbGUzMigxKQorI2RlZmluZSBBQUNfT1BUX0NMVVNURVJTCQljcHVfdG9fbGUzMigxPDwxKQorI2RlZmluZSBBQUNfT1BUX1dSSVRFX0NBQ0hFCQljcHVfdG9fbGUzMigxPDwyKQorI2RlZmluZSBBQUNfT1BUXzY0QklUX0RBVEEJCWNwdV90b19sZTMyKDE8PDMpCisjZGVmaW5lIEFBQ19PUFRfSE9TVF9USU1FX0ZJQgkJY3B1X3RvX2xlMzIoMTw8NCkKKyNkZWZpbmUgQUFDX09QVF9SQUlENTAJCQljcHVfdG9fbGUzMigxPDw1KQorI2RlZmluZSBBQUNfT1BUXzRHQl9XSU5ET1cJCWNwdV90b19sZTMyKDE8PDYpCisjZGVmaW5lIEFBQ19PUFRfU0NTSV9VUEdSQURFQUJMRSAJY3B1X3RvX2xlMzIoMTw8NykKKyNkZWZpbmUgQUFDX09QVF9TT0ZUX0VSUl9SRVBPUlQJCWNwdV90b19sZTMyKDE8PDgpCisjZGVmaW5lIEFBQ19PUFRfU1VQUE9SVEVEX1JFQ09ORElUSU9OIAljcHVfdG9fbGUzMigxPDw5KQorI2RlZmluZSBBQUNfT1BUX1NHTUFQX0hPU1Q2NAkJY3B1X3RvX2xlMzIoMTw8MTApCisjZGVmaW5lIEFBQ19PUFRfQUxBUk0JCQljcHVfdG9fbGUzMigxPDwxMSkKKyNkZWZpbmUgQUFDX09QVF9OT05EQVNECQkJY3B1X3RvX2xlMzIoMTw8MTIpCisjZGVmaW5lIEFBQ19PUFRfU0NTSV9NQU5BR0VEICAgIAljcHVfdG9fbGUzMigxPDwxMykKKyNkZWZpbmUgQUFDX09QVF9SQUlEX1NDU0lfTU9ERQkJY3B1X3RvX2xlMzIoMTw8MTQpCisjZGVmaW5lIEFBQ19PUFRfU1VQUExFTUVOVF9BREFQVEVSX0lORk8JY3B1X3RvX2xlMzIoMTw8MTYpCisjZGVmaW5lIEFBQ19PUFRfTkVXX0NPTU0JCWNwdV90b19sZTMyKDE8PDE3KQorI2RlZmluZSBBQUNfT1BUX05FV19DT01NXzY0CQljcHVfdG9fbGUzMigxPDwxOCkKKworc3RydWN0IGFhY19kZXYKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OworCWNvbnN0IGNoYXIJCSpuYW1lOworCWludAkJCWlkOworCisJdTE2CQkJaXJxX21hc2s7CisJLyoKKwkgKglNYXAgZm9yIDEyOCBmaWIgb2JqZWN0cyAoNjRrKQorCSAqLwkKKwlkbWFfYWRkcl90CQlod19maWJfcGE7CisJc3RydWN0IGh3X2ZpYgkJKmh3X2ZpYl92YTsKKwlzdHJ1Y3QgaHdfZmliCQkqYWlmX2Jhc2VfdmE7CisJLyoKKwkgKglGaWIgSGVhZGVycworCSAqLworCXN0cnVjdCBmaWIgICAgICAgICAgICAgICpmaWJzOworCisJc3RydWN0IGZpYgkJKmZyZWVfZmliOworCXN0cnVjdCBmaWIJCSp0aW1lb3V0X2ZpYjsKKwlzcGlubG9ja190CQlmaWJfbG9jazsKKwkKKwlzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrICpxdWV1ZXM7CisJLyoKKwkgKglUaGUgdXNlciBBUEkgd2lsbCB1c2UgYW4gSU9DVEwgdG8gcmVnaXN0ZXIgaXRzZWxmIHRvIHJlY2VpdmUKKwkgKglGSUJzIGZyb20gdGhlIGFkYXB0ZXIuICBUaGUgZm9sbG93aW5nIGxpc3QgaXMgdXNlZCB0byBrZWVwCisJICoJdHJhY2sgb2YgYWxsIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdGhlc2UgRklCcy4gIFRoZQorCSAqCW11dGV4IGlzIHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIGFsbCBkYXRhIGFzc29jaWF0ZWQgCisJICoJd2l0aCB0aGUgYWRhcHRlciBmaWJzLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJZmliX2xpc3Q7CisKKwlzdHJ1Y3QgYWRhcHRlcl9vcHMJYV9vcHM7CisJdW5zaWduZWQgbG9uZwkJZnNyZXY7CQkvKiBNYWluIGRyaXZlcidzIHJldmlzaW9uIG51bWJlciAqLworCQorCXN0cnVjdCBhYWNfaW5pdAkJKmluaXQ7CQkvKiBIb2xkcyBpbml0aWFsaXphdGlvbiBpbmZvIHRvIGNvbW11bmljYXRlIHdpdGggYWRhcHRlciAqLworCWRtYV9hZGRyX3QJCWluaXRfcGE7IAkvKiBIb2xkcyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBpbml0IHN0cnVjdCAqLworCQorCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsJCS8qIE91ciBQQ0kgaW50ZXJmYWNlICovCisJdm9pZCAqCQkJcHJpbnRmYnVmOwkvKiBwb2ludGVyIHRvIGJ1ZmZlciB1c2VkIGZvciBwcmludGYncyBmcm9tIHRoZSBhZGFwdGVyICovCisJdm9pZCAqCQkJY29tbV9hZGRyOwkvKiBCYXNlIGFkZHJlc3Mgb2YgQ29tbSBhcmVhICovCisJZG1hX2FkZHJfdAkJY29tbV9waHlzOwkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIENvbW0gYXJlYSAqLworCXNpemVfdAkJCWNvbW1fc2l6ZTsKKworCXN0cnVjdCBTY3NpX0hvc3QJKnNjc2lfaG9zdF9wdHI7CisJaW50CQkJbWF4aW11bV9udW1fY29udGFpbmVyczsKKwlzdHJ1Y3QgZnNhX2Rldl9pbmZvCSpmc2FfZGV2OworCXBpZF90CQkJdGhyZWFkX3BpZDsKKwlpbnQJCQljYXJkdHlwZTsKKwkKKwkvKgorCSAqCVRoZSBmb2xsb3dpbmcgaXMgdGhlIGRldmljZSBzcGVjaWZpYyBleHRlbnNpb24uCisJICovCisJdW5pb24KKwl7CisJCXN0cnVjdCBzYV9yZWdpc3RlcnMgX19pb21lbSAqc2E7CisJCXN0cnVjdCByeF9yZWdpc3RlcnMgX19pb21lbSAqcng7CisJCXN0cnVjdCBya3RfcmVnaXN0ZXJzIF9faW9tZW0gKnJrdDsKKwl9IHJlZ3M7CisJdTMyCQkJT0lNUjsgLyogTWFzayBSZWdpc3RlciBDYWNoZSAqLworCS8qCisJICoJQUlGIHRocmVhZCBzdGF0ZXMKKwkgKi8KKwl1MzIJCQlhaWZfdGhyZWFkOworCXN0cnVjdCBjb21wbGV0aW9uCWFpZl9jb21wbGV0aW9uOworCXN0cnVjdCBhYWNfYWRhcHRlcl9pbmZvIGFkYXB0ZXJfaW5mbzsKKwkvKiBUaGVzZSBhcmUgaW4gYWRhcHRlciBpbmZvIGJ1dCB0aGV5IGFyZSBpbiB0aGUgaW8gZmxvdyBzbworCSAqIGxldHMgYnJlYWsgdGhlbSBvdXQgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbiBBTkQgdG8gY2hlY2sgdGhlbQorCSAqLworCXU4CQkJbm9uZGFzZF9zdXBwb3J0OyAKKwl1OAkJCWRhY19zdXBwb3J0OworCXU4CQkJcmFpZF9zY3NpX21vZGU7Cit9OworCisjZGVmaW5lIGFhY19hZGFwdGVyX2ludGVycnVwdChkZXYpIFwKKwkoZGV2KS0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQoZGV2KQorCisjZGVmaW5lIGFhY19hZGFwdGVyX25vdGlmeShkZXYsIGV2ZW50KSBcCisJKGRldiktPmFfb3BzLmFkYXB0ZXJfbm90aWZ5KGRldiwgZXZlbnQpCisKKworI2RlZmluZSBhYWNfYWRhcHRlcl9jaGVja19oZWFsdGgoZGV2KSBcCisJKGRldiktPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoKGRldikKKworCisjZGVmaW5lIEZJQl9DT05URVhUX0ZMQUdfVElNRURfT1VUCQkoMHgwMDAwMDAwMSkKKworLyoKKyAqCURlZmluZSB0aGUgY29tbWFuZCB2YWx1ZXMKKyAqLworIAorI2RlZmluZQkJTnVsbAkJCTAKKyNkZWZpbmUgCUdldEF0dHJpYnV0ZXMJCTEKKyNkZWZpbmUgCVNldEF0dHJpYnV0ZXMJCTIKKyNkZWZpbmUgCUxvb2t1cAkJCTMKKyNkZWZpbmUgCVJlYWRMaW5rCQk0CisjZGVmaW5lIAlSZWFkCQkJNQorI2RlZmluZSAJV3JpdGUJCQk2CisjZGVmaW5lCQlDcmVhdGUJCQk3CisjZGVmaW5lCQlNYWtlRGlyZWN0b3J5CQk4CisjZGVmaW5lCQlTeW1ib2xpY0xpbmsJCTkKKyNkZWZpbmUJCU1ha2VOb2RlCQkxMAorI2RlZmluZQkJUmVtb3ZleAkJCTExCisjZGVmaW5lCQlSZW1vdmVEaXJlY3Rvcnl4CTEyCisjZGVmaW5lCQlSZW5hbWUJCQkxMworI2RlZmluZQkJTGluawkJCTE0CisjZGVmaW5lCQlSZWFkRGlyZWN0b3J5CQkxNQorI2RlZmluZQkJUmVhZERpcmVjdG9yeVBsdXMJMTYKKyNkZWZpbmUJCUZpbGVTeXN0ZW1TdGF0dXMJMTcKKyNkZWZpbmUJCUZpbGVTeXN0ZW1JbmZvCQkxOAorI2RlZmluZQkJUGF0aENvbmZpZ3VyZQkJMTkKKyNkZWZpbmUJCUNvbW1pdAkJCTIwCisjZGVmaW5lCQlNb3VudAkJCTIxCisjZGVmaW5lCQlVbk1vdW50CQkJMjIKKyNkZWZpbmUJCU5ld2ZzCQkJMjMKKyNkZWZpbmUJCUZzQ2hlY2sJCQkyNAorI2RlZmluZQkJRnNTeW5jCQkJMjUKKyNkZWZpbmUJCVNpbVJlYWRXcml0ZQkJMjYKKyNkZWZpbmUJCVNldEZpbGVTeXN0ZW1TdGF0dXMJMjcKKyNkZWZpbmUJCUJsb2NrUmVhZAkJMjgKKyNkZWZpbmUJCUJsb2NrV3JpdGUJCTI5CisjZGVmaW5lCQlOdnJhbUlvY3RsCQkzMAorI2RlZmluZQkJRnNTeW5jV2FpdAkJMzEKKyNkZWZpbmUJCUNsZWFyQXJjaGl2ZUJpdAkJMzIKKyNkZWZpbmUJCVNldEFjbAkJCTMzCisjZGVmaW5lCQlHZXRBY2wJCQkzNAorI2RlZmluZQkJQXNzaWduQWNsCQkzNQorI2RlZmluZQkJRmF1bHRJbnNlcnRpb24JCTM2CS8qIEZhdWx0IEluc2VydGlvbiBDb21tYW5kICovCisjZGVmaW5lCQlDcmF6eUNhY2hlCQkzNwkvKiBDcmF6eWNhY2hlICovCisKKyNkZWZpbmUJCU1BWF9GU0FDT01NQU5EX05VTQkzOAorCisKKy8qCisgKglEZWZpbmUgdGhlIHN0YXR1cyByZXR1cm5zLiBUaGVzZSBhcmUgdmVyeSB1bml4bGlrZSBhbHRob3VnaAorICoJbW9zdCBhcmUgbm90IGluIGZhY3QgdXNlZAorICovCisKKyNkZWZpbmUJCVNUX09LCQkwCisjZGVmaW5lCQlTVF9QRVJNCQkxCisjZGVmaW5lCQlTVF9OT0VOVAkyCisjZGVmaW5lCQlTVF9JTwkJNQorI2RlZmluZQkJU1RfTlhJTwkJNgorI2RlZmluZQkJU1RfRTJCSUcJNworI2RlZmluZQkJU1RfQUNDRVMJMTMKKyNkZWZpbmUJCVNUX0VYSVNUCTE3CisjZGVmaW5lCQlTVF9YREVWCQkxOAorI2RlZmluZQkJU1RfTk9ERVYJMTkKKyNkZWZpbmUJCVNUX05PVERJUgkyMAorI2RlZmluZQkJU1RfSVNESVIJMjEKKyNkZWZpbmUJCVNUX0lOVkFMCTIyCisjZGVmaW5lCQlTVF9GQklHCQkyNworI2RlZmluZQkJU1RfTk9TUEMJMjgKKyNkZWZpbmUJCVNUX1JPRlMJCTMwCisjZGVmaW5lCQlTVF9NTElOSwkzMQorI2RlZmluZQkJU1RfV09VTERCTE9DSwkzNQorI2RlZmluZQkJU1RfTkFNRVRPT0xPTkcJNjMKKyNkZWZpbmUJCVNUX05PVEVNUFRZCTY2CisjZGVmaW5lCQlTVF9EUVVPVAk2OQorI2RlZmluZQkJU1RfU1RBTEUJNzAKKyNkZWZpbmUJCVNUX1JFTU9URQk3MQorI2RlZmluZQkJU1RfQkFESEFORExFCTEwMDAxCisjZGVmaW5lCQlTVF9OT1RfU1lOQwkxMDAwMgorI2RlZmluZQkJU1RfQkFEX0NPT0tJRQkxMDAwMworI2RlZmluZQkJU1RfTk9UU1VQUAkxMDAwNAorI2RlZmluZQkJU1RfVE9PU01BTEwJMTAwMDUKKyNkZWZpbmUJCVNUX1NFUlZFUkZBVUxUCTEwMDA2CisjZGVmaW5lCQlTVF9CQURUWVBFCTEwMDA3CisjZGVmaW5lCQlTVF9KVUtFQk9YCTEwMDA4CisjZGVmaW5lCQlTVF9OT1RNT1VOVEVECTEwMDA5CisjZGVmaW5lCQlTVF9NQUlOVE1PREUJMTAwMTAKKyNkZWZpbmUJCVNUX1NUQUxFQUNMCTEwMDExCisKKy8qCisgKglPbiB3cml0ZXMgaG93IGRvZXMgdGhlIGNsaWVudCB3YW50IHRoZSBkYXRhIHdyaXR0ZW4uCisgKi8KKworI2RlZmluZQlDQUNIRV9DU1RBQkxFCQkxCisjZGVmaW5lIENBQ0hFX1VOU1RBQkxFCQkyCisKKy8qCisgKglMZXRzIHRoZSBjbGllbnQga25vdyBhdCB3aGljaCBsZXZlbCB0aGUgZGF0YSB3YXMgY29tbWl0ZWQgb24KKyAqCWEgd3JpdGUgcmVxdWVzdAorICovCisKKyNkZWZpbmUJQ01GSUxFX1NZTkNIX05WUkFNCTEKKyNkZWZpbmUJQ01EQVRBX1NZTkNIX05WUkFNCTIKKyNkZWZpbmUJQ01GSUxFX1NZTkNICQkzCisjZGVmaW5lIENNREFUQV9TWU5DSAkJNAorI2RlZmluZSBDTVVOU1RBQkxFCQk1CisKK3N0cnVjdCBhYWNfcmVhZAoreworCXUzMgkgCWNvbW1hbmQ7CisJdTMyIAkJY2lkOworCXUzMiAJCWJsb2NrOworCXUzMiAJCWNvdW50OworCXN0cnVjdCBzZ21hcAlzZzsJLy8gTXVzdCBiZSBsYXN0IGluIHN0cnVjdCBiZWNhdXNlIGl0IGlzIHZhcmlhYmxlCit9OworCitzdHJ1Y3QgYWFjX3JlYWQ2NAoreworCXUzMgkgCWNvbW1hbmQ7CisJdTE2IAkJY2lkOworCXUxNiAJCXNlY3Rvcl9jb3VudDsKKwl1MzIgCQlibG9jazsKKwl1MTYJCXBhZDsKKwl1MTYJCWZsYWdzOworCXN0cnVjdCBzZ21hcDY0CXNnOwkvLyBNdXN0IGJlIGxhc3QgaW4gc3RydWN0IGJlY2F1c2UgaXQgaXMgdmFyaWFibGUKK307CisKK3N0cnVjdCBhYWNfcmVhZF9yZXBseQoreworCXUzMgkgCXN0YXR1czsKKwl1MzIgCQljb3VudDsKK307CisKK3N0cnVjdCBhYWNfd3JpdGUKK3sKKwl1MzIJCWNvbW1hbmQ7CisJdTMyIAkJY2lkOworCXUzMiAJCWJsb2NrOworCXUzMiAJCWNvdW50OworCXUzMgkgCXN0YWJsZTsJLy8gTm90IHVzZWQKKwlzdHJ1Y3Qgc2dtYXAJc2c7CS8vIE11c3QgYmUgbGFzdCBpbiBzdHJ1Y3QgYmVjYXVzZSBpdCBpcyB2YXJpYWJsZQorfTsKKworc3RydWN0IGFhY193cml0ZTY0Cit7CisJdTMyCSAJY29tbWFuZDsKKwl1MTYgCQljaWQ7CisJdTE2IAkJc2VjdG9yX2NvdW50OworCXUzMiAJCWJsb2NrOworCXUxNgkJcGFkOworCXUxNgkJZmxhZ3M7CisJc3RydWN0IHNnbWFwNjQJc2c7CS8vIE11c3QgYmUgbGFzdCBpbiBzdHJ1Y3QgYmVjYXVzZSBpdCBpcyB2YXJpYWJsZQorfTsKK3N0cnVjdCBhYWNfd3JpdGVfcmVwbHkKK3sKKwl1MzIJCXN0YXR1czsKKwl1MzIgCQljb3VudDsKKwl1MzIJCWNvbW1pdHRlZDsKK307CisKKyNkZWZpbmUgQ1RfRkxVU0hfQ0FDSEUgMTI5CitzdHJ1Y3QgYWFjX3N5bmNocm9uaXplIHsKKwl1MzIJCWNvbW1hbmQ7CS8qIFZNX0NvbnRhaW5lckNvbmZpZyAqLworCXUzMgkJdHlwZTsJCS8qIENUX0ZMVVNIX0NBQ0hFICovCisJdTMyCQljaWQ7CisJdTMyCQlwYXJtMTsKKwl1MzIJCXBhcm0yOworCXUzMgkJcGFybTM7CisJdTMyCQlwYXJtNDsKKwl1MzIJCWNvdW50OwkvKiBzaXplb2YoKChzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5ICopTlVMTCktPmRhdGEpICovCit9OworCitzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5IHsKKwl1MzIJCWR1bW15MDsKKwl1MzIJCWR1bW15MTsKKwl1MzIJCXN0YXR1czsJLyogQ1RfT0sgKi8KKwl1MzIJCXBhcm0xOworCXUzMgkJcGFybTI7CisJdTMyCQlwYXJtMzsKKwl1MzIJCXBhcm00OworCXUzMgkJcGFybTU7CisJdTgJCWRhdGFbMTZdOworfTsKKworc3RydWN0IGFhY19zcmIKK3sKKwl1MzIJCWZ1bmN0aW9uOworCXUzMgkJY2hhbm5lbDsKKwl1MzIJCWlkOworCXUzMgkJbHVuOworCXUzMgkJdGltZW91dDsKKwl1MzIJCWZsYWdzOworCXUzMgkJY291bnQ7CQkvLyBEYXRhIHhmZXIgc2l6ZQorCXUzMgkJcmV0cnlfbGltaXQ7CisJdTMyCQljZGJfc2l6ZTsKKwl1OAkJY2RiWzE2XTsKKwlzdHJ1Y3QJc2dtYXAJc2c7Cit9OworCisKKworI2RlZmluZQkJQUFDX1NFTlNFX0JVRkZFUlNJWkUJIDMwCisKK3N0cnVjdCBhYWNfc3JiX3JlcGx5Cit7CisJdTMyCQlzdGF0dXM7CisJdTMyCQlzcmJfc3RhdHVzOworCXUzMgkJc2NzaV9zdGF0dXM7CisJdTMyCQlkYXRhX3hmZXJfbGVuZ3RoOworCXUzMgkJc2Vuc2VfZGF0YV9zaXplOworCXU4CQlzZW5zZV9kYXRhW0FBQ19TRU5TRV9CVUZGRVJTSVpFXTsgLy8gQ2FuIHRoaXMgYmUgU0NTSV9TRU5TRV9CVUZGRVJTSVpFCit9OworLyoKKyAqIFNSQiBGbGFncworICovCisjZGVmaW5lCQlTUkJfTm9EYXRhWGZlcgkJIDB4MDAwMAorI2RlZmluZQkJU1JCX0Rpc2FibGVEaXNjb25uZWN0CSAweDAwMDQKKyNkZWZpbmUJCVNSQl9EaXNhYmxlU3luY2hUcmFuc2ZlciAweDAwMDgKKyNkZWZpbmUgCVNSQl9CeXBhc3NGcm96ZW5RdWV1ZQkgMHgwMDEwCisjZGVmaW5lCQlTUkJfRGlzYWJsZUF1dG9zZW5zZQkgMHgwMDIwCisjZGVmaW5lCQlTUkJfRGF0YUluCQkgMHgwMDQwCisjZGVmaW5lIAlTUkJfRGF0YU91dAkJIDB4MDA4MAorCisvKgorICogU1JCIEZ1bmN0aW9ucyAtIHNldCBpbiBhYWNfc3JiLT5mdW5jdGlvbgorICovCisjZGVmaW5lCVNSQkZfRXhlY3V0ZVNjc2kJMHgwMDAwCisjZGVmaW5lCVNSQkZfQ2xhaW1EZXZpY2UJMHgwMDAxCisjZGVmaW5lCVNSQkZfSU9fQ29udHJvbAkJMHgwMDAyCisjZGVmaW5lCVNSQkZfUmVjZWl2ZUV2ZW50CTB4MDAwMworI2RlZmluZQlTUkJGX1JlbGVhc2VRdWV1ZQkweDAwMDQKKyNkZWZpbmUJU1JCRl9BdHRhY2hEZXZpY2UJMHgwMDA1CisjZGVmaW5lCVNSQkZfUmVsZWFzZURldmljZQkweDAwMDYKKyNkZWZpbmUJU1JCRl9TaHV0ZG93bgkJMHgwMDA3CisjZGVmaW5lCVNSQkZfRmx1c2gJCTB4MDAwOAorI2RlZmluZQlTUkJGX0Fib3J0Q29tbWFuZAkweDAwMTAKKyNkZWZpbmUJU1JCRl9SZWxlYXNlUmVjb3ZlcnkJMHgwMDExCisjZGVmaW5lCVNSQkZfUmVzZXRCdXMJCTB4MDAxMgorI2RlZmluZQlTUkJGX1Jlc2V0RGV2aWNlCTB4MDAxMworI2RlZmluZQlTUkJGX1Rlcm1pbmF0ZUlPCTB4MDAxNAorI2RlZmluZQlTUkJGX0ZsdXNoUXVldWUJCTB4MDAxNQorI2RlZmluZQlTUkJGX1JlbW92ZURldmljZQkweDAwMTYKKyNkZWZpbmUJU1JCRl9Eb21haW5WYWxpZGF0aW9uCTB4MDAxNworCisvKiAKKyAqIFNSQiBTQ1NJIFN0YXR1cyAtIHNldCBpbiBhYWNfc3JiLT5zY3NpX3N0YXR1cworICovCisjZGVmaW5lIFNSQl9TVEFUVVNfUEVORElORyAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU1JCX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTUkJfU1RBVFVTX0FCT1JURUQgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNSQl9TVEFUVVNfQUJPUlRfRkFJTEVEICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU1JCX1NUQVRVU19FUlJPUiAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTUkJfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFNSQl9TVEFUVVNfSU5WQUxJRF9SRVFVRVNUICAgICAgICAgIDB4MDYKKyNkZWZpbmUgU1JCX1NUQVRVU19JTlZBTElEX1BBVEhfSUQgICAgICAgICAgMHgwNworI2RlZmluZSBTUkJfU1RBVFVTX05PX0RFVklDRSAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFNSQl9TVEFUVVNfVElNRU9VVCAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgU1JCX1NUQVRVU19TRUxFQ1RJT05fVElNRU9VVCAgICAgICAgMHgwQQorI2RlZmluZSBTUkJfU1RBVFVTX0NPTU1BTkRfVElNRU9VVCAgICAgICAgICAweDBCCisjZGVmaW5lIFNSQl9TVEFUVVNfTUVTU0FHRV9SRUpFQ1RFRCAgICAgICAgIDB4MEQKKyNkZWZpbmUgU1JCX1NUQVRVU19CVVNfUkVTRVQgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBTUkJfU1RBVFVTX1BBUklUWV9FUlJPUiAgICAgICAgICAgICAweDBGCisjZGVmaW5lIFNSQl9TVEFUVVNfUkVRVUVTVF9TRU5TRV9GQUlMRUQgICAgIDB4MTAKKyNkZWZpbmUgU1JCX1NUQVRVU19OT19IQkEgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBTUkJfU1RBVFVTX0RBVEFfT1ZFUlJVTiAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFNSQl9TVEFUVVNfVU5FWFBFQ1RFRF9CVVNfRlJFRSAgICAgIDB4MTMKKyNkZWZpbmUgU1JCX1NUQVRVU19QSEFTRV9TRVFVRU5DRV9GQUlMVVJFICAgMHgxNAorI2RlZmluZSBTUkJfU1RBVFVTX0JBRF9TUkJfQkxPQ0tfTEVOR1RIICAgICAweDE1CisjZGVmaW5lIFNSQl9TVEFUVVNfUkVRVUVTVF9GTFVTSEVEICAgICAgICAgIDB4MTYKKyNkZWZpbmUgU1JCX1NUQVRVU19ERUxBWUVEX1JFVFJZCSAgICAweDE3CisjZGVmaW5lIFNSQl9TVEFUVVNfSU5WQUxJRF9MVU4gICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU1JCX1NUQVRVU19JTlZBTElEX1RBUkdFVF9JRCAgICAgICAgMHgyMQorI2RlZmluZSBTUkJfU1RBVFVTX0JBRF9GVU5DVElPTiAgICAgICAgICAgICAweDIyCisjZGVmaW5lIFNSQl9TVEFUVVNfRVJST1JfUkVDT1ZFUlkgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgU1JCX1NUQVRVU19OT1RfU1RBUlRFRAkJICAgIDB4MjQKKyNkZWZpbmUgU1JCX1NUQVRVU19OT1RfSU5fVVNFCQkgICAgMHgzMAorI2RlZmluZSBTUkJfU1RBVFVTX0ZPUkNFX0FCT1JUCQkgICAgMHgzMQorI2RlZmluZSBTUkJfU1RBVFVTX0RPTUFJTl9WQUxJREFUSU9OX0ZBSUwgICAweDMyCisKKy8qCisgKiBPYmplY3QtU2VydmVyIC8gVm9sdW1lLU1hbmFnZXIgRGlzcGF0Y2ggQ2xhc3NlcworICovCisKKyNkZWZpbmUJCVZNX051bGwJCQkwCisjZGVmaW5lCQlWTV9OYW1lU2VydmUJCTEKKyNkZWZpbmUJCVZNX0NvbnRhaW5lckNvbmZpZwkyCisjZGVmaW5lCQlWTV9Jb2N0bAkJMworI2RlZmluZQkJVk1fRmlsZXN5c3RlbUlvY3RsCTQKKyNkZWZpbmUJCVZNX0Nsb3NlQWxsCQk1CisjZGVmaW5lCQlWTV9DdEJsb2NrUmVhZAkJNgorI2RlZmluZQkJVk1fQ3RCbG9ja1dyaXRlCQk3CisjZGVmaW5lCQlWTV9TbGljZUJsb2NrUmVhZAk4CS8qIHJhdyBhY2Nlc3MgdG8gY29uZmlndXJlZCAic3RvcmFnZSBvYmplY3RzIiAqLworI2RlZmluZQkJVk1fU2xpY2VCbG9ja1dyaXRlCTkKKyNkZWZpbmUJCVZNX0RyaXZlQmxvY2tSZWFkCTEwCS8qIHJhdyBhY2Nlc3MgdG8gcGh5c2ljYWwgZGV2aWNlcyAqLworI2RlZmluZQkJVk1fRHJpdmVCbG9ja1dyaXRlCTExCisjZGVmaW5lCQlWTV9FbmNsb3N1cmVNZ3QJCTEyCS8qIGVuY2xvc3VyZSBtYW5hZ2VtZW50ICovCisjZGVmaW5lCQlWTV9VbnVzZWQJCTEzCS8qIHVzZWQgdG8gYmUgZGlza3NldCBtYW5hZ2VtZW50ICovCisjZGVmaW5lCQlWTV9DdEJsb2NrVmVyaWZ5CTE0CisjZGVmaW5lCQlWTV9DdFBlcmYJCTE1CS8qIHBlcmZvcm1hbmNlIHRlc3QgKi8KKyNkZWZpbmUJCVZNX0N0QmxvY2tSZWFkNjQJMTYKKyNkZWZpbmUJCVZNX0N0QmxvY2tXcml0ZTY0CTE3CisjZGVmaW5lCQlWTV9DdEJsb2NrVmVyaWZ5NjQJMTgKKyNkZWZpbmUJCVZNX0N0SG9zdFJlYWQ2NAkJMTkKKyNkZWZpbmUJCVZNX0N0SG9zdFdyaXRlNjQJMjAKKworI2RlZmluZQkJTUFYX1ZNQ09NTUFORF9OVU0JMjEJLyogdXNlZCBmb3Igc2l6aW5nIHN0YXRzIGFycmF5IC0gbGVhdmUgbGFzdCAqLworCisvKgorICoJRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKGVnLCB2aXRhbCBzdGF0cykKKyAqCXRoYXQgYSBjb250ZW50IG1hbmFnZXIgbWlnaHQgcmVwb3J0LiAgVGhlCisgKglGaWxlQXJyYXkgZmlsZXN5c3RlbSBjb21wb25lbnQgaXMgb25lIGV4YW1wbGUKKyAqCW9mIGEgY29udGVudCBtYW5hZ2VyLiAgUmF3IG1vZGUgbWlnaHQgYmUKKyAqCWFub3RoZXIuCisgKi8KKworc3RydWN0IGFhY19mc2luZm8geworCXUzMiAgZnNUb3RhbFNpemU7CS8qIENvbnN1bWVkIGJ5IGZzLCBpbmNsLiBtZXRhZGF0YSAqLworCXUzMiAgZnNCbG9ja1NpemU7CisJdTMyICBmc0ZyYWdTaXplOworCXUzMiAgZnNNYXhFeHRlbmRTaXplOworCXUzMiAgZnNTcGFjZVVuaXRzOworCXUzMiAgZnNNYXhOdW1GaWxlczsKKwl1MzIgIGZzTnVtRnJlZUZpbGVzOworCXUzMiAgZnNJbm9kZURlbnNpdHk7Cit9OwkvKiB2YWxpZCBpZmYgT2JqVHlwZSA9PSBGVF9GSUxFU1lTICYmICEoQ29udGVudFN0YXRlICYgRlNDU19OT1RDTEVBTikgKi8KKwordW5pb24gYWFjX2NvbnRlbnRpbmZvIHsKKwlzdHJ1Y3QgYWFjX2ZzaW5mbyBmaWxlc3lzOwkvKiB2YWxpZCBpZmYgT2JqVHlwZSA9PSBGVF9GSUxFU1lTICYmICEoQ29udGVudFN0YXRlICYgRlNDU19OT1RDTEVBTikgKi8KK307CisKKy8qCisgKglRdWVyeSBmb3IgQ29udGFpbmVyIENvbmZpZ3VyYXRpb24gU3RhdHVzCisgKi8KKworI2RlZmluZSBDVF9HRVRfQ09ORklHX1NUQVRVUyAxNDcKK3N0cnVjdCBhYWNfZ2V0X2NvbmZpZ19zdGF0dXMgeworCXUzMgkJY29tbWFuZDsJLyogVk1fQ29udGFpbmVyQ29uZmlnICovCisJdTMyCQl0eXBlOwkJLyogQ1RfR0VUX0NPTkZJR19TVEFUVVMgKi8KKwl1MzIJCXBhcm0xOworCXUzMgkJcGFybTI7CisJdTMyCQlwYXJtMzsKKwl1MzIJCXBhcm00OworCXUzMgkJcGFybTU7CisJdTMyCQljb3VudDsJLyogc2l6ZW9mKCgoc3RydWN0IGFhY19nZXRfY29uZmlnX3N0YXR1c19yZXNwICopTlVMTCktPmRhdGEpICovCit9OworCisjZGVmaW5lIENGQUNUX0NPTlRJTlVFIDAKKyNkZWZpbmUgQ0ZBQ1RfUEFVU0UgICAgMQorI2RlZmluZSBDRkFDVF9BQk9SVCAgICAyCitzdHJ1Y3QgYWFjX2dldF9jb25maWdfc3RhdHVzX3Jlc3AgeworCXUzMgkJcmVzcG9uc2U7IC8qIFNUX09LICovCisJdTMyCQlkdW1teTA7CisJdTMyCQlzdGF0dXM7CS8qIENUX09LICovCisJdTMyCQlwYXJtMTsKKwl1MzIJCXBhcm0yOworCXUzMgkJcGFybTM7CisJdTMyCQlwYXJtNDsKKwl1MzIJCXBhcm01OworCXN0cnVjdCB7CisJCXUzMglhY3Rpb247IC8qIENGQUNUX0NPTlRJTlVFLCBDRkFDVF9QQVVTRSBvciBDRkFDVF9BQk9SVCAqLworCQl1MTYJZmxhZ3M7CisJCXMxNgljb3VudDsKKwl9CQlkYXRhOworfTsKKworLyoKKyAqCUFjY2VwdCB0aGUgY29uZmlndXJhdGlvbiBhcy1pcworICovCisKKyNkZWZpbmUgQ1RfQ09NTUlUX0NPTkZJRyAxNTIKKworc3RydWN0IGFhY19jb21taXRfY29uZmlnIHsKKwl1MzIJCWNvbW1hbmQ7CS8qIFZNX0NvbnRhaW5lckNvbmZpZyAqLworCXUzMgkJdHlwZTsJCS8qIENUX0NPTU1JVF9DT05GSUcgKi8KK307CisKKy8qCisgKglRdWVyeSBmb3IgQ29udGFpbmVyIENvbmZpZ3VyYXRpb24gQ291bnQKKyAqLworCisjZGVmaW5lIENUX0dFVF9DT05UQUlORVJfQ09VTlQgNAorc3RydWN0IGFhY19nZXRfY29udGFpbmVyX2NvdW50IHsKKwl1MzIJCWNvbW1hbmQ7CS8qIFZNX0NvbnRhaW5lckNvbmZpZyAqLworCXUzMgkJdHlwZTsJCS8qIENUX0dFVF9DT05UQUlORVJfQ09VTlQgKi8KK307CisKK3N0cnVjdCBhYWNfZ2V0X2NvbnRhaW5lcl9jb3VudF9yZXNwIHsKKwl1MzIJCXJlc3BvbnNlOyAvKiBTVF9PSyAqLworCXUzMgkJZHVtbXkwOworCXUzMgkJTWF4Q29udGFpbmVyczsKKwl1MzIJCUNvbnRhaW5lclN3aXRjaEVudHJpZXM7CisJdTMyCQlNYXhQYXJ0aXRpb25zOworfTsKKworCisvKgorICoJUXVlcnkgZm9yICJtb3VudGFibGUiIG9iamVjdHMsIGllLCBvYmplY3RzIHRoYXQgYXJlIHR5cGljYWxseQorICoJYXNzb2NpYXRlZCB3aXRoIGEgZHJpdmUgbGV0dGVyIG9uIHRoZSBjbGllbnQgKGhvc3QpIHNpZGUuCisgKi8KKworc3RydWN0IGFhY19tbnRlbnQgeworCXUzMiAgICAJCQlvaWQ7CisJdTgJCQluYW1lWzE2XTsJLy8gaWYgYXBwbGljYWJsZQorCXN0cnVjdCBjcmVhdGlvbl9pbmZvCWNyZWF0ZV9pbmZvOwkvLyBpZiBhcHBsaWNhYmxlCisJdTMyCQkJY2FwYWNpdHk7CisJdTMyCQkJdm9sOyAgICAJLy8gc3Vic3RyYXRlIHN0cnVjdHVyZQorCXUzMgkJCW9iajsJICAgICAgICAvLyBGVF9GSUxFU1lTLCBGVF9EQVRBQkFTRSwgZXRjLgorCXUzMgkJCXN0YXRlOwkJLy8gdW5yZWFkeSBmb3IgbW91bnRpbmcsIHJlYWRvbmx5LCBldGMuCisJdW5pb24gYWFjX2NvbnRlbnRpbmZvCWZpbGVpbmZvOwkvLyBJbmZvIHNwZWNpZmljIHRvIGNvbnRlbnQgbWFuYWdlciAoZWcsIGZpbGVzeXN0ZW0pCisJdTMyCQkJYWx0b2lkOwkJLy8gIT0gb2lkIDw9PT4gc25hcHNob3Qgb3IgYnJva2VuIG1pcnJvciBleGlzdHMKK307CisKKyNkZWZpbmUgRlNDU19OT1RDTEVBTgkweDAwMDEgIC8qIGZzY2sgaXMgbmVjY2Vzc2FyeSBiZWZvcmUgbW91bnRpbmcgKi8KKyNkZWZpbmUgRlNDU19SRUFET05MWQkweDAwMDIJLyogcG9zc2libGUgcmVzdWx0IG9mIGJyb2tlbiBtaXJyb3IgKi8KKyNkZWZpbmUgRlNDU19ISURERU4JMHgwMDA0CS8qIHNob3VsZCBiZSBpZ25vcmVkIC0gc2V0IGR1cmluZyBhIGNsZWFyICovCisKK3N0cnVjdCBhYWNfcXVlcnlfbW91bnQgeworCXUzMgkJY29tbWFuZDsKKwl1MzIJCXR5cGU7CisJdTMyCQljb3VudDsKK307CisKK3N0cnVjdCBhYWNfbW91bnQgeworCXUzMgkJc3RhdHVzOworCXUzMgkgICAJdHlwZTsgICAgICAgICAgIC8qIHNob3VsZCBiZSBzYW1lIGFzIHRoYXQgcmVxdWVzdGVkICovCisJdTMyCQljb3VudDsKKwlzdHJ1Y3QgYWFjX21udGVudCBtbnRbMV07Cit9OworCisjZGVmaW5lIENUX1JFQURfTkFNRSAxMzAKK3N0cnVjdCBhYWNfZ2V0X25hbWUgeworCXUzMgkJY29tbWFuZDsJLyogVk1fQ29udGFpbmVyQ29uZmlnICovCisJdTMyCQl0eXBlOwkJLyogQ1RfUkVBRF9OQU1FICovCisJdTMyCQljaWQ7CisJdTMyCQlwYXJtMTsKKwl1MzIJCXBhcm0yOworCXUzMgkJcGFybTM7CisJdTMyCQlwYXJtNDsKKwl1MzIJCWNvdW50OwkvKiBzaXplb2YoKChzdHJ1Y3QgYWFjX2dldF9uYW1lX3Jlc3AgKilOVUxMKS0+ZGF0YSkgKi8KK307CisKKyNkZWZpbmUgQ1RfT0sgICAgICAgIDIxOAorc3RydWN0IGFhY19nZXRfbmFtZV9yZXNwIHsKKwl1MzIJCWR1bW15MDsKKwl1MzIJCWR1bW15MTsKKwl1MzIJCXN0YXR1czsJLyogQ1RfT0sgKi8KKwl1MzIJCXBhcm0xOworCXUzMgkJcGFybTI7CisJdTMyCQlwYXJtMzsKKwl1MzIJCXBhcm00OworCXUzMgkJcGFybTU7CisJdTgJCWRhdGFbMTZdOworfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBpcyBzZW50IHRvIHNodXQgZG93biBlYWNoIGNvbnRhaW5lci4KKyAqLworCitzdHJ1Y3QgYWFjX2Nsb3NlIHsKKwl1MzIJY29tbWFuZDsKKwl1MzIJY2lkOworfTsKKworc3RydWN0IGFhY19xdWVyeV9kaXNrCit7CisJczMyCWNudW07CisJczMyCWJ1czsKKwlzMzIJaWQ7CisJczMyCWx1bjsKKwl1MzIJdmFsaWQ7CisJdTMyCWxvY2tlZDsKKwl1MzIJZGVsZXRlZDsKKwlzMzIJaW5zdGFuY2U7CisJczgJbmFtZVsxMF07CisJdTMyCXVubWFwcGVkOworfTsKKworc3RydWN0IGFhY19kZWxldGVfZGlzayB7CisJdTMyCWRpc2tudW07CisJdTMyCWNudW07Cit9OworIAorc3RydWN0IGZpYl9pb2N0bAoreworCXUzMglmaWJjdHg7CisJczMyCXdhaXQ7CisJY2hhcglfX3VzZXIgKmZpYjsKK307CisKK3N0cnVjdCByZXZpc2lvbgoreworCXUzMiBjb21wYXQ7CisJdTMyIHZlcnNpb247CisJdTMyIGJ1aWxkOworfTsKKwkKKy8qCisgKiAJVWdseSAtIG5vbiBMaW51eCBsaWtlIGlvY3RsIGNvZGluZyBmb3IgYmFjayBjb21wYXQuCisgKi8KKworI2RlZmluZSBDVExfQ09ERShmdW5jdGlvbiwgbWV0aG9kKSAoICAgICAgICAgICAgICAgICBcCisgICAgKDQ8PCAxNikgfCAoKGZ1bmN0aW9uKSA8PCAyKSB8IChtZXRob2QpIFwKKykKKworLyoKKyAqCURlZmluZSB0aGUgbWV0aG9kIGNvZGVzIGZvciBob3cgYnVmZmVycyBhcmUgcGFzc2VkIGZvciBJL08gYW5kIEZTIAorICoJY29udHJvbHMKKyAqLworCisjZGVmaW5lIE1FVEhPRF9CVUZGRVJFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNRVRIT0RfTkVJVEhFUiAgICAgICAgICAgICAgICAgIDMKKworLyoKKyAqCUZpbGVzeXN0ZW0gaW9jdGxzCisgKi8KKworI2RlZmluZSBGU0FDVExfU0VOREZJQiAgICAgICAgICAgICAgICAgIAlDVExfQ09ERSgyMDUwLCBNRVRIT0RfQlVGRkVSRUQpCisjZGVmaW5lIEZTQUNUTF9TRU5EX1JBV19TUkIgICAgICAgICAgICAgICAJQ1RMX0NPREUoMjA2NywgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfREVMRVRFX0RJU0sJCQkweDE2MworI2RlZmluZSBGU0FDVExfUVVFUllfRElTSwkJCTB4MTczCisjZGVmaW5lIEZTQUNUTF9PUEVOX0dFVF9BREFQVEVSX0ZJQgkJQ1RMX0NPREUoMjEwMCwgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfR0VUX05FWFRfQURBUFRFUl9GSUIJCUNUTF9DT0RFKDIxMDEsIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgRlNBQ1RMX0NMT1NFX0dFVF9BREFQVEVSX0ZJQgkJQ1RMX0NPREUoMjEwMiwgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfTUlOSVBPUlRfUkVWX0NIRUNLICAgICAgICAgICAgICAgQ1RMX0NPREUoMjEwNywgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBGU0FDVExfR0VUX1BDSV9JTkZPICAgICAgICAgICAgICAgCUNUTF9DT0RFKDIxMTksIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgRlNBQ1RMX0ZPUkNFX0RFTEVURV9ESVNLCQlDVExfQ09ERSgyMTIwLCBNRVRIT0RfTkVJVEhFUikKKyNkZWZpbmUgRlNBQ1RMX0dFVF9DT05UQUlORVJTCQkJMjEzMQorCisKK3N0cnVjdCBhYWNfY29tbW9uCit7CisJLyoKKwkgKglJZiB0aGlzIHZhbHVlIGlzIHNldCB0byAxIHRoZW4gaW50ZXJydXB0IG1vZGVyYXRpb24gd2lsbCBvY2N1ciAKKwkgKglpbiB0aGUgYmFzZSBjb21tdWljYXRpb24gc3VwcG9ydC4KKwkgKi8KKwl1MzIgaXJxX21vZDsKKwl1MzIgcGVha19maWJzOworCXUzMiB6ZXJvX2ZpYnM7CisJdTMyIGZpYl90aW1lb3V0czsKKwkvKgorCSAqCVN0YXRpc3RpY2FsIGNvdW50ZXJzIGluIGRlYnVnIG1vZGUKKwkgKi8KKyNpZmRlZiBEQkcKKwl1MzIgRmlic1NlbnQ7CisJdTMyIEZpYlJlY3ZlZDsKKwl1MzIgTm9SZXNwb25zZVNlbnQ7CisJdTMyIE5vUmVzcG9uc2VSZWN2ZWQ7CisJdTMyIEFzeW5jU2VudDsKKwl1MzIgQXN5bmNSZWN2ZWQ7CisJdTMyIE5vcm1hbFNlbnQ7CisJdTMyIE5vcm1hbFJlY3ZlZDsKKyNlbmRpZgorfTsKKworZXh0ZXJuIHN0cnVjdCBhYWNfY29tbW9uIGFhY19jb25maWc7CisKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCB3aGVuIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBGSUJzLiBJdCBpcworICoJb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgKi8KKyAKKyNpZmRlZiBEQkcKKyNkZWZpbmUJRklCX0NPVU5URVJfSU5DUkVNRU5UKGNvdW50ZXIpCQkoY291bnRlcikrKworI2Vsc2UKKyNkZWZpbmUJRklCX0NPVU5URVJfSU5DUkVNRU5UKGNvdW50ZXIpCQkKKyNlbmRpZgorCisvKgorICoJQWRhcHRlciBkaXJlY3QgY29tbWFuZHMKKyAqCU1vbml0b3IvS2VybmVsIEFQSQorICovCisKKyNkZWZpbmUJQlJFQUtQT0lOVF9SRVFVRVNUCQkweDAwMDAwMDA0CisjZGVmaW5lCUlOSVRfU1RSVUNUX0JBU0VfQUREUkVTUwkweDAwMDAwMDA1CisjZGVmaW5lIFJFQURfUEVSTUFORU5UX1BBUkFNRVRFUlMJMHgwMDAwMDAwYQorI2RlZmluZSBXUklURV9QRVJNQU5FTlRfUEFSQU1FVEVSUwkweDAwMDAwMDBiCisjZGVmaW5lIEhPU1RfQ1JBU0hJTkcJCQkweDAwMDAwMDBkCisjZGVmaW5lCVNFTkRfU1lOQ0hST05PVVNfRklCCQkweDAwMDAwMDBjCisjZGVmaW5lIENPTU1BTkRfUE9TVF9SRVNVTFRTCQkweDAwMDAwMDE0CisjZGVmaW5lIEdFVF9BREFQVEVSX1BST1BFUlRJRVMJCTB4MDAwMDAwMTkKKyNkZWZpbmUgR0VUX0RSSVZFUl9CVUZGRVJfUFJPUEVSVElFUwkweDAwMDAwMDIzCisjZGVmaW5lIFJDVl9URU1QX1JFQURJTkdTCQkweDAwMDAwMDI1CisjZGVmaW5lIEdFVF9DT01NX1BSRUZFUlJFRF9TRVRUSU5HUwkweDAwMDAwMDI2CisjZGVmaW5lIElPUF9SRVNFVAkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkVfSU5JVF9BREFQVEVSCQkJMHgwMDAwMDBlZQorCisvKgorICoJQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIKKyAqCisgKiAgUGhhc2UgU3RhdXMgbWFpbGJveCBpcyAzMmJpdHM6CisgKgk8MzE6MTY+ID0gUGhhc2UgU3RhdHVzCisgKgk8MTU6MD4gID0gUGhhc2UKKyAqCisgKglUaGUgYWRhcHRlciByZXBvcnRzIGlzIHByZXNlbnQgc3RhdGUgdGhyb3VnaCB0aGUgcGhhc2UuICBPbmx5CisgKglhIHNpbmdsZSBwaGFzZSBzaG91bGQgYmUgZXZlciBiZSBzZXQuICBFYWNoIHBoYXNlIGNhbiBoYXZlIG11bHRpcGxlCisgKglwaGFzZSBzdGF0dXMgYml0cyB0byBwcm92aWRlIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIAorICoJc3RhdGUgb2YgdGhlIGJvYXJkLiAgQ2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgYW55IHBoYXNlIAorICoJc3RhdHVzIGJpdHMgdGhhdCBhcmUgc2V0IHdoZW4gY2hhbmdpbmcgdGhlIHBoYXNlIGFyZSBhbHNvIHZhbGlkCisgKglmb3IgdGhlIG5ldyBwaGFzZSBvciBiZSBjbGVhcmVkIG91dC4gIEFkYXB0ZXIgc29mdHdhcmUgKG1vbml0b3IsCisgKglpZmxhc2gsIGtlcm5lbCkgaXMgcmVzcG9uc2libGUgZm9yIHByb3Blcmx5IG1haW50aW5pbmcgdGhlIHBoYXNlIAorICoJc3RhdHVzIG1haWxib3ggd2hlbiBpdCBpcyBydW5uaW5nLgorICoJCQkJCQkJCQkJCQorICoJTU9OS0VSX0FQSSBQaGFzZXMJCQkJCQkJCisgKgorICoJUGhhc2VzIGFyZSBiaXQgb3JpZW50ZWQuICBJdCBpcyBOT1QgdmFsaWQgIHRvIGhhdmUgbXVsdGlwbGUgYml0cyBzZXQJCQkJCQkKKyAqLwkJCQkJCisKKyNkZWZpbmUJU0VMRl9URVNUX0ZBSUxFRAkJMHgwMDAwMDAwNAorI2RlZmluZQlNT05JVE9SX1BBTklDCQkJMHgwMDAwMDAyMAorI2RlZmluZQlLRVJORUxfVVBfQU5EX1JVTk5JTkcJCTB4MDAwMDAwODAKKyNkZWZpbmUJS0VSTkVMX1BBTklDCQkJMHgwMDAwMDEwMAorCisvKgorICoJRG9vcmJlbGwgYml0IGRlZmluZXMKKyAqLworCisjZGVmaW5lIERvb3JCZWxsU3luY0NtZEF2YWlsYWJsZQkoMTw8MCkJLyogSG9zdCAtPiBBZGFwdGVyICovCisjZGVmaW5lIERvb3JCZWxsUHJpbnRmRG9uZQkJKDE8PDUpCS8qIEhvc3QgLT4gQWRhcHRlciAqLworI2RlZmluZSBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kUmVhZHkJKDE8PDEpCS8qIEFkYXB0ZXIgLT4gSG9zdCAqLworI2RlZmluZSBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5CSgxPDwyKQkvKiBBZGFwdGVyIC0+IEhvc3QgKi8KKyNkZWZpbmUgRG9vckJlbGxBZGFwdGVyTm9ybUNtZE5vdEZ1bGwJKDE8PDMpCS8qIEFkYXB0ZXIgLT4gSG9zdCAqLworI2RlZmluZSBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcE5vdEZ1bGwJKDE8PDQpCS8qIEFkYXB0ZXIgLT4gSG9zdCAqLworI2RlZmluZSBEb29yQmVsbFByaW50ZlJlYWR5CQkoMTw8NSkJLyogQWRhcHRlciAtPiBIb3N0ICovCisKKy8qCisgKglGb3IgRklCIGNvbW11bmljYXRpb24sIHdlIG5lZWQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgdGhpbmdzCisgKgl0byBzZW5kIGJhY2sgdG8gdGhlIHVzZXIuCisgKi8KKyAKKyNkZWZpbmUgCUFpZkNtZEV2ZW50Tm90aWZ5CTEJLyogTm90aWZ5IG9mIGV2ZW50ICovCisjZGVmaW5lCQkJQWlmRW5Db25maWdDaGFuZ2UJMwkvKiBBZGFwdGVyIGNvbmZpZ3VyYXRpb24gY2hhbmdlICovCisjZGVmaW5lCQkJQWlmRW5Db250YWluZXJDaGFuZ2UJNAkvKiBDb250YWluZXIgY29uZmlndXJhdGlvbiBjaGFuZ2UgKi8KKyNkZWZpbmUJCQlBaWZFbkRldmljZUZhaWx1cmUJNQkvKiBTQ1NJIGRldmljZSBmYWlsZWQgKi8KKyNkZWZpbmUJCQlBaWZFbkFkZENvbnRhaW5lcgkxNQkvKiBBIG5ldyBhcnJheSB3YXMgY3JlYXRlZCAqLworI2RlZmluZQkJCUFpZkVuRGVsZXRlQ29udGFpbmVyCTE2CS8qIEEgY29udGFpbmVyIHdhcyBkZWxldGVkICovCisjZGVmaW5lCQkJQWlmRW5FeHBFdmVudAkJMjMJLyogRmlybXdhcmUgRXZlbnQgTG9nICovCisjZGVmaW5lCQkJQWlmRXhlRmlybXdhcmVQYW5pYwkzCS8qIEZpcm13YXJlIEV2ZW50IFBhbmljICovCisjZGVmaW5lCQkJQWlmSGlnaFByaW9yaXR5CQkzCS8qIEhpZ2hlc3QgUHJpb3JpdHkgRXZlbnQgKi8KKworI2RlZmluZQkJQWlmQ21kSm9iUHJvZ3Jlc3MJMgkvKiBQcm9ncmVzcyByZXBvcnQgKi8KKyNkZWZpbmUJCQlBaWZKb2JDdHJaZXJvCTEwMQkvKiBBcnJheSBaZXJvIHByb2dyZXNzICovCisjZGVmaW5lCQkJQWlmSm9iU3RzU3VjY2VzcyAxCS8qIEpvYiBjb21wbGV0ZXMgKi8KKyNkZWZpbmUJCUFpZkNtZEFQSVJlcG9ydAkJMwkvKiBSZXBvcnQgZnJvbSBvdGhlciB1c2VyIG9mIEFQSSAqLworI2RlZmluZQkJQWlmQ21kRHJpdmVyTm90aWZ5CTQJLyogTm90aWZ5IGhvc3QgZHJpdmVyIG9mIGV2ZW50ICovCisjZGVmaW5lCQkJQWlmRGVuTW9ycGhDb21wbGV0ZSAyMDAJLyogQSBtb3JwaCBvcGVyYXRpb24gY29tcGxldGVkICovCisjZGVmaW5lCQkJQWlmRGVuVm9sdW1lRXh0ZW5kQ29tcGxldGUgMjAxIC8qIEEgdm9sdW1lIGV4dGVuZCBjb21wbGV0ZWQgKi8KKyNkZWZpbmUJCUFpZlJlcUpvYkxpc3QJCTEwMAkvKiBHZXRzIGJhY2sgY29tcGxldGUgam9iIGxpc3QgKi8KKyNkZWZpbmUJCUFpZlJlcUpvYnNGb3JDdHIJMTAxCS8qIEdldHMgYmFjayBqb2JzIGZvciBzcGVjaWZpYyBjb250YWluZXIgKi8KKyNkZWZpbmUJCUFpZlJlcUpvYnNGb3JTY3NpCTEwMgkvKiBHZXRzIGJhY2sgam9icyBmb3Igc3BlY2lmaWMgU0NTSSBkZXZpY2UgKi8gCisjZGVmaW5lCQlBaWZSZXFKb2JSZXBvcnQJCTEwMwkvKiBHZXRzIGJhY2sgYSBzcGVjaWZpYyBqb2IgcmVwb3J0IG9yIGxpc3Qgb2YgdGhlbSAqLyAKKyNkZWZpbmUJCUFpZlJlcVRlcm1pbmF0ZUpvYgkxMDQJLyogVGVybWluYXRlcyBqb2IgKi8KKyNkZWZpbmUJCUFpZlJlcVN1c3BlbmRKb2IJMTA1CS8qIFN1c3BlbmRzIGEgam9iICovCisjZGVmaW5lCQlBaWZSZXFSZXN1bWVKb2IJCTEwNgkvKiBSZXN1bWVzIGEgam9iICovIAorI2RlZmluZQkJQWlmUmVxU2VuZEFQSVJlcG9ydAkxMDcJLyogQVBJIGdlbmVyaWMgcmVwb3J0IHJlcXVlc3RzICovCisjZGVmaW5lCQlBaWZSZXFBUElKb2JTdGFydAkxMDgJLyogU3RhcnQgYSBqb2IgZnJvbSB0aGUgQVBJICovCisjZGVmaW5lCQlBaWZSZXFBUElKb2JVcGRhdGUJMTA5CS8qIFVwZGF0ZSBhIGpvYiByZXBvcnQgZnJvbSB0aGUgQVBJICovCisjZGVmaW5lCQlBaWZSZXFBUElKb2JGaW5pc2gJMTEwCS8qIEZpbmlzaCBhIGpvYiBmcm9tIHRoZSBBUEkgKi8KKworLyoKKyAqCUFkYXB0ZXIgSW5pdGlhdGVkIEZJQiBjb21tYW5kIHN0cnVjdHVyZXMuIFN0YXJ0IHdpdGggdGhlIGFkYXB0ZXIKKyAqCWluaXRpYXRlZCBGSUJzIHRoYXQgcmVhbGx5IGNvbWUgZnJvbSB0aGUgYWRhcHRlciwgYW5kIGdldCByZXNwb25kZWQKKyAqCXRvIGJ5IHRoZSBob3N0LgorICovCisKK3N0cnVjdCBhYWNfYWlmY21kIHsKKwl1MzIgY29tbWFuZDsJCS8qIFRlbGwgaG9zdCB3aGF0IHR5cGUgb2Ygbm90aWZ5IHRoaXMgaXMgKi8KKwl1MzIgc2VxbnVtOwkJLyogVG8gYWxsb3cgb3JkZXJpbmcgb2YgcmVwb3J0cyAoaWYgbmVjZXNzYXJ5KSAqLworCXU4IGRhdGFbMV07CQkvKiBVbmRlZmluZWQgbGVuZ3RoIChmcm9tIGtlcm5lbCB2aWV3cG9pbnQpICovCit9OworCisvKioKKyAqIAlDb252ZXJ0IGNhcGFjaXR5IHRvIGN5bGluZGVycworICogIAlhY2NvdW50aW5nIGZvciB0aGUgZmFjdCBjYXBhY2l0eSBjb3VsZCBiZSBhIDY0IGJpdCB2YWx1ZQorICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgY2FwX3RvX2N5bHMoc2VjdG9yX3QgY2FwYWNpdHksIHUzMiBkaXZpc29yKQoreworCXNlY3Rvcl9kaXYoY2FwYWNpdHksIGRpdmlzb3IpOworCXJldHVybiAodTMyKWNhcGFjaXR5OworfQorCitzdHJ1Y3Qgc2NzaV9jbW5kOworCitjb25zdCBjaGFyICphYWNfZHJpdmVyaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RydWN0IGZpYiAqZmliX2FsbG9jKHN0cnVjdCBhYWNfZGV2ICpkZXYpOworaW50IGZpYl9zZXR1cChzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK3ZvaWQgZmliX21hcF9mcmVlKHN0cnVjdCBhYWNfZGV2ICpkZXYpOwordm9pZCBmaWJfZnJlZShzdHJ1Y3QgZmliICogY29udGV4dCk7Cit2b2lkIGZpYl9pbml0KHN0cnVjdCBmaWIgKiBjb250ZXh0KTsKK3ZvaWQgZmliX2RlYWxsb2Moc3RydWN0IGZpYiAqIGNvbnRleHQpOwordm9pZCBhYWNfcHJpbnRmKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHUzMiB2YWwpOworaW50IGZpYl9zZW5kKHUxNiBjb21tYW5kLCBzdHJ1Y3QgZmliICogY29udGV4dCwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgcHJpb3JpdHksIGludCB3YWl0LCBpbnQgcmVwbHksIGZpYl9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqY3R4dCk7CitpbnQgYWFjX2NvbnN1bWVyX2dldChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IGFhY19xdWV1ZSAqIHEsIHN0cnVjdCBhYWNfZW50cnkgKiplbnRyeSk7Cit2b2lkIGFhY19jb25zdW1lcl9mcmVlKHN0cnVjdCBhYWNfZGV2ICogZGV2LCBzdHJ1Y3QgYWFjX3F1ZXVlICogcSwgdTMyIHFudW0pOworaW50IGZpYl9jb21wbGV0ZShzdHJ1Y3QgZmliICogY29udGV4dCk7CisjZGVmaW5lIGZpYl9kYXRhKGZpYmN0eCkgKCh2b2lkICopKGZpYmN0eCktPmh3X2ZpYi0+ZGF0YSkKK3N0cnVjdCBhYWNfZGV2ICphYWNfaW5pdF9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYpOworaW50IGFhY19nZXRfY29uZmlnX3N0YXR1cyhzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK2ludCBhYWNfZ2V0X2NvbnRhaW5lcnMoc3RydWN0IGFhY19kZXYgKmRldik7CitpbnQgYWFjX3Njc2lfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitpbnQgYWFjX2Rldl9pb2N0bChzdHJ1Y3QgYWFjX2RldiAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKK2ludCBhYWNfZG9faW9jdGwoc3RydWN0IGFhY19kZXYgKiBkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOworaW50IGFhY19yeF9pbml0KHN0cnVjdCBhYWNfZGV2ICpkZXYpOworaW50IGFhY19ya3RfaW5pdChzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK2ludCBhYWNfc2FfaW5pdChzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKK3Vuc2lnbmVkIGludCBhYWNfcmVzcG9uc2Vfbm9ybWFsKHN0cnVjdCBhYWNfcXVldWUgKiBxKTsKK3Vuc2lnbmVkIGludCBhYWNfY29tbWFuZF9ub3JtYWwoc3RydWN0IGFhY19xdWV1ZSAqIHEpOworaW50IGFhY19jb21tYW5kX3RocmVhZChzdHJ1Y3QgYWFjX2RldiAqIGRldik7CitpbnQgYWFjX2Nsb3NlX2ZpYl9jb250ZXh0KHN0cnVjdCBhYWNfZGV2ICogZGV2LCBzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0ICpmaWJjdHgpOworaW50IGZpYl9hZGFwdGVyX2NvbXBsZXRlKHN0cnVjdCBmaWIgKiBmaWJwdHIsIHVuc2lnbmVkIHNob3J0IHNpemUpOworc3RydWN0IGFhY19kcml2ZXJfaWRlbnQqIGFhY19nZXRfZHJpdmVyX2lkZW50KGludCBkZXZ0eXBlKTsKK2ludCBhYWNfZ2V0X2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgYWFjX2RldiogZGV2KTsKK2ludCBhYWNfc2VuZF9zaHV0ZG93bihzdHJ1Y3QgYWFjX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGQxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgY29tbWN0cmwuYworICoKKyAqIEFic3RyYWN0OiBDb250YWlucyBhbGwgcm91dGluZXMgZm9yIGNvbnRyb2wgb2YgdGhlIEFGQSBjb21tIGxheWVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiYWFjcmFpZC5oIgorCisvKioKKyAqCWlvY3RsX3NlbmRfZmliCS0Jc2VuZCBhIEZJQiBmcm9tIHVzZXJzcGFjZQorICoJQGRldjoJYWRhcHRlciBpcyBiZWluZyBwcm9jZXNzZWQKKyAqCUBhcmc6CWFyZ3VtZW50cyB0byB0aGUgaW9jdGwgY2FsbAorICoJCisgKglUaGlzIHJvdXRpbmUgc2VuZHMgYSBmaWIgdG8gdGhlIGFkYXB0ZXIgb24gYmVoYWxmIG9mIGEgdXNlciBsZXZlbAorICoJcHJvZ3JhbS4KKyAqLworIAorc3RhdGljIGludCBpb2N0bF9zZW5kX2ZpYihzdHJ1Y3QgYWFjX2RldiAqIGRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaHdfZmliICoga2ZpYjsKKwlzdHJ1Y3QgZmliICpmaWJwdHI7CisKKwlmaWJwdHIgPSBmaWJfYWxsb2MoZGV2KTsKKwlpZihmaWJwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJCQorCWtmaWIgPSBmaWJwdHItPmh3X2ZpYjsKKwkvKgorCSAqCUZpcnN0IGNvcHkgaW4gdGhlIGhlYWRlciBzbyB0aGF0IHdlIGNhbiBjaGVjayB0aGUgc2l6ZSBmaWVsZC4KKwkgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKilrZmliLCBhcmcsIHNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKSB7CisJCWZpYl9mcmVlKGZpYnB0cik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKgorCSAqCVNpbmNlIHdlIGNvcHkgYmFzZWQgb24gdGhlIGZpYiBoZWFkZXIgc2l6ZSwgbWFrZSBzdXJlIHRoYXQgd2UKKwkgKgl3aWxsIG5vdCBvdmVycnVuIHRoZSBidWZmZXIgd2hlbiB3ZSBjb3B5IHRoZSBtZW1vcnkuIFJldHVybgorCSAqCWFuIGVycm9yIGlmIHdlIHdvdWxkLgorCSAqLworCWlmIChsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2l6ZSkgPiAKKwkJCXNpemVvZihzdHJ1Y3QgaHdfZmliKSAtIHNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpIHsKKwkJZmliX2ZyZWUoZmlicHRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGtmaWIsIGFyZywgbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNpemUpICsKKwkJCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSkgeworCQlmaWJfZnJlZShmaWJwdHIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoa2ZpYi0+aGVhZGVyLkNvbW1hbmQgPT0gY3B1X3RvX2xlMzIoVGFrZUFCcmVha1B0KSkgeworCQlhYWNfYWRhcHRlcl9pbnRlcnJ1cHQoZGV2KTsKKwkJLyoKKwkJICogU2luY2Ugd2UgZGlkbid0IHJlYWxseSBzZW5kIGEgZmliLCB6ZXJvIG91dCB0aGUgc3RhdGUgdG8gYWxsb3cgCisJCSAqIGNsZWFudXAgY29kZSBub3QgdG8gYXNzZXJ0LgorCQkgKi8KKwkJa2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSA9IDA7CisJfSBlbHNlIHsKKwkJaW50IHJldHZhbCA9IGZpYl9zZW5kKGtmaWItPmhlYWRlci5Db21tYW5kLCBmaWJwdHIsCisJCQkJbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNpemUpICwgRnNhTm9ybWFsLAorCQkJCTEsIDEsIE5VTEwsIE5VTEwpOworCQlpZiAocmV0dmFsKSB7CisJCQlmaWJfZnJlZShmaWJwdHIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAoZmliX2NvbXBsZXRlKGZpYnB0cikgIT0gMCkgeworCQkJZmliX2ZyZWUoZmlicHRyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qCisJICoJTWFrZSBzdXJlIHRoYXQgdGhlIHNpemUgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIgKHdoaWNoIGluY2x1ZGVzCisJICoJdGhlIGhlYWRlcikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIGEgZmliLCBzbyB3ZQorCSAqCWRvbid0IGNvcnJ1cHQgYXBwbGljYXRpb24gZGF0YS4gVGhlbiBjb3B5IHRoYXQgc2l6ZSB0byB0aGUgdXNlcgorCSAqCWJ1ZmZlci4gKERvbid0IHRyeSB0byBhZGQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBhZ2Fpbiwgc2luY2UgaXQKKwkgKgl3YXMgYWxyZWFkeSBpbmNsdWRlZCBieSB0aGUgYWRhcHRlci4pCisJICovCisKKwlpZiAoY29weV90b191c2VyKGFyZywgKHZvaWQgKilrZmliLCBrZmliLT5oZWFkZXIuU2l6ZSkpIHsKKwkJZmliX2ZyZWUoZmlicHRyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWZpYl9mcmVlKGZpYnB0cik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJb3Blbl9nZXRhZGFwdGVyX2ZpYgktCUdldCB0aGUgbmV4dCBmaWIKKyAqCisgKglUaGlzIHJvdXRpbmUgd2lsbCBnZXQgdGhlIG5leHQgRmliLCBpZiBhdmFpbGFibGUsIGZyb20gdGhlIEFkYXB0ZXJGaWJDb250ZXh0CisgKglwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4KKyAqLworCitzdGF0aWMgaW50IG9wZW5fZ2V0YWRhcHRlcl9maWIoc3RydWN0IGFhY19kZXYgKiBkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFhY19maWJfY29udGV4dCAqIGZpYmN0eDsKKwlpbnQgc3RhdHVzOworCisJZmliY3R4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFhY19maWJfY29udGV4dCksIEdGUF9LRVJORUwpOworCWlmIChmaWJjdHggPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBsaXN0X2hlYWQgKiBlbnRyeTsKKwkJc3RydWN0IGFhY19maWJfY29udGV4dCAqIGNvbnRleHQ7CisKKwkJZmliY3R4LT50eXBlID0gRlNBRlNfTlRDX0dFVF9BREFQVEVSX0ZJQl9DT05URVhUOworCQlmaWJjdHgtPnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19maWJfY29udGV4dCk7CisgCQkvKgorCQkgKglZZXMgeWVzLCBJIGtub3cgdGhpcyBjb3VsZCBiZSBhbiBpbmRleCwgYnV0IHdlIGhhdmUgYQorCQkgKiBiZXR0ZXIgZ3VhcmFudGVlIG9mIHVuaXF1ZW5lc3MgZm9yIHRoZSBsb2NrZWQgbG9vcCBiZWxvdy4KKwkJICogV2l0aG91dCB0aGUgYWlkIG9mIGEgcGVyc2lzdGVudCBoaXN0b3J5LCB0aGlzIGFsc28gaGVscHMKKwkJICogcmVkdWNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgb3BhcXVlIGNvbnRleHQgd291bGQgYmUgcmV1c2VkLgorCQkgKi8KKwkJZmliY3R4LT51bmlxdWUgPSAodTMyKSgodWxvbmcpZmliY3R4ICYgMHhGRkZGRkZGRik7CisJCS8qCisJCSAqCUluaXRpYWxpemUgdGhlIG11dGV4IHVzZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgQUlGLgorCQkgKi8KKwkJaW5pdF9NVVRFWF9MT0NLRUQoJmZpYmN0eC0+d2FpdF9zZW0pOworCQlmaWJjdHgtPndhaXQgPSAwOworCQkvKgorCQkgKglJbml0aWFsaXplIHRoZSBmaWJzIGFuZCBzZXQgdGhlIGNvdW50IG9mIGZpYnMgb24KKwkJICoJdGhlIGxpc3QgdG8gMC4KKwkJICovCisJCWZpYmN0eC0+Y291bnQgPSAwOworCQlJTklUX0xJU1RfSEVBRCgmZmliY3R4LT5maWJfbGlzdCk7CisJCWZpYmN0eC0+amlmZmllcyA9IGppZmZpZXMvSFo7CisJCS8qCisJCSAqCU5vdyBhZGQgdGhpcyBjb250ZXh0IG9udG8gdGhlIGFkYXB0ZXIncyAKKwkJICoJQWRhcHRlckZpYkNvbnRleHQgbGlzdC4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciAqLworCQllbnRyeSA9IGRldi0+ZmliX2xpc3QubmV4dDsKKwkJd2hpbGUgKGVudHJ5ICE9ICZkZXYtPmZpYl9saXN0KSB7CisJCQljb250ZXh0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGFhY19maWJfY29udGV4dCwgbmV4dCk7CisJCQlpZiAoY29udGV4dC0+dW5pcXVlID09IGZpYmN0eC0+dW5pcXVlKSB7CisJCQkJLyogTm90IHVuaXF1ZSAoMzIgYml0cykgKi8KKwkJCQlmaWJjdHgtPnVuaXF1ZSsrOworCQkJCWVudHJ5ID0gZGV2LT5maWJfbGlzdC5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJfQorCQl9CisJCWxpc3RfYWRkX3RhaWwoJmZpYmN0eC0+bmV4dCwgJmRldi0+ZmliX2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAgJmZpYmN0eC0+dW5pcXVlLCAKKwkJCQkJCXNpemVvZihmaWJjdHgtPnVuaXF1ZSkpKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gMDsKKwkJfQkKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKgluZXh0X2dldGFkYXB0ZXJfZmliCS0JZ2V0IHRoZSBuZXh0IGZpYgorICoJQGRldjogYWRhcHRlciB0byB1c2UKKyAqCUBhcmc6IGlvY3RsIGFyZ3VtZW50CisgKgkKKyAqIAlUaGlzIHJvdXRpbmUgd2lsbCBnZXQgdGhlIG5leHQgRmliLCBpZiBhdmFpbGFibGUsIGZyb20gdGhlIEFkYXB0ZXJGaWJDb250ZXh0CisgKglwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4KKyAqLworCitzdGF0aWMgaW50IG5leHRfZ2V0YWRhcHRlcl9maWIoc3RydWN0IGFhY19kZXYgKiBkZXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGZpYl9pb2N0bCBmOworCXN0cnVjdCBmaWIgKmZpYjsKKwlzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0ICpmaWJjdHg7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbGlzdF9oZWFkICogZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZihjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZmLCBhcmcsIHNpemVvZihzdHJ1Y3QgZmliX2lvY3RsKSkpCisJCXJldHVybiAtRUZBVUxUOworCS8qCisJICoJVmVyaWZ5IHRoYXQgdGhlIEhBTkRMRSBwYXNzZWQgaW4gd2FzIGEgdmFsaWQgQWRhcHRlckZpYkNvbnRleHQKKwkgKgorCSAqCVNlYXJjaCB0aGUgbGlzdCBvZiBBZGFwdGVyRmliQ29udGV4dCBhZGRyZXNzZXMgb24gdGhlIGFkYXB0ZXIKKwkgKgl0byBiZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBhZGRyZXNzCisJICovCisJZW50cnkgPSBkZXYtPmZpYl9saXN0Lm5leHQ7CisJZmliY3R4ID0gTlVMTDsKKworCXdoaWxlIChlbnRyeSAhPSAmZGV2LT5maWJfbGlzdCkgeworCQlmaWJjdHggPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0LCBuZXh0KTsKKwkJLyoKKwkJICoJRXh0cmFjdCB0aGUgQWRhcHRlckZpYkNvbnRleHQgZnJvbSB0aGUgSW5wdXQgcGFyYW1ldGVycy4KKwkJICovCisJCWlmIChmaWJjdHgtPnVuaXF1ZSA9PSBmLmZpYmN0eCkgeyAgIC8qIFdlIGZvdW5kIGEgd2lubmVyICovCisJCQlicmVhazsKKwkJfQorCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQlmaWJjdHggPSBOVUxMOworCX0KKwlpZiAoIWZpYmN0eCkgeworCQlkcHJpbnRrICgoS0VSTl9JTkZPICJGaWIgQ29udGV4dCBub3QgZm91bmRcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoKGZpYmN0eC0+dHlwZSAhPSBGU0FGU19OVENfR0VUX0FEQVBURVJfRklCX0NPTlRFWFQpIHx8CisJCSAoZmliY3R4LT5zaXplICE9IHNpemVvZihzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0KSkpIHsKKwkJZHByaW50ayAoKEtFUk5fSU5GTyAiRmliIENvbnRleHQgY29ycnVwdD9cbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXR1cyA9IDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZmliX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqCUlmIHRoZXJlIGFyZSBubyBmaWJzIHRvIHNlbmQgYmFjaywgdGhlbiBlaXRoZXIgd2FpdCBvciByZXR1cm4KKwkgKgktRUFHQUlOCisJICovCityZXR1cm5fZmliOgorCWlmICghbGlzdF9lbXB0eSgmZmliY3R4LT5maWJfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OworCQkvKgorCQkgKglQdWxsIHRoZSBuZXh0IGZpYiBmcm9tIHRoZSBmaWJzCisJCSAqLworCQllbnRyeSA9IGZpYmN0eC0+ZmliX2xpc3QubmV4dDsKKwkJbGlzdF9kZWwoZW50cnkpOworCQkKKwkJZmliID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGZpYiwgZmlibGluayk7CisJCWZpYmN0eC0+Y291bnQtLTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGYuZmliLCBmaWItPmh3X2ZpYiwgc2l6ZW9mKHN0cnVjdCBod19maWIpKSkgeworCQkJa2ZyZWUoZmliLT5od19maWIpOworCQkJa2ZyZWUoZmliKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CQorCQkvKgorCQkgKglGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSB0aGlzIGNvcHkgb2YgdGhlIGZpYi4KKwkJICovCisJCWtmcmVlKGZpYi0+aHdfZmliKTsKKwkJa2ZyZWUoZmliKTsKKwkJc3RhdHVzID0gMDsKKwkJZmliY3R4LT5qaWZmaWVzID0gamlmZmllcy9IWjsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCWlmIChmLndhaXQpIHsKKwkJCWlmKGRvd25faW50ZXJydXB0aWJsZSgmZmliY3R4LT53YWl0X3NlbSkgPCAwKSB7CisJCQkJc3RhdHVzID0gLUVJTlRSOworCQkJfSBlbHNlIHsKKwkJCQkvKiBMb2NrIGFnYWluIGFuZCByZXRyeSAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJCQkJZ290byByZXR1cm5fZmliOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVBR0FJTjsKKwkJfQkKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFhY19jbG9zZV9maWJfY29udGV4dChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IGFhY19maWJfY29udGV4dCAqIGZpYmN0eCkKK3sKKwlzdHJ1Y3QgZmliICpmaWI7CisKKwkvKgorCSAqCUZpcnN0IGZyZWUgYW55IEZJQnMgdGhhdCBoYXZlIG5vdCBiZWVuIGNvbnN1bWVkLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZmliY3R4LT5maWJfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OworCQkvKgorCQkgKglQdWxsIHRoZSBuZXh0IGZpYiBmcm9tIHRoZSBmaWJzCisJCSAqLworCQllbnRyeSA9IGZpYmN0eC0+ZmliX2xpc3QubmV4dDsKKwkJbGlzdF9kZWwoZW50cnkpOworCQlmaWIgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZmliLCBmaWJsaW5rKTsKKwkJZmliY3R4LT5jb3VudC0tOworCQkvKgorCQkgKglGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSB0aGlzIGNvcHkgb2YgdGhlIGZpYi4KKwkJICovCisJCWtmcmVlKGZpYi0+aHdfZmliKTsKKwkJa2ZyZWUoZmliKTsKKwl9CisJLyoKKwkgKglSZW1vdmUgdGhlIENvbnRleHQgZnJvbSB0aGUgQWRhcHRlckZpYkNvbnRleHQgTGlzdAorCSAqLworCWxpc3RfZGVsKCZmaWJjdHgtPm5leHQpOworCS8qCisJICoJSW52YWxpZGF0ZSBjb250ZXh0CisJICovCisJZmliY3R4LT50eXBlID0gMDsKKwkvKgorCSAqCUZyZWUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IHRoZSBDb250ZXh0CisJICovCisJa2ZyZWUoZmliY3R4KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgljbG9zZV9nZXRhZGFwdGVyX2ZpYgktCWNsb3NlIGRvd24gdXNlciBmaWIgY29udGV4dAorICoJQGRldjogYWRhcHRlcgorICoJQGFyZzogaW9jdGwgYXJndW1lbnRzCisgKgorICoJVGhpcyByb3V0aW5lIHdpbGwgY2xvc2UgZG93biB0aGUgZmliY3R4IHBhc3NlZCBpbiBmcm9tIHRoZSB1c2VyLgorICovCisgCitzdGF0aWMgaW50IGNsb3NlX2dldGFkYXB0ZXJfZmliKHN0cnVjdCBhYWNfZGV2ICogZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhYWNfZmliX2NvbnRleHQgKmZpYmN0eDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OworCisJLyoKKwkgKglWZXJpZnkgdGhhdCB0aGUgSEFORExFIHBhc3NlZCBpbiB3YXMgYSB2YWxpZCBBZGFwdGVyRmliQ29udGV4dAorCSAqCisJICoJU2VhcmNoIHRoZSBsaXN0IG9mIEFkYXB0ZXJGaWJDb250ZXh0IGFkZHJlc3NlcyBvbiB0aGUgYWRhcHRlcgorCSAqCXRvIGJlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIGFkZHJlc3MKKwkgKi8KKworCWVudHJ5ID0gZGV2LT5maWJfbGlzdC5uZXh0OworCWZpYmN0eCA9IE5VTEw7CisKKwl3aGlsZShlbnRyeSAhPSAmZGV2LT5maWJfbGlzdCkgeworCQlmaWJjdHggPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYWFjX2ZpYl9jb250ZXh0LCBuZXh0KTsKKwkJLyoKKwkJICoJRXh0cmFjdCB0aGUgZmliY3R4IGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMKKwkJICovCisJCWlmIChmaWJjdHgtPnVuaXF1ZSA9PSAodTMyKSh1bnNpZ25lZCBsb25nKWFyZykgeyAgIAorCQkJLyogV2UgZm91bmQgYSB3aW5uZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCWZpYmN0eCA9IE5VTEw7CisJfQorCisJaWYgKCFmaWJjdHgpCisJCXJldHVybiAwOyAvKiBBbHJlYWR5IGdvbmUgKi8KKworCWlmKChmaWJjdHgtPnR5cGUgIT0gRlNBRlNfTlRDX0dFVF9BREFQVEVSX0ZJQl9DT05URVhUKSB8fAorCQkgKGZpYmN0eC0+c2l6ZSAhPSBzaXplb2Yoc3RydWN0IGFhY19maWJfY29udGV4dCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IGFhY19jbG9zZV9maWJfY29udGV4dChkZXYsIGZpYmN0eCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJY2hlY2tfcmV2aXNpb24JLQljbG9zZSBkb3duIHVzZXIgZmliIGNvbnRleHQKKyAqCUBkZXY6IGFkYXB0ZXIKKyAqCUBhcmc6IGlvY3RsIGFyZ3VtZW50cworICoKKyAqCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkcml2ZXIgdmVyc2lvbi4KKyAqICAgICAgVW5kZXIgTGludXgsIHRoZXJlIGhhdmUgYmVlbiBubyB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzLCBzbyB0aGlzIGlzIAorICogICAgICBzaW1wbGUhCisgKi8KKworc3RhdGljIGludCBjaGVja19yZXZpc2lvbihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCByZXZpc2lvbiByZXNwb25zZTsKKworCXJlc3BvbnNlLmNvbXBhdCA9IDE7CisJcmVzcG9uc2UudmVyc2lvbiA9IGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbHJldjsKKwlyZXNwb25zZS5idWlsZCA9IGRldi0+YWRhcHRlcl9pbmZvLmtlcm5lbGJ1aWxkOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioKKyAqCisgKiBhYWNfc2VuZF9yYXdfc2NiCisgKgorICovCisKK2ludCBhYWNfc2VuZF9yYXdfc3JiKHN0cnVjdCBhYWNfZGV2KiBkZXYsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCBmaWIqIHNyYmZpYjsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhYWNfc3JiICpzcmJjbWQ7CisJc3RydWN0IGFhY19zcmIgX191c2VyICp1c2VyX3NyYiA9IGFyZzsKKwlzdHJ1Y3QgYWFjX3NyYl9yZXBseSBfX3VzZXIgKnVzZXJfcmVwbHk7CisJc3RydWN0IGFhY19zcmJfcmVwbHkqIHJlcGx5OworCXUzMiBmaWJzaXplID0gMDsKKwl1MzIgZmxhZ3MgPSAwOworCXMzMiByY29kZSA9IDA7CisJdTMyIGRhdGFfZGlyOworCXZvaWQgX191c2VyICpzZ191c2VyWzMyXTsKKwl2b2lkICpzZ19saXN0WzMyXTsKKwl1MzIgICBzZ19pbmR4ID0gMDsKKwl1MzIgYnl0ZV9jb3VudCA9IDA7CisJdTMyIGFjdHVhbF9maWJzaXplID0gMDsKKwlpbnQgaTsKKworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKXsKKwkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogTm8gcGVybWlzc2lvbiB0byBzZW5kIHJhdyBzcmJcbiIpOyAKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJLyoKKwkgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEZpYiB0aGVuIHNldHVwIGEgQmxvY2tXcml0ZSBjb21tYW5kCisJICovCisJaWYgKCEoc3JiZmliID0gZmliX2FsbG9jKGRldikpKSB7CisJCXJldHVybiAtMTsKKwl9CisJZmliX2luaXQoc3JiZmliKTsKKworCXNyYmNtZCA9IChzdHJ1Y3QgYWFjX3NyYiopIGZpYl9kYXRhKHNyYmZpYik7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmZmlic2l6ZSwgJnVzZXJfc3JiLT5jb3VudCxzaXplb2YodTMyKSkpeworCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgY29weSBkYXRhIHNpemUgZnJvbSB1c2VyXG4iKTsgCisJCXJjb2RlID0gLUVGQVVMVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChmaWJzaXplID4gRklCX0RBVEFfU0laRV9JTl9CWVRFUykgeworCQlyY29kZSA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZihjb3B5X2Zyb21fdXNlcihzcmJjbWQsIHVzZXJfc3JiLGZpYnNpemUpKXsKKwkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogQ291bGQgbm90IGNvcHkgc3JiIGZyb20gdXNlclxuIik7IAorCQlyY29kZSA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwl1c2VyX3JlcGx5ID0gYXJnK2ZpYnNpemU7CisKKwlmbGFncyA9IHNyYmNtZC0+ZmxhZ3M7CisJLy8gRml4IHVwIHNyYiBmb3IgZW5kaWFuIGFuZCBmb3JjZSBzb21lIHZhbHVlcworCXNyYmNtZC0+ZnVuY3Rpb24gPSBjcHVfdG9fbGUzMihTUkJGX0V4ZWN1dGVTY3NpKTsJLy8gRm9yY2UgdGhpcworCXNyYmNtZC0+Y2hhbm5lbCAgPSBjcHVfdG9fbGUzMihzcmJjbWQtPmNoYW5uZWwpOworCXNyYmNtZC0+aWQJID0gY3B1X3RvX2xlMzIoc3JiY21kLT5pZCk7CisJc3JiY21kLT5sdW4gICAgICA9IGNwdV90b19sZTMyKHNyYmNtZC0+bHVuKTsKKwlzcmJjbWQtPmZsYWdzICAgID0gY3B1X3RvX2xlMzIoc3JiY21kLT5mbGFncyk7CisJc3JiY21kLT50aW1lb3V0ICA9IGNwdV90b19sZTMyKHNyYmNtZC0+dGltZW91dCk7CisJc3JiY21kLT5yZXRyeV9saW1pdCA9Y3B1X3RvX2xlMzIoMCk7IC8vIE9ic29sZXRlIHBhcmFtZXRlcgorCXNyYmNtZC0+Y2RiX3NpemUgPSBjcHVfdG9fbGUzMihzcmJjbWQtPmNkYl9zaXplKTsKKwkKKwlzd2l0Y2ggKHNyYmNtZC0+ZmxhZ3MgJiAoU1JCX0RhdGFJbiB8IFNSQl9EYXRhT3V0KSkgeworCWNhc2UgU1JCX0RhdGFPdXQ6CisJCWRhdGFfZGlyID0gRE1BX1RPX0RFVklDRTsKKwkJYnJlYWs7CisJY2FzZSAoU1JCX0RhdGFJbiB8IFNSQl9EYXRhT3V0KToKKwkJZGF0YV9kaXIgPSBETUFfQklESVJFQ1RJT05BTDsKKwkJYnJlYWs7CisJY2FzZSBTUkJfRGF0YUluOgorCQlkYXRhX2RpciA9IERNQV9GUk9NX0RFVklDRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YV9kaXIgPSBETUFfTk9ORTsKKwl9CisJaWYgKGRldi0+ZGFjX3N1cHBvcnQgPT0gMSkgeworCQlzdHJ1Y3Qgc2dtYXA2NCogcHNnID0gKHN0cnVjdCBzZ21hcDY0Kikmc3JiY21kLT5zZzsKKwkJYnl0ZV9jb3VudCA9IDA7CisKKwkJLyoKKwkJICogVGhpcyBzaG91bGQgYWxzbyBjYXRjaCBpZiB1c2VyIHVzZWQgdGhlIDMyIGJpdCBzZ21hcAorCQkgKi8KKwkJYWN0dWFsX2ZpYnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19zcmIpIC0gCisJCQlzaXplb2Yoc3RydWN0IHNnZW50cnkpICsgKChzcmJjbWQtPnNnLmNvdW50ICYgMHhmZikgKiAKKwkJCSAJc2l6ZW9mKHN0cnVjdCBzZ2VudHJ5NjQpKTsKKwkJaWYoYWN0dWFsX2ZpYnNpemUgIT0gZmlic2l6ZSl7IC8vIFVzZXIgbWFkZSBhIG1pc3Rha2UgLSBzaG91bGQgbm90IGNvbnRpbnVlCisJCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBCYWQgU2l6ZSBzcGVjaWZpZWQgaW4gUmF3IFNSQiBjb21tYW5kXG4iKTsKKwkJCXJjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlpZiAoKGRhdGFfZGlyID09IERNQV9OT05FKSAmJiBwc2ctPmNvdW50KSB7IAorCQkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogU0cgd2l0aCBubyBkaXJlY3Rpb24gc3BlY2lmaWVkIGluIFJhdyBTUkIgY29tbWFuZFxuIik7CisJCQlyY29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcHNnLT5jb3VudDsgaSsrKSB7CisJCQlkbWFfYWRkcl90IGFkZHI7IAorCQkJdTY0IGxlX2FkZHI7CisJCQl2b2lkKiBwOworCQkJcCA9IGttYWxsb2MocHNnLT5zZ1tpXS5jb3VudCxHRlBfS0VSTkVMfF9fR0ZQX0RNQSk7CisJCQlpZihwID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgYWxsb2NhdGUgU0cgYnVmZmVyIC0gc2l6ZSA9ICVkIGJ1ZmZlciBudW1iZXIgJWQgb2YgJWRcbiIsCisJCQkJcHNnLT5zZ1tpXS5jb3VudCxpLHBzZy0+Y291bnQpOworCQkJCXJjb2RlID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ191c2VyW2ldID0gKHZvaWQgX191c2VyICopcHNnLT5zZ1tpXS5hZGRyOworCQkJc2dfbGlzdFtpXSA9IHA7IC8vIHNhdmUgc28gd2UgY2FuIGNsZWFuIHVwIGxhdGVyCisJCQlzZ19pbmR4ID0gaTsKKworCQkJaWYoIGZsYWdzICYgU1JCX0RhdGFPdXQgKXsKKwkJCQlpZihjb3B5X2Zyb21fdXNlcihwLHNnX3VzZXJbaV0scHNnLT5zZ1tpXS5jb3VudCkpeworCQkJCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgY29weSBzZyBkYXRhIGZyb20gdXNlclxuIik7IAorCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBwLCBwc2ctPnNnW2ldLmNvdW50LCBkYXRhX2Rpcik7CisKKwkJCWxlX2FkZHIgPSBjcHVfdG9fbGU2NChhZGRyKTsKKwkJCXBzZy0+c2dbaV0uYWRkclsxXSA9ICh1MzIpKGxlX2FkZHI+PjMyKTsKKwkJCXBzZy0+c2dbaV0uYWRkclswXSA9ICh1MzIpKGxlX2FkZHIgJiAweGZmZmZmZmZmKTsKKwkJCXBzZy0+c2dbaV0uY291bnQgPSBjcHVfdG9fbGUzMihwc2ctPnNnW2ldLmNvdW50KTsgIAorCQkJYnl0ZV9jb3VudCArPSBwc2ctPnNnW2ldLmNvdW50OworCQl9CisKKwkJc3JiY21kLT5jb3VudCA9IGNwdV90b19sZTMyKGJ5dGVfY291bnQpOworCQlzdGF0dXMgPSBmaWJfc2VuZChTY3NpUG9ydENvbW1hbmQ2NCwgc3JiZmliLCBhY3R1YWxfZmlic2l6ZSwgRnNhTm9ybWFsLCAxLCAxLE5VTEwsTlVMTCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNnbWFwKiBwc2cgPSAmc3JiY21kLT5zZzsKKwkJYnl0ZV9jb3VudCA9IDA7CisKKwkJYWN0dWFsX2ZpYnNpemUgPSBzaXplb2YgKHN0cnVjdCBhYWNfc3JiKSArIAorCQkJKCgobGUzMl90b19jcHUoc3JiY21kLT5zZy5jb3VudCkgJiAweGZmKSAtIDEpICogCisJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2dlbnRyeSkpOworCQlpZihhY3R1YWxfZmlic2l6ZSAhPSBmaWJzaXplKXsgLy8gVXNlciBtYWRlIGEgbWlzdGFrZSAtIHNob3VsZCBub3QgY29udGludWUKKwkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IEJhZCBTaXplIHNwZWNpZmllZCBpbiBSYXcgU1JCIGNvbW1hbmRcbiIpOworCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWlmICgoZGF0YV9kaXIgPT0gRE1BX05PTkUpICYmIHBzZy0+Y291bnQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IFNHIHdpdGggbm8gZGlyZWN0aW9uIHNwZWNpZmllZCBpbiBSYXcgU1JCIGNvbW1hbmRcbiIpOworCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBwc2ctPmNvdW50OyBpKyspIHsKKwkJCWRtYV9hZGRyX3QgYWRkcjsgCisJCQl2b2lkKiBwOworCQkJcCA9IGttYWxsb2MocHNnLT5zZ1tpXS5jb3VudCxHRlBfS0VSTkVMKTsKKwkJCWlmKHAgPT0gMCkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKKwkJCQlwc2ctPnNnW2ldLmNvdW50LGkscHNnLT5jb3VudCk7CisJCQkJcmNvZGUgPSAtRU5PTUVNOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCXNnX3VzZXJbaV0gPSAodm9pZCBfX3VzZXIgKikocHNnLT5zZ1tpXS5hZGRyKTsKKwkJCXNnX2xpc3RbaV0gPSBwOyAvLyBzYXZlIHNvIHdlIGNhbiBjbGVhbiB1cCBsYXRlcgorCQkJc2dfaW5keCA9IGk7CisKKwkJCWlmKCBmbGFncyAmIFNSQl9EYXRhT3V0ICl7CisJCQkJaWYoY29weV9mcm9tX3VzZXIocCxzZ191c2VyW2ldLHBzZy0+c2dbaV0uY291bnQpKXsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUciYWFjcmFpZDogQ291bGQgbm90IGNvcHkgc2cgZGF0YSBmcm9tIHVzZXJcbiIpOyAKKwkJCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQkJYWRkciA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgcCwgcHNnLT5zZ1tpXS5jb3VudCwgZGF0YV9kaXIpOworCisJCQlwc2ctPnNnW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJCXBzZy0+c2dbaV0uY291bnQgPSBjcHVfdG9fbGUzMihwc2ctPnNnW2ldLmNvdW50KTsgIAorCQkJYnl0ZV9jb3VudCArPSBwc2ctPnNnW2ldLmNvdW50OworCQl9CisJCXNyYmNtZC0+Y291bnQgPSBjcHVfdG9fbGUzMihieXRlX2NvdW50KTsKKwkJc3RhdHVzID0gZmliX3NlbmQoU2NzaVBvcnRDb21tYW5kLCBzcmJmaWIsIGFjdHVhbF9maWJzaXplLCBGc2FOb3JtYWwsIDEsIDEsIE5VTEwsIE5VTEwpOworCX0KKworCWlmIChzdGF0dXMgIT0gMCl7CisJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IENvdWxkIG5vdCBzZW5kIHJhdyBzcmIgZmliIHRvIGhiYVxuIik7IAorCQlyY29kZSA9IC0xOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYoIGZsYWdzICYgU1JCX0RhdGFJbiApIHsKKwkJZm9yKGkgPSAwIDsgaSA8PSBzZ19pbmR4OyBpKyspeworCQkJaWYoY29weV90b191c2VyKHNnX3VzZXJbaV0sc2dfbGlzdFtpXSxsZTMyX3RvX2NwdShzcmJjbWQtPnNnLnNnW2ldLmNvdW50KSkpeworCQkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IENvdWxkIG5vdCBjb3B5IHNnIGRhdGEgdG8gdXNlclxuIik7IAorCQkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCQlnb3RvIGNsZWFudXA7CisKKwkJCX0KKwkJfQorCX0KKworCXJlcGx5ID0gKHN0cnVjdCBhYWNfc3JiX3JlcGx5ICopIGZpYl9kYXRhKHNyYmZpYik7CisJaWYoY29weV90b191c2VyKHVzZXJfcmVwbHkscmVwbHksc2l6ZW9mKHN0cnVjdCBhYWNfc3JiX3JlcGx5KSkpeworCQlwcmludGsoS0VSTl9ERUJVRyJhYWNyYWlkOiBDb3VsZCBub3QgY29weSByZXBseSB0byB1c2VyXG4iKTsgCisJCXJjb2RlID0gLUVGQVVMVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworY2xlYW51cDoKKwlmb3IoaT0wOyBpIDw9IHNnX2luZHg7IGkrKyl7CisJCWtmcmVlKHNnX2xpc3RbaV0pOworCX0KKwlmaWJfY29tcGxldGUoc3JiZmliKTsKKwlmaWJfZnJlZShzcmJmaWIpOworCisJcmV0dXJuIHJjb2RlOworfQorCisKK3N0cnVjdCBhYWNfcGNpX2luZm8geworICAgICAgICB1MzIgYnVzOworICAgICAgICB1MzIgc2xvdDsKK307CisKKworaW50IGFhY19nZXRfcGNpX2luZm8oc3RydWN0IGFhY19kZXYqIGRldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKyAgICAgICAgc3RydWN0IGFhY19wY2lfaW5mbyBwY2lfaW5mbzsKKworCXBjaV9pbmZvLmJ1cyA9IGRldi0+cGRldi0+YnVzLT5udW1iZXI7CisJcGNpX2luZm8uc2xvdCA9IFBDSV9TTE9UKGRldi0+cGRldi0+ZGV2Zm4pOworCisgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsICZwY2lfaW5mbywgc2l6ZW9mKHN0cnVjdCBhYWNfcGNpX2luZm8pKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYWFjcmFpZDogQ291bGQgbm90IGNvcHkgcGNpIGluZm9cbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorICAgICAgICByZXR1cm4gMDsKKyB9CisgCisKK2ludCBhYWNfZG9faW9jdGwoc3RydWN0IGFhY19kZXYgKiBkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHN0YXR1czsKKwkKKwkvKgorCSAqCUhCQSBnZXRzIGZpcnN0IGNyYWNrCisJICovCisJIAorCXN0YXR1cyA9IGFhY19kZXZfaW9jdGwoZGV2LCBjbWQsIGFyZyk7CisJaWYoc3RhdHVzICE9IC1FTk9UVFkpCisJCXJldHVybiBzdGF0dXM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRlNBQ1RMX01JTklQT1JUX1JFVl9DSEVDSzoKKwkJc3RhdHVzID0gY2hlY2tfcmV2aXNpb24oZGV2LCBhcmcpOworCQlicmVhazsKKwljYXNlIEZTQUNUTF9TRU5ERklCOgorCQlzdGF0dXMgPSBpb2N0bF9zZW5kX2ZpYihkZXYsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlNBQ1RMX09QRU5fR0VUX0FEQVBURVJfRklCOgorCQlzdGF0dXMgPSBvcGVuX2dldGFkYXB0ZXJfZmliKGRldiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0FDVExfR0VUX05FWFRfQURBUFRFUl9GSUI6CisJCXN0YXR1cyA9IG5leHRfZ2V0YWRhcHRlcl9maWIoZGV2LCBhcmcpOworCQlicmVhazsKKwljYXNlIEZTQUNUTF9DTE9TRV9HRVRfQURBUFRFUl9GSUI6CisJCXN0YXR1cyA9IGNsb3NlX2dldGFkYXB0ZXJfZmliKGRldiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGU0FDVExfU0VORF9SQVdfU1JCOgorCQlzdGF0dXMgPSBhYWNfc2VuZF9yYXdfc3JiKGRldixhcmcpOworCQlicmVhazsKKwljYXNlIEZTQUNUTF9HRVRfUENJX0lORk86CisJCXN0YXR1cyA9IGFhY19nZXRfcGNpX2luZm8oZGV2LGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FTk9UVFk7CisJICAJYnJlYWs7CQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMyYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIE1vZHVsZSBOYW1lOgorICogIGNvbW1pbml0LmMKKyAqCisgKiBBYnN0cmFjdDogVGhpcyBzdXBwb3J0cyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGhvc3QgYWRhcHRlciBjb21tdWljYXRpb24gaW50ZXJmYWNlLgorICogICAgVGhpcyBpcyBhIHBsYXRmb3JtIGRlcGVuZGVudCBtb2R1bGUgZm9yIHRoZSBwY2kgY3ljbG9uZSBib2FyZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiYWFjcmFpZC5oIgorCitzdHJ1Y3QgYWFjX2NvbW1vbiBhYWNfY29uZmlnOworCitzdGF0aWMgaW50IGFhY19hbGxvY19jb21tKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgKipjb21tYWRkciwgdW5zaWduZWQgbG9uZyBjb21tc2l6ZSwgdW5zaWduZWQgbG9uZyBjb21tYWxpZ24pCit7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIHNpemUsIGFsaWduOworCXVuc2lnbmVkIGxvbmcgZmlic2l6ZSA9IDQwOTY7CisJdW5zaWduZWQgbG9uZyBwcmludGZidWZzaXogPSAyNTY7CisJc3RydWN0IGFhY19pbml0ICppbml0OworCWRtYV9hZGRyX3QgcGh5czsKKworCXNpemUgPSBmaWJzaXplICsgc2l6ZW9mKHN0cnVjdCBhYWNfaW5pdCkgKyBjb21tc2l6ZSArIGNvbW1hbGlnbiArIHByaW50ZmJ1ZnNpejsKKworIAorCWJhc2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsICZwaHlzKTsKKworCWlmKGJhc2UgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiYWFjcmFpZDogdW5hYmxlIHRvIGNyZWF0ZSBtYXBwaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKwlkZXYtPmNvbW1fYWRkciA9ICh2b2lkICopYmFzZTsKKwlkZXYtPmNvbW1fcGh5cyA9IHBoeXM7CisJZGV2LT5jb21tX3NpemUgPSBzaXplOworCQorCWRldi0+aW5pdCA9IChzdHJ1Y3QgYWFjX2luaXQgKikoYmFzZSArIGZpYnNpemUpOworCWRldi0+aW5pdF9wYSA9IHBoeXMgKyBmaWJzaXplOworCisJaW5pdCA9IGRldi0+aW5pdDsKKworCWluaXQtPkluaXRTdHJ1Y3RSZXZpc2lvbiA9IGNwdV90b19sZTMyKEFEQVBURVJfSU5JVF9TVFJVQ1RfUkVWSVNJT04pOworCWluaXQtPk1pbmlQb3J0UmV2aXNpb24gPSBjcHVfdG9fbGUzMihTYV9NSU5JUE9SVF9SRVZJU0lPTik7CisJaW5pdC0+ZnNyZXYgPSBjcHVfdG9fbGUzMihkZXYtPmZzcmV2KTsKKworCS8qCisJICoJQWRhcHRlciBGaWJzIGFyZSB0aGUgZmlyc3QgdGhpbmcgYWxsb2NhdGVkIHNvIHRoYXQgdGhleQorCSAqCXN0YXJ0IHBhZ2UgYWxpZ25lZAorCSAqLworCWRldi0+YWlmX2Jhc2VfdmEgPSAoc3RydWN0IGh3X2ZpYiAqKWJhc2U7CisJCisJaW5pdC0+QWRhcHRlckZpYnNWaXJ0dWFsQWRkcmVzcyA9IDA7CisJaW5pdC0+QWRhcHRlckZpYnNQaHlzaWNhbEFkZHJlc3MgPSBjcHVfdG9fbGUzMigodTMyKXBoeXMpOworCWluaXQtPkFkYXB0ZXJGaWJzU2l6ZSA9IGNwdV90b19sZTMyKGZpYnNpemUpOworCWluaXQtPkFkYXB0ZXJGaWJBbGlnbiA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgaHdfZmliKSk7CisJLyogCisJICogbnVtYmVyIG9mIDRrIHBhZ2VzIG9mIGhvc3QgcGh5c2ljYWwgbWVtb3J5LiBUaGUgYWFjcmFpZCBmdyBuZWVkcworCSAqIHRoaXMgbnVtYmVyIHRvIGJlIGxlc3MgdGhhbiA0Z2Igd29ydGggb2YgcGFnZXMuIG51bV9waHlzcGFnZXMgaXMgaW4KKwkgKiBzeXN0ZW0gcGFnZSB1bml0cy4gTmV3IGZpcm13YXJlIGRvZXNuJ3QgaGF2ZSBhbnkgaXNzdWVzIHdpdGggdGhlCisJICogbWFwcGluZyBzeXN0ZW0sIGJ1dCBvbGRlciBGaXJtd2FyZSBkaWQsIGFuZCBoYWQgKnRyb3VibGVzKiBkZWFsaW5nCisJICogd2l0aCB0aGUgbWF0aCBvdmVybG9hZGluZyBwYXN0IDMyIGJpdHMsIHRodXMgd2UgbXVzdCBsaW1pdCB0aGlzCisJICogZmllbGQuCisJICoKKwkgKiBUaGlzIGFzc3VtZXMgdGhlIG1lbW9yeSBpcyBtYXBwZWQgemVyby0+biwgd2hpY2ggaXNudAorCSAqIGFsd2F5cyB0cnVlIG9uIHJlYWwgY29tcHV0ZXJzLiBJdCBhbHNvIGhhcyBzb21lIHNsaWdodCBwcm9ibGVtcworCSAqIHdpdGggdGhlIEdBUlQgb24geDg2LTY0LiBJJ3ZlIGJ0dyBuZXZlciB0cmllZCBETUEgZnJvbSBQQ0kgc3BhY2UKKwkgKiBvbiB0aGlzIHBsYXRmb3JtIGJ1dCBkb24ndCBiZSBzdXByaXNlZCBpZiBpdHMgcHJvYmxlbWF0aWMuCisJICovCisjaWZuZGVmIENPTkZJR19HQVJUX0lPTU1VCisJaWYgKChudW1fcGh5c3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTIpKSA8PSBBQUNfTUFYX0hPU1RQSFlTTUVNUEFHRVMpIHsKKwkJaW5pdC0+SG9zdFBoeXNNZW1QYWdlcyA9IAorCQkJY3B1X3RvX2xlMzIobnVtX3BoeXNwYWdlcyA8PCAoUEFHRV9TSElGVC0xMikpOworCX0gZWxzZSAKKyNlbmRpZgkKKwl7CisJCWluaXQtPkhvc3RQaHlzTWVtUGFnZXMgPSBjcHVfdG9fbGUzMihBQUNfTUFYX0hPU1RQSFlTTUVNUEFHRVMpOworCX0KKworCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIGJhc2UgYWRkcmVzcyBieSB0aGUgYW1vdW50IGFscmVhZHkgdXNlZAorCSAqLworCWJhc2UgPSBiYXNlICsgZmlic2l6ZSArIHNpemVvZihzdHJ1Y3QgYWFjX2luaXQpOworCXBoeXMgPSAoZG1hX2FkZHJfdCkoKHVsb25nKXBoeXMgKyBmaWJzaXplICsgc2l6ZW9mKHN0cnVjdCBhYWNfaW5pdCkpOworCS8qCisJICoJQWxpZ24gdGhlIGJlZ2lubmluZyBvZiBIZWFkZXJzIHRvIGNvbW1hbGlnbgorCSAqLworCWFsaWduID0gKGNvbW1hbGlnbiAtICgodW5zaWduZWQgbG9uZykoYmFzZSkgJiAoY29tbWFsaWduIC0gMSkpKTsKKwliYXNlID0gYmFzZSArIGFsaWduOworCXBoeXMgPSBwaHlzICsgYWxpZ247CisJLyoKKwkgKglGaWxsIGluIGFkZHJlc3NlcyBvZiB0aGUgQ29tbSBBcmVhIEhlYWRlcnMgYW5kIFF1ZXVlcworCSAqLworCSpjb21tYWRkciA9IGJhc2U7CisJaW5pdC0+Q29tbUhlYWRlckFkZHJlc3MgPSBjcHVfdG9fbGUzMigodTMyKXBoeXMpOworCS8qCisJICoJSW5jcmVtZW50IHRoZSBiYXNlIGFkZHJlc3MgYnkgdGhlIHNpemUgb2YgdGhlIENvbW1BcmVhCisJICovCisJYmFzZSA9IGJhc2UgKyBjb21tc2l6ZTsKKwlwaHlzID0gcGh5cyArIGNvbW1zaXplOworCS8qCisJICoJIFBsYWNlIHRoZSBQcmludGYgYnVmZmVyIGFyZWEgYWZ0ZXIgdGhlIEZhc3QgSS9PIGNvbW0gYXJlYS4KKwkgKi8KKwlkZXYtPnByaW50ZmJ1ZiA9ICh2b2lkICopYmFzZTsKKwlpbml0LT5wcmludGZidWYgPSBjcHVfdG9fbGUzMihwaHlzKTsKKwlpbml0LT5wcmludGZidWZzaXogPSBjcHVfdG9fbGUzMihwcmludGZidWZzaXopOworCW1lbXNldChiYXNlLCAwLCBwcmludGZidWZzaXopOworCXJldHVybiAxOworfQorICAgIAorc3RhdGljIHZvaWQgYWFjX3F1ZXVlX2luaXQoc3RydWN0IGFhY19kZXYgKiBkZXYsIHN0cnVjdCBhYWNfcXVldWUgKiBxLCB1MzIgKm1lbSwgaW50IHFzaXplKQoreworCXEtPm51bXBlbmRpbmcgPSAwOworCXEtPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmcS0+cGVuZGluZ3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPmNtZHJlYWR5KTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+Y21kcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+cWZ1bGwpOworCXNwaW5fbG9ja19pbml0KCZxLT5sb2NrZGF0YSk7CisJcS0+bG9jayA9ICZxLT5sb2NrZGF0YTsKKwlxLT5oZWFkZXJzLnByb2R1Y2VyID0gbWVtOworCXEtPmhlYWRlcnMuY29uc3VtZXIgPSBtZW0rMTsKKwkqKHEtPmhlYWRlcnMucHJvZHVjZXIpID0gY3B1X3RvX2xlMzIocXNpemUpOworCSoocS0+aGVhZGVycy5jb25zdW1lcikgPSBjcHVfdG9fbGUzMihxc2l6ZSk7CisJcS0+ZW50cmllcyA9IHFzaXplOworfQorCisvKioKKyAqCWFhY19zZW5kX3NodXRkb3duCQktCXNodXRkb3duIGFuIGFkYXB0ZXIKKyAqCUBkZXY6IEFkYXB0ZXIgdG8gc2h1dGRvd24KKyAqCisgKglUaGlzIHJvdXRpbmUgd2lsbCBzZW5kIGEgVk1fQ2xvc2VBbGwgKHNodXRkb3duKSByZXF1ZXN0IHRvIHRoZSBhZGFwdGVyLgorICovCisKK2ludCBhYWNfc2VuZF9zaHV0ZG93bihzdHJ1Y3QgYWFjX2RldiAqIGRldikKK3sKKwlzdHJ1Y3QgZmliICogZmliY3R4OworCXN0cnVjdCBhYWNfY2xvc2UgKmNtZDsKKwlpbnQgc3RhdHVzOworCisJZmliY3R4ID0gZmliX2FsbG9jKGRldik7CisJZmliX2luaXQoZmliY3R4KTsKKworCWNtZCA9IChzdHJ1Y3QgYWFjX2Nsb3NlICopIGZpYl9kYXRhKGZpYmN0eCk7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUzMihWTV9DbG9zZUFsbCk7CisJY21kLT5jaWQgPSBjcHVfdG9fbGUzMigweGZmZmZmZmZmKTsKKworCXN0YXR1cyA9IGZpYl9zZW5kKENvbnRhaW5lckNvbW1hbmQsCisJCQkgIGZpYmN0eCwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBhYWNfY2xvc2UpLAorCQkJICBGc2FOb3JtYWwsCisJCQkgIDEsIDEsCisJCQkgIE5VTEwsIE5VTEwpOworCisJaWYgKHN0YXR1cyA9PSAwKQorCQlmaWJfY29tcGxldGUoZmliY3R4KTsKKwlmaWJfZnJlZShmaWJjdHgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICoJYWFjX2NvbW1faW5pdAktCUluaXRpYWxpc2UgRlNBIGRhdGEgc3RydWN0dXJlcworICoJQGRldjoJQWRhcHRlciB0byBpbml0aWFsaXNlCisgKgorICoJSW5pdGlhbGl6ZXMgdGhlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIEZTQSBjb21tdWljYXRpb24KKyAqCWludGVyZmFjZSB0byBvcGVyYXRlLiAKKyAqCVJldHVybnMKKyAqCQkxIC0gaWYgd2Ugd2VyZSBhYmxlIHRvIGluaXQgdGhlIGNvbW11aWNhdGlvbiBpbnRlcmZhY2UuCisgKgkJMCAtIElmIHRoZXJlIHdlcmUgZXJyb3JzIGluaXRpbmcuIFRoaXMgaXMgYSBmYXRhbCBlcnJvci4KKyAqLworIAoraW50IGFhY19jb21tX2luaXQoc3RydWN0IGFhY19kZXYgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBoZHJzaXplID0gKHNpemVvZih1MzIpICogTlVNQkVSX09GX0NPTU1fUVVFVUVTKSAqIDI7CisJdW5zaWduZWQgbG9uZyBxdWV1ZXNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19lbnRyeSkgKiBUT1RBTF9RVUVVRV9FTlRSSUVTOworCXUzMiAqaGVhZGVyczsKKwlzdHJ1Y3QgYWFjX2VudHJ5ICogcXVldWVzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrICogY29tbSA9IGRldi0+cXVldWVzOworCS8qCisJICoJTm93IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSB6b25lIHN0cnVjdHVyZXMgdXNlZCBhcyBvdXIgCisJICoJcG9vbCBvZiBGSUIgY29udGV4dCByZWNvcmRzLiAgVGhlIHNpemUgb2YgdGhlIHpvbmUgaXMgYmFzZWQKKwkgKglvbiB0aGUgc3lzdGVtIG1lbW9yeSBzaXplLiAgV2UgYWxzbyBpbml0aWFsaXplIHRoZSBtdXRleCB1c2VkCisJICoJdG8gcHJvdGVjdCB0aGUgem9uZS4KKwkgKi8KKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5maWJfbG9jayk7CisKKwkvKgorCSAqCUFsbG9jYXRlIHRoZSBwaHlzaWNhbGx5IGNvbnRpZ291cyBzcGFjZSBmb3IgdGhlIGNvbW11aWNhdGlvbgorCSAqCXF1ZXVlIGhlYWRlcnMuIAorCSAqLworCisJc2l6ZSA9IGhkcnNpemUgKyBxdWV1ZXNpemU7CisKKwlpZiAoIWFhY19hbGxvY19jb21tKGRldiwgKHZvaWQgKiAqKSZoZWFkZXJzLCBzaXplLCBRVUVVRV9BTElHTk1FTlQpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXF1ZXVlcyA9IChzdHJ1Y3QgYWFjX2VudHJ5ICopKCgodWxvbmcpaGVhZGVycykgKyBoZHJzaXplKTsKKworCS8qIEFkYXB0ZXIgdG8gSG9zdCBub3JtYWwgcHJpb3JpdHkgQ29tbWFuZCBxdWV1ZSAqLyAKKwljb21tLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5iYXNlID0gcXVldWVzOworCWFhY19xdWV1ZV9pbml0KGRldiwgJmNvbW0tPnF1ZXVlW0hvc3ROb3JtQ21kUXVldWVdLCBoZWFkZXJzLCBIT1NUX05PUk1fQ01EX0VOVFJJRVMpOworCXF1ZXVlcyArPSBIT1NUX05PUk1fQ01EX0VOVFJJRVM7CisJaGVhZGVycyArPSAyOworCisJLyogQWRhcHRlciB0byBIb3N0IGhpZ2ggcHJpb3JpdHkgY29tbWFuZCBxdWV1ZSAqLworCWNvbW0tPnF1ZXVlW0hvc3RIaWdoQ21kUXVldWVdLmJhc2UgPSBxdWV1ZXM7CisJYWFjX3F1ZXVlX2luaXQoZGV2LCAmY29tbS0+cXVldWVbSG9zdEhpZ2hDbWRRdWV1ZV0sIGhlYWRlcnMsIEhPU1RfSElHSF9DTURfRU5UUklFUyk7CisgICAgCisJcXVldWVzICs9IEhPU1RfSElHSF9DTURfRU5UUklFUzsKKwloZWFkZXJzICs9MjsKKworCS8qIEhvc3QgdG8gYWRhcHRlciBub3JtYWwgcHJpb3JpdHkgY29tbWFuZCBxdWV1ZSAqLworCWNvbW0tPnF1ZXVlW0FkYXBOb3JtQ21kUXVldWVdLmJhc2UgPSBxdWV1ZXM7CisJYWFjX3F1ZXVlX2luaXQoZGV2LCAmY29tbS0+cXVldWVbQWRhcE5vcm1DbWRRdWV1ZV0sIGhlYWRlcnMsIEFEQVBfTk9STV9DTURfRU5UUklFUyk7CisgICAgCisJcXVldWVzICs9IEFEQVBfTk9STV9DTURfRU5UUklFUzsKKwloZWFkZXJzICs9IDI7CisKKwkvKiBob3N0IHRvIGFkYXB0ZXIgaGlnaCBwcmlvcml0eSBjb21tYW5kIHF1ZXVlICovCisJY29tbS0+cXVldWVbQWRhcEhpZ2hDbWRRdWV1ZV0uYmFzZSA9IHF1ZXVlczsKKwlhYWNfcXVldWVfaW5pdChkZXYsICZjb21tLT5xdWV1ZVtBZGFwSGlnaENtZFF1ZXVlXSwgaGVhZGVycywgQURBUF9ISUdIX0NNRF9FTlRSSUVTKTsKKyAgICAKKwlxdWV1ZXMgKz0gQURBUF9ISUdIX0NNRF9FTlRSSUVTOworCWhlYWRlcnMgKz0gMjsKKworCS8qIGFkYXB0ZXIgdG8gaG9zdCBub3JtYWwgcHJpb3JpdHkgcmVzcG9uc2UgcXVldWUgKi8KKwljb21tLT5xdWV1ZVtIb3N0Tm9ybVJlc3BRdWV1ZV0uYmFzZSA9IHF1ZXVlczsKKwlhYWNfcXVldWVfaW5pdChkZXYsICZjb21tLT5xdWV1ZVtIb3N0Tm9ybVJlc3BRdWV1ZV0sIGhlYWRlcnMsIEhPU1RfTk9STV9SRVNQX0VOVFJJRVMpOworCXF1ZXVlcyArPSBIT1NUX05PUk1fUkVTUF9FTlRSSUVTOworCWhlYWRlcnMgKz0gMjsKKworCS8qIGFkYXB0ZXIgdG8gaG9zdCBoaWdoIHByaW9yaXR5IHJlc3BvbnNlIHF1ZXVlICovCisJY29tbS0+cXVldWVbSG9zdEhpZ2hSZXNwUXVldWVdLmJhc2UgPSBxdWV1ZXM7CisJYWFjX3F1ZXVlX2luaXQoZGV2LCAmY29tbS0+cXVldWVbSG9zdEhpZ2hSZXNwUXVldWVdLCBoZWFkZXJzLCBIT1NUX0hJR0hfUkVTUF9FTlRSSUVTKTsKKyAgIAorCXF1ZXVlcyArPSBIT1NUX0hJR0hfUkVTUF9FTlRSSUVTOworCWhlYWRlcnMgKz0gMjsKKworCS8qIGhvc3QgdG8gYWRhcHRlciBub3JtYWwgcHJpb3JpdHkgcmVzcG9uc2UgcXVldWUgKi8KKwljb21tLT5xdWV1ZVtBZGFwTm9ybVJlc3BRdWV1ZV0uYmFzZSA9IHF1ZXVlczsKKwlhYWNfcXVldWVfaW5pdChkZXYsICZjb21tLT5xdWV1ZVtBZGFwTm9ybVJlc3BRdWV1ZV0sIGhlYWRlcnMsIEFEQVBfTk9STV9SRVNQX0VOVFJJRVMpOworCisJcXVldWVzICs9IEFEQVBfTk9STV9SRVNQX0VOVFJJRVM7CisJaGVhZGVycyArPSAyOworCQorCS8qIGhvc3QgdG8gYWRhcHRlciBoaWdoIHByaW9yaXR5IHJlc3BvbnNlIHF1ZXVlICovIAorCWNvbW0tPnF1ZXVlW0FkYXBIaWdoUmVzcFF1ZXVlXS5iYXNlID0gcXVldWVzOworCWFhY19xdWV1ZV9pbml0KGRldiwgJmNvbW0tPnF1ZXVlW0FkYXBIaWdoUmVzcFF1ZXVlXSwgaGVhZGVycywgQURBUF9ISUdIX1JFU1BfRU5UUklFUyk7CisKKwljb21tLT5xdWV1ZVtBZGFwTm9ybUNtZFF1ZXVlXS5sb2NrID0gY29tbS0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdLmxvY2s7CisJY29tbS0+cXVldWVbQWRhcEhpZ2hDbWRRdWV1ZV0ubG9jayA9IGNvbW0tPnF1ZXVlW0hvc3RIaWdoUmVzcFF1ZXVlXS5sb2NrOworCWNvbW0tPnF1ZXVlW0FkYXBOb3JtUmVzcFF1ZXVlXS5sb2NrID0gY29tbS0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0ubG9jazsKKwljb21tLT5xdWV1ZVtBZGFwSGlnaFJlc3BRdWV1ZV0ubG9jayA9IGNvbW0tPnF1ZXVlW0hvc3RIaWdoQ21kUXVldWVdLmxvY2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFhY19kZXYgKmFhY19pbml0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwkvKgorCSAqCU9rIG5vdyBpbml0IHRoZSBjb21tdW5pY2F0aW9uIHN1YnN5c3RlbQorCSAqLworCisJZGV2LT5xdWV1ZXMgPSAoc3RydWN0IGFhY19xdWV1ZV9ibG9jayAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWFjX3F1ZXVlX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldi0+cXVldWVzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjb3VsZCBub3QgYWxsb2NhdGUgY29tbSByZWdpb24uXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChkZXYtPnF1ZXVlcywgMCwgc2l6ZW9mKHN0cnVjdCBhYWNfcXVldWVfYmxvY2spKTsKKworCWlmIChhYWNfY29tbV9pbml0KGRldik8MCl7CisJCWtmcmVlKGRldi0+cXVldWVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qCisJICoJSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBmaWJzCisJICovCisJaWYoZmliX3NldHVwKGRldik8MCl7CisJCWtmcmVlKGRldi0+cXVldWVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQkKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5maWJfbGlzdCk7CisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmFpZl9jb21wbGV0aW9uKTsKKworCXJldHVybiBkZXY7Cit9CisKKyAgICAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjM2ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCkBAIC0wLDAgKzEsOTM5IEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgY29tbXN1cC5jCisgKgorICogQWJzdHJhY3Q6IENvbnRhaW4gYWxsIHJvdXRpbmVzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBGU0EgaG9zdC9hZGFwdGVyCisgKiAgICBjb21tdWljYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJhYWNyYWlkLmgiCisKKy8qKgorICoJZmliX21hcF9hbGxvYwkJLQlhbGxvY2F0ZSB0aGUgZmliIG9iamVjdHMKKyAqCUBkZXY6IEFkYXB0ZXIgdG8gYWxsb2NhdGUgZm9yCisgKgorICoJQWxsb2NhdGUgYW5kIG1hcCB0aGUgc2hhcmVkIFBDSSBzcGFjZSBmb3IgdGhlIEZJQiBibG9ja3MgdXNlZCB0bworICoJdGFsayB0byB0aGUgQWRhcHRlYyBmaXJtd2FyZS4KKyAqLworIAorc3RhdGljIGludCBmaWJfbWFwX2FsbG9jKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJaWYoKGRldi0+aHdfZmliX3ZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBzaXplb2Yoc3RydWN0IGh3X2ZpYikgKiBBQUNfTlVNX0ZJQiwgJmRldi0+aHdfZmliX3BhKSk9PU5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisvKioKKyAqCWZpYl9tYXBfZnJlZQkJLQlmcmVlIHRoZSBmaWIgb2JqZWN0cworICoJQGRldjogQWRhcHRlciB0byBmcmVlCisgKgorICoJRnJlZSB0aGUgUENJIG1hcHBpbmdzIGFuZCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgRklCIGJsb2NrcworICoJb24gdGhpcyBhZGFwdGVyLgorICovCisKK3ZvaWQgZmliX21hcF9mcmVlKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgaHdfZmliKSAqIEFBQ19OVU1fRklCLCBkZXYtPmh3X2ZpYl92YSwgZGV2LT5od19maWJfcGEpOworfQorCisvKioKKyAqCWZpYl9zZXR1cAktCXNldHVwIHRoZSBmaWJzCisgKglAZGV2OiBBZGFwdGVyIHRvIHNldCB1cAorICoKKyAqCUFsbG9jYXRlIHRoZSBQQ0kgc3BhY2UgZm9yIHRoZSBmaWJzLCBtYXAgaXQgYW5kIHRoZW4gaW50aWFsaXNlIHRoZQorICoJZmliIGFyZWEsIHRoZSB1bm1hcHBlZCBmaWIgZGF0YSBhbmQgYWxzbyB0aGUgZnJlZSBsaXN0CisgKi8KKworaW50IGZpYl9zZXR1cChzdHJ1Y3QgYWFjX2RldiAqIGRldikKK3sKKwlzdHJ1Y3QgZmliICpmaWJwdHI7CisJc3RydWN0IGh3X2ZpYiAqaHdfZmliX3ZhOworCWRtYV9hZGRyX3QgaHdfZmliX3BhOworCWludCBpOworCQorCWlmKGZpYl9tYXBfYWxsb2MoZGV2KTwwKQorCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJaHdfZmliX3ZhID0gZGV2LT5od19maWJfdmE7CisJaHdfZmliX3BhID0gZGV2LT5od19maWJfcGE7CisJbWVtc2V0KGh3X2ZpYl92YSwgMCwgc2l6ZW9mKHN0cnVjdCBod19maWIpICogQUFDX05VTV9GSUIpOworCS8qCisJICoJSW5pdGlhbGlzZSB0aGUgZmlicworCSAqLworCWZvciAoaSA9IDAsIGZpYnB0ciA9ICZkZXYtPmZpYnNbaV07IGkgPCBBQUNfTlVNX0ZJQjsgaSsrLCBmaWJwdHIrKykgCisJeworCQlmaWJwdHItPmRldiA9IGRldjsKKwkJZmlicHRyLT5od19maWIgPSBod19maWJfdmE7CisJCWZpYnB0ci0+ZGF0YSA9ICh2b2lkICopIGZpYnB0ci0+aHdfZmliLT5kYXRhOworCQlmaWJwdHItPm5leHQgPSBmaWJwdHIrMTsJLyogRm9yd2FyZCBjaGFpbiB0aGUgZmlicyAqLworCQlpbml0X01VVEVYX0xPQ0tFRCgmZmlicHRyLT5ldmVudF93YWl0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJmZpYnB0ci0+ZXZlbnRfbG9jayk7CisJCWh3X2ZpYl92YS0+aGVhZGVyLlhmZXJTdGF0ZSA9IDB4ZmZmZmZmZmY7CisJCWh3X2ZpYl92YS0+aGVhZGVyLlNlbmRlclNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGh3X2ZpYikpOworCQlmaWJwdHItPmh3X2ZpYl9wYSA9IGh3X2ZpYl9wYTsKKwkJaHdfZmliX3ZhID0gKHN0cnVjdCBod19maWIgKikoKHVuc2lnbmVkIGNoYXIgKilod19maWJfdmEgKyBzaXplb2Yoc3RydWN0IGh3X2ZpYikpOworCQlod19maWJfcGEgPSBod19maWJfcGEgKyBzaXplb2Yoc3RydWN0IGh3X2ZpYik7IAorCX0KKwkvKgorCSAqCUFkZCB0aGUgZmliIGNoYWluIHRvIHRoZSBmcmVlIGxpc3QKKwkgKi8KKwlkZXYtPmZpYnNbQUFDX05VTV9GSUItMV0ubmV4dCA9IE5VTEw7CisJLyoKKwkgKglFbmFibGUgdGhpcyB0byBkZWJ1ZyBvdXQgb2YgcXVldWUgc3BhY2UKKwkgKi8KKwlkZXYtPmZyZWVfZmliID0gJmRldi0+Zmlic1swXTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglmaWJfYWxsb2MJLQlhbGxvY2F0ZSBhIGZpYgorICoJQGRldjogQWRhcHRlciB0byBhbGxvY2F0ZSB0aGUgZmliIGZvcgorICoKKyAqCUFsbG9jYXRlIGEgZmliIGZyb20gdGhlIGFkYXB0ZXIgZmliIHBvb2wuIElmIHRoZSBwb29sIGlzIGVtcHR5IHdlCisgKgl3YWl0IGZvciBmaWJzIHRvIGJlY29tZSBmcmVlLgorICovCisgCitzdHJ1Y3QgZmliICogZmliX2FsbG9jKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJc3RydWN0IGZpYiAqIGZpYnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJZmlicHRyID0gZGV2LT5mcmVlX2ZpYjsJCisJLyogQ2Fubm90IHNsZWVwIGhlcmUgb3IgeW91IGdldCBoYW5ncy4gSW5zdGVhZCB3ZSBkaWQgdGhlCisJICAgbWF0aHMgYXQgY29tcGlsZSB0aW1lLiAqLworCWlmKCFmaWJwdHIpCisJCUJVRygpOworCWRldi0+ZnJlZV9maWIgPSBmaWJwdHItPm5leHQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5maWJfbG9jaywgZmxhZ3MpOworCS8qCisJICoJU2V0IHRoZSBwcm9wZXIgbm9kZSB0eXBlIGNvZGUgYW5kIG5vZGUgYnl0ZSBzaXplCisJICovCisJZmlicHRyLT50eXBlID0gRlNBRlNfTlRDX0ZJQl9DT05URVhUOworCWZpYnB0ci0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmliKTsKKwkvKgorCSAqCU51bGwgb3V0IGZpZWxkcyB0aGF0IGRlcGVuZCBvbiBiZWluZyB6ZXJvIGF0IHRoZSBzdGFydCBvZgorCSAqCWVhY2ggSS9PCisJICovCisJZmlicHRyLT5od19maWItPmhlYWRlci5YZmVyU3RhdGUgPSAwOworCWZpYnB0ci0+Y2FsbGJhY2sgPSBOVUxMOworCWZpYnB0ci0+Y2FsbGJhY2tfZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gZmlicHRyOworfQorCisvKioKKyAqCWZpYl9mcmVlCS0JZnJlZSBhIGZpYgorICoJQGZpYnB0cjogZmliIHRvIGZyZWUgdXAKKyAqCisgKglGcmVlcyB1cCBhIGZpYiBhbmQgcGxhY2VzIGl0IG9uIHRoZSBhcHByb3ByaWF0ZSBxdWV1ZQorICoJKGVpdGhlciBmcmVlIG9yIHRpbWVkIG91dCkKKyAqLworIAordm9pZCBmaWJfZnJlZShzdHJ1Y3QgZmliICogZmlicHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmlicHRyLT5kZXYtPmZpYl9sb2NrLCBmbGFncyk7CisJaWYgKGZpYnB0ci0+ZmxhZ3MgJiBGSUJfQ09OVEVYVF9GTEFHX1RJTUVEX09VVCkgeworCQlhYWNfY29uZmlnLmZpYl90aW1lb3V0cysrOworCQlmaWJwdHItPm5leHQgPSBmaWJwdHItPmRldi0+dGltZW91dF9maWI7CisJCWZpYnB0ci0+ZGV2LT50aW1lb3V0X2ZpYiA9IGZpYnB0cjsKKwl9IGVsc2UgeworCQlpZiAoZmlicHRyLT5od19maWItPmhlYWRlci5YZmVyU3RhdGUgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmliX2ZyZWUsIFhmZXJTdGF0ZSAhPSAwLCBmaWJwdHIgPSAweCVwLCBYZmVyU3RhdGUgPSAweCV4XG4iLCAKKwkJCQkgKHZvaWQqKWZpYnB0ciwgCisJCQkJIGxlMzJfdG9fY3B1KGZpYnB0ci0+aHdfZmliLT5oZWFkZXIuWGZlclN0YXRlKSk7CisJCX0KKwkJZmlicHRyLT5uZXh0ID0gZmlicHRyLT5kZXYtPmZyZWVfZmliOworCQlmaWJwdHItPmRldi0+ZnJlZV9maWIgPSBmaWJwdHI7CisJfQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWJwdHItPmRldi0+ZmliX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglmaWJfaW5pdAktCWluaXRpYWxpc2UgYSBmaWIKKyAqCUBmaWJwdHI6IFRoZSBmaWIgdG8gaW5pdGlhbGl6ZQorICoJCisgKglTZXQgdXAgdGhlIGdlbmVyaWMgZmliIGZpZWxkcyByZWFkeSBmb3IgdXNlCisgKi8KKyAKK3ZvaWQgZmliX2luaXQoc3RydWN0IGZpYiAqZmlicHRyKQoreworCXN0cnVjdCBod19maWIgKmh3X2ZpYiA9IGZpYnB0ci0+aHdfZmliOworCisJaHdfZmliLT5oZWFkZXIuU3RydWN0VHlwZSA9IEZJQl9NQUdJQzsKKwlod19maWItPmhlYWRlci5TaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBod19maWIpKTsKKyAgICAgICAgaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlID0gY3B1X3RvX2xlMzIoSG9zdE93bmVkIHwgRmliSW5pdGlhbGl6ZWQgfCBGaWJFbXB0eSB8IEZhc3RSZXNwb25zZUNhcGFibGUpOworCWh3X2ZpYi0+aGVhZGVyLlNlbmRlckZpYkFkZHJlc3MgPSBjcHVfdG9fbGUzMihmaWJwdHItPmh3X2ZpYl9wYSk7CisJaHdfZmliLT5oZWFkZXIuUmVjZWl2ZXJGaWJBZGRyZXNzID0gY3B1X3RvX2xlMzIoZmlicHRyLT5od19maWJfcGEpOworCWh3X2ZpYi0+aGVhZGVyLlNlbmRlclNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGh3X2ZpYikpOworfQorCisvKioKKyAqCWZpYl9kZWFsbG9jYXRlCQktCWRlYWxsb2NhdGUgYSBmaWIKKyAqCUBmaWJwdHI6IGZpYiB0byBkZWFsbG9jYXRlCisgKgorICoJV2lsbCBkZWFsbG9jYXRlIGFuZCByZXR1cm4gdG8gdGhlIGZyZWUgcG9vbCB0aGUgRklCIHBvaW50ZWQgdG8gYnkgdGhlCisgKgljYWxsZXIuCisgKi8KKyAKK3ZvaWQgZmliX2RlYWxsb2Moc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgaHdfZmliICpod19maWIgPSBmaWJwdHItPmh3X2ZpYjsKKwlpZihod19maWItPmhlYWRlci5TdHJ1Y3RUeXBlICE9IEZJQl9NQUdJQykgCisJCUJVRygpOworCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSA9IDA7ICAgICAgICAKK30KKworLyoKKyAqCUNvbW11aWNhdGlvbiBwcmltaXRpdmVzIGRlZmluZSBhbmQgc3VwcG9ydCB0aGUgcXVldWluZyBtZXRob2Qgd2UgdXNlIHRvCisgKglzdXBwb3J0IGhvc3QgdG8gYWRhcHRlciBjb21tdWljYXRpb24uIEFsbCBxdWV1ZSBhY2Nlc3NlcyBoYXBwZW4gdGhyb3VnaAorICoJdGhlc2Ugcm91dGluZXMgYW5kIGFyZSB0aGUgb25seSByb3V0aW5lcyB3aGljaCBoYXZlIGEga25vd2xlZGdlIG9mIHRoZQorICoJIGhvdyB0aGVzZSBxdWV1ZXMgYXJlIGltcGxlbWVudGVkLgorICovCisgCisvKioKKyAqCWFhY19nZXRfZW50cnkJCS0JZ2V0IGEgcXVldWUgZW50cnkKKyAqCUBkZXY6IEFkYXB0ZXIKKyAqCUBxaWQ6IFF1ZXVlIE51bWJlcgorICoJQGVudHJ5OiBFbnRyeSByZXR1cm4KKyAqCUBpbmRleDogSW5kZXggcmV0dXJuCisgKglAbm9ub3RpZnk6IG5vdGlmaWNhdGlvbiBjb250cm9sCisgKgorICoJV2l0aCBhIHByaW9yaXR5IHRoZSByb3V0aW5lIHJldHVybnMgYSBxdWV1ZSBlbnRyeSBpZiB0aGUgcXVldWUgaGFzIGZyZWUgZW50cmllcy4gSWYgdGhlIHF1ZXVlCisgKglpcyBmdWxsKG5vIGZyZWUgZW50cmllcykgdGhhbiBubyBlbnRyeSBpcyByZXR1cm5lZCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvdGhlcndpc2UgMSBpcworICoJcmV0dXJuZWQuCisgKi8KKyAKK3N0YXRpYyBpbnQgYWFjX2dldF9lbnRyeSAoc3RydWN0IGFhY19kZXYgKiBkZXYsIHUzMiBxaWQsIHN0cnVjdCBhYWNfZW50cnkgKiplbnRyeSwgdTMyICogaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm5vbm90aWZ5KQoreworCXN0cnVjdCBhYWNfcXVldWUgKiBxOworCisJLyoKKwkgKglBbGwgb2YgdGhlIHF1ZXVlcyB3cmFwIHdoZW4gdGhleSByZWFjaCB0aGUgZW5kLCBzbyB3ZSBjaGVjaworCSAqCXRvIHNlZSBpZiB0aGV5IGhhdmUgcmVhY2hlZCB0aGUgZW5kIGFuZCBpZiB0aGV5IGhhdmUgd2UganVzdAorCSAqCXNldCB0aGUgaW5kZXggYmFjayB0byB6ZXJvLiBUaGlzIGlzIGEgd3JhcC4gWW91IGNvdWxkIG9yIG9mZgorCSAqCXRoZSBoaWdoIGJpdHMgaW4gYWxsIHVwZGF0ZXMgYnV0IHRoaXMgaXMgYSBiaXQgZmFzdGVyIEkgdGhpbmsuCisJICovCisKKwlxID0gJmRldi0+cXVldWVzLT5xdWV1ZVtxaWRdOworCQorCSppbmRleCA9IGxlMzJfdG9fY3B1KCoocS0+aGVhZGVycy5wcm9kdWNlcikpOworCWlmICgoKmluZGV4IC0gMikgPT0gbGUzMl90b19jcHUoKihxLT5oZWFkZXJzLmNvbnN1bWVyKSkpCisJCQkqbm9ub3RpZnkgPSAxOyAKKworCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSkgeworCSAgICAgICAgaWYgKCppbmRleCA+PSBBREFQX0hJR0hfQ01EX0VOVFJJRVMpCisgICAgICAgIAkJKmluZGV4ID0gMDsKKwl9IGVsc2UgaWYgKHFpZCA9PSBBZGFwTm9ybUNtZFF1ZXVlKSB7CisJICAgICAgICBpZiAoKmluZGV4ID49IEFEQVBfTk9STV9DTURfRU5UUklFUykgCisJCQkqaW5kZXggPSAwOyAvKiBXcmFwIHRvIGZyb250IG9mIHRoZSBQcm9kdWNlciBRdWV1ZS4gKi8KKwl9CisJZWxzZSBpZiAocWlkID09IEFkYXBIaWdoUmVzcFF1ZXVlKSAKKwl7CisJICAgICAgICBpZiAoKmluZGV4ID49IEFEQVBfSElHSF9SRVNQX0VOVFJJRVMpCisJCQkqaW5kZXggPSAwOworCX0KKwllbHNlIGlmIChxaWQgPT0gQWRhcE5vcm1SZXNwUXVldWUpIAorCXsKKwkJaWYgKCppbmRleCA+PSBBREFQX05PUk1fUkVTUF9FTlRSSUVTKSAKKwkJCSppbmRleCA9IDA7IC8qIFdyYXAgdG8gZnJvbnQgb2YgdGhlIFByb2R1Y2VyIFF1ZXVlLiAqLworCX0KKwllbHNlIHsKKwkJcHJpbnRrKCJhYWNyYWlkOiBpbnZhbGlkIHFpZFxuIik7CisJCUJVRygpOworCX0KKworICAgICAgICBpZiAoKCppbmRleCArIDEpID09IGxlMzJfdG9fY3B1KCoocS0+aGVhZGVycy5jb25zdW1lcikpKSB7IC8qIFF1ZXVlIGlzIGZ1bGwgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUXVldWUgJWQgZnVsbCwgJWQgb3V0c3RhbmRpbmcuXG4iLAorCQkJCXFpZCwgcS0+bnVtcGVuZGluZyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJICAgICAgICAqZW50cnkgPSBxLT5iYXNlICsgKmluZGV4OworCQlyZXR1cm4gMTsKKwl9Cit9ICAgCisKKy8qKgorICoJYWFjX3F1ZXVlX2dldAkJLQlnZXQgdGhlIG5leHQgZnJlZSBRRQorICoJQGRldjogQWRhcHRlcgorICoJQGluZGV4OiBSZXR1cm5lZCBpbmRleAorICoJQHByaW9yaXR5OiBQcmlvcml0eSBvZiBmaWIKKyAqCUBmaWI6IEZpYiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcXVldWUgZW50cnkKKyAqCUB3YWl0OiBXYWl0IGlmIHF1ZXVlIGZ1bGwKKyAqCUBmaWJwdHI6IERyaXZlciBmaWIgb2JqZWN0IHRvIGdvIHdpdGggZmliCisgKglAbm9ub3RpZnk6IERvbid0IG5vdGlmeSB0aGUgYWRhcHRlcgorICoKKyAqCUdldHMgdGhlIG5leHQgZnJlZSBRRSBvZmYgdGhlIHJlcXVlc3RlZCBwcmlvcnR5IGFkYXB0ZXIgY29tbWFuZAorICoJcXVldWUgYW5kIGFzc29jaWF0ZXMgdGhlIEZpYiB3aXRoIHRoZSBRRS4gVGhlIFFFIHJlcHJlc2VudGVkIGJ5CisgKglpbmRleCBpcyByZWFkeSB0byBpbnNlcnQgb24gdGhlIHF1ZXVlIHdoZW4gdGhpcyByb3V0aW5lIHJldHVybnMKKyAqCXN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBhYWNfcXVldWVfZ2V0KHN0cnVjdCBhYWNfZGV2ICogZGV2LCB1MzIgKiBpbmRleCwgdTMyIHFpZCwgc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYiwgaW50IHdhaXQsIHN0cnVjdCBmaWIgKiBmaWJwdHIsIHVuc2lnbmVkIGxvbmcgKm5vbm90aWZ5KQoreworCXN0cnVjdCBhYWNfZW50cnkgKiBlbnRyeSA9IE5VTEw7CisJaW50IG1hcCA9IDA7CisJc3RydWN0IGFhY19xdWV1ZSAqIHEgPSAmZGV2LT5xdWV1ZXMtPnF1ZXVlW3FpZF07CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKHEtPmxvY2ssIHEtPlNhdmVkSXJxbCk7CisJICAgIAorCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSB8fCBxaWQgPT0gQWRhcE5vcm1DbWRRdWV1ZSkgCisJeworCQkvKiAgaWYgbm8gZW50cmllcyB3YWl0IGZvciBzb21lIGlmIGNhbGxlciB3YW50cyB0byAqLworICAgICAgICAJd2hpbGUgKCFhYWNfZ2V0X2VudHJ5KGRldiwgcWlkLCAmZW50cnksIGluZGV4LCBub25vdGlmeSkpIAorICAgICAgICAJeworCQkJcHJpbnRrKEtFUk5fRVJSICJHZXRFbnRyaWVzIGZhaWxlZFxuIik7CisJCX0KKwkgICAgICAgIC8qCisJICAgICAgICAgKglTZXR1cCBxdWV1ZSBlbnRyeSB3aXRoIGEgY29tbWFuZCwgc3RhdHVzIGFuZCBmaWIgbWFwcGVkCisJICAgICAgICAgKi8KKwkgICAgICAgIGVudHJ5LT5zaXplID0gY3B1X3RvX2xlMzIobGUxNl90b19jcHUoaHdfZmliLT5oZWFkZXIuU2l6ZSkpOworCSAgICAgICAgbWFwID0gMTsKKwl9CisJZWxzZSBpZiAocWlkID09IEFkYXBIaWdoUmVzcFF1ZXVlIHx8IHFpZCA9PSBBZGFwTm9ybVJlc3BRdWV1ZSkKKwl7CisJICAgICAgICB3aGlsZSghYWFjX2dldF9lbnRyeShkZXYsIHFpZCwgJmVudHJ5LCBpbmRleCwgbm9ub3RpZnkpKSAKKwkgICAgICAgIHsKKwkJCS8qIGlmIG5vIGVudHJpZXMgd2FpdCBmb3Igc29tZSBpZiBjYWxsZXIgd2FudHMgdG8gKi8KKwkJfQorICAgICAgICAJLyoKKyAgICAgICAgCSAqCVNldHVwIHF1ZXVlIGVudHJ5IHdpdGggY29tbWFuZCwgc3RhdHVzIGFuZCBmaWIgbWFwcGVkCisgICAgICAgIAkgKi8KKyAgICAgICAgCWVudHJ5LT5zaXplID0gY3B1X3RvX2xlMzIobGUxNl90b19jcHUoaHdfZmliLT5oZWFkZXIuU2l6ZSkpOworICAgICAgICAJZW50cnktPmFkZHIgPSBod19maWItPmhlYWRlci5TZW5kZXJGaWJBZGRyZXNzOworICAgICAJCQkvKiBSZXN0b3JlIGFkYXB0ZXJzIHBvaW50ZXIgdG8gdGhlIEZJQiAqLworCQlod19maWItPmhlYWRlci5SZWNlaXZlckZpYkFkZHJlc3MgPSBod19maWItPmhlYWRlci5TZW5kZXJGaWJBZGRyZXNzOwkvKiBMZXQgdGhlIGFkYXB0ZXIgbm93IHdoZXJlIHRvIGZpbmQgaXRzIGRhdGEgKi8KKyAgICAgICAgCW1hcCA9IDA7CisJfQorCS8qCisJICoJSWYgTWFwRmliIGlzIHRydWUgdGhhbiB3ZSBuZWVkIHRvIG1hcCB0aGUgRmliIGFuZCBwdXQgcG9pbnRlcnMKKwkgKglpbiB0aGUgcXVldWUgZW50cnkuCisJICovCisJaWYgKG1hcCkKKwkJZW50cnktPmFkZHIgPSBjcHVfdG9fbGUzMihmaWJwdHItPmh3X2ZpYl9wYSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKglhYWNfaW5zZXJ0X2VudHJ5CS0JaW5zZXJ0IGEgcXVldWUgZW50cnkKKyAqCUBkZXY6IEFkYXB0ZXIKKyAqCUBpbmRleDogSW5kZXggb2YgZW50cnkgdG8gaW5zZXJ0CisgKglAcWlkOiBRdWV1ZSBudW1iZXIKKyAqCUBub25vdGlmeTogU3VwcHJlc3MgYWRhcHRlciBub3RpZmljYXRpb24KKyAqCisgKglHZXRzIHRoZSBuZXh0IGZyZWUgUUUgb2ZmIHRoZSByZXF1ZXN0ZWQgcHJpb3J0eSBhZGFwdGVyIGNvbW1hbmQKKyAqCXF1ZXVlIGFuZCBhc3NvY2lhdGVzIHRoZSBGaWIgd2l0aCB0aGUgUUUuIFRoZSBRRSByZXByZXNlbnRlZCBieQorICoJaW5kZXggaXMgcmVhZHkgdG8gaW5zZXJ0IG9uIHRoZSBxdWV1ZSB3aGVuIHRoaXMgcm91dGluZSByZXR1cm5zCisgKglzdWNjZXNzLgorICovCisgCitzdGF0aWMgaW50IGFhY19pbnNlcnRfZW50cnkoc3RydWN0IGFhY19kZXYgKiBkZXYsIHUzMiBpbmRleCwgdTMyIHFpZCwgdW5zaWduZWQgbG9uZyBub25vdGlmeSkgCit7CisJc3RydWN0IGFhY19xdWV1ZSAqIHEgPSAmZGV2LT5xdWV1ZXMtPnF1ZXVlW3FpZF07CisKKwlpZihxID09IE5VTEwpCisJCUJVRygpOworCSoocS0+aGVhZGVycy5wcm9kdWNlcikgPSBjcHVfdG9fbGUzMihpbmRleCArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+bG9jaywgcS0+U2F2ZWRJcnFsKTsKKworCWlmIChxaWQgPT0gQWRhcEhpZ2hDbWRRdWV1ZSB8fAorCSAgICBxaWQgPT0gQWRhcE5vcm1DbWRRdWV1ZSB8fAorCSAgICBxaWQgPT0gQWRhcEhpZ2hSZXNwUXVldWUgfHwKKwkgICAgcWlkID09IEFkYXBOb3JtUmVzcFF1ZXVlKQorCXsKKwkJaWYgKCFub25vdGlmeSkKKwkJCWFhY19hZGFwdGVyX25vdGlmeShkZXYsIHFpZCk7CisJfQorCWVsc2UKKwkJcHJpbnRrKCJTdXByaXNlIGluc2VydCFcbiIpOworCXJldHVybiAwOworfQorCisvKgorICoJRGVmaW5lIHRoZSBoaWdoZXN0IGxldmVsIG9mIGhvc3QgdG8gYWRhcHRlciBjb21tdW5pY2F0aW9uIHJvdXRpbmVzLiAKKyAqCVRoZXNlIHJvdXRpbmVzIHdpbGwgc3VwcG9ydCBob3N0IHRvIGFkYXB0ZXIgRlMgY29tbXVpY2F0aW9uLiBUaGVzZSAKKyAqCXJvdXRpbmVzIGhhdmUgbm8ga25vd2xlZGdlIG9mIHRoZSBjb21tdWljYXRpb24gbWV0aG9kIHVzZWQuIFRoaXMgbGV2ZWwKKyAqCXNlbmRzIGFuZCByZWNlaXZlcyBGSUJzLiBUaGlzIGxldmVsIGhhcyBubyBrbm93bGVkZ2Ugb2YgaG93IHRoZXNlIEZJQnMKKyAqCWdldCBwYXNzZWQgYmFjayBhbmQgZm9ydGguCisgKi8KKworLyoqCisgKglmaWJfc2VuZAktCXNlbmQgYSBmaWIgdG8gdGhlIGFkYXB0ZXIKKyAqCUBjb21tYW5kOiBDb21tYW5kIHRvIHNlbmQKKyAqCUBmaWJwdHI6IFRoZSBmaWIKKyAqCUBzaXplOiBTaXplIG9mIGZpYiBkYXRhIGFyZWEKKyAqCUBwcmlvcml0eTogUHJpb3JpdHkgb2YgRmliCisgKglAd2FpdDogQXN5bmMvc3luYyBzZWxlY3QKKyAqCUByZXBseTogVHJ1ZSBpZiBhIHJlcGx5IGlzIHdhbnRlZAorICoJQGNhbGxiYWNrOiBDYWxsZWQgd2l0aCByZXBseQorICoJQGNhbGxiYWNrX2RhdGE6IFBhc3NlZCB0byBjYWxsYmFjaworICoKKyAqCVNlbmRzIHRoZSByZXF1ZXN0ZWQgRklCIHRvIHRoZSBhZGFwdGVyIGFuZCBvcHRpb25hbGx5IHdpbGwgd2FpdCBmb3IgYQorICoJcmVzcG9uc2UgRklCLiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IHdpc2ggdG8gd2FpdCBmb3IgYSByZXNwb25zZSB0aGFuCisgKglhbiBldmVudCB0byB3YWl0IG9uIG11c3QgYmUgc3VwcGxpZWQuIFRoaXMgZXZlbnQgd2lsbCBiZSBzZXQgd2hlbiBhCisgKglyZXNwb25zZSBGSUIgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgYWRhcHRlci4KKyAqLworIAoraW50IGZpYl9zZW5kKHUxNiBjb21tYW5kLCBzdHJ1Y3QgZmliICogZmlicHRyLCB1bnNpZ25lZCBsb25nIHNpemUsICBpbnQgcHJpb3JpdHksIGludCB3YWl0LCBpbnQgcmVwbHksIGZpYl9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqIGNhbGxiYWNrX2RhdGEpCit7CisJdTMyIGluZGV4OworCXUzMiBxaWQ7CisJc3RydWN0IGFhY19kZXYgKiBkZXYgPSBmaWJwdHItPmRldjsKKwl1bnNpZ25lZCBsb25nIG5vaW50ciA9IDA7CisJc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYiA9IGZpYnB0ci0+aHdfZmliOworCXN0cnVjdCBhYWNfcXVldWUgKiBxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWlmICghKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIGNwdV90b19sZTMyKEhvc3RPd25lZCkpKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICoJVGhlcmUgYXJlIDUgY2FzZXMgd2l0aCB0aGUgd2FpdCBhbmQgcmVwb25zZSByZXF1ZXN0ZWQgZmxhZ3MuIAorCSAqCVRoZSBvbmx5IGludmFsaWQgY2FzZXMgYXJlIGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgdG8gd2FpdCBhbmQKKwkgKglkb2VzIG5vdCByZXF1ZXN0IGEgcmVzcG9uc2UgYW5kIGlmIHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCBhCisJICoJcmVzcG9uc2UgYW5kIHRoZSBGaWIgaXMgbm90IGFsbG9jYXRlZCBmcm9tIHBvb2wuIElmIGEgcmVzcG9uc2UKKwkgKglpcyBub3QgcmVxdWVzZWQgdGhlIEZpYiB3aWxsIGp1c3QgYmUgZGVhbGxvY2FlZCBieSB0aGUgRFBDCisJICoJcm91dGluZSB3aGVuIHRoZSByZXNwb25zZSBjb21lcyBiYWNrIGZyb20gdGhlIGFkYXB0ZXIuIE5vCisJICoJZnVydGhlciBwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZSBiZXNpZGVzIGRlbGV0aW5nIHRoZSBGaWIuIFdlIAorCSAqCXdpbGwgaGF2ZSBhIGRlYnVnIG1vZGUgd2hlcmUgdGhlIGFkYXB0ZXIgY2FuIG5vdGlmeSB0aGUgaG9zdAorCSAqCWl0IGhhZCBhIHByb2JsZW0gYW5kIHRoZSBob3N0IGNhbiBsb2cgdGhhdCBmYWN0LgorCSAqLworCWlmICh3YWl0ICYmICFyZXBseSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCF3YWl0ICYmIHJlcGx5KSB7CisJCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSB8PSBjcHVfdG9fbGUzMihBc3luYyB8IFJlc3BvbnNlRXhwZWN0ZWQpOworCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5Bc3luY1NlbnQpOworCX0gZWxzZSBpZiAoIXdhaXQgJiYgIXJlcGx5KSB7CisJCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSB8PSBjcHVfdG9fbGUzMihOb1Jlc3BvbnNlRXhwZWN0ZWQpOworCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5Ob1Jlc3BvbnNlU2VudCk7CisJfSBlbHNlIGlmICh3YWl0ICYmIHJlcGx5KSB7CisJCWh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSB8PSBjcHVfdG9fbGUzMihSZXNwb25zZUV4cGVjdGVkKTsKKwkJRklCX0NPVU5URVJfSU5DUkVNRU5UKGFhY19jb25maWcuTm9ybWFsU2VudCk7CisJfSAKKwkvKgorCSAqCU1hcCB0aGUgZmliIGludG8gMzJiaXRzIGJ5IHVzaW5nIHRoZSBmaWIgbnVtYmVyCisJICovCisKKwlod19maWItPmhlYWRlci5TZW5kZXJGaWJBZGRyZXNzID0gY3B1X3RvX2xlMzIoKCh1MzIpKGZpYnB0ci1kZXYtPmZpYnMpKSA8PCAxKTsKKwlod19maWItPmhlYWRlci5TZW5kZXJEYXRhID0gKHUzMikoZmlicHRyIC0gZGV2LT5maWJzKTsKKwkvKgorCSAqCVNldCBGSUIgc3RhdGUgdG8gaW5kaWNhdGUgd2hlcmUgaXQgY2FtZSBmcm9tIGFuZCBpZiB3ZSB3YW50IGEKKwkgKglyZXNwb25zZSBmcm9tIHRoZSBhZGFwdGVyLiBBbHNvIGxvYWQgdGhlIGNvbW1hbmQgZnJvbSB0aGUKKwkgKgljYWxsZXIuCisJICoKKwkgKglNYXAgdGhlIGh3IGZpYiBwb2ludGVyIGFzIGEgMzJiaXQgdmFsdWUKKwkgKi8KKwlod19maWItPmhlYWRlci5Db21tYW5kID0gY3B1X3RvX2xlMTYoY29tbWFuZCk7CisJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlIHw9IGNwdV90b19sZTMyKFNlbnRGcm9tSG9zdCk7CisJZmlicHRyLT5od19maWItPmhlYWRlci5GbGFncyA9IDA7CS8qIDAgdGhlIGZsYWdzIGZpZWxkIC0gaW50ZXJuYWwgb25seSovCisJLyoKKwkgKglTZXQgdGhlIHNpemUgb2YgdGhlIEZpYiB3ZSB3YW50IHRvIHNlbmQgdG8gdGhlIGFkYXB0ZXIKKwkgKi8KKwlod19maWItPmhlYWRlci5TaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSArIHNpemUpOworCWlmIChsZTE2X3RvX2NwdShod19maWItPmhlYWRlci5TaXplKSA+IGxlMTZfdG9fY3B1KGh3X2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpKSB7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfSAgICAgICAgICAgICAgICAKKwkvKgorCSAqCUdldCBhIHF1ZXVlIGVudHJ5IGNvbm5lY3QgdGhlIEZJQiB0byBpdCBhbmQgc2VuZCBhbiBub3RpZnkKKwkgKgl0aGUgYWRhcHRlciBhIGNvbW1hbmQgaXMgcmVhZHkuCisJICovCisJaWYgKHByaW9yaXR5ID09IEZzYUhpZ2gpIHsKKwkJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlIHw9IGNwdV90b19sZTMyKEhpZ2hQcmlvcml0eSk7CisJCXFpZCA9IEFkYXBIaWdoQ21kUXVldWU7CisJfSBlbHNlIHsKKwkJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlIHw9IGNwdV90b19sZTMyKE5vcm1hbFByaW9yaXR5KTsKKwkJcWlkID0gQWRhcE5vcm1DbWRRdWV1ZTsKKwl9CisJcSA9ICZkZXYtPnF1ZXVlcy0+cXVldWVbcWlkXTsKKworCWlmKHdhaXQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZmaWJwdHItPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlpZihhYWNfcXVldWVfZ2V0KCBkZXYsICZpbmRleCwgcWlkLCBod19maWIsIDEsIGZpYnB0ciwgJm5vaW50cik8MCkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICJmaWJfc2VuZDogaW5zZXJ0aW5nIGEgcXVldWUgZW50cnkgYXQgaW5kZXggJWQuXG4iLGluZGV4KSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiRmliIGNvbnRlbnRzOi5cbiIpKTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICIgIENvbW1hbmQgPSAgICAgICAgICAgICAgICVkLlxuIiwgaHdfZmliLT5oZWFkZXIuQ29tbWFuZCkpOworCWRwcmludGsoKEtFUk5fREVCVUcgIiAgWGZlclN0YXRlICA9ICAgICAgICAgICAgJXguXG4iLCBod19maWItPmhlYWRlci5YZmVyU3RhdGUpKTsKKwlkcHJpbnRrKChLRVJOX0RFQlVHICIgIGh3X2ZpYiB2YSBiZWluZyBzZW50PSVwXG4iLGZpYnB0ci0+aHdfZmliKSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiICBod19maWIgcGEgYmVpbmcgc2VudD0lbHhcbiIsKHVsb25nKWZpYnB0ci0+aHdfZmliX3BhKSk7CisJZHByaW50aygoS0VSTl9ERUJVRyAiICBmaWIgYmVpbmcgc2VudD0lcFxuIixmaWJwdHIpKTsKKwkvKgorCSAqCUZpbGwgaW4gdGhlIENhbGxiYWNrIGFuZCBDYWxsYmFja0NvbnRleHQgaWYgd2UgYXJlIG5vdAorCSAqCWdvaW5nIHRvIHdhaXQuCisJICovCisJaWYgKCF3YWl0KSB7CisJCWZpYnB0ci0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJZmlicHRyLT5jYWxsYmFja19kYXRhID0gY2FsbGJhY2tfZGF0YTsKKwl9CisJRklCX0NPVU5URVJfSU5DUkVNRU5UKGFhY19jb25maWcuRmlic1NlbnQpOworCWxpc3RfYWRkX3RhaWwoJmZpYnB0ci0+cXVldWUsICZxLT5wZW5kaW5ncSk7CisJcS0+bnVtcGVuZGluZysrOworCisJZmlicHRyLT5kb25lID0gMDsKKwlmaWJwdHItPmZsYWdzID0gMDsKKworCWlmKGFhY19pbnNlcnRfZW50cnkoZGV2LCBpbmRleCwgcWlkLCAobm9pbnRyICYgYWFjX2NvbmZpZy5pcnFfbW9kKSkgPCAwKQorCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCS8qCisJICoJSWYgdGhlIGNhbGxlciB3YW50ZWQgdXMgdG8gd2FpdCBmb3IgcmVzcG9uc2Ugd2FpdCBub3cuIAorCSAqLworICAgIAorCWlmICh3YWl0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpYnB0ci0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlkb3duKCZmaWJwdHItPmV2ZW50X3dhaXQpOworCQlpZihmaWJwdHItPmRvbmUgPT0gMCkKKwkJCUJVRygpOworCQkJCisJCWlmKChmaWJwdHItPmZsYWdzICYgRklCX0NPTlRFWFRfRkxBR19USU1FRF9PVVQpKXsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgKglJZiB0aGUgdXNlciBkb2VzIG5vdCB3YW50IGEgcmVzcG9uc2UgdGhhbiByZXR1cm4gc3VjY2VzcyBvdGhlcndpc2UKKwkgKglyZXR1cm4gcGVuZGluZworCSAqLworCWlmIChyZXBseSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiogCisgKglhYWNfY29uc3VtZXJfZ2V0CS0JZ2V0IHRoZSB0b3Agb2YgdGhlIHF1ZXVlCisgKglAZGV2OiBBZGFwdGVyCisgKglAcTogUXVldWUKKyAqCUBlbnRyeTogUmV0dXJuIGVudHJ5CisgKgorICoJV2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBvbiB0aGUgdG9wIG9mIHRoZSBxdWV1ZSByZXF1ZXN0ZWQgdGhhdAorICogCXdlIGFyZSBhIGNvbnN1bWVyIG9mLCBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBxdWV1ZSBlbnRyeS4gSXQgZG9lcworICoJbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHF1ZXVlLiAKKyAqLworCitpbnQgYWFjX2NvbnN1bWVyX2dldChzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IGFhY19xdWV1ZSAqIHEsIHN0cnVjdCBhYWNfZW50cnkgKiplbnRyeSkKK3sKKwl1MzIgaW5kZXg7CisJaW50IHN0YXR1czsKKwlpZiAobGUzMl90b19jcHUoKnEtPmhlYWRlcnMucHJvZHVjZXIpID09IGxlMzJfdG9fY3B1KCpxLT5oZWFkZXJzLmNvbnN1bWVyKSkgeworCQlzdGF0dXMgPSAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqCVRoZSBjb25zdW1lciBpbmRleCBtdXN0IGJlIHdyYXBwZWQgaWYgd2UgaGF2ZSByZWFjaGVkCisJCSAqCXRoZSBlbmQgb2YgdGhlIHF1ZXVlLCBlbHNlIHdlIGp1c3QgdXNlIHRoZSBlbnRyeQorCQkgKglwb2ludGVkIHRvIGJ5IHRoZSBoZWFkZXIgaW5kZXgKKwkJICovCisJCWlmIChsZTMyX3RvX2NwdSgqcS0+aGVhZGVycy5jb25zdW1lcikgPj0gcS0+ZW50cmllcykgCisJCQlpbmRleCA9IDA7CQkKKwkJZWxzZQorCQkgICAgICAgIGluZGV4ID0gbGUzMl90b19jcHUoKnEtPmhlYWRlcnMuY29uc3VtZXIpOworCQkqZW50cnkgPSBxLT5iYXNlICsgaW5kZXg7CisJCXN0YXR1cyA9IDE7CisJfQorCXJldHVybihzdGF0dXMpOworfQorCisvKioKKyAqCWFhY19jb25zdW1lcl9mcmVlCS0JZnJlZSBjb25zdW1lciBlbnRyeQorICoJQGRldjogQWRhcHRlcgorICoJQHE6IFF1ZXVlCisgKglAcWlkOiBRdWV1ZSBpZGVudAorICoKKyAqCUZyZWVzIHVwIHRoZSBjdXJyZW50IHRvcCBvZiB0aGUgcXVldWUgd2UgYXJlIGEgY29uc3VtZXIgb2YuIElmIHRoZQorICoJcXVldWUgd2FzIGZ1bGwgbm90aWZ5IHRoZSBwcm9kdWNlciB0aGF0IHRoZSBxdWV1ZSBpcyBubyBsb25nZXIgZnVsbC4KKyAqLworCit2b2lkIGFhY19jb25zdW1lcl9mcmVlKHN0cnVjdCBhYWNfZGV2ICogZGV2LCBzdHJ1Y3QgYWFjX3F1ZXVlICpxLCB1MzIgcWlkKQoreworCWludCB3YXNmdWxsID0gMDsKKwl1MzIgbm90aWZ5OworCisJaWYgKChsZTMyX3RvX2NwdSgqcS0+aGVhZGVycy5wcm9kdWNlcikrMSkgPT0gbGUzMl90b19jcHUoKnEtPmhlYWRlcnMuY29uc3VtZXIpKQorCQl3YXNmdWxsID0gMTsKKyAgICAgICAgCisJaWYgKGxlMzJfdG9fY3B1KCpxLT5oZWFkZXJzLmNvbnN1bWVyKSA+PSBxLT5lbnRyaWVzKQorCQkqcS0+aGVhZGVycy5jb25zdW1lciA9IGNwdV90b19sZTMyKDEpOworCWVsc2UKKwkJKnEtPmhlYWRlcnMuY29uc3VtZXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqcS0+aGVhZGVycy5jb25zdW1lcikrMSk7CisgICAgICAgIAorCWlmICh3YXNmdWxsKSB7CisJCXN3aXRjaCAocWlkKSB7CisKKwkJY2FzZSBIb3N0Tm9ybUNtZFF1ZXVlOgorCQkJbm90aWZ5ID0gSG9zdE5vcm1DbWROb3RGdWxsOworCQkJYnJlYWs7CisJCWNhc2UgSG9zdEhpZ2hDbWRRdWV1ZToKKwkJCW5vdGlmeSA9IEhvc3RIaWdoQ21kTm90RnVsbDsKKwkJCWJyZWFrOworCQljYXNlIEhvc3ROb3JtUmVzcFF1ZXVlOgorCQkJbm90aWZ5ID0gSG9zdE5vcm1SZXNwTm90RnVsbDsKKwkJCWJyZWFrOworCQljYXNlIEhvc3RIaWdoUmVzcFF1ZXVlOgorCQkJbm90aWZ5ID0gSG9zdEhpZ2hSZXNwTm90RnVsbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlyZXR1cm47CisJCX0KKwkJYWFjX2FkYXB0ZXJfbm90aWZ5KGRldiwgbm90aWZ5KTsKKwl9Cit9ICAgICAgICAKKworLyoqCisgKglmaWJfYWRhcHRlcl9jb21wbGV0ZQktCWNvbXBsZXRlIGFkYXB0ZXIgaXNzdWVkIGZpYgorICoJQGZpYnB0cjogZmliIHRvIGNvbXBsZXRlCisgKglAc2l6ZTogc2l6ZSBvZiBmaWIKKyAqCisgKglXaWxsIGRvIGFsbCBuZWNlc3Nhcnkgd29yayB0byBjb21wbGV0ZSBhIEZJQiB0aGF0IHdhcyBzZW50IGZyb20KKyAqCXRoZSBhZGFwdGVyLgorICovCisKK2ludCBmaWJfYWRhcHRlcl9jb21wbGV0ZShzdHJ1Y3QgZmliICogZmlicHRyLCB1bnNpZ25lZCBzaG9ydCBzaXplKQoreworCXN0cnVjdCBod19maWIgKiBod19maWIgPSBmaWJwdHItPmh3X2ZpYjsKKwlzdHJ1Y3QgYWFjX2RldiAqIGRldiA9IGZpYnB0ci0+ZGV2OworCXVuc2lnbmVkIGxvbmcgbm9pbnRyID0gMDsKKwlpZiAoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlID09IDApCisgICAgICAgIAlyZXR1cm4gMDsKKwkvKgorCSAqCUlmIHdlIHBsYW4gdG8gZG8gYW55dGhpbmcgY2hlY2sgdGhlIHN0cnVjdHVyZSB0eXBlIGZpcnN0LgorCSAqLyAKKwlpZiAoIGh3X2ZpYi0+aGVhZGVyLlN0cnVjdFR5cGUgIT0gRklCX01BR0lDICkgeworICAgICAgICAJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICoJVGhpcyBibG9jayBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBhZGFwdGVyIGhhZCBzZW50IHVzIGEKKwkgKgljb21tYW5kIGFuZCB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIGNvbW1hbmQuIFdlCisJICoJY2FsbCBjb21wbGV0ZUZpYiB3aGVuIHdlIGFyZSBkb25lIHByb2Nlc3NpbmcgdGhlIGNvbW1hbmQgCisJICoJYW5kIHdhbnQgdG8gc2VuZCBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgd2lsbCAKKwkgKglzZW5kIHRoZSBjb21wbGV0ZWQgY2RiIHRvIHRoZSBhZGFwdGVyLgorCSAqLworCWlmIChod19maWItPmhlYWRlci5YZmVyU3RhdGUgJiBjcHVfdG9fbGUzMihTZW50RnJvbUFkYXB0ZXIpKSB7CisJICAgICAgICBod19maWItPmhlYWRlci5YZmVyU3RhdGUgfD0gY3B1X3RvX2xlMzIoSG9zdFByb2Nlc3NlZCk7CisJICAgICAgICBpZiAoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoSGlnaFByaW9yaXR5KSkgeworICAgICAgICAJCXUzMiBpbmRleDsKKyAgICAgICAJCQlpZiAoc2l6ZSkgCisJCQl7CisJCQkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpOworCQkJCWlmIChzaXplID4gbGUxNl90b19jcHUoaHdfZmliLT5oZWFkZXIuU2VuZGVyU2l6ZSkpCisJCQkJCXJldHVybiAtRU1TR1NJWkU7CisJCQkJaHdfZmliLT5oZWFkZXIuU2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOworCQkJfQorCQkJaWYoYWFjX3F1ZXVlX2dldChkZXYsICZpbmRleCwgQWRhcEhpZ2hSZXNwUXVldWUsIGh3X2ZpYiwgMSwgTlVMTCwgJm5vaW50cikgPCAwKSB7CisJCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJCX0KKwkJCWlmIChhYWNfaW5zZXJ0X2VudHJ5KGRldiwgaW5kZXgsIEFkYXBIaWdoUmVzcFF1ZXVlLCAgKG5vaW50ciAmIChpbnQpYWFjX2NvbmZpZy5pcnFfbW9kKSkgIT0gMCkgeworCQkJfQorCQl9CisJCWVsc2UgaWYgKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIE5vcm1hbFByaW9yaXR5KSAKKwkJeworCQkJdTMyIGluZGV4OworCisJCQlpZiAoc2l6ZSkgeworCQkJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKTsKKwkJCQlpZiAoc2l6ZSA+IGxlMTZfdG9fY3B1KGh3X2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpKSAKKwkJCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJCQlod19maWItPmhlYWRlci5TaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisJCQl9CisJCQlpZiAoYWFjX3F1ZXVlX2dldChkZXYsICZpbmRleCwgQWRhcE5vcm1SZXNwUXVldWUsIGh3X2ZpYiwgMSwgTlVMTCwgJm5vaW50cikgPCAwKSAKKwkJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQkJaWYgKGFhY19pbnNlcnRfZW50cnkoZGV2LCBpbmRleCwgQWRhcE5vcm1SZXNwUXVldWUsIChub2ludHIgJiAoaW50KWFhY19jb25maWcuaXJxX21vZCkpICE9IDApIAorCQkJeworCQkJfQorCQl9CisJfQorCWVsc2UgCisJeworICAgICAgICAJcHJpbnRrKEtFUk5fV0FSTklORyAiZmliX2FkYXB0ZXJfY29tcGxldGU6IFVua25vd24geGZlcnN0YXRlIGRldGVjdGVkLlxuIik7CisgICAgICAgIAlCVUcoKTsKKwl9ICAgCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJZmliX2NvbXBsZXRlCS0JZmliIGNvbXBsZXRpb24gaGFuZGxlcgorICoJQGZpYjogRklCIHRvIGNvbXBsZXRlCisgKgorICoJV2lsbCBkbyBhbGwgbmVjZXNzYXJ5IHdvcmsgdG8gY29tcGxldGUgYSBGSUIuCisgKi8KKyAKK2ludCBmaWJfY29tcGxldGUoc3RydWN0IGZpYiAqIGZpYnB0cikKK3sKKwlzdHJ1Y3QgaHdfZmliICogaHdfZmliID0gZmlicHRyLT5od19maWI7CisKKwkvKgorCSAqCUNoZWNrIGZvciBhIGZpYiB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZAorCSAqLworCisJaWYgKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSA9PSAwKQorICAgICAgICAJcmV0dXJuIDA7CisJLyoKKwkgKglJZiB3ZSBwbGFuIHRvIGRvIGFueXRoaW5nIGNoZWNrIHRoZSBzdHJ1Y3R1cmUgdHlwZSBmaXJzdC4KKwkgKi8gCisKKwlpZiAoaHdfZmliLT5oZWFkZXIuU3RydWN0VHlwZSAhPSBGSUJfTUFHSUMpCisJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqCVRoaXMgYmxvY2sgY29tcGxldGVzIGEgY2RiIHdoaWNoIG9yZ2luYXRlZCBvbiB0aGUgaG9zdCBhbmQgd2UgCisJICoJanVzdCBuZWVkIHRvIGRlYWxsb2NhdGUgdGhlIGNkYiBvciByZWluaXQgaXQuIEF0IHRoaXMgcG9pbnQgdGhlCisJICoJY29tbWFuZCBpcyBjb21wbGV0ZSB0aGF0IHdlIGhhZCBzZW50IHRvIHRoZSBhZGFwdGVyIGFuZCB0aGlzCisJICoJY2RiIGNvdWxkIGJlIHJldXNlZC4KKwkgKi8KKwlpZigoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoU2VudEZyb21Ib3N0KSkgJiYKKwkJKGh3X2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIGNwdV90b19sZTMyKEFkYXB0ZXJQcm9jZXNzZWQpKSkKKwl7CisJCWZpYl9kZWFsbG9jKGZpYnB0cik7CisJfQorCWVsc2UgaWYoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoU2VudEZyb21Ib3N0KSkKKwl7CisJCS8qCisJCSAqCVRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHRoZSBob3N0IGhhcyBhYm9ydGVkIHRoZSBJL08KKwkJICoJdG8gdGhlIGFkYXB0ZXIgYmVjYXVzZSB0aGUgYWRhcHRlciBpcyBub3QgcmVzcG9uZGluZworCQkgKi8KKwkJZmliX2RlYWxsb2MoZmlicHRyKTsKKwl9IGVsc2UgaWYoaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoSG9zdE93bmVkKSkgeworCQlmaWJfZGVhbGxvYyhmaWJwdHIpOworCX0gZWxzZSB7CisJCUJVRygpOworCX0gICAKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhYWNfcHJpbnRmCS0JaGFuZGxlIHByaW50ZiBmcm9tIGZpcm13YXJlCisgKglAZGV2OiBBZGFwdGVyCisgKglAdmFsOiBNZXNzYWdlIGluZm8KKyAqCisgKglQcmludCBhIG1lc3NhZ2UgcGFzc2VkIHRvIHVzIGJ5IHRoZSBjb250cm9sbGVyIGZpcm13YXJlIG9uIHRoZQorICoJQWRhcHRlYyBib2FyZAorICovCisKK3ZvaWQgYWFjX3ByaW50ZihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgdmFsKQoreworCWludCBsZW5ndGggPSB2YWwgJiAweGZmZmY7CisJaW50IGxldmVsID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJY2hhciAqY3AgPSBkZXYtPnByaW50ZmJ1ZjsKKwkKKwkvKgorCSAqCVRoZSBzaXplIG9mIHRoZSBwcmludGZidWYgaXMgc2V0IGluIHBvcnQuYworCSAqCVRoZXJlIGlzIG5vIHZhcmlhYmxlIG9yIGRlZmluZSBmb3IgaXQKKwkgKi8KKwlpZiAobGVuZ3RoID4gMjU1KQorCQlsZW5ndGggPSAyNTU7CisJaWYgKGNwW2xlbmd0aF0gIT0gMCkKKwkJY3BbbGVuZ3RoXSA9IDA7CisJaWYgKGxldmVsID09IExPR19BQUNfSElHSF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDolcyIsIGNwKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gImFhY3JhaWQ6JXMiLCBjcCk7CisJbWVtc2V0KGNwLCAwLCAgMjU2KTsKK30KKworLyoqCisgKglhYWNfY29tbWFuZF90aHJlYWQJLQljb21tYW5kIHByb2Nlc3NpbmcgdGhyZWFkCisgKglAZGV2OiBBZGFwdGVyIHRvIG1vbml0b3IKKyAqCisgKglXYWl0cyBvbiB0aGUgY29tbWFuZHJlYWR5IGV2ZW50IGluIGl0J3MgcXVldWUuIFdoZW4gdGhlIGV2ZW50IGdldHMgc2V0CisgKglpdCB3aWxsIHB1bGwgRklCcyBvZmYgaXQncyBxdWV1ZS4gSXQgd2lsbCBjb250aW51ZSB0byBwdWxsIEZJQnMgb2ZmCisgKgl1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkuIFdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5IGl0IHdpbGwgd2FpdCBmb3IKKyAqCW1vcmUgRklCcy4KKyAqLworIAoraW50IGFhY19jb21tYW5kX3RocmVhZChzdHJ1Y3QgYWFjX2RldiAqIGRldikKK3sKKwlzdHJ1Y3QgaHdfZmliICpod19maWIsICpod19uZXdmaWI7CisJc3RydWN0IGZpYiAqZmliLCAqbmV3ZmliOworCXN0cnVjdCBhYWNfcXVldWVfYmxvY2sgKnF1ZXVlcyA9IGRldi0+cXVldWVzOworCXN0cnVjdCBhYWNfZmliX2NvbnRleHQgKmZpYmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyoKKwkgKglXZSBjYW4gb25seSBoYXZlIG9uZSB0aHJlYWQgcGVyIGFkYXB0ZXIgZm9yIEFJRidzLgorCSAqLworCWlmIChkZXYtPmFpZl90aHJlYWQpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICoJU2V0IHVwIHRoZSBuYW1lIHRoYXQgd2lsbCBhcHBlYXIgaW4gJ3BzJworCSAqCXN0b3JlZCBpbiAgdGFza19zdHJ1Y3QuY29tbVsxNl0uCisJICovCisJZGFlbW9uaXplKCJhYWNyYWlkIik7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCS8qCisJICoJTGV0IHRoZSBEUEMga25vdyBpdCBoYXMgYSBwbGFjZSB0byBzZW5kIHRoZSBBSUYncyB0by4KKwkgKi8KKwlkZXYtPmFpZl90aHJlYWQgPSAxOworCWFkZF93YWl0X3F1ZXVlKCZxdWV1ZXMtPnF1ZXVlW0hvc3ROb3JtQ21kUXVldWVdLmNtZHJlYWR5LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSgxKSAKKwl7CisJCXNwaW5fbG9ja19pcnFzYXZlKHF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0ubG9jaywgZmxhZ3MpOworCQl3aGlsZSghbGlzdF9lbXB0eSgmKHF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0uY21kcSkpKSB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwkJCXN0cnVjdCBhYWNfYWlmY21kICogYWlmY21kOworCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkKKwkJCWVudHJ5ID0gcXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5jbWRxLm5leHQ7CisJCQlsaXN0X2RlbChlbnRyeSk7CisJCQkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5sb2NrLCBmbGFncyk7CisJCQlmaWIgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZmliLCBmaWJsaW5rKTsKKwkJCS8qCisJCQkgKglXZSB3aWxsIHByb2Nlc3MgdGhlIEZJQiBoZXJlIG9yIHBhc3MgaXQgdG8gYSAKKwkJCSAqCXdvcmtlciB0aHJlYWQgdGhhdCBpcyBUQkQuIFdlIFJlYWxseSBjYW4ndCAKKwkJCSAqCWRvIGFueXRoaW5nIGF0IHRoaXMgcG9pbnQgc2luY2Ugd2UgZG9uJ3QgaGF2ZQorCQkJICoJYW55dGhpbmcgZGVmaW5lZCBmb3IgdGhpcyB0aHJlYWQgdG8gZG8uCisJCQkgKi8KKwkJCWh3X2ZpYiA9IGZpYi0+aHdfZmliOworCQkJbWVtc2V0KGZpYiwgMCwgc2l6ZW9mKHN0cnVjdCBmaWIpKTsKKwkJCWZpYi0+dHlwZSA9IEZTQUZTX05UQ19GSUJfQ09OVEVYVDsKKwkJCWZpYi0+c2l6ZSA9IHNpemVvZiggc3RydWN0IGZpYiApOworCQkJZmliLT5od19maWIgPSBod19maWI7CisJCQlmaWItPmRhdGEgPSBod19maWItPmRhdGE7CisJCQlmaWItPmRldiA9IGRldjsKKwkJCS8qCisJCQkgKglXZSBvbmx5IGhhbmRsZSBBaWZSZXF1ZXN0IGZpYnMgZnJvbSB0aGUgYWRhcHRlci4KKwkJCSAqLworCQkJYWlmY21kID0gKHN0cnVjdCBhYWNfYWlmY21kICopIGh3X2ZpYi0+ZGF0YTsKKwkJCWlmIChhaWZjbWQtPmNvbW1hbmQgPT0gY3B1X3RvX2xlMzIoQWlmQ21kRHJpdmVyTm90aWZ5KSkgeworCQkJCS8qIEhhbmRsZSBEcml2ZXIgTm90aWZ5IEV2ZW50cyAqLworCQkJCSoodTMyICopaHdfZmliLT5kYXRhID0gY3B1X3RvX2xlMzIoU1RfT0spOworCQkJCWZpYl9hZGFwdGVyX2NvbXBsZXRlKGZpYiwgc2l6ZW9mKHUzMikpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwkJCQkvKiBUaGUgdTMyIGhlcmUgaXMgaW1wb3J0YW50IGFuZCBpbnRlbmRlZC4gV2UgYXJlIHVzaW5nCisJCQkJICAgMzJiaXQgd3JhcHBpbmcgdGltZSB0byBmaXQgdGhlIGFkYXB0ZXIgZmllbGQgKi8KKwkJCQkgICAKKwkJCQl1MzIgdGltZV9ub3csIHRpbWVfbGFzdDsKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWd2OworCQkJCQorCQkJCXRpbWVfbm93ID0gamlmZmllcy9IWjsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFndik7CisJCQkJZW50cnkgPSBkZXYtPmZpYl9saXN0Lm5leHQ7CisJCQkJLyoKKwkJCQkgKiBGb3IgZWFjaCBDb250ZXh0IHRoYXQgaXMgb24gdGhlIAorCQkJCSAqIGZpYmN0eExpc3QsIG1ha2UgYSBjb3B5IG9mIHRoZQorCQkJCSAqIGZpYiwgYW5kIHRoZW4gc2V0IHRoZSBldmVudCB0byB3YWtlIHVwIHRoZQorCQkJCSAqIHRocmVhZCB0aGF0IGlzIHdhaXRpbmcgZm9yIGl0LgorCQkJCSAqLworCQkJCXdoaWxlIChlbnRyeSAhPSAmZGV2LT5maWJfbGlzdCkgeworCQkJCQkvKgorCQkJCQkgKiBFeHRyYWN0IHRoZSBmaWJjdHgKKwkJCQkJICovCisJCQkJCWZpYmN0eCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhYWNfZmliX2NvbnRleHQsIG5leHQpOworCQkJCQkvKgorCQkJCQkgKiBDaGVjayBpZiB0aGUgcXVldWUgaXMgZ2V0dGluZworCQkJCQkgKiBiYWNrbG9nZ2VkCisJCQkJCSAqLworCQkJCQlpZiAoZmliY3R4LT5jb3VudCA+IDIwKQorCQkJCQl7CisJCQkJCQkvKgorCQkJCQkJICogSXQncyAqbm90KiBqaWZmaWVzIGZvbGtzLAorCQkJCQkJICogYnV0IGppZmZpZXMgLyBIWiBzbyBkbyBub3QKKwkJCQkJCSAqIHBhbmljIC4uLgorCQkJCQkJICovCisJCQkJCQl0aW1lX2xhc3QgPSBmaWJjdHgtPmppZmZpZXM7CisJCQkJCQkvKgorCQkJCQkJICogSGFzIGl0IGJlZW4gPiAyIG1pbnV0ZXMgCisJCQkJCQkgKiBzaW5jZSB0aGUgbGFzdCByZWFkIG9mZgorCQkJCQkJICogdGhlIHF1ZXVlPworCQkJCQkJICovCisJCQkJCQlpZiAoKHRpbWVfbm93IC0gdGltZV9sYXN0KSA+IDEyMCkgeworCQkJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJCQkJYWFjX2Nsb3NlX2ZpYl9jb250ZXh0KGRldiwgZmliY3R4KTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBXYXJuaW5nOiBubyBzbGVlcCBhbGxvd2VkIHdoaWxlCisJCQkJCSAqIGhvbGRpbmcgc3BpbmxvY2sKKwkJCQkJICovCisJCQkJCWh3X25ld2ZpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBod19maWIpLCBHRlBfQVRPTUlDKTsKKwkJCQkJbmV3ZmliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZpYiksIEdGUF9BVE9NSUMpOworCQkJCQlpZiAobmV3ZmliICYmIGh3X25ld2ZpYikgeworCQkJCQkJLyoKKwkJCQkJCSAqIE1ha2UgdGhlIGNvcHkgb2YgdGhlIEZJQgorCQkJCQkJICovCisJCQkJCQltZW1jcHkoaHdfbmV3ZmliLCBod19maWIsIHNpemVvZihzdHJ1Y3QgaHdfZmliKSk7CisJCQkJCQltZW1jcHkobmV3ZmliLCBmaWIsIHNpemVvZihzdHJ1Y3QgZmliKSk7CisJCQkJCQluZXdmaWItPmh3X2ZpYiA9IGh3X25ld2ZpYjsKKwkJCQkJCS8qCisJCQkJCQkgKiBQdXQgdGhlIEZJQiBvbnRvIHRoZQorCQkJCQkJICogZmliY3R4J3MgZmlicworCQkJCQkJICovCisJCQkJCQlsaXN0X2FkZF90YWlsKCZuZXdmaWItPmZpYmxpbmssICZmaWJjdHgtPmZpYl9saXN0KTsKKwkJCQkJCWZpYmN0eC0+Y291bnQrKzsKKwkJCQkJCS8qIAorCQkJCQkJICogU2V0IHRoZSBldmVudCB0byB3YWtlIHVwIHRoZQorCQkJCQkJICogdGhyZWFkIHRoYXQgd2lsbCB3YWl0aW5nLgorCQkJCQkJICovCisJCQkJCQl1cCgmZmliY3R4LT53YWl0X3NlbSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWZkOiBkaWRuJ3QgYWxsb2NhdGUgTmV3RmliLlxuIik7CisJCQkJCQlpZihuZXdmaWIpCisJCQkJCQkJa2ZyZWUobmV3ZmliKTsKKwkJCQkJCWlmKGh3X25ld2ZpYikKKwkJCQkJCQlrZnJlZShod19uZXdmaWIpOworCQkJCQl9CisJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJfQorCQkJCS8qCisJCQkJICoJU2V0IHRoZSBzdGF0dXMgb2YgdGhpcyBGSUIKKwkJCQkgKi8KKwkJCQkqKHUzMiAqKWh3X2ZpYi0+ZGF0YSA9IGNwdV90b19sZTMyKFNUX09LKTsKKwkJCQlmaWJfYWRhcHRlcl9jb21wbGV0ZShmaWIsIHNpemVvZih1MzIpKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFndik7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZShxdWV1ZXMtPnF1ZXVlW0hvc3ROb3JtQ21kUXVldWVdLmxvY2ssIGZsYWdzKTsKKwkJCWtmcmVlKGZpYik7CisJCX0KKwkJLyoKKwkJICoJVGhlcmUgYXJlIG5vIG1vcmUgQUlGJ3MKKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXS5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlKCk7CisKKwkJaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0uY21kcmVhZHksICZ3YWl0KTsKKwlkZXYtPmFpZl90aHJlYWQgPSAwOworCWNvbXBsZXRlX2FuZF9leGl0KCZkZXYtPmFpZl9jb21wbGV0aW9uLCAwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvZHBjc3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4MGI0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2RwY3N1cC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgZHBjc3VwLmMKKyAqCisgKiBBYnN0cmFjdDogQWxsIERQQyBwcm9jZXNzaW5nIHJvdXRpbmVzIGZvciB0aGUgY3ljbG9uZSBib2FyZCBvY2N1ciBoZXJlLgorICoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImFhY3JhaWQuaCIKKworLyoqCisgKglhYWNfcmVzcG9uc2Vfbm9ybWFsCS0JSGFuZGxlIGNvbW1hbmQgcmVwbGllcworICoJQHE6IFF1ZXVlIHRvIHJlYWQgZnJvbQorICoKKyAqCVRoaXMgRFBDIHJvdXRpbmUgd2lsbCBiZSBydW4gd2hlbiB0aGUgYWRhcHRlciBpbnRlcnJ1cHRzIHVzIHRvIGxldCB1cworICoJa25vdyB0aGVyZSBpcyBhIHJlc3BvbnNlIG9uIG91ciBub3JtYWwgcHJpb3JpdHkgcXVldWUuIFdlIHdpbGwgcHVsbCBvZmYKKyAqCWFsbCBRRSB0aGVyZSBhcmUgYW5kIHdha2UgdXAgYWxsIHRoZSB3YWl0ZXJzIGJlZm9yZSBleGl0aW5nLiBXZSB3aWxsCisgKgl0YWtlIGEgc3BpbmxvY2sgb3V0IG9uIHRoZSBxdWV1ZSBiZWZvcmUgb3BlcmF0aW5nIG9uIGl0LgorICovCisKK3Vuc2lnbmVkIGludCBhYWNfcmVzcG9uc2Vfbm9ybWFsKHN0cnVjdCBhYWNfcXVldWUgKiBxKQoreworCXN0cnVjdCBhYWNfZGV2ICogZGV2ID0gcS0+ZGV2OworCXN0cnVjdCBhYWNfZW50cnkgKmVudHJ5OworCXN0cnVjdCBod19maWIgKiBod2ZpYjsKKwlzdHJ1Y3QgZmliICogZmliOworCWludCBjb25zdW1lZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPmxvY2ssIGZsYWdzKTsJCisJLyoKKwkgKglLZWVwIHB1bGxpbmcgcmVzcG9uc2UgUUVzIG9mZiB0aGUgcmVzcG9uc2UgcXVldWUgYW5kIHdha2luZworCSAqCXVwIHRoZSB3YWl0ZXJzIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIFFFcy4gV2UgdGhlbiByZXR1cm4KKwkgKgliYWNrIHRvIHRoZSBzeXN0ZW0uIElmIG5vIHJlc3BvbnNlIHdhcyByZXF1ZXNlZCB3ZSBqdXN0CisJICoJZGVhbGxvY2F0ZSB0aGUgRmliIGhlcmUgYW5kIGNvbnRpbnVlLgorCSAqLworCXdoaWxlKGFhY19jb25zdW1lcl9nZXQoZGV2LCBxLCAmZW50cnkpKQorCXsKKwkJaW50IGZhc3Q7CisJCXUzMiBpbmRleCA9IGxlMzJfdG9fY3B1KGVudHJ5LT5hZGRyKTsKKwkJZmFzdCA9IGluZGV4ICYgMHgwMTsKKwkJZmliID0gJmRldi0+Zmlic1tpbmRleCA+PiAxXTsKKwkJaHdmaWIgPSBmaWItPmh3X2ZpYjsKKwkJCisJCWFhY19jb25zdW1lcl9mcmVlKGRldiwgcSwgSG9zdE5vcm1SZXNwUXVldWUpOworCQkvKgorCQkgKglSZW1vdmUgdGhpcyBmaWIgZnJvbSB0aGUgT3V0c3RhbmRpbmcgSS9PIHF1ZXVlLgorCQkgKglCdXQgb25seSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiB0aW1lZCBvdXQuCisJCSAqCisJCSAqCUlmIHRoZSBmaWIgaGFzIGJlZW4gdGltZWQgb3V0IGFscmVhZHksIHRoZW4ganVzdCAKKwkJICoJY29udGludWUuIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgYmVlbiBub3RpZmllZCB0aGF0CisJCSAqCXRoZSBmaWIgdGltZWQgb3V0LgorCQkgKi8KKwkJaWYgKCEoZmliLT5mbGFncyAmIEZJQl9DT05URVhUX0ZMQUdfVElNRURfT1VUKSkgeworCQkJbGlzdF9kZWwoJmZpYi0+cXVldWUpOworCQkJZGV2LT5xdWV1ZXMtPnF1ZXVlW0FkYXBOb3JtQ21kUXVldWVdLm51bXBlbmRpbmctLTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFhY3JhaWQ6IEZJQiB0aW1lb3V0ICgleCkuXG4iLCBmaWItPmZsYWdzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHImFhY3JhaWQ6IGh3ZmliPSVwIGZpYiBpbmRleD0laSBmaWI9JXBcbiIsaHdmaWIsIGh3ZmliLT5oZWFkZXIuU2VuZGVyRGF0YSxmaWIpOworCQkJY29udGludWU7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGZhc3QpIHsKKwkJCS8qCisJCQkgKglEb2N0b3IgdGhlIGZpYgorCQkJICovCisJCQkqKHUzMiAqKWh3ZmliLT5kYXRhID0gY3B1X3RvX2xlMzIoU1RfT0spOworCQkJaHdmaWItPmhlYWRlci5YZmVyU3RhdGUgfD0gY3B1X3RvX2xlMzIoQWRhcHRlclByb2Nlc3NlZCk7CisJCX0KKworCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5GaWJSZWN2ZWQpOworCisJCWlmIChod2ZpYi0+aGVhZGVyLkNvbW1hbmQgPT0gY3B1X3RvX2xlMTYoTnVGaWxlU3lzdGVtKSkKKwkJeworCQkJdTMyICpwc3RhdHVzID0gKHUzMiAqKWh3ZmliLT5kYXRhOworCQkJaWYgKCpwc3RhdHVzICYgY3B1X3RvX2xlMzIoMHhmZmZmMDAwMCkpCisJCQkJKnBzdGF0dXMgPSBjcHVfdG9fbGUzMihTVF9PSyk7CisJCX0KKwkJaWYgKGh3ZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoTm9SZXNwb25zZUV4cGVjdGVkIHwgQXN5bmMpKSAKKwkJeworCSAgICAgICAgCWlmIChod2ZpYi0+aGVhZGVyLlhmZXJTdGF0ZSAmIGNwdV90b19sZTMyKE5vUmVzcG9uc2VFeHBlY3RlZCkpCisJCQkJRklCX0NPVU5URVJfSU5DUkVNRU5UKGFhY19jb25maWcuTm9SZXNwb25zZVJlY3ZlZCk7CisJCQllbHNlIAorCQkJCUZJQl9DT1VOVEVSX0lOQ1JFTUVOVChhYWNfY29uZmlnLkFzeW5jUmVjdmVkKTsKKwkJCS8qCisJCQkgKglOT1RFOiAgd2UgY2Fubm90IHRvdWNoIHRoZSBmaWIgYWZ0ZXIgdGhpcworCQkJICoJICAgIGNhbGwsIGJlY2F1c2UgaXQgbWF5IGhhdmUgYmVlbiBkZWFsbG9jYXRlZC4KKwkJCSAqLworCQkJZmliLT5jYWxsYmFjayhmaWItPmNhbGxiYWNrX2RhdGEsIGZpYik7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWd2OworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZpYi0+ZXZlbnRfbG9jaywgZmxhZ3YpOworCQkJZmliLT5kb25lID0gMTsKKwkJCXVwKCZmaWItPmV2ZW50X3dhaXQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmliLT5ldmVudF9sb2NrLCBmbGFndik7CisJCQlGSUJfQ09VTlRFUl9JTkNSRU1FTlQoYWFjX2NvbmZpZy5Ob3JtYWxSZWN2ZWQpOworCQl9CisJCWNvbnN1bWVkKys7CisJCXNwaW5fbG9ja19pcnFzYXZlKHEtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoY29uc3VtZWQgPiBhYWNfY29uZmlnLnBlYWtfZmlicykKKwkJYWFjX2NvbmZpZy5wZWFrX2ZpYnMgPSBjb25zdW1lZDsKKwlpZiAoY29uc3VtZWQgPT0gMCkgCisJCWFhY19jb25maWcuemVyb19maWJzKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCWFhY19jb21tYW5kX25vcm1hbAktCWhhbmRsZSBjb21tYW5kcworICoJQHE6IHF1ZXVlIHRvIHByb2Nlc3MKKyAqCisgKglUaGlzIERQQyByb3V0aW5lIHdpbGwgYmUgcXVldWVkIHdoZW4gdGhlIGFkYXB0ZXIgaW50ZXJydXB0cyB1cyB0byAKKyAqCWxldCB1cyBrbm93IHRoZXJlIGlzIGEgY29tbWFuZCBvbiBvdXIgbm9ybWFsIHByaW9yaXR5IHF1ZXVlLiBXZSB3aWxsIAorICoJcHVsbCBvZmYgYWxsIFFFIHRoZXJlIGFyZSBhbmQgd2FrZSB1cCBhbGwgdGhlIHdhaXRlcnMgYmVmb3JlIGV4aXRpbmcuCisgKglXZSB3aWxsIHRha2UgYSBzcGlubG9jayBvdXQgb24gdGhlIHF1ZXVlIGJlZm9yZSBvcGVyYXRpbmcgb24gaXQuCisgKi8KKyAKK3Vuc2lnbmVkIGludCBhYWNfY29tbWFuZF9ub3JtYWwoc3RydWN0IGFhY19xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqIGRldiA9IHEtPmRldjsKKwlzdHJ1Y3QgYWFjX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKglLZWVwIHB1bGxpbmcgcmVzcG9uc2UgUUVzIG9mZiB0aGUgcmVzcG9uc2UgcXVldWUgYW5kIHdha2luZworCSAqCXVwIHRoZSB3YWl0ZXJzIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIFFFcy4gV2UgdGhlbiByZXR1cm4KKwkgKgliYWNrIHRvIHRoZSBzeXN0ZW0uCisJICovCisJd2hpbGUoYWFjX2NvbnN1bWVyX2dldChkZXYsIHEsICZlbnRyeSkpCisJeworCQlzdHJ1Y3QgZmliIGZpYmN0eDsKKwkJc3RydWN0IGh3X2ZpYiAqIGh3X2ZpYjsKKwkJdTMyIGluZGV4OworCQlzdHJ1Y3QgZmliICpmaWIgPSAmZmliY3R4OworCQkKKwkJaW5kZXggPSBsZTMyX3RvX2NwdShlbnRyeS0+YWRkcikgLyBzaXplb2Yoc3RydWN0IGh3X2ZpYik7CisJCWh3X2ZpYiA9ICZkZXYtPmFpZl9iYXNlX3ZhW2luZGV4XTsKKwkJCisJCS8qCisJCSAqCUFsbG9jYXRlIGEgRklCIGF0IGFsbCBjb3N0cy4gRm9yIG5vbiBxdWV1ZWQgc3R1ZmYKKwkJICoJd2UgY2FuIGp1c3QgdXNlIHRoZSBzdGFjayBzbyB3ZSBhcmUgaGFwcHkuIFdlIG5lZWQKKwkJICoJYSBmaWIgb2JqZWN0IGluIG9yZGVyIHRvIG1hbmFnZSB0aGUgbGlua2VkIGxpc3RzCisJCSAqLworCQlpZiAoZGV2LT5haWZfdGhyZWFkKQorCQkJaWYoKGZpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWIpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCQlmaWIgPSAmZmliY3R4OworCQkKKwkJbWVtc2V0KGZpYiwgMCwgc2l6ZW9mKHN0cnVjdCBmaWIpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZpYi0+ZmlibGluayk7CisJCWZpYi0+dHlwZSA9IEZTQUZTX05UQ19GSUJfQ09OVEVYVDsKKwkJZmliLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBmaWIpOworCQlmaWItPmh3X2ZpYiA9IGh3X2ZpYjsKKwkJZmliLT5kYXRhID0gaHdfZmliLT5kYXRhOworCQlmaWItPmRldiA9IGRldjsKKwkJCisJCQkJCisJCWlmIChkZXYtPmFpZl90aHJlYWQgJiYgZmliICE9ICZmaWJjdHgpIHsKKwkJICAgICAgICBsaXN0X2FkZF90YWlsKCZmaWItPmZpYmxpbmssICZxLT5jbWRxKTsKKwkgCSAgICAgICAgYWFjX2NvbnN1bWVyX2ZyZWUoZGV2LCBxLCBIb3N0Tm9ybUNtZFF1ZXVlKTsKKwkJICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJnEtPmNtZHJlYWR5KTsKKwkJfSBlbHNlIHsKKwkgCSAgICAgICAgYWFjX2NvbnN1bWVyX2ZyZWUoZGV2LCBxLCBIb3N0Tm9ybUNtZFF1ZXVlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+bG9jaywgZmxhZ3MpOworCQkJLyoKKwkJCSAqCVNldCB0aGUgc3RhdHVzIG9mIHRoaXMgRklCCisJCQkgKi8KKwkJCSoodTMyICopaHdfZmliLT5kYXRhID0gY3B1X3RvX2xlMzIoU1RfT0spOworCQkJZmliX2FkYXB0ZXJfY29tcGxldGUoZmliLCBzaXplb2YodTMyKSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5sb2NrLCBmbGFncyk7CisJCX0JCQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjgyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICoJQWRhcHRlYyBBQUMgc2VyaWVzIFJBSUQgY29udHJvbGxlciBkcml2ZXIKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4JPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgb2xkIGFhY3JhaWQgZHJpdmVyIHRoYXQgaXMuLgorICogQWRhcHRlYyBhYWNyYWlkIGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjLCBJbmMuIChhYWNyYWlkQGFkYXB0ZWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogTW9kdWxlIE5hbWU6CisgKiAgIGxpbml0LmMKKyAqCisgKiBBYnN0cmFjdDogTGludXggRHJpdmVyIGVudHJ5IG1vZHVsZSBmb3IgQWRhcHRlYyBSQUlEIEFycmF5IENvbnRyb2xsZXIKKyAqLworCisjZGVmaW5lIEFBQ19EUklWRVJfVkVSU0lPTgkJIjEuMS4yLWxrMiIKKyNkZWZpbmUgQUFDX0RSSVZFUl9CVUlMRF9EQVRFCQlfX0RBVEVfXworI2RlZmluZSBBQUNfRFJJVkVSTkFNRQkJCSJhYWNyYWlkIgorCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKworI2luY2x1ZGUgImFhY3JhaWQuaCIKKworCitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IEluYyBhbmQgQWRhcHRlYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZWxsIFBFUkMyLCAyL1NpLCAzL1NpLCAzL0RpLCAiCisJCSAgICJBZGFwdGVjIEFkdmFuY2VkIFJhaWQgUHJvZHVjdHMsICIKKwkJICAgImFuZCBIUCBOZXRSQUlELTRNIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihBQUNfRFJJVkVSX1ZFUlNJT04pOworCitzdGF0aWMgTElTVF9IRUFEKGFhY19kZXZpY2VzKTsKK3N0YXRpYyBpbnQgYWFjX2NmZ19tYWpvciA9IC0xOworCisvKgorICogQmVjYXVzZSBvZiB0aGUgd2F5IExpbnV4IG5hbWVzIHNjc2kgZGV2aWNlcywgdGhlIG9yZGVyIGluIHRoaXMgdGFibGUgaGFzCisgKiBiZWNvbWUgaW1wb3J0YW50LiAgQ2hlY2sgZm9yIG9uLWJvYXJkIFJhaWQgZmlyc3QsIGFkZC1pbiBjYXJkcyBzZWNvbmQuCisgKgorICogTm90ZTogVGhlIGxhc3QgZmllbGQgaXMgdXNlZCB0byBpbmRleCBpbnRvIGFhY19kcml2ZXJzIGJlbG93LgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWFjX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAyOCwgMHgwMDAxLCAweDEwMjgsIDB4MDAwMSwgMCwgMCwgMCB9LCAvKiBQRVJDIDIvU2kgKElndWFuYS9QRVJDMlNpKSAqLworCXsgMHgxMDI4LCAweDAwMDIsIDB4MTAyOCwgMHgwMDAyLCAwLCAwLCAxIH0sIC8qIFBFUkMgMy9EaSAoT3BhbC9QRVJDM0RpKSAqLworCXsgMHgxMDI4LCAweDAwMDMsIDB4MTAyOCwgMHgwMDAzLCAwLCAwLCAyIH0sIC8qIFBFUkMgMy9TaSAoU2xpbUZhc3QvUEVSQzNTaSAqLworCXsgMHgxMDI4LCAweDAwMDQsIDB4MTAyOCwgMHgwMGQwLCAwLCAwLCAzIH0sIC8qIFBFUkMgMy9EaSAoSWd1YW5hIEZsaXBDaGlwL1BFUkMzRGlGICovCisJeyAweDEwMjgsIDB4MDAwMiwgMHgxMDI4LCAweDAwZDEsIDAsIDAsIDQgfSwgLyogUEVSQyAzL0RpIChWaXBlci9QRVJDM0RpVikgKi8KKwl7IDB4MTAyOCwgMHgwMDAyLCAweDEwMjgsIDB4MDBkOSwgMCwgMCwgNSB9LCAvKiBQRVJDIDMvRGkgKExleHVzL1BFUkMzRGlMKSAqLworCXsgMHgxMDI4LCAweDAwMGEsIDB4MTAyOCwgMHgwMTA2LCAwLCAwLCA2IH0sIC8qIFBFUkMgMy9EaSAoSmFndWFyL1BFUkMzRGlKKSAqLworCXsgMHgxMDI4LCAweDAwMGEsIDB4MTAyOCwgMHgwMTFiLCAwLCAwLCA3IH0sIC8qIFBFUkMgMy9EaSAoRGFnZ2VyL1BFUkMzRGlEKSAqLworCXsgMHgxMDI4LCAweDAwMGEsIDB4MTAyOCwgMHgwMTIxLCAwLCAwLCA4IH0sIC8qIFBFUkMgMy9EaSAoQm94c3Rlci9QRVJDM0RpQikgKi8KKwl7IDB4OTAwNSwgMHgwMjgzLCAweDkwMDUsIDB4MDI4MywgMCwgMCwgOSB9LCAvKiBjYXRhcHVsdCAqLworCXsgMHg5MDA1LCAweDAyODQsIDB4OTAwNSwgMHgwMjg0LCAwLCAwLCAxMCB9LCAvKiB0b21jYXQgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4NiwgMCwgMCwgMTEgfSwgLyogQWRhcHRlYyAyMTIwUyAoQ3J1c2FkZXIpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyODUsIDAsIDAsIDEyIH0sIC8qIEFkYXB0ZWMgMjIwMFMgKFZ1bGNhbikgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4NywgMCwgMCwgMTMgfSwgLyogQWRhcHRlYyAyMjAwUyAoVnVsY2FuLTJtKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTdhYSwgMHgwMjg2LCAwLCAwLCAxNCB9LCAvKiBMZWdlbmQgUzIyMCAoTGVnZW5kIENydXNhZGVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTdhYSwgMHgwMjg3LCAwLCAwLCAxNSB9LCAvKiBMZWdlbmQgUzIzMCAoTGVnZW5kIFZ1bGNhbikgKi8KKworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjg4LCAwLCAwLCAxNiB9LCAvKiBBZGFwdGVjIDMyMzBTIChIYXJyaWVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjg5LCAwLCAwLCAxNyB9LCAvKiBBZGFwdGVjIDMyNDBTIChUb3JuYWRvKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjhhLCAwLCAwLCAxOCB9LCAvKiBBU1ItMjAyMFpDUiBTQ1NJIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4YiwgMCwgMCwgMTkgfSwgLyogQVNSLTIwMjVaQ1IgU0NTSSBTTy1ESU1NIFBDSS1YIFpDUiAoVGVybWluYXRvcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDI4YywgMCwgMCwgMjAgfSwgLyogQVNSLTIyMzBTICsgQVNSLTIyMzBTTFAgUENJLVggKExhbmNlcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDI4ZCwgMCwgMCwgMjEgfSwgLyogQVNSLTIxMzBTIChMYW5jZXIpICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDAyOWIsIDAsIDAsIDIyIH0sIC8qIEFBUi0yODIwU0EgKEludHJ1ZGVyKSAqLworCXsgMHg5MDA1LCAweDAyODYsIDB4OTAwNSwgMHgwMjljLCAwLCAwLCAyMyB9LCAvKiBBQVItMjYyMFNBIChJbnRydWRlcikgKi8KKwl7IDB4OTAwNSwgMHgwMjg2LCAweDkwMDUsIDB4MDI5ZCwgMCwgMCwgMjQgfSwgLyogQUFSLTI0MjBTQSAoSW50cnVkZXIpICovCisJeyAweDkwMDUsIDB4MDI4NiwgMHg5MDA1LCAweDA4MDAsIDAsIDAsIDI1IH0sIC8qIENhbGxpc3RvIEp1cGl0ZXIgUGxhdGZvcm0gKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZSwgMCwgMCwgMjYgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI4ZiwgMCwgMCwgMjcgfSwgLyogQVNSLTIwMjVTQSBTQVRBIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjkwLCAwLCAwLCAyOCB9LCAvKiBBQVItMjQxMFNBIFBDSSBTQVRBIDRjaCAoSmFndWFyIElJKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAyOCwgMHgwMjkxLCAwLCAwLCAyOSB9LCAvKiBDRVJDIFNBVEEgUkFJRCAyIFBDSSBTQVRBIDZjaCAoRGVsbENvcnNhaXIpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTIsIDAsIDAsIDMwIH0sIC8qIEFBUi0yODEwU0EgUENJIFNBVEEgOGNoIChDb3JzYWlyLTgpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTMsIDAsIDAsIDMxIH0sIC8qIEFBUi0yMTYxMFNBIFBDSSBTQVRBIDE2Y2ggKENvcnNhaXItMTYpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOTQsIDAsIDAsIDMyIH0sIC8qIEVTRCBTTy1ESU1NIFBDSS1YIFNBVEEgWkNSIChQcm93bGVyKSAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4MTAzQywgMHgzMjI3LCAwLCAwLCAzMyB9LCAvKiBBQVItMjYxMFNBIFBDSSBTQVRBIDZjaCAqLworCXsgMHg5MDA1LCAweDAyODUsIDB4OTAwNSwgMHgwMjk2LCAwLCAwLCAzNCB9LCAvKiBBU1ItMjI0MFMgKFNhYnJlRXhwcmVzcykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5NywgMCwgMCwgMzUgfSwgLyogQVNSLTQwMDVTQVMgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDEwMTQsIDB4MDJGMiwgMCwgMCwgMzYgfSwgLyogSUJNIDhpIChBdm9uUGFyaykgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OCwgMCwgMCwgMzcgfSwgLyogQVNSLTQwMDBTQVMgKEJsYWNrQmlyZCkgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCAweDkwMDUsIDB4MDI5OSwgMCwgMCwgMzggfSwgLyogQVNSLTQ4MDBTQVMgKE1hcmF1ZGVyLVgpICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHg5MDA1LCAweDAyOUEsIDAsIDAsIDM5IH0sIC8qIEFTUi00ODA1U0FTIChNYXJhdWRlci1FKSAqLworCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCAweDAyODcsIDAsIDAsIDQwIH0sIC8qIFBlcmMgMzIwL0RDKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDkwMDUsIDB4MDM2NSwgMCwgMCwgNDEgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgMHgxMDExLCAweDAwNDYsIDB4OTAwNSwgMHgwMzY0LCAwLCAwLCA0MiB9LCAvKiBBZGFwdGVjIDU0MDBTIChNdXN0YW5nKSovCisJeyAweDEwMTEsIDB4MDA0NiwgMHg5MDA1LCAweDEzNjQsIDAsIDAsIDQzIH0sIC8qIERlbGwgUEVSQzIvUUMgKi8KKwl7IDB4MTAxMSwgMHgwMDQ2LCAweDEwM2MsIDB4MTBjMiwgMCwgMCwgNDQgfSwgLyogSFAgTmV0UkFJRC00TSAqLworCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxMDI4LCBQQ0lfQU5ZX0lELCAwLCAwLCA0NSB9LCAvKiBEZWxsIENhdGNoYWxsICovCisJeyAweDkwMDUsIDB4MDI4NSwgMHgxN2FhLCBQQ0lfQU5ZX0lELCAwLCAwLCA0NiB9LCAvKiBMZWdlbmQgQ2F0Y2hhbGwgKi8KKwl7IDB4OTAwNSwgMHgwMjg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0NyB9LCAvKiBBZGFwdGVjIENhdGNoIEFsbCAqLworCXsgMHg5MDA1LCAweDAyODYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDQ4IH0sIC8qIEFkYXB0ZWMgUm9ja2V0IENhdGNoIEFsbCAqLworCXsgMCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFhY19wY2lfdGJsKTsKKworLyoKKyAqIGRtYiAtIEZvciBub3cgd2UgYWRkIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gdGhpcyBzdHJ1Y3R1cmUuICAKKyAqIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIGFkZCBhIGZpYiB0aGF0IHJlcG9ydHMgdGhlIG51bWJlciBvZiBjaGFubmVscworICogZm9yIHRoZSBjYXJkLiAgQXQgdGhhdCB0aW1lIHdlIGNhbiByZW1vdmUgdGhlIGNoYW5uZWxzIGZyb20gaGVyZQorICovCitzdGF0aWMgc3RydWN0IGFhY19kcml2ZXJfaWRlbnQgYWFjX2RyaXZlcnNbXSA9IHsKKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMi9TaSAoSWd1YW5hL1BFUkMyU2kpICovCisJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkNSQUlEICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQRVJDIDMvRGkgKE9wYWwvUEVSQzNEaSkgKi8KKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMy9TaSAoU2xpbUZhc3QvUEVSQzNTaSAqLworCXsgYWFjX3J4X2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDUkFJRCAgICAgICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogUEVSQyAzL0RpIChJZ3VhbmEgRmxpcENoaXAvUEVSQzNEaUYgKi8KKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMy9EaSAoVmlwZXIvUEVSQzNEaVYpICovCisJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkNSQUlEICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQRVJDIDMvRGkgKExleHVzL1BFUkMzRGlMKSAqLworCXsgYWFjX3J4X2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDUkFJRCAgICAgICAgIiwgMSwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogUEVSQyAzL0RpIChKYWd1YXIvUEVSQzNEaUopICovCisJeyBhYWNfcnhfaW5pdCwgInBlcmNyYWlkIiwgIkRFTEwgICAgIiwgIlBFUkNSQUlEICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBQRVJDIDMvRGkgKERhZ2dlci9QRVJDM0RpRCkgKi8KKwl7IGFhY19yeF9pbml0LCAicGVyY3JhaWQiLCAiREVMTCAgICAiLCAiUEVSQ1JBSUQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIFBFUkMgMy9EaSAoQm94c3Rlci9QRVJDM0RpQikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiY2F0YXB1bHQgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIGNhdGFwdWx0ICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgInRvbWNhdCAgICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiB0b21jYXQgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQWRhcHRlYyAyMTIwUyAgICIsIDEsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIEFkYXB0ZWMgMjEyMFMgKENydXNhZGVyKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBZGFwdGVjIDIyMDBTICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyAyMjAwUyAoVnVsY2FuKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBZGFwdGVjIDIyMDBTICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyAyMjAwUyAoVnVsY2FuLTJtKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJMZWdlbmQgICIsICJMZWdlbmQgUzIyMCAgICAgIiwgMSwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogTGVnZW5kIFMyMjAgKExlZ2VuZCBDcnVzYWRlcikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiTGVnZW5kICAiLCAiTGVnZW5kIFMyMzAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIExlZ2VuZCBTMjMwIChMZWdlbmQgVnVsY2FuKSAqLworCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFkYXB0ZWMgMzIzMFMgICAiLCAyIH0sIC8qIEFkYXB0ZWMgMzIzMFMgKEhhcnJpZXIpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFkYXB0ZWMgMzI0MFMgICAiLCAyIH0sIC8qIEFkYXB0ZWMgMzI0MFMgKFRvcm5hZG8pICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMDIwWkNSICAgICAiLCAyIH0sIC8qIEFTUi0yMDIwWkNSIFNDU0kgUENJLVggWkNSIChTa3loYXdrKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyNVpDUiAgICAgIiwgMiB9LCAvKiBBU1ItMjAyNVpDUiBTQ1NJIFNPLURJTU0gUENJLVggWkNSIChUZXJtaW5hdG9yKSAqLworCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIyMzBTIFBDSS1YICIsIDIgfSwgLyogQVNSLTIyMzBTICsgQVNSLTIyMzBTTFAgUENJLVggKExhbmNlcikgKi8KKwl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMTMwUyBQQ0ktWCAiLCAxIH0sIC8qIEFTUi0yMTMwUyAoTGFuY2VyKSAqLworCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI4MjBTQSAgICAgICIsIDEgfSwgLyogQUFSLTI4MjBTQSAoSW50cnVkZXIpICovCisJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjYyMFNBICAgICAgIiwgMSB9LCAvKiBBQVItMjYyMFNBIChJbnRydWRlcikgKi8KKwl7IGFhY19ya3RfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFBUi0yNDIwU0EgICAgICAiLCAxIH0sIC8qIEFBUi0yNDIwU0EgKEludHJ1ZGVyKSAqLworCXsgYWFjX3JrdF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQ2FsbGlzdG8gICAgICAgICIsIDIsIEFBQ19RVUlSS19NQVNURVIgfSwgLyogSnVwaXRlciBQbGF0Zm9ybSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyMFNBICAgICAgICIsIDEgfSwgLyogQVNSLTIwMjBTQSBTQVRBIFBDSS1YIFpDUiAoU2t5aGF3aykgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQVNSLTIwMjVTQSAgICAgICAiLCAxIH0sIC8qIEFTUi0yMDI1U0EgU0FUQSBTTy1ESU1NIFBDSS1YIFpDUiAoVGVybWluYXRvcikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI0MTBTQSBTQVRBICIsIDEgfSwgLyogQUFSLTI0MTBTQSBQQ0kgU0FUQSA0Y2ggKEphZ3VhciBJSSkgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiREVMTCAgICAiLCAiQ0VSQyBTUjIgICAgICAgICIsIDEgfSwgLyogQ0VSQyBTQVRBIFJBSUQgMiBQQ0kgU0FUQSA2Y2ggKERlbGxDb3JzYWlyKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjgxMFNBIFNBVEEgIiwgMSB9LCAvKiBBQVItMjgxMFNBIFBDSSBTQVRBIDhjaCAoQ29yc2Fpci04KSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQVItMjE2MTBTQSBTQVRBIiwgMSB9LCAvKiBBQVItMjE2MTBTQSBQQ0kgU0FUQSAxNmNoIChDb3JzYWlyLTE2KSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItMjAyNlpDUiAgICAgIiwgMSB9LCAvKiBFU0QgU08tRElNTSBQQ0ktWCBTQVRBIFpDUiAoUHJvd2xlcikgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiQUFSLTI2MTBTQSAgICAgICIsIDEgfSwgLyogU0FUQSA2Q2ggKEJlYXJjYXQpICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi0yMjQwUyAgICAgICAiLCAxIH0sIC8qIEFTUi0yMjQwUyAoU2FicmVFeHByZXNzKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDAwNVNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDAwNVNBUyAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJJQk0gICAgICIsICJTZXJ2ZVJBSUQgOGkgICAgIiwgMSB9LCAvKiBJQk0gOGkgKEF2b25QYXJrKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDAwMFNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDAwMFNBUyAoQmxhY2tCaXJkICYgQXZvblBhcmspICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkFEQVBURUMgIiwgIkFTUi00ODAwU0FTICAgICAiLCAxIH0sIC8qIEFTUi00ODAwU0FTIChNYXJhdWRlci1YKSAqLworCXsgYWFjX3J4X2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBU1ItNDgwNVNBUyAgICAgIiwgMSB9LCAvKiBBU1ItNDgwNVNBUyAoTWFyYXVkZXItRSkgKi8KKworCXsgYWFjX3J4X2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDIDMyMC9EQyAgICAgIiwgMiwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogUGVyYyAzMjAvREMqLworCXsgYWFjX3NhX2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBZGFwdGVjIDU0MDBTICAgIiwgNCwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgYWFjX3NhX2luaXQsICJhYWNyYWlkIiwgICJBREFQVEVDICIsICJBQUMtMzY0ICAgICAgICAgIiwgNCwgQUFDX1FVSVJLXzM0U0cgfSwgLyogQWRhcHRlYyA1NDAwUyAoTXVzdGFuZykqLworCXsgYWFjX3NhX2luaXQsICJwZXJjcmFpZCIsICJERUxMICAgICIsICJQRVJDUkFJRCAgICAgICAgIiwgNCwgQUFDX1FVSVJLXzMxQklUIHwgQUFDX1FVSVJLXzM0U0cgfSwgLyogRGVsbCBQRVJDMi9RQyAqLworCXsgYWFjX3NhX2luaXQsICJocG5yYWlkIiwgICJIUCAgICAgICIsICJOZXRSQUlEICAgICAgICAgIiwgNCwgQUFDX1FVSVJLXzM0U0cgfSwgLyogSFAgTmV0UkFJRC00TSAqLworCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkRFTEwgICAgIiwgIlJBSUQgICAgICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBEZWxsIENhdGNoYWxsICovCisJeyBhYWNfcnhfaW5pdCwgImFhY3JhaWQiLCAgIkxlZ2VuZCAgIiwgIlJBSUQgICAgICAgICAgICAiLCAyLCBBQUNfUVVJUktfMzFCSVQgfCBBQUNfUVVJUktfMzRTRyB9LCAvKiBMZWdlbmQgQ2F0Y2hhbGwgKi8KKwl7IGFhY19yeF9pbml0LCAiYWFjcmFpZCIsICAiQURBUFRFQyAiLCAiUkFJRCAgICAgICAgICAgICIsIDIsIEFBQ19RVUlSS18zMUJJVCB8IEFBQ19RVUlSS18zNFNHIH0sIC8qIEFkYXB0ZWMgQ2F0Y2ggQWxsICovCisJeyBhYWNfcmt0X2luaXQsICJhYWNyYWlkIiwgIkFEQVBURUMgIiwgIlJBSUQgICAgICAgICAgICAiLCAyIH0gLyogQWRhcHRlYyBSb2NrZXQgQ2F0Y2ggQWxsICovCit9OworCisvKioKKyAqCWFhY19xdWV1ZWNvbW1hbmQJLQlxdWV1ZSBhIFNDU0kgY29tbWFuZAorICoJQGNtZDoJCVNDU0kgY29tbWFuZCB0byBxdWV1ZQorICoJQGRvbmU6CQlGdW5jdGlvbiB0byBjYWxsIG9uIGNvbW1hbmQgY29tcGxldGlvbgorICoKKyAqCVF1ZXVlcyBhIGNvbW1hbmQgZm9yIGV4ZWN1dGlvbiBieSB0aGUgYXNzb2NpYXRlZCBIb3N0IEFkYXB0ZXIuCisgKgorICoJVE9ETzogdW5pZnkgd2l0aCBhYWNfc2NzaV9jbWQoKS4KKyAqLyAKKworc3RhdGljIGludCBhYWNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCXJldHVybiAoYWFjX3Njc2lfY21kKGNtZCkgPyBGQUlMRUQgOiAwKTsKK30gCisKKy8qKgorICoJYWFjX2luZm8JCS0JUmV0dXJucyB0aGUgaG9zdCBhZGFwdGVyIG5hbWUKKyAqCUBzaG9zdDoJCVNjc2kgaG9zdCB0byByZXBvcnQgb24KKyAqCisgKglSZXR1cm5zIGEgc3RhdGljIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24KKyAqLworCitjb25zdCBjaGFyICphYWNfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gKHN0cnVjdCBhYWNfZGV2ICopc2hvc3QtPmhvc3RkYXRhOworCXJldHVybiBhYWNfZHJpdmVyc1tkZXYtPmNhcmR0eXBlXS5uYW1lOworfQorCisvKioKKyAqCWFhY19nZXRfZHJpdmVyX2lkZW50CisgKiAJQGRldnR5cGU6IGluZGV4IGludG8gbG9va3VwIHRhYmxlCisgKgorICogCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiB0aGUgZHJpdmVyIGxvb2t1cCB0YWJsZS4KKyAqLworCitzdHJ1Y3QgYWFjX2RyaXZlcl9pZGVudCogYWFjX2dldF9kcml2ZXJfaWRlbnQoaW50IGRldnR5cGUpCit7CisJcmV0dXJuICZhYWNfZHJpdmVyc1tkZXZ0eXBlXTsKK30KKworLyoqCisgKglhYWNfYmlvc3Bhcm0JLQlyZXR1cm4gQklPUyBwYXJhbWV0ZXJzIGZvciBkaXNrCisgKglAc2RldjogVGhlIHNjc2kgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpc2sKKyAqCUBiZGV2OiB0aGUgYmxvY2sgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpc2sKKyAqCUBjYXBhY2l0eTogdGhlIHNlY3RvciBjYXBhY2l0eSBvZiB0aGUgZGlzaworICoJQGdlb206IGdlb21ldHJ5IGJsb2NrIHRvIGZpbGwgaW4KKyAqCisgKglSZXR1cm4gdGhlIEhlYWRzL1NlY3RvcnMvQ3lsaW5kZXJzIEJJT1MgRGlzayBQYXJhbWV0ZXJzIGZvciBEaXNrLiAgCisgKglUaGUgZGVmYXVsdCBkaXNrIGdlb21ldHJ5IGlzIDY0IGhlYWRzLCAzMiBzZWN0b3JzLCBhbmQgdGhlIGFwcHJvcHJpYXRlIAorICoJbnVtYmVyIG9mIGN5bGluZGVycyBzbyBhcyBub3QgdG8gZXhjZWVkIGRyaXZlIGNhcGFjaXR5LiAgSW4gb3JkZXIgZm9yIAorICoJZGlza3MgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gMSBHQiB0byBiZSBhZGRyZXNzYWJsZSBieSB0aGUgQklPUworICoJd2l0aG91dCBleGNlZWRpbmcgdGhlIEJJT1MgbGltaXRhdGlvbiBvZiAxMDI0IGN5bGluZGVycywgRXh0ZW5kZWQgCisgKglUcmFuc2xhdGlvbiBzaG91bGQgYmUgZW5hYmxlZC4gICBXaXRoIEV4dGVuZGVkIFRyYW5zbGF0aW9uIGVuYWJsZWQsIAorICoJZHJpdmVzIGJldHdlZW4gMSBHQiBpbmNsdXNpdmUgYW5kIDIgR0IgZXhjbHVzaXZlIGFyZSBnaXZlbiBhIGRpc2sgCisgKglnZW9tZXRyeSBvZiAxMjggaGVhZHMgYW5kIDMyIHNlY3RvcnMsIGFuZCBkcml2ZXMgYWJvdmUgMiBHQiBpbmNsdXNpdmUgCisgKglhcmUgZ2l2ZW4gYSBkaXNrIGdlb21ldHJ5IG9mIDI1NSBoZWFkcyBhbmQgNjMgc2VjdG9ycy4gIEhvd2V2ZXIsIGlmIAorICoJdGhlIEJJT1MgZGV0ZWN0cyB0aGF0IHRoZSBFeHRlbmRlZCBUcmFuc2xhdGlvbiBzZXR0aW5nIGRvZXMgbm90IG1hdGNoIAorICoJdGhlIGdlb21ldHJ5IGluIHRoZSBwYXJ0aXRpb24gdGFibGUsIHRoZW4gdGhlIHRyYW5zbGF0aW9uIGluZmVycmVkIAorICoJZnJvbSB0aGUgcGFydGl0aW9uIHRhYmxlIHdpbGwgYmUgdXNlZCBieSB0aGUgQklPUywgYW5kIGEgd2FybmluZyBtYXkgCisgKgliZSBkaXNwbGF5ZWQuCisgKi8KKyAKK3N0YXRpYyBpbnQgYWFjX2Jpb3NwYXJtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmdlb20pCit7CisJc3RydWN0IGRpc2twYXJtICpwYXJhbSA9IChzdHJ1Y3QgZGlza3Bhcm0gKilnZW9tOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWRwcmludGsoKEtFUk5fREVCVUcgImFhY19iaW9zcGFybS5cbiIpKTsKKworCS8qCisJICoJQXNzdW1pbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCAtICNSRVZJU0lUIworCSAqLworCWlmIChjYXBhY2l0eSA+PSAyICogMTAyNCAqIDEwMjQpIHsgLyogMSBHQiBpbiA1MTIgYnl0ZSBzZWN0b3JzICovCisJCWlmKGNhcGFjaXR5ID49IDQgKiAxMDI0ICogMTAyNCkgeyAvKiAyIEdCIGluIDUxMiBieXRlIHNlY3RvcnMgKi8KKwkJCXBhcmFtLT5oZWFkcyA9IDI1NTsKKwkJCXBhcmFtLT5zZWN0b3JzID0gNjM7CisJCX0gZWxzZSB7CisJCQlwYXJhbS0+aGVhZHMgPSAxMjg7CisJCQlwYXJhbS0+c2VjdG9ycyA9IDMyOworCQl9CisJfSBlbHNlIHsKKwkJcGFyYW0tPmhlYWRzID0gNjQ7CisJCXBhcmFtLT5zZWN0b3JzID0gMzI7CisJfQorCisJcGFyYW0tPmN5bGluZGVycyA9IGNhcF90b19jeWxzKGNhcGFjaXR5LCBwYXJhbS0+aGVhZHMgKiBwYXJhbS0+c2VjdG9ycyk7CisKKwkvKiAKKwkgKglSZWFkIHRoZSBmaXJzdCAxMDI0IGJ5dGVzIGZyb20gdGhlIGRpc2sgZGV2aWNlLCBpZiB0aGUgYm9vdAorCSAqCXNlY3RvciBwYXJ0aXRpb24gdGFibGUgaXMgdmFsaWQsIHNlYXJjaCBmb3IgYSBwYXJ0aXRpb24gdGFibGUKKwkgKgllbnRyeSB3aG9zZSBlbmRfaGVhZCBtYXRjaGVzIG9uZSBvZiB0aGUgc3RhbmRhcmQgZ2VvbWV0cnkgCisJICoJdHJhbnNsYXRpb25zICggNjQvMzIsIDEyOC8zMiwgMjU1LzYzICkuCisJICovCisJYnVmID0gc2NzaV9iaW9zX3B0YWJsZShiZGV2KTsKKwlpZigqKHVuc2lnbmVkIHNob3J0ICopKGJ1ZiArIDB4NDApID09IGNwdV90b19sZTE2KDB4YWE1NSkpIHsKKwkJc3RydWN0IHBhcnRpdGlvbiAqZmlyc3QgPSAoc3RydWN0IHBhcnRpdGlvbiAqIClidWY7CisJCXN0cnVjdCBwYXJ0aXRpb24gKmVudHJ5ID0gZmlyc3Q7CisJCWludCBzYXZlZF9jeWxpbmRlcnMgPSBwYXJhbS0+Y3lsaW5kZXJzOworCQlpbnQgbnVtOworCQl1bnNpZ25lZCBjaGFyIGVuZF9oZWFkLCBlbmRfc2VjOworCisJCWZvcihudW0gPSAwOyBudW0gPCA0OyBudW0rKykgeworCQkJZW5kX2hlYWQgPSBlbnRyeS0+ZW5kX2hlYWQ7CisJCQllbmRfc2VjID0gZW50cnktPmVuZF9zZWN0b3IgJiAweDNmOworCisJCQlpZihlbmRfaGVhZCA9PSA2MykgeworCQkJCXBhcmFtLT5oZWFkcyA9IDY0OworCQkJCXBhcmFtLT5zZWN0b3JzID0gMzI7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYoZW5kX2hlYWQgPT0gMTI3KSB7CisJCQkJcGFyYW0tPmhlYWRzID0gMTI4OworCQkJCXBhcmFtLT5zZWN0b3JzID0gMzI7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYoZW5kX2hlYWQgPT0gMjU0KSB7CisJCQkJcGFyYW0tPmhlYWRzID0gMjU1OworCQkJCXBhcmFtLT5zZWN0b3JzID0gNjM7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbnRyeSsrOworCQl9CisKKwkJaWYgKG51bSA9PSA0KSB7CisJCQllbmRfaGVhZCA9IGZpcnN0LT5lbmRfaGVhZDsKKwkJCWVuZF9zZWMgPSBmaXJzdC0+ZW5kX3NlY3RvciAmIDB4M2Y7CisJCX0KKworCQlwYXJhbS0+Y3lsaW5kZXJzID0gY2FwX3RvX2N5bHMoY2FwYWNpdHksIHBhcmFtLT5oZWFkcyAqIHBhcmFtLT5zZWN0b3JzKTsKKwkJaWYgKG51bSA8IDQgJiYgZW5kX3NlYyA9PSBwYXJhbS0+c2VjdG9ycykgeworCQkJaWYgKHBhcmFtLT5jeWxpbmRlcnMgIT0gc2F2ZWRfY3lsaW5kZXJzKQorCQkJCWRwcmludGsoKEtFUk5fREVCVUcgIkFkb3B0aW5nIGdlb21ldHJ5OiBoZWFkcz0lZCwgc2VjdG9ycz0lZCBmcm9tIHBhcnRpdGlvbiB0YWJsZSAlZC5cbiIsCisJCQkJCXBhcmFtLT5oZWFkcywgcGFyYW0tPnNlY3RvcnMsIG51bSkpOworCQl9IGVsc2UgaWYgKGVuZF9oZWFkID4gMCB8fCBlbmRfc2VjID4gMCkgeworCQkJZHByaW50aygoS0VSTl9ERUJVRyAiU3RyYW5nZSBnZW9tZXRyeTogaGVhZHM9JWQsIHNlY3RvcnM9JWQgaW4gcGFydGl0aW9uIHRhYmxlICVkLlxuIiwKKwkJCQllbmRfaGVhZCArIDEsIGVuZF9zZWMsIG51bSkpOworCQkJZHByaW50aygoS0VSTl9ERUJVRyAiVXNpbmcgZ2VvbWV0cnk6IGhlYWRzPSVkLCBzZWN0b3JzPSVkLlxuIiwKKwkJCQkJcGFyYW0tPmhlYWRzLCBwYXJhbS0+c2VjdG9ycykpOworCQl9CisJfQorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYWFjX3NsYXZlX2NvbmZpZ3VyZQkJLQljb21wdXRlIHF1ZXVlIGRlcHRocworICoJQHNkZXY6CVNDU0kgZGV2aWNlIHdlIGFyZSBjb25zaWRlcmluZworICoKKyAqCVNlbGVjdHMgcXVldWUgZGVwdGhzIGZvciBlYWNoIHRhcmdldCBkZXZpY2UgYmFzZWQgb24gdGhlIGhvc3QgYWRhcHRlcidzCisgKgl0b3RhbCBjYXBhY2l0eSBhbmQgdGhlIHF1ZXVlIGRlcHRoIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IGRldmljZS4KKyAqCUEgcXVldWUgZGVwdGggb2Ygb25lIGF1dG9tYXRpY2FsbHkgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nLgorICovCisKK3N0YXRpYyBpbnQgYWFjX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19PUkRFUkVEX1RBRywgMTI4KTsKKwllbHNlCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIDAsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFhY19pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gYWFjX2RvX2lvY3RsKGRldiwgY21kLCBhcmcpOworfQorCisvKgorICogWFhYOiBkb2VzIGFhYyByZWFsbHkgbmVlZCBubyBlcnJvciBoYW5kbGluZz8/CisgKi8KK3N0YXRpYyBpbnQgYWFjX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKgorICoJYWFjX2VoX3Jlc2V0CS0gUmVzZXQgY29tbWFuZCBoYW5kbGluZworICoJQHNjc2lfY21kOglTQ1NJIGNvbW1hbmQgYmxvY2sgY2F1c2luZyB0aGUgcmVzZXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWFjX2VoX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQqIGNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkZXYgPSBjbWQtPmRldmljZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCA9IGRldi0+aG9zdDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICogY29tbWFuZDsKKwlpbnQgY291bnQ7CisJc3RydWN0IGFhY19kZXYgKiBhYWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3QgYWRhcHRlciByZXNldCByZXF1ZXN0LiBTQ1NJIGhhbmcgP1xuIiwgCisJCQkJCUFBQ19EUklWRVJOQU1FKTsKKworCisJYWFjID0gKHN0cnVjdCBhYWNfZGV2ICopaG9zdC0+aG9zdGRhdGE7CisJaWYgKGFhY19hZGFwdGVyX2NoZWNrX2hlYWx0aChhYWMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3QgYWRhcHRlciBhcHBlYXJzIGRlYWRcbiIsIAorCQkJCUFBQ19EUklWRVJOQU1FKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qCisJICogV2FpdCBmb3IgYWxsIGNvbW1hbmRzIHRvIGNvbXBsZXRlIHRvIHRoaXMgc3BlY2lmaWMKKwkgKiB0YXJnZXQgKGJsb2NrIG1heGltdW0gNjAgc2Vjb25kcykuCisJICovCisJZm9yIChjb3VudCA9IDYwOyBjb3VudDsgLS1jb3VudCkgeworCQlpbnQgYWN0aXZlID0gMDsKKwkJX19zaG9zdF9mb3JfZWFjaF9kZXZpY2UoZGV2LCBob3N0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tbWFuZCwgJmRldi0+Y21kX2xpc3QsIGxpc3QpIHsKKwkJCQlpZiAoY29tbWFuZC0+c2VyaWFsX251bWJlcikgeworCQkJCQlhY3RpdmUrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJCWlmIChhY3RpdmUpCisJCQkJYnJlYWs7CisKKwkJfQorCQkvKgorCQkgKiBXZSBjYW4gZXhpdCBJZiBhbGwgdGhlIGNvbW1hbmRzIGFyZSBjb21wbGV0ZQorCQkgKi8KKwkJaWYgKGFjdGl2ZSA9PSAwKQorCQkJcmV0dXJuIFNVQ0NFU1M7CisJCXNwaW5fdW5sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCQlzc2xlZXAoMSk7CisJCXNwaW5fbG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICIlczogU0NTSSBidXMgYXBwZWFycyBodW5nXG4iLCBBQUNfRFJJVkVSTkFNRSk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qKgorICoJYWFjX2NmZ19vcGVuCQktCW9wZW4gYSBjb25maWd1cmF0aW9uIGZpbGUKKyAqCUBpbm9kZTogaW5vZGUgYmVpbmcgb3BlbmVkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgYXR0YWNoZWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBkZXZpY2UgaXMgb3BlbmVkLiBEb2VzIHRoZSBuZWVkZWQKKyAqCXNldCB1cCBvbiB0aGUgaGFuZGxlIGFuZCB0aGVuIHJldHVybnMKKyAqCisgKglCdWdzOiBUaGlzIG5lZWRzIGV4dGVuZGluZyB0byBjaGVjayBhIGdpdmVuIGFkYXB0ZXIgaXMgcHJlc2VudAorICoJc28gd2UgY2FuIHN1cHBvcnQgaG90IHBsdWdnaW5nLCBhbmQgdG8gcmVmIGNvdW50IGFkYXB0ZXJzLgorICovCisKK3N0YXRpYyBpbnQgYWFjX2NmZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhYWNfZGV2ICphYWM7CisJdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBlcnIgPSAtRU5PREVWOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhYWMsICZhYWNfZGV2aWNlcywgZW50cnkpIHsKKwkJaWYgKGFhYy0+aWQgPT0gbWlub3IpIHsKKwkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFhYzsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWFhY19jZmdfaW9jdGwJCS0JQUFDIGNvbmZpZ3VyYXRpb24gcmVxdWVzdAorICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZQorICoJQGNtZDogaW9jdGwgY29tbWFuZCBjb2RlCisgKglAYXJnOiBhcmd1bWVudAorICoKKyAqCUhhbmRsZXMgYSBjb25maWd1cmF0aW9uIGlvY3RsLiBDdXJyZW50bHkgdGhpcyBpbnZvbHZlcyB3cmFwcGluZyBpdAorICoJdXAgYW5kIGZlZWRpbmcgaXQgaW50byB0aGUgbmFzdHkgd2luZG93c2FsaWtlIGdsdWUgbGF5ZXIuCisgKgorICoJQnVnczogTmVlZHMgbG9ja2luZyBhZ2FpbnN0IHBhcmFsbGVsIGlvY3RscyBsb3dlciBkb3duCisgKglCdWdzOiBOZWVkcyB0byBoYW5kbGUgaG90IHBsdWdnaW5nCisgKi8KKyAKK3N0YXRpYyBpbnQgYWFjX2NmZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCAgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBhYWNfZG9faW9jdGwoZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBhYWNfY29tcGF0X2RvX2lvY3RsKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyByZXQ7CisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKGNtZCkgeyAKKwljYXNlIEZTQUNUTF9NSU5JUE9SVF9SRVZfQ0hFQ0s6CisJY2FzZSBGU0FDVExfU0VOREZJQjoKKwljYXNlIEZTQUNUTF9PUEVOX0dFVF9BREFQVEVSX0ZJQjoKKwljYXNlIEZTQUNUTF9DTE9TRV9HRVRfQURBUFRFUl9GSUI6CisJY2FzZSBGU0FDVExfU0VORF9SQVdfU1JCOgorCWNhc2UgRlNBQ1RMX0dFVF9QQ0lfSU5GTzoKKwljYXNlIEZTQUNUTF9RVUVSWV9ESVNLOgorCWNhc2UgRlNBQ1RMX0RFTEVURV9ESVNLOgorCWNhc2UgRlNBQ1RMX0ZPUkNFX0RFTEVURV9ESVNLOgorCWNhc2UgRlNBQ1RMX0dFVF9DT05UQUlORVJTOiAKKwkJcmV0ID0gYWFjX2RvX2lvY3RsKGRldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgRlNBQ1RMX0dFVF9ORVhUX0FEQVBURVJfRklCOiB7CisJCXN0cnVjdCBmaWJfaW9jdGwgX191c2VyICpmOworCQkKKwkJZiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqZikpOworCQlyZXQgPSAwOworCQlpZiAoY2xlYXJfdXNlcihmLCBzaXplb2YoKmYpICE9IHNpemVvZigqZikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfaW5fdXNlcihmLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgZmliX2lvY3RsKSAtIHNpemVvZih1MzIpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWlmICghcmV0KQorCQkJcmV0ID0gYWFjX2RvX2lvY3RsKGRldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7IAorCQlicmVhazsKKwl9IAorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhY19jb21wYXRfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gYWFjX2NvbXBhdF9kb19pb2N0bChkZXYsIGNtZCwgKHVuc2lnbmVkIGxvbmcpYXJnKTsKK30KKworc3RhdGljIGxvbmcgYWFjX2NvbXBhdF9jZmdfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGFhY19jb21wYXRfZG9faW9jdGwoKHN0cnVjdCBhYWNfZGV2ICopZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWFjX2NmZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJCT0gYWFjX2NmZ19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0gYWFjX2NvbXBhdF9jZmdfaW9jdGwsCisjZW5kaWYKKwkub3BlbgkJPSBhYWNfY2ZnX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhYWNfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAgICAgICAgICAgCQk9ICJBQUMiLAorCS5wcm9jX25hbWUJCQk9ICJhYWNyYWlkIiwKKwkuaW5mbyAgICAgICAgICAgCQk9IGFhY19pbmZvLAorCS5pb2N0bCAgICAgICAgICAJCT0gYWFjX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCQkJPSBhYWNfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLnF1ZXVlY29tbWFuZCAgIAkJPSBhYWNfcXVldWVjb21tYW5kLAorCS5iaW9zX3BhcmFtICAgICAJCT0gYWFjX2Jpb3NwYXJtLAkKKwkuc2xhdmVfY29uZmlndXJlCQk9IGFhY19zbGF2ZV9jb25maWd1cmUsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gYWFjX2VoX2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gYWFjX2VoX3Jlc2V0LAorCS5jYW5fcXVldWUgICAgICAJCT0gQUFDX05VTV9JT19GSUIsCQorCS50aGlzX2lkICAgICAgICAJCT0gMTYsCisJLnNnX3RhYmxlc2l6ZSAgIAkJPSAxNiwKKwkubWF4X3NlY3RvcnMgICAgCQk9IDEyOCwKKyNpZiAoQUFDX05VTV9JT19GSUIgPiAyNTYpCisJLmNtZF9wZXJfbHVuCQkJPSAyNTYsCisjZWxzZQkJCisJLmNtZF9wZXJfbHVuICAgIAkJPSBBQUNfTlVNX0lPX0ZJQiwgCisjZW5kaWYJCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgYWFjX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGluZGV4ID0gaWQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBhYWNfZGV2ICphYWM7CisJc3RydWN0IGxpc3RfaGVhZCAqaW5zZXJ0ID0gJmFhY19kZXZpY2VzOworCWludCBlcnJvciA9IC1FTk9ERVY7CisJaW50IHVuaXF1ZV9pZCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFhYywgJmFhY19kZXZpY2VzLCBlbnRyeSkgeworCQlpZiAoYWFjLT5pZCA+IHVuaXF1ZV9pZCkKKwkJCWJyZWFrOworCQlpbnNlcnQgPSAmYWFjLT5lbnRyeTsKKwkJdW5pcXVlX2lkKys7CisJfQorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpIHx8IAorCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIElmIHRoZSBxdWlyazMxIGJpdCBpcyBzZXQsIHRoZSBhZGFwdGVyIG5lZWRzIGFkYXB0ZXIKKwkgKiB0byBkcml2ZXIgY29tbXVuaWNhdGlvbiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGJlbG93IDJnaWcKKwkgKi8KKwlpZiAoYWFjX2RyaXZlcnNbaW5kZXhdLnF1aXJrcyAmIEFBQ19RVUlSS18zMUJJVCkgCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4N0ZGRkZGRkZVTEwpIHx8CisJCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4N0ZGRkZGRkZVTEwpKQorCQkJZ290byBvdXQ7CisJCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmYWFjX2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhYWNfZGV2KSk7CisJaWYgKCFzaG9zdCkKKwkJZ290byBvdXRfZGlzYWJsZV9wZGV2OworCisJc2hvc3QtPmlycSA9IHBkZXYtPmlycTsKKwlzaG9zdC0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlzaG9zdC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkOworCisJYWFjID0gKHN0cnVjdCBhYWNfZGV2ICopc2hvc3QtPmhvc3RkYXRhOworCWFhYy0+c2NzaV9ob3N0X3B0ciA9IHNob3N0OwkKKwlhYWMtPnBkZXYgPSBwZGV2OworCWFhYy0+bmFtZSA9IGFhY19kcml2ZXJfdGVtcGxhdGUubmFtZTsKKwlhYWMtPmlkID0gc2hvc3QtPnVuaXF1ZV9pZDsKKwlhYWMtPmNhcmR0eXBlID0gIGluZGV4OworCUlOSVRfTElTVF9IRUFEKCZhYWMtPmVudHJ5KTsKKworCWFhYy0+ZmlicyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWIpICogQUFDX05VTV9GSUIsIEdGUF9LRVJORUwpOworCWlmICghYWFjLT5maWJzKQorCQlnb3RvIG91dF9mcmVlX2hvc3Q7CisJc3Bpbl9sb2NrX2luaXQoJmFhYy0+ZmliX2xvY2spOworCisJaWYgKCgqYWFjX2RyaXZlcnNbaW5kZXhdLmluaXQpKGFhYykpCisJCWdvdG8gb3V0X2ZyZWVfZmliczsKKworCS8qCisJICogSWYgd2UgaGFkIHNldCBhIHNtYWxsZXIgRE1BIG1hc2sgZWFybGllciwgc2V0IGl0IHRvIDRnaWcKKwkgKiBub3cgc2luY2UgdGhlIGFkYXB0ZXIgY2FuIGRtYSBkYXRhIHRvIGF0IGxlYXN0IGEgNGdpZworCSAqIGFkZHJlc3Mgc3BhY2UuCisJICovCisJaWYgKGFhY19kcml2ZXJzW2luZGV4XS5xdWlya3MgJiBBQUNfUVVJUktfMzFCSVQpCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpKQorCQkJZ290byBvdXRfZnJlZV9maWJzOworCisJYWFjX2dldF9hZGFwdGVyX2luZm8oYWFjKTsKKworCS8qCisJICogbWF4IGNoYW5uZWwgd2lsbCBiZSB0aGUgcGh5c2ljYWwgY2hhbm5lbHMgcGx1cyAxIHZpcnR1YWwgY2hhbm5lbAorCSAqIGFsbCBjb250YWluZXJzIGFyZSBvbiB0aGUgdmlydHVhbCBjaGFubmVsIDAKKwkgKiBwaHlzaWNhbCBjaGFubmVscyBhcmUgYWRkcmVzcyBieSB0aGVpciBhY3R1YWwgcGh5c2ljYWwgbnVtYmVyKzEKKwkgKi8KKwlpZiAoYWFjLT5ub25kYXNkX3N1cHBvcnQgPT0gMSkKKwkJc2hvc3QtPm1heF9jaGFubmVsID0gYWFjX2RyaXZlcnNbaW5kZXhdLmNoYW5uZWxzKzE7CisJZWxzZQorCQlzaG9zdC0+bWF4X2NoYW5uZWwgPSAxOworCisJYWFjX2dldF9jb25maWdfc3RhdHVzKGFhYyk7CisJYWFjX2dldF9jb250YWluZXJzKGFhYyk7CisJbGlzdF9hZGQoJmFhYy0+ZW50cnksIGluc2VydCk7CisKKwlzaG9zdC0+bWF4X2lkID0gYWFjLT5tYXhpbXVtX251bV9jb250YWluZXJzOworCWlmIChzaG9zdC0+bWF4X2lkIDwgTUFYSU1VTV9OVU1fQ09OVEFJTkVSUykKKwkJc2hvc3QtPm1heF9pZCA9IE1BWElNVU1fTlVNX0NPTlRBSU5FUlM7CisJZWxzZQorCQlzaG9zdC0+dGhpc19pZCA9IHNob3N0LT5tYXhfaWQ7CisKKwkvKgorCSAqIGRtYiAtIHdlIG1heSBuZWVkIHRvIG1vdmUgdGhlIHNldHRpbmcgb2YgdGhlc2UgcGFybXMgc29tZXdoZXJlIGVsc2Ugb25jZQorCSAqIHdlIGdldCBhIGZpYiB0aGF0IGNhbiByZXBvcnQgdGhlIGFjdHVhbCBudW1iZXJzCisJICovCisJc2hvc3QtPm1heF9sdW4gPSBBQUNfTUFYX0xVTjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZGVpbml0OworCXNjc2lfc2Nhbl9ob3N0KHNob3N0KTsKKworCXJldHVybiAwOworCitvdXRfZGVpbml0OgorCWtpbGxfcHJvYyhhYWMtPnRocmVhZF9waWQsIFNJR0tJTEwsIDApOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFhYy0+YWlmX2NvbXBsZXRpb24pOworCisJYWFjX3NlbmRfc2h1dGRvd24oYWFjKTsKKwlmaWJfbWFwX2ZyZWUoYWFjKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFhYy0+cGRldiwgYWFjLT5jb21tX3NpemUsIGFhYy0+Y29tbV9hZGRyLCBhYWMtPmNvbW1fcGh5cyk7CisJa2ZyZWUoYWFjLT5xdWV1ZXMpOworCWZyZWVfaXJxKHBkZXYtPmlycSwgYWFjKTsKKwlpb3VubWFwKGFhYy0+cmVncy5zYSk7Cisgb3V0X2ZyZWVfZmliczoKKwlrZnJlZShhYWMtPmZpYnMpOworCWtmcmVlKGFhYy0+ZnNhX2Rldik7Cisgb3V0X2ZyZWVfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKyBvdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWFjX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFhY19kZXYgKmFhYyA9IChzdHJ1Y3QgYWFjX2RldiAqKXNob3N0LT5ob3N0ZGF0YTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCisJa2lsbF9wcm9jKGFhYy0+dGhyZWFkX3BpZCwgU0lHS0lMTCwgMCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYWFjLT5haWZfY29tcGxldGlvbik7CisKKwlhYWNfc2VuZF9zaHV0ZG93bihhYWMpOworCWZpYl9tYXBfZnJlZShhYWMpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWFjLT5wZGV2LCBhYWMtPmNvbW1fc2l6ZSwgYWFjLT5jb21tX2FkZHIsCisJCQlhYWMtPmNvbW1fcGh5cyk7CisJa2ZyZWUoYWFjLT5xdWV1ZXMpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBhYWMpOworCWlvdW5tYXAoYWFjLT5yZWdzLnNhKTsKKwkKKwlrZnJlZShhYWMtPmZpYnMpOworCQorCWxpc3RfZGVsKCZhYWMtPmVudHJ5KTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhYWNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBBQUNfRFJJVkVSTkFNRSwKKwkuaWRfdGFibGUJPSBhYWNfcGNpX3RibCwKKwkucHJvYmUJCT0gYWFjX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFhY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFhY19pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCQorCXByaW50ayhLRVJOX0lORk8gIlJlZCBIYXQvQWRhcHRlYyBhYWNyYWlkIGRyaXZlciAoJXMgJXMpXG4iLAorCQkJQUFDX0RSSVZFUl9WRVJTSU9OLCBBQUNfRFJJVkVSX0JVSUxEX0RBVEUpOworCisJZXJyb3IgPSBwY2lfbW9kdWxlX2luaXQoJmFhY19wY2lfZHJpdmVyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWFhY19jZmdfbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoIDAsICJhYWMiLCAmYWFjX2NmZ19mb3BzKTsKKwlpZiAoYWFjX2NmZ19tYWpvciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImFhY3JhaWQ6IHVuYWJsZSB0byByZWdpc3RlciBcImFhY1wiIGRldmljZS5cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFhY19leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXYoYWFjX2NmZ19tYWpvciwgImFhYyIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWFjX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhYWNfaW5pdCk7Cittb2R1bGVfZXhpdChhYWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGVkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYwpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIE1vZHVsZSBOYW1lOgorICogIHJrdC5jCisgKgorICogQWJzdHJhY3Q6IEhhcmR3YXJlIG1pbmlwb3J0IGZvciBEcmF3YnJpZGdlIHNwZWNpZmljIGhhcmR3YXJlIGZ1bmN0aW9ucy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJhYWNyYWlkLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhYWNfcmt0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYWFjX2RldiAqZGV2ID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgYmVsbGJpdHM7CisJdTggaW50c3RhdCwgbWFzazsKKwlpbnRzdGF0ID0gcmt0X3JlYWRiKGRldiwgTVVuaXQuT0lTUik7CisJLyoKKwkgKglSZWFkIG1hc2sgYW5kIGludmVydCBiZWNhdXNlIGRyYXdicmlkZ2UgaXMgcmV2ZXJzZWQuCisJICoJVGhpcyBhbGxvd3MgdXMgdG8gb25seSBzZXJ2aWNlIGludGVycnVwdHMgdGhhdCBoYXZlIAorCSAqCWJlZW4gZW5hYmxlZC4KKwkgKi8KKwltYXNrID0gfihkZXYtPk9JTVIpOworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBpbnRlcnJ1cHQuICBJZiBpdCBpc24ndCBqdXN0IHJldHVybiAqLworCWlmIChpbnRzdGF0ICYgbWFzaykgCisJeworCQliZWxsYml0cyA9IHJrdF9yZWFkbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcpOworCQlpZiAoYmVsbGJpdHMgJiBEb29yQmVsbFByaW50ZlJlYWR5KSB7CisJCQlhYWNfcHJpbnRmKGRldiwgcmt0X3JlYWRsKGRldiwgSW5kZXhSZWdzLk1haWxib3hbNV0pKTsKKwkJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsRG9vckJlbGxQcmludGZSZWFkeSk7CisJCQlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZERvb3JiZWxsUmVnLERvb3JCZWxsUHJpbnRmRG9uZSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kUmVhZHkpIHsKKwkJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1DbWRSZWFkeSk7CisJCQlhYWNfY29tbWFuZF9ub3JtYWwoJmRldi0+cXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5KSB7CisJCQlhYWNfcmVzcG9uc2Vfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdKTsKKwkJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsRG9vckJlbGxBZGFwdGVyTm9ybVJlc3BSZWFkeSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kTm90RnVsbCkgeworCQkJcmt0X3dyaXRlbChkZXYsIE1Vbml0Lk9EUiwgRG9vckJlbGxBZGFwdGVyTm9ybUNtZE5vdEZ1bGwpOworCQl9CisJCWVsc2UgaWYgKGJlbGxiaXRzICYgRG9vckJlbGxBZGFwdGVyTm9ybVJlc3BOb3RGdWxsKSB7CisJCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kTm90RnVsbCk7CisJCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcE5vdEZ1bGwpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCisvKioKKyAqCXJrdF9zeW5jX2NtZAktCXNlbmQgYSBjb21tYW5kIGFuZCB3YWl0CisgKglAZGV2OiBBZGFwdGVyCisgKglAY29tbWFuZDogQ29tbWFuZCB0byBleGVjdXRlCisgKglAcDE6IGZpcnN0IHBhcmFtZXRlcgorICoJQHJldDogYWRhcHRlciBzdGF0dXMKKyAqCisgKglUaGlzIHJvdXRpbmUgd2lsbCBzZW5kIGEgc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUgYWRhcHRlciBhbmQgd2FpdCAKKyAqCWZvciBpdHMJY29tcGxldGlvbi4KKyAqLworCitzdGF0aWMgaW50IHJrdF9zeW5jX2NtZChzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCWludCBvazsKKwkvKgorCSAqCVdyaXRlIHRoZSBjb21tYW5kIGludG8gTWFpbGJveCAwCisJICovCisJcmt0X3dyaXRlbChkZXYsIEluYm91bmRNYWlsYm94MCwgY29tbWFuZCk7CisJLyoKKwkgKglXcml0ZSB0aGUgcGFyYW1ldGVycyBpbnRvIE1haWxib3hlcyAxIC0gNAorCSAqLworCXJrdF93cml0ZWwoZGV2LCBJbmJvdW5kTWFpbGJveDEsIHAxKTsKKwlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gyLCAwKTsKKwlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gzLCAwKTsKKwlya3Rfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3g0LCAwKTsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsIHRvIHN0YXJ0IG9uIGEgY2xlYW4gc2xhdGUuCisJICovCisJcmt0X3dyaXRlbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcsIE9VVEJPVU5ERE9PUkJFTExfMCk7CisJLyoKKwkgKglEaXNhYmxlIGRvb3JiZWxsIGludGVycnVwdHMKKwkgKi8KKwlya3Rfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmZik7CisJLyoKKwkgKglGb3JjZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgbWFzayByZWdpc3RlciB3cml0ZSBiZWZvcmUgaXNzdWluZworCSAqCXRoZSBpbnRlcnJ1cHQuCisJICovCisJcmt0X3JlYWRiIChkZXYsIE1Vbml0Lk9JTVIpOworCS8qCisJICoJU2lnbmFsIHRoYXQgdGhlcmUgaXMgYSBuZXcgc3luY2ggY29tbWFuZAorCSAqLworCXJrdF93cml0ZWwoZGV2LCBJbmJvdW5kRG9vcmJlbGxSZWcsIElOQk9VTkRET09SQkVMTF8wKTsKKworCW9rID0gMDsKKwlzdGFydCA9IGppZmZpZXM7CisKKwkvKgorCSAqCVdhaXQgdXAgdG8gMzAgc2Vjb25kcworCSAqLworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdGFydCszMCpIWikpIAorCXsKKwkJdWRlbGF5KDUpOwkvKiBEZWxheSA1IG1pY3Jvc2Vjb25kcyB0byBsZXQgTW9uOTYwIGdldCBpbmZvLiAqLworCQkvKgorCQkgKglNb245NjAgd2lsbCBzZXQgZG9vcmJlbGwwIGJpdCB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgdGhlIGNvbW1hbmQuCisJCSAqLworCQlpZiAocmt0X3JlYWRsKGRldiwgT3V0Ym91bmREb29yYmVsbFJlZykgJiBPVVRCT1VORERPT1JCRUxMXzApIHsKKwkJCS8qCisJCQkgKglDbGVhciB0aGUgZG9vcmJlbGwuCisJCQkgKi8KKwkJCXJrdF93cml0ZWwoZGV2LCBPdXRib3VuZERvb3JiZWxsUmVnLCBPVVRCT1VORERPT1JCRUxMXzApOworCQkJb2sgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICoJWWllbGQgdGhlIHByb2Nlc3NvciBpbiBjYXNlIHdlIGFyZSBzbG93IAorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwlpZiAob2sgIT0gMSkgeworCQkvKgorCQkgKglSZXN0b3JlIGludGVycnVwdCBtYXNrIGV2ZW4gdGhvdWdoIHdlIHRpbWVkIG91dAorCQkgKi8KKwkJcmt0X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiA9IDB4ZmIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJLyoKKwkgKglQdWxsIHRoZSBzeW5jaCBzdGF0dXMgZnJvbSBNYWlsYm94IDAuCisJICovCisJaWYgKHN0YXR1cykKKwkJKnN0YXR1cyA9IHJrdF9yZWFkbChkZXYsIEluZGV4UmVncy5NYWlsYm94WzBdKTsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsLgorCSAqLworCXJrdF93cml0ZWwoZGV2LCBPdXRib3VuZERvb3JiZWxsUmVnLCBPVVRCT1VORERPT1JCRUxMXzApOworCS8qCisJICoJUmVzdG9yZSBpbnRlcnJ1cHQgbWFzaworCSAqLworCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgPSAweGZiKTsKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqCWFhY19ya3RfaW50ZXJydXB0X2FkYXB0ZXIJLQlpbnRlcnJ1cHQgYWRhcHRlcgorICoJQGRldjogQWRhcHRlcgorICoKKyAqCVNlbmQgYW4gaW50ZXJydXB0IHRvIHRoZSBpOTYwIGFuZCBicmVha3BvaW50IGl0LgorICovCisKK3N0YXRpYyB2b2lkIGFhY19ya3RfaW50ZXJydXB0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgcmV0OworCXJrdF9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3JrdF9ub3RpZnlfYWRhcHRlcgkJLQlzZW5kIGFuIGV2ZW50IHRvIHRoZSBhZGFwdGVyCisgKglAZGV2OiBBZGFwdGVyCisgKglAZXZlbnQ6IEV2ZW50IHRvIHNlbmQKKyAqCisgKglOb3RpZnkgdGhlIGk5NjAgdGhhdCBzb21ldGhpbmcgaXQgcHJvYmFibHkgY2FyZXMgYWJvdXQgaGFzCisgKgloYXBwZW5lZC4KKyAqLworCitzdGF0aWMgdm9pZCBhYWNfcmt0X25vdGlmeV9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHUzMiBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisKKwljYXNlIEFkYXBOb3JtQ21kUXVlOgorCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybVJlc3BOb3RGdWxsOgorCQlya3Rfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF80KTsKKwkJYnJlYWs7CisJY2FzZSBBZGFwTm9ybVJlc3BRdWU6CisJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzIpOworCQlicmVhazsKKwljYXNlIEhvc3ROb3JtQ21kTm90RnVsbDoKKwkJcmt0X3dyaXRlbChkZXYsIE1Vbml0LklEUixJTkJPVU5ERE9PUkJFTExfMyk7CisJCWJyZWFrOworCWNhc2UgSG9zdFNodXRkb3duOgorLy8JCXJrdF9zeW5jX2NtZChkZXYsIEhPU1RfQ1JBU0hJTkcsIDAsIDAsIDAsIDAsICZyZXQpOworCQlicmVhazsKKwljYXNlIEZhc3RJbzoKKwkJcmt0X3dyaXRlbChkZXYsIE1Vbml0LklEUixJTkJPVU5ERE9PUkJFTExfNik7CisJCWJyZWFrOworCWNhc2UgQWRhcFByaW50ZkRvbmU6CisJCXJrdF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCWFhY19ya3Rfc3RhcnRfYWRhcHRlcgkJLQlhY3RpdmF0ZSBhZGFwdGVyCisgKglAZGV2OglBZGFwdGVyCisgKgorICoJU3RhcnQgdXAgcHJvY2Vzc2luZyBvbiBhbiBpOTYwIGJhc2VkIEFBQyBhZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3JrdF9zdGFydF9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdTMyIHN0YXR1czsKKwlzdHJ1Y3QgYWFjX2luaXQgKmluaXQ7CisKKwlpbml0ID0gZGV2LT5pbml0OworCWluaXQtPkhvc3RFbGFwc2VkU2Vjb25kcyA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCS8qCisJICoJVGVsbCB0aGUgYWRhcHRlciB3ZSBhcmUgYmFjayBhbmQgdXAgYW5kIHJ1bm5pbmcgc28gaXQgd2lsbCBzY2FuCisJICoJaXRzIGNvbW1hbmQgcXVldWVzIGFuZCBlbmFibGUgb3VyIGludGVycnVwdHMKKwkgKi8KKwlkZXYtPmlycV9tYXNrID0gKERvb3JCZWxsUHJpbnRmUmVhZHkgfCBPVVRCT1VORERPT1JCRUxMXzEgfCBPVVRCT1VORERPT1JCRUxMXzIgfCBPVVRCT1VORERPT1JCRUxMXzMgfCBPVVRCT1VORERPT1JCRUxMXzQpOworCS8qCisJICoJRmlyc3QgY2xlYXIgb3V0IGFsbCBpbnRlcnJ1cHRzLiAgVGhlbiBlbmFibGUgdGhlIG9uZSdzIHRoYXQgd2UKKwkgKgljYW4gaGFuZGxlLgorCSAqLworCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCAweGZmKTsKKwlya3Rfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCAweGZmZmZmZmZmKTsKKy8vCXJrdF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCB+KHU4KU9VVEJPVU5EX0RPT1JCRUxMX0lOVEVSUlVQVF9NQVNLKTsKKwlya3Rfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmYik7CisKKwkvLyBXZSBjYW4gb25seSB1c2UgYSAzMiBiaXQgYWRkcmVzcyBoZXJlCisJcmt0X3N5bmNfY21kKGRldiwgSU5JVF9TVFJVQ1RfQkFTRV9BRERSRVNTLCAodTMyKSh1bG9uZylkZXYtPmluaXRfcGEsICZzdGF0dXMpOworfQorCisvKioKKyAqCWFhY19ya3RfY2hlY2tfaGVhbHRoCisgKglAZGV2OiBkZXZpY2UgdG8gY2hlY2sgaWYgaGVhbHRoeQorICoKKyAqCVdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBhZGFwdGVyIGlzIGFsaXZlIGFuZAorICoJY2FwYWJsZSBvZiBoYW5kbGluZyByZXF1ZXN0cywgcmV0dXJuaW5nIDAgaWYgYWxpdmUuCisgKi8KK3N0YXRpYyBpbnQgYWFjX3JrdF9jaGVja19oZWFsdGgoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgc3RhdHVzID0gcmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSk7CisKKwkvKgorCSAqCUNoZWNrIHRvIHNlZSBpZiB0aGUgYm9hcmQgZmFpbGVkIGFueSBzZWxmIHRlc3RzLgorCSAqLworCWlmIChzdGF0dXMgJiBTRUxGX1RFU1RfRkFJTEVEKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIHBhbmljJ2QuCisJICovCisJaWYgKHN0YXR1cyAmIEtFUk5FTF9QQU5JQykgeworCQljaGFyICogYnVmZmVyOworCQlzdHJ1Y3QgUE9TVFNUQVRVUyB7CisJCQl1MzIgUG9zdF9Db21tYW5kOworCQkJdTMyIFBvc3RfQWRkcmVzczsKKwkJfSAqIHBvc3Q7CisJCWRtYV9hZGRyX3QgcGFkZHIsIGJhZGRyOworCQlpbnQgcmV0OworCisJCWlmICgoc3RhdHVzICYgMHhGRjAwMDAwMEwpID09IDB4QkMwMDAwMDBMKQorCQkJcmV0dXJuIChzdGF0dXMgPj4gMTYpICYgMHhGRjsKKwkJYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCA1MTIsICZiYWRkcik7CisJCXJldCA9IC0yOworCQlpZiAoYnVmZmVyID09IE5VTEwpCisJCQlyZXR1cm4gcmV0OworCQlwb3N0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LAorCQkgIHNpemVvZihzdHJ1Y3QgUE9TVFNUQVRVUyksICZwYWRkcik7CisJCWlmIChwb3N0ID09IE5VTEwpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCA1MTIsIGJ1ZmZlciwgYmFkZHIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXIsIDAsIDUxMik7CisJCXBvc3QtPlBvc3RfQ29tbWFuZCA9IGNwdV90b19sZTMyKENPTU1BTkRfUE9TVF9SRVNVTFRTKTsKKyAgICAgICAgICAgICAgICBwb3N0LT5Qb3N0X0FkZHJlc3MgPSBjcHVfdG9fbGUzMihiYWRkcik7CisgICAgICAgICAgICAgICAgcmt0X3dyaXRlbChkZXYsIE1Vbml0LklNUnhbMF0sIHBhZGRyKTsKKyAgICAgICAgICAgICAgICBya3Rfc3luY19jbWQoZGV2LCBDT01NQU5EX1BPU1RfUkVTVUxUUywgYmFkZHIsICZzdGF0dXMpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZW9mKHN0cnVjdCBQT1NUU1RBVFVTKSwKKwkJICBwb3N0LCBwYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKChidWZmZXJbMF0gPT0gJzAnKSAmJiAoYnVmZmVyWzFdID09ICd4JykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IChidWZmZXJbMl0gPD0gJzknKSA/IChidWZmZXJbMl0gLSAnMCcpIDogKGJ1ZmZlclsyXSAtICdBJyArIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA8PD0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSAoYnVmZmVyWzNdIDw9ICc5JykgPyAoYnVmZmVyWzNdIC0gJzAnKSA6IChidWZmZXJbM10gLSAnQScgKyAxMCk7CisgICAgICAgICAgICAgICAgfQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgNTEyLCBidWZmZXIsIGJhZGRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisJLyoKKwkgKglXYWl0IGZvciB0aGUgYWRhcHRlciB0byBiZSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlpZiAoIShzdGF0dXMgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKQorCQlyZXR1cm4gLTM7CisJLyoKKwkgKglFdmVyeXRoaW5nIGlzIE9LCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYWFjX3JrdF9pbml0CS0JaW5pdGlhbGl6ZSBhbiBpOTYwIGJhc2VkIEFBQyBjYXJkCisgKglAZGV2OiBkZXZpY2UgdG8gY29uZmlndXJlCisgKgorICoJQWxsb2NhdGUgYW5kIHNldCB1cCByZXNvdXJjZXMgZm9yIHRoZSBpOTYwIGJhc2VkIEFBQyB2YXJpYW50cy4gVGhlIAorICoJZGV2aWNlX2ludGVyZmFjZSBpbiB0aGUgY29tbXJlZ2lvbiB3aWxsIGJlIGFsbG9jYXRlZCBhbmQgbGlua2VkIAorICoJdG8gdGhlIGNvbW0gcmVnaW9uLgorICovCisKK2ludCBhYWNfcmt0X2luaXQoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWludCBpbnN0YW5jZTsKKwljb25zdCBjaGFyICogbmFtZTsKKworCWluc3RhbmNlID0gZGV2LT5pZDsKKwluYW1lICAgICA9IGRldi0+bmFtZTsKKworCS8qCisJICoJTWFwIGluIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgYWRhcHRlci4KKwkgKi8KKwlpZigoZGV2LT5yZWdzLnJrdCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZGV2LT5zY3NpX2hvc3RfcHRyLT5iYXNlLCA4MTkyKSk9PU5VTEwpCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogdW5hYmxlIHRvIG1hcCBpOTYwLlxuIiApOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBmYWlsZWQgYW55IHNlbGYgdGVzdHMuCisJICovCisJaWYgKHJrdF9yZWFkbChkZXYsIE1Vbml0Lk9NUnhbMF0pICYgU0VMRl9URVNUX0ZBSUxFRCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIgc2VsZi10ZXN0IGZhaWxlZC5cbiIsIGRldi0+bmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBtb25pdG9yIHBhbmljJ2Qgd2hpbGUgYm9vdGluZy4KKwkgKi8KKwlpZiAocmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBNT05JVE9SX1BBTklDKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMlZDogYWRhcHRlciBtb25pdG9yIHBhbmljLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIHBhbmljJ2Qgd2hpbGUgYm9vdGluZy4KKwkgKi8KKwlpZiAocmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBLRVJORUxfUEFOSUMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyVkOiBhZGFwdGVyIGtlcm5lbCBwYW5pYydkLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJc3RhcnQgPSBqaWZmaWVzOworCS8qCisJICoJV2FpdCBmb3IgdGhlIGFkYXB0ZXIgdG8gYmUgdXAgYW5kIHJ1bm5pbmcuIFdhaXQgdXAgdG8gMyBtaW51dGVzCisJICovCisJd2hpbGUgKCEocmt0X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKQorCXsKKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCsxODAqSFopKQorCQl7CisJCQlzdGF0dXMgPSBya3RfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMlZDogYWRhcHRlciBrZXJuZWwgZmFpbGVkIHRvIHN0YXJ0LCBpbml0IHN0YXR1cyA9ICVseC5cbiIsIAorCQkJCQlkZXYtPm5hbWUsIGluc3RhbmNlLCBzdGF0dXMpOworCQkJZ290byBlcnJvcl9pb3VubWFwOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+c2NzaV9ob3N0X3B0ci0+aXJxLCBhYWNfcmt0X2ludHIsIFNBX1NISVJRfFNBX0lOVEVSUlVQVCwgImFhY3JhaWQiLCAodm9pZCAqKWRldik8MCkgCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsIG5hbWUsIGluc3RhbmNlKTsKKwkJZ290byBlcnJvcl9pb3VubWFwOworCX0KKwkvKgorCSAqCUZpbGwgaW4gdGhlIGZ1bmN0aW9uIGRpc3BhdGNoIHRhYmxlLgorCSAqLworCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfcmt0X2ludGVycnVwdF9hZGFwdGVyOworCWRldi0+YV9vcHMuYWRhcHRlcl9ub3RpZnkgPSBhYWNfcmt0X25vdGlmeV9hZGFwdGVyOworCWRldi0+YV9vcHMuYWRhcHRlcl9zeW5jX2NtZCA9IHJrdF9zeW5jX2NtZDsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3JrdF9jaGVja19oZWFsdGg7CisKKwlpZiAoYWFjX2luaXRfYWRhcHRlcihkZXYpID09IE5VTEwpCisJCWdvdG8gZXJyb3JfaXJxOworCS8qCisJICoJU3RhcnQgYW55IGtlcm5lbCB0aHJlYWRzIG5lZWRlZAorCSAqLworCWRldi0+dGhyZWFkX3BpZCA9IGtlcm5lbF90aHJlYWQoKGludCAoKikodm9pZCAqKSlhYWNfY29tbWFuZF90aHJlYWQsIGRldiwgMCk7CisJaWYoZGV2LT50aHJlYWRfcGlkIDwgMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiYWFjcmFpZDogVW5hYmxlIHRvIGNyZWF0ZSBya3QgdGhyZWFkLlxuIik7CisJCWdvdG8gZXJyb3Jfa2ZyZWU7CisJfQkKKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBhbGwgaXMgY29uZmlndXJlZCwgYW5kIGl0IGNhbiBzdGFydAorCSAqCWFjY2VwdGluZyByZXF1ZXN0cworCSAqLworCWFhY19ya3Rfc3RhcnRfYWRhcHRlcihkZXYpOworCXJldHVybiAwOworCitlcnJvcl9rZnJlZToKKwlrZnJlZShkZXYtPnF1ZXVlcyk7CisKK2Vycm9yX2lycToKKwlmcmVlX2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgKHZvaWQgKilkZXYpOworCitlcnJvcl9pb3VubWFwOgorCWlvdW5tYXAoZGV2LT5yZWdzLnJrdCk7CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBiOTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwpAQCAtMCwwICsxLDQ0MSBAQAorLyoKKyAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KKyAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIE1vZHVsZSBOYW1lOgorICogIHJ4LmMKKyAqCisgKiBBYnN0cmFjdDogSGFyZHdhcmUgbWluaXBvcnQgZm9yIERyYXdicmlkZ2Ugc3BlY2lmaWMgaGFyZHdhcmUgZnVuY3Rpb25zLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImFhY3JhaWQuaCIKKworc3RhdGljIGlycXJldHVybl90IGFhY19yeF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGFhY19kZXYgKmRldiA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGJlbGxiaXRzOworCXU4IGludHN0YXQsIG1hc2s7CisJaW50c3RhdCA9IHJ4X3JlYWRiKGRldiwgTVVuaXQuT0lTUik7CisJLyoKKwkgKglSZWFkIG1hc2sgYW5kIGludmVydCBiZWNhdXNlIGRyYXdicmlkZ2UgaXMgcmV2ZXJzZWQuCisJICoJVGhpcyBhbGxvd3MgdXMgdG8gb25seSBzZXJ2aWNlIGludGVycnVwdHMgdGhhdCBoYXZlIAorCSAqCWJlZW4gZW5hYmxlZC4KKwkgKi8KKwltYXNrID0gfihkZXYtPk9JTVIpOworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBpbnRlcnJ1cHQuICBJZiBpdCBpc24ndCBqdXN0IHJldHVybiAqLworCWlmIChpbnRzdGF0ICYgbWFzaykgCisJeworCQliZWxsYml0cyA9IHJ4X3JlYWRsKGRldiwgT3V0Ym91bmREb29yYmVsbFJlZyk7CisJCWlmIChiZWxsYml0cyAmIERvb3JCZWxsUHJpbnRmUmVhZHkpIHsKKwkJCWFhY19wcmludGYoZGV2LCBsZTMyX3RvX2NwdShyeF9yZWFkbCAoZGV2LCBJbmRleFJlZ3MuTWFpbGJveFs1XSkpKTsKKwkJCXJ4X3dyaXRlbChkZXYsIE1Vbml0Lk9EUixEb29yQmVsbFByaW50ZlJlYWR5KTsKKwkJCXJ4X3dyaXRlbChkZXYsIEluYm91bmREb29yYmVsbFJlZyxEb29yQmVsbFByaW50ZkRvbmUpOworCQl9CisJCWVsc2UgaWYgKGJlbGxiaXRzICYgRG9vckJlbGxBZGFwdGVyTm9ybUNtZFJlYWR5KSB7CisJCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1DbWRSZWFkeSk7CisJCQlhYWNfY29tbWFuZF9ub3JtYWwoJmRldi0+cXVldWVzLT5xdWV1ZVtIb3N0Tm9ybUNtZFF1ZXVlXSk7CisJCX0KKwkJZWxzZSBpZiAoYmVsbGJpdHMgJiBEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5KSB7CisJCQlhYWNfcmVzcG9uc2Vfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdKTsKKwkJCXJ4X3dyaXRlbChkZXYsIE1Vbml0Lk9EUixEb29yQmVsbEFkYXB0ZXJOb3JtUmVzcFJlYWR5KTsKKwkJfQorCQllbHNlIGlmIChiZWxsYml0cyAmIERvb3JCZWxsQWRhcHRlck5vcm1DbWROb3RGdWxsKSB7CisJCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1DbWROb3RGdWxsKTsKKwkJfQorCQllbHNlIGlmIChiZWxsYml0cyAmIERvb3JCZWxsQWRhcHRlck5vcm1SZXNwTm90RnVsbCkgeworCQkJcnhfd3JpdGVsKGRldiwgTVVuaXQuT0RSLCBEb29yQmVsbEFkYXB0ZXJOb3JtQ21kTm90RnVsbCk7CisJCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIERvb3JCZWxsQWRhcHRlck5vcm1SZXNwTm90RnVsbCk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qKgorICoJcnhfc3luY19jbWQJLQlzZW5kIGEgY29tbWFuZCBhbmQgd2FpdAorICoJQGRldjogQWRhcHRlcgorICoJQGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZQorICoJQHAxOiBmaXJzdCBwYXJhbWV0ZXIKKyAqCUByZXQ6IGFkYXB0ZXIgc3RhdHVzCisgKgorICoJVGhpcyByb3V0aW5lIHdpbGwgc2VuZCBhIHN5bmNocm9ub3VzIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIgYW5kIHdhaXQgCisgKglmb3IgaXRzCWNvbXBsZXRpb24uCisgKi8KKworc3RhdGljIGludCByeF9zeW5jX2NtZChzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCWludCBvazsKKwkvKgorCSAqCVdyaXRlIHRoZSBjb21tYW5kIGludG8gTWFpbGJveCAwCisJICovCisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gwLCBjb21tYW5kKTsKKwkvKgorCSAqCVdyaXRlIHRoZSBwYXJhbWV0ZXJzIGludG8gTWFpbGJveGVzIDEgLSA0CisJICovCisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gxLCBwMSk7CisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZE1haWxib3gyLCAwKTsKKwlyeF93cml0ZWwoZGV2LCBJbmJvdW5kTWFpbGJveDMsIDApOworCXJ4X3dyaXRlbChkZXYsIEluYm91bmRNYWlsYm94NCwgMCk7CisJLyoKKwkgKglDbGVhciB0aGUgc3luY2ggY29tbWFuZCBkb29yYmVsbCB0byBzdGFydCBvbiBhIGNsZWFuIHNsYXRlLgorCSAqLworCXJ4X3dyaXRlbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcsIE9VVEJPVU5ERE9PUkJFTExfMCk7CisJLyoKKwkgKglEaXNhYmxlIGRvb3JiZWxsIGludGVycnVwdHMKKwkgKi8KKwlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgfD0gMHgwNCk7CisJLyoKKwkgKglGb3JjZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgbWFzayByZWdpc3RlciB3cml0ZSBiZWZvcmUgaXNzdWluZworCSAqCXRoZSBpbnRlcnJ1cHQuCisJICovCisJcnhfcmVhZGIgKGRldiwgTVVuaXQuT0lNUik7CisJLyoKKwkgKglTaWduYWwgdGhhdCB0aGVyZSBpcyBhIG5ldyBzeW5jaCBjb21tYW5kCisJICovCisJcnhfd3JpdGVsKGRldiwgSW5ib3VuZERvb3JiZWxsUmVnLCBJTkJPVU5ERE9PUkJFTExfMCk7CisKKwlvayA9IDA7CisJc3RhcnQgPSBqaWZmaWVzOworCisJLyoKKwkgKglXYWl0IHVwIHRvIDMwIHNlY29uZHMKKwkgKi8KKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgc3RhcnQrMzAqSFopKSAKKwl7CisJCXVkZWxheSg1KTsJLyogRGVsYXkgNSBtaWNyb3NlY29uZHMgdG8gbGV0IE1vbjk2MCBnZXQgaW5mby4gKi8KKwkJLyoKKwkJICoJTW9uOTYwIHdpbGwgc2V0IGRvb3JiZWxsMCBiaXQgd2hlbiBpdCBoYXMgY29tcGxldGVkIHRoZSBjb21tYW5kLgorCQkgKi8KKwkJaWYgKHJ4X3JlYWRsKGRldiwgT3V0Ym91bmREb29yYmVsbFJlZykgJiBPVVRCT1VORERPT1JCRUxMXzApIHsKKwkJCS8qCisJCQkgKglDbGVhciB0aGUgZG9vcmJlbGwuCisJCQkgKi8KKwkJCXJ4X3dyaXRlbChkZXYsIE91dGJvdW5kRG9vcmJlbGxSZWcsIE9VVEJPVU5ERE9PUkJFTExfMCk7CisJCQlvayA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKglZaWVsZCB0aGUgcHJvY2Vzc29yIGluIGNhc2Ugd2UgYXJlIHNsb3cgCisJCSAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCWlmIChvayAhPSAxKSB7CisJCS8qCisJCSAqCVJlc3RvcmUgaW50ZXJydXB0IG1hc2sgZXZlbiB0aG91Z2ggd2UgdGltZWQgb3V0CisJCSAqLworCQlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCBkZXYtPk9JTVIgJj0gMHhmYik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwkvKgorCSAqCVB1bGwgdGhlIHN5bmNoIHN0YXR1cyBmcm9tIE1haWxib3ggMC4KKwkgKi8KKwlpZiAoc3RhdHVzKQorCQkqc3RhdHVzID0gcnhfcmVhZGwoZGV2LCBJbmRleFJlZ3MuTWFpbGJveFswXSk7CisJLyoKKwkgKglDbGVhciB0aGUgc3luY2ggY29tbWFuZCBkb29yYmVsbC4KKwkgKi8KKwlyeF93cml0ZWwoZGV2LCBPdXRib3VuZERvb3JiZWxsUmVnLCBPVVRCT1VORERPT1JCRUxMXzApOworCS8qCisJICoJUmVzdG9yZSBpbnRlcnJ1cHQgbWFzaworCSAqLworCXJ4X3dyaXRlYihkZXYsIE1Vbml0Lk9JTVIsIGRldi0+T0lNUiAmPSAweGZiKTsKKwlyZXR1cm4gMDsKKworfQorCisvKioKKyAqCWFhY19yeF9pbnRlcnJ1cHRfYWRhcHRlcgktCWludGVycnVwdCBhZGFwdGVyCisgKglAZGV2OiBBZGFwdGVyCisgKgorICoJU2VuZCBhbiBpbnRlcnJ1cHQgdG8gdGhlIGk5NjAgYW5kIGJyZWFrcG9pbnQgaXQuCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3J4X2ludGVycnVwdF9hZGFwdGVyKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdTMyIHJldDsKKwlyeF9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3J4X25vdGlmeV9hZGFwdGVyCQktCXNlbmQgYW4gZXZlbnQgdG8gdGhlIGFkYXB0ZXIKKyAqCUBkZXY6IEFkYXB0ZXIKKyAqCUBldmVudDogRXZlbnQgdG8gc2VuZAorICoKKyAqCU5vdGlmeSB0aGUgaTk2MCB0aGF0IHNvbWV0aGluZyBpdCBwcm9iYWJseSBjYXJlcyBhYm91dCBoYXMKKyAqCWhhcHBlbmVkLgorICovCisKK3N0YXRpYyB2b2lkIGFhY19yeF9ub3RpZnlfYWRhcHRlcihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCisJY2FzZSBBZGFwTm9ybUNtZFF1ZToKKwkJcnhfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybVJlc3BOb3RGdWxsOgorCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzQpOworCQlicmVhazsKKwljYXNlIEFkYXBOb3JtUmVzcFF1ZToKKwkJcnhfd3JpdGVsKGRldiwgTVVuaXQuSURSLElOQk9VTkRET09SQkVMTF8yKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybUNtZE5vdEZ1bGw6CisJCXJ4X3dyaXRlbChkZXYsIE1Vbml0LklEUixJTkJPVU5ERE9PUkJFTExfMyk7CisJCWJyZWFrOworCWNhc2UgSG9zdFNodXRkb3duOgorLy8JCXJ4X3N5bmNfY21kKGRldiwgSE9TVF9DUkFTSElORywgMCwgMCwgMCwgMCwgJnJldCk7CisJCWJyZWFrOworCWNhc2UgRmFzdElvOgorCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzYpOworCQlicmVhazsKKwljYXNlIEFkYXBQcmludGZEb25lOgorCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JRFIsSU5CT1VORERPT1JCRUxMXzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCWFhY19yeF9zdGFydF9hZGFwdGVyCQktCWFjdGl2YXRlIGFkYXB0ZXIKKyAqCUBkZXY6CUFkYXB0ZXIKKyAqCisgKglTdGFydCB1cCBwcm9jZXNzaW5nIG9uIGFuIGk5NjAgYmFzZWQgQUFDIGFkYXB0ZXIKKyAqLworCitzdGF0aWMgdm9pZCBhYWNfcnhfc3RhcnRfYWRhcHRlcihzdHJ1Y3QgYWFjX2RldiAqZGV2KQoreworCXUzMiBzdGF0dXM7CisJc3RydWN0IGFhY19pbml0ICppbml0OworCisJaW5pdCA9IGRldi0+aW5pdDsKKwlpbml0LT5Ib3N0RWxhcHNlZFNlY29uZHMgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgd2UgYXJlIGJhY2sgYW5kIHVwIGFuZCBydW5uaW5nIHNvIGl0IHdpbGwgc2NhbgorCSAqCWl0cyBjb21tYW5kIHF1ZXVlcyBhbmQgZW5hYmxlIG91ciBpbnRlcnJ1cHRzCisJICovCisJZGV2LT5pcnFfbWFzayA9IChEb29yQmVsbFByaW50ZlJlYWR5IHwgT1VUQk9VTkRET09SQkVMTF8xIHwgT1VUQk9VTkRET09SQkVMTF8yIHwgT1VUQk9VTkRET09SQkVMTF8zIHwgT1VUQk9VTkRET09SQkVMTF80KTsKKwkvKgorCSAqCUZpcnN0IGNsZWFyIG91dCBhbGwgaW50ZXJydXB0cy4gIFRoZW4gZW5hYmxlIHRoZSBvbmUncyB0aGF0IHdlCisJICoJY2FuIGhhbmRsZS4KKwkgKi8KKwlyeF93cml0ZWIoZGV2LCBNVW5pdC5PSU1SLCAweGZmKTsKKwlyeF93cml0ZWwoZGV2LCBNVW5pdC5PRFIsIDB4ZmZmZmZmZmYpOworLy8Jcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgfih1OClPVVRCT1VORF9ET09SQkVMTF9JTlRFUlJVUFRfTUFTSyk7CisJcnhfd3JpdGViKGRldiwgTVVuaXQuT0lNUiwgZGV2LT5PSU1SID0gMHhmYik7CisKKwkvLyBXZSBjYW4gb25seSB1c2UgYSAzMiBiaXQgYWRkcmVzcyBoZXJlCisJcnhfc3luY19jbWQoZGV2LCBJTklUX1NUUlVDVF9CQVNFX0FERFJFU1MsICh1MzIpKHVsb25nKWRldi0+aW5pdF9wYSwgJnN0YXR1cyk7Cit9CisKKy8qKgorICoJYWFjX3J4X2NoZWNrX2hlYWx0aAorICoJQGRldjogZGV2aWNlIHRvIGNoZWNrIGlmIGhlYWx0aHkKKyAqCisgKglXaWxsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcyBhbGl2ZSBhbmQKKyAqCWNhcGFibGUgb2YgaGFuZGxpbmcgcmVxdWVzdHMsIHJldHVybmluZyAwIGlmIGFsaXZlLgorICovCitzdGF0aWMgaW50IGFhY19yeF9jaGVja19oZWFsdGgoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgc3RhdHVzID0gcnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKTsKKworCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBmYWlsZWQgYW55IHNlbGYgdGVzdHMuCisJICovCisJaWYgKHN0YXR1cyAmIFNFTEZfVEVTVF9GQUlMRUQpCisJCXJldHVybiAtMTsKKwkvKgorCSAqCUNoZWNrIHRvIHNlZSBpZiB0aGUgYm9hcmQgcGFuaWMnZC4KKwkgKi8KKwlpZiAoc3RhdHVzICYgS0VSTkVMX1BBTklDKSB7CisJCWNoYXIgKiBidWZmZXI7CisJCXN0cnVjdCBQT1NUU1RBVFVTIHsKKwkJCXUzMiBQb3N0X0NvbW1hbmQ7CisJCQl1MzIgUG9zdF9BZGRyZXNzOworCQl9ICogcG9zdDsKKwkJZG1hX2FkZHJfdCBwYWRkciwgYmFkZHI7CisJCWludCByZXQ7CisKKwkJaWYgKChzdGF0dXMgJiAweEZGMDAwMDAwTCkgPT0gMHhCQzAwMDAwMEwpCisJCQlyZXR1cm4gKHN0YXR1cyA+PiAxNikgJiAweEZGOworCQlidWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIDUxMiwgJmJhZGRyKTsKKwkJcmV0ID0gLTI7CisJCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJCXJldHVybiByZXQ7CisJCXBvc3QgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsCisJCSAgc2l6ZW9mKHN0cnVjdCBQT1NUU1RBVFVTKSwgJnBhZGRyKTsKKwkJaWYgKHBvc3QgPT0gTlVMTCkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIDUxMiwgYnVmZmVyLCBiYWRkcik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1lbXNldChidWZmZXIsIDAsIDUxMik7CisJCXBvc3QtPlBvc3RfQ29tbWFuZCA9IGNwdV90b19sZTMyKENPTU1BTkRfUE9TVF9SRVNVTFRTKTsKKwkJcG9zdC0+UG9zdF9BZGRyZXNzID0gY3B1X3RvX2xlMzIoYmFkZHIpOworCQlyeF93cml0ZWwoZGV2LCBNVW5pdC5JTVJ4WzBdLCBwYWRkcik7CisJCXJ4X3N5bmNfY21kKGRldiwgQ09NTUFORF9QT1NUX1JFU1VMVFMsIGJhZGRyLCAmc3RhdHVzKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgUE9TVFNUQVRVUyksCisJCSAgcG9zdCwgcGFkZHIpOworCQlpZiAoKGJ1ZmZlclswXSA9PSAnMCcpICYmIChidWZmZXJbMV0gPT0gJ3gnKSkgeworCQkJcmV0ID0gKGJ1ZmZlclsyXSA8PSAnOScpID8gKGJ1ZmZlclsyXSAtICcwJykgOiAoYnVmZmVyWzJdIC0gJ0EnICsgMTApOworCQkJcmV0IDw8PSA0OworCQkJcmV0ICs9IChidWZmZXJbM10gPD0gJzknKSA/IChidWZmZXJbM10gLSAnMCcpIDogKGJ1ZmZlclszXSAtICdBJyArIDEwKTsKKwkJfQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgNTEyLCBidWZmZXIsIGJhZGRyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyoKKwkgKglXYWl0IGZvciB0aGUgYWRhcHRlciB0byBiZSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlpZiAoIShzdGF0dXMgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKQorCQlyZXR1cm4gLTM7CisJLyoKKwkgKglFdmVyeXRoaW5nIGlzIE9LCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYWFjX3J4X2luaXQJLQlpbml0aWFsaXplIGFuIGk5NjAgYmFzZWQgQUFDIGNhcmQKKyAqCUBkZXY6IGRldmljZSB0byBjb25maWd1cmUKKyAqCisgKglBbGxvY2F0ZSBhbmQgc2V0IHVwIHJlc291cmNlcyBmb3IgdGhlIGk5NjAgYmFzZWQgQUFDIHZhcmlhbnRzLiBUaGUgCisgKglkZXZpY2VfaW50ZXJmYWNlIGluIHRoZSBjb21tcmVnaW9uIHdpbGwgYmUgYWxsb2NhdGVkIGFuZCBsaW5rZWQgCisgKgl0byB0aGUgY29tbSByZWdpb24uCisgKi8KKworaW50IGFhY19yeF9pbml0KHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwlpbnQgaW5zdGFuY2U7CisJY29uc3QgY2hhciAqIG5hbWU7CisKKwlpbnN0YW5jZSA9IGRldi0+aWQ7CisJbmFtZSAgICAgPSBkZXYtPm5hbWU7CisKKwkvKgorCSAqCU1hcCBpbiB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIGFkYXB0ZXIuCisJICovCisJaWYoKGRldi0+cmVncy5yeCA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZGV2LT5zY3NpX2hvc3RfcHRyLT5iYXNlLCA4MTkyKSk9PU5VTEwpCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogdW5hYmxlIHRvIG1hcCBpOTYwLlxuIiApOworCQlyZXR1cm4gLTE7CisJfQorCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBmYWlsZWQgYW55IHNlbGYgdGVzdHMuCisJICovCisJaWYgKHJ4X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBTRUxGX1RFU1RfRkFJTEVEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMlZDogYWRhcHRlciBzZWxmLXRlc3QgZmFpbGVkLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIHBhbmljJ2Qgd2hpbGUgYm9vdGluZy4KKwkgKi8KKwlpZiAocnhfcmVhZGwoZGV2LCBNVW5pdC5PTVJ4WzBdKSAmIEtFUk5FTF9QQU5JQykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIga2VybmVsIHBhbmljLlxuIiwgZGV2LT5uYW1lLCBpbnN0YW5jZSk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIG1vbml0b3IgcGFuaWMnZCB3aGlsZSBib290aW5nLgorCSAqLworCWlmIChyeF9yZWFkbChkZXYsIE1Vbml0Lk9NUnhbMF0pICYgTU9OSVRPUl9QQU5JQykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIgbW9uaXRvciBwYW5pYy5cbiIsIGRldi0+bmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCXN0YXJ0ID0gamlmZmllczsKKwkvKgorCSAqCVdhaXQgZm9yIHRoZSBhZGFwdGVyIHRvIGJlIHVwIGFuZCBydW5uaW5nLiBXYWl0IHVwIHRvIDMgbWludXRlcworCSAqLworCXdoaWxlICgoIShyeF9yZWFkbChkZXYsIEluZGV4UmVncy5NYWlsYm94WzddKSAmIEtFUk5FTF9VUF9BTkRfUlVOTklORykpCisJCXx8ICghKHJ4X3JlYWRsKGRldiwgTVVuaXQuT01SeFswXSkgJiBLRVJORUxfVVBfQU5EX1JVTk5JTkcpKSkKKwl7CisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQrMTgwKkhaKSkKKwkJeworCQkJc3RhdHVzID0gcnhfcmVhZGwoZGV2LCBJbmRleFJlZ3MuTWFpbGJveFs3XSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IGFkYXB0ZXIga2VybmVsIGZhaWxlZCB0byBzdGFydCwgaW5pdCBzdGF0dXMgPSAlbHguXG4iLCAKKwkJCQkJZGV2LT5uYW1lLCBpbnN0YW5jZSwgc3RhdHVzKTsKKwkJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCWlmIChyZXF1ZXN0X2lycShkZXYtPnNjc2lfaG9zdF9wdHItPmlycSwgYWFjX3J4X2ludHIsIFNBX1NISVJRfFNBX0lOVEVSUlVQVCwgImFhY3JhaWQiLCAodm9pZCAqKWRldik8MCkgCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzJWQ6IEludGVycnVwdCB1bmF2YWlsYWJsZS5cbiIsIG5hbWUsIGluc3RhbmNlKTsKKwkJZ290byBlcnJvcl9pb3VubWFwOworCX0KKwkvKgorCSAqCUZpbGwgaW4gdGhlIGZ1bmN0aW9uIGRpc3BhdGNoIHRhYmxlLgorCSAqLworCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfcnhfaW50ZXJydXB0X2FkYXB0ZXI7CisJZGV2LT5hX29wcy5hZGFwdGVyX25vdGlmeSA9IGFhY19yeF9ub3RpZnlfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSByeF9zeW5jX2NtZDsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3J4X2NoZWNrX2hlYWx0aDsKKworCWlmIChhYWNfaW5pdF9hZGFwdGVyKGRldikgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9pcnE7CisJLyoKKwkgKglTdGFydCBhbnkga2VybmVsIHRocmVhZHMgbmVlZGVkCisJICovCisJZGV2LT50aHJlYWRfcGlkID0ga2VybmVsX3RocmVhZCgoaW50ICgqKSh2b2lkICopKWFhY19jb21tYW5kX3RocmVhZCwgZGV2LCAwKTsKKwlpZihkZXYtPnRocmVhZF9waWQgPCAwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJhYWNyYWlkOiBVbmFibGUgdG8gY3JlYXRlIHJ4IHRocmVhZC5cbiIpOworCQlnb3RvIGVycm9yX2tmcmVlOworCX0KKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBhbGwgaXMgY29uZmlndXJlZCwgYW5kIGl0IGNhbiBzdGFydAorCSAqCWFjY2VwdGluZyByZXF1ZXN0cworCSAqLworCWFhY19yeF9zdGFydF9hZGFwdGVyKGRldik7CisJcmV0dXJuIDA7CisKK2Vycm9yX2tmcmVlOgorCWtmcmVlKGRldi0+cXVldWVzKTsKKworZXJyb3JfaXJxOgorCWZyZWVfaXJxKGRldi0+c2NzaV9ob3N0X3B0ci0+aXJxLCAodm9pZCAqKWRldik7CisKK2Vycm9yX2lvdW5tYXA6CisJaW91bm1hcChkZXYtPnJlZ3MucngpOworCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc2EuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YzMwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3NhLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKglBZGFwdGVjIEFBQyBzZXJpZXMgUkFJRCBjb250cm9sbGVyIGRyaXZlcgorICoJKGMpIENvcHlyaWdodCAyMDAxIFJlZCBIYXQgSW5jLgk8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIGJhc2VkIG9uIHRoZSBvbGQgYWFjcmFpZCBkcml2ZXIgdGhhdCBpcy4uCisgKiBBZGFwdGVjIGFhY3JhaWQgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIEFkYXB0ZWMsIEluYy4gKGFhY3JhaWRAYWRhcHRlYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBNb2R1bGUgTmFtZToKKyAqICBzYS5jCisgKgorICogQWJzdHJhY3Q6IERyYXdicmlkZ2Ugc3BlY2lmaWMgc3VwcG9ydCBmdW5jdGlvbnMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJhYWNyYWlkLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhYWNfc2FfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhYWNfZGV2ICpkZXYgPSBkZXZfaWQ7CisJdW5zaWduZWQgc2hvcnQgaW50c3RhdCwgbWFzazsKKworCWludHN0YXQgPSBzYV9yZWFkdyhkZXYsIERvb3JiZWxsUmVnX3ApOworCS8qCisJICoJUmVhZCBtYXNrIGFuZCBpbnZlcnQgYmVjYXVzZSBkcmF3YnJpZGdlIGlzIHJldmVyc2VkLgorCSAqCVRoaXMgYWxsb3dzIHVzIHRvIG9ubHkgc2VydmljZSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGVuYWJsZWQuCisJICovCisJbWFzayA9IH4oc2FfcmVhZHcoZGV2LCBTYURiQ1NSLlBSSVNFVElSUU1BU0spKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIG91ciBpbnRlcnJ1cHQuICBJZiBpdCBpc24ndCBqdXN0IHJldHVybiAqLworCisJaWYgKGludHN0YXQgJiBtYXNrKSB7CisJCWlmIChpbnRzdGF0ICYgUHJpbnRmUmVhZHkpIHsKKwkJCWFhY19wcmludGYoZGV2LCBzYV9yZWFkbChkZXYsIE1haWxib3g1KSk7CisJCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbENsclJlZ19wLCBQcmludGZSZWFkeSk7IC8qIGNsZWFyIFByaW50ZlJlYWR5ICovCisJCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLCBQcmludGZEb25lKTsKKwkJfSBlbHNlIGlmIChpbnRzdGF0ICYgRE9PUkJFTExfMSkgewkvLyBkZXYgLT4gSG9zdCBOb3JtYWwgQ29tbWFuZCBSZWFkeQorCQkJYWFjX2NvbW1hbmRfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1DbWRRdWV1ZV0pOworCQkJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxDbHJSZWdfcCwgRE9PUkJFTExfMSk7CisJCX0gZWxzZSBpZiAoaW50c3RhdCAmIERPT1JCRUxMXzIpIHsJLy8gZGV2IC0+IEhvc3QgTm9ybWFsIFJlc3BvbnNlIFJlYWR5CisJCQlhYWNfcmVzcG9uc2Vfbm9ybWFsKCZkZXYtPnF1ZXVlcy0+cXVldWVbSG9zdE5vcm1SZXNwUXVldWVdKTsKKwkJCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsQ2xyUmVnX3AsIERPT1JCRUxMXzIpOworCQl9IGVsc2UgaWYgKGludHN0YXQgJiBET09SQkVMTF8zKSB7CS8vIGRldiAtPiBIb3N0IE5vcm1hbCBDb21tYW5kIE5vdCBGdWxsCisJCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbENsclJlZ19wLCBET09SQkVMTF8zKTsKKwkJfSBlbHNlIGlmIChpbnRzdGF0ICYgRE9PUkJFTExfNCkgewkvLyBkZXYgLT4gSG9zdCBOb3JtYWwgUmVzcG9uc2UgTm90IEZ1bGwKKwkJCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsQ2xyUmVnX3AsIERPT1JCRUxMXzQpOworCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCisvKioKKyAqCWFhY19zYV9ub3RpZnlfYWRhcHRlcgkJLQloYW5kbGUgYWRhcHRlciBub3RpZmljYXRpb24KKyAqCUBkZXY6CUFkYXB0ZXIgdGhhdCBub3RpZmljYXRpb24gaXMgZm9yCisgKglAZXZlbnQ6CUV2ZW50IHRvIG5vdGlkeQorICoKKyAqCU5vdGlmeSB0aGUgYWRhcHRlciBvZiBhbiBldmVudAorICovCisgCit2b2lkIGFhY19zYV9ub3RpZnlfYWRhcHRlcihzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgZXZlbnQpCit7CisJc3dpdGNoIChldmVudCkgeworCisJY2FzZSBBZGFwTm9ybUNtZFF1ZToKKwkJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxSZWdfcyxET09SQkVMTF8xKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybVJlc3BOb3RGdWxsOgorCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLERPT1JCRUxMXzQpOworCQlicmVhazsKKwljYXNlIEFkYXBOb3JtUmVzcFF1ZToKKwkJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxSZWdfcyxET09SQkVMTF8yKTsKKwkJYnJlYWs7CisJY2FzZSBIb3N0Tm9ybUNtZE5vdEZ1bGw6CisJCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsUmVnX3MsRE9PUkJFTExfMyk7CisJCWJyZWFrOworCWNhc2UgSG9zdFNodXRkb3duOgorCQkvL3NhX3N5bmNfY21kKGRldiwgSE9TVF9DUkFTSElORywgMCwgJnJldCk7CisJCWJyZWFrOworCWNhc2UgRmFzdElvOgorCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLERPT1JCRUxMXzYpOworCQlicmVhazsKKwljYXNlIEFkYXBQcmludGZEb25lOgorCQlzYV93cml0ZXcoZGV2LCBEb29yYmVsbFJlZ19zLERPT1JCRUxMXzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qKgorICoJc2Ffc3luY19jbWQJLQlzZW5kIGEgY29tbWFuZCBhbmQgd2FpdAorICoJQGRldjogQWRhcHRlcgorICoJQGNvbW1hbmQ6IENvbW1hbmQgdG8gZXhlY3V0ZQorICoJQHAxOiBmaXJzdCBwYXJhbWV0ZXIKKyAqCUByZXQ6IGFkYXB0ZXIgc3RhdHVzCisgKgorICoJVGhpcyByb3V0aW5lIHdpbGwgc2VuZCBhIHN5bmNocm9ub3VzIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIgYW5kIHdhaXQgCisgKglmb3IgaXRzCWNvbXBsZXRpb24uCisgKi8KKworc3RhdGljIGludCBzYV9zeW5jX2NtZChzdHJ1Y3QgYWFjX2RldiAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHAxLCB1MzIgKnJldCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworIAlpbnQgb2s7CisJLyoKKwkgKglXcml0ZSB0aGUgQ29tbWFuZCBpbnRvIE1haWxib3ggMAorCSAqLworCXNhX3dyaXRlbChkZXYsIE1haWxib3gwLCBjb21tYW5kKTsKKwkvKgorCSAqCVdyaXRlIHRoZSBwYXJhbWV0ZXJzIGludG8gTWFpbGJveGVzIDEgLSA0CisJICovCisJc2Ffd3JpdGVsKGRldiwgTWFpbGJveDEsIHAxKTsKKwlzYV93cml0ZWwoZGV2LCBNYWlsYm94MiwgMCk7CisJc2Ffd3JpdGVsKGRldiwgTWFpbGJveDMsIDApOworCXNhX3dyaXRlbChkZXYsIE1haWxib3g0LCAwKTsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsIHRvIHN0YXJ0IG9uIGEgY2xlYW4gc2xhdGUuCisJICovCisJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxDbHJSZWdfcCwgRE9PUkJFTExfMCk7CisJLyoKKwkgKglTaWduYWwgdGhhdCB0aGVyZSBpcyBhIG5ldyBzeW5jaCBjb21tYW5kCisJICovCisJc2Ffd3JpdGV3KGRldiwgRG9vcmJlbGxSZWdfcywgRE9PUkJFTExfMCk7CisKKwlvayA9IDA7CisJc3RhcnQgPSBqaWZmaWVzOworCisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgc3RhcnQrMzAqSFopKQorCXsKKwkJLyoKKwkJICoJRGVsYXkgNXVTIHNvIHRoYXQgdGhlIG1vbml0b3IgZ2V0cyBhY2Nlc3MKKwkJICovCisJCXVkZWxheSg1KTsKKwkJLyoKKwkJICoJTW9uMTEwIHdpbGwgc2V0IGRvb3JiZWxsMCBiaXQgd2hlbiBpdCBoYXMgCisJCSAqCWNvbXBsZXRlZCB0aGUgY29tbWFuZC4KKwkJICovCisJCWlmKHNhX3JlYWR3KGRldiwgRG9vcmJlbGxSZWdfcCkgJiBET09SQkVMTF8wKSAgeworCQkJb2sgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChvayAhPSAxKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkvKgorCSAqCUNsZWFyIHRoZSBzeW5jaCBjb21tYW5kIGRvb3JiZWxsLgorCSAqLworCXNhX3dyaXRldyhkZXYsIERvb3JiZWxsQ2xyUmVnX3AsIERPT1JCRUxMXzApOworCS8qCisJICoJUHVsbCB0aGUgc3luY2ggc3RhdHVzIGZyb20gTWFpbGJveCAwLgorCSAqLworCWlmIChyZXQpCisJCSpyZXQgPSBzYV9yZWFkbChkZXYsIE1haWxib3gwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXIJLQlpbnRlcnJ1cHQgYW4gYWRhcHRlcgorICoJQGRldjogV2hpY2ggYWRhcHRlciB0byBlbmFibGUuCisgKgorICoJQnJlYWtwb2ludCBhbiBhZGFwdGVyLgorICovCisgCitzdGF0aWMgdm9pZCBhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXIgKHN0cnVjdCBhYWNfZGV2ICpkZXYpCit7CisJdTMyIHJldDsKKwlzYV9zeW5jX2NtZChkZXYsIEJSRUFLUE9JTlRfUkVRVUVTVCwgMCwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3NhX3N0YXJ0X2FkYXB0ZXIJCS0JYWN0aXZhdGUgYWRhcHRlcgorICoJQGRldjoJQWRhcHRlcgorICoKKyAqCVN0YXJ0IHVwIHByb2Nlc3Npbmcgb24gYW4gQVJNIGJhc2VkIEFBQyBhZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgYWFjX3NhX3N0YXJ0X2FkYXB0ZXIoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1MzIgcmV0OworCXN0cnVjdCBhYWNfaW5pdCAqaW5pdDsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBwaWVjZXMgb2YgdGhlIGluaXQuCisJICovCisJaW5pdCA9IGRldi0+aW5pdDsKKwlpbml0LT5Ib3N0RWxhcHNlZFNlY29uZHMgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKKworCS8qCisJICogVGVsbCB0aGUgYWRhcHRlciB3ZSBhcmUgYmFjayBhbmQgdXAgYW5kIHJ1bm5pbmcgc28gaXQgd2lsbCBzY2FuIGl0cyBjb21tYW5kCisJICogcXVldWVzIGFuZCBlbmFibGUgb3VyIGludGVycnVwdHMKKwkgKi8KKwlkZXYtPmlycV9tYXNrID0JKFByaW50ZlJlYWR5IHwgRE9PUkJFTExfMSB8IERPT1JCRUxMXzIgfCBET09SQkVMTF8zIHwgRE9PUkJFTExfNCk7CisJLyoKKwkgKglGaXJzdCBjbGVhciBvdXQgYWxsIGludGVycnVwdHMuICBUaGVuIGVuYWJsZSB0aGUgb25lJ3MgdGhhdCAKKwkgKgl3ZSBjYW4gaGFuZGxlLgorCSAqLworCXNhX3dyaXRldyhkZXYsIFNhRGJDU1IuUFJJU0VUSVJRTUFTSywgY3B1X3RvX2xlMTYoMHhmZmZmKSk7CisJc2Ffd3JpdGV3KGRldiwgU2FEYkNTUi5QUklDTEVBUklSUU1BU0ssIChQcmludGZSZWFkeSB8IERPT1JCRUxMXzEgfCBET09SQkVMTF8yIHwgRE9PUkJFTExfMyB8IERPT1JCRUxMXzQpKTsKKwkvKiBXZSBjYW4gb25seSB1c2UgYSAzMiBiaXQgYWRkcmVzcyBoZXJlICovCisJc2Ffc3luY19jbWQoZGV2LCBJTklUX1NUUlVDVF9CQVNFX0FERFJFU1MsICh1MzIpKHVsb25nKWRldi0+aW5pdF9wYSwgJnJldCk7Cit9CisKKy8qKgorICoJYWFjX3NhX2NoZWNrX2hlYWx0aAorICoJQGRldjogZGV2aWNlIHRvIGNoZWNrIGlmIGhlYWx0aHkKKyAqCisgKglXaWxsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcyBhbGl2ZSBhbmQKKyAqCWNhcGFibGUgb2YgaGFuZGxpbmcgcmVxdWVzdHMsIHJldHVybmluZyAwIGlmIGFsaXZlLgorICovCitzdGF0aWMgaW50IGFhY19zYV9jaGVja19oZWFsdGgoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwlsb25nIHN0YXR1cyA9IHNhX3JlYWRsKGRldiwgTWFpbGJveDcpOworCisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIGZhaWxlZCBhbnkgc2VsZiB0ZXN0cy4KKwkgKi8KKwlpZiAoc3RhdHVzICYgU0VMRl9URVNUX0ZBSUxFRCkKKwkJcmV0dXJuIC0xOworCS8qCisJICoJQ2hlY2sgdG8gc2VlIGlmIHRoZSBib2FyZCBwYW5pYydkIHdoaWxlIGJvb3RpbmcuCisJICovCisJaWYgKHN0YXR1cyAmIEtFUk5FTF9QQU5JQykKKwkJcmV0dXJuIC0yOworCS8qCisJICoJV2FpdCBmb3IgdGhlIGFkYXB0ZXIgdG8gYmUgdXAgYW5kIHJ1bm5pbmcuIFdhaXQgdXAgdG8gMyBtaW51dGVzCisJICovCisJaWYgKCEoc3RhdHVzICYgS0VSTkVMX1VQX0FORF9SVU5OSU5HKSkKKwkJcmV0dXJuIC0zOworCS8qCisJICoJRXZlcnl0aGluZyBpcyBPSworCSAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCWFhY19zYV9pbml0CS0JaW5pdGlhbGl6ZSBhbiBBUk0gYmFzZWQgQUFDIGNhcmQKKyAqCUBkZXY6IGRldmljZSB0byBjb25maWd1cmUKKyAqCisgKglBbGxvY2F0ZSBhbmQgc2V0IHVwIHJlc291cmNlcyBmb3IgdGhlIEFSTSBiYXNlZCBBQUMgdmFyaWFudHMuIFRoZSAKKyAqCWRldmljZV9pbnRlcmZhY2UgaW4gdGhlIGNvbW1yZWdpb24gd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGxpbmtlZCAKKyAqCXRvIHRoZSBjb21tIHJlZ2lvbi4KKyAqLworCitpbnQgYWFjX3NhX2luaXQoc3RydWN0IGFhY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWludCBpbnN0YW5jZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJaW5zdGFuY2UgPSBkZXYtPmlkOworCW5hbWUgICAgID0gZGV2LT5uYW1lOworCisJLyoKKwkgKglNYXAgaW4gdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBhZGFwdGVyLgorCSAqLworCisJaWYoKGRldi0+cmVncy5zYSA9IGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpZGV2LT5zY3NpX2hvc3RfcHRyLT5iYXNlLCA4MTkyKSk9PU5VTEwpCisJewkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWFjcmFpZDogdW5hYmxlIHRvIG1hcCBBUk0uXG4iICk7CisJCWdvdG8gZXJyb3JfaW91bm1hcDsKKwl9CisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgdGhlIGJvYXJkIGZhaWxlZCBhbnkgc2VsZiB0ZXN0cy4KKwkgKi8KKwlpZiAoc2FfcmVhZGwoZGV2LCBNYWlsYm94NykgJiBTRUxGX1RFU1RfRkFJTEVEKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzJWQ6IGFkYXB0ZXIgc2VsZi10ZXN0IGZhaWxlZC5cbiIsIG5hbWUsIGluc3RhbmNlKTsKKwkJZ290byBlcnJvcl9pb3VubWFwOworCX0KKwkvKgorCSAqCUNoZWNrIHRvIHNlZSBpZiB0aGUgYm9hcmQgcGFuaWMnZCB3aGlsZSBib290aW5nLgorCSAqLworCWlmIChzYV9yZWFkbChkZXYsIE1haWxib3g3KSAmIEtFUk5FTF9QQU5JQykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyVkOiBhZGFwdGVyIGtlcm5lbCBwYW5pYydkLlxuIiwgbmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCXN0YXJ0ID0gamlmZmllczsKKwkvKgorCSAqCVdhaXQgZm9yIHRoZSBhZGFwdGVyIHRvIGJlIHVwIGFuZCBydW5uaW5nLiBXYWl0IHVwIHRvIDMgbWludXRlcy4KKwkgKi8KKwl3aGlsZSAoIShzYV9yZWFkbChkZXYsIE1haWxib3g3KSAmIEtFUk5FTF9VUF9BTkRfUlVOTklORykpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQrMTgwKkhaKSkgeworCQkJc3RhdHVzID0gc2FfcmVhZGwoZGV2LCBNYWlsYm94Nyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyVkOiBhZGFwdGVyIGtlcm5lbCBmYWlsZWQgdG8gc3RhcnQsIGluaXQgc3RhdHVzID0gJWx4LlxuIiwgCisJCQkJCW5hbWUsIGluc3RhbmNlLCBzdGF0dXMpOworCQkJZ290byBlcnJvcl9pb3VubWFwOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5zY3NpX2hvc3RfcHRyLT5pcnEsIGFhY19zYV9pbnRyLCBTQV9TSElSUXxTQV9JTlRFUlJVUFQsICJhYWNyYWlkIiwgKHZvaWQgKilkZXYgKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMlZDogSW50ZXJydXB0IHVuYXZhaWxhYmxlLlxuIiwgbmFtZSwgaW5zdGFuY2UpOworCQlnb3RvIGVycm9yX2lvdW5tYXA7CisJfQorCisJLyoKKwkgKglGaWxsIGluIHRoZSBmdW5jdGlvbiBkaXNwYXRjaCB0YWJsZS4KKwkgKi8KKworCWRldi0+YV9vcHMuYWRhcHRlcl9pbnRlcnJ1cHQgPSBhYWNfc2FfaW50ZXJydXB0X2FkYXB0ZXI7CisJZGV2LT5hX29wcy5hZGFwdGVyX25vdGlmeSA9IGFhY19zYV9ub3RpZnlfYWRhcHRlcjsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfc3luY19jbWQgPSBzYV9zeW5jX2NtZDsKKwlkZXYtPmFfb3BzLmFkYXB0ZXJfY2hlY2tfaGVhbHRoID0gYWFjX3NhX2NoZWNrX2hlYWx0aDsKKworCisJaWYoYWFjX2luaXRfYWRhcHRlcihkZXYpID09IE5VTEwpCisJCWdvdG8gZXJyb3JfaXJxOworCisJLyoKKwkgKglTdGFydCBhbnkga2VybmVsIHRocmVhZHMgbmVlZGVkCisJICovCisJZGV2LT50aHJlYWRfcGlkID0ga2VybmVsX3RocmVhZCgoaW50ICgqKSh2b2lkICopKWFhY19jb21tYW5kX3RocmVhZCwgZGV2LCAwKTsKKwlpZiAoZGV2LT50aHJlYWRfcGlkIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFhY3JhaWQ6IFVuYWJsZSB0byBjcmVhdGUgY29tbWFuZCB0aHJlYWQuXG4iKTsKKwkJZ290byBlcnJvcl9rZnJlZTsKKwl9CisKKwkvKgorCSAqCVRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBhbGwgaXMgY29uZmlndXJlLCBhbmQgaXQgY2FuIHN0YXJ0IAorCSAqCWFjY2VwdGluZyByZXF1ZXN0cworCSAqLworCWFhY19zYV9zdGFydF9hZGFwdGVyKGRldik7CisJcmV0dXJuIDA7CisKKworZXJyb3Jfa2ZyZWU6CisJa2ZyZWUoZGV2LT5xdWV1ZXMpOworCitlcnJvcl9pcnE6CisJZnJlZV9pcnEoZGV2LT5zY3NpX2hvc3RfcHRyLT5pcnEsICh2b2lkICopZGV2KTsKKworZXJyb3JfaW91bm1hcDoKKwlpb3VubWFwKGRldi0+cmVncy5zYSk7CisKKwlyZXR1cm4gLTE7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MmM1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jCkBAIC0wLDAgKzEsMTgyMzcgQEAKKyNkZWZpbmUgQVNDX1ZFUlNJT04gIjMuM0siICAgIC8qIEFkdmFuU3lzIERyaXZlciBWZXJzaW9uICovCisKKy8qCisgKiBhZHZhbnN5cy5jIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIEFkdmFuU3lzIFNDU0kgQWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMCBBZHZhbmNlZCBTeXN0ZW0gUHJvZHVjdHMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENvbm5lY3RDb20gU29sdXRpb25zLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiBtb2RpZmljYXRpb24uCisgKgorICogQXMgb2YgTWFyY2ggOCwgMjAwMCBBZHZhbmNlZCBTeXN0ZW0gUHJvZHVjdHMsIEluYy4gKEFkdmFuU3lzKQorICogY2hhbmdlZCBpdHMgbmFtZSB0byBDb25uZWN0Q29tIFNvbHV0aW9ucywgSW5jLgorICoKKyAqLworCisvKgorCisgIERvY3VtZW50YXRpb24gZm9yIHRoZSBBZHZhblN5cyBEcml2ZXIKKworICBBLiBMaW51eCBLZXJuZWxzIFN1cHBvcnRlZCBieSB0aGlzIERyaXZlcgorICBCLiBBZGFwdGVycyBTdXBwb3J0ZWQgYnkgdGhpcyBEcml2ZXIKKyAgQy4gTGludXggc291cmNlIGZpbGVzIG1vZGlmaWVkIGJ5IEFkdmFuU3lzIERyaXZlcgorICBELiBTb3VyY2UgQ29tbWVudHMKKyAgRS4gRHJpdmVyIENvbXBpbGUgVGltZSBPcHRpb25zIGFuZCBEZWJ1Z2dpbmcKKyAgRi4gRHJpdmVyIExJTE8gT3B0aW9uCisgIEcuIFRlc3RzIHRvIHJ1biBiZWZvcmUgcmVsZWFzaW5nIG5ldyBkcml2ZXIKKyAgSC4gUmVsZWFzZSBIaXN0b3J5CisgIEkuIEtub3duIFByb2JsZW1zL0ZpeCBMaXN0CisgIEouIENyZWRpdHMgKENocm9ub2xvZ2ljYWwgT3JkZXIpCisKKyAgQS4gTGludXggS2VybmVscyBTdXBwb3J0ZWQgYnkgdGhpcyBEcml2ZXIKKworICAgICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBMaW51eCBrZXJuZWxzOiB2Mi4yLjE4CisgICAgIHYyLjQuMC4gVGhlIGRyaXZlciBpcyBzdXBwb3J0ZWQgb24gdjIuMiBhbmQgdjIuNCBrZXJuZWxzIGFuZCBvbiB4ODYsCisgICAgIGFscGhhLCBhbmQgUG93ZXJQQyBwbGF0Zm9ybXMuCisKKyAgQi4gQWRhcHRlcnMgU3VwcG9ydGVkIGJ5IHRoaXMgRHJpdmVyCisKKyAgICAgQWR2YW5TeXMgKEFkdmFuY2VkIFN5c3RlbSBQcm9kdWN0cywgSW5jLikgbWFudWZhY3R1cmVzIHRoZSBmb2xsb3dpbmcKKyAgICAgUklTQy1iYXNlZCwgQnVzLU1hc3RlcmluZywgRmFzdCAoMTAgTWh6KSBhbmQgVWx0cmEgKDIwIE1oeikgTmFycm93CisgICAgICg4LWJpdCB0cmFuc2ZlcikgU0NTSSBIb3N0IEFkYXB0ZXJzIGZvciB0aGUgSVNBLCBFSVNBLCBWTCwgYW5kIFBDSQorICAgICBidXNlcyBhbmQgUklTQy1iYXNlZCwgQnVzLU1hc3RlcmluZywgVWx0cmEgKDIwIE1oeikgV2lkZSAoMTYtYml0CisgICAgIHRyYW5zZmVyKSBTQ1NJIEhvc3QgQWRhcHRlcnMgZm9yIHRoZSBQQ0kgYnVzLgorCisgICAgIFRoZSBDREIgY291bnRzIGJlbG93IGluZGljYXRlIHRoZSBudW1iZXIgb2YgU0NTSSBDREIgKENvbW1hbmQKKyAgICAgRGVzY3JpcHRvciBCbG9jaykgcmVxdWVzdHMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBSSVNDIGNoaXAKKyAgICAgY2FjaGUgYW5kIGJvYXJkIExSQU0uIEEgQ0RCIGlzIGEgc2luZ2xlIFNDU0kgY29tbWFuZC4gVGhlIGRyaXZlcgorICAgICBkZXRlY3Qgcm91dGluZSB3aWxsIGRpc3BsYXkgdGhlIG51bWJlciBvZiBDREJzIGF2YWlsYWJsZSBmb3IgZWFjaAorICAgICBhZGFwdGVyIGRldGVjdGVkLiBUaGUgbnVtYmVyIG9mIENEQnMgdXNlZCBieSB0aGUgZHJpdmVyIGNhbiBiZQorICAgICBsb3dlcmVkIGluIHRoZSBCSU9TIGJ5IGNoYW5naW5nIHRoZSAnSG9zdCBRdWV1ZSBTaXplJyBhZGFwdGVyIHNldHRpbmcuCisKKyAgICAgTGFwdG9wIFByb2R1Y3RzOgorICAgICAgICBBQlAtNDgwIC0gQnVzLU1hc3RlciBDYXJkQnVzICgxNiBDREIpICgyLjQga2VybmVsIGFuZCBncmVhdGVyKQorCisgICAgIENvbm5lY3Rpdml0eSBQcm9kdWN0czoKKyAgICAgICAgQUJQNTEwLzUxNTAgLSBCdXMtTWFzdGVyIElTQSAoMjQwIENEQikKKyAgICAgICAgQUJQNTE0MCAtIEJ1cy1NYXN0ZXIgSVNBIFBuUCAoMTYgQ0RCKQorICAgICAgICBBQlA1MTQyIC0gQnVzLU1hc3RlciBJU0EgUG5QIHdpdGggZmxvcHB5ICgxNiBDREIpCisgICAgICAgIEFCUDkwMi8zOTAyIC0gQnVzLU1hc3RlciBQQ0kgKDE2IENEQikKKyAgICAgICAgQUJQMzkwNSAtIEJ1cy1NYXN0ZXIgUENJICgxNiBDREIpCisgICAgICAgIEFCUDkxNSAtIEJ1cy1NYXN0ZXIgUENJICgxNiBDREIpCisgICAgICAgIEFCUDkyMCAtIEJ1cy1NYXN0ZXIgUENJICgxNiBDREIpCisgICAgICAgIEFCUDM5MjIgLSBCdXMtTWFzdGVyIFBDSSAoMTYgQ0RCKQorICAgICAgICBBQlAzOTI1IC0gQnVzLU1hc3RlciBQQ0kgKDE2IENEQikKKyAgICAgICAgQUJQOTMwIC0gQnVzLU1hc3RlciBQQ0kgKDE2IENEQikKKyAgICAgICAgQUJQOTMwVSAtIEJ1cy1NYXN0ZXIgUENJIFVsdHJhICgxNiBDREIpCisgICAgICAgIEFCUDkzMFVBIC0gQnVzLU1hc3RlciBQQ0kgVWx0cmEgKDE2IENEQikKKyAgICAgICAgQUJQOTYwIC0gQnVzLU1hc3RlciBQQ0kgTUFDL1BDICgxNiBDREIpCisgICAgICAgIEFCUDk2MFUgLSBCdXMtTWFzdGVyIFBDSSBNQUMvUEMgVWx0cmEgKDE2IENEQikKKworICAgICBTaW5nbGUgQ2hhbm5lbCBQcm9kdWN0czoKKyAgICAgICAgQUJQNTQyIC0gQnVzLU1hc3RlciBJU0Egd2l0aCBmbG9wcHkgKDI0MCBDREIpCisgICAgICAgIEFCUDc0MiAtIEJ1cy1NYXN0ZXIgRUlTQSAoMjQwIENEQikKKyAgICAgICAgQUJQODQyIC0gQnVzLU1hc3RlciBWTCAoMjQwIENEQikKKyAgICAgICAgQUJQOTQwIC0gQnVzLU1hc3RlciBQQ0kgKDI0MCBDREIpCisgICAgICAgIEFCUDk0MFUgLSBCdXMtTWFzdGVyIFBDSSBVbHRyYSAoMjQwIENEQikKKyAgICAgICAgQUJQOTQwVUEvMzk0MFVBIC0gQnVzLU1hc3RlciBQQ0kgVWx0cmEgKDI0MCBDREIpCisgICAgICAgIEFCUDk3MCAtIEJ1cy1NYXN0ZXIgUENJIE1BQy9QQyAoMjQwIENEQikKKyAgICAgICAgQUJQOTcwVSAtIEJ1cy1NYXN0ZXIgUENJIE1BQy9QQyBVbHRyYSAoMjQwIENEQikKKyAgICAgICAgQUJQMzk2MFVBIC0gQnVzLU1hc3RlciBQQ0kgTUFDL1BDIFVsdHJhICgyNDAgQ0RCKQorICAgICAgICBBQlA5NDBVVy8zOTQwVVcgLSBCdXMtTWFzdGVyIFBDSSBVbHRyYS1XaWRlICgyNTMgQ0RCKQorICAgICAgICBBQlA5NzBVVyAtIEJ1cy1NYXN0ZXIgUENJIE1BQy9QQyBVbHRyYS1XaWRlICgyNTMgQ0RCKQorICAgICAgICBBQlAzOTQwVTJXIC0gQnVzLU1hc3RlciBQQ0kgTFZEL1VsdHJhMi1XaWRlICgyNTMgQ0RCKQorCisgICAgIE11bHRpLUNoYW5uZWwgUHJvZHVjdHM6CisgICAgICAgIEFCUDc1MiAtIER1YWwgQ2hhbm5lbCBCdXMtTWFzdGVyIEVJU0EgKDI0MCBDREIgUGVyIENoYW5uZWwpCisgICAgICAgIEFCUDg1MiAtIER1YWwgQ2hhbm5lbCBCdXMtTWFzdGVyIFZMICgyNDAgQ0RCIFBlciBDaGFubmVsKQorICAgICAgICBBQlA5NTAgLSBEdWFsIENoYW5uZWwgQnVzLU1hc3RlciBQQ0kgKDI0MCBDREIgUGVyIENoYW5uZWwpCisgICAgICAgIEFCUDk1MFVXIC0gRHVhbCBDaGFubmVsIEJ1cy1NYXN0ZXIgUENJIFVsdHJhLVdpZGUgKDI1MyBDREIgUGVyIENoYW5uZWwpCisgICAgICAgIEFCUDk4MCAtIEZvdXIgQ2hhbm5lbCBCdXMtTWFzdGVyIFBDSSAoMjQwIENEQiBQZXIgQ2hhbm5lbCkKKyAgICAgICAgQUJQOTgwVSAtIEZvdXIgQ2hhbm5lbCBCdXMtTWFzdGVyIFBDSSBVbHRyYSAoMjQwIENEQiBQZXIgQ2hhbm5lbCkKKyAgICAgICAgQUJQOTgwVUEvMzk4MFVBIC0gRm91ciBDaGFubmVsIEJ1cy1NYXN0ZXIgUENJIFVsdHJhICgxNiBDREIgUGVyIENoYW4uKQorICAgICAgICBBQlAzOTUwVTJXIC0gQnVzLU1hc3RlciBQQ0kgTFZEL1VsdHJhMi1XaWRlIGFuZCBVbHRyYS1XaWRlICgyNTMgQ0RCKQorICAgICAgICBBQlAzOTUwVTNXIC0gQnVzLU1hc3RlciBQQ0kgRHVhbCBMVkQyL1VsdHJhMy1XaWRlICgyNTMgQ0RCKQorCisgIEMuIExpbnV4IHNvdXJjZSBmaWxlcyBtb2RpZmllZCBieSBBZHZhblN5cyBEcml2ZXIKKworICAgICBUaGlzIHNlY3Rpb24gZm9yIGhpc3RvcmljYWwgcHVycG9zZXMgZG9jdW1lbnRzIHRoZSBjaGFuZ2VzCisgICAgIG9yaWdpbmFsbHkgbWFkZSB0byB0aGUgTGludXgga2VybmVsIHNvdXJjZSB0byBhZGQgdGhlIGFkdmFuc3lzCisgICAgIGRyaXZlci4gQXMgTGludXggaGFzIGNoYW5nZWQgc29tZSBvZiB0aGVzZSBmaWxlcyBoYXZlIGFsc28KKyAgICAgYmVlbiBtb2RpZmllZC4KKworICAgICAxLiBsaW51eC9hcmNoL2kzODYvY29uZmlnLmluOgorCisgICAgICAgICAgYm9vbCAnQWR2YW5TeXMgU0NTSSBzdXBwb3J0JyBDT05GSUdfU0NTSV9BRFZBTlNZUyB5CisKKyAgICAgMi4gbGludXgvZHJpdmVycy9zY3NpL2hvc3RzLmM6CisKKyAgICAgICAgICAjaWZkZWYgQ09ORklHX1NDU0lfQURWQU5TWVMKKyAgICAgICAgICAjaW5jbHVkZSAiYWR2YW5zeXMuaCIKKyAgICAgICAgICAjZW5kaWYKKworICAgICAgICBhbmQgYWZ0ZXIgInN0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYnVpbHRpbl9zY3NpX2hvc3RzW10gPSI6CisKKyAgICAgICAgICAjaWZkZWYgQ09ORklHX1NDU0lfQURWQU5TWVMKKyAgICAgICAgICBBRFZBTlNZUywKKyAgICAgICAgICAjZW5kaWYKKworICAgICAzLiBsaW51eC9kcml2ZXJzL3Njc2kvTWFrZWZpbGU6CisKKyAgICAgICAgICBpZmRlZiBDT05GSUdfU0NTSV9BRFZBTlNZUworICAgICAgICAgIFNDU0lfU1JDUyA6PSAkKFNDU0lfU1JDUykgYWR2YW5zeXMuYworICAgICAgICAgIFNDU0lfT0JKUyA6PSAkKFNDU0lfT0JKUykgYWR2YW5zeXMubworICAgICAgICAgIGVsc2UKKyAgICAgICAgICBTQ1NJX01PRFVMRV9PQkpTIDo9ICQoU0NTSV9NT0RVTEVfT0JKUykgYWR2YW5zeXMubworICAgICAgICAgIGVuZGlmCisKKyAgICAgNC4gbGludXgvaW5pdC9tYWluLmM6CisKKyAgICAgICAgICBleHRlcm4gdm9pZCBhZHZhbnN5c19zZXR1cChjaGFyICpzdHIsIGludCAqaW50cyk7CisKKyAgICAgICAgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIHRoZSBib290c2V0dXBzW10gYXJyYXkuCisKKyAgICAgICAgICAjaWZkZWYgQ09ORklHX1NDU0lfQURWQU5TWVMKKyAgICAgICAgICAgICB7ICJhZHZhbnN5cz0iLCBhZHZhbnN5c19zZXR1cCB9LAorICAgICAgICAgICNlbmRpZgorCisgIEQuIFNvdXJjZSBDb21tZW50cworCisgICAgIDEuIFVzZSB0YWIgc3RvcHMgc2V0IHRvIDQgZm9yIHRoZSBzb3VyY2UgZmlsZXMuIEZvciB2aSB1c2UgJ3NlIHRhYnN0b3BzPTQnLgorCisgICAgIDIuIFRoaXMgZHJpdmVyIHNob3VsZCBiZSBtYWludGFpbmVkIGluIG11bHRpcGxlIGZpbGVzLiBCdXQgdG8gbWFrZQorICAgICAgICBpdCBlYXNpZXIgdG8gaW5jbHVkZSB3aXRoIExpbnV4IGFuZCB0byBmb2xsb3cgTGludXggY29udmVudGlvbnMsCisgICAgICAgIHRoZSB3aG9sZSBkcml2ZXIgaXMgbWFpbnRhaW5lZCBpbiB0aGUgc291cmNlIGZpbGVzIGFkdmFuc3lzLmggYW5kCisgICAgICAgIGFkdmFuc3lzLmMuIEluIHRoaXMgZmlsZSBsb2dpY2FsIHNlY3Rpb25zIG9mIHRoZSBkcml2ZXIgYmVnaW4gd2l0aAorICAgICAgICBhIGNvbW1lbnQgdGhhdCBjb250YWlucyAnLS0tJy4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxvZ2ljYWwgc2VjdGlvbnMKKyAgICAgICAgb2YgdGhlIGRyaXZlciBiZWxvdy4KKworICAgICAgICAgICAtLS0gTGludXggVmVyc2lvbgorICAgICAgICAgICAtLS0gTGludXggSW5jbHVkZSBGaWxlCisgICAgICAgICAgIC0tLSBEcml2ZXIgT3B0aW9ucworICAgICAgICAgICAtLS0gRGVidWdnaW5nIEhlYWRlcgorICAgICAgICAgICAtLS0gQXNjIExpYnJhcnkgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAgICAgICAgICAgLS0tIEFkdiBMaWJyYXJ5IENvbnN0YW50cyBhbmQgTWFjcm9zCisgICAgICAgICAgIC0tLSBEcml2ZXIgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAgICAgICAgICAgLS0tIERyaXZlciBTdHJ1Y3R1cmVzCisgICAgICAgICAgIC0tLSBEcml2ZXIgRGF0YQorICAgICAgICAgICAtLS0gRHJpdmVyIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAgICAgICAgICAgLS0tIExpbnV4ICdTY3NpX0hvc3RfVGVtcGxhdGUnIGFuZCBhZHZhbnN5c19zZXR1cCgpIEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gTG9hZGFibGUgRHJpdmVyIFN1cHBvcnQKKyAgICAgICAgICAgLS0tIE1pc2NlbGxhbmVvdXMgRHJpdmVyIEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gRnVuY3Rpb25zIFJlcXVpcmVkIGJ5IHRoZSBBc2MgTGlicmFyeQorICAgICAgICAgICAtLS0gRnVuY3Rpb25zIFJlcXVpcmVkIGJ5IHRoZSBBZHYgTGlicmFyeQorICAgICAgICAgICAtLS0gVHJhY2luZyBhbmQgRGVidWdnaW5nIEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gQXNjIExpYnJhcnkgRnVuY3Rpb25zCisgICAgICAgICAgIC0tLSBBZHYgTGlicmFyeSBGdW5jdGlvbnMKKworICAgICAzLiBUaGUgc3RyaW5nICdYWFgnIGlzIHVzZWQgdG8gZmxhZyBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgcmUtd3JpdHRlbgorICAgICAgICBvciB0aGF0IGNvbnRhaW5zIGEgcHJvYmxlbSB0aGF0IG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKworICAgICA0LiBJIGhhdmUgc3RyaXBwZWQgY29tbWVudHMgZnJvbSBhbmQgcmVmb3JtYXR0ZWQgdGhlIHNvdXJjZSBmb3IgdGhlCisgICAgICAgIEFzYyBMaWJyYXJ5IGFuZCBBZHYgTGlicmFyeSB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhpcyBmaWxlLiBUaGlzCisgICAgICAgIHNvdXJjZSBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIGZvbGxvd2luZyBoZWFkaW5ncy4gVGhlIEFzYyBMaWJyYXJ5CisgICAgICAgIGlzIHVzZWQgdG8gc3VwcG9ydCBOYXJyb3cgQm9hcmRzLiBUaGUgQWR2IExpYnJhcnkgaXMgdXNlZCB0bworICAgICAgICBzdXBwb3J0IFdpZGUgQm9hcmRzLgorCisgICAgICAgICAgIC0tLSBBc2MgTGlicmFyeSBDb25zdGFudHMgYW5kIE1hY3JvcworICAgICAgICAgICAtLS0gQWR2IExpYnJhcnkgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAgICAgICAgICAgLS0tIEFzYyBMaWJyYXJ5IEZ1bmN0aW9ucworICAgICAgICAgICAtLS0gQWR2IExpYnJhcnkgRnVuY3Rpb25zCisKKyAgRS4gRHJpdmVyIENvbXBpbGUgVGltZSBPcHRpb25zIGFuZCBEZWJ1Z2dpbmcKKworICAgICBJbiB0aGlzIHNvdXJjZSBmaWxlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGNhbiBiZSBkZWZpbmVkLiBUaGV5IGFyZQorICAgICBkZWZpbmVkIGluIHRoZSBzb3VyY2UgYmVsb3cuIEJvdGggb2YgdGhlc2Ugb3B0aW9ucyBhcmUgZW5hYmxlZCBieQorICAgICBkZWZhdWx0LgorCisgICAgIDEuIEFEVkFOU1lTX0FTU0VSVCAtIEVuYWJsZSBkcml2ZXIgYXNzZXJ0aW9ucyAoRGVmOiBFbmFibGVkKQorCisgICAgICAgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFkZHMgYXNzZXJ0aW9uIGxvZ2ljIHN0YXRlbWVudHMgdG8gdGhlCisgICAgICAgIGRyaXZlci4gSWYgYW4gYXNzZXJ0aW9uIGZhaWxzIGEgbWVzc2FnZSB3aWxsIGJlIGRpc3BsYXllZCB0bworICAgICAgICB0aGUgY29uc29sZSwgYnV0IHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB0byBvcGVyYXRlLiBBbnkKKyAgICAgICAgYXNzZXJ0aW9ucyBlbmNvdW50ZXJlZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIHBlcnNvbgorICAgICAgICByZXNwb25zaWJsZSBmb3IgdGhlIGRyaXZlci4gQXNzZXJ0aW9uIHN0YXRlbWVudHMgbWF5IHByb2FjdGl2ZWx5CisgICAgICAgIGRldGVjdCBwcm9ibGVtcyB3aXRoIHRoZSBkcml2ZXIgYW5kIGZhY2lsaXRhdGUgZml4aW5nIHRoZXNlCisgICAgICAgIHByb2JsZW1zLiBFbmFibGluZyBhc3NlcnRpb25zIHdpbGwgYWRkIGEgc21hbGwgb3ZlcmhlYWQgdG8gdGhlCisgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgZHJpdmVyLgorCisgICAgIDIuIEFEVkFOU1lTX0RFQlVHIC0gRW5hYmxlIGRyaXZlciBkZWJ1Z2dpbmcgKERlZjogRGlzYWJsZWQpCisKKyAgICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWRkcyB0cmFjaW5nIGZ1bmN0aW9ucyB0byB0aGUgZHJpdmVyIGFuZAorICAgICAgICB0aGUgYWJpbGl0eSB0byBzZXQgYSBkcml2ZXIgdHJhY2luZyBsZXZlbCBhdCBib290IHRpbWUuIFRoaXMKKyAgICAgICAgb3B0aW9uIHdpbGwgYWxzbyBleHBvcnQgc3ltYm9scyBub3QgcmVxdWlyZWQgb3V0c2lkZSB0aGUgZHJpdmVyIHRvCisgICAgICAgIHRoZSBrZXJuZWwgbmFtZSBzcGFjZS4gVGhpcyBvcHRpb24gaXMgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZworICAgICAgICB0aGUgZHJpdmVyLCBidXQgaXQgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGRyaXZlciBleGVjdXRpb24KKyAgICAgICAgaW1hZ2UgYW5kIGFkZCBvdmVyaGVhZCB0byB0aGUgZXhlY3V0aW9uIG9mIHRoZSBkcml2ZXIuCisKKyAgICAgICAgVGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIGdsb2JhbAorICAgICAgICB2YXJpYWJsZSAnYXNjX2RiZ2x2bCcuIFRoZSBoaWdoZXIgdGhlIG51bWJlciB0aGUgbW9yZSBvdXRwdXQuIEJ5CisgICAgICAgIGRlZmF1bHQgdGhlIGRlYnVnIGxldmVsIGlzIDAuCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBsb2FkZWQgYXQgYm9vdCB0aW1lIGFuZCB0aGUgTElMTyBEcml2ZXIgT3B0aW9uCisgICAgICAgIGlzIGluY2x1ZGVkIGluIHRoZSBzeXN0ZW0sIHRoZSBkZWJ1ZyBsZXZlbCBjYW4gYmUgY2hhbmdlZCBieQorICAgICAgICBzcGVjaWZ5aW5nIGEgNXRoIChBU0NfTlVNX0lPUE9SVF9QUk9CRSArIDEpIEkvTyBQb3J0LiBUaGUKKyAgICAgICAgZmlyc3QgdGhyZWUgaGV4IGRpZ2l0cyBvZiB0aGUgcHNldWRvIEkvTyBQb3J0IG11c3QgYmUgc2V0IHRvCisgICAgICAgICdkZWInIGFuZCB0aGUgZm91cnRoIGhleCBkaWdpdCBzcGVjaWZpZXMgdGhlIGRlYnVnIGxldmVsOiAwIC0gRi4KKyAgICAgICAgVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGZvciBhbiBhZGFwdGVyIGF0IDB4MzMwCisgICAgICAgIGFuZCBzZXQgdGhlIGRlYnVnIGxldmVsIHRvIDIuCisKKyAgICAgICAgICAgbGludXggYWR2YW5zeXM9MHgzMzAsMCwwLDAsMHhkZWIyCisKKyAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBidWlsdCBhcyBhIGxvYWRhYmxlIG1vZHVsZSB0aGlzIHZhcmlhYmxlIGNhbiBiZQorICAgICAgICBkZWZpbmVkIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQuIFRoZSBmb2xsb3dpbmcgaW5zbW9kIGNvbW1hbmQKKyAgICAgICAgd2lsbCBzZXQgdGhlIGRlYnVnIGxldmVsIHRvIG9uZS4KKworICAgICAgICAgICBpbnNtb2QgYWR2YW5zeXMubyBhc2NfZGJnbHZsPTEKKworICAgICAgICBEZWJ1Z2dpbmcgTWVzc2FnZSBMZXZlbHM6CisgICAgICAgICAgIDA6IEVycm9ycyBPbmx5CisgICAgICAgICAgIDE6IEhpZ2gtTGV2ZWwgVHJhY2luZworICAgICAgICAgICAyLU46IFZlcmJvc2UgVHJhY2luZworCisgICAgICAgIFRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgdG8gY29uc29sZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0OgorCisgICAgICAgIGEuIFN5c3RlbSBhbmQga2VybmVsIGxvZ2dpbmcgaXMgZW5hYmxlZCAoc3lzbG9nZCwga2xvZ2QgcnVubmluZykuCisgICAgICAgIGIuIEtlcm5lbCBtZXNzYWdlcyBhcmUgcm91dGVkIHRvIGNvbnNvbGUgb3V0cHV0LiBDaGVjaworICAgICAgICAgICAvZXRjL3N5c2xvZy5jb25mIGZvciBhbiBlbnRyeSBzaW1pbGFyIHRvIHRoaXM6CisKKyAgICAgICAgICAgICAgICBrZXJuLiogICAgICAgICAgICAgICAgICAvZGV2L2NvbnNvbGUKKworICAgICAgICBjLiBrbG9nZCBpcyBzdGFydGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIC1jIHBhcmFtZXRlcgorICAgICAgICAgICAoZS5nLiBrbG9nZCAtYyA4KQorCisgICAgICAgIFRoaXMgd2lsbCBjYXVzZSBwcmludGsoKSBtZXNzYWdlcyB0byBiZSBiZSBkaXNwbGF5ZWQgb24gdGhlCisgICAgICAgIGN1cnJlbnQgY29uc29sZS4gUmVmZXIgdG8gdGhlIGtsb2dkKDgpIGFuZCBzeXNsb2dkKDgpIG1hbiBwYWdlcworICAgICAgICBmb3IgZGV0YWlscy4KKworICAgICAgICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gZW5hYmxlIHByaW50aygpIHRvIGNvbnNvbGUgd2l0aCB0aGlzCisgICAgICAgIHByb2dyYW0uIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRoZSAnb2ZmaWNpYWwnIHdheSB0byBkbyB0aGlzLgorICAgICAgICBEZWJ1ZyBvdXRwdXQgaXMgbG9nZ2VkIGluIC92YXIvbG9nL21lc3NhZ2VzLgorCisgICAgICAgICAgbWFpbigpCisgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3lzY2FsbCgxMDMsIDcsIDAsIDApOworICAgICAgICAgIH0KKworICAgICAgICBJbmNyZWFzaW5nIExPR19CVUZfTEVOIGluIGtlcm5lbC9wcmludGsuYyB0byBzb21ldGhpbmcgbGlrZQorICAgICAgICA0MDk2MCBhbGxvd3MgbW9yZSBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBidWZmZXJlZCBpbiB0aGUga2VybmVsCisgICAgICAgIGFuZCB3cml0dGVuIHRvIHRoZSBjb25zb2xlIG9yIGxvZyBmaWxlLgorCisgICAgIDMuIEFEVkFOU1lTX1NUQVRTIC0gRW5hYmxlIHN0YXRpc3RpY3MgKERlZjogRW5hYmxlZCA+PSB2MS4zLjApCisKKyAgICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWRkcyBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gYW5kIGRpc3BsYXkKKyAgICAgICAgdGhyb3VnaCAvcHJvYyB0byB0aGUgZHJpdmVyLiBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvcgorICAgICAgICBtb25pdG9yaW5nIGRyaXZlciBhbmQgZGV2aWNlIHBlcmZvcm1hbmNlLiBJdCB3aWxsIGFkZCB0byB0aGUKKyAgICAgICAgc2l6ZSBvZiB0aGUgZHJpdmVyIGV4ZWN1dGlvbiBpbWFnZSBhbmQgYWRkIG1pbm9yIG92ZXJoZWFkIHRvCisgICAgICAgIHRoZSBleGVjdXRpb24gb2YgdGhlIGRyaXZlci4KKworICAgICAgICBTdGF0aXN0aWNzIGFyZSBtYWludGFpbmVkIG9uIGEgcGVyIGFkYXB0ZXIgYmFzaXMuIERyaXZlciBlbnRyeQorICAgICAgICBwb2ludCBjYWxsIGNvdW50cyBhbmQgdHJhbnNmZXIgc2l6ZSBjb3VudHMgYXJlIG1haW50YWluZWQuCisgICAgICAgIFN0YXRpc3RpY3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBrZXJuZWxzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgICB0byB2MS4zLjAgd2l0aCB0aGUgQ09ORklHX1BST0NfRlMgKC9wcm9jKSBmaWxlIHN5c3RlbSBjb25maWd1cmVkLgorCisgICAgICAgIEFkdmFuU3lzIFNDU0kgYWRhcHRlciBmaWxlcyBoYXZlIHRoZSBmb2xsb3dpbmcgcGF0aCBuYW1lIGZvcm1hdDoKKworICAgICAgICAgICAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLShBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRC0xKV0KKworICAgICAgICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSBkaXNwbGF5ZWQgd2l0aCBjYXQuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgIGNhdCAvcHJvYy9zY3NpL2FkdmFuc3lzLzAKKworICAgICAgICBXaGVuIEFEVkFOU1lTX1NUQVRTIGlzIG5vdCBkZWZpbmVkIHRoZSBBZHZhblN5cyAvcHJvYyBmaWxlcyBvbmx5CisgICAgICAgIGNvbnRhaW4gYWRhcHRlciBhbmQgZGV2aWNlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyAgRi4gRHJpdmVyIExJTE8gT3B0aW9uCisKKyAgICAgSWYgaW5pdC9tYWluLmMgaXMgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGluIHRoZSAnRGlyZWN0aW9ucyBmb3IgQWRkaW5nCisgICAgIHRoZSBBZHZhblN5cyBEcml2ZXIgdG8gTGludXgnIHNlY3Rpb24gKEIuNC4pIGFib3ZlLCB0aGUgZHJpdmVyIHdpbGwKKyAgICAgcmVjb2duaXplIHRoZSAnYWR2YW5zeXMnIExJTE8gY29tbWFuZCBsaW5lIGFuZCAvZXRjL2xpbG8uY29uZiBvcHRpb24uCisgICAgIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGVpdGhlciBkaXNhYmxlIEkvTyBwb3J0IHNjYW5uaW5nIG9yIHRvIGxpbWl0CisgICAgIHNjYW5uaW5nIHRvIDEgLSA0IEkvTyBwb3J0cy4gUmVnYXJkbGVzcyBvZiB0aGUgb3B0aW9uIHNldHRpbmcgRUlTQSBhbmQKKyAgICAgUENJIGJvYXJkcyB3aWxsIHN0aWxsIGJlIHNlYXJjaGVkIGZvciBhbmQgZGV0ZWN0ZWQuIFRoaXMgb3B0aW9uIG9ubHkKKyAgICAgYWZmZWN0cyBzZWFyY2hpbmcgZm9yIElTQSBhbmQgVkwgYm9hcmRzLgorCisgICAgIEV4YW1wbGVzOgorICAgICAgIDEuIEVsaW1pbmF0ZSBJL08gcG9ydCBzY2FubmluZzoKKyAgICAgICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPQorICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgwCisgICAgICAgMi4gTGltaXQgSS9PIHBvcnQgc2Nhbm5pbmcgdG8gb25lIEkvTyBwb3J0OgorICAgICAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgxMTAKKyAgICAgICAzLiBMaW1pdCBJL08gcG9ydCBzY2FubmluZyB0byBmb3VyIEkvTyBwb3J0czoKKyAgICAgICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPTB4MTEwLDB4MjEwLDB4MjMwLDB4MzMwCisKKyAgICAgRm9yIGEgbG9hZGFibGUgbW9kdWxlIHRoZSBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZworICAgICB0aGUgJ2FzY19pb3BmbGFnJyB2YXJpYWJsZSBhbmQgJ2FzY19pb3BvcnQnIGFycmF5IHdoZW4gbG9hZGluZworICAgICB0aGUgZHJpdmVyLCBlLmcuCisKKyAgICAgICAgICAgaW5zbW9kIGFkdmFuc3lzLm8gYXNjX2lvcGZsYWc9MSBhc2NfaW9wb3J0PTB4MTEwLDB4MzMwCisKKyAgICAgSWYgQURWQU5TWVNfREVCVUcgaXMgZGVmaW5lZCBhIDV0aCAoQVNDX05VTV9JT1BPUlRfUFJPQkUgKyAxKQorICAgICBJL08gUG9ydCBtYXkgYmUgYWRkZWQgdG8gc3BlY2lmeSB0aGUgZHJpdmVyIGRlYnVnIGxldmVsLiBSZWZlciB0bworICAgICB0aGUgJ0RyaXZlciBDb21waWxlIFRpbWUgT3B0aW9ucyBhbmQgRGVidWdnaW5nJyBzZWN0aW9uIGFib3ZlIGZvcgorICAgICBtb3JlIGluZm9ybWF0aW9uLgorCisgIEcuIFRlc3RzIHRvIHJ1biBiZWZvcmUgcmVsZWFzaW5nIG5ldyBkcml2ZXIKKworICAgICAxLiBJbiB0aGUgc3VwcG9ydGVkIGtlcm5lbHMgdmVyaWZ5IHRoZXJlIGFyZSBubyB3YXJuaW5nIG9yIGNvbXBpbGUKKyAgICAgICAgZXJyb3JzIHdoZW4gdGhlIGtlcm5lbCBpcyBidWlsdCBhcyBib3RoIGEgZHJpdmVyIGFuZCBhcyBhIG1vZHVsZQorICAgICAgICBhbmQgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyAgICAgICAgQURWQU5TWVNfREVCVUcgLSBlbmFibGVkIGFuZCBkaXNhYmxlZAorICAgICAgICBDT05GSUdfU01QIC0gZW5hYmxlZCBhbmQgZGlzYWJsZWQKKyAgICAgICAgQ09ORklHX1BST0NfRlMgLSBlbmFibGVkIGFuZCBkaXNhYmxlZAorCisgICAgIDIuIFJ1biB0ZXN0cyBvbiBhbiB4ODYsIGFscGhhLCBhbmQgUG93ZXJQQyB3aXRoIGF0IGxlYXN0IG9uZSBuYXJyb3cKKyAgICAgICAgY2FyZCBhbmQgb25lIHdpZGUgY2FyZCBhdHRhY2hlZCB0byBhIGhhcmQgZGlzayBhbmQgQ0QtUk9NIGRyaXZlOgorICAgICAgICBmZGlzaywgbWtmcywgZnNjaywgYm9ubmllLCBjb3B5L2NvbXBhcmUgdGVzdCBmcm9tIHRoZQorICAgICAgICBDRC1ST00gdG8gdGhlIGhhcmQgZHJpdmUuCisKKyAgSC4gUmVsZWFzZSBIaXN0b3J5CisKKyAgICAgQkVUQS0xLjAgKDEyLzIzLzk1KToKKyAgICAgICAgIEZpcnN0IFJlbGVhc2UKKworICAgICBCRVRBLTEuMSAoMTIvMjgvOTUpOgorICAgICAgICAgMS4gUHJldmVudCBhZHZhbnN5c19kZXRlY3QoKSBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZS4KKyAgICAgICAgIDIuIEFkZCBMSUxPIDB4ZGViWzAtZl0gb3B0aW9uIHRvIHNldCAnYXNjX2RiZ2x2bCcuCisKKyAgICAgMS4yICgxLzEyLzk2KToKKyAgICAgICAgIDEuIFByZXZlbnQgcmUtZW50cmFuY3kgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWNoCisgICAgICAgICAgICByZXN1bHRlZCBpbiB0aGUgZHJpdmVyIGhhbmdpbmcgTGludXguCisgICAgICAgICAyLiBGaXggcHJvYmxlbSB0aGF0IHByZXZlbnRlZCBBQlAtOTQwIGNhcmRzIGZyb20gYmVpbmcKKyAgICAgICAgICAgIHJlY29nbml6ZWQgb24gc29tZSBQQ0kgbW90aGVyYm9hcmRzLgorICAgICAgICAgMy4gQWRkIHN1cHBvcnQgZm9yIHRoZSBBQlAtNTE0MCBQblAgSVNBIGNhcmQuCisgICAgICAgICA0LiBGaXggY2hlY2sgY29uZGl0aW9uIHJldHVybiBzdGF0dXMuCisgICAgICAgICA1LiBBZGQgY29uZGl0aW9uYWxseSBjb21waWxlZCBjb2RlIGZvciBMaW51eCB2MS4zLlguCisKKyAgICAgMS4zICgyLzIzLzk2KToKKyAgICAgICAgIDEuIEZpeCBwcm9ibGVtIGluIGFkdmFuc3lzX2Jpb3NwYXJhbSgpIHRoYXQgcmVzdWx0ZWQgaW4gdGhlCisgICAgICAgICAgICB3cm9uZyBkcml2ZSBnZW9tZXRyeSBiZWluZyByZXR1cm5lZCBmb3IgZHJpdmVzID4gMUdCIHdpdGgKKyAgICAgICAgICAgIGV4dGVuZGVkIHRyYW5zbGF0aW9uIGVuYWJsZWQuCisgICAgICAgICAyLiBBZGQgYWRkaXRpb25hbCB0cmFjaW5nIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAzLiBDaGFuZ2UgY29kZSB0aGF0IG9ubHkgYXBwbGllcyB0byBJU0EgUG5QIGFkYXB0ZXIuCisgICAgICAgICA0LiBFbGltaW5hdGUgJ21ha2UgZGVwJyB3YXJuaW5nLgorICAgICAgICAgNS4gVHJ5IHRvIGZpeCBwcm9ibGVtIHdpdGggaGFuZGxpbmcgcmVzZXRzIGJ5IGluY3JlYXNpbmcgdGhlaXIKKyAgICAgICAgICAgIHRpbWVvdXQgdmFsdWUuCisKKyAgICAgMS40ICg1LzgvOTYpOgorICAgICAgICAgMS4gQ2hhbmdlIGRlZmluaXRpb25zIHRvIGVsaW1pbmF0ZSBjb25mbGljdHMgd2l0aCBvdGhlciBzdWJzeXN0ZW1zLgorICAgICAgICAgMi4gQWRkIHZlcnNpb25pbmcgY29kZSBmb3IgdGhlIHNoYXJlZCBpbnRlcnJ1cHQgY2hhbmdlcy4KKyAgICAgICAgIDMuIEVsaW1pbmF0ZSBwcm9ibGVtIGluIGFzY19ybXF1ZXVlKCkgd2l0aCBpdGVyYXRpbmcgYWZ0ZXIgcmVtb3ZpbmcKKyAgICAgICAgICAgIGEgcmVxdWVzdC4KKyAgICAgICAgIDQuIFJlbW92ZSByZXNldCByZXF1ZXN0IGxvb3AgcHJvYmxlbSBmcm9tIHRoZSAiS25vd24gUHJvYmxlbXMgb3IKKyAgICAgICAgICAgIElzc3VlcyIgc2VjdGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBpc29sYXRlZCBhbmQgZml4ZWQgaW4gdGhlCisgICAgICAgICAgICBtaWQtbGV2ZWwgU0NTSSBkcml2ZXIuCisKKyAgICAgMS41ICg4LzgvOTYpOgorICAgICAgICAgMS4gQWRkIHN1cHBvcnQgZm9yIEFCUC05NDBVIChQQ0kgVWx0cmEpIGFkYXB0ZXIuCisgICAgICAgICAyLiBBZGQgc3VwcG9ydCBmb3IgSVJRIHNoYXJpbmcgYnkgc2V0dGluZyB0aGUgU0FfU0hJUlEgZmxhZyBmb3IKKyAgICAgICAgICAgIHJlcXVlc3RfaXJxIGFuZCBzdXBwbHlpbmcgYSBkZXZfaWQgcG9pbnRlciB0byBib3RoIHJlcXVlc3RfaXJxKCkKKyAgICAgICAgICAgIGFuZCBmcmVlX2lycSgpLgorICAgICAgICAgMy4gSW4gQXNjU2VhcmNoSU9Qb3J0QWRkcjExKCkgcmVzdG9yZSBhIGNhbGwgdG8gY2hlY2tfcmVnaW9uKCkgd2hpY2gKKyAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBJL08gcG9ydCBwcm9iaW5nLgorICAgICAgICAgNC4gRml4IGJ1ZyBpbiBhc2NfcHJ0X2hleCgpIHdoaWNoIHJlc3VsdGVkIGluIHRoZSBkaXNwbGF5aW5nCisgICAgICAgICAgICB0aGUgd3JvbmcgZGF0YS4KKyAgICAgICAgIDUuIEluY29ycG9yYXRlIG1pc2NlbGxhbmVvdXMgQXNjIExpYnJhcnkgYnVnIGZpeGVzIGFuZCBuZXcgbWljcm9jb2RlLgorICAgICAgICAgNi4gQ2hhbmdlIGRyaXZlciB2ZXJzaW9uaW5nIHRvIGJlIHNwZWNpZmljIHRvIGVhY2ggTGludXggc3ViLWxldmVsLgorICAgICAgICAgNy4gQ2hhbmdlIHN0YXRpc3RpY3MgZ2F0aGVyaW5nIHRvIGJlIHBlciBhZGFwdGVyIGluc3RlYWQgb2YgZ2xvYmFsCisgICAgICAgICAgICB0byB0aGUgZHJpdmVyLgorICAgICAgICAgOC4gQWRkIG1vcmUgaW5mb3JtYXRpb24gYW5kIHN0YXRpc3RpY3MgdG8gdGhlIGFkYXB0ZXIgL3Byb2MgZmlsZToKKyAgICAgICAgICAgIC9wcm9jL3Njc2kvYWR2YW5zeXNbMC4uLl0uCisgICAgICAgICA5LiBSZW1vdmUgJ2NtZF9wZXJfbHVuJyBmcm9tIHRoZSAiS25vd24gUHJvYmxlbXMgb3IgSXNzdWVzIiBsaXN0LgorICAgICAgICAgICAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFkZHJlc3NlZCB3aXRoIHRoZSBTQ1NJIG1pZC1sZXZlbCBjaGFuZ2VzCisgICAgICAgICAgICBtYWRlIGluIHYxLjMuODkuIFRoZSBhZHZhbnN5c19zZWxlY3RfcXVldWVfZGVwdGhzKCkgZnVuY3Rpb24KKyAgICAgICAgICAgIHdhcyBhZGRlZCBmb3IgdGhlIHYxLjMuODkgY2hhbmdlcy4KKworICAgICAxLjYgKDkvMTAvOTYpOgorICAgICAgICAgMS4gSW5jb3Jwb3JhdGUgbWlzY2VsbGFuZW91cyBBc2MgTGlicmFyeSBidWcgZml4ZXMgYW5kIG5ldyBtaWNyb2NvZGUuCisKKyAgICAgMS43ICg5LzI1Lzk2KToKKyAgICAgICAgIDEuIEVuYWJsZSBjbHVzdGVyaW5nIGFuZCBvcHRpbWl6ZSB0aGUgc2V0dGluZyBvZiB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAgICAgICAgIG9mIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzIGZvciBhbnkgcGFydGljdWxhciBib2FyZC4gQ2x1c3RlcmluZworICAgICAgICAgICAgaW5jcmVhc2VzIENQVSB1dGlsaXphdGlvbiwgYnV0IHJlc3VsdHMgaW4gYSByZWxhdGl2ZWx5IGxhcmdlcgorICAgICAgICAgICAgaW5jcmVhc2UgaW4gSS9PIHRocm91Z2hwdXQuCisgICAgICAgICAyLiBJbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgcmVxdWVzdCBxdWV1aW5nIGZ1bmN0aW9ucyBieQorICAgICAgICAgICAgYWRkaW5nIGEgbGFzdCBwb2ludGVyIHRvIHRoZSBxdWV1ZSBzdHJ1Y3R1cmUuCisgICAgICAgICAzLiBDb3JyZWN0IHByb2JsZW1zIHdpdGggcmVzZXQgYW5kIGFib3J0IHJlcXVlc3QgaGFuZGxpbmcgdGhhdAorICAgICAgICAgICAgY291bGQgaGF2ZSBodW5nIG9yIGNyYXNoZWQgTGludXguCisgICAgICAgICA0LiBBZGQgbW9yZSBpbmZvcm1hdGlvbiB0byB0aGUgYWRhcHRlciAvcHJvYyBmaWxlOgorICAgICAgICAgICAgL3Byb2Mvc2NzaS9hZHZhbnN5c1swLi4uXS4KKyAgICAgICAgIDUuIFJlbW92ZSB0aGUgcmVxdWVzdCB0aW1lb3V0IGlzc3VlIGZvcm0gdGhlIGRyaXZlciBpc3N1ZXMgbGlzdC4KKyAgICAgICAgIDYuIE1pc2NlbGxhbmVvdXMgZG9jdW1lbnRhdGlvbiBhZGRpdGlvbnMgYW5kIGNoYW5nZXMuCisKKyAgICAgMS44ICgxMC80Lzk2KToKKyAgICAgICAgIDEuIE1ha2UgY2hhbmdlcyB0byBoYW5kbGUgdGhlIG5ldyB2Mi4xLjAga2VybmVsIG1lbW9yeSBtYXBwaW5nCisgICAgICAgICAgICBpbiB3aGljaCBhIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgbWF5IG5vdCBiZSBlcXVpdmFsZW50IHRvIGl0cworICAgICAgICAgICAgYnVzIG9yIERNQSBtZW1vcnkgYWRkcmVzcy4KKyAgICAgICAgIDIuIENoYW5nZSBhYm9ydCBhbmQgcmVzZXQgcmVxdWVzdCBoYW5kbGluZyB0byBtYWtlIGl0IHlldCBldmVuCisgICAgICAgICAgICBtb3JlIHJvYnVzdC4KKyAgICAgICAgIDMuIFRyeSB0byBtaXRpZ2F0ZSByZXF1ZXN0IHN0YXJ2YXRpb24gYnkgc2VuZGluZyBvcmRlcmVkIHJlcXVlc3RzCisgICAgICAgICAgICB0byBoZWF2aWx5IGxvYWRlZCwgdGFnIHF1ZXVpbmcgZW5hYmxlZCBkZXZpY2VzLgorICAgICAgICAgNC4gTWFpbnRhaW4gc3RhdGlzdGljcyBvbiByZXF1ZXN0IHJlc3BvbnNlIHRpbWUuCisgICAgICAgICA1LiBBZGQgcmVxdWVzdCByZXNwb25zZSB0aW1lIHN0YXRpc3RpY3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIHRvCisgICAgICAgICAgICB0aGUgYWRhcHRlciAvcHJvYyBmaWxlOiAvcHJvYy9zY3NpL2FkdmFuc3lzWzAuLi5dLgorCisgICAgIDEuOSAoMTAvMjEvOTYpOgorICAgICAgICAgMS4gQWRkIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgY29kZSAoQVNDX1FVRVVFX0ZMT1dfQ09OVFJPTCkgdG8KKyAgICAgICAgICAgIG1ha2UgdXNlIG9mIG1pZC1sZXZlbCBTQ1NJIGRyaXZlciBkZXZpY2UgcXVldWUgZGVwdGggZmxvdworICAgICAgICAgICAgY29udHJvbCBtZWNoYW5pc20uIFRoaXMgd2lsbCBlbGltaW5hdGUgYWJvcnRzIGNhdXNlZCBieSBhCisgICAgICAgICAgICBkZXZpY2UgYmVpbmcgdW5hYmxlIHRvIGtlZXAgdXAgd2l0aCByZXF1ZXN0cyBhbmQgZWxpbWluYXRlCisgICAgICAgICAgICByZXBlYXQgYnVzeSBvciBRVUVVRSBGVUxMIHN0YXR1cyByZXR1cm5lZCBieSBhIGRldmljZS4KKyAgICAgICAgIDIuIEluY29ycG9yYXRlIG1pc2NlbGxhbmVvdXMgQXNjIExpYnJhcnkgYnVnIGZpeGVzLgorICAgICAgICAgMy4gVG8gYWxsb3cgdGhlIGRyaXZlciB0byB3b3JrIGluIGtlcm5lbHMgd2l0aCBicm9rZW4gbW9kdWxlCisgICAgICAgICAgICBzdXBwb3J0IHNldCAnY21kX3Blcl9sdW4nIGlmIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgYXMgYQorICAgICAgICAgICAgbW9kdWxlLiBUaGlzIGNoYW5nZSBhZmZlY3RzIGtlcm5lbHMgdjEuMy44OSB0byBwcmVzZW50LgorICAgICAgICAgNC4gUmVtb3ZlIFBDSSBCSU9TIGFkZHJlc3MgZnJvbSB0aGUgZHJpdmVyIGJhbm5lci4gVGhlIFBDSSBCSU9TCisgICAgICAgICAgICBpcyByZWxvY2F0ZWQgYnkgdGhlIG1vdGhlcmJvYXJkIEJJT1MgYW5kIGl0cyBuZXcgYWRkcmVzcyBjYW4KKyAgICAgICAgICAgIG5vdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICA1LiBBZGQgbWlkLWxldmVsIFNDU0kgcXVldWUgZGVwdGggaW5mb3JtYXRpb24gdG8gdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIC9wcm9jIGZpbGU6IC9wcm9jL3Njc2kvYWR2YW5zeXNbMC4uLl0uCisKKyAgICAgMi4wICgxMS8xNC85Nik6CisgICAgICAgICAxLiBDaGFuZ2UgYWxsb2NhdGlvbiBvZiBnbG9iYWwgc3RydWN0dXJlcyB1c2VkIGZvciBkZXZpY2UKKyAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHRvIGd1YXJhbnRlZSB0aGV5IGFyZSBpbiBETUEtYWJsZSBtZW1vcnkuCisgICAgICAgICAgICBQcmV2aW91c2x5IHdoZW4gdGhlIGRyaXZlciB3YXMgbG9hZGVkIGFzIGEgbW9kdWxlIHRoZXNlCisgICAgICAgICAgICBzdHJ1Y3R1cmVzIG1pZ2h0IG5vdCBoYXZlIGJlZW4gaW4gRE1BLWFibGUgbWVtb3J5LCBjYXVzaW5nCisgICAgICAgICAgICBkZXZpY2UgaW5pdGlhbGl6YXRpb24gdG8gZmFpbC4KKworICAgICAyLjEgKDEyLzMwLzk2KToKKyAgICAgICAgIDEuIEluIGFkdmFuc3lzX3Jlc2V0KCksIGlmIHRoZSByZXF1ZXN0IGlzIGEgc3luY2hyb25vdXMgcmVzZXQKKyAgICAgICAgICAgIHJlcXVlc3QsIGV2ZW4gaWYgdGhlIHJlcXVlc3Qgc2VyaWFsIG51bWJlciBoYXMgY2hhbmdlZCwgdGhlbgorICAgICAgICAgICAgY29tcGxldGUgdGhlIHJlcXVlc3QuCisgICAgICAgICAyLiBBZGQgQXNjIExpYnJhcnkgYnVnIGZpeGVzIGluY2x1ZGluZyBuZXcgbWljcm9jb2RlLgorICAgICAgICAgMy4gQ2xlYXIgaW5xdWlyeSBidWZmZXIgYmVmb3JlIHVzaW5nIGl0LgorICAgICAgICAgNC4gQ29ycmVjdCBpZmRlZiB0eXBvLgorCisgICAgIDIuMiAoMS8xNS85Nyk6CisgICAgICAgICAxLiBBZGQgQXNjIExpYnJhcnkgYnVnIGZpeGVzIGluY2x1ZGluZyBuZXcgbWljcm9jb2RlLgorICAgICAgICAgMi4gQWRkIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgcmF0ZSBpbmZvcm1hdGlvbiB0byB0aGUKKyAgICAgICAgICAgIGFkYXB0ZXIgL3Byb2MgZmlsZTogL3Byb2Mvc2NzaS9hZHZhbnN5c1swLi4uXS4KKyAgICAgICAgIDMuIENoYW5nZSBBRFZBTlNZU19ERUJVRyB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiBUaGlzCisgICAgICAgICAgICB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIGltYWdlLCBlbGltaW5hdGUgZXhlY3V0aW9uCisgICAgICAgICAgICBvdmVyaGVhZCwgYW5kIHJlbW92ZSB1bm5lZWRlZCBzeW1ib2xzIGZyb20gdGhlIGtlcm5lbCBzeW1ib2wKKyAgICAgICAgICAgIHNwYWNlIHRoYXQgd2VyZSBwcmV2aW91c2x5IGFkZGVkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICA0LiBBZGQgbmV3IGNvbXBpbGUtdGltZSBvcHRpb24gQURWQU5TWVNfQVNTRVJUIGZvciBhc3NlcnRpb24KKyAgICAgICAgICAgIGNvZGUgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgd2l0aGluIEFEVkFOU1lTX0RFQlVHLiBUaGlzCisgICAgICAgICAgICBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCisgICAgIDIuOCAoNS8yNi85Nyk6CisgICAgICAgICAxLiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi44IHRvIHN5bmNocm9uaXplIHRoZSBMaW51eCBkcml2ZXIKKyAgICAgICAgICAgIHZlcnNpb24gbnVtYmVyaW5nIHdpdGggb3RoZXIgQWR2YW5TeXMgZHJpdmVycy4KKyAgICAgICAgIDIuIFJlZm9ybWF0IHNvdXJjZSBmaWxlcyB3aXRob3V0IHRhYnMgdG8gcHJlc2VudCB0aGUgc2FtZSB2aWV3CisgICAgICAgICAgICBvZiB0aGUgZmlsZSB0byBldmVyeW9uZSByZWdhcmRsZXNzIG9mIHRoZSBlZGl0b3IgdGFiIHNldHRpbmcKKyAgICAgICAgICAgIGJlaW5nIHVzZWQuCisgICAgICAgICAzLiBBZGQgQXNjIExpYnJhcnkgYnVnIGZpeGVzLgorCisgICAgIDMuMUEgKDEvOC85OCk6CisgICAgICAgICAxLiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMy4xIHRvIGluZGljYXRlIHRoYXQgc3VwcG9ydCBmb3IKKyAgICAgICAgICAgIFVsdHJhLVdpZGUgYWRhcHRlcnMgKEFCUC05NDBVVykgaXMgaW5jbHVkZWQgaW4gdGhpcyByZWxlYXNlLgorICAgICAgICAgMi4gQWRkIEFzYyBMaWJyYXJ5IChOYXJyb3cgQm9hcmQpIGJ1ZyBmaXhlcy4KKyAgICAgICAgIDMuIFJlcG9ydCBhbiB1bmRlcnJ1biBjb25kaXRpb24gd2l0aCB0aGUgaG9zdCBzdGF0dXMgYnl0ZSBzZXQKKyAgICAgICAgICAgIHRvIERJRF9VTkRFUlJVTi4gQ3VycmVudGx5IERJRF9VTkRFUlJVTiBpcyBkZWZpbmVkIHRvIDAgd2hpY2gKKyAgICAgICAgICAgIGNhdXNlcyB0aGUgdW5kZXJydW4gY29uZGl0aW9uIHRvIGJlIGlnbm9yZWQuIFdoZW4gTGludXggZGVmaW5lcworICAgICAgICAgICAgaXRzIG93biBESURfVU5ERVJSVU4gdGhlIGNvbnN0YW50IGRlZmluZWQgaW4gdGhpcyBmaWxlIGNhbiBiZQorICAgICAgICAgICAgcmVtb3ZlZC4KKyAgICAgICAgIDQuIEFkZCBwYXRjaCB0byBBc2NXYWl0VGl4SVNSRG9uZSgpLgorICAgICAgICAgNS4gQWRkIHN1cHBvcnQgZm9yIHVwIHRvIDE2IGRpZmZlcmVudCBBZHZhblN5cyBob3N0IGFkYXB0ZXIgU0NTSQorICAgICAgICAgICAgY2hhbm5lbHMgaW4gb25lIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm91ciBjYXJkcyB3aXRoIGZvdXIgY2hhbm5lbHMKKyAgICAgICAgICAgIHRvIGJlIHVzZWQgaW4gb25lIHN5c3RlbS4KKworICAgICAzLjFCICgxLzkvOTgpOgorICAgICAgICAgMS4gSGFuZGxlIHRoYXQgUENJIHJlZ2lzdGVyIGJhc2UgYWRkcmVzc2VzIGFyZSBub3QgYWx3YXlzIHBhZ2UKKyAgICAgICAgICAgIGFsaWduZWQgZXZlbiB0aG91Z2ggaW9yZW1hcCgpIHJlcXVpcmVzIHRoYXQgdGhlIGFkZHJlc3MgYXJndW1lbnQKKyAgICAgICAgICAgIGJlIHBhZ2UgYWxpZ25lZC4KKworICAgICAzLjFDICgxLzEwLzk4KToKKyAgICAgICAgIDEuIFVwZGF0ZSBsYXRlc3QgQklPUyB2ZXJzaW9uIGNoZWNrZWQgZm9yIGZyb20gdGhlIC9wcm9jIGZpbGUuCisgICAgICAgICAyLiBEb24ndCBzZXQgbWljcm9jb2RlIFNEVFIgdmFyaWFibGUgYXQgaW5pdGlhbGl6YXRpb24uIEluc3RlYWQKKyAgICAgICAgICAgIHdhaXQgdW50aWwgZGV2aWNlIGNhcGFiaWxpdGllcyBoYXZlIGJlZW4gZGV0ZWN0ZWQgZnJvbSBhbiBJbnF1aXJ5CisgICAgICAgICAgICBjb21tYW5kLgorCisgICAgIDMuMUQgKDEvMjEvOTgpOgorICAgICAgICAgMS4gSW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgYXMgbW9kdWxlIGJ5CisgICAgICAgICAgICBhbGxvd2luZyB1cCB0byA2NCBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBpbnN0ZWFkIG9mIDguCisKKyAgICAgMy4xRSAoNS8xLzk4KToKKyAgICAgICAgIDEuIFNldCB0aW1lIGRlbGF5IGluIEFzY1dhaXRUaXhJU1JEb25lKCkgdG8gMTAwMCBtcy4KKyAgICAgICAgIDIuIEluY2x1ZGUgU01QIGxvY2tpbmcgY2hhbmdlcy4KKyAgICAgICAgIDMuIEZvciB2Mi4xLjkzIGFuZCBuZXdlciBrZXJuZWxzIHVzZSBDT05GSUdfUENJIGFuZCBuZXcgUENJIEJJT1MKKyAgICAgICAgICAgIGFjY2VzcyBmdW5jdGlvbnMuCisgICAgICAgICA0LiBVcGRhdGUgYm9hcmQgc2VyaWFsIG51bWJlciBwcmludGluZy4KKyAgICAgICAgIDUuIFRyeSBhbGxvY2F0aW5nIGFuIElSUSBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIFNBX0lOVEVSUlVQVAorICAgICAgICAgICAgZmxhZyBzZXQgdG8gYWxsb3cgSVJRIHNoYXJpbmcgd2l0aCBkcml2ZXJzIHRoYXQgZG8gbm90IHNldAorICAgICAgICAgICAgdGhlIFNBX0lOVEVSUlVQVCBmbGFnLiBBbHNvIGRpc3BsYXkgYSBtb3JlIGRlc2NyaXB0aXZlIGVycm9yCisgICAgICAgICAgICBtZXNzYWdlIGlmIHJlcXVlc3RfaXJxKCkgZmFpbHMuCisgICAgICAgICA2LiBVcGRhdGUgdG8gbGF0ZXN0IEFzYyBhbmQgQWR2IExpYnJhcmllcy4KKworICAgICAzLjJBICg3LzIyLzk5KToKKyAgICAgICAgIDEuIFVwZGF0ZSBBZHYgTGlicmFyeSB0byA0LjE2IHdoaWNoIGluY2x1ZGVzIHN1cHBvcnQgZm9yCisgICAgICAgICAgICB0aGUgQVNDMzhDMDgwMCAoVWx0cmEyL0xWRCkgSUMuCisKKyAgICAgMy4yQiAoOC8yMy85OSk6CisgICAgICAgICAxLiBDb3JyZWN0IFBDSSBjb21waWxlIHRpbWUgb3B0aW9uIGZvciB2Mi4xLjkzIGFuZCBncmVhdGVyCisgICAgICAgICAgICBrZXJuZWxzLCBhZHZhbnN5c19pbmZvKCkgc3RyaW5nLCBhbmQgZGVidWcgY29tcGlsZSB0aW1lCisgICAgICAgICAgICBvcHRpb24uCisgICAgICAgICAyLiBDb3JyZWN0IER2Y1NsZWVwTWlsbGlTZWNvbmQoKSBmb3IgdjIuMS4wIGFuZCBncmVhdGVyCisgICAgICAgICAgICBrZXJuZWxzLiBUaGlzIGNhdXNlZCBhbiBMVkQgZGV0ZWN0aW9uL0JJU1QgcHJvYmxlbSBwcm9ibGVtCisgICAgICAgICAgICBhbW9uZyBvdGhlciB0aGluZ3MuCisgICAgICAgICAzLiBTb3J0IFBDSSBjYXJkcyBieSBQQ0kgQnVzLCBTbG90LCBGdW5jdGlvbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAgICAgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgQklPUy4KKyAgICAgICAgIDQuIFVwZGF0ZSB0byBBc2MgTGlicmFyeSBTMTIxIGFuZCBBZHYgTGlicmFyeSA1LjIuCisKKyAgICAgMy4yQyAoOC8yNC85OSk6CisgICAgICAgICAxLiBDb3JyZWN0IFBDSSBjYXJkIGRldGVjdGlvbiBidWcgaW50cm9kdWNlZCBpbiAzLjJCIHRoYXQKKyAgICAgICAgICAgIHByZXZlbnRlZCBQQ0kgY2FyZHMgZnJvbSBiZWluZyBkZXRlY3RlZCBpbiBrZXJuZWxzIG9sZGVyCisgICAgICAgICAgICB0aGFuIHYyLjEuOTMuCisKKyAgICAgMy4yRCAoOC8yNi85OSk6CisgICAgICAgICAxLiBDb3JyZWN0IC9wcm9jIGRldmljZSBzeW5jaHJvbm91cyBzcGVlZCBpbmZvcm1hdGlvbiBkaXNwbGF5LgorICAgICAgICAgICAgQWxzbyB3aGVuIHJlLW5lZ290aWF0aW9uIGlzIHBlbmRpbmcgZm9yIGEgdGFyZ2V0IGRldmljZQorICAgICAgICAgICAgbm90ZSB0aGlzIGNvbmRpdGlvbiB3aXRoIGFuICogYW5kIGZvb3Rub3RlLgorICAgICAgICAgMi4gQ29ycmVjdCBpbml0aWFsaXphdGlvbiBwcm9ibGVtIHdpdGggVWx0cmEtV2lkZSBjYXJkcyB0aGF0CisgICAgICAgICAgICBoYXZlIGEgcHJlLTMuMiBCSU9TLiBBIG1pY3JvY29kZSB2YXJpYWJsZSBjaGFuZ2VkIGxvY2F0aW9ucworICAgICAgICAgICAgaW4gMy4yIGFuZCBncmVhdGVyIEJJT1NlcyB3aGljaCBjYXVzZWQgV0RUUiB0byBiZSBhdHRlbXB0ZWQKKyAgICAgICAgICAgIGVycm9uZW91c2x5IHdpdGggZHJpdmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBXRFRSLgorCisgICAgIDMuMkUgKDgvMzAvOTkpOgorICAgICAgICAgMS4gRml4IGNvbXBpbGUgZXJyb3IgY2F1c2VkIGJ5IHYyLjMuMTMgUENJIHN0cnVjdHVyZSBjaGFuZ2UuCisgICAgICAgICAyLiBSZW1vdmUgZmllbGQgZnJvbSBBU0NFRVBfQ09ORklHIHRoYXQgcmVzdWx0ZWQgaW4gYW4gRUVQUk9NCisgICAgICAgICAgICBjaGVja3N1bSBlcnJvciBmb3IgSVNBIGNhcmRzLgorICAgICAgICAgMy4gUmVtb3ZlIEFTQ19RVUVVRV9GTE9XX0NPTlRST0wgY29uZGl0aW9uYWwgY29kZS4gVGhlIG1pZC1sZXZlbAorICAgICAgICAgICAgU0NTSSBjaGFuZ2VzIHRoYXQgaXQgZGVwZW5kZWQgb24gd2VyZSBuZXZlciBpbmNsdWRlZCBpbiBMaW51eC4KKworICAgICAzLjJGICg5LzMvOTkpOgorICAgICAgICAgMS4gSGFuZGxlIG5ldyBpbml0aWFsIGZ1bmN0aW9uIGNvZGUgYWRkZWQgaW4gdjIuMy4xNiBmb3IgYWxsCisgICAgICAgICAgICBkcml2ZXIgdmVyc2lvbnMuCisKKyAgICAgMy4yRyAoOS84Lzk5KToKKyAgICAgICAgIDEuIEZpeCBQQ0kgYm9hcmQgZGV0ZWN0aW9uIGluIHYyLjMuMTMgYW5kIGdyZWF0ZXIga2VybmVscy4KKyAgICAgICAgIDIuIEZpeCBjb21pcGxlIGVycm9ycyBpbiB2Mi4zLlggd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4KKworICAgICAzLjJIICg5LzEzLzk5KToKKyAgICAgICAgIDEuIEFkZCA2NC1iaXQgYWRkcmVzcywgbG9uZyBzdXBwb3J0IGZvciBBbHBoYSBhbmQgVWx0cmFTUEFSQy4KKyAgICAgICAgICAgIFRoZSBkcml2ZXIgaGFzIGJlZW4gdmVyaWZpZWQgdG8gd29yayBvbiBhbiBBbHBoYSBzeXN0ZW0uCisgICAgICAgICAyLiBBZGQgcGFydGlhbCBieXRlIG9yZGVyIGhhbmRsaW5nIHN1cHBvcnQgZm9yIFBvd2VyIFBDIGFuZAorICAgICAgICAgICAgb3RoZXIgYmlnLWVuZGlhbiBwbGF0Zm9ybXMuIFRoaXMgc3VwcG9ydCBoYXMgbm90IHlldCBiZWVuCisgICAgICAgICAgICBjb21wbGV0ZWQgb3IgdmVyaWZpZWQuCisgICAgICAgICAzLiBGb3Igd2lkZSBib2FyZHMgcmVwbGFjZSBibG9jayB6ZXJvaW5nIG9mIHJlcXVlc3QgYW5kCisgICAgICAgICAgICBzY2F0dGVyLWdhdGhlciBzdHJ1Y3R1cmVzIHdpdGggaW5kaXZpZHVhbCBmaWVsZCBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAgICAgICAgIDQuIENvcnJlY3QgYW5kIGNsYXJpZnkgUk9NIEJJT1MgdmVyc2lvbiBkZXRlY3Rpb24uCisKKyAgICAgMy4ySSAoMTAvOC85OSk6CisgICAgICAgICAxLiBVcGRhdGUgdG8gQWR2IExpYnJhcnkgNS40LgorICAgICAgICAgMi4gQWRkIHYyLjMuMTkgdW5kZXJydW4gcmVwb3J0aW5nIHRvIGFzY19pc3JfY2FsbGJhY2soKSBhbmQKKyAgICAgICAgICAgIGFkdl9pc3JfY2FsbGJhY2soKS4gIFJlbW92ZSBESURfVU5ERVJSVU4gY29uc3RhbnQgYW5kIG90aGVyCisgICAgICAgICAgICBubyBsb25nZXIgbmVlZGVkIGNvZGUgdGhhdCBwcmV2aW91c2x5IGRvY3VtZW50ZWQgdGhlIGxhY2sKKyAgICAgICAgICAgIG9mIHVuZGVycnVuIGhhbmRsaW5nLgorCisgICAgIDMuMkogKDEwLzE0Lzk5KToKKyAgICAgICAgIDEuIEVsaW1pbmF0ZSBjb21waWxlIGVycm9ycyBmb3IgdjIuMCBhbmQgZWFybGllciBrZXJuZWxzLgorCisgICAgIDMuMksgKDExLzE1Lzk5KToKKyAgICAgICAgIDEuIENvcnJlY3QgZGVidWcgY29tcGlsZSBlcnJvciBpbiBhc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKCkuCisgICAgICAgICAyLiBVcGRhdGUgQWR2IExpYnJhcnkgdG8gNS41LgorICAgICAgICAgMy4gQWRkIGlmZGVmIGhhbmRsaW5nIGZvciAvcHJvYyBjaGFuZ2VzIGFkZGVkIGluIHYyLjMuMjguCisgICAgICAgICA0LiBJbmNyZWFzZSBXaWRlIGJvYXJkIHNjYXR0ZXItZ2F0aGVyIGxpc3QgbWF4aW11bSBsZW5ndGggdG8KKyAgICAgICAgICAgIDI1NSB3aGVuIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLgorCisgICAgIDMuMkwgKDExLzE4Lzk5KToKKyAgICAgICAgIDEuIEZpeCBidWcgaW4gYWR2X2dldF9zZ2xpc3QoKSB0aGF0IGNhdXNlZCBhbiBhc3NlcnRpb24gZmFpbHVyZQorICAgICAgICAgICAgYXQgbGluZSA3NDc1LiBUaGUgcmVxcC0+c2dibGtwIHBvaW50ZXIgbXVzdCBiZSBpbml0aWFsaXplZAorICAgICAgICAgICAgdG8gTlVMTCBpbiBhZHZfZ2V0X3NnbGlzdCgpLgorCisgICAgIDMuMk0gKDExLzI5Lzk5KToKKyAgICAgICAgIDEuIFJlYWxseSBmaXggYnVnIGluIGFkdl9nZXRfc2dsaXN0KCkuCisgICAgICAgICAyLiBJbmNvcnBvcmF0ZSB2Mi4zLjI5IGNoYW5nZXMgaW50byBkcml2ZXIuCisKKyAgICAgMy4yTiAoNC8xLzAwKToKKyAgICAgICAgIDEuIEFkZCBDT05GSUdfSVNBIGlmZGVmIGNvZGUuCisgICAgICAgICAyLiBJbmNsdWRlIGFkdmFuc3lzX2ludGVycnVwdHNfZW5hYmxlZCBuYW1lIGNoYW5nZSBwYXRjaC4KKyAgICAgICAgIDMuIEZvciA+PSB2Mi4zLjI4IHVzZSBuZXcgU0NTSSBlcnJvciBoYW5kbGluZyB3aXRoIG5ldyBmdW5jdGlvbgorICAgICAgICAgICAgYWR2YW5zeXNfZWhfYnVzX3Jlc2V0KCkuIERvbid0IGluY2x1ZGUgYW4gYWJvcnQgZnVuY3Rpb24KKyAgICAgICAgICAgIGJlY2F1c2Ugb2YgYmFzZSBsaWJyYXJ5IGxpbWl0YXRpb25zLgorICAgICAgICAgNC4gRm9yID49IHYyLjMuMjggdXNlIHBlciBib2FyZCBsb2NrIGluc3RlYWQgb2YgaW9fcmVxdWVzdF9sb2NrLgorICAgICAgICAgNS4gRm9yID49IHYyLjMuMjggZWxpbWluYXRlIGFkdmFuc3lzX2NvbW1hbmQoKSBhbmQKKyAgICAgICAgICAgIGFkdmFuc3lzX2NvbW1hbmRfZG9uZSgpLgorICAgICAgICAgNi4gQWRkIHNvbWUgY2hhbmdlcyBmb3IgUG93ZXJQQyAoQmlnIEVuZGlhbikgc3VwcG9ydCwgYnV0IGl0IGlzbid0CisgICAgICAgICAgICB3b3JraW5nIHlldC4KKyAgICAgICAgIDcuIEZpeCAibm9uZXhpc3RlbnQgcmVzb3VyY2UgZnJlZSIgcHJvYmxlbSB0aGF0IG9jY3VycmVkIG9uIGEgbW9kdWxlCisgICAgICAgICAgICB1bmxvYWQgZm9yIGJvYXJkcyB3aXRoIGFuIEkvTyBzcGFjZSA+PSAyNTUuIFRoZSAnbl9pb19wb3J0JyBmaWVsZAorICAgICAgICAgICAgaXMgb25seSBvbmUgYnl0ZSBhbmQgY2FuIG5vdCBiZSB1c2VkIHRvIGhvbGQgYW4gaW9wb3J0IGxlbmd0aCBtb3JlCisgICAgICAgICAgICB0aGFuIDI1NS4KKworICAgICAzLjNBICg0LzQvMDApOgorICAgICAgICAgMS4gVXBkYXRlIHRvIEFkdiBMaWJyYXJ5IDUuOC4KKyAgICAgICAgIDIuIEZvciB3aWRlIGNhcmRzIGFkZCBzdXBwb3J0IGZvciBDREJzIHVwIHRvIDE2IGJ5dGVzLgorICAgICAgICAgMy4gRWxpbWluYXRlIHdhcm5pbmdzIHdoZW4gQ09ORklHX1BST0NfRlMgaXMgbm90IGRlZmluZWQuCisKKyAgICAgMy4zQiAoNS8xLzAwKToKKyAgICAgICAgIDEuIFN1cHBvcnQgZm9yIFBvd2VyUEMgKEJpZyBFbmRpYW4pIHdpZGUgY2FyZHMuIE5hcnJvdyBjYXJkcworICAgICAgICAgICAgc3RpbGwgbmVlZCB3b3JrLgorICAgICAgICAgMi4gQ2hhbmdlIGJpdGZpZWxkcyB0byBzaGlmdCBhbmQgbWFzayBhY2Nlc3MgZm9yIGVuZGlhbgorICAgICAgICAgICAgcG9ydGFiaWxpdHkuCisKKyAgICAgMy4zQyAoMTAvMTMvMDApOgorICAgICAgICAgMS4gVXBkYXRlIGZvciBsYXRlc3QgMi40IGtlcm5lbC4KKyAgICAgICAgIDIuIFRlc3QgQUJQLTQ4MCBDYXJkQnVzIHN1cHBvcnQgaW4gMi40IGtlcm5lbCAtIHdvcmtzIQorICAgICAgICAgMy4gVXBkYXRlIHRvIEFzYyBMaWJyYXJ5IFMxMjMuCisgICAgICAgICA0LiBVcGRhdGUgdG8gQWR2IExpYnJhcnkgNS4xMi4KKworICAgICAzLjNEICgxMS8yMi8wMCk6CisgICAgICAgICAxLiBVcGRhdGUgZm9yIGxhdGVzdCAyLjQga2VybmVsLgorICAgICAgICAgMi4gQ3JlYXRlIHBhdGNoZXMgZm9yIDIuMiBhbmQgMi40IGtlcm5lbHMuCisKKyAgICAgMy4zRSAoMS85LzAxKToKKyAgICAgICAgIDEuIE5vdyB0aGF0IDIuNCBpcyByZWxlYXNlZCByZW1vdmUgaWZkZWYgY29kZSBmb3Iga2VybmVsIHZlcnNpb25zCisgICAgICAgICAgICBsZXNzIHRoYW4gMi4yLiBUaGUgZHJpdmVyIGlzIG5vdyBvbmx5IHN1cHBvcnRlZCBpbiBrZXJuZWxzIDIuMiwKKyAgICAgICAgICAgIDIuNCwgYW5kIGdyZWF0ZXIuCisgICAgICAgICAyLiBBZGQgY29kZSB0byByZWxlYXNlIGFuZCBhY3F1aXJlIHRoZSBpb19yZXF1ZXN0X2xvY2sgaW4KKyAgICAgICAgICAgIHRoZSBkcml2ZXIgZW50cnlwb2ludCBmdW5jdGlvbnM6IGFkdmFuc3lzX2RldGVjdCBhbmQKKyAgICAgICAgICAgIGFkdmFuc3lzX3F1ZXVlY29tbWFuZC4gSW4ga2VybmVsIDIuNCB0aGUgU0NTSSBtaWQtbGV2ZWwgZHJpdmVyCisgICAgICAgICAgICBzdGlsbCBob2xkcyB0aGUgaW9fcmVxdWVzdF9sb2NrIG9uIGVudHJ5IHRvIFNDU0kgbG93LWxldmVsIGRyaXZlcnMuCisgICAgICAgICAgICBUaGlzIHdhcyBzdXBwb3NlZCB0byBiZSByZW1vdmVkIGJlZm9yZSAyLjQgd2FzIHJlbGVhc2VkIGJ1dCBuZXZlcgorICAgICAgICAgICAgaGFwcGVuZWQuIFdoZW4gdGhlIG1pZC1sZXZlbCBTQ1NJIGRyaXZlciBpcyBjaGFuZ2VkIGFsbCByZWZlcmVuY2VzCisgICAgICAgICAgICB0byB0aGUgaW9fcmVxdWVzdF9sb2NrIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGRyaXZlci4KKyAgICAgICAgIDMuIFNpbXBsaWZ5IGVycm9yIGhhbmRsaW5nIGJ5IHJlbW92aW5nIGFkdmFuc3lzX2Fib3J0KCksCisgICAgICAgICAgICBBc2NBYm9ydFNSQigpLCBBc2NSZXNldERldmljZSgpLiBTQ1NJIGJ1cyByZXNldCByZXF1ZXN0cyBhcmUKKyAgICAgICAgICAgIG5vdyBoYW5kbGVkIGJ5IHJlc2V0dGluZyB0aGUgU0NTSSBidXMgYW5kIGZ1bGx5IHJlLWluaXRpYWxpemluZworICAgICAgICAgICAgdGhlIGNoaXAuIFRoaXMgc2ltcGxlIG1ldGhvZCBvZiBlcnJvciByZWNvdmVyeSBoYXMgcHJvdmVuIHRvIHdvcmsKKyAgICAgICAgICAgIG1vc3QgcmVsaWFibHkgYWZ0ZXIgYXR0ZW1wdHMgYXQgZGlmZmVyZW50IG1ldGhvZHMuIEFsc28gbm93IG9ubHkKKyAgICAgICAgICAgIHN1cHBvcnQgdGhlICJuZXciIGVycm9yIGhhbmRsaW5nIG1ldGhvZCBhbmQgcmVtb3ZlIHRoZSBvYnNvbGV0ZQorICAgICAgICAgICAgZXJyb3IgaGFuZGxpbmcgaW50ZXJmYWNlLgorICAgICAgICAgNC4gRml4IGRlYnVnIGJ1aWxkIGVycm9ycy4KKworICAgICAzLjNGICgxLzI0LzAxKToKKyAgICAgICAgIDEuIE1lcmdlIHdpdGggQ29ubmVjdENvbSB2ZXJzaW9uIGZyb20gQW5keSBLZWxsbmVyIHdoaWNoCisgICAgICAgICAgICB1cGRhdGVzIEFkdiBMaWJyYXJ5IHRvIDUuMTQuCisgICAgICAgICAyLiBNYWtlIFBvd2VyUEMgKEJpZyBFbmRpYW4pIHdvcmsgZm9yIG5hcnJvdyBjYXJkcyBhbmQKKyAgICAgICAgICAgIGZpeCBwcm9ibGVtcyB3cml0aW5nIEVFUFJPTSBmb3Igd2lkZSBjYXJkcy4KKyAgICAgICAgIDMuIFJlbW92ZSBpbnRlcnJ1cHRzX2VuYWJsZWQgYXNzZXJ0aW9uIGZ1bmN0aW9uLgorCisgICAgIDMuM0cgKDIvMTYvMDEpOgorICAgICAgICAgMS4gUmV0dXJuIGFuIGVycm9yIGZyb20gbmFycm93IGJvYXJkcyBpZiBwYXNzZWQgYSAxNiBieXRlCisgICAgICAgICAgICBDREIuIFRoZSB3aWRlIGJvYXJkIGNhbiBhbHJlYWR5IGhhbmRsZSAxNiBieXRlIENEQnMuCisKKyAgICAgMy4zR0ogKDQvMTUvMDIpOgorCSAxLiBoYWNrcyBmb3IgbGsgMi41IHNlcmllcyAoRC4gR2lsYmVydCkKKworICAgICAzLjNHSkQgKDEwLzE0LzAyKToKKyAgICAgICAgIDEuIGNoYW5nZSBzZWxlY3RfcXVldWVfZGVwdGhzIHRvIHNsYXZlX2NvbmZpZ3VyZQorCSAyLiBtYWtlIGNtZF9wZXJfbHVuIGJlIHNhbmUgYWdhaW4KKworICAgICAzLjNLIFsyMDA0LzA2LzI0XToKKyAgICAgICAgIDEuIGNvbnRpbnVpbmcgY2xlYW51cCBmb3IgbGsgMi42IHNlcmllcworICAgICAgICAgMi4gRml4IHByb2JsZW0gaW4gbGsgMi42LjctYmsyIHRoYXQgYnJva2UgUENJIHdpZGUgY2FyZHMKKyAgICAgICAgIDMuIEZpeCBwcm9ibGVtIHRoYXQgb29wc2VkIElTQSBjYXJkcworCisgIEkuIEtub3duIFByb2JsZW1zL0ZpeCBMaXN0IChYWFgpCisKKyAgICAgMS4gTmVlZCB0byBhZGQgbWVtb3J5IG1hcHBpbmcgd29ya2Fyb3VuZC4gVGVzdCB0aGUgbWVtb3J5IG1hcHBpbmcuCisgICAgICAgIElmIGl0IGRvZXNuJ3Qgd29yayByZXZlcnQgdG8gSS9PIHBvcnQgYWNjZXNzLiBDYW4gYSB0ZXN0IGJlIGRvbmUKKyAgICAgICAgc2FmZWx5PworICAgICAyLiBIYW5kbGUgYW4gaW50ZXJydXB0IG5vdCB3b3JraW5nLiBLZWVwIGFuIGludGVycnVwdCBjb3VudGVyIGluCisgICAgICAgIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gSW4gdGhlIHRpbWVvdXQgZnVuY3Rpb24gaWYgdGhlIGludGVycnVwdAorICAgICAgICBoYXMgbm90IG9jY3VycmVkIHRoZW4gcHJpbnQgYSBtZXNzYWdlIGFuZCBydW4gaW4gcG9sbGVkIG1vZGUuCisgICAgIDMuIEFsbG93IGJ1cyB0eXBlIHNjYW5uaW5nIG9yZGVyIHRvIGJlIGNoYW5nZWQuCisgICAgIDQuIE5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIHRhcmdldCBtb2RlIGNvbW1hbmRzLCBjZi4gQ0FNIFhQVC4KKworICBKLiBDcmVkaXRzIChDaHJvbm9sb2dpY2FsIE9yZGVyKQorCisgICAgIEJvYiBGcmV5IDxiZnJleUB0dXJib2xpbnV4LmNvbS5jbj4gd3JvdGUgdGhlIEFkdmFuU3lzIFNDU0kgZHJpdmVyCisgICAgIGFuZCBtYWludGFpbmVkIGl0IHVwIHRvIDMuM0YuIEhlIGNvbnRpbnVlcyB0byBhbnN3ZXIgcXVlc3Rpb25zCisgICAgIGFuZCBoZWxwIG1haW50YWluIHRoZSBkcml2ZXIuCisKKyAgICAgTmF0aGFuIEhhcnR3ZWxsIDxtYWdlQGNkYzMuY2RjLm5ldD4gcHJvdmlkZWQgdGhlIGRpcmVjdGlvbnMgYW5kCisgICAgIGJhc2lzIGZvciB0aGUgTGludXggdjEuMy5YIGNoYW5nZXMgd2hpY2ggd2VyZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgMS4yIHJlbGVhc2UuCisKKyAgICAgVGhvbWFzIEUgWmVydWNoYSA8emVydWNoYUBzaGVsbC5wb3J0YWwuY29tPiBwb2ludGVkIG91dCBhIGJ1ZworICAgICBpbiBhZHZhbnN5c19iaW9zcGFyYW0oKSB3aGljaCB3YXMgZml4ZWQgaW4gdGhlIDEuMyByZWxlYXNlLgorCisgICAgIEVyaWsgUmF0Y2xpZmZlIDxlcmlrQGNhbGRlcmEuY29tPiBoYXMgZG9uZSB0ZXN0aW5nIG9mIHRoZQorICAgICBBZHZhblN5cyBkcml2ZXIgaW4gdGhlIENhbGRlcmEgcmVsZWFzZXMuCisKKyAgICAgUmlrIHZhbiBSaWVsIDxILkgudmFuUmllbEBmeXMucnV1Lm5sPiBwcm92aWRlZCBhIHBhdGNoIHRvCisgICAgIEFzY1dhaXRUaXhJU1JEb25lKCkgd2hpY2ggaGUgZm91bmQgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlCisgICAgIGRyaXZlciB3b3JrIHdpdGggYSBTQ1NJLTEgZGlzay4KKworICAgICBNYXJrIE1vcmFuIDxtbW9yYW5AbW1vcmFuLmNvbT4gaGFzIGhlbHBlZCB0ZXN0IFVsdHJhLVdpZGUKKyAgICAgc3VwcG9ydCBpbiB0aGUgMy4xQSBkcml2ZXIuCisKKyAgICAgRG91ZyBHaWxiZXJ0IDxkZ2lsYmVydEBpbnRlcmxvZy5jb20+IGhhcyBtYWRlIGNoYW5nZXMgYW5kCisgICAgIHN1Z2dlc3Rpb25zIHRvIGltcHJvdmUgdGhlIGRyaXZlciBhbmQgZG9uZSBhIGxvdCBvZiB0ZXN0aW5nLgorCisgICAgIEtlbiBNb3J0IDxrZW5AbW9ydC5uZXQ+IHJlcG9ydGVkIGEgREVCVUcgY29tcGlsZSBidWcgZml4ZWQKKyAgICAgaW4gMy4ySy4KKworICAgICBUb20gUmluaSA8dHJpbmlAa2VybmVsLmNyYXNoaW5nLm9yZz4gcHJvdmlkZWQgdGhlIENPTkZJR19JU0EKKyAgICAgcGF0Y2ggYW5kIGhlbHBlZCB3aXRoIFBvd2VyUEMgd2lkZSBhbmQgbmFycm93IGJvYXJkIHN1cHBvcnQuCisKKyAgICAgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiBwcm92aWRlZCBhbgorICAgICBhZHZhbnN5c19pbnRlcnJ1cHRzX2VuYWJsZWQgcGF0Y2guCisKKyAgICAgRGF2ZSBKb25lcyA8ZGF2ZUBkZW5pYWwuZm9yY2U5LmNvLnVrPiByZXBvcnRlZCB0aGUgY29tcGlsZXIKKyAgICAgd2FybmluZ3MgZ2VuZXJhdGVkIHdoZW4gQ09ORklHX1BST0NfRlMgd2FzIG5vdCBkZWZpbmVkIGluCisgICAgIHRoZSAzLjJNIGRyaXZlci4KKworICAgICBKZXJyeSBRdWlubiA8amxxdWlubkB1cy5pYm0uY29tPiBmaXhlZCBQb3dlclBDIHN1cHBvcnQgKGVuZGlhbgorICAgICBwcm9ibGVtcykgZm9yIHdpZGUgY2FyZHMuCisKKyAgICAgQnJ5YW4gSGVuZGVyc29uIDxicnlhbmhAZ2lyYWZmZS1kYXRhLmNvbT4gaGVscGVkIGRlYnVnIG5hcnJvdworICAgICBjYXJkIGVycm9yIGhhbmRsaW5nLgorCisgICAgIE1hbnVlbCBWZWxvc28gPHZlbG9zb0Bwb2JveC5jb20+IHdvcmtlZCBoYXJkIG9uIFBvd2VyUEMgbmFycm93CisgICAgIGJvYXJkIHN1cHBvcnQgYW5kIGZpeGVkIGEgYnVnIGluIEFzY0dldEVFUENvbmZpZygpLgorCisgICAgIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiBtYWRlCisgICAgIHNhdmVfZmxhZ3MvcmVzdG9yZV9mbGFncyBjaGFuZ2VzLgorCisgICAgIEFuZHkgS2VsbG5lciA8QUtlbGxuZXJAY29ubmVjdGNvbS5uZXQ+IGNvbnRpbnVlcyB0aGUgQWR2YW5zeXMgU0NTSQorICAgICBkcml2ZXIgZGV2ZWxvcG1lbnQgZm9yIENvbm5lY3RDb20gKFZlcnNpb24gPiAzLjNGKS4KKworICBLLiBDb25uZWN0Q29tIChBZHZhblN5cykgQ29udGFjdCBJbmZvcm1hdGlvbgorCisgICAgIE1haWw6ICAgICAgICAgICAgICAgICAgIENvbm5lY3RDb20gU29sdXRpb25zLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTAgUmluZ3dvb2QgQ291cnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FuIEpvc2UsIENBIDk1MTMxCisgICAgIE9wZXJhdG9yL1NhbGVzOiAgICAgICAgIDEtNDA4LTM4My05NDAwCisgICAgIEZBWDogICAgICAgICAgICAgICAgICAgIDEtNDA4LTM4My05NjEyCisgICAgIFRlY2ggU3VwcG9ydDogICAgICAgICAgIDEtNDA4LTQ2Ny0yOTMwCisgICAgIFRlY2ggU3VwcG9ydCBFLU1haWw6ICAgIGxpbnV4QGNvbm5lY3Rjb20ubmV0CisgICAgIEZUUCBTaXRlOiAgICAgICAgICAgICAgIGZ0cC5jb25uZWN0Y29tLm5ldCAobG9naW46IGFub255bW91cykKKyAgICAgV2ViIFNpdGU6ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5jb25uZWN0Y29tLm5ldAorCisqLworCisvKgorICogLS0tIExpbnV4IEluY2x1ZGUgRmlsZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODYpICYmICFkZWZpbmVkKENPTkZJR19JU0EpCisjZGVmaW5lIENPTkZJR19JU0EKKyNlbmRpZiAvKiBDT05GSUdfWDg2ICYmICFDT05GSUdfSVNBICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworLyogRklYTUU6IChieSBqZWpiQHN0ZWVsZXllLmNvbSkgVGhpcyB3YXJuaW5nIGlzIHByZXNlbnQgZm9yIHR3bworICogcmVhc29uczoKKyAqCisgKiAxKSBUaGlzIGRyaXZlciBiYWRseSBuZWVkcyBjb252ZXJ0aW5nIHRvIHRoZSBjb3JyZWN0IGRyaXZlciBtb2RlbAorICogICAgcHJvYmluZyBBUEkKKyAqCisgKiAyKSBBbHRob3VnaCBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBjb21tYW5kIG1hcHBpbmcgcGxhY2VzIGhhdmUgdGhlCisgKiBhcHByb3ByaWF0ZSBkbWFfbWFwLi4gQVBJcywgdGhlIGRyaXZlciBzdGlsbCBwcm9jZXNzZXMgaXRzIGludGVybmFsCisgKiBxdWV1ZSB1c2luZyBidXNfdG9fdmlydCgpIGFuZCB2aXJ0X3RvX2J1cygpIHdoaWNoIGFyZSBpbGxlZ2FsIHVuZGVyCisgKiB0aGUgQVBJLiAgVGhlIGVudGlyZSBxdWV1ZSBwcm9jZXNzaW5nIHN0cnVjdHVyZSB3aWxsIG5lZWQgdG8gYmUKKyAqIGFsdGVyZWQgdG8gZml4IHRoaXMuCisgKi8KKyN3YXJuaW5nIHRoaXMgZHJpdmVyIGlzIHN0aWxsIG5vdCBwcm9wZXJseSBjb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkKKworI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFkdmFuc3lzLmgiCisjaWZkZWYgQ09ORklHX1BDSQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCisvKgorICogLS0tIERyaXZlciBPcHRpb25zCisgKi8KKworLyogRW5hYmxlIGRyaXZlciBhc3NlcnRpb25zLiAqLworI2RlZmluZSBBRFZBTlNZU19BU1NFUlQKKworLyogRW5hYmxlIGRyaXZlciAvcHJvYyBzdGF0aXN0aWNzLiAqLworI2RlZmluZSBBRFZBTlNZU19TVEFUUworCisvKiBFbmFibGUgZHJpdmVyIHRyYWNpbmcuICovCisvKiAjZGVmaW5lIEFEVkFOU1lTX0RFQlVHICovCisKKworLyoKKyAqIC0tLSBEZWJ1Z2dpbmcgSGVhZGVyCisgKi8KKworI2lmZGVmIEFEVkFOU1lTX0RFQlVHCisjZGVmaW5lIFNUQVRJQworI2Vsc2UgLyogQURWQU5TWVNfREVCVUcgKi8KKyNkZWZpbmUgU1RBVElDIHN0YXRpYworI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKworLyoKKyAqIC0tLSBBc2MgTGlicmFyeSBDb25zdGFudHMgYW5kIE1hY3JvcworICovCisKKyNkZWZpbmUgQVNDX0xJQl9WRVJTSU9OX01BSk9SICAxCisjZGVmaW5lIEFTQ19MSUJfVkVSU0lPTl9NSU5PUiAgMjQKKyNkZWZpbmUgQVNDX0xJQl9TRVJJQUxfTlVNQkVSICAxMjMKKworLyoKKyAqIFBvcnRhYmxlIERhdGEgVHlwZXMKKyAqCisgKiBBbnkgaW5zdGFuY2Ugd2hlcmUgYSAzMi1iaXQgbG9uZyBvciBwb2ludGVyIHR5cGUgaXMgYXNzdW1lZAorICogZm9yIHByZWNpc2lvbiBvciBIVyBkZWZpbmVkIHN0cnVjdHVyZXMsIHRoZSBmb2xsb3dpbmcgZGVmaW5lCisgKiB0eXBlcyBtdXN0IGJlIHVzZWQuIEluIExpbnV4IHRoZSBjaGFyLCBzaG9ydCwgYW5kIGludCB0eXBlcworICogYXJlIGFsbCBjb25zaXN0ZW50IGF0IDgsIDE2LCBhbmQgMzIgYml0cyByZXNwZWN0aXZlbHkuIFBvaW50ZXJzCisgKiBhbmQgbG9uZyB0eXBlcyBhcmUgNjQgYml0cyBvbiBBbHBoYSBhbmQgVWx0cmFTUEFSQy4KKyAqLworI2RlZmluZSBBU0NfUEFERFIgX191MzIgICAgICAgICAvKiBQaHlzaWNhbC9CdXMgYWRkcmVzcyBkYXRhIHR5cGUuICovCisjZGVmaW5lIEFTQ19WQUREUiBfX3UzMiAgICAgICAgIC8qIFZpcnR1YWwgYWRkcmVzcyBkYXRhIHR5cGUuICovCisjZGVmaW5lIEFTQ19EQ05UICBfX3UzMiAgICAgICAgIC8qIFVuc2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KKyNkZWZpbmUgQVNDX1NEQ05UIF9fczMyICAgICAgICAgLyogU2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBjb252ZXJ0IGEgdmlydHVhbCBhZGRyZXNzIHRvIGEKKyAqIDMyLWJpdCB2YWx1ZS4gVGhpcyBjdXJyZW50bHkgY2FuIGJlIHVzZWQgb24gTGludXggQWxwaGEKKyAqIHdoaWNoIHVzZXMgNjQtYml0IHZpcnR1YWwgYWRkcmVzcyBidXQgYSAzMi1iaXQgYnVzIGFkZHJlc3MuCisgKiBUaGlzIGlzIGxpa2VseSB0byBicmVhayBpbiB0aGUgZnV0dXJlLCBidXQgZG9pbmcgdGhpcyBub3cKKyAqIHdpbGwgZ2l2ZSB1cyB0aW1lIHRvIGNoYW5nZSB0aGUgSFcgYW5kIEZXIHRvIGhhbmRsZSA2NC1iaXQKKyAqIGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZSBBU0NfVkFERFJfVE9fVTMyICAgdmlydF90b19idXMKKyNkZWZpbmUgQVNDX1UzMl9UT19WQUREUiAgIGJ1c190b192aXJ0CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgICgxKQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgRU9GICAgICAgKC0xKQorI2RlZmluZSBFUlIgICAgICAoLTEpCisjZGVmaW5lIFVXX0VSUiAgICh1aW50KSgweEZGRkYpCisjZGVmaW5lIGlzb2RkX3dvcmQodmFsKSAgICgoKCh1aW50KXZhbCkgJiAodWludCkweDAwMDEpICE9IDApCisjZGVmaW5lIEFzY1BDSUNvbmZpZ1ZlbmRvcklEUmVnaXN0ZXIgICAgICAweDAwMDAKKyNkZWZpbmUgQXNjUENJQ29uZmlnRGV2aWNlSURSZWdpc3RlciAgICAgIDB4MDAwMgorI2RlZmluZSBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIgICAgICAgMHgwMDA0CisjZGVmaW5lIEFzY1BDSUNvbmZpZ1N0YXR1c1JlZ2lzdGVyICAgICAgICAweDAwMDYKKyNkZWZpbmUgQXNjUENJQ29uZmlnUmV2aXNpb25JRFJlZ2lzdGVyICAgIDB4MDAwOAorI2RlZmluZSBBc2NQQ0lDb25maWdDYWNoZVNpemUgICAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciAgICAgICAgICAweDAwMEQKKyNkZWZpbmUgQXNjUENJSU9CYXNlUmVnaXN0ZXIgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyICAgMHgwMDA3CisjZGVmaW5lIEFTQ19QQ0lfSUQyQlVTKGlkKSAgICAoKGlkKSAmIDB4RkYpCisjZGVmaW5lIEFTQ19QQ0lfSUQyREVWKGlkKSAgICAoKChpZCkgPj4gMTEpICYgMHgxRikKKyNkZWZpbmUgQVNDX1BDSV9JRDJGVU5DKGlkKSAgICgoKGlkKSA+PiA4KSAmIDB4NykKKyNkZWZpbmUgQVNDX1BDSV9NS0lEKGJ1cywgZGV2LCBmdW5jKSAoKCgoZGV2KSAmIDB4MUYpIDw8IDExKSB8ICgoKGZ1bmMpICYgMHg3KSA8PCA4KSB8ICgoYnVzKSAmIDB4RkYpKQorI2RlZmluZSBBU0NfUENJX1ZFTkRPUklEICAgICAgICAgICAgICAgICAgMHgxMENECisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFSURfMTIwMEEgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VJRF8xMjAwQiAgICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBBU0NfUENJX0RFVklDRUlEX1VMVFJBICAgICAgICAgICAgMHgxMzAwCisjZGVmaW5lIEFTQ19QQ0lfUkVWSVNJT05fMzE1MCAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFTQ19QQ0lfUkVWSVNJT05fMzA1MCAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgIEFTQ19EVkNMSUJfQ0FMTF9ET05FICAgICAoMSkKKyNkZWZpbmUgIEFTQ19EVkNMSUJfQ0FMTF9GQUlMRUQgICAoMCkKKyNkZWZpbmUgIEFTQ19EVkNMSUJfQ0FMTF9FUlJPUiAgICAoLTEpCisKKy8qCisgKiBFbmFibGUgQ0NfVkVSWV9MT05HX1NHX0xJU1QgdG8gc3VwcG9ydCB1cCB0byA2NEsgZWxlbWVudCBTRyBsaXN0cy4KKyAqIFRoZSBTUkIgc3RydWN0dXJlIHdpbGwgaGF2ZSB0byBiZSBjaGFuZ2VkIGFuZCB0aGUgQVNDX1NSQjJTQ1NJUSgpCisgKiBtYWNybyByZS1kZWZpbmVkIHRvIGJlIGFibGUgdG8gb2J0YWluIGEgQVNDX1NDU0lfUSBwb2ludGVyIGZyb20gdGhlCisgKiBTUkIgc3RydWN0dXJlLgorICovCisjZGVmaW5lIENDX1ZFUllfTE9OR19TR19MSVNUIDAKKyNkZWZpbmUgQVNDX1NSQjJTQ1NJUShzcmJfcHRyKSAgKHNyYl9wdHIpCisKKyNkZWZpbmUgUG9ydEFkZHIgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgIC8qIHBvcnQgYWRkcmVzcyBzaXplICAqLworI2RlZmluZSBpbnAocG9ydCkgICAgICAgICAgICAgICAgaW5iKHBvcnQpCisjZGVmaW5lIG91dHAocG9ydCwgYnl0ZSkgICAgICAgICBvdXRiKChieXRlKSwgKHBvcnQpKQorCisjZGVmaW5lIGlucHcocG9ydCkgICAgICAgICAgICAgICBpbncocG9ydCkKKyNkZWZpbmUgb3V0cHcocG9ydCwgd29yZCkgICAgICAgIG91dHcoKHdvcmQpLCAocG9ydCkpCisKKyNkZWZpbmUgQVNDX01BWF9TR19RVUVVRSAgICA3CisjZGVmaW5lIEFTQ19NQVhfU0dfTElTVCAgICAgMjU1CisKKyNkZWZpbmUgQVNDX0NTX1RZUEUgIHVuc2lnbmVkIHNob3J0CisKKyNkZWZpbmUgQVNDX0lTX0lTQSAgICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBBU0NfSVNfSVNBUE5QICAgICAgICgweDAwODEpCisjZGVmaW5lIEFTQ19JU19FSVNBICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgQVNDX0lTX1BDSSAgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBBU0NfSVNfUENJX1VMVFJBICAgICgweDAxMDQpCisjZGVmaW5lIEFTQ19JU19QQ01DSUEgICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgQVNDX0lTX01DQSAgICAgICAgICAoMHgwMDIwKQorI2RlZmluZSBBU0NfSVNfVkwgICAgICAgICAgICgweDAwNDApCisjZGVmaW5lIEFTQ19JU0FfUE5QX1BPUlRfQUREUiAgKDB4Mjc5KQorI2RlZmluZSBBU0NfSVNBX1BOUF9QT1JUX1dSSVRFIChBU0NfSVNBX1BOUF9QT1JUX0FERFIrMHg4MDApCisjZGVmaW5lIEFTQ19JU19XSURFU0NTSV8xNiAgKDB4MDEwMCkKKyNkZWZpbmUgQVNDX0lTX1dJREVTQ1NJXzMyICAoMHgwMjAwKQorI2RlZmluZSBBU0NfSVNfQklHX0VORElBTiAgICgweDgwMDApCisjZGVmaW5lIEFTQ19DSElQX01JTl9WRVJfVkwgICAgICAoMHgwMSkKKyNkZWZpbmUgQVNDX0NISVBfTUFYX1ZFUl9WTCAgICAgICgweDA3KQorI2RlZmluZSBBU0NfQ0hJUF9NSU5fVkVSX1BDSSAgICAgKDB4MDkpCisjZGVmaW5lIEFTQ19DSElQX01BWF9WRVJfUENJICAgICAoMHgwRikKKyNkZWZpbmUgQVNDX0NISVBfVkVSX1BDSV9CSVQgICAgICgweDA4KQorI2RlZmluZSBBU0NfQ0hJUF9NSU5fVkVSX0lTQSAgICAgKDB4MTEpCisjZGVmaW5lIEFTQ19DSElQX01JTl9WRVJfSVNBX1BOUCAoMHgyMSkKKyNkZWZpbmUgQVNDX0NISVBfTUFYX1ZFUl9JU0EgICAgICgweDI3KQorI2RlZmluZSBBU0NfQ0hJUF9WRVJfSVNBX0JJVCAgICAgKDB4MzApCisjZGVmaW5lIEFTQ19DSElQX1ZFUl9JU0FQTlBfQklUICAoMHgyMCkKKyNkZWZpbmUgQVNDX0NISVBfVkVSX0FTWU5fQlVHICAgICgweDIxKQorI2RlZmluZSBBU0NfQ0hJUF9WRVJfUENJICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVNDX0NISVBfVkVSX1BDSV9VTFRSQV8zMTUwICAoQVNDX0NISVBfVkVSX1BDSSB8IDB4MDIpCisjZGVmaW5lIEFTQ19DSElQX1ZFUl9QQ0lfVUxUUkFfMzA1MCAgKEFTQ19DSElQX1ZFUl9QQ0kgfCAweDAzKQorI2RlZmluZSBBU0NfQ0hJUF9NSU5fVkVSX0VJU0EgKDB4NDEpCisjZGVmaW5lIEFTQ19DSElQX01BWF9WRVJfRUlTQSAoMHg0NykKKyNkZWZpbmUgQVNDX0NISVBfVkVSX0VJU0FfQklUICgweDQwKQorI2RlZmluZSBBU0NfQ0hJUF9MQVRFU1RfVkVSX0VJU0EgICAoKEFTQ19DSElQX01JTl9WRVJfRUlTQSAtIDEpICsgMykKKyNkZWZpbmUgQVNDX01BWF9MSUJfU1VQUE9SVEVEX0lTQV9DSElQX1ZFUiAgIDB4MjEKKyNkZWZpbmUgQVNDX01BWF9MSUJfU1VQUE9SVEVEX1BDSV9DSElQX1ZFUiAgIDB4MEEKKyNkZWZpbmUgQVNDX01BWF9WTF9ETUFfQUREUiAgICAgKDB4MDdGRkZGRkZMKQorI2RlZmluZSBBU0NfTUFYX1ZMX0RNQV9DT1VOVCAgICAoMHgwN0ZGRkZGRkwpCisjZGVmaW5lIEFTQ19NQVhfUENJX0RNQV9BRERSICAgICgweEZGRkZGRkZGTCkKKyNkZWZpbmUgQVNDX01BWF9QQ0lfRE1BX0NPVU5UICAgKDB4RkZGRkZGRkZMKQorI2RlZmluZSBBU0NfTUFYX0lTQV9ETUFfQUREUiAgICAoMHgwMEZGRkZGRkwpCisjZGVmaW5lIEFTQ19NQVhfSVNBX0RNQV9DT1VOVCAgICgweDAwRkZGRkZGTCkKKyNkZWZpbmUgQVNDX01BWF9FSVNBX0RNQV9BRERSICAgKDB4MDdGRkZGRkZMKQorI2RlZmluZSBBU0NfTUFYX0VJU0FfRE1BX0NPVU5UICAoMHgwN0ZGRkZGRkwpCisKKyNkZWZpbmUgQVNDX1NDU0lfSURfQklUUyAgMworI2RlZmluZSBBU0NfU0NTSV9USVhfVFlQRSAgICAgdWNoYXIKKyNkZWZpbmUgQVNDX0FMTF9ERVZJQ0VfQklUX1NFVCAgMHhGRgorI2RlZmluZSBBU0NfU0NTSV9CSVRfSURfVFlQRSAgdWNoYXIKKyNkZWZpbmUgQVNDX01BWF9USUQgICAgICAgNworI2RlZmluZSBBU0NfTUFYX0xVTiAgICAgICA3CisjZGVmaW5lIEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQgIDB4RkYKKyNkZWZpbmUgQVNDX01BWF9TRU5TRV9MRU4gICAzMgorI2RlZmluZSBBU0NfTUlOX1NFTlNFX0xFTiAgIDE0CisjZGVmaW5lIEFTQ19NQVhfQ0RCX0xFTiAgICAgMTIKKyNkZWZpbmUgQVNDX1NDU0lfUkVTRVRfSE9MRF9USU1FX1VTICA2MAorCisjZGVmaW5lIEFEVl9JTlFfQ0xPQ0tJTkdfU1RfT05MWSAgICAweDAKKyNkZWZpbmUgQURWX0lOUV9DTE9DS0lOR19EVF9PTkxZICAgIDB4MQorI2RlZmluZSBBRFZfSU5RX0NMT0NLSU5HX1NUX0FORF9EVCAgMHgzCisKKy8qCisgKiBJbnF1aXJ5IFNQQy0yIFNQSSBCeXRlIDEgRVZQRCAoRW5hYmxlIFZpdGFsIFByb2R1Y3QgRGF0YSkKKyAqIGFuZCBDbWREdCAoQ29tbWFuZCBTdXBwb3J0IERhdGEpIGZpZWxkIGJpdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBBRFZfSU5RX1JUTl9WUERfQU5EX0NNRERUICAgICAgICAgICAweDMKKyNkZWZpbmUgQURWX0lOUV9SVE5fQ01ERFRfRk9SX09QX0NPREUgICAgICAgMHgyCisjZGVmaW5lIEFEVl9JTlFfUlROX1ZQRF9GT1JfUEdfQ09ERSAgICAgICAgIDB4MQorI2RlZmluZSBBRFZfSU5RX1JUTl9TVERfSU5RVUlSWV9EQVRBICAgICAgICAweDAKKworI2RlZmluZSBBU0NfU0NTSURJUl9OT0NISyAgICAweDAwCisjZGVmaW5lIEFTQ19TQ1NJRElSX1QySCAgICAgIDB4MDgKKyNkZWZpbmUgQVNDX1NDU0lESVJfSDJUICAgICAgMHgxMAorI2RlZmluZSBBU0NfU0NTSURJUl9OT0RBVEEgICAweDE4CisjZGVmaW5lIFNDU0lfQVNDX05PTUVESUEgICAgICAgICAgMHgzQQorI2RlZmluZSBBU0NfU1JCX0hPU1QoeCkgICgodWNoYXIpKCh1Y2hhcikoeCkgPj4gNCkpCisjZGVmaW5lIEFTQ19TUkJfVElEKHgpICAgKCh1Y2hhcikoKHVjaGFyKSh4KSAmICh1Y2hhcikweDBGKSkKKyNkZWZpbmUgQVNDX1NSQl9MVU4oeCkgICAoKHVjaGFyKSgodWludCkoeCkgPj4gMTMpKQorI2RlZmluZSBQVVRfQ0RCMSh4KSAgICgodWNoYXIpKCh1aW50KSh4KSA+PiA4KSkKKyNkZWZpbmUgTVNfQ01EX0RPTkUgICAgMHgwMAorI2RlZmluZSBNU19FWFRFTkQgICAgICAweDAxCisjZGVmaW5lIE1TX1NEVFJfTEVOICAgIDB4MDMKKyNkZWZpbmUgTVNfU0RUUl9DT0RFICAgMHgwMQorI2RlZmluZSBNU19XRFRSX0xFTiAgICAweDAyCisjZGVmaW5lIE1TX1dEVFJfQ09ERSAgIDB4MDMKKyNkZWZpbmUgTVNfTURQX0xFTiAgICAweDA1CisjZGVmaW5lIE1TX01EUF9DT0RFICAgMHgwMAorCisvKgorICogSW5xdWlyeSBkYXRhIHN0cnVjdHVyZSBhbmQgYml0ZmllbGQgbWFjcm9zCisgKgorICogT25seSBxdWFudGl0aWVzIG9mIG1vcmUgdGhhbiAxIGJpdCBhcmUgc2hpZnRlZCwgc2luY2UgdGhlIG90aGVycyBhcmUKKyAqIGp1c3QgdGVzdGVkIGZvciB0cnVlIG9yIGZhbHNlLiBDIGJpdGZpZWxkcyBhcmVuJ3QgcG9ydGFibGUgYmV0d2VlbiBiaWcKKyAqIGFuZCBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtcyBzbyB0aGV5IGFyZSBub3QgdXNlZC4KKyAqLworCisjZGVmaW5lIEFTQ19JTlFfRFZDX1RZUEUoaW5xKSAgICAgICAoKGlucSktPnBlcmlwaCAmIDB4MWYpCisjZGVmaW5lIEFTQ19JTlFfUVVBTElGSUVSKGlucSkgICAgICAoKChpbnEpLT5wZXJpcGggJiAweGUwKSA+PiA1KQorI2RlZmluZSBBU0NfSU5RX0RWQ19UWVBFX01PRChpbnEpICAgKChpbnEpLT5kZXZ0eXBlICYgMHg3ZikKKyNkZWZpbmUgQVNDX0lOUV9SRU1PVkFCTEUoaW5xKSAgICAgICgoaW5xKS0+ZGV2dHlwZSAmIDB4ODApCisjZGVmaW5lIEFTQ19JTlFfQU5TSV9WRVIoaW5xKSAgICAgICAoKGlucSktPnZlciAmIDB4MDcpCisjZGVmaW5lIEFTQ19JTlFfRUNNQV9WRVIoaW5xKSAgICAgICAoKChpbnEpLT52ZXIgJiAweDM4KSA+PiAzKQorI2RlZmluZSBBU0NfSU5RX0lTT19WRVIoaW5xKSAgICAgICAgKCgoaW5xKS0+dmVyICYgMHhjMCkgPj4gNikKKyNkZWZpbmUgQVNDX0lOUV9SRVNQT05TRV9GTVQoaW5xKSAgICgoaW5xKS0+Ynl0ZTMgJiAweDBmKQorI2RlZmluZSBBU0NfSU5RX1RFUk1fSU8oaW5xKSAgICAgICAgKChpbnEpLT5ieXRlMyAmIDB4NDApCisjZGVmaW5lIEFTQ19JTlFfQVNZTkNfTk9USUYoaW5xKSAgICAoKGlucSktPmJ5dGUzICYgMHg4MCkKKyNkZWZpbmUgQVNDX0lOUV9TT0ZUX1JFU0VUKGlucSkgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDAxKQorI2RlZmluZSBBU0NfSU5RX0NNRF9RVUVVRShpbnEpICAgICAgKChpbnEpLT5mbGFncyAmIDB4MDIpCisjZGVmaW5lIEFTQ19JTlFfTElOS19DTUQoaW5xKSAgICAgICAoKGlucSktPmZsYWdzICYgMHgwOCkKKyNkZWZpbmUgQVNDX0lOUV9TWU5DKGlucSkgICAgICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDEwKQorI2RlZmluZSBBU0NfSU5RX1dJREUxNihpbnEpICAgICAgICAgKChpbnEpLT5mbGFncyAmIDB4MjApCisjZGVmaW5lIEFTQ19JTlFfV0lERTMyKGlucSkgICAgICAgICAoKGlucSktPmZsYWdzICYgMHg0MCkKKyNkZWZpbmUgQVNDX0lOUV9SRUxfQUREUihpbnEpICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDgwKQorI2RlZmluZSBBU0NfSU5RX0lORk9fVU5JVChpbnEpICAgICAgKChpbnEpLT5pbmZvICYgMHgwMSkKKyNkZWZpbmUgQVNDX0lOUV9RVUlDS19BUkIoaW5xKSAgICAgICgoaW5xKS0+aW5mbyAmIDB4MDIpCisjZGVmaW5lIEFTQ19JTlFfQ0xPQ0tJTkcoaW5xKSAgICAgICAoKChpbnEpLT5pbmZvICYgMHgwYykgPj4gMikKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVjaGFyICAgICAgICAgICAgICAgcGVyaXBoOworICAgIHVjaGFyICAgICAgICAgICAgICAgZGV2dHlwZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHZlcjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGJ5dGUzOworICAgIHVjaGFyICAgICAgICAgICAgICAgYWRkX2xlbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHJlczE7CisgICAgdWNoYXIgICAgICAgICAgICAgICByZXMyOworICAgIHVjaGFyICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgdWNoYXIgICAgICAgICAgICAgICB2ZW5kb3JfaWRbOF07CisgICAgdWNoYXIgICAgICAgICAgICAgICBwcm9kdWN0X2lkWzE2XTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHByb2R1Y3RfcmV2X2xldmVsWzRdOworfSBBU0NfU0NTSV9JTlFVSVJZOworCisjZGVmaW5lIEFTQ19TR19MSVNUX1BFUl9RICAgNworI2RlZmluZSBRU19GUkVFICAgICAgICAweDAwCisjZGVmaW5lIFFTX1JFQURZICAgICAgIDB4MDEKKyNkZWZpbmUgUVNfRElTQzEgICAgICAgMHgwMgorI2RlZmluZSBRU19ESVNDMiAgICAgICAweDA0CisjZGVmaW5lIFFTX0JVU1kgICAgICAgIDB4MDgKKyNkZWZpbmUgUVNfQUJPUlRFRCAgICAgMHg0MAorI2RlZmluZSBRU19ET05FICAgICAgICAweDgwCisjZGVmaW5lIFFDX05PX0NBTExCQUNLICAgMHgwMQorI2RlZmluZSBRQ19TR19TV0FQX1FVRVVFIDB4MDIKKyNkZWZpbmUgUUNfU0dfSEVBRCAgICAgICAweDA0CisjZGVmaW5lIFFDX0RBVEFfSU4gICAgICAgMHgwOAorI2RlZmluZSBRQ19EQVRBX09VVCAgICAgIDB4MTAKKyNkZWZpbmUgUUNfVVJHRU5UICAgICAgICAweDIwCisjZGVmaW5lIFFDX01TR19PVVQgICAgICAgMHg0MAorI2RlZmluZSBRQ19SRVFfU0VOU0UgICAgIDB4ODAKKyNkZWZpbmUgUUNTR19TR19YRkVSX0xJU1QgIDB4MDIKKyNkZWZpbmUgUUNTR19TR19YRkVSX01PUkUgIDB4MDQKKyNkZWZpbmUgUUNTR19TR19YRkVSX0VORCAgIDB4MDgKKyNkZWZpbmUgUURfSU5fUFJPR1JFU1MgICAgICAgMHgwMAorI2RlZmluZSBRRF9OT19FUlJPUiAgICAgICAgICAweDAxCisjZGVmaW5lIFFEX0FCT1JURURfQllfSE9TVCAgIDB4MDIKKyNkZWZpbmUgUURfV0lUSF9FUlJPUiAgICAgICAgMHgwNAorI2RlZmluZSBRRF9JTlZBTElEX1JFUVVFU1QgICAweDgwCisjZGVmaW5lIFFEX0lOVkFMSURfSE9TVF9OVU0gIDB4ODEKKyNkZWZpbmUgUURfSU5WQUxJRF9ERVZJQ0UgICAgMHg4MgorI2RlZmluZSBRRF9FUlJfSU5URVJOQUwgICAgICAweEZGCisjZGVmaW5lIFFIU1RBX05PX0VSUk9SICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBRSFNUQV9NX1NFTF9USU1FT1VUICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUUhTVEFfTV9EQVRBX09WRVJfUlVOICAgICAgICAweDEyCisjZGVmaW5lIFFIU1RBX01fREFUQV9VTkRFUl9SVU4gICAgICAgMHgxMgorI2RlZmluZSBRSFNUQV9NX1VORVhQRUNURURfQlVTX0ZSRUUgIDB4MTMKKyNkZWZpbmUgUUhTVEFfTV9CQURfQlVTX1BIQVNFX1NFUSAgICAweDE0CisjZGVmaW5lIFFIU1RBX0RfUURPTkVfU0dfTElTVF9DT1JSVVBURUQgMHgyMQorI2RlZmluZSBRSFNUQV9EX0FTQ19EVkNfRVJST1JfQ09ERV9TRVQgIDB4MjIKKyNkZWZpbmUgUUhTVEFfRF9IT1NUX0FCT1JUX0ZBSUxFRCAgICAgICAweDIzCisjZGVmaW5lIFFIU1RBX0RfRVhFX1NDU0lfUV9GQUlMRUQgICAgICAgMHgyNAorI2RlZmluZSBRSFNUQV9EX0VYRV9TQ1NJX1FfQlVTWV9USU1FT1VUIDB4MjUKKyNkZWZpbmUgUUhTVEFfRF9BU1BJX05PX0JVRl9QT09MICAgICAgICAweDI2CisjZGVmaW5lIFFIU1RBX01fV1RNX1RJTUVPVVQgICAgICAgICAweDQxCisjZGVmaW5lIFFIU1RBX01fQkFEX0NNUExfU1RBVFVTX0lOICAweDQyCisjZGVmaW5lIFFIU1RBX01fTk9fQVVUT19SRVFfU0VOU0UgICAweDQzCisjZGVmaW5lIFFIU1RBX01fQVVUT19SRVFfU0VOU0VfRkFJTCAweDQ0CisjZGVmaW5lIFFIU1RBX01fVEFSR0VUX1NUQVRVU19CVVNZICAweDQ1CisjZGVmaW5lIFFIU1RBX01fQkFEX1RBR19DT0RFICAgICAgICAweDQ2CisjZGVmaW5lIFFIU1RBX01fQkFEX1FVRVVFX0ZVTExfT1JfQlVTWSAgMHg0NworI2RlZmluZSBRSFNUQV9NX0hVTkdfUkVRX1NDU0lfQlVTX1JFU0VUIDB4NDgKKyNkZWZpbmUgUUhTVEFfRF9MUkFNX0NNUF9FUlJPUiAgICAgICAgMHg4MQorI2RlZmluZSBRSFNUQV9NX01JQ1JPX0NPREVfRVJST1JfSEFMVCAweEExCisjZGVmaW5lIEFTQ19GTEFHX1NDU0lRX1JFUSAgICAgICAgMHgwMQorI2RlZmluZSBBU0NfRkxBR19CSU9TX1NDU0lRX1JFUSAgIDB4MDIKKyNkZWZpbmUgQVNDX0ZMQUdfQklPU19BU1lOQ19JTyAgICAweDA0CisjZGVmaW5lIEFTQ19GTEFHX1NSQl9MSU5FQVJfQUREUiAgMHgwOAorI2RlZmluZSBBU0NfRkxBR19XSU4xNiAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVNDX0ZMQUdfV0lOMzIgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFTQ19GTEFHX0lTQV9PVkVSXzE2TUIgICAgMHg0MAorI2RlZmluZSBBU0NfRkxBR19ET1NfVk1fQ0FMTEJBQ0sgIDB4ODAKKyNkZWZpbmUgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBU0NfVEFHX0ZMQUdfRElTQUJMRV9ESVNDT05ORUNUICAgICAgICAweDA0CisjZGVmaW5lIEFTQ19UQUdfRkxBR19ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVggIDB4MDgKKyNkZWZpbmUgQVNDX1RBR19GTEFHX0RJU0FCTEVfQ0hLX0NPTkRfSU5UX0hPU1QgMHg0MAorI2RlZmluZSBBU0NfU0NTSVFfQ1BZX0JFRyAgICAgICAgICAgICAgNAorI2RlZmluZSBBU0NfU0NTSVFfU0dIRF9DUFlfQkVHICAgICAgICAgMgorI2RlZmluZSBBU0NfU0NTSVFfQl9GV0QgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBU0NfU0NTSVFfQl9CV0QgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBU0NfU0NTSVFfQl9TVEFUVVMgICAgICAgICAgICAgMgorI2RlZmluZSBBU0NfU0NTSVFfQl9RTk8gICAgICAgICAgICAgICAgMworI2RlZmluZSBBU0NfU0NTSVFfQl9DTlRMICAgICAgICAgICAgICAgNAorI2RlZmluZSBBU0NfU0NTSVFfQl9TR19RVUVVRV9DTlQgICAgICAgNQorI2RlZmluZSBBU0NfU0NTSVFfRF9EQVRBX0FERFIgICAgICAgICAgOAorI2RlZmluZSBBU0NfU0NTSVFfRF9EQVRBX0NOVCAgICAgICAgICAxMgorI2RlZmluZSBBU0NfU0NTSVFfQl9TRU5TRV9MRU4gICAgICAgICAyMAorI2RlZmluZSBBU0NfU0NTSVFfRE9ORV9JTkZPX0JFRyAgICAgICAyMgorI2RlZmluZSBBU0NfU0NTSVFfRF9TUkJQVFIgICAgICAgICAgICAyMgorI2RlZmluZSBBU0NfU0NTSVFfQl9UQVJHRVRfSVggICAgICAgICAyNgorI2RlZmluZSBBU0NfU0NTSVFfQl9DREJfTEVOICAgICAgICAgICAyOAorI2RlZmluZSBBU0NfU0NTSVFfQl9UQUdfQ09ERSAgICAgICAgICAyOQorI2RlZmluZSBBU0NfU0NTSVFfV19WTV9JRCAgICAgICAgICAgICAzMAorI2RlZmluZSBBU0NfU0NTSVFfRE9ORV9TVEFUVVMgICAgICAgICAzMgorI2RlZmluZSBBU0NfU0NTSVFfSE9TVF9TVEFUVVMgICAgICAgICAzMworI2RlZmluZSBBU0NfU0NTSVFfU0NTSV9TVEFUVVMgICAgICAgICAzNAorI2RlZmluZSBBU0NfU0NTSVFfQ0RCX0JFRyAgICAgICAgICAgICAzNgorI2RlZmluZSBBU0NfU0NTSVFfRFdfUkVNQUlOX1hGRVJfQUREUiA1NgorI2RlZmluZSBBU0NfU0NTSVFfRFdfUkVNQUlOX1hGRVJfQ05UICA2MAorI2RlZmluZSBBU0NfU0NTSVFfQl9GSVJTVF9TR19XS19RUCAgICA0OAorI2RlZmluZSBBU0NfU0NTSVFfQl9TR19XS19RUCAgICAgICAgICA0OQorI2RlZmluZSBBU0NfU0NTSVFfQl9TR19XS19JWCAgICAgICAgICA1MAorI2RlZmluZSBBU0NfU0NTSVFfV19BTFRfREMxICAgICAgICAgICA1MgorI2RlZmluZSBBU0NfU0NTSVFfQl9MSVNUX0NOVCAgICAgICAgICA2CisjZGVmaW5lIEFTQ19TQ1NJUV9CX0NVUl9MSVNUX0NOVCAgICAgIDcKKyNkZWZpbmUgQVNDX1NHUV9CX1NHX0NOVEwgICAgICAgICAgICAgNAorI2RlZmluZSBBU0NfU0dRX0JfU0dfSEVBRF9RUCAgICAgICAgICA1CisjZGVmaW5lIEFTQ19TR1FfQl9TR19MSVNUX0NOVCAgICAgICAgIDYKKyNkZWZpbmUgQVNDX1NHUV9CX1NHX0NVUl9MSVNUX0NOVCAgICAgNworI2RlZmluZSBBU0NfU0dRX0xJU1RfQkVHICAgICAgICAgICAgICA4CisjZGVmaW5lIEFTQ19ERUZfU0NTSTFfUU5HICAgIDQKKyNkZWZpbmUgQVNDX01BWF9TQ1NJMV9RTkcgICAgNAorI2RlZmluZSBBU0NfREVGX1NDU0kyX1FORyAgICAxNgorI2RlZmluZSBBU0NfTUFYX1NDU0kyX1FORyAgICAzMgorI2RlZmluZSBBU0NfVEFHX0NPREVfTUFTSyAgICAweDIzCisjZGVmaW5lIEFTQ19TVE9QX1JFUV9SSVNDX1NUT1AgICAgICAweDAxCisjZGVmaW5lIEFTQ19TVE9QX0FDS19SSVNDX1NUT1AgICAgICAweDAzCisjZGVmaW5lIEFTQ19TVE9QX0NMRUFOX1VQX0JVU1lfUSAgICAweDEwCisjZGVmaW5lIEFTQ19TVE9QX0NMRUFOX1VQX0RJU0NfUSAgICAweDIwCisjZGVmaW5lIEFTQ19TVE9QX0hPU1RfUkVRX1JJU0NfSEFMVCAweDQwCisjZGVmaW5lIEFTQ19USURMVU5fVE9fSVgodGlkLCBsdW4pICAoQVNDX1NDU0lfVElYX1RZUEUpKCh0aWQpICsgKChsdW4pPDxBU0NfU0NTSV9JRF9CSVRTKSkKKyNkZWZpbmUgQVNDX1RJRF9UT19UQVJHRVRfSUQodGlkKSAgIChBU0NfU0NTSV9CSVRfSURfVFlQRSkoMHgwMSA8PCAodGlkKSkKKyNkZWZpbmUgQVNDX1RJWF9UT19UQVJHRVRfSUQodGl4KSAgICgweDAxIDw8ICgodGl4KSAmIEFTQ19NQVhfVElEKSkKKyNkZWZpbmUgQVNDX1RJWF9UT19USUQodGl4KSAgICAgICAgICgodGl4KSAmIEFTQ19NQVhfVElEKQorI2RlZmluZSBBU0NfVElEX1RPX1RJWCh0aWQpICAgICAgICAgKCh0aWQpICYgQVNDX01BWF9USUQpCisjZGVmaW5lIEFTQ19USVhfVE9fTFVOKHRpeCkgICAgICAgICAoKCh0aXgpID4+IEFTQ19TQ1NJX0lEX0JJVFMpICYgQVNDX01BWF9MVU4pCisjZGVmaW5lIEFTQ19RTk9fVE9fUUFERFIocV9ubykgICAgICAoKEFTQ19RQURSX0JFRykrKChpbnQpKHFfbm8pIDw8IDYpKQorCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2NzaXFfMSB7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBxX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgY250bDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX3F1ZXVlX2NudDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9pZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9sdW47CisgICAgQVNDX1BBRERSICAgICAgICAgICBkYXRhX2FkZHI7CisgICAgQVNDX0RDTlQgICAgICAgICAgICBkYXRhX2NudDsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIHNlbnNlX2FkZHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzZW5zZV9sZW47CisgICAgdWNoYXIgICAgICAgICAgICAgICBleHRyYV9ieXRlczsKK30gQVNDX1NDU0lRXzE7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpcV8yIHsKKyAgICBBU0NfVkFERFIgICAgICAgICAgIHNyYl9wdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICB0YXJnZXRfaXg7CisgICAgdWNoYXIgICAgICAgICAgICAgICBmbGFnOworICAgIHVjaGFyICAgICAgICAgICAgICAgY2RiX2xlbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhZ19jb2RlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgdm1faWQ7Cit9IEFTQ19TQ1NJUV8yOworCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2NzaXFfMyB7CisgICAgdWNoYXIgICAgICAgICAgICAgICBkb25lX3N0YXQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBob3N0X3N0YXQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX3N0YXQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX21zZzsKK30gQVNDX1NDU0lRXzM7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpcV80IHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNkYltBU0NfTUFYX0NEQl9MRU5dOworICAgIHVjaGFyICAgICAgICAgICAgICAgeV9maXJzdF9zZ19saXN0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgeV93b3JraW5nX3NnX3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgeV93b3JraW5nX3NnX2l4OworICAgIHVjaGFyICAgICAgICAgICAgICAgeV9yZXM7CisgICAgdXNob3J0ICAgICAgICAgICAgICB4X3JlcV9jb3VudDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHhfcmVjb25uZWN0X3J0bjsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIHhfc2F2ZWRfZGF0YV9hZGRyOworICAgIEFTQ19EQ05UICAgICAgICAgICAgeF9zYXZlZF9kYXRhX2NudDsKK30gQVNDX1NDU0lRXzQ7CisKK3R5cGVkZWYgc3RydWN0IGFzY19xX2RvbmVfaW5mbyB7CisgICAgQVNDX1NDU0lRXzIgICAgICAgICBkMjsKKyAgICBBU0NfU0NTSVFfMyAgICAgICAgIGQzOworICAgIHVjaGFyICAgICAgICAgICAgICAgcV9zdGF0dXM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBxX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgY250bDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNlbnNlX2xlbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgcmVzOworICAgIEFTQ19EQ05UICAgICAgICAgICAgcmVtYWluX2J5dGVzOworfSBBU0NfUURPTkVfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2xpc3QgeworICAgIEFTQ19QQUREUiAgICAgICAgICAgYWRkcjsKKyAgICBBU0NfRENOVCAgICAgICAgICAgIGJ5dGVzOworfSBBU0NfU0dfTElTVDsKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2hlYWQgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgcXVldWVfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfdG9fY29weTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHJlczsKKyAgICBBU0NfU0dfTElTVCAgICAgICAgIHNnX2xpc3RbQVNDX01BWF9TR19MSVNUXTsKK30gQVNDX1NHX0hFQUQ7CisKKyNkZWZpbmUgQVNDX01JTl9TR19MSVNUICAgMgorCit0eXBlZGVmIHN0cnVjdCBhc2NfbWluX3NnX2hlYWQgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgcXVldWVfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfdG9fY29weTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHJlczsKKyAgICBBU0NfU0dfTElTVCAgICAgICAgIHNnX2xpc3RbQVNDX01JTl9TR19MSVNUXTsKK30gQVNDX01JTl9TR19IRUFEOworCisjZGVmaW5lIFFDWF9TT1JUICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBRQ1hfQ09BTEVBU0UgICAgKDB4MDAwMikKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX3Njc2lfcSB7CisgICAgQVNDX1NDU0lRXzEgICAgICAgICBxMTsKKyAgICBBU0NfU0NTSVFfMiAgICAgICAgIHEyOworICAgIHVjaGFyICAgICAgICAgICAgICAgKmNkYnB0cjsKKyAgICBBU0NfU0dfSEVBRCAgICAgICAgICpzZ19oZWFkOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVtYWluX3NnX2VudHJ5X2NudDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIG5leHRfc2dfaW5kZXg7Cit9IEFTQ19TQ1NJX1E7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpX3JlcV9xIHsKKyAgICBBU0NfU0NTSVFfMSAgICAgICAgIHIxOworICAgIEFTQ19TQ1NJUV8yICAgICAgICAgcjI7CisgICAgdWNoYXIgICAgICAgICAgICAgICAqY2RicHRyOworICAgIEFTQ19TR19IRUFEICAgICAgICAgKnNnX2hlYWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICAqc2Vuc2VfcHRyOworICAgIEFTQ19TQ1NJUV8zICAgICAgICAgcjM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjZGJbQVNDX01BWF9DREJfTEVOXTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNlbnNlW0FTQ19NSU5fU0VOU0VfTEVOXTsKK30gQVNDX1NDU0lfUkVRX1E7CisKK3R5cGVkZWYgc3RydWN0IGFzY19zY3NpX2Jpb3NfcmVxX3EgeworICAgIEFTQ19TQ1NJUV8xICAgICAgICAgcjE7CisgICAgQVNDX1NDU0lRXzIgICAgICAgICByMjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgICpjZGJwdHI7CisgICAgQVNDX1NHX0hFQUQgICAgICAgICAqc2dfaGVhZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgICpzZW5zZV9wdHI7CisgICAgQVNDX1NDU0lRXzMgICAgICAgICByMzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNkYltBU0NfTUFYX0NEQl9MRU5dOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2Vuc2VbQVNDX01JTl9TRU5TRV9MRU5dOworfSBBU0NfU0NTSV9CSU9TX1JFUV9ROworCit0eXBlZGVmIHN0cnVjdCBhc2NfcmlzY19xIHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGZ3ZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGJ3ZDsKKyAgICBBU0NfU0NTSVFfMSAgICAgICAgIGkxOworICAgIEFTQ19TQ1NJUV8yICAgICAgICAgaTI7CisgICAgQVNDX1NDU0lRXzMgICAgICAgICBpMzsKKyAgICBBU0NfU0NTSVFfNCAgICAgICAgIGk0OworfSBBU0NfUklTQ19ROworCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2dfbGlzdF9xIHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNlcV9ubzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfbm87CisgICAgdWNoYXIgICAgICAgICAgICAgICBjbnRsOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfaGVhZF9xcDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX2xpc3RfY250OworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfY3VyX2xpc3RfY250OworfSBBU0NfU0dfTElTVF9ROworCit0eXBlZGVmIHN0cnVjdCBhc2NfcmlzY19zZ19saXN0X3EgeworICAgIHVjaGFyICAgICAgICAgICAgICAgZndkOworICAgIHVjaGFyICAgICAgICAgICAgICAgYndkOworICAgIEFTQ19TR19MSVNUX1EgICAgICAgc2c7CisgICAgQVNDX1NHX0xJU1QgICAgICAgICBzZ19saXN0WzddOworfSBBU0NfUklTQ19TR19MSVNUX1E7CisKKyNkZWZpbmUgQVNDX0VYRV9TQ1NJX0lPX01BWF9JRExFX0xPT1AgIDB4MTAwMDAwMFVMCisjZGVmaW5lIEFTQ19FWEVfU0NTSV9JT19NQVhfV0FJVF9MT09QICAxMDI0CisjZGVmaW5lIEFTQ1FfRVJSX05PX0VSUk9SICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVNDUV9FUlJfSU9fTk9UX0ZPVU5EICAgICAgICAgMQorI2RlZmluZSBBU0NRX0VSUl9MT0NBTF9NRU0gICAgICAgICAgICAyCisjZGVmaW5lIEFTQ1FfRVJSX0NIS1NVTSAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVNDUV9FUlJfU1RBUlRfQ0hJUCAgICAgICAgICAgNAorI2RlZmluZSBBU0NRX0VSUl9JTlRfVEFSR0VUX0lEICAgICAgICA1CisjZGVmaW5lIEFTQ1FfRVJSX0lOVF9MT0NBTF9NRU0gICAgICAgIDYKKyNkZWZpbmUgQVNDUV9FUlJfSEFMVF9SSVNDICAgICAgICAgICAgNworI2RlZmluZSBBU0NRX0VSUl9HRVRfQVNQSV9FTlRSWSAgICAgICA4CisjZGVmaW5lIEFTQ1FfRVJSX0NMT1NFX0FTUEkgICAgICAgICAgIDkKKyNkZWZpbmUgQVNDUV9FUlJfSE9TVF9JTlFVSVJZICAgICAgICAgMHgwQQorI2RlZmluZSBBU0NRX0VSUl9TQVZFRF9TUkJfQkFEICAgICAgICAweDBCCisjZGVmaW5lIEFTQ1FfRVJSX1FDTlRMX1NHX0xJU1QgICAgICAgIDB4MEMKKyNkZWZpbmUgQVNDUV9FUlJfUV9TVEFUVVMgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBBU0NRX0VSUl9XUl9TQ1NJUSAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEFTQ1FfRVJSX1BDX0FERFIgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgQVNDUV9FUlJfU1lOX09GRlNFVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBBU0NRX0VSUl9TWU5fWEZFUl9USU1FICAgICAgICAweDExCisjZGVmaW5lIEFTQ1FfRVJSX0xPQ0tfRE1BICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgQVNDUV9FUlJfVU5MT0NLX0RNQSAgICAgICAgICAgMHgxMworI2RlZmluZSBBU0NRX0VSUl9WRFNfQ0hLX0lOU1RBTEwgICAgICAweDE0CisjZGVmaW5lIEFTQ1FfRVJSX01JQ1JPX0NPREVfSEFMVCAgICAgIDB4MTUKKyNkZWZpbmUgQVNDUV9FUlJfU0VUX0xSQU1fQUREUiAgICAgICAgMHgxNgorI2RlZmluZSBBU0NRX0VSUl9DVVJfUU5HICAgICAgICAgICAgICAweDE3CisjZGVmaW5lIEFTQ1FfRVJSX1NHX1FfTElOS1MgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgQVNDUV9FUlJfU0NTSVFfUFRSICAgICAgICAgICAgMHgxOQorI2RlZmluZSBBU0NRX0VSUl9JU1JfUkVfRU5UUlkgICAgICAgICAweDFBCisjZGVmaW5lIEFTQ1FfRVJSX0NSSVRJQ0FMX1JFX0VOVFJZICAgIDB4MUIKKyNkZWZpbmUgQVNDUV9FUlJfSVNSX09OX0NSSVRJQ0FMICAgICAgMHgxQworI2RlZmluZSBBU0NRX0VSUl9TR19MSVNUX09ERF9BRERSRVNTICAweDFECisjZGVmaW5lIEFTQ1FfRVJSX1hGRVJfQUREUkVTU19UT09fQklHIDB4MUUKKyNkZWZpbmUgQVNDUV9FUlJfU0NTSVFfTlVMTF9QVFIgICAgICAgMHgxRgorI2RlZmluZSBBU0NRX0VSUl9TQ1NJUV9CQURfTkVYVF9QVFIgICAweDIwCisjZGVmaW5lIEFTQ1FfRVJSX0dFVF9OVU1fT0ZfRlJFRV9RICAgIDB4MjEKKyNkZWZpbmUgQVNDUV9FUlJfU0VORF9TQ1NJX1EgICAgICAgICAgMHgyMgorI2RlZmluZSBBU0NRX0VSUl9IT1NUX1JFUV9SSVNDX0hBTFQgICAweDIzCisjZGVmaW5lIEFTQ1FfRVJSX1JFU0VUX1NEVFIgICAgICAgICAgIDB4MjQKKworLyoKKyAqIFdhcm5pbmcgY29kZSB2YWx1ZXMgYXJlIHNldCBpbiBBU0NfRFZDX1ZBUiAgJ3dhcm5fY29kZScuCisgKi8KKyNkZWZpbmUgQVNDX1dBUk5fTk9fRVJST1IgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFTQ19XQVJOX0lPX1BPUlRfUk9UQVRFICAgICAgIDB4MDAwMQorI2RlZmluZSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNICAgICAgICAweDAwMDIKKyNkZWZpbmUgQVNDX1dBUk5fSVJRX01PRElGSUVEICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEFTQ19XQVJOX0FVVE9fQ09ORklHICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUICAgICAweDAwMTAKKyNkZWZpbmUgQVNDX1dBUk5fRUVQUk9NX1JFQ09WRVIgICAgICAgMHgwMDIwCisjZGVmaW5lIEFTQ19XQVJOX0NGR19NU1dfUkVDT1ZFUiAgICAgIDB4MDA0MAorI2RlZmluZSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRSAweDAwODAKKworLyoKKyAqIEVycm9yIGNvZGUgdmFsdWVzIGFyZSBzZXQgaW4gQVNDX0RWQ19WQVIgICdlcnJfY29kZScuCisgKi8KKyNkZWZpbmUgQVNDX0lFUlJfV1JJVEVfRUVQUk9NICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEFTQ19JRVJSX01DT0RFX0NIS1NVTSAgICAgICAgIDB4MDAwMgorI2RlZmluZSBBU0NfSUVSUl9TRVRfUENfQUREUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVNDX0lFUlJfU1RBUlRfU1RPUF9DSElQICAgICAgMHgwMDA4CisjZGVmaW5lIEFTQ19JRVJSX0lSUV9OTyAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBU0NfSUVSUl9TRVRfSVJRX05PICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgQVNDX0lFUlJfQ0hJUF9WRVJTSU9OICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEFTQ19JRVJSX1NFVF9TQ1NJX0lEICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBBU0NfSUVSUl9HRVRfUEhZX0FERFIgICAgICAgICAweDAxMDAKKyNkZWZpbmUgQVNDX0lFUlJfQkFEX1NJR05BVFVSRSAgICAgICAgMHgwMjAwCisjZGVmaW5lIEFTQ19JRVJSX05PX0JVU19UWVBFICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBU0NfSUVSUl9TQ0FNICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQVNDX0lFUlJfU0VUX1NEVFIgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEFTQ19JRVJSX1JXX0xSQU0gICAgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIEFTQ19ERUZfSVJRX05PICAxMAorI2RlZmluZSBBU0NfTUFYX0lSUV9OTyAgMTUKKyNkZWZpbmUgQVNDX01JTl9JUlFfTk8gIDEwCisjZGVmaW5lIEFTQ19NSU5fUkVNQUlOX1EgICAgICAgICgweDAyKQorI2RlZmluZSBBU0NfREVGX01BWF9UT1RBTF9RTkcgICAoMHhGMCkKKyNkZWZpbmUgQVNDX01JTl9UQUdfUV9QRVJfRFZDICAgKDB4MDQpCisjZGVmaW5lIEFTQ19ERUZfVEFHX1FfUEVSX0RWQyAgICgweDA0KQorI2RlZmluZSBBU0NfTUlOX0ZSRUVfUSAgICAgICAgQVNDX01JTl9SRU1BSU5fUQorI2RlZmluZSBBU0NfTUlOX1RPVEFMX1FORyAgICAgKChBU0NfTUFYX1NHX1FVRVVFKSsoQVNDX01JTl9GUkVFX1EpKQorI2RlZmluZSBBU0NfTUFYX1RPVEFMX1FORyAyNDAKKyNkZWZpbmUgQVNDX01BWF9QQ0lfVUxUUkFfSU5SQU1fVE9UQUxfUU5HIDE2CisjZGVmaW5lIEFTQ19NQVhfUENJX1VMVFJBX0lOUkFNX1RBR19RTkcgICA4CisjZGVmaW5lIEFTQ19NQVhfUENJX0lOUkFNX1RPVEFMX1FORyAgMjAKKyNkZWZpbmUgQVNDX01BWF9JTlJBTV9UQUdfUU5HICAgMTYKKyNkZWZpbmUgQVNDX0lPQURSX1RBQkxFX01BWF9JWCAgMTEKKyNkZWZpbmUgQVNDX0lPQURSX0dBUCAgIDB4MTAKKyNkZWZpbmUgQVNDX1NFQVJDSF9JT1BfR0FQIDB4MTAKKyNkZWZpbmUgQVNDX01JTl9JT1BfQUREUiAgIChQb3J0QWRkcikweDAxMDAKKyNkZWZpbmUgQVNDX01BWF9JT1BfQUREUiAgIChQb3J0QWRkcikweDNGMAorI2RlZmluZSBBU0NfSU9BRFJfMSAgICAgKFBvcnRBZGRyKTB4MDExMAorI2RlZmluZSBBU0NfSU9BRFJfMiAgICAgKFBvcnRBZGRyKTB4MDEzMAorI2RlZmluZSBBU0NfSU9BRFJfMyAgICAgKFBvcnRBZGRyKTB4MDE1MAorI2RlZmluZSBBU0NfSU9BRFJfNCAgICAgKFBvcnRBZGRyKTB4MDE5MAorI2RlZmluZSBBU0NfSU9BRFJfNSAgICAgKFBvcnRBZGRyKTB4MDIxMAorI2RlZmluZSBBU0NfSU9BRFJfNiAgICAgKFBvcnRBZGRyKTB4MDIzMAorI2RlZmluZSBBU0NfSU9BRFJfNyAgICAgKFBvcnRBZGRyKTB4MDI1MAorI2RlZmluZSBBU0NfSU9BRFJfOCAgICAgKFBvcnRBZGRyKTB4MDMzMAorI2RlZmluZSBBU0NfSU9BRFJfREVGICAgQVNDX0lPQURSXzgKKyNkZWZpbmUgQVNDX0xJQl9TQ1NJUV9XS19TUCAgICAgICAgMjU2CisjZGVmaW5lIEFTQ19NQVhfU1lOX1hGRVJfTk8gICAgICAgIDE2CisjZGVmaW5lIEFTQ19TWU5fTUFYX09GRlNFVCAgICAgICAgIDB4MEYKKyNkZWZpbmUgQVNDX0RFRl9TRFRSX09GRlNFVCAgICAgICAgMHgwRgorI2RlZmluZSBBU0NfREVGX1NEVFJfSU5ERVggICAgICAgICAweDAwCisjZGVmaW5lIEFTQ19TRFRSX1VMVFJBX1BDSV8xME1CX0lOREVYICAweDAyCisjZGVmaW5lIFNZTl9YRkVSX05TXzAgIDI1CisjZGVmaW5lIFNZTl9YRkVSX05TXzEgIDMwCisjZGVmaW5lIFNZTl9YRkVSX05TXzIgIDM1CisjZGVmaW5lIFNZTl9YRkVSX05TXzMgIDQwCisjZGVmaW5lIFNZTl9YRkVSX05TXzQgIDUwCisjZGVmaW5lIFNZTl9YRkVSX05TXzUgIDYwCisjZGVmaW5lIFNZTl9YRkVSX05TXzYgIDcwCisjZGVmaW5lIFNZTl9YRkVSX05TXzcgIDg1CisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzAgICAgMTIKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfMSAgICAxOQorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU18yICAgIDI1CisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzMgICAgMzIKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfNCAgICAzOAorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU181ICAgIDQ0CisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzYgICAgNTAKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfNyAgICA1NworI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU184ICAgIDYzCisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzkgICAgNjkKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfMTAgICA3NQorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU18xMSAgIDgyCisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzEyICAgODgKKyNkZWZpbmUgU1lOX1VMVFJBX1hGRVJfTlNfMTMgICA5NAorI2RlZmluZSBTWU5fVUxUUkFfWEZFUl9OU18xNCAgMTAwCisjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzE1ICAxMDcKKwordHlwZWRlZiBzdHJ1Y3QgZXh0X21zZyB7CisgICAgdWNoYXIgICAgICAgICAgICAgICBtc2dfdHlwZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIG1zZ19sZW47CisgICAgdWNoYXIgICAgICAgICAgICAgICBtc2dfcmVxOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl94ZmVyX3BlcmlvZDsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9yZXFfYWNrX29mZnNldDsKKyAgICAgICAgfSBzZHRyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWNoYXIgICAgICAgICAgICAgICB3ZHRyX3dpZHRoOworICAgICAgICB9IHdkdHI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1Y2hhciAgICAgICAgICAgICAgIG1kcF9iMzsKKyAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgbWRwX2IyOworICAgICAgICAgICAgdWNoYXIgICAgICAgICAgICAgICBtZHBfYjE7CisgICAgICAgICAgICB1Y2hhciAgICAgICAgICAgICAgIG1kcF9iMDsKKyAgICAgICAgfSBtZHA7CisgICAgfSB1X2V4dF9tc2c7CisgICAgdWNoYXIgICAgICAgICAgICAgICByZXM7Cit9IEVYVF9NU0c7CisKKyNkZWZpbmUgeGZlcl9wZXJpb2QgICAgIHVfZXh0X21zZy5zZHRyLnNkdHJfeGZlcl9wZXJpb2QKKyNkZWZpbmUgcmVxX2Fja19vZmZzZXQgIHVfZXh0X21zZy5zZHRyLnNkdHJfcmVxX2Fja19vZmZzZXQKKyNkZWZpbmUgd2R0cl93aWR0aCAgICAgIHVfZXh0X21zZy53ZHRyLndkdHJfd2lkdGgKKyNkZWZpbmUgbWRwX2IzICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjMKKyNkZWZpbmUgbWRwX2IyICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjIKKyNkZWZpbmUgbWRwX2IxICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjEKKyNkZWZpbmUgbWRwX2IwICAgICAgICAgIHVfZXh0X21zZy5tZHBfYjAKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX2R2Y19jZmcgeworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIGNhbl90YWdnZWRfcW5nOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIGNtZF9xbmdfZW5hYmxlZDsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBkaXNjX2VuYWJsZTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzZHRyX2VuYWJsZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGlzYV9kbWFfc3BlZWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBpc2FfZG1hX2NoYW5uZWw7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjaGlwX3ZlcnNpb247CisgICAgdXNob3J0ICAgICAgICAgICAgICBsaWJfc2VyaWFsX25vOworICAgIHVzaG9ydCAgICAgICAgICAgICAgbGliX3ZlcnNpb247CisgICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV9kYXRlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgbWNvZGVfdmVyc2lvbjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIG1heF90YWdfcW5nW0FTQ19NQVhfVElEICsgMV07CisgICAgdWNoYXIgICAgICAgICAgICAgICAqb3ZlcnJ1bl9idWY7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzZHRyX3BlcmlvZF9vZmZzZXRbQVNDX01BWF9USUQgKyAxXTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHBjaV9zbG90X2luZm87CisgICAgdWNoYXIgICAgICAgICAgICAgICBhZGFwdGVyX2luZm9bNl07CisgICAgc3RydWN0IGRldmljZQkqZGV2OworfSBBU0NfRFZDX0NGRzsKKworI2RlZmluZSBBU0NfREVGX0RWQ19DTlRMICAgICAgIDB4RkZGRgorI2RlZmluZSBBU0NfREVGX0NISVBfU0NTSV9JRCAgIDcKKyNkZWZpbmUgQVNDX0RFRl9JU0FfRE1BX1NQRUVEICA0CisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX05VTEwgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19HRVRfQ0ZHICAgMHgwMDAxCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9HRVRfQ0ZHICAgMHgwMDAyCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19TRVRfQ0ZHICAgMHgwMDA0CisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9TRVRfQ0ZHICAgMHgwMDA4CisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19MT0FEX01DICAgMHgwMDEwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9MT0FEX01DICAgMHgwMDIwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0JFR19JTlFVSVJZICAgMHgwMDQwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX0VORF9JTlFVSVJZICAgMHgwMDgwCisjZGVmaW5lIEFTQ19JTklUX1JFU0VUX1NDU0lfRE9ORSAgICAgMHgwMTAwCisjZGVmaW5lIEFTQ19JTklUX1NUQVRFX1dJVEhPVVRfRUVQICAgMHg4MDAwCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEX1JFVl9BICAgICAgMHgxMTAwCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEX1JFVl9CICAgICAgMHgxMjAwCisjZGVmaW5lIEFTQ19CVUdfRklYX0lGX05PVF9EV0IgICAgICAgMHgwMDAxCisjZGVmaW5lIEFTQ19CVUdfRklYX0FTWU5fVVNFX1NZTiAgICAgMHgwMDAyCisjZGVmaW5lIEFTWU5fU0RUUl9EQVRBX0ZJWF9QQ0lfUkVWX0FCIDB4NDEKKyNkZWZpbmUgQVNDX01JTl9UQUdHRURfQ01EICA3CisjZGVmaW5lIEFTQ19NQVhfU0NTSV9SRVNFVF9XQUlUICAgICAgMzAKKworc3RydWN0IGFzY19kdmNfdmFyOyAgICAgLyogRm9yd2FyZCBEZWNsYXJhdGlvbi4gKi8KKwordHlwZWRlZiB2b2lkICgqIEFTQ19JU1JfQ0FMTEJBQ0spKHN0cnVjdCBhc2NfZHZjX3ZhciAqLCBBU0NfUURPTkVfSU5GTyAqKTsKK3R5cGVkZWYgaW50ICgqIEFTQ19FWEVfQ0FMTEJBQ0spKHN0cnVjdCBhc2NfZHZjX3ZhciAqLCBBU0NfU0NTSV9RICopOworCit0eXBlZGVmIHN0cnVjdCBhc2NfZHZjX3ZhciB7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGVycl9jb2RlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgZHZjX2NudGw7CisgICAgdXNob3J0ICAgICAgICAgICAgICBidWdfZml4X2NudGw7CisgICAgdXNob3J0ICAgICAgICAgICAgICBidXNfdHlwZTsKKyAgICBBU0NfSVNSX0NBTExCQUNLICAgIGlzcl9jYWxsYmFjazsKKyAgICBBU0NfRVhFX0NBTExCQUNLICAgIGV4ZV9jYWxsYmFjazsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBpbml0X3NkdHI7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgc2R0cl9kb25lOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHVzZV90YWdnZWRfcW5nOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHVuaXRfbm90X3JlYWR5OworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHF1ZXVlX2Z1bGxfb3JfYnVzeTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzdGFydF9tb3RvcjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNjc2lfcmVzZXRfd2FpdDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfbm87CisgICAgY2hhciAgICAgICAgICAgICAgICBpc19pbl9pbnQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfdG90YWxfcW5nOworICAgIHVjaGFyICAgICAgICAgICAgICAgY3VyX3RvdGFsX3FuZzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGluX2NyaXRpY2FsX2NudDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGlycV9ubzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGxhc3RfcV9zaG9ydGFnZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGluaXRfc3RhdGU7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjdXJfZHZjX3FuZ1tBU0NfTUFYX1RJRCArIDFdOworICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X2R2Y19xbmdbQVNDX01BWF9USUQgKyAxXTsKKyAgICBBU0NfU0NTSV9RICAqc2NzaXFfYnVzeV9oZWFkW0FTQ19NQVhfVElEICsgMV07CisgICAgQVNDX1NDU0lfUSAgKnNjc2lxX2J1c3lfdGFpbFtBU0NfTUFYX1RJRCArIDFdOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9wZXJpb2RfdGJsW0FTQ19NQVhfU1lOX1hGRVJfTk9dOworICAgIEFTQ19EVkNfQ0ZHICpjZmc7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgcGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzOworICAgIGNoYXIgICAgICAgICAgICAgICAgcmVkb19zY2FtOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVzMjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGRvc19pbnQxM190YWJsZVtBU0NfTUFYX1RJRCArIDFdOworICAgIEFTQ19EQ05UICAgICAgICAgICAgbWF4X2RtYV9jb3VudDsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBub19zY2FtOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHBjaV9maXhfYXN5bl94ZmVyOworICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X3NkdHJfaW5kZXg7CisgICAgdWNoYXIgICAgICAgICAgICAgICBob3N0X2luaXRfc2R0cl9pbmRleDsKKyAgICBzdHJ1Y3QgYXNjX2JvYXJkICAgICpkcnZfcHRyOworICAgIEFTQ19EQ05UICAgICAgICAgICAgdWNfYnJlYWs7Cit9IEFTQ19EVkNfVkFSOworCit0eXBlZGVmIHN0cnVjdCBhc2NfZHZjX2lucV9pbmZvIHsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHR5cGVbQVNDX01BWF9USUQgKyAxXVtBU0NfTUFYX0xVTiArIDFdOworfSBBU0NfRFZDX0lOUV9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBhc2NfY2FwX2luZm8geworICAgIEFTQ19EQ05UICAgICAgICAgICAgbGJhOworICAgIEFTQ19EQ05UICAgICAgICAgICAgYmxrX3NpemU7Cit9IEFTQ19DQVBfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgYXNjX2NhcF9pbmZvX2FycmF5IHsKKyAgICBBU0NfQ0FQX0lORk8gICAgICAgIGNhcF9pbmZvW0FTQ19NQVhfVElEICsgMV1bQVNDX01BWF9MVU4gKyAxXTsKK30gQVNDX0NBUF9JTkZPX0FSUkFZOworCisjZGVmaW5lIEFTQ19NQ05UTF9OT19TRUxfVElNRU9VVCAgKHVzaG9ydCkweDAwMDEKKyNkZWZpbmUgQVNDX01DTlRMX05VTExfVEFSR0VUICAgICAodXNob3J0KTB4MDAwMgorI2RlZmluZSBBU0NfQ05UTF9JTklUSUFUT1IgICAgICAgICAodXNob3J0KTB4MDAwMQorI2RlZmluZSBBU0NfQ05UTF9CSU9TX0dUXzFHQiAgICAgICAodXNob3J0KTB4MDAwMgorI2RlZmluZSBBU0NfQ05UTF9CSU9TX0dUXzJfRElTSyAgICAodXNob3J0KTB4MDAwNAorI2RlZmluZSBBU0NfQ05UTF9CSU9TX1JFTU9WQUJMRSAgICAodXNob3J0KTB4MDAwOAorI2RlZmluZSBBU0NfQ05UTF9OT19TQ0FNICAgICAgICAgICAodXNob3J0KTB4MDAxMAorI2RlZmluZSBBU0NfQ05UTF9JTlRfTVVMVElfUSAgICAgICAodXNob3J0KTB4MDA4MAorI2RlZmluZSBBU0NfQ05UTF9OT19MVU5fU1VQUE9SVCAgICAodXNob3J0KTB4MDA0MAorI2RlZmluZSBBU0NfQ05UTF9OT19WRVJJRllfQ09QWSAgICAodXNob3J0KTB4MDEwMAorI2RlZmluZSBBU0NfQ05UTF9SRVNFVF9TQ1NJICAgICAgICAodXNob3J0KTB4MDIwMAorI2RlZmluZSBBU0NfQ05UTF9JTklUX0lOUVVJUlkgICAgICAodXNob3J0KTB4MDQwMAorI2RlZmluZSBBU0NfQ05UTF9JTklUX1ZFUkJPU0UgICAgICAodXNob3J0KTB4MDgwMAorI2RlZmluZSBBU0NfQ05UTF9TQ1NJX1BBUklUWSAgICAgICAodXNob3J0KTB4MTAwMAorI2RlZmluZSBBU0NfQ05UTF9CVVJTVF9NT0RFICAgICAgICAodXNob3J0KTB4MjAwMAorI2RlZmluZSBBU0NfQ05UTF9TRFRSX0VOQUJMRV9VTFRSQSAodXNob3J0KTB4NDAwMAorI2RlZmluZSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMICAgIDIKKyNkZWZpbmUgQVNDX0VFUF9NQVhfRFZDX0FERFJfVkwgICAxNQorI2RlZmluZSBBU0NfRUVQX0RWQ19DRkdfQkVHICAgICAgMzIKKyNkZWZpbmUgQVNDX0VFUF9NQVhfRFZDX0FERFIgICAgIDQ1CisjZGVmaW5lIEFTQ19FRVBfREVGSU5FRF9XT1JEUyAgICAxMAorI2RlZmluZSBBU0NfRUVQX01BWF9BRERSICAgICAgICAgNjMKKyNkZWZpbmUgQVNDX0VFUF9SRVNfV09SRFMgICAgICAgICAwCisjZGVmaW5lIEFTQ19FRVBfTUFYX1JFVFJZICAgICAgICAyMAorI2RlZmluZSBBU0NfTUFYX0lOSVRfQlVTWV9SRVRSWSAgIDgKKyNkZWZpbmUgQVNDX0VFUF9JU0FfUE5QX1dTSVpFICAgIDE2CisKKy8qCisgKiBUaGVzZSBtYWNyb3Mga2VlcCB0aGUgY2hpcCBTQ1NJIGlkIGFuZCBJU0EgRE1BIHNwZWVkCisgKiBiaXRmaWVsZHMgaW4gYm9hcmQgb3JkZXIuIEMgYml0ZmllbGRzIGFyZW4ndCBwb3J0YWJsZQorICogYmV0d2VlbiBiaWcgYW5kIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm1zIHNvIHRoZXkgYXJlCisgKiBub3QgdXNlZC4KKyAqLworCisjZGVmaW5lIEFTQ19FRVBfR0VUX0NISVBfSUQoY2ZnKSAgICAoKGNmZyktPmlkX3NwZWVkICYgMHgwZikKKyNkZWZpbmUgQVNDX0VFUF9HRVRfRE1BX1NQRChjZmcpICAgICgoKGNmZyktPmlkX3NwZWVkICYgMHhmMCkgPj4gNCkKKyNkZWZpbmUgQVNDX0VFUF9TRVRfQ0hJUF9JRChjZmcsIHNpZCkgXAorICAgKChjZmcpLT5pZF9zcGVlZCA9ICgoY2ZnKS0+aWRfc3BlZWQgJiAweGYwKSB8ICgoc2lkKSAmIEFTQ19NQVhfVElEKSkKKyNkZWZpbmUgQVNDX0VFUF9TRVRfRE1BX1NQRChjZmcsIHNwZCkgXAorICAgKChjZmcpLT5pZF9zcGVlZCA9ICgoY2ZnKS0+aWRfc3BlZWQgJiAweDBmKSB8ICgoc3BkKSAmIDB4MGYpIDw8IDQpCisKK3R5cGVkZWYgc3RydWN0IGFzY2VlcF9jb25maWcgeworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnX2xzdzsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19tc3c7CisgICAgdWNoYXIgICAgICAgICAgICAgICBpbml0X3NkdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBkaXNjX2VuYWJsZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHVzZV9jbWRfcW5nOworICAgIHVjaGFyICAgICAgICAgICAgICAgc3RhcnRfbW90b3I7CisgICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfdG90YWxfcW5nOworICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X3RhZ19xbmc7CisgICAgdWNoYXIgICAgICAgICAgICAgICBiaW9zX3NjYW47CisgICAgdWNoYXIgICAgICAgICAgICAgICBwb3dlcl91cF93YWl0OworICAgIHVjaGFyICAgICAgICAgICAgICAgbm9fc2NhbTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGlkX3NwZWVkOyAvKiBsb3cgb3JkZXIgNCBiaXRzIGlzIGNoaXAgc2NzaSBpZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpZ2ggb3JkZXIgNCBiaXRzIGlzIGlzYSBkbWEgc3BlZWQgKi8KKyAgICB1Y2hhciAgICAgICAgICAgICAgIGRvc19pbnQxM190YWJsZVtBU0NfTUFYX1RJRCArIDFdOworICAgIHVjaGFyICAgICAgICAgICAgICAgYWRhcHRlcl9pbmZvWzZdOworICAgIHVzaG9ydCAgICAgICAgICAgICAgY250bDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNoa3N1bTsKK30gQVNDRUVQX0NPTkZJRzsKKworI2RlZmluZSBBU0NfUENJX0NGR19MU1dfU0NTSV9QQVJJVFkgIDB4MDgwMAorI2RlZmluZSBBU0NfUENJX0NGR19MU1dfQlVSU1RfTU9ERSAgIDB4MDA4MAorI2RlZmluZSBBU0NfUENJX0NGR19MU1dfSU5UUl9BQkxFICAgIDB4MDAyMAorCisjZGVmaW5lIEFTQ19FRVBfQ01EX1JFQUQgICAgICAgICAgMHg4MAorI2RlZmluZSBBU0NfRUVQX0NNRF9XUklURSAgICAgICAgIDB4NDAKKyNkZWZpbmUgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSAgICAweDMwCisjZGVmaW5lIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUgMHgwMAorI2RlZmluZSBBU0NfT1ZFUlJVTl9CU0laRSAgMHgwMDAwMDA0OFVMCisjZGVmaW5lIEFTQ19DVFJMX0JSRUFLX09OQ0UgICAgICAgIDB4MDAwMQorI2RlZmluZSBBU0NfQ1RSTF9CUkVBS19TVEFZX0lETEUgICAweDAwMDIKKyNkZWZpbmUgQVNDVl9NU0dPVVRfQkVHICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFTQ1ZfTVNHT1VUX1NEVFJfUEVSSU9EIChBU0NWX01TR09VVF9CRUcrMykKKyNkZWZpbmUgQVNDVl9NU0dPVVRfU0RUUl9PRkZTRVQgKEFTQ1ZfTVNHT1VUX0JFRys0KQorI2RlZmluZSBBU0NWX0JSRUFLX1NBVkVEX0NPREUgICAodXNob3J0KTB4MDAwNgorI2RlZmluZSBBU0NWX01TR0lOX0JFRyAgICAgICAgICAoQVNDVl9NU0dPVVRfQkVHKzgpCisjZGVmaW5lIEFTQ1ZfTVNHSU5fU0RUUl9QRVJJT0QgIChBU0NWX01TR0lOX0JFRyszKQorI2RlZmluZSBBU0NWX01TR0lOX1NEVFJfT0ZGU0VUICAoQVNDVl9NU0dJTl9CRUcrNCkKKyNkZWZpbmUgQVNDVl9TRFRSX0RBVEFfQkVHICAgICAgKEFTQ1ZfTVNHSU5fQkVHKzgpCisjZGVmaW5lIEFTQ1ZfU0RUUl9ET05FX0JFRyAgICAgIChBU0NWX1NEVFJfREFUQV9CRUcrOCkKKyNkZWZpbmUgQVNDVl9NQVhfRFZDX1FOR19CRUcgICAgKHVzaG9ydCkweDAwMjAKKyNkZWZpbmUgQVNDVl9CUkVBS19BRERSICAgICAgICAgICAodXNob3J0KTB4MDAyOAorI2RlZmluZSBBU0NWX0JSRUFLX05PVElGWV9DT1VOVCAgICh1c2hvcnQpMHgwMDJBCisjZGVmaW5lIEFTQ1ZfQlJFQUtfQ09OVFJPTCAgICAgICAgKHVzaG9ydCkweDAwMkMKKyNkZWZpbmUgQVNDVl9CUkVBS19ISVRfQ09VTlQgICAgICAodXNob3J0KTB4MDAyRQorCisjZGVmaW5lIEFTQ1ZfQVNDRFZDX0VSUl9DT0RFX1cgICh1c2hvcnQpMHgwMDMwCisjZGVmaW5lIEFTQ1ZfTUNPREVfQ0hLU1VNX1cgICAodXNob3J0KTB4MDAzMgorI2RlZmluZSBBU0NWX01DT0RFX1NJWkVfVyAgICAgKHVzaG9ydCkweDAwMzQKKyNkZWZpbmUgQVNDVl9TVE9QX0NPREVfQiAgICAgICh1c2hvcnQpMHgwMDM2CisjZGVmaW5lIEFTQ1ZfRFZDX0VSUl9DT0RFX0IgICAodXNob3J0KTB4MDAzNworI2RlZmluZSBBU0NWX09WRVJSVU5fUEFERFJfRCAgKHVzaG9ydCkweDAwMzgKKyNkZWZpbmUgQVNDVl9PVkVSUlVOX0JTSVpFX0QgICh1c2hvcnQpMHgwMDNDCisjZGVmaW5lIEFTQ1ZfSEFMVENPREVfVyAgICAgICAodXNob3J0KTB4MDA0MAorI2RlZmluZSBBU0NWX0NIS1NVTV9XICAgICAgICAgKHVzaG9ydCkweDAwNDIKKyNkZWZpbmUgQVNDVl9NQ19EQVRFX1cgICAgICAgICh1c2hvcnQpMHgwMDQ0CisjZGVmaW5lIEFTQ1ZfTUNfVkVSX1cgICAgICAgICAodXNob3J0KTB4MDA0NgorI2RlZmluZSBBU0NWX05FWFRSRFlfQiAgICAgICAgKHVzaG9ydCkweDAwNDgKKyNkZWZpbmUgQVNDVl9ET05FTkVYVF9CICAgICAgICh1c2hvcnQpMHgwMDQ5CisjZGVmaW5lIEFTQ1ZfVVNFX1RBR0dFRF9RTkdfQiAodXNob3J0KTB4MDA0QQorI2RlZmluZSBBU0NWX1NDU0lCVVNZX0IgICAgICAgKHVzaG9ydCkweDAwNEIKKyNkZWZpbmUgQVNDVl9RX0RPTkVfSU5fUFJPR1JFU1NfQiAgKHVzaG9ydCkweDAwNEMKKyNkZWZpbmUgQVNDVl9DVVJDREJfQiAgICAgICAgICh1c2hvcnQpMHgwMDRECisjZGVmaW5lIEFTQ1ZfUkNMVU5fQiAgICAgICAgICAodXNob3J0KTB4MDA0RQorI2RlZmluZSBBU0NWX0JVU1lfUUhFQURfQiAgICAgKHVzaG9ydCkweDAwNEYKKyNkZWZpbmUgQVNDVl9ESVNDMV9RSEVBRF9CICAgICh1c2hvcnQpMHgwMDUwCisjZGVmaW5lIEFTQ1ZfRElTQ19FTkFCTEVfQiAgICAodXNob3J0KTB4MDA1MgorI2RlZmluZSBBU0NWX0NBTl9UQUdHRURfUU5HX0IgKHVzaG9ydCkweDAwNTMKKyNkZWZpbmUgQVNDVl9IT1NUU0NTSV9JRF9CICAgICh1c2hvcnQpMHgwMDU1CisjZGVmaW5lIEFTQ1ZfTUNPREVfQ05UTF9CICAgICAodXNob3J0KTB4MDA1NgorI2RlZmluZSBBU0NWX05VTExfVEFSR0VUX0IgICAgKHVzaG9ydCkweDAwNTcKKyNkZWZpbmUgQVNDVl9GUkVFX1FfSEVBRF9XICAgICh1c2hvcnQpMHgwMDU4CisjZGVmaW5lIEFTQ1ZfRE9ORV9RX1RBSUxfVyAgICAodXNob3J0KTB4MDA1QQorI2RlZmluZSBBU0NWX0ZSRUVfUV9IRUFEX0IgICAgKHVzaG9ydCkoQVNDVl9GUkVFX1FfSEVBRF9XKzEpCisjZGVmaW5lIEFTQ1ZfRE9ORV9RX1RBSUxfQiAgICAodXNob3J0KShBU0NWX0RPTkVfUV9UQUlMX1crMSkKKyNkZWZpbmUgQVNDVl9IT1NUX0ZMQUdfQiAgICAgICh1c2hvcnQpMHgwMDVECisjZGVmaW5lIEFTQ1ZfVE9UQUxfUkVBRFlfUV9CICAodXNob3J0KTB4MDA2NAorI2RlZmluZSBBU0NWX1ZFUl9TRVJJQUxfQiAgICAgKHVzaG9ydCkweDAwNjUKKyNkZWZpbmUgQVNDVl9IQUxUQ09ERV9TQVZFRF9XICh1c2hvcnQpMHgwMDY2CisjZGVmaW5lIEFTQ1ZfV1RNX0ZMQUdfQiAgICAgICAodXNob3J0KTB4MDA2OAorI2RlZmluZSBBU0NWX1JJU0NfRkxBR19CICAgICAgKHVzaG9ydCkweDAwNkEKKyNkZWZpbmUgQVNDVl9SRVFfU0dfTElTVF9RUCAgICh1c2hvcnQpMHgwMDZCCisjZGVmaW5lIEFTQ19IT1NUX0ZMQUdfSU5fSVNSICAgICAgICAweDAxCisjZGVmaW5lIEFTQ19IT1NUX0ZMQUdfQUNLX0lOVCAgICAgICAweDAyCisjZGVmaW5lIEFTQ19SSVNDX0ZMQUdfR0VOX0lOVCAgICAgIDB4MDEKKyNkZWZpbmUgQVNDX1JJU0NfRkxBR19SRVFfU0dfTElTVCAgMHgwMgorI2RlZmluZSBJT1BfQ1RSTCAgICAgICAgICgweDBGKQorI2RlZmluZSBJT1BfU1RBVFVTICAgICAgICgweDBFKQorI2RlZmluZSBJT1BfSU5UX0FDSyAgICAgIElPUF9TVEFUVVMKKyNkZWZpbmUgSU9QX1JFR19JRkMgICAgICAoMHgwRCkKKyNkZWZpbmUgSU9QX1NZTl9PRkZTRVQgICAgKDB4MEIpCisjZGVmaW5lIElPUF9FWFRSQV9DT05UUk9MICgweDBEKQorI2RlZmluZSBJT1BfUkVHX1BDICAgICAgICAoMHgwQykKKyNkZWZpbmUgSU9QX1JBTV9BRERSICAgICAgKDB4MEEpCisjZGVmaW5lIElPUF9SQU1fREFUQSAgICAgICgweDA4KQorI2RlZmluZSBJT1BfRUVQX0RBVEEgICAgICAoMHgwNikKKyNkZWZpbmUgSU9QX0VFUF9DTUQgICAgICAgKDB4MDcpCisjZGVmaW5lIElPUF9WRVJTSU9OICAgICAgICgweDAzKQorI2RlZmluZSBJT1BfQ09ORklHX0hJR0ggICAoMHgwNCkKKyNkZWZpbmUgSU9QX0NPTkZJR19MT1cgICAgKDB4MDIpCisjZGVmaW5lIElPUF9TSUdfQllURSAgICAgICgweDAxKQorI2RlZmluZSBJT1BfU0lHX1dPUkQgICAgICAoMHgwMCkKKyNkZWZpbmUgSU9QX1JFR19EQzEgICAgICAoMHgwRSkKKyNkZWZpbmUgSU9QX1JFR19EQzAgICAgICAoMHgwQykKKyNkZWZpbmUgSU9QX1JFR19TQiAgICAgICAoMHgwQikKKyNkZWZpbmUgSU9QX1JFR19EQTEgICAgICAoMHgwQSkKKyNkZWZpbmUgSU9QX1JFR19EQTAgICAgICAoMHgwOCkKKyNkZWZpbmUgSU9QX1JFR19TQyAgICAgICAoMHgwOSkKKyNkZWZpbmUgSU9QX0RNQV9TUEVFRCAgICAoMHgwNykKKyNkZWZpbmUgSU9QX1JFR19GTEFHICAgICAoMHgwNykKKyNkZWZpbmUgSU9QX0ZJRk9fSCAgICAgICAoMHgwNikKKyNkZWZpbmUgSU9QX0ZJRk9fTCAgICAgICAoMHgwNCkKKyNkZWZpbmUgSU9QX1JFR19JRCAgICAgICAoMHgwNSkKKyNkZWZpbmUgSU9QX1JFR19RUCAgICAgICAoMHgwMykKKyNkZWZpbmUgSU9QX1JFR19JSCAgICAgICAoMHgwMikKKyNkZWZpbmUgSU9QX1JFR19JWCAgICAgICAoMHgwMSkKKyNkZWZpbmUgSU9QX1JFR19BWCAgICAgICAoMHgwMCkKKyNkZWZpbmUgSUZDX1JFR19MT0NLICAgICAgKDB4MDApCisjZGVmaW5lIElGQ19SRUdfVU5MT0NLICAgICgweDA5KQorI2RlZmluZSBJRkNfV1JfRU5fRklMVEVSICAoMHgxMCkKKyNkZWZpbmUgSUZDX1JEX05PX0VFUFJPTSAgKDB4MTApCisjZGVmaW5lIElGQ19TTEVXX1JBVEUgICAgICgweDIwKQorI2RlZmluZSBJRkNfQUNUX05FRyAgICAgICAoMHg0MCkKKyNkZWZpbmUgSUZDX0lOUF9GSUxURVIgICAgKDB4ODApCisjZGVmaW5lIElGQ19JTklUX0RFRkFVTFQgIChJRkNfQUNUX05FRyB8IElGQ19SRUdfVU5MT0NLKQorI2RlZmluZSBTQ19TRUwgICAodWNoYXIpKDB4ODApCisjZGVmaW5lIFNDX0JTWSAgICh1Y2hhcikoMHg0MCkKKyNkZWZpbmUgU0NfQUNLICAgKHVjaGFyKSgweDIwKQorI2RlZmluZSBTQ19SRVEgICAodWNoYXIpKDB4MTApCisjZGVmaW5lIFNDX0FUTiAgICh1Y2hhcikoMHgwOCkKKyNkZWZpbmUgU0NfSU8gICAgKHVjaGFyKSgweDA0KQorI2RlZmluZSBTQ19DRCAgICAodWNoYXIpKDB4MDIpCisjZGVmaW5lIFNDX01TRyAgICh1Y2hhcikoMHgwMSkKKyNkZWZpbmUgU0VDX1NDU0lfQ1RMICAgICAgICAgKHVjaGFyKSgweDgwKQorI2RlZmluZSBTRUNfQUNUSVZFX05FR0FURSAgICAodWNoYXIpKDB4NDApCisjZGVmaW5lIFNFQ19TTEVXX1JBVEUgICAgICAgICh1Y2hhcikoMHgyMCkKKyNkZWZpbmUgU0VDX0VOQUJMRV9GSUxURVIgICAgKHVjaGFyKSgweDEwKQorI2RlZmluZSBBU0NfSEFMVF9FWFRNU0dfSU4gICAgICh1c2hvcnQpMHg4MDAwCisjZGVmaW5lIEFTQ19IQUxUX0NIS19DT05ESVRJT04gKHVzaG9ydCkweDgxMDAKKyNkZWZpbmUgQVNDX0hBTFRfU1NfUVVFVUVfRlVMTCAodXNob3J0KTB4ODIwMAorI2RlZmluZSBBU0NfSEFMVF9ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVggICh1c2hvcnQpMHg4MzAwCisjZGVmaW5lIEFTQ19IQUxUX0VOQUJMRV9BU1lOX1VTRV9TWU5fRklYICAgKHVzaG9ydCkweDg0MDAKKyNkZWZpbmUgQVNDX0hBTFRfU0RUUl9SRUpFQ1RFRCAodXNob3J0KTB4NDAwMAorI2RlZmluZSBBU0NfSEFMVF9IT1NUX0NPUFlfU0dfTElTVF9UT19SSVNDICggdXNob3J0ICkweDIwMDAKKyNkZWZpbmUgQVNDX01BWF9RTk8gICAgICAgIDB4RjgKKyNkZWZpbmUgQVNDX0RBVEFfU0VDX0JFRyAgICh1c2hvcnQpMHgwMDgwCisjZGVmaW5lIEFTQ19EQVRBX1NFQ19FTkQgICAodXNob3J0KTB4MDA4MAorI2RlZmluZSBBU0NfQ09ERV9TRUNfQkVHICAgKHVzaG9ydCkweDAwODAKKyNkZWZpbmUgQVNDX0NPREVfU0VDX0VORCAgICh1c2hvcnQpMHgwMDgwCisjZGVmaW5lIEFTQ19RQURSX0JFRyAgICAgICAoMHg0MDAwKQorI2RlZmluZSBBU0NfUUFEUl9VU0VEICAgICAgKHVzaG9ydCkoQVNDX01BWF9RTk8gKiA2NCkKKyNkZWZpbmUgQVNDX1FBRFJfRU5EICAgICAgICh1c2hvcnQpMHg3RkZGCisjZGVmaW5lIEFTQ19RTEFTVF9BRFIgICAgICAodXNob3J0KTB4N0ZDMAorI2RlZmluZSBBU0NfUUJMS19TSVpFICAgICAgMHg0MAorI2RlZmluZSBBU0NfQklPU19EQVRBX1FCRUcgMHhGOAorI2RlZmluZSBBU0NfTUlOX0FDVElWRV9RTk8gMHgwMQorI2RlZmluZSBBU0NfUUxJTktfRU5EICAgICAgMHhGRgorI2RlZmluZSBBU0NfRUVQUk9NX1dPUkRTICAgMHgxMAorI2RlZmluZSBBU0NfTUFYX01HU19MRU4gICAgMHgxMAorI2RlZmluZSBBU0NfQklPU19BRERSX0RFRiAgMHhEQzAwCisjZGVmaW5lIEFTQ19CSU9TX1NJWkUgICAgICAweDM4MDAKKyNkZWZpbmUgQVNDX0JJT1NfUkFNX09GRiAgIDB4MzgwMAorI2RlZmluZSBBU0NfQklPU19SQU1fU0laRSAgMHg4MDAKKyNkZWZpbmUgQVNDX0JJT1NfTUlOX0FERFIgIDB4QzAwMAorI2RlZmluZSBBU0NfQklPU19NQVhfQUREUiAgMHhFQzAwCisjZGVmaW5lIEFTQ19CSU9TX0JBTktfU0laRSAweDA0MDAKKyNkZWZpbmUgQVNDX01DT0RFX1NUQVJUX0FERFIgIDB4MDA4MAorI2RlZmluZSBBU0NfQ0ZHMF9IT1NUX0lOVF9PTiAgICAweDAwMjAKKyNkZWZpbmUgQVNDX0NGRzBfQklPU19PTiAgICAgICAgMHgwMDQwCisjZGVmaW5lIEFTQ19DRkcwX1ZFUkFfQlVSU1RfT04gIDB4MDA4MAorI2RlZmluZSBBU0NfQ0ZHMF9TQ1NJX1BBUklUWV9PTiAweDA4MDAKKyNkZWZpbmUgQVNDX0NGRzFfU0NTSV9UQVJHRVRfT04gMHgwMDgwCisjZGVmaW5lIEFTQ19DRkcxX0xSQU1fOEJJVFNfT04gIDB4MDgwMAorI2RlZmluZSBBU0NfQ0ZHX01TV19DTFJfTUFTSyAgICAweDMwODAKKyNkZWZpbmUgQ1NXX1RFU1QxICAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDgwMDAKKyNkZWZpbmUgQ1NXX0FVVE9fQ09ORklHICAgICAgIChBU0NfQ1NfVFlQRSkweDQwMDAKKyNkZWZpbmUgQ1NXX1JFU0VSVkVEMSAgICAgICAgIChBU0NfQ1NfVFlQRSkweDIwMDAKKyNkZWZpbmUgQ1NXX0lSUV9XUklUVEVOICAgICAgIChBU0NfQ1NfVFlQRSkweDEwMDAKKyNkZWZpbmUgQ1NXXzMzTUhaX1NFTEVDVEVEICAgIChBU0NfQ1NfVFlQRSkweDA4MDAKKyNkZWZpbmUgQ1NXX1RFU1QyICAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDA0MDAKKyNkZWZpbmUgQ1NXX1RFU1QzICAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAyMDAKKyNkZWZpbmUgQ1NXX1JFU0VSVkVEMiAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAxMDAKKyNkZWZpbmUgQ1NXX0RNQV9ET05FICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwODAKKyNkZWZpbmUgQ1NXX0ZJRk9fUkRZICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwNDAKKyNkZWZpbmUgQ1NXX0VFUF9SRUFEX0RPTkUgICAgIChBU0NfQ1NfVFlQRSkweDAwMjAKKyNkZWZpbmUgQ1NXX0hBTFRFRCAgICAgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwMTAKKyNkZWZpbmUgQ1NXX1NDU0lfUkVTRVRfQUNUSVZFIChBU0NfQ1NfVFlQRSkweDAwMDgKKyNkZWZpbmUgQ1NXX1BBUklUWV9FUlIgICAgICAgIChBU0NfQ1NfVFlQRSkweDAwMDQKKyNkZWZpbmUgQ1NXX1NDU0lfUkVTRVRfTEFUQ0ggIChBU0NfQ1NfVFlQRSkweDAwMDIKKyNkZWZpbmUgQ1NXX0lOVF9QRU5ESU5HICAgICAgIChBU0NfQ1NfVFlQRSkweDAwMDEKKyNkZWZpbmUgQ0lXX0NMUl9TQ1NJX1JFU0VUX0lOVCAoQVNDX0NTX1RZUEUpMHgxMDAwCisjZGVmaW5lIENJV19JTlRfQUNLICAgICAgKEFTQ19DU19UWVBFKTB4MDEwMAorI2RlZmluZSBDSVdfVEVTVDEgICAgICAgIChBU0NfQ1NfVFlQRSkweDAyMDAKKyNkZWZpbmUgQ0lXX1RFU1QyICAgICAgICAoQVNDX0NTX1RZUEUpMHgwNDAwCisjZGVmaW5lIENJV19TRUxfMzNNSFogICAgKEFTQ19DU19UWVBFKTB4MDgwMAorI2RlZmluZSBDSVdfSVJRX0FDVCAgICAgIChBU0NfQ1NfVFlQRSkweDEwMDAKKyNkZWZpbmUgQ0NfQ0hJUF9SRVNFVCAgICh1Y2hhcikweDgwCisjZGVmaW5lIENDX1NDU0lfUkVTRVQgICAodWNoYXIpMHg0MAorI2RlZmluZSBDQ19IQUxUICAgICAgICAgKHVjaGFyKTB4MjAKKyNkZWZpbmUgQ0NfU0lOR0xFX1NURVAgICh1Y2hhcikweDEwCisjZGVmaW5lIENDX0RNQV9BQkxFICAgICAodWNoYXIpMHgwOAorI2RlZmluZSBDQ19URVNUICAgICAgICAgKHVjaGFyKTB4MDQKKyNkZWZpbmUgQ0NfQkFOS19PTkUgICAgICh1Y2hhcikweDAyCisjZGVmaW5lIENDX0RJQUcgICAgICAgICAodWNoYXIpMHgwMQorI2RlZmluZSBBU0NfMTAwMF9JRDBXICAgICAgMHgwNEMxCisjZGVmaW5lIEFTQ18xMDAwX0lEMFdfRklYICAweDAwQzEKKyNkZWZpbmUgQVNDXzEwMDBfSUQxQiAgICAgIDB4MjUKKyNkZWZpbmUgQVNDX0VJU0FfQklHX0lPUF9HQVAgICAoMHgxQzMwLTB4MEM1MCkKKyNkZWZpbmUgQVNDX0VJU0FfU01BTExfSU9QX0dBUCAoMHgwMDIwKQorI2RlZmluZSBBU0NfRUlTQV9NSU5fSU9QX0FERFIgICgweDBDMzApCisjZGVmaW5lIEFTQ19FSVNBX01BWF9JT1BfQUREUiAgKDB4RkM1MCkKKyNkZWZpbmUgQVNDX0VJU0FfUkVWX0lPUF9NQVNLICAoMHgwQzgzKQorI2RlZmluZSBBU0NfRUlTQV9QSURfSU9QX01BU0sgICgweDBDODApCisjZGVmaW5lIEFTQ19FSVNBX0NGR19JT1BfTUFTSyAgKDB4MEM4NikKKyNkZWZpbmUgQVNDX0dFVF9FSVNBX1NMT1QoaW9wKSAgKFBvcnRBZGRyKSgoaW9wKSAmIDB4RjAwMCkKKyNkZWZpbmUgQVNDX0VJU0FfSURfNzQwICAgIDB4MDE3NDUwMDRVTAorI2RlZmluZSBBU0NfRUlTQV9JRF83NTAgICAgMHgwMTc1NTAwNFVMCisjZGVmaW5lIElOU19IQUxUSU5UICAgICAgICAodXNob3J0KTB4NjI4MQorI2RlZmluZSBJTlNfSEFMVCAgICAgICAgICAgKHVzaG9ydCkweDYyODAKKyNkZWZpbmUgSU5TX1NJTlQgICAgICAgICAgICh1c2hvcnQpMHg2MjAwCisjZGVmaW5lIElOU19SRkxBR19XVE0gICAgICAodXNob3J0KTB4NzM4MAorI2RlZmluZSBBU0NfTUNfU0FWRV9DT0RFX1dTSVpFICAweDUwMAorI2RlZmluZSBBU0NfTUNfU0FWRV9EQVRBX1dTSVpFICAweDQwCisKK3R5cGVkZWYgc3RydWN0IGFzY19tY19zYXZlZCB7CisgICAgdXNob3J0ICAgICAgICAgICAgICBkYXRhW0FTQ19NQ19TQVZFX0RBVEFfV1NJWkVdOworICAgIHVzaG9ydCAgICAgICAgICAgICAgY29kZVtBU0NfTUNfU0FWRV9DT0RFX1dTSVpFXTsKK30gQVNDX01DX1NBVkVEOworCisjZGVmaW5lIEFzY0dldFFEb25lSW5Qcm9ncmVzcyhwb3J0KSAgICAgICAgIEFzY1JlYWRMcmFtQnl0ZSgocG9ydCksIEFTQ1ZfUV9ET05FX0lOX1BST0dSRVNTX0IpCisjZGVmaW5lIEFzY1B1dFFEb25lSW5Qcm9ncmVzcyhwb3J0LCB2YWwpICAgIEFzY1dyaXRlTHJhbUJ5dGUoKHBvcnQpLCBBU0NWX1FfRE9ORV9JTl9QUk9HUkVTU19CLCB2YWwpCisjZGVmaW5lIEFzY0dldFZhckZyZWVRSGVhZChwb3J0KSAgICAgICAgICAgIEFzY1JlYWRMcmFtV29yZCgocG9ydCksIEFTQ1ZfRlJFRV9RX0hFQURfVykKKyNkZWZpbmUgQXNjR2V0VmFyRG9uZVFUYWlsKHBvcnQpICAgICAgICAgICAgQXNjUmVhZExyYW1Xb3JkKChwb3J0KSwgQVNDVl9ET05FX1FfVEFJTF9XKQorI2RlZmluZSBBc2NQdXRWYXJGcmVlUUhlYWQocG9ydCwgdmFsKSAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKChwb3J0KSwgQVNDVl9GUkVFX1FfSEVBRF9XLCB2YWwpCisjZGVmaW5lIEFzY1B1dFZhckRvbmVRVGFpbChwb3J0LCB2YWwpICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoKHBvcnQpLCBBU0NWX0RPTkVfUV9UQUlMX1csIHZhbCkKKyNkZWZpbmUgQXNjR2V0UmlzY1ZhckZyZWVRSGVhZChwb3J0KSAgICAgICAgQXNjUmVhZExyYW1CeXRlKChwb3J0KSwgQVNDVl9ORVhUUkRZX0IpCisjZGVmaW5lIEFzY0dldFJpc2NWYXJEb25lUVRhaWwocG9ydCkgICAgICAgIEFzY1JlYWRMcmFtQnl0ZSgocG9ydCksIEFTQ1ZfRE9ORU5FWFRfQikKKyNkZWZpbmUgQXNjUHV0UmlzY1ZhckZyZWVRSGVhZChwb3J0LCB2YWwpICAgQXNjV3JpdGVMcmFtQnl0ZSgocG9ydCksIEFTQ1ZfTkVYVFJEWV9CLCB2YWwpCisjZGVmaW5lIEFzY1B1dFJpc2NWYXJEb25lUVRhaWwocG9ydCwgdmFsKSAgIEFzY1dyaXRlTHJhbUJ5dGUoKHBvcnQpLCBBU0NWX0RPTkVORVhUX0IsIHZhbCkKKyNkZWZpbmUgQXNjUHV0TUNvZGVTRFRSRG9uZUF0SUQocG9ydCwgaWQsIGRhdGEpICBBc2NXcml0ZUxyYW1CeXRlKChwb3J0KSwgKHVzaG9ydCkoKHVzaG9ydClBU0NWX1NEVFJfRE9ORV9CRUcrKHVzaG9ydClpZCksIChkYXRhKSk7CisjZGVmaW5lIEFzY0dldE1Db2RlU0RUUkRvbmVBdElEKHBvcnQsIGlkKSAgICAgICAgQXNjUmVhZExyYW1CeXRlKChwb3J0KSwgKHVzaG9ydCkoKHVzaG9ydClBU0NWX1NEVFJfRE9ORV9CRUcrKHVzaG9ydClpZCkpOworI2RlZmluZSBBc2NQdXRNQ29kZUluaXRTRFRSQXRJRChwb3J0LCBpZCwgZGF0YSkgIEFzY1dyaXRlTHJhbUJ5dGUoKHBvcnQpLCAodXNob3J0KSgodXNob3J0KUFTQ1ZfU0RUUl9EQVRBX0JFRysodXNob3J0KWlkKSwgZGF0YSk7CisjZGVmaW5lIEFzY0dldE1Db2RlSW5pdFNEVFJBdElEKHBvcnQsIGlkKSAgICAgICAgQXNjUmVhZExyYW1CeXRlKChwb3J0KSwgKHVzaG9ydCkoKHVzaG9ydClBU0NWX1NEVFJfREFUQV9CRUcrKHVzaG9ydClpZCkpOworI2RlZmluZSBBc2NTeW5JbmRleFRvUGVyaW9kKGluZGV4KSAgICAgICAgKHVjaGFyKShhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbIChpbmRleCkgXSkKKyNkZWZpbmUgQXNjR2V0Q2hpcFNpZ25hdHVyZUJ5dGUocG9ydCkgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9TSUdfQllURSkKKyNkZWZpbmUgQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQocG9ydCkgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1NJR19XT1JEKQorI2RlZmluZSBBc2NHZXRDaGlwVmVyTm8ocG9ydCkgICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX1ZFUlNJT04pCisjZGVmaW5lIEFzY0dldENoaXBDZmdMc3cocG9ydCkgICAgICAgICAgICAodXNob3J0KWlucHcoKHBvcnQpK0lPUF9DT05GSUdfTE9XKQorI2RlZmluZSBBc2NHZXRDaGlwQ2ZnTXN3KHBvcnQpICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfQ09ORklHX0hJR0gpCisjZGVmaW5lIEFzY1NldENoaXBDZmdMc3cocG9ydCwgZGF0YSkgICAgICBvdXRwdygocG9ydCkrSU9QX0NPTkZJR19MT1csIGRhdGEpCisjZGVmaW5lIEFzY1NldENoaXBDZmdNc3cocG9ydCwgZGF0YSkgICAgICBvdXRwdygocG9ydCkrSU9QX0NPTkZJR19ISUdILCBkYXRhKQorI2RlZmluZSBBc2NHZXRDaGlwRUVQQ21kKHBvcnQpICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX0VFUF9DTUQpCisjZGVmaW5lIEFzY1NldENoaXBFRVBDbWQocG9ydCwgZGF0YSkgICAgICBvdXRwKChwb3J0KStJT1BfRUVQX0NNRCwgZGF0YSkKKyNkZWZpbmUgQXNjR2V0Q2hpcEVFUERhdGEocG9ydCkgICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX0VFUF9EQVRBKQorI2RlZmluZSBBc2NTZXRDaGlwRUVQRGF0YShwb3J0LCBkYXRhKSAgICAgb3V0cHcoKHBvcnQpK0lPUF9FRVBfREFUQSwgZGF0YSkKKyNkZWZpbmUgQXNjR2V0Q2hpcExyYW1BZGRyKHBvcnQpICAgICAgICAgICh1c2hvcnQpaW5wdygoUG9ydEFkZHIpKChwb3J0KStJT1BfUkFNX0FERFIpKQorI2RlZmluZSBBc2NTZXRDaGlwTHJhbUFkZHIocG9ydCwgYWRkcikgICAgb3V0cHcoKFBvcnRBZGRyKSgocG9ydCkrSU9QX1JBTV9BRERSKSwgYWRkcikKKyNkZWZpbmUgQXNjR2V0Q2hpcExyYW1EYXRhKHBvcnQpICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1JBTV9EQVRBKQorI2RlZmluZSBBc2NTZXRDaGlwTHJhbURhdGEocG9ydCwgZGF0YSkgICAgb3V0cHcoKHBvcnQpK0lPUF9SQU1fREFUQSwgZGF0YSkKKyNkZWZpbmUgQXNjR2V0Q2hpcElGQyhwb3J0KSAgICAgICAgICAgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9SRUdfSUZDKQorI2RlZmluZSBBc2NTZXRDaGlwSUZDKHBvcnQsIGRhdGEpICAgICAgICAgIG91dHAoKHBvcnQpK0lPUF9SRUdfSUZDLCBkYXRhKQorI2RlZmluZSBBc2NHZXRDaGlwU3RhdHVzKHBvcnQpICAgICAgICAgICAgKEFTQ19DU19UWVBFKWlucHcoKHBvcnQpK0lPUF9TVEFUVVMpCisjZGVmaW5lIEFzY1NldENoaXBTdGF0dXMocG9ydCwgY3NfdmFsKSAgICBvdXRwdygocG9ydCkrSU9QX1NUQVRVUywgY3NfdmFsKQorI2RlZmluZSBBc2NHZXRDaGlwQ29udHJvbChwb3J0KSAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX0NUUkwpCisjZGVmaW5lIEFzY1NldENoaXBDb250cm9sKHBvcnQsIGNjX3ZhbCkgICBvdXRwKChwb3J0KStJT1BfQ1RSTCwgY2NfdmFsKQorI2RlZmluZSBBc2NHZXRDaGlwU3luKHBvcnQpICAgICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX1NZTl9PRkZTRVQpCisjZGVmaW5lIEFzY1NldENoaXBTeW4ocG9ydCwgZGF0YSkgICAgICAgICBvdXRwKChwb3J0KStJT1BfU1lOX09GRlNFVCwgZGF0YSkKKyNkZWZpbmUgQXNjU2V0UENBZGRyKHBvcnQsIGRhdGEpICAgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX1BDLCBkYXRhKQorI2RlZmluZSBBc2NHZXRQQ0FkZHIocG9ydCkgICAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX1BDKQorI2RlZmluZSBBc2NJc0ludFBlbmRpbmcocG9ydCkgICAgICAgICAgICAgKEFzY0dldENoaXBTdGF0dXMocG9ydCkgJiAoQ1NXX0lOVF9QRU5ESU5HIHwgQ1NXX1NDU0lfUkVTRVRfTEFUQ0gpKQorI2RlZmluZSBBc2NHZXRDaGlwU2NzaUlEKHBvcnQpICAgICAgICAgICAgKChBc2NHZXRDaGlwQ2ZnTHN3KHBvcnQpID4+IDgpICYgQVNDX01BWF9USUQpCisjZGVmaW5lIEFzY0dldEV4dHJhQ29udHJvbChwb3J0KSAgICAgICAgICAodWNoYXIpaW5wKChwb3J0KStJT1BfRVhUUkFfQ09OVFJPTCkKKyNkZWZpbmUgQXNjU2V0RXh0cmFDb250cm9sKHBvcnQsIGRhdGEpICAgIG91dHAoKHBvcnQpK0lPUF9FWFRSQV9DT05UUk9MLCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcEFYKHBvcnQpICAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0FYKQorI2RlZmluZSBBc2NXcml0ZUNoaXBBWChwb3J0LCBkYXRhKSAgICAgICAgb3V0cHcoKHBvcnQpK0lPUF9SRUdfQVgsIGRhdGEpCisjZGVmaW5lIEFzY1JlYWRDaGlwSVgocG9ydCkgICAgICAgICAgICAgICAodWNoYXIpaW5wKChwb3J0KStJT1BfUkVHX0lYKQorI2RlZmluZSBBc2NXcml0ZUNoaXBJWChwb3J0LCBkYXRhKSAgICAgICAgb3V0cCgocG9ydCkrSU9QX1JFR19JWCwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBJSChwb3J0KSAgICAgICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1JFR19JSCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwSUgocG9ydCwgZGF0YSkgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0lILCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcFFQKHBvcnQpICAgICAgICAgICAgICAgKHVjaGFyKWlucCgocG9ydCkrSU9QX1JFR19RUCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwUVAocG9ydCwgZGF0YSkgICAgICAgIG91dHAoKHBvcnQpK0lPUF9SRUdfUVAsIGRhdGEpCisjZGVmaW5lIEFzY1JlYWRDaGlwRklGT19MKHBvcnQpICAgICAgICAgICAodXNob3J0KWlucHcoKHBvcnQpK0lPUF9SRUdfRklGT19MKQorI2RlZmluZSBBc2NXcml0ZUNoaXBGSUZPX0wocG9ydCwgZGF0YSkgICAgb3V0cHcoKHBvcnQpK0lPUF9SRUdfRklGT19MLCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcEZJRk9fSChwb3J0KSAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0ZJRk9fSCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwRklGT19IKHBvcnQsIGRhdGEpICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0ZJRk9fSCwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBEbWFTcGVlZChwb3J0KSAgICAgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9ETUFfU1BFRUQpCisjZGVmaW5lIEFzY1dyaXRlQ2hpcERtYVNwZWVkKHBvcnQsIGRhdGEpICBvdXRwKChwb3J0KStJT1BfRE1BX1NQRUVELCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcERBMChwb3J0KSAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0RBMCkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwREEwKHBvcnQpICAgICAgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0RBMCwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBEQTEocG9ydCkgICAgICAgICAgICAgICh1c2hvcnQpaW5wdygocG9ydCkrSU9QX1JFR19EQTEpCisjZGVmaW5lIEFzY1dyaXRlQ2hpcERBMShwb3J0KSAgICAgICAgICAgICBvdXRwdygocG9ydCkrSU9QX1JFR19EQTEsIGRhdGEpCisjZGVmaW5lIEFzY1JlYWRDaGlwREMwKHBvcnQpICAgICAgICAgICAgICAodXNob3J0KWlucHcoKHBvcnQpK0lPUF9SRUdfREMwKQorI2RlZmluZSBBc2NXcml0ZUNoaXBEQzAocG9ydCkgICAgICAgICAgICAgb3V0cHcoKHBvcnQpK0lPUF9SRUdfREMwLCBkYXRhKQorI2RlZmluZSBBc2NSZWFkQ2hpcERDMShwb3J0KSAgICAgICAgICAgICAgKHVzaG9ydClpbnB3KChwb3J0KStJT1BfUkVHX0RDMSkKKyNkZWZpbmUgQXNjV3JpdGVDaGlwREMxKHBvcnQpICAgICAgICAgICAgIG91dHB3KChwb3J0KStJT1BfUkVHX0RDMSwgZGF0YSkKKyNkZWZpbmUgQXNjUmVhZENoaXBEdmNJRChwb3J0KSAgICAgICAgICAgICh1Y2hhcilpbnAoKHBvcnQpK0lPUF9SRUdfSUQpCisjZGVmaW5lIEFzY1dyaXRlQ2hpcER2Y0lEKHBvcnQsIGRhdGEpICAgICBvdXRwKChwb3J0KStJT1BfUkVHX0lELCBkYXRhKQorCitTVEFUSUMgaW50ICAgICAgIEFzY1dyaXRlRUVQQ21kUmVnKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBjbWRfcmVnKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjV3JpdGVFRVBEYXRhUmVnKFBvcnRBZGRyIGlvcF9iYXNlLCB1c2hvcnQgZGF0YV9yZWcpOworU1RBVElDIHZvaWQgICAgICBBc2NXYWl0RUVQUmVhZCh2b2lkKTsKK1NUQVRJQyB2b2lkICAgICAgQXNjV2FpdEVFUFdyaXRlKHZvaWQpOworU1RBVElDIHVzaG9ydCAgICBBc2NSZWFkRUVQV29yZChQb3J0QWRkciwgdWNoYXIpOworU1RBVElDIHVzaG9ydCAgICBBc2NXcml0ZUVFUFdvcmQoUG9ydEFkZHIsIHVjaGFyLCB1c2hvcnQpOworU1RBVElDIHVzaG9ydCAgICBBc2NHZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU2V0RUVQQ29uZmlnT25jZShQb3J0QWRkciwgQVNDRUVQX0NPTkZJRyAqLCB1c2hvcnQpOworU1RBVElDIGludCAgICAgICBBc2NTZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU3RhcnRDaGlwKFBvcnRBZGRyKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU3RvcENoaXAoUG9ydEFkZHIpOworU1RBVElDIHZvaWQgICAgICBBc2NTZXRDaGlwSUgoUG9ydEFkZHIsIHVzaG9ydCk7CitTVEFUSUMgaW50ICAgICAgIEFzY0lzQ2hpcEhhbHRlZChQb3J0QWRkcik7CitTVEFUSUMgdm9pZCAgICAgIEFzY0Fja0ludGVycnVwdChQb3J0QWRkcik7CitTVEFUSUMgdm9pZCAgICAgIEFzY0Rpc2FibGVJbnRlcnJ1cHQoUG9ydEFkZHIpOworU1RBVElDIHZvaWQgICAgICBBc2NFbmFibGVJbnRlcnJ1cHQoUG9ydEFkZHIpOworU1RBVElDIHZvaWQgICAgICBBc2NTZXRCYW5rKFBvcnRBZGRyLCB1Y2hhcik7CitTVEFUSUMgaW50ICAgICAgIEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoQVNDX0RWQ19WQVIgKik7CisjaWZkZWYgQ09ORklHX0lTQQorU1RBVElDIHVzaG9ydCAgICBBc2NHZXRJc2FEbWFDaGFubmVsKFBvcnRBZGRyKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjU2V0SXNhRG1hQ2hhbm5lbChQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjU2V0SXNhRG1hU3BlZWQoUG9ydEFkZHIsIHVjaGFyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0SXNhRG1hU3BlZWQoUG9ydEFkZHIpOworI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KK1NUQVRJQyB1Y2hhciAgICAgQXNjUmVhZExyYW1CeXRlKFBvcnRBZGRyLCB1c2hvcnQpOworU1RBVElDIHVzaG9ydCAgICBBc2NSZWFkTHJhbVdvcmQoUG9ydEFkZHIsIHVzaG9ydCk7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKK1NUQVRJQyBBU0NfRENOVCAgQXNjUmVhZExyYW1EV29yZChQb3J0QWRkciwgdXNob3J0KTsKKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworU1RBVElDIHZvaWQgICAgICBBc2NXcml0ZUxyYW1Xb3JkKFBvcnRBZGRyLCB1c2hvcnQsIHVzaG9ydCk7CitTVEFUSUMgdm9pZCAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIpOworU1RBVElDIEFTQ19EQ05UICBBc2NNZW1TdW1McmFtV29yZChQb3J0QWRkciwgdXNob3J0LCBpbnQpOworU1RBVElDIHZvaWQgICAgICBBc2NNZW1Xb3JkU2V0THJhbShQb3J0QWRkciwgdXNob3J0LCB1c2hvcnQsIGludCk7CitTVEFUSUMgdm9pZCAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7CitTVEFUSUMgdm9pZCAgICAgIEFzY01lbURXb3JkQ29weVB0clRvTHJhbShQb3J0QWRkciwgdXNob3J0LCB1Y2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQgICAgICBBc2NNZW1Xb3JkQ29weVB0ckZyb21McmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7CitTVEFUSUMgdXNob3J0ICAgIEFzY0luaXRBc2NEdmNWYXIoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgdXNob3J0ICAgIEFzY0luaXRGcm9tRUVQKEFTQ19EVkNfVkFSICopOworU1RBVElDIHVzaG9ydCAgICBBc2NJbml0RnJvbUFzY0R2Y1ZhcihBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdE1pY3JvQ29kZVZhcihBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjVGVzdEV4dGVybmFsTHJhbShBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjTXNnT3V0U0RUUihBU0NfRFZDX1ZBUiAqLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIHVjaGFyICAgICBBc2NDYWxTRFRSRGF0YShBU0NfRFZDX1ZBUiAqLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIHZvaWQgICAgICBBc2NTZXRDaGlwU0RUUihQb3J0QWRkciwgdWNoYXIsIHVjaGFyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0U3luUGVyaW9kSW5kZXgoQVNDX0RWQ19WQVIgKiwgdWNoYXIpOworU1RBVElDIHVjaGFyICAgICBBc2NBbGxvY0ZyZWVRdWV1ZShQb3J0QWRkciwgdWNoYXIpOworU1RBVElDIHVjaGFyICAgICBBc2NBbGxvY011bHRpcGxlRnJlZVF1ZXVlKFBvcnRBZGRyLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIGludCAgICAgICBBc2NIb3N0UmVxUmlzY0hhbHQoUG9ydEFkZHIpOworU1RBVElDIGludCAgICAgICBBc2NTdG9wUXVldWVFeGUoUG9ydEFkZHIpOworU1RBVElDIGludCAgICAgICBBc2NTZW5kU2NzaVF1ZXVlKEFTQ19EVkNfVkFSICosCisgICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKiBzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgbl9xX3JlcXVpcmVkKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjUHV0UmVhZHlRdWV1ZShBU0NfRFZDX1ZBUiAqLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICosIHVjaGFyKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjUHV0UmVhZHlTZ0xpc3RRdWV1ZShBU0NfRFZDX1ZBUiAqLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICosIHVjaGFyKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjU2V0Q2hpcFN5blJlZ0F0SUQoUG9ydEFkZHIsIHVjaGFyLCB1Y2hhcik7CitTVEFUSUMgaW50ICAgICAgIEFzY1NldFJ1bkNoaXBTeW5SZWdBdElEKFBvcnRBZGRyLCB1Y2hhciwgdWNoYXIpOworU1RBVElDIHVzaG9ydCAgICBBc2NJbml0THJhbShBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdFFMaW5rVmFyKEFTQ19EVkNfVkFSICopOworU1RBVElDIGludCAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoQVNDX0RWQ19WQVIgKiwgdXNob3J0KTsKK1NUQVRJQyBpbnQgICAgICAgQXNjSXNyQ2hpcEhhbHRlZChBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1Y2hhciAgICAgX0FzY0NvcHlMcmFtU2NzaURvbmVRKFBvcnRBZGRyLCB1c2hvcnQsCisgICAgICAgICAgICAgICAgICAgIEFTQ19RRE9ORV9JTkZPICosIEFTQ19EQ05UKTsKK1NUQVRJQyBpbnQgICAgICAgQXNjSXNyUURvbmUoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgaW50ICAgICAgIEFzY0NvbXBhcmVTdHJpbmcodWNoYXIgKiwgdWNoYXIgKiwgaW50KTsKKyNpZmRlZiBDT05GSUdfSVNBCitTVEFUSUMgdXNob3J0ICAgIEFzY0dldEVpc2FDaGlwQ2ZnKFBvcnRBZGRyKTsKK1NUQVRJQyBBU0NfRENOVCAgQXNjR2V0RWlzYVByb2R1Y3RJRChQb3J0QWRkcik7CitTVEFUSUMgUG9ydEFkZHIgIEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKFBvcnRBZGRyKTsKK1NUQVRJQyBQb3J0QWRkciAgQXNjU2VhcmNoSU9Qb3J0QWRkcjExKFBvcnRBZGRyKTsKK1NUQVRJQyBQb3J0QWRkciAgQXNjU2VhcmNoSU9Qb3J0QWRkcihQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyB2b2lkICAgICAgQXNjU2V0SVNBUE5QV2FpdEZvcktleSh2b2lkKTsKKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCitTVEFUSUMgdWNoYXIgICAgIEFzY0dldENoaXBTY3NpQ3RybChQb3J0QWRkcik7CitTVEFUSUMgdWNoYXIgICAgIEFzY1NldENoaXBTY3NpSUQoUG9ydEFkZHIsIHVjaGFyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0Q2hpcFZlcnNpb24oUG9ydEFkZHIsIHVzaG9ydCk7CitTVEFUSUMgdXNob3J0ICAgIEFzY0dldENoaXBCdXNUeXBlKFBvcnRBZGRyKTsKK1NUQVRJQyBBU0NfRENOVCAgQXNjTG9hZE1pY3JvQ29kZShQb3J0QWRkciwgdXNob3J0LCB1Y2hhciAqLCB1c2hvcnQpOworU1RBVElDIGludCAgICAgICBBc2NGaW5kU2lnbmF0dXJlKFBvcnRBZGRyKTsKK1NUQVRJQyB2b2lkICAgICAgQXNjVG9nZ2xlSVJRQWN0KFBvcnRBZGRyKTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjR2V0Q2hpcElSUShQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyB1Y2hhciAgICAgQXNjU2V0Q2hpcElSUShQb3J0QWRkciwgdWNoYXIsIHVzaG9ydCk7CitTVEFUSUMgdXNob3J0ICAgIEFzY0dldENoaXBCaW9zQWRkcmVzcyhQb3J0QWRkciwgdXNob3J0KTsKK1NUQVRJQyBpbmxpbmUgdWxvbmcgRHZjRW50ZXJDcml0aWNhbCh2b2lkKTsKK1NUQVRJQyBpbmxpbmUgdm9pZCBEdmNMZWF2ZUNyaXRpY2FsKHVsb25nKTsKKyNpZmRlZiBDT05GSUdfUENJCitTVEFUSUMgdWNoYXIgICAgIER2Y1JlYWRQQ0lDb25maWdCeXRlKEFTQ19EVkNfVkFSICosIHVzaG9ydCk7CitTVEFUSUMgdm9pZCAgICAgIER2Y1dyaXRlUENJQ29uZmlnQnl0ZShBU0NfRFZDX1ZBUiAqLAorICAgICAgICAgICAgICAgICAgICB1c2hvcnQsIHVjaGFyKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCitTVEFUSUMgdXNob3J0ICAgICAgQXNjR2V0Q2hpcEJpb3NBZGRyZXNzKFBvcnRBZGRyLCB1c2hvcnQpOworU1RBVElDIHZvaWQgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKEFTQ19EQ05UKTsKK1NUQVRJQyB2b2lkICAgICAgRHZjRGVsYXlOYW5vU2Vjb25kKEFTQ19EVkNfVkFSICosIEFTQ19EQ05UKTsKK1NUQVRJQyB2b2lkICAgICAgRHZjUHV0U2NzaVEoUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKK1NUQVRJQyB2b2lkICAgICAgRHZjR2V0UWluZm8oUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdEdldENvbmZpZyhBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdFNldENvbmZpZyhBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB1c2hvcnQgICAgQXNjSW5pdEFzYzEwMDBEcml2ZXIoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgdm9pZCAgICAgIEFzY0FzeW5jRml4KEFTQ19EVkNfVkFSICosIHVjaGFyLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9JTlFVSVJZICopOworU1RBVElDIGludCAgICAgICBBc2NUYWdRdWV1aW5nU2FmZShBU0NfU0NTSV9JTlFVSVJZICopOworU1RBVElDIHZvaWQgICAgICBBc2NJbnF1aXJ5SGFuZGxpbmcoQVNDX0RWQ19WQVIgKiwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIsIEFTQ19TQ1NJX0lOUVVJUlkgKik7CitTVEFUSUMgaW50ICAgICAgIEFzY0V4ZVNjc2lRdWV1ZShBU0NfRFZDX1ZBUiAqLCBBU0NfU0NTSV9RICopOworU1RBVElDIGludCAgICAgICBBc2NJU1IoQVNDX0RWQ19WQVIgKik7CitTVEFUSUMgdWludCAgICAgIEFzY0dldE51bU9mRnJlZVF1ZXVlKEFTQ19EVkNfVkFSICosIHVjaGFyLAorICAgICAgICAgICAgICAgICAgICB1Y2hhcik7CitTVEFUSUMgaW50ICAgICAgIEFzY1NnTGlzdFRvUXVldWUoaW50KTsKKyNpZmRlZiBDT05GSUdfSVNBCitTVEFUSUMgdm9pZCAgICAgIEFzY0VuYWJsZUlzYURtYSh1Y2hhcik7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworU1RBVElDIEFTQ19EQ05UICBBc2NHZXRNYXhEbWFDb3VudCh1c2hvcnQpOworCisKKy8qCisgKiAtLS0gQWR2IExpYnJhcnkgQ29uc3RhbnRzIGFuZCBNYWNyb3MKKyAqLworCisjZGVmaW5lIEFEVl9MSUJfVkVSU0lPTl9NQUpPUiAgNQorI2RlZmluZSBBRFZfTElCX1ZFUlNJT05fTUlOT1IgIDE0CisKKy8qCisgKiBEZWZpbmUgQWR2IExpYnJhcnkgcmVxdWlyZWQgc3BlY2lhbCB0eXBlcy4KKyAqLworCisvKgorICogUG9ydGFibGUgRGF0YSBUeXBlcworICoKKyAqIEFueSBpbnN0YW5jZSB3aGVyZSBhIDMyLWJpdCBsb25nIG9yIHBvaW50ZXIgdHlwZSBpcyBhc3N1bWVkCisgKiBmb3IgcHJlY2lzaW9uIG9yIEhXIGRlZmluZWQgc3RydWN0dXJlcywgdGhlIGZvbGxvd2luZyBkZWZpbmUKKyAqIHR5cGVzIG11c3QgYmUgdXNlZC4gSW4gTGludXggdGhlIGNoYXIsIHNob3J0LCBhbmQgaW50IHR5cGVzCisgKiBhcmUgYWxsIGNvbnNpc3RlbnQgYXQgOCwgMTYsIGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gUG9pbnRlcnMKKyAqIGFuZCBsb25nIHR5cGVzIGFyZSA2NCBiaXRzIG9uIEFscGhhIGFuZCBVbHRyYVNQQVJDLgorICovCisjZGVmaW5lIEFEVl9QQUREUiBfX3UzMiAgICAgICAgIC8qIFBoeXNpY2FsIGFkZHJlc3MgZGF0YSB0eXBlLiAqLworI2RlZmluZSBBRFZfVkFERFIgX191MzIgICAgICAgICAvKiBWaXJ0dWFsIGFkZHJlc3MgZGF0YSB0eXBlLiAqLworI2RlZmluZSBBRFZfRENOVCAgX191MzIgICAgICAgICAvKiBVbnNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisjZGVmaW5lIEFEVl9TRENOVCBfX3MzMiAgICAgICAgIC8qIFNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gY29udmVydCBhIHZpcnR1YWwgYWRkcmVzcyB0byBhCisgKiAzMi1iaXQgdmFsdWUuIFRoaXMgY3VycmVudGx5IGNhbiBiZSB1c2VkIG9uIExpbnV4IEFscGhhCisgKiB3aGljaCB1c2VzIDY0LWJpdCB2aXJ0dWFsIGFkZHJlc3MgYnV0IGEgMzItYml0IGJ1cyBhZGRyZXNzLgorICogVGhpcyBpcyBsaWtlbHkgdG8gYnJlYWsgaW4gdGhlIGZ1dHVyZSwgYnV0IGRvaW5nIHRoaXMgbm93CisgKiB3aWxsIGdpdmUgdXMgdGltZSB0byBjaGFuZ2UgdGhlIEhXIGFuZCBGVyB0byBoYW5kbGUgNjQtYml0CisgKiBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUgQURWX1ZBRERSX1RPX1UzMiAgIHZpcnRfdG9fYnVzCisjZGVmaW5lIEFEVl9VMzJfVE9fVkFERFIgICBidXNfdG9fdmlydAorCisjZGVmaW5lIEFkdlBvcnRBZGRyICB1bG9uZyAgICAgICAgICAgICAgLyogVmlydHVhbCBtZW1vcnkgYWRkcmVzcyBzaXplICovCisKKy8qCisgKiBEZWZpbmUgQWR2IExpYnJhcnkgcmVxdWlyZWQgbWVtb3J5IGFjY2VzcyBtYWNyb3MuCisgKi8KKyNkZWZpbmUgQURWX01FTV9SRUFEQihhZGRyKSByZWFkYihhZGRyKQorI2RlZmluZSBBRFZfTUVNX1JFQURXKGFkZHIpIHJlYWR3KGFkZHIpCisjZGVmaW5lIEFEVl9NRU1fV1JJVEVCKGFkZHIsIGJ5dGUpIHdyaXRlYihieXRlLCBhZGRyKQorI2RlZmluZSBBRFZfTUVNX1dSSVRFVyhhZGRyLCB3b3JkKSB3cml0ZXcod29yZCwgYWRkcikKKyNkZWZpbmUgQURWX01FTV9XUklURURXKGFkZHIsIGR3b3JkKSB3cml0ZWwoZHdvcmQsIGFkZHIpCisKKyNkZWZpbmUgQURWX0NBUlJJRVJfQ09VTlQgKEFTQ19ERUZfTUFYX0hPU1RfUU5HICsgMTUpCisKKy8qCisgKiBGb3Igd2lkZSAgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDE2IGJ5dGVzCisgKiBpcyBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgQURWX01BWF9DREJfTEVOICAgICAxNgorCisvKgorICogRGVmaW5lIHRvdGFsIG51bWJlciBvZiBzaW11bHRhbmVvdXMgbWF4aW11bSBlbGVtZW50IHNjYXR0ZXItZ2F0aGVyCisgKiByZXF1ZXN0IGJsb2NrcyBwZXIgd2lkZSBhZGFwdGVyLiBBU0NfREVGX01BWF9IT1NUX1FORyAoMjUzKSBpcyB0aGUKKyAqIG1heGltdW0gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNvbW1hbmRzIHBlciB3aWRlIGhvc3QgYWRhcHRlci4gRWFjaAorICogY29tbWFuZCB1c2VzIG9uZSBvciBtb3JlIEFEVl9TR19CTE9DSyBlYWNoIHdpdGggMTUgc2NhdHRlci1nYXRoZXIKKyAqIGVsZW1lbnRzLiBBbGxvdyBlYWNoIGNvbW1hbmQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKyAqIFRoaXMgYWxsb3dzIGFib3V0IDE1IGNvbW1hbmRzIHRvIGhhdmUgdGhlIG1heGltdW0gMTcgQURWX1NHX0JMT0NLCisgKiBzdHJ1Y3R1cmVzIG9yIDI1NSBzY2F0dGVyLWdhdGhlciBlbGVtZW50cy4KKyAqCisgKi8KKyNkZWZpbmUgQURWX1RPVF9TR19CTE9DSyAgICAgICAgQVNDX0RFRl9NQVhfSE9TVF9RTkcKKworLyoKKyAqIERlZmluZSBBZHYgTGlicmFyeSByZXF1aXJlZCBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyLWdhdGhlcgorICogZWxlbWVudHMgcGVyIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgQURWX01BWF9TR19MSVNUICAgICAgICAgMjU1CisKKy8qIE51bWJlciBvZiBTRyBibG9ja3MgbmVlZGVkLiAqLworI2RlZmluZSBBRFZfTlVNX1NHX0JMT0NLIFwKKyAgICAoKEFEVl9NQVhfU0dfTElTVCArIChOT19PRl9TR19QRVJfQkxPQ0sgLSAxKSkvTk9fT0ZfU0dfUEVSX0JMT0NLKQorCisvKiBUb3RhbCBjb250aWd1b3VzIG1lbW9yeSBuZWVkZWQgZm9yIFNHIGJsb2Nrcy4gKi8KKyNkZWZpbmUgQURWX1NHX1RPVEFMX01FTV9TSVpFIFwKKyAgICAoc2l6ZW9mKEFEVl9TR19CTE9DSykgKiAgQURWX05VTV9TR19CTE9DSykKKworI2RlZmluZSBBRFZfUEFHRV9TSVpFIFBBR0VfU0laRQorCisjZGVmaW5lIEFEVl9OVU1fUEFHRV9DUk9TU0lORyBcCisgICAgKChBRFZfU0dfVE9UQUxfTUVNX1NJWkUgKyAoQURWX1BBR0VfU0laRSAtIDEpKS9BRFZfUEFHRV9TSVpFKQorCisvKiBhX2NvbmRvci5oICovCisjZGVmaW5lIEFEVl9QQ0lfVkVORE9SX0lEICAgICAgICAgICAgICAgMHgxMENECisjZGVmaW5lIEFEVl9QQ0lfREVWSUNFX0lEX1JFVl9BICAgICAgICAgMHgyMzAwCisjZGVmaW5lIEFEVl9QQ0lfREVWSURfMzhDMDgwMF9SRVYxICAgICAgMHgyNTAwCisjZGVmaW5lIEFEVl9QQ0lfREVWSURfMzhDMTYwMF9SRVYxICAgICAgMHgyNzAwCisKKyNkZWZpbmUgQURWX0VFUF9EVkNfQ0ZHX0JFR0lOICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgQURWX0VFUF9EVkNfQ0ZHX0VORCAgICAgICAgICAgICAoMHgxNSkKKyNkZWZpbmUgQURWX0VFUF9EVkNfQ1RMX0JFR0lOICAgICAgICAgICAoMHgxNikgIC8qIGxvY2F0aW9uIG9mIE9FTSBuYW1lICovCisjZGVmaW5lIEFEVl9FRVBfTUFYX1dPUkRfQUREUiAgICAgICAgICAgKDB4MUUpCisKKyNkZWZpbmUgQURWX0VFUF9ERUxBWV9NUyAgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBBRFZfRUVQUk9NX0JJR19FTkRJQU4gICAgICAgICAgMHg4MDAwICAgLyogRUVQUk9NIEJpdCAxNSAqLworI2RlZmluZSBBRFZfRUVQUk9NX0JJT1NfRU5BQkxFICAgICAgICAgMHg0MDAwICAgLyogRUVQUk9NIEJpdCAxNCAqLworLyoKKyAqIEZvciB0aGUgQVNDMzU1MCBCaXQgMTMgaXMgVGVybWluYXRpb24gUG9sYXJpdHkgY29udHJvbCBiaXQuCisgKiBGb3IgbGF0ZXIgSUNzIEJpdCAxMyBjb250cm9scyB3aGV0aGVyIHRoZSBDSVMgKENhcmQgSW5mb3JtYXRpb24KKyAqIFNlcnZpY2UgU2VjdGlvbikgaXMgbG9hZGVkIGZyb20gRUVQUk9NLgorICovCisjZGVmaW5lIEFEVl9FRVBST01fVEVSTV9QT0wgICAgICAgICAgICAweDIwMDAgICAvKiBFRVBST00gQml0IDEzICovCisjZGVmaW5lIEFEVl9FRVBST01fQ0lTX0xEICAgICAgICAgICAgICAweDIwMDAgICAvKiBFRVBST00gQml0IDEzICovCisvKgorICogQVNDMzhDMTYwMCBCaXQgMTEKKyAqCisgKiBJZiBFRVBST00gQml0IDExIGlzIDAgZm9yIEZ1bmN0aW9uIDAsIHRoZW4gRnVuY3Rpb24gMCB3aWxsIHNwZWNpZnkKKyAqIElOVCBBIGluIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBJbnQgUGluIGZpZWxkLiBJZiBpdCBpcyAxLCB0aGVuCisgKiBGdW5jdGlvbiAwIHdpbGwgc3BlY2lmeSBJTlQgQi4KKyAqCisgKiBJZiBFRVBST00gQml0IDExIGlzIDAgZm9yIEZ1bmN0aW9uIDEsIHRoZW4gRnVuY3Rpb24gMSB3aWxsIHNwZWNpZnkKKyAqIElOVCBCIGluIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBJbnQgUGluIGZpZWxkLiBJZiBpdCBpcyAxLCB0aGVuCisgKiBGdW5jdGlvbiAxIHdpbGwgc3BlY2lmeSBJTlQgQS4KKyAqLworI2RlZmluZSBBRFZfRUVQUk9NX0lOVEFCICAgICAgICAgICAgICAgMHgwODAwICAgLyogRUVQUk9NIEJpdCAxMSAqLworCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzU1MF9jb25maWcKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCisKKyAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMyBzZXQgLSBUZXJtIFBvbGFyaXR5IENvbnRyb2wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLworICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgICAgICAqLworICB1c2hvcnQgZGlzY19lbmFibGU7ICAgICAgICAgICAvKiAwMiBkaXNjb25uZWN0IGVuYWJsZSAqLworICB1c2hvcnQgd2R0cl9hYmxlOyAgICAgICAgICAgICAvKiAwMyBXaWRlIERUUiBhYmxlICovCisgIHVzaG9ydCBzZHRyX2FibGU7ICAgICAgICAgICAgIC8qIDA0IFN5bmNocm9ub3VzIERUUiBhYmxlICovCisgIHVzaG9ydCBzdGFydF9tb3RvcjsgICAgICAgICAgIC8qIDA1IHNlbmQgc3RhcnQgdXAgbW90b3IgKi8KKyAgdXNob3J0IHRhZ3FuZ19hYmxlOyAgICAgICAgICAgLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLworICB1c2hvcnQgYmlvc19zY2FuOyAgICAgICAgICAgICAvKiAwNyBCSU9TIGRldmljZSBjb250cm9sICovCisgIHVzaG9ydCBzY2FtX3RvbGVyYW50OyAgICAgICAgIC8qIDA4IG5vIHNjYW0gKi8KKworICB1Y2hhciAgYWRhcHRlcl9zY3NpX2lkOyAgICAgICAvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KKyAgdWNoYXIgIGJpb3NfYm9vdF9kZWxheTsgICAgICAgLyogICAgcG93ZXIgdXAgd2FpdCAqLworCisgIHVjaGFyICBzY3NpX3Jlc2V0X2RlbGF5OyAgICAgIC8qIDEwIHJlc2V0IGRlbGF5ICovCisgIHVjaGFyICBiaW9zX2lkX2x1bjsgICAgICAgICAgIC8qICAgIGZpcnN0IGJvb3QgZGV2aWNlIHNjc2kgaWQgJiBsdW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgaGlnaCBuaWJibGUgaXMgbHVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGxvdyBuaWJibGUgaXMgc2NzaSBpZCAqLworCisgIHVjaGFyICB0ZXJtaW5hdGlvbjsgICAgICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCisgIHVjaGFyICByZXNlcnZlZDE7ICAgICAgICAgICAgIC8qICAgIHJlc2VydmVkIGJ5dGUgKG5vdCB1c2VkKSAqLworCisgIHVzaG9ydCBiaW9zX2N0cmw7ICAgICAgICAgICAgIC8qIDEyIEJJT1MgY29udHJvbCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEgIEJJT1MgPiAxIEdCIHN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAyICBCSU9TID4gMiBEaXNrIFN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDQgIEJJT1Mgc3VwcG9ydCBib290YWJsZSBDRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDUgIEJJT1Mgc2NhbiBlbmFibGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA3ICBCSU9TIGRpc3BsYXkgb2YgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDggIFNDQU0gZGlzYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNSAqLworICB1c2hvcnQgIHVsdHJhX2FibGU7ICAgICAgICAgICAvKiAxMyBVTFRSQSBzcGVlZCBhYmxlICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQyOyAgICAgICAgICAgIC8qIDE0IHJlc2VydmVkICovCisgIHVjaGFyICAgbWF4X2hvc3RfcW5nOyAgICAgICAgIC8qIDE1IG1heGltdW0gaG9zdCBxdWV1aW5nICovCisgIHVjaGFyICAgbWF4X2R2Y19xbmc7ICAgICAgICAgIC8qICAgIG1heGltdW0gcGVyIGRldmljZSBxdWV1aW5nICovCisgIHVzaG9ydCAgZHZjX2NudGw7ICAgICAgICAgICAgIC8qIDE2IGNvbnRyb2wgYml0IGZvciBkcml2ZXIgKi8KKyAgdXNob3J0ICBidWdfZml4OyAgICAgICAgICAgICAgLyogMTcgY29udHJvbCBiaXQgZm9yIGJ1ZyBmaXggKi8KKyAgdXNob3J0ICBzZXJpYWxfbnVtYmVyX3dvcmQxOyAgLyogMTggQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDEgKi8KKyAgdXNob3J0ICBzZXJpYWxfbnVtYmVyX3dvcmQyOyAgLyogMTkgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDIgKi8KKyAgdXNob3J0ICBzZXJpYWxfbnVtYmVyX3dvcmQzOyAgLyogMjAgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDMgKi8KKyAgdXNob3J0ICBjaGVja19zdW07ICAgICAgICAgICAgLyogMjEgRUVQIGNoZWNrIHN1bSAqLworICB1Y2hhciAgIG9lbV9uYW1lWzE2XTsgICAgICAgICAvKiAyMiBPRU0gbmFtZSAqLworICB1c2hvcnQgIGR2Y19lcnJfY29kZTsgICAgICAgICAvKiAzMCBsYXN0IGRldmljZSBkcml2ZXIgZXJyb3IgY29kZSAqLworICB1c2hvcnQgIGFkdl9lcnJfY29kZTsgICAgICAgICAvKiAzMSBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKyAgdXNob3J0ICBhZHZfZXJyX2FkZHI7ICAgICAgICAgLyogMzIgbGFzdCB1YyBlcnJvciBhZGRyZXNzICovCisgIHVzaG9ydCAgc2F2ZWRfZHZjX2Vycl9jb2RlOyAgIC8qIDMzIHNhdmVkIGxhc3QgZGV2LiBkcml2ZXIgZXJyb3IgY29kZSAgICovCisgIHVzaG9ydCAgc2F2ZWRfYWR2X2Vycl9jb2RlOyAgIC8qIDM0IHNhdmVkIGxhc3QgdWMgYW5kIEFkdiBMaWIgZXJyb3IgY29kZSAqLworICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfYWRkcjsgICAvKiAzNSBzYXZlZCBsYXN0IHVjIGVycm9yIGFkZHJlc3MgICAgICAgICAqLworICB1c2hvcnQgIG51bV9vZl9lcnI7ICAgICAgICAgICAvKiAzNiBudW1iZXIgb2YgZXJyb3IgKi8KK30gQURWRUVQXzM1NTBfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzhDMDgwMF9jb25maWcKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCisKKyAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMyBzZXQgLSBMb2FkIENJUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE0IHNldCAtIEJJT1MgRW5hYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTUgc2V0IC0gQmlnIEVuZGlhbiBNb2RlICovCisgIHVzaG9ydCBjZmdfbXN3OyAgICAgICAgICAgICAgIC8qIDAxIHVudXNlZCAgICAgICovCisgIHVzaG9ydCBkaXNjX2VuYWJsZTsgICAgICAgICAgIC8qIDAyIGRpc2Nvbm5lY3QgZW5hYmxlICovCisgIHVzaG9ydCB3ZHRyX2FibGU7ICAgICAgICAgICAgIC8qIDAzIFdpZGUgRFRSIGFibGUgKi8KKyAgdXNob3J0IHNkdHJfc3BlZWQxOyAgICAgICAgICAgLyogMDQgU0RUUiBTcGVlZCBUSUQgMC0zICovCisgIHVzaG9ydCBzdGFydF9tb3RvcjsgICAgICAgICAgIC8qIDA1IHNlbmQgc3RhcnQgdXAgbW90b3IgKi8KKyAgdXNob3J0IHRhZ3FuZ19hYmxlOyAgICAgICAgICAgLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLworICB1c2hvcnQgYmlvc19zY2FuOyAgICAgICAgICAgICAvKiAwNyBCSU9TIGRldmljZSBjb250cm9sICovCisgIHVzaG9ydCBzY2FtX3RvbGVyYW50OyAgICAgICAgIC8qIDA4IG5vIHNjYW0gKi8KKworICB1Y2hhciAgYWRhcHRlcl9zY3NpX2lkOyAgICAgICAvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KKyAgdWNoYXIgIGJpb3NfYm9vdF9kZWxheTsgICAgICAgLyogICAgcG93ZXIgdXAgd2FpdCAqLworCisgIHVjaGFyICBzY3NpX3Jlc2V0X2RlbGF5OyAgICAgIC8qIDEwIHJlc2V0IGRlbGF5ICovCisgIHVjaGFyICBiaW9zX2lkX2x1bjsgICAgICAgICAgIC8qICAgIGZpcnN0IGJvb3QgZGV2aWNlIHNjc2kgaWQgJiBsdW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgaGlnaCBuaWJibGUgaXMgbHVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGxvdyBuaWJibGUgaXMgc2NzaSBpZCAqLworCisgIHVjaGFyICB0ZXJtaW5hdGlvbl9zZTsgICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCisgIHVjaGFyICB0ZXJtaW5hdGlvbl9sdmQ7ICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCisgIHVzaG9ydCBiaW9zX2N0cmw7ICAgICAgICAgICAgIC8qIDEyIEJJT1MgY29udHJvbCBiaXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEgIEJJT1MgPiAxIEdCIHN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAyICBCSU9TID4gMiBEaXNrIFN1cHBvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDQgIEJJT1Mgc3VwcG9ydCBib290YWJsZSBDRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDUgIEJJT1Mgc2NhbiBlbmFibGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA3ICBCSU9TIGRpc3BsYXkgb2YgbWVzc2FnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDggIFNDQU0gZGlzYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNSAqLworICB1c2hvcnQgIHNkdHJfc3BlZWQyOyAgICAgICAgICAvKiAxMyBTRFRSIHNwZWVkIFRJRCA0LTcgKi8KKyAgdXNob3J0ICBzZHRyX3NwZWVkMzsgICAgICAgICAgLyogMTQgU0RUUiBzcGVlZCBUSUQgOC0xMSAqLworICB1Y2hhciAgIG1heF9ob3N0X3FuZzsgICAgICAgICAvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWVpbmcgKi8KKyAgdWNoYXIgICBtYXhfZHZjX3FuZzsgICAgICAgICAgLyogICAgbWF4aW11bSBwZXIgZGV2aWNlIHF1ZXVpbmcgKi8KKyAgdXNob3J0ICBkdmNfY250bDsgICAgICAgICAgICAgLyogMTYgY29udHJvbCBiaXQgZm9yIGRyaXZlciAqLworICB1c2hvcnQgIHNkdHJfc3BlZWQ0OyAgICAgICAgICAvKiAxNyBTRFRSIHNwZWVkIDQgVElEIDEyLTE1ICovCisgIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMTsgIC8qIDE4IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAxICovCisgIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMjsgIC8qIDE5IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAyICovCisgIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMzsgIC8qIDIwIEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAzICovCisgIHVzaG9ydCAgY2hlY2tfc3VtOyAgICAgICAgICAgIC8qIDIxIEVFUCBjaGVjayBzdW0gKi8KKyAgdWNoYXIgICBvZW1fbmFtZVsxNl07ICAgICAgICAgLyogMjIgT0VNIG5hbWUgKi8KKyAgdXNob3J0ICBkdmNfZXJyX2NvZGU7ICAgICAgICAgLyogMzAgbGFzdCBkZXZpY2UgZHJpdmVyIGVycm9yIGNvZGUgKi8KKyAgdXNob3J0ICBhZHZfZXJyX2NvZGU7ICAgICAgICAgLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCisgIHVzaG9ydCAgYWR2X2Vycl9hZGRyOyAgICAgICAgIC8qIDMyIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAqLworICB1c2hvcnQgIHNhdmVkX2R2Y19lcnJfY29kZTsgICAvKiAzMyBzYXZlZCBsYXN0IGRldi4gZHJpdmVyIGVycm9yIGNvZGUgICAqLworICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfY29kZTsgICAvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKyAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2FkZHI7ICAgLyogMzUgc2F2ZWQgbGFzdCB1YyBlcnJvciBhZGRyZXNzICAgICAgICAgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM2OyAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM3OyAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM4OyAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDM5OyAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQwOyAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQxOyAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQyOyAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQzOyAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ0OyAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ1OyAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ2OyAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ3OyAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ4OyAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDQ5OyAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUwOyAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUxOyAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUyOyAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDUzOyAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDU0OyAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDU1OyAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICBjaXNwdHJfbHN3OyAgICAgICAgICAgLyogNTYgQ0lTIFBUUiBMU1cgKi8KKyAgdXNob3J0ICBjaXNwcnRfbXN3OyAgICAgICAgICAgLyogNTcgQ0lTIFBUUiBNU1cgKi8KKyAgdXNob3J0ICBzdWJzeXN2aWQ7ICAgICAgICAgICAgLyogNTggU3ViU3lzdGVtIFZlbmRvciBJRCAqLworICB1c2hvcnQgIHN1YnN5c2lkOyAgICAgICAgICAgICAvKiA1OSBTdWJTeXN0ZW0gSUQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYwOyAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYxOyAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYyOyAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KKyAgdXNob3J0ICByZXNlcnZlZDYzOyAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK30gQURWRUVQXzM4QzA4MDBfQ09ORklHOworCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzhDMTYwMF9jb25maWcKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCisKKyAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMSBzZXQgLSBGdW5jLiAwIElOVEIsIEZ1bmMuIDEgSU5UQSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBjbGVhciAtIEZ1bmMuIDAgSU5UQSwgRnVuYy4gMSBJTlRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTMgc2V0IC0gTG9hZCBDSVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLworICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgKi8KKyAgdXNob3J0IGRpc2NfZW5hYmxlOyAgICAgICAgICAgLyogMDIgZGlzY29ubmVjdCBlbmFibGUgKi8KKyAgdXNob3J0IHdkdHJfYWJsZTsgICAgICAgICAgICAgLyogMDMgV2lkZSBEVFIgYWJsZSAqLworICB1c2hvcnQgc2R0cl9zcGVlZDE7ICAgICAgICAgICAvKiAwNCBTRFRSIFNwZWVkIFRJRCAwLTMgKi8KKyAgdXNob3J0IHN0YXJ0X21vdG9yOyAgICAgICAgICAgLyogMDUgc2VuZCBzdGFydCB1cCBtb3RvciAqLworICB1c2hvcnQgdGFncW5nX2FibGU7ICAgICAgICAgICAvKiAwNiB0YWcgcXVldWluZyBhYmxlICovCisgIHVzaG9ydCBiaW9zX3NjYW47ICAgICAgICAgICAgIC8qIDA3IEJJT1MgZGV2aWNlIGNvbnRyb2wgKi8KKyAgdXNob3J0IHNjYW1fdG9sZXJhbnQ7ICAgICAgICAgLyogMDggbm8gc2NhbSAqLworCisgIHVjaGFyICBhZGFwdGVyX3Njc2lfaWQ7ICAgICAgIC8qIDA5IEhvc3QgQWRhcHRlciBJRCAqLworICB1Y2hhciAgYmlvc19ib290X2RlbGF5OyAgICAgICAvKiAgICBwb3dlciB1cCB3YWl0ICovCisKKyAgdWNoYXIgIHNjc2lfcmVzZXRfZGVsYXk7ICAgICAgLyogMTAgcmVzZXQgZGVsYXkgKi8KKyAgdWNoYXIgIGJpb3NfaWRfbHVuOyAgICAgICAgICAgLyogICAgZmlyc3QgYm9vdCBkZXZpY2Ugc2NzaSBpZCAmIGx1biAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBoaWdoIG5pYmJsZSBpcyBsdW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgbG93IG5pYmJsZSBpcyBzY3NpIGlkICovCisKKyAgdWNoYXIgIHRlcm1pbmF0aW9uX3NlOyAgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisKKyAgdWNoYXIgIHRlcm1pbmF0aW9uX2x2ZDsgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisKKyAgdXNob3J0IGJpb3NfY3RybDsgICAgICAgICAgICAgLyogMTIgQklPUyBjb250cm9sIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAwICBCSU9TIGRvbid0IGFjdCBhcyBpbml0aWF0b3IuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMSAgQklPUyA+IDEgR0Igc3VwcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDIgIEJJT1MgPiAyIERpc2sgU3VwcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDMgIEJJT1MgZG9uJ3Qgc3VwcG9ydCByZW1vdmFibGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNCAgQklPUyBzdXBwb3J0IGJvb3RhYmxlIENEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNSAgQklPUyBzY2FuIGVuYWJsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA2ICBCSU9TIHN1cHBvcnQgbXVsdGlwbGUgTFVOcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDcgIEJJT1MgZGlzcGxheSBvZiBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgOCAgU0NBTSBkaXNhYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDkgIFJlc2V0IFNDU0kgYnVzIGR1cmluZyBpbml0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEwIEJhc2ljIEludGVncml0eSBDaGVja2luZyBkaXNhYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzIEFJUFAgKEFzeW4uIEluZm8uIFBoLiBQcm90LikgZGlzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTUgKi8KKyAgdXNob3J0ICBzZHRyX3NwZWVkMjsgICAgICAgICAgLyogMTMgU0RUUiBzcGVlZCBUSUQgNC03ICovCisgIHVzaG9ydCAgc2R0cl9zcGVlZDM7ICAgICAgICAgIC8qIDE0IFNEVFIgc3BlZWQgVElEIDgtMTEgKi8KKyAgdWNoYXIgICBtYXhfaG9zdF9xbmc7ICAgICAgICAgLyogMTUgbWF4aW11bSBob3N0IHF1ZXVlaW5nICovCisgIHVjaGFyICAgbWF4X2R2Y19xbmc7ICAgICAgICAgIC8qICAgIG1heGltdW0gcGVyIGRldmljZSBxdWV1aW5nICovCisgIHVzaG9ydCAgZHZjX2NudGw7ICAgICAgICAgICAgIC8qIDE2IGNvbnRyb2wgYml0IGZvciBkcml2ZXIgKi8KKyAgdXNob3J0ICBzZHRyX3NwZWVkNDsgICAgICAgICAgLyogMTcgU0RUUiBzcGVlZCA0IFRJRCAxMi0xNSAqLworICB1c2hvcnQgIHNlcmlhbF9udW1iZXJfd29yZDE7ICAvKiAxOCBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMSAqLworICB1c2hvcnQgIHNlcmlhbF9udW1iZXJfd29yZDI7ICAvKiAxOSBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMiAqLworICB1c2hvcnQgIHNlcmlhbF9udW1iZXJfd29yZDM7ICAvKiAyMCBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMyAqLworICB1c2hvcnQgIGNoZWNrX3N1bTsgICAgICAgICAgICAvKiAyMSBFRVAgY2hlY2sgc3VtICovCisgIHVjaGFyICAgb2VtX25hbWVbMTZdOyAgICAgICAgIC8qIDIyIE9FTSBuYW1lICovCisgIHVzaG9ydCAgZHZjX2Vycl9jb2RlOyAgICAgICAgIC8qIDMwIGxhc3QgZGV2aWNlIGRyaXZlciBlcnJvciBjb2RlICovCisgIHVzaG9ydCAgYWR2X2Vycl9jb2RlOyAgICAgICAgIC8qIDMxIGxhc3QgdWMgYW5kIEFkdiBMaWIgZXJyb3IgY29kZSAqLworICB1c2hvcnQgIGFkdl9lcnJfYWRkcjsgICAgICAgICAvKiAzMiBsYXN0IHVjIGVycm9yIGFkZHJlc3MgKi8KKyAgdXNob3J0ICBzYXZlZF9kdmNfZXJyX2NvZGU7ICAgLyogMzMgc2F2ZWQgbGFzdCBkZXYuIGRyaXZlciBlcnJvciBjb2RlICAgKi8KKyAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2NvZGU7ICAgLyogMzQgc2F2ZWQgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCisgIHVzaG9ydCAgc2F2ZWRfYWR2X2Vycl9hZGRyOyAgIC8qIDM1IHNhdmVkIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAgICAgICAgICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzNjsgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzNzsgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzODsgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQzOTsgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MDsgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MTsgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MjsgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0MzsgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NDsgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NTsgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NjsgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0NzsgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0ODsgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ0OTsgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MDsgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MTsgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MjsgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1MzsgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1NDsgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ1NTsgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCisgIHVzaG9ydCAgY2lzcHRyX2xzdzsgICAgICAgICAgIC8qIDU2IENJUyBQVFIgTFNXICovCisgIHVzaG9ydCAgY2lzcHJ0X21zdzsgICAgICAgICAgIC8qIDU3IENJUyBQVFIgTVNXICovCisgIHVzaG9ydCAgc3Vic3lzdmlkOyAgICAgICAgICAgIC8qIDU4IFN1YlN5c3RlbSBWZW5kb3IgSUQgKi8KKyAgdXNob3J0ICBzdWJzeXNpZDsgICAgICAgICAgICAgLyogNTkgU3ViU3lzdGVtIElEICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MDsgICAgICAgICAgIC8qIDYwIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MTsgICAgICAgICAgIC8qIDYxIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MjsgICAgICAgICAgIC8qIDYyIHJlc2VydmVkICovCisgIHVzaG9ydCAgcmVzZXJ2ZWQ2MzsgICAgICAgICAgIC8qIDYzIHJlc2VydmVkICovCit9IEFEVkVFUF8zOEMxNjAwX0NPTkZJRzsKKworLyoKKyAqIEVFUFJPTSBDb21tYW5kcworICovCisjZGVmaW5lIEFTQ19FRVBfQ01EX0RPTkUgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEFTQ19FRVBfQ01EX0RPTkVfRVJSICAgICAgICAgMHgwMDAxCisKKy8qIGNmZ193b3JkICovCisjZGVmaW5lIEVFUF9DRkdfV09SRF9CSUdfRU5ESUFOICAgICAgMHg4MDAwCisKKy8qIGJpb3NfY3RybCAqLworI2RlZmluZSBCSU9TX0NUUkxfQklPUyAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBCSU9TX0NUUkxfRVhURU5ERURfWExBVCAgICAgIDB4MDAwMgorI2RlZmluZSBCSU9TX0NUUkxfR1RfMl9ESVNLICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBCSU9TX0NUUkxfQklPU19SRU1PVkFCTEUgICAgIDB4MDAwOAorI2RlZmluZSBCSU9TX0NUUkxfQk9PVEFCTEVfQ0QgICAgICAgIDB4MDAxMAorI2RlZmluZSBCSU9TX0NUUkxfTVVMVElQTEVfTFVOICAgICAgIDB4MDA0MAorI2RlZmluZSBCSU9TX0NUUkxfRElTUExBWV9NU0cgICAgICAgIDB4MDA4MAorI2RlZmluZSBCSU9TX0NUUkxfTk9fU0NBTSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMgICAgIDB4MDIwMAorI2RlZmluZSBCSU9TX0NUUkxfSU5JVF9WRVJCT1NFICAgICAgIDB4MDgwMAorI2RlZmluZSBCSU9TX0NUUkxfU0NTSV9QQVJJVFkgICAgICAgIDB4MTAwMAorI2RlZmluZSBCSU9TX0NUUkxfQUlQUF9ESVMgICAgICAgICAgIDB4MjAwMAorCisjZGVmaW5lIEFEVl8zNTUwX01FTVNJWkUgICAweDIwMDAgICAgICAgLyogOCBLQiBJbnRlcm5hbCBNZW1vcnkgKi8KKyNkZWZpbmUgQURWXzM1NTBfSU9MRU4gICAgIDB4NDAgICAgICAgICAvKiBJL08gUG9ydCBSYW5nZSBpbiBieXRlcyAqLworCisjZGVmaW5lIEFEVl8zOEMwODAwX01FTVNJWkUgIDB4NDAwMCAgICAgLyogMTYgS0IgSW50ZXJuYWwgTWVtb3J5ICovCisjZGVmaW5lIEFEVl8zOEMwODAwX0lPTEVOICAgIDB4MTAwICAgICAgLyogSS9PIFBvcnQgUmFuZ2UgaW4gYnl0ZXMgKi8KKworLyoKKyAqIFhYWCAtIFNpbmNlIEFTQzM4QzE2MDAgUmV2LjMgaGFzIGEgbG9jYWwgUkFNIGZhaWx1cmUgaXNzdWUsIHRoZXJlIGlzCisgKiBhIHNwZWNpYWwgMTZLIEFkdiBMaWJyYXJ5IGFuZCBNaWNyb2NvZGUgdmVyc2lvbi4gQWZ0ZXIgdGhlIGlzc3VlIGlzCisgKiByZXNvbHZlZCwgc2hvdWxkIHJlc3RvcmUgMzJLIHN1cHBvcnQuCisgKgorICogI2RlZmluZSBBRFZfMzhDMTYwMF9NRU1TSVpFICAweDgwMDBMICAgKiAzMiBLQiBJbnRlcm5hbCBNZW1vcnkgKgorICovCisjZGVmaW5lIEFEVl8zOEMxNjAwX01FTVNJWkUgIDB4NDAwMCAgIC8qIDE2IEtCIEludGVybmFsIE1lbW9yeSAqLworI2RlZmluZSBBRFZfMzhDMTYwMF9JT0xFTiAgICAweDEwMCAgICAgLyogSS9PIFBvcnQgUmFuZ2UgMjU2IGJ5dGVzICovCisjZGVmaW5lIEFEVl8zOEMxNjAwX01FTUxFTiAgIDB4MTAwMCAgICAvKiBNZW1vcnkgUmFuZ2UgNEtCIGJ5dGVzICovCisKKy8qCisgKiBCeXRlIEkvTyByZWdpc3RlciBhZGRyZXNzIGZyb20gYmFzZSBvZiAnaW9wX2Jhc2UnLgorICovCisjZGVmaW5lIElPUEJfSU5UUl9TVEFUVVNfUkVHICAgIDB4MDAKKyNkZWZpbmUgSU9QQl9DSElQX0lEXzEgICAgICAgICAgMHgwMQorI2RlZmluZSBJT1BCX0lOVFJfRU5BQkxFUyAgICAgICAweDAyCisjZGVmaW5lIElPUEJfQ0hJUF9UWVBFX1JFViAgICAgIDB4MDMKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl80ICAgICAgICAgMHgwNAorI2RlZmluZSBJT1BCX1JFU19BRERSXzUgICAgICAgICAweDA1CisjZGVmaW5lIElPUEJfUkFNX0RBVEEgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl83ICAgICAgICAgMHgwNworI2RlZmluZSBJT1BCX0ZMQUdfUkVHICAgICAgICAgICAweDA4CisjZGVmaW5lIElPUEJfUkVTX0FERFJfOSAgICAgICAgIDB4MDkKKyNkZWZpbmUgSU9QQl9SSVNDX0NTUiAgICAgICAgICAgMHgwQQorI2RlZmluZSBJT1BCX1JFU19BRERSX0IgICAgICAgICAweDBCCisjZGVmaW5lIElPUEJfUkVTX0FERFJfQyAgICAgICAgIDB4MEMKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl9EICAgICAgICAgMHgwRAorI2RlZmluZSBJT1BCX1NPRlRfT1ZFUl9XUiAgICAgICAweDBFCisjZGVmaW5lIElPUEJfUkVTX0FERFJfRiAgICAgICAgIDB4MEYKKyNkZWZpbmUgSU9QQl9NRU1fQ0ZHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBJT1BCX1JFU19BRERSXzExICAgICAgICAweDExCisjZGVmaW5lIElPUEJfR1BJT19EQVRBICAgICAgICAgIDB4MTIKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xMyAgICAgICAgMHgxMworI2RlZmluZSBJT1BCX0ZMQVNIX1BBR0UgICAgICAgICAweDE0CisjZGVmaW5lIElPUEJfUkVTX0FERFJfMTUgICAgICAgIDB4MTUKKyNkZWZpbmUgSU9QQl9HUElPX0NOVEwgICAgICAgICAgMHgxNgorI2RlZmluZSBJT1BCX1JFU19BRERSXzE3ICAgICAgICAweDE3CisjZGVmaW5lIElPUEJfRkxBU0hfREFUQSAgICAgICAgIDB4MTgKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xOSAgICAgICAgMHgxOQorI2RlZmluZSBJT1BCX1JFU19BRERSXzFBICAgICAgICAweDFBCisjZGVmaW5lIElPUEJfUkVTX0FERFJfMUIgICAgICAgIDB4MUIKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xQyAgICAgICAgMHgxQworI2RlZmluZSBJT1BCX1JFU19BRERSXzFEICAgICAgICAweDFECisjZGVmaW5lIElPUEJfUkVTX0FERFJfMUUgICAgICAgIDB4MUUKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8xRiAgICAgICAgMHgxRgorI2RlZmluZSBJT1BCX0RNQV9DRkcwICAgICAgICAgICAweDIwCisjZGVmaW5lIElPUEJfRE1BX0NGRzEgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgSU9QQl9USUNLTEUgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBJT1BCX0RNQV9SRUdfV1IgICAgICAgICAweDIzCisjZGVmaW5lIElPUEJfU0RNQV9TVEFUVVMgICAgICAgIDB4MjQKKyNkZWZpbmUgSU9QQl9TQ1NJX0JZVEVfQ05UICAgICAgMHgyNQorI2RlZmluZSBJT1BCX0hPU1RfQllURV9DTlQgICAgICAweDI2CisjZGVmaW5lIElPUEJfQllURV9MRUZUX1RPX1hGRVIgIDB4MjcKKyNkZWZpbmUgSU9QQl9CWVRFX1RPX1hGRVJfMCAgICAgMHgyOAorI2RlZmluZSBJT1BCX0JZVEVfVE9fWEZFUl8xICAgICAweDI5CisjZGVmaW5lIElPUEJfQllURV9UT19YRkVSXzIgICAgIDB4MkEKKyNkZWZpbmUgSU9QQl9CWVRFX1RPX1hGRVJfMyAgICAgMHgyQgorI2RlZmluZSBJT1BCX0FDQ19HUlAgICAgICAgICAgICAweDJDCisjZGVmaW5lIElPUEJfUkVTX0FERFJfMkQgICAgICAgIDB4MkQKKyNkZWZpbmUgSU9QQl9ERVZfSUQgICAgICAgICAgICAgMHgyRQorI2RlZmluZSBJT1BCX1JFU19BRERSXzJGICAgICAgICAweDJGCisjZGVmaW5lIElPUEJfU0NTSV9EQVRBICAgICAgICAgIDB4MzAKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8zMSAgICAgICAgMHgzMQorI2RlZmluZSBJT1BCX1JFU19BRERSXzMyICAgICAgICAweDMyCisjZGVmaW5lIElPUEJfU0NTSV9EQVRBX0hTSEsgICAgIDB4MzMKKyNkZWZpbmUgSU9QQl9TQ1NJX0NUUkwgICAgICAgICAgMHgzNAorI2RlZmluZSBJT1BCX1JFU19BRERSXzM1ICAgICAgICAweDM1CisjZGVmaW5lIElPUEJfUkVTX0FERFJfMzYgICAgICAgIDB4MzYKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8zNyAgICAgICAgMHgzNworI2RlZmluZSBJT1BCX1JBTV9CSVNUICAgICAgICAgICAweDM4CisjZGVmaW5lIElPUEJfUExMX1RFU1QgICAgICAgICAgIDB4MzkKKyNkZWZpbmUgSU9QQl9QQ0lfSU5UX0NGRyAgICAgICAgMHgzQQorI2RlZmluZSBJT1BCX1JFU19BRERSXzNCICAgICAgICAweDNCCisjZGVmaW5lIElPUEJfUkZJRk9fQ05UICAgICAgICAgIDB4M0MKKyNkZWZpbmUgSU9QQl9SRVNfQUREUl8zRCAgICAgICAgMHgzRAorI2RlZmluZSBJT1BCX1JFU19BRERSXzNFICAgICAgICAweDNFCisjZGVmaW5lIElPUEJfUkVTX0FERFJfM0YgICAgICAgIDB4M0YKKworLyoKKyAqIFdvcmQgSS9PIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBiYXNlIG9mICdpb3BfYmFzZScuCisgKi8KKyNkZWZpbmUgSU9QV19DSElQX0lEXzAgICAgICAgICAgMHgwMCAgLyogQ0lEMCAgKi8KKyNkZWZpbmUgSU9QV19DVFJMX1JFRyAgICAgICAgICAgMHgwMiAgLyogQ0MgICAgKi8KKyNkZWZpbmUgSU9QV19SQU1fQUREUiAgICAgICAgICAgMHgwNCAgLyogTEEgICAgKi8KKyNkZWZpbmUgSU9QV19SQU1fREFUQSAgICAgICAgICAgMHgwNiAgLyogTEQgICAgKi8KKyNkZWZpbmUgSU9QV19SRVNfQUREUl8wOCAgICAgICAgMHgwOAorI2RlZmluZSBJT1BXX1JJU0NfQ1NSICAgICAgICAgICAweDBBICAvKiBDU1IgICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ0ZHMCAgICAgICAgICAweDBDICAvKiBDRkcwICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ0ZHMSAgICAgICAgICAweDBFICAvKiBDRkcxICAqLworI2RlZmluZSBJT1BXX1JFU19BRERSXzEwICAgICAgICAweDEwCisjZGVmaW5lIElPUFdfU0VMX01BU0sgICAgICAgICAgIDB4MTIgIC8qIFNNICAgICovCisjZGVmaW5lIElPUFdfUkVTX0FERFJfMTQgICAgICAgIDB4MTQKKyNkZWZpbmUgSU9QV19GTEFTSF9BRERSICAgICAgICAgMHgxNiAgLyogRkEgICAgKi8KKyNkZWZpbmUgSU9QV19SRVNfQUREUl8xOCAgICAgICAgMHgxOAorI2RlZmluZSBJT1BXX0VFX0NNRCAgICAgICAgICAgICAweDFBICAvKiBFQyAgICAqLworI2RlZmluZSBJT1BXX0VFX0RBVEEgICAgICAgICAgICAweDFDICAvKiBFRCAgICAqLworI2RlZmluZSBJT1BXX1NGSUZPX0NOVCAgICAgICAgICAweDFFICAvKiBTRkMgICAqLworI2RlZmluZSBJT1BXX1JFU19BRERSXzIwICAgICAgICAweDIwCisjZGVmaW5lIElPUFdfUV9CQVNFICAgICAgICAgICAgIDB4MjIgIC8qIFFCICAgICovCisjZGVmaW5lIElPUFdfUVAgICAgICAgICAgICAgICAgIDB4MjQgIC8qIFFQICAgICovCisjZGVmaW5lIElPUFdfSVggICAgICAgICAgICAgICAgIDB4MjYgIC8qIElYICAgICovCisjZGVmaW5lIElPUFdfU1AgICAgICAgICAgICAgICAgIDB4MjggIC8qIFNQICAgICovCisjZGVmaW5lIElPUFdfUEMgICAgICAgICAgICAgICAgIDB4MkEgIC8qIFBDICAgICovCisjZGVmaW5lIElPUFdfUkVTX0FERFJfMkMgICAgICAgIDB4MkMKKyNkZWZpbmUgSU9QV19SRVNfQUREUl8yRSAgICAgICAgMHgyRQorI2RlZmluZSBJT1BXX1NDU0lfREFUQSAgICAgICAgICAweDMwICAvKiBTRCAgICAqLworI2RlZmluZSBJT1BXX1NDU0lfREFUQV9IU0hLICAgICAweDMyICAvKiBTREggICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ1RSTCAgICAgICAgICAweDM0ICAvKiBTQyAgICAqLworI2RlZmluZSBJT1BXX0hTSEtfQ0ZHICAgICAgICAgICAweDM2ICAvKiBIQ0ZHICAqLworI2RlZmluZSBJT1BXX1NYRlJfU1RBVFVTICAgICAgICAweDM2ICAvKiBTWFMgICAqLworI2RlZmluZSBJT1BXX1NYRlJfQ05UTCAgICAgICAgICAweDM4ICAvKiBTWEwgICAqLworI2RlZmluZSBJT1BXX1NYRlJfQ05USCAgICAgICAgICAweDNBICAvKiBTWEggICAqLworI2RlZmluZSBJT1BXX1JFU19BRERSXzNDICAgICAgICAweDNDCisjZGVmaW5lIElPUFdfUkZJRk9fREFUQSAgICAgICAgIDB4M0UgIC8qIFJGRCAgICovCisKKy8qCisgKiBEb3VibGV3b3JkIEkvTyByZWdpc3RlciBhZGRyZXNzIGZyb20gYmFzZSBvZiAnaW9wX2Jhc2UnLgorICovCisjZGVmaW5lIElPUERXX1JFU19BRERSXzAgICAgICAgICAweDAwCisjZGVmaW5lIElPUERXX1JBTV9EQVRBICAgICAgICAgICAweDA0CisjZGVmaW5lIElPUERXX1JFU19BRERSXzggICAgICAgICAweDA4CisjZGVmaW5lIElPUERXX1JFU19BRERSX0MgICAgICAgICAweDBDCisjZGVmaW5lIElPUERXX1JFU19BRERSXzEwICAgICAgICAweDEwCisjZGVmaW5lIElPUERXX0NPTU1BICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIElPUERXX0NPTU1CICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIElPUERXX1JFU19BRERSXzFDICAgICAgICAweDFDCisjZGVmaW5lIElPUERXX1NETUFfQUREUjAgICAgICAgICAweDIwCisjZGVmaW5lIElPUERXX1NETUFfQUREUjEgICAgICAgICAweDI0CisjZGVmaW5lIElPUERXX1NETUFfQ09VTlQgICAgICAgICAweDI4CisjZGVmaW5lIElPUERXX1NETUFfRVJST1IgICAgICAgICAweDJDCisjZGVmaW5lIElPUERXX1JETUFfQUREUjAgICAgICAgICAweDMwCisjZGVmaW5lIElPUERXX1JETUFfQUREUjEgICAgICAgICAweDM0CisjZGVmaW5lIElPUERXX1JETUFfQ09VTlQgICAgICAgICAweDM4CisjZGVmaW5lIElPUERXX1JETUFfRVJST1IgICAgICAgICAweDNDCisKKyNkZWZpbmUgQURWX0NISVBfSURfQllURSAgICAgICAgIDB4MjUKKyNkZWZpbmUgQURWX0NISVBfSURfV09SRCAgICAgICAgIDB4MDRDMQorCisjZGVmaW5lIEFEVl9TQ19TQ1NJX0JVU19SRVNFVCAgICAweDIwMDAKKworI2RlZmluZSBBRFZfSU5UUl9FTkFCTEVfSE9TVF9JTlRSICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQURWX0lOVFJfRU5BQkxFX1NFTF9JTlRSICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFEVl9JTlRSX0VOQUJMRV9EUFJfSU5UUiAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBRFZfSU5UUl9FTkFCTEVfUlRBX0lOVFIgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQURWX0lOVFJfRU5BQkxFX1JNQV9JTlRSICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEFEVl9JTlRSX0VOQUJMRV9SU1RfSU5UUiAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBRFZfSU5UUl9FTkFCTEVfRFBFX0lOVFIgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQURWX0lOVFJfRU5BQkxFX0dMT0JBTF9JTlRSICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgQURWX0lOVFJfU1RBVFVTX0lOVFJBICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBRFZfSU5UUl9TVEFUVVNfSU5UUkIgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFEVl9JTlRSX1NUQVRVU19JTlRSQyAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBBRFZfUklTQ19DU1JfU1RPUCAgICAgICAgICAgKDB4MDAwMCkKKyNkZWZpbmUgQURWX1JJU0NfVEVTVF9DT05EICAgICAgICAgICgweDIwMDApCisjZGVmaW5lIEFEVl9SSVNDX0NTUl9SVU4gICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBBRFZfUklTQ19DU1JfU0lOR0xFX1NURVAgICAgKDB4ODAwMCkKKworI2RlZmluZSBBRFZfQ1RSTF9SRUdfSE9TVF9JTlRSICAgICAgMHgwMTAwCisjZGVmaW5lIEFEVl9DVFJMX1JFR19TRUxfSU5UUiAgICAgICAweDAyMDAKKyNkZWZpbmUgQURWX0NUUkxfUkVHX0RQUl9JTlRSICAgICAgIDB4MDQwMAorI2RlZmluZSBBRFZfQ1RSTF9SRUdfUlRBX0lOVFIgICAgICAgMHgwODAwCisjZGVmaW5lIEFEVl9DVFJMX1JFR19STUFfSU5UUiAgICAgICAweDEwMDAKKyNkZWZpbmUgQURWX0NUUkxfUkVHX1JFU19CSVQxNCAgICAgIDB4MjAwMAorI2RlZmluZSBBRFZfQ1RSTF9SRUdfRFBFX0lOVFIgICAgICAgMHg0MDAwCisjZGVmaW5lIEFEVl9DVFJMX1JFR19QT1dFUl9ET05FICAgICAweDgwMDAKKyNkZWZpbmUgQURWX0NUUkxfUkVHX0FOWV9JTlRSICAgICAgIDB4RkYwMAorCisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfUkVTRVQgICAgICAgICAgICAgMHgwMEM2CisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfV1JfSU9fUkVHICAgICAgICAgMHgwMEM1CisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfUkRfSU9fUkVHICAgICAgICAgMHgwMEM0CisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfV1JfUENJX0NGR19TUEFDRSAgMHgwMEMzCisjZGVmaW5lIEFEVl9DVFJMX1JFR19DTURfUkRfUENJX0NGR19TUEFDRSAgMHgwMEMyCisKKyNkZWZpbmUgQURWX1RJQ0tMRV9OT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBRFZfVElDS0xFX0EgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFEVl9USUNLTEVfQiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQURWX1RJQ0tMRV9DICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIEFEVl9TQ1NJX0NUUkxfUlNUT1VUICAgICAgICAweDIwMDAKKworI2RlZmluZSBBZHZJc0ludFBlbmRpbmcocG9ydCkgXAorICAgIChBZHZSZWFkV29yZFJlZ2lzdGVyKHBvcnQsIElPUFdfQ1RSTF9SRUcpICYgQURWX0NUUkxfUkVHX0hPU1RfSU5UUikKKworLyoKKyAqIFNDU0lfQ0ZHMCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBUSU1FUl9NT0RFQUIgICAgMHhDMDAwICAvKiBXYXRjaGRvZywgU2Vjb25kLCBhbmQgU2VsZWN0LiBUaW1lciBDdHJsLiAqLworI2RlZmluZSBQQVJJVFlfRU4gICAgICAgMHgyMDAwICAvKiBFbmFibGUgU0NTSSBQYXJpdHkgRXJyb3IgZGV0ZWN0aW9uICovCisjZGVmaW5lIEVWRU5fUEFSSVRZICAgICAweDEwMDAgIC8qIFNlbGVjdCBFdmVuIFBhcml0eSAqLworI2RlZmluZSBXRF9MT05HICAgICAgICAgMHgwODAwICAvKiBXYXRjaGRvZyBJbnRlcnZhbCwgMTogNTcgbWluLCAwOiAxMyBzZWMgKi8KKyNkZWZpbmUgUVVFVUVfMTI4ICAgICAgIDB4MDQwMCAgLyogUXVldWUgU2l6ZSwgMTogMTI4IGJ5dGUsIDA6IDY0IGJ5dGUgKi8KKyNkZWZpbmUgUFJJTV9NT0RFICAgICAgIDB4MDEwMCAgLyogUHJpbWl0aXZlIFNDU0kgbW9kZSAqLworI2RlZmluZSBTQ0FNX0VOICAgICAgICAgMHgwMDgwICAvKiBFbmFibGUgU0NBTSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0VMX1RNT19MT05HICAgIDB4MDA0MCAgLyogU2VsL1Jlc2VsIFRpbWVvdXQsIDE6IDQwMCBtcywgMDogMS42IG1zICovCisjZGVmaW5lIENGUk1fSUQgICAgICAgICAweDAwMjAgIC8qIFNDQU0gaWQgc2VsLiBjb25maXJtLiwgMTogZmFzdCwgMDogNi40IG1zICovCisjZGVmaW5lIE9VUl9JRF9FTiAgICAgICAweDAwMTAgIC8qIEVuYWJsZSBPVVJfSUQgYml0cyAqLworI2RlZmluZSBPVVJfSUQgICAgICAgICAgMHgwMDBGICAvKiBTQ1NJIElEICovCisKKy8qCisgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgQklHX0VORElBTiAgICAgIDB4ODAwMCAgLyogRW5hYmxlIEJpZyBFbmRpYW4gTW9kZSBNSU86MTUsIEVFUDoxNSAqLworI2RlZmluZSBURVJNX1BPTCAgICAgICAgMHgyMDAwICAvKiBUZXJtaW5hdG9yIFBvbGFyaXR5IEN0cmwuIE1JTzoxMywgRUVQOjEzICovCisjZGVmaW5lIFNMRVdfUkFURSAgICAgICAweDEwMDAgIC8qIFNDU0kgb3V0cHV0IGJ1ZmZlciBzbGV3IHJhdGUgKi8KKyNkZWZpbmUgRklMVEVSX1NFTCAgICAgIDB4MEMwMCAgLyogRmlsdGVyIFBlcmlvZCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgIEZMVFJfRElTQUJMRSAgICAweDAwMDAgIC8qIElucHV0IEZpbHRlcmluZyBEaXNhYmxlZCAqLworI2RlZmluZSAgRkxUUl8xMV9UT18yME5TIDB4MDgwMCAgLyogSW5wdXQgRmlsdGVyaW5nIDExbnMgdG8gMjBucyAqLworI2RlZmluZSAgRkxUUl8yMV9UT18zOU5TIDB4MEMwMCAgLyogSW5wdXQgRmlsdGVyaW5nIDIxbnMgdG8gMzlucyAqLworI2RlZmluZSBBQ1RJVkVfREJMICAgICAgMHgwMjAwICAvKiBEaXNhYmxlIEFjdGl2ZSBOZWdhdGlvbiAqLworI2RlZmluZSBESUZGX01PREUgICAgICAgMHgwMTAwICAvKiBTQ1NJIGRpZmZlcmVudGlhbCBNb2RlIChSZWFkLU9ubHkpICovCisjZGVmaW5lIERJRkZfU0VOU0UgICAgICAweDAwODAgIC8qIDE6IE5vIFNFIGNhYmxlcywgMDogU0UgY2FibGUgKFJlYWQtT25seSkgKi8KKyNkZWZpbmUgVEVSTV9DVExfU0VMICAgIDB4MDA0MCAgLyogRW5hYmxlIFRFUk1fQ1RMX0ggYW5kIFRFUk1fQ1RMX0wgKi8KKyNkZWZpbmUgVEVSTV9DVEwgICAgICAgIDB4MDAzMCAgLyogRXh0ZXJuYWwgU0NTSSBUZXJtaW5hdGlvbiBCaXRzICovCisjZGVmaW5lICBURVJNX0NUTF9IICAgICAgMHgwMDIwICAvKiBFbmFibGUgRXh0ZXJuYWwgU0NTSSBVcHBlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSAgVEVSTV9DVExfTCAgICAgIDB4MDAxMCAgLyogRW5hYmxlIEV4dGVybmFsIFNDU0kgTG93ZXIgVGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ0FCTEVfREVURUNUICAgIDB4MDAwRiAgLyogRXh0ZXJuYWwgU0NTSSBDYWJsZSBDb25uZWN0aW9uIFN0YXR1cyAqLworCisvKgorICogQWRkZW5kdW0gZm9yIEFTQy0zOEMwODAwIENoaXAKKyAqCisgKiBUaGUgQVNDLTM4QzE2MDAgQ2hpcCB1c2VzIHRoZSBzYW1lIGRlZmluaXRpb25zIGV4Y2VwdCB0aGF0IHRoZQorICogYnVzIG1vZGUgb3ZlcnJpZGUgYml0cyBbMTI6MTBdIGhhdmUgYmVlbiBtb3ZlZCB0byBieXRlIHJlZ2lzdGVyCisgKiBvZmZzZXQgMHhFIChJT1BCX1NPRlRfT1ZFUl9XUikgYml0cyBbMTI6MTBdLiBUaGUgWzEyOjEwXSBiaXRzIGluCisgKiBTQ1NJX0NGRzEgYXJlIHJlYWQtb25seSBhbmQgYWx3YXlzIGF2YWlsYWJsZS4gQml0IDE0IChESVNfVEVSTV9EUlYpCisgKiBpcyBub3QgbmVlZGVkLiBUaGUgWzEyOjEwXSBiaXRzIGluIElPUEJfU09GVF9PVkVSX1dSIGFyZSB3cml0ZS1vbmx5LgorICogQWxzbyBlYWNoIEFTQy0zOEMxNjAwIGZ1bmN0aW9uIG9yIGNoYW5uZWwgdXNlcyBvbmx5IGNhYmxlIGJpdHMgWzU6NF0KKyAqIGFuZCBbMTowXS4gQml0cyBbMTRdLCBbNzo2XSwgWzM6Ml0gYXJlIHVudXNlZC4KKyAqLworI2RlZmluZSBESVNfVEVSTV9EUlYgICAgMHg0MDAwICAvKiAxOiBSZWFkIGNfZGV0WzM6MF0sIDA6IGNhbm5vdCByZWFkICovCisjZGVmaW5lIEhWRF9MVkRfU0UgICAgICAweDFDMDAgIC8qIERldmljZSBEZXRlY3QgQml0cyAqLworI2RlZmluZSAgSFZEICAgICAgICAgICAgIDB4MTAwMCAgLyogSFZEIERldmljZSBEZXRlY3QgKi8KKyNkZWZpbmUgIExWRCAgICAgICAgICAgICAweDA4MDAgIC8qIExWRCBEZXZpY2UgRGV0ZWN0ICovCisjZGVmaW5lICBTRSAgICAgICAgICAgICAgMHgwNDAwICAvKiBTRSBEZXZpY2UgRGV0ZWN0ICovCisjZGVmaW5lIFRFUk1fTFZEICAgICAgICAweDAwQzAgIC8qIExWRCBUZXJtaW5hdGlvbiBCaXRzICovCisjZGVmaW5lICBURVJNX0xWRF9ISSAgICAgMHgwMDgwICAvKiBFbmFibGUgTFZEIFVwcGVyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lICBURVJNX0xWRF9MTyAgICAgMHgwMDQwICAvKiBFbmFibGUgTFZEIExvd2VyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lIFRFUk1fU0UgICAgICAgICAweDAwMzAgIC8qIFNFIFRlcm1pbmF0aW9uIEJpdHMgKi8KKyNkZWZpbmUgIFRFUk1fU0VfSEkgICAgICAweDAwMjAgIC8qIEVuYWJsZSBTRSBVcHBlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSAgVEVSTV9TRV9MTyAgICAgIDB4MDAxMCAgLyogRW5hYmxlIFNFIExvd2VyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lIENfREVUX0xWRCAgICAgICAweDAwMEMgIC8qIExWRCBDYWJsZSBEZXRlY3QgQml0cyAqLworI2RlZmluZSAgQ19ERVQzICAgICAgICAgIDB4MDAwOCAgLyogQ2FibGUgRGV0ZWN0IGZvciBMVkQgRXh0ZXJuYWwgV2lkZSAqLworI2RlZmluZSAgQ19ERVQyICAgICAgICAgIDB4MDAwNCAgLyogQ2FibGUgRGV0ZWN0IGZvciBMVkQgSW50ZXJuYWwgV2lkZSAqLworI2RlZmluZSBDX0RFVF9TRSAgICAgICAgMHgwMDAzICAvKiBTRSBDYWJsZSBEZXRlY3QgQml0cyAqLworI2RlZmluZSAgQ19ERVQxICAgICAgICAgIDB4MDAwMiAgLyogQ2FibGUgRGV0ZWN0IGZvciBTRSBJbnRlcm5hbCBXaWRlICovCisjZGVmaW5lICBDX0RFVDAgICAgICAgICAgMHgwMDAxICAvKiBDYWJsZSBEZXRlY3QgZm9yIFNFIEludGVybmFsIE5hcnJvdyAqLworCisKKyNkZWZpbmUgQ0FCTEVfSUxMRUdBTF9BIDB4NworICAgIC8qIHggMCAwIDAgIHwgb24gIG9uIHwgSWxsZWdhbCAoYWxsIDMgY29ubmVjdG9ycyBhcmUgdXNlZCkgKi8KKworI2RlZmluZSBDQUJMRV9JTExFR0FMX0IgMHhCCisgICAgLyogMCB4IDAgMCAgfCBvbiAgb24gfCBJbGxlZ2FsIChhbGwgMyBjb25uZWN0b3JzIGFyZSB1c2VkKSAqLworCisvKgorICogTUVNX0NGRyBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBCSU9TX0VOICAgICAgICAgMHg0MCAgICAvKiBCSU9TIEVuYWJsZSBNSU86MTQsRUVQOjE0ICovCisjZGVmaW5lIEZBU1RfRUVfQ0xLICAgICAweDIwICAgIC8qIERpYWdub3N0aWMgQml0ICovCisjZGVmaW5lIFJBTV9TWiAgICAgICAgICAweDFDICAgIC8qIFNwZWNpZnkgc2l6ZSBvZiBSQU0gdG8gUklTQyAqLworI2RlZmluZSAgUkFNX1NaXzJLQiAgICAgIDB4MDAgICAgLyogMiBLQiAqLworI2RlZmluZSAgUkFNX1NaXzRLQiAgICAgIDB4MDQgICAgLyogNCBLQiAqLworI2RlZmluZSAgUkFNX1NaXzhLQiAgICAgIDB4MDggICAgLyogOCBLQiAqLworI2RlZmluZSAgUkFNX1NaXzE2S0IgICAgIDB4MEMgICAgLyogMTYgS0IgKi8KKyNkZWZpbmUgIFJBTV9TWl8zMktCICAgICAweDEwICAgIC8qIDMyIEtCICovCisjZGVmaW5lICBSQU1fU1pfNjRLQiAgICAgMHgxNCAgICAvKiA2NCBLQiAqLworCisvKgorICogRE1BX0NGRzAgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKgorICogVGhpcyByZWdpc3RlciBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlIGhvc3QuCisgKi8KKyNkZWZpbmUgQkNfVEhSRVNIX0VOQiAgIDB4ODAgICAgLyogUENJIERNQSBTdGFydCBDb25kaXRpb25zICovCisjZGVmaW5lIEZJRk9fVEhSRVNIICAgICAweDcwICAgIC8qIFBDSSBETUEgRklGTyBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzE2QiAgMHgwMCAgIC8qIDE2IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF8zMkIgIDB4MjAgICAvKiAzMiBieXRlcyAqLworI2RlZmluZSAgRklGT19USFJFU0hfNDhCICAweDMwICAgLyogNDggYnl0ZXMgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzY0QiAgMHg0MCAgIC8qIDY0IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF84MEIgIDB4NTAgICAvKiA4MCBieXRlcyAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzk2QiAgMHg2MCAgIC8qIDk2IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF8xMTJCIDB4NzAgICAvKiAxMTIgYnl0ZXMgKi8KKyNkZWZpbmUgU1RBUlRfQ1RMICAgICAgIDB4MEMgICAgLyogRE1BIHN0YXJ0IGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUgIFNUQVJUX0NUTF9USCAgICAweDAwICAgIC8qIFdhaXQgdGhyZXNob2xkIGxldmVsIChkZWZhdWx0KSAqLworI2RlZmluZSAgU1RBUlRfQ1RMX0lEICAgIDB4MDQgICAgLyogV2FpdCBTRE1BL1NCVVMgaWRsZSAqLworI2RlZmluZSAgU1RBUlRfQ1RMX1RISUQgIDB4MDggICAgLyogV2FpdCB0aHJlc2hvbGQgYW5kIFNETUEvU0JVUyBpZGxlICovCisjZGVmaW5lICBTVEFSVF9DVExfRU1GVSAgMHgwQyAgICAvKiBXYWl0IFNETUEgRklGTyBlbXB0eS9mdWxsICovCisjZGVmaW5lIFJFQURfQ01EICAgICAgICAweDAzICAgIC8qIE1lbW9yeSBSZWFkIE1ldGhvZCAqLworI2RlZmluZSAgUkVBRF9DTURfTVIgICAgIDB4MDAgICAgLyogTWVtb3J5IFJlYWQgKi8KKyNkZWZpbmUgIFJFQURfQ01EX01STCAgICAweDAyICAgIC8qIE1lbW9yeSBSZWFkIExvbmcgKi8KKyNkZWZpbmUgIFJFQURfQ01EX01STSAgICAweDAzICAgIC8qIE1lbW9yeSBSZWFkIE11bHRpcGxlIChkZWZhdWx0KSAqLworCisvKgorICogQVNDLTM4QzA4MDAgUkFNIEJJU1QgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgUkFNX1RFU1RfTU9ERSAgICAgICAgIDB4ODAKKyNkZWZpbmUgUFJFX1RFU1RfTU9ERSAgICAgICAgIDB4NDAKKyNkZWZpbmUgTk9STUFMX01PREUgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUkFNX1RFU1RfRE9ORSAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkFNX1RFU1RfU1RBVFVTICAgICAgIDB4MEYKKyNkZWZpbmUgIFJBTV9URVNUX0hPU1RfRVJST1IgICAweDA4CisjZGVmaW5lICBSQU1fVEVTVF9JTlRSQU1fRVJST1IgMHgwNAorI2RlZmluZSAgUkFNX1RFU1RfUklTQ19FUlJPUiAgIDB4MDIKKyNkZWZpbmUgIFJBTV9URVNUX1NDU0lfRVJST1IgICAweDAxCisjZGVmaW5lICBSQU1fVEVTVF9TVUNDRVNTICAgICAgMHgwMAorI2RlZmluZSBQUkVfVEVTVF9WQUxVRSAgICAgICAgMHgwNQorI2RlZmluZSBOT1JNQUxfVkFMVUUgICAgICAgICAgMHgwMAorCisvKgorICogQVNDMzhDMTYwMCBEZWZpbml0aW9ucworICoKKyAqIElPUEJfUENJX0lOVF9DRkcgQml0IEZpZWxkIERlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBJTlRBQl9MRCAgICAgICAgMHg4MCAgICAvKiBWYWx1ZSBsb2FkZWQgZnJvbSBFRVBST00gQml0IDExLiAqLworCisvKgorICogQml0IDEgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlIGludGVycnVwdCBmb3IgdGhlIEZ1bmN0aW9uIHRvIG9wZXJhdGUgaW4KKyAqIFRvdGVtIFBvbGUgbW9kZS4gQnkgZGVmYXVsdCBCaXQgMSBpcyAwIGFuZCB0aGUgaW50ZXJydXB0IG9wZXJhdGVzIGluCisgKiBPcGVuIERyYWluIG1vZGUuIEJvdGggZnVuY3Rpb25zIG9mIHRoZSBBU0MzOEMxNjAwIG11c3QgYmUgc2V0IHRvIHRoZSBzYW1lCisgKiBtb2RlLCBvdGhlcndpc2UgdGhlIG9wZXJhdGluZyBtb2RlIGlzIHVuZGVmaW5lZC4KKyAqLworI2RlZmluZSBUT1RFTVBPTEUgICAgICAgMHgwMgorCisvKgorICogQml0IDAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBJbnQgUGluIGZvciB0aGUgRnVuY3Rpb24uIFRoZSB2YWx1ZSBpcworICogMCBieSBkZWZhdWx0IGZvciBib3RoIEZ1bmN0aW9ucyB3aXRoIEZ1bmN0aW9uIDAgdXNpbmcgSU5UIEEgYW5kIEZ1bmN0aW9uCisgKiBCIHVzaW5nIElOVCBCLiBGb3IgRnVuY3Rpb24gMCBpZiBzZXQsIElOVCBCIGlzIHVzZWQuIEZvciBGdW5jdGlvbiAxIGlmIHNldCwKKyAqIElOVCBBIGlzIHVzZWQuCisgKgorICogRUVQUk9NIFdvcmQgMCBCaXQgMTEgZm9yIGVhY2ggRnVuY3Rpb24gbWF5IGNoYW5nZSB0aGUgaW5pdGlhbCBJbnQgUGluCisgKiB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlLgorICovCisjZGVmaW5lIElOVEFCICAgICAgICAgICAweDAxCisKKy8qIGFfYWR2bGliLmggKi8KKworLyoKKyAqIEFkdiBMaWJyYXJ5IFN0YXR1cyBEZWZpbml0aW9ucworICovCisjZGVmaW5lIEFEVl9UUlVFICAgICAgICAxCisjZGVmaW5lIEFEVl9GQUxTRSAgICAgICAwCisjZGVmaW5lIEFEVl9OT0VSUk9SICAgICAxCisjZGVmaW5lIEFEVl9TVUNDRVNTICAgICAxCisjZGVmaW5lIEFEVl9CVVNZICAgICAgICAwCisjZGVmaW5lIEFEVl9FUlJPUiAgICAgICAoLTEpCisKKworLyoKKyAqIEFEVl9EVkNfVkFSICd3YXJuX2NvZGUnIHZhbHVlcworICovCisjZGVmaW5lIEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SICAgICAgICAgMHgwMDAxIC8qIFNDU0kgQnVzIFJlc2V0IGVycm9yICovCisjZGVmaW5lIEFTQ19XQVJOX0VFUFJPTV9DSEtTVU0gICAgICAgICAgMHgwMDAyIC8qIEVFUCBjaGVjayBzdW0gZXJyb3IgKi8KKyNkZWZpbmUgQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OICAgICAweDAwMDQgLyogRUVQIHRlcm1pbmF0aW9uIGJhZCBmaWVsZCAqLworI2RlZmluZSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRSAgIDB4MDA4MCAvKiBQQ0kgY29uZmlnIHNwYWNlIHNldCBlcnJvciAqLworI2RlZmluZSBBU0NfV0FSTl9FUlJPUiAgICAgICAgICAgICAgICAgIDB4RkZGRiAvKiBBRFZfRVJST1IgcmV0dXJuICovCisKKyNkZWZpbmUgQURWX01BWF9USUQgICAgICAgICAgICAgICAgICAgICAxNSAvKiBtYXguIHRhcmdldCBpZGVudGlmaWVyICovCisjZGVmaW5lIEFEVl9NQVhfTFVOICAgICAgICAgICAgICAgICAgICAgNyAgLyogbWF4LiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisKKy8qCisgKiBFcnJvciBjb2RlIHZhbHVlcyBhcmUgc2V0IGluIEFEVl9EVkNfVkFSICdlcnJfY29kZScuCisgKi8KKyNkZWZpbmUgQVNDX0lFUlJfV1JJVEVfRUVQUk9NICAgICAgIDB4MDAwMSAvKiB3cml0ZSBFRVBST00gZXJyb3IgKi8KKyNkZWZpbmUgQVNDX0lFUlJfTUNPREVfQ0hLU1VNICAgICAgIDB4MDAwMiAvKiBtaWNybyBjb2RlIGNoZWNrIHN1bSBlcnJvciAqLworI2RlZmluZSBBU0NfSUVSUl9OT19DQVJSSUVSICAgICAgICAgMHgwMDA0IC8qIE5vIG1vcmUgY2FycmllciBtZW1vcnkuICovCisjZGVmaW5lIEFTQ19JRVJSX1NUQVJUX1NUT1BfQ0hJUCAgICAweDAwMDggLyogc3RhcnQvc3RvcCBjaGlwIGZhaWxlZCAqLworI2RlZmluZSBBU0NfSUVSUl9DSElQX1ZFUlNJT04gICAgICAgMHgwMDQwIC8qIHdyb25nIGNoaXAgdmVyc2lvbiAqLworI2RlZmluZSBBU0NfSUVSUl9TRVRfU0NTSV9JRCAgICAgICAgMHgwMDgwIC8qIHNldCBTQ1NJIElEIGZhaWxlZCAqLworI2RlZmluZSBBU0NfSUVSUl9IVkRfREVWSUNFICAgICAgICAgMHgwMTAwIC8qIEhWRCBhdHRhY2hlZCB0byBMVkQgY29ubmVjdG9yLiAqLworI2RlZmluZSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFICAgICAgMHgwMjAwIC8qIHNpZ25hdHVyZSBub3QgZm91bmQgKi8KKyNkZWZpbmUgQVNDX0lFUlJfSUxMRUdBTF9DT05ORUNUSU9OIDB4MDQwMCAvKiBJbGxlZ2FsIGNhYmxlIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgQVNDX0lFUlJfU0lOR0xFX0VORF9ERVZJQ0UgIDB4MDgwMCAvKiBTaW5nbGUtZW5kIHVzZWQgdy9kaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUgQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEUgICAgIDB4MTAwMCAvKiBOYXJyb3cgZmxhdCBjYWJsZSByZXZlcnNlZCAqLworI2RlZmluZSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUICAgICAgMHgyMDAwIC8qIEJJU1QgcHJlLXRlc3QgZXJyb3IgKi8KKyNkZWZpbmUgQVNDX0lFUlJfQklTVF9SQU1fVEVTVCAgICAgIDB4NDAwMCAvKiBCSVNUIFJBTSB0ZXN0IGVycm9yICovCisjZGVmaW5lIEFTQ19JRVJSX0JBRF9DSElQVFlQRSAgICAgICAweDgwMDAgLyogSW52YWxpZCAnY2hpcF90eXBlJyBzZXR0aW5nLiAqLworCisvKgorICogRml4ZWQgbG9jYXRpb25zIG9mIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzLgorICovCisjZGVmaW5lIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIgICAgICAgICAgMHgwMDI4IC8qIG1pY3JvY29kZSBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIEFTQ19NQ19DT0RFX0VORF9BRERSICAgICAgICAgICAgMHgwMDJBIC8qIG1pY3JvY29kZSBlbmQgYWRkcmVzcyAqLworI2RlZmluZSBBU0NfTUNfQ09ERV9DSEtfU1VNICAgICAgICAgICAgIDB4MDAyQyAvKiBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSAqLworI2RlZmluZSBBU0NfTUNfVkVSU0lPTl9EQVRFICAgICAgICAgICAgIDB4MDAzOCAvKiBtaWNyb2NvZGUgdmVyc2lvbiAqLworI2RlZmluZSBBU0NfTUNfVkVSU0lPTl9OVU0gICAgICAgICAgICAgIDB4MDAzQSAvKiBtaWNyb2NvZGUgbnVtYmVyICovCisjZGVmaW5lIEFTQ19NQ19CSU9TTUVNICAgICAgICAgICAgICAgICAgMHgwMDQwIC8qIEJJT1MgUklTQyBNZW1vcnkgU3RhcnQgKi8KKyNkZWZpbmUgQVNDX01DX0JJT1NMRU4gICAgICAgICAgICAgICAgICAweDAwNTAgLyogQklPUyBSSVNDIE1lbW9yeSBMZW5ndGggKi8KKyNkZWZpbmUgQVNDX01DX0JJT1NfU0lHTkFUVVJFICAgICAgICAgICAweDAwNTggLyogQklPUyBTaWduYXR1cmUgMHg1NUFBICovCisjZGVmaW5lIEFTQ19NQ19CSU9TX1ZFUlNJT04gICAgICAgICAgICAgMHgwMDVBIC8qIEJJT1MgVmVyc2lvbiAoMiBieXRlcykgKi8KKyNkZWZpbmUgQVNDX01DX1NEVFJfU1BFRUQxICAgICAgICAgICAgICAweDAwOTAgLyogU0RUUiBTcGVlZCBmb3IgVElEIDAtMyAqLworI2RlZmluZSBBU0NfTUNfU0RUUl9TUEVFRDIgICAgICAgICAgICAgIDB4MDA5MiAvKiBTRFRSIFNwZWVkIGZvciBUSUQgNC03ICovCisjZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVEMyAgICAgICAgICAgICAgMHgwMDk0IC8qIFNEVFIgU3BlZWQgZm9yIFRJRCA4LTExICovCisjZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVENCAgICAgICAgICAgICAgMHgwMDk2IC8qIFNEVFIgU3BlZWQgZm9yIFRJRCAxMi0xNSAqLworI2RlZmluZSBBU0NfTUNfQ0hJUF9UWVBFICAgICAgICAgICAgICAgIDB4MDA5QQorI2RlZmluZSBBU0NfTUNfSU5UUkJfQ09ERSAgICAgICAgICAgICAgIDB4MDA5QgorI2RlZmluZSBBU0NfTUNfV0RUUl9BQkxFICAgICAgICAgICAgICAgIDB4MDA5QworI2RlZmluZSBBU0NfTUNfU0RUUl9BQkxFICAgICAgICAgICAgICAgIDB4MDA5RQorI2RlZmluZSBBU0NfTUNfVEFHUU5HX0FCTEUgICAgICAgICAgICAgIDB4MDBBMAorI2RlZmluZSBBU0NfTUNfRElTQ19FTkFCTEUgICAgICAgICAgICAgIDB4MDBBMgorI2RlZmluZSBBU0NfTUNfSURMRV9DTURfU1RBVFVTICAgICAgICAgIDB4MDBBNAorI2RlZmluZSBBU0NfTUNfSURMRV9DTUQgICAgICAgICAgICAgICAgIDB4MDBBNgorI2RlZmluZSBBU0NfTUNfSURMRV9DTURfUEFSQU1FVEVSICAgICAgIDB4MDBBOAorI2RlZmluZSBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAgICAgICAgIDB4MDBBQworI2RlZmluZSBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzEgICAgICAgIDB4MDBBRQorI2RlZmluZSBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHICAgICAgICAgIDB4MDBCMAorI2RlZmluZSBBU0NfTUNfREVGQVVMVF9TRUxfTUFTSyAgICAgICAgIDB4MDBCMgorI2RlZmluZSBBU0NfTUNfU0RUUl9ET05FICAgICAgICAgICAgICAgIDB4MDBCNgorI2RlZmluZSBBU0NfTUNfTlVNQkVSX09GX1FVRVVFRF9DTUQgICAgIDB4MDBDMAorI2RlZmluZSBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgICAgICAgIDB4MDBEMAorI2RlZmluZSBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFICAgIDB4MDEwMAorI2RlZmluZSBBU0NfTUNfQ09OVFJPTF9GTEFHICAgICAgICAgICAgIDB4MDEyMiAvKiBNaWNyb2NvZGUgY29udHJvbCBmbGFnLiAqLworI2RlZmluZSBBU0NfTUNfV0RUUl9ET05FICAgICAgICAgICAgICAgIDB4MDEyNAorI2RlZmluZSBBU0NfTUNfQ0FNX01PREVfTUFTSyAgICAgICAgICAgIDB4MDE1RSAvKiBDQU0gbW9kZSBUSUQgYml0bWFzay4gKi8KKyNkZWZpbmUgQVNDX01DX0lDUSAgICAgICAgICAgICAgICAgICAgICAweDAxNjAKKyNkZWZpbmUgQVNDX01DX0lSUSAgICAgICAgICAgICAgICAgICAgICAweDAxNjQKKyNkZWZpbmUgQVNDX01DX1BQUl9BQkxFICAgICAgICAgICAgICAgICAweDAxN0EKKworLyoKKyAqIEJJT1MgTFJBTSB2YXJpYWJsZSBhYnNvbHV0ZSBvZmZzZXRzLgorICovCisjZGVmaW5lIEJJT1NfQ09ERVNFRyAgICAweDU0CisjZGVmaW5lIEJJT1NfQ09ERUxFTiAgICAweDU2CisjZGVmaW5lIEJJT1NfU0lHTkFUVVJFICAweDU4CisjZGVmaW5lIEJJT1NfVkVSU0lPTiAgICAweDVBCisKKy8qCisgKiBNaWNyb2NvZGUgQ29udHJvbCBGbGFncworICoKKyAqIEZsYWdzIHNldCBieSB0aGUgQWR2IExpYnJhcnkgaW4gUklTQyB2YXJpYWJsZSAnY29udHJvbF9mbGFnJyAoMHgxMjIpCisgKiBhbmQgaGFuZGxlZCBieSB0aGUgbWljcm9jb2RlLgorICovCisjZGVmaW5lIENPTlRST0xfRkxBR19JR05PUkVfUEVSUiAgICAgICAgMHgwMDAxIC8qIElnbm9yZSBETUEgUGFyaXR5IEVycm9ycyAqLworI2RlZmluZSBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFAgICAgICAgIDB4MDAwMiAvKiBFbmFibGVkIEFJUFAgY2hlY2tpbmcuICovCisKKy8qCisgKiBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFIG1pY3JvY29kZSB0YWJsZSBvciBIU0hLX0NGRyByZWdpc3RlciBmb3JtYXQKKyAqLworI2RlZmluZSBIU0hLX0NGR19XSURFX1hGUiAgICAgICAweDgwMDAKKyNkZWZpbmUgSFNIS19DRkdfUkFURSAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIEhTSEtfQ0ZHX09GRlNFVCAgICAgICAgIDB4MDAxRgorCisjZGVmaW5lIEFTQ19ERUZfTUFYX0hPU1RfUU5HICAgIDB4RkQgLyogTWF4LiBudW1iZXIgb2YgaG9zdCBjb21tYW5kcyAoMjUzKSAqLworI2RlZmluZSBBU0NfREVGX01JTl9IT1NUX1FORyAgICAweDEwIC8qIE1pbi4gbnVtYmVyIG9mIGhvc3QgY29tbWFuZHMgKDE2KSAqLworI2RlZmluZSBBU0NfREVGX01BWF9EVkNfUU5HICAgICAweDNGIC8qIE1heC4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDYzKSAqLworI2RlZmluZSBBU0NfREVGX01JTl9EVkNfUU5HICAgICAweDA0IC8qIE1pbi4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDQpICovCisKKyNkZWZpbmUgQVNDX1FDX0RBVEFfQ0hFQ0sgIDB4MDEgLyogUmVxdWlyZSBBU0NfUUNfREFUQV9PVVQgc2V0IG9yIGNsZWFyLiAqLworI2RlZmluZSBBU0NfUUNfREFUQV9PVVQgICAgMHgwMiAvKiBEYXRhIG91dCBETUEgdHJhbnNmZXIuICovCisjZGVmaW5lIEFTQ19RQ19TVEFSVF9NT1RPUiAweDA0IC8qIFNlbmQgYXV0by1zdGFydCBtb3RvciBiZWZvcmUgcmVxdWVzdC4gKi8KKyNkZWZpbmUgQVNDX1FDX05PX09WRVJSVU4gIDB4MDggLyogRG9uJ3QgcmVwb3J0IG92ZXJydW4uICovCisjZGVmaW5lIEFTQ19RQ19GUkVFWkVfVElEUSAweDEwIC8qIEZyZWV6ZSBUSUQgcXVldWUgYWZ0ZXIgcmVxdWVzdC4gWFhYIFRCRCAqLworCisjZGVmaW5lIEFTQ19RU0NfTk9fRElTQyAgICAgMHgwMSAvKiBEb24ndCBhbGxvdyBkaXNjb25uZWN0IGZvciByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUVNDX05PX1RBR01TRyAgIDB4MDIgLyogRG9uJ3QgYWxsb3cgdGFnIHF1ZXVpbmcgZm9yIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fU1lOQyAgICAgMHgwNCAvKiBEb24ndCB1c2UgU3luY2guIHRyYW5zZmVyIG9uIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fV0lERSAgICAgMHgwOCAvKiBEb24ndCB1c2UgV2lkZSB0cmFuc2ZlciBvbiByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUVNDX1JFRE9fRFRSICAgIDB4MTAgLyogUmVuZWdvdGlhdGUgV0RUUi9TRFRSIGJlZm9yZSByZXF1ZXN0LiAqLworLyoKKyAqIE5vdGU6IElmIGEgVGFnIE1lc3NhZ2UgaXMgdG8gYmUgc2VudCBhbmQgbmVpdGhlciBBU0NfUVNDX0hFQURfVEFHIG9yCisgKiBBU0NfUVNDX09SREVSRURfVEFHIGlzIHNldCwgdGhlbiBhIFNpbXBsZSBUYWcgTWVzc2FnZSAoMHgyMCkgaXMgdXNlZC4KKyAqLworI2RlZmluZSBBU0NfUVNDX0hFQURfVEFHICAgIDB4NDAgLyogVXNlIEhlYWQgVGFnIE1lc3NhZ2UgKDB4MjEpLiAqLworI2RlZmluZSBBU0NfUVNDX09SREVSRURfVEFHIDB4ODAgLyogVXNlIE9yZGVyZWQgVGFnIE1lc3NhZ2UgKDB4MjIpLiAqLworCisvKgorICogQWxsIGZpZWxkcyBoZXJlIGFyZSBhY2Nlc3NlZCBieSB0aGUgYm9hcmQgbWljcm9jb2RlIGFuZCBuZWVkIHRvIGJlCisgKiBsaXR0bGUtZW5kaWFuLgorICovCit0eXBlZGVmIHN0cnVjdCBhZHZfY2Fycl90Cit7CisgICAgQURWX1ZBRERSICAgY2Fycl92YTsgICAgICAgLyogQ2FycmllciBWaXJ0dWFsIEFkZHJlc3MgKi8KKyAgICBBRFZfUEFERFIgICBjYXJyX3BhOyAgICAgICAvKiBDYXJyaWVyIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyAgICBBRFZfVkFERFIgICBhcmVxX3ZwYTsgICAgICAvKiBBU0NfU0NTSV9SRVFfUSBWaXJ0dWFsIG9yIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyAgICAvKgorICAgICAqIG5leHRfdnBhIFszMTo0XSAgICAgICAgICAgIENhcnJpZXIgVmlydHVhbCBvciBQaHlzaWNhbCBOZXh0IFBvaW50ZXIKKyAgICAgKgorICAgICAqIG5leHRfdnBhIFszOjFdICAgICAgICAgICAgIFJlc2VydmVkIEJpdHMKKyAgICAgKiBuZXh0X3ZwYSBbMF0gICAgICAgICAgICAgICBEb25lIEZsYWcgc2V0IGluIFJlc3BvbnNlIFF1ZXVlLgorICAgICAqLworICAgIEFEVl9WQUREUiAgIG5leHRfdnBhOworfSBBRFZfQ0FSUl9UOworCisvKgorICogTWFzayB1c2VkIHRvIGVsaW1pbmF0ZSBsb3cgNCBiaXRzIG9mIGNhcnJpZXIgJ25leHRfdnBhJyBmaWVsZC4KKyAqLworI2RlZmluZSBBU0NfTkVYVF9WUEFfTUFTSyAgICAgICAweEZGRkZGRkYwCisKKyNkZWZpbmUgQVNDX1JRX0RPTkUgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBU0NfUlFfR09PRCAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFTQ19DUV9TVE9QUEVSICAgICAgICAgIDB4MDAwMDAwMDAKKworI2RlZmluZSBBU0NfR0VUX0NBUlJQKGNhcnJwKSAoKGNhcnJwKSAmIEFTQ19ORVhUX1ZQQV9NQVNLKQorCisjZGVmaW5lIEFEVl9DQVJSSUVSX05VTV9QQUdFX0NST1NTSU5HIFwKKyAgICAoKChBRFZfQ0FSUklFUl9DT1VOVCAqIHNpemVvZihBRFZfQ0FSUl9UKSkgKyBcCisgICAgICAgIChBRFZfUEFHRV9TSVpFIC0gMSkpL0FEVl9QQUdFX1NJWkUpCisKKyNkZWZpbmUgQURWX0NBUlJJRVJfQlVGU0laRSBcCisgICAgKChBRFZfQ0FSUklFUl9DT1VOVCArIEFEVl9DQVJSSUVSX05VTV9QQUdFX0NST1NTSU5HKSAqIHNpemVvZihBRFZfQ0FSUl9UKSkKKworLyoKKyAqIEFTQ19TQ1NJX1JFUV9RICdhX2ZsYWcnIGRlZmluaXRpb25zCisgKgorICogVGhlIEFkdiBMaWJyYXJ5IHNob3VsZCBsaW1pdCB1c2UgdG8gdGhlIGxvd2VyIG5pYmJsZSAoNCBiaXRzKSBvZgorICogYV9mbGFnLiBEcml2ZXJzIGFyZSBmcmVlIHRvIHVzZSB0aGUgdXBwZXIgbmliYmxlICg0IGJpdHMpIG9mIGFfZmxhZy4KKyAqLworI2RlZmluZSBBRFZfUE9MTF9SRVFVRVNUICAgICAgICAgICAgICAgIDB4MDEgICAvKiBwb2xsIGZvciByZXF1ZXN0IGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgQURWX1NDU0lRX0RPTkUgICAgICAgICAgICAgICAgICAweDAyICAgLyogcmVxdWVzdCBkb25lICovCisjZGVmaW5lIEFEVl9ET05UX1JFVFJZICAgICAgICAgICAgICAgICAgMHgwOCAgIC8qIGRvbid0IGRvIHJldHJ5ICovCisKKyNkZWZpbmUgQURWX0NISVBfQVNDMzU1MCAgICAgICAgICAweDAxICAgLyogVWx0cmEtV2lkZSBJQyAqLworI2RlZmluZSBBRFZfQ0hJUF9BU0MzOEMwODAwICAgICAgIDB4MDIgICAvKiBVbHRyYTItV2lkZS9MVkQgSUMgKi8KKyNkZWZpbmUgQURWX0NISVBfQVNDMzhDMTYwMCAgICAgICAweDAzICAgLyogVWx0cmEzLVdpZGUvTFZEMiBJQyAqLworCisvKgorICogQWRhcHRlciB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBjYW4gYmUgZGlzY2FyZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLiBEb24ndCBhZGQKKyAqIGZpZWxkcyBoZXJlIG5lZWRlZCBhZnRlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBGaWVsZCBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiAgKl9lbmFibGUgaW5kaWNhdGVzIHRoZSBmaWVsZCBlbmFibGVzIG9yIGRpc2FibGVzIGEgZmVhdHVyZS4gVGhlCisgKiAgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIG5ldmVyIHJlc2V0LgorICovCit0eXBlZGVmIHN0cnVjdCBhZHZfZHZjX2NmZyB7CisgIHVzaG9ydCBkaXNjX2VuYWJsZTsgICAgICAgLyogZW5hYmxlIGRpc2Nvbm5lY3Rpb24gKi8KKyAgdWNoYXIgIGNoaXBfdmVyc2lvbjsgICAgICAvKiBjaGlwIHZlcnNpb24gKi8KKyAgdWNoYXIgIHRlcm1pbmF0aW9uOyAgICAgICAvKiBUZXJtLiBDdHJsLiBiaXRzIDYtNSBvZiBTQ1NJX0NGRzEgcmVnaXN0ZXIgKi8KKyAgdXNob3J0IGxpYl92ZXJzaW9uOyAgICAgICAvKiBBZHYgTGlicmFyeSB2ZXJzaW9uIG51bWJlciAqLworICB1c2hvcnQgY29udHJvbF9mbGFnOyAgICAgIC8qIE1pY3JvY29kZSBDb250cm9sIEZsYWcgKi8KKyAgdXNob3J0IG1jb2RlX2RhdGU7ICAgICAgICAvKiBNaWNyb2NvZGUgZGF0ZSAqLworICB1c2hvcnQgbWNvZGVfdmVyc2lvbjsgICAgIC8qIE1pY3JvY29kZSB2ZXJzaW9uICovCisgIHVzaG9ydCBwY2lfc2xvdF9pbmZvOyAgICAgLyogaGlnaCBieXRlIGRldmljZS9mdW5jdGlvbiBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIDctMyBkZXZpY2UgbnVtLiwgYml0cyAyLTAgZnVuY3Rpb24gbnVtLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvdyBieXRlIGJ1cyBudW0uICovCisgIHVzaG9ydCBzZXJpYWwxOyAgICAgICAgICAgLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAxICovCisgIHVzaG9ydCBzZXJpYWwyOyAgICAgICAgICAgLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAyICovCisgIHVzaG9ydCBzZXJpYWwzOyAgICAgICAgICAgLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAzICovCisgIHN0cnVjdCBkZXZpY2UgKmRldjsgIC8qIHBvaW50ZXIgdG8gdGhlIHBjaSBkZXYgc3RydWN0dXJlIGZvciB0aGlzIGJvYXJkICovCit9IEFEVl9EVkNfQ0ZHOworCitzdHJ1Y3QgYWR2X2R2Y192YXI7CitzdHJ1Y3QgYWR2X3Njc2lfcmVxX3E7CisKK3R5cGVkZWYgdm9pZCAoKiBBRFZfSVNSX0NBTExCQUNLKQorICAgIChzdHJ1Y3QgYWR2X2R2Y192YXIgKiwgc3RydWN0IGFkdl9zY3NpX3JlcV9xICopOworCit0eXBlZGVmIHZvaWQgKCogQURWX0FTWU5DX0NBTExCQUNLKQorICAgIChzdHJ1Y3QgYWR2X2R2Y192YXIgKiwgdWNoYXIpOworCisvKgorICogQWRhcHRlciBvcGVyYXRpb24gdmFyaWFibGUgc3RydWN0dXJlLgorICoKKyAqIE9uZSBzdHJ1Y3R1cmUgaXMgcmVxdWlyZWQgcGVyIGhvc3QgYWRhcHRlci4KKyAqCisgKiBGaWVsZCBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiAgKl9hYmxlIGluZGljYXRlcyBib3RoIHdoZXRoZXIgYSBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgKiAgYW5kIHdoZXRoZXIgYSBkZXZpY2UgaXNpIGNhcGFibGUgb2YgdGhlIGZlYXR1cmUuIEF0IGluaXRpYWxpemF0aW9uCisgKiAgdGhpcyBmaWVsZCBtYXkgYmUgc2V0LCBidXQgbGF0ZXIgaWYgYSBkZXZpY2UgaXMgZm91bmQgdG8gYmUgaW5jYXBhYmxlCisgKiAgb2YgdGhlIGZlYXR1cmUsIHRoZSBmaWVsZCBpcyBjbGVhcmVkLgorICovCit0eXBlZGVmIHN0cnVjdCBhZHZfZHZjX3ZhciB7CisgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOyAgIC8qIEkvTyBwb3J0IGFkZHJlc3MgKi8KKyAgdXNob3J0IGVycl9jb2RlOyAgICAgICAgLyogZmF0YWwgZXJyb3IgY29kZSAqLworICB1c2hvcnQgYmlvc19jdHJsOyAgICAgICAvKiBCSU9TIGNvbnRyb2wgd29yZCwgRUVQUk9NIHdvcmQgMTIgKi8KKyAgQURWX0lTUl9DQUxMQkFDSyBpc3JfY2FsbGJhY2s7CisgIEFEVl9BU1lOQ19DQUxMQkFDSyBhc3luY19jYWxsYmFjazsKKyAgdXNob3J0IHdkdHJfYWJsZTsgICAgICAgLyogdHJ5IFdEVFIgZm9yIGEgZGV2aWNlICovCisgIHVzaG9ydCBzZHRyX2FibGU7ICAgICAgIC8qIHRyeSBTRFRSIGZvciBhIGRldmljZSAqLworICB1c2hvcnQgdWx0cmFfYWJsZTsgICAgICAvKiB0cnkgU0RUUiBVbHRyYSBzcGVlZCBmb3IgYSBkZXZpY2UgKi8KKyAgdXNob3J0IHNkdHJfc3BlZWQxOyAgICAgLyogRUVQUk9NIFNEVFIgU3BlZWQgZm9yIFRJRCAwLTMgICAqLworICB1c2hvcnQgc2R0cl9zcGVlZDI7ICAgICAvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDQtNyAgICovCisgIHVzaG9ydCBzZHRyX3NwZWVkMzsgICAgIC8qIEVFUFJPTSBTRFRSIFNwZWVkIGZvciBUSUQgOC0xMSAgKi8KKyAgdXNob3J0IHNkdHJfc3BlZWQ0OyAgICAgLyogRUVQUk9NIFNEVFIgU3BlZWQgZm9yIFRJRCAxMi0xNSAqLworICB1c2hvcnQgdGFncW5nX2FibGU7ICAgICAvKiB0cnkgdGFnZ2VkIHF1ZXVpbmcgd2l0aCBhIGRldmljZSAqLworICB1c2hvcnQgcHByX2FibGU7ICAgICAgICAvKiBQUFIgbWVzc2FnZSBjYXBhYmxlIHBlciBUSUQgYml0bWFzay4gKi8KKyAgdWNoYXIgIG1heF9kdmNfcW5nOyAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGFnZ2VkIGNvbW1hbmRzIHBlciBkZXZpY2UgKi8KKyAgdXNob3J0IHN0YXJ0X21vdG9yOyAgICAgLyogc3RhcnQgbW90b3IgY29tbWFuZCBhbGxvd2VkICovCisgIHVjaGFyICBzY3NpX3Jlc2V0X3dhaXQ7IC8qIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgc2NzaSBidXMgcmVzZXQgKi8KKyAgdWNoYXIgIGNoaXBfbm87ICAgICAgICAgLyogc2hvdWxkIGJlIGFzc2lnbmVkIGJ5IGNhbGxlciAqLworICB1Y2hhciAgbWF4X2hvc3RfcW5nOyAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBRJ2VkIGNvbW1hbmQgYWxsb3dlZCAqLworICB1Y2hhciAgaXJxX25vOyAgICAgICAgICAvKiBJUlEgbnVtYmVyICovCisgIHVzaG9ydCBub19zY2FtOyAgICAgICAgIC8qIHNjYW1fdG9sZXJhbnQgb2YgRUVQUk9NICovCisgIHN0cnVjdCBhc2NfYm9hcmQgKmRydl9wdHI7IC8qIGRyaXZlciBwb2ludGVyIHRvIHByaXZhdGUgc3RydWN0dXJlICovCisgIHVjaGFyICBjaGlwX3Njc2lfaWQ7ICAgIC8qIGNoaXAgU0NTSSB0YXJnZXQgSUQgKi8KKyAgdWNoYXIgIGNoaXBfdHlwZTsKKyAgdWNoYXIgIGJpc3RfZXJyX2NvZGU7CisgIEFEVl9DQVJSX1QgKmNhcnJpZXJfYnVmOworICBBRFZfQ0FSUl9UICpjYXJyX2ZyZWVsaXN0OyAvKiBDYXJyaWVyIGZyZWUgbGlzdC4gKi8KKyAgQURWX0NBUlJfVCAqaWNxX3NwOyAgLyogSW5pdGlhdG9yIGNvbW1hbmQgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLworICBBRFZfQ0FSUl9UICppcnFfc3A7ICAvKiBJbml0aWF0b3IgcmVzcG9uc2UgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLworICB1c2hvcnQgY2Fycl9wZW5kaW5nX2NudDsgICAgLyogQ291bnQgb2YgcGVuZGluZyBjYXJyaWVycy4gKi8KKyAvKgorICAqIE5vdGU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIHdpbGwgbm90IGJlIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uIFRoZQorICAqIGRyaXZlciBtYXkgZGlzY2FyZCB0aGUgYnVmZmVyIGFmdGVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUuCisgICovCisgIEFEVl9EVkNfQ0ZHICpjZmc7IC8qIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgKi8KK30gQURWX0RWQ19WQVI7CisKKyNkZWZpbmUgTk9fT0ZfU0dfUEVSX0JMT0NLICAgICAgICAgICAgICAxNQorCit0eXBlZGVmIHN0cnVjdCBhc2Nfc2dfYmxvY2sgeworICAgIHVjaGFyIHJlc2VydmVkMTsKKyAgICB1Y2hhciByZXNlcnZlZDI7CisgICAgdWNoYXIgcmVzZXJ2ZWQzOworICAgIHVjaGFyIHNnX2NudDsgICAgICAgICAgICAgICAgICAgICAvKiBWYWxpZCBlbnRyaWVzIGluIGJsb2NrLiAqLworICAgIEFEVl9QQUREUiBzZ19wdHI7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG5leHQgc2cgYmxvY2suICovCisgICAgc3RydWN0ICB7CisgICAgICAgIEFEVl9QQUREUiBzZ19hZGRyOyAgICAgICAgICAgICAgICAgIC8qIFNHIGVsZW1lbnQgYWRkcmVzcy4gKi8KKyAgICAgICAgQURWX0RDTlQgIHNnX2NvdW50OyAgICAgICAgICAgICAgICAgLyogU0cgZWxlbWVudCBjb3VudC4gKi8KKyAgICB9IHNnX2xpc3RbTk9fT0ZfU0dfUEVSX0JMT0NLXTsKK30gQURWX1NHX0JMT0NLOworCisvKgorICogQURWX1NDU0lfUkVRX1EgLSBtaWNyb2NvZGUgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqCisgKiBBbGwgZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIHVwIHRvIGJ5dGUgNjAgYXJlIHVzZWQgYnkgdGhlIG1pY3JvY29kZS4KKyAqIFRoZSBtaWNyb2NvZGUgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHNpemUgYW5kIG9yZGVyaW5nIG9mIGZpZWxkcworICogaW4gdGhpcyBzdHJ1Y3R1cmUuIERvIG5vdCBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGhlcmUgd2l0aG91dAorICogY29vcmRpbmF0aW5nIHRoZSBjaGFuZ2Ugd2l0aCB0aGUgbWljcm9jb2RlLgorICoKKyAqIEFsbCBmaWVsZHMgYWNjZXNzZWQgYnkgbWljcm9jb2RlIG11c3QgYmUgbWFpbnRhaW5lZCBpbiBsaXR0bGVfZW5kaWFuCisgKiBvcmRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWR2X3Njc2lfcmVxX3EgeworICAgIHVjaGFyICAgICAgIGNudGw7ICAgICAgICAgICAvKiBVY29kZSBmbGFncyBhbmQgc3RhdGUgKEFTQ19NQ19RQ18qKS4gKi8KKyAgICB1Y2hhciAgICAgICB0YXJnZXRfY21kOworICAgIHVjaGFyICAgICAgIHRhcmdldF9pZDsgICAgICAvKiBEZXZpY2UgdGFyZ2V0IGlkZW50aWZpZXIuICovCisgICAgdWNoYXIgICAgICAgdGFyZ2V0X2x1bjsgICAgIC8qIERldmljZSB0YXJnZXQgbG9naWNhbCB1bml0IG51bWJlci4gKi8KKyAgICBBRFZfUEFERFIgICBkYXRhX2FkZHI7ICAgICAgLyogRGF0YSBidWZmZXIgcGh5c2ljYWwgYWRkcmVzcy4gKi8KKyAgICBBRFZfRENOVCAgICBkYXRhX2NudDsgICAgICAgLyogRGF0YSBjb3VudC4gVWNvZGUgc2V0cyB0byByZXNpZHVhbC4gKi8KKyAgICBBRFZfUEFERFIgICBzZW5zZV9hZGRyOworICAgIEFEVl9QQUREUiAgIGNhcnJfcGE7CisgICAgdWNoYXIgICAgICAgbWZsYWc7CisgICAgdWNoYXIgICAgICAgc2Vuc2VfbGVuOworICAgIHVjaGFyICAgICAgIGNkYl9sZW47ICAgICAgICAvKiBTQ1NJIENEQiBsZW5ndGguIE11c3QgPD0gMTYgYnl0ZXMuICovCisgICAgdWNoYXIgICAgICAgc2NzaV9jbnRsOworICAgIHVjaGFyICAgICAgIGRvbmVfc3RhdHVzOyAgICAvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KKyAgICB1Y2hhciAgICAgICBzY3NpX3N0YXR1czsgICAgLyogU0NTSSBzdGF0dXMgYnl0ZS4gKi8KKyAgICB1Y2hhciAgICAgICBob3N0X3N0YXR1czsgICAgLyogVWNvZGUgaG9zdCBzdGF0dXMuICovCisgICAgdWNoYXIgICAgICAgc2dfd29ya2luZ19peDsKKyAgICB1Y2hhciAgICAgICBjZGJbMTJdOyAgICAgICAgLyogU0NTSSBDREIgYnl0ZXMgMC0xMS4gKi8KKyAgICBBRFZfUEFERFIgICBzZ19yZWFsX2FkZHI7ICAgLyogU0cgbGlzdCBwaHlzaWNhbCBhZGRyZXNzLiAqLworICAgIEFEVl9QQUREUiAgIHNjc2lxX3JwdHI7CisgICAgdWNoYXIgICAgICAgY2RiMTZbNF07ICAgICAgIC8qIFNDU0kgQ0RCIGJ5dGVzIDEyLTE1LiAqLworICAgIEFEVl9WQUREUiAgIHNjc2lxX3B0cjsKKyAgICBBRFZfVkFERFIgICBjYXJyX3ZhOworICAgIC8qCisgICAgICogRW5kIG9mIG1pY3JvY29kZSBzdHJ1Y3R1cmUgLSA2MCBieXRlcy4gVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZQorICAgICAqIGlzIHVzZWQgYnkgdGhlIEFkdiBMaWJyYXJ5IGFuZCBpZ25vcmVkIGJ5IHRoZSBtaWNyb2NvZGUuCisgICAgICovCisgICAgQURWX1ZBRERSICAgc3JiX3B0cjsKKyAgICBBRFZfU0dfQkxPQ0sgKnNnX2xpc3RfcHRyOyAvKiBTRyBsaXN0IHZpcnR1YWwgYWRkcmVzcy4gKi8KKyAgICBjaGFyICAgICAgICAqdmRhdGFfYWRkcjsgICAvKiBEYXRhIGJ1ZmZlciB2aXJ0dWFsIGFkZHJlc3MuICovCisgICAgdWNoYXIgICAgICAgYV9mbGFnOworICAgIHVjaGFyICAgICAgIHBhZFsyXTsgICAgICAgIC8qIFBhZCBvdXQgdG8gYSB3b3JkIGJvdW5kYXJ5LiAqLworfSBBRFZfU0NTSV9SRVFfUTsKKworLyoKKyAqIE1pY3JvY29kZSBpZGxlIGxvb3AgY29tbWFuZHMKKyAqLworI2RlZmluZSBJRExFX0NNRF9DT01QTEVURUQgICAgICAgICAgIDAKKyNkZWZpbmUgSURMRV9DTURfU1RPUF9DSElQICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSURMRV9DTURfU1RPUF9DSElQX1NFTkRfSU5UICAweDAwMDIKKyNkZWZpbmUgSURMRV9DTURfU0VORF9JTlQgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSURMRV9DTURfQUJPUlQgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSURMRV9DTURfREVWSUNFX1JFU0VUICAgICAgICAweDAwMTAKKyNkZWZpbmUgSURMRV9DTURfU0NTSV9SRVNFVF9TVEFSVCAgICAweDAwMjAgLyogQXNzZXJ0IFNDU0kgQnVzIFJlc2V0ICovCisjZGVmaW5lIElETEVfQ01EX1NDU0lfUkVTRVRfRU5EICAgICAgMHgwMDQwIC8qIERlYXNzZXJ0IFNDU0kgQnVzIFJlc2V0ICovCisjZGVmaW5lIElETEVfQ01EX1NDU0lSRVEgICAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgSURMRV9DTURfU1RBVFVTX1NVQ0NFU1MgICAgICAweDAwMDEKKyNkZWZpbmUgSURMRV9DTURfU1RBVFVTX0ZBSUxVUkUgICAgICAweDAwMDIKKworLyoKKyAqIEFkdlNlbmRJZGxlQ21kKCkgZmxhZyBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBBRFZfTk9XQUlUICAgICAweDAxCisKKy8qCisgKiBXYWl0IGxvb3AgdGltZSBvdXQgdmFsdWVzLgorICovCisjZGVmaW5lIFNDU0lfV0FJVF8xMF9TRUMgICAgICAgICAgICAgMTBVTCAgICAvKiAxMCBzZWNvbmRzICovCisjZGVmaW5lIFNDU0lfV0FJVF8xMDBfTVNFQyAgICAgICAgICAgMTAwVUwgICAvKiAxMDAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFNDU0lfVVNfUEVSX01TRUMgICAgICAgICAgICAgMTAwMCAgICAvKiBtaWNyb3NlY29uZHMgcGVyIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIFNDU0lfTVNfUEVSX1NFQyAgICAgICAgICAgICAgMTAwMFVMICAvKiBtaWxsaXNlY29uZHMgcGVyIHNlY29uZCAqLworI2RlZmluZSBTQ1NJX01BWF9SRVRSWSAgICAgICAgICAgICAgIDEwICAgICAgLyogcmV0cnkgY291bnQgKi8KKworI2RlZmluZSBBRFZfQVNZTkNfUkRNQV9GQUlMVVJFICAgICAgICAgIDB4MDEgLyogRmF0YWwgUkRNQSBmYWlsdXJlLiAqLworI2RlZmluZSBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUICAgIDB4MDIgLyogRGV0ZWN0ZWQgU0NTSSBCdXMgUmVzZXQuICovCisjZGVmaW5lIEFEVl9BU1lOQ19DQVJSSUVSX1JFQURZX0ZBSUxVUkUgMHgwMyAvKiBDYXJyaWVyIFJlYWR5IGZhaWx1cmUuICovCisjZGVmaW5lIEFEVl9SRE1BX0lOX0NBUlJfQU5EX1FfSU5WQUxJRCAgMHgwNCAvKiBSRE1BZWQtaW4gZGF0YSBpbnZhbGlkLiAqLworCisKKyNkZWZpbmUgQURWX0hPU1RfU0NTSV9CVVNfUkVTRVQgICAgICAweDgwIC8qIEhvc3QgSW5pdGlhdGVkIFNDU0kgQnVzIFJlc2V0LiAqLworCisvKgorICogRGV2aWNlIGRyaXZlcnMgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMuCisgKi8KK1NUQVRJQyBpbmxpbmUgdWxvbmcgRHZjRW50ZXJDcml0aWNhbCh2b2lkKTsKK1NUQVRJQyBpbmxpbmUgdm9pZCAgRHZjTGVhdmVDcml0aWNhbCh1bG9uZyk7CitTVEFUSUMgdm9pZCAgRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRENOVCk7CitTVEFUSUMgdWNoYXIgRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoQURWX0RWQ19WQVIgKiwgdXNob3J0KTsKK1NUQVRJQyB2b2lkICBEdmNBZHZXcml0ZVBDSUNvbmZpZ0J5dGUoQURWX0RWQ19WQVIgKiwgdXNob3J0LCB1Y2hhcik7CitTVEFUSUMgQURWX1BBRERSIER2Y0dldFBoeUFkZHIoQURWX0RWQ19WQVIgKiwgQURWX1NDU0lfUkVRX1EgKiwKKyAgICAgICAgICAgICAgICB1Y2hhciAqLCBBU0NfU0RDTlQgKiwgaW50KTsKK1NUQVRJQyB2b2lkICBEdmNEZWxheU1pY3JvU2Vjb25kKEFEVl9EVkNfVkFSICosIHVzaG9ydCk7CisKKy8qCisgKiBBZHYgTGlicmFyeSBmdW5jdGlvbnMgYXZhaWxhYmxlIHRvIGRyaXZlcnMuCisgKi8KK1NUQVRJQyBpbnQgICAgIEFkdkV4ZVNjc2lRdWV1ZShBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdklTUihBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdkluaXRHZXRDb25maWcoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgaW50ICAgICBBZHZJbml0QXNjMzU1MERyaXZlcihBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdkluaXRBc2MzOEMwODAwRHJpdmVyKEFEVl9EVkNfVkFSICopOworU1RBVElDIGludCAgICAgQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgaW50ICAgICBBZHZSZXNldENoaXBBbmRTQihBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgIEFkdlJlc2V0U0IoQURWX0RWQ19WQVIgKmFzY19kdmMpOworCisvKgorICogSW50ZXJuYWwgQWR2IExpYnJhcnkgZnVuY3Rpb25zLgorICovCitTVEFUSUMgaW50ICAgIEFkdlNlbmRJZGxlQ21kKEFEVl9EVkNfVkFSICosIHVzaG9ydCwgQURWX0RDTlQpOworU1RBVElDIHZvaWQgICBBZHZJbnF1aXJ5SGFuZGxpbmcoQURWX0RWQ19WQVIgKiwgQURWX1NDU0lfUkVRX1EgKik7CitTVEFUSUMgaW50ICAgIEFkdkluaXRGcm9tMzU1MEVFUChBRFZfRFZDX1ZBUiAqKTsKK1NUQVRJQyBpbnQgICAgQWR2SW5pdEZyb20zOEMwODAwRUVQKEFEVl9EVkNfVkFSICopOworU1RBVElDIGludCAgICBBZHZJbml0RnJvbTM4QzE2MDBFRVAoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgdXNob3J0IEFkdkdldDM1NTBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zNTUwX0NPTkZJRyAqKTsKK1NUQVRJQyB2b2lkICAgQWR2U2V0MzU1MEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM1NTBfQ09ORklHICopOworU1RBVElDIHVzaG9ydCBBZHZHZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKik7CitTVEFUSUMgdm9pZCAgIEFkdlNldDM4QzA4MDBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAqKTsKK1NUQVRJQyB1c2hvcnQgQWR2R2V0MzhDMTYwMEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM4QzE2MDBfQ09ORklHICopOworU1RBVElDIHZvaWQgICBBZHZTZXQzOEMxNjAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMTYwMF9DT05GSUcgKik7CitTVEFUSUMgdm9pZCAgIEFkdldhaXRFRVBDbWQoQWR2UG9ydEFkZHIpOworU1RBVElDIHVzaG9ydCBBZHZSZWFkRUVQV29yZChBZHZQb3J0QWRkciwgaW50KTsKKworLyoKKyAqIFBDSSBCdXMgRGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZyAgICAgMHgwMDA3CisjZGVmaW5lIEFzY1BDSUNtZFJlZ0JpdHNfUGFyRXJyUmVzcEN0cmwgICAweDAwNDAKKworLyogUmVhZCBieXRlIGZyb20gYSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgcmVnX29mZikgXAorICAgICAoQURWX01FTV9SRUFEQigoaW9wX2Jhc2UpICsgKHJlZ19vZmYpKSkKKworLyogV3JpdGUgYnl0ZSB0byBhIHJlZ2lzdGVyLiAqLworI2RlZmluZSBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgcmVnX29mZiwgYnl0ZSkgXAorICAgICAoQURWX01FTV9XUklURUIoKGlvcF9iYXNlKSArIChyZWdfb2ZmKSwgKGJ5dGUpKSkKKworLyogUmVhZCB3b3JkICgyIGJ5dGVzKSBmcm9tIGEgcmVnaXN0ZXIuICovCisjZGVmaW5lIEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIHJlZ19vZmYpIFwKKyAgICAgKEFEVl9NRU1fUkVBRFcoKGlvcF9iYXNlKSArIChyZWdfb2ZmKSkpCisKKy8qIFdyaXRlIHdvcmQgKDIgYnl0ZXMpIHRvIGEgcmVnaXN0ZXIuICovCisjZGVmaW5lIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCByZWdfb2ZmLCB3b3JkKSBcCisgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgKHJlZ19vZmYpLCAod29yZCkpKQorCisvKiBXcml0ZSBkd29yZCAoNCBieXRlcykgdG8gYSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQWR2V3JpdGVEV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCByZWdfb2ZmLCBkd29yZCkgXAorICAgICAoQURWX01FTV9XUklURURXKChpb3BfYmFzZSkgKyAocmVnX29mZiksIChkd29yZCkpKQorCisvKiBSZWFkIGJ5dGUgZnJvbSBMUkFNLiAqLworI2RlZmluZSBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIGFkZHIsIGJ5dGUpIFwKK2RvIHsgXAorICAgIEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9BRERSLCAoYWRkcikpOyBcCisgICAgKGJ5dGUpID0gQURWX01FTV9SRUFEQigoaW9wX2Jhc2UpICsgSU9QQl9SQU1fREFUQSk7IFwKK30gd2hpbGUgKDApCisKKy8qIFdyaXRlIGJ5dGUgdG8gTFJBTS4gKi8KKyNkZWZpbmUgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgYWRkciwgYnl0ZSkgXAorICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fQUREUiwgKGFkZHIpKSwgXAorICAgICBBRFZfTUVNX1dSSVRFQigoaW9wX2Jhc2UpICsgSU9QQl9SQU1fREFUQSwgKGJ5dGUpKSkKKworLyogUmVhZCB3b3JkICgyIGJ5dGVzKSBmcm9tIExSQU0uICovCisjZGVmaW5lIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgYWRkciwgd29yZCkgXAorZG8geyBcCisgICAgQURWX01FTV9XUklURVcoKGlvcF9iYXNlKSArIElPUFdfUkFNX0FERFIsIChhZGRyKSk7IFwKKyAgICAod29yZCkgPSAoQURWX01FTV9SRUFEVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSkpOyBcCit9IHdoaWxlICgwKQorCisvKiBXcml0ZSB3b3JkICgyIGJ5dGVzKSB0byBMUkFNLiAqLworI2RlZmluZSBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBhZGRyLCB3b3JkKSBcCisgICAgKEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9BRERSLCAoYWRkcikpLCBcCisgICAgIEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9EQVRBLCAod29yZCkpKQorCisvKiBXcml0ZSBsaXR0bGUtZW5kaWFuIGRvdWJsZSB3b3JkICg0IGJ5dGVzKSB0byBMUkFNICovCisvKiBCZWNhdXNlIG9mIHVuc3BlY2lmaWVkIEMgbGFuZ3VhZ2Ugb3JkZXJpbmcgZG9uJ3QgdXNlIGF1dG8taW5jcmVtZW50LiAqLworI2RlZmluZSBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgYWRkciwgZHdvcmQpIFwKKyAgICAoKEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9BRERSLCAoYWRkcikpLCBcCisgICAgICBBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSwgXAorICAgICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMTYoKHVzaG9ydCkgKChkd29yZCkgJiAweEZGRkYpKSkpLCBcCisgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fQUREUiwgKGFkZHIpICsgMiksIFwKKyAgICAgIEFEVl9NRU1fV1JJVEVXKChpb3BfYmFzZSkgKyBJT1BXX1JBTV9EQVRBLCBcCisgICAgICAgICAgICAgICAgICAgICBjcHVfdG9fbGUxNigodXNob3J0KSAoKGR3b3JkID4+IDE2KSAmIDB4RkZGRikpKSkpCisKKy8qIFJlYWQgd29yZCAoMiBieXRlcykgZnJvbSBMUkFNIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBzZXQuICovCisjZGVmaW5lIEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpIFwKKyAgICAgKEFEVl9NRU1fUkVBRFcoKGlvcF9iYXNlKSArIElPUFdfUkFNX0RBVEEpKQorCisvKiBXcml0ZSB3b3JkICgyIGJ5dGVzKSB0byBMUkFNIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSBzZXQuICovCisjZGVmaW5lIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCB3b3JkKSBcCisgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSwgKHdvcmQpKSkKKworCisvKgorICogRGVmaW5lIG1hY3JvIHRvIGNoZWNrIGZvciBDb25kb3Igc2lnbmF0dXJlLgorICoKKyAqIEV2YWx1YXRlIHRvIEFEVl9UUlVFIGlmIGEgQ29uZG9yIGNoaXAgaXMgZm91bmQgdGhlIHNwZWNpZmllZCBwb3J0CisgKiBhZGRyZXNzICdpb3BfYmFzZScuIE90aGVyd2lzZSBldmFsdWUgdG8gQURWX0ZBTFNFLgorICovCisjZGVmaW5lIEFkdkZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpIFwKKyAgICAoKChBZHZSZWFkQnl0ZVJlZ2lzdGVyKChpb3BfYmFzZSksIElPUEJfQ0hJUF9JRF8xKSA9PSBcCisgICAgQURWX0NISVBfSURfQllURSkgJiYgXAorICAgICAoQWR2UmVhZFdvcmRSZWdpc3RlcigoaW9wX2Jhc2UpLCBJT1BXX0NISVBfSURfMCkgPT0gXAorICAgIEFEVl9DSElQX0lEX1dPUkQpKSA/ICBBRFZfVFJVRSA6IEFEVl9GQUxTRSkKKworLyoKKyAqIERlZmluZSBtYWNybyB0byBSZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjaGlwIGF0ICdpb3BfYmFzZScuCisgKgorICogVGhlIHNlY29uZCBwYXJhbWV0ZXIgJ2J1c190eXBlJyBpcyBjdXJyZW50bHkgdW51c2VkLgorICovCisjZGVmaW5lIEFkdkdldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBidXNfdHlwZSkgXAorICAgIEFkdlJlYWRCeXRlUmVnaXN0ZXIoKGlvcF9iYXNlKSwgSU9QQl9DSElQX1RZUEVfUkVWKQorCisvKgorICogQWJvcnQgYW4gU1JCIGluIHRoZSBjaGlwJ3MgUklTQyBNZW1vcnkuIFRoZSAnc3JiX3B0cicgYXJndW1lbnQgbXVzdAorICogbWF0Y2ggdGhlIEFTQ19TQ1NJX1JFUV9RICdzcmJfcHRyJyBmaWVsZC4KKyAqCisgKiBJZiB0aGUgcmVxdWVzdCBoYXMgbm90IHlldCBiZWVuIHNlbnQgdG8gdGhlIGRldmljZSBpdCB3aWxsIHNpbXBseSBiZQorICogYWJvcnRlZCBmcm9tIFJJU0MgbWVtb3J5LiBJZiB0aGUgcmVxdWVzdCBpcyBkaXNjb25uZWN0ZWQgaXQgd2lsbCBiZQorICogYWJvcnRlZCBvbiByZXNlbGVjdGlvbiBieSBzZW5kaW5nIGFuIEFib3J0IE1lc3NhZ2UgdG8gdGhlIHRhcmdldCBJRC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgICAgIEFEVl9UUlVFKDEpIC0gUXVldWUgd2FzIHN1Y2Nlc3NmdWxseSBhYm9ydGVkLgorICogICAgICBBRFZfRkFMU0UoMCkgLSBRdWV1ZSB3YXMgbm90IGZvdW5kIG9uIHRoZSBhY3RpdmUgcXVldWUgbGlzdC4KKyAqLworI2RlZmluZSBBZHZBYm9ydFF1ZXVlKGFzY19kdmMsIHNjc2lxKSBcCisgICAgICAgIEFkdlNlbmRJZGxlQ21kKChhc2NfZHZjKSwgKHVzaG9ydCkgSURMRV9DTURfQUJPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKEFEVl9EQ05UKSAoc2NzaXEpKQorCisvKgorICogU2VuZCBhIEJ1cyBEZXZpY2UgUmVzZXQgTWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBJRC4KKyAqCisgKiBBbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMgd2lsbCBiZSBwdXJnZWQgaWYgc2VuZGluZyB0aGUKKyAqIEJ1cyBEZXZpY2UgUmVzZXQgTWVzc2FnZSBpcyBzdWNjZXNzZnVsLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgQURWX1RSVUUoMSkgLSBBbGwgcmVxdWVzdHMgb24gdGhlIHRhcmdldCBhcmUgcHVyZ2VkLgorICogICAgICBBRFZfRkFMU0UoMCkgLSBDb3VsZG4ndCBpc3N1ZSBCdXMgRGV2aWNlIFJlc2V0IE1lc3NhZ2U7IFJlcXVlc3RzCisgKiAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgcHVyZ2VkLgorICovCisjZGVmaW5lIEFkdlJlc2V0RGV2aWNlKGFzY19kdmMsIHRhcmdldF9pZCkgXAorICAgICAgICBBZHZTZW5kSWRsZUNtZCgoYXNjX2R2YyksICh1c2hvcnQpIElETEVfQ01EX0RFVklDRV9SRVNFVCwgXAorICAgICAgICAgICAgICAgICAgICAoQURWX0RDTlQpICh0YXJnZXRfaWQpKQorCisvKgorICogU0NTSSBXaWRlIFR5cGUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBBRFZfU0NTSV9CSVRfSURfVFlQRSAgIHVzaG9ydAorCisvKgorICogQWR2SW5pdFNjc2lUYXJnZXQoKSAnY250bF9mbGFnJyBvcHRpb25zLgorICovCisjZGVmaW5lIEFEVl9TQ0FOX0xVTiAgICAgICAgICAgMHgwMQorI2RlZmluZSBBRFZfQ0FQSU5GT19OT0xVTiAgICAgIDB4MDIKKworLyoKKyAqIENvbnZlcnQgdGFyZ2V0IGlkIHRvIHRhcmdldCBpZCBiaXQgbWFzay4KKyAqLworI2RlZmluZSBBRFZfVElEX1RPX1RJRE1BU0sodGlkKSAgICgweDAxIDw8ICgodGlkKSAmIEFEVl9NQVhfVElEKSkKKworLyoKKyAqIEFTQ19TQ1NJX1JFUV9RICdkb25lX3N0YXR1cycgYW5kICdob3N0X3N0YXR1cycgcmV0dXJuIHZhbHVlcy4KKyAqLworCisjZGVmaW5lIFFEX05PX1NUQVRVUyAgICAgICAgIDB4MDAgICAgICAgLyogUmVxdWVzdCBub3QgY29tcGxldGVkIHlldC4gKi8KKyNkZWZpbmUgUURfTk9fRVJST1IgICAgICAgICAgMHgwMQorI2RlZmluZSBRRF9BQk9SVEVEX0JZX0hPU1QgICAweDAyCisjZGVmaW5lIFFEX1dJVEhfRVJST1IgICAgICAgIDB4MDQKKworI2RlZmluZSBRSFNUQV9OT19FUlJPUiAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBRSFNUQV9NX1NFTF9USU1FT1VUICAgICAgICAgMHgxMQorI2RlZmluZSBRSFNUQV9NX0RBVEFfT1ZFUl9SVU4gICAgICAgMHgxMgorI2RlZmluZSBRSFNUQV9NX1VORVhQRUNURURfQlVTX0ZSRUUgMHgxMworI2RlZmluZSBRSFNUQV9NX1FVRVVFX0FCT1JURUQgICAgICAgMHgxNQorI2RlZmluZSBRSFNUQV9NX1NYRlJfU0RNQV9FUlIgICAgICAgMHgxNiAvKiBTWEZSX1NUQVRVUyBTQ1NJIERNQSBFcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfU1hGUl9QRVJSICAgICAgMHgxNyAvKiBTWEZSX1NUQVRVUyBTQ1NJIEJ1cyBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgUUhTVEFfTV9SRE1BX1BFUlIgICAgICAgICAgIDB4MTggLyogUklTQyBQQ0kgRE1BIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfT0ZGX1VGTFcgICAgICAgMHgxOSAvKiBTWEZSX1NUQVRVUyBPZmZzZXQgVW5kZXJmbG93ICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9PRkZfT0ZMVyAgICAgICAweDIwIC8qIFNYRlJfU1RBVFVTIE9mZnNldCBPdmVyZmxvdyAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfV0RfVE1PICAgICAgICAgMHgyMSAvKiBTWEZSX1NUQVRVUyBXYXRjaGRvZyBUaW1lb3V0ICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9ERVNFTEVDVEVEICAgICAweDIyIC8qIFNYRlJfU1RBVFVTIERlc2VsZWN0ZWQgKi8KKy8qIE5vdGU6IFFIU1RBX01fU1hGUl9YRlJfT0ZMVyBpcyBpZGVudGljYWwgdG8gUUhTVEFfTV9EQVRBX09WRVJfUlVOLiAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfWEZSX09GTFcgICAgICAgMHgxMiAvKiBTWEZSX1NUQVRVUyBUcmFuc2ZlciBPdmVyZmxvdyAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfWEZSX1BIX0VSUiAgICAgMHgyNCAvKiBTWEZSX1NUQVRVUyBUcmFuc2ZlciBQaGFzZSBFcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1NYRlJfVU5LTk9XTl9FUlJPUiAgMHgyNSAvKiBTWEZSX1NUQVRVUyBVbmtub3duIEVycm9yICovCisjZGVmaW5lIFFIU1RBX01fU0NTSV9CVVNfUkVTRVQgICAgICAweDMwIC8qIFJlcXVlc3QgYWJvcnRlZCBmcm9tIFNCUiAqLworI2RlZmluZSBRSFNUQV9NX1NDU0lfQlVTX1JFU0VUX1VOU09MIDB4MzEgLyogUmVxdWVzdCBhYm9ydGVkIGZyb20gdW5zb2wuIFNCUiAqLworI2RlZmluZSBRSFNUQV9NX0JVU19ERVZJQ0VfUkVTRVQgICAgMHgzMiAvKiBSZXF1ZXN0IGFib3J0ZWQgZnJvbSBCRFIgKi8KKyNkZWZpbmUgUUhTVEFfTV9ESVJFQ1RJT05fRVJSICAgICAgIDB4MzUgLyogRGF0YSBQaGFzZSBtaXNtYXRjaCAqLworI2RlZmluZSBRSFNUQV9NX0RJUkVDVElPTl9FUlJfSFVORyAgMHgzNiAvKiBEYXRhIFBoYXNlIG1pc21hdGNoIGFuZCBidXMgaGFuZyAqLworI2RlZmluZSBRSFNUQV9NX1dUTV9USU1FT1VUICAgICAgICAgMHg0MQorI2RlZmluZSBRSFNUQV9NX0JBRF9DTVBMX1NUQVRVU19JTiAgMHg0MgorI2RlZmluZSBRSFNUQV9NX05PX0FVVE9fUkVRX1NFTlNFICAgMHg0MworI2RlZmluZSBRSFNUQV9NX0FVVE9fUkVRX1NFTlNFX0ZBSUwgMHg0NAorI2RlZmluZSBRSFNUQV9NX0lOVkFMSURfREVWSUNFICAgICAgMHg0NSAvKiBCYWQgdGFyZ2V0IElEICovCisjZGVmaW5lIFFIU1RBX01fRlJPWkVOX1RJRFEgICAgICAgICAweDQ2IC8qIFRJRCBRdWV1ZSBmcm96ZW4uICovCisjZGVmaW5lIFFIU1RBX01fU0dCQUNLVVBfRVJST1IgICAgICAweDQ3IC8qIFNjYXR0ZXItR2F0aGVyIGJhY2t1cCBlcnJvciAqLworCisKKy8qCisgKiBEZWZhdWx0IEVFUFJPTSBDb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbmVkIGluIGFfaW5pdC5jLgorICovCitzdGF0aWMgQURWRUVQXzM1NTBfQ09ORklHIERlZmF1bHRfMzU1MF9FRVBST01fQ29uZmlnOworc3RhdGljIEFEVkVFUF8zOEMwODAwX0NPTkZJRyBEZWZhdWx0XzM4QzA4MDBfRUVQUk9NX0NvbmZpZzsKK3N0YXRpYyBBRFZFRVBfMzhDMTYwMF9DT05GSUcgRGVmYXVsdF8zOEMxNjAwX0VFUFJPTV9Db25maWc7CisKKy8qCisgKiBEdmNHZXRQaHlBZGRyKCkgZmxhZyBhcmd1bWVudHMKKyAqLworI2RlZmluZSBBRFZfSVNfU0NTSVFfRkxBRyAgICAgICAweDAxIC8qICdhZGRyJyBpcyBBU0NfU0NTSV9SRVFfUSBwb2ludGVyICovCisjZGVmaW5lIEFEVl9BU0NHRVRTR0xJU1RfVkFERFIgIDB4MDIgLyogJ2FkZHInIGlzIEFzY0dldFNHTGlzdCgpIHZpcnR1YWwgYWRkciAqLworI2RlZmluZSBBRFZfSVNfU0VOU0VfRkxBRyAgICAgICAweDA0IC8qICdhZGRyJyBpcyBzZW5zZSB2aXJ0dWFsIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURWX0lTX0RBVEFfRkxBRyAgICAgICAgMHgwOCAvKiAnYWRkcicgaXMgZGF0YSB2aXJ0dWFsIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURWX0lTX1NHTElTVF9GTEFHICAgICAgMHgxMCAvKiAnYWRkcicgaXMgc2dsaXN0IHZpcnR1YWwgcG9pbnRlciAqLworI2RlZmluZSBBRFZfSVNfQ0FSUklFUl9GTEFHICAgICAweDIwIC8qICdhZGRyJyBpcyBBRFZfQ0FSUl9UIHBvaW50ZXIgKi8KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIHRoYXQgaXMgYWxpZ25lZCBhdCB0aGUgbmV4dCBkb3VibGV3b3JkID49IHRvICdhZGRyJy4gKi8KKyNkZWZpbmUgQURWXzhCQUxJR04oYWRkcikgICAgICAoKCh1bG9uZykgKGFkZHIpICsgMHg3KSAmIH4weDcpCisjZGVmaW5lIEFEVl8xNkJBTElHTihhZGRyKSAgICAgKCgodWxvbmcpIChhZGRyKSArIDB4RikgJiB+MHhGKQorI2RlZmluZSBBRFZfMzJCQUxJR04oYWRkcikgICAgICgoKHVsb25nKSAoYWRkcikgKyAweDFGKSAmIH4weDFGKQorCisvKgorICogVG90YWwgY29udGlndW91cyBtZW1vcnkgbmVlZGVkIGZvciBkcml2ZXIgU0cgYmxvY2tzLgorICoKKyAqIEFEVl9NQVhfU0dfTElTVCBtdXN0IGJlIGRlZmluZWQgYnkgYSBkcml2ZXIuIEl0IGlzIHRoZSBtYXhpbXVtCisgKiBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgdGhlIGRyaXZlciBzdXBwb3J0cyBpbiBhCisgKiBzaW5nbGUgcmVxdWVzdC4KKyAqLworCisjZGVmaW5lIEFEVl9TR19MSVNUX01BWF9CWVRFX1NJWkUgXAorICAgICAgICAgKHNpemVvZihBRFZfU0dfQkxPQ0spICogXAorICAgICAgICAgICgoQURWX01BWF9TR19MSVNUICsgKE5PX09GX1NHX1BFUl9CTE9DSyAtIDEpKS9OT19PRl9TR19QRVJfQkxPQ0spKQorCisvKgorICogSW5xdWlyeSBkYXRhIHN0cnVjdHVyZSBhbmQgYml0ZmllbGQgbWFjcm9zCisgKgorICogVXNpbmcgYml0ZmllbGRzIHRvIGFjY2VzcyB0aGUgc3ViY2hhciBkYXRhIGlzbid0IHBvcnRhYmxlIGFjcm9zcworICogZW5kaWFubmVzcywgc28gaW5zdGVhZCBtYXNrIGFuZCBzaGlmdC4gT25seSBxdWFudGl0aWVzIG9mIG1vcmUKKyAqIHRoYW4gMSBiaXQgYXJlIHNoaWZ0ZWQsIHNpbmNlIHRoZSBvdGhlcnMgYXJlIGp1c3QgdGVzdGVkIGZvciB0cnVlCisgKiBvciBmYWxzZS4KKyAqLworCisjZGVmaW5lIEFEVl9JTlFfRFZDX1RZUEUoaW5xKSAgICAgICAoKGlucSktPnBlcmlwaCAmIDB4MWYpCisjZGVmaW5lIEFEVl9JTlFfUVVBTElGSUVSKGlucSkgICAgICAoKChpbnEpLT5wZXJpcGggJiAweGUwKSA+PiA1KQorI2RlZmluZSBBRFZfSU5RX0RWQ19UWVBFX01PRChpbnEpICAgKChpbnEpLT5kZXZ0eXBlICYgMHg3ZikKKyNkZWZpbmUgQURWX0lOUV9SRU1PVkFCTEUoaW5xKSAgICAgICgoaW5xKS0+ZGV2dHlwZSAmIDB4ODApCisjZGVmaW5lIEFEVl9JTlFfQU5TSV9WRVIoaW5xKSAgICAgICAoKGlucSktPnZlciAmIDB4MDcpCisjZGVmaW5lIEFEVl9JTlFfRUNNQV9WRVIoaW5xKSAgICAgICAoKChpbnEpLT52ZXIgJiAweDM4KSA+PiAzKQorI2RlZmluZSBBRFZfSU5RX0lTT19WRVIoaW5xKSAgICAgICAgKCgoaW5xKS0+dmVyICYgMHhjMCkgPj4gNikKKyNkZWZpbmUgQURWX0lOUV9SRVNQT05TRV9GTVQoaW5xKSAgICgoaW5xKS0+Ynl0ZTMgJiAweDBmKQorI2RlZmluZSBBRFZfSU5RX1RFUk1fSU8oaW5xKSAgICAgICAgKChpbnEpLT5ieXRlMyAmIDB4NDApCisjZGVmaW5lIEFEVl9JTlFfQVNZTkNfTk9USUYoaW5xKSAgICAoKGlucSktPmJ5dGUzICYgMHg4MCkKKyNkZWZpbmUgQURWX0lOUV9TT0ZUX1JFU0VUKGlucSkgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDAxKQorI2RlZmluZSBBRFZfSU5RX0NNRF9RVUVVRShpbnEpICAgICAgKChpbnEpLT5mbGFncyAmIDB4MDIpCisjZGVmaW5lIEFEVl9JTlFfTElOS19DTUQoaW5xKSAgICAgICAoKGlucSktPmZsYWdzICYgMHgwOCkKKyNkZWZpbmUgQURWX0lOUV9TWU5DKGlucSkgICAgICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDEwKQorI2RlZmluZSBBRFZfSU5RX1dJREUxNihpbnEpICAgICAgICAgKChpbnEpLT5mbGFncyAmIDB4MjApCisjZGVmaW5lIEFEVl9JTlFfV0lERTMyKGlucSkgICAgICAgICAoKGlucSktPmZsYWdzICYgMHg0MCkKKyNkZWZpbmUgQURWX0lOUV9SRUxfQUREUihpbnEpICAgICAgICgoaW5xKS0+ZmxhZ3MgJiAweDgwKQorI2RlZmluZSBBRFZfSU5RX0lORk9fVU5JVChpbnEpICAgICAgKChpbnEpLT5pbmZvICYgMHgwMSkKKyNkZWZpbmUgQURWX0lOUV9RVUlDS19BUkIoaW5xKSAgICAgICgoaW5xKS0+aW5mbyAmIDB4MDIpCisjZGVmaW5lIEFEVl9JTlFfQ0xPQ0tJTkcoaW5xKSAgICAgICAoKChpbnEpLT5pbmZvICYgMHgwYykgPj4gMikKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1Y2hhciBwZXJpcGg7ICAgICAgICAgICAgICAgICAvKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlIFswOjRdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyIFs1OjddICovCisgIHVjaGFyIGRldnR5cGU7ICAgICAgICAgICAgICAgIC8qIGRldmljZSB0eXBlIG1vZGlmaWVyIChmb3IgU0NTSSBJKSBbMDo2XSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSTUIgLSByZW1vdmFibGUgbWVkaXVtIGJpdCBbN10gKi8KKyAgdWNoYXIgdmVyOyAgICAgICAgICAgICAgICAgICAgLyogQU5TSSBhcHByb3ZlZCB2ZXJzaW9uIFswOjJdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVDTUEgdmVyc2lvbiBbMzo1XSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJU08gdmVyc2lvbiBbNjo3XSAqLworICB1Y2hhciBieXRlMzsgICAgICAgICAgICAgICAgICAvKiByZXNwb25zZSBkYXRhIGZvcm1hdCBbMDozXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIFNDU0kgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIENDUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIFNDU0ktMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLUYgcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgWzQ6NV0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRlIEkvTyBwcm9jZXNzIGJpdCAoc2VlIDUuNi4yMikgWzZdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzeW5jaC4gZXZlbnQgbm90aWZpY2F0aW9uIChwcm9jZXNzb3IpIFs3XSAqLworICB1Y2hhciBhZGRfbGVuOyAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGxlbmd0aCAqLworICB1Y2hhciByZXMxOyAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICB1Y2hhciByZXMyOyAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworICB1Y2hhciBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBzb2Z0IHJlc2V0IGltcGxlbWVudGVkIFswXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHF1ZXVpbmcgWzFdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkIFsyXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW5rZWQgY29tbWFuZCBmb3IgdGhpcyBsb2dpY2FsIHVuaXQgWzNdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgWzRdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpZGUgYnVzIDE2IGJpdCBkYXRhIHRyYW5zZmVyIFs1XSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aWRlIGJ1cyAzMiBiaXQgZGF0YSB0cmFuc2ZlciBbNl0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlIFs3XSAqLworICB1Y2hhciB2ZW5kb3JfaWRbOF07ICAgICAgICAgICAvKiB2ZW5kb3IgaWRlbnRpZmljYXRpb24gKi8KKyAgdWNoYXIgcHJvZHVjdF9pZFsxNl07ICAgICAgICAgLyogcHJvZHVjdCBpZGVudGlmaWNhdGlvbiAqLworICB1Y2hhciBwcm9kdWN0X3Jldl9sZXZlbFs0XTsgICAvKiBwcm9kdWN0IHJldmlzaW9uIGxldmVsICovCisgIHVjaGFyIHZlbmRvcl9zcGVjaWZpY1syMF07ICAgIC8qIHZlbmRvciBzcGVjaWZpYyAqLworICB1Y2hhciBpbmZvOyAgICAgICAgICAgICAgICAgICAvKiBpbmZvcm1hdGlvbiB1bml0IHN1cHBvcnRlZCBbMF0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVpY2sgYXJiaXRyYXRlIHN1cHBvcnRlZCBbMV0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xvY2tpbmcgZmllbGQgWzI6M10gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgWzQ6N10gKi8KKyAgdWNoYXIgcmVzMzsgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KK30gQURWX1NDU0lfSU5RVUlSWTsgLyogNTggYnl0ZXMgKi8KKworCisvKgorICogLS0tIERyaXZlciBDb25zdGFudHMgYW5kIE1hY3JvcworICovCisKKyNkZWZpbmUgQVNDX05VTV9CT0FSRF9TVVBQT1JURUQgMTYKKyNkZWZpbmUgQVNDX05VTV9JT1BPUlRfUFJPQkUgICAgNAorI2RlZmluZSBBU0NfTlVNX0JVUyAgICAgICAgICAgICA0CisKKy8qIFJlZmVyZW5jZSBTY3NpX0hvc3QgaG9zdGRhdGEgKi8KKyNkZWZpbmUgQVNDX0JPQVJEUChob3N0KSAoKGFzY19ib2FyZF90ICopICYoKGhvc3QpLT5ob3N0ZGF0YSkpCisKKy8qIGFzY19ib2FyZF90IGZsYWdzICovCisjZGVmaW5lIEFTQ19IT1NUX0lOX1JFU0VUICAgICAgIDB4MDEKKyNkZWZpbmUgQVNDX0lTX1dJREVfQk9BUkQgICAgICAgMHgwNCAgICAvKiBBZHZhblN5cyBXaWRlIEJvYXJkICovCisjZGVmaW5lIEFTQ19TRUxFQ1RfUVVFVUVfREVQVEhTIDB4MDgKKworI2RlZmluZSBBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkgKCgoYm9hcmRwKS0+ZmxhZ3MgJiBBU0NfSVNfV0lERV9CT0FSRCkgPT0gMCkKKyNkZWZpbmUgQVNDX1dJREVfQk9BUkQoYm9hcmRwKSAgICgoYm9hcmRwKS0+ZmxhZ3MgJiBBU0NfSVNfV0lERV9CT0FSRCkKKworI2RlZmluZSBOT19JU0FfRE1BICAgICAgICAgICAgICAweGZmICAgICAgICAvKiBObyBJU0EgRE1BIENoYW5uZWwgVXNlZCAqLworCisjZGVmaW5lIEFTQ19JTkZPX1NJWkUgICAgICAgICAgIDEyOCAgICAgICAgICAgIC8qIGFkdmFuc3lzX2luZm8oKSBsaW5lIHNpemUgKi8KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFTQ19QUlRCVUZfU0laRSAgICAgICAgIDIwNDgKKyNkZWZpbmUgQVNDX1BSVExJTkVfU0laRSAgICAgICAgMTYwCisKKyNkZWZpbmUgQVNDX1BSVF9ORVhUKCkgXAorICAgIGlmIChjcCkgeyBcCisgICAgICAgIHRvdGxlbiArPSBsZW47IFwKKyAgICAgICAgbGVmdGxlbiAtPSBsZW47IFwKKyAgICAgICAgaWYgKGxlZnRsZW4gPT0gMCkgeyBcCisgICAgICAgICAgICByZXR1cm4gdG90bGVuOyBcCisgICAgICAgIH0gXAorICAgICAgICBjcCArPSBsZW47IFwKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyogQXNjIExpYnJhcnkgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIEFTQ19UUlVFICAgICAgICAxCisjZGVmaW5lIEFTQ19GQUxTRSAgICAgICAwCisjZGVmaW5lIEFTQ19OT0VSUk9SICAgICAxCisjZGVmaW5lIEFTQ19CVVNZICAgICAgICAwCisjZGVmaW5lIEFTQ19FUlJPUiAgICAgICAoLTEpCisKKy8qIHN0cnVjdCBzY3NpX2NtbmQgZnVuY3Rpb24gcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIFNUQVRVU19CWVRFKGJ5dGUpICAgKGJ5dGUpCisjZGVmaW5lIE1TR19CWVRFKGJ5dGUpICAgICAgKChieXRlKSA8PCA4KQorI2RlZmluZSBIT1NUX0JZVEUoYnl0ZSkgICAgICgoYnl0ZSkgPDwgMTYpCisjZGVmaW5lIERSSVZFUl9CWVRFKGJ5dGUpICAgKChieXRlKSA8PCAyNCkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBhcmUgT1MgaW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB0bworICogdGhlIHF1ZXVlIGZ1bmN0aW9uczoKKyAqICBSRVEgLSBTQ1NJIHJlcXVlc3Qgc3RydWN0dXJlCisgKiAgUkVRUCAtIHBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IHN0cnVjdHVyZQorICogIFJFUVBUSUQocmVxcCkgLSByZXFwJ3MgdGFyZ2V0IGlkCisgKiAgUkVRUE5FWFQocmVxcCkgLSByZXFwJ3MgbmV4dCBwb2ludGVyCisgKiAgUkVRUE5FWFRQKHJlcXApIC0gcG9pbnRlciB0byByZXFwJ3MgbmV4dCBwb2ludGVyCisgKiAgUkVRUFRJTUUocmVxcCkgLSByZXFwJ3MgdGltZSBzdGFtcCB2YWx1ZQorICogIFJFUVRJTUVTVEFNUCgpIC0gc3lzdGVtIHRpbWUgc3RhbXAgdmFsdWUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9jbW5kICAgICBSRVEsICpSRVFQOworI2RlZmluZSBSRVFQTkVYVChyZXFwKSAgICAgICAoKFJFUVApICgocmVxcCktPmhvc3Rfc2NyaWJibGUpKQorI2RlZmluZSBSRVFQTkVYVFAocmVxcCkgICAgICAoKFJFUVAgKikgJigocmVxcCktPmhvc3Rfc2NyaWJibGUpKQorI2RlZmluZSBSRVFQVElEKHJlcXApICAgICAgICAoKHJlcXApLT5kZXZpY2UtPmlkKQorI2RlZmluZSBSRVFQVElNRShyZXFwKSAgICAgICAoKHJlcXApLT5TQ3AudGhpc19yZXNpZHVhbCkKKyNkZWZpbmUgUkVRVElNRVNUQU1QKCkgICAgICAgKGppZmZpZXMpCisKKyNkZWZpbmUgUkVRVElNRVNUQVQoZnVuY3Rpb24sIGFzY3EsIHJlcXAsIHRpZCkgXAoreyBcCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmVxdWVzdCB0aW1lIHN0YW1wIGlzIGxlc3MgdGhhbiB0aGUgc3lzdGVtIHRpbWUgc3RhbXAsIHRoZW4gXAorICAgICAqIG1heWJlIHRoZSBzeXN0ZW0gdGltZSBzdGFtcCB3cmFwcGVkLiBTZXQgdGhlIHJlcXVlc3QgdGltZSB0byB6ZXJvLlwKKyAgICAgKi8gXAorICAgIGlmIChSRVFQVElNRShyZXFwKSA8PSBSRVFUSU1FU1RBTVAoKSkgeyBcCisgICAgICAgIFJFUVBUSU1FKHJlcXApID0gUkVRVElNRVNUQU1QKCkgLSBSRVFQVElNRShyZXFwKTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgLyogSW5kaWNhdGUgYW4gZXJyb3Igb2NjdXJyZWQgd2l0aCB0aGUgYXNzZXJ0aW9uLiAqLyBcCisgICAgICAgIEFTQ19BU1NFUlQoUkVRUFRJTUUocmVxcCkgPD0gUkVRVElNRVNUQU1QKCkpOyBcCisgICAgICAgIFJFUVBUSU1FKHJlcXApID0gMDsgXAorICAgIH0gXAorICAgIC8qIEhhbmRsZSBmaXJzdCBtaW5pbXVtIHRpbWUgY2FzZSB3aXRob3V0IGV4dGVybmFsIGluaXRpYWxpemF0aW9uLiAqLyBcCisgICAgaWYgKCgoYXNjcSktPnFfdG90X2NudFt0aWRdID09IDEpIHx8ICBcCisgICAgICAgIChSRVFQVElNRShyZXFwKSA8IChhc2NxKS0+cV9taW5fdGltW3RpZF0pKSB7IFwKKyAgICAgICAgICAgIChhc2NxKS0+cV9taW5fdGltW3RpZF0gPSBSRVFQVElNRShyZXFwKTsgXAorICAgICAgICAgICAgQVNDX0RCRzMoMSwgIiVzOiBuZXcgcV9taW5fdGltWyVkXSAldVxuIiwgXAorICAgICAgICAgICAgICAgIChmdW5jdGlvbiksICh0aWQpLCAoYXNjcSktPnFfbWluX3RpbVt0aWRdKTsgXAorICAgICAgICB9IFwKKyAgICBpZiAoUkVRUFRJTUUocmVxcCkgPiAoYXNjcSktPnFfbWF4X3RpbVt0aWRdKSB7IFwKKyAgICAgICAgKGFzY3EpLT5xX21heF90aW1bdGlkXSA9IFJFUVBUSU1FKHJlcXApOyBcCisgICAgICAgIEFTQ19EQkczKDEsICIlczogbmV3IHFfbWF4X3RpbVslZF0gJXVcbiIsIFwKKyAgICAgICAgICAgIChmdW5jdGlvbiksIHRpZCwgKGFzY3EpLT5xX21heF90aW1bdGlkXSk7IFwKKyAgICB9IFwKKyAgICAoYXNjcSktPnFfdG90X3RpbVt0aWRdICs9IFJFUVBUSU1FKHJlcXApOyBcCisgICAgLyogUmVzZXQgdGhlIHRpbWUgc3RhbXAgZmllbGQuICovIFwKKyAgICBSRVFQVElNRShyZXFwKSA9IDA7IFwKK30KKworLyogYXNjX2VucXVldWUoKSBmbGFncyAqLworI2RlZmluZSBBU0NfRlJPTlQgICAgICAgMQorI2RlZmluZSBBU0NfQkFDSyAgICAgICAgMgorCisvKiBhc2NfZGVxdWV1ZV9saXN0KCkgYXJndW1lbnQgKi8KKyNkZWZpbmUgQVNDX1RJRF9BTEwgICAgICAgICgtMSkKKworLyogUmV0dXJuIG5vbi16ZXJvLCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuICovCisjZGVmaW5lIEFTQ19RVUVVRV9FTVBUWShhc2NxKSAgICAoKGFzY3EpLT5xX3RpZG1hc2sgPT0gMCkKKworI2RlZmluZSBQQ0lfTUFYX1NMT1QgICAgICAgICAgICAweDFGCisjZGVmaW5lIFBDSV9NQVhfQlVTICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgUENJX0lPQUREUkVTU19NQVNLICAgICAgMHhGRkZFCisjZGVmaW5lIEFTQ19QQ0lfVkVORE9SSUQgICAgICAgIDB4MTBDRAorI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF9DTlQgICA2ICAgICAgIC8qIFBDSSBEZXZpY2UgSUQgY291bnQuICovCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEXzExMDAgIDB4MTEwMAorI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF8xMjAwICAweDEyMDAKKyNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VfSURfMTMwMCAgMHgxMzAwCisjZGVmaW5lIEFTQ19QQ0lfREVWSUNFX0lEXzIzMDAgIDB4MjMwMCAgLyogQVNDLTM1NTAgKi8KKyNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VfSURfMjUwMCAgMHgyNTAwICAvKiBBU0MtMzhDMDgwMCAqLworI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF8yNzAwICAweDI3MDAgIC8qIEFTQy0zOEMxNjAwICovCisKKyNpZm5kZWYgQURWQU5TWVNfU1RBVFMKKyNkZWZpbmUgQVNDX1NUQVRTKHNocCwgY291bnRlcikKKyNkZWZpbmUgQVNDX1NUQVRTX0FERChzaHAsIGNvdW50ZXIsIGNvdW50KQorI2Vsc2UgLyogQURWQU5TWVNfU1RBVFMgKi8KKyNkZWZpbmUgQVNDX1NUQVRTKHNocCwgY291bnRlcikgXAorICAgIChBU0NfQk9BUkRQKHNocCktPmFzY19zdGF0cy5jb3VudGVyKyspCisKKyNkZWZpbmUgQVNDX1NUQVRTX0FERChzaHAsIGNvdW50ZXIsIGNvdW50KSBcCisgICAgKEFTQ19CT0FSRFAoc2hwKS0+YXNjX3N0YXRzLmNvdW50ZXIgKz0gKGNvdW50KSkKKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCisjZGVmaW5lIEFTQ19DRUlMSU5HKHZhbCwgdW5pdCkgKCgodmFsKSArICgodW5pdCkgLSAxKSkvKHVuaXQpKQorCisvKiBJZiB0aGUgcmVzdWx0IHdyYXBzIHdoZW4gY2FsY3VsYXRpbmcgdGVudGhzLCByZXR1cm4gMC4gKi8KKyNkZWZpbmUgQVNDX1RFTlRIUyhudW0sIGRlbikgXAorICAgICgoKDEwICogKChudW0pLyhkZW4pKSkgPiAoKChudW0pICogMTApLyhkZW4pKSkgPyBcCisgICAgMCA6ICgoKChudW0pICogMTApLyhkZW4pKSAtICgxMCAqICgobnVtKS8oZGVuKSkpKSkKKworLyoKKyAqIERpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLgorICovCisjZGVmaW5lIEFTQ19QUklOVChzKSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50ayhzKTsgXAorICAgIH0KKworI2RlZmluZSBBU0NfUFJJTlQxKHMsIGExKSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50aygocyksIChhMSkpOyBcCisgICAgfQorCisjZGVmaW5lIEFTQ19QUklOVDIocywgYTEsIGEyKSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50aygocyksIChhMSksIChhMikpOyBcCisgICAgfQorCisjZGVmaW5lIEFTQ19QUklOVDMocywgYTEsIGEyLCBhMykgXAorICAgIHsgXAorICAgICAgICBwcmludGsoImFkdmFuc3lzOiAiKTsgXAorICAgICAgICBwcmludGsoKHMpLCAoYTEpLCAoYTIpLCAoYTMpKTsgXAorICAgIH0KKworI2RlZmluZSBBU0NfUFJJTlQ0KHMsIGExLCBhMiwgYTMsIGE0KSBcCisgICAgeyBcCisgICAgICAgIHByaW50aygiYWR2YW5zeXM6ICIpOyBcCisgICAgICAgIHByaW50aygocyksIChhMSksIChhMiksIChhMyksIChhNCkpOyBcCisgICAgfQorCisKKyNpZm5kZWYgQURWQU5TWVNfREVCVUcKKworI2RlZmluZSBBU0NfREJHKGx2bCwgcykKKyNkZWZpbmUgQVNDX0RCRzEobHZsLCBzLCBhMSkKKyNkZWZpbmUgQVNDX0RCRzIobHZsLCBzLCBhMSwgYTIpCisjZGVmaW5lIEFTQ19EQkczKGx2bCwgcywgYTEsIGEyLCBhMykKKyNkZWZpbmUgQVNDX0RCRzQobHZsLCBzLCBhMSwgYTIsIGEzLCBhNCkKKyNkZWZpbmUgQVNDX0RCR19QUlRfU0NTSV9IT1NUKGx2bCwgcykKKyNkZWZpbmUgQVNDX0RCR19QUlRfU0NTSV9DTU5EKGx2bCwgcykKKyNkZWZpbmUgQVNDX0RCR19QUlRfQVNDX1NDU0lfUShsdmwsIHNjc2lxcCkKKyNkZWZpbmUgQVNDX0RCR19QUlRfQURWX1NDU0lfUkVRX1EobHZsLCBzY3NpcXApCisjZGVmaW5lIEFTQ19EQkdfUFJUX0FTQ19RRE9ORV9JTkZPKGx2bCwgcWRvbmUpCisjZGVmaW5lIEFEVl9EQkdfUFJUX0FEVl9TQ1NJX1JFUV9RKGx2bCwgc2NzaXFwKQorI2RlZmluZSBBU0NfREJHX1BSVF9IRVgobHZsLCBuYW1lLCBzdGFydCwgbGVuZ3RoKQorI2RlZmluZSBBU0NfREJHX1BSVF9DREIobHZsLCBjZGIsIGxlbikKKyNkZWZpbmUgQVNDX0RCR19QUlRfU0VOU0UobHZsLCBzZW5zZSwgbGVuKQorI2RlZmluZSBBU0NfREJHX1BSVF9JTlFVSVJZKGx2bCwgaW5xLCBsZW4pCisKKyNlbHNlIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKy8qCisgKiBEZWJ1Z2dpbmcgTWVzc2FnZSBMZXZlbHM6CisgKiAwOiBFcnJvcnMgT25seQorICogMTogSGlnaC1MZXZlbCBUcmFjaW5nCisgKiAyLU46IFZlcmJvc2UgVHJhY2luZworICovCisKKyNkZWZpbmUgQVNDX0RCRyhsdmwsIHMpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKGFzY19kYmdsdmwgPj0gKGx2bCkpIHsgXAorICAgICAgICAgICAgcHJpbnRrKHMpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHMShsdmwsIHMsIGExKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIHByaW50aygocyksIChhMSkpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHMihsdmwsIHMsIGExLCBhMikgXAorICAgIHsgXAorICAgICAgICBpZiAoYXNjX2RiZ2x2bCA+PSAobHZsKSkgeyBcCisgICAgICAgICAgICBwcmludGsoKHMpLCAoYTEpLCAoYTIpKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQVNDX0RCRzMobHZsLCBzLCBhMSwgYTIsIGEzKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIHByaW50aygocyksIChhMSksIChhMiksIChhMykpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHNChsdmwsIHMsIGExLCBhMiwgYTMsIGE0KSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIHByaW50aygocyksIChhMSksIChhMiksIChhMyksIChhNCkpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9TQ1NJX0hPU1QobHZsLCBzKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfc2NzaV9ob3N0KHMpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9TQ1NJX0NNTkQobHZsLCBzKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfc2NzaV9jbW5kKHMpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9BU0NfU0NTSV9RKGx2bCwgc2NzaXFwKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfYXNjX3Njc2lfcShzY3NpcXApOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9BU0NfUURPTkVfSU5GTyhsdmwsIHFkb25lKSBcCisgICAgeyBcCisgICAgICAgIGlmIChhc2NfZGJnbHZsID49IChsdmwpKSB7IFwKKyAgICAgICAgICAgIGFzY19wcnRfYXNjX3Fkb25lX2luZm8ocWRvbmUpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2RlZmluZSBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUShsdmwsIHNjc2lxcCkgXAorICAgIHsgXAorICAgICAgICBpZiAoYXNjX2RiZ2x2bCA+PSAobHZsKSkgeyBcCisgICAgICAgICAgICBhc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKHNjc2lxcCk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEFTQ19EQkdfUFJUX0hFWChsdmwsIG5hbWUsIHN0YXJ0LCBsZW5ndGgpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKGFzY19kYmdsdmwgPj0gKGx2bCkpIHsgXAorICAgICAgICAgICAgYXNjX3BydF9oZXgoKG5hbWUpLCAoc3RhcnQpLCAobGVuZ3RoKSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEFTQ19EQkdfUFJUX0NEQihsdmwsIGNkYiwgbGVuKSBcCisgICAgICAgIEFTQ19EQkdfUFJUX0hFWCgobHZsKSwgIkNEQiIsICh1Y2hhciAqKSAoY2RiKSwgKGxlbikpOworCisjZGVmaW5lIEFTQ19EQkdfUFJUX1NFTlNFKGx2bCwgc2Vuc2UsIGxlbikgXAorICAgICAgICBBU0NfREJHX1BSVF9IRVgoKGx2bCksICJTRU5TRSIsICh1Y2hhciAqKSAoc2Vuc2UpLCAobGVuKSk7CisKKyNkZWZpbmUgQVNDX0RCR19QUlRfSU5RVUlSWShsdmwsIGlucSwgbGVuKSBcCisgICAgICAgIEFTQ19EQkdfUFJUX0hFWCgobHZsKSwgIklOUVVJUlkiLCAodWNoYXIgKikgKGlucSksIChsZW4pKTsKKyNlbmRpZiAvKiBBRFZBTlNZU19ERUJVRyAqLworCisjaWZuZGVmIEFEVkFOU1lTX0FTU0VSVAorI2RlZmluZSBBU0NfQVNTRVJUKGEpCisjZWxzZSAvKiBBRFZBTlNZU19BU1NFUlQgKi8KKworI2RlZmluZSBBU0NfQVNTRVJUKGEpIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKCEoYSkpIHsgXAorICAgICAgICAgICAgcHJpbnRrKCJBU0NfQVNTRVJUKCkgRmFpbHVyZTogZmlsZSAlcywgbGluZSAlZFxuIiwgXAorICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZW5kaWYgLyogQURWQU5TWVNfQVNTRVJUICovCisKKworLyoKKyAqIC0tLSBEcml2ZXIgU3RydWN0dXJlcworICovCisKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworCisvKiBQZXIgYm9hcmQgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhc2Nfc3RhdHMgeworICAgIC8qIERyaXZlciBFbnRyeXBvaW50IFN0YXRpc3RpY3MgKi8KKyAgICBBRFZfRENOVCBxdWV1ZWNvbW1hbmQ7ICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfcXVldWVjb21tYW5kKCkgKi8KKyAgICBBRFZfRENOVCByZXNldDsgICAgICAgICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfZWhfYnVzX3Jlc2V0KCkgKi8KKyAgICBBRFZfRENOVCBiaW9zcGFyYW07ICAgICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfYmlvc3BhcmFtKCkgKi8KKyAgICBBRFZfRENOVCBpbnRlcnJ1cHQ7ICAgICAgIC8qICMgYWR2YW5zeXNfaW50ZXJydXB0KCkgY2FsbHMgKi8KKyAgICBBRFZfRENOVCBjYWxsYmFjazsgICAgICAgIC8qICMgY2FsbHMgdG8gYXNjL2Fkdl9pc3JfY2FsbGJhY2soKSAqLworICAgIEFEVl9EQ05UIGRvbmU7ICAgICAgICAgICAgLyogIyBjYWxscyB0byByZXF1ZXN0J3Mgc2NzaV9kb25lIGZ1bmN0aW9uICovCisgICAgQURWX0RDTlQgYnVpbGRfZXJyb3I7ICAgICAvKiAjIGFzYy9hZHZfYnVpbGRfcmVxKCkgQVNDX0VSUk9SIHJldHVybnMuICovCisgICAgQURWX0RDTlQgYWR2X2J1aWxkX25vcmVxOyAvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfcmVxX3QgYWxsb2MuIGZhaWwuICovCisgICAgQURWX0RDTlQgYWR2X2J1aWxkX25vc2c7ICAvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfc2dibGtfdCBhbGxvYy4gZmFpbC4gKi8KKyAgICAvKiBBc2NFeGVTY3NpUXVldWUoKS9BZHZFeGVTY3NpUXVldWUoKSBTdGF0aXN0aWNzICovCisgICAgQURWX0RDTlQgZXhlX25vZXJyb3I7ICAgICAvKiAjIEFTQ19OT0VSUk9SIHJldHVybnMuICovCisgICAgQURWX0RDTlQgZXhlX2J1c3k7ICAgICAgICAvKiAjIEFTQ19CVVNZIHJldHVybnMuICovCisgICAgQURWX0RDTlQgZXhlX2Vycm9yOyAgICAgICAvKiAjIEFTQ19FUlJPUiByZXR1cm5zLiAqLworICAgIEFEVl9EQ05UIGV4ZV91bmtub3duOyAgICAgLyogIyB1bmtub3duIHJldHVybnMuICovCisgICAgLyogRGF0YSBUcmFuc2ZlciBTdGF0aXN0aWNzICovCisgICAgQURWX0RDTlQgY29udF9jbnQ7ICAgICAgICAvKiAjIG5vbi1zY2F0dGVyLWdhdGhlciBJL08gcmVxdWVzdHMgcmVjZWl2ZWQgKi8KKyAgICBBRFZfRENOVCBjb250X3hmZXI7ICAgICAgIC8qICMgY29udGlndW91cyB0cmFuc2ZlciA1MTItYnl0ZXMgKi8KKyAgICBBRFZfRENOVCBzZ19jbnQ7ICAgICAgICAgIC8qICMgc2NhdHRlci1nYXRoZXIgSS9PIHJlcXVlc3RzIHJlY2VpdmVkICovCisgICAgQURWX0RDTlQgc2dfZWxlbTsgICAgICAgICAvKiAjIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzICovCisgICAgQURWX0RDTlQgc2dfeGZlcjsgICAgICAgICAvKiAjIHNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVyIDUxMi1ieXRlcyAqLworfTsKKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCisvKgorICogUmVxdWVzdCBxdWV1aW5nIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBhc2NfcXVldWUgeworICAgIEFEVl9TQ1NJX0JJVF9JRF9UWVBFICBxX3RpZG1hc2s7ICAgICAgICAgICAgICAgIC8qIHF1ZXVlIG1hc2sgKi8KKyAgICBSRVFQICAgICAgICAgICAgICAgICAgcV9maXJzdFtBRFZfTUFYX1RJRCsxXTsgICAvKiBmaXJzdCBxdWV1ZWQgcmVxdWVzdCAqLworICAgIFJFUVAgICAgICAgICAgICAgICAgICBxX2xhc3RbQURWX01BWF9USUQrMV07ICAgIC8qIGxhc3QgcXVldWVkIHJlcXVlc3QgKi8KKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgIHNob3J0ICAgICAgICAgICAgICAgICBxX2N1cl9jbnRbQURWX01BWF9USUQrMV07IC8qIGN1cnJlbnQgcXVldWUgY291bnQgKi8KKyAgICBzaG9ydCAgICAgICAgICAgICAgICAgcV9tYXhfY250W0FEVl9NQVhfVElEKzFdOyAvKiBtYXhpbXVtIHF1ZXVlIGNvdW50ICovCisgICAgQURWX0RDTlQgICAgICAgICAgICAgIHFfdG90X2NudFtBRFZfTUFYX1RJRCsxXTsgLyogdG90YWwgZW5xdWV1ZSBjb3VudCAqLworICAgIEFEVl9EQ05UICAgICAgICAgICAgICBxX3RvdF90aW1bQURWX01BWF9USUQrMV07IC8qIHRvdGFsIHRpbWUgcXVldWVkICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgIHFfbWF4X3RpbVtBRFZfTUFYX1RJRCsxXTsgLyogbWF4aW11bSB0aW1lIHF1ZXVlZCAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgICBxX21pbl90aW1bQURWX01BWF9USUQrMV07IC8qIG1pbmltdW0gdGltZSBxdWV1ZWQgKi8KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworfSBhc2NfcXVldWVfdDsKKworLyoKKyAqIEFkdiBMaWJyYXJ5IFJlcXVlc3QgU3RydWN0dXJlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gcHJvY2VzcyBXaWRlIEJvYXJkIHJlcXVlc3RzLgorICoKKyAqIFRoZSBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUgaW4gYWR2X3JlcV90IGlzIHBhc3NlZCB0byB0aGUgQWR2IExpYnJhcnkKKyAqIGFuZCBtaWNyb2NvZGUgd2l0aCB0aGUgQURWX1NDU0lfUkVRX1EgZmllbGQgJ3NyYl9wdHInIHBvaW50aW5nIHRvIHRoZQorICogYWR2X3JlcV90LiBUaGUgYWR2X3JlcV90IHN0cnVjdHVyZSAnY21uZHAnIGZpZWxkIGluIHR1cm4gcG9pbnRzIHRvIHRoZQorICogTWlkLUxldmVsIFNDU0kgcmVxdWVzdCBzdHJ1Y3R1cmUuCisgKgorICogWmVybyBvciBtb3JlIEFEVl9TR19CTE9DSyBhcmUgdXNlZCB3aXRoIGVhY2ggQURWX1NDU0lfUkVRX1EuIEVhY2gKKyAqIEFEVl9TR19CTE9DSyBzdHJ1Y3R1cmUgaG9sZHMgMTUgc2NhdHRlci1nYXRoZXIgZWxlbWVudHMuIFVuZGVyIExpbnV4CisgKiB1cCB0byAyNTUgc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgbWF5IGJlIHVzZWQgcGVyIHJlcXVlc3Qgb3IKKyAqIEFEVl9TQ1NJX1JFUV9RLgorICoKKyAqIEJvdGggc3RydWN0dXJlcyBtdXN0IGJlIDMyIGJ5dGUgYWxpZ25lZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWR2X3NnYmxrIHsKKyAgICBBRFZfU0dfQkxPQ0sgICAgICAgIHNnX2Jsb2NrOyAgICAgLyogU2dibG9jayBzdHJ1Y3R1cmUuICovCisgICAgdWNoYXIgICAgICAgICAgICAgICBhbGlnblszMl07ICAgIC8qIFNnYmxvY2sgc3RydWN0dXJlIHBhZGRpbmcuICovCisgICAgc3RydWN0IGFkdl9zZ2JsayAgICAqbmV4dF9zZ2Jsa3A7IC8qIE5leHQgc2NhdHRlci1nYXRoZXIgc3RydWN0dXJlLiAqLworfSBhZHZfc2dibGtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYWR2X3JlcSB7CisgICAgQURWX1NDU0lfUkVRX1EgICAgICBzY3NpX3JlcV9xOyAgIC8qIEFkdiBMaWJyYXJ5IHJlcXVlc3Qgc3RydWN0dXJlLiAqLworICAgIHVjaGFyICAgICAgICAgICAgICAgYWxpZ25bMzJdOyAgICAvKiBSZXF1ZXN0IHN0cnVjdHVyZSBwYWRkaW5nLiAqLworICAgIHN0cnVjdCBzY3NpX2NtbmQJKmNtbmRwOyAgICAgICAvKiBNaWQtTGV2ZWwgU0NTSSBjb21tYW5kIHBvaW50ZXIuICovCisgICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dibGtwOyAgICAgIC8qIEFkdiBMaWJyYXJ5IHNjYXR0ZXItZ2F0aGVyIHBvaW50ZXIuICovCisgICAgc3RydWN0IGFkdl9yZXEgICAgICAqbmV4dF9yZXFwOyAgIC8qIE5leHQgUmVxdWVzdCBTdHJ1Y3R1cmUuICovCit9IGFkdl9yZXFfdDsKKworLyoKKyAqIFN0cnVjdHVyZSBhbGxvY2F0ZWQgZm9yIGVhY2ggYm9hcmQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHNjc2lfcmVnaXN0ZXIoKSBhdCB0aGUgZW5kCisgKiBvZiB0aGUgJ1Njc2lfSG9zdCcgc3RydWN0dXJlIHN0YXJ0aW5nIGF0IHRoZSAnaG9zdGRhdGEnCisgKiBmaWVsZC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBhbGxvY2F0ZWQgZnJvbSBETUEtYWJsZSBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzY19ib2FyZCB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaWQ7ICAgICAgICAgICAgICAgICAgICAvKiBCb2FyZCBJZCAqLworICAgIHVpbnQgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgLyogQm9hcmQgZmxhZ3MgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIEFTQ19EVkNfVkFSICAgICAgYXNjX2R2Y192YXI7ICAgICAgICAgICAvKiBOYXJyb3cgYm9hcmQgKi8KKyAgICAgICAgQURWX0RWQ19WQVIgICAgICBhZHZfZHZjX3ZhcjsgICAgICAgICAgIC8qIFdpZGUgYm9hcmQgKi8KKyAgICB9IGR2Y192YXI7CisgICAgdW5pb24geworICAgICAgICBBU0NfRFZDX0NGRyAgICAgIGFzY19kdmNfY2ZnOyAgICAgICAgICAgLyogTmFycm93IGJvYXJkICovCisgICAgICAgIEFEVl9EVkNfQ0ZHICAgICAgYWR2X2R2Y19jZmc7ICAgICAgICAgICAvKiBXaWRlIGJvYXJkICovCisgICAgfSBkdmNfY2ZnOworICAgIHVzaG9ydCAgICAgICAgICAgICAgIGFzY19uX2lvX3BvcnQ7ICAgICAgICAgLyogTnVtYmVyIEkvTyBwb3J0cy4gKi8KKyAgICBhc2NfcXVldWVfdCAgICAgICAgICBhY3RpdmU7ICAgICAgICAgICAgICAgIC8qIEFjdGl2ZSBjb21tYW5kIHF1ZXVlICovCisgICAgYXNjX3F1ZXVlX3QgICAgICAgICAgd2FpdGluZzsgICAgICAgICAgICAgICAvKiBXYWl0aW5nIGNvbW1hbmQgcXVldWUgKi8KKyAgICBhc2NfcXVldWVfdCAgICAgICAgICBkb25lOyAgICAgICAgICAgICAgICAgIC8qIERvbmUgY29tbWFuZCBxdWV1ZSAqLworICAgIEFEVl9TQ1NJX0JJVF9JRF9UWVBFIGluaXRfdGlkbWFzazsgICAgICAgICAgLyogVGFyZ2V0IGluaXQuL3ZhbGlkIG1hc2sgKi8KKyAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UJKmRldmljZVtBRFZfTUFYX1RJRCsxXTsgLyogTWlkLUxldmVsIFNjc2kgRGV2aWNlICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgcmVxY250W0FEVl9NQVhfVElEKzFdOyAvKiBTdGFydmF0aW9uIHJlcXVlc3QgY291bnQgKi8KKyAgICBBRFZfU0NTSV9CSVRfSURfVFlQRSBxdWV1ZV9mdWxsOyAgICAgICAgICAgIC8qIFF1ZXVlIGZ1bGwgbWFzayAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgIHF1ZXVlX2Z1bGxfY250W0FEVl9NQVhfVElEKzFdOyAvKiBRdWV1ZSBmdWxsIGNvdW50ICovCisgICAgdW5pb24geworICAgICAgICBBU0NFRVBfQ09ORklHICAgICAgICAgYXNjX2VlcDsgICAgICAgICAgLyogTmFycm93IEVFUFJPTSBjb25maWcuICovCisgICAgICAgIEFEVkVFUF8zNTUwX0NPTkZJRyAgICBhZHZfMzU1MF9lZXA7ICAgICAvKiAzNTUwIEVFUFJPTSBjb25maWcuICovCisgICAgICAgIEFEVkVFUF8zOEMwODAwX0NPTkZJRyBhZHZfMzhDMDgwMF9lZXA7ICAvKiAzOEMwODAwIEVFUFJPTSBjb25maWcuICovCisgICAgICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyBhZHZfMzhDMTYwMF9lZXA7ICAvKiAzOEMxNjAwIEVFUFJPTSBjb25maWcuICovCisgICAgfSBlZXBfY29uZmlnOworICAgIHVsb25nICAgICAgICAgICAgICAgIGxhc3RfcmVzZXQ7ICAgICAgICAgICAgLyogU2F2ZWQgbGFzdCByZXNldCB0aW1lICovCisgICAgc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb2FyZCBzcGlubG9jayAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgLyogL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC4uLl0gKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAqcHJ0YnVmOyAgICAgICAgICAgICAgIC8qIC9wcm9jIHByaW50IGJ1ZmZlciAqLworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyAgICBzdHJ1Y3QgYXNjX3N0YXRzICAgICBhc2Nfc3RhdHM7ICAgICAgICAgICAgIC8qIEJvYXJkIHN0YXRpc3RpY3MgKi8KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgb25seSBmb3IgTmFycm93IEJvYXJkcy4KKyAgICAgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIHN0cnVjdHVyZXMgbXVzdCBiZSBpbiBETUEtYWJsZSBtZW1vcnkuICovCisgICAgQVNDX1NDU0lfUkVRX1EgICAgICAgc2NzaXJlcXE7CisgICAgQVNDX0NBUF9JTkZPICAgICAgICAgY2FwX2luZm87CisgICAgQVNDX1NDU0lfSU5RVUlSWSAgICAgaW5xdWlyeTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgICBzZHRyX2RhdGFbQVNDX01BWF9USUQrMV07IC8qIFNEVFIgaW5mb3JtYXRpb24gKi8KKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB1c2VkIG9ubHkgZm9yIFdpZGUgQm9hcmRzLgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICppb3JlbWFwX2FkZHI7ICAgICAgICAgLyogSS9PIE1lbW9yeSByZW1hcCBhZGRyZXNzLiAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgIGlvcG9ydDsgICAgICAgICAgICAgICAgLyogSS9PIFBvcnQgYWRkcmVzcy4gKi8KKyAgICBBRFZfQ0FSUl9UICAgICAgICAgICAqb3JpZ19jYXJycDsgICAgICAgICAgIC8qIEFEVl9DQVJSX1QgbWVtb3J5IGJsb2NrLiAqLworICAgIGFkdl9yZXFfdCAgICAgICAgICAgICpvcmlnX3JlcXA7ICAgICAgICAgICAgLyogYWR2X3JlcV90IG1lbW9yeSBibG9jay4gKi8KKyAgICBhZHZfcmVxX3QgICAgICAgICAgICAqYWR2X3JlcXA7ICAgICAgICAgICAgIC8qIFJlcXVlc3Qgc3RydWN0dXJlcy4gKi8KKyAgICBhZHZfc2dibGtfdCAgICAgICAgICAqYWR2X3NnYmxrcDsgICAgICAgICAgIC8qIFNjYXR0ZXItZ2F0aGVyIHN0cnVjdHVyZXMuICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgYmlvc19zaWduYXR1cmU7ICAgICAgICAvKiBCSU9TIFNpZ25hdHVyZS4gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgICBiaW9zX3ZlcnNpb247ICAgICAgICAgIC8qIEJJT1MgVmVyc2lvbi4gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgICBiaW9zX2NvZGVzZWc7ICAgICAgICAgIC8qIEJJT1MgQ29kZSBTZWdtZW50LiAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgIGJpb3NfY29kZWxlbjsgICAgICAgICAgLyogQklPUyBDb2RlIFNlZ21lbnQgTGVuZ3RoLiAqLworfSBhc2NfYm9hcmRfdDsKKworLyoKKyAqIFBDSSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1BDSV9EQVRBXworeworICAgIHVjaGFyICAgIHR5cGU7CisgICAgdWNoYXIgICAgYnVzOworICAgIHVjaGFyICAgIHNsb3Q7CisgICAgdWNoYXIgICAgZnVuYzsKKyAgICB1Y2hhciAgICBvZmZzZXQ7Cit9IFBDSV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBfUENJX0RFVklDRV8KK3sKKyAgICB1c2hvcnQgICB2ZW5kb3JJRDsKKyAgICB1c2hvcnQgICBkZXZpY2VJRDsKKyAgICB1c2hvcnQgICBzbG90TnVtYmVyOworICAgIHVzaG9ydCAgIHNsb3RGb3VuZDsKKyAgICB1Y2hhciAgICBidXNOdW1iZXI7CisgICAgdWNoYXIgICAgbWF4QnVzTnVtYmVyOworICAgIHVjaGFyICAgIGRldkZ1bmM7CisgICAgdXNob3J0ICAgc3RhcnRTbG90OworICAgIHVzaG9ydCAgIGVuZFNsb3Q7CisgICAgdWNoYXIgICAgYnJpZGdlOworICAgIHVjaGFyICAgIHR5cGU7Cit9IFBDSV9ERVZJQ0U7CisKK3R5cGVkZWYgc3RydWN0IF9QQ0lfQ09ORklHX1NQQUNFXworeworICAgIHVzaG9ydCAgIHZlbmRvcklEOworICAgIHVzaG9ydCAgIGRldmljZUlEOworICAgIHVzaG9ydCAgIGNvbW1hbmQ7CisgICAgdXNob3J0ICAgc3RhdHVzOworICAgIHVjaGFyICAgIHJldmlzaW9uOworICAgIHVjaGFyICAgIGNsYXNzQ29kZVszXTsKKyAgICB1Y2hhciAgICBjYWNoZVNpemU7CisgICAgdWNoYXIgICAgbGF0ZW5jeVRpbWVyOworICAgIHVjaGFyICAgIGhlYWRlclR5cGU7CisgICAgdWNoYXIgICAgYmlzdDsKKyAgICBBRFZfUEFERFIgYmFzZUFkZHJlc3NbNl07CisgICAgdXNob3J0ICAgcmVzZXJ2ZWRbNF07CisgICAgQURWX1BBRERSIG9wdGlvblJvbUFkZHI7CisgICAgdXNob3J0ICAgcmVzZXJ2ZWQyWzRdOworICAgIHVjaGFyICAgIGlycUxpbmU7CisgICAgdWNoYXIgICAgaXJxUGluOworICAgIHVjaGFyICAgIG1pbkdudDsKKyAgICB1Y2hhciAgICBtYXhMYXRlbmN5OworfSBQQ0lfQ09ORklHX1NQQUNFOworCisKKy8qCisgKiAtLS0gRHJpdmVyIERhdGEKKyAqLworCisvKiBOb3RlOiBBbGwgZHJpdmVyIGdsb2JhbCBkYXRhIHNob3VsZCBiZSBpbml0aWFsaXplZC4gKi8KKworLyogTnVtYmVyIG9mIGJvYXJkcyBkZXRlY3RlZCBpbiBzeXN0ZW0uICovCitTVEFUSUMgaW50IGFzY19ib2FyZF9jb3VudCA9IDA7CitTVEFUSUMgc3RydWN0IFNjc2lfSG9zdCAgICAqYXNjX2hvc3RbQVNDX05VTV9CT0FSRF9TVVBQT1JURURdID0geyAwIH07CisKKy8qIE92ZXJydW4gYnVmZmVyIHVzZWQgYnkgYWxsIG5hcnJvdyBib2FyZHMuICovCitTVEFUSUMgdWNoYXIgb3ZlcnJ1bl9idWZbQVNDX09WRVJSVU5fQlNJWkVdID0geyAwIH07CisKKy8qCisgKiBHbG9iYWwgc3RydWN0dXJlcyByZXF1aXJlZCB0byBpc3N1ZSBhIGNvbW1hbmQuCisgKi8KK1NUQVRJQyBBU0NfU0NTSV9RIGFzY19zY3NpX3EgPSB7IHsgMCB9IH07CitTVEFUSUMgQVNDX1NHX0hFQUQgYXNjX3NnX2hlYWQgPSB7IDAgfTsKKworLyogTGlzdCBvZiBzdXBwb3J0ZWQgYnVzIHR5cGVzLiAqLworU1RBVElDIHVzaG9ydCBhc2NfYnVzW0FTQ19OVU1fQlVTXSBfX2luaXRkYXRhID0geworICAgIEFTQ19JU19JU0EsCisgICAgQVNDX0lTX1ZMLAorICAgIEFTQ19JU19FSVNBLAorICAgIEFTQ19JU19QQ0ksCit9OworCisvKgorICogVXNlZCB3aXRoIHRoZSBMSUxPICdhZHZhbnN5cycgb3B0aW9uIHRvIGVsaW1pbmF0ZSBvcgorICogbGltaXQgSS9PIHBvcnQgcHJvYmluZyBhdCBib290IHRpbWUsIGNmLiBhZHZhbnN5c19zZXR1cCgpLgorICovCitTVEFUSUMgaW50IGFzY19pb3BmbGFnID0gQVNDX0ZBTFNFOworU1RBVElDIGludCBhc2NfaW9wb3J0W0FTQ19OVU1fSU9QT1JUX1BST0JFXSA9IHsgMCwgMCwgMCwgMCB9OworCisjaWZkZWYgQURWQU5TWVNfREVCVUcKK1NUQVRJQyBjaGFyICoKK2FzY19idXNfbmFtZVtBU0NfTlVNX0JVU10gPSB7CisgICAgIkFTQ19JU19JU0EiLAorICAgICJBU0NfSVNfVkwiLAorICAgICJBU0NfSVNfRUlTQSIsCisgICAgIkFTQ19JU19QQ0kiLAorfTsKKworU1RBVElDIGludCAgICAgICAgICBhc2NfZGJnbHZsID0gMzsKKyNlbmRpZiAvKiBBRFZBTlNZU19ERUJVRyAqLworCisvKiBEZWNsYXJhdGlvbiBmb3IgQXNjIExpYnJhcnkgaW50ZXJuYWwgZGF0YSByZWZlcmVuY2VkIGJ5IGRyaXZlci4gKi8KK1NUQVRJQyBQb3J0QWRkciAgICAgX2FzY19kZWZfaW9wX2Jhc2VbXTsKKworCisvKgorICogLS0tIERyaXZlciBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogYWR2YW5zeXMuaCBjb250YWlucyBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZ2xvYmFsIHRvIExpbnV4LgorICovCisKK1NUQVRJQyBpcnFyZXR1cm5fdCBhZHZhbnN5c19pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworU1RBVElDIGludAkgIGFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitTVEFUSUMgdm9pZCAgICAgICBhc2Nfc2NzaV9kb25lX2xpc3Qoc3RydWN0IHNjc2lfY21uZCAqKTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19leGVjdXRlX3Njc2lfY21uZChzdHJ1Y3Qgc2NzaV9jbW5kICopOworU1RBVElDIGludCAgICAgICAgYXNjX2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOworU1RBVElDIGludCAgICAgICAgYWR2X2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIEFEVl9TQ1NJX1JFUV9RICoqKTsKK1NUQVRJQyBpbnQgICAgICAgIGFkdl9nZXRfc2dsaXN0KGFzY19ib2FyZF90ICosIGFkdl9yZXFfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CitTVEFUSUMgdm9pZCAgICAgICBhc2NfaXNyX2NhbGxiYWNrKEFTQ19EVkNfVkFSICosIEFTQ19RRE9ORV9JTkZPICopOworU1RBVElDIHZvaWQgICAgICAgYWR2X2lzcl9jYWxsYmFjayhBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKK1NUQVRJQyB2b2lkICAgICAgIGFkdl9hc3luY19jYWxsYmFjayhBRFZfRFZDX1ZBUiAqLCB1Y2hhcik7CitTVEFUSUMgdm9pZCAgICAgICBhc2NfZW5xdWV1ZShhc2NfcXVldWVfdCAqLCBSRVFQLCBpbnQpOworU1RBVElDIFJFUVAgICAgICAgYXNjX2RlcXVldWUoYXNjX3F1ZXVlX3QgKiwgaW50KTsKK1NUQVRJQyBSRVFQICAgICAgIGFzY19kZXF1ZXVlX2xpc3QoYXNjX3F1ZXVlX3QgKiwgUkVRUCAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3JtcXVldWUoYXNjX3F1ZXVlX3QgKiwgUkVRUCk7CitTVEFUSUMgdm9pZCAgICAgICBhc2NfZXhlY3V0ZV9xdWV1ZShhc2NfcXVldWVfdCAqKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworU1RBVElDIGludCAgICAgICAgYXNjX3Byb2NfY29weShvZmZfdCwgb2ZmX3QsIGNoYXIgKiwgaW50ICwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3BydF9ib2FyZF9kZXZpY2VzKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3BydF9hZHZfYmlvcyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19nZXRfZWVwcm9tX3N0cmluZyh1c2hvcnQgKnNlcmlhbG51bSwgdWNoYXIgKmNwKTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYWR2X2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfZHJpdmVyX2NvbmYoc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7CitTVEFUSUMgaW50ICAgICAgICBhc2NfcHJ0X2FzY19ib2FyZF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIGludCAgICAgICAgYXNjX3BydF9hZHZfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfbGluZShjaGFyICosIGludCwgY2hhciAqZm10LCAuLi4pOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qIERlY2xhcmF0aW9uIGZvciBBc2MgTGlicmFyeSBpbnRlcm5hbCBmdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBkcml2ZXIuICovCitTVEFUSUMgaW50ICAgICAgICAgIEFzY0ZpbmRTaWduYXR1cmUoUG9ydEFkZHIpOworU1RBVElDIHVzaG9ydCAgICAgICBBc2NHZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKKworLyogU3RhdGlzdGljcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK1NUQVRJQyBpbnQgICAgICAgICAgYXNjX3BydF9ib2FyZF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK1NUQVRJQyBpbnQgICAgICAgICAgYXNjX3BydF90YXJnZXRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqLCBpbnQsIGNoYXIgKiwgaW50KTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisKKy8qIERlYnVnIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisjaWZkZWYgQURWQU5TWVNfREVCVUcKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9zY3NpX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9zY3NpX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9hc2NfZHZjX2NmZyhBU0NfRFZDX0NGRyAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9hc2NfZHZjX3ZhcihBU0NfRFZDX1ZBUiAqKTsKK1NUQVRJQyB2b2lkICAgICAgICAgYXNjX3BydF9hc2Nfc2NzaV9xKEFTQ19TQ1NJX1EgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYXNjX3Fkb25lX2luZm8oQVNDX1FET05FX0lORk8gKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X2R2Y19jZmcoQURWX0RWQ19DRkcgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X2R2Y192YXIoQURWX0RWQ19WQVIgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X3Njc2lfcmVxX3EoQURWX1NDU0lfUkVRX1EgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYWR2X3NnYmxvY2soaW50LCBBRFZfU0dfQkxPQ0sgKik7CitTVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfaGV4KGNoYXIgKmYsIHVjaGFyICosIGludCk7CisjZW5kaWYgLyogQURWQU5TWVNfREVCVUcgKi8KKworCisvKgorICogLS0tIExpbnV4ICdTY3NpX0hvc3RfVGVtcGxhdGUnIGFuZCBhZHZhbnN5c19zZXR1cCgpIEZ1bmN0aW9ucworICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyoKKyAqIGFkdmFuc3lzX3Byb2NfaW5mbygpIC0gL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC0oQVNDX05VTV9CT0FSRF9TVVBQT1JURUQtMSldCisgKgorICogKmJ1ZmZlcjogSS9PIGJ1ZmZlcgorICogKipzdGFydDogaWYgaW5vdXQgPT0gRkFMU0UgcG9pbnRlciBpbnRvIGJ1ZmZlciB3aGVyZSB1c2VyIHJlYWQgc2hvdWxkIHN0YXJ0CisgKiBvZmZzZXQ6IGN1cnJlbnQgb2Zmc2V0IGludG8gYSAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSBmaWxlCisgKiBsZW5ndGg6IGxlbmd0aCBvZiBidWZmZXIKKyAqIGhvc3RubzogU2NzaV9Ib3N0IGhvc3Rfbm8KKyAqIGlub3V0OiBUUlVFIC0gdXNlciBpcyB3cml0aW5nOyBGQUxTRSAtIHVzZXIgaXMgcmVhZGluZworICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEKKyAqIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dIGZpbGUuCisgKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBwZXIgYm9hcmQgYnVmZmVyICdwcnRidWYnIHdoaWNoIGlzCisgKiBhbGxvY2F0ZWQgd2hlbiB0aGUgYm9hcmQgaXMgaW5pdGlhbGl6ZWQgaW4gYWR2YW5zeXNfZGV0ZWN0KCkuIFRoZQorICogYnVmZmVyIGlzIEFTQ19QUlRCVUZfU0laRSBieXRlcy4gVGhlIGZ1bmN0aW9uIGFzY19wcm9jX2NvcHkoKSBpcworICogdXNlZCB0byB3cml0ZSB0byB0aGUgYnVmZmVyLiBUaGUgd2F5IGFzY19wcm9jX2NvcHkoKSBpcyB3cml0dGVuCisgKiBpZiAncHJ0YnVmJyBpcyB0b28gc21hbGwgaXQgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4uIEluc3RlYWQgdGhlCisgKiB1c2VyIGp1c3Qgd29uJ3QgZ2V0IGFsbCB0aGUgYXZhaWxhYmxlIHN0YXRpc3RpY3MuCisgKi8KK2ludAorYWR2YW5zeXNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOworICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgY2hhciAgICAgICAgICAgICAgICAqY3A7CisgICAgaW50CQkJY3BsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICBjbnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICB0b3RjbnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmN1cmJ1ZjsKKyAgICBvZmZfdCAgICAgICAgICAgICAgIGFkdm9mZnNldDsKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgIGludCAgICAgICAgICAgICAgICAgdGd0X2lkOworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisKKyAgICBBU0NfREJHKDEsICJhZHZhbnN5c19wcm9jX2luZm86IGJlZ2luXG4iKTsKKworICAgIC8qCisgICAgICogVXNlciB3cml0ZSBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlmIChpbm91dCA9PSBUUlVFKSB7CisgICAgICAgIHJldHVybigtRU5PU1lTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVzZXIgcmVhZCBvZiAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSBmaWxlLgorICAgICAqLworCisgICAgLyogRmluZCB0aGUgc3BlY2lmaWVkIGJvYXJkLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhc2NfYm9hcmRfY291bnQ7IGkrKykgeworICAgICAgICBpZiAoYXNjX2hvc3RbaV0tPmhvc3Rfbm8gPT0gc2hvc3QtPmhvc3Rfbm8pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IGFzY19ib2FyZF9jb3VudCkgeworICAgICAgICByZXR1cm4oLUVOT0VOVCk7CisgICAgfQorCisgICAgc2hwID0gYXNjX2hvc3RbaV07CisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworCisgICAgLyogQ29weSByZWFkIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLworICAgICpzdGFydCA9IGJ1ZmZlcjsKKyAgICBjdXJidWYgPSBidWZmZXI7CisgICAgYWR2b2Zmc2V0ID0gMDsKKyAgICB0b3RjbnQgPSAwOworICAgIGxlZnRsZW4gPSBsZW5ndGg7CisKKyAgICAvKgorICAgICAqIEdldCBib2FyZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogYWR2YW5zeXNfaW5mbygpIHJldHVybnMgdGhlIGJvYXJkIHN0cmluZyBmcm9tIGl0cyBvd24gc3RhdGljIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBjcCA9IChjaGFyICopIGFkdmFuc3lzX2luZm8oc2hwKTsKKyAgICBzdHJjYXQoY3AsICJcbiIpOworICAgIGNwbGVuID0gc3RybGVuKGNwKTsKKyAgICAvKiBDb3B5IGJvYXJkIGluZm9ybWF0aW9uLiAqLworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworICAgIC8qCisgICAgICogRGlzcGxheSBXaWRlIEJvYXJkIEJJT1MgSW5mb3JtYXRpb24uCisgICAgICovCisgICAgaWYgKEFTQ19XSURFX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKKyAgICAgICAgY3BsZW4gPSBhc2NfcHJ0X2Fkdl9iaW9zKHNocCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7CisgICAgICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgICAgICBjbnQgPSBhc2NfcHJvY19jb3B5KGFkdm9mZnNldCwgb2Zmc2V0LCBjdXJidWYsIGxlZnRsZW4sIGNwLCBjcGxlbik7CisgICAgICAgIHRvdGNudCArPSBjbnQ7CisgICAgICAgIGxlZnRsZW4gLT0gY250OworICAgICAgICBpZiAobGVmdGxlbiA9PSAwKSB7CisgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisgICAgICAgICAgICByZXR1cm4gdG90Y250OworICAgICAgICB9CisgICAgICAgIGFkdm9mZnNldCArPSBjcGxlbjsKKyAgICAgICAgY3VyYnVmICs9IGNudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BsYXkgZHJpdmVyIGluZm9ybWF0aW9uIGZvciBlYWNoIGRldmljZSBhdHRhY2hlZCB0byB0aGUgYm9hcmQuCisgICAgICovCisgICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKKyAgICBjcGxlbiA9IGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworICAgIC8qCisgICAgICogRGlzcGxheSBFRVBST00gY29uZmlndXJhdGlvbiBmb3IgdGhlIGJvYXJkLgorICAgICAqLworICAgIGNwID0gYm9hcmRwLT5wcnRidWY7CisgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICBjcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNwbGVuID0gYXNjX3BydF9hZHZfYm9hcmRfZWVwcm9tKHNocCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7CisgICAgfQorICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworICAgIC8qCisgICAgICogRGlzcGxheSBkcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgaW5mb3JtYXRpb24gZm9yIHRoZSBib2FyZC4KKyAgICAgKi8KKyAgICBjcCA9IGJvYXJkcC0+cHJ0YnVmOworICAgIGNwbGVuID0gYXNjX3BydF9kcml2ZXJfY29uZihzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICB0b3RjbnQgKz0gY250OworICAgIGxlZnRsZW4gLT0gY250OworICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgIH0KKyAgICBhZHZvZmZzZXQgKz0gY3BsZW47CisgICAgY3VyYnVmICs9IGNudDsKKworI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciB0aGUgYm9hcmQuCisgICAgICovCisgICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKKyAgICBjcGxlbiA9IGFzY19wcnRfYm9hcmRfc3RhdHMoc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICBBU0NfQVNTRVJUKGNwbGVuIDw9IEFTQ19QUlRCVUZfU0laRSk7CisgICAgY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworICAgIHRvdGNudCArPSBjbnQ7CisgICAgbGVmdGxlbiAtPSBjbnQ7CisgICAgaWYgKGxlZnRsZW4gPT0gMCkgeworICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisgICAgICAgIHJldHVybiB0b3RjbnQ7CisgICAgfQorICAgIGFkdm9mZnNldCArPSBjcGxlbjsKKyAgICBjdXJidWYgKz0gY250OworCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciBlYWNoIHRhcmdldC4KKyAgICAgKi8KKyAgICBmb3IgKHRndF9pZCA9IDA7IHRndF9pZCA8PSBBRFZfTUFYX1RJRDsgdGd0X2lkKyspIHsKKyAgICAgIGNwID0gYm9hcmRwLT5wcnRidWY7CisgICAgICBjcGxlbiA9IGFzY19wcnRfdGFyZ2V0X3N0YXRzKHNocCwgdGd0X2lkLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICAgIEFTQ19BU1NFUlQoY3BsZW4gPD0gQVNDX1BSVEJVRl9TSVpFKTsKKyAgICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKyAgICAgIHRvdGNudCArPSBjbnQ7CisgICAgICBsZWZ0bGVuIC09IGNudDsKKyAgICAgIGlmIChsZWZ0bGVuID09IDApIHsKKyAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworICAgICAgICByZXR1cm4gdG90Y250OworICAgICAgfQorICAgICAgYWR2b2Zmc2V0ICs9IGNwbGVuOworICAgICAgY3VyYnVmICs9IGNudDsKKyAgICB9CisjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KKworICAgIC8qCisgICAgICogRGlzcGxheSBBc2MgTGlicmFyeSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgKiBmb3IgdGhlIGJvYXJkLgorICAgICAqLworICAgIGNwID0gYm9hcmRwLT5wcnRidWY7CisgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICBjcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjcGxlbiA9IGFzY19wcnRfYWR2X2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKyAgICB9CisgICAgQVNDX0FTU0VSVChjcGxlbiA8IEFTQ19QUlRCVUZfU0laRSk7CisgICAgY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworICAgIHRvdGNudCArPSBjbnQ7CisgICAgbGVmdGxlbiAtPSBjbnQ7CisgICAgaWYgKGxlZnRsZW4gPT0gMCkgeworICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisgICAgICAgIHJldHVybiB0b3RjbnQ7CisgICAgfQorICAgIGFkdm9mZnNldCArPSBjcGxlbjsKKyAgICBjdXJidWYgKz0gY250OworCisgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworCisgICAgcmV0dXJuIHRvdGNudDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKgorICogYWR2YW5zeXNfZGV0ZWN0KCkKKyAqCisgKiBEZXRlY3QgZnVuY3Rpb24gZm9yIEFkdmFuU3lzIGFkYXB0ZXJzLgorICoKKyAqIEFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgaG9zdCBkcml2ZXIncyBzY3NpX2hvc3RzIGVudHJ5LgorICoKKyAqIFJldHVybiBudW1iZXIgb2YgYWRhcHRlcnMgZm91bmQuCisgKgorICogTm90ZTogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uCisgKiBpdCBtdXN0IG5vdCBjYWxsIFNDU0kgbWlkLWxldmVsIGZ1bmN0aW9ucyBpbmNsdWRpbmcgc2NzaV9tYWxsb2MoKQorICogYW5kIHNjc2lfZnJlZSgpLgorICovCitpbnQgX19pbml0CithZHZhbnN5c19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKyAgICBzdGF0aWMgaW50ICAgICAgICAgIGRldGVjdF9jYWxsZWQgPSBBU0NfRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICBpb3A7CisgICAgaW50ICAgICAgICAgICAgICAgICBidXM7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwID0gTlVMTDsKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICpib2FyZHAgPSBOVUxMOworICAgIEFTQ19EVkNfVkFSICAgICAgICAgKmFzY19kdmNfdmFycCA9IE5VTEw7CisgICAgQURWX0RWQ19WQVIgICAgICAgICAqYWR2X2R2Y192YXJwID0gTlVMTDsKKyAgICBhZHZfc2dibGtfdCAgICAgICAgICpzZ3AgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgaW9wb3J0ID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNoYXJlX2lycSA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgaW9sZW4gPSAwOworICAgIHN0cnVjdCBkZXZpY2UJKmRldiA9IE5VTEw7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIGludCAgICAgICAgICAgICAgICAgcGNpX2luaXRfc2VhcmNoID0gMDsKKyAgICBzdHJ1Y3QgcGNpX2RldiAgICAgICpwY2lfZGV2aWNlcFtBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRF07CisgICAgaW50ICAgICAgICAgICAgICAgICBwY2lfY2FyZF9jbnRfbWF4ID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBjaV9jYXJkX2NudCA9IDA7CisgICAgc3RydWN0IHBjaV9kZXYgICAgICAqcGNpX2RldnAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgcGNpX2RldmljZV9pZF9jbnQgPSAwOworICAgIHVuc2lnbmVkIGludCAgICAgICAgcGNpX2RldmljZV9pZFtBU0NfUENJX0RFVklDRV9JRF9DTlRdID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9ERVZJQ0VfSURfMTEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19QQ0lfREVWSUNFX0lEXzEyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUENJX0RFVklDRV9JRF8xMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9ERVZJQ0VfSURfMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19QQ0lfREVWSUNFX0lEXzI1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUENJX0RFVklDRV9JRF8yNzAwCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIEFEVl9QQUREUiAgICAgICAgICAgcGNpX21lbW9yeV9hZGRyZXNzOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHdhcm5fY29kZSwgZXJyX2NvZGU7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXQ7CisKKyAgICBpZiAoZGV0ZWN0X2NhbGxlZCA9PSBBU0NfRkFMU0UpIHsKKyAgICAgICAgZGV0ZWN0X2NhbGxlZCA9IEFTQ19UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50aygiQWR2YW5TeXMgU0NTSTogYWR2YW5zeXNfZGV0ZWN0KCkgbXVsdGlwbGUgY2FsbHMgaWdub3JlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogYmVnaW5cbiIpOworCisgICAgYXNjX2JvYXJkX2NvdW50ID0gMDsKKworICAgIC8qCisgICAgICogSWYgSS9PIHBvcnQgcHJvYmluZyBoYXMgYmVlbiBtb2RpZmllZCwgdGhlbiB2ZXJpZnkgYW5kCisgICAgICogY2xlYW4tdXAgdGhlICdhc2NfaW9wb3J0JyBsaXN0LgorICAgICAqLworICAgIGlmIChhc2NfaW9wZmxhZyA9PSBBU0NfVFJVRSkgeworICAgICAgICBmb3IgKGlvcG9ydCA9IDA7IGlvcG9ydCA8IEFTQ19OVU1fSU9QT1JUX1BST0JFOyBpb3BvcnQrKykgeworICAgICAgICAgICAgQVNDX0RCRzIoMSwgImFkdmFuc3lzX2RldGVjdDogYXNjX2lvcG9ydFslZF0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBpb3BvcnQsIGFzY19pb3BvcnRbaW9wb3J0XSk7CisgICAgICAgICAgICBpZiAoYXNjX2lvcG9ydFtpb3BvcnRdICE9IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlvcCA9IDA7IGlvcCA8IEFTQ19JT0FEUl9UQUJMRV9NQVhfSVg7IGlvcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYXNjX2RlZl9pb3BfYmFzZVtpb3BdID09IGFzY19pb3BvcnRbaW9wb3J0XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlvcCA9PSBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygKKyJBZHZhblN5cyBTQ1NJOiBzcGVjaWZpZWQgSS9PIFBvcnQgMHglWCBpcyBpbnZhbGlkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdKTsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW9wb3J0ID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGJ1cyA9IDA7IGJ1cyA8IEFTQ19OVU1fQlVTOyBidXMrKykgeworCisgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19kZXRlY3Q6IGJ1cyBzZWFyY2ggdHlwZSAlZCAoJXMpXG4iLAorICAgICAgICAgICAgYnVzLCBhc2NfYnVzX25hbWVbYnVzXSk7CisgICAgICAgIGlvcCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGFzY19ib2FyZF9jb3VudCA8IEFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEKSB7CisKKyAgICAgICAgICAgIEFTQ19EQkcxKDIsICJhZHZhbnN5c19kZXRlY3Q6IGFzY19ib2FyZF9jb3VudCAlZFxuIiwKKyAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQpOworCisgICAgICAgICAgICBzd2l0Y2ggKGFzY19idXNbYnVzXSkgeworICAgICAgICAgICAgY2FzZSBBU0NfSVNfSVNBOgorICAgICAgICAgICAgY2FzZSBBU0NfSVNfVkw6CisjaWZkZWYgQ09ORklHX0lTQQorICAgICAgICAgICAgICAgIGlmIChhc2NfaW9wZmxhZyA9PSBBU0NfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgaW9wID0gQXNjU2VhcmNoSU9Qb3J0QWRkcihpb3AsIGFzY19idXNbYnVzXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogSVNBIGFuZCBWTCBJL08gcG9ydCBzY2FubmluZyBoYXMgZWl0aGVyIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICogZWxpbWluYXRlZCBvciBsaW1pdGVkIHRvIHNlbGVjdGVkIHBvcnRzIG9uCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBMSUxPIGNvbW1hbmQgbGluZSwgL2V0Yy9saWxvLmNvbmYsIG9yCisgICAgICAgICAgICAgICAgICAgICAqIGJ5IHNldHRpbmcgdmFyaWFibGVzIHdoZW4gdGhlIG1vZHVsZSB3YXMgbG9hZGVkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfZGV0ZWN0OiBJL08gcG9ydCBzY2FubmluZyBtb2RpZmllZFxuIik7CisgICAgICAgICAgICAgICAgaW9wb3J0X3RyeV9hZ2FpbjoKKyAgICAgICAgICAgICAgICAgICAgaW9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGlvcG9ydCA8IEFTQ19OVU1fSU9QT1JUX1BST0JFOyBpb3BvcnQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpb3AgPSBhc2NfaW9wb3J0W2lvcG9ydF0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfREJHMSgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBwcm9iaW5nIEkvTyBwb3J0IDB4JXguLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19yZWdpb24oaW9wLCBBU0NfSU9BRFJfR0FQKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKAorIkFkdmFuU3lzIFNDU0k6IHNwZWNpZmllZCBJL08gUG9ydCAweCVYIGlzIGJ1c3lcbiIsIGlvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdHJ5IHRoaXMgSS9PIHBvcnQgdHdpY2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wKSA9PSBBU0NfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoCisiQWR2YW5TeXMgU0NTSTogc3BlY2lmaWVkIEkvTyBQb3J0IDB4JVggaGFzIG5vIGFkYXB0ZXJcbiIsIGlvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdHJ5IHRoaXMgSS9PIHBvcnQgdHdpY2UuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhpcyBpc24ndCBhbiBJU0EgYm9hcmQsIHRoZW4gaXQgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGEgVkwgYm9hcmQuIElmIGN1cnJlbnRseSBsb29raW5nIGFuIElTQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkIGlzIGJlaW5nIGxvb2tlZCBmb3IgdGhlbiB0cnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5vdGhlciBJU0EgYm9hcmQgaW4gJ2FzY19pb3BvcnQnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc2NfYnVzW2J1c10gPT0gQVNDX0lTX0lTQSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wLCBBU0NfSVNfSVNBKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0hJUF9WRVJfSVNBX0JJVCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERvbid0IGNsZWFyICdhc2NfaW9wb3J0W2lvcG9ydF0nLiBUcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYm9hcmQgYWdhaW4gZm9yIFZMLiBJbmNyZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdpb3BvcnQnIHBhc3QgdGhpcyBib2FyZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wb3J0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgYm9hcmQgYXBwZWFycyBnb29kLCBkb24ndCB0cnkgdGhlIEkvTyBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZ2FpbiBieSBjbGVhcmluZyBpdHMgdmFsdWUuIEluY3JlbWVudCAnaW9wb3J0JworICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnQrK10gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBU0NfSVNfRUlTQToKKyNpZmRlZiBDT05GSUdfSVNBCisgICAgICAgICAgICAgICAgaW9wID0gQXNjU2VhcmNoSU9Qb3J0QWRkcihpb3AsIGFzY19idXNbYnVzXSk7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFTQ19JU19QQ0k6CisjaWZkZWYgQ09ORklHX1BDSQorICAgICAgICAgICAgICAgIGlmIChwY2lfaW5pdF9zZWFyY2ggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSwgajsKKworICAgICAgICAgICAgICAgICAgICBwY2lfaW5pdF9zZWFyY2ggPSAxOworCisgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgYWxsIFBDSSBjYXJkcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBjaV9kZXZpY2VfaWRfY250IDwgQVNDX1BDSV9ERVZJQ0VfSURfQ05UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBjaV9kZXZwID0gcGNpX2ZpbmRfZGV2aWNlKEFTQ19QQ0lfVkVORE9SSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZV9pZFtwY2lfZGV2aWNlX2lkX2NudF0sIHBjaV9kZXZwKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZV9pZF9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXZwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZpY2VwW3BjaV9jYXJkX2NudF9tYXgrK10gPSBwY2lfZGV2cDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBTb3J0IFBDSSBjYXJkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgUENJIEJ1cywgU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICogYW5kIERldmljZSBOdW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGNpX2NhcmRfY250X21heCAtIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBwY2lfY2FyZF9jbnRfbWF4OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBjaV9kZXZpY2VwW2pdLT5idXMtPm51bWJlciA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtpXS0+YnVzLT5udW1iZXIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGNpX2RldmljZXBbal0tPmJ1cy0+bnVtYmVyID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZXBbaV0tPmJ1cy0+bnVtYmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwY2lfZGV2aWNlcFtqXS0+ZGV2Zm4gPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtpXS0+ZGV2Zm4pKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2cCA9IHBjaV9kZXZpY2VwW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtpXSA9IHBjaV9kZXZpY2VwW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtqXSA9IHBjaV9kZXZwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBjaV9jYXJkX2NudCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGNpX2NhcmRfY250Kys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBjaV9jYXJkX2NudCA9PSBwY2lfY2FyZF9jbnRfbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlvcCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGNpX2RldnAgPSBwY2lfZGV2aWNlcFtwY2lfY2FyZF9jbnRdOworCisgICAgICAgICAgICAgICAgICAgIEFTQ19EQkcyKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBkZXZmbiAlZCwgYnVzIG51bWJlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZwLT5kZXZmbiwgcGNpX2RldnAtPmJ1cy0+bnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW9wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RCRzIoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IHZlbmRvcklEICVYLCBkZXZpY2VJRCAlWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZwLT52ZW5kb3IsIHBjaV9kZXZwLT5kZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBBU0NfREJHMigyLCAiYWR2YW5zeXNfZGV0ZWN0OiBpb3AgJVgsIGlycUxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpb3AsIHBjaV9kZXZwLT5pcnEpOworICAgICAgICAgICAgICAgIH0KKwkJaWYocGNpX2RldnApCisJCSAgICBkZXYgPSAmcGNpX2RldnAtPmRldjsKKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKCJhZHZhbnN5c19kZXRlY3Q6IHVua25vd24gYnVzIHR5cGU6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBhc2NfYnVzW2J1c10pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogaW9wIDB4JXhcbiIsIGlvcCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBZGFwdGVyIG5vdCBmb3VuZCwgdHJ5IG5leHQgYnVzIHR5cGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpb3AgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWRhcHRlciBmb3VuZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBSZWdpc3RlciB0aGUgYWRhcHRlciwgZ2V0IGl0cyBjb25maWd1cmF0aW9uLCBhbmQKKyAgICAgICAgICAgICAqIGluaXRpYWxpemUgaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFTQ19EQkcoMiwgImFkdmFuc3lzX2RldGVjdDogc2NzaV9yZWdpc3RlcigpXG4iKTsKKyAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKGFzY19ib2FyZF90KSk7CisKKyAgICAgICAgICAgIGlmIChzaHAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisJICAgIHNjc2lfc2V0X2RldmljZShzaHAsIGRldik7CisKKyAgICAgICAgICAgIC8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBTY3NpX0hvc3Qgb2YgZWFjaCBib2FyZCBmb3VuZC4gKi8KKyAgICAgICAgICAgIGFzY19ob3N0W2FzY19ib2FyZF9jb3VudCsrXSA9IHNocDsKKworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHBlciBib2FyZCBkYXRhICovCisgICAgICAgICAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisgICAgICAgICAgICBtZW1zZXQoYm9hcmRwLCAwLCBzaXplb2YoYXNjX2JvYXJkX3QpKTsKKyAgICAgICAgICAgIGJvYXJkcC0+aWQgPSBhc2NfYm9hcmRfY291bnQgLSAxOworCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIHNwaW5sb2NrLiAqLworICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmJvYXJkcC0+bG9jayk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBIYW5kbGUgYm90aCBuYXJyb3cgYW5kIHdpZGUgYm9hcmRzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIElmIGEgV2lkZSBib2FyZCB3YXMgZGV0ZWN0ZWQsIHNldCB0aGUgYm9hcmQgc3RydWN0dXJlCisgICAgICAgICAgICAgKiB3aWRlIGJvYXJkIGZsYWcuIFNldC11cCB0aGUgYm9hcmQgc3RydWN0dXJlIGJhc2VkIG9uCisgICAgICAgICAgICAgKiB0aGUgYm9hcmQgdHlwZS4KKyAgICAgICAgICAgICAqLworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAgICAgICAgIGlmIChhc2NfYnVzW2J1c10gPT0gQVNDX0lTX1BDSSAmJgorICAgICAgICAgICAgICAgIChwY2lfZGV2cC0+ZGV2aWNlID09IEFTQ19QQ0lfREVWSUNFX0lEXzIzMDAgfHwKKyAgICAgICAgICAgICAgICAgcGNpX2RldnAtPmRldmljZSA9PSBBU0NfUENJX0RFVklDRV9JRF8yNTAwIHx8CisgICAgICAgICAgICAgICAgIHBjaV9kZXZwLT5kZXZpY2UgPT0gQVNDX1BDSV9ERVZJQ0VfSURfMjcwMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9hcmRwLT5mbGFncyB8PSBBU0NfSVNfV0lERV9CT0FSRDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IG5hcnJvdyBib2FyZFxuIik7CisgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKyAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmJ1c190eXBlID0gYXNjX2J1c1tidXNdOworICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+ZHJ2X3B0ciA9IGJvYXJkcDsKKyAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmNmZyA9ICZib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmc7CisgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5jZmctPm92ZXJydW5fYnVmID0gJm92ZXJydW5fYnVmWzBdOworICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+aW9wX2Jhc2UgPSBpb3A7CisgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5pc3JfY2FsbGJhY2sgPSBhc2NfaXNyX2NhbGxiYWNrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IHdpZGUgYm9hcmRcbiIpOworICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5kcnZfcHRyID0gYm9hcmRwOworICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnID0gJmJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZzsKKyAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmlzcl9jYWxsYmFjayA9IGFkdl9pc3JfY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5hc3luY19jYWxsYmFjayA9IGFkdl9hc3luY19jYWxsYmFjazsKKyNpZmRlZiBDT05GSUdfUENJCisgICAgICAgICAgICAgICAgaWYgKHBjaV9kZXZwLT5kZXZpY2UgPT0gQVNDX1BDSV9ERVZJQ0VfSURfMjMwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogQVNDLTM1NTBcbiIpOworICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9IEFEVl9DSElQX0FTQzM1NTA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2lfZGV2cC0+ZGV2aWNlID09IEFTQ19QQ0lfREVWSUNFX0lEXzI1MDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IEFTQy0zOEMwODAwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPSBBRFZfQ0hJUF9BU0MzOEMwODAwOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfZGV0ZWN0OiBBU0MtMzhDMTYwMFxuIik7CisgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID0gQURWX0NISVBfQVNDMzhDMTYwMDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBNYXAgdGhlIGJvYXJkJ3MgcmVnaXN0ZXJzIGludG8gdmlydHVhbCBtZW1vcnkgZm9yCisgICAgICAgICAgICAgICAgICogUENJIHNsYXZlIGFjY2Vzcy4gT25seSBtZW1vcnkgYWNjZXNzZXMgYXJlIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdGhlIGJvYXJkJ3MgcmVnaXN0ZXJzLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogTm90ZTogVGhlIFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3MgaXMgbm90IGFsd2F5cworICAgICAgICAgICAgICAgICAqIHBhZ2UgYWxpZ25lZCwgYnV0IHRoZSBhZGRyZXNzIHBhc3NlZCB0byBpb3JlbWFwKCkKKyAgICAgICAgICAgICAgICAgKiBtdXN0IGJlIHBhZ2UgYWxpZ25lZC4gSXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAqIFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgd2lsbCBub3QgY3Jvc3MgYSBwYWdlCisgICAgICAgICAgICAgICAgICogYm91bmRhcnkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpb2xlbiA9IEFEVl8zNTUwX0lPTEVOOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlvbGVuID0gQURWXzM4QzA4MDBfSU9MRU47CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpb2xlbiA9IEFEVl8zOEMxNjAwX0lPTEVOOworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfUENJCisgICAgICAgICAgICAgICAgcGNpX21lbW9yeV9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZwLCAxKTsKKyAgICAgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBwY2lfbWVtb3J5X2FkZHJlc3M6IDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAodWxvbmcpIHBjaV9tZW1vcnlfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgaWYgKChib2FyZHAtPmlvcmVtYXBfYWRkciA9CisgICAgICAgICAgICAgICAgICAgIGlvcmVtYXAocGNpX21lbW9yeV9hZGRyZXNzICYgUEFHRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQ6IGlvcmVtYXAoJXgsICVkKSByZXR1cm5lZCBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBwY2lfbWVtb3J5X2FkZHJlc3MsIGlvbGVuKTsKKyAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogaW9yZW1hcF9hZGRyOiAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVsb25nKSBib2FyZHAtPmlvcmVtYXBfYWRkcik7CisgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5pb3BfYmFzZSA9IChBZHZQb3J0QWRkcikKKyAgICAgICAgICAgICAgICAgICAgKGJvYXJkcC0+aW9yZW1hcF9hZGRyICsKKyAgICAgICAgICAgICAgICAgICAgIChwY2lfbWVtb3J5X2FkZHJlc3MgLSAocGNpX21lbW9yeV9hZGRyZXNzICYgUEFHRV9NQVNLKSkpOworICAgICAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGlvcF9iYXNlOiAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5pb3BfYmFzZSk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBFdmVuIHRob3VnaCBpdCBpc24ndCB1c2VkIHRvIGFjY2VzcyB3aWRlIGJvYXJkcywgb3RoZXIKKyAgICAgICAgICAgICAgICAgKiB0aGFuIGZvciB0aGUgZGVidWcgbGluZSBiZWxvdywgc2F2ZSBJL08gUG9ydCBhZGRyZXNzIHNvCisgICAgICAgICAgICAgICAgICogdGhhdCBpdCBjYW4gYmUgcmVwb3J0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pb3BvcnQgPSBpb3A7CisKKyAgICAgICAgICAgICAgICBBU0NfREJHMigxLAorImFkdmFuc3lzX2RldGVjdDogaW9wYl9jaGlwX2lkXzEgMHgleCwgaW9wd19jaGlwX2lkXzAgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgaW5wKGlvcCArIDEpLCAodXNob3J0KSBpbnB3KGlvcCkpOworICAgICAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgICAgICAqIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGJvYXJkcC0+cHJ0YnVmID0KKyAgICAgICAgICAgICAgICBrbWFsbG9jKEFTQ19QUlRCVUZfU0laRSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQ6IGttYWxsb2MoJWQsICVkKSByZXR1cm5lZCBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBBU0NfUFJUQlVGX1NJWkUsIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJYXNjX2R2Y192YXJwLT5jZmctPmRldiA9IGRldjsKKwkJLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGJvYXJkIGJ1cyB0eXBlIGFuZCBQQ0kgSVJRIGJlZm9yZQorICAgICAgICAgICAgICAgICAqIGNhbGxpbmcgQXNjSW5pdEdldENvbmZpZygpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSkgeworI2lmZGVmIENPTkZJR19JU0EKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19JU19JU0E6CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaGFyZV9pcnEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfSVNfVkw6CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX0lTX0VJU0E6CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19JU19QQ0k6CisgICAgICAgICAgICAgICAgICAgIHNocC0+aXJxID0gYXNjX2R2Y192YXJwLT5pcnFfbm8gPSBwY2lfZGV2cC0+aXJxOworICAgICAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmNmZy0+cGNpX3Nsb3RfaW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUENJX01LSUQocGNpX2RldnAtPmJ1cy0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaV9kZXZwLT5kZXZmbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkMocGNpX2RldnAtPmRldmZuKSk7CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogdW5rbm93biBhZGFwdGVyIHR5cGU6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5idXNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBzaGFyZV9pcnEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRm9yIFdpZGUgYm9hcmRzIHNldCBQQ0kgaW5mb3JtYXRpb24gYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgICAgICAgICAgKiBBZHZJbml0R2V0Q29uZmlnKCkuCisgICAgICAgICAgICAgICAgICovCisjaWZkZWYgQ09ORklHX1BDSQorICAgICAgICAgICAgICAgIHNocC0+aXJxID0gYWR2X2R2Y192YXJwLT5pcnFfbm8gPSBwY2lfZGV2cC0+aXJxOworICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5wY2lfc2xvdF9pbmZvID0KKyAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9NS0lEKHBjaV9kZXZwLT5idXMtPm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaV9kZXZwLT5kZXZmbiksCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRlVOQyhwY2lfZGV2cC0+ZGV2Zm4pKTsKKyAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7CisgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gVFJVRTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWFkIHRoZSBib2FyZCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAqIE5PVEU6IEFzY0luaXRHZXRDb25maWcoKSBtYXkgY2hhbmdlIHRoZSBib2FyZCdzCisgICAgICAgICAgICAgICAgICAqIGJ1c190eXBlIHZhbHVlLiBUaGUgYXNjX2J1c1tidXNdIHZhbHVlIHNob3VsZCBubworICAgICAgICAgICAgICAgICAgKiBsb25nZXIgYmUgdXNlZC4gSWYgdGhlIGJ1c190eXBlIGZpZWxkIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICogcmVmZXJlbmNlZCBvbmx5IHVzZSB0aGUgYml0LXdpc2UgQU5EIG9wZXJhdG9yICImIi4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQVNDX0RCRygyLCAiYWR2YW5zeXNfZGV0ZWN0OiBBc2NJbml0R2V0Q29uZmlnKClcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaChyZXQgPSBBc2NJbml0R2V0Q29uZmlnKGFzY19kdmNfdmFycCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6ICAgIC8qIE5vIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fSU9fUE9SVF9ST1RBVEU6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IEkvTyBwb3J0IGFkZHJlc3MgbW9kaWZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9BVVRPX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKKyJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogSS9PIHBvcnQgaW5jcmVtZW50IHN3aXRjaCBlbmFibGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fRUVQUk9NX0NIS1NVTToKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKKyJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogRUVQUk9NIGNoZWNrc3VtIGVycm9yXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fSVJRX01PRElGSUVEOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiBJUlEgbW9kaWZpZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiB0YWcgcXVldWluZyBlbmFibGVkIHcvbyBkaXNjb25uZWN0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAorIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiB1bmtub3duIHdhcm5pbmc6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCByZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChlcnJfY29kZSA9IGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKKyJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZCBlcnJvcjogaW5pdF9zdGF0ZSAweCV4LCBlcnJfY29kZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRHZXRDb25maWcoKVxuIik7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBBZHZJbml0R2V0Q29uZmlnKGFkdl9kdmNfdmFycCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigiQWR2SW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IHdhcm5pbmc6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCByZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGVycl9jb2RlID0gYWR2X2R2Y192YXJwLT5lcnJfY29kZSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAorIkFkdkluaXRHZXRDb25maWc6IGJvYXJkICVkIGVycm9yOiBlcnJfY29kZSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYWR2X2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyX2NvZGUgIT0gMCkgeworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTYXZlIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAqIGZyb20gL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC4uLl0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKworICAgICAgICAgICAgICAgIEFTQ0VFUF9DT05GSUcgKmVwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFkYXB0ZXIncyB0YXJnZXQgaWQgYml0IGluIHRoZSAnaW5pdF90aWRtYXNrJyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBib2FyZHAtPmluaXRfdGlkbWFzayB8PQorICAgICAgICAgICAgICAgICAgICBBRFZfVElEX1RPX1RJRE1BU0soYXNjX2R2Y192YXJwLT5jZmctPmNoaXBfc2NzaV9pZCk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNhdmUgRUVQUk9NIHNldHRpbmdzIGZvciB0aGUgYm9hcmQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZXAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFzY19lZXA7CisKKyAgICAgICAgICAgICAgICBlcC0+aW5pdF9zZHRyID0gYXNjX2R2Y192YXJwLT5jZmctPnNkdHJfZW5hYmxlOworICAgICAgICAgICAgICAgIGVwLT5kaXNjX2VuYWJsZSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5kaXNjX2VuYWJsZTsKKyAgICAgICAgICAgICAgICBlcC0+dXNlX2NtZF9xbmcgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+Y21kX3FuZ19lbmFibGVkOworICAgICAgICAgICAgICAgIEFTQ19FRVBfU0VUX0RNQV9TUEQoZXAsIGFzY19kdmNfdmFycC0+Y2ZnLT5pc2FfZG1hX3NwZWVkKTsKKyAgICAgICAgICAgICAgICBlcC0+c3RhcnRfbW90b3IgPSBhc2NfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOworICAgICAgICAgICAgICAgIGVwLT5jbnRsID0gYXNjX2R2Y192YXJwLT5kdmNfY250bDsKKyAgICAgICAgICAgICAgICBlcC0+bm9fc2NhbSA9IGFzY19kdmNfdmFycC0+bm9fc2NhbTsKKyAgICAgICAgICAgICAgICBlcC0+bWF4X3RvdGFsX3FuZyA9IGFzY19kdmNfdmFycC0+bWF4X3RvdGFsX3FuZzsKKyAgICAgICAgICAgICAgICBBU0NfRUVQX1NFVF9DSElQX0lEKGVwLCBhc2NfZHZjX3ZhcnAtPmNmZy0+Y2hpcF9zY3NpX2lkKTsKKyAgICAgICAgICAgICAgICAvKiAnbWF4X3RhZ19xbmcnIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBmb3IgZXZlcnkgZGV2aWNlLiAqLworICAgICAgICAgICAgICAgIGVwLT5tYXhfdGFnX3FuZyA9IGFzY19kdmNfdmFycC0+Y2ZnLT5tYXhfdGFnX3FuZ1swXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzBdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1swXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzFdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1sxXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzJdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1syXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzNdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1szXTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzRdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1s0XTsKKyAgICAgICAgICAgICAgICBlcC0+YWRhcHRlcl9pbmZvWzVdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1s1XTsKKworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIE1vZGlmeSBib2FyZCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQVNDX0RCRygyLCAiYWR2YW5zeXNfZGV0ZWN0OiBBc2NJbml0U2V0Q29uZmlnKClcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAocmV0ID0gQXNjSW5pdFNldENvbmZpZyhhc2NfZHZjX3ZhcnApKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAgICAvKiBObyBlcnJvci4gKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9JT19QT1JUX1JPVEFURToKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKKyJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogSS9PIHBvcnQgYWRkcmVzcyBtb2RpZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0FVVE9fQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiBJL08gcG9ydCBpbmNyZW1lbnQgc3dpdGNoIGVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNOgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiBFRVBST00gY2hlY2tzdW0gZXJyb3JcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9JUlFfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IElSUSBtb2RpZmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q6CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IHRhZyBxdWV1aW5nIHcvbyBkaXNjb25uZWN0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiB1bmtub3duIHdhcm5pbmc6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCByZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFzY19kdmNfdmFycC0+ZXJyX2NvZGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAorIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkIGVycm9yOiBpbml0X3N0YXRlIDB4JXgsIGVycl9jb2RlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhc2NfZHZjX3ZhcnAtPmluaXRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAgICAgICAgICAgICAgICAgICBrZnJlZShib2FyZHAtPnBydGJ1Zik7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEZpbmlzaCBpbml0aWFsaXppbmcgdGhlICdTY3NpX0hvc3QnIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBBc2NJbml0U2V0Q29uZmlnKCkgd2lsbCBzZXQgdGhlIElSUSBmb3Igbm9uLVBDSSBib2FyZHMuICovCisgICAgICAgICAgICAgICAgaWYgKChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzaHAtPmlycSA9IGFzY19kdmNfdmFycC0+aXJxX25vOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQURWRUVQXzM1NTBfQ09ORklHICAgICAgKmVwXzM1NTA7CisgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICAgKmVwXzM4QzA4MDA7CisgICAgICAgICAgICAgICAgQURWRUVQXzM4QzE2MDBfQ09ORklHICAgKmVwXzM4QzE2MDA7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNhdmUgV2lkZSBFRVAgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zNTUwX2VlcDsKKworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5hZGFwdGVyX3Njc2lfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+bWF4X2hvc3RfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+dGVybWluYXRpb24gPSBhZHZfZHZjX3ZhcnAtPmNmZy0+dGVybWluYXRpb247CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPmRpc2NfZW5hYmxlID0gYWR2X2R2Y192YXJwLT5jZmctPmRpc2NfZW5hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5iaW9zX2N0cmwgPSBhZHZfZHZjX3ZhcnAtPmJpb3NfY3RybDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+d2R0cl9hYmxlID0gYWR2X2R2Y192YXJwLT53ZHRyX2FibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPnNkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+c2R0cl9hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT51bHRyYV9hYmxlID0gYWR2X2R2Y192YXJwLT51bHRyYV9hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPnN0YXJ0X21vdG9yID0gYWR2X2R2Y192YXJwLT5zdGFydF9tb3RvcjsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+c2NzaV9yZXNldF9kZWxheSA9IGFkdl9kdmNfdmFycC0+c2NzaV9yZXNldF93YWl0OworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwxOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOworICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zOEMwODAwX2VlcDsKKworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5hZGFwdGVyX3Njc2lfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+bWF4X2hvc3RfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+dGVybWluYXRpb25fbHZkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT50ZXJtaW5hdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+ZGlzY19lbmFibGUgPSBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGlzY19lbmFibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPmJpb3NfY3RybCA9IGFkdl9kdmNfdmFycC0+Ymlvc19jdHJsOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT53ZHRyX2FibGUgPSBhZHZfZHZjX3ZhcnAtPndkdHJfYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZHRyX3NwZWVkMSA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDE7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnNkdHJfc3BlZWQyID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMjsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDMgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQzOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZHRyX3NwZWVkNCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnRhZ3FuZ19hYmxlID0gYWR2X2R2Y192YXJwLT50YWdxbmdfYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c3RhcnRfbW90b3IgPSBhZHZfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zY3NpX3Jlc2V0X2RlbGF5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+c2NzaV9yZXNldF93YWl0OworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwxOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwzOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMCA9ICZib2FyZHAtPmVlcF9jb25maWcuYWR2XzM4QzE2MDBfZWVwOworCisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPmFkYXB0ZXJfc2NzaV9pZCA9IGFkdl9kdmNfdmFycC0+Y2hpcF9zY3NpX2lkOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5tYXhfaG9zdF9xbmcgPSBhZHZfZHZjX3ZhcnAtPm1heF9ob3N0X3FuZzsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+bWF4X2R2Y19xbmcgPSBhZHZfZHZjX3ZhcnAtPm1heF9kdmNfcW5nOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT50ZXJtaW5hdGlvbl9sdmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnRlcm1pbmF0aW9uOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5kaXNjX2VuYWJsZSA9IGFkdl9kdmNfdmFycC0+Y2ZnLT5kaXNjX2VuYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+Ymlvc19jdHJsID0gYWR2X2R2Y192YXJwLT5iaW9zX2N0cmw7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPndkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+d2R0cl9hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNkdHJfc3BlZWQxID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMTsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+c2R0cl9zcGVlZDIgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQyOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZHRyX3NwZWVkMyA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNkdHJfc3BlZWQ0ID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkNDsKKyAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zdGFydF9tb3RvciA9IGFkdl9kdmNfdmFycC0+c3RhcnRfbW90b3I7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNjc2lfcmVzZXRfZGVsYXkgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5zY3NpX3Jlc2V0X3dhaXQ7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDEgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDE7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDI7CisgICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDMgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFkYXB0ZXIncyB0YXJnZXQgaWQgYml0IGluIHRoZSAnaW5pdF90aWRtYXNrJyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBib2FyZHAtPmluaXRfdGlkbWFzayB8PQorICAgICAgICAgICAgICAgICAgICBBRFZfVElEX1RPX1RJRE1BU0soYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSAnU2NzaV9Ib3N0JyBzdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2hwLT5pcnEgPSBhZHZfZHZjX3ZhcnAtPmlycV9ubzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENoYW5uZWxzIGFyZSBudW1iZXJlZCBiZWdpbm5pbmcgd2l0aCAwLiBGb3IgQWR2YW5TeXMgb25lIGhvc3QKKyAgICAgICAgICAgICAqIHN0cnVjdHVyZSBzdXBwb3J0cyBvbmUgY2hhbm5lbC4gTXVsdGktY2hhbm5lbCBib2FyZHMgaGF2ZSBhCisgICAgICAgICAgICAgKiBzZXBhcmF0ZSBob3N0IHN0cnVjdHVyZSBmb3IgZWFjaCBjaGFubmVsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaHAtPm1heF9jaGFubmVsID0gMDsKKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9pZCA9IEFTQ19NQVhfVElEICsgMTsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9sdW4gPSBBU0NfTUFYX0xVTiArIDE7CisKKyAgICAgICAgICAgICAgICBzaHAtPmlvX3BvcnQgPSBhc2NfZHZjX3ZhcnAtPmlvcF9iYXNlOworICAgICAgICAgICAgICAgIGJvYXJkcC0+YXNjX25faW9fcG9ydCA9IEFTQ19JT0FEUl9HQVA7CisgICAgICAgICAgICAgICAgc2hwLT50aGlzX2lkID0gYXNjX2R2Y192YXJwLT5jZmctPmNoaXBfc2NzaV9pZDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgdGhlIGFkYXB0ZXIgY2FuIGhhbmRsZS4gKi8KKyAgICAgICAgICAgICAgICBzaHAtPmNhbl9xdWV1ZSA9IGFzY19kdmNfdmFycC0+bWF4X3RvdGFsX3FuZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfaWQgPSBBRFZfTUFYX1RJRCArIDE7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfbHVuID0gQURWX01BWF9MVU4gKyAxOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTYXZlIHRoZSBJL08gUG9ydCBhZGRyZXNzIGFuZCBsZW5ndGggZXZlbiB0aG91Z2gKKyAgICAgICAgICAgICAgICAgKiBJL08gcG9ydHMgYXJlIG5vdCB1c2VkIHRvIGFjY2VzcyBXaWRlIGJvYXJkcy4KKyAgICAgICAgICAgICAgICAgKiBJbnN0ZWFkIHRoZSBXaWRlIGJvYXJkcyBhcmUgYWNjZXNzZWQgd2l0aAorICAgICAgICAgICAgICAgICAqIFBDSSBNZW1vcnkgTWFwcGVkIEkvTy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzaHAtPmlvX3BvcnQgPSBpb3A7CisgICAgICAgICAgICAgICAgYm9hcmRwLT5hc2Nfbl9pb19wb3J0ID0gaW9sZW47CisKKyAgICAgICAgICAgICAgICBzaHAtPnRoaXNfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgdGhlIGFkYXB0ZXIgY2FuIGhhbmRsZS4gKi8KKyAgICAgICAgICAgICAgICBzaHAtPmNhbl9xdWV1ZSA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogJ25faW9fcG9ydCcgY3VycmVudGx5IGlzIG9uZSBieXRlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFNldCBhIHZhbHVlIHRvICduX2lvX3BvcnQnLCBidXQgbmV2ZXIgcmVmZXJlbmNlZCBpdCBiZWNhdXNlCisgICAgICAgICAgICAgKiBpdCBtYXkgYmUgdHJ1bmNhdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaHAtPm5faW9fcG9ydCA9IGJvYXJkcC0+YXNjX25faW9fcG9ydCA8PSAyNTUgPworICAgICAgICAgICAgICAgIGJvYXJkcC0+YXNjX25faW9fcG9ydCA6IDI1NTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvbGxvd2luZyB2MS4zLjg5LCAnY21kX3Blcl9sdW4nIGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgICAgICAgICAqIGFuZCBzaG91bGQgYmUgc2V0IHRvIHplcm8uCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQnV0IGJlY2F1c2Ugb2YgYSBidWcgaW50cm9kdWNlZCBpbiB2MS4zLjg5IGlmIHRoZSBkcml2ZXIgaXMKKyAgICAgICAgICAgICAqIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGFuZCAnY21kX3Blcl9sdW4nIGlzIHplcm8sIHRoZSBNaWQtTGV2ZWwKKyAgICAgICAgICAgICAqIFNDU0kgZnVuY3Rpb24gJ2FsbG9jYXRlX2RldmljZScgd2lsbCBwYW5pYy4gVG8gYWxsb3cgdGhlIGRyaXZlcgorICAgICAgICAgICAgICogdG8gd29yayBhcyBhIG1vZHVsZSBpbiB0aGVzZSBrZXJuZWxzIHNldCAnY21kX3Blcl9sdW4nIHRvIDEuCisJICAgICAqCisJICAgICAqIE5vdGU6IFRoaXMgaXMgd3JvbmcuICBjbWRfcGVyX2x1biBzaG91bGQgYmUgc2V0IHRvIHRoZSBkZXB0aAorCSAgICAgKiB5b3Ugd2FudCBvbiB1bnRhZ2dlZCBkZXZpY2VzIGFsd2F5cy4KKyNpZmRlZiBNT0RVTEUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2hwLT5jbWRfcGVyX2x1biA9IDE7CisvKiAjZWxzZQorICAgICAgICAgICAgc2hwLT5jbWRfcGVyX2x1biA9IDA7CisjZW5kaWYgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgdGhlCisgICAgICAgICAgICAgKiBhZGFwdGVyIGNhbiBoYW5kbGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFsbG93IHR3byBjb21tYW5kcyB3aXRoICdzZ190YWJsZXNpemUnIHNjYXR0ZXItZ2F0aGVyCisgICAgICAgICAgICAgICAgICogZWxlbWVudHMgdG8gYmUgZXhlY3V0ZWQgc2ltdWx0YW5lb3VzbHkuIFRoaXMgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgKiB0aGUgdGhlb3JldGljYWwgaGFyZHdhcmUgbGltaXQuIEl0IG1heSBiZSBkZWNyZWFzZWQKKyAgICAgICAgICAgICAgICAgKiBiZWxvdy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzaHAtPnNnX3RhYmxlc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICgoKGFzY19kdmNfdmFycC0+bWF4X3RvdGFsX3FuZyAtIDIpIC8gMikgKgorICAgICAgICAgICAgICAgICAgICBBU0NfU0dfTElTVF9QRVJfUSkgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaHAtPnNnX3RhYmxlc2l6ZSA9IEFEVl9NQVhfU0dfTElTVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSB2YWx1ZSBvZiAnc2dfdGFibGVzaXplJyBjYW4gbm90IGV4Y2VlZCB0aGUgU0NTSQorICAgICAgICAgICAgICogbWlkLWxldmVsIGRyaXZlciBkZWZpbml0aW9uIG9mIFNHX0FMTC4gU0dfQUxMIGFsc28KKyAgICAgICAgICAgICAqIG11c3Qgbm90IGJlIGV4Y2VlZGVkLCBiZWNhdXNlIGl0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZQorICAgICAgICAgICAgICogc2l6ZSBvZiB0aGUgc2NhdHRlci1nYXRoZXIgdGFibGUgaW4gJ3N0cnVjdCBhc2Nfc2dfaGVhZCcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzaHAtPnNnX3RhYmxlc2l6ZSA+IFNHX0FMTCkgeworICAgICAgICAgICAgICAgIHNocC0+c2dfdGFibGVzaXplID0gU0dfQUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBzZ190YWJsZXNpemU6ICVkXG4iLAorICAgICAgICAgICAgICAgIHNocC0+c2dfdGFibGVzaXplKTsKKworICAgICAgICAgICAgLyogQklPUyBzdGFydCBhZGRyZXNzLiAqLworICAgICAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICAgICAgICAgIHNocC0+YmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKHVsb25nKSBBc2NHZXRDaGlwQmlvc0FkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5pb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmJ1c190eXBlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmlsbC1pbiBCSU9TIGJvYXJkIHZhcmlhYmxlcy4gVGhlIFdpZGUgQklPUyBzYXZlcworICAgICAgICAgICAgICAgICAqIGluZm9ybWF0aW9uIGluIExSQU0gdGhhdCBpcyB1c2VkIGJ5IHRoZSBkcml2ZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsIEJJT1NfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3Nfc2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oYWR2X2R2Y192YXJwLT5pb3BfYmFzZSwgQklPU19WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3NfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsIEJJT1NfQ09ERVNFRywKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5iaW9zX2NvZGVzZWcpOworICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLCBCSU9TX0NPREVMRU4sCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+Ymlvc19jb2RlbGVuKTsKKworICAgICAgICAgICAgICAgIEFTQ19EQkcyKDEsCisgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IGJpb3Nfc2lnbmF0dXJlIDB4JXgsIGJpb3NfdmVyc2lvbiAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3Nfc2lnbmF0dXJlLCBib2FyZHAtPmJpb3NfdmVyc2lvbik7CisKKyAgICAgICAgICAgICAgICBBU0NfREJHMigxLAorICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBiaW9zX2NvZGVzZWcgMHgleCwgYmlvc19jb2RlbGVuIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+Ymlvc19jb2Rlc2VnLCBib2FyZHAtPmJpb3NfY29kZWxlbik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIHRoZSBCSU9TIHNhdmVkIGEgdmFsaWQgc2lnbmF0dXJlLCB0aGVuIGZpbGwgaW4KKyAgICAgICAgICAgICAgICAgKiB0aGUgQklPUyBjb2RlIHNlZ21lbnQgYmFzZSBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChib2FyZHAtPmJpb3Nfc2lnbmF0dXJlID09IDB4NTVBQSkgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0IHg4NiByZWFsbW9kZSBjb2RlIHNlZ21lbnQgdG8gYSBsaW5lYXIKKyAgICAgICAgICAgICAgICAgICAgICogYWRkcmVzcyBieSBzaGlmdGluZyBsZWZ0IDQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzaHAtPmJhc2UgPSAoKHVsb25nKSBib2FyZHAtPmJpb3NfY29kZXNlZyA8PCA0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaHAtPmJhc2UgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlZ2lzdGVyIEJvYXJkIFJlc291cmNlcyAtIEkvTyBQb3J0LCBETUEsIElSUQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWdpc3RlciBJL08gcG9ydCByYW5nZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGb3IgV2lkZSBib2FyZHMgdGhlIEkvTyBwb3J0cyBhcmUgbm90IHVzZWQgdG8gYWNjZXNzCisgICAgICAgICAgICAgKiB0aGUgYm9hcmQsIGJ1dCByZXF1ZXN0IHRoZSByZWdpb24gYW55d2F5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICdzaHAtPm5faW9fcG9ydCcgaXMgbm90IHJlZmVyZW5jZWQsIGJlY2F1c2UgaXQgbWF5IGJlIHRydW5jYXRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQVNDX0RCRzIoMiwKKyAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiByZXF1ZXN0X3JlZ2lvbiBwb3J0IDB4JWx4LCBsZW4gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAodWxvbmcpIHNocC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0X3JlZ2lvbihzaHAtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXMiKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKKyJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiByZXF1ZXN0X3JlZ2lvbigpIGZhaWxlZCwgcG9ydCAweCVseCwgbGVuIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsICh1bG9uZykgc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIERNQSBDaGFubmVsIGZvciBOYXJyb3cgYm9hcmRzLiAqLworICAgICAgICAgICAgc2hwLT5kbWFfY2hhbm5lbCA9IE5PX0lTQV9ETUE7IC8qIERlZmF1bHQgdG8gbm8gSVNBIERNQS4gKi8KKyNpZmRlZiBDT05GSUdfSVNBCisgICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgRE1BIGNoYW5uZWwgZm9yIElTQSBidXMuICovCisgICAgICAgICAgICAgICAgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSB7CisgICAgICAgICAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+aXNhX2RtYV9jaGFubmVsOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9kbWEoc2hwLT5kbWFfY2hhbm5lbCwgImFkdmFuc3lzIikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9kbWEoKSAlZCBmYWlsZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5kbWFfY2hhbm5lbCwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNocC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQXNjRW5hYmxlSXNhRG1hKHNocC0+ZG1hX2NoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIElSUSBOdW1iZXIuICovCisgICAgICAgICAgICBBU0NfREJHMSgyLCAiYWR2YW5zeXNfZGV0ZWN0OiByZXF1ZXN0X2lycSgpICVkXG4iLCBzaHAtPmlycSk7CisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIElmIHJlcXVlc3RfaXJxKCkgZmFpbHMgd2l0aCB0aGUgU0FfSU5URVJSVVBUIGZsYWcgc2V0LAorICAgICAgICAgICAgKiB0aGVuIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIFRoaXMKKyAgICAgICAgICAgICogYWxsb3dzIElSUSBzaGFyaW5nIHRvIHdvcmsgZXZlbiB3aXRoIG90aGVyIGRyaXZlcnMgdGhhdAorICAgICAgICAgICAgKiBkbyBub3Qgc2V0IHRoZSBTQV9JTlRFUlJVUFQgZmxhZy4KKyAgICAgICAgICAgICoKKyAgICAgICAgICAgICogSWYgU0FfSU5URVJSVVBUIGlzIG5vdCBzZXQsIHRoZW4gaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorICAgICAgICAgICAgKiBiZWZvcmUgdGhlIGRyaXZlciBpbnRlcnJ1cHQgZnVuY3Rpb24gaXMgY2FsbGVkLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgoKHJldCA9IHJlcXVlc3RfaXJxKHNocC0+aXJxLCBhZHZhbnN5c19pbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgKHNoYXJlX2lycSA9PSBUUlVFID8gU0FfU0hJUlEgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXMiLCBib2FyZHApKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICgocmV0ID0gcmVxdWVzdF9pcnEoc2hwLT5pcnEsIGFkdmFuc3lzX2ludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hhcmVfaXJxID09IFRSVUUgPyBTQV9TSElSUSA6IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5cyIsIGJvYXJkcCkpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLUVCVVNZKSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9pcnEoKTogSVJRIDB4JXggYWxyZWFkeSBpbiB1c2UuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5pcnEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IC1FSU5WQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigKKyJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiByZXF1ZXN0X2lycSgpOiBJUlEgMHgleCBub3QgdmFsaWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5pcnEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9pcnEoKTogSVJRIDB4JXggZmFpbGVkIHdpdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBzaHAtPmlycSwgcmV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOworICAgICAgICAgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9kbWEoc2hwLT5kbWFfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJbml0aWFsaXplIGJvYXJkIFJJU0MgY2hpcCBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhZHZhbnN5c19kZXRlY3Q6IEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOworICAgICAgICAgICAgICAgIHdhcm5fY29kZSA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmNfdmFycCk7CisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlOworCisgICAgICAgICAgICAgICAgaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQ0KAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGluaXRfc3RhdGUgMHgleCwgd2FybiAweCV4LCBlcnJvciAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBRFZfQ0FSUl9UICAgICAgKmNhcnJwOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICByZXFfY250ID0gMDsKKyAgICAgICAgICAgICAgICBhZHZfcmVxX3QgICAgICAgKnJlcXAgPSBOVUxMOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZ19jbnQgPSAwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgY2FycmllciBzdHJ1Y3R1cmVzLiBUaGUgdG90YWwgc2l6ZQorICAgICAgICAgICAgICAgICAqIGlzIGFib3V0IDQgS0IsIHNvIGFsbG9jYXRlIGFsbCBhdCBvbmNlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNhcnJwID0KKyAgICAgICAgICAgICAgICAgICAgKEFEVl9DQVJSX1QgKikga21hbGxvYyhBRFZfQ0FSUklFUl9CVUZTSVpFLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBjYXJycCAweCVseFxuIiwgKHVsb25nKSBjYXJycCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2FycnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGttYWxsb2NfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB1cCB0byAnbWF4X2hvc3RfcW5nJyByZXF1ZXN0IHN0cnVjdHVyZXMgZm9yCisgICAgICAgICAgICAgICAgICogdGhlIFdpZGUgYm9hcmQuIFRoZSB0b3RhbCBzaXplIGlzIGFib3V0IDE2IEtCLCBzbworICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlIGFsbCBhdCBvbmNlLiBJZiB0aGUgYWxsb2NhdGlvbiBmYWlscyBkZWNyZW1lbnQKKyAgICAgICAgICAgICAgICAgKiBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZvciAocmVxX2NudCA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOworICAgICAgICAgICAgICAgICAgICByZXFfY250ID4gMDsgcmVxX2NudC0tKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmVxcCA9IChhZHZfcmVxX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKGFkdl9yZXFfdCkgKiByZXFfY250LCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgICAgICAgICBBU0NfREJHMygxLAorICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogcmVxcCAweCVseCwgcmVxX2NudCAlZCwgYnl0ZXMgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nKSByZXFwLCByZXFfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nKSBzaXplb2YoYWR2X3JlcV90KSAqIHJlcV9jbnQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXFwID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGttYWxsb2NfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB1cCB0byBBRFZfVE9UX1NHX0JMT0NLIHJlcXVlc3Qgc3RydWN0dXJlcyBmb3IKKyAgICAgICAgICAgICAgICAgKiB0aGUgV2lkZSBib2FyZC4gRWFjaCBzdHJ1Y3R1cmUgaXMgYWJvdXQgMTM2IGJ5dGVzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgZm9yIChzZ19jbnQgPSAwOyBzZ19jbnQgPCBBRFZfVE9UX1NHX0JMT0NLOyBzZ19jbnQrKykgeworCisgICAgICAgICAgICAgICAgICAgIHNncCA9IChhZHZfc2dibGtfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAga21hbGxvYyhzaXplb2YoYWR2X3NnYmxrX3QpLCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2dwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2dwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFTQ19EQkczKDEsCisgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IHNnX2NudCAlZCAqICV1ID0gJXUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNnX2NudCwgc2l6ZW9mKGFkdl9zZ2Jsa190KSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSAoc2l6ZW9mKGFkdl9zZ2Jsa190KSAqIHNnX2NudCkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJZiBubyByZXF1ZXN0IHN0cnVjdHVyZXMgb3Igc2NhdHRlci1nYXRoZXIgc3RydWN0dXJlcyBjb3VsZAorICAgICAgICAgICAgICAgICAqIGJlIGFsbG9jYXRlZCwgdGhlbiByZXR1cm4gYW4gZXJyb3IuIE90aGVyd2lzZSBjb250aW51ZSB3aXRoCisgICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgICovCisgICAga21hbGxvY19lcnJvcjoKKyAgICAgICAgICAgICAgICBpZiAoY2FycnAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCisiYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZCBlcnJvcjogZmFpbGVkIHRvIGttYWxsb2MoKSBjYXJyaWVyIGJ1ZmZlci5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXFwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAga2ZyZWUoY2FycnApOworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3JlcV90IGJ1ZmZlci5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChib2FyZHAtPmFkdl9zZ2Jsa3AgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBrZnJlZShjYXJycCk7CisgICAgICAgICAgICAgICAgICAgIGtmcmVlKHJlcXApOworICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3NnYmxrX3QgYnVmZmVycy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGNhcnJpZXIgYnVmZmVyIHBvaW50ZXIuICovCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19jYXJycCA9IGNhcnJwOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNhdmUgb3JpZ2luYWwgcG9pbnRlciBmb3Iga2ZyZWUoKSBpbiBjYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUgYW5kIGNhbiBiZSB1bmxvYWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gcmVxcDsKKworICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNhcnJpZXJfYnVmID0gY2FycnA7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogUG9pbnQgJ2Fkdl9yZXFwJyB0byB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIHRoZW0gdG9nZXRoZXIuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXFfY250LS07CisgICAgICAgICAgICAgICAgICAgIHJlcXBbcmVxX2NudF0ubmV4dF9yZXFwID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IHJlcV9jbnQgPiAwOyByZXFfY250LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXBbcmVxX2NudCAtIDFdLm5leHRfcmVxcCA9ICZyZXFwW3JlcV9jbnRdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3JlcXAgPSAmcmVxcFswXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRBc2MzNTUwRHJpdmVyKClcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQWR2SW5pdEFzYzM1NTBEcml2ZXIoYWR2X2R2Y192YXJwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfREJHKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoKVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuX2NvZGUgPSBBZHZJbml0QXNjMzhDMDgwMERyaXZlcihhZHZfZHZjX3ZhcnApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRBc2MzOEMxNjAwRHJpdmVyKClcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoYWR2X2R2Y192YXJwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGFkdl9kdmNfdmFycC0+ZXJyX2NvZGU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKKyJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkIGVycm9yOiB3YXJuIDB4JXgsIGVycm9yIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgd2Fybl9jb2RlLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnJfY29kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChBU0NfV0lERV9CT0FSRChib2FyZHApKSB7CisgICAgICAgICAgICAgICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRwLT5vcmlnX2NhcnJwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShib2FyZHAtPm9yaWdfY2FycnApOworICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5vcmlnX2NhcnJwID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRwLT5vcmlnX3JlcXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+b3JpZ19yZXFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gYm9hcmRwLT5hZHZfcmVxcCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzZ3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IHNncC0+bmV4dF9zZ2Jsa3A7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzZ3ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9kbWEoc2hwLT5kbWFfY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisgICAgICAgICAgICAgICAgZnJlZV9pcnEoc2hwLT5pcnEsIGJvYXJkcCk7CisgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU0NfREJHX1BSVF9TQ1NJX0hPU1QoMiwgc2hwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGRvbmU6IGFzY19ib2FyZF9jb3VudCAlZFxuIiwgYXNjX2JvYXJkX2NvdW50KTsKKyAgICByZXR1cm4gYXNjX2JvYXJkX2NvdW50OworfQorCisvKgorICogYWR2YW5zeXNfcmVsZWFzZSgpCisgKgorICogUmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHNpbmdsZSBBZHZhblN5cyBhZGFwdGVyLgorICovCitpbnQKK2FkdmFuc3lzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwKQoreworICAgIGFzY19ib2FyZF90ICAgICpib2FyZHA7CisKKyAgICBBU0NfREJHKDEsICJhZHZhbnN5c19yZWxlYXNlOiBiZWdpblxuIik7CisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGZyZWVfaXJxKHNocC0+aXJxLCBib2FyZHApOworICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVsZWFzZTogZnJlZV9kbWEoKVxuIik7CisgICAgICAgIGZyZWVfZG1hKHNocC0+ZG1hX2NoYW5uZWwpOworICAgIH0KKyAgICByZWxlYXNlX3JlZ2lvbihzaHAtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7CisgICAgaWYgKEFTQ19XSURFX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgYWR2X3NnYmxrX3QgICAgKnNncCA9IE5VTEw7CisKKyAgICAgICAgaW91bm1hcChib2FyZHAtPmlvcmVtYXBfYWRkcik7CisgICAgICAgIGlmIChib2FyZHAtPm9yaWdfY2FycnApIHsKKyAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+b3JpZ19jYXJycCk7CisgICAgICAgICAgICBib2FyZHAtPm9yaWdfY2FycnAgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChib2FyZHAtPm9yaWdfcmVxcCkgeworICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5vcmlnX3JlcXApOworICAgICAgICAgICAgYm9hcmRwLT5vcmlnX3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKHNncCA9IGJvYXJkcC0+YWR2X3NnYmxrcCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwLT5uZXh0X3NnYmxrcDsKKyAgICAgICAgICAgIGtmcmVlKHNncCk7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICBBU0NfQVNTRVJUKGJvYXJkcC0+cHJ0YnVmICE9IE5VTEwpOworICAgIGtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX3JlbGVhc2U6IGVuZFxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhZHZhbnN5c19pbmZvKCkKKyAqCisgKiBSZXR1cm4gc3VpdGFibGUgZm9yIHByaW50aW5nIG9uIHRoZSBjb25zb2xlIHdpdGggdGhlIGFyZ3VtZW50CisgKiBhZGFwdGVyJ3MgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBUaGUgaW5mb3JtYXRpb24gbGluZSBzaG91bGQgbm90IGV4Y2VlZCBBU0NfSU5GT19TSVpFIGJ5dGVzLAorICogb3RoZXJ3aXNlIHRoZSBzdGF0aWMgJ2luZm8nIGFycmF5IHdpbGwgYmUgb3ZlcnJ1bi4KKyAqLworY29uc3QgY2hhciAqCithZHZhbnN5c19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCkKK3sKKyAgICBzdGF0aWMgY2hhciAgICAgaW5mb1tBU0NfSU5GT19TSVpFXTsKKyAgICBhc2NfYm9hcmRfdCAgICAgKmJvYXJkcDsKKyAgICBBU0NfRFZDX1ZBUiAgICAgKmFzY19kdmNfdmFycDsKKyAgICBBRFZfRFZDX1ZBUiAgICAgKmFkdl9kdmNfdmFycDsKKyAgICBjaGFyICAgICAgICAgICAgKmJ1c25hbWU7CisgICAgaW50ICAgICAgICAgICAgIGlvbGVuOworICAgIGNoYXIgICAgICAgICAgICAqd2lkZW5hbWUgPSBOVUxMOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW5mbzogYmVnaW5cbiIpOworICAgICAgICBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKyAgICAgICAgICAgIGlmICgoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0FQTlApID09IEFTQ19JU19JU0FQTlApIHsKKyAgICAgICAgICAgICAgICBidXNuYW1lID0gIklTQSBQblAiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidXNuYW1lID0gIklTQSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBEb24ndCByZWZlcmVuY2UgJ3NocC0+bl9pb19wb3J0JzsgSXQgbWF5IGJlIHRydW5jYXRlZC4gKi8KKyAgICAgICAgICAgIHNwcmludGYoaW5mbywKKyJBZHZhblN5cyBTQ1NJICVzOiAlczogSU8gMHglbFgtMHglbFgsIElSUSAweCVYLCBETUEgMHglWCIsCisgICAgICAgICAgICAgICAgQVNDX1ZFUlNJT04sIGJ1c25hbWUsCisgICAgICAgICAgICAgICAgKHVsb25nKSBzaHAtPmlvX3BvcnQsCisgICAgICAgICAgICAgICAgKHVsb25nKSBzaHAtPmlvX3BvcnQgKyBib2FyZHAtPmFzY19uX2lvX3BvcnQgLSAxLAorICAgICAgICAgICAgICAgIHNocC0+aXJxLCBzaHAtPmRtYV9jaGFubmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJWTCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfRUlTQSkgeworICAgICAgICAgICAgICAgIGJ1c25hbWUgPSAiRUlTQSI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfUENJKSB7CisgICAgICAgICAgICAgICAgaWYgKChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1BDSV9VTFRSQSkKKyAgICAgICAgICAgICAgICAgICAgPT0gQVNDX0lTX1BDSV9VTFRSQSkgeworICAgICAgICAgICAgICAgICAgICBidXNuYW1lID0gIlBDSSBVbHRyYSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJQQ0kiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICI/IjsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKCAiYWR2YW5zeXNfaW5mbzogYm9hcmQgJWQ6IHVua25vd24gYnVzIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+YnVzX3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRG9uJ3QgcmVmZXJlbmNlICdzaHAtPm5faW9fcG9ydCc7IEl0IG1heSBiZSB0cnVuY2F0ZWQuICovCisgICAgICAgICAgICBzcHJpbnRmKGluZm8sCisgICAgICAgICAgICAgICAgIkFkdmFuU3lzIFNDU0kgJXM6ICVzOiBJTyAweCVsWC0weCVsWCwgSVJRIDB4JVgiLAorICAgICAgICAgICAgICAgIEFTQ19WRVJTSU9OLCBidXNuYW1lLAorICAgICAgICAgICAgICAgICh1bG9uZykgc2hwLT5pb19wb3J0LAorICAgICAgICAgICAgICAgICh1bG9uZykgc2hwLT5pb19wb3J0ICsgYm9hcmRwLT5hc2Nfbl9pb19wb3J0IC0gMSwKKyAgICAgICAgICAgICAgICBzaHAtPmlycSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBXaWRlIEFkYXB0ZXIgSW5mb3JtYXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogTWVtb3J5LW1hcHBlZCBJL08gaXMgdXNlZCBpbnN0ZWFkIG9mIEkvTyBzcGFjZSB0byBhY2Nlc3MKKyAgICAgICAgICogdGhlIGFkYXB0ZXIsIGJ1dCBkaXNwbGF5IHRoZSBJL08gUG9ydCByYW5nZS4gVGhlIE1lbW9yeQorICAgICAgICAgKiBJL08gYWRkcmVzcyBpcyBkaXNwbGF5ZWQgdGhyb3VnaCB0aGUgZHJpdmVyIC9wcm9jIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBhZHZfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICAgICAgeworICAgICAgICAgICAgaW9sZW4gPSBBRFZfMzU1MF9JT0xFTjsKKyAgICAgICAgICAgIHdpZGVuYW1lID0gIlVsdHJhLVdpZGUiOworICAgICAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlvbGVuID0gQURWXzM4QzA4MDBfSU9MRU47CisgICAgICAgICAgICB3aWRlbmFtZSA9ICJVbHRyYTItV2lkZSI7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpb2xlbiA9IEFEVl8zOEMxNjAwX0lPTEVOOworICAgICAgICAgICAgd2lkZW5hbWUgPSAiVWx0cmEzLVdpZGUiOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoaW5mbywgIkFkdmFuU3lzIFNDU0kgJXM6IFBDSSAlczogUENJTUVNIDB4JWxYLTB4JWxYLCBJUlEgMHglWCIsCisgICAgICAgICAgICBBU0NfVkVSU0lPTiwKKyAgICAgICAgICAgIHdpZGVuYW1lLAorICAgICAgICAgICAgKHVsb25nKSBhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLAorICAgICAgICAgICAgKHVsb25nKSBhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlICsgaW9sZW4gLSAxLAorICAgICAgICAgICAgc2hwLT5pcnEpOworICAgIH0KKyAgICBBU0NfQVNTRVJUKHN0cmxlbihpbmZvKSA8IEFTQ19JTkZPX1NJWkUpOworICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2luZm86IGVuZFxuIik7CisgICAgcmV0dXJuIGluZm87Cit9CisKKy8qCisgKiBhZHZhbnN5c19xdWV1ZWNvbW1hbmQoKSAtIGludGVycnVwdC1kcml2ZW4gSS9PIGVudHJ5cG9pbnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAwLiBDb21tYW5kIHJldHVybiBzdGF0dXMgaXMgc2F2ZWQKKyAqIGluIHRoZSAnc2NwJyByZXN1bHQgZmllbGQuCisgKi8KK2ludAorYWR2YW5zeXNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOworICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKyAgICB1bG9uZyAgICAgICAgICAgICAgIGZsYWdzOworICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpkb25lX3NjcDsKKworICAgIHNocCA9IHNjcC0+ZGV2aWNlLT5ob3N0OworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKyAgICBBU0NfU1RBVFMoc2hwLCBxdWV1ZWNvbW1hbmQpOworCisgICAgLyogaG9zdF9sb2NrIHRha2VuIGJ5IG1pZC1sZXZlbCBwcmlvciB0byBjYWxsIGJ1dCBuZWVkIHRvIHByb3RlY3QgKi8KKyAgICAvKiBhZ2FpbnN0IG93biBJU1IgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKgorICAgICAqIEJsb2NrIG5ldyBjb21tYW5kcyB3aGlsZSBoYW5kbGluZyBhIHJlc2V0IG9yIGFib3J0IHJlcXVlc3QuCisgICAgICovCisgICAgaWYgKGJvYXJkcC0+ZmxhZ3MgJiBBU0NfSE9TVF9JTl9SRVNFVCkgeworICAgICAgICBBU0NfREJHMSgxLAorICAgICAgICAgICAgImFkdmFuc3lzX3F1ZXVlY29tbWFuZDogc2NwIDB4JWx4IGJsb2NrZWQgZm9yIHJlc2V0IHJlcXVlc3RcbiIsCisgICAgICAgICAgICAodWxvbmcpIHNjcCk7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9SRVNFVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWRkIGJsb2NrZWQgcmVxdWVzdHMgdG8gdGhlIGJvYXJkJ3MgJ2RvbmUnIHF1ZXVlLiBUaGUgcXVldWVkCisgICAgICAgICAqIHJlcXVlc3RzIHdpbGwgYmUgY29tcGxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIGFib3J0IG9yIHJlc2V0CisgICAgICAgICAqIGhhbmRsaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qCisgICAgICogQXR0ZW1wdCB0byBleGVjdXRlIGFueSB3YWl0aW5nIGNvbW1hbmRzIGZvciB0aGUgYm9hcmQuCisgICAgICovCisgICAgaWYgKCFBU0NfUVVFVUVfRU1QVFkoJmJvYXJkcC0+d2FpdGluZykpIHsKKyAgICAgICAgQVNDX0RCRygxLAorICAgICAgICAgICAgImFkdmFuc3lzX3F1ZXVlY29tbWFuZDogYmVmb3JlIGFzY19leGVjdXRlX3F1ZXVlKCkgd2FpdGluZ1xuIik7CisgICAgICAgIGFzY19leGVjdXRlX3F1ZXVlKCZib2FyZHAtPndhaXRpbmcpOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBMaW51eCBtaWQtbGV2ZWwgJ2RvbmUnIGZ1bmN0aW9uCisgICAgICogYW5kIGF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC4KKyAgICAgKgorICAgICAqIElmIEFTQ19OT0VSUk9SIGlzIHJldHVybmVkIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorICAgICAqIGJvYXJkJ3MgJ2FjdGl2ZScgcXVldWUgYW5kIHdpbGwgYmUgY29tcGxldGVkIGJ5IHRoZSBpbnRlcnJ1cHQKKyAgICAgKiBoYW5kbGVyLgorICAgICAqCisgICAgICogSWYgQVNDX0JVU1kgaXMgcmV0dXJuZWQgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZSBib2FyZCdzIHBlcgorICAgICAqIHRhcmdldCB3YWl0aW5nIGxpc3QuIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHJlcXVlc3QgaGFzCisgICAgICogYmVlbiB0cmllZC4gQWRkIGl0IHRvIHRoZSBiYWNrIG9mIHRoZSB3YWl0aW5nIGxpc3QuIEl0IHdpbGwgYmUKKyAgICAgKiByZXRyaWVkIGxhdGVyLgorICAgICAqCisgICAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZSByZXF1ZXN0IHdpbGwgaGF2ZSBiZWVuIHBsYWNlZCBvbiB0aGUKKyAgICAgKiBib2FyZCdzICdkb25lJyBxdWV1ZSBhbmQgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIHJldHVybmluZy4KKyAgICAgKi8KKyAgICBzY3AtPnNjc2lfZG9uZSA9IGRvbmU7CisgICAgc3dpdGNoIChhc2NfZXhlY3V0ZV9zY3NpX2NtbmQoc2NwKSkgeworICAgIGNhc2UgQVNDX05PRVJST1I6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVNDX0JVU1k6CisgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPndhaXRpbmcsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFTQ19FUlJPUjoKKyAgICBkZWZhdWx0OgorICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+ZG9uZSwgTlVMTCwgQVNDX1RJRF9BTEwpOworICAgICAgICAvKiBJbnRlcnJ1cHRzIGNvdWxkIGJlIGVuYWJsZWQgaGVyZS4gKi8KKyAgICAgICAgYXNjX3Njc2lfZG9uZV9saXN0KGRvbmVfc2NwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhZHZhbnN5c19yZXNldCgpCisgKgorICogUmVzZXQgdGhlIGJ1cyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQgJ3NjcCcuCisgKgorICogVGhpcyBmdW5jdGlvbiBydW5zIGl0cyBvd24gdGhyZWFkLiBJbnRlcnJ1cHRzIG11c3QgYmUgYmxvY2tlZCBidXQKKyAqIHNsZWVwaW5nIGlzIGFsbG93ZWQgYW5kIG5vIGxvY2tpbmcgb3RoZXIgdGhhbiBmb3IgaG9zdCBzdHJ1Y3R1cmVzIGlzCisgKiByZXF1aXJlZC4gUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxFRC4KKyAqLworaW50CithZHZhbnN5c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAgKnNocDsKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICAqYm9hcmRwOworICAgIEFTQ19EVkNfVkFSICAgICAgICAgICphc2NfZHZjX3ZhcnA7CisgICAgQURWX0RWQ19WQVIgICAgICAgICAgKmFkdl9kdmNfdmFycDsKKyAgICB1bG9uZyAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgICAgKmRvbmVfc2NwID0gTlVMTCwgKmxhc3Rfc2NwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgICAgKnRzY3AsICpuZXdfbGFzdF9zY3A7CisgICAgaW50ICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGludCAgICAgICAgICAgICAgICAgIHJldCA9IFNVQ0NFU1M7CisKKyAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcmVzZXQ6IDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgIGlmIChzY3AtPmRldmljZS0+aG9zdCAhPSBOVUxMKSB7CisgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgcmVzZXQpOworICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCisgICAgaWYgKChzaHAgPSBzY3AtPmRldmljZS0+aG9zdCkgPT0gTlVMTCkgeworICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICByZXR1cm4gRkFJTEVEOworICAgIH0KKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKworICAgIEFTQ19QUklOVDEoImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgc3RhcnRlZC4uLlxuIiwKKyAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgcmUtZW50cmFuY3kuCisgICAgICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOworICAgIGlmIChib2FyZHAtPmZsYWdzICYgQVNDX0hPU1RfSU5fUkVTRVQpIHsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICB9CisgICAgYm9hcmRwLT5mbGFncyB8PSBBU0NfSE9TVF9JTl9SRVNFVDsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTmFycm93IEJvYXJkCisgICAgICAgICAqLworICAgICAgICBhc2NfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlc2V0IHRoZSBjaGlwIGFuZCBTQ1NJIGJ1cy4KKyAgICAgICAgICovCisgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX3Jlc2V0OiBiZWZvcmUgQXNjSW5pdEFzYzEwMDBEcml2ZXIoKVxuIik7CisgICAgICAgIHN0YXR1cyA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmNfdmFycCk7CisKKyAgICAgICAgLyogUmVmZXIgdG8gQVNDX0lFUlJfKiBkZWZpbnRpb25zIGZvciBtZWFuaW5nIG9mICdlcnJfY29kZScuICovCisgICAgICAgIGlmIChhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKSB7CisgICAgICAgICAgICBBU0NfUFJJTlQyKAorICAgICAgICAgICAgICAgICJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IGVycm9yOiAweCV4XG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOworICAgICAgICAgICAgcmV0ID0gRkFJTEVEOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgQVNDX1BSSU5UMigKKyAgICAgICAgICAgICAgICAiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCB3YXJuaW5nOiAweCV4XG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIHN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU0NfUFJJTlQxKAorICAgICAgICAgICAgICAgICJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IHN1Y2Nlc3NmdWwuXG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICB9CisKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVzZXQ6IGFmdGVyIEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFdpZGUgQm9hcmQKKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIHN1Z2dlc3QgcmVzZXQgYnVzIGZsYWdzIGFyZSBzZXQsIHRoZW4gcmVzZXQgdGhlIGJ1cy4KKyAgICAgICAgICogT3RoZXJ3aXNlIG9ubHkgcmVzZXQgdGhlIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgdGhlIHRhcmdldCdzIFNDU0kgYnVzLgorICAgICAgICAgKi8KKyAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVzZXQ6IGJlZm9yZSBBZHZSZXNldENoaXBBbmRTQigpXG4iKTsKKyAgICAgICAgc3dpdGNoIChBZHZSZXNldENoaXBBbmRTQihhZHZfZHZjX3ZhcnApKSB7CisgICAgICAgIGNhc2UgQVNDX1RSVUU6CisgICAgICAgICAgICBBU0NfUFJJTlQxKCJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IHN1Y2Nlc3NmdWwuXG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNDX0ZBTFNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNDX1BSSU5UMSgiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCBlcnJvci5cbiIsCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7CisgICAgICAgICAgICByZXQgPSBGQUlMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgKHZvaWQpIEFkdklTUihhZHZfZHZjX3ZhcnApOworICAgIH0KKyAgICAvKiBCb2FyZCBsb2NrIGlzIGhlbGQuICovCisKKyAgICAvKgorICAgICAqIERlcXVldWUgYWxsIGJvYXJkICdkb25lJyByZXF1ZXN0cy4gQSBwb2ludGVyIHRvIHRoZSBsYXN0IHJlcXVlc3QKKyAgICAgKiBpcyByZXR1cm5lZCBpbiAnbGFzdF9zY3AnLgorICAgICAqLworICAgIGRvbmVfc2NwID0gYXNjX2RlcXVldWVfbGlzdCgmYm9hcmRwLT5kb25lLCAmbGFzdF9zY3AsIEFTQ19USURfQUxMKTsKKworICAgIC8qCisgICAgICogRGVxdWV1ZSBhbGwgYm9hcmQgJ2FjdGl2ZScgcmVxdWVzdHMgZm9yIGFsbCBkZXZpY2VzIGFuZCBzZXQKKyAgICAgKiB0aGUgcmVxdWVzdCBzdGF0dXMgdG8gRElEX1JFU0VULiBBIHBvaW50ZXIgdG8gdGhlIGxhc3QgcmVxdWVzdAorICAgICAqIGlzIHJldHVybmVkIGluICdsYXN0X3NjcCcuCisgICAgICovCisgICAgaWYgKGRvbmVfc2NwID09IE5VTEwpIHsKKyAgICAgICAgZG9uZV9zY3AgPSBhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmFjdGl2ZSwgJmxhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgIGZvciAodHNjcCA9IGRvbmVfc2NwOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKyAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQXBwZW5kIHRvICdkb25lX3NjcCcgYXQgdGhlIGVuZCB3aXRoICdsYXN0X3NjcCcuICovCisgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisgICAgICAgIGxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KAorCQkJJmJvYXJkcC0+YWN0aXZlLCAmbmV3X2xhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgIGlmIChuZXdfbGFzdF9zY3AgIT0gTlVMTCkgeworICAgICAgICAgICAgQVNDX0FTU0VSVChSRVFQTkVYVChsYXN0X3NjcCkgIT0gTlVMTCk7CisgICAgICAgICAgICBmb3IgKHRzY3AgPSBSRVFQTkVYVChsYXN0X3NjcCk7IHRzY3A7IHRzY3AgPSBSRVFQTkVYVCh0c2NwKSkgeworICAgICAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9zY3AgPSBuZXdfbGFzdF9zY3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIERlcXVldWUgYWxsICd3YWl0aW5nJyByZXF1ZXN0cyBhbmQgc2V0IHRoZSByZXF1ZXN0IHN0YXR1cworICAgICAqIHRvIERJRF9SRVNFVC4KKyAgICAgKi8KKyAgICBpZiAoZG9uZV9zY3AgPT0gTlVMTCkgeworICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+d2FpdGluZywgJmxhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgIGZvciAodHNjcCA9IGRvbmVfc2NwOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKyAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQXBwZW5kIHRvICdkb25lX3NjcCcgYXQgdGhlIGVuZCB3aXRoICdsYXN0X3NjcCcuICovCisgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisgICAgICAgIGxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KAorCQkJJmJvYXJkcC0+d2FpdGluZywgJm5ld19sYXN0X3NjcCwgQVNDX1RJRF9BTEwpOworICAgICAgICBpZiAobmV3X2xhc3Rfc2NwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOworICAgICAgICAgICAgZm9yICh0c2NwID0gUkVRUE5FWFQobGFzdF9zY3ApOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKyAgICAgICAgICAgICAgICB0c2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX1JFU0VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3Rfc2NwID0gbmV3X2xhc3Rfc2NwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgdGltZSBvZiB0aGUgbW9zdCByZWNlbnRseSBjb21wbGV0ZWQgcmVzZXQuICovCisgICAgYm9hcmRwLT5sYXN0X3Jlc2V0ID0gamlmZmllczsKKworICAgIC8qIENsZWFyIHJlc2V0IGZsYWcuICovCisgICAgYm9hcmRwLT5mbGFncyAmPSB+QVNDX0hPU1RfSU5fUkVTRVQ7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKgorICAgICAqIENvbXBsZXRlIGFsbCB0aGUgJ2RvbmVfc2NwJyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBpZiAoZG9uZV9zY3AgIT0gTlVMTCkgeworICAgICAgICBhc2Nfc2NzaV9kb25lX2xpc3QoZG9uZV9zY3ApOworICAgIH0KKworICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19yZXNldDogcmV0ICVkXG4iLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFkdmFuc3lzX2Jpb3NwYXJhbSgpCisgKgorICogVHJhbnNsYXRlIGRpc2sgZHJpdmUgZ2VvbWV0cnkgaWYgdGhlICJCSU9TIGdyZWF0ZXIgdGhhbiAxIEdCIgorICogc3VwcG9ydCBpcyBlbmFibGVkIGZvciBhIGRyaXZlLgorICoKKyAqIGlwIChpbmZvcm1hdGlvbiBwb2ludGVyKSBpcyBhbiBpbnQgYXJyYXkgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb246CisgKiBpcFswXTogaGVhZHMKKyAqIGlwWzFdOiBzZWN0b3JzCisgKiBpcFsyXTogY3lsaW5kZXJzCisgKi8KK2ludAorYWR2YW5zeXNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQoreworICAgIGFzY19ib2FyZF90ICAgICAqYm9hcmRwOworCisgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfYmlvc3BhcmFtOiBiZWdpblxuIik7CisgICAgQVNDX1NUQVRTKHNkZXYtPmhvc3QsIGJpb3NwYXJhbSk7CisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzZGV2LT5ob3N0KTsKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIGlmICgoYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyLmR2Y19jbnRsICYKKyAgICAgICAgICAgICBBU0NfQ05UTF9CSU9TX0dUXzFHQikgJiYgY2FwYWNpdHkgPiAweDIwMDAwMCkgeworICAgICAgICAgICAgICAgIGlwWzBdID0gMjU1OworICAgICAgICAgICAgICAgIGlwWzFdID0gNjM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXBbMF0gPSA2NDsKKyAgICAgICAgICAgICAgICBpcFsxXSA9IDMyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuYmlvc19jdHJsICYKKyAgICAgICAgICAgICBCSU9TX0NUUkxfRVhURU5ERURfWExBVCkgJiYgY2FwYWNpdHkgPiAweDIwMDAwMCkgeworICAgICAgICAgICAgICAgIGlwWzBdID0gMjU1OworICAgICAgICAgICAgICAgIGlwWzFdID0gNjM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXBbMF0gPSA2NDsKKyAgICAgICAgICAgICAgICBpcFsxXSA9IDMyOworICAgICAgICB9CisgICAgfQorICAgIGlwWzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoaXBbMF0gKiBpcFsxXSk7CisgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfYmlvc3BhcmFtOiBlbmRcbiIpOworICAgIHJldHVybiAwOworfQorCisvKgorICogYWR2YW5zeXNfc2V0dXAoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaW5pdC9tYWluLmMgYXQgYm9vdCB0aW1lLgorICogSXQgaXQgcGFzc2VkIExJTE8gcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgZnJvbSB0aGUKKyAqIExJTE8gY29tbWFuZCBsaW5lIG9yIGluIC9ldGMvbGlsby5jb25mLgorICoKKyAqIEl0IGlzIHVzZWQgYnkgdGhlIEFkdmFuU3lzIGRyaXZlciB0byBlaXRoZXIgZGlzYWJsZSBJL08KKyAqIHBvcnQgc2Nhbm5pbmcgb3IgdG8gbGltaXQgc2Nhbm5pbmcgdG8gMSAtIDQgSS9PIHBvcnRzLgorICogUmVnYXJkbGVzcyBvZiB0aGUgb3B0aW9uIHNldHRpbmcgRUlTQSBhbmQgUENJIGJvYXJkcworICogd2lsbCBzdGlsbCBiZSBzZWFyY2hlZCBmb3IgYW5kIGRldGVjdGVkLiBUaGlzIG9wdGlvbgorICogb25seSBhZmZlY3RzIHNlYXJjaGluZyBmb3IgSVNBIGFuZCBWTCBib2FyZHMuCisgKgorICogSWYgQURWQU5TWVNfREVCVUcgaXMgZGVmaW5lZCB0aGUgZHJpdmVyIGRlYnVnIGxldmVsIG1heQorICogYmUgc2V0IHVzaW5nIHRoZSA1dGggKEFTQ19OVU1fSU9QT1JUX1BST0JFICsgMSkgSS9PIFBvcnQuCisgKgorICogRXhhbXBsZXM6CisgKiAxLiBFbGltaW5hdGUgSS9PIHBvcnQgc2Nhbm5pbmc6CisgKiAgICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPQorICogICAgICAgb3IKKyAqICAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgwCisgKiAyLiBMaW1pdCBJL08gcG9ydCBzY2FubmluZyB0byBvbmUgSS9PIHBvcnQ6CisgKiAgICAgICAgYm9vdDogbGludXggYWR2YW5zeXM9MHgxMTAKKyAqIDMuIExpbWl0IEkvTyBwb3J0IHNjYW5uaW5nIHRvIGZvdXIgSS9PIHBvcnRzOgorICogICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPTB4MTEwLDB4MjEwLDB4MjMwLDB4MzMwCisgKiA0LiBJZiBBRFZBTlNZU19ERUJVRywgbGltaXQgSS9PIHBvcnQgc2Nhbm5pbmcgdG8gZm91ciBJL08gcG9ydHMgYW5kCisgKiAgICBzZXQgdGhlIGRyaXZlciBkZWJ1ZyBsZXZlbCB0byAyLgorICogICAgICAgIGJvb3Q6IGxpbnV4IGFkdmFuc3lzPTB4MTEwLDB4MjEwLDB4MjMwLDB4MzMwLDB4ZGViMgorICoKKyAqIGludHNbMF0gLSBudW1iZXIgb2YgYXJndW1lbnRzCisgKiBpbnRzWzFdIC0gZmlyc3QgYXJndW1lbnQKKyAqIGludHNbMl0gLSBzZWNvbmQgYXJndW1lbnQKKyAqIC4uLgorICovCit2b2lkIF9faW5pdAorYWR2YW5zeXNfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisgICAgaW50ICAgIGk7CisKKyAgICBpZiAoYXNjX2lvcGZsYWcgPT0gQVNDX1RSVUUpIHsKKyAgICAgICAgcHJpbnRrKCJBZHZhblN5cyBTQ1NJOiAnYWR2YW5zeXMnIExJTE8gb3B0aW9uIG1heSBhcHBlYXIgb25seSBvbmNlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFzY19pb3BmbGFnID0gQVNDX1RSVUU7CisKKyAgICBpZiAoaW50c1swXSA+IEFTQ19OVU1fSU9QT1JUX1BST0JFKSB7CisjaWZkZWYgQURWQU5TWVNfREVCVUcKKyAgICAgICAgaWYgKChpbnRzWzBdID09IEFTQ19OVU1fSU9QT1JUX1BST0JFICsgMSkgJiYKKyAgICAgICAgICAgIChpbnRzW0FTQ19OVU1fSU9QT1JUX1BST0JFICsgMV0gPj4gNCA9PSAweGRlYikpIHsKKyAgICAgICAgICAgIGFzY19kYmdsdmwgPSBpbnRzW0FTQ19OVU1fSU9QT1JUX1BST0JFICsgMV0gJiAweGY7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogQURWQU5TWVNfREVCVUcgKi8KKyAgICAgICAgICAgIHByaW50aygiQWR2YW5TeXMgU0NTSTogb25seSAlZCBJL08gcG9ydHMgYWNjZXB0ZWRcbiIsCisgICAgICAgICAgICAgICAgQVNDX05VTV9JT1BPUlRfUFJPQkUpOworI2lmZGVmIEFEVkFOU1lTX0RFQlVHCisgICAgICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19ERUJVRyAqLworICAgIH0KKworI2lmZGVmIEFEVkFOU1lTX0RFQlVHCisgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3NldHVwOiBpbnRzWzBdICVkXG4iLCBpbnRzWzBdKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgaW50c1swXTsgaSsrKSB7CisgICAgICAgIEFTQ19EQkcyKDEsICIgaW50c1slZF0gMHgleCIsIGksIGludHNbaV0pOworICAgIH0KKyAgICBBU0NfREJHKDEsICJcbiIpOworI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKyAgICBmb3IgKGkgPSAxOyBpIDw9IGludHNbMF0gJiYgaSA8PSBBU0NfTlVNX0lPUE9SVF9QUk9CRTsgaSsrKSB7CisgICAgICAgIGFzY19pb3BvcnRbaS0xXSA9IGludHNbaV07CisgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19zZXR1cDogYXNjX2lvcG9ydFslZF0gMHgleFxuIiwKKyAgICAgICAgICAgIGkgLSAxLCBhc2NfaW9wb3J0W2ktMV0pOworICAgIH0KK30KKworCisvKgorICogLS0tIExvYWRhYmxlIERyaXZlciBTdXBwb3J0CisgKi8KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworICAgIC5wcm9jX25hbWUgICAgICAgICAgICAgICAgICA9ICJhZHZhbnN5cyIsCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICAucHJvY19pbmZvICAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19wcm9jX2luZm8sCisjZW5kaWYKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICAgICAgPSAiYWR2YW5zeXMiLAorICAgIC5kZXRlY3QgICAgICAgICAgICAgICAgICAgICA9IGFkdmFuc3lzX2RldGVjdCwgCisgICAgLnJlbGVhc2UgICAgICAgICAgICAgICAgICAgID0gYWR2YW5zeXNfcmVsZWFzZSwKKyAgICAuaW5mbyAgICAgICAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19pbmZvLAorICAgIC5xdWV1ZWNvbW1hbmQgICAgICAgICAgICAgICA9IGFkdmFuc3lzX3F1ZXVlY29tbWFuZCwKKyAgICAuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhZHZhbnN5c19yZXNldCwKKyAgICAuYmlvc19wYXJhbSAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19iaW9zcGFyYW0sCisgICAgLnNsYXZlX2NvbmZpZ3VyZQkJPSBhZHZhbnN5c19zbGF2ZV9jb25maWd1cmUsCisgICAgLyoKKyAgICAgKiBCZWNhdXNlIHRoZSBkcml2ZXIgbWF5IGNvbnRyb2wgYW4gSVNBIGFkYXB0ZXIgJ3VuY2hlY2tlZF9pc2FfZG1hJworICAgICAqIG11c3QgYmUgc2V0LiBUaGUgZmxhZyB3aWxsIGJlIGNsZWFyZWQgaW4gYWR2YW5zeXNfZGV0ZWN0IGZvciBub24tSVNBCisgICAgICogYWRhcHRlcnMuIFJlZmVyIHRvIHRoZSBjb21tZW50IGluIHNjc2lfbW9kdWxlLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgLnVuY2hlY2tlZF9pc2FfZG1hICAgICAgICAgID0gMSwKKyAgICAvKgorICAgICAqIEFsbCBhZGFwdGVycyBjb250cm9sbGVkIGJ5IHRoaXMgZHJpdmVyIGFyZSBjYXBhYmxlIG9mIGxhcmdlCisgICAgICogc2NhdHRlci1nYXRoZXIgbGlzdHMuIEFjY29yZGluZyB0byB0aGUgbWlkLWxldmVsIFNDU0kgZG9jdW1lbnRhdGlvbgorICAgICAqIHRoaXMgb2J2aWF0ZXMgYW55IHBlcmZvcm1hbmNlIGdhaW4gcHJvdmlkZWQgYnkgc2V0dGluZworICAgICAqICd1c2VfY2x1c3RlcmluZycuIEJ1dCBlbXBpcmljYWxseSB3aGlsZSBDUFUgdXRpbGl6YXRpb24gaXMgaW5jcmVhc2VkCisgICAgICogYnkgZW5hYmxpbmcgY2x1c3RlcmluZywgSS9PIHRocm91Z2hwdXQgaW5jcmVhc2VzIGFzIHdlbGwuCisgICAgICovCisgICAgLnVzZV9jbHVzdGVyaW5nICAgICAgICAgICAgID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKworLyoKKyAqIC0tLSBNaXNjZWxsYW5lb3VzIERyaXZlciBGdW5jdGlvbnMKKyAqLworCisvKgorICogRmlyc3QtbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogJ2Rldl9pZCcgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcnJ1cHRpbmcgYWRhcHRlcidzIGFzY19ib2FyZF90LiBCZWNhdXNlCisgKiBhbGwgYm9hcmRzIGFyZSBjdXJyZW50bHkgY2hlY2tlZCBmb3IgaW50ZXJydXB0cyBvbiBlYWNoIGludGVycnVwdCwgJ2Rldl9pZCcKKyAqIGlzIG5vdCByZWZlcmVuY2VkLiAnZGV2X2lkJyBjb3VsZCBiZSB1c2VkIHRvIGlkZW50aWZ5IGFuIGludGVycnVwdCBwYXNzZWQKKyAqIHRvIHRoZSBBZHZhblN5cyBkcml2ZXIgd2hpY2ggaXMgZm9yIGEgZGV2aWNlIHNoYXJpbmcgYW4gaW50ZXJydXB0IHdpdGgKKyAqIGFuIEFkdmFuU3lzIGFkYXB0ZXIuCisgKi8KK1NUQVRJQyBpcnFyZXR1cm5fdAorYWR2YW5zeXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgdWxvbmcgICAgICAgICAgIGZsYWdzOworICAgIGludCAgICAgICAgICAgICBpOworICAgIGFzY19ib2FyZF90ICAgICAqYm9hcmRwOworICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgKmRvbmVfc2NwID0gTlVMTCwgKmxhc3Rfc2NwID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICpuZXdfbGFzdF9zY3A7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqc2hwOworCisgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWdpblxuIik7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBpbnRlcnJ1cHRzIG9uIGFsbCBib2FyZHMuCisgICAgICogQXNjSVNSKCkgd2lsbCBjYWxsIGFzY19pc3JfY2FsbGJhY2soKS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNjX2JvYXJkX2NvdW50OyBpKyspIHsKKwlzaHAgPSBhc2NfaG9zdFtpXTsKKyAgICAgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgICAgICBBU0NfREJHMigyLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBpICVkLCBib2FyZHAgMHglbHhcbiIsCisgICAgICAgICAgICBpLCAodWxvbmcpIGJvYXJkcCk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE5hcnJvdyBCb2FyZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQXNjSXNJbnRQZW5kaW5nKHNocC0+aW9fcG9ydCkpIHsKKyAgICAgICAgICAgICAgICBBU0NfU1RBVFMoc2hwLCBpbnRlcnJ1cHQpOworICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2ludGVycnVwdDogYmVmb3JlIEFzY0lTUigpXG4iKTsKKyAgICAgICAgICAgICAgICBBc2NJU1IoJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2lkZSBCb2FyZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGJlZm9yZSBBZHZJU1IoKVxuIik7CisgICAgICAgICAgICBpZiAoQWR2SVNSKCZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIpKSB7CisgICAgICAgICAgICAgICAgQVNDX1NUQVRTKHNocCwgaW50ZXJydXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN0YXJ0IHdhaXRpbmcgcmVxdWVzdHMgYW5kIGNyZWF0ZSBhIGxpc3Qgb2YgY29tcGxldGVkIHJlcXVlc3RzLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIHJlc2V0IHJlcXVlc3QgaXMgYmVpbmcgcGVyZm9ybWVkIGZvciB0aGUgYm9hcmQsIHRoZSByZXNldAorICAgICAgICAgKiBoYW5kbGVyIHdpbGwgY29tcGxldGUgcGVuZGluZyByZXF1ZXN0cyBhZnRlciBpdCBoYXMgY29tcGxldGVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChib2FyZHAtPmZsYWdzICYgQVNDX0hPU1RfSU5fUkVTRVQpID09IDApIHsKKyAgICAgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGRvbmVfc2NwIDB4JWx4LCBsYXN0X3NjcCAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAodWxvbmcpIGRvbmVfc2NwLCAodWxvbmcpIGxhc3Rfc2NwKTsKKworICAgICAgICAgICAgLyogU3RhcnQgYW55IHdhaXRpbmcgY29tbWFuZHMgZm9yIHRoZSBib2FyZC4gKi8KKyAgICAgICAgICAgIGlmICghQVNDX1FVRVVFX0VNUFRZKCZib2FyZHAtPndhaXRpbmcpKSB7CisgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWZvcmUgYXNjX2V4ZWN1dGVfcXVldWUoKVxuIik7CisgICAgICAgICAgICAgICAgYXNjX2V4ZWN1dGVfcXVldWUoJmJvYXJkcC0+d2FpdGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiByZXF1ZXN0cyB0aGF0IG11c3QgYmUgY29tcGxldGVkLgorICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICogJ2RvbmVfc2NwJyB3aWxsIGFsd2F5cyBiZSBOVUxMIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24KKyAgICAgICAgICAgICAgKiBvZiB0aGlzIGxvb3AuICdsYXN0X3NjcCcgaXMgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMKKyAgICAgICAgICAgICAgKiAnZG9uZV9zY3AnLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGRvbmVfc2NwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+ZG9uZSwgJmxhc3Rfc2NwLAorICAgICAgICAgICAgICAgICAgICBBU0NfVElEX0FMTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbGFzdF9zY3AtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWFzY19kZXF1ZXVlX2xpc3QoCisJCQkmYm9hcmRwLT5kb25lLCAmbmV3X2xhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld19sYXN0X3NjcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBsYXN0X3NjcCA9IG5ld19sYXN0X3NjcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCBvbiBlbnRyeSwgdGhlbiB0aGV5CisgICAgICogYXJlIG5vdyBlbmFibGVkIGhlcmUuCisgICAgICoKKyAgICAgKiBDb21wbGV0ZSBhbGwgcmVxdWVzdHMgb24gdGhlIGRvbmUgbGlzdC4KKyAgICAgKi8KKworICAgIGFzY19zY3NpX2RvbmVfbGlzdChkb25lX3NjcCk7CisKKyAgICBBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGVuZFxuIik7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogU2V0IHRoZSBudW1iZXIgb2YgY29tbWFuZHMgdG8gcXVldWUgcGVyIGRldmljZSBmb3IgdGhlCisgKiBzcGVjaWZpZWQgaG9zdCBhZGFwdGVyLgorICovCitTVEFUSUMgaW50CithZHZhbnN5c19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICpib2FyZHA7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKGRldmljZS0+aG9zdCk7CisgICAgYm9hcmRwLT5mbGFncyB8PSBBU0NfU0VMRUNUX1FVRVVFX0RFUFRIUzsKKyAgICAvKgorICAgICAqIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYW5kIHNldCBpdHMgaW5pdGlhbC9tYXhpbXVtCisgICAgICogcXVldWUgZGVwdGguICBPbmx5IHNhdmUgdGhlIHBvaW50ZXIgZm9yIGEgbHVuMCBkZXYgdGhvdWdoLgorICAgICAqLworICAgIGlmKGRldmljZS0+bHVuID09IDApCisgICAgICAgIGJvYXJkcC0+ZGV2aWNlW2RldmljZS0+aWRdID0gZGV2aWNlOworICAgIGlmKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhci5tYXhfZHZjX3FuZ1tkZXZpY2UtPmlkXSk7CisgICAgICAgIH0gZWxzZSB7CisJICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3Zhci5tYXhfZHZjX3FuZyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgMCwgZGV2aWNlLT5ob3N0LT5jbWRfcGVyX2x1bik7CisgICAgfQorICAgIEFTQ19EQkc0KDEsICJhZHZhbnN5c19zbGF2ZV9jb25maWd1cmU6IGRldmljZSAweCVseCwgYm9hcmRwIDB4JWx4LCBpZCAlZCwgZGVwdGggJWRcbiIsCisgICAgICAgICAgICAodWxvbmcpIGRldmljZSwgKHVsb25nKSBib2FyZHAsIGRldmljZS0+aWQsIGRldmljZS0+cXVldWVfZGVwdGgpOworICAgIHJldHVybiAwOworfQorCisvKgorICogQ29tcGxldGUgYWxsIHJlcXVlc3RzIG9uIHRoZSBzaW5nbHkgbGlua2VkIGxpc3QgcG9pbnRlZAorICogdG8gYnkgJ3NjcCcuCisgKgorICogSW50ZXJydXB0cyBjYW4gYmUgZW5hYmxlZCBvbiBlbnRyeS4KKyAqLworU1RBVElDIHZvaWQKK2FzY19zY3NpX2RvbmVfbGlzdChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisgICAgc3RydWN0IHNjc2lfY21uZCAgICAqdHNjcDsKKworICAgIEFTQ19EQkcoMiwgImFzY19zY3NpX2RvbmVfbGlzdDogYmVnaW5cbiIpOworICAgIHdoaWxlIChzY3AgIT0gTlVMTCkgeworCWFzY19ib2FyZF90ICpib2FyZHA7CisJc3RydWN0IGRldmljZSAqZGV2OworCisgICAgICAgIEFTQ19EQkcxKDMsICJhc2Nfc2NzaV9kb25lX2xpc3Q6IHNjcCAweCVseFxuIiwgKHVsb25nKSBzY3ApOworICAgICAgICB0c2NwID0gUkVRUE5FWFQoc2NwKTsKKyAgICAgICAgc2NwLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2NwLT5kZXZpY2UtPmhvc3QpOworCisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkKKwkgICAgZGV2ID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmRldjsKKwllbHNlCisJICAgIGRldiA9IGJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZy5kZXY7CisKKwlpZiAoc2NwLT51c2Vfc2cpCisJICAgIGRtYV91bm1hcF9zZyhkZXYsIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwllbHNlIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikKKwkgICAgZG1hX3VubWFwX3NpbmdsZShkZXYsIHNjcC0+U0NwLmRtYV9oYW5kbGUsCisJCQkgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGRvbmUpOworICAgICAgICBBU0NfQVNTRVJUKHNjcC0+c2NzaV9kb25lICE9IE5VTEwpOworCisgICAgICAgIHNjcC0+c2NzaV9kb25lKHNjcCk7CisKKyAgICAgICAgc2NwID0gdHNjcDsKKyAgICB9CisgICAgQVNDX0RCRygyLCAiYXNjX3Njc2lfZG9uZV9saXN0OiBkb25lXG4iKTsKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBFeGVjdXRlIGEgc2luZ2xlICdTY3NpX0NtbmQnLgorICoKKyAqIFRoZSBmdW5jdGlvbiAnZG9uZScgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLgorICoKKyAqIFNjc2lfQ21uZDoKKyAqCisgKiAgaG9zdCAtIGJvYXJkIGNvbnRyb2xsaW5nIGRldmljZQorICogIGRldmljZSAtIGRldmljZSB0byBzZW5kIGNvbW1hbmQKKyAqICB0YXJnZXQgLSB0YXJnZXQgb2YgZGV2aWNlCisgKiAgbHVuIC0gbHVuIG9mIGRldmljZQorICogIGNtZF9sZW4gLSBsZW5ndGggb2YgU0NTSSBDREIKKyAqICBjbW5kIC0gYnVmZmVyIGZvciBTQ1NJIDgsIDEwLCBvciAxMiBieXRlIENEQgorICogIHVzZV9zZyAtIGlmIG5vbi16ZXJvIGluZGljYXRlcyBzY2F0dGVyLWdhdGhlciByZXF1ZXN0IHdpdGggdXNlX3NnIGVsZW1lbnRzCisgKgorICogIGlmICh1c2Vfc2cgPT0gMCkgeworICogICAgcmVxdWVzdF9idWZmZXIgLSBidWZmZXIgYWRkcmVzcyBmb3IgcmVxdWVzdAorICogICAgcmVxdWVzdF9idWZmbGVuIC0gbGVuZ3RoIG9mIHJlcXVlc3QgYnVmZmVyCisgKiAgfSBlbHNlIHsKKyAqICAgIHJlcXVlc3RfYnVmZmVyIC0gcG9pbnRlciB0byBzY2F0dGVybGlzdCBzdHJ1Y3R1cmUKKyAqICB9CisgKgorICogIHNlbnNlX2J1ZmZlciAtIHNlbnNlIGNvbW1hbmQgYnVmZmVyCisgKgorICogIHJlc3VsdCAoNCBieXRlcyBvZiBhbiBpbnQpOgorICogICAgQnl0ZSBNZWFuaW5nCisgKiAgICAwIFNDU0kgU3RhdHVzIEJ5dGUgQ29kZQorICogICAgMSBTQ1NJIE9uZSBCeXRlIE1lc3NhZ2UgQ29kZQorICogICAgMiBIb3N0IEVycm9yIENvZGUKKyAqICAgIDMgTWlkLUxldmVsIEVycm9yIENvZGUKKyAqCisgKiAgaG9zdCBkcml2ZXIgZmllbGRzOgorICogICAgU0NwIC0gU2NzaV9Qb2ludGVyIHVzZWQgZm9yIGNvbW1hbmQgcHJvY2Vzc2luZyBzdGF0dXMKKyAqICAgIHNjc2lfZG9uZSAtIHVzZWQgdG8gc2F2ZSBjYWxsZXIncyBkb25lIGZ1bmN0aW9uCisgKiAgICBob3N0X3NjcmliYmxlIC0gdXNlZCBmb3IgcG9pbnRlciB0byBhbm90aGVyIHN0cnVjdCBzY3NpX2NtbmQKKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgQVNDX05PRVJST1IgdGhlIHJlcXVlc3QgaGFzIGJlZW4gZW5xdWV1ZWQKKyAqIG9uIHRoZSBib2FyZCdzICdhY3RpdmUnIHF1ZXVlIGFuZCB3aWxsIGJlIGNvbXBsZXRlZCBmcm9tIHRoZQorICogaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIEFTQ19OT0VSUk9SIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGVucXVldWVkCisgKiBvbiB0aGUgYm9hcmQncyAnZG9uZScgcXVldWUgYW5kIG11c3QgYmUgY29tcGxldGVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogSWYgQVNDX0JVU1kgaXMgcmV0dXJuZWQgdGhlIHJlcXVlc3Qgd2lsbCBiZSBlbnF1ZXVlZCBieSB0aGUKKyAqIGNhbGxlciBvbiB0aGUgdGFyZ2V0J3Mgd2FpdGluZyBxdWV1ZSBhbmQgcmUtdHJpZWQgbGF0ZXIuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19leGVjdXRlX3Njc2lfY21uZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICpib2FyZHA7CisgICAgQVNDX0RWQ19WQVIgICAgICAgICphc2NfZHZjX3ZhcnA7CisgICAgQURWX0RWQ19WQVIgICAgICAgICphZHZfZHZjX3ZhcnA7CisgICAgQURWX1NDU0lfUkVRX1EgICAgICphZHZfc2NzaXFwOworICAgIHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOworICAgIGludCAgICAgICAgICAgICAgICByZXQ7CisKKyAgICBBU0NfREJHMigxLCAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBzY3AgMHglbHgsIGRvbmUgMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgc2NwLCAodWxvbmcpIHNjcC0+c2NzaV9kb25lKTsKKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2NwLT5kZXZpY2UtPmhvc3QpOworICAgIGRldmljZSA9IGJvYXJkcC0+ZGV2aWNlW3NjcC0+ZGV2aWNlLT5pZF07CisKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJ1aWxkIGFuZCBleGVjdXRlIE5hcnJvdyBCb2FyZCByZXF1ZXN0LgorICAgICAgICAgKi8KKworICAgICAgICBhc2NfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJ1aWxkIEFzYyBMaWJyYXJ5IHJlcXVlc3Qgc3RydWN0dXJlIHVzaW5nIHRoZQorICAgICAgICAgKiBnbG9iYWwgc3RydWN0dXJlcyAnYXNjX3Njc2lfcmVxJyBhbmQgJ2FzY19zZ19oZWFkJy4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgICAgICogcXVldWVkIG9uIHRoZSBib2FyZCBkb25lIHF1ZXVlLiBJdCB3aWxsIGJlIGNvbXBsZXRlZAorICAgICAgICAgKiBieSB0aGUgY2FsbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBhc2NfYnVpbGRfcmVxKCkgY2FuIG5vdCByZXR1cm4gQVNDX0JVU1kuCisgICAgICAgICAqLworICAgICAgICBpZiAoYXNjX2J1aWxkX3JlcShib2FyZHAsIHNjcCkgPT0gQVNDX0VSUk9SKSB7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGJ1aWxkX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBBU0NfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBJZiB0aGVyZSBpcyBubyBlcnJvciwgYWRkIHRoZSBjb21tYW5kCisgICAgICAgICAqIHRvIHRoZSBhY3RpdmUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKHJldCA9IEFzY0V4ZVNjc2lRdWV1ZShhc2NfZHZjX3ZhcnAsICZhc2Nfc2NzaV9xKSkgeworICAgICAgICBjYXNlIEFTQ19OT0VSUk9SOgorICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfbm9lcnJvcik7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5jcmVtZW50IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBwZXIgZGV2aWNlIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAqIHJlcXVlc3QgY291bnRlci4gV3JhcHBpbmcgZG9lc24ndCBtYXR0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvYXJkcC0+cmVxY250W3NjcC0+ZGV2aWNlLT5pZF0rKzsKKyAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmFjdGl2ZSwgc2NwLCBBU0NfQkFDSyk7CisgICAgICAgICAgICBBU0NfREJHKDEsCisgICAgICAgICAgICAgICAgImFzY19leGVjdXRlX3Njc2lfY21uZDogQXNjRXhlU2NzaVF1ZXVlKCksIEFTQ19OT0VSUk9SXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFTQ19CVVNZOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGxlciB3aWxsIGVucXVldWUgcmVxdWVzdCBvbiB0aGUgdGFyZ2V0J3Mgd2FpdGluZyBxdWV1ZQorICAgICAgICAgICAgICogYW5kIHJldHJ5IGxhdGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9idXN5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFTQ19FUlJPUjoKKyAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBib2FyZCAlZDogQXNjRXhlU2NzaVF1ZXVlKCkgQVNDX0VSUk9SLCBlcnJfY29kZSAweCV4XG4iLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOworICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfZXJyb3IpOworICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKKyAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU0NfUFJJTlQyKAorImFzY19leGVjdXRlX3Njc2lfY21uZDogYm9hcmQgJWQ6IEFzY0V4ZVNjc2lRdWV1ZSgpIHVua25vd24sIGVycl9jb2RlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV91bmtub3duKTsKKyAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisgICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQnVpbGQgYW5kIGV4ZWN1dGUgV2lkZSBCb2FyZCByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKKworICAgICAgICAvKgorICAgICAgICAgKiBCdWlsZCBhbmQgZ2V0IGEgcG9pbnRlciB0byBhbiBBZHYgTGlicmFyeSByZXF1ZXN0IHN0cnVjdHVyZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bGx5IGJ1aWx0IHRoZW4gc2VuZCBpdCBiZWxvdywKKyAgICAgICAgICogb3RoZXJ3aXNlIHJldHVybiB3aXRoIGFuIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChhZHZfYnVpbGRfcmVxKGJvYXJkcCwgc2NwLCAmYWR2X3Njc2lxcCkpIHsKKyAgICAgICAgY2FzZSBBU0NfTk9FUlJPUjoKKyAgICAgICAgICAgIEFTQ19EQkcoMywgImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfTk9FUlJPUlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBU0NfQlVTWToKKyAgICAgICAgICAgIEFTQ19EQkcoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfQlVTWVxuIik7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYnVzeSBpcyByZXR1cm5lZCB0aGUgcmVxdWVzdCBoYXMgbm90IGJlZW4gZW5xdWV1ZWQuCisgICAgICAgICAgICAgKiBJdCB3aWxsIGJlIGVucXVldWVkIGJ5IHRoZSBjYWxsZXIgb24gdGhlIHRhcmdldCdzIHdhaXRpbmcKKyAgICAgICAgICAgICAqIHF1ZXVlIGFuZCByZXRyaWVkIGxhdGVyLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoZSBhc2Nfc3RhdHMgZmllbGRzICdhZHZfYnVpbGRfbm9yZXEnIGFuZCAnYWR2X2J1aWxkX25vc2cnCisgICAgICAgICAgICAgKiBjb3VudCB3aWRlIGJvYXJkIGJ1c3kgY29uZGl0aW9ucy4gVGhleSBhcmUgdXBkYXRlZCBpbgorICAgICAgICAgICAgICogYWR2X2J1aWxkX3JlcSBhbmQgYWR2X2dldF9zZ2xpc3QsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIEFTQ19CVVNZOworICAgICAgICBjYXNlIEFTQ19FUlJPUjoKKyAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgKiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAgICAgICAgICAqIHF1ZXVlZCBvbiB0aGUgYm9hcmQgZG9uZSBxdWV1ZS4gSXQgd2lsbCBiZSBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgKiBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNDX0RCRygxLCAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBhZHZfYnVpbGRfcmVxIEFTQ19FUlJPUlxuIik7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGJ1aWxkX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBBU0NfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBJZiB0aGVyZSBpcyBubyBlcnJvciwgYWRkIHRoZSBjb21tYW5kCisgICAgICAgICAqIHRvIHRoZSBhY3RpdmUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKHJldCA9IEFkdkV4ZVNjc2lRdWV1ZShhZHZfZHZjX3ZhcnAsIGFkdl9zY3NpcXApKSB7CisgICAgICAgIGNhc2UgQVNDX05PRVJST1I6CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9ub2Vycm9yKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJbmNyZW1lbnQgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHBlciBkZXZpY2Ugc3VjY2Vzc2Z1bAorICAgICAgICAgICAgICogcmVxdWVzdCBjb3VudGVyLiBXcmFwcGluZyBkb2Vzbid0IG1hdHRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9hcmRwLT5yZXFjbnRbc2NwLT5kZXZpY2UtPmlkXSsrOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+YWN0aXZlLCBzY3AsIEFTQ19CQUNLKTsKKyAgICAgICAgICAgIEFTQ19EQkcoMSwKKyAgICAgICAgICAgICAgICAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBBZHZFeGVTY3NpUXVldWUoKSwgQVNDX05PRVJST1JcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNDX0JVU1k6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbGVyIHdpbGwgZW5xdWV1ZSByZXF1ZXN0IG9uIHRoZSB0YXJnZXQncyB3YWl0aW5nIHF1ZXVlCisgICAgICAgICAgICAgKiBhbmQgcmV0cnkgbGF0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX2J1c3kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNDX0VSUk9SOgorICAgICAgICAgICAgQVNDX1BSSU5UMigKKyJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGJvYXJkICVkOiBBZHZFeGVTY3NpUXVldWUoKSBBU0NfRVJST1IsIGVycl9jb2RlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYWR2X2R2Y192YXJwLT5lcnJfY29kZSk7CisgICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9lcnJvcik7CisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTQ19QUklOVDIoCisiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBib2FyZCAlZDogQWR2RXhlU2NzaVF1ZXVlKCkgdW5rbm93biwgZXJyX2NvZGUgMHgleFxuIiwKKyAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhZHZfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKyAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX3Vua25vd24pOworICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKKyAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU0NfREJHKDEsICJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGVuZFxuIik7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEJ1aWxkIGEgcmVxdWVzdCBzdHJ1Y3R1cmUgZm9yIHRoZSBBc2MgTGlicmFyeSAoTmFycm93IEJvYXJkKS4KKyAqCisgKiBUaGUgZ2xvYmFsIHN0cnVjdHVyZXMgJ2FzY19zY3NpX3EnIGFuZCAnYXNjX3NnX2hlYWQnIGFyZQorICogdXNlZCB0byBidWlsZCB0aGUgcmVxdWVzdC4KKyAqCisgKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gcXVldWUgdGhlIHJlcXVlc3Qgb24gdGhlIGJvYXJkIGRvbmUKKyAqIHF1ZXVlIGFuZCByZXR1cm4gQVNDX0VSUk9SLgorICovCitTVEFUSUMgaW50Cithc2NfYnVpbGRfcmVxKGFzY19ib2FyZF90ICpib2FyZHAsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3sKKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmcuZGV2OworCisgICAgLyoKKyAgICAgKiBNdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIGlzIHJlcXVpcmVkIHRvICdhc2Nfc2NzaV9xJyBhbmQKKyAgICAgKiAnYXNjX3NnX2hlYWQnIHVudGlsIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHN0YXJ0ZWQuCisgICAgICovCisgICAgbWVtc2V0KCZhc2Nfc2NzaV9xLCAwLCBzaXplb2YoQVNDX1NDU0lfUSkpOworCisgICAgLyoKKyAgICAgKiBQb2ludCB0aGUgQVNDX1NDU0lfUSB0byB0aGUgJ3N0cnVjdCBzY3NpX2NtbmQnLgorICAgICAqLworICAgIGFzY19zY3NpX3EucTIuc3JiX3B0ciA9IEFTQ19WQUREUl9UT19VMzIoc2NwKTsKKworICAgIC8qCisgICAgICogQnVpbGQgdGhlIEFTQ19TQ1NJX1EgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEZvciBuYXJyb3cgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDEyIGJ5dGVzCisgICAgICogaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlmIChzY3AtPmNtZF9sZW4gPiBBU0NfTUFYX0NEQl9MRU4pIHsKKyAgICAgICAgQVNDX1BSSU5UMygKKyJhc2NfYnVpbGRfcmVxOiBib2FyZCAlZDogY21kX2xlbiAlZCA+IEFTQ19NQVhfQ0RCX0xFTiAgJWRcbiIsCisgICAgICAgICAgICBib2FyZHAtPmlkLCBzY3AtPmNtZF9sZW4sIEFTQ19NQVhfQ0RCX0xFTik7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworICAgICAgICByZXR1cm4gQVNDX0VSUk9SOworICAgIH0KKyAgICBhc2Nfc2NzaV9xLmNkYnB0ciA9ICZzY3AtPmNtbmRbMF07CisgICAgYXNjX3Njc2lfcS5xMi5jZGJfbGVuID0gc2NwLT5jbWRfbGVuOworICAgIGFzY19zY3NpX3EucTEudGFyZ2V0X2lkID0gQVNDX1RJRF9UT19UQVJHRVRfSUQoc2NwLT5kZXZpY2UtPmlkKTsKKyAgICBhc2Nfc2NzaV9xLnExLnRhcmdldF9sdW4gPSBzY3AtPmRldmljZS0+bHVuOworICAgIGFzY19zY3NpX3EucTIudGFyZ2V0X2l4ID0gQVNDX1RJRExVTl9UT19JWChzY3AtPmRldmljZS0+aWQsIHNjcC0+ZGV2aWNlLT5sdW4pOworICAgIGFzY19zY3NpX3EucTEuc2Vuc2VfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKCZzY3AtPnNlbnNlX2J1ZmZlclswXSkpOworICAgIGFzY19zY3NpX3EucTEuc2Vuc2VfbGVuID0gc2l6ZW9mKHNjcC0+c2Vuc2VfYnVmZmVyKTsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LAorICAgICAqIHRoZW4gZXZlcnkgMjU1dGggcmVxdWVzdCBzZW5kIGFuIE9SREVSRUQgcmVxdWVzdC4gVGhpcyBoZXVyaXN0aWMKKyAgICAgKiB0cmllcyB0byByZXRhaW4gdGhlIGJlbmVmaXQgb2YgcmVxdWVzdCBzb3J0aW5nIHdoaWxlIHByZXZlbnRpbmcKKyAgICAgKiByZXF1ZXN0IHN0YXJ2YXRpb24uIDI1NSBpcyB0aGUgbWF4IG51bWJlciBvZiB0YWdzIG9yIHBlbmRpbmcgY29tbWFuZHMKKyAgICAgKiBhIGRldmljZSBtYXkgaGF2ZSBvdXRzdGFuZGluZy4KKyAgICAgKgorICAgICAqIFRoZSByZXF1ZXN0IGNvdW50IGlzIGluY3JlbWVudGVkIGJlbG93IGZvciBldmVyeSBzdWNjZXNzZnVsbHkKKyAgICAgKiBzdGFydGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKi8KKyAgICBpZiAoKGJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhci5jdXJfZHZjX3FuZ1tzY3AtPmRldmljZS0+aWRdID4gMCkgJiYKKyAgICAgICAgKGJvYXJkcC0+cmVxY250W3NjcC0+ZGV2aWNlLT5pZF0gJSAyNTUpID09IDApIHsKKyAgICAgICAgYXNjX3Njc2lfcS5xMi50YWdfY29kZSA9IE1TR19PUkRFUkVEX1RBRzsKKyAgICB9IGVsc2UgeworICAgICAgICBhc2Nfc2NzaV9xLnEyLnRhZ19jb2RlID0gTVNHX1NJTVBMRV9UQUc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBCdWlsZCBBU0NfU0NTSV9RIGZvciBhIGNvbnRpZ3VvdXMgYnVmZmVyIG9yIGEgc2NhdHRlci1nYXRoZXIKKyAgICAgKiBidWZmZXIgY29tbWFuZC4KKyAgICAgKi8KKyAgICBpZiAoc2NwLT51c2Vfc2cgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBDREIgcmVxdWVzdCBvZiBzaW5nbGUgY29udGlndW91cyBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfY250KTsKKwlzY3AtPlNDcC5kbWFfaGFuZGxlID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW4gPworCSAgICBkbWFfbWFwX3NpbmdsZShkZXYsIHNjcC0+cmVxdWVzdF9idWZmZXIsCisJCQkgICBzY3AtPnJlcXVlc3RfYnVmZmxlbiwgc2NwLT5zY19kYXRhX2RpcmVjdGlvbikgOiAwOworCWFzY19zY3NpX3EucTEuZGF0YV9hZGRyID0gY3B1X3RvX2xlMzIoc2NwLT5TQ3AuZG1hX2hhbmRsZSk7CisgICAgICAgIGFzY19zY3NpX3EucTEuZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisgICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfeGZlciwKKyAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0VJTElORyhzY3AtPnJlcXVlc3RfYnVmZmxlbiwgNTEyKSk7CisgICAgICAgIGFzY19zY3NpX3EucTEuc2dfcXVldWVfY250ID0gMDsKKyAgICAgICAgYXNjX3Njc2lfcS5zZ19oZWFkID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBDREIgc2NhdHRlci1nYXRoZXIgcmVxdWVzdCBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2djbnQ7CisJaW50CQkJdXNlX3NnOworICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICAqc2xwOworCisJc2xwID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisJdXNlX3NnID0gZG1hX21hcF9zZyhkZXYsIHNscCwgc2NwLT51c2Vfc2csIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJaWYgKHVzZV9zZyA+IHNjcC0+ZGV2aWNlLT5ob3N0LT5zZ190YWJsZXNpemUpIHsKKyAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYXNjX2J1aWxkX3JlcTogYm9hcmQgJWQ6IHVzZV9zZyAlZCA+IHNnX3RhYmxlc2l6ZSAlZFxuIiwKKwkJYm9hcmRwLT5pZCwgdXNlX3NnLCBzY3AtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplKTsKKwkgICAgZG1hX3VubWFwX3NnKGRldiwgc2xwLCBzY3AtPnVzZV9zZywgc2NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisgICAgICAgICAgICByZXR1cm4gQVNDX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBzZ19jbnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSBnbG9iYWwgQVNDX1NHX0hFQUQgc3RydWN0dXJlIGFuZCBzZXQgdGhlIEFTQ19TQ1NJX1EKKyAgICAgICAgICogc3RydWN0dXJlIHRvIHBvaW50IHRvIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtc2V0KCZhc2Nfc2dfaGVhZCwgMCwgc2l6ZW9mKEFTQ19TR19IRUFEKSk7CisKKyAgICAgICAgYXNjX3Njc2lfcS5xMS5jbnRsIHw9IFFDX1NHX0hFQUQ7CisgICAgICAgIGFzY19zY3NpX3Euc2dfaGVhZCA9ICZhc2Nfc2dfaGVhZDsKKyAgICAgICAgYXNjX3Njc2lfcS5xMS5kYXRhX2NudCA9IDA7CisgICAgICAgIGFzY19zY3NpX3EucTEuZGF0YV9hZGRyID0gMDsKKyAgICAgICAgLyogVGhpcyBpcyBhIGJ5dGUgdmFsdWUsIG90aGVyd2lzZSBpdCB3b3VsZCBuZWVkIHRvIGJlIHN3YXBwZWQuICovCisJYXNjX3NnX2hlYWQuZW50cnlfY250ID0gYXNjX3Njc2lfcS5xMS5zZ19xdWV1ZV9jbnQgPSB1c2Vfc2c7CisgICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2VsZW0sIGFzY19zZ19oZWFkLmVudHJ5X2NudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBzY2F0dGVyLWdhdGhlciBsaXN0IGludG8gQVNDX1NHX0hFQUQgbGlzdC4KKyAgICAgICAgICovCisJZm9yIChzZ2NudCA9IDA7IHNnY250IDwgdXNlX3NnOyBzZ2NudCsrLCBzbHArKykgeworCSAgICBhc2Nfc2dfaGVhZC5zZ19saXN0W3NnY250XS5hZGRyID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2xwKSk7CisJICAgIGFzY19zZ19oZWFkLnNnX2xpc3Rbc2djbnRdLmJ5dGVzID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzbHApKTsKKwkgICAgQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfeGZlciwgQVNDX0NFSUxJTkcoc2dfZG1hX2xlbihzbHApLCA1MTIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTQ19EQkdfUFJUX0FTQ19TQ1NJX1EoMiwgJmFzY19zY3NpX3EpOworICAgIEFTQ19EQkdfUFJUX0NEQigxLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CisKKyAgICByZXR1cm4gQVNDX05PRVJST1I7Cit9CisKKy8qCisgKiBCdWlsZCBhIHJlcXVlc3Qgc3RydWN0dXJlIGZvciB0aGUgQWR2IExpYnJhcnkgKFdpZGUgQm9hcmQpLgorICoKKyAqIElmIGFuIGFkdl9yZXFfdCBjYW4gbm90IGJlIGFsbG9jYXRlZCB0byBpc3N1ZSB0aGUgcmVxdWVzdCwKKyAqIHRoZW4gcmV0dXJuIEFTQ19CVVNZLiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gcmV0dXJuIEFTQ19FUlJPUi4KKyAqCisgKiBNdWx0aS1ieXRlIGZpZWxkcyBpbiB0aGUgQVNDX1NDU0lfUkVRX1EgdGhhdCBhcmUgdXNlZCBieSB0aGUKKyAqIG1pY3JvY29kZSBmb3IgRE1BIGFkZHJlc3NlcyBvciBtYXRoIG9wZXJhdGlvbnMgYXJlIGJ5dGUgc3dhcHBlZAorICogdG8gbGl0dGxlLWVuZGlhbiBvcmRlci4KKyAqLworU1RBVElDIGludAorYWR2X2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqYm9hcmRwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCisgICAgQURWX1NDU0lfUkVRX1EgKiphZHZfc2NzaXFwcCkKK3sKKyAgICBhZHZfcmVxX3QgICAgICAgICAgICpyZXFwOworICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgKnNjc2lxcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXQ7CisgICAgc3RydWN0IGRldmljZQkqZGV2ID0gYm9hcmRwLT5kdmNfY2ZnLmFkdl9kdmNfY2ZnLmRldjsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgYW4gYWR2X3JlcV90IHN0cnVjdHVyZSBmcm9tIHRoZSBib2FyZCB0byBleGVjdXRlCisgICAgICogdGhlIGNvbW1hbmQuCisgICAgICovCisgICAgaWYgKGJvYXJkcC0+YWR2X3JlcXAgPT0gTlVMTCkgeworICAgICAgICBBU0NfREJHKDEsICJhZHZfYnVpbGRfcmVxOiBubyBmcmVlIGFkdl9yZXFfdFxuIik7CisgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYWR2X2J1aWxkX25vcmVxKTsKKyAgICAgICAgcmV0dXJuIEFTQ19CVVNZOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcXAgPSBib2FyZHAtPmFkdl9yZXFwOworICAgICAgICBib2FyZHAtPmFkdl9yZXFwID0gcmVxcC0+bmV4dF9yZXFwOworICAgICAgICByZXFwLT5uZXh0X3JlcXAgPSBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogR2V0IDMyLWJ5dGUgYWxpZ25lZCBBRFZfU0NTSV9SRVFfUSBhbmQgQURWX1NHX0JMT0NLIHBvaW50ZXJzLgorICAgICAqLworICAgIHNjc2lxcCA9IChBRFZfU0NTSV9SRVFfUSAqKSBBRFZfMzJCQUxJR04oJnJlcXAtPnNjc2lfcmVxX3EpOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgc2NzaXFwLT5jbnRsID0gc2NzaXFwLT5zY3NpX2NudGwgPSBzY3NpcXAtPmRvbmVfc3RhdHVzID0gMDsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBBRFZfU0NTSV9SRVFfUSAnc3JiX3B0cicgdG8gcG9pbnQgdG8gdGhlIGFkdl9yZXFfdCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgc2NzaXFwLT5zcmJfcHRyID0gQVNDX1ZBRERSX1RPX1UzMihyZXFwKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBhZHZfcmVxX3QgJ2NtbmRwJyB0byBwb2ludCB0byB0aGUgc3RydWN0IHNjc2lfY21uZCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcmVxcC0+Y21uZHAgPSBzY3A7CisKKyAgICAvKgorICAgICAqIEJ1aWxkIHRoZSBBRFZfU0NTSV9SRVFfUSByZXF1ZXN0LgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTZXQgQ0RCIGxlbmd0aCBhbmQgY29weSBpdCB0byB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUuCisgICAgICogRm9yIHdpZGUgIGJvYXJkcyBhIENEQiBsZW5ndGggbWF4aW11bSBvZiAxNiBieXRlcworICAgICAqIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpZiAoc2NwLT5jbWRfbGVuID4gQURWX01BWF9DREJfTEVOKSB7CisgICAgICAgIEFTQ19QUklOVDMoCisiYWR2X2J1aWxkX3JlcTogYm9hcmQgJWQ6IGNtZF9sZW4gJWQgPiBBRFZfTUFYX0NEQl9MRU4gICVkXG4iLAorICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2NwLT5jbWRfbGVuLCBBRFZfTUFYX0NEQl9MRU4pOworICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKyAgICAgICAgcmV0dXJuIEFTQ19FUlJPUjsKKyAgICB9CisgICAgc2NzaXFwLT5jZGJfbGVuID0gc2NwLT5jbWRfbGVuOworICAgIC8qIENvcHkgZmlyc3QgMTIgQ0RCIGJ5dGVzIHRvIGNkYltdLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzY3AtPmNtZF9sZW4gJiYgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgc2NzaXFwLT5jZGJbaV0gPSBzY3AtPmNtbmRbaV07CisgICAgfQorICAgIC8qIENvcHkgbGFzdCA0IENEQiBieXRlcywgaWYgcHJlc2VudCwgdG8gY2RiMTZbXS4gKi8KKyAgICBmb3IgKDsgaSA8IHNjcC0+Y21kX2xlbjsgaSsrKSB7CisgICAgICAgIHNjc2lxcC0+Y2RiMTZbaSAtIDEyXSA9IHNjcC0+Y21uZFtpXTsKKyAgICB9CisKKyAgICBzY3NpcXAtPnRhcmdldF9pZCA9IHNjcC0+ZGV2aWNlLT5pZDsKKyAgICBzY3NpcXAtPnRhcmdldF9sdW4gPSBzY3AtPmRldmljZS0+bHVuOworCisgICAgc2NzaXFwLT5zZW5zZV9hZGRyID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJnNjcC0+c2Vuc2VfYnVmZmVyWzBdKSk7CisgICAgc2NzaXFwLT5zZW5zZV9sZW4gPSBzaXplb2Yoc2NwLT5zZW5zZV9idWZmZXIpOworCisgICAgLyoKKyAgICAgKiBCdWlsZCBBRFZfU0NTSV9SRVFfUSBmb3IgYSBjb250aWd1b3VzIGJ1ZmZlciBvciBhIHNjYXR0ZXItZ2F0aGVyCisgICAgICogYnVmZmVyIGNvbW1hbmQuCisgICAgICovCisKKyAgICBzY3NpcXAtPmRhdGFfY250ID0gY3B1X3RvX2xlMzIoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pOworICAgIHNjc2lxcC0+dmRhdGFfYWRkciA9IHNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgc2NzaXFwLT5kYXRhX2FkZHIgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhzY3AtPnJlcXVlc3RfYnVmZmVyKSk7CisKKyAgICBpZiAoc2NwLT51c2Vfc2cgPT0gMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBDREIgcmVxdWVzdCBvZiBzaW5nbGUgY29udGlndW91cyBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICByZXFwLT5zZ2Jsa3AgPSBOVUxMOworCXNjc2lxcC0+ZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisJaWYgKHNjcC0+cmVxdWVzdF9idWZmbGVuKSB7CisJICAgIHNjc2lxcC0+dmRhdGFfYWRkciA9IHNjcC0+cmVxdWVzdF9idWZmZXI7CisJICAgIHNjcC0+U0NwLmRtYV9oYW5kbGUgPQorCSAgICAgICAgZG1hX21hcF9zaW5nbGUoZGV2LCBzY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJICAgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9IGVsc2UgeworCSAgICBzY3NpcXAtPnZkYXRhX2FkZHIgPSAwOworCSAgICBzY3AtPlNDcC5kbWFfaGFuZGxlID0gMDsKKwl9CisJc2NzaXFwLT5kYXRhX2FkZHIgPSBjcHVfdG9fbGUzMihzY3AtPlNDcC5kbWFfaGFuZGxlKTsKKyAgICAgICAgc2NzaXFwLT5zZ19saXN0X3B0ciA9IE5VTEw7CisgICAgICAgIHNjc2lxcC0+c2dfcmVhbF9hZGRyID0gMDsKKyAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBjb250X2NudCk7CisgICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfeGZlciwKKyAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0VJTElORyhzY3AtPnJlcXVlc3RfYnVmZmxlbiwgNTEyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ0RCIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3QgbGlzdC4KKyAgICAgICAgICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbHA7CisJaW50IHVzZV9zZzsKKworCXNscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworCXVzZV9zZyA9IGRtYV9tYXBfc2coZGV2LCBzbHAsIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCWlmICh1c2Vfc2cgPiBBRFZfTUFYX1NHX0xJU1QpIHsKKyAgICAgICAgICAgIEFTQ19QUklOVDMoCisiYWR2X2J1aWxkX3JlcTogYm9hcmQgJWQ6IHVzZV9zZyAlZCA+IEFEVl9NQVhfU0dfTElTVCAlZFxuIiwKKwkJYm9hcmRwLT5pZCwgdXNlX3NnLCBzY3AtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplKTsKKwkgICAgZG1hX3VubWFwX3NnKGRldiwgc2xwLCBzY3AtPnVzZV9zZywgc2NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcmVlIHRoZSAnYWR2X3JlcV90JyBzdHJ1Y3R1cmUgYnkgYWRkaW5nIGl0IGJhY2sgdG8gdGhlCisgICAgICAgICAgICAgKiBib2FyZCBmcmVlIGxpc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlcXAtPm5leHRfcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7CisgICAgICAgICAgICBib2FyZHAtPmFkdl9yZXFwID0gcmVxcDsKKworICAgICAgICAgICAgcmV0dXJuIEFTQ19FUlJPUjsKKyAgICAgICAgfQorCisJaWYgKChyZXQgPSBhZHZfZ2V0X3NnbGlzdChib2FyZHAsIHJlcXAsIHNjcCwgdXNlX3NnKSkgIT0gQURWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcmVlIHRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGJ5IGFkZGluZyBpdCBiYWNrIHRvIHRoZQorICAgICAgICAgICAgICogYm9hcmQgZnJlZSBsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXFwLT5uZXh0X3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwOworICAgICAgICAgICAgYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CisKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2NudCk7CisJQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfZWxlbSwgdXNlX3NnKTsKKyAgICB9CisKKyAgICBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUSgyLCBzY3NpcXApOworICAgIEFTQ19EQkdfUFJUX0NEQigxLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CisKKyAgICAqYWR2X3Njc2lxcHAgPSBzY3NpcXA7CisKKyAgICByZXR1cm4gQVNDX05PRVJST1I7Cit9CisKKy8qCisgKiBCdWlsZCBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciBBZHYgTGlicmFyeSAoV2lkZSBCb2FyZCkuCisgKgorICogQWRkaXRpb25hbCBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlcyB3aWxsIG5lZWQgdG8gYmUgYWxsb2NhdGVkCisgKiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIGV4Y2VlZHMKKyAqIE5PX09GX1NHX1BFUl9CTE9DSyAoMTUpLiBUaGUgQURWX1NHX0JMT0NLIHN0cnVjdHVyZXMgYXJlCisgKiBhc3N1bWVkIHRvIGJlIHBoeXNpY2FsbHkgY29udGlndW91cy4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgIEFEVl9TVUNDRVNTKDEpIC0gU0cgTGlzdCBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICogICAgICBBRFZfRVJST1IoLTEpIC0gU0cgTGlzdCBjcmVhdGlvbiBmYWlsZWQKKyAqLworU1RBVElDIGludAorYWR2X2dldF9zZ2xpc3QoYXNjX2JvYXJkX3QgKmJvYXJkcCwgYWR2X3JlcV90ICpyZXFwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsIGludCB1c2Vfc2cpCit7CisgICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dibGtwOworICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgKnNjc2lxcDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgICpzbHA7CisgICAgaW50ICAgICAgICAgICAgICAgICBzZ19lbGVtX2NudDsKKyAgICBBRFZfU0dfQkxPQ0sgICAgICAgICpzZ19ibG9jaywgKnByZXZfc2dfYmxvY2s7CisgICAgQURWX1BBRERSICAgICAgICAgICBzZ19ibG9ja19wYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisKKyAgICBzY3NpcXAgPSAoQURWX1NDU0lfUkVRX1EgKikgQURWXzMyQkFMSUdOKCZyZXFwLT5zY3NpX3JlcV9xKTsKKyAgICBzbHAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgc2dfZWxlbV9jbnQgPSB1c2Vfc2c7CisgICAgcHJldl9zZ19ibG9jayA9IE5VTEw7CisgICAgcmVxcC0+c2dibGtwID0gTlVMTDsKKworICAgIGRvCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBBbGxvY2F0ZSBhICdhZHZfc2dibGtfdCcgc3RydWN0dXJlIGZyb20gdGhlIGJvYXJkIGZyZWUKKyAgICAgICAgICogbGlzdC4gT25lICdhZHZfc2dibGtfdCcgc3RydWN0dXJlIGhvbGRzIE5PX09GX1NHX1BFUl9CTE9DSworICAgICAgICAgKiAoMTUpIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChzZ2Jsa3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdl9nZXRfc2dsaXN0OiBubyBmcmVlIGFkdl9zZ2Jsa190XG4iKTsKKyAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYWR2X2J1aWxkX25vc2cpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWxsb2NhdGlvbiBmYWlsZWQuIEZyZWUgJ2Fkdl9zZ2Jsa190JyBzdHJ1Y3R1cmVzIGFscmVhZHkKKyAgICAgICAgICAgICAqIGFsbG9jYXRlZCBmb3IgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlICgoc2dibGtwID0gcmVxcC0+c2dibGtwKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSAnc2dibGtwJyBmcm9tIHRoZSByZXF1ZXN0IGxpc3QuICovCisgICAgICAgICAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwLT5uZXh0X3NnYmxrcDsKKworICAgICAgICAgICAgICAgIC8qIEFkZCAnc2dibGtwJyB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LiAqLworICAgICAgICAgICAgICAgIHNnYmxrcC0+bmV4dF9zZ2Jsa3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3A7CisgICAgICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dibGtwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFTQ19CVVNZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ29tcGxldGUgJ2Fkdl9zZ2Jsa190JyBib2FyZCBhbGxvY2F0aW9uLiAqLworICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dibGtwLT5uZXh0X3NnYmxrcDsKKyAgICAgICAgICAgIHNnYmxrcC0+bmV4dF9zZ2Jsa3AgPSBOVUxMOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2V0IDggYnl0ZSBhbGlnbmVkIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBmb3IKKyAgICAgICAgICAgICAqIHRoZSBhbGxvY2F0ZWQgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2dfYmxvY2sgPSAoQURWX1NHX0JMT0NLICopIEFEVl84QkFMSUdOKCZzZ2Jsa3AtPnNnX2Jsb2NrKTsKKyAgICAgICAgICAgIHNnX2Jsb2NrX3BhZGRyID0gdmlydF90b19idXMoc2dfYmxvY2spOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgJ2Fkdl9zZ2Jsa190JyBmb3IgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChyZXFwLT5zZ2Jsa3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSZXF1ZXN0J3MgZmlyc3Qgc2NhdHRlci1nYXRoZXIgYmxvY2suICovCisgICAgICAgICAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgQURWX1NDU0lfUkVRX1QgQURWX1NHX0JMT0NLIHZpcnR1YWwgYW5kIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgICogYWRkcmVzcyBwb2ludGVycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzY3NpcXAtPnNnX2xpc3RfcHRyID0gc2dfYmxvY2s7CisgICAgICAgICAgICAgICAgc2NzaXFwLT5zZ19yZWFsX2FkZHIgPSBjcHVfdG9fbGUzMihzZ19ibG9ja19wYWRkcik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSZXF1ZXN0J3Mgc2Vjb25kIG9yIGxhdGVyIHNjYXR0ZXItZ2F0aGVyIGJsb2NrLiAqLworICAgICAgICAgICAgICAgIHNnYmxrcC0+bmV4dF9zZ2Jsa3AgPSByZXFwLT5zZ2Jsa3A7CisgICAgICAgICAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBQb2ludCB0aGUgcHJldmlvdXMgQURWX1NHX0JMT0NLIHN0cnVjdHVyZSB0bworICAgICAgICAgICAgICAgICAqIHRoZSBuZXdseSBhbGxvY2F0ZWQgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBBU0NfQVNTRVJUKHByZXZfc2dfYmxvY2sgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgcHJldl9zZ19ibG9jay0+c2dfcHRyID0gY3B1X3RvX2xlMzIoc2dfYmxvY2tfcGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5PX09GX1NHX1BFUl9CTE9DSzsgaSsrKQorICAgICAgICB7CisJICAgIHNnX2Jsb2NrLT5zZ19saXN0W2ldLnNnX2FkZHIgPSBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzbHApKTsKKwkgICAgc2dfYmxvY2stPnNnX2xpc3RbaV0uc2dfY291bnQgPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNscCkpOworCSAgICBBU0NfU1RBVFNfQUREKHNjcC0+ZGV2aWNlLT5ob3N0LCBzZ194ZmVyLCBBU0NfQ0VJTElORyhzZ19kbWFfbGVuKHNscCksIDUxMikpOworCisgICAgICAgICAgICBpZiAoLS1zZ19lbGVtX2NudCA9PSAwKQorICAgICAgICAgICAgeyAgIC8qIExhc3QgQURWX1NHX0JMT0NLIGFuZCBzY2F0dGVyLWdhdGhlciBlbnRyeS4gKi8KKyAgICAgICAgICAgICAgICBzZ19ibG9jay0+c2dfY250ID0gaSArIDE7CisgICAgICAgICAgICAgICAgc2dfYmxvY2stPnNnX3B0ciA9IDBMOyAgICAvKiBMYXN0IEFEVl9TR19CTE9DSyBpbiBsaXN0LiAqLworICAgICAgICAgICAgICAgIHJldHVybiBBRFZfU1VDQ0VTUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNscCsrOworICAgICAgICB9CisgICAgICAgIHNnX2Jsb2NrLT5zZ19jbnQgPSBOT19PRl9TR19QRVJfQkxPQ0s7CisgICAgICAgIHByZXZfc2dfYmxvY2sgPSBzZ19ibG9jazsKKyAgICB9CisgICAgd2hpbGUgKDEpOworICAgIC8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIGFzY19pc3JfY2FsbGJhY2soKSAtIFNlY29uZCBMZXZlbCBJbnRlcnJ1cHQgSGFuZGxlciBjYWxsZWQgYnkgQXNjSVNSKCkuCisgKgorICogSW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgTmFycm93IFNDU0kgQXNjIExpYnJhcnkuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfaXNyX2NhbGxiYWNrKEFTQ19EVkNfVkFSICphc2NfZHZjX3ZhcnAsIEFTQ19RRE9ORV9JTkZPICpxZG9uZXApCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOworICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpzY3A7CisgICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKworICAgIEFTQ19EQkcyKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBhc2NfZHZjX3ZhcnAgMHglbHgsIHFkb25lcCAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSBhc2NfZHZjX3ZhcnAsICh1bG9uZykgcWRvbmVwKTsKKyAgICBBU0NfREJHX1BSVF9BU0NfUURPTkVfSU5GTygyLCBxZG9uZXApOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0cnVjdCBzY3NpX2NtbmQgc3RydWN0dXJlIGFuZCBTY3NpX0hvc3Qgc3RydWN0dXJlIGZvciB0aGUKKyAgICAgKiBjb21tYW5kIHRoYXQgaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAqLworICAgIHNjcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIEFTQ19VMzJfVE9fVkFERFIocWRvbmVwLT5kMi5zcmJfcHRyKTsKKyAgICBBU0NfREJHMSgxLCAiYXNjX2lzcl9jYWxsYmFjazogc2NwIDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisKKyAgICBpZiAoc2NwID09IE5VTEwpIHsKKyAgICAgICAgQVNDX1BSSU5UKCJhc2NfaXNyX2NhbGxiYWNrOiBzY3AgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIHJlcXVlc3QncyBob3N0IHBvaW50ZXIgaXMgbm90IHZhbGlkLCBkaXNwbGF5IGEKKyAgICAgKiBtZXNzYWdlIGFuZCByZXR1cm4uCisgICAgICovCisgICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChhc2NfaG9zdFtpXSA9PSBzaHApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IGFzY19ib2FyZF9jb3VudCkgeworICAgICAgICBBU0NfUFJJTlQyKAorICAgICAgICAgICAgImFzY19pc3JfY2FsbGJhY2s6IHNjcCAweCVseCBoYXMgYmFkIGhvc3QgcG9pbnRlciwgaG9zdCAweCVseFxuIiwKKyAgICAgICAgICAgICh1bG9uZykgc2NwLCAodWxvbmcpIHNocCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU0NfU1RBVFMoc2hwLCBjYWxsYmFjayk7CisgICAgQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IHNocCAweCVseFxuIiwgKHVsb25nKSBzaHApOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmVxdWVzdCBpc24ndCBmb3VuZCBvbiB0aGUgYWN0aXZlIHF1ZXVlLCBpdCBtYXkKKyAgICAgKiBoYXZlIGJlZW4gcmVtb3ZlZCB0byBoYW5kbGUgYSByZXNldCByZXF1ZXN0LgorICAgICAqIERpc3BsYXkgYSBtZXNzYWdlIGFuZCByZXR1cm4uCisgICAgICovCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIEFTQ19BU1NFUlQoYXNjX2R2Y192YXJwID09ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXIpOworICAgIGlmIChhc2Nfcm1xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCkgPT0gQVNDX0ZBTFNFKSB7CisgICAgICAgIEFTQ19QUklOVDIoCisgICAgICAgICAgICAiYXNjX2lzcl9jYWxsYmFjazogYm9hcmQgJWQ6IHNjcCAweCVseCBub3Qgb24gYWN0aXZlIHF1ZXVlXG4iLAorICAgICAgICAgICAgYm9hcmRwLT5pZCwgKHVsb25nKSBzY3ApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiAncWRvbmVwJyBjb250YWlucyB0aGUgY29tbWFuZCdzIGVuZGluZyBzdGF0dXMuCisgICAgICovCisgICAgc3dpdGNoIChxZG9uZXAtPmQzLmRvbmVfc3RhdCkgeworICAgIGNhc2UgUURfTk9fRVJST1I6CisgICAgICAgIEFTQ19EQkcoMiwgImFzY19pc3JfY2FsbGJhY2s6IFFEX05PX0VSUk9SXG4iKTsKKyAgICAgICAgc2NwLT5yZXN1bHQgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIGFuIElOUVVJUlkgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGVuIGNhbGwKKyAgICAgICAgICogdGhlIEFzY0lucXVpcnlIYW5kbGluZygpIGZ1bmN0aW9uIHRvIHNldC11cCB0aGUgZGV2aWNlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNjcC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIHNjcC0+ZGV2aWNlLT5sdW4gPT0gMCAmJgorICAgICAgICAgICAgKHNjcC0+cmVxdWVzdF9idWZmbGVuIC0gcWRvbmVwLT5yZW1haW5fYnl0ZXMpID49IDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzY0lucXVpcnlIYW5kbGluZyhhc2NfZHZjX3ZhcnAsIHNjcC0+ZGV2aWNlLT5pZCAmIDB4NywKKyAgICAgICAgICAgICAgICAoQVNDX1NDU0lfSU5RVUlSWSAqKSBzY3AtPnJlcXVlc3RfYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGZvciBhbiB1bmRlcnJ1biBjb25kaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBubyBlcnJvciBhbmQgYW4gdW5kZXJydW4gY29uZGl0aW9uLCB0aGVuCisgICAgICAgICAqIHRoZW4gcmV0dXJuIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCAmJiBxZG9uZXAtPnJlbWFpbl9ieXRlcyAhPSAwICYmCisgICAgICAgICAgICBxZG9uZXAtPnJlbWFpbl9ieXRlcyA8PSBzY3AtPnJlcXVlc3RfYnVmZmxlbikgeworICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IHVuZGVycnVuIGNvbmRpdGlvbiAldSBieXRlc1xuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCkgcWRvbmVwLT5yZW1haW5fYnl0ZXMpOworICAgICAgICAgICAgc2NwLT5yZXNpZCA9IHFkb25lcC0+cmVtYWluX2J5dGVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBRRF9XSVRIX0VSUk9SOgorICAgICAgICBBU0NfREJHKDIsICJhc2NfaXNyX2NhbGxiYWNrOiBRRF9XSVRIX0VSUk9SXG4iKTsKKyAgICAgICAgc3dpdGNoIChxZG9uZXAtPmQzLmhvc3Rfc3RhdCkgeworICAgICAgICBjYXNlIFFIU1RBX05PX0VSUk9SOgorICAgICAgICAgICAgaWYgKHFkb25lcC0+ZDMuc2NzaV9zdGF0ID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworICAgICAgICAgICAgICAgIEFTQ19EQkcoMiwgImFzY19pc3JfY2FsbGJhY2s6IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTlxuIik7CisgICAgICAgICAgICAgICAgQVNDX0RCR19QUlRfU0VOU0UoMiwgc2NwLT5zZW5zZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3AtPnNlbnNlX2J1ZmZlcikpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTm90ZTogVGhlICdzdGF0dXNfYnl0ZSgpJyBtYWNybyB1c2VkIGJ5IHRhcmdldCBkcml2ZXJzCisgICAgICAgICAgICAgICAgICogZGVmaW5lZCBpbiBzY3NpLmggc2hpZnRzIHRoZSBzdGF0dXMgYnl0ZSByZXR1cm5lZCBieQorICAgICAgICAgICAgICAgICAqIGhvc3QgZHJpdmVycyByaWdodCBieSAxIGJpdC4gVGhpcyBpcyB3aHkgdGFyZ2V0IGRyaXZlcnMKKyAgICAgICAgICAgICAgICAgKiBhbHNvIHVzZSByaWdodCBzaGlmdGVkIHN0YXR1cyBieXRlIGRlZmluaXRpb25zLiBGb3IKKyAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZSB0YXJnZXQgZHJpdmVycyB1c2UgQ0hFQ0tfQ09ORElUSU9OLCBkZWZpbmVkIHRvCisgICAgICAgICAgICAgICAgICogMHgxLCBpbnN0ZWFkIG9mIHRoZSBTQ1NJIGRlZmluZWQgY2hlY2sgY29uZGl0aW9uIHZhbHVlCisgICAgICAgICAgICAgICAgICogb2YgMHgyLiBIb3N0IGRyaXZlcnMgYXJlIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgICogYnl0ZSBhcyBpdCBpcyBkZWZpbmVkIGJ5IFNDU0kuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBEUklWRVJfQllURShEUklWRVJfU0VOU0UpIHwKKyAgICAgICAgICAgICAgICAgICAgU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBRSFNUQSBlcnJvciBvY2N1cnJlZCAqLworICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IGhvc3Rfc3RhdCAweCV4XG4iLAorICAgICAgICAgICAgICAgIHFkb25lcC0+ZDMuaG9zdF9zdGF0KTsKKyAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9CQURfVEFSR0VUKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBRRF9BQk9SVEVEX0JZX0hPU1Q6CisgICAgICAgIEFTQ19EQkcoMSwgImFzY19pc3JfY2FsbGJhY2s6IFFEX0FCT1JURURfQllfSE9TVFxuIik7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9BQk9SVCkgfCBNU0dfQllURShxZG9uZXAtPmQzLnNjc2lfbXNnKSB8CisgICAgICAgICAgICAgICAgU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTQ19EQkcxKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXQgMHgleFxuIiwgcWRvbmVwLT5kMy5kb25lX3N0YXQpOworICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpIHwgTVNHX0JZVEUocWRvbmVwLT5kMy5zY3NpX21zZykgfAorICAgICAgICAgICAgICAgIFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgJ2luaXRfdGlkbWFzaycgYml0IGlzbid0IGFscmVhZHkgc2V0IGZvciB0aGUgdGFyZ2V0IGFuZCB0aGUKKyAgICAgKiBjdXJyZW50IHJlcXVlc3QgZmluaXNoZWQgbm9ybWFsbHksIHRoZW4gc2V0IHRoZSBiaXQgZm9yIHRoZSB0YXJnZXQKKyAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IGEgZGV2aWNlIGlzIHByZXNlbnQuCisgICAgICovCisgICAgaWYgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpKSA9PSAwICYmCisgICAgICAgIHFkb25lcC0+ZDMuZG9uZV9zdGF0ID09IFFEX05PX0VSUk9SICYmCisgICAgICAgIHFkb25lcC0+ZDMuaG9zdF9zdGF0ID09IFFIU1RBX05PX0VSUk9SKSB7CisgICAgICAgIGJvYXJkcC0+aW5pdF90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpOworICAgIH0KKworICAgIC8qCisgICAgICogQmVjYXVzZSBpbnRlcnJ1cHRzIG1heSBiZSBlbmFibGVkIGJ5IHRoZSAnc3RydWN0IHNjc2lfY21uZCcgZG9uZQorICAgICAqIGZ1bmN0aW9uLCBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgYm9hcmQncyBkb25lIHF1ZXVlLgorICAgICAqIFRoZSBkb25lIGZ1bmN0aW9uIGZvciB0aGUgY29tbWFuZCB3aWxsIGJlIGNhbGxlZCBmcm9tCisgICAgICogYWR2YW5zeXNfaW50ZXJydXB0KCkuCisgICAgICovCisgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBhZHZfaXNyX2NhbGxiYWNrKCkgLSBTZWNvbmQgTGV2ZWwgSW50ZXJydXB0IEhhbmRsZXIgY2FsbGVkIGJ5IEFkdklTUigpLgorICoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgV2lkZSBTQ1NJIEFkdiBMaWJyYXJ5LgorICovCitTVEFUSUMgdm9pZAorYWR2X2lzcl9jYWxsYmFjayhBRFZfRFZDX1ZBUiAqYWR2X2R2Y192YXJwLCBBRFZfU0NTSV9SRVFfUSAqc2NzaXFwKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKyAgICBhZHZfcmVxX3QgICAgICAgICAgICpyZXFwOworICAgIGFkdl9zZ2Jsa190ICAgICAgICAgKnNnYmxrcDsKKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgICAqc2NwOworICAgIHN0cnVjdCBTY3NpX0hvc3QgICAgKnNocDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgQURWX0RDTlQgICAgICAgICAgICByZXNpZF9jbnQ7CisKKworICAgIEFTQ19EQkcyKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBhZHZfZHZjX3ZhcnAgMHglbHgsIHNjc2lxcCAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSBhZHZfZHZjX3ZhcnAsICh1bG9uZykgc2NzaXFwKTsKKyAgICBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUSgyLCBzY3NpcXApOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGFkdl9yZXFfdCBzdHJ1Y3R1cmUgZm9yIHRoZSBjb21tYW5kIHRoYXQgaGFzIGJlZW4KKyAgICAgKiBjb21wbGV0ZWQuIFRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGFjdHVhbGx5IGNvbnRhaW5zIHRoZQorICAgICAqIGNvbXBsZXRlZCBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcmVxcCA9IChhZHZfcmVxX3QgKikgQURWX1UzMl9UT19WQUREUihzY3NpcXAtPnNyYl9wdHIpOworICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiByZXFwIDB4JWx4XG4iLCAodWxvbmcpIHJlcXApOworICAgIGlmIChyZXFwID09IE5VTEwpIHsKKyAgICAgICAgQVNDX1BSSU5UKCJhZHZfaXNyX2NhbGxiYWNrOiByZXFwIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0cnVjdCBzY3NpX2NtbmQgc3RydWN0dXJlIGFuZCBTY3NpX0hvc3Qgc3RydWN0dXJlIGZvciB0aGUKKyAgICAgKiBjb21tYW5kIHRoYXQgaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogTm90ZTogVGhlIGFkdl9yZXFfdCByZXF1ZXN0IHN0cnVjdHVyZSBhbmQgYWR2X3NnYmxrX3Qgc3RydWN0dXJlLAorICAgICAqIGlmIGFueSwgYXJlIGRyb3BwZWQsIGJlY2F1c2UgYSBib2FyZCBzdHJ1Y3R1cmUgcG9pbnRlciBjYW4gbm90IGJlCisgICAgICogZGV0ZXJtaW5lZC4KKyAgICAgKi8KKyAgICBzY3AgPSByZXFwLT5jbW5kcDsKKyAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogc2NwIDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisgICAgaWYgKHNjcCA9PSBOVUxMKSB7CisgICAgICAgIEFTQ19QUklOVCgiYWR2X2lzcl9jYWxsYmFjazogc2NwIGlzIE5VTEw7IGFkdl9yZXFfdCBkcm9wcGVkLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIHJlcXVlc3QncyBob3N0IHBvaW50ZXIgaXMgbm90IHZhbGlkLCBkaXNwbGF5IGEgbWVzc2FnZQorICAgICAqIGFuZCByZXR1cm4uCisgICAgICovCisgICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChhc2NfaG9zdFtpXSA9PSBzaHApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogTm90ZTogSWYgdGhlIGhvc3Qgc3RydWN0dXJlIGlzIG5vdCBmb3VuZCwgdGhlIGFkdl9yZXFfdCByZXF1ZXN0CisgICAgICogc3RydWN0dXJlIGFuZCBhZHZfc2dibGtfdCBzdHJ1Y3R1cmUsIGlmIGFueSwgaXMgZHJvcHBlZC4KKyAgICAgKi8KKyAgICBpZiAoaSA9PSBhc2NfYm9hcmRfY291bnQpIHsKKyAgICAgICAgQVNDX1BSSU5UMigKKyAgICAgICAgICAgICJhZHZfaXNyX2NhbGxiYWNrOiBzY3AgMHglbHggaGFzIGJhZCBob3N0IHBvaW50ZXIsIGhvc3QgMHglbHhcbiIsCisgICAgICAgICAgICAodWxvbmcpIHNjcCwgKHVsb25nKSBzaHApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVNDX1NUQVRTKHNocCwgY2FsbGJhY2spOworICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBzaHAgMHglbHhcbiIsICh1bG9uZykgc2hwKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIHJlcXVlc3QgaXNuJ3QgZm91bmQgb24gdGhlIGFjdGl2ZSBxdWV1ZSwgaXQgbWF5IGhhdmUgYmVlbgorICAgICAqIHJlbW92ZWQgdG8gaGFuZGxlIGEgcmVzZXQgcmVxdWVzdC4gRGlzcGxheSBhIG1lc3NhZ2UgYW5kIHJldHVybi4KKyAgICAgKgorICAgICAqIE5vdGU6IEJlY2F1c2UgdGhlIHN0cnVjdHVyZSBtYXkgc3RpbGwgYmUgaW4gdXNlIGRvbid0IGF0dGVtcHQKKyAgICAgKiB0byBmcmVlIHRoZSBhZHZfcmVxX3QgYW5kIGFkdl9zZ2Jsa190LCBpZiBhbnksIHN0cnVjdHVyZXMuCisgICAgICovCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIEFTQ19BU1NFUlQoYWR2X2R2Y192YXJwID09ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIpOworICAgIGlmIChhc2Nfcm1xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCkgPT0gQVNDX0ZBTFNFKSB7CisgICAgICAgIEFTQ19QUklOVDIoCisgICAgICAgICAgICAiYWR2X2lzcl9jYWxsYmFjazogYm9hcmQgJWQ6IHNjcCAweCVseCBub3Qgb24gYWN0aXZlIHF1ZXVlXG4iLAorICAgICAgICAgICAgYm9hcmRwLT5pZCwgKHVsb25nKSBzY3ApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiAnZG9uZV9zdGF0dXMnIGNvbnRhaW5zIHRoZSBjb21tYW5kJ3MgZW5kaW5nIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKHNjc2lxcC0+ZG9uZV9zdGF0dXMpIHsKKyAgICBjYXNlIFFEX05PX0VSUk9SOgorICAgICAgICBBU0NfREJHKDIsICJhZHZfaXNyX2NhbGxiYWNrOiBRRF9OT19FUlJPUlxuIik7CisgICAgICAgIHNjcC0+cmVzdWx0ID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBmb3IgYW4gdW5kZXJydW4gY29uZGl0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGVyZSB3YXMgbm8gZXJyb3IgYW5kIGFuIHVuZGVycnVuIGNvbmRpdGlvbiwgdGhlbgorICAgICAgICAgKiB0aGVuIHJldHVybiB0aGUgbnVtYmVyIG9mIHVuZGVycnVuIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcmVzaWRfY250ID0gbGUzMl90b19jcHUoc2NzaXFwLT5kYXRhX2NudCk7CisgICAgICAgIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbiAhPSAwICYmIHJlc2lkX2NudCAhPSAwICYmCisgICAgICAgICAgICByZXNpZF9jbnQgPD0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKyAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiB1bmRlcnJ1biBjb25kaXRpb24gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICh1bG9uZykgcmVzaWRfY250KTsKKyAgICAgICAgICAgIHNjcC0+cmVzaWQgPSByZXNpZF9jbnQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFFEX1dJVEhfRVJST1I6CisgICAgICAgIEFTQ19EQkcoMiwgImFkdl9pc3JfY2FsbGJhY2s6IFFEX1dJVEhfRVJST1JcbiIpOworICAgICAgICBzd2l0Y2ggKHNjc2lxcC0+aG9zdF9zdGF0dXMpIHsKKyAgICAgICAgY2FzZSBRSFNUQV9OT19FUlJPUjoKKyAgICAgICAgICAgIGlmIChzY3NpcXAtPnNjc2lfc3RhdHVzID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworICAgICAgICAgICAgICAgIEFTQ19EQkcoMiwgImFkdl9pc3JfY2FsbGJhY2s6IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTlxuIik7CisgICAgICAgICAgICAgICAgQVNDX0RCR19QUlRfU0VOU0UoMiwgc2NwLT5zZW5zZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3AtPnNlbnNlX2J1ZmZlcikpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTm90ZTogVGhlICdzdGF0dXNfYnl0ZSgpJyBtYWNybyB1c2VkIGJ5IHRhcmdldCBkcml2ZXJzCisgICAgICAgICAgICAgICAgICogZGVmaW5lZCBpbiBzY3NpLmggc2hpZnRzIHRoZSBzdGF0dXMgYnl0ZSByZXR1cm5lZCBieQorICAgICAgICAgICAgICAgICAqIGhvc3QgZHJpdmVycyByaWdodCBieSAxIGJpdC4gVGhpcyBpcyB3aHkgdGFyZ2V0IGRyaXZlcnMKKyAgICAgICAgICAgICAgICAgKiBhbHNvIHVzZSByaWdodCBzaGlmdGVkIHN0YXR1cyBieXRlIGRlZmluaXRpb25zLiBGb3IKKyAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZSB0YXJnZXQgZHJpdmVycyB1c2UgQ0hFQ0tfQ09ORElUSU9OLCBkZWZpbmVkIHRvCisgICAgICAgICAgICAgICAgICogMHgxLCBpbnN0ZWFkIG9mIHRoZSBTQ1NJIGRlZmluZWQgY2hlY2sgY29uZGl0aW9uIHZhbHVlCisgICAgICAgICAgICAgICAgICogb2YgMHgyLiBIb3N0IGRyaXZlcnMgYXJlIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgICogYnl0ZSBhcyBpdCBpcyBkZWZpbmVkIGJ5IFNDU0kuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBEUklWRVJfQllURShEUklWRVJfU0VOU0UpIHwKKyAgICAgICAgICAgICAgICAgICAgU1RBVFVTX0JZVEUoc2NzaXFwLT5zY3NpX3N0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gU1RBVFVTX0JZVEUoc2NzaXFwLT5zY3NpX3N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogU29tZSBvdGhlciBRSFNUQSBlcnJvciBvY2N1cnJlZC4gKi8KKyAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBob3N0X3N0YXR1cyAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNjc2lxcC0+aG9zdF9zdGF0dXMpOworICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0JBRF9UQVJHRVQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFFEX0FCT1JURURfQllfSE9TVDoKKyAgICAgICAgQVNDX0RCRygxLCAiYWR2X2lzcl9jYWxsYmFjazogUURfQUJPUlRFRF9CWV9IT1NUXG4iKTsKKyAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0FCT1JUKSB8IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXR1cyAweCV4XG4iLCBzY3NpcXAtPmRvbmVfc3RhdHVzKTsKKyAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKSB8IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSAnaW5pdF90aWRtYXNrJyBiaXQgaXNuJ3QgYWxyZWFkeSBzZXQgZm9yIHRoZSB0YXJnZXQgYW5kIHRoZQorICAgICAqIGN1cnJlbnQgcmVxdWVzdCBmaW5pc2hlZCBub3JtYWxseSwgdGhlbiBzZXQgdGhlIGJpdCBmb3IgdGhlIHRhcmdldAorICAgICAqIHRvIGluZGljYXRlIHRoYXQgYSBkZXZpY2UgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBpZiAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHNjcC0+ZGV2aWNlLT5pZCkpID09IDAgJiYKKyAgICAgICAgc2NzaXFwLT5kb25lX3N0YXR1cyA9PSBRRF9OT19FUlJPUiAmJgorICAgICAgICBzY3NpcXAtPmhvc3Rfc3RhdHVzID09IFFIU1RBX05PX0VSUk9SKSB7CisgICAgICAgIGJvYXJkcC0+aW5pdF90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpOworICAgIH0KKworICAgIC8qCisgICAgICogQmVjYXVzZSBpbnRlcnJ1cHRzIG1heSBiZSBlbmFibGVkIGJ5IHRoZSAnc3RydWN0IHNjc2lfY21uZCcgZG9uZQorICAgICAqIGZ1bmN0aW9uLCBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgYm9hcmQncyBkb25lIHF1ZXVlLgorICAgICAqIFRoZSBkb25lIGZ1bmN0aW9uIGZvciB0aGUgY29tbWFuZCB3aWxsIGJlIGNhbGxlZCBmcm9tCisgICAgICogYWR2YW5zeXNfaW50ZXJydXB0KCkuCisgICAgICovCisgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKyAgICAvKgorICAgICAqIEZyZWUgYWxsICdhZHZfc2dibGtfdCcgc3RydWN0dXJlcyBhbGxvY2F0ZWQgZm9yIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHdoaWxlICgoc2dibGtwID0gcmVxcC0+c2dibGtwKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlICdzZ2Jsa3AnIGZyb20gdGhlIHJlcXVlc3QgbGlzdC4gKi8KKyAgICAgICAgcmVxcC0+c2dibGtwID0gc2dibGtwLT5uZXh0X3NnYmxrcDsKKworICAgICAgICAvKiBBZGQgJ3NnYmxrcCcgdG8gdGhlIGJvYXJkIGZyZWUgbGlzdC4gKi8KKyAgICAgICAgc2dibGtwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKKyAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dibGtwOworICAgIH0KKworICAgIC8qCisgICAgICogRnJlZSB0aGUgYWR2X3JlcV90IHN0cnVjdHVyZSB1c2VkIHdpdGggdGhlIGNvbW1hbmQgYnkgYWRkaW5nCisgICAgICogaXQgYmFjayB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LgorICAgICAqLworICAgIHJlcXAtPm5leHRfcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7CisgICAgYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CisKKyAgICBBU0NfREJHKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBkb25lXG4iKTsKKworICAgIHJldHVybjsKK30KKworLyoKKyAqIGFkdl9hc3luY19jYWxsYmFjaygpIC0gQWR2IExpYnJhcnkgYXN5bmNocm9ub3VzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uLgorICovCitTVEFUSUMgdm9pZAorYWR2X2FzeW5jX2NhbGxiYWNrKEFEVl9EVkNfVkFSICphZHZfZHZjX3ZhcnAsIHVjaGFyIGNvZGUpCit7CisgICAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIEFEVl9BU1lOQ19TQ1NJX0JVU19SRVNFVF9ERVQ6CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmaXJtd2FyZSBkZXRlY3RlZCBhIFNDU0kgQnVzIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgQVNDX0RCRygwLCAiYWR2X2FzeW5jX2NhbGxiYWNrOiBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFEVl9BU1lOQ19SRE1BX0ZBSUxVUkU6CisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBSRE1BIGZhaWx1cmUgYnkgcmVzZXR0aW5nIHRoZSBTQ1NJIEJ1cyBhbmQKKyAgICAgICAgICogcG9zc2libHkgdGhlIGNoaXAgaWYgaXQgaXMgdW5yZXNwb25zaXZlLiBMb2cgdGhlIGVycm9yCisgICAgICAgICAqIHdpdGggYSB1bmlxdWUgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIEFTQ19EQkcoMCwgImFkdl9hc3luY19jYWxsYmFjazogQURWX0FTWU5DX1JETUFfRkFJTFVSRVxuIik7CisgICAgICAgIEFkdlJlc2V0Q2hpcEFuZFNCKGFkdl9kdmNfdmFycCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBRFZfSE9TVF9TQ1NJX0JVU19SRVNFVDoKKyAgICAgICAgLyoKKyAgICAgICAgICogSG9zdCBnZW5lcmF0ZWQgU0NTSSBidXMgcmVzZXQgb2NjdXJyZWQuCisgICAgICAgICAqLworICAgICAgICBBU0NfREJHKDAsICJhZHZfYXN5bmNfY2FsbGJhY2s6IEFEVl9IT1NUX1NDU0lfQlVTX1JFU0VUXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU0NfREJHMSgwLCAiRHZjQXN5bmNDYWxsQmFjazogdW5rbm93biBjb2RlIDB4JXhcbiIsIGNvZGUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qCisgKiBBZGQgYSAnUkVRUCcgdG8gdGhlIGVuZCBvZiBzcGVjaWZpZWQgcXVldWUuIFNldCAndGlkbWFzaycKKyAqIHRvIGluZGljYXRlIGEgY29tbWFuZCBpcyBxdWV1ZWQgZm9yIHRoZSBkZXZpY2UuCisgKgorICogJ2ZsYWcnIG1heSBiZSBlaXRoZXIgQVNDX0ZST05UIG9yIEFTQ19CQUNLLgorICoKKyAqICdSRVFQTkVYVChyZXFwKScgcmV0dXJucyByZXFwJ3MgbmV4dCBwb2ludGVyLgorICovCitTVEFUSUMgdm9pZAorYXNjX2VucXVldWUoYXNjX3F1ZXVlX3QgKmFzY3EsIFJFUVAgcmVxcCwgaW50IGZsYWcpCit7CisgICAgaW50ICAgICAgICB0aWQ7CisKKyAgICBBU0NfREJHMygzLCAiYXNjX2VucXVldWU6IGFzY3EgMHglbHgsIHJlcXAgMHglbHgsIGZsYWcgJWRcbiIsCisgICAgICAgICh1bG9uZykgYXNjcSwgKHVsb25nKSByZXFwLCBmbGFnKTsKKyAgICBBU0NfQVNTRVJUKHJlcXAgIT0gTlVMTCk7CisgICAgQVNDX0FTU0VSVChmbGFnID09IEFTQ19GUk9OVCB8fCBmbGFnID09IEFTQ19CQUNLKTsKKyAgICB0aWQgPSBSRVFQVElEKHJlcXApOworICAgIEFTQ19BU1NFUlQodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKTsKKyAgICBpZiAoZmxhZyA9PSBBU0NfRlJPTlQpIHsKKyAgICAgICAgcmVxcC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopYXNjcS0+cV9maXJzdFt0aWRdOworICAgICAgICBhc2NxLT5xX2ZpcnN0W3RpZF0gPSByZXFwOworICAgICAgICAvKiBJZiB0aGUgcXVldWUgd2FzIGVtcHR5LCBzZXQgdGhlIGxhc3QgcG9pbnRlci4gKi8KKyAgICAgICAgaWYgKGFzY3EtPnFfbGFzdFt0aWRdID09IE5VTEwpIHsKKyAgICAgICAgICAgIGFzY3EtPnFfbGFzdFt0aWRdID0gcmVxcDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIEFTQ19CQUNLICovCisgICAgICAgIGlmIChhc2NxLT5xX2xhc3RbdGlkXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXS0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopcmVxcDsKKyAgICAgICAgfQorICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXSA9IHJlcXA7CisgICAgICAgIHJlcXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgICAgICAvKiBJZiB0aGUgcXVldWUgd2FzIGVtcHR5LCBzZXQgdGhlIGZpcnN0IHBvaW50ZXIuICovCisgICAgICAgIGlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gcmVxcDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUaGUgcXVldWUgaGFzIGF0IGxlYXN0IG9uZSBlbnRyeSwgc2V0IGl0cyBiaXQuICovCisgICAgYXNjcS0+cV90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyh0aWQpOworI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisgICAgLyogTWFpbnRhaW4gcmVxdWVzdCBxdWV1ZSBzdGF0aXN0aWNzLiAqLworICAgIGFzY3EtPnFfdG90X2NudFt0aWRdKys7CisgICAgYXNjcS0+cV9jdXJfY250W3RpZF0rKzsKKyAgICBpZiAoYXNjcS0+cV9jdXJfY250W3RpZF0gPiBhc2NxLT5xX21heF9jbnRbdGlkXSkgeworICAgICAgICBhc2NxLT5xX21heF9jbnRbdGlkXSA9IGFzY3EtPnFfY3VyX2NudFt0aWRdOworICAgICAgICBBU0NfREJHMigyLCAiYXNjX2VucXVldWU6IG5ldyBxX21heF9jbnRbJWRdICVkXG4iLAorICAgICAgICAgICAgdGlkLCBhc2NxLT5xX21heF9jbnRbdGlkXSk7CisgICAgfQorICAgIFJFUVBUSU1FKHJlcXApID0gUkVRVElNRVNUQU1QKCk7CisjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KKyAgICBBU0NfREJHMSgzLCAiYXNjX2VucXVldWU6IHJlcXAgMHglbHhcbiIsICh1bG9uZykgcmVxcCk7CisgICAgcmV0dXJuOworfQorCisvKgorICogUmV0dXJuIGZpcnN0IHF1ZXVlZCAnUkVRUCcgb24gdGhlIHNwZWNpZmllZCBxdWV1ZSBmb3IKKyAqIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGRldmljZS4gQ2xlYXIgdGhlICd0aWRtYXNrJyBiaXQgZm9yCisgKiB0aGUgZGV2aWNlIGlmIG5vIG1vcmUgY29tbWFuZHMgYXJlIGxlZnQgcXVldWVkIGZvciBpdC4KKyAqCisgKiAnUkVRUE5FWFQocmVxcCknIHJldHVybnMgcmVxcCdzIG5leHQgcG9pbnRlci4KKyAqLworU1RBVElDIFJFUVAKK2FzY19kZXF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBpbnQgdGlkKQoreworICAgIFJFUVAgICAgcmVxcDsKKworICAgIEFTQ19EQkcyKDMsICJhc2NfZGVxdWV1ZTogYXNjcSAweCVseCwgdGlkICVkXG4iLCAodWxvbmcpIGFzY3EsIHRpZCk7CisgICAgQVNDX0FTU0VSVCh0aWQgPj0gMCAmJiB0aWQgPD0gQURWX01BWF9USUQpOworICAgIGlmICgocmVxcCA9IGFzY3EtPnFfZmlyc3RbdGlkXSkgIT0gTlVMTCkgeworICAgICAgICBBU0NfQVNTRVJUKGFzY3EtPnFfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyh0aWQpKTsKKyAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gUkVRUE5FWFQocmVxcCk7CisgICAgICAgIC8qIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgY2xlYXIgaXRzIGJpdCBhbmQgdGhlIGxhc3QgcG9pbnRlci4gKi8KKyAgICAgICAgaWYgKGFzY3EtPnFfZmlyc3RbdGlkXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBhc2NxLT5xX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyh0aWQpOworICAgICAgICAgICAgQVNDX0FTU0VSVChhc2NxLT5xX2xhc3RbdGlkXSA9PSByZXFwKTsKKyAgICAgICAgICAgIGFzY3EtPnFfbGFzdFt0aWRdID0gTlVMTDsKKyAgICAgICAgfQorI2lmZGVmIEFEVkFOU1lTX1NUQVRTCisgICAgICAgIC8qIE1haW50YWluIHJlcXVlc3QgcXVldWUgc3RhdGlzdGljcy4gKi8KKyAgICAgICAgYXNjcS0+cV9jdXJfY250W3RpZF0tLTsKKyAgICAgICAgQVNDX0FTU0VSVChhc2NxLT5xX2N1cl9jbnRbdGlkXSA+PSAwKTsKKyAgICAgICAgUkVRVElNRVNUQVQoImFzY19kZXF1ZXVlIiwgYXNjcSwgcmVxcCwgdGlkKTsKKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgIH0KKyAgICBBU0NfREJHMSgzLCAiYXNjX2RlcXVldWU6IHJlcXAgMHglbHhcbiIsICh1bG9uZykgcmVxcCk7CisgICAgcmV0dXJuIHJlcXA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGFsbCB0aGUgcmVxdWVzdHMgcXVldWVkCisgKiBmb3IgJ3RpZCcgb24gdGhlICdhc2NfcXVldWVfdCcgcG9pbnRlZCB0byBieSAnYXNjcScuCisgKgorICogSWYgJ2xhc3RwcCcgaXMgbm90IE5VTEwsICcqbGFzdHBwJyB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUKKyAqIHRoZSBsYXN0IHJlcXVlc3QgcmV0dXJuZWQgaW4gdGhlIHNpbmdseSBsaW5rZWQgbGlzdC4KKyAqCisgKiAndGlkJyBzaG91bGQgZWl0aGVyIGJlIGEgdmFsaWQgdGFyZ2V0IGlkIG9yIGlmIGl0IGlzIEFTQ19USURfQUxMLAorICogdGhlbiBhbGwgcXVldWVkIHJlcXVlc3RzIGFyZSBjb25jYXRlbmF0ZWQgaW50byBvbmUgbGlzdCBhbmQKKyAqIHJldHVybmVkLgorICoKKyAqIE5vdGU6IElmICdsYXN0cHAnIGlzIHVzZWQgdG8gYXBwZW5kIGEgbmV3IGxpc3QgdG8gdGhlIGVuZCBvZgorICogYW4gb2xkIGxpc3QsIG9ubHkgY2hhbmdlIHRoZSBvbGQgbGlzdCBsYXN0IHBvaW50ZXIgaWYgJypsYXN0cHAnCisgKiAob3IgdGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSkgaXMgbm90IE5VTEwsIGkuZS4gdXNlIGEgdGVtcG9yYXJ5CisgKiB2YXJpYWJsZSBmb3IgJ2xhc3RwcCcgYW5kIGNoZWNrIGl0cyB2YWx1ZSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJuCisgKiBiZWZvcmUgYXNzaWduaW5nIGl0IHRvIHRoZSBsaXN0IGxhc3QgcG9pbnRlci4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5IGNvbGxlY3RpbmcgcXVldWluZyB0aW1lIHN0YXRpc3RpY3MgYWRkcyBvdmVyaGVhZCB0bworICogdGhlIGZ1bmN0aW9uIHRoYXQgaXNuJ3QgaW5oZXJlbnQgdG8gdGhlIGZ1bmN0aW9uJ3MgYWxnb3JpdGhtLgorICovCitTVEFUSUMgUkVRUAorYXNjX2RlcXVldWVfbGlzdChhc2NfcXVldWVfdCAqYXNjcSwgUkVRUCAqbGFzdHBwLCBpbnQgdGlkKQoreworICAgIFJFUVAgICAgZmlyc3RwLCBsYXN0cDsKKyAgICBpbnQgICAgIGk7CisKKyAgICBBU0NfREJHMigzLCAiYXNjX2RlcXVldWVfbGlzdDogYXNjcSAweCVseCwgdGlkICVkXG4iLCAodWxvbmcpIGFzY3EsIHRpZCk7CisgICAgQVNDX0FTU0VSVCgodGlkID09IEFTQ19USURfQUxMKSB8fCAodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKSk7CisKKyAgICAvKgorICAgICAqIElmICd0aWQnIGlzIG5vdCBBU0NfVElEX0FMTCwgcmV0dXJuIHJlcXVlc3RzIG9ubHkgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCAndGlkJy4gSWYgJ3RpZCcgaXMgQVNDX1RJRF9BTEwsIHJldHVybiBhbGwKKyAgICAgKiByZXF1ZXN0cyBmb3IgYWxsIHRpZHMuCisgICAgICovCisgICAgaWYgKHRpZCAhPSBBU0NfVElEX0FMTCkgeworICAgICAgICAvKiBSZXR1cm4gYWxsIHJlcXVlc3RzIGZvciB0aGUgc3BlY2lmaWVkICd0aWQnLiAqLworICAgICAgICBpZiAoKGFzY3EtPnFfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyh0aWQpKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBMaXN0IGlzIGVtcHR5OyBTZXQgZmlyc3QgYW5kIGxhc3QgcmV0dXJuIHBvaW50ZXJzIHRvIE5VTEwuICovCisgICAgICAgICAgICBmaXJzdHAgPSBsYXN0cCA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdHAgPSBhc2NxLT5xX2ZpcnN0W3RpZF07CisgICAgICAgICAgICBsYXN0cCA9IGFzY3EtPnFfbGFzdFt0aWRdOworICAgICAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gYXNjcS0+cV9sYXN0W3RpZF0gPSBOVUxMOworICAgICAgICAgICAgYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJFUVAgcmVxcDsKKyAgICAgICAgICAgICAgICBhc2NxLT5xX2N1cl9jbnRbdGlkXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChyZXFwID0gZmlyc3RwOyByZXFwOyByZXFwID0gUkVRUE5FWFQocmVxcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUkVRVElNRVNUQVQoImFzY19kZXF1ZXVlX2xpc3QiLCBhc2NxLCByZXFwLCB0aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmV0dXJuIGFsbCByZXF1ZXN0cyBmb3IgYWxsIHRpZHMuICovCisgICAgICAgIGZpcnN0cCA9IGxhc3RwID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXNjcS0+cV90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0cCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0cCA9IGFzY3EtPnFfZmlyc3RbaV07CisgICAgICAgICAgICAgICAgICAgIGxhc3RwID0gYXNjcS0+cV9sYXN0W2ldOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQobGFzdHAgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NxLT5xX2ZpcnN0W2ldOworICAgICAgICAgICAgICAgICAgICBsYXN0cCA9IGFzY3EtPnFfbGFzdFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNjcS0+cV9maXJzdFtpXSA9IGFzY3EtPnFfbGFzdFtpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0soaSk7CisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyAgICAgICAgICAgICAgICBhc2NxLT5xX2N1cl9jbnRbaV0gPSAwOworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBBRFZBTlNZU19TVEFUUworICAgICAgICB7CisgICAgICAgICAgICBSRVFQIHJlcXA7CisgICAgICAgICAgICBmb3IgKHJlcXAgPSBmaXJzdHA7IHJlcXA7IHJlcXAgPSBSRVFQTkVYVChyZXFwKSkgeworICAgICAgICAgICAgICAgIFJFUVRJTUVTVEFUKCJhc2NfZGVxdWV1ZV9saXN0IiwgYXNjcSwgcmVxcCwgcmVxcC0+ZGV2aWNlLT5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworICAgIH0KKyAgICBpZiAobGFzdHBwKSB7CisgICAgICAgICpsYXN0cHAgPSBsYXN0cDsKKyAgICB9CisgICAgQVNDX0RCRzEoMywgImFzY19kZXF1ZXVlX2xpc3Q6IGZpcnN0cCAweCVseFxuIiwgKHVsb25nKSBmaXJzdHApOworICAgIHJldHVybiBmaXJzdHA7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCAnUkVRUCcgZnJvbSB0aGUgc3BlY2lmaWVkIHF1ZXVlIGZvcgorICogdGhlIHNwZWNpZmllZCB0YXJnZXQgZGV2aWNlLiBDbGVhciB0aGUgJ3RpZG1hc2snIGJpdCBmb3IgdGhlCisgKiBkZXZpY2UgaWYgbm8gbW9yZSBjb21tYW5kcyBhcmUgbGVmdCBxdWV1ZWQgZm9yIGl0LgorICoKKyAqICdSRVFQTkVYVChyZXFwKScgcmV0dXJucyByZXFwJ3MgdGhlIG5leHQgcG9pbnRlci4KKyAqCisgKiBSZXR1cm4gQVNDX1RSVUUgaWYgdGhlIGNvbW1hbmQgd2FzIGZvdW5kIGFuZCByZW1vdmVkLAorICogb3RoZXJ3aXNlIHJldHVybiBBU0NfRkFMU0UuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19ybXF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBSRVFQIHJlcXApCit7CisgICAgUkVRUCAgICAgICAgY3VycnAsIHByZXZwOworICAgIGludCAgICAgICAgIHRpZDsKKyAgICBpbnQgICAgICAgICByZXQgPSBBU0NfRkFMU0U7CisKKyAgICBBU0NfREJHMigzLCAiYXNjX3JtcXVldWU6IGFzY3EgMHglbHgsIHJlcXAgMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgYXNjcSwgKHVsb25nKSByZXFwKTsKKyAgICBBU0NfQVNTRVJUKHJlcXAgIT0gTlVMTCk7CisKKyAgICB0aWQgPSBSRVFQVElEKHJlcXApOworICAgIEFTQ19BU1NFUlQodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKTsKKworICAgIC8qCisgICAgICogSGFuZGxlIHRoZSBjb21tb24gY2FzZSBvZiAncmVxcCcgYmVpbmcgdGhlIGZpcnN0CisgICAgICogZW50cnkgb24gdGhlIHF1ZXVlLgorICAgICAqLworICAgIGlmIChyZXFwID09IGFzY3EtPnFfZmlyc3RbdGlkXSkgeworICAgICAgICByZXQgPSBBU0NfVFJVRTsKKyAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gUkVRUE5FWFQocmVxcCk7CisgICAgICAgIC8qIElmIHRoZSBxdWV1ZSBpcyBub3cgZW1wdHksIGNsZWFyIGl0cyBiaXQgYW5kIHRoZSBsYXN0IHBvaW50ZXIuICovCisgICAgICAgIGlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKyAgICAgICAgICAgIEFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gPT0gcmVxcCk7CisgICAgICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFzY3EtPnFfZmlyc3RbdGlkXSAhPSBOVUxMKSB7CisgICAgICAgIEFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gIT0gTlVMTCk7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlY2F1c2UgdGhlIGNhc2Ugb2YgJ3JlcXAnIGJlaW5nIHRoZSBmaXJzdCBlbnRyeSBoYXMgYmVlbgorICAgICAgICAgKiBoYW5kbGVkIGFib3ZlIGFuZCBpdCBpcyBrbm93biB0aGUgcXVldWUgaXMgbm90IGVtcHR5LCBpZgorICAgICAgICAgKiAncmVxcCcgaXMgZm91bmQgb24gdGhlIHF1ZXVlIGl0IGlzIGd1YXJhbnRlZWQgdGhlIHF1ZXVlIHdpbGwKKyAgICAgICAgICogbm90IGJlY29tZSBlbXB0eSBhbmQgdGhhdCAncV9maXJzdFt0aWRdJyB3aWxsIG5vdCBiZSBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBTZXQgJ3ByZXZwJyB0byB0aGUgZmlyc3QgZW50cnksICdjdXJycCcgdG8gdGhlIHNlY29uZCBlbnRyeSwKKyAgICAgICAgICogYW5kIHNlYXJjaCBmb3IgJ3JlcXAnLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChwcmV2cCA9IGFzY3EtPnFfZmlyc3RbdGlkXSwgY3VycnAgPSBSRVFQTkVYVChwcmV2cCk7CisgICAgICAgICAgICAgY3VycnA7IHByZXZwID0gY3VycnAsIGN1cnJwID0gUkVRUE5FWFQoY3VycnApKSB7CisgICAgICAgICAgICBpZiAoY3VycnAgPT0gcmVxcCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFTQ19UUlVFOworICAgICAgICAgICAgICAgIHByZXZwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilSRVFQTkVYVChjdXJycCk7CisgICAgICAgICAgICAgICAgcmVxcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGFzY3EtPnFfbGFzdFt0aWRdID09IHJlcXApIHsKKyAgICAgICAgICAgICAgICAgICAgYXNjcS0+cV9sYXN0W3RpZF0gPSBwcmV2cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyAgICAvKiBNYWludGFpbiByZXF1ZXN0IHF1ZXVlIHN0YXRpc3RpY3MuICovCisgICAgaWYgKHJldCA9PSBBU0NfVFJVRSkgeworICAgICAgICBhc2NxLT5xX2N1cl9jbnRbdGlkXS0tOworICAgICAgICBSRVFUSU1FU1RBVCgiYXNjX3JtcXVldWUiLCBhc2NxLCByZXFwLCB0aWQpOworICAgIH0KKyAgICBBU0NfQVNTRVJUKGFzY3EtPnFfY3VyX2NudFt0aWRdID49IDApOworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisgICAgQVNDX0RCRzIoMywgImFzY19ybXF1ZXVlOiByZXFwIDB4JWx4LCByZXQgJWRcbiIsICh1bG9uZykgcmVxcCwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRXhlY3V0ZSBhcyBtYW55IHF1ZXVlZCByZXF1ZXN0cyBhcyBwb3NzaWJsZSBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KKyAqCisgKiBDYWxscyBhc2NfZXhlY3V0ZV9zY3NpX2NtbmQoKSB0byBleGVjdXRlIGEgUkVRUC9zdHJ1Y3Qgc2NzaV9jbW5kLgorICovCitTVEFUSUMgdm9pZAorYXNjX2V4ZWN1dGVfcXVldWUoYXNjX3F1ZXVlX3QgKmFzY3EpCit7CisgICAgQURWX1NDU0lfQklUX0lEX1RZUEUgICAgc2Nhbl90aWRtYXNrOworICAgIFJFUVAgICAgICAgICAgICAgICAgICAgIHJlcXA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKworICAgIEFTQ19EQkcxKDEsICJhc2NfZXhlY3V0ZV9xdWV1ZTogYXNjcSAweCVseFxuIiwgKHVsb25nKSBhc2NxKTsKKyAgICAvKgorICAgICAqIEV4ZWN1dGUgcXVldWVkIGNvbW1hbmRzIGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvCisgICAgICogdGhlIGN1cnJlbnQgYm9hcmQgaW4gcm91bmQtcm9iaW4gZmFzaGlvbi4KKyAgICAgKi8KKyAgICBzY2FuX3RpZG1hc2sgPSBhc2NxLT5xX3RpZG1hc2s7CisgICAgZG8geworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzY2FuX3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcXAgPSBhc2NfZGVxdWV1ZShhc2NxLCBpKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzY2FuX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyhpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFzY19leGVjdXRlX3Njc2lfY21uZCgoc3RydWN0IHNjc2lfY21uZCAqKSByZXFwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEFTQ19CVVNZKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW5fdGlkbWFzayAmPSB+QURWX1RJRF9UT19USURNQVNLKGkpOworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcmVxdWVzdCByZXR1cm5lZCBBU0NfQlVTWS4gRW5xdWV1ZSBhdCB0aGUgZnJvbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICogdGFyZ2V0J3Mgd2FpdGluZyBsaXN0IHRvIG1haW50YWluIGNvcnJlY3Qgb3JkZXJpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBhc2NfZW5xdWV1ZShhc2NxLCByZXFwLCBBU0NfRlJPTlQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHNjYW5fdGlkbWFzayk7CisgICAgcmV0dXJuOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKy8qCisgKiBhc2NfcHJ0X2JvYXJkX2RldmljZXMoKQorICoKKyAqIFByaW50IGRyaXZlciBpbmZvcm1hdGlvbiBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGUgYm9hcmQuCisgKgorICogTm90ZTogbm8gc2luZ2xlIGxpbmUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBBU0NfUFJUTElORV9TSVpFLAorICogY2YuIGFzY19wcnRfbGluZSgpLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gJ2NwJy4gTm8gbW9yZSB0aGFuCisgKiAnY3BsZW4nIGNoYXJhY3RlcnMgd2lsbCBiZSBjb3BpZWQgdG8gJ2NwJy4KKyAqLworU1RBVElDIGludAorYXNjX3BydF9ib2FyZF9kZXZpY2VzKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGVmdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgaTsKKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkRldmljZSBJbmZvcm1hdGlvbiBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmNoaXBfc2NzaV9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuY2hpcF9zY3NpX2lkOworICAgIH0KKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlRhcmdldCBJRHMgRGV0ZWN0ZWQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmIChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYLCIsIGkpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICglWD1Ib3N0IEFkYXB0ZXIpXG4iLCBjaGlwX3Njc2lfaWQpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIERpc3BsYXkgV2lkZSBCb2FyZCBCSU9TIEluZm9ybWF0aW9uLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2Fkdl9iaW9zKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGVmdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICBsZW47CisgICAgdXNob3J0ICAgICAgICAgICAgIG1ham9yLCBtaW5vciwgbGV0dGVyOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGxlZnRsZW4gPSBjcGxlbjsKKyAgICB0b3RsZW4gPSBsZW4gPSAwOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG5ST00gQklPUyBWZXJzaW9uOiAiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIEJJT1Mgc2F2ZWQgYSB2YWxpZCBzaWduYXR1cmUsIHRoZW4gZmlsbCBpbgorICAgICAqIHRoZSBCSU9TIGNvZGUgc2VnbWVudCBiYXNlIGFkZHJlc3MuCisgICAgICovCisgICAgaWYgKGJvYXJkcC0+Ymlvc19zaWduYXR1cmUgIT0gMHg1NUFBKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIkRpc2FibGVkIG9yIFByZS0zLjFcbiIpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIkJJT1MgZWl0aGVyIGRpc2FibGVkIG9yIFByZS0zLjEuIElmIGl0IGlzIHByZS0zLjEsIHRoZW4gYSBuZXdlciB2ZXJzaW9uXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJjYW4gYmUgZm91bmQgYXQgdGhlIENvbm5lY3RDb20gRlRQIHNpdGU6IGZ0cDovL2Z0cC5jb25uZWN0Y29tLm5ldC9wdWJcbiIpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYWpvciA9IChib2FyZHAtPmJpb3NfdmVyc2lvbiA+PiAxMikgJiAweEY7CisgICAgICAgIG1pbm9yID0gKGJvYXJkcC0+Ymlvc192ZXJzaW9uID4+IDgpICYgMHhGOworICAgICAgICBsZXR0ZXIgPSAoYm9hcmRwLT5iaW9zX3ZlcnNpb24gJiAweEZGKTsKKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIlZC4lZCVjXG4iLAorICAgICAgICAgICAgbWFqb3IsIG1pbm9yLCBsZXR0ZXIgPj0gMjYgPyAnPycgOiBsZXR0ZXIgKyAnQScpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDdXJyZW50IGF2YWlsYWJsZSBST00gQklPUyByZWxlYXNlIGlzIDMuMUkgZm9yIFVXCisgICAgICAgICAqIGFuZCAzLjJJIGZvciBVMlcuIFRoaXMgY29kZSBkb2Vzbid0IGRpZmZlcmVudGlhdGUKKyAgICAgICAgICogVVcgYW5kIFUyVyBib2FyZHMuCisgICAgICAgICAqLworICAgICAgICBpZiAobWFqb3IgPCAzIHx8IChtYWpvciA8PSAzICYmIG1pbm9yIDwgMSkgfHwKKyAgICAgICAgICAgIChtYWpvciA8PSAzICYmIG1pbm9yIDw9IDEgJiYgbGV0dGVyIDwgKCdJJy0gJ0EnKSkpIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJOZXdlciB2ZXJzaW9uIG9mIFJPTSBCSU9TIGlzIGF2YWlsYWJsZSBhdCB0aGUgQ29ubmVjdENvbSBGVFAgc2l0ZTpcbiIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiZnRwOi8vZnRwLmNvbm5lY3Rjb20ubmV0L3B1YlxuIik7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0b3RsZW47Cit9CisKKy8qCisgKiBBZGQgc2VyaWFsIG51bWJlciB0byBpbmZvcm1hdGlvbiBiYXIgaWYgc2lnbmF0dXJlIEFBaAorICogaXMgZm91bmQgaW4gYXQgYml0IDE1LTkgKDcgYml0cykgb2Ygd29yZCAxLgorICoKKyAqIFNlcmlhbCBOdW1iZXIgY29uc2lzdHMgZm8gMTIgYWxwaGEtbnVtZXJpYyBkaWdpdHMuCisgKgorICogICAgICAgMSAtIFByb2R1Y3QgdHlwZSAoQSxCLEMsRC4uKSAgV29yZDA6IDE1LTEzICgzIGJpdHMpCisgKiAgICAgICAyIC0gTUZHIExvY2F0aW9uIChBLEIsQyxELi4pICBXb3JkMDogMTItMTAgKDMgYml0cykKKyAqICAgICAzLTQgLSBQcm9kdWN0IElEICgwLTk5KSAgICAgICAgIFdvcmQwOiA5LTAgKDEwIGJpdHMpCisgKiAgICAgICA1IC0gUHJvZHVjdCByZXZpc2lvbiAoQS1KKSAgICBXb3JkMDogICIgICAgICAgICAiCisgKgorICogICAgICAgICAgIFNpZ25hdHVyZSAgICAgICAgICAgICAgICAgV29yZDE6IDE1LTkgKDcgYml0cykKKyAqICAgICAgIDYgLSBZZWFyICgwLTkpICAgICAgICAgICAgICAgIFdvcmQxOiA4LTYgKDMgYml0cykgJiBXb3JkMjogMTUgKDEgYml0KQorICogICAgIDctOCAtIFdlZWsgb2YgdGhlIHllYXIgKDEtNTIpICAgV29yZDE6IDUtMCAoNiBiaXRzKQorICoKKyAqICAgIDktMTIgLSBTZXJpYWwgTnVtYmVyIChBMDAxLVo5OTkpIFdvcmQyOiAxNC0wICgxNSBiaXRzKQorICoKKyAqIE5vdGUgMTogT25seSBwcm9kdWN0aW9uIGNhcmRzIHdpbGwgaGF2ZSBhIHNlcmlhbCBudW1iZXIuCisgKgorICogTm90ZSAyOiBTaWduYXR1cmUgaXMgbW9zdCBzaWduaWZpY2FudCA3IGJpdHMgKDB4RkUpLgorICoKKyAqIFJldHVybnMgQVNDX1RSVUUgaWYgc2VyaWFsIG51bWJlciBmb3VuZCwgb3RoZXJ3aXNlIHJldHVybnMgQVNDX0ZBTFNFLgorICovCitTVEFUSUMgaW50Cithc2NfZ2V0X2VlcHJvbV9zdHJpbmcodXNob3J0ICpzZXJpYWxudW0sIHVjaGFyICpjcCkKK3sKKyAgICB1c2hvcnQgICAgICB3LCBudW07CisKKyAgICBpZiAoKHNlcmlhbG51bVsxXSAmIDB4RkUwMCkgIT0gKCh1c2hvcnQpIDB4QUEgPDwgOCkpIHsKKyAgICAgICAgcmV0dXJuIEFTQ19GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBGaXJzdCB3b3JkIC0gNiBkaWdpdHMuCisgICAgICAgICAqLworICAgICAgICB3ID0gc2VyaWFsbnVtWzBdOworCisgICAgICAgIC8qIFByb2R1Y3QgdHlwZSAtIDFzdCBkaWdpdC4gKi8KKyAgICAgICAgaWYgKCgqY3AgPSAnQScgKyAoKHcgJiAweEUwMDApID4+IDEzKSkgPT0gJ0gnKSB7CisgICAgICAgICAgICAvKiBQcm9kdWN0IHR5cGUgaXMgUD1Qcm90b3R5cGUgKi8KKyAgICAgICAgICAgICpjcCArPSAweDg7CisgICAgICAgIH0KKyAgICAgICAgY3ArKzsKKworICAgICAgICAvKiBNYW51ZmFjdHVyaW5nIGxvY2F0aW9uIC0gMm5kIGRpZ2l0LiAqLworICAgICAgICAqY3ArKyA9ICdBJyArICgodyAmIDB4MUMwMCkgPj4gMTApOworCisgICAgICAgIC8qIFByb2R1Y3QgSUQgLSAzcmQsIDR0aCBkaWdpdHMuICovCisgICAgICAgIG51bSA9IHcgJiAweDNGRjsKKyAgICAgICAgKmNwKysgPSAnMCcgKyAobnVtIC8gMTAwKTsKKyAgICAgICAgbnVtICU9IDEwMDsKKyAgICAgICAgKmNwKysgPSAnMCcgKyAobnVtIC8gMTApOworCisgICAgICAgIC8qIFByb2R1Y3QgcmV2aXNpb24gLSA1dGggZGlnaXQuICovCisgICAgICAgICpjcCsrID0gJ0EnICsgKG51bSAlIDEwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZWNvbmQgd29yZAorICAgICAgICAgKi8KKyAgICAgICAgdyA9IHNlcmlhbG51bVsxXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBZZWFyIC0gNnRoIGRpZ2l0LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBiaXQgMTUgb2YgdGhpcmQgd29yZCBpcyBzZXQsIHRoZW4gdGhlCisgICAgICAgICAqIGxhc3QgZGlnaXQgb2YgdGhlIHllYXIgaXMgZ3JlYXRlciB0aGFuIDcuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VyaWFsbnVtWzJdICYgMHg4MDAwKSB7CisgICAgICAgICAgICAqY3ArKyA9ICc4JyArICgodyAmIDB4MUMwKSA+PiA2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpjcCsrID0gJzAnICsgKCh3ICYgMHgxQzApID4+IDYpOworICAgICAgICB9CisKKyAgICAgICAgLyogV2VlayBvZiB5ZWFyIC0gN3RoLCA4dGggZGlnaXRzLiAqLworICAgICAgICBudW0gPSB3ICYgMHgwMDNGOworICAgICAgICAqY3ArKyA9ICcwJyArIG51bSAvIDEwOworICAgICAgICBudW0gJT0gMTA7CisgICAgICAgICpjcCsrID0gJzAnICsgbnVtOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXJkIHdvcmQKKyAgICAgICAgICovCisgICAgICAgIHcgPSBzZXJpYWxudW1bMl0gJiAweDdGRkY7CisKKyAgICAgICAgLyogU2VyaWFsIG51bWJlciAtIDl0aCBkaWdpdC4gKi8KKyAgICAgICAgKmNwKysgPSAnQScgKyAodyAvIDEwMDApOworCisgICAgICAgIC8qIDEwdGgsIDExdGgsIDEydGggZGlnaXRzLiAqLworICAgICAgICBudW0gPSB3ICUgMTAwMDsKKyAgICAgICAgKmNwKysgPSAnMCcgKyBudW0gLyAxMDA7CisgICAgICAgIG51bSAlPSAxMDA7CisgICAgICAgICpjcCsrID0gJzAnICsgbnVtIC8gMTA7CisgICAgICAgIG51bSAlPSAxMDsKKyAgICAgICAgKmNwKysgPSAnMCcgKyBudW07CisKKyAgICAgICAgKmNwID0gJ1wwJzsgICAgIC8qIE51bGwgVGVybWluYXRlIHRoZSBzdHJpbmcuICovCisgICAgICAgIHJldHVybiBBU0NfVFJVRTsKKyAgICB9Cit9CisKKy8qCisgKiBhc2NfcHJ0X2FzY19ib2FyZF9lZXByb20oKQorICoKKyAqIFByaW50IGJvYXJkIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICpib2FyZHA7CisgICAgQVNDX0RWQ19WQVIgICAgICAgICphc2NfZHZjX3ZhcnA7CisgICAgaW50ICAgICAgICAgICAgICAgIGxlZnRsZW47CisgICAgaW50ICAgICAgICAgICAgICAgIHRvdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgbGVuOworICAgIEFTQ0VFUF9DT05GSUcgICAgICAqZXA7CisgICAgaW50ICAgICAgICAgICAgICAgIGk7CisjaWZkZWYgQ09ORklHX0lTQQorICAgIGludCAgICAgICAgICAgICAgICBpc2FfZG1hX3NwZWVkW10gPSB7IDEwLCA4LCA3LCA2LCA1LCA0LCAzLCAyIH07CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworICAgIHVjaGFyICAgICAgICAgICAgICBzZXJpYWxzdHJbMTNdOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIGFzY19kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7CisgICAgZXAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFzY19lZXA7CisKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkVFUFJPTSBTZXR0aW5ncyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChhc2NfZ2V0X2VlcHJvbV9zdHJpbmcoKHVzaG9ydCAqKSAmZXAtPmFkYXB0ZXJfaW5mb1swXSwgc2VyaWFsc3RyKSA9PQorICAgICAgICBBU0NfVFJVRSkgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgU2VyaWFsIE51bWJlcjogJXNcbiIsIHNlcmlhbHN0cik7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlcC0+YWRhcHRlcl9pbmZvWzVdID09IDB4QkIpIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyAgICAgICAgICAgICAgICAiIERlZmF1bHQgU2V0dGluZ3MgVXNlZCBmb3IgRUVQUk9NLWxlc3MgQWRhcHRlci5cbiIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAgICAgIiBTZXJpYWwgTnVtYmVyIFNpZ25hdHVyZSBOb3QgUHJlc2VudC5cbiIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKyAgICAgICAgQVNDX0VFUF9HRVRfQ0hJUF9JRChlcCksIGVwLT5tYXhfdG90YWxfcW5nLCBlcC0+bWF4X3RhZ19xbmcpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBjbnRsIDB4JXgsIG5vX3NjYW0gMHgleFxuIiwKKyAgICAgICAgZXAtPmNudGwsIGVwLT5ub19zY2FtKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgVGFyZ2V0IElEOiAgICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlZCIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgRGlzY29ubmVjdHM6ICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisgICAgICAgICAgICAoZXAtPmRpc2NfZW5hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBDb21tYW5kIFF1ZXVpbmc6ICAgICAiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgIChlcC0+dXNlX2NtZF9xbmcgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIFN0YXJ0IE1vdG9yOiAgICAgICAgICIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorICAgICAgICAgICAgKGVwLT5zdGFydF9tb3RvciAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgU3luY2hyb25vdXMgVHJhbnNmZXI6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisgICAgICAgICAgICAoZXAtPmluaXRfc2R0ciAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBIb3N0IElTQSBETUEgc3BlZWQ6ICAgJWQgTUIvU1xuIiwKKyAgICAgICAgICAgIGlzYV9kbWFfc3BlZWRbQVNDX0VFUF9HRVRfRE1BX1NQRChlcCldKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKworICAgICByZXR1cm4gdG90bGVuOworfQorCisvKgorICogYXNjX3BydF9hZHZfYm9hcmRfZWVwcm9tKCkKKyAqCisgKiBQcmludCBib2FyZCBFRVBST00gY29uZmlndXJhdGlvbi4KKyAqCisgKiBOb3RlOiBubyBzaW5nbGUgbGluZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUsCisgKiBjZi4gYXNjX3BydF9saW5lKCkuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KKyAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2Fkdl9ib2FyZF9lZXByb20oc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgICAgICAqYm9hcmRwOworICAgIEFEVl9EVkNfVkFSICAgICAgICAgICAgICAgICAqYWR2X2R2Y192YXJwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB0b3RsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgKnRlcm1zdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbHN0clsxM107CisgICAgQURWRUVQXzM1NTBfQ09ORklHICAgICAgICAgICplcF8zNTUwID0gTlVMTDsKKyAgICBBRFZFRVBfMzhDMDgwMF9DT05GSUcgICAgICAgKmVwXzM4QzA4MDAgPSBOVUxMOworICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAgICAgICAqZXBfMzhDMTYwMCA9IE5VTEw7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIHdvcmQ7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgICp3b3JkcDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IDA7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisgICAgYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIGVwXzM1NTAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zNTUwX2VlcDsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICBlcF8zOEMwODAwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzhDMDgwMF9lZXA7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBlcF8zOEMxNjAwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzhDMTYwMF9lZXA7CisgICAgfQorCisgICAgbGVmdGxlbiA9IGNwbGVuOworICAgIHRvdGxlbiA9IGxlbiA9IDA7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiXG5FRVBST00gU2V0dGluZ3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsIHNocC0+aG9zdF9ubyk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIHdvcmRwID0gJmVwXzM1NTAtPnNlcmlhbF9udW1iZXJfd29yZDE7CisgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgd29yZHAgPSAmZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHdvcmRwID0gJmVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDE7CisgICAgfQorCisgICAgaWYgKGFzY19nZXRfZWVwcm9tX3N0cmluZyh3b3JkcCwgc2VyaWFsc3RyKSA9PSBBU0NfVFJVRSkgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgU2VyaWFsIE51bWJlcjogJXNcbiIsIHNlcmlhbHN0cik7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyAgICAgICAgICAgICIgU2VyaWFsIE51bWJlciBTaWduYXR1cmUgTm90IFByZXNlbnQuXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKyAgICAgICAgICAgIGVwXzM1NTAtPmFkYXB0ZXJfc2NzaV9pZCwgZXBfMzU1MC0+bWF4X2hvc3RfcW5nLAorICAgICAgICAgICAgZXBfMzU1MC0+bWF4X2R2Y19xbmcpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKyAgICAgICAgICAgIGVwXzM4QzA4MDAtPmFkYXB0ZXJfc2NzaV9pZCwgZXBfMzhDMDgwMC0+bWF4X2hvc3RfcW5nLAorICAgICAgICAgICAgZXBfMzhDMDgwMC0+bWF4X2R2Y19xbmcpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgSG9zdCBTQ1NJIElEOiAldSwgSG9zdCBRdWV1ZSBTaXplOiAldSwgRGV2aWNlIFF1ZXVlIFNpemU6ICV1XG4iLAorICAgICAgICAgICAgZXBfMzhDMTYwMC0+YWRhcHRlcl9zY3NpX2lkLCBlcF8zOEMxNjAwLT5tYXhfaG9zdF9xbmcsCisgICAgICAgICAgICBlcF8zOEMxNjAwLT5tYXhfZHZjX3FuZyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zNTUwLT50ZXJtaW5hdGlvbjsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMDgwMC0+dGVybWluYXRpb25fbHZkOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM4QzE2MDAtPnRlcm1pbmF0aW9uX2x2ZDsKKyAgICB9CisgICAgc3dpdGNoICh3b3JkKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHRlcm1zdHIgPSAiTG93IE9mZi9IaWdoIE9mZiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdGVybXN0ciA9ICJMb3cgT2ZmL0hpZ2ggT24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHRlcm1zdHIgPSAiTG93IE9uL0hpZ2ggT24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRlcm1zdHIgPSAiQXV0b21hdGljIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiB0ZXJtaW5hdGlvbjogJXUgKCVzKSwgYmlvc19jdHJsOiAweCV4XG4iLAorICAgICAgICAgICAgZXBfMzU1MC0+dGVybWluYXRpb24sIHRlcm1zdHIsIGVwXzM1NTAtPmJpb3NfY3RybCk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgdGVybWluYXRpb246ICV1ICglcyksIGJpb3NfY3RybDogMHgleFxuIiwKKyAgICAgICAgICAgIGVwXzM4QzA4MDAtPnRlcm1pbmF0aW9uX2x2ZCwgdGVybXN0ciwgZXBfMzhDMDgwMC0+Ymlvc19jdHJsKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIHRlcm1pbmF0aW9uOiAldSAoJXMpLCBiaW9zX2N0cmw6IDB4JXhcbiIsCisgICAgICAgICAgICBlcF8zOEMxNjAwLT50ZXJtaW5hdGlvbl9sdmQsIHRlcm1zdHIsIGVwXzM4QzE2MDAtPmJpb3NfY3RybCk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgVGFyZ2V0IElEOiAgICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWCIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM1NTAtPmRpc2NfZW5hYmxlOworICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zOEMwODAwLT5kaXNjX2VuYWJsZTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zOEMxNjAwLT5kaXNjX2VuYWJsZTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBEaXNjb25uZWN0czogICAgICAgICAiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgICh3b3JkICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzU1MC0+dGFncW5nX2FibGU7CisgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM4QzA4MDAtPnRhZ3FuZ19hYmxlOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgd29yZCA9IGVwXzM4QzE2MDAtPnRhZ3FuZ19hYmxlOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUXVldWluZzogICAgICIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorICAgICAgICAgICAgKHdvcmQgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zNTUwLT5zdGFydF9tb3RvcjsKKyAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMDgwMC0+c3RhcnRfbW90b3I7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMTYwMC0+c3RhcnRfbW90b3I7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgU3RhcnQgTW90b3I6ICAgICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisgICAgICAgICAgICAod29yZCAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBTeW5jaHJvbm91cyBUcmFuc2ZlcjoiKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgICAgICAoZXBfMzU1MC0+c2R0cl9hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKKyAgICB7CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgVWx0cmEgVHJhbnNmZXI6ICAgICAgIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKyAgICAgICAgICAgICAgICAoZXBfMzU1MC0+dWx0cmFfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzU1MC0+d2R0cl9hYmxlOworICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIHdvcmQgPSBlcF8zOEMwODAwLT53ZHRyX2FibGU7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICB3b3JkID0gZXBfMzhDMTYwMC0+d2R0cl9hYmxlOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIFdpZGUgVHJhbnNmZXI6ICAgICAgICIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorICAgICAgICAgICAgKHdvcmQgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCB8fAorICAgICAgICBhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBTeW5jaHJvbm91cyBUcmFuc2ZlciBTcGVlZCAoTWh6KTpcbiAgIik7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgKnNwZWVkX3N0cjsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHNkdHJfc3BlZWQgJiBBRFZfTUFYX1RJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6ICBzcGVlZF9zdHIgPSAiT2ZmIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAgc3BlZWRfc3RyID0gIiAgNSI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogIHNwZWVkX3N0ciA9ICIgMTAiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6ICBzcGVlZF9zdHIgPSAiIDIwIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiAgc3BlZWRfc3RyID0gIiA0MCI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogIHNwZWVkX3N0ciA9ICIgODAiOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBzcGVlZF9zdHIgPSAiVW5rIjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIlWDolcyAiLCBpLCBzcGVlZF9zdHIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgICAgICAgICBpZiAoaSA9PSA3KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuICAiKTsKKyAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPj49IDQ7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIGFzY19wcnRfZHJpdmVyX2NvbmYoKQorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfZHJpdmVyX2NvbmYoc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlZnRsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICB0b3RsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBjaGlwX3Njc2lfaWQ7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkxpbnV4IERyaXZlciBDb25maWd1cmF0aW9uIGFuZCBJbmZvcm1hdGlvbiBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwKKyAgICAgICAgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgaG9zdF9idXN5ICV1LCBsYXN0X3Jlc2V0ICV1LCBtYXhfaWQgJXUsIG1heF9sdW4gJXUsIG1heF9jaGFubmVsICV1XG4iLAorICAgICAgICBzaHAtPmhvc3RfYnVzeSwgc2hwLT5sYXN0X3Jlc2V0LCBzaHAtPm1heF9pZCwgc2hwLT5tYXhfbHVuLAorICAgICAgICBzaHAtPm1heF9jaGFubmVsKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgdW5pcXVlX2lkICVkLCBjYW5fcXVldWUgJWQsIHRoaXNfaWQgJWQsIHNnX3RhYmxlc2l6ZSAldSwgY21kX3Blcl9sdW4gJXVcbiIsCisgICAgICAgIHNocC0+dW5pcXVlX2lkLCBzaHAtPmNhbl9xdWV1ZSwgc2hwLT50aGlzX2lkLCBzaHAtPnNnX3RhYmxlc2l6ZSwKKyAgICAgICAgc2hwLT5jbWRfcGVyX2x1bik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIHVuY2hlY2tlZF9pc2FfZG1hICVkLCB1c2VfY2x1c3RlcmluZyAlZFxuIiwKKyAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSwgc2hwLT51c2VfY2x1c3RlcmluZyk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIGZsYWdzIDB4JXgsIGxhc3RfcmVzZXQgMHgleCwgamlmZmllcyAweCV4LCBhc2Nfbl9pb19wb3J0IDB4JXhcbiIsCisgICAgICAgIGJvYXJkcC0+ZmxhZ3MsIGJvYXJkcC0+bGFzdF9yZXNldCwgamlmZmllcywgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAvKiAnc2hwLT5uX2lvX3BvcnQnIG1heSBiZSB0cnVuY2F0ZWQgYmVjYXVzZSBpdCBpcyBvbmx5IG9uZSBieXRlLiAqLworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgaW9fcG9ydCAweCV4LCBuX2lvX3BvcnQgMHgleFxuIiwKKyAgICAgICAgc2hwLT5pb19wb3J0LCBzaHAtPm5faW9fcG9ydCk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIGNoaXBfc2NzaV9pZCA9IGJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZy5jaGlwX3Njc2lfaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyLmNoaXBfc2NzaV9pZDsKKyAgICB9CisKKyAgICByZXR1cm4gdG90bGVuOworfQorCisvKgorICogYXNjX3BydF9hc2NfYm9hcmRfaW5mbygpCisgKgorICogUHJpbnQgZHluYW1pYyBib2FyZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfYXNjX2JvYXJkX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlZnRsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICB0b3RsZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgQVNDX0RWQ19WQVIgICAgICAgICAgICAqdjsKKyAgICBBU0NfRFZDX0NGRyAgICAgICAgICAgICpjOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHJlbmVnb3RpYXRlID0gMDsKKworICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKKyAgICB2ID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKyAgICBjID0gJmJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZzsKKyAgICBjaGlwX3Njc2lfaWQgPSBjLT5jaGlwX3Njc2lfaWQ7CisKKyAgICBsZWZ0bGVuID0gY3BsZW47CisgICAgdG90bGVuID0gbGVuID0gMDsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyJcbkFzYyBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gYW5kIFN0YXRpc3RpY3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCisgICAgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgY2hpcF92ZXJzaW9uICV1LCBsaWJfdmVyc2lvbiAweCV4LCBsaWJfc2VyaWFsX25vICV1LCBtY29kZV9kYXRlIDB4JXhcbiIsCisgICAgICAgIGMtPmNoaXBfdmVyc2lvbiwgYy0+bGliX3ZlcnNpb24sIGMtPmxpYl9zZXJpYWxfbm8sIGMtPm1jb2RlX2RhdGUpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBtY29kZV92ZXJzaW9uIDB4JXgsIGVycl9jb2RlICV1XG4iLAorICAgICAgICAgYy0+bWNvZGVfdmVyc2lvbiwgdi0+ZXJyX2NvZGUpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgLyogQ3VycmVudCBudW1iZXIgb2YgY29tbWFuZHMgd2FpdGluZyBmb3IgdGhlIGhvc3QuICovCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBUb3RhbCBDb21tYW5kIFBlbmRpbmc6ICVkXG4iLCB2LT5jdXJfdG90YWxfcW5nKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgQ29tbWFuZCBRdWV1aW5nOiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisgICAgICAgICAgICBpLCAodi0+dXNlX3RhZ2dlZF9xbmcgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAvKiBDdXJyZW50IG51bWJlciBvZiBjb21tYW5kcyB3YWl0aW5nIGZvciBhIGRldmljZS4gKi8KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUXVldWUgUGVuZGluZzoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JXUiLCBpLCB2LT5jdXJfZHZjX3FuZ1tpXSk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgLyogQ3VycmVudCBsaW1pdCBvbiBudW1iZXIgb2YgY29tbWFuZHMgdGhhdCBjYW4gYmUgc2VudCB0byBhIGRldmljZS4gKi8KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUXVldWUgTGltaXQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiV1IiwgaSwgdi0+bWF4X2R2Y19xbmdbaV0pOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIC8qIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgcmV0dXJuZWQgcXVldWUgZnVsbCBzdGF0dXMuICovCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBDb21tYW5kIFF1ZXVlIEZ1bGw6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvYXJkcC0+cXVldWVfZnVsbCAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOlktJWQiLAorICAgICAgICAgICAgICAgIGksIGJvYXJkcC0+cXVldWVfZnVsbF9jbnRbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOk4iLCBpKTsKKyAgICAgICAgfQorICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgU3luY2hyb25vdXMgVHJhbnNmZXI6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKKyAgICAgICAgICAgIGksICh2LT5zZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKyAgICAgICAgdWNoYXIgc3luX3BlcmlvZF9peDsKKworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkgfHwKKyAgICAgICAgICAgICgodi0+aW5pdF9zZHRyICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgICVYOiIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBpZiAoKGJvYXJkcC0+c2R0cl9kYXRhW2ldICYgQVNDX1NZTl9NQVhfT0ZGU0VUKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQXN5bmNocm9ub3VzIik7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bl9wZXJpb2RfaXggPQorICAgICAgICAgICAgICAgIChib2FyZHAtPnNkdHJfZGF0YVtpXSA+PiA0KSAmICh2LT5tYXhfc2R0cl9pbmRleCAtIDEpOworCisgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAgICAgIiBUcmFuc2ZlciBQZXJpb2QgRmFjdG9yOiAlZCAoJWQuJWQgTWh6KSwiLAorICAgICAgICAgICAgICAgIHYtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSwKKyAgICAgICAgICAgICAgICAyNTAgLyB2LT5zZHRyX3BlcmlvZF90Ymxbc3luX3BlcmlvZF9peF0sCisgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygyNTAsIHYtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSkpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBSRVEvQUNLIE9mZnNldDogJWQiLAorICAgICAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW2ldICYgQVNDX1NZTl9NQVhfT0ZGU0VUKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh2LT5zZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIipcbiIpOworICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAxOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAocmVuZWdvdGlhdGUpCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAiICogPSBSZS1uZWdvdGlhdGlvbiBwZW5kaW5nIGJlZm9yZSBuZXh0IGNvbW1hbmQuXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIGFzY19wcnRfYWR2X2JvYXJkX2luZm8oKQorICoKKyAqIFByaW50IGR5bmFtaWMgYm9hcmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBubyBzaW5nbGUgbGluZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUsCisgKiBjZi4gYXNjX3BydF9saW5lKCkuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KKyAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2Fkdl9ib2FyZF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICAgICpib2FyZHA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBBRFZfRFZDX1ZBUiAgICAgICAgICAgICp2OworICAgIEFEVl9EVkNfQ0ZHICAgICAgICAgICAgKmM7CisgICAgQWR2UG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgIGxyYW13b3JkOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgbHJhbWJ5dGU7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICB0YWdxbmdfYWJsZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgIHNkdHJfYWJsZSwgd2R0cl9hYmxlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgd2R0cl9kb25lLCBzZHRyX2RvbmU7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICBwZXJpb2QgPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAwOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIHYgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworICAgIGMgPSAmYm9hcmRwLT5kdmNfY2ZnLmFkdl9kdmNfY2ZnOworICAgIGlvcF9iYXNlID0gdi0+aW9wX2Jhc2U7CisgICAgY2hpcF9zY3NpX2lkID0gdi0+Y2hpcF9zY3NpX2lkOworCisgICAgbGVmdGxlbiA9IGNwbGVuOworICAgIHRvdGxlbiA9IGxlbiA9IDA7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiXG5BZHYgTGlicmFyeSBDb25maWd1cmF0aW9uIGFuZCBTdGF0aXN0aWNzIGZvciBBZHZhblN5cyBTQ1NJIEhvc3QgJWQ6XG4iLAorICAgIHNocC0+aG9zdF9ubyk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIGlvcF9iYXNlIDB4JWx4LCBjYWJsZV9kZXRlY3Q6ICVYLCBlcnJfY29kZSAldVxuIiwKKyAgICAgICAgIHYtPmlvcF9iYXNlLAorICAgICAgICAgQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEpICYgQ0FCTEVfREVURUNULAorICAgICAgICAgdi0+ZXJyX2NvZGUpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBjaGlwX3ZlcnNpb24gJXUsIGxpYl92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleCwgbWNvZGVfdmVyc2lvbiAweCV4XG4iLAorICAgICAgICBjLT5jaGlwX3ZlcnNpb24sIGMtPmxpYl92ZXJzaW9uLCBjLT5tY29kZV9kYXRlLCBjLT5tY29kZV92ZXJzaW9uKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBRdWV1aW5nIEVuYWJsZWQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JWMiLAorICAgICAgICAgICAgaSwgKHRhZ3FuZ19hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgIH0KKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBRdWV1ZSBMaW1pdDoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgaSwgbHJhbWJ5dGUpOworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolZCIsIGksIGxyYW1ieXRlKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIENvbW1hbmQgUGVuZGluZzoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9RVUVVRURfQ01EICsgaSwgbHJhbWJ5dGUpOworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolZCIsIGksIGxyYW1ieXRlKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBXaWRlIEVuYWJsZWQ6Iik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisgICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JWMiLAorICAgICAgICAgICAgaSwgKHdkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfRE9ORSwgd2R0cl9kb25lKTsKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIFRyYW5zZmVyIEJpdCBXaWR0aDoiKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKyAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKyAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFVklDRV9IU0hLX0NGR19UQUJMRSArICgyICogaSksCisgICAgICAgICAgICBscmFtd29yZCk7CisKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVkIiwKKyAgICAgICAgICAgIGksIChscmFtd29yZCAmIDB4ODAwMCkgPyAxNiA6IDgpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBpZiAoKHdkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgJiYKKyAgICAgICAgICAgICh3ZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIioiKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiBTeW5jaHJvbm91cyBFbmFibGVkOiIpOworICAgIEFTQ19QUlRfTkVYVCgpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKKyAgICAgICAgICAgIGksIChzZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsIHNkdHJfZG9uZSk7CisgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFICsgKDIgKiBpKSwKKyAgICAgICAgICAgIGxyYW13b3JkKTsKKyAgICAgICAgbHJhbXdvcmQgJj0gfjB4ODAwMDsKKworICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkgfHwKKyAgICAgICAgICAgICgoc2R0cl9hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgICVYOiIsIGkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBpZiAoKGxyYW13b3JkICYgMHgxRikgPT0gMCkgLyogQ2hlY2sgZm9yIFJFUS9BQ0sgT2Zmc2V0IDAuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBBc3luY2hyb25vdXMiKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFRyYW5zZmVyIFBlcmlvZCBGYWN0b3I6ICIpOworICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAgICAgICAgIGlmICgobHJhbXdvcmQgJiAweDFGMDApID09IDB4MTEwMCkgLyogODAgTWh6ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiOSAoODAuMCBNaHopLCIpOworICAgICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgobHJhbXdvcmQgJiAweDFGMDApID09IDB4MTAwMCkgLyogNDAgTWh6ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiMTAgKDQwLjAgTWh6KSwiKTsKKyAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgICAgIH0gZWxzZSAvKiAyMCBNaHogb3IgYmVsb3cuICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVyaW9kID0gKCgobHJhbXdvcmQgPj4gOCkgKiAyNSkgKyA1MCkvNDsKKworICAgICAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gMCkgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiVkICg/IE1oeiksICIpOworICAgICAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlZCAoJWQuJWQgTWh6KSwiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kLCAyNTAvcGVyaW9kLCBBU0NfVEVOVEhTKDI1MCwgcGVyaW9kKSk7CisgICAgICAgICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFJFUS9BQ0sgT2Zmc2V0OiAlZCIsCisgICAgICAgICAgICAgICAgbHJhbXdvcmQgJiAweDFGKTsKKyAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIipcbiIpOworICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAxOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAocmVuZWdvdGlhdGUpCisgICAgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisgICAgICAgICAgICAiICogPSBSZS1uZWdvdGlhdGlvbiBwZW5kaW5nIGJlZm9yZSBuZXh0IGNvbW1hbmQuXG4iKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGxlbjsKK30KKworLyoKKyAqIGFzY19wcm9jX2NvcHkoKQorICoKKyAqIENvcHkgcHJvYyBpbmZvcm1hdGlvbiB0byBhIHJlYWQgYnVmZmVyIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQKKyAqIHJlYWQgb2Zmc2V0IGluIHRoZSBmaWxlIGFuZCB0aGUgcmVtYWluaW5nIHNwYWNlIGluIHRoZSByZWFkIGJ1ZmZlci4KKyAqLworU1RBVElDIGludAorYXNjX3Byb2NfY29weShvZmZfdCBhZHZvZmZzZXQsIG9mZl90IG9mZnNldCwgY2hhciAqY3VyYnVmLCBpbnQgbGVmdGxlbiwKKyAgICAgICAgICAgICAgY2hhciAqY3AsIGludCBjcGxlbikKK3sKKyAgICBpbnQgY250ID0gMDsKKworICAgIEFTQ19EQkczKDIsICJhc2NfcHJvY19jb3B5OiBvZmZzZXQgJWQsIGFkdm9mZnNldCAlZCwgY3BsZW4gJWRcbiIsCisgICAgICAgICAgICAodW5zaWduZWQpIG9mZnNldCwgKHVuc2lnbmVkKSBhZHZvZmZzZXQsIGNwbGVuKTsKKyAgICBpZiAob2Zmc2V0IDw9IGFkdm9mZnNldCkgeworICAgICAgICAvKiBSZWFkIG9mZnNldCBiZWxvdyBjdXJyZW50IG9mZnNldCwgY29weSBldmVyeXRoaW5nLiAqLworICAgICAgICBjbnQgPSBtaW4oY3BsZW4sIGxlZnRsZW4pOworICAgICAgICBBU0NfREJHMygyLCAiYXNjX3Byb2NfY29weTogY3VyYnVmIDB4JWx4LCBjcCAweCVseCwgY250ICVkXG4iLAorICAgICAgICAgICAgICAgICh1bG9uZykgY3VyYnVmLCAodWxvbmcpIGNwLCBjbnQpOworICAgICAgICBtZW1jcHkoY3VyYnVmLCBjcCwgY250KTsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IGFkdm9mZnNldCArIGNwbGVuKSB7CisgICAgICAgIC8qIFJlYWQgb2Zmc2V0IHdpdGhpbiBjdXJyZW50IHJhbmdlLCBwYXJ0aWFsIGNvcHkuICovCisgICAgICAgIGNudCA9IChhZHZvZmZzZXQgKyBjcGxlbikgLSBvZmZzZXQ7CisgICAgICAgIGNwID0gKGNwICsgY3BsZW4pIC0gY250OworICAgICAgICBjbnQgPSBtaW4oY250LCBsZWZ0bGVuKTsKKyAgICAgICAgQVNDX0RCRzMoMiwgImFzY19wcm9jX2NvcHk6IGN1cmJ1ZiAweCVseCwgY3AgMHglbHgsIGNudCAlZFxuIiwKKyAgICAgICAgICAgICAgICAodWxvbmcpIGN1cmJ1ZiwgKHVsb25nKSBjcCwgY250KTsKKyAgICAgICAgbWVtY3B5KGN1cmJ1ZiwgY3AsIGNudCk7CisgICAgfQorICAgIHJldHVybiBjbnQ7Cit9CisKKy8qCisgKiBhc2NfcHJ0X2xpbmUoKQorICoKKyAqIElmICdjcCcgaXMgTlVMTCBwcmludCB0byB0aGUgY29uc29sZSwgb3RoZXJ3aXNlIHByaW50IHRvIGEgYnVmZmVyLgorICoKKyAqIFJldHVybiAwIGlmIHByaW50aW5nIHRvIHRoZSBjb25zb2xlLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAqIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KKyAqCisgKiBOb3RlOiBJZiBhbnkgc2luZ2xlIGxpbmUgaXMgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUgYnl0ZXMgdGhlIHN0YWNrCisgKiB3aWxsIGJlIGNvcnJ1cHRlZC4gJ3NbXScgaXMgZGVmaW5lZCB0byBiZSBBU0NfUFJUTElORV9TSVpFIGJ5dGVzLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X2xpbmUoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGludCAgICAgICAgICAgIHJldDsKKyAgICBjaGFyICAgICAgICAgICBzW0FTQ19QUlRMSU5FX1NJWkVdOworCisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICByZXQgPSB2c3ByaW50ZihzLCBmbXQsIGFyZ3MpOworICAgIEFTQ19BU1NFUlQocmV0IDwgQVNDX1BSVExJTkVfU0laRSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICh2b2lkKSBwcmludGsocyk7CisgICAgICAgIHJldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbWluKGJ1ZmxlbiwgcmV0KTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgcywgcmV0KTsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCisvKgorICogLS0tIEZ1bmN0aW9ucyBSZXF1aXJlZCBieSB0aGUgQXNjIExpYnJhcnkKKyAqLworCisvKgorICogRGVsYXkgZm9yICduJyBtaWxsaXNlY29uZHMuIERvbid0IHVzZSB0aGUgJ2ppZmZpZXMnCisgKiBnbG9iYWwgdmFyaWFibGUgd2hpY2ggaXMgaW5jcmVtZW50ZWQgb25jZSBldmVyeSA1IG1zCisgKiBmcm9tIGEgdGltZXIgaW50ZXJydXB0LCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlCisgKiBjYWxsZWQgd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKyAqLworU1RBVElDIHZvaWQKK0R2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0RDTlQgbikKK3sKKyAgICBBU0NfREJHMSg0LCAiRHZjU2xlZXBNaWxsaVNlY29uZDogJWx1XG4iLCAodWxvbmcpIG4pOworICAgIG1kZWxheShuKTsKK30KKworLyoKKyAqIEN1cnJlbnRseSBhbmQgaW5saW5lIG5vb3AgYnV0IGxlYXZlIGFzIGEgcGxhY2Vob2xkZXIuCisgKiBMZWF2ZSBEdmNFbnRlckNyaXRpY2FsKCkgYXMgYSBub29wIHBsYWNlaG9sZGVyLgorICovCitTVEFUSUMgaW5saW5lIHVsb25nCitEdmNFbnRlckNyaXRpY2FsKHZvaWQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcml0aWNhbCBzZWN0aW9ucyBhcmUgYWxsIHByb3RlY3RlZCBieSB0aGUgYm9hcmQgc3BpbmxvY2suCisgKiBMZWF2ZSBEdmNMZWF2ZUNyaXRpY2FsKCkgYXMgYSBub29wIHBsYWNlaG9sZGVyLgorICovCitTVEFUSUMgaW5saW5lIHZvaWQKK0R2Y0xlYXZlQ3JpdGljYWwodWxvbmcgZmxhZ3MpCit7CisgICAgcmV0dXJuOworfQorCisvKgorICogdm9pZAorICogRHZjUHV0U2NzaVEoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICpvdXRidWYsIGludCB3b3JkcykKKyAqCisgKiBDYWxsaW5nL0V4aXQgU3RhdGU6CisgKiAgICBub25lCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgT3V0cHV0IGFuIEFTQ19TQ1NJX1Egc3RydWN0dXJlIHRvIHRoZSBjaGlwCisgKi8KK1NUQVRJQyB2b2lkCitEdmNQdXRTY3NpUShQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IHNfYWRkciwgdWNoYXIgKm91dGJ1ZiwgaW50IHdvcmRzKQoreworICAgIGludCAgICBpOworCisgICAgQVNDX0RCR19QUlRfSEVYKDIsICJEdmNQdXRTY3NpUSIsIG91dGJ1ZiwgMiAqIHdvcmRzKTsKKyAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHNfYWRkcik7CisgICAgZm9yIChpID0gMDsgaSA8IDIgKiB3b3JkczsgaSArPSAyKSB7CisgICAgICAgIGlmIChpID09IDQgfHwgaSA9PSAyMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEsCisgICAgICAgICAgICAoKHVzaG9ydCkgb3V0YnVmW2kgKyAxXSA8PCA4KSB8IG91dGJ1ZltpXSk7CisgICAgfQorfQorCisvKgorICogdm9pZAorICogRHZjR2V0UWluZm8oUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICppbmJ1ZiwgaW50IHdvcmRzKQorICoKKyAqIENhbGxpbmcvRXhpdCBTdGF0ZToKKyAqICAgIG5vbmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBJbnB1dCBhbiBBU0NfUURPTkVfSU5GTyBzdHJ1Y3R1cmUgZnJvbSB0aGUgY2hpcAorICovCitTVEFUSUMgdm9pZAorRHZjR2V0UWluZm8oUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICppbmJ1ZiwgaW50IHdvcmRzKQoreworICAgIGludCAgICBpOworICAgIHVzaG9ydCB3b3JkOworCisgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCAyICogd29yZHM7IGkgKz0gMikgeworICAgICAgICBpZiAoaSA9PSAxMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgd29yZCA9IGlucHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEpOworICAgICAgICBpbmJ1ZltpXSA9IHdvcmQgJiAweGZmOworICAgICAgICBpbmJ1ZltpICsgMV0gPSAod29yZCA+PiA4KSAmIDB4ZmY7CisgICAgfQorICAgIEFTQ19EQkdfUFJUX0hFWCgyLCAiRHZjR2V0UWluZm8iLCBpbmJ1ZiwgMiAqIHdvcmRzKTsKK30KKworLyoKKyAqIFJlYWQgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgorICovCitTVEFUSUMgdWNoYXIgX19pbml0CitEdmNSZWFkUENJQ29uZmlnQnl0ZSgKKyAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgIHVzaG9ydCBvZmZzZXQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIHVjaGFyIGJ5dGVfZGF0YTsKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCAmYnl0ZV9kYXRhKTsKKyAgICByZXR1cm4gYnl0ZV9kYXRhOworI2Vsc2UgLyogIWRlZmluZWQoQ09ORklHX1BDSSkgKi8KKyAgICByZXR1cm4gMDsKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUENJKSAqLworfQorCisvKgorICogV3JpdGUgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgorICovCitTVEFUSUMgdm9pZCBfX2luaXQKK0R2Y1dyaXRlUENJQ29uZmlnQnl0ZSgKKyAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgIHVzaG9ydCBvZmZzZXQsCisgICAgICAgIHVjaGFyICBieXRlX2RhdGEpCit7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCBieXRlX2RhdGEpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KK30KKworLyoKKyAqIFJldHVybiB0aGUgQklPUyBhZGRyZXNzIG9mIHRoZSBhZGFwdGVyIGF0IHRoZSBzcGVjaWZpZWQKKyAqIEkvTyBwb3J0IGFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgYnVzIHR5cGUuCisgKi8KK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NHZXRDaGlwQmlvc0FkZHJlc3MoCisgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCit7CisgICAgdXNob3J0ICBjZmdfbHN3OworICAgIHVzaG9ydCAgYmlvc19hZGRyOworCisgICAgLyoKKyAgICAgKiBUaGUgUENJIEJJT1MgaXMgcmUtbG9jYXRlZCBieSB0aGUgbW90aGVyYm9hcmQgQklPUy4gQmVjYXVzZQorICAgICAqIG9mIHRoaXMgdGhlIGRyaXZlciBjYW4gbm90IGRldGVybWluZSB3aGVyZSBhIFBDSSBCSU9TIGlzCisgICAgICogbG9hZGVkIGFuZCBleGVjdXRlcy4KKyAgICAgKi8KKyAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfUENJKQorICAgIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZigoYnVzX3R5cGUgJiBBU0NfSVNfRUlTQSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNmZ19sc3cgPSBBc2NHZXRFaXNhQ2hpcENmZyhpb3BfYmFzZSk7CisgICAgICAgIGNmZ19sc3cgJj0gMHgwMDBGOworICAgICAgICBiaW9zX2FkZHIgPSAodXNob3J0KShBU0NfQklPU19NSU5fQUREUiAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ZnX2xzdyAqIEFTQ19CSU9TX0JBTktfU0laRSkpOworICAgICAgICByZXR1cm4oYmlvc19hZGRyKTsKKyAgICB9LyogaWYgKi8KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKyAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisKKyAgICAvKgorICAgICogIElTQSBQblAgdXNlcyB0aGUgdG9wIGJpdCBhcyB0aGUgMzJLIEJJT1MgZmxhZworICAgICovCisgICAgaWYgKGJ1c190eXBlID09IEFTQ19JU19JU0FQTlApCisgICAgeworICAgICAgICBjZmdfbHN3ICY9IDB4N0ZGRjsKKyAgICB9LyogaWYgKi8KKworICAgIGJpb3NfYWRkciA9ICh1c2hvcnQpKCgoY2ZnX2xzdyA+PiAxMikgKiBBU0NfQklPU19CQU5LX1NJWkUpICsKKyAgICAgICAgICAgIEFTQ19CSU9TX01JTl9BRERSKTsKKyAgICByZXR1cm4oYmlvc19hZGRyKTsKK30KKworCisvKgorICogLS0tIEZ1bmN0aW9ucyBSZXF1aXJlZCBieSB0aGUgQWR2IExpYnJhcnkKKyAqLworCisvKgorICogRHZjR2V0UGh5QWRkcigpCisgKgorICogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mICd2YWRkcicgYW5kIHNldCAnKmxlbnAnIHRvIHRoZQorICogbnVtYmVyIG9mIHBoeXNpY2FsbHkgY29udGlndW91cyBieXRlcyB0aGF0IGZvbGxvdyAndmFkZHInLgorICogJ2ZsYWcnIGluZGljYXRlcyB0aGUgdHlwZSBvZiBzdHJ1Y3R1cmUgd2hvc2UgcGh5c2ljYWwgYWRkcmVzcworICogaXMgYmVpbmcgdHJhbnNsYXRlZC4KKyAqCisgKiBOb3RlOiBCZWNhdXNlIExpbnV4IGN1cnJlbnRseSBkb2Vzbid0IHBhZ2UgdGhlIGtlcm5lbCBhbmQgYWxsCisgKiBrZXJuZWwgYnVmZmVycyBhcmUgcGh5c2ljYWxseSBjb250aWd1b3VzLCBsZWF2ZSAnKmxlbnAnIHVuY2hhbmdlZC4KKyAqLworQURWX1BBRERSCitEdmNHZXRQaHlBZGRyKEFEVl9EVkNfVkFSICphc2NfZHZjLCBBRFZfU0NTSV9SRVFfUSAqc2NzaXEsCisgICAgICAgIHVjaGFyICp2YWRkciwgQURWX1NEQ05UICpsZW5wLCBpbnQgZmxhZykKK3sKKyAgICBBRFZfUEFERFIgICAgICAgICAgIHBhZGRyOworCisgICAgcGFkZHIgPSB2aXJ0X3RvX2J1cyh2YWRkcik7CisKKyAgICBBU0NfREJHNCg0LAorICAgICAgICAiRHZjR2V0UGh5QWRkcjogdmFkZHIgMHglbHgsIGxlbnAgMHglbHggKmxlbnAgJWx1LCBwYWRkciAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSB2YWRkciwgKHVsb25nKSBsZW5wLCAodWxvbmcpICooKHVsb25nICopIGxlbnApLCAodWxvbmcpIHBhZGRyKTsKKworICAgIHJldHVybiBwYWRkcjsKK30KKworLyoKKyAqIFJlYWQgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgorICovCitTVEFUSUMgdWNoYXIgX19pbml0CitEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZSgKKyAgICAgICAgQURWX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgIHVzaG9ydCBvZmZzZXQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIHVjaGFyIGJ5dGVfZGF0YTsKKyAgICBwY2lfcmVhZF9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCAmYnl0ZV9kYXRhKTsKKyAgICByZXR1cm4gYnl0ZV9kYXRhOworI2Vsc2UgLyogQ09ORklHX1BDSSAqLworICAgIHJldHVybiAwOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KK30KKworLyoKKyAqIFdyaXRlIGEgUENJIGNvbmZpZ3VyYXRpb24gYnl0ZS4KKyAqLworU1RBVElDIHZvaWQgX19pbml0CitEdmNBZHZXcml0ZVBDSUNvbmZpZ0J5dGUoCisgICAgICAgIEFEVl9EVkNfVkFSICphc2NfZHZjLAorICAgICAgICB1c2hvcnQgb2Zmc2V0LAorICAgICAgICB1Y2hhciAgYnl0ZV9kYXRhKQoreworI2lmZGVmIENPTkZJR19QQ0kKKyAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUodG9fcGNpX2Rldihhc2NfZHZjLT5jZmctPmRldiksIG9mZnNldCwgYnl0ZV9kYXRhKTsKKyNlbHNlIC8qIENPTkZJR19QQ0kgKi8KKyAgICByZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworfQorCisvKgorICogLS0tIFRyYWNpbmcgYW5kIERlYnVnZ2luZyBGdW5jdGlvbnMKKyAqLworCisjaWZkZWYgQURWQU5TWVNfU1RBVFMKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyoKKyAqIGFzY19wcnRfYm9hcmRfc3RhdHMoKQorICoKKyAqIE5vdGU6IG5vIHNpbmdsZSBsaW5lIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gQVNDX1BSVExJTkVfU0laRSwKKyAqIGNmLiBhc2NfcHJ0X2xpbmUoKS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgorICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCisgKi8KK1NUQVRJQyBpbnQKK2FzY19wcnRfYm9hcmRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVmdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHRvdGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBzdHJ1Y3QgYXNjX3N0YXRzICAgICAgICpzOworICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKworICAgIGxlZnRsZW4gPSBjcGxlbjsKKyAgICB0b3RsZW4gPSBsZW4gPSAwOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworICAgIHMgPSAmYm9hcmRwLT5hc2Nfc3RhdHM7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiXG5MaW51eCBEcml2ZXIgU3RhdGlzdGljcyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgcXVldWVjb21tYW5kICVsdSwgcmVzZXQgJWx1LCBiaW9zcGFyYW0gJWx1LCBpbnRlcnJ1cHQgJWx1XG4iLAorICAgICAgICBzLT5xdWV1ZWNvbW1hbmQsIHMtPnJlc2V0LCBzLT5iaW9zcGFyYW0sIHMtPmludGVycnVwdCk7CisgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisiIGNhbGxiYWNrICVsdSwgZG9uZSAlbHUsIGJ1aWxkX2Vycm9yICVsdSwgYnVpbGRfbm9yZXEgJWx1LCBidWlsZF9ub3NnICVsdVxuIiwKKyAgICAgICAgcy0+Y2FsbGJhY2ssIHMtPmRvbmUsIHMtPmJ1aWxkX2Vycm9yLCBzLT5hZHZfYnVpbGRfbm9yZXEsCisgICAgICAgIHMtPmFkdl9idWlsZF9ub3NnKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgZXhlX25vZXJyb3IgJWx1LCBleGVfYnVzeSAlbHUsIGV4ZV9lcnJvciAlbHUsIGV4ZV91bmtub3duICVsdVxuIiwKKyAgICAgICAgcy0+ZXhlX25vZXJyb3IsIHMtPmV4ZV9idXN5LCBzLT5leGVfZXJyb3IsIHMtPmV4ZV91bmtub3duKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworICAgIC8qCisgICAgICogRGlzcGxheSBkYXRhIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgaWYgKHMtPmNvbnRfY250ID4gMCkgeworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgY29udF9jbnQgJWx1LCAiLCBzLT5jb250X2NudCk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgImNvbnRfeGZlciAlbHUuJTAxbHUga2IgIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29udF94ZmVyLzIsCisgICAgICAgICAgICAgICAgICAgIEFTQ19URU5USFMocy0+Y29udF94ZmVyLCAyKSk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgIC8qIENvbnRpZ3VvdXMgdHJhbnNmZXIgYXZlcmFnZSBzaXplICovCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgImF2Z194ZmVyICVsdS4lMDFsdSBrYlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHMtPmNvbnRfeGZlci8yKS9zLT5jb250X2NudCwKKyAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygocy0+Y29udF94ZmVyLzIpLCBzLT5jb250X2NudCkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKyAgICB9CisKKyAgICBpZiAocy0+c2dfY250ID4gMCkgeworCisgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBzZ19jbnQgJWx1LCBzZ19lbGVtICVsdSwgIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2dfY250LCBzLT5zZ19lbGVtKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisKKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAic2dfeGZlciAlbHUuJTAxbHUga2JcbiIsCisgICAgICAgICAgICAgICAgICAgIHMtPnNnX3hmZXIvMiwKKyAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUyhzLT5zZ194ZmVyLCAyKSk7CisgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgIC8qIFNjYXR0ZXIgZ2F0aGVyIHRyYW5zZmVyIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIGF2Z19udW1fZWxlbSAlbHUuJTAxbHUsICIsCisgICAgICAgICAgICAgICAgICAgIHMtPnNnX2VsZW0vcy0+c2dfY250LAorICAgICAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKHMtPnNnX2VsZW0sIHMtPnNnX2NudCkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJhdmdfZWxlbV9zaXplICVsdS4lMDFsdSBrYiwgIiwKKyAgICAgICAgICAgICAgICAgICAgKHMtPnNnX3hmZXIvMikvcy0+c2dfZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygocy0+c2dfeGZlci8yKSwgcy0+c2dfZWxlbSkpOworICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJhdmdfeGZlcl9zaXplICVsdS4lMDFsdSBrYlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHMtPnNnX3hmZXIvMikvcy0+c2dfY250LAorICAgICAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKChzLT5zZ194ZmVyLzIpLCBzLT5zZ19jbnQpKTsKKyAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwbGF5IHJlcXVlc3QgcXVldWluZyBzdGF0aXN0aWNzLgorICAgICAqLworICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKyIgQWN0aXZlIGFuZCBXYWl0aW5nIFJlcXVlc3QgUXVldWVzIChUaW1lIFVuaXQ6ICVkIEhaKTpcbiIsIEhaKTsKKyAgICBBU0NfUFJUX05FWFQoKTsKKworCisgICAgIHJldHVybiB0b3RsZW47Cit9CisKKy8qCisgKiBhc2NfcHJ0X3RhcmdldF9zdGF0cygpCisgKgorICogTm90ZTogbm8gc2luZ2xlIGxpbmUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBBU0NfUFJUTElORV9TSVpFLAorICogY2YuIGFzY19wcnRfbGluZSgpLgorICoKKyAqIFRoaXMgaXMgc2VwYXJhdGVkIGZyb20gYXNjX3BydF9ib2FyZF9zdGF0cyBiZWNhdXNlIGEgZnVsbCBzZXQKKyAqIG9mIHRhcmdldHMgd2lsbCBvdmVyZmxvdyBBU0NfUFJUQlVGX1NJWkUuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KKyAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgorICovCitTVEFUSUMgaW50Cithc2NfcHJ0X3RhcmdldF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGludCB0Z3RfaWQsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIHN0cnVjdCBhc2Nfc3RhdHMgICAgICAgKnM7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICBjaGlwX3Njc2lfaWQ7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICAgICAqYm9hcmRwOworICAgIGFzY19xdWV1ZV90ICAgICAgICAgICAgKmFjdGl2ZTsKKyAgICBhc2NfcXVldWVfdCAgICAgICAgICAgICp3YWl0aW5nOworCisgICAgbGVmdGxlbiA9IGNwbGVuOworICAgIHRvdGxlbiA9IGxlbiA9IDA7CisKKyAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisgICAgcyA9ICZib2FyZHAtPmFzY19zdGF0czsKKworICAgIGFjdGl2ZSA9ICZBU0NfQk9BUkRQKHNocCktPmFjdGl2ZTsKKyAgICB3YWl0aW5nID0gJkFTQ19CT0FSRFAoc2hwKS0+d2FpdGluZzsKKworICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKyAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmNoaXBfc2NzaV9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuY2hpcF9zY3NpX2lkOworICAgIH0KKworICAgIGlmICgoY2hpcF9zY3NpX2lkID09IHRndF9pZCkgfHwKKyAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyh0Z3RfaWQpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmIChhY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdID4gMCB8fCB3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSA+IDApIHsKKyAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiB0YXJnZXQgJWRcbiIsIHRndF9pZCk7CisgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKworICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiAgIGFjdGl2ZTogY250IFtjdXIgJWQsIG1heCAlZCwgdG90ICV1XSwgdGltZSBbbWluICVkLCBtYXggJWQsIGF2ZyAlbHUuJTAxbHVdXG4iLAorICAgICAgICAgICAgICAgIGFjdGl2ZS0+cV9jdXJfY250W3RndF9pZF0sIGFjdGl2ZS0+cV9tYXhfY250W3RndF9pZF0sCisgICAgICAgICAgICAgICAgYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSwKKyAgICAgICAgICAgICAgICBhY3RpdmUtPnFfbWluX3RpbVt0Z3RfaWRdLCBhY3RpdmUtPnFfbWF4X3RpbVt0Z3RfaWRdLAorICAgICAgICAgICAgICAgIChhY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdID09IDApID8gMCA6CisgICAgICAgICAgICAgICAgKGFjdGl2ZS0+cV90b3RfdGltW3RndF9pZF0vYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSksCisgICAgICAgICAgICAgICAgKGFjdGl2ZS0+cV90b3RfY250W3RndF9pZF0gPT0gMCkgPyAwIDoKKyAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKGFjdGl2ZS0+cV90b3RfdGltW3RndF9pZF0sCisgICAgICAgICAgICAgICAgYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSkpOworICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworCisgICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorIiAgIHdhaXRpbmc6IGNudCBbY3VyICVkLCBtYXggJWQsIHRvdCAldV0sIHRpbWUgW21pbiAldSwgbWF4ICV1LCBhdmcgJWx1LiUwMWx1XVxuIiwKKyAgICAgICAgICAgICAgICB3YWl0aW5nLT5xX2N1cl9jbnRbdGd0X2lkXSwgd2FpdGluZy0+cV9tYXhfY250W3RndF9pZF0sCisgICAgICAgICAgICAgICAgd2FpdGluZy0+cV90b3RfY250W3RndF9pZF0sCisgICAgICAgICAgICAgICAgd2FpdGluZy0+cV9taW5fdGltW3RndF9pZF0sIHdhaXRpbmctPnFfbWF4X3RpbVt0Z3RfaWRdLAorICAgICAgICAgICAgICAgICh3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSA9PSAwKSA/IDAgOgorICAgICAgICAgICAgICAgICh3YWl0aW5nLT5xX3RvdF90aW1bdGd0X2lkXS93YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSksCisgICAgICAgICAgICAgICAgKHdhaXRpbmctPnFfdG90X2NudFt0Z3RfaWRdID09IDApID8gMCA6CisgICAgICAgICAgICAgICAgQVNDX1RFTlRIUyh3YWl0aW5nLT5xX3RvdF90aW1bdGd0X2lkXSwKKyAgICAgICAgICAgICAgICB3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSkpOworICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICAgcmV0dXJuIHRvdGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCisKKyNpZmRlZiBBRFZBTlNZU19ERUJVRworLyoKKyAqIGFzY19wcnRfc2NzaV9ob3N0KCkKKyAqLworU1RBVElDIHZvaWQKK2FzY19wcnRfc2NzaV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnMpCit7CisgICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOworCisgICAgYm9hcmRwID0gQVNDX0JPQVJEUChzKTsKKworICAgIHByaW50aygiU2NzaV9Ib3N0IGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcyk7CisgICAgcHJpbnRrKAorIiBob3N0X2J1c3kgJXUsIGhvc3Rfbm8gJWQsIGxhc3RfcmVzZXQgJWQsXG4iLAorICAgICAgICBzLT5ob3N0X2J1c3ksIHMtPmhvc3Rfbm8sCisgICAgICAgICh1bnNpZ25lZCkgcy0+bGFzdF9yZXNldCk7CisKKyAgICBwcmludGsoCisiIGJhc2UgMHglbHgsIGlvX3BvcnQgMHglbHgsIG5faW9fcG9ydCAldSwgaXJxIDB4JXgsXG4iLAorICAgICAgICAodWxvbmcpIHMtPmJhc2UsICh1bG9uZykgcy0+aW9fcG9ydCwgcy0+bl9pb19wb3J0LCBzLT5pcnEpOworCisgICAgcHJpbnRrKAorIiBkbWFfY2hhbm5lbCAlZCwgdGhpc19pZCAlZCwgY2FuX3F1ZXVlICVkLFxuIiwKKyAgICAgICAgcy0+ZG1hX2NoYW5uZWwsIHMtPnRoaXNfaWQsIHMtPmNhbl9xdWV1ZSk7CisKKyAgICBwcmludGsoCisiIGNtZF9wZXJfbHVuICVkLCBzZ190YWJsZXNpemUgJWQsIHVuY2hlY2tlZF9pc2FfZG1hICVkXG4iLAorICAgICAgICBzLT5jbWRfcGVyX2x1biwgcy0+c2dfdGFibGVzaXplLCBzLT51bmNoZWNrZWRfaXNhX2RtYSk7CisKKyAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisgICAgICAgIGFzY19wcnRfYXNjX2R2Y192YXIoJkFTQ19CT0FSRFAocyktPmR2Y192YXIuYXNjX2R2Y192YXIpOworICAgICAgICBhc2NfcHJ0X2FzY19kdmNfY2ZnKCZBU0NfQk9BUkRQKHMpLT5kdmNfY2ZnLmFzY19kdmNfY2ZnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc2NfcHJ0X2Fkdl9kdmNfdmFyKCZBU0NfQk9BUkRQKHMpLT5kdmNfdmFyLmFkdl9kdmNfdmFyKTsKKyAgICAgICAgYXNjX3BydF9hZHZfZHZjX2NmZygmQVNDX0JPQVJEUChzKS0+ZHZjX2NmZy5hZHZfZHZjX2NmZyk7CisgICAgfQorfQorCisvKgorICogYXNjX3BydF9zY3NpX2NtbmQoKQorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9zY3NpX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqcykKK3sKKyAgICBwcmludGsoInN0cnVjdCBzY3NpX2NtbmQgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBzKTsKKworICAgIHByaW50aygKKyIgaG9zdCAweCVseCwgZGV2aWNlIDB4JWx4LCB0YXJnZXQgJXUsIGx1biAldSwgY2hhbm5lbCAldSxcbiIsCisgICAgICAgICh1bG9uZykgcy0+ZGV2aWNlLT5ob3N0LCAodWxvbmcpIHMtPmRldmljZSwgcy0+ZGV2aWNlLT5pZCwgcy0+ZGV2aWNlLT5sdW4sCisgICAgICAgIHMtPmRldmljZS0+Y2hhbm5lbCk7CisKKyAgICBhc2NfcHJ0X2hleCgiIENEQiIsIHMtPmNtbmQsIHMtPmNtZF9sZW4pOworCisgICAgcHJpbnRrICgKKyJzY19kYXRhX2RpcmVjdGlvbiAldSwgcmVzaWQgJWRcbiIsCisgICAgICAgIHMtPnNjX2RhdGFfZGlyZWN0aW9uLCBzLT5yZXNpZCk7CisKKyAgICBwcmludGsoCisiIHVzZV9zZyAldSwgc2dsaXN0X2xlbiAldSwgYWJvcnRfcmVhc29uIDB4JXhcbiIsCisgICAgICAgIHMtPnVzZV9zZywgcy0+c2dsaXN0X2xlbiwgcy0+YWJvcnRfcmVhc29uKTsKKworICAgIHByaW50aygKKyIgc2VyaWFsX251bWJlciAweCV4LCBzZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgMHgleCwgcmV0cmllcyAlZCwgYWxsb3dlZCAlZFxuIiwKKyAgICAgICAgKHVuc2lnbmVkKSBzLT5zZXJpYWxfbnVtYmVyLCAodW5zaWduZWQpIHMtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCwKKyAgICAgICAgIHMtPnJldHJpZXMsIHMtPmFsbG93ZWQpOworCisgICAgcHJpbnRrKAorIiB0aW1lb3V0X3Blcl9jb21tYW5kICVkLCB0aW1lb3V0X3RvdGFsICVkLCB0aW1lb3V0ICVkXG4iLAorICAgICAgICBzLT50aW1lb3V0X3Blcl9jb21tYW5kLCBzLT50aW1lb3V0X3RvdGFsLCBzLT50aW1lb3V0KTsKKworICAgIHByaW50aygiIGludGVybmFsX3RpbWVvdXQgJXVcbiIsIHMtPmludGVybmFsX3RpbWVvdXQpOworCisgICAgcHJpbnRrKAorIiBzY3NpX2RvbmUgMHglbHgsIGRvbmUgMHglbHgsIGhvc3Rfc2NyaWJibGUgMHglbHgsIHJlc3VsdCAweCV4XG4iLAorICAgICAgICAodWxvbmcpIHMtPnNjc2lfZG9uZSwgKHVsb25nKSBzLT5kb25lLAorICAgICAgICAodWxvbmcpIHMtPmhvc3Rfc2NyaWJibGUsIHMtPnJlc3VsdCk7CisKKyAgICBwcmludGsoCisiIHRhZyAldSwgcGlkICV1XG4iLAorICAgICAgICAodW5zaWduZWQpIHMtPnRhZywgKHVuc2lnbmVkKSBzLT5waWQpOworfQorCisvKgorICogYXNjX3BydF9hc2NfZHZjX3ZhcigpCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2FzY19kdmNfdmFyKEFTQ19EVkNfVkFSICpoKQoreworICAgIHByaW50aygiQVNDX0RWQ19WQVIgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBoKTsKKworICAgIHByaW50aygKKyIgaW9wX2Jhc2UgMHgleCwgZXJyX2NvZGUgMHgleCwgZHZjX2NudGwgMHgleCwgYnVnX2ZpeF9jbnRsICVkLFxuIiwKKyAgICAgICAgaC0+aW9wX2Jhc2UsIGgtPmVycl9jb2RlLCBoLT5kdmNfY250bCwgaC0+YnVnX2ZpeF9jbnRsKTsKKworICAgIHByaW50aygKKyIgYnVzX3R5cGUgJWQsIGlzcl9jYWxsYmFjayAweCVseCwgZXhlX2NhbGxiYWNrIDB4JWx4LCBpbml0X3NkdHIgMHgleCxcbiIsCisgICAgICAgIGgtPmJ1c190eXBlLCAodWxvbmcpIGgtPmlzcl9jYWxsYmFjaywgKHVsb25nKSBoLT5leGVfY2FsbGJhY2ssCisgICAgICAgICh1bnNpZ25lZCkgaC0+aW5pdF9zZHRyKTsKKworICAgIHByaW50aygKKyIgc2R0cl9kb25lIDB4JXgsIHVzZV90YWdnZWRfcW5nIDB4JXgsIHVuaXRfbm90X3JlYWR5IDB4JXgsIGNoaXBfbm8gMHgleCxcbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+c2R0cl9kb25lLCAodW5zaWduZWQpIGgtPnVzZV90YWdnZWRfcW5nLAorICAgICAgICAodW5zaWduZWQpIGgtPnVuaXRfbm90X3JlYWR5LCAodW5zaWduZWQpIGgtPmNoaXBfbm8pOworCisgICAgcHJpbnRrKAorIiBxdWV1ZV9mdWxsX29yX2J1c3kgMHgleCwgc3RhcnRfbW90b3IgMHgleCwgc2NzaV9yZXNldF93YWl0ICV1LFxuIiwKKyAgICAgICAgKHVuc2lnbmVkKSBoLT5xdWV1ZV9mdWxsX29yX2J1c3ksICh1bnNpZ25lZCkgaC0+c3RhcnRfbW90b3IsCisgICAgICAgICh1bnNpZ25lZCkgaC0+c2NzaV9yZXNldF93YWl0KTsKKworICAgIHByaW50aygKKyIgaXNfaW5faW50ICV1LCBtYXhfdG90YWxfcW5nICV1LCBjdXJfdG90YWxfcW5nICV1LCBpbl9jcml0aWNhbF9jbnQgJXUsXG4iLAorICAgICAgICAodW5zaWduZWQpIGgtPmlzX2luX2ludCwgKHVuc2lnbmVkKSBoLT5tYXhfdG90YWxfcW5nLAorICAgICAgICAodW5zaWduZWQpIGgtPmN1cl90b3RhbF9xbmcsICh1bnNpZ25lZCkgaC0+aW5fY3JpdGljYWxfY250KTsKKworICAgIHByaW50aygKKyIgbGFzdF9xX3Nob3J0YWdlICV1LCBpbml0X3N0YXRlIDB4JXgsIG5vX3NjYW0gMHgleCwgcGNpX2ZpeF9hc3luX3hmZXIgMHgleCxcbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bGFzdF9xX3Nob3J0YWdlLCAodW5zaWduZWQpIGgtPmluaXRfc3RhdGUsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bm9fc2NhbSwgKHVuc2lnbmVkKSBoLT5wY2lfZml4X2FzeW5feGZlcik7CisKKyAgICBwcmludGsoCisiIGNmZyAweCVseCwgaXJxX25vIDB4JXhcbiIsCisgICAgICAgICh1bG9uZykgaC0+Y2ZnLCAodW5zaWduZWQpIGgtPmlycV9ubyk7Cit9CisKKy8qCisgKiBhc2NfcHJ0X2FzY19kdmNfY2ZnKCkKKyAqLworU1RBVElDIHZvaWQKK2FzY19wcnRfYXNjX2R2Y19jZmcoQVNDX0RWQ19DRkcgKmgpCit7CisgICAgcHJpbnRrKCJBU0NfRFZDX0NGRyBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIGgpOworCisgICAgcHJpbnRrKAorIiBjYW5fdGFnZ2VkX3FuZyAweCV4LCBjbWRfcW5nX2VuYWJsZWQgMHgleCxcbiIsCisgICAgICAgICAgICBoLT5jYW5fdGFnZ2VkX3FuZywgaC0+Y21kX3FuZ19lbmFibGVkKTsKKyAgICBwcmludGsoCisiIGRpc2NfZW5hYmxlIDB4JXgsIHNkdHJfZW5hYmxlIDB4JXgsXG4iLAorICAgICAgICAgICAgaC0+ZGlzY19lbmFibGUsIGgtPnNkdHJfZW5hYmxlKTsKKworICAgIHByaW50aygKKyIgY2hpcF9zY3NpX2lkICVkLCBpc2FfZG1hX3NwZWVkICVkLCBpc2FfZG1hX2NoYW5uZWwgJWQsIGNoaXBfdmVyc2lvbiAlZCxcbiIsCisgICAgICAgICAgICAgaC0+Y2hpcF9zY3NpX2lkLCBoLT5pc2FfZG1hX3NwZWVkLCBoLT5pc2FfZG1hX2NoYW5uZWwsCisgICAgICAgICAgICAgaC0+Y2hpcF92ZXJzaW9uKTsKKworICAgIHByaW50aygKKyIgcGNpX2RldmljZV9pZCAlZCwgbGliX3NlcmlhbF9ubyAldSwgbGliX3ZlcnNpb24gJXUsIG1jb2RlX2RhdGUgMHgleCxcbiIsCisJICAgdG9fcGNpX2RldihoLT5kZXYpLT5kZXZpY2UsIGgtPmxpYl9zZXJpYWxfbm8sIGgtPmxpYl92ZXJzaW9uLAorCSAgIGgtPm1jb2RlX2RhdGUpOworCisgICAgcHJpbnRrKAorIiBtY29kZV92ZXJzaW9uICVkLCBvdmVycnVuX2J1ZiAweCVseFxuIiwKKyAgICAgICAgICAgIGgtPm1jb2RlX3ZlcnNpb24sICh1bG9uZykgaC0+b3ZlcnJ1bl9idWYpOworfQorCisvKgorICogYXNjX3BydF9hc2Nfc2NzaV9xKCkKKyAqLworU1RBVElDIHZvaWQKK2FzY19wcnRfYXNjX3Njc2lfcShBU0NfU0NTSV9RICpxKQoreworICAgIEFTQ19TR19IRUFEICAgICpzZ3A7CisgICAgaW50IGk7CisKKyAgICBwcmludGsoIkFTQ19TQ1NJX1EgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBxKTsKKworICAgIHByaW50aygKKyIgdGFyZ2V0X2l4IDB4JXgsIHRhcmdldF9sdW4gJXUsIHNyYl9wdHIgMHglbHgsIHRhZ19jb2RlIDB4JXgsXG4iLAorICAgICAgICAgICAgcS0+cTIudGFyZ2V0X2l4LCBxLT5xMS50YXJnZXRfbHVuLAorICAgICAgICAgICAgKHVsb25nKSBxLT5xMi5zcmJfcHRyLCBxLT5xMi50YWdfY29kZSk7CisKKyAgICBwcmludGsoCisiIGRhdGFfYWRkciAweCVseCwgZGF0YV9jbnQgJWx1LCBzZW5zZV9hZGRyIDB4JWx4LCBzZW5zZV9sZW4gJXUsXG4iLAorICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2FkZHIpLAorICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2NudCksCisgICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPnExLnNlbnNlX2FkZHIpLCBxLT5xMS5zZW5zZV9sZW4pOworCisgICAgcHJpbnRrKAorIiBjZGJwdHIgMHglbHgsIGNkYl9sZW4gJXUsIHNnX2hlYWQgMHglbHgsIHNnX3F1ZXVlX2NudCAldVxuIiwKKyAgICAgICAgICAgICh1bG9uZykgcS0+Y2RicHRyLCBxLT5xMi5jZGJfbGVuLAorICAgICAgICAgICAgKHVsb25nKSBxLT5zZ19oZWFkLCBxLT5xMS5zZ19xdWV1ZV9jbnQpOworCisgICAgaWYgKHEtPnNnX2hlYWQpIHsKKyAgICAgICAgc2dwID0gcS0+c2dfaGVhZDsKKyAgICAgICAgcHJpbnRrKCJBU0NfU0dfSEVBRCBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIHNncCk7CisgICAgICAgIHByaW50aygiIGVudHJ5X2NudCAldSwgcXVldWVfY250ICV1XG4iLCBzZ3AtPmVudHJ5X2NudCwgc2dwLT5xdWV1ZV9jbnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2dwLT5lbnRyeV9jbnQ7IGkrKykgeworICAgICAgICAgICAgcHJpbnRrKCIgWyV1XTogYWRkciAweCVseCwgYnl0ZXMgJWx1XG4iLAorICAgICAgICAgICAgICAgIGksICh1bG9uZykgbGUzMl90b19jcHUoc2dwLT5zZ19saXN0W2ldLmFkZHIpLAorICAgICAgICAgICAgICAgICh1bG9uZykgbGUzMl90b19jcHUoc2dwLT5zZ19saXN0W2ldLmJ5dGVzKSk7CisgICAgICAgIH0KKworICAgIH0KK30KKworLyoKKyAqIGFzY19wcnRfYXNjX3Fkb25lX2luZm8oKQorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9hc2NfcWRvbmVfaW5mbyhBU0NfUURPTkVfSU5GTyAqcSkKK3sKKyAgICBwcmludGsoIkFTQ19RRE9ORV9JTkZPIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcSk7CisgICAgcHJpbnRrKAorIiBzcmJfcHRyIDB4JWx4LCB0YXJnZXRfaXggJXUsIGNkYl9sZW4gJXUsIHRhZ19jb2RlICV1LFxuIiwKKyAgICAgICAgICAgICh1bG9uZykgcS0+ZDIuc3JiX3B0ciwgcS0+ZDIudGFyZ2V0X2l4LCBxLT5kMi5jZGJfbGVuLAorICAgICAgICAgICAgcS0+ZDIudGFnX2NvZGUpOworICAgIHByaW50aygKKyIgZG9uZV9zdGF0IDB4JXgsIGhvc3Rfc3RhdCAweCV4LCBzY3NpX3N0YXQgMHgleCwgc2NzaV9tc2cgMHgleFxuIiwKKyAgICAgICAgICAgIHEtPmQzLmRvbmVfc3RhdCwgcS0+ZDMuaG9zdF9zdGF0LCBxLT5kMy5zY3NpX3N0YXQsIHEtPmQzLnNjc2lfbXNnKTsKK30KKworLyoKKyAqIGFzY19wcnRfYWR2X2R2Y192YXIoKQorICoKKyAqIERpc3BsYXkgYW4gQURWX0RWQ19WQVIgc3RydWN0dXJlLgorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9hZHZfZHZjX3ZhcihBRFZfRFZDX1ZBUiAqaCkKK3sKKyAgICBwcmludGsoIiBBRFZfRFZDX1ZBUiBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIGgpOworCisgICAgcHJpbnRrKAorIiAgaW9wX2Jhc2UgMHglbHgsIGVycl9jb2RlIDB4JXgsIHVsdHJhX2FibGUgMHgleFxuIiwKKyAgICAgICAgKHVsb25nKSBoLT5pb3BfYmFzZSwgaC0+ZXJyX2NvZGUsICh1bnNpZ25lZCkgaC0+dWx0cmFfYWJsZSk7CisKKyAgICBwcmludGsoCisiICBpc3JfY2FsbGJhY2sgMHglbHgsIHNkdHJfYWJsZSAweCV4LCB3ZHRyX2FibGUgMHgleFxuIiwKKyAgICAgICAgKHVsb25nKSBoLT5pc3JfY2FsbGJhY2ssICh1bnNpZ25lZCkgaC0+c2R0cl9hYmxlLAorICAgICAgICAodW5zaWduZWQpIGgtPndkdHJfYWJsZSk7CisKKyAgICBwcmludGsoCisiICBzdGFydF9tb3RvciAweCV4LCBzY3NpX3Jlc2V0X3dhaXQgMHgleCwgaXJxX25vIDB4JXgsXG4iLAorICAgICAgICAodW5zaWduZWQpIGgtPnN0YXJ0X21vdG9yLAorICAgICAgICAodW5zaWduZWQpIGgtPnNjc2lfcmVzZXRfd2FpdCwgKHVuc2lnbmVkKSBoLT5pcnFfbm8pOworCisgICAgcHJpbnRrKAorIiAgbWF4X2hvc3RfcW5nICV1LCBtYXhfZHZjX3FuZyAldSwgY2Fycl9mcmVlbGlzdCAweCVseG5cbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bWF4X2hvc3RfcW5nLCAodW5zaWduZWQpIGgtPm1heF9kdmNfcW5nLAorICAgICAgICAodWxvbmcpIGgtPmNhcnJfZnJlZWxpc3QpOworCisgICAgcHJpbnRrKAorIiAgaWNxX3NwIDB4JWx4LCBpcnFfc3AgMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgaC0+aWNxX3NwLCAodWxvbmcpIGgtPmlycV9zcCk7CisKKyAgICBwcmludGsoCisiICBub19zY2FtIDB4JXgsIHRhZ3FuZ19hYmxlIDB4JXhcbiIsCisgICAgICAgICh1bnNpZ25lZCkgaC0+bm9fc2NhbSwgKHVuc2lnbmVkKSBoLT50YWdxbmdfYWJsZSk7CisKKyAgICBwcmludGsoCisiICBjaGlwX3Njc2lfaWQgMHgleCwgY2ZnIDB4JWx4XG4iLAorICAgICAgICAodW5zaWduZWQpIGgtPmNoaXBfc2NzaV9pZCwgKHVsb25nKSBoLT5jZmcpOworfQorCisvKgorICogYXNjX3BydF9hZHZfZHZjX2NmZygpCisgKgorICogRGlzcGxheSBhbiBBRFZfRFZDX0NGRyBzdHJ1Y3R1cmUuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2Fkdl9kdmNfY2ZnKEFEVl9EVkNfQ0ZHICpoKQoreworICAgIHByaW50aygiIEFEVl9EVkNfQ0ZHIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgaCk7CisKKyAgICBwcmludGsoCisiICBkaXNjX2VuYWJsZSAweCV4LCB0ZXJtaW5hdGlvbiAweCV4XG4iLAorICAgICAgICBoLT5kaXNjX2VuYWJsZSwgaC0+dGVybWluYXRpb24pOworCisgICAgcHJpbnRrKAorIiAgY2hpcF92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleFxuIiwKKyAgICAgICAgaC0+Y2hpcF92ZXJzaW9uLCBoLT5tY29kZV9kYXRlKTsKKworICAgIHByaW50aygKKyIgIG1jb2RlX3ZlcnNpb24gMHgleCwgcGNpX2RldmljZV9pZCAweCV4LCBsaWJfdmVyc2lvbiAldVxuIiwKKyAgICAgICBoLT5tY29kZV92ZXJzaW9uLCB0b19wY2lfZGV2KGgtPmRldiktPmRldmljZSwgaC0+bGliX3ZlcnNpb24pOworCisgICAgcHJpbnRrKAorIiAgY29udHJvbF9mbGFnIDB4JXgsIHBjaV9zbG90X2luZm8gMHgleFxuIiwKKyAgICAgICBoLT5jb250cm9sX2ZsYWcsIGgtPnBjaV9zbG90X2luZm8pOworfQorCisvKgorICogYXNjX3BydF9hZHZfc2NzaV9yZXFfcSgpCisgKgorICogRGlzcGxheSBhbiBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKEFEVl9TQ1NJX1JFUV9RICpxKQoreworICAgIGludCAgICAgICAgICAgICAgICAgc2dfYmxrX2NudDsKKyAgICBzdHJ1Y3QgYXNjX3NnX2Jsb2NrICpzZ19wdHI7CisKKyAgICBwcmludGsoIkFEVl9TQ1NJX1JFUV9RIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcSk7CisKKyAgICBwcmludGsoCisiICB0YXJnZXRfaWQgJXUsIHRhcmdldF9sdW4gJXUsIHNyYl9wdHIgMHglbHgsIGFfZmxhZyAweCV4XG4iLAorICAgICAgICAgICAgcS0+dGFyZ2V0X2lkLCBxLT50YXJnZXRfbHVuLCAodWxvbmcpIHEtPnNyYl9wdHIsIHEtPmFfZmxhZyk7CisKKyAgICBwcmludGsoIiAgY250bCAweCV4LCBkYXRhX2FkZHIgMHglbHgsIHZkYXRhX2FkZHIgMHglbHhcbiIsCisgICAgICAgICAgICBxLT5jbnRsLCAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPmRhdGFfYWRkciksICh1bG9uZykgcS0+dmRhdGFfYWRkcik7CisKKyAgICBwcmludGsoCisiICBkYXRhX2NudCAlbHUsIHNlbnNlX2FkZHIgMHglbHgsIHNlbnNlX2xlbiAldSxcbiIsCisgICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPmRhdGFfY250KSwKKyAgICAgICAgICAgICh1bG9uZykgbGUzMl90b19jcHUocS0+c2Vuc2VfYWRkciksIHEtPnNlbnNlX2xlbik7CisKKyAgICBwcmludGsoCisiICBjZGJfbGVuICV1LCBkb25lX3N0YXR1cyAweCV4LCBob3N0X3N0YXR1cyAweCV4LCBzY3NpX3N0YXR1cyAweCV4XG4iLAorICAgICAgICAgICAgcS0+Y2RiX2xlbiwgcS0+ZG9uZV9zdGF0dXMsIHEtPmhvc3Rfc3RhdHVzLCBxLT5zY3NpX3N0YXR1cyk7CisKKyAgICBwcmludGsoCisiICBzZ193b3JraW5nX2l4IDB4JXgsIHRhcmdldF9jbWQgJXVcbiIsCisgICAgICAgICAgICBxLT5zZ193b3JraW5nX2l4LCBxLT50YXJnZXRfY21kKTsKKworICAgIHByaW50aygKKyIgIHNjc2lxX3JwdHIgMHglbHgsIHNnX3JlYWxfYWRkciAweCVseCwgc2dfbGlzdF9wdHIgMHglbHhcbiIsCisgICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPnNjc2lxX3JwdHIpLAorICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5zZ19yZWFsX2FkZHIpLCAodWxvbmcpIHEtPnNnX2xpc3RfcHRyKTsKKworICAgIC8qIERpc3BsYXkgdGhlIHJlcXVlc3QncyBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlcy4gKi8KKyAgICBpZiAocS0+c2dfbGlzdF9wdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNnX2Jsa19jbnQgPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICdzZ19wdHInIGlzIGEgcGh5c2ljYWwgYWRkcmVzcy4gQ29udmVydCBpdCB0byBhIHZpcnR1YWwKKyAgICAgICAgICAgICAqIGFkZHJlc3MgYnkgaW5kZXhpbmcgJ3NnX2Jsa19jbnQnIGludG8gdGhlIHZpcnR1YWwgYWRkcmVzcworICAgICAgICAgICAgICogYXJyYXkgJ3NnX2xpc3RfcHRyJy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBYWFggLSBBc3N1bWVzIGFsbCBTRyBwaHlzaWNhbCBibG9ja3MgYXJlIHZpcnR1YWxseSBjb250aWd1b3VzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZ19wdHIgPSAmKCgoQURWX1NHX0JMT0NLICopIChxLT5zZ19saXN0X3B0cikpW3NnX2Jsa19jbnRdKTsKKyAgICAgICAgICAgIGFzY19wcnRfYWR2X3NnYmxvY2soc2dfYmxrX2NudCwgc2dfcHRyKTsKKyAgICAgICAgICAgIGlmIChzZ19wdHItPnNnX3B0ciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2dfYmxrX2NudCsrOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogYXNjX3BydF9hZHZfc2dibG9jaygpCisgKgorICogRGlzcGxheSBhbiBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlLgorICovCitTVEFUSUMgdm9pZAorYXNjX3BydF9hZHZfc2dibG9jayhpbnQgc2dibG9ja25vLCBBRFZfU0dfQkxPQ0sgKmIpCit7CisgICAgaW50IGk7CisKKyAgICBwcmludGsoIiBBU0NfU0dfQkxPQ0sgYXQgYWRkciAweCVseCAoc2dibG9ja25vICVkKVxuIiwKKyAgICAgICAgKHVsb25nKSBiLCBzZ2Jsb2Nrbm8pOworICAgIHByaW50aygiICBzZ19jbnQgJXUsIHNnX3B0ciAweCVseFxuIiwKKyAgICAgICAgYi0+c2dfY250LCAodWxvbmcpIGxlMzJfdG9fY3B1KGItPnNnX3B0cikpOworICAgIEFTQ19BU1NFUlQoYi0+c2dfY250IDw9IE5PX09GX1NHX1BFUl9CTE9DSyk7CisgICAgaWYgKGItPnNnX3B0ciAhPSAwKQorICAgIHsKKyAgICAgICAgQVNDX0FTU0VSVChiLT5zZ19jbnQgPT0gTk9fT0ZfU0dfUEVSX0JMT0NLKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGItPnNnX2NudDsgaSsrKSB7CisgICAgICAgIHByaW50aygiICBbJXVdOiBzZ19hZGRyIDB4JWx4LCBzZ19jb3VudCAweCVseFxuIiwKKyAgICAgICAgICAgIGksICh1bG9uZykgYi0+c2dfbGlzdFtpXS5zZ19hZGRyLCAodWxvbmcpIGItPnNnX2xpc3RbaV0uc2dfY291bnQpOworICAgIH0KK30KKworLyoKKyAqIGFzY19wcnRfaGV4KCkKKyAqCisgKiBQcmludCBoZXhhZGVjaW1hbCBvdXRwdXQgaW4gNCBieXRlIGdyb3VwaW5ncyAzMiBieXRlcworICogb3IgOCBkb3VibGUtd29yZHMgcGVyIGxpbmUuCisgKi8KK1NUQVRJQyB2b2lkCithc2NfcHJ0X2hleChjaGFyICpmLCB1Y2hhciAqcywgaW50IGwpCit7CisgICAgaW50ICAgICAgICAgICAgaTsKKyAgICBpbnQgICAgICAgICAgICBqOworICAgIGludCAgICAgICAgICAgIGs7CisgICAgaW50ICAgICAgICAgICAgbTsKKworICAgIHByaW50aygiJXM6ICglZCBieXRlcylcbiIsIGYsIGwpOworCisgICAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gMzIpIHsKKworICAgICAgICAvKiBEaXNwbGF5IGEgbWF4aW11bSBvZiA4IGRvdWJsZS13b3JkcyBwZXIgbGluZS4gKi8KKyAgICAgICAgaWYgKChrID0gKGwgLSBpKSAvIDQpID49IDgpIHsKKyAgICAgICAgICAgIGsgPSA4OworICAgICAgICAgICAgbSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtID0gKGwgLSBpKSAlIDQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgazsgaisrKSB7CisgICAgICAgICAgICBwcmludGsoIiAlMi4yWCUyLjJYJTIuMlglMi4yWCIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCldLCAodW5zaWduZWQpIHNbaSsoaio0KSsxXSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KSsyXSwgKHVuc2lnbmVkKSBzW2krKGoqNCkrM10pOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwcmludGsoIiAlMi4yWCIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwcmludGsoIiAlMi4yWCUyLjJYIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KV0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHByaW50aygiICUyLjJYJTIuMlglMi4yWCIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrMV0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrMl0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBzW2krKGoqNCkrM10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcmludGsoIlxuIik7CisgICAgfQorfQorI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCisKKy8qCisgKiAtLS0gQXNjIExpYnJhcnkgRnVuY3Rpb25zCisgKi8KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY0dldEVpc2FDaGlwQ2ZnKAorICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UpCit7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBlaXNhX2NmZ19pb3A7CisKKyAgICBlaXNhX2NmZ19pb3AgPSAoUG9ydEFkZHIpIEFTQ19HRVRfRUlTQV9TTE9UKGlvcF9iYXNlKSB8CisgICAgICAoUG9ydEFkZHIpIChBU0NfRUlTQV9DRkdfSU9QX01BU0spOworICAgIHJldHVybiAoaW5wdyhlaXNhX2NmZ19pb3ApKTsKK30KKworU1RBVElDIHVjaGFyIF9faW5pdAorQXNjU2V0Q2hpcFNjc2lJRCgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIHVjaGFyIG5ld19ob3N0X2lkCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OworCisgICAgaWYgKEFzY0dldENoaXBTY3NpSUQoaW9wX2Jhc2UpID09IG5ld19ob3N0X2lkKSB7CisgICAgICAgIHJldHVybiAobmV3X2hvc3RfaWQpOworICAgIH0KKyAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisgICAgY2ZnX2xzdyAmPSAweEY4RkY7CisgICAgY2ZnX2xzdyB8PSAodXNob3J0KSAoKG5ld19ob3N0X2lkICYgQVNDX01BWF9USUQpIDw8IDgpOworICAgIEFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworICAgIHJldHVybiAoQXNjR2V0Q2hpcFNjc2lJRChpb3BfYmFzZSkpOworfQorCitTVEFUSUMgdWNoYXIgX19pbml0CitBc2NHZXRDaGlwU2NzaUN0cmwoCisJCVBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgc2M7CisKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKyAgICBzYyA9IGlucChpb3BfYmFzZSArIElPUF9SRUdfU0MpOworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworICAgIHJldHVybiAoc2MpOworfQorCitTVEFUSUMgdWNoYXIgX19pbml0CitBc2NHZXRDaGlwVmVyc2lvbigKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGJ1c190eXBlCispCit7CisgICAgaWYgKChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSAhPSAwKSB7CisgICAgICAgIFBvcnRBZGRyICAgICAgICAgICAgZWlzYV9pb3A7CisgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgcmV2aXNpb247CisgICAgICAgIGVpc2FfaW9wID0gKFBvcnRBZGRyKSBBU0NfR0VUX0VJU0FfU0xPVChpb3BfYmFzZSkgfAorICAgICAgICAgIChQb3J0QWRkcikgQVNDX0VJU0FfUkVWX0lPUF9NQVNLOworICAgICAgICByZXZpc2lvbiA9IGlucChlaXNhX2lvcCk7CisgICAgICAgIHJldHVybiAoKHVjaGFyKSAoKEFTQ19DSElQX01JTl9WRVJfRUlTQSAtIDEpICsgcmV2aXNpb24pKTsKKyAgICB9CisgICAgcmV0dXJuIChBc2NHZXRDaGlwVmVyTm8oaW9wX2Jhc2UpKTsKK30KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY0dldENoaXBCdXNUeXBlKAorICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjaGlwX3ZlcjsKKworICAgIGNoaXBfdmVyID0gQXNjR2V0Q2hpcFZlck5vKGlvcF9iYXNlKTsKKyAgICBpZiAoCisgICAgICAgICAgIChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX1ZMKQorICAgICAgICAgICAmJiAoY2hpcF92ZXIgPD0gQVNDX0NISVBfTUFYX1ZFUl9WTCkKKykgeworICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAoKGlvcF9iYXNlICYgMHgwQzMwKSA9PSAweDBDMzApCisgICAgICAgICAgICAgICB8fCAoKGlvcF9iYXNlICYgMHgwQzUwKSA9PSAweDBDNTApCispIHsKKyAgICAgICAgICAgIHJldHVybiAoQVNDX0lTX0VJU0EpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQVNDX0lTX1ZMKTsKKyAgICB9CisgICAgaWYgKChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX0lTQSkgJiYKKyAgICAgICAgKGNoaXBfdmVyIDw9IEFTQ19DSElQX01BWF9WRVJfSVNBKSkgeworICAgICAgICBpZiAoY2hpcF92ZXIgPj0gQVNDX0NISVBfTUlOX1ZFUl9JU0FfUE5QKSB7CisgICAgICAgICAgICByZXR1cm4gKEFTQ19JU19JU0FQTlApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQVNDX0lTX0lTQSk7CisgICAgfSBlbHNlIGlmICgoY2hpcF92ZXIgPj0gQVNDX0NISVBfTUlOX1ZFUl9QQ0kpICYmCisgICAgICAgICAgICAgICAoY2hpcF92ZXIgPD0gQVNDX0NISVBfTUFYX1ZFUl9QQ0kpKSB7CisgICAgICAgIHJldHVybiAoQVNDX0lTX1BDSSk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBBU0NfRENOVAorQXNjTG9hZE1pY3JvQ29kZSgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzX2FkZHIsCisgICAgICAgICAgICAgICAgICAgIHVjaGFyICptY29kZV9idWYsCisgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBtY29kZV9zaXplCispCit7CisgICAgQVNDX0RDTlQgICAgICAgICAgICBjaGtzdW07CisgICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV93b3JkX3NpemU7CisgICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV9jaGtzdW07CisKKyAgICAvKiBXcml0ZSB0aGUgbWljcm9jb2RlIGJ1ZmZlciBzdGFydGluZyBhdCBMUkFNIGFkZHJlc3MgMC4gKi8KKyAgICBtY29kZV93b3JkX3NpemUgPSAodXNob3J0KSAobWNvZGVfc2l6ZSA+PiAxKTsKKyAgICBBc2NNZW1Xb3JkU2V0THJhbShpb3BfYmFzZSwgc19hZGRyLCAwLCBtY29kZV93b3JkX3NpemUpOworICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLCBzX2FkZHIsIG1jb2RlX2J1ZiwgbWNvZGVfd29yZF9zaXplKTsKKworICAgIGNoa3N1bSA9IEFzY01lbVN1bUxyYW1Xb3JkKGlvcF9iYXNlLCBzX2FkZHIsIG1jb2RlX3dvcmRfc2l6ZSk7CisgICAgQVNDX0RCRzEoMSwgIkFzY0xvYWRNaWNyb0NvZGU6IGNoa3N1bSAweCVseFxuIiwgKHVsb25nKSBjaGtzdW0pOworICAgIG1jb2RlX2Noa3N1bSA9ICh1c2hvcnQpIEFzY01lbVN1bUxyYW1Xb3JkKGlvcF9iYXNlLAorICAgICAgICAgICh1c2hvcnQpIEFTQ19DT0RFX1NFQ19CRUcsCisgICAgICAgICAgKHVzaG9ydCkgKChtY29kZV9zaXplIC0gc19hZGRyIC0gKHVzaG9ydCkgQVNDX0NPREVfU0VDX0JFRykgLyAyKSk7CisgICAgQVNDX0RCRzEoMSwgIkFzY0xvYWRNaWNyb0NvZGU6IG1jb2RlX2Noa3N1bSAweCVseFxuIiwKKyAgICAgICAgKHVsb25nKSBtY29kZV9jaGtzdW0pOworICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfTUNPREVfQ0hLU1VNX1csIG1jb2RlX2Noa3N1bSk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9NQ09ERV9TSVpFX1csIG1jb2RlX3NpemUpOworICAgIHJldHVybiAoY2hrc3VtKTsKK30KKworU1RBVElDIGludAorQXNjRmluZFNpZ25hdHVyZSgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNpZ193b3JkOworCisgICAgQVNDX0RCRzIoMSwgIkFzY0ZpbmRTaWduYXR1cmU6IEFzY0dldENoaXBTaWduYXR1cmVCeXRlKDB4JXgpIDB4JXhcbiIsCisgICAgICAgIGlvcF9iYXNlLCBBc2NHZXRDaGlwU2lnbmF0dXJlQnl0ZShpb3BfYmFzZSkpOworICAgIGlmIChBc2NHZXRDaGlwU2lnbmF0dXJlQnl0ZShpb3BfYmFzZSkgPT0gKHVjaGFyKSBBU0NfMTAwMF9JRDFCKSB7CisgICAgICAgIEFTQ19EQkcyKDEsICJBc2NGaW5kU2lnbmF0dXJlOiBBc2NHZXRDaGlwU2lnbmF0dXJlV29yZCgweCV4KSAweCV4XG4iLAorICAgICAgICAgICAgaW9wX2Jhc2UsIEFzY0dldENoaXBTaWduYXR1cmVXb3JkKGlvcF9iYXNlKSk7CisgICAgICAgIHNpZ193b3JkID0gQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQoaW9wX2Jhc2UpOworICAgICAgICBpZiAoKHNpZ193b3JkID09ICh1c2hvcnQpIEFTQ18xMDAwX0lEMFcpIHx8CisgICAgICAgICAgICAoc2lnX3dvcmQgPT0gKHVzaG9ydCkgQVNDXzEwMDBfSUQwV19GSVgpKSB7CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBQb3J0QWRkciBfYXNjX2RlZl9pb3BfYmFzZVtBU0NfSU9BRFJfVEFCTEVfTUFYX0lYXSBfX2luaXRkYXRhID0KK3sKKyAgICAweDEwMCwgQVNDX0lPQURSXzEsIDB4MTIwLCBBU0NfSU9BRFJfMiwgMHgxNDAsIEFTQ19JT0FEUl8zLCBBU0NfSU9BRFJfNCwKKyAgICBBU0NfSU9BRFJfNSwgQVNDX0lPQURSXzYsIEFTQ19JT0FEUl83LCBBU0NfSU9BRFJfOAorfTsKKworI2lmZGVmIENPTkZJR19JU0EKK1NUQVRJQyB1Y2hhciBfaXNhX3BucF9pbml0ZWQgX19pbml0ZGF0YSA9IDA7CisKK1NUQVRJQyBQb3J0QWRkciBfX2luaXQKK0FzY1NlYXJjaElPUG9ydEFkZHIoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iZWcsCisgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBidXNfdHlwZSkKK3sKKyAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfVkwpIHsKKyAgICAgICAgd2hpbGUgKChpb3BfYmVnID0gQXNjU2VhcmNoSU9Qb3J0QWRkcjExKGlvcF9iZWcpKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpIDw9IEFTQ19DSElQX01BWF9WRVJfVkwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKyAgICAgICAgaWYgKF9pc2FfcG5wX2luaXRlZCA9PSAwKSB7CisgICAgICAgICAgICBBc2NTZXRJU0FQTlBXYWl0Rm9yS2V5KCk7CisgICAgICAgICAgICBfaXNhX3BucF9pbml0ZWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKGlvcF9iZWcgPSBBc2NTZWFyY2hJT1BvcnRBZGRyMTEoaW9wX2JlZykpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpICYgQVNDX0NISVBfVkVSX0lTQV9CSVQpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSB7CisgICAgICAgIGlmICgoaW9wX2JlZyA9IEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKGlvcF9iZWcpKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBQb3J0QWRkciBfX2luaXQKK0FzY1NlYXJjaElPUG9ydEFkZHIxMSgKKyAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBzX2FkZHIKKykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYOyBpKyspIHsKKyAgICAgICAgaWYgKF9hc2NfZGVmX2lvcF9iYXNlW2ldID4gc19hZGRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgaSA8IEFTQ19JT0FEUl9UQUJMRV9NQVhfSVg7IGkrKykgeworICAgICAgICBpb3BfYmFzZSA9IF9hc2NfZGVmX2lvcF9iYXNlW2ldOworICAgICAgICBpZiAoY2hlY2tfcmVnaW9uKGlvcF9iYXNlLCBBU0NfSU9BRFJfR0FQKSAhPSAwKSB7CisgICAgICAgICAgICBBU0NfREJHMSgxLAorICAgICAgICAgICAgICAgIkFzY1NlYXJjaElPUG9ydEFkZHIxMTogY2hlY2tfcmVnaW9uKCkgZmFpbGVkIEkvTyBwb3J0IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICBpb3BfYmFzZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBU0NfREJHMSgxLCAiQXNjU2VhcmNoSU9Qb3J0QWRkcjExOiBwcm9iaW5nIEkvTyBwb3J0IDB4JXhcbiIsIGlvcF9iYXNlKTsKKyAgICAgICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gKGlvcF9iYXNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCitTVEFUSUMgdm9pZCBfX2luaXQKK0FzY1NldElTQVBOUFdhaXRGb3JLZXkodm9pZCkKK3sKKyAgICBvdXRwKEFTQ19JU0FfUE5QX1BPUlRfQUREUiwgMHgwMik7CisgICAgb3V0cChBU0NfSVNBX1BOUF9QT1JUX1dSSVRFLCAweDAyKTsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitTVEFUSUMgdm9pZCBfX2luaXQKK0FzY1RvZ2dsZUlSUUFjdCgKKyAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQorKQoreworICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19JUlFfQUNUKTsKKyAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyB1Y2hhciBfX2luaXQKK0FzY0dldENoaXBJUlEoCisgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OworICAgIHVjaGFyICAgICAgICAgICAgICAgY2hpcF9pcnE7CisKKyAgICBpZiAoKGJ1c190eXBlICYgQVNDX0lTX0VJU0EpICE9IDApIHsKKyAgICAgICAgY2ZnX2xzdyA9IEFzY0dldEVpc2FDaGlwQ2ZnKGlvcF9iYXNlKTsKKyAgICAgICAgY2hpcF9pcnEgPSAodWNoYXIpICgoKGNmZ19sc3cgPj4gOCkgJiAweDA3KSArIDEwKTsKKyAgICAgICAgaWYgKChjaGlwX2lycSA9PSAxMykgfHwgKGNoaXBfaXJxID4gMTUpKSB7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY2hpcF9pcnEpOworICAgIH0KKyAgICBpZiAoKGJ1c190eXBlICYgQVNDX0lTX1ZMKSAhPSAwKSB7CisgICAgICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICAgICAgY2hpcF9pcnEgPSAodWNoYXIpICgoKGNmZ19sc3cgPj4gMikgJiAweDA3KSk7CisgICAgICAgIGlmICgoY2hpcF9pcnEgPT0gMCkgfHwKKyAgICAgICAgICAgIChjaGlwX2lycSA9PSA0KSB8fAorICAgICAgICAgICAgKGNoaXBfaXJxID09IDcpKSB7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKHVjaGFyKSAoY2hpcF9pcnEgKyAoQVNDX01JTl9JUlFfTk8gLSAxKSkpOworICAgIH0KKyAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisgICAgY2hpcF9pcnEgPSAodWNoYXIpICgoKGNmZ19sc3cgPj4gMikgJiAweDAzKSk7CisgICAgaWYgKGNoaXBfaXJxID09IDMpCisgICAgICAgIGNoaXBfaXJxICs9ICh1Y2hhcikgMjsKKyAgICByZXR1cm4gKCh1Y2hhcikgKGNoaXBfaXJxICsgQVNDX01JTl9JUlFfTk8pKTsKK30KKworU1RBVElDIHVjaGFyIF9faW5pdAorQXNjU2V0Q2hpcElSUSgKKyAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgIHVjaGFyIGlycV9ubywKKyAgICAgICAgICAgICAgICAgdXNob3J0IGJ1c190eXBlKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnX2xzdzsKKworICAgIGlmICgoYnVzX3R5cGUgJiBBU0NfSVNfVkwpICE9IDApIHsKKyAgICAgICAgaWYgKGlycV9ubyAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKGlycV9ubyA8IEFTQ19NSU5fSVJRX05PKSB8fCAoaXJxX25vID4gQVNDX01BWF9JUlFfTk8pKSB7CisgICAgICAgICAgICAgICAgaXJxX25vID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXJxX25vIC09ICh1Y2hhcikgKChBU0NfTUlOX0lSUV9OTyAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjZmdfbHN3ID0gKHVzaG9ydCkgKEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkUzKTsKKyAgICAgICAgY2ZnX2xzdyB8PSAodXNob3J0KSAweDAwMTA7CisgICAgICAgIEFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworICAgICAgICBBc2NUb2dnbGVJUlFBY3QoaW9wX2Jhc2UpOworICAgICAgICBjZmdfbHN3ID0gKHVzaG9ydCkgKEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkUwKTsKKyAgICAgICAgY2ZnX2xzdyB8PSAodXNob3J0KSAoKGlycV9ubyAmIDB4MDcpIDw8IDIpOworICAgICAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmdfbHN3KTsKKyAgICAgICAgQXNjVG9nZ2xlSVJRQWN0KGlvcF9iYXNlKTsKKyAgICAgICAgcmV0dXJuIChBc2NHZXRDaGlwSVJRKGlvcF9iYXNlLCBidXNfdHlwZSkpOworICAgIH0KKyAgICBpZiAoKGJ1c190eXBlICYgKEFTQ19JU19JU0EpKSAhPSAwKSB7CisgICAgICAgIGlmIChpcnFfbm8gPT0gMTUpCisgICAgICAgICAgICBpcnFfbm8gLT0gKHVjaGFyKSAyOworICAgICAgICBpcnFfbm8gLT0gKHVjaGFyKSBBU0NfTUlOX0lSUV9OTzsKKyAgICAgICAgY2ZnX2xzdyA9ICh1c2hvcnQpIChBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4RkZGMyk7CisgICAgICAgIGNmZ19sc3cgfD0gKHVzaG9ydCkgKChpcnFfbm8gJiAweDAzKSA8PCAyKTsKKyAgICAgICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7CisgICAgICAgIHJldHVybiAoQXNjR2V0Q2hpcElSUShpb3BfYmFzZSwgYnVzX3R5cGUpKTsKKyAgICB9CisgICAgcmV0dXJuICgwKTsKK30KKworI2lmZGVmIENPTkZJR19JU0EKK1NUQVRJQyB2b2lkIF9faW5pdAorQXNjRW5hYmxlSXNhRG1hKAorICAgICAgICAgICAgICAgICAgIHVjaGFyIGRtYV9jaGFubmVsKQoreworICAgIGlmIChkbWFfY2hhbm5lbCA8IDQpIHsKKyAgICAgICAgb3V0cCgweDAwMEIsICh1c2hvcnQpICgweEMwIHwgZG1hX2NoYW5uZWwpKTsKKyAgICAgICAgb3V0cCgweDAwMEEsIGRtYV9jaGFubmVsKTsKKyAgICB9IGVsc2UgaWYgKGRtYV9jaGFubmVsIDwgOCkgeworICAgICAgICBvdXRwKDB4MDBENiwgKHVzaG9ydCkgKDB4QzAgfCAoZG1hX2NoYW5uZWwgLSA0KSkpOworICAgICAgICBvdXRwKDB4MDBENCwgKHVzaG9ydCkgKGRtYV9jaGFubmVsIC0gNCkpOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitTVEFUSUMgaW50CitBc2NJc3JDaGlwSGFsdGVkKAorICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIEVYVF9NU0cgICAgICAgICAgICAgZXh0X21zZzsKKyAgICBFWFRfTVNHICAgICAgICAgICAgIG91dF9tc2c7CisgICAgdXNob3J0ICAgICAgICAgICAgICBoYWx0X3FfYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNkdHJfYWNjZXB0OworICAgIHVzaG9ydCAgICAgICAgICAgICAgaW50X2hhbHRfY29kZTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzY3NpX2J1c3k7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdGFyZ2V0X2lkOworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdWNoYXIgICAgICAgICAgICAgICB0YWdfY29kZTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfc3RhdHVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgaGFsdF9xcDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfZGF0YTsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9peDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfY250bCwgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgY3VyX2R2Y19xbmc7CisgICAgdWNoYXIgICAgICAgICAgICAgICBhc3luX3NkdHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX3N0YXR1czsKKyAgICBhc2NfYm9hcmRfdCAgICAgICAgICpib2FyZHA7CisKKyAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmRydl9wdHIgIT0gTlVMTCk7CisgICAgYm9hcmRwID0gYXNjX2R2Yy0+ZHJ2X3B0cjsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgaW50X2hhbHRfY29kZSA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XKTsKKworICAgIGhhbHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfQ1VSQ0RCX0IpOworICAgIGhhbHRfcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihoYWx0X3FwKTsKKyAgICB0YXJnZXRfaXggPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFSR0VUX0lYKSk7CisgICAgcV9jbnRsID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCkpOworICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7CisgICAgdGFyZ2V0X2lkID0gKHVjaGFyKSBBU0NfVElEX1RPX1RBUkdFVF9JRCh0aWRfbm8pOworICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgeworICAgICAgICBhc3luX3NkdHIgPSBBU1lOX1NEVFJfREFUQV9GSVhfUENJX1JFVl9BQjsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3luX3NkdHIgPSAwOworICAgIH0KKyAgICBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVgpIHsKKyAgICAgICAgaWYgKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICYgdGFyZ2V0X2lkKSB7CisgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgMCwgdGlkX25vKTsKKyAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSAwOworICAgICAgICB9CisgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfSBlbHNlIGlmIChpbnRfaGFsdF9jb2RlID09IEFTQ19IQUxUX0VOQUJMRV9BU1lOX1VTRV9TWU5fRklYKSB7CisgICAgICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgeworICAgICAgICAgICAgQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIGFzeW5fc2R0ciwgdGlkX25vKTsKKyAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSBhc3luX3NkdHI7CisgICAgICAgIH0KKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfRVhUTVNHX0lOKSB7CisKKyAgICAgICAgQXNjTWVtV29yZENvcHlQdHJGcm9tTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NWX01TR0lOX0JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJmV4dF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworCisgICAgICAgIGlmIChleHRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCAmJgorICAgICAgICAgICAgZXh0X21zZy5tc2dfcmVxID09IE1TX1NEVFJfQ09ERSAmJgorICAgICAgICAgICAgZXh0X21zZy5tc2dfbGVuID09IE1TX1NEVFJfTEVOKSB7CisgICAgICAgICAgICBzZHRyX2FjY2VwdCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoKGV4dF9tc2cucmVxX2Fja19vZmZzZXQgPiBBU0NfU1lOX01BWF9PRkZTRVQpKSB7CisKKyAgICAgICAgICAgICAgICBzZHRyX2FjY2VwdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQgPSBBU0NfU1lOX01BWF9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGV4dF9tc2cueGZlcl9wZXJpb2QgPAorICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXhdKSB8fAorICAgICAgICAgICAgICAgIChleHRfbXNnLnhmZXJfcGVyaW9kID4KKyAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsW2FzY19kdmMtPm1heF9zZHRyX2luZGV4XSkpIHsKKyAgICAgICAgICAgICAgICBzZHRyX2FjY2VwdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGV4dF9tc2cueGZlcl9wZXJpb2QgPQorICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNkdHJfYWNjZXB0KSB7CisgICAgICAgICAgICAgICAgc2R0cl9kYXRhID0gQXNjQ2FsU0RUUkRhdGEoYXNjX2R2YywgZXh0X21zZy54ZmVyX3BlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnJlcV9hY2tfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoKHNkdHJfZGF0YSA9PSAweEZGKSkgeworCisgICAgICAgICAgICAgICAgICAgIHFfY250bCB8PSBRQ19NU0dfT1VUOworICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5pbml0X3NkdHIgJj0gfnRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSBhc3luX3NkdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4dF9tc2cucmVxX2Fja19vZmZzZXQgPT0gMCkgeworCisgICAgICAgICAgICAgICAgcV9jbnRsICY9IH5RQ19NU0dfT1VUOworICAgICAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzZHRyX2FjY2VwdCAmJiAocV9jbnRsICYgUUNfTVNHX09VVCkpIHsKKworICAgICAgICAgICAgICAgICAgICBxX2NudGwgJj0gflFDX01TR19PVVQ7CisgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSB8PSB0YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciB8PSB0YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIHNkdHJfZGF0YSA9IEFzY0NhbFNEVFJEYXRhKGFzY19kdmMsIGV4dF9tc2cueGZlcl9wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgc2R0cl9kYXRhLCB0aWRfbm8pOworICAgICAgICAgICAgICAgICAgICBib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gc2R0cl9kYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICAgICAgICAgIEFzY01zZ091dFNEVFIoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnhmZXJfcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgICAgICBzZHRyX2RhdGEgPSBBc2NDYWxTRFRSRGF0YShhc2NfZHZjLCBleHRfbXNnLnhmZXJfcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnJlcV9hY2tfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIHNkdHJfZGF0YSwgdGlkX25vKTsKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5zZHRyX2RhdGFbdGlkX25vXSA9IHNkdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lIHw9IHRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyIHw9IHRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfY250bCk7CisgICAgICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfSBlbHNlIGlmIChleHRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCAmJgorICAgICAgICAgICAgICAgICAgIGV4dF9tc2cubXNnX3JlcSA9PSBNU19XRFRSX0NPREUgJiYKKyAgICAgICAgICAgICAgICAgICBleHRfbXNnLm1zZ19sZW4gPT0gTVNfV0RUUl9MRU4pIHsKKworICAgICAgICAgICAgZXh0X21zZy53ZHRyX3dpZHRoID0gMDsKKyAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZleHRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0NOVEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworICAgICAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIGV4dF9tc2cubXNnX3R5cGUgPSBNRVNTQUdFX1JFSkVDVDsKKyAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZleHRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0NOVEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworICAgICAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfQ0hLX0NPTkRJVElPTikgeworCisgICAgICAgIHFfY250bCB8PSBRQ19SRVFfU0VOU0U7CisKKyAgICAgICAgaWYgKChhc2NfZHZjLT5pbml0X3NkdHIgJiB0YXJnZXRfaWQpICE9IDApIHsKKworICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH50YXJnZXRfaWQ7CisKKyAgICAgICAgICAgIHNkdHJfZGF0YSA9IEFzY0dldE1Db2RlSW5pdFNEVFJBdElEKGlvcF9iYXNlLCB0aWRfbm8pOworICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgICAgICAgICBBc2NNc2dPdXRTRFRSKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsoc2R0cl9kYXRhID4+IDQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGFzY19kdmMtPm1heF9zZHRyX2luZGV4IC0gMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChzZHRyX2RhdGEgJiAodWNoYXIpIEFTQ19TWU5fTUFYX09GRlNFVCkpOworICAgICAgICB9CisKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworCisgICAgICAgIHRhZ19jb2RlID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9UQUdfQ09ERSkpOworICAgICAgICB0YWdfY29kZSAmPSAweERDOworICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJiB0YXJnZXRfaWQpCisgICAgICAgICAgICAgICAmJiAhKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyAmIHRhcmdldF9pZCkKKykgeworCisgICAgICAgICAgICB0YWdfY29kZSB8PSAoQVNDX1RBR19GTEFHX0RJU0FCTEVfRElTQ09OTkVDVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCk7CisKKyAgICAgICAgfQorICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFHX0NPREUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19jb2RlKTsKKworICAgICAgICBxX3N0YXR1cyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKyAgICAgICAgcV9zdGF0dXMgfD0gKFFTX1JFQURZIHwgUVNfQlVTWSk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NUQVRVUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcV9zdGF0dXMpOworCisgICAgICAgIHNjc2lfYnVzeSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7CisgICAgICAgIHNjc2lfYnVzeSAmPSB+dGFyZ2V0X2lkOworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IsIHNjc2lfYnVzeSk7CisKKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfU0RUUl9SRUpFQ1RFRCkgeworCisgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyRnJvbUxyYW0oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmb3V0X21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRVhUX01TRykgPj4gMSk7CisKKyAgICAgICAgaWYgKChvdXRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCkgJiYKKyAgICAgICAgICAgIChvdXRfbXNnLm1zZ19sZW4gPT0gTVNfU0RUUl9MRU4pICYmCisgICAgICAgICAgICAob3V0X21zZy5tc2dfcmVxID09IE1TX1NEVFJfQ09ERSkpIHsKKworICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnRhcmdldF9pZDsKKyAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisgICAgICAgICAgICBib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gYXN5bl9zZHRyOworICAgICAgICB9CisgICAgICAgIHFfY250bCAmPSB+UUNfTVNHX09VVDsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworICAgICAgICByZXR1cm4gKDApOworICAgIH0gZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9TU19RVUVVRV9GVUxMKSB7CisKKyAgICAgICAgc2NzaV9zdGF0dXMgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgKHVzaG9ydCkgKCh1c2hvcnQpIGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX1NDU0lfU1RBVFVTKSk7CisgICAgICAgIGN1cl9kdmNfcW5nID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKCh1c2hvcnQpIEFTQ19RQURSX0JFRyArICh1c2hvcnQpIHRhcmdldF9peCkpOworICAgICAgICBpZiAoKGN1cl9kdmNfcW5nID4gMCkgJiYKKyAgICAgICAgICAgIChhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dID4gMCkpIHsKKworICAgICAgICAgICAgc2NzaV9idXN5ID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7CisgICAgICAgICAgICBzY3NpX2J1c3kgfD0gdGFyZ2V0X2lkOworICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgQVNDVl9TQ1NJQlVTWV9CLCBzY3NpX2J1c3kpOworICAgICAgICAgICAgYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5IHw9IHRhcmdldF9pZDsKKworICAgICAgICAgICAgaWYgKHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyX2R2Y19xbmcgPiBBU0NfTUlOX1RBR0dFRF9DTUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2R2Y19xbmcgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSA9IGN1cl9kdmNfcW5nOworCisgICAgICAgICAgICAgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpICgodXNob3J0KSBBU0NWX01BWF9EVkNfUU5HX0JFRyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSB0aWRfbm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZHZjX3FuZyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBkZXZpY2UgcXVldWUgZGVwdGggdG8gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgKiBhY3RpdmUgcmVxdWVzdHMgd2hlbiB0aGUgUVVFVUUgRlVMTCBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICogd2FzIGVuY291bnRlcmVkLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5xdWV1ZV9mdWxsIHw9IHRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5xdWV1ZV9mdWxsX2NudFt0aWRfbm9dID0gY3VyX2R2Y19xbmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorI2lmIENDX1ZFUllfTE9OR19TR19MSVNUCisgICAgZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9IT1NUX0NPUFlfU0dfTElTVF9UT19SSVNDKQorICAgIHsKKyAgICAgICAgdWNoYXIgICAgICAgICAgICAgIHFfbm87CisgICAgICAgIHVzaG9ydCAgICAgICAgICAgICBxX2FkZHI7CisgICAgICAgIHVjaGFyICAgICAgICAgICAgICBzZ193a19xX25vOworICAgICAgICB1Y2hhciAgICAgICAgICAgICAgZmlyc3Rfc2dfd2tfcV9ubzsKKyAgICAgICAgQVNDX1NDU0lfUSAgICAgICAgICpzY3NpcTsgLyogUHRyIHRvIGRyaXZlciByZXF1ZXN0LiAqLworICAgICAgICBBU0NfU0dfSEVBRCAgICAgICAgKnNnX2hlYWQ7IC8qIFB0ciB0byBkcml2ZXIgU0cgcmVxdWVzdC4gKi8KKyAgICAgICAgQVNDX1NHX0xJU1RfUSAgICAgIHNjc2lfc2dfcTsgLyogU3RydWN0dXJlIHdyaXR0ZW4gdG8gcXVldWUuICovCisgICAgICAgIHVzaG9ydCAgICAgICAgICAgICBzZ19saXN0X2R3b3JkczsKKyAgICAgICAgdXNob3J0ICAgICAgICAgICAgIHNnX2VudHJ5X2NudDsKKyAgICAgICAgdWNoYXIgICAgICAgICAgICAgIG5leHRfcXA7CisgICAgICAgIGludCAgICAgICAgICAgICAgICBpOworCisgICAgICAgIHFfbm8gPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfUkVRX1NHX0xJU1RfUVApOworICAgICAgICBpZiAocV9ubyA9PSBBU0NfUUxJTktfRU5EKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKworICAgICAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHFfbm8pOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgdGhlIHJlcXVlc3QncyBTUkIgcG9pbnRlciB0byBhIGhvc3QgQVNDX1NDU0lfUkVRCisgICAgICAgICAqIHN0cnVjdHVyZSBwb2ludGVyIHVzaW5nIGEgbWFjcm8gcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4KKyAgICAgICAgICogVGhlIEFTQ19TQ1NJX1JFUSBwb2ludGVyIHByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUKKyAgICAgICAgICogaG9zdCBBU0NfU0dfSEVBRCBzdHJ1Y3R1cmUuCisgICAgICAgICAqLworICAgICAgICAvKiBSZWFkIHJlcXVlc3QncyBTUkIgcG9pbnRlci4gKi8KKyAgICAgICAgc2NzaXEgPSAoQVNDX1NDU0lfUSAqKQorICAgICAgICAgICBBU0NfU1JCMlNDU0lRKAorICAgICAgICAgICAgICAgQVNDX1UzMl9UT19WQUREUihBc2NSZWFkTHJhbURXb3JkKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9EX1NSQlBUUikpKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHJlcXVlc3QncyBmaXJzdCBhbmQgd29ya2luZyBTRyBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIHNnX3drX3Ffbm8gPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyICsgQVNDX1NDU0lRX0JfU0dfV0tfUVApKTsKKworICAgICAgICBmaXJzdF9zZ193a19xX25vID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZJUlNUX1NHX1dLX1FQKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgcmVxdWVzdCdzIHdvcmtpbmcgU0cgcXVldWUgYmFjayB0byB0aGUKKyAgICAgICAgICogZmlyc3QgU0cgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NHX1dLX1FQKSwKKyAgICAgICAgICAgIGZpcnN0X3NnX3drX3Ffbm8pOworCisgICAgICAgIHNnX2hlYWQgPSBzY3NpcS0+c2dfaGVhZDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgc2dfZW50cnlfY250IHRvIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMKKyAgICAgICAgICogdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCBvbiB0aGlzIGludGVycnVwdC4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMgY29udGFpbiBBU0NfTUFYX1NHX0xJU1QgLSAxCisgICAgICAgICAqIFNHIGVsZW1lbnRzLiBUaGUgZGF0YV9jbnQgYW5kIGRhdGFfYWRkciBmaWVsZHMgd2hpY2gKKyAgICAgICAgICogYWRkIDEgdG8gdGhlIFNHIGVsZW1lbnQgY2FwYWNpdHkgYXJlIG5vdCB1c2VkIHdoZW4KKyAgICAgICAgICogcmVzdGFydGluZyBTRyBoYW5kbGluZyBhZnRlciBhIGhhbHQuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPiAoQVNDX01BWF9TR19MSVNUIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICBzZ19lbnRyeV9jbnQgPSBBU0NfTUFYX1NHX0xJU1QgLSAxOworCisgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHJlbWFpbmluZyBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdCB3aWxsCisgICAgICAgICAgICAgICogbmVlZCB0byBiZSBoYW5kbGVkIG9uIHRoZSBuZXh0IGludGVycnVwdC4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCAtPSAoQVNDX01BWF9TR19MSVNUIC0gMSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQ7CisgICAgICAgICAgICAgc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBTRyBlbGVtZW50cyBpbnRvIHRoZSBsaXN0IG9mIGFsbG9jYXRlZCBTRyBxdWV1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIExhc3QgaW5kZXggY29tcGxldGVkIGlzIHNhdmVkIGluIHNjc2lxLT5uZXh0X3NnX2luZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgbmV4dF9xcCA9IGZpcnN0X3NnX3drX3Ffbm87CisgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIobmV4dF9xcCk7CisgICAgICAgIHNjc2lfc2dfcS5zZ19oZWFkX3FwID0gcV9ubzsKKyAgICAgICAgc2NzaV9zZ19xLmNudGwgPSBRQ1NHX1NHX1hGRVJfTElTVDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNnX2hlYWQtPnF1ZXVlX2NudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgc2NzaV9zZ19xLnNlcV9ubyA9IGkgKyAxOworICAgICAgICAgICAgIGlmIChzZ19lbnRyeV9jbnQgPiBBU0NfU0dfTElTVF9QRVJfUSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHNnX2xpc3RfZHdvcmRzID0gKHVjaGFyKSAoQVNDX1NHX0xJU1RfUEVSX1EgKiAyKTsKKyAgICAgICAgICAgICAgICAgc2dfZW50cnlfY250IC09IEFTQ19TR19MSVNUX1BFUl9ROworICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgKiBBZnRlciB2ZXJ5IGZpcnN0IFNHIHF1ZXVlIFJJU0MgRlcgdXNlcyBuZXh0CisgICAgICAgICAgICAgICAgICAqIFNHIHF1ZXVlIGZpcnN0IGVsZW1lbnQgdGhlbiBjaGVja3Mgc2dfbGlzdF9jbnQKKyAgICAgICAgICAgICAgICAgICogYWdhaW5zdCB6ZXJvIGFuZCB0aGVuIGRlY3JlbWVudHMsIHNvIHNldAorICAgICAgICAgICAgICAgICAgKiBzZ19saXN0X2NudCAxIGxlc3MgdGhhbiBudW1iZXIgb2YgU0cgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICogaW4gZWFjaCBTRyBxdWV1ZS4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKKyAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBsYXN0IFNHIHF1ZXVlIGluIHRoZSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIElmIHRoZXJlIGFyZSBtb3JlCisgICAgICAgICAgICAgICAgICAqIFNHIGVsZW1lbnRzIHRoYW4gd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgKiBxdWV1ZXMsIHRoZW4gc2V0IHRoZSBRQ1NHX1NHX1hGRVJfTU9SRSBmbGFnLgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgaWYgKHNjc2lxLT5yZW1haW5fc2dfZW50cnlfY250ICE9IDApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5jbnRsIHw9IFFDU0dfU0dfWEZFUl9NT1JFOworICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLmNudGwgfD0gUUNTR19TR19YRkVSX0VORDsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAvKiBlcXVhbHMgc2dfZW50cnlfY250ICogMiAqLworICAgICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkcyA9IHNnX2VudHJ5X2NudCA8PCAxOworICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPSBzZ19lbnRyeV9jbnQgLSAxOworICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKKyAgICAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBzY3NpX3NnX3EucV9ubyA9IG5leHRfcXA7CisgICAgICAgICAgICAgQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TQ1NJUV9TR0hEX0NQWV9CRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmc2NzaV9zZ19xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVNDX1NHX0xJU1RfUSkgPj4gMSk7CisKKyAgICAgICAgICAgICBBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TR1FfTElTVF9CRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmc2dfaGVhZC0+c2dfbGlzdFtzY3NpcS0+bmV4dF9zZ19pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNnX2xpc3RfZHdvcmRzKTsKKworICAgICAgICAgICAgIHNjc2lxLT5uZXh0X3NnX2luZGV4ICs9IEFTQ19TR19MSVNUX1BFUl9ROworCisgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgKiBJZiB0aGUganVzdCBjb21wbGV0ZWQgU0cgcXVldWUgY29udGFpbmVkIHRoZQorICAgICAgICAgICAgICAqIGxhc3QgU0cgZWxlbWVudCwgdGhlbiBubyBtb3JlIFNHIHF1ZXVlcyBuZWVkCisgICAgICAgICAgICAgICogdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBpZiAoc2NzaV9zZ19xLmNudGwgJiBRQ1NHX1NHX1hGRVJfRU5EKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgbmV4dF9xcCA9IEFzY1JlYWRMcmFtQnl0ZSggaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICggdXNob3J0ICkoIHFfYWRkcitBU0NfU0NTSVFfQl9GV0QgKSApOworICAgICAgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIoIG5leHRfcXAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBoYWx0IGNvbmRpdGlvbiBzbyB0aGUgUklTQyB3aWxsIGJlIHJlc3RhcnRlZAorICAgICAgICAgKiBhZnRlciB0aGUgcmV0dXJuLgorICAgICAgICAgKi8KKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB1Y2hhcgorX0FzY0NvcHlMcmFtU2NzaURvbmVRKAorICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBxX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1FET05FX0lORk8gKiBzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfRENOVCBtYXhfZG1hX2NvdW50CispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBfdmFsOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfcXVldWVfY250OworCisgICAgRHZjR2V0UWluZm8oaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX0RPTkVfSU5GT19CRUcsCisgICAgICAgICAgICAgICAgKHVjaGFyICopIHNjc2lxLAorICAgICAgICAgICAgICAgIChzaXplb2YgKEFTQ19TQ1NJUV8yKSArIHNpemVvZiAoQVNDX1NDU0lRXzMpKSAvIDIpOworCisgICAgX3ZhbCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKyAgICBzY3NpcS0+cV9zdGF0dXMgPSAodWNoYXIpIF92YWw7CisgICAgc2NzaXEtPnFfbm8gPSAodWNoYXIpIChfdmFsID4+IDgpOworICAgIF92YWwgPSBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCkpOworICAgIHNjc2lxLT5jbnRsID0gKHVjaGFyKSBfdmFsOworICAgIHNnX3F1ZXVlX2NudCA9ICh1Y2hhcikgKF92YWwgPj4gOCk7CisgICAgX3ZhbCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TRU5TRV9MRU4pKTsKKyAgICBzY3NpcS0+c2Vuc2VfbGVuID0gKHVjaGFyKSBfdmFsOworICAgIHNjc2lxLT5leHRyYV9ieXRlcyA9ICh1Y2hhcikgKF92YWwgPj4gOCk7CisKKyAgICAvKgorICAgICAqIFJlYWQgaGlnaCB3b3JkIG9mIHJlbWFpbiBieXRlcyBmcm9tIGFsdGVybmF0ZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBzY3NpcS0+cmVtYWluX2J5dGVzID0gKCgoQURWX0RDTlQpIEFzY1JlYWRMcmFtV29yZCggaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkcisgKHVzaG9ydCkgQVNDX1NDU0lRX1dfQUxUX0RDMSkpKSA8PCAxNik7CisgICAgLyoKKyAgICAgKiBSZWFkIGxvdyB3b3JkIG9mIHJlbWFpbiBieXRlcyBmcm9tIG9yaWdpbmFsIGxvY2F0aW9uLgorICAgICAqLworICAgIHNjc2lxLT5yZW1haW5fYnl0ZXMgKz0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAorICAgICAgICAodXNob3J0KSAocV9hZGRyKyAodXNob3J0KSBBU0NfU0NTSVFfRFdfUkVNQUlOX1hGRVJfQ05UKSk7CisKKyAgICBzY3NpcS0+cmVtYWluX2J5dGVzICY9IG1heF9kbWFfY291bnQ7CisgICAgcmV0dXJuIChzZ19xdWV1ZV9jbnQpOworfQorCitTVEFUSUMgaW50CitBc2NJc3JRRG9uZSgKKyAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICBuZXh0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgbl9xX3VzZWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzZ19saXN0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfcXVldWVfY250OworICAgIHVjaGFyICAgICAgICAgICAgICAgcV9jbnQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBkb25lX3FfdGFpbDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRpZF9ubzsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzY3NpX2J1c3k7CisgICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdGFyZ2V0X2lkOworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICBxX2FkZHI7CisgICAgdXNob3J0ICAgICAgICAgICAgICBzZ19xX2FkZHI7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjdXJfdGFyZ2V0X3FuZzsKKyAgICBBU0NfUURPTkVfSU5GTyAgICAgIHNjc2lxX2J1ZjsKKyAgICBBU0NfUURPTkVfSU5GTyAqc2NzaXE7CisgICAgaW50ICAgICAgICAgICAgICAgICBmYWxzZV9vdmVycnVuOworICAgIEFTQ19JU1JfQ0FMTEJBQ0sgICAgYXNjX2lzcl9jYWxsYmFjazsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgYXNjX2lzcl9jYWxsYmFjayA9IGFzY19kdmMtPmlzcl9jYWxsYmFjazsKKyAgICBuX3FfdXNlZCA9IDE7CisgICAgc2NzaXEgPSAoQVNDX1FET05FX0lORk8gKikgJiBzY3NpcV9idWY7CisgICAgZG9uZV9xX3RhaWwgPSAodWNoYXIpIEFzY0dldFZhckRvbmVRVGFpbChpb3BfYmFzZSk7CisgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihkb25lX3FfdGFpbCk7CisgICAgbmV4dF9xcCA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9GV0QpKTsKKyAgICBpZiAobmV4dF9xcCAhPSBBU0NfUUxJTktfRU5EKSB7CisgICAgICAgIEFzY1B1dFZhckRvbmVRVGFpbChpb3BfYmFzZSwgbmV4dF9xcCk7CisgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIobmV4dF9xcCk7CisgICAgICAgIHNnX3F1ZXVlX2NudCA9IF9Bc2NDb3B5THJhbVNjc2lEb25lUShpb3BfYmFzZSwgcV9hZGRyLCBzY3NpcSwKKyAgICAgICAgICAgIGFzY19kdmMtPm1heF9kbWFfY291bnQpOworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpLAorICAgICAgICAgICAgICh1Y2hhcikgKHNjc2lxLT5xX3N0YXR1cyAmICh1Y2hhcikgfiAoUVNfUkVBRFkgfCBRU19BQk9SVEVEKSkpOworICAgICAgICB0aWRfbm8gPSBBU0NfVElYX1RPX1RJRChzY3NpcS0+ZDIudGFyZ2V0X2l4KTsKKyAgICAgICAgdGFyZ2V0X2lkID0gQVNDX1RJWF9UT19UQVJHRVRfSUQoc2NzaXEtPmQyLnRhcmdldF9peCk7CisgICAgICAgIGlmICgoc2NzaXEtPmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisgICAgICAgICAgICBzZ19xX2FkZHIgPSBxX2FkZHI7CisgICAgICAgICAgICBzZ19saXN0X3FwID0gbmV4dF9xcDsKKyAgICAgICAgICAgIGZvciAocV9jbnQgPSAwOyBxX2NudCA8IHNnX3F1ZXVlX2NudDsgcV9jbnQrKykgeworICAgICAgICAgICAgICAgIHNnX2xpc3RfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc2dfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfRldEKSk7CisgICAgICAgICAgICAgICAgc2dfcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihzZ19saXN0X3FwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2dfbGlzdF9xcCA9PSBBU0NfUUxJTktfRU5EKSB7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9TR19RX0xJTktTKTsKKyAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX1dJVEhfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5kMy5ob3N0X3N0YXQgPSBRSFNUQV9EX1FET05FX1NHX0xJU1RfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZBVEFMX0VSUl9RRE9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc2dfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfU1RBVFVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTX0ZSRUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbl9xX3VzZWQgPSBzZ19xdWV1ZV9jbnQgKyAxOworICAgICAgICAgICAgQXNjUHV0VmFyRG9uZVFUYWlsKGlvcF9iYXNlLCBzZ19saXN0X3FwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICYgdGFyZ2V0X2lkKSB7CisgICAgICAgICAgICBjdXJfdGFyZ2V0X3FuZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICh1c2hvcnQpICgodXNob3J0KSBBU0NfUUFEUl9CRUcgKyAodXNob3J0KSBzY3NpcS0+ZDIudGFyZ2V0X2l4KSk7CisgICAgICAgICAgICBpZiAoY3VyX3RhcmdldF9xbmcgPCBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dKSB7CisgICAgICAgICAgICAgICAgc2NzaV9idXN5ID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IpOworICAgICAgICAgICAgICAgIHNjc2lfYnVzeSAmPSB+dGFyZ2V0X2lkOworICAgICAgICAgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IsIHNjc2lfYnVzeSk7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFzY19kdmMtPmN1cl90b3RhbF9xbmcgPj0gbl9xX3VzZWQpIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmN1cl90b3RhbF9xbmcgLT0gbl9xX3VzZWQ7CisgICAgICAgICAgICBpZiAoYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXS0tOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0NVUl9RTkcpOworICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX1dJVEhfRVJST1I7CisgICAgICAgICAgICBnb3RvIEZBVEFMX0VSUl9RRE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNjc2lxLT5kMi5zcmJfcHRyID09IDBVTCkgfHwKKyAgICAgICAgICAgICgoc2NzaXEtPnFfc3RhdHVzICYgUVNfQUJPUlRFRCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoMHgxMSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2NzaXEtPnFfc3RhdHVzID09IFFTX0RPTkUpIHsKKyAgICAgICAgICAgIGZhbHNlX292ZXJydW4gPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChzY3NpcS0+ZXh0cmFfYnl0ZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNjc2lxLT5yZW1haW5fYnl0ZXMgKz0gKEFEVl9EQ05UKSBzY3NpcS0+ZXh0cmFfYnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2NzaXEtPmQzLmRvbmVfc3RhdCA9PSBRRF9XSVRIX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKHNjc2lxLT5kMy5ob3N0X3N0YXQgPT0gUUhTVEFfTV9EQVRBX09WRVJfUlVOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc2NzaXEtPmNudGwgJiAoUUNfREFUQV9JTiB8IFFDX0RBVEFfT1VUKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmhvc3Rfc3RhdCA9IFFIU1RBX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbHNlX292ZXJydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5kMy5kb25lX3N0YXQgPSBRRF9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5kMy5ob3N0X3N0YXQgPSBRSFNUQV9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NzaXEtPmQzLmhvc3Rfc3RhdCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUhTVEFfTV9IVU5HX1JFUV9TQ1NJX0JVU19SRVNFVCkgeworICAgICAgICAgICAgICAgICAgICBBc2NTdG9wQ2hpcChpb3BfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoQ0NfU0NTSV9SRVNFVCB8IENDX0hBTFQpKTsKKyAgICAgICAgICAgICAgICAgICAgRHZjRGVsYXlOYW5vU2Vjb25kKGFzY19kdmMsIDYwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIENDX0hBTFQpOworICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfQ0xSX1NDU0lfUkVTRVRfSU5UKTsKKyAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNjc2lxLT5jbnRsICYgUUNfTk9fQ0FMTEJBQ0spID09IDApIHsKKyAgICAgICAgICAgICAgICAoKmFzY19pc3JfY2FsbGJhY2spIChhc2NfZHZjLCBzY3NpcSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0NEQl9CRUcpKSA9PQorICAgICAgICAgICAgICAgICAgICAgU1RBUlRfU1RPUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+dW5pdF9ub3RfcmVhZHkgJj0gfnRhcmdldF9pZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjc2lxLT5kMy5kb25lX3N0YXQgIT0gUURfTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yICY9IH50YXJnZXRfaWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX1FfU1RBVFVTKTsKKyAgICAgICAgICBGQVRBTF9FUlJfUURPTkU6CisgICAgICAgICAgICBpZiAoKHNjc2lxLT5jbnRsICYgUUNfTk9fQ0FMTEJBQ0spID09IDApIHsKKyAgICAgICAgICAgICAgICAoKmFzY19pc3JfY2FsbGJhY2spIChhc2NfZHZjLCBzY3NpcSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKDB4ODApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY0lTUigKKyAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIEFTQ19DU19UWVBFICAgICAgICAgY2hpcHN0YXQ7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNhdmVkX3JhbV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgY3RybF9yZWc7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzYXZlZF9jdHJsX3JlZzsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGludF9wZW5kaW5nOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIHVjaGFyICAgICAgICAgICAgICAgaG9zdF9mbGFnOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICBpbnRfcGVuZGluZyA9IEZBTFNFOworCisgICAgaWYgKEFzY0lzSW50UGVuZGluZyhpb3BfYmFzZSkgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbnRfcGVuZGluZzsKKyAgICB9CisKKyAgICBpZiAoKChhc2NfZHZjLT5pbml0X3N0YXRlICYgQVNDX0lOSVRfU1RBVEVfRU5EX0xPQURfTUMpID09IDApCisgICAgICAgIHx8IChhc2NfZHZjLT5pc3JfY2FsbGJhY2sgPT0gMCkKKykgeworICAgICAgICByZXR1cm4gKEVSUik7CisgICAgfQorICAgIGlmIChhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQgIT0gMCkgeworICAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfSVNSX09OX0NSSVRJQ0FMKTsKKyAgICAgICAgcmV0dXJuIChFUlIpOworICAgIH0KKyAgICBpZiAoYXNjX2R2Yy0+aXNfaW5faW50KSB7CisgICAgICAgIEFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9JU1JfUkVfRU5UUlkpOworICAgICAgICByZXR1cm4gKEVSUik7CisgICAgfQorICAgIGFzY19kdmMtPmlzX2luX2ludCA9IFRSVUU7CisgICAgY3RybF9yZWcgPSBBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSk7CisgICAgc2F2ZWRfY3RybF9yZWcgPSBjdHJsX3JlZyAmICh+KENDX1NDU0lfUkVTRVQgfCBDQ19DSElQX1JFU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NfU0lOR0xFX1NURVAgfCBDQ19ESUFHIHwgQ0NfVEVTVCkpOworICAgIGNoaXBzdGF0ID0gQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSk7CisgICAgaWYgKGNoaXBzdGF0ICYgQ1NXX1NDU0lfUkVTRVRfTEFUQ0gpIHsKKyAgICAgICAgaWYgKCEoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX1ZMIHwgQVNDX0lTX0VJU0EpKSkgeworICAgICAgICAgICAgaW50IGkgPSAxMDsKKyAgICAgICAgICAgIGludF9wZW5kaW5nID0gVFJVRTsKKyAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSA9IDA7CisgICAgICAgICAgICBzYXZlZF9jdHJsX3JlZyAmPSAodWNoYXIpICh+Q0NfSEFMVCk7CisgICAgICAgICAgICB3aGlsZSAoKEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpICYgQ1NXX1NDU0lfUkVTRVRfQUNUSVZFKSAmJgorICAgICAgICAgICAgICAgICAgIChpLS0gPiAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCAoQ0NfQ0hJUF9SRVNFVCB8IENDX0hBTFQpKTsKKyAgICAgICAgICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19IQUxUKTsKKyAgICAgICAgICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19DTFJfU0NTSV9SRVNFVF9JTlQpOworICAgICAgICAgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgICAgICAgICBjaGlwc3RhdCA9IEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpOworICAgICAgICB9CisgICAgfQorICAgIHNhdmVkX3JhbV9hZGRyID0gQXNjR2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlKTsKKyAgICBob3N0X2ZsYWcgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgIEFTQ1ZfSE9TVF9GTEFHX0IpICYgKHVjaGFyKSAofkFTQ19IT1NUX0ZMQUdfSU5fSVNSKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaG9zdF9mbGFnIHwgKHVjaGFyKSBBU0NfSE9TVF9GTEFHX0lOX0lTUikpOworICAgIGlmICgoY2hpcHN0YXQgJiBDU1dfSU5UX1BFTkRJTkcpCisgICAgICAgIHx8IChpbnRfcGVuZGluZykKKykgeworICAgICAgICBBc2NBY2tJbnRlcnJ1cHQoaW9wX2Jhc2UpOworICAgICAgICBpbnRfcGVuZGluZyA9IFRSVUU7CisgICAgICAgIGlmICgoY2hpcHN0YXQgJiBDU1dfSEFMVEVEKSAmJgorICAgICAgICAgICAgKGN0cmxfcmVnICYgQ0NfU0lOR0xFX1NURVApKSB7CisgICAgICAgICAgICBpZiAoQXNjSXNyQ2hpcEhhbHRlZChhc2NfZHZjKSA9PSBFUlIpIHsKKyAgICAgICAgICAgICAgICBnb3RvIElTUl9SRVBPUlRfUURPTkVfRkFUQUxfRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNhdmVkX2N0cmxfcmVnICY9ICh1Y2hhcikgKH5DQ19IQUxUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJU1JfUkVQT1JUX1FET05FX0ZBVEFMX0VSUk9SOgorICAgICAgICAgICAgaWYgKChhc2NfZHZjLT5kdmNfY250bCAmIEFTQ19DTlRMX0lOVF9NVUxUSV9RKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgoc3RhdHVzID0gQXNjSXNyUURvbmUoYXNjX2R2YykpICYgMHgwMSkgIT0gMCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IEFzY0lzclFEb25lKGFzY19kdmMpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSAweDExKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHg4MCkgIT0gMCkKKyAgICAgICAgICAgICAgICBpbnRfcGVuZGluZyA9IEVSUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLCBob3N0X2ZsYWcpOworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc2F2ZWRfcmFtX2FkZHIpOworICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBzYXZlZF9jdHJsX3JlZyk7CisgICAgYXNjX2R2Yy0+aXNfaW5faW50ID0gRkFMU0U7CisgICAgcmV0dXJuIChpbnRfcGVuZGluZyk7Cit9CisKKy8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCitTVEFUSUMgdWNoYXIgX2FzY19tY29kZV9idWZbXSA9Cit7CisgIDB4MDEsICAweDAzLCAgMHgwMSwgIDB4MTksICAweDBGLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MEYsICAweDBGLCAgMHgwRiwgIDB4MEYsICAweDBGLCAgMHgwRiwgIDB4MEYsICAweDBGLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEMzLCAgMHgxMiwgIDB4MEQsICAweDA1LCAgMHgwMSwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEZGLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEZGLCAgMHg4MCwgIDB4RkYsICAweEZGLCAgMHgwMSwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MjMsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDcsICAweDAwLCAgMHhGRiwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4RkYsICAweEZGLCAgMHhGRiwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweEU0LCAgMHg4OCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCisgIDB4ODAsICAweDczLCAgMHg0OCwgIDB4MDQsICAweDM2LCAgMHgwMCwgIDB4MDAsICAweEEyLCAgMHhDMiwgIDB4MDAsICAweDgwLCAgMHg3MywgIDB4MDMsICAweDIzLCAgMHgzNiwgIDB4NDAsCisgIDB4QjYsICAweDAwLCAgMHgzNiwgIDB4MDAsICAweDA1LCAgMHhENiwgIDB4MEMsICAweEQyLCAgMHgxMiwgIDB4REEsICAweDAwLCAgMHhBMiwgIDB4QzIsICAweDAwLCAgMHg5MiwgIDB4ODAsCisgIDB4MUUsICAweDk4LCAgMHg1MCwgIDB4MDAsICAweEY1LCAgMHgwMCwgIDB4NDgsICAweDk4LCAgMHhERiwgIDB4MjMsICAweDM2LCAgMHg2MCwgIDB4QjYsICAweDAwLCAgMHg5MiwgIDB4ODAsCisgIDB4NEYsICAweDAwLCAgMHhGNSwgIDB4MDAsICAweDQ4LCAgMHg5OCwgIDB4RUYsICAweDIzLCAgMHgzNiwgIDB4NjAsICAweEI2LCAgMHgwMCwgIDB4OTIsICAweDgwLCAgMHg4MCwgIDB4NjIsCisgIDB4OTIsICAweDgwLCAgMHgwMCwgIDB4NDYsICAweDE1LCAgMHhFRSwgIDB4MTMsICAweEVBLCAgMHgwMiwgIDB4MDEsICAweDA5LCAgMHhEOCwgIDB4Q0QsICAweDA0LCAgMHg0RCwgIDB4MDAsCisgIDB4MDAsICAweEEzLCAgMHhENiwgIDB4MDAsICAweEE2LCAgMHg5NywgIDB4N0YsICAweDIzLCAgMHgwNCwgIDB4NjEsICAweDg0LCAgMHgwMSwgIDB4RTYsICAweDg0LCAgMHhEMiwgIDB4QzEsCisgIDB4ODAsICAweDczLCAgMHhDRCwgIDB4MDQsICAweDRELCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHhEQSwgIDB4MDEsICAweEE2LCAgMHg5NywgIDB4QzYsICAweDgxLCAgMHhDMiwgIDB4ODgsCisgIDB4ODAsICAweDczLCAgMHg4MCwgIDB4NzcsICAweDAwLCAgMHgwMSwgIDB4MDEsICAweEExLCAgMHhGRSwgIDB4MDAsICAweDRGLCAgMHgwMCwgIDB4ODQsICAweDk3LCAgMHgwNywgIDB4QTYsCisgIDB4MDgsICAweDAxLCAgMHgwMCwgIDB4MzMsICAweDAzLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwMywgIDB4MDMsICAweDAxLCAgMHhERSwgIDB4QzIsICAweDg4LCAgMHhDRSwgIDB4MDAsCisgIDB4NjksICAweDYwLCAgMHhDRSwgIDB4MDAsICAweDAyLCAgMHgwMywgIDB4NEEsICAweDYwLCAgMHgwMCwgIDB4QTIsICAweDc4LCAgMHgwMSwgIDB4ODAsICAweDYzLCAgMHgwNywgIDB4QTYsCisgIDB4MjQsICAweDAxLCAgMHg3OCwgIDB4ODEsICAweDAzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHhFMiwgIDB4MDAsICAweDA3LCAgMHhBNiwgIDB4MzQsICAweDAxLCAgMHgwMCwgIDB4MzMsCisgIDB4MDQsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAzLCAgMHgwNywgIDB4MDIsICAweDAxLCAgMHgwNCwgIDB4Q0EsICAweDBELCAgMHgyMywgIDB4NjgsICAweDk4LCAgMHg0RCwgIDB4MDQsCisgIDB4MDQsICAweDg1LCAgMHgwNSwgIDB4RDgsICAweDBELCAgMHgyMywgIDB4NjgsICAweDk4LCAgMHhDRCwgIDB4MDQsICAweDE1LCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHhGQiwgIDB4MjMsCisgIDB4MDIsICAweDYxLCAgMHg4MiwgIDB4MDEsICAweDgwLCAgMHg2MywgIDB4MDIsICAweDAzLCAgMHgwNiwgIDB4QTMsICAweDYyLCAgMHgwMSwgIDB4MDAsICAweDMzLCAgMHgwQSwgIDB4MDAsCisgIDB4QzIsICAweDg4LCAgMHg0RSwgIDB4MDAsICAweDA3LCAgMHhBMywgIDB4NkUsICAweDAxLCAgMHgwMCwgIDB4MzMsICAweDBCLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHhDRCwgIDB4MDQsCisgIDB4MzYsICAweDJELCAgMHgwMCwgIDB4MzMsICAweDFBLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHg1MCwgIDB4MDQsICAweDg4LCAgMHg4MSwgIDB4MDYsICAweEFCLCAgMHg4MiwgIDB4MDEsCisgIDB4ODgsICAweDgxLCAgMHg0RSwgIDB4MDAsICAweDA3LCAgMHhBMywgIDB4OTIsICAweDAxLCAgMHg1MCwgIDB4MDAsICAweDAwLCAgMHhBMywgIDB4M0MsICAweDAxLCAgMHgwMCwgIDB4MDUsCisgIDB4N0MsICAweDgxLCAgMHg0NiwgIDB4OTcsICAweDAyLCAgMHgwMSwgIDB4MDUsICAweEM2LCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4MTUsICAweDIzLCAgMHhBMSwgIDB4MDEsCisgIDB4QkUsICAweDgxLCAgMHhGRCwgIDB4MjMsICAweDAyLCAgMHg2MSwgIDB4ODIsICAweDAxLCAgMHgwQSwgIDB4REEsICAweDRBLCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTAsCisgIDB4QjQsICAweDAxLCAgMHg4MCwgIDB4NjMsICAweENELCAgMHgwNCwgIDB4MzYsICAweDJELCAgMHgwMCwgIDB4MzMsICAweDFCLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwNiwgIDB4MjMsCisgIDB4NjgsICAweDk4LCAgMHhDRCwgIDB4MDQsICAweEU2LCAgMHg4NCwgIDB4MDYsICAweDAxLCAgMHgwMCwgIDB4QTIsICAweEQ0LCAgMHgwMSwgIDB4NTcsICAweDYwLCAgMHgwMCwgIDB4QTAsCisgIDB4REEsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweDgwLCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweDgwLCAgMHg3MywgIDB4NEIsICAweDAwLCAgMHgwNiwgIDB4NjEsCisgIDB4MDAsICAweEEyLCAgMHgwMCwgIDB4MDIsICAweDA0LCAgMHgwMSwgIDB4MEMsICAweERFLCAgMHgwMiwgIDB4MDEsICAweDAzLCAgMHhDQywgIDB4NEYsICAweDAwLCAgMHg4NCwgIDB4OTcsCisgIDB4RkMsICAweDgxLCAgMHgwOCwgIDB4MjMsICAweDAyLCAgMHg0MSwgIDB4ODIsICAweDAxLCAgMHg0RiwgIDB4MDAsICAweDYyLCAgMHg5NywgIDB4NDgsICAweDA0LCAgMHg4NCwgIDB4ODAsCisgIDB4RjAsICAweDk3LCAgMHgwMCwgIDB4NDYsICAweDU2LCAgMHgwMCwgIDB4MDMsICAweEMwLCAgMHgwMSwgIDB4MjMsICAweEU4LCAgMHgwMCwgIDB4ODEsICAweDczLCAgMHgwNiwgIDB4MjksCisgIDB4MDMsICAweDQyLCAgMHgwNiwgIDB4RTIsICAweDAzLCAgMHhFRSwgIDB4NkIsICAweEVCLCAgMHgxMSwgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MDQsICAweDk4LCAgMHhGMCwgIDB4ODAsCisgIDB4ODAsICAweDczLCAgMHg4MCwgIDB4NzcsICAweDA3LCAgMHhBNCwgIDB4MkEsICAweDAyLCAgMHg3QywgIDB4OTUsICAweDA2LCAgMHhBNiwgIDB4MzQsICAweDAyLCAgMHgwMywgIDB4QTYsCisgIDB4NEMsICAweDA0LCAgMHg0NiwgIDB4ODIsICAweDA0LCAgMHgwMSwgIDB4MDMsICAweEQ4LCAgMHhCNCwgIDB4OTgsICAweDZBLCAgMHg5NiwgIDB4NDYsICAweDgyLCAgMHhGRSwgIDB4OTUsCisgIDB4ODAsICAweDY3LCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4QjYsICAweDJELCAgMHgwMiwgIDB4QTYsICAweDZDLCAgMHgwMiwgIDB4MDcsICAweEE2LCAgMHg1QSwgIDB4MDIsCisgIDB4MDYsICAweEE2LCAgMHg1RSwgIDB4MDIsICAweDAzLCAgMHhBNiwgIDB4NjIsICAweDAyLCAgMHhDMiwgIDB4ODgsICAweDdDLCAgMHg5NSwgIDB4NDgsICAweDgyLCAgMHg2MCwgIDB4OTYsCisgIDB4NDgsICAweDgyLCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4MTQsICAweDIzLCAgMHhBMSwgIDB4MDEsICAweDNDLCAgMHg4NCwgIDB4MDQsICAweDAxLCAgMHgwQywgIDB4REMsCisgIDB4RTAsICAweDIzLCAgMHgyNSwgIDB4NjEsICAweEVGLCAgMHgwMCwgIDB4MTQsICAweDAxLCAgMHg0RiwgIDB4MDQsICAweEE4LCAgMHgwMSwgIDB4NkYsICAweDAwLCAgMHhBNSwgIDB4MDEsCisgIDB4MDMsICAweDIzLCAgMHhBNCwgIDB4MDEsICAweDA2LCAgMHgyMywgIDB4OUMsICAweDAxLCAgMHgyNCwgIDB4MkIsICAweDFDLCAgMHgwMSwgIDB4MDIsICAweEE2LCAgMHhBQSwgIDB4MDIsCisgIDB4MDcsICAweEE2LCAgMHg1QSwgIDB4MDIsICAweDA2LCAgMHhBNiwgIDB4NUUsICAweDAyLCAgMHgwMywgIDB4QTYsICAweDIwLCAgMHgwNCwgIDB4MDEsICAweEE2LCAgMHhCNCwgIDB4MDIsCisgIDB4MDAsICAweEE2LCAgMHhCNCwgIDB4MDIsICAweDAwLCAgMHgzMywgIDB4MTIsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAwLCAgMHgwRSwgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NDMsCisgIDB4MDAsICAweEEwLCAgMHg4QywgIDB4MDIsICAweDRELCAgMHgwNCwgIDB4MDQsICAweDAxLCAgMHgwQiwgIDB4REMsICAweEU3LCAgMHgyMywgIDB4MDQsICAweDYxLCAgMHg4NCwgIDB4MDEsCisgIDB4MTAsICAweDMxLCAgMHgxMiwgIDB4MzUsICAweDE0LCAgMHgwMSwgIDB4RUMsICAweDAwLCAgMHg2QywgIDB4MzgsICAweDAwLCAgMHgzRiwgIDB4MDAsICAweDAwLCAgMHhFQSwgIDB4ODIsCisgIDB4MTgsICAweDIzLCAgMHgwNCwgIDB4NjEsICAweDE4LCAgMHhBMCwgIDB4RTIsICAweDAyLCAgMHgwNCwgIDB4MDEsICAweEEyLCAgMHhDOCwgIDB4MDAsICAweDMzLCAgMHgxRiwgIDB4MDAsCisgIDB4QzIsICAweDg4LCAgMHgwOCwgIDB4MzEsICAweDBBLCAgMHgzNSwgIDB4MEMsICAweDM5LCAgMHgwRSwgIDB4M0QsICAweDdFLCAgMHg5OCwgIDB4QjYsICAweDJELCAgMHgwMSwgIDB4QTYsCisgIDB4MTQsICAweDAzLCAgMHgwMCwgIDB4QTYsICAweDE0LCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHgwQywgIDB4MDMsICAweDA2LCAgMHhBNiwgIDB4MTAsICAweDAzLCAgMHgwMywgIDB4QTYsCisgIDB4MjAsICAweDA0LCAgMHgwMiwgIDB4QTYsICAweDZDLCAgMHgwMiwgIDB4MDAsICAweDMzLCAgMHgzMywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHhFRSwgIDB4ODIsCisgIDB4NjAsICAweDk2LCAgMHhFRSwgIDB4ODIsICAweDgyLCAgMHg5OCwgIDB4ODAsICAweDQyLCAgMHg3RSwgIDB4OTgsICAweDY0LCAgMHhFNCwgIDB4MDQsICAweDAxLCAgMHgyRCwgIDB4QzgsCisgIDB4MzEsICAweDA1LCAgMHgwNywgIDB4MDEsICAweDAwLCAgMHhBMiwgIDB4NTQsICAweDAzLCAgMHgwMCwgIDB4NDMsICAweDg3LCAgMHgwMSwgIDB4MDUsICAweDA1LCAgMHg4NiwgIDB4OTgsCisgIDB4N0UsICAweDk4LCAgMHgwMCwgIDB4QTYsICAweDE2LCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHg0QywgIDB4MDMsICAweDAzLCAgMHhBNiwgIDB4M0MsICAweDA0LCAgMHgwNiwgIDB4QTYsCisgIDB4NTAsICAweDAzLCAgMHgwMSwgIDB4QTYsICAweDE2LCAgMHgwMywgIDB4MDAsICAweDMzLCAgMHgyNSwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHgzMiwgIDB4ODMsCisgIDB4NjAsICAweDk2LCAgMHgzMiwgIDB4ODMsICAweDA0LCAgMHgwMSwgIDB4MTAsICAweENFLCAgMHgwNywgIDB4QzgsICAweDA1LCAgMHgwNSwgIDB4RUIsICAweDA0LCAgMHgwMCwgIDB4MzMsCisgIDB4MDAsICAweDIwLCAgMHhDMCwgIDB4MjAsICAweDgxLCAgMHg2MiwgIDB4NzIsICAweDgzLCAgMHgwMCwgIDB4MDEsICAweDA1LCAgMHgwNSwgIDB4RkYsICAweEEyLCAgMHg3QSwgIDB4MDMsCisgIDB4QjEsICAweDAxLCAgMHgwOCwgIDB4MjMsICAweEIyLCAgMHgwMSwgIDB4MkUsICAweDgzLCAgMHgwNSwgIDB4MDUsICAweDE1LCAgMHgwMSwgIDB4MDAsICAweEEyLCAgMHg5QSwgIDB4MDMsCisgIDB4RUMsICAweDAwLCAgMHg2RSwgIDB4MDAsICAweDk1LCAgMHgwMSwgIDB4NkMsICAweDM4LCAgMHgwMCwgIDB4M0YsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweEE2LCAgMHg5NiwgIDB4MDMsCisgIDB4MDAsICAweEE2LCAgMHg5NiwgIDB4MDMsICAweDEwLCAgMHg4NCwgIDB4ODAsICAweDQyLCAgMHg3RSwgIDB4OTgsICAweDAxLCAgMHhBNiwgIDB4QTQsICAweDAzLCAgMHgwMCwgIDB4QTYsCisgIDB4QkMsICAweDAzLCAgMHgxMCwgIDB4ODQsICAweEE4LCAgMHg5OCwgIDB4ODAsICAweDQyLCAgMHgwMSwgIDB4QTYsICAweEE0LCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHhCMiwgIDB4MDMsCisgIDB4RDQsICAweDgzLCAgMHg3QywgIDB4OTUsICAweEE4LCAgMHg4MywgIDB4MDAsICAweDMzLCAgMHgyRiwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4QTgsICAweDk4LCAgMHg4MCwgIDB4NDIsCisgIDB4MDAsICAweEE2LCAgMHhCQywgIDB4MDMsICAweDA3LCAgMHhBNiwgIDB4Q0EsICAweDAzLCAgMHhENCwgIDB4ODMsICAweDdDLCAgMHg5NSwgIDB4QzAsICAweDgzLCAgMHgwMCwgIDB4MzMsCisgIDB4MjYsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDM4LCAgMHgyQiwgIDB4ODAsICAweDMyLCAgMHg4MCwgIDB4MzYsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHgxMiwgIDB4MjMsCisgIDB4QTEsICAweDAxLCAgMHgxMCwgIDB4ODQsICAweDA3LCAgMHhGMCwgIDB4MDYsICAweEE0LCAgMHhGNCwgIDB4MDMsICAweDgwLCAgMHg2QiwgIDB4ODAsICAweDY3LCAgMHgwNSwgIDB4MjMsCisgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDAzLCAgMHhBNiwgIDB4MEUsICAweDA0LCAgMHgwNywgIDB4QTYsICAweDA2LCAgMHgwNCwgIDB4MDYsICAweEE2LCAgMHgwQSwgIDB4MDQsCisgIDB4MDAsICAweDMzLCAgMHgxNywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHhGNCwgIDB4ODMsICAweDYwLCAgMHg5NiwgIDB4RjQsICAweDgzLCAgMHgyMCwgIDB4ODQsCisgIDB4MDcsICAweEYwLCAgMHgwNiwgIDB4QTQsICAweDIwLCAgMHgwNCwgIDB4ODAsICAweDZCLCAgMHg4MCwgIDB4NjcsICAweDA1LCAgMHgyMywgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsCisgIDB4QjYsICAweDJELCAgMHgwMywgIDB4QTYsICAweDNDLCAgMHgwNCwgIDB4MDcsICAweEE2LCAgMHgzNCwgIDB4MDQsICAweDA2LCAgMHhBNiwgIDB4MzgsICAweDA0LCAgMHgwMCwgIDB4MzMsCisgIDB4MzAsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDdDLCAgMHg5NSwgIDB4MjAsICAweDg0LCAgMHg2MCwgIDB4OTYsICAweDIwLCAgMHg4NCwgIDB4MUQsICAweDAxLCAgMHgwNiwgIDB4Q0MsCisgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODQsICAweEMwLCAgMHgyMCwgIDB4MDAsICAweDIzLCAgMHhFQSwgIDB4MDAsICAweDgxLCAgMHg2MiwgIDB4QTIsICAweDBELCAgMHg4MCwgIDB4NjMsCisgIDB4MDcsICAweEE2LCAgMHg1QSwgIDB4MDQsICAweDAwLCAgMHgzMywgIDB4MTgsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHhBMywgIDB4MDEsCisgIDB4MDcsICAweEE0LCAgMHg2NCwgIDB4MDQsICAweDIzLCAgMHgwMSwgIDB4MDAsICAweEEyLCAgMHg4NiwgIDB4MDQsICAweDBBLCAgMHhBMCwgIDB4NzYsICAweDA0LCAgMHhFMCwgIDB4MDAsCisgIDB4MDAsICAweDMzLCAgMHgxRCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MEIsICAweEEwLCAgMHg4MiwgIDB4MDQsICAweEUwLCAgMHgwMCwgIDB4MDAsICAweDMzLCAgMHgxRSwgIDB4MDAsCisgIDB4QzIsICAweDg4LCAgMHg0MiwgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MDAsICAweDIzLCAgMHgyMiwgIDB4QTMsICAweEU2LCAgMHgwNCwgIDB4MDgsICAweDIzLCAgMHgyMiwgIDB4QTMsCisgIDB4QTIsICAweDA0LCAgMHgyOCwgIDB4MjMsICAweDIyLCAgMHhBMywgIDB4QUUsICAweDA0LCAgMHgwMiwgIDB4MjMsICAweDIyLCAgMHhBMywgIDB4QzQsICAweDA0LCAgMHg0MiwgIDB4MjMsCisgIDB4RjgsICAweDg4LCAgMHg0QSwgIDB4MDAsICAweDA2LCAgMHg2MSwgIDB4MDAsICAweEEwLCAgMHhBRSwgIDB4MDQsICAweDQ1LCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNCwgIDB4OTgsCisgIDB4MDAsICAweEEyLCAgMHhDMCwgIDB4MDQsICAweEI0LCAgMHg5OCwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODIsICAweEMwLCAgMHgyMCwgIDB4ODEsICAweDYyLCAgMHhFOCwgIDB4ODEsCisgIDB4NDcsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDA0LCAgMHgwMSwgIDB4MEIsICAweERFLCAgMHgwNCwgIDB4OTgsICAweEI0LCAgMHg5OCwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODEsCisgIDB4QzAsICAweDIwLCAgMHg4MSwgIDB4NjIsICAweDE0LCAgMHgwMSwgIDB4MDAsICAweEEwLCAgMHgwMCwgIDB4MDIsICAweDQzLCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNCwgIDB4MjMsCisgIDB4QTAsICAweDAxLCAgMHg0NCwgIDB4MjMsICAweEExLCAgMHgwMSwgIDB4ODAsICAweDczLCAgMHg0RCwgIDB4MDAsICAweDAzLCAgMHhBMywgIDB4RjQsICAweDA0LCAgMHgwMCwgIDB4MzMsCisgIDB4MjcsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDA0LCAgMHgwMSwgIDB4MDQsICAweERDLCAgMHgwMiwgIDB4MjMsICAweEEyLCAgMHgwMSwgIDB4MDQsICAweDIzLCAgMHhBMCwgIDB4MDEsCisgIDB4MDQsICAweDk4LCAgMHgyNiwgIDB4OTUsICAweDRCLCAgMHgwMCwgIDB4RjYsICAweDAwLCAgMHg0RiwgIDB4MDQsICAweDRGLCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHgyMiwgIDB4MDUsCisgIDB4MDAsICAweDA1LCAgMHg3NiwgIDB4MDAsICAweDA2LCAgMHg2MSwgIDB4MDAsICAweEEyLCAgMHgxQywgIDB4MDUsICAweDBBLCAgMHg4NSwgIDB4NDYsICAweDk3LCAgMHhDRCwgIDB4MDQsCisgIDB4MjQsICAweDg1LCAgMHg0OCwgIDB4MDQsICAweDg0LCAgMHg4MCwgIDB4MDIsICAweDAxLCAgMHgwMywgIDB4REEsICAweDgwLCAgMHgyMywgIDB4ODIsICAweDAxLCAgMHgzNCwgIDB4ODUsCisgIDB4MDIsICAweDIzLCAgMHhBMCwgIDB4MDEsICAweDRBLCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTIsICAweDQwLCAgMHgwNSwgIDB4MUQsICAweDAxLCAgMHgwNCwgIDB4RDYsCisgIDB4RkYsICAweDIzLCAgMHg4NiwgIDB4NDEsICAweDRCLCAgMHg2MCwgIDB4Q0IsICAweDAwLCAgMHhGRiwgIDB4MjMsICAweDgwLCAgMHgwMSwgIDB4NDksICAweDAwLCAgMHg4MSwgIDB4MDEsCisgIDB4MDQsICAweDAxLCAgMHgwMiwgIDB4QzgsICAweDMwLCAgMHgwMSwgIDB4ODAsICAweDAxLCAgMHhGNywgIDB4MDQsICAweDAzLCAgMHgwMSwgIDB4NDksICAweDA0LCAgMHg4MCwgIDB4MDEsCisgIDB4QzksICAweDAwLCAgMHgwMCwgIDB4MDUsICAweDAwLCAgMHgwMSwgIDB4RkYsICAweEEwLCAgMHg2MCwgIDB4MDUsICAweDc3LCAgMHgwNCwgIDB4MDEsICAweDIzLCAgMHhFQSwgIDB4MDAsCisgIDB4NUQsICAweDAwLCAgMHhGRSwgIDB4QzcsICAweDAwLCAgMHg2MiwgIDB4MDAsICAweDIzLCAgMHhFQSwgIDB4MDAsICAweDAwLCAgMHg2MywgIDB4MDcsICAweEE0LCAgMHhGOCwgIDB4MDUsCisgIDB4MDMsICAweDAzLCAgMHgwMiwgIDB4QTAsICAweDhFLCAgMHgwNSwgIDB4RjQsICAweDg1LCAgMHgwMCwgIDB4MzMsICAweDJELCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwNCwgIDB4QTAsCisgIDB4QjgsICAweDA1LCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHgyMywgIDB4REYsICAweDAwLCAgMHg0QSwgIDB4MDAsICAweDA2LCAgMHg2MSwgIDB4MDAsICAweEEyLCAgMHhBNCwgIDB4MDUsCisgIDB4MUQsICAweDAxLCAgMHgwNiwgIDB4RDYsICAweDAyLCAgMHgyMywgIDB4MDIsICAweDQxLCAgMHg4MiwgIDB4MDEsICAweDUwLCAgMHgwMCwgIDB4NjIsICAweDk3LCAgMHgwNCwgIDB4ODUsCisgIDB4MDQsICAweDIzLCAgMHgwMiwgIDB4NDEsICAweDgyLCAgMHgwMSwgIDB4MDQsICAweDg1LCAgMHgwOCwgIDB4QTAsICAweEJFLCAgMHgwNSwgIDB4RjQsICAweDg1LCAgMHgwMywgIDB4QTAsCisgIDB4QzQsICAweDA1LCAgMHhGNCwgIDB4ODUsICAweDAxLCAgMHhBMCwgIDB4Q0UsICAweDA1LCAgMHg4OCwgIDB4MDAsICAweDgwLCAgMHg2MywgIDB4Q0MsICAweDg2LCAgMHgwNywgIDB4QTAsCisgIDB4RUUsICAweDA1LCAgMHg1RiwgIDB4MDAsICAweDAwLCAgMHgyQiwgIDB4REYsICAweDA4LCAgMHgwMCwgIDB4QTIsICAweEU2LCAgMHgwNSwgIDB4ODAsICAweDY3LCAgMHg4MCwgIDB4NjMsCisgIDB4MDEsICAweEEyLCAgMHg3QSwgIDB4MDYsICAweDdDLCAgMHg4NSwgIDB4MDYsICAweDIzLCAgMHg2OCwgIDB4OTgsICAweDQ4LCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNywgIDB4MjMsCisgIDB4ODAsICAweDAwLCAgMHgwNiwgIDB4ODcsICAweDgwLCAgMHg2MywgIDB4N0MsICAweDg1LCAgMHgwMCwgIDB4MjMsICAweERGLCAgMHgwMCwgIDB4MDAsICAweDYzLCAgMHg0QSwgIDB4MDAsCisgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTIsICAweDM2LCAgMHgwNiwgIDB4MUQsICAweDAxLCAgMHgxNiwgIDB4RDQsICAweEMwLCAgMHgyMywgIDB4MDcsICAweDQxLCAgMHg4MywgIDB4MDMsCisgIDB4ODAsICAweDYzLCAgMHgwNiwgIDB4QTYsICAweDFDLCAgMHgwNiwgIDB4MDAsICAweDMzLCAgMHgzNywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MUQsICAweDAxLCAgMHgwMSwgIDB4RDYsCisgIDB4MjAsICAweDIzLCAgMHg2MywgIDB4NjAsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwMiwgIDB4MjMsICAweERGLCAgMHgwMCwgIDB4MDcsICAweEE2LCAgMHg3QywgIDB4MDUsCisgIDB4RUYsICAweDA0LCAgMHg2RiwgIDB4MDAsICAweDAwLCAgMHg2MywgIDB4NEIsICAweDAwLCAgMHgwNiwgIDB4NDEsICAweENCLCAgMHgwMCwgIDB4NTIsICAweDAwLCAgMHgwNiwgIDB4NjEsCisgIDB4MDAsICAweEEyLCAgMHg0RSwgIDB4MDYsICAweDFELCAgMHgwMSwgIDB4MDMsICAweENBLCAgMHhDMCwgIDB4MjMsICAweDA3LCAgMHg0MSwgIDB4MDAsICAweDYzLCAgMHgxRCwgIDB4MDEsCisgIDB4MDQsICAweENDLCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg4MywgIDB4QzAsICAweDIwLCAgMHg4MSwgIDB4NjIsICAweDgwLCAgMHgyMywgIDB4MDcsICAweDQxLCAgMHgwMCwgIDB4NjMsCisgIDB4ODAsICAweDY3LCAgMHgwOCwgIDB4MjMsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NjMsICAweDAxLCAgMHgyMywgIDB4REYsICAweDAwLCAgMHgwNiwgIDB4QTYsCisgIDB4ODQsICAweDA2LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4ODAsICAweDY3LCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHgzMywgIDB4MDAsICAweDQwLCAgMHhDMCwgIDB4MjAsCisgIDB4ODEsICAweDYyLCAgMHgwMCwgIDB4NjMsICAweDAwLCAgMHgwMCwgIDB4RkUsICAweDk1LCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4MDYsICAweEE2LCAgMHg5NCwgIDB4MDYsCisgIDB4MDcsICAweEE2LCAgMHg3QywgIDB4MDUsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweEEwLCAgMHgxNCwgIDB4MDcsICAweDAwLCAgMHgyQiwgIDB4NDAsICAweDBFLCAgMHg4MCwgIDB4NjMsCisgIDB4MDEsICAweDAwLCAgMHgwNiwgIDB4QTYsICAweEFBLCAgMHgwNiwgIDB4MDcsICAweEE2LCAgMHg3QywgIDB4MDUsICAweDQwLCAgMHgwRSwgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NDMsCisgIDB4MDAsICAweEEwLCAgMHhBMiwgIDB4MDYsICAweDA2LCAgMHhBNiwgIDB4QkMsICAweDA2LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4ODAsICAweDY3LCAgMHg0MCwgIDB4MEUsCisgIDB4ODAsICAweDYzLCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4MDAsICAweDIzLCAgMHhERiwgIDB4MDAsICAweDAwLCAgMHg2MywgIDB4MDcsICAweEE2LCAgMHhENiwgIDB4MDYsCisgIDB4MDAsICAweDMzLCAgMHgyQSwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDg5LCAgMHgwMCwgIDB4MEEsICAweDJCLCAgMHgwNywgIDB4QTYsCisgIDB4RTgsICAweDA2LCAgMHgwMCwgIDB4MzMsICAweDI5LCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwMCwgIDB4NDMsICAweDAwLCAgMHhBMiwgIDB4RjQsICAweDA2LCAgMHhDMCwgIDB4MEUsCisgIDB4ODAsICAweDYzLCAgMHhERSwgIDB4ODYsICAweEMwLCAgMHgwRSwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4ODAsICAweEMwLCAgMHgyMCwgIDB4ODEsICAweDYyLCAgMHgwNCwgIDB4MDEsCisgIDB4MDIsICAweERBLCAgMHg4MCwgIDB4NjMsICAweDdDLCAgMHg4NSwgIDB4ODAsICAweDdCLCAgMHg4MCwgIDB4NjMsICAweDA2LCAgMHhBNiwgIDB4OEMsICAweDA2LCAgMHgwMCwgIDB4MzMsCisgIDB4MkMsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDBDLCAgMHhBMiwgIDB4MkUsICAweDA3LCAgMHhGRSwgIDB4OTUsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwNiwgIDB4QTYsCisgIDB4MkMsICAweDA3LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4MDAsICAweDMzLCAgMHgzRCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDAsICAweDAwLCAgMHg4MCwgIDB4NjcsCisgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDBDLCAgMHhBMCwgIDB4NDQsICAweDA3LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4QkYsICAweDIzLCAgMHgwNCwgIDB4NjEsCisgIDB4ODQsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweDAwLCAgMHg2MywgIDB4RjAsICAweDA0LCAgMHgwMSwgIDB4MDEsICAweEYxLCAgMHgwMCwgIDB4MDAsICAweDAxLCAgMHhGMiwgIDB4MDAsCisgIDB4MDEsICAweDA1LCAgMHg4MCwgIDB4MDEsICAweDcyLCAgMHgwNCwgIDB4NzEsICAweDAwLCAgMHg4MSwgIDB4MDEsICAweDcwLCAgMHgwNCwgIDB4ODAsICAweDA1LCAgMHg4MSwgIDB4MDUsCisgIDB4MDAsICAweDYzLCAgMHhGMCwgIDB4MDQsICAweEYyLCAgMHgwMCwgIDB4NzIsICAweDA0LCAgMHgwMSwgIDB4MDEsICAweEYxLCAgMHgwMCwgIDB4NzAsICAweDAwLCAgMHg4MSwgIDB4MDEsCisgIDB4NzAsICAweDA0LCAgMHg3MSwgIDB4MDAsICAweDgxLCAgMHgwMSwgIDB4NzIsICAweDAwLCAgMHg4MCwgIDB4MDEsICAweDcxLCAgMHgwNCwgIDB4NzAsICAweDAwLCAgMHg4MCwgIDB4MDEsCisgIDB4NzAsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweEYwLCAgMHgwNCwgIDB4RjIsICAweDAwLCAgMHg3MiwgIDB4MDQsICAweDAwLCAgMHgwMSwgIDB4RjEsICAweDAwLCAgMHg3MCwgIDB4MDAsCisgIDB4ODAsICAweDAxLCAgMHg3MCwgIDB4MDQsICAweDcxLCAgMHgwMCwgIDB4ODAsICAweDAxLCAgMHg3MiwgIDB4MDAsICAweDgxLCAgMHgwMSwgIDB4NzEsICAweDA0LCAgMHg3MCwgIDB4MDAsCisgIDB4ODEsICAweDAxLCAgMHg3MCwgIDB4MDQsICAweDAwLCAgMHg2MywgIDB4MDAsICAweDIzLCAgMHhCMywgIDB4MDEsICAweDgzLCAgMHgwNSwgIDB4QTMsICAweDAxLCAgMHhBMiwgIDB4MDEsCisgIDB4QTEsICAweDAxLCAgMHgwMSwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4MDAsICAweDAxLCAgMHhDOCwgIDB4MDAsICAweDAzLCAgMHhBMSwgIDB4QzQsICAweDA3LCAgMHgwMCwgIDB4MzMsCisgIDB4MDcsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDgwLCAgMHgwNSwgIDB4ODEsICAweDA1LCAgMHgwNCwgIDB4MDEsICAweDExLCAgMHhDOCwgIDB4NDgsICAweDAwLCAgMHhCMCwgIDB4MDEsCisgIDB4QjEsICAweDAxLCAgMHgwOCwgIDB4MjMsICAweEIyLCAgMHgwMSwgIDB4MDUsICAweDAxLCAgMHg0OCwgIDB4MDQsICAweDAwLCAgMHg0MywgIDB4MDAsICAweEEyLCAgMHhFNCwgIDB4MDcsCisgIDB4MDAsICAweDA1LCAgMHhEQSwgIDB4ODcsICAweDAwLCAgMHgwMSwgIDB4QzgsICAweDAwLCAgMHhGRiwgIDB4MjMsICAweDgwLCAgMHgwMSwgIDB4MDUsICAweDA1LCAgMHgwMCwgIDB4NjMsCisgIDB4RjcsICAweDA0LCAgMHgxQSwgIDB4MDksICAweEY2LCAgMHgwOCwgIDB4NkUsICAweDA0LCAgMHgwMCwgIDB4MDIsICAweDgwLCAgMHg0MywgIDB4NzYsICAweDA4LCAgMHg4MCwgIDB4MDIsCisgIDB4NzcsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweEY3LCAgMHgwNCwgIDB4MUEsICAweDA5LCAgMHhGNiwgIDB4MDgsICAweDZFLCAgMHgwNCwgIDB4MDAsICAweDAyLCAgMHgwMCwgIDB4QTAsCisgIDB4MTQsICAweDA4LCAgMHgxNiwgIDB4ODgsICAweDAwLCAgMHg0MywgIDB4NzYsICAweDA4LCAgMHg4MCwgIDB4MDIsICAweDc3LCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHhGMywgIDB4MDQsCisgIDB4MDAsICAweDIzLCAgMHhGNCwgIDB4MDAsICAweDc0LCAgMHgwMCwgIDB4ODAsICAweDQzLCAgMHhGNCwgIDB4MDAsICAweENGLCAgMHg0MCwgIDB4MDAsICAweEEyLCAgMHg0NCwgIDB4MDgsCisgIDB4NzQsICAweDA0LCAgMHgwMiwgIDB4MDEsICAweEY3LCAgMHhDOSwgIDB4RjYsICAweEQ5LCAgMHgwMCwgIDB4MDEsICAweDAxLCAgMHhBMSwgIDB4MjQsICAweDA4LCAgMHgwNCwgIDB4OTgsCisgIDB4MjYsICAweDk1LCAgMHgyNCwgIDB4ODgsICAweDczLCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHhGMywgIDB4MDQsICAweDc1LCAgMHgwNCwgIDB4NUEsICAweDg4LCAgMHgwMiwgIDB4MDEsCisgIDB4MDQsICAweEQ4LCAgMHg0NiwgIDB4OTcsICAweDA0LCAgMHg5OCwgIDB4MjYsICAweDk1LCAgMHg0QSwgIDB4ODgsICAweDc1LCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHg2NCwgIDB4MDgsCisgIDB4MDAsICAweDA1LCAgMHg0RSwgIDB4ODgsICAweDczLCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHg4MCwgIDB4N0IsICAweDgwLCAgMHg2MywgIDB4MDYsICAweEE2LCAgMHg3NiwgIDB4MDgsCisgIDB4MDAsICAweDMzLCAgMHgzRSwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4ODAsICAweDY3LCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4MDAsICAweDYzLCAgMHgzOCwgIDB4MkIsCisgIDB4OUMsICAweDg4LCAgMHgzOCwgIDB4MkIsICAweDkyLCAgMHg4OCwgIDB4MzIsICAweDA5LCAgMHgzMSwgIDB4MDUsICAweDkyLCAgMHg5OCwgIDB4MDUsICAweDA1LCAgMHhCMiwgIDB4MDksCisgIDB4MDAsICAweDYzLCAgMHgwMCwgIDB4MzIsICAweDAwLCAgMHgzNiwgIDB4MDAsICAweDNBLCAgMHgwMCwgIDB4M0UsICAweDAwLCAgMHg2MywgIDB4ODAsICAweDMyLCAgMHg4MCwgIDB4MzYsCisgIDB4ODAsICAweDNBLCAgMHg4MCwgIDB4M0UsICAweEI0LCAgMHgzRCwgIDB4MDAsICAweDYzLCAgMHgzOCwgIDB4MkIsICAweDQwLCAgMHgzMiwgIDB4NDAsICAweDM2LCAgMHg0MCwgIDB4M0EsCisgIDB4NDAsICAweDNFLCAgMHgwMCwgIDB4NjMsICAweDVBLCAgMHgyMCwgIDB4QzksICAweDQwLCAgMHgwMCwgIDB4QTAsICAweEI0LCAgMHgwOCwgIDB4NUQsICAweDAwLCAgMHhGRSwgIDB4QzMsCisgIDB4MDAsICAweDYzLCAgMHg4MCwgIDB4NzMsICAweEU2LCAgMHgyMCwgIDB4MDIsICAweDIzLCAgMHhFOCwgIDB4MDAsICAweDgyLCAgMHg3MywgIDB4RkYsICAweEZELCAgMHg4MCwgIDB4NzMsCisgIDB4MTMsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDY2LCAgMHgyMCwgIDB4QzAsICAweDIwLCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4QTEsICAweDIzLCAgMHhBMSwgIDB4MDEsCisgIDB4ODEsICAweDYyLCAgMHhFMiwgIDB4ODgsICAweDgwLCAgMHg3MywgIDB4ODAsICAweDc3LCAgMHg2OCwgIDB4MDAsICAweDAwLCAgMHhBMiwgIDB4ODAsICAweDAwLCAgMHgwMywgIDB4QzIsCisgIDB4RjEsICAweEM3LCAgMHg0MSwgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MTEsICAweDIzLCAgMHhBMSwgIDB4MDEsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHhFNiwgIDB4ODQsCit9OworCitTVEFUSUMgdXNob3J0IF9hc2NfbWNvZGVfc2l6ZSA9IHNpemVvZihfYXNjX21jb2RlX2J1Zik7CitTVEFUSUMgQURWX0RDTlQgX2FzY19tY29kZV9jaGtzdW0gPSAweDAxMkM0NTNGVUw7CisKKyNkZWZpbmUgQVNDX1NZTl9PRkZTRVRfT05FX0RJU0FCTEVfTElTVCAgMTYKK1NUQVRJQyB1Y2hhciBfc3luX29mZnNldF9vbmVfZGlzYWJsZV9jbWRbQVNDX1NZTl9PRkZTRVRfT05FX0RJU0FCTEVfTElTVF0gPQoreworICAgIElOUVVJUlksCisgICAgUkVRVUVTVF9TRU5TRSwKKyAgICBSRUFEX0NBUEFDSVRZLAorICAgIFJFQURfVE9DLAorICAgIE1PREVfU0VMRUNULAorICAgIE1PREVfU0VOU0UsCisgICAgTU9ERV9TRUxFQ1RfMTAsCisgICAgTU9ERV9TRU5TRV8xMCwKKyAgICAweEZGLAorICAgIDB4RkYsCisgICAgMHhGRiwKKyAgICAweEZGLAorICAgIDB4RkYsCisgICAgMHhGRiwKKyAgICAweEZGLAorICAgIDB4RkYKK307CisKK1NUQVRJQyBpbnQKK0FzY0V4ZVNjc2lRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcQorKQoreworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdWxvbmcgICAgICAgICAgICAgICBsYXN0X2ludF9sZXZlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5fcV9yZXF1aXJlZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4OworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIGFkZHI7CisgICAgQVNDX0VYRV9DQUxMQkFDSyAgICBhc2NfZXhlX2NhbGxiYWNrOworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX2VudHJ5X2NudF9taW51c19vbmUgPSAwOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2l4OworICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9kYXRhOworICAgIHVjaGFyICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXM7CisgICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX2NtZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGRpc2FibGVfY21kOworICAgIEFTQ19TR19IRUFEICAgICAgICAgKnNnX2hlYWQ7CisgICAgQVNDX0RDTlQgICAgICAgICAgICBkYXRhX2NudDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgc2dfaGVhZCA9IHNjc2lxLT5zZ19oZWFkOworICAgIGFzY19leGVfY2FsbGJhY2sgPSBhc2NfZHZjLT5leGVfY2FsbGJhY2s7CisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisgICAgICAgIHJldHVybiAoRVJSKTsKKyAgICBpZiAoc2NzaXEgPT0gKEFTQ19TQ1NJX1EgKikgMEwpIHsKKyAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX1NDU0lRX05VTExfUFRSKTsKKyAgICAgICAgcmV0dXJuIChFUlIpOworICAgIH0KKyAgICBzY3NpcS0+cTEucV9ubyA9IDA7CisgICAgaWYgKChzY3NpcS0+cTIudGFnX2NvZGUgJiBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVMpID09IDApIHsKKyAgICAgICAgc2NzaXEtPnExLmV4dHJhX2J5dGVzID0gMDsKKyAgICB9CisgICAgc3RhID0gMDsKKyAgICB0YXJnZXRfaXggPSBzY3NpcS0+cTIudGFyZ2V0X2l4OworICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7CisgICAgbl9xX3JlcXVpcmVkID0gMTsKKyAgICBpZiAoc2NzaXEtPmNkYnB0clswXSA9PSBSRVFVRVNUX1NFTlNFKSB7CisgICAgICAgIGlmICgoYXNjX2R2Yy0+aW5pdF9zZHRyICYgc2NzaXEtPnExLnRhcmdldF9pZCkgIT0gMCkgeworICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH5zY3NpcS0+cTEudGFyZ2V0X2lkOworICAgICAgICAgICAgc2R0cl9kYXRhID0gQXNjR2V0TUNvZGVJbml0U0RUUkF0SUQoaW9wX2Jhc2UsIHRpZF9ubyk7CisgICAgICAgICAgICBBc2NNc2dPdXRTRFRSKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsoc2R0cl9kYXRhID4+IDQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggLSAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKHNkdHJfZGF0YSAmICh1Y2hhcikgQVNDX1NZTl9NQVhfT0ZGU0VUKSk7CisgICAgICAgICAgICBzY3NpcS0+cTEuY250bCB8PSAoUUNfTVNHX09VVCB8IFFDX1VSR0VOVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdF9pbnRfbGV2ZWwgPSBEdmNFbnRlckNyaXRpY2FsKCk7CisgICAgaWYgKGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCAhPSAwKSB7CisgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfQ1JJVElDQUxfUkVfRU5UUlkpOworICAgICAgICByZXR1cm4gKEVSUik7CisgICAgfQorICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCsrOworICAgIGlmICgoc2NzaXEtPnExLmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisgICAgICAgIGlmICgoc2dfZW50cnlfY250ID0gc2dfaGVhZC0+ZW50cnlfY250KSA9PSAwKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQtLTsKKyAgICAgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuIChFUlIpOworICAgICAgICB9CisjaWYgIUNDX1ZFUllfTE9OR19TR19MSVNUCisgICAgICAgIGlmIChzZ19lbnRyeV9jbnQgPiBBU0NfTUFYX1NHX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworICAgICAgICAgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisgICAgICAgICAgICByZXR1cm4oRVJSKTsKKyAgICAgICAgfQorI2VuZGlmIC8qICFDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworICAgICAgICBpZiAoc2dfZW50cnlfY250ID09IDEpIHsKKyAgICAgICAgICAgIHNjc2lxLT5xMS5kYXRhX2FkZHIgPSAoQURWX1BBRERSKSBzZ19oZWFkLT5zZ19saXN0WzBdLmFkZHI7CisgICAgICAgICAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSAoQURWX0RDTlQpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYnl0ZXM7CisgICAgICAgICAgICBzY3NpcS0+cTEuY250bCAmPSB+KFFDX1NHX0hFQUQgfCBRQ19TR19TV0FQX1FVRVVFKTsKKyAgICAgICAgfQorICAgICAgICBzZ19lbnRyeV9jbnRfbWludXNfb25lID0gc2dfZW50cnlfY250IC0gMTsKKyAgICB9CisgICAgc2NzaV9jbWQgPSBzY3NpcS0+Y2RicHRyWzBdOworICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0gRkFMU0U7CisgICAgaWYgKChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHNjc2lxLT5xMS50YXJnZXRfaWQpICYmCisgICAgICAgICEoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzICYgc2NzaXEtPnExLnRhcmdldF9pZCkpIHsKKyAgICAgICAgaWYgKHNjc2lxLT5xMS5jbnRsICYgUUNfU0dfSEVBRCkgeworICAgICAgICAgICAgZGF0YV9jbnQgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNnX2VudHJ5X2NudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGF0YV9jbnQgKz0gKEFEVl9EQ05UKSBsZTMyX3RvX2NwdShzZ19oZWFkLT5zZ19saXN0W2ldLmJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFfY250ID0gbGUzMl90b19jcHUoc2NzaXEtPnExLmRhdGFfY250KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YV9jbnQgIT0gMFVMKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9jbnQgPCA1MTJVTCkgeworICAgICAgICAgICAgICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0gVFJVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFTQ19TWU5fT0ZGU0VUX09ORV9ESVNBQkxFX0xJU1Q7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX2NtZCA9IF9zeW5fb2Zmc2V0X29uZV9kaXNhYmxlX2NtZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVfY21kID09IDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3NpX2NtZCA9PSBkaXNhYmxlX2NtZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9zeW5fb2Zmc2V0X29uZV9maXggPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4KSB7CisgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSAmPSB+TVNHX1NJTVBMRV9UQUc7CisgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSAoQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1RBR19GTEFHX0RJU0FCTEVfRElTQ09OTkVDVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2NzaXEtPnEyLnRhZ19jb2RlICY9IDB4Mjc7CisgICAgfQorICAgIGlmICgoc2NzaXEtPnExLmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisgICAgICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwpIHsKKyAgICAgICAgICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwgJiBBU0NfQlVHX0ZJWF9JRl9OT1RfRFdCKSB7CisgICAgICAgICAgICAgICAgaWYgKChzY3NpX2NtZCA9PSBSRUFEXzYpIHx8CisgICAgICAgICAgICAgICAgICAgIChzY3NpX2NtZCA9PSBSRUFEXzEwKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChBRFZfUEFERFIpIGxlMzJfdG9fY3B1KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnX2hlYWQtPnNnX2xpc3Rbc2dfZW50cnlfY250X21pbnVzX29uZV0uYWRkcikgKworICAgICAgICAgICAgICAgICAgICAgICAgKEFEVl9EQ05UKSBsZTMyX3RvX2NwdSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ19oZWFkLT5zZ19saXN0W3NnX2VudHJ5X2NudF9taW51c19vbmVdLmJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXMgPSAodWNoYXIpICgodXNob3J0KSBhZGRyICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChleHRyYV9ieXRlcyAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChzY3NpcS0+cTIudGFnX2NvZGUgJiBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVM7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+cTEuZXh0cmFfYnl0ZXMgPSBleHRyYV9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY250ID0gbGUzMl90b19jcHUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dfaGVhZC0+c2dfbGlzdFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS5ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NudCAtPSAoQVNDX0RDTlQpIGV4dHJhX2J5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgc2dfaGVhZC0+c2dfbGlzdFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS5ieXRlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoZGF0YV9jbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNnX2hlYWQtPmVudHJ5X3RvX2NvcHkgPSBzZ19oZWFkLT5lbnRyeV9jbnQ7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBzZ19lbnRyeV9jbnQgdG8gdGhlIG1heGltdW0gcG9zc2libGUuIFRoZSByZXN0IG9mCisgICAgICAgICAqIHRoZSBTRyBlbGVtZW50cyB3aWxsIGJlIGNvcGllZCB3aGVuIHRoZSBSSVNDIGNvbXBsZXRlcyB0aGUKKyAgICAgICAgICogU0cgZWxlbWVudHMgdGhhdCBmaXQgYW5kIGhhbHRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNnX2VudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkKKyAgICAgICAgeworICAgICAgICAgICAgIHNnX2VudHJ5X2NudCA9IEFTQ19NQVhfU0dfTElTVDsKKyAgICAgICAgfQorI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCisgICAgICAgIG5fcV9yZXF1aXJlZCA9IEFzY1NnTGlzdFRvUXVldWUoc2dfZW50cnlfY250KTsKKyAgICAgICAgaWYgKChBc2NHZXROdW1PZkZyZWVRdWV1ZShhc2NfZHZjLCB0YXJnZXRfaXgsIG5fcV9yZXF1aXJlZCkgPj0KKyAgICAgICAgICAgICh1aW50KSBuX3FfcmVxdWlyZWQpIHx8ICgoc2NzaXEtPnExLmNudGwgJiBRQ19VUkdFTlQpICE9IDApKSB7CisgICAgICAgICAgICBpZiAoKHN0YSA9IEFzY1NlbmRTY3NpUXVldWUoYXNjX2R2Yywgc2NzaXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9xX3JlcXVpcmVkKSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworICAgICAgICAgICAgICAgIGlmIChhc2NfZXhlX2NhbGxiYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKCphc2NfZXhlX2NhbGxiYWNrKSAoYXNjX2R2Yywgc2NzaXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsKSB7CisgICAgICAgICAgICBpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsICYgQVNDX0JVR19GSVhfSUZfTk9UX0RXQikgeworICAgICAgICAgICAgICAgIGlmICgoc2NzaV9jbWQgPT0gUkVBRF82KSB8fAorICAgICAgICAgICAgICAgICAgICAoc2NzaV9jbWQgPT0gUkVBRF8xMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2FkZHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2NudCk7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzID0gKHVjaGFyKSAoKHVzaG9ydCkgYWRkciAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZXh0cmFfYnl0ZXMgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc2NzaXEtPnEyLnRhZ19jb2RlICYgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jbnQgPSBsZTMyX3RvX2NwdShzY3NpcS0+cTEuZGF0YV9jbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgodXNob3J0KSBkYXRhX2NudCAmIDB4MDFGRikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jbnQgLT0gKEFTQ19EQ05UKSBleHRyYV9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihkYXRhX2NudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPnExLmV4dHJhX2J5dGVzID0gZXh0cmFfYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbl9xX3JlcXVpcmVkID0gMTsKKyAgICAgICAgaWYgKChBc2NHZXROdW1PZkZyZWVRdWV1ZShhc2NfZHZjLCB0YXJnZXRfaXgsIDEpID49IDEpIHx8CisgICAgICAgICAgICAoKHNjc2lxLT5xMS5jbnRsICYgUUNfVVJHRU5UKSAhPSAwKSkgeworICAgICAgICAgICAgaWYgKChzdGEgPSBBc2NTZW5kU2NzaVF1ZXVlKGFzY19kdmMsIHNjc2lxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcV9yZXF1aXJlZCkpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYXNjX2V4ZV9jYWxsYmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICgqYXNjX2V4ZV9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgIHJldHVybiAoc3RhKTsKK30KKworU1RBVElDIGludAorQXNjU2VuZFNjc2lRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKnNjc2lxLAorICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX3FfcmVxdWlyZWQKKykKK3sKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVjaGFyICAgICAgICAgICAgICAgZnJlZV9xX2hlYWQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBuZXh0X3FwOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2l4OworICAgIGludCAgICAgICAgICAgICAgICAgc3RhOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB0YXJnZXRfaXggPSBzY3NpcS0+cTIudGFyZ2V0X2l4OworICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7CisgICAgc3RhID0gMDsKKyAgICBmcmVlX3FfaGVhZCA9ICh1Y2hhcikgQXNjR2V0VmFyRnJlZVFIZWFkKGlvcF9iYXNlKTsKKyAgICBpZiAobl9xX3JlcXVpcmVkID4gMSkgeworICAgICAgICBpZiAoKG5leHRfcXAgPSBBc2NBbGxvY011bHRpcGxlRnJlZVF1ZXVlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9xX2hlYWQsICh1Y2hhcikgKG5fcV9yZXF1aXJlZCkpKQorICAgICAgICAgICAgIT0gKHVjaGFyKSBBU0NfUUxJTktfRU5EKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSAwOworICAgICAgICAgICAgc2NzaXEtPnNnX2hlYWQtPnF1ZXVlX2NudCA9IG5fcV9yZXF1aXJlZCAtIDE7CisgICAgICAgICAgICBzY3NpcS0+cTEucV9ubyA9IGZyZWVfcV9oZWFkOworICAgICAgICAgICAgaWYgKChzdGEgPSBBc2NQdXRSZWFkeVNnTGlzdFF1ZXVlKGFzY19kdmMsIHNjc2lxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcV9oZWFkKSkgPT0gMSkgeworICAgICAgICAgICAgICAgIEFzY1B1dFZhckZyZWVRSGVhZChpb3BfYmFzZSwgbmV4dF9xcCk7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyArPSAodWNoYXIpIChuX3FfcmVxdWlyZWQpOworICAgICAgICAgICAgICAgIGFzY19kdmMtPmN1cl9kdmNfcW5nW3RpZF9ub10rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoc3RhKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobl9xX3JlcXVpcmVkID09IDEpIHsKKyAgICAgICAgaWYgKChuZXh0X3FwID0gQXNjQWxsb2NGcmVlUXVldWUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcV9oZWFkKSkgIT0gQVNDX1FMSU5LX0VORCkgeworICAgICAgICAgICAgc2NzaXEtPnExLnFfbm8gPSBmcmVlX3FfaGVhZDsKKyAgICAgICAgICAgIGlmICgoc3RhID0gQXNjUHV0UmVhZHlRdWV1ZShhc2NfZHZjLCBzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3FfaGVhZCkpID09IDEpIHsKKyAgICAgICAgICAgICAgICBBc2NQdXRWYXJGcmVlUUhlYWQoaW9wX2Jhc2UsIG5leHRfcXApOworICAgICAgICAgICAgICAgIGFzY19kdmMtPmN1cl90b3RhbF9xbmcrKzsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50CitBc2NTZ0xpc3RUb1F1ZXVlKAorICAgICAgICAgICAgICAgICAgICBpbnQgc2dfbGlzdAorKQoreworICAgIGludCAgICAgICAgICAgICAgICAgbl9zZ19saXN0X3FzOworCisgICAgbl9zZ19saXN0X3FzID0gKChzZ19saXN0IC0gMSkgLyBBU0NfU0dfTElTVF9QRVJfUSk7CisgICAgaWYgKCgoc2dfbGlzdCAtIDEpICUgQVNDX1NHX0xJU1RfUEVSX1EpICE9IDApCisgICAgICAgIG5fc2dfbGlzdF9xcysrOworICAgIHJldHVybiAobl9zZ19saXN0X3FzICsgMSk7Cit9CisKKworU1RBVElDIHVpbnQKK0FzY0dldE51bU9mRnJlZVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciB0YXJnZXRfaXgsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX3FzCispCit7CisgICAgdWludCAgICAgICAgICAgICAgICBjdXJfdXNlZF9xczsKKyAgICB1aW50ICAgICAgICAgICAgICAgIGN1cl9mcmVlX3FzOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHRhcmdldF9pZDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHRpZF9ubzsKKworICAgIHRhcmdldF9pZCA9IEFTQ19USVhfVE9fVEFSR0VUX0lEKHRhcmdldF9peCk7CisgICAgdGlkX25vID0gQVNDX1RJWF9UT19USUQodGFyZ2V0X2l4KTsKKyAgICBpZiAoKGFzY19kdmMtPnVuaXRfbm90X3JlYWR5ICYgdGFyZ2V0X2lkKSB8fAorICAgICAgICAoYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICYgdGFyZ2V0X2lkKSkgeworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICBpZiAobl9xcyA9PSAxKSB7CisgICAgICAgIGN1cl91c2VkX3FzID0gKHVpbnQpIGFzY19kdmMtPmN1cl90b3RhbF9xbmcgKworICAgICAgICAgICh1aW50KSBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgKworICAgICAgICAgICh1aW50KSBBU0NfTUlOX0ZSRUVfUTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJfdXNlZF9xcyA9ICh1aW50KSBhc2NfZHZjLT5jdXJfdG90YWxfcW5nICsKKyAgICAgICAgICAodWludCkgQVNDX01JTl9GUkVFX1E7CisgICAgfQorICAgIGlmICgodWludCkgKGN1cl91c2VkX3FzICsgbl9xcykgPD0gKHVpbnQpIGFzY19kdmMtPm1heF90b3RhbF9xbmcpIHsKKyAgICAgICAgY3VyX2ZyZWVfcXMgPSAodWludCkgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyAtIGN1cl91c2VkX3FzOworICAgICAgICBpZiAoYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSA+PQorICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSkgeworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGN1cl9mcmVlX3FzKTsKKyAgICB9CisgICAgaWYgKG5fcXMgPiAxKSB7CisgICAgICAgIGlmICgobl9xcyA+IGFzY19kdmMtPmxhc3RfcV9zaG9ydGFnZSkgJiYgKG5fcXMgPD0gKGFzY19kdmMtPm1heF90b3RhbF9xbmcgLSBBU0NfTUlOX0ZSRUVfUSkpKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSBuX3FzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1B1dFJlYWR5UXVldWUoCisgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgcV9ubworKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9kYXRhOworICAgIHVjaGFyICAgICAgICAgICAgICAgc3luX3BlcmlvZF9peDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHN5bl9vZmZzZXQ7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgaWYgKCgoYXNjX2R2Yy0+aW5pdF9zZHRyICYgc2NzaXEtPnExLnRhcmdldF9pZCkgIT0gMCkgJiYKKyAgICAgICAgKChhc2NfZHZjLT5zZHRyX2RvbmUgJiBzY3NpcS0+cTEudGFyZ2V0X2lkKSA9PSAwKSkgeworICAgICAgICB0aWRfbm8gPSBBU0NfVElYX1RPX1RJRChzY3NpcS0+cTIudGFyZ2V0X2l4KTsKKyAgICAgICAgc2R0cl9kYXRhID0gQXNjR2V0TUNvZGVJbml0U0RUUkF0SUQoaW9wX2Jhc2UsIHRpZF9ubyk7CisgICAgICAgIHN5bl9wZXJpb2RfaXggPSAoc2R0cl9kYXRhID4+IDQpICYgKGFzY19kdmMtPm1heF9zZHRyX2luZGV4IC0gMSk7CisgICAgICAgIHN5bl9vZmZzZXQgPSBzZHRyX2RhdGEgJiBBU0NfU1lOX01BWF9PRkZTRVQ7CisgICAgICAgIEFzY01zZ091dFNEVFIoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90Ymxbc3luX3BlcmlvZF9peF0sCisgICAgICAgICAgICAgICAgICAgICAgc3luX29mZnNldCk7CisgICAgICAgIHNjc2lxLT5xMS5jbnRsIHw9IFFDX01TR19PVVQ7CisgICAgfQorICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIocV9ubyk7CisgICAgaWYgKChzY3NpcS0+cTEudGFyZ2V0X2lkICYgYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmcpID09IDApIHsKKyAgICAgICAgc2NzaXEtPnEyLnRhZ19jb2RlICY9IH5NU0dfU0lNUExFX1RBRyA7CisgICAgfQorICAgIHNjc2lxLT5xMS5zdGF0dXMgPSBRU19GUkVFOworICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TQ1NJUV9DREJfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSBzY3NpcS0+Y2RicHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi5jZGJfbGVuID4+IDEpOworCisgICAgRHZjUHV0U2NzaVEoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX0NQWV9CRUcsCisgICAgICAgICAgICAgICAgKHVjaGFyICopICZzY3NpcS0+cTEuY250bCwKKyAgICAgICAgICAgICAgICAoKHNpemVvZihBU0NfU0NTSVFfMSkgKyBzaXplb2YoQVNDX1NDU0lRXzIpKSAvIDIpIC0gMSk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpLAorICAgICAgICAgICAgICh1c2hvcnQpICgoKHVzaG9ydCkgc2NzaXEtPnExLnFfbm8gPDwgOCkgfCAodXNob3J0KSBRU19SRUFEWSkpOworICAgIHJldHVybiAoMSk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1B1dFJlYWR5U2dMaXN0UXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgcV9ubworKQoreworICAgIGludCAgICAgICAgICAgICAgICAgc3RhOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICBBU0NfU0dfSEVBRCAqc2dfaGVhZDsKKyAgICBBU0NfU0dfTElTVF9RICAgICAgIHNjc2lfc2dfcTsKKyAgICBBU0NfRENOVCAgICAgICAgICAgIHNhdmVkX2RhdGFfYWRkcjsKKyAgICBBU0NfRENOVCAgICAgICAgICAgIHNhdmVkX2RhdGFfY250OworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkczsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX2luZGV4OworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2dfZW50cnlfY250OworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgbmV4dF9xcDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgc2dfaGVhZCA9IHNjc2lxLT5zZ19oZWFkOworICAgIHNhdmVkX2RhdGFfYWRkciA9IHNjc2lxLT5xMS5kYXRhX2FkZHI7CisgICAgc2F2ZWRfZGF0YV9jbnQgPSBzY3NpcS0+cTEuZGF0YV9jbnQ7CisgICAgc2NzaXEtPnExLmRhdGFfYWRkciA9IChBU0NfUEFERFIpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYWRkcjsKKyAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSAoQVNDX0RDTlQpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYnl0ZXM7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICAvKgorICAgICAqIElmIHNnX2hlYWQtPmVudHJ5X2NudCBpcyBncmVhdGVyIHRoYW4gQVNDX01BWF9TR19MSVNUCisgICAgICogdGhlbiBub3QgYWxsIFNHIGVsZW1lbnRzIHdpbGwgZml0IGluIHRoZSBhbGxvY2F0ZWQgcXVldWVzLgorICAgICAqIFRoZSByZXN0IG9mIHRoZSBTRyBlbGVtZW50cyB3aWxsIGJlIGNvcGllZCB3aGVuIHRoZSBSSVNDCisgICAgICogY29tcGxldGVzIHRoZSBTRyBlbGVtZW50cyB0aGF0IGZpdCBhbmQgaGFsdHMuCisgICAgICovCisgICAgaWYgKHNnX2hlYWQtPmVudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkKKyAgICB7CisgICAgICAgICAvKgorICAgICAgICAgICogU2V0IHNnX2VudHJ5X2NudCB0byBiZSB0aGUgbnVtYmVyIG9mIFNHIGVsZW1lbnRzIHRoYXQKKyAgICAgICAgICAqIHdpbGwgZml0IGluIHRoZSBhbGxvY2F0ZWQgU0cgcXVldWVzLiBJdCBpcyBtaW51cyAxLCBiZWNhdXNlCisgICAgICAgICAgKiB0aGUgZmlyc3QgU0cgZWxlbWVudCBpcyBoYW5kbGVkIGFib3ZlLiBBU0NfTUFYX1NHX0xJU1QgaXMKKyAgICAgICAgICAqIGFscmVhZHkgaW5mbGF0ZWQgYnkgMSB0byBhY2NvdW50IGZvciB0aGlzLiBGb3IgZXhhbXBsZSBpdAorICAgICAgICAgICogbWF5IGJlIDUwIHdoaWNoIGlzIDEgKyA3IHF1ZXVlcyAqIDcgU0cgZWxlbWVudHMuCisgICAgICAgICAgKi8KKyAgICAgICAgIHNnX2VudHJ5X2NudCA9IEFTQ19NQVhfU0dfTElTVCAtIDE7CisKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHJlbWFpbmluZyBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdCB3aWxsCisgICAgICAgICAgKiBuZWVkIHRvIGJlIGhhbmRsZWQgZnJvbSBhX2lzci5jLgorICAgICAgICAgICovCisgICAgICAgICBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCAtIEFTQ19NQVhfU0dfTElTVDsKKyAgICB9IGVsc2UKKyAgICB7CisjZW5kaWYgLyogQ0NfVkVSWV9MT05HX1NHX0xJU1QgKi8KKyAgICAgICAgIC8qCisgICAgICAgICAgKiBTZXQgc2dfZW50cnlfY250IHRvIGJlIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdAorICAgICAgICAgICogd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIEl0IGlzIG1pbnVzIDEsIGJlY2F1c2UKKyAgICAgICAgICAqIHRoZSBmaXJzdCBTRyBlbGVtZW50IGlzIGhhbmRsZWQgYWJvdmUuCisgICAgICAgICAgKi8KKyAgICAgICAgIHNnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCAtIDE7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICB9CisjZW5kaWYgLyogQ0NfVkVSWV9MT05HX1NHX0xJU1QgKi8KKyAgICBpZiAoc2dfZW50cnlfY250ICE9IDApIHsKKyAgICAgICAgc2NzaXEtPnExLmNudGwgfD0gUUNfU0dfSEVBRDsKKyAgICAgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihxX25vKTsKKyAgICAgICAgc2dfaW5kZXggPSAxOworICAgICAgICBzY3NpcS0+cTEuc2dfcXVldWVfY250ID0gc2dfaGVhZC0+cXVldWVfY250OworICAgICAgICBzY3NpX3NnX3Euc2dfaGVhZF9xcCA9IHFfbm87CisgICAgICAgIHNjc2lfc2dfcS5jbnRsID0gUUNTR19TR19YRkVSX0xJU1Q7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZ19oZWFkLT5xdWV1ZV9jbnQ7IGkrKykgeworICAgICAgICAgICAgc2NzaV9zZ19xLnNlcV9ubyA9IGkgKyAxOworICAgICAgICAgICAgaWYgKHNnX2VudHJ5X2NudCA+IEFTQ19TR19MSVNUX1BFUl9RKSB7CisgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMgPSAodWNoYXIpIChBU0NfU0dfTElTVF9QRVJfUSAqIDIpOworICAgICAgICAgICAgICAgIHNnX2VudHJ5X2NudCAtPSBBU0NfU0dfTElTVF9QRVJfUTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9ROworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1E7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1EgLSAxOworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1EgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGxhc3QgU0cgcXVldWUgaW4gdGhlIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgKiBhbGxvY2F0ZWQgU0cgcXVldWVzLiBJZiB0aGVyZSBhcmUgbW9yZQorICAgICAgICAgICAgICAgICAqIFNHIGVsZW1lbnRzIHRoYW4gd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAqIHF1ZXVlcywgdGhlbiBzZXQgdGhlIFFDU0dfU0dfWEZFUl9NT1JFIGZsYWcuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNnX2hlYWQtPmVudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5jbnRsIHw9IFFDU0dfU0dfWEZFUl9NT1JFOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsKKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3EuY250bCB8PSBRQ1NHX1NHX1hGRVJfRU5EOworI2lmIENDX1ZFUllfTE9OR19TR19MSVNUCisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCisgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMgPSBzZ19lbnRyeV9jbnQgPDwgMTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IHNnX2VudHJ5X2NudDsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IHNnX2VudHJ5X2NudDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPSBzZ19lbnRyeV9jbnQgLSAxOworICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyBBU0NfU0NTSVFfQl9GV0QpKTsKKyAgICAgICAgICAgIHNjc2lfc2dfcS5xX25vID0gbmV4dF9xcDsKKyAgICAgICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIobmV4dF9xcCk7CisgICAgICAgICAgICBBc2NNZW1Xb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX1NHSERfQ1BZX0JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzY3NpX3NnX3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBU0NfU0dfTElTVF9RKSA+PiAxKTsKKyAgICAgICAgICAgIEFzY01lbURXb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NHUV9MSVNUX0JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzZ19oZWFkLT5zZ19saXN0W3NnX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMpOworICAgICAgICAgICAgc2dfaW5kZXggKz0gQVNDX1NHX0xJU1RfUEVSX1E7CisgICAgICAgICAgICBzY3NpcS0+bmV4dF9zZ19pbmRleCA9IHNnX2luZGV4OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2NzaXEtPnExLmNudGwgJj0gflFDX1NHX0hFQUQ7CisgICAgfQorICAgIHN0YSA9IEFzY1B1dFJlYWR5UXVldWUoYXNjX2R2Yywgc2NzaXEsIHFfbm8pOworICAgIHNjc2lxLT5xMS5kYXRhX2FkZHIgPSBzYXZlZF9kYXRhX2FkZHI7CisgICAgc2NzaXEtPnExLmRhdGFfY250ID0gc2F2ZWRfZGF0YV9jbnQ7CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50CitBc2NTZXRSdW5DaGlwU3luUmVnQXRJRCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgdGlkX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9kYXRhCispCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGEgPSBGQUxTRTsKKworICAgIGlmIChBc2NIb3N0UmVxUmlzY0hhbHQoaW9wX2Jhc2UpKSB7CisgICAgICAgIHN0YSA9IEFzY1NldENoaXBTeW5SZWdBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7CisgICAgICAgIEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSk7CisgICAgICAgIHJldHVybiAoc3RhKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50CitBc2NTZXRDaGlwU3luUmVnQXRJRCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX2RhdGEKKykKK3sKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBvcmdfaWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICAgICAgc3RhID0gVFJVRTsKKworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworICAgIG9yZ19pZCA9IEFzY1JlYWRDaGlwRHZjSUQoaW9wX2Jhc2UpOworICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworICAgICAgICBpZiAob3JnX2lkID09ICgweDAxIDw8IGkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG9yZ19pZCA9IChBU0NfU0NTSV9CSVRfSURfVFlQRSkgaTsKKyAgICBBc2NXcml0ZUNoaXBEdmNJRChpb3BfYmFzZSwgaWQpOworICAgIGlmIChBc2NSZWFkQ2hpcER2Y0lEKGlvcF9iYXNlKSA9PSAoMHgwMSA8PCBpZCkpIHsKKyAgICAgICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7CisgICAgICAgIEFzY1NldENoaXBTeW4oaW9wX2Jhc2UsIHNkdHJfZGF0YSk7CisgICAgICAgIGlmIChBc2NHZXRDaGlwU3luKGlvcF9iYXNlKSAhPSBzZHRyX2RhdGEpIHsKKyAgICAgICAgICAgIHN0YSA9IEZBTFNFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhID0gRkFMU0U7CisgICAgfQorICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworICAgIEFzY1dyaXRlQ2hpcER2Y0lEKGlvcF9iYXNlLCBvcmdfaWQpOworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworICAgIHJldHVybiAoc3RhKTsKK30KKworU1RBVElDIHVzaG9ydAorQXNjSW5pdExyYW0oCisgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNfYWRkcjsKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB3YXJuX2NvZGUgPSAwOworICAgIEFzY01lbVdvcmRTZXRMcmFtKGlvcF9iYXNlLCBBU0NfUUFEUl9CRUcsIDAsCisgICAgICAgICAgICAgICAodXNob3J0KSAoKChpbnQpIChhc2NfZHZjLT5tYXhfdG90YWxfcW5nICsgMiArIDEpICogNjQpID4+IDEpCispOworICAgIGkgPSBBU0NfTUlOX0FDVElWRV9RTk87CisgICAgc19hZGRyID0gQVNDX1FBRFJfQkVHICsgQVNDX1FCTEtfU0laRTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSAoc19hZGRyICsgQVNDX1NDU0lRX0JfRldEKSwKKyAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGkgKyAxKSk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0JXRCksCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChhc2NfZHZjLT5tYXhfdG90YWxfcW5nKSk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX1FOTyksCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIGkpOworICAgIGkrKzsKKyAgICBzX2FkZHIgKz0gQVNDX1FCTEtfU0laRTsKKyAgICBmb3IgKDsgaSA8IGFzY19kdmMtPm1heF90b3RhbF9xbmc7IGkrKywgc19hZGRyICs9IEFTQ19RQkxLX1NJWkUpIHsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaSArIDEpKTsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0JXRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaSAtIDEpKTsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX1FOTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSBpKTsKKyAgICB9CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIEFTQ19RTElOS19FTkQpOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9CV0QpLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyAtIDEpKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSAoc19hZGRyICsgQVNDX1NDU0lRX0JfUU5PKSwKKyAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisgICAgaSsrOworICAgIHNfYWRkciArPSBBU0NfUUJMS19TSVpFOworICAgIGZvciAoOyBpIDw9ICh1Y2hhcikgKGFzY19kdmMtPm1heF90b3RhbF9xbmcgKyAzKTsKKyAgICAgICAgIGkrKywgc19hZGRyICs9IEFTQ19RQkxLX1NJWkUpIHsKKyAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc19hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfRldEKSwgaSk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHNfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0JXRCksIGkpOworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChzX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9RTk8pLCBpKTsKKyAgICB9CisgICAgcmV0dXJuICh3YXJuX2NvZGUpOworfQorCitTVEFUSUMgdXNob3J0CitBc2NJbml0UUxpbmtWYXIoCisgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGxyYW1fYWRkcjsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgQXNjUHV0UmlzY1ZhckZyZWVRSGVhZChpb3BfYmFzZSwgMSk7CisgICAgQXNjUHV0UmlzY1ZhckRvbmVRVGFpbChpb3BfYmFzZSwgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisgICAgQXNjUHV0VmFyRnJlZVFIZWFkKGlvcF9iYXNlLCAxKTsKKyAgICBBc2NQdXRWYXJEb25lUVRhaWwoaW9wX2Jhc2UsIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfQlVTWV9RSEVBRF9CLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoKGludCkgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyArIDEpKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0RJU0MxX1FIRUFEX0IsCisgICAgICAgICAgICAgICAgICAgICAodWNoYXIpICgoaW50KSBhc2NfZHZjLT5tYXhfdG90YWxfcW5nICsgMikpOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfVE9UQUxfUkVBRFlfUV9CLAorICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9BU0NEVkNfRVJSX0NPREVfVywgMCk7CisgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLCAwKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NDU0lCVVNZX0IsIDApOworICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfV1RNX0ZMQUdfQiwgMCk7CisgICAgQXNjUHV0UURvbmVJblByb2dyZXNzKGlvcF9iYXNlLCAwKTsKKyAgICBscmFtX2FkZHIgPSBBU0NfUUFEUl9CRUc7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyssIGxyYW1fYWRkciArPSAyKSB7CisgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIGxyYW1fYWRkciwgMCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1NldExpYkVycm9yQ29kZSgKKyAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZXJyX2NvZGUKKykKK3sKKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgPT0gMCkgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSA9IGVycl9jb2RlOworICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX0FTQ0RWQ19FUlJfQ09ERV9XLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9jb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIChlcnJfY29kZSk7Cit9CisKKworU1RBVElDIHVjaGFyCitBc2NNc2dPdXRTRFRSKAorICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9wZXJpb2QsCisgICAgICAgICAgICAgICAgIHVjaGFyIHNkdHJfb2Zmc2V0CispCit7CisgICAgRVhUX01TRyAgICAgICAgICAgICBzZHRyX2J1ZjsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfcGVyaW9kX2luZGV4OworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHNkdHJfYnVmLm1zZ190eXBlID0gTVNfRVhURU5EOworICAgIHNkdHJfYnVmLm1zZ19sZW4gPSBNU19TRFRSX0xFTjsKKyAgICBzZHRyX2J1Zi5tc2dfcmVxID0gTVNfU0RUUl9DT0RFOworICAgIHNkdHJfYnVmLnhmZXJfcGVyaW9kID0gc2R0cl9wZXJpb2Q7CisgICAgc2R0cl9vZmZzZXQgJj0gQVNDX1NZTl9NQVhfT0ZGU0VUOworICAgIHNkdHJfYnVmLnJlcV9hY2tfb2Zmc2V0ID0gc2R0cl9vZmZzZXQ7CisgICAgaWYgKChzZHRyX3BlcmlvZF9pbmRleCA9CisgICAgICAgICBBc2NHZXRTeW5QZXJpb2RJbmRleChhc2NfZHZjLCBzZHRyX3BlcmlvZCkpIDw9CisgICAgICAgIGFzY19kdmMtPm1heF9zZHRyX2luZGV4KSB7CisgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NWX01TR09VVF9CRUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmc2R0cl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoRVhUX01TRykgPj4gMSk7CisgICAgICAgIHJldHVybiAoKHNkdHJfcGVyaW9kX2luZGV4IDw8IDQpIHwgc2R0cl9vZmZzZXQpOworICAgIH0gZWxzZSB7CisKKyAgICAgICAgc2R0cl9idWYucmVxX2Fja19vZmZzZXQgPSAwOworICAgICAgICBBc2NNZW1Xb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJnNkdHJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKEVYVF9NU0cpID4+IDEpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KK30KKworU1RBVElDIHVjaGFyCitBc2NDYWxTRFRSRGF0YSgKKyAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9wZXJpb2QsCisgICAgICAgICAgICAgICAgICB1Y2hhciBzeW5fb2Zmc2V0CispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICBieXRlOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9wZXJpb2RfaXg7CisKKyAgICBzZHRyX3BlcmlvZF9peCA9IEFzY0dldFN5blBlcmlvZEluZGV4KGFzY19kdmMsIHNkdHJfcGVyaW9kKTsKKyAgICBpZiAoCisgICAgICAgICAgIChzZHRyX3BlcmlvZF9peCA+IGFzY19kdmMtPm1heF9zZHRyX2luZGV4KQorKSB7CisgICAgICAgIHJldHVybiAoMHhGRik7CisgICAgfQorICAgIGJ5dGUgPSAoc2R0cl9wZXJpb2RfaXggPDwgNCkgfCAoc3luX29mZnNldCAmIEFTQ19TWU5fTUFYX09GRlNFVCk7CisgICAgcmV0dXJuIChieXRlKTsKK30KKworU1RBVElDIHZvaWQKK0FzY1NldENoaXBTRFRSKAorICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8KKykKK3sKKyAgICBBc2NTZXRDaGlwU3luUmVnQXRJRChpb3BfYmFzZSwgdGlkX25vLCBzZHRyX2RhdGEpOworICAgIEFzY1B1dE1Db2RlU0RUUkRvbmVBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7CisgICAgcmV0dXJuOworfQorCitTVEFUSUMgdWNoYXIKK0FzY0dldFN5blBlcmlvZEluZGV4KAorICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzeW5fdGltZQorKQoreworICAgIHVjaGFyICAgICAgICAgICAgICpwZXJpb2RfdGFibGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBtYXhfaW5kZXg7CisgICAgaW50ICAgICAgICAgICAgICAgICBtaW5faW5kZXg7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworCisgICAgcGVyaW9kX3RhYmxlID0gYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsOworICAgIG1heF9pbmRleCA9IChpbnQpIGFzY19kdmMtPm1heF9zZHRyX2luZGV4OworICAgIG1pbl9pbmRleCA9IChpbnQpYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXg7CisgICAgaWYgKChzeW5fdGltZSA8PSBwZXJpb2RfdGFibGVbbWF4X2luZGV4XSkpIHsKKyAgICAgICAgZm9yIChpID0gbWluX2luZGV4OyBpIDwgKG1heF9pbmRleCAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzeW5fdGltZSA8PSBwZXJpb2RfdGFibGVbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCh1Y2hhcikgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgodWNoYXIpIG1heF9pbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICgodWNoYXIpIChtYXhfaW5kZXggKyAxKSk7CisgICAgfQorfQorCitTVEFUSUMgdWNoYXIKK0FzY0FsbG9jRnJlZVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICB1Y2hhciBmcmVlX3FfaGVhZAorKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVjaGFyICAgICAgICAgICAgICAgbmV4dF9xcDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHFfc3RhdHVzOworCisgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihmcmVlX3FfaGVhZCk7CisgICAgcV9zdGF0dXMgPSAodWNoYXIpIEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKyAgICBuZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCkpOworICAgIGlmICgoKHFfc3RhdHVzICYgUVNfUkVBRFkpID09IDApICYmIChuZXh0X3FwICE9IEFTQ19RTElOS19FTkQpKSB7CisgICAgICAgIHJldHVybiAobmV4dF9xcCk7CisgICAgfQorICAgIHJldHVybiAoQVNDX1FMSU5LX0VORCk7Cit9CisKK1NUQVRJQyB1Y2hhcgorQXNjQWxsb2NNdWx0aXBsZUZyZWVRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIGZyZWVfcV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX2ZyZWVfcQorKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZyZWVfcTsgaSsrKSB7CisgICAgICAgIGlmICgoZnJlZV9xX2hlYWQgPSBBc2NBbGxvY0ZyZWVRdWV1ZShpb3BfYmFzZSwgZnJlZV9xX2hlYWQpKQorICAgICAgICAgICAgPT0gQVNDX1FMSU5LX0VORCkgeworICAgICAgICAgICAgcmV0dXJuIChBU0NfUUxJTktfRU5EKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGZyZWVfcV9oZWFkKTsKK30KKworU1RBVElDIGludAorQXNjSG9zdFJlcVJpc2NIYWx0KAorICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGEgPSAwOworICAgIHVjaGFyICAgICAgICAgICAgICAgc2F2ZWRfc3RvcF9jb2RlOworCisgICAgaWYgKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkpCisgICAgICAgIHJldHVybiAoMSk7CisgICAgc2F2ZWRfc3RvcF9jb2RlID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLAorICAgICAgICAgICAgICAgICAgICAgQVNDX1NUT1BfSE9TVF9SRVFfUklTQ19IQUxUIHwgQVNDX1NUT1BfUkVRX1JJU0NfU1RPUAorKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChBc2NJc0NoaXBIYWx0ZWQoaW9wX2Jhc2UpKSB7CisgICAgICAgICAgICBzdGEgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOworICAgIH0gd2hpbGUgKGNvdW50KysgPCAyMCk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TVE9QX0NPREVfQiwgc2F2ZWRfc3RvcF9jb2RlKTsKKyAgICByZXR1cm4gKHN0YSk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1N0b3BRdWV1ZUV4ZSgKKyAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQorKQoreworICAgIGludCAgICAgICAgICAgICAgICAgY291bnQgPSAwOworCisgICAgaWYgKEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TVE9QX0NPREVfQikgPT0gMCkgeworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19TVE9QX1JFUV9SSVNDX1NUT1ApOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKSAmCisgICAgICAgICAgICAgICAgICAgQVNDX1NUT1BfQUNLX1JJU0NfU1RPUCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7CisgICAgICAgIH0gd2hpbGUgKGNvdW50KysgPCAyMCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB2b2lkCitEdmNEZWxheU1pY3JvU2Vjb25kKEFEVl9EVkNfVkFSICphc2NfZHZjLCB1c2hvcnQgbWljcm9fc2VjKQoreworICAgIHVkZWxheShtaWNyb19zZWMpOworfQorCitTVEFUSUMgdm9pZAorRHZjRGVsYXlOYW5vU2Vjb25kKEFTQ19EVkNfVkFSICphc2NfZHZjLCBBU0NfRENOVCBuYW5vX3NlYykKK3sKKyAgICB1ZGVsYXkoKG5hbm9fc2VjICsgOTk5KS8xMDAwKTsKK30KKworI2lmZGVmIENPTkZJR19JU0EKK1NUQVRJQyBBU0NfRENOVCBfX2luaXQKK0FzY0dldEVpc2FQcm9kdWN0SUQoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIFBvcnRBZGRyICAgICAgICAgICAgZWlzYV9pb3A7CisgICAgdXNob3J0ICAgICAgICAgICAgICBwcm9kdWN0X2lkX2hpZ2gsIHByb2R1Y3RfaWRfbG93OworICAgIEFTQ19EQ05UICAgICAgICAgICAgcHJvZHVjdF9pZDsKKworICAgIGVpc2FfaW9wID0gQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwgQVNDX0VJU0FfUElEX0lPUF9NQVNLOworICAgIHByb2R1Y3RfaWRfbG93ID0gaW5wdyhlaXNhX2lvcCk7CisgICAgcHJvZHVjdF9pZF9oaWdoID0gaW5wdyhlaXNhX2lvcCArIDIpOworICAgIHByb2R1Y3RfaWQgPSAoKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2hpZ2ggPDwgMTYpIHwKKyAgICAgICAgKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2xvdzsKKyAgICByZXR1cm4gKHByb2R1Y3RfaWQpOworfQorCitTVEFUSUMgUG9ydEFkZHIgX19pbml0CitBc2NTZWFyY2hJT1BvcnRBZGRyRUlTQSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIEFTQ19EQ05UICAgICAgICAgICAgZWlzYV9wcm9kdWN0X2lkOworCisgICAgaWYgKGlvcF9iYXNlID09IDApIHsKKyAgICAgICAgaW9wX2Jhc2UgPSBBU0NfRUlTQV9NSU5fSU9QX0FERFI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlvcF9iYXNlID09IEFTQ19FSVNBX01BWF9JT1BfQUREUikKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIGlmICgoaW9wX2Jhc2UgJiAweDAwNTApID09IDB4MDA1MCkgeworICAgICAgICAgICAgaW9wX2Jhc2UgKz0gQVNDX0VJU0FfQklHX0lPUF9HQVA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpb3BfYmFzZSArPSBBU0NfRUlTQV9TTUFMTF9JT1BfR0FQOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlIChpb3BfYmFzZSA8PSBBU0NfRUlTQV9NQVhfSU9QX0FERFIpIHsKKyAgICAgICAgZWlzYV9wcm9kdWN0X2lkID0gQXNjR2V0RWlzYVByb2R1Y3RJRChpb3BfYmFzZSk7CisgICAgICAgIGlmICgoZWlzYV9wcm9kdWN0X2lkID09IEFTQ19FSVNBX0lEXzc0MCkgfHwKKyAgICAgICAgICAgIChlaXNhX3Byb2R1Y3RfaWQgPT0gQVNDX0VJU0FfSURfNzUwKSkgeworICAgICAgICAgICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7CisgICAgICAgICAgICAgICAgaW5wdyhpb3BfYmFzZSArIDQpOworICAgICAgICAgICAgICAgIHJldHVybiAoaW9wX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpb3BfYmFzZSA9PSBBU0NfRUlTQV9NQVhfSU9QX0FERFIpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBpZiAoKGlvcF9iYXNlICYgMHgwMDUwKSA9PSAweDAwNTApIHsKKyAgICAgICAgICAgIGlvcF9iYXNlICs9IEFTQ19FSVNBX0JJR19JT1BfR0FQOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW9wX2Jhc2UgKz0gQVNDX0VJU0FfU01BTExfSU9QX0dBUDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKDApOworfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKworU1RBVElDIGludAorQXNjU3RhcnRDaGlwKAorICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIDApOworICAgIGlmICgoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfSEFMVEVEKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIHJldHVybiAoMSk7Cit9CisKK1NUQVRJQyBpbnQKK0FzY1N0b3BDaGlwKAorICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKKykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGNjX3ZhbDsKKworICAgIGNjX3ZhbCA9IEFzY0dldENoaXBDb250cm9sKGlvcF9iYXNlKSAmICh+KENDX1NJTkdMRV9TVEVQIHwgQ0NfVEVTVCB8IENDX0RJQUcpKTsKKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgKHVjaGFyKSAoY2NfdmFsIHwgQ0NfSEFMVCkpOworICAgIEFzY1NldENoaXBJSChpb3BfYmFzZSwgSU5TX0hBTFQpOworICAgIEFzY1NldENoaXBJSChpb3BfYmFzZSwgSU5TX1JGTEFHX1dUTSk7CisgICAgaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpID09IDApIHsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworU1RBVElDIGludAorQXNjSXNDaGlwSGFsdGVkKAorICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpICE9IDApIHsKKyAgICAgICAgaWYgKChBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJiBDQ19IQUxUKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB2b2lkCitBc2NTZXRDaGlwSUgoCisgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgdXNob3J0IGluc19jb2RlCispCit7CisgICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMSk7CisgICAgQXNjV3JpdGVDaGlwSUgoaW9wX2Jhc2UsIGluc19jb2RlKTsKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAwKTsKKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyB2b2lkCitBc2NBY2tJbnRlcnJ1cHQoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKKykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAgIGhvc3RfZmxhZzsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHJpc2NfZmxhZzsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGxvb3A7CisKKyAgICBsb29wID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJpc2NfZmxhZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9SSVNDX0ZMQUdfQik7CisgICAgICAgIGlmIChsb29wKysgPiAweDdGRkYpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoKHJpc2NfZmxhZyAmIEFTQ19SSVNDX0ZMQUdfR0VOX0lOVCkgIT0gMCk7CisgICAgaG9zdF9mbGFnID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CKSAmICh+QVNDX0hPU1RfRkxBR19BQ0tfSU5UKTsKKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLAorICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoaG9zdF9mbGFnIHwgQVNDX0hPU1RfRkxBR19BQ0tfSU5UKSk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0lOVF9BQ0spOworICAgIGxvb3AgPSAwOworICAgIHdoaWxlIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19JTlRfUEVORElORykgeworICAgICAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfSU5UX0FDSyk7CisgICAgICAgIGlmIChsb29wKysgPiAzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLCBob3N0X2ZsYWcpOworICAgIHJldHVybjsKK30KKworU1RBVElDIHZvaWQKK0FzY0Rpc2FibGVJbnRlcnJ1cHQoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmc7CisKKyAgICBjZmcgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmcgJiAofkFTQ19DRkcwX0hPU1RfSU5UX09OKSk7CisgICAgcmV0dXJuOworfQorCitTVEFUSUMgdm9pZAorQXNjRW5hYmxlSW50ZXJydXB0KAorICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmc7CisKKyAgICBjZmcgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmcgfCBBU0NfQ0ZHMF9IT1NUX0lOVF9PTik7CisgICAgcmV0dXJuOworfQorCisKKworU1RBVElDIHZvaWQKK0FzY1NldEJhbmsoCisgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICB1Y2hhciBiYW5rCispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICB2YWw7CisKKyAgICB2YWwgPSBBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJgorICAgICAgKH4oQ0NfU0lOR0xFX1NURVAgfCBDQ19URVNUIHwgQ0NfRElBRyB8IENDX1NDU0lfUkVTRVQgfCBDQ19DSElQX1JFU0VUKSk7CisgICAgaWYgKGJhbmsgPT0gMSkgeworICAgICAgICB2YWwgfD0gQ0NfQkFOS19PTkU7CisgICAgfSBlbHNlIGlmIChiYW5rID09IDIpIHsKKyAgICAgICAgdmFsIHw9IENDX0RJQUcgfCBDQ19CQU5LX09ORTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgJj0gfkNDX0JBTktfT05FOworICAgIH0KKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgdmFsKTsKKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyBpbnQKK0FzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCispCit7CisgICAgUG9ydEFkZHIgICAgaW9wX2Jhc2U7CisgICAgaW50ICAgICAgICAgaSA9IDEwOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB3aGlsZSAoKEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpICYgQ1NXX1NDU0lfUkVTRVRfQUNUSVZFKSAmJiAoaS0tID4gMCkpCisgICAgeworICAgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKKyAgICB9CisgICAgQXNjU3RvcENoaXAoaW9wX2Jhc2UpOworICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19DSElQX1JFU0VUIHwgQ0NfU0NTSV9SRVNFVCB8IENDX0hBTFQpOworICAgIER2Y0RlbGF5TmFub1NlY29uZChhc2NfZHZjLCA2MDAwMCk7CisgICAgQXNjU2V0Q2hpcElIKGlvcF9iYXNlLCBJTlNfUkZMQUdfV1RNKTsKKyAgICBBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19IQUxUKTsKKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfQ0hJUF9SRVNFVCB8IENDX0hBTFQpOworICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19IQUxUKTsKKyAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDIwMCk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0NMUl9TQ1NJX1JFU0VUX0lOVCk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgcmV0dXJuIChBc2NJc0NoaXBIYWx0ZWQoaW9wX2Jhc2UpKTsKK30KKworU1RBVElDIEFTQ19EQ05UIF9faW5pdAorQXNjR2V0TWF4RG1hQ291bnQoCisgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCit7CisgICAgaWYgKGJ1c190eXBlICYgQVNDX0lTX0lTQSkKKyAgICAgICAgcmV0dXJuIChBU0NfTUFYX0lTQV9ETUFfQ09VTlQpOworICAgIGVsc2UgaWYgKGJ1c190eXBlICYgKEFTQ19JU19FSVNBIHwgQVNDX0lTX1ZMKSkKKyAgICAgICAgcmV0dXJuIChBU0NfTUFYX1ZMX0RNQV9DT1VOVCk7CisgICAgcmV0dXJuIChBU0NfTUFYX1BDSV9ETUFfQ09VTlQpOworfQorCisjaWZkZWYgQ09ORklHX0lTQQorU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY0dldElzYURtYUNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2hhbm5lbDsKKworICAgIGNoYW5uZWwgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4MDAwMzsKKyAgICBpZiAoY2hhbm5lbCA9PSAweDAzKQorICAgICAgICByZXR1cm4gKDApOworICAgIGVsc2UgaWYgKGNoYW5uZWwgPT0gMHgwMCkKKyAgICAgICAgcmV0dXJuICg3KTsKKyAgICByZXR1cm4gKGNoYW5uZWwgKyA0KTsKK30KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY1NldElzYURtYUNoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgZG1hX2NoYW5uZWwpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OworICAgIHVjaGFyICAgICAgICAgICAgICAgdmFsdWU7CisKKyAgICBpZiAoKGRtYV9jaGFubmVsID49IDUpICYmIChkbWFfY2hhbm5lbCA8PSA3KSkgeworICAgICAgICBpZiAoZG1hX2NoYW5uZWwgPT0gNykKKyAgICAgICAgICAgIHZhbHVlID0gMHgwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSBkbWFfY2hhbm5lbCAtIDQ7CisgICAgICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4RkZGQzsKKyAgICAgICAgY2ZnX2xzdyB8PSB2YWx1ZTsKKyAgICAgICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7CisgICAgICAgIHJldHVybiAoQXNjR2V0SXNhRG1hQ2hhbm5lbChpb3BfYmFzZSkpOworICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCitTVEFUSUMgdWNoYXIgX19pbml0CitBc2NTZXRJc2FEbWFTcGVlZCgKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdWNoYXIgc3BlZWRfdmFsdWUpCit7CisgICAgc3BlZWRfdmFsdWUgJj0gMHgwNzsKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKyAgICBBc2NXcml0ZUNoaXBEbWFTcGVlZChpb3BfYmFzZSwgc3BlZWRfdmFsdWUpOworICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworICAgIHJldHVybiAoQXNjR2V0SXNhRG1hU3BlZWQoaW9wX2Jhc2UpKTsKK30KKworU1RBVElDIHVjaGFyIF9faW5pdAorQXNjR2V0SXNhRG1hU3BlZWQoCisgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQorKQoreworICAgIHVjaGFyICAgICAgICAgICAgICAgc3BlZWRfdmFsdWU7CisKKyAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKyAgICBzcGVlZF92YWx1ZSA9IEFzY1JlYWRDaGlwRG1hU3BlZWQoaW9wX2Jhc2UpOworICAgIHNwZWVkX3ZhbHVlICY9IDB4MDc7CisgICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7CisgICAgcmV0dXJuIChzcGVlZF92YWx1ZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0lTQSAqLworCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjUmVhZFBDSUNvbmZpZ1dvcmQoCisgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgdXNob3J0IHBjaV9jb25maWdfb2Zmc2V0KQoreworICAgIHVjaGFyICAgICAgIGxzYiwgbXNiOworCisgICAgbHNiID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgcGNpX2NvbmZpZ19vZmZzZXQpOworICAgIG1zYiA9IER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsIHBjaV9jb25maWdfb2Zmc2V0ICsgMSk7CisgICAgcmV0dXJuICgodXNob3J0KSAoKG1zYiA8PCA4KSB8IGxzYikpOworfQorCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjSW5pdEdldENvbmZpZygKKyAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgUENJRGV2aWNlSUQ7CisgICAgdXNob3J0ICAgICAgICAgICAgICBQQ0lWZW5kb3JJRDsKKyAgICB1Y2hhciAgICAgICAgICAgICAgIFBDSVJldmlzaW9uSUQ7CisgICAgdWNoYXIgICAgICAgICAgICAgICBwcmV2Q21kUmVnQml0czsKKworICAgIHdhcm5fY29kZSA9IDA7CisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICBhc2NfZHZjLT5pbml0X3N0YXRlID0gQVNDX0lOSVRfU1RBVEVfQkVHX0dFVF9DRkc7CisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIChVV19FUlIpOworICAgIH0KKyAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgPT0gQVNDX0lTX1BDSSkgeworICAgICAgICBQQ0lWZW5kb3JJRCA9IEFzY1JlYWRQQ0lDb25maWdXb3JkKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdWZW5kb3JJRFJlZ2lzdGVyKTsKKworICAgICAgICBQQ0lEZXZpY2VJRCA9IEFzY1JlYWRQQ0lDb25maWdXb3JkKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdEZXZpY2VJRFJlZ2lzdGVyKTsKKworICAgICAgICBQQ0lSZXZpc2lvbklEID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ1JldmlzaW9uSURSZWdpc3Rlcik7CisKKyAgICAgICAgaWYgKFBDSVZlbmRvcklEICE9IEFTQ19QQ0lfVkVORE9SSUQpIHsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgfQorICAgICAgICBwcmV2Q21kUmVnQml0cyA9IER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpOworCisgICAgICAgIGlmICgocHJldkNtZFJlZ0JpdHMgJiBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSAhPQorICAgICAgICAgICAgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikgeworICAgICAgICAgICAgRHZjV3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2Q21kUmVnQml0cyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNtZFJlZ0JpdHNfSU9NZW1CdXNNYXN0ZXIpKTsKKworICAgICAgICAgICAgaWYgKChEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpCisgICAgICAgICAgICAgICAgICYgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikKKyAgICAgICAgICAgICAgICAhPSBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoUENJRGV2aWNlSUQgPT0gQVNDX1BDSV9ERVZJQ0VJRF8xMjAwQSkgfHwKKyAgICAgICAgICAgIChQQ0lEZXZpY2VJRCA9PSBBU0NfUENJX0RFVklDRUlEXzEyMDBCKSkgeworICAgICAgICAgICAgRHZjV3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyLCAweDAwKTsKKyAgICAgICAgICAgIGlmIChEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdMYXRlbmN5VGltZXIpCisgICAgICAgICAgICAgICAgIT0gMHgwMCkgeworICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChQQ0lEZXZpY2VJRCA9PSBBU0NfUENJX0RFVklDRUlEX1VMVFJBKSB7CisgICAgICAgICAgICBpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8IDB4MjApIHsKKyAgICAgICAgICAgICAgICBEdmNXcml0ZVBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgyMCk7CisKKyAgICAgICAgICAgICAgICBpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lcikgPCAweDIwKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQXNjRmluZFNpZ25hdHVyZShpb3BfYmFzZSkpIHsKKyAgICAgICAgd2Fybl9jb2RlIHw9IEFzY0luaXRBc2NEdmNWYXIoYXNjX2R2Yyk7CisgICAgICAgIHdhcm5fY29kZSB8PSBBc2NJbml0RnJvbUVFUChhc2NfZHZjKTsKKyAgICAgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9FTkRfR0VUX0NGRzsKKyAgICAgICAgaWYgKGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA+IEFTQ19NQVhfU0NTSV9SRVNFVF9XQUlUKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSBBU0NfTUFYX1NDU0lfUkVTRVRfV0FJVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKyAgICB9CisgICAgcmV0dXJuKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NJbml0U2V0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlID0gMDsKKworICAgIGFzY19kdmMtPmluaXRfc3RhdGUgfD0gQVNDX0lOSVRfU1RBVEVfQkVHX1NFVF9DRkc7CisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisgICAgICAgIHJldHVybiAoVVdfRVJSKTsKKyAgICBpZiAoQXNjRmluZFNpZ25hdHVyZShhc2NfZHZjLT5pb3BfYmFzZSkpIHsKKyAgICAgICAgd2Fybl9jb2RlIHw9IEFzY0luaXRGcm9tQXNjRHZjVmFyKGFzY19kdmMpOworICAgICAgICBhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0VORF9TRVRfQ0ZHOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKyAgICB9CisgICAgcmV0dXJuICh3YXJuX2NvZGUpOworfQorCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjSW5pdEZyb21Bc2NEdmNWYXIoCisgICAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YworKQoreworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbXN3OworICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcGNpX2RldmljZV9pZCA9IDA7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworI2lmZGVmIENPTkZJR19QQ0kKKyAgICBpZiAoYXNjX2R2Yy0+Y2ZnLT5kZXYpCisgICAgICAgIHBjaV9kZXZpY2VfaWQgPSB0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KS0+ZGV2aWNlOworI2VuZGlmCisgICAgd2Fybl9jb2RlID0gMDsKKyAgICBjZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7CisgICAgaWYgKChjZmdfbXN3ICYgQVNDX0NGR19NU1dfQ0xSX01BU0spICE9IDApIHsKKyAgICAgICAgY2ZnX21zdyAmPSAofihBU0NfQ0ZHX01TV19DTFJfTUFTSykpOworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQ0ZHX01TV19SRUNPVkVSOworICAgICAgICBBc2NTZXRDaGlwQ2ZnTXN3KGlvcF9iYXNlLCBjZmdfbXN3KTsKKyAgICB9CisgICAgaWYgKChhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCAmIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUpICE9CisgICAgICAgIGFzY19kdmMtPmNmZy0+Y21kX3FuZ19lbmFibGVkKSB7CisgICAgICAgIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZDsKKyAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q7CisgICAgfQorICAgIGlmIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19BVVRPX0NPTkZJRykgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQVVUT19DT05GSUc7CisgICAgfQorICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX0lTQSB8IEFTQ19JU19WTCkpICE9IDApIHsKKyAgICAgICAgaWYgKEFzY1NldENoaXBJUlEoaW9wX2Jhc2UsIGFzY19kdmMtPmlycV9ubywgYXNjX2R2Yy0+YnVzX3R5cGUpCisgICAgICAgICAgICAhPSBhc2NfZHZjLT5pcnFfbm8pIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9JUlFfTk87CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgeworICAgICAgICBjZmdfbXN3ICY9IDB4RkZDMDsKKyAgICAgICAgQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7CisgICAgICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfUENJX1VMVFJBKSA9PSBBU0NfSVNfUENJX1VMVFJBKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBjaV9kZXZpY2VfaWQgPT0gQVNDX1BDSV9ERVZJQ0VfSURfUkVWX0EpIHx8CisgICAgICAgICAgICAgICAgKHBjaV9kZXZpY2VfaWQgPT0gQVNDX1BDSV9ERVZJQ0VfSURfUkVWX0IpKSB7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsIHw9IEFTQ19CVUdfRklYX0lGX05PVF9EV0I7CisgICAgICAgICAgICAgICAgYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsIHw9IEFTQ19CVUdfRklYX0FTWU5fVVNFX1NZTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgPT0gQVNDX0lTX0lTQVBOUCkgeworICAgICAgICBpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKQorICAgICAgICAgICAgPT0gQVNDX0NISVBfVkVSX0FTWU5fQlVHKSB7CisgICAgICAgICAgICBhc2NfZHZjLT5idWdfZml4X2NudGwgfD0gQVNDX0JVR19GSVhfQVNZTl9VU0VfU1lOOworICAgICAgICB9CisgICAgfQorICAgIGlmIChBc2NTZXRDaGlwU2NzaUlEKGlvcF9iYXNlLCBhc2NfZHZjLT5jZmctPmNoaXBfc2NzaV9pZCkgIT0KKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1NDU0lfSUQ7CisgICAgfQorI2lmZGVmIENPTkZJR19JU0EKKyAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSB7CisgICAgICAgIEFzY1NldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9jaGFubmVsKTsKKyAgICAgICAgQXNjU2V0SXNhRG1hU3BlZWQoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9zcGVlZCk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKyAgICByZXR1cm4gKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyB1c2hvcnQKK0FzY0luaXRBc2MxMDAwRHJpdmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworCisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKyAgICB3YXJuX2NvZGUgPSAwOworICAgIGlmICgoYXNjX2R2Yy0+ZHZjX2NudGwgJiBBU0NfQ05UTF9SRVNFVF9TQ1NJKSAmJgorICAgICAgICAhKGFzY19kdmMtPmluaXRfc3RhdGUgJiBBU0NfSU5JVF9SRVNFVF9TQ1NJX0RPTkUpKSB7CisgICAgICAgIEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoYXNjX2R2Yyk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoKEFTQ19EQ05UKQorICAgICAgICAgICAgKCh1c2hvcnQpIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCAqIDEwMDApKTsKKyAgICB9CisgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9CRUdfTE9BRF9NQzsKKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICAgICAgcmV0dXJuIChVV19FUlIpOworICAgIGlmICghQXNjRmluZFNpZ25hdHVyZShhc2NfZHZjLT5pb3BfYmFzZSkpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFOworICAgICAgICByZXR1cm4gKHdhcm5fY29kZSk7CisgICAgfQorICAgIEFzY0Rpc2FibGVJbnRlcnJ1cHQoaW9wX2Jhc2UpOworICAgIHdhcm5fY29kZSB8PSBBc2NJbml0THJhbShhc2NfZHZjKTsKKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICAgICAgcmV0dXJuIChVV19FUlIpOworICAgIEFTQ19EQkcxKDEsICJBc2NJbml0QXNjMTAwMERyaXZlcjogX2FzY19tY29kZV9jaGtzdW0gMHglbHhcbiIsCisgICAgICAgICh1bG9uZykgX2FzY19tY29kZV9jaGtzdW0pOworICAgIGlmIChBc2NMb2FkTWljcm9Db2RlKGlvcF9iYXNlLCAwLCBfYXNjX21jb2RlX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfYXNjX21jb2RlX3NpemUpICE9IF9hc2NfbWNvZGVfY2hrc3VtKSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX01DT0RFX0NIS1NVTTsKKyAgICAgICAgcmV0dXJuICh3YXJuX2NvZGUpOworICAgIH0KKyAgICB3YXJuX2NvZGUgfD0gQXNjSW5pdE1pY3JvQ29kZVZhcihhc2NfZHZjKTsKKyAgICBhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0VORF9MT0FEX01DOworICAgIEFzY0VuYWJsZUludGVycnVwdChpb3BfYmFzZSk7CisgICAgcmV0dXJuICh3YXJuX2NvZGUpOworfQorCitTVEFUSUMgdXNob3J0IF9faW5pdAorQXNjSW5pdEFzY0R2Y1ZhcigKKyAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7CisgICAgdWNoYXIgICAgICAgICAgICAgICBjaGlwX3ZlcnNpb247CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHdhcm5fY29kZSA9IDA7CisgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSAwOworICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJgorICAgICAgICAgKEFTQ19JU19JU0EgfCBBU0NfSVNfUENJIHwgQVNDX0lTX0VJU0EgfCBBU0NfSVNfVkwpKSA9PSAwKSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0JVU19UWVBFOworICAgIH0KKyAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfSEFMVCk7CisgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisgICAgYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsID0gMDsKKyAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciA9IDA7CisgICAgYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzID0gMDsKKyAgICAvKiBhc2NfZHZjLT5pbml0X3N0YXRlIGluaXRhbGl6ZWQgaW4gQXNjSW5pdEdldENvbmZpZygpLiAqLworICAgIGFzY19kdmMtPnNkdHJfZG9uZSA9IDA7CisgICAgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyA9IDA7CisgICAgYXNjX2R2Yy0+aXNfaW5faW50ID0gMDsKKyAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQgPSAwOworICAgIGFzY19kdmMtPmxhc3RfcV9zaG9ydGFnZSA9IDA7CisgICAgYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmcgPSAwOworICAgIGFzY19kdmMtPm5vX3NjYW0gPSAwOworICAgIGFzY19kdmMtPnVuaXRfbm90X3JlYWR5ID0gMDsKKyAgICBhc2NfZHZjLT5xdWV1ZV9mdWxsX29yX2J1c3kgPSAwOworICAgIGFzY19kdmMtPnJlZG9fc2NhbSA9IDA7CisgICAgYXNjX2R2Yy0+cmVzMiA9IDA7CisgICAgYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXggPSAwOworICAgIGFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgPSAwOworICAgIGFzY19kdmMtPmNmZy0+Y21kX3FuZ19lbmFibGVkID0gMDsKKyAgICBhc2NfZHZjLT5kdmNfY250bCA9IEFTQ19ERUZfRFZDX0NOVEw7CisgICAgYXNjX2R2Yy0+aW5pdF9zZHRyID0gMDsKKyAgICBhc2NfZHZjLT5tYXhfdG90YWxfcW5nID0gQVNDX0RFRl9NQVhfVE9UQUxfUU5HOworICAgIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IDM7CisgICAgYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBBU0NfU0NTSV9XSURUSF9CSVRfU0VUOworICAgIGFzY19kdmMtPm1heF9kbWFfY291bnQgPSBBc2NHZXRNYXhEbWFDb3VudChhc2NfZHZjLT5idXNfdHlwZSk7CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZHRyX2VuYWJsZSA9IEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQ7CisgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSA9IEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQ7CisgICAgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQgPSBBU0NfREVGX0NISVBfU0NTSV9JRDsKKyAgICBhc2NfZHZjLT5jZmctPmxpYl9zZXJpYWxfbm8gPSBBU0NfTElCX1NFUklBTF9OVU1CRVI7CisgICAgYXNjX2R2Yy0+Y2ZnLT5saWJfdmVyc2lvbiA9IChBU0NfTElCX1ZFUlNJT05fTUFKT1IgPDwgOCkgfAorICAgICAgQVNDX0xJQl9WRVJTSU9OX01JTk9SOworICAgIGNoaXBfdmVyc2lvbiA9IEFzY0dldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSk7CisgICAgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3ZlcnNpb24gPSBjaGlwX3ZlcnNpb247CisgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzBdID0gU1lOX1hGRVJfTlNfMDsKKyAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMV0gPSBTWU5fWEZFUl9OU18xOworICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsyXSA9IFNZTl9YRkVSX05TXzI7CisgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzNdID0gU1lOX1hGRVJfTlNfMzsKKyAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNF0gPSBTWU5fWEZFUl9OU180OworICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFs1XSA9IFNZTl9YRkVSX05TXzU7CisgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzZdID0gU1lOX1hGRVJfTlNfNjsKKyAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbN10gPSBTWU5fWEZFUl9OU183OworICAgIGFzY19kdmMtPm1heF9zZHRyX2luZGV4ID0gNzsKKyAgICBpZiAoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgJiYKKyAgICAgICAgKGNoaXBfdmVyc2lvbiA+PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMxNTApKSB7CisgICAgICAgIGFzY19kdmMtPmJ1c190eXBlID0gQVNDX0lTX1BDSV9VTFRSQTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzBdID0gU1lOX1VMVFJBX1hGRVJfTlNfMDsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzFdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzJdID0gU1lOX1VMVFJBX1hGRVJfTlNfMjsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzNdID0gU1lOX1VMVFJBX1hGRVJfTlNfMzsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzRdID0gU1lOX1VMVFJBX1hGRVJfTlNfNDsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzVdID0gU1lOX1VMVFJBX1hGRVJfTlNfNTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzZdID0gU1lOX1VMVFJBX1hGRVJfTlNfNjsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzddID0gU1lOX1VMVFJBX1hGRVJfTlNfNzsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzhdID0gU1lOX1VMVFJBX1hGRVJfTlNfODsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzldID0gU1lOX1VMVFJBX1hGRVJfTlNfOTsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEwXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEwOworICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTFdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTE7CisgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxMl0gPSBTWU5fVUxUUkFfWEZFUl9OU18xMjsKKyAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEzXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEzOworICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTRdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTQ7CisgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxNV0gPSBTWU5fVUxUUkFfWEZFUl9OU18xNTsKKyAgICAgICAgYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggPSAxNTsKKyAgICAgICAgaWYgKGNoaXBfdmVyc2lvbiA9PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMxNTApCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzY1NldEV4dHJhQ29udHJvbChpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAoU0VDX0FDVElWRV9ORUdBVEUgfCBTRUNfU0xFV19SQVRFKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2hpcF92ZXJzaW9uID49IEFTQ19DSElQX1ZFUl9QQ0lfVUxUUkFfMzA1MCkgeworICAgICAgICAgICAgQXNjU2V0RXh0cmFDb250cm9sKGlvcF9iYXNlLAorICAgICAgICAgICAgICAgIChTRUNfQUNUSVZFX05FR0FURSB8IFNFQ19FTkFCTEVfRklMVEVSKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFzY19kdmMtPmJ1c190eXBlID09IEFTQ19JU19QQ0kpIHsKKyAgICAgICAgICAgQXNjU2V0RXh0cmFDb250cm9sKGlvcF9iYXNlLCAoU0VDX0FDVElWRV9ORUdBVEUgfCBTRUNfU0xFV19SQVRFKSk7CisgICAgfQorCisgICAgYXNjX2R2Yy0+Y2ZnLT5pc2FfZG1hX3NwZWVkID0gQVNDX0RFRl9JU0FfRE1BX1NQRUVEOworICAgIGlmIChBc2NHZXRDaGlwQnVzVHlwZShpb3BfYmFzZSkgPT0gQVNDX0lTX0lTQVBOUCkgeworICAgICAgICBBc2NTZXRDaGlwSUZDKGlvcF9iYXNlLCBJRkNfSU5JVF9ERUZBVUxUKTsKKyAgICAgICAgYXNjX2R2Yy0+YnVzX3R5cGUgPSBBU0NfSVNfSVNBUE5QOworICAgIH0KKyNpZmRlZiBDT05GSUdfSVNBCisgICAgaWYgKChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpICE9IDApIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5pc2FfZG1hX2NoYW5uZWwgPSAodWNoYXIpIEFzY0dldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UpOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGFzY19kdmMtPmN1cl9kdmNfcW5nW2ldID0gMDsKKyAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbaV0gPSBBU0NfTUFYX1NDU0kxX1FORzsKKyAgICAgICAgYXNjX2R2Yy0+c2NzaXFfYnVzeV9oZWFkW2ldID0gKEFTQ19TQ1NJX1EgKikgMEw7CisgICAgICAgIGFzY19kdmMtPnNjc2lxX2J1c3lfdGFpbFtpXSA9IChBU0NfU0NTSV9RICopIDBMOworICAgICAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW2ldID0gQVNDX01BWF9JTlJBTV9UQUdfUU5HOworICAgIH0KKyAgICByZXR1cm4gKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NJbml0RnJvbUVFUChBU0NfRFZDX1ZBUiAqYXNjX2R2YykKK3sKKyAgICBBU0NFRVBfQ09ORklHICAgICAgIGVlcF9jb25maWdfYnVmOworICAgIEFTQ0VFUF9DT05GSUcgICAgICAgKmVlcF9jb25maWc7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNoa3N1bTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19tc3csIGNmZ19sc3c7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVfZWVwID0gMDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgd2Fybl9jb2RlID0gMDsKKyAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDB4MDBGRSk7CisgICAgQXNjU3RvcFF1ZXVlRXhlKGlvcF9iYXNlKTsKKyAgICBpZiAoKEFzY1N0b3BDaGlwKGlvcF9iYXNlKSA9PSBGQUxTRSkgfHwKKyAgICAgICAgKEFzY0dldENoaXBTY3NpQ3RybChpb3BfYmFzZSkgIT0gMCkpIHsKKyAgICAgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9SRVNFVF9TQ1NJX0RPTkU7CisgICAgICAgIEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoYXNjX2R2Yyk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoKEFTQ19EQ05UKQorICAgICAgICAgICAgKCh1c2hvcnQpIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCAqIDEwMDApKTsKKyAgICB9CisgICAgaWYgKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkgPT0gRkFMU0UpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU1RBUlRfU1RPUF9DSElQOworICAgICAgICByZXR1cm4gKHdhcm5fY29kZSk7CisgICAgfQorICAgIEFzY1NldFBDQWRkcihpb3BfYmFzZSwgQVNDX01DT0RFX1NUQVJUX0FERFIpOworICAgIGlmIChBc2NHZXRQQ0FkZHIoaW9wX2Jhc2UpICE9IEFTQ19NQ09ERV9TVEFSVF9BRERSKSB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9QQ19BRERSOworICAgICAgICByZXR1cm4gKHdhcm5fY29kZSk7CisgICAgfQorICAgIGVlcF9jb25maWcgPSAoQVNDRUVQX0NPTkZJRyAqKSAmZWVwX2NvbmZpZ19idWY7CisgICAgY2ZnX21zdyA9IEFzY0dldENoaXBDZmdNc3coaW9wX2Jhc2UpOworICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICBpZiAoKGNmZ19tc3cgJiBBU0NfQ0ZHX01TV19DTFJfTUFTSykgIT0gMCkgeworICAgICAgICBjZmdfbXN3ICY9ICh+KEFTQ19DRkdfTVNXX0NMUl9NQVNLKSk7CisgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9DRkdfTVNXX1JFQ09WRVI7CisgICAgICAgIEFzY1NldENoaXBDZmdNc3coaW9wX2Jhc2UsIGNmZ19tc3cpOworICAgIH0KKyAgICBjaGtzdW0gPSBBc2NHZXRFRVBDb25maWcoaW9wX2Jhc2UsIGVlcF9jb25maWcsIGFzY19kdmMtPmJ1c190eXBlKTsKKyAgICBBU0NfREJHMSgxLCAiQXNjSW5pdEZyb21FRVA6IGNoa3N1bSAweCV4XG4iLCBjaGtzdW0pOworICAgIGlmIChjaGtzdW0gPT0gMCkgeworICAgICAgICBjaGtzdW0gPSAweGFhNTU7CisgICAgfQorICAgIGlmIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19BVVRPX0NPTkZJRykgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQVVUT19DT05GSUc7CisgICAgICAgIGlmIChhc2NfZHZjLT5jZmctPmNoaXBfdmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgICBpZiAoZWVwX2NvbmZpZy0+Y2ZnX2xzdyAhPSBjZmdfbHN3KSB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9SRUNPVkVSOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlZXBfY29uZmlnLT5jZmdfbXN3ICE9IGNmZ19tc3cpIHsKKyAgICAgICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1JFQ09WRVI7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y2ZnX21zdyA9IEFzY0dldENoaXBDZmdNc3coaW9wX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVlcF9jb25maWctPmNmZ19tc3cgJj0gfkFTQ19DRkdfTVNXX0NMUl9NQVNLOworICAgIGVlcF9jb25maWctPmNmZ19sc3cgfD0gQVNDX0NGRzBfSE9TVF9JTlRfT047CisgICAgQVNDX0RCRzEoMSwgIkFzY0luaXRGcm9tRUVQOiBlZXBfY29uZmlnLT5jaGtzdW0gMHgleFxuIiwKKyAgICAgICAgZWVwX2NvbmZpZy0+Y2hrc3VtKTsKKyAgICBpZiAoY2hrc3VtICE9IGVlcF9jb25maWctPmNoa3N1bSkgeworICAgICAgICAgICAgaWYgKEFzY0dldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgQVNDX0NISVBfVkVSX1BDSV9VTFRSQV8zMDUwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBU0NfREJHKDEsCisiQXNjSW5pdEZyb21FRVA6IGNoa3N1bSBlcnJvciBpZ25vcmVkOyBFRVBST00tbGVzcyBib2FyZFxuIik7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+aW5pdF9zZHRyID0gMHhGRjsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5kaXNjX2VuYWJsZSA9IDB4RkY7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+c3RhcnRfbW90b3IgPSAweEZGOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPnVzZV9jbWRfcW5nID0gMDsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gMHhGMDsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdGFnX3FuZyA9IDB4MjA7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y250bCA9IDB4QkZGRjsKKyAgICAgICAgICAgICAgICBBU0NfRUVQX1NFVF9DSElQX0lEKGVlcF9jb25maWcsIDcpOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPm5vX3NjYW0gPSAwOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1swXSA9IDA7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzFdID0gMDsKKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMl0gPSAwOworICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1szXSA9IDA7CisgICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzRdID0gMDsKKyAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSBFRVBST00tbGVzcyBib2FyZC4gKi8KKyAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNV0gPSAweEJCOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQoCisiQXNjSW5pdEZyb21FRVA6IEVFUFJPTSBjaGVja3N1bSBlcnJvcjsgV2lsbCB0cnkgdG8gcmUtd3JpdGUgRUVQUk9NLlxuIik7CisgICAgICAgICAgICAgICAgd3JpdGVfZWVwID0gMTsKKyAgICAgICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZHRyX2VuYWJsZSA9IGVlcF9jb25maWctPmluaXRfc2R0cjsKKyAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy0+ZGlzY19lbmFibGU7CisgICAgYXNjX2R2Yy0+Y2ZnLT5jbWRfcW5nX2VuYWJsZWQgPSBlZXBfY29uZmlnLT51c2VfY21kX3FuZzsKKyAgICBhc2NfZHZjLT5jZmctPmlzYV9kbWFfc3BlZWQgPSBBU0NfRUVQX0dFVF9ETUFfU1BEKGVlcF9jb25maWcpOworICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yID0gZWVwX2NvbmZpZy0+c3RhcnRfbW90b3I7CisgICAgYXNjX2R2Yy0+ZHZjX2NudGwgPSBlZXBfY29uZmlnLT5jbnRsOworICAgIGFzY19kdmMtPm5vX3NjYW0gPSBlZXBfY29uZmlnLT5ub19zY2FtOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzBdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzBdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzFdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzFdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzJdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzJdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzNdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzNdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzRdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzRdOworICAgIGFzY19kdmMtPmNmZy0+YWRhcHRlcl9pbmZvWzVdID0gZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzVdOworICAgIGlmICghQXNjVGVzdEV4dGVybmFsTHJhbShhc2NfZHZjKSkgeworICAgICAgICBpZiAoKChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19QQ0lfVUxUUkEpID09IEFTQ19JU19QQ0lfVUxUUkEpKSB7CisgICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01BWF9QQ0lfVUxUUkFfSU5SQU1fVE9UQUxfUU5HOworICAgICAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBBU0NfTUFYX1BDSV9VTFRSQV9JTlJBTV9UQUdfUU5HOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y2ZnX21zdyB8PSAweDA4MDA7CisgICAgICAgICAgICBjZmdfbXN3IHw9IDB4MDgwMDsKKyAgICAgICAgICAgIEFzY1NldENoaXBDZmdNc3coaW9wX2Jhc2UsIGNmZ19tc3cpOworICAgICAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA9IEFTQ19NQVhfUENJX0lOUkFNX1RPVEFMX1FORzsKKyAgICAgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gQVNDX01BWF9JTlJBTV9UQUdfUU5HOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICB9CisgICAgaWYgKGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPCBBU0NfTUlOX1RPVEFMX1FORykgeworICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01JTl9UT1RBTF9RTkc7CisgICAgfQorICAgIGlmIChlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID4gQVNDX01BWF9UT1RBTF9RTkcpIHsKKyAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA9IEFTQ19NQVhfVE9UQUxfUU5HOworICAgIH0KKyAgICBpZiAoZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPiBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nKSB7CisgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZzsKKyAgICB9CisgICAgaWYgKGVlcF9jb25maWctPm1heF90YWdfcW5nIDwgQVNDX01JTl9UQUdfUV9QRVJfRFZDKSB7CisgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gQVNDX01JTl9UQUdfUV9QRVJfRFZDOworICAgIH0KKyAgICBhc2NfZHZjLT5tYXhfdG90YWxfcW5nID0gZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZzsKKyAgICBpZiAoKGVlcF9jb25maWctPnVzZV9jbWRfcW5nICYgZWVwX2NvbmZpZy0+ZGlzY19lbmFibGUpICE9CisgICAgICAgIGVlcF9jb25maWctPnVzZV9jbWRfcW5nKSB7CisgICAgICAgIGVlcF9jb25maWctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmc7CisgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUOworICAgIH0KKyAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX0lTQSB8IEFTQ19JU19WTCB8IEFTQ19JU19FSVNBKSkgeworICAgICAgICBhc2NfZHZjLT5pcnFfbm8gPSBBc2NHZXRDaGlwSVJRKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSk7CisgICAgfQorICAgIEFTQ19FRVBfU0VUX0NISVBfSUQoZWVwX2NvbmZpZywgQVNDX0VFUF9HRVRfQ0hJUF9JRChlZXBfY29uZmlnKSAmIEFTQ19NQVhfVElEKTsKKyAgICBhc2NfZHZjLT5jZmctPmNoaXBfc2NzaV9pZCA9IEFTQ19FRVBfR0VUX0NISVBfSUQoZWVwX2NvbmZpZyk7CisgICAgaWYgKCgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfUENJX1VMVFJBKSA9PSBBU0NfSVNfUENJX1VMVFJBKSAmJgorICAgICAgICAhKGFzY19kdmMtPmR2Y19jbnRsICYgQVNDX0NOVExfU0RUUl9FTkFCTEVfVUxUUkEpKSB7CisgICAgICAgIGFzY19kdmMtPmhvc3RfaW5pdF9zZHRyX2luZGV4ID0gQVNDX1NEVFJfVUxUUkFfUENJXzEwTUJfSU5ERVg7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIGFzY19kdmMtPmRvc19pbnQxM190YWJsZVtpXSA9IGVlcF9jb25maWctPmRvc19pbnQxM190YWJsZVtpXTsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5tYXhfdGFnX3FuZ1tpXSA9IGVlcF9jb25maWctPm1heF90YWdfcW5nOworICAgICAgICBhc2NfZHZjLT5jZmctPnNkdHJfcGVyaW9kX29mZnNldFtpXSA9CisgICAgICAgICAgICAodWNoYXIpIChBU0NfREVGX1NEVFJfT0ZGU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgIChhc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleCA8PCA0KSk7CisgICAgfQorICAgIGVlcF9jb25maWctPmNmZ19tc3cgPSBBc2NHZXRDaGlwQ2ZnTXN3KGlvcF9iYXNlKTsKKyAgICBpZiAod3JpdGVfZWVwKSB7CisgICAgICAgIGlmICgoaSA9IEFzY1NldEVFUENvbmZpZyhpb3BfYmFzZSwgZWVwX2NvbmZpZywgYXNjX2R2Yy0+YnVzX3R5cGUpKSAhPQorICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAorIkFzY0luaXRGcm9tRUVQOiBGYWlsZWQgdG8gcmUtd3JpdGUgRUVQUk9NIHdpdGggJWQgZXJyb3JzLlxuIiwgaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVNDX1BSSU5UKCJBc2NJbml0RnJvbUVFUDogU3VjY2VzZnVsbHkgcmUtd3JvdGUgRUVQUk9NLiIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAod2Fybl9jb2RlKTsKK30KKworU1RBVElDIHVzaG9ydAorQXNjSW5pdE1pY3JvQ29kZVZhcigKKyAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKKykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7CisgICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICBBU0NfUEFERFIgICAgICAgICAgIHBoeV9hZGRyOworICAgIEFTQ19EQ05UICAgICAgICAgICAgcGh5X3NpemU7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHdhcm5fY29kZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisgICAgICAgIEFzY1B1dE1Db2RlSW5pdFNEVFJBdElEKGlvcF9iYXNlLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnNkdHJfcGVyaW9kX29mZnNldFtpXQorKTsKKyAgICB9CisKKyAgICBBc2NJbml0UUxpbmtWYXIoYXNjX2R2Yyk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9ESVNDX0VOQUJMRV9CLAorICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9IT1NUU0NTSV9JRF9CLAorICAgICAgICAgICAgICAgICAgICAgQVNDX1RJRF9UT19UQVJHRVRfSUQoYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQpKTsKKworICAgIC8qIEFsaWduIG92ZXJydW4gYnVmZmVyIG9uIGFuIDggYnl0ZSBib3VuZGFyeS4gKi8KKyAgICBwaHlfYWRkciA9IHZpcnRfdG9fYnVzKGFzY19kdmMtPmNmZy0+b3ZlcnJ1bl9idWYpOworICAgIHBoeV9hZGRyID0gY3B1X3RvX2xlMzIoKHBoeV9hZGRyICsgNykgJiB+MHg3KTsKKyAgICBBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsIEFTQ1ZfT1ZFUlJVTl9QQUREUl9ELAorICAgICAgICAodWNoYXIgKikgJnBoeV9hZGRyLCAxKTsKKyAgICBwaHlfc2l6ZSA9IGNwdV90b19sZTMyKEFTQ19PVkVSUlVOX0JTSVpFIC0gOCk7CisgICAgQXNjTWVtRFdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLCBBU0NWX09WRVJSVU5fQlNJWkVfRCwKKyAgICAgICAgKHVjaGFyICopICZwaHlfc2l6ZSwgMSk7CisKKyAgICBhc2NfZHZjLT5jZmctPm1jb2RlX2RhdGUgPQorICAgICAgICBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfTUNfREFURV9XKTsKKyAgICBhc2NfZHZjLT5jZmctPm1jb2RlX3ZlcnNpb24gPQorICAgICAgICBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfTUNfVkVSX1cpOworCisgICAgQXNjU2V0UENBZGRyKGlvcF9iYXNlLCBBU0NfTUNPREVfU1RBUlRfQUREUik7CisgICAgaWYgKEFzY0dldFBDQWRkcihpb3BfYmFzZSkgIT0gQVNDX01DT0RFX1NUQVJUX0FERFIpIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1BDX0FERFI7CisgICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKKyAgICB9CisgICAgaWYgKEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSkgIT0gMSkgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TVEFSVF9TVE9QX0NISVA7CisgICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHdhcm5fY29kZSk7Cit9CisKK1NUQVRJQyBpbnQgX19pbml0CitBc2NUZXN0RXh0ZXJuYWxMcmFtKAorICAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YykKK3sKKyAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2F2ZWRfd29yZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YTsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisgICAgc3RhID0gMDsKKyAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKDI0MSk7CisgICAgc2F2ZWRfd29yZCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyKTsKKyAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHFfYWRkcik7CisgICAgQXNjU2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlLCAweDU1QUEpOworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgcV9hZGRyKTsKKyAgICBpZiAoQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKSA9PSAweDU1QUEpIHsKKyAgICAgICAgc3RhID0gMTsKKyAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyLCBzYXZlZF93b3JkKTsKKyAgICB9CisgICAgcmV0dXJuIChzdGEpOworfQorCitTVEFUSUMgaW50IF9faW5pdAorQXNjV3JpdGVFRVBDbWRSZWcoCisgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIHVjaGFyIGNtZF9yZWcKKykKK3sKKyAgICB1Y2hhciAgICAgICAgICAgICAgIHJlYWRfYmFjazsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJldHJ5OworCisgICAgcmV0cnkgPSAwOworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICAgIEFzY1NldENoaXBFRVBDbWQoaW9wX2Jhc2UsIGNtZF9yZWcpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEpOworICAgICAgICByZWFkX2JhY2sgPSBBc2NHZXRDaGlwRUVQQ21kKGlvcF9iYXNlKTsKKyAgICAgICAgaWYgKHJlYWRfYmFjayA9PSBjbWRfcmVnKSB7CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXRyeSsrID4gQVNDX0VFUF9NQVhfUkVUUlkpIHsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1NUQVRJQyBpbnQgX19pbml0CitBc2NXcml0ZUVFUERhdGFSZWcoCisgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGRhdGFfcmVnCispCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICByZWFkX2JhY2s7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXRyeTsKKworICAgIHJldHJ5ID0gMDsKKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICBBc2NTZXRDaGlwRUVQRGF0YShpb3BfYmFzZSwgZGF0YV9yZWcpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEpOworICAgICAgICByZWFkX2JhY2sgPSBBc2NHZXRDaGlwRUVQRGF0YShpb3BfYmFzZSk7CisgICAgICAgIGlmIChyZWFkX2JhY2sgPT0gZGF0YV9yZWcpIHsKKyAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldHJ5KysgPiBBU0NfRUVQX01BWF9SRVRSWSkgeworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworU1RBVElDIHZvaWQgX19pbml0CitBc2NXYWl0RUVQUmVhZCh2b2lkKQoreworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7CisgICAgcmV0dXJuOworfQorCitTVEFUSUMgdm9pZCBfX2luaXQKK0FzY1dhaXRFRVBXcml0ZSh2b2lkKQoreworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMjApOworICAgIHJldHVybjsKK30KKworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FzY1JlYWRFRVBXb3JkKAorICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICB1Y2hhciBhZGRyKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVhZF93dmFsOworICAgIHVjaGFyICAgICAgICAgICAgICAgY21kX3JlZzsKKworICAgIEFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKyAgICBBc2NXYWl0RUVQUmVhZCgpOworICAgIGNtZF9yZWcgPSBhZGRyIHwgQVNDX0VFUF9DTURfUkVBRDsKKyAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgY21kX3JlZyk7CisgICAgQXNjV2FpdEVFUFJlYWQoKTsKKyAgICByZWFkX3d2YWwgPSBBc2NHZXRDaGlwRUVQRGF0YShpb3BfYmFzZSk7CisgICAgQXNjV2FpdEVFUFJlYWQoKTsKKyAgICByZXR1cm4gKHJlYWRfd3ZhbCk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NXcml0ZUVFUFdvcmQoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgdWNoYXIgYWRkciwKKyAgICAgICAgICAgICAgICAgICB1c2hvcnQgd29yZF92YWwpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICByZWFkX3d2YWw7CisKKyAgICByZWFkX3d2YWwgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgYWRkcik7CisgICAgaWYgKHJlYWRfd3ZhbCAhPSB3b3JkX3ZhbCkgeworICAgICAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7CisgICAgICAgIEFzY1dhaXRFRVBSZWFkKCk7CisgICAgICAgIEFzY1dyaXRlRUVQRGF0YVJlZyhpb3BfYmFzZSwgd29yZF92YWwpOworICAgICAgICBBc2NXYWl0RUVQUmVhZCgpOworICAgICAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoKHVjaGFyKSBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpKTsKKyAgICAgICAgQXNjV2FpdEVFUFdyaXRlKCk7CisgICAgICAgIEFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKyAgICAgICAgQXNjV2FpdEVFUFJlYWQoKTsKKyAgICAgICAgcmV0dXJuIChBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgYWRkcikpOworICAgIH0KKyAgICByZXR1cm4gKHJlYWRfd3ZhbCk7Cit9CisKK1NUQVRJQyB1c2hvcnQgX19pbml0CitBc2NHZXRFRVBDb25maWcoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgQVNDRUVQX0NPTkZJRyAqIGNmZ19idWYsIHVzaG9ydCBidXNfdHlwZSkKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHd2YWw7CisgICAgdXNob3J0ICAgICAgICAgICAgICBzdW07CisgICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNmZ19iZWc7CisgICAgaW50ICAgICAgICAgICAgICAgICBjZmdfZW5kOworICAgIGludCAgICAgICAgICAgICAgICAgdWNoYXJfZW5kX2luX2NvbmZpZyA9IEFTQ19FRVBfTUFYX0RWQ19BRERSIC0gMjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNfYWRkcjsKKworICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7CisgICAgc3VtID0gMDsKKyAgICAvKiBSZWFkIHR3byBjb25maWcgd29yZHM7IEJ5dGUtc3dhcHBpbmcgZG9uZSBieSBBc2NSZWFkRUVQV29yZCgpLiAqLworICAgIGZvciAoc19hZGRyID0gMDsgc19hZGRyIDwgMjsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICAqd2J1ZiA9IEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcik7CisgICAgICAgIHN1bSArPSAqd2J1ZjsKKyAgICB9CisgICAgaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisgICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMOworICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFJfVkw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUc7CisgICAgICAgIGNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUjsKKyAgICB9CisgICAgZm9yIChzX2FkZHIgPSBjZmdfYmVnOyBzX2FkZHIgPD0gKGNmZ19lbmQgLSAxKTsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICB3dmFsID0gQXNjUmVhZEVFUFdvcmQoIGlvcF9iYXNlLCAoIHVjaGFyIClzX2FkZHIgKSA7CisgICAgICAgIGlmIChzX2FkZHIgPD0gdWNoYXJfZW5kX2luX2NvbmZpZykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFN3YXAgYWxsIGNoYXIgZmllbGRzIC0gbXVzdCB1bnN3YXAgYnl0ZXMgYWxyZWFkeSBzd2FwcGVkCisgICAgICAgICAgICAgKiBieSBBc2NSZWFkRUVQV29yZCgpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqd2J1ZiA9IGxlMTZfdG9fY3B1KHd2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRG9uJ3Qgc3dhcCB3b3JkIGZpZWxkIGF0IHRoZSBlbmQgLSBjbnRsIGZpZWxkLiAqLworICAgICAgICAgICAgKndidWYgPSB3dmFsOworICAgICAgICB9CisgICAgICAgIHN1bSArPSB3dmFsOyAvKiBDaGVja3N1bSB0cmVhdHMgYWxsIEVFUFJPTSBkYXRhIGFzIHdvcmRzLiAqLworICAgIH0KKyAgICAvKgorICAgICAqIFJlYWQgdGhlIGNoZWNrc3VtIHdvcmQgd2hpY2ggd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0ICdzdW0nCisgICAgICogYnkgdGhlIGNhbGxlci4gV29yZCBmaWVsZCBhbHJlYWR5IHN3YXBwZWQuCisgICAgICovCisgICAgKndidWYgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIpOworICAgIHJldHVybiAoc3VtKTsKK30KKworU1RBVElDIGludCBfX2luaXQKK0FzY1NldEVFUENvbmZpZ09uY2UoCisgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICogY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlKQoreworICAgIGludCAgICAgICAgICAgICAgICAgbl9lcnJvcjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICp3YnVmOworICAgIHVzaG9ydCAgICAgICAgICAgICAgd29yZDsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHN1bTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNfYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNmZ19iZWc7CisgICAgaW50ICAgICAgICAgICAgICAgICBjZmdfZW5kOworICAgIGludCAgICAgICAgICAgICAgICAgdWNoYXJfZW5kX2luX2NvbmZpZyA9IEFTQ19FRVBfTUFYX0RWQ19BRERSIC0gMjsKKworCisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBuX2Vycm9yID0gMDsKKyAgICBzdW0gPSAwOworICAgIC8qIFdyaXRlIHR3byBjb25maWcgd29yZHM7IEFzY1dyaXRlRUVQV29yZCgpIHdpbGwgc3dhcCBieXRlcy4gKi8KKyAgICBmb3IgKHNfYWRkciA9IDA7IHNfYWRkciA8IDI7IHNfYWRkcisrLCB3YnVmKyspIHsKKyAgICAgICAgc3VtICs9ICp3YnVmOworICAgICAgICBpZiAoKndidWYgIT0gQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgKndidWYpKSB7CisgICAgICAgICAgICBuX2Vycm9yKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisgICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMOworICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFJfVkw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUc7CisgICAgICAgIGNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUjsKKyAgICB9CisgICAgZm9yIChzX2FkZHIgPSBjZmdfYmVnOyBzX2FkZHIgPD0gKGNmZ19lbmQgLSAxKTsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICBpZiAoc19hZGRyIDw9IHVjaGFyX2VuZF9pbl9jb25maWcpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgY2hhciBmaWVsZC4gU3dhcCBjaGFyIGZpZWxkcyBiZWZvcmUgdGhleSBhcmUKKyAgICAgICAgICAgICAqIHN3YXBwZWQgYWdhaW4gYnkgQXNjV3JpdGVFRVBXb3JkKCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisgICAgICAgICAgICBpZiAod29yZCAhPSBBc2NXcml0ZUVFUFdvcmQoIGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgd29yZCkpIHsKKyAgICAgICAgICAgICAgICBuX2Vycm9yKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBEb24ndCBzd2FwIHdvcmQgZmllbGQgYXQgdGhlIGVuZCAtIGNudGwgZmllbGQuICovCisgICAgICAgICAgICBpZiAoKndidWYgIT0gQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgKndidWYpKSB7CisgICAgICAgICAgICAgICAgbl9lcnJvcisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN1bSArPSAqd2J1ZjsgLyogQ2hlY2tzdW0gY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgIH0KKyAgICAvKiBXcml0ZSBjaGVja3N1bSB3b3JkLiBJdCB3aWxsIGJlIHN3YXBwZWQgYnkgQXNjV3JpdGVFRVBXb3JkKCkuICovCisgICAgKndidWYgPSBzdW07CisgICAgaWYgKHN1bSAhPSBBc2NXcml0ZUVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcikgc19hZGRyLCBzdW0pKSB7CisgICAgICAgIG5fZXJyb3IrKzsKKyAgICB9CisKKyAgICAvKiBSZWFkIEVFUFJPTSBiYWNrIGFnYWluLiAqLworICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7CisgICAgLyoKKyAgICAgKiBSZWFkIHR3byBjb25maWcgd29yZHM7IEJ5dGUtc3dhcHBpbmcgZG9uZSBieSBBc2NSZWFkRUVQV29yZCgpLgorICAgICAqLworICAgIGZvciAoc19hZGRyID0gMDsgc19hZGRyIDwgMjsgc19hZGRyKyssIHdidWYrKykgeworICAgICAgICBpZiAoKndidWYgIT0gQXNjUmVhZEVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcikgc19hZGRyKSkgeworICAgICAgICAgICAgbl9lcnJvcisrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19WTCkgeworICAgICAgICBjZmdfYmVnID0gQVNDX0VFUF9EVkNfQ0ZHX0JFR19WTDsKKyAgICAgICAgY2ZnX2VuZCA9IEFTQ19FRVBfTUFYX0RWQ19BRERSX1ZMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHOworICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFI7CisgICAgfQorICAgIGZvciAoc19hZGRyID0gY2ZnX2JlZzsgc19hZGRyIDw9IChjZmdfZW5kIC0gMSk7IHNfYWRkcisrLCB3YnVmKyspIHsKKyAgICAgICAgaWYgKHNfYWRkciA8PSB1Y2hhcl9lbmRfaW5fY29uZmlnKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3dhcCBhbGwgY2hhciBmaWVsZHMuIE11c3QgdW5zd2FwIGJ5dGVzIGFscmVhZHkgc3dhcHBlZAorICAgICAgICAgICAgICogYnkgQXNjUmVhZEVFUFdvcmQoKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd29yZCA9IGxlMTZfdG9fY3B1KEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRG9uJ3Qgc3dhcCB3b3JkIGZpZWxkIGF0IHRoZSBlbmQgLSBjbnRsIGZpZWxkLiAqLworICAgICAgICAgICAgd29yZCA9IEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCp3YnVmICE9IHdvcmQpIHsKKyAgICAgICAgICAgIG5fZXJyb3IrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBSZWFkIGNoZWNrc3VtOyBCeXRlIHN3YXBwaW5nIG5vdCBuZWVkZWQuICovCisgICAgaWYgKEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcikgIT0gc3VtKSB7CisgICAgICAgIG5fZXJyb3IrKzsKKyAgICB9CisgICAgcmV0dXJuIChuX2Vycm9yKTsKK30KKworU1RBVElDIGludCBfX2luaXQKK0FzY1NldEVFUENvbmZpZygKKyAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICogY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlCispCit7CisgICAgaW50ICAgICAgICAgICAgcmV0cnk7CisgICAgaW50ICAgICAgICAgICAgbl9lcnJvcjsKKworICAgIHJldHJ5ID0gMDsKKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICBpZiAoKG5fZXJyb3IgPSBBc2NTZXRFRVBDb25maWdPbmNlKGlvcF9iYXNlLCBjZmdfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c190eXBlKSkgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrcmV0cnkgPiBBU0NfRUVQX01BWF9SRVRSWSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChuX2Vycm9yKTsKK30KKworU1RBVElDIHZvaWQKK0FzY0FzeW5jRml4KAorICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8sCisgICAgICAgICAgICAgICBBU0NfU0NTSV9JTlFVSVJZICppbnEpCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIGR2Y190eXBlOworICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFICAgICAgICB0aWRfYml0czsKKworICAgIGR2Y190eXBlID0gQVNDX0lOUV9EVkNfVFlQRShpbnEpOworICAgIHRpZF9iaXRzID0gQVNDX1RJWF9UT19UQVJHRVRfSUQodGlkX25vKTsKKworICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwgJiBBU0NfQlVHX0ZJWF9BU1lOX1VTRV9TWU4pCisgICAgeworICAgICAgICBpZiAoIShhc2NfZHZjLT5pbml0X3NkdHIgJiB0aWRfYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZHZjX3R5cGUgPT0gVFlQRV9ST00pICYmCisgICAgICAgICAgICAgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopIGlucS0+dmVuZG9yX2lkLAorICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgIkhQICIsIDMpID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyB8PSB0aWRfYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyIHw9IHRpZF9iaXRzOworICAgICAgICAgICAgaWYgKChkdmNfdHlwZSA9PSBUWVBFX1BST0NFU1NPUikgfHwKKyAgICAgICAgICAgICAgICAoZHZjX3R5cGUgPT0gVFlQRV9TQ0FOTkVSKSB8fAorICAgICAgICAgICAgICAgIChkdmNfdHlwZSA9PSBUWVBFX1JPTSkgfHwKKyAgICAgICAgICAgICAgICAoZHZjX3R5cGUgPT0gVFlQRV9UQVBFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmPSB+dGlkX2JpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRpZF9iaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzY1NldFJ1bkNoaXBTeW5SZWdBdElEKGFzY19kdmMtPmlvcF9iYXNlLCB0aWRfbm8sCisgICAgICAgICAgICAgICAgICAgIEFTWU5fU0RUUl9EQVRBX0ZJWF9QQ0lfUkVWX0FCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK1NUQVRJQyBpbnQKK0FzY1RhZ1F1ZXVpbmdTYWZlKEFTQ19TQ1NJX0lOUVVJUlkgKmlucSkKK3sKKyAgICBpZiAoKGlucS0+YWRkX2xlbiA+PSAzMikgJiYKKyAgICAgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopIGlucS0+dmVuZG9yX2lkLAorICAgICAgICAgICAgKHVjaGFyICopICJRVUFOVFVNIFhQMzQzMDEiLCAxNSkgPT0gMCkgJiYKKyAgICAgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopIGlucS0+cHJvZHVjdF9yZXZfbGV2ZWwsCisgICAgICAgICAgICAodWNoYXIgKikgIjEwNzEiLCA0KSA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworU1RBVElDIHZvaWQKK0FzY0lucXVpcnlIYW5kbGluZyhBU0NfRFZDX1ZBUiAqYXNjX2R2YywKKyAgICAgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8sIEFTQ19TQ1NJX0lOUVVJUlkgKmlucSkKK3sKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSB0aWRfYml0ID0gQVNDX1RJWF9UT19UQVJHRVRfSUQodGlkX25vKTsKKyAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBvcmlnX2luaXRfc2R0ciwgb3JpZ191c2VfdGFnZ2VkX3FuZzsKKworICAgIG9yaWdfaW5pdF9zZHRyID0gYXNjX2R2Yy0+aW5pdF9zZHRyOworICAgIG9yaWdfdXNlX3RhZ2dlZF9xbmcgPSBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZzsKKworICAgIGFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGlkX2JpdDsKKyAgICBhc2NfZHZjLT5jZmctPmNhbl90YWdnZWRfcW5nICY9IH50aWRfYml0OworICAgIGFzY19kdmMtPnVzZV90YWdnZWRfcW5nICY9IH50aWRfYml0OworCisgICAgaWYgKEFTQ19JTlFfUkVTUE9OU0VfRk1UKGlucSkgPj0gMiB8fCBBU0NfSU5RX0FOU0lfVkVSKGlucSkgPj0gMikgeworICAgICAgICBpZiAoKGFzY19kdmMtPmNmZy0+c2R0cl9lbmFibGUgJiB0aWRfYml0KSAmJiBBU0NfSU5RX1NZTkMoaW5xKSkgeworICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyIHw9IHRpZF9iaXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCAmIHRpZF9iaXQpICYmCisgICAgICAgICAgICAgQVNDX0lOUV9DTURfUVVFVUUoaW5xKSkgeworICAgICAgICAgICAgaWYgKEFzY1RhZ1F1ZXVpbmdTYWZlKGlucSkpIHsKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZyB8PSB0aWRfYml0OworICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgfD0gdGlkX2JpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3JpZ191c2VfdGFnZ2VkX3FuZyAhPSBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZykgeworICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX0RJU0NfRU5BQkxFX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsIEFTQ1ZfVVNFX1RBR0dFRF9RTkdfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZyk7CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsIEFTQ1ZfQ0FOX1RBR0dFRF9RTkdfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPmNhbl90YWdnZWRfcW5nKTsKKworICAgICAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dID0KKyAgICAgICAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW3RpZF9ub107CisgICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKEFTQ1ZfTUFYX0RWQ19RTkdfQkVHICsgdGlkX25vKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dKTsKKyAgICB9CisgICAgaWYgKG9yaWdfaW5pdF9zZHRyICE9IGFzY19kdmMtPmluaXRfc2R0cikgeworICAgICAgICBBc2NBc3luY0ZpeChhc2NfZHZjLCB0aWRfbm8sIGlucSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworU1RBVElDIGludAorQXNjQ29tcGFyZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgKnN0cjEsCisgICAgICAgICAgICAgICAgICAgIHVjaGFyICpzdHIyLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVuCispCit7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICAgICAgZGlmZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBkaWZmID0gKGludCkgKHN0cjFbaV0gLSBzdHIyW2ldKTsKKyAgICAgICAgaWYgKGRpZmYgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoZGlmZik7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB1Y2hhcgorQXNjUmVhZExyYW1CeXRlKAorICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyCispCit7CisgICAgdWNoYXIgICAgICAgICAgICAgICBieXRlX2RhdGE7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3b3JkX2RhdGE7CisKKyAgICBpZiAoaXNvZGRfd29yZChhZGRyKSkgeworICAgICAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIgLSAxKTsKKyAgICAgICAgd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKyAgICAgICAgYnl0ZV9kYXRhID0gKHVjaGFyKSAoKHdvcmRfZGF0YSA+PiA4KSAmIDB4RkYpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkcik7CisgICAgICAgIHdvcmRfZGF0YSA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7CisgICAgICAgIGJ5dGVfZGF0YSA9ICh1Y2hhcikgKHdvcmRfZGF0YSAmIDB4RkYpOworICAgIH0KKyAgICByZXR1cm4gKGJ5dGVfZGF0YSk7Cit9CitTVEFUSUMgdXNob3J0CitBc2NSZWFkTHJhbVdvcmQoCisgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgdXNob3J0IGFkZHIKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmRfZGF0YTsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkcik7CisgICAgd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKyAgICByZXR1cm4gKHdvcmRfZGF0YSk7Cit9CisKKyNpZiBDQ19WRVJZX0xPTkdfU0dfTElTVAorU1RBVElDIEFTQ19EQ05UCitBc2NSZWFkTHJhbURXb3JkKAorICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgdXNob3J0IGFkZHIKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHZhbF9sb3csIHZhbF9oaWdoOworICAgIEFTQ19EQ05UICAgICAgICAgICAgZHdvcmRfZGF0YTsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkcik7CisgICAgdmFsX2xvdyA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7CisgICAgdmFsX2hpZ2ggPSBBc2NHZXRDaGlwTHJhbURhdGEoaW9wX2Jhc2UpOworICAgIGR3b3JkX2RhdGEgPSAoKEFTQ19EQ05UKSB2YWxfaGlnaCA8PCAxNikgfCAoQVNDX0RDTlQpIHZhbF9sb3c7CisgICAgcmV0dXJuIChkd29yZF9kYXRhKTsKK30KKyNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLworCitTVEFUSUMgdm9pZAorQXNjV3JpdGVMcmFtV29yZCgKKyAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyLAorICAgICAgICAgICAgICAgICAgICB1c2hvcnQgd29yZF92YWwKKykKK3sKKyAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOworICAgIEFzY1NldENoaXBMcmFtRGF0YShpb3BfYmFzZSwgd29yZF92YWwpOworICAgIHJldHVybjsKK30KKworU1RBVElDIHZvaWQKK0FzY1dyaXRlTHJhbUJ5dGUoCisgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgYnl0ZV92YWwKKykKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmRfZGF0YTsKKworICAgIGlmIChpc29kZF93b3JkKGFkZHIpKSB7CisgICAgICAgIGFkZHItLTsKKyAgICAgICAgd29yZF9kYXRhID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyKTsKKyAgICAgICAgd29yZF9kYXRhICY9IDB4MDBGRjsKKyAgICAgICAgd29yZF9kYXRhIHw9ICgoKHVzaG9ydCkgYnl0ZV92YWwgPDwgOCkgJiAweEZGMDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdvcmRfZGF0YSA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgYWRkcik7CisgICAgICAgIHdvcmRfZGF0YSAmPSAweEZGMDA7CisgICAgICAgIHdvcmRfZGF0YSB8PSAoKHVzaG9ydCkgYnl0ZV92YWwgJiAweDAwRkYpOworICAgIH0KKyAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyLCB3b3JkX2RhdGEpOworICAgIHJldHVybjsKK30KKworLyoKKyAqIENvcHkgMiBieXRlcyB0byBMUkFNLgorICoKKyAqIFRoZSBzb3VyY2UgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgaW4gbWVtb3J5CisgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdHRlbiB0byBMUkFNLgorICovCitTVEFUSUMgdm9pZAorQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKKykKK3sKKyAgICBpbnQgICAgaTsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogT24gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSB0aGUgc2Vjb25kIGFyZ3VtZW50IGJlbG93CisgICAgICAgICAqIHByb2R1Y2VzIGEgbGl0dGxlLWVuZGlhbiB1c2hvcnQgd2hpY2ggaXMgd3JpdHRlbiB0bworICAgICAgICAgKiBMUkFNIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuIE9uIGEgYmlnLWVuZGlhbiBzeXN0ZW0KKyAgICAgICAgICogdGhlIHNlY29uZCBhcmd1bWVudCBwcm9kdWNlcyBhIGJpZy1lbmRpYW4gdXNob3J0IHdoaWNoCisgICAgICAgICAqIGlzICJ0cmFuc3BhcmVudGx5IiBieXRlLXN3YXBwZWQgYnkgb3V0cHcoKSBhbmQgd3JpdHRlbgorICAgICAgICAgKiBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHRvIExSQU0uCisgICAgICAgICAqLworICAgICAgICBvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwKKyAgICAgICAgICAgICgodXNob3J0KSBzX2J1ZmZlcltpICsgMV0gPDwgOCkgfCBzX2J1ZmZlcltpXSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIENvcHkgNCBieXRlcyB0byBMUkFNLgorICoKKyAqIFRoZSBzb3VyY2UgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgaW4gbWVtb3J5CisgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdGVuIHRvIExSQU0uCisgKi8KK1NUQVRJQyB2b2lkCitBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR3b3JkcworKQoreworICAgIGludCAgICAgICBpOworCisgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCA0ICogZHdvcmRzOyBpICs9IDQpIHsKKyAgICAgICAgb3V0cHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEsCisgICAgICAgICAgICAoKHVzaG9ydCkgc19idWZmZXJbaSArIDFdIDw8IDgpIHwgc19idWZmZXJbaV0pOyAvKiBMU1cgKi8KKyAgICAgICAgb3V0cHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEsCisgICAgICAgICAgICAoKHVzaG9ydCkgc19idWZmZXJbaSArIDNdIDw8IDgpIHwgc19idWZmZXJbaSArIDJdKTsgLyogTVNXICovCisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIENvcHkgMiBieXRlcyBmcm9tIExSQU0uCisgKgorICogVGhlIHNvdXJjZSBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBpbiBMUkFNCisgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdHRlbiB0byBtZW1vcnkuCisgKi8KK1NUQVRJQyB2b2lkCitBc2NNZW1Xb3JkQ29weVB0ckZyb21McmFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKmRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKKykKK3sKKyAgICBpbnQgaTsKKyAgICB1c2hvcnQgd29yZDsKKworICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKyAgICAgICAgd29yZCA9IGlucHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEpOworICAgICAgICBkX2J1ZmZlcltpXSA9IHdvcmQgJiAweGZmOworICAgICAgICBkX2J1ZmZlcltpICsgMV0gPSAod29yZCA+PiA4KSAmIDB4ZmY7CisgICAgfQorICAgIHJldHVybjsKK30KKworU1RBVElDIEFTQ19EQ05UCitBc2NNZW1TdW1McmFtV29yZCgKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3b3JkcworKQoreworICAgIEFTQ19EQ05UICAgICAgICAgc3VtOworICAgIGludCAgICAgICAgICAgICAgaTsKKworICAgIHN1bSA9IDBMOworICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrLCBzX2FkZHIgKz0gMikgeworICAgICAgICBzdW0gKz0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIH0KKyAgICByZXR1cm4gKHN1bSk7Cit9CisKK1NUQVRJQyB2b2lkCitBc2NNZW1Xb3JkU2V0THJhbSgKKyAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzZXRfd3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3b3JkcworKQoreworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CisgICAgICAgIEFzY1NldENoaXBMcmFtRGF0YShpb3BfYmFzZSwgc2V0X3d2YWwpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoKKyAqIC0tLSBBZHYgTGlicmFyeSBGdW5jdGlvbnMKKyAqLworCisvKiBhX21jb2RlLmggKi8KKworLyogTWljcm9jb2RlIGJ1ZmZlciBpcyBrZXB0IGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4gKi8KK1NUQVRJQyB1bnNpZ25lZCBjaGFyIF9hZHZfYXNjMzU1MF9idWZbXSA9IHsKKyAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHhmMiwgIDB4MDAsICAweGYwLCAgMHgwMCwgIDB4MTYsICAweDE4LCAgMHhlNCwgIDB4MDAsICAweGZjLCAgMHgwMSwgIDB4MDAsICAweDQ4LCAgMHhlNCwKKyAgMHhiZSwgIDB4MTgsICAweDE4LCAgMHg4MCwgIDB4MDMsICAweGY2LCAgMHgwMiwgIDB4MDAsICAweDAwLCAgMHhmYSwgIDB4ZmYsICAweGZmLCAgMHgyOCwgIDB4MGUsICAweDllLCAgMHhlNywKKyAgMHhmZiwgIDB4MDAsICAweDgyLCAgMHhlNywgIDB4MDAsICAweGVhLCAgMHgwMCwgIDB4ZjYsICAweDAxLCAgMHhlNiwgIDB4MDksICAweGU3LCAgMHg1NSwgIDB4ZjAsICAweDAxLCAgMHhmNiwKKyAgMHgwMSwgIDB4ZmEsICAweDA4LCAgMHgwMCwgIDB4MDMsICAweDAwLCAgMHgwNCwgIDB4MDAsICAweDE4LCAgMHhmNCwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZWMsICAweDg1LCAgMHhmMCwKKyAgMHhiYywgIDB4MDAsICAweGQ1LCAgMHhmMCwgIDB4OGUsICAweDBjLCAgMHgzOCwgIDB4NTQsICAweDAwLCAgMHhlNiwgIDB4MWUsICAweGYwLCAgMHg4NiwgIDB4ZjAsICAweGI0LCAgMHgwMCwKKyAgMHg5OCwgIDB4NTcsICAweGQwLCAgMHgwMSwgIDB4MGMsICAweDFjLCAgMHgzZSwgIDB4MWMsICAweDBjLCAgMHgwMCwgIDB4YmIsICAweDAwLCAgMHhhYSwgIDB4MTgsICAweDAyLCAgMHg4MCwKKyAgMHgzMiwgIDB4ZjAsICAweDAxLCAgMHhmYywgIDB4ODgsICAweDBjLCAgMHhjNiwgIDB4MTIsICAweDAyLCAgMHgxMywgIDB4MTgsICAweDQwLCAgMHgwMCwgIDB4NTcsICAweDAxLCAgMHhlYSwKKyAgMHgzYywgIDB4MDAsICAweDZjLCAgMHgwMSwgIDB4NmUsICAweDAxLCAgMHgwNCwgIDB4MTIsICAweDNlLCAgMHg1NywgIDB4MDAsICAweDgwLCAgMHgwMywgIDB4ZTYsICAweGI2LCAgMHgwMCwKKyAgMHhjMCwgIDB4MDAsICAweDAxLCAgMHgwMSwgIDB4M2UsICAweDAxLCAgMHhkYSwgIDB4MGYsICAweDIyLCAgMHgxMCwgIDB4MDgsICAweDEyLCAgMHgwMiwgIDB4NGEsICAweGI5LCAgMHg1NCwKKyAgMHgwMywgIDB4NTgsICAweDFiLCAgMHg4MCwgIDB4MzAsICAweGU0LCAgMHg0YiwgIDB4ZTQsICAweDIwLCAgMHgwMCwgIDB4MzIsICAweDAwLCAgMHgzZSwgIDB4MDAsICAweDgwLCAgMHgwMCwKKyAgMHgyNCwgIDB4MDEsICAweDNjLCAgMHgwMSwgIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsICAweDcwLCAgMHgwMSwgIDB4NzIsICAweDAxLCAgMHg3NCwgIDB4MDEsICAweDc2LCAgMHgwMSwKKyAgMHg3OCwgIDB4MDEsICAweDYyLCAgMHgwYSwgIDB4OTIsICAweDBjLCAgMHgyYywgIDB4MTAsICAweDJlLCAgMHgxMCwgIDB4MDYsICAweDEzLCAgMHg0YywgIDB4MWMsICAweGJiLCAgMHg1NSwKKyAgMHgzYywgIDB4NTYsICAweDA0LCAgMHg4MCwgIDB4NGEsICAweGU0LCAgMHgwMiwgIDB4ZWUsICAweDViLCAgMHhmMCwgIDB4YjEsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDA2LCAgMHhmNywKKyAgMHgwMywgIDB4ZmMsICAweDBmLCAgMHgwMCwgIDB4NDAsICAweDAwLCAgMHhiZSwgIDB4MDAsICAweDAwLCAgMHgwMSwgIDB4YjAsICAweDA4LCAgMHgzMCwgIDB4MTMsICAweDY0LCAgMHgxNSwKKyAgMHgzMiwgIDB4MWMsICAweDM4LCAgMHgxYywgIDB4NGUsICAweDFjLCAgMHgxMCwgIDB4NDQsICAweDAyLCAgMHg0OCwgIDB4MDAsICAweDRjLCAgMHgwNCwgIDB4ZWEsICAweDVkLCAgMHhmMCwKKyAgMHgwNCwgIDB4ZjYsICAweDAyLCAgMHhmYywgIDB4MDUsICAweDAwLCAgMHgzNCwgIDB4MDAsICAweDM2LCAgMHgwMCwgIDB4OTgsICAweDAwLCAgMHhjYywgIDB4MDAsICAweDIwLCAgMHgwMSwKKyAgMHg0ZSwgIDB4MDEsICAweDRlLCAgMHgwYiwgIDB4MWUsICAweDBlLCAgMHgwYywgIDB4MTAsICAweDBhLCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHg0MCwgIDB4MTMsICAweDMwLCAgMHgxYywKKyAgMHgwMCwgIDB4NGUsICAweGJkLCAgMHg1NiwgIDB4MDYsICAweDgzLCAgMHgwMCwgIDB4ZGMsICAweDA1LCAgMHhmMCwgIDB4MDksICAweGYwLCAgMHg1OSwgIDB4ZjAsICAweGE3LCAgMHhmMCwKKyAgMHhiOCwgIDB4ZjAsICAweDBlLCAgMHhmNywgIDB4MDYsICAweDAwLCAgMHgxOSwgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4OWIsICAweDAwLCAgMHhhNCwgIDB4MDAsICAweGI1LCAgMHgwMCwKKyAgMHhiYSwgIDB4MDAsICAweGQwLCAgMHgwMCwgIDB4ZTEsICAweDAwLCAgMHhlNywgIDB4MDAsICAweGRlLCAgMHgwMywgIDB4NTYsICAweDBhLCAgMHgxNCwgIDB4MGUsICAweDAyLCAgMHgxMCwKKyAgMHgwNCwgIDB4MTAsICAweDBhLCAgMHgxMCwgIDB4MzYsICAweDEwLCAgMHgwYSwgIDB4MTMsICAweDEyLCAgMHgxMywgIDB4NTIsICAweDEzLCAgMHgxMCwgIDB4MTUsICAweDE0LCAgMHgxNSwKKyAgMHhhYywgIDB4MTYsICAweDIwLCAgMHgxYywgIDB4MzQsICAweDFjLCAgMHgzNiwgIDB4MWMsICAweDA4LCAgMHg0NCwgIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwKKyAgMHg0OCwgIDB4NDYsICAweDAxLCAgMHg0OCwgIDB4NjgsICAweDU0LCAgMHg4MywgIDB4NTUsICAweGIwLCAgMHg1NywgIDB4MDEsICAweDU4LCAgMHg4MywgIDB4NTksICAweDA1LCAgMHhlNiwKKyAgMHgwYiwgIDB4ZjAsICAweDBjLCAgMHhmMCwgIDB4NWMsICAweGYwLCAgMHg0YiwgIDB4ZjQsICAweDA0LCAgMHhmOCwgIDB4MDUsICAweGY4LCAgMHgwMiwgIDB4ZmEsICAweDAzLCAgMHhmYSwKKyAgMHgwNCwgIDB4ZmMsICAweDA1LCAgMHhmYywgIDB4MDcsICAweDAwLCAgMHgwYSwgIDB4MDAsICAweDBkLCAgMHgwMCwgIDB4MWMsICAweDAwLCAgMHg5ZSwgIDB4MDAsICAweGE4LCAgMHgwMCwKKyAgMHhhYSwgIDB4MDAsICAweGI5LCAgMHgwMCwgIDB4ZTAsICAweDAwLCAgMHgyMiwgIDB4MDEsICAweDI2LCAgMHgwMSwgIDB4NzksICAweDAxLCAgMHg3YSwgIDB4MDEsICAweGMwLCAgMHgwMSwKKyAgMHhjMiwgIDB4MDEsICAweDdjLCAgMHgwMiwgIDB4NWEsICAweDAzLCAgMHhlYSwgIDB4MDQsICAweGU4LCAgMHgwNywgIDB4NjgsICAweDA4LCAgMHg2OSwgIDB4MDgsICAweGJhLCAgMHgwOCwKKyAgMHhlOSwgIDB4MDksICAweDA2LCAgMHgwYiwgIDB4M2EsICAweDBlLCAgMHgwMCwgIDB4MTAsICAweDFhLCAgMHgxMCwgIDB4ZWQsICAweDEwLCAgMHhmMSwgIDB4MTAsICAweDA2LCAgMHgxMiwKKyAgMHgwYywgIDB4MTMsICAweDE2LCAgMHgxMywgIDB4MWUsICAweDEzLCAgMHg4MiwgIDB4MTMsICAweDQyLCAgMHgxNCwgIDB4ZDYsICAweDE0LCAgMHg4YSwgIDB4MTUsICAweGM2LCAgMHgxNywKKyAgMHhkMiwgIDB4MTcsICAweDZiLCAgMHgxOCwgIDB4MTIsICAweDFjLCAgMHg0NiwgIDB4MWMsICAweDljLCAgMHgzMiwgIDB4MDAsICAweDQwLCAgMHgwZSwgIDB4NDcsICAweDQ4LCAgMHg0NywKKyAgMHg0MSwgIDB4NDgsICAweDg5LCAgMHg0OCwgIDB4ODAsICAweDRjLCAgMHgwMCwgIDB4NTQsICAweDQ0LCAgMHg1NSwgIDB4ZTUsICAweDU1LCAgMHgxNCwgIDB4NTYsICAweDc3LCAgMHg1NywKKyAgMHhiZiwgIDB4NTcsICAweDQwLCAgMHg1YywgIDB4MDYsICAweDgwLCAgMHgwOCwgIDB4OTAsICAweDAzLCAgMHhhMSwgIDB4ZmUsICAweDljLCAgMHhmMCwgIDB4MjksICAweDAyLCAgMHhmZSwKKyAgMHhiOCwgIDB4MGMsICAweGZmLCAgMHgxMCwgIDB4MDAsICAweDAwLCAgMHhkMCwgIDB4ZmUsICAweGNjLCAgMHgxOCwgIDB4MDAsICAweGNmLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHhmZiwKKyAgMHgwMywgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4OTMsICAweDE1LCAgMHhmZSwgIDB4MGYsICAweDA1LCAgMHhmZiwgIDB4MzgsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDU3LCAgMHgyNCwKKyAgMHgwMCwgIDB4ZmUsICAweDQ4LCAgMHgwMCwgIDB4NGYsICAweGZmLCAgMHgwNCwgIDB4MDAsICAweDAwLCAgMHgxMCwgIDB4ZmYsICAweDA5LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgwOCwKKyAgMHgwMSwgIDB4MDEsICAweGZmLCAgMHgwOCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MjcsICAweDAwLCAgMHgwMCwgIDB4ZmYsICAweDEwLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHgwZiwKKyAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg3OCwgIDB4NTYsICAweGZlLCAgMHgzNCwgIDB4MTIsICAweGZmLCAgMHgyMSwgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4MDQsICAweGY3LCAgMHhjZiwKKyAgMHgyYSwgIDB4NjcsICAweDBiLCAgMHgwMSwgIDB4ZmUsICAweGNlLCAgMHgwZSwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4Y2YsICAweDY3LCAgMHgwYiwgIDB4M2MsICAweDJhLCAgMHhmZSwKKyAgMHgzZCwgIDB4ZjAsICAweGZlLCAgMHgwMiwgIDB4MDIsICAweGZlLCAgMHgyMCwgIDB4ZjAsICAweDljLCAgMHhmZSwgIDB4OTEsICAweGYwLCAgMHhmZSwgIDB4ZjAsICAweDAxLCAgMHhmZSwKKyAgMHg5MCwgIDB4ZjAsICAweGZlLCAgMHhmMCwgIDB4MDEsICAweGZlLCAgMHg4ZiwgIDB4ZjAsICAweDljLCAgMHgwNSwgIDB4NTEsICAweDNiLCAgMHgwMiwgIDB4ZmUsICAweGQ0LCAgMHgwYywKKyAgMHgwMSwgIDB4ZmUsICAweDQ0LCAgMHgwZCwgIDB4ZmUsICAweGRkLCAgMHgxMiwgIDB4ZmUsICAweGZjLCAgMHgxMCwgIDB4ZmUsICAweDI4LCAgMHgxYywgIDB4MDUsICAweGZlLCAgMHhhNiwKKyAgMHgwMCwgIDB4ZmUsICAweGQzLCAgMHgxMiwgIDB4NDcsICAweDE4LCAgMHhmZSwgIDB4YTYsICAweDAwLCAgMHhiNSwgIDB4ZmUsICAweDQ4LCAgMHhmMCwgIDB4ZmUsICAweDg2LCAgMHgwMiwKKyAgMHhmZSwgIDB4NDksICAweGYwLCAgMHhmZSwgIDB4YTAsICAweDAyLCAgMHhmZSwgIDB4NGEsICAweGYwLCAgMHhmZSwgIDB4YmUsICAweDAyLCAgMHhmZSwgIDB4NDYsICAweGYwLCAgMHhmZSwKKyAgMHg1MCwgIDB4MDIsICAweGZlLCAgMHg0NywgIDB4ZjAsICAweGZlLCAgMHg1NiwgIDB4MDIsICAweGZlLCAgMHg0MywgIDB4ZjAsICAweGZlLCAgMHg0NCwgIDB4MDIsICAweGZlLCAgMHg0NCwKKyAgMHhmMCwgIDB4ZmUsICAweDQ4LCAgMHgwMiwgIDB4ZmUsICAweDQ1LCAgMHhmMCwgIDB4ZmUsICAweDRjLCAgMHgwMiwgIDB4MTcsICAweDBiLCAgMHhhMCwgIDB4MTcsICAweDA2LCAgMHgxOCwKKyAgMHg5NiwgIDB4MDIsICAweDI5LCAgMHhmZSwgIDB4MDAsICAweDFjLCAgMHhkZSwgIDB4ZmUsICAweDAyLCAgMHgxYywgIDB4ZGQsICAweGZlLCAgMHgxZSwgIDB4MWMsICAweGZlLCAgMHhlOSwKKyAgMHgxMCwgIDB4MDEsICAweGZlLCAgMHgyMCwgIDB4MTcsICAweGZlLCAgMHhlNywgIDB4MTAsICAweGZlLCAgMHgwNiwgIDB4ZmMsICAweGM3LCAgMHgwYSwgIDB4NmIsICAweDAxLCAgMHg5ZSwKKyAgMHgwMiwgIDB4MjksICAweDE0LCAgMHg0ZCwgIDB4MzcsICAweDk3LCAgMHgwMSwgIDB4ZmUsICAweDY0LCAgMHgwZiwgIDB4MGEsICAweDZiLCAgMHgwMSwgIDB4ODIsICAweGZlLCAgMHhiZCwKKyAgMHgxMCwgIDB4MGEsICAweDZiLCAgMHgwMSwgIDB4ODIsICAweGZlLCAgMHhhZCwgIDB4MTAsICAweGZlLCAgMHgxNiwgIDB4MWMsICAweGZlLCAgMHg1OCwgIDB4MWMsICAweDE3LCAgMHgwNiwKKyAgMHgxOCwgIDB4OTYsICAweDJhLCAgMHgyNSwgIDB4MjksICAweGZlLCAgMHgzZCwgIDB4ZjAsICAweGZlLCAgMHgwMiwgIDB4MDIsICAweDIxLCAgMHhmZSwgIDB4OTQsICAweDAyLCAgMHhmZSwKKyAgMHg1YSwgIDB4MWMsICAweGVhLCAgMHhmZSwgIDB4MTQsICAweDFjLCAgMHgxNCwgIDB4ZmUsICAweDMwLCAgMHgwMCwgIDB4MzcsICAweDk3LCAgMHgwMSwgIDB4ZmUsICAweDU0LCAgMHgwZiwKKyAgMHgxNywgIDB4MDYsICAweDE4LCAgMHg5NiwgIDB4MDIsICAweGQwLCAgMHgxZSwgIDB4MjAsICAweDA3LCAgMHgxMCwgIDB4MzQsICAweGZlLCAgMHg2OSwgIDB4MTAsICAweDE3LCAgMHgwNiwKKyAgMHgxOCwgIDB4OTYsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDIwLCAgMHg0NiwgIDB4M2QsICAweDEyLCAgMHgyMCwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4YzcsICAweDAxLCAgMHhmZSwKKyAgMHg1MiwgIDB4MTYsICAweDA5LCAgMHg0YSwgIDB4NGMsICAweDM1LCAgMHgxMSwgIDB4MmQsICAweDNjLCAgMHg4YSwgIDB4MDEsICAweGU2LCAgMHgwMiwgIDB4MjksICAweDBhLCAgMHg0MCwKKyAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NWQsICAweDAxLCAgMHg2ZiwgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MGEsICAweDk5LCAgMHgwMSwKKyAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg1NCwgIDB4NjQsICAweGZlLCAgMHgwYywgIDB4MDMsICAweDAxLCAgMHhlNiwgIDB4MDIsICAweDI5LCAgMHgyYSwgIDB4NDYsICAweGZlLCAgMHgwMiwKKyAgMHhlOCwgIDB4MjcsICAweGY4LCAgMHhmZSwgIDB4OWUsICAweDQzLCAgMHhmNywgIDB4ZmUsICAweDI3LCAgMHhmMCwgIDB4ZmUsICAweGRjLCAgMHgwMSwgIDB4ZmUsICAweDA3LCAgMHg0YiwKKyAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHg5YywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MjUsICAweGQyLCAgMHhmZSwgIDB4MjYsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDAzLCAgMHhmZSwKKyAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg0NCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsICAweDljLCAgMHhmZSwgIDB4ZWYsICAweDEwLCAgMHhmZSwgIDB4OWYsICAweGYwLCAgMHhmZSwKKyAgMHg2NCwgIDB4MDMsICAweGViLCAgMHgwZiwgIDB4ZmUsICAweDExLCAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHgyYSwgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4ZWIsICAweDA5LCAgMHgwNCwKKyAgMHgxZCwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4MjMsICAweDFlLCAgMHg5OCwgIDB4YWMsICAweDEyLCAgMHg5OCwgIDB4MGEsICAweDQwLCAgMHgwMSwgIDB4MGUsICAweGFjLCAgMHg3NSwKKyAgMHgwMSwgIDB4ZmUsICAweGJjLCAgMHgxNSwgIDB4MTEsICAweGNhLCAgMHgyNSwgIDB4ZDIsICAweGZlLCAgMHgwMSwgIDB4ZjAsICAweGQyLCAgMHhmZSwgIDB4ODIsICAweGYwLCAgMHhmZSwKKyAgMHg5MiwgIDB4MDMsICAweGVjLCAgMHgxMSwgIDB4ZmUsICAweGU0LCAgMHgwMCwgIDB4NjUsICAweGZlLCAgMHhhNCwgIDB4MDMsICAweDI1LCAgMHgzMiwgIDB4MWYsICAweGZlLCAgMHhiNCwKKyAgMHgwMywgIDB4MDEsICAweDQzLCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4YzQsICAweDAzLCAgMHg4ZCwgIDB4ODEsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHg3YSwKKyAgMHgwNiwgIDB4MDIsICAweDIyLCAgMHgwNSwgIDB4NmIsICAweDI4LCAgMHgxNiwgIDB4ZmUsICAweGY2LCAgMHgwNCwgIDB4MTQsICAweDJjLCAgMHgwMSwgIDB4MzMsICAweDhmLCAgMHhmZSwKKyAgMHg2NiwgIDB4MDIsICAweDAyLCAgMHhkMSwgIDB4ZWIsICAweDJhLCAgMHg2NywgIDB4MWEsICAweGZlLCAgMHg2NywgIDB4MWIsICAweGY4LCAgMHhmNywgIDB4ZmUsICAweDQ4LCAgMHgxYywKKyAgMHg3MCwgIDB4MDEsICAweDZlLCAgMHg4NywgIDB4MGEsICAweDQwLCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4MTYsICAweGQzLCAgMHgwYSwgIDB4Y2EsICAweDAxLCAgMHgwZSwKKyAgMHg3NCwgIDB4NjAsICAweDU5LCAgMHg3NiwgIDB4MjcsICAweDA1LCAgMHg2YiwgIDB4MjgsICAweGZlLCAgMHgxMCwgIDB4MTIsICAweDE0LCAgMHgyYywgIDB4MDEsICAweDMzLCAgMHg4ZiwKKyAgMHhmZSwgIDB4NjYsICAweDAyLCAgMHgwMiwgIDB4ZDEsICAweGJjLCAgMHg3ZCwgIDB4YmQsICAweDdmLCAgMHgyNSwgIDB4MjIsICAweDY1LCAgMHhmZSwgIDB4M2MsICAweDA0LCAgMHgxZiwKKyAgMHhmZSwgIDB4MzgsICAweDA0LCAgMHg2OCwgIDB4ZmUsICAweGEwLCAgMHgwMCwgIDB4ZmUsICAweDliLCAgMHg1NywgIDB4ZmUsICAweDRlLCAgMHgxMiwgIDB4MmIsICAweGZmLCAgMHgwMiwKKyAgMHgwMCwgIDB4MTAsICAweDAxLCAgMHgwOCwgIDB4MWYsICAweGZlLCAgMHhlMCwgIDB4MDQsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHgyMiwgIDB4MzAsICAweDJlLCAgMHhkNSwKKyAgMHhmZSwgIDB4NGMsICAweDQ0LCAgMHhmZSwgIDB4NGMsICAweDEyLCAgMHg2MCwgIDB4ZmUsICAweDQ0LCAgMHg0OCwgIDB4MTMsICAweDJjLCAgMHhmZSwgIDB4NGMsICAweDU0LCAgMHg2NCwKKyAgMHhkMywgIDB4NDYsICAweDc2LCAgMHgyNywgIDB4ZmEsICAweGVmLCAgMHhmZSwgIDB4NjIsICAweDEzLCAgMHgwOSwgIDB4MDQsICAweDFkLCAgMHhmZSwgIDB4MmEsICAweDEzLCAgMHgyZiwKKyAgMHgwNywgIDB4N2UsICAweGE1LCAgMHhmZSwgIDB4MjAsICAweDEwLCAgMHgxMywgIDB4MmMsICAweGZlLCAgMHg0YywgIDB4NTQsICAweDY0LCAgMHhkMywgIDB4ZmEsICAweGVmLCAgMHg4NiwKKyAgMHgwOSwgIDB4MDQsICAweDFkLCAgMHhmZSwgIDB4MDgsICAweDEzLCAgMHgyZiwgIDB4MDcsICAweDdlLCAgMHg2ZSwgIDB4MDksICAweDA0LCAgMHgxZCwgIDB4ZmUsICAweDFjLCAgMHgxMiwKKyAgMHgxNCwgIDB4OTIsICAweDA5LCAgMHgwNCwgIDB4MDYsICAweDNiLCAgMHgxNCwgIDB4YzQsICAweDAxLCAgMHgzMywgIDB4OGYsICAweGZlLCAgMHg3MCwgIDB4MGMsICAweDAyLCAgMHgyMiwKKyAgMHgyYiwgIDB4MTEsICAweGZlLCAgMHhlNiwgIDB4MDAsICAweGZlLCAgMHgxYywgIDB4OTAsICAweGY5LCAgMHgwMywgIDB4MTQsICAweDkyLCAgMHgwMSwgIDB4MzMsICAweDAyLCAgMHgyOSwKKyAgMHhmZSwgIDB4NDIsICAweDViLCAgMHg2NywgIDB4MWEsICAweGZlLCAgMHg0NiwgIDB4NTksICAweGY4LCAgMHhmNywgIDB4ZmUsICAweDg3LCAgMHg4MCwgIDB4ZmUsICAweDMxLCAgMHhlNCwKKyAgMHg0ZiwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDc4LCAgMHgxMywgIDB4ZmUsICAweDIwLCAgMHg4MCwgIDB4MDcsICAweDFhLCAgMHhmZSwgIDB4NzAsICAweDEyLCAgMHg0OSwKKyAgMHgwNCwgIDB4MDYsICAweGZlLCAgMHg2MCwgIDB4MTMsICAweDA1LCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgyOCwgIDB4MTYsICAweGZlLCAgMHg4MCwgIDB4MDUsICAweGZlLCAgMHgzMSwKKyAgMHhlNCwgIDB4NmEsICAweDQ5LCAgMHgwNCwgIDB4MGIsICAweGZlLCAgMHg0YSwgIDB4MTMsICAweDA1LCAgMHhmZSwgIDB4YTAsICAweDAwLCAgMHgyOCwgIDB4ZmUsICAweDQyLCAgMHgxMiwKKyAgMHg1ZSwgIDB4MDEsICAweDA4LCAgMHgyNSwgIDB4MzIsICAweGYxLCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHhmZSwgIDB4OTgsICAweDA1LCAgMHgxMSwgIDB4ZmUsICAweGUzLCAgMHgwMCwKKyAgMHgyMywgIDB4NDksICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHg2YSwgIDB4MDUsICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHg2NCwgIDB4MDUsICAweDgzLCAgMHgyNCwKKyAgMHhmZSwgIDB4MjEsICAweDAwLCAgMHhhMSwgIDB4MjQsICAweGZlLCAgMHgyMiwgIDB4MDAsICAweGEwLCAgMHgyNCwgIDB4NGMsICAweGZlLCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwOCwKKyAgMHgyNiwgIDB4ZmUsICAweDk4LCAgMHgwNSwgIDB4ZmUsICAweGUyLCAgMHgwOCwgIDB4NDksICAweDA0LCAgMHhjNSwgIDB4M2IsICAweDAxLCAgMHg4NiwgIDB4MjQsICAweDA2LCAgMHgxMiwKKyAgMHhjYywgIDB4MzcsICAweGZlLCAgMHgyNywgIDB4MDEsICAweDA5LCAgMHgwNCwgIDB4MWQsICAweGZlLCAgMHgyMiwgIDB4MTIsICAweDQ3LCAgMHgwMSwgIDB4YTcsICAweDE0LCAgMHg5MiwKKyAgMHgwOSwgIDB4MDQsICAweDA2LCAgMHgzYiwgIDB4MTQsICAweGM0LCAgMHgwMSwgIDB4MzMsICAweDhmLCAgMHhmZSwgIDB4NzAsICAweDBjLCAgMHgwMiwgIDB4MjIsICAweDA1LCAgMHhmZSwKKyAgMHg5YywgIDB4MDAsICAweDI4LCAgMHhmZSwgIDB4M2UsICAweDEyLCAgMHgwNSwgIDB4NTAsICAweDI4LCAgMHhmZSwgIDB4MzYsICAweDEzLCAgMHg0NywgIDB4MDEsICAweGE3LCAgMHgyNiwKKyAgMHhmZSwgIDB4MDgsICAweDA2LCAgMHgwYSwgIDB4MDYsICAweDQ5LCAgMHgwNCwgIDB4MTksICAweGZlLCAgMHgwMiwgIDB4MTIsICAweDVmLCAgMHgwMSwgIDB4ZmUsICAweGFhLCAgMHgxNCwKKyAgMHgxZiwgIDB4ZmUsICAweGZlLCAgMHgwNSwgIDB4MTEsICAweDlhLCAgMHgwMSwgIDB4NDMsICAweDExLCAgMHhmZSwgIDB4ZTUsICAweDAwLCAgMHgwNSwgIDB4NTAsICAweGI0LCAgMHgwYywKKyAgMHg1MCwgIDB4MDUsICAweGM2LCAgMHgyOCwgIDB4ZmUsICAweDYyLCAgMHgxMiwgIDB4MDUsICAweDNmLCAgMHgyOCwgIDB4ZmUsICAweDVhLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHgxNCwKKyAgMHgxOCwgIDB4MDEsICAweGZlLCAgMHg2NiwgIDB4MTgsICAweGZlLCAgMHg0MywgIDB4NDgsICAweGI3LCAgMHgxOSwgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywKKyAgMHg0OCwgIDB4OGIsICAweDFjLCAgMHgzZCwgIDB4ODUsICAweGI3LCAgMHg2OSwgIDB4NDcsICAweDAxLCAgMHhhNywgIDB4MjYsICAweGZlLCAgMHg3MiwgIDB4MDYsICAweDQ5LCAgMHgwNCwKKyAgMHgxYiwgIDB4ZGYsICAweDg5LCAgMHgwYSwgIDB4NGQsICAweDAxLCAgMHhmZSwgIDB4ZDgsICAweDE0LCAgMHgxZiwgIDB4ZmUsICAweDY4LCAgMHgwNiwgIDB4MTEsICAweDlhLCAgMHgwMSwKKyAgMHg0MywgIDB4MTEsICAweGZlLCAgMHhlNSwgIDB4MDAsICAweDA1LCAgMHgzZiwgIDB4YjQsICAweDBjLCAgMHgzZiwgIDB4MTcsICAweDA2LCAgMHgwMSwgIDB4YTcsICAweGVjLCAgMHg3MiwKKyAgMHg3MCwgIDB4MDEsICAweDZlLCAgMHg4NywgIDB4MTEsICAweGZlLCAgMHhlMiwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MjUsICAweDMyLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwKKyAgMHhhNiwgIDB4MDYsICAweDhjLCAgMHhmZSwgIDB4NWMsICAweDA3LCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4NjQsICAweDA3LCAgMHg4ZCwgIDB4ODEsICAweDAyLCAgMHgyMiwKKyAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwgIDB4MmUsICAweDEyLCAgMHgxNSwgIDB4MWEsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwKKyAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHhmZSwgIDB4OTksICAweGE0LCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDIsICAweGZlLCAgMHgzMiwKKyAgMHgwOCwgIDB4NjEsICAweDA0LCAgMHgxYiwgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MDksICAweDA0LCAgMHgxYiwgIDB4NmUsICAweDE1LCAgMHhmZSwgIDB4MWIsICAweDAwLCAgMHgwMSwKKyAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgxNSwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDA2LCAgMHgwMSwKKyAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMiwgIDB4ZDksICAweDY2LCAgMHg0YywgIDB4ZmUsICAweDNhLCAgMHg1NSwgIDB4NWYsICAweGZlLCAgMHg5YSwgIDB4ODEsICAweDRiLCAgMHgxZCwKKyAgMHhiYSwgIDB4ZmUsICAweDMyLCAgMHgwNywgIDB4MGEsICAweDFkLCAgMHhmZSwgIDB4MDksICAweDZmLCAgMHhhZiwgIDB4ZmUsICAweGNhLCAgMHg0NSwgIDB4ZmUsICAweDMyLCAgMHgxMiwKKyAgMHg2MiwgIDB4MmMsICAweDg1LCAgMHg2NiwgIDB4N2IsICAweDAxLCAgMHgwOCwgIDB4MjUsICAweDMyLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4MzIsICAweDA3LCAgMHg4ZCwKKyAgMHg4MSwgIDB4OGMsICAweGZlLCAgMHg1YywgIDB4MDcsICAweDAyLCAgMHgyMiwgIDB4MDEsICAweDQzLCAgMHgwMiwgIDB4ZmUsICAweDhhLCAgMHgwNiwgIDB4MTUsICAweDE5LCAgMHgwMiwKKyAgMHhmZSwgIDB4OGEsICAweDA2LCAgMHhmZSwgIDB4OWMsICAweGY3LCAgMHhkNCwgIDB4ZmUsICAweDJjLCAgMHg5MCwgIDB4ZmUsICAweGFlLCAgMHg5MCwgIDB4NzcsICAweGZlLCAgMHhjYSwKKyAgMHgwNywgIDB4MGMsICAweDU0LCAgMHgxOCwgIDB4NTUsICAweDA5LCAgMHg0YSwgIDB4NmEsICAweDM1LCAgMHgxZSwgIDB4MjAsICAweDA3LCAgMHgxMCwgIDB4ZmUsICAweDBlLCAgMHgxMiwKKyAgMHg3NCwgIDB4ZmUsICAweDgwLCAgMHg4MCwgIDB4MzcsICAweDIwLCAgMHg2MywgIDB4MjcsICAweGZlLCAgMHgwNiwgIDB4MTAsICAweGZlLCAgMHg4MywgIDB4ZTcsICAweGM0LCAgMHhhMSwKKyAgMHhmZSwgIDB4MDMsICAweDQwLCAgMHgwOSwgIDB4NGEsICAweDRmLCAgMHgzNSwgIDB4MDEsICAweGE4LCAgMHhhZCwgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MTIsICAweDU4LCAgMHgwMSwKKyAgMHhhNSwgIDB4ZmUsICAweDA4LCAgMHg1MCwgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4ZmUsICAweDQ0LCAgMHg1MSwgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ODMsICAweGZiLCAgMHhmZSwKKyAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1MiwgIDB4MTgsICAweDUzLCAgMHhmZSwgIDB4MGMsICAweDkwLCAgMHhmZSwgIDB4OGUsICAweDkwLCAgMHhmZSwgIDB4NDAsICAweDUwLCAgMHhmZSwKKyAgMHhjMiwgIDB4NTAsICAweDBjLCAgMHgzOSwgIDB4MTgsICAweDNhLCAgMHhmZSwgIDB4NGEsICAweDEwLCAgMHgwOSwgIDB4MDQsICAweDZhLCAgMHhmZSwgIDB4MmEsICAweDEyLCAgMHhmZSwKKyAgMHgyYywgIDB4OTAsICAweGZlLCAgMHhhZSwgIDB4OTAsICAweDBjLCAgMHg1NCwgIDB4MTgsICAweDU1LCAgMHgwOSwgIDB4MDQsICAweDRmLCAgMHg4NSwgIDB4MDEsICAweGE4LCAgMHhmZSwKKyAgMHgxZiwgIDB4ODAsICAweDEyLCAgMHg1OCwgIDB4ZmUsICAweDQ0LCAgMHg5MCwgIDB4ZmUsICAweGM2LCAgMHg5MCwgIDB4MGMsICAweDU2LCAgMHgxOCwgIDB4NTcsICAweGZiLCAgMHhmZSwKKyAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1MiwgIDB4MTgsICAweDUzLCAgMHhmZSwgIDB4NDAsICAweDkwLCAgMHhmZSwgIDB4YzIsICAweDkwLCAgMHgwYywgIDB4MzksICAweDE4LCAgMHgzYSwKKyAgMHgwYywgIDB4MzgsICAweDE4LCAgMHg0ZSwgIDB4MDksICAweDRhLCAgMHgxOSwgIDB4MzUsICAweDJhLCAgMHgxMywgIDB4ZmUsICAweDRlLCAgMHgxMSwgIDB4NjUsICAweGZlLCAgMHg0OCwKKyAgMHgwOCwgIDB4ZmUsICAweDllLCAgMHhmMCwgIDB4ZmUsICAweDVjLCAgMHgwOCwgIDB4YjEsICAweDE2LCAgMHgzMiwgIDB4MmEsICAweDczLCAgMHhkZCwgIDB4YjgsICAweGZlLCAgMHg4MCwKKyAgMHgwOCwgIDB4YjksICAweGZlLCAgMHg5ZSwgIDB4MDgsICAweDhjLCAgMHhmZSwgIDB4NzQsICAweDA4LCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4N2EsICAweDA4LCAgMHg4ZCwKKyAgMHg4MSwgIDB4MDIsICAweDIyLCAgMHgwMSwgIDB4NDMsICAweGZlLCAgMHhjOSwgIDB4MTAsICAweDE1LCAgMHgxOSwgIDB4ZmUsICAweGM5LCAgMHgxMCwgIDB4NjEsICAweDA0LCAgMHgwNiwKKyAgMHhmZSwgIDB4MTAsICAweDEyLCAgMHg2MSwgIDB4MDQsICAweDBiLCAgMHg0NSwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDY4LCAgMHgxMiwgIDB4ZmUsICAweDJlLCAgMHgxYywKKyAgMHgwMiwgIDB4ZmUsICAweDI0LCAgMHgwYSwgIDB4NjEsICAweDA0LCAgMHgwNiwgIDB4NDUsICAweDYxLCAgMHgwNCwgIDB4MGIsICAweGZlLCAgMHg1MiwgIDB4MTIsICAweGZlLCAgMHgyYywKKyAgMHgxYywgIDB4ZmUsICAweGFhLCAgMHhmMCwgIDB4ZmUsICAweDFlLCAgMHgwOSwgIDB4ZmUsICAweGFjLCAgMHhmMCwgIDB4ZmUsICAweGJlLCAgMHgwOCwgIDB4ZmUsICAweDhhLCAgMHgxMCwKKyAgMHhhYSwgIDB4ZmUsICAweGYzLCAgMHgxMCwgIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweGNhLCAgMHgwOCwgIDB4MDIsICAweGZlLCAgMHgyNCwgIDB4MGEsICAweGFiLCAgMHhmZSwKKyAgMHhlNywgIDB4MTAsICAweGZlLCAgMHgyYiwgIDB4ZjAsICAweDlkLCAgMHhlOSwgIDB4MWMsICAweGZlLCAgMHgwMCwgIDB4ZmUsICAweGZlLCAgMHgxYywgIDB4MTIsICAweGI1LCAgMHhmZSwKKyAgMHhkMiwgIDB4ZjAsICAweDlkLCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgxYywgIDB4MWEsICAweDE2LCAgMHg5ZCwgIDB4MDUsICAweGNiLCAgMHgxYywgIDB4MDYsICAweDE2LCAgMHg5ZCwKKyAgMHhiOCwgIDB4NmQsICAweGI5LCAgMHg2ZCwgIDB4YWEsICAweGFiLCAgMHhmZSwgIDB4YjEsICAweDEwLCAgMHg3MCwgIDB4NWUsICAweDJiLCAgMHgxNCwgIDB4OTIsICAweDAxLCAgMHgzMywKKyAgMHgwZiwgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NWEsICAweDBmLCAgMHg3YywgIDB4MDIsICAweDVhLCAgMHhmZSwgIDB4NzQsICAweDE4LCAgMHgxYywKKyAgMHhmZSwgIDB4MDAsICAweGY4LCAgMHgxNiwgIDB4NmQsICAweDY3LCAgMHgxYiwgIDB4MDEsICAweGZlLCAgMHg0NCwgIDB4MGQsICAweDNiLCAgMHgwMSwgIDB4ZTYsICAweDFlLCAgMHgyNywKKyAgMHg3NCwgIDB4NjcsICAweDFhLCAgMHgwMiwgIDB4NmQsICAweDA5LCAgMHgwNCwgIDB4MGIsICAweDIxLCAgMHhmZSwgIDB4MDYsICAweDBhLCAgMHgwOSwgIDB4MDQsICAweDZhLCAgMHhmZSwKKyAgMHg4MiwgIDB4MTIsICAweDA5LCAgMHgwNCwgIDB4MTksICAweGZlLCAgMHg2NiwgIDB4MTMsICAweDFlLCAgMHg1OCwgIDB4YWMsICAweGZjLCAgMHhmZSwgIDB4ODMsICAweDgwLCAgMHhmZSwKKyAgMHhjOCwgIDB4NDQsICAweGZlLCAgMHgyZSwgIDB4MTMsICAweGZlLCAgMHgwNCwgIDB4OTEsICAweGZlLCAgMHg4NiwgIDB4OTEsICAweDYzLCAgMHgyNywgIDB4ZmUsICAweDQwLCAgMHg1OSwKKyAgMHhmZSwgIDB4YzEsICAweDU5LCAgMHg3NywgIDB4ZDcsICAweDA1LCAgMHg1NCwgIDB4MzEsICAweDU1LCAgMHgwYywgIDB4N2IsICAweDE4LCAgMHg3YywgIDB4YmUsICAweDU0LCAgMHhiZiwKKyAgMHg1NSwgIDB4MDEsICAweGE4LCAgMHhhZCwgIDB4NjMsICAweDI3LCAgMHgxMiwgIDB4NTgsICAweGMwLCAgMHgzOCwgIDB4YzEsICAweDRlLCAgMHg3OSwgIDB4NTYsICAweDY4LCAgMHg1NywKKyAgMHhmNCwgIDB4ZjUsICAweGZlLCAgMHgwNCwgIDB4ZmEsICAweDM4LCAgMHhmZSwgIDB4MDUsICAweGZhLCAgMHg0ZSwgIDB4MDEsICAweGE1LCAgMHhhMiwgIDB4MjMsICAweDBjLCAgMHg3YiwKKyAgMHgwYywgIDB4N2MsICAweDc5LCAgMHg1NiwgIDB4NjgsICAweDU3LCAgMHhmZSwgIDB4MTIsICAweDEwLCAgMHgwOSwgIDB4MDQsICAweDE5LCAgMHgxNiwgIDB4ZDcsICAweDc5LCAgMHgzOSwKKyAgMHg2OCwgIDB4M2EsICAweDA5LCAgMHgwNCwgIDB4ZmUsICAweGY3LCAgMHgwMCwgIDB4MzUsICAweDA1LCAgMHg1MiwgIDB4MzEsICAweDUzLCAgMHhmZSwgIDB4MTAsICAweDU4LCAgMHhmZSwKKyAgMHg5MSwgIDB4NTgsICAweGZlLCAgMHgxNCwgIDB4NTksICAweGZlLCAgMHg5NSwgIDB4NTksICAweDAyLCAgMHg2ZCwgIDB4MDksICAweDA0LCAgMHgxOSwgIDB4MTYsICAweGQ3LCAgMHgwOSwKKyAgMHgwNCwgIDB4ZmUsICAweGY3LCAgMHgwMCwgIDB4MzUsICAweGZlLCAgMHgzYSwgIDB4NTUsICAweGZlLCAgMHgxOSwgIDB4ODEsICAweDVmLCAgMHhmZSwgIDB4MTAsICAweDkwLCAgMHhmZSwKKyAgMHg5MiwgIDB4OTAsICAweGZlLCAgMHhkNywgIDB4MTAsICAweDJmLCAgMHgwNywgIDB4OWIsICAweDE2LCAgMHhmZSwgIDB4YzYsICAweDA4LCAgMHgxMSwgIDB4OWIsICAweDA5LCAgMHgwNCwKKyAgMHgwYiwgIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDUsICAweDM5LCAgMHgzMSwgIDB4M2EsICAweDc3LCAgMHhmZSwgIDB4YzYsICAweDA4LCAgMHhmZSwgIDB4MGMsICAweDU4LCAgMHhmZSwKKyAgMHg4ZCwgIDB4NTgsICAweDAyLCAgMHg2ZCwgIDB4MjMsICAweDQ3LCAgMHhmZSwgIDB4MTksICAweDgwLCAgMHhkZSwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDFhLCAgMHgxMiwKKyAgMHhmZSwgIDB4NmMsICAweDE5LCAgMHhmZSwgIDB4MTksICAweDQxLCAgMHhlOSwgIDB4YjUsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGQ5LCAgMHgxNCwgIDB4N2EsICAweDAxLCAgMHgzMywKKyAgMHgwZiwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4ZmUsICAweDhlLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4YmUsICAweDM5LCAgMHhmZSwgIDB4ZWQsICAweDE5LCAgMHhiZiwKKyAgMHgzYSwgIDB4ZmUsICAweDBjLCAgMHg1MSwgIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZTksICAweDFjLCAgMHhmZSwgIDB4MDAsICAweGZmLCAgMHgzNCwgIDB4ZmUsICAweDc0LCAgMHgxMCwKKyAgMHhiNSwgIDB4ZmUsICAweGQyLCAgMHhmMCwgIDB4ZmUsICAweGIyLCAgMHgwYSwgIDB4ZmUsICAweDc2LCAgMHgxOCwgIDB4MWMsICAweDFhLCAgMHg4NCwgIDB4MDUsICAweGNiLCAgMHgxYywKKyAgMHgwNiwgIDB4ZmUsICAweDA4LCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxNiwgIDB4MDAsICAweDAyLCAgMHg1YSwgIDB4ZmUsICAweGQxLCAgMHhmMCwgIDB4ZmUsICAweGM0LCAgMHgwYSwKKyAgMHgxNCwgIDB4N2EsICAweDAxLCAgMHgzMywgIDB4MGYsICAweGZlLCAgMHgxNywgIDB4MDAsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHhjZSwgIDB4ZjAsICAweGZlLCAgMHhjYSwKKyAgMHgwYSwgIDB4ZmUsICAweDNjLCAgMHgxMCwgIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGQ2LCAgMHgwYSwgIDB4MGYsICAweGZlLCAgMHgyMiwgIDB4MDAsICAweDAyLCAgMHg1YSwKKyAgMHhmZSwgIDB4Y2IsICAweGYwLCAgMHhmZSwgIDB4ZTIsICAweDBhLCAgMHgwZiwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHhmZSwgIDB4ZDAsICAweGYwLCAgMHhmZSwKKyAgMHhlYywgIDB4MGEsICAweDBmLCAgMHg5MywgIDB4ZGMsICAweGZlLCAgMHhjZiwgIDB4ZjAsICAweGZlLCAgMHhmNiwgIDB4MGEsICAweDBmLCAgMHg0YywgIDB4ZmUsICAweDEwLCAgMHgxMCwKKyAgMHhmZSwgIDB4Y2MsICAweGYwLCAgMHhkOSwgIDB4NjEsICAweDA0LCAgMHgxOSwgIDB4M2IsICAweDBmLCAgMHhmZSwgIDB4MTIsICAweDAwLCAgMHgyYSwgIDB4MTMsICAweGZlLCAgMHg0ZSwKKyAgMHgxMSwgIDB4NjUsICAweGZlLCAgMHgwYywgIDB4MGIsICAweGZlLCAgMHg5ZSwgIDB4ZjAsICAweGZlLCAgMHgyMCwgIDB4MGIsICAweGIxLCAgMHgxNiwgIDB4MzIsICAweDJhLCAgMHg3MywKKyAgMHhkZCwgIDB4YjgsICAweDIyLCAgMHhiOSwgIDB4MjIsICAweDJhLCAgMHhlYywgIDB4NjUsICAweGZlLCAgMHgyYywgIDB4MGIsICAweDI1LCAgMHgzMiwgIDB4OGMsICAweGZlLCAgMHg0OCwKKyAgMHgwYiwgIDB4OGQsICAweDgxLCAgMHhiOCwgIDB4ZDQsICAweGI5LCAgMHhkNCwgIDB4MDIsICAweDIyLCAgMHgwMSwgIDB4NDMsICAweGZlLCAgMHhkYiwgIDB4MTAsICAweDExLCAgMHhmZSwKKyAgMHhlOCwgIDB4MDAsICAweGFhLCAgMHhhYiwgIDB4NzAsICAweGJjLCAgMHg3ZCwgIDB4YmQsICAweDdmLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyMiwgIDB4MzAsICAweDJlLCAgMHhkOCwKKyAgMHhiYywgIDB4N2QsICAweGJkLCAgMHg3ZiwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4MjIsICAweDMwLCAgMHgyZSwgIDB4ZDYsICAweGIxLCAgMHg0NSwgIDB4MGYsICAweGZlLCAgMHg0MiwKKyAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHg3OCwgIDB4MDYsICAweGZlLCAgMHg4MSwgIDB4NDksICAweDE2LCAgMHhmZSwgIDB4MzgsICAweDBjLCAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwKKyAgMHg0NCwgIDB4MTMsICAweDBmLCAgMHgwMCwgIDB4NGIsICAweDBiLCAgMHhmZSwgIDB4NTQsICAweDEyLCAgMHg0YiwgIDB4ZmUsICAweDI4LCAgMHgwMCwgIDB4MjEsICAweGZlLCAgMHhhNiwKKyAgMHgwYywgIDB4MGEsICAweDQwLCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NWQsICAweDNlLCAgMHhmZSwgIDB4MjgsICAweDAwLCAgMHhmZSwgIDB4ZTIsICAweDEwLCAgMHgwMSwKKyAgMHhlNywgIDB4MDEsICAweGU4LCAgMHgwYSwgIDB4OTksICAweDAxLCAgMHhmZSwgIDB4MzIsICAweDBlLCAgMHg1OSwgIDB4MTEsICAweDJkLCAgMHgwMSwgIDB4NmYsICAweDAyLCAgMHgyOSwKKyAgMHgwZiwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4NGIsICAweDBiLCAgMHhkZiwgIDB4M2UsICAweDBiLCAgMHhmZSwgIDB4YjQsICAweDEwLCAgMHgwMSwgIDB4ODYsICAweDNlLCAgMHgwYiwKKyAgMHhmZSwgIDB4YWEsICAweDEwLCAgMHgwMSwgIDB4ODYsICAweGZlLCAgMHgxOSwgIDB4ODIsICAweGZlLCAgMHgzNCwgIDB4NDYsICAweGEzLCAgMHgzZSwgIDB4MGIsICAweDBmLCAgMHhmZSwKKyAgMHg0MywgIDB4MDAsICAweGZlLCAgMHg5NiwgIDB4MTAsICAweDA5LCAgMHg0YSwgIDB4MGIsICAweDM1LCAgMHgwMSwgIDB4ZTcsICAweDAxLCAgMHhlOCwgIDB4NTksICAweDExLCAgMHgyZCwKKyAgMHgwMSwgIDB4NmYsICAweDY3LCAgMHgwYiwgIDB4NTksICAweDNjLCAgMHg4YSwgIDB4MDIsICAweGZlLCAgMHgyYSwgIDB4MDMsICAweDA5LCAgMHgwNCwgIDB4MGIsICAweDg0LCAgMHgzZSwKKyAgMHgwYiwgIDB4MGYsICAweDAwLCAgMHhmZSwgIDB4NWMsICAweDEwLCAgMHg2MSwgIDB4MDQsICAweDFiLCAgMHhmZSwgIDB4NTgsICAweDEyLCAgMHgwOSwgIDB4MDQsICAweDFiLCAgMHhmZSwKKyAgMHg1MCwgIDB4MTMsICAweGZlLCAgMHgxYywgIDB4MWMsICAweGZlLCAgMHg5ZCwgIDB4ZjAsICAweGZlLCAgMHg1YywgIDB4MGMsICAweGZlLCAgMHgxYywgIDB4MWMsICAweGZlLCAgMHg5ZCwKKyAgMHhmMCwgIDB4ZmUsICAweDYyLCAgMHgwYywgIDB4MDksICAweDRhLCAgMHgxYiwgIDB4MzUsICAweGZlLCAgMHhhOSwgIDB4MTAsICAweDBmLCAgMHhmZSwgIDB4MTUsICAweDAwLCAgMHhmZSwKKyAgMHgwNCwgIDB4ZTYsICAweDBiLCAgMHg1ZiwgIDB4NWMsICAweDBmLCAgMHhmZSwgIDB4MTMsICAweDAwLCAgMHhmZSwgIDB4MTAsICAweDEwLCAgMHgwZiwgIDB4ZmUsICAweDQ3LCAgMHgwMCwKKyAgMHhhMSwgIDB4MGYsICAweGZlLCAgMHg0MSwgIDB4MDAsICAweGEwLCAgMHgwZiwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4ODcsICAweGFhLCAgMHhhYiwgIDB4NzAsICAweDA1LCAgMHg2YiwKKyAgMHgyOCwgIDB4MjEsICAweGQxLCAgMHg1ZiwgIDB4ZmUsICAweDA0LCAgMHhlNiwgIDB4MWIsICAweGZlLCAgMHg5ZCwgIDB4NDEsICAweGZlLCAgMHgxYywgIDB4NDIsICAweDU5LCAgMHgwMSwKKyAgMHhkYSwgIDB4MDIsICAweDI5LCAgMHhlYSwgIDB4MTQsICAweDBiLCAgMHgzNywgIDB4OTUsICAweGE5LCAgMHgxNCwgIDB4ZmUsICAweDMxLCAgMHgwMCwgIDB4MzcsICAweDk3LCAgMHgwMSwKKyAgMHhmZSwgIDB4NTQsICAweDBmLCAgMHgwMiwgIDB4ZDAsICAweDNjLCAgMHhmZSwgIDB4MDYsICAweGVjLCAgMHhjOSwgIDB4ZWUsICAweDNlLCAgMHgxZCwgIDB4ZmUsICAweGNlLCAgMHg0NSwKKyAgMHgzNCwgIDB4M2MsICAweGZlLCAgMHgwNiwgIDB4ZWEsICAweGM5LCAgMHhmZSwgIDB4NDcsICAweDRiLCAgMHg4OSwgIDB4ZmUsICAweDc1LCAgMHg1NywgIDB4MDUsICAweDUxLCAgMHhmZSwKKyAgMHg5OCwgIDB4NTYsICAweGZlLCAgMHgzOCwgIDB4MTIsICAweDBhLCAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDQsICAweDQ4LCAgMHg0NiwgIDB4MDksICAweDA0LCAgMHgxZCwKKyAgMHhmZSwgIDB4MWEsICAweDEzLCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4NDcsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDBhLCAgMHg5OSwgIDB4MDEsICAweDBlLCAgMHhmZSwKKyAgMHg0OSwgIDB4NTQsICAweDhlLCAgMHhmZSwgIDB4MmEsICAweDBkLCAgMHgwMiwgIDB4ZmUsICAweDJhLCAgMHgwMywgIDB4MGEsICAweDUxLCAgMHhmZSwgIDB4ZWUsICAweDE0LCAgMHhlZSwKKyAgMHgzZSwgIDB4MWQsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDM0LCAgMHgzYywgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGFkLCAgMHgxMywgIDB4MDIsICAweDI5LCAgMHgxZSwKKyAgMHgyMCwgIDB4MDcsICAweDEwLCAgMHhmZSwgIDB4OWUsICAweDEyLCAgMHgyMywgIDB4MTIsICAweDRkLCAgMHgxMiwgIDB4OTQsICAweDEyLCAgMHhjZSwgIDB4MWUsICAweDJkLCAgMHg0NywKKyAgMHgzNywgIDB4MmQsICAweGIxLCAgMHhlMCwgIDB4ZmUsICAweGJjLCAgMHhmMCwgIDB4ZmUsICAweGVjLCAgMHgwZCwgIDB4MTMsICAweDA2LCAgMHgxMiwgIDB4NGQsICAweDAxLCAgMHhmZSwKKyAgMHhlMiwgIDB4MTUsICAweDA1LCAgMHhmZSwgIDB4MzgsICAweDAxLCAgMHgzMSwgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4NzcsICAweGZlLCAgMHhmMCwgIDB4MGQsICAweGZlLCAgMHgwMiwKKyAgMHhlYywgIDB4Y2UsICAweDYyLCAgMHgwMCwgIDB4NWQsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDIwLCAgMHg0NiwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZmUsICAweDM0LCAgMHgwMSwKKyAgMHgwMSwgIDB4ZmUsICAweDUyLCAgMHgxNiwgIDB4ZmIsICAweGZlLCAgMHg0OCwgIDB4ZjQsICAweDBkLCAgMHhmZSwgIDB4MTgsICAweDEzLCAgMHhhZiwgIDB4ZmUsICAweDAyLCAgMHhlYSwKKyAgMHhjZSwgIDB4NjIsICAweDdhLCAgMHhmZSwgIDB4YzUsICAweDEzLCAgMHgxNCwgIDB4MWIsICAweDM3LCAgMHg5NSwgIDB4YTksICAweDVjLCAgMHgwNSwgIDB4ZmUsICAweDM4LCAgMHgwMSwKKyAgMHgxYywgIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MGMsICAweGZlLCAgMHg2MCwgIDB4MDEsICAweDA1LCAgMHhmZSwgIDB4M2EsICAweDAxLCAgMHgwYywgIDB4ZmUsICAweDYyLCAgMHgwMSwKKyAgMHgzZCwgIDB4MTIsICAweDIwLCAgMHgyNCwgIDB4MDYsICAweDEyLCAgMHgyZCwgIDB4MTEsICAweDJkLCAgMHg4YSwgIDB4MTMsICAweDA2LCAgMHgwMywgIDB4MjMsICAweDAzLCAgMHgxZSwKKyAgMHg0ZCwgIDB4ZmUsICAweGY3LCAgMHgxMiwgIDB4MWUsICAweDk0LCAgMHhhYywgIDB4MTIsICAweDk0LCAgMHgwNywgIDB4N2EsICAweGZlLCAgMHg3MSwgIDB4MTMsICAweGZlLCAgMHgyNCwKKyAgMHgxYywgIDB4MTQsICAweDFhLCAgMHgzNywgIDB4OTUsICAweGE5LCAgMHhmZSwgIDB4ZDksICAweDEwLCAgMHhiNiwgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsICAweDczLCAgMHg1NywKKyAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwMywgIDB4YjYsICAweGZlLCAgMHgwMywgIDB4ZGMsICAweGZlLCAgMHg1YiwgIDB4NTcsICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDAzLCAgMHhmZSwKKyAgMHgwMywgIDB4NTcsICAweGI2LCAgMHgyMywgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4MDMsICAweGZlLCAgMHgwMywgIDB4NTcsICAweGI2LCAgMHg3NSwgIDB4MDMsICAweDA5LCAgMHgwNCwKKyAgMHg0YywgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHg4MCwgIDB4MDcsICAweDA2LCAgMHhmZSwgIDB4MWEsICAweDEzLCAgMHhmZSwgIDB4MWUsICAweDgwLCAgMHhlMSwKKyAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHhhNCwgIDB4ZmUsICAweDBjLCAgMHg5MCwgIDB4ZmUsICAweDBlLCAgMHgxMywgIDB4ZmUsICAweDBlLCAgMHg5MCwgIDB4YTMsICAweGZlLCAgMHgzYywKKyAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MGIsICAweGZlLCAgMHgzYywgIDB4NTAsICAweGEwLCAgMHgwMSwgIDB4ZmUsICAweDgyLCAgMHgxNiwgIDB4MmYsICAweDA3LCAgMHgyZCwKKyAgMHhlMCwgIDB4MDEsICAweGZlLCAgMHhiYywgIDB4MTUsICAweDA5LCAgMHgwNCwgIDB4MWQsICAweDQ1LCAgMHgwMSwgIDB4ZTcsICAweDAxLCAgMHhlOCwgIDB4MTEsICAweGZlLCAgMHhlOSwKKyAgMHgwMCwgIDB4MDksICAweDA0LCAgMHg0YywgIDB4ZmUsICAweDJjLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHgxNCwgIDB4MTYsICAweGZlLCAgMHgxZSwgIDB4MWMsICAweGZlLCAgMHgxNCwKKyAgMHg5MCwgIDB4ZmUsICAweDk2LCAgMHg5MCwgIDB4MGMsICAweGZlLCAgMHg2NCwgIDB4MDEsICAweDE4LCAgMHhmZSwgIDB4NjYsICAweDAxLCAgMHgwOSwgIDB4MDQsICAweDRmLCAgMHhmZSwKKyAgMHgxMiwgIDB4MTIsICAweGZlLCAgMHgwMywgIDB4ODAsICAweDc0LCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHgyMCwgIDB4ZmUsICAweDgwLCAgMHg0MCwgIDB4MTIsICAweDIwLCAgMHg2MywKKyAgMHgyNywgIDB4MTEsICAweGM4LCAgMHg1OSwgIDB4MWUsICAweDIwLCAgMHhlZCwgIDB4NzYsICAweDIwLCAgMHgwMywgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4MDUsICAweGZlLCAgMHhhYywKKyAgMHgwMCwgIDB4ZmUsICAweDA2LCAgMHg1OCwgIDB4MDUsICAweGZlLCAgMHhhZSwgIDB4MDAsICAweGZlLCAgMHgwNywgIDB4NTgsICAweDA1LCAgMHhmZSwgIDB4YjAsICAweDAwLCAgMHhmZSwKKyAgMHgwOCwgIDB4NTgsICAweDA1LCAgMHhmZSwgIDB4YjIsICAweDAwLCAgMHhmZSwgIDB4MDksICAweDU4LCAgMHhmZSwgIDB4MGEsICAweDFjLCAgMHgyNCwgIDB4NjksICAweDEyLCAgMHhjOSwKKyAgMHgyMywgIDB4MGMsICAweDUwLCAgMHgwYywgIDB4M2YsICAweDEzLCAgMHg0MCwgIDB4NDgsICAweDVmLCAgMHgxNywgIDB4MWQsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLCAgMHg5MSwKKyAgMHg1NCwgIDB4MjEsICAweGZlLCAgMHgwOCwgIDB4MGYsICAweDNlLCAgMHgxMCwgIDB4MTMsICAweDQyLCAgMHg0OCwgIDB4MTcsICAweDRjLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwKKyAgMHg5MSwgIDB4NTQsICAweDIxLCAgMHhmZSwgIDB4MWUsICAweDBmLCAgMHgyNCwgIDB4MTAsICAweDEyLCAgMHgyMCwgIDB4NzgsICAweDJjLCAgMHg0NiwgIDB4MWUsICAweDIwLCAgMHhlZCwKKyAgMHg3NiwgIDB4MjAsICAweDExLCAgMHhjOCwgIDB4ZjYsICAweGZlLCAgMHhkNiwgIDB4ZjAsICAweGZlLCAgMHgzMiwgIDB4MGYsICAweGVhLCAgMHg3MCwgIDB4ZmUsICAweDE0LCAgMHgxYywKKyAgMHhmZSwgIDB4MTAsICAweDFjLCAgMHhmZSwgIDB4MTgsICAweDFjLCAgMHgwMywgIDB4M2MsICAweGZlLCAgMHgwYywgIDB4MTQsICAweGVlLCAgMHhmZSwgIDB4MDcsICAweGU2LCAgMHgxZCwKKyAgMHhmZSwgIDB4Y2UsICAweDQ3LCAgMHhmZSwgIDB4ZjUsICAweDEzLCAgMHgwMywgIDB4MDEsICAweDg2LCAgMHg3OCwgIDB4MmMsICAweDQ2LCAgMHhmYSwgIDB4ZWYsICAweGZlLCAgMHg0MiwKKyAgMHgxMywgIDB4MmYsICAweDA3LCAgMHgyZCwgIDB4ZmUsICAweDM0LCAgMHgxMywgIDB4MGEsICAweDQyLCAgMHgwMSwgIDB4MGUsICAweGIwLCAgMHhmZSwgIDB4MzYsICAweDEyLCAgMHhmMCwKKyAgMHhmZSwgIDB4NDUsICAweDQ4LCAgMHgwMSwgIDB4ZTMsICAweGZlLCAgMHgwMCwgIDB4Y2MsICAweGIwLCAgMHhmZSwgIDB4ZjMsICAweDEzLCAgMHgzZCwgIDB4NzUsICAweDA3LCAgMHgxMCwKKyAgMHhhMywgIDB4MGEsICAweDgwLCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg4MCwgIDB4NWMsICAweDAxLCAgMHg2ZiwgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDdlLCAgMHg0NSwKKyAgMHhmNiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDZjLCAgMHgwZiwgIDB4MDMsICAweGZlLCAgMHg0NCwgIDB4NTgsICAweDc0LCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHg5NywKKyAgMHhmZSwgIDB4OWUsICAweDQwLCAgMHhmZSwgIDB4OWQsICAweGU3LCAgMHgwMCwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MWIsICAweDc2LCAgMHgyNywgIDB4MDEsICAweGRhLCAgMHhmZSwKKyAgMHhkZCwgIDB4MTAsICAweDJhLCAgMHhiYywgIDB4N2QsICAweGJkLCAgMHg3ZiwgIDB4MzAsICAweDJlLCAgMHhkNSwgIDB4MDcsICAweDFiLCAgMHhmZSwgIDB4NDgsICAweDEyLCAgMHgwNywKKyAgMHgwYiwgIDB4ZmUsICAweDU2LCAgMHgxMiwgIDB4MDcsICAweDFhLCAgMHhmZSwgIDB4MzAsICAweDEyLCAgMHgwNywgIDB4YzIsICAweDE2LCAgMHhmZSwgIDB4M2UsICAweDExLCAgMHgwNywKKyAgMHhmZSwgIDB4MjMsICAweDAwLCAgMHgxNiwgIDB4ZmUsICAweDRhLCAgMHgxMSwgIDB4MDcsICAweDA2LCAgMHgxNiwgIDB4ZmUsICAweGE4LCAgMHgxMSwgIDB4MDcsICAweDE5LCAgMHhmZSwKKyAgMHgxMiwgIDB4MTIsICAweDA3LCAgMHgwMCwgIDB4MTYsICAweDIyLCAgMHgxNCwgIDB4YzIsICAweDAxLCAgMHgzMywgIDB4OWYsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDhjLCAgMHg0MywKKyAgMHgwMywgIDB4MmIsICAweGZlLCAgMHg2MiwgIDB4MDgsICAweDBhLCAgMHhjYSwgIDB4MDEsICAweGZlLCAgMHgzMiwgIDB4MGUsICAweDExLCAgMHg3ZSwgIDB4MDIsICAweDI5LCAgMHgyYiwKKyAgMHgyZiwgIDB4MDcsICAweDliLCAgMHhmZSwgIDB4ZDksICAweDEzLCAgMHg3OSwgIDB4MzksICAweDY4LCAgMHgzYSwgIDB4NzcsICAweGZlLCAgMHhmYywgIDB4MTAsICAweDA5LCAgMHgwNCwKKyAgMHg2YSwgIDB4ZmUsICAweDcyLCAgMHgxMiwgIDB4YzAsICAweDM4LCAgMHhjMSwgIDB4NGUsICAweGY0LCAgMHhmNSwgIDB4OGUsICAweGZlLCAgMHhjNiwgIDB4MTAsICAweDFlLCAgMHg1OCwKKyAgMHhmZSwgIDB4MjYsICAweDEzLCAgMHgwNSwgIDB4N2IsICAweDMxLCAgMHg3YywgIDB4NzcsICAweGZlLCAgMHg4MiwgIDB4MGMsICAweDBjLCAgMHg1NCwgIDB4MTgsICAweDU1LCAgMHgyMywKKyAgMHgwYywgIDB4N2IsICAweDBjLCAgMHg3YywgIDB4MDEsICAweGE4LCAgMHgyNCwgIDB4NjksICAweDczLCAgMHgxMiwgIDB4NTgsICAweDAxLCAgMHhhNSwgIDB4YzAsICAweDM4LCAgMHhjMSwKKyAgMHg0ZSwgIDB4ZmUsICAweDA0LCAgMHg1NSwgIDB4ZmUsICAweGE1LCAgMHg1NSwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4MzgsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDRlLCAgMHhmZSwKKyAgMHg5MSwgIDB4MTAsICAweDA1LCAgMHg1NiwgIDB4MzEsICAweDU3LCAgMHhmZSwgIDB4NDAsICAweDU2LCAgMHhmZSwgIDB4ZTEsICAweDU2LCAgMHgwYywgIDB4NTYsICAweDE4LCAgMHg1NywKKyAgMHg4MywgIDB4YzAsICAweDM4LCAgMHhjMSwgIDB4NGUsICAweGY0LCAgMHhmNSwgIDB4MDUsICAweDUyLCAgMHgzMSwgIDB4NTMsICAweGZlLCAgMHgwMCwgIDB4NTYsICAweGZlLCAgMHhhMSwKKyAgMHg1NiwgIDB4MGMsICAweDUyLCAgMHgxOCwgIDB4NTMsICAweDA5LCAgMHgwNCwgIDB4NmEsICAweGZlLCAgMHgxZSwgIDB4MTIsICAweDFlLCAgMHg1OCwgIDB4ZmUsICAweDFmLCAgMHg0MCwKKyAgMHgwNSwgIDB4NTQsICAweDMxLCAgMHg1NSwgIDB4ZmUsICAweDJjLCAgMHg1MCwgIDB4ZmUsICAweGFlLCAgMHg1MCwgIDB4MDUsICAweDU2LCAgMHgzMSwgIDB4NTcsICAweGZlLCAgMHg0NCwKKyAgMHg1MCwgIDB4ZmUsICAweGM2LCAgMHg1MCwgIDB4MDUsICAweDUyLCAgMHgzMSwgIDB4NTMsICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweDA1LCAgMHgzOSwKKyAgMHgzMSwgIDB4M2EsICAweGZlLCAgMHg0MCwgIDB4NTAsICAweGZlLCAgMHhjMiwgIDB4NTAsICAweDAyLCAgMHg1YywgIDB4MjQsICAweDA2LCAgMHgxMiwgIDB4Y2QsICAweDAyLCAgMHg1YiwKKyAgMHgyYiwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4NDQsICAweDMwLCAgMHgyZSwgIDB4ZDUsICAweDA3LCAgMHgwNiwgIDB4MjEsICAweDQ0LCAgMHgyZiwgIDB4MDcsICAweDliLCAgMHgyMSwKKyAgMHg1YiwgIDB4MDEsICAweDZlLCAgMHgxYywgIDB4M2QsICAweDE2LCAgMHg0NCwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ZTIsICAweDc5LCAgMHgzOSwgIDB4NjgsICAweDNhLCAgMHhmZSwKKyAgMHgwYSwgIDB4NTUsICAweDM0LCAgMHhmZSwgIDB4OGIsICAweDU1LCAgMHhiZSwgIDB4MzksICAweGJmLCAgMHgzYSwgIDB4ZmUsICAweDBjLCAgMHg1MSwgIDB4ZmUsICAweDhlLCAgMHg1MSwKKyAgMHgwMiwgIDB4NWIsICAweGZlLCAgMHgxOSwgIDB4ODEsICAweGFmLCAgMHhmZSwgIDB4MTksICAweDQxLCAgMHgwMiwgIDB4NWIsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDI1LCAgMHgzMiwKKyAgMHgxZiwgIDB4YTIsICAweDMwLCAgMHgyZSwgIDB4ZDgsICAweDRiLCAgMHgxYSwgIDB4ZmUsICAweGE2LCAgMHgxMiwgIDB4NGIsICAweDBiLCAgMHgzYiwgIDB4MDIsICAweDQ0LCAgMHgwMSwKKyAgMHgwOCwgIDB4MjUsICAweDMyLCAgMHgxZiwgIDB4YTIsICAweDMwLCAgMHgyZSwgIDB4ZDYsICAweDA3LCAgMHgxYSwgIDB4MjEsICAweDQ0LCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHhhMiwKKyAgMHgzMCwgIDB4MmUsICAweGZlLCAgMHhlOCwgIDB4MDksICAweGZlLCAgMHhjMiwgIDB4NDksICAweDYwLCAgMHgwNSwgIDB4ZmUsICAweDljLCAgMHgwMCwgIDB4MjgsICAweDg0LCAgMHg0OSwKKyAgMHgwNCwgIDB4MTksICAweDM0LCAgMHg5ZiwgIDB4ZmUsICAweGJiLCAgMHg0NSwgIDB4NGIsICAweDAwLCAgMHg0NSwgIDB4M2UsICAweDA2LCAgMHg3OCwgIDB4M2QsICAweGZlLCAgMHhkYSwKKyAgMHgxNCwgIDB4MDEsICAweDZlLCAgMHg4NywgIDB4ZmUsICAweDRiLCAgMHg0NSwgIDB4ZTIsICAweDJmLCAgMHgwNywgIDB4OWEsICAweGUxLCAgMHgwNSwgIDB4YzYsICAweDI4LCAgMHg4NCwKKyAgMHgwNSwgIDB4M2YsICAweDI4LCAgMHgzNCwgIDB4NWUsICAweDAyLCAgMHg1YiwgIDB4ZmUsICAweGMwLCAgMHg1ZCwgIDB4ZmUsICAweGY4LCAgMHgxNCwgIDB4ZmUsICAweDAzLCAgMHgxNywKKyAgMHgwNSwgIDB4NTAsICAweGI0LCAgMHgwYywgIDB4NTAsICAweDVlLCAgMHgyYiwgIDB4MDEsICAweDA4LCAgMHgyNiwgIDB4NWMsICAweDAxLCAgMHhmZSwgIDB4YWEsICAweDE0LCAgMHgwMiwKKyAgMHg1YywgIDB4MDEsICAweDA4LCAgMHgyNSwgIDB4MzIsICAweDFmLCAgMHg0NCwgIDB4MzAsICAweDJlLCAgMHhkNiwgIDB4MDcsICAweDA2LCAgMHgyMSwgIDB4NDQsICAweDAxLCAgMHhmZSwKKyAgMHg4ZSwgIDB4MTMsICAweGZlLCAgMHg0MiwgIDB4NTgsICAweGZlLCAgMHg4MiwgIDB4MTQsICAweGZlLCAgMHhhNCwgIDB4MTQsICAweDg3LCAgMHhmZSwgIDB4NGEsICAweGY0LCAgMHgwYiwKKyAgMHgxNiwgIDB4NDQsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDA2LCAgMHhmZSwgIDB4MGMsICAweDEyLCAgMHgyZiwgIDB4MDcsICAweDlhLCAgMHg4NSwgIDB4MDIsICAweDViLCAgMHgwNSwKKyAgMHgzZiwgIDB4YjQsICAweDBjLCAgMHgzZiwgIDB4NWUsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHg1YywgIDB4MDEsICAweGZlLCAgMHhkOCwgIDB4MTQsICAweDAyLCAgMHg1YywKKyAgMHgxMywgIDB4MDYsICAweDY1LCAgMHhmZSwgIDB4Y2EsICAweDEyLCAgMHgyNiwgIDB4ZmUsICAweGUwLCAgMHgxMiwgIDB4NzIsICAweGYxLCAgMHgwMSwgIDB4MDgsICAweDIzLCAgMHg3MiwKKyAgMHgwMywgIDB4OGYsICAweGZlLCAgMHhkYywgIDB4MTIsICAweDI1LCAgMHhmZSwgIDB4ZGMsICAweDEyLCAgMHgxZiwgIDB4ZmUsICAweGNhLCAgMHgxMiwgIDB4NWUsICAweDJiLCAgMHgwMSwKKyAgMHgwOCwgIDB4ZmUsICAweGQ1LCAgMHgxMCwgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLCAgMHgxYywgIDB4ZmUsICAweGZmLCAgMHg3ZiwKKyAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwMywgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLCAgMHgxYywKKyAgMHgzZCwgIDB4ZmUsICAweDMwLCAgMHg1NiwgIDB4ZmUsICAweDAwLCAgMHg1YywgIDB4MDMsICAweDEzLCAgMHg2YywgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDQ4LCAgMHg4YiwKKyAgMHgwMywgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLCAgMHhmZSwgIDB4MGIsICAweDU4LCAgMHgwMywgIDB4MGEsICAweDUwLCAgMHgwMSwKKyAgMHg4MiwgIDB4MGEsICAweDNmLCAgMHgwMSwgIDB4ODIsICAweDAzLCAgMHhmYywgIDB4MWMsICAweDEwLCAgMHhmZiwgIDB4MDMsICAweDAwLCAgMHg1NCwgIDB4ZmUsICAweDAwLCAgMHhmNCwKKyAgMHgxOSwgIDB4NDgsICAweGZlLCAgMHgwMCwgIDB4N2QsICAweGZlLCAgMHgwMSwgIDB4N2QsICAweGZlLCAgMHgwMiwgIDB4N2QsICAweGZlLCAgMHgwMywgIDB4N2MsICAweDYzLCAgMHgyNywKKyAgMHgwYywgIDB4NTIsICAweDE4LCAgMHg1MywgIDB4YmUsICAweDU2LCAgMHhiZiwgIDB4NTcsICAweDAzLCAgMHhmZSwgIDB4NjIsICAweDA4LCAgMHhmZSwgIDB4ODIsICAweDRhLCAgMHhmZSwKKyAgMHhlMSwgIDB4MWEsICAweGZlLCAgMHg4MywgIDB4NWEsICAweDc0LCAgMHgwMywgIDB4MDEsICAweGZlLCAgMHgxNCwgIDB4MTgsICAweGZlLCAgMHg0MiwgIDB4NDgsICAweDVmLCAgMHg2MCwKKyAgMHg4OSwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4ZmUsICAweGEyLCAgMHgxNCwgIDB4MzAsICAweDJlLCAgMHhkOCwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4ZmUsICAweGEyLCAgMHgxNCwKKyAgMHgzMCwgIDB4MmUsICAweGZlLCAgMHhlOCwgIDB4MGEsICAweGZlLCAgMHhjMSwgIDB4NTksICAweDA1LCAgMHhjNiwgIDB4MjgsICAweGZlLCAgMHhjYywgIDB4MTIsICAweDQ5LCAgMHgwNCwKKyAgMHgxYiwgIDB4ZmUsICAweGM0LCAgMHgxMywgIDB4MjMsICAweDYyLCAgMHgxYiwgIDB4ZTIsICAweDRiLCAgMHhjMywgIDB4NjQsICAweGZlLCAgMHhlOCwgIDB4MTMsICAweDNiLCAgMHgxMywKKyAgMHgwNiwgIDB4MTcsICAweGMzLCAgMHg3OCwgIDB4ZGIsICAweGZlLCAgMHg3OCwgIDB4MTAsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHhhMSwgIDB4ZmYsICAweDAyLCAgMHg4MywKKyAgMHg1NSwgIDB4NjIsICAweDFhLCAgMHhhNCwgIDB4YmIsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDhlLCAgMHhlNCwgIDB4MTcsICAweDJjLCAgMHgxMywgIDB4MDYsICAweGZlLCAgMHg1NiwKKyAgMHgxMCwgIDB4NjIsICAweDBiLCAgMHhlMSwgIDB4YmIsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweDhlLCAgMHhlNCwgIDB4MGEsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweDE3LCAgMHg5MywKKyAgMHgxMywgIDB4MDYsICAweGZlLCAgMHgyOCwgIDB4MTAsICAweDYyLCAgMHgwNiwgIDB4ZmUsICAweDYwLCAgMHgxMywgIDB4YmIsICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDhlLCAgMHhlNCwKKyAgMHgwYSwgIDB4ZmUsICAweGM4LCAgMHgwMCwgIDB4MTcsICAweDRkLCAgMHgxMywgIDB4MDYsICAweDgzLCAgMHhiYiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4YmEsICAweGZlLCAgMHg0ZSwKKyAgMHgxNCwgIDB4ODksICAweGZlLCAgMHgxMiwgIDB4MTAsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDk0LCAgMHhmZSwgIDB4NTYsICAweGYwLCAgMHhmZSwgIDB4NjAsICAweDE0LCAgMHhmZSwKKyAgMHgwNCwgIDB4ZjQsICAweDZjLCAgMHhmZSwgIDB4NDMsICAweGY0LCAgMHg5MywgIDB4ZmUsICAweGYzLCAgMHgxMCwgIDB4ZjksICAweDAxLCAgMHhmZSwgIDB4MjIsICAweDEzLCAgMHgxYywKKyAgMHgzZCwgIDB4ZmUsICAweDEwLCAgMHgxMywgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwgIDB4NjksICAweGJhLCAgMHhmZSwgIDB4OWMsICAweDE0LCAgMHhiNywKKyAgMHg2OSwgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwgIDB4MTksICAweGJhLCAgMHhmZSwgIDB4OWMsICAweDE0LCAgMHhiNywKKyAgMHgxOSwgIDB4ODMsICAweDYwLCAgMHgyMywgIDB4ZmUsICAweDRkLCAgMHhmNCwgIDB4MDAsICAweGRmLCAgMHg4OSwgIDB4MTMsICAweDA2LCAgMHhmZSwgIDB4YjQsICAweDU2LCAgMHhmZSwKKyAgMHhjMywgIDB4NTgsICAweDAzLCAgMHg2MCwgIDB4MTMsICAweDBiLCAgMHgwMywgIDB4MTUsICAweDA2LCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHhlNSwgIDB4MTUsICAweDBiLCAgMHgwMSwKKyAgMHgwOCwgIDB4MjYsICAweGU1LCAgMHgxNSwgIDB4MWEsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGU1LCAgMHg3MiwgIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgwMywKKyAgMHgxNSwgIDB4MDYsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGE2LCAgMHgxNSwgIDB4MWEsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGE2LCAgMHgxNSwgIDB4MDYsICAweDAxLCAgMHgwOCwKKyAgMHgyNiwgIDB4YTYsICAweGZlLCAgMHg4OSwgIDB4NDksICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGE2LCAgMHg3MiwgIDB4ZmUsICAweDg5LCAgMHg0YSwgIDB4MDEsICAweDA4LCAgMHgwMywKKyAgMHg2MCwgIDB4MDMsICAweDFlLCAgMHhjYywgIDB4MDcsICAweDA2LCAgMHhmZSwgIDB4NDQsICAweDEzLCAgMHhhZCwgIDB4MTIsICAweGNjLCAgMHhmZSwgIDB4NDksICAweGY0LCAgMHgwMCwKKyAgMHgzYiwgIDB4NzIsICAweDlmLCAgMHg1ZSwgIDB4ZmUsICAweDAxLCAgMHhlYywgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4ZjEsICAweDAxLCAgMHgwOCwgIDB4MmYsICAweDA3LCAgMHhmZSwKKyAgMHhlMywgIDB4MDAsICAweGZlLCAgMHgyMCwgIDB4MTMsICAweDFmLCAgMHhmZSwgIDB4NWEsICAweDE1LCAgMHgyMywgIDB4MTIsICAweGNkLCAgMHgwMSwgIDB4NDMsICAweDFlLCAgMHhjZCwKKyAgMHgwNywgIDB4MDYsICAweDQ1LCAgMHgwOSwgIDB4NGEsICAweDA2LCAgMHgzNSwgIDB4MDMsICAweDBhLCAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhlZCwgIDB4ODgsICAweDA3LCAgMHgxMCwKKyAgMHhhNCwgIDB4MGEsICAweDgwLCAgMHgwMSwgIDB4MGUsICAweDg4LCAgMHgwYSwgIDB4NTEsICAweDAxLCAgMHg5ZSwgIDB4MDMsICAweDBhLCAgMHg4MCwgIDB4MDEsICAweDBlLCAgMHg4OCwKKyAgMHhmZSwgIDB4ODAsICAweGU3LCAgMHgxMCwgIDB4MDcsICAweDEwLCAgMHg4NCwgIDB4ZmUsICAweDQ1LCAgMHg1OCwgIDB4MDEsICAweGUzLCAgMHg4OCwgIDB4MDMsICAweDBhLCAgMHg0MiwKKyAgMHgwMSwgIDB4MGUsICAweDg4LCAgMHgwYSwgIDB4NTEsICAweDAxLCAgMHg5ZSwgIDB4MDMsICAweDBhLCAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDgwLCAgMHhmMiwKKyAgMHhmZSwgIDB4NDksICAweGU0LCAgMHgxMCwgIDB4YTQsICAweDBhLCAgMHg4MCwgIDB4MDEsICAweDBlLCAgMHhmMiwgIDB4MGEsICAweDUxLCAgMHgwMSwgIDB4ODIsICAweDAzLCAgMHgxNywKKyAgMHgxMCwgIDB4NzEsICAweDY2LCAgMHhmZSwgIDB4NjAsICAweDAxLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MjQsICAweDFjLCAgMHhmZSwKKyAgMHgxZCwgIDB4ZjcsICAweDFkLCAgMHg5MCwgIDB4ZmUsICAweGY2LCAgMHgxNSwgIDB4MDEsICAweGZlLCAgMHhmYywgIDB4MTYsICAweGUwLCAgMHg5MSwgIDB4MWQsICAweDY2LCAgMHhmZSwKKyAgMHgyYywgIDB4MDEsICAweGZlLCAgMHgyZiwgIDB4MTksICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHhlNiwgIDB4MTUsICAweGZlLCAgMHhkYSwgIDB4MTAsICAweDE3LCAgMHgxMCwKKyAgMHg3MSwgIDB4MDUsICAweGZlLCAgMHg2NCwgIDB4MDEsICAweGZlLCAgMHgwMCwgIDB4ZjQsICAweDE5LCAgMHhmZSwgIDB4MTgsICAweDU4LCAgMHgwNSwgIDB4ZmUsICAweDY2LCAgMHgwMSwKKyAgMHhmZSwgIDB4MTksICAweDU4LCAgMHg5MSwgIDB4MTksICAweGZlLCAgMHgzYywgIDB4OTAsICAweGZlLCAgMHgzMCwgIDB4ZjQsICAweDA2LCAgMHhmZSwgIDB4M2MsICAweDUwLCAgMHg2NiwKKyAgMHhmZSwgIDB4MzgsICAweDAwLCAgMHhmZSwgIDB4MGYsICAweDc5LCAgMHhmZSwgIDB4MWMsICAweGY3LCAgMHgxOSwgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4MTYsICAweGZlLCAgMHhiNiwKKyAgMHgxNCwgIDB4MzQsICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHgxOCwgIDB4MTYsICAweGZlLCAgMHg5YywgIDB4MTAsICAweDE3LCAgMHgxMCwgIDB4NzEsICAweGZlLCAgMHg4MywKKyAgMHg1YSwgIDB4ZmUsICAweDE4LCAgMHhkZiwgIDB4ZmUsICAweDE5LCAgMHhkZSwgIDB4ZmUsICAweDFkLCAgMHhmNywgIDB4MzgsICAweDkwLCAgMHhmZSwgIDB4NjIsICAweDE2LCAgMHhmZSwKKyAgMHg5NCwgIDB4MTQsICAweGZlLCAgMHgxMCwgIDB4MTMsICAweDkxLCAgMHgzOCwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsICAweGU3LCAgMHgwMCwKKyAgMHgwMywgIDB4YWUsICAweDIxLCAgMHhmZSwgIDB4NTYsICAweDE2LCAgMHhmZSwgIDB4NmMsICAweDEwLCAgMHgxNywgIDB4MTAsICAweDcxLCAgMHhmZSwgIDB4MzAsICAweGJjLCAgMHhmZSwKKyAgMHhiMiwgIDB4YmMsICAweDkxLCAgMHhjNSwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4MGYsICAweDc5LCAgMHhmZSwgIDB4MWMsICAweGY3LCAgMHhjNSwgIDB4OTAsICAweGZlLCAgMHg5YSwKKyAgMHgxNiwgIDB4ZmUsICAweDVjLCAgMHgxNCwgIDB4MzQsICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHg4NiwgIDB4MTYsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHgwMiwKKyAgMHhmNiwgIDB4MTAsICAweDcxLCAgMHhmZSwgIDB4MTgsICAweGZlLCAgMHg1NCwgIDB4ZmUsICAweDE5LCAgMHhmZSwgIDB4NTUsICAweGZjLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg0ZiwKKyAgMHg5MCwgIDB4ZmUsICAweGMwLCAgMHgxNiwgIDB4ZmUsICAweDM2LCAgMHgxNCwgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4OTEsICAweDRmLCAgMHg0NywgIDB4ZmUsICAweDgzLCAgMHg1OCwKKyAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4ODAsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDgxLCAgMHhlNywgIDB4MTAsICAweDExLCAgMHhmZSwgIDB4ZGQsICAweDAwLCAgMHg2MywKKyAgMHgyNywgIDB4MDMsICAweDYzLCAgMHgyNywgIDB4ZmUsICAweDEyLCAgMHg0NSwgIDB4MjEsICAweGZlLCAgMHhiMCwgIDB4MTYsICAweDE0LCAgMHgwNiwgIDB4MzcsICAweDk1LCAgMHhhOSwKKyAgMHgwMiwgIDB4MjksICAweGZlLCAgMHgzOSwgIDB4ZjAsICAweGZlLCAgMHgwNCwgIDB4MTcsICAweDIzLCAgMHgwMywgIDB4ZmUsICAweDdlLCAgMHgxOCwgIDB4MWMsICAweDFhLCAgMHg1ZCwKKyAgMHgxMywgIDB4MGQsICAweDAzLCAgMHg3MSwgIDB4MDUsICAweGNiLCAgMHgxYywgIDB4MDYsICAweGZlLCAgMHhlZiwgIDB4MTIsICAweGZlLCAgMHhlMSwgIDB4MTAsICAweDc4LCAgMHgyYywKKyAgMHg0NiwgIDB4MmYsICAweDA3LCAgMHgyZCwgIDB4ZmUsICAweDNjLCAgMHgxMywgIDB4ZmUsICAweDgyLCAgMHgxNCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4M2MsICAweDhhLCAgMHgwYSwKKyAgMHg0MiwgIDB4MDEsICAweDBlLCAgMHhiMCwgIDB4ZmUsICAweDNlLCAgMHgxMiwgIDB4ZjAsICAweGZlLCAgMHg0NSwgIDB4NDgsICAweDAxLCAgMHhlMywgIDB4ZmUsICAweDAwLCAgMHhjYywKKyAgMHhiMCwgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4M2QsICAweDc1LCAgMHgwNywgIDB4MTAsICAweGEzLCAgMHgwYSwgIDB4ODAsICAweDAxLCAgMHgwZSwgIDB4ZjIsICAweDAxLCAgMHg2ZiwKKyAgMHhmZSwgIDB4MTYsICAweDEwLCAgMHgwNywgIDB4N2UsICAweDg1LCAgMHhmZSwgIDB4NDAsICAweDE0LCAgMHhmZSwgIDB4MjQsICAweDEyLCAgMHhmNiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwKKyAgMHhmZSwgIDB4MjQsICAweDE3LCAgMHgxNywgIDB4MGIsICAweDAzLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgwYiwgIDB4MGYsICAweGZlLCAgMHgxNSwgIDB4MDAsICAweDU5LCAgMHg3NiwKKyAgMHgyNywgIDB4MDEsICAweGRhLCAgMHgxNywgIDB4MDYsICAweDAzLCAgMHgzYywgIDB4OGEsICAweDA5LCAgMHg0YSwgIDB4MWQsICAweDM1LCAgMHgxMSwgIDB4MmQsICAweDAxLCAgMHg2ZiwKKyAgMHgxNywgIDB4MDYsICAweDAzLCAgMHhmZSwgIDB4MzgsICAweDkwLCAgMHhmZSwgIDB4YmEsICAweDkwLCAgMHg3OSwgIDB4YzcsICAweDY4LCAgMHhjOCwgIDB4ZmUsICAweDQ4LCAgMHg1NSwKKyAgMHgzNCwgIDB4ZmUsICAweGM5LCAgMHg1NSwgIDB4MDMsICAweDFlLCAgMHg5OCwgIDB4NzMsICAweDEyLCAgMHg5OCwgIDB4MDMsICAweDBhLCAgMHg5OSwgIDB4MDEsICAweDBlLCAgMHhmMCwKKyAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDQ5LCAgMHg0NCwgIDB4MTYsICAweGZlLCAgMHhmMCwgIDB4MTcsICAweDczLCAgMHg3NSwgIDB4MDMsICAweDBhLCAgMHg0MiwKKyAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgxMCwgIDB4NDUsICAweDBhLCAgMHg1MSwgIDB4MDEsICAweDllLCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4NzMsICAweDc1LCAgMHgwMywKKyAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHgxYSwgIDB4NjQsICAweGZlLCAgMHgyNCwgIDB4MTgsICAweDA1LCAgMHhmZSwgIDB4OTAsICAweDAwLCAgMHhmZSwgIDB4M2EsICAweDQ1LCAgMHg1YiwKKyAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhjMiwgIDB4NjQsICAweGZlLCAgMHgzNiwgIDB4MTgsICAweDA1LCAgMHhmZSwgIDB4OTIsICAweDAwLCAgMHhmZSwgIDB4MDIsICAweGU2LCAgMHgxYiwKKyAgMHhkYywgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4ZmUsICAweDBiLCAgMHgwMCwgIDB4NjQsICAweGZlLCAgMHg0OCwgIDB4MTgsICAweDA1LCAgMHhmZSwgIDB4OTQsICAweDAwLCAgMHhmZSwKKyAgMHgwMiwgIDB4ZTYsICAweDE5LCAgMHhmZSwgIDB4MDgsICAweDEwLCAgMHgwNSwgIDB4ZmUsICAweDk2LCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4MmMsICAweGZlLCAgMHg0ZSwKKyAgMHg0NSwgIDB4ZmUsICAweDBjLCAgMHgxMiwgIDB4YWYsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhkZSwgIDB4MWMsICAweDY5LCAgMHgwMywgIDB4MDcsICAweDdhLCAgMHhmZSwKKyAgMHg1YSwgIDB4ZjAsICAweGZlLCAgMHg3NCwgIDB4MTgsICAweDI0LCAgMHhmZSwgIDB4MDksICAweDAwLCAgMHhmZSwgIDB4MzQsICAweDEwLCAgMHgwNywgIDB4MWIsICAweGZlLCAgMHg1YSwKKyAgMHhmMCwgIDB4ZmUsICAweDgyLCAgMHgxOCwgIDB4MjQsICAweGMzLCAgMHhmZSwgIDB4MjYsICAweDEwLCAgMHgwNywgIDB4MWEsICAweDVkLCAgMHgyNCwgIDB4MmMsICAweGRjLCAgMHgwNywKKyAgMHgwYiwgIDB4NWQsICAweDI0LCAgMHg5MywgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDA2LCAgMHg1ZCwgIDB4MjQsICAweDRkLCAgMHg5ZiwgIDB4YWQsICAweDAzLCAgMHgxNCwKKyAgMHhmZSwgIDB4MDksICAweDAwLCAgMHgwMSwgIDB4MzMsICAweGZlLCAgMHgwNCwgIDB4ZmUsICAweDdkLCAgMHgwNSwgIDB4N2YsICAweGY5LCAgMHgwMywgIDB4MjUsICAweGZlLCAgMHhjYSwKKyAgMHgxOCwgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MDgsICAweDY1LCAgMHhmZSwgIDB4YzYsICAweDE4LCAgMHgwMywgIDB4ZmYsICAweDFhLCAgMHgwMCwgIDB4MDAsCit9OworCitTVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzNTUwX3NpemUgPQorICAgICAgICBzaXplb2YoX2Fkdl9hc2MzNTUwX2J1Zik7IC8qIDB4MTNBRCAqLworU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzU1MF9jaGtzdW0gPQorICAgICAgICAweDA0RDUyREREVUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCisKKy8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCitTVEFUSUMgdW5zaWduZWQgY2hhciBfYWR2X2FzYzM4QzA4MDBfYnVmW10gPSB7CisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4ZjIsICAweDAwLCAgMHhmMCwgIDB4MDAsICAweGZjLCAgMHgwMCwgIDB4MTYsICAweDE4LCAgMHhlNCwgIDB4MDEsICAweDAwLCAgMHg0OCwgIDB4ZTQsCisgIDB4MTgsICAweDgwLCAgMHgwMywgIDB4ZjYsICAweDAyLCAgMHgwMCwgIDB4Y2UsICAweDE5LCAgMHgwMCwgIDB4ZmEsICAweGZmLCAgMHhmZiwgIDB4MWMsICAweDBmLCAgMHgwMCwgIDB4ZjYsCisgIDB4OWUsICAweGU3LCAgMHhmZiwgIDB4MDAsICAweDgyLCAgMHhlNywgIDB4MDAsICAweGVhLCAgMHgwMSwgIDB4ZmEsICAweDAxLCAgMHhlNiwgIDB4MDksICAweGU3LCAgMHg1NSwgIDB4ZjAsCisgIDB4MDEsICAweGY2LCAgMHgwMywgIDB4MDAsICAweDA0LCAgMHgwMCwgIDB4MTAsICAweDAwLCAgMHgxZSwgIDB4ZjAsICAweDg1LCAgMHhmMCwgIDB4MTgsICAweGY0LCAgMHgwOCwgIDB4MDAsCisgIDB4YmMsICAweDAwLCAgMHgzOCwgIDB4NTQsICAweDAwLCAgMHhlYywgIDB4ZDUsICAweGYwLCAgMHg4MiwgIDB4MGQsICAweDAwLCAgMHhlNiwgIDB4ODYsICAweGYwLCAgMHhiMSwgIDB4ZjAsCisgIDB4OTgsICAweDU3LCAgMHgwMSwgIDB4ZmMsICAweGI0LCAgMHgwMCwgIDB4ZDQsICAweDAxLCAgMHgwYywgIDB4MWMsICAweDNlLCAgMHgxYywgIDB4M2MsICAweDAwLCAgMHhiYiwgIDB4MDAsCisgIDB4MDAsICAweDEwLCAgMHhiYSwgIDB4MTksICAweDAyLCAgMHg4MCwgIDB4MzIsICAweGYwLCAgMHg3YywgIDB4MGQsICAweDAyLCAgMHgxMywgIDB4YmEsICAweDEzLCAgMHgxOCwgIDB4NDAsCisgIDB4MDAsICAweDU3LCAgMHgwMSwgIDB4ZWEsICAweDAyLCAgMHhmYywgIDB4MDMsICAweGZjLCAgMHgzZSwgIDB4MDAsICAweDZjLCAgMHgwMSwgIDB4NmUsICAweDAxLCAgMHg3NCwgIDB4MDEsCisgIDB4NzYsICAweDAxLCAgMHhiOSwgIDB4NTQsICAweDNlLCAgMHg1NywgIDB4MDAsICAweDgwLCAgMHgwMywgIDB4ZTYsICAweGI2LCAgMHgwMCwgIDB4YzAsICAweDAwLCAgMHgwMSwgIDB4MDEsCisgIDB4M2UsICAweDAxLCAgMHg3YSwgIDB4MDEsICAweGNhLCAgMHgwOCwgIDB4Y2UsICAweDEwLCAgMHgxNiwgIDB4MTEsICAweDA0LCAgMHgxMiwgIDB4MDgsICAweDEyLCAgMHgwMiwgIDB4NGEsCisgIDB4YmIsICAweDU1LCAgMHgzYywgIDB4NTYsICAweDAzLCAgMHg1OCwgIDB4MWIsICAweDgwLCAgMHgzMCwgIDB4ZTQsICAweDRiLCAgMHhlNCwgIDB4NWQsICAweGYwLCAgMHgwMiwgIDB4ZmEsCisgIDB4MjAsICAweDAwLCAgMHgzMiwgIDB4MDAsICAweDQwLCAgMHgwMCwgIDB4ODAsICAweDAwLCAgMHgyNCwgIDB4MDEsICAweDNjLCAgMHgwMSwgIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsCisgIDB4NzAsICAweDAxLCAgMHg3MiwgIDB4MDEsICAweDc4LCAgMHgwMSwgIDB4N2MsICAweDAxLCAgMHg2MiwgIDB4MGEsICAweDg2LCAgMHgwZCwgIDB4MDYsICAweDEzLCAgMHg0YywgIDB4MWMsCisgIDB4MDQsICAweDgwLCAgMHg0YSwgIDB4ZTQsICAweDAyLCAgMHhlZSwgIDB4NWIsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDBjLCAgMHgwMCwgIDB4MGYsICAweDAwLCAgMHg0NywgIDB4MDAsCisgIDB4YmUsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweDIwLCAgMHgxMSwgIDB4NWMsICAweDE2LCAgMHgzMiwgIDB4MWMsICAweDM4LCAgMHgxYywgIDB4NGUsICAweDFjLCAgMHgxMCwgIDB4NDQsCisgIDB4MDAsICAweDRjLCAgMHgwNCwgIDB4ZWEsICAweDVjLCAgMHhmMCwgIDB4YTcsICAweGYwLCAgMHgwNCwgIDB4ZjYsICAweDAzLCAgMHhmYSwgIDB4MDUsICAweDAwLCAgMHgzNCwgIDB4MDAsCisgIDB4MzYsICAweDAwLCAgMHg5OCwgIDB4MDAsICAweGNjLCAgMHgwMCwgIDB4MjAsICAweDAxLCAgMHg0ZSwgIDB4MDEsICAweDRhLCAgMHgwYiwgIDB4NDIsICAweDBjLCAgMHgxMiwgIDB4MGYsCisgIDB4MGMsICAweDEwLCAgMHgyMiwgIDB4MTEsICAweDBhLCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHgzMCwgIDB4MWMsICAweDAyLCAgMHg0OCwgIDB4MDAsICAweDRlLCAgMHg0MiwgIDB4NTQsCisgIDB4NDQsICAweDU1LCAgMHhiZCwgIDB4NTYsICAweDA2LCAgMHg4MywgIDB4MDAsICAweGRjLCAgMHgwNSwgIDB4ZjAsICAweDA5LCAgMHhmMCwgIDB4NTksICAweGYwLCAgMHhiOCwgIDB4ZjAsCisgIDB4NGIsICAweGY0LCAgMHgwNiwgIDB4ZjcsICAweDBlLCAgMHhmNywgIDB4MDQsICAweGZjLCAgMHgwNSwgIDB4ZmMsICAweDA2LCAgMHgwMCwgIDB4MTksICAweDAwLCAgMHgzMywgIDB4MDAsCisgIDB4OWIsICAweDAwLCAgMHhhNCwgIDB4MDAsICAweGI1LCAgMHgwMCwgIDB4YmEsICAweDAwLCAgMHhkMCwgIDB4MDAsICAweGUxLCAgMHgwMCwgIDB4ZTcsICAweDAwLCAgMHhlMiwgIDB4MDMsCisgIDB4MDgsICAweDBmLCAgMHgwMiwgIDB4MTAsICAweDA0LCAgMHgxMCwgIDB4MGEsICAweDEwLCAgMHgwYSwgIDB4MTMsICAweDBjLCAgMHgxMywgIDB4MTIsICAweDEzLCAgMHgyNCwgIDB4MTQsCisgIDB4MzQsICAweDE0LCAgMHgwNCwgIDB4MTYsICAweDA4LCAgMHgxNiwgIDB4YTQsICAweDE3LCAgMHgyMCwgIDB4MWMsICAweDM0LCAgMHgxYywgIDB4MzYsICAweDFjLCAgMHgwOCwgIDB4NDQsCisgIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwgIDB4NDgsICAweDQ2LCAgMHgwMSwgIDB4NDgsICAweDY4LCAgMHg1NCwgIDB4M2EsICAweDU1LCAgMHg4MywgIDB4NTUsCisgIDB4ZTUsICAweDU1LCAgMHhiMCwgIDB4NTcsICAweDAxLCAgMHg1OCwgIDB4ODMsICAweDU5LCAgMHgwNSwgIDB4ZTYsICAweDBiLCAgMHhmMCwgIDB4MGMsICAweGYwLCAgMHgwNCwgIDB4ZjgsCisgIDB4MDUsICAweGY4LCAgMHgwNywgIDB4MDAsICAweDBhLCAgMHgwMCwgIDB4MWMsICAweDAwLCAgMHgxZSwgIDB4MDAsICAweDllLCAgMHgwMCwgIDB4YTgsICAweDAwLCAgMHhhYSwgIDB4MDAsCisgIDB4YjksICAweDAwLCAgMHhlMCwgIDB4MDAsICAweDIyLCAgMHgwMSwgIDB4MjYsICAweDAxLCAgMHg3OSwgIDB4MDEsICAweDdlLCAgMHgwMSwgIDB4YzQsICAweDAxLCAgMHhjNiwgIDB4MDEsCisgIDB4ODAsICAweDAyLCAgMHg1ZSwgIDB4MDMsICAweGVlLCAgMHgwNCwgIDB4OWEsICAweDA2LCAgMHhmOCwgIDB4MDcsICAweDYyLCAgMHgwOCwgIDB4NjgsICAweDA4LCAgMHg2OSwgIDB4MDgsCisgIDB4ZDYsICAweDA4LCAgMHhlOSwgIDB4MDksICAweGZhLCAgMHgwYiwgIDB4MmUsICAweDBmLCAgMHgxMiwgIDB4MTAsICAweDFhLCAgMHgxMCwgIDB4ZWQsICAweDEwLCAgMHhmMSwgIDB4MTAsCisgIDB4MmEsICAweDExLCAgMHgwNiwgIDB4MTIsICAweDBjLCAgMHgxMiwgIDB4M2UsICAweDEyLCAgMHgxMCwgIDB4MTMsICAweDE2LCAgMHgxMywgIDB4MWUsICAweDEzLCAgMHg0NiwgIDB4MTQsCisgIDB4NzYsICAweDE0LCAgMHg4MiwgIDB4MTQsICAweDM2LCAgMHgxNSwgIDB4Y2EsICAweDE1LCAgMHg2YiwgIDB4MTgsICAweGJlLCAgMHgxOCwgIDB4Y2EsICAweDE4LCAgMHhlNiwgIDB4MTksCisgIDB4MTIsICAweDFjLCAgMHg0NiwgIDB4MWMsICAweDljLCAgMHgzMiwgIDB4MDAsICAweDQwLCAgMHgwZSwgIDB4NDcsICAweGZlLCAgMHg5YywgIDB4ZjAsICAweDJiLCAgMHgwMiwgIDB4ZmUsCisgIDB4YWMsICAweDBkLCAgMHhmZiwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZDcsICAweGZlLCAgMHhlOCwgIDB4MTksICAweDAwLCAgMHhkNiwgIDB4ZmUsICAweDg0LCAgMHgwMSwgIDB4ZmYsCisgIDB4MDMsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDkzLCAgMHgxNSwgIDB4ZmUsICAweDBmLCAgMHgwNSwgIDB4ZmYsICAweDM4LCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg1NywgIDB4MjQsCisgIDB4MDAsICAweGZlLCAgMHg0YywgIDB4MDAsICAweDViLCAgMHhmZiwgIDB4MDQsICAweDAwLCAgMHgwMCwgIDB4MTEsICAweGZmLCAgMHgwOSwgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MDgsCisgIDB4MDEsICAweDAxLCAgMHhmZiwgIDB4MDgsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDI3LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgxMCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MTEsCisgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NzgsICAweDU2LCAgMHhmZSwgIDB4MzQsICAweDEyLCAgMHhmZiwgIDB4MjEsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4ZDYsCisgIDB4MmMsICAweDk5LCAgMHgwYSwgIDB4MDEsICAweGZlLCAgMHhjMiwgIDB4MGYsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGQ2LCAgMHg5OSwgIDB4MGEsICAweDQyLCAgMHgyYywgIDB4ZmUsCisgIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MDYsICAweDAyLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhhNywgIDB4ZmUsICAweDkxLCAgMHhmMCwgIDB4ZmUsICAweGY0LCAgMHgwMSwgIDB4ZmUsCisgIDB4OTAsICAweGYwLCAgMHhmZSwgIDB4ZjQsICAweDAxLCAgMHhmZSwgIDB4OGYsICAweGYwLCAgMHhhNywgIDB4MDMsICAweDVkLCAgMHg0ZCwgIDB4MDIsICAweGZlLCAgMHhjOCwgIDB4MGQsCisgIDB4MDEsICAweGZlLCAgMHgzOCwgIDB4MGUsICAweGZlLCAgMHhkZCwgIDB4MTIsICAweGZlLCAgMHhmYywgIDB4MTAsICAweGZlLCAgMHgyOCwgIDB4MWMsICAweDAzLCAgMHhmZSwgIDB4YTYsCisgIDB4MDAsICAweGZlLCAgMHhkMywgIDB4MTIsICAweDQxLCAgMHgxNCwgIDB4ZmUsICAweGE2LCAgMHgwMCwgIDB4YzIsICAweGZlLCAgMHg0OCwgIDB4ZjAsICAweGZlLCAgMHg4YSwgIDB4MDIsCisgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweGE0LCAgMHgwMiwgIDB4ZmUsICAweDRhLCAgMHhmMCwgIDB4ZmUsICAweGMyLCAgMHgwMiwgIDB4ZmUsICAweDQ2LCAgMHhmMCwgIDB4ZmUsCisgIDB4NTQsICAweDAyLCAgMHhmZSwgIDB4NDcsICAweGYwLCAgMHhmZSwgIDB4NWEsICAweDAyLCAgMHhmZSwgIDB4NDMsICAweGYwLCAgMHhmZSwgIDB4NDgsICAweDAyLCAgMHhmZSwgIDB4NDQsCisgIDB4ZjAsICAweGZlLCAgMHg0YywgIDB4MDIsICAweGZlLCAgMHg0NSwgIDB4ZjAsICAweGZlLCAgMHg1MCwgIDB4MDIsICAweDE4LCAgMHgwYSwgIDB4YWEsICAweDE4LCAgMHgwNiwgIDB4MTQsCisgIDB4YTEsICAweDAyLCAgMHgyYiwgIDB4ZmUsICAweDAwLCAgMHgxYywgIDB4ZTcsICAweGZlLCAgMHgwMiwgIDB4MWMsICAweGU2LCAgMHhmZSwgIDB4MWUsICAweDFjLCAgMHhmZSwgIDB4ZTksCisgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4MTgsICAweDE4LCAgMHhmZSwgIDB4ZTcsICAweDEwLCAgMHhmZSwgIDB4MDYsICAweGZjLCAgMHhjZSwgIDB4MDksICAweDcwLCAgMHgwMSwgIDB4YTgsCisgIDB4MDIsICAweDJiLCAgMHgxNSwgIDB4NTksICAweDM5LCAgMHhhMiwgIDB4MDEsICAweGZlLCAgMHg1OCwgIDB4MTAsICAweDA5LCAgMHg3MCwgIDB4MDEsICAweDg3LCAgMHhmZSwgIDB4YmQsCisgIDB4MTAsICAweDA5LCAgMHg3MCwgIDB4MDEsICAweDg3LCAgMHhmZSwgIDB4YWQsICAweDEwLCAgMHhmZSwgIDB4MTYsICAweDFjLCAgMHhmZSwgIDB4NTgsICAweDFjLCAgMHgxOCwgIDB4MDYsCisgIDB4MTQsICAweGExLCAgMHgyYywgIDB4MWMsICAweDJiLCAgMHhmZSwgIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MDYsICAweDAyLCAgMHgyMywgIDB4ZmUsICAweDk4LCAgMHgwMiwgIDB4ZmUsCisgIDB4NWEsICAweDFjLCAgMHhmOCwgIDB4ZmUsICAweDE0LCAgMHgxYywgIDB4MTUsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDM5LCAgMHhhMiwgIDB4MDEsICAweGZlLCAgMHg0OCwgIDB4MTAsCisgIDB4MTgsICAweDA2LCAgMHgxNCwgIDB4YTEsICAweDAyLCAgMHhkNywgIDB4MjIsICAweDIwLCAgMHgwNywgIDB4MTEsICAweDM1LCAgMHhmZSwgIDB4NjksICAweDEwLCAgMHgxOCwgIDB4MDYsCisgIDB4MTQsICAweGExLCAgMHhmZSwgIDB4MDQsICAweGVjLCAgMHgyMCwgIDB4NGYsICAweDQzLCAgMHgxMywgIDB4MjAsICAweGZlLCAgMHgwNSwgIDB4ZjYsICAweGNlLCAgMHgwMSwgIDB4ZmUsCisgIDB4NGEsICAweDE3LCAgMHgwOCwgIDB4NTQsICAweDU4LCAgMHgzNywgIDB4MTIsICAweDJmLCAgMHg0MiwgIDB4OTIsICAweDAxLCAgMHhmZSwgIDB4ODIsICAweDE2LCAgMHgwMiwgIDB4MmIsCisgIDB4MDksICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NjYsICAweDAxLCAgMHg3MywgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MDksCisgIDB4YTQsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg1NCwgIDB4NmIsICAweGZlLCAgMHgxMCwgIDB4MDMsICAweDAxLCAgMHhmZSwgIDB4ODIsICAweDE2LCAgMHgwMiwgIDB4MmIsCisgIDB4MmMsICAweDRmLCAgMHhmZSwgIDB4MDIsICAweGU4LCAgMHgyYSwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDllLCAgMHg0MywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsCisgIDB4MjcsICAweGYwLCAgMHhmZSwgIDB4ZTAsICAweDAxLCAgMHhmZSwgIDB4MDcsICAweDRiLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhhNywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MWMsCisgIDB4ZDksICAweGZlLCAgMHgyNiwgIDB4ZjAsICAweGZlLCAgMHg1YSwgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg0OCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsCisgIDB4YTcsICAweGZlLCAgMHhlZiwgIDB4MTAsICAweGZlLCAgMHg5ZiwgIDB4ZjAsICAweGZlLCAgMHg2OCwgIDB4MDMsICAweGY5LCAgMHgxMCwgIDB4ZmUsICAweDExLCAgMHgwMCwgIDB4MDIsCisgIDB4NjUsICAweDJjLCAgMHhmZSwgIDB4NDgsICAweDFjLCAgMHhmOSwgIDB4MDgsICAweDA1LCAgMHgxYiwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4MjEsICAweDIyLCAgMHhhMywgIDB4YjcsCisgIDB4MTMsICAweGEzLCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4YjcsICAweDc4LCAgMHgwMSwgIDB4ZmUsICAweGI0LCAgMHgxNiwgIDB4MTIsICAweGQxLCAgMHgxYywgIDB4ZDksCisgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4ZDksICAweGZlLCAgMHg4MiwgIDB4ZjAsICAweGZlLCAgMHg5NiwgIDB4MDMsICAweGZhLCAgMHgxMiwgIDB4ZmUsICAweGU0LCAgMHgwMCwgIDB4MjcsCisgIDB4ZmUsICAweGE4LCAgMHgwMywgIDB4MWMsICAweDM0LCAgMHgxZCwgIDB4ZmUsICAweGI4LCAgMHgwMywgIDB4MDEsICAweDRiLCAgMHhmZSwgIDB4MDYsICAweGYwLCAgMHhmZSwgIDB4YzgsCisgIDB4MDMsICAweDk1LCAgMHg4NiwgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsICAweDhhLCAgMHgwNiwgIDB4MDIsICAweDI0LCAgMHgwMywgIDB4NzAsICAweDI4LCAgMHgxNywgIDB4ZmUsCisgIDB4ZmEsICAweDA0LCAgMHgxNSwgIDB4NmQsICAweDAxLCAgMHgzNiwgIDB4N2IsICAweGZlLCAgMHg2YSwgIDB4MDIsICAweDAyLCAgMHhkOCwgIDB4ZjksICAweDJjLCAgMHg5OSwgIDB4MTksCisgIDB4ZmUsICAweDY3LCAgMHgxYiwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4NzQsICAweDAxLCAgMHhhZiwgIDB4OGMsCisgIDB4MDksICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4MTcsICAweGRhLCAgMHgwOSwgIDB4ZDEsICAweDAxLCAgMHgwZSwgIDB4OGQsICAweDUxLCAgMHg2NCwgIDB4NzksCisgIDB4MmEsICAweDAzLCAgMHg3MCwgIDB4MjgsICAweGZlLCAgMHgxMCwgIDB4MTIsICAweDE1LCAgMHg2ZCwgIDB4MDEsICAweDM2LCAgMHg3YiwgIDB4ZmUsICAweDZhLCAgMHgwMiwgIDB4MDIsCisgIDB4ZDgsICAweGM3LCAgMHg4MSwgIDB4YzgsICAweDgzLCAgMHgxYywgIDB4MjQsICAweDI3LCAgMHhmZSwgIDB4NDAsICAweDA0LCAgMHgxZCwgIDB4ZmUsICAweDNjLCAgMHgwNCwgIDB4M2IsCisgIDB4ZmUsICAweGEwLCAgMHgwMCwgIDB4ZmUsICAweDliLCAgMHg1NywgIDB4ZmUsICAweDRlLCAgMHgxMiwgIDB4MmQsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgwMSwgIDB4MGIsCisgIDB4MWQsICAweGZlLCAgMHhlNCwgIDB4MDQsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDFkLCAgMHgyNCwgIDB4MzMsICAweDMxLCAgMHhkZSwgIDB4ZmUsICAweDRjLCAgMHg0NCwgIDB4ZmUsCisgIDB4NGMsICAweDEyLCAgMHg1MSwgIDB4ZmUsICAweDQ0LCAgMHg0OCwgIDB4MGYsICAweDZmLCAgMHhmZSwgIDB4NGMsICAweDU0LCAgMHg2YiwgIDB4ZGEsICAweDRmLCAgMHg3OSwgIDB4MmEsCisgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDYyLCAgMHgxMywgIDB4MDgsICAweDA1LCAgMHgxYiwgIDB4ZmUsICAweDJhLCAgMHgxMywgIDB4MzIsCisgIDB4MDcsICAweDgyLCAgMHhmZSwgIDB4NTIsICAweDEzLCAgMHhmZSwgIDB4MjAsICAweDEwLCAgMHgwZiwgIDB4NmYsICAweGZlLCAgMHg0YywgIDB4NTQsICAweDZiLCAgMHhkYSwgIDB4ZmUsCisgIDB4MDYsICAweDgwLCAgMHhmZSwgIDB4NDgsICAweDQ3LCAgMHhmZSwgIDB4NDAsICAweDEzLCAgMHgwOCwgIDB4MDUsICAweDFiLCAgMHhmZSwgIDB4MDgsICAweDEzLCAgMHgzMiwgIDB4MDcsCisgIDB4ODIsICAweGZlLCAgMHgzMCwgIDB4MTMsICAweDA4LCAgMHgwNSwgIDB4MWIsICAweGZlLCAgMHgxYywgIDB4MTIsICAweDE1LCAgMHg5ZCwgIDB4MDgsICAweDA1LCAgMHgwNiwgIDB4NGQsCisgIDB4MTUsICAweGZlLCAgMHgwZCwgIDB4MDAsICAweDAxLCAgMHgzNiwgIDB4N2IsICAweGZlLCAgMHg2NCwgIDB4MGQsICAweDAyLCAgMHgyNCwgIDB4MmQsICAweDEyLCAgMHhmZSwgIDB4ZTYsCisgIDB4MDAsICAweGZlLCAgMHgxYywgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4NWMsICAweDA0LCAgMHgxNSwgIDB4OWQsICAweDAxLCAgMHgzNiwgIDB4MDIsICAweDJiLCAgMHhmZSwgIDB4NDIsCisgIDB4NWIsICAweDk5LCAgMHgxOSwgIDB4ZmUsICAweDQ2LCAgMHg1OSwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDg3LCAgMHg4MCwgIDB4ZmUsCisgIDB4MzEsICAweGU0LCAgMHg1YiwgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDg0LCAgMHgxMywgIDB4ZmUsICAweDIwLCAgMHg4MCwgIDB4MDcsICAweDE5LCAgMHhmZSwgIDB4N2MsCisgIDB4MTIsICAweDUzLCAgMHgwNSwgIDB4MDYsICAweGZlLCAgMHg2YywgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgyOCwgIDB4MTcsICAweGZlLCAgMHg5MCwgIDB4MDUsCisgIDB4ZmUsICAweDMxLCAgMHhlNCwgIDB4NWEsICAweDUzLCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHg1NiwgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTAsICAweDAwLCAgMHgyOCwgIDB4ZmUsCisgIDB4NGUsICAweDEyLCAgMHg2NywgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDI3LCAgMHhmZSwgIDB4NDgsICAweDA1LCAgMHgxYywgIDB4MzQsICAweGZlLCAgMHg4OSwgIDB4NDgsCisgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDI3LCAgMHhmZSwgIDB4NTYsICAweDA1LCAgMHgyNiwgIDB4ZmUsICAweGE4LCAgMHgwNSwgIDB4MTIsICAweGZlLCAgMHhlMywgIDB4MDAsCisgIDB4MjEsICAweDUzLCAgMHhmZSwgIDB4NGEsICAweGYwLCAgMHhmZSwgIDB4NzYsICAweDA1LCAgMHhmZSwgIDB4NDksICAweGYwLCAgMHhmZSwgIDB4NzAsICAweDA1LCAgMHg4OCwgIDB4MjUsCisgIDB4ZmUsICAweDIxLCAgMHgwMCwgIDB4YWIsICAweDI1LCAgMHhmZSwgIDB4MjIsICAweDAwLCAgMHhhYSwgIDB4MjUsICAweDU4LCAgMHhmZSwgIDB4MDksICAweDQ4LCAgMHhmZiwgIDB4MDIsCisgIDB4MDAsICAweDEwLCAgMHgyNywgIDB4ZmUsICAweDg2LCAgMHgwNSwgIDB4MjYsICAweGZlLCAgMHhhOCwgIDB4MDUsICAweGZlLCAgMHhlMiwgIDB4MDgsICAweDUzLCAgMHgwNSwgIDB4Y2IsCisgIDB4NGQsICAweDAxLCAgMHhiMCwgIDB4MjUsICAweDA2LCAgMHgxMywgIDB4ZDMsICAweDM5LCAgMHhmZSwgIDB4MjcsICAweDAxLCAgMHgwOCwgIDB4MDUsICAweDFiLCAgMHhmZSwgIDB4MjIsCisgIDB4MTIsICAweDQxLCAgMHgwMSwgIDB4YjIsICAweDE1LCAgMHg5ZCwgIDB4MDgsICAweDA1LCAgMHgwNiwgIDB4NGQsICAweDE1LCAgMHhmZSwgIDB4MGQsICAweDAwLCAgMHgwMSwgIDB4MzYsCisgIDB4N2IsICAweGZlLCAgMHg2NCwgIDB4MGQsICAweDAyLCAgMHgyNCwgIDB4MDMsICAweGZlLCAgMHg5YywgIDB4MDAsICAweDI4LCAgMHhlYiwgIDB4MDMsICAweDVjLCAgMHgyOCwgIDB4ZmUsCisgIDB4MzYsICAweDEzLCAgMHg0MSwgIDB4MDEsICAweGIyLCAgMHgyNiwgIDB4ZmUsICAweDE4LCAgMHgwNiwgIDB4MDksICAweDA2LCAgMHg1MywgIDB4MDUsICAweDFmLCAgMHhmZSwgIDB4MDIsCisgIDB4MTIsICAweDUwLCAgMHgwMSwgIDB4ZmUsICAweDllLCAgMHgxNSwgIDB4MWQsICAweGZlLCAgMHgwZSwgIDB4MDYsICAweDEyLCAgMHhhNSwgIDB4MDEsICAweDRiLCAgMHgxMiwgIDB4ZmUsCisgIDB4ZTUsICAweDAwLCAgMHgwMywgIDB4NWMsICAweGMxLCAgMHgwYywgIDB4NWMsICAweDAzLCAgMHhjZCwgIDB4MjgsICAweGZlLCAgMHg2MiwgIDB4MTIsICAweDAzLCAgMHg0NSwgIDB4MjgsCisgIDB4ZmUsICAweDVhLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHgwYywgIDB4MTksICAweDAxLCAgMHhmZSwgIDB4NzYsICAweDE5LCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHhjNCwgIDB4Y2MsCisgIDB4MGYsICAweDcxLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsICAweDkzLCAgMHgxZSwgIDB4NDMsICAweDhiLCAgMHhjNCwgIDB4NmUsICAweDQxLCAgMHgwMSwgIDB4YjIsCisgIDB4MjYsICAweGZlLCAgMHg4MiwgIDB4MDYsICAweDUzLCAgMHgwNSwgIDB4MWEsICAweGU5LCAgMHg5MSwgIDB4MDksICAweDU5LCAgMHgwMSwgIDB4ZmUsICAweGNjLCAgMHgxNSwgIDB4MWQsCisgIDB4ZmUsICAweDc4LCAgMHgwNiwgIDB4MTIsICAweGE1LCAgMHgwMSwgIDB4NGIsICAweDEyLCAgMHhmZSwgIDB4ZTUsICAweDAwLCAgMHgwMywgIDB4NDUsICAweGMxLCAgMHgwYywgIDB4NDUsCisgIDB4MTgsICAweDA2LCAgMHgwMSwgIDB4YjIsICAweGZhLCAgMHg3NiwgIDB4NzQsICAweDAxLCAgMHhhZiwgIDB4OGMsICAweDEyLCAgMHhmZSwgIDB4ZTIsICAweDAwLCAgMHgyNywgIDB4ZGIsCisgIDB4MWMsICAweDM0LCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4YjYsICAweDA2LCAgMHg5NCwgIDB4ZmUsICAweDZjLCAgMHgwNywgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsCisgIDB4NzQsICAweDA3LCAgMHg5NSwgIDB4ODYsICAweDAyLCAgMHgyNCwgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDJlLCAgMHgxMiwgIDB4MTYsICAweDE5LCAgMHgwMSwgIDB4MGIsCisgIDB4MTYsICAweDAwLCAgMHgwMSwgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsICAweDBiLCAgMHgxNiwgIDB4MDAsICAweDAxLCAgMHgwYiwgIDB4ZmUsICAweDk5LCAgMHhhNCwgIDB4MDEsCisgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDIsICAweGZlLCAgMHg0MiwgIDB4MDgsICAweDY4LCAgMHgwNSwgIDB4MWEsICAweGZlLCAgMHgzOCwgIDB4MTIsICAweDA4LCAgMHgwNSwgIDB4MWEsCisgIDB4ZmUsICAweDMwLCAgMHgxMywgIDB4MTYsICAweGZlLCAgMHgxYiwgIDB4MDAsICAweDAxLCAgMHgwYiwgIDB4MTYsICAweDAwLCAgMHgwMSwgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsCisgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsICAweDBiLCAgMHgxNiwgIDB4MDYsICAweDAxLCAgMHgwYiwgIDB4MTYsICAweDAwLCAgMHgwMiwgIDB4ZTIsICAweDZjLCAgMHg1OCwgIDB4YmUsCisgIDB4NTAsICAweGZlLCAgMHg5YSwgIDB4ODEsICAweDU1LCAgMHgxYiwgIDB4N2EsICAweGZlLCAgMHg0MiwgIDB4MDcsICAweDA5LCAgMHgxYiwgIDB4ZmUsICAweDA5LCAgMHg2ZiwgIDB4YmEsCisgIDB4ZmUsICAweGNhLCAgMHg0NSwgIDB4ZmUsICAweDMyLCAgMHgxMiwgIDB4NjksICAweDZkLCAgMHg4YiwgIDB4NmMsICAweDdmLCAgMHgyNywgIDB4ZmUsICAweDU0LCAgMHgwNywgIDB4MWMsCisgIDB4MzQsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHg0MiwgIDB4MDcsICAweDk1LCAgMHg4NiwgIDB4OTQsICAweGZlLCAgMHg2YywgIDB4MDcsICAweDAyLCAgMHgyNCwgIDB4MDEsCisgIDB4NGIsICAweDAyLCAgMHhkYiwgIDB4MTYsICAweDFmLCAgMHgwMiwgIDB4ZGIsICAweGZlLCAgMHg5YywgIDB4ZjcsICAweGRjLCAgMHhmZSwgIDB4MmMsICAweDkwLCAgMHhmZSwgIDB4YWUsCisgIDB4OTAsICAweDU2LCAgMHhmZSwgIDB4ZGEsICAweDA3LCAgMHgwYywgIDB4NjAsICAweDE0LCAgMHg2MSwgIDB4MDgsICAweDU0LCAgMHg1YSwgIDB4MzcsICAweDIyLCAgMHgyMCwgIDB4MDcsCisgIDB4MTEsICAweGZlLCAgMHgwZSwgIDB4MTIsICAweDhkLCAgMHhmZSwgIDB4ODAsICAweDgwLCAgMHgzOSwgIDB4MjAsICAweDZhLCAgMHgyYSwgIDB4ZmUsICAweDA2LCAgMHgxMCwgIDB4ZmUsCisgIDB4ODMsICAweGU3LCAgMHhmZSwgIDB4NDgsICAweDAwLCAgMHhhYiwgIDB4ZmUsICAweDAzLCAgMHg0MCwgIDB4MDgsICAweDU0LCAgMHg1YiwgIDB4MzcsICAweDAxLCAgMHhiMywgIDB4YjgsCisgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MTMsICAweDYyLCAgMHgwMSwgIDB4ZWYsICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweGZlLCAgMHg0NCwgIDB4NTEsCisgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ODgsICAweGZlLCAgMHgwOCwgIDB4OTAsICAweGZlLCAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1ZSwgIDB4MTQsICAweDVmLCAgMHhmZSwgIDB4MGMsCisgIDB4OTAsICAweGZlLCAgMHg4ZSwgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4NTAsICAweGZlLCAgMHhjMiwgIDB4NTAsICAweDBjLCAgMHgzZCwgIDB4MTQsICAweDNlLCAgMHhmZSwgIDB4NGEsCisgIDB4MTAsICAweDA4LCAgMHgwNSwgIDB4NWEsICAweGZlLCAgMHgyYSwgIDB4MTIsICAweGZlLCAgMHgyYywgIDB4OTAsICAweGZlLCAgMHhhZSwgIDB4OTAsICAweDBjLCAgMHg2MCwgIDB4MTQsCisgIDB4NjEsICAweDA4LCAgMHgwNSwgIDB4NWIsICAweDhiLCAgMHgwMSwgIDB4YjMsICAweGZlLCAgMHgxZiwgIDB4ODAsICAweDEzLCAgMHg2MiwgIDB4ZmUsICAweDQ0LCAgMHg5MCwgIDB4ZmUsCisgIDB4YzYsICAweDkwLCAgMHgwYywgIDB4M2YsICAweDE0LCAgMHg0MCwgIDB4ZmUsICAweDA4LCAgMHg5MCwgIDB4ZmUsICAweDhhLCAgMHg5MCwgIDB4MGMsICAweDVlLCAgMHgxNCwgIDB4NWYsCisgIDB4ZmUsICAweDQwLCAgMHg5MCwgIDB4ZmUsICAweGMyLCAgMHg5MCwgIDB4MGMsICAweDNkLCAgMHgxNCwgIDB4M2UsICAweDBjLCAgMHgyZSwgIDB4MTQsICAweDNjLCAgMHgyMSwgIDB4MGMsCisgIDB4NDksICAweDBjLCAgMHg2MywgIDB4MDgsICAweDU0LCAgMHgxZiwgIDB4MzcsICAweDJjLCAgMHgwZiwgIDB4ZmUsICAweDRlLCAgMHgxMSwgIDB4MjcsICAweGRkLCAgMHhmZSwgIDB4OWUsCisgIDB4ZjAsICAweGZlLCAgMHg3NiwgIDB4MDgsICAweGJjLCAgMHgxNywgIDB4MzQsICAweDJjLCAgMHg3NywgIDB4ZTYsICAweGM1LCAgMHhmZSwgIDB4OWEsICAweDA4LCAgMHhjNiwgIDB4ZmUsCisgIDB4YjgsICAweDA4LCAgMHg5NCwgIDB4ZmUsICAweDhlLCAgMHgwOCwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsICAweDk0LCAgMHgwOCwgIDB4OTUsICAweDg2LCAgMHgwMiwgIDB4MjQsCisgIDB4MDEsICAweDRiLCAgMHhmZSwgIDB4YzksICAweDEwLCAgMHgxNiwgIDB4MWYsICAweGZlLCAgMHhjOSwgIDB4MTAsICAweDY4LCAgMHgwNSwgIDB4MDYsICAweGZlLCAgMHgxMCwgIDB4MTIsCisgIDB4NjgsICAweDA1LCAgMHgwYSwgIDB4NGUsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHg5MCwgIDB4MTIsICAweGZlLCAgMHgyZSwgIDB4MWMsICAweDAyLCAgMHhmZSwgIDB4MTgsCisgIDB4MGIsICAweDY4LCAgMHgwNSwgIDB4MDYsICAweDRlLCAgMHg2OCwgIDB4MDUsICAweDBhLCAgMHhmZSwgIDB4N2EsICAweDEyLCAgMHhmZSwgIDB4MmMsICAweDFjLCAgMHhmZSwgIDB4YWEsCisgIDB4ZjAsICAweGZlLCAgMHhkMiwgIDB4MDksICAweGZlLCAgMHhhYywgIDB4ZjAsICAweGZlLCAgMHgwMCwgIDB4MDksICAweDAyLCAgMHhmZSwgIDB4ZGUsICAweDA5LCAgMHhmZSwgIDB4YjcsCisgIDB4ZjAsICAweGZlLCAgMHhmYywgIDB4MDgsICAweGZlLCAgMHgwMiwgIDB4ZjYsICAweDFhLCAgMHg1MCwgIDB4ZmUsICAweDcwLCAgMHgxOCwgIDB4ZmUsICAweGYxLCAgMHgxOCwgIDB4ZmUsCisgIDB4NDAsICAweDU1LCAgMHhmZSwgIDB4ZTEsICAweDU1LCAgMHhmZSwgIDB4MTAsICAweDU4LCAgMHhmZSwgIDB4OTEsICAweDU4LCAgMHhmZSwgIDB4MTQsICAweDU5LCAgMHhmZSwgIDB4OTUsCisgIDB4NTksICAweDFjLCAgMHg4NSwgIDB4ZmUsICAweDhjLCAgMHhmMCwgIDB4ZmUsICAweGZjLCAgMHgwOCwgIDB4ZmUsICAweGFjLCAgMHhmMCwgIDB4ZmUsICAweGYwLCAgMHgwOCwgIDB4YjUsCisgIDB4ZmUsICAweGNiLCAgMHgxMCwgIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwOSwgIDB4MDIsICAweGZlLCAgMHgxOCwgIDB4MGIsICAweGI2LCAgMHhmZSwgIDB4YmYsCisgIDB4MTAsICAweGZlLCAgMHgyYiwgIDB4ZjAsICAweDg1LCAgMHhmNCwgIDB4MWUsICAweGZlLCAgMHgwMCwgIDB4ZmUsICAweGZlLCAgMHgxYywgIDB4MTIsICAweGMyLCAgMHhmZSwgIDB4ZDIsCisgIDB4ZjAsICAweDg1LCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgxZSwgIDB4MTksICAweDE3LCAgMHg4NSwgIDB4MDMsICAweGQyLCAgMHgxZSwgIDB4MDYsICAweDE3LCAgMHg4NSwgIDB4YzUsCisgIDB4NGEsICAweGM2LCAgMHg0YSwgIDB4YjUsICAweGI2LCAgMHhmZSwgIDB4ODksICAweDEwLCAgMHg3NCwgIDB4NjcsICAweDJkLCAgMHgxNSwgIDB4OWQsICAweDAxLCAgMHgzNiwgIDB4MTAsCisgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NjUsICAweDEwLCAgMHg4MCwgIDB4MDIsICAweDY1LCAgMHhmZSwgIDB4OTgsICAweDgwLCAgMHhmZSwgIDB4MTksCisgIDB4ZTQsICAweDBhLCAgMHhmZSwgIDB4MWEsICAweDEyLCAgMHg1MSwgIDB4ZmUsICAweDE5LCAgMHg4MiwgIDB4ZmUsICAweDZjLCAgMHgxOCwgIDB4ZmUsICAweDQ0LCAgMHg1NCwgIDB4YmUsCisgIDB4ZmUsICAweDE5LCAgMHg4MSwgIDB4ZmUsICAweDc0LCAgMHgxOCwgIDB4OGYsICAweDkwLCAgMHgxNywgIDB4ZmUsICAweGNlLCAgMHgwOCwgIDB4MDIsICAweDRhLCAgMHgwOCwgIDB4MDUsCisgIDB4NWEsICAweGVjLCAgMHgwMywgIDB4MmUsICAweDI5LCAgMHgzYywgIDB4MGMsICAweDNmLCAgMHgxNCwgIDB4NDAsICAweDliLCAgMHgyZSwgIDB4OWMsICAweDNjLCAgMHhmZSwgIDB4NmMsCisgIDB4MTgsICAweGZlLCAgMHhlZCwgIDB4MTgsICAweGZlLCAgMHg0NCwgIDB4NTQsICAweGZlLCAgMHhlNSwgIDB4NTQsICAweDNhLCAgMHgzZiwgIDB4M2IsICAweDQwLCAgMHgwMywgIDB4NDksCisgIDB4MjksICAweDYzLCAgMHg4ZiwgIDB4ZmUsICAweGUzLCAgMHg1NCwgIDB4ZmUsICAweDc0LCAgMHgxOCwgIDB4ZmUsICAweGY1LCAgMHgxOCwgIDB4OGYsICAweGZlLCAgMHhlMywgIDB4NTQsCisgIDB4OTAsICAweGMwLCAgMHg1NiwgIDB4ZmUsICAweGNlLCAgMHgwOCwgIDB4MDIsICAweDRhLCAgMHhmZSwgIDB4MzcsICAweGYwLCAgMHhmZSwgIDB4ZGEsICAweDA5LCAgMHhmZSwgIDB4OGIsCisgIDB4ZjAsICAweGZlLCAgMHg2MCwgIDB4MDksICAweDAyLCAgMHg0YSwgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4MjMsICAweGZlLCAgMHhmYSwgIDB4MGEsICAweDNhLCAgMHg0OSwgIDB4M2IsCisgIDB4NjMsICAweDU2LCAgMHhmZSwgIDB4M2UsICAweDBhLCAgMHgwZiwgIDB4ZmUsICAweGMwLCAgMHgwNywgIDB4NDEsICAweDk4LCAgMHgwMCwgIDB4YWQsICAweGZlLCAgMHgwMSwgIDB4NTksCisgIDB4ZmUsICAweDUyLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwYSwgIDB4OGYsICAweDdhLCAgMHhmZSwgIDB4MjQsICAweDBhLCAgMHgzYSwgIDB4NDksICAweDhmLCAgMHhmZSwgIDB4ZTMsCisgIDB4NTQsICAweDU3LCAgMHg0OSwgIDB4N2QsICAweDYzLCAgMHhmZSwgIDB4MTQsICAweDU4LCAgMHhmZSwgIDB4OTUsICAweDU4LCAgMHgwMiwgIDB4NGEsICAweDNhLCAgMHg0OSwgIDB4M2IsCisgIDB4NjMsICAweGZlLCAgMHgxNCwgIDB4NTksICAweGZlLCAgMHg5NSwgIDB4NTksICAweGJlLCAgMHg1NywgIDB4NDksICAweDU3LCAgMHg2MywgIDB4MDIsICAweDRhLCAgMHgwOCwgIDB4MDUsCisgIDB4NWEsICAweGZlLCAgMHg4MiwgIDB4MTIsICAweDA4LCAgMHgwNSwgIDB4MWYsICAweGZlLCAgMHg2NiwgIDB4MTMsICAweDIyLCAgMHg2MiwgIDB4YjcsICAweGZlLCAgMHgwMywgIDB4YTEsCisgIDB4ZmUsICAweDgzLCAgMHg4MCwgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4ZmUsICAweDJlLCAgMHgxMywgIDB4ZmUsICAweDA0LCAgMHg5MSwgIDB4ZmUsICAweDg2LCAgMHg5MSwgIDB4NmEsCisgIDB4MmEsICAweGZlLCAgMHg0MCwgIDB4NTksICAweGZlLCAgMHhjMSwgIDB4NTksICAweDU2LCAgMHhlMCwgIDB4MDMsICAweDYwLCAgMHgyOSwgIDB4NjEsICAweDBjLCAgMHg3ZiwgIDB4MTQsCisgIDB4ODAsICAweDU3LCAgMHg2MCwgIDB4N2QsICAweDYxLCAgMHgwMSwgIDB4YjMsICAweGI4LCAgMHg2YSwgIDB4MmEsICAweDEzLCAgMHg2MiwgIDB4OWIsICAweDJlLCAgMHg5YywgIDB4M2MsCisgIDB4M2EsICAweDNmLCAgMHgzYiwgIDB4NDAsICAweDkwLCAgMHhjMCwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4MmUsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDNjLCAgMHgwMSwgIDB4ZWYsCisgIDB4ZmUsICAweDM2LCAgMHgxMCwgIDB4MjEsICAweDBjLCAgMHg3ZiwgIDB4MGMsICAweDgwLCAgMHgzYSwgIDB4M2YsICAweDNiLCAgMHg0MCwgIDB4ZTQsICAweDA4LCAgMHgwNSwgIDB4MWYsCisgIDB4MTcsICAweGUwLCAgMHgzYSwgIDB4M2QsICAweDNiLCAgMHgzZSwgIDB4MDgsICAweDA1LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHgzNywgIDB4MDMsICAweDVlLCAgMHgyOSwgIDB4NWYsCisgIDB4ZmUsICAweDEwLCAgMHg1OCwgIDB4ZmUsICAweDkxLCAgMHg1OCwgIDB4NTcsICAweDQ5LCAgMHg3ZCwgIDB4NjMsICAweDAyLCAgMHhmZSwgIDB4ZjQsICAweDA5LCAgMHgwOCwgIDB4MDUsCisgIDB4MWYsICAweDE3LCAgMHhlMCwgIDB4MDgsICAweDA1LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHgzNywgIDB4YmUsICAweGZlLCAgMHgxOSwgIDB4ODEsICAweDUwLCAgMHhmZSwgIDB4MTAsCisgIDB4OTAsICAweGZlLCAgMHg5MiwgIDB4OTAsICAweGZlLCAgMHhkMywgIDB4MTAsICAweDMyLCAgMHgwNywgIDB4YTYsICAweDE3LCAgMHhmZSwgIDB4MDgsICAweDA5LCAgMHgxMiwgIDB4YTYsCisgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDMsICAweDNkLCAgMHgyOSwgIDB4M2UsICAweDU2LCAgMHhmZSwgIDB4MDgsICAweDA5LCAgMHhmZSwgIDB4MGMsCisgIDB4NTgsICAweGZlLCAgMHg4ZCwgIDB4NTgsICAweDAyLCAgMHg0YSwgIDB4MjEsICAweDQxLCAgMHhmZSwgIDB4MTksICAweDgwLCAgMHhlNywgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsCisgIDB4MWEsICAweDEyLCAgMHhmZSwgIDB4NmMsICAweDE5LCAgMHhmZSwgIDB4MTksICAweDQxLCAgMHhmNCwgIDB4YzIsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGUyLCAgMHgxNSwgIDB4N2UsCisgIDB4MDEsICAweDM2LCAgMHgxMCwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4ZmUsICAweDhlLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4NTcsICAweDNkLCAgMHhmZSwgIDB4ZWQsCisgIDB4MTksICAweDdkLCAgMHgzZSwgIDB4ZmUsICAweDBjLCAgMHg1MSwgIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZjQsICAweDFlLCAgMHhmZSwgIDB4MDAsICAweGZmLCAgMHgzNSwgIDB4ZmUsCisgIDB4NzQsICAweDEwLCAgMHhjMiwgIDB4ZmUsICAweGQyLCAgMHhmMCwgIDB4ZmUsICAweGE2LCAgMHgwYiwgIDB4ZmUsICAweDc2LCAgMHgxOCwgIDB4MWUsICAweDE5LCAgMHg4YSwgIDB4MDMsCisgIDB4ZDIsICAweDFlLCAgMHgwNiwgIDB4ZmUsICAweDA4LCAgMHgxMywgIDB4MTAsICAweGZlLCAgMHgxNiwgIDB4MDAsICAweDAyLCAgMHg2NSwgIDB4ZmUsICAweGQxLCAgMHhmMCwgIDB4ZmUsCisgIDB4YjgsICAweDBiLCAgMHgxNSwgIDB4N2UsICAweDAxLCAgMHgzNiwgIDB4MTAsICAweGZlLCAgMHgxNywgIDB4MDAsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHhjZSwgIDB4ZjAsCisgIDB4ZmUsICAweGJlLCAgMHgwYiwgIDB4ZmUsICAweDNjLCAgMHgxMCwgIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGNhLCAgMHgwYiwgIDB4MTAsICAweGZlLCAgMHgyMiwgIDB4MDAsCisgIDB4MDIsICAweDY1LCAgMHhmZSwgIDB4Y2IsICAweGYwLCAgMHhmZSwgIDB4ZDYsICAweDBiLCAgMHgxMCwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDIsICAweDY1LCAgMHhmZSwgIDB4ZDAsCisgIDB4ZjAsICAweGZlLCAgMHhlMCwgIDB4MGIsICAweDEwLCAgMHg5ZSwgIDB4ZTUsICAweGZlLCAgMHhjZiwgIDB4ZjAsICAweGZlLCAgMHhlYSwgIDB4MGIsICAweDEwLCAgMHg1OCwgIDB4ZmUsCisgIDB4MTAsICAweDEwLCAgMHhmZSwgIDB4Y2MsICAweGYwLCAgMHhlMiwgIDB4NjgsICAweDA1LCAgMHgxZiwgIDB4NGQsICAweDEwLCAgMHhmZSwgIDB4MTIsICAweDAwLCAgMHgyYywgIDB4MGYsCisgIDB4ZmUsICAweDRlLCAgMHgxMSwgIDB4MjcsICAweGZlLCAgMHgwMCwgIDB4MGMsICAweGZlLCAgMHg5ZSwgIDB4ZjAsICAweGZlLCAgMHgxNCwgIDB4MGMsICAweGJjLCAgMHgxNywgIDB4MzQsCisgIDB4MmMsICAweDc3LCAgMHhlNiwgIDB4YzUsICAweDI0LCAgMHhjNiwgIDB4MjQsICAweDJjLCAgMHhmYSwgIDB4MjcsICAweGZlLCAgMHgyMCwgIDB4MGMsICAweDFjLCAgMHgzNCwgIDB4OTQsCisgIDB4ZmUsICAweDNjLCAgMHgwYywgIDB4OTUsICAweDg2LCAgMHhjNSwgIDB4ZGMsICAweGM2LCAgMHhkYywgIDB4MDIsICAweDI0LCAgMHgwMSwgIDB4NGIsICAweGZlLCAgMHhkYiwgIDB4MTAsCisgIDB4MTIsICAweGZlLCAgMHhlOCwgIDB4MDAsICAweGI1LCAgMHhiNiwgIDB4NzQsICAweGM3LCAgMHg4MSwgIDB4YzgsICAweDgzLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyNCwgIDB4MzMsCisgIDB4MzEsICAweGUxLCAgMHhjNywgIDB4ODEsICAweGM4LCAgMHg4MywgIDB4MjcsICAweGZlLCAgMHg2NiwgIDB4MGMsICAweDFkLCAgMHgyNCwgIDB4MzMsICAweDMxLCAgMHhkZiwgIDB4YmMsCisgIDB4NGUsICAweDEwLCAgMHhmZSwgIDB4NDIsICAweDAwLCAgMHgwMiwgIDB4NjUsICAweDdjLCAgMHgwNiwgIDB4ZmUsICAweDgxLCAgMHg0OSwgIDB4MTcsICAweGZlLCAgMHgyYywgIDB4MGQsCisgIDB4MDgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDQ0LCAgMHgxMywgIDB4MTAsICAweDAwLCAgMHg1NSwgIDB4MGEsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDU1LCAgMHhmZSwgIDB4MjgsCisgIDB4MDAsICAweDIzLCAgMHhmZSwgIDB4OWEsICAweDBkLCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDAwLCAgMHg2NiwgIDB4NDQsICAweGZlLCAgMHgyOCwgIDB4MDAsCisgIDB4ZmUsICAweGUyLCAgMHgxMCwgIDB4MDEsICAweGY1LCAgMHgwMSwgIDB4ZjYsICAweDA5LCAgMHhhNCwgIDB4MDEsICAweGZlLCAgMHgyNiwgIDB4MGYsICAweDY0LCAgMHgxMiwgIDB4MmYsCisgIDB4MDEsICAweDczLCAgMHgwMiwgIDB4MmIsICAweDEwLCAgMHhmZSwgIDB4NDQsICAweDAwLCAgMHg1NSwgIDB4MGEsICAweGU5LCAgMHg0NCwgIDB4MGEsICAweGZlLCAgMHhiNCwgIDB4MTAsCisgIDB4MDEsICAweGIwLCAgMHg0NCwgIDB4MGEsICAweGZlLCAgMHhhYSwgIDB4MTAsICAweDAxLCAgMHhiMCwgIDB4ZmUsICAweDE5LCAgMHg4MiwgIDB4ZmUsICAweDM0LCAgMHg0NiwgIDB4YWMsCisgIDB4NDQsICAweDBhLCAgMHgxMCwgIDB4ZmUsICAweDQzLCAgMHgwMCwgIDB4ZmUsICAweDk2LCAgMHgxMCwgIDB4MDgsICAweDU0LCAgMHgwYSwgIDB4MzcsICAweDAxLCAgMHhmNSwgIDB4MDEsCisgIDB4ZjYsICAweDY0LCAgMHgxMiwgIDB4MmYsICAweDAxLCAgMHg3MywgIDB4OTksICAweDBhLCAgMHg2NCwgIDB4NDIsICAweDkyLCAgMHgwMiwgIDB4ZmUsICAweDJlLCAgMHgwMywgIDB4MDgsCisgIDB4MDUsICAweDBhLCAgMHg4YSwgIDB4NDQsICAweDBhLCAgMHgxMCwgIDB4MDAsICAweGZlLCAgMHg1YywgIDB4MTAsICAweDY4LCAgMHgwNSwgIDB4MWEsICAweGZlLCAgMHg1OCwgIDB4MTIsCisgIDB4MDgsICAweDA1LCAgMHgxYSwgIDB4ZmUsICAweDUwLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsICAweDUwLCAgMHgwZCwgIDB4ZmUsCisgIDB4MWMsICAweDFjLCAgMHhmZSwgIDB4OWQsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDBkLCAgMHgwOCwgIDB4NTQsICAweDFhLCAgMHgzNywgIDB4ZmUsICAweGE5LCAgMHgxMCwgIDB4MTAsCisgIDB4ZmUsICAweDE1LCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhlNiwgIDB4MGEsICAweDUwLCAgMHhmZSwgIDB4MmUsICAweDEwLCAgMHgxMCwgIDB4ZmUsICAweDEzLCAgMHgwMCwgIDB4ZmUsCisgIDB4MTAsICAweDEwLCAgMHgxMCwgIDB4NmYsICAweGFiLCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHgwMCwgIDB4YWEsICAweDEwLCAgMHhmZSwgIDB4MjQsICAweDAwLCAgMHg4YywgIDB4YjUsCisgIDB4YjYsICAweDc0LCAgMHgwMywgIDB4NzAsICAweDI4LCAgMHgyMywgIDB4ZDgsICAweDUwLCAgMHhmZSwgIDB4MDQsICAweGU2LCAgMHgxYSwgIDB4ZmUsICAweDlkLCAgMHg0MSwgIDB4ZmUsCisgIDB4MWMsICAweDQyLCAgMHg2NCwgIDB4MDEsICAweGUzLCAgMHgwMiwgIDB4MmIsICAweGY4LCAgMHgxNSwgIDB4MGEsICAweDM5LCAgMHhhMCwgIDB4YjQsICAweDE1LCAgMHhmZSwgIDB4MzEsCisgIDB4MDAsICAweDM5LCAgMHhhMiwgIDB4MDEsICAweGZlLCAgMHg0OCwgIDB4MTAsICAweDAyLCAgMHhkNywgIDB4NDIsICAweGZlLCAgMHgwNiwgIDB4ZWMsICAweGQwLCAgMHhmYywgIDB4NDQsCisgIDB4MWIsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDM1LCAgMHg0MiwgIDB4ZmUsICAweDA2LCAgMHhlYSwgIDB4ZDAsICAweGZlLCAgMHg0NywgIDB4NGIsICAweDkxLCAgMHhmZSwgIDB4NzUsCisgIDB4NTcsICAweDAzLCAgMHg1ZCwgIDB4ZmUsICAweDk4LCAgMHg1NiwgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MDksICAweDQ4LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg0NCwgIDB4NDgsCisgIDB4NGYsICAweDA4LCAgMHgwNSwgIDB4MWIsICAweGZlLCAgMHgxYSwgIDB4MTMsICAweDA5LCAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHg0MSwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MDksCisgIDB4YTQsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDQ5LCAgMHg1NCwgIDB4OTYsICAweGZlLCAgMHgxZSwgIDB4MGUsICAweDAyLCAgMHhmZSwgIDB4MmUsICAweDAzLCAgMHgwOSwgIDB4NWQsCisgIDB4ZmUsICAweGVlLCAgMHgxNCwgIDB4ZmMsICAweDQ0LCAgMHgxYiwgIDB4ZmUsICAweGNlLCAgMHg0NSwgIDB4MzUsICAweDQyLCAgMHhmZSwgIDB4Y2UsICAweDQ3LCAgMHhmZSwgIDB4YWQsCisgIDB4MTMsICAweDAyLCAgMHgyYiwgIDB4MjIsICAweDIwLCAgMHgwNywgIDB4MTEsICAweGZlLCAgMHg5ZSwgIDB4MTIsICAweDIxLCAgMHgxMywgIDB4NTksICAweDEzLCAgMHg5ZiwgIDB4MTMsCisgIDB4ZDUsICAweDIyLCAgMHgyZiwgIDB4NDEsICAweDM5LCAgMHgyZiwgIDB4YmMsICAweGFkLCAgMHhmZSwgIDB4YmMsICAweGYwLCAgMHhmZSwgIDB4ZTAsICAweDBlLCAgMHgwZiwgIDB4MDYsCisgIDB4MTMsICAweDU5LCAgMHgwMSwgIDB4ZmUsICAweGRhLCAgMHgxNiwgIDB4MDMsICAweGZlLCAgMHgzOCwgIDB4MDEsICAweDI5LCAgMHhmZSwgIDB4M2EsICAweDAxLCAgMHg1NiwgIDB4ZmUsCisgIDB4ZTQsICAweDBlLCAgMHhmZSwgIDB4MDIsICAweGVjLCAgMHhkNSwgIDB4NjksICAweDAwLCAgMHg2NiwgIDB4ZmUsICAweDA0LCAgMHhlYywgIDB4MjAsICAweDRmLCAgMHhmZSwgIDB4MDUsCisgIDB4ZjYsICAweGZlLCAgMHgzNCwgIDB4MDEsICAweDAxLCAgMHhmZSwgIDB4NGEsICAweDE3LCAgMHhmZSwgIDB4MDgsICAweDkwLCAgMHhmZSwgIDB4NDgsICAweGY0LCAgMHgwZCwgIDB4ZmUsCisgIDB4MTgsICAweDEzLCAgMHhiYSwgIDB4ZmUsICAweDAyLCAgMHhlYSwgIDB4ZDUsICAweDY5LCAgMHg3ZSwgIDB4ZmUsICAweGM1LCAgMHgxMywgIDB4MTUsICAweDFhLCAgMHgzOSwgIDB4YTAsCisgIDB4YjQsICAweGZlLCAgMHgyZSwgIDB4MTAsICAweDAzLCAgMHhmZSwgIDB4MzgsICAweDAxLCAgMHgxZSwgIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MGMsICAweGZlLCAgMHg2MCwgIDB4MDEsCisgIDB4MDMsICAweGZlLCAgMHgzYSwgIDB4MDEsICAweDBjLCAgMHhmZSwgIDB4NjIsICAweDAxLCAgMHg0MywgIDB4MTMsICAweDIwLCAgMHgyNSwgIDB4MDYsICAweDEzLCAgMHgyZiwgIDB4MTIsCisgIDB4MmYsICAweDkyLCAgMHgwZiwgIDB4MDYsICAweDA0LCAgMHgyMSwgIDB4MDQsICAweDIyLCAgMHg1OSwgIDB4ZmUsICAweGY3LCAgMHgxMiwgIDB4MjIsICAweDlmLCAgMHhiNywgIDB4MTMsCisgIDB4OWYsICAweDA3LCAgMHg3ZSwgIDB4ZmUsICAweDcxLCAgMHgxMywgIDB4ZmUsICAweDI0LCAgMHgxYywgIDB4MTUsICAweDE5LCAgMHgzOSwgIDB4YTAsICAweGI0LCAgMHhmZSwgIDB4ZDksCisgIDB4MTAsICAweGMzLCAgMHhmZSwgIDB4MDMsICAweGRjLCAgMHhmZSwgIDB4NzMsICAweDU3LCAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwNCwgIDB4YzMsICAweGZlLCAgMHgwMywgIDB4ZGMsCisgIDB4ZmUsICAweDViLCAgMHg1NywgIDB4ZmUsICAweDgwLCAgMHg1ZCwgIDB4MDQsICAweGZlLCAgMHgwMywgIDB4NTcsICAweGMzLCAgMHgyMSwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4MDQsCisgIDB4ZmUsICAweDAzLCAgMHg1NywgIDB4YzMsICAweDc4LCAgMHgwNCwgIDB4MDgsICAweDA1LCAgMHg1OCwgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHg4MCwgIDB4MDcsCisgIDB4MDYsICAweGZlLCAgMHgxYSwgIDB4MTMsICAweGZlLCAgMHgxZSwgIDB4ODAsICAweGVkLCAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHhhZSwgIDB4ZmUsICAweDBjLCAgMHg5MCwgIDB4ZmUsCisgIDB4MGUsICAweDEzLCAgMHhmZSwgIDB4MGUsICAweDkwLCAgMHhhYywgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MGEsICAweGZlLCAgMHgzYywgIDB4NTAsCisgIDB4YWEsICAweDAxLCAgMHhmZSwgIDB4N2EsICAweDE3LCAgMHgzMiwgIDB4MDcsICAweDJmLCAgMHhhZCwgIDB4MDEsICAweGZlLCAgMHhiNCwgIDB4MTYsICAweDA4LCAgMHgwNSwgIDB4MWIsCisgIDB4NGUsICAweDAxLCAgMHhmNSwgIDB4MDEsICAweGY2LCAgMHgxMiwgIDB4ZmUsICAweGU5LCAgMHgwMCwgIDB4MDgsICAweDA1LCAgMHg1OCwgIDB4ZmUsICAweDJjLCAgMHgxMywgIDB4MDEsCisgIDB4ZmUsICAweDBjLCAgMHgxNywgIDB4ZmUsICAweDFlLCAgMHgxYywgIDB4ZmUsICAweDE0LCAgMHg5MCwgIDB4ZmUsICAweDk2LCAgMHg5MCwgIDB4MGMsICAweGZlLCAgMHg2NCwgIDB4MDEsCisgIDB4MTQsICAweGZlLCAgMHg2NiwgIDB4MDEsICAweDA4LCAgMHgwNSwgIDB4NWIsICAweGZlLCAgMHgxMiwgIDB4MTIsICAweGZlLCAgMHgwMywgIDB4ODAsICAweDhkLCAgMHhmZSwgIDB4MDEsCisgIDB4ZWMsICAweDIwLCAgMHhmZSwgIDB4ODAsICAweDQwLCAgMHgxMywgIDB4MjAsICAweDZhLCAgMHgyYSwgIDB4MTIsICAweGNmLCAgMHg2NCwgIDB4MjIsICAweDIwLCAgMHhmYiwgIDB4NzksCisgIDB4MjAsICAweDA0LCAgMHhmZSwgIDB4MDgsICAweDFjLCAgMHgwMywgIDB4ZmUsICAweGFjLCAgMHgwMCwgIDB4ZmUsICAweDA2LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhhZSwgIDB4MDAsCisKKyAgMHhmZSwgIDB4MDcsICAweDU4LCAgMHgwMywgIDB4ZmUsICAweGIwLCAgMHgwMCwgIDB4ZmUsICAweDA4LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhiMiwgIDB4MDAsICAweGZlLCAgMHgwOSwKKyAgMHg1OCwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MjUsICAweDZlLCAgMHgxMywgIDB4ZDAsICAweDIxLCAgMHgwYywgIDB4NWMsICAweDBjLCAgMHg0NSwgIDB4MGYsICAweDQ2LCAgMHg1MiwKKyAgMHg1MCwgIDB4MTgsICAweDFiLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwgIDB4OTEsICAweDU0LCAgMHgyMywgIDB4ZmUsICAweGZjLCAgMHgwZiwgIDB4NDQsICAweDExLCAgMHgwZiwKKyAgMHg0OCwgIDB4NTIsICAweDE4LCAgMHg1OCwgIDB4ZmUsICAweDkwLCAgMHg0ZCwgIDB4ZmUsICAweDkxLCAgMHg1NCwgIDB4MjMsICAweGU0LCAgMHgyNSwgIDB4MTEsICAweDEzLCAgMHgyMCwKKyAgMHg3YywgIDB4NmYsICAweDRmLCAgMHgyMiwgIDB4MjAsICAweGZiLCAgMHg3OSwgIDB4MjAsICAweDEyLCAgMHhjZiwgIDB4ZmUsICAweDE0LCAgMHg1NiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwKKyAgMHhmZSwgIDB4MjYsICAweDEwLCAgMHhmOCwgIDB4NzQsICAweGZlLCAgMHgxNCwgIDB4MWMsICAweGZlLCAgMHgxMCwgIDB4MWMsICAweGZlLCAgMHgxOCwgIDB4MWMsICAweDA0LCAgMHg0MiwKKyAgMHhmZSwgIDB4MGMsICAweDE0LCAgMHhmYywgIDB4ZmUsICAweDA3LCAgMHhlNiwgIDB4MWIsICAweGZlLCAgMHhjZSwgIDB4NDcsICAweGZlLCAgMHhmNSwgIDB4MTMsICAweDA0LCAgMHgwMSwKKyAgMHhiMCwgIDB4N2MsICAweDZmLCAgMHg0ZiwgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4MzIsICAweDA3LCAgMHgyZiwKKyAgMHhmZSwgIDB4MzQsICAweDEzLCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4YmIsICAweGZlLCAgMHgzNiwgIDB4MTIsICAweGZlLCAgMHg0MSwgIDB4NDgsICAweGZlLCAgMHg0NSwKKyAgMHg0OCwgIDB4MDEsICAweGYwLCAgMHhmZSwgIDB4MDAsICAweGNjLCAgMHhiYiwgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4NDMsICAweDc4LCAgMHgwNywgIDB4MTEsICAweGFjLCAgMHgwOSwKKyAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDVjLCAgMHgwMSwgIDB4NzMsICAweGZlLCAgMHgwZSwgIDB4MTAsICAweDA3LCAgMHg4MiwgIDB4NGUsICAweGZlLCAgMHgxNCwKKyAgMHg1NiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDYwLCAgMHgxMCwgIDB4MDQsICAweGZlLCAgMHg0NCwgIDB4NTgsICAweDhkLCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHhhMiwKKyAgMHhmZSwgIDB4OWUsICAweDQwLCAgMHhmZSwgIDB4OWQsICAweGU3LCAgMHgwMCwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MWEsICAweDc5LCAgMHgyYSwgIDB4MDEsICAweGUzLCAgMHhmZSwKKyAgMHhkZCwgIDB4MTAsICAweDJjLCAgMHhjNywgIDB4ODEsICAweGM4LCAgMHg4MywgIDB4MzMsICAweDMxLCAgMHhkZSwgIDB4MDcsICAweDFhLCAgMHhmZSwgIDB4NDgsICAweDEyLCAgMHgwNywKKyAgMHgwYSwgIDB4ZmUsICAweDU2LCAgMHgxMiwgIDB4MDcsICAweDE5LCAgMHhmZSwgIDB4MzAsICAweDEyLCAgMHgwNywgIDB4YzksICAweDE3LCAgMHhmZSwgIDB4MzIsICAweDEyLCAgMHgwNywKKyAgMHhmZSwgIDB4MjMsICAweDAwLCAgMHgxNywgIDB4ZWIsICAweDA3LCAgMHgwNiwgIDB4MTcsICAweGZlLCAgMHg5YywgIDB4MTIsICAweDA3LCAgMHgxZiwgIDB4ZmUsICAweDEyLCAgMHgxMiwKKyAgMHgwNywgIDB4MDAsICAweDE3LCAgMHgyNCwgIDB4MTUsICAweGM5LCAgMHgwMSwgIDB4MzYsICAweGE5LCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHg5NCwgIDB4NGIsICAweDA0LCAgMHgyZCwKKyAgMHhkZCwgIDB4MDksICAweGQxLCAgMHgwMSwgIDB4ZmUsICAweDI2LCAgMHgwZiwgIDB4MTIsICAweDgyLCAgMHgwMiwgIDB4MmIsICAweDJkLCAgMHgzMiwgIDB4MDcsICAweGE2LCAgMHhmZSwKKyAgMHhkOSwgIDB4MTMsICAweDNhLCAgMHgzZCwgIDB4M2IsICAweDNlLCAgMHg1NiwgIDB4ZmUsICAweGYwLCAgMHgxMSwgIDB4MDgsICAweDA1LCAgMHg1YSwgIDB4ZmUsICAweDcyLCAgMHgxMiwKKyAgMHg5YiwgIDB4MmUsICAweDljLCAgMHgzYywgIDB4OTAsICAweGMwLCAgMHg5NiwgIDB4ZmUsICAweGJhLCAgMHgxMSwgIDB4MjIsICAweDYyLCAgMHhmZSwgIDB4MjYsICAweDEzLCAgMHgwMywKKyAgMHg3ZiwgIDB4MjksICAweDgwLCAgMHg1NiwgIDB4ZmUsICAweDc2LCAgMHgwZCwgIDB4MGMsICAweDYwLCAgMHgxNCwgIDB4NjEsICAweDIxLCAgMHgwYywgIDB4N2YsICAweDBjLCAgMHg4MCwKKyAgMHgwMSwgIDB4YjMsICAweDI1LCAgMHg2ZSwgIDB4NzcsICAweDEzLCAgMHg2MiwgIDB4MDEsICAweGVmLCAgMHg5YiwgIDB4MmUsICAweDljLCAgMHgzYywgIDB4ZmUsICAweDA0LCAgMHg1NSwKKyAgMHhmZSwgIDB4YTUsICAweDU1LCAgMHhmZSwgIDB4MDQsICAweGZhLCAgMHgyZSwgIDB4ZmUsICAweDA1LCAgMHhmYSwgIDB4M2MsICAweGZlLCAgMHg5MSwgIDB4MTAsICAweDAzLCAgMHgzZiwKKyAgMHgyOSwgIDB4NDAsICAweGZlLCAgMHg0MCwgIDB4NTYsICAweGZlLCAgMHhlMSwgIDB4NTYsICAweDBjLCAgMHgzZiwgIDB4MTQsICAweDQwLCAgMHg4OCwgIDB4OWIsICAweDJlLCAgMHg5YywKKyAgMHgzYywgIDB4OTAsICAweGMwLCAgMHgwMywgIDB4NWUsICAweDI5LCAgMHg1ZiwgIDB4ZmUsICAweDAwLCAgMHg1NiwgIDB4ZmUsICAweGExLCAgMHg1NiwgIDB4MGMsICAweDVlLCAgMHgxNCwKKyAgMHg1ZiwgIDB4MDgsICAweDA1LCAgMHg1YSwgIDB4ZmUsICAweDFlLCAgMHgxMiwgIDB4MjIsICAweDYyLCAgMHhmZSwgIDB4MWYsICAweDQwLCAgMHgwMywgIDB4NjAsICAweDI5LCAgMHg2MSwKKyAgMHhmZSwgIDB4MmMsICAweDUwLCAgMHhmZSwgIDB4YWUsICAweDUwLCAgMHgwMywgIDB4M2YsICAweDI5LCAgMHg0MCwgIDB4ZmUsICAweDQ0LCAgMHg1MCwgIDB4ZmUsICAweGM2LCAgMHg1MCwKKyAgMHgwMywgIDB4NWUsICAweDI5LCAgMHg1ZiwgIDB4ZmUsICAweDA4LCAgMHg1MCwgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4MDMsICAweDNkLCAgMHgyOSwgIDB4M2UsICAweGZlLCAgMHg0MCwKKyAgMHg1MCwgIDB4ZmUsICAweGMyLCAgMHg1MCwgIDB4MDIsICAweDg5LCAgMHgyNSwgIDB4MDYsICAweDEzLCAgMHhkNCwgIDB4MDIsICAweDcyLCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHgxZCwKKyAgMHg0YywgIDB4MzMsICAweDMxLCAgMHhkZSwgIDB4MDcsICAweDA2LCAgMHgyMywgIDB4NGMsICAweDMyLCAgMHgwNywgIDB4YTYsICAweDIzLCAgMHg3MiwgIDB4MDEsICAweGFmLCAgMHgxZSwKKyAgMHg0MywgIDB4MTcsICAweDRjLCAgMHgwOCwgIDB4MDUsICAweDBhLCAgMHhlZSwgIDB4M2EsICAweDNkLCAgMHgzYiwgIDB4M2UsICAweGZlLCAgMHgwYSwgIDB4NTUsICAweDM1LCAgMHhmZSwKKyAgMHg4YiwgIDB4NTUsICAweDU3LCAgMHgzZCwgIDB4N2QsICAweDNlLCAgMHhmZSwgIDB4MGMsICAweDUxLCAgMHhmZSwgIDB4OGUsICAweDUxLCAgMHgwMiwgIDB4NzIsICAweGZlLCAgMHgxOSwKKyAgMHg4MSwgIDB4YmEsICAweGZlLCAgMHgxOSwgIDB4NDEsICAweDAyLCAgMHg3MiwgIDB4MmQsICAweDAxLCAgMHgwYiwgIDB4MWMsICAweDM0LCAgMHgxZCwgIDB4ZTgsICAweDMzLCAgMHgzMSwKKyAgMHhlMSwgIDB4NTUsICAweDE5LCAgMHhmZSwgIDB4YTYsICAweDEyLCAgMHg1NSwgIDB4MGEsICAweDRkLCAgMHgwMiwgIDB4NGMsICAweDAxLCAgMHgwYiwgIDB4MWMsICAweDM0LCAgMHgxZCwKKyAgMHhlOCwgIDB4MzMsICAweDMxLCAgMHhkZiwgIDB4MDcsICAweDE5LCAgMHgyMywgIDB4NGMsICAweDAxLCAgMHgwYiwgIDB4MWQsICAweGU4LCAgMHgzMywgIDB4MzEsICAweGZlLCAgMHhlOCwKKyAgMHgwOSwgIDB4ZmUsICAweGMyLCAgMHg0OSwgIDB4NTEsICAweDAzLCAgMHhmZSwgIDB4OWMsICAweDAwLCAgMHgyOCwgIDB4OGEsICAweDUzLCAgMHgwNSwgIDB4MWYsICAweDM1LCAgMHhhOSwKKyAgMHhmZSwgIDB4YmIsICAweDQ1LCAgMHg1NSwgIDB4MDAsICAweDRlLCAgMHg0NCwgIDB4MDYsICAweDdjLCAgMHg0MywgIDB4ZmUsICAweGRhLCAgMHgxNCwgIDB4MDEsICAweGFmLCAgMHg4YywKKyAgMHhmZSwgIDB4NGIsICAweDQ1LCAgMHhlZSwgIDB4MzIsICAweDA3LCAgMHhhNSwgIDB4ZWQsICAweDAzLCAgMHhjZCwgIDB4MjgsICAweDhhLCAgMHgwMywgIDB4NDUsICAweDI4LCAgMHgzNSwKKyAgMHg2NywgIDB4MDIsICAweDcyLCAgMHhmZSwgIDB4YzAsICAweDVkLCAgMHhmZSwgIDB4ZjgsICAweDE0LCAgMHhmZSwgIDB4MDMsICAweDE3LCAgMHgwMywgIDB4NWMsICAweGMxLCAgMHgwYywKKyAgMHg1YywgIDB4NjcsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDI2LCAgMHg4OSwgIDB4MDEsICAweGZlLCAgMHg5ZSwgIDB4MTUsICAweDAyLCAgMHg4OSwgIDB4MDEsICAweDBiLCAgMHgxYywKKyAgMHgzNCwgIDB4MWQsICAweDRjLCAgMHgzMywgIDB4MzEsICAweGRmLCAgMHgwNywgIDB4MDYsICAweDIzLCAgMHg0YywgIDB4MDEsICAweGYxLCAgMHhmZSwgIDB4NDIsICAweDU4LCAgMHhmMSwKKyAgMHhmZSwgIDB4YTQsICAweDE0LCAgMHg4YywgIDB4ZmUsICAweDRhLCAgMHhmNCwgIDB4MGEsICAweDE3LCAgMHg0YywgIDB4ZmUsICAweDRhLCAgMHhmNCwgIDB4MDYsICAweGVhLCAgMHgzMiwKKyAgMHgwNywgIDB4YTUsICAweDhiLCAgMHgwMiwgIDB4NzIsICAweDAzLCAgMHg0NSwgIDB4YzEsICAweDBjLCAgMHg0NSwgIDB4NjcsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDI2LCAgMHg4OSwKKyAgMHgwMSwgIDB4ZmUsICAweGNjLCAgMHgxNSwgIDB4MDIsICAweDg5LCAgMHgwZiwgIDB4MDYsICAweDI3LCAgMHhmZSwgIDB4YmUsICAweDEzLCAgMHgyNiwgIDB4ZmUsICAweGQ0LCAgMHgxMywKKyAgMHg3NiwgIDB4ZmUsICAweDg5LCAgMHg0OCwgIDB4MDEsICAweDBiLCAgMHgyMSwgIDB4NzYsICAweDA0LCAgMHg3YiwgIDB4ZmUsICAweGQwLCAgMHgxMywgIDB4MWMsICAweGZlLCAgMHhkMCwKKyAgMHgxMywgIDB4MWQsICAweGZlLCAgMHhiZSwgIDB4MTMsICAweDY3LCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHhmZSwgIDB4ZDUsICAweDEwLCAgMHgwZiwgIDB4NzEsICAweGZmLCAgMHgwMiwKKyAgMHgwMCwgIDB4NTcsICAweDUyLCAgMHg5MywgIDB4MWUsICAweGZlLCAgMHhmZiwgIDB4N2YsICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDA0LCAgMHgwZiwKKyAgMHg3MSwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDUyLCAgMHg5MywgIDB4MWUsICAweDQzLCAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwNCwKKyAgMHgwZiwgIDB4NzEsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4OTMsICAweDA0LCAgMHgwZiwgIDB4NzEsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwKKyAgMHg5MywgIDB4ZmUsICAweDBiLCAgMHg1OCwgIDB4MDQsICAweDA5LCAgMHg1YywgIDB4MDEsICAweDg3LCAgMHgwOSwgIDB4NDUsICAweDAxLCAgMHg4NywgIDB4MDQsICAweGZlLCAgMHgwMywKKyAgMHhhMSwgIDB4MWUsICAweDExLCAgMHhmZiwgIDB4MDMsICAweDAwLCAgMHg1NCwgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MWYsICAweDUyLCAgMHhmZSwgIDB4MDAsICAweDdkLCAgMHhmZSwKKyAgMHgwMSwgIDB4N2QsICAweGZlLCAgMHgwMiwgIDB4N2QsICAweGZlLCAgMHgwMywgIDB4N2MsICAweDZhLCAgMHgyYSwgIDB4MGMsICAweDVlLCAgMHgxNCwgIDB4NWYsICAweDU3LCAgMHgzZiwKKyAgMHg3ZCwgIDB4NDAsICAweDA0LCAgMHhkZCwgIDB4ZmUsICAweDgyLCAgMHg0YSwgIDB4ZmUsICAweGUxLCAgMHgxYSwgIDB4ZmUsICAweDgzLCAgMHg1YSwgIDB4OGQsICAweDA0LCAgMHgwMSwKKyAgMHhmZSwgIDB4MGMsICAweDE5LCAgMHhmZSwgIDB4NDIsICAweDQ4LCAgMHg1MCwgIDB4NTEsICAweDkxLCAgMHgwMSwgIDB4MGIsICAweDFkLCAgMHhmZSwgIDB4OTYsICAweDE1LCAgMHgzMywKKyAgMHgzMSwgIDB4ZTEsICAweDAxLCAgMHgwYiwgIDB4MWQsICAweGZlLCAgMHg5NiwgIDB4MTUsICAweDMzLCAgMHgzMSwgIDB4ZmUsICAweGU4LCAgMHgwYSwgIDB4ZmUsICAweGMxLCAgMHg1OSwKKyAgMHgwMywgIDB4Y2QsICAweDI4LCAgMHhmZSwgIDB4Y2MsICAweDEyLCAgMHg1MywgIDB4MDUsICAweDFhLCAgMHhmZSwgIDB4YzQsICAweDEzLCAgMHgyMSwgIDB4NjksICAweDFhLCAgMHhlZSwKKyAgMHg1NSwgIDB4Y2EsICAweDZiLCAgMHhmZSwgIDB4ZGMsICAweDE0LCAgMHg0ZCwgIDB4MGYsICAweDA2LCAgMHgxOCwgIDB4Y2EsICAweDdjLCAgMHgzMCwgIDB4ZmUsICAweDc4LCAgMHgxMCwKKyAgMHhmZiwgIDB4MDIsICAweDgzLCAgMHg1NSwgIDB4YWIsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHg2OSwgIDB4MTksICAweGFlLCAgMHg5OCwgIDB4ZmUsICAweDMwLCAgMHgwMCwKKyAgMHg5NiwgIDB4ZjIsICAweDE4LCAgMHg2ZCwgIDB4MGYsICAweDA2LCAgMHhmZSwgIDB4NTYsICAweDEwLCAgMHg2OSwgIDB4MGEsICAweGVkLCAgMHg5OCwgIDB4ZmUsICAweDY0LCAgMHgwMCwKKyAgMHg5NiwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4NjQsICAweDAwLCAgMHgxOCwgIDB4OWUsICAweDBmLCAgMHgwNiwgIDB4ZmUsICAweDI4LCAgMHgxMCwgIDB4NjksICAweDA2LCAgMHhmZSwKKyAgMHg2MCwgIDB4MTMsICAweDk4LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHg5NiwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHgxOCwgIDB4NTksICAweDBmLCAgMHgwNiwKKyAgMHg4OCwgIDB4OTgsICAweGZlLCAgMHg5MCwgIDB4MDEsICAweDdhLCAgMHhmZSwgIDB4NDIsICAweDE1LCAgMHg5MSwgIDB4ZTQsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDlmLCAgMHhmZSwKKyAgMHg1NiwgIDB4ZjAsICAweGZlLCAgMHg1NCwgIDB4MTUsICAweGZlLCAgMHgwNCwgIDB4ZjQsICAweDcxLCAgMHhmZSwgIDB4NDMsICAweGY0LCAgMHg5ZSwgIDB4ZmUsICAweGYzLCAgMHgxMCwKKyAgMHhmZSwgIDB4NDAsICAweDVjLCAgMHgwMSwgIDB4ZmUsICAweDE2LCAgMHgxNCwgIDB4MWUsICAweDQzLCAgMHhlYywgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwKKyAgMHg2ZSwgIDB4N2EsICAweGZlLCAgMHg5MCwgIDB4MTUsICAweGM0LCAgMHg2ZSwgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweDAwLCAgMHgxNywgIDB4ZmUsICAweDRkLCAgMHhlNCwKKyAgMHhjYywgIDB4N2EsICAweGZlLCAgMHg5MCwgIDB4MTUsICAweGM0LCAgMHhjYywgIDB4ODgsICAweDUxLCAgMHgyMSwgIDB4ZmUsICAweDRkLCAgMHhmNCwgIDB4MDAsICAweGU5LCAgMHg5MSwKKyAgMHgwZiwgIDB4MDYsICAweGZlLCAgMHhiNCwgIDB4NTYsICAweGZlLCAgMHhjMywgIDB4NTgsICAweDA0LCAgMHg1MSwgIDB4MGYsICAweDBhLCAgMHgwNCwgIDB4MTYsICAweDA2LCAgMHgwMSwKKyAgMHgwYiwgIDB4MjYsICAweGYzLCAgMHgxNiwgIDB4MGEsICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGYzLCAgMHgxNiwgIDB4MTksICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGYzLCAgMHg3NiwKKyAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MGIsICAweDA0LCAgMHgxNiwgIDB4MDYsICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGIxLCAgMHgxNiwgIDB4MTksICAweDAxLCAgMHgwYiwKKyAgMHgyNiwgIDB4YjEsICAweDE2LCAgMHgwNiwgIDB4MDEsICAweDBiLCAgMHgyNiwgIDB4YjEsICAweGZlLCAgMHg4OSwgIDB4NDksICAweDAxLCAgMHgwYiwgIDB4MjYsICAweGIxLCAgMHg3NiwKKyAgMHhmZSwgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MGIsICAweDA0LCAgMHg1MSwgIDB4MDQsICAweDIyLCAgMHhkMywgIDB4MDcsICAweDA2LCAgMHhmZSwgIDB4NDgsICAweDEzLCAgMHhiOCwKKyAgMHgxMywgIDB4ZDMsICAweGZlLCAgMHg0OSwgIDB4ZjQsICAweDAwLCAgMHg0ZCwgIDB4NzYsICAweGE5LCAgMHg2NywgIDB4ZmUsICAweDAxLCAgMHhlYywgIDB4ZmUsICAweDI3LCAgMHgwMSwKKyAgMHhmZSwgIDB4ODksICAweDQ4LCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MjcsICAweGZlLCAgMHgyZSwgIDB4MTYsICAweDMyLCAgMHgwNywgIDB4ZmUsICAweGUzLCAgMHgwMCwKKyAgMHhmZSwgIDB4MjAsICAweDEzLCAgMHgxZCwgIDB4ZmUsICAweDUyLCAgMHgxNiwgIDB4MjEsICAweDEzLCAgMHhkNCwgIDB4MDEsICAweDRiLCAgMHgyMiwgIDB4ZDQsICAweDA3LCAgMHgwNiwKKyAgMHg0ZSwgIDB4MDgsICAweDU0LCAgMHgwNiwgIDB4MzcsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4ZmIsICAweDhlLCAgMHgwNywgIDB4MTEsICAweGFlLCAgMHgwOSwKKyAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHg4ZSwgIDB4MDksICAweDVkLCAgMHgwMSwgIDB4YTgsICAweDA0LCAgMHgwOSwgIDB4ODQsICAweDAxLCAgMHgwZSwgIDB4OGUsICAweGZlLCAgMHg4MCwKKyAgMHhlNywgIDB4MTEsICAweDA3LCAgMHgxMSwgIDB4OGEsICAweGZlLCAgMHg0NSwgIDB4NTgsICAweDAxLCAgMHhmMCwgIDB4OGUsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwKKyAgMHg4ZSwgIDB4MDksICAweDVkLCAgMHgwMSwgIDB4YTgsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDgwLCAgMHg4MCwgIDB4ZmUsICAweDgwLCAgMHg0YywKKyAgMHhmZSwgIDB4NDksICAweGU0LCAgMHgxMSwgIDB4YWUsICAweDA5LCAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDRjLCAgMHgwOSwgIDB4NWQsICAweDAxLCAgMHg4NywKKyAgMHgwNCwgIDB4MTgsICAweDExLCAgMHg3NSwgIDB4NmMsICAweGZlLCAgMHg2MCwgIDB4MDEsICAweGZlLCAgMHgxOCwgIDB4ZGYsICAweGZlLCAgMHgxOSwgIDB4ZGUsICAweGZlLCAgMHgyNCwKKyAgMHgxYywgIDB4ZmUsICAweDFkLCAgMHhmNywgIDB4MWIsICAweDk3LCAgMHhmZSwgIDB4ZWUsICAweDE2LCAgMHgwMSwgIDB4ZmUsICAweGY0LCAgMHgxNywgIDB4YWQsICAweDlhLCAgMHgxYiwKKyAgMHg2YywgIDB4ZmUsICAweDJjLCAgMHgwMSwgIDB4ZmUsICAweDJmLCAgMHgxOSwgIDB4MDQsICAweGI5LCAgMHgyMywgIDB4ZmUsICAweGRlLCAgMHgxNiwgIDB4ZmUsICAweGRhLCAgMHgxMCwKKyAgMHgxOCwgIDB4MTEsICAweDc1LCAgMHgwMywgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MWYsICAweGZlLCAgMHgxOCwgIDB4NTgsICAweDAzLCAgMHhmZSwKKyAgMHg2NiwgIDB4MDEsICAweGZlLCAgMHgxOSwgIDB4NTgsICAweDlhLCAgMHgxZiwgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MDYsICAweGZlLCAgMHgzYywKKyAgMHg1MCwgIDB4NmMsICAweGZlLCAgMHgzOCwgIDB4MDAsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDFmLCAgMHg5NywgIDB4ZmUsICAweDM4LCAgMHgxNywKKyAgMHhmZSwgIDB4YjYsICAweDE0LCAgMHgzNSwgIDB4MDQsICAweGI5LCAgMHgyMywgIDB4ZmUsICAweDEwLCAgMHgxNywgIDB4ZmUsICAweDljLCAgMHgxMCwgIDB4MTgsICAweDExLCAgMHg3NSwKKyAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgyZSwgIDB4OTcsICAweGZlLCAgMHg1YSwKKyAgMHgxNywgIDB4ZmUsICAweDk0LCAgMHgxNCwgIDB4ZWMsICAweDlhLCAgMHgyZSwgIDB4NmMsICAweDFhLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsICAweGU3LCAgMHgwMCwKKyAgMHgwNCwgIDB4YjksICAweDIzLCAgMHhmZSwgIDB4NGUsICAweDE3LCAgMHhmZSwgIDB4NmMsICAweDEwLCAgMHgxOCwgIDB4MTEsICAweDc1LCAgMHhmZSwgIDB4MzAsICAweGJjLCAgMHhmZSwKKyAgMHhiMiwgIDB4YmMsICAweDlhLCAgMHhjYiwgIDB4NmMsICAweDFhLCAgMHhmZSwgIDB4MGYsICAweDc5LCAgMHhmZSwgIDB4MWMsICAweGY3LCAgMHhjYiwgIDB4OTcsICAweGZlLCAgMHg5MiwKKyAgMHgxNywgIDB4ZmUsICAweDVjLCAgMHgxNCwgIDB4MzUsICAweDA0LCAgMHhiOSwgIDB4MjMsICAweGZlLCAgMHg3ZSwgIDB4MTcsICAweGZlLCAgMHg0MiwgIDB4MTAsICAweGZlLCAgMHgwMiwKKyAgMHhmNiwgIDB4MTEsICAweDc1LCAgMHhmZSwgIDB4MTgsICAweGZlLCAgMHg2MCwgIDB4ZmUsICAweDE5LCAgMHhmZSwgIDB4NjEsICAweGZlLCAgMHgwMywgIDB4YTEsICAweGZlLCAgMHgxZCwKKyAgMHhmNywgIDB4NWIsICAweDk3LCAgMHhmZSwgIDB4YjgsICAweDE3LCAgMHhmZSwgIDB4MzYsICAweDE0LCAgMHhmZSwgIDB4MWMsICAweDEzLCAgMHg5YSwgIDB4NWIsICAweDQxLCAgMHhmZSwKKyAgMHg4MywgIDB4NTgsICAweGZlLCAgMHhhZiwgIDB4MTksICAweGZlLCAgMHg4MCwgIDB4ZTcsICAweDExLCAgMHhmZSwgIDB4ODEsICAweGU3LCAgMHgxMSwgIDB4MTIsICAweGZlLCAgMHhkZCwKKyAgMHgwMCwgIDB4NmEsICAweDJhLCAgMHgwNCwgIDB4NmEsICAweDJhLCAgMHhmZSwgIDB4MTIsICAweDQ1LCAgMHgyMywgIDB4ZmUsICAweGE4LCAgMHgxNywgIDB4MTUsICAweDA2LCAgMHgzOSwKKyAgMHhhMCwgIDB4YjQsICAweDAyLCAgMHgyYiwgIDB4ZmUsICAweDM5LCAgMHhmMCwgIDB4ZmUsICAweGZjLCAgMHgxNywgIDB4MjEsICAweDA0LCAgMHhmZSwgIDB4N2UsICAweDE4LCAgMHgxZSwKKyAgMHgxOSwgIDB4NjYsICAweDBmLCAgMHgwZCwgIDB4MDQsICAweDc1LCAgMHgwMywgIDB4ZDIsICAweDFlLCAgMHgwNiwgIDB4ZmUsICAweGVmLCAgMHgxMiwgIDB4ZmUsICAweGUxLCAgMHgxMCwKKyAgMHg3YywgIDB4NmYsICAweDRmLCAgMHgzMiwgIDB4MDcsICAweDJmLCAgMHhmZSwgIDB4M2MsICAweDEzLCAgMHhmMSwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4NDIsICAweDkyLCAgMHgwOSwKKyAgMHg0OCwgIDB4MDEsICAweDBlLCAgMHhiYiwgIDB4ZWIsICAweGZlLCAgMHg0MSwgIDB4NDgsICAweGZlLCAgMHg0NSwgIDB4NDgsICAweDAxLCAgMHhmMCwgIDB4ZmUsICAweDAwLCAgMHhjYywKKyAgMHhiYiwgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4NDMsICAweDc4LCAgMHgwNywgIDB4MTEsICAweGFjLCAgMHgwOSwgIDB4ODQsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDgwLCAgMHg0YywKKyAgMHgwMSwgIDB4NzMsICAweGZlLCAgMHgxNiwgIDB4MTAsICAweDA3LCAgMHg4MiwgIDB4OGIsICAweGZlLCAgMHg0MCwgIDB4MTQsICAweGZlLCAgMHgyNCwgIDB4MTIsICAweGZlLCAgMHgxNCwKKyAgMHg1NiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDFjLCAgMHgxOCwgIDB4MTgsICAweDBhLCAgMHgwNCwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MGEsICAweDEwLCAgMHhmZSwKKyAgMHgxNSwgIDB4MDAsICAweDY0LCAgMHg3OSwgIDB4MmEsICAweDAxLCAgMHhlMywgIDB4MTgsICAweDA2LCAgMHgwNCwgIDB4NDIsICAweDkyLCAgMHgwOCwgIDB4NTQsICAweDFiLCAgMHgzNywKKyAgMHgxMiwgIDB4MmYsICAweDAxLCAgMHg3MywgIDB4MTgsICAweDA2LCAgMHgwNCwgIDB4ZmUsICAweDM4LCAgMHg5MCwgIDB4ZmUsICAweGJhLCAgMHg5MCwgIDB4M2EsICAweGNlLCAgMHgzYiwKKyAgMHhjZiwgIDB4ZmUsICAweDQ4LCAgMHg1NSwgIDB4MzUsICAweGZlLCAgMHhjOSwgIDB4NTUsICAweDA0LCAgMHgyMiwgIDB4YTMsICAweDc3LCAgMHgxMywgIDB4YTMsICAweDA0LCAgMHgwOSwKKyAgMHhhNCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDEsICAweDQ4LCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDQ5LCAgMHg0NCwgIDB4MTcsICAweGZlLCAgMHhlOCwKKyAgMHgxOCwgIDB4NzcsICAweDc4LCAgMHgwNCwgIDB4MDksICAweDQ4LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgxMSwgIDB4NGUsICAweDA5LCAgMHg1ZCwgIDB4MDEsICAweGE4LCAgMHgwOSwKKyAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHg3NywgIDB4NzgsICAweDA0LCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHgxOSwgIDB4NmIsICAweGZlLCAgMHgxYywgIDB4MTksICAweDAzLCAgMHhmZSwKKyAgMHg5MCwgIDB4MDAsICAweGZlLCAgMHgzYSwgIDB4NDUsICAweGZlLCAgMHgyYywgIDB4MTAsICAweGZlLCAgMHg0ZSwgIDB4ZTQsICAweGM5LCAgMHg2YiwgIDB4ZmUsICAweDJlLCAgMHgxOSwKKyAgMHgwMywgIDB4ZmUsICAweDkyLCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4MWEsICAweGU1LCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhmZSwgIDB4MGIsICAweDAwLCAgMHg2YiwKKyAgMHhmZSwgIDB4NDAsICAweDE5LCAgMHgwMywgIDB4ZmUsICAweDk0LCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4MWYsICAweGZlLCAgMHgwOCwgIDB4MTAsICAweDAzLCAgMHhmZSwKKyAgMHg5NiwgIDB4MDAsICAweGZlLCAgMHgwMiwgIDB4ZTYsICAweDZkLCAgMHhmZSwgIDB4NGUsICAweDQ1LCAgMHhlYSwgIDB4YmEsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhlNywKKyAgMHgxZSwgIDB4NmUsICAweGZlLCAgMHgwOCwgIDB4MWMsICAweGZlLCAgMHg2NywgIDB4MTksICAweGZlLCAgMHgwYSwgIDB4MWMsICAweGZlLCAgMHgxYSwgIDB4ZjQsICAweGZlLCAgMHgwMCwKKyAgMHgwNCwgIDB4ZWEsICAweGZlLCAgMHg0OCwgIDB4ZjQsICAweDE5LCAgMHg3YSwgIDB4ZmUsICAweDc0LCAgMHgxOSwgIDB4MGYsICAweDE5LCAgMHgwNCwgIDB4MDcsICAweDdlLCAgMHhmZSwKKyAgMHg1YSwgIDB4ZjAsICAweGZlLCAgMHg4NCwgIDB4MTksICAweDI1LCAgMHhmZSwgIDB4MDksICAweDAwLCAgMHhmZSwgIDB4MzQsICAweDEwLCAgMHgwNywgIDB4MWEsICAweGZlLCAgMHg1YSwKKyAgMHhmMCwgIDB4ZmUsICAweDkyLCAgMHgxOSwgIDB4MjUsICAweGNhLCAgMHhmZSwgIDB4MjYsICAweDEwLCAgMHgwNywgIDB4MTksICAweDY2LCAgMHgyNSwgIDB4NmQsICAweGU1LCAgMHgwNywKKyAgMHgwYSwgIDB4NjYsICAweDI1LCAgMHg5ZSwgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDA2LCAgMHg2NiwgIDB4MjUsICAweDU5LCAgMHhhOSwgIDB4YjgsICAweDA0LCAgMHgxNSwKKyAgMHhmZSwgIDB4MDksICAweDAwLCAgMHgwMSwgIDB4MzYsICAweGZlLCAgMHgwNCwgIDB4ZmUsICAweDgxLCAgMHgwMywgIDB4ODMsICAweGZlLCAgMHg0MCwgIDB4NWMsICAweDA0LCAgMHgxYywKKyAgMHhmNywgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MGIsICAweDI3LCAgMHhmZSwgIDB4ZDYsICAweDE5LCAgMHgxYywgIDB4ZjcsICAweDdiLCAgMHhmNywgIDB4ZmUsICAweDgyLCAgMHhmMCwKKyAgMHhmZSwgIDB4ZGEsICAweDE5LCAgMHgwNCwgIDB4ZmYsICAweGNjLCAgMHgwMCwgIDB4MDAsCit9OworCitTVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzOEMwODAwX3NpemUgPQorICAgICAgICBzaXplb2YoX2Fkdl9hc2MzOEMwODAwX2J1Zik7IC8qIDB4MTRFMSAqLworU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzhDMDgwMF9jaGtzdW0gPQorICAgICAgICAweDA1MEQzRkQ4VUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCisKKy8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCitTVEFUSUMgdW5zaWduZWQgY2hhciBfYWR2X2FzYzM4QzE2MDBfYnVmW10gPSB7CisgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4ZjIsICAweDAwLCAgMHgxNiwgIDB4MDAsICAweGZjLCAgMHgwMCwgIDB4MTAsICAweDAwLCAgMHhmMCwgIDB4MTgsICAweGU0LCAgMHgwMSwgIDB4MDAsCisgIDB4MDQsICAweDFlLCAgMHg0OCwgIDB4ZTQsICAweDAzLCAgMHhmNiwgIDB4ZjcsICAweDEzLCAgMHgyZSwgIDB4MWUsICAweDAyLCAgMHgwMCwgIDB4MDcsICAweDE3LCAgMHhjMCwgIDB4NWYsCisgIDB4MDAsICAweGZhLCAgMHhmZiwgIDB4ZmYsICAweDA0LCAgMHgwMCwgIDB4MDAsICAweGY2LCAgMHgwOSwgIDB4ZTcsICAweDgyLCAgMHhlNywgIDB4ODUsICAweGYwLCAgMHg4NiwgIDB4ZjAsCisgIDB4NGUsICAweDEwLCAgMHg5ZSwgIDB4ZTcsICAweGZmLCAgMHgwMCwgIDB4NTUsICAweGYwLCAgMHgwMSwgIDB4ZjYsICAweDAzLCAgMHgwMCwgIDB4OTgsICAweDU3LCAgMHgwMSwgIDB4ZTYsCisgIDB4MDAsICAweGVhLCAgMHgwMCwgIDB4ZWMsICAweDAxLCAgMHhmYSwgIDB4MTgsICAweGY0LCAgMHgwOCwgIDB4MDAsICAweGYwLCAgMHgxZCwgIDB4MzgsICAweDU0LCAgMHgzMiwgIDB4ZjAsCisgIDB4MTAsICAweDAwLCAgMHhjMiwgIDB4MGUsICAweDFlLCAgMHhmMCwgIDB4ZDUsICAweGYwLCAgMHhiYywgIDB4MDAsICAweDRiLCAgMHhlNCwgIDB4MDAsICAweGU2LCAgMHhiMSwgIDB4ZjAsCisgIDB4YjQsICAweDAwLCAgMHgwMiwgIDB4MTMsICAweDNlLCAgMHgxYywgIDB4YzgsICAweDQ3LCAgMHgzZSwgIDB4MDAsICAweGQ4LCAgMHgwMSwgIDB4MDYsICAweDEzLCAgMHgwYywgIDB4MWMsCisgIDB4NWUsICAweDFlLCAgMHgwMCwgIDB4NTcsICAweGM4LCAgMHg1NywgIDB4MDEsICAweGZjLCAgMHhiYywgIDB4MGUsICAweGEyLCAgMHgxMiwgIDB4YjksICAweDU0LCAgMHgwMCwgIDB4ODAsCisgIDB4NjIsICAweDBhLCAgMHg1YSwgIDB4MTIsICAweGM4LCAgMHgxNSwgIDB4M2UsICAweDFlLCAgMHgxOCwgIDB4NDAsICAweGJkLCAgMHg1NiwgIDB4MDMsICAweGU2LCAgMHgwMSwgIDB4ZWEsCisgIDB4NWMsICAweGYwLCAgMHgwZiwgIDB4MDAsICAweDIwLCAgMHgwMCwgIDB4NmMsICAweDAxLCAgMHg2ZSwgIDB4MDEsICAweDA0LCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHhiYiwgIDB4NTUsCisgIDB4M2MsICAweDU2LCAgMHgzZSwgIDB4NTcsICAweDAzLCAgMHg1OCwgIDB4NGEsICAweGU0LCAgMHg0MCwgIDB4MDAsICAweGI2LCAgMHgwMCwgIDB4YmIsICAweDAwLCAgMHhjMCwgIDB4MDAsCisgIDB4MDAsICAweDAxLCAgMHgwMSwgIDB4MDEsICAweDNlLCAgMHgwMSwgIDB4NTgsICAweDBhLCAgMHg0NCwgIDB4MTAsICAweDBhLCAgMHgxMiwgIDB4NGMsICAweDFjLCAgMHg0ZSwgIDB4MWMsCisgIDB4MDIsICAweDRhLCAgMHgzMCwgIDB4ZTQsICAweDA1LCAgMHhlNiwgIDB4MGMsICAweDAwLCAgMHgzYywgIDB4MDAsICAweDgwLCAgMHgwMCwgIDB4MjQsICAweDAxLCAgMHgzYywgIDB4MDEsCisgIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsICAweDcwLCAgMHgwMSwgIDB4NzIsICAweDAxLCAgMHg3NCwgIDB4MDEsICAweDc2LCAgMHgwMSwgIDB4NzgsICAweDAxLCAgMHg3YywgIDB4MDEsCisgIDB4YzYsICAweDBlLCAgMHgwYywgIDB4MTAsICAweGFjLCAgMHgxMiwgIDB4YWUsICAweDEyLCAgMHgxNiwgIDB4MWEsICAweDMyLCAgMHgxYywgIDB4NmUsICAweDFlLCAgMHgwMiwgIDB4NDgsCisgIDB4M2EsICAweDU1LCAgMHhjOSwgIDB4NTcsICAweDAyLCAgMHhlZSwgIDB4NWIsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDA2LCAgMHhmNywgIDB4MDMsICAweGZjLCAgMHgwNiwgIDB4MDAsCisgIDB4MWUsICAweDAwLCAgMHhiZSwgIDB4MDAsICAweGUxLCAgMHgwMCwgIDB4MGMsICAweDEyLCAgMHgxOCwgIDB4MWEsICAweDcwLCAgMHgxYSwgIDB4MzAsICAweDFjLCAgMHgzOCwgIDB4MWMsCisgIDB4MTAsICAweDQ0LCAgMHgwMCwgIDB4NGMsICAweGIwLCAgMHg1NywgIDB4NDAsICAweDVjLCAgMHg0ZCwgIDB4ZTQsICAweDA0LCAgMHhlYSwgIDB4NWQsICAweGYwLCAgMHhhNywgIDB4ZjAsCisgIDB4MDQsICAweGY2LCAgMHgwMiwgIDB4ZmMsICAweDA1LCAgMHgwMCwgIDB4MDksICAweDAwLCAgMHgxOSwgIDB4MDAsICAweDMyLCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHgzNCwgIDB4MDAsCisgIDB4MzYsICAweDAwLCAgMHg5OCwgIDB4MDAsICAweDllLCAgMHgwMCwgIDB4Y2MsICAweDAwLCAgMHgyMCwgIDB4MDEsICAweDRlLCAgMHgwMSwgIDB4NzksICAweDAxLCAgMHgzYywgIDB4MDksCisgIDB4NjgsICAweDBkLCAgMHgwMiwgIDB4MTAsICAweDA0LCAgMHgxMCwgIDB4M2EsICAweDEwLCAgMHgwOCwgIDB4MTIsICAweDBhLCAgMHgxMywgIDB4NDAsICAweDE2LCAgMHg1MCwgIDB4MTYsCisgIDB4MDAsICAweDE3LCAgMHg0YSwgIDB4MTksICAweDAwLCAgMHg0ZSwgIDB4MDAsICAweDU0LCAgMHgwMSwgIDB4NTgsICAweDAwLCAgMHhkYywgIDB4MDUsICAweGYwLCAgMHgwOSwgIDB4ZjAsCisgIDB4NTksICAweGYwLCAgMHhiOCwgIDB4ZjAsICAweDQ4LCAgMHhmNCwgIDB4MGUsICAweGY3LCAgMHgwYSwgIDB4MDAsICAweDliLCAgMHgwMCwgIDB4OWMsICAweDAwLCAgMHhhNCwgIDB4MDAsCisgIDB4YjUsICAweDAwLCAgMHhiYSwgIDB4MDAsICAweGQwLCAgMHgwMCwgIDB4ZTcsICAweDAwLCAgMHhmMCwgIDB4MDMsICAweDY5LCAgMHgwOCwgIDB4ZTksICAweDA5LCAgMHg1YywgIDB4MGMsCisgIDB4YjYsICAweDEyLCAgMHhiYywgIDB4MTksICAweGQ4LCAgMHgxYiwgIDB4MjAsICAweDFjLCAgMHgzNCwgIDB4MWMsICAweDM2LCAgMHgxYywgIDB4NDIsICAweDFkLCAgMHgwOCwgIDB4NDQsCisgIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwgIDB4NDgsICAweDQ2LCAgMHg4OSwgIDB4NDgsICAweDY4LCAgMHg1NCwgIDB4ODMsICAweDU1LCAgMHg4MywgIDB4NTksCisgIDB4MzEsICAweGU0LCAgMHgwMiwgIDB4ZTYsICAweDA3LCAgMHhmMCwgIDB4MDgsICAweGYwLCAgMHgwYiwgIDB4ZjAsICAweDBjLCAgMHhmMCwgIDB4NGIsICAweGY0LCAgMHgwNCwgIDB4ZjgsCisgIDB4MDUsICAweGY4LCAgMHgwMiwgIDB4ZmEsICAweDAzLCAgMHhmYSwgIDB4MDQsICAweGZjLCAgMHgwNSwgIDB4ZmMsICAweDA3LCAgMHgwMCwgIDB4YTgsICAweDAwLCAgMHhhYSwgIDB4MDAsCisgIDB4YjksICAweDAwLCAgMHhlMCwgIDB4MDAsICAweGU1LCAgMHgwMCwgIDB4MjIsICAweDAxLCAgMHgyNiwgIDB4MDEsICAweDYwLCAgMHgwMSwgIDB4N2EsICAweDAxLCAgMHg4MiwgIDB4MDEsCisgIDB4YzgsICAweDAxLCAgMHhjYSwgIDB4MDEsICAweDg2LCAgMHgwMiwgIDB4NmEsICAweDAzLCAgMHgxOCwgIDB4MDUsICAweGIyLCAgMHgwNywgIDB4NjgsICAweDA4LCAgMHgxMCwgIDB4MGQsCisgIDB4MDYsICAweDEwLCAgMHgwYSwgIDB4MTAsICAweDBlLCAgMHgxMCwgIDB4MTIsICAweDEwLCAgMHg2MCwgIDB4MTAsICAweGVkLCAgMHgxMCwgIDB4ZjMsICAweDEwLCAgMHgwNiwgIDB4MTIsCisgIDB4MTAsICAweDEyLCAgMHgxZSwgIDB4MTIsICAweDBjLCAgMHgxMywgIDB4MGUsICAweDEzLCAgMHgxMCwgIDB4MTMsICAweGZlLCAgMHg5YywgIDB4ZjAsICAweDM1LCAgMHgwNSwgIDB4ZmUsCisgIDB4ZWMsICAweDBlLCAgMHhmZiwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZTksICAweGZlLCAgMHgzNCwgIDB4MWYsICAweDAwLCAgMHhlOCwgIDB4ZmUsICAweDg4LCAgMHgwMSwgIDB4ZmYsCisgIDB4MDMsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDkzLCAgMHgxNSwgIDB4ZmUsICAweDBmLCAgMHgwNSwgIDB4ZmYsICAweDM4LCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg1NywgIDB4MjQsCisgIDB4MDAsICAweGZlLCAgMHg0YywgIDB4MDAsICAweDY1LCAgMHhmZiwgIDB4MDQsICAweDAwLCAgMHgwMCwgIDB4MWEsICAweGZmLCAgMHgwOSwgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MDgsCisgIDB4MDEsICAweDAxLCAgMHhmZiwgIDB4MDgsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDI3LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgxMCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MTMsCisgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NzgsICAweDU2LCAgMHhmZSwgIDB4MzQsICAweDEyLCAgMHhmZiwgIDB4MjEsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4ZTgsCisgIDB4MzcsICAweDdkLCAgMHgwZCwgIDB4MDEsICAweGZlLCAgMHg0YSwgIDB4MTEsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGU4LCAgMHg3ZCwgIDB4MGQsICAweDUxLCAgMHgzNywgIDB4ZmUsCisgIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MGMsICAweDAyLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhiYywgIDB4ZmUsICAweDkxLCAgMHhmMCwgIDB4ZmUsICAweGY4LCAgMHgwMSwgIDB4ZmUsCisgIDB4OTAsICAweGYwLCAgMHhmZSwgIDB4ZjgsICAweDAxLCAgMHhmZSwgIDB4OGYsICAweGYwLCAgMHhiYywgIDB4MDMsICAweDY3LCAgMHg0ZCwgIDB4MDUsICAweGZlLCAgMHgwOCwgIDB4MGYsCisgIDB4MDEsICAweGZlLCAgMHg3OCwgIDB4MGYsICAweGZlLCAgMHhkZCwgIDB4MTIsICAweDA1LCAgMHhmZSwgIDB4MGUsICAweDAzLCAgMHhmZSwgIDB4MjgsICAweDFjLCAgMHgwMywgIDB4ZmUsCisgIDB4YTYsICAweDAwLCAgMHhmZSwgIDB4ZDEsICAweDEyLCAgMHgzZSwgIDB4MjIsICAweGZlLCAgMHhhNiwgIDB4MDAsICAweGFjLCAgMHhmZSwgIDB4NDgsICAweGYwLCAgMHhmZSwgIDB4OTAsCisgIDB4MDIsICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHhhYSwgIDB4MDIsICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHhjOCwgIDB4MDIsICAweGZlLCAgMHg0NiwgIDB4ZjAsCisgIDB4ZmUsICAweDVhLCAgMHgwMiwgIDB4ZmUsICAweDQ3LCAgMHhmMCwgIDB4ZmUsICAweDYwLCAgMHgwMiwgIDB4ZmUsICAweDQzLCAgMHhmMCwgIDB4ZmUsICAweDRlLCAgMHgwMiwgIDB4ZmUsCisgIDB4NDQsICAweGYwLCAgMHhmZSwgIDB4NTIsICAweDAyLCAgMHhmZSwgIDB4NDUsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDAyLCAgMHgxYywgIDB4MGQsICAweGEyLCAgMHgxYywgIDB4MDcsCisgIDB4MjIsICAweGI3LCAgMHgwNSwgIDB4MzUsICAweGZlLCAgMHgwMCwgIDB4MWMsICAweGZlLCAgMHhmMSwgIDB4MTAsICAweGZlLCAgMHgwMiwgIDB4MWMsICAweGY1LCAgMHhmZSwgIDB4MWUsCisgIDB4MWMsICAweGZlLCAgMHhlOSwgIDB4MTAsICAweDAxLCAgMHg1ZiwgIDB4ZmUsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDA2LCAgMHhmYywgIDB4ZGUsICAweDBhLCAgMHg4MSwgIDB4MDEsCisgIDB4YTMsICAweDA1LCAgMHgzNSwgIDB4MWYsICAweDk1LCAgMHg0NywgIDB4YjgsICAweDAxLCAgMHhmZSwgIDB4ZTQsICAweDExLCAgMHgwYSwgIDB4ODEsICAweDAxLCAgMHg1YywgIDB4ZmUsCisgIDB4YmQsICAweDEwLCAgMHgwYSwgIDB4ODEsICAweDAxLCAgMHg1YywgIDB4ZmUsICAweGFkLCAgMHgxMCwgIDB4ZmUsICAweDE2LCAgMHgxYywgIDB4ZmUsICAweDU4LCAgMHgxYywgIDB4MWMsCisgIDB4MDcsICAweDIyLCAgMHhiNywgIDB4MzcsICAweDJhLCAgMHgzNSwgIDB4ZmUsICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwMiwgIDB4MmIsICAweGZlLCAgMHg5ZSwgIDB4MDIsCisgIDB4ZmUsICAweDVhLCAgMHgxYywgIDB4ZmUsICAweDEyLCAgMHgxYywgIDB4ZmUsICAweDE0LCAgMHgxYywgIDB4MWYsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDQ3LCAgMHhiOCwgIDB4MDEsCisgIDB4ZmUsICAweGQ0LCAgMHgxMSwgIDB4MWMsICAweDA3LCAgMHgyMiwgIDB4YjcsICAweDA1LCAgMHhlOSwgIDB4MjEsICAweDJjLCAgMHgwOSwgIDB4MWEsICAweDMxLCAgMHhmZSwgIDB4NjksCisgIDB4MTAsICAweDFjLCAgMHgwNywgIDB4MjIsICAweGI3LCAgMHhmZSwgIDB4MDQsICAweGVjLCAgMHgyYywgIDB4NjAsICAweDAxLCAgMHhmZSwgIDB4MWUsICAweDFlLCAgMHgyMCwgIDB4MmMsCisgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZGUsICAweDAxLCAgMHhmZSwgIDB4NjIsICAweDFiLCAgMHgwMSwgIDB4MGMsICAweDYxLCAgMHg0YSwgIDB4NDQsICAweDE1LCAgMHg1NiwgIDB4NTEsCisgIDB4MDEsICAweGZlLCAgMHg5ZSwgIDB4MWUsICAweDAxLCAgMHhmZSwgIDB4OTYsICAweDFhLCAgMHgwNSwgIDB4MzUsICAweDBhLCAgMHg1NywgIDB4MDEsICAweDE4LCAgMHgwOSwgIDB4MDAsCisgIDB4MzYsICAweDAxLCAgMHg4NSwgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MGEsICAweGJhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHhjOCwgIDB4NTQsCisgIDB4N2IsICAweGZlLCAgMHgxYywgIDB4MDMsICAweDAxLCAgMHhmZSwgIDB4OTYsICAweDFhLCAgMHgwNSwgIDB4MzUsICAweDM3LCAgMHg2MCwgIDB4ZmUsICAweDAyLCAgMHhlOCwgIDB4MzAsCisgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDllLCAgMHg0MywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDI3LCAgMHhmMCwgIDB4ZmUsICAweGU0LCAgMHgwMSwgIDB4ZmUsCisgIDB4MDcsICAweDRiLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhiYywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MmEsICAweGViLCAgMHhmZSwgIDB4MjYsICAweGYwLCAgMHhmZSwgIDB4NjYsCisgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg1NCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsICAweGJjLCAgMHhmZSwgIDB4ZWYsICAweDEwLCAgMHhmZSwgIDB4OWYsCisgIDB4ZjAsICAweGZlLCAgMHg3NCwgIDB4MDMsICAweGZlLCAgMHg0NiwgIDB4MWMsICAweDE5LCAgMHhmZSwgIDB4MTEsICAweDAwLCAgMHgwNSwgIDB4NzAsICAweDM3LCAgMHhmZSwgIDB4NDgsCisgIDB4MWMsICAweGZlLCAgMHg0NiwgIDB4MWMsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDI4LCAgMHhmZSwgIDB4MTgsICAweDEzLCAgMHgyNiwgIDB4MjEsICAweGI5LCAgMHhjNywgIDB4MjAsCisgIDB4YjksICAweDBhLCAgMHg1NywgIDB4MDEsICAweDE4LCAgMHhjNywgIDB4ODksICAweDAxLCAgMHhmZSwgIDB4YzgsICAweDFhLCAgMHgxNSwgIDB4ZTEsICAweDJhLCAgMHhlYiwgIDB4ZmUsCisgIDB4MDEsICAweGYwLCAgMHhlYiwgIDB4ZmUsICAweDgyLCAgMHhmMCwgIDB4ZmUsICAweGE0LCAgMHgwMywgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4MTUsICAweGZlLCAgMHhlNCwgIDB4MDAsCisgIDB4MmYsICAweGZlLCAgMHhiNiwgIDB4MDMsICAweDJhLCAgMHgzYywgIDB4MTYsICAweGZlLCAgMHhjNiwgIDB4MDMsICAweDAxLCAgMHg0MSwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsCisgIDB4ZDYsICAweDAzLCAgMHhhZiwgIDB4YTAsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHhhMiwgIDB4MDcsICAweDA1LCAgMHgyOSwgIDB4MDMsICAweDgxLCAgMHgxZSwgIDB4MWIsCisgIDB4ZmUsICAweDI0LCAgMHgwNSwgIDB4MWYsICAweDYzLCAgMHgwMSwgIDB4NDIsICAweDhmLCAgMHhmZSwgIDB4NzAsICAweDAyLCAgMHgwNSwgIDB4ZWEsICAweGZlLCAgMHg0NiwgIDB4MWMsCisgIDB4MzcsICAweDdkLCAgMHgxZCwgIDB4ZmUsICAweDY3LCAgMHgxYiwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4NzUsCisgIDB4MDEsICAweGE2LCAgMHg4NiwgIDB4MGEsICAweDU3LCAgMHgwMSwgIDB4MTgsICAweDA5LCAgMHgwMCwgIDB4MWIsICAweGVjLCAgMHgwYSwgIDB4ZTEsICAweDAxLCAgMHgxOCwgIDB4NzcsCisgIDB4NTAsICAweDQwLCAgMHg4ZCwgIDB4MzAsICAweDAzLCAgMHg4MSwgIDB4MWUsICAweGY4LCAgMHgxZiwgIDB4NjMsICAweDAxLCAgMHg0MiwgIDB4OGYsICAweGZlLCAgMHg3MCwgIDB4MDIsCisgIDB4MDUsICAweGVhLCAgMHhkNywgIDB4OTksICAweGQ4LCAgMHg5YywgIDB4MmEsICAweDI5LCAgMHgyZiwgIDB4ZmUsICAweDRlLCAgMHgwNCwgIDB4MTYsICAweGZlLCAgMHg0YSwgIDB4MDQsCisgIDB4N2UsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweGZlLCAgMHg5YiwgIDB4NTcsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDMyLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MDEsCisgIDB4MDgsICAweDE2LCAgMHhmZSwgIDB4MDIsICAweDA1LCAgMHgzMiwgIDB4MDEsICAweDA4LCAgMHgxNiwgIDB4MjksICAweDI3LCAgMHgyNSwgIDB4ZWUsICAweGZlLCAgMHg0YywgIDB4NDQsCisgIDB4ZmUsICAweDU4LCAgMHgxMiwgIDB4NTAsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDEzLCAgMHgzNCwgIDB4ZmUsICAweDRjLCAgMHg1NCwgIDB4N2IsICAweGVjLCAgMHg2MCwgIDB4OGQsCisgIDB4MzAsICAweDAxLCAgMHhmZSwgIDB4NGUsICAweDFlLCAgMHhmZSwgIDB4NDgsICAweDQ3LCAgMHhmZSwgIDB4N2MsICAweDEzLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4ZmUsCisgIDB4MzIsICAweDEzLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHg5YiwgIDB4ZmUsICAweDY4LCAgMHgxMywgIDB4ZmUsICAweDI2LCAgMHgxMCwgIDB4MTMsICAweDM0LCAgMHhmZSwgIDB4NGMsCisgIDB4NTQsICAweDdiLCAgMHhlYywgIDB4MDEsICAweGZlLCAgMHg0ZSwgIDB4MWUsICAweGZlLCAgMHg0OCwgIDB4NDcsICAweGZlLCAgMHg1NCwgIDB4MTMsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4MjgsICAweGE1LCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHg5YiwgIDB4ZmUsICAweDQwLCAgMHgxMywgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MjgsICAweGY5LCAgMHgxZiwgIDB4N2YsCisgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MDcsICAweDRkLCAgMHgxZiwgIDB4ZmUsICAweDBkLCAgMHgwMCwgIDB4MDEsICAweDQyLCAgMHg4ZiwgIDB4ZmUsICAweGE0LCAgMHgwZSwgIDB4MDUsCisgIDB4MjksICAweDMyLCAgMHgxNSwgIDB4ZmUsICAweGU2LCAgMHgwMCwgIDB4MGYsICAweGZlLCAgMHgxYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4OWMsICAweDkzLCAgMHgzYSwgIDB4MGIsCisgIDB4MGUsICAweDhiLCAgMHgwMiwgIDB4MWYsICAweDdmLCAgMHgwMSwgIDB4NDIsICAweDA1LCAgMHgzNSwgIDB4ZmUsICAweDQyLCAgMHg1YiwgIDB4N2QsICAweDFkLCAgMHhmZSwgIDB4NDYsCisgIDB4NTksICAweGZlLCAgMHhiZiwgIDB4NTcsICAweGZlLCAgMHg3NywgIDB4NTcsICAweDBmLCAgMHhmZSwgIDB4ODcsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDg3LCAgMHg4MywgIDB4ZmUsCisgIDB4YzksICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweGQwLCAgMHg2NSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHg5OCwgIDB4MTMsICAweDBmLCAgMHhmZSwgIDB4MjAsCisgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4YTAsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwOSwgIDB4MWQsICAweGZlLCAgMHg4NCwgIDB4MTIsICAweDAxLCAgMHgzOCwgIDB4MDYsCisgIDB4MDcsICAweGZlLCAgMHg3MCwgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgxZSwgIDB4MWIsICAweGZlLCAgMHhkYSwgIDB4MDUsICAweGQwLCAgMHg1NCwgIDB4MDEsCisgIDB4MzgsICAweDA2LCAgMHgwZCwgIDB4ZmUsICAweDU4LCAgMHgxMywgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweDFlLCAgMHhmZSwgIDB4NTAsICAweDEyLCAgMHg1ZSwgIDB4ZmYsCisgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MmYsICAweGZlLCAgMHg5MCwgIDB4MDUsICAweDJhLCAgMHgzYywgIDB4Y2MsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgyZiwgIDB4ZmUsCisgIDB4OWUsICAweDA1LCAgMHgxNywgIDB4ZmUsICAweGY0LCAgMHgwNSwgIDB4MTUsICAweGZlLCAgMHhlMywgIDB4MDAsICAweDI2LCAgMHgwMSwgIDB4MzgsICAweGZlLCAgMHg0YSwgIDB4ZjAsCisgIDB4ZmUsICAweGMwLCAgMHgwNSwgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweGJhLCAgMHgwNSwgIDB4NzEsICAweDJlLCAgMHhmZSwgIDB4MjEsICAweDAwLCAgMHhmMSwgIDB4MmUsCisgIDB4ZmUsICAweDIyLCAgMHgwMCwgIDB4YTIsICAweDJlLCAgMHg0YSwgIDB4ZmUsICAweDA5LCAgMHg0OCwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDJmLCAgMHhmZSwgIDB4ZDAsCisgIDB4MDUsICAweDE3LCAgMHhmZSwgIDB4ZjQsICAweDA1LCAgMHhmZSwgIDB4ZTIsICAweDA4LCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHhmZSwgIDB4MWMsICAweDAwLCAgMHg0ZCwgIDB4MDEsCisgIDB4YTcsICAweDJlLCAgMHgwNywgIDB4MjAsICAweGU0LCAgMHg0NywgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MjgsICAweGZlLCAgMHgyNCwgIDB4MTIsCisgIDB4M2UsICAweDAxLCAgMHg4NCwgIDB4MWYsICAweDdmLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgwNywgIDB4NGQsICAweDFmLCAgMHhmZSwgIDB4MGQsICAweDAwLCAgMHgwMSwgIDB4NDIsCisgIDB4OGYsICAweGZlLCAgMHhhNCwgIDB4MGUsICAweDA1LCAgMHgyOSwgIDB4MDMsICAweGU2LCAgMHgxZSwgIDB4ZmUsICAweGNhLCAgMHgxMywgIDB4MDMsICAweGI2LCAgMHgxZSwgIDB4ZmUsCisgIDB4NDAsICAweDEyLCAgMHgwMywgIDB4NjYsICAweDFlLCAgMHhmZSwgIDB4MzgsICAweDEzLCAgMHgzZSwgIDB4MDEsICAweDg0LCAgMHgxNywgIDB4ZmUsICAweDcyLCAgMHgwNiwgIDB4MGEsCisgIDB4MDcsICAweDAxLCAgMHgzOCwgIDB4MDYsICAweDI0LCAgMHhmZSwgIDB4MDIsICAweDEyLCAgMHg0ZiwgIDB4MDEsICAweGZlLCAgMHg1NiwgIDB4MTksICAweDE2LCAgMHhmZSwgIDB4NjgsCisgIDB4MDYsICAweDE1LCAgMHg4MiwgIDB4MDEsICAweDQxLCAgMHgxNSwgIDB4ZTIsICAweDAzLCAgMHg2NiwgIDB4OGEsICAweDEwLCAgMHg2NiwgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4ZmUsCisgIDB4NzAsICAweDEyLCAgMHgwMywgIDB4NTUsICAweDFlLCAgMHhmZSwgIDB4NjgsICAweDEzLCAgMHgwMSwgIDB4YzYsICAweDA5LCAgMHgxMiwgIDB4NDgsICAweGZlLCAgMHg5MiwgIDB4MDYsCisgIDB4MmUsICAweDEyLCAgMHgwMSwgIDB4ZmUsICAweGFjLCAgMHgxZCwgIDB4ZmUsICAweDQzLCAgMHg0OCwgIDB4NjIsICAweDgwLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsCisgIDB4NTcsICAweDUyLCAgMHhhZCwgIDB4MjMsICAweDNmLCAgMHg0ZSwgIDB4NjIsICAweDQ5LCAgMHgzZSwgIDB4MDEsICAweDg0LCAgMHgxNywgIDB4ZmUsICAweGVhLCAgMHgwNiwgIDB4MDEsCisgIDB4MzgsICAweDA2LCAgMHgxMiwgIDB4ZjcsICAweDQ1LCAgMHgwYSwgIDB4OTUsICAweDAxLCAgMHhmZSwgIDB4ODQsICAweDE5LCAgMHgxNiwgIDB4ZmUsICAweGUwLCAgMHgwNiwgIDB4MTUsCisgIDB4ODIsICAweDAxLCAgMHg0MSwgIDB4MTUsICAweGUyLCAgMHgwMywgIDB4NTUsICAweDhhLCAgMHgxMCwgIDB4NTUsICAweDFjLCAgMHgwNywgIDB4MDEsICAweDg0LCAgMHhmZSwgIDB4YWUsCisgIDB4MTAsICAweDAzLCAgMHg2ZiwgIDB4MWUsICAweGZlLCAgMHg5ZSwgIDB4MTMsICAweDNlLCAgMHgwMSwgIDB4ODQsICAweDAzLCAgMHg5YSwgIDB4MWUsICAweGZlLCAgMHgxYSwgIDB4MTIsCisgIDB4MDEsICAweDM4LCAgMHgwNiwgIDB4MTIsICAweGZjLCAgMHgwMSwgIDB4YzYsICAweDAxLCAgMHhmZSwgIDB4YWMsICAweDFkLCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHg2MiwgIDB4ODAsCisgIDB4ZjAsICAweDQ1LCAgMHgwYSwgIDB4OTUsICAweDAzLCAgMHhiNiwgIDB4MWUsICAweGY4LCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHgyNCwgIDB4MzYsICAweGZlLCAgMHgwMiwgIDB4ZjYsCisgIDB4MDcsICAweDcxLCAgMHg3OCwgIDB4OGMsICAweDAwLCAgMHg0ZCwgIDB4NjIsICAweDQ5LCAgMHgzZSwgIDB4MmQsICAweDkzLCAgMHg0ZSwgIDB4ZDAsICAweDBkLCAgMHgxNywgIDB4ZmUsCisgIDB4OWEsICAweDA3LCAgMHgwMSwgIDB4ZmUsICAweGMwLCAgMHgxOSwgIDB4MTYsICAweGZlLCAgMHg5MCwgIDB4MDcsICAweDI2LCAgMHgyMCwgIDB4OWUsICAweDE1LCAgMHg4MiwgIDB4MDEsCisgIDB4NDEsICAweDE1LCAgMHhlMiwgIDB4MjEsICAweDllLCAgMHgwOSwgIDB4MDcsICAweGZiLCAgMHgwMywgIDB4ZTYsICAweGZlLCAgMHg1OCwgIDB4NTcsICAweDEwLCAgMHhlNiwgIDB4MDUsCisgIDB4ZmUsICAweDJhLCAgMHgwNiwgIDB4MDMsICAweDZmLCAgMHg4YSwgIDB4MTAsICAweDZmLCAgMHgxYywgIDB4MDcsICAweDAxLCAgMHg4NCwgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4NWYsCisgIDB4NzUsICAweDAxLCAgMHhhNiwgIDB4ODYsICAweDE1LCAgMHhmZSwgIDB4ZTIsICAweDAwLCAgMHgyZiwgIDB4ZWQsICAweDJhLCAgMHgzYywgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsCisgIDB4Y2UsICAweDA3LCAgMHhhZSwgIDB4ZmUsICAweDk2LCAgMHgwOCwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsICAweDllLCAgMHgwOCwgIDB4YWYsICAweGEwLCAgMHgwNSwgIDB4MjksCisgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHgyZSwgIDB4MTIsICAweDE0LCAgMHgxZCwgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsCisgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweGZlLCAgMHg5OSwgIDB4YTQsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwNSwgIDB4ZmUsCisgIDB4YzYsICAweDA5LCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweDNhLCAgMHgxMiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MTIsICAweGZlLCAgMHgzMCwgIDB4MTMsCisgIDB4MTQsICAweGZlLCAgMHgxYiwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE0LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDAsCisgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDcsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwNSwgIDB4ZWYsICAweDdjLCAgMHg0YSwgIDB4NzgsICAweDRmLCAgMHgwZiwgIDB4ZmUsCisgIDB4OWEsICAweDgxLCAgMHgwNCwgIDB4ZmUsICAweDlhLCAgMHg4MywgIDB4ZmUsICAweGNiLCAgMHg0NywgIDB4MGIsICAweDBlLCAgMHgyZCwgIDB4MjgsICAweDQ4LCAgMHhmZSwgIDB4NmMsCisgIDB4MDgsICAweDBhLCAgMHgyOCwgIDB4ZmUsICAweDA5LCAgMHg2ZiwgIDB4Y2EsICAweGZlLCAgMHhjYSwgIDB4NDUsICAweGZlLCAgMHgzMiwgIDB4MTIsICAweDUzLCAgMHg2MywgIDB4NGUsCisgIDB4N2MsICAweDk3LCAgMHgyZiwgIDB4ZmUsICAweDdlLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4NmMsICAweDA4LCAgMHhhZiwgIDB4YTAsCisgIDB4YWUsICAweGZlLCAgMHg5NiwgIDB4MDgsICAweDA1LCAgMHgyOSwgIDB4MDEsICAweDQxLCAgMHgwNSwgIDB4ZWQsICAweDE0LCAgMHgyNCwgIDB4MDUsICAweGVkLCAgMHhmZSwgIDB4OWMsCisgIDB4ZjcsICAweDlmLCAgMHgwMSwgIDB4ZmUsICAweGFlLCAgMHgxZSwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDEsICAweGZlLCAgMHhiZSwgIDB4MWUsICAweGZlLCAgMHg5OSwgIDB4NTgsCisgIDB4ZmUsICAweDc4LCAgMHgxOCwgIDB4ZmUsICAweGY5LCAgMHgxOCwgIDB4OGUsICAweGZlLCAgMHgxNiwgIDB4MDksICAweDEwLCAgMHg2YSwgIDB4MjIsICAweDZiLCAgMHgwMSwgIDB4MGMsCisgIDB4NjEsICAweDU0LCAgMHg0NCwgIDB4MjEsICAweDJjLCAgMHgwOSwgIDB4MWEsICAweGY4LCAgMHg3NywgIDB4MDEsICAweGZlLCAgMHg3ZSwgIDB4MWUsICAweDQ3LCAgMHgyYywgIDB4N2EsCisgIDB4MzAsICAweGYwLCAgMHhmZSwgIDB4ODMsICAweGU3LCAgMHhmZSwgIDB4M2YsICAweDAwLCAgMHg3MSwgIDB4ZmUsICAweDAzLCAgMHg0MCwgIDB4MDEsICAweDBjLCAgMHg2MSwgIDB4NjUsCisgIDB4NDQsICAweDAxLCAgMHhjMiwgIDB4YzgsICAweGZlLCAgMHgxZiwgIDB4NDAsICAweDIwLCAgMHg2ZSwgIDB4MDEsICAweGZlLCAgMHg2YSwgIDB4MTYsICAweGZlLCAgMHgwOCwgIDB4NTAsCisgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4ZmUsICAweDQ0LCAgMHg1MSwgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ZmUsICAweDEwLCAgMHgxMCwgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsCisgIDB4MDEsICAweGZlLCAgMHhkZSwgIDB4MWUsICAweDEwLCAgMHg2OCwgIDB4MjIsICAweDY5LCAgMHgwMSwgIDB4ZmUsICAweGVlLCAgMHgxZSwgIDB4MDEsICAweGZlLCAgMHhmZSwgIDB4MWUsCisgIDB4ZmUsICAweDQwLCAgMHg1MCwgIDB4ZmUsICAweGMyLCAgMHg1MCwgIDB4MTAsICAweDRiLCAgMHgyMiwgIDB4NGMsICAweGZlLCAgMHg4YSwgIDB4MTAsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4NTQsICAweGZlLCAgMHg1MCwgIDB4MTIsICAweDAxLCAgMHhmZSwgIDB4YWUsICAweDFlLCAgMHgwMSwgIDB4ZmUsICAweGJlLCAgMHgxZSwgIDB4MTAsICAweDZhLCAgMHgyMiwgIDB4NmIsCisgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4NjUsICAweDRlLCAgMHgwMSwgIDB4YzIsICAweDBmLCAgMHhmZSwgIDB4MWYsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDlmLCAgMHg4MywgIDB4MzMsCisgIDB4MGIsICAweDBlLCAgMHgyMCwgIDB4NmUsICAweDBmLCAgMHhmZSwgIDB4NDQsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweGM0LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4YzYsCisgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4YzYsICAweDkzLCAgMHg3OSwgIDB4MGIsICAweDBlLCAgMHgxMCwgIDB4NmMsICAweDIyLCAgMHg2ZCwgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsCisgIDB4MDEsICAweGZlLCAgMHhkZSwgIDB4MWUsICAweDEwLCAgMHg2OCwgIDB4MjIsICAweDY5LCAgMHgwZiwgIDB4ZmUsICAweDQwLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhjMCwgIDB4OTMsCisgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4YzIsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweGMyLCAgMHg5MywgIDB4NzksICAweDBiLCAgMHgwZSwgIDB4MTAsICAweDRiLCAgMHgyMiwgIDB4NGMsCisgIDB4MTAsICAweDY0LCAgMHgyMiwgIDB4MzQsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDI0LCAgMHg0NCwgIDB4MzcsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHgyZiwgIDB4ZmUsCisgIDB4ZGUsICAweDA5LCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4MDEsICAweDQ4LCAgMHgxYiwgIDB4M2MsICAweDM3LCAgMHg4OCwgIDB4ZjUsCisgIDB4ZDQsICAweGZlLCAgMHgxZSwgIDB4MGEsICAweGQ1LCAgMHhmZSwgIDB4NDIsICAweDBhLCAgMHhkMiwgIDB4ZmUsICAweDFlLCAgMHgwYSwgIDB4ZDMsICAweGZlLCAgMHg0MiwgIDB4MGEsCisgIDB4YWUsICAweGZlLCAgMHgxMiwgIDB4MGEsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHgxOCwgIDB4MGEsICAweGFmLCAgMHhhMCwgIDB4MDUsICAweDI5LCAgMHgwMSwgIDB4NDEsCisgIDB4ZmUsICAweGMxLCAgMHgxMCwgIDB4MTQsICAweDI0LCAgMHhmZSwgIDB4YzEsICAweDEwLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgwNywgIDB4ZmUsICAweDE0LCAgMHgxMiwgIDB4MDEsCisgIDB4NzYsICAweDA2LCAgMHgwZCwgIDB4NWQsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDBkLCAgMHhmZSwgIDB4NzQsICAweDEyLCAgMHhmZSwgIDB4MmUsICAweDFjLCAgMHgwNSwgIDB4ZmUsCisgIDB4MWEsICAweDBjLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgwNywgIDB4NWQsICAweDAxLCAgMHg3NiwgIDB4MDYsICAweDBkLCAgMHg0MSwgIDB4ZmUsICAweDJjLCAgMHgxYywgIDB4ZmUsCisgIDB4YWEsICAweGYwLCAgMHhmZSwgIDB4Y2UsICAweDBhLCAgMHhmZSwgIDB4YWMsICAweGYwLCAgMHhmZSwgIDB4NjYsICAweDBhLCAgMHhmZSwgIDB4OTIsICAweDEwLCAgMHhjNCwgIDB4ZjYsCisgIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweDcyLCAgMHgwYSwgIDB4MDUsICAweGZlLCAgMHgxYSwgIDB4MGMsICAweGM1LCAgMHhmZSwgIDB4ZTcsICAweDEwLCAgMHhmZSwgIDB4MmIsCisgIDB4ZjAsICAweGJmLCAgMHhmZSwgIDB4NmIsICAweDE4LCAgMHgyMywgIDB4ZmUsICAweDAwLCAgMHhmZSwgIDB4ZmUsICAweDFjLCAgMHgxMiwgIDB4YWMsICAweGZlLCAgMHhkMiwgIDB4ZjAsCisgIDB4YmYsICAweGZlLCAgMHg3NiwgIDB4MTgsICAweDIzLCAgMHgxZCwgIDB4MWIsICAweGJmLCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4MWIsICAweGJmLCAgMHhkNCwgIDB4NWIsCisgIDB4ZDUsICAweDViLCAgMHhkMiwgIDB4NWIsICAweGQzLCAgMHg1YiwgIDB4YzQsICAweGM1LCAgMHhmZSwgIDB4YTksICAweDEwLCAgMHg3NSwgIDB4NWUsICAweDMyLCAgMHgxZiwgIDB4N2YsCisgIDB4MDEsICAweDQyLCAgMHgxOSwgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NzAsICAweDE5LCAgMHg5OCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4NzQsCisgIDB4MTgsICAweDIzLCAgMHhmZSwgIDB4MDAsICAweGY4LCAgMHgxYiwgIDB4NWIsICAweDdkLCAgMHgxMiwgIDB4MDEsICAweGZlLCAgMHg3OCwgIDB4MGYsICAweDRkLCAgMHgwMSwgIDB4ZmUsCisgIDB4OTYsICAweDFhLCAgMHgyMSwgIDB4MzAsICAweDc3LCAgMHg3ZCwgIDB4MWQsICAweDA1LCAgMHg1YiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweDJiLCAgMHhmZSwgIDB4ZTIsCisgIDB4MGIsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDU0LCAgMHhmZSwgIDB4YTYsICAweDEyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4ZmUsICAweDg4LCAgMHgxMywgIDB4MjEsCisgIDB4NmUsICAweGM3LCAgMHgwMSwgIDB4ZmUsICAweDFlLCAgMHgxZiwgIDB4MGYsICAweGZlLCAgMHg4MywgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODMsICAweDgzLCAgMHhmZSwgIDB4YzksCisgIDB4NDcsICAweDBiLCAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgwNCwgIDB4OTEsICAweDA0LCAgMHhmZSwgIDB4ODQsCisgIDB4OTMsICAweGZlLCAgMHhjYSwgIDB4NTcsICAweDBiLCAgMHhmZSwgIDB4ODYsICAweDkxLCAgMHgwNCwgIDB4ZmUsICAweDg2LCAgMHg5MywgIDB4ZmUsICAweGNiLCAgMHg1NywgIDB4MGIsCisgIDB4MGUsICAweDdhLCAgMHgzMCwgIDB4ZmUsICAweDQwLCAgMHg1OSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4OGUsICAweDQwLCAgMHgwMywgIDB4NmEsICAweDNiLCAgMHg2YiwgIDB4MTAsCisgIDB4OTcsICAweDIyLCAgMHg5OCwgIDB4ZDksICAweDZhLCAgMHhkYSwgIDB4NmIsICAweDAxLCAgMHhjMiwgIDB4YzgsICAweDdhLCAgMHgzMCwgIDB4MjAsICAweDZlLCAgMHhkYiwgIDB4NjQsCisgIDB4ZGMsICAweDM0LCAgMHg5MSwgIDB4NmMsICAweDdlLCAgMHg2ZCwgIDB4ZmUsICAweDQ0LCAgMHg1NSwgIDB4ZmUsICAweGU1LCAgMHg1NSwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4NjQsCisgIDB4ZmUsICAweDA1LCAgMHhmYSwgIDB4MzQsICAweDAxLCAgMHhmZSwgIDB4NmEsICAweDE2LCAgMHhhMywgIDB4MjYsICAweDEwLCAgMHg5NywgIDB4MTAsICAweDk4LCAgMHg5MSwgIDB4NmMsCisgIDB4N2UsICAweDZkLCAgMHhmZSwgIDB4MTQsICAweDEwLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4MWIsICAweDQwLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4MDEsCisgIDB4MGMsICAweDA2LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHg0NCwgIDB4MDMsICAweDY4LCAgMHgzYiwgIDB4NjksICAweGZlLCAgMHgxMCwgIDB4NTgsICAweGZlLCAgMHg5MSwgIDB4NTgsCisgIDB4ZmUsICAweDE0LCAgMHg1OSwgIDB4ZmUsICAweDk1LCAgMHg1OSwgIDB4MDUsICAweDViLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4MWIsICAweDQwLCAgMHgwMSwgIDB4MGMsCisgIDB4MDYsICAweGZlLCAgMHhmNywgIDB4MDAsICAweDQ0LCAgMHg3OCwgIDB4MDEsICAweGZlLCAgMHg4ZSwgIDB4MWUsICAweDRmLCAgMHgwZiwgIDB4ZmUsICAweDEwLCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweDkwLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4OTIsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDkyLCAgMHg5MywgIDB4NzksICAweDBiLCAgMHgwZSwgIDB4ZmUsCisgIDB4YmQsICAweDEwLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHhiYiwgIDB4MWIsICAweGZlLCAgMHg2ZSwgIDB4MGEsICAweDE1LCAgMHhiYiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsCisgIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDMsICAweDRiLCAgMHgzYiwgIDB4NGMsICAweDhlLCAgMHhmZSwgIDB4NmUsICAweDBhLCAgMHhmZSwgIDB4MGMsICAweDU4LCAgMHhmZSwgIDB4OGQsCisgIDB4NTgsICAweDA1LCAgMHg1YiwgIDB4MjYsICAweDNlLCAgMHgwZiwgIDB4ZmUsICAweDE5LCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg5OSwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsCisgIDB4ZmUsICAweGU1LCAgMHgxMCwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHgxYSwgIDB4MTIsICAweGZlLCAgMHg2YywgIDB4MTksICAweGZlLCAgMHgxOSwgIDB4NDEsCisgIDB4ZmUsICAweDZiLCAgMHgxOCwgIDB4YWMsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGVmLCAgMHgxZiwgIDB4OTIsICAweDAxLCAgMHg0MiwgIDB4MTksICAweGZlLCAgMHg0NCwgIDB4MDAsCisgIDB4ZmUsICAweDkwLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4ZDksICAweDRiLCAgMHhmZSwgIDB4ZWQsICAweDE5LCAgMHhkYSwgIDB4NGMsICAweGZlLCAgMHgwYywgIDB4NTEsCisgIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZmUsICAweDZiLCAgMHgxOCwgIDB4MjMsICAweGZlLCAgMHgwMCwgIDB4ZmYsICAweDMxLCAgMHhmZSwgIDB4NzYsICAweDEwLCAgMHhhYywgIDB4ZmUsCisgIDB4ZDIsICAweGYwLCAgMHhmZSwgIDB4YmEsICAweDBjLCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgyMywgIDB4MWQsICAweDVkLCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4ZmUsCisgIDB4MDgsICAweDEzLCAgMHgxOSwgIDB4ZmUsICAweDE2LCAgMHgwMCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4ZDEsICAweGYwLCAgMHhmZSwgIDB4Y2MsICAweDBjLCAgMHgxZiwgIDB4OTIsCisgIDB4MDEsICAweDQyLCAgMHgxOSwgIDB4ZmUsICAweDE3LCAgMHgwMCwgIDB4NWMsICAweGZlLCAgMHhjZSwgIDB4ZjAsICAweGZlLCAgMHhkMiwgIDB4MGMsICAweGZlLCAgMHgzZSwgIDB4MTAsCisgIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGRlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHgyMiwgIDB4MDAsICAweDA1LCAgMHg3MCwgIDB4ZmUsICAweGNiLCAgMHhmMCwgIDB4ZmUsCisgIDB4ZWEsICAweDBjLCAgMHgxOSwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4ZDAsICAweGYwLCAgMHhmZSwgIDB4ZjQsICAweDBjLCAgMHgxOSwgIDB4OTQsCisgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweGNmLCAgMHhmMCwgIDB4ZmUsICAweGZlLCAgMHgwYywgIDB4MTksICAweDRhLCAgMHhmMywgIDB4ZmUsICAweGNjLCAgMHhmMCwgIDB4ZWYsCisgIDB4MDEsICAweDc2LCAgMHgwNiwgIDB4MjQsICAweDRkLCAgMHgxOSwgIDB4ZmUsICAweDEyLCAgMHgwMCwgIDB4MzcsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHgyZiwgIDB4ZmUsCisgIDB4MTYsICAweDBkLCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4MmEsICAweDBkLCAgMHhmZSwgIDB4MDEsICAweDQ4LCAgMHgxYiwgIDB4M2MsICAweDM3LCAgMHg4OCwgIDB4ZjUsCisgIDB4ZDQsICAweDI5LCAgMHhkNSwgIDB4MjksICAweGQyLCAgMHgyOSwgIDB4ZDMsICAweDI5LCAgMHgzNywgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4MmYsICAweGZlLCAgMHgzZSwgIDB4MGQsCisgIDB4MmEsICAweDNjLCAgMHhhZSwgIDB4ZmUsICAweDYyLCAgMHgwZCwgIDB4YWYsICAweGEwLCAgMHhkNCwgIDB4OWYsICAweGQ1LCAgMHg5ZiwgIDB4ZDIsICAweDlmLCAgMHhkMywgIDB4OWYsCisgIDB4MDUsICAweDI5LCAgMHgwMSwgIDB4NDEsICAweGZlLCAgMHhkMywgIDB4MTAsICAweDE1LCAgMHhmZSwgIDB4ZTgsICAweDAwLCAgMHhjNCwgIDB4YzUsICAweDc1LCAgMHhkNywgIDB4OTksCisgIDB4ZDgsICAweDljLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyOSwgIDB4MjcsICAweDI1LCAgMHhiZSwgIDB4ZDcsICAweDk5LCAgMHhkOCwgIDB4OWMsICAweDJmLCAgMHhmZSwgIDB4OGMsCisgIDB4MGQsICAweDE2LCAgMHgyOSwgIDB4MjcsICAweDI1LCAgMHhiZCwgIDB4ZmUsICAweDAxLCAgMHg0OCwgIDB4YTQsICAweDE5LCAgMHhmZSwgIDB4NDIsICAweDAwLCAgMHgwNSwgIDB4NzAsCisgIDB4OTAsICAweDA3LCAgMHhmZSwgIDB4ODEsICAweDQ5LCAgMHgxYiwgIDB4ZmUsICAweDY0LCAgMHgwZSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHg0NCwgIDB4MTMsCisgIDB4MTksICAweDAwLCAgMHgyZCwgIDB4MGQsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDJkLCAgMHhmZSwgIDB4MjgsICAweDAwLCAgMHgyYiwgIDB4ZmUsICAweGRhLCAgMHgwZSwgIDB4MGEsCisgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4MDksICAweDAwLCAgMHgzNiwgIDB4NDYsICAweGZlLCAgMHgyOCwgIDB4MDAsICAweGZlLCAgMHhmYSwgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4ZjQsCisgIDB4MWMsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweDFkLCAgMHgwYSwgIDB4YmEsICAweDAxLCAgMHhmZSwgIDB4NTgsICAweDEwLCAgMHg0MCwgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ODUsCisgIDB4MDUsICAweDM1LCAgMHgxOSwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4MmQsICAweDBkLCAgMHhmNywgIDB4NDYsICAweDBkLCAgMHhmZSwgIDB4Y2MsICAweDEwLCAgMHgwMSwgIDB4YTcsCisgIDB4NDYsICAweDBkLCAgMHhmZSwgIDB4YzIsICAweDEwLCAgMHgwMSwgIDB4YTcsICAweDBmLCAgMHhmZSwgIDB4MTksICAweDgyLCAgMHgwNCwgIDB4ZmUsICAweDk5LCAgMHg4MywgIDB4ZmUsCisgIDB4Y2MsICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweGZlLCAgMHgzNCwgIDB4NDYsICAweGE1LCAgMHg0NiwgIDB4MGQsICAweDE5LCAgMHhmZSwgIDB4NDMsICAweDAwLCAgMHhmZSwgIDB4YTIsCisgIDB4MTAsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDBkLCAgMHg0NCwgIDB4MDEsICAweGZlLCAgMHhmNCwgIDB4MWMsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweDFkLCAgMHg0MCwgIDB4MTUsCisgIDB4NTYsICAweDAxLCAgMHg4NSwgIDB4N2QsICAweDBkLCAgMHg0MCwgIDB4NTEsICAweDAxLCAgMHhmZSwgIDB4OWUsICAweDFlLCAgMHgwNSwgIDB4ZmUsICAweDNhLCAgMHgwMywgIDB4MDEsCisgIDB4MGMsICAweDA2LCAgMHgwZCwgIDB4NWQsICAweDQ2LCAgMHgwZCwgIDB4MTksICAweDAwLCAgMHhmZSwgIDB4NjIsICAweDEwLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgxMiwgIDB4ZmUsCisgIDB4NWMsICAweDEyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweDUyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsCisgIDB4OGUsICAweDBlLCAgMHhmZSwgIDB4MWMsICAweDFjLCAgMHhmZSwgIDB4OWQsICAweGYwLCAgMHhmZSwgIDB4OTQsICAweDBlLCAgMHgwMSwgIDB4MGMsICAweDYxLCAgMHgxMiwgIDB4NDQsCisgIDB4ZmUsICAweDlmLCAgMHgxMCwgIDB4MTksICAweGZlLCAgMHgxNSwgIDB4MDAsICAweGZlLCAgMHgwNCwgIDB4ZTYsICAweDBkLCAgMHg0ZiwgIDB4ZmUsICAweDJlLCAgMHgxMCwgIDB4MTksCisgIDB4ZmUsICAweDEzLCAgMHgwMCwgIDB4ZmUsICAweDEwLCAgMHgxMCwgIDB4MTksICAweGZlLCAgMHg0NywgIDB4MDAsICAweGYxLCAgMHgxOSwgIDB4ZmUsICAweDQxLCAgMHgwMCwgIDB4YTIsCisgIDB4MTksICAweGZlLCAgMHgyNCwgIDB4MDAsICAweDg2LCAgMHhjNCwgIDB4YzUsICAweDc1LCAgMHgwMywgIDB4ODEsICAweDFlLCAgMHgyYiwgIDB4ZWEsICAweDRmLCAgMHhmZSwgIDB4MDQsCisgIDB4ZTYsICAweDEyLCAgMHhmZSwgIDB4OWQsICAweDQxLCAgMHhmZSwgIDB4MWMsICAweDQyLCAgMHg0MCwgIDB4MDEsICAweGY0LCAgMHgwNSwgIDB4MzUsICAweGZlLCAgMHgxMiwgIDB4MWMsCisgIDB4MWYsICAweDBkLCAgMHg0NywgIDB4YjUsICAweGMzLCAgMHgxZiwgIDB4ZmUsICAweDMxLCAgMHgwMCwgIDB4NDcsICAweGI4LCAgMHgwMSwgIDB4ZmUsICAweGQ0LCAgMHgxMSwgIDB4MDUsCisgIDB4ZTksICAweDUxLCAgMHhmZSwgIDB4MDYsICAweGVjLCAgMHhlMCwgIDB4ZmUsICAweDBlLCAgMHg0NywgIDB4NDYsICAweDI4LCAgMHhmZSwgIDB4Y2UsICAweDQ1LCAgMHgzMSwgIDB4NTEsCisgIDB4ZmUsICAweDA2LCAgMHhlYSwgIDB4ZTAsICAweGZlLCAgMHg0NywgIDB4NGIsICAweDQ1LCAgMHhmZSwgIDB4NzUsICAweDU3LCAgMHgwMywgIDB4NjcsICAweGZlLCAgMHg5OCwgIDB4NTYsCisgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDYwLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4ZmUsCisgIDB4MTgsICAweDEzLCAgMHgwYSwgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4M2UsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDBhLCAgMHhiYSwgIDB4ZmUsICAweGZhLCAgMHgxNCwgIDB4ZmUsCisgIDB4NDksICAweDU0LCAgMHhiMCwgIDB4ZmUsICAweDVlLCAgMHgwZiwgIDB4MDUsICAweGZlLCAgMHgzYSwgIDB4MDMsICAweDBhLCAgMHg2NywgIDB4ZmUsICAweGUwLCAgMHgxNCwgIDB4ZmUsCisgIDB4MGUsICAweDQ3LCAgMHg0NiwgIDB4MjgsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDMxLCAgMHg1MSwgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGFkLCAgMHgxMywgIDB4MDUsCisgIDB4MzUsICAweDIxLCAgMHgyYywgIDB4MDksICAweDFhLCAgMHhmZSwgIDB4OTgsICAweDEyLCAgMHgyNiwgIDB4MjAsICAweDk2LCAgMHgyMCwgIDB4ZTcsICAweGZlLCAgMHgwOCwgIDB4MWMsCisgIDB4ZmUsICAweDdjLCAgMHgxOSwgIDB4ZmUsICAweGZkLCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MDMsICAweGU1LCAgMHhmZSwgIDB4NDgsICAweDU1LCAgMHhhNSwgIDB4M2IsCisgIDB4ZmUsICAweDYyLCAgMHgwMSwgIDB4ZmUsICAweGM5LCAgMHg1NSwgIDB4MzEsICAweGZlLCAgMHg3NCwgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4ZjAsICAweDFhLCAgMHgwMywgIDB4ZmUsCisgIDB4MzgsICAweDAxLCAgMHgzYiwgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4OGUsICAweGZlLCAgMHgxZSwgIDB4MTAsICAweGZlLCAgMHgwMiwgIDB4ZWMsICAweGU3LCAgMHg1MywgIDB4MDAsCisgIDB4MzYsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDJjLCAgMHg2MCwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZmUsICAweDM0LCAgMHgwMSwgIDB4MDEsICAweGZlLCAgMHg2MiwgIDB4MWIsCisgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsICAweGIyLCAgMHgxMSwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4Y2EsICAweGZlLCAgMHgwMiwgIDB4ZWEsICAweGU3LCAgMHg1MywgIDB4OTIsCisgIDB4ZmUsICAweGMzLCAgMHgxMywgIDB4MWYsICAweDEyLCAgMHg0NywgIDB4YjUsICAweGMzLCAgMHhmZSwgIDB4MmEsICAweDEwLCAgMHgwMywgIDB4ZmUsICAweDM4LCAgMHgwMSwgIDB4MjMsCisgIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MTAsICAweGU1LCAgMHgwMywgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4MTAsICAweGZlLCAgMHg2MiwgIDB4MDEsICAweDAxLCAgMHhmZSwgIDB4MWUsCisgIDB4MWUsICAweDIwLCAgMHgyYywgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ZmUsICAweDllLCAgMHgxZSwgIDB4MTMsICAweDA3LCAgMHgwMiwgIDB4MjYsICAweDAyLCAgMHgyMSwgIDB4OTYsCisgIDB4YzcsICAweDIwLCAgMHg5NiwgIDB4MDksICAweDkyLCAgMHhmZSwgIDB4NzksICAweDEzLCAgMHgxZiwgIDB4MWQsICAweDQ3LCAgMHhiNSwgIDB4YzMsICAweGZlLCAgMHhlMSwgIDB4MTAsCisgIDB4Y2YsICAweGZlLCAgMHgwMywgIDB4ZGMsICAweGZlLCAgMHg3MywgIDB4NTcsICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDAyLCAgMHhjZiwgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsCisgIDB4NWIsICAweDU3LCAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwMiwgIDB4ZmUsICAweDAzLCAgMHg1NywgIDB4Y2YsICAweDI2LCAgMHhmZSwgIDB4MDAsICAweGNjLCAgMHgwMiwgIDB4ZmUsCisgIDB4MDMsICAweDU3LCAgMHhjZiwgIDB4ODksICAweDAyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHg0YSwgIDB4ZmUsICAweDRlLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxYywgIDB4ODAsCisgIDB4MDQsICAweGZlLCAgMHg5YywgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDA5LCAgMHgwNywgIDB4ZmUsICAweDNhLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxZSwgIDB4ODAsCisgIDB4MDQsICAweGZlLCAgMHg5ZSwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweGZlLCAgMHgyYSwgIDB4MTMsICAweDBmLCAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHgwNCwgIDB4ZmUsCisgIDB4OWQsICAweDgzLCAgMHhmZSwgIDB4ZjksICAweDEzLCAgMHgwZSwgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHhlZSwgIDB4MWUsICAweGFjLCAgMHhmZSwgIDB4MTQsCisgIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4ZmUsICAweDFlLCAgMHhmZSwgIDB4ODEsICAweDU4LCAgMHhmYSwgIDB4MDEsICAweGZlLCAgMHgwZSwgIDB4MWYsICAweGZlLCAgMHgzMCwgIDB4ZjQsCisgIDB4MGQsICAweGZlLCAgMHgzYywgIDB4NTAsICAweGEyLCAgMHgwMSwgIDB4ZmUsICAweDkyLCAgMHgxYiwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4NTYsICAweGZiLCAgMHgwMSwgIDB4ZmUsCisgIDB4YzgsICAweDFhLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4YTQsICAweDAxLCAgMHhmZSwgIDB4ZjQsICAweDFjLCAgMHgwMSwgIDB4ZmUsICAweDAwLCAgMHgxZCwgIDB4MTUsCisgIDB4ZmUsICAweGU5LCAgMHgwMCwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4NGEsICAweGZlLCAgMHg0ZSwgIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4MjIsICAweDFiLCAgMHhmZSwgIDB4MWUsCisgIDB4MWMsICAweDBmLCAgMHhmZSwgIDB4MTQsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDk0LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4OTYsICAweDkwLCAgMHgwNCwgIDB4ZmUsCisgIDB4OTYsICAweDkzLCAgMHg3OSwgIDB4MGIsICAweDBlLCAgMHgxMCwgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4MjIsICAweGZlLCAgMHg2NiwgIDB4MDEsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4NjUsICAweGY5LCAgMHgwZiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4MywgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDc3LCAgMHhmZSwgIDB4MDEsCisgIDB4ZWMsICAweDJjLCAgMHhmZSwgIDB4ODAsICAweDQwLCAgMHgyMCwgIDB4MmMsICAweDdhLCAgMHgzMCwgIDB4MTUsICAweGRmLCAgMHg0MCwgIDB4MjEsICAweDJjLCAgMHhmZSwgIDB4MDAsCisgIDB4NDAsICAweDhkLCAgMHgyYywgIDB4MDIsICAweGZlLCAgMHgwOCwgIDB4MWMsICAweDAzLCAgMHhmZSwgIDB4YWMsICAweDAwLCAgMHhmZSwgIDB4MDYsICAweDU4LCAgMHgwMywgIDB4ZmUsCisgIDB4YWUsICAweDAwLCAgMHhmZSwgIDB4MDcsICAweDU4LCAgMHgwMywgIDB4ZmUsICAweGIwLCAgMHgwMCwgIDB4ZmUsICAweDA4LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhiMiwgIDB4MDAsCisgIDB4ZmUsICAweDA5LCAgMHg1OCwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MmUsICAweDQ5LCAgMHgyMCwgIDB4ZTAsICAweDI2LCAgMHgxMCwgIDB4NjYsICAweDEwLCAgMHg1NSwgIDB4MTAsCisgIDB4NmYsICAweDEzLCAgMHg1NywgIDB4NTIsICAweDRmLCAgMHgxYywgIDB4MjgsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLCAgMHg5MSwgIDB4NTQsICAweDJiLCAgMHhmZSwgIDB4ODgsCisgIDB4MTEsICAweDQ2LCAgMHgxYSwgIDB4MTMsICAweDVhLCAgMHg1MiwgIDB4MWMsICAweDRhLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwgIDB4OTEsICAweDU0LCAgMHgyYiwgIDB4ZmUsCisgIDB4OWUsICAweDExLCAgMHgyZSwgIDB4MWEsICAweDIwLCAgMHgyYywgIDB4OTAsICAweDM0LCAgMHg2MCwgIDB4MjEsICAweDJjLCAgMHhmZSwgIDB4MDAsICAweDQwLCAgMHg4ZCwgIDB4MmMsCisgIDB4MTUsICAweGRmLCAgMHhmZSwgIDB4MTQsICAweDU2LCAgMHhmZSwgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4YjIsICAweDExLCAgMHhmZSwgIDB4MTIsICAweDFjLCAgMHg3NSwgIDB4ZmUsCisgIDB4MTQsICAweDFjLCAgMHhmZSwgIDB4MTAsICAweDFjLCAgMHhmZSwgIDB4MTgsICAweDFjLCAgMHgwMiwgIDB4NTEsICAweGZlLCAgMHgwYywgIDB4MTQsICAweGZlLCAgMHgwZSwgIDB4NDcsCisgIDB4ZmUsICAweDA3LCAgMHhlNiwgIDB4MjgsICAweGZlLCAgMHhjZSwgIDB4NDcsICAweGZlLCAgMHhmNSwgIDB4MTMsICAweDAyLCAgMHgwMSwgIDB4YTcsICAweDkwLCAgMHgzNCwgIDB4NjAsCisgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4ZmUsICAweDAyLCAgMHg4MCwgIDB4MDksICAweDU2LCAgMHhmZSwgIDB4MzQsCisgIDB4MTMsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHhjYiwgIDB4ZmUsICAweDM2LCAgMHgxMiwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4ZmUsICAweDQ1LCAgMHg0OCwgIDB4MDEsCisgIDB4ZmUsICAweGIyLCAgMHgxNiwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4Y2IsICAweGZlLCAgMHhmMywgIDB4MTMsICAweDNmLCAgMHg4OSwgIDB4MDksICAweDFhLCAgMHhhNSwgIDB4MGEsCisgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg1YywgIDB4MDEsICAweDg1LCAgMHhmMiwgIDB4MDksICAweDliLCAgMHhhNCwgIDB4ZmUsICAweDE0LCAgMHg1NiwgIDB4ZmUsCisgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4ZWMsICAweDExLCAgMHgwMiwgIDB4ZmUsICAweDQ0LCAgMHg1OCwgIDB4NzcsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGI4LCAgMHhmZSwgIDB4OWUsCisgIDB4NDAsICAweGZlLCAgMHg5ZCwgIDB4ZTcsICAweDAwLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgxMiwgIDB4OGQsICAweDMwLCAgMHgwMSwgIDB4ZjQsICAweGZlLCAgMHhkZCwgIDB4MTAsCisgIDB4MzcsICAweGQ3LCAgMHg5OSwgIDB4ZDgsICAweDljLCAgMHgyNywgIDB4MjUsICAweGVlLCAgMHgwOSwgIDB4MTIsICAweGZlLCAgMHg0OCwgIDB4MTIsICAweDA5LCAgMHgwZCwgIDB4ZmUsCisgIDB4NTYsICAweDEyLCAgMHgwOSwgIDB4MWQsICAweGZlLCAgMHgzMCwgIDB4MTIsICAweDA5LCAgMHhkZCwgIDB4MWIsICAweGZlLCAgMHhjNCwgIDB4MTMsICAweDA5LCAgMHhmZSwgIDB4MjMsCisgIDB4MDAsICAweDFiLCAgMHhmZSwgIDB4ZDAsICAweDEzLCAgMHgwOSwgIDB4MDcsICAweDFiLCAgMHhmZSwgIDB4MzQsICAweDE0LCAgMHgwOSwgIDB4MjQsICAweGZlLCAgMHgxMiwgIDB4MTIsCisgIDB4MDksICAweDAwLCAgMHgxYiwgIDB4MjksICAweDFmLCAgMHhkZCwgIDB4MDEsICAweDQyLCAgMHhhMSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4YWUsICAweDQxLCAgMHgwMiwgIDB4MzIsCisgIDB4ZmUsICAweDYyLCAgMHgwOCwgIDB4MGEsICAweGUxLCAgMHgwMSwgIDB4ZmUsICAweDU4LCAgMHgxMCwgIDB4MTUsICAweDliLCAgMHgwNSwgIDB4MzUsICAweDMyLCAgMHgwMSwgIDB4NDMsCisgIDB4MDksICAweGJiLCAgMHhmZSwgIDB4ZDcsICAweDEzLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4OGUsICAweGZlLCAgMHg4MCwgIDB4MTMsICAweDAxLCAgMHgwYywgIDB4MDYsCisgIDB4NTQsICAweGZlLCAgMHg3MiwgIDB4MTIsICAweGRiLCAgMHg2NCwgIDB4ZGMsICAweDM0LCAgMHhmZSwgIDB4NDQsICAweDU1LCAgMHhmZSwgIDB4ZTUsICAweDU1LCAgMHhiMCwgIDB4ZmUsCisgIDB4NGEsICAweDEzLCAgMHgyMSwgIDB4NmUsICAweGZlLCAgMHgyNiwgIDB4MTMsICAweDAzLCAgMHg5NywgIDB4M2IsICAweDk4LCAgMHg4ZSwgIDB4ZmUsICAweGI2LCAgMHgwZSwgIDB4MTAsCisgIDB4NmEsICAweDIyLCAgMHg2YiwgIDB4MjYsICAweDEwLCAgMHg5NywgIDB4MTAsICAweDk4LCAgMHgwMSwgIDB4YzIsICAweDJlLCAgMHg0OSwgIDB4ODgsICAweDIwLCAgMHg2ZSwgIDB4MDEsCisgIDB4ZmUsICAweDZhLCAgMHgxNiwgIDB4ZGIsICAweDY0LCAgMHhkYywgIDB4MzQsICAweGZlLCAgMHgwNCwgIDB4NTUsICAweGZlLCAgMHhhNSwgIDB4NTUsICAweGZlLCAgMHgwNCwgIDB4ZmEsCisgIDB4NjQsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDM0LCAgMHhmZSwgIDB4OGYsICAweDEwLCAgMHgwMywgIDB4NmMsICAweDNiLCAgMHg2ZCwgIDB4ZmUsICAweDQwLCAgMHg1NiwgIDB4ZmUsCisgIDB4ZTEsICAweDU2LCAgMHgxMCwgIDB4NmMsICAweDIyLCAgMHg2ZCwgIDB4NzEsICAweGRiLCAgMHg2NCwgIDB4ZGMsICAweDM0LCAgMHhmZSwgIDB4NDQsICAweDU1LCAgMHhmZSwgIDB4ZTUsCisgIDB4NTUsICAweDAzLCAgMHg2OCwgIDB4M2IsICAweDY5LCAgMHhmZSwgIDB4MDAsICAweDU2LCAgMHhmZSwgIDB4YTEsICAweDU2LCAgMHgxMCwgIDB4NjgsICAweDIyLCAgMHg2OSwgIDB4MDEsCisgIDB4MGMsICAweDA2LCAgMHg1NCwgIDB4ZjksICAweDIxLCAgMHg2ZSwgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MDMsICAweDZhLCAgMHgzYiwgIDB4NmIsICAweGZlLCAgMHgyYywgIDB4NTAsCisgIDB4ZmUsICAweGFlLCAgMHg1MCwgIDB4MDMsICAweDZjLCAgMHgzYiwgIDB4NmQsICAweGZlLCAgMHg0NCwgIDB4NTAsICAweGZlLCAgMHhjNiwgIDB4NTAsICAweDAzLCAgMHg2OCwgIDB4M2IsCisgIDB4NjksICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweDAzLCAgMHg0YiwgIDB4M2IsICAweDRjLCAgMHhmZSwgIDB4NDAsICAweDUwLCAgMHhmZSwgIDB4YzIsCisgIDB4NTAsICAweDA1LCAgMHg3MywgIDB4MmUsICAweDA3LCAgMHgyMCwgIDB4OWUsICAweDA1LCAgMHg3MiwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweDNkLCAgMHgyNywgIDB4MjUsCisgIDB4ZWUsICAweDA5LCAgMHgwNywgIDB4MmIsICAweDNkLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHhiYiwgIDB4MmIsICAweDcyLCAgMHgwMSwgIDB4YTYsICAweDIzLCAgMHgzZiwgIDB4MWIsCisgIDB4M2QsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDBkLCAgMHhmZSwgIDB4MWUsICAweDEzLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4ZmUsICAweDBhLCAgMHg1NSwgIDB4MzEsCisgIDB4ZmUsICAweDhiLCAgMHg1NSwgIDB4ZDksICAweDRiLCAgMHhkYSwgIDB4NGMsICAweGZlLCAgMHgwYywgIDB4NTEsICAweGZlLCAgMHg4ZSwgIDB4NTEsICAweDA1LCAgMHg3MiwgIDB4MDEsCisgIDB4ZmUsICAweDhlLCAgMHgxZSwgIDB4Y2EsICAweGZlLCAgMHgxOSwgIDB4NDEsICAweDA1LCAgMHg3MiwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4YzAsCisgIDB4MjcsICAweDI1LCAgMHhiZSwgIDB4MmQsICAweDFkLCAgMHhjMCwgIDB4MmQsICAweDBkLCAgMHg4MywgIDB4MmQsICAweDdmLCAgMHgxYiwgIDB4ZmUsICAweDY2LCAgMHgxNSwgIDB4MDUsCisgIDB4M2QsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4YzAsICAweDI3LCAgMHgyNSwgIDB4YmQsICAweDA5LCAgMHgxZCwgIDB4MmIsICAweDNkLCAgMHgwMSwgIDB4MDgsCisgIDB4MTYsICAweGMwLCAgMHgyNywgIDB4MjUsICAweGZlLCAgMHhlOCwgIDB4MDksICAweGZlLCAgMHhjMiwgIDB4NDksICAweDUwLCAgMHgwMywgIDB4YjYsICAweDFlLCAgMHg4MywgIDB4MDEsCisgIDB4MzgsICAweDA2LCAgMHgyNCwgIDB4MzEsICAweGExLCAgMHhmZSwgIDB4YmIsICAweDQ1LCAgMHgyZCwgIDB4MDAsICAweGE0LCAgMHg0NiwgIDB4MDcsICAweDkwLCAgMHgzZiwgIDB4MDEsCisgIDB4ZmUsICAweGY4LCAgMHgxNSwgIDB4MDEsICAweGE2LCAgMHg4NiwgIDB4ZmUsICAweDRiLCAgMHg0NSwgIDB4ZmUsICAweDIwLCAgMHgxMywgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ODIsCisgIDB4ZmUsICAweDE2LCAgMHgxMywgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4NWQsICAweDAzLCAgMHg1NSwgIDB4MWUsICAweDMxLCAgMHg1ZSwgIDB4MDUsICAweDcyLCAgMHhmZSwgIDB4YzAsCisgIDB4NWQsICAweDAxLCAgMHhhNywgIDB4ZmUsICAweDAzLCAgMHgxNywgIDB4MDMsICAweDY2LCAgMHg4YSwgIDB4MTAsICAweDY2LCAgMHg1ZSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTcsCisgIDB4NzMsICAweDAxLCAgMHhmZSwgIDB4NTYsICAweDE5LCAgMHgwNSwgIDB4NzMsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4M2QsICAweDI3LCAgMHgyNSwgIDB4YmQsCisgIDB4MDksICAweDA3LCAgMHgyYiwgIDB4M2QsICAweDAxLCAgMHhmZSwgIDB4YmUsICAweDE2LCAgMHhmZSwgIDB4NDIsICAweDU4LCAgMHhmZSwgIDB4ZTgsICAweDE0LCAgMHgwMSwgIDB4YTYsCisgIDB4ODYsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDBkLCAgMHgxYiwgIDB4M2QsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDA3LCAgMHhmZSwgIDB4MGUsICAweDEyLCAgMHgwMSwgIDB4NDMsCisgIDB4MDksICAweDgyLCAgMHg0ZSwgIDB4MDUsICAweDcyLCAgMHgwMywgIDB4NTUsICAweDhhLCAgMHgxMCwgIDB4NTUsICAweDVlLCAgMHgzMiwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4NzMsCisgIDB4MDEsICAweGZlLCAgMHg4NCwgIDB4MTksICAweDA1LCAgMHg3MywgIDB4MDEsICAweDA4LCAgMHgyYSwgIDB4M2MsICAweDE2LCAgMHgzZCwgIDB4MjcsICAweDI1LCAgMHhiZCwgIDB4MDksCisgIDB4MTIsICAweDJiLCAgMHgzZCwgIDB4MDEsICAweGZlLCAgMHhlOCwgIDB4MTcsICAweDhiLCAgMHhmZSwgIDB4YWEsICAweDE0LCAgMHhmZSwgIDB4YjYsICAweDE0LCAgMHg4NiwgIDB4YTgsCisgIDB4YjIsICAweDBkLCAgMHgxYiwgIDB4M2QsICAweGIyLCAgMHgwNywgIDB4ZmUsICAweDBlLCAgMHgxMiwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ODIsICAweDRlLCAgMHgwNSwgIDB4NzIsCisgIDB4MDMsICAweDZmLCAgMHg4YSwgIDB4MTAsICAweDZmLCAgMHg1ZSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweDczLCAgMHgwMSwgIDB4ZmUsICAweGMwLCAgMHgxOSwgIDB4MDUsCisgIDB4NzMsICAweDEzLCAgMHgwNywgIDB4MmYsICAweGZlLCAgMHhjYywgIDB4MTUsICAweDE3LCAgMHhmZSwgIDB4ZTIsICAweDE1LCAgMHg1ZiwgIDB4Y2MsICAweDAxLCAgMHgwOCwgIDB4MjYsCisgIDB4NWYsICAweDAyLCAgMHg4ZiwgIDB4ZmUsICAweGRlLCAgMHgxNSwgIDB4MmEsICAweGZlLCAgMHhkZSwgIDB4MTUsICAweDE2LCAgMHhmZSwgIDB4Y2MsICAweDE1LCAgMHg1ZSwgIDB4MzIsCisgIDB4MDEsICAweDA4LCAgMHhmZSwgIDB4ZDUsICAweDEwLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4YWQsICAweDIzLCAgMHhmZSwgIDB4ZmYsCisgIDB4N2YsICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDAyLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4YWQsCisgIDB4MjMsICAweDNmLCAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwMiwgIDB4MTMsICAweDU4LCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsCisgIDB4YWQsICAweDAyLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4ZmUsICAweDAwLCAgMHg1ZSwgIDB4MDIsICAweDEzLCAgMHg1OCwgIDB4ZmYsCisgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsICAweGFkLCAgMHhmZSwgIDB4MGIsICAweDU4LCAgMHgwMiwgIDB4MGEsICAweDY2LCAgMHgwMSwgIDB4NWMsICAweDBhLCAgMHg1NSwgIDB4MDEsCisgIDB4NWMsICAweDBhLCAgMHg2ZiwgIDB4MDEsICAweDVjLCAgMHgwMiwgIDB4MDEsICAweGZlLCAgMHgxZSwgIDB4MWYsICAweDIzLCAgMHgxYSwgIDB4ZmYsICAweDAzLCAgMHgwMCwgIDB4NTQsCisgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MjQsICAweDUyLCAgMHgwZiwgIDB4ZmUsICAweDAwLCAgMHg3YywgIDB4MDQsICAweGZlLCAgMHgwNywgIDB4N2MsICAweDNhLCAgMHgwYiwgIDB4MGUsCisgIDB4ZmUsICAweDAwLCAgMHg3MSwgIDB4ZmUsICAweGY5LCAgMHgxOCwgIDB4ZmUsICAweDdhLCAgMHgxOSwgIDB4ZmUsICAweGZiLCAgMHgxOSwgIDB4ZmUsICAweDFhLCAgMHhmNywgIDB4MDAsCisgIDB4ZmUsICAweDFiLCAgMHhmNywgIDB4MDAsICAweDdhLCAgMHgzMCwgIDB4MTAsICAweDY4LCAgMHgyMiwgIDB4NjksICAweGQ5LCAgMHg2YywgIDB4ZGEsICAweDZkLCAgMHgwMiwgIDB4ZmUsCisgIDB4NjIsICAweDA4LCAgMHhmZSwgIDB4ODIsICAweDRhLCAgMHhmZSwgIDB4ZTEsICAweDFhLCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHg3NywgIDB4MDIsICAweDAxLCAgMHhjNiwgIDB4ZmUsCisgIDB4NDIsICAweDQ4LCAgMHg0ZiwgIDB4NTAsICAweDQ1LCAgMHgwMSwgIDB4MDgsICAweDE2LCAgMHhmZSwgIDB4ZTAsICAweDE3LCAgMHgyNywgIDB4MjUsICAweGJlLCAgMHgwMSwgIDB4MDgsCisgIDB4MTYsICAweGZlLCAgMHhlMCwgIDB4MTcsICAweDI3LCAgMHgyNSwgIDB4ZmUsICAweGU4LCAgMHgwYSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4ZmUsCisgIDB4ZGEsICAweDEyLCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweGQwLCAgMHgxMywgIDB4MjYsICAweDUzLCAgMHgxMiwgIDB4NDgsICAweGZlLCAgMHgwOCwgIDB4MTcsCisgIDB4ZDEsICAweDEyLCAgMHg1MywgIDB4MTIsICAweGZlLCAgMHgxZSwgIDB4MTMsICAweDJkLCAgMHhiNCwgIDB4N2IsICAweGZlLCAgMHgyNiwgIDB4MTcsICAweDRkLCAgMHgxMywgIDB4MDcsCisgIDB4MWMsICAweGI0LCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHg3OCwgIDB4MTAsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHhmMSwgIDB4ZmYsICAweDAyLCAgMHg4MywgIDB4NTUsCisgIDB4NTMsICAweDFkLCAgMHhmZSwgIDB4MTIsICAweDEzLCAgMHhkNiwgIDB4ZmUsICAweDMwLCAgMHgwMCwgIDB4YjAsICAweGZlLCAgMHg4MCwgIDB4MTcsICAweDFjLCAgMHg2MywgIDB4MTMsCisgIDB4MDcsICAweGZlLCAgMHg1NiwgIDB4MTAsICAweDUzLCAgMHgwZCwgIDB4ZmUsICAweDE2LCAgMHgxMywgIDB4ZDYsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweGIwLCAgMHhmZSwgIDB4ODAsCisgIDB4MTcsICAweDBhLCAgMHhmZSwgIDB4NjQsICAweDAwLCAgMHgxYywgIDB4OTQsICAweDEzLCAgMHgwNywgIDB4ZmUsICAweDI4LCAgMHgxMCwgIDB4NTMsICAweDA3LCAgMHhmZSwgIDB4NjAsCisgIDB4MTMsICAweGQ2LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHhiMCwgIDB4ZmUsICAweDgwLCAgMHgxNywgIDB4MGEsICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDFjLCAgMHg5NSwgIDB4MTMsCisgIDB4MDcsICAweDcxLCAgMHhkNiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4NDgsICAweGZlLCAgMHg4YywgIDB4MTcsICAweDQ1LCAgMHhmMywgIDB4ZmUsICAweDQzLCAgMHhmNCwgIDB4OTYsCisgIDB4ZmUsICAweDU2LCAgMHhmMCwgIDB4ZmUsICAweDllLCAgMHgxNywgIDB4ZmUsICAweDA0LCAgMHhmNCwgIDB4NTgsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDk0LCAgMHhmNiwgIDB4OGIsCisgIDB4MDEsICAweGZlLCAgMHgyNCwgIDB4MTYsICAweDIzLCAgMHgzZiwgIDB4ZmMsICAweGE4LCAgMHg4YywgIDB4NDksICAweDQ4LCAgMHhmZSwgIDB4ZGEsICAweDE3LCAgMHg2MiwgIDB4NDksCisgIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4YTgsICAweDhjLCAgMHg4MCwgIDB4NDgsICAweGZlLCAgMHhkYSwgIDB4MTcsICAweDYyLCAgMHg4MCwgIDB4NzEsICAweDUwLCAgMHgyNiwgIDB4ZmUsCisgIDB4NGQsICAweGY0LCAgMHgwMCwgIDB4ZjcsICAweDQ1LCAgMHgxMywgIDB4MDcsICAweGZlLCAgMHhiNCwgIDB4NTYsICAweGZlLCAgMHhjMywgIDB4NTgsICAweDAyLCAgMHg1MCwgIDB4MTMsCisgIDB4MGQsICAweDAyLCAgMHg1MCwgIDB4M2UsICAweDc4LCAgMHg0ZiwgIDB4NDUsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweGE5LCAgMHgyNywgIDB4MjUsICAweGJlLCAgMHhmZSwgIDB4MDMsCisgIDB4ZWEsICAweGZlLCAgMHg3ZSwgIDB4MDEsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweGE5LCAgMHgyNywgIDB4MjUsICAweGZlLCAgMHhlOSwgIDB4MGEsICAweDAxLCAgMHgwOCwgIDB4MTYsCisgIDB4YTksICAweDI3LCAgMHgyNSwgIDB4ZmUsICAweGU5LCAgMHgwYSwgIDB4ZmUsICAweDA1LCAgMHhlYSwgIDB4ZmUsICAweDdmLCAgMHgwMSwgIDB4MDEsICAweDA4LCAgMHgxNiwgIDB4YTksCisgIDB4MjcsICAweDI1LCAgMHhmZSwgIDB4NjksICAweDA5LCAgMHhmZSwgIDB4MDIsICAweGVhLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHgwMSwgIDB4MDgsICAweDE2LCAgMHhhOSwgIDB4MjcsCisgIDB4MjUsICAweGZlLCAgMHhlOCwgIDB4MDgsICAweDQ3LCAgMHhmZSwgIDB4ODEsICAweDAxLCAgMHgwMywgIDB4YjYsICAweDFlLCAgMHg4MywgIDB4MDEsICAweDM4LCAgMHgwNiwgIDB4MjQsCisgIDB4MzEsICAweGEyLCAgMHg3OCwgIDB4ZjIsICAweDUzLCAgMHgwNywgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsICAweDNmLCAgMHhhMSwgIDB4NzgsICAweDAzLCAgMHg5YSwgIDB4MWUsCisgIDB4ODMsICAweDAxLCAgMHgzOCwgIDB4MDYsICAweDEyLCAgMHgzMSwgIDB4ZjAsICAweDRmLCAgMHg0NSwgIDB4ZmUsICAweDkwLCAgMHgxMCwgIDB4ZmUsICAweDQwLCAgMHg1YSwgIDB4MjMsCisgIDB4M2YsICAweGZiLCAgMHg4YywgIDB4NDksICAweDQ4LCAgMHhmZSwgIDB4YWEsICAweDE4LCAgMHg2MiwgIDB4NDksICAweDcxLCAgMHg4YywgIDB4ODAsICAweDQ4LCAgMHhmZSwgIDB4YWEsCisgIDB4MTgsICAweDYyLCAgMHg4MCwgIDB4ZmUsICAweGI0LCAgMHg1NiwgIDB4ZmUsICAweDQwLCAgMHg1ZCwgIDB4MDEsICAweGM2LCAgMHgwMSwgIDB4ZmUsICAweGFjLCAgMHgxZCwgIDB4ZmUsCisgIDB4MDIsICAweDE3LCAgMHhmZSwgIDB4YzgsICAweDQ1LCAgMHhmZSwgIDB4NWEsICAweGYwLCAgMHhmZSwgIDB4YzAsICAweDE4LCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHgyZCwgIDB4OTMsCisgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsICAweGZlLCAgMHgwMCwgIDB4MTEsICAweGZlLCAgMHg0MCwgIDB4MTAsICAweDJkLCAgMHhiNCwgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsCisgIDB4MDQsICAweGZlLCAgMHgzNCwgIDB4MTAsICAweDJkLCAgMHhmZSwgIDB4MGIsICAweDAwLCAgMHgzNiwgIDB4NDYsICAweDYzLCAgMHhmZSwgIDB4MjgsICAweDEwLCAgMHhmZSwgIDB4YzAsCisgIDB4NDksICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU0LCAgMHhiMiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4NDgsICAweGZlLCAgMHhmYSwgIDB4MTgsICAweDQ1LCAgMHhmZSwgIDB4MWMsCisgIDB4ZjQsICAweDNmLCAgMHhmMywgIDB4ZmUsICAweDQwLCAgMHhmNCwgIDB4OTYsICAweGZlLCAgMHg1NiwgIDB4ZjAsICAweGZlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHgwNCwgIDB4ZjQsCisgIDB4NTgsICAweGZlLCAgMHg0MCwgIDB4ZjQsICAweDk0LCAgMHhmNiwgIDB4M2UsICAweDJkLCAgMHg5MywgIDB4NGUsICAweGQwLCAgMHgwZCwgIDB4MjEsICAweGZlLCAgMHg3ZiwgIDB4MDEsCisgIDB4ZmUsICAweGM4LCAgMHg0NiwgIDB4ZmUsICAweDI0LCAgMHgxMywgIDB4OGMsICAweDAwLCAgMHg1ZCwgIDB4MjYsICAweDIxLCAgMHhmZSwgIDB4N2UsICAweDAxLCAgMHhmZSwgIDB4YzgsCisgIDB4NDUsICAweGZlLCAgMHgxNCwgIDB4MTMsICAweDIxLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHhmZSwgIDB4NDgsICAweDQ1LCAgMHhmYSwgIDB4MjEsICAweGZlLCAgMHg4MSwgIDB4MDEsCisgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4NGUsICAweDI2LCAgMHgwMiwgIDB4MTMsICAweDA3LCAgMHgwMiwgIDB4NzgsICAweDQ1LCAgMHg1MCwgIDB4MTMsICAweDBkLCAgMHgwMiwgIDB4MTQsCisgIDB4MDcsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweGZlLCAgMHg4MiwgIDB4MTksICAweDE0LCAgMHgwZCwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4ZmUsICAweDgyLCAgMHgxOSwgIDB4MTQsCisgIDB4MWQsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweGZlLCAgMHg4MiwgIDB4MTksICAweDVmLCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDAyLCAgMHgxNCwgIDB4MDcsCisgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDE0LCAgMHgxZCwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDE0LCAgMHgwNywgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsCisgIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDVmLCAgMHhmZSwgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDAyLCAgMHg1MCwgIDB4MDIsCisgIDB4MTQsICAweDA3LCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDdmLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDEyLCAgMHgwMSwgIDB4MDgsCisgIDB4MTcsICAweDc0LCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4ZmUsCisgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4ZmUsICAweDA5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4NzQsICAweDVmLCAgMHhjYywgIDB4MDEsCisgIDB4MDgsICAweDAyLCAgMHgyMSwgIDB4ZTQsICAweDA5LCAgMHgwNywgIDB4ZmUsICAweDRjLCAgMHgxMywgIDB4YzgsICAweDIwLCAgMHhlNCwgIDB4ZmUsICAweDQ5LCAgMHhmNCwgIDB4MDAsCisgIDB4NGQsICAweDVmLCAgMHhhMSwgIDB4NWUsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGZlLCAgMHgyNywgIDB4MDEsICAweGNjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MmYsCisgIDB4ZmUsICAweDNlLCAgMHgxYSwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ZmUsICAweGUzLCAgMHgwMCwgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4MTYsICAweGZlLCAgMHg2NCwgIDB4MWEsCisgIDB4MjYsICAweDIwLCAgMHg5ZSwgIDB4MDEsICAweDQxLCAgMHgyMSwgIDB4OWUsICAweDA5LCAgMHgwNywgIDB4NWQsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDA3LCAgMHg0NCwgIDB4MDIsCisgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHgwMCwgIDB4NDAsICAweGFhLCAgMHgwOSwgIDB4MWEsICAweGZlLCAgMHgxMiwgIDB4MTMsICAweDBhLCAgMHg5ZCwgIDB4MDEsCisgIDB4MTgsICAweGFhLCAgMHgwYSwgIDB4NjcsICAweDAxLCAgMHhhMywgIDB4MDIsICAweDBhLCAgMHg5ZCwgIDB4MDEsICAweDE4LCAgMHhhYSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MWEsCisgIDB4MDksICAweDFhLCAgMHg1ZCwgIDB4ZmUsICAweDQ1LCAgMHg1OCwgIDB4MDEsICAweGZlLCAgMHhiMiwgIDB4MTYsICAweGFhLCAgMHgwMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsCisgIDB4YWEsICAweDBhLCAgMHg2NywgIDB4MDEsICAweGEzLCAgMHgwMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweDAxLCAgMHhmZSwgIDB4N2UsICAweDFlLCAgMHhmZSwgIDB4ODAsCisgIDB4NGMsICAweGZlLCAgMHg0OSwgIDB4ZTQsICAweDFhLCAgMHhmZSwgIDB4MTIsICAweDEzLCAgMHgwYSwgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg0YywgIDB4MGEsCisgIDB4NjcsICAweDAxLCAgMHg1YywgIDB4MDIsICAweDFjLCAgMHgxYSwgIDB4ODcsICAweDdjLCAgMHhlNSwgIDB4ZmUsICAweDE4LCAgMHhkZiwgIDB4ZmUsICAweDE5LCAgMHhkZSwgIDB4ZmUsCisgIDB4MjQsICAweDFjLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgyOCwgIDB4YjEsICAweGZlLCAgMHgwNCwgIDB4MWIsICAweDAxLCAgMHhmZSwgIDB4MmEsICAweDFjLCAgMHhmYSwgIDB4YjMsCisgIDB4MjgsICAweDdjLCAgMHhmZSwgIDB4MmMsICAweDAxLCAgMHhmZSwgIDB4MmYsICAweDE5LCAgMHgwMiwgIDB4YzksICAweDJiLCAgMHhmZSwgIDB4ZjQsICAweDFhLCAgMHhmZSwgIDB4ZmEsCisgIDB4MTAsICAweDFjLCAgMHgxYSwgIDB4ODcsICAweDAzLCAgMHhmZSwgIDB4NjQsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweGY0LCAgMHgyNCwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDMsCisgIDB4ZmUsICAweDY2LCAgMHgwMSwgIDB4ZmUsICAweDE5LCAgMHg1OCwgIDB4YjMsICAweDI0LCAgMHgwMSwgIDB4ZmUsICAweDBlLCAgMHgxZiwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MDcsCisgIDB4ZmUsICAweDNjLCAgMHg1MCwgIDB4N2MsICAweGZlLCAgMHgzOCwgIDB4MDAsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDI0LCAgMHhiMSwgIDB4ZmUsCisgIDB4NTAsICAweDFiLCAgMHhmZSwgIDB4ZDQsICAweDE0LCAgMHgzMSwgIDB4MDIsICAweGM5LCAgMHgyYiwgIDB4ZmUsICAweDI2LCAgMHgxYiwgIDB4ZmUsICAweGJhLCAgMHgxMCwgIDB4MWMsCisgIDB4MWEsICAweDg3LCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg1NCwgIDB4YjEsCisgIDB4ZmUsICAweDcyLCAgMHgxYiwgIDB4ZmUsICAweGIyLCAgMHgxNCwgIDB4ZmMsICAweGIzLCAgMHg1NCwgIDB4N2MsICAweDEyLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsCisgIDB4ZTcsICAweDAwLCAgMHgwMiwgIDB4YzksICAweDJiLCAgMHhmZSwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4OGEsICAweDEwLCAgMHgxYywgIDB4MWEsICAweDg3LCAgMHg4YiwgIDB4MGYsCisgIDB4ZmUsICAweDMwLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhiMCwgIDB4OTMsICAweDNhLCAgMHgwYiwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4ZmUsICAweDMyLCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweGIyLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4MTksICAweDU4LCAgMHgwZSwgIDB4YTgsICAweGIzLCAgMHg0YSwgIDB4N2MsICAweDEyLCAgMHhmZSwgIDB4MGYsCisgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDRhLCAgMHhiMSwgIDB4ZmUsICAweGM2LCAgMHgxYiwgIDB4ZmUsICAweDVlLCAgMHgxNCwgIDB4MzEsICAweDAyLCAgMHhjOSwgIDB4MmIsCisgIDB4ZmUsICAweDk2LCAgMHgxYiwgIDB4NWMsICAweGZlLCAgMHgwMiwgIDB4ZjYsICAweDFhLCAgMHg4NywgIDB4ZmUsICAweDE4LCAgMHhmZSwgIDB4NmEsICAweGZlLCAgMHgxOSwgIDB4ZmUsCisgIDB4NmIsICAweDAxLCAgMHhmZSwgIDB4MWUsICAweDFmLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg2NSwgIDB4YjEsICAweGZlLCAgMHhlZSwgIDB4MWIsICAweGZlLCAgMHgzNiwgIDB4MTQsCisgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4YjMsICAweDY1LCAgMHgzZSwgIDB4ZmUsICAweDgzLCAgMHg1OCwgIDB4ZmUsICAweGFmLCAgMHgxOSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MWEsCisgIDB4ZmUsICAweDgxLCAgMHhlNywgIDB4MWEsICAweDE1LCAgMHhmZSwgIDB4ZGQsICAweDAwLCAgMHg3YSwgIDB4MzAsICAweDAyLCAgMHg3YSwgIDB4MzAsICAweGZlLCAgMHgxMiwgIDB4NDUsCisgIDB4MmIsICAweGZlLCAgMHhkYywgIDB4MWIsICAweDFmLCAgMHgwNywgIDB4NDcsICAweGI1LCAgMHhjMywgIDB4MDUsICAweDM1LCAgMHhmZSwgIDB4MzksICAweGYwLCAgMHg3NSwgIDB4MjYsCisgIDB4MDIsICAweGZlLCAgMHg3ZSwgIDB4MTgsICAweDIzLCAgMHgxZCwgIDB4MzYsICAweDEzLCAgMHgxMSwgIDB4MDIsICAweDg3LCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4ZmUsCisgIDB4ZWYsICAweDEyLCAgMHhmZSwgIDB4ZTEsICAweDEwLCAgMHg5MCwgIDB4MzQsICAweDYwLCAgMHhmZSwgIDB4MDIsICAweDgwLCAgMHgwOSwgIDB4NTYsICAweGZlLCAgMHgzYywgIDB4MTMsCisgIDB4ZmUsICAweDgyLCAgMHgxNCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4NTEsICAweGZlLCAgMHgwNiwgIDB4ODMsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHhjYiwgIDB4ZmUsCisgIDB4M2UsICAweDEyLCAgMHhmZSwgIDB4NDEsICAweDQ4LCAgMHhmZSwgIDB4NDUsICAweDQ4LCAgMHgwMSwgIDB4ZmUsICAweGIyLCAgMHgxNiwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4Y2IsCisgIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4M2YsICAweDg5LCAgMHgwOSwgIDB4MWEsICAweGE1LCAgMHgwYSwgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg0YywgIDB4MDEsCisgIDB4ODUsICAweGZlLCAgMHgxNiwgIDB4MTAsICAweDA5LCAgMHg5YiwgIDB4NGUsICAweGZlLCAgMHg0MCwgIDB4MTQsICAweGZlLCAgMHgyNCwgIDB4MTIsICAweGZlLCAgMHgxNCwgIDB4NTYsCisgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDUyLCAgMHgxYywgIDB4MWMsICAweDBkLCAgMHgwMiwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MGQsICAweDE5LCAgMHhmZSwgIDB4MTUsCisgIDB4MDAsICAweDQwLCAgMHg4ZCwgIDB4MzAsICAweDAxLCAgMHhmNCwgIDB4MWMsICAweDA3LCAgMHgwMiwgIDB4NTEsICAweGZlLCAgMHgwNiwgIDB4ODMsICAweGZlLCAgMHgxOCwgIDB4ODAsCisgIDB4NjEsICAweDI4LCAgMHg0NCwgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ODUsICAweDFjLCAgMHgwNywgIDB4MDIsICAweGZlLCAgMHgzOCwgIDB4OTAsICAweGZlLCAgMHhiYSwgIDB4OTAsCisgIDB4OTEsICAweGRlLCAgMHg3ZSwgIDB4ZGYsICAweGZlLCAgMHg0OCwgIDB4NTUsICAweDMxLCAgMHhmZSwgIDB4YzksICAweDU1LCAgMHgwMiwgIDB4MjEsICAweGI5LCAgMHg4OCwgIDB4MjAsCisgIDB4YjksICAweDAyLCAgMHgwYSwgIDB4YmEsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4MGEsICAweDU3LCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg0OSwgIDB4NDQsCisgIDB4MWIsICAweGZlLCAgMHgxZSwgIDB4MWQsICAweDg4LCAgMHg4OSwgIDB4MDIsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHgwOSwgIDB4MWEsICAweGE0LCAgMHgwYSwgIDB4NjcsCisgIDB4MDEsICAweGEzLCAgMHgwYSwgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4ODgsICAweDg5LCAgMHgwMiwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4MWQsICAweDdiLCAgMHhmZSwgIDB4NTIsCisgIDB4MWQsICAweDAzLCAgMHhmZSwgIDB4OTAsICAweDAwLCAgMHhmZSwgIDB4M2EsICAweDQ1LCAgMHhmZSwgIDB4MmMsICAweDEwLCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhkZCwgIDB4N2IsCisgIDB4ZmUsICAweDY0LCAgMHgxZCwgIDB4MDMsICAweGZlLCAgMHg5MiwgIDB4MDAsICAweGQxLCAgMHgxMiwgIDB4ZmUsICAweDFhLCAgMHgxMCwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4ZmUsCisgIDB4MGIsICAweDAwLCAgMHg3YiwgIDB4ZmUsICAweDc2LCAgMHgxZCwgIDB4MDMsICAweGZlLCAgMHg5NCwgIDB4MDAsICAweGQxLCAgMHgyNCwgIDB4ZmUsICAweDA4LCAgMHgxMCwgIDB4MDMsCisgIDB4ZmUsICAweDk2LCAgMHgwMCwgIDB4ZDEsICAweDYzLCAgMHhmZSwgIDB4NGUsICAweDQ1LCAgMHg4MywgIDB4Y2EsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhmZSwgIDB4ZjEsCisgIDB4MTAsICAweDIzLCAgMHg0OSwgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4ZmUsICAweDY3LCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4ZmUsICAweDFhLCAgMHhmNCwgIDB4ZmUsCisgIDB4MDAsICAweDA0LCAgMHg4MywgIDB4YjIsICAweDFkLCAgMHg0OCwgIDB4ZmUsICAweGFhLCAgMHgxZCwgIDB4MTMsICAweDFkLCAgMHgwMiwgIDB4MDksICAweDkyLCAgMHhmZSwgIDB4NWEsCisgIDB4ZjAsICAweGZlLCAgMHhiYSwgIDB4MWQsICAweDJlLCAgMHg5MywgIDB4ZmUsICAweDM0LCAgMHgxMCwgIDB4MDksICAweDEyLCAgMHhmZSwgIDB4NWEsICAweGYwLCAgMHhmZSwgIDB4YzgsCisgIDB4MWQsICAweDJlLCAgMHhiNCwgIDB4ZmUsICAweDI2LCAgMHgxMCwgIDB4MDksICAweDFkLCAgMHgzNiwgIDB4MmUsICAweDYzLCAgMHhmZSwgIDB4MWEsICAweDEwLCAgMHgwOSwgIDB4MGQsCisgIDB4MzYsICAweDJlLCAgMHg5NCwgIDB4ZjIsICAweDA5LCAgMHgwNywgIDB4MzYsICAweDJlLCAgMHg5NSwgIDB4YTEsICAweGM4LCAgMHgwMiwgIDB4MWYsICAweDkzLCAgMHgwMSwgIDB4NDIsCisgIDB4ZmUsICAweDA0LCAgMHhmZSwgIDB4OTksICAweDAzLCAgMHg5YywgIDB4OGIsICAweDAyLCAgMHgyYSwgIDB4ZmUsICAweDFjLCAgMHgxZSwgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MDgsCisgIDB4MmYsICAweGZlLCAgMHgwYywgIDB4MWUsICAweDJhLCAgMHhmZSwgIDB4MWMsICAweDFlLCAgMHg4ZiwgIDB4ZmUsICAweDFjLCAgMHgxZSwgIDB4ZmUsICAweDgyLCAgMHhmMCwgIDB4ZmUsCisgIDB4MTAsICAweDFlLCAgMHgwMiwgIDB4MGYsICAweDNmLCAgMHgwNCwgIDB4ZmUsICAweDgwLCAgMHg4MywgIDB4MzMsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MTgsCisgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4OTgsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgwMiwgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODIsCisgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4NiwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsCisgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MWIsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDliLCAgMHg4MywgIDB4MzMsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MDQsCisgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODQsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHg4MCwgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODAsCisgIDB4ODMsICAweGZlLCAgMHhjOSwgIDB4NDcsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MTksICAweDgxLCAgMHgwNCwgIDB4ZmUsICAweDk5LCAgMHg4MywgIDB4ZmUsCisgIDB4Y2EsICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA2LCAgMHg4MywgIDB4MDQsICAweGZlLCAgMHg4NiwgIDB4ODMsICAweGZlLCAgMHhjZSwgIDB4NDcsCisgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgyYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4YWMsICAweDkzLCAgMHgzYSwgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsCisgIDB4ZmUsICAweGFlLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhhZSwgIDB4OTMsICAweDc5LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA4LCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweDg4LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4OGEsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDhhLCAgMHg5MywgIDB4NzksCisgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgwYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4OGMsICAweDkzLCAgMHgzYSwgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsCisgIDB4ZmUsICAweDhlLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHg4ZSwgIDB4OTMsICAweDc5LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4MDQsCisgIDB4ZmUsICAweGJjLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDhiLCAgMHgwZiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4MywgIDB4ODMsCisgIDB4MzMsICAweDBiLCAgMHg3NywgIDB4MGUsICAweGE4LCAgMHgwMiwgIDB4ZmYsICAweDY2LCAgMHgwMCwgIDB4MDAsCit9OworCitTVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzOEMxNjAwX3NpemUgPQorICAgICAgICBzaXplb2YoX2Fkdl9hc2MzOEMxNjAwX2J1Zik7IC8qIDB4MTY3MyAqLworU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzhDMTYwMF9jaGtzdW0gPQorICAgICAgICAweDA2MDRFRjc3VUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCisKKy8qIGFfaW5pdC5jICovCisvKgorICogRUVQUk9NIENvbmZpZ3VyYXRpb24uCisgKgorICogQWxsIGRyaXZlcnMgc2hvdWxkIHVzZSB0aGlzIHN0cnVjdHVyZSB0byBzZXQgdGhlIGRlZmF1bHQgRUVQUk9NCisgKiBjb25maWd1cmF0aW9uLiBUaGUgQklPUyBub3cgdXNlcyB0aGlzIHN0cnVjdHVyZSB3aGVuIGl0IGlzIGJ1aWx0LgorICogQWRkaXRpb25hbCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIGFfY29uZG9yLmggd2hlcmUKKyAqIHRoZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZC4KKyAqCisgKiBUaGUgKl9GaWVsZF9Jc0NoYXIgc3RydWN0cyBhcmUgbmVlZGVkIHRvIGNvcnJlY3QgZm9yIGVuZGlhbm5lc3MuCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHJlYWQgZnJvbSB0aGUgYm9hcmQgMTYgYml0cyBhdCBhIHRpbWUgZGlyZWN0bHkKKyAqIGludG8gdGhlIHN0cnVjdHMuIEJlY2F1c2Ugc29tZSBmaWVsZHMgYXJlIGNoYXIsIHRoZSB2YWx1ZXMgd2lsbCBiZQorICogaW4gdGhlIHdyb25nIG9yZGVyLiBUaGUgKl9GaWVsZF9Jc0NoYXIgdGVsbHMgd2hlbiB0byBmbGlwIHRoZQorICogYnl0ZXMuIERhdGEgcmVhZCBhbmQgd3JpdHRlbiB0byBQQ0kgbWVtb3J5IGlzIGF1dG9tYXRpY2FsbHkgc3dhcHBlZAorICogb24gYmlnLWVuZGlhbiBwbGF0Zm9ybXMgc28gY2hhciBmaWVsZHMgcmVhZCBhcyB3b3JkcyBhcmUgYWN0dWFsbHkgYmVpbmcKKyAqIHVuc3dhcHBlZCBvbiBiaWctZW5kaWFuIHBsYXRmb3Jtcy4KKyAqLworU1RBVElDIEFEVkVFUF8zNTUwX0NPTkZJRworRGVmYXVsdF8zNTUwX0VFUFJPTV9Db25maWcgX19pbml0ZGF0YSA9IHsKKyAgICBBRFZfRUVQUk9NX0JJT1NfRU5BQkxFLCAgICAgLyogY2ZnX2xzdyAqLworICAgIDB4MDAwMCwgICAgICAgICAgICAgICAgICAgICAvKiBjZmdfbXN3ICovCisgICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2NfZW5hYmxlICovCisgICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIHdkdHJfYWJsZSAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiBzZHRyX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRfbW90b3IgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogdGFncW5nX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19zY2FuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYW1fdG9sZXJhbnQgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRlcl9zY3NpX2lkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfYm9vdF9kZWxheSAqLworICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY3NpX3Jlc2V0X2RlbGF5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfaWRfbHVuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmF0aW9uICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkMSAqLworICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiBiaW9zX2N0cmwgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogdWx0cmFfYWJsZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZDIgKi8KKyAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogbWF4X2hvc3RfcW5nICovCisgICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qIG1heF9kdmNfcW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR2Y19jbnRsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1Z19maXggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsX251bWJlcl93b3JkMSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfbnVtYmVyX3dvcmQyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcmlhbF9udW1iZXJfd29yZDMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfc3VtICovCisgICAgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0sIC8qIG9lbV9uYW1lWzE2XSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkdmNfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2X2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkdl9lcnJfYWRkciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZF9kdmNfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZWRfYWR2X2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkX2Fkdl9lcnJfYWRkciAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1fb2ZfZXJyICovCit9OworCitTVEFUSUMgQURWRUVQXzM1NTBfQ09ORklHCitBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyIF9faW5pdGRhdGEgPSB7CisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNmZ19sc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2ZnX21zdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtZGlzY19lbmFibGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2R0cl9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNkdHJfYWJsZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydF9tb3RvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWdxbmdfYWJsZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW9zX3NjYW4gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbV90b2xlcmFudCAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGVyX3Njc2lfaWQgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19ib290X2RlbGF5ICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjc2lfcmVzZXRfZGVsYXkgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19pZF9sdW4gKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpb24gKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfY3RybCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bHRyYV9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkMiAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhfaG9zdF9xbmcgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4X2R2Y19xbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHZjX2NudGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVnX2ZpeCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsX251bWJlcl93b3JkMyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja19zdW0gKi8KKyAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogb2VtX25hbWVbMTZdICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkX2R2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZWRfYWR2X2Vycl9hZGRyICovCisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bV9vZl9lcnIgKi8KK307CisKK1NUQVRJQyBBRFZFRVBfMzhDMDgwMF9DT05GSUcKK0RlZmF1bHRfMzhDMDgwMF9FRVBST01fQ29uZmlnIF9faW5pdGRhdGEgPSB7CisgICAgQURWX0VFUFJPTV9CSU9TX0VOQUJMRSwgICAgIC8qIDAwIGNmZ19sc3cgKi8KKyAgICAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgLyogMDEgY2ZnX21zdyAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMiBkaXNjX2VuYWJsZSAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMyB3ZHRyX2FibGUgKi8KKyAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMDQgc2R0cl9zcGVlZDEgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDUgc3RhcnRfbW90b3IgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDYgdGFncW5nX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDcgYmlvc19zY2FuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDkgYWRhcHRlcl9zY3NpX2lkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfYm9vdF9kZWxheSAqLworICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfaWRfbHVuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIHRlcm1pbmF0aW9uX3NlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLworICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiAxMiBiaW9zX2N0cmwgKi8KKyAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2R0cl9zcGVlZDIgKi8KKyAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMTQgc2R0cl9zcGVlZDMgKi8KKyAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogMTUgbWF4X2hvc3RfcW5nICovCisgICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qICAgIG1heF9kdmNfcW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGR2Y19jbnRsICovCisgICAgMHg0NDQ0LCAgICAgICAgICAgICAgICAgICAgIC8qIDE3IHNkdHJfc3BlZWQ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIGNoZWNrX3N1bSAqLworICAgIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9LCAvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGFkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBhZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTYgY2lzcHRyX2xzdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NyBjaXNwcnRfbXN3ICovCisgICAgQURWX1BDSV9WRU5ET1JfSUQsICAgICAgICAgIC8qIDU4IHN1YnN5c3ZpZCAqLworICAgIEFEVl9QQ0lfREVWSURfMzhDMDgwMF9SRVYxLCAvKiA1OSBzdWJzeXNpZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiByZXNlcnZlZCAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyByZXNlcnZlZCAqLworfTsKKworU1RBVElDIEFEVkVFUF8zOEMwODAwX0NPTkZJRworQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMCBjZmdfbHN3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxIGNmZ19tc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDIgZGlzY19lbmFibGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDMgd2R0cl9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0IHNkdHJfc3BlZWQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1IHN0YXJ0X21vdG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2IHRhZ3FuZ19hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA3IGJpb3Nfc2NhbiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOCBzY2FtX3RvbGVyYW50ICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2Jvb3RfZGVsYXkgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2lkX2x1biAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSB0ZXJtaW5hdGlvbl9zZSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgYmlvc19jdHJsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzIHNkdHJfc3BlZWQyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IHNkdHJfc3BlZWQzICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IG1heF9ob3N0X3FuZyAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBtYXhfZHZjX3FuZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBkdmNfY250bCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBzZHRyX3NwZWVkNCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSBjaGVja19zdW0gKi8KKyAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogMjItMjkgb2VtX25hbWVbMTZdICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIGR2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBhZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMzIHNhdmVkX2R2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgc2F2ZWRfYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU2IGNpc3B0cl9sc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTcgY2lzcHJ0X21zdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OCBzdWJzeXN2aWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTkgc3Vic3lzaWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KKyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK307CisKK1NUQVRJQyBBRFZFRVBfMzhDMTYwMF9DT05GSUcKK0RlZmF1bHRfMzhDMTYwMF9FRVBST01fQ29uZmlnIF9faW5pdGRhdGEgPSB7CisgICAgQURWX0VFUFJPTV9CSU9TX0VOQUJMRSwgICAgIC8qIDAwIGNmZ19sc3cgKi8KKyAgICAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgLyogMDEgY2ZnX21zdyAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMiBkaXNjX2VuYWJsZSAqLworICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMyB3ZHRyX2FibGUgKi8KKyAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMDQgc2R0cl9zcGVlZDEgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDUgc3RhcnRfbW90b3IgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDYgdGFncW5nX2FibGUgKi8KKyAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDcgYmlvc19zY2FuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDkgYWRhcHRlcl9zY3NpX2lkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfYm9vdF9kZWxheSAqLworICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfaWRfbHVuICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIHRlcm1pbmF0aW9uX3NlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLworICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiAxMiBiaW9zX2N0cmwgKi8KKyAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2R0cl9zcGVlZDIgKi8KKyAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMTQgc2R0cl9zcGVlZDMgKi8KKyAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogMTUgbWF4X2hvc3RfcW5nICovCisgICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qICAgIG1heF9kdmNfcW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGR2Y19jbnRsICovCisgICAgMHg1NTU1LCAgICAgICAgICAgICAgICAgICAgIC8qIDE3IHNkdHJfc3BlZWQ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIGNoZWNrX3N1bSAqLworICAgIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9LCAvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGFkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBhZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTYgY2lzcHRyX2xzdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NyBjaXNwcnRfbXN3ICovCisgICAgQURWX1BDSV9WRU5ET1JfSUQsICAgICAgICAgIC8qIDU4IHN1YnN5c3ZpZCAqLworICAgIEFEVl9QQ0lfREVWSURfMzhDMTYwMF9SRVYxLCAvKiA1OSBzdWJzeXNpZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSByZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiByZXNlcnZlZCAqLworICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyByZXNlcnZlZCAqLworfTsKKworU1RBVElDIEFEVkVFUF8zOEMxNjAwX0NPTkZJRworQURWRUVQXzM4QzE2MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMCBjZmdfbHN3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxIGNmZ19tc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDIgZGlzY19lbmFibGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDMgd2R0cl9hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0IHNkdHJfc3BlZWQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1IHN0YXJ0X21vdG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2IHRhZ3FuZ19hYmxlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA3IGJpb3Nfc2NhbiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOCBzY2FtX3RvbGVyYW50ICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2Jvb3RfZGVsYXkgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2lkX2x1biAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSB0ZXJtaW5hdGlvbl9zZSAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgYmlvc19jdHJsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzIHNkdHJfc3BlZWQyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IHNkdHJfc3BlZWQzICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IG1heF9ob3N0X3FuZyAqLworICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBtYXhfZHZjX3FuZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBkdmNfY250bCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBzZHRyX3NwZWVkNCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSBjaGVja19zdW0gKi8KKyAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogMjItMjkgb2VtX25hbWVbMTZdICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIGR2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBhZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMzIHNhdmVkX2R2Y19lcnJfY29kZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgc2F2ZWRfYWR2X2Vycl9hZGRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU2IGNpc3B0cl9sc3cgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTcgY2lzcHJ0X21zdyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OCBzdWJzeXN2aWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTkgc3Vic3lzaWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KKyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBRFZfRFZDX1ZBUiBzdHJ1Y3R1cmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKi8KK1NUQVRJQyBpbnQgX19pbml0CitBZHZJbml0R2V0Q29uZmlnKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIHVzaG9ydCAgICAgIHdhcm5fY29kZTsKKyAgICBBZHZQb3J0QWRkciBpb3BfYmFzZTsKKyAgICB1Y2hhciAgICAgICBwY2lfY21kX3JlZzsKKyAgICBpbnQgICAgICAgICBzdGF0dXM7CisKKyAgICB3YXJuX2NvZGUgPSAwOworICAgIGFzY19kdmMtPmVycl9jb2RlID0gMDsKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBQQ0kgQ29tbWFuZCBSZWdpc3RlcgorICAgICAqCisgICAgICogTm90ZTogQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcgZGVmaW5pdGlvbiAoMHgwMDA3KSBpbmNsdWRlcworICAgICAqIEkvTyBTcGFjZSBDb250cm9sLCBNZW1vcnkgU3BhY2UgQ29udHJvbCBhbmQgQnVzIE1hc3RlciBDb250cm9sIGJpdHMuCisgICAgICovCisKKyAgICBpZiAoKChwY2lfY21kX3JlZyA9IER2Y0FkdlJlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKSkKKyAgICAgICAgICYgQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCisgICAgICAgICE9IEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nKQorICAgIHsKKyAgICAgICAgcGNpX2NtZF9yZWcgfD0gQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmc7CisKKyAgICAgICAgRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyLCBwY2lfY21kX3JlZyk7CisKKyAgICAgICAgaWYgKCgoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKSkKKyAgICAgICAgICAgICAmIEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nKQorICAgICAgICAgICAgIT0gQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUENJIExhdGVuY3kgVGltZXIKKyAgICAgKgorICAgICAqIElmIHRoZSAibGF0ZW5jeSB0aW1lciIgcmVnaXN0ZXIgaXMgMHgyMCBvciBhYm92ZSwgdGhlbiB3ZSBkb24ndCBuZWVkCisgICAgICogdG8gY2hhbmdlIGl0LiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gMHgyMCAoaS5lLiBzZXQgaXQgdG8gMHgyMCBpZiBpdAorICAgICAqIGNvbWVzIHVwIGxlc3MgdGhhbiAweDIwKS4KKyAgICAgKi8KKyAgICBpZiAoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8IDB4MjApIHsKKyAgICAgICAgRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgyMCk7CisgICAgICAgIGlmIChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdMYXRlbmN5VGltZXIpIDwgMHgyMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlcgorICAgICAqICJQYXJpdHkgRXJyb3IgUmVzcG9uc2UgQ29udHJvbCIgQml0LiBJZiB0aGUgYml0IGlzIGNsZWFyICgwKSwKKyAgICAgKiBpbiBBZHZJbml0QXNjMzU1MC8zOEMwODAwRHJpdmVyKCkgdGVsbCB0aGUgbWljcm9jb2RlIHRvIGlnbm9yZQorICAgICAqIERNQSBwYXJpdHkgZXJyb3JzLgorICAgICAqLworICAgIGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnID0gMDsKKyAgICBpZiAoKChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpCisgICAgICAgICAmIEFzY1BDSUNtZFJlZ0JpdHNfUGFyRXJyUmVzcEN0cmwpKSA9PSAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5jb250cm9sX2ZsYWcgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOworICAgIH0KKworICAgIGFzY19kdmMtPmNmZy0+bGliX3ZlcnNpb24gPSAoQURWX0xJQl9WRVJTSU9OX01BSk9SIDw8IDgpIHwKKyAgICAgIEFEVl9MSUJfVkVSU0lPTl9NSU5PUjsKKyAgICBhc2NfZHZjLT5jZmctPmNoaXBfdmVyc2lvbiA9CisgICAgICBBZHZHZXRDaGlwVmVyc2lvbihpb3BfYmFzZSwgYXNjX2R2Yy0+YnVzX3R5cGUpOworCisgICAgQVNDX0RCRzIoMSwgIkFkdkluaXRHZXRDb25maWc6IGlvcGJfY2hpcF9pZF8xOiAweCV4IDB4JXhcbiIsCisgICAgICAgICh1c2hvcnQpIEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfQ0hJUF9JRF8xKSwKKyAgICAgICAgKHVzaG9ydCkgQURWX0NISVBfSURfQllURSk7CisKKyAgICBBU0NfREJHMigxLCAiQWR2SW5pdEdldENvbmZpZzogaW9wd19jaGlwX2lkXzA6IDB4JXggMHgleFxuIiwKKyAgICAgICAgKHVzaG9ydCkgQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DSElQX0lEXzApLAorICAgICAgICAodXNob3J0KSBBRFZfQ0hJUF9JRF9XT1JEKTsKKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIGNoaXAgdG8gc3RhcnQgYW5kIGFsbG93IHJlZ2lzdGVyIHdyaXRlcy4KKyAgICAgKi8KKyAgICBpZiAoQWR2RmluZFNpZ25hdHVyZShpb3BfYmFzZSkgPT0gMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBjYWxsZXIgbXVzdCBzZXQgJ2NoaXBfdHlwZScgdG8gYSB2YWxpZCBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzNTUwICYmCisgICAgICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzhDMDgwMCAmJgorICAgICAgICAgICAgYXNjX2R2Yy0+Y2hpcF90eXBlICE9IEFEVl9DSElQX0FTQzM4QzE2MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JBRF9DSElQVFlQRTsKKyAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCBDaGlwLgorICAgICAgICAgKi8KKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ1RSTF9SRUcsCisgICAgICAgICAgICBBRFZfQ1RSTF9SRUdfQ01EX1JFU0VUKTsKKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DVFJMX1JFRywKKyAgICAgICAgICAgIEFEVl9DVFJMX1JFR19DTURfV1JfSU9fUkVHKTsKKworICAgICAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzE2MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc3RhdHVzID0gQWR2SW5pdEZyb20zOEMxNjAwRUVQKGFzY19kdmMpKSA9PSBBRFZfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBBZHZJbml0RnJvbTM4QzA4MDBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBBZHZJbml0RnJvbTM1NTBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdhcm5fY29kZSB8PSBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdhcm5fY29kZTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIEFTQy0zNTUwLgorICoKKyAqIE9uIGZhaWx1cmUgc2V0IHRoZSBBRFZfRFZDX1ZBUiBmaWVsZCAnZXJyX2NvZGUnIGFuZCByZXR1cm4gQURWX0VSUk9SLgorICoKKyAqIEZvciBhIG5vbi1mYXRhbCBlcnJvciByZXR1cm4gYSB3YXJuaW5nIGNvZGUuIElmIHRoZXJlIGFyZSBubyB3YXJuaW5ncworICogdGhlbiAwIGlzIHJldHVybmVkLgorICoKKyAqIE5lZWRlZCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuCisgKi8KK1NUQVRJQyBpbnQKK0FkdkluaXRBc2MzNTUwRHJpdmVyKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOworICAgIHVzaG9ydCAgICAgIHdhcm5fY29kZTsKKyAgICBBRFZfRENOVCAgICBzdW07CisgICAgaW50ICAgICAgICAgYmVnaW5fYWRkcjsKKyAgICBpbnQgICAgICAgICBlbmRfYWRkcjsKKyAgICB1c2hvcnQgICAgICBjb2RlX3N1bTsKKyAgICBpbnQgICAgICAgICB3b3JkOworICAgIGludCAgICAgICAgIGo7CisgICAgaW50ICAgICAgICAgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZTsKKyAgICBBRFZfQ0FSUl9UICAqY2FycnA7CisgICAgQURWX0RDTlQgICAgY29udGlnX2xlbjsKKyAgICBBRFZfU0RDTlQgICBidWZfc2l6ZTsKKyAgICBBRFZfUEFERFIgICBjYXJyX3BhZGRyOworICAgIGludCAgICAgICAgIGk7CisgICAgdXNob3J0ICAgICAgc2NzaV9jZmcxOworICAgIHVjaGFyICAgICAgIHRpZDsKKyAgICB1c2hvcnQgICAgICBiaW9zX21lbVtBU0NfTUNfQklPU0xFTi8yXTsgLyogQklPUyBSSVNDIE1lbW9yeSAweDQwLTB4OEYuICovCisgICAgdXNob3J0ICAgICAgd2R0cl9hYmxlID0gMCwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKyAgICB1Y2hhciAgICAgICBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVycm9yLCBkb24ndCBjb250aW51ZS4gKi8KKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIEFEVl9DSElQX0FTQzM1NTAuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQkFEX0NISVBUWVBFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIHdhcm5fY29kZSA9IDA7CisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24gYmVmb3JlIHdyaXRpbmcgdGhlIG1pY3JvY29kZS4KKyAgICAgKiBUaGUgQklPUyBtYXkgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHVzaW5nIGl0cyBSSVNDIExSQU0gcmVnaW9uCisgICAgICogc28gaXRzIHJlZ2lvbiBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZC4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgY29kZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiwgd2hpY2ggaXMgY3VycmVudGx5IHRydWUsCisgICAgICogdGhhdCBhIGNoaXAgcmVzZXQgZG9lcyBub3QgY2xlYXIgUklTQyBMUkFNLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCisgICAgeworICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwgYmlvc19tZW1baV0pOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSBjdXJyZW50IHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkvMl0gPT0gMHg1NUFBKQorICAgIHsKKyAgICAgICAgdXNob3J0ICBiaW9zX3ZlcnNpb24sIG1ham9yLCBtaW5vcjsKKworICAgICAgICBiaW9zX3ZlcnNpb24gPSBiaW9zX21lbVsoQVNDX01DX0JJT1NfVkVSU0lPTiAtIEFTQ19NQ19CSU9TTUVNKS8yXTsKKyAgICAgICAgbWFqb3IgPSAoYmlvc192ZXJzaW9uICA+PiAxMikgJiAweEY7CisgICAgICAgIG1pbm9yID0gKGJpb3NfdmVyc2lvbiAgPj4gOCkgJiAweEY7CisgICAgICAgIGlmIChtYWpvciA8IDMgfHwgKG1ham9yID09IDMgJiYgbWlub3IgPT0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJJT1MgMy4xIGFuZCBlYXJsaWVyIGxvY2F0aW9uIG9mICd3ZHRyX2FibGUnIHZhcmlhYmxlLiAqLworICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCAweDEyMCwgd2R0cl9hYmxlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKKyAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgeworICAgICAgICBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKyAgICAgICAgICAgIG1heF9jbWRbdGlkXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb2FkIHRoZSBNaWNyb2NvZGUKKyAgICAgKgorICAgICAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgorICAgICAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCAwKTsKKyAgICAvKiBBc3N1bWUgdGhlIGZvbGxvd2luZyBjb21wcmVzc2VkIGZvcm1hdCBvZiB0aGUgbWljcm9jb2RlIGJ1ZmZlcjoKKyAgICAgKgorICAgICAqICAyNTQgd29yZCAoNTA4IGJ5dGUpIHRhYmxlIGluZGV4ZWQgYnkgYnl0ZSBjb2RlIGZvbGxvd2VkCisgICAgICogIGJ5IHRoZSBmb2xsb3dpbmcgYnl0ZSBjb2RlczoKKyAgICAgKgorICAgICAqICAgIDEtQnl0ZSBDb2RlOgorICAgICAqICAgICAgMDA6IEVtaXQgd29yZCAwIGluIHRhYmxlLgorICAgICAqICAgICAgMDE6IEVtaXQgd29yZCAxIGluIHRhYmxlLgorICAgICAqICAgICAgLgorICAgICAqICAgICAgRkQ6IEVtaXQgd29yZCAyNTMgaW4gdGFibGUuCisgICAgICoKKyAgICAgKiAgICBNdWx0aS1CeXRlIENvZGU6CisgICAgICogICAgICBGRSBXVyBXVzogKDMgYnl0ZSBjb2RlKSBXb3JkIHRvIGVtaXQgaXMgdGhlIG5leHQgd29yZCBXVyBXVy4KKyAgICAgKiAgICAgIEZGIEJCIFdXIFdXOiAoNCBieXRlIGNvZGUpIEVtaXQgQkIgY291bnQgdGltZXMgbmV4dCB3b3JkIFdXIFdXLgorICAgICAqLworICAgIHdvcmQgPSAwOworICAgIGZvciAoaSA9IDI1MyAqIDI7IGkgPCBfYWR2X2FzYzM1NTBfc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKF9hZHZfYXNjMzU1MF9idWZbaV0gPT0gMHhmZikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IF9hZHZfYXNjMzU1MF9idWZbaSArIDFdOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZltpICsgM10gPDwgOCkgfAorICAgICAgICAgICAgICAgIF9hZHZfYXNjMzU1MF9idWZbaSArIDJdKSk7CisgICAgICAgICAgICAgICAgd29yZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSArPSAzOworICAgICAgICB9IGVsc2UgaWYgKF9hZHZfYXNjMzU1MF9idWZbaV0gPT0gMHhmZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKyAgICAgICAgICAgICAgICBfYWR2X2FzYzM1NTBfYnVmW2kgKyAyXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZltpICsgMV0pKTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZlsoX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDIpICsgMV0gPDwgOCkgfAorICAgICAgICAgICAgICAgIF9hZHZfYXNjMzU1MF9idWZbX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDJdKSk7CisgICAgICAgICAgICB3b3JkKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCAnd29yZCcgZm9yIGxhdGVyIHVzZSB0byBjbGVhciB0aGUgcmVzdCBvZiBtZW1vcnkgYW5kIHNhdmUKKyAgICAgKiB0aGUgZXhwYW5kZWQgbWNvZGUgc2l6ZS4KKyAgICAgKi8KKyAgICB3b3JkICo9IDI7CisgICAgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZSA9IHdvcmQ7CisKKyAgICAvKgorICAgICAqIENsZWFyIHRoZSByZXN0IG9mIEFTQy0zNTUwIEludGVybmFsIFJBTSAoOEtCKS4KKyAgICAgKi8KKyAgICBmb3IgKDsgd29yZCA8IEFEVl8zNTUwX01FTVNJWkU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorICAgICAqLworICAgIHN1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzNTUwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisKKyAgICBpZiAoc3VtICE9IF9hZHZfYXNjMzU1MF9jaGtzdW0pCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXN0b3JlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4vMjsgaSsrKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSB0byB0aGUgbWljcm9jb2RlCisgICAgICogY29kZSBjaGVja3N1bSBsb2NhdGlvbiBBU0NfTUNfQ09ERV9DSEtfU1VNICgweDJDKS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIGJlZ2luX2FkZHIpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfRU5EX0FERFIsIGVuZF9hZGRyKTsKKyAgICBjb2RlX3N1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIGJlZ2luX2FkZHIpOworICAgIGZvciAod29yZCA9IGJlZ2luX2FkZHI7IHdvcmQgPCBlbmRfYWRkcjsgd29yZCArPSAyKQorICAgIHsKKyAgICAgICAgY29kZV9zdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0NIS19TVU0sIGNvZGVfc3VtKTsKKworICAgIC8qCisgICAgICogUmVhZCBhbmQgc2F2ZSBtaWNyb2NvZGUgdmVyc2lvbiBhbmQgZGF0ZS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX0RBVEUsIGFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9OVU0sIGFzY19kdmMtPmNmZy0+bWNvZGVfdmVyc2lvbik7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY2hpcCB0eXBlIHRvIGluZGljYXRlIHRoZSBBU0MzNTUwLgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DSElQX1RZUEUsIEFEVl9DSElQX0FTQzM1NTApOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlciAiUGFyaXR5IEVycm9yIFJlc3BvbnNlCisgICAgICogQ29udHJvbCIgQml0IHdhcyBjbGVhciAoMCksIHRoZW4gc2V0IHRoZSBtaWNyb2NvZGUgdmFyaWFibGUKKyAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIgZmxhZyB0byB0ZWxsIHRoZSBtaWNyb2NvZGUKKyAgICAgKiB0byBpZ25vcmUgRE1BIHBhcml0eSBlcnJvcnMuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnICYgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSKQorICAgIHsKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEFTQy0zNTUwLCBzZXR0aW5nIHRoZSBTVEFSVF9DVExfRU1GVSBbMzoyXSBiaXRzIHNldHMgYSBGSUZPCisgICAgICogdGhyZXNob2xkIG9mIDEyOCBieXRlcy4gVGhpcyByZWdpc3RlciBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlIGhvc3QuCisgICAgICovCisgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfRE1BX0NGRzAsCisgICAgICAgIFNUQVJUX0NUTF9FTUZVIHwgUkVBRF9DTURfTVJNKTsKKworICAgIC8qCisgICAgICogTWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIFdEVFIsIFNEVFIsIGFuZCBjb21tYW5kIHRhZworICAgICAqIHF1ZXVpbmcgd2lsbCBiZSBzZXQgaW4gQWR2SW5xdWlyeUhhbmRsaW5nKCkgYmFzZWQgb24gd2hhdCBhCisgICAgICogZGV2aWNlIHJlcG9ydHMgaXQgaXMgY2FwYWJsZSBvZiBpbiBJbnF1aXJ5IGJ5dGUgNy4KKyAgICAgKgorICAgICAqIElmIFNDU0kgQnVzIFJlc2V0cyBoYXZlIGJlZW4gZGlzYWJsZWQsIHRoZW4gZGlyZWN0bHkgc2V0CisgICAgICogU0RUUiBhbmQgV0RUUiBmcm9tIHRoZSBFRVBST00gY29uZmlndXJhdGlvbi4gVGhpcyB3aWxsIGFsbG93CisgICAgICogdGhlIEJJT1MgYW5kIHdhcm0gYm9vdCB0byB3b3JrIHdpdGhvdXQgYSBTQ1NJIGJ1cyBoYW5nIG9uCisgICAgICogdGhlIElucXVpcnkgY2F1c2VkIGJ5IGhvc3QgYW5kIHRhcmdldCBtaXNtYXRjaGVkIERUUiB2YWx1ZXMuCisgICAgICogV2l0aG91dCB0aGUgU0NTSSBCdXMgUmVzZXQsIGJlZm9yZSBhbiBJbnF1aXJ5IGEgZGV2aWNlIGNhbid0CisgICAgICogYmUgYXNzdW1lZCB0byBiZSBpbiBBc3luY2hyb25vdXMsIE5hcnJvdyBtb2RlLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKSA9PSAwKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgYXNjX2R2Yy0+d2R0cl9hYmxlKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgYXNjX2R2Yy0+c2R0cl9hYmxlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorICAgICAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgYmFzZWQgb24gdGhlIFVMVFJBIEVFUFJPTSBwZXIgVElECisgICAgICogYml0bWFzay4gVGhlc2UgdmFsdWVzIGRldGVybWluZSB0aGUgbWF4aW11bSBTRFRSIHNwZWVkIG5lZ290aWF0ZWQKKyAgICAgKiB3aXRoIGEgZGV2aWNlLgorICAgICAqCisgICAgICogVGhlIFNEVFIgcGVyIFRJRCBiaXRtYXNrIG92ZXJyaWRlcyB0aGUgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorICAgICAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgdmFsdWVzIHNvIGl0IGlzIHNhZmUgdG8gc2V0IHRoZW0KKyAgICAgKiB3aXRob3V0IGRldGVybWluaW5nIGhlcmUgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIFNEVFIuCisgICAgICoKKyAgICAgKiA0LWJpdCBzcGVlZCAgU0RUUiBzcGVlZCBuYW1lCisgICAgICogPT09PT09PT09PT0gID09PT09PT09PT09PT09PQorICAgICAqIDAwMDBiICgweDApICBTRFRSIGRpc2FibGVkCisgICAgICogMDAwMWIgKDB4MSkgIDUgTWh6CisgICAgICogMDAxMGIgKDB4MikgIDEwIE1oegorICAgICAqIDAwMTFiICgweDMpICAyMCBNaHogKFVsdHJhKQorICAgICAqIDAxMDBiICgweDQpICA0MCBNaHogKExWRC9VbHRyYTIpCisgICAgICogMDEwMWIgKDB4NSkgIDgwIE1oeiAoTFZEMi9VbHRyYTMpCisgICAgICogMDExMGIgKDB4NikgIFVuZGVmaW5lZAorICAgICAqIC4KKyAgICAgKiAxMTExYiAoMHhGKSAgVW5kZWZpbmVkCisgICAgICovCisgICAgd29yZCA9IDA7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgaWYgKEFEVl9USURfVE9fVElETUFTSyh0aWQpICYgYXNjX2R2Yy0+dWx0cmFfYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IFVsdHJhIHNwZWVkIGZvciBUSUQgJ3RpZCcuICovCisgICAgICAgICAgICB3b3JkIHw9ICgweDMgPDwgKDQgKiAodGlkICUgNCkpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNldCBGYXN0IHNwZWVkIGZvciBUSUQgJ3RpZCcuICovCisgICAgICAgICAgICB3b3JkIHw9ICgweDIgPDwgKDQgKiAodGlkICUgNCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGlkID09IDMpIC8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMS4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQxLCB3b3JkKTsKKyAgICAgICAgICAgIHdvcmQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA3KSAvKiBDaGVjayBpZiBkb25lIHdpdGggc2R0cl9zcGVlZDIuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMiwgd29yZCk7CisgICAgICAgICAgICB3b3JkID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gMTEpIC8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMy4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQzLCB3b3JkKTsKKyAgICAgICAgICAgIHdvcmQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSAxNSkgLyogQ2hlY2sgaWYgZG9uZSB3aXRoIHNkdHJfc3BlZWQ0LiAqLworICAgICAgICB7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDQsIHdvcmQpOworICAgICAgICAgICAgLyogRW5kIG9mIGxvb3AuICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlIGZvciB0aGUgZGlzY29ubmVjdCBwZXIgVElEIGJpdG1hc2suCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RJU0NfRU5BQkxFLCBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKKworICAgIC8qCisgICAgICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisgICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCisgICAgICAgIFBBUklUWV9FTiB8IFFVRVVFXzEyOCB8IFNFTF9UTU9fTE9ORyB8IE9VUl9JRF9FTiB8CisgICAgICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CisKKyAgICAvKgorICAgICAqIERldGVybWluZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisKKyAgICAvKiBSZWFkIGN1cnJlbnQgU0NTSV9DRkcxIFJlZ2lzdGVyIHZhbHVlLiAqLworICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKworICAgIC8qCisgICAgICogSWYgYWxsIHRocmVlIGNvbm5lY3RvcnMgYXJlIGluIHVzZSwgcmV0dXJuIGFuIGVycm9yLgorICAgICAqLworICAgIGlmICgoc2NzaV9jZmcxICYgQ0FCTEVfSUxMRUdBTF9BKSA9PSAwIHx8CisgICAgICAgIChzY3NpX2NmZzEgJiBDQUJMRV9JTExFR0FMX0IpID09IDApCisgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfSUxMRUdBTF9DT05ORUNUSU9OOworICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBpbnRlcm5hbCBuYXJyb3cgY2FibGUgaXMgcmV2ZXJzZWQgYWxsIG9mIHRoZSBTQ1NJX0NUUkwKKyAgICAgKiByZWdpc3RlciBzaWduYWxzIHdpbGwgYmUgc2V0LiBDaGVjayBmb3IgYW5kIHJldHVybiBhbiBlcnJvciBpZgorICAgICAqIHRoaXMgY29uZGl0aW9uIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NUUkwpICYgMHgzRjA3KSA9PSAweDNGMDcpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9SRVZFUlNFRF9DQUJMRTsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoaXMgaXMgYSBkaWZmZXJlbnRpYWwgYm9hcmQgYW5kIGEgc2luZ2xlLWVuZGVkIGRldmljZQorICAgICAqIGlzIGF0dGFjaGVkIHRvIG9uZSBvZiB0aGUgY29ubmVjdG9ycywgcmV0dXJuIGFuIGVycm9yLgorICAgICAqLworICAgIGlmICgoc2NzaV9jZmcxICYgRElGRl9NT0RFKSAmJiAoc2NzaV9jZmcxICYgRElGRl9TRU5TRSkgPT0gMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NJTkdMRV9FTkRfREVWSUNFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgYXV0b21hdGljIHRlcm1pbmF0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZCwgdGhlbiBzZXQgdGhlCisgICAgICogdGVybWluYXRpb24gdmFsdWUgYmFzZWQgb24gYSB0YWJsZSBsaXN0ZWQgaW4gYV9jb25kb3IuaC4KKyAgICAgKgorICAgICAqIElmIG1hbnVhbCB0ZXJtaW5hdGlvbiB3YXMgc3BlY2lmaWVkIHdpdGggYW4gRUVQUk9NIHNldHRpbmcKKyAgICAgKiB0aGVuICd0ZXJtaW5hdGlvbicgd2FzIHNldC11cCBpbiBBZHZJbml0RnJvbTM1NTBFRVBST00oKSBhbmQKKyAgICAgKiBpcyByZWFkeSB0byBiZSAnb3JlZCcgaW50byBTQ1NJX0NGRzEuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzb2Z0d2FyZSBhbHdheXMgY29udHJvbHMgdGVybWluYXRpb24gYnkgc2V0dGluZyBURVJNX0NUTF9TRUwuCisgICAgICAgICAqIElmIFRFUk1fQ1RMX1NFTCB3ZXJlIHNldCB0byAwLCB0aGUgaGFyZHdhcmUgd291bGQgc2V0IHRlcm1pbmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX0NUTF9TRUw7CisKKyAgICAgICAgc3dpdGNoKHNjc2lfY2ZnMSAmIENBQkxFX0RFVEVDVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb24sIFRFUk1fQ1RMX0w6IG9uICovCisgICAgICAgICAgICBjYXNlIDB4MzogY2FzZSAweDc6IGNhc2UgMHhCOiBjYXNlIDB4RDogY2FzZSAweEU6IGNhc2UgMHhGOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gKFRFUk1fQ1RMX0ggfCBURVJNX0NUTF9MKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb24sIFRFUk1fQ1RMX0w6IG9mZiAqLworICAgICAgICAgICAgY2FzZSAweDE6IGNhc2UgMHg1OiBjYXNlIDB4OTogY2FzZSAweEE6IGNhc2UgMHhDOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9DVExfSDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb2ZmLCBURVJNX0NUTF9MOiBvZmYgKi8KKyAgICAgICAgICAgIGNhc2UgMHgyOiBjYXNlIDB4NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2xlYXIgYW55IHNldCBURVJNX0NUTF9IIGFuZCBURVJNX0NUTF9MIGJpdHMuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9IH5URVJNX0NUTDsKKworICAgIC8qCisgICAgICogSW52ZXJ0IHRoZSBURVJNX0NUTF9IIGFuZCBURVJNX0NUTF9MIGJpdHMgYW5kIHRoZW4KKyAgICAgKiBzZXQgJ3Njc2lfY2ZnMScuIFRoZSBURVJNX1BPTCBiaXQgZG9lcyBub3QgbmVlZCB0byBiZQorICAgICAqIHJlZmVyZW5jZWQsIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGludGVybmFsbHkgaW52ZXJ0cworICAgICAqIHRoZSBUZXJtaW5hdGlvbiBIaWdoIGFuZCBMb3cgYml0cyBpZiBURVJNX1BPTCBpcyBzZXQuCisgICAgICovCisgICAgc2NzaV9jZmcxIHw9IChURVJNX0NUTF9TRUwgfCAofmFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gJiBURVJNX0NUTCkpOworCisgICAgLyoKKyAgICAgKiBTZXQgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlCisgICAgICoKKyAgICAgKiBTZXQgZmlsdGVyIHZhbHVlIGFuZCBwb3NzaWJseSBtb2RpZmllZCB0ZXJtaW5hdGlvbiBjb250cm9sCisgICAgICogYml0cyBpbiB0aGUgTWljcm9jb2RlIFNDU0lfQ0ZHMSBSZWdpc3RlciBWYWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMSByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisgICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzEsCisgICAgICAgIEZMVFJfRElTQUJMRSB8IHNjc2lfY2ZnMSk7CisKKyAgICAvKgorICAgICAqIFNldCBNRU1fQ0ZHIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBNRU1fQ0ZHIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqCisgICAgICogTUVNX0NGRyBtYXkgYmUgYWNjZXNzZWQgYXMgYSB3b3JkIG9yIGJ5dGUsIGJ1dCBvbmx5IGJpdHMgMC03CisgICAgICogYXJlIGRlZmluZWQuCisgICAgICoKKyAgICAgKiBBU0MtMzU1MCBoYXMgOEtCIGludGVybmFsIG1lbW9yeS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAorICAgICAgICBCSU9TX0VOIHwgUkFNX1NaXzhLQik7CisKKyAgICAvKgorICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisgICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKworICAgIC8qCisgICAgICogQnVpbGQgY2FycmllciBmcmVlbGlzdC4KKyAgICAgKgorICAgICAqIERyaXZlciBtdXN0IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBzZXQgJ2NhcnJpZXJfYnVmJy4KKyAgICAgKi8KKyAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmNhcnJpZXJfYnVmICE9IE5VTEwpOworCisgICAgY2FycnAgPSAoQURWX0NBUlJfVCAqKSBBRFZfMTZCQUxJR04oYXNjX2R2Yy0+Y2Fycmllcl9idWYpOworICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBOVUxMOworICAgIGlmIChjYXJycCA9PSAoQURWX0NBUlJfVCAqKSBhc2NfZHZjLT5jYXJyaWVyX2J1ZikKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRSAtIHNpemVvZihBRFZfQ0FSUl9UKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjYXJyaWVyICdjYXJycCcuCisgICAgICAgICAqLworICAgICAgICBjb250aWdfbGVuID0gc2l6ZW9mKEFEVl9DQVJSX1QpOworICAgICAgICBjYXJyX3BhZGRyID0gY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcihhc2NfZHZjLCBOVUxMLCAodWNoYXIgKikgY2FycnAsCisgICAgICAgICAgICAoQURWX1NEQ05UICopICZjb250aWdfbGVuLCBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CisKKyAgICAgICAgYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBjdXJyZW50IGNhcnJpZXIgaXMgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywgdGhlbgorICAgICAgICAgKiBtYXliZSB0aGVyZSB3YXMgYSBwYWdlIGNyb3NzaW5nLiBUcnkgdGhlIG5leHQgY2FycmllciBhbGlnbmVkCisgICAgICAgICAqIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICBpZiAoY29udGlnX2xlbiA8IHNpemVvZihBRFZfQ0FSUl9UKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FycnArKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FycnAtPmNhcnJfcGEgPSBjYXJyX3BhZGRyOworICAgICAgICBjYXJycC0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoY2FycnApKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbnNlcnQgdGhlIGNhcnJpZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZWxpc3QuCisgICAgICAgICAqLworICAgICAgICBjYXJycC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKyAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOworCisgICAgICAgIGNhcnJwKys7CisgICAgfQorICAgIHdoaWxlIChidWZfc2l6ZSA+IDApOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIEhvc3QtPlJJU0MgSW5pdGlhdG9yIENvbW1hbmQgUXVldWUgKElDUSkuCisgICAgICovCisKKyAgICBpZiAoKGFzY19kdmMtPmljcV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKyAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKyAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGlzc3VlZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgc3RvcHBlciBjYXJyaWVyLgorICAgICAqLworICAgIGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisKKyAgICAvKgorICAgICAqIFNldCBSSVNDIElDUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorICAgICAqLworICAgIEFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSUNRLCBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGNvbXBsZXRlZCBieSB0aGUgUklTQyB3aWxsIGJlIHBsYWNlZCBpbgorICAgICAqIHRoZSBzdG9wcGVyLgorICAgICAqCisgICAgICogTm90ZTogU2V0ICduZXh0X3ZwYScgdG8gQVNDX0NRX1NUT1BQRVIuIFdoZW4gdGhlIHJlcXVlc3QgaXMKKyAgICAgKiBjb21wbGV0ZWQgdGhlIFJJU0Mgd2lsbCBzZXQgdGhlIEFTQ19SUV9TVE9QUEVSIGJpdC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCisgICAgLyoKKyAgICAgKiBTZXQgUklTQyBJUlEgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKyAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKKyAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOworCisgICAgLyogZmluYWxseSwgZmluYWxseSwgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZSAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfUlVOKTsKKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIFNDU0kgQnVzIGlmIHRoZSBFRVBST00gaW5kaWNhdGVzIHRoYXQgU0NTSSBCdXMKKyAgICAgKiBSZXNldHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIFJJU0MgaGFzIHRvIGJlIHJ1bm5pbmcKKyAgICAgKiB0byBpc3N1ZSBhIFNDU0kgQnVzIFJlc2V0LgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgQklPUyBTaWduYXR1cmUgaXMgcHJlc2VudCBpbiBtZW1vcnksIHJlc3RvcmUgdGhlCisgICAgICAgICAqIEJJT1MgSGFuZHNoYWtlIENvbmZpZ3VyYXRpb24gVGFibGUgYW5kIGRvIG5vdCBwZXJmb3JtCisgICAgICAgICAqIGEgU0NTSSBCdXMgUmVzZXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoYmlvc19tZW1bKEFTQ19NQ19CSU9TX1NJR05BVFVSRSAtIEFTQ19NQ19CSU9TTUVNKS8yXSA9PSAweDU1QUEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXN0b3JlIHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgICAgICAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQVNDLTM4QzA4MDAuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTmVlZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4KKyAqLworU1RBVElDIGludAorQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgd2Fybl9jb2RlOworICAgIEFEVl9EQ05UICAgIHN1bTsKKyAgICBpbnQgICAgICAgICBiZWdpbl9hZGRyOworICAgIGludCAgICAgICAgIGVuZF9hZGRyOworICAgIHVzaG9ydCAgICAgIGNvZGVfc3VtOworICAgIGludCAgICAgICAgIHdvcmQ7CisgICAgaW50ICAgICAgICAgajsKKyAgICBpbnQgICAgICAgICBhZHZfYXNjMzhDMDgwMF9leHBhbmRlZF9zaXplOworICAgIEFEVl9DQVJSX1QgICpjYXJycDsKKyAgICBBRFZfRENOVCAgICBjb250aWdfbGVuOworICAgIEFEVl9TRENOVCAgIGJ1Zl9zaXplOworICAgIEFEVl9QQUREUiAgIGNhcnJfcGFkZHI7CisgICAgaW50ICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICBzY3NpX2NmZzE7CisgICAgdWNoYXIgICAgICAgYnl0ZTsKKyAgICB1Y2hhciAgICAgICB0aWQ7CisgICAgdXNob3J0ICAgICAgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4vMl07IC8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLworICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKyAgICB1Y2hhciAgICAgICBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisKKyAgICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVycm9yLCBkb24ndCBjb250aW51ZS4gKi8KKyAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIEFEVl9DSElQX0FTQzM4QzA4MDAuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgd2Fybl9jb2RlID0gMDsKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbiBiZWZvcmUgd3JpdGluZyB0aGUgbWljcm9jb2RlLgorICAgICAqIFRoZSBCSU9TIG1heSBhbHJlYWR5IGJlIGxvYWRlZCBhbmQgdXNpbmcgaXRzIFJJU0MgTFJBTSByZWdpb24KKyAgICAgKiBzbyBpdHMgcmVnaW9uIG11c3QgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkLgorICAgICAqCisgICAgICogTm90ZTogVGhpcyBjb2RlIG1ha2VzIHRoZSBhc3N1bXB0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgdHJ1ZSwKKyAgICAgKiB0aGF0IGEgY2hpcCByZXNldCBkb2VzIG5vdCBjbGVhciBSSVNDIExSQU0uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IEFTQ19NQ19CSU9TTEVOLzI7IGkrKykKKyAgICB7CisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgIH0KKworICAgIC8qCisgICAgICogUkFNIEJJU1QgKFJBTSBCdWlsdC1JbiBTZWxmIFRlc3QpCisgICAgICoKKyAgICAgKiBBZGRyZXNzIDogSS9PIGJhc2UgKyBvZmZzZXQgMHgzOGggcmVnaXN0ZXIgKGJ5dGUpLgorICAgICAqIEZ1bmN0aW9uOiBCaXQgNy02KFJXKSA6IFJBTSBtb2RlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBNb2RlICAgOiAweDAwCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFByZS10ZXN0IE1vZGUgOiAweDQwCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFJBTSBUZXN0IE1vZGUgOiAweDgwCisgICAgICogICAgICAgICAgIEJpdCA1ICAgICAgIDogdW51c2VkCisgICAgICogICAgICAgICAgIEJpdCA0KFJPKSAgIDogRG9uZSBiaXQKKyAgICAgKiAgICAgICAgICAgQml0IDMtMChSTykgOiBTdGF0dXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdCBFcnJvciAgICA6IDB4MDgKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW50X1JBTSBFcnJvciA6IDB4MDQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUklTQyBFcnJvciAgICA6IDB4MDIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSSBFcnJvciAgICA6IDB4MDEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gRXJyb3IgICAgICA6IDB4MDAKKyAgICAgKgorICAgICAqIE5vdGU6IFJBTSBCSVNUIGNvZGUgc2hvdWxkIGJlIHB1dCByaWdodCBoZXJlLCBiZWZvcmUgbG9hZGluZyB0aGUKKyAgICAgKiBtaWNyb2NvZGUgYW5kIGFmdGVyIHNhdmluZyB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24uCisgICAgICovCisKKyAgICAvKgorICAgICAqIExSQU0gUHJlLXRlc3QKKyAgICAgKgorICAgICAqIFdyaXRlIFBSRV9URVNUX01PREUgKDB4NDApIHRvIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciAxMCBtaWxsaXNlY29uZHMuCisgICAgICogSWYgRG9uZSBiaXQgbm90IHNldCBvciBsb3cgbmliYmxlIG5vdCBQUkVfVEVTVF9WQUxVRSAoMHgwNSksIHJldHVybgorICAgICAqIGFuIGVycm9yLiBSZXNldCB0byBOT1JNQUxfTU9ERSAoMHgwMCkgYW5kIGRvIGFnYWluLiBJZiBjYW5ub3QgcmVzZXQKKyAgICAgKiB0byBOT1JNQUxfTU9ERSwgcmV0dXJuIGFuIGVycm9yIHRvby4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIFBSRV9URVNUX01PREUpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KKyAgICAgICAgYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOworICAgICAgICBpZiAoKGJ5dGUgJiBSQU1fVEVTVF9ET05FKSA9PSAwIHx8IChieXRlICYgMHgwRikgIT0gUFJFX1RFU1RfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7CisgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIE5PUk1BTF9NT0RFKTsKKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSByZWFkaW5nIGJhY2suICovCisgICAgICAgIGlmIChBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKQorICAgICAgICAgICAgIT0gTk9STUFMX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUOworICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTFJBTSBUZXN0IC0gSXQgdGFrZXMgYWJvdXQgMS41IG1zIHRvIHJ1biB0aHJvdWdoIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogV3JpdGUgUkFNX1RFU1RfTU9ERSAoMHg4MCkgdG8gcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIDEwIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBJZiBEb25lIGJpdCBub3Qgc2V0IG9yIFN0YXR1cyBub3QgMCwgc2F2ZSByZWdpc3RlciBieXRlLCBzZXQgdGhlCisgICAgICogZXJyX2NvZGUsIGFuZCByZXR1cm4gYW4gZXJyb3IuCisgICAgICovCisgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIFJBTV9URVNUX01PREUpOworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOyAgLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgY2hlY2tpbmcgc3RhdHVzLiAqLworCisgICAgYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOworICAgIGlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAgfHwgKGJ5dGUgJiBSQU1fVEVTVF9TVEFUVVMpICE9IDApCisgICAgeworICAgICAgICAvKiBHZXQgaGVyZSBpZiBEb25lIGJpdCBub3Qgc2V0IG9yIFN0YXR1cyBub3QgMC4gKi8KKyAgICAgICAgYXNjX2R2Yy0+YmlzdF9lcnJfY29kZSA9IGJ5dGU7ICAvKiBmb3IgQklPUyBkaXNwbGF5IG1lc3NhZ2UgKi8KKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9SQU1fVEVTVDsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRvIHJlc2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgYWZ0ZXIgTFJBTSB0ZXN0IHBhc3Nlcy4gKi8KKyAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOworCisgICAgLyoKKyAgICAgKiBMb2FkIHRoZSBNaWNyb2NvZGUKKyAgICAgKgorICAgICAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgorICAgICAqCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgLyogQXNzdW1lIHRoZSBmb2xsb3dpbmcgY29tcHJlc3NlZCBmb3JtYXQgb2YgdGhlIG1pY3JvY29kZSBidWZmZXI6CisgICAgICoKKyAgICAgKiAgMjU0IHdvcmQgKDUwOCBieXRlKSB0YWJsZSBpbmRleGVkIGJ5IGJ5dGUgY29kZSBmb2xsb3dlZAorICAgICAqICBieSB0aGUgZm9sbG93aW5nIGJ5dGUgY29kZXM6CisgICAgICoKKyAgICAgKiAgICAxLUJ5dGUgQ29kZToKKyAgICAgKiAgICAgIDAwOiBFbWl0IHdvcmQgMCBpbiB0YWJsZS4KKyAgICAgKiAgICAgIDAxOiBFbWl0IHdvcmQgMSBpbiB0YWJsZS4KKyAgICAgKiAgICAgIC4KKyAgICAgKiAgICAgIEZEOiBFbWl0IHdvcmQgMjUzIGluIHRhYmxlLgorICAgICAqCisgICAgICogICAgTXVsdGktQnl0ZSBDb2RlOgorICAgICAqICAgICAgRkUgV1cgV1c6ICgzIGJ5dGUgY29kZSkgV29yZCB0byBlbWl0IGlzIHRoZSBuZXh0IHdvcmQgV1cgV1cuCisgICAgICogICAgICBGRiBCQiBXVyBXVzogKDQgYnl0ZSBjb2RlKSBFbWl0IEJCIGNvdW50IHRpbWVzIG5leHQgd29yZCBXVyBXVy4KKyAgICAgKi8KKyAgICB3b3JkID0gMDsKKyAgICBmb3IgKGkgPSAyNTMgKiAyOyBpIDwgX2Fkdl9hc2MzOEMwODAwX3NpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChfYWR2X2FzYzM4QzA4MDBfYnVmW2ldID09IDB4ZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisgICAgICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaSArIDNdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZltpICsgMl0pKTsKKyAgICAgICAgICAgICAgICB3b3JkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICs9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoX2Fkdl9hc2MzOEMwODAwX2J1ZltpXSA9PSAweGZlKQorICAgICAgICB7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaSArIDJdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXSkpOworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgd29yZCsrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKyAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzA4MDBfYnVmWyhfYWR2X2FzYzM4QzA4MDBfYnVmW2ldICogMikgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZltfYWR2X2FzYzM4QzA4MDBfYnVmW2ldICogMl0pKTsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0ICd3b3JkJyBmb3IgbGF0ZXIgdXNlIHRvIGNsZWFyIHRoZSByZXN0IG9mIG1lbW9yeSBhbmQgc2F2ZQorICAgICAqIHRoZSBleHBhbmRlZCBtY29kZSBzaXplLgorICAgICAqLworICAgIHdvcmQgKj0gMjsKKyAgICBhZHZfYXNjMzhDMDgwMF9leHBhbmRlZF9zaXplID0gd29yZDsKKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM4QzA4MDAgSW50ZXJuYWwgUkFNICgxNktCKS4KKyAgICAgKi8KKyAgICBmb3IgKDsgd29yZCA8IEFEVl8zOEMwODAwX01FTVNJWkU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorICAgICAqLworICAgIHN1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzOEMwODAwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisgICAgQVNDX0RCRzIoMSwgIkFkdkluaXRBc2MzOEMwODAwRHJpdmVyOiB3b3JkICVkLCBpICVkXG4iLCB3b3JkLCBpKTsKKworICAgIEFTQ19EQkcyKDEsCisgICAgICAgICJBZHZJbml0QXNjMzhDMDgwMERyaXZlcjogc3VtIDB4JWx4LCBfYWR2X2FzYzM4QzA4MDBfY2hrc3VtIDB4JWx4XG4iLAorICAgICAgICAodWxvbmcpIHN1bSwgKHVsb25nKSBfYWR2X2FzYzM4QzA4MDBfY2hrc3VtKTsKKworICAgIGlmIChzdW0gIT0gX2Fkdl9hc2MzOEMwODAwX2Noa3N1bSkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX01DT0RFX0NIS1NVTTsKKyAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCisgICAgeworICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU01FTSArICgyICogaSksIGJpb3NfbWVtW2ldKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSBhbmQgd3JpdGUgdGhlIG1pY3JvY29kZSBjb2RlIGNoZWNrc3VtIHRvIHRoZSBtaWNyb2NvZGUKKyAgICAgKiBjb2RlIGNoZWNrc3VtIGxvY2F0aW9uIEFTQ19NQ19DT0RFX0NIS19TVU0gKDB4MkMpLgorICAgICAqLworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgYmVnaW5fYWRkcik7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9FTkRfQUREUiwgZW5kX2FkZHIpOworICAgIGNvZGVfc3VtID0gMDsKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgYmVnaW5fYWRkcik7CisgICAgZm9yICh3b3JkID0gYmVnaW5fYWRkcjsgd29yZCA8IGVuZF9hZGRyOyB3b3JkICs9IDIpCisgICAgeworICAgICAgICBjb2RlX3N1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQ0hLX1NVTSwgY29kZV9zdW0pOworCisgICAgLyoKKyAgICAgKiBSZWFkIG1pY3JvY29kZSB2ZXJzaW9uIGFuZCBkYXRlLgorICAgICAqLworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1ZFUlNJT05fREFURSwgYXNjX2R2Yy0+Y2ZnLT5tY29kZV9kYXRlKTsKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX05VTSwgYXNjX2R2Yy0+Y2ZnLT5tY29kZV92ZXJzaW9uKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjaGlwIHR5cGUgdG8gaW5kaWNhdGUgdGhlIEFTQzM4QzA4MDAuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NISVBfVFlQRSwgQURWX0NISVBfQVNDMzhDMDgwMCk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIDEgdG8gYml0IDE0ICdESVNfVEVSTV9EUlYnIGluIHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIuCisgICAgICogV2hlbiBESVNfVEVSTV9EUlYgc2V0IHRvIDEsIENfREVUWzM6MF0gd2lsbCByZWZsZWN0IGN1cnJlbnQKKyAgICAgKiBjYWJsZSBkZXRlY3Rpb24gYW5kIHRoZW4gd2UgYXJlIGFibGUgdG8gcmVhZCBDX0RFVFszOjBdLgorICAgICAqCisgICAgICogTm90ZTogV2Ugd2lsbCByZXNldCBESVNfVEVSTV9EUlYgdG8gMCBpbiB0aGUgJ1NldCBTQ1NJX0NGRzEKKyAgICAgKiBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZScgc2VjdGlvbiBiZWxvdy4KKyAgICAgKi8KKyAgICBzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxLCBzY3NpX2NmZzEgfCBESVNfVEVSTV9EUlYpOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlciAiUGFyaXR5IEVycm9yIFJlc3BvbnNlCisgICAgICogQ29udHJvbCIgQml0IHdhcyBjbGVhciAoMCksIHRoZW4gc2V0IHRoZSBtaWNyb2NvZGUgdmFyaWFibGUKKyAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIgZmxhZyB0byB0ZWxsIHRoZSBtaWNyb2NvZGUKKyAgICAgKiB0byBpZ25vcmUgRE1BIHBhcml0eSBlcnJvcnMuCisgICAgICovCisgICAgaWYgKGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnICYgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSKQorICAgIHsKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEFTQy0zOEMwODAwLCBzZXQgRklGT19USFJFU0hfODBCIFs2OjRdIGJpdHMgYW5kIFNUQVJUX0NUTF9USCBbMzoyXQorICAgICAqIGJpdHMgZm9yIHRoZSBkZWZhdWx0IEZJRk8gdGhyZXNob2xkLgorICAgICAqCisgICAgICogTm90ZTogQVNDLTM4QzA4MDAgRklGTyB0aHJlc2hvbGQgaGFzIGJlZW4gY2hhbmdlZCB0byAyNTYgYnl0ZXMuCisgICAgICoKKyAgICAgKiBGb3IgRE1BIEVycmF0YSAjNCBzZXQgdGhlIEJDX1RIUkVTSF9FTkIgYml0LgorICAgICAqLworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0RNQV9DRkcwLAorICAgICAgICBCQ19USFJFU0hfRU5CIHwgRklGT19USFJFU0hfODBCIHwgU1RBUlRfQ1RMX1RIIHwgUkVBRF9DTURfTVJNKTsKKworICAgIC8qCisgICAgICogTWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIFdEVFIsIFNEVFIsIGFuZCBjb21tYW5kIHRhZworICAgICAqIHF1ZXVpbmcgd2lsbCBiZSBzZXQgaW4gQWR2SW5xdWlyeUhhbmRsaW5nKCkgYmFzZWQgb24gd2hhdCBhCisgICAgICogZGV2aWNlIHJlcG9ydHMgaXQgaXMgY2FwYWJsZSBvZiBpbiBJbnF1aXJ5IGJ5dGUgNy4KKyAgICAgKgorICAgICAqIElmIFNDU0kgQnVzIFJlc2V0cyBoYXZlIGJlZW4gZGlzYWJsZWQsIHRoZW4gZGlyZWN0bHkgc2V0CisgICAgICogU0RUUiBhbmQgV0RUUiBmcm9tIHRoZSBFRVBST00gY29uZmlndXJhdGlvbi4gVGhpcyB3aWxsIGFsbG93CisgICAgICogdGhlIEJJT1MgYW5kIHdhcm0gYm9vdCB0byB3b3JrIHdpdGhvdXQgYSBTQ1NJIGJ1cyBoYW5nIG9uCisgICAgICogdGhlIElucXVpcnkgY2F1c2VkIGJ5IGhvc3QgYW5kIHRhcmdldCBtaXNtYXRjaGVkIERUUiB2YWx1ZXMuCisgICAgICogV2l0aG91dCB0aGUgU0NTSSBCdXMgUmVzZXQsIGJlZm9yZSBhbiBJbnF1aXJ5IGEgZGV2aWNlIGNhbid0CisgICAgICogYmUgYXNzdW1lZCB0byBiZSBpbiBBc3luY2hyb25vdXMsIE5hcnJvdyBtb2RlLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKSA9PSAwKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgYXNjX2R2Yy0+d2R0cl9hYmxlKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgYXNjX2R2Yy0+c2R0cl9hYmxlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgRElTQyBhbmQgU0RUUl9TUEVFRDEsCisgICAgICogU0RUUl9TUEVFRDIsIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgYmFzZWQgb24gdGhlIEVFUFJPTQorICAgICAqIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgorICAgICAqCisgICAgICogVGhlIFNEVFIgcGVyIFRJRCBiaXRtYXNrIG92ZXJyaWRlcyB0aGUgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorICAgICAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgdmFsdWVzIHNvIGl0IGlzIHNhZmUgdG8gc2V0IHRoZW0KKyAgICAgKiB3aXRob3V0IGRldGVybWluaW5nIGhlcmUgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIFNEVFIuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RJU0NfRU5BQkxFLCBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDEsIGFzY19kdmMtPnNkdHJfc3BlZWQxKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDIsIGFzY19kdmMtPnNkdHJfc3BlZWQyKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDMsIGFzY19kdmMtPnNkdHJfc3BlZWQzKTsKKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDQsIGFzY19kdmMtPnNkdHJfc3BlZWQ0KTsKKworICAgIC8qCisgICAgICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisgICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCisgICAgICAgIFBBUklUWV9FTiB8IFFVRVVFXzEyOCB8IFNFTF9UTU9fTE9ORyB8IE9VUl9JRF9FTiB8CisgICAgICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CisKKyAgICAvKgorICAgICAqIERldGVybWluZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisKKyAgICAvKiBSZWFkIGN1cnJlbnQgU0NTSV9DRkcxIFJlZ2lzdGVyIHZhbHVlLiAqLworICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGludGVybmFsIG5hcnJvdyBjYWJsZSBpcyByZXZlcnNlZCBhbGwgb2YgdGhlIFNDU0lfQ1RSTAorICAgICAqIHJlZ2lzdGVyIHNpZ25hbHMgd2lsbCBiZSBzZXQuIENoZWNrIGZvciBhbmQgcmV0dXJuIGFuIGVycm9yIGlmCisgICAgICogdGhpcyBjb25kaXRpb24gaXMgZm91bmQuCisgICAgICovCisgICAgaWYgKChBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ1RSTCkgJiAweDNGMDcpID09IDB4M0YwNykKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1JFVkVSU0VEX0NBQkxFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogQWxsIGtpbmQgb2YgY29tYmluYXRpb25zIG9mIGRldmljZXMgYXR0YWNoZWQgdG8gb25lIG9mIGZvdXIgY29ubmVjdG9ycworICAgICAqIGFyZSBhY2NlcHRhYmxlIGV4Y2VwdCBIVkQgZGV2aWNlIGF0dGFjaGVkLiBGb3IgZXhhbXBsZSwgTFZEIGRldmljZSBjYW4KKyAgICAgKiBiZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3Igd2hpbGUgU0UgZGV2aWNlIGF0dGFjaGVkIHRvIExWRCBjb25uZWN0b3IuCisgICAgICogSWYgTFZEIGRldmljZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3IsIGl0IG9ubHkgcnVucyB1cCB0byBVbHRyYSBzcGVlZC4KKyAgICAgKgorICAgICAqIElmIGFuIEhWRCBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gb25lIG9mIExWRCBjb25uZWN0b3JzLCByZXR1cm4gYW4gZXJyb3IuCisgICAgICogSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBIVkQgZGV2aWNlIGF0dGFjaGVkIHRvIFNFIGNvbm5lY3RvcnMuCisgICAgICovCisgICAgaWYgKHNjc2lfY2ZnMSAmIEhWRCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0hWRF9ERVZJQ0U7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBlaXRoZXIgU0Ugb3IgTFZEIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQsIHRoZW4KKyAgICAgKiBzZXQgdGhlIHRlcm1pbmF0aW9uIHZhbHVlIGJhc2VkIG9uIGEgdGFibGUgbGlzdGVkIGluIGFfY29uZG9yLmguCisgICAgICoKKyAgICAgKiBJZiBtYW51YWwgdGVybWluYXRpb24gd2FzIHNwZWNpZmllZCB3aXRoIGFuIEVFUFJPTSBzZXR0aW5nIHRoZW4KKyAgICAgKiAndGVybWluYXRpb24nIHdhcyBzZXQtdXAgaW4gQWR2SW5pdEZyb20zOEMwODAwRUVQUk9NKCkgYW5kIGlzIHJlYWR5IHRvCisgICAgICogYmUgJ29yZWQnIGludG8gU0NTSV9DRkcxLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fU0UpID09IDApCisgICAgeworICAgICAgICAvKiBTRSBhdXRvbWF0aWMgdGVybWluYXRpb24gY29udHJvbCBpcyBlbmFibGVkLiAqLworICAgICAgICBzd2l0Y2goc2NzaV9jZmcxICYgQ19ERVRfU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvbiAqLworICAgICAgICAgICAgY2FzZSAweDE6IGNhc2UgMHgyOiBjYXNlIDB4MzoKKyAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IFRFUk1fU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRV9ISTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fTFZEKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTFZEIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCisgICAgICAgIHN3aXRjaChzY3NpX2NmZzEgJiBDX0RFVF9MVkQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRFUk1fTFZEX0hJOiBvbiwgVEVSTV9MVkRfTE86IG9uICovCisgICAgICAgICAgICBjYXNlIDB4NDogY2FzZSAweDg6IGNhc2UgMHhDOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9MVkQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIFRFUk1fTFZEX0hJOiBvZmYsIFRFUk1fTFZEX0xPOiBvZmYgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGVhciBhbnkgc2V0IFRFUk1fU0UgYW5kIFRFUk1fTFZEIGJpdHMuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9ICh+VEVSTV9TRSAmIH5URVJNX0xWRCk7CisKKyAgICAvKgorICAgICAqIEludmVydCB0aGUgVEVSTV9TRSBhbmQgVEVSTV9MVkQgYml0cyBhbmQgdGhlbiBzZXQgJ3Njc2lfY2ZnMScuCisgICAgICovCisgICAgc2NzaV9jZmcxIHw9ICh+YXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIDB4RjApOworCisgICAgLyoKKyAgICAgKiBDbGVhciBCSUdfRU5ESUFOLCBESVNfVEVSTV9EUlYsIFRlcm1pbmF0b3IgUG9sYXJpdHkgYW5kIEhWRC9MVkQvU0UgYml0cworICAgICAqIGFuZCBzZXQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbCBiaXRzIGluIHRoZSBNaWNyb2NvZGUKKyAgICAgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9ICh+QklHX0VORElBTiAmIH5ESVNfVEVSTV9EUlYgJiB+VEVSTV9QT0wgJiB+SFZEX0xWRF9TRSk7CisKKyAgICAvKgorICAgICAqIFNldCBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFNldCBwb3NzaWJseSBtb2RpZmllZCB0ZXJtaW5hdGlvbiBjb250cm9sIGFuZCByZXNldCBESVNfVEVSTV9EUlYKKyAgICAgKiBiaXRzIGluIHRoZSBNaWNyb2NvZGUgU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKKworICAgIC8qCisgICAgICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICoKKyAgICAgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKKyAgICAgKiBhcmUgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEFTQy0zOEMwODAwIGhhcyAxNktCIGludGVybmFsIG1lbW9yeS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAorICAgICAgICBCSU9TX0VOIHwgUkFNX1NaXzE2S0IpOworCisgICAgLyoKKyAgICAgKiBTZXQgU0VMX01BU0sgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNFTF9NQVNLIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NFTF9NQVNLLAorICAgICAgICBBRFZfVElEX1RPX1RJRE1BU0soYXNjX2R2Yy0+Y2hpcF9zY3NpX2lkKSk7CisKKyAgICAvKgorICAgICAqIEJ1aWxkIHRoZSBjYXJyaWVyIGZyZWVsaXN0LgorICAgICAqCisgICAgICogRHJpdmVyIG11c3QgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCAnY2Fycmllcl9idWYnLgorICAgICAqLworICAgIEFTQ19BU1NFUlQoYXNjX2R2Yy0+Y2Fycmllcl9idWYgIT0gTlVMTCk7CisKKyAgICBjYXJycCA9IChBRFZfQ0FSUl9UICopIEFEVl8xNkJBTElHTihhc2NfZHZjLT5jYXJyaWVyX2J1Zik7CisgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IE5VTEw7CisgICAgaWYgKGNhcnJwID09IChBRFZfQ0FSUl9UICopIGFzY19kdmMtPmNhcnJpZXJfYnVmKQorICAgIHsKKyAgICAgICAgYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFIC0gc2l6ZW9mKEFEVl9DQVJSX1QpOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBjYXJyaWVyICdjYXJycCcuCisgICAgICAgICAqLworICAgICAgICBjb250aWdfbGVuID0gc2l6ZW9mKEFEVl9DQVJSX1QpOworICAgICAgICBjYXJyX3BhZGRyID0gY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcihhc2NfZHZjLCBOVUxMLCAodWNoYXIgKikgY2FycnAsCisgICAgICAgICAgICAoQURWX1NEQ05UICopICZjb250aWdfbGVuLCBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CisKKyAgICAgICAgYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBjdXJyZW50IGNhcnJpZXIgaXMgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywgdGhlbgorICAgICAgICAgKiBtYXliZSB0aGVyZSB3YXMgYSBwYWdlIGNyb3NzaW5nLiBUcnkgdGhlIG5leHQgY2FycmllciBhbGlnbmVkCisgICAgICAgICAqIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICBpZiAoY29udGlnX2xlbiA8IHNpemVvZihBRFZfQ0FSUl9UKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FycnArKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FycnAtPmNhcnJfcGEgPSBjYXJyX3BhZGRyOworICAgICAgICBjYXJycC0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoY2FycnApKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbnNlcnQgdGhlIGNhcnJpZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZWxpc3QuCisgICAgICAgICAqLworICAgICAgICBjYXJycC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKyAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOworCisgICAgICAgIGNhcnJwKys7CisgICAgfQorICAgIHdoaWxlIChidWZfc2l6ZSA+IDApOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIEhvc3QtPlJJU0MgSW5pdGlhdG9yIENvbW1hbmQgUXVldWUgKElDUSkuCisgICAgICovCisKKyAgICBpZiAoKGFzY19kdmMtPmljcV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKyAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKyAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGlzc3VlZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgc3RvcHBlciBjYXJyaWVyLgorICAgICAqLworICAgIGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisKKyAgICAvKgorICAgICAqIFNldCBSSVNDIElDUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorICAgICAqIGNhcnJfcGEgaXMgTEUsIG11c3QgYmUgbmF0aXZlIGJlZm9yZSB3cml0ZQorICAgICAqLworICAgIEFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSUNRLCBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpOworCisgICAgLyoKKyAgICAgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEpKTsKKworICAgIC8qCisgICAgICogVGhlIGZpcnN0IGNvbW1hbmQgY29tcGxldGVkIGJ5IHRoZSBSSVNDIHdpbGwgYmUgcGxhY2VkIGluCisgICAgICogdGhlIHN0b3BwZXIuCisgICAgICoKKyAgICAgKiBOb3RlOiBTZXQgJ25leHRfdnBhJyB0byBBU0NfQ1FfU1RPUFBFUi4gV2hlbiB0aGUgcmVxdWVzdCBpcworICAgICAqIGNvbXBsZXRlZCB0aGUgUklTQyB3aWxsIHNldCB0aGUgQVNDX1JRX1NUT1BQRVIgYml0LgorICAgICAqLworICAgIGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisKKyAgICAvKgorICAgICAqIFNldCBSSVNDIElSUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorICAgICAqCisgICAgICogY2Fycl9wYSBpcyBMRSwgbXVzdCBiZSBuYXRpdmUgYmVmb3JlIHdyaXRlICoKKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKyAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKKyAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOworCisgICAgLyogZmluYWxseSwgZmluYWxseSwgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZSAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfUlVOKTsKKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIFNDU0kgQnVzIGlmIHRoZSBFRVBST00gaW5kaWNhdGVzIHRoYXQgU0NTSSBCdXMKKyAgICAgKiBSZXNldHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIFJJU0MgaGFzIHRvIGJlIHJ1bm5pbmcKKyAgICAgKiB0byBpc3N1ZSBhIFNDU0kgQnVzIFJlc2V0LgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgQklPUyBTaWduYXR1cmUgaXMgcHJlc2VudCBpbiBtZW1vcnksIHJlc3RvcmUgdGhlCisgICAgICAgICAqIEJJT1MgSGFuZHNoYWtlIENvbmZpZ3VyYXRpb24gVGFibGUgYW5kIGRvIG5vdCBwZXJmb3JtCisgICAgICAgICAqIGEgU0NTSSBCdXMgUmVzZXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoYmlvc19tZW1bKEFTQ19NQ19CSU9TX1NJR05BVFVSRSAtIEFTQ19NQ19CSU9TTUVNKS8yXSA9PSAweDU1QUEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXN0b3JlIHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgICAgICAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQVNDLTM4QzE2MDAuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFTQ19EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTmVlZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4KKyAqLworU1RBVElDIGludAorQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgd2Fybl9jb2RlOworICAgIEFEVl9EQ05UICAgIHN1bTsKKyAgICBpbnQgICAgICAgICBiZWdpbl9hZGRyOworICAgIGludCAgICAgICAgIGVuZF9hZGRyOworICAgIHVzaG9ydCAgICAgIGNvZGVfc3VtOworICAgIGxvbmcgICAgICAgIHdvcmQ7CisgICAgaW50ICAgICAgICAgajsKKyAgICBpbnQgICAgICAgICBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplOworICAgIEFEVl9DQVJSX1QgICpjYXJycDsKKyAgICBBRFZfRENOVCAgICBjb250aWdfbGVuOworICAgIEFEVl9TRENOVCAgIGJ1Zl9zaXplOworICAgIEFEVl9QQUREUiAgIGNhcnJfcGFkZHI7CisgICAgaW50ICAgICAgICAgaTsKKyAgICB1c2hvcnQgICAgICBzY3NpX2NmZzE7CisgICAgdWNoYXIgICAgICAgYnl0ZTsKKyAgICB1Y2hhciAgICAgICB0aWQ7CisgICAgdXNob3J0ICAgICAgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4vMl07IC8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLworICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCBwcHJfYWJsZSwgdGFncW5nX2FibGU7CisgICAgdWNoYXIgICAgICAgbWF4X2NtZFtBU0NfTUFYX1RJRCArIDFdOworCisgICAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBlcnJvciwgZG9uJ3QgY29udGludWUuICovCisgICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGNhbGxlciBtdXN0IHNldCAnY2hpcF90eXBlJyB0byBBRFZfQ0hJUF9BU0MzOEMxNjAwLgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzhDMTYwMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX0NISVBUWVBFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIHdhcm5fY29kZSA9IDA7CisgICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24gYmVmb3JlIHdyaXRpbmcgdGhlIG1pY3JvY29kZS4KKyAgICAgKiBUaGUgQklPUyBtYXkgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHVzaW5nIGl0cyBSSVNDIExSQU0gcmVnaW9uCisgICAgICogc28gaXRzIHJlZ2lvbiBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZC4KKyAgICAgKgorICAgICAqIE5vdGU6IFRoaXMgY29kZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiwgd2hpY2ggaXMgY3VycmVudGx5IHRydWUsCisgICAgICogdGhhdCBhIGNoaXAgcmVzZXQgZG9lcyBub3QgY2xlYXIgUklTQyBMUkFNLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCisgICAgeworICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwgYmlvc19tZW1baV0pOworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSBjdXJyZW50IHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgcHByX2FibGUpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQVNDX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgIH0KKworICAgIC8qCisgICAgICogUkFNIEJJU1QgKEJ1aWx0LUluIFNlbGYgVGVzdCkKKyAgICAgKgorICAgICAqIEFkZHJlc3MgOiBJL08gYmFzZSArIG9mZnNldCAweDM4aCByZWdpc3RlciAoYnl0ZSkuCisgICAgICogRnVuY3Rpb246IEJpdCA3LTYoUlcpIDogUkFNIG1vZGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIE1vZGUgICA6IDB4MDAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlLXRlc3QgTW9kZSA6IDB4NDAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUkFNIFRlc3QgTW9kZSA6IDB4ODAKKyAgICAgKiAgICAgICAgICAgQml0IDUgICAgICAgOiB1bnVzZWQKKyAgICAgKiAgICAgICAgICAgQml0IDQoUk8pICAgOiBEb25lIGJpdAorICAgICAqICAgICAgICAgICBCaXQgMy0wKFJPKSA6IFN0YXR1cworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0IEVycm9yICAgIDogMHgwOAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRfUkFNIEVycm9yIDogMHgwNAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBSSVNDIEVycm9yICAgIDogMHgwMgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1NJIEVycm9yICAgIDogMHgwMQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBObyBFcnJvciAgICAgIDogMHgwMAorICAgICAqCisgICAgICogTm90ZTogUkFNIEJJU1QgY29kZSBzaG91bGQgYmUgcHV0IHJpZ2h0IGhlcmUsIGJlZm9yZSBsb2FkaW5nIHRoZQorICAgICAqIG1pY3JvY29kZSBhbmQgYWZ0ZXIgc2F2aW5nIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogTFJBTSBQcmUtdGVzdAorICAgICAqCisgICAgICogV3JpdGUgUFJFX1RFU1RfTU9ERSAoMHg0MCkgdG8gcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIDEwIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBJZiBEb25lIGJpdCBub3Qgc2V0IG9yIGxvdyBuaWJibGUgbm90IFBSRV9URVNUX1ZBTFVFICgweDA1KSwgcmV0dXJuCisgICAgICogYW4gZXJyb3IuIFJlc2V0IHRvIE5PUk1BTF9NT0RFICgweDAwKSBhbmQgZG8gYWdhaW4uIElmIGNhbm5vdCByZXNldAorICAgICAqIHRvIE5PUk1BTF9NT0RFLCByZXR1cm4gYW4gZXJyb3IgdG9vLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUFJFX1RFU1RfTU9ERSk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOyAgLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgcmVhZGluZyBiYWNrLiAqLworICAgICAgICBieXRlID0gQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCk7CisgICAgICAgIGlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAgfHwgKGJ5dGUgJiAweDBGKSAhPSBQUkVfVEVTVF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9QUkVfVEVTVDsKKyAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KKyAgICAgICAgaWYgKEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpCisgICAgICAgICAgICAhPSBOT1JNQUxfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7CisgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMUkFNIFRlc3QgLSBJdCB0YWtlcyBhYm91dCAxLjUgbXMgdG8gcnVuIHRocm91Z2ggdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBXcml0ZSBSQU1fVEVTVF9NT0RFICgweDgwKSB0byByZWdpc3RlciBhbmQgd2FpdCBmb3IgMTAgbWlsbGlzZWNvbmRzLgorICAgICAqIElmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLCBzYXZlIHJlZ2lzdGVyIGJ5dGUsIHNldCB0aGUKKyAgICAgKiBlcnJfY29kZSwgYW5kIHJldHVybiBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUkFNX1RFU1RfTU9ERSk7CisgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSBjaGVja2luZyBzdGF0dXMuICovCisKKyAgICBieXRlID0gQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCk7CisgICAgaWYgKChieXRlICYgUkFNX1RFU1RfRE9ORSkgPT0gMCB8fCAoYnl0ZSAmIFJBTV9URVNUX1NUQVRVUykgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIEdldCBoZXJlIGlmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLiAqLworICAgICAgICBhc2NfZHZjLT5iaXN0X2Vycl9jb2RlID0gYnl0ZTsgIC8qIGZvciBCSU9TIGRpc3BsYXkgbWVzc2FnZSAqLworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CSVNUX1JBTV9URVNUOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qIFdlIG5lZWQgdG8gcmVzZXQgYmFjayB0byBub3JtYWwgbW9kZSBhZnRlciBMUkFNIHRlc3QgcGFzc2VzLiAqLworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNULCBOT1JNQUxfTU9ERSk7CisKKyAgICAvKgorICAgICAqIExvYWQgdGhlIE1pY3JvY29kZQorICAgICAqCisgICAgICogV3JpdGUgdGhlIG1pY3JvY29kZSBpbWFnZSB0byBSSVNDIG1lbW9yeSBzdGFydGluZyBhdCBhZGRyZXNzIDAuCisgICAgICoKKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgMCk7CisKKyAgICAvKgorICAgICAqIEFzc3VtZSB0aGUgZm9sbG93aW5nIGNvbXByZXNzZWQgZm9ybWF0IG9mIHRoZSBtaWNyb2NvZGUgYnVmZmVyOgorICAgICAqCisgICAgICogIDI1NCB3b3JkICg1MDggYnl0ZSkgdGFibGUgaW5kZXhlZCBieSBieXRlIGNvZGUgZm9sbG93ZWQKKyAgICAgKiAgYnkgdGhlIGZvbGxvd2luZyBieXRlIGNvZGVzOgorICAgICAqCisgICAgICogICAgMS1CeXRlIENvZGU6CisgICAgICogICAgICAwMDogRW1pdCB3b3JkIDAgaW4gdGFibGUuCisgICAgICogICAgICAwMTogRW1pdCB3b3JkIDEgaW4gdGFibGUuCisgICAgICogICAgICAuCisgICAgICogICAgICBGRDogRW1pdCB3b3JkIDI1MyBpbiB0YWJsZS4KKyAgICAgKgorICAgICAqICAgIE11bHRpLUJ5dGUgQ29kZToKKyAgICAgKiAgICAgIEZFIFdXIFdXOiAoMyBieXRlIGNvZGUpIFdvcmQgdG8gZW1pdCBpcyB0aGUgbmV4dCB3b3JkIFdXIFdXLgorICAgICAqICAgICAgRkYgQkIgV1cgV1c6ICg0IGJ5dGUgY29kZSkgRW1pdCBCQiBjb3VudCB0aW1lcyBuZXh0IHdvcmQgV1cgV1cuCisgICAgICovCisgICAgd29yZCA9IDA7CisgICAgZm9yIChpID0gMjUzICogMjsgaSA8IF9hZHZfYXNjMzhDMTYwMF9zaXplOyBpKyspCisgICAgeworICAgICAgICBpZiAoX2Fkdl9hc2MzOEMxNjAwX2J1ZltpXSA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMV07IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgM10gPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMl0pKTsKKyAgICAgICAgICAgICAgICB3b3JkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChfYWR2X2FzYzM4QzE2MDBfYnVmW2ldID09IDB4ZmUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMl0gPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMV0pKTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisgICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMTYwMF9idWZbKF9hZHZfYXNjMzhDMTYwMF9idWZbaV0gKiAyKSArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZltfYWR2X2FzYzM4QzE2MDBfYnVmW2ldICogMl0pKTsKKyAgICAgICAgICAgIHdvcmQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0ICd3b3JkJyBmb3IgbGF0ZXIgdXNlIHRvIGNsZWFyIHRoZSByZXN0IG9mIG1lbW9yeSBhbmQgc2F2ZQorICAgICAqIHRoZSBleHBhbmRlZCBtY29kZSBzaXplLgorICAgICAqLworICAgIHdvcmQgKj0gMjsKKyAgICBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplID0gd29yZDsKKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM4QzE2MDAgSW50ZXJuYWwgUkFNICgzMktCKS4KKyAgICAgKi8KKyAgICBmb3IgKDsgd29yZCA8IEFEVl8zOEMxNjAwX01FTVNJWkU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorICAgICAqLworICAgIHN1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCisgICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzOEMxNjAwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKKyAgICB7CisgICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKyAgICB9CisKKyAgICBpZiAoc3VtICE9IF9hZHZfYXNjMzhDMTYwMF9jaGtzdW0pCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXN0b3JlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4vMjsgaSsrKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSB0byB0aGUgbWljcm9jb2RlCisgICAgICogY29kZSBjaGVja3N1bSBsb2NhdGlvbiBBU0NfTUNfQ09ERV9DSEtfU1VNICgweDJDKS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIGJlZ2luX2FkZHIpOworICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfRU5EX0FERFIsIGVuZF9hZGRyKTsKKyAgICBjb2RlX3N1bSA9IDA7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIGJlZ2luX2FkZHIpOworICAgIGZvciAod29yZCA9IGJlZ2luX2FkZHI7IHdvcmQgPCBlbmRfYWRkcjsgd29yZCArPSAyKQorICAgIHsKKyAgICAgICAgY29kZV9zdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0NIS19TVU0sIGNvZGVfc3VtKTsKKworICAgIC8qCisgICAgICogUmVhZCBtaWNyb2NvZGUgdmVyc2lvbiBhbmQgZGF0ZS4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX0RBVEUsIGFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9OVU0sIGFzY19kdmMtPmNmZy0+bWNvZGVfdmVyc2lvbik7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY2hpcCB0eXBlIHRvIGluZGljYXRlIHRoZSBBU0MzOEMxNjAwLgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DSElQX1RZUEUsIEFEVl9DSElQX0FTQzM4QzE2MDApOworCisgICAgLyoKKyAgICAgKiBXcml0ZSAxIHRvIGJpdCAxNCAnRElTX1RFUk1fRFJWJyBpbiB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyLgorICAgICAqIFdoZW4gRElTX1RFUk1fRFJWIHNldCB0byAxLCBDX0RFVFszOjBdIHdpbGwgcmVmbGVjdCBjdXJyZW50CisgICAgICogY2FibGUgZGV0ZWN0aW9uIGFuZCB0aGVuIHdlIGFyZSBhYmxlIHRvIHJlYWQgQ19ERVRbMzowXS4KKyAgICAgKgorICAgICAqIE5vdGU6IFdlIHdpbGwgcmVzZXQgRElTX1RFUk1fRFJWIHRvIDAgaW4gdGhlICdTZXQgU0NTSV9DRkcxCisgICAgICogTWljcm9jb2RlIERlZmF1bHQgVmFsdWUnIHNlY3Rpb24gYmVsb3cuCisgICAgICovCisgICAgc2NzaV9jZmcxID0gQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEpOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxIHwgRElTX1RFUk1fRFJWKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIFBDSSBDb25maWd1cmF0aW9uIENvbW1hbmQgUmVnaXN0ZXIgIlBhcml0eSBFcnJvciBSZXNwb25zZQorICAgICAqIENvbnRyb2wiIEJpdCB3YXMgY2xlYXIgKDApLCB0aGVuIHNldCB0aGUgbWljcm9jb2RlIHZhcmlhYmxlCisgICAgICogJ2NvbnRyb2xfZmxhZycgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSIGZsYWcgdG8gdGVsbCB0aGUgbWljcm9jb2RlCisgICAgICogdG8gaWdub3JlIERNQSBwYXJpdHkgZXJyb3JzLgorICAgICAqLworICAgIGlmIChhc2NfZHZjLT5jZmctPmNvbnRyb2xfZmxhZyAmIENPTlRST0xfRkxBR19JR05PUkVfUEVSUikKKyAgICB7CisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7CisgICAgICAgIHdvcmQgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOworICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBCSU9TIGNvbnRyb2wgZmxhZyBBSVBQIChBc3luY2hyb25vdXMgSW5mb3JtYXRpb24KKyAgICAgKiBQaGFzZSBQcm90ZWN0aW9uKSBkaXNhYmxlIGJpdCBpcyBub3Qgc2V0LCB0aGVuIHNldCB0aGUgZmlybXdhcmUKKyAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFAgYml0IHRvIGVuYWJsZQorICAgICAqIEFJUFAgY2hlY2tpbmcgYW5kIGVuY29kaW5nLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX0FJUFBfRElTKSA9PSAwKQorICAgIHsKKyAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKyAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFA7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEFTQy0zOEMxNjAwIHVzZSBETUFfQ0ZHMCBkZWZhdWx0IHZhbHVlczogRklGT19USFJFU0hfODBCIFs2OjRdLAorICAgICAqIGFuZCBTVEFSVF9DVExfVEggWzM6Ml0uCisgICAgICovCisgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfRE1BX0NGRzAsCisgICAgICAgIEZJRk9fVEhSRVNIXzgwQiB8IFNUQVJUX0NUTF9USCB8IFJFQURfQ01EX01STSk7CisKKyAgICAvKgorICAgICAqIE1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBXRFRSLCBTRFRSLCBhbmQgY29tbWFuZCB0YWcKKyAgICAgKiBxdWV1aW5nIHdpbGwgYmUgc2V0IGluIEFkdklucXVpcnlIYW5kbGluZygpIGJhc2VkIG9uIHdoYXQgYQorICAgICAqIGRldmljZSByZXBvcnRzIGl0IGlzIGNhcGFibGUgb2YgaW4gSW5xdWlyeSBieXRlIDcuCisgICAgICoKKyAgICAgKiBJZiBTQ1NJIEJ1cyBSZXNldHMgaGF2ZSBiZWVuIGRpc2FibGVkLCB0aGVuIGRpcmVjdGx5IHNldAorICAgICAqIFNEVFIgYW5kIFdEVFIgZnJvbSB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBhbGxvdworICAgICAqIHRoZSBCSU9TIGFuZCB3YXJtIGJvb3QgdG8gd29yayB3aXRob3V0IGEgU0NTSSBidXMgaGFuZyBvbgorICAgICAqIHRoZSBJbnF1aXJ5IGNhdXNlZCBieSBob3N0IGFuZCB0YXJnZXQgbWlzbWF0Y2hlZCBEVFIgdmFsdWVzLgorICAgICAqIFdpdGhvdXQgdGhlIFNDU0kgQnVzIFJlc2V0LCBiZWZvcmUgYW4gSW5xdWlyeSBhIGRldmljZSBjYW4ndAorICAgICAqIGJlIGFzc3VtZWQgdG8gYmUgaW4gQXN5bmNocm9ub3VzLCBOYXJyb3cgbW9kZS4KKyAgICAgKi8KKyAgICBpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykgPT0gMCkKKyAgICB7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGFzY19kdmMtPndkdHJfYWJsZSk7CisgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIGFzY19kdmMtPnNkdHJfYWJsZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIERJU0MgYW5kIFNEVFJfU1BFRUQxLAorICAgICAqIFNEVFJfU1BFRUQyLCBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IGJhc2VkIG9uIHRoZSBFRVBST00KKyAgICAgKiBjb25maWd1cmF0aW9uIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFRoZSBTRFRSIHBlciBUSUQgYml0bWFzayBvdmVycmlkZXMgdGhlIFNEVFJfU1BFRUQxLCBTRFRSX1NQRUVEMiwKKyAgICAgKiBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IHZhbHVlcyBzbyBpdCBpcyBzYWZlIHRvIHNldCB0aGVtCisgICAgICogd2l0aG91dCBkZXRlcm1pbmluZyBoZXJlIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBTRFRSLgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ESVNDX0VOQUJMRSwgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQxLCBhc2NfZHZjLT5zZHRyX3NwZWVkMSk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQyLCBhc2NfZHZjLT5zZHRyX3NwZWVkMik7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQzLCBhc2NfZHZjLT5zZHRyX3NwZWVkMyk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQ0LCBhc2NfZHZjLT5zZHRyX3NwZWVkNCk7CisKKyAgICAvKgorICAgICAqIFNldCBTQ1NJX0NGRzAgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisgICAgICoKKyAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzAgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0NTSV9DRkcwLAorICAgICAgICBQQVJJVFlfRU4gfCBRVUVVRV8xMjggfCBTRUxfVE1PX0xPTkcgfCBPVVJfSURfRU4gfAorICAgICAgICBhc2NfZHZjLT5jaGlwX3Njc2lfaWQpOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqCisgICAgICogRWFjaCBBU0MtMzhDMTYwMCBmdW5jdGlvbiBoYXMgb25seSB0d28gY2FibGUgZGV0ZWN0IGJpdHMuCisgICAgICogVGhlIGJ1cyBtb2RlIG92ZXJyaWRlIGJpdHMgYXJlIGluIElPUEJfU09GVF9PVkVSX1dSLgorICAgICAqLworICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGNhYmxlIGlzIHJldmVyc2VkIGFsbCBvZiB0aGUgU0NTSV9DVFJMIHJlZ2lzdGVyIHNpZ25hbHMKKyAgICAgKiB3aWxsIGJlIHNldC4gQ2hlY2sgZm9yIGFuZCByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyBjb25kaXRpb24gaXMKKyAgICAgKiBmb3VuZC4KKyAgICAgKi8KKyAgICBpZiAoKEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DVFJMKSAmIDB4M0YwNykgPT0gMHgzRjA3KQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEU7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFYWNoIEFTQy0zOEMxNjAwIGZ1bmN0aW9uIGhhcyB0d28gY29ubmVjdG9ycy4gT25seSBhbiBIVkQgZGV2aWNlCisgICAgICogY2FuIG5vdCBiZSBjb25uZWN0ZWQgdG8gZWl0aGVyIGNvbm5lY3Rvci4gQW4gTFZEIGRldmljZSBvciBTRSBkZXZpY2UKKyAgICAgKiBtYXkgYmUgY29ubmVjdGVkIHRvIGVpdGhlciBjb25uZWNvci4gSWYgYW4gU0UgZGV2aWNlIGlzIGNvbm5lY3RlZCwKKyAgICAgKiB0aGVuIGF0IG1vc3QgVWx0cmEgc3BlZWQgKDIwIE1oeikgY2FuIGJlIHVzZWQgb24gYm90aCBjb25uZWN0b3JzLgorICAgICAqCisgICAgICogSWYgYW4gSFZEIGRldmljZSBpcyBhdHRhY2hlZCwgcmV0dXJuIGFuIGVycm9yLgorICAgICAqLworICAgIGlmIChzY3NpX2NmZzEgJiBIVkQpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9IVkRfREVWSUNFOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogRWFjaCBmdW5jdGlvbiBpbiB0aGUgQVNDLTM4QzE2MDAgdXNlcyBvbmx5IHRoZSBTRSBjYWJsZSBkZXRlY3QgYW5kCisgICAgICogdGVybWluYXRpb24gYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGNvbm5lY3RvcnMgZm9yIGVhY2ggZnVuY3Rpb24uIEVhY2gKKyAgICAgKiBmdW5jdGlvbiBtYXkgdXNlIGVpdGhlciBMVkQgb3IgU0UgbW9kZS4gQ29ycmVzcG9uZGluZyB0aGUgU0UgYXV0b21hdGljCisgICAgICogdGVybWluYXRpb24gY29udHJvbCBFRVBST00gYml0cyBhcmUgdXNlZCBmb3IgZWFjaCBmdW5jdGlvbi4gRWFjaAorICAgICAqIGZ1bmN0aW9uIGhhcyBpdHMgb3duIEVFUFJPTS4gSWYgU0UgYXV0b21hdGljIGNvbnRyb2wgaXMgZW5hYmxlZCBmb3IKKyAgICAgKiB0aGUgZnVuY3Rpb24sIHRoZW4gc2V0IHRoZSB0ZXJtaW5hdGlvbiB2YWx1ZSBiYXNlZCBvbiBhIHRhYmxlIGxpc3RlZAorICAgICAqIGluIGFfY29uZG9yLmguCisgICAgICoKKyAgICAgKiBJZiBtYW51YWwgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBFRVBST00gZm9yIHRoZSBmdW5jdGlvbiwKKyAgICAgKiB0aGVuICd0ZXJtaW5hdGlvbicgd2FzIHNldC11cCBpbiBBc2NJbml0RnJvbTM4QzE2MDBFRVBST00oKSBhbmQgaXMKKyAgICAgKiByZWFkeSB0byBiZSAnb3JlZCcgaW50byBTQ1NJX0NGRzEuCisgICAgICovCisgICAgaWYgKChhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9TRSkgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIFNFIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCisgICAgICAgIHN3aXRjaChzY3NpX2NmZzEgJiBDX0RFVF9TRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVEVSTV9TRV9ISTogb24sIFRFUk1fU0VfTE86IG9uICovCisgICAgICAgICAgICBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDA6CisgICAgICAgICAgICAgICAgaWYgKEFTQ19QQ0lfSUQyRlVOQyhhc2NfZHZjLT5jZmctPnBjaV9zbG90X2luZm8pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiAwIC0gVEVSTV9TRV9ISTogb2ZmLCBURVJNX1NFX0xPOiBvZmYgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gMSAtIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX1NFX0hJOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2xlYXIgYW55IHNldCBURVJNX1NFIGJpdHMuCisgICAgICovCisgICAgc2NzaV9jZmcxICY9IH5URVJNX1NFOworCisgICAgLyoKKyAgICAgKiBJbnZlcnQgdGhlIFRFUk1fU0UgYml0cyBhbmQgdGhlbiBzZXQgJ3Njc2lfY2ZnMScuCisgICAgICovCisgICAgc2NzaV9jZmcxIHw9ICh+YXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fU0UpOworCisgICAgLyoKKyAgICAgKiBDbGVhciBCaWcgRW5kaWFuIGFuZCBUZXJtaW5hdG9yIFBvbGFyaXR5IGJpdHMgYW5kIHNldCBwb3NzaWJseQorICAgICAqIG1vZGlmaWVkIHRlcm1pbmF0aW9uIGNvbnRyb2wgYml0cyBpbiB0aGUgTWljcm9jb2RlIFNDU0lfQ0ZHMQorICAgICAqIFJlZ2lzdGVyIFZhbHVlLgorICAgICAqCisgICAgICogQmlnIEVuZGlhbiBiaXQgaXMgbm90IHVzZWQgZXZlbiBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgorICAgICAqLworICAgIHNjc2lfY2ZnMSAmPSAofkJJR19FTkRJQU4gJiB+RElTX1RFUk1fRFJWICYgflRFUk1fUE9MKTsKKworICAgIC8qCisgICAgICogU2V0IFNDU0lfQ0ZHMSBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorICAgICAqCisgICAgICogU2V0IHBvc3NpYmx5IG1vZGlmaWVkIHRlcm1pbmF0aW9uIGNvbnRyb2wgYml0cyBpbiB0aGUgTWljcm9jb2RlCisgICAgICogU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKyAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorICAgICAqLworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKKworICAgIC8qCisgICAgICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKyAgICAgKgorICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICoKKyAgICAgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKKyAgICAgKiBhcmUgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEFTQy0zOEMxNjAwIGhhcyAzMktCIGludGVybmFsIG1lbW9yeS4KKyAgICAgKgorICAgICAqIFhYWCAtIFNpbmNlIEFTQzM4QzE2MDAgUmV2LjMgaGFzIGEgTG9jYWwgUkFNIGZhaWx1cmUgaXNzdWUsIHdlIGNvbWUKKyAgICAgKiBvdXQgYSBzcGVjaWFsIDE2SyBBZHYgTGlicmFyeSBhbmQgTWljcm9jb2RlIHZlcnNpb24uIEFmdGVyIHRoZSBpc3N1ZQorICAgICAqIHJlc29sdmVkLCB3ZSBzaG91bGQgdHVybiBiYWNrIHRvIHRoZSAzMksgc3VwcG9ydC4gQm90aCBhX2NvbmRvci5oIGFuZAorICAgICAqIG1jb2RlLnNhcyBmaWxlcyBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KKyAgICAgKgorICAgICAqIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX01FTV9DRkcsCisgICAgICogIEJJT1NfRU4gfCBSQU1fU1pfMzJLQik7CisgICAgICovCisgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX01FTV9DRkcsIEJJT1NfRU4gfCBSQU1fU1pfMTZLQik7CisKKyAgICAvKgorICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorICAgICAqCisgICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisgICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKworICAgIC8qCisgICAgICogQnVpbGQgdGhlIGNhcnJpZXIgZnJlZWxpc3QuCisgICAgICoKKyAgICAgKiBEcml2ZXIgbXVzdCBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSBhbmQgc2V0ICdjYXJyaWVyX2J1ZicuCisgICAgICovCisKKyAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmNhcnJpZXJfYnVmICE9IE5VTEwpOworCisgICAgY2FycnAgPSAoQURWX0NBUlJfVCAqKSBBRFZfMTZCQUxJR04oYXNjX2R2Yy0+Y2Fycmllcl9idWYpOworICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBOVUxMOworICAgIGlmIChjYXJycCA9PSAoQURWX0NBUlJfVCAqKSBhc2NfZHZjLT5jYXJyaWVyX2J1ZikKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRSAtIHNpemVvZihBRFZfQ0FSUl9UKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY2FycmllciAnY2FycnAnLgorICAgICAgICAgKi8KKyAgICAgICAgY29udGlnX2xlbiA9IHNpemVvZihBRFZfQ0FSUl9UKTsKKyAgICAgICAgY2Fycl9wYWRkciA9IGNwdV90b19sZTMyKER2Y0dldFBoeUFkZHIoYXNjX2R2YywgTlVMTCwgKHVjaGFyICopIGNhcnJwLAorICAgICAgICAgICAgKEFEVl9TRENOVCAqKSAmY29udGlnX2xlbiwgQURWX0lTX0NBUlJJRVJfRkxBRykpOworCisgICAgICAgIGJ1Zl9zaXplIC09IHNpemVvZihBRFZfQ0FSUl9UKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgY3VycmVudCBjYXJyaWVyIGlzIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsIHRoZW4KKyAgICAgICAgICogbWF5YmUgdGhlcmUgd2FzIGEgcGFnZSBjcm9zc2luZy4gVHJ5IHRoZSBuZXh0IGNhcnJpZXIgYWxpZ25lZAorICAgICAgICAgKiBzdGFydCBhZGRyZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNvbnRpZ19sZW4gPCBzaXplb2YoQURWX0NBUlJfVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhcnJwKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhcnJwLT5jYXJyX3BhID0gY2Fycl9wYWRkcjsKKyAgICAgICAgY2FycnAtPmNhcnJfdmEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGNhcnJwKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zZXJ0IHRoZSBjYXJyaWVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyZWVsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgY2FycnAtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSk7CisgICAgICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBjYXJycDsKKworICAgICAgICBjYXJycCsrOworICAgIH0KKyAgICB3aGlsZSAoYnVmX3NpemUgPiAwKTsKKworICAgIC8qCisgICAgICogU2V0LXVwIHRoZSBIb3N0LT5SSVNDIEluaXRpYXRvciBDb21tYW5kIFF1ZXVlIChJQ1EpLgorICAgICAqLworICAgIGlmICgoYXNjX2R2Yy0+aWNxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisgICAgICAgIHJldHVybiBBRFZfRVJST1I7CisgICAgfQorICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEpKTsKKworICAgIC8qCisgICAgICogVGhlIGZpcnN0IGNvbW1hbmQgaXNzdWVkIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBzdG9wcGVyIGNhcnJpZXIuCisgICAgICovCisgICAgYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKKworICAgIC8qCisgICAgICogU2V0IFJJU0MgSUNRIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgdmFsdWUuIEluaXRpYWxpemUgdGhlCisgICAgICogQ09NTUEgcmVnaXN0ZXIgdG8gdGhlIHNhbWUgdmFsdWUgb3RoZXJ3aXNlIHRoZSBSSVNDIHdpbGwKKyAgICAgKiBwcmVtYXR1cmVseSBkZXRlY3QgYSBjb21tYW5kIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lDUSwgYXNjX2R2Yy0+aWNxX3NwLT5jYXJyX3BhKTsKKyAgICBBZHZXcml0ZURXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUERXX0NPTU1BLAorICAgICAgICBsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpKTsKKworICAgIC8qCisgICAgICogU2V0LXVwIHRoZSBSSVNDLT5Ib3N0IEluaXRpYXRvciBSZXNwb25zZSBRdWV1ZSAoSVJRKS4KKyAgICAgKi8KKyAgICBpZiAoKGFzY19kdmMtPmlycV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKyAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKyAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGNvbXBsZXRlZCBieSB0aGUgUklTQyB3aWxsIGJlIHBsYWNlZCBpbgorICAgICAqIHRoZSBzdG9wcGVyLgorICAgICAqCisgICAgICogTm90ZTogU2V0ICduZXh0X3ZwYScgdG8gQVNDX0NRX1NUT1BQRVIuIFdoZW4gdGhlIHJlcXVlc3QgaXMKKyAgICAgKiBjb21wbGV0ZWQgdGhlIFJJU0Mgd2lsbCBzZXQgdGhlIEFTQ19SUV9TVE9QUEVSIGJpdC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCisgICAgLyoKKyAgICAgKiBTZXQgUklTQyBJUlEgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKyAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKworICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKKyAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIHdvcmQpOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1BDLCB3b3JkKTsKKworICAgIC8qIGZpbmFsbHksIGZpbmFsbHksIGdlbnRsZW1lbiwgc3RhcnQgeW91ciBlbmdpbmUgKi8KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SSVNDX0NTUiwgQURWX1JJU0NfQ1NSX1JVTik7CisKKyAgICAvKgorICAgICAqIFJlc2V0IHRoZSBTQ1NJIEJ1cyBpZiB0aGUgRUVQUk9NIGluZGljYXRlcyB0aGF0IFNDU0kgQnVzCisgICAgICogUmVzZXRzIHNob3VsZCBiZSBwZXJmb3JtZWQuIFRoZSBSSVNDIGhhcyB0byBiZSBydW5uaW5nCisgICAgICogdG8gaXNzdWUgYSBTQ1NJIEJ1cyBSZXNldC4KKyAgICAgKi8KKyAgICBpZiAoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIEJJT1MgU2lnbmF0dXJlIGlzIHByZXNlbnQgaW4gbWVtb3J5LCByZXN0b3JlIHRoZQorICAgICAgICAgKiBwZXIgVElEIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkvMl0gPT0gMHg1NUFBKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmVzdG9yZSBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKKyAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgcHByX2FibGUpOworICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgICAgICAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBU0NfTUFYX1RJRDsgdGlkKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4gU2V0IGZpZWxkcyBpbiBBRFZfRFZDX1ZBUiBhbmQKKyAqIEFEVl9EVkNfQ0ZHIGJhc2VkIG9uIHRoZSBFRVBST00gc2V0dGluZ3MuIFRoZSBjaGlwIGlzIHN0b3BwZWQgd2hpbGUKKyAqIGFsbCBvZiB0aGlzIGlzIGRvbmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogQ2hpcCBpcyBzdG9wcGVkIG9uIGVudHJ5LgorICovCitTVEFUSUMgaW50IF9faW5pdAorQWR2SW5pdEZyb20zNTUwRUVQKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyICAgICAgICAgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7CisgICAgQURWRUVQXzM1NTBfQ09ORklHICBlZXBfY29uZmlnOworICAgIGludCAgICAgICAgICAgICAgICAgaTsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICB3YXJuX2NvZGUgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmIChBZHZHZXQzNTUwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pCisgICAgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzU1MF9DT05GSUcpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVjaGFyICopICZlZXBfY29uZmlnICsgaSkgPQorICAgICAgICAgICAgICAgICooKHVjaGFyICopICZEZWZhdWx0XzM1NTBfRUVQUk9NX0NvbmZpZyArIGkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIHRoZSA2IGJ5dGUgYm9hcmQgc2VyaWFsIG51bWJlciB0aGF0IHdhcyByZWFkCisgICAgICAgICAqIGZyb20gRUVQUk9NIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgRUVQUk9NIGNoZWNrc3VtCisgICAgICAgICAqIGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMyA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDEpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMiA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDIpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMSA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDMpOworCisgICAgICAgIEFkdlNldDM1NTBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBTZXQgQVNDX0RWQ19WQVIgYW5kIEFTQ19EVkNfQ0ZHIHZhcmlhYmxlcyBmcm9tIHRoZQorICAgICAqIEVFUFJPTSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHJlYWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBtYXBwaW5nIG9mIEVFUFJPTSBmaWVsZHMgdG8gQWR2IExpYnJhcnkgZmllbGRzLgorICAgICAqLworICAgIGFzY19kdmMtPndkdHJfYWJsZSA9IGVlcF9jb25maWcud2R0cl9hYmxlOworICAgIGFzY19kdmMtPnNkdHJfYWJsZSA9IGVlcF9jb25maWcuc2R0cl9hYmxlOworICAgIGFzY19kdmMtPnVsdHJhX2FibGUgPSBlZXBfY29uZmlnLnVsdHJhX2FibGU7CisgICAgYXNjX2R2Yy0+dGFncW5nX2FibGUgPSBlZXBfY29uZmlnLnRhZ3FuZ19hYmxlOworICAgIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLmRpc2NfZW5hYmxlOworICAgIGFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworICAgIGFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKyAgICBhc2NfZHZjLT5jaGlwX3Njc2lfaWQgPSAoZWVwX2NvbmZpZy5hZGFwdGVyX3Njc2lfaWQgJiBBRFZfTUFYX1RJRCk7CisgICAgYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBlZXBfY29uZmlnLnN0YXJ0X21vdG9yOworICAgIGFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IGVlcF9jb25maWcuc2NzaV9yZXNldF9kZWxheTsKKyAgICBhc2NfZHZjLT5iaW9zX2N0cmwgPSBlZXBfY29uZmlnLmJpb3NfY3RybDsKKyAgICBhc2NfZHZjLT5ub19zY2FtID0gZWVwX2NvbmZpZy5zY2FtX3RvbGVyYW50OworICAgIGFzY19kdmMtPmNmZy0+c2VyaWFsMSA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMTsKKyAgICBhc2NfZHZjLT5jZmctPnNlcmlhbDIgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDI7CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwzID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQzOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGhvc3QgbWF4aW11bSBxdWV1aW5nIChtYXguIDI1MywgbWluLiAxNikgYW5kIHRoZSBwZXIgZGV2aWNlCisgICAgICogbWF4aW11bSBxdWV1aW5nIChtYXguIDYzLCBtaW4uIDQpLgorICAgICAqLworICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA+IEFTQ19ERUZfTUFYX0hPU1RfUU5HKQorICAgIHsKKyAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKyAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nIDwgQVNDX0RFRl9NSU5fSE9TVF9RTkcpCisgICAgeworICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01JTl9IT1NUX1FORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gQVNDX0RFRl9NQVhfRFZDX1FORykKKyAgICB7CisgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOworICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA8IEFTQ19ERUZfTUlOX0RWQ19RTkcpCisgICAgeworICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUlOX0RWQ19RTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIElmICdtYXhfZHZjX3FuZycgaXMgZ3JlYXRlciB0aGFuICdtYXhfaG9zdF9xbmcnLCB0aGVuCisgICAgICogc2V0ICdtYXhfZHZjX3FuZycgdG8gJ21heF9ob3N0X3FuZycuCisgICAgICovCisgICAgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBlZXBfY29uZmlnLm1heF9ob3N0X3FuZykKKyAgICB7CisgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBBRFZfRFZDX1ZBUiAnbWF4X2hvc3RfcW5nJyBhbmQgQURWX0RWQ19WQVIgJ21heF9kdmNfcW5nJworICAgICAqIHZhbHVlcyBiYXNlZCBvbiBwb3NzaWJseSBhZGp1c3RlZCBFRVBST00gdmFsdWVzLgorICAgICAqLworICAgIGFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworICAgIGFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgRUVQUk9NICd0ZXJtaW5hdGlvbicgZmllbGQgaXMgc2V0IHRvIGF1dG9tYXRpYyAoMCksIHRoZW4gc2V0CisgICAgICogdGhlIEFEVl9EVkNfQ0ZHICd0ZXJtaW5hdGlvbicgZmllbGQgdG8gYXV0b21hdGljIGFsc28uCisgICAgICoKKyAgICAgKiBJZiB0aGUgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIHdpdGggYSBub24temVybyAndGVybWluYXRpb24nCisgICAgICogdmFsdWUgY2hlY2sgdGhhdCBhIGxlZ2FsIHZhbHVlIGlzIHNldCBhbmQgc2V0IHRoZSBBRFZfRFZDX0NGRworICAgICAqICd0ZXJtaW5hdGlvbicgZmllbGQgYXBwcm9wcmlhdGVseS4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IDA7ICAgIC8qIGF1dG8gdGVybWluYXRpb24gKi8KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb24gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IFRFUk1fQ1RMX1NFTDsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSBURVJNX0NUTF9TRUwgfCBURVJNX0NUTF9IOworCisgICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvbiAvIGhpZ2ggb24uICovCisgICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gVEVSTV9DVExfU0VMIHwgVEVSTV9DVExfSCB8IFRFUk1fQ1RMX0w7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIEVFUFJPTSAndGVybWluYXRpb24nIGZpZWxkIGNvbnRhaW5zIGEgYmFkIHZhbHVlLiBVc2UKKyAgICAgICAgICAgICAqIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBpbnN0ZWFkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gMDsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4gU2V0IGZpZWxkcyBpbiBBRFZfRFZDX1ZBUiBhbmQKKyAqIEFEVl9EVkNfQ0ZHIGJhc2VkIG9uIHRoZSBFRVBST00gc2V0dGluZ3MuIFRoZSBjaGlwIGlzIHN0b3BwZWQgd2hpbGUKKyAqIGFsbCBvZiB0aGlzIGlzIGRvbmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFEVl9EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogQ2hpcCBpcyBzdG9wcGVkIG9uIGVudHJ5LgorICovCitTVEFUSUMgaW50IF9faW5pdAorQWR2SW5pdEZyb20zOEMwODAwRUVQKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyICAgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlOworICAgIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAgICBlZXBfY29uZmlnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICB0aWQsIHRlcm1pbmF0aW9uOworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gMDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICB3YXJuX2NvZGUgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmIChBZHZHZXQzOEMwODAwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pCisgICAgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzhDMDgwMF9DT05GSUcpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVjaGFyICopICZlZXBfY29uZmlnICsgaSkgPQorICAgICAgICAgICAgICAgICooKHVjaGFyICopICZEZWZhdWx0XzM4QzA4MDBfRUVQUk9NX0NvbmZpZyArIGkpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIHRoZSA2IGJ5dGUgYm9hcmQgc2VyaWFsIG51bWJlciB0aGF0IHdhcyByZWFkCisgICAgICAgICAqIGZyb20gRUVQUk9NIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgRUVQUk9NIGNoZWNrc3VtCisgICAgICAgICAqIGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMyA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDEpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMiA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDIpOworCisgICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMSA9CisgICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDMpOworCisgICAgICAgIEFkdlNldDM4QzA4MDBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBTZXQgQURWX0RWQ19WQVIgYW5kIEFEVl9EVkNfQ0ZHIHZhcmlhYmxlcyBmcm9tIHRoZQorICAgICAqIEVFUFJPTSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHJlYWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBtYXBwaW5nIG9mIEVFUFJPTSBmaWVsZHMgdG8gQWR2IExpYnJhcnkgZmllbGRzLgorICAgICAqLworICAgIGFzY19kdmMtPndkdHJfYWJsZSA9IGVlcF9jb25maWcud2R0cl9hYmxlOworICAgIGFzY19kdmMtPnNkdHJfc3BlZWQxID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMTsKKyAgICBhc2NfZHZjLT5zZHRyX3NwZWVkMiA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDI7CisgICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDMgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQzOworICAgIGFzY19kdmMtPnNkdHJfc3BlZWQ0ID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkNDsKKyAgICBhc2NfZHZjLT50YWdxbmdfYWJsZSA9IGVlcF9jb25maWcudGFncW5nX2FibGU7CisgICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSA9IGVlcF9jb25maWcuZGlzY19lbmFibGU7CisgICAgYXNjX2R2Yy0+bWF4X2hvc3RfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9kdmNfcW5nOworICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCA9IChlZXBfY29uZmlnLmFkYXB0ZXJfc2NzaV9pZCAmIEFEVl9NQVhfVElEKTsKKyAgICBhc2NfZHZjLT5zdGFydF9tb3RvciA9IGVlcF9jb25maWcuc3RhcnRfbW90b3I7CisgICAgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID0gZWVwX2NvbmZpZy5zY3NpX3Jlc2V0X2RlbGF5OworICAgIGFzY19kdmMtPmJpb3NfY3RybCA9IGVlcF9jb25maWcuYmlvc19jdHJsOworICAgIGFzY19kdmMtPm5vX3NjYW0gPSBlZXBfY29uZmlnLnNjYW1fdG9sZXJhbnQ7CisgICAgYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwxID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxOworICAgIGFzY19kdmMtPmNmZy0+c2VyaWFsMiA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMjsKKyAgICBhc2NfZHZjLT5jZmctPnNlcmlhbDMgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDM7CisKKyAgICAvKgorICAgICAqIEZvciBldmVyeSBUYXJnZXQgSUQgaWYgYW55IG9mIGl0cyAnc2R0cl9zcGVlZFsxMjM0XScgYml0cworICAgICAqIGFyZSBzZXQsIHRoZW4gc2V0IGFuICdzZHRyX2FibGUnIGJpdCBmb3IgaXQuCisgICAgICovCisgICAgYXNjX2R2Yy0+c2R0cl9hYmxlID0gMDsKKyAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCisgICAgeworICAgICAgICBpZiAodGlkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMTsKKyAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQyOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA4KQorICAgICAgICB7CisgICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDM7CisgICAgICAgIH0gZWxzZSBpZiAodGlkID09IDEyKQorICAgICAgICB7CisgICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNkdHJfc3BlZWQgJiBBRFZfTUFYX1RJRCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9hYmxlIHw9ICgxIDw8IHRpZCk7CisgICAgICAgIH0KKyAgICAgICAgc2R0cl9zcGVlZCA+Pj0gNDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaG9zdCBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gMjUzLCBtaW4uIDE2KSBhbmQgdGhlIHBlciBkZXZpY2UKKyAgICAgKiBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gNjMsIG1pbi4gNCkuCisgICAgICovCisgICAgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID4gQVNDX0RFRl9NQVhfSE9TVF9RTkcpCisgICAgeworICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOworICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPCBBU0NfREVGX01JTl9IT1NUX1FORykKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NQVhfSE9TVF9RTkc7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUlOX0hPU1RfUU5HOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBBU0NfREVGX01BWF9EVkNfUU5HKQorICAgIHsKKyAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUFYX0RWQ19RTkc7CisgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nIDwgQVNDX0RFRl9NSU5fRFZDX1FORykKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUFYX0RWQ19RTkc7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NSU5fRFZDX1FORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogSWYgJ21heF9kdmNfcW5nJyBpcyBncmVhdGVyIHRoYW4gJ21heF9ob3N0X3FuZycsIHRoZW4KKyAgICAgKiBzZXQgJ21heF9kdmNfcW5nJyB0byAnbWF4X2hvc3RfcW5nJy4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IGVlcF9jb25maWcubWF4X2hvc3RfcW5nKQorICAgIHsKKyAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IEFEVl9EVkNfVkFSICdtYXhfaG9zdF9xbmcnIGFuZCBBRFZfRFZDX1ZBUiAnbWF4X2R2Y19xbmcnCisgICAgICogdmFsdWVzIGJhc2VkIG9uIHBvc3NpYmx5IGFkanVzdGVkIEVFUFJPTSB2YWx1ZXMuCisgICAgICovCisgICAgYXNjX2R2Yy0+bWF4X2hvc3RfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9kdmNfcW5nOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgRUVQUk9NICd0ZXJtaW5hdGlvbicgZmllbGQgaXMgc2V0IHRvIGF1dG9tYXRpYyAoMCksIHRoZW4gc2V0CisgICAgICogdGhlIEFEVl9EVkNfQ0ZHICd0ZXJtaW5hdGlvbicgZmllbGQgdG8gYXV0b21hdGljIGFsc28uCisgICAgICoKKyAgICAgKiBJZiB0aGUgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIHdpdGggYSBub24temVybyAndGVybWluYXRpb24nCisgICAgICogdmFsdWUgY2hlY2sgdGhhdCBhIGxlZ2FsIHZhbHVlIGlzIHNldCBhbmQgc2V0IHRoZSBBRFZfRFZDX0NGRworICAgICAqICd0ZXJtaW5hdGlvbicgZmllbGQgYXBwcm9wcmlhdGVseS4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAwKQorICAgIHsKKyAgICAgICAgdGVybWluYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdXRvIHRlcm1pbmF0aW9uIGZvciBTRSAqLworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb2ZmLiAqLworICAgICAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXJtaW5hdGlvbiA9IDA7CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisgICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXJtaW5hdGlvbiA9IFRFUk1fU0VfSEk7CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gVEVSTV9TRTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgRUVQUk9NICd0ZXJtaW5hdGlvbl9zZScgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCisgICAgICAgICAgICAgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gMDsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMCkKKyAgICB7CisgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsgLyogYXV0byB0ZXJtaW5hdGlvbiBmb3IgTFZEICovCisgICAgfSBlbHNlCisgICAgeworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvZmYuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb247CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisgICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uIHwgVEVSTV9MVkRfSEk7CisKKyAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0KKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGlvbiB8IFRFUk1fTFZEOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX2x2ZCcgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCisgICAgICAgICAgICAgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKKyAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gd2Fybl9jb2RlOworfQorCisvKgorICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4gU2V0IGZpZWxkcyBpbiBBU0NfRFZDX1ZBUiBhbmQKKyAqIEFTQ19EVkNfQ0ZHIGJhc2VkIG9uIHRoZSBFRVBST00gc2V0dGluZ3MuIFRoZSBjaGlwIGlzIHN0b3BwZWQgd2hpbGUKKyAqIGFsbCBvZiB0aGlzIGlzIGRvbmUuCisgKgorICogT24gZmFpbHVyZSBzZXQgdGhlIEFTQ19EVkNfVkFSIGZpZWxkICdlcnJfY29kZScgYW5kIHJldHVybiBBRFZfRVJST1IuCisgKgorICogRm9yIGEgbm9uLWZhdGFsIGVycm9yIHJldHVybiBhIHdhcm5pbmcgY29kZS4gSWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKgorICogTm90ZTogQ2hpcCBpcyBzdG9wcGVkIG9uIGVudHJ5LgorICovCitTVEFUSUMgaW50IF9faW5pdAorQWR2SW5pdEZyb20zOEMxNjAwRUVQKEFEVl9EVkNfVkFSICphc2NfZHZjKQoreworICAgIEFkdlBvcnRBZGRyICAgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlOworICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAgICBlZXBfY29uZmlnOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBpOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICB0aWQsIHRlcm1pbmF0aW9uOworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gMDsKKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICB3YXJuX2NvZGUgPSAwOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorICAgICAqLworICAgIGlmIChBZHZHZXQzOEMxNjAwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pCisgICAgeworICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzhDMTYwMF9DT05GSUcpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID09IDEgJiYgQVNDX1BDSV9JRDJGVU5DKGFzY19kdmMtPmNmZy0+cGNpX3Nsb3RfaW5mbykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCBGdW5jdGlvbiAxIEVFUFJPTSBXb3JkIDAgTVNCCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBDbGVhciB0aGUgQklPU19FTkFCTEUgKGJpdCAxNCkgYW5kIElOVEFCIChiaXQgMTEpCisgICAgICAgICAgICAgICAgICogRUVQUk9NIGJpdHMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBEaXNhYmxlIEJpdCAxNCAoQklPU19FTkFCTEUpIHRvIGZpeCBTUEFSQyBVbHRyYSA2MCBhbmQKKyAgICAgICAgICAgICAgICAgKiBvbGQgTWFjIHN5c3RlbSBib290aW5nIHByb2JsZW0uIFRoZSBFeHBhbnNpb24gUk9NIG11c3QKKyAgICAgICAgICAgICAgICAgKiBiZSBkaXNhYmxlZCBpbiBGdW5jdGlvbiAxIGZvciB0aGVzZSBzeXN0ZW1zLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJmVlcF9jb25maWcgKyBpKSA9CisgICAgICAgICAgICAgICAgKCgqKCh1Y2hhciAqKSAmRGVmYXVsdF8zOEMxNjAwX0VFUFJPTV9Db25maWcgKyBpKSkgJgorICAgICAgICAgICAgICAgICAgICAofigoKEFEVl9FRVBST01fQklPU19FTkFCTEUgfCBBRFZfRUVQUk9NX0lOVEFCKSA+PiA4KSAmCisgICAgICAgICAgICAgICAgICAgICAweEZGKSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIElOVEFCIChiaXQgMTEpIGlmIHRoZSBHUElPIDAgaW5wdXQgaW5kaWNhdGVzCisgICAgICAgICAgICAgICAgICogdGhlIEZ1bmN0aW9uIDEgaW50ZXJydXB0IGxpbmUgaXMgd2lyZWQgdG8gSU5UQS4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFNldC9DbGVhciBCaXQgMTEgKElOVEFCKSBmcm9tIHRoZSBHUElPIGJpdCAwIGlucHV0OgorICAgICAgICAgICAgICAgICAqICAgMSAtIEZ1bmN0aW9uIDEgaW50ZXJydXB0IGxpbmUgd2lyZWQgdG8gSU5UIEEuCisgICAgICAgICAgICAgICAgICogICAwIC0gRnVuY3Rpb24gMSBpbnRlcnJ1cHQgbGluZSB3aXJlZCB0byBJTlQgQi4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIE5vdGU6IEFkYXB0ZXIgYm9hcmRzIGFsd2F5cyBoYXZlIEZ1bmN0aW9uIDAgd2lyZWQgdG8gSU5UQS4KKyAgICAgICAgICAgICAgICAgKiBQdXQgYWxsIDUgR1BJTyBiaXRzIGluIGlucHV0IG1vZGUgYW5kIHRoZW4gcmVhZAorICAgICAgICAgICAgICAgICAqIHRoZWlyIGlucHV0IHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9HUElPX0NOVEwsIDApOworICAgICAgICAgICAgICAgIGlmIChBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0dQSU9fREFUQSkgJiAweDAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gMSBpbnRlcnJ1cHQgd2lyZWQgdG8gSU5UQTsgU2V0IEVFUFJPTSBiaXQuICovCisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJmVlcF9jb25maWcgKyBpKSB8PQorICAgICAgICAgICAgICAgICAgICAoKEFEVl9FRVBST01fSU5UQUIgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJmVlcF9jb25maWcgKyBpKSA9CisgICAgICAgICAgICAgICAgKigodWNoYXIgKikgJkRlZmF1bHRfMzhDMTYwMF9FRVBST01fQ29uZmlnICsgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBc3N1bWUgdGhlIDYgYnl0ZSBib2FyZCBzZXJpYWwgbnVtYmVyIHRoYXQgd2FzIHJlYWQKKyAgICAgICAgICogZnJvbSBFRVBST00gaXMgY29ycmVjdCBldmVuIGlmIHRoZSBFRVBST00gY2hlY2tzdW0KKyAgICAgICAgICogZmFpbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKyAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMSk7CisKKyAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKyAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMik7CisKKyAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKyAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMyk7CisKKyAgICAgICAgQWR2U2V0MzhDMTYwMEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IEFTQ19EVkNfVkFSIGFuZCBBU0NfRFZDX0NGRyB2YXJpYWJsZXMgZnJvbSB0aGUKKyAgICAgKiBFRVBST00gY29uZmlndXJhdGlvbiB0aGF0IHdhcyByZWFkLgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgbWFwcGluZyBvZiBFRVBST00gZmllbGRzIHRvIEFkdiBMaWJyYXJ5IGZpZWxkcy4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT53ZHRyX2FibGUgPSBlZXBfY29uZmlnLndkdHJfYWJsZTsKKyAgICBhc2NfZHZjLT5zZHRyX3NwZWVkMSA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDE7CisgICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDIgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQyOworICAgIGFzY19kdmMtPnNkdHJfc3BlZWQzID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMzsKKyAgICBhc2NfZHZjLT5zZHRyX3NwZWVkNCA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDQ7CisgICAgYXNjX2R2Yy0+cHByX2FibGUgPSAwOworICAgIGFzY19kdmMtPnRhZ3FuZ19hYmxlID0gZWVwX2NvbmZpZy50YWdxbmdfYWJsZTsKKyAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy5kaXNjX2VuYWJsZTsKKyAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKyAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisgICAgYXNjX2R2Yy0+Y2hpcF9zY3NpX2lkID0gKGVlcF9jb25maWcuYWRhcHRlcl9zY3NpX2lkICYgQVNDX01BWF9USUQpOworICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yID0gZWVwX2NvbmZpZy5zdGFydF9tb3RvcjsKKyAgICBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSBlZXBfY29uZmlnLnNjc2lfcmVzZXRfZGVsYXk7CisgICAgYXNjX2R2Yy0+Ymlvc19jdHJsID0gZWVwX2NvbmZpZy5iaW9zX2N0cmw7CisgICAgYXNjX2R2Yy0+bm9fc2NhbSA9IGVlcF9jb25maWcuc2NhbV90b2xlcmFudDsKKworICAgIC8qCisgICAgICogRm9yIGV2ZXJ5IFRhcmdldCBJRCBpZiBhbnkgb2YgaXRzICdzZHRyX3NwZWVkWzEyMzRdJyBiaXRzCisgICAgICogYXJlIHNldCwgdGhlbiBzZXQgYW4gJ3NkdHJfYWJsZScgYml0IGZvciBpdC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5zZHRyX2FibGUgPSAwOworICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFTQ19NQVhfVElEOyB0aWQrKykKKyAgICB7CisgICAgICAgIGlmICh0aWQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQxOworICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDI7CisgICAgICAgIH0gZWxzZSBpZiAodGlkID09IDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMzsKKyAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2R0cl9zcGVlZCAmIEFTQ19NQVhfVElEKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2FibGUgfD0gKDEgPDwgdGlkKTsKKyAgICAgICAgfQorICAgICAgICBzZHRyX3NwZWVkID4+PSA0OworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBob3N0IG1heGltdW0gcXVldWluZyAobWF4LiAyNTMsIG1pbi4gMTYpIGFuZCB0aGUgcGVyIGRldmljZQorICAgICAqIG1heGltdW0gcXVldWluZyAobWF4LiA2MywgbWluLiA0KS4KKyAgICAgKi8KKyAgICBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPiBBU0NfREVGX01BWF9IT1NUX1FORykKKyAgICB7CisgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NQVhfSE9TVF9RTkc7CisgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA8IEFTQ19ERUZfTUlOX0hPU1RfUU5HKQorICAgIHsKKyAgICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworICAgICAgICBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NSU5fSE9TVF9RTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IEFTQ19ERUZfTUFYX0RWQ19RTkcpCisgICAgeworICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKyAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPCBBU0NfREVGX01JTl9EVkNfUU5HKQorICAgIHsKKyAgICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworICAgICAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01JTl9EVkNfUU5HOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiAnbWF4X2R2Y19xbmcnIGlzIGdyZWF0ZXIgdGhhbiAnbWF4X2hvc3RfcW5nJywgdGhlbgorICAgICAqIHNldCAnbWF4X2R2Y19xbmcnIHRvICdtYXhfaG9zdF9xbmcnLgorICAgICAqLworICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcpCisgICAgeworICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgQVNDX0RWQ19WQVIgJ21heF9ob3N0X3FuZycgYW5kIEFTQ19EVkNfVkFSICdtYXhfZHZjX3FuZycKKyAgICAgKiB2YWx1ZXMgYmFzZWQgb24gcG9zc2libHkgYWRqdXN0ZWQgRUVQUk9NIHZhbHVlcy4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKyAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBpcyBzZXQgdG8gYXV0b21hdGljICgwKSwgdGhlbiBzZXQKKyAgICAgKiB0aGUgQVNDX0RWQ19DRkcgJ3Rlcm1pbmF0aW9uJyBmaWVsZCB0byBhdXRvbWF0aWMgYWxzby4KKyAgICAgKgorICAgICAqIElmIHRoZSB0ZXJtaW5hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIG5vbi16ZXJvICd0ZXJtaW5hdGlvbicKKyAgICAgKiB2YWx1ZSBjaGVjayB0aGF0IGEgbGVnYWwgdmFsdWUgaXMgc2V0IGFuZCBzZXQgdGhlIEFTQ19EVkNfQ0ZHCisgICAgICogJ3Rlcm1pbmF0aW9uJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDApCisgICAgeworICAgICAgICB0ZXJtaW5hdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF1dG8gdGVybWluYXRpb24gZm9yIFNFICovCisgICAgfSBlbHNlCisgICAgeworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvZmYuICovCisgICAgICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gMDsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gVEVSTV9TRV9ISTsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLworICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgdGVybWluYXRpb24gPSBURVJNX1NFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX3NlJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4KKyAgICAgICAgICAgICAqIFVzZSBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGVybWluYXRpb24gPSAwOworICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9URVJNSU5BVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAwKQorICAgIHsKKyAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOyAvKiBhdXRvIHRlcm1pbmF0aW9uIGZvciBMVkQgKi8KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KKyAgICAgICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKyAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb24gfCBURVJNX0xWRF9ISTsKKworICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLworICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPQorICAgICAgICAgICAgICAgIHRlcm1pbmF0aW9uIHwgVEVSTV9MVkQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIEVFUFJPTSAndGVybWluYXRpb25fbHZkJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4KKyAgICAgICAgICAgICAqIFVzZSBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOworICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9URVJNSU5BVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3YXJuX2NvZGU7Cit9CisKKy8qCisgKiBSZWFkIEVFUFJPTSBjb25maWd1cmF0aW9uIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogUmV0dXJuIGEgY2hlY2tzdW0gYmFzZWQgb24gdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uIHJlYWQuCisgKi8KK1NUQVRJQyB1c2hvcnQgX19pbml0CitBZHZHZXQzNTUwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLCBBRFZFRVBfMzU1MF9DT05GSUcgKmNmZ19idWYpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICB3dmFsLCBjaGtzdW07CisgICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGVlcF9hZGRyOworICAgIHVzaG9ydCAgICAgICAgICAgICAgKmNoYXJmaWVsZHM7CisKKyAgICBjaGFyZmllbGRzID0gKHVzaG9ydCAqKSAmQURWRUVQXzM1NTBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKyAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOworICAgIGNoa3N1bSA9IDA7CisKKyAgICBmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworICAgICAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOworICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgd3ZhbCA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisgICAgICAgIGNoa3N1bSArPSB3dmFsOyAvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICAqd2J1ZiA9IGxlMTZfdG9fY3B1KHd2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKndidWYgPSB3dmFsOworICAgICAgICB9CisgICAgfQorICAgIC8qIFJlYWQgY2hlY2tzdW0gd29yZC4gKi8KKyAgICAqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisgICAgd2J1ZisrOyBjaGFyZmllbGRzKys7CisKKyAgICAvKiBSZWFkIHJlc3Qgb2YgRUVQUk9NIG5vdCBjb3ZlcmVkIGJ5IHRoZSBjaGVja3N1bS4gKi8KKyAgICBmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOworICAgICAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7CisgICAgICAgICBlZXBfYWRkcisrLCB3YnVmKyspCisgICAgeworICAgICAgICAqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICAqd2J1ZiA9IGxlMTZfdG9fY3B1KCp3YnVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hrc3VtOworfQorCisvKgorICogUmVhZCBFRVBST00gY29uZmlndXJhdGlvbiBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIFJldHVybiBhIGNoZWNrc3VtIGJhc2VkIG9uIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiByZWFkLgorICovCitTVEFUSUMgdXNob3J0IF9faW5pdAorQWR2R2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICpjZmdfYnVmKQoreworICAgIHVzaG9ydCAgICAgICAgICAgICAgd3ZhbCwgY2hrc3VtOworICAgIHVzaG9ydCAgICAgICAgICAgICAgKndidWY7CisgICAgaW50ICAgICAgICAgICAgICAgICBlZXBfYWRkcjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICpjaGFyZmllbGRzOworCisgICAgY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikgJkFEVkVFUF8zOEMwODAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBjaGtzdW0gPSAwOworCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsKKyAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHd2YWwgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBjaGtzdW0gKz0gd3ZhbDsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp3YnVmID0gd3ZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBSZWFkIGNoZWNrc3VtIHdvcmQuICovCisgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCisgICAgLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOworICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoa3N1bTsKK30KKworLyoKKyAqIFJlYWQgRUVQUk9NIGNvbmZpZ3VyYXRpb24gaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gYSBjaGVja3N1bSBiYXNlZCBvbiB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24gcmVhZC4KKyAqLworU1RBVElDIHVzaG9ydCBfX2luaXQKK0FkdkdldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqY2ZnX2J1ZikKK3sKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHd2YWwsIGNoa3N1bTsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICp3YnVmOworICAgIGludCAgICAgICAgICAgICAgICAgZWVwX2FkZHI7CisgICAgdXNob3J0ICAgICAgICAgICAgICAqY2hhcmZpZWxkczsKKworICAgIGNoYXJmaWVsZHMgPSAodXNob3J0KikgJkFEVkVFUF8zOEMxNjAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBjaGtzdW0gPSAwOworCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsKKyAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHd2YWwgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBjaGtzdW0gKz0gd3ZhbDsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICp3YnVmID0gd3ZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBSZWFkIGNoZWNrc3VtIHdvcmQuICovCisgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCisgICAgLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCisgICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKyAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOworICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoa3N1bTsKK30KKworLyoKKyAqIFJlYWQgdGhlIEVFUFJPTSBmcm9tIHNwZWNpZmllZCBsb2NhdGlvbgorICovCitTVEFUSUMgdXNob3J0IF9faW5pdAorQWR2UmVhZEVFUFdvcmQoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIGludCBlZXBfd29yZF9hZGRyKQoreworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwKKyAgICAgICAgQVNDX0VFUF9DTURfUkVBRCB8IGVlcF93b3JkX2FkZHIpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIHJldHVybiBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEpOworfQorCisvKgorICogV2FpdCBmb3IgRUVQUk9NIGNvbW1hbmQgdG8gY29tcGxldGUKKyAqLworU1RBVElDIHZvaWQgX19pbml0CitBZHZXYWl0RUVQQ21kKEFkdlBvcnRBZGRyIGlvcF9iYXNlKQoreworICAgIGludCBlZXBfZGVsYXlfbXM7CisKKyAgICBmb3IgKGVlcF9kZWxheV9tcyA9IDA7IGVlcF9kZWxheV9tcyA8IEFEVl9FRVBfREVMQVlfTVM7IGVlcF9kZWxheV9tcysrKQorICAgIHsKKyAgICAgICAgaWYgKEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01EKSAmIEFTQ19FRVBfQ01EX0RPTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7CisgICAgfQorICAgIGlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQpICYgQVNDX0VFUF9DTURfRE9ORSkgPT0gMCkKKyAgICB7CisgICAgICAgIEFTQ19BU1NFUlQoMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCisgKi8KK3ZvaWQKK0FkdlNldDM1NTBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIEFEVkVFUF8zNTUwX0NPTkZJRyAqY2ZnX2J1ZikKK3sKKyAgICB1c2hvcnQgKndidWY7CisgICAgdXNob3J0IGFkZHIsIGNoa3N1bTsKKyAgICB1c2hvcnQgKmNoYXJmaWVsZHM7CisKKyAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOworICAgIGNoYXJmaWVsZHMgPSAodXNob3J0ICopICZBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyOworICAgIGNoa3N1bSA9IDA7CisKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0FCTEUpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBFRVBST00gZnJvbSB3b3JkIDAgdG8gd29yZCAyMC4KKyAgICAgKi8KKyAgICBmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47CisgICAgICAgICBhZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsgYWRkcisrLCB3YnVmKyspCisgICAgeworICAgICAgICB1c2hvcnQgd29yZDsKKworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdvcmQgPSAqd2J1ZjsKKyAgICAgICAgfQorICAgICAgICBjaGtzdW0gKz0gKndidWY7IC8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7CisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKyAgICAgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0VFUF9ERUxBWV9NUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXcml0ZSBFRVBST00gY2hlY2tzdW0gYXQgd29yZCAyMS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCBjaGtzdW0pOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKyAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICB3YnVmKys7IGNoYXJmaWVsZHMrKzsKKworICAgIC8qCisgICAgICogV3JpdGUgRUVQUk9NIE9FTSBuYW1lIGF0IHdvcmRzIDIyIHRvIDI5LgorICAgICAqLworICAgIGZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKyAgICAgICAgIGFkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7IGFkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgdXNob3J0IHdvcmQ7CisKKyAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKKyAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JkID0gKndidWY7CisgICAgICAgIH0KKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7CisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKyAgICAgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfRElTQUJMRSk7CisgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgcmV0dXJuOworfQorCisvKgorICogV3JpdGUgdGhlIEVFUFJPTSBmcm9tICdjZmdfYnVmJy4KKyAqLwordm9pZAorQWR2U2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICpjZmdfYnVmKQoreworICAgIHVzaG9ydCAqd2J1ZjsKKyAgICB1c2hvcnQgKmNoYXJmaWVsZHM7CisgICAgdXNob3J0IGFkZHIsIGNoa3N1bTsKKworICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7CisgICAgY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikgJkFEVkVFUF8zOEMwODAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisgICAgY2hrc3VtID0gMDsKKworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7CisgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIEVFUFJPTSBmcm9tIHdvcmQgMCB0byB3b3JkIDIwLgorICAgICAqLworICAgIGZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKyAgICAgICAgIGFkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOyBhZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHVzaG9ydCB3b3JkOworCisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd29yZCA9ICp3YnVmOworICAgICAgICB9CisgICAgICAgIGNoa3N1bSArPSAqd2J1ZjsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworICAgICAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRUVQX0RFTEFZX01TKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdyaXRlIEVFUFJPTSBjaGVja3N1bSBhdCB3b3JkIDIxLgorICAgICAqLworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIGNoa3N1bSk7CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBFRVBST00gT0VNIG5hbWUgYXQgd29yZHMgMjIgdG8gMjkuCisgICAgICovCisgICAgZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOworICAgICAgICAgYWRkciA8IEFEVl9FRVBfTUFYX1dPUkRfQUREUjsgYWRkcisrLCB3YnVmKyspCisgICAgeworICAgICAgICB1c2hvcnQgd29yZDsKKworICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgeworICAgICAgICAgICAgd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdvcmQgPSAqd2J1ZjsKKyAgICAgICAgfQorICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKKyAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworICAgICAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICB9CisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKyAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgRUVQUk9NIGZyb20gJ2NmZ19idWYnLgorICovCit2b2lkCitBZHZTZXQzOEMxNjAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBBRFZFRVBfMzhDMTYwMF9DT05GSUcgKmNmZ19idWYpCit7CisgICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgICpjaGFyZmllbGRzOworICAgIHVzaG9ydCAgICAgICAgICAgICAgYWRkciwgY2hrc3VtOworCisgICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKKyAgICBjaGFyZmllbGRzID0gKHVzaG9ydCAqKSAmQURWRUVQXzM4QzE2MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKyAgICBjaGtzdW0gPSAwOworCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9BQkxFKTsKKyAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKworICAgIC8qCisgICAgICogV3JpdGUgRUVQUk9NIGZyb20gd29yZCAwIHRvIHdvcmQgMjAuCisgICAgICovCisgICAgZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworICAgICAgICAgYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7IGFkZHIrKywgd2J1ZisrKQorICAgIHsKKyAgICAgICAgdXNob3J0IHdvcmQ7CisKKyAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKKyAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JkID0gKndidWY7CisgICAgICAgIH0KKyAgICAgICAgY2hrc3VtICs9ICp3YnVmOyAvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisgICAgICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKEFEVl9FRVBfREVMQVlfTVMpOworICAgIH0KKworICAgIC8qCisgICAgICogV3JpdGUgRUVQUk9NIGNoZWNrc3VtIGF0IHdvcmQgMjEuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgY2hrc3VtKTsKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisgICAgd2J1ZisrOyBjaGFyZmllbGRzKys7CisKKyAgICAvKgorICAgICAqIFdyaXRlIEVFUFJPTSBPRU0gbmFtZSBhdCB3b3JkcyAyMiB0byAyOS4KKyAgICAgKi8KKyAgICBmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DVExfQkVHSU47CisgICAgICAgICBhZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOyBhZGRyKyssIHdidWYrKykKKyAgICB7CisgICAgICAgIHVzaG9ydCB3b3JkOworCisgICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7CisgICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd29yZCA9ICp3YnVmOworICAgICAgICB9CisgICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOworICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisgICAgICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIH0KKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUpOworICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworICAgIHJldHVybjsKK30KKworLyogYV9hZHZsaWIuYyAqLworLyoKKyAqIEFkdkV4ZVNjc2lRdWV1ZSgpIC0gU2VuZCBhIHJlcXVlc3QgdG8gdGhlIFJJU0MgbWljcm9jb2RlIHByb2dyYW0uCisgKgorICogICBBbGxvY2F0ZSBhIGNhcnJpZXIgc3RydWN0dXJlLCBwb2ludCB0aGUgY2FycmllciB0byB0aGUgQURWX1NDU0lfUkVRX1EsCisgKiAgIGFkZCB0aGUgY2FycmllciB0byB0aGUgSUNRIChJbml0aWF0b3IgQ29tbWFuZCBRdWV1ZSksIGFuZCB0aWNrbGUgdGhlCisgKiAgIFJJU0MgdG8gbm90aWZ5IGl0IGEgbmV3IGNvbW1hbmQgaXMgcmVhZHkgdG8gYmUgZXhlY3V0ZWQuCisgKgorICogSWYgJ2RvbmVfc3RhdHVzJyBpcyBub3Qgc2V0IHRvIFFEX0RPX1JFVFJZLCB0aGVuICdlcnJvcl9yZXRyeScgd2lsbCBiZQorICogc2V0IHRvIFNDU0lfTUFYX1JFVFJZLgorICoKKyAqIE11bHRpLWJ5dGUgZmllbGRzIGluIHRoZSBBU0NfU0NTSV9SRVFfUSB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBtaWNyb2NvZGUKKyAqIGZvciBETUEgYWRkcmVzc2VzIG9yIG1hdGggb3BlcmF0aW9ucyBhcmUgYnl0ZSBzd2FwcGVkIHRvIGxpdHRsZS1lbmRpYW4KKyAqIG9yZGVyLgorICoKKyAqIFJldHVybjoKKyAqICAgICAgQURWX1NVQ0NFU1MoMSkgLSBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZC4KKyAqICAgICAgQURWX0JVU1koMCkgLSAgICBSZXNvdXJjZSB1bmF2YWlsYWJsZTsgUmV0cnkgYWdhaW4gYWZ0ZXIgcGVuZGluZworICogICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgY29tcGxldGVzLgorICogICAgICBBRFZfRVJST1IoLTEpIC0gIEludmFsaWQgQURWX1NDU0lfUkVRX1EgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICBob3N0IElDIGVycm9yLgorICovCitTVEFUSUMgaW50CitBZHZFeGVTY3NpUXVldWUoQURWX0RWQ19WQVIgKmFzY19kdmMsCisgICAgICAgICAgICAgICAgQURWX1NDU0lfUkVRX1EgKnNjc2lxKQoreworICAgIHVsb25nICAgICAgICAgICAgICAgICAgbGFzdF9pbnRfbGV2ZWw7CisgICAgQWR2UG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKyAgICBBRFZfRENOVCAgICAgICAgICAgICAgIHJlcV9zaXplOworICAgIEFEVl9QQUREUiAgICAgICAgICAgICAgcmVxX3BhZGRyOworICAgIEFEVl9DQVJSX1QgICAgICAgICAgICAgKm5ld19jYXJycDsKKworICAgIEFTQ19BU1NFUlQoc2NzaXEgIT0gTlVMTCk7IC8qICdzY3NpcScgc2hvdWxkIG5ldmVyIGJlIE5VTEwuICovCisKKyAgICAvKgorICAgICAqIFRoZSBBRFZfU0NTSV9SRVFfUSAndGFyZ2V0X2lkJyBmaWVsZCBzaG91bGQgbmV2ZXIgZXhjZWVkIEFEVl9NQVhfVElELgorICAgICAqLworICAgIGlmIChzY3NpcS0+dGFyZ2V0X2lkID4gQURWX01BWF9USUQpCisgICAgeworICAgICAgICBzY3NpcS0+aG9zdF9zdGF0dXMgPSBRSFNUQV9NX0lOVkFMSURfREVWSUNFOworICAgICAgICBzY3NpcS0+ZG9uZV9zdGF0dXMgPSBRRF9XSVRIX0VSUk9SOworICAgICAgICByZXR1cm4gQURWX0VSUk9SOworICAgIH0KKworICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisKKyAgICBsYXN0X2ludF9sZXZlbCA9IER2Y0VudGVyQ3JpdGljYWwoKTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgYSBjYXJyaWVyIGVuc3VyaW5nIGF0IGxlYXN0IG9uZSBjYXJyaWVyIGFsd2F5cworICAgICAqIHJlbWFpbnMgb24gdGhlIGZyZWVsaXN0IGFuZCBpbml0aWFsaXplIGZpZWxkcy4KKyAgICAgKi8KKyAgICBpZiAoKG5ld19jYXJycCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCisgICAgeworICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgIHJldHVybiBBRFZfQlVTWTsKKyAgICB9CisgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IChBRFZfQ0FSUl9UICopCisgICAgICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUobmV3X2NhcnJwLT5uZXh0X3ZwYSkpOworICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQrKzsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjYXJyaWVyIHRvIGJlIGEgc3RvcHBlciBieSBzZXR0aW5nICduZXh0X3ZwYScKKyAgICAgKiB0byB0aGUgc3RvcHBlciB2YWx1ZS4gVGhlIGN1cnJlbnQgc3RvcHBlciB3aWxsIGJlIGNoYW5nZWQKKyAgICAgKiBiZWxvdyB0byBwb2ludCB0byB0aGUgbmV3IHN0b3BwZXIuCisgICAgICovCisgICAgbmV3X2NhcnJwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIEFEVl9TQ1NJX1JFUV9RIGRvbmUgZmxhZy4KKyAgICAgKi8KKyAgICBzY3NpcS0+YV9mbGFnICY9IH5BRFZfU0NTSVFfRE9ORTsKKworICAgIHJlcV9zaXplID0gc2l6ZW9mKEFEVl9TQ1NJX1JFUV9RKTsKKyAgICByZXFfcGFkZHIgPSBEdmNHZXRQaHlBZGRyKGFzY19kdmMsIHNjc2lxLCAodWNoYXIgKikgc2NzaXEsCisgICAgICAgIChBRFZfU0RDTlQgKikgJnJlcV9zaXplLCBBRFZfSVNfU0NTSVFfRkxBRyk7CisKKyAgICBBU0NfQVNTRVJUKEFEVl8zMkJBTElHTihyZXFfcGFkZHIpID09IHJlcV9wYWRkcik7CisgICAgQVNDX0FTU0VSVChyZXFfc2l6ZSA+PSBzaXplb2YoQURWX1NDU0lfUkVRX1EpKTsKKworICAgIC8qIFdhaXQgZm9yIGFzc2VydGlvbiBiZWZvcmUgbWFraW5nIGxpdHRsZS1lbmRpYW4gKi8KKyAgICByZXFfcGFkZHIgPSBjcHVfdG9fbGUzMihyZXFfcGFkZHIpOworCisgICAgLyogU2F2ZSB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzIG9mIEFEVl9TQ1NJX1JFUV9RIGFuZCBjYXJyaWVyLiAqLworICAgIHNjc2lxLT5zY3NpcV9wdHIgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKHNjc2lxKSk7CisgICAgc2NzaXEtPnNjc2lxX3JwdHIgPSByZXFfcGFkZHI7CisKKyAgICBzY3NpcS0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoYXNjX2R2Yy0+aWNxX3NwKSk7CisgICAgLyoKKyAgICAgKiBFdmVyeSBBRFZfQ0FSUl9ULmNhcnJfcGEgaXMgYnl0ZSBzd2FwcGVkIHRvIGxpdHRsZS1lbmRpYW4KKyAgICAgKiBvcmRlciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgc2NzaXEtPmNhcnJfcGEgPSBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGE7CisKKyAgIC8qCisgICAgKiBVc2UgdGhlIGN1cnJlbnQgc3RvcHBlciB0byBzZW5kIHRoZSBBRFZfU0NTSV9SRVFfUSBjb21tYW5kIHRvCisgICAgKiB0aGUgbWljcm9jb2RlLiBUaGUgbmV3bHkgYWxsb2NhdGVkIHN0b3BwZXIgd2lsbCBiZWNvbWUgdGhlIG5ldworICAgICogc3RvcHBlci4KKyAgICAqLworICAgIGFzY19kdmMtPmljcV9zcC0+YXJlcV92cGEgPSByZXFfcGFkZHI7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgJ25leHRfdnBhJyBwb2ludGVyIGZvciB0aGUgb2xkIHN0b3BwZXIgdG8gYmUgdGhlCisgICAgICogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbmV3IHN0b3BwZXIuIFRoZSBSSVNDIGNhbiBvbmx5CisgICAgICogZm9sbG93IHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhID0gbmV3X2NhcnJwLT5jYXJyX3BhOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGhvc3QgYWRhcHRlciBzdG9wcGVyIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG5ldyBjYXJyaWVyLgorICAgICAqLworICAgIGFzY19kdmMtPmljcV9zcCA9IG5ld19jYXJycDsKKworICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCB8fAorICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRpY2tsZSB0aGUgUklTQyB0byB0ZWxsIGl0IHRvIHJlYWQgaXRzIENvbW1hbmQgUXVldWUgSGVhZCBwb2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX0EpOworICAgICAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGlja2xlIHZhbHVlLiBJbiB0aGUgQVNDLTM1NTAgdGhlIFJJU0MgZmxhZworICAgICAgICAgICAgICogY29tbWFuZCAnY2xyX3RpY2tsZV9hJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAorICAgICAgICAgICAgICogdmFsdWUgaXMgY2xlYXJlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTm90aWZ5IHRoZSBSSVNDIGEgY2FycmllciBpcyByZWFkeSBieSB3cml0aW5nIHRoZSBwaHlzaWNhbAorICAgICAgICAgKiBhZGRyZXNzIG9mIHRoZSBuZXcgY2FycmllciBzdG9wcGVyIHRvIHRoZSBDT01NQSByZWdpc3Rlci4KKyAgICAgICAgICovCisgICAgICAgIEFkdldyaXRlRFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QRFdfQ09NTUEsCisgICAgICAgICAgICAgICAgbGUzMl90b19jcHUobmV3X2NhcnJwLT5jYXJyX3BhKSk7CisgICAgfQorCisgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisKKyAgICByZXR1cm4gQURWX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBSZXNldCBTQ1NJIEJ1cyBhbmQgcHVyZ2UgYWxsIG91dHN0YW5kaW5nIHJlcXVlc3RzLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgQURWX1RSVUUoMSkgLSAgIEFsbCByZXF1ZXN0cyBhcmUgcHVyZ2VkIGFuZCBTQ1NJIEJ1cyBpcyByZXNldC4KKyAqICAgICAgQURWX0ZBTFNFKDApIC0gIE1pY3JvY29kZSBjb21tYW5kIGZhaWxlZC4KKyAqICAgICAgQURWX0VSUk9SKC0xKSAtIE1pY3JvY29kZSBjb21tYW5kIHRpbWVkLW91dC4gTWljcm9jb2RlIG9yIElDCisgKiAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgaHVuZyB3aGljaCByZXF1aXJlcyBkcml2ZXIgcmVjb3ZlcnkuCisgKi8KK1NUQVRJQyBpbnQKK0FkdlJlc2V0U0IoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzOworCisgICAgLyoKKyAgICAgKiBTZW5kIHRoZSBTQ1NJIEJ1cyBSZXNldCBpZGxlIHN0YXJ0IGlkbGUgY29tbWFuZCB3aGljaCBhc3NlcnRzCisgICAgICogdGhlIFNDU0kgQnVzIFJlc2V0IHNpZ25hbC4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBBZHZTZW5kSWRsZUNtZChhc2NfZHZjLCAodXNob3J0KSBJRExFX0NNRF9TQ1NJX1JFU0VUX1NUQVJULCAwTCk7CisgICAgaWYgKHN0YXR1cyAhPSBBRFZfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWxheSBmb3IgdGhlIHNwZWNpZmllZCBTQ1NJIEJ1cyBSZXNldCBob2xkIHRpbWUuCisgICAgICoKKyAgICAgKiBUaGUgaG9sZCB0aW1lIGRlbGF5IGlzIGRvbmUgb24gdGhlIGhvc3QgYmVjYXVzZSB0aGUgUklTQyBoYXMgbm8KKyAgICAgKiBtaWNyb3NlY29uZCBhY2N1cmF0ZSB0aW1lci4KKyAgICAgKi8KKyAgICBEdmNEZWxheU1pY3JvU2Vjb25kKGFzY19kdmMsICh1c2hvcnQpIEFTQ19TQ1NJX1JFU0VUX0hPTERfVElNRV9VUyk7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIFNDU0kgQnVzIFJlc2V0IGVuZCBpZGxlIGNvbW1hbmQgd2hpY2ggZGUtYXNzZXJ0cworICAgICAqIHRoZSBTQ1NJIEJ1cyBSZXNldCBzaWduYWwgYW5kIHB1cmdlcyBhbnkgcGVuZGluZyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSBBZHZTZW5kSWRsZUNtZChhc2NfZHZjLCAodXNob3J0KSBJRExFX0NNRF9TQ1NJX1JFU0VUX0VORCwgMEwpOworICAgIGlmIChzdGF0dXMgIT0gQURWX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoKEFEVl9EQ05UKSBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgKiAxMDAwKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSZXNldCBjaGlwIGFuZCBTQ1NJIEJ1cy4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgIEFEVl9UUlVFKDEpIC0gICBDaGlwIHJlLWluaXRpYWxpemF0aW9uIGFuZCBTQ1NJIEJ1cyBSZXNldCBzdWNjZXNzZnVsLgorICogICAgICBBRFZfRkFMU0UoMCkgLSAgQ2hpcCByZS1pbml0aWFsaXphdGlvbiBhbmQgU0NTSSBCdXMgUmVzZXQgZmFpbHVyZS4KKyAqLworU1RBVElDIGludAorQWR2UmVzZXRDaGlwQW5kU0IoQURWX0RWQ19WQVIgKmFzY19kdmMpCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzOworICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKyAgICB1c2hvcnQgICAgICBwcHJfYWJsZSA9IDA7CisgICAgdWNoYXIgICAgICAgdGlkLCBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisgICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisgICAgdXNob3J0ICAgICAgYmlvc19zaWc7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkKKyAgICB7CisgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7CisgICAgfQorICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQorICAgIHsKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisgICAgICAgICAgICBtYXhfY21kW3RpZF0pOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yY2UgdGhlIEFkdkluaXRBc2MzNTUwLzM4QzA4MDBEcml2ZXIoKSBmdW5jdGlvbiB0bworICAgICAqIHBlcmZvcm0gYSBTQ1NJIEJ1cyBSZXNldCBieSBjbGVhcmluZyB0aGUgQklPUyBzaWduYXR1cmUgd29yZC4KKyAgICAgKiBUaGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGFzc3VtZXMgYSBTQ1NJIEJ1cyBSZXNldCBpcyBub3QKKyAgICAgKiBuZWVkZWQgaWYgdGhlIEJJT1Mgc2lnbmF0dXJlIHdvcmQgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TX1NJR05BVFVSRSwgYmlvc19zaWcpOworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TX1NJR05BVFVSRSwgMCk7CisKKyAgICAvKgorICAgICAqIFN0b3AgY2hpcCBhbmQgcmVzZXQgaXQuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUklTQ19DU1IsIEFEVl9SSVNDX0NTUl9TVE9QKTsKKyAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DVFJMX1JFRywgQURWX0NUUkxfUkVHX0NNRF9SRVNFVCk7CisgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOworICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0NUUkxfUkVHLCBBRFZfQ1RSTF9SRUdfQ01EX1dSX0lPX1JFRyk7CisKKyAgICAvKgorICAgICAqIFJlc2V0IEFkdiBMaWJyYXJ5IGVycm9yIGNvZGUsIGlmIGFueSwgYW5kIHRyeQorICAgICAqIHJlLWluaXRpYWxpemluZyB0aGUgY2hpcC4KKyAgICAgKi8KKyAgICBhc2NfZHZjLT5lcnJfY29kZSA9IDA7CisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoYXNjX2R2Yyk7CisgICAgfQorICAgIGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoYXNjX2R2Yyk7CisgICAgfSBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBBZHZJbml0QXNjMzU1MERyaXZlcihhc2NfZHZjKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgaW5pdGlhbGl6YXRpb24gcmV0dXJuIHZhbHVlIHRvIHN0YXR1cyB2YWx1ZS4gKi8KKyAgICBpZiAoc3RhdHVzID09IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSBBRFZfVFJVRTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEFEVl9GQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgdGhlIEJJT1Mgc2lnbmF0dXJlIHdvcmQuCisgICAgICovCisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NfU0lHTkFUVVJFLCBiaW9zX3NpZyk7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQorICAgIHsKKyAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7CisgICAgfQorICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19UQUdRTkdfQUJMRSwgdGFncW5nX2FibGUpOworICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFEVl9NQVhfVElEOyB0aWQrKykKKyAgICB7CisgICAgICAgIEFkdldyaXRlQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKyAgICAgICAgICAgIG1heF9jbWRbdGlkXSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEFkdiBMaWJyYXJ5IEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUKKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBkcml2ZXIncyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICogIFRoZSBmdW5jdGlvbiBkaXNhYmxlcyBhbmQgcmUtZW5hYmxlcyBpbnRlcnJ1cHRzLgorICoKKyAqICBXaGVuIGEgbWljcm9jb2RlIGlkbGUgY29tbWFuZCBpcyBjb21wbGV0ZWQsIHRoZSBBRFZfRFZDX1ZBUgorICogICdpZGxlX2NtZF9kb25lJyBmaWVsZCBpcyBzZXQgdG8gQURWX1RSVUUuCisgKgorICogIE5vdGU6IEFkdklTUigpIGNhbiBiZSBjYWxsZWQgd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvciBldmVuCisgKiAgd2hlbiB0aGVyZSBpcyBubyBoYXJkd2FyZSBpbnRlcnJ1cHQgY29uZGl0aW9uIHByZXNlbnQuIEl0IHdpbGwKKyAqICBhbHdheXMgY2hlY2sgZm9yIGNvbXBsZXRlZCBpZGxlIGNvbW1hbmRzIGFuZCBtaWNyb2NvZGUgcmVxdWVzdHMuCisgKiAgVGhpcyBpcyBhbiBpbXBvcnRhbnQgZmVhdHVyZSB0aGF0IHNob3VsZG4ndCBiZSBjaGFuZ2VkIGJlY2F1c2UgaXQKKyAqICBhbGxvd3MgY29tbWFuZHMgdG8gYmUgY29tcGxldGVkIGZyb20gcG9sbGluZyBtb2RlIGxvb3BzLgorICoKKyAqIFJldHVybjoKKyAqICAgQURWX1RSVUUoMSkgLSBpbnRlcnJ1cHQgd2FzIHBlbmRpbmcKKyAqICAgQURWX0ZBTFNFKDApIC0gbm8gaW50ZXJydXB0IHdhcyBwZW5kaW5nCisgKi8KK1NUQVRJQyBpbnQKK0FkdklTUihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3sKKyAgICBBZHZQb3J0QWRkciAgICAgICAgICAgICAgICAgaW9wX2Jhc2U7CisgICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIGludF9zdGF0OworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfYml0OworICAgIEFEVl9DQVJSX1QgICAgICAgICAgICAgICAgICAqZnJlZV9jYXJycDsKKyAgICBBRFZfVkFERFIgICAgICAgICAgICAgICAgICAgaXJxX25leHRfdnBhOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBBRFZfU0NTSV9SRVFfUSAgICAgICAgICAgICAgKnNjc2lxOworCisgICAgZmxhZ3MgPSBEdmNFbnRlckNyaXRpY2FsKCk7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyogUmVhZGluZyB0aGUgcmVnaXN0ZXIgY2xlYXJzIHRoZSBpbnRlcnJ1cHQuICovCisgICAgaW50X3N0YXQgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfU1RBVFVTX1JFRyk7CisKKyAgICBpZiAoKGludF9zdGF0ICYgKEFEVl9JTlRSX1NUQVRVU19JTlRSQSB8IEFEVl9JTlRSX1NUQVRVU19JTlRSQiB8CisgICAgICAgICBBRFZfSU5UUl9TVEFUVVNfSU5UUkMpKSA9PSAwKQorICAgIHsKKyAgICAgICAgRHZjTGVhdmVDcml0aWNhbChmbGFncyk7CisgICAgICAgIHJldHVybiBBRFZfRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOb3RpZnkgdGhlIGRyaXZlciBvZiBhbiBhc3luY2hyb25vdXMgbWljcm9jb2RlIGNvbmRpdGlvbiBieQorICAgICAqIGNhbGxpbmcgdGhlIEFEVl9EVkNfVkFSLmFzeW5jX2NhbGxiYWNrIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24KKyAgICAgKiBpcyBwYXNzZWQgdGhlIG1pY3JvY29kZSBBU0NfTUNfSU5UUkJfQ09ERSBieXRlIHZhbHVlLgorICAgICAqLworICAgIGlmIChpbnRfc3RhdCAmIEFEVl9JTlRSX1NUQVRVU19JTlRSQikKKyAgICB7CisgICAgICAgIHVjaGFyIGludHJiX2NvZGU7CisKKyAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSU5UUkJfQ09ERSwgaW50cmJfY29kZSk7CisKKyAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwIHx8CisgICAgICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludHJiX2NvZGUgPT0gQURWX0FTWU5DX0NBUlJJRVJfUkVBRFlfRkFJTFVSRSAmJgorICAgICAgICAgICAgICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsIEFEVl9USUNLTEVfQSk7CisgICAgICAgICAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGFzY19kdmMtPmFzeW5jX2NhbGxiYWNrICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICgqYXNjX2R2Yy0+YXN5bmNfY2FsbGJhY2spKGFzY19kdmMsIGludHJiX2NvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgSVJRIHN0b3BwZXIgY2FycmllciBjb250YWlucyBhIGNvbXBsZXRlZCByZXF1ZXN0LgorICAgICAqLworICAgIHdoaWxlICgoKGlycV9uZXh0X3ZwYSA9CisgICAgICAgICAgICAgbGUzMl90b19jcHUoYXNjX2R2Yy0+aXJxX3NwLT5uZXh0X3ZwYSkpICYgQVNDX1JRX0RPTkUpICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjb21wbGV0ZWQgQURWX1NDU0lfUkVRX1Egc3RydWN0dXJlLgorICAgICAgICAgKiBUaGUgUklTQyB3aWxsIGhhdmUgc2V0ICdhcmVxX3ZwYScgdG8gYSB2aXJ0dWFsIGFkZHJlc3MuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBmaXJtd2FyZSB3aWxsIGhhdmUgY29waWVkIHRoZSBBU0NfU0NTSV9SRVFfUS5zY3NpcV9wdHIKKyAgICAgICAgICogZmllbGQgdG8gdGhlIGNhcnJpZXIgQURWX0NBUlJfVC5hcmVxX3ZwYSBmaWVsZC4gVGhlIGNvbnZlcnNpb24KKyAgICAgICAgICogYmVsb3cgY29tcGxlbWVudHMgdGhlIGNvbnZlcnNpb24gb2YgQVNDX1NDU0lfUkVRX1Euc2NzaXFfcHRyJworICAgICAgICAgKiBpbiBBZHZFeGVTY3NpUXVldWUoKS4KKyAgICAgICAgICovCisgICAgICAgIHNjc2lxID0gKEFEVl9TQ1NJX1JFUV9RICopCisgICAgICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+YXJlcV92cGEpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXF1ZXN0IGZpbmlzaGVkIHdpdGggZ29vZCBzdGF0dXMgYW5kIHRoZSBxdWV1ZSB3YXMgbm90CisgICAgICAgICAqIERNQWVkIHRvIGhvc3QgbWVtb3J5IGJ5IHRoZSBmaXJtd2FyZS4gU2V0IGFsbCBzdGF0dXMgZmllbGRzCisgICAgICAgICAqIHRvIGluZGljYXRlIGdvb2Qgc3RhdHVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChpcnFfbmV4dF92cGEgJiBBU0NfUlFfR09PRCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2NzaXEtPmRvbmVfc3RhdHVzID0gUURfTk9fRVJST1I7CisgICAgICAgICAgICBzY3NpcS0+aG9zdF9zdGF0dXMgPSBzY3NpcS0+c2NzaV9zdGF0dXMgPSAwOworICAgICAgICAgICAgc2NzaXEtPmRhdGFfY250ID0gMEw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBZHZhbmNlIHRoZSBzdG9wcGVyIHBvaW50ZXIgdG8gdGhlIG5leHQgY2FycmllcgorICAgICAgICAgKiBpZ25vcmluZyB0aGUgbG93ZXIgZm91ciBiaXRzLiBGcmVlIHRoZSBwcmV2aW91cworICAgICAgICAgKiBzdG9wcGVyIGNhcnJpZXIuCisgICAgICAgICAqLworICAgICAgICBmcmVlX2NhcnJwID0gYXNjX2R2Yy0+aXJxX3NwOworICAgICAgICBhc2NfZHZjLT5pcnFfc3AgPSAoQURWX0NBUlJfVCAqKQorICAgICAgICAgICAgQURWX1UzMl9UT19WQUREUihBU0NfR0VUX0NBUlJQKGlycV9uZXh0X3ZwYSkpOworCisgICAgICAgIGZyZWVfY2FycnAtPm5leHRfdnBhID0KKyAgICAgICAgICAgICAgICBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKyAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGZyZWVfY2FycnA7CisgICAgICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQtLTsKKworICAgICAgICBBU0NfQVNTRVJUKHNjc2lxICE9IE5VTEwpOworICAgICAgICB0YXJnZXRfYml0ID0gQURWX1RJRF9UT19USURNQVNLKHNjc2lxLT50YXJnZXRfaWQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHJlcXVlc3QgbWljcm9jb2RlIGNvbnRyb2wgZmxhZy4KKyAgICAgICAgICovCisgICAgICAgIHNjc2lxLT5jbnRsID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgY29tbWFuZCB0aGF0IGNvbXBsZXRlZCB3YXMgYSBTQ1NJIElOUVVJUlkgYW5kCisgICAgICAgICAqIExVTiAwIHdhcyBzZW50IHRoZSBjb21tYW5kLCB0aGVuIHByb2Nlc3MgdGhlIElOUVVJUlkKKyAgICAgICAgICogY29tbWFuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRldmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogSWYgZGF0YSByZXR1cm5lZCB3ZXJlIGVpdGhlciBWUEQgb3IgQ21kRHQgZGF0YSwKKyAgICAgICAgICogZG9uJ3QgcHJvY2VzcyB0aGUgSU5RVUlSWSBjb21tYW5kIGluZm9ybWF0aW9uIGZvcgorICAgICAgICAgKiB0aGUgZGV2aWNlLCBvdGhlcndpc2UgbWF5IGVycm9uZW91c2x5IHNldCAqX2FibGUgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzY3NpcS0+ZG9uZV9zdGF0dXMgPT0gUURfTk9fRVJST1IgJiYKKyAgICAgICAgICAgIHNjc2lxLT5jZGJbMF0gPT0gSU5RVUlSWSAmJgorICAgICAgICAgICAgc2NzaXEtPnRhcmdldF9sdW4gPT0gMCAmJgorICAgICAgICAgICAgKHNjc2lxLT5jZGJbMV0gJiBBRFZfSU5RX1JUTl9WUERfQU5EX0NNRERUKQorICAgICAgICAgICAgICAgID09IEFEVl9JTlFfUlROX1NURF9JTlFVSVJZX0RBVEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkdklucXVpcnlIYW5kbGluZyhhc2NfZHZjLCBzY3NpcSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBOb3RpZnkgdGhlIGRyaXZlciBvZiB0aGUgY29tcGxldGVkIHJlcXVlc3QgYnkgcGFzc2luZworICAgICAgICAgKiB0aGUgQURWX1NDU0lfUkVRX1EgcG9pbnRlciB0byBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBzY3NpcS0+YV9mbGFnIHw9IEFEVl9TQ1NJUV9ET05FOworICAgICAgICAoKmFzY19kdmMtPmlzcl9jYWxsYmFjaykoYXNjX2R2Yywgc2NzaXEpOworICAgICAgICAvKgorICAgICAgICAgKiBOb3RlOiBBZnRlciB0aGUgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgJ3Njc2lxJworICAgICAgICAgKiBjYW4gbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEZhbGwgdGhyb3VnaCBhbmQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBjb21wbGV0ZWQKKyAgICAgICAgICogcmVxdWVzdHMuLi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGluIGNhc2UgdGhlIGRyaXZlciBpbmFkdmVydGVudGx5CisgICAgICAgICAqIGVuYWJsZWQgaW50ZXJydXB0cyBpbiBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBEdmNFbnRlckNyaXRpY2FsKCkgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQsIGJlY2F1c2UKKyAgICAgICAgICogdGhlICdmbGFncycgc2F2ZWQgd2hlbiBBZHZJU1IoKSB3YXMgZmlyc3QgZW50ZXJlZCB3aWxsIGJlCisgICAgICAgICAqIHVzZWQgdG8gcmVzdG9yZSB0aGUgaW50ZXJydXB0IGZsYWcgb24gZXhpdC4KKyAgICAgICAgICovCisgICAgICAgICh2b2lkKSBEdmNFbnRlckNyaXRpY2FsKCk7CisgICAgfQorICAgIER2Y0xlYXZlQ3JpdGljYWwoZmxhZ3MpOworICAgIHJldHVybiBBRFZfVFJVRTsKK30KKworLyoKKyAqIFNlbmQgYW4gaWRsZSBjb21tYW5kIHRvIHRoZSBjaGlwIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLgorICoKKyAqIENvbW1hbmQgY29tcGxldGlvbiBpcyBwb2xsZWQgZm9yIG9uY2UgcGVyIG1pY3Jvc2Vjb25kLgorICoKKyAqIFRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYW55d2hlcmUgaW5jbHVkaW5nIGFuIGludGVycnVwdCBoYW5kbGVyLgorICogQnV0IHRoZSBmdW5jdGlvbiBpcyBub3QgcmUtZW50cmFudCwgc28gaXQgdXNlcyB0aGUgRHZjRW50ZXIvTGVhdmVDcml0aWNhbCgpCisgKiBmdW5jdGlvbnMgdG8gcHJldmVudCByZWVudHJhbmN5LgorICoKKyAqIFJldHVybiBWYWx1ZXM6CisgKiAgIEFEVl9UUlVFIC0gY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgKiAgIEFEVl9GQUxTRSAtIGNvbW1hbmQgZmFpbGVkCisgKiAgIEFEVl9FUlJPUiAtIGNvbW1hbmQgdGltZWQgb3V0CisgKi8KK1NUQVRJQyBpbnQKK0FkdlNlbmRJZGxlQ21kKEFEVl9EVkNfVkFSICphc2NfZHZjLAorICAgICAgICAgICAgICAgdXNob3J0IGlkbGVfY21kLAorICAgICAgICAgICAgICAgQURWX0RDTlQgaWRsZV9jbWRfcGFyYW1ldGVyKQoreworICAgIHVsb25nICAgICAgIGxhc3RfaW50X2xldmVsOworICAgIGludCAgICAgICAgIHJlc3VsdDsKKyAgICBBRFZfRENOVCAgICBpLCBqOworICAgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOworCisgICAgbGFzdF9pbnRfbGV2ZWwgPSBEdmNFbnRlckNyaXRpY2FsKCk7CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCisgICAgLyoKKyAgICAgKiBDbGVhciB0aGUgaWRsZSBjb21tYW5kIHN0YXR1cyB3aGljaCBpcyBzZXQgYnkgdGhlIG1pY3JvY29kZQorICAgICAqIHRvIGEgbm9uLXplcm8gdmFsdWUgdG8gaW5kaWNhdGUgd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQuCisgICAgICogVGhlIG5vbi16ZXJvIHJlc3VsdCBpcyBvbmUgb2YgdGhlIElETEVfQ01EX1NUQVRVU18qIHZhbHVlcworICAgICAqIGRlZmluZWQgaW4gYV9hZHZsaWIuaC4KKyAgICAgKi8KKyAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfU1RBVFVTLCAodXNob3J0KSAwKTsKKworICAgIC8qCisgICAgICogV3JpdGUgdGhlIGlkbGUgY29tbWFuZCB2YWx1ZSBhZnRlciB0aGUgaWRsZSBjb21tYW5kIHBhcmFtZXRlcgorICAgICAqIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbi4gSWYgdGhlIG9yZGVyIGlzIG5vdAorICAgICAqIGZvbGxvd2VkLCB0aGUgbWljcm9jb2RlIG1heSBwcm9jZXNzIHRoZSBpZGxlIGNvbW1hbmQgYmVmb3JlIHRoZQorICAgICAqIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gTFJBTS4KKyAgICAgKi8KKyAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lETEVfQ01EX1BBUkFNRVRFUiwKKyAgICAgICAgY3B1X3RvX2xlMzIoaWRsZV9jbWRfcGFyYW1ldGVyKSk7CisgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0lETEVfQ01ELCBpZGxlX2NtZCk7CisKKyAgICAvKgorICAgICAqIFRpY2tsZSB0aGUgUklTQyB0byB0ZWxsIGl0IHRvIHByb2Nlc3MgdGhlIGlkbGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsIEFEVl9USUNLTEVfQik7CisgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgdGhlIHRpY2tsZSB2YWx1ZS4gSW4gdGhlIEFTQy0zNTUwIHRoZSBSSVNDIGZsYWcKKyAgICAgICAgICogY29tbWFuZCAnY2xyX3RpY2tsZV9iJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAorICAgICAgICAgKiB2YWx1ZSBpcyBjbGVhcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgdXAgdG8gMTAwIG1pbGxpc2Vjb25kIGZvciB0aGUgaWRsZSBjb21tYW5kIHRvIHRpbWVvdXQuICovCisgICAgZm9yIChpID0gMDsgaSA8IFNDU0lfV0FJVF8xMDBfTVNFQzsgaSsrKQorICAgIHsKKyAgICAgICAgLyogUG9sbCBvbmNlIGVhY2ggbWljcm9zZWNvbmQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNDU0lfVVNfUEVSX01TRUM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfU1RBVFVTLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEdmNEZWxheU1pY3JvU2Vjb25kKGFzY19kdmMsICh1c2hvcnQpIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQVNDX0FTU0VSVCgwKTsgLyogVGhlIGlkbGUgY29tbWFuZCBzaG91bGQgbmV2ZXIgdGltZW91dC4gKi8KKyAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKyAgICByZXR1cm4gQURWX0VSUk9SOworfQorCisvKgorICogSW5xdWlyeSBJbmZvcm1hdGlvbiBCeXRlIDcgSGFuZGxpbmcKKyAqCisgKiBIYW5kbGUgU0NTSSBJbnF1aXJ5IENvbW1hbmQgaW5mb3JtYXRpb24gZm9yIGEgZGV2aWNlIGJ5IHNldHRpbmcKKyAqIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIHRoYXQgYWZmZWN0IFdEVFIsIFNEVFIsIGFuZCBUYWcKKyAqIFF1ZXVpbmcuCisgKi8KK1NUQVRJQyB2b2lkCitBZHZJbnF1aXJ5SGFuZGxpbmcoCisgICAgQURWX0RWQ19WQVIgICAgICAgICAgICAgICAgICphc2NfZHZjLAorICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgICAgICAgICAqc2NzaXEpCit7CisgICAgQWR2UG9ydEFkZHIgICAgICAgICAgICAgICAgIGlvcF9iYXNlOworICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICAgICB0aWQ7CisgICAgQURWX1NDU0lfSU5RVUlSWSAgICAgICAgICAgICppbnE7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIHRpZG1hc2s7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIGNmZ193b3JkOworCisgICAgLyoKKyAgICAgKiBBZHZJbnF1aXJ5SGFuZGxpbmcoKSByZXF1aXJlcyB1cCB0byBJTlFVSVJZIGluZm9ybWF0aW9uIEJ5dGUgNworICAgICAqIHRvIGJlIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIElmIGxlc3MgdGhhbiA4IGJ5dGVzIG9mIElOUVVJUlkgaW5mb3JtYXRpb24gd2VyZSByZXF1ZXN0ZWQgb3IgbGVzcworICAgICAqIHRoYW4gOCBieXRlcyB3ZXJlIHRyYW5zZmVycmVkLCB0aGVuIHJldHVybi4gY2RiWzRdIGlzIHRoZSByZXF1ZXN0CisgICAgICogbGVuZ3RoIGFuZCB0aGUgQURWX1NDU0lfUkVRX1EgJ2RhdGFfY250JyBmaWVsZCBpcyBzZXQgYnkgdGhlCisgICAgICogbWljcm9jb2RlIHRvIHRoZSB0cmFuc2ZlciByZXNpZHVhbCBjb3VudC4KKyAgICAgKi8KKworICAgIGlmIChzY3NpcS0+Y2RiWzRdIDwgOCB8fAorICAgICAgICAoc2NzaXEtPmNkYls0XSAtIGxlMzJfdG9fY3B1KHNjc2lxLT5kYXRhX2NudCkpIDwgOCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworICAgIHRpZCA9IHNjc2lxLT50YXJnZXRfaWQ7CisKKyAgICBpbnEgPSAoQURWX1NDU0lfSU5RVUlSWSAqKSBzY3NpcS0+dmRhdGFfYWRkcjsKKworICAgIC8qCisgICAgICogV0RUUiwgU0RUUiwgYW5kIFRhZyBRdWV1aW5nIGNhbm5vdCBiZSBlbmFibGVkIGZvciBvbGQgZGV2aWNlcy4KKyAgICAgKi8KKyAgICBpZiAoQURWX0lOUV9SRVNQT05TRV9GTVQoaW5xKSA8IDIgJiYgQURWX0lOUV9BTlNJX1ZFUihpbnEpIDwgMikKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIElOUVVJUlkgQnl0ZSA3IEhhbmRsaW5nCisgICAgICAgICAqCisgICAgICAgICAqIFVzZSBhIGRldmljZSdzIElOUVVJUlkgYnl0ZSA3IHRvIGRldGVybWluZSB3aGV0aGVyIGl0CisgICAgICAgICAqIHN1cHBvcnRzIFdEVFIsIFNEVFIsIGFuZCBUYWcgUXVldWluZy4gSWYgdGhlIGZlYXR1cmUKKyAgICAgICAgICogaXMgZW5hYmxlZCBpbiB0aGUgRUVQUk9NIGFuZCB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZQorICAgICAgICAgKiBmZWF0dXJlLCB0aGVuIGVuYWJsZSBpdCBpbiB0aGUgbWljcm9jb2RlLgorICAgICAgICAgKi8KKworICAgICAgICB0aWRtYXNrID0gQURWX1RJRF9UT19USURNQVNLKHRpZCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2lkZSBUcmFuc2ZlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIEVFUFJPTSBlbmFibGVkIFdEVFIgZm9yIHRoZSBkZXZpY2UgYW5kIHRoZSBkZXZpY2UKKyAgICAgICAgICogc3VwcG9ydHMgd2lkZSBidXMgKDE2IGJpdCkgdHJhbnNmZXJzLCB0aGVuIHR1cm4gb24gdGhlCisgICAgICAgICAqIGRldmljZSdzICd3ZHRyX2FibGUnIGJpdCBhbmQgd3JpdGUgdGhlIG5ldyB2YWx1ZSB0byB0aGUKKyAgICAgICAgICogbWljcm9jb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChhc2NfZHZjLT53ZHRyX2FibGUgJiB0aWRtYXNrKSAmJiBBRFZfSU5RX1dJREUxNihpbnEpKQorICAgICAgICB7CisgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIGlmICgoY2ZnX3dvcmQgJiB0aWRtYXNrKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgY2ZnX3dvcmQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDbGVhciB0aGUgbWljcm9jb2RlICJTRFRSIG5lZ290aWF0aW9uIiBhbmQgIldEVFIKKyAgICAgICAgICAgICAgICAgKiBuZWdvdGlhdGlvbiIgZG9uZSBpbmRpY2F0b3JzIGZvciB0aGUgdGFyZ2V0IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgICogaXQgdG8gbmVnb3RpYXRlIHdpdGggdGhlIG5ldyBzZXR0aW5nIHNldCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgKiBXRFRSIHdoZW4gYWNjZXB0ZWQgY2F1c2VzIHRoZSB0YXJnZXQgdG8gZW50ZXIKKyAgICAgICAgICAgICAgICAgKiBhc3luY2hyb25vdXMgbW9kZSwgc28gU0RUUiBtdXN0IGJlIG5lZ290aWF0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9ET05FLCBjZmdfd29yZCk7CisgICAgICAgICAgICAgICAgY2ZnX3dvcmQgJj0gfnRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfRE9ORSwgY2ZnX3dvcmQpOworICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfRE9ORSwgY2ZnX3dvcmQpOworICAgICAgICAgICAgICAgIGNmZ193b3JkICY9IH50aWRtYXNrOworICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0RPTkUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN5bmNocm9ub3VzIFRyYW5zZmVycworICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGUgRUVQUk9NIGVuYWJsZWQgU0RUUiBmb3IgdGhlIGRldmljZSBhbmQgdGhlIGRldmljZQorICAgICAgICAgKiBzdXBwb3J0cyBzeW5jaHJvbm91cyB0cmFuc2ZlcnMsIHRoZW4gdHVybiBvbiB0aGUgZGV2aWNlJ3MKKyAgICAgICAgICogJ3NkdHJfYWJsZScgYml0LiBXcml0ZSB0aGUgbmV3IHZhbHVlIHRvIHRoZSBtaWNyb2NvZGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGFzY19kdmMtPnNkdHJfYWJsZSAmIHRpZG1hc2spICYmIEFEVl9JTlFfU1lOQyhpbnEpKQorICAgICAgICB7CisgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIGlmICgoY2ZnX3dvcmQgJiB0aWRtYXNrKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgY2ZnX3dvcmQpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDbGVhciB0aGUgbWljcm9jb2RlICJTRFRSIG5lZ290aWF0aW9uIiBkb25lIGluZGljYXRvcgorICAgICAgICAgICAgICAgICAqIGZvciB0aGUgdGFyZ2V0IHRvIGNhdXNlIGl0IHRvIG5lZ290aWF0ZSB3aXRoIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgKiBzZXR0aW5nIHNldCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgICAgICBjZmdfd29yZCAmPSB+dGlkbWFzazsKKyAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9ET05FLCBjZmdfd29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIElucXVpcnkgZGF0YSBpbmNsdWRlZCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBTUEktMworICAgICAgICAgKiBDbG9ja2luZyBmaWVsZCwgdGhlbiBjaGVjayBpZiBEVCBtb2RlIGlzIHN1cHBvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCAmJgorICAgICAgICAgICAgKHNjc2lxLT5jZGJbNF0gPj0gNTcgfHwKKyAgICAgICAgICAgIChzY3NpcS0+Y2RiWzRdIC0gbGUzMl90b19jcHUoc2NzaXEtPmRhdGFfY250KSkgPj0gNTcpKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUFBSIChQYXJhbGxlbCBQcm90b2NvbCBSZXF1ZXN0KSBDYXBhYmxlCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSWYgdGhlIGRldmljZSBzdXBwb3J0cyBEVCBtb2RlLCB0aGVuIGl0IG11c3QgYmUgUFBSIGNhcGFibGUuCisgICAgICAgICAgICAgKiBUaGUgUFBSIG1lc3NhZ2Ugd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBTRFRSIGFuZCBXRFRSCisgICAgICAgICAgICAgKiBtZXNzYWdlcyB0byBuZWdvdGlhdGUgc3luY2hyb25vdXMgc3BlZWQgYW5kIG9mZnNldCwgdHJhbnNmZXIKKyAgICAgICAgICAgICAqIHdpZHRoLCBhbmQgcHJvdG9jb2wgb3B0aW9ucy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEFEVl9JTlFfQ0xPQ0tJTkcoaW5xKSAmIEFEVl9JTlFfQ0xPQ0tJTkdfRFRfT05MWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgYXNjX2R2Yy0+cHByX2FibGUpOworICAgICAgICAgICAgICAgIGFzY19kdmMtPnBwcl9hYmxlIHw9IHRpZG1hc2s7CisgICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBhc2NfZHZjLT5wcHJfYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgRUVQUk9NIGVuYWJsZWQgVGFnIFF1ZXVpbmcgZm9yIHRoZSBkZXZpY2UgYW5kIHRoZQorICAgICAgICAgKiBkZXZpY2Ugc3VwcG9ydHMgVGFnIFF1ZXVlaW5nLCB0aGVuIHR1cm4gb24gdGhlIGRldmljZSdzCisgICAgICAgICAqICd0YWdxbmdfZW5hYmxlJyBiaXQgaW4gdGhlIG1pY3JvY29kZSBhbmQgc2V0IHRoZSBtaWNyb2NvZGUKKyAgICAgICAgICogbWF4aW11bSBjb21tYW5kIGNvdW50IHRvIHRoZSBBRFZfRFZDX1ZBUiAnbWF4X2R2Y19xbmcnCisgICAgICAgICAqIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBUYWcgUXVldWluZyBpcyBkaXNhYmxlZCBmb3IgdGhlIEJJT1Mgd2hpY2ggcnVucyBpbiBwb2xsZWQKKyAgICAgICAgICogbW9kZSBhbmQgd291bGQgc2VlIG5vIGJlbmVmaXQgZnJvbSBUYWcgUXVldWluZy4gQWxzbyBieQorICAgICAgICAgKiBkaXNhYmxpbmcgVGFnIFF1ZXVpbmcgaW4gdGhlIEJJT1MgZGV2aWNlcyB3aXRoIFRhZyBRdWV1aW5nCisgICAgICAgICAqIGJ1Z3Mgd2lsbCBhdCBsZWFzdCB3b3JrIHdpdGggdGhlIEJJT1MuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGFzY19kdmMtPnRhZ3FuZ19hYmxlICYgdGlkbWFzaykgJiYgQURWX0lOUV9DTURfUVVFVUUoaW5xKSkKKyAgICAgICAgeworICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIGNmZ193b3JkKTsKKyAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7CisgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIGNmZ193b3JkKTsKKworICAgICAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorICAgICAgICAgICAgICAgIGFzY19kdmMtPm1heF9kdmNfcW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5oIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0YmRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBhZHZhbnN5cy5oIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIEFkdmFuU3lzIFNDU0kgQWRhcHRlcnMKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDAgQWR2YW5jZWQgU3lzdGVtIFByb2R1Y3RzLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDb25uZWN0Q29tIFNvbHV0aW9ucywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIEFzIG9mIE1hcmNoIDgsIDIwMDAgQWR2YW5jZWQgU3lzdGVtIFByb2R1Y3RzLCBJbmMuIChBZHZhblN5cykKKyAqIGNoYW5nZWQgaXRzIG5hbWUgdG8gQ29ubmVjdENvbSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKi8KKworI2lmbmRlZiBfQURWQU5TWVNfSAorI2RlZmluZSBfQURWQU5TWVNfSAorCisvKgorICogU2NzaV9Ib3N0X1RlbXBsYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKi8KK2ludCBhZHZhbnN5c19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKK2ludCBhZHZhbnN5c19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICphZHZhbnN5c19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgYWR2YW5zeXNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwgdm9pZCAoKiBkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK2ludCBhZHZhbnN5c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworaW50IGFkdmFuc3lzX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQlzZWN0b3JfdCwgaW50W10pOworc3RhdGljIGludCBhZHZhbnN5c19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICopOworCisvKiBpbml0L21haW4uYyBzZXR1cCBmdW5jdGlvbiAqLwordm9pZCBhZHZhbnN5c19zZXR1cChjaGFyICosIGludCAqKTsKKworI2VuZGlmIC8qIF9BRFZBTlNZU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I4ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwpAQCAtMCwwICsxLDM5ODIgQEAKKy8qIGFoYTE1MnguYyAtLSBBZGFwdGVjIEFIQS0xNTJ4IGRyaXZlcgorICogQXV0aG9yOiBK/HJnZW4gRS4gRmlzY2hlciwgZmlzY2hlckBub3JiaXQuZGUKKyAqIENvcHlyaWdodCAxOTkzLTIwMDQgSvxyZ2VuIEUuIEZpc2NoZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqICRJZDogYWhhMTUyeC5jLHYgMi43IDIwMDQvMDEvMjQgMTE6NDI6NTkgZmlzY2hlciBFeHAgJAorICoKKyAqICRMb2c6IGFoYTE1MnguYyx2ICQKKyAqIFJldmlzaW9uIDIuNyAgMjAwNC8wMS8yNCAxMTo0Mjo1OSAgZmlzY2hlcgorICogLSBnYXRoZXIgY29kZSB0aGF0IGlzIG5vdCB1c2VkIGJ5IFBDTUNJQSBhdCB0aGUgZW5kCisgKiAtIG1vdmUgcmVxdWVzdF9yZWdpb24gZm9yICFQQ01DSUEgY2FzZSB0byBkZXRlY3Rpb24KKyAqIC0gbWlncmF0aW9uIHRvIG5ldyBzY3NpIGhvc3QgYXBpIChyZW1vdmUgbGVnYWN5IGNvZGUpCisgKiAtIGZyZWUgaG9zdCBzY3JpYmJsZSBiZWZvcmUgc2NzaV9kb25lCisgKiAtIGZpeCBlcnJvciBoYW5kbGluZworICogLSBvbmUgaXNhcG5wIGRldmljZSBhZGRlZCB0byBpZF90YWJsZQorICoKKyAqIFJldmlzaW9uIDIuNiAgMjAwMy8xMC8zMCAyMDo1Mjo0NyAgZmlzY2hlcgorICogLSBpbnRlcmZhY2VzIGNoYW5nZXMgZm9yIGtlcm5lbCAyLjYKKyAqIC0gYWhhMTUyeF9wcm9iZV9vbmUgaW50cm9kdWNlZCBmb3IgcGNtY2lhIHN0dWIKKyAqIC0gZml4ZWQgcG5wZGV2IGhhbmRsaW5nCisgKiAtIGluc3RlYWQgb2YgYWxsb2NhdGlvbiBhIG5ldyBvbmUsIHJldXNlIGNvbW1hbmQgZm9yIHJlcXVlc3Qgc2Vuc2UgYWZ0ZXIgY2hlY2sgY29uZGl0aW9uIGFuZCByZXNldAorICogLSBmaXhlcyByYWNlIGluIGlzX2NvbXBsZXRlCisgKgorICogUmV2aXNpb24gMi41ICAyMDAyLzA0LzE0IDExOjI0OjUzICBmaXNjaGVyCisgKiAtIGlzYXBucCBzdXBwb3J0CisgKiAtIGFib3J0IGZpeGVkCisgKiAtIDIuNSBzdXBwb3J0CisgKgorICogUmV2aXNpb24gMi40ICAyMDAwLzEyLzE2IDEyOjUzOjU2ICBmaXNjaGVyCisgKiAtIGFsbG93IFJFUVVFU1QgU0VOU0UgdG8gYmUgcXVldWVkCisgKiAtIGhhbmRsZSBzaGFyZWQgUENJIGludGVycnVwdHMKKyAqCisgKiBSZXZpc2lvbiAyLjMgIDIwMDAvMTEvMDQgMTY6NDA6MjYgIGZpc2NoZXIKKyAqIC0gaGFuZGxlIGRhdGEgb3ZlcnJ1bnMKKyAqIC0gZXh0ZW5kIHRpbWVvdXQgZm9yIGRhdGEgcGhhc2VzCisgKgorICogUmV2aXNpb24gMi4yICAyMDAwLzA4LzA4IDE5OjU0OjUzICBmaXNjaGVyCisgKiAtIG1pbm9yIGNoYW5nZXMKKyAqCisgKiBSZXZpc2lvbiAyLjEgIDIwMDAvMDUvMTcgMTY6MjM6MTcgIGZpc2NoZXIKKyAqIC0gc2lnbmF0dXJlIHVwZGF0ZQorICogLSBmaXggZm9yIGRhdGEgb3V0IHcvbyBzY2F0dGVyIGdhdGhlcgorICoKKyAqIFJldmlzaW9uIDIuMCAgMTk5OS8xMi8yNSAxNTowNzozMiAgZmlzY2hlcgorICogLSBpbnRlcnJ1cHQgcm91dGluZSBjb21wbGV0bHkgcmV3b3JrZWQKKyAqIC0gYmFzaWMgc3VwcG9ydCBmb3IgbmV3IGVoIGNvZGUKKyAqCisgKiBSZXZpc2lvbiAxLjIxICAxOTk5LzExLzEwIDIzOjQ2OjM2ICBmaXNjaGVyCisgKiAtIGRlZmF1bHQgdG8gc3luY2hyb25vdXMgb3BlcmF0aW9uCisgKiAtIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGZpeGVkCisgKiAtIGFkZGVkIHRpbWVvdXQgdG8gbG9vcHMKKyAqIC0gZGVidWdnaW5nIG91dHB1dCBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIHByb2NmcworICoKKyAqIFJldmlzaW9uIDEuMjAgIDE5OTkvMTEvMDcgMTg6Mzc6MzEgIGZpc2NoZXIKKyAqIC0gc3luY2hyb25vdXMgb3BlcmF0aW9uIHdvcmtzCisgKiAtIHJlc2lkIHN1cHBvcnQgZm9yIHNnIGRyaXZlcgorICoKKyAqIFJldmlzaW9uIDEuMTkgIDE5OTkvMTEvMDIgMjI6Mzk6NTkgIGZpc2NoZXIKKyAqIC0gbW92ZWQgbGVhZGluZyBjb21tZW50cyB0byBSRUFETUUuYWhhMTUyeAorICogLSBuZXcgYWRkaXRpb25hbCBtb2R1bGUgcGFyYW1ldGVycworICogLSB1cGRhdGVzIGZvciAyLjMKKyAqIC0gc3VwcG9ydCBmb3IgdGhlIFRyaXBhY2UgVEMxNTUwIGNvbnRyb2xsZXIKKyAqIC0gaW50ZXJydXB0IGhhbmRsaW5nIGNoYW5nZWQKKyAqCisgKiBSZXZpc2lvbiAxLjE4ICAxOTk2LzA5LzA3IDIwOjEwOjQwICBmaXNjaGVyCisgKiAtIGZpeGVkIGNhbl9xdWV1ZSBoYW5kbGluZyAobXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgd29ya2luZyBhZ2FpbikKKyAqCisgKiBSZXZpc2lvbiAxLjE3ICAxOTk2LzA4LzE3IDE2OjA1OjE0ICBmaXNjaGVyCisgKiAtIGJpb3NwYXJhbSBpbXByb3ZlZAorICogLSBpbnRlcnJ1cHQgdmVyaWZpY2F0aW9uCisgKiAtIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbgorICogLSBjbGVhbnVwcworICoKKyAqIFJldmlzaW9uIDEuMTYgIDE5OTYvMDYvMDkgMDA6MDQ6NTYgIHJvb3QKKyAqIC0gYWRkZWQgY29uZmlndXJhdGlvbiBzeW1ib2xzIGZvciBpbnNtb2QgKGFoYTE1MngvYWhhMTUyeDEpCisgKgorICogUmV2aXNpb24gMS4xNSAgMTk5Ni8wNC8zMCAxNDo1MjowNiAgZmlzY2hlcgorICogLSBwcm9jIGluZm8gZml4ZWQKKyAqIC0gc3VwcG9ydCBmb3IgZXh0ZW5kZWQgdHJhbnNsYXRpb24gZm9yID4xR0IgZGlza3MKKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk2LzAxLzE3ICAxNToxMToyMCAgZmlzY2hlcgorICogLSBmaXhlZCBsb2NrdXAgaW4gTUVTU0FHRSBJTiBwaGFzZSBhZnRlciByZWNvbm5lY3Rpb24KKyAqCisgKiBSZXZpc2lvbiAxLjEzICAxOTk2LzAxLzA5ICAwMjoxNTo1MyAgZmlzY2hlcgorICogLSBzb21lIGNsZWFudXBzCisgKiAtIG1vdmVkIHJlcXVlc3RfaXJxIGJlaGluZCBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uCisgKiAgICh0byBhdm9pZCBzcHVyaW91cyBpbnRlcnJ1cHRzKQorICoKKyAqIFJldmlzaW9uIDEuMTIgIDE5OTUvMTIvMTYgIDEyOjI2OjA3ICBmaXNjaGVyCisgKiAtIGJhcnJpZXIoKXMgYWRkZWQKKyAqIC0gY29uZmlndXJhYmxlIFJFU0VUIGRlbGF5IGFkZGVkCisgKgorICogUmV2aXNpb24gMS4xMSAgMTk5NS8xMi8wNiAgMjE6MTg6MzUgIGZpc2NoZXIKKyAqIC0gc29tZSBtaW5vciB1cGRhdGVzCisgKgorICogUmV2aXNpb24gMS4xMCAgMTk5NS8wNy8yMiAgMTk6MTg6NDUgIGZpc2NoZXIKKyAqIC0gc3VwcG9ydCBmb3IgMiBjb250cm9sbGVycworICogLSBzdGFydGVkIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzIChub3Qgd29ya2luZyB5ZXQpCisgKgorICogUmV2aXNpb24gMS45ICAxOTk1LzAzLzE4ICAwOToyMDoyNCAgcm9vdAorICogLSBwYXRjaGVzIGZvciBQQ01DSUEgYW5kIG1vZHVsZXMKKyAqCisgKiBSZXZpc2lvbiAxLjggIDE5OTUvMDEvMjEgIDIyOjA3OjE5ICByb290CisgKiAtIHNuYXJmX3JlZ2lvbiA9PiByZXF1ZXN0X3JlZ2lvbgorICogLSBhaGExNTJ4X2ludHIgaW50ZXJmYWNlIGNoYW5nZQorICoKKyAqIFJldmlzaW9uIDEuNyAgMTk5NS8wMS8wMiAgMjM6MTk6MzYgIHJvb3QKKyAqIC0gdXBkYXRlZCBDT01NQU5EX1NJWkUgdG8gY21kX2xlbgorICogLSBjaGFuZ2VkIHN0aSgpIHRvIHJlc3RvcmVfZmxhZ3MoKQorICogLSBmaXhlZCBzb21lICNpZmRlZiB3aGljaCBnZW5lcmF0ZWQgd2FybmluZ3MKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDE5OTQvMTEvMjQgIDIwOjM1OjI3ICByb290CisgKiAtIHByb2JsZW0gd2l0aCBvZGQgbnVtYmVyIG9mIGJ5dGVzIGluIGZpZm8gZml4ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTQvMTAvMzAgIDE0OjM5OjU2ICByb290CisgKiAtIGFib3J0IGNvZGUgZml4ZWQKKyAqIC0gZGVidWdnaW5nIGltcHJvdmVkCisgKgorICogUmV2aXNpb24gMS40ICAxOTk0LzA5LzEyICAxMTozMzowMSAgcm9vdAorICogLSBpcnFhY3Rpb24gdG8gcmVxdWVzdF9pcnEKKyAqIC0gYWJvcnRpb24gdXBkYXRlZAorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NC8wOC8wNCAgMTM6NTM6MDUgIHJvb3QKKyAqIC0gdXBkYXRlcyBmb3IgbWlkLWxldmVsLWRyaXZlciBjaGFuZ2VzCisgKiAtIGFjY2VwdCB1bmV4cGVjdGVkIEJVU0ZSRUUgcGhhc2UgYXMgZXJyb3IgY29uZGl0aW9uCisgKiAtIHBhcml0eSBjaGVjayBub3cgY29uZmlndXJhYmxlCisgKgorICogUmV2aXNpb24gMS4yICAxOTk0LzA3LzAzICAxMjo1NjozNiAgcm9vdAorICogLSBjbGVhbmVkIHVwIGRlYnVnZ2luZyBjb2RlCisgKiAtIG1vcmUgdHdlYWtpbmcgb24gcmVzZXQgZGVsYXlzCisgKiAtIHVwZGF0ZWQgYWJvcnQvcmVzZXQgY29kZSAocHJldHR5IHVudGVzdGVkLi4uKQorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wNS8yOCAgMjE6MTg6NDkgIHJvb3QKKyAqIC0gdXBkYXRlIGZvciBtaWQtbGV2ZWwgaW50ZXJmYWNlIGNoYW5nZSAoYWJvcnQtcmVzZXQpCisgKiAtIGRlbGF5cyBhZnRlciByZXNldHMgYWRqdXN0ZWQgZm9yIHNvbWUgc2xvdyBkZXZpY2VzCisgKgorICogUmV2aXNpb24gMS4wICAxOTk0LzAzLzI1ICAxMjo1MjowMCAgcm9vdAorICogLSBGaXhlZCAibW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQiIHByb2JsZW0KKyAqIC0gYWRkZWQgbmV3IEJJT1Mgc2lnbmF0dXJlcworICoKKyAqIFJldmlzaW9uIDAuMTAyICAxOTk0LzAxLzMxICAyMDo0NDoxMiAgcm9vdAorICogLSBtaW5vciBjaGFuZ2VzIGluIGluc3cvb3V0c3cgaGFuZGxpbmcKKyAqCisgKiBSZXZpc2lvbiAwLjEwMSAgMTk5My8xMi8xMyAgMDE6MTY6MjcgIHJvb3QKKyAqIC0gZml4ZWQgU1RBVFVTIHBoYXNlIChub24tR09PRCBzdGF0aSB3ZXJlIGRyb3BwZWQgc29tZXRpbWVzOworICogICBmaXhlcyBwcm9ibGVtcyB3aXRoIENELVJPTSBzZWN0b3Igc2l6ZSBkZXRlY3Rpb24gJiBtZWRpYSBjaGFuZ2UpCisgKgorICogUmV2aXNpb24gMC4xMDAgIDE5OTMvMTIvMTAgIDE2OjU4OjQ3ICByb290CisgKiAtIGZpeCBmb3IgdW5zdWNjZXNzZnVsIHNlbGVjdGlvbnMgaW4gY2FzZSBvZiBub24tY29udGludW91cyBpZCBhc3NpZ25tZW50cworICogICBvbiB0aGUgc2NzaSBidXMuCisgKgorICogUmV2aXNpb24gMC45OSAgMTk5My8xMC8yNCAgMTY6MTk6NTkgIHJvb3QKKyAqIC0gZml4ZWQgREFUQSBJTiAocmFyZSByZWFkIGVycm9ycyBnb25lKQorICoKKyAqIFJldmlzaW9uIDAuOTggIDE5OTMvMTAvMTcgIDEyOjU0OjQ0ICByb290CisgKiAtIGZpeGVkIHNvbWUgcmVjZW50IGZpeGVzIChzaGFtZSBvbiBtZSkKKyAqIC0gbW92ZWQgaW5pdGlhbGl6YXRpb24gb2Ygc2NyYXRjaCBhcmVhIHRvIGFoYTE1MnhfcXVldWUKKyAqCisgKiBSZXZpc2lvbiAwLjk3ICAxOTkzLzEwLzA5ICAxODo1Mzo1MyAgcm9vdAorICogLSBEQVRBIElOIGZpeGVkLiBSYXJlbHkgbGVmdCBkYXRhIGluIHRoZSBmaWZvLgorICoKKyAqIFJldmlzaW9uIDAuOTYgIDE5OTMvMTAvMDMgIDAwOjUzOjU5ICByb290CisgKiAtIG1pbm9yIGNoYW5nZXMgb24gREFUQSBJTgorICoKKyAqIFJldmlzaW9uIDAuOTUgIDE5OTMvMDkvMjQgIDEwOjM2OjAxICByb290CisgKiAtIGNoYW5nZSBoYW5kbGluZyBvZiBNU0dJIGFmdGVyIHJlc2VsZWN0aW9uCisgKiAtIGZpeGVkIHN0aS9jbGkKKyAqIC0gbWlub3IgY2hhbmdlcworICoKKyAqIFJldmlzaW9uIDAuOTQgIDE5OTMvMDkvMTggIDE0OjA4OjIyICByb290CisgKiAtIGZpeGVkIGJ1ZyBpbiBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kIGNvZGUKKyAqIC0gY2hhbmdlZCBkZXRlY3Rpb24KKyAqIC0gc3VwcG9ydCBmb3Iga2VybmVsIGNvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uCisgKiAtIHJlc2V0IGNvcnJlY3RlZAorICogLSBjaGFuZ2VkIG1lc3NhZ2UgaGFuZGxpbmcKKyAqCisgKiBSZXZpc2lvbiAwLjkzICAxOTkzLzA5LzE1ICAyMDo0MToxOSAgcm9vdAorICogLSBmaXhlZCBidWdzIHdpdGggbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqCisgKiBSZXZpc2lvbiAwLjkyICAxOTkzLzA5LzEzICAwMjo0NjozMyAgcm9vdAorICogLSBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcyB3b3JrIChubyBwcm9ibGVtcyB3aXRoIElCTSBkcml2ZSkKKyAqCisgKiBSZXZpc2lvbiAwLjkxICAxOTkzLzA5LzEyICAyMDo1MTo0NiAgcm9vdAorICogYWRkZWQgbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMKKyAqIChzb21lIHByb2JsZW0gd2l0aCB0aGlzICQlJj8gSUJNIGRldmljZSByZW1haW4pCisgKgorICogUmV2aXNpb24gMC45ICAxOTkzLzA5LzEyICAxMToxMToyMiAgcm9vdAorICogLSBjb3JyZWN0ZWQgYXV0by1jb25maWd1cmF0aW9uCisgKiAtIGNoYW5nZWQgdGhlIGF1dG8tY29uZmlndXJhdGlvbiAoYWRkZWQgc29tZSAnI2RlZmluZSdzKQorICogLSBhZGRlZCBzdXBwb3J0IGZvciBkaXMtL3JlY29ubmVjdGlvbgorICoKKyAqIFJldmlzaW9uIDAuOCAgMTk5My8wOS8wNiAgMjM6MDk6MzkgIHJvb3QKKyAqIC0gYWRkZWQgc3VwcG9ydCBmb3IgdGhlIGRyaXZlIGFjdGl2aXR5IGxpZ2h0CisgKiAtIG1pbm9yIGNoYW5nZXMKKyAqCisgKiBSZXZpc2lvbiAwLjcgIDE5OTMvMDkvMDUgIDE0OjMwOjE1ICByb290CisgKiAtIGltcHJvdmVkIHBoYXNlIGRldGVjdGlvbgorICogLSBub3cgdXNpbmcgdGhlIG5ldyBzbmFyZl9yZWdpb24gY29kZSBvZiAwLjk5cGwxMworICoKKyAqIFJldmlzaW9uIDAuNiAgMTk5My8wOS8wMiAgMTE6MDE6MzggIHJvb3QKKyAqIGZpcnN0IHB1YmxpYyByZWxlYXNlOyBhZGRlZCBzb21lIHNpZ25hdHVyZXMgYW5kIGJpb3NwYXJhbSgpCisgKgorICogUmV2aXNpb24gMC41ICAxOTkzLzA4LzMwICAxMDoyMzozMCAgcm9vdAorICogZml4ZWQgdGltaW5nIHByb2JsZW1zIHdpdGggbXkgSUJNIGRyaXZlCisgKgorICogUmV2aXNpb24gMC40ICAxOTkzLzA4LzI5ICAxNDowNjo1MiAgcm9vdAorICogZml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIHRpbWVvdXRzIGR1ZSBpbmNvbXBsZXRlIGNvbW1hbmRzCisgKgorICogUmV2aXNpb24gMC4zICAxOTkzLzA4LzI4ICAxNTo1NTowMyAgcm9vdAorICogd3JpdGluZyBkYXRhIHdvcmtzIHRvby4gIG1vdW50ZWQgYW5kIHdvcmtlZCBvbiBhIGRvcyBwYXJ0aXRpb24KKyAqCisgKiBSZXZpc2lvbiAwLjIgIDE5OTMvMDgvMjcgIDIyOjQyOjA3ICByb290CisgKiByZWFkaW5nIGRhdGEgd29ya3MuICBNb3VudGVkIGEgbXNkb3MgcGFydGl0aW9uLgorICoKKyAqIFJldmlzaW9uIDAuMSAgMTk5My8wOC8yNSAgMTM6Mzg6MzAgIHJvb3QKKyAqIGZpcnN0ICJkYW1uIHRoaW5nIGRvZXNuJ3Qgd29yayIgdmVyc2lvbgorICoKKyAqIFJldmlzaW9uIDAuMCAgMTk5My8wOC8xNCAgMTk6NTQ6MjUgIHJvb3QKKyAqIGVtcHR5IGZ1bmN0aW9uIGJvZGllczsgZGV0ZWN0KCkgd29ya3MuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIAorIHNlZSBEb2N1bWVudGF0aW9uL3Njc2kvYWhhMTUyeC50eHQgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiYWhhMTUyeC5oIgorCisKKy8qIERFRklORVMgKi8KKworLyogRm9yIFBDTUNJQSBjYXJkcywgYWx3YXlzIHVzZSBBVVRPQ09ORiAqLworI2lmIGRlZmluZWQoUENNQ0lBKSB8fCBkZWZpbmVkKE1PRFVMRSkKKyNpZiAhZGVmaW5lZChBVVRPQ09ORikKKyNkZWZpbmUgQVVUT0NPTkYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChBVVRPQ09ORikgJiYgIWRlZmluZWQoU0VUVVAwKQorI2Vycm9yIGRlZmluZSBBVVRPQ09ORiBvciBTRVRVUDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorI2RlZmluZSBERUJVR19ERUZBVUxUIGRlYnVnX2VoCisKKyNkZWZpbmUgRFBSSU5USyh3aGVuLG1zZ3MuLi4pIFwKKwlkbyB7IGlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiAod2hlbikpIHByaW50ayhtc2dzKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lIERPX0xPQ0soZmxhZ3MpCVwKKwlkbyB7IFwKKwkJaWYoc3Bpbl9pc19sb2NrZWQoJlFMT0NLKSkgeyBcCisJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgIiglczolZCkgYWxyZWFkeSBsb2NrZWQgYXQgJXM6JWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIFFMT0NLRVIsIFFMT0NLRVJMKTsgXAorCQl9IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSBsb2NraW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmUUxPQ0ssZmxhZ3MpOyBcCisJCURQUklOVEsoZGVidWdfbG9ja3MsIERFQlVHX0xFQUQgIiglczolZCkgbG9ja2VkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCQlRTE9DS0VSPV9fRlVOQ1RJT05fXzsgXAorCQlRTE9DS0VSTD1fX0xJTkVfXzsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBET19VTkxPQ0soZmxhZ3MpCVwKKwlkbyB7IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSB1bmxvY2tpbmcgKGxvY2tlZCBhdCAlczolZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIFFMT0NLRVIsIFFMT0NLRVJMKTsgXAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZRTE9DSyxmbGFncyk7IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSB1bmxvY2tlZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwkJUUxPQ0tFUj0iKG5vdCBsb2NrZWQpIjsgXAorCQlRTE9DS0VSTD0wOyBcCisJfSB3aGlsZSgwKQorCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKHdoZW4sbXNncy4uLikKKyNkZWZpbmUJRE9fTE9DSyhmbGFncykJCXNwaW5fbG9ja19pcnFzYXZlKCZRTE9DSyxmbGFncykKKyNkZWZpbmUJRE9fVU5MT0NLKGZsYWdzKQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZRTE9DSyxmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIExFQUQJCSIoc2NzaSVkOiVkOiVkKSAiCisjZGVmaW5lIFdBUk5fTEVBRAlLRVJOX1dBUk5JTkcJTEVBRAorI2RlZmluZSBJTkZPX0xFQUQJS0VSTl9JTkZPCUxFQUQKKyNkZWZpbmUgTk9URV9MRUFECUtFUk5fTk9USUNFCUxFQUQKKyNkZWZpbmUgRVJSX0xFQUQJS0VSTl9FUlIJTEVBRAorI2RlZmluZSBERUJVR19MRUFECUtFUk5fREVCVUcJTEVBRAorI2RlZmluZSBDTURJTkZPKGNtZCkgXAorCQkJKGNtZCkgPyAoKGNtZCktPmRldmljZS0+aG9zdC0+aG9zdF9ubykgOiAtMSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtZCkgPyAoKGNtZCktPmRldmljZS0+aWQgJiAweDBmKSA6IC0xLCBcCisJCQkoY21kKSA/ICgoY21kKS0+ZGV2aWNlLT5sdW4gJiAweDA3KSA6IC0xCisKKyNkZWZpbmUgREVMQVlfREVGQVVMVCAxMDAwCisKKyNpZiBkZWZpbmVkKFBDTUNJQSkKKyNkZWZpbmUgSVJRX01JTiAwCisjZGVmaW5lIElSUV9NQVggMTYKKyNlbHNlCisjZGVmaW5lIElSUV9NSU4gOQorI2lmIGRlZmluZWQoX19QUEMpCisjZGVmaW5lIElSUV9NQVggKE5SX0lSUVMtMSkKKyNlbHNlCisjZGVmaW5lIElSUV9NQVggMTIKKyNlbmRpZgorI2VuZGlmCisKK2VudW0geworCW5vdF9pc3N1ZWQJPSAweDAwMDEsCS8qIGNvbW1hbmQgbm90IHlldCBpc3N1ZWQgKi8KKwlzZWxlY3RpbmcJPSAweDAwMDIsIAkvKiB0YXJnZXQgaXMgYmVlaW5nIHNlbGVjdGVkICovCisJaWRlbnRpZmllZAk9IDB4MDAwNCwJLyogSURFTlRJRlkgd2FzIHNlbnQgKi8KKwlkaXNjb25uZWN0ZWQJPSAweDAwMDgsCS8qIHRhcmdldCBkaXNjb25uZWN0ZWQgKi8KKwljb21wbGV0ZWQJPSAweDAwMTAsCS8qIHRhcmdldCBzZW50IENPTU1BTkQgQ09NUExFVEUgKi8gCisJYWJvcnRlZAkJPSAweDAwMjAsCS8qIEFCT1JUIHdhcyBzZW50ICovCisJcmVzZXR0ZWQJPSAweDAwNDAsCS8qIEJVUyBERVZJQ0UgUkVTRVQgd2FzIHNlbnQgKi8KKwlzcGlvcmR5CQk9IDB4MDA4MCwJLyogd2FpdGluZyBmb3IgU1BJT1JEWSB0byByYWlzZSAqLworCXN5bmNuZWcJCT0gMHgwMTAwLAkvKiBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCWFib3J0aW5nCT0gMHgwMjAwLAkvKiBBQk9SVCBpcyBwZW5kaW5nICovCisJcmVzZXR0aW5nCT0gMHgwNDAwLAkvKiBCVVMgREVWSUNFIFJFU0VUIGlzIHBlbmRpbmcgKi8KKwljaGVja19jb25kaXRpb24gPSAweDA4MDAsCS8qIHJlcXVlc3Rpbmcgc2Vuc2UgYWZ0ZXIgQ0hFQ0sgQ09ORElUSU9OICovCit9OworCitNT0RVTEVfQVVUSE9SKCJK/HJnZW4gRmlzY2hlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKEFIQTE1MlhfUkVWSUQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWYgIWRlZmluZWQoUENNQ0lBKQorI2lmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIGludCBpb1tdID0gezAsIDB9OworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywiYmFzZSBpbyBhZGRyZXNzIG9mIGNvbnRyb2xsZXIiKTsKKworc3RhdGljIGludCBpcnFbXSA9IHswLCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwiaW50ZXJydXB0IGZvciBjb250cm9sbGVyIik7CisKK3N0YXRpYyBpbnQgc2NzaWlkW10gPSB7NywgN307Cittb2R1bGVfcGFyYW1fYXJyYXkoc2NzaWlkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhzY3NpaWQsInNjc2kgaWQgb2YgY29udHJvbGxlciIpOworCitzdGF0aWMgaW50IHJlY29ubmVjdFtdID0gezEsIDF9OworbW9kdWxlX3BhcmFtX2FycmF5KHJlY29ubmVjdCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVjb25uZWN0LCJhbGxvdyB0YXJnZXRzIHRvIGRpc2Nvbm5lY3QiKTsKKworc3RhdGljIGludCBwYXJpdHlbXSA9IHsxLCAxfTsKK21vZHVsZV9wYXJhbV9hcnJheShwYXJpdHksIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcml0eSwidXNlIHNjc2kgcGFyaXR5Iik7CisKK3N0YXRpYyBpbnQgc3luY1tdID0gezEsIDF9OworbW9kdWxlX3BhcmFtX2FycmF5KHN5bmMsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHN5bmMsInVzZSBzeW5jaHJvbm91cyB0cmFuc2ZlcnMiKTsKKworc3RhdGljIGludCBkZWxheVtdID0ge0RFTEFZX0RFRkFVTFQsIERFTEFZX0RFRkFVTFR9OworbW9kdWxlX3BhcmFtX2FycmF5KGRlbGF5LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWxheSwic2NzaSByZXNldCBkZWxheSIpOworCitzdGF0aWMgaW50IGV4dHRyYW5zW10gPSB7MCwgMH07Cittb2R1bGVfcGFyYW1fYXJyYXkoZXh0dHJhbnMsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV4dHRyYW5zLCJ1c2UgZXh0ZW5kZWQgdHJhbnNsYXRpb24iKTsKKworI2lmICFkZWZpbmVkKEFIQTE1MlhfREVCVUcpCitzdGF0aWMgaW50IGFoYTE1MnhbXSA9IHswLCAxMSwgNywgMSwgMSwgMCwgREVMQVlfREVGQVVMVCwgMH07Cittb2R1bGVfcGFyYW1fYXJyYXkoYWhhMTUyeCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeCwgInBhcmFtZXRlcnMgZm9yIGZpcnN0IGNvbnRyb2xsZXIiKTsKKworc3RhdGljIGludCBhaGExNTJ4MVtdID0gezAsIDExLCA3LCAxLCAxLCAwLCBERUxBWV9ERUZBVUxULCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4MSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeDEsICJwYXJhbWV0ZXJzIGZvciBzZWNvbmQgY29udHJvbGxlciIpOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVidWdbXSA9IHtERUJVR19ERUZBVUxULCBERUJVR19ERUZBVUxUfTsKK21vZHVsZV9wYXJhbV9hcnJheShkZWJ1ZywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJmbGFncyBmb3IgZHJpdmVyIGRlYnVnZ2luZyIpOworCitzdGF0aWMgaW50IGFoYTE1MnhbXSAgID0gezAsIDExLCA3LCAxLCAxLCAxLCBERUxBWV9ERUZBVUxULCAwLCBERUJVR19ERUZBVUxUfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4LCAicGFyYW1ldGVycyBmb3IgZmlyc3QgY29udHJvbGxlciIpOworCitzdGF0aWMgaW50IGFoYTE1MngxW10gID0gezAsIDExLCA3LCAxLCAxLCAxLCBERUxBWV9ERUZBVUxULCAwLCBERUJVR19ERUZBVUxUfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4MSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeDEsICJwYXJhbWV0ZXJzIGZvciBzZWNvbmQgY29udHJvbGxlciIpOworI2VuZGlmIC8qICFkZWZpbmVkKEFIQTE1MlhfREVCVUcpICovCisjZW5kaWYgLyogTU9EVUxFICovCisKKyNpZmRlZiBfX0lTQVBOUF9fCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdQJyksIElTQVBOUF9GVU5DVElPTigweDE1MDUpLCAwIH0sCisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdBJywnRCcsJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTUzMCksIDAgfSwKKwl7IElTQVBOUF9ERVZJQ0VfU0lOR0xFX0VORCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpZF90YWJsZSk7CisjZW5kaWYgLyogSVNBUE5QICovCisKKyNlbmRpZiAvKiAhUENNQ0lBICovCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJlZF9jb3VudD0wOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmFoYTE1MnhfaG9zdFsyXTsKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYWhhMTUyeF9kcml2ZXJfdGVtcGxhdGU7CisKKy8qCisgKiBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGhvc3QKKyAqCisgKi8gCitlbnVtIGFoYTE1Mnhfc3RhdGUgeworCWlkbGU9MCwKKwl1bmtub3duLAorCXNlbGRvLAorCXNlbGRpLAorCXNlbHRvLAorCWJ1c2ZyZWUsCisJbXNnbywKKwljbWQsCisJbXNnaSwKKwlzdGF0dXMsCisJZGF0YWksCisJZGF0YW8sCisJcGFyZXJyLAorCXJzdGksCisJbWF4c3RhdGUKK307CisKKy8qCisgKiBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIG9mIHRoZSBob3N0CisgKgorICovCitzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSB7CisJU2NzaV9DbW5kICppc3N1ZV9TQzsKKwkJLyogcGVuZGluZyBjb21tYW5kcyB0byBpc3N1ZSAqLworCisJU2NzaV9DbW5kICpjdXJyZW50X1NDOworCQkvKiBjdXJyZW50IGNvbW1hbmQgb24gdGhlIGJ1cyAqLworCisJU2NzaV9DbW5kICpkaXNjb25uZWN0ZWRfU0M7CisJCS8qIGNvbW1hbmRzIHRoYXQgZGlzY29ubmVjdGVkICovCisKKwlTY3NpX0NtbmQgKmRvbmVfU0M7CisJCS8qIGNvbW1hbmQgdGhhdCB3YXMgY29tcGxldGVkICovCisKKwlzcGlubG9ja190IGxvY2s7CisJCS8qIGhvc3QgbG9jayAqLworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWNvbnN0IGNoYXIgKmxvY2tlcjsKKwkJLyogd2hpY2ggZnVuY3Rpb24gaGFzIHRoZSBsb2NrICovCisJaW50IGxvY2tlcmw7CS8qIHdoZXJlIGRpZCBpdCBnZXQgaXQgKi8KKworCWludCBkZWJ1ZzsJLyogY3VycmVudCBkZWJ1Z2dpbmcgc2V0dGluZyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwlpbnQgICAgICAgICAgIHRvdGFsX2NvbW1hbmRzOworCWludAkgICAgICBkaXNjb25uZWN0aW9uczsKKwlpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X2FueV9hY3Rpb247CisJaW50CSAgICAgIGJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZDsKKwlpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X25ld19jb21tYW5kOworCWludAkgICAgICBidXNmcmVlX3dpdGhvdXRfZG9uZV9jb21tYW5kOworCWludAkgICAgICBidXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uOworCWludCAgICAgICAgICAgY291bnRbbWF4c3RhdGVdOworCWludCAgICAgICAgICAgY291bnRfdHJhbnNbbWF4c3RhdGVdOworCXVuc2lnbmVkIGxvbmcgdGltZVttYXhzdGF0ZV07CisjZW5kaWYKKworCWludCBjb21tYW5kczsJCS8qIGN1cnJlbnQgbnVtYmVyIG9mIGNvbW1hbmRzICovCisKKwlpbnQgcmVjb25uZWN0OwkJLyogZGlzY29ubmVjdGlvbiBhbGxvd2VkICovCisJaW50IHBhcml0eTsJCS8qIHBhcml0eSBjaGVja2luZyBlbmFibGVkICovCisJaW50IHN5bmNocm9ub3VzOwkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlcmVzIGVuYWJsZWQgKi8KKwlpbnQgZGVsYXk7CQkvKiByZXNldCBvdXQgZGVsYXkgKi8KKwlpbnQgZXh0X3RyYW5zOwkJLyogZXh0ZW5kZWQgdHJhbnNsYXRpb24gZW5hYmxlZCAqLworCisJaW50IHN3aW50OyAJCS8qIHNvZnR3YXJlLWludGVycnVwdCB3YXMgZmlyZWQgZHVyaW5nIGRldGVjdCgpICovCisJaW50IHNlcnZpY2U7CQkvKiBiaCBuZWVkcyB0byBiZSBydW4gKi8KKwlpbnQgaW5faW50cjsJCS8qIGJoIGlzIHJ1bm5pbmcgKi8KKworCS8qIGN1cnJlbnQgc3RhdGUsCisJICAgcHJldmlvdXMgc3RhdGUsCisJICAgbGFzdCBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBjdXJyZW50IHN0YXRlICovCisJZW51bSBhaGExNTJ4X3N0YXRlIHN0YXRlLCBwcmV2c3RhdGUsIGxhc3RzdGF0ZTsKKworCWludCB0YXJnZXQ7CisJCS8qIHJlY29ubmVjdGluZyB0YXJnZXQgKi8KKworCXVuc2lnbmVkIGNoYXIgc3luY3JhdGVbOF07CisJCS8qIGN1cnJlbnQgc3luY2hyb25vdXMgdHJhbnNmZXIgYWdyZWVtZW50cyAqLworCisJdW5zaWduZWQgY2hhciBzeW5jbmVnWzhdOworCQkvKiAwOiBubyBuZWdvdGlhdGlvbjsKKwkJICogMTogbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3M7CisJCSAqIDI6IG5lZ290aWF0aW9uIGNvbXBsZXRlZAorCQkgKi8KKworCWludCBjbWRfaTsKKwkJLyogbnVtYmVyIG9mIHNlbnQgYnl0ZXMgb2YgY3VycmVudCBjb21tYW5kICovCisKKwlpbnQgbXNnaV9sZW47CisJCS8qIG51bWJlciBvZiByZWNlaXZlZCBtZXNzYWdlIGJ5dGVzICovCisJdW5zaWduZWQgY2hhciBtc2dpWzI1Nl07CisJCS8qIHJlY2VpdmVkIG1lc3NhZ2UgYnl0ZXMgKi8KKworCWludCBtc2dvX2ksIG1zZ29fbGVuOwkKKwkJLyogbnVtYmVyIG9mIHNlbnQgYnl0ZXMgYW5kIGxlbmd0aCBvZiBjdXJyZW50IG1lc3NhZ2VzICovCisJdW5zaWduZWQgY2hhciBtc2dvWzI1Nl07CisJCS8qIHBlbmRpbmcgbWVzc2FnZXMgKi8KKworCWludCBkYXRhX2xlbjsKKwkJLyogbnVtYmVyIG9mIHNlbnQvcmVjZWl2ZWQgYnl0ZXMgaW4gZGF0YXBoYXNlICovCisKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnQwOworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDE7CisKKyNpZmRlZiBfX0lTQVBOUF9fCisJc3RydWN0IHBucF9kZXYgKnBucGRldjsKKyNlbmRpZgorfTsKKworCisvKgorICogaG9zdCBzcGVjaWZpYyBjb21tYW5kIGV4dGVuc2lvbgorICoKKyAqLworc3RydWN0IGFoYTE1Mnhfc2NkYXRhIHsKKwlTY3NpX0NtbmQgKm5leHQ7CS8qIG5leHQgc2MgaW4gcXVldWUgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CS8qIHNlbWFwaG9yZSB0byBibG9jayBvbiAqLworfTsKKworCisvKiBhY2Nlc3MgbWFjcm9zIGZvciBob3N0ZGF0YSAqLworCisjZGVmaW5lIEhPU1REQVRBKHNocG50KQkJKChzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSAqKSAmc2hwbnQtPmhvc3RkYXRhKQorCisjZGVmaW5lIEhPU1ROTwkJCSgoc2hwbnQpLT5ob3N0X25vKQorCisjZGVmaW5lIENVUlJFTlRfU0MJCShIT1NUREFUQShzaHBudCktPmN1cnJlbnRfU0MpCisjZGVmaW5lIERPTkVfU0MJCQkoSE9TVERBVEEoc2hwbnQpLT5kb25lX1NDKQorI2RlZmluZSBJU1NVRV9TQwkJKEhPU1REQVRBKHNocG50KS0+aXNzdWVfU0MpCisjZGVmaW5lIERJU0NPTk5FQ1RFRF9TQwkJKEhPU1REQVRBKHNocG50KS0+ZGlzY29ubmVjdGVkX1NDKQorI2RlZmluZSBRTE9DSwkJCShIT1NUREFUQShzaHBudCktPmxvY2spCisjZGVmaW5lIFFMT0NLRVIJCQkoSE9TVERBVEEoc2hwbnQpLT5sb2NrZXIpCisjZGVmaW5lIFFMT0NLRVJMCQkoSE9TVERBVEEoc2hwbnQpLT5sb2NrZXJsKQorCisjZGVmaW5lIFNUQVRFCQkJKEhPU1REQVRBKHNocG50KS0+c3RhdGUpCisjZGVmaW5lIFBSRVZTVEFURQkJKEhPU1REQVRBKHNocG50KS0+cHJldnN0YXRlKQorI2RlZmluZSBMQVNUU1RBVEUJCShIT1NUREFUQShzaHBudCktPmxhc3RzdGF0ZSkKKworI2RlZmluZSBSRUNPTk5fVEFSR0VUCQkoSE9TVERBVEEoc2hwbnQpLT50YXJnZXQpCisKKyNkZWZpbmUgQ01EX0kJCQkoSE9TVERBVEEoc2hwbnQpLT5jbWRfaSkKKworI2RlZmluZSBNU0dPKGkpCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb1tpXSkKKyNkZWZpbmUgTVNHT19JCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb19pKQorI2RlZmluZSBNU0dPTEVOCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb19sZW4pCisjZGVmaW5lIEFERE1TR08oeCkJCShNU0dPTEVOPDI1NiA/ICh2b2lkKShNU0dPKE1TR09MRU4rKyk9eCkgOiBhaGExNTJ4X2Vycm9yKHNocG50LCJNU0dPIG92ZXJmbG93IikpCisKKyNkZWZpbmUgTVNHSShpKQkJCShIT1NUREFUQShzaHBudCktPm1zZ2lbaV0pCisjZGVmaW5lIE1TR0lMRU4JCQkoSE9TVERBVEEoc2hwbnQpLT5tc2dpX2xlbikKKyNkZWZpbmUgQURETVNHSSh4KQkJKE1TR0lMRU48MjU2ID8gKHZvaWQpKE1TR0koTVNHSUxFTisrKT14KSA6IGFoYTE1MnhfZXJyb3Ioc2hwbnQsIk1TR0kgb3ZlcmZsb3ciKSkKKworI2RlZmluZSBEQVRBX0xFTgkJKEhPU1REQVRBKHNocG50KS0+ZGF0YV9sZW4pCisKKyNkZWZpbmUgU1lOQ1JBVEUJCShIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW0NVUlJFTlRfU0MtPmRldmljZS0+aWRdKQorI2RlZmluZSBTWU5DTkVHCQkJKEhPU1REQVRBKHNocG50KS0+c3luY25lZ1tDVVJSRU5UX1NDLT5kZXZpY2UtPmlkXSkKKworI2RlZmluZSBERUxBWQkJCShIT1NUREFUQShzaHBudCktPmRlbGF5KQorI2RlZmluZSBFWFRfVFJBTlMJCShIT1NUREFUQShzaHBudCktPmV4dF90cmFucykKKyNkZWZpbmUgVEMxNTUwCQkJKEhPU1REQVRBKHNocG50KS0+dGMxNTUwKQorI2RlZmluZSBSRUNPTk5FQ1QJCShIT1NUREFUQShzaHBudCktPnJlY29ubmVjdCkKKyNkZWZpbmUgUEFSSVRZCQkJKEhPU1REQVRBKHNocG50KS0+cGFyaXR5KQorI2RlZmluZSBTWU5DSFJPTk9VUwkJKEhPU1REQVRBKHNocG50KS0+c3luY2hyb25vdXMpCisKKyNkZWZpbmUgSE9TVElPUE9SVDAJCShIT1NUREFUQShzaHBudCktPmlvX3BvcnQwKQorI2RlZmluZSBIT1NUSU9QT1JUMQkJKEhPU1REQVRBKHNocG50KS0+aW9fcG9ydDEpCisKKyNkZWZpbmUgU0NEQVRBKFNDcG50KQkJKChzdHJ1Y3QgYWhhMTUyeF9zY2RhdGEgKikgKFNDcG50KS0+aG9zdF9zY3JpYmJsZSkKKyNkZWZpbmUgU0NORVhUKFNDcG50KQkJU0NEQVRBKFNDcG50KS0+bmV4dAorI2RlZmluZSBTQ1NFTShTQ3BudCkJCVNDREFUQShTQ3BudCktPnNlbQorCisjZGVmaW5lIFNHX0FERFJFU1MoYnVmZmVyKQkoKGNoYXIgKikgKHBhZ2VfYWRkcmVzcygoYnVmZmVyKS0+cGFnZSkrKGJ1ZmZlciktPm9mZnNldCkpCisKKy8qIHN0YXRlIGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBzZWxkaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgc2VsZG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIHNlbHRvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBidXNmcmVlX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIG1zZ29faW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBtc2dvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBtc2dvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGNtZF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGNtZF9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgY21kX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGRhdGFpX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGF0YWlfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGRhdGFpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGRhdGFvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGF0YW9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGRhdGFvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIHN0YXR1c19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworCitzdGF0aWMgdm9pZCBtc2dpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBtc2dpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIHBhcmVycl9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgcnN0aV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworCitzdGF0aWMgdm9pZCBpc19jb21wbGV0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKKy8qCisgKiBkcml2ZXIgc3RhdGVzCisgKgorICovCitzdGF0aWMgc3RydWN0IHsKKwljaGFyCQkqbmFtZTsKKwl2b2lkCQkoKmluaXQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CisJdm9pZAkJKCpydW4pKHN0cnVjdCBTY3NpX0hvc3QgKik7CisJdm9pZAkJKCplbmQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CisJaW50CQlzcGlvOworfSBzdGF0ZXNbXSA9IHsKKwl7ICJpZGxlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAkJMH0sCisJeyAidW5rbm93biIsCU5VTEwsCQlOVUxMLAkJTlVMTCwJCTB9LAorCXsgInNlbGRvIiwJTlVMTCwJCXNlbGRvX3J1biwJTlVMTCwJCTB9LAorCXsgInNlbGRpIiwJTlVMTCwJCXNlbGRpX3J1biwJTlVMTCwJCTB9LAorCXsgInNlbHRvIiwJTlVMTCwJCXNlbHRvX3J1biwJTlVMTCwJCTB9LAorCXsgImJ1c2ZyZWUiLAlOVUxMLAkJYnVzZnJlZV9ydW4sCU5VTEwsCQkwfSwKKwl7ICJtc2dvIiwJbXNnb19pbml0LAltc2dvX3J1biwJbXNnb19lbmQsCTF9LAorCXsgImNtZCIsCWNtZF9pbml0LAljbWRfcnVuLAljbWRfZW5kLAkxfSwKKwl7ICJtc2dpIiwJTlVMTCwJCW1zZ2lfcnVuLAltc2dpX2VuZCwJMX0sCisJeyAic3RhdHVzIiwJTlVMTCwJCXN0YXR1c19ydW4sCU5VTEwsCQkxfSwKKwl7ICJkYXRhaSIsCWRhdGFpX2luaXQsCWRhdGFpX3J1biwJZGF0YWlfZW5kLAkwfSwKKwl7ICJkYXRhbyIsCWRhdGFvX2luaXQsCWRhdGFvX3J1biwJZGF0YW9fZW5kLAkwfSwKKwl7ICJwYXJlcnIiLAlOVUxMLAkJcGFyZXJyX3J1biwJTlVMTCwJCTB9LAorCXsgInJzdGkiLAlOVUxMLAkJcnN0aV9ydW4sCU5VTEwsCQkwfSwKK307CisKKy8qIHNldHVwICYgaW50ZXJydXB0ICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgcmVzZXRfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgYWhhMTUyeF9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqbXNnKTsKK3N0YXRpYyB2b2lkIGRvbmUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGludCBlcnJvcik7CisKKy8qIGRpYWdub3N0aWNzICovCitzdGF0aWMgdm9pZCBkaXNwX3BvcnRzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIHNob3dfY29tbWFuZChTY3NpX0NtbmQgKiBwdHIpOworc3RhdGljIHZvaWQgc2hvd19xdWV1ZXMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGlzcF9lbmludHIoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworCisKKy8qCisgKiAgcXVldWUgc2VydmljZXM6CisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKK3sKKwlTY3NpX0NtbmQgKmVuZDsKKworCVNDTkVYVChuZXdfU0MpID0gTlVMTDsKKwlpZiAoISpTQykKKwkJKlNDID0gbmV3X1NDOworCWVsc2UgeworCQlmb3IgKGVuZCA9ICpTQzsgU0NORVhUKGVuZCk7IGVuZCA9IFNDTkVYVChlbmQpKQorCQkJOworCQlTQ05FWFQoZW5kKSA9IG5ld19TQzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfZmlyc3RfU0MoU2NzaV9DbW5kICoqIFNDKQoreworCVNjc2lfQ21uZCAqcHRyOworCisJcHRyID0gKlNDOworCWlmIChwdHIpIHsKKwkJKlNDID0gU0NORVhUKCpTQyk7CisJCVNDTkVYVChwdHIpPU5VTEw7CisJfQorCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfbHVuX1NDKFNjc2lfQ21uZCAqKiBTQywgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlTY3NpX0NtbmQgKnB0ciwgKnByZXY7CisKKwlmb3IgKHB0ciA9ICpTQywgcHJldiA9IE5VTEw7CisJICAgICBwdHIgJiYgKChwdHItPmRldmljZS0+aWQgIT0gdGFyZ2V0KSB8fCAocHRyLT5kZXZpY2UtPmx1biAhPSBsdW4pKTsKKwkgICAgIHByZXYgPSBwdHIsIHB0ciA9IFNDTkVYVChwdHIpKQorCSAgICAgOworCisJaWYgKHB0cikgeworCQlpZiAocHJldikKKwkJCVNDTkVYVChwcmV2KSA9IFNDTkVYVChwdHIpOworCQllbHNlCisJCQkqU0MgPSBTQ05FWFQocHRyKTsKKworCQlTQ05FWFQocHRyKT1OVUxMOworCX0KKworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfU0MoU2NzaV9DbW5kICoqU0MsIFNjc2lfQ21uZCAqU0NwKQoreworCVNjc2lfQ21uZCAqcHRyLCAqcHJldjsKKworCWZvciAocHRyID0gKlNDLCBwcmV2ID0gTlVMTDsKKwkgICAgIHB0ciAmJiBTQ3AhPXB0cjsKKwkgICAgIHByZXYgPSBwdHIsIHB0ciA9IFNDTkVYVChwdHIpKQorCSAgICAgOworCisJaWYgKHB0cikgeworCQlpZiAocHJldikKKwkJCVNDTkVYVChwcmV2KSA9IFNDTkVYVChwdHIpOworCQllbHNlCisJCQkqU0MgPSBTQ05FWFQocHRyKTsKKworCQlTQ05FWFQocHRyKT1OVUxMOworCX0KKworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqbG9va3VwX2lycShpbnQgaXJxbm8pCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoYWhhMTUyeF9ob3N0KTsgaSsrKQorCQlpZihhaGExNTJ4X2hvc3RbaV0gJiYgYWhhMTUyeF9ob3N0W2ldLT5pcnE9PWlycW5vKQorCQkJcmV0dXJuIGFoYTE1MnhfaG9zdFtpXTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3dpbnRyKGludCBpcnFubywgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IGxvb2t1cF9pcnEoaXJxbm8pOworCisJaWYgKCFzaHBudCkgeworICAgICAgICAJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBjYXRjaGVkIHNvZnR3YXJlIGludGVycnVwdCAlZCBmb3IgdW5rbm93biBjb250cm9sbGVyLlxuIiwgaXJxbm8pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJSE9TVERBVEEoc2hwbnQpLT5zd2ludCsrOworCisJU0VUUE9SVChETUFDTlRSTDAsIElOVEVOKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0cnVjdCBTY3NpX0hvc3QgKmFoYTE1MnhfcHJvYmVfb25lKHN0cnVjdCBhaGExNTJ4X3NldHVwICpzZXR1cCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKworCXNocG50ID0gc2NzaV9ob3N0X2FsbG9jKCZhaGExNTJ4X2RyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhaGExNTJ4X2hvc3RkYXRhKSk7CisJaWYgKCFzaHBudCkgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IHNjc2lfaG9zdF9hbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBuZWVkIHRvIGhhdmUgaG9zdCByZWdpc3RlcmVkIGJlZm9yZSB0cmlnZ2VyaW5nIGFueSBpbnRlcnJ1cHQgKi8KKwlhaGExNTJ4X2hvc3RbcmVnaXN0ZXJlZF9jb3VudF0gPSBzaHBudDsKKworCW1lbXNldChIT1NUREFUQShzaHBudCksIDAsIHNpemVvZiAqSE9TVERBVEEoc2hwbnQpKTsKKworCXNocG50LT5pb19wb3J0ICAgPSBzZXR1cC0+aW9fcG9ydDsKKwlzaHBudC0+bl9pb19wb3J0ID0gSU9fUkFOR0U7CisJc2hwbnQtPmlycSAgICAgICA9IHNldHVwLT5pcnE7CisKKwlpZiAoIXNldHVwLT50YzE1NTApIHsKKwkJSE9TVElPUE9SVDAgPSBzZXR1cC0+aW9fcG9ydDsKKwkJSE9TVElPUE9SVDEgPSBzZXR1cC0+aW9fcG9ydDsKKwl9IGVsc2UgeworCQlIT1NUSU9QT1JUMCA9IHNldHVwLT5pb19wb3J0KzB4MTA7CisJCUhPU1RJT1BPUlQxID0gc2V0dXAtPmlvX3BvcnQtMHgxMDsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmUUxPQ0spOworCVJFQ09OTkVDVCAgID0gc2V0dXAtPnJlY29ubmVjdDsKKwlTWU5DSFJPTk9VUyA9IHNldHVwLT5zeW5jaHJvbm91czsKKwlQQVJJVFkgICAgICA9IHNldHVwLT5wYXJpdHk7CisJREVMQVkgICAgICAgPSBzZXR1cC0+ZGVsYXk7CisJRVhUX1RSQU5TICAgPSBzZXR1cC0+ZXh0X3RyYW5zOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCUhPU1REQVRBKHNocG50KS0+ZGVidWcgPSBzZXR1cC0+ZGVidWc7CisjZW5kaWYKKworCVNFVFBPUlQoU0NTSUlELCBzZXR1cC0+c2NzaWlkIDw8IDQpOworCXNocG50LT50aGlzX2lkID0gc2V0dXAtPnNjc2lpZDsKKworCWlmIChzZXR1cC0+cmVjb25uZWN0KQorCQlzaHBudC0+Y2FuX3F1ZXVlID0gQUhBMTUyWF9NQVhRVUVVRTsKKworCS8qIFJFU0VUIE9VVCAqLworCXByaW50aygiYWhhMTUyeDogcmVzZXR0aW5nIGJ1cy4uLlxuIik7CisJU0VUUE9SVChTQ1NJU0VRLCBTQ1NJUlNUTyk7CisJbWRlbGF5KDI1Nik7CisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKwltZGVsYXkoREVMQVkpOworCisJcmVzZXRfcG9ydHMoc2hwbnQpOworCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiYWhhMTUyeCVkJXM6ICIKKwkgICAgICAgInZpdGFsIGRhdGE6IHJldj0leCwgIgorCSAgICAgICAiaW89MHglMDNseCAoMHglMDNseC8weCUwM2x4KSwgIgorCSAgICAgICAiaXJxPSVkLCAiCisJICAgICAgICJzY3NpaWQ9JWQsICIKKwkgICAgICAgInJlY29ubmVjdD0lcywgIgorCSAgICAgICAicGFyaXR5PSVzLCAiCisJICAgICAgICJzeW5jaHJvbm91cz0lcywgIgorCSAgICAgICAiZGVsYXk9JWQsICIKKwkgICAgICAgImV4dGVuZGVkIHRyYW5zbGF0aW9uPSVzXG4iLAorCSAgICAgICBzaHBudC0+aG9zdF9ubywgc2V0dXAtPnRjMTU1MCA/ICIgKHRjMTU1MCBtb2RlKSIgOiAiIiwKKwkgICAgICAgR0VUUE9SVChSRVYpICYgMHg3LAorCSAgICAgICBzaHBudC0+aW9fcG9ydCwgSE9TVElPUE9SVDAsIEhPU1RJT1BPUlQxLAorCSAgICAgICBzaHBudC0+aXJxLAorCSAgICAgICBzaHBudC0+dGhpc19pZCwKKwkgICAgICAgUkVDT05ORUNUID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKwkgICAgICAgUEFSSVRZID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKwkgICAgICAgU1lOQ0hST05PVVMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCSAgICAgICBERUxBWSwKKwkgICAgICAgRVhUX1RSQU5TID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwkvKiBub3QgZXhwZWN0aW5nIGFueSBpbnRlcnJ1cHRzICovCisJU0VUUE9SVChTSU1PREUwLCAwKTsKKwlTRVRQT1JUKFNJTU9ERTEsIDApOworCisJaWYoIHJlcXVlc3RfaXJxKHNocG50LT5pcnEsIHN3aW50ciwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiYWhhMTUyeCIsIHNocG50KSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGlycSAlZCBidXN5LlxuIiwgc2hwbnQtPmhvc3Rfbm8sIHNocG50LT5pcnEpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwlIT1NUREFUQShzaHBudCktPnN3aW50ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnglZDogdHJ5aW5nIHNvZnR3YXJlIGludGVycnVwdCwgIiwgc2hwbnQtPmhvc3Rfbm8pOworCisJbWIoKTsKKwlTRVRQT1JUKERNQUNOVFJMMCwgU1dJTlR8SU5URU4pOworCW1kZWxheSgxMDAwKTsKKwlmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CisKKwlpZiAoIUhPU1REQVRBKHNocG50KS0+c3dpbnQpIHsKKwkJaWYgKFRFU1RISShETUFTVEFULCBJTlRTVEFUKSkgeworCQkJcHJpbnRrKCJsb3N0LlxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoImZhaWxlZC5cbiIpOworCQl9CisKKwkJU0VUUE9SVChETUFDTlRSTDAsIElOVEVOKTsKKworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIHBvc3NpYmx5IHdyb25nLiAgIgorCQkJCSJQbGVhc2UgdmVyaWZ5LlxuIiwgc2hwbnQtPmhvc3Rfbm8sIHNocG50LT5pcnEpOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisJcHJpbnRrKCJvay5cbiIpOworCisKKwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJU0VUUE9SVChTU1RBVDAsIDB4N2YpOworCVNFVFBPUlQoU1NUQVQxLCAweGVmKTsKKworCWlmICggcmVxdWVzdF9pcnEoc2hwbnQtPmlycSwgaW50ciwgU0FfSU5URVJSVVBUfFNBX1NISVJRLCAiYWhhMTUyeCIsIHNocG50KSApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGZhaWxlZCB0byByZWFzc2lnbiBpcnEgJWQuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKworCWlmKCBzY3NpX2FkZF9ob3N0KHNocG50LCBOVUxMKSApIHsKKwkJZnJlZV9pcnEoc2hwbnQtPmlycSwgc2hwbnQpOworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogZmFpbGVkIHRvIGFkZCBob3N0LlxuIiwgc2hwbnQtPmhvc3Rfbm8pOworCQlnb3RvIG91dF9ob3N0X3B1dDsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChzaHBudCk7CisKKwlyZWdpc3RlcmVkX2NvdW50Kys7CisKKwlyZXR1cm4gc2hwbnQ7CisKK291dF9ob3N0X3B1dDoKKwlhaGExNTJ4X2hvc3RbcmVnaXN0ZXJlZF9jb3VudF09TlVMTDsKKwlzY3NpX2hvc3RfcHV0KHNocG50KTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGFoYTE1MnhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZighc2hwbnQpCisJCXJldHVybjsKKworCWlmIChzaHBudC0+aXJxKQorCQlmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CisKKyNpZiAhZGVmaW5lZChQQ01DSUEpCisJaWYgKHNocG50LT5pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaHBudC0+aW9fcG9ydCwgSU9fUkFOR0UpOworI2VuZGlmCisKKyNpZmRlZiBfX0lTQVBOUF9fCisJaWYgKEhPU1REQVRBKHNocG50KS0+cG5wZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaChIT1NUREFUQShzaHBudCktPnBucGRldik7CisjZW5kaWYKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hwbnQpOworCXNjc2lfaG9zdF9wdXQoc2hwbnQpOworfQorCisKKy8qCisgKiBzZXR1cCBjb250cm9sbGVyIHRvIGdlbmVyYXRlIGludGVycnVwdHMgZGVwZW5kaW5nCisgKiBvbiBjdXJyZW50IHN0YXRlIChsb2NrIGhhcyB0byBiZSBhY3F1aXJlZCkKKyAqCisgKi8gCitzdGF0aWMgaW50IHNldHVwX2V4cGVjdGVkX2ludGVycnVwdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoQ1VSUkVOVF9TQykgeworCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gMSA8PCAxNjsKKwkKKwkJaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgc2VsZWN0aW5nKSB7CisJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHNlbGRvKSAoc2VsdGltbykgKHNlbGRpKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlTRVRQT1JUKFNTVEFUMSwgU0VMVE8pOworCQkJU0VUUE9SVChTSU1PREUwLCBFTlNFTERPIHwgKERJU0NPTk5FQ1RFRF9TQyA/IEVOU0VMREkgOiAwKSk7CisJCQlTRVRQT1JUKFNJTU9ERTEsIEVOU0VMVElNTyk7CisJCX0gZWxzZSB7CisJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHBoYXNlIGNoYW5nZSkgKGJ1c2ZyZWUpICVzXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzcGlvcmR5ID8gIihzcGlvcmR5KSIgOiAiIik7CisJCQlTRVRQT1JUKFNJTU9ERTAsIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzcGlvcmR5KSA/IEVOU1BJT1JEWSA6IDApOworCQkJU0VUUE9SVChTSU1PREUxLCBFTlBIQVNFTUlTIHwgRU5TQ1NJUlNUIHwgRU5TQ1NJUEVSUiB8IEVOQlVTRlJFRSk7IAorCQl9CisJfSBlbHNlIGlmKFNUQVRFPT1zZWxkaSkgeworCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHBoYXNlIGNoYW5nZSkgKGlkZW50aWZ5KVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCVNFVFBPUlQoU0lNT0RFMCwgMCk7CisJCVNFVFBPUlQoU0lNT0RFMSwgRU5QSEFTRU1JUyB8IEVOU0NTSVJTVCB8IEVOU0NTSVBFUlIgfCBFTkJVU0ZSRUUpOyAKKwl9IGVsc2UgeworCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogJXMgJXNcbiIsCisJCQlDTURJTkZPKENVUlJFTlRfU0MpLAorCQkJRElTQ09OTkVDVEVEX1NDID8gIihyZXNlbGVjdGlvbikiIDogIiIsCisJCQlJU1NVRV9TQyA/ICIoYnVzZnJlZSkiIDogIiIpOworCQlTRVRQT1JUKFNJTU9ERTAsIERJU0NPTk5FQ1RFRF9TQyA/IEVOU0VMREkgOiAwKTsKKwkJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lSU1QgfCAoIChJU1NVRV9TQ3x8RE9ORV9TQykgPyBFTkJVU0ZSRUUgOiAwKSk7CisJfQorCisJaWYoIUhPU1REQVRBKHNocG50KS0+aW5faW50cikKKwkJU0VUQklUUyhETUFDTlRSTDAsIElOVEVOKTsKKworCXJldHVybiBURVNUSEkoRE1BU1RBVCwgSU5UU1RBVCk7Cit9CisKKworLyogCisgKiAgUXVldWUgYSBjb21tYW5kIGFuZCBzZXR1cCBpbnRlcnJ1cHRzIGZvciBhIGZyZWUgYnVzLgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfaW50ZXJuYWxfcXVldWUoU2NzaV9DbW5kICpTQ3BudCwgc3RydWN0IHNlbWFwaG9yZSAqc2VtLCBpbnQgcGhhc2UsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYgKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19xdWV1ZSkgeworCQlwcmludGsoSU5GT19MRUFEICJxdWV1ZTogJXA7IGNtZF9sZW49JWQgcGllY2VzPSVkIHNpemU9JXUgY21uZD0iLAorCQkgICAgICAgQ01ESU5GTyhTQ3BudCksIFNDcG50LCBTQ3BudC0+Y21kX2xlbiwgU0NwbnQtPnVzZV9zZywgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisJCXByaW50X2NvbW1hbmQoU0NwbnQtPmNtbmQpOworCX0KKyNlbmRpZgorCisJU0NwbnQtPnNjc2lfZG9uZQk9IGRvbmU7CisJU0NwbnQtPnJlc2lkIAkJPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCVNDcG50LT5TQ3AucGhhc2UJPSBub3RfaXNzdWVkIHwgcGhhc2U7CisJU0NwbnQtPlNDcC5TdGF0dXMJPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlCT0gMDsKKwlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbgk9IDA7CisJU0NwbnQtPlNDcC5zZW50X2NvbW1hbmQJPSAwOworCisJaWYoU0NwbnQtPlNDcC5waGFzZSAmIChyZXNldHRpbmd8Y2hlY2tfY29uZGl0aW9uKSkgeworCQlpZihTQ3BudC0+aG9zdF9zY3JpYmJsZT09MCB8fCBTQ1NFTShTQ3BudCkgfHwgU0NORVhUKFNDcG50KSkgeworCQkJcHJpbnRrKEVSUl9MRUFEICJjYW5ub3QgcmV1c2UgY29tbWFuZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCX0gZWxzZSB7CisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFoYTE1Mnhfc2NkYXRhKSwgR0ZQX0FUT01JQyk7CisJCWlmKFNDcG50LT5ob3N0X3NjcmliYmxlPT0wKSB7CisJCQlwcmludGsoRVJSX0xFQUQgImFsbG9jYXRpb24gZmFpbGVkXG4iLCBDTURJTkZPKFNDcG50KSk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJfQorCisJU0NORVhUKFNDcG50KQkJPSBOVUxMOworCVNDU0VNKFNDcG50KQkJPSBzZW07CisKKwkvKiBzZXR1cCBzY3JhdGNoIGFyZWEKKwkgICBTQ3AucHRyICAgICAgICAgICAgICA6IGJ1ZmZlciBwb2ludGVyCisJICAgU0NwLnRoaXNfcmVzaWR1YWwgICAgOiBidWZmZXIgbGVuZ3RoCisJICAgU0NwLmJ1ZmZlciAgICAgICAgICAgOiBuZXh0IGJ1ZmZlcgorCSAgIFNDcC5idWZmZXJzX3Jlc2lkdWFsIDogbGVmdCBidWZmZXJzIGluIGxpc3QKKwkgICBTQ3AucGhhc2UgICAgICAgICAgICA6IGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbW1hbmQgKi8KKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlTQ3BudC0+U0NwLmJ1ZmZlciAgICAgICAgICAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC5wdHIgICAgICAgICAgICAgID0gU0dfQUREUkVTUyhTQ3BudC0+U0NwLmJ1ZmZlcik7CisJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCAgICA9IFNDcG50LT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IFNDcG50LT51c2Vfc2cgLSAxOworCX0gZWxzZSB7CisJCVNDcG50LT5TQ3AucHRyICAgICAgICAgICAgICA9IChjaGFyICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJU0NwbnQtPlNDcC5idWZmZXIgICAgICAgICAgID0gTlVMTDsKKwkJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwl9CisKKwlET19MT0NLKGZsYWdzKTsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCUhPU1REQVRBKHNocG50KS0+dG90YWxfY29tbWFuZHMrKzsKKyNlbmRpZgorCisJLyogVHVybiBsZWQgb24sIHdoZW4gdGhpcyBpcyB0aGUgZmlyc3QgY29tbWFuZC4gKi8KKwlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKys7CisJaWYgKEhPU1REQVRBKHNocG50KS0+Y29tbWFuZHM9PTEpCisJCVNFVFBPUlQoUE9SVEEsIDEpOworCisJYXBwZW5kX1NDKCZJU1NVRV9TQywgU0NwbnQpOworCisJaWYoIUhPU1REQVRBKHNocG50KS0+aW5faW50cikKKwkJc2V0dXBfZXhwZWN0ZWRfaW50ZXJydXB0cyhzaHBudCk7CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgcXVldWUgYSBjb21tYW5kCisgKgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfcXVldWUoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyNpZiAwCisJaWYoKlNDcG50LT5jbW5kID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJU0NwbnQtPnJlc3VsdCA9IDA7CisJCWRvbmUoU0NwbnQpOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGFoYTE1MnhfaW50ZXJuYWxfcXVldWUoU0NwbnQsIE5VTEwsIDAsIGRvbmUpOworfQorCisKKy8qCisgKiAgCisgKgorICovCitzdGF0aWMgdm9pZCByZXNldF9kb25lKFNjc2lfQ21uZCAqU0NwbnQpCit7CisjaWYgMAorCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmhvc3Q7CisJRFBSSU5USyhkZWJ1Z19laCwgSU5GT19MRUFEICJyZXNldF9kb25lIGNhbGxlZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworI2VuZGlmCisJaWYoU0NTRU0oU0NwbnQpKSB7CisJCXVwKFNDU0VNKFNDcG50KSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiByZXNldF9kb25lIHcvbyBzZW1hcGhvcmVcbiIpOworCX0KK30KKworLyoKKyAqICBBYm9ydCBhIGNvbW1hbmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwlTY3NpX0NtbmQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgeworCQlwcmludGsoREVCVUdfTEVBRCAiYWJvcnQoJXApIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKKwkJc2hvd19xdWV1ZXMoc2hwbnQpOworCX0KKyNlbmRpZgorCisJRE9fTE9DSyhmbGFncyk7CisKKwlwdHI9cmVtb3ZlX1NDKCZJU1NVRV9TQywgU0NwbnQpOworCisJaWYocHRyKSB7CisJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgIm5vdCB5ZXQgaXNzdWVkIC0gU1VDQ0VTU1xuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJU0VUUE9SVChQT1JUQSwgMCk7CisJCURPX1VOTE9DSyhmbGFncyk7CisKKwkJa2ZyZWUoU0NwbnQtPmhvc3Rfc2NyaWJibGUpOworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZT1OVUxMOworCisJCXJldHVybiBTVUNDRVNTOworCX0gCisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJLyoKKwkgKiBGSVhNRToKKwkgKiBmb3IgY3VycmVudCBjb21tYW5kOiBxdWV1ZSBBQk9SVCBmb3IgbWVzc2FnZSBvdXQgYW5kIHJhaXNlIEFUTgorCSAqIGZvciBkaXNjb25uZWN0ZWQgY29tbWFuZDogcHNldWRvIFNDIHdpdGggQUJPUlQgbWVzc2FnZSBvciBBQk9SVCBvbiByZXNlbGVjdGlvbj8KKwkgKgorCSAqLworCisJcHJpbnRrKEVSUl9MRUFEICJjYW5ub3QgYWJvcnQgcnVubmluZyBvciBkaXNjb25uZWN0ZWQgY29tbWFuZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIHZvaWQgdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIHApCit7CisJU2NzaV9DbW5kCSAqU0NwICAgPSAoU2NzaV9DbW5kICopcDsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gICA9IFNDU0VNKFNDcCk7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3AtPmRldmljZS0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogcmVtb3ZlIGNvbW1hbmQgZnJvbSBpc3N1ZSBxdWV1ZSAqLworCURPX0xPQ0soZmxhZ3MpOworCXJlbW92ZV9TQygmSVNTVUVfU0MsIFNDcCk7CisJRE9fVU5MT0NLKGZsYWdzKTsKKworCXVwKHNlbSk7Cit9CisKKy8qCisgKiBSZXNldCBhIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBhaGExNTJ4X2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlpbnQgcmV0LCBpc3N1ZWQsIGRpc2Nvbm5lY3RlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgeworCQlwcmludGsoSU5GT19MRUFEICJhaGExNTJ4X2RldmljZV9yZXNldCglcCkiLCBDTURJTkZPKFNDcG50KSwgU0NwbnQpOworCQlzaG93X3F1ZXVlcyhzaHBudCk7CisJfQorI2VuZGlmCisKKwlpZihDVVJSRU5UX1NDPT1TQ3BudCkgeworCQlwcmludGsoRVJSX0xFQUQgImNhbm5vdCByZXNldCBjdXJyZW50IGRldmljZVxuIiwgQ01ESU5GTyhTQ3BudCkpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCURPX0xPQ0soZmxhZ3MpOworCWlzc3VlZCAgICAgICA9IHJlbW92ZV9TQygmSVNTVUVfU0MsIFNDcG50KT09MDsKKwlkaXNjb25uZWN0ZWQgPSBpc3N1ZWQgJiYgcmVtb3ZlX1NDKCZESVNDT05ORUNURURfU0MsIFNDcG50KTsKKwlET19VTkxPQ0soZmxhZ3MpOworCisJU0NwbnQtPmNtZF9sZW4gICAgICAgICA9IDA7CisJU0NwbnQtPnVzZV9zZyAgICAgICAgICA9IDA7CisJU0NwbnQtPnJlcXVlc3RfYnVmZmVyICA9IE5VTEw7CisJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IDA7CisKKwlpbml0X3RpbWVyKCZ0aW1lcik7CisJdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykgU0NwbnQ7CisJdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMTAwKkhaOyAgIC8qIDEwcyAqLworCXRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKSB0aW1lcl9leHBpcmVkOworCisJYWhhMTUyeF9pbnRlcm5hbF9xdWV1ZShTQ3BudCwgJnNlbSwgcmVzZXR0aW5nLCByZXNldF9kb25lKTsKKwlhZGRfdGltZXIoJnRpbWVyKTsKKwlkb3duKCZzZW0pOworCWRlbF90aW1lcigmdGltZXIpOworCQorCVNDcG50LT5jbWRfbGVuICAgICAgICAgPSBTQ3BudC0+b2xkX2NtZF9sZW47CisJU0NwbnQtPnVzZV9zZyAgICAgICAgICA9IFNDcG50LT5vbGRfdXNlX3NnOworICAJU0NwbnQtPnJlcXVlc3RfYnVmZmVyICA9IFNDcG50LT5idWZmZXI7CisgICAgICAgCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPSBTQ3BudC0+YnVmZmxlbjsKKworCURPX0xPQ0soZmxhZ3MpOworCisJaWYoU0NwbnQtPlNDcC5waGFzZSAmIHJlc2V0dGVkKSB7CisJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJU0VUUE9SVChQT1JUQSwgMCk7CisJCWtmcmVlKFNDcG50LT5ob3N0X3NjcmliYmxlKTsKKwkJU0NwbnQtPmhvc3Rfc2NyaWJibGU9TlVMTDsKKworCQlyZXQgPSBTVUNDRVNTOworCX0gZWxzZSB7CisJCS8qIHJlcXVldWUgKi8KKwkJaWYoIWlzc3VlZCkgeworCQkJYXBwZW5kX1NDKCZJU1NVRV9TQywgU0NwbnQpOworCQl9IGVsc2UgaWYoZGlzY29ubmVjdGVkKSB7CisJCQlhcHBlbmRfU0MoJkRJU0NPTk5FQ1RFRF9TQywgU0NwbnQpOworCQl9CisJCisJCXJldCA9IEZBSUxFRDsKKwl9CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycShzaHBudC0+aG9zdF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX2hhcmRfcmVzZXRfU0NzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBTY3NpX0NtbmQgKipTQ3MpCit7CisJU2NzaV9DbW5kICpwdHI7CisKKwlwdHI9KlNDczsKKwl3aGlsZShwdHIpIHsKKwkJU2NzaV9DbW5kICpuZXh0OworCisJCWlmKFNDREFUQShwdHIpKSB7CisJCQluZXh0ID0gU0NORVhUKHB0cik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoREVCVUdfTEVBRCAicXVldWUgY29ycnVwdGVkIGF0ICVwXG4iLCBDTURJTkZPKHB0ciksIHB0cik7CisJCQluZXh0ID0gTlVMTDsKKwkJfQorCisJCWlmICghcHRyLT5kZXZpY2UtPnNvZnRfcmVzZXQpIHsKKwkJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgImRpc2Nvbm5lY3RlZCBjb21tYW5kICVwIHJlbW92ZWRcbiIsIENNRElORk8ocHRyKSwgcHRyKTsKKwkJCXJlbW92ZV9TQyhTQ3MsIHB0cik7CisJCQlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzLS07CisJCQlrZnJlZShwdHItPmhvc3Rfc2NyaWJibGUpOworCQkJcHRyLT5ob3N0X3NjcmliYmxlPU5VTEw7CisJCX0KKworCQlwdHIgPSBuZXh0OworCX0KK30KKworLyoKKyAqIFJlc2V0IHRoZSBidXMKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURPX0xPQ0soZmxhZ3MpOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgeworCQlwcmludGsoREVCVUdfTEVBRCAiYWhhMTUyeF9idXNfcmVzZXQoJXApIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKKwkJc2hvd19xdWV1ZXMoc2hwbnQpOworCX0KKyNlbmRpZgorCisJZnJlZV9oYXJkX3Jlc2V0X1NDcyhzaHBudCwgJklTU1VFX1NDKTsKKwlmcmVlX2hhcmRfcmVzZXRfU0NzKHNocG50LCAmRElTQ09OTkVDVEVEX1NDKTsKKworCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgInJlc2V0dGluZyBidXNcbiIsIENNRElORk8oU0NwbnQpKTsKKworCVNFVFBPUlQoU0NTSVNFUSwgU0NTSVJTVE8pOworCW1kZWxheSgyNTYpOworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CisJbWRlbGF5KERFTEFZKTsKKworCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgImJ1cyByZXNldHRlZFxuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJc2V0dXBfZXhwZWN0ZWRfaW50ZXJydXB0cyhzaHBudCk7CisJaWYoSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcz09MCkKKwkJU0VUUE9SVChQT1JUQSwgMCk7CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworLyoKKyAqICBSZXN0b3JlIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBBSUMtNjI2MCByZWdpc3RlcnMgYW5kIHJlc2V0IHRoZSBmaWZvcworICoKKyAqLworc3RhdGljIHZvaWQgcmVzZXRfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCVNFVFBPUlQoRE1BQ05UUkwwLCBSU1RGSUZPKTsKKworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CisKKwlTRVRQT1JUKFNYRlJDVEwxLCAwKTsKKwlTRVRQT1JUKFNDU0lTSUcsIDApOworCVNFVFJBVEUoMCk7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0IGNvbmRpdGlvbnMgKi8KKwlTRVRQT1JUKFNTVEFUMCwgMHg3Zik7CisJU0VUUE9SVChTU1RBVDEsIDB4ZWYpOworCisJU0VUUE9SVChTU1RBVDQsIFNZTkNFUlIgfCBGV0VSUiB8IEZSRVJSKTsKKworCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKKwlTRVRQT1JUKERNQUNOVFJMMSwgMCk7CisKKwlTRVRQT1JUKEJSU1RDTlRSTCwgMHhmMSk7CisKKwkvKiBjbGVhciBTQ1NJIGZpZm9zIGFuZCB0cmFuc2ZlciBjb3VudCAqLworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJDSDF8Q0xSU1RDTlQpOworCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CisKKwlET19MT0NLKGZsYWdzKTsKKwlzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKKwlET19VTkxPQ0soZmxhZ3MpOworfQorCisvKgorICogUmVzZXQgdGhlIGhvc3QgKGJ1cyBhbmQgY29udHJvbGxlcikKKyAqCisgKi8KK2ludCBhaGExNTJ4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpCit7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKyNlbmRpZgorCisJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAiYWhhMTUyeF9ob3N0X3Jlc2V0KCVwKVxuIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKKworCWFoYTE1MnhfYnVzX3Jlc2V0KFNDcG50KTsKKworCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgInJlc2V0dGluZyBwb3J0c1xuIiwgQ01ESU5GTyhTQ3BudCkpOworCXJlc2V0X3BvcnRzKFNDcG50LT5kZXZpY2UtPmhvc3QpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlICJsb2dpY2FsIGdlb21ldHJ5IgorICoKKyAqLworc3RhdGljIGludCBhaGExNTJ4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm9fYXJyYXkpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBzZGV2LT5ob3N0OworCisJLyogdHJ5IGRlZmF1bHQgdHJhbnNsYXRpb24gKi8KKwlpbmZvX2FycmF5WzBdID0gNjQ7CisJaW5mb19hcnJheVsxXSA9IDMyOworCWluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvICg2NCAqIDMyKTsKKworCS8qIGZvciBkaXNrcyA+MUdCIGRvIHNvbWUgZ3Vlc3NpbmcgKi8KKwlpZiAoaW5mb19hcnJheVsyXSA+PSAxMDI0KSB7CisJCWludCBpbmZvWzNdOworCisJCS8qIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBnZW9tZXRyeSBmcm9tIHRoZSBwYXJ0aXRpb24gdGFibGUgKi8KKwkJaWYgKHNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBjYXBhY2l0eSwgaW5mbykgPCAwIHx8CisJCSAgICAhKChpbmZvWzBdID09IDY0ICYmIGluZm9bMV0gPT0gMzIpIHx8IChpbmZvWzBdID09IDI1NSAmJiBpbmZvWzFdID09IDYzKSkpIHsKKwkJCWlmIChFWFRfVFJBTlMpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkgICAgICAgImFoYTE1Mng6IHVuYWJsZSB0byB2ZXJpZnkgZ2VvbWV0cnkgZm9yIGRpc2sgd2l0aCA+MUdCLlxuIgorCQkJCSAgICAgICAiICAgICAgICAgdXNpbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24uXG4iKTsKKwkJCQlpbmZvX2FycmF5WzBdID0gMjU1OworCQkJCWluZm9fYXJyYXlbMV0gPSA2MzsKKwkJCQlpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoMjU1ICogNjMpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkgICAgICAgImFoYTE1Mng6IHVuYWJsZSB0byB2ZXJpZnkgZ2VvbWV0cnkgZm9yIGRpc2sgd2l0aCA+MUdCLlxuIgorCQkJCSAgICAgICAiICAgICAgICAgVXNpbmcgZGVmYXVsdCB0cmFuc2xhdGlvbi4gUGxlYXNlIHZlcmlmeSB5b3Vyc2VsZi5cbiIKKwkJCQkgICAgICAgIiAgICAgICAgIFBlcmhhcHMgeW91IG5lZWQgdG8gZW5hYmxlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIGluIHRoZSBkcml2ZXIuXG4iCisJCQkJICAgICAgICIgICAgICAgICBTZWUgRG9jdW1lbnRhdGlvbi9zY3NpL2FoYTE1MngudHh0IGZvciBkZXRhaWxzLlxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbmZvX2FycmF5WzBdID0gaW5mb1swXTsKKwkJCWluZm9fYXJyYXlbMV0gPSBpbmZvWzFdOworCQkJaW5mb19hcnJheVsyXSA9IGluZm9bMl07CisKKwkJCWlmIChpbmZvWzBdID09IDI1NSAmJiAhRVhUX1RSQU5TKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJICAgICAgICJhaGExNTJ4OiBjdXJyZW50IHBhcnRpdGlvbiB0YWJsZSBpcyB1c2luZyBleHRlbmRlZCB0cmFuc2xhdGlvbi5cbiIKKwkJCQkgICAgICAgIiAgICAgICAgIHVzaW5nIGl0IGFsc28sIGFsdGhvdWdoIGl0J3Mgbm90IGV4cGxpY2l0bHkgZW5hYmxlZC5cbiIpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgSW50ZXJuYWwgZG9uZSBmdW5jdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgZG9uZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgaW50IGVycm9yKQoreworCWlmIChDVVJSRU5UX1NDKSB7CisJCWlmKERPTkVfU0MpCisJCQlwcmludGsoRVJSX0xFQUQgInRoZXJlJ3MgYWxyZWFkeSBhIGNvbXBsZXRlZCBjb21tYW5kICVwIC0gd2lsbCBjYXVzZSBhYm9ydFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgRE9ORV9TQyk7CisKKwkJRE9ORV9TQyA9IENVUlJFTlRfU0M7CisJCUNVUlJFTlRfU0MgPSBOVUxMOworCQlET05FX1NDLT5yZXN1bHQgPSBlcnJvcjsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBkb25lKCkgY2FsbGVkIG91dHNpZGUgb2YgY29tbWFuZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWhhMTUyeF90cTsKKworLyoKKyAqIFJ1biBzZXJ2aWNlIGNvbXBsZXRpb25zIG9uIHRoZSBjYXJkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgcnVuKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaTxBUlJBWV9TSVpFKGFoYTE1MnhfaG9zdCk7IGkrKykgeworCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IGFoYTE1MnhfaG9zdFtpXTsKKwkJaWYgKHNocG50ICYmIEhPU1REQVRBKHNocG50KS0+c2VydmljZSkgeworCQkJSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlPTA7CisJCQlpc19jb21wbGV0ZShzaHBudCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiAgICBJbnRlcnJ1cHRzIGhhbmRsZXIKKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGludHIoaW50IGlycW5vLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gbG9va3VwX2lycShpcnFubyk7CisJdW5zaWduZWQgY2hhciByZXYsIGRtYWNudHJsMDsKKworCWlmICghc2hwbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBjYXRjaGVkIGludGVycnVwdCAlZCBmb3IgdW5rbm93biBjb250cm9sbGVyLlxuIiwgaXJxbm8pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyoKKwkgKiBSZWFkIGEgY291cGxlIG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBrbm93biB0byBub3QgYmUgYWxsIDEncy4gSWYKKwkgKiB3ZSByZWFkIGFsbCAxJ3MgKC0xKSwgdGhhdCBtZWFucyB0aGF0IGVpdGhlcjoKKwkgKgorCSAqIGEuIFRoZSBob3N0IGFkYXB0ZXIgY2hpcCBoYXMgZ29uZSBiYWQsIGFuZCB3ZSBjYW5ub3QgY29udHJvbCBpdCwKKwkgKglPUgorCSAqIGIuIFRoZSBob3N0IGFkYXB0ZXIgaXMgYSBQQ01DSUEgY2FyZCB0aGF0IGhhcyBiZWVuIGVqZWN0ZWQKKwkgKgorCSAqIEluIGVpdGhlciBjYXNlLCB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgaG9zdCBhZGFwdGVyIGF0CisJICogdGhpcyBwb2ludCBpbiB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGUgaW50ZXJydXB0IGFuZCByZXR1cm4uCisJICogSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgaW50ZXJydXB0IG1pZ2h0IGFjdHVhbGx5IGJlIG1lYW50IGZvcgorCSAqIHNvbWVvbmUgZWxzZSBzaGFyaW5nIHRoaXMgSVJRLCBhbmQgdGhhdCBkcml2ZXIgd2lsbCBoYW5kbGUgaXQuCisJICovCisJcmV2ID0gR0VUUE9SVChSRVYpOworCWRtYWNudHJsMCA9IEdFVFBPUlQoRE1BQ05UUkwwKTsKKwlpZiAoKHJldiA9PSAweEZGKSAmJiAoZG1hY250cmwwID09IDB4RkYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBubyBtb3JlIGludGVycnVwdHMgZnJvbSB0aGUgY29udHJvbGxlciwgd2hpbGUgd2UncmUgYnVzeS4KKwkgICBJTlRFTiBpcyByZXN0b3JlZCBieSB0aGUgQkggaGFuZGxlciAqLworCUNMUkJJVFMoRE1BQ05UUkwwLCBJTlRFTik7CisKKyNpZiAwCisJLyogY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBzb21ldGhpbmcgdG8gYmUKKyAgICAgICAgICAgc2VydmljZWQ7IHNob3VsZCBub3QgaGFwcGVuICovCisJaWYoSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBsb3N0IGludGVycnVwdCAoJWQpXG4iLCBIT1NUTk8sIEhPU1REQVRBKHNocG50KS0+c2VydmljZSk7CisJICAgICAgICBzaG93X3F1ZXVlcyhzaHBudCk7CisJfQorI2VuZGlmCisJCisJLyogUG9rZSB0aGUgQkggaGFuZGxlciAqLworCUhPU1REQVRBKHNocG50KS0+c2VydmljZSsrOworCUlOSVRfV09SSygmYWhhMTUyeF90cSwgKHZvaWQgKikgcnVuLCBOVUxMKTsKKwlzY2hlZHVsZV93b3JrKCZhaGExNTJ4X3RxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBidXNmcmVlIHBoYXNlCisgKiAtIGhhbmRsZSBjb21wbGV0aXRpb24vZGlzY29ubmVjdGlvbi9lcnJvciBvZiBjdXJyZW50IGNvbW1hbmQKKyAqIC0gc3RhcnQgc2VsZWN0aW9uIGZvciBuZXh0IGNvbW1hbmQgKGlmIGFueSkKKyAqLworc3RhdGljIHZvaWQgYnVzZnJlZV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwlpbnQgYWN0aW9uPTA7CisjZW5kaWYKKworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJDSDF8Q0xSU1RDTlQpOworCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CisKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSQlVTRlJFRSk7CisJCisJaWYoQ1VSUkVOVF9TQykgeworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlhY3Rpb24rKzsKKyNlbmRpZgorCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfnN5bmNuZWc7CisKKwkJaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgY29tcGxldGVkKSB7CisJCQkvKiB0YXJnZXQgc2VudCBDT01NQU5EIENPTVBMRVRFICovCisJCQlkb25lKHNocG50LCAoQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyAmIDB4ZmYpIHwgKChDVVJSRU5UX1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9PSyA8PCAxNikpOworCisJCX0gZWxzZSBpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CisJCQlEUFJJTlRLKGRlYnVnX2VoLCBERUJVR19MRUFEICJBQk9SVCBzZW50XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCWRvbmUoc2hwbnQsIChDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzICYgMHhmZikgfCAoKENVUlJFTlRfU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX0FCT1JUIDw8IDE2KSk7CisKKwkJfSBlbHNlIGlmKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHJlc2V0dGVkKSB7CisJCQlEUFJJTlRLKGRlYnVnX2VoLCBERUJVR19MRUFEICJCVVMgREVWSUNFIFJFU0VUIHNlbnRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJZG9uZShzaHBudCwgKENVUlJFTlRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKSB8ICgoQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCA4KSB8IChESURfUkVTRVQgPDwgMTYpKTsKKworCQl9IGVsc2UgaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgZGlzY29ubmVjdGVkKSB7CisJCQkvKiB0YXJnZXQgc2VudCBESVNDT05ORUNUICovCisJCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidGFyZ2V0IGRpc2Nvbm5lY3RlZCBhdCAlZC8lZFxuIiwKKwkJCQlDTURJTkZPKENVUlJFTlRfU0MpLAorCQkJCUNVUlJFTlRfU0MtPnJlc2lkLAorCQkJCUNVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbik7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCQlIT1NUREFUQShzaHBudCktPmRpc2Nvbm5lY3Rpb25zKys7CisjZW5kaWYKKwkJCWFwcGVuZF9TQygmRElTQ09OTkVDVEVEX1NDLCBDVVJSRU5UX1NDKTsKKwkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSAxIDw8IDE2OworCQkJQ1VSUkVOVF9TQyA9IE5VTEw7CisKKwkJfSBlbHNlIHsKKwkJCWRvbmUoc2hwbnQsIERJRF9FUlJPUiA8PCAxNik7CisJCX0KKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwl9IGVsc2UgeworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZCsrOworI2VuZGlmCisJfQorCisJRE9fTE9DSyhmbGFncyk7CisKKwlpZihET05FX1NDKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCWFjdGlvbisrOworI2VuZGlmCisKKwkJaWYoRE9ORV9TQy0+U0NwLnBoYXNlICYgY2hlY2tfY29uZGl0aW9uKSB7CisjaWYgMAorCQkJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CisJCQkJcHJpbnRrKEVSUl9MRUFEICJyZWNlaXZlZCBzZW5zZTogIiwgQ01ESU5GTyhET05FX1NDKSk7CisJCQkJcHJpbnRfc2Vuc2UoImJoIiwgRE9ORV9TQyk7CisJCQl9CisjZW5kaWYKKworCQkJLyogcmVzdG9yZSBvbGQgY29tbWFuZCAqLworCQkJbWVtY3B5KCh2b2lkICopIERPTkVfU0MtPmNtbmQsICh2b2lkICopIERPTkVfU0MtPmRhdGFfY21uZCwgc2l6ZW9mKERPTkVfU0MtPmRhdGFfY21uZCkpOworCQkJRE9ORV9TQy0+cmVxdWVzdF9idWZmZXIgID0gRE9ORV9TQy0+YnVmZmVyOworCQkJRE9ORV9TQy0+cmVxdWVzdF9idWZmbGVuID0gRE9ORV9TQy0+YnVmZmxlbjsKKwkJCURPTkVfU0MtPnVzZV9zZyAgICAgICAgICA9IERPTkVfU0MtPm9sZF91c2Vfc2c7CisJCQlET05FX1NDLT5jbWRfbGVuICAgICAgICAgPSBET05FX1NDLT5vbGRfY21kX2xlbjsKKworCQkJRE9ORV9TQy0+U0NwLlN0YXR1cyA9IDB4MDI7CisKKwkJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJCWlmICghSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcykKKwkJCQlTRVRQT1JUKFBPUlRBLCAwKTsJLyogdHVybiBsZWQgb2ZmICovCisJCX0gZWxzZSBpZihET05FX1NDLT5TQ3AuU3RhdHVzPT0weDAyKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb24rKzsKKyNlbmRpZgorI2lmIDAKKwkJCURQUklOVEsoZGVidWdfZWgsIEVSUl9MRUFEICJDSEVDSyBDT05ESVRJT04gZm91bmRcbiIsIENNRElORk8oRE9ORV9TQykpOworI2VuZGlmCisKKwkJCWlmKCEoRE9ORV9TQy0+U0NwLlN0YXR1cyAmIG5vdF9pc3N1ZWQpKSB7CisJCQkJU2NzaV9DbW5kICpwdHIgPSBET05FX1NDOworCQkJCURPTkVfU0M9TlVMTDsKKyNpZiAwCisJCQkJRFBSSU5USyhkZWJ1Z19laCwgRVJSX0xFQUQgInJlcXVlc3Rpbmcgc2Vuc2VcbiIsIENNRElORk8ocHRyKSk7CisjZW5kaWYKKworCQkJCXB0ci0+Y21uZFswXSAgICAgICAgID0gUkVRVUVTVF9TRU5TRTsKKwkJCQlwdHItPmNtbmRbMV0gICAgICAgICA9IDA7CisJCQkJcHRyLT5jbW5kWzJdICAgICAgICAgPSAwOworCQkJCXB0ci0+Y21uZFszXSAgICAgICAgID0gMDsKKwkJCQlwdHItPmNtbmRbNF0gICAgICAgICA9IHNpemVvZihwdHItPnNlbnNlX2J1ZmZlcik7CisJCQkJcHRyLT5jbW5kWzVdICAgICAgICAgPSAwOworCQkJCXB0ci0+Y21kX2xlbiAgICAgICAgID0gNjsKKwkJCQlwdHItPnVzZV9zZyAgICAgICAgICA9IDA7IAorCQkJCXB0ci0+cmVxdWVzdF9idWZmZXIgID0gcHRyLT5zZW5zZV9idWZmZXI7CisJCQkJcHRyLT5yZXF1ZXN0X2J1ZmZsZW4gPSBzaXplb2YocHRyLT5zZW5zZV9idWZmZXIpOworCQkJCisJCQkJRE9fVU5MT0NLKGZsYWdzKTsKKwkJCQlhaGExNTJ4X2ludGVybmFsX3F1ZXVlKHB0ciwgTlVMTCwgY2hlY2tfY29uZGl0aW9uLCBwdHItPnNjc2lfZG9uZSk7CisJCQkJRE9fTE9DSyhmbGFncyk7CisjaWYgMAorCQkJfSBlbHNlIHsKKwkJCQlEUFJJTlRLKGRlYnVnX2VoLCBFUlJfTEVBRCAiY29tbWFuZCBub3QgaXNzdWVkIC0gQ0hFQ0sgQ09ORElUSU9OIGlnbm9yZWRcbiIsIENNRElORk8oRE9ORV9TQykpOworI2VuZGlmCisJCQl9CisJCX0KKworCQlpZihET05FX1NDICYmIERPTkVfU0MtPnNjc2lfZG9uZSkgeworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCWludCBob3N0bm89RE9ORV9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vOworCQkJaW50IGlkPURPTkVfU0MtPmRldmljZS0+aWQgJiAweGY7CisJCQlpbnQgbHVuPURPTkVfU0MtPmRldmljZS0+bHVuICYgMHg3OworI2VuZGlmCisJCQlTY3NpX0NtbmQgKnB0ciA9IERPTkVfU0M7CisJCQlET05FX1NDPU5VTEw7CisKKwkJCS8qIHR1cm4gbGVkIG9mZiwgd2hlbiBubyBjb21tYW5kcyBhcmUgaW4gdGhlIGRyaXZlciAqLworCQkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOworCQkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJCVNFVFBPUlQoUE9SVEEsIDApOwkvKiB0dXJuIGxlZCBvZmYgKi8KKworCQkJaWYocHRyLT5zY3NpX2RvbmUgIT0gcmVzZXRfZG9uZSkgeworCQkJCWtmcmVlKHB0ci0+aG9zdF9zY3JpYmJsZSk7CisJCQkJcHRyLT5ob3N0X3NjcmliYmxlPU5VTEw7CisJCQl9CisKKwkJCURPX1VOTE9DSyhmbGFncyk7CisJCQlEUFJJTlRLKGRlYnVnX2RvbmUsIERFQlVHX0xFQUQgImNhbGxpbmcgc2NzaV9kb25lKCVwKVxuIiwgaG9zdG5vLCBpZCwgbHVuLCBwdHIpOworICAgICAgICAgICAgICAgIAlwdHItPnNjc2lfZG9uZShwdHIpOworCQkJRFBSSU5USyhkZWJ1Z19kb25lLCBERUJVR19MRUFEICJzY3NpX2RvbmUoJXApIHJldHVybmVkXG4iLCBob3N0bm8sIGlkLCBsdW4sIHB0cik7CisJCQlET19MT0NLKGZsYWdzKTsKKwkJfQorCisJCURPTkVfU0M9TlVMTDsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwl9IGVsc2UgeworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9kb25lX2NvbW1hbmQrKzsKKyNlbmRpZgorCX0KKworCWlmKElTU1VFX1NDKQorCQlDVVJSRU5UX1NDID0gcmVtb3ZlX2ZpcnN0X1NDKCZJU1NVRV9TQyk7CisKKwlET19VTkxPQ0soZmxhZ3MpOworCisJaWYoQ1VSUkVOVF9TQykgeworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlhY3Rpb24rKzsKKyNlbmRpZgorCSAgICAJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHNlbGVjdGluZzsKKworCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW5nIHRhcmdldFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwkJLyogY2xlYXIgc2VsZWN0aW9uIHRpbWVvdXQgKi8KKwkJU0VUUE9SVChTU1RBVDEsIFNFTFRPKTsKKworCQlTRVRQT1JUKFNDU0lJRCwgKHNocG50LT50aGlzX2lkIDw8IE9JRF8pIHwgQ1VSUkVOVF9TQy0+ZGV2aWNlLT5pZCk7CisJCVNFVFBPUlQoU1hGUkNUTDEsIChQQVJJVFkgPyBFTlNQQ0hLIDogMCApIHwgRU5TVElNRVIpOworCQlTRVRQT1JUKFNDU0lTRVEsIEVOU0VMTyB8IEVOQVVUT0FUTk8gfCAoRElTQ09OTkVDVEVEX1NDID8gRU5SRVNFTEkgOiAwKSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfbmV3X2NvbW1hbmQrKzsKKyNlbmRpZgorCQlTRVRQT1JUKFNDU0lTRVEsIERJU0NPTk5FQ1RFRF9TQyA/IEVOUkVTRUxJIDogMCk7CisJfQorCisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJaWYoIWFjdGlvbikKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbisrOworI2VuZGlmCit9CisKKy8qCisgKiBTZWxlY3Rpb24gZG9uZSAoT1VUKQorICogLSBxdWV1ZSBJREVOVElGWSBtZXNzYWdlIGFuZCBTRFRSIHRvIHNlbGVjdGVkIHRhcmdldCBmb3IgbWVzc2FnZSBvdXQKKyAqICAgKEFUTiBhc3NlcnRlZCBhdXRvbWFnaWNhbGx5IHZpYSBFTkFVVE9BVE5PIGluIGJ1c2ZyZWUoKSkKKyAqLworc3RhdGljIHZvaWQgc2VsZG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNFVFBPUlQoU0NTSVNJRywgMCk7CisJU0VUUE9SVChTU1RBVDEsIENMUkJVU0ZSRUUpOworCVNFVFBPUlQoU1NUQVQxLCBDTFJQSEFTRUNIRyk7CisKKyAgICAJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICY9IH4oc2VsZWN0aW5nfG5vdF9pc3N1ZWQpOworCisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKworCWlmIChURVNUTE8oU1NUQVQwLCBTRUxETykpIHsKKwkJcHJpbnRrKEVSUl9MRUFEICJhaGExNTJ4OiBwYXNzaW5nIGJ1cyBmcmVlIGNvbmRpdGlvblxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCWRvbmUoc2hwbnQsIERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJcmV0dXJuOworCX0KKworCVNFVFBPUlQoU1NUQVQwLCBDTFJTRUxETyk7CisJCisJQURETVNHTyhJREVOVElGWShSRUNPTk5FQ1QsIENVUlJFTlRfU0MtPmRldmljZS0+bHVuKSk7CisKKwlpZiAoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgYWJvcnRpbmcpIHsKKwkJQURETVNHTyhBQk9SVCk7CisJfSBlbHNlIGlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiByZXNldHRpbmcpIHsKKwkJQURETVNHTyhCVVNfREVWSUNFX1JFU0VUKTsKKwl9IGVsc2UgaWYgKFNZTkNORUc9PTAgJiYgU1lOQ0hST05PVVMpIHsKKyAgICAJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBzeW5jbmVnOworCQlBRERNU0dPKEVYVEVOREVEX01FU1NBR0UpOworCQlBRERNU0dPKDMpOworCQlBRERNU0dPKEVYVEVOREVEX1NEVFIpOworCQlBRERNU0dPKDUwKTsJCS8qIDIwMG5zICovCisJCUFERE1TR08oOCk7CQkvKiA4IGJ5dGUgcmVxL2FjayBvZmZzZXQgKi8KKworCQlTWU5DTkVHPTE7CQkvKiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCX0KKworCVNFVFJBVEUoU1lOQ1JBVEUpOworfQorCisvKgorICogU2VsZWN0aW9uIHRpbWVvdXQKKyAqIC0gcmV0dXJuIGNvbW1hbmQgdG8gbWlkLWxldmVsIHdpdGggZmFpbHVyZSBjYXVzZQorICoKKyAqLworc3RhdGljIHZvaWQgc2VsdG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CQkKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSU0VMVElNTyk7CisKKwlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW9uIHRpbWVvdXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJaWYoIUNVUlJFTlRfU0MpIHsKKwkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgIiFDVVJSRU5UX1NDXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJcmV0dXJuOworCX0KKworICAgIAlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfnNlbGVjdGluZzsKKworCWlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJhYm9ydGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX0FCT1JUIDw8IDE2KTsKKwl9IGVsc2UgaWYgKFRFU1RMTyhTU1RBVDAsIFNFTElOR08pKSB7CisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJhcmJpdHJhdGlvbiBub3Qgd29uXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX0JVU19CVVNZIDw8IDE2KTsKKwl9IGVsc2UgeworCQkvKiBBUkJJVFJBVElPTiB3b24sIGJ1dCBTRUxFQ1RJT04gZmFpbGVkICovCisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJzZWxlY3Rpb24gZmFpbGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCX0KK30KKworLyoKKyAqIFNlbGVjdGlvbiBpbiBkb25lCisgKiAtIHB1dCBjdXJyZW50IGNvbW1hbmQgYmFjayB0byBpc3N1ZSBxdWV1ZQorICogICAocmVjb25uZWN0aW9uIG9mIGEgZGlzY29ubmVjdGVkIG5leHVzIGluc3RlYWQKKyAqICAgIG9mIHN1Y2Nlc3NmdWwgc2VsZWN0aW9uIG91dCkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNlbGRpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpbnQgc2VsaWQ7CisJaW50IHRhcmdldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJU0VUUE9SVChTQ1NJU0lHLCAwKTsKKwlTRVRQT1JUKFNTVEFUMCwgQ0xSU0VMREkpOworCVNFVFBPUlQoU1NUQVQxLCBDTFJCVVNGUkVFKTsKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSUEhBU0VDSEcpOworCisJaWYoQ1VSUkVOVF9TQykgeworCQlpZighKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIG5vdF9pc3N1ZWQpKQorCQkJcHJpbnRrKEVSUl9MRUFEICJjb21tYW5kIHNob3VsZCBub3QgaGF2ZSBiZWVuIGlzc3VlZCB5ZXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBFUlJfTEVBRCAiY29tbWFuZCByZXF1ZXVlZCAtIHJlc2VsZWN0aW9uXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKworCQlET19MT0NLKGZsYWdzKTsKKwkJYXBwZW5kX1NDKCZJU1NVRV9TQywgQ1VSUkVOVF9TQyk7CisJCURPX1VOTE9DSyhmbGFncyk7CisKKwkJQ1VSUkVOVF9TQyA9IE5VTEw7CisJfQorCisJaWYoIURJU0NPTk5FQ1RFRF9TQykgeworCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidW5leHBlY3RlZCBTRUxESSAiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJcmV0dXJuOworCX0KKworCVJFQ09OTl9UQVJHRVQ9LTE7CisKKwlzZWxpZCA9IEdFVFBPUlQoU0VMSUQpICYgfigxIDw8IHNocG50LT50aGlzX2lkKTsKKworCWlmIChzZWxpZD09MCkgeworCQlwcmludGsoImFoYTE1MnglZDogdGFyZ2V0IGlkIHVua25vd24gKCUwMngpXG4iLCBIT1NUTk8sIHNlbGlkKTsKKwkJcmV0dXJuOworCX0KKworCWZvcih0YXJnZXQ9NzsgIShzZWxpZCAmICgxIDw8IHRhcmdldCkpOyB0YXJnZXQtLSkKKwkJOworCisJaWYoc2VsaWQgJiB+KDEgPDwgdGFyZ2V0KSkgeworCQlwcmludGsoImFoYTE1MnglZDogbXVsdGlwbGUgdGFyZ2V0cyByZWNvbm5lY3RlZCAoJTAyeClcbiIsCisJCSAgICAgICBIT1NUTk8sIHNlbGlkKTsKKwl9CisKKworCVNFVFBPUlQoU0NTSUlELCAoc2hwbnQtPnRoaXNfaWQgPDwgT0lEXykgfCB0YXJnZXQpOworCVNFVFBPUlQoU0NTSVNFUSwgMCk7CisKKwlTRVRSQVRFKEhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbdGFyZ2V0XSk7CisKKwlSRUNPTk5fVEFSR0VUPXRhcmdldDsKKwlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidGFyZ2V0ICVkIHJlc2VsZWN0ZWQgKCUwMngpLlxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgdGFyZ2V0LCBzZWxpZCk7Cit9CisKKy8qCisgKiBtZXNzYWdlIGluIHBoYXNlCisgKiAtIGhhbmRsZSBpbml0aWFsIG1lc3NhZ2UgYWZ0ZXIgcmVjb25uZWN0aW9uIHRvIGlkZW50aWZ5CisgKiAgIHJlY29ubmVjdGluZyBuZXh1cworICogLSBxdWV1ZSBjb21tYW5kIG9uIERJU0NPTk5FQ1RFRF9TQyBvbiBESVNDT05ORUNUIG1lc3NhZ2UKKyAqIC0gc2V0IGNvbXBsZXRlZCBmbGFnIG9uIENPTU1BTkQgQ09NUExFVEUKKyAqICAgKG90aGVyIGNvbXBsZXRpdGlvbiBjb2RlIG1vdmVkIHRvIGJ1c2ZyZWVfcnVuKQorICogLSBoYW5kbGUgcmVzcG9uc2UgdG8gU0RUUgorICogLSBjbGVhciBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnRzIG9uIEJVUyBSRVNFVAorICoKKyAqIEZJWE1FOiB3aGF0IGFib3V0IFNBVkUgUE9JTlRFUlMsIFJFU1RPUkUgUE9JTlRFUlM/CisgKgorICovCitzdGF0aWMgdm9pZCBtc2dpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlmb3IoOzspIHsKKwkJaW50IHNzdGF0MSA9IEdFVFBPUlQoU1NUQVQxKTsKKworCQlpZihzc3RhdDEgJiAoUEhBU0VDSEd8UEhBU0VNSVN8QlVTRlJFRSkgfHwgIShzc3RhdDEgJiBSRVFJTklUKSkKKwkJCXJldHVybjsKKworCQlpZihURVNUTE8oU1NUQVQwLFNQSU9SRFkpKSB7CisJCQlEUFJJTlRLKGRlYnVnX21zZ2ksIERFQlVHX0xFQUQgIiFTUElPUkRZXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCXJldHVybjsKKwkJfQkKKworCQlBRERNU0dJKEdFVFBPUlQoU0NTSURBVCkpOworCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX21zZ2kpIHsKKwkJCXByaW50ayhJTkZPX0xFQUQgImluYm91bmQgbWVzc2FnZSAlMDJ4ICIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR0koMCkpOworCQkJcHJpbnRfbXNnKCZNU0dJKDApKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJaWYoIUNVUlJFTlRfU0MpIHsKKwkJCWlmKExBU1RTVEFURSE9c2VsZGkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogbWVzc2FnZSBpbiB3L28gY3VycmVudCBjb21tYW5kIG5vdCBhZnRlciByZXNlbGVjdGlvblxuIiwgSE9TVE5PKTsKKwkJCX0KKworCQkJLyoKKwkgCSAJICogSGFuZGxlIHJlc2VsZWN0aW9uCisJIAkJICovCisJCQlpZighKE1TR0koMCkgJiBJREVOVElGWV9CQVNFKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiB0YXJnZXQgZGlkbid0IGlkZW50aWZ5IGFmdGVyIHJlc2VsZWN0aW9uXG4iLCBIT1NUTk8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlDVVJSRU5UX1NDID0gcmVtb3ZlX2x1bl9TQygmRElTQ09OTkVDVEVEX1NDLCBSRUNPTk5fVEFSR0VULCBNU0dJKDApICYgMHgzZik7CisKKwkJCWlmICghQ1VSUkVOVF9TQykgeworCQkJCXNob3dfcXVldWVzKHNocG50KTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogbm8gZGlzY29ubmVjdGVkIGNvbW1hbmQgZm9yIHRhcmdldCAlZC8lZFxuIiwgSE9TVE5PLCBSRUNPTk5fVEFSR0VULCBNU0dJKDApICYgMHgzZik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAidGFyZ2V0IHJlY29ubmVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKworCQkJQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgPSBNU0dJKDApOworCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICY9IH5kaXNjb25uZWN0ZWQ7CisKKwkJCU1TR0lMRU49MDsKKworCQkJLyogbmV4dCBtZXNzYWdlIGlmIGFueSAqLworCQkJY29udGludWU7CisJCX0gCisKKwkJQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgPSBNU0dJKDApOworCisJCXN3aXRjaCAoTVNHSSgwKSkgeworCQljYXNlIERJU0NPTk5FQ1Q6CisJCQlpZiAoIVJFQ09OTkVDVCkKKwkJCQlwcmludGsoV0FSTl9MRUFEICJ0YXJnZXQgd2FzIG5vdCBhbGxvd2VkIHRvIGRpc2Nvbm5lY3RcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gZGlzY29ubmVjdGVkOworCQkJYnJlYWs7CisKKwkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCQkJaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgY29tcGxldGVkKQorCQkJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAiYWdhaW4gQ09NTUFORCBDT01QTEVURVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBjb21wbGV0ZWQ7CisJCQlicmVhazsKKworCQljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQkJaWYgKFNZTkNORUc9PTEpIHsKKwkJCQlwcmludGsoSU5GT19MRUFEICJTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3Qgd2FzIHJlamVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQlTWU5DTkVHPTI7CS8qIG5lZ290aWF0aW9uIGNvbXBsZXRlZCAqLworCQkJfSBlbHNlCisJCQkJcHJpbnRrKElORk9fTEVBRCAiaW5ib3VuZCBtZXNzYWdlIChNRVNTQUdFIFJFSkVDVClcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQkJaWYoTVNHSUxFTjwyIHx8IE1TR0lMRU48TVNHSSgxKSsyKSB7CisJCQkJLyogbm90IHlldCBjb21wbGV0ZWQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChNU0dJKDIpKSB7CisJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQkJeworCQkJCQlsb25nIHRpY2tzOworCisJCQkJCWlmIChNU0dJKDEpICE9IDMpIHsKKwkJCQkJCXByaW50ayhFUlJfTEVBRCAiU0RUUiBtZXNzYWdlIGxlbmd0aCE9M1xuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmICghSE9TVERBVEEoc2hwbnQpLT5zeW5jaHJvbm91cykKKwkJCQkJCWJyZWFrOworCisJCQkJCXByaW50ayhJTkZPX0xFQUQsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJCQlwcmludF9tc2coJk1TR0koMCkpOworCQkJCQlwcmludGsoIlxuIik7CisKKwkJCQkJdGlja3MgPSAoTVNHSSgzKSAqIDQgKyA0OSkgLyA1MDsKKworCQkJCQlpZiAoc3luY25lZykgeworCQkJCQkJLyogbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwkJCQkJCWlmICh0aWNrcyA+IDkgfHwgTVNHSSg0KSA8IDEgfHwgTVNHSSg0KSA+IDgpIHsKKwkJCQkJCQlBRERNU0dPKE1FU1NBR0VfUkVKRUNUKTsKKwkJCQkJCQlwcmludGsoSU5GT19MRUFEICJyZWNlaXZlZCBTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3QgaW52YWxpZCAtIHJlamVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU1lOQ1JBVEUgfD0gKCh0aWNrcyAtIDIpIDw8IDQpICsgTVNHSSg0KTsKKwkJCQkJfSBlbHNlIGlmICh0aWNrcyA8PSA5ICYmIE1TR0koNCkgPj0gMSkgeworCQkJCQkJQURETVNHTyhFWFRFTkRFRF9NRVNTQUdFKTsKKwkJCQkJCUFERE1TR08oMyk7CisJCQkJCQlBRERNU0dPKEVYVEVOREVEX1NEVFIpOworCQkJCQkJaWYgKHRpY2tzIDwgNCkgeworCQkJCQkJCXRpY2tzID0gNDsKKwkJCQkJCQlBRERNU0dPKDUwKTsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCUFERE1TR08oTVNHSSgzKSk7CisKKwkJCQkJCWlmIChNU0dJKDQpID4gOCkKKwkJCQkJCQlNU0dJKDQpID0gODsKKworCQkJCQkJQURETVNHTyhNU0dJKDQpKTsKKworCQkJCQkJU1lOQ1JBVEUgfD0gKCh0aWNrcyAtIDIpIDw8IDQpICsgTVNHSSg0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHJlcXVlc3RlZCBTRFRSIGlzIHRvbyBzbG93LCBkbyBpdCBhc3luY2hyb25vdXNseSAqLworCQkJCQkJcHJpbnRrKElORk9fTEVBRCAiU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IHRvbyBzbG93IC0gUmVqZWN0aW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQkJCUFERE1TR08oTUVTU0FHRV9SRUpFQ1QpOworCQkJCQl9CisKKwkJCQkJU1lOQ05FRz0yOwkJLyogbmVnb3RpYXRpb24gY29tcGxldGVkICovCisJCQkJCVNFVFJBVEUoU1lOQ1JBVEUpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBCVVNfREVWSUNFX1JFU0VUOgorCQkJCXsKKwkJCQkJaW50IGk7CisKKwkJCQkJZm9yKGk9MDsgaTw4OyBpKyspIHsKKwkJCQkJCUhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbaV09MDsKKwkJCQkJCUhPU1REQVRBKHNocG50KS0+c3luY25lZ1tpXT0wOworCQkJCQl9CisKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUjoKKwkJCWNhc2UgRVhURU5ERURfRVhURU5ERURfSURFTlRJRlk6CisJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQlkZWZhdWx0OgorCQkJCUFERE1TR08oTUVTU0FHRV9SRUpFQ1QpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlNU0dJTEVOPTA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc2dpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihNU0dJTEVOPjApCisJCXByaW50ayhXQVJOX0xFQUQgInRhcmdldCBsZWZ0IGJlZm9yZSBtZXNzYWdlIGNvbXBsZXRlZCAoJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBNU0dJTEVOKTsKKworCWlmIChNU0dPTEVOID4gMCAmJiAhKEdFVFBPUlQoU1NUQVQxKSAmIEJVU0ZSRUUpKSB7CisJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAibXNnbyBwZW5kaW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJU0VUUE9SVChTQ1NJU0lHLCBQX01TR0kgfCBTSUdfQVROTyk7CisJfSAKK30KKworLyoKKyAqIG1lc3NhZ2Ugb3V0IHBoYXNlCisgKgorICovCitzdGF0aWMgdm9pZCBtc2dvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoTVNHT0xFTj09MCkgeworCQlpZigoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgc3luY25lZykgJiYgU1lOQ05FRz09MiAmJiBTWU5DUkFURT09MCkgeworCQkJQURETVNHTyhJREVOVElGWShSRUNPTk5FQ1QsIENVUlJFTlRfU0MtPmRldmljZS0+bHVuKSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoSU5GT19MRUFEICJ1bmV4cGVjdGVkIE1FU1NBR0UgT1VUIHBoYXNlOyByZWplY3RpbmdcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CisJCX0KKwl9CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX21zZ28pIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKERFQlVHX0xFQUQgIm1lc3NhZ2VzKCAiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZm9yIChpPTA7IGk8TVNHT0xFTjsgaSs9cHJpbnRfbXNnKCZNU0dPKGkpKSwgcHJpbnRrKCIgIikpCisJCQk7CisJCXByaW50aygiKVxuIik7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBtZXNzYWdlIG91dCBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgbXNnb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoTVNHT19JPT1NU0dPTEVOKQorCQlEUFJJTlRLKGRlYnVnX21zZ28sIERFQlVHX0xFQUQgIm1lc3NhZ2VzIGFsbCBzZW50ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR09fSSwgTVNHT0xFTik7CisKKwl3aGlsZShNU0dPX0k8TVNHT0xFTikgeworCQlEUFJJTlRLKGRlYnVnX21zZ28sIERFQlVHX0xFQUQgIm1lc3NhZ2UgYnl0ZSAlMDJ4ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR08oTVNHT19JKSwgTVNHT19JLCBNU0dPTEVOKTsKKworCQlpZihURVNUTE8oU1NUQVQwLCBTUElPUkRZKSkgeworCQkJRFBSSU5USyhkZWJ1Z19tc2dvLCBERUJVR19MRUFEICIhU1BJT1JEWVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoTVNHT19JPT1NU0dPTEVOLTEpIHsKKwkJCS8qIExlYXZlIE1FU1NBR0UgT1VUIGFmdGVyIHRyYW5zZmVyICovCisJCQlTRVRQT1JUKFNTVEFUMSwgQ0xSQVROTyk7CisJCX0KKworCisJCWlmIChNU0dPKE1TR09fSSkgJiBJREVOVElGWV9CQVNFKQorCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IGlkZW50aWZpZWQ7CisKKwkJaWYgKE1TR08oTVNHT19JKT09QUJPUlQpCisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gYWJvcnRlZDsKKworCQlpZiAoTVNHTyhNU0dPX0kpPT1CVVNfREVWSUNFX1JFU0VUKQorCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHJlc2V0dGVkOworCisJCVNFVFBPUlQoU0NTSURBVCwgTVNHTyhNU0dPX0krKykpOworCX0KK30KKworc3RhdGljIHZvaWQgbXNnb19lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoTVNHT19JPE1TR09MRU4pIHsKKwkJcHJpbnRrKEVSUl9MRUFEICJtZXNzYWdlIHNlbnQgaW5jb21wbGV0ZWx5ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR09fSSwgTVNHT0xFTik7CisJCWlmKFNZTkNORUc9PTEpIHsKKwkJCXByaW50ayhJTkZPX0xFQUQgIlN5bmNocm9ub3VzIERhdGEgVHJhbnNmZXIgUmVxdWVzdCB3YXMgcmVqZWN0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJU1lOQ05FRz0yOworCQl9CisJfQorCQkKKwlNU0dPX0kgID0gMDsKKwlNU0dPTEVOID0gMDsKK30KKworLyogCisgKiBjb21tYW5kIHBoYXNlCisgKgorICovCitzdGF0aWMgdm9pZCBjbWRfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZiAoQ1VSUkVOVF9TQy0+U0NwLnNlbnRfY29tbWFuZCkgeworCQlwcmludGsoRVJSX0xFQUQgImNvbW1hbmQgYWxyZWFkeSBzZW50XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX0VSUk9SIDw8IDE2KTsKKwkJcmV0dXJuOworCX0KKworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2NtZCkgeworCQlwcmludGsoREVCVUdfTEVBRCAiY21kX2luaXQ6ICIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlwcmludF9jb21tYW5kKENVUlJFTlRfU0MtPmNtbmQpOworCX0KKyNlbmRpZgorCisJQ01EX0k9MDsKK30KKworLyoKKyAqIGNvbW1hbmQgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNtZF9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoQ01EX0k9PUNVUlJFTlRfU0MtPmNtZF9sZW4pIHsKKwkJRFBSSU5USyhkZWJ1Z19jbWQsIERFQlVHX0xFQUQgImNvbW1hbmQgYWxyZWFkeSBjb21wbGV0ZWx5IHNlbnQgKCVkLyVkKSIsIENNRElORk8oQ1VSUkVOVF9TQyksIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKKwkJZGlzcF9wb3J0cyhzaHBudCk7CisJfQorCisJd2hpbGUoQ01EX0k8Q1VSUkVOVF9TQy0+Y21kX2xlbikgeworCQlEUFJJTlRLKGRlYnVnX2NtZCwgREVCVUdfTEVBRCAiY29tbWFuZCBieXRlICUwMnggKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+Y21uZFtDTURfSV0sIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKKworCQlpZihURVNUTE8oU1NUQVQwLCBTUElPUkRZKSkgeworCQkJRFBSSU5USyhkZWJ1Z19jbWQsIERFQlVHX0xFQUQgIiFTUElPUkRZXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVNFVFBPUlQoU0NTSURBVCwgQ1VSUkVOVF9TQy0+Y21uZFtDTURfSSsrXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbWRfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKENNRF9JPENVUlJFTlRfU0MtPmNtZF9sZW4pCisJCXByaW50ayhFUlJfTEVBRCAiY29tbWFuZCBzZW50IGluY29tcGxldGVseSAoJWQvJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBDTURfSSwgQ1VSUkVOVF9TQy0+Y21kX2xlbik7CisJZWxzZQorCQlDVVJSRU5UX1NDLT5TQ3Auc2VudF9jb21tYW5kKys7Cit9CisKKy8qCisgKiBzdGF0dXMgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXR1c19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoVEVTVExPKFNTVEFUMCxTUElPUkRZKSkgeworCQlEUFJJTlRLKGRlYnVnX3N0YXR1cywgREVCVUdfTEVBRCAiIVNQSU9SRFlcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlyZXR1cm47CisJfQorCisJQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyA9IEdFVFBPUlQoU0NTSURBVCk7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYgKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19zdGF0dXMpIHsKKwkJcHJpbnRrKERFQlVHX0xFQUQgImluYm91bmQgc3RhdHVzICUwMnggIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyk7CisJCXByaW50X3N0YXR1cyhDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorfQorCisvKgorICogZGF0YSBpbiBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgZGF0YWlfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlTRVRQT1JUKERNQUNOVFJMMCwgUlNURklGTyk7CisJU0VUUE9SVChETUFDTlRSTDAsIFJTVEZJRk98RU5ETUEpOworCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUlNUQ05UKTsKKwlTRVRQT1JUKFNYRlJDVEwwLCBDSDF8U0NTSUVOfERNQUVOKTsKKworCVNFVFBPUlQoU0lNT0RFMCwgMCk7CisJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lQRVJSIHwgRU5TQ1NJUlNUIHwgRU5QSEFTRU1JUyB8IEVOQlVTRlJFRSk7CisKKwlEQVRBX0xFTj0wOworCURQUklOVEsoZGVidWdfZGF0YWksCisJCURFQlVHX0xFQUQgImRhdGFpX2luaXQ6IHJlcXVlc3RfYnVmZmxlbj0lZCByZXNpZD0lZFxuIiwKKwkJQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+cmVxdWVzdF9idWZmbGVuLCBDVVJSRU5UX1NDLT5yZXNpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIHRoZV90aW1lOworCWludCBmaWZvZGF0YSwgZGF0YV9jb3VudDsKKworCS8qCisJICogbG9vcCB3aGlsZSB0aGUgcGhhc2UgcGVyc2lzdHMgb3IgdGhlIGZpZm9zIGFyZSBub3QgZW1wdHkKKwkgKgorCSAqLworCXdoaWxlKFRFU1RMTyhETUFTVEFULCBJTlRTVEFUKSB8fCBURVNUTE8oRE1BU1RBVCwgREZJRk9FTVApIHx8IFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkpIHsKKwkJLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgc2V0dGluZyB1cAorCQkgKiBTVENOVCB0byB0cmlnZ2VyIEVOU1dSQVAgaW50ZXJydXB0LCBpbnN0ZWFkIG9mCisJCSAqIHBvbGxpbmcgZm9yIERGSUZPRlVMTAorCQkgKi8KKwkJdGhlX3RpbWU9amlmZmllcyArIDEwMCpIWjsKKwkJd2hpbGUoVEVTVExPKERNQVNUQVQsIERGSUZPRlVMTHxJTlRTVEFUKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRoZV90aW1lKSkKKwkJCWJhcnJpZXIoKTsKKworCQlpZihURVNUTE8oRE1BU1RBVCwgREZJRk9GVUxMfElOVFNUQVQpKSB7CisJCQlwcmludGsoRVJSX0xFQUQgImRhdGFpIHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCWRpc3BfcG9ydHMoc2hwbnQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZihURVNUSEkoRE1BU1RBVCwgREZJRk9GVUxMKSkgeworCQkJZmlmb2RhdGEgPSAxMjg7CisJCX0gZWxzZSB7CisJCQl0aGVfdGltZT1qaWZmaWVzICsgMTAwKkhaOworCQkJd2hpbGUoVEVTVExPKFNTVEFUMiwgU0VNUFRZKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRoZV90aW1lKSkKKwkJCQliYXJyaWVyKCk7CisKKwkJCWlmKFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkpIHsKKwkJCQlwcmludGsoRVJSX0xFQUQgImRhdGFpIHNlbXB0eSB0aW1lb3V0IiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQkJZGlzcF9wb3J0cyhzaHBudCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWZpZm9kYXRhID0gR0VUUE9SVChGSUZPU1RBVCk7CisJCX0KKworCQlpZihDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD4wKSB7CisJCQl3aGlsZShmaWZvZGF0YT4wICYmIENVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsPjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlkYXRhX2NvdW50ID0gZmlmb2RhdGE+Q1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPworCQkJCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgOgorCQkJCQkJZmlmb2RhdGE7CisJCQkJZmlmb2RhdGEgLT0gZGF0YV9jb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgCWlmKGRhdGFfY291bnQgJiAxKSB7CisJCQkJCURQUklOVEsoZGVidWdfZGF0YWksIERFQlVHX0xFQUQgIjhiaXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJU0VUUE9SVChETUFDTlRSTDAsIEVORE1BfF84QklUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSpDVVJSRU5UX1NDLT5TQ3AucHRyKysgPSBHRVRQT1JUKERBVEFQT1JUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlEQVRBX0xFTisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJU0VUUE9SVChETUFDTlRSTDAsIEVORE1BKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAl9CisJCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZGF0YV9jb3VudCA+IDEpIHsKKwkJCQkJRFBSSU5USyhkZWJ1Z19kYXRhaSwgREVCVUdfTEVBRCAiMTZiaXQoJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBkYXRhX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRhdGFfY291bnQgPj49IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpbnN3KERBVEFQT1JULCBDVVJSRU5UX1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgICs9IDIgKiBkYXRhX2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gMiAqIGRhdGFfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlEQVRBX0xFTiAgICAgICAgICAgICAgICAgICAgICArPSAyICogZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAl9CisJCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw9PTAgJiYgQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgID0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJCX0gCisgICAgICAgICAgICAgICAgCX0KKwkJfSBlbHNlIGlmKGZpZm9kYXRhPjApIHsgCisJCQlwcmludGsoRVJSX0xFQUQgIm5vIGJ1ZmZlcnMgbGVmdCBmb3IgJWQoJWQpIGJ5dGVzIChkYXRhIG92ZXJydW4hPylcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIGZpZm9kYXRhLCBHRVRQT1JUKEZJRk9TVEFUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUF8XzhCSVQpOworCQkJd2hpbGUoZmlmb2RhdGE+MCkgeworCQkJCWludCBkYXRhOworCQkJCWRhdGE9R0VUUE9SVChEQVRBUE9SVCk7CisJCQkJRFBSSU5USyhkZWJ1Z19kYXRhaSwgREVCVUdfTEVBRCAiZGF0YT0lMDJ4XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBkYXRhKTsKKwkJCQlmaWZvZGF0YS0tOworCQkJCURBVEFfTEVOKys7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUF8XzhCSVQpOworCQl9CisJfQorCisJaWYoVEVTVExPKERNQVNUQVQsIElOVFNUQVQpIHx8CisJICAgVEVTVExPKERNQVNUQVQsIERGSUZPRU1QKSB8fAorCSAgIFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkgfHwKKwkgICBHRVRQT1JUKEZJRk9TVEFUKT4wKSB7CisJICAgCS8qCisJCSAqIHNvbWV0aGluZyB3ZW50IHdyb25nLCBpZiB0aGVyZSdzIHNvbWV0aGluZyBsZWZ0IGluIHRoZSBmaWZvcworCQkgKiBvciB0aGUgcGhhc2UgZGlkbid0IGNoYW5nZQorCQkgKi8KKwkJcHJpbnRrKEVSUl9MRUFEICJmaWZvcyBzaG91bGQgYmUgZW1wdHkgYW5kIHBoYXNlIHNob3VsZCBoYXZlIGNoYW5nZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlkaXNwX3BvcnRzKHNocG50KTsKKwl9CisKKwlpZihEQVRBX0xFTiE9R0VUU1RDTlQoKSkgeworCQlwcmludGsoRVJSX0xFQUQKKwkJICAgICAgICJtYW51YWwgdHJhbnNmZXIgY291bnQgZGlmZmVycyBmcm9tIGF1dG9tYXRpYyAoY291bnQ9JWQ7c3RjbnQ9JWQ7ZGlmZj0lZDtmaWZvc3RhdD0lZCkiLAorCQkgICAgICAgQ01ESU5GTyhDVVJSRU5UX1NDKSwgREFUQV9MRU4sIEdFVFNUQ05UKCksIEdFVFNUQ05UKCktREFUQV9MRU4sIEdFVFBPUlQoRklGT1NUQVQpKTsKKwkJZGlzcF9wb3J0cyhzaHBudCk7CisJCW1kZWxheSgxMDAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYXRhaV9lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJQ1VSUkVOVF9TQy0+cmVzaWQgLT0gR0VUU1RDTlQoKTsKKworCURQUklOVEsoZGVidWdfZGF0YWksCisJCURFQlVHX0xFQUQgImRhdGFpX2VuZDogcmVxdWVzdF9idWZmbGVuPSVkIHJlc2lkPSVkIHN0Y250PSVkXG4iLAorCQlDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sIENVUlJFTlRfU0MtPnJlc2lkLCBHRVRTVENOVCgpKTsKKworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJTVENOVCk7CisJU0VUUE9SVChETUFDTlRSTDAsIDApOworfQorCisvKgorICogZGF0YSBvdXQgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRhdGFvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJU0VUUE9SVChETUFDTlRSTDAsIFdSSVRFX1JFQUQgfCBSU1RGSUZPKTsKKwlTRVRQT1JUKERNQUNOVFJMMCwgV1JJVEVfUkVBRCB8IEVORE1BKTsKKworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJTVENOVCk7CisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfFNDU0lFTnxETUFFTik7CisKKwlTRVRQT1JUKFNJTU9ERTAsIDApOworCVNFVFBPUlQoU0lNT0RFMSwgRU5TQ1NJUEVSUiB8IEVOU0NTSVJTVCB8IEVOUEhBU0VNSVMgfCBFTkJVU0ZSRUUgKTsKKworCURBVEFfTEVOID0gQ1VSUkVOVF9TQy0+cmVzaWQ7CisKKwlEUFJJTlRLKGRlYnVnX2RhdGFvLAorCQlERUJVR19MRUFEICJkYXRhb19pbml0OiByZXF1ZXN0X2J1ZmZsZW49JWQ7IHJlc2lkPSVkXG4iLAorCQlDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sIENVUlJFTlRfU0MtPnJlc2lkKTsKK30KKworc3RhdGljIHZvaWQgZGF0YW9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCXVuc2lnbmVkIGxvbmcgdGhlX3RpbWU7CisJaW50IGRhdGFfY291bnQ7CisKKwkvKiB1bnRpbCBwaGFzZSBjaGFuZ2VzIG9yIGFsbCBkYXRhIHNlbnQgKi8KKwl3aGlsZShURVNUTE8oRE1BU1RBVCwgSU5UU1RBVCkgJiYgQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw+MCkgeworCQlkYXRhX2NvdW50ID0gMTI4OworCQlpZihkYXRhX2NvdW50ID4gQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwpCisJCQlkYXRhX2NvdW50PUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCisJCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUCkpIHsKKwkJCXByaW50ayhFUlJfTEVBRCAiZGF0YW8gZmlmbyBub3QgZW1wdHkgKCVkKSIsIENNRElORk8oQ1VSUkVOVF9TQyksIEdFVFBPUlQoRklGT1NUQVQpKTsKKwkJCWRpc3BfcG9ydHMoc2hwbnQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZihkYXRhX2NvdW50ICYgMSkgeworCQkJU0VUUE9SVChETUFDTlRSTDAsV1JJVEVfUkVBRHxFTkRNQXxfOEJJVCk7CisJCQlTRVRQT1JUKERBVEFQT1JULCAqQ1VSUkVOVF9TQy0+U0NwLnB0cisrKTsKKwkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsLS07CisJCQlDVVJSRU5UX1NDLT5yZXNpZC0tOworCQkJU0VUUE9SVChETUFDTlRSTDAsV1JJVEVfUkVBRHxFTkRNQSk7CisJCX0KKworCQlpZihkYXRhX2NvdW50ID4gMSkgeworCQkJZGF0YV9jb3VudCA+Pj0gMTsKKwkJCW91dHN3KERBVEFQT1JULCBDVVJSRU5UX1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgICs9IDIgKiBkYXRhX2NvdW50OworCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gMiAqIGRhdGFfY291bnQ7CisJCQlDVVJSRU5UX1NDLT5yZXNpZCAgICAgICAgICAgICAtPSAyICogZGF0YV9jb3VudDsKKwkgIAl9CisKKwkJaWYoQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw9PTAgJiYgQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw+MCkgeworCQkJLyogYWR2YW5jZSB0byBuZXh0IGJ1ZmZlciAqLworCQkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLTsKKwkJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXIrKzsKKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgID0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKTsKKwkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQl9CisKKwkJdGhlX3RpbWU9amlmZmllcyArIDEwMCpIWjsKKwkJd2hpbGUoVEVTVExPKERNQVNUQVQsIERGSUZPRU1QfElOVFNUQVQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsdGhlX3RpbWUpKQorCQkJYmFycmllcigpOworCisJCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUHxJTlRTVEFUKSkgeworCQkJcHJpbnRrKEVSUl9MRUFEICJkYXRhb3V0IHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCWRpc3BfcG9ydHMoc2hwbnQpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihURVNUTE8oRE1BU1RBVCwgREZJRk9FTVApKSB7CisJCWludCBkYXRhX2NvdW50ID0gKERBVEFfTEVOIC0gQ1VSUkVOVF9TQy0+cmVzaWQpIC0gR0VUU1RDTlQoKTsKKworCQlEUFJJTlRLKGRlYnVnX2RhdGFvLCBERUJVR19MRUFEICJkYXRhbzogJWQgYnl0ZXMgdG8gcmVzZW5kICglZCB3cml0dGVuLCAlZCB0cmFuc2ZlcnJlZClcbiIsCisJCQlDTURJTkZPKENVUlJFTlRfU0MpLAorCQkJZGF0YV9jb3VudCwKKwkJCURBVEFfTEVOLUNVUlJFTlRfU0MtPnJlc2lkLAorCQkJR0VUU1RDTlQoKSk7CisKKwkJQ1VSUkVOVF9TQy0+cmVzaWQgKz0gZGF0YV9jb3VudDsKKworCQlpZihDVVJSRU5UX1NDLT51c2Vfc2cpIHsKKwkJCWRhdGFfY291bnQgLT0gQ1VSUkVOVF9TQy0+U0NwLnB0ciAtIFNHX0FERFJFU1MoQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcik7CisJCQl3aGlsZShkYXRhX2NvdW50PjApIHsKKwkJCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLS07CisJCQkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwrKzsKKwkJCQlkYXRhX2NvdW50IC09IENVUlJFTlRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJCX0KKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgID0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKSAtIGRhdGFfY291bnQ7CisJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IENVUlJFTlRfU0MtPlNDcC5idWZmZXItPmxlbmd0aCArIGRhdGFfY291bnQ7CisJCX0gZWxzZSB7CisJCQlDVVJSRU5UX1NDLT5TQ3AucHRyICAgICAgICAgICAtPSBkYXRhX2NvdW50OworCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgKz0gZGF0YV9jb3VudDsKKwkJfQorCX0KKworCURQUklOVEsoZGVidWdfZGF0YW8sIERFQlVHX0xFQUQgImRhdGFvX2VuZDogcmVxdWVzdF9idWZmbGVuPSVkOyByZXNpZD0lZDsgc3RjbnQ9JWRcbiIsCisJCUNNRElORk8oQ1VSUkVOVF9TQyksCisJCUNVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbiwKKwkJQ1VSUkVOVF9TQy0+cmVzaWQsCisJCUdFVFNUQ05UKCkpOworCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUkNIMXxDTFJTVENOVCk7CisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxKTsKKworCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKK30KKworLyoKKyAqIGZpZ3VyZSBvdXQgd2hhdCBzdGF0ZSB3ZSdyZSBpbgorICoKKyAqLworc3RhdGljIGludCB1cGRhdGVfc3RhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaW50IGRhdGFwaGFzZT0wOworCXVuc2lnbmVkIGludCBzdGF0MCA9IEdFVFBPUlQoU1NUQVQwKTsKKwl1bnNpZ25lZCBpbnQgc3RhdDEgPSBHRVRQT1JUKFNTVEFUMSk7CisKKwlQUkVWU1RBVEUgPSBTVEFURTsKKwlTVEFURT11bmtub3duOworCisJaWYoc3RhdDEgJiBTQ1NJUlNUSSkgeworCQlTVEFURT1yc3RpOworCQlTRVRQT1JUKFNDU0lTRVEsMCk7CisJCVNFVFBPUlQoU1NUQVQxLFNDU0lSU1RJKTsKKyAgCX0gZWxzZSBpZihzdGF0MCAmIFNFTERJICYmIFBSRVZTVEFURT09YnVzZnJlZSkgeworCQlTVEFURT1zZWxkaTsKKwl9IGVsc2UgaWYoc3RhdDAgJiBTRUxETyAmJiBDVVJSRU5UX1NDICYmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpKSB7CisJCVNUQVRFPXNlbGRvOworCX0gZWxzZSBpZihzdGF0MSAmIFNFTFRPKSB7CisJCVNUQVRFPXNlbHRvOworCX0gZWxzZSBpZihzdGF0MSAmIEJVU0ZSRUUpIHsKKwkJU1RBVEU9YnVzZnJlZTsKKwkJU0VUUE9SVChTU1RBVDEsQlVTRlJFRSk7CisJfSBlbHNlIGlmKHN0YXQxICYgU0NTSVBFUlIpIHsKKwkJU1RBVEU9cGFyZXJyOworCQlTRVRQT1JUKFNTVEFUMSxTQ1NJUEVSUik7CisJfSBlbHNlIGlmKHN0YXQxICYgUkVRSU5JVCkgeworCQlzd2l0Y2goR0VUUE9SVChTQ1NJU0lHKSAmIFBfTUFTSykgeworCQljYXNlIFBfTVNHSToJU1RBVEU9bXNnaTsJYnJlYWs7CisJCWNhc2UgUF9NU0dPOglTVEFURT1tc2dvOwlicmVhazsKKwkJY2FzZSBQX0RBVEFPOglTVEFURT1kYXRhbzsJYnJlYWs7CisJCWNhc2UgUF9EQVRBSToJU1RBVEU9ZGF0YWk7CWJyZWFrOworCQljYXNlIFBfU1RBVFVTOglTVEFURT1zdGF0dXM7CWJyZWFrOworCQljYXNlIFBfQ01EOglTVEFURT1jbWQ7CWJyZWFrOworCQl9CisJCWRhdGFwaGFzZT0xOworCX0KKworCWlmKChzdGF0MCAmIFNFTERJKSAmJiBTVEFURSE9c2VsZGkgJiYgIWRhdGFwaGFzZSkgeworCQlwcmludGsoSU5GT19MRUFEICJyZXNlbGVjdGlvbiBtaXNzZWQ/IiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCWRpc3BfcG9ydHMoc2hwbnQpOworCX0KKworCWlmKFNUQVRFIT1QUkVWU1RBVEUpIHsKKwkJTEFTVFNUQVRFPVBSRVZTVEFURTsKKwl9CisKKwlyZXR1cm4gZGF0YXBoYXNlOworfQorCisvKgorICogaGFuZGxlIHBhcml0eSBlcnJvcgorICoKKyAqIEZJWE1FOiBpbiB3aGljaCBwaGFzZT8KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHBhcmVycl9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJcHJpbnRrKEVSUl9MRUFEICJwYXJpdHkgZXJyb3JcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCWRvbmUoc2hwbnQsIERJRF9QQVJJVFkgPDwgMTYpOworfQorCisvKgorICogaGFuZGxlIHJlc2V0IGluCisgKgorICovCitzdGF0aWMgdm9pZCByc3RpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlTY3NpX0NtbmQgKnB0cjsKKworCXByaW50ayhLRVJOX05PVElDRSAiYWhhMTUyeCVkOiBzY3NpIHJlc2V0IGluXG4iLCBIT1NUTk8pOworCQorCXB0cj1ESVNDT05ORUNURURfU0M7CisJd2hpbGUocHRyKSB7CisJCVNjc2lfQ21uZCAqbmV4dCA9IFNDTkVYVChwdHIpOworCisJCWlmICghcHRyLT5kZXZpY2UtPnNvZnRfcmVzZXQpIHsKKwkJCXJlbW92ZV9TQygmRElTQ09OTkVDVEVEX1NDLCBwdHIpOworCisJCQlrZnJlZShwdHItPmhvc3Rfc2NyaWJibGUpOworCQkJcHRyLT5ob3N0X3NjcmliYmxlPU5VTEw7CisKKwkJCXB0ci0+cmVzdWx0ID0gIERJRF9SRVNFVCA8PCAxNjsKKwkJCXB0ci0+c2NzaV9kb25lKHB0cik7CisJCX0KKworCQlwdHIgPSBuZXh0OworCX0KKworCWlmKENVUlJFTlRfU0MgJiYgIUNVUlJFTlRfU0MtPmRldmljZS0+c29mdF9yZXNldCkKKwkJZG9uZShzaHBudCwgRElEX1JFU0VUIDw8IDE2ICk7Cit9CisKKworLyoKKyAqIGJvdHRvbS1oYWxmIGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlzX2NvbXBsZXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWludCBkYXRhcGhhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcGVuZGluZzsKKworCURPX0xPQ0soZmxhZ3MpOworCWlmKEhPU1REQVRBKHNocG50KS0+aW5faW50cikgeworCQlET19VTkxPQ0soZmxhZ3MpOworCQkvKiBhaGExNTJ4X2Vycm9yIG5ldmVyIHJldHVybnMuLiAqLworCQlhaGExNTJ4X2Vycm9yKHNocG50LCAiYm90dG9tLWhhbGYgYWxyZWFkeSBydW5uaW5nIT8iKTsKKwl9CisJSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKys7CisKKwkvKgorCSAqIGxvb3Agd2hpbGUgdGhlcmUgYXJlIGludGVycnVwdCBjb25kaXRpb25zIHBlbmRpbmcKKwkgKgorCSAqLworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CisJCURPX1VOTE9DSyhmbGFncyk7CisKKwkJZGF0YXBoYXNlPXVwZGF0ZV9zdGF0ZShzaHBudCk7CisKKwkJRFBSSU5USyhkZWJ1Z19waGFzZXMsIExFQUQgInN0YXJ0ICVzICVzKCVzKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgc3RhdGVzW1NUQVRFXS5uYW1lLCBzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lLCBzdGF0ZXNbTEFTVFNUQVRFXS5uYW1lKTsKKworCQkvKgorCQkgKiBlbmQgcHJldmlvdXMgc3RhdGUKKwkJICoKKwkJICovCisJCWlmKFBSRVZTVEFURSE9U1RBVEUgJiYgc3RhdGVzW1BSRVZTVEFURV0uZW5kKQorCQkJc3RhdGVzW1BSRVZTVEFURV0uZW5kKHNocG50KTsKKworCQkvKgorCQkgKiBkaXNhYmxlIFNQSU8gbW9kZSBpZiBwcmV2aW91cyBwaGFzZSB1c2VkIGl0CisJCSAqIGFuZCB0aGlzIG9uZSBkb2Vzbid0CisJCSAqCisJCSAqLworCQlpZihzdGF0ZXNbUFJFVlNUQVRFXS5zcGlvICYmICFzdGF0ZXNbU1RBVEVdLnNwaW8pIHsKKwkJCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CisJCQlTRVRQT1JUKERNQUNOVFJMMCwgMCk7CisJCQlpZihDVVJSRU5UX1NDKQorCQkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+c3Bpb3JkeTsKKwkJfQorCisJCS8qCisJCSAqIGFjY2VwdCBjdXJyZW50IGRhdGFwaGFzZSBwaGFzZQorCQkgKgorCQkgKi8KKwkJaWYoZGF0YXBoYXNlKSB7CisJCQlTRVRQT1JUKFNTVEFUMCwgUkVRSU5JVCk7CisJCQlTRVRQT1JUKFNDU0lTSUcsIEdFVFBPUlQoU0NTSVNJRykgJiBQX01BU0spOworCQkJU0VUUE9SVChTU1RBVDEsIFBIQVNFQ0hHKTsgIAorCQl9CisJCQorCQkvKgorCQkgKiBlbmFibGUgU1BJTyBtb2RlIGlmIHByZXZpb3VzIGRpZG4ndCB1c2UgaXQKKwkJICogYW5kIHRoaXMgb25lIGRvZXMKKwkJICoKKwkJICovCisJCWlmKCFzdGF0ZXNbUFJFVlNUQVRFXS5zcGlvICYmIHN0YXRlc1tTVEFURV0uc3BpbykgeworCQkJU0VUUE9SVChETUFDTlRSTDAsIDApOworCQkJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfFNQSU9FTik7CisJCQlpZihDVVJSRU5UX1NDKQorCQkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBzcGlvcmR5OworCQl9CisJCQorCQkvKgorCQkgKiBpbml0aWFsaXplIGZvciBuZXcgc3RhdGUKKwkJICoKKwkJICovCisJCWlmKFBSRVZTVEFURSE9U1RBVEUgJiYgc3RhdGVzW1NUQVRFXS5pbml0KQorCQkJc3RhdGVzW1NUQVRFXS5pbml0KHNocG50KTsKKwkJCisJCS8qCisJCSAqIGhhbmRsZSBjdXJyZW50IHN0YXRlCisJCSAqCisJCSAqLworCQlpZihzdGF0ZXNbU1RBVEVdLnJ1bikKKwkJCXN0YXRlc1tTVEFURV0ucnVuKHNocG50KTsKKwkJZWxzZQorCQkJcHJpbnRrKEVSUl9MRUFEICJ1bmV4cGVjdGVkIHN0YXRlICgleClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIFNUQVRFKTsKKwkJCisJCS8qCisJCSAqIHNldHVwIGNvbnRyb2xsZXIgdG8gaW50ZXJydXB0IG9uCisJCSAqIHRoZSBuZXh0IGV4cGVjdGVkIGNvbmRpdGlvbiBhbmQKKwkJICogbG9vcCBpZiBpdCdzIGFscmVhZHkgdGhlcmUKKwkJICoKKwkJICovCisJCURPX0xPQ0soZmxhZ3MpOworCQlwZW5kaW5nPXNldHVwX2V4cGVjdGVkX2ludGVycnVwdHMoc2hwbnQpOworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlIT1NUREFUQShzaHBudCktPmNvdW50W1NUQVRFXSsrOworCQlpZihQUkVWU1RBVEUhPVNUQVRFKQorCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudF90cmFuc1tTVEFURV0rKzsKKwkJSE9TVERBVEEoc2hwbnQpLT50aW1lW1NUQVRFXSArPSBqaWZmaWVzLXN0YXJ0OworI2VuZGlmCisKKwkJRFBSSU5USyhkZWJ1Z19waGFzZXMsIExFQUQgImVuZCAlcyAlcyglcylcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIHN0YXRlc1tTVEFURV0ubmFtZSwgc3RhdGVzW1BSRVZTVEFURV0ubmFtZSwgc3RhdGVzW0xBU1RTVEFURV0ubmFtZSk7CisJfSB3aGlsZShwZW5kaW5nKTsKKworCS8qCisJICogZW5hYmxlIGludGVycnVwdHMgYW5kIGxlYXZlIGJvdHRvbS1oYWxmCisJICoKKwkgKi8KKwlIT1NUREFUQShzaHBudCktPmluX2ludHItLTsKKwlTRVRCSVRTKERNQUNOVFJMMCwgSU5URU4pOworCURPX1VOTE9DSyhmbGFncyk7Cit9CisKKworLyogCisgKiBEdW1wIHRoZSBjdXJyZW50IGRyaXZlciBzdGF0dXMgYW5kIHBhbmljCisgKi8KK3N0YXRpYyB2b2lkIGFoYTE1MnhfZXJyb3Ioc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGNoYXIgKm1zZykKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAiXG5haGExNTJ4JWQ6ICVzXG4iLCBIT1NUTk8sIG1zZyk7CisJc2hvd19xdWV1ZXMoc2hwbnQpOworCXBhbmljKCJhaGExNTJ4IHBhbmljXG4iKTsKK30KKworLyoKKyAqIERpc3BsYXkgcmVnaXN0ZXJzIG9mIEFJQy02MjYwCisgKi8KK3N0YXRpYyB2b2lkIGRpc3BfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWludCBzOworCisJcHJpbnRrKCJcbiVzOiAlcyglcykgIiwKKwkJQ1VSUkVOVF9TQyA/ICJidXN5IiA6ICJ3YWl0aW5nIiwKKwkJc3RhdGVzW1NUQVRFXS5uYW1lLAorCQlzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lKTsKKworCXMgPSBHRVRQT1JUKFNDU0lTRVEpOworCXByaW50aygiU0NTSVNFUSggIik7CisJaWYgKHMgJiBURU1PREVPKQorCQlwcmludGsoIlRBUkdFVCBNT0RFICIpOworCWlmIChzICYgRU5TRUxPKQorCQlwcmludGsoIlNFTE8gIik7CisJaWYgKHMgJiBFTlNFTEkpCisJCXByaW50aygiU0VMSSAiKTsKKwlpZiAocyAmIEVOUkVTRUxJKQorCQlwcmludGsoIlJFU0VMSSAiKTsKKwlpZiAocyAmIEVOQVVUT0FUTk8pCisJCXByaW50aygiQVVUT0FUTk8gIik7CisJaWYgKHMgJiBFTkFVVE9BVE5JKQorCQlwcmludGsoIkFVVE9BVE5JICIpOworCWlmIChzICYgRU5BVVRPQVROUCkKKwkJcHJpbnRrKCJBVVRPQVROUCAiKTsKKwlpZiAocyAmIFNDU0lSU1RPKQorCQlwcmludGsoIlNDU0lSU1RPICIpOworCXByaW50aygiKTsiKTsKKworCXByaW50aygiIFNDU0lTSUcoIik7CisJcyA9IEdFVFBPUlQoU0NTSVNJRyk7CisJc3dpdGNoIChzICYgUF9NQVNLKSB7CisJY2FzZSBQX0RBVEFPOgorCQlwcmludGsoIkRBVEEgT1VUIik7CisJCWJyZWFrOworCWNhc2UgUF9EQVRBSToKKwkJcHJpbnRrKCJEQVRBIElOIik7CisJCWJyZWFrOworCWNhc2UgUF9DTUQ6CisJCXByaW50aygiQ09NTUFORCIpOworCQlicmVhazsKKwljYXNlIFBfU1RBVFVTOgorCQlwcmludGsoIlNUQVRVUyIpOworCQlicmVhazsKKwljYXNlIFBfTVNHTzoKKwkJcHJpbnRrKCJNRVNTQUdFIE9VVCIpOworCQlicmVhazsKKwljYXNlIFBfTVNHSToKKwkJcHJpbnRrKCJNRVNTQUdFIElOIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiKmludmFsaWQqIik7CisJCWJyZWFrOworCX0KKworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIklOVFNUQVQgKCVzKTsgIiwgVEVTVEhJKERNQVNUQVQsIElOVFNUQVQpID8gImhpIiA6ICJsbyIpOworCisJcHJpbnRrKCJTU1RBVCggIik7CisJcyA9IEdFVFBPUlQoU1NUQVQwKTsKKwlpZiAocyAmIFRBUkdFVCkKKwkJcHJpbnRrKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJcHJpbnRrKCJTRUxETyAiKTsKKwlpZiAocyAmIFNFTERJKQorCQlwcmludGsoIlNFTERJICIpOworCWlmIChzICYgU0VMSU5HTykKKwkJcHJpbnRrKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCXByaW50aygiU1dSQVAgIik7CisJaWYgKHMgJiBTRE9ORSkKKwkJcHJpbnRrKCJTRE9ORSAiKTsKKwlpZiAocyAmIFNQSU9SRFkpCisJCXByaW50aygiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCXByaW50aygiRE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMSk7CisJaWYgKHMgJiBTRUxUTykKKwkJcHJpbnRrKCJTRUxUTyAiKTsKKwlpZiAocyAmIEFUTlRBUkcpCisJCXByaW50aygiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlwcmludGsoIlNDU0lSU1RJICIpOworCWlmIChzICYgUEhBU0VNSVMpCisJCXByaW50aygiUEhBU0VNSVMgIik7CisJaWYgKHMgJiBCVVNGUkVFKQorCQlwcmludGsoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJcHJpbnRrKCJTQ1NJUEVSUiAiKTsKKwlpZiAocyAmIFBIQVNFQ0hHKQorCQlwcmludGsoIlBIQVNFQ0hHICIpOworCWlmIChzICYgUkVRSU5JVCkKKwkJcHJpbnRrKCJSRVFJTklUICIpOworCXByaW50aygiKTsgIik7CisKKworCXByaW50aygiU1NUQVQoICIpOworCisJcyA9IEdFVFBPUlQoU1NUQVQwKSAmIEdFVFBPUlQoU0lNT0RFMCk7CisKKwlpZiAocyAmIFRBUkdFVCkKKwkJcHJpbnRrKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJcHJpbnRrKCJTRUxETyAiKTsKKwlpZiAocyAmIFNFTERJKQorCQlwcmludGsoIlNFTERJICIpOworCWlmIChzICYgU0VMSU5HTykKKwkJcHJpbnRrKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCXByaW50aygiU1dSQVAgIik7CisJaWYgKHMgJiBTRE9ORSkKKwkJcHJpbnRrKCJTRE9ORSAiKTsKKwlpZiAocyAmIFNQSU9SRFkpCisJCXByaW50aygiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCXByaW50aygiRE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMSkgJiBHRVRQT1JUKFNJTU9ERTEpOworCisJaWYgKHMgJiBTRUxUTykKKwkJcHJpbnRrKCJTRUxUTyAiKTsKKwlpZiAocyAmIEFUTlRBUkcpCisJCXByaW50aygiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlwcmludGsoIlNDU0lSU1RJICIpOworCWlmIChzICYgUEhBU0VNSVMpCisJCXByaW50aygiUEhBU0VNSVMgIik7CisJaWYgKHMgJiBCVVNGUkVFKQorCQlwcmludGsoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJcHJpbnRrKCJTQ1NJUEVSUiAiKTsKKwlpZiAocyAmIFBIQVNFQ0hHKQorCQlwcmludGsoIlBIQVNFQ0hHICIpOworCWlmIChzICYgUkVRSU5JVCkKKwkJcHJpbnRrKCJSRVFJTklUICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIlNYRlJDVEwwKCAiKTsKKworCXMgPSBHRVRQT1JUKFNYRlJDVEwwKTsKKwlpZiAocyAmIFNDU0lFTikKKwkJcHJpbnRrKCJTQ1NJRU4gIik7CisJaWYgKHMgJiBETUFFTikKKwkJcHJpbnRrKCJETUFFTiAiKTsKKwlpZiAocyAmIENIMSkKKwkJcHJpbnRrKCJDSDEgIik7CisJaWYgKHMgJiBDTFJTVENOVCkKKwkJcHJpbnRrKCJDTFJTVENOVCAiKTsKKwlpZiAocyAmIFNQSU9FTikKKwkJcHJpbnRrKCJTUElPRU4gIik7CisJaWYgKHMgJiBDTFJDSDEpCisJCXByaW50aygiQ0xSQ0gxICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIlNJR05BTCggIik7CisKKwlzID0gR0VUUE9SVChTQ1NJU0lHKTsKKwlpZiAocyAmIFNJR19BVE5JKQorCQlwcmludGsoIkFUTkkgIik7CisJaWYgKHMgJiBTSUdfU0VMSSkKKwkJcHJpbnRrKCJTRUxJICIpOworCWlmIChzICYgU0lHX0JTWUkpCisJCXByaW50aygiQlNZSSAiKTsKKwlpZiAocyAmIFNJR19SRVFJKQorCQlwcmludGsoIlJFUUkgIik7CisJaWYgKHMgJiBTSUdfQUNLSSkKKwkJcHJpbnRrKCJBQ0tJICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIlNFTElEICglMDJ4KSwgIiwgR0VUUE9SVChTRUxJRCkpOworCisJcHJpbnRrKCJTVENOVCAoJWQpLCAiLCBHRVRTVENOVCgpKTsKKwkKKwlwcmludGsoIlNTVEFUMiggIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDIpOworCWlmIChzICYgU09GRlNFVCkKKwkJcHJpbnRrKCJTT0ZGU0VUICIpOworCWlmIChzICYgU0VNUFRZKQorCQlwcmludGsoIlNFTVBUWSAiKTsKKwlpZiAocyAmIFNGVUxMKQorCQlwcmludGsoIlNGVUxMICIpOworCXByaW50aygiKTsgU0ZDTlQgKCVkKTsgIiwgcyAmIChTRlVMTCB8IFNGQ05UKSk7CisKKwlzID0gR0VUUE9SVChTU1RBVDMpOworCXByaW50aygiU0NTSUNOVCAoJWQpLCBPRkZDTlQoJWQpLCAiLCAocyAmIDB4ZjApID4+IDQsIHMgJiAweDBmKTsKKworCXByaW50aygiU1NUQVQ0KCAiKTsKKwlzID0gR0VUUE9SVChTU1RBVDQpOworCWlmIChzICYgU1lOQ0VSUikKKwkJcHJpbnRrKCJTWU5DRVJSICIpOworCWlmIChzICYgRldFUlIpCisJCXByaW50aygiRldFUlIgIik7CisJaWYgKHMgJiBGUkVSUikKKwkJcHJpbnRrKCJGUkVSUiAiKTsKKwlwcmludGsoIik7ICIpOworCisJcHJpbnRrKCJETUFDTlRSTDAoICIpOworCXMgPSBHRVRQT1JUKERNQUNOVFJMMCk7CisJcHJpbnRrKCIlcyAiLCBzICYgXzhCSVQgPyAiOEJJVCIgOiAiMTZCSVQiKTsKKwlwcmludGsoIiVzICIsIHMgJiBETUEgPyAiRE1BIiA6ICJQSU8iKTsKKwlwcmludGsoIiVzICIsIHMgJiBXUklURV9SRUFEID8gIldSSVRFIiA6ICJSRUFEIik7CisJaWYgKHMgJiBFTkRNQSkKKwkJcHJpbnRrKCJFTkRNQSAiKTsKKwlpZiAocyAmIElOVEVOKQorCQlwcmludGsoIklOVEVOICIpOworCWlmIChzICYgUlNURklGTykKKwkJcHJpbnRrKCJSU1RGSUZPICIpOworCWlmIChzICYgU1dJTlQpCisJCXByaW50aygiU1dJTlQgIik7CisJcHJpbnRrKCIpOyAiKTsKKworCXByaW50aygiRE1BU1RBVCggIik7CisJcyA9IEdFVFBPUlQoRE1BU1RBVCk7CisJaWYgKHMgJiBBVERPTkUpCisJCXByaW50aygiQVRET05FICIpOworCWlmIChzICYgV09SRFJEWSkKKwkJcHJpbnRrKCJXT1JEUkRZICIpOworCWlmIChzICYgREZJRk9GVUxMKQorCQlwcmludGsoIkRGSUZPRlVMTCAiKTsKKwlpZiAocyAmIERGSUZPRU1QKQorCQlwcmludGsoIkRGSUZPRU1QICIpOworCXByaW50aygiKVxuIik7CisjZW5kaWYKK30KKworLyoKKyAqIGRpc3BsYXkgZW5hYmxlZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIGRpc3BfZW5pbnRyKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWludCBzOworCisJcHJpbnRrKEtFUk5fREVCVUcgImVuYWJsZWQgaW50ZXJydXB0cyAoICIpOworCisJcyA9IEdFVFBPUlQoU0lNT0RFMCk7CisJaWYgKHMgJiBFTlNFTERPKQorCQlwcmludGsoIkVOU0VMRE8gIik7CisJaWYgKHMgJiBFTlNFTERJKQorCQlwcmludGsoIkVOU0VMREkgIik7CisJaWYgKHMgJiBFTlNFTElOR08pCisJCXByaW50aygiRU5TRUxJTkdPICIpOworCWlmIChzICYgRU5TV1JBUCkKKwkJcHJpbnRrKCJFTlNXUkFQICIpOworCWlmIChzICYgRU5TRE9ORSkKKwkJcHJpbnRrKCJFTlNET05FICIpOworCWlmIChzICYgRU5TUElPUkRZKQorCQlwcmludGsoIkVOU1BJT1JEWSAiKTsKKwlpZiAocyAmIEVORE1BRE9ORSkKKwkJcHJpbnRrKCJFTkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUxKTsKKwlpZiAocyAmIEVOU0VMVElNTykKKwkJcHJpbnRrKCJFTlNFTFRJTU8gIik7CisJaWYgKHMgJiBFTkFUTlRBUkcpCisJCXByaW50aygiRU5BVE5UQVJHICIpOworCWlmIChzICYgRU5QSEFTRU1JUykKKwkJcHJpbnRrKCJFTlBIQVNFTUlTICIpOworCWlmIChzICYgRU5CVVNGUkVFKQorCQlwcmludGsoIkVOQlVTRlJFRSAiKTsKKwlpZiAocyAmIEVOU0NTSVBFUlIpCisJCXByaW50aygiRU5TQ1NJUEVSUiAiKTsKKwlpZiAocyAmIEVOUEhBU0VDSEcpCisJCXByaW50aygiRU5QSEFTRUNIRyAiKTsKKwlpZiAocyAmIEVOUkVRSU5JVCkKKwkJcHJpbnRrKCJFTlJFUUlOSVQgIik7CisJcHJpbnRrKCIpXG4iKTsKK30KKworLyoKKyAqIFNob3cgdGhlIGNvbW1hbmQgZGF0YSBvZiBhIGNvbW1hbmQKKyAqLworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKFNjc2lfQ21uZCAqcHRyKQoreworCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHg6IHRhcmdldD0lZDsgbHVuPSVkOyBjbW5kPSgiLAorCSAgICAgICAodW5zaWduZWQgaW50KSBwdHIsIHB0ci0+ZGV2aWNlLT5pZCwgcHRyLT5kZXZpY2UtPmx1bik7CisKKwlwcmludF9jb21tYW5kKHB0ci0+Y21uZCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiKTsgcmVxdWVzdF9idWZmbGVuPSVkOyByZXNpZD0lZDsgcGhhc2UgfCIsCisJICAgICAgIHB0ci0+cmVxdWVzdF9idWZmbGVuLCBwdHItPnJlc2lkKTsKKworCWlmIChwdHItPlNDcC5waGFzZSAmIG5vdF9pc3N1ZWQpCisJCXByaW50aygibm90IGlzc3VlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpCisJCXByaW50aygic2VsZWN0aW5nfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGlkZW50aWZpZWQpCisJCXByaW50aygiaWRlbnRpZmllZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBkaXNjb25uZWN0ZWQpCisJCXByaW50aygiZGlzY29ubmVjdGVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkKKwkJcHJpbnRrKCJjb21wbGV0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3Bpb3JkeSkKKwkJcHJpbnRrKCJzcGlvcmR5fCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIHN5bmNuZWcpCisJCXByaW50aygic3luY25lZ3wiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBhYm9ydGVkKQorCQlwcmludGsoImFib3J0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgcmVzZXR0ZWQpCisJCXByaW50aygicmVzZXR0ZWR8Iik7CisJaWYoIFNDREFUQShwdHIpICkgeworCQlwcmludGsoIjsgbmV4dD0weCVwXG4iLCBTQ05FWFQocHRyKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCI7IG5leHQ9KGhvc3Qgc2NyaWJibGUgTlVMTClcbiIpOworCX0KK30KKworLyoKKyAqIER1bXAgdGhlIHF1ZXVlZCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHNob3dfcXVldWVzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNjc2lfQ21uZCAqcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlET19MT0NLKGZsYWdzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXG5xdWV1ZSBzdGF0dXM6XG5pc3N1ZV9TQzpcbiIpOworCWZvciAocHRyID0gSVNTVUVfU0M7IHB0cjsgcHRyID0gU0NORVhUKHB0cikpCisJCXNob3dfY29tbWFuZChwdHIpOworCURPX1VOTE9DSyhmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY3VycmVudF9TQzpcbiIpOworCWlmIChDVVJSRU5UX1NDKQorCQlzaG93X2NvbW1hbmQoQ1VSUkVOVF9TQyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAibm9uZVxuIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiZGlzY29ubmVjdGVkX1NDOlxuIik7CisJZm9yIChwdHIgPSBESVNDT05ORUNURURfU0M7IHB0cjsgcHRyID0gU0NEQVRBKHB0cikgPyBTQ05FWFQocHRyKSA6IE5VTEwpCisJCXNob3dfY29tbWFuZChwdHIpOworCisJZGlzcF9wb3J0cyhzaHBudCk7CisJZGlzcF9lbmludHIoc2hwbnQpOworfQorCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncykKKworc3RhdGljIGludCBnZXRfY29tbWFuZChjaGFyICpwb3MsIFNjc2lfQ21uZCAqIHB0cikKK3sKKwljaGFyICpzdGFydCA9IHBvczsKKwlpbnQgaTsKKworCVNQUklOVEYoIjB4JTA4eDogdGFyZ2V0PSVkOyBsdW49JWQ7IGNtbmQ9KCAiLAorCQkodW5zaWduZWQgaW50KSBwdHIsIHB0ci0+ZGV2aWNlLT5pZCwgcHRyLT5kZXZpY2UtPmx1bik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09NTUFORF9TSVpFKHB0ci0+Y21uZFswXSk7IGkrKykKKwkJU1BSSU5URigiMHglMDJ4ICIsIHB0ci0+Y21uZFtpXSk7CisKKwlTUFJJTlRGKCIpOyByZXNpZD0lZDsgcmVzaWR1YWw9JWQ7IGJ1ZmZlcnM9JWQ7IHBoYXNlIHwiLAorCQlwdHItPnJlc2lkLCBwdHItPlNDcC50aGlzX3Jlc2lkdWFsLCBwdHItPlNDcC5idWZmZXJzX3Jlc2lkdWFsKTsKKworCWlmIChwdHItPlNDcC5waGFzZSAmIG5vdF9pc3N1ZWQpCisJCVNQUklOVEYoIm5vdCBpc3N1ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc2VsZWN0aW5nKQorCQlTUFJJTlRGKCJzZWxlY3Rpbmd8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgZGlzY29ubmVjdGVkKQorCQlTUFJJTlRGKCJkaXNjb25uZWN0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgYWJvcnRlZCkKKwkJU1BSSU5URigiYWJvcnRlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBpZGVudGlmaWVkKQorCQlTUFJJTlRGKCJpZGVudGlmaWVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkKKwkJU1BSSU5URigiY29tcGxldGVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIHNwaW9yZHkpCisJCVNQUklOVEYoInNwaW9yZHl8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3luY25lZykKKwkJU1BSSU5URigic3luY25lZ3wiKTsKKwlTUFJJTlRGKCI7IG5leHQ9MHglcFxuIiwgU0NORVhUKHB0cikpOworCisJcmV0dXJuIChwb3MgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BvcnRzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICpwb3MpCit7CisJY2hhciAqc3RhcnQgPSBwb3M7CisJaW50IHM7CisKKwlTUFJJTlRGKCJcbiVzOiAlcyglcykgIiwgQ1VSUkVOVF9TQyA/ICJvbiBidXMiIDogIndhaXRpbmciLCBzdGF0ZXNbU1RBVEVdLm5hbWUsIHN0YXRlc1tQUkVWU1RBVEVdLm5hbWUpOworCisJcyA9IEdFVFBPUlQoU0NTSVNFUSk7CisJU1BSSU5URigiU0NTSVNFUSggIik7CisJaWYgKHMgJiBURU1PREVPKQorCQlTUFJJTlRGKCJUQVJHRVQgTU9ERSAiKTsKKwlpZiAocyAmIEVOU0VMTykKKwkJU1BSSU5URigiU0VMTyAiKTsKKwlpZiAocyAmIEVOU0VMSSkKKwkJU1BSSU5URigiU0VMSSAiKTsKKwlpZiAocyAmIEVOUkVTRUxJKQorCQlTUFJJTlRGKCJSRVNFTEkgIik7CisJaWYgKHMgJiBFTkFVVE9BVE5PKQorCQlTUFJJTlRGKCJBVVRPQVROTyAiKTsKKwlpZiAocyAmIEVOQVVUT0FUTkkpCisJCVNQUklOVEYoIkFVVE9BVE5JICIpOworCWlmIChzICYgRU5BVVRPQVROUCkKKwkJU1BSSU5URigiQVVUT0FUTlAgIik7CisJaWYgKHMgJiBTQ1NJUlNUTykKKwkJU1BSSU5URigiU0NTSVJTVE8gIik7CisJU1BSSU5URigiKTsiKTsKKworCVNQUklOVEYoIiBTQ1NJU0lHKCIpOworCXMgPSBHRVRQT1JUKFNDU0lTSUcpOworCXN3aXRjaCAocyAmIFBfTUFTSykgeworCWNhc2UgUF9EQVRBTzoKKwkJU1BSSU5URigiREFUQSBPVVQiKTsKKwkJYnJlYWs7CisJY2FzZSBQX0RBVEFJOgorCQlTUFJJTlRGKCJEQVRBIElOIik7CisJCWJyZWFrOworCWNhc2UgUF9DTUQ6CisJCVNQUklOVEYoIkNPTU1BTkQiKTsKKwkJYnJlYWs7CisJY2FzZSBQX1NUQVRVUzoKKwkJU1BSSU5URigiU1RBVFVTIik7CisJCWJyZWFrOworCWNhc2UgUF9NU0dPOgorCQlTUFJJTlRGKCJNRVNTQUdFIE9VVCIpOworCQlicmVhazsKKwljYXNlIFBfTVNHSToKKwkJU1BSSU5URigiTUVTU0FHRSBJTiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlTUFJJTlRGKCIqaW52YWxpZCoiKTsKKwkJYnJlYWs7CisJfQorCisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJJTlRTVEFUICglcyk7ICIsIFRFU1RISShETUFTVEFULCBJTlRTVEFUKSA/ICJoaSIgOiAibG8iKTsKKworCVNQUklOVEYoIlNTVEFUKCAiKTsKKwlzID0gR0VUUE9SVChTU1RBVDApOworCWlmIChzICYgVEFSR0VUKQorCQlTUFJJTlRGKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJU1BSSU5URigiU0VMRE8gIik7CisJaWYgKHMgJiBTRUxESSkKKwkJU1BSSU5URigiU0VMREkgIik7CisJaWYgKHMgJiBTRUxJTkdPKQorCQlTUFJJTlRGKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCVNQUklOVEYoIlNXUkFQICIpOworCWlmIChzICYgU0RPTkUpCisJCVNQUklOVEYoIlNET05FICIpOworCWlmIChzICYgU1BJT1JEWSkKKwkJU1BSSU5URigiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCVNQUklOVEYoIkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDEpOworCWlmIChzICYgU0VMVE8pCisJCVNQUklOVEYoIlNFTFRPICIpOworCWlmIChzICYgQVROVEFSRykKKwkJU1BSSU5URigiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlTUFJJTlRGKCJTQ1NJUlNUSSAiKTsKKwlpZiAocyAmIFBIQVNFTUlTKQorCQlTUFJJTlRGKCJQSEFTRU1JUyAiKTsKKwlpZiAocyAmIEJVU0ZSRUUpCisJCVNQUklOVEYoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJU1BSSU5URigiU0NTSVBFUlIgIik7CisJaWYgKHMgJiBQSEFTRUNIRykKKwkJU1BSSU5URigiUEhBU0VDSEcgIik7CisJaWYgKHMgJiBSRVFJTklUKQorCQlTUFJJTlRGKCJSRVFJTklUICIpOworCVNQUklOVEYoIik7ICIpOworCisKKwlTUFJJTlRGKCJTU1RBVCggIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDApICYgR0VUUE9SVChTSU1PREUwKTsKKworCWlmIChzICYgVEFSR0VUKQorCQlTUFJJTlRGKCJUQVJHRVQgIik7CisJaWYgKHMgJiBTRUxETykKKwkJU1BSSU5URigiU0VMRE8gIik7CisJaWYgKHMgJiBTRUxESSkKKwkJU1BSSU5URigiU0VMREkgIik7CisJaWYgKHMgJiBTRUxJTkdPKQorCQlTUFJJTlRGKCJTRUxJTkdPICIpOworCWlmIChzICYgU1dSQVApCisJCVNQUklOVEYoIlNXUkFQICIpOworCWlmIChzICYgU0RPTkUpCisJCVNQUklOVEYoIlNET05FICIpOworCWlmIChzICYgU1BJT1JEWSkKKwkJU1BSSU5URigiU1BJT1JEWSAiKTsKKwlpZiAocyAmIERNQURPTkUpCisJCVNQUklOVEYoIkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDEpICYgR0VUUE9SVChTSU1PREUxKTsKKworCWlmIChzICYgU0VMVE8pCisJCVNQUklOVEYoIlNFTFRPICIpOworCWlmIChzICYgQVROVEFSRykKKwkJU1BSSU5URigiQVROVEFSRyAiKTsKKwlpZiAocyAmIFNDU0lSU1RJKQorCQlTUFJJTlRGKCJTQ1NJUlNUSSAiKTsKKwlpZiAocyAmIFBIQVNFTUlTKQorCQlTUFJJTlRGKCJQSEFTRU1JUyAiKTsKKwlpZiAocyAmIEJVU0ZSRUUpCisJCVNQUklOVEYoIkJVU0ZSRUUgIik7CisJaWYgKHMgJiBTQ1NJUEVSUikKKwkJU1BSSU5URigiU0NTSVBFUlIgIik7CisJaWYgKHMgJiBQSEFTRUNIRykKKwkJU1BSSU5URigiUEhBU0VDSEcgIik7CisJaWYgKHMgJiBSRVFJTklUKQorCQlTUFJJTlRGKCJSRVFJTklUICIpOworCVNQUklOVEYoIik7ICIpOworCisJU1BSSU5URigiU1hGUkNUTDAoICIpOworCisJcyA9IEdFVFBPUlQoU1hGUkNUTDApOworCWlmIChzICYgU0NTSUVOKQorCQlTUFJJTlRGKCJTQ1NJRU4gIik7CisJaWYgKHMgJiBETUFFTikKKwkJU1BSSU5URigiRE1BRU4gIik7CisJaWYgKHMgJiBDSDEpCisJCVNQUklOVEYoIkNIMSAiKTsKKwlpZiAocyAmIENMUlNUQ05UKQorCQlTUFJJTlRGKCJDTFJTVENOVCAiKTsKKwlpZiAocyAmIFNQSU9FTikKKwkJU1BSSU5URigiU1BJT0VOICIpOworCWlmIChzICYgQ0xSQ0gxKQorCQlTUFJJTlRGKCJDTFJDSDEgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJTSUdOQUwoICIpOworCisJcyA9IEdFVFBPUlQoU0NTSVNJRyk7CisJaWYgKHMgJiBTSUdfQVROSSkKKwkJU1BSSU5URigiQVROSSAiKTsKKwlpZiAocyAmIFNJR19TRUxJKQorCQlTUFJJTlRGKCJTRUxJICIpOworCWlmIChzICYgU0lHX0JTWUkpCisJCVNQUklOVEYoIkJTWUkgIik7CisJaWYgKHMgJiBTSUdfUkVRSSkKKwkJU1BSSU5URigiUkVRSSAiKTsKKwlpZiAocyAmIFNJR19BQ0tJKQorCQlTUFJJTlRGKCJBQ0tJICIpOworCVNQUklOVEYoIik7ICIpOworCisJU1BSSU5URigiU0VMSUQoJTAyeCksICIsIEdFVFBPUlQoU0VMSUQpKTsKKworCVNQUklOVEYoIlNUQ05UKCVkKSwgIiwgR0VUU1RDTlQoKSk7CisKKwlTUFJJTlRGKCJTU1RBVDIoICIpOworCisJcyA9IEdFVFBPUlQoU1NUQVQyKTsKKwlpZiAocyAmIFNPRkZTRVQpCisJCVNQUklOVEYoIlNPRkZTRVQgIik7CisJaWYgKHMgJiBTRU1QVFkpCisJCVNQUklOVEYoIlNFTVBUWSAiKTsKKwlpZiAocyAmIFNGVUxMKQorCQlTUFJJTlRGKCJTRlVMTCAiKTsKKwlTUFJJTlRGKCIpOyBTRkNOVCAoJWQpOyAiLCBzICYgKFNGVUxMIHwgU0ZDTlQpKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMyk7CisJU1BSSU5URigiU0NTSUNOVCAoJWQpLCBPRkZDTlQoJWQpLCAiLCAocyAmIDB4ZjApID4+IDQsIHMgJiAweDBmKTsKKworCVNQUklOVEYoIlNTVEFUNCggIik7CisJcyA9IEdFVFBPUlQoU1NUQVQ0KTsKKwlpZiAocyAmIFNZTkNFUlIpCisJCVNQUklOVEYoIlNZTkNFUlIgIik7CisJaWYgKHMgJiBGV0VSUikKKwkJU1BSSU5URigiRldFUlIgIik7CisJaWYgKHMgJiBGUkVSUikKKwkJU1BSSU5URigiRlJFUlIgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJETUFDTlRSTDAoICIpOworCXMgPSBHRVRQT1JUKERNQUNOVFJMMCk7CisJU1BSSU5URigiJXMgIiwgcyAmIF84QklUID8gIjhCSVQiIDogIjE2QklUIik7CisJU1BSSU5URigiJXMgIiwgcyAmIERNQSA/ICJETUEiIDogIlBJTyIpOworCVNQUklOVEYoIiVzICIsIHMgJiBXUklURV9SRUFEID8gIldSSVRFIiA6ICJSRUFEIik7CisJaWYgKHMgJiBFTkRNQSkKKwkJU1BSSU5URigiRU5ETUEgIik7CisJaWYgKHMgJiBJTlRFTikKKwkJU1BSSU5URigiSU5URU4gIik7CisJaWYgKHMgJiBSU1RGSUZPKQorCQlTUFJJTlRGKCJSU1RGSUZPICIpOworCWlmIChzICYgU1dJTlQpCisJCVNQUklOVEYoIlNXSU5UICIpOworCVNQUklOVEYoIik7ICIpOworCisJU1BSSU5URigiRE1BU1RBVCggIik7CisJcyA9IEdFVFBPUlQoRE1BU1RBVCk7CisJaWYgKHMgJiBBVERPTkUpCisJCVNQUklOVEYoIkFURE9ORSAiKTsKKwlpZiAocyAmIFdPUkRSRFkpCisJCVNQUklOVEYoIldPUkRSRFkgIik7CisJaWYgKHMgJiBERklGT0ZVTEwpCisJCVNQUklOVEYoIkRGSUZPRlVMTCAiKTsKKwlpZiAocyAmIERGSUZPRU1QKQorCQlTUFJJTlRGKCJERklGT0VNUCAiKTsKKwlTUFJJTlRGKCIpXG4iKTsKKworCVNQUklOVEYoImVuYWJsZWQgaW50ZXJydXB0cyggIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUwKTsKKwlpZiAocyAmIEVOU0VMRE8pCisJCVNQUklOVEYoIkVOU0VMRE8gIik7CisJaWYgKHMgJiBFTlNFTERJKQorCQlTUFJJTlRGKCJFTlNFTERJICIpOworCWlmIChzICYgRU5TRUxJTkdPKQorCQlTUFJJTlRGKCJFTlNFTElOR08gIik7CisJaWYgKHMgJiBFTlNXUkFQKQorCQlTUFJJTlRGKCJFTlNXUkFQICIpOworCWlmIChzICYgRU5TRE9ORSkKKwkJU1BSSU5URigiRU5TRE9ORSAiKTsKKwlpZiAocyAmIEVOU1BJT1JEWSkKKwkJU1BSSU5URigiRU5TUElPUkRZICIpOworCWlmIChzICYgRU5ETUFET05FKQorCQlTUFJJTlRGKCJFTkRNQURPTkUgIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUxKTsKKwlpZiAocyAmIEVOU0VMVElNTykKKwkJU1BSSU5URigiRU5TRUxUSU1PICIpOworCWlmIChzICYgRU5BVE5UQVJHKQorCQlTUFJJTlRGKCJFTkFUTlRBUkcgIik7CisJaWYgKHMgJiBFTlBIQVNFTUlTKQorCQlTUFJJTlRGKCJFTlBIQVNFTUlTICIpOworCWlmIChzICYgRU5CVVNGUkVFKQorCQlTUFJJTlRGKCJFTkJVU0ZSRUUgIik7CisJaWYgKHMgJiBFTlNDU0lQRVJSKQorCQlTUFJJTlRGKCJFTlNDU0lQRVJSICIpOworCWlmIChzICYgRU5QSEFTRUNIRykKKwkJU1BSSU5URigiRU5QSEFTRUNIRyAiKTsKKwlpZiAocyAmIEVOUkVRSU5JVCkKKwkJU1BSSU5URigiRU5SRVFJTklUICIpOworCVNQUklOVEYoIilcbiIpOworCisJcmV0dXJuIChwb3MgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgYWhhMTUyeF9zZXRfaW5mbyhjaGFyICpidWZmZXIsIGludCBsZW5ndGgsIHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKCFzaHBudCB8fCAhYnVmZmVyIHx8IGxlbmd0aDw4IHx8IHN0cm5jbXAoImFoYTE1MnggIiwgYnVmZmVyLCA4KSE9MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYobGVuZ3RoPjE0ICYmIHN0cm5jbXAoImRlYnVnICIsIGJ1ZmZlcis4LCA2KT09MCkgeworCQlpbnQgZGVidWcgPSBIT1NUREFUQShzaHBudCktPmRlYnVnOworCisJCUhPU1REQVRBKHNocG50KS0+ZGVidWcgPSBzaW1wbGVfc3RydG91bChidWZmZXIrMTQsIE5VTEwsIDApOworCisJCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnglZDogZGVidWdnaW5nIG9wdGlvbnMgc2V0IHRvIDB4JTA0eCAod2VyZSAweCUwNHgpXG4iLCBIT1NUTk8sIEhPU1REQVRBKHNocG50KS0+ZGVidWcsIGRlYnVnKTsKKwl9IGVsc2UKKyNlbmRpZgorI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCWlmKGxlbmd0aD4xMyAmJiBzdHJuY21wKCJyZXNldCIsIGJ1ZmZlcis4LCA1KT09MCkgeworCQlpbnQgaTsKKworCQlIT1NUREFUQShzaHBudCktPnRvdGFsX2NvbW1hbmRzPTA7CisJCUhPU1REQVRBKHNocG50KS0+ZGlzY29ubmVjdGlvbnM9MDsKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbj0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZD0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9uZXdfY29tbWFuZD0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9kb25lX2NvbW1hbmQ9MDsKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uPTA7CisJCWZvciAoaSA9IGlkbGU7IGk8bWF4c3RhdGU7IGkrKykgeworCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudFtpXT0wOworCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudF90cmFuc1tpXT0wOworCQkJSE9TVERBVEEoc2hwbnQpLT50aW1lW2ldPTA7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4JWQ6IHN0YXRzIHJlc2V0ZWQuXG4iLCBIT1NUTk8pOworCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJcmV0dXJuIGxlbmd0aDsKK30KKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSBcCisJZG8geyBpZihwb3MgPCBidWZmZXIgKyBsZW5ndGgpIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncyk7IH0gd2hpbGUoMCkKKworc3RhdGljIGludCBhaGExNTJ4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCisJCSAgICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBpOworCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKKwlTY3NpX0NtbmQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0aGlzbGVuZ3RoOworCisJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgCisJICAgICAgIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBidWZmZXI9JXAgb2Zmc2V0PSVsZCBsZW5ndGg9JWQgaG9zdG5vPSVkIGlub3V0PSVkXG4iLAorCSAgICAgICBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBzaHBudC0+aG9zdF9ubywgaW5vdXQpOworCisKKwlpZiAoaW5vdXQpCisJCXJldHVybiBhaGExNTJ4X3NldF9pbmZvKGJ1ZmZlciwgbGVuZ3RoLCBzaHBudCk7CisKKwlTUFJJTlRGKEFIQTE1MlhfUkVWSUQgIlxuIik7CisKKwlTUFJJTlRGKCJpb3BvcnRzIDB4JTA0bHggdG8gMHglMDRseFxuIiwKKwkJc2hwbnQtPmlvX3BvcnQsIHNocG50LT5pb19wb3J0ICsgc2hwbnQtPm5faW9fcG9ydCAtIDEpOworCVNQUklOVEYoImludGVycnVwdCAweCUwMnhcbiIsIHNocG50LT5pcnEpOworCVNQUklOVEYoImRpc2Nvbm5lY3Rpb24vcmVjb25uZWN0aW9uICVzXG4iLAorCQlSRUNPTk5FQ1QgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlTUFJJTlRGKCJwYXJpdHkgY2hlY2tpbmcgJXNcbiIsCisJCVBBUklUWSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCVNQUklOVEYoInN5bmNocm9ub3VzIHRyYW5zZmVycyAlc1xuIiwKKwkJU1lOQ0hST05PVVMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlTUFJJTlRGKCIlZCBjb21tYW5kcyBjdXJyZW50bHkgcXVldWVkXG4iLCBIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKTsKKworCWlmKFNZTkNIUk9OT1VTKSB7CisJCVNQUklOVEYoInN5bmNocm9ub3VzbHkgb3BlcmF0aW5nIHRhcmdldHMgKHRpY2s9NTAgbnMpOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlpZiAoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4N2YpCisJCQkJU1BSSU5URigidGFyZ2V0ICVkOiBwZXJpb2QgJWRULyVkbnM7IHJlcS9hY2sgb2Zmc2V0ICVkXG4iLAorCQkJCQlpLAorCQkJCQkoKChIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldICYgMHg3MCkgPj4gNCkgKyAyKSwKKwkJCQkJKCgoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4NzApID4+IDQpICsgMikgKiA1MCwKKwkJCQkgICAgSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4MGYpOworCX0KKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisjZGVmaW5lIFBERUJVRyhmbGFncyx0eHQpIFwKKwlpZihIT1NUREFUQShzaHBudCktPmRlYnVnICYgZmxhZ3MpIFNQUklOVEYoIiglcykgIiwgdHh0KTsKKworCVNQUklOVEYoImVuYWJsZWQgZGVidWdnaW5nIG9wdGlvbnM6ICIpOworCisJUERFQlVHKGRlYnVnX3Byb2NpbmZvLCAicHJvY2luZm8iKTsKKwlQREVCVUcoZGVidWdfcXVldWUsICJxdWV1ZSIpOworCVBERUJVRyhkZWJ1Z19pbnRyLCAiaW50ZXJydXB0Iik7CisJUERFQlVHKGRlYnVnX3NlbGVjdGlvbiwgInNlbGVjdGlvbiIpOworCVBERUJVRyhkZWJ1Z19tc2dvLCAibWVzc2FnZSBvdXQiKTsKKwlQREVCVUcoZGVidWdfbXNnaSwgIm1lc3NhZ2UgaW4iKTsKKwlQREVCVUcoZGVidWdfc3RhdHVzLCAic3RhdHVzIik7CisJUERFQlVHKGRlYnVnX2NtZCwgImNvbW1hbmQiKTsKKwlQREVCVUcoZGVidWdfZGF0YWksICJkYXRhIGluIik7CisJUERFQlVHKGRlYnVnX2RhdGFvLCAiZGF0YSBvdXQiKTsKKwlQREVCVUcoZGVidWdfZWgsICJlaCIpOworCVBERUJVRyhkZWJ1Z19sb2NrcywgImxvY2tzIik7CisJUERFQlVHKGRlYnVnX3BoYXNlcywgInBoYXNlcyIpOworCisJU1BSSU5URigiXG4iKTsKKyNlbmRpZgorCisJU1BSSU5URigiXG5xdWV1ZSBzdGF0dXM6XG4iKTsKKwlET19MT0NLKGZsYWdzKTsKKwlpZiAoSVNTVUVfU0MpIHsKKwkJU1BSSU5URigibm90IHlldCBpc3N1ZWQgY29tbWFuZHM6XG4iKTsKKwkJZm9yIChwdHIgPSBJU1NVRV9TQzsgcHRyOyBwdHIgPSBTQ05FWFQocHRyKSkKKwkJCXBvcyArPSBnZXRfY29tbWFuZChwb3MsIHB0cik7CisJfSBlbHNlCisJCVNQUklOVEYoIm5vIG5vdCB5ZXQgaXNzdWVkIGNvbW1hbmRzXG4iKTsKKwlET19VTkxPQ0soZmxhZ3MpOworCisJaWYgKENVUlJFTlRfU0MpIHsKKwkJU1BSSU5URigiY3VycmVudCBjb21tYW5kOlxuIik7CisJCXBvcyArPSBnZXRfY29tbWFuZChwb3MsIENVUlJFTlRfU0MpOworCX0gZWxzZQorCQlTUFJJTlRGKCJubyBjdXJyZW50IGNvbW1hbmRcbiIpOworCisJaWYgKERJU0NPTk5FQ1RFRF9TQykgeworCQlTUFJJTlRGKCJkaXNjb25uZWN0ZWQgY29tbWFuZHM6XG4iKTsKKwkJZm9yIChwdHIgPSBESVNDT05ORUNURURfU0M7IHB0cjsgcHRyID0gU0NORVhUKHB0cikpCisJCQlwb3MgKz0gZ2V0X2NvbW1hbmQocG9zLCBwdHIpOworCX0gZWxzZQorCQlTUFJJTlRGKCJubyBkaXNjb25uZWN0ZWQgY29tbWFuZHNcbiIpOworCisJcG9zICs9IGdldF9wb3J0cyhzaHBudCwgcG9zKTsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCVNQUklOVEYoInN0YXRpc3RpY3M6XG4iCisJICAgICAgICAidG90YWwgY29tbWFuZHM6ICAgICAgICAgICAgICAgJWRcbiIKKwkgICAgICAgICJkaXNjb25uZWN0aW9uczogICAgICAgICAgICAgICAlZFxuIgorCQkiYnVzZnJlZSB3aXRoIGNoZWNrIGNvbmRpdGlvbjogJWRcbiIKKwkJImJ1c2ZyZWUgd2l0aG91dCBvbGQgY29tbWFuZDogICVkXG4iCisJCSJidXNmcmVlIHdpdGhvdXQgbmV3IGNvbW1hbmQ6ICAlZFxuIgorCQkiYnVzZnJlZSB3aXRob3V0IGRvbmUgY29tbWFuZDogJWRcbiIKKwkJImJ1c2ZyZWUgd2l0aG91dCBhbnkgYWN0aW9uOiAgICVkXG4iCisJCSJzdGF0ZSAgICAgICIKKwkJInRyYW5zaXRpb25zICAiCisJCSJjb3VudCAgICAgICAgIgorCQkidGltZVxuIiwKKwkJSE9TVERBVEEoc2hwbnQpLT50b3RhbF9jb21tYW5kcywKKwkJSE9TVERBVEEoc2hwbnQpLT5kaXNjb25uZWN0aW9ucywKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uLAorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZCwKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfbmV3X2NvbW1hbmQsCisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2RvbmVfY29tbWFuZCwKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbik7CisJZm9yKGk9MDsgaTxtYXhzdGF0ZTsgaSsrKSB7CisJCVNQUklOVEYoIiUtMTBzICUtMTJkICUtMTJkICUtMTJsZFxuIiwKKwkJICAgICAgICBzdGF0ZXNbaV0ubmFtZSwKKwkJCUhPU1REQVRBKHNocG50KS0+Y291bnRfdHJhbnNbaV0sCisJCQlIT1NUREFUQShzaHBudCktPmNvdW50W2ldLAorCQkJSE9TVERBVEEoc2hwbnQpLT50aW1lW2ldKTsKKwl9CisjZW5kaWYKKworCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBwb3M9JXBcbiIsIHBvcyk7CisKKwl0aGlzbGVuZ3RoID0gcG9zIC0gKGJ1ZmZlciArIG9mZnNldCk7CisJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgS0VSTl9ERUJVRyAiYWhhMTUyeF9wcm9jX2luZm86IGxlbmd0aD0lZCB0aGlzbGVuZ3RoPSVkXG4iLCBsZW5ndGgsIHRoaXNsZW5ndGgpOworCisJaWYodGhpc2xlbmd0aDwwKSB7CisJCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBvdXRwdXQgdG9vIHNob3J0XG4iKTsKKwkJKnN0YXJ0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJdGhpc2xlbmd0aCA9IHRoaXNsZW5ndGg8bGVuZ3RoID8gdGhpc2xlbmd0aCA6IGxlbmd0aDsKKworCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiByZXR1cm4gJWRcbiIsIHRoaXNsZW5ndGgpOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCXJldHVybiB0aGlzbGVuZ3RoIDwgbGVuZ3RoID8gdGhpc2xlbmd0aCA6IGxlbmd0aDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBhaGExNTJ4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSBBSEExNTJYX1JFVklELAorCS5wcm9jX25hbWUJCQk9ICJhaGExNTJ4IiwKKwkucHJvY19pbmZvCQkJPSBhaGExNTJ4X3Byb2NfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBhaGExNTJ4X3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IGFoYTE1MnhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gYWhhMTUyeF9kZXZpY2VfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGFoYTE1MnhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gYWhhMTUyeF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtCQkJPSBhaGExNTJ4X2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQkJPSAxLAorCS50aGlzX2lkCQkJPSA3LAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCisjaWYgIWRlZmluZWQoUENNQ0lBKQorc3RhdGljIGludCBzZXR1cF9jb3VudDsKK3N0YXRpYyBzdHJ1Y3QgYWhhMTUyeF9zZXR1cCBzZXR1cFsyXTsKKworLyogcG9zc2libGUgaS9vIGFkZHJlc3NlcyBmb3IgdGhlIEFJQy02MjYwOyBkZWZhdWx0IGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbXSA9IHsgMHgzNDAsIDB4MTQwIH07CisKKyNpZiAhZGVmaW5lZChTS0lQX0JJT1NURVNUKQorLyogcG9zc2libGUgbG9jYXRpb25zIGZvciB0aGUgQWRhcHRlYyBCSU9TOyBkZWZhdWx0cyBmaXJzdCAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGRyZXNzZXNbXSA9Cit7CisJMHhkYzAwMCwJCS8qIGRlZmF1bHQgZmlyc3QgKi8KKwkweGM4MDAwLAorCTB4Y2MwMDAsCisJMHhkMDAwMCwKKwkweGQ0MDAwLAorCTB4ZDgwMDAsCisJMHhlMDAwMCwKKwkweGViODAwLAkJLyogVlRlY2ggUGxhdGludW0gU01QICovCisJMHhmMDAwMCwKK307CisKKy8qIHNpZ25hdHVyZXMgZm9yIHZhcmlvdXMgQUlDLTZbMjNdNjAgYmFzZWQgY29udHJvbGxlcnMuCisgICBUaGUgcG9pbnQgaW4gZGV0ZWN0aW5nIHNpZ25hdHVyZXMgaXMgdG8gYXZvaWQgdXNlbGVzcyBhbmQgbWF5YmUKKyAgIGhhcm1mdWwgcHJvYmVzIG9uIHBvcnRzLiBJJ20gbm90IHN1cmUgdGhhdCBhbGwgbGlzdGVkIGJvYXJkcyBwYXNzCisgICBhdXRvLWNvbmZpZ3VyYXRpb24uIEZvciB0aG9zZSB3aGljaCBmYWlsIHRoZSBCSU9TIHNpZ25hdHVyZSBpcworICAgb2Jzb2xldGUsIGJlY2F1c2UgdXNlciBpbnRlcnZlbnRpb24gdG8gc3VwcGx5IHRoZSBjb25maWd1cmF0aW9uIGlzCisgICBuZWVkZWQgYW55d2F5LiAgTWF5IGJlIGFuIGluZm9ybWF0aW9uIHdoZXRoZXIgb3Igbm90IHRoZSBCSU9TIHN1cHBvcnRzCisgICBleHRlbmRlZCB0cmFuc2xhdGlvbiBjb3VsZCBiZSBhbHNvIHVzZWZ1bCBoZXJlLiAqLworc3RhdGljIHN0cnVjdCBzaWduYXR1cmUgeworCXVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZTsKKwlpbnQgc2lnX29mZnNldDsKKwlpbnQgc2lnX2xlbmd0aDsKK30gc2lnbmF0dXJlc1tdID0KK3sKKwl7ICJBZGFwdGVjIEFIQS0xNTIwIEJJT1MiLAkweDEwMmUsIDIxIH0sCisJCS8qIEFkYXB0ZWMgMTUyeCAqLworCXsgIkFkYXB0ZWMgQUhBLTE1MjBCIiwJCTB4MDAwYiwgMTcgfSwKKwkJLyogQWRhcHRlYyAxNTJ4IHJldiBCICovCisJeyAiQWRhcHRlYyBBSEEtMTUyMEIiLAkJMHgwMDI2LCAxNyB9LAorCQkvKiBJb21lZ2EgSmF6IEpldCBJU0EgKEFJQzYzNzBRKSAqLworCXsgIkFkYXB0ZWMgQVNXLUI2MjYgQklPUyIsCTB4MTAyOSwgMjEgfSwKKwkJLyogb24tYm9hcmQgY29udHJvbGxlciAqLworCXsgIkFkYXB0ZWMgQklPUzogQVNXLUI2MjYiLAkweDAwMGYsIDIyIH0sCisJCS8qIG9uLWJvYXJkIGNvbnRyb2xsZXIgKi8KKwl7ICJBZGFwdGVjIEFTVy1CNjI2IFMyIiwJMHgyZTZjLCAxOSB9LAorCQkvKiBvbi1ib2FyZCBjb250cm9sbGVyICovCisJeyAiQWRhcHRlYyBCSU9TOkFJQy02MzYwIiwJMHgwMDBjLCAyMSB9LAorCQkvKiBvbi1ib2FyZCBjb250cm9sbGVyICovCisJeyAiU2NzaVBybyBTUC0zNjAgQklPUyIsCTB4Mjg3MywgMTkgfSwKKwkJLyogU2NzaVByby1Db250cm9sbGVyICAqLworCXsgIkdBLTQwMCBMT0NBTCBCVVMgU0NTSSBCSU9TIiwgMHgxMDJlLCAyNiB9LAorCQkvKiBHaWdhYnl0ZSBMb2NhbC1CdXMtU0NTSSAqLworCXsgIkFkYXB0ZWMgQklPUzpBVkEtMjgyWCIsCTB4MDAwYywgMjEgfSwKKwkJLyogQWRhcHRlYyAyODJ4ICovCisJeyAiQWRhcHRlYyBJQk0gRG9jayBJSSBTQ1NJIiwgICAweDJlZGQsIDI0IH0sCisJCS8qIElCTSBUaGlua3BhZCBEb2NrIElJICovCisJeyAiQWRhcHRlYyBCSU9TOkFIQS0xNTMyUCIsICAgICAweDAwMWMsIDIyIH0sCisJCS8qIElCTSBUaGlua3BhZCBEb2NrIElJIFNDU0kgKi8KKwl7ICJEVEMzNTIwQSBIb3N0IEFkYXB0ZXIgQklPUyIsIDB4MzE4YSwgMjYgfSwKKwkJLyogRFRDIDM1MjBBIElTQSBTQ1NJICovCit9OworI2VuZGlmIC8qICFTS0lQX0JJT1NURVNUICovCisKKy8qCisgKiBUZXN0LCBpZiBwb3J0X2Jhc2UgaXMgdmFsaWQuCisgKgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfcG9ydHRlc3QoaW50IGlvX3BvcnQpCit7CisJaW50IGk7CisKKwlTRVRQT1JUKGlvX3BvcnQgKyBPX0RNQUNOVFJMMSwgMCk7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJU0VUUE9SVChpb19wb3J0ICsgT19TVEFDSywgaSk7CisKKwlTRVRQT1JUKGlvX3BvcnQgKyBPX0RNQUNOVFJMMSwgMCk7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgR0VUUE9SVChpb19wb3J0ICsgT19TVEFDSykgPT0gaTsgaSsrKQorCQk7CisKKwlyZXR1cm4gKGkgPT0gMTYpOworfQorCitzdGF0aWMgaW50IHRjMTU1MF9wb3J0dGVzdChpbnQgaW9fcG9ydCkKK3sKKwlpbnQgaTsKKworCVNFVFBPUlQoaW9fcG9ydCArIE9fVENfRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlTRVRQT1JUKGlvX3BvcnQgKyBPX1NUQUNLLCBpKTsKKworCVNFVFBPUlQoaW9fcG9ydCArIE9fVENfRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBHRVRQT1JUKGlvX3BvcnQgKyBPX1RDX1NUQUNLKSA9PSBpOyBpKyspCisJCTsKKworCXJldHVybiAoaSA9PSAxNik7Cit9CisKKworc3RhdGljIGludCBjaGVja3NldHVwKHN0cnVjdCBhaGExNTJ4X3NldHVwICpzZXR1cCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0cykgJiYgKHNldHVwLT5pb19wb3J0ICE9IHBvcnRzW2ldKTsgaSsrKQorCQk7CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHBvcnRzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIHJlcXVlc3RfcmVnaW9uKHNldHVwLT5pb19wb3J0LCBJT19SQU5HRSwgImFoYTE1MngiKT09MCApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBpbyBwb3J0IDB4JXggYnVzeS5cbiIsIHNldHVwLT5pb19wb3J0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoIGFoYTE1MnhfcG9ydHRlc3Qoc2V0dXAtPmlvX3BvcnQpICkgeworCQlzZXR1cC0+dGMxNTUwPTA7CisJfSBlbHNlIGlmKCB0YzE1NTBfcG9ydHRlc3Qoc2V0dXAtPmlvX3BvcnQpICkgeworCQlzZXR1cC0+dGMxNTUwPTE7CisJfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oc2V0dXAtPmlvX3BvcnQsIElPX1JBTkdFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVsZWFzZV9yZWdpb24oc2V0dXAtPmlvX3BvcnQsIElPX1JBTkdFKTsKKworCWlmICgoc2V0dXAtPmlycSA8IElSUV9NSU4pIHx8IChzZXR1cC0+aXJxID4gSVJRX01BWCkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+c2NzaWlkIDwgMCkgfHwgKHNldHVwLT5zY3NpaWQgPiA3KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHNldHVwLT5yZWNvbm5lY3QgPCAwKSB8fCAoc2V0dXAtPnJlY29ubmVjdCA+IDEpKQorCQlyZXR1cm4gMDsKKworCWlmICgoc2V0dXAtPnBhcml0eSA8IDApIHx8IChzZXR1cC0+cGFyaXR5ID4gMSkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+c3luY2hyb25vdXMgPCAwKSB8fCAoc2V0dXAtPnN5bmNocm9ub3VzID4gMSkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+ZXh0X3RyYW5zIDwgMCkgfHwgKHNldHVwLT5leHRfdHJhbnMgPiAxKSkKKwkJcmV0dXJuIDA7CisKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGFoYTE1MnhfaW5pdCh2b2lkKQoreworCWludCBpLCBqLCBvazsKKyNpZiBkZWZpbmVkKEFVVE9DT05GKQorCWFoYTE1MnhfY29uZmlnIGNvbmY7CisjZW5kaWYKKyNpZmRlZiBfX0lTQVBOUF9fCisJc3RydWN0IHBucF9kZXYgKmRldj1OVUxMLCAqcG5wZGV2WzJdID0ge05VTEwsIE5VTEx9OworI2VuZGlmCisKKwlpZiAoIHNldHVwX2NvdW50ICkgeworCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4OiBwcm9jZXNzaW5nIGNvbW1hbmRsaW5lOiAiKTsKKworCQlmb3IgKGkgPSAwOyBpPHNldHVwX2NvdW50OyBpKyspIHsKKwkJCWlmICghY2hlY2tzZXR1cCgmc2V0dXBbaV0pKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJcbmFoYTE1Mng6ICVzXG4iLCBzZXR1cFtpXS5jb25mKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGludmFsaWQgbGluZVxuIik7CisJCQl9CisJCX0KKwkJcHJpbnRrKCJva1xuIik7CisJfQorCisjaWYgZGVmaW5lZChTRVRVUDApCisJaWYgKHNldHVwX2NvdW50IDwgQVJSQVlfU0laRShzZXR1cCkpIHsKKwkJc3RydWN0IGFoYTE1Mnhfc2V0dXAgb3ZlcnJpZGUgPSBTRVRVUDA7CisKKwkJaWYgKHNldHVwX2NvdW50ID09IDAgfHwgKG92ZXJyaWRlLmlvX3BvcnQgIT0gc2V0dXBbMF0uaW9fcG9ydCkpIHsKKwkJCWlmICghY2hlY2tzZXR1cCgmb3ZlcnJpZGUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJcbmFoYTE1Mng6IGludmFsaWQgb3ZlcnJpZGUgU0VUVVAwPXsweCV4LCVkLCVkLCVkLCVkLCVkLCVkLCVkfVxuIiwKKwkJCQkgICAgICAgb3ZlcnJpZGUuaW9fcG9ydCwKKwkJCQkgICAgICAgb3ZlcnJpZGUuaXJxLAorCQkJCSAgICAgICBvdmVycmlkZS5zY3NpaWQsCisJCQkJICAgICAgIG92ZXJyaWRlLnJlY29ubmVjdCwKKwkJCQkgICAgICAgb3ZlcnJpZGUucGFyaXR5LAorCQkJCSAgICAgICBvdmVycmlkZS5zeW5jaHJvbm91cywKKwkJCQkgICAgICAgb3ZlcnJpZGUuZGVsYXksCisJCQkJICAgICAgIG92ZXJyaWRlLmV4dF90cmFucyk7CisJCQl9IGVsc2UKKwkJCQlzZXR1cFtzZXR1cF9jb3VudCsrXSA9IG92ZXJyaWRlOworCQl9CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNFVFVQMSkKKwlpZiAoc2V0dXBfY291bnQgPCBBUlJBWV9TSVpFKHNldHVwKSkgeworCQlzdHJ1Y3QgYWhhMTUyeF9zZXR1cCBvdmVycmlkZSA9IFNFVFVQMTsKKworCQlpZiAoc2V0dXBfY291bnQgPT0gMCB8fCAob3ZlcnJpZGUuaW9fcG9ydCAhPSBzZXR1cFswXS5pb19wb3J0KSkgeworCQkJaWYgKCFjaGVja3NldHVwKCZvdmVycmlkZSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlxuYWhhMTUyeDogaW52YWxpZCBvdmVycmlkZSBTRVRVUDE9ezB4JXgsJWQsJWQsJWQsJWQsJWQsJWQsJWR9XG4iLAorCQkJCSAgICAgICBvdmVycmlkZS5pb19wb3J0LAorCQkJCSAgICAgICBvdmVycmlkZS5pcnEsCisJCQkJICAgICAgIG92ZXJyaWRlLnNjc2lpZCwKKwkJCQkgICAgICAgb3ZlcnJpZGUucmVjb25uZWN0LAorCQkJCSAgICAgICBvdmVycmlkZS5wYXJpdHksCisJCQkJICAgICAgIG92ZXJyaWRlLnN5bmNocm9ub3VzLAorCQkJCSAgICAgICBvdmVycmlkZS5kZWxheSwKKwkJCQkgICAgICAgb3ZlcnJpZGUuZXh0X3RyYW5zKTsKKwkJCX0gZWxzZQorCQkJCXNldHVwW3NldHVwX2NvdW50KytdID0gb3ZlcnJpZGU7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoTU9EVUxFKQorCWlmIChzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJiAoYWhhMTUyeFswXSE9MCB8fCBpb1swXSE9MCB8fCBpcnFbMF0hPTApKSB7CisJCWlmKGFoYTE1MnhbMF0hPTApIHsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9ICIiOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgICAgID0gYWhhMTUyeFswXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IGFoYTE1MnhbMV07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBhaGExNTJ4WzJdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gYWhhMTUyeFszXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IGFoYTE1MnhbNF07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBhaGExNTJ4WzVdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gYWhhMTUyeFs2XTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGFoYTE1MnhbN107CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gYWhhMTUyeFs4XTsKKyNlbmRpZgorCSAgCX0gZWxzZSBpZihpb1swXSE9MCB8fCBpcnFbMF0hPTApIHsKKwkJCWlmKGlvWzBdIT0wKSAgc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBpb1swXTsKKwkJCWlmKGlycVswXSE9MCkgc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgPSBpcnFbMF07CisKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBzY3NpaWRbMF07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gcmVjb25uZWN0WzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IHBhcml0eVswXTsKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBzeW5jWzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGRlbGF5WzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGV4dHRyYW5zWzBdOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGRlYnVnWzBdOworI2VuZGlmCisJCX0KKworICAgICAgICAgIAlpZiAoY2hlY2tzZXR1cCgmc2V0dXBbc2V0dXBfY291bnRdKSkKKwkJCXNldHVwX2NvdW50Kys7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW52YWxpZCBtb2R1bGUgcGFyYW1zIGlvPTB4JXgsIGlycT0lZCxzY3NpaWQ9JWQscmVjb25uZWN0PSVkLHBhcml0eT0lZCxzeW5jPSVkLGRlbGF5PSVkLGV4dHRyYW5zPSVkXG4iLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pcnEsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5wYXJpdHksCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5kZWxheSwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zKTsKKwl9CisKKwlpZiAoc2V0dXBfY291bnQ8QVJSQVlfU0laRShzZXR1cCkgJiYgKGFoYTE1MngxWzBdIT0wIHx8IGlvWzFdIT0wIHx8IGlycVsxXSE9MCkpIHsKKwkJaWYoYWhhMTUyeDFbMF0hPTApIHsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9ICIiOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgICAgID0gYWhhMTUyeDFbMF07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICAgICAgPSBhaGExNTJ4MVsxXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IGFoYTE1MngxWzJdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gYWhhMTUyeDFbM107CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBhaGExNTJ4MVs0XTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IGFoYTE1MngxWzVdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gYWhhMTUyeDFbNl07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBhaGExNTJ4MVs3XTsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVidWcgICAgICAgPSBhaGExNTJ4MVs4XTsKKyNlbmRpZgorCSAgCX0gZWxzZSBpZihpb1sxXSE9MCB8fCBpcnFbMV0hPTApIHsKKwkJCWlmKGlvWzFdIT0wKSAgc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBpb1sxXTsKKwkJCWlmKGlycVsxXSE9MCkgc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgPSBpcnFbMV07CisKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBzY3NpaWRbMV07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gcmVjb25uZWN0WzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IHBhcml0eVsxXTsKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBzeW5jWzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGRlbGF5WzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGV4dHRyYW5zWzFdOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGRlYnVnWzFdOworI2VuZGlmCisJCX0KKwkJaWYgKGNoZWNrc2V0dXAoJnNldHVwW3NldHVwX2NvdW50XSkpCisJCQlzZXR1cF9jb3VudCsrOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGludmFsaWQgbW9kdWxlIHBhcmFtcyBpbz0weCV4LCBpcnE9JWQsc2NzaWlkPSVkLHJlY29ubmVjdD0lZCxwYXJpdHk9JWQsc3luYz0lZCxkZWxheT0lZCxleHR0cmFucz0lZFxuIiwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uaXJxLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cywKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXksCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBfX0lTQVBOUF9fCisJZm9yKGk9MDsgc2V0dXBfY291bnQ8QVJSQVlfU0laRShzZXR1cCkgJiYgaWRfdGFibGVbaV0udmVuZG9yOyBpKyspIHsKKwkJd2hpbGUgKCBzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJgorCQkJKGRldj1wbnBfZmluZF9kZXYoTlVMTCwgaWRfdGFibGVbaV0udmVuZG9yLCBpZF90YWJsZVtpXS5mdW5jdGlvbiwgZGV2KSkgKSB7CisJCQlpZiAocG5wX2RldmljZV9hdHRhY2goZGV2KSA8IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChwbnBfYWN0aXZhdGVfZGV2KGRldikgPCAwKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFwbnBfcG9ydF92YWxpZChkZXYsIDApKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHNldHVwX2NvdW50PT0xICYmIHBucF9wb3J0X3N0YXJ0KGRldiwgMCk9PXNldHVwWzBdLmlvX3BvcnQpIHsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCAgICAgPSBwbnBfcG9ydF9zdGFydChkZXYsIDApOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgICAgID0gcG5wX2lycShkZXYsIDApOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCAgICAgID0gNzsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgICA9IDE7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSAxOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gMTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IERFTEFZX0RFRkFVTFQ7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSAwOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IERFQlVHX0RFRkFVTFQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJCQlwbnBkZXZbc2V0dXBfY291bnRdICAgICAgICAgICAgPSBkZXY7CisjZW5kaWYKKwkJCXByaW50ayAoS0VSTl9JTkZPCisJCQkJImFoYTE1Mng6IGZvdW5kIElTQVBuUCBhZGFwdGVyIGF0IGlvPTB4JTAzeCwgaXJxPSVkXG4iLAorCQkJCXNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0LCBzZXR1cFtzZXR1cF9jb3VudF0uaXJxKTsKKwkJCXNldHVwX2NvdW50Kys7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQVVUT0NPTkYpCisJaWYgKHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApKSB7CisjaWYgIWRlZmluZWQoU0tJUF9CSU9TVEVTVCkKKwkJb2sgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGRyZXNzZXMpICYmICFvazsgaSsrKSB7CisJCQl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKGFkZHJlc3Nlc1tpXSwgMHg0MDAwKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IDA7IGo8QVJSQVlfU0laRShzaWduYXR1cmVzKSAmJiAhb2s7IGorKykKKwkJCQlvayA9IGNoZWNrX3NpZ25hdHVyZShwICsgc2lnbmF0dXJlc1tqXS5zaWdfb2Zmc2V0LAorCQkJCQkJCQlzaWduYXR1cmVzW2pdLnNpZ25hdHVyZSwgc2lnbmF0dXJlc1tqXS5zaWdfbGVuZ3RoKTsKKwkJCWlvdW5tYXAocCk7CisJCX0KKwkJaWYgKCFvayAmJiBzZXR1cF9jb3VudCA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeDogQklPUyB0ZXN0OiBwYXNzZWQsICIpOworI2Vsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeDogIik7CisjZW5kaWYJCQkJLyogIVNLSVBfQklPU1RFU1QgKi8KKworCQlvayA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRzKSAmJiBzZXR1cF9jb3VudCA8IDI7IGkrKykgeworCQkJaWYgKChzZXR1cF9jb3VudCA9PSAxKSAmJiAoc2V0dXBbMF0uaW9fcG9ydCA9PSBwb3J0c1tpXSkpCisJCQkJY29udGludWU7CisKKwkJCWlmICggcmVxdWVzdF9yZWdpb24ocG9ydHNbaV0sIElPX1JBTkdFLCAiYWhhMTUyeCIpPT0wICkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW8gcG9ydCAweCV4IGJ1c3kuXG4iLCBwb3J0c1tpXSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChhaGExNTJ4X3BvcnR0ZXN0KHBvcnRzW2ldKSkgeworCQkJCXNldHVwW3NldHVwX2NvdW50XS50YzE1NTAgID0gMDsKKworCQkJCWNvbmYuY2ZfcG9ydCA9CisJCQkJICAgIChHRVRQT1JUKHBvcnRzW2ldICsgT19QT1JUQSkgPDwgOCkgKyBHRVRQT1JUKHBvcnRzW2ldICsgT19QT1JUQik7CisJCQl9IGVsc2UgaWYgKHRjMTU1MF9wb3J0dGVzdChwb3J0c1tpXSkpIHsKKwkJCQlzZXR1cFtzZXR1cF9jb3VudF0udGMxNTUwICA9IDE7CisKKwkJCQljb25mLmNmX3BvcnQgPQorCQkJCSAgICAoR0VUUE9SVChwb3J0c1tpXSArIE9fVENfUE9SVEEpIDw8IDgpICsgR0VUUE9SVChwb3J0c1tpXSArIE9fVENfUE9SVEIpOworCQkJfSBlbHNlIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UpOworCisJCQlvaysrOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBwb3J0c1tpXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5pcnEgPSBJUlFfTUlOICsgY29uZi5jZl9pcnE7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkID0gY29uZi5jZl9pZDsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgPSBjb25mLmNmX3RhcmRpc2M7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ID0gIWNvbmYuY2ZfcGFyaXR5OworCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gY29uZi5jZl9zeW5jbmVnOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ID0gREVMQVlfREVGQVVMVDsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgPSAwOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyA9IERFQlVHX0RFRkFVTFQ7CisjZW5kaWYKKwkJCXNldHVwX2NvdW50Kys7CisKKwkJfQorCisJCWlmIChvaykKKwkJCXByaW50aygiYXV0byBjb25maWd1cmF0aW9uOiBvaywgIik7CisJfQorI2VuZGlmCisKKwlwcmludGsoIiVkIGNvbnRyb2xsZXIocykgY29uZmlndXJlZFxuIiwgc2V0dXBfY291bnQpOworCisJZm9yIChpPTA7IGk8c2V0dXBfY291bnQ7IGkrKykgeworCQlpZiAoIHJlcXVlc3RfcmVnaW9uKHNldHVwW2ldLmlvX3BvcnQsIElPX1JBTkdFLCAiYWhhMTUyeCIpICkgeworCQkJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBhaGExNTJ4X3Byb2JlX29uZSgmc2V0dXBbaV0pOworCisJCQlpZiggIXNocG50ICkgeworCQkJCXJlbGVhc2VfcmVnaW9uKHNldHVwW2ldLmlvX3BvcnQsIElPX1JBTkdFKTsKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJCQl9IGVsc2UgaWYoIHBucGRldltpXSApIHsKKwkJCQlIT1NUREFUQShzaHBudCktPnBucGRldj1wbnBkZXZbaV07CisJCQkJcG5wZGV2W2ldPU5VTEw7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW8gcG9ydCAweCV4IGJ1c3kuXG4iLCBzZXR1cFtpXS5pb19wb3J0KTsKKwkJfQorCisjaWYgZGVmaW5lZChfX0lTQVBOUF9fKQorCQlpZiggcG5wZGV2W2ldICkKKwkJCXBucF9kZXZpY2VfZGV0YWNoKHBucGRldltpXSk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gcmVnaXN0ZXJlZF9jb3VudD4wOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWhhMTUyeF9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoc2V0dXApOyBpKyspIHsKKwkJYWhhMTUyeF9yZWxlYXNlKGFoYTE1MnhfaG9zdFtpXSk7CisJCWFoYTE1MnhfaG9zdFtpXT1OVUxMOworCX0KK30KKworbW9kdWxlX2luaXQoYWhhMTUyeF9pbml0KTsKK21vZHVsZV9leGl0KGFoYTE1MnhfZXhpdCk7CisKKyNpZiAhZGVmaW5lZChNT0RVTEUpCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTJ4X3NldHVwKGNoYXIgKnN0cikKK3sKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaW50IGludHNbMTFdOworI2Vsc2UKKwlpbnQgaW50c1sxMF07CisjZW5kaWYKKwlnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJaWYoc2V0dXBfY291bnQ+PUFSUkFZX1NJWkUoc2V0dXApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogeW91IGNhbiBvbmx5IGNvbmZpZ3VyZSB1cCB0byB0d28gY29udHJvbGxlcnNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzZXR1cFtzZXR1cF9jb3VudF0uY29uZiAgICAgICAgPSBzdHI7CisJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgICAgID0gaW50c1swXSA+PSAxID8gaW50c1sxXSA6IDB4MzQwOworCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IGludHNbMF0gPj0gMiA/IGludHNbMl0gOiAxMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBpbnRzWzBdID49IDMgPyBpbnRzWzNdIDogNzsKKwlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSBpbnRzWzBdID49IDQgPyBpbnRzWzRdIDogMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBpbnRzWzBdID49IDUgPyBpbnRzWzVdIDogMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBpbnRzWzBdID49IDYgPyBpbnRzWzZdIDogMTsKKwlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgICAgICAgPSBpbnRzWzBdID49IDcgPyBpbnRzWzddIDogREVMQVlfREVGQVVMVDsKKwlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBpbnRzWzBdID49IDggPyBpbnRzWzhdIDogMDsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gaW50c1swXSA+PSA5ID8gaW50c1s5XSA6IERFQlVHX0RFRkFVTFQ7CisJaWYgKGludHNbMF0gPiA5KSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiYWhhMTUyeDogdXNhZ2U6IGFoYTE1Mng9PElPQkFTRT5bLDxJUlE+Wyw8U0NTSSBJRD4iCisJCSAgICAgICAiWyw8UkVDT05ORUNUPlssPFBBUklUWT5bLDxTWU5DSFJPTk9VUz5bLDxERUxBWT5bLDxFWFRfVFJBTlM+Wyw8REVCVUc+XV1dXV1dXV1cbiIpOworI2Vsc2UKKwlpZiAoaW50c1swXSA+IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKn0qLworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFoYTE1Mng6IHVzYWdlOiBhaGExNTJ4PTxJT0JBU0U+Wyw8SVJRPlssPFNDU0kgSUQ+IgorCQkgICAgICAgIlssPFJFQ09OTkVDVD5bLDxQQVJJVFk+Wyw8U1lOQ0hST05PVVM+Wyw8REVMQVk+Wyw8RVhUX1RSQU5TPl1dXV1dXV1cbiIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc2V0dXBfY291bnQrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJhaGExNTJ4PSIsIGFoYTE1Mnhfc2V0dXApOworI2VuZGlmCisKKyNlbmRpZiAvKiAhUENNQ0lBICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTUyeC5oIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc3NjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguaApAQCAtMCwwICsxLDMzNyBAQAorI2lmbmRlZiBfQUhBMTUyWF9ICisjZGVmaW5lIF9BSEExNTJYX0gKKworLyoKKyAqICRJZDogYWhhMTUyeC5oLHYgMi43IDIwMDQvMDEvMjQgMTE6Mzk6MDMgZmlzY2hlciBFeHAgJAorICovCisKKy8qIG51bWJlciBvZiBxdWV1ZWFibGUgY29tbWFuZHMKKyAgICh1bmxlc3Mgd2Ugc3VwcG9ydCBtb3JlIHRoYW4gMSBjbWRfcGVyX2x1biB0aGlzIHNob3VsZCBkbykgKi8KKyNkZWZpbmUgQUhBMTUyWF9NQVhRVUVVRSA3CisKKyNkZWZpbmUgQUhBMTUyWF9SRVZJRCAiQWRhcHRlYyAxNTJ4IFNDU0kgZHJpdmVyOyAkUmV2aXNpb246IDIuNyAkIgorCisvKiBwb3J0IGFkZHJlc3NlcyAqLworI2RlZmluZSBTQ1NJU0VRICAgICAgKEhPU1RJT1BPUlQwKzB4MDApICAgIC8qIFNDU0kgc2VxdWVuY2UgY29udHJvbCAqLworI2RlZmluZSBTWEZSQ1RMMCAgICAgKEhPU1RJT1BPUlQwKzB4MDEpICAgIC8qIFNDU0kgdHJhbnNmZXIgY29udHJvbCAwICovCisjZGVmaW5lIFNYRlJDVEwxICAgICAoSE9TVElPUE9SVDArMHgwMikgICAgLyogU0NTSSB0cmFuc2ZlciBjb250cm9sIDEgKi8KKyNkZWZpbmUgU0NTSVNJRyAgICAgIChIT1NUSU9QT1JUMCsweDAzKSAgICAvKiBTQ1NJIHNpZ25hbCBpbi9vdXQgKi8KKyNkZWZpbmUgU0NTSVJBVEUgICAgIChIT1NUSU9QT1JUMCsweDA0KSAgICAvKiBTQ1NJIHJhdGUgY29udHJvbCAqLworI2RlZmluZSBTRUxJRCAgICAgICAgKEhPU1RJT1BPUlQwKzB4MDUpICAgIC8qIHNlbGVjdGlvbi9yZXNlbGVjdGlvbiBJRCAqLworI2RlZmluZSBTQ1NJSUQgICAgICAgU0VMSUQgICAgICAgICAgICAgICAgIC8qIFNDU0kgSUQgKi8KKyNkZWZpbmUgU0NTSURBVCAgICAgIChIT1NUSU9QT1JUMCsweDA2KSAgICAvKiBTQ1NJIGxhdGNoZWQgZGF0YSAqLworI2RlZmluZSBTQ1NJQlVTICAgICAgKEhPU1RJT1BPUlQwKzB4MDcpICAgIC8qIFNDU0kgZGF0YSBidXMgKi8KKyNkZWZpbmUgU1RDTlQwICAgICAgIChIT1NUSU9QT1JUMCsweDA4KSAgICAvKiBTQ1NJIHRyYW5zZmVyIGNvdW50IDAgKi8KKyNkZWZpbmUgU1RDTlQxICAgICAgIChIT1NUSU9QT1JUMCsweDA5KSAgICAvKiBTQ1NJIHRyYW5zZmVyIGNvdW50IDEgKi8KKyNkZWZpbmUgU1RDTlQyICAgICAgIChIT1NUSU9QT1JUMCsweDBhKSAgICAvKiBTQ1NJIHRyYW5zZmVyIGNvdW50IDIgKi8KKyNkZWZpbmUgU1NUQVQwICAgICAgIChIT1NUSU9QT1JUMCsweDBiKSAgICAvKiBTQ1NJIGludGVycnVwdCBzdGF0dXMgMCAqLworI2RlZmluZSBTU1RBVDEgICAgICAgKEhPU1RJT1BPUlQwKzB4MGMpICAgIC8qIFNDU0kgaW50ZXJydXB0IHN0YXR1cyAxICovCisjZGVmaW5lIFNTVEFUMiAgICAgICAoSE9TVElPUE9SVDArMHgwZCkgICAgLyogU0NTSSBpbnRlcnJ1cHQgc3RhdHVzIDIgKi8KKyNkZWZpbmUgU0NTSVRFU1QgICAgIChIT1NUSU9QT1JUMCsweDBlKSAgICAvKiBTQ1NJIHRlc3QgY29udHJvbCAqLworI2RlZmluZSBTU1RBVDMgICAgICAgU0NTSVRFU1QgICAgICAgICAgICAgIC8qIFNDU0kgaW50ZXJydXB0IHN0YXR1cyAzICovCisjZGVmaW5lIFNTVEFUNCAgICAgICAoSE9TVElPUE9SVDArMHgwZikgICAgLyogU0NTSSBzdGF0dXMgNCAqLworI2RlZmluZSBTSU1PREUwICAgICAgKEhPU1RJT1BPUlQxKzB4MTApICAgIC8qIFNDU0kgaW50ZXJydXB0IG1vZGUgMCAqLworI2RlZmluZSBTSU1PREUxICAgICAgKEhPU1RJT1BPUlQxKzB4MTEpICAgIC8qIFNDU0kgaW50ZXJydXB0IG1vZGUgMSAqLworI2RlZmluZSBETUFDTlRSTDAgICAgKEhPU1RJT1BPUlQxKzB4MTIpICAgIC8qIERNQSBjb250cm9sIDAgKi8KKyNkZWZpbmUgRE1BQ05UUkwxICAgIChIT1NUSU9QT1JUMSsweDEzKSAgICAvKiBETUEgY29udHJvbCAxICovCisjZGVmaW5lIERNQVNUQVQgICAgICAoSE9TVElPUE9SVDErMHgxNCkgICAgLyogRE1BIHN0YXR1cyAqLworI2RlZmluZSBGSUZPU1RBVCAgICAgKEhPU1RJT1BPUlQxKzB4MTUpICAgIC8qIEZJRk8gc3RhdHVzICovCisjZGVmaW5lIERBVEFQT1JUICAgICAoSE9TVElPUE9SVDErMHgxNikgICAgLyogREFUQSBwb3J0ICovCisjZGVmaW5lIEJSU1RDTlRSTCAgICAoSE9TVElPUE9SVDErMHgxOCkgICAgLyogYnVyc3QgY29udHJvbCAqLworI2RlZmluZSBQT1JUQSAgICAgICAgKEhPU1RJT1BPUlQxKzB4MWEpICAgIC8qIFBPUlQgQSAqLworI2RlZmluZSBQT1JUQiAgICAgICAgKEhPU1RJT1BPUlQxKzB4MWIpICAgIC8qIFBPUlQgQiAqLworI2RlZmluZSBSRVYgICAgICAgICAgKEhPU1RJT1BPUlQxKzB4MWMpICAgIC8qIHJldmlzaW9uICovCisjZGVmaW5lIFNUQUNLICAgICAgICAoSE9TVElPUE9SVDErMHgxZCkgICAgLyogc3RhY2sgKi8KKyNkZWZpbmUgVEVTVCAgICAgICAgIChIT1NUSU9QT1JUMSsweDFlKSAgICAvKiB0ZXN0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSU9fUkFOR0UgICAgICAgIDB4MjAKKworLyogdXNlZCBpbiBhaGExNTJ4X3BvcnR0ZXN0ICovCisjZGVmaW5lIE9fUE9SVEEgICAgICAgICAweDFhICAgICAgICAgICAgICAgLyogUE9SVCBBICovCisjZGVmaW5lIE9fUE9SVEIgICAgICAgICAweDFiICAgICAgICAgICAgICAgLyogUE9SVCBCICovCisjZGVmaW5lIE9fRE1BQ05UUkwxICAgICAweDEzICAgICAgICAgICAgICAgLyogRE1BIGNvbnRyb2wgMSAqLworI2RlZmluZSBPX1NUQUNLICAgICAgICAgMHgxZCAgICAgICAgICAgICAgIC8qIHN0YWNrICovCisKKy8qIHVzZWQgaW4gdGMxNTUwX3BvcnR0ZXN0ICovCisjZGVmaW5lIE9fVENfUE9SVEEgICAgICAweDBhICAgICAgICAgICAgICAgLyogUE9SVCBBICovCisjZGVmaW5lIE9fVENfUE9SVEIgICAgICAweDBiICAgICAgICAgICAgICAgLyogUE9SVCBCICovCisjZGVmaW5lIE9fVENfRE1BQ05UUkwxICAweDAzICAgICAgICAgICAgICAgLyogRE1BIGNvbnRyb2wgMSAqLworI2RlZmluZSBPX1RDX1NUQUNLICAgICAgMHgwZCAgICAgICAgICAgICAgIC8qIHN0YWNrICovCisKKy8qIGJpdHMgYW5kIGJpdG1hc2tzIHRvIHBvcnRzICovCisKKy8qIFNDU0kgc2VxdWVuY2UgY29udHJvbCAqLworI2RlZmluZSBURU1PREVPICAgICAgMHg4MAorI2RlZmluZSBFTlNFTE8gICAgICAgMHg0MAorI2RlZmluZSBFTlNFTEkgICAgICAgMHgyMAorI2RlZmluZSBFTlJFU0VMSSAgICAgMHgxMAorI2RlZmluZSBFTkFVVE9BVE5PICAgMHgwOAorI2RlZmluZSBFTkFVVE9BVE5JICAgMHgwNAorI2RlZmluZSBFTkFVVE9BVE5QICAgMHgwMgorI2RlZmluZSBTQ1NJUlNUTyAgICAgMHgwMQorCisvKiBTQ1NJIHRyYW5zZmVyIGNvbnRyb2wgMCAqLworI2RlZmluZSBTQ1NJRU4gICAgICAgMHg4MAorI2RlZmluZSBETUFFTiAgICAgICAgMHg0MAorI2RlZmluZSBDSDEgICAgICAgICAgMHgyMAorI2RlZmluZSBDTFJTVENOVCAgICAgMHgxMAorI2RlZmluZSBTUElPRU4gICAgICAgMHgwOAorI2RlZmluZSBDTFJDSDEgICAgICAgMHgwMgorCisvKiBTQ1NJIHRyYW5zZmVyIGNvbnRyb2wgMSAqLworI2RlZmluZSBCSVRCVUNLRVQgICAgMHg4MAorI2RlZmluZSBTV1JBUEVOICAgICAgMHg0MAorI2RlZmluZSBFTlNQQ0hLICAgICAgMHgyMAorI2RlZmluZSBTVElNRVNFTCAgICAgMHgxOCAgICAvKiBtYXNrICovCisjZGVmaW5lIFNUSU1FU0VMXyAgICAzCisjZGVmaW5lIEVOU1RJTUVSICAgICAweDA0CisjZGVmaW5lIEJZVEVBTElHTiAgICAweDAyCisKKy8qIFNDU0kgc2lnbmFsIElOICovCisjZGVmaW5lIFNJR19DREkgICAgICAgICAgMHg4MAorI2RlZmluZSBTSUdfSU9JICAgICAgICAgIDB4NDAKKyNkZWZpbmUgU0lHX01TR0kgICAgICAgICAweDIwCisjZGVmaW5lIFNJR19BVE5JICAgICAgICAgMHgxMAorI2RlZmluZSBTSUdfU0VMSSAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0lHX0JTWUkgICAgICAgICAweDA0CisjZGVmaW5lIFNJR19SRVFJICAgICAgICAgMHgwMgorI2RlZmluZSBTSUdfQUNLSSAgICAgICAgIDB4MDEKKworLyogU0NTSSBQaGFzZXMgKi8KKyNkZWZpbmUgUF9NQVNLICAgICAgIChTSUdfTVNHSXxTSUdfQ0RJfFNJR19JT0kpCisjZGVmaW5lIFBfREFUQU8gICAgICAoMCkKKyNkZWZpbmUgUF9EQVRBSSAgICAgIChTSUdfSU9JKQorI2RlZmluZSBQX0NNRCAgICAgICAgKFNJR19DREkpCisjZGVmaW5lIFBfU1RBVFVTICAgICAoU0lHX0NESXxTSUdfSU9JKQorI2RlZmluZSBQX01TR08gICAgICAgKFNJR19NU0dJfFNJR19DREkpCisjZGVmaW5lIFBfTVNHSSAgICAgICAoU0lHX01TR0l8U0lHX0NESXxTSUdfSU9JKQorCisvKiBTQ1NJIHNpZ25hbCBPVVQgKi8KKyNkZWZpbmUgU0lHX0NETyAgICAgICAgICAweDgwCisjZGVmaW5lIFNJR19JT08gICAgICAgICAgMHg0MAorI2RlZmluZSBTSUdfTVNHTyAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0lHX0FUTk8gICAgICAgICAweDEwCisjZGVmaW5lIFNJR19TRUxPICAgICAgICAgMHgwOAorI2RlZmluZSBTSUdfQlNZTyAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0lHX1JFUU8gICAgICAgICAweDAyCisjZGVmaW5lIFNJR19BQ0tPICAgICAgICAgMHgwMQorCisvKiBTQ1NJIHJhdGUgY29udHJvbCAqLworI2RlZmluZSBTWEZSICAgICAgICAgMHg3MCAgICAvKiBtYXNrICovCisjZGVmaW5lIFNYRlJfICAgICAgICA0CisjZGVmaW5lIFNPRlMgICAgICAgICAweDBmICAgIC8qIG1hc2sgKi8KKworLyogU0NTSSBJRCAqLworI2RlZmluZSBPSUQgICAgICAgICAgMHg3MAorI2RlZmluZSBPSURfICAgICAgICAgNAorI2RlZmluZSBUSUQgICAgICAgICAgMHgwNworCisvKiBTQ1NJIHRyYW5zZmVyIGNvdW50ICovCisjZGVmaW5lIEdFVFNUQ05UKCkgKCAoR0VUUE9SVChTVENOVDIpPDwxNikgXAorICAgICAgICAgICAgICAgICAgICsgKEdFVFBPUlQoU1RDTlQxKTw8IDgpIFwKKyAgICAgICAgICAgICAgICAgICArIEdFVFBPUlQoU1RDTlQwKSApCisKKyNkZWZpbmUgU0VUU1RDTlQoWCkgeyBTRVRQT1JUKFNUQ05UMiwgKChYKSAmIDB4RkYwMDAwKSA+PiAxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKFNUQ05UMSwgKChYKSAmIDB4MDBGRjAwKSA+PiAgOCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICBTRVRQT1JUKFNUQ05UMCwgKChYKSAmIDB4MDAwMEZGKSApOyB9CisKKy8qIFNDU0kgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBUQVJHRVQgICAgICAgMHg4MAorI2RlZmluZSBTRUxETyAgICAgICAgMHg0MAorI2RlZmluZSBTRUxESSAgICAgICAgMHgyMAorI2RlZmluZSBTRUxJTkdPICAgICAgMHgxMAorI2RlZmluZSBTV1JBUCAgICAgICAgMHgwOAorI2RlZmluZSBTRE9ORSAgICAgICAgMHgwNAorI2RlZmluZSBTUElPUkRZICAgICAgMHgwMgorI2RlZmluZSBETUFET05FICAgICAgMHgwMQorCisjZGVmaW5lIFNFVFNET05FICAgICAweDgwCisjZGVmaW5lIENMUlNFTERPICAgICAweDQwCisjZGVmaW5lIENMUlNFTERJICAgICAweDIwCisjZGVmaW5lIENMUlNFTElOR08gICAweDEwCisjZGVmaW5lIENMUlNXUkFQICAgICAweDA4CisjZGVmaW5lIENMUlNET05FICAgICAweDA0CisjZGVmaW5lIENMUlNQSU9SRFkgICAweDAyCisjZGVmaW5lIENMUkRNQURPTkUgICAweDAxCisKKy8qIFNDU0kgc3RhdHVzIDEgKi8KKyNkZWZpbmUgU0VMVE8gICAgICAgIDB4ODAKKyNkZWZpbmUgQVROVEFSRyAgICAgIDB4NDAKKyNkZWZpbmUgU0NTSVJTVEkgICAgIDB4MjAKKyNkZWZpbmUgUEhBU0VNSVMgICAgIDB4MTAKKyNkZWZpbmUgQlVTRlJFRSAgICAgIDB4MDgKKyNkZWZpbmUgU0NTSVBFUlIgICAgIDB4MDQKKyNkZWZpbmUgUEhBU0VDSEcgICAgIDB4MDIKKyNkZWZpbmUgUkVRSU5JVCAgICAgIDB4MDEKKworI2RlZmluZSBDTFJTRUxUSU1PICAgMHg4MAorI2RlZmluZSBDTFJBVE5PICAgICAgMHg0MAorI2RlZmluZSBDTFJTQ1NJUlNUSSAgMHgyMAorI2RlZmluZSBDTFJCVVNGUkVFICAgMHgwOAorI2RlZmluZSBDTFJTQ1NJUEVSUiAgMHgwNAorI2RlZmluZSBDTFJQSEFTRUNIRyAgMHgwMgorI2RlZmluZSBDTFJSRVFJTklUICAgMHgwMQorCisvKiBTQ1NJIHN0YXR1cyAyICovCisjZGVmaW5lIFNPRkZTRVQgICAgICAweDIwCisjZGVmaW5lIFNFTVBUWSAgICAgICAweDEwCisjZGVmaW5lIFNGVUxMICAgICAgICAweDA4CisjZGVmaW5lIFNGQ05UICAgICAgICAweDA3ICAgIC8qIG1hc2sgKi8KKworLyogU0NTSSBzdGF0dXMgMyAqLworI2RlZmluZSBTQ1NJQ05UICAgICAgMHhmMCAgICAvKiBtYXNrICovCisjZGVmaW5lIFNDU0lDTlRfICAgICA0CisjZGVmaW5lIE9GRkNOVCAgICAgICAweDBmICAgIC8qIG1hc2sgKi8KKworLyogU0NTSSBURVNUIGNvbnRyb2wgKi8KKyNkZWZpbmUgU0NURVNUVSAgICAgIDB4MDgKKyNkZWZpbmUgU0NURVNURCAgICAgIDB4MDQKKyNkZWZpbmUgU1RDVEVTVCAgICAgIDB4MDEKKworLyogU0NTSSBzdGF0dXMgNCAqLworI2RlZmluZSBTWU5DRVJSICAgICAgMHgwNAorI2RlZmluZSBGV0VSUiAgICAgICAgMHgwMgorI2RlZmluZSBGUkVSUiAgICAgICAgMHgwMQorCisjZGVmaW5lIENMUlNZTkNFUlIgICAweDA0CisjZGVmaW5lIENMUkZXRVJSICAgICAweDAyCisjZGVmaW5lIENMUkZSRVJSICAgICAweDAxCisKKy8qIFNDU0kgaW50ZXJydXB0IG1vZGUgMCAqLworI2RlZmluZSBFTlNFTERPICAgICAgMHg0MAorI2RlZmluZSBFTlNFTERJICAgICAgMHgyMAorI2RlZmluZSBFTlNFTElOR08gICAgMHgxMAorI2RlZmluZSBFTlNXUkFQICAgICAgMHgwOAorI2RlZmluZSBFTlNET05FICAgICAgMHgwNAorI2RlZmluZSBFTlNQSU9SRFkgICAgMHgwMgorI2RlZmluZSBFTkRNQURPTkUgICAgMHgwMQorCisvKiBTQ1NJIGludGVycnVwdCBtb2RlIDEgKi8KKyNkZWZpbmUgRU5TRUxUSU1PICAgIDB4ODAKKyNkZWZpbmUgRU5BVE5UQVJHICAgIDB4NDAKKyNkZWZpbmUgRU5TQ1NJUlNUICAgIDB4MjAKKyNkZWZpbmUgRU5QSEFTRU1JUyAgIDB4MTAKKyNkZWZpbmUgRU5CVVNGUkVFICAgIDB4MDgKKyNkZWZpbmUgRU5TQ1NJUEVSUiAgIDB4MDQKKyNkZWZpbmUgRU5QSEFTRUNIRyAgIDB4MDIKKyNkZWZpbmUgRU5SRVFJTklUICAgIDB4MDEKKworLyogRE1BIGNvbnRyb2wgMCAqLworI2RlZmluZSBFTkRNQSAgICAgICAgMHg4MAorI2RlZmluZSBfOEJJVCAgICAgICAgMHg0MAorI2RlZmluZSBETUEgICAgICAgICAgMHgyMAorI2RlZmluZSBXUklURV9SRUFEICAgMHgwOAorI2RlZmluZSBJTlRFTiAgICAgICAgMHgwNAorI2RlZmluZSBSU1RGSUZPICAgICAgMHgwMgorI2RlZmluZSBTV0lOVCAgICAgICAgMHgwMQorCisvKiBETUEgY29udHJvbCAxICovCisjZGVmaW5lIFBXUkRXTiAgICAgICAweDgwCisjZGVmaW5lIFNUSyAgICAgICAgICAweDA3ICAgIC8qIG1hc2sgKi8KKworLyogRE1BIHN0YXR1cyAqLworI2RlZmluZSBBVERPTkUgICAgICAgMHg4MAorI2RlZmluZSBXT1JEUkRZICAgICAgMHg0MAorI2RlZmluZSBJTlRTVEFUICAgICAgMHgyMAorI2RlZmluZSBERklGT0ZVTEwgICAgMHgxMAorI2RlZmluZSBERklGT0VNUCAgICAgMHgwOAorCisvKiBCVVJTVCBjb250cm9sICovCisjZGVmaW5lIEJPTiAgICAgICAgICAweGYwCisjZGVmaW5lIEJPRkYgICAgICAgICAweDBmCisKKy8qIFRFU1QgUkVHSVNURVIgKi8KKyNkZWZpbmUgQk9GRlRNUiAgICAgIDB4NDAKKyNkZWZpbmUgQk9OVE1SICAgICAgIDB4MjAKKyNkZWZpbmUgU1RDTlRIICAgICAgIDB4MTAKKyNkZWZpbmUgU1RDTlRNICAgICAgIDB4MDgKKyNkZWZpbmUgU1RDTlRMICAgICAgIDB4MDQKKyNkZWZpbmUgU0NTSUJMSyAgICAgIDB4MDIKKyNkZWZpbmUgRE1BQkxLICAgICAgIDB4MDEKKworLyogT24gdGhlIEFIQS0xNTJ4IGJvYXJkIFBPUlRBIGFuZCBQT1JUQiBjb250YWluCisgICBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBib2FyZCdzIGNvbmZpZ3VyYXRpb24uICovCit0eXBlZGVmIHVuaW9uIHsKKyAgc3RydWN0IHsKKyAgICB1bnNpZ25lZCByZXNlcnZlZDoyOyAgICAvKiByZXNlcnZlZCAqLworICAgIHVuc2lnbmVkIHRhcmRpc2M6MTsgICAgIC8qIFRhcmdldCBkaXNjb25uZWN0OiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KKyAgICB1bnNpZ25lZCBzeW5jbmVnOjE7ICAgICAvKiBJbml0aWFsIHN5bmMgbmVnOiAwPWRpc2FibGVkLCAxPWVuYWJsZWQgKi8KKyAgICB1bnNpZ25lZCBtc2djbGFzc2VzOjI7ICAvKiBNZXNzYWdlIGNsYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9IzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9IzAsICMxLCAjMiwgIzMsICM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyPSMwLCAjMywgIzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9IzAsICM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgYm9vdDoxOyAgICAgICAgLyogYm9vdDogMD1kaXNhYmxlZCwgMT1lbmFibGVkICovCisgICAgdW5zaWduZWQgZG1hOjE7ICAgICAgICAgLyogVHJhbnNmZXIgbW9kZTogMD1QSU87IDE9RE1BICovCisgICAgdW5zaWduZWQgaWQ6MzsgICAgICAgICAgLyogU0NTSS1pZCAqLworICAgIHVuc2lnbmVkIGlycToyOyAgICAgICAgIC8qIElSUS1DaGFubmVsOiAwLDM9MTIsIDE9MTAsIDI9MTEgKi8KKyAgICB1bnNpZ25lZCBkbWFjaGFuOjI7ICAgICAvKiBETUEtQ2hhbm5lbDogMD0wLCAxPTUsIDI9NiwgMz03ICovCisgICAgdW5zaWduZWQgcGFyaXR5OjE7ICAgICAgLyogU0NTSS1wYXJpdHk6IDE9ZW5hYmxlZCAwPWRpc2FibGVkICovCisgIH0gZmllbGRzOworICB1bnNpZ25lZCBzaG9ydCBwb3J0OworfSBhaGExNTJ4X2NvbmZpZyA7CisKKyNkZWZpbmUgY2ZfcGFyaXR5ICAgICBmaWVsZHMucGFyaXR5CisjZGVmaW5lIGNmX2RtYWNoYW4gICAgZmllbGRzLmRtYWNoYW4KKyNkZWZpbmUgY2ZfaXJxICAgICAgICBmaWVsZHMuaXJxCisjZGVmaW5lIGNmX2lkICAgICAgICAgZmllbGRzLmlkCisjZGVmaW5lIGNmX2RtYSAgICAgICAgZmllbGRzLmRtYQorI2RlZmluZSBjZl9ib290ICAgICAgIGZpZWxkcy5ib290CisjZGVmaW5lIGNmX21zZ2NsYXNzZXMgZmllbGRzLm1zZ2NsYXNzZXMKKyNkZWZpbmUgY2Zfc3luY25lZyAgICBmaWVsZHMuc3luY25lZworI2RlZmluZSBjZl90YXJkaXNjICAgIGZpZWxkcy50YXJkaXNjCisjZGVmaW5lIGNmX3BvcnQgICAgICAgcG9ydAorCisvKiBTb21lIG1hY3JvcyB0byBtYW5pcHVsYXRlIHBvcnRzIGFuZCB0aGVpciBiaXRzICovCisKKyNkZWZpbmUgU0VUUE9SVChQT1JULCBWQUwpCW91dGIoIChWQUwpLCAoUE9SVCkgKQorI2RlZmluZSBHRVRQT1JUKFBPUlQpCQlpbmIoIFBPUlQgKQorI2RlZmluZSBTRVRCSVRTKFBPUlQsIEJJVFMpCW91dGIoIChpbmIoUE9SVCkgfCAoQklUUykpLCAoUE9SVCkgKQorI2RlZmluZSBDTFJCSVRTKFBPUlQsIEJJVFMpCW91dGIoIChpbmIoUE9SVCkgJiB+KEJJVFMpKSwgKFBPUlQpICkKKyNkZWZpbmUgVEVTVEhJKFBPUlQsIEJJVFMpCSgoaW5iKFBPUlQpICYgKEJJVFMpKSA9PSAoQklUUykpCisjZGVmaW5lIFRFU1RMTyhQT1JULCBCSVRTKQkoKGluYihQT1JUKSAmIChCSVRTKSkgPT0gMCkKKworI2RlZmluZSBTRVRSQVRFKFJBVEUpCQlTRVRQT1JUKFNDU0lSQVRFLChSQVRFKSAmIDB4N2YpCisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCitlbnVtIHsKKyAgZGVidWdfcHJvY2luZm8gID0gMHgwMDAxLAorICBkZWJ1Z19xdWV1ZSAgICAgPSAweDAwMDIsCisgIGRlYnVnX2xvY2tzICAgICA9IDB4MDAwNCwKKyAgZGVidWdfaW50ciAgICAgID0gMHgwMDA4LAorICBkZWJ1Z19zZWxlY3Rpb24gPSAweDAwMTAsCisgIGRlYnVnX21zZ28gICAgICA9IDB4MDAyMCwKKyAgZGVidWdfbXNnaSAgICAgID0gMHgwMDQwLAorICBkZWJ1Z19zdGF0dXMgICAgPSAweDAwODAsCisgIGRlYnVnX2NtZCAgICAgICA9IDB4MDEwMCwKKyAgZGVidWdfZGF0YWkgICAgID0gMHgwMjAwLAorICBkZWJ1Z19kYXRhbyAgICAgPSAweDA0MDAsCisgIGRlYnVnX2VoCSAgPSAweDA4MDAsCisgIGRlYnVnX2RvbmUgICAgICA9IDB4MTAwMCwKKyAgZGVidWdfcGhhc2VzICAgID0gMHgyMDAwLAorfTsKKyNlbmRpZgorCisvKiBmb3IgdGhlIHBjbWNpYSBzdHViICovCitzdHJ1Y3QgYWhhMTUyeF9zZXR1cCB7CisJaW50IGlvX3BvcnQ7CisJaW50IGlycTsKKwlpbnQgc2NzaWlkOworCWludCByZWNvbm5lY3Q7CisJaW50IHBhcml0eTsKKwlpbnQgc3luY2hyb25vdXM7CisJaW50IGRlbGF5OworCWludCBleHRfdHJhbnM7CisJaW50IHRjMTU1MDsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaW50IGRlYnVnOworI2VuZGlmCisJY2hhciAqY29uZjsKK307CisKK3N0cnVjdCBTY3NpX0hvc3QgKmFoYTE1MnhfcHJvYmVfb25lKHN0cnVjdCBhaGExNTJ4X3NldHVwICopOwordm9pZCBhaGExNTJ4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2ludCBhaGExNTJ4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworCisjZW5kaWYgLyogX0FIQTE1MlhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoYTE1NDIuYyBiL2RyaXZlcnMvc2NzaS9haGExNTQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5MjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTQyLmMKQEAgLTAsMCArMSwxODMyIEBACisvKiAkSWQ6IGFoYTE1NDIuYyx2IDEuMSAxOTkyLzA3LzI0IDA2OjI3OjM4IHJvb3QgRXhwIHJvb3QgJAorICogIGxpbnV4L2tlcm5lbC9haGExNTQyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBUb21teSBUaG9ybgorICogIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSBFcmljIFlvdW5nZGFsZQorICoKKyAqICBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZQorICogICAgICAgIFVzZSByZXF1ZXN0X2lycSBhbmQgcmVxdWVzdF9kbWEgdG8gaGVscCBwcmV2ZW50IHVuZXhwZWN0ZWQgY29uZmxpY3RzCisgKiAgICAgICAgU2V0IHVwIG9uLWJvYXJkIERNQSBjb250cm9sbGVyLCBzdWNoIHRoYXQgd2UgZG8gbm90IGhhdmUgdG8KKyAqICAgICAgICBoYXZlIHRoZSBiaW9zIGVuYWJsZWQgdG8gdXNlIHRoZSBhaGExNTQyLgorICogIE1vZGlmaWVkIGJ5IERhdmlkIEdlbnR6ZWwKKyAqICAgICAgICBEb24ndCBjYWxsIHJlcXVlc3RfZG1hIGlmIGRtYSBtYXNrIGlzIDAgKGZvciBCdXNMb2dpYyBCVC00NDVTIFZMLUJ1cworICogICAgICAgIGNvbnRyb2xsZXIpLgorICogIE1vZGlmaWVkIGJ5IE1hdHRpIEFhcm5pbworICogICAgICAgIEFjY2VwdCBwYXJhbWV0ZXJzIGZyb20gTElMTyBjbWQtbGluZS4gLS0gMS1PY3QtOTQKKyAqICBNb2RpZmllZCBieSBNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKiAgICAgICAgUmVjb2duaXNlIGV4dGVuZGVkIG1vZGUgb24gQUhBMTU0MkNQLCBkaWZmZXJlbnQgYml0IHRoYW4gMTU0MkNGCisgKiAgICAgICAgMS1KYW4tOTcKKyAqICBNb2RpZmllZCBieSBCam9ybiBMLiBUaG9yZGFyc29uIGFuZCBFaW5hciBUaG9yIEVpbmFyc3NvbgorICogICAgICAgIFJlY29nbml6ZSB0aGF0IERNQTAgaXMgdmFsaWQgRE1BIGNoYW5uZWwgLS0gMTMtSnVsLTk4CisgKiAgTW9kaWZpZWQgYnkgQ2hyaXMgRmF1bGhhYmVyIDxqZWRnYXJAZnhwLm9yZz4KKyAqICAgICAgICBBZGRlZCBtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqICAgICAgICAxOS1KdWwtOTkKKyAqICBNb2RpZmllZCBieSBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICogICAgICAgIEFkZGVkIHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIEFIQS0xNjQwIChNQ0EgdmVyc2lvbiBvZiBBSEEtMTU0MCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiYWhhMTU0Mi5oIgorCisjZGVmaW5lIFNDU0lfQlVGX1BBKGFkZHJlc3MpCWlzYV92aXJ0X3RvX2J1cyhhZGRyZXNzKQorI2RlZmluZSBTQ1NJX1NHX1BBKHNnZW50KQkoaXNhX3BhZ2VfdG9fYnVzKChzZ2VudCktPnBhZ2UpICsgKHNnZW50KS0+b2Zmc2V0KQorCitzdGF0aWMgdm9pZCBCQURfRE1BKHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJcHJpbnRrKEtFUk5fQ1JJVCAiYnVmIHZhZGRyZXNzICVwIHBhZGRyZXNzIDB4JWx4IGxlbmd0aCAlZFxuIiwKKwkgICAgICAgYWRkcmVzcywKKwkgICAgICAgU0NTSV9CVUZfUEEoYWRkcmVzcyksCisJICAgICAgIGxlbmd0aCk7CisJcGFuaWMoIkJ1ZmZlciBhdCBwaHlzaWNhbCBhZGRyZXNzID4gMTZNYiB1c2VkIGZvciBhaGExNTQyIik7Cit9CisKK3N0YXRpYyB2b2lkIEJBRF9TR19ETUEoU2NzaV9DbW5kICogU0NwbnQsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50LAorCQkgICAgICAgaW50IG5zZWcsCisJCSAgICAgICBpbnQgYmFkc2VnKQoreworCXByaW50ayhLRVJOX0NSSVQgInNncG50WyVkOiVkXSBwYWdlICVwLzB4JWxseCBsZW5ndGggJXVcbiIsCisJICAgICAgIGJhZHNlZywgbnNlZywKKwkgICAgICAgcGFnZV9hZGRyZXNzKHNncG50W2JhZHNlZ10ucGFnZSkgKyBzZ3BudFtiYWRzZWddLm9mZnNldCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylTQ1NJX1NHX1BBKCZzZ3BudFtiYWRzZWddKSwKKwkgICAgICAgc2dwbnRbYmFkc2VnXS5sZW5ndGgpOworCisJLyoKKwkgKiBOb3Qgc2FmZSB0byBjb250aW51ZS4KKwkgKi8KKwlwYW5pYygiQnVmZmVyIGF0IHBoeXNpY2FsIGFkZHJlc3MgPiAxNk1iIHVzZWQgZm9yIGFoYTE1NDIiKTsKK30KKworI2luY2x1ZGU8bGludXgvc3RhdC5oPgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2VuZGlmCisKKy8qCisgICBzdGF0aWMgY29uc3QgY2hhciBSQ1NpZFtdID0gIiRIZWFkZXI6IC91c3Ivc3JjL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvUkNTL2FoYTE1NDIuYyx2IDEuMSAxOTkyLzA3LzI0IDA2OjI3OjM4IHJvb3QgRXhwIHJvb3QgJCI7CisgKi8KKworLyogVGhlIGFkYXB0ZWMgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIHF1aXRlIGEgbnVtYmVyIG9mIGFkZHJlc3NlcywgYnV0CisgICBJIGdlbmVyYWxseSBkbyBub3Qgd2FudCB0aGUgY2FyZCBwb2tpbmcgYXJvdW5kIGF0IHJhbmRvbS4gIFdlIGFsbG93CisgICB0d28gYWRkcmVzc2VzIC0gdGhpcyBhbGxvd3MgcGVvcGxlIHRvIHVzZSB0aGUgQWRhcHRlYyB3aXRoIGEgTWlkaQorICAgY2FyZCwgd2hpY2ggYWxzbyB1c2VkIDB4MzMwIC0tIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggTElMTyEgKi8KKworI2RlZmluZSBNQVhCT0FSRFMgNAkJLyogSW5jcmVhc2UgdGhpcyBhbmQgdGhlIHNpemVzIG9mIHRoZQorCQkJCSAgIGFycmF5cyBiZWxvdywgaWYgeW91IG5lZWQgbW9yZS4uICovCisKKy8qIEJvYXJkcyAzLDQgc2xvdHMgYXJlIHJlc2VydmVkIGZvciBJU0FQblAvTUNBIHNjYW5zICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZXNbTUFYQk9BUkRTXSBfX2luaXRkYXRhID0gezB4MzMwLCAweDMzNCwgMCwgMH07CisKKy8qIHNldCBieSBhaGExNTQyX3NldHVwIGFjY29yZGluZyB0byB0aGUgY29tbWFuZCBsaW5lOyB0aGV5IGFsc28gbWF5CisgICBiZSBtYXJrZWQgX19pbml0ZGF0YSwgYnV0IHJlcXVpcmUgemVybyBpbml0aWFsaXplcnMgdGhlbiAqLworCitzdGF0aWMgaW50IHNldHVwX2NhbGxlZFtNQVhCT0FSRFNdOworc3RhdGljIGludCBzZXR1cF9idXNvbltNQVhCT0FSRFNdOworc3RhdGljIGludCBzZXR1cF9idXNvZmZbTUFYQk9BUkRTXTsKK3N0YXRpYyBpbnQgc2V0dXBfZG1hc3BlZWRbTUFYQk9BUkRTXSBfX2luaXRkYXRhID0geyAtMSwgLTEsIC0xLCAtMSB9OworCisvKgorICogTElMTy9Nb2R1bGUgcGFyYW1zOiAgYWhhMTU0Mj08UE9SVEJBU0U+Wyw8QlVTT04+LDxCVVNPRkY+Wyw8RE1BU1BFRUQ+XV0KKyAqCisgKiBXaGVyZTogIDxQT1JUQkFTRT4gaXMgYW55IG9mIHRoZSB2YWxpZCBBSEEgYWRkcmVzc2VzOgorICogICAgICAgICAgICAgICAgICAgICAgMHgxMzAsIDB4MTM0LCAweDIzMCwgMHgyMzQsIDB4MzMwLCAweDMzNAorICogICAgICAgICA8QlVTT04+ICBpcyB0aGUgdGltZSAoaW4gbWljcm9zZWNzKSB0aGF0IEFIQSBzcGVuZHMgb24gdGhlIEFULWJ1cworICogICAgICAgICAgICAgICAgICB3aGVuIHRyYW5zZmVycmluZyBkYXRhLiAgMTU0MkEgcG93ZXItb24gZGVmYXVsdCBpcyAxMXVzLAorICogICAgICAgICAgICAgICAgICB2YWxpZCB2YWx1ZXMgYXJlIGluIHJhbmdlOiAyLi4xNSAoZGVjaW1hbCkKKyAqICAgICAgICAgPEJVU09GRj4gaXMgdGhlIHRpbWUgdGhhdCBBSEEgc3BlbmRzIE9GRiBUSEUgQlVTIGFmdGVyIHdoaWxlCisgKiAgICAgICAgICAgICAgICAgIGl0IGlzIHRyYW5zZmVycmluZyBkYXRhIChub3QgdG8gbW9ub3BvbGl6ZSB0aGUgYnVzKS4KKyAqICAgICAgICAgICAgICAgICAgUG93ZXItb24gZGVmYXVsdCBpcyA0dXMsIHZhbGlkIHJhbmdlOiAxLi42NCBtaWNyb3NlY29uZHMuCisgKiAgICAgICAgIDxETUFTUEVFRD4gRGVmYXVsdCBpcyBqdW1wZXIgc2VsZWN0ZWQgKDE1NDJBOiBvbiB0aGUgSjEpLAorICogICAgICAgICAgICAgICAgICBidXQgZXhwZXJpbWVudGVyIGNhbiBhbHRlciBpdCB3aXRoIHRoaXMuCisgKiAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogNSwgNiwgNywgOCwgMTAgKE1CL3MpCisgKiAgICAgICAgICAgICAgICAgIEZhY3RvcnkgZGVmYXVsdCBpcyA1IE1CL3MuCisgKi8KKworI2lmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIGludCBpc2FwbnAgPSAwOworc3RhdGljIGludCBhaGExNTQyW10gPSB7MHgzMzAsIDExLCA0LCAtMX07Cittb2R1bGVfcGFyYW1fYXJyYXkoYWhhMTU0MiwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShpc2FwbnAsIGJvb2wsIDApOworCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsKKwkJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTU0MiksCisJCTAKKwl9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGlkX3RhYmxlKTsKKworI2Vsc2UKK3N0YXRpYyBpbnQgaXNhcG5wID0gMTsKKyNlbmRpZgorCisjZGVmaW5lIEJJT1NfVFJBTlNMQVRJT05fMTYzMiAwCS8qIFVzZWQgYnkgc29tZSBvbGQgMTU0MkEgYm9hcmRzICovCisjZGVmaW5lIEJJT1NfVFJBTlNMQVRJT05fNjQzMiAxCS8qIERlZmF1bHQgY2FzZSB0aGVzZSBkYXlzICovCisjZGVmaW5lIEJJT1NfVFJBTlNMQVRJT05fMjU1NjMgMgkvKiBCaWcgZGlzayBjYXNlICovCisKK3N0cnVjdCBhaGExNTQyX2hvc3RkYXRhIHsKKwkvKiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgc3RhcnQgYm90aCBvZiB0aGVtIGF0IHRoZSBmaXJzdCBtYWlsYm94ICovCisJaW50IGJpb3NfdHJhbnNsYXRpb247CS8qIE1hcHBpbmcgYmlvcyB1c2VzIC0gZm9yIGNvbXBhdGliaWxpdHkgKi8KKwlpbnQgYWhhMTU0Ml9sYXN0X21iaV91c2VkOworCWludCBhaGExNTQyX2xhc3RfbWJvX3VzZWQ7CisJU2NzaV9DbW5kICpTQ2ludFtBSEExNTQyX01BSUxCT1hFU107CisJc3RydWN0IG1haWxib3ggbWJbMiAqIEFIQTE1NDJfTUFJTEJPWEVTXTsKKwlzdHJ1Y3QgY2NiIGNjYltBSEExNTQyX01BSUxCT1hFU107Cit9OworCisjZGVmaW5lIEhPU1REQVRBKGhvc3QpICgoc3RydWN0IGFoYTE1NDJfaG9zdGRhdGEgKikgJmhvc3QtPmhvc3RkYXRhKQorCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqYWhhX2hvc3RbN107CS8qIE9uZSBmb3IgZWFjaCBJUlEgbGV2ZWwgKDktMTUpICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWhhMTU0Ml9sb2NrKTsKKworCisKKyNkZWZpbmUgV0FJVG5leHR0aW1lb3V0IDMwMDAwMDAKKworc3RhdGljIHZvaWQgc2V0dXBfbWFpbGJveGVzKGludCBiYXNlX2lvLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgaW50IGFoYTE1NDJfcmVzdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitzdGF0aWMgdm9pZCBhaGExNTQyX2ludHJfaGFuZGxlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19haGExNTQyX2ludHJfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjZGVmaW5lIGFoYTE1NDJfaW50cl9yZXNldChiYXNlKSAgb3V0YihJUlNULCBDT05UUk9MKGJhc2UpKQorCisjZGVmaW5lIFdBSVQocG9ydCwgbWFzaywgYWxsb2YsIG5vbmVvZikJCQkJCVwKKyB7IHJlZ2lzdGVyIGludCBXQUlUYml0czsJCQkJCQlcCisgICByZWdpc3RlciBpbnQgV0FJVHRpbWVvdXQgPSBXQUlUbmV4dHRpbWVvdXQ7CQkJCVwKKyAgIHdoaWxlICgxKSB7CQkJCQkJCQlcCisgICAgIFdBSVRiaXRzID0gaW5iKHBvcnQpICYgKG1hc2spOwkJCQkJXAorICAgICBpZiAoKFdBSVRiaXRzICYgKGFsbG9mKSkgPT0gKGFsbG9mKSAmJiAoKFdBSVRiaXRzICYgKG5vbmVvZikpID09IDApKSBcCisgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICAgaWYgKC0tV0FJVHRpbWVvdXQgPT0gMCkgZ290byBmYWlsOwkJCQkJXAorICAgfQkJCQkJCQkJCVwKKyB9CisKKy8qIFNpbWlsYXIgdG8gV0FJVCwgZXhjZXB0IHdlIHVzZSB0aGUgdWRlbGF5IGNhbGwgdG8gcmVndWxhdGUgdGhlCisgICBhbW91bnQgb2YgdGltZSB3ZSB3YWl0LiAgKi8KKyNkZWZpbmUgV0FJVGQocG9ydCwgbWFzaywgYWxsb2YsIG5vbmVvZiwgdGltZW91dCkJCQlcCisgeyByZWdpc3RlciBpbnQgV0FJVGJpdHM7CQkJCQkJXAorICAgcmVnaXN0ZXIgaW50IFdBSVR0aW1lb3V0ID0gdGltZW91dDsJCQkJCVwKKyAgIHdoaWxlICgxKSB7CQkJCQkJCQlcCisgICAgIFdBSVRiaXRzID0gaW5iKHBvcnQpICYgKG1hc2spOwkJCQkJXAorICAgICBpZiAoKFdBSVRiaXRzICYgKGFsbG9mKSkgPT0gKGFsbG9mKSAmJiAoKFdBSVRiaXRzICYgKG5vbmVvZikpID09IDApKSBcCisgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICAgbWRlbGF5KDEpOwkJCQkJCQlcCisgICAgIGlmICgtLVdBSVR0aW1lb3V0ID09IDApIGdvdG8gZmFpbDsJCQkJCVwKKyAgIH0JCQkJCQkJCQlcCisgfQorCitzdGF0aWMgdm9pZCBhaGExNTQyX3N0YXQodm9pZCkKK3sKKy8qCWludCBzID0gaW5iKFNUQVRVUyksIGkgPSBpbmIoSU5UUkZMQUdTKTsKKwlwcmludGsoInN0YXR1cz0leCBpbnRyZmxhZ3M9JXhcbiIsIHMsIGksIFdBSVRuZXh0dGltZW91dC1XQUlUdGltZW91dCk7ICovCit9CisKKy8qIFRoaXMgaXMgYSBiaXQgY29tcGxpY2F0ZWQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFuIGludGVycnVwdAorICAgcm91dGluZSBkb2VzIG5vdCBzZW5kIHNvbWV0aGluZyBvdXQgd2hpbGUgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhpcy4KKyAgIEZvcnR1bmF0ZWx5LCBpdCBpcyBvbmx5IGF0IGJvb3QgdGltZSB0aGF0IG11bHRpLWJ5dGUgbWVzc2FnZXMKKyAgIGFyZSBldmVyIHNlbnQuICovCitzdGF0aWMgaW50IGFoYTE1NDJfb3V0KHVuc2lnbmVkIGludCBiYXNlLCB1bmNoYXIgKiBjbWRwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBnb3RfbG9jazsKKworCWlmIChsZW4gPT0gMSkgeworCQlnb3RfbG9jayA9IDA7CisJCXdoaWxlICgxID09IDEpIHsKKwkJCVdBSVQoU1RBVFVTKGJhc2UpLCBDREYsIDAsIENERik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCQlpZiAoaW5iKFNUQVRVUyhiYXNlKSkgJiBDREYpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW91dGIoKmNtZHAsIERBVEEoYmFzZSkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwkJZ290X2xvY2sgPSAxOworCQl3aGlsZSAobGVuLS0pIHsKKwkJCVdBSVQoU1RBVFVTKGJhc2UpLCBDREYsIDAsIENERik7CisJCQlvdXRiKCpjbWRwKyssIERBVEEoYmFzZSkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJaWYgKGdvdF9sb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwlwcmludGsoS0VSTl9FUlIgImFoYTE1NDJfb3V0IGZhaWxlZCglZCk6ICIsIGxlbiArIDEpOworCWFoYTE1NDJfc3RhdCgpOworCXJldHVybiAxOworfQorCisvKiBPbmx5IHVzZWQgYXQgYm9vdCB0aW1lLCBzbyB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBsYXRlbmN5IGFzIG11Y2gKKyAgIGhlcmUgKi8KKworc3RhdGljIGludCBfX2luaXQgYWhhMTU0Ml9pbih1bnNpZ25lZCBpbnQgYmFzZSwgdW5jaGFyICogY21kcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCXdoaWxlIChsZW4tLSkgeworCQlXQUlUKFNUQVRVUyhiYXNlKSwgREYsIERGLCAwKTsKKwkJKmNtZHArKyA9IGluYihEQVRBKGJhc2UpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CitmYWlsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9pbiBmYWlsZWQoJWQpOiAiLCBsZW4gKyAxKTsKKwlhaGExNTQyX3N0YXQoKTsKKwlyZXR1cm4gMTsKK30KKworLyogU2ltaWxhciB0byBhaGExNTQyX2luLCBleGNlcHQgdGhhdCB3ZSB3YWl0IGEgdmVyeSBzaG9ydCBwZXJpb2Qgb2YgdGltZS4KKyAgIFdlIHVzZSB0aGlzIGlmIHdlIGtub3cgdGhlIGJvYXJkIGlzIGFsaXZlIGFuZCBhd2FrZSwgYnV0IHdlIGFyZSBub3Qgc3VyZQorICAgaWYgdGhlIGJvYXJkIHdpbGwgcmVzcG9uZCB0byB0aGUgY29tbWFuZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZCBvciBub3QgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFoYTE1NDJfaW4xKHVuc2lnbmVkIGludCBiYXNlLCB1bmNoYXIgKiBjbWRwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJd2hpbGUgKGxlbi0tKSB7CisJCVdBSVRkKFNUQVRVUyhiYXNlKSwgREYsIERGLCAwLCAxMDApOworCQkqY21kcCsrID0gaW5iKERBVEEoYmFzZSkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWFrZWNvZGUodW5zaWduZWQgaG9zdGVyciwgdW5zaWduZWQgc2NzaWVycikKK3sKKwlzd2l0Y2ggKGhvc3RlcnIpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4YToJCS8qIExpbmtlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgYW5kIGxpbmtlZCBub3JtYWxseSAqLworCWNhc2UgMHhiOgkJLyogTGlua2VkIGNvbW1hbmQgY29tcGxldGUgd2l0aG91dCBlcnJvciwgaW50ZXJydXB0IGdlbmVyYXRlZCAqLworCQlob3N0ZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTE6CQkvKiBTZWxlY3Rpb24gdGltZSBvdXQtVGhlIGluaXRpYXRvciBzZWxlY3Rpb24gb3IgdGFyZ2V0CisJCQkJICAgcmVzZWxlY3Rpb24gd2FzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIFNDU0kgVGltZSBvdXQgcGVyaW9kICovCisJCWhvc3RlcnIgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCisJY2FzZSAweDEyOgkJLyogRGF0YSBvdmVycnVuL3VuZGVycnVuLVRoZSB0YXJnZXQgYXR0ZW1wdGVkIHRvIHRyYW5zZmVyIG1vcmUgZGF0YQorCQkJCSAgIHRoYW4gd2FzIGFsbG9jYXRlZCBieSB0aGUgRGF0YSBMZW5ndGggZmllbGQgb3IgdGhlIHN1bSBvZiB0aGUKKwkJCQkgICBTY2F0dGVyIC8gR2F0aGVyIERhdGEgTGVuZ3RoIGZpZWxkcy4gKi8KKworCWNhc2UgMHgxMzoJCS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUtVGhlIHRhcmdldCBkcm9wcGVkIHRoZSBTQ1NJIEJTWSBhdCBhbiB1bmV4cGVjdGVkIHRpbWUuICovCisKKwljYXNlIDB4MTU6CQkvKiBNQk8gY29tbWFuZCB3YXMgbm90IDAwLCAwMSBvciAwMi1UaGUgZmlyc3QgYnl0ZSBvZiB0aGUgQ0Igd2FzCisJCQkJICAgaW52YWxpZC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIHNvZnR3YXJlIGZhaWx1cmUuICovCisKKwljYXNlIDB4MTY6CQkvKiBJbnZhbGlkIENDQiBPcGVyYXRpb24gQ29kZS1UaGUgZmlyc3QgYnl0ZSBvZiB0aGUgQ0NCIHdhcyBpbnZhbGlkLgorCQkJCSAgIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYSBzb2Z0d2FyZSBmYWlsdXJlLiAqLworCisJY2FzZSAweDE3OgkJLyogTGlua2VkIENDQiBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIExVTi1BIHN1YnNlcXVlbnQgQ0NCIG9mIGEgc2V0CisJCQkJICAgb2YgbGlua2VkIENDQidzIGRvZXMgbm90IHNwZWNpZnkgdGhlIHNhbWUgbG9naWNhbCB1bml0IG51bWJlciBhcworCQkJCSAgIHRoZSBmaXJzdC4gKi8KKwljYXNlIDB4MTg6CQkvKiBJbnZhbGlkIFRhcmdldCBEaXJlY3Rpb24gcmVjZWl2ZWQgZnJvbSBIb3N0LVRoZSBkaXJlY3Rpb24gb2YgYQorCQkJCSAgIFRhcmdldCBNb2RlIENDQiB3YXMgaW52YWxpZC4gKi8KKworCWNhc2UgMHgxOToJCS8qIER1cGxpY2F0ZSBDQ0IgUmVjZWl2ZWQgaW4gVGFyZ2V0IE1vZGUtTW9yZSB0aGFuIG9uY2UgQ0NCIHdhcworCQkJCSAgIHJlY2VpdmVkIHRvIHNlcnZpY2UgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBzYW1lIHRhcmdldCBMVU4KKwkJCQkgICBhbmQgaW5pdGlhdG9yIFNDU0kgSUQgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLiAqLworCisJY2FzZSAweDFhOgkJLyogSW52YWxpZCBDQ0Igb3IgU2VnbWVudCBMaXN0IFBhcmFtZXRlci1BIHNlZ21lbnQgbGlzdCB3aXRoIGEgemVybworCQkJCSAgIGxlbmd0aCBzZWdtZW50IG9yIGludmFsaWQgc2VnbWVudCBsaXN0IGJvdW5kYXJpZXMgd2FzIHJlY2VpdmVkLgorCQkJCSAgIEEgQ0NCIHBhcmFtZXRlciB3YXMgaW52YWxpZC4gKi8KKwkJREVCKHByaW50aygiQWhhMTU0MjogJXggJXhcbiIsIGhvc3RlcnIsIHNjc2llcnIpKTsKKwkJaG9zdGVyciA9IERJRF9FUlJPUjsJLyogQ291bGRuJ3QgZmluZCBhbnkgYmV0dGVyICovCisJCWJyZWFrOworCisJY2FzZSAweDE0OgkJLyogVGFyZ2V0IGJ1cyBwaGFzZSBzZXF1ZW5jZSBmYWlsdXJlLUFuIGludmFsaWQgYnVzIHBoYXNlIG9yIGJ1cworCQkJCSAgIHBoYXNlIHNlcXVlbmNlIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHRhcmdldC4gVGhlIGhvc3QgYWRhcHRlcgorCQkJCSAgIHdpbGwgZ2VuZXJhdGUgYSBTQ1NJIFJlc2V0IENvbmRpdGlvbiwgbm90aWZ5aW5nIHRoZSBob3N0IHdpdGgKKwkJCQkgICBhIFNDUkQgaW50ZXJydXB0ICovCisJCWhvc3RlcnIgPSBESURfUkVTRVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0MjogbWFrZWNvZGU6IHVua25vd24gaG9zdHN0YXR1cyAleFxuIiwgaG9zdGVycik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2NzaWVyciB8IChob3N0ZXJyIDw8IDE2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWhhMTU0Ml90ZXN0X3BvcnQoaW50IGJzZSwgc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5jaGFyIGlucXVpcnlfY21kW10gPSB7Q01EX0lOUVVJUll9OworCXVuY2hhciBpbnF1aXJ5X3Jlc3VsdFs0XTsKKwl1bmNoYXIgKmNtZHA7CisJaW50IGxlbjsKKwl2b2xhdGlsZSBpbnQgZGVidWcgPSAwOworCisJLyogUXVpY2sgYW5kIGRpcnR5IHRlc3QgZm9yIHByZXNlbmNlIG9mIHRoZSBjYXJkLiAqLworCWlmIChpbmIoU1RBVFVTKGJzZSkpID09IDB4ZmYpCisJCXJldHVybiAwOworCisJLyogUmVzZXQgdGhlIGFkYXB0ZXIuIEkgb3VnaHQgdG8gbWFrZSBhIGhhcmQgcmVzZXQsIGJ1dCBpdCdzIG5vdCByZWFsbHkgbmVjZXNzYXJ5ICovCisKKwkvKiAgREVCKHByaW50aygiYWhhMTU0Ml90ZXN0X3BvcnQgY2FsbGVkIFxuIikpOyAqLworCisJLyogSW4gY2FzZSBzb21lIG90aGVyIGNhcmQgd2FzIHByb2JpbmcgaGVyZSwgcmVzZXQgaW50ZXJydXB0cyAqLworCWFoYTE1NDJfaW50cl9yZXNldChic2UpOwkvKiByZXNldCBpbnRlcnJ1cHRzLCBzbyB0aGV5IGRvbid0IGJsb2NrICovCisKKwlvdXRiKFNSU1QgfCBJUlNUIC8qfFNDUlNUICovICwgQ09OVFJPTChic2UpKTsKKworCW1kZWxheSgyMCk7CQkvKiBXYWl0IGEgbGl0dGxlIGJpdCBmb3IgdGhpbmdzIHRvIHNldHRsZSBkb3duLiAqLworCisJZGVidWcgPSAxOworCS8qIEV4cGVjdCBJTklUIGFuZCBJRExFLCBhbnkgb2YgdGhlIG90aGVycyBhcmUgYmFkICovCisJV0FJVChTVEFUVVMoYnNlKSwgU1RBVE1BU0ssIElOSVQgfCBJRExFLCBTVFNUIHwgRElBR0YgfCBJTlZEQ01EIHwgREYgfCBDREYpOworCisJZGVidWcgPSAyOworCS8qIFNob3VsZG4ndCBoYXZlIGdlbmVyYXRlZCBhbnkgaW50ZXJydXB0cyBkdXJpbmcgcmVzZXQgKi8KKwlpZiAoaW5iKElOVFJGTEFHUyhic2UpKSAmIElOVFJNQVNLKQorCQlnb3RvIGZhaWw7CisKKworCS8qIFBlcmZvcm0gYSBob3N0IGFkYXB0ZXIgaW5xdWlyeSBpbnN0ZWFkIHNvIHdlIGRvIG5vdCBuZWVkIHRvIHNldAorCSAgIHVwIHRoZSBtYWlsYm94ZXMgYWhlYWQgb2YgdGltZSAqLworCisJYWhhMTU0Ml9vdXQoYnNlLCBpbnF1aXJ5X2NtZCwgMSk7CisKKwlkZWJ1ZyA9IDM7CisJbGVuID0gNDsKKwljbWRwID0gJmlucXVpcnlfcmVzdWx0WzBdOworCisJd2hpbGUgKGxlbi0tKSB7CisJCVdBSVQoU1RBVFVTKGJzZSksIERGLCBERiwgMCk7CisJCSpjbWRwKysgPSBpbmIoREFUQShic2UpKTsKKwl9CisKKwlkZWJ1ZyA9IDg7CisJLyogUmVhZGluZyBwb3J0IHNob3VsZCByZXNldCBERiAqLworCWlmIChpbmIoU1RBVFVTKGJzZSkpICYgREYpCisJCWdvdG8gZmFpbDsKKworCWRlYnVnID0gOTsKKwkvKiBXaGVuIEhBQ0MsIGNvbW1hbmQgaXMgY29tcGxldGVkLCBhbmQgd2UncmUgdGhvdWdoIHRlc3RpbmcgKi8KKwlXQUlUKElOVFJGTEFHUyhic2UpLCBIQUNDLCBIQUNDLCAwKTsKKwkvKiBub3cgaW5pdGlhbGl6ZSBhZGFwdGVyICovCisKKwlkZWJ1ZyA9IDEwOworCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwlvdXRiKElSU1QsIENPTlRST0woYnNlKSk7CisKKwlkZWJ1ZyA9IDExOworCisJcmV0dXJuIGRlYnVnOwkJLyogMSA9IG9rICovCitmYWlsOgorCXJldHVybiAwOwkJLyogMCA9IG5vdCBvayAqLworfQorCisvKiBBIHF1aWNrIHdyYXBwZXIgZm9yIGRvX2FoYTE1NDJfaW50cl9oYW5kbGUgdG8gZ3JhYiB0aGUgc3BpbiBsb2NrICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fYWhhMTU0Ml9pbnRyX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisKKwlzaG9zdCA9IGFoYV9ob3N0W2lycSAtIDldOworCWlmICghc2hvc3QpCisJCXBhbmljKCJTcGx1bmdlISIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWFoYTE1NDJfaW50cl9oYW5kbGUoc2hvc3QsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBBICJoaWdoIiBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgYWhhMTU0Ml9pbnRyX2hhbmRsZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2lkICgqbXlfZG9uZSkgKFNjc2lfQ21uZCAqKSA9IE5VTEw7CisJaW50IGVycnN0YXR1cywgbWJpLCBtYm8sIG1iaXN0YXR1czsKKwlpbnQgbnVtYmVyX3NlcnZpY2VkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJU2NzaV9DbW5kICpTQ3RtcDsKKwlpbnQgZmxhZzsKKwlpbnQgbmVlZHNfcmVzdGFydDsKKwlzdHJ1Y3QgbWFpbGJveCAqbWI7CisJc3RydWN0IGNjYiAqY2NiOworCisJbWIgPSBIT1NUREFUQShzaG9zdCktPm1iOworCWNjYiA9IEhPU1REQVRBKHNob3N0KS0+Y2NiOworCisjaWZkZWYgREVCVUcKKwl7CisJCWZsYWcgPSBpbmIoSU5UUkZMQUdTKHNob3N0LT5pb19wb3J0KSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJhaGExNTQyX2ludHJfaGFuZGxlOiAiKTsKKwkJaWYgKCEoZmxhZyAmIEFOWUlOVFIpKQorCQkJcHJpbnRrKCJubyBpbnRlcnJ1cHQ/Iik7CisJCWlmIChmbGFnICYgTUJJRikKKwkJCXByaW50aygiTUJJRiAiKTsKKwkJaWYgKGZsYWcgJiBNQk9BKQorCQkJcHJpbnRrKCJNQk9GICIpOworCQlpZiAoZmxhZyAmIEhBQ0MpCisJCQlwcmludGsoIkhBQ0MgIik7CisJCWlmIChmbGFnICYgU0NSRCkKKwkJCXByaW50aygiU0NSRCAiKTsKKwkJcHJpbnRrKCJzdGF0dXMgJTAyeFxuIiwgaW5iKFNUQVRVUyhzaG9zdC0+aW9fcG9ydCkpKTsKKwl9OworI2VuZGlmCisJbnVtYmVyX3NlcnZpY2VkID0gMDsKKwluZWVkc19yZXN0YXJ0ID0gMDsKKworCXdoaWxlICgxID09IDEpIHsKKwkJZmxhZyA9IGluYihJTlRSRkxBR1Moc2hvc3QtPmlvX3BvcnQpKTsKKworCQkvKiBDaGVjayBmb3IgdW51c3VhbCBpbnRlcnJ1cHRzLiAgSWYgYW55IG9mIHRoZXNlIGhhcHBlbiwgd2Ugc2hvdWxkCisJCSAgIHByb2JhYmx5IGRvIHNvbWV0aGluZyBzcGVjaWFsLCBidXQgZm9yIG5vdyBqdXN0IHByaW50aW5nIGEgbWVzc2FnZQorCQkgICBpcyBzdWZmaWNpZW50LiAgQSBTQ1NJIHJlc2V0IGRldGVjdGVkIGlzIHNvbWV0aGluZyB0aGF0IHdlIHJlYWxseQorCQkgICBuZWVkIHRvIGRlYWwgd2l0aCBpbiBzb21lIHdheS4gKi8KKwkJaWYgKGZsYWcgJiB+TUJJRikgeworCQkJaWYgKGZsYWcgJiBNQk9BKQorCQkJCXByaW50aygiTUJPRiAiKTsKKwkJCWlmIChmbGFnICYgSEFDQykKKwkJCQlwcmludGsoIkhBQ0MgIik7CisJCQlpZiAoZmxhZyAmIFNDUkQpIHsKKwkJCQluZWVkc19yZXN0YXJ0ID0gMTsKKwkJCQlwcmludGsoIlNDUkQgIik7CisJCQl9CisJCX0KKwkJYWhhMTU0Ml9pbnRyX3Jlc2V0KHNob3N0LT5pb19wb3J0KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCW1iaSA9IEhPU1REQVRBKHNob3N0KS0+YWhhMTU0Ml9sYXN0X21iaV91c2VkICsgMTsKKwkJaWYgKG1iaSA+PSAyICogQUhBMTU0Ml9NQUlMQk9YRVMpCisJCQltYmkgPSBBSEExNTQyX01BSUxCT1hFUzsKKworCQlkbyB7CisJCQlpZiAobWJbbWJpXS5zdGF0dXMgIT0gMCkKKwkJCQlicmVhazsKKwkJCW1iaSsrOworCQkJaWYgKG1iaSA+PSAyICogQUhBMTU0Ml9NQUlMQk9YRVMpCisJCQkJbWJpID0gQUhBMTU0Ml9NQUlMQk9YRVM7CisJCX0gd2hpbGUgKG1iaSAhPSBIT1NUREFUQShzaG9zdCktPmFoYTE1NDJfbGFzdF9tYmlfdXNlZCk7CisKKwkJaWYgKG1iW21iaV0uc3RhdHVzID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCQkJLyogSG1tLCBubyBtYWlsLiAgTXVzdCBoYXZlIHJlYWQgaXQgdGhlIGxhc3QgdGltZSBhcm91bmQgKi8KKwkJCWlmICghbnVtYmVyX3NlcnZpY2VkICYmICFuZWVkc19yZXN0YXJ0KQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFoYTE1NDIuYzogaW50ZXJydXB0IHJlY2VpdmVkLCBidXQgbm8gbWFpbC5cbiIpOworCQkJLyogV2UgZGV0ZWN0ZWQgYSByZXNldC4gIFJlc3RhcnQgYWxsIHBlbmRpbmcgY29tbWFuZHMgZm9yCisJCQkgICBkZXZpY2VzIHRoYXQgdXNlIHRoZSBoYXJkIHJlc2V0IG9wdGlvbiAqLworCQkJaWYgKG5lZWRzX3Jlc3RhcnQpCisJCQkJYWhhMTU0Ml9yZXN0YXJ0KHNob3N0KTsKKwkJCXJldHVybjsKKwkJfTsKKworCQltYm8gPSAoc2NzaTJpbnQobWJbbWJpXS5jY2JwdHIpIC0gKFNDU0lfQlVGX1BBKCZjY2JbMF0pKSkgLyBzaXplb2Yoc3RydWN0IGNjYik7CisJCW1iaXN0YXR1cyA9IG1iW21iaV0uc3RhdHVzOworCQltYlttYmldLnN0YXR1cyA9IDA7CisJCUhPU1REQVRBKHNob3N0KS0+YWhhMTU0Ml9sYXN0X21iaV91c2VkID0gbWJpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHCisJCXsKKwkJCWlmIChjY2JbbWJvXS50YXJzdGF0IHwgY2NiW21ib10uaGFzdGF0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJhaGExNTQyX2NvbW1hbmQ6IHJldHVybmluZyAleCAoc3RhdHVzICVkKVxuIiwKKwkJCQkgICAgICAgY2NiW21ib10udGFyc3RhdCArICgoaW50KSBjY2JbbWJvXS5oYXN0YXQgPDwgMTYpLCBtYlttYmldLnN0YXR1cyk7CisJCX07CisjZW5kaWYKKworCQlpZiAobWJpc3RhdHVzID09IDMpCisJCQljb250aW51ZTsJLyogQWJvcnRlZCBjb21tYW5kIG5vdCBmb3VuZCAqLworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLmRvbmUgJWQgJWRcbiIsIG1ibywgbWJpKTsKKyNlbmRpZgorCisJCVNDdG1wID0gSE9TVERBVEEoc2hvc3QpLT5TQ2ludFttYm9dOworCisJCWlmICghU0N0bXAgfHwgIVNDdG1wLT5zY3NpX2RvbmUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFoYTE1NDJfaW50cl9oYW5kbGU6IFVuZXhwZWN0ZWQgaW50ZXJydXB0XG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRhcnN0YXQ9JXgsIGhhc3RhdD0leCBpZGx1bj0leCBjY2IjPSVkIFxuIiwgY2NiW21ib10udGFyc3RhdCwKKwkJCSAgICAgICBjY2JbbWJvXS5oYXN0YXQsIGNjYlttYm9dLmlkbHVuLCBtYm8pOworCQkJcmV0dXJuOworCQl9CisJCW15X2RvbmUgPSBTQ3RtcC0+c2NzaV9kb25lOworCQlpZiAoU0N0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCWtmcmVlKFNDdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCVNDdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJfQorCQkvKiBGZXRjaCB0aGUgc2Vuc2UgZGF0YSwgYW5kIHR1Y2sgaXQgYXdheSwgaW4gdGhlIHJlcXVpcmVkIHNsb3QuICBUaGUKKwkJICAgQWRhcHRlYyBhdXRvbWF0aWNhbGx5IGZldGNoZXMgaXQsIGFuZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorCQkgICB3ZSB3aWxsIHN0aWxsIGhhdmUgaXQgaW4gdGhlIGNkYiB3aGVuIHdlIGNvbWUgYmFjayAqLworCQlpZiAoY2NiW21ib10udGFyc3RhdCA9PSAyKQorCQkJbWVtY3B5KFNDdG1wLT5zZW5zZV9idWZmZXIsICZjY2JbbWJvXS5jZGJbY2NiW21ib10uY2RibGVuXSwKKwkJCSAgICAgICBzaXplb2YoU0N0bXAtPnNlbnNlX2J1ZmZlcikpOworCisKKwkJLyogaXMgdGhlcmUgbWFpbCA6LSkgKi8KKworCQkvKiBtb3JlIGVycm9yIGNoZWNraW5nIGxlZnQgb3V0IGhlcmUgKi8KKwkJaWYgKG1iaXN0YXR1cyAhPSAxKQorCQkJLyogVGhpcyBpcyBzdXJlbHkgd3JvbmcsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCdzIHJpZ2h0ICovCisJCQllcnJzdGF0dXMgPSBtYWtlY29kZShjY2JbbWJvXS5oYXN0YXQsIGNjYlttYm9dLnRhcnN0YXQpOworCQllbHNlCisJCQllcnJzdGF0dXMgPSAwOworCisjaWZkZWYgREVCVUcKKwkJaWYgKGVycnN0YXR1cykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIoYWhhMTU0MiBlcnJvcjoleCAleCAleCkgIiwgZXJyc3RhdHVzLAorCQkJICAgICAgIGNjYlttYm9dLmhhc3RhdCwgY2NiW21ib10udGFyc3RhdCk7CisjZW5kaWYKKworCQlpZiAoY2NiW21ib10udGFyc3RhdCA9PSAyKSB7CisjaWZkZWYgREVCVUcKKwkJCWludCBpOworI2VuZGlmCisJCQlERUIocHJpbnRrKCJhaGExNTQyX2ludHJfaGFuZGxlOiBzZW5zZToiKSk7CisjaWZkZWYgREVCVUcKKwkJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorCQkJCXByaW50aygiJTAyeCAiLCBjY2JbbWJvXS5jZGJbY2NiW21ib10uY2RibGVuICsgaV0pOworCQkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQkvKgorCQkJICAgREVCKHByaW50aygiYWhhMTU0Ml9pbnRyX2hhbmRsZTogYnVmOiIpKTsKKwkJCSAgIGZvciAoaSA9IDA7IGkgPCBidWZmbGVuOyBpKyspCisJCQkgICBwcmludGsoIiUwMnggIiwgKCh1bmNoYXIgKilidWZmKVtpXSk7CisJCQkgICBwcmludGsoIlxuIik7CisJCQkgKi8KKwkJfQorCQlERUIoaWYgKGVycnN0YXR1cykgcHJpbnRrKCJhaGExNTQyX2ludHJfaGFuZGxlOiByZXR1cm5pbmcgJTZ4XG4iLCBlcnJzdGF0dXMpKTsKKwkJU0N0bXAtPnJlc3VsdCA9IGVycnN0YXR1czsKKwkJSE9TVERBVEEoc2hvc3QpLT5TQ2ludFttYm9dID0gTlVMTDsJLyogVGhpcyBlZmZlY3RpdmVseSBmcmVlcyB1cCB0aGUgbWFpbGJveCBzbG90LCBhcworCQkJCQkJCSAgIGZhciBhcyBxdWV1ZWNvbW1hbmQgaXMgY29uY2VybmVkICovCisJCW15X2RvbmUoU0N0bXApOworCQludW1iZXJfc2VydmljZWQrKzsKKwl9OworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwl1bmNoYXIgYWhhY21kID0gQ01EX1NUQVJUX1NDU0k7CisJdW5jaGFyIGRpcmVjdGlvbjsKKwl1bmNoYXIgKmNtZCA9ICh1bmNoYXIgKikgU0NwbnQtPmNtbmQ7CisJdW5jaGFyIHRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworCXVuY2hhciBsdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpidWZmID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCWludCBidWZmbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwlpbnQgbWJvOworCXN0cnVjdCBtYWlsYm94ICptYjsKKwlzdHJ1Y3QgY2NiICpjY2I7CisKKwlERUIoaW50IGkpOworCisJbWIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+bWI7CisJY2NiID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPmNjYjsKKworCURFQihpZiAodGFyZ2V0ID4gMSkgeworCSAgICBTQ3BudC0+cmVzdWx0ID0gRElEX1RJTUVfT1VUIDw8IDE2OworCSAgICBkb25lKFNDcG50KTsgcmV0dXJuIDA7CisJICAgIH0KKwkpOworCisJaWYgKCpjbWQgPT0gUkVRVUVTVF9TRU5TRSkgeworCQkvKiBEb24ndCBkbyB0aGUgY29tbWFuZCAtIHdlIGhhdmUgdGhlIHNlbnNlIGRhdGEgYWxyZWFkeSAqLworI2lmIDAKKwkJLyogc2NzaV9yZXF1ZXN0X3NlbnNlKCkgcHJvdmlkZXMgYSBidWZmZXIgb2Ygc2l6ZSAyNTYsCisJCSAgIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBleHBlY3QgZXF1YWxpdHkgKi8KKwkJaWYgKGJ1ZmZsZW4gIT0gc2l6ZW9mKFNDcG50LT5zZW5zZV9idWZmZXIpKQorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiYWhhMTU0MjogV3JvbmcgYnVmZmVyIGxlbmd0aCBzdXBwbGllZCAiCisJCQkgICAgICAgImZvciByZXF1ZXN0IHNlbnNlICglZClcbiIsIGJ1ZmZsZW4pOworI2VuZGlmCisJCVNDcG50LT5yZXN1bHQgPSAwOworCQlkb25lKFNDcG50KTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIERFQlVHCisJaWYgKCpjbWQgPT0gUkVBRF8xMCB8fCAqY21kID09IFdSSVRFXzEwKQorCQlpID0geHNjc2kyaW50KGNtZCArIDIpOworCWVsc2UgaWYgKCpjbWQgPT0gUkVBRF82IHx8ICpjbWQgPT0gV1JJVEVfNikKKwkJaSA9IHNjc2kyaW50KGNtZCArIDIpOworCWVsc2UKKwkJaSA9IC0xOworCWlmIChkb25lKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYWhhMTU0Ml9xdWV1ZWNvbW1hbmQ6IGRldiAlZCBjbWQgJTAyeCBwb3MgJWQgbGVuICVkICIsIHRhcmdldCwgKmNtZCwgaSwgYnVmZmxlbik7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiYWhhMTU0Ml9jb21tYW5kOiBkZXYgJWQgY21kICUwMnggcG9zICVkIGxlbiAlZCAiLCB0YXJnZXQsICpjbWQsIGksIGJ1ZmZsZW4pOworCWFoYTE1NDJfc3RhdCgpOworCXByaW50ayhLRVJOX0RFQlVHICJhaGExNTQyX3F1ZXVlY29tbWFuZDogZHVtcGluZyBzY3NpIGNtZDoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkJcHJpbnRrKCIlMDJ4ICIsIGNtZFtpXSk7CisJcHJpbnRrKCJcbiIpOworCWlmICgqY21kID09IFdSSVRFXzEwIHx8ICpjbWQgPT0gV1JJVEVfNikKKwkJcmV0dXJuIDA7CS8qIHdlIGFyZSBzdGlsbCB0ZXN0aW5nLCBzbyAqZG9uJ3QqIHdyaXRlICovCisjZW5kaWYKKwkvKiBVc2UgdGhlIG91dGdvaW5nIG1haWxib3hlcyBpbiBhIHJvdW5kLXJvYmluIGZhc2hpb24sIGJlY2F1c2UgdGhpcworCSAgIGlzIGhvdyB0aGUgaG9zdCBhZGFwdGVyIHdpbGwgc2NhbiBmb3IgdGhlbSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCW1ibyA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5haGExNTQyX2xhc3RfbWJvX3VzZWQgKyAxOworCWlmIChtYm8gPj0gQUhBMTU0Ml9NQUlMQk9YRVMpCisJCW1ibyA9IDA7CisKKwlkbyB7CisJCWlmIChtYlttYm9dLnN0YXR1cyA9PSAwICYmIEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFttYm9dID09IE5VTEwpCisJCQlicmVhazsKKwkJbWJvKys7CisJCWlmIChtYm8gPj0gQUhBMTU0Ml9NQUlMQk9YRVMpCisJCQltYm8gPSAwOworCX0gd2hpbGUgKG1ibyAhPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+YWhhMTU0Ml9sYXN0X21ib191c2VkKTsKKworCWlmIChtYlttYm9dLnN0YXR1cyB8fCBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbbWJvXSkKKwkJcGFuaWMoIlVuYWJsZSB0byBmaW5kIGVtcHR5IG1haWxib3ggZm9yIGFoYTE1NDIuXG4iKTsKKworCUhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFttYm9dID0gU0NwbnQ7CS8qIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwcmV2ZW50IHNvbWVvbmUgZWxzZSBmcm9tCisJCQkJCQkJICAgc2NyZXdpbmcgd2l0aCB0aGlzIGNkYi4gKi8KKworCUhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5haGExNTQyX2xhc3RfbWJvX3VzZWQgPSBtYm87CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJTZW5kaW5nIGNvbW1hbmQgKCVkICV4KS4uLiIsIG1ibywgZG9uZSk7CisjZW5kaWYKKworCWFueTJzY3NpKG1iW21ib10uY2NicHRyLCBTQ1NJX0JVRl9QQSgmY2NiW21ib10pKTsJLyogVGhpcyBnZXRzIHRyYXNoZWQgZm9yIHNvbWUgcmVhc29uICovCisKKwltZW1zZXQoJmNjYlttYm9dLCAwLCBzaXplb2Yoc3RydWN0IGNjYikpOworCisJY2NiW21ib10uY2RibGVuID0gU0NwbnQtPmNtZF9sZW47CisKKwlkaXJlY3Rpb24gPSAwOworCWlmICgqY21kID09IFJFQURfMTAgfHwgKmNtZCA9PSBSRUFEXzYpCisJCWRpcmVjdGlvbiA9IDg7CisJZWxzZSBpZiAoKmNtZCA9PSBXUklURV8xMCB8fCAqY21kID09IFdSSVRFXzYpCisJCWRpcmVjdGlvbiA9IDE2OworCisJbWVtY3B5KGNjYlttYm9dLmNkYiwgY21kLCBjY2JbbWJvXS5jZGJsZW4pOworCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BudDsKKwkJc3RydWN0IGNoYWluICpjcHRyOworI2lmZGVmIERFQlVHCisJCXVuc2lnbmVkIGNoYXIgKnB0cjsKKyNlbmRpZgorCQlpbnQgaTsKKwkJY2NiW21ib10ub3AgPSAyOwkvKiBTQ1NJIEluaXRpYXRvciBDb21tYW5kICB3L3NjYXR0ZXItZ2F0aGVyICovCisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJY3B0ciA9IChzdHJ1Y3QgY2hhaW4gKikgU0NwbnQtPmhvc3Rfc2NyaWJibGU7CisJCWlmIChjcHRyID09IE5VTEwpIHsKKwkJCS8qIGZyZWUgdGhlIGNsYWltZWQgbWFpbGJveCBzbG90ICovCisJCQlIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbbWJvXSA9IE5VTEw7CisJCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPnVzZV9zZzsgaSsrKSB7CisJCQlpZiAoc2dwbnRbaV0ubGVuZ3RoID09IDAgfHwgU0NwbnQtPnVzZV9zZyA+IDE2IHx8CisJCQkgICAgKCgoaW50KSBzZ3BudFtpXS5vZmZzZXQpICYgMSkgfHwgKHNncG50W2ldLmxlbmd0aCAmIDEpKSB7CisJCQkJdW5zaWduZWQgY2hhciAqcHRyOworCQkJCXByaW50ayhLRVJOX0NSSVQgIkJhZCBzZWdtZW50IGxpc3Qgc3VwcGxpZWQgdG8gYWhhMTU0Mi5jICglZCwgJWQpXG4iLCBTQ3BudC0+dXNlX3NnLCBpKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPnVzZV9zZzsgaSsrKSB7CisJCQkJCXByaW50ayhLRVJOX0NSSVQgIiVkOiAlcCAlZFxuIiwgaSwKKwkJCQkJICAgICAgIChwYWdlX2FkZHJlc3Moc2dwbnRbaV0ucGFnZSkgKworCQkJCQkJc2dwbnRbaV0ub2Zmc2V0KSwKKwkJCQkJICAgICAgIHNncG50W2ldLmxlbmd0aCk7CisJCQkJfTsKKwkJCQlwcmludGsoS0VSTl9DUklUICJjcHRyICV4OiAiLCAodW5zaWduZWQgaW50KSBjcHRyKTsKKwkJCQlwdHIgPSAodW5zaWduZWQgY2hhciAqKSAmY3B0cltpXTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykKKwkJCQkJcHJpbnRrKCIlMDJ4ICIsIHB0cltpXSk7CisJCQkJcGFuaWMoIkZvb29vb29vb29kIGZpZ2h0ISIpOworCQkJfTsKKwkJCWFueTJzY3NpKGNwdHJbaV0uZGF0YXB0ciwgU0NTSV9TR19QQSgmc2dwbnRbaV0pKTsKKwkJCWlmIChTQ1NJX1NHX1BBKCZzZ3BudFtpXSkgKyBzZ3BudFtpXS5sZW5ndGggLSAxID4gSVNBX0RNQV9USFJFU0hPTEQpCisJCQkJQkFEX1NHX0RNQShTQ3BudCwgc2dwbnQsIFNDcG50LT51c2Vfc2csIGkpOworCQkJYW55MnNjc2koY3B0cltpXS5kYXRhbGVuLCBzZ3BudFtpXS5sZW5ndGgpOworCQl9OworCQlhbnkyc2NzaShjY2JbbWJvXS5kYXRhbGVuLCBTQ3BudC0+dXNlX3NnICogc2l6ZW9mKHN0cnVjdCBjaGFpbikpOworCQlhbnkyc2NzaShjY2JbbWJvXS5kYXRhcHRyLCBTQ1NJX0JVRl9QQShjcHRyKSk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJjcHRyICV4OiAiLCBjcHRyKTsKKwkJcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgY3B0cjsKKwkJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgcHRyW2ldKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWNjYlttYm9dLm9wID0gMDsJLyogU0NTSSBJbml0aWF0b3IgQ29tbWFuZCAqLworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCWFueTJzY3NpKGNjYlttYm9dLmRhdGFsZW4sIGJ1ZmZsZW4pOworCQlpZiAoYnVmZiAmJiBTQ1NJX0JVRl9QQShidWZmICsgYnVmZmxlbiAtIDEpID4gSVNBX0RNQV9USFJFU0hPTEQpCisJCQlCQURfRE1BKGJ1ZmYsIGJ1ZmZsZW4pOworCQlhbnkyc2NzaShjY2JbbWJvXS5kYXRhcHRyLCBTQ1NJX0JVRl9QQShidWZmKSk7CisJfTsKKwljY2JbbWJvXS5pZGx1biA9ICh0YXJnZXQgJiA3KSA8PCA1IHwgZGlyZWN0aW9uIHwgKGx1biAmIDcpOwkvKlNDU0kgVGFyZ2V0IElkICovCisJY2NiW21ib10ucnNhbGVuID0gMTY7CisJY2NiW21ib10ubGlua3B0clswXSA9IGNjYlttYm9dLmxpbmtwdHJbMV0gPSBjY2JbbWJvXS5saW5rcHRyWzJdID0gMDsKKwljY2JbbWJvXS5jb21tbGlua2lkID0gMDsKKworI2lmZGVmIERFQlVHCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFoYTE1NDJfY29tbWFuZDogc2VuZGluZy4uICIpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNjYlttYm9dKSAtIDEwOyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgKCh1bmNoYXIgKikgJiBjY2JbbWJvXSlbaV0pOworCX07CisjZW5kaWYKKworCWlmIChkb25lKSB7CisJCURFQihwcmludGsoImFoYTE1NDJfcXVldWVjb21tYW5kOiBub3cgd2FpdGluZyBmb3IgaW50ZXJydXB0ICIpOworCQkgICAgYWhhMTU0Ml9zdGF0KCkpOworCQlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwkJbWJbbWJvXS5zdGF0dXMgPSAxOworCQlhaGExNTQyX291dChTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0LCAmYWhhY21kLCAxKTsJLyogc3RhcnQgc2NzaSBjb21tYW5kICovCisJCURFQihhaGExNTQyX3N0YXQoKSk7CisJfSBlbHNlCisJCXByaW50aygiYWhhMTU0Ml9xdWV1ZWNvbW1hbmQ6IGRvbmUgY2FuJ3QgYmUgTlVMTFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSBtYWlsYm94ZXMgKi8KK3N0YXRpYyB2b2lkIHNldHVwX21haWxib3hlcyhpbnQgYnNlLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbWFpbGJveCAqbWI7CisJc3RydWN0IGNjYiAqY2NiOworCisJdW5jaGFyIGNtZFs1XSA9IHsgQ01EX01CSU5JVCwgQUhBMTU0Ml9NQUlMQk9YRVMsIDAsIDAsIDB9OworCisJbWIgPSBIT1NUREFUQShzaHBudCktPm1iOworCWNjYiA9IEhPU1REQVRBKHNocG50KS0+Y2NiOworCisJZm9yIChpID0gMDsgaSA8IEFIQTE1NDJfTUFJTEJPWEVTOyBpKyspIHsKKwkJbWJbaV0uc3RhdHVzID0gbWJbQUhBMTU0Ml9NQUlMQk9YRVMgKyBpXS5zdGF0dXMgPSAwOworCQlhbnkyc2NzaShtYltpXS5jY2JwdHIsIFNDU0lfQlVGX1BBKCZjY2JbaV0pKTsKKwl9OworCWFoYTE1NDJfaW50cl9yZXNldChic2UpOwkvKiByZXNldCBpbnRlcnJ1cHRzLCBzbyB0aGV5IGRvbid0IGJsb2NrICovCisJYW55MnNjc2koKGNtZCArIDIpLCBTQ1NJX0JVRl9QQShtYikpOworCWFoYTE1NDJfb3V0KGJzZSwgY21kLCA1KTsKKwlXQUlUKElOVFJGTEFHUyhic2UpLCBJTlRSTUFTSywgSEFDQywgMCk7CisJd2hpbGUgKDApIHsKK2ZhaWw6CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9kZXRlY3Q6IGZhaWxlZCBzZXR0aW5nIHVwIG1haWxib3hlc1xuIik7CisJfQorCWFoYTE1NDJfaW50cl9yZXNldChic2UpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTQyX2dldGNvbmZpZyhpbnQgYmFzZV9pbywgdW5zaWduZWQgY2hhciAqaXJxX2xldmVsLCB1bnNpZ25lZCBjaGFyICpkbWFfY2hhbiwgdW5zaWduZWQgY2hhciAqc2NzaV9pZCkKK3sKKwl1bmNoYXIgaW5xdWlyeV9jbWRbXSA9IHtDTURfUkVUQ09ORn07CisJdW5jaGFyIGlucXVpcnlfcmVzdWx0WzNdOworCWludCBpOworCWkgPSBpbmIoU1RBVFVTKGJhc2VfaW8pKTsKKwlpZiAoaSAmIERGKSB7CisJCWkgPSBpbmIoREFUQShiYXNlX2lvKSk7CisJfTsKKwlhaGExNTQyX291dChiYXNlX2lvLCBpbnF1aXJ5X2NtZCwgMSk7CisJYWhhMTU0Ml9pbihiYXNlX2lvLCBpbnF1aXJ5X3Jlc3VsdCwgMyk7CisJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwl3aGlsZSAoMCkgeworZmFpbDoKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyX2RldGVjdDogcXVlcnkgYm9hcmQgc2V0dGluZ3NcbiIpOworCX0KKwlhaGExNTQyX2ludHJfcmVzZXQoYmFzZV9pbyk7CisJc3dpdGNoIChpbnF1aXJ5X3Jlc3VsdFswXSkgeworCWNhc2UgMHg4MDoKKwkJKmRtYV9jaGFuID0gNzsKKwkJYnJlYWs7CisJY2FzZSAweDQwOgorCQkqZG1hX2NoYW4gPSA2OworCQlicmVhazsKKwljYXNlIDB4MjA6CisJCSpkbWFfY2hhbiA9IDU7CisJCWJyZWFrOworCWNhc2UgMHgwMToKKwkJKmRtYV9jaGFuID0gMDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGFkYXB0ZXIsIGFsdGhvdWdoIEFkYXB0ZWMgMTU0MiBjb21wYXRpYmxlLCBkb2Vzbid0IHVzZSBhIERNQSBjaGFubmVsLgorCQkgICBDdXJyZW50bHkgb25seSBhd2FyZSBvZiB0aGUgQnVzTG9naWMgQlQtNDQ1UyBWTC1CdXMgYWRhcHRlciB3aGljaCBuZWVkcyB0aGlzLiAqLworCQkqZG1hX2NoYW4gPSAweEZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBkZXRlcm1pbmUgQWRhcHRlYyBETUEgcHJpb3JpdHkuICBEaXNhYmxpbmcgYm9hcmRcbiIpOworCQlyZXR1cm4gLTE7CisJfTsKKwlzd2l0Y2ggKGlucXVpcnlfcmVzdWx0WzFdKSB7CisJY2FzZSAweDQwOgorCQkqaXJxX2xldmVsID0gMTU7CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwkJKmlycV9sZXZlbCA9IDE0OworCQlicmVhazsKKwljYXNlIDB4ODoKKwkJKmlycV9sZXZlbCA9IDEyOworCQlicmVhazsKKwljYXNlIDB4NDoKKwkJKmlycV9sZXZlbCA9IDExOworCQlicmVhazsKKwljYXNlIDB4MjoKKwkJKmlycV9sZXZlbCA9IDEwOworCQlicmVhazsKKwljYXNlIDB4MToKKwkJKmlycV9sZXZlbCA9IDk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGRldGVybWluZSBBZGFwdGVjIElSUSBsZXZlbC4gIERpc2FibGluZyBib2FyZFxuIik7CisJCXJldHVybiAtMTsKKwl9OworCSpzY3NpX2lkID0gaW5xdWlyeV9yZXN1bHRbMl0gJiA3OworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgMTU0MkMgYm9hcmRzIC0gd2UgY2FuIGRldGVjdAorICAgdGhlIHNwZWNpYWwgZmlybXdhcmUgc2V0dGluZ3MgYW5kIHVubG9jayB0aGUgYm9hcmQgKi8KKworc3RhdGljIGludCBfX2luaXQgYWhhMTU0Ml9tYmVuYWJsZShpbnQgYmFzZSkKK3sKKwlzdGF0aWMgdW5jaGFyIG1iZW5hYmxlX2NtZFszXTsKKwlzdGF0aWMgdW5jaGFyIG1iZW5hYmxlX3Jlc3VsdFsyXTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gQklPU19UUkFOU0xBVElPTl82NDMyOworCisJbWJlbmFibGVfY21kWzBdID0gQ01EX0VYVEJJT1M7CisJYWhhMTU0Ml9vdXQoYmFzZSwgbWJlbmFibGVfY21kLCAxKTsKKwlpZiAoYWhhMTU0Ml9pbjEoYmFzZSwgbWJlbmFibGVfcmVzdWx0LCAyKSkKKwkJcmV0dXJuIHJldHZhbDsKKwlXQUlUZChJTlRSRkxBR1MoYmFzZSksIElOVFJNQVNLLCBIQUNDLCAwLCAxMDApOworCWFoYTE1NDJfaW50cl9yZXNldChiYXNlKTsKKworCWlmICgobWJlbmFibGVfcmVzdWx0WzBdICYgMHgwOCkgfHwgbWJlbmFibGVfcmVzdWx0WzFdKSB7CisJCW1iZW5hYmxlX2NtZFswXSA9IENNRF9NQkVOQUJMRTsKKwkJbWJlbmFibGVfY21kWzFdID0gMDsKKwkJbWJlbmFibGVfY21kWzJdID0gbWJlbmFibGVfcmVzdWx0WzFdOworCisJCWlmICgobWJlbmFibGVfcmVzdWx0WzBdICYgMHgwOCkgJiYgKG1iZW5hYmxlX3Jlc3VsdFsxXSAmIDB4MDMpKQorCQkJcmV0dmFsID0gQklPU19UUkFOU0xBVElPTl8yNTU2MzsKKworCQlhaGExNTQyX291dChiYXNlLCBtYmVuYWJsZV9jbWQsIDMpOworCQlXQUlUKElOVFJGTEFHUyhiYXNlKSwgSU5UUk1BU0ssIEhBQ0MsIDApOworCX07CisJd2hpbGUgKDApIHsKK2ZhaWw6CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9tYmVuYWJsZTogTWFpbGJveCBpbml0IGZhaWxlZFxuIik7CisJfQorCWFoYTE1NDJfaW50cl9yZXNldChiYXNlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBRdWVyeSB0aGUgYm9hcmQgdG8gZmluZCBvdXQgaWYgaXQgaXMgYSAxNTQyIG9yIGEgMTc0MCwgb3Igd2hhdGV2ZXIuICovCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTQyX3F1ZXJ5KGludCBiYXNlX2lvLCBpbnQgKnRyYW5zbCkKK3sKKwl1bmNoYXIgaW5xdWlyeV9jbWRbXSA9IHtDTURfSU5RVUlSWX07CisJdW5jaGFyIGlucXVpcnlfcmVzdWx0WzRdOworCWludCBpOworCWkgPSBpbmIoU1RBVFVTKGJhc2VfaW8pKTsKKwlpZiAoaSAmIERGKSB7CisJCWkgPSBpbmIoREFUQShiYXNlX2lvKSk7CisJfTsKKwlhaGExNTQyX291dChiYXNlX2lvLCBpbnF1aXJ5X2NtZCwgMSk7CisJYWhhMTU0Ml9pbihiYXNlX2lvLCBpbnF1aXJ5X3Jlc3VsdCwgNCk7CisJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwl3aGlsZSAoMCkgeworZmFpbDoKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyX2RldGVjdDogcXVlcnkgY2FyZCB0eXBlXG4iKTsKKwl9CisJYWhhMTU0Ml9pbnRyX3Jlc2V0KGJhc2VfaW8pOworCisJKnRyYW5zbCA9IEJJT1NfVFJBTlNMQVRJT05fNjQzMjsJLyogRGVmYXVsdCBjYXNlICovCisKKwkvKiBGb3IgYW4gQUhBMTc0MCBzZXJpZXMgYm9hcmQsIHdlIGlnbm9yZSB0aGUgYm9hcmQgc2luY2UgdGhlcmUgaXMgYQorCSAgIGhhcmR3YXJlIGJ1ZyB3aGljaCBjYW4gbGVhZCB0byB3cm9uZyBibG9ja3MgYmVpbmcgcmV0dXJuZWQgaWYgdGhlIGJvYXJkCisJICAgaXMgb3BlcmF0aW5nIGluIHRoZSAxNTQyIGVtdWxhdGlvbiBtb2RlLiAgU2luY2UgdGhlcmUgaXMgYW4gZXh0ZW5kZWQgbW9kZQorCSAgIGRyaXZlciwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgYm9hcmQgYW5kIGxldCB0aGUgMTc0MCBkcml2ZXIgcGljayBpdCB1cC4KKwkgKi8KKworCWlmIChpbnF1aXJ5X3Jlc3VsdFswXSA9PSAweDQzKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFoYTE1NDIuYzogRW11bGF0aW9uIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgQUhBIDE3NE4gaGFyZHdhcmUuXG4iKTsKKwkJcmV0dXJuIDE7CisJfTsKKworCS8qIEFsd2F5cyBjYWxsIHRoaXMgLSBib2FyZHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBleHRlbmRlZCBiaW9zIHRyYW5zbGF0aW9uCisJICAgd2lsbCBpZ25vcmUgdGhlIGNvbW1hbmQsIGFuZCB3ZSB3aWxsIHNldCB0aGUgcHJvcGVyIGRlZmF1bHQgKi8KKworCSp0cmFuc2wgPSBhaGExNTQyX21iZW5hYmxlKGJhc2VfaW8pOworCisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqc2V0dXBfc3RyW01BWEJPQVJEU10gX19pbml0ZGF0YTsKK3N0YXRpYyBpbnQgc2V0dXBfaWR4ID0gMDsKKworc3RhdGljIHZvaWQgX19pbml0IGFoYTE1NDJfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisJY29uc3QgY2hhciAqYWhhdXNhZ2UgPSAiYWhhMTU0MjogdXNhZ2U6IGFoYTE1NDI9PFBPUlRCQVNFPlssPEJVU09OPiw8QlVTT0ZGPlssPERNQVNQRUVEPl1dXG4iOworCWludCBzZXR1cF9wb3J0YmFzZTsKKworCWlmIChzZXR1cF9pZHggPj0gTUFYQk9BUkRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0MjogYWhhMTU0Ml9zZXR1cCBjYWxsZWQgdG9vIG1hbnkgdGltZXMhIEJhZCBMSUxPIHBhcmFtcyA/XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIgICBFbnRyeWxpbmUgMTogJXNcbiIsIHNldHVwX3N0clswXSk7CisJCXByaW50ayhLRVJOX0VSUiAiICAgRW50cnlsaW5lIDI6ICVzXG4iLCBzZXR1cF9zdHJbMV0pOworCQlwcmludGsoS0VSTl9FUlIgIiAgIFRoaXMgbGluZTogICAlc1xuIiwgc3RyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW50c1swXSA8IDEgfHwgaW50c1swXSA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyOiAlc1xuIiwgc3RyKTsKKwkJcHJpbnRrKGFoYXVzYWdlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyOiBXcm9uZyBwYXJhbWV0ZXJzIG1heSBjYXVzZSBzeXN0ZW0gbWFsZnVuY3Rpb24uLiBXZSB0cnkgYW55d2F5Li5cbiIpOworCX0KKwlzZXR1cF9jYWxsZWRbc2V0dXBfaWR4XSA9IGludHNbMF07CisJc2V0dXBfc3RyW3NldHVwX2lkeF0gPSBzdHI7CisKKwlzZXR1cF9wb3J0YmFzZSA9IGludHNbMF0gPj0gMSA/IGludHNbMV0gOiAwOwkvKiBQcmVzZXJ2ZSB0aGUgZGVmYXVsdCB2YWx1ZS4uICovCisJc2V0dXBfYnVzb25bc2V0dXBfaWR4XSA9IGludHNbMF0gPj0gMiA/IGludHNbMl0gOiA3OworCXNldHVwX2J1c29mZltzZXR1cF9pZHhdID0gaW50c1swXSA+PSAzID8gaW50c1szXSA6IDU7CisJaWYgKGludHNbMF0gPj0gNCkgCisJeworCQlpbnQgYXRidCA9IC0xOworCQlzd2l0Y2ggKGludHNbNF0pIHsKKwkJY2FzZSA1OgorCQkJYXRidCA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYXRidCA9IDB4MDQ7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJYXRidCA9IDB4MDE7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJYXRidCA9IDB4MDI7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWF0YnQgPSAweDAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1NDI6ICVzXG4iLCBzdHIpOworCQkJcHJpbnRrKGFoYXVzYWdlKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0MjogVmFsaWQgdmFsdWVzIGZvciBETUFTUEVFRCBhcmUgNS04LCAxMCBNQi9zLiAgVXNpbmcganVtcGVyIGRlZmF1bHRzLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlzZXR1cF9kbWFzcGVlZFtzZXR1cF9pZHhdID0gYXRidDsKKwl9CisJaWYgKHNldHVwX3BvcnRiYXNlICE9IDApCisJCWJhc2VzW3NldHVwX2lkeF0gPSBzZXR1cF9wb3J0YmFzZTsKKworCSsrc2V0dXBfaWR4OworfQorCitzdGF0aWMgaW50IF9faW5pdCBkb19zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbNV07CisKKwlpbnQgY291bnQ9c2V0dXBfaWR4OworCisJZ2V0X29wdGlvbnMoc3RyLCBzaXplb2YoaW50cykvc2l6ZW9mKGludCksIGludHMpOworCWFoYTE1NDJfc2V0dXAoc3RyLGludHMpOworCisJcmV0dXJuIGNvdW50PHNldHVwX2lkeDsKK30KKworX19zZXR1cCgiYWhhMTU0Mj0iLGRvX3NldHVwKTsKKyNlbmRpZgorCisvKiByZXR1cm4gbm9uLXplcm8gb24gZGV0ZWN0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBhaGExNTQyX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXVuc2lnbmVkIGNoYXIgZG1hX2NoYW47CisJdW5zaWduZWQgY2hhciBpcnFfbGV2ZWw7CisJdW5zaWduZWQgY2hhciBzY3NpX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGJhc2VfaW87CisJaW50IHRyYW5zOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCWludCBpbmR4OworCisJREVCKHByaW50aygiYWhhMTU0Ml9kZXRlY3Q6IFxuIikpOworCisJdHBudC0+cHJvY19uYW1lID0gImFoYTE1NDIiOworCisjaWZkZWYgTU9EVUxFCisJYmFzZXNbMF0gPSBhaGExNTQyWzBdOworCXNldHVwX2J1c29uWzBdID0gYWhhMTU0MlsxXTsKKwlzZXR1cF9idXNvZmZbMF0gPSBhaGExNTQyWzJdOworCXsKKwkJaW50IGF0YnQgPSAtMTsKKwkJc3dpdGNoIChhaGExNTQyWzNdKSB7CisJCWNhc2UgNToKKwkJCWF0YnQgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWF0YnQgPSAweDA0OworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWF0YnQgPSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWF0YnQgPSAweDAyOworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQlhdGJ0ID0gMHgwMzsKKwkJCWJyZWFrOworCQl9OworCQlzZXR1cF9kbWFzcGVlZFswXSA9IGF0YnQ7CisJfQorI2VuZGlmCisKKwkvKgorCSAqCUZpbmQgTWljcm9DaGFubmVsIGNhcmRzIChBSEExNjQwKQorCSAqLworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJaWYoTUNBX2J1cykgeworCQlpbnQgc2xvdCA9IDA7CisJCWludCBwb3MgPSAwOworCisJCWZvciAoaW5keCA9IDA7IChzbG90ICE9ICBNQ0FfTk9URk9VTkQpICYmIAorCQkJICAgICAoaW5keCA8IHNpemVvZihiYXNlcykvc2l6ZW9mKGJhc2VzWzBdKSk7IGluZHgrKykgeworCisJCQlpZiAoYmFzZXNbaW5keF0pCisJCQkJY29udGludWU7CisKKwkJCS8qIERldGVjdCBvbmx5IEFIQS0xNjQwIGNhcmRzIC0tIE1DQSBJRCAwRjFGICovCisJCQlzbG90ID0gbWNhX2ZpbmRfdW51c2VkX2FkYXB0ZXIoMHgwZjFmLCBzbG90KTsKKwkJCWlmIChzbG90ID09IE1DQV9OT1RGT1VORCkKKwkJCQlicmVhazsKKworCQkJCisJCQkvKiBGb3VuZCBvbmUgKi8KKwkJCXBvcyA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMyk7CisJCQkKKwkJCS8qIERlY29kZSBhZGRyZXNzICovCisJCQlpZiAocG9zICYgMHg4MCkgeworCQkJCWlmIChwb3MgJiAweDAyKSB7CisJCQkJCWlmIChwb3MgJiAweDAxKQorCQkJCQkJYmFzZXNbaW5keF0gPSAweDMzNDsKKwkJCQkJZWxzZQorCQkJCQkJYmFzZXNbaW5keF0gPSAweDIzNDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocG9zICYgMHgwMSkKKwkJCQkJCWJhc2VzW2luZHhdID0gMHgxMzQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocG9zICYgMHgwMikgeworCQkJCQlpZiAocG9zICYgMHgwMSkKKwkJCQkJCWJhc2VzW2luZHhdID0gMHgzMzA7CisJCQkJCWVsc2UKKwkJCQkJCWJhc2VzW2luZHhdID0gMHgyMzA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBvcyAmIDB4MDEpCisJCQkJCQliYXNlc1tpbmR4XSA9IDB4MTMwOworCQkJCX0KKwkJCX0KKworCQkJLyogTm8gbmVlZCB0byBkZWNvZGUgSVJRIGFuZCBBcmIgbGV2ZWwgLS0gdGhvc2UgYXJlCisJCQkgKiByZWFkIG9mZiB0aGUgY2FyZCBsYXRlci4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgYW4gQUhBLTE2NDAgaW4gTUNBIHNsb3QgJWQsIEkvTyAweCUwNHhcbiIsIHNsb3QsIGJhc2VzW2luZHhdKTsKKworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIkFkYXB0ZXIgQUhBLTE2NDAiKTsKKwkJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgTlVMTCwgTlVMTCk7CisJCQltY2FfbWFya19hc191c2VkKHNsb3QpOworCQkJCisJCQkvKiBHbyBvbiAqLworCQkJc2xvdCsrOworCQl9CisJCQorCX0KKyNlbmRpZgorCisJLyoKKwkgKglIdW50IGZvciBJU0EgUGx1ZyduJ1ByYXkgQWRhcHRlY3MgKEFIQTE1MzUpCisJICovCisJIAorCWlmKGlzYXBucCkKKwl7CisJCXN0cnVjdCBwbnBfZGV2ICpwZGV2ID0gTlVMTDsKKwkJZm9yKGluZHggPSAwOyBpbmR4IDxzaXplb2YoYmFzZXMpL3NpemVvZihiYXNlc1swXSk7aW5keCsrKQorCQl7CisJCQlpZihiYXNlc1tpbmR4XSkKKwkJCQljb250aW51ZTsKKwkJCXBkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwgSVNBUE5QX1ZFTkRPUignQScsICdEJywgJ1AnKSwgCisJCQkJSVNBUE5QX0ZVTkNUSU9OKDB4MTU0MiksIHBkZXYpOworCQkJaWYocGRldj09TlVMTCkKKwkJCQlicmVhazsKKwkJCS8qCisJCQkgKglBY3RpdmF0ZSB0aGUgUG5QIGNhcmQKKwkJCSAqLworCQkJIAorCQkJaWYocG5wX2RldmljZV9hdHRhY2gocGRldik8MCkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJaWYocG5wX2FjdGl2YXRlX2RldihwZGV2KTwwKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2gocGRldik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCWlmKCFwbnBfcG9ydF92YWxpZChwZGV2LCAwKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKHBkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCQorCQkJYmFzZXNbaW5keF0gPSBwbnBfcG9ydF9zdGFydChwZGV2LCAwKTsKKwkJCQorCQkJLyogVGhlIGNhcmQgY2FuIGJlIHF1ZXJpZWQgZm9yIGl0cyBETUEsIHdlIGhhdmUgCisJCQkgICB0aGUgRE1BIHNldCB1cCB0aGF0IGlzIGVub3VnaCAqLworCQkJICAgCisJCQlwcmludGsoS0VSTl9JTkZPICJJU0FQblAgZm91bmQgYW4gQUhBMTUzNSBhdCBJL08gMHglMDNYXG4iLCBiYXNlc1tpbmR4XSk7CisJCX0KKwl9CisJZm9yIChpbmR4ID0gMDsgaW5keCA8IHNpemVvZihiYXNlcykgLyBzaXplb2YoYmFzZXNbMF0pOyBpbmR4KyspCisJCWlmIChiYXNlc1tpbmR4XSAhPSAwICYmIHJlcXVlc3RfcmVnaW9uKGJhc2VzW2luZHhdLCA0LCAiYWhhMTU0MiIpKSB7CisJCQlzaHBudCA9IHNjc2lfcmVnaXN0ZXIodHBudCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhaGExNTQyX2hvc3RkYXRhKSk7CisKKwkJCWlmKHNocG50PT1OVUxMKSB7CisJCQkJcmVsZWFzZV9yZWdpb24oYmFzZXNbaW5keF0sIDQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogRm9yIG5vdyB3ZSBkbyB0aGlzIC0gdW50aWwga21hbGxvYyBpcyBtb3JlIGludGVsbGlnZW50CisJCQkgICB3ZSBhcmUgcmVzaWduZWQgdG8gc3R1cGlkIGhhY2tzIGxpa2UgdGhpcyAqLworCQkJaWYgKFNDU0lfQlVGX1BBKHNocG50KSA+PSBJU0FfRE1BX1RIUkVTSE9MRCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBhZGRyZXNzIGZvciBzaHBudCB3aXRoIDE1NDIuXG4iKTsKKwkJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQl9CisJCQlpZiAoIWFoYTE1NDJfdGVzdF9wb3J0KGJhc2VzW2luZHhdLCBzaHBudCkpCisJCQkJZ290byB1bnJlZ2lzdGVyOworCisKKwkJCWJhc2VfaW8gPSBiYXNlc1tpbmR4XTsKKworCQkJLyogU2V0IHRoZSBCdXMgb24vb2ZmLXRpbWVzIGFzIG5vdCB0byBydWluIGZsb3BweSBwZXJmb3JtYW5jZSAqLworCQkJeworCQkJCXVuY2hhciBvbmNtZFtdID0ge0NNRF9CVVNPTl9USU1FLCA3fTsKKwkJCQl1bmNoYXIgb2ZmY21kW10gPSB7Q01EX0JVU09GRl9USU1FLCA1fTsKKworCQkJCWlmIChzZXR1cF9jYWxsZWRbaW5keF0pIHsKKwkJCQkJb25jbWRbMV0gPSBzZXR1cF9idXNvbltpbmR4XTsKKwkJCQkJb2ZmY21kWzFdID0gc2V0dXBfYnVzb2ZmW2luZHhdOworCQkJCX0KKwkJCQlhaGExNTQyX2ludHJfcmVzZXQoYmFzZV9pbyk7CisJCQkJYWhhMTU0Ml9vdXQoYmFzZV9pbywgb25jbWQsIDIpOworCQkJCVdBSVQoSU5UUkZMQUdTKGJhc2VfaW8pLCBJTlRSTUFTSywgSEFDQywgMCk7CisJCQkJYWhhMTU0Ml9pbnRyX3Jlc2V0KGJhc2VfaW8pOworCQkJCWFoYTE1NDJfb3V0KGJhc2VfaW8sIG9mZmNtZCwgMik7CisJCQkJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwkJCQlpZiAoc2V0dXBfZG1hc3BlZWRbaW5keF0gPj0gMCkgeworCQkJCQl1bmNoYXIgZG1hY21kW10gPSB7Q01EX0RNQVNQRUVELCAwfTsKKwkJCQkJZG1hY21kWzFdID0gc2V0dXBfZG1hc3BlZWRbaW5keF07CisJCQkJCWFoYTE1NDJfaW50cl9yZXNldChiYXNlX2lvKTsKKwkJCQkJYWhhMTU0Ml9vdXQoYmFzZV9pbywgZG1hY21kLCAyKTsKKwkJCQkJV0FJVChJTlRSRkxBR1MoYmFzZV9pbyksIElOVFJNQVNLLCBIQUNDLCAwKTsKKwkJCQl9CisJCQkJd2hpbGUgKDApIHsKK2ZhaWw6CisJCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTU0Ml9kZXRlY3Q6IHNldHRpbmcgYnVzIG9uL29mZi10aW1lIGZhaWxlZFxuIik7CisJCQkJfQorCQkJCWFoYTE1NDJfaW50cl9yZXNldChiYXNlX2lvKTsKKwkJCX0KKwkJCWlmIChhaGExNTQyX3F1ZXJ5KGJhc2VfaW8sICZ0cmFucykpCisJCQkJZ290byB1bnJlZ2lzdGVyOworCisJCQlpZiAoYWhhMTU0Ml9nZXRjb25maWcoYmFzZV9pbywgJmlycV9sZXZlbCwgJmRtYV9jaGFuLCAmc2NzaV9pZCkgPT0gLTEpCisJCQkJZ290byB1bnJlZ2lzdGVyOworCisJCQlwcmludGsoS0VSTl9JTkZPICJDb25maWd1cmluZyBBZGFwdGVjIChTQ1NJLUlEICVkKSBhdCBJTzoleCwgSVJRICVkIiwgc2NzaV9pZCwgYmFzZV9pbywgaXJxX2xldmVsKTsKKwkJCWlmIChkbWFfY2hhbiAhPSAweEZGKQorCQkJCXByaW50aygiLCBETUEgcHJpb3JpdHkgJWQiLCBkbWFfY2hhbik7CisJCQlwcmludGsoIlxuIik7CisKKwkJCURFQihhaGExNTQyX3N0YXQoKSk7CisJCQlzZXR1cF9tYWlsYm94ZXMoYmFzZV9pbywgc2hwbnQpOworCisJCQlERUIoYWhhMTU0Ml9zdGF0KCkpOworCisJCQlERUIocHJpbnRrKCJhaGExNTQyX2RldGVjdDogZW5hYmxlIGludGVycnVwdCBjaGFubmVsICVkXG4iLCBpcnFfbGV2ZWwpKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKwkJCWlmIChyZXF1ZXN0X2lycShpcnFfbGV2ZWwsIGRvX2FoYTE1NDJfaW50cl9oYW5kbGUsIDAsICJhaGExNTQyIiwgTlVMTCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIGFkYXB0ZWMgY29udHJvbGxlci5cbiIpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCQkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJCX0KKwkJCWlmIChkbWFfY2hhbiAhPSAweEZGKSB7CisJCQkJaWYgKHJlcXVlc3RfZG1hKGRtYV9jaGFuLCAiYWhhMTU0MiIpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIERNQSBjaGFubmVsIGZvciBBZGFwdGVjLlxuIik7CisJCQkJCWZyZWVfaXJxKGlycV9sZXZlbCwgTlVMTCk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCQkJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQkJfQorCQkJCWlmIChkbWFfY2hhbiA9PSAwIHx8IGRtYV9jaGFuID49IDUpIHsKKwkJCQkJc2V0X2RtYV9tb2RlKGRtYV9jaGFuLCBETUFfTU9ERV9DQVNDQURFKTsKKwkJCQkJZW5hYmxlX2RtYShkbWFfY2hhbik7CisJCQkJfQorCQkJfQorCQkJYWhhX2hvc3RbaXJxX2xldmVsIC0gOV0gPSBzaHBudDsKKwkJCXNocG50LT50aGlzX2lkID0gc2NzaV9pZDsKKwkJCXNocG50LT51bmlxdWVfaWQgPSBiYXNlX2lvOworCQkJc2hwbnQtPmlvX3BvcnQgPSBiYXNlX2lvOworCQkJc2hwbnQtPm5faW9fcG9ydCA9IDQ7CS8qIE51bWJlciBvZiBieXRlcyBvZiBJL08gc3BhY2UgdXNlZCAqLworCQkJc2hwbnQtPmRtYV9jaGFubmVsID0gZG1hX2NoYW47CisJCQlzaHBudC0+aXJxID0gaXJxX2xldmVsOworCQkJSE9TVERBVEEoc2hwbnQpLT5iaW9zX3RyYW5zbGF0aW9uID0gdHJhbnM7CisJCQlpZiAodHJhbnMgPT0gQklPU19UUkFOU0xBVElPTl8yNTU2MykKKwkJCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTQyLmM6IFVzaW5nIGV4dGVuZGVkIGJpb3MgdHJhbnNsYXRpb25cbiIpOworCQkJSE9TVERBVEEoc2hwbnQpLT5haGExNTQyX2xhc3RfbWJpX3VzZWQgPSAoMiAqIEFIQTE1NDJfTUFJTEJPWEVTIC0gMSk7CisJCQlIT1NUREFUQShzaHBudCktPmFoYTE1NDJfbGFzdF9tYm9fdXNlZCA9IChBSEExNTQyX01BSUxCT1hFUyAtIDEpOworCQkJbWVtc2V0KEhPU1REQVRBKHNocG50KS0+U0NpbnQsIDAsIHNpemVvZihIT1NUREFUQShzaHBudCktPlNDaW50KSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKyNpZiAwCisJCQlERUIocHJpbnRrKCIgKioqIFJFQUQgQ0FQQUNJVFkgKioqXG4iKSk7CisKKwkJCXsKKwkJCQl1bmNoYXIgYnVmWzhdOworCQkJCXN0YXRpYyB1bmNoYXIgY21kW10gPSB7IFJFQURfQ0FQQUNJVFksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwkJCQlpbnQgaTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKTsgKytpKQorCQkJCQlidWZbaV0gPSAweDg3OworCQkJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisJCQkJCWlmICghYWhhMTU0Ml9jb21tYW5kKGksIGNtZCwgYnVmLCBzaXplb2YoYnVmKSkpIHsKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJhaGFfZGV0ZWN0OiBMVSAlZCBzZWN0b3Jfc2l6ZSAlZCBkZXZpY2Vfc2l6ZSAlZFxuIiwKKwkJCQkJCSAgICAgICBpLCB4c2NzaTJpbnQoYnVmICsgNCksIHhzY3NpMmludChidWYpKTsKKwkJCQkJfQorCQkJfQorCisJCQlERUIocHJpbnRrKCIgKioqIE5PVyBSVU5OSU5HIE1ZIE9XTiBURVNUICoqKiBcbiIpKTsKKworCQkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJCXVuc2lnbmVkIGNoYXIgY21kWzEwXTsKKwkJCQlzdGF0aWMgYnVmZmVyWzUxMl07CisKKwkJCQljbWRbMF0gPSBSRUFEXzEwOworCQkJCWNtZFsxXSA9IDA7CisJCQkJeGFueTJzY3NpKGNtZCArIDIsIGkpOworCQkJCWNtZFs2XSA9IDA7CisJCQkJY21kWzddID0gMDsKKwkJCQljbWRbOF0gPSAxOworCQkJCWNtZFs5XSA9IDA7CisJCQkJYWhhMTU0Ml9jb21tYW5kKDAsIGNtZCwgYnVmZmVyLCA1MTIpOworCQkJfQorI2VuZGlmCisJCQljb3VudCsrOworCQkJY29udGludWU7Cit1bnJlZ2lzdGVyOgorCQkJcmVsZWFzZV9yZWdpb24oYmFzZXNbaW5keF0sIDQpOworCQkJc2NzaV91bnJlZ2lzdGVyKHNocG50KTsKKwkJCWNvbnRpbnVlOworCisJCX07CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYWhhMTU0Ml9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfcmVzdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQgPSAwOworI2lmIDAKKwl1bmNoYXIgYWhhY21kID0gQ01EX1NUQVJUX1NDU0k7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQlpZiAoSE9TVERBVEEoc2hvc3QpLT5TQ2ludFtpXSAmJgorCQkgICAgIShIT1NUREFUQShzaG9zdCktPlNDaW50W2ldLT5kZXZpY2UtPnNvZnRfcmVzZXQpKSB7CisjaWYgMAorCQkJSE9TVERBVEEoc2hvc3QpLT5tYltpXS5zdGF0dXMgPSAxOwkvKiBJbmRpY2F0ZSByZWFkeSB0byByZXN0YXJ0Li4uICovCisjZW5kaWYKKwkJCWNvdW50Kys7CisJCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiUG90ZW50aWFsIHRvIHJlc3RhcnQgJWQgc3RhbGxlZCBjb21tYW5kcy4uLlxuIiwgY291bnQpOworI2lmIDAKKwkvKiBzdGFydCBzY3NpIGNvbW1hbmQgKi8KKwlpZiAoY291bnQpCisJCWFoYTE1NDJfb3V0KHNob3N0LT5pb19wb3J0LCAmYWhhY21kLCAxKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfYWJvcnQoU2NzaV9DbW5kICogU0NwbnQpCit7CisKKwkvKgorCSAqIFRoZSBhYm9ydCBjb21tYW5kIGRvZXMgbm90IGxlYXZlIHRoZSBkZXZpY2UgaW4gYSBjbGVhbiBzdGF0ZSB3aGVyZQorCSAqICBpdCBpcyBhdmFpbGFibGUgdG8gYmUgdXNlZCBhZ2Fpbi4gIFVudGlsIHRoaXMgZ2V0cyB3b3JrZWQgb3V0LCB3ZQorCSAqIHdpbGwgbGVhdmUgaXQgY29tbWVudGVkIG91dC4gIAorCSAqLworCisJcHJpbnRrKEtFUk5fRVJSICJhaGExNTQyLmM6IFVuYWJsZSB0byBhYm9ydCBjb21tYW5kIGZvciB0YXJnZXQgJWRcbiIsCisJICAgICAgIFNDcG50LT5kZXZpY2UtPmlkKTsKKwlyZXR1cm4gRkFJTEVEOworfQorCisvKgorICogVGhpcyBpcyBhIGRldmljZSByZXNldC4gIFRoaXMgaXMgaGFuZGxlZCBieSBzZW5kaW5nIGEgc3BlY2lhbCBjb21tYW5kCisgKiB0byB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGFoYTE1NDJfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1haWxib3ggKm1iOworCXVuY2hhciB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwl1bmNoYXIgbHVuID0gU0NwbnQtPmRldmljZS0+bHVuOworCWludCBtYm87CisJc3RydWN0IGNjYiAqY2NiOworCXVuY2hhciBhaGFjbWQgPSBDTURfU1RBUlRfU0NTSTsKKworCWNjYiA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5jY2I7CisJbWIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+bWI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJbWJvID0gSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPmFoYTE1NDJfbGFzdF9tYm9fdXNlZCArIDE7CisJaWYgKG1ibyA+PSBBSEExNTQyX01BSUxCT1hFUykKKwkJbWJvID0gMDsKKworCWRvIHsKKwkJaWYgKG1iW21ib10uc3RhdHVzID09IDAgJiYgSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W21ib10gPT0gTlVMTCkKKwkJCWJyZWFrOworCQltYm8rKzsKKwkJaWYgKG1ibyA+PSBBSEExNTQyX01BSUxCT1hFUykKKwkJCW1ibyA9IDA7CisJfSB3aGlsZSAobWJvICE9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5haGExNTQyX2xhc3RfbWJvX3VzZWQpOworCisJaWYgKG1iW21ib10uc3RhdHVzIHx8IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFttYm9dKQorCQlwYW5pYygiVW5hYmxlIHRvIGZpbmQgZW1wdHkgbWFpbGJveCBmb3IgYWhhMTU0Mi5cbiIpOworCisJSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W21ib10gPSBTQ3BudDsJLyogVGhpcyB3aWxsIGVmZmVjdGl2ZWx5CisJCQkJCQkJICAgcHJldmVudCBzb21lb25lIGVsc2UgZnJvbQorCQkJCQkJCSAgIHNjcmV3aW5nIHdpdGggdGhpcyBjZGIuICovCisKKwlIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+YWhhMTU0Ml9sYXN0X21ib191c2VkID0gbWJvOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoYTE1NDJfbG9jaywgZmxhZ3MpOworCisJYW55MnNjc2kobWJbbWJvXS5jY2JwdHIsIFNDU0lfQlVGX1BBKCZjY2JbbWJvXSkpOwkvKiBUaGlzIGdldHMgdHJhc2hlZCBmb3Igc29tZSByZWFzb24gKi8KKworCW1lbXNldCgmY2NiW21ib10sIDAsIHNpemVvZihzdHJ1Y3QgY2NiKSk7CisKKwljY2JbbWJvXS5vcCA9IDB4ODE7CS8qIEJVUyBERVZJQ0UgUkVTRVQgKi8KKworCWNjYlttYm9dLmlkbHVuID0gKHRhcmdldCAmIDcpIDw8IDUgfCAobHVuICYgNyk7CQkvKlNDU0kgVGFyZ2V0IElkICovCisKKwljY2JbbWJvXS5saW5rcHRyWzBdID0gY2NiW21ib10ubGlua3B0clsxXSA9IGNjYlttYm9dLmxpbmtwdHJbMl0gPSAwOworCWNjYlttYm9dLmNvbW1saW5raWQgPSAwOworCisJLyogCisJICogTm93IHRlbGwgdGhlIDE1NDIgdG8gZmx1c2ggYWxsIHBlbmRpbmcgY29tbWFuZHMgZm9yIHRoaXMgCisJICogdGFyZ2V0IAorCSAqLworCWFoYTE1NDJfb3V0KFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQsICZhaGFjbWQsIDEpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWhhMTU0Mi5jOiBUcnlpbmcgZGV2aWNlIHJlc2V0IGZvciB0YXJnZXQgJWRcbiIsIFNDcG50LT5kZXZpY2UtPmlkKTsKKworCXJldHVybiBTVUNDRVNTOworCisKKyNpZmRlZiBFUklDX25ldmVyZGVmCisJLyogCisJICogV2l0aCB0aGUgMTU0MiB3ZSBhcHBhcmVudGx5IG5ldmVyIGdldCBhbiBpbnRlcnJ1cHQgdG8KKwkgKiBhY2tub3dsZWRnZSBhIGRldmljZSByZXNldCBiZWluZyBzZW50LiAgVGhlbiBhZ2FpbiwgTGVvbmFyZAorCSAqIHNheXMgd2UgYXJlIGRvaW5nIHRoaXMgd3JvbmcgaW4gdGhlIGZpcnN0IHBsYWNlLi4uCisJICoKKwkgKiBUYWtlIGEgd2FpdCBhbmQgc2VlIGF0dGl0dWRlLiAgSWYgd2UgZ2V0IHNwdXJpb3VzIGludGVycnVwdHMsCisJICogdGhlbiB0aGUgZGV2aWNlIHJlc2V0IGlzIGRvaW5nIHNvbWV0aGluZyBzYW5lIGFuZCB1c2VmdWwsIGFuZAorCSAqIHdlIHdpbGwgd2FpdCBmb3IgdGhlIGludGVycnVwdCB0byBwb3N0IGNvbXBsZXRpb24uCisJICovCisJcHJpbnRrKEtFUk5fV0FSTklORyAiU2VudCBCVVMgREVWSUNFIFJFU0VUIHRvIHRhcmdldCAlZFxuIiwgU0NwbnQtPnRhcmdldCk7CisKKwkvKgorCSAqIEZyZWUgdGhlIGNvbW1hbmQgYmxvY2sgZm9yIGFsbCBjb21tYW5kcyBydW5uaW5nIG9uIHRoaXMgCisJICogdGFyZ2V0Li4uIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKSB7CisJCWlmIChIT1NUREFUQShTQ3BudC0+aG9zdCktPlNDaW50W2ldICYmCisJCSAgICBIT1NUREFUQShTQ3BudC0+aG9zdCktPlNDaW50W2ldLT50YXJnZXQgPT0gU0NwbnQtPnRhcmdldCkgeworCQkJU2NzaV9DbW5kICpTQ3RtcDsKKwkJCVNDdG1wID0gSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXTsKKwkJCWlmIChTQ3RtcC0+aG9zdF9zY3JpYmJsZSkgeworCQkJCWtmcmVlKFNDdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQlTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQl9CisJCQlIT1NUREFUQShTQ3BudC0+aG9zdCktPlNDaW50W2ldID0gTlVMTDsKKwkJCUhPU1REQVRBKFNDcG50LT5ob3N0KS0+bWJbaV0uc3RhdHVzID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gU1VDQ0VTUzsKKworCXJldHVybiBGQUlMRUQ7CisjZW5kaWYJCQkJLyogRVJJQ19uZXZlcmRlZiAqLworfQorCitzdGF0aWMgaW50IGFoYTE1NDJfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCWludCBpOworCisJLyogCisJICogVGhpcyBkb2VzIGEgc2NzaSByZXNldCBmb3IgYWxsIGRldmljZXMgb24gdGhlIGJ1cy4KKwkgKiBJbiBwcmluY2lwbGUsIHdlIGNvdWxkIGFsc28gcmVzZXQgdGhlIDE1NDIgLSBzaG91bGQKKwkgKiB3ZSBkbyB0aGlzPyAgVHJ5IHRoaXMgZmlyc3QsIGFuZCB3ZSBjYW4gYWRkIHRoYXQgbGF0ZXIKKwkgKiBpZiBpdCB0dXJucyBvdXQgdG8gYmUgdXNlZnVsLgorCSAqLworCW91dGIoU0NSU1QsIENPTlRST0woU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCkpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgdGhpbmcgdG8gc2V0dGxlIGRvd24gYSBiaXQuICBVbmZvcnR1bmF0ZWx5CisJICogdGhpcyBpcyBnb2luZyB0byBiYXNpY2FsbHkgbG9jayB1cCB0aGUgbWFjaGluZSB3aGlsZSB3ZQorCSAqIHdhaXQgZm9yIHRoaXMgdG8gY29tcGxldGUuICBUbyBiZSAxMDAlIGNvcnJlY3QsIHdlIG5lZWQgdG8KKwkgKiBjaGVjayBmb3IgdGltZW91dCwgYW5kIGlmIHdlIGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSB0aGlzCisJICogd2UgYXJlIHByZXR0eSBkZXNwZXJhdGUgYW55d2F5cy4KKwkgKi8KKwlzcGluX3VubG9ja19pcnEoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzc2xlZXAoNCk7CisJc3Bpbl9sb2NrX2lycShTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOworCisJV0FJVChTVEFUVVMoU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCksCisJICAgICBTVEFUTUFTSywgSU5JVCB8IElETEUsIFNUU1QgfCBESUFHRiB8IElOVkRDTUQgfCBERiB8IENERik7CisKKwkvKgorCSAqIE5vdyB0cnkgdG8gcGljayB1cCB0aGUgcGllY2VzLiAgRm9yIGFsbCBwZW5kaW5nIGNvbW1hbmRzLAorCSAqIGZyZWUgYW55IGludGVybmFsIGRhdGEgc3RydWN0dXJlcywgYW5kIGJhc2ljYWxseSBjbGVhciB0aGluZ3MKKwkgKiBvdXQuICBXZSBkbyBub3QgdHJ5IGFuZCByZXN0YXJ0IGFueSBjb21tYW5kcyBvciBhbnl0aGluZyAtIAorCSAqIHRoZSBzdHJhdGVneSBoYW5kbGVyIHRha2VzIGNhcmUgb2YgdGhhdCBjcmFwLgorCSAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlbnQgQlVTIFJFU0VUIHRvIHNjc2kgaG9zdCAlZFxuIiwgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9ubyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUhBMTU0Ml9NQUlMQk9YRVM7IGkrKykgeworCQlpZiAoSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W2ldICE9IE5VTEwpIHsKKwkJCVNjc2lfQ21uZCAqU0N0bXA7CisJCQlTQ3RtcCA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFtpXTsKKworCisJCQlpZiAoU0N0bXAtPmRldmljZS0+c29mdF9yZXNldCkgeworCQkJCS8qCisJCQkJICogSWYgdGhpcyBkZXZpY2UgaW1wbGVtZW50cyB0aGUgc29mdCByZXNldCBvcHRpb24sCisJCQkJICogdGhlbiBpdCBpcyBzdGlsbCBob2xkaW5nIG9udG8gdGhlIGNvbW1hbmQsIGFuZAorCQkJCSAqIG1heSB5ZXQgY29tcGxldGUgaXQuICBJbiB0aGlzIGNhc2UsIHdlIGRvbid0CisJCQkJICogZmx1c2ggdGhlIGRhdGEuCisJCQkJICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoU0N0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCQlrZnJlZShTQ3RtcC0+aG9zdF9zY3JpYmJsZSk7CisJCQkJU0N0bXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkJfQorCQkJSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPlNDaW50W2ldID0gTlVMTDsKKwkJCUhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5tYltpXS5zdGF0dXMgPSAwOworCQl9CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7CisKK2ZhaWw6CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBhaGExNTQyX2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpCit7CisJaW50IGk7CisKKwkvKiAKKwkgKiBUaGlzIGRvZXMgYSBzY3NpIHJlc2V0IGZvciBhbGwgZGV2aWNlcyBvbiB0aGUgYnVzLgorCSAqIEluIHByaW5jaXBsZSwgd2UgY291bGQgYWxzbyByZXNldCB0aGUgMTU0MiAtIHNob3VsZAorCSAqIHdlIGRvIHRoaXM/ICBUcnkgdGhpcyBmaXJzdCwgYW5kIHdlIGNhbiBhZGQgdGhhdCBsYXRlcgorCSAqIGlmIGl0IHR1cm5zIG91dCB0byBiZSB1c2VmdWwuCisJICovCisJb3V0YihIUlNUIHwgU0NSU1QsIENPTlRST0woU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCkpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgdGhpbmcgdG8gc2V0dGxlIGRvd24gYSBiaXQuICBVbmZvcnR1bmF0ZWx5CisJICogdGhpcyBpcyBnb2luZyB0byBiYXNpY2FsbHkgbG9jayB1cCB0aGUgbWFjaGluZSB3aGlsZSB3ZQorCSAqIHdhaXQgZm9yIHRoaXMgdG8gY29tcGxldGUuICBUbyBiZSAxMDAlIGNvcnJlY3QsIHdlIG5lZWQgdG8KKwkgKiBjaGVjayBmb3IgdGltZW91dCwgYW5kIGlmIHdlIGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSB0aGlzCisJICogd2UgYXJlIHByZXR0eSBkZXNwZXJhdGUgYW55d2F5cy4KKwkgKi8KKwlzcGluX3VubG9ja19pcnEoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwlzc2xlZXAoNCk7CisJc3Bpbl9sb2NrX2lycShTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOworCisJV0FJVChTVEFUVVMoU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydCksCisJICAgICBTVEFUTUFTSywgSU5JVCB8IElETEUsIFNUU1QgfCBESUFHRiB8IElOVkRDTUQgfCBERiB8IENERik7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyB0b28gYmVmb3JlIHRoZSAxNTQyIGNhbiBpbnRlcmFjdCB3aXRoCisJICogdXMgYWdhaW4uCisJICovCisJc2V0dXBfbWFpbGJveGVzKFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQsIFNDcG50LT5kZXZpY2UtPmhvc3QpOworCisJLyoKKwkgKiBOb3cgdHJ5IHRvIHBpY2sgdXAgdGhlIHBpZWNlcy4gIEZvciBhbGwgcGVuZGluZyBjb21tYW5kcywKKwkgKiBmcmVlIGFueSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMsIGFuZCBiYXNpY2FsbHkgY2xlYXIgdGhpbmdzCisJICogb3V0LiAgV2UgZG8gbm90IHRyeSBhbmQgcmVzdGFydCBhbnkgY29tbWFuZHMgb3IgYW55dGhpbmcgLSAKKwkgKiB0aGUgc3RyYXRlZ3kgaGFuZGxlciB0YWtlcyBjYXJlIG9mIHRoYXQgY3JhcC4KKwkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTZW50IEJVUyBSRVNFVCB0byBzY3NpIGhvc3QgJWRcbiIsIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8pOworCisJZm9yIChpID0gMDsgaSA8IEFIQTE1NDJfTUFJTEJPWEVTOyBpKyspIHsKKwkJaWYgKEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpLT5TQ2ludFtpXSAhPSBOVUxMKSB7CisJCQlTY3NpX0NtbmQgKlNDdG1wOworCQkJU0N0bXAgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbaV07CisKKwkJCWlmIChTQ3RtcC0+ZGV2aWNlLT5zb2Z0X3Jlc2V0KSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGlzIGRldmljZSBpbXBsZW1lbnRzIHRoZSBzb2Z0IHJlc2V0IG9wdGlvbiwKKwkJCQkgKiB0aGVuIGl0IGlzIHN0aWxsIGhvbGRpbmcgb250byB0aGUgY29tbWFuZCwgYW5kCisJCQkJICogbWF5IHlldCBjb21wbGV0ZSBpdC4gIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3QKKwkJCQkgKiBmbHVzaCB0aGUgZGF0YS4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChTQ3RtcC0+aG9zdF9zY3JpYmJsZSkgeworCQkJCWtmcmVlKFNDdG1wLT5ob3N0X3NjcmliYmxlKTsKKwkJCQlTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQl9CisJCQlIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KS0+U0NpbnRbaV0gPSBOVUxMOworCQkJSE9TVERBVEEoU0NwbnQtPmRldmljZS0+aG9zdCktPm1iW2ldLnN0YXR1cyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKKworZmFpbDoKKwlyZXR1cm4gRkFJTEVEOworfQorCisjaWYgMAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgb2xkIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLiAgVGhleSBhcmUgb25seSB0ZW1wb3JhcmlseQorICogaGVyZSB3aGlsZSB3ZSBwbGF5IHdpdGggdGhlIG5ldyBlcnJvciBoYW5kbGluZyBjb2RlLgorICovCitzdGF0aWMgaW50IGFoYTE1NDJfb2xkX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KQoreworI2lmIDAKKwl1bmNoYXIgYWhhY21kID0gQ01EX1NUQVJUX1NDU0k7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWFpbGJveCAqbWI7CisJaW50IG1iaSwgbWJvLCBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkluIGFoYTE1NDJfYWJvcnQ6ICV4ICV4XG4iLAorCSAgICAgICBpbmIoU1RBVFVTKFNDcG50LT5ob3N0LT5pb19wb3J0KSksCisJICAgICAgIGluYihJTlRSRkxBR1MoU0NwbnQtPmhvc3QtPmlvX3BvcnQpKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJbWIgPSBIT1NUREFUQShTQ3BudC0+aG9zdCktPm1iOworCW1iaSA9IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+YWhhMTU0Ml9sYXN0X21iaV91c2VkICsgMTsKKwlpZiAobWJpID49IDIgKiBBSEExNTQyX01BSUxCT1hFUykKKwkJbWJpID0gQUhBMTU0Ml9NQUlMQk9YRVM7CisKKwlkbyB7CisJCWlmIChtYlttYmldLnN0YXR1cyAhPSAwKQorCQkJYnJlYWs7CisJCW1iaSsrOworCQlpZiAobWJpID49IDIgKiBBSEExNTQyX01BSUxCT1hFUykKKwkJCW1iaSA9IEFIQTE1NDJfTUFJTEJPWEVTOworCX0gd2hpbGUgKG1iaSAhPSBIT1NUREFUQShTQ3BudC0+aG9zdCktPmFoYTE1NDJfbGFzdF9tYmlfdXNlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisKKwlpZiAobWJbbWJpXS5zdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMb3N0IGludGVycnVwdCBkaXNjb3ZlcmVkIG9uIGlycSAlZCAtIGF0dGVtcHRpbmcgdG8gcmVjb3ZlclxuIiwKKwkJICAgICAgIFNDcG50LT5ob3N0LT5pcnEpOworCQlhaGExNTQyX2ludHJfaGFuZGxlKFNDcG50LT5ob3N0LCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE9LLCBubyBsb3N0IGludGVycnVwdC4gIFRyeSBsb29raW5nIHRvIHNlZSBob3cgbWFueSBwZW5kaW5nIGNvbW1hbmRzCisJICAgd2UgdGhpbmsgd2UgaGF2ZS4gKi8KKworCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSkgeworCQkJaWYgKEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV0gPT0gU0NwbnQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlRpbWVkIG91dCBjb21tYW5kIHBlbmRpbmcgZm9yICVzXG4iLAorCQkJCSAgICAgICBTQ3BudC0+cmVxdWVzdC0+cnFfZGlzayA/CisJCQkJICAgICAgIFNDcG50LT5yZXF1ZXN0LT5ycV9kaXNrLT5kaXNrX25hbWUgOiAiPyIKKwkJCQkgICAgICAgKTsKKwkJCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5tYltpXS5zdGF0dXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJPR01CIHN0aWxsIGZ1bGwgLSByZXN0YXJ0aW5nXG4iKTsKKwkJCQkJYWhhMTU0Ml9vdXQoU0NwbnQtPmhvc3QtPmlvX3BvcnQsICZhaGFjbWQsIDEpOworCQkJCX07CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgIk90aGVyIHBlbmRpbmcgY29tbWFuZCAlc1xuIiwKKwkJCQkgICAgICAgU0NwbnQtPnJlcXVlc3QtPnJxX2Rpc2sgPworCQkJCSAgICAgICBTQ3BudC0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lIDogIj8iCisJCQkJICAgICAgICk7CisJCX0KKyNlbmRpZgorCisJREVCKHByaW50aygiYWhhMTU0Ml9hYm9ydFxuIikpOworI2lmIDAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJZm9yIChtYm8gPSAwOyBtYm8gPCBBSEExNTQyX01BSUxCT1hFUzsgbWJvKyspIHsKKwkJaWYgKFNDcG50ID09IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbbWJvXSkgeworCQkJbWJbbWJvXS5zdGF0dXMgPSAyOwkvKiBBYm9ydCBjb21tYW5kICovCisJCQlhaGExNTQyX291dChTQ3BudC0+aG9zdC0+aW9fcG9ydCwgJmFoYWNtZCwgMSk7CS8qIHN0YXJ0IHNjc2kgY29tbWFuZCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhhMTU0Ml9sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoQUhBMTU0Ml9NQUlMQk9YRVMgPT0gbWJvKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaGExNTQyX2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorCXJldHVybiBTQ1NJX0FCT1JUX1NOT09aRTsKK30KKworLyogV2UgZG8gbm90IGltcGxlbWVudCBhIHJlc2V0IGZ1bmN0aW9uIGhlcmUsIGJ1dCB0aGUgdXBwZXIgbGV2ZWwgY29kZQorICAgYXNzdW1lcyB0aGF0IGl0IHdpbGwgZ2V0IHNvbWUga2luZCBvZiByZXNwb25zZSBmb3IgdGhlIGNvbW1hbmQgaW4KKyAgIFNDcG50LiAgV2UgbXVzdCBvYmxpZ2UsIG9yIHRoZSBjb21tYW5kIHdpbGwgaGFuZyB0aGUgc2NzaSBzeXN0ZW0uCisgICBGb3IgYSBmaXJzdCBnbywgd2UgYXNzdW1lIHRoYXQgdGhlIDE1NDIgbm90aWZpZXMgdXMgd2l0aCBhbGwgb2YgdGhlCisgICBwZW5kaW5nIGNvbW1hbmRzIChpdCBkb2VzIGltcGxlbWVudCBzb2Z0IHJlc2V0LCBhZnRlciBhbGwpLiAqLworCitzdGF0aWMgaW50IGFoYTE1NDJfb2xkX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50LCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCit7CisJdW5jaGFyIGFoYWNtZCA9IENNRF9TVEFSVF9TQ1NJOworCWludCBpOworCisJLyoKKwkgKiBTZWUgaWYgYSBidXMgcmVzZXQgd2FzIHN1Z2dlc3RlZC4KKwkgKi8KKwlpZiAocmVzZXRfZmxhZ3MgJiBTQ1NJX1JFU0VUX1NVR0dFU1RfQlVTX1JFU0VUKSB7CisJCS8qIAorCQkgKiBUaGlzIGRvZXMgYSBzY3NpIHJlc2V0IGZvciBhbGwgZGV2aWNlcyBvbiB0aGUgYnVzLgorCQkgKiBJbiBwcmluY2lwbGUsIHdlIGNvdWxkIGFsc28gcmVzZXQgdGhlIDE1NDIgLSBzaG91bGQKKwkJICogd2UgZG8gdGhpcz8gIFRyeSB0aGlzIGZpcnN0LCBhbmQgd2UgY2FuIGFkZCB0aGF0IGxhdGVyCisJCSAqIGlmIGl0IHR1cm5zIG91dCB0byBiZSB1c2VmdWwuCisJCSAqLworCQlvdXRiKEhSU1QgfCBTQ1JTVCwgQ09OVFJPTChTQ3BudC0+aG9zdC0+aW9fcG9ydCkpOworCisJCS8qCisJCSAqIFdhaXQgZm9yIHRoZSB0aGluZyB0byBzZXR0bGUgZG93biBhIGJpdC4gIFVuZm9ydHVuYXRlbHkKKwkJICogdGhpcyBpcyBnb2luZyB0byBiYXNpY2FsbHkgbG9jayB1cCB0aGUgbWFjaGluZSB3aGlsZSB3ZQorCQkgKiB3YWl0IGZvciB0aGlzIHRvIGNvbXBsZXRlLiAgVG8gYmUgMTAwJSBjb3JyZWN0LCB3ZSBuZWVkIHRvCisJCSAqIGNoZWNrIGZvciB0aW1lb3V0LCBhbmQgaWYgd2UgYXJlIGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKKwkJICogd2UgYXJlIHByZXR0eSBkZXNwZXJhdGUgYW55d2F5cy4KKwkJICovCisJCVdBSVQoU1RBVFVTKFNDcG50LT5ob3N0LT5pb19wb3J0KSwKKwkJU1RBVE1BU0ssIElOSVQgfCBJRExFLCBTVFNUIHwgRElBR0YgfCBJTlZEQ01EIHwgREYgfCBDREYpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyB0b28gYmVmb3JlIHRoZSAxNTQyIGNhbiBpbnRlcmFjdCB3aXRoCisJCSAqIHVzIGFnYWluLgorCQkgKi8KKwkJc2V0dXBfbWFpbGJveGVzKFNDcG50LT5ob3N0LT5pb19wb3J0LCBTQ3BudC0+aG9zdCk7CisKKwkJLyoKKwkJICogTm93IHRyeSB0byBwaWNrIHVwIHRoZSBwaWVjZXMuICBSZXN0YXJ0IGFsbCBjb21tYW5kcworCQkgKiB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlIG9uIHRoZSBidXMsIGFuZCByZXNldCBhbGwgb2YKKwkJICogdGhlIGRhdGFzdHJ1Y3R1cmVzLiAgV2UgaGF2ZSBzb21lIHRpbWUgdG8ga2lsbCB3aGlsZQorCQkgKiB0aGluZ3Mgc2V0dGxlIGRvd24sIHNvIHByaW50IGEgbmljZSBtZXNzYWdlLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2VudCBCVVMgUkVTRVQgdG8gc2NzaSBob3N0ICVkXG4iLCBTQ3BudC0+aG9zdC0+aG9zdF9ubyk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFIQTE1NDJfTUFJTEJPWEVTOyBpKyspCisJCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSAhPSBOVUxMKSB7CisJCQkJU2NzaV9DbW5kICpTQ3RtcDsKKwkJCQlTQ3RtcCA9IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV07CisJCQkJU0N0bXAtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCQlpZiAoU0N0bXAtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCQkJa2ZyZWUoU0N0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQlTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlbmRpbmcgRElEX1JFU0VUIGZvciB0YXJnZXQgJWRcbiIsIFNDcG50LT50YXJnZXQpOworCQkJCVNDdG1wLT5zY3NpX2RvbmUoU0NwbnQpOworCisJCQkJSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSA9IE5VTEw7CisJCQkJSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5tYltpXS5zdGF0dXMgPSAwOworCQkJfQorCQkvKgorCQkgKiBOb3cgdGVsbCB0aGUgbWlkLWxldmVsIGNvZGUgd2hhdCB3ZSBkaWQgaGVyZS4gIFNpbmNlCisJCSAqIHdlIGhhdmUgcmVzdGFydGVkIGFsbCBvZiB0aGUgb3V0c3RhbmRpbmcgY29tbWFuZHMsCisJCSAqIHRoZW4gcmVwb3J0IFNVQ0NFU1MuCisJCSAqLworCQlyZXR1cm4gKFNDU0lfUkVTRVRfU1VDQ0VTUyB8IFNDU0lfUkVTRVRfQlVTX1JFU0VUKTsKK2ZhaWw6CisJCXByaW50ayhLRVJOX0NSSVQgImFoYTE1NDIuYzogVW5hYmxlIHRvIHBlcmZvcm0gaGFyZCByZXNldC5cbiIpOworCQlwcmludGsoS0VSTl9DUklUICJQb3dlciBjeWNsZSBtYWNoaW5lIHRvIHJlc2V0XG4iKTsKKwkJcmV0dXJuIChTQ1NJX1JFU0VUX0VSUk9SIHwgU0NTSV9SRVNFVF9CVVNfUkVTRVQpOworCisKKwl9IGVsc2UgeworCQkvKiBUaGlzIGRvZXMgYSBzZWxlY3RpdmUgcmVzZXQgb2YganVzdCB0aGUgb25lIGRldmljZSAqLworCQkvKiBGaXJzdCBsb2NhdGUgdGhlIGNjYiBmb3IgdGhpcyBjb21tYW5kICovCisJCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQkJaWYgKEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV0gPT0gU0NwbnQpIHsKKwkJCQlIT1NUREFUQShTQ3BudC0+aG9zdCktPmNjYltpXS5vcCA9IDB4ODE7CS8qIEJVUyBERVZJQ0UgUkVTRVQgKi8KKwkJCQkvKiBOb3cgdGVsbCB0aGUgMTU0MiB0byBmbHVzaCBhbGwgcGVuZGluZyBjb21tYW5kcyBmb3IgdGhpcyB0YXJnZXQgKi8KKwkJCQlhaGExNTQyX291dChTQ3BudC0+aG9zdC0+aW9fcG9ydCwgJmFoYWNtZCwgMSk7CisKKwkJCQkvKiBIZXJlIGlzIHRoZSB0cmlja3kgcGFydC4gIFdoYXQgdG8gZG8gbmV4dC4gIERvIHdlIGdldCBhbiBpbnRlcnJ1cHQKKwkJCQkgICBmb3IgdGhlIGNvbW1hbmRzIHRoYXQgd2UgYWJvcnRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LCBvcgorCQkJCSAgIGRvIHdlIGdlbmVyYXRlIHRoaXMgb24gb3VyIG93bj8gIFRyeSBpdCB3aXRob3V0IGZpcnN0IGFuZCBzZWUKKwkJCQkgICB3aGF0IGhhcHBlbnMgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZW50IEJVUyBERVZJQ0UgUkVTRVQgdG8gdGFyZ2V0ICVkXG4iLCBTQ3BudC0+dGFyZ2V0KTsKKworCQkJCS8qIElmIHRoZSBmaXJzdCBkb2VzIG5vdCB3b3JrLCB0aGVuIHRyeSB0aGUgc2Vjb25kLiAgSSB0aGluayB0aGUKKwkJCQkgICBmaXJzdCBvcHRpb24gaXMgbW9yZSBsaWtlbHkgdG8gYmUgY29ycmVjdC4gRnJlZSB0aGUgY29tbWFuZAorCQkJCSAgIGJsb2NrIGZvciBhbGwgY29tbWFuZHMgcnVubmluZyBvbiB0aGlzIHRhcmdldC4uLiAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBBSEExNTQyX01BSUxCT1hFUzsgaSsrKQorCQkJCQlpZiAoSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXSAmJgorCQkJCQkgICAgSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5TQ2ludFtpXS0+dGFyZ2V0ID09IFNDcG50LT50YXJnZXQpIHsKKwkJCQkJCVNjc2lfQ21uZCAqU0N0bXA7CisJCQkJCQlTQ3RtcCA9IEhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV07CisJCQkJCQlTQ3RtcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCQkJaWYgKFNDdG1wLT5ob3N0X3NjcmliYmxlKSB7CisJCQkJCQkJa2ZyZWUoU0N0bXAtPmhvc3Rfc2NyaWJibGUpOworCQkJCQkJCVNDdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlbmRpbmcgRElEX1JFU0VUIGZvciB0YXJnZXQgJWRcbiIsIFNDcG50LT50YXJnZXQpOworCQkJCQkJU0N0bXAtPnNjc2lfZG9uZShTQ3BudCk7CisKKwkJCQkJCUhPU1REQVRBKFNDcG50LT5ob3N0KS0+U0NpbnRbaV0gPSBOVUxMOworCQkJCQkJSE9TVERBVEEoU0NwbnQtPmhvc3QpLT5tYltpXS5zdGF0dXMgPSAwOworCQkJCQl9CisJCQkJcmV0dXJuIFNDU0lfUkVTRVRfU1VDQ0VTUzsKKwkJCX0KKwl9CisJLyogTm8gYWN0aXZlIGNvbW1hbmQgYXQgdGhpcyB0aW1lLCBzbyB0aGlzIG1lYW5zIHRoYXQgZWFjaCB0aW1lIHdlIGdvdAorCSAgIHNvbWUga2luZCBvZiByZXNwb25zZSB0aGUgbGFzdCB0aW1lIHRocm91Z2guICBUZWxsIHRoZSBtaWQtbGV2ZWwgY29kZQorCSAgIHRvIHJlcXVlc3Qgc2Vuc2UgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gbmV4dC4gKi8KKwlyZXR1cm4gU0NTSV9SRVNFVF9QVU5UOworfQorI2VuZGlmICAgIC8qIGVuZCBvZiBiaWcgY29tbWVudCBibG9jayBhcm91bmQgb2xkX2Fib3J0ICsgb2xkX3Jlc2V0ICovCisKK3N0YXRpYyBpbnQgYWhhMTU0Ml9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwlpbnQgdHJhbnNsYXRpb25fYWxnb3JpdGhtOworCWludCBzaXplID0gY2FwYWNpdHk7CisKKwl0cmFuc2xhdGlvbl9hbGdvcml0aG0gPSBIT1NUREFUQShzZGV2LT5ob3N0KS0+Ymlvc190cmFuc2xhdGlvbjsKKworCWlmICgoc2l6ZSA+PiAxMSkgPiAxMDI0ICYmIHRyYW5zbGF0aW9uX2FsZ29yaXRobSA9PSBCSU9TX1RSQU5TTEFUSU9OXzI1NTYzKSB7CisJCS8qIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIHdoYXQgRE9TIHJldHVybnMgKi8KKwkJaXBbMF0gPSAyNTU7CisJCWlwWzFdID0gNjM7CisJCWlwWzJdID0gc2l6ZSAvIDI1NSAvIDYzOworCX0gZWxzZSB7CisJCWlwWzBdID0gNjQ7CisJCWlwWzFdID0gMzI7CisJCWlwWzJdID0gc2l6ZSA+PiAxMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJhaGExNTQyIiwKKwkubmFtZQkJCT0gIkFkYXB0ZWMgMTU0MiIsCisJLmRldGVjdAkJCT0gYWhhMTU0Ml9kZXRlY3QsCisJLnJlbGVhc2UJCT0gYWhhMTU0Ml9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gYWhhMTU0Ml9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGExNTQyX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcj0gYWhhMTU0Ml9kZXZfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gYWhhMTU0Ml9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGFoYTE1NDJfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBhaGExNTQyX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IEFIQTE1NDJfTUFJTEJPWEVTLCAKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gQUhBMTU0Ml9TQ0FUVEVSLAorCS5jbWRfcGVyX2x1bgkJPSBBSEExNTQyX0NNRExVTiwKKwkudW5jaGVja2VkX2lzYV9kbWEJPSAxLCAKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTU0Mi5oIGIvZHJpdmVycy9zY3NpL2FoYTE1NDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1NDIuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfQUhBMTU0Ml9ICisKKy8qICRJZDogYWhhMTU0Mi5oLHYgMS4xIDE5OTIvMDcvMjQgMDY6Mjc6Mzggcm9vdCBFeHAgcm9vdCAkCisgKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBhZGFwdGVjIDE1NDIgZHJpdmVyIGZvciBMaW51eAorICoKKyAqICRMb2c6IGFoYTE1NDIuaCx2ICQKKyAqIFJldmlzaW9uIDEuMSAgMTk5Mi8wNy8yNCAgMDY6Mjc6MzggIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTIvMDcvMDQgIDE4OjQxOjQ5ICByb290CisgKiBSZXBsYWNlZCBkaXN0cmlidXRpb24gd2l0aCBjdXJyZW50IGRyaXZlcnMKKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTIvMDYvMjMgIDIzOjU4OjIwICByb290CisgKiBGaXhlcy4KKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTIvMDUvMjYgIDIyOjEzOjIzICByb290CisgKiBDaGFuZ2VkIGJ1ZyB0aGF0IHByZXZlbnRlZCBETUEgYWJvdmUgZmlyc3QgMiBtYnl0ZXMuCisgKgorICogUmV2aXNpb24gMS4xICAxOTkyLzA1LzIyICAyMTowMDoyOSAgcm9vdAorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5Mi8wNC8yNCAgMTg6MDE6NTAgIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTIvMDQvMDIgIDAzOjIzOjEzICBkcmV3CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4zICAxOTkyLzAxLzI3ICAxNDo0NjoyOSAgdHRob3JuCisgKiAqKiogZW1wdHkgbG9nIG1lc3NhZ2UgKioqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJL08gUG9ydCBpbnRlcmZhY2UgNC4yICovCisvKiBSRUFEICovCisjZGVmaW5lIFNUQVRVUyhiYXNlKSBiYXNlCisjZGVmaW5lIFNUU1QJMHg4MAkJLyogU2VsZiBUZXN0IGluIFByb2dyZXNzICovCisjZGVmaW5lIERJQUdGCTB4NDAJCS8qIEludGVybmFsIERpYWdub3N0aWMgRmFpbHVyZSAqLworI2RlZmluZSBJTklUCTB4MjAJCS8qIE1haWxib3ggSW5pdGlhbGl6YXRpb24gUmVxdWlyZWQgKi8KKyNkZWZpbmUgSURMRQkweDEwCQkvKiBTQ1NJIEhvc3QgQWRhcHRlciBJZGxlICovCisjZGVmaW5lIENERgkweDA4CQkvKiBDb21tYW5kL0RhdGEgT3V0IFBvcnQgRnVsbCAqLworI2RlZmluZSBERgkweDA0CQkvKiBEYXRhIEluIFBvcnQgRnVsbCAqLworI2RlZmluZSBJTlZEQ01ECTB4MDEJCS8qIEludmFsaWQgSCBBIENvbW1hbmQgKi8KKyNkZWZpbmUgU1RBVE1BU0sgMHhmZAkJLyogMHgwMiBpcyByZXNlcnZlZCAqLworCisjZGVmaW5lIElOVFJGTEFHUyhiYXNlKSAoU1RBVFVTKGJhc2UpKzIpCisjZGVmaW5lIEFOWUlOVFIJMHg4MAkJLyogQW55IEludGVycnVwdCAqLworI2RlZmluZSBTQ1JECTB4MDgJCS8qIFNDU0kgUmVzZXQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSEFDQwkweDA0CQkvKiBIQSBDb21tYW5kIENvbXBsZXRlICovCisjZGVmaW5lIE1CT0EJMHgwMgkJLyogTUJPIEVtcHR5ICovCisjZGVmaW5lIE1CSUYJMHgwMQkJLyogTUJJIEZ1bGwgKi8KKyNkZWZpbmUgSU5UUk1BU0sgMHg4ZgorCisvKiBXUklURSAqLworI2RlZmluZSBDT05UUk9MKGJhc2UpIFNUQVRVUyhiYXNlKQorI2RlZmluZSBIUlNUCTB4ODAJCS8qIEhhcmQgUmVzZXQgKi8KKyNkZWZpbmUgU1JTVAkweDQwCQkvKiBTb2Z0IFJlc2V0ICovCisjZGVmaW5lIElSU1QJMHgyMAkJLyogSW50ZXJydXB0IFJlc2V0ICovCisjZGVmaW5lIFNDUlNUCTB4MTAJCS8qIFNDU0kgQnVzIFJlc2V0ICovCisKKy8qIFJFQUQvV1JJVEUgKi8KKyNkZWZpbmUgREFUQShiYXNlKSAoU1RBVFVTKGJhc2UpKzEpCisjZGVmaW5lIENNRF9OT1AJCTB4MDAJLyogTm8gT3BlcmF0aW9uICovCisjZGVmaW5lIENNRF9NQklOSVQJMHgwMQkvKiBNYWlsYm94IEluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIENNRF9TVEFSVF9TQ1NJCTB4MDIJLyogU3RhcnQgU0NTSSBDb21tYW5kICovCisjZGVmaW5lIENNRF9JTlFVSVJZCTB4MDQJLyogQWRhcHRlciBJbnF1aXJ5ICovCisjZGVmaW5lIENNRF9FTUJPSQkweDA1CS8qIEVuYWJsZSBNYWlsQm94IE91dCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQ01EX0JVU09OX1RJTUUJMHgwNwkvKiBTZXQgQnVzLU9uIFRpbWUgKi8KKyNkZWZpbmUgQ01EX0JVU09GRl9USU1FCTB4MDgJLyogU2V0IEJ1cy1PZmYgVGltZSAqLworI2RlZmluZSBDTURfRE1BU1BFRUQJMHgwOQkvKiBTZXQgQVQgQnVzIFRyYW5zZmVyIFNwZWVkICovCisjZGVmaW5lIENNRF9SRVRERVZTCTB4MGEJLyogUmV0dXJuIEluc3RhbGxlZCBEZXZpY2VzICovCisjZGVmaW5lIENNRF9SRVRDT05GCTB4MGIJLyogUmV0dXJuIENvbmZpZ3VyYXRpb24gRGF0YSAqLworI2RlZmluZSBDTURfUkVUU0VUVVAJMHgwZAkvKiBSZXR1cm4gU2V0dXAgRGF0YSAqLworI2RlZmluZSBDTURfRUNITwkweDFmCS8qIEVDSE8gQ29tbWFuZCBEYXRhICovCisKKyNkZWZpbmUgQ01EX0VYVEJJT1MgICAgIDB4MjggICAgLyogUmV0dXJuIGV4dGVuZCBiaW9zIGluZm9ybWF0aW9uIG9ubHkgMTU0MkMgKi8KKyNkZWZpbmUgQ01EX01CRU5BQkxFICAgIDB4MjkgICAgLyogU2V0IE1haWxib3ggSW50ZXJmYWNlIGVuYWJsZSBvbmx5IDE1NDJDICovCisKKy8qIE1haWxib3ggRGVmaW5pdGlvbiA1LjIuMSBhbmQgNS4yLjIgKi8KK3N0cnVjdCBtYWlsYm94IHsKKyAgdW5jaGFyIHN0YXR1czsJCS8qIENvbW1hbmQvU3RhdHVzICovCisgIHVuY2hhciBjY2JwdHJbM107CQkvKiBtc2IsIC4uLCBsc2IgKi8KK307CisKKy8qIFRoaXMgaXMgdXNlZCB3aXRoIHNjYXR0ZXItZ2F0aGVyICovCitzdHJ1Y3QgY2hhaW4geworICB1bmNoYXIgZGF0YWxlblszXTsJCS8qIFNpemUgb2YgdGhpcyBwYXJ0IG9mIGNoYWluICovCisgIHVuY2hhciBkYXRhcHRyWzNdOwkJLyogTG9jYXRpb24gb2YgZGF0YSAqLworfTsKKworLyogVGhlc2UgYmVsb25nIGluIHNjc2kuaCBhbHNvICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW55MnNjc2kodTggKnAsIHUzMiB2KQoreworCXBbMF0gPSB2ID4+IDE2OworCXBbMV0gPSB2ID4+IDg7CisJcFsyXSA9IHY7Cit9CisKKyNkZWZpbmUgc2NzaTJpbnQodXApICggKCgobG9uZykqKHVwKSkgPDwgMTYpICsgKCgobG9uZykodXApWzFdKSA8PCA4KSArICgobG9uZykodXApWzJdKSApCisKKyNkZWZpbmUgeGFueTJzY3NpKHVwLCBwKQlcCisodXApWzBdID0gKChsb25nKShwKSkgPj4gMjQ7CVwKKyh1cClbMV0gPSAoKGxvbmcpKHApKSA+PiAxNjsJXAorKHVwKVsyXSA9ICgobG9uZykocCkpID4+IDg7CVwKKyh1cClbM10gPSAoKGxvbmcpKHApKTsKKworI2RlZmluZSB4c2NzaTJpbnQodXApICggKCgobG9uZykodXApWzBdKSA8PCAyNCkgKyAoKChsb25nKSh1cClbMV0pIDw8IDE2KSBcCisJCSAgICAgICsgKCgobG9uZykodXApWzJdKSA8PCAgOCkgKyAgKChsb25nKSh1cClbM10pICkKKworI2RlZmluZSBNQVhfQ0RCIDEyCisjZGVmaW5lIE1BWF9TRU5TRSAxNAorCitzdHJ1Y3QgY2NiIHsJCQkvKiBDb21tYW5kIENvbnRyb2wgQmxvY2sgNS4zICovCisgIHVuY2hhciBvcDsJCQkvKiBDb21tYW5kIENvbnRyb2wgQmxvY2sgT3BlcmF0aW9uIENvZGUgKi8KKyAgdW5jaGFyIGlkbHVuOwkJCS8qIG9wPTAsMjpUYXJnZXQgSWQsIG9wPTE6SW5pdGlhdG9yIElkICovCisJCQkJLyogT3V0Ym91bmQgZGF0YSB0cmFuc2ZlciwgbGVuZ3RoIGlzIGNoZWNrZWQqLworCQkJCS8qIEluYm91bmQgZGF0YSB0cmFuc2ZlciwgbGVuZ3RoIGlzIGNoZWNrZWQgKi8KKwkJCQkvKiBMb2dpY2FsIFVuaXQgTnVtYmVyICovCisgIHVuY2hhciBjZGJsZW47CQkvKiBTQ1NJIENvbW1hbmQgTGVuZ3RoICovCisgIHVuY2hhciByc2FsZW47CQkvKiBSZXF1ZXN0IFNlbnNlIEFsbG9jYXRpb24gTGVuZ3RoL0Rpc2FibGUgKi8KKyAgdW5jaGFyIGRhdGFsZW5bM107CQkvKiBEYXRhIExlbmd0aCAobXNiLCAuLiwgbHNiKSAqLworICB1bmNoYXIgZGF0YXB0clszXTsJCS8qIERhdGEgUG9pbnRlciAqLworICB1bmNoYXIgbGlua3B0clszXTsJCS8qIExpbmsgUG9pbnRlciAqLworICB1bmNoYXIgY29tbWxpbmtpZDsJCS8qIENvbW1hbmQgTGlua2luZyBJZGVudGlmaWVyICovCisgIHVuY2hhciBoYXN0YXQ7CQkvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIChIQVNUQVQpICovCisgIHVuY2hhciB0YXJzdGF0OwkJLyogVGFyZ2V0IERldmljZSBTdGF0dXMgKi8KKyAgdW5jaGFyIHJlc2VydmVkWzJdOworICB1bmNoYXIgY2RiW01BWF9DREIrTUFYX1NFTlNFXTsvKiBTQ1NJIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jayAqLworCQkJCS8qIFJFUVVFU1QgU0VOU0UgKi8KK307CisKK3N0YXRpYyBpbnQgYWhhMTU0Ml9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGludCBhaGExNTQyX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IGFoYTE1NDJfYWJvcnQoU2NzaV9DbW5kICogU0NwbnQpOworc3RhdGljIGludCBhaGExNTQyX2J1c19yZXNldChTY3NpX0NtbmQgKiBTQ3BudCk7CitzdGF0aWMgaW50IGFoYTE1NDJfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KTsKK3N0YXRpYyBpbnQgYWhhMTU0Ml9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KTsKKyNpZiAwCitzdGF0aWMgaW50IGFoYTE1NDJfb2xkX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KTsKK3N0YXRpYyBpbnQgYWhhMTU0Ml9vbGRfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgYWhhMTU0Ml9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJc2VjdG9yX3QsIGludCAqKTsKKworI2RlZmluZSBBSEExNTQyX01BSUxCT1hFUyA4CisjZGVmaW5lIEFIQTE1NDJfU0NBVFRFUiAxNgorI2RlZmluZSBBSEExNTQyX0NNRExVTiAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoYTE3NDAuYyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMzNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qICAkSWQkCisgKiAgMTk5My8wMy8zMQorICogIGxpbnV4L2tlcm5lbC9haGExNzQwLmMKKyAqCisgKiAgQmFzZWQgbG9vc2VseSBvbiBhaGExNTQyLmMgd2hpY2ggaXMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFRvbW15IFRob3JuIGFuZAorICogIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlCisgKgorICogIFRoaXMgZmlsZSBpcyBhaGExNzQwLmMsIHdyaXR0ZW4gYW5kCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMgIEJyYWQgTWNMZWFuCisgKiAgYnJhZEBzYXR1cm4uZ2F5bG9yZC5jb20gb3IgYnJhZEBicmFkcGMuZ2F5bG9yZC5jb20uCisgKiAgCisgKiAgTW9kaWZpY2F0aW9ucyB0byBtYWtlY29kZSBhbmQgcXVldWVjb21tYW5kCisgKiAgZm9yIHByb3BlciBoYW5kbGluZyBvZiBtdWx0aXBsZSBkZXZpY2VzIGNvdXJ0ZW91c2x5CisgKiAgcHJvdmlkZWQgYnkgTWljaGFlbCBXZWxsZXIsIE1hcmNoLCAxOTkzCisgKgorICogIE11bHRpcGxlIGFkYXB0ZXIgc3VwcG9ydCwgZXh0ZW5kZWQgdHJhbnNsYXRpb24gZGV0ZWN0aW9uLAorICogIHVwZGF0ZSB0byBjdXJyZW50IHNjc2kgc3Vic3lzdGVtIGNoYW5nZXMsIHByb2MgZnMgc3VwcG9ydCwKKyAqICB3b3JraW5nICghKSBtb2R1bGUgc3VwcG9ydCBiYXNlZCBvbiBwYXRjaGVzIGZyb20gQW5kcmVhcyBBcmVucywKKyAqICBieSBBbmRyZWFzIERlZ2VydCA8YWRAcGFweXJ1cy5oYW1idXJnLmNvbT4sIDIvMTk5NworICoKKyAqIGFoYTE3NDBfbWFrZWNvZGUgbWF5IHN0aWxsIG5lZWQgZXZlbiBtb3JlIHdvcmsKKyAqIGlmIGl0IGRvZXNuJ3Qgd29yayBmb3IgeW91ciBkZXZpY2VzLCB0YWtlIGEgbG9vay4KKyAqCisgKiBSZXdvcmtlZCBmb3IgbmV3X2VoIGFuZCBuZXcgbG9ja2luZyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIENvbnZlcnRlZCB0byBFSVNBIGFuZCBnZW5lcmljIERNQSBBUElzIGJ5IE1hcmMgWnluZ2llcgorICogPG1hekB3aWxkLXdpbmQuZnIuZXUub3JnPiwgNC8yMDAzLgorICoKKyAqIFNoYXJlZCBpbnRlcnJ1cHQgc3VwcG9ydCBhZGRlZCBieSBSYXNrIEluZ2VtYW5uIExhbWJlcnRzZW4KKyAqIDxyYXNrQHN5Z2VodXMuZGs+LCAxMC8yMDAzCisgKgorICogRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJhaGExNzQwLmgiCisKKy8qIElGIFlPVSBBUkUgSEFWSU5HIFBST0JMRU1TIFdJVEggVEhJUyBEUklWRVIsIEFORCBXQU5UIFRPIFdBVENICisgICBJVCBXT1JLLCBUSEVOOgorI2RlZmluZSBERUJVRworKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBERUIoeCkgeAorI2Vsc2UKKyNkZWZpbmUgREVCKHgpCisjZW5kaWYKKworc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgeworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKwl1bnNpZ25lZCBpbnQgdHJhbnNsYXRpb247CisJdW5zaWduZWQgaW50IGxhc3RfZWNiX3VzZWQ7CisJZG1hX2FkZHJfdCBlY2JfZG1hX2FkZHI7CisJc3RydWN0IGVjYiBlY2JbQUhBMTc0MF9FQ0JTXTsKK307CisKK3N0cnVjdCBhaGExNzQwX3NnIHsKKwlzdHJ1Y3QgYWhhMTc0MF9jaGFpbiBzZ19jaGFpbltBSEExNzQwX1NDQVRURVJdOworCWRtYV9hZGRyX3Qgc2dfZG1hX2FkZHI7CisJZG1hX2FkZHJfdCBidWZfZG1hX2FkZHI7Cit9OworCisjZGVmaW5lIEhPU1REQVRBKGhvc3QpICgoc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKikgJmhvc3QtPmhvc3RkYXRhKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlY2IgKmVjYl9kbWFfdG9fY3B1IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorCQkJCQkgIGRtYV9hZGRyX3QgZG1hKQoreworCXN0cnVjdCBhaGExNzQwX2hvc3RkYXRhICpoZGF0YSA9IEhPU1REQVRBIChob3N0KTsKKwlkbWFfYWRkcl90IG9mZnNldDsKKworCW9mZnNldCA9IGRtYSAtIGhkYXRhLT5lY2JfZG1hX2FkZHI7CisKKwlyZXR1cm4gKHN0cnVjdCBlY2IgKikoKChjaGFyICopIGhkYXRhLT5lY2IpICsgKHVuc2lnbmVkIGludCkgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGVjYl9jcHVfdG9fZG1hIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB2b2lkICpjcHUpCit7CisJc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKmhkYXRhID0gSE9TVERBVEEgKGhvc3QpOworCWRtYV9hZGRyX3Qgb2Zmc2V0OworICAgIAorCW9mZnNldCA9IChjaGFyICopIGNwdSAtIChjaGFyICopIGhkYXRhLT5lY2I7CisKKwlyZXR1cm4gaGRhdGEtPmVjYl9kbWFfYWRkciArIG9mZnNldDsKK30KKworc3RhdGljIGludCBhaGExNzQwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqYnVmZmVyLAorCQkJICAgICBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICAgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW47CisJc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKmhvc3Q7CisKKwlpZiAoaW5vdXQpCisJCXJldHVybi1FTk9TWVM7CisKKwlob3N0ID0gSE9TVERBVEEoc2hwbnQpOworCisJbGVuID0gc3ByaW50ZihidWZmZXIsICJhaGExNzR4IGF0IElPOiVseCwgSVJRICVkLCBTTE9UICVkLlxuIgorCQkgICAgICAiRXh0ZW5kZWQgdHJhbnNsYXRpb24gJXNhYmxlZC5cbiIsCisJCSAgICAgIHNocG50LT5pb19wb3J0LCBzaHBudC0+aXJxLCBob3N0LT5lZGV2LT5zbG90LAorCQkgICAgICBob3N0LT50cmFuc2xhdGlvbiA/ICJlbiIgOiAiZGlzIik7CisKKwlpZiAob2Zmc2V0ID4gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZmZlcjsKKwkJcmV0dXJuIDA7CisJfQorCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWhhMTc0MF9tYWtlY29kZSh1bmNoYXIgKnNlbnNlLCB1bmNoYXIgKnN0YXR1cykKK3sKKwlzdHJ1Y3Qgc3RhdHVzd29yZAorCXsKKwkJdXNob3J0CWRvbjoxLAkvKiBDb21tYW5kIERvbmUgLSBObyBFcnJvciAqLworCQkJZHU6MSwJLyogRGF0YSB1bmRlcnJ1biAqLworCQkgICAgOjEsCXFmOjEsCS8qIFF1ZXVlIGZ1bGwgKi8KKwkJICAgICAgICBzYzoxLAkvKiBTcGVjaWZpY2F0aW9uIENoZWNrICovCisJCSAgICAgICAgZG9yOjEsCS8qIERhdGEgb3ZlcnJ1biAqLworCQkgICAgICAgIGNoOjEsCS8qIENoYWluaW5nIEhhbHRlZCAqLworCQkgICAgICAgIGludHI6MSwJLyogSW50ZXJydXB0IGlzc3VlZCAqLworCQkgICAgICAgIGFzYToxLAkvKiBBZGRpdGlvbmFsIFN0YXR1cyBBdmFpbGFibGUgKi8KKwkJICAgICAgICBzbnM6MSwJLyogU2Vuc2UgaW5mb3JtYXRpb24gU3RvcmVkICovCisJCSAgICA6MSwJaW5pOjEsCS8qIEluaXRpYWxpemF0aW9uIFJlcXVpcmVkICovCisJCQltZToxLAkvKiBNYWpvciBlcnJvciBvciBleGNlcHRpb24gKi8KKwkJICAgIDoxLAllY2E6MSwgIC8qIEV4dGVuZGVkIENvbnRpbmdlbnQgYWxsaWFuY2UgKi8KKwkJICAgIDoxOworCX0gc3RhdHVzX3dvcmQ7CisJaW50IHJldHZhbCA9IERJRF9PSzsKKworCXN0YXR1c193b3JkID0gKiAoc3RydWN0IHN0YXR1c3dvcmQgKikgc3RhdHVzOworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJtYWtlY29kZSBmcm9tICV4LCV4LCV4LCV4ICV4LCV4LCV4LCV4IiwKKwkgICAgICAgc3RhdHVzWzBdLCBzdGF0dXNbMV0sIHN0YXR1c1syXSwgc3RhdHVzWzNdLAorCSAgICAgICBzZW5zZVswXSwgc2Vuc2VbMV0sIHNlbnNlWzJdLCBzZW5zZVszXSk7CisjZW5kaWYKKwlpZiAoIXN0YXR1c193b3JkLmRvbikgeyAvKiBBbnl0aGluZyBhYm5vcm1hbCB3YXMgZGV0ZWN0ZWQgKi8KKwkJaWYgKCAoc3RhdHVzWzFdJjB4MTgpIHx8IHN0YXR1c193b3JkLnNjICkgeworCQkJLypBZGRpdGlvbmFsIGluZm8gYXZhaWxhYmxlKi8KKwkJCS8qIFVzZSB0aGUgc3VwcGxpZWQgaW5mbyBmb3IgZnVydGhlciBkaWFnbm9zdGljcyAqLworCQkJc3dpdGNoICggc3RhdHVzWzJdICkgeworCQkJY2FzZSAweDEyOgorCQkJCWlmICggc3RhdHVzX3dvcmQuZG9yICkKKwkJCQkJcmV0dmFsPURJRF9FUlJPUjsgLyogSXQncyBhbiBPdmVycnVuICovCisJCQkJLyogSWYgbm90IG92ZXJydW4sIGFzc3VtZSB1bmRlcnJ1biBhbmQKKwkJCQkgKiBpZ25vcmUgaXQhICovCisJCQljYXNlIDB4MDA6IC8qIE5vIGluZm8sIGFzc3VtZSBubyBlcnJvciwgc2hvdWxkCisJCQkJICAgICogbm90IG9jY3VyICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTE6CisJCQljYXNlIDB4MjE6CisJCQkJcmV0dmFsPURJRF9USU1FX09VVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwYToKKwkJCQlyZXR2YWw9RElEX0JBRF9UQVJHRVQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDQ6CisJCQljYXNlIDB4MDU6CisJCQkJcmV0dmFsPURJRF9BQk9SVDsKKwkJCQkvKiBFaXRoZXIgYnkgdGhpcyBkcml2ZXIgb3IgdGhlCisJCQkJICogQUhBMTc0MCBpdHNlbGYgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dmFsPURJRF9FUlJPUjsgLyogTm8gZnVydGhlcgorCQkJCQkJICAgKiBkaWFnbm9zdGljcworCQkJCQkJICAgKiBwb3NzaWJsZSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJLyogTWljaGFlbCBzdWdnZXN0cywgYW5kIEJyYWQgY29uY3VyczogKi8KKwkJCWlmICggc3RhdHVzX3dvcmQucWYgKSB7CisJCQkJcmV0dmFsID0gRElEX1RJTUVfT1VUOyAvKiBmb3JjZXMgYSByZWRvICovCisJCQkJLyogSSB0aGluayB0aGlzIHNwZWNpZmljIG9uZSBzaG91bGQKKwkJCQkgKiBub3QgaGFwcGVuIC1CcmFkICovCisJCQkJcHJpbnRrKCJhaGExNzQwLmM6IFdBUk5JTkc6IEFIQTE3NDAgcXVldWUgb3ZlcmZsb3chXG4iKTsKKwkJCX0gZWxzZQorCQkJCWlmICggc3RhdHVzWzBdJjB4NjAgKSB7CisJCQkJCSAvKiBEaWRuJ3QgZmluZCBhIGJldHRlciBlcnJvciAqLworCQkJCQlyZXR2YWwgPSBESURfRVJST1I7CisJCQkJfQorCQkJLyogSW4gYW55IG90aGVyIGNhc2UgcmV0dXJuIERJRF9PSyBzbyBmb3IgZXhhbXBsZQorCQkJICAgQ09ORElUSU9OX0NIRUNLUyBtYWtlIGl0IHRocm91Z2ggdG8gdGhlIGFwcHJvcHJpYXRlCisJCQkgICBkZXZpY2UgZHJpdmVyICovCisJCX0KKwl9CisJLyogVW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMgc3VwcGx5IHRoZSB0YXJnZXQgc3RhdHVzIC1NaWNoYWVsICovCisJcmV0dXJuIHN0YXR1c1szXSB8IHJldHZhbCA8PCAxNjsKK30KKworc3RhdGljIGludCBhaGExNzQwX3Rlc3RfcG9ydCh1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwlpZiAoIGluYihQT1JUQURSKGJhc2UpKSAmIFBPUlRBRERSX0VOSCApCisJCXJldHVybiAxOyAgIC8qIE9rYXksIHdlJ3JlIGFsbCBzZXQgKi8KKwkKKwlwcmludGsoImFoYTE3NHg6IEJvYXJkIGRldGVjdGVkLCBidXQgbm90IGluIGVuaGFuY2VkIG1vZGUsIHNvIGRpc2FibGVkIGl0LlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEEgImhpZ2giIGxldmVsIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWhhMTc0MF9pbnRyX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKSBkZXZfaWQ7CisgICAgICAgIHZvaWQgKCpteV9kb25lKShTY3NpX0NtbmQgKik7CisJaW50IGVycnN0YXR1cywgYWRhcHN0YXQ7CisJaW50IG51bWJlcl9zZXJ2aWNlZDsKKwlzdHJ1Y3QgZWNiICplY2JwdHI7CisJU2NzaV9DbW5kICpTQ3RtcDsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBoYW5kbGVkID0gMDsKKwlzdHJ1Y3QgYWhhMTc0MF9zZyAqc2dwdHI7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCQorCWlmICghaG9zdCkKKwkJcGFuaWMoImFoYTE3NDAuYzogSXJxIGZyb20gdW5rbm93biBob3N0IVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJYmFzZSA9IGhvc3QtPmlvX3BvcnQ7CisJbnVtYmVyX3NlcnZpY2VkID0gMDsKKwllZGV2ID0gSE9TVERBVEEoaG9zdCktPmVkZXY7CisKKwl3aGlsZShpbmIoRzJTVEFUKGJhc2UpKSAmIEcyU1RBVF9JTlRQRU5EKSB7CisJCWhhbmRsZWQgPSAxOworCQlERUIocHJpbnRrKCJhaGExNzQwX2ludHIgdG9wIG9mIGxvb3AuXG4iKSk7CisJCWFkYXBzdGF0ID0gaW5iKEcySU5UU1QoYmFzZSkpOworCQllY2JwdHIgPSBlY2JfZG1hX3RvX2NwdSAoaG9zdCwgaW5sKE1CT1hJTjAoYmFzZSkpKTsKKwkJb3V0YihHMkNOVFJMX0lSU1QsRzJDTlRSTChiYXNlKSk7IC8qIGludGVycnVwdCByZXNldCAqLworICAgICAgCisJCXN3aXRjaCAoIGFkYXBzdGF0ICYgRzJJTlRTVF9NQVNLICkgeworCQljYXNlCUcySU5UU1RfQ0NCUkVUUlk6CisJCWNhc2UJRzJJTlRTVF9DQ0JFUlJPUjoKKwkJY2FzZQlHMklOVFNUX0NDQkdPT0Q6CisJCQkvKiBIb3N0IFJlYWR5IC0+IE1haWxib3ggaW4gY29tcGxldGUgKi8KKwkJCW91dGIoRzJDTlRSTF9IUkRZLEcyQ05UUkwoYmFzZSkpOworCQkJaWYgKCFlY2JwdHIpIHsKKwkJCQlwcmludGsoIkFoYTE3NDAgbnVsbCBlY2JwdHIgaW4gaW50ZXJydXB0ICgleCwleCwleCwlZClcbiIsCisJCQkJICAgICAgIGluYihHMlNUQVQoYmFzZSkpLGFkYXBzdGF0LAorCQkJCSAgICAgICBpbmIoRzJJTlRTVChiYXNlKSksIG51bWJlcl9zZXJ2aWNlZCsrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVNDdG1wID0gZWNicHRyLT5TQ3BudDsKKwkJCWlmICghU0N0bXApIHsKKwkJCQlwcmludGsoIkFoYTE3NDAgbnVsbCBTQ3RtcCBpbiBpbnRlcnJ1cHQgKCV4LCV4LCV4LCVkKVxuIiwKKwkJCQkgICAgICAgaW5iKEcyU1RBVChiYXNlKSksYWRhcHN0YXQsCisJCQkJICAgICAgIGluYihHMklOVFNUKGJhc2UpKSwgbnVtYmVyX3NlcnZpY2VkKyspOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2dwdHIgPSAoc3RydWN0IGFoYTE3NDBfc2cgKikgU0N0bXAtPmhvc3Rfc2NyaWJibGU7CisJCQlpZiAoU0N0bXAtPnVzZV9zZykgeworCQkJCS8qIFdlIHVzZWQgc2NhdHRlci1nYXRoZXIuCisJCQkJICAgRG8gdGhlIHVubWFwcGluZyBkYW5jZS4gKi8KKwkJCQlkbWFfdW5tYXBfc2cgKCZlZGV2LT5kZXYsCisJCQkJCSAgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0N0bXAtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgICAgICBTQ3RtcC0+dXNlX3NnLAorCQkJCQkgICAgICBTQ3RtcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJfSBlbHNlIHsKKwkJCQlkbWFfdW5tYXBfc2luZ2xlICgmZWRldi0+ZGV2LAorCQkJCQkJICBzZ3B0ci0+YnVmX2RtYV9hZGRyLAorCQkJCQkJICBTQ3RtcC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJICBETUFfQklESVJFQ1RJT05BTCk7CisJCQl9CisJICAgIAorCQkJLyogRnJlZSB0aGUgc2cgYmxvY2sgKi8KKwkJCWRtYV9mcmVlX2NvaGVyZW50ICgmZWRldi0+ZGV2LAorCQkJCQkgICBzaXplb2YgKHN0cnVjdCBhaGExNzQwX3NnKSwKKwkJCQkJICAgU0N0bXAtPmhvc3Rfc2NyaWJibGUsCisJCQkJCSAgIHNncHRyLT5zZ19kbWFfYWRkcik7CisJICAgIAorCQkJLyogRmV0Y2ggdGhlIHNlbnNlIGRhdGEsIGFuZCB0dWNrIGl0IGF3YXksIGluCisJCQkgICB0aGUgcmVxdWlyZWQgc2xvdC4gIFRoZSBBZGFwdGVjCisJCQkgICBhdXRvbWF0aWNhbGx5IGZldGNoZXMgaXQsIGFuZCB0aGVyZSBpcyBubworCQkJICAgZ3VhcmFudGVlIHRoYXQgd2Ugd2lsbCBzdGlsbCBoYXZlIGl0IGluIHRoZQorCQkJICAgY2RiIHdoZW4gd2UgY29tZSBiYWNrICovCisJCQlpZiAoIChhZGFwc3RhdCAmIEcySU5UU1RfTUFTSykgPT0gRzJJTlRTVF9DQ0JFUlJPUiApIHsKKwkJCQltZW1jcHkoU0N0bXAtPnNlbnNlX2J1ZmZlciwgZWNicHRyLT5zZW5zZSwgCisJCQkJICAgICAgIHNpemVvZihTQ3RtcC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJZXJyc3RhdHVzID0gYWhhMTc0MF9tYWtlY29kZShlY2JwdHItPnNlbnNlLGVjYnB0ci0+c3RhdHVzKTsKKwkJCX0gZWxzZQorCQkJCWVycnN0YXR1cyA9IDA7CisJCQlERUIoaWYgKGVycnN0YXR1cykKKwkJCSAgICBwcmludGsoImFoYTE3NDBfaW50cl9oYW5kbGU6IHJldHVybmluZyAlNnhcbiIsCisJCQkJICAgZXJyc3RhdHVzKSk7CisJCQlTQ3RtcC0+cmVzdWx0ID0gZXJyc3RhdHVzOworCQkJbXlfZG9uZSA9IGVjYnB0ci0+ZG9uZTsKKwkJCW1lbXNldChlY2JwdHIsMCxzaXplb2Yoc3RydWN0IGVjYikpOyAKKwkJCWlmICggbXlfZG9uZSApCisJCQkJbXlfZG9uZShTQ3RtcCk7CisJCQlicmVhazsKKwkJCQorCQljYXNlCUcySU5UU1RfSEFSREZBSUw6CisJCQlwcmludGsoS0VSTl9BTEVSVCAiYWhhMTc0MCBoYXJkd2FyZSBmYWlsdXJlIVxuIik7CisJCQlwYW5pYygiYWhhMTc0MC5jIik7CS8qIEdvb2RieWUgKi8KKwkJCQorCQljYXNlCUcySU5UU1RfQVNORVZFTlQ6CisJCQlwcmludGsoImFoYTE3NDAgYXN5bmNocm9ub3VzIGV2ZW50OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkgICAgICAgYWRhcHN0YXQsCisJCQkgICAgICAgaW5iKE1CT1hJTjAoYmFzZSkpLAorCQkJICAgICAgIGluYihNQk9YSU4xKGJhc2UpKSwKKwkJCSAgICAgICBpbmIoTUJPWElOMihiYXNlKSksCisJCQkgICAgICAgaW5iKE1CT1hJTjMoYmFzZSkpKTsgLyogU2F5IFdoYXQ/ICovCisJCQkvKiBIb3N0IFJlYWR5IC0+IE1haWxib3ggaW4gY29tcGxldGUgKi8KKwkJCW91dGIoRzJDTlRSTF9IUkRZLEcyQ05UUkwoYmFzZSkpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZQlHMklOVFNUX0NNREdPT0Q6CisJCQkvKiBzZXQgaW1tZWRpYXRlIGNvbW1hbmQgc3VjY2VzcyBmbGFnIGhlcmU6ICovCisJCQlicmVhazsKKwkJCQorCQljYXNlCUcySU5UU1RfQ01ERVJST1I6CisJCQkvKiBTZXQgaW1tZWRpYXRlIGNvbW1hbmQgZmFpbHVyZSBmbGFnIGhlcmU6ICovCisJCQlicmVhazsKKwkJfQorCQludW1iZXJfc2VydmljZWQrKzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGFoYTE3NDBfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCXVuY2hhciBkaXJlY3Rpb247CisJdW5jaGFyICpjbWQgPSAodW5jaGFyICopIFNDcG50LT5jbW5kOworCXVuY2hhciB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwlzdHJ1Y3QgYWhhMTc0MF9ob3N0ZGF0YSAqaG9zdCA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqYnVmZiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwlpbnQgYnVmZmxlbiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJZG1hX2FkZHJfdCBzZ19kbWE7CisJc3RydWN0IGFoYTE3NDBfc2cgKnNncHRyOworCWludCBlY2JubzsKKwlERUIoaW50IGkpOworCisJaWYoKmNtZCA9PSBSRVFVRVNUX1NFTlNFKSB7CisJCVNDcG50LT5yZXN1bHQgPSAwOworCQlkb25lKFNDcG50KTsgCisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCpjbWQgPT0gUkVBRF8xMCB8fCAqY21kID09IFdSSVRFXzEwKQorCQlpID0geHNjc2kyaW50KGNtZCsyKTsKKwllbHNlIGlmICgqY21kID09IFJFQURfNiB8fCAqY21kID09IFdSSVRFXzYpCisJCWkgPSBzY3NpMmludChjbWQrMik7CisJZWxzZQorCQlpID0gLTE7CisJcHJpbnRrKCJhaGExNzQwX3F1ZXVlY29tbWFuZDogZGV2ICVkIGNtZCAlMDJ4IHBvcyAlZCBsZW4gJWQgIiwKKwkgICAgICAgdGFyZ2V0LCAqY21kLCBpLCBidWZmbGVuKTsKKwlwcmludGsoInNjc2kgY21kOiIpOworCWZvciAoaSA9IDA7IGkgPCBTQ3BudC0+Y21kX2xlbjsgaSsrKSBwcmludGsoIiUwMnggIiwgY21kW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCS8qIGxvY2F0ZSBhbiBhdmFpbGFibGUgZWNiICovCisJc3Bpbl9sb2NrX2lycXNhdmUoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJZWNibm8gPSBob3N0LT5sYXN0X2VjYl91c2VkICsgMTsgLyogQW4gb3B0aW1pemF0aW9uICovCisJaWYgKGVjYm5vID49IEFIQTE3NDBfRUNCUykKKwkJZWNibm8gPSAwOworCWRvIHsKKwkJaWYgKCFob3N0LT5lY2JbZWNibm9dLmNtZHcpCisJCQlicmVhazsKKwkJZWNibm8rKzsKKwkJaWYgKGVjYm5vID49IEFIQTE3NDBfRUNCUykKKwkJCWVjYm5vID0gMDsKKwl9IHdoaWxlIChlY2JubyAhPSBob3N0LT5sYXN0X2VjYl91c2VkKTsKKworCWlmIChob3N0LT5lY2JbZWNibm9dLmNtZHcpCisJCXBhbmljKCJVbmFibGUgdG8gZmluZCBlbXB0eSBlY2IgZm9yIGFoYTE3NDAuXG4iKTsKKworCWhvc3QtPmVjYltlY2Jub10uY21kdyA9IEFIQTE3NDBDTURfSU5JVDsgLyogU0NTSSBJbml0aWF0b3IgQ29tbWFuZAorCQkJCQkJICAgIGRvdWJsZXMgYXMgcmVzZXJ2ZWQgZmxhZyAqLworCisJaG9zdC0+bGFzdF9lY2JfdXNlZCA9IGVjYm5vOyAgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlNlbmRpbmcgY29tbWFuZCAoJWQgJXgpLi4uIiwgZWNibm8sIGRvbmUpOworI2VuZGlmCisKKwlob3N0LT5lY2JbZWNibm9dLmNkYmxlbiA9IFNDcG50LT5jbWRfbGVuOyAvKiBTQ1NJIENvbW1hbmQKKwkJCQkJCSAgICogRGVzY3JpcHRvciBCbG9jaworCQkJCQkJICAgKiBMZW5ndGggKi8KKworCWRpcmVjdGlvbiA9IDA7CisJaWYgKCpjbWQgPT0gUkVBRF8xMCB8fCAqY21kID09IFJFQURfNikKKwkJZGlyZWN0aW9uID0gMTsKKwllbHNlIGlmICgqY21kID09IFdSSVRFXzEwIHx8ICpjbWQgPT0gV1JJVEVfNikKKwkJZGlyZWN0aW9uID0gMDsKKworCW1lbWNweShob3N0LT5lY2JbZWNibm9dLmNkYiwgY21kLCBTQ3BudC0+Y21kX2xlbik7CisKKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IGRtYV9hbGxvY19jb2hlcmVudCAoJmhvc3QtPmVkZXYtPmRldiwKKwkJCQkJCSAgIHNpemVvZiAoc3RydWN0IGFoYTE3NDBfc2cpLAorCQkJCQkJICAgJnNnX2RtYSwgR0ZQX0FUT01JQyk7CisJaWYoU0NwbnQtPmhvc3Rfc2NyaWJibGUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaGExNzQwOiBvdXQgb2YgbWVtb3J5IGluIHF1ZXVlY29tbWFuZCFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJc2dwdHIgPSAoc3RydWN0IGFoYTE3NDBfc2cgKikgU0NwbnQtPmhvc3Rfc2NyaWJibGU7CisJc2dwdHItPnNnX2RtYV9hZGRyID0gc2dfZG1hOworICAgIAorCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqIHNncG50OworCQlzdHJ1Y3QgYWhhMTc0MF9jaGFpbiAqIGNwdHI7CisJCWludCBpLCBjb3VudDsKKwkJREVCKHVuc2lnbmVkIGNoYXIgKiBwdHIpOworCisJCWhvc3QtPmVjYltlY2Jub10uc2cgPSAxOyAgLyogU0NTSSBJbml0aWF0b3IgQ29tbWFuZAorCQkJCQkgICAqIHcvc2NhdHRlci1nYXRoZXIqLworCQlzZ3BudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQljcHRyID0gc2dwdHItPnNnX2NoYWluOworCQljb3VudCA9IGRtYV9tYXBfc2cgKCZob3N0LT5lZGV2LT5kZXYsIHNncG50LCBTQ3BudC0+dXNlX3NnLAorCQkJCSAgICBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlmb3IoaT0wOyBpIDwgY291bnQ7IGkrKykgeworCQkJY3B0cltpXS5kYXRhbGVuID0gc2dfZG1hX2xlbiAoc2dwbnQgKyBpKTsKKwkJCWNwdHJbaV0uZGF0YXB0ciA9IHNnX2RtYV9hZGRyZXNzIChzZ3BudCArIGkpOworCQl9CisJCWhvc3QtPmVjYltlY2Jub10uZGF0YWxlbiA9IGNvdW50KnNpemVvZihzdHJ1Y3QgYWhhMTc0MF9jaGFpbik7CisJCWhvc3QtPmVjYltlY2Jub10uZGF0YXB0ciA9IHNnX2RtYTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoImNwdHIgJXg6ICIsY3B0cik7CisJCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopIGNwdHI7CisJCWZvcihpPTA7aTwyNDtpKyspIHByaW50aygiJTAyeCAiLCBwdHJbaV0pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaG9zdC0+ZWNiW2VjYm5vXS5kYXRhbGVuID0gYnVmZmxlbjsKKwkJc2dwdHItPmJ1Zl9kbWFfYWRkciA9ICBkbWFfbWFwX3NpbmdsZSAoJmhvc3QtPmVkZXYtPmRldiwKKwkJCQkJCSAgICAgICBidWZmLCBidWZmbGVuLAorCQkJCQkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKwkJaG9zdC0+ZWNiW2VjYm5vXS5kYXRhcHRyID0gc2dwdHItPmJ1Zl9kbWFfYWRkcjsKKwl9CisJaG9zdC0+ZWNiW2VjYm5vXS5sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJaG9zdC0+ZWNiW2VjYm5vXS5zZXMgPSAxOyAvKiBTdXBwcmVzcyB1bmRlcnJ1biBlcnJvcnMgKi8KKwlob3N0LT5lY2JbZWNibm9dLmRpciA9IGRpcmVjdGlvbjsKKwlob3N0LT5lY2JbZWNibm9dLmFycyA9IDE7IC8qIFllcywgZ2V0IHRoZSBzZW5zZSBvbiBhbiBlcnJvciAqLworCWhvc3QtPmVjYltlY2Jub10uc2Vuc2VsZW4gPSAxMjsKKwlob3N0LT5lY2JbZWNibm9dLnNlbnNlcHRyID0gZWNiX2NwdV90b19kbWEgKFNDcG50LT5kZXZpY2UtPmhvc3QsCisJCQkJCQkgICAgaG9zdC0+ZWNiW2VjYm5vXS5zZW5zZSk7CisJaG9zdC0+ZWNiW2VjYm5vXS5zdGF0dXNwdHIgPSBlY2JfY3B1X3RvX2RtYSAoU0NwbnQtPmRldmljZS0+aG9zdCwKKwkJCQkJCSAgICAgaG9zdC0+ZWNiW2VjYm5vXS5zdGF0dXMpOworCWhvc3QtPmVjYltlY2Jub10uZG9uZSA9IGRvbmU7CisJaG9zdC0+ZWNiW2VjYm5vXS5TQ3BudCA9IFNDcG50OworI2lmZGVmIERFQlVHCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKCJhaGExNzQwX2NvbW1hbmQ6IHNlbmRpbmcuLiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihob3N0LT5lY2JbZWNibm9dKSAtIDEwOyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgKCh1bmNoYXIgKikmaG9zdC0+ZWNiW2VjYm5vXSlbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlpZiAoZG9uZSkgeworCS8qIFRoZSBBZGFwdGVjIFNwZWMgc2F5cyB0aGUgY2FyZCBpcyBzbyBmYXN0IHRoYXQgdGhlIGxvb3BzCisgICAgICAgICAgIHdpbGwgb25seSBiZSBleGVjdXRlZCBvbmNlIGluIHRoZSBjb2RlIGJlbG93LiBFdmVuIGlmIHRoaXMKKyAgICAgICAgICAgd2FzIHRydWUgd2l0aCB0aGUgZmFzdGVzdCBwcm9jZXNzb3JzIHdoZW4gdGhlIHNwZWMgd2FzCisgICAgICAgICAgIHdyaXR0ZW4sIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSB0cnVlIHdpdGggdG9kYXlzIGZhc3QKKyAgICAgICAgICAgcHJvY2Vzc29ycy4gV2UgcHJpbnQgYSB3YXJuaW5nIGlmIHRoZSBjb2RlIGlzIGV4ZWN1dGVkIG1vcmUKKyAgICAgICAgICAgb2Z0ZW4gdGhhbiBMT09QQ05UX1dBUk4uIElmIHRoaXMgaGFwcGVucywgaXQgc2hvdWxkIGJlCisgICAgICAgICAgIGludmVzdGlnYXRlZC4gSWYgdGhlIGNvdW50IHJlYWNoZXMgTE9PUENOVF9NQVgsIHdlIGFzc3VtZQorICAgICAgICAgICBzb21ldGhpbmcgaXMgYnJva2VuOyBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuIGFuCisgICAgICAgICAgIGVycm9yICh0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgYnkgdGhlIG1pZC1sZXZlbCBzY3NpCisgICAgICAgICAgIGxheWVyKSB3ZSBoYXZlIHRvIHBhbmljIChhbmQgbWF5YmUgdGhhdCdzIHRoZSBiZXN0IHRoaW5nIHdlCisgICAgICAgICAgIGNhbiBkbyB0aGVuIGFueWhvdykuICovCisKKyNkZWZpbmUgTE9PUENOVF9XQVJOIDEwCQkvKiBleGNlc3NpdmUgbWJ4b3V0IHdhaXQgLT4gc3lzbG9nLW1zZyAqLworI2RlZmluZSBMT09QQ05UX01BWCAxMDAwMDAwCS8qIG1ieG91dCBkZWFkbG9jayAtPiBwYW5pYygpIGFmdGVyIH4gMiBzZWMuICovCisJCWludCBsb29wY250OworCQl1bnNpZ25lZCBpbnQgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJCURFQihwcmludGsoImFoYTE3NDBbJWRdIGNyaXRpY2FsIHNlY3Rpb25cbiIsZWNibm8pKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJZm9yIChsb29wY250ID0gMDsgOyBsb29wY250KyspIHsKKwkJCWlmIChpbmIoRzJTVEFUKGJhc2UpKSAmIEcyU1RBVF9NQlhPVVQpIGJyZWFrOworCQkJaWYgKGxvb3BjbnQgPT0gTE9PUENOVF9XQVJOKSB7CisJCQkJcHJpbnRrKCJhaGExNzQwWyVkXV9tYnhvdXQgd2FpdCFcbiIsZWNibm8pOworCQkJfQorCQkJaWYgKGxvb3BjbnQgPT0gTE9PUENOVF9NQVgpCisJCQkJcGFuaWMoImFoYTE3NDAuYzogbWJ4b3V0IGJ1c3khXG4iKTsKKwkJfQorCQlvdXRsIChlY2JfY3B1X3RvX2RtYSAoU0NwbnQtPmRldmljZS0+aG9zdCwgaG9zdC0+ZWNiICsgZWNibm8pLAorCQkgICAgICBNQk9YT1VUMChiYXNlKSk7CisJCWZvciAobG9vcGNudCA9IDA7IDsgbG9vcGNudCsrKSB7CisJCQlpZiAoISAoaW5iKEcyU1RBVChiYXNlKSkgJiBHMlNUQVRfQlVTWSkpIGJyZWFrOworCQkJaWYgKGxvb3BjbnQgPT0gTE9PUENOVF9XQVJOKSB7CisJCQkJcHJpbnRrKCJhaGExNzQwWyVkXV9hdHRuIHdhaXQhXG4iLGVjYm5vKTsKKwkJCX0KKwkJCWlmIChsb29wY250ID09IExPT1BDTlRfTUFYKQorCQkJCXBhbmljKCJhaGExNzQwLmM6IGF0dG4gd2FpdCBmYWlsZWQhXG4iKTsKKwkJfQorCQlvdXRiKEFUVE5fU1RBUlQgfCAodGFyZ2V0ICYgNyksIEFUVE4oYmFzZSkpOyAvKiBTdGFydCBpdCB1cCAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlERUIocHJpbnRrKCJhaGExNzQwWyVkXSByZXF1ZXN0IHF1ZXVlZC5cbiIsZWNibm8pKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fQUxFUlQgImFoYTE3NDBfcXVldWVjb21tYW5kOiBkb25lIGNhbid0IGJlIE5VTExcbiIpOworCXJldHVybiAwOworfQorCisvKiBRdWVyeSB0aGUgYm9hcmQgZm9yIGl0cyBpcnFfbGV2ZWwgYW5kIGlycV90eXBlLiAgTm90aGluZyBlbHNlIG1hdHRlcnMKKyAgIGluIGVuaGFuY2VkIG1vZGUgb24gYW4gRUlTQSBidXMuICovCisKK3N0YXRpYyB2b2lkIGFoYTE3NDBfZ2V0Y29uZmlnKHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgKmlycV9sZXZlbCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqaXJxX3R5cGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnRyYW5zbGF0aW9uKQoreworCXN0YXRpYyBpbnQgaW50YWJbXSA9IHsgOSwgMTAsIDExLCAxMiwgMCwgMTQsIDE1LCAwIH07CisKKwkqaXJxX2xldmVsID0gaW50YWJbaW5iKElOVERFRihiYXNlKSkgJiAweDddOworCSppcnFfdHlwZSAgPSAoaW5iKElOVERFRihiYXNlKSkgJiAweDgpID4+IDM7CisJKnRyYW5zbGF0aW9uID0gaW5iKFJFU1YxKGJhc2UpKSAmIDB4MTsKKwlvdXRiKGluYihJTlRERUYoYmFzZSkpIHwgMHgxMCwgSU5UREVGKGJhc2UpKTsKK30KKworc3RhdGljIGludCBhaGExNzQwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCSAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCogaXApCit7CisJaW50IHNpemUgPSBjYXBhY2l0eTsKKwlpbnQgZXh0ZW5kZWQgPSBIT1NUREFUQShzZGV2LT5ob3N0KS0+dHJhbnNsYXRpb247CisKKwlERUIocHJpbnRrKCJhaGExNzQwX2Jpb3NwYXJhbVxuIikpOworCWlmIChleHRlbmRlZCAmJiAoaXBbMl0gPiAxMDI0KSkJeworCQlpcFswXSA9IDI1NTsKKwkJaXBbMV0gPSA2MzsKKwkJaXBbMl0gPSBzaXplIC8gKDI1NSAqIDYzKTsKKwl9IGVsc2UgeworCQlpcFswXSA9IDY0OworCQlpcFsxXSA9IDMyOworCQlpcFsyXSA9IHNpemUgPj4gMTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoYTE3NDBfZWhfYWJvcnRfaGFuZGxlciAoU2NzaV9DbW5kICpkdW1teSkKK3sKKy8qCisgKiBGcm9tIEFsYW4gQ294IDoKKyAqIFRoZSBBSEExNzQwIGhhcyBmaXJtd2FyZSBoYW5kbGVkIGFib3J0L3Jlc2V0IGhhbmRsaW5nLiBUaGUgImhlYWQgaW4KKyAqIHNhbmQiIGtlcm5lbCBjb2RlIGlzIGNvcnJlY3QgZm9yIG9uY2UgOCkKKyAqCisgKiBTbyB3ZSBkZWZpbmUgYSBkdW1teSBoYW5kbGVyIGp1c3QgdG8ga2VlcCB0aGUga2VybmVsIFNDU0kgY29kZSBhcworICogcXVpZXQgYXMgcG9zc2libGUuLi4KKyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYWhhMTc0MF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5wcm9jX25hbWUgICAgICAgID0gImFoYTE3NDAiLAorCS5wcm9jX2luZm8gICAgICAgID0gYWhhMTc0MF9wcm9jX2luZm8sCisJLm5hbWUgICAgICAgICAgICAgPSAiQWRhcHRlYyAxNzR4IChFSVNBKSIsCisJLnF1ZXVlY29tbWFuZCAgICAgPSBhaGExNzQwX3F1ZXVlY29tbWFuZCwKKwkuYmlvc19wYXJhbSAgICAgICA9IGFoYTE3NDBfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgICAgICAgID0gQUhBMTc0MF9FQ0JTLAorCS50aGlzX2lkICAgICAgICAgID0gNywKKwkuc2dfdGFibGVzaXplICAgICA9IEFIQTE3NDBfU0NBVFRFUiwKKwkuY21kX3Blcl9sdW4gICAgICA9IEFIQTE3NDBfQ01ETFVOLAorCS51c2VfY2x1c3RlcmluZyAgID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBhaGExNzQwX2VoX2Fib3J0X2hhbmRsZXIsCit9OworCitzdGF0aWMgaW50IGFoYTE3NDBfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgc2xvdGJhc2U7CisJdW5zaWduZWQgaW50IGlycV9sZXZlbCwgaXJxX3R5cGUsIHRyYW5zbGF0aW9uOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCXN0cnVjdCBhaGExNzQwX2hvc3RkYXRhICpob3N0OworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlIChkZXYpOworCisJREVCKHByaW50aygiYWhhMTc0MF9wcm9iZTogXG4iKSk7CisJCisJc2xvdGJhc2UgPSBlZGV2LT5iYXNlX2FkZHIgKyBFSVNBX1ZFTkRPUl9JRF9PRkZTRVQ7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzbG90YmFzZSwgU0xPVFNJWkUsICJhaGExNzQwIikpIC8qIFNlZSBpZiBpbiB1c2UgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoIWFoYTE3NDBfdGVzdF9wb3J0KHNsb3RiYXNlKSkKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJYWhhMTc0MF9nZXRjb25maWcoc2xvdGJhc2UsJmlycV9sZXZlbCwmaXJxX3R5cGUsJnRyYW5zbGF0aW9uKTsKKwlpZiAoKGluYihHMlNUQVQoc2xvdGJhc2UpKSAmCisJICAgICAoRzJTVEFUX01CWE9VVHxHMlNUQVRfQlVTWSkpICE9IEcyU1RBVF9NQlhPVVQpIHsKKwkJLyogSWYgdGhlIGNhcmQgaXNuJ3QgcmVhZHksIGhhcmQgcmVzZXQgaXQgKi8KKwkJb3V0YihHMkNOVFJMX0hSU1QsIEcyQ05UUkwoc2xvdGJhc2UpKTsKKwkJb3V0YigwLCBHMkNOVFJMKHNsb3RiYXNlKSk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyaW5nIHNsb3QgJWQgYXQgSU86JXgsIElSUSAldSAoJXMpXG4iLAorCSAgICAgICBlZGV2LT5zbG90LCBzbG90YmFzZSwgaXJxX2xldmVsLCBpcnFfdHlwZSA/ICJlZGdlIiA6ICJsZXZlbCIpOworCXByaW50ayhLRVJOX0lORk8gImFoYTE3NHg6IEV4dGVuZGVkIHRyYW5zbGF0aW9uICVzYWJsZWQuXG4iLAorCSAgICAgICB0cmFuc2xhdGlvbiA/ICJlbiIgOiAiZGlzIik7CisJc2hwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJmFoYTE3NDBfdGVtcGxhdGUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEpKTsKKwlpZihzaHBudCA9PSBOVUxMKQorCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKworCXNocG50LT5iYXNlID0gMDsKKwlzaHBudC0+aW9fcG9ydCA9IHNsb3RiYXNlOworCXNocG50LT5uX2lvX3BvcnQgPSBTTE9UU0laRTsKKwlzaHBudC0+aXJxID0gaXJxX2xldmVsOworCXNocG50LT5kbWFfY2hhbm5lbCA9IDB4ZmY7CisJaG9zdCA9IEhPU1REQVRBKHNocG50KTsKKwlob3N0LT5lZGV2ID0gZWRldjsKKwlob3N0LT50cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uOworCWhvc3QtPmVjYl9kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlICgmZWRldi0+ZGV2LCBob3N0LT5lY2IsCisJCQkJCSAgICAgc2l6ZW9mIChob3N0LT5lY2IpLAorCQkJCQkgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoIWhvc3QtPmVjYl9kbWFfYWRkcikgeworCQlwcmludGsgKEtFUk5fRVJSICJhaGExNzQwX3Byb2JlOiBDb3VsZG4ndCBtYXAgRUNCLCBnaXZpbmcgdXBcbiIpOworCQlzY3NpX3VucmVnaXN0ZXIgKHNocG50KTsKKwkJZ290byBlcnJfaG9zdF9wdXQ7CisJfQorCQorCURFQihwcmludGsoImFoYTE3NDBfcHJvYmU6IGVuYWJsZSBpbnRlcnJ1cHQgY2hhbm5lbCAlZFxuIixpcnFfbGV2ZWwpKTsKKwlpZiAocmVxdWVzdF9pcnEoaXJxX2xldmVsLGFoYTE3NDBfaW50cl9oYW5kbGUsaXJxX3R5cGUgPyAwIDogU0FfU0hJUlEsCisJCQkiYWhhMTc0MCIsc2hwbnQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTc0MF9wcm9iZTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUSAlZC5cbiIsCisJCSAgICAgICBpcnFfbGV2ZWwpOworCQlnb3RvIGVycl91bm1hcDsKKwl9CisKKwllaXNhX3NldF9kcnZkYXRhIChlZGV2LCBzaHBudCk7CisJc2NzaV9hZGRfaG9zdCAoc2hwbnQsIGRldik7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0IChzaHBudCk7CisJcmV0dXJuIDA7CisKKyBlcnJfdW5tYXA6CisJZG1hX3VubWFwX3NpbmdsZSAoJmVkZXYtPmRldiwgaG9zdC0+ZWNiX2RtYV9hZGRyLAorCQkJICBzaXplb2YgKGhvc3QtPmVjYiksIERNQV9CSURJUkVDVElPTkFMKTsKKyBlcnJfaG9zdF9wdXQ6CisJc2NzaV9ob3N0X3B1dCAoc2hwbnQpOworIGVycl9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihzbG90YmFzZSwgU0xPVFNJWkUpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50IGFoYTE3NDBfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBkZXYtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhaGExNzQwX2hvc3RkYXRhICpob3N0ID0gSE9TVERBVEEgKHNocG50KTsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2hwbnQpOworCQorCWZyZWVfaXJxIChzaHBudC0+aXJxLCBzaHBudCk7CisJZG1hX3VubWFwX3NpbmdsZSAoZGV2LCBob3N0LT5lY2JfZG1hX2FkZHIsCisJCQkgIHNpemVvZiAoaG9zdC0+ZWNiKSwgRE1BX0JJRElSRUNUSU9OQUwpOworCXJlbGVhc2VfcmVnaW9uIChzaHBudC0+aW9fcG9ydCwgU0xPVFNJWkUpOworCisJc2NzaV9ob3N0X3B1dCAoc2hwbnQpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGFoYTE3NDBfaWRzW10gPSB7CisJeyAiQURQMDAwMCIgfSwJCS8qIDE3NDAgICovCisJeyAiQURQMDAwMSIgfSwJCS8qIDE3NDBBICovCisJeyAiQURQMDAwMiIgfSwJCS8qIDE3NDJBICovCisJeyAiQURQMDQwMCIgfSwJCS8qIDE3NDQgICovCisJeyAiIiB9Cit9OworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGFoYTE3NDBfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGFoYTE3NDBfaWRzLAorCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgICAgPSAiYWhhMTc0MCIsCisJCS5wcm9iZSAgID0gYWhhMTc0MF9wcm9iZSwKKwkJLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoYWhhMTc0MF9yZW1vdmUpLAorCX0sCit9OworCitzdGF0aWMgX19pbml0IGludCBhaGExNzQwX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIGVpc2FfZHJpdmVyX3JlZ2lzdGVyICgmYWhhMTc0MF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWhhMTc0MF9leGl0ICh2b2lkKQoreworCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZhaGExNzQwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChhaGExNzQwX2luaXQpOworbW9kdWxlX2V4aXQgKGFoYTE3NDBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGExNzQwLmggYi9kcml2ZXJzL3Njc2kvYWhhMTc0MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjNmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWhhMTc0MC5oCkBAIC0wLDAgKzEsMTU0IEBACisjaWZuZGVmIF9BSEExNzQwX0gKKworLyogJElkJAorICoKKyAqIEhlYWRlciBmaWxlIGZvciB0aGUgYWRhcHRlYyAxNzQwIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBXaXRoIG1pbm9yIHJldmlzaW9ucyAzLzMxLzkzCisgKiBXcml0dGVuIGFuZCAoQykgMTk5MiwxOTkzIEJyYWQgTWNMZWFuLiAgU2VlIGFoYTE3NDAuYworICogZm9yIG1vcmUgaW5mbworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBTTE9UU0laRQkweDVjCisKKy8qIEVJU0EgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgJiB2YWx1ZXMgKi8KKyNkZWZpbmUJSElEMChiYXNlKQkoYmFzZSArIDB4MCkKKyNkZWZpbmUJSElEMShiYXNlKQkoYmFzZSArIDB4MSkKKyNkZWZpbmUgSElEMihiYXNlKQkoYmFzZSArIDB4MikKKyNkZWZpbmUJSElEMyhiYXNlKQkoYmFzZSArIDB4MykKKyNkZWZpbmUJRUJDTlRSTChiYXNlKQkoYmFzZSArIDB4NCkKKyNkZWZpbmUJUE9SVEFEUihiYXNlKQkoYmFzZSArIDB4NDApCisjZGVmaW5lIEJJT1NBRFIoYmFzZSkJKGJhc2UgKyAweDQxKQorI2RlZmluZSBJTlRERUYoYmFzZSkJKGJhc2UgKyAweDQyKQorI2RlZmluZSBTQ1NJREVGKGJhc2UpCShiYXNlICsgMHg0MykKKyNkZWZpbmUgQlVTREVGKGJhc2UpCShiYXNlICsgMHg0NCkKKyNkZWZpbmUJUkVTVjAoYmFzZSkJKGJhc2UgKyAweDQ1KQorI2RlZmluZSBSRVNWMShiYXNlKQkoYmFzZSArIDB4NDYpCisjZGVmaW5lCVJFU1YyKGJhc2UpCShiYXNlICsgMHg0NykKKworI2RlZmluZQlISURfTUZHCSJBRFAiCisjZGVmaW5lCUhJRF9QUkQgMAorI2RlZmluZSBISURfUkVWIDIKKyNkZWZpbmUgRUJDTlRSTF9WQUxVRSAxCisjZGVmaW5lIFBPUlRBRERSX0VOSCAweDgwCisvKiBSRUFEICovCisjZGVmaW5lCUcySU5UU1QoYmFzZSkJKGJhc2UgKyAweDU2KQorI2RlZmluZSBHMlNUQVQoYmFzZSkJKGJhc2UgKyAweDU3KQorI2RlZmluZQlNQk9YSU4wKGJhc2UpCShiYXNlICsgMHg1OCkKKyNkZWZpbmUJTUJPWElOMShiYXNlKQkoYmFzZSArIDB4NTkpCisjZGVmaW5lCU1CT1hJTjIoYmFzZSkJKGJhc2UgKyAweDVhKQorI2RlZmluZQlNQk9YSU4zKGJhc2UpCShiYXNlICsgMHg1YikKKyNkZWZpbmUgRzJTVEFUMihiYXNlKQkoYmFzZSArIDB4NWMpCisKKyNkZWZpbmUgRzJJTlRTVF9NQVNLCQkweGYwCS8qIGlzb2xhdGUgdGhlIHN0YXR1cyAqLworI2RlZmluZQlHMklOVFNUX0NDQkdPT0QJCTB4MTAJLyogQ0NCIENvbXBsZXRlZCAqLworI2RlZmluZQlHMklOVFNUX0NDQlJFVFJZCTB4NTAJLyogQ0NCIENvbXBsZXRlZCB3aXRoIGEgcmV0cnkgKi8KKyNkZWZpbmUJRzJJTlRTVF9IQVJERkFJTAkweDcwCS8qIEFkYXB0ZXIgSGFyZHdhcmUgRmFpbHVyZSAqLworI2RlZmluZQlHMklOVFNUX0NNREdPT0QJCTB4YTAJLyogSW1tZWRpYXRlIGNvbW1hbmQgc3VjY2VzcyAqLworI2RlZmluZSBHMklOVFNUX0NDQkVSUk9SCTB4YzAJLyogQ0NCIENvbXBsZXRlZCB3aXRoIGVycm9yICovCisjZGVmaW5lCUcySU5UU1RfQVNORVZFTlQJMHhkMAkvKiBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uICovCisjZGVmaW5lCUcySU5UU1RfQ01ERVJST1IJMHhlMAkvKiBJbW1lZGlhdGUgY29tbWFuZCBlcnJvciAqLworCisjZGVmaW5lIEcyU1RBVF9NQlhPVVQJNAkvKiBNYWlsYm94IE91dCBFbXB0eSBCaXQgKi8KKyNkZWZpbmUJRzJTVEFUX0lOVFBFTkQJMgkvKiBJbnRlcnJ1cHQgUGVuZGluZyBCaXQgKi8KKyNkZWZpbmUJRzJTVEFUX0JVU1kJMQkvKiBCdXN5IEJpdCAoYXR0ZW50aW9uIHBlbmRpbmcpICovCisKKyNkZWZpbmUgRzJTVEFUMl9SRUFEWQkwCS8qIEhvc3QgUmVhZHkgQml0ICovCisKKy8qIFdSSVRFIChhbmQgUmVhZEJhY2spICovCisjZGVmaW5lCU1CT1hPVVQwKGJhc2UpCShiYXNlICsgMHg1MCkKKyNkZWZpbmUJTUJPWE9VVDEoYmFzZSkJKGJhc2UgKyAweDUxKQorI2RlZmluZQlNQk9YT1VUMihiYXNlKQkoYmFzZSArIDB4NTIpCisjZGVmaW5lCU1CT1hPVVQzKGJhc2UpCShiYXNlICsgMHg1MykKKyNkZWZpbmUJQVRUTihiYXNlKQkoYmFzZSArIDB4NTQpCisjZGVmaW5lIEcyQ05UUkwoYmFzZSkJKGJhc2UgKyAweDU1KQorCisjZGVmaW5lCUFUVE5fSU1NRUQJMHgxMAkvKiBJbW1lZGlhdGUgQ29tbWFuZCAqLworI2RlZmluZQlBVFROX1NUQVJUCTB4NDAJLyogU3RhcnQgQ0NCICovCisjZGVmaW5lCUFUVE5fQUJPUlQJMHg1MAkvKiBBYm9ydCBDQ0IgKi8KKworI2RlZmluZSBHMkNOVFJMX0hSU1QJMHg4MAkvKiBIYXJkIFJlc2V0ICovCisjZGVmaW5lIEcyQ05UUkxfSVJTVAkweDQwCS8qIENsZWFyIEVJU0EgSW50ZXJydXB0ICovCisjZGVmaW5lIEcyQ05UUkxfSFJEWQkweDIwCS8qIFNldHMgSE9TVCByZWFkeSAqLworCisvKiBUaGlzIGlzIHVzZWQgd2l0aCBzY2F0dGVyLWdhdGhlciAqLworc3RydWN0IGFoYTE3NDBfY2hhaW4geworCXUzMiBkYXRhcHRyOwkJLyogTG9jYXRpb24gb2YgZGF0YSAqLworCXUzMiBkYXRhbGVuOwkJLyogU2l6ZSBvZiB0aGlzIHBhcnQgb2YgY2hhaW4gKi8KK307CisKKy8qIFRoZXNlIGJlbG9uZyBpbiBzY3NpLmggKi8KKyNkZWZpbmUgYW55MnNjc2kodXAsIHApCQkJCVwKKyh1cClbMF0gPSAoKCh1bnNpZ25lZCBsb25nKShwKSkgPj4gMTYpICA7CVwKKyh1cClbMV0gPSAoKCh1bnNpZ25lZCBsb25nKShwKSkgPj4gOCk7CQlcCisodXApWzJdID0gKCh1bnNpZ25lZCBsb25nKShwKSk7CisKKyNkZWZpbmUgc2NzaTJpbnQodXApICggKCgobG9uZykqKHVwKSkgPDwgMTYpICsgKCgobG9uZykodXApWzFdKSA8PCA4KSArICgobG9uZykodXApWzJdKSApCisKKyNkZWZpbmUgeGFueTJzY3NpKHVwLCBwKQlcCisodXApWzBdID0gKChsb25nKShwKSkgPj4gMjQ7CVwKKyh1cClbMV0gPSAoKGxvbmcpKHApKSA+PiAxNjsJXAorKHVwKVsyXSA9ICgobG9uZykocCkpID4+IDg7CVwKKyh1cClbM10gPSAoKGxvbmcpKHApKTsKKworI2RlZmluZSB4c2NzaTJpbnQodXApICggKCgobG9uZykodXApWzBdKSA8PCAyNCkgKyAoKChsb25nKSh1cClbMV0pIDw8IDE2KSBcCisJCSAgICAgICsgKCgobG9uZykodXApWzJdKSA8PCAgOCkgKyAgKChsb25nKSh1cClbM10pICkKKworI2RlZmluZSBNQVhfQ0RCIDEyCisjZGVmaW5lIE1BWF9TRU5TRSAxNAorI2RlZmluZSBNQVhfU1RBVFVTIDMyCisKK3N0cnVjdCBlY2IgewkJCS8qIEVuaGFuY2VkIENvbnRyb2wgQmxvY2sgNi4xICovCisJdTE2IGNtZHc7CQkvKiBDb21tYW5kIFdvcmQgKi8KKwkvKiBGbGFnIFdvcmQgMSAqLworCXUxNiBjbmU6MSwJCS8qIENvbnRyb2wgQmxvY2sgQ2hhaW5pbmcgKi8KKwk6NiwgZGk6MSwJCS8qIERpc2FibGUgSW50ZXJydXB0ICovCisJOjIsIHNlczoxLAkJLyogU3VwcHJlc3MgVW5kZXJydW4gZXJyb3IgKi8KKwk6MSwgc2c6MSwJCS8qIFNjYXR0ZXIvR2F0aGVyICovCisJOjEsIGRzYjoxLAkJLyogRGlzYWJsZSBTdGF0dXMgQmxvY2sgKi8KKwkgYXJzOjE7CQkJLyogQXV0b21hdGljIFJlcXVlc3QgU2Vuc2UgKi8KKwkvKiBGbGFnIFdvcmQgMiAqLworCXUxNiBsdW46MywJCS8qIExvZ2ljYWwgVW5pdCAqLworCSB0YWc6MSwJCQkvKiBUYWdnZWQgUXVldWluZyAqLworCSB0dDoyLAkJCS8qIFRhZyBUeXBlICovCisJIG5kOjEsCQkJLyogTm8gRGlzY29ubmVjdCAqLworCToxLCBkYXQ6MSwJCS8qIERhdGEgdHJhbnNmZXIgLSBjaGVjayBkaXJlY3Rpb24gKi8KKwkgZGlyOjEsCQkJLyogRGlyZWN0aW9uIG9mIHRyYW5zZmVyIDEgPSBkYXRhaW4gKi8KKwkgc3Q6MSwJCQkvKiBTdXBwcmVzcyBUcmFuc2ZlciAqLworCSBjaGs6MSwJCQkvKiBDYWxjdWxhdGUgQ2hlY2tzdW0gKi8KKwk6MiwgcmVjOjEsOjE7CQkvKiBFcnJvciBSZWNvdmVyeSAqLworCXUxNiBuaWwwOwkJLyogbm90aGluZyAqLworCXUzMiBkYXRhcHRyOwkJLyogRGF0YSBvciBTY2F0dGVyIExpc3QgcHRyICovCisJdTMyIGRhdGFsZW47CQkvKiBEYXRhIG9yIFNjYXR0ZXIgTGlzdCBsZW4gKi8KKwl1MzIgc3RhdHVzcHRyOwkJLyogU3RhdHVzIEJsb2NrIHB0ciAqLworCXUzMiBsaW5rcHRyOwkJLyogQ2hhaW4gQWRkcmVzcyAqLworCXUzMiBuaWwxOwkJLyogbm90aGluZyAqLworCXUzMiBzZW5zZXB0cjsJCS8qIFNlbnNlIEluZm8gUG9pbnRlciAqLworCXU4IHNlbnNlbGVuOwkJLyogU2Vuc2UgTGVuZ3RoICovCisJdTggY2RibGVuOwkJLyogQ0RCIExlbmd0aCAqLworCXUxNiBkYXRhY2hlY2s7CQkvKiBEYXRhIGNoZWNrc3VtICovCisJdTggY2RiW01BWF9DREJdOwkvKiBDREIgYXJlYSAqLworLyogSGFyZHdhcmUgZGVmaW5lZCBwb3J0aW9uIGVuZHMgaGVyZSwgcmVzdCBpcyBkcml2ZXIgZGVmaW5lZCAqLworCXU4IHNlbnNlW01BWF9TRU5TRV07CS8qIFNlbnNlIGFyZWEgKi8KKwl1OCBzdGF0dXNbTUFYX1NUQVRVU107CS8qIFN0YXR1cyBhcmVhICovCisJU2NzaV9DbW5kICpTQ3BudDsJLyogTGluayB0byB0aGUgU0NTSSBDb21tYW5kIEJsb2NrICovCisJdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKik7CS8qIENvbXBsZXRpb24gRnVuY3Rpb24gKi8KK307CisKKyNkZWZpbmUJQUhBMTc0MENNRF9OT1AJIDB4MDAJLyogTm8gT1AgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9JTklUCSAweDAxCS8qIEluaXRpYXRvciBTQ1NJIENvbW1hbmQgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9ESUFHCSAweDA1CS8qIFJ1biBEaWFnbm9zdGljIENvbW1hbmQgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9TQ1NJCSAweDA2CS8qIEluaXRpYWxpemUgU0NTSSAqLworI2RlZmluZSBBSEExNzQwQ01EX1NFTlNFIDB4MDgJLyogUmVhZCBTZW5zZSBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBBSEExNzQwQ01EX0RPV04gIDB4MDkJLyogRG93bmxvYWQgRmlybXdhcmUgKHllYWgsIEkgYmV0ISkgKi8KKyNkZWZpbmUgQUhBMTc0MENNRF9SSU5RICAweDBhCS8qIFJlYWQgSG9zdCBBZGFwdGVyIElucXVpcnkgRGF0YSAqLworI2RlZmluZSBBSEExNzQwQ01EX1RBUkcgIDB4MTAJLyogVGFyZ2V0IFNDU0kgQ29tbWFuZCAqLworCisjZGVmaW5lIEFIQTE3NDBfRUNCUyAzMgorI2RlZmluZSBBSEExNzQwX1NDQVRURVIgMTYKKyNkZWZpbmUgQUhBMTc0MF9DTURMVU4gMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGNpLmMgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTViMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCkBAIC0wLDAgKzEsMTA2NSBAQAorLyoKKyAqICBhaGNpLmMgLSBBSENJIFNBVEEgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICogVmVyc2lvbiAxLjAgb2YgdGhlIEFIQ0kgc3BlY2lmaWNhdGlvbjoKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL3RlY2hub2xvZ3kvc2VyaWFsYXRhL3BkZi9yZXYxXzAucGRmCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJhaGNpIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMCIKKworCitlbnVtIHsKKwlBSENJX1BDSV9CQVIJCT0gNSwKKwlBSENJX01BWF9TRwkJPSAxNjgsIC8qIGhhcmR3YXJlIG1heCBpcyA2NEsgKi8KKwlBSENJX0RNQV9CT1VOREFSWQk9IDB4ZmZmZmZmZmYsCisJQUhDSV9VU0VfQ0xVU1RFUklORwk9IDAsCisJQUhDSV9DTURfU0xPVF9TWgk9IDMyICogMzIsCisJQUhDSV9SWF9GSVNfU1oJCT0gMjU2LAorCUFIQ0lfQ01EX1RCTF9IRFIJPSAweDgwLAorCUFIQ0lfQ01EX1RCTF9TWgkJPSBBSENJX0NNRF9UQkxfSERSICsgKEFIQ0lfTUFYX1NHICogMTYpLAorCUFIQ0lfUE9SVF9QUklWX0RNQV9TWgk9IEFIQ0lfQ01EX1NMT1RfU1ogKyBBSENJX0NNRF9UQkxfU1ogKworCQkJCSAgQUhDSV9SWF9GSVNfU1osCisJQUhDSV9JUlFfT05fU0cJCT0gKDEgPDwgMzEpLAorCUFIQ0lfQ01EX0FUQVBJCQk9ICgxIDw8IDUpLAorCUFIQ0lfQ01EX1dSSVRFCQk9ICgxIDw8IDYpLAorCisJUlhfRklTX0QySF9SRUcJCT0gMHg0MCwJLyogb2Zmc2V0IG9mIEQySCBSZWdpc3RlciBGSVMgZGF0YSAqLworCisJYm9hcmRfYWhjaQkJPSAwLAorCisJLyogZ2xvYmFsIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisJSE9TVF9DQVAJCT0gMHgwMCwgLyogaG9zdCBjYXBhYmlsaXRpZXMgKi8KKwlIT1NUX0NUTAkJPSAweDA0LCAvKiBnbG9iYWwgaG9zdCBjb250cm9sICovCisJSE9TVF9JUlFfU1RBVAkJPSAweDA4LCAvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisJSE9TVF9QT1JUU19JTVBMCQk9IDB4MGMsIC8qIGJpdG1hcCBvZiBpbXBsZW1lbnRlZCBwb3J0cyAqLworCUhPU1RfVkVSU0lPTgkJPSAweDEwLCAvKiBBSENJIHNwZWMuIHZlcnNpb24gY29tcGxpYW5jeSAqLworCisJLyogSE9TVF9DVEwgYml0cyAqLworCUhPU1RfUkVTRVQJCT0gKDEgPDwgMCksICAvKiByZXNldCBjb250cm9sbGVyOyBzZWxmLWNsZWFyICovCisJSE9TVF9JUlFfRU4JCT0gKDEgPDwgMSksICAvKiBnbG9iYWwgSVJRIGVuYWJsZSAqLworCUhPU1RfQUhDSV9FTgkJPSAoMSA8PCAzMSksIC8qIEFIQ0kgZW5hYmxlZCAqLworCisJLyogSE9TVF9DQVAgYml0cyAqLworCUhPU1RfQ0FQXzY0CQk9ICgxIDw8IDMxKSwgLyogUENJIERBQyAoNjQtYml0IERNQSkgc3VwcG9ydCAqLworCisJLyogcmVnaXN0ZXJzIGZvciBlYWNoIFNBVEEgcG9ydCAqLworCVBPUlRfTFNUX0FERFIJCT0gMHgwMCwgLyogY29tbWFuZCBsaXN0IERNQSBhZGRyICovCisJUE9SVF9MU1RfQUREUl9ISQk9IDB4MDQsIC8qIGNvbW1hbmQgbGlzdCBETUEgYWRkciBoaSAqLworCVBPUlRfRklTX0FERFIJCT0gMHgwOCwgLyogRklTIHJ4IGJ1ZiBhZGRyICovCisJUE9SVF9GSVNfQUREUl9ISQk9IDB4MGMsIC8qIEZJUyByeCBidWYgYWRkciBoaSAqLworCVBPUlRfSVJRX1NUQVQJCT0gMHgxMCwgLyogaW50ZXJydXB0IHN0YXR1cyAqLworCVBPUlRfSVJRX01BU0sJCT0gMHgxNCwgLyogaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIG1hc2sgKi8KKwlQT1JUX0NNRAkJPSAweDE4LCAvKiBwb3J0IGNvbW1hbmQgKi8KKwlQT1JUX1RGREFUQQkJPSAweDIwLAkvKiB0YXNrZmlsZSBkYXRhICovCisJUE9SVF9TSUcJCT0gMHgyNCwJLyogZGV2aWNlIFRGIHNpZ25hdHVyZSAqLworCVBPUlRfQ01EX0lTU1VFCQk9IDB4MzgsIC8qIGNvbW1hbmQgaXNzdWUgKi8KKwlQT1JUX1NDUgkJPSAweDI4LCAvKiBTQVRBIHBoeSByZWdpc3RlciBibG9jayAqLworCVBPUlRfU0NSX1NUQVQJCT0gMHgyOCwgLyogU0FUQSBwaHkgcmVnaXN0ZXI6IFNTdGF0dXMgKi8KKwlQT1JUX1NDUl9DVEwJCT0gMHgyYywgLyogU0FUQSBwaHkgcmVnaXN0ZXI6IFNDb250cm9sICovCisJUE9SVF9TQ1JfRVJSCQk9IDB4MzAsIC8qIFNBVEEgcGh5IHJlZ2lzdGVyOiBTRXJyb3IgKi8KKwlQT1JUX1NDUl9BQ1QJCT0gMHgzNCwgLyogU0FUQSBwaHkgcmVnaXN0ZXI6IFNBY3RpdmUgKi8KKworCS8qIFBPUlRfSVJRX3tTVEFULE1BU0t9IGJpdHMgKi8KKwlQT1JUX0lSUV9DT0xEX1BSRVMJPSAoMSA8PCAzMSksIC8qIGNvbGQgcHJlc2VuY2UgZGV0ZWN0ICovCisJUE9SVF9JUlFfVEZfRVJSCQk9ICgxIDw8IDMwKSwgLyogdGFzayBmaWxlIGVycm9yICovCisJUE9SVF9JUlFfSEJVU19FUlIJPSAoMSA8PCAyOSksIC8qIGhvc3QgYnVzIGZhdGFsIGVycm9yICovCisJUE9SVF9JUlFfSEJVU19EQVRBX0VSUgk9ICgxIDw8IDI4KSwgLyogaG9zdCBidXMgZGF0YSBlcnJvciAqLworCVBPUlRfSVJRX0lGX0VSUgkJPSAoMSA8PCAyNyksIC8qIGludGVyZmFjZSBmYXRhbCBlcnJvciAqLworCVBPUlRfSVJRX0lGX05PTkZBVEFMCT0gKDEgPDwgMjYpLCAvKiBpbnRlcmZhY2Ugbm9uLWZhdGFsIGVycm9yICovCisJUE9SVF9JUlFfT1ZFUkZMT1cJPSAoMSA8PCAyNCksIC8qIHhmZXIgZXhoYXVzdGVkIGF2YWlsYWJsZSBTL0cgKi8KKwlQT1JUX0lSUV9CQURfUE1QCT0gKDEgPDwgMjMpLCAvKiBpbmNvcnJlY3QgcG9ydCBtdWx0aXBsaWVyICovCisKKwlQT1JUX0lSUV9QSFlSRFkJCT0gKDEgPDwgMjIpLCAvKiBQaHlSZHkgY2hhbmdlZCAqLworCVBPUlRfSVJRX0RFVl9JTENLCT0gKDEgPDwgNyksIC8qIGRldmljZSBpbnRlcmxvY2sgKi8KKwlQT1JUX0lSUV9DT05ORUNUCT0gKDEgPDwgNiksIC8qIHBvcnQgY29ubmVjdCBjaGFuZ2Ugc3RhdHVzICovCisJUE9SVF9JUlFfU0dfRE9ORQk9ICgxIDw8IDUpLCAvKiBkZXNjcmlwdG9yIHByb2Nlc3NlZCAqLworCVBPUlRfSVJRX1VOS19GSVMJPSAoMSA8PCA0KSwgLyogdW5rbm93biBGSVMgcngnZCAqLworCVBPUlRfSVJRX1NEQl9GSVMJPSAoMSA8PCAzKSwgLyogU2V0IERldmljZSBCaXRzIEZJUyByeCdkICovCisJUE9SVF9JUlFfRE1BU19GSVMJPSAoMSA8PCAyKSwgLyogRE1BIFNldHVwIEZJUyByeCdkICovCisJUE9SVF9JUlFfUElPU19GSVMJPSAoMSA8PCAxKSwgLyogUElPIFNldHVwIEZJUyByeCdkICovCisJUE9SVF9JUlFfRDJIX1JFR19GSVMJPSAoMSA8PCAwKSwgLyogRDJIIFJlZ2lzdGVyIEZJUyByeCdkICovCisKKwlQT1JUX0lSUV9GQVRBTAkJPSBQT1JUX0lSUV9URl9FUlIgfAorCQkJCSAgUE9SVF9JUlFfSEJVU19FUlIgfAorCQkJCSAgUE9SVF9JUlFfSEJVU19EQVRBX0VSUiB8CisJCQkJICBQT1JUX0lSUV9JRl9FUlIsCisJREVGX1BPUlRfSVJRCQk9IFBPUlRfSVJRX0ZBVEFMIHwgUE9SVF9JUlFfUEhZUkRZIHwKKwkJCQkgIFBPUlRfSVJRX0NPTk5FQ1QgfCBQT1JUX0lSUV9TR19ET05FIHwKKwkJCQkgIFBPUlRfSVJRX1VOS19GSVMgfCBQT1JUX0lSUV9TREJfRklTIHwKKwkJCQkgIFBPUlRfSVJRX0RNQVNfRklTIHwgUE9SVF9JUlFfUElPU19GSVMgfAorCQkJCSAgUE9SVF9JUlFfRDJIX1JFR19GSVMsCisKKwkvKiBQT1JUX0NNRCBiaXRzICovCisJUE9SVF9DTURfTElTVF9PTgk9ICgxIDw8IDE1KSwgLyogY21kIGxpc3QgRE1BIGVuZ2luZSBydW5uaW5nICovCisJUE9SVF9DTURfRklTX09OCQk9ICgxIDw8IDE0KSwgLyogRklTIERNQSBlbmdpbmUgcnVubmluZyAqLworCVBPUlRfQ01EX0ZJU19SWAkJPSAoMSA8PCA0KSwgLyogRW5hYmxlIEZJUyByZWNlaXZlIERNQSBlbmdpbmUgKi8KKwlQT1JUX0NNRF9QT1dFUl9PTgk9ICgxIDw8IDIpLCAvKiBQb3dlciB1cCBkZXZpY2UgKi8KKwlQT1JUX0NNRF9TUElOX1VQCT0gKDEgPDwgMSksIC8qIFNwaW4gdXAgZGV2aWNlICovCisJUE9SVF9DTURfU1RBUlQJCT0gKDEgPDwgMCksIC8qIEVuYWJsZSBwb3J0IERNQSBlbmdpbmUgKi8KKworCVBPUlRfQ01EX0lDQ19BQ1RJVkUJPSAoMHgxIDw8IDI4KSwgLyogUHV0IGkvZiBpbiBhY3RpdmUgc3RhdGUgKi8KKwlQT1JUX0NNRF9JQ0NfUEFSVElBTAk9ICgweDIgPDwgMjgpLCAvKiBQdXQgaS9mIGluIHBhcnRpYWwgc3RhdGUgKi8KKwlQT1JUX0NNRF9JQ0NfU0xVTUJFUgk9ICgweDYgPDwgMjgpLCAvKiBQdXQgaS9mIGluIHNsdW1iZXIgc3RhdGUgKi8KK307CisKK3N0cnVjdCBhaGNpX2NtZF9oZHIgeworCXUzMgkJCW9wdHM7CisJdTMyCQkJc3RhdHVzOworCXUzMgkJCXRibF9hZGRyOworCXUzMgkJCXRibF9hZGRyX2hpOworCXUzMgkJCXJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGFoY2lfc2cgeworCXUzMgkJCWFkZHI7CisJdTMyCQkJYWRkcl9oaTsKKwl1MzIJCQlyZXNlcnZlZDsKKwl1MzIJCQlmbGFnc19zaXplOworfTsKKworc3RydWN0IGFoY2lfaG9zdF9wcml2IHsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1MzIJCQljYXA7CS8qIGNhY2hlIG9mIEhPU1RfQ0FQIHJlZ2lzdGVyICovCisJdTMyCQkJcG9ydF9tYXA7IC8qIGNhY2hlIG9mIEhPU1RfUE9SVFNfSU1QTCByZWcgKi8KK307CisKK3N0cnVjdCBhaGNpX3BvcnRfcHJpdiB7CisJc3RydWN0IGFoY2lfY21kX2hkcgkqY21kX3Nsb3Q7CisJZG1hX2FkZHJfdAkJY21kX3Nsb3RfZG1hOworCXZvaWQJCQkqY21kX3RibDsKKwlkbWFfYWRkcl90CQljbWRfdGJsX2RtYTsKKwlzdHJ1Y3QgYWhjaV9zZwkJKmNtZF90Ymxfc2c7CisJdm9pZAkJCSpyeF9maXM7CisJZG1hX2FkZHJfdAkJcnhfZmlzX2RtYTsKK307CisKK3N0YXRpYyB1MzIgYWhjaV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZyk7CitzdGF0aWMgdm9pZCBhaGNpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IGFoY2lfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhaGNpX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBhaGNpX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIGFoY2lfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYWhjaV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgYWhjaV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYWhjaV9wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBhaGNpX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CitzdGF0aWMgdm9pZCBhaGNpX3RmX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOworc3RhdGljIHZvaWQgYWhjaV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHU4IGFoY2lfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHU4IGFoY2lfY2hlY2tfZXJyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGlubGluZSBpbnQgYWhjaV9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYWhjaV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBBSENJX01BWF9TRywKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBSENJX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBSENJX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKworCS5jaGVja19zdGF0dXMJCT0gYWhjaV9jaGVja19zdGF0dXMsCisJLmNoZWNrX2FsdHN0YXR1cwk9IGFoY2lfY2hlY2tfc3RhdHVzLAorCS5jaGVja19lcnIJCT0gYWhjaV9jaGVja19lcnIsCisJLmRldl9zZWxlY3QJCT0gYXRhX25vb3BfZGV2X3NlbGVjdCwKKworCS50Zl9yZWFkCQk9IGFoY2lfdGZfcmVhZCwKKworCS5waHlfcmVzZXQJCT0gYWhjaV9waHlfcmVzZXQsCisKKwkucWNfcHJlcAkJPSBhaGNpX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGFoY2lfcWNfaXNzdWUsCisKKwkuZW5nX3RpbWVvdXQJCT0gYWhjaV9lbmdfdGltZW91dCwKKworCS5pcnFfaGFuZGxlcgkJPSBhaGNpX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IGFoY2lfaXJxX2NsZWFyLAorCisJLnNjcl9yZWFkCQk9IGFoY2lfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBhaGNpX3Njcl93cml0ZSwKKworCS5wb3J0X3N0YXJ0CQk9IGFoY2lfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGFoY2lfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYWhjaV9ob3N0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gYWhjaV9wb3J0X2luZm9bXSA9IHsKKwkvKiBib2FyZF9haGNpICovCisJeworCQkuc2h0CQk9ICZhaGNpX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfCBBVEFfRkxBR19NTUlPIHwKKwkJCQkgIEFUQV9GTEFHX1BJT19ETUEsCisJCS5waW9fbWFzawk9IDB4MDMsIC8qIHBpbzMtNCAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFoY2lfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfYWhjaSB9LCAvKiBJQ0g2ICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI2NTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDZNICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI3YzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIElDSDcgKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjdjNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSUNIN00gKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjdjMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSUNIN1IgKi8KKwl7IFBDSV9WRU5ET1JfSURfQUwsIDB4NTI4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogVUxpIE01Mjg4ICovCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhaGNpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBhaGNpX3BjaV90YmwsCisJLnByb2JlCQkJPSBhaGNpX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFoY2lfcG9ydF9iYXNlX3VsICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBwb3J0KQoreworCXJldHVybiBiYXNlICsgMHgxMDAgKyAocG9ydCAqIDB4ODApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmFoY2lfcG9ydF9iYXNlICh2b2lkICpiYXNlLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gKHZvaWQgKikgYWhjaV9wb3J0X2Jhc2VfdWwoKHVuc2lnbmVkIGxvbmcpYmFzZSwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCWtmcmVlKGhwcml2KTsKK30KKworc3RhdGljIGludCBhaGNpX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcDsKKwlpbnQgcmM7CisJdm9pZCAqbWVtLCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwlkbWFfYWRkcl90IG1lbV9kbWE7CisKKwlyYyA9IGF0YV9wb3J0X3N0YXJ0KGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBwID0ga21hbGxvYyhzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJbWVtc2V0KHBwLCAwLCBzaXplb2YoKnBwKSk7CisKKwltZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBBSENJX1BPUlRfUFJJVl9ETUFfU1osICZtZW1fZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisJbWVtc2V0KG1lbSwgMCwgQUhDSV9QT1JUX1BSSVZfRE1BX1NaKTsKKworCS8qCisJICogRmlyc3QgaXRlbSBpbiBjaHVuayBvZiBETUEgbWVtb3J5OiAzMi1zbG90IGNvbW1hbmQgdGFibGUsCisJICogMzIgYnl0ZXMgZWFjaCBpbiBzaXplCisJICovCisJcHAtPmNtZF9zbG90ID0gbWVtOworCXBwLT5jbWRfc2xvdF9kbWEgPSBtZW1fZG1hOworCisJbWVtICs9IEFIQ0lfQ01EX1NMT1RfU1o7CisJbWVtX2RtYSArPSBBSENJX0NNRF9TTE9UX1NaOworCisJLyoKKwkgKiBTZWNvbmQgaXRlbTogUmVjZWl2ZWQtRklTIGFyZWEKKwkgKi8KKwlwcC0+cnhfZmlzID0gbWVtOworCXBwLT5yeF9maXNfZG1hID0gbWVtX2RtYTsKKworCW1lbSArPSBBSENJX1JYX0ZJU19TWjsKKwltZW1fZG1hICs9IEFIQ0lfUlhfRklTX1NaOworCisJLyoKKwkgKiBUaGlyZCBpdGVtOiBkYXRhIGFyZWEgZm9yIHN0b3JpbmcgYSBzaW5nbGUgY29tbWFuZAorCSAqIGFuZCBpdHMgc2NhdHRlci1nYXRoZXIgdGFibGUKKwkgKi8KKwlwcC0+Y21kX3RibCA9IG1lbTsKKwlwcC0+Y21kX3RibF9kbWEgPSBtZW1fZG1hOworCisJcHAtPmNtZF90Ymxfc2cgPSBtZW0gKyBBSENJX0NNRF9UQkxfSERSOworCisJYXAtPnByaXZhdGVfZGF0YSA9IHBwOworCisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF82NCkKKwkJd3JpdGVsKChwcC0+Y21kX3Nsb3RfZG1hID4+IDE2KSA+PiAxNiwgcG9ydF9tbWlvICsgUE9SVF9MU1RfQUREUl9ISSk7CisJd3JpdGVsKHBwLT5jbWRfc2xvdF9kbWEgJiAweGZmZmZmZmZmLCBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsKKwlyZWFkbChwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSKTsgLyogZmx1c2ggKi8KKworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQpCisJCXdyaXRlbCgocHAtPnJ4X2Zpc19kbWEgPj4gMTYpID4+IDE2LCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSX0hJKTsKKwl3cml0ZWwocHAtPnJ4X2Zpc19kbWEgJiAweGZmZmZmZmZmLCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsKKwlyZWFkbChwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSKTsgLyogZmx1c2ggKi8KKworCXdyaXRlbChQT1JUX0NNRF9JQ0NfQUNUSVZFIHwgUE9SVF9DTURfRklTX1JYIHwKKwkgICAgICAgUE9SVF9DTURfUE9XRVJfT04gfCBQT1JUX0NNRF9TUElOX1VQIHwKKwkgICAgICAgUE9SVF9DTURfU1RBUlQsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwlyZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7IC8qIGZsdXNoICovCisKKwlyZXR1cm4gMDsKKworZXJyX291dF9rZnJlZToKKwlrZnJlZShwcCk7CitlcnJfb3V0OgorCWF0YV9wb3J0X3N0b3AoYXApOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBhaGNpX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJdTMyIHRtcDsKKworCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwl0bXAgJj0gfihQT1JUX0NNRF9TVEFSVCB8IFBPUlRfQ01EX0ZJU19SWCk7CisJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsgLyogZmx1c2ggKi8KKworCS8qIHNwZWMgc2F5cyA1MDAgbXNlY3MgZm9yIGVhY2ggUE9SVF9DTURfe1NUQVJULEZJU19SWH0gYml0LCBzbworCSAqIHRoaXMgaXMgc2xpZ2h0bHkgaW5jb3JyZWN0LgorCSAqLworCW1zbGVlcCg1MDApOworCisJYXAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBBSENJX1BPUlRfUFJJVl9ETUFfU1osCisJCQkgIHBwLT5jbWRfc2xvdCwgcHAtPmNtZF9zbG90X2RtYSk7CisJa2ZyZWUocHApOworCWF0YV9wb3J0X3N0b3AoYXApOworfQorCitzdGF0aWMgdTMyIGFoY2lfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4pCit7CisJdW5zaWduZWQgaW50IHNjX3JlZzsKKworCXN3aXRjaCAoc2NfcmVnX2luKSB7CisJY2FzZSBTQ1JfU1RBVFVTOglzY19yZWcgPSAwOyBicmVhazsKKwljYXNlIFNDUl9DT05UUk9MOglzY19yZWcgPSAxOyBicmVhazsKKwljYXNlIFNDUl9FUlJPUjoJCXNjX3JlZyA9IDI7IGJyZWFrOworCWNhc2UgU0NSX0FDVElWRToJc2NfcmVnID0gMzsgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCX0KKworCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCBhaGNpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwKKwkJCSAgICAgICB1MzIgdmFsKQoreworCXVuc2lnbmVkIGludCBzY19yZWc7CisKKwlzd2l0Y2ggKHNjX3JlZ19pbikgeworCWNhc2UgU0NSX1NUQVRVUzoJc2NfcmVnID0gMDsgYnJlYWs7CisJY2FzZSBTQ1JfQ09OVFJPTDoJc2NfcmVnID0gMTsgYnJlYWs7CisJY2FzZSBTQ1JfRVJST1I6CQlzY19yZWcgPSAyOyBicmVhazsKKwljYXNlIFNDUl9BQ1RJVkU6CXNjX3JlZyA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwl3cml0ZWwodmFsLCAodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworc3RhdGljIHZvaWQgYWhjaV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVswXTsKKwl1MzIgdG1wOworCisJX19zYXRhX3BoeV9yZXNldChhcCk7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TSUcpOworCXRmLmxiYWgJCT0gKHRtcCA+PiAyNCkJJiAweGZmOworCXRmLmxiYW0JCT0gKHRtcCA+PiAxNikJJiAweGZmOworCXRmLmxiYWwJCT0gKHRtcCA+PiA4KQkmIDB4ZmY7CisJdGYubnNlY3QJPSAodG1wKQkJJiAweGZmOworCisJZGV2LT5jbGFzcyA9IGF0YV9kZXZfY2xhc3NpZnkoJnRmKTsKKwlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQorCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKK30KKworc3RhdGljIHU4IGFoY2lfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCAqbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHI7CisKKwlyZXR1cm4gcmVhZGwobW1pbyArIFBPUlRfVEZEQVRBKSAmIDB4RkY7Cit9CisKK3N0YXRpYyB1OCBhaGNpX2NoZWNrX2VycihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgKm1taW8gPSAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyOworCisJcmV0dXJuIChyZWFkbChtbWlvICsgUE9SVF9URkRBVEEpID4+IDgpICYgMHhGRjsKK30KKworc3RhdGljIHZvaWQgYWhjaV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXU4ICpkMmhfZmlzID0gcHAtPnJ4X2ZpcyArIFJYX0ZJU19EMkhfUkVHOworCisJYXRhX3RmX2Zyb21fZmlzKGQyaF9maXMsIHRmKTsKK30KKworc3RhdGljIHZvaWQgYWhjaV9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJLyoKKwkgKiBOZXh0LCB0aGUgUy9HIGxpc3QuCisJICovCisJZm9yIChpID0gMDsgaSA8IHFjLT5uX2VsZW07IGkrKykgeworCQl1MzIgc2dfbGVuOworCQlkbWFfYWRkcl90IGFkZHI7CisKKwkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZxYy0+c2dbaV0pOworCQlzZ19sZW4gPSBzZ19kbWFfbGVuKCZxYy0+c2dbaV0pOworCisJCXBwLT5jbWRfdGJsX3NnW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyICYgMHhmZmZmZmZmZik7CisJCXBwLT5jbWRfdGJsX3NnW2ldLmFkZHJfaGkgPSBjcHVfdG9fbGUzMigoYWRkciA+PiAxNikgPj4gMTYpOworCQlwcC0+Y21kX3RibF9zZ1tpXS5mbGFnc19zaXplID0gY3B1X3RvX2xlMzIoc2dfbGVuIC0gMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhaGNpX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gcWMtPmFwLT5wcml2YXRlX2RhdGE7CisJdTMyIG9wdHM7CisJY29uc3QgdTMyIGNtZF9maXNfbGVuID0gNTsgLyogZml2ZSBkd29yZHMgKi8KKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHNsb3QgaW5mb3JtYXRpb24gKGN1cnJlbnRseSBvbmx5IG9uZSBzbG90LAorCSAqIHNsb3QgMCwgaXMgY3VycmVudGx5IHNpbmNlIHdlIGRvbid0IGRvIHF1ZXVlaW5nKQorCSAqLworCisJb3B0cyA9IChxYy0+bl9lbGVtIDw8IDE2KSB8IGNtZF9maXNfbGVuOworCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpCisJCW9wdHMgfD0gQUhDSV9DTURfV1JJVEU7CisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCWNhc2UgQVRBX1BST1RfQVRBUEk6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9OT0RBVEE6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCW9wdHMgfD0gQUhDSV9DTURfQVRBUEk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwlwcC0+Y21kX3Nsb3RbMF0ub3B0cyA9IGNwdV90b19sZTMyKG9wdHMpOworCXBwLT5jbWRfc2xvdFswXS5zdGF0dXMgPSAwOworCXBwLT5jbWRfc2xvdFswXS50YmxfYWRkciA9IGNwdV90b19sZTMyKHBwLT5jbWRfdGJsX2RtYSAmIDB4ZmZmZmZmZmYpOworCXBwLT5jbWRfc2xvdFswXS50YmxfYWRkcl9oaSA9IGNwdV90b19sZTMyKChwcC0+Y21kX3RibF9kbWEgPj4gMTYpID4+IDE2KTsKKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHRhYmxlIGluZm9ybWF0aW9uLiAgRmlyc3QsIHRoZSBoZWFkZXIsCisJICogYSBTQVRBIFJlZ2lzdGVyIC0gSG9zdCB0byBEZXZpY2UgY29tbWFuZCBGSVMuCisJICovCisJYXRhX3RmX3RvX2ZpcygmcWMtPnRmLCBwcC0+Y21kX3RibCwgMCk7CisKKwlpZiAoIShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkpCisJCXJldHVybjsKKworCWFoY2lfZmlsbF9zZyhxYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaW50cl9lcnJvcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgaXJxX3N0YXQpCit7CisJdm9pZCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl1MzIgdG1wOworCWludCB3b3JrOworCisJLyogc3RvcCBETUEgKi8KKwl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7CisJdG1wICY9IH5QT1JUX0NNRF9TVEFSVDsKKwl3cml0ZWwodG1wLCBwb3J0X21taW8gKyBQT1JUX0NNRCk7CisKKwkvKiB3YWl0IGZvciBlbmdpbmUgdG8gc3RvcC4gIFRPRE86IHRoaXMgY291bGQgYmUKKwkgKiBhcyBsb25nIGFzIDUwMCBtc2VjCisJICovCisJd29yayA9IDEwMDA7CisJd2hpbGUgKHdvcmstLSA+IDApIHsKKwkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlpZiAoKHRtcCAmIFBPUlRfQ01EX0xJU1RfT04pID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBjbGVhciBTQVRBIHBoeSBlcnJvciwgaWYgYW55ICovCisJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwl3cml0ZWwodG1wLCBwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpOworCisJLyogaWYgRFJRL0JTWSBpcyBzZXQsIGRldmljZSBuZWVkcyB0byBiZSByZXNldC4KKwkgKiBpZiBzbywgaXNzdWUgQ09NUkVTRVQKKwkgKi8KKwl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1RGREFUQSk7CisJaWYgKHRtcCAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSB7CisJCXdyaXRlbCgweDMwMSwgcG9ydF9tbWlvICsgUE9SVF9TQ1JfQ1RMKTsKKwkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfQ1RMKTsgLyogZmx1c2ggKi8KKwkJdWRlbGF5KDEwKTsKKwkJd3JpdGVsKDB4MzAwLCBwb3J0X21taW8gKyBQT1JUX1NDUl9DVEwpOworCQlyZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9DVEwpOyAvKiBmbHVzaCAqLworCX0KKworCS8qIHJlLXN0YXJ0IERNQSAqLworCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwl0bXAgfD0gUE9SVF9DTURfU1RBUlQ7CisJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsgLyogZmx1c2ggKi8KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBlcnJvciBvY2N1cnJlZCwgcG9ydCByZXNldFxuIiwgYXAtPmlkKTsKK30KKworc3RhdGljIHZvaWQgYWhjaV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCWFoY2lfaW50cl9lcnJvcihhcCwgcmVhZGwocG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCkpOworCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlpZiAoIXFjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IEJVRzogdGltZW91dCB3aXRob3V0IGNvbW1hbmRcbiIsCisJCSAgICAgICBhcC0+aWQpOworCX0gZWxzZSB7CisJCS8qIGhhY2sgYWxlcnQhICBXZSBjYW5ub3QgdXNlIHRoZSBzdXBwbGllZCBjb21wbGV0aW9uCisJIAkgKiBmdW5jdGlvbiBmcm9tIGluc2lkZSB0aGUgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgdGhyZWFkLgorCSAJICogbGliYXRhIGlzIHRoZSBvbmx5IHVzZXIgb2YgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgaW4KKwkgCSAqIGFueSBrZXJuZWwsIHNvIHRoZSBkZWZhdWx0IHNjc2lfZG9uZSgpIGFzc3VtZXMgaXQgaXMKKwkgCSAqIG5vdCBiZWluZyBjYWxsZWQgZnJvbSB0aGUgU0NTSSBFSC4KKwkgCSAqLworCQlxYy0+c2NzaWRvbmUgPSBzY3NpX2ZpbmlzaF9jb21tYW5kOworCQlhdGFfcWNfY29tcGxldGUocWMsIEFUQV9FUlIpOworCX0KKworfQorCitzdGF0aWMgaW5saW5lIGludCBhaGNpX2hvc3RfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7CisJdTMyIHN0YXR1cywgc2VyciwgY2k7CisKKwlzZXJyID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwl3cml0ZWwoc2VyciwgcG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKworCXN0YXR1cyA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOworCXdyaXRlbChzdGF0dXMsIHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOworCisJY2kgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSk7CisJaWYgKGxpa2VseSgoY2kgJiAweDEpID09IDApKSB7CisJCWlmIChxYykgeworCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCAwKTsKKwkJCXFjID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgJiBQT1JUX0lSUV9GQVRBTCkgeworCQlhaGNpX2ludHJfZXJyb3IoYXAsIHN0YXR1cyk7CisJCWlmIChxYykKKwkJCWF0YV9xY19jb21wbGV0ZShxYywgQVRBX0VSUik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJLyogVE9ETyAqLworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWhjaV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwl1bnNpZ25lZCBpbnQgaSwgaGFuZGxlZCA9IDA7CisJdm9pZCAqbW1pbzsKKwl1MzIgaXJxX3N0YXQsIGlycV9hY2sgPSAwOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCW1taW8gPSBob3N0X3NldC0+bW1pb19iYXNlOworCisJLyogc2lnaC4gIDB4ZmZmZmZmZmYgaXMgYSB2YWxpZCByZXR1cm4gZnJvbSBoL3cgKi8KKwlpcnFfc3RhdCA9IHJlYWRsKG1taW8gKyBIT1NUX0lSUV9TVEFUKTsKKwlpcnFfc3RhdCAmPSBocHJpdi0+cG9ydF9tYXA7CisJaWYgKCFpcnFfc3RhdCkKKwkJcmV0dXJuIElSUV9OT05FOworCisgICAgICAgIHNwaW5fbG9jaygmaG9zdF9zZXQtPmxvY2spOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCXUzMiB0bXA7CisKKwkJVlBSSU5USygicG9ydCAldVxuIiwgaSk7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCQl0bXAgPSBpcnFfc3RhdCAmICgxIDw8IGkpOworCQlpZiAodG1wICYmIGFwKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCWlmIChhaGNpX2hvc3RfaW50cihhcCwgcWMpKQorCQkJCWlycV9hY2sgfD0gKDEgPDwgaSk7CisJCX0KKwl9CisKKwlpZiAoaXJxX2FjaykgeworCQl3cml0ZWwoaXJxX2FjaywgbW1pbyArIEhPU1RfSVJRX1NUQVQpOworCQloYW5kbGVkID0gMTsKKwl9CisKKyAgICAgICAgc3Bpbl91bmxvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCVZQUklOVEsoIkVYSVRcbiIpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdm9pZCAqcG9ydF9tbWlvID0gKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKKworCXdyaXRlbCgxLCBwb3J0X21taW8gKyBQT1JUX1NDUl9BQ1QpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfU0NSX0FDVCk7CS8qIGZsdXNoICovCisKKwl3cml0ZWwoMSwgcG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOworCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EX0lTU1VFKTsJLyogZmx1c2ggKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaGNpX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICAgdW5zaWduZWQgaW50IHBvcnRfaWR4KQoreworCVZQUklOVEsoIkVOVEVSLCBiYXNlPT0weCVseCwgcG9ydF9pZHggJXVcbiIsIGJhc2UsIHBvcnRfaWR4KTsKKwliYXNlID0gYWhjaV9wb3J0X2Jhc2VfdWwoYmFzZSwgcG9ydF9pZHgpOworCVZQUklOVEsoImJhc2Ugbm93PT0weCVseFxuIiwgYmFzZSk7CisKKwlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlOworCXBvcnQtPnNjcl9hZGRyCQk9IGJhc2UgKyBQT1JUX1NDUjsKKworCVZQUklOVEsoIkVYSVRcbiIpOworfQorCitzdGF0aWMgaW50IGFoY2lfaG9zdF9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gcHJvYmVfZW50LT5tbWlvX2Jhc2U7CisJdTMyIHRtcCwgY2FwX3NhdmU7CisJdTE2IHRtcDE2OworCXVuc2lnbmVkIGludCBpLCBqLCB1c2luZ19kYWM7CisJaW50IHJjOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvOworCisJY2FwX3NhdmUgPSByZWFkbChtbWlvICsgSE9TVF9DQVApOworCWNhcF9zYXZlICY9ICggKDE8PDI4KSB8ICgxPDwxNykgKTsKKwljYXBfc2F2ZSB8PSAoMSA8PCAyNyk7CisKKwkvKiBnbG9iYWwgY29udHJvbGxlciByZXNldCAqLworCXRtcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CisJaWYgKCh0bXAgJiBIT1NUX1JFU0VUKSA9PSAwKSB7CisJCXdyaXRlbCh0bXAgfCBIT1NUX1JFU0VULCBtbWlvICsgSE9TVF9DVEwpOworCQlyZWFkbChtbWlvICsgSE9TVF9DVEwpOyAvKiBmbHVzaCAqLworCX0KKworCS8qIHJlc2V0IG11c3QgY29tcGxldGUgd2l0aGluIDEgc2Vjb25kLCBvcgorCSAqIHRoZSBoYXJkd2FyZSBzaG91bGQgYmUgY29uc2lkZXJlZCBmcmllZC4KKwkgKi8KKwlzc2xlZXAoMSk7CisKKwl0bXAgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCWlmICh0bXAgJiBIT1NUX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogY29udHJvbGxlciByZXNldCBmYWlsZWQgKDB4JXgpXG4iLAorCQkJcGNpX25hbWUocGRldiksIHRtcCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXdyaXRlbChIT1NUX0FIQ0lfRU4sIG1taW8gKyBIT1NUX0NUTCk7CisJKHZvaWQpIHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CS8qIGZsdXNoICovCisJd3JpdGVsKGNhcF9zYXZlLCBtbWlvICsgSE9TVF9DQVApOworCXdyaXRlbCgweGYsIG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOworCSh2b2lkKSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsJLyogZmx1c2ggKi8KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4OTIsICZ0bXAxNik7CisJdG1wMTYgfD0gMHhmOworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCAweDkyLCB0bXAxNik7CisKKwlocHJpdi0+Y2FwID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQKTsKKwlocHJpdi0+cG9ydF9tYXAgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSAoaHByaXYtPmNhcCAmIDB4MWYpICsgMTsKKworCVZQUklOVEsoImNhcCAweCV4ICBwb3J0X21hcCAweCV4ICBuX3BvcnRzICVkXG4iLAorCQlocHJpdi0+Y2FwLCBocHJpdi0+cG9ydF9tYXAsIHByb2JlX2VudC0+bl9wb3J0cyk7CisKKwl1c2luZ19kYWMgPSBocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQ7CisJaWYgKHVzaW5nX2RhYyAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spOworCQlpZiAocmMpIHsKKwkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogNjQtYml0IERNQSBlbmFibGUgZmFpbGVkXG4iLAorCQkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisKKwkJaHByaXYtPmZsYWdzIHw9IEhPU1RfQ0FQXzY0OworCX0gZWxzZSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiAzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IDMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iLAorCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykgeworI2lmIDAgLyogQklPU2VuIGluaXRpYWxpemUgdGhpcyBpbmNvcnJlY3RseSAqLworCQlpZiAoIShocHJpdi0+cG9ydF9tYXAgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKyNlbmRpZgorCisJCXBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGkpOworCQlWUFJJTlRLKCJtbWlvICVwICBwb3J0X21taW8gJXBcbiIsIG1taW8sIHBvcnRfbW1pbyk7CisKKwkJYWhjaV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbaV0sCisJCQkJKHVuc2lnbmVkIGxvbmcpIG1taW8sIGkpOworCisJCS8qIG1ha2Ugc3VyZSBwb3J0IGlzIG5vdCBhY3RpdmUgKi8KKwkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlWUFJJTlRLKCJQT1JUX0NNRCAweCV4XG4iLCB0bXApOworCQlpZiAodG1wICYgKFBPUlRfQ01EX0xJU1RfT04gfCBQT1JUX0NNRF9GSVNfT04gfAorCQkJICAgUE9SVF9DTURfRklTX1JYIHwgUE9SVF9DTURfU1RBUlQpKSB7CisJCQl0bXAgJj0gfihQT1JUX0NNRF9MSVNUX09OIHwgUE9SVF9DTURfRklTX09OIHwKKwkJCQkgUE9SVF9DTURfRklTX1JYIHwgUE9SVF9DTURfU1RBUlQpOworCQkJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOyAvKiBmbHVzaCAqLworCisJCQkvKiBzcGVjIHNheXMgNTAwIG1zZWNzIGZvciBlYWNoIGJpdCwgc28KKwkJCSAqIHRoaXMgaXMgc2xpZ2h0bHkgaW5jb3JyZWN0LgorCQkJICovCisJCQltc2xlZXAoNTAwKTsKKwkJfQorCisJCXdyaXRlbChQT1JUX0NNRF9TUElOX1VQLCBwb3J0X21taW8gKyBQT1JUX0NNRCk7CisKKwkJaiA9IDA7CisJCXdoaWxlIChqIDwgMTAwKSB7CisJCQltc2xlZXAoMTApOworCQkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfU1RBVCk7CisJCQlpZiAoKHRtcCAmIDB4ZikgPT0gMHgzKQorCQkJCWJyZWFrOworCQkJaisrOworCQl9CisKKwkJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwkJVlBSSU5USygiUE9SVF9TQ1JfRVJSIDB4JXhcbiIsIHRtcCk7CisJCXdyaXRlbCh0bXAsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7CisKKwkJLyogYWNrIGFueSBwZW5kaW5nIGlycSBldmVudHMgZm9yIHRoaXMgcG9ydCAqLworCQl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0lSUV9TVEFUKTsKKwkJVlBSSU5USygiUE9SVF9JUlFfU1RBVCAweCV4XG4iLCB0bXApOworCQlpZiAodG1wKQorCQkJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CisKKwkJd3JpdGVsKDEgPDwgaSwgbW1pbyArIEhPU1RfSVJRX1NUQVQpOworCisJCS8qIHNldCBpcnEgbWFzayAoZW5hYmxlcyBpbnRlcnJ1cHRzKSAqLworCQl3cml0ZWwoREVGX1BPUlRfSVJRLCBwb3J0X21taW8gKyBQT1JUX0lSUV9NQVNLKTsKKwl9CisKKwl0bXAgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCVZQUklOVEsoIkhPU1RfQ1RMIDB4JXhcbiIsIHRtcCk7CisJd3JpdGVsKHRtcCB8IEhPU1RfSVJRX0VOLCBtbWlvICsgSE9TVF9DVEwpOworCXRtcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CisJVlBSSU5USygiSE9TVF9DVEwgMHgleFxuIiwgdG1wKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KK30KKworc3RhdGljIHZvaWQgYWhjaV9wcmludF9pbmZvKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7CisJdm9pZCAqbW1pbyA9IHByb2JlX2VudC0+bW1pb19iYXNlOworCXUzMiB2ZXJzLCBjYXAsIGltcGwsIHNwZWVkOworCWNvbnN0IGNoYXIgKnNwZWVkX3M7CisJdTE2IGNjOworCWNvbnN0IGNoYXIgKnNjY19zOworCisJdmVycyA9IHJlYWRsKG1taW8gKyBIT1NUX1ZFUlNJT04pOworCWNhcCA9IGhwcml2LT5jYXA7CisJaW1wbCA9IGhwcml2LT5wb3J0X21hcDsKKworCXNwZWVkID0gKGNhcCA+PiAyMCkgJiAweGY7CisJaWYgKHNwZWVkID09IDEpCisJCXNwZWVkX3MgPSAiMS41IjsKKwllbHNlIGlmIChzcGVlZCA9PSAyKQorCQlzcGVlZF9zID0gIjMiOworCWVsc2UKKwkJc3BlZWRfcyA9ICI/IjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4MGEsICZjYyk7CisJaWYgKGNjID09IDB4MDEwMSkKKwkJc2NjX3MgPSAiSURFIjsKKwllbHNlIGlmIChjYyA9PSAweDAxMDYpCisJCXNjY19zID0gIlNBVEEiOworCWVsc2UgaWYgKGNjID09IDB4MDEwNCkKKwkJc2NjX3MgPSAiUkFJRCI7CisJZWxzZQorCQlzY2NfcyA9ICJ1bmtub3duIjsKKworCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIiglcykgQUhDSSAlMDJ4JTAyeC4lMDJ4JTAyeCAiCisJCSIldSBzbG90cyAldSBwb3J0cyAlcyBHYnBzIDB4JXggaW1wbCAlcyBtb2RlXG4iCisJICAgICAgIAksCisJICAgICAgIAlwY2lfbmFtZShwZGV2KSwKKworCSAgICAgICAJKHZlcnMgPj4gMjQpICYgMHhmZiwKKwkgICAgICAgCSh2ZXJzID4+IDE2KSAmIDB4ZmYsCisJICAgICAgIAkodmVycyA+PiA4KSAmIDB4ZmYsCisJICAgICAgIAl2ZXJzICYgMHhmZiwKKworCQkoKGNhcCA+PiA4KSAmIDB4MWYpICsgMSwKKwkJKGNhcCAmIDB4MWYpICsgMSwKKwkJc3BlZWRfcywKKwkJaW1wbCwKKwkJc2NjX3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiKCVzKSBmbGFnczogIgorCSAgICAgICAJIiVzJXMlcyVzJXMlcyIKKwkgICAgICAgCSIlcyVzJXMlcyVzJXMlc1xuIgorCSAgICAgICAJLAorCSAgICAgICAJcGNpX25hbWUocGRldiksCisKKwkJY2FwICYgKDEgPDwgMzEpID8gIjY0Yml0ICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMzApID8gIm5jcSAiIDogIiIsCisJCWNhcCAmICgxIDw8IDI4KSA/ICJpbGNrICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMjcpID8gInN0YWcgIiA6ICIiLAorCQljYXAgJiAoMSA8PCAyNikgPyAicG0gIiA6ICIiLAorCQljYXAgJiAoMSA8PCAyNSkgPyAibGVkICIgOiAiIiwKKworCQljYXAgJiAoMSA8PCAyNCkgPyAiY2xvICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTkpID8gIm56ICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTgpID8gIm9ubHkgIiA6ICIiLAorCQljYXAgJiAoMSA8PCAxNykgPyAicG1wICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTUpID8gInBpbyAiIDogIiIsCisJCWNhcCAmICgxIDw8IDE0KSA/ICJzbHVtICIgOiAiIiwKKwkJY2FwICYgKDEgPDwgMTMpID8gInBhcnQgIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdm9pZCAqbW1pb19iYXNlOworCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBwY2lfZGV2X2J1c3kgPSAwOworCWludCByYzsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwY2lfZW5hYmxlX2ludHgocGRldik7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgQUhDSV9QQ0lfQkFSKSwKKwkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBBSENJX1BDSV9CQVIpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJaHByaXYgPSBrbWFsbG9jKHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCW1lbXNldChocHJpdiwgMCwgc2l6ZW9mKCpocHJpdikpOworCisJcHJvYmVfZW50LT5zaHQJCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS5zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS5ob3N0X2ZsYWdzOworCXByb2JlX2VudC0+cGlvX21hc2sJPSBhaGNpX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS51ZG1hX21hc2s7CisJcHJvYmVfZW50LT5wb3J0X29wcwk9IGFoY2lfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7CisKKyAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisJcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCXJjID0gYWhjaV9ob3N0X2luaXQocHJvYmVfZW50KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9ocHJpdjsKKworCWFoY2lfcHJpbnRfaW5mbyhwcm9iZV9lbnQpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2hwcml2OgorCWtmcmVlKGhwcml2KTsKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKG1taW9fYmFzZSk7CitlcnJfb3V0X2ZyZWVfZW50OgorCWtmcmVlKHByb2JlX2VudCk7CitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYWhjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYWhjaV9wY2lfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWhjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhaGNpX3BjaV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFIQ0kgU0FUQSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWhjaV9wY2lfdGJsKTsKKworbW9kdWxlX2luaXQoYWhjaV9pbml0KTsKK21vZHVsZV9leGl0KGFoY2lfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzc5eHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MjNhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljNzl4eApAQCAtMCwwICsxLDk3IEBACisjCisjIEFJQzc5WFggMi41LlggS2VybmVsIGNvbmZpZ3VyYXRpb24gRmlsZS4KKyMgJElkOiAvL2RlcG90L2xpbnV4LWFpYzc5eHgtMi41LjAvZHJpdmVycy9zY3NpL2FpYzd4eHgvS2NvbmZpZy5haWM3OXh4IzQgJAorIworY29uZmlnIFNDU0lfQUlDNzlYWAorCXRyaXN0YXRlICJBZGFwdGVjIEFJQzc5eHggVTMyMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwloZWxwCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgYWxsIG9mIEFkYXB0ZWMncyBVbHRyYSAzMjAgUENJLVgKKwliYXNlZCBTQ1NJIGNvbnRyb2xsZXJzLgorCitjb25maWcgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIFRDUSBjb21tYW5kcyBwZXIgZGV2aWNlIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3OVhYCisJZGVmYXVsdCAiMzIiCisJLS0taGVscC0tLQorCVNwZWNpZnkgdGhlIG51bWJlciBvZiBjb21tYW5kcyB5b3Ugd291bGQgbGlrZSB0byBhbGxvY2F0ZSBwZXIgU0NTSQorCWRldmljZSB3aGVuIFRhZ2dlZCBDb21tYW5kIFF1ZXVlaW5nIChUQ1EpIGlzIGVuYWJsZWQgb24gdGhhdCBkZXZpY2UuCisKKwlUaGlzIGlzIGFuIHVwcGVyIGJvdW5kIHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMKKwl0byBiZSB1c2VkIGZvciBhbnkgZGV2aWNlLiAgVGhlIGFpYzd4eHggZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseQorCXZhcnkgdGhpcyBudW1iZXIgYmFzZWQgb24gZGV2aWNlIGJlaGF2aW9yLiAgRm9yIGRldmljZXMgd2l0aCBhCisJZml4ZWQgbWF4aW11bSwgdGhlIGRyaXZlciB3aWxsIGV2ZW50dWFsbHkgbG9jayB0byB0aGlzIG1heGltdW0KKwlhbmQgZGlzcGxheSBhIGNvbnNvbGUgbWVzc2FnZSBpbmlkaWNhdGluZyB0aGlzIHZhbHVlLgorCisJRHVlIHRvIHJlc291cmNlIGFsbG9jYXRpb24gaXNzdWVzIGluIHRoZSBMaW51eCBTQ1NJIG1pZC1sYXllciwgdXNpbmcKKwlhIGhpZ2ggbnVtYmVyIG9mIGNvbW1hbmRzIHBlciBkZXZpY2UgbWF5IHJlc3VsdCBpbiBtZW1vcnkgYWxsb2NhdGlvbgorCWZhaWx1cmVzIHdoZW4gbWFueSBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLiAgRm9yIHRoaXMgcmVhc29uLAorCXRoZSBkZWZhdWx0IGlzIHNldCB0byAzMi4gIEhpZ2hlciB2YWx1ZXMgbWF5IHJlc3VsdCBpbiBoaWdlciBwZXJmb3JtYW5jZQorCW9uIHNvbWUgZGV2aWNlcy4gIFRoZSB1cHBlciBib3VuZCBpcyAyNTMuICAwIGRpc2FibGVzIHRhZ2dlZCBxdWV1ZWluZy4KKworCVBlciBkZXZpY2UgdGFnIGRlcHRoIGNhbiBiZSBjb250cm9sbGVkIHZpYSB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorCSJ0YWdfaW5mbyIgb3B0aW9uLiAgU2VlIGRyaXZlcnMvc2NzaS9haWM3eHh4L1JFQURNRS5haWM3OXh4CisJZm9yIGRldGFpbHMuCisKK2NvbmZpZyBBSUM3OVhYX1JFU0VUX0RFTEFZX01TCisJaW50ICJJbml0aWFsIGJ1cyByZXNldCBkZWxheSBpbiBtaWxsaS1zZWNvbmRzIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3OVhYCisJZGVmYXVsdCAiMTUwMDAiCisJLS0taGVscC0tLQorCVRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGFmdGVyIGFuIGluaXRpYWwgYnVzIHJlc2V0LgorCVRoZSBidXMgc2V0dGxlIGRlbGF5IGZvbGxvd2luZyBhbGwgZXJyb3IgcmVjb3ZlcnkgYWN0aW9ucyBpcworCWRpY3RhdGVkIGJ5IHRoZSBTQ1NJIGxheWVyIGFuZCBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyB2YWx1ZS4KKworCURlZmF1bHQ6IDE1MDAwICgxNSBzZWNvbmRzKQorCitjb25maWcgQUlDNzlYWF9CVUlMRF9GSVJNV0FSRQorCWJvb2wgIkJ1aWxkIEFkYXB0ZXIgRmlybXdhcmUgd2l0aCBLZXJuZWwgQnVpbGQiCisJZGVwZW5kcyBvbiBTQ1NJX0FJQzc5WFggJiYgIVBSRVZFTlRfRklSTVdBUkVfQlVJTEQKKwloZWxwCisJVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBpZiB5b3UgYXJlIG1vZGlmeWluZyB0aGUgZmlybXdhcmUKKwlzb3VyY2UgdG8gdGhlIGFpYzc5eHggZHJpdmVyIGFuZCB3aXNoIHRvIGhhdmUgdGhlIGdlbmVyYXRlZCBmaXJtd2FyZQorCWluY2x1ZGUgZmlsZXMgdXBkYXRlZCBkdXJpbmcgYSBub3JtYWwga2VybmVsIGJ1aWxkLiAgVGhlIGFzc2VtYmxlcgorCWZvciB0aGUgZmlybXdhcmUgcmVxdWlyZXMgbGV4IGFuZCB5YWNjIG9yIHRoZWlyIGVxdWl2YWxlbnRzLCBhcyB3ZWxsCisJYXMgdGhlIGRiIHYxIGxpYnJhcnkuICBZb3UgbWF5IGhhdmUgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzCisJb3IgbW9kaWZ5IHRoZSBhc3NlbWJsZXIgTWFrZWZpbGUgb3IgdGhlIGZpbGVzIGl0IGluY2x1ZGVzIGlmIHlvdXIKKwlidWlsZCBlbnZpcm9ubWVudCBpcyBkaWZmZXJlbnQgdGhhbiB0aGF0IG9mIHRoZSBhdXRob3IuCisKK2NvbmZpZyBBSUM3OVhYX0VOQUJMRV9SRF9TVFJNCisJYm9vbCAiRW5hYmxlIFJlYWQgU3RyZWFtaW5nIGZvciBBbGwgVGFyZ2V0cyIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDNzlYWAorCWRlZmF1bHQgbgorCWhlbHAKKwlSZWFkIFN0cmVhbWluZyBpcyBhIFUzMjAgcHJvdG9jb2wgb3B0aW9uIHRoYXQgc2hvdWxkIGVuaGFuY2UKKwlwZXJmb3JtYW5jZS4gIEVhcmx5IFUzMjAgZHJpdmUgZmlybXdhcmUgYWN0dWFsbHkgcGVyZm9ybXMgc2xvd2VyCisJd2l0aCByZWFkIHN0cmVhbWluZyBlbmFibGVkIHNvIGl0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBSZWFkCisJU3RyZWFtaW5nIGNhbiBiZSBjb25maWd1cmVkIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRhZ2dlZCBxdWV1ZWluZworCXVzaW5nIHRoZSAicmRfc3RybSIgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFNlZQorCWRyaXZlcnMvc2NzaS9haWM3eHh4L1JFQURNRS5haWM3OXh4IGZvciBkZXRhaWxzLgorCitjb25maWcgQUlDNzlYWF9ERUJVR19FTkFCTEUKKwlib29sICJDb21waWxlIGluIERlYnVnZ2luZyBDb2RlIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3OVhYCisJZGVmYXVsdCB5CisJaGVscAorCUNvbXBpbGUgaW4gYWljNzl4eCBkZWJ1Z2dpbmcgY29kZSB0aGF0IGNhbiBiZSB1c2VmdWwgaW4gZGlhZ25vc2luZworCWRyaXZlciBlcnJvcnMuCisKK2NvbmZpZyBBSUM3OVhYX0RFQlVHX01BU0sKKwlpbnQgIkRlYnVnIGNvZGUgZW5hYmxlIG1hc2sgKDE2MzgzIGZvciBhbGwgZGVidWdnaW5nKSIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDNzlYWAorCWRlZmF1bHQgIjAiCisJaGVscAorCUJpdCBtYXNrIG9mIGRlYnVnIG9wdGlvbnMgdGhhdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQorCUNPTkZJR19BSUM3OVhYX0RFQlVHX0VOQkxFIG9wdGlvbiBpcyBlbmFibGVkLiAgVGhlIGJpdHMgaW4gdGhpcyBtYXNrCisJYXJlIGRlZmluZWQgaW4gdGhlIGRyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaCAtIHNlYXJjaCBmb3IgdGhlCisJdmFyaWFibGUgYWhkX2RlYnVnIGluIHRoYXQgZmlsZSB0byBmaW5kIHRoZW0uCisKK2NvbmZpZyBBSUM3OVhYX1JFR19QUkVUVFlfUFJJTlQKKwlib29sICJEZWNvZGUgcmVnaXN0ZXJzIGR1cmluZyBkaWFnbm9zdGljcyIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDNzlYWAorCWRlZmF1bHQgeQorCWhlbHAKKwlDb21waWxlIGluIHJlZ2lzdGVyIHZhbHVlIHRhYmxlcyBmb3IgdGhlIG91dHB1dCBvZiBleHBhbmRlZCByZWdpc3RlcgorCWNvbnRlbnRzIGluIGRpYWdub3N0aWNzLiAgVGhpcyBtYWtlIGl0IG11Y2ggZWFzaWVyIHRvIHVuZGVyc3RhbmQgZGVidWcKKwlvdXRwdXQgd2l0aG91dCBoYXZpbmcgdG8gcmVmZXIgdG8gYSBkYXRhIGJvb2sgYW5kL29yIHRoZSBhaWM3eHh4LnJlZworCWZpbGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9LY29uZmlnLmFpYzd4eHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5OGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eApAQCAtMCwwICsxLDEwMCBAQAorIworIyBBSUM3WFhYIGFuZCBBSUM3OVhYIDIuNS5YIEtlcm5lbCBjb25maWd1cmF0aW9uIEZpbGUuCisjICRJZDogLy9kZXBvdC9saW51eC1haWM3OXh4LTIuNS4wL2RyaXZlcnMvc2NzaS9haWM3eHh4L0tjb25maWcuYWljN3h4eCM3ICQKKyMKK2NvbmZpZyBTQ1NJX0FJQzdYWFgKKwl0cmlzdGF0ZSAiQWRhcHRlYyBBSUM3eHh4IEZhc3QgLT4gVTE2MCBzdXBwb3J0IChOZXcgRHJpdmVyKSIKKwlkZXBlbmRzIG9uIChQQ0kgfHwgRUlTQSkgJiYgU0NTSQorCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBzdXBwb3J0cyBhbGwgb2YgQWRhcHRlYydzIEZhc3QgdGhyb3VnaCBVbHRyYSAxNjAgUENJCisJYmFzZWQgU0NTSSBjb250cm9sbGVycyBhcyB3ZWxsIGFzIHRoZSBhaWM3NzcwIGJhc2VkIEVJU0EgYW5kIFZMQgorCVNDU0kgY29udHJvbGxlcnMgKHRoZSAyNzR4IGFuZCAyODR4IHNlcmllcykuICBGb3IgQUFBIGFuZCBBUk8gYmFzZWQKKwljb25maWd1cmF0aW9ucywgb25seSBTQ1NJIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWljN3h4eC4KKworY29uZmlnIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiBUQ1EgY29tbWFuZHMgcGVyIGRldmljZSIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgIjMyIgorCS0tLWhlbHAtLS0KKwlTcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29tbWFuZHMgeW91IHdvdWxkIGxpa2UgdG8gYWxsb2NhdGUgcGVyIFNDU0kKKwlkZXZpY2Ugd2hlbiBUYWdnZWQgQ29tbWFuZCBRdWV1ZWluZyAoVENRKSBpcyBlbmFibGVkIG9uIHRoYXQgZGV2aWNlLgorCisJVGhpcyBpcyBhbiB1cHBlciBib3VuZCB2YWx1ZSBmb3IgdGhlIG51bWJlciBvZiB0YWdnZWQgdHJhbnNhY3Rpb25zCisJdG8gYmUgdXNlZCBmb3IgYW55IGRldmljZS4gIFRoZSBhaWM3eHh4IGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkKKwl2YXJ5IHRoaXMgbnVtYmVyIGJhc2VkIG9uIGRldmljZSBiZWhhdmlvci4gIEZvciBkZXZpY2VzIHdpdGggYQorCWZpeGVkIG1heGltdW0sIHRoZSBkcml2ZXIgd2lsbCBldmVudHVhbGx5IGxvY2sgdG8gdGhpcyBtYXhpbXVtCisJYW5kIGRpc3BsYXkgYSBjb25zb2xlIG1lc3NhZ2UgaW5pZGljYXRpbmcgdGhpcyB2YWx1ZS4KKworCUR1ZSB0byByZXNvdXJjZSBhbGxvY2F0aW9uIGlzc3VlcyBpbiB0aGUgTGludXggU0NTSSBtaWQtbGF5ZXIsIHVzaW5nCisJYSBoaWdoIG51bWJlciBvZiBjb21tYW5kcyBwZXIgZGV2aWNlIG1heSByZXN1bHQgaW4gbWVtb3J5IGFsbG9jYXRpb24KKwlmYWlsdXJlcyB3aGVuIG1hbnkgZGV2aWNlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbS4gIEZvciB0aGlzIHJlYXNvbiwKKwl0aGUgZGVmYXVsdCBpcyBzZXQgdG8gMzIuICBIaWdoZXIgdmFsdWVzIG1heSByZXN1bHQgaW4gaGlnZXIgcGVyZm9ybWFuY2UKKwlvbiBzb21lIGRldmljZXMuICBUaGUgdXBwZXIgYm91bmQgaXMgMjUzLiAgMCBkaXNhYmxlcyB0YWdnZWQgcXVldWVpbmcuCisKKwlQZXIgZGV2aWNlIHRhZyBkZXB0aCBjYW4gYmUgY29udHJvbGxlZCB2aWEgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKKwkidGFnX2luZm8iIG9wdGlvbi4gIFNlZSBkcml2ZXJzL3Njc2kvYWljN3h4eC9SRUFETUUuYWljN3h4eAorCWZvciBkZXRhaWxzLgorCitjb25maWcgQUlDN1hYWF9SRVNFVF9ERUxBWV9NUworCWludCAiSW5pdGlhbCBidXMgcmVzZXQgZGVsYXkgaW4gbWlsbGktc2Vjb25kcyIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgIjE1MDAwIgorCS0tLWhlbHAtLS0KKwlUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBhZnRlciBhbiBpbml0aWFsIGJ1cyByZXNldC4KKwlUaGUgYnVzIHNldHRsZSBkZWxheSBmb2xsb3dpbmcgYWxsIGVycm9yIHJlY292ZXJ5IGFjdGlvbnMgaXMKKwlkaWN0YXRlZCBieSB0aGUgU0NTSSBsYXllciBhbmQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgdmFsdWUuCisKKwlEZWZhdWx0OiAxNTAwMCAoMTUgc2Vjb25kcykKKworY29uZmlnIEFJQzdYWFhfUFJPQkVfRUlTQV9WTAorCWJvb2wgIlByb2JlIGZvciBFSVNBIGFuZCBWTCBBSUM3WFhYIEFkYXB0ZXJzIgorCWRlcGVuZHMgb24gU0NTSV9BSUM3WFhYICYmIEVJU0EKKwloZWxwCisJUHJvYmUgZm9yIEVJU0EgYW5kIFZMQiBBaWM3eHh4IGNvbnRyb2xsZXJzLiAgSW4gbWFueSBuZXdlciBzeXN0ZW1zLAorCXRoZSBpbnZhc2l2ZSBwcm9iZXMgbmVjZXNzYXJ5IHRvIGRldGVjdCB0aGVzZSBjb250cm9sbGVycyBjYW4gY2F1c2UKKwlvdGhlciBkZXZpY2VzIHRvIGZhaWwuICBGb3IgdGhpcyByZWFzb24sIHRoZSBub24tUENJIHByb2JlIGNvZGUgaXMKKwlkaXNhYmxlZCBieSBkZWZhdWx0LiAgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBvcHRpb24gY2FuIGJlICJ0b2dnbGVkIgorCXZpYSB0aGUgbm9fcHJvYmUga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24uCisKK2NvbmZpZyBBSUM3WFhYX0JVSUxEX0ZJUk1XQVJFCisJYm9vbCAiQnVpbGQgQWRhcHRlciBGaXJtd2FyZSB3aXRoIEtlcm5lbCBCdWlsZCIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWCAmJiAhUFJFVkVOVF9GSVJNV0FSRV9CVUlMRAorCWhlbHAKKwlUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBlbmFibGVkIGlmIHlvdSBhcmUgbW9kaWZ5aW5nIHRoZSBmaXJtd2FyZQorCXNvdXJjZSB0byB0aGUgYWljN3h4eCBkcml2ZXIgYW5kIHdpc2ggdG8gaGF2ZSB0aGUgZ2VuZXJhdGVkIGZpcm13YXJlCisJaW5jbHVkZSBmaWxlcyB1cGRhdGVkIGR1cmluZyBhIG5vcm1hbCBrZXJuZWwgYnVpbGQuICBUaGUgYXNzZW1ibGVyCisJZm9yIHRoZSBmaXJtd2FyZSByZXF1aXJlcyBsZXggYW5kIHlhY2Mgb3IgdGhlaXIgZXF1aXZhbGVudHMsIGFzIHdlbGwKKwlhcyB0aGUgZGIgdjEgbGlicmFyeS4gIFlvdSBtYXkgaGF2ZSB0byBpbnN0YWxsIGFkZGl0aW9uYWwgcGFja2FnZXMKKwlvciBtb2RpZnkgdGhlIGFzc2VtYmxlciBNYWtlZmlsZSBvciB0aGUgZmlsZXMgaXQgaW5jbHVkZXMgaWYgeW91cgorCWJ1aWxkIGVudmlyb25tZW50IGlzIGRpZmZlcmVudCB0aGFuIHRoYXQgb2YgdGhlIGF1dGhvci4KKworY29uZmlnIEFJQzdYWFhfREVCVUdfRU5BQkxFCisJYm9vbCAiQ29tcGlsZSBpbiBEZWJ1Z2dpbmcgQ29kZSIKKwlkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgeQorCWhlbHAKKwlDb21waWxlIGluIGFpYzd4eHggZGVidWdnaW5nIGNvZGUgdGhhdCBjYW4gYmUgdXNlZnVsIGluIGRpYWdub3NpbmcKKwlkcml2ZXIgZXJyb3JzLgorCitjb25maWcgQUlDN1hYWF9ERUJVR19NQVNLCisgICAgICAgIGludCAiRGVidWcgY29kZSBlbmFibGUgbWFzayAoMjA0NyBmb3IgYWxsIGRlYnVnZ2luZykiCisgICAgICAgIGRlcGVuZHMgb24gU0NTSV9BSUM3WFhYCisgICAgICAgIGRlZmF1bHQgIjAiCisgICAgICAgIGhlbHAKKwlCaXQgbWFzayBvZiBkZWJ1ZyBvcHRpb25zIHRoYXQgaXMgb25seSB2YWxpZCBpZiB0aGUKKwlDT05GSUdfQUlDN1hYWF9ERUJVR19FTkJMRSBvcHRpb24gaXMgZW5hYmxlZC4gIFRoZSBiaXRzIGluIHRoaXMgbWFzaworCWFyZSBkZWZpbmVkIGluIHRoZSBkcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmggLSBzZWFyY2ggZm9yIHRoZQorCXZhcmlhYmxlIGFoY19kZWJ1ZyBpbiB0aGF0IGZpbGUgdG8gZmluZCB0aGVtLgorCitjb25maWcgQUlDN1hYWF9SRUdfUFJFVFRZX1BSSU5UCisgICAgICAgIGJvb2wgIkRlY29kZSByZWdpc3RlcnMgZHVyaW5nIGRpYWdub3N0aWNzIgorICAgICAgICBkZXBlbmRzIG9uIFNDU0lfQUlDN1hYWAorCWRlZmF1bHQgeQorICAgICAgICBoZWxwCisJQ29tcGlsZSBpbiByZWdpc3RlciB2YWx1ZSB0YWJsZXMgZm9yIHRoZSBvdXRwdXQgb2YgZXhwYW5kZWQgcmVnaXN0ZXIKKwljb250ZW50cyBpbiBkaWFnbm9zdGljcy4gIFRoaXMgbWFrZSBpdCBtdWNoIGVhc2llciB0byB1bmRlcnN0YW5kIGRlYnVnCisJb3V0cHV0IHdpdGhvdXQgaGF2aW5nIHRvIHJlZmVyIHRvIGEgZGF0YSBib29rIGFuZC9vciB0aGUgYWljN3h4eC5yZWcKKwlmaWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZjZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvTWFrZWZpbGUKQEAgLTAsMCArMSw5OSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IGFpYzd4eHggU0NTSSBkcml2ZXIuCisjCisjICRJZDogLy9kZXBvdC9saW51eC1haWM3OXh4LTIuNS4wL2RyaXZlcnMvc2NzaS9haWM3eHh4L01ha2VmaWxlIzggJAorIworCisjIExldCBrYnVpbGQgZGVzY2VuZCBpbnRvIGFpY2FzbSB3aGVuIGNsZWFuaW5nCitzdWJkaXItCQkJCSs9IGFpY2FzbQorCitvYmotJChDT05GSUdfU0NTSV9BSUM3WFhYKQkrPSBhaWM3eHh4Lm8KK29iai0kKENPTkZJR19TQ1NJX0FJQzc5WFgpCSs9IGFpYzc5eHgubworCisjIENvcmUgRmFzdCAtPiBVMTYwIGZpbGVzCithaWM3eHh4LXkJCQkJCSs9IGFpYzd4eHhfY29yZS5vCVwKKwkJCQkJCSAgIGFpYzd4eHhfOTNjeDYubworYWljN3h4eC0kKENPTkZJR19FSVNBKQkJCQkrPSBhaWM3NzcwLm8KK2FpYzd4eHgtJChDT05GSUdfUENJKQkJCQkrPSBhaWM3eHh4X3BjaS5vCithaWM3eHh4LSQoQ09ORklHX0FJQzdYWFhfUkVHX1BSRVRUWV9QUklOVCkJKz0gYWljN3h4eF9yZWdfcHJpbnQubworCisjIFBsYXRmb3JtIFNwZWNpZmljIEZhc3QgLT4gVTE2MCBGaWxlcworYWljN3h4eC15CQkJCQkrPSBhaWM3eHh4X29zbS5vCVwKKwkJCQkJCSAgIGFpYzd4eHhfcHJvYy5vCithaWM3eHh4LSQoQ09ORklHX0VJU0EpCQkJCSs9IGFpYzc3NzBfb3NtLm8KK2FpYzd4eHgtJChDT05GSUdfUENJKQkJCQkrPSBhaWM3eHh4X29zbV9wY2kubworCisjIENvcmUgVTMyMCBmaWxlcworYWljNzl4eC15CQkJCQkrPSBhaWM3OXh4X2NvcmUubwlcCisJCQkJCQkgICBhaWM3OXh4X3BjaS5vCithaWM3OXh4LSQoQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVCkJKz0gYWljNzl4eF9yZWdfcHJpbnQubworCisjIFBsYXRmb3JtIFNwZWNpZmljIFUzMjAgRmlsZXMKK2FpYzc5eHgteQkJCQkJKz0gYWljNzl4eF9vc20ubwlcCisJCQkJCQkgICBhaWM3OXh4X3Byb2MubwlcCisJCQkJCQkgICBhaWM3OXh4X29zbV9wY2kubworCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL3Njc2kKK2lmZGVmIFdBUk5JTkdTX0JFQ09NRV9FUlJPUlMKK0VYVFJBX0NGTEFHUyArPSAtV2Vycm9yCitlbmRpZgorI0VYVFJBX0NGTEFHUyArPSAtZworCisjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCitjbGVhbi1maWxlcyA6PSBhaWM3eHh4X3NlcS5oIGFpYzd4eHhfcmVnLmggYWljN3h4eF9yZWdfcHJpbnQuYworY2xlYW4tZmlsZXMgKz0gYWljNzl4eF9zZXEuaCBhaWM3OXh4X3JlZy5oIGFpYzc5eHhfcmVnX3ByaW50LmMKKworIyBEZXBlbmRlbmNpZXMgZm9yIGdlbmVyYXRlZCBmaWxlcyBuZWVkIHRvIGJlIGxpc3RlZCBleHBsaWNpdGx5CisKKyQob2JqKS9haWM3eHh4X2NvcmUubzogJChvYmopL2FpYzd4eHhfc2VxLmgKKyQob2JqKS9haWM3OXh4X2NvcmUubzogJChvYmopL2FpYzc5eHhfc2VxLmgKKyQob2JqKS9haWM3OXh4X3JlZ19wcmludC5jOiAkKHNyYykvYWljNzl4eF9yZWdfcHJpbnQuY19zaGlwcGVkCiskKG9iaikvYWljN3h4eF9yZWdfcHJpbnQuYzogJChzcmMpL2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZAorCiskKGFkZHByZWZpeCAkKG9iaikvLCQoYWljN3h4eC15KSk6ICQob2JqKS9haWM3eHh4X3JlZy5oCiskKGFkZHByZWZpeCAkKG9iaikvLCQoYWljNzl4eC15KSk6ICQob2JqKS9haWM3OXh4X3JlZy5oCisKK2FpYzd4eHgtZ2VuLSQoQ09ORklHX0FJQzdYWFhfQlVJTERfRklSTVdBUkUpCTo9ICQob2JqKS9haWM3eHh4X3NlcS5oIFwKKwkJCQkJCSAgICQob2JqKS9haWM3eHh4X3JlZy5oCithaWM3eHh4LWdlbi0kKENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQpCSs9ICQob2JqKS9haWM3eHh4X3JlZ19wcmludC5jCisKK2FpY2FzbS03eHh4LW9wdHMtJChDT05GSUdfQUlDN1hYWF9SRUdfUFJFVFRZX1BSSU5UKSA6PSBcCisJLXAgJChvYmopL2FpYzd4eHhfcmVnX3ByaW50LmMgLWkgYWljN3h4eF9vc20uaAorCitpZmVxICgkKENPTkZJR19BSUM3WFhYX0JVSUxEX0ZJUk1XQVJFKSx5KQorIyBDcmVhdGUgYSBkZXBlbmRlbmN5IGNoYWluIGluIGdlbmVyYXRlZCBmaWxlcworIyB0byBhdm9pZCBjb25jdXJyZW50IGludm9jYXRpb25zIG9mIHRoZSBzaW5nbGUKKyMgcnVsZSB0aGF0IGJ1aWxkcyB0aGVtIGFsbC4KK2FpYzd4eHhfc2VxLmg6IGFpYzd4eHhfcmVnLmgKK2lmZXEgKCQoQ09ORklHX0FJQzdYWFhfUkVHX1BSRVRUWV9QUklOVCkseSkKK2FpYzd4eHhfcmVnLmg6IGFpYzd4eHhfcmVnX3ByaW50LmMKK2VuZGlmCiskKGFpYzd4eHgtZ2VuLXkpOiAkKHNyYykvYWljN3h4eC5zZXEgJChzcmMpL2FpYzd4eHgucmVnICQob2JqKS9haWNhc20vYWljYXNtCisJJChvYmopL2FpY2FzbS9haWNhc20gLUkkKHNyYykgLXIgJChvYmopL2FpYzd4eHhfcmVnLmggXAorCQkJICAgICAgJChhaWNhc20tN3h4eC1vcHRzLXkpIC1vICQob2JqKS9haWM3eHh4X3NlcS5oIFwKKwkJCSAgICAgICQoc3JjKS9haWM3eHh4LnNlcQorZW5kaWYKKworYWljNzl4eC1nZW4tJChDT05GSUdfQUlDNzlYWF9CVUlMRF9GSVJNV0FSRSkJOj0gJChvYmopL2FpYzc5eHhfc2VxLmggXAorCQkJCQkJICAgJChvYmopL2FpYzc5eHhfcmVnLmgKK2FpYzc5eHgtZ2VuLSQoQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVCkJKz0gJChvYmopL2FpYzc5eHhfcmVnX3ByaW50LmMKKworYWljYXNtLTc5eHgtb3B0cy0kKENPTkZJR19BSUM3OVhYX1JFR19QUkVUVFlfUFJJTlQpIDo9IFwKKwktcCAkKG9iaikvYWljNzl4eF9yZWdfcHJpbnQuYyAtaSBhaWM3OXh4X29zbS5oCisKK2lmZXEgKCQoQ09ORklHX0FJQzc5WFhfQlVJTERfRklSTVdBUkUpLHkpCisjIENyZWF0ZSBhIGRlcGVuZGVuY3kgY2hhaW4gaW4gZ2VuZXJhdGVkIGZpbGVzCisjIHRvIGF2b2lkIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlIHNpbmdsZQorIyBydWxlIHRoYXQgYnVpbGRzIHRoZW0gYWxsLgorYWljNzl4eF9zZXEuaDogYWljNzl4eF9yZWcuaAoraWZlcSAoJChDT05GSUdfQUlDNzlYWF9SRUdfUFJFVFRZX1BSSU5UKSx5KQorYWljNzl4eF9yZWcuaDogYWljNzl4eF9yZWdfcHJpbnQuYworZW5kaWYKKyQoYWljNzl4eC1nZW4teSk6ICQoc3JjKS9haWM3OXh4LnNlcSAkKHNyYykvYWljNzl4eC5yZWcgJChvYmopL2FpY2FzbS9haWNhc20KKwkkKG9iaikvYWljYXNtL2FpY2FzbSAtSSQoc3JjKSAtciAkKG9iaikvYWljNzl4eF9yZWcuaCBcCisJCQkgICAgICAkKGFpY2FzbS03OXh4LW9wdHMteSkgLW8gJChvYmopL2FpYzc5eHhfc2VxLmggXAorCQkJICAgICAgJChzcmMpL2FpYzc5eHguc2VxCitlbmRpZgorCiskKG9iaikvYWljYXNtL2FpY2FzbTogJChzcmMpL2FpY2FzbS8qLltjaHlsXQorCSQoTUFLRSkgLUMgJChzcmMpL2FpY2FzbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzAzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBQcm9kdWN0IHNwZWNpZmljIHByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yOgorICogCTI3LzI4NFggYW5kIGFpYzc3NzAgbW90aGVyYm9hcmQgU0NTSSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4LCAyMDAwLCAyMDAxIEp1c3RpbiBULiBHaWJicy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc3NzAuYyMzMiAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljN3h4eF9pbmxpbmUuaCIKKyNpbmNsdWRlICJhaWM3eHh4XzkzY3g2LmgiCisjZWxzZQorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfb3NtLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3eHh4XzkzY3g2Lmg+CisjZW5kaWYKKworI2RlZmluZSBJRF9BSUM3NzcwCTB4MDQ5MDc3NzAKKyNkZWZpbmUgSURfQUhBXzI3NHgJMHgwNDkwNzc3MQorI2RlZmluZSBJRF9BSEFfMjg0eEIJMHgwNDkwNzc1NiAvKiBCSU9TIGVuYWJsZWQgKi8KKyNkZWZpbmUgSURfQUhBXzI4NHgJMHgwNDkwNzc1NyAvKiBCSU9TIGRpc2FibGVkKi8KKyNkZWZpbmUJSURfT0xWXzI3NHgJMHgwNDkwNzc4MiAvKiBPbGl2ZXR0aSBPRU0gKi8KKyNkZWZpbmUJSURfT0xWXzI3NHhECTB4MDQ5MDc3ODMgLyogT2xpdmV0dGkgT0VNIChEaWZmZXJlbnRpYWwpICovCisKK3N0YXRpYyBpbnQgYWljNzc3MF9jaGlwX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQgYWljNzc3MF9zdXNwZW5kKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50IGFpYzc3NzBfcmVzdW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50IGFoYTI4NDBfbG9hZF9zZWVwcm9tKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3NzcwX1ZMX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzc3MF9FSVNBX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzc3MF9zZXR1cDsKKworc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgYWljNzc3MF9pZGVudF90YWJsZVtdID0KK3sKKwl7CisJCUlEX0FIQV8yNzR4LAorCQkweEZGRkZGRkZGLAorCQkiQWRhcHRlYyAyNzRYIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3NzcwX0VJU0Ffc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI4NHhCLAorCQkweEZGRkZGRkZFLAorCQkiQWRhcHRlYyAyODRYIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3NzcwX1ZMX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yODR4LAorCQkweEZGRkZGRkZFLAorCQkiQWRhcHRlYyAyODRYIFNDU0kgYWRhcHRlciAoQklPUyBEaXNhYmxlZCkiLAorCQlhaGNfYWljNzc3MF9WTF9zZXR1cAorCX0sCisJeworCQlJRF9PTFZfMjc0eCwKKwkJMHhGRkZGRkZGRiwKKwkJIkFkYXB0ZWMgKE9saXZldHRpIE9FTSkgMjc0WCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzc3MF9FSVNBX3NldHVwCisJfSwKKwl7CisJCUlEX09MVl8yNzR4RCwKKwkJMHhGRkZGRkZGRiwKKwkJIkFkYXB0ZWMgKE9saXZldHRpIE9FTSkgMjc0WCBEaWZmZXJlbnRpYWwgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc3NzBfRUlTQV9zZXR1cAorCX0sCisJLyogR2VuZXJpYyBjaGlwIHByb2JlcyBmb3IgZGV2aWNlcyB3ZSBkb24ndCBrbm93ICdleGFjdGx5JyAqLworCXsKKwkJSURfQUlDNzc3MCwKKwkJMHhGRkZGRkZGRiwKKwkJIkFkYXB0ZWMgYWljNzc3MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzc3MF9FSVNBX3NldHVwCisJfQorfTsKK2NvbnN0IGludCBhaGNfbnVtX2FpYzc3NzBfZGV2cyA9IE5VTV9FTEVNRU5UUyhhaWM3NzcwX2lkZW50X3RhYmxlKTsKKworc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKgorYWljNzc3MF9maW5kX2RldmljZSh1aW50MzJfdCBpZCkKK3sKKwlzdHJ1Y3QJYWljNzc3MF9pZGVudGl0eSAqZW50cnk7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWhjX251bV9haWM3NzcwX2RldnM7IGkrKykgeworCQllbnRyeSA9ICZhaWM3NzcwX2lkZW50X3RhYmxlW2ldOworCQlpZiAoZW50cnktPmZ1bGxfaWQgPT0gKGlkICYgZW50cnktPmlkX21hc2spKQorCQkJcmV0dXJuIChlbnRyeSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK2ludAorYWljNzc3MF9jb25maWcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSAqZW50cnksIHVfaW50IGlvKQoreworCXVfbG9uZwlsOworCWludAllcnJvcjsKKwlpbnQJaGF2ZV9zZWVwcm9tOworCXVfaW50CWhvc3Rjb25mOworCXVfaW50ICAgaXJxOworCXVfaW50CWludGRlZjsKKworCWVycm9yID0gZW50cnktPnNldHVwKGFoYyk7CisJaGF2ZV9zZWVwcm9tID0gMDsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwllcnJvciA9IGFpYzc3NzBfbWFwX3JlZ2lzdGVycyhhaGMsIGlvKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSBjb250aW51ZSBwcm9iaW5nIHRoZSBjYXJkLCBlbnN1cmUgdGhhdAorCSAqIGl0cyBpbnRlcnJ1cHRzIGFyZSAqZGlzYWJsZWQqLiAgV2UgZG9uJ3Qgd2FudAorCSAqIGEgbWlzc3RlcCB0byBoYW5nIHRoZSBtYWNoaW5lIGluIGFuIGludGVycnVwdAorCSAqIHN0b3JtLgorCSAqLworCWFoY19pbnRyX2VuYWJsZShhaGMsIEZBTFNFKTsKKworCWFoYy0+ZGVzY3JpcHRpb24gPSBlbnRyeS0+bmFtZTsKKwllcnJvciA9IGFoY19zb2Z0Y19pbml0KGFoYyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJYWhjLT5idXNfY2hpcF9pbml0ID0gYWljNzc3MF9jaGlwX2luaXQ7CisJYWhjLT5idXNfc3VzcGVuZCA9IGFpYzc3NzBfc3VzcGVuZDsKKwlhaGMtPmJ1c19yZXN1bWUgPSBhaWM3NzcwX3Jlc3VtZTsKKworCWVycm9yID0gYWhjX3Jlc2V0KGFoYywgLypyZWluaXQqL0ZBTFNFKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGludGVycnVwdCB2ZWN0b3IgKi8KKwlpbnRkZWYgPSBhaGNfaW5iKGFoYywgSU5UREVGKTsKKwlpcnEgPSBpbnRkZWYgJiBWRUNUT1I7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDk6CisJY2FzZSAxMDoKKwljYXNlIDExOgorCWNhc2UgMTI6CisJY2FzZSAxNDoKKwljYXNlIDE1OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoImFpYzc3NzBfY29uZmlnOiBpbnZhbGlkIGlycSBzZXR0aW5nICVkXG4iLCBpbnRkZWYpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwlpZiAoKGludGRlZiAmIEVER0VfVFJJRykgIT0gMCkKKwkJYWhjLT5mbGFncyB8PSBBSENfRURHRV9JTlRFUlJVUFQ7CisKKwlzd2l0Y2ggKGFoYy0+Y2hpcCAmIChBSENfRUlTQXxBSENfVkwpKSB7CisJY2FzZSBBSENfRUlTQToKKwl7CisJCXVfaW50IGJpb3NjdHJsOworCQl1X2ludCBzY3NpY29uZjsKKwkJdV9pbnQgc2NzaWNvbmYxOworCisJCWJpb3NjdHJsID0gYWhjX2luYihhaGMsIEhBXzI3NF9CSU9TQ1RSTCk7CisJCXNjc2ljb25mID0gYWhjX2luYihhaGMsIFNDU0lDT05GKTsKKwkJc2NzaWNvbmYxID0gYWhjX2luYihhaGMsIFNDU0lDT05GICsgMSk7CisKKwkJLyogR2V0IHRoZSBwcmltYXJ5IGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KKwkJaWYgKChiaW9zY3RybCAmIENIQU5ORUxfQl9QUklNQVJZKSAhPSAwKQorCQkJYWhjLT5mbGFncyB8PSAxOworCisJCWlmICgoYmlvc2N0cmwgJiBCSU9TTU9ERSkgPT0gQklPU0RJU0FCTEVEKSB7CisJCQlhaGMtPmZsYWdzIHw9IEFIQ19VU0VERUZBVUxUUzsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJCQkJYWhjLT5vdXJfaWQgPSBzY3NpY29uZjEgJiBIV1NDU0lJRDsKKwkJCQlpZiAoc2NzaWNvbmYgJiBURVJNX0VOQikKKwkJCQkJYWhjLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfQTsKKwkJCX0gZWxzZSB7CisJCQkJYWhjLT5vdXJfaWQgPSBzY3NpY29uZiAmIEhTQ1NJSUQ7CisJCQkJYWhjLT5vdXJfaWRfYiA9IHNjc2ljb25mMSAmIEhTQ1NJSUQ7CisJCQkJaWYgKHNjc2ljb25mICYgVEVSTV9FTkIpCisJCQkJCWFoYy0+ZmxhZ3MgfD0gQUhDX1RFUk1fRU5CX0E7CisJCQkJaWYgKHNjc2ljb25mMSAmIFRFUk1fRU5CKQorCQkJCQlhaGMtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9COworCQkJfQorCQl9CisJCWlmICgoYWhjX2luYihhaGMsIEhBXzI3NF9CSU9TR0xPQkFMKSAmIEhBXzI3NF9FWFRFTkRFRF9UUkFOUykpCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19FWFRFTkRFRF9UUkFOU19BfEFIQ19FWFRFTkRFRF9UUkFOU19COworCQlicmVhazsKKwl9CisJY2FzZSBBSENfVkw6CisJeworCQloYXZlX3NlZXByb20gPSBhaGEyODQwX2xvYWRfc2VlcHJvbShhaGMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChoYXZlX3NlZXByb20gPT0gMCkgeworCQlmcmVlKGFoYy0+c2VlcF9jb25maWcsIE1fREVWQlVGKTsKKwkJYWhjLT5zZWVwX2NvbmZpZyA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBFbnN1cmUgYXV0b2ZsdXNoIGlzIGVuYWJsZWQKKwkgKi8KKwlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIH5BVVRPRkxVU0hESVMpOworCisJLyogU2V0dXAgdGhlIEZJRk8gdGhyZXNob2xkIGFuZCB0aGUgYnVzIG9mZiB0aW1lICovCisJaG9zdGNvbmYgPSBhaGNfaW5iKGFoYywgSE9TVENPTkYpOworCWFoY19vdXRiKGFoYywgQlVTU1BELCBob3N0Y29uZiAmIERGVEhSU0gpOworCWFoY19vdXRiKGFoYywgQlVTVElNRSwgKGhvc3Rjb25mIDw8IDIpICYgQk9GRik7CisKKwlhaGMtPmJ1c19zb2Z0Yy5haWM3NzcwX3NvZnRjLmJ1c3NwZCA9IGhvc3Rjb25mICYgREZUSFJTSDsKKwlhaGMtPmJ1c19zb2Z0Yy5haWM3NzcwX3NvZnRjLmJ1c3RpbWUgPSAoaG9zdGNvbmYgPDwgMikgJiBCT0ZGOworCisJLyoKKwkgKiBHZW5lcmljIGFpYzd4eHggaW5pdGlhbGl6YXRpb24uCisJICovCisJZXJyb3IgPSBhaGNfaW5pdChhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKworCWVycm9yID0gYWljNzc3MF9tYXBfaW50KGFoYywgaXJxKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhaGNfbGlzdF9sb2NrKCZsKTsKKwkvKgorCSAqIExpbmsgdGhpcyBzb2Z0YyBpbiB3aXRoIGFsbCBvdGhlciBhaGMgaW5zdGFuY2VzLgorCSAqLworCWFoY19zb2Z0Y19pbnNlcnQoYWhjKTsKKworCS8qCisJICogRW5hYmxlIHRoZSBib2FyZCdzIEJVUyBkcml2ZXJzCisJICovCisJYWhjX291dGIoYWhjLCBCQ1RMLCBFTkFCTEUpOworCisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FpYzc3NzBfY2hpcF9pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfb3V0YihhaGMsIEJVU1NQRCwgYWhjLT5idXNfc29mdGMuYWljNzc3MF9zb2Z0Yy5idXNzcGQpOworCWFoY19vdXRiKGFoYywgQlVTVElNRSwgYWhjLT5idXNfc29mdGMuYWljNzc3MF9zb2Z0Yy5idXN0aW1lKTsKKwlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIH5BVVRPRkxVU0hESVMpOworCWFoY19vdXRiKGFoYywgQkNUTCwgRU5BQkxFKTsKKwlyZXR1cm4gKGFoY19jaGlwX2luaXQoYWhjKSk7Cit9CisKK3N0YXRpYyBpbnQKK2FpYzc3NzBfc3VzcGVuZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuIChhaGNfc3VzcGVuZChhaGMpKTsKK30KKworc3RhdGljIGludAorYWljNzc3MF9yZXN1bWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoYWhjX3Jlc3VtZShhaGMpKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIDI4NHggU0VFUFJPTS4KKyAqLworc3RhdGljIGludAorYWhhMjg0MF9sb2FkX3NlZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdAlzZWVwcm9tX2Rlc2NyaXB0b3Igc2Q7CisJc3RydWN0CXNlZXByb21fY29uZmlnICpzYzsKKwlpbnQJaGF2ZV9zZWVwcm9tOworCXVpbnQ4X3Qgc2NzaV9jb25mOworCisJc2Quc2RfYWhjID0gYWhjOworCXNkLnNkX2NvbnRyb2xfb2Zmc2V0ID0gU0VFQ1RMXzI4NDA7CisJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNUQVRVU18yODQwOworCXNkLnNkX2RhdGFvdXRfb2Zmc2V0ID0gU1RBVFVTXzI4NDA7CQkKKwlzZC5zZF9jaGlwID0gQzQ2OworCXNkLnNkX01TID0gMDsKKwlzZC5zZF9SRFkgPSBFRVBST01fVEY7CisJc2Quc2RfQ1MgPSBDU18yODQwOworCXNkLnNkX0NLID0gQ0tfMjg0MDsKKwlzZC5zZF9ETyA9IERPXzI4NDA7CisJc2Quc2RfREkgPSBESV8yODQwOworCXNjID0gYWhjLT5zZWVwX2NvbmZpZzsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhjX25hbWUoYWhjKSk7CisJaGF2ZV9zZWVwcm9tID0gYWhjX3JlYWRfc2VlcHJvbSgmc2QsICh1aW50MTZfdCAqKXNjLAorCQkJCQkvKnN0YXJ0X2FkZHIqLzAsIHNpemVvZigqc2MpLzIpOworCisJaWYgKGhhdmVfc2VlcHJvbSkgeworCisJCWlmIChhaGNfdmVyaWZ5X2Nrc3VtKHNjKSA9PSAwKSB7CisJCQlpZihib290dmVyYm9zZSkKKwkJCQlwcmludGYgKCJjaGVja3N1bSBlcnJvclxuIik7CisJCQloYXZlX3NlZXByb20gPSAwOworCQl9IGVsc2UgaWYgKGJvb3R2ZXJib3NlKSB7CisJCQlwcmludGYoImRvbmUuXG4iKTsKKwkJfQorCX0KKworCWlmICghaGF2ZV9zZWVwcm9tKSB7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiJXM6IE5vIFNFRVBST00gYXZhaWxhYmxlXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJYWhjLT5mbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUHV0IHRoZSBkYXRhIHdlJ3ZlIGNvbGxlY3RlZCBkb3duIGludG8gU1JBTQorCQkgKiB3aGVyZSBhaGNfaW5pdCB3aWxsIGZpbmQgaXQuCisJCSAqLworCQlpbnQJIGk7CisJCWludAkgbWF4X3Rhcmc7CisJCXVpbnQxNl90IGRpc2NlbmFibGU7CisKKwkJbWF4X3RhcmcgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwID8gMTYgOiA4OworCQlkaXNjZW5hYmxlID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1heF90YXJnOyBpKyspeworCQkJdWludDhfdCB0YXJnZXRfc2V0dGluZ3M7CisKKwkJCXRhcmdldF9zZXR0aW5ncyA9IChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKSA8PCA0OworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNIKQorCQkJCXRhcmdldF9zZXR0aW5ncyB8PSBTT0ZTOworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRldJREVCKQorCQkJCXRhcmdldF9zZXR0aW5ncyB8PSBXSURFWEZFUjsKKwkJCWlmIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZESVNDKQorCQkJCWRpc2NlbmFibGUgfD0gKDB4MDEgPDwgaSk7CisJCQlhaGNfb3V0YihhaGMsIFRBUkdfU0NTSVJBVEUgKyBpLCB0YXJnZXRfc2V0dGluZ3MpOworCQl9CisJCWFoY19vdXRiKGFoYywgRElTQ19EU0IsIH4oZGlzY2VuYWJsZSAmIDB4ZmYpKTsKKwkJYWhjX291dGIoYWhjLCBESVNDX0RTQiArIDEsIH4oKGRpc2NlbmFibGUgPj4gOCkgJiAweGZmKSk7CisKKwkJYWhjLT5vdXJfaWQgPSBzYy0+YnJ0aW1lX2lkICYgQ0ZTQ1NJSUQ7CisKKwkJc2NzaV9jb25mID0gKGFoYy0+b3VyX2lkICYgMHg3KTsKKwkJaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNQQVJJVFkpCisJCQlzY3NpX2NvbmYgfD0gRU5TUENISzsKKwkJaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlJFU0VUQikKKwkJCXNjc2lfY29uZiB8PSBSRVNFVF9TQ1NJOworCisJCWlmIChzYy0+Ymlvc19jb250cm9sICYgQ0YyODRYRVhURU5EKQkJCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19FWFRFTkRFRF9UUkFOU19BOworCQkvKiBTZXQgU0NTSUNPTkYgaW5mbyAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lDT05GLCBzY3NpX2NvbmYpOworCisJCWlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0YyODRYU1RFUk0pCisJCQlhaGMtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9BOworCX0KKwlyZXR1cm4gKGhhdmVfc2VlcHJvbSk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haWM3NzcwX1ZMX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19haWM3NzcwX3NldHVwKGFoYyk7CisJYWhjLT5jaGlwIHw9IEFIQ19WTDsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc3NzBfRUlTQV9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzc3MF9zZXR1cChhaGMpOworCWFoYy0+Y2hpcCB8PSBBSENfRUlTQTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc3NzBfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoYW5uZWxfYiA9ICdCJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzc3MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc3NzBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVRzsKKwlhaGMtPmZsYWdzIHw9IEFIQ19QQUdFU0NCUzsKKwlhaGMtPmluc3RydWN0aW9uX3JhbV9zaXplID0gNDQ4OworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwX29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmI0N2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIExpbnV4IGRyaXZlciBhdHRhY2htZW50IGdsdWUgZm9yIGFpYzc3NzAgYmFzZWQgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYyMxNCAkCisgKi8KKworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorCisjZGVmaW5lIEVJU0FfTUZDVFJfQ0hBUjAoSUQpIChjaGFyKSgoKElEPj4yNikgJiAweDFGKSB8ICdAJykgIC8qIEJpdHMgMjYtMzAgKi8KKyNkZWZpbmUgRUlTQV9NRkNUUl9DSEFSMShJRCkgKGNoYXIpKCgoSUQ+PjIxKSAmIDB4MUYpIHwgJ0AnKSAgLyogQml0cyAyMS0yNSAqLworI2RlZmluZSBFSVNBX01GQ1RSX0NIQVIyKElEKSAoY2hhcikoKChJRD4+MTYpICYgMHgxRikgfCAnQCcpICAvKiBCaXRzIDE2LTIwICovCisjZGVmaW5lIEVJU0FfUFJPRFVDVF9JRChJRCkgIChzaG9ydCkoKElEPj40KSAgJiAweEZGRikgICAgICAgIC8qIEJpdHMgIDQtMTUgKi8KKyNkZWZpbmUgRUlTQV9SRVZJU0lPTl9JRChJRCkgKHVpbnQ4X3QpKElEICYgMHgwRikgICAgICAgICAgICAgLyogQml0cyAgMC0zICAqLworCitzdGF0aWMgaW50IGFpYzc3NzBfZWlzYV9kZXZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWljNzc3MF9laXNhX2Rldl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kcml2ZXIgYWljNzc3MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICA9ICJhaWM3eHh4IiwKKwkJLnByb2JlICA9IGFpYzc3NzBfZWlzYV9kZXZfcHJvYmUsCisJCS5yZW1vdmUgPSBhaWM3NzcwX2Vpc2FfZGV2X3JlbW92ZSwKKwl9Cit9OworCit0eXBlZGVmICBzdHJ1Y3QgZGV2aWNlICphaWM3NzcwX2Rldl90OworI2Vsc2UKKyNkZWZpbmUgTUlOU0xPVAkJCTEKKyNkZWZpbmUgTlVNU0xPVFMJCTE2CisjZGVmaW5lIElET0ZGU0VUCQkweDgwCisKK3R5cGVkZWYgdm9pZCAqYWljNzc3MF9kZXZfdDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGFpYzc3NzBfbGludXhfY29uZmlnKHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICplbnRyeSwKKwkJCQlhaWM3NzcwX2Rldl90IGRldiwgdV9pbnQgZWlzYUJhc2UpOworCitpbnQKK2FoY19saW51eF9laXNhX2luaXQodm9pZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc3RydWN0IGVpc2FfZGV2aWNlX2lkICplaWQ7CisJc3RydWN0IGFpYzc3NzBfaWRlbnRpdHkgKmlkOworCWludCBpOworCisJaWYgKGFpYzd4eHhfcHJvYmVfZWlzYV92bCA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogTGludXggcmVxdWlyZXMgdGhlIEVJU0EgSURzIHRvIGJlIHNwZWNpZmllZCBpbgorCSAqIHRoZSBFSVNBIElEIHN0cmluZyBmb3JtYXQuICBQZXJmb3JtIHRoZSBjb252ZXJzaW9uCisJICogYW5kIHNldHVwIGEgdGFibGUgd2l0aCBhIE5VTCB0ZXJtaW5hbCBlbnRyeS4KKwkgKi8KKwlhaWM3NzcwX2RyaXZlci5pZF90YWJsZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGVpc2FfZGV2aWNlX2lkKSAqCisJCQkJCSAoYWhjX251bV9haWM3NzcwX2RldnMgKyAxKSwKKwkJCQkJIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGFpYzc3NzBfZHJpdmVyLmlkX3RhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChlaWQgPSAoc3RydWN0IGVpc2FfZGV2aWNlX2lkICopYWljNzc3MF9kcml2ZXIuaWRfdGFibGUsCisJICAgICBpZCA9IGFpYzc3NzBfaWRlbnRfdGFibGUsIGkgPSAwOworCSAgICAgaSA8IGFoY19udW1fYWljNzc3MF9kZXZzOyBlaWQrKywgaWQrKywgaSsrKSB7CisKKwkJc3ByaW50ZihlaWQtPnNpZywgIiVjJWMlYyUwM1glMDFYIiwKKwkJCUVJU0FfTUZDVFJfQ0hBUjAoaWQtPmZ1bGxfaWQpLAorCQkJRUlTQV9NRkNUUl9DSEFSMShpZC0+ZnVsbF9pZCksCisJCQlFSVNBX01GQ1RSX0NIQVIyKGlkLT5mdWxsX2lkKSwKKwkJCUVJU0FfUFJPRFVDVF9JRChpZC0+ZnVsbF9pZCksCisJCQlFSVNBX1JFVklTSU9OX0lEKGlkLT5mdWxsX2lkKSk7CisJCWVpZC0+ZHJpdmVyX2RhdGEgPSBpOworCX0KKwllaWQtPnNpZ1swXSA9IDA7CisKKwlyZXR1cm4gZWlzYV9kcml2ZXJfcmVnaXN0ZXIoJmFpYzc3NzBfZHJpdmVyKTsKKyNlbHNlIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSAqLworCXN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICplbnRyeTsKKwl1X2ludCAgc2xvdDsKKwl1X2ludCAgZWlzYUJhc2U7CisJdV9pbnQgIGk7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAoYWljN3h4eF9wcm9iZV9laXNhX3ZsID09IDApCisJCXJldHVybiByZXQ7CisKKwllaXNhQmFzZSA9IDB4MTAwMCArIEFIQ19FSVNBX1NMT1RfT0ZGU0VUOworCWZvciAoc2xvdCA9IDE7IHNsb3QgPCBOVU1TTE9UUzsgZWlzYUJhc2UrPTB4MTAwMCwgc2xvdCsrKSB7CisJCXVpbnQzMl90IGVpc2FfaWQ7CisJCXNpemVfdAkgaWRfc2l6ZTsKKworCQlpZiAocmVxdWVzdF9yZWdpb24oZWlzYUJhc2UsIEFIQ19FSVNBX0lPU0laRSwgImFpYzd4eHgiKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJZWlzYV9pZCA9IDA7CisJCWlkX3NpemUgPSBzaXplb2YoZWlzYV9pZCk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCS8qIFZMY2FyZHMgcmVxdWlyZSBwcmltaW5nKi8KKwkJCW91dGIoMHg4MCArIGksIGVpc2FCYXNlICsgSURPRkZTRVQpOworCQkJZWlzYV9pZCB8PSBpbmIoZWlzYUJhc2UgKyBJRE9GRlNFVCArIGkpCisJCQkJICAgPDwgKChpZF9zaXplLWktMSkgKiA4KTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihlaXNhQmFzZSwgQUhDX0VJU0FfSU9TSVpFKTsKKwkJaWYgKGVpc2FfaWQgJiAweDgwMDAwMDAwKQorCQkJY29udGludWU7ICAvKiBubyBFSVNBIGNhcmQgaW4gc2xvdCAqLworCisJCWVudHJ5ID0gYWljNzc3MF9maW5kX2RldmljZShlaXNhX2lkKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWFpYzc3NzBfbGludXhfY29uZmlnKGVudHJ5LCBOVUxMLCBlaXNhQmFzZSk7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7CisjZW5kaWYKK30KKwordm9pZAorYWhjX2xpbnV4X2Vpc2FfZXhpdCh2b2lkKQoreworCWlmKGFpYzd4eHhfcHJvYmVfZWlzYV92bCAhPSAwICYmIGFpYzc3NzBfZHJpdmVyLmlkX3RhYmxlICE9IE5VTEwpIHsKKwkJZWlzYV9kcml2ZXJfdW5yZWdpc3RlcigmYWljNzc3MF9kcml2ZXIpOworCQlmcmVlKGFpYzc3NzBfZHJpdmVyLmlkX3RhYmxlLCBNX0RFVkJVRik7CisJfQorfQorCitzdGF0aWMgaW50CithaWM3NzcwX2xpbnV4X2NvbmZpZyhzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSAqZW50cnksIGFpYzc3NzBfZGV2X3QgZGV2LAorCQkgICAgIHVfaW50IGVpc2FCYXNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwljaGFyCWJ1Zls4MF07CisJY2hhciAgICpuYW1lOworCWludAllcnJvcjsKKworCS8qCisJICogQWxsb2NhdGUgYSBzb2Z0YyBmb3IgdGhpcyBjYXJkIGFuZAorCSAqIHNldCBpdCB1cCBmb3IgYXR0YWNobWVudCBieSBvdXIKKwkgKiBjb21tb24gZGV0ZWN0IHJvdXRpbmUuCisJICovCisJc3ByaW50ZihidWYsICJhaGNfZWlzYTolZCIsIGVpc2FCYXNlID4+IDEyKTsKKwluYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJc3RyY3B5KG5hbWUsIGJ1Zik7CisJYWhjID0gYWhjX2FsbG9jKCZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSwgbmFtZSk7CisJaWYgKGFoYyA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJZXJyb3IgPSBhaWM3NzcwX2NvbmZpZyhhaGMsIGVudHJ5LCBlaXNhQmFzZSk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJYWhjLT5ic2guaW9wb3J0ID0gMDsKKwkJYWhjX2ZyZWUoYWhjKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkZXYtPmRyaXZlcl9kYXRhID0gKHZvaWQgKilhaGM7CisJaWYgKGFpYzd4eHhfZGV0ZWN0X2NvbXBsZXRlKQorCQllcnJvciA9IGFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKKyNlbmRpZgorCXJldHVybiAoZXJyb3IpOworfQorCitpbnQKK2FpYzc3NzBfbWFwX3JlZ2lzdGVycyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpCit7CisJLyoKKwkgKiBMb2NrIG91dCBvdGhlciBjb250ZW5kZXJzIGZvciBvdXIgaS9vIHNwYWNlLgorCSAqLworCWlmIChyZXF1ZXN0X3JlZ2lvbihwb3J0LCBBSENfRUlTQV9JT1NJWkUsICJhaWM3eHh4IikgPT0gMCkKKwkJcmV0dXJuIChFTk9NRU0pOworCWFoYy0+dGFnID0gQlVTX1NQQUNFX1BJTzsKKwlhaGMtPmJzaC5pb3BvcnQgPSBwb3J0OworCXJldHVybiAoMCk7Cit9CisKK2ludAorYWljNzc3MF9tYXBfaW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgaXJxKQoreworCWludCBlcnJvcjsKKwlpbnQgc2hhcmVkOworCisJc2hhcmVkID0gMDsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfRURHRV9JTlRFUlJVUFQpID09IDApCisJCXNoYXJlZCA9IFNBX1NISVJROworCisJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIGFoY19saW51eF9pc3IsIHNoYXJlZCwgImFpYzd4eHgiLCBhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IGlycTsKKwkKKwlyZXR1cm4gKC1lcnJvcik7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCitzdGF0aWMgaW50CithaWM3NzcwX2Vpc2FfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CisKKwllZGV2ID0gdG9fZWlzYV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gKGFpYzc3NzBfbGludXhfY29uZmlnKGFpYzc3NzBfaWRlbnRfdGFibGUgKyBlZGV2LT5pZC5kcml2ZXJfZGF0YSwKKwkJCQkgICAgZGV2LCBlZGV2LT5iYXNlX2FkZHIrQUhDX0VJU0FfU0xPVF9PRkZTRVQpKTsKK30KKworc3RhdGljIGludAorYWljNzc3MF9laXNhX2Rldl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcgbDsKKworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCisJICogdGhlIGZyZWUgZGlyZWN0bHksIGJ1dCBjaGVjayBvdXIKKwkgKiBsaXN0IGZvciBleHRyYSBzYW5pdHkuCisJICovCisJYWhjX2xpc3RfbG9jaygmbCk7CisJYWhjID0gYWhjX2ZpbmRfc29mdGMoKHN0cnVjdCBhaGNfc29mdGMgKilkZXYtPmRyaXZlcl9kYXRhKTsKKwlpZiAoYWhjICE9IE5VTEwpIHsKKwkJdV9sb25nIHM7CisKKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCWFoY19pbnRyX2VuYWJsZShhaGMsIEZBTFNFKTsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJYWhjX2ZyZWUoYWhjKTsKKwl9CisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRiMmYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCkBAIC0wLDAgKzEsMTUzNyBAQAorLyoKKyAqIENvcmUgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyBzaGFyZWFibGUgYWNyb3NzIE9TIHBsYXRmb3Jtcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMiBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguaCM5NSAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmbmRlZiBfQUlDNzlYWF9IXworI2RlZmluZSBfQUlDNzlYWF9IXworCisvKiBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImFpYzc5eHhfcmVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZvcndhcmQgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGE7CitzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVXNlZnVsIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBOVU1fRUxFTUVOVFMoYXJyYXkpIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKCphcnJheSkpCisKKyNkZWZpbmUgQUxMX0NIQU5ORUxTICdcMCcKKyNkZWZpbmUgQUxMX1RBUkdFVFNfTUFTSyAweEZGRkYKKyNkZWZpbmUgSU5JVElBVE9SX1dJTERDQVJECSh+MCkKKyNkZWZpbmUJU0NCX0xJU1RfTlVMTAkJMHhGRjAwCisjZGVmaW5lCVNDQl9MSVNUX05VTExfTEUJKGFoZF9odG9sZTE2KFNDQl9MSVNUX05VTEwpKQorI2RlZmluZSBRT1VURklGT19FTlRSWV9WQUxJRCAweDgwMDAKKyNkZWZpbmUgUU9VVEZJRk9fRU5UUllfVkFMSURfTEUgKGFoZF9odG9sZTE2KDB4ODAwMCkpCisjZGVmaW5lIFNDQklEX0lTX05VTEwoc2NiaWQpICgoKHNjYmlkKSAmIDB4RkYwMCApID09IFNDQl9MSVNUX05VTEwpCisKKyNkZWZpbmUgU0NTSUlEX1RBUkdFVChhaGQsIHNjc2lpZCkJXAorCSgoKHNjc2lpZCkgJiBUSUQpID4+IFRJRF9TSElGVCkKKyNkZWZpbmUgU0NTSUlEX09VUl9JRChzY3NpaWQpCQlcCisJKChzY3NpaWQpICYgT0lEKQorI2RlZmluZSBTQ1NJSURfQ0hBTk5FTChhaGQsIHNjc2lpZCkgKCdBJykKKyNkZWZpbmUJU0NCX0lTX1NDU0lCVVNfQihhaGQsIHNjYikgKDApCisjZGVmaW5lCVNDQl9HRVRfT1VSX0lEKHNjYikgXAorCVNDU0lJRF9PVVJfSUQoKHNjYiktPmhzY2ItPnNjc2lpZCkKKyNkZWZpbmUJU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpIFwKKwlTQ1NJSURfVEFSR0VUKChhaGQpLCAoc2NiKS0+aHNjYi0+c2NzaWlkKQorI2RlZmluZQlTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpIFwKKwlTQ1NJSURfQ0hBTk5FTChhaGQsIChzY2IpLT5oc2NiLT5zY3NpaWQpCisjZGVmaW5lCVNDQl9HRVRfTFVOKHNjYikgXAorCSgoc2NiKS0+aHNjYi0+bHVuKQorI2RlZmluZSBTQ0JfR0VUX1RBUkdFVF9PRkZTRVQoYWhkLCBzY2IpCVwKKwlTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYikKKyNkZWZpbmUgU0NCX0dFVF9UQVJHRVRfTUFTSyhhaGQsIHNjYikgXAorCSgweDAxIDw8IChTQ0JfR0VUX1RBUkdFVF9PRkZTRVQoYWhkLCBzY2IpKSkKKyNpZmRlZiBBSERfREVCVUcKKyNkZWZpbmUgU0NCX0lTX1NJTEVOVChzY2IpCQkJCQlcCisJKChhaGRfZGVidWcgJiBBSERfU0hPV19NQVNLRURfRVJST1JTKSA9PSAwCQlcCisgICAgICAmJiAoKChzY2IpLT5mbGFncyAmIFNDQl9TSUxFTlQpICE9IDApKQorI2Vsc2UKKyNkZWZpbmUgU0NCX0lTX1NJTEVOVChzY2IpCQkJCQlcCisJKCgoc2NiKS0+ZmxhZ3MgJiBTQ0JfU0lMRU5UKSAhPSAwKQorI2VuZGlmCisvKgorICogVENMcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBUVFRUTExMTExMTEwKKyAqLworI2RlZmluZSBUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpIFwKKwkoKCgodGNsKSA+PiA0KSAmIFRJRCkgPj4gNCkKKyNkZWZpbmUgVENMX0xVTih0Y2wpIFwKKwkodGNsICYgKEFIRF9OVU1fTFVOUyAtIDEpKQorI2RlZmluZSBCVUlMRF9UQ0woc2NzaWlkLCBsdW4pIFwKKwkoKGx1bikgfCAoKChzY3NpaWQpICYgVElEKSA8PCA0KSkKKyNkZWZpbmUgQlVJTERfVENMX1JBVyh0YXJnZXQsIGNoYW5uZWwsIGx1bikgXAorCSgobHVuKSB8ICgodGFyZ2V0KSA8PCA4KSkKKworI2RlZmluZSBTQ0JfR0VUX1RBRyhzY2IpIFwKKwlhaGRfbGUxNnRvaChzY2ItPmhzY2ItPnRhZykKKworI2lmbmRlZglBSERfVEFSR0VUX01PREUKKyN1bmRlZglBSERfVE1PREVfRU5BQkxFCisjZGVmaW5lCUFIRF9UTU9ERV9FTkFCTEUgMAorI2VuZGlmCisKKyNkZWZpbmUgQUhEX0JVSUxEX0NPTF9JRFgodGFyZ2V0LCBsdW4pCQkJCVwKKwkoKChsdW4pIDw8IDQpIHwgdGFyZ2V0KQorCisjZGVmaW5lIEFIRF9HRVRfU0NCX0NPTF9JRFgoYWhkLCBzY2IpCQkJCVwKKwkoKFNDQl9HRVRfTFVOKHNjYikgPDwgNCkgfCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYikpCisKKyNkZWZpbmUgQUhEX1NFVF9TQ0JfQ09MX0lEWChzY2IsIGNvbF9pZHgpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJKHNjYiktPmhzY2ItPnNjc2lpZCA9ICgoY29sX2lkeCkgPDwgVElEX1NISUZUKSAmIFRJRDsJCVwKKwkoc2NiKS0+aHNjYi0+bHVuID0gKChjb2xfaWR4KSA+PiA0KSAmIChBSERfTlVNX0xVTlNfTk9OUEtULTEpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFIRF9DT1BZX1NDQl9DT0xfSURYKGRzdCwgc3JjKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJZHN0LT5oc2NiLT5zY3NpaWQgPSBzcmMtPmhzY2ItPnNjc2lpZDsJCQlcCisJZHN0LT5oc2NiLT5sdW4gPSBzcmMtPmhzY2ItPmx1bjsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUFIRF9ORVZFUl9DT0xfSURYIDB4RkZGRgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEcml2ZXIgQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgdGFyZ2V0cy4KKyAqLworI2RlZmluZSBBSERfTlVNX1RBUkdFVFMgMTYKKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgbHVucy4KKyAqIFRoZSBpZGVudGlmeSBtZXNzYWdlIG9ubHkgc3VwcG9ydHMgNjQgbHVucyBpbiBub24tcGFja2V0aXplZCB0cmFuc2ZlcnMuCisgKiBZb3UgY2FuIGhhdmUgMl42NCBsdW5zIHdoZW4gaW5mb3JtYXRpb24gdW5pdCB0cmFuc2ZlcnMgYXJlIGVuYWJsZWQsCisgKiBidXQgdW50aWwgd2Ugc2VlIGEgbmVlZCB0byBzdXBwb3J0IHRoYXQgbWFueSwgd2Ugc3VwcG9ydCAyNTYuCisgKi8KKyNkZWZpbmUgQUhEX05VTV9MVU5TX05PTlBLVCA2NAorI2RlZmluZSBBSERfTlVNX0xVTlMgMjU2CisKKy8qCisgKiBUaGUgbWF4aW11bSB0cmFuc2ZlciBwZXIgUy9HIHNlZ21lbnQuCisgKi8KKyNkZWZpbmUgQUhEX01BWFRSQU5TRkVSX1NJWkUJIDB4MDBmZmZmZmYJLyogbGltaXRlZCBieSAyNGJpdCBjb3VudGVyICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgU0NCIHN0b3JhZ2UgaW4gaGFyZHdhcmUgb24gYSBjb250cm9sbGVyLgorICogVGhpcyB2YWx1ZSByZXByZXNlbnRzIGFuIHVwcGVyIGJvdW5kLiAgRHVlIHRvIHNvZnR3YXJlIGRlc2lnbiwKKyAqIHdlIG1heSBub3QgYmUgYWJsZSB0byB1c2UgdGhpcyBudW1iZXIuCisgKi8KKyNkZWZpbmUgQUhEX1NDQl9NQVgJNTEyCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCB0cmFuc2FjdGlvbnMgc3VwcG9ydGVkIHBlciBkcml2ZXIgaW5zdGFuY2UuCisgKiBTZXF1ZW5jZXIgQ29udHJvbCBCbG9ja3MgKFNDQnMpIHN0b3JlIHBlci10cmFuc2FjdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBBSERfTUFYX1FVRVVFCUFIRF9TQ0JfTUFYCisKKy8qCisgKiBEZWZpbmUgdGhlIHNpemUgb2Ygb3VyIFFJTiBhbmQgUU9VVCBGSUZPcy4gIFRoZXkgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAqIGluIHNpemUgYW5kIGFjY29tbW9kYXRlIGFzIG1hbnkgdHJhbnNhY3Rpb25zIGFzIGNhbiBiZSBxdWV1ZWQgY29uY3VycmVudGx5LgorICovCisjZGVmaW5lCUFIRF9RSU5fU0laRQlBSERfTUFYX1FVRVVFCisjZGVmaW5lCUFIRF9RT1VUX1NJWkUJQUhEX01BWF9RVUVVRQorCisjZGVmaW5lIEFIRF9RSU5fV1JBUCh4KSAoKHgpICYgKEFIRF9RSU5fU0laRS0xKSkKKy8qCisgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgU0NCIHN0b3JhZ2Ugd2UgYWxsb2NhdGUgaW4gaG9zdCBtZW1vcnkuCisgKi8KKyNkZWZpbmUgQUhEX1NDQl9NQVhfQUxMT0MgQUhEX01BWF9RVUVVRQorCisvKgorICogUmluZyBCdWZmZXIgb2YgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmRzLgorICogV2UgYWxsb2NhdGUgMjU2IHRvIHNpbXBsaWZ5IHRoZSBsb2dpYyBpbiB0aGUgc2VxdWVuY2VyCisgKiBieSB1c2luZyB0aGUgbmF0dXJhbCB3cmFwIHBvaW50IG9mIGFuIDhiaXQgY291bnRlci4KKyAqLworI2RlZmluZSBBSERfVE1PREVfQ01EUwkyNTYKKworLyogUmVzZXQgbGluZSBhc3NlcnRpb24gdGltZSBpbiB1cyAqLworI2RlZmluZSBBSERfQlVTUkVTRVRfREVMQVkJMjUKKworLyoqKioqKioqKioqKioqKioqKiogQ2hpcCBDaGFyYWN0ZXJpc3RpY3MvT3BlcmF0aW5nIFNldHRpbmdzICAqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDaGlwIFR5cGUKKyAqIFRoZSBjaGlwIG9yZGVyIGlzIGZyb20gbGVhc3Qgc29waGlzdGljYXRlZCB0byBtb3N0IHNvcGhpc3RpY2F0ZWQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX05PTkUJPSAweDAwMDAsCisJQUhEX0NISVBJRF9NQVNLCT0gMHgwMEZGLAorCUFIRF9BSUM3OTAxCT0gMHgwMDAxLAorCUFIRF9BSUM3OTAyCT0gMHgwMDAyLAorCUFIRF9BSUM3OTAxQQk9IDB4MDAwMywKKwlBSERfUENJCQk9IDB4MDEwMCwJLyogQnVzIHR5cGUgUENJICovCisJQUhEX1BDSVgJPSAweDAyMDAsCS8qIEJ1cyB0eXBlIFBDSVggKi8KKwlBSERfQlVTX01BU0sJPSAweDBGMDAKK30gYWhkX2NoaXA7CisKKy8qCisgKiBGZWF0dXJlcyBhdmFpbGFibGUgaW4gZWFjaCBjaGlwIHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX0ZFTk9ORQkJPSAweDAwMDAwLAorCUFIRF9XSURFICAJCT0gMHgwMDAwMSwvKiBXaWRlIENoYW5uZWwgKi8KKwlBSERfTVVMVElfRlVOQwkJPSAweDAwMTAwLC8qIE11bHRpLUZ1bmN0aW9uL0NoYW5uZWwgRGV2aWNlICovCisJQUhEX1RBUkdFVE1PREUJCT0gMHgwMTAwMCwvKiBIYXMgdGVzdGVkIHRhcmdldCBtb2RlIHN1cHBvcnQgKi8KKwlBSERfTVVMVElST0xFCQk9IDB4MDIwMDAsLyogU3BhY2UgZm9yIHR3byByb2xlcyBhdCBhIHRpbWUgKi8KKwlBSERfUlRJCQkJPSAweDA0MDAwLC8qIFJldGFpbmVkIFRyYWluaW5nIFN1cHBvcnQgKi8KKwlBSERfTkVXX0lPQ0VMTF9PUFRTCT0gMHgwODAwMCwvKiBNb3JlIFNpZ25hbCBrbm9icyBpbiB0aGUgSU9DRUxMICovCisJQUhEX05FV19ERkNOVFJMX09QVFMJPSAweDEwMDAwLC8qIFNDU0lFTldSRElTIGJpdCAqLworCUFIRF9GQVNUX0NEQl9ERUxJVkVSWQk9IDB4MjAwMDAsLyogQ0RCIGFja3MgcmVsZWFzZWQgdG8gT3V0cHV0IFN5bmMgKi8KKwlBSERfUkVNT1ZBQkxFCQk9IDB4MDAwMDAsLyogSG90LVN3YXAgc3VwcG9ydGVkIC0gTm9uZSBzbyBmYXIqLworCUFIRF9BSUM3OTAxX0ZFCQk9IEFIRF9GRU5PTkUsCisJQUhEX0FJQzc5MDFBX0ZFCQk9IEFIRF9GRU5PTkUsCisJQUhEX0FJQzc5MDJfRkUJCT0gQUhEX01VTFRJX0ZVTkMKK30gYWhkX2ZlYXR1cmU7CisKKy8qCisgKiBCdWdzIGluIHRoZSBzaWxpY29uIHRoYXQgd2Ugd29yayBhcm91bmQgaW4gc29mdHdhcmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX0JVR05PTkUJCT0gMHgwMDAwLAorCS8qCisJICogUmV2IEEgaGFyZHdhcmUgZmFpbHMgdG8gdXBkYXRlIExBU1QvQ1VSUi9ORVhUU0NCCisJICogY29ycmVjdGx5IGluIGNlcnRhaW4gcGFja2V0aXplZCBzZWxlY3Rpb24gY2FzZXMuCisJICovCisJQUhEX1NFTlRfU0NCX1VQREFURV9CVUcJPSAweDAwMDEsCisJLyogVGhlIHdyb25nIFNDQiBpcyBhY2Nlc3NlZCB0byBjaGVjayB0aGUgYWJvcnQgcGVuZGluZyBiaXQuICovCisJQUhEX0FCT1JUX0xRSV9CVUcJPSAweDAwMDIsCisJLyogUGFja2V0aXplZCBiaXRidWNrZXQgY3Jvc3NlcyBwYWNrZXQgYm91bmRhcmllcy4gKi8KKwlBSERfUEtUX0JJVEJVQ0tFVF9CVUcJPSAweDAwMDQsCisJLyogVGhlIHNlbGVjdGlvbiB0aW1lciBydW5zIHR3aWNlIGFzIGxvbmcgYXMgaXRzIHNldHRpbmcuICovCisJQUhEX0xPTkdfU0VUSU1PX0JVRwk9IDB4MDAwOCwKKwkvKiBUaGUgTm9uLUxRIENSQyBlcnJvciBzdGF0dXMgaXMgZGVsYXllZCB1bnRpbCBwaGFzZSBjaGFuZ2UuICovCisJQUhEX05MUUlDUkNfREVMQVlFRF9CVUcJPSAweDAwMTAsCisJLyogVGhlIGNoaXAgbXVzdCBiZSByZXNldCBmb3IgYWxsIG91dGdvaW5nIGJ1cyByZXNldHMuICAqLworCUFIRF9TQ1NJUlNUX0JVRwkJPSAweDAwMjAsCisJLyogU29tZSBQQ0lYIGZpZWxkcyBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgY2hpcCByZXNldC4gKi8KKwlBSERfUENJWF9DSElQUlNUX0JVRwk9IDB4MDA0MCwKKwkvKiBNTUFQSU8gaXMgbm90IGZ1bmN0aW9uYWwgaW4gUENJLVggbW9kZS4gICovCisJQUhEX1BDSVhfTU1BUElPX0JVRwk9IDB4MDA4MCwKKwkvKiBSZWFkcyB0byBTQ0JSQU0gZmFpbCB0byByZXNldCB0aGUgZGlzY2FyZCB0aW1lci4gKi8KKwlBSERfUENJWF9TQ0JSQU1fUkRfQlVHICA9IDB4MDEwMCwKKwkvKiBCdWcgd29ya2Fyb3VuZHMgdGhhdCBjYW4gYmUgZGlzYWJsZWQgb24gbm9uLVBDSVggYnVzc2VzLiAqLworCUFIRF9QQ0lYX0JVR19NQVNLCT0gQUhEX1BDSVhfQ0hJUFJTVF9CVUcKKwkJCQl8IEFIRF9QQ0lYX01NQVBJT19CVUcKKwkJCQl8IEFIRF9QQ0lYX1NDQlJBTV9SRF9CVUcsCisJLyoKKwkgKiBMUU9TVE9QMCBzdGF0dXMgc2V0IGV2ZW4gZm9yIGZvcmNlZCBzZWxlY3Rpb25zIHdpdGggQVROCisJICogdG8gcGVyZm9ybSBub24tcGFja2V0aXplZCBtZXNzYWdlIGRlbGl2ZXJ5LgorCSAqLworCUFIRF9MUU9fQVROT19CVUcJPSAweDAyMDAsCisJLyogRklGTyBhdXRvLWZsdXNoIGRvZXMgbm90IGFsd2F5cyB0cmlnZ2VyLiAgKi8KKwlBSERfQVVUT0ZMVVNIX0JVRwk9IDB4MDQwMCwKKwkvKiBUaGUgQ0xSTFFPIHJlZ2lzdGVycyBhcmUgbm90IHNlbGYtY2xlYXJpbmcuICovCisJQUhEX0NMUkxRT19BVVRPQ0xSX0JVRwk9IDB4MDgwMCwKKwkvKiBUaGUgUEFDS0VUSVpFRCBzdGF0dXMgYml0IHJlZmVycyB0byB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4gKi8KKwlBSERfUEtUSVpFRF9TVEFUVVNfQlVHICA9IDB4MTAwMCwKKwkvKiAiU2hvcnQgTHVucyIgYXJlIG5vdCBwbGFjZWQgaW50byBvdXRnb2luZyBMUSBwYWNrZXRzIGNvcnJlY3RseS4gKi8KKwlBSERfUEtUX0xVTl9CVUcJCT0gMHgyMDAwLAorCS8qCisJICogT25seSB0aGUgRklGTyBhbGxvY2F0ZWQgdG8gdGhlIG5vbi1wYWNrZXRpemVkIGNvbm5lY3Rpb24gbWF5CisJICogYmUgaW4gdXNlIGR1cmluZyBhIG5vbi1wYWNrZXR6aWVkIGNvbm5lY3Rpb24uCisJICovCisJQUhEX05PTlBBQ0tGSUZPX0JVRwk9IDB4NDAwMCwKKwkvKgorCSAqIFdyaXRpbmcgdG8gYSBERkYgU0NCUFRSIHJlZ2lzdGVyIG1heSBmYWlsIGlmIGNvbmN1cmVudCB3aXRoCisJICogYSBoYXJkd2FyZSB3cml0ZSB0byB0aGUgb3RoZXIgREZGIFNDQlBUUiByZWdpc3Rlci4gIFRoaXMgaXMKKwkgKiBub3QgY3VycmVudGx5IGEgY29uY2VybiBpbiBvdXIgc2VxdWVuY2VyIHNpbmNlIGFsbCBjaGlwcyB3aXRoCisJICogdGhpcyBidWcgaGF2ZSB0aGUgQUhEX05PTlBBQ0tGSUZPX0JVRyBhbmQgYWxsIHdyaXRlcyBvZiBjb25jZXJuCisJICogb2NjdXIgaW4gbm9uLXBhY2tldGl6ZWQgY29ubmVjdGlvbnMuCisJICovCisJQUhEX01ERkZfV1NDQlBUUl9CVUcJPSAweDgwMDAsCisJLyogU0dIQUREUiB1cGRhdGVzIGFyZSBzbG93LiAqLworCUFIRF9SRUdfU0xPV19TRVRUTEVfQlVHCT0gMHgxMDAwMCwKKwkvKgorCSAqIENoYW5naW5nIHRoZSBNT0RFX1BUUiBjb2luY2lkZW50IHdpdGggYW4gaW50ZXJydXB0IHRoYXQKKwkgKiBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCBtb2RlIHdpbGwgY2F1c2UgdGhlIGludGVycnVwdCB0bworCSAqIGJlIGluIHRoZSBtb2RlIHdyaXR0ZW4gb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dC4KKwkgKi8KKwlBSERfU0VUX01PREVfQlVHCT0gMHgyMDAwMCwKKwkvKiBOb24tcGFja2V0aXplZCBidXNmcmVlIHJldmlzaW9uIGRvZXMgbm90IHdvcmsuICovCisJQUhEX0JVU0ZSRUVSRVZfQlVHCT0gMHg0MDAwMCwKKwkvKgorCSAqIFBhY2VkIHRyYW5zZmVycyBhcmUgaW5kaWNhdGVkIHdpdGggYSBub24tc3RhbmRhcmQgUFBSCisJICogb3B0aW9uIGJpdCBpbiB0aGUgbmVnIHRhYmxlLCAxNjBNSHogaXMgaW5kaWNhdGVkIGJ5CisJICogc3luYyBmYWN0b3IgMHg3LCBhbmQgdGhlIG9mZnNldCBpZiBvZmYgYnkgYSBmYWN0b3Igb2YgMi4KKwkgKi8KKwlBSERfUEFDRURfTkVHVEFCTEVfQlVHCT0gMHg4MDAwMCwKKwkvKiBMUU9PVkVSUlVOIGZhbHNlIHBvc2l0aXZlcy4gKi8KKwlBSERfTFFPT1ZFUlJVTl9CVUcJPSAweDEwMDAwMCwKKwkvKgorCSAqIENvbnRyb2xsZXIgd3JpdGUgdG8gSU5UU1RBVCB3aWxsIGxvc2UgdG8gYSBob3N0CisJICogd3JpdGUgdG8gQ0xSSU5ULgorCSAqLworCUFIRF9JTlRDT0xMSVNJT05fQlVHCT0gMHgyMDAwMDAsCisJLyoKKwkgKiBUaGUgR0VNMzE4IHZpb2xhdGVzIHRoZSBTQ1NJIHNwZWMgYnkgbm90IHdhaXRpbmcKKwkgKiB0aGUgbWFuZGF0ZWQgYnVzIHNldHRsZSBkZWxheSBiZXR3ZWVuIHBoYXNlIGNoYW5nZXMKKwkgKiBpbiBzb21lIHNpdHVhdGlvbnMuICBTb21lIGFpYzc5eHggY2hpcCByZXZzLiBhcmUgbW9yZQorCSAqIHN0cmljdCBpbiB0aGlzIHJlZ2FyZCBhbmQgd2lsbCB0cmVhdCBSRVEgYXNzZXJ0aW9ucworCSAqIHRoYXQgZmFsbCB3aXRoaW4gdGhlIGJ1cyBzZXR0bGUgZGVsYXkgd2luZG93IGFzCisJICogZ2xpdGNoZXMuICBUaGlzIGZsYWcgdGVsbHMgdGhlIGZpcm13YXJlIHRvIHRvbGVyYXRlCisJICogZWFybHkgUkVRIGFzc2VydGlvbnMuCisJICovCisJQUhEX0VBUkxZX1JFUV9CVUcJPSAweDQwMDAwMCwKKwkvKgorCSAqIFRoZSBMRUQgZG9lcyBub3Qgc3RheSBvbiBsb25nIGVub3VnaCBpbiBwYWNrZXRpemVkIG1vZGVzLgorCSAqLworCUFIRF9GQUlOVF9MRURfQlVHCT0gMHg4MDAwMDAKK30gYWhkX2J1ZzsKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgc2V0dGluZ3MuCisgKiBUaGUgZHJpdmVyIGRldGVybWluZXMgdGhlc2Ugc2V0dGluZ3MgYnkgcHJvYmluZyB0aGUKKyAqIGNoaXAvY29udHJvbGxlcidzIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhEX0ZOT05FCSAgICAgID0gMHgwMDAwMCwKKwlBSERfQk9PVF9DSEFOTkVMICAgICAgPSAweDAwMDAxLC8qIFdlIHdlcmUgc2V0IGFzIHRoZSBib290IGNoYW5uZWwuICovCisJQUhEX1VTRURFRkFVTFRTCSAgICAgID0gMHgwMDAwNCwvKgorCQkJCQkgKiBGb3IgY2FyZHMgd2l0aG91dCBhbiBzZWVwcm9tCisJCQkJCSAqIG9yIGEgQklPUyB0byBpbml0aWFsaXplIHRoZSBjaGlwJ3MKKwkJCQkJICogU1JBTSwgd2UgdXNlIHRoZSBkZWZhdWx0IHRhcmdldAorCQkJCQkgKiBzZXR0aW5ncy4KKwkJCQkJICovCisJQUhEX1NFUVVFTkNFUl9ERUJVRyAgID0gMHgwMDAwOCwKKwlBSERfUkVTRVRfQlVTX0EJICAgICAgPSAweDAwMDEwLAorCUFIRF9FWFRFTkRFRF9UUkFOU19BICA9IDB4MDAwMjAsCisJQUhEX1RFUk1fRU5CX0EJICAgICAgPSAweDAwMDQwLAorCUFIRF9TUENIS19FTkJfQQkgICAgICA9IDB4MDAwODAsCisJQUhEX1NUUFdMRVZFTF9BCSAgICAgID0gMHgwMDEwMCwKKwlBSERfSU5JVElBVE9SUk9MRSAgICAgPSAweDAwMjAwLC8qCisJCQkJCSAqIEFsbG93IGluaXRpYXRvciBvcGVyYXRpb25zIG9uCisJCQkJCSAqIHRoaXMgY29udHJvbGxlci4KKwkJCQkJICovCisJQUhEX1RBUkdFVFJPTEUJICAgICAgPSAweDAwNDAwLC8qCisJCQkJCSAqIEFsbG93IHRhcmdldCBvcGVyYXRpb25zIG9uIHRoaXMKKwkJCQkJICogY29udHJvbGxlci4KKwkJCQkJICovCisJQUhEX1JFU09VUkNFX1NIT1JUQUdFID0gMHgwMDgwMCwKKwlBSERfVFFJTkZJRk9fQkxPQ0tFRCAgPSAweDAxMDAwLC8qIEJsb2NrZWQgd2FpdGluZyBmb3IgQVRJT3MgKi8KKwlBSERfSU5UNTBfU1BFRURGTEVYICAgPSAweDAyMDAwLC8qCisJCQkJCSAqIEludGVybmFsIDUwcGluIGNvbm5lY3RvcgorCQkJCQkgKiBzaXRzIGJlaGluZCBhbiBhaWMzODYwCisJCQkJCSAqLworCUFIRF9CSU9TX0VOQUJMRUQgICAgICA9IDB4MDQwMDAsCisJQUhEX0FMTF9JTlRFUlJVUFRTICAgID0gMHgwODAwMCwKKwlBSERfMzlCSVRfQUREUkVTU0lORyAgPSAweDEwMDAwLC8qIFVzZSAzOSBiaXQgYWRkcmVzc2luZyBzY2hlbWUuICovCisJQUhEXzY0QklUX0FERFJFU1NJTkcgID0gMHgyMDAwMCwvKiBVc2UgNjQgYml0IGFkZHJlc3Npbmcgc2NoZW1lLiAqLworCUFIRF9DVVJSRU5UX1NFTlNJTkcgICA9IDB4NDAwMDAsCisJQUhEX1NDQl9DT05GSUdfVVNFRCAgID0gMHg4MDAwMCwvKiBObyBTRUVQUk9NIGJ1dCBTQ0IgaGFkIGluZm8uICovCisJQUhEX0hQX0JPQVJECSAgICAgID0gMHgxMDAwMDAsCisJQUhEX1JFU0VUX1BPTExfQUNUSVZFID0gMHgyMDAwMDAsCisJQUhEX1VQREFURV9QRU5EX0NNRFMgID0gMHg0MDAwMDAsCisJQUhEX1JVTk5JTkdfUU9VVEZJRk8gID0gMHg4MDAwMDAsCisJQUhEX0hBRF9GSVJTVF9TRUwgICAgID0gMHgxMDAwMDAwCit9IGFoZF9mbGFnOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBIYXJkd2FyZSAgU0NCIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGRyaXZlciBrZWVwcyB1cCB0byBNQVhfU0NCIHNjYiBzdHJ1Y3R1cmVzIHBlciBjYXJkIGluIG1lbW9yeS4gIFRoZSBTQ0IKKyAqIGNvbnNpc3RzIG9mIGEgImhhcmR3YXJlIFNDQiIgbWlycm9yaW5nIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSBjYXJkCisgKiBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGUga2VybmVsIHN0b3JlcyBmb3IgZWFjaCB0cmFuc2FjdGlvbi4KKyAqCisgKiBUbyBtaW5pbWl6ZSBzcGFjZSB1dGlsaXphdGlvbiwgYSBwb3J0aW9uIG9mIHRoZSBoYXJkd2FyZSBzY2Igc3RvcmVzCisgKiBkaWZmZXJlbnQgZGF0YSBkdXJpbmcgZGlmZmVyZW50IHBvcnRpb25zIG9mIGEgU0NTSSB0cmFuc2FjdGlvbi4KKyAqIEFzIGluaXRpYWxpemVkIGJ5IHRoZSBob3N0IGRyaXZlciBmb3IgdGhlIGluaXRpYXRvciByb2xlLCB0aGlzIGFyZWEKKyAqIGNvbnRhaW5zIHRoZSBTQ1NJIGNkYiAob3IgYSBwb2ludGVyIHRvIHRoZSAgY2RiKSB0byBiZSBleGVjdXRlZC4gIEFmdGVyCisgKiB0aGUgY2RiIGhhcyBiZWVuIHByZXNlbnRlZCB0byB0aGUgdGFyZ2V0LCB0aGlzIGFyZWEgc2VydmVzIHRvIHN0b3JlCisgKiByZXNpZHVhbCB0cmFuc2ZlciBpbmZvcm1hdGlvbiBhbmQgdGhlIFNDU0kgc3RhdHVzIGJ5dGUuCisgKiBGb3IgdGhlIHRhcmdldCByb2xlLCB0aGUgY29udGVudHMgb2YgdGhpcyBhcmVhIGRvIG5vdCBjaGFuZ2UsIGJ1dAorICogc3RpbGwgc2VydmUgYSBkaWZmZXJlbnQgcHVycG9zZSB0aGFuIGZvciB0aGUgaW5pdGlhdG9yIHJvbGUuICBTZWUKKyAqIHN0cnVjdCB0YXJnZXRfZGF0YSBmb3IgZGV0YWlscy4KKyAqLworCisvKgorICogU3RhdHVzIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHRoZSBzaGFyZWQgcG9yaXRvbiBvZgorICogYW4gU0NCIGFmdGVyIHBhc3NpbmcgdGhlIGNkYiB0byB0aGUgdGFyZ2V0LiAgVGhlIGtlcm5lbAorICogZHJpdmVyIHdpbGwgb25seSByZWFkIHRoaXMgZGF0YSBmb3IgdHJhbnNhY3Rpb25zIHRoYXQKKyAqIGNvbXBsZXRlIGFibm9ybWFsbHkuCisgKi8KK3N0cnVjdCBpbml0aWF0b3Jfc3RhdHVzIHsKKwl1aW50MzJfdCByZXNpZHVhbF9kYXRhY250OwkvKiBSZXNpZHVhbCBpbiB0aGUgY3VycmVudCBTL0cgc2VnICovCisJdWludDMyX3QgcmVzaWR1YWxfc2dwdHI7CS8qIFRoZSBuZXh0IFMvRyBmb3IgdGhpcyB0cmFuc2ZlciAqLworCXVpbnQ4X3QJIHNjc2lfc3RhdHVzOwkJLyogU3RhbmRhcmQgU0NTSSBzdGF0dXMgYnl0ZSAqLworfTsKKworc3RydWN0IHRhcmdldF9zdGF0dXMgeworCXVpbnQzMl90IHJlc2lkdWFsX2RhdGFjbnQ7CS8qIFJlc2lkdWFsIGluIHRoZSBjdXJyZW50IFMvRyBzZWcgKi8KKwl1aW50MzJfdCByZXNpZHVhbF9zZ3B0cjsJLyogVGhlIG5leHQgUy9HIGZvciB0aGlzIHRyYW5zZmVyICovCisJdWludDhfdCAgc2NzaV9zdGF0dXM7CQkvKiBTQ1NJIHN0YXR1cyB0byBnaXZlIHRvIGluaXRpYXRvciAqLworCXVpbnQ4X3QgIHRhcmdldF9waGFzZXM7CQkvKiBCaXRtYXAgb2YgcGhhc2VzIHRvIGV4ZWN1dGUgKi8KKwl1aW50OF90ICBkYXRhX3BoYXNlOwkJLyogRGF0YS1JbiBvciBEYXRhLU91dCAqLworCXVpbnQ4X3QgIGluaXRpYXRvcl90YWc7CQkvKiBJbml0aWF0b3IncyB0cmFuc2FjdGlvbiB0YWcgKi8KK307CisKKy8qCisgKiBJbml0aWF0b3IgbW9kZSBTQ0Igc2hhcmVkIGRhdGEgYXJlYS4KKyAqIElmIHRoZSBlbWJlZGRlZCBDREIgaXMgMTIgYnl0ZXMgb3IgbGVzcywgd2UgZW1iZWQKKyAqIHRoZSBzZW5zZSBidWZmZXIgYWRkcmVzcyBpbiB0aGUgU0NCLiAgVGhpcyBhbGxvd3MKKyAqIHVzIHRvIHJldHJpZXZlIHNlbnNlIGluZm9ybWF0aW9uIHdpdGhvdXQgaW50ZXJydXB0aW5nCisgKiB0aGUgaG9zdCBpbiBwYWNrZXRpemVkIG1vZGUuCisgKi8KK3R5cGVkZWYgdWludDMyX3Qgc2Vuc2VfYWRkcl90OworI2RlZmluZSBNQVhfQ0RCX0xFTiAxNgorI2RlZmluZSBNQVhfQ0RCX0xFTl9XSVRIX1NFTlNFX0FERFIgKE1BWF9DREJfTEVOIC0gc2l6ZW9mKHNlbnNlX2FkZHJfdCkpCit1bmlvbiBpbml0aWF0b3JfZGF0YSB7CisJc3RydWN0IHsKKwkJdWludDY0X3QgY2RicHRyOworCQl1aW50OF90ICBjZGJsZW47CisJfSBjZGJfZnJvbV9ob3N0OworCXVpbnQ4X3QJIGNkYltNQVhfQ0RCX0xFTl07CisJc3RydWN0IHsKKwkJdWludDhfdAkgY2RiW01BWF9DREJfTEVOX1dJVEhfU0VOU0VfQUREUl07CisJCXNlbnNlX2FkZHJfdCBzZW5zZV9hZGRyOworCX0gY2RiX3BsdXNfc2FkZHI7Cit9OworCisvKgorICogVGFyZ2V0IG1vZGUgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGRhdGEgU0NCIHNlZ21lbnQuCisgKi8KK3N0cnVjdCB0YXJnZXRfZGF0YSB7CisJdWludDMyX3Qgc3BhcmVbMl07CQorCXVpbnQ4X3QgIHNjc2lfc3RhdHVzOwkJLyogU0NTSSBzdGF0dXMgdG8gZ2l2ZSB0byBpbml0aWF0b3IgKi8KKwl1aW50OF90ICB0YXJnZXRfcGhhc2VzOwkJLyogQml0bWFwIG9mIHBoYXNlcyB0byBleGVjdXRlICovCisJdWludDhfdCAgZGF0YV9waGFzZTsJCS8qIERhdGEtSW4gb3IgRGF0YS1PdXQgKi8KKwl1aW50OF90ICBpbml0aWF0b3JfdGFnOwkJLyogSW5pdGlhdG9yJ3MgdHJhbnNhY3Rpb24gdGFnICovCit9OworCitzdHJ1Y3QgaGFyZHdhcmVfc2NiIHsKKy8qMCovCXVuaW9uIHsKKwkJdW5pb24JaW5pdGlhdG9yX2RhdGEgaWRhdGE7CisJCXN0cnVjdAl0YXJnZXRfZGF0YSB0ZGF0YTsKKwkJc3RydWN0CWluaXRpYXRvcl9zdGF0dXMgaXN0YXR1czsKKwkJc3RydWN0CXRhcmdldF9zdGF0dXMgdHN0YXR1czsKKwl9IHNoYXJlZF9kYXRhOworLyoKKyAqIEEgd29yZCBhYm91dCByZXNpZHVhbHMuCisgKiBUaGUgc2NiIGlzIHByZXNlbnRlZCB0byB0aGUgc2VxdWVuY2VyIHdpdGggdGhlIGRhdGFwdHIgYW5kIGRhdGFjbnQKKyAqIGZpZWxkcyBpbml0aWFsaXplZCB0byB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IFMvRyBlbGVtZW50IHRvCisgKiB0cmFuc2Zlci4gIFRoZSBzZ3B0ciBmaWVsZCBpcyBpbml0aWFsaXplZCB0byB0aGUgYnVzIGFkZHJlc3MgZm9yCisgKiB0aGUgUy9HIGVsZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBmaXJzdCBpbiB0aGUgaW4gY29yZSBTL0cgYXJyYXkKKyAqIG9yJ2VkIHdpdGggdGhlIFNHX0ZVTExfUkVTSUQgZmxhZy4gIFNncHRyIG1heSBwb2ludCB0byBhbiBpbnZhbGlkCisgKiBTL0cgZW50cnkgZm9yIHRoaXMgdHJhbnNmZXIgKHNpbmdsZSBTL0cgZWxlbWVudCB0cmFuc2ZlciB3aXRoIHRoZQorICogZmlyc3QgZWxlbWVudHMgYWRkcmVzcyBhbmQgbGVuZ3RoIHByZWxvYWRlZCBpbiB0aGUgZGF0YXB0ci9kYXRhY250CisgKiBmaWVsZHMpLiAgSWYgbm8gdHJhbnNmZXIgaXMgdG8gb2NjdXIsIHNncHRyIGlzIHNldCB0byBTR19MSVNUX05VTEwuCisgKiBUaGUgU0dfRlVMTF9SRVNJRCBmbGFnIGVuc3VyZXMgdGhhdCB0aGUgcmVzaWR1YWwgd2lsbCBiZSBjb3JyZWN0bHkKKyAqIG5vdGVkIGV2ZW4gaWYgbm8gZGF0YSB0cmFuc2ZlcnMgb2NjdXIuICBPbmNlIHRoZSBkYXRhIHBoYXNlIGlzIGVudGVyZWQsCisgKiB0aGUgcmVzaWR1YWwgc2dwdHIgYW5kIGRhdGFjbnQgYXJlIGxvYWRlZCBmcm9tIHRoZSBzZ3B0ciBhbmQgdGhlCisgKiBkYXRhY250IGZpZWxkcy4gIEFmdGVyIGVhY2ggUy9HIGVsZW1lbnQncyBkYXRhcHRyIGFuZCBsZW5ndGggYXJlCisgKiBsb2FkZWQgaW50byB0aGUgaGFyZHdhcmUsIHRoZSByZXNpZHVhbCBzZ3B0ciBpcyBhZHZhbmNlZC4gIEFmdGVyCisgKiBlYWNoIFMvRyBlbGVtZW50IGlzIGV4cGlyZWQsIGl0cyBkYXRhY250IGZpZWxkIGlzIGNoZWNrZWQgdG8gc2VlCisgKiBpZiB0aGUgTEFTVF9TRUcgZmxhZyBpcyBzZXQuICBJZiBzbywgU0dfTElTVF9OVUxMIGlzIHNldCBpbiB0aGUKKyAqIHJlc2lkdWFsIHNnIHB0ciBhbmQgdGhlIHRyYW5zZmVyIGlzIGNvbnNpZGVyZWQgY29tcGxldGUuICBJZiB0aGUKKyAqIHNlcXVlbmNlciBkZXRlcm1pbmVzIHRoYXQgdGhlcmUgaXMgYSByZXNpZHVhbCBpbiB0aGUgdHJhbmZlciwgb3IKKyAqIHRoZXJlIGlzIG5vbi16ZXJvIHN0YXR1cywgaXQgd2lsbCBzZXQgdGhlIFNHX1NUQVRVU19WQUxJRCBmbGFnIGluCisgKiBzZ3B0ciBhbmQgZG1hIHRoZSBzY2IgYmFjayBpbnRvIGhvc3QgbWVtb3J5LiAgVG8gc3VtYXJpemU6CisgKgorICogU2VxdWVuY2VyOgorICoJbyBBIHJlc2lkdWFsIGhhcyBvY2N1cnJlZCBpZiBTR19GVUxMX1JFU0lEIGlzIHNldCBpbiBzZ3B0ciwKKyAqCSAgb3IgcmVzaWR1YWxfc2dwdHIgZG9lcyBub3QgaGF2ZSBTR19MSVNUX05VTEwgc2V0LgorICoKKyAqCW8gV2UgYXJlIHRyYW5zZmVyaW5nIHRoZSBsYXN0IHNlZ21lbnQgaWYgcmVzaWR1YWxfZGF0YWNudCBoYXMKKyAqCSAgdGhlIFNHX0xBU1RfU0VHIGZsYWcgc2V0LgorICoKKyAqIEhvc3Q6CisgKglvIEEgcmVzaWR1YWwgY2FuIG9ubHkgaGF2ZSBvY2N1cnJlZCBpZiBhIGNvbXBsZXRlZCBzY2IgaGFzIHRoZQorICoJICBTR19TVEFUVVNfVkFMSUQgZmxhZyBzZXQuICBJbnNwZWN0aW9uIG9mIHRoZSBTQ1NJIHN0YXR1cyBmaWVsZCwKKyAqCSAgdGhlIHJlc2lkdWFsX2RhdGFjbnQsIGFuZCB0aGUgcmVzaWR1YWxfc2dwdHIgZmllbGQgd2lsbCB0ZWxsCisgKgkgIGZvciBzdXJlLgorICoKKyAqCW8gcmVzaWR1YWxfc2dwdHIgYW5kIHNncHRyIHJlZmVyIHRvIHRoZSAibmV4dCIgc2cgZW50cnkKKyAqCSAgYW5kIHNvIG1heSBwb2ludCBiZXlvbmQgdGhlIGxhc3QgdmFsaWQgc2cgZW50cnkgZm9yIHRoZQorICoJICB0cmFuc2Zlci4KKyAqLyAKKyNkZWZpbmUgU0dfUFRSX01BU0sJMHhGRkZGRkZGOAorLyoxNiovCXVpbnQxNl90IHRhZzsJCS8qIFJldXNlZCBieSBTZXF1ZW5jZXIuICovCisvKjE4Ki8JdWludDhfdCAgY29udHJvbDsJLyogU2VlIFNDQl9DT05UUk9MIGluIGFpYzc5eHgucmVnIGZvciBkZXRhaWxzICovCisvKjE5Ki8JdWludDhfdAkgc2NzaWlkOwkvKgorCQkJCSAqIFNlbGVjdGlvbiBvdXQgSWQKKwkJCQkgKiBPdXIgSWQgKGJpdHMgMC0zKSBUaGVpciBJRCAoYml0cyA0LTcpCisJCQkJICovCisvKjIwKi8JdWludDhfdCAgbHVuOworLyoyMSovCXVpbnQ4X3QgIHRhc2tfYXR0cmlidXRlOworLyoyMiovCXVpbnQ4X3QgIGNkYl9sZW47CisvKjIzKi8JdWludDhfdCAgdGFza19tYW5hZ2VtZW50OworLyoyNCovCXVpbnQ2NF90IGRhdGFwdHI7CisvKjMyKi8JdWludDMyX3QgZGF0YWNudDsJLyogQnl0ZSAzIGlzIHNwYXJlLiAqLworLyozNiovCXVpbnQzMl90IHNncHRyOworLyo0MCovCXVpbnQzMl90IGhzY2JfYnVzYWRkcjsKKy8qNDQqLwl1aW50MzJfdCBuZXh0X2hzY2JfYnVzYWRkcjsKKy8qKioqKioqKioqIExvbmcgbHVuIGZpZWxkIG9ubHkgZG93bmxvYWRlZCBmb3IgZnVsbCA4IGJ5dGUgbHVuIHN1cHBvcnQgKioqKioqKiovCisvKjQ4Ki8gIHVpbnQ4X3QJIHBrdF9sb25nX2x1bls4XTsKKy8qKioqKioqIEZpZWxkcyBiZWxvdyBhcmUgbm90IERvd25sb2FkZWQgKFNlcXVlbmNlciBtYXkgdXNlIGZvciBzY3JhdGNoKSAqKioqKiovCisvKjU2Ki8gIHVpbnQ4X3QJIHNwYXJlWzhdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBLZXJuZWwgU0NCIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTb21lIGZpZWxkcyBvZiB0aGUgU0NCIGFyZSBPUyBkZXBlbmRlbnQuICBIZXJlIHdlIGNvbGxlY3QgdGhlCisgKiBkZWZpbml0aW9ucyBmb3IgZWxlbWVudHMgdGhhdCBhbGwgT1MgcGxhdGZvcm1zIG5lZWQgdG8gaW5jbHVkZQorICogaW4gdGhlcmUgU0NCIGRlZmluaXRpb24uCisgKi8KKworLyoKKyAqIERlZmluaXRpb24gb2YgYSBzY2F0dGVyL2dhdGhlciBlbGVtZW50IGFzIHRyYW5zZmVyZWQgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiBUaGUgYWljN3h4eCBjaGlwcyBvbmx5IHN1cHBvcnQgYSAyNGJpdCBsZW5ndGguICBXZSB1c2UgdGhlIHRvcCBieXRlIG9mCisgKiB0aGUgbGVuZ3RoIHRvIHN0b3JlIGFkZGl0aW9uYWwgYWRkcmVzcyBiaXRzIGFuZCBhIGZsYWcgdG8gaW5kaWNhdGUKKyAqIHRoYXQgYSBnaXZlbiBzZWdtZW50IHRlcm1pbmF0ZXMgdGhlIHRyYW5zZmVyLiAgVGhpcyBnaXZlcyB1cyBhbgorICogYWRkcmVzc2FibGUgcmFuZ2Ugb2YgNTEyR0Igb24gbWFjaGluZXMgd2l0aCA2NGJpdCBQQ0kgb3Igd2l0aCBjaGlwcworICogdGhhdCBjYW4gc3VwcG9ydCBkdWFsIGFkZHJlc3MgY3ljbGVzIG9uIDMyYml0IFBDSSBidXNzZXMuCisgKi8KK3N0cnVjdCBhaGRfZG1hX3NlZyB7CisJdWludDMyX3QJYWRkcjsKKwl1aW50MzJfdAlsZW47CisjZGVmaW5lCUFIRF9ETUFfTEFTVF9TRUcJMHg4MDAwMDAwMAorI2RlZmluZQlBSERfU0dfSElHSF9BRERSX01BU0sJMHg3RjAwMDAwMAorI2RlZmluZQlBSERfU0dfTEVOX01BU0sJCTB4MDBGRkZGRkYKK307CisKK3N0cnVjdCBhaGRfZG1hNjRfc2VnIHsKKwl1aW50NjRfdAlhZGRyOworCXVpbnQzMl90CWxlbjsKKwl1aW50MzJfdAlwYWQ7Cit9OworCitzdHJ1Y3QgbWFwX25vZGUgeworCWJ1c19kbWFtYXBfdAkJIGRtYW1hcDsKKwlkbWFfYWRkcl90CQkgcGh5c2FkZHI7CisJdWludDhfdAkJCSp2YWRkcjsKKwlTTElTVF9FTlRSWShtYXBfbm9kZSkJIGxpbmtzOworfTsKKworLyoKKyAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgU0NCLgorICovCit0eXBlZGVmIGVudW0geworCVNDQl9GTEFHX05PTkUJCT0gMHgwMDAwMCwKKwlTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SCT0gMHgwMDAwMSwvKgorCQkJCQkgICAqIFdlIGRldGVjdGVkIGEgcGFyaXR5IG9yIENSQworCQkJCQkgICAqIGVycm9yIHRoYXQgaGFzIGVmZmVjdGVkIHRoZQorCQkJCQkgICAqIHBheWxvYWQgb2YgdGhlIGNvbW1hbmQuICBUaGlzCisJCQkJCSAgICogZmxhZyBpcyBjaGVja2VkIHdoZW4gbm9ybWFsCisJCQkJCSAgICogc3RhdHVzIGlzIHJldHVybmVkIHRvIGNhdGNoCisJCQkJCSAgICogdGhlIGNhc2Ugb2YgYSB0YXJnZXQgbm90CisJCQkJCSAgICogcmVzcG9uZGluZyB0byBvdXIgYXR0ZW1wdAorCQkJCQkgICAqIHRvIHJlcG9ydCB0aGUgZXJyb3IuCisJCQkJCSAgICovCisJU0NCX09USEVSVENMX1RJTUVPVVQJPSAweDAwMDAyLC8qCisJCQkJCSAgICogQW5vdGhlciBkZXZpY2Ugd2FzIGFjdGl2ZQorCQkJCQkgICAqIGR1cmluZyB0aGUgZmlyc3QgdGltZW91dCBmb3IKKwkJCQkJICAgKiB0aGlzIFNDQiBzbyB3ZSBnYXZlIG91cnNlbHZlcworCQkJCQkgICAqIGFuIGFkZGl0aW9uYWwgdGltZW91dCBwZXJpb2QKKwkJCQkJICAgKiBpbiBjYXNlIGl0IHdhcyBob2dnaW5nIHRoZQorCQkJCQkgICAqIGJ1cy4KKwkJCQkgICAgICAgICAgICovCisJU0NCX0RFVklDRV9SRVNFVAk9IDB4MDAwMDQsCisJU0NCX1NFTlNFCQk9IDB4MDAwMDgsCisJU0NCX0NEQjMyX1BUUgkJPSAweDAwMDEwLAorCVNDQl9SRUNPVkVSWV9TQ0IJPSAweDAwMDIwLAorCVNDQl9BVVRPX05FR09USUFURQk9IDB4MDAwNDAsLyogTmVnb3RpYXRlIHRvIGFjaGlldmUgZ29hbC4gKi8KKwlTQ0JfTkVHT1RJQVRFCQk9IDB4MDAwODAsLyogTmVnb3RpYXRpb24gZm9yY2VkIGZvciBjb21tYW5kLiAqLworCVNDQl9BQk9SVAkJPSAweDAwMTAwLAorCVNDQl9BQ1RJVkUJCT0gMHgwMDIwMCwKKwlTQ0JfVEFSR0VUX0lNTUVESUFURQk9IDB4MDA0MDAsCisJU0NCX1BBQ0tFVElaRUQJCT0gMHgwMDgwMCwKKwlTQ0JfRVhQRUNUX1BQUl9CVVNGUkVFCT0gMHgwMTAwMCwKKwlTQ0JfUEtUX1NFTlNFCQk9IDB4MDIwMDAsCisJU0NCX0NNRFBIQVNFX0FCT1JUCT0gMHgwNDAwMCwKKwlTQ0JfT05fQ09MX0xJU1QJCT0gMHgwODAwMCwKKwlTQ0JfU0lMRU5UCQk9IDB4MTAwMDAgLyoKKwkJCQkJICAgKiBCZSBxdWlldCBhYm91dCB0cmFuc21pc3Npb24gdHlwZQorCQkJCQkgICAqIGVycm9ycy4gIFRoZXkgYXJlIGV4cGVjdGVkIGFuZCB3ZQorCQkJCQkgICAqIGRvbid0IHdhbnQgdG8gdXBzZXQgdGhlIHVzZXIuICBUaGlzCisJCQkJCSAgICogZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCBkdXJpbmcgRFYuCisJCQkJCSAgICovCit9IHNjYl9mbGFnOworCitzdHJ1Y3Qgc2NiIHsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiCSAqaHNjYjsKKwl1bmlvbiB7CisJCVNMSVNUX0VOVFJZKHNjYikgIHNsZTsKKwkJTElTVF9FTlRSWShzY2IpCSAgbGU7CisJCVRBSUxRX0VOVFJZKHNjYikgIHRxZTsKKwl9IGxpbmtzOworCXVuaW9uIHsKKwkJU0xJU1RfRU5UUlkoc2NiKSAgc2xlOworCQlMSVNUX0VOVFJZKHNjYikJICBsZTsKKwkJVEFJTFFfRU5UUlkoc2NiKSAgdHFlOworCX0gbGlua3MyOworI2RlZmluZSBwZW5kaW5nX2xpbmtzIGxpbmtzMi5sZQorI2RlZmluZSBjb2xsaXNpb25fbGlua3MgbGlua3MyLmxlCisJc3RydWN0IHNjYgkJICpjb2xfc2NiOworCWFoZF9pb19jdHhfdAkJICBpb19jdHg7CisJc3RydWN0IGFoZF9zb2Z0YwkgKmFoZF9zb2Z0YzsKKwlzY2JfZmxhZwkJICBmbGFnczsKKyNpZm5kZWYgX19saW51eF9fCisJYnVzX2RtYW1hcF90CQkgIGRtYW1hcDsKKyNlbmRpZgorCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbWFwX25vZGUJIAkgKmhzY2JfbWFwOworCXN0cnVjdCBtYXBfbm9kZQkgCSAqc2dfbWFwOworCXN0cnVjdCBtYXBfbm9kZQkgCSAqc2Vuc2VfbWFwOworCXZvaWQJCQkgKnNnX2xpc3Q7CisJdWludDhfdAkJCSAqc2Vuc2VfZGF0YTsKKwlkbWFfYWRkcl90CQkgIHNnX2xpc3RfYnVzYWRkcjsKKwlkbWFfYWRkcl90CQkgIHNlbnNlX2J1c2FkZHI7CisJdV9pbnQJCQkgIHNnX2NvdW50Oy8qIEhvdyBmdWxsIGFoZF9kbWFfc2VnIGlzICovCisjZGVmaW5lCUFIRF9NQVhfTFFfQ1JDX0VSUk9SUyA1CisJdV9pbnQJCQkgIGNyY19yZXRyeV9jb3VudDsKK307CisKK1RBSUxRX0hFQUQoc2NiX3RhaWxxLCBzY2IpOworTElTVF9IRUFEKHNjYl9saXN0LCBzY2IpOworCitzdHJ1Y3Qgc2NiX2RhdGEgeworCS8qCisJICogVEFJTFEgb2YgbGlzdHMgb2YgZnJlZSBTQ0JzIGdyb3VwZWQgYnkgZGV2aWNlCisJICogY29sbGlzaW9uIGRvbWFpbnMuCisJICovCisJc3RydWN0IHNjYl90YWlscSBmcmVlX3NjYnM7CisKKwkvKgorCSAqIFBlci1kZXZpY2UgbGlzdHMgb2YgU0NCcyB3aG9zZSB0YWcgSUQgd291bGQgY29sbGlkZQorCSAqIHdpdGggYW4gYWxyZWFkeSBhY3RpdmUgdGFnIG9uIHRoZSBkZXZpY2UuCisJICovCisJc3RydWN0IHNjYl9saXN0IGZyZWVfc2NiX2xpc3RzW0FIRF9OVU1fVEFSR0VUUyAqIEFIRF9OVU1fTFVOU19OT05QS1RdOworCisJLyoKKwkgKiBTQ0JzIHRoYXQgd2lsbCBub3QgY29sbGlkZSB3aXRoIGFueSBhY3RpdmUgZGV2aWNlLgorCSAqLworCXN0cnVjdCBzY2JfbGlzdCBhbnlfZGV2X2ZyZWVfc2NiX2xpc3Q7CisKKwkvKgorCSAqIE1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCLgorCSAqLworCXN0cnVjdAlzY2IgKnNjYmluZGV4W0FIRF9TQ0JfTUFYXTsKKworCS8qCisJICogIkJ1cyIgYWRkcmVzc2VzIG9mIG91ciBkYXRhIHN0cnVjdHVyZXMuCisJICovCisJYnVzX2RtYV90YWdfdAkgaHNjYl9kbWF0OwkvKiBkbWF0IGZvciBvdXIgaGFyZHdhcmUgU0NCIGFycmF5ICovCisJYnVzX2RtYV90YWdfdAkgc2dfZG1hdDsJLyogZG1hdCBmb3Igb3VyIHNnIHNlZ21lbnRzICovCisJYnVzX2RtYV90YWdfdAkgc2Vuc2VfZG1hdDsJLyogZG1hdCBmb3Igb3VyIHNlbnNlIGJ1ZmZlcnMgKi8KKwlTTElTVF9IRUFEKCwgbWFwX25vZGUpIGhzY2JfbWFwczsKKwlTTElTVF9IRUFEKCwgbWFwX25vZGUpIHNnX21hcHM7CisJU0xJU1RfSEVBRCgsIG1hcF9ub2RlKSBzZW5zZV9tYXBzOworCWludAkJIHNjYnNfbGVmdDsJLyogdW5hbGxvY2F0ZWQgc2NicyBpbiBoZWFkIG1hcF9ub2RlICovCisJaW50CQkgc2dzX2xlZnQ7CS8qIHVuYWxsb2NhdGVkIHNncyBpbiBoZWFkIG1hcF9ub2RlICovCisJaW50CQkgc2Vuc2VfbGVmdDsJLyogdW5hbGxvY2F0ZWQgc2Vuc2UgaW4gaGVhZCBtYXBfbm9kZSAqLworCXVpbnQxNl90CSBudW1zY2JzOworCXVpbnQxNl90CSBtYXhoc2NiczsJLyogTnVtYmVyIG9mIFNDQnMgb24gdGhlIGNhcmQgKi8KKwl1aW50OF90CQkgaW5pdF9sZXZlbDsJLyoKKwkJCQkJICogSG93IGZhciB3ZSd2ZSBpbml0aWFsaXplZAorCQkJCQkgKiB0aGlzIHN0cnVjdHVyZS4KKwkJCQkJICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlIERlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29ubmVjdGlvbiBkZXNjaXB0b3IgZm9yIHNlbGVjdC1pbiByZXF1ZXN0cyBpbiB0YXJnZXQgbW9kZS4KKyAqLworc3RydWN0IHRhcmdldF9jbWQgeworCXVpbnQ4X3Qgc2NzaWlkOwkJLyogT3VyIElEIGFuZCB0aGUgaW5pdGlhdG9yJ3MgSUQgKi8KKwl1aW50OF90IGlkZW50aWZ5OwkvKiBJZGVudGlmeSBtZXNzYWdlICovCisJdWludDhfdCBieXRlc1syMl07CS8qIAorCQkJCSAqIEJ5dGVzIGNvbnRhaW5zIGFueSBhZGRpdGlvbmFsIG1lc3NhZ2UKKwkJCQkgKiBieXRlcyB0ZXJtaW5hdGVkIGJ5IDB4RkYuICBUaGUgcmVtYWluZGVyCisJCQkJICogaXMgdGhlIGNkYiB0byBleGVjdXRlLgorCQkJCSAqLworCXVpbnQ4X3QgY21kX3ZhbGlkOwkvKgorCQkJCSAqIFdoZW4gYSBjb21tYW5kIGlzIGNvbXBsZXRlLCB0aGUgZmlybXdhcmUKKwkJCQkgKiB3aWxsIHNldCBjbWRfdmFsaWQgdG8gYWxsIGJpdHMgc2V0LgorCQkJCSAqIEFmdGVyIHRoZSBob3N0IGhhcyBzZWVuIHRoZSBjb21tYW5kLAorCQkJCSAqIHRoZSBiaXRzIGFyZSBjbGVhcmVkLiAgVGhpcyBhbGxvd3MgdXMKKwkJCQkgKiB0byBqdXN0IHBlZWsgYXQgaG9zdCBtZW1vcnkgdG8gZGV0ZXJtaW5lCisJCQkJICogaWYgbW9yZSB3b3JrIGlzIGNvbXBsZXRlLiBjbWRfdmFsaWQgaXMgb24KKwkJCQkgKiBhbiA4IGJ5dGUgYm91bmRhcnkgdG8gc2ltcGxpZnkgc2V0dGluZworCQkJCSAqIGl0IG9uIGFpYzc4ODAgaGFyZHdhcmUgd2hpY2ggb25seSBoYXMKKwkJCQkgKiBsaW1pdGVkIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIERNQSBGSUZPLgorCQkJCSAqLworCXVpbnQ4X3QgcGFkWzddOworfTsKKworLyoKKyAqIE51bWJlciBvZiBldmVudHMgd2UgY2FuIGJ1ZmZlciB1cCBpZiB3ZSBydW4gb3V0CisgKiBvZiBpbW1lZGlhdGUgbm90aWZ5IGNjYnMuCisgKi8KKyNkZWZpbmUgQUhEX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFIDgKK3N0cnVjdCBhaGRfdG1vZGVfZXZlbnQgeworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgZXZlbnRfdHlwZTsJLyogTVNHIHR5cGUgb3IgRVZFTlRfVFlQRV9CVVNfUkVTRVQgKi8KKyNkZWZpbmUJRVZFTlRfVFlQRV9CVVNfUkVTRVQgMHhGRgorCXVpbnQ4X3QgZXZlbnRfYXJnOworfTsKKworLyoKKyAqIFBlciBlbmFibGVkIGx1biB0YXJnZXQgbW9kZSBzdGF0ZS4KKyAqIEFzIHRoaXMgc3RhdGUgaXMgZGlyZWN0bHkgaW5mbHVlbmNlZCBieSB0aGUgaG9zdCBPUydlcyB0YXJnZXQgbW9kZQorICogZW52aXJvbm1lbnQsIHdlIGxldCB0aGUgT1MgbW9kdWxlIGRlZmluZSBpdC4gIEZvcndhcmQgZGVjbGFyZSB0aGUKKyAqIHN0cnVjdHVyZSBoZXJlIHNvIHdlIGNhbiBzdG9yZSBhcnJheXMgb2YgdGhlbSwgZXRjLiBpbiBPUyBuZXV0cmFsCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKi8KKyNpZmRlZiBBSERfVEFSR0VUX01PREUgCitzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZSB7CisJc3RydWN0IGNhbV9wYXRoICpwYXRoOworCXN0cnVjdCBjY2JfaGRyX3NsaXN0IGFjY2VwdF90aW9zOworCXN0cnVjdCBjY2JfaGRyX3NsaXN0IGltbWVkX25vdGlmaWVzOworCXN0cnVjdCBhaGRfdG1vZGVfZXZlbnQgZXZlbnRfYnVmZmVyW0FIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRV07CisJdWludDhfdCBldmVudF9yX2lkeDsKKwl1aW50OF90IGV2ZW50X3dfaWR4OworfTsKKyNlbHNlCitzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKiogVHJhbnNmZXIgTmVnb3RpYXRpb24gRGF0YXN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBSERfVFJBTlNfQ1VSCQkweDAxCS8qIE1vZGlmeSBjdXJyZW50IG5lb2d0aWF0aW9uIHN0YXR1cyAqLworI2RlZmluZSBBSERfVFJBTlNfQUNUSVZFCTB4MDMJLyogQXNzdW1lIHRoaXMgdGFyZ2V0IGlzIG9uIHRoZSBidXMgKi8KKyNkZWZpbmUgQUhEX1RSQU5TX0dPQUwJCTB4MDQJLyogTW9kaWZ5IG5lZ290aWF0aW9uIGdvYWwgKi8KKyNkZWZpbmUgQUhEX1RSQU5TX1VTRVIJCTB4MDgJLyogTW9kaWZ5IHVzZXIgbmVnb3RpYXRpb24gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQUhEX1BFUklPRF8xME1IegkweDE5CisKKyNkZWZpbmUgQUhEX1dJRFRIX1VOS05PV04JMHhGRgorI2RlZmluZSBBSERfUEVSSU9EX1VOS05PV04JMHhGRgorI2RlZmluZSBBSERfT0ZGU0VUX1VOS05PV04JMHhGRgorI2RlZmluZSBBSERfUFBSX09QVFNfVU5LTk9XTgkweEZGCisKKy8qCisgKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiBJbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGFoZF90cmFuc2luZm8geworCXVpbnQ4X3QgcHJvdG9jb2xfdmVyc2lvbjsJLyogU0NTSSBSZXZpc2lvbiBsZXZlbCAqLworCXVpbnQ4X3QgdHJhbnNwb3J0X3ZlcnNpb247CS8qIFNQSSBSZXZpc2lvbiBsZXZlbCAqLworCXVpbnQ4X3Qgd2lkdGg7CQkJLyogQnVzIHdpZHRoICovCisJdWludDhfdCBwZXJpb2Q7CQkJLyogU3luYyByYXRlIGZhY3RvciAqLworCXVpbnQ4X3Qgb2Zmc2V0OwkJCS8qIFN5bmMgb2Zmc2V0ICovCisJdWludDhfdCBwcHJfb3B0aW9uczsJCS8qIFBhcmFsbGVsIFByb3RvY29sIFJlcXVlc3Qgb3B0aW9ucyAqLworfTsKKworLyoKKyAqIFBlci1pbml0aWF0b3IgY3VycmVudCwgZ29hbCBhbmQgdXNlciB0cmFuc2ZlciBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbi4gKi8KK3N0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvIHsKKwlzdHJ1Y3QgYWhkX3RyYW5zaW5mbyBjdXJyOworCXN0cnVjdCBhaGRfdHJhbnNpbmZvIGdvYWw7CisJc3RydWN0IGFoZF90cmFuc2luZm8gdXNlcjsKK307CisKKy8qCisgKiBQZXIgZW5hYmxlZCB0YXJnZXQgSUQgc3RhdGUuCisgKiBQb2ludGVycyB0byBsdW4gdGFyZ2V0IHN0YXRlIGFzIHdlbGwgYXMgc3luYy93aWRlIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgZWFjaCBpbml0aWF0b3I8LT50YXJnZXQgbWFwcGluZy4gIEZvciB0aGUgaW5pdGlhdG9yIHJvbGUgd2UgcHJldGVuZAorICogdGhhdCB3ZSBhcmUgdGhlIHRhcmdldCBhbmQgdGhlIHRhcmdldHMgYXJlIHRoZSBpbml0aWF0b3JzIHNpbmNlIHRoZQorICogbmVnb3RpYXRpb24gaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiByb2xlLgorICovCitzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSB7CisJc3RydWN0IGFoZF90bW9kZV9sc3RhdGUqCWVuYWJsZWRfbHVuc1tBSERfTlVNX0xVTlNdOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvCXRyYW5zaW5mb1tBSERfTlVNX1RBUkdFVFNdOworCisJLyoKKwkgKiBQZXIgaW5pdGlhdG9yIHN0YXRlIGJpdG1hc2tzLgorCSAqLworCXVpbnQxNl90CSBhdXRvX25lZ290aWF0ZTsvKiBBdXRvIE5lZ290aWF0aW9uIFJlcXVpcmVkICovCisJdWludDE2X3QJIGRpc2NlbmFibGU7CS8qIERpc2Nvbm5lY3Rpb24gYWxsb3dlZCAgKi8KKwl1aW50MTZfdAkgdGFnZW5hYmxlOwkvKiBUYWdnZWQgUXVldWluZyBhbGxvd2VkICovCit9OworCisvKgorICogUG9pbnRzIG9mIGludGVyZXN0IGFsb25nIHRoZSBuZWdvdGlhdGVkIHRyYW5zZmVyIHNjYWxlLgorICovCisjZGVmaW5lIEFIRF9TWU5DUkFURV8xNjAJMHg4CisjZGVmaW5lIEFIRF9TWU5DUkFURV9QQUNFRAkweDgKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX0RUCQkweDkKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX1VMVFJBMgkweGEKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX1VMVFJBCTB4YworI2RlZmluZSBBSERfU1lOQ1JBVEVfRkFTVAkweDE5CisjZGVmaW5lIEFIRF9TWU5DUkFURV9NSU5fRFQJQUhEX1NZTkNSQVRFX0ZBU1QKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX1NZTkMJMHgzMgorI2RlZmluZSBBSERfU1lOQ1JBVEVfTUlOCTB4NjAKKyNkZWZpbmUJQUhEX1NZTkNSQVRFX0FTWU5DCTB4RkYKKyNkZWZpbmUgQUhEX1NZTkNSQVRFX01BWAlBSERfU1lOQ1JBVEVfMTYwCisKKy8qIFNhZmUgYW5kIHZhbGlkIHBlcmlvZCBmb3IgYXN5bmMgbmVnb3RpYXRpb25zLiAqLworI2RlZmluZQlBSERfQVNZTkNfWEZFUl9QRVJJT0QJMHg0NAorCisvKgorICogSW4gUmV2QSwgdGhlIHN5bmN0YWJsZSB1c2VzIGEgMTIwTUh6IHJhdGUgZm9yIHRoZSBwZXJpb2QKKyAqIGZhY3RvciA4IGFuZCAxNjBNSHogZm9yIHRoZSBwZXJpb2QgZmFjdG9yIDcuICBUaGUgMTIwTUh6CisgKiByYXRlIG5ldmVyIG1hZGUgaXQgaW50byB0aGUgb2ZmaWNpYWwgU0NTSSBzcGVjLCBzbyB3ZSBtdXN0CisgKiBjb21wZW5zYXRlIHdoZW4gc2V0dGluZyB0aGUgbmVnb3RpYXRpb24gdGFibGUgZm9yIFJldiBBCisgKiBwYXJ0cy4KKyAqLworI2RlZmluZSBBSERfU1lOQ1JBVEVfUkVWQV8xMjAJMHg4CisjZGVmaW5lIEFIRF9TWU5DUkFURV9SRVZBXzE2MAkweDcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvb2t1cCBUYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQaGFzZSAtPiBuYW1lIGFuZCBtZXNzYWdlIG91dCByZXNwb25zZQorICogdG8gcGFyaXR5IGVycm9ycyBpbiBlYWNoIHBoYXNlIHRhYmxlLiAKKyAqLworc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSB7CisgICAgICAgIHVpbnQ4X3QgcGhhc2U7CisgICAgICAgIHVpbnQ4X3QgbWVzZ19vdXQ7IC8qIE1lc3NhZ2UgcmVzcG9uc2UgdG8gcGFyaXR5IGVycm9ycyAqLworCWNoYXIgKnBoYXNlbXNnOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcmlhbCBFRVBST00gRm9ybWF0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHNlZXByb21fY29uZmlnIHsKKy8qCisgKiBQZXIgU0NTSSBJRCBDb25maWd1cmF0aW9uIEZsYWdzCisgKi8KKwl1aW50MTZfdCBkZXZpY2VfZmxhZ3NbMTZdOwkvKiB3b3JkcyAwLTE1ICovCisjZGVmaW5lCQlDRlhGRVIJCTB4MDAzRgkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lCQkJQ0ZYRkVSX0FTWU5DCTB4M0YKKyNkZWZpbmUJCUNGUUFTCQkweDAwNDAJLyogTmVnb3RpYXRlIFFBUyAqLworI2RlZmluZQkJQ0ZQQUNLRVRJWkVECTB4MDA4MAkvKiBOZWdvdGlhdGUgUGFja2V0aXplZCBUcmFuc2ZlcnMgKi8KKyNkZWZpbmUJCUNGU1RBUlQJCTB4MDEwMAkvKiBzZW5kIHN0YXJ0IHVuaXQgU0NTSSBjb21tYW5kICovCisjZGVmaW5lCQlDRklOQ0JJT1MJMHgwMjAwCS8qIGluY2x1ZGUgaW4gQklPUyBzY2FuICovCisjZGVmaW5lCQlDRkRJU0MJCTB4MDQwMAkvKiBlbmFibGUgZGlzY29ubmVjdGlvbiAqLworI2RlZmluZQkJQ0ZNVUxUSUxVTkRFVgkweDA4MDAJLyogUHJvYmUgbXVsdGlwbGUgbHVucyBpbiBCSU9TIHNjYW4gKi8KKyNkZWZpbmUJCUNGV0lERUIJCTB4MTAwMAkvKiB3aWRlIGJ1cyBkZXZpY2UgKi8KKyNkZWZpbmUJCUNGSE9TVE1BTkFHRUQJMHg4MDAwCS8qIE1hbmFnZWQgYnkgYSBSQUlEIGNvbnRyb2xsZXIgKi8KKworLyoKKyAqIEJJT1MgQ29udHJvbCBCaXRzCisgKi8KKwl1aW50MTZfdCBiaW9zX2NvbnRyb2w7CQkvKiB3b3JkIDE2ICovCisjZGVmaW5lCQlDRlNVUFJFTQkweDAwMDEJLyogc3VwcG9ydCBhbGwgcmVtb3ZlYWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUJCUNGU1VQUkVNQgkweDAwMDIJLyogc3VwcG9ydCByZW1vdmVhYmxlIGJvb3QgZHJpdmVzICovCisjZGVmaW5lCQlDRkJJT1NTVEFURQkweDAwMEMJLyogQklPUyBBY3Rpb24gU3RhdGUgKi8KKyNkZWZpbmUJCSAgICBDRkJTX0RJU0FCTEVECTB4MDAKKyNkZWZpbmUJCSAgICBDRkJTX0VOQUJMRUQJMHgwNAorI2RlZmluZQkJICAgIENGQlNfRElTQUJMRURfU0NBTgkweDA4CisjZGVmaW5lCQlDRkVOQUJMRURWCTB4MDAxMAkvKiBQZXJmb3JtIERvbWFpbiBWYWxpZGF0aW9uICovCisjZGVmaW5lCQlDRkNUUkxfQQkweDAwMjAJLyogQklPUyBkaXNwbGF5cyBDdHJsLUEgbWVzc2FnZSAqLwkKKyNkZWZpbmUJCUNGU1BBUklUWQkweDAwNDAJLyogU0NTSSBwYXJpdHkgKi8KKyNkZWZpbmUJCUNGRVhURU5ECTB4MDA4MAkvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiBlbmFibGVkICovCisjZGVmaW5lCQlDRkJPT1RDRAkweDAxMDAgIC8qIFN1cHBvcnQgQm9vdGFibGUgQ0QtUk9NICovCisjZGVmaW5lCQlDRk1TR19MRVZFTAkweDA2MDAJLyogQklPUyBNZXNzYWdlIExldmVsICovCisjZGVmaW5lCQkJQ0ZNU0dfVkVSQk9TRQkweDAwMDAKKyNkZWZpbmUJCQlDRk1TR19TSUxFTlQJMHgwMjAwCisjZGVmaW5lCQkJQ0ZNU0dfRElBRwkweDA0MDAKKyNkZWZpbmUJCUNGUkVTRVRCCTB4MDgwMAkvKiByZXNldCBTQ1NJIGJ1cyBhdCBib290ICovCisvKgkJVU5VU0VECQkweGYwMDAJKi8KKworLyoKKyAqIEhvc3QgQWRhcHRlciBDb250cm9sIEJpdHMKKyAqLworCXVpbnQxNl90IGFkYXB0ZXJfY29udHJvbDsJLyogd29yZCAxNyAqLwkKKyNkZWZpbmUJCUNGQVVUT1RFUk0JMHgwMDAxCS8qIFBlcmZvcm0gQXV0byB0ZXJtaW5hdGlvbiAqLworI2RlZmluZQkJQ0ZTVEVSTQkJMHgwMDAyCS8qIFNDU0kgbG93IGJ5dGUgdGVybWluYXRpb24gKi8KKyNkZWZpbmUJCUNGV1NURVJNCTB4MDAwNAkvKiBTQ1NJIGhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAqLworI2RlZmluZQkJQ0ZTRUFVVE9URVJNCTB4MDAwOAkvKiBVbHRyYTIgUGVyZm9ybSBzZWNvbmRhcnkgQXV0byBUZXJtKi8KKyNkZWZpbmUJCUNGU0VMT1dURVJNCTB4MDAxMAkvKiBVbHRyYTIgc2Vjb25kYXJ5IGxvdyB0ZXJtICovCisjZGVmaW5lCQlDRlNFSElHSFRFUk0JMHgwMDIwCS8qIFVsdHJhMiBzZWNvbmRhcnkgaGlnaCB0ZXJtICovCisjZGVmaW5lCQlDRlNUUFdMRVZFTAkweDAwNDAJLyogVGVybWluYXRpb24gbGV2ZWwgY29udHJvbCAqLworI2RlZmluZQkJQ0ZCSU9TQVVUT1RFUk0JMHgwMDgwCS8qIFBlcmZvcm0gQXV0byB0ZXJtaW5hdGlvbiAqLworI2RlZmluZQkJQ0ZURVJNX01FTlUJMHgwMTAwCS8qIEJJT1MgZGlzcGxheXMgdGVybWluYXRpb24gbWVudSAqLwkKKyNkZWZpbmUJCUNGQ0xVU1RFUkVOQgkweDgwMDAJLyogQ2x1c3RlciBFbmFibGUgKi8KKworLyoKKyAqIEJ1cyBSZWxlYXNlIFRpbWUsIEhvc3QgQWRhcHRlciBJRAorICovCisJdWludDE2X3QgYnJ0aW1lX2lkOwkJLyogd29yZCAxOCAqLworI2RlZmluZQkJQ0ZTQ1NJSUQJMHgwMDBmCS8qIGhvc3QgYWRhcHRlciBTQ1NJIElEICovCisvKgkJVU5VU0VECQkweDAwZjAJKi8KKyNkZWZpbmUJCUNGQlJUSU1FCTB4ZmYwMAkvKiBidXMgcmVsZWFzZSB0aW1lL1BDSSBMYXRlbmN5IFRpbWUgKi8KKworLyoKKyAqIE1heGltdW0gdGFyZ2V0cworICovCisJdWludDE2X3QgbWF4X3RhcmdldHM7CQkvKiB3b3JkIDE5ICovCQorI2RlZmluZQkJQ0ZNQVhUQVJHCTB4MDBmZgkvKiBtYXhpbXVtIHRhcmdldHMgKi8KKyNkZWZpbmUJCUNGQk9PVExVTgkweDBmMDAJLyogTHVuIHRvIGJvb3QgZnJvbSAqLworI2RlZmluZQkJQ0ZCT09USUQJMHhmMDAwCS8qIFRhcmdldCB0byBib290IGZyb20gKi8KKwl1aW50MTZfdCByZXNfMVsxMF07CQkvKiB3b3JkcyAyMC0yOSAqLworCXVpbnQxNl90IHNpZ25hdHVyZTsJCS8qIEJJT1MgU2lnbmF0dXJlICovCisjZGVmaW5lCQlDRlNJR05BVFVSRQkweDQwMAorCXVpbnQxNl90IGNoZWNrc3VtOwkJLyogd29yZCAzMSAqLworfTsKKworLyoKKyAqIFZpdGFsIFByb2R1Y3QgRGF0YSB1c2VkIGR1cmluZyBQT1NUIGFuZCBieSB0aGUgQklPUy4KKyAqLworc3RydWN0IHZwZF9jb25maWcgeworCXVpbnQ4X3QgIGJpb3NfZmxhZ3M7CisjZGVmaW5lCQlWUERNQVNURVJCSU9TCTB4MDAwMQorI2RlZmluZQkJVlBEQk9PVEhPU1QJMHgwMDAyCisJdWludDhfdCAgcmVzZXJ2ZWRfMVsyMV07CisJdWludDhfdCAgcmVzb3VyY2VfdHlwZTsKKwl1aW50OF90ICByZXNvdXJjZV9sZW5bMl07CisJdWludDhfdCAgcmVzb3VyY2VfZGF0YVs4XTsKKwl1aW50OF90ICB2cGRfdGFnOworCXVpbnQxNl90IHZwZF9sZW47CisJdWludDhfdCAgdnBkX2tleXdvcmRbMl07CisJdWludDhfdCAgbGVuZ3RoOworCXVpbnQ4X3QgIHJldmlzaW9uOworCXVpbnQ4X3QgIGRldmljZV9mbGFnczsKKwl1aW50OF90ICB0ZXJtbmF0aW9uX21lbnVzWzJdOworCXVpbnQ4X3QgIGZpZm9fdGhyZXNob2xkOworCXVpbnQ4X3QgIGVuZF90YWc7CisJdWludDhfdCAgdnBkX2NoZWNrc3VtOworCXVpbnQxNl90IGRlZmF1bHRfdGFyZ2V0X2ZsYWdzOworCXVpbnQxNl90IGRlZmF1bHRfYmlvc19mbGFnczsKKwl1aW50MTZfdCBkZWZhdWx0X2N0cmxfZmxhZ3M7CisJdWludDhfdCAgZGVmYXVsdF9pcnE7CisJdWludDhfdCAgcGNpX2xhdHRpbWU7CisJdWludDhfdCAgbWF4X3RhcmdldDsKKwl1aW50OF90ICBib290X2x1bjsKKwl1aW50MTZfdCBzaWduYXR1cmU7CisJdWludDhfdCAgcmVzZXJ2ZWRfMjsKKwl1aW50OF90ICBjaGVja3N1bTsKKwl1aW50OF90CSByZXNlcnZlZF8zWzRdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGbGV4cG9ydCBMb2dpYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRkxYQUREUl9URVJNQ1RMCQkJMHgwCisjZGVmaW5lCQlGTFhfVEVSTUNUTF9FTlNFQ0hJR0gJMHg4CisjZGVmaW5lCQlGTFhfVEVSTUNUTF9FTlNFQ0xPVwkweDQKKyNkZWZpbmUJCUZMWF9URVJNQ1RMX0VOUFJJSElHSAkweDIKKyNkZWZpbmUJCUZMWF9URVJNQ1RMX0VOUFJJTE9XCTB4MQorI2RlZmluZSBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwJMHgxCisjZGVmaW5lCQlGTFhfUk9NU1RBVF9TRUVDRkcJMHhGMAorI2RlZmluZQkJRkxYX1JPTVNUQVRfRUVDRkcJMHgwRgorI2RlZmluZQkJRkxYX1JPTVNUQVRfU0VFXzkzQzY2CTB4MDAKKyNkZWZpbmUJCUZMWF9ST01TVEFUX1NFRV9OT05FCTB4RjAKKyNkZWZpbmUJCUZMWF9ST01TVEFUX0VFXzUxMng4CTB4MAorI2RlZmluZQkJRkxYX1JPTVNUQVRfRUVfMU1CeDgJMHgxCisjZGVmaW5lCQlGTFhfUk9NU1RBVF9FRV8yTUJ4OAkweDIKKyNkZWZpbmUJCUZMWF9ST01TVEFUX0VFXzRNQng4CTB4MworI2RlZmluZQkJRkxYX1JPTVNUQVRfRUVfMTZNQng4CTB4NAorI2RlZmluZSAJCUNVUlNFTlNFX0VOQgkweDEKKyNkZWZpbmUJRkxYQUREUl9GTEVYU1RBVAkJMHgyCisjZGVmaW5lCQlGTFhfRlNUQVRfQlVTWQkJMHgxCisjZGVmaW5lIEZMWEFERFJfQ1VSUkVOVF9TVEFUCQkweDQKKyNkZWZpbmUJCUZMWF9DU1RBVF9TRUNfSElHSAkweEMwCisjZGVmaW5lCQlGTFhfQ1NUQVRfU0VDX0xPVwkweDMwCisjZGVmaW5lCQlGTFhfQ1NUQVRfUFJJX0hJR0gJMHgwQworI2RlZmluZQkJRkxYX0NTVEFUX1BSSV9MT1cJMHgwMworI2RlZmluZQkJRkxYX0NTVEFUX01BU0sJCTB4MDMKKyNkZWZpbmUJCUZMWF9DU1RBVF9TSElGVAkJMgorI2RlZmluZQkJRkxYX0NTVEFUX09LQVkJCTB4MAorI2RlZmluZQkJRkxYX0NTVEFUX09WRVIJCTB4MQorI2RlZmluZQkJRkxYX0NTVEFUX1VOREVSCQkweDIKKyNkZWZpbmUJCUZMWF9DU1RBVF9JTlZBTElECTB4MworCitpbnQJCWFoZF9yZWFkX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1aW50MTZfdCAqYnVmLAorCQkJCSB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCwgaW50IGJzdHJlYW0pOworCitpbnQJCWFoZF93cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdWludDE2X3QgKmJ1ZiwKKwkJCQkgIHVfaW50IHN0YXJ0X2FkZHIsIHVfaW50IGNvdW50KTsKK2ludAkJYWhkX3dhaXRfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CQlhaGRfdmVyaWZ5X3ZwZF9ja3N1bShzdHJ1Y3QgdnBkX2NvbmZpZyAqdnBkKTsKK2ludAkJYWhkX3ZlcmlmeV9ja3N1bShzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKK2ludAkJYWhkX2FjcXVpcmVfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9pZAkJYWhkX3JlbGVhc2Vfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTWVzc2FnZSBCdWZmZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlNU0dfRkxBR19OT05FCQkJPSAweDAwLAorCU1TR19GTEFHX0VYUEVDVF9QUFJfQlVTRlJFRQk9IDB4MDEsCisJTVNHX0ZMQUdfSVVfUkVRX0NIQU5HRUQJCT0gMHgwMiwKKwlNU0dfRkxBR19FWFBFQ1RfSURFX0JVU0ZSRUUJPSAweDA0LAorCU1TR19GTEFHX0VYUEVDVF9RQVNSRUpfQlVTRlJFRQk9IDB4MDgsCisJTVNHX0ZMQUdfUEFDS0VUSVpFRAkJPSAweDEwCit9IGFoZF9tc2dfZmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisJTVNHX1RZUEVfTk9ORQkJCT0gMHgwMCwKKwlNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUCT0gMHgwMSwKKwlNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU4JPSAweDAyLAorCU1TR19UWVBFX1RBUkdFVF9NU0dPVVQJCT0gMHgwMywKKwlNU0dfVFlQRV9UQVJHRVRfTVNHSU4JCT0gMHgwNAorfSBhaGRfbXNnX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJTVNHTE9PUF9JTl9QUk9HLAorCU1TR0xPT1BfTVNHQ09NUExFVEUsCisJTVNHTE9PUF9URVJNSU5BVEVECit9IG1zZ19sb29wX3N0YXQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBTb2Z0d2FyZSBDb25maWd1cmF0aW9uIFN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhkX3N1c3BlbmRfY2hhbm5lbF9zdGF0ZSB7CisJdWludDhfdAlzY3Npc2VxOworCXVpbnQ4X3QJc3hmcmN0bDA7CisJdWludDhfdAlzeGZyY3RsMTsKKwl1aW50OF90CXNpbW9kZTA7CisJdWludDhfdAlzaW1vZGUxOworCXVpbnQ4X3QJc2VsdGltZXI7CisJdWludDhfdAlzZXFjdGw7Cit9OworCitzdHJ1Y3QgYWhkX3N1c3BlbmRfc3RhdGUgeworCXN0cnVjdAlhaGRfc3VzcGVuZF9jaGFubmVsX3N0YXRlIGNoYW5uZWxbMl07CisJdWludDhfdAlvcHRpb25tb2RlOworCXVpbnQ4X3QJZHNjb21tYW5kMDsKKwl1aW50OF90CWRzcGNpc3RhdHVzOworCS8qIGhzbWFpbGJveCAqLworCXVpbnQ4X3QJY3JjY29udHJvbDE7CisJdWludDhfdAlzY2JiYWRkcjsKKwkvKiBIb3N0IGFuZCBzZXF1ZW5jZXIgU0NCIGNvdW50cyAqLworCXVpbnQ4X3QJZGZmX3RocnNoOworCXVpbnQ4X3QJKnNjcmF0Y2hfcmFtOworCXVpbnQ4X3QJKmJ0dDsKK307CisKK3R5cGVkZWYgdm9pZCAoKmFoZF9idXNfaW50cl90KShzdHJ1Y3QgYWhkX3NvZnRjICopOworCit0eXBlZGVmIGVudW0geworCUFIRF9NT0RFX0RGRjAsCisJQUhEX01PREVfREZGMSwKKwlBSERfTU9ERV9DQ0hBTiwKKwlBSERfTU9ERV9TQ1NJLAorCUFIRF9NT0RFX0NGRywKKwlBSERfTU9ERV9VTktOT1dOCit9IGFoZF9tb2RlOworCisjZGVmaW5lIEFIRF9NS19NU0soeCkgKDB4MDEgPDwgKHgpKQorI2RlZmluZSBBSERfTU9ERV9ERkYwX01TSwlBSERfTUtfTVNLKEFIRF9NT0RFX0RGRjApCisjZGVmaW5lIEFIRF9NT0RFX0RGRjFfTVNLCUFIRF9NS19NU0soQUhEX01PREVfREZGMSkKKyNkZWZpbmUgQUhEX01PREVfQ0NIQU5fTVNLCUFIRF9NS19NU0soQUhEX01PREVfQ0NIQU4pCisjZGVmaW5lIEFIRF9NT0RFX1NDU0lfTVNLCUFIRF9NS19NU0soQUhEX01PREVfU0NTSSkKKyNkZWZpbmUgQUhEX01PREVfQ0ZHX01TSwlBSERfTUtfTVNLKEFIRF9NT0RFX0NGRykKKyNkZWZpbmUgQUhEX01PREVfVU5LTk9XTl9NU0sJQUhEX01LX01TSyhBSERfTU9ERV9VTktOT1dOKQorI2RlZmluZSBBSERfTU9ERV9BTllfTVNLICh+MCkKKwordHlwZWRlZiB1aW50OF90IGFoZF9tb2RlX3N0YXRlOworCit0eXBlZGVmIHZvaWQgYWhkX2NhbGxiYWNrX3QgKHZvaWQgKik7CisKK3N0cnVjdCBhaGRfc29mdGMgeworCWJ1c19zcGFjZV90YWdfdCAgICAgICAgICAgdGFnc1syXTsKKwlidXNfc3BhY2VfaGFuZGxlX3QgICAgICAgIGJzaHNbMl07CisjaWZuZGVmIF9fbGludXhfXworCWJ1c19kbWFfdGFnX3QJCSAgYnVmZmVyX2RtYXQ7ICAgLyogZG1hdCBmb3IgYnVmZmVyIEkvTyAqLworI2VuZGlmCisJc3RydWN0IHNjYl9kYXRhCQkgIHNjYl9kYXRhOworCisJc3RydWN0IGhhcmR3YXJlX3NjYgkgKm5leHRfcXVldWVkX2hzY2I7CisKKwkvKgorCSAqIFNDQnMgdGhhdCBoYXZlIGJlZW4gc2VudCB0byB0aGUgY29udHJvbGxlcgorCSAqLworCUxJU1RfSEVBRCgsIHNjYikJICBwZW5kaW5nX3NjYnM7CisKKwkvKgorCSAqIEN1cnJlbnQgcmVnaXN0ZXIgd2luZG93IG1vZGUgaW5mb3JtYXRpb24uCisJICovCisJYWhkX21vZGUJCSAgZHN0X21vZGU7CisJYWhkX21vZGUJCSAgc3JjX21vZGU7CisKKwkvKgorCSAqIFNhdmVkIHJlZ2lzdGVyIHdpbmRvdyBtb2RlIGluZm9ybWF0aW9uCisJICogdXNlZCBmb3IgcmVzdG9yZSBvbiBuZXh0IHVucGF1c2UuCisJICovCisJYWhkX21vZGUJCSAgc2F2ZWRfZHN0X21vZGU7CisJYWhkX21vZGUJCSAgc2F2ZWRfc3JjX21vZGU7CisKKwkvKgorCSAqIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEuCisJICovCisJc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworCisJLyoKKwkgKiBQbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uCisJICovCisJYWhkX2Rldl9zb2Z0Y190CQkgIGRldl9zb2Z0YzsKKworCS8qCisJICogQnVzIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlhaGRfYnVzX2ludHJfdAkJICBidXNfaW50cjsKKworCS8qCisJICogVGFyZ2V0IG1vZGUgcmVsYXRlZCBzdGF0ZSBrZXB0IG9uIGEgcGVyIGVuYWJsZWQgbHVuIGJhc2lzLgorCSAqIFRhcmdldHMgdGhhdCBhcmUgbm90IGVuYWJsZWQgd2lsbCBoYXZlIG51bGwgZW50cmllcy4KKwkgKiBBcyBhbiBpbml0aWF0b3IsIHdlIGtlZXAgb25lIHRhcmdldCBlbnRyeSBmb3Igb3VyIGluaXRpYXRvcgorCSAqIElEIHRvIHN0b3JlIG91ciBzeW5jL3dpZGUgdHJhbnNmZXIgc2V0dGluZ3MuCisJICovCisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgICplbmFibGVkX3RhcmdldHNbQUhEX05VTV9UQVJHRVRTXTsKKworCS8qCisJICogVGhlIGJsYWNrIGhvbGUgZGV2aWNlIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZXF1ZXN0cyBmb3IKKwkgKiBkaXNhYmxlZCBsdW5zIG9uIGVuYWJsZWQgdGFyZ2V0cy4KKwkgKi8KKwlzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZSAgKmJsYWNrX2hvbGU7CisKKwkvKgorCSAqIERldmljZSBpbnN0YW5jZSBjdXJyZW50bHkgb24gdGhlIGJ1cyBhd2FpdGluZyBhIGNvbnRpbnVlIFRJTworCSAqIGZvciBhIGNvbW1hbmQgdGhhdCB3YXMgbm90IGdpdmVuIHRoZSBkaXNjb25uZWN0IHByaXZlbGVkZ2UuCisJICovCisJc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgICpwZW5kaW5nX2RldmljZTsKKworCS8qCisJICogVGltZXIgaGFuZGxlcyBmb3IgdGltZXIgZHJpdmVuIGNhbGxiYWNrcy4KKwkgKi8KKwlhaGRfdGltZXJfdAkJICByZXNldF90aW1lcjsKKwlhaGRfdGltZXJfdAkJICBzdGF0X3RpbWVyOworCisJLyoKKwkgKiBTdGF0aXN0aWNzLgorCSAqLworI2RlZmluZQlBSERfU1RBVF9VUERBVEVfVVMJMjUwMDAwIC8qIDI1MG1zICovCisjZGVmaW5lCUFIRF9TVEFUX0JVQ0tFVFMJNAorCXVfaW50CQkJICBjbWRjbXBsdF9idWNrZXQ7CisJdWludDMyX3QJCSAgY21kY21wbHRfY291bnRzW0FIRF9TVEFUX0JVQ0tFVFNdOworCXVpbnQzMl90CQkgIGNtZGNtcGx0X3RvdGFsOworCisJLyoKKwkgKiBDYXJkIGNoYXJhY3RlcmlzdGljcworCSAqLworCWFoZF9jaGlwCQkgIGNoaXA7CisJYWhkX2ZlYXR1cmUJCSAgZmVhdHVyZXM7CisJYWhkX2J1ZwkJCSAgYnVnczsKKwlhaGRfZmxhZwkJICBmbGFnczsKKwlzdHJ1Y3Qgc2VlcHJvbV9jb25maWcJICpzZWVwX2NvbmZpZzsKKworCS8qIFZhbHVlcyB0byBzdG9yZSBpbiB0aGUgU0VRQ1RMIHJlZ2lzdGVyIGZvciBwYXVzZSBhbmQgdW5wYXVzZSAqLworCXVpbnQ4X3QJCQkgIHVucGF1c2U7CisJdWludDhfdAkJCSAgcGF1c2U7CisKKwkvKiBDb21tYW5kIFF1ZXVlcyAqLworCXVpbnQxNl90CQkgIHFvdXRmaWZvbmV4dDsKKwl1aW50MTZfdAkJICBxb3V0Zmlmb25leHRfdmFsaWRfdGFnOworCXVpbnQxNl90CQkgIHFpbmZpZm9uZXh0OworCXVpbnQxNl90CQkgIHFpbmZpZm9bQUhEX1NDQl9NQVhdOworCXVpbnQxNl90CQkgKnFvdXRmaWZvOworCisJLyogQ3JpdGljYWwgU2VjdGlvbiBEYXRhICovCisJc3RydWN0IGNzCQkgKmNyaXRpY2FsX3NlY3Rpb25zOworCXVfaW50CQkJICBudW1fY3JpdGljYWxfc2VjdGlvbnM7CisKKwkvKiBCdWZmZXIgZm9yIGhhbmRsaW5nIHBhY2tldGl6ZWQgYml0YnVja2V0LiAqLworCXVpbnQ4X3QJCQkgKm92ZXJydW5fYnVmOworCisJLyogTGlua3MgZm9yIGNoYWluaW5nIHNvZnRjcyAqLworCVRBSUxRX0VOVFJZKGFoZF9zb2Z0YykJICBsaW5rczsKKworCS8qIENoYW5uZWwgTmFtZXMgKCdBJywgJ0InLCBldGMuKSAqLworCWNoYXIJCQkgIGNoYW5uZWw7CisKKwkvKiBJbml0aWF0b3IgQnVzIElEICovCisJdWludDhfdAkJCSAgb3VyX2lkOworCisJLyoKKwkgKiBUYXJnZXQgaW5jb21pbmcgY29tbWFuZCBGSUZPLgorCSAqLworCXN0cnVjdCB0YXJnZXRfY21kCSAqdGFyZ2V0Y21kczsKKwl1aW50OF90CQkJICB0cWluZmlmb25leHQ7CisKKwkvKgorCSAqIENhY2hlZCB2ZXJzb24gb2YgdGhlIGhzX21haWxib3ggc28gd2UgY2FuIGF2b2lkCisJICogcGF1c2luZyB0aGUgc2VxdWVuY2VyIGR1cmluZyBtYWlsYm94IHVwZGF0ZXMuCisJICovCisJdWludDhfdAkJCSAgaHNfbWFpbGJveDsKKworCS8qCisJICogSW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2UgaGFuZGxpbmcuCisJICovCisJdWludDhfdAkJCSAgc2VuZF9tc2dfcGVycm9yOworCWFoZF9tc2dfZmxhZ3MJCSAgbXNnX2ZsYWdzOworCWFoZF9tc2dfdHlwZQkJICBtc2dfdHlwZTsKKwl1aW50OF90CQkJICBtc2dvdXRfYnVmWzEyXTsvKiBNZXNzYWdlIHdlIGFyZSBzZW5kaW5nICovCisJdWludDhfdAkJCSAgbXNnaW5fYnVmWzEyXTsvKiBNZXNzYWdlIHdlIGFyZSByZWNlaXZpbmcgKi8KKwl1X2ludAkJCSAgbXNnb3V0X2xlbjsJLyogTGVuZ3RoIG9mIG1lc3NhZ2UgdG8gc2VuZCAqLworCXVfaW50CQkJICBtc2dvdXRfaW5kZXg7CS8qIEN1cnJlbnQgaW5kZXggaW4gbXNnb3V0ICovCisJdV9pbnQJCQkgIG1zZ2luX2luZGV4OwkvKiBDdXJyZW50IGluZGV4IGluIG1zZ2luICovCisKKwkvKgorCSAqIE1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGRhdGEgc3RydWN0dXJlcyBzaGFyZWQKKwkgKiBiZXR3ZWVuIHRoZSBzZXF1ZW5jZXIgYW5kIGtlcm5lbC4KKwkgKi8KKwlidXNfZG1hX3RhZ190CQkgIHBhcmVudF9kbWF0OworCWJ1c19kbWFfdGFnX3QJCSAgc2hhcmVkX2RhdGFfZG1hdDsKKwlidXNfZG1hbWFwX3QJCSAgc2hhcmVkX2RhdGFfZG1hbWFwOworCWRtYV9hZGRyX3QJCSAgc2hhcmVkX2RhdGFfYnVzYWRkcjsKKworCS8qIEluZm9ybWF0aW9uIHNhdmVkIHRocm91Z2ggc3VzcGVuZC9yZXN1bWUgY3ljbGVzICovCisJc3RydWN0IGFoZF9zdXNwZW5kX3N0YXRlICBzdXNwZW5kX3N0YXRlOworCisJLyogTnVtYmVyIG9mIGVuYWJsZWQgdGFyZ2V0IG1vZGUgZGV2aWNlIG9uIHRoaXMgY2FyZCAqLworCXVfaW50CQkJICBlbmFibGVkX2x1bnM7CisKKwkvKiBJbml0aWFsaXphdGlvbiBsZXZlbCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlICovCisJdV9pbnQJCQkgIGluaXRfbGV2ZWw7CisKKwkvKiBQQ0kgY2FjaGVsaW5lIHNpemUuICovCisJdV9pbnQJCQkgIHBjaV9jYWNoZXNpemU7CisKKwkvKiBJTyBDZWxsIFBhcmFtZXRlcnMgKi8KKwl1aW50OF90CQkJICBpb2NlbGxfb3B0c1tBSERfTlVNX1BFUl9ERVZfQU5ORVhDT0xTXTsKKworCXVfaW50CQkJICBzdGFja19zaXplOworCXVpbnQxNl90CQkgKnNhdmVkX3N0YWNrOworCisJLyogUGVyLVVuaXQgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKi8KKwljb25zdCBjaGFyCQkgKmRlc2NyaXB0aW9uOworCWNvbnN0IGNoYXIJCSAqYnVzX2Rlc2NyaXB0aW9uOworCWNoYXIJCQkgKm5hbWU7CisJaW50CQkJICB1bml0OworCisJLyogU2VsZWN0aW9uIFRpbWVyIHNldHRpbmdzICovCisJaW50CQkJICBzZWx0aW1lOworCisJLyoKKwkgKiBJbnRlcnJ1cHQgY29hbGVzY2luZyBzZXR0aW5ncy4KKwkgKi8KKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX1RJTUVSX0RFRkFVTFQJCTI1MCAvKnVzKi8KKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfREVGQVVMVAkJMTAKKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfTUFYCQkJMTI3CisjZGVmaW5lCUFIRF9JTlRfQ09BTEVTQ0lOR19NSU5DTURTX0RFRkFVTFQJCTUKKyNkZWZpbmUJQUhEX0lOVF9DT0FMRVNDSU5HX01JTkNNRFNfTUFYCQkJMTI3CisjZGVmaW5lCUFIRF9JTlRfQ09BTEVTQ0lOR19USFJFU0hPTERfREVGQVVMVAkJMjAwMAorI2RlZmluZQlBSERfSU5UX0NPQUxFU0NJTkdfU1RPUF9USFJFU0hPTERfREVGQVVMVAkxMDAwCisJdV9pbnQJCQkgIGludF9jb2FsZXNjaW5nX3RpbWVyOworCXVfaW50CQkJICBpbnRfY29hbGVzY2luZ19tYXhjbWRzOworCXVfaW50CQkJICBpbnRfY29hbGVzY2luZ19taW5jbWRzOworCXVfaW50CQkJICBpbnRfY29hbGVzY2luZ190aHJlc2hvbGQ7CisJdV9pbnQJCQkgIGludF9jb2FsZXNjaW5nX3N0b3BfdGhyZXNob2xkOworCisJdWludDE2X3QJIAkgIHVzZXJfZGlzY2VuYWJsZTsvKiBEaXNjb25uZWN0aW9uIGFsbG93ZWQgICovCisJdWludDE2X3QJCSAgdXNlcl90YWdlbmFibGU7LyogVGFnZ2VkIFF1ZXVpbmcgYWxsb3dlZCAqLworfTsKKworVEFJTFFfSEVBRChhaGRfc29mdGNfdGFpbHEsIGFoZF9zb2Z0Yyk7CitleHRlcm4gc3RydWN0IGFoZF9zb2Z0Y190YWlscSBhaGRfdGFpbHE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSU8gQ2VsbCBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUFIRF9QUkVDT01QX1NMRVdfSU5ERVgJCQkJCQlcCisgICAgKEFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcgLSBBSERfQU5ORVhDT0xfUEVSX0RFVjApCisKKyNkZWZpbmUJQUhEX0FNUExJVFVERV9JTkRFWAkJCQkJCVwKKyAgICAoQUhEX0FOTkVYQ09MX0FNUExJVFVERSAtIEFIRF9BTk5FWENPTF9QRVJfREVWMCkKKworI2RlZmluZSBBSERfU0VUX1NMRVdSQVRFKGFoZCwgbmV3X3NsZXcpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICAgIChhaGQpLT5pb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSAmPSB+QUhEX1NMRVdSQVRFX01BU0s7CVwKKyAgICAoYWhkKS0+aW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gfD0JCQlcCisJKCgobmV3X3NsZXcpIDw8IEFIRF9TTEVXUkFURV9TSElGVCkgJiBBSERfU0xFV1JBVEVfTUFTSyk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUhEX1NFVF9QUkVDT01QKGFoZCwgbmV3X3Bjb21wKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgICAoYWhkKS0+aW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gJj0gfkFIRF9QUkVDT01QX01BU0s7CVwKKyAgICAoYWhkKS0+aW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gfD0JCQlcCisJKCgobmV3X3Bjb21wKSA8PCBBSERfUFJFQ09NUF9TSElGVCkgJiBBSERfUFJFQ09NUF9NQVNLKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBSERfU0VUX0FNUExJVFVERShhaGQsIG5ld19hbXApCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICAgIChhaGQpLT5pb2NlbGxfb3B0c1tBSERfQU1QTElUVURFX0lOREVYXSAmPSB+QUhEX0FNUExJVFVERV9NQVNLOwlcCisgICAgKGFoZCktPmlvY2VsbF9vcHRzW0FIRF9BTVBMSVRVREVfSU5ERVhdIHw9CQkJCVwKKwkoKChuZXdfYW1wKSA8PCBBSERfQU1QTElUVURFX1NISUZUKSAmIEFIRF9BTVBMSVRVREVfTUFTSyk7CVwKK30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogQWN0aXZlIERldmljZSBJbmZvcm1hdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVJPTEVfVU5LTk9XTiwKKwlST0xFX0lOSVRJQVRPUiwKKwlST0xFX1RBUkdFVAorfSByb2xlX3Q7CisKK3N0cnVjdCBhaGRfZGV2aW5mbyB7CisJaW50CSBvdXJfc2NzaWlkOworCWludAkgdGFyZ2V0X29mZnNldDsKKwl1aW50MTZfdCB0YXJnZXRfbWFzazsKKwl1X2ludAkgdGFyZ2V0OworCXVfaW50CSBsdW47CisJY2hhcgkgY2hhbm5lbDsKKwlyb2xlX3QJIHJvbGU7CQkvKgorCQkJCSAqIE9ubHkgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IGlmIG5vdAorCQkJCSAqIGluIHRoZSBidXNmcmVlIHN0YXRlLgorCQkJCSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUhEX1BDSV9JT0FERFIwCVBDSVJfTUFQUwkvKiBJL08gQkFSKi8KKyNkZWZpbmUgQUhEX1BDSV9NRU1BRERSCShQQ0lSX01BUFMgKyA0KQkvKiBNZW1vcnkgQkFSICovCisjZGVmaW5lIEFIRF9QQ0lfSU9BRERSMQkoUENJUl9NQVBTICsgMTIpLyogU2Vjb25kIEkvTyBCQVIgKi8KKwordHlwZWRlZiBpbnQgKGFoZF9kZXZpY2Vfc2V0dXBfdCkoc3RydWN0IGFoZF9zb2Z0YyAqKTsKKworc3RydWN0IGFoZF9wY2lfaWRlbnRpdHkgeworCXVpbnQ2NF90CQkgZnVsbF9pZDsKKwl1aW50NjRfdAkJIGlkX21hc2s7CisJY2hhcgkJCSpuYW1lOworCWFoZF9kZXZpY2Vfc2V0dXBfdAkqc2V0dXA7Cit9OworZXh0ZXJuIHN0cnVjdCBhaGRfcGNpX2lkZW50aXR5IGFoZF9wY2lfaWRlbnRfdGFibGUgW107CitleHRlcm4gY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaWM3NzcwX2lkZW50aXR5IHsKKwl1aW50MzJfdAkJIGZ1bGxfaWQ7CisJdWludDMyX3QJCSBpZF9tYXNrOworCWNoYXIJCQkqbmFtZTsKKwlhaGRfZGV2aWNlX3NldHVwX3QJKnNldHVwOworfTsKK2V4dGVybiBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSBhaWM3NzcwX2lkZW50X3RhYmxlIFtdOworZXh0ZXJuIGNvbnN0IGludCBhaGRfbnVtX2FpYzc3NzBfZGV2czsKKworI2RlZmluZSBBSERfRUlTQV9TTE9UX09GRlNFVAkweGMwMAorI2RlZmluZSBBSERfRUlTQV9JT1NJWkUJCTB4MTAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb24gRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAkJCWFoZF9yZXNldF9jbWRzX3BlbmRpbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3VfaW50CQkJYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpOwordm9pZAkJCWFoZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICB1X2ludCB0Y2wsIHVfaW50IGJ1c3lpZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfdW5idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3VuYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCit7CisJYWhkX2J1c3lfdGNsKGFoZCwgdGNsLCBTQ0JfTElTVF9OVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBGcm9udCBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0CWFoZF9wY2lfaWRlbnRpdHkgKmFoZF9maW5kX3BjaV9kZXZpY2UoYWhkX2Rldl9zb2Z0Y190KTsKK2ludAkJCSAgYWhkX3BjaV9jb25maWcoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkgc3RydWN0IGFoZF9wY2lfaWRlbnRpdHkgKik7CitpbnQJYWhkX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhkX3NvZnRjICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLworaW50CQlhaGRfcHJvYmVfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICopOwordm9pZAkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CitpbnQJCWFoZF9tYXRjaF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkgICAgICBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsIGludCBsdW4sCisJCQkgICAgICB1X2ludCB0YWcsIHJvbGVfdCByb2xlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaGRfc29mdGMJKmFoZF9hbGxvYyh2b2lkICpwbGF0Zm9ybV9hcmcsIGNoYXIgKm5hbWUpOworaW50CQkJIGFoZF9zb2Z0Y19pbml0KHN0cnVjdCBhaGRfc29mdGMgKik7Cit2b2lkCQkJIGFoZF9jb250cm9sbGVyX2luZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpidWYpOworaW50CQkJIGFoZF9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitpbnQJCQkgYWhkX2RlZmF1bHRfY29uZmlnKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitpbnQJCQkgYWhkX3BhcnNlX3ZwZGRhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3QgdnBkX2NvbmZpZyAqdnBkKTsKK2ludAkJCSBhaGRfcGFyc2VfY2ZnZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgIHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MpOwordm9pZAkJCSBhaGRfaW50cl9lbmFibGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgZW5hYmxlKTsKK3ZvaWQJCQkgYWhkX3VwZGF0ZV9jb2FsZXNjaW5nX3ZhbHVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICAgICB1X2ludCB0aW1lciwKKwkJCQkJCSAgICAgIHVfaW50IG1heGNtZHMsCisJCQkJCQkgICAgICB1X2ludCBtaW5jbWRzKTsKK3ZvaWQJCQkgYWhkX2VuYWJsZV9jb2FsZXNjaW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgIGludCBlbmFibGUpOwordm9pZAkJCSBhaGRfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CQkJIGFoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7IAoraW50CQkJIGFoZF9yZXN1bWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQkgYWhkX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhkX3NvZnRjICopOworc3RydWN0IGFoZF9zb2Z0YwkqYWhkX2ZpbmRfc29mdGMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQkgYWhkX3NldF91bml0KHN0cnVjdCBhaGRfc29mdGMgKiwgaW50KTsKK3ZvaWQJCQkgYWhkX3NldF9uYW1lKHN0cnVjdCBhaGRfc29mdGMgKiwgY2hhciAqKTsKK3N0cnVjdCBzY2IJCSphaGRfZ2V0X3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGNvbF9pZHgpOwordm9pZAkJCSBhaGRfZnJlZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOwordm9pZAkJCSBhaGRfYWxsb2Nfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9pZAkJCSBhaGRfZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CQkJIGFoZF9yZXNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCByZWluaXQpOwordm9pZAkJCSBhaGRfc2h1dGRvd24odm9pZCAqYXJnKTsKK2ludAkJCSBhaGRfd3JpdGVfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgdV9pbnQgYWRkciwgdV9pbnQgdmFsdWUpOworaW50CQkJIGFoZF9yZWFkX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRkciwKKwkJCQkJICAgdWludDhfdCAqdmFsdWUpOworaW50CQkJIGFoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IFNlcnZpY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCQkJYWhkX3BjaV9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCQkJYWhkX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQlhaGRfZmx1c2hfcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJCQlhaGRfcnVuX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCit2b2lkCQkJYWhkX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBwYXVzZWQpOworI2VuZGlmCit2b2lkCQkJYWhkX2hhbmRsZV9od2VycmludChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9pZAkJCWFoZF9oYW5kbGVfc2VxaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCk7Cit2b2lkCQkJYWhkX2hhbmRsZV9zY3NpaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgdV9pbnQgaW50c3RhdCk7Cit2b2lkCQkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVycm9yIFJlY292ZXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisJU0VBUkNIX0NPTVBMRVRFLAorCVNFQVJDSF9DT1VOVCwKKwlTRUFSQ0hfUkVNT1ZFLAorCVNFQVJDSF9QUklOVAorfSBhaGRfc2VhcmNoX2FjdGlvbjsKK2ludAkJCWFoZF9zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsCisJCQkJCSAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAorCQkJCQkgICByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkJCQkgICBhaGRfc2VhcmNoX2FjdGlvbiBhY3Rpb24pOworaW50CQkJYWhkX3NlYXJjaF9kaXNjX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdGFyZ2V0LAorCQkJCQkgICAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAorCQkJCQkgICAgIGludCBzdG9wX29uX2ZpcnN0LCBpbnQgcmVtb3ZlLAorCQkJCQkgICAgIGludCBzYXZlX3N0YXRlKTsKK3ZvaWQJCQlhaGRfZnJlZXplX2RldnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOworaW50CQkJYWhkX3Jlc2V0X2NoYW5uZWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyIGNoYW5uZWwsCisJCQkJCSAgaW50IGluaXRpYXRlX3Jlc2V0KTsKK2ludAkJCWFoZF9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwKKwkJCQkgICAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJICAgICAgIHJvbGVfdCByb2xlLCB1aW50MzJfdCBzdGF0dXMpOwordm9pZAkJCWFoZF9yZXN0YXJ0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCQkJYWhkX2NsZWFyX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBmaWZvKTsKK3ZvaWQJCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOwordm9pZAkJCWFoZF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICAgc3RydWN0IHNjYiAqc2NiKTsKK3ZvaWQJCQlhaGRfY2FsY19yZXNpZHVhbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgc3RydWN0IHNjYiAqc2NiKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVXRpbGl0eSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5KgorCQkJYWhkX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpOwordm9pZAkJCWFoZF9jb21waWxlX2RldmluZm8oc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJCQkgICAgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCisJCQkJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwKKwkJCQkJICAgIHJvbGVfdCByb2xlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCQkJYWhkX2ZpbmRfc3luY3JhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCAqcGVyaW9kLAorCQkJCQkgIHVfaW50ICpwcHJfb3B0aW9ucywgdV9pbnQgbWF4c3luYyk7Cit2b2lkCQkJYWhkX3ZhbGlkYXRlX29mZnNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCisJCQkJCSAgICB1X2ludCBwZXJpb2QsIHVfaW50ICpvZmZzZXQsCisJCQkJCSAgICBpbnQgd2lkZSwgcm9sZV90IHJvbGUpOwordm9pZAkJCWFoZF92YWxpZGF0ZV93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJCQkJICAgdV9pbnQgKmJ1c193aWR0aCwKKwkJCQkJICAgcm9sZV90IHJvbGUpOworLyoKKyAqIE5lZ290aWF0aW9uIHR5cGVzLiAgVGhlc2UgYXJlIHVzZWQgdG8gcXVhbGlmeSBpZiB3ZSBzaG91bGQgcmVuZWdvdGlhdGUKKyAqIGV2ZW4gaWYgb3VyIGdvYWwgYW5kIGN1cnJlbnQgdHJhbnNwb3J0IHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSERfTkVHX1RPX0dPQUwsCS8qIFJlbmVnb3RpYXRlIG9ubHkgaWYgZ29hbCBhbmQgY3VyciBkaWZmZXIuICovCisJQUhEX05FR19JRl9OT05fQVNZTkMsCS8qIFJlbmVnb3RpYXRlIHNvIGxvbmcgYXMgZ29hbCBpcyBub24tYXN5bmMuICovCisJQUhEX05FR19BTFdBWVMJCS8qIFJlbmVnb3RpYXQgZXZlbiBpZiBnb2FsIGlzIGFzeW5jLiAqLworfSBhaGRfbmVnX3R5cGU7CitpbnQJCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KHN0cnVjdCBhaGRfc29mdGMqLAorCQkJCQkgICAgICAgc3RydWN0IGFoZF9kZXZpbmZvKiwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlKiwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvKiwKKwkJCQkJICAgICAgIGFoZF9uZWdfdHlwZSk7Cit2b2lkCQkJYWhkX3NldF93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJCSAgICAgIHVfaW50IHdpZHRoLCB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKTsKK3ZvaWQJCQlhaGRfc2V0X3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAorCQkJCQkgdV9pbnQgcHByX29wdGlvbnMsCisJCQkJCSB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKTsKK3R5cGVkZWYgZW51bSB7CisJQUhEX1FVRVVFX05PTkUsCisJQUhEX1FVRVVFX0JBU0lDLAorCUFIRF9RVUVVRV9UQUdHRUQKK30gYWhkX3F1ZXVlX2FsZzsKKwordm9pZAkJCWFoZF9zZXRfdGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJICAgICBhaGRfcXVldWVfYWxnIGFsZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCit2b2lkCQlhaGRfc2VuZF9sc3RhdGVfZXZlbnRzKHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkgICAgICAgc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgKik7Cit2b2lkCQlhaGRfaGFuZGxlX2VuX2x1bihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYik7CitjYW1fc3RhdHVzCWFoZF9maW5kX3Rtb2RlX2RldnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYiwKKwkJCQkgICAgc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKip0c3RhdGUsCisJCQkJICAgIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICoqbHN0YXRlLAorCQkJCSAgICBpbnQgbm90Zm91bmRfZmFpbHVyZSk7CisjaWZuZGVmIEFIRF9UTU9ERV9FTkFCTEUKKyNkZWZpbmUgQUhEX1RNT0RFX0VOQUJMRSAwCisjZW5kaWYKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVidWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIRF9ERUJVRworZXh0ZXJuIHVpbnQzMl90IGFoZF9kZWJ1ZzsKKyNkZWZpbmUgQUhEX1NIT1dfTUlTQwkJMHgwMDAwMQorI2RlZmluZSBBSERfU0hPV19TRU5TRQkJMHgwMDAwMgorI2RlZmluZSBBSERfU0hPV19SRUNPVkVSWQkweDAwMDA0CisjZGVmaW5lIEFIRF9EVU1QX1NFRVBST00JMHgwMDAwOAorI2RlZmluZSBBSERfU0hPV19URVJNQ1RMCTB4MDAwMTAKKyNkZWZpbmUgQUhEX1NIT1dfTUVNT1JZCQkweDAwMDIwCisjZGVmaW5lIEFIRF9TSE9XX01FU1NBR0VTCTB4MDAwNDAKKyNkZWZpbmUgQUhEX1NIT1dfTU9ERVBUUgkweDAwMDgwCisjZGVmaW5lIEFIRF9TSE9XX1NFTFRPCQkweDAwMTAwCisjZGVmaW5lIEFIRF9TSE9XX0ZJRk9TCQkweDAwMjAwCisjZGVmaW5lIEFIRF9TSE9XX1FGVUxMCQkweDAwNDAwCisjZGVmaW5lCUFIRF9TSE9XX0RWCQkweDAwODAwCisjZGVmaW5lIEFIRF9TSE9XX01BU0tFRF9FUlJPUlMJMHgwMTAwMAorI2RlZmluZSBBSERfU0hPV19RVUVVRQkJMHgwMjAwMAorI2RlZmluZSBBSERfU0hPV19UUUlOCQkweDA0MDAwCisjZGVmaW5lIEFIRF9TSE9XX1NHCQkweDA4MDAwCisjZGVmaW5lIEFIRF9TSE9XX0lOVF9DT0FMRVNDSU5HCTB4MTAwMDAKKyNkZWZpbmUgQUhEX0RFQlVHX1NFUVVFTkNFUgkweDIwMDAwCisjZW5kaWYKK3ZvaWQJCQlhaGRfcHJpbnRfc2NiKHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCQkJYWhkX3ByaW50X2RldmluZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Cit2b2lkCQkJYWhkX2R1bXBfc2dsaXN0KHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCQkJYWhkX2R1bXBfYWxsX2NhcmRzX3N0YXRlKHZvaWQpOwordm9pZAkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK2ludAkJCWFoZF9wcmludF9yZWdpc3RlcihhaGRfcmVnX3BhcnNlX2VudHJ5X3QgKnRhYmxlLAorCQkJCQkgICB1X2ludCBudW1fZW50cmllcywKKwkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgdV9pbnQgYWRkcmVzcywKKwkJCQkJICAgdV9pbnQgdmFsdWUsCisJCQkJCSAgIHVfaW50ICpjdXJfY29sdW1uLAorCQkJCQkgICB1X2ludCB3cmFwX3BvaW50KTsKK3ZvaWQJCQlhaGRfZHVtcF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisjZW5kaWYgLyogX0FJQzc5WFhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5yZWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNThlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHgucmVnCkBAIC0wLDAgKzEsMzk1OCBAQAorLyoKKyAqIEFpYzc5eHggcmVnaXN0ZXIgYW5kIHNjcmF0Y2ggcmFtIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAxIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRGcmVlQlNEJAorICovCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzAgJCIKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGFpYzd4eHhfYXNtIHV0aWxpdHkgZm9yIHVzZSBpbiBhc3NlbWJsaW5nCisgKiBmaXJtd2FyZSBmb3IgdGhlIGFpYzc5eHggZmFtaWx5IG9mIFNDU0kgaG9zdCBhZGFwdGVycyBhcyB3ZWxsIGFzIHRvIGdlbmVyYXRlCisgKiBhIEMgaGVhZGVyIGZpbGUgZm9yIHVzZSBpbiB0aGUga2VybmVsIHBvcnRpb24gb2YgdGhlIEFpYzc5eHggZHJpdmVyLgorICovCisKKy8qIFJlZ2lzdGVyIHdpbmRvdyBNb2RlcyAqLworI2RlZmluZSBNX0RGRjAJCTAKKyNkZWZpbmUgTV9ERkYxCQkxCisjZGVmaW5lIE1fQ0NIQU4JCTIKKyNkZWZpbmUgTV9TQ1NJCQkzCisjZGVmaW5lIE1fQ0ZHCQk0CisjZGVmaW5lIE1fRFNUX1NISUZUCTQKKworI2RlZmluZSBNS19NT0RFKHNyYywgZHN0KSAoKHNyYykgfCAoKGRzdCkgPDwgTV9EU1RfU0hJRlQpKQorI2RlZmluZSBTRVRfTU9ERShzcmMsIGRzdCkJCQkJCQlcCisJU0VUX1NSQ19NT0RFCXNyYzsJCQkJCQlcCisJU0VUX0RTVF9NT0RFCWRzdDsJCQkJCQlcCisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CQkJXAorCQltdmkJTUtfTU9ERShzcmMsIGRzdCkgY2FsbCBzZXRfbW9kZV93b3JrX2Fyb3VuZDsJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJbXZpCU1PREVfUFRSLCBNS19NT0RFKHNyYywgZHN0KTsJCQlcCisJfQorCisjZGVmaW5lIFRPR0dMRV9ERkZfTU9ERQkJCQkJCQlcCisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CQkJXAorCQljYWxsCXRvZ2dsZV9kZmZfbW9kZV93b3JrX2Fyb3VuZDsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOwkJXAorCX0KKwkKKyNkZWZpbmUgUkVTVE9SRV9NT0RFKG1vZGUpCQkJCQkJXAorCWlmICgoYWhkLT5idWdzICYgQUhEX1NFVF9NT0RFX0JVRykgIT0gMCkgewkJCVwKKwkJbW92CW1vZGUgY2FsbCBzZXRfbW9kZV93b3JrX2Fyb3VuZDsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQltb3YJTU9ERV9QVFIsIG1vZGU7CQkJCQlcCisJfQorCisjZGVmaW5lIFNFVF9TRVFJTlRDT0RFKGNvZGUpCQkJCQkJXAorCWlmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsJCQlcCisJCW12aQljb2RlIGNhbGwgc2V0X3NlcWludF93b3JrX2Fyb3VuZDsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCW12aQlTRVFJTlRDT0RFLCBjb2RlOwkJCQlcCisJfQorCisvKgorICogTW9kZSBQb2ludGVyCisgKiBDb250cm9scyB3aGljaCBvZiB0aGUgNSwgNTEyYnl0ZSwgYWRkcmVzcyBzcGFjZXMgc2hvdWxkIGJlIHVzZWQKKyAqIGFzIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIGFueSByZWdpc3RlciBhY2Nlc3NlcyBpbiBvdXIKKyAqIHJlZ2lzdGVyIHdpbmRvdy4KKyAqLworcmVnaXN0ZXIgTU9ERV9QVFIgeworCWFkZHJlc3MJCQkweDAwMAorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJRFNUX01PREUJMHg3MAorCWZpZWxkCVNSQ19NT0RFCTB4MDcKKwltb2RlX3BvaW50ZXIKK30KKworY29uc3QgU1JDX01PREVfU0hJRlQJMAorY29uc3QgRFNUX01PREVfU0hJRlQJNAorCisvKgorICogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KK3JlZ2lzdGVyIElOVFNUQVQgeworCWFkZHJlc3MJCQkweDAwMQorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJSFdFUlJJTlQJMHg4MAorCWZpZWxkCUJSS0FEUklOVAkweDQwCisJZmllbGQJU1dUTUlOVAkJMHgyMAorCWZpZWxkCVBDSUlOVAkJMHgxMAorCWZpZWxkCVNDU0lJTlQJCTB4MDgKKwlmaWVsZAlTRVFJTlQJCTB4MDQKKwlmaWVsZAlDTURDTVBMVAkweDAyCisJZmllbGQJU1BMVElOVAkJMHgwMQorCW1hc2sJSU5UX1BFTkQgMHhGRgorfQorCisvKgorICogU2VxdWVuY2VyIEludGVycnVwdCBDb2RlCisgKi8KK3JlZ2lzdGVyIFNFUUlOVENPREUgeworCWFkZHJlc3MJCQkweDAwMgorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQgeworCQlOT19TRVFJTlQsCQkJLyogTm8gc2VxaW50IHBlbmRpbmcuICovCisJCUJBRF9QSEFTRSwJCQkvKiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICovCisJCVNFTkRfUkVKRUNULAkJCS8qIHNlbmRpbmcgYSBtZXNzYWdlIHJlamVjdCAqLworCQlQUk9UT19WSU9MQVRJT04sIAkJLyogUHJvdG9jb2wgVmlvbGF0aW9uICovCisJCU5PX01BVENILAkJCS8qIG5vIGNtZCBtYXRjaCBmb3IgcmVjb25uZWN0ICovCisJCUlHTl9XSURFX1JFUywJCQkvKiBDb21wbGV4IElHTiBXaWRlIFJlcyBNc2cgKi8KKwkJUERBVEFfUkVJTklULAkJCS8qCisJCQkJCQkgKiBSZXR1cm5lZCB0byBkYXRhIHBoYXNlCisJCQkJCQkgKiB0aGF0IHJlcXVpcmVzIGRhdGEKKwkJCQkJCSAqIHRyYW5zZmVyIHBvaW50ZXJzIHRvIGJlCisJCQkJCQkgKiByZWNhbGN1bGF0ZWQgZnJvbSB0aGUKKwkJCQkJCSAqIHRyYW5zZmVyIHJlc2lkdWFsLgorCQkJCQkJICovCisJCUhPU1RfTVNHX0xPT1AsCQkJLyoKKwkJCQkJCSAqIFRoZSBidXMgaXMgcmVhZHkgZm9yIHRoZQorCQkJCQkJICogaG9zdCB0byBwZXJmb3JtIGFub3RoZXIKKwkJCQkJCSAqIG1lc3NhZ2UgdHJhbnNhY3Rpb24uICBUaGlzCisJCQkJCQkgKiBtZWNoYW5pc20gaXMgdXNlZCBmb3IgdGhpbmdzCisJCQkJCQkgKiBsaWtlIHN5bmMvd2lkZSBuZWdvdGlhdGlvbgorCQkJCQkJICogdGhhdCByZXF1aXJlIGEga2VybmVsIGJhc2VkCisJCQkJCQkgKiBtZXNzYWdlIHN0YXRlIGVuZ2luZS4KKwkJCQkJCSAqLworCQlCQURfU1RBVFVTLAkJCS8qIEJhZCBzdGF0dXMgZnJvbSB0YXJnZXQgKi8KKwkJREFUQV9PVkVSUlVOLAkJCS8qCisJCQkJCQkgKiBUYXJnZXQgYXR0ZW1wdGVkIHRvIHdyaXRlCisJCQkJCQkgKiBiZXlvbmQgdGhlIGJvdW5kcyBvZiBpdHMKKwkJCQkJCSAqIGNvbW1hbmQuCisJCQkJCQkgKi8KKwkJTUtNU0dfRkFJTEVELAkJCS8qCisJCQkJCQkgKiBUYXJnZXQgY29tcGxldGVkIGNvbW1hbmQKKwkJCQkJCSAqIHdpdGhvdXQgaG9ub3Jpbmcgb3VyIEFUTgorCQkJCQkJICogcmVxdWVzdCB0byBpc3N1ZSBhIG1lc3NhZ2UuIAorCQkJCQkJICovCisJCU1JU1NFRF9CVVNGUkVFLAkJCS8qCisJCQkJCQkgKiBUaGUgc2VxdWVuY2VyIG5ldmVyIHNhdworCQkJCQkJICogdGhlIGJ1cyBnbyBmcmVlIGFmdGVyCisJCQkJCQkgKiBlaXRoZXIgYSBjb21tYW5kIGNvbXBsZXRlCisJCQkJCQkgKiBvciBkaXNjb25uZWN0IG1lc3NhZ2UuCisJCQkJCQkgKi8KKwkJRFVNUF9DQVJEX1NUQVRFLAorCQlJTExFR0FMX1BIQVNFLAorCQlJTlZBTElEX1NFUUlOVCwKKwkJQ0ZHNElTVEFUX0lOVFIsCisJCVNUQVRVU19PVkVSUlVOLAorCQlDRkc0T1ZFUlJVTiwKKwkJRU5URVJJTkdfTk9OUEFDSywKKwkJVEFTS01HTVRfRlVOQ19DT01QTEVURSwJCS8qCisJCQkJCQkgKiBUYXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24KKwkJCQkJCSAqIHJlcXVlc3QgY29tcGxldGVkIHdpdGgKKwkJCQkJCSAqIGFuIGV4cGVjdGVkIGJ1c2ZyZWUuCisJCQkJCQkgKi8KKwkJVEFTS01HTVRfQ01EX0NNUExUX09LQVksCS8qCisJCQkJCQkgKiBBIGNvbW1hbmQgd2l0aCBhIG5vbi16ZXJvCisJCQkJCQkgKiB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24KKwkJCQkJCSAqIGhhcyBjb21wbGV0ZWQgdmlhIHRoZSBub3JtYWwKKwkJCQkJCSAqIGNvbW1hbmQgY29tcGxldGlvbiBtZXRob2QKKwkJCQkJCSAqIGZvciBjb21tYW5kcyB3aXRoIGEgemVybworCQkJCQkJICogdGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9uLgorCQkJCQkJICogVGhpcyBoYXBwZW5zIHdoZW4gYW4gYXR0ZW1wdAorCQkJCQkJICogdG8gYWJvcnQgYSBjb21tYW5kIGxvc2VzCisJCQkJCQkgKiB0aGUgcmFjZSBmb3IgdGhlIGNvbW1hbmQgdG8KKwkJCQkJCSAqIGNvbXBsZXRlIG5vcm1hbGx5LgorCQkJCQkJICovCisJCVRSQUNFUE9JTlQwLAorCQlUUkFDRVBPSU5UMSwKKwkJVFJBQ0VQT0lOVDIsCisJCVRSQUNFUE9JTlQzLAorCQlTQVdfSFdFUlIsCisJCUJBRF9TQ0JfU1RBVFVTCisJfQorfQorCisvKgorICogQ2xlYXIgSG9zdCBJbnRlcnJ1cHQKKyAqLworcmVnaXN0ZXIgQ0xSSU5UIHsKKwlhZGRyZXNzCQkJMHgwMDMKKwlhY2Nlc3NfbW9kZQlXTworCWZpZWxkCUNMUkhXRVJSSU5UCTB4ODAgLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCUNMUkJSS0FEUklOVAkweDQwCisJZmllbGQJQ0xSU1dUTUlOVAkweDIwCisJZmllbGQJQ0xSUENJSU5UCTB4MTAKKwlmaWVsZAlDTFJTQ1NJSU5UCTB4MDgKKwlmaWVsZAlDTFJTRVFJTlQJMHgwNAorCWZpZWxkCUNMUkNNRElOVAkweDAyCisJZmllbGQJQ0xSU1BMVElOVAkweDAxCit9CisKKy8qCisgKiBFcnJvciBSZWdpc3RlcgorICovCityZWdpc3RlciBFUlJPUiB7CisJYWRkcmVzcwkJCTB4MDA0CisJYWNjZXNzX21vZGUJUk8KKwlmaWVsZAlDSU9QQVJFUlIJMHg4MAorCWZpZWxkCUNJT0FDQ0VTRkFJTAkweDQwIC8qIFJldiBCIG9yIGdyZWF0ZXIgKi8KKwlmaWVsZAlNUEFSRVJSCQkweDIwCisJZmllbGQJRFBBUkVSUgkJMHgxMAorCWZpZWxkCVNRUEFSRVJSCTB4MDgKKwlmaWVsZAlJTExPUENPREUJMHgwNAorCWZpZWxkCURTQ1RNT1VUCTB4MDIKK30KKworLyoKKyAqIENsZWFyIEVycm9yCisgKi8KK3JlZ2lzdGVyIENMUkVSUiB7CisJYWRkcmVzcwkJCTB4MDA0CisJYWNjZXNzX21vZGUgCVdPCisJZmllbGQJQ0xSQ0lPUEFSRVJSCTB4ODAKKwlmaWVsZAlDTFJDSU9BQ0NFU0ZBSUwJMHg0MCAvKiBSZXYgQiBvciBncmVhdGVyICovCisJZmllbGQJQ0xSTVBBUkVSUgkweDIwCisJZmllbGQJQ0xSRFBBUkVSUgkweDEwCisJZmllbGQJQ0xSU1FQQVJFUlIJMHgwOAorCWZpZWxkCUNMUklMTE9QQ09ERQkweDA0CisJZmllbGQJQ0xSRFNDVE1PVVQJMHgwMgorfQorCisvKgorICogSG9zdCBDb250cm9sIFJlZ2lzdGVyCisgKiBPdmVyYWxsIGhvc3QgY29udHJvbCBvZiB0aGUgZGV2aWNlLgorICovCityZWdpc3RlciBIQ05UUkwgeworCWFkZHJlc3MJCQkweDAwNQorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJU0VRX1JFU0VUCTB4ODAgLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCVBPV1JETgkJMHg0MAorCWZpZWxkCVNXSU5UCQkweDEwCisJZmllbGQJU1dUSU1FUl9TVEFSVF9CCTB4MDggLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCVBBVVNFCQkweDA0CisJZmllbGQJSU5URU4JCTB4MDIKKwlmaWVsZAlDSElQUlNUCQkweDAxCisJZmllbGQJQ0hJUFJTVEFDSwkweDAxCit9CisKKy8qCisgKiBIb3N0IE5ldyBTQ0IgUXVldWUgT2Zmc2V0CisgKi8KK3JlZ2lzdGVyIEhOU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDAwNgorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorfQorCisvKgorICogSG9zdCBFbXB0eSBTQ0IgUXVldWUgT2Zmc2V0CisgKi8KK3JlZ2lzdGVyIEhFU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDAwOAorCWFjY2Vzc19tb2RlCVJXCit9CisKKy8qCisgKiBIb3N0IE1haWxib3gKKyAqLworcmVnaXN0ZXIgSFNfTUFJTEJPWCB7CisJYWRkcmVzcwkJCTB4MDBCCisJYWNjZXNzX21vZGUJUlcKKwltYXNrCUhPU1RfVFFJTlBPUwkweDgwCS8qIEJvdW5kYXJ5IGF0IGVpdGhlciAwIG9yIDEyOCAqLworCW1hc2sJRU5JTlRfQ09BTEVTQ0UJMHg0MAkvKiBQZXJmb3JtIGludGVycnVwdCBjb2FsZXNjaW5nICovCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgSW50ZXJ1cHQgU3RhdHVzCisgKi8KK3JlZ2lzdGVyIFNFUUlOVFNUQVQgeworCWFkZHJlc3MJCQkweDAwQworCWFjY2Vzc19tb2RlCVJPCisJZmllbGQJU0VRX1NXVE1SVE8JMHgxMAorCWZpZWxkCVNFUV9TRVFJTlQJMHgwOAorCWZpZWxkCVNFUV9TQ1NJSU5UCTB4MDQKKwlmaWVsZAlTRVFfUENJSU5UCTB4MDIKKwlmaWVsZAlTRVFfU1BMVElOVAkweDAxCit9CisKKy8qCisgKiBDbGVhciBTRVEgSW50ZXJydXB0CisgKi8KK3JlZ2lzdGVyIENMUlNFUUlOVFNUQVQgeworCWFkZHJlc3MJCQkweDAwQworCWFjY2Vzc19tb2RlCVdPCisJZmllbGQJQ0xSU0VRX1NXVE1SVE8JMHgxMAorCWZpZWxkCUNMUlNFUV9TRVFJTlQJMHgwOAorCWZpZWxkCUNMUlNFUV9TQ1NJSU5UCTB4MDQKKwlmaWVsZAlDTFJTRVFfUENJSU5UCTB4MDIKKwlmaWVsZAlDTFJTRVFfU1BMVElOVAkweDAxCit9CisKKy8qCisgKiBTb2Z0d2FyZSBUaW1lcgorICovCityZWdpc3RlciBTV1RJTUVSIHsKKwlhZGRyZXNzCQkJMHgwMEUKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKK30KKworLyoKKyAqIFNFUSBOZXcgU0NCIFF1ZXVlIE9mZnNldAorICovCityZWdpc3RlciBTTlNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwMTAKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogU0VRIEVtcHR5IFNDQiBRdWV1ZSBPZmZzZXQKKyAqLworcmVnaXN0ZXIgU0VTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MDEyCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogU0VRIERvbmUgU0NCIFF1ZXVlIE9mZnNldAorICovCityZWdpc3RlciBTRFNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwMTQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NDSEFOCisJc2l6ZQkJMgorfQorCisvKgorICogUXVldWUgT2Zmc2V0IENvbnRyb2wgJiBTdGF0dXMKKyAqLworcmVnaXN0ZXIgUU9GRl9DVExTVEEgeworCWFkZHJlc3MJCQkweDAxNgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KKwlmaWVsZAlFTVBUWV9TQ0JfQVZBSUwJMHg4MAorCWZpZWxkCU5FV19TQ0JfQVZBSUwJMHg0MAorCWZpZWxkCVNEU0NCX1JPTExPVlIJMHgyMAorCWZpZWxkCUhTX01BSUxCT1hfQUNUCTB4MTAKKwlmaWVsZAlTQ0JfUVNJWkUJMHgwRiB7CisJCVNDQl9RU0laRV80LAorCQlTQ0JfUVNJWkVfOCwKKwkJU0NCX1FTSVpFXzE2LAorCQlTQ0JfUVNJWkVfMzIsCisJCVNDQl9RU0laRV82NCwKKwkJU0NCX1FTSVpFXzEyOCwKKwkJU0NCX1FTSVpFXzI1NiwKKwkJU0NCX1FTSVpFXzUxMiwKKwkJU0NCX1FTSVpFXzEwMjQsCisJCVNDQl9RU0laRV8yMDQ4LAorCQlTQ0JfUVNJWkVfNDA5NiwKKwkJU0NCX1FTSVpFXzgxOTIsCisJCVNDQl9RU0laRV8xNjM4NAorCX0KK30KKworLyoKKyAqIEludGVycnVwdCBDb250cm9sCisgKi8KK3JlZ2lzdGVyIElOVENUTCB7CisJYWRkcmVzcwkJCTB4MDE4CisJYWNjZXNzX21vZGUJUlcKKwlmaWVsZAlTV1RNSU5UTUFTSwkweDgwCisJZmllbGQJU1dUTUlOVEVOCTB4NDAKKwlmaWVsZAlTV1RJTUVSX1NUQVJUCTB4MjAKKwlmaWVsZAlBVVRPQ0xSQ01ESU5UCTB4MTAKKwlmaWVsZAlQQ0lJTlRFTgkweDA4CisJZmllbGQJU0NTSUlOVEVOCTB4MDQKKwlmaWVsZAlTRVFJTlRFTgkweDAyCisJZmllbGQJU1BMVElOVEVOCTB4MDEKK30KKworLyoKKyAqIERhdGEgRklGTyBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERGQ05UUkwgeworCWFkZHJlc3MJCQkweDAxOQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJUFJFTE9BREVOCTB4ODAKKwlmaWVsZAlTQ1NJRU5XUkRJUwkweDQwCS8qIFJldiBCIG9ubHkuICovCisJZmllbGQJU0NTSUVOCQkweDIwCisJZmllbGQJU0NTSUVOQUNLCTB4MjAKKwlmaWVsZAlIRE1BRU4JCTB4MDgKKwlmaWVsZAlIRE1BRU5BQ0sJMHgwOAorCWZpZWxkCURJUkVDVElPTgkweDA0CisJZmllbGQJRElSRUNUSU9OQUNLCTB4MDQKKwlmaWVsZAlGSUZPRkxVU0gJMHgwMgorCWZpZWxkCUZJRk9GTFVTSEFDSwkweDAyCisJZmllbGQJRElSRUNUSU9ORU4JMHgwMQorfQorCisvKgorICogRGV2aWNlIFNwYWNlIENvbW1hbmQgMAorICovCityZWdpc3RlciBEU0NPTU1BTkQwIHsKKwlhZGRyZXNzCQkJMHgwMTkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUNBQ0hFVEhFTgkweDgwCS8qIENhY2hlIFRocmVzaG9sZCBlbmFibGUgKi8KKwlmaWVsZAlEUEFSQ0tFTgkweDQwCS8qIERhdGEgUGFyaXR5IENoZWNrIEVuYWJsZSAqLworCWZpZWxkCU1QQVJDS0VOCTB4MjAJLyogTWVtb3J5IFBhcml0eSBDaGVjayBFbmFibGUgKi8KKwlmaWVsZAlFWFRSRVFMQ0sJMHgxMAkvKiBFeHRlcm5hbCBSZXF1ZXN0IExvY2sgKi8KKwlmaWVsZAlESVNBQkxFX1RXQVRFCTB4MDIJLyogUmV2IEIgb3IgZ3JlYXRlciAqLworCWZpZWxkCUNJT1BBUkNLRU4JMHgwMQkvKiBJbnRlcm5hbCBidXMgcGFyaXR5IGVycm9yIGVuYWJsZSAqLworfQorCisvKgorICogRGF0YSBGSUZPIFN0YXR1cworICovCityZWdpc3RlciBERlNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDFBCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlQUkVMT0FEX0FWQUlMCQkweDgwCisJZmllbGQJUEtUX1BSRUxPQURfQVZBSUwJMHg0MAorCWZpZWxkCU1SRVFQRU5ECQkweDEwCisJZmllbGQJSERPTkUJCQkweDA4CisJZmllbGQJREZUSFJFU0gJCTB4MDQKKwlmaWVsZAlGSUZPRlVMTAkJMHgwMgorCWZpZWxkCUZJRk9FTVAJCQkweDAxCit9CisKKy8qCisgKiBTL0cgQ2FjaGUgUG9pbnRlcgorICovCityZWdpc3RlciBTR19DQUNIRV9QUkUgeworCWFkZHJlc3MJCQkweDAxQgorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJU0dfQUREUl9NQVNLCTB4ZjgKKwlmaWVsZAlPRERfU0VHCQkweDA0CisJZmllbGQJTEFTVF9TRUcJMHgwMgorfQorCityZWdpc3RlciBTR19DQUNIRV9TSEFET1cgeworCWFkZHJlc3MJCQkweDAxQgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJU0dfQUREUl9NQVNLCTB4ZjgKKwlmaWVsZAlPRERfU0VHCQkweDA0CisJZmllbGQJTEFTVF9TRUcJMHgwMgorCWZpZWxkCUxBU1RfU0VHX0RPTkUJMHgwMQorfQorCisvKgorICogQXJiaXRlciBDb250cm9sCisgKi8KK3JlZ2lzdGVyIEFSQkNUTCB7CisJYWRkcmVzcwkJCTB4MDFCCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlSRVNFVF9IQVJCCTB4ODAKKwlmaWVsZAlSRVRSWV9TV0VOCTB4MDgKKwlmaWVsZAlVU0VfVElNRQkweDA3Cit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgSG9zdCBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIEhBRERSIHsKKwlhZGRyZXNzCQkJMHgwNzAKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTgKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKK30KKworLyoKKyAqIEhvc3QgT3ZlcmxheSBETUEgQWRkcmVzcworICovCityZWdpc3RlciBIT0RNQUFEUiB7CisJYWRkcmVzcwkJCTB4MDcwCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQk4CisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogUENJIFBMTCBEZWxheS4KKyAqLworcmVnaXN0ZXIgUExMREVMQVkgeworCWFkZHJlc3MJCQkweDA3MAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMQorCW1vZGVzCQlNX0NGRworCWZpZWxkCVNQTElUX0RST1BfUkVRCTB4ODAKK30KKworLyoKKyAqIERhdGEgQ2hhbm5lbCBIb3N0IENvdW50CisgKi8KK3JlZ2lzdGVyIEhDTlQgeworCWFkZHJlc3MJCQkweDA3OAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogSG9zdCBPdmVybGF5IERNQSBDb3VudAorICovCityZWdpc3RlciBIT0RNQUNOVCB7CisJYWRkcmVzcwkJCTB4MDc4CisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogSG9zdCBPdmVybGF5IERNQSBFbmFibGUKKyAqLworcmVnaXN0ZXIgSE9ETUFFTiB7CisJYWRkcmVzcwkJCTB4MDdBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTY2F0dGVyL0dhdGhlciBIb3N0IEFkZHJlc3MKKyAqLworcmVnaXN0ZXIgU0dIQUREUiB7CisJYWRkcmVzcwkJCTB4MDdDCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQk4CisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBTQ0IgSG9zdCBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIFNDQkhBRERSIHsKKwlhZGRyZXNzCQkJMHgwN0MKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTgKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogU2NhdHRlci9HYXRoZXIgSG9zdCBDb3VudAorICovCityZWdpc3RlciBTR0hDTlQgeworCWFkZHJlc3MJCQkweDA4NAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBTQ0IgSG9zdCBDb3VudAorICovCityZWdpc3RlciBTQ0JIQ05UIHsKKwlhZGRyZXNzCQkJMHgwODQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NDSEFOCit9CisKKy8qCisgKiBEYXRhIEZJRk8gVGhyZXNob2xkCisgKi8KK3JlZ2lzdGVyIERGRl9USFJTSCB7CisJYWRkcmVzcwkJCTB4MDg4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlXUl9ERlRIUlNICTB4NzAgeworCQlXUl9ERlRIUlNIX01JTiwKKwkJV1JfREZUSFJTSF8yNSwKKwkJV1JfREZUSFJTSF81MCwKKwkJV1JfREZUSFJTSF82MywKKwkJV1JfREZUSFJTSF83NSwKKwkJV1JfREZUSFJTSF84NSwKKwkJV1JfREZUSFJTSF85MCwKKwkJV1JfREZUSFJTSF9NQVgKKwl9CisJZmllbGQJUkRfREZUSFJTSAkweDA3IHsKKwkJUkRfREZUSFJTSF9NSU4sCisJCVJEX0RGVEhSU0hfMjUsCisJCVJEX0RGVEhSU0hfNTAsCisJCVJEX0RGVEhSU0hfNjMsCisJCVJEX0RGVEhSU0hfNzUsCisJCVJEX0RGVEhSU0hfODUsCisJCVJEX0RGVEhSU0hfOTAsCisJCVJEX0RGVEhSU0hfTUFYCisJfQorfQorCisvKgorICogUk9NIEFkZHJlc3MKKyAqLworcmVnaXN0ZXIgUk9NQUREUiB7CisJYWRkcmVzcwkJCTB4MDhBCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkzCit9CisKKy8qCisgKiBST00gQ29udHJvbAorICovCityZWdpc3RlciBST01DTlRSTCB7CisJYWRkcmVzcwkJCTB4MDhECisJYWNjZXNzX21vZGUJUlcKKwlmaWVsZAlST01PUAkJMHhFMAorCWZpZWxkCVJPTVNQRAkJMHgxOAorCWZpZWxkCVJFUEVBVAkJMHgwMgorCWZpZWxkCVJEWQkJMHgwMQorfQorCisvKgorICogUk9NIERhdGEKKyAqLworcmVnaXN0ZXIgUk9NREFUQSB7CisJYWRkcmVzcwkJCTB4MDhFCisJYWNjZXNzX21vZGUJUlcKK30KKworLyoKKyAqIERhdGEgQ2hhbm5lbCBSZWNlaXZlIE1lc3NhZ2UgMAorICovCityZWdpc3RlciBEQ0hSWE1TRzAgeworCWFkZHJlc3MJCQkweDA5MAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJCUNETlVNCTB4RjgKKwlmaWVsZAkJQ0ZOVU0JMHgwNworfQorCisvKgorICogQ01DIFJlY2lldmUgTWVzc2FnZSAwCisgKi8KK3JlZ2lzdGVyIENNQ1JYTVNHMCB7CisJYWRkcmVzcwkJCTB4MDkwCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCQlDRE5VTQkweEY4CisJZmllbGQJCUNGTlVNCTB4MDcKK30KKworLyoKKyAqIE92ZXJsYXkgUmVjaWV2ZSBNZXNzYWdlIDAKKyAqLworcmVnaXN0ZXIgT1ZMWVJYTVNHMCB7CisJYWRkcmVzcwkJCTB4MDkwCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJCUNETlVNCTB4RjgKKwlmaWVsZAkJQ0ZOVU0JMHgwNworfQorCisvKgorICogUmVsYXhlZCBPcmRlciBFbmFibGUKKyAqLworcmVnaXN0ZXIgUk9FTkFCTEUgeworCWFkZHJlc3MJCQkweDA5MAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJTVNJUk9FTgkJMHgyMAorCWZpZWxkCU9WTFlST0VOCTB4MTAKKwlmaWVsZAlDTUNST0VOCQkweDA4CisJZmllbGQJU0dST0VOCQkweDA0CisJZmllbGQJRENIMVJPRU4JMHgwMgorCWZpZWxkCURDSDBST0VOCTB4MDEKK30KKworLyoKKyAqIERhdGEgQ2hhbm5lbCBSZWNlaXZlIE1lc3NhZ2UgMQorICovCityZWdpc3RlciBEQ0hSWE1TRzEgeworCWFkZHJlc3MJCQkweDA5MQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJQ0JOVU0JCTB4RkYKK30KKworLyoKKyAqIENNQyBSZWNpZXZlIE1lc3NhZ2UgMQorICovCityZWdpc3RlciBDTUNSWE1TRzEgeworCWFkZHJlc3MJCQkweDA5MQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0NIQU4KKwlmaWVsZAlDQk5VTQkJMHhGRgorfQorCisvKgorICogT3ZlcmxheSBSZWNpZXZlIE1lc3NhZ2UgMQorICovCityZWdpc3RlciBPVkxZUlhNU0cxIHsKKwlhZGRyZXNzCQkJMHgwOTEKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlDQk5VTQkJMHhGRgorfQorCisvKgorICogTm8gU25vb3AgRW5hYmxlCisgKi8KK3JlZ2lzdGVyIE5TRU5BQkxFIHsKKwlhZGRyZXNzCQkJMHgwOTEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCU1TSU5TRU4JCTB4MjAKKwlmaWVsZAlPVkxZTlNFTgkweDEwCisJZmllbGQJQ01DTlNFTgkJMHgwOAorCWZpZWxkCVNHTlNFTgkJMHgwNAorCWZpZWxkCURDSDFOU0VOCTB4MDIKKwlmaWVsZAlEQ0gwTlNFTgkweDAxCit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgUmVjZWl2ZSBNZXNzYWdlIDIKKyAqLworcmVnaXN0ZXIgRENIUlhNU0cyIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCU1JTkRFWAkJMHhGRgorfQorCisvKgorICogQ01DIFJlY2lldmUgTWVzc2FnZSAyCisgKi8KK3JlZ2lzdGVyIENNQ1JYTVNHMiB7CisJYWRkcmVzcwkJCTB4MDkyCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCU1JTkRFWAkJMHhGRgorfQorCisvKgorICogT3ZlcmxheSBSZWNpZXZlIE1lc3NhZ2UgMgorICovCityZWdpc3RlciBPVkxZUlhNU0cyIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlNSU5ERVgJCTB4RkYKK30KKworLyoKKyAqIE91dHN0YW5kaW5nIFNwbGl0IFRyYW5zYWN0aW9ucworICovCityZWdpc3RlciBPU1QgeworCWFkZHJlc3MJCQkweDA5MgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgUmVjZWl2ZSBNZXNzYWdlIDMKKyAqLworcmVnaXN0ZXIgRENIUlhNU0czIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCU1DTEFTUwkJMHgwRgorfQorCisvKgorICogQ01DIFJlY2lldmUgTWVzc2FnZSAzCisgKi8KK3JlZ2lzdGVyIENNQ1JYTVNHMyB7CisJYWRkcmVzcwkJCTB4MDkzCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCU1DTEFTUwkJMHgwRgorfQorCisvKgorICogT3ZlcmxheSBSZWNpZXZlIE1lc3NhZ2UgMworICovCityZWdpc3RlciBPVkxZUlhNU0czIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlNQ0xBU1MJCTB4MEYKK30KKworLyoKKyAqIFBDSS1YIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgUENJWENUTCB7CisJYWRkcmVzcwkJCTB4MDkzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlTRVJSUFVMU0UJMHg4MAorCWZpZWxkCVVORVhQU0NJRU4JMHgyMAorCWZpZWxkCVNQTFRTTUFESVMJMHgxMAorCWZpZWxkCVNQTFRTVEFESVMJMHgwOAorCWZpZWxkCVNSU1BEUEVFTgkweDA0CisJZmllbGQJVFNDU0VSUkVOCTB4MDIKKwlmaWVsZAlDTVBBQkNESVMJMHgwMQorfQorCisvKgorICogQ01DIFNlcXVlbmNlciBCeXRlIENvdW50CisgKi8KK3JlZ2lzdGVyIENNQ1NFUUJDTlQgeworCWFkZHJlc3MJCQkweDA5NAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0NIQU4KK30KKworLyoKKyAqIE92ZXJsYXkgU2VxdWVuY2VyIEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgT1ZMWVNFUUJDTlQgeworCWFkZHJlc3MJCQkweDA5NAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogRGF0YSBDaGFubmVsIFNlcXVlbmNlciBCeXRlIENvdW50CisgKi8KK3JlZ2lzdGVyIERDSFNFUUJDTlQgeworCWFkZHJlc3MJCQkweDA5NAorCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRGF0YSBDaGFubmVsIFNwbGl0IFN0YXR1cyAwCisgKi8KK3JlZ2lzdGVyIERDSFNQTFRTVEFUMCB7CisJYWRkcmVzcwkJCTB4MDk2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlTVEFFVEVSTQkweDgwCisJZmllbGQJU0NCQ0VSUgkJMHg0MAorCWZpZWxkCVNDQURFUlIJCTB4MjAKKwlmaWVsZAlTQ0RBVEJVQ0tFVAkweDEwCisJZmllbGQJQ05UTk9UQ01QTFQJMHgwOAorCWZpZWxkCVJYT1ZSVU4JCTB4MDQKKwlmaWVsZAlSWFNDRU1TRwkweDAyCisJZmllbGQJUlhTUExUUlNQCTB4MDEKK30KKworLyoKKyAqIENNQyBTcGxpdCBTdGF0dXMgMAorICovCityZWdpc3RlciBDTUNTUExUU1RBVDAgeworCWFkZHJlc3MJCQkweDA5NgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KKwlmaWVsZAlTVEFFVEVSTQkweDgwCisJZmllbGQJU0NCQ0VSUgkJMHg0MAorCWZpZWxkCVNDQURFUlIJCTB4MjAKKwlmaWVsZAlTQ0RBVEJVQ0tFVAkweDEwCisJZmllbGQJQ05UTk9UQ01QTFQJMHgwOAorCWZpZWxkCVJYT1ZSVU4JCTB4MDQKKwlmaWVsZAlSWFNDRU1TRwkweDAyCisJZmllbGQJUlhTUExUUlNQCTB4MDEKK30KKworLyoKKyAqIE92ZXJsYXkgU3BsaXQgU3RhdHVzIDAKKyAqLworcmVnaXN0ZXIgT1ZMWVNQTFRTVEFUMCB7CisJYWRkcmVzcwkJCTB4MDk2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJU1RBRVRFUk0JMHg4MAorCWZpZWxkCVNDQkNFUlIJCTB4NDAKKwlmaWVsZAlTQ0FERVJSCQkweDIwCisJZmllbGQJU0NEQVRCVUNLRVQJMHgxMAorCWZpZWxkCUNOVE5PVENNUExUCTB4MDgKKwlmaWVsZAlSWE9WUlVOCQkweDA0CisJZmllbGQJUlhTQ0VNU0cJMHgwMgorCWZpZWxkCVJYU1BMVFJTUAkweDAxCit9CisKKy8qCisgKiBEYXRhIENoYW5uZWwgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgRENIU1BMVFNUQVQxIHsKKwlhZGRyZXNzCQkJMHgwOTcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCVJYREFUQUJVQ0tFVAkweDAxCit9CisKKy8qCisgKiBDTUMgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgQ01DU1BMVFNUQVQxIHsKKwlhZGRyZXNzCQkJMHgwOTcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NDSEFOCisJZmllbGQJUlhEQVRBQlVDS0VUCTB4MDEKK30KKworLyoKKyAqIE92ZXJsYXkgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgT1ZMWVNQTFRTVEFUMSB7CisJYWRkcmVzcwkJCTB4MDk3CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJUlhEQVRBQlVDS0VUCTB4MDEKK30KKworLyoKKyAqIFMvRyBSZWNlaXZlIE1lc3NhZ2UgMAorICovCityZWdpc3RlciBTR1JYTVNHMCB7CisJYWRkcmVzcwkJCTB4MDk4CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAkJQ0ROVU0JMHhGOAorCWZpZWxkCQlDRk5VTQkweDA3Cit9CisKKy8qCisgKiBTL0cgUmVjZWl2ZSBNZXNzYWdlIDEKKyAqLworcmVnaXN0ZXIgU0dSWE1TRzEgeworCWFkZHJlc3MJCQkweDA5OQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJQ0JOVU0JCTB4RkYKK30KKworLyoKKyAqIFMvRyBSZWNlaXZlIE1lc3NhZ2UgMgorICovCityZWdpc3RlciBTR1JYTVNHMiB7CisJYWRkcmVzcwkJCTB4MDlBCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlNSU5ERVgJCTB4RkYKK30KKworLyoKKyAqIFMvRyBSZWNlaXZlIE1lc3NhZ2UgMworICovCityZWdpc3RlciBTR1JYTVNHMyB7CisJYWRkcmVzcwkJCTB4MDlCCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKKwlmaWVsZAlNQ0xBU1MJCTB4MEYKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBZGRyZXNzIDAKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFEUjAgeworCWFkZHJlc3MJCQkweDA5OAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUxPV0VSX0FERFIJMHg3RgorfQorCisvKgorICogU2xhdmUgU3BsaXQgT3V0IEFkZHJlc3MgMQorICovCityZWdpc3RlciBTTFZTUExUT1VUQURSMSB7CisJYWRkcmVzcwkJCTB4MDk5CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJUkVRX0ROVU0JMHhGOAorCWZpZWxkCVJFUV9GTlVNCTB4MDcKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBZGRyZXNzIDIKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFEUjIgeworCWFkZHJlc3MJCQkweDA5QQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCVJFUV9CTlVNCTB4RkYKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBZGRyZXNzIDMKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFEUjMgeworCWFkZHJlc3MJCQkweDA5QgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCVJMWE9SRAkJMDIwCisJZmllbGQJVEFHX05VTQkJMHgxRgorfQorCisvKgorICogU0cgU2VxdWVuY2VyIEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgU0dTRVFCQ05UIHsKKwlhZGRyZXNzCQkJMHgwOUMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogU2xhdmUgU3BsaXQgT3V0IEF0dHJpYnV0ZSAwCisgKi8KK3JlZ2lzdGVyIFNMVlNQTFRPVVRBVFRSMCB7CisJYWRkcmVzcwkJCTB4MDlDCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJTE9XRVJfQkNOVAkweEZGCit9CisKKy8qCisgKiBTbGF2ZSBTcGxpdCBPdXQgQXR0cmlidXRlIDEKKyAqLworcmVnaXN0ZXIgU0xWU1BMVE9VVEFUVFIxIHsKKwlhZGRyZXNzCQkJMHgwOUQKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlDTVBMVF9ETlVNCTB4RjgKKwlmaWVsZAlDTVBMVF9GTlVNCTB4MDcKK30KKworLyoKKyAqIFNsYXZlIFNwbGl0IE91dCBBdHRyaWJ1dGUgMgorICovCityZWdpc3RlciBTTFZTUExUT1VUQVRUUjIgeworCWFkZHJlc3MJCQkweDA5RQorCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlDTVBMVF9CTlVNCTB4RkYKK30KKy8qCisgKiBTL0cgU3BsaXQgU3RhdHVzIDAKKyAqLworcmVnaXN0ZXIgU0dTUExUU1RBVDAgeworCWFkZHJlc3MJCQkweDA5RQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJU1RBRVRFUk0JMHg4MAorCWZpZWxkCVNDQkNFUlIJCTB4NDAKKwlmaWVsZAlTQ0FERVJSCQkweDIwCisJZmllbGQJU0NEQVRCVUNLRVQJMHgxMAorCWZpZWxkCUNOVE5PVENNUExUCTB4MDgKKwlmaWVsZAlSWE9WUlVOCQkweDA0CisJZmllbGQJUlhTQ0VNU0cJMHgwMgorCWZpZWxkCVJYU1BMVFJTUAkweDAxCit9CisKKy8qCisgKiBTL0cgU3BsaXQgU3RhdHVzIDEKKyAqLworcmVnaXN0ZXIgU0dTUExUU1RBVDEgeworCWFkZHJlc3MJCQkweDA5RgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJZmllbGQJUlhEQVRBQlVDS0VUCTB4MDEKK30KKworLyoKKyAqIFNwZWNpYWwgRnVuY3Rpb24KKyAqLworcmVnaXN0ZXIgU0ZVTkNUIHsKKwlhZGRyZXNzCQkJMHgwOWYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVRFU1RfR1JPVVAJMHhGMAorCWZpZWxkCVRFU1RfTlVNCTB4MEYKK30KKworLyoKKyAqIERhdGEgRklGTyAwIFBDSSBTdGF0dXMgCisgKi8KK3JlZ2lzdGVyIERGMFBDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCVRXQVRFUlIJCTB4MDIKKwlmaWVsZAlEUFIJCTB4MDEKK30KKworLyoKKyAqIERhdGEgRklGTyAxIFBDSSBTdGF0dXMgCisgKi8KK3JlZ2lzdGVyIERGMVBDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCVRXQVRFUlIJCTB4MDIKKwlmaWVsZAlEUFIJCTB4MDEKK30KKworLyoKKyAqIFMvRyBQQ0kgU3RhdHVzIAorICovCityZWdpc3RlciBTR1BDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCURQUgkJMHgwMQorfQorCisvKgorICogQ01DIFBDSSBTdGF0dXMgCisgKi8KK3JlZ2lzdGVyIENNQ1BDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBMworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCVRXQVRFUlIJCTB4MDIKKwlmaWVsZAlEUFIJCTB4MDEKK30KKworLyoKKyAqIE92ZXJsYXkgUENJIFN0YXR1cyAKKyAqLworcmVnaXN0ZXIgT1ZMWVBDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBNAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJUk1BCQkweDIwCisJZmllbGQJUlRBCQkweDEwCisJZmllbGQJU0NBQVBFUlIJMHgwOAorCWZpZWxkCVJEUEVSUgkJMHgwNAorCWZpZWxkCURQUgkJMHgwMQorfQorCisvKgorICogUENJIFN0YXR1cyBmb3IgTVNJIE1hc3RlciBETUEgVHJhbnNmZXIKKyAqLworcmVnaXN0ZXIgTVNJUENJU1RBVCB7CisJYWRkcmVzcwkJCTB4MEE2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlTU0UJCTB4NDAKKwlmaWVsZAlSTUEJCTB4MjAKKwlmaWVsZAlSVEEJCTB4MTAKKwlmaWVsZAlDTFJQRU5ETVNJCTB4MDgKKwlmaWVsZAlUV0FURVJSCQkweDAyCisJZmllbGQJRFBSCQkweDAxCit9CisKKy8qCisgKiBQQ0kgU3RhdHVzIGZvciBUYXJnZXQKKyAqLworcmVnaXN0ZXIgVEFSR1BDSVNUQVQgeworCWFkZHJlc3MJCQkweDBBNworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRFBFCQkweDgwCisJZmllbGQJU1NFCQkweDQwCisJZmllbGQJU1RBCQkweDA4CisJZmllbGQJVFdBVEVSUgkJMHgwMgorfQorCisvKgorICogTFEgUGFja2V0IEluCisgKiBUaGUgbGFzdCBMUSBQYWNrZXQgcmVjZWl2ZWQKKyAqLworcmVnaXN0ZXIgTFFJTiB7CisJYWRkcmVzcwkJCTB4MDIwCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyMAorCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCit9CisKKy8qCisgKiBTQ0IgVHlwZSBQb2ludGVyCisgKiBTQ0Igb2Zmc2V0IGZvciBUYXJnZXQgTW9kZSBTQ0IgdHlwZSBpbmZvcm1hdGlvbgorICovCityZWdpc3RlciBUWVBFUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjAKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogUXVldWUgVGFnIFBvaW50ZXIKKyAqIFNDQiBvZmZzZXQgdG8gdGhlIFR3byBCeXRlIHRhZyBpZGVudGlmaWVyIHVzZWQgZm9yIHRhcmdldCBtb2RlLgorICovCityZWdpc3RlciBUQUdQVFIgeworCWFkZHJlc3MJCQkweDAyMQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMb2dpY2FsIFVuaXQgTnVtYmVyIFBvaW50ZXIKKyAqIFNDQiBvZmZzZXQgdG8gdGhlIExTQiAobGl0dGxlIGVuZGlhbikgb2YgdGhlIGx1biBmaWVsZC4KKyAqLworcmVnaXN0ZXIgTFVOUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjIKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogRGF0YSBMZW5ndGggUG9pbnRlcgorICogU0NCIG9mZnNldCBmb3IgdGhlIDQgYnl0ZSBkYXRhIGxlbmd0aCBmaWVsZCBpbiB0YXJnZXQgbW9kZS4KKyAqLworcmVnaXN0ZXIgREFUQUxFTlBUUiB7CisJYWRkcmVzcwkJCTB4MDIzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFN0YXR1cyBMZW5ndGggUG9pbnRlcgorICogU0NCIG9mZnNldCB0byB0aGUgdHdvIGJ5dGUgc3RhdHVzIGZpZWxkIGluIHRhcmdldCBTQ0JzLgorICovCityZWdpc3RlciBTVEFUTEVOUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogQ29tbWFuZCBMZW5ndGggUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIENEQiBsZW5ndGggZmllbGQgaW4gaW5pdGlhdG9yIFNDQnMuCisgKi8KK3JlZ2lzdGVyIENNRExFTlBUUiB7CisJYWRkcmVzcwkJCTB4MDI1CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFRhc2sgQXR0cmlidXRlIFBvaW50ZXIKKyAqIFNjYiBvZmZzZXQgZm9yIHRoZSBieXRlIGZpZWxkIHNwZWNpZnlpbmcgdGhlIGF0dHJpYnV0ZSBieXRlCisgKiB0byBiZSB1c2VkIGluIGNvbW1hbmQgcGFja2V0cy4KKyAqLyAKK3JlZ2lzdGVyIEFUVFJQVFIgeworCWFkZHJlc3MJCQkweDAyNgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBUYXNrIE1hbmFnZW1lbnQgRmxhZ3MgUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIGJ5dGUgZmllbGQgc3BlY2lmeWluZyB0aGUgYXR0cmlidXRlIGZsYWdzCisgKiBieXRlIHRvIGJlIHVzZWQgaW4gY29tbWFuZCBwYWNrZXRzLgorICovIAorcmVnaXN0ZXIgRkxBR1BUUiB7CisJYWRkcmVzcwkJCTB4MDI3CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIENvbW1hbmQgUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIENEQiBmb3IgaW5pdGlhdG9yIFNDQnMuCisgKi8KK3JlZ2lzdGVyIENNRFBUUiB7CisJYWRkcmVzcwkJCTB4MDI4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFF1ZXVlIE5leHQgUG9pbnRlcgorICogU2NiIG9mZnNldCBmb3IgdGhlIDIgYnl0ZSAibmV4dCBzY2IgbGluayIuCisgKi8KK3JlZ2lzdGVyIFFORVhUUFRSIHsKKwlhZGRyZXNzCQkJMHgwMjkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogU0NTSSBJRCBQb2ludGVyCisgKiBTY2Igb2Zmc2V0IHRvIHRoZSB2YWx1ZSB0byBwbGFjZSBpbiB0aGUgU0NTSUlEIHJlZ2lzdGVyCisgKiBkdXJpbmcgdGFyZ2V0IG1vZGUgY29ubmVjdGlvbnMuCisgKi8KK3JlZ2lzdGVyIElEUFRSIHsKKwlhZGRyZXNzCQkJMHgwMkEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworfQorCisvKgorICogQ29tbWFuZCBBYm9ydGVkIEJ5dGUgUG9pbnRlcgorICogT2Zmc2V0IHRvIHRoZSBTQ0IgZmxhZ3MgZmllbGQgdGhhdCBpbmNsdWRlcyB0aGUKKyAqICJTQ0IgYWJvcnRlZCIgc3RhdHVzIGJpdC4KKyAqLworcmVnaXN0ZXIgQUJSVEJZVEVQVFIgeworCWFkZHJlc3MJCQkweDAyQgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBDb21tYW5kIEFib3J0ZWQgQml0IFBvaW50ZXIKKyAqIEJpdCBvZmZzZXQgaW4gdGhlIFNDQiBmbGFncyBmaWVsZCBmb3IgIlNDQiBhYm9ydGVkIiBzdGF0dXMuCisgKi8KK3JlZ2lzdGVyIEFCUlRCSVRQVFIgeworCWFkZHJlc3MJCQkweDAyQworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBSZXYgQiBvciBncmVhdGVyLgorICovCityZWdpc3RlciBNQVhDTURCWVRFUyB7CisJYWRkcmVzcwkJCTB4MDJECisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFJldiBCIG9yIGdyZWF0ZXIuCisgKi8KK3JlZ2lzdGVyIE1BWENNRDJSQ1YgeworCWFkZHJlc3MJCQkweDAyRQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBSZXYgQiBvciBncmVhdGVyLgorICovCityZWdpc3RlciBTSE9SVFRIUkVTSCB7CisJYWRkcmVzcwkJCTB4MDJGCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIExvZ2ljYWwgVW5pdCBOdW1iZXIgTGVuZ3RoCisgKiBUaGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIFNDQiBsdW4gZmllbGQuCisgKi8KK3JlZ2lzdGVyIExVTkxFTiB7CisJYWRkcmVzcwkJCTB4MDMwCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwltYXNrCQlJTFVOTEVOCTB4MEYKKwltYXNrCQlUTFVOTEVOCTB4RjAKK30KK2NvbnN0IExVTkxFTl9TSU5HTEVfTEVWRUxfTFVOIDB4RgorCisvKgorICogQ0RCIExpbWl0CisgKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBlbWJlZGRlZCBDREIgZmllbGQgaW4gaW5pdGF0b3IgU0NCcy4KKyAqLworcmVnaXN0ZXIgQ0RCTElNSVQgeworCWFkZHJlc3MJCQkweDAzMQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBNYXhpbXVtIENvbW1hbmRzCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tbWFuZHMgdG8gaXNzdWUgZHVyaW5nIGEKKyAqIHNpbmdsZSBwYWNrZXRpemVkIGNvbm5lY3Rpb24uCisgKi8KK3JlZ2lzdGVyIE1BWENNRCB7CisJYWRkcmVzcwkJCTB4MDMyCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIE1heGltdW0gQ29tbWFuZCBDb3VudGVyCisgKiBUaGUgbnVtYmVyIG9mIGNvbW1hbmRzIGFscmVhZHkgc2VudCBkdXJpbmcgdGhpcyBjb25uZWN0aW9uCisgKi8KK3JlZ2lzdGVyIE1BWENNRENOVCB7CisJYWRkcmVzcwkJCTB4MDMzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIExRIFBhY2tldCBSZXNlcnZlZCBCeXRlcworICogVGhlIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIGN1cnJlbnRseSByZXNlcnZlZCBmaWxlZHMKKyAqIG9mIGFsbCBMUSBwYWNrZXRzLgorICovCityZWdpc3RlciBMUVJTVkQwMSB7CisJYWRkcmVzcwkJCTB4MDM0CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CityZWdpc3RlciBMUVJTVkQxNiB7CisJYWRkcmVzcwkJCTB4MDM1CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CityZWdpc3RlciBMUVJTVkQxNyB7CisJYWRkcmVzcwkJCTB4MDM2CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBDb21tYW5kIFJlc2VydmVkIDAKKyAqIFRoZSBieXRlIHRvIGJlIHNlbnQgZm9yIHRoZSByZXNlcnZlZCBieXRlIDAgb2YKKyAqIG91dGdvaW5nIGNvbW1hbmQgcGFja2V0cy4KKyAqLworcmVnaXN0ZXIgQ01EUlNWRDAgeworCWFkZHJlc3MJCQkweDAzNworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMUSBNYW5hZ2VyIENvbnRyb2wgMAorICovCityZWdpc3RlciBMUUNUTDAgeworCWFkZHJlc3MJCQkweDAzOAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJTFFJVEFSR0NMVAkweEMwCisJZmllbGQJTFFJSU5JVEdDTFQJMHgzMAorCWZpZWxkCUxRMFRBUkdDTFQJMHgwQworCWZpZWxkCUxRMElOSVRHQ0xUCTB4MDMKK30KKworLyoKKyAqIExRIE1hbmFnZXIgQ29udHJvbCAxCisgKi8KK3JlZ2lzdGVyIExRQ1RMMSB7CisJYWRkcmVzcwkJCTB4MDM4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCVBDSTJQQ0kJCTB4MDQKKwlmaWVsZAlTSU5HTEVDTUQJMHgwMgorCWZpZWxkCUFCT1JUUEVORElORwkweDAxCit9CisKKy8qCisgKiBMUSBNYW5hZ2VyIENvbnRyb2wgMgorICovCityZWdpc3RlciBMUUNUTDIgeworCWFkZHJlc3MJCQkweDAzOQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlMUUlSRVRSWQkweDgwCisJZmllbGQJTFFJQ09OVElOVUUJMHg0MAorCWZpZWxkCUxRSVRPSURMRQkweDIwCisJZmllbGQJTFFJUEFVU0UJMHgxMAorCWZpZWxkCUxRT1JFVFJZCTB4MDgKKwlmaWVsZAlMUU9DT05USU5VRQkweDA0CisJZmllbGQJTFFPVE9JRExFCTB4MDIKKwlmaWVsZAlMUU9QQVVTRQkweDAxCit9CisKKy8qCisgKiBTQ1NJIFJBTSBCSVNUMAorICovCityZWdpc3RlciBTQ1NCSVNUMCB7CisJYWRkcmVzcwkJCTB4MDM5CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlHU0JJU1RFUlIJMHg0MAorCWZpZWxkCUdTQklTVERPTkUJMHgyMAorCWZpZWxkCUdTQklTVFJVTgkweDEwCisJZmllbGQJT1NCSVNURVJSCTB4MDQKKwlmaWVsZAlPU0JJU1RET05FCTB4MDIKKwlmaWVsZAlPU0JJU1RSVU4JMHgwMQorfQorCisvKgorICogU0NTSSBTZXF1ZW5jZSBDb250cm9sMAorICovCityZWdpc3RlciBTQ1NJU0VRMCB7CisJYWRkcmVzcwkJCTB4MDNBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCVRFTU9ERU8JCTB4ODAKKwlmaWVsZAlFTlNFTE8JCTB4NDAKKwlmaWVsZAlFTkFSQk8JCTB4MjAKKwlmaWVsZAlGT1JDRUJVU0ZSRUUJMHgxMAorCWZpZWxkCVNDU0lSU1RPCTB4MDEKK30KKworLyoKKyAqIFNDU0kgUkFNIEJJU1QgMQorICovCityZWdpc3RlciBTQ1NCSVNUMSB7CisJYWRkcmVzcwkJCTB4MDNBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlOVEJJU1RFUlIJMHgwNAorCWZpZWxkCU5UQklTVERPTkUJMHgwMgorCWZpZWxkCU5UQklTVFJVTgkweDAxCit9CisKKy8qCisgKiBTQ1NJIFNlcXVlbmNlIENvbnRyb2wgMQorICovCityZWdpc3RlciBTQ1NJU0VRMSB7CisJYWRkcmVzcwkJCTB4MDNCCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCU1BTlVBTENUTAkweDQwCisJZmllbGQJRU5TRUxJCQkweDIwCisJZmllbGQJRU5SU0VMSQkJMHgxMAorCWZpZWxkCU1BTlVBTFAJCTB4MEMKKwlmaWVsZAlFTkFVVE9BVE5QCTB4MDIKKwlmaWVsZAlBTFRTVElNCQkweDAxCit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvbnRyb2wgMAorICovCityZWdpc3RlciBTWEZSQ1RMMCB7CisJYWRkcmVzcwkJCTB4MDNDCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJREZPTgkJMHg4MAorCWZpZWxkCURGUEVYUAkJMHg0MAorCWZpZWxkCUJJT1NDQU5DRUxFTgkweDEwCisJZmllbGQJU1BJT0VOCQkweDA4Cit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvbnRyb2wgMQorICovCityZWdpc3RlciBTWEZSQ1RMMSB7CisJYWRkcmVzcwkJCTB4MDNECisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJQklUQlVDS0VUCTB4ODAKKwlmaWVsZAlFTlNBQ0hLCQkweDQwCisJZmllbGQJRU5TUENISwkJMHgyMAorCWZpZWxkCVNUSU1FU0VMCTB4MTgKKwlmaWVsZAlFTlNUSU1FUgkweDA0CisJZmllbGQJQUNUTkVHRU4JMHgwMgorCWZpZWxkCVNUUFdFTgkJMHgwMQorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDIKKyAqLworcmVnaXN0ZXIgU1hGUkNUTDIgeworCWFkZHJlc3MJCQkweDAzRQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUFVVE9SU1RESVMJMHgxMAorCWZpZWxkCUNNRERNQUVOCTB4MDgKKwlmaWVsZAlBU1UJCTB4MDcKK30KKworLyoKKyAqIFNDU0kgQnVzIEluaXRpYXRvciBJRHMKKyAqIEJpdG1hc2sgb2Ygb2JzZXJ2ZWQgaW5pdGlhdG9ycyBvbiB0aGUgYnVzLgorICovCityZWdpc3RlciBCVVNJTklUSUQgeworCWFkZHJlc3MJCQkweDAzQworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJc2l6ZQkJMgorfQorCisvKgorICogRGF0YSBMZW5ndGggQ291bnRlcnMKKyAqIFBhY2tldCBieXRlIGNvdW50ZXIuCisgKi8KK3JlZ2lzdGVyIERMQ09VTlQgeworCWFkZHJlc3MJCQkweDAzQworCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCisJc2l6ZQkJMworfQorCisvKgorICogRGF0YSBGSUZPIFN0YXR1cworICovCityZWdpc3RlciBERkZTVEFUIHsKKwlhZGRyZXNzCQkJMHgwM0YKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlGSUZPMUZSRUUJMHgyMAorCWZpZWxkCUZJRk8wRlJFRQkweDEwCisJLyoKKwkgKiBPbiB0aGUgQiwgdGhpcyBlbnVtIG9ubHkgd29ya3MKKwkgKiBpbiB0aGUgcmVhZCBkaXJlY3Rpb24uICBGb3Igd3JpdGVzLAorCSAqIHlvdSBtdXN0IHVzZSB0aGUgQiB2ZXJzaW9uIG9mIHRoZQorCSAqIENVUlJGSUZPXzAgZGVmaW5pdGlvbiB3aGljaCBpcyBkZWZpbmVkCisJICogYXMgYSBjb25zdGFudCBvdXRzaWRlIG9mIHRoaXMgcmVnaXN0ZXIKKwkgKiBkZWZpbml0aW9uIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUKKwkgKiByZWdpc3RlciBwcmV0dHkgcHJpbnRpbmcgY29kZS4KKwkgKi8KKwllbnVtCUNVUlJGSUZPCTB4MDMgeworCQlDVVJSRklGT18wLAorCQlDVVJSRklGT18xLAorCQlDVVJSRklGT19OT05FCTB4MworCX0KK30KKworY29uc3QgQl9DVVJSRklGT18wIDB4MgorCisvKgorICogU0NTSSBCdXMgVGFyZ2V0IElEcworICogQml0bWFzayBvZiBvYnNlcnZlZCB0YXJnZXRzIG9uIHRoZSBidXMuCisgKi8KK3JlZ2lzdGVyIEJVU1RBUkdJRCB7CisJYWRkcmVzcwkJCTB4MDNFCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlzaXplCQkyCit9CisKKy8qCisgKiBTQ1NJIENvbnRyb2wgU2lnbmFsIE91dAorICovCityZWdpc3RlciBTQ1NJU0lHTyB7CisJYWRkcmVzcwkJCTB4MDQwCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNETwkJMHg4MAorCWZpZWxkCUlPTwkJMHg0MAorCWZpZWxkCU1TR08JCTB4MjAKKwlmaWVsZAlBVE5PCQkweDEwCisJZmllbGQJU0VMTwkJMHgwOAorCWZpZWxkCUJTWU8JCTB4MDQKKwlmaWVsZAlSRVFPCQkweDAyCisJZmllbGQJQUNLTwkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyB0byB3cml0ZSBpbnRvIFNDU0lTSUcwCisgKi8KKwllbnVtCVBIQVNFX01BU0sgIENET3xJT098TVNHTyB7CisJCVBfREFUQU9VVAkweDAsCisJCVBfREFUQUlOCUlPTywKKwkJUF9EQVRBT1VUX0RUCVBfREFUQU9VVHxNU0dPLAorCQlQX0RBVEFJTl9EVAlQX0RBVEFJTnxNU0dPLAorCQlQX0NPTU1BTkQJQ0RPLAorCQlQX01FU0dPVVQJQ0RPfE1TR08sCisJCVBfU1RBVFVTCUNET3xJT08sCisJCVBfTUVTR0lOCUNET3xJT098TVNHTworCX0KK30KKworcmVnaXN0ZXIgU0NTSVNJR0kgeworCWFkZHJlc3MJCQkweDA0MQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDREkJCTB4ODAKKwlmaWVsZAlJT0kJCTB4NDAKKwlmaWVsZAlNU0dJCQkweDIwCisJZmllbGQJQVROSQkJMHgxMAorCWZpZWxkCVNFTEkJCTB4MDgKKwlmaWVsZAlCU1lJCQkweDA0CisJZmllbGQJUkVRSQkJMHgwMgorCWZpZWxkCUFDS0kJCTB4MDEKKy8qCisgKiBQb3NzaWJsZSBwaGFzZXMgaW4gU0NTSVNJR0kKKyAqLworCWVudW0JUEhBU0VfTUFTSyAgQ0RPfElPT3xNU0dPIHsKKwkJUF9EQVRBT1VUCTB4MCwKKwkJUF9EQVRBSU4JSU9PLAorCQlQX0RBVEFPVVRfRFQJUF9EQVRBT1VUfE1TR08sCisJCVBfREFUQUlOX0RUCVBfREFUQUlOfE1TR08sCisJCVBfQ09NTUFORAlDRE8sCisJCVBfTUVTR09VVAlDRE98TVNHTywKKwkJUF9TVEFUVVMJQ0RPfElPTywKKwkJUF9NRVNHSU4JQ0RPfElPT3xNU0dPCisJfQorfQorCisvKgorICogTXVsdGlwbGUgVGFyZ2V0IElEcworICogQml0bWFzayBvZiBpZHMgdG8gcmVzcG9uZCBhcyBhIHRhcmdldC4KKyAqLworcmVnaXN0ZXIgTVVMVEFSR0lEIHsKKwlhZGRyZXNzCQkJMHgwNDAKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCXNpemUJCTIKK30KKworLyoKKyAqIFNDU0kgUGhhc2UKKyAqLworcmVnaXN0ZXIgU0NTSVBIQVNFIHsKKwlhZGRyZXNzCQkJMHgwNDIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJU1RBVFVTX1BIQVNFCTB4MjAKKwlmaWVsZAlDT01NQU5EX1BIQVNFCTB4MTAKKwlmaWVsZAlNU0dfSU5fUEhBU0UJMHgwOAorCWZpZWxkCU1TR19PVVRfUEhBU0UJMHgwNAorCWZpZWxkCURBVEFfUEhBU0VfTUFTSwkweDAzIHsKKwkJREFUQV9PVVRfUEhBU0UJMHgwMSwKKwkJREFUQV9JTl9QSEFTRQkweDAyCisJfQorfQorCisvKgorICogU0NTSSBEYXRhIDAgSW1hZ2UKKyAqLworcmVnaXN0ZXIgU0NTSURBVDBfSU1HIHsKKwlhZGRyZXNzCQkJMHgwNDMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCit9CisKKy8qCisgKiBTQ1NJIExhdGNoZWQgRGF0YQorICovCityZWdpc3RlciBTQ1NJREFUIHsKKwlhZGRyZXNzCQkJMHgwNDQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJc2l6ZQkJMgorfQorCisvKgorICogU0NTSSBEYXRhIEJ1cworICovCityZWdpc3RlciBTQ1NJQlVTIHsKKwlhZGRyZXNzCQkJMHgwNDYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJc2l6ZQkJMgorfQorCisvKgorICogVGFyZ2V0IElEIEluCisgKi8KK3JlZ2lzdGVyIFRBUkdJRElOIHsKKwlhZGRyZXNzCQkJMHgwNDgKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJQ0xLT1VUCQkweDgwCisJZmllbGQJVEFSR0lECQkweDBGCit9CisKKy8qCisgKiBTZWxlY3Rpb24vUmVzZWxlY3Rpb24gSUQKKyAqIFVwcGVyIGZvdXIgYml0cyBhcmUgdGhlIGRldmljZSBpZC4gIFRoZSBPTkVCSVQgaXMgc2V0IHdoZW4gdGhlIHJlL3NlbGVjdGluZworICogZGV2aWNlIGRpZCBub3Qgc2V0IGl0cyBvd24gSUQuCisgKi8KK3JlZ2lzdGVyIFNFTElEIHsKKwlhZGRyZXNzCQkJMHgwNDkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJU0VMSURfTUFTSwkweGYwCisJZmllbGQJT05FQklUCQkweDA4Cit9CisKKy8qCisgKiBTQ1NJIEJsb2NrIENvbnRyb2wKKyAqIENvbnRyb2xzIEJ1cyB0eXBlIGFuZCBjaGFubmVsIHNlbGVjdGlvbi4gIFNFTFdJREUgYWxsb3dzIGZvciB0aGUKKyAqIGNvZXhpc3RlbmNlIG9mIDhiaXQgYW5kIDE2Yml0IGRldmljZXMgb24gYSB3aWRlIGJ1cy4KKyAqLworcmVnaXN0ZXIgU0JMS0NUTCB7CisJYWRkcmVzcwkJCTB4MDRBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCURJQUdMRURFTgkweDgwCisJZmllbGQJRElBR0xFRE9OCTB4NDAKKwlmaWVsZAlFTkFCNDAJCTB4MDgJLyogTFZEIHRyYW5zY2VpdmVyIGFjdGl2ZSAqLworCWZpZWxkCUVOQUIyMAkJMHgwNAkvKiBTRS9IVkQgdHJhbnNjZWl2ZXIgYWN0aXZlICovCisJZmllbGQJU0VMV0lERQkJMHgwMgorfQorCisvKgorICogT3B0aW9uIE1vZGUKKyAqLworcmVnaXN0ZXIgT1BUSU9OTU9ERSB7CisJYWRkcmVzcwkJCTB4MDRBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlCSU9TQ0FOQ1RMCQkweDgwCisJZmllbGQJQVVUT0FDS0VOCQkweDQwCisJZmllbGQJQklBU0NBTkNUTAkJMHgyMAorCWZpZWxkCUJVU0ZSRUVSRVYJCTB4MTAKKwlmaWVsZAlFTkRHRk9STUNISwkJMHgwNAorCWZpZWxkCUFVVE9fTVNHT1VUX0RFCQkweDAyCisJbWFzawlPUFRJT05NT0RFX0RFRkFVTFRTCUFVVE9fTVNHT1VUX0RFCit9CisKKy8qCisgKiBTQ1NJIFN0YXR1cyAwCisgKi8KK3JlZ2lzdGVyIFNTVEFUMAl7CisJYWRkcmVzcwkJCTB4MDRCCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCVRBUkdFVAkJMHg4MAkvKiBCb2FyZCBhY3RpbmcgYXMgdGFyZ2V0ICovCisJZmllbGQJU0VMRE8JCTB4NDAJLyogU2VsZWN0aW9uIERvbmUgKi8KKwlmaWVsZAlTRUxESQkJMHgyMAkvKiBCb2FyZCBoYXMgYmVlbiBzZWxlY3RlZCAqLworCWZpZWxkCVNFTElOR08JCTB4MTAJLyogU2VsZWN0aW9uIEluIFByb2dyZXNzICovCisJZmllbGQJSU9FUlIJCTB4MDgJLyogTFZEIFRyYW5jZWl2ZXIgbW9kZSBjaGFuZ2VkICovCisJZmllbGQJT1ZFUlJVTgkJMHgwNAkvKiBTQ1NJIE9mZnNldCBvdmVycnVuIGRldGVjdGVkICovCisJZmllbGQJU1BJT1JEWQkJMHgwMgkvKiBTQ1NJIFBJTyBSZWFkeSAqLworCWZpZWxkCUFSQkRPCQkweDAxCS8qIEFyYml0cmF0aW9uIERvbmUgT3V0ICovCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAwCisgKiBXcml0aW5nIGEgMSB0byBhIGJpdCBjbGVhcnMgdGhlIGFzc29jaWF0ZWQgU0NTSSBJbnRlcnJ1cHQgaW4gU1NUQVQwLgorICovCityZWdpc3RlciBDTFJTSU5UMCB7CisJYWRkcmVzcwkJCTB4MDRCCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUlNFTERPCTB4NDAKKwlmaWVsZAlDTFJTRUxESQkweDIwCisJZmllbGQJQ0xSU0VMSU5HTwkweDEwCisJZmllbGQJQ0xSSU9FUlIJMHgwOAorCWZpZWxkCUNMUk9WRVJSVU4JMHgwNAorCWZpZWxkCUNMUlNQSU9SRFkJMHgwMgorCWZpZWxkCUNMUkFSQkRPCTB4MDEKK30KKworLyoKKyAqIFNDU0kgSW50ZXJydXB0IE1vZGUgMAorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUwIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTAgeworCWFkZHJlc3MJCQkweDA0QgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRU5TRUxETwkJMHg0MAorCWZpZWxkCUVOU0VMREkJCTB4MjAKKwlmaWVsZAlFTlNFTElOR08JMHgxMAorCWZpZWxkCUVOSU9FUlIJCTB4MDgKKwlmaWVsZAlFTk9WRVJSVU4JMHgwNAorCWZpZWxkCUVOU1BJT1JEWQkweDAyCisJZmllbGQJRU5BUkJETwkJMHgwMQorfQorCisvKgorICogU0NTSSBTdGF0dXMgMQorICovCityZWdpc3RlciBTU1RBVDEgeworCWFkZHJlc3MJCQkweDA0QworCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlTRUxUTwkJMHg4MAorCWZpZWxkCUFUTlRBUkcgCTB4NDAKKwlmaWVsZAlTQ1NJUlNUSQkweDIwCisJZmllbGQJUEhBU0VNSVMJMHgxMAorCWZpZWxkCUJVU0ZSRUUJCTB4MDgKKwlmaWVsZAlTQ1NJUEVSUgkweDA0CisJZmllbGQJU1RSQjJGQVNUCTB4MDIKKwlmaWVsZAlSRVFJTklUCQkweDAxCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAxCisgKiBXcml0aW5nIGEgMSB0byBhIGJpdCBjbGVhcnMgdGhlIGFzc29jaWF0ZWQgU0NTSSBJbnRlcnJ1cHQgaW4gU1NUQVQxLgorICovCityZWdpc3RlciBDTFJTSU5UMSB7CisJYWRkcmVzcwkJCTB4MDRDCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUlNFTFRJTUVPCTB4ODAKKwlmaWVsZAlDTFJBVE5PCQkweDQwCisJZmllbGQJQ0xSU0NTSVJTVEkJMHgyMAorCWZpZWxkCUNMUkJVU0ZSRUUJMHgwOAorCWZpZWxkCUNMUlNDU0lQRVJSCTB4MDQKKwlmaWVsZAlDTFJTVFJCMkZBU1QJMHgwMgorCWZpZWxkCUNMUlJFUUlOSVQJMHgwMQorfQorCisvKgorICogU0NTSSBTdGF0dXMgMgorICovCityZWdpc3RlciBTU1RBVDIgeworCWFkZHJlc3MJCQkweDA0ZAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlCVVNGUkVFVElNRQkweGMwIHsKKwkJQlVTRlJFRV9MUU8JMHg0MCwKKwkJQlVTRlJFRV9ERkYwCTB4ODAsCisJCUJVU0ZSRUVfREZGMQkweEMwCisJfQorCWZpZWxkCU5PTlBBQ0tSRVEJMHgyMAorCWZpZWxkCUVYUF9BQ1RJVkUJMHgxMAkvKiBTQ1NJIEV4cGFuZGVyIEFjdGl2ZSAqLworCWZpZWxkCUJTWVgJCTB4MDgJLyogQnVzeSBFeHBhbmRlciAqLworCWZpZWxkCVdJREVfUkVTCTB4MDQJLyogTW9kZXMgMCBhbmQgMSBvbmx5ICovCisJZmllbGQJU0RPTkUJCTB4MDIJLyogTW9kZXMgMCBhbmQgMSBvbmx5ICovCisJZmllbGQJRE1BRE9ORQkJMHgwMQkvKiBNb2RlcyAwIGFuZCAxIG9ubHkgKi8KK30KKworLyoKKyAqIENsZWFyIFNDU0kgSW50ZXJydXB0IDIKKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDIgeworCWFkZHJlc3MJCQkweDA0RAorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJOT05QQUNLUkVRCTB4MjAKKwlmaWVsZAlDTFJXSURFX1JFUwkweDA0CS8qIE1vZGVzIDAgYW5kIDEgb25seSAqLworCWZpZWxkCUNMUlNET05FCTB4MDIJLyogTW9kZXMgMCBhbmQgMSBvbmx5ICovCisJZmllbGQJQ0xSRE1BRE9ORQkweDAxCS8qIE1vZGVzIDAgYW5kIDEgb25seSAqLworfQorCisvKgorICogU0NTSSBJbnRlcnJ1cHQgTW9kZSAyCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTIgeworCWFkZHJlc3MJCQkweDA0RAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRU5XSURFX1JFUwkweDA0CisJZmllbGQJRU5TRE9ORQkJMHgwMgorCWZpZWxkCUVORE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBQaHlzaWNhbCBFcnJvciBEaWFnbm9zaXMKKyAqLworcmVnaXN0ZXIgUEVSUkRJQUcgeworCWFkZHJlc3MJCQkweDA0RQorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlISVpFUk8JCTB4ODAKKwlmaWVsZAlISVBFUlIJCTB4NDAKKwlmaWVsZAlQUkVWUEhBU0UJMHgyMAorCWZpZWxkCVBBUklUWUVSUgkweDEwCisJZmllbGQJQUlQRVJSCQkweDA4CisJZmllbGQJQ1JDRVJSCQkweDA0CisJZmllbGQJREdGT1JNRVJSCTB4MDIKKwlmaWVsZAlEVEVSUgkJMHgwMQorfQorCisvKgorICogTFFJIE1hbmFnZXIgQ3VycmVudCBTdGF0ZQorICovCityZWdpc3RlciBMUUlTVEFURSB7CisJYWRkcmVzcwkJCTB4MDRFCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFNDU0kgT2Zmc2V0IENvdW50CisgKi8KK3JlZ2lzdGVyIFNPRkZDTlQgeworCWFkZHJlc3MJCQkweDA0RgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKK30KKworLyoKKyAqIExRTyBNYW5hZ2VyIEN1cnJlbnQgU3RhdGUKKyAqLworcmVnaXN0ZXIgTFFPU1RBVEUgeworCWFkZHJlc3MJCQkweDA0RgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMUUkgTWFuYWdlciBTdGF0dXMKKyAqLworcmVnaXN0ZXIgTFFJU1RBVDAgeworCWFkZHJlc3MJCQkweDA1MAorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlMUUlBVE5RQVMJMHgyMAorCWZpZWxkCUxRSUNSQ1QxCTB4MTAKKwlmaWVsZAlMUUlDUkNUMgkweDA4CisJZmllbGQJTFFJQkFETFFUCTB4MDQKKwlmaWVsZAlMUUlBVE5MUQkweDAyCisJZmllbGQJTFFJQVROQ01ECTB4MDEKK30KKworLyoKKyAqIENsZWFyIExRSSBJbnRlcnJ1cHRzIDAKKyAqLworcmVnaXN0ZXIgQ0xSTFFJSU5UMCB7CisJYWRkcmVzcwkJCTB4MDUwCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUkxRSUFUTlFBUwkweDIwCisJZmllbGQJQ0xSTFFJQ1JDVDEJMHgxMAorCWZpZWxkCUNMUkxRSUNSQ1QyCTB4MDgKKwlmaWVsZAlDTFJMUUlCQURMUVQJMHgwNAorCWZpZWxkCUNMUkxRSUFUTkxRCTB4MDIKKwlmaWVsZAlDTFJMUUlBVE5DTUQJMHgwMQorfQorCisvKgorICogTFFJIE1hbmFnZXIgSW50ZXJydXB0IE1vZGUgMAorICovCityZWdpc3RlciBMUUlNT0RFMCB7CisJYWRkcmVzcwkJCTB4MDUwCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlFTkxRSUFUTlFBU0sJMHgyMAorCWZpZWxkCUVOTFFJQ1JDVDEJMHgxMAorCWZpZWxkCUVOTFFJQ1JDVDIJMHgwOAorCWZpZWxkCUVOTFFJQkFETFFUCTB4MDQKKwlmaWVsZAlFTkxRSUFUTkxRCTB4MDIKKwlmaWVsZAlFTkxRSUFUTkNNRAkweDAxCit9CisKKy8qCisgKiBMUUkgTWFuYWdlciBTdGF0dXMgMQorICovCityZWdpc3RlciBMUUlTVEFUMSB7CisJYWRkcmVzcwkJCTB4MDUxCisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUxRSVBIQVNFX0xRCTB4ODAKKwlmaWVsZAlMUUlQSEFTRV9OTFEJMHg0MAorCWZpZWxkCUxRSUFCT1JUCTB4MjAKKwlmaWVsZAlMUUlDUkNJX0xRCTB4MTAKKwlmaWVsZAlMUUlDUkNJX05MUQkweDA4CisJZmllbGQJTFFJQkFETFFJCTB4MDQKKwlmaWVsZAlMUUlPVkVSSV9MUQkweDAyCisJZmllbGQJTFFJT1ZFUklfTkxRCTB4MDEKK30KKworLyoKKyAqIENsZWFyIExRSSBNYW5hZ2VyIEludGVycnVwdHMxCisgKi8KK3JlZ2lzdGVyIENMUkxRSUlOVDEgeworCWFkZHJlc3MJCQkweDA1MQorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJMUUlQSEFTRV9MUQkweDgwCisJZmllbGQJQ0xSTFFJUEhBU0VfTkxRCTB4NDAKKwlmaWVsZAlDTFJMSVFBQk9SVAkweDIwCisJZmllbGQJQ0xSTFFJQ1JDSV9MUQkweDEwCisJZmllbGQJQ0xSTFFJQ1JDSV9OTFEJMHgwOAorCWZpZWxkCUNMUkxRSUJBRExRSQkweDA0CisJZmllbGQJQ0xSTFFJT1ZFUklfTFEJMHgwMgorCWZpZWxkCUNMUkxRSU9WRVJJX05MUQkweDAxCit9CisKKy8qCisgKiBMUUkgTWFuYWdlciBJbnRlcnJ1cHQgTW9kZSAxCisgKi8KK3JlZ2lzdGVyIExRSU1PREUxIHsKKwlhZGRyZXNzCQkJMHgwNTEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUVOTFFJUEhBU0VfTFEJMHg4MAkvKiBMUUlQSEFTRTEgKi8KKwlmaWVsZAlFTkxRSVBIQVNFX05MUQkweDQwCS8qIExRSVBIQVNFMiAqLworCWZpZWxkCUVOTElRQUJPUlQJMHgyMAorCWZpZWxkCUVOTFFJQ1JDSV9MUQkweDEwCS8qIExRSUNSQ0kxICovCisJZmllbGQJRU5MUUlDUkNJX05MUQkweDA4CS8qIExRSUNSQ0kyICovCisJZmllbGQJRU5MUUlCQURMUUkJMHgwNAorCWZpZWxkCUVOTFFJT1ZFUklfTFEJMHgwMgkvKiBMUUlPVkVSSTEgKi8KKwlmaWVsZAlFTkxRSU9WRVJJX05MUQkweDAxCS8qIExRSU9WRVJJMiAqLworfQorCisvKgorICogTFFJIE1hbmFnZXIgU3RhdHVzIDIKKyAqLworcmVnaXN0ZXIgTFFJU1RBVDIgeworCWFkZHJlc3MJCQkweDA1MgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlQQUNLRVRJWkVECTB4ODAKKwlmaWVsZAlMUUlQSEFTRV9PVVRQS1QJMHg0MAorCWZpZWxkCUxRSVdPUktPTkxRCTB4MjAKKwlmaWVsZAlMUUlXQUlURklGTwkweDEwCisJZmllbGQJTFFJU1RPUFBLVAkweDA4CisJZmllbGQJTFFJU1RPUExRCTB4MDQKKwlmaWVsZAlMUUlTVE9QQ01ECTB4MDIKKwlmaWVsZAlMUUlHU0FWQUlMCTB4MDEKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDMKKyAqLworcmVnaXN0ZXIgU1NUQVQzIHsKKwlhZGRyZXNzCQkJMHgwNTMKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJTlRSQU1QRVJSCTB4MDIKKwlmaWVsZAlPU1JBTVBFUlIJMHgwMQorfQorCisvKgorICogQ2xlYXIgU0NTSSBTdGF0dXMgMworICovCityZWdpc3RlciBDTFJTSU5UMyB7CisJYWRkcmVzcwkJCTB4MDUzCisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUNMUk5UUkFNUEVSUgkweDAyCisJZmllbGQJQ0xST1NSQU1QRVJSCTB4MDEKK30KKworLyoKKyAqIFNDU0kgSW50ZXJydXB0IE1vZGUgMworICovCityZWdpc3RlciBTSU1PREUzIHsKKwlhZGRyZXNzCQkJMHgwNTMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUVOTlRSQU1QRVJSCTB4MDIKKwlmaWVsZAlFTk9TUkFNUEVSUgkweDAxCit9CisKKy8qCisgKiBMUU8gTWFuYWdlciBTdGF0dXMgMAorICovCityZWdpc3RlciBMUU9TVEFUMCB7CisJYWRkcmVzcwkJCTB4MDU0CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUxRT1RBUkdTQ0JQRVJSCTB4MTAKKwlmaWVsZAlMUU9TVE9QVDIJMHgwOAorCWZpZWxkCUxRT0FUTkxRCTB4MDQKKwlmaWVsZAlMUU9BVE5QS1QJMHgwMgorCWZpZWxkCUxRT1RDUkMJCTB4MDEKK30KKworLyoKKyAqIENsZWFyIExRTyBNYW5hZ2VyIGludGVycnVwdCAwCisgKi8KK3JlZ2lzdGVyIENMUkxRT0lOVDAgeworCWFkZHJlc3MJCQkweDA1NAorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJMUU9UQVJHU0NCUEVSUgkweDEwCisJZmllbGQJQ0xSTFFPU1RPUFQyCQkweDA4CisJZmllbGQJQ0xSTFFPQVROTFEJCTB4MDQKKwlmaWVsZAlDTFJMUU9BVE5QS1QJCTB4MDIKKwlmaWVsZAlDTFJMUU9UQ1JDCQkweDAxCit9CisKKy8qCisgKiBMUU8gTWFuYWdlciBJbnRlcnJ1cHQgTW9kZSAwCisgKi8KK3JlZ2lzdGVyIExRT01PREUwIHsKKwlhZGRyZXNzCQkJMHgwNTQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUVOTFFPVEFSR1NDQlBFUlIJMHgxMAorCWZpZWxkCUVOTFFPU1RPUFQyCQkweDA4CisJZmllbGQJRU5MUU9BVE5MUQkJMHgwNAorCWZpZWxkCUVOTFFPQVROUEtUCQkweDAyCisJZmllbGQJRU5MUU9UQ1JDCQkweDAxCit9CisKKy8qCisgKiBMUU8gTWFuYWdlciBTdGF0dXMgMQorICovCityZWdpc3RlciBMUU9TVEFUMSB7CisJYWRkcmVzcwkJCTB4MDU1CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorCWZpZWxkCUxRT0lOSVRTQ0JQRVJSCTB4MTAKKwlmaWVsZAlMUU9TVE9QSTIJMHgwOAorCWZpZWxkCUxRT0JBRFFBUwkweDA0CisJZmllbGQJTFFPQlVTRlJFRQkweDAyCisJZmllbGQJTFFPUEhBQ0hHSU5QS1QJMHgwMQorfQorCisvKgorICogQ2xlYXIgTE9RIEludGVycnVwdCAxCisgKi8KK3JlZ2lzdGVyIENMUkxRT0lOVDEgeworCWFkZHJlc3MJCQkweDA1NQorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlDTFJMUU9JTklUU0NCUEVSUgkweDEwCisJZmllbGQJQ0xSTFFPU1RPUEkyCQkweDA4CisJZmllbGQJQ0xSTFFPQkFEUUFTCQkweDA0CisJZmllbGQJQ0xSTFFPQlVTRlJFRQkJMHgwMgorCWZpZWxkCUNMUkxRT1BIQUNIR0lOUEtUCTB4MDEKK30KKworLyoKKyAqIExRTyBNYW5hZ2VyIEludGVycnVwdCBNb2RlIDEKKyAqLworcmVnaXN0ZXIgTFFPTU9ERTEgeworCWFkZHJlc3MJCQkweDA1NQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRU5MUU9JTklUU0NCUEVSUgkweDEwCisJZmllbGQJRU5MUU9TVE9QSTIJCTB4MDgKKwlmaWVsZAlFTkxRT0JBRFFBUwkJMHgwNAorCWZpZWxkCUVOTFFPQlVTRlJFRQkJMHgwMgorCWZpZWxkCUVOTFFPUEhBQ0hHSU5QS1QJMHgwMQorfQorCisvKgorICogTFFPIE1hbmFnZXIgU3RhdHVzIDIKKyAqLworcmVnaXN0ZXIgTFFPU1RBVDIgeworCWFkZHJlc3MJCQkweDA1NgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxLCBNX1NDU0kKKwlmaWVsZAlMUU9QS1QJCTB4RTAKKwlmaWVsZAlMUU9XQUlURklGTwkweDEwCisJZmllbGQJTFFPUEhBQ0hHT1VUUEtUCTB4MDIJLyogb3V0c2lkZSBvZiBwYWNrZXQgYm91bmRhcmllcy4gKi8KKwlmaWVsZAlMUU9TVE9QMAkweDAxCS8qIFN0b3BwZWQgYWZ0ZXIgc2VuZGluZyBhbGwgcGFja2V0cyAqLworfQorCisvKgorICogT3V0cHV0IFN5bmNocm9uaXplciBTcGFjZSBDb3VudAorICovCityZWdpc3RlciBPU19TUEFDRV9DTlQgeworCWFkZHJlc3MJCQkweDA1NgorCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBTQ1NJIEludGVycnVwdCBNb2RlIDEKKyAqIFNldHRpbmcgYW55IGJpdCB3aWxsIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogaW4gU0lNT0RFMSB0byBpbnRlcnJ1cHQgdmlhIHRoZSBJUlEgcGluLgorICovCityZWdpc3RlciBTSU1PREUxIHsKKwlhZGRyZXNzCQkJMHgwNTcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMSwgTV9TQ1NJCisJZmllbGQJRU5TRUxUSU1PCTB4ODAKKwlmaWVsZAlFTkFUTlRBUkcJMHg0MAorCWZpZWxkCUVOU0NTSVJTVAkweDIwCisJZmllbGQJRU5QSEFTRU1JUwkweDEwCisJZmllbGQJRU5CVVNGUkVFCTB4MDgKKwlmaWVsZAlFTlNDU0lQRVJSCTB4MDQKKwlmaWVsZAlFTlNUUkIyRkFTVAkweDAyCisJZmllbGQJRU5SRVFJTklUCTB4MDEKK30KKworLyoKKyAqIEdvb2QgU3RhdHVzIEZJRk8KKyAqLworcmVnaXN0ZXIgR1NGSUZPIHsKKwlhZGRyZXNzCQkJMHgwNTgKKwlhY2Nlc3NfbW9kZQlSTworCXNpemUJCTIKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fU0NTSQorfQorCisvKgorICogRGF0YSBGSUZPIFNDU0kgVHJhbnNmZXIgQ29udHJvbAorICovCityZWdpc3RlciBERkZTWEZSQ1RMIHsKKwlhZGRyZXNzCQkJMHgwNUEKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCURGRkJJVEJVQ0tFVAkweDA4CisJZmllbGQJQ0xSU0hDTlQJMHgwNAorCWZpZWxkCUNMUkNITgkJMHgwMgorCWZpZWxkCVJTVENITgkJMHgwMQorfQorCisvKgorICogTmV4dCBTQ1NJIENvbnRyb2wgQmxvY2sKKyAqLworcmVnaXN0ZXIgTkVYVFNDQiB7CisJYWRkcmVzcwkJCTB4MDVBCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKiBSZXYgQiBvbmx5LiAqLworcmVnaXN0ZXIgTFFPU0NTQ1RMIHsKKwlhZGRyZXNzCQkJMHgwNUEKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTEKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAkJTFFPSDJBX1ZFUlNJT04JMHg4MAorCWZpZWxkCQlMUU9OT0NIS09WRVIJMHgwMQorfQorCisvKgorICogU0VRIEludGVycnVwdHMKKyAqLworcmVnaXN0ZXIgU0VRSU5UU1JDIHsKKwlhZGRyZXNzCQkJMHgwNUIKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUNUWFRET05FCTB4NDAKKwlmaWVsZAlTQVZFUFRSUwkweDIwCisJZmllbGQJQ0ZHNERBVEEJMHgxMAorCWZpZWxkCUNGRzRJU1RBVAkweDA4CisJZmllbGQJQ0ZHNFRTVEFUCTB4MDQKKwlmaWVsZAlDRkc0SUNNRAkweDAyCisJZmllbGQJQ0ZHNFRDTUQJMHgwMQorfQorCisvKgorICogQ2xlYXIgQXJwIEludGVycnVwdHMKKyAqLworcmVnaXN0ZXIgQ0xSU0VRSU5UU1JDIHsKKwlhZGRyZXNzCQkJMHgwNUIKKwlhY2Nlc3NfbW9kZQlXTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUNMUkNUWFRET05FCTB4NDAKKwlmaWVsZAlDTFJTQVZFUFRSUwkweDIwCisJZmllbGQJQ0xSQ0ZHNERBVEEJMHgxMAorCWZpZWxkCUNMUkNGRzRJU1RBVAkweDA4CisJZmllbGQJQ0xSQ0ZHNFRTVEFUCTB4MDQKKwlmaWVsZAlDTFJDRkc0SUNNRAkweDAyCisJZmllbGQJQ0xSQ0ZHNFRDTUQJMHgwMQorfQorCisvKgorICogU0VRIEludGVycnVwdCBFbmFibGVkIChTaGFyZWQpCisgKi8KK3JlZ2lzdGVyIFNFUUlNT0RFIHsKKwlhZGRyZXNzCQkJMHgwNUMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUVOQ1RYVERPTkUJMHg0MAorCWZpZWxkCUVOU0FWRVBUUlMJMHgyMAorCWZpZWxkCUVOQ0ZHNERBVEEJMHgxMAorCWZpZWxkCUVOQ0ZHNElTVEFUCTB4MDgKKwlmaWVsZAlFTkNGRzRUU1RBVAkweDA0CisJZmllbGQJRU5DRkc0SUNNRAkweDAyCisJZmllbGQJRU5DRkc0VENNRAkweDAxCit9CisKKy8qCisgKiBDdXJyZW50IFNDU0kgQ29udHJvbCBCbG9jaworICovCityZWdpc3RlciBDVVJSU0NCIHsKKwlhZGRyZXNzCQkJMHgwNUMKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBEYXRhIEZJRk8gU3RhdHVzCisgKi8KK3JlZ2lzdGVyIE1ERkZTVEFUIHsKKwlhZGRyZXNzCQkJMHgwNUQKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCVNIQ05UTkVHQVRJVkUJMHg0MCAvKiBSZXYgQiBvciBoaWdoZXIgKi8KKwlmaWVsZAlTSENOVE1JTlVTMQkweDIwIC8qIFJldiBCIG9yIGhpZ2hlciAqLworCWZpZWxkCUxBU1RTRE9ORQkweDEwCisJZmllbGQJU0hWQUxJRAkJMHgwOAorCWZpZWxkCURMWkVSTwkJMHgwNCAvKiBGSUZPIGRhdGEgZW5kcyBvbiBwYWNrZXQgYm91bmRhcnkuICovCisJZmllbGQJREFUQUlORklGTwkweDAyCisJZmllbGQJRklGT0ZSRUUJMHgwMQorfQorCisvKgorICogQ1JDIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgQ1JDQ09OVFJPTCB7CisJYWRkcmVzcwkJCTB4MDVkCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlDUkNWQUxDSEtFTgkJMHg0MAorfQorCisvKgorICogU0NTSSBUZXN0IENvbnRyb2wKKyAqLworcmVnaXN0ZXIgU0NTSVRFU1QgeworCWFkZHJlc3MJCQkweDA1RQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJQ05UUlRFU1QJMHgwOAorCWZpZWxkCVNFTF9UWFBMTF9ERUJVRwkweDA0Cit9CisKKy8qCisgKiBEYXRhIEZJRk8gUXVldWUgVGFnCisgKi8KK3JlZ2lzdGVyIERGRlRBRyB7CisJYWRkcmVzcwkJCTB4MDVFCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBMYXN0IFNDU0kgQ29udHJvbCBCbG9jaworICovCityZWdpc3RlciBMQVNUU0NCIHsKKwlhZGRyZXNzCQkJMHgwNUUKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTQ1NJIEkvTyBDZWxsIFBvd2VyLWRvd24gQ29udHJvbAorICovCityZWdpc3RlciBJT1BETkNUTCB7CisJYWRkcmVzcwkJCTB4MDVGCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlESVNBQkxFX09FCTB4ODAKKwlmaWVsZAlQRE5fSURJU1QJMHgwNAorCWZpZWxkCVBETl9ESUZGU0VOU0UJMHgwMQorfQorCisvKgorICogU2hhZGRvdyBIb3N0IEFkZHJlc3MuCisgKi8KK3JlZ2lzdGVyIFNIQUREUiB7CisJYWRkcmVzcwkJCTB4MDYwCisJYWNjZXNzX21vZGUJUk8KKwlzaXplCQk4CisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBEYXRhIEdyb3VwIENSQyBJbnRlcnZhbC4KKyAqLworcmVnaXN0ZXIgREdSUENSQ0kgeworCWFkZHJlc3MJCQkweDA2MAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0NGRworfQorCisvKgorICogRGF0YSBUcmFuc2ZlciBOZWdvdGlhdGlvbiBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIE5FR09BRERSIHsKKwlhZGRyZXNzCQkJMHgwNjAKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIERhdGEgVHJhbnNmZXIgTmVnb3RpYXRpb24gRGF0YSAtIFBlcmlvZCBCeXRlCisgKi8KK3JlZ2lzdGVyIE5FR1BFUklPRCB7CisJYWRkcmVzcwkJCTB4MDYxCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBQYWNrZXRpemVkIENSQyBJbnRlcnZhbAorICovCityZWdpc3RlciBQQUNLQ1JDSSB7CisJYWRkcmVzcwkJCTB4MDYyCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBEYXRhIFRyYW5zZmVyIE5lZ290aWF0aW9uIERhdGEgLSBPZmZzZXQgQnl0ZQorICovCityZWdpc3RlciBORUdPRkZTRVQgeworCWFkZHJlc3MJCQkweDA2MgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogRGF0YSBUcmFuc2ZlciBOZWdvdGlhdGlvbiBEYXRhIC0gUFBSIE9wdGlvbnMKKyAqLworcmVnaXN0ZXIgTkVHUFBST1BUUyB7CisJYWRkcmVzcwkJCTB4MDYzCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCisJZmllbGQJUFBST1BUX1BBQ0UJMHgwOAorCWZpZWxkCVBQUk9QVF9RQVMJMHgwNAorCWZpZWxkCVBQUk9QVF9EVAkweDAyCisJZmllbGQJUFBST1BUX0lVVAkweDAxCit9CisKKy8qCisgKiBEYXRhIFRyYW5zZmVyIE5lZ290aWF0aW9uIERhdGEgLSAgQ29ubmVjdGlvbiBPcHRpb25zCisgKi8KK3JlZ2lzdGVyIE5FR0NPTk9QVFMgeworCWFkZHJlc3MJCQkweDA2NAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUVOU05BUFNIT1QJMHg0MAorCWZpZWxkCVJUSV9XUlRESVMJMHgyMAorCWZpZWxkCVJUSV9PVlJEVFJOCTB4MTAKKwlmaWVsZAlFTlNMT1dDUkMJMHgwOAorCWZpZWxkCUVOQVVUT0FUTkkJMHgwNAorCWZpZWxkCUVOQVVUT0FUTk8JMHgwMgorCWZpZWxkCVdJREVYRkVSCTB4MDEKK30KKworLyoKKyAqIE5lZ290aWF0aW9uIFRhYmxlIEFubmV4IENvbHVtbiBJbmRleC4KKyAqLworcmVnaXN0ZXIgQU5ORVhDT0wgeworCWFkZHJlc3MJCQkweDA2NQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCityZWdpc3RlciBTQ1NDSEtOIHsKKwlhZGRyZXNzCQkJMHgwNjYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVNUU0VMU0tJRERJUwkweDQwCisJZmllbGQJQ1VSUkZJRk9ERUYJMHgyMAorCWZpZWxkCVdJREVSRVNFTgkweDEwCisJZmllbGQJU0RPTkVNU0tESVMJMHgwOAorCWZpZWxkCURGRkFDVENMUgkweDA0CisJZmllbGQJU0hWQUxJRFNURElTCTB4MDIKKwlmaWVsZAlMU1RTR0NMUkRJUwkweDAxCit9CisKK2NvbnN0IEFIRF9BTk5FWENPTF9QRVJfREVWMAk0Citjb25zdCBBSERfTlVNX1BFUl9ERVZfQU5ORVhDT0xTCTQKK2NvbnN0IEFIRF9BTk5FWENPTF9QUkVDT01QX1NMRVcJNAorY29uc3QJQUhEX1BSRUNPTVBfTUFTSwkweDA3Citjb25zdAlBSERfUFJFQ09NUF9TSElGVAkwCitjb25zdAlBSERfUFJFQ09NUF9DVVRCQUNLXzE3CTB4MDQKK2NvbnN0CUFIRF9QUkVDT01QX0NVVEJBQ0tfMjkJMHgwNgorY29uc3QJQUhEX1BSRUNPTVBfQ1VUQkFDS18zNwkweDA3Citjb25zdAlBSERfU0xFV1JBVEVfTUFTSwkweDc4Citjb25zdAlBSERfU0xFV1JBVEVfU0hJRlQJMworLyoKKyAqIFJldiBBIGhhcyBvbmx5IGEgc2luZ2xlIGJpdCAoaGlnaCBiaXQgb2YgZmllbGQpIG9mIHNsZXcgYWRqdXN0bWVudC4KKyAqIFJldiBCIGhhcyA0IGJpdHMuICBUaGUgY3VycmVudCBkZWZhdWx0IGhhcHBlbnMgdG8gYmUgdGhlIHNhbWUgZm9yIGJvdGguCisgKi8KK2NvbnN0CUFIRF9TTEVXUkFURV9ERUZfUkVWQQkweDA4Citjb25zdAlBSERfU0xFV1JBVEVfREVGX1JFVkIJMHgwOAorCisvKiBSZXYgQSBkb2VzIG5vdCBoYXZlIGFueSBhbXBsaXR1ZGUgc2V0dGluZy4gKi8KK2NvbnN0IEFIRF9BTk5FWENPTF9BTVBMSVRVREUJNgorY29uc3QJQUhEX0FNUExJVFVERV9NQVNLCTB4NworY29uc3QJQUhEX0FNUExJVFVERV9TSElGVAkwCitjb25zdAlBSERfQU1QTElUVURFX0RFRgkweDcKKworLyoKKyAqIE5lZ290aWF0aW9uIFRhYmxlIEFubmV4IERhdGEgUG9ydC4KKyAqLworcmVnaXN0ZXIgQU5ORVhEQVQgeworCWFkZHJlc3MJCQkweDA2NgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogSW5pdGlhdG9yJ3MgT3duIElkLgorICogVGhlIFNDU0kgSUQgdG8gdXNlIGZvciBTZWxlY3Rpb24gT3V0IGFuZCBzZWVuIGR1cmluZyBhIHJlc2VsZWN0aW9uLi4KKyAqLworcmVnaXN0ZXIgSU9XTklEIHsKKwlhZGRyZXNzCQkJMHgwNjcKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIDk2ME1IeiBQaGFzZS1Mb2NrZWQgTG9vcCBDb250cm9sIDAKKyAqLworcmVnaXN0ZXIgUExMOTYwQ1RMMCB7CisJYWRkcmVzcwkJCTB4MDY4CisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlQTExfVkNPU0VMCTB4ODAKKwlmaWVsZAlQTExfUFdETgkweDQwCisJZmllbGQJUExMX05TCQkweDMwCisJZmllbGQJUExMX0VOTFVECTB4MDgKKwlmaWVsZAlQTExfRU5MUEYJMHgwNAorCWZpZWxkCVBMTF9ETFBGCTB4MDIKKwlmaWVsZAlQTExfRU5GQk0JMHgwMQorfQorCisvKgorICogVGFyZ2V0IE93biBJZAorICovCityZWdpc3RlciBUT1dOSUQgeworCWFkZHJlc3MJCQkweDA2OQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogOTYwTUh6IFBoYXNlLUxvY2tlZCBMb29wIENvbnRyb2wgMQorICovCityZWdpc3RlciBQTEw5NjBDVEwxIHsKKwlhZGRyZXNzCQkJMHgwNjkKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVBMTF9DTlRFTgkweDgwCisJZmllbGQJUExMX0NOVENMUgkweDQwCisJZmllbGQJUExMX1JTVAkJMHgwMQorfQorCisvKgorICogRXhwYW5kZXIgU2lnbmF0dXJlCisgKi8KK3JlZ2lzdGVyIFhTSUcgeworCWFkZHJlc3MJCQkweDA2QQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogU2hhZG93IEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgU0hDTlQgeworCWFkZHJlc3MJCQkweDA2OAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogU2VsZWN0aW9uIE91dCBJRAorICovCityZWdpc3RlciBTRUxPSUQgeworCWFkZHJlc3MJCQkweDA2QgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogOTYwLU1IeiBQaGFzZS1Mb2NrZWQgTG9vcCBUZXN0IENvdW50CisgKi8KK3JlZ2lzdGVyIFBMTDk2MENOVDAgeworCWFkZHJlc3MJCQkweDA2QQorCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX0NGRworfQorCisvKgorICogNDAwLU1IeiBQaGFzZS1Mb2NrZWQgTG9vcCBDb250cm9sIDAKKyAqLworcmVnaXN0ZXIgUExMNDAwQ1RMMCB7CisJYWRkcmVzcwkJCTB4MDZDCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlQTExfVkNPU0VMCTB4ODAKKwlmaWVsZAlQTExfUFdETgkweDQwCisJZmllbGQJUExMX05TCQkweDMwCisJZmllbGQJUExMX0VOTFVECTB4MDgKKwlmaWVsZAlQTExfRU5MUEYJMHgwNAorCWZpZWxkCVBMTF9ETFBGCTB4MDIKKwlmaWVsZAlQTExfRU5GQk0JMHgwMQorfQorCisvKgorICogQXJiaXRyYXRpb24gRmFpcm5lc3MKKyAqLworcmVnaXN0ZXIgRkFJUk5FU1MgeworCWFkZHJlc3MJCQkweDA2QworCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIDQwMC1NSHogUGhhc2UtTG9ja2VkIExvb3AgQ29udHJvbCAxCisgKi8KK3JlZ2lzdGVyIFBMTDQwMENUTDEgeworCWFkZHJlc3MJCQkweDA2RAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJUExMX0NOVEVOCTB4ODAKKwlmaWVsZAlQTExfQ05UQ0xSCTB4NDAKKwlmaWVsZAlQTExfUlNUCQkweDAxCit9CisKKy8qCisgKiBBcmJpdHJhdGlvbiBVbmZhaXJuZXNzCisgKi8KK3JlZ2lzdGVyIFVORkFJUk5FU1MgeworCWFkZHJlc3MJCQkweDA2RQorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIDQwMC1NSHogUGhhc2UtTG9ja2VkIExvb3AgVGVzdCBDb3VudAorICovCityZWdpc3RlciBQTEw0MDBDTlQwIHsKKwlhZGRyZXNzCQkJMHgwNkUKKwlhY2Nlc3NfbW9kZQlSTworCXNpemUJCTIKKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIFNDQiBQYWdlIFBvaW50ZXIKKyAqLworcmVnaXN0ZXIgU0NCUFRSIHsKKwlhZGRyZXNzCQkJMHgwQTgKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEsIE1fQ0NIQU4sIE1fU0NTSQorfQorCisvKgorICogQ01DIFNDQiBBcnJheSBDb3VudAorICogTnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGJldHdlZW4gQ01DIFNDQiBtZW1vcnkgYW5kIFNDQlJBTS4KKyAqIFRyYW5zZmVycyBtdXN0IGJlIDhieXRlIGFsaWduZWQgYW5kIHNpemVkLgorICovCityZWdpc3RlciBDQ1NDQkFDTlQgeworCWFkZHJlc3MJCQkweDBBQgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KK30KKworLyoKKyAqIFNDQiBBdXRvcG9pbnRlcgorICogU0NCLU5leHQgQWRkcmVzcyBTbm9vcGluZyBsb2dpYy4gIFdoZW4gYW4gU0NCIGlzIHRyYW5zZmVycmVkIHRvCisgKiB0aGUgY2FyZCwgdGhlIG5leHQgU0NCIGFkZHJlc3MgdG8gYmUgdXNlZCBieSB0aGUgQ01DIGFycmF5IGNhbgorICogYmUgYXV0b2xvYWRlZCBmcm9tIHRoYXQgdHJhbnNmZXIuCisgKi8KK3JlZ2lzdGVyIFNDQkFVVE9QVFIgeworCWFkZHJlc3MJCQkweDBBQgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJQVVTQ0JQVFJfRU4JMHg4MAorCWZpZWxkCVNDQlBUUl9BRERSCTB4MzgKKwlmaWVsZAlTQ0JQVFJfT0ZGCTB4MDcKK30KKworLyoKKyAqIENNQyBTRyBSYW0gQWRkcmVzcyBQb2ludGVyCisgKi8KK3JlZ2lzdGVyIENDU0dBRERSIHsKKwlhZGRyZXNzCQkJMHgwQUMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogQ01DIFNDQiBSQU0gQWRkcmVzcyBQb2ludGVyCisgKi8KK3JlZ2lzdGVyIENDU0NCQUREUiB7CisJYWRkcmVzcwkJCTB4MEFDCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DQ0hBTgorfQorCisvKgorICogQ01DIFNDQiBSYW0gQmFjay11cCBBZGRyZXNzIFBvaW50ZXIKKyAqIEluZGljYXRlcyB0aGUgdHJ1ZSBzdG9wIGxvY2F0aW9uIG9mIHRyYW5zZmVycyBoYWx0ZWQgcHJpb3IKKyAqIHRvIFNDQkhDTlQgZ29pbmcgdG8gMC4KKyAqLworcmVnaXN0ZXIgQ0NTQ0JBRFJfQksgeworCWFkZHJlc3MJCQkweDBBQworCWFjY2Vzc19tb2RlCVJPCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBDTUMgU0cgQ29udHJvbAorICovCityZWdpc3RlciBDQ1NHQ1RMIHsKKwlhZGRyZXNzCQkJMHgwQUQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCUNDU0dET05FCTB4ODAKKwlmaWVsZAlTR19DQUNIRV9BVkFJTAkweDEwCisJZmllbGQJQ0NTR0VOQUNLCTB4MDgKKwltYXNrCUNDU0dFTgkJMHgwQworCWZpZWxkCVNHX0ZFVENIX1JFUQkweDAyCisJZmllbGQJQ0NTR1JFU0VUCTB4MDEKK30KKworLyoKKyAqIENNRCBTQ0IgQ29udHJvbAorICovCityZWdpc3RlciBDQ1NDQkNUTCB7CisJYWRkcmVzcwkJCTB4MEFECisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DQ0hBTgorCWZpZWxkCUNDU0NCRE9ORQkweDgwCisJZmllbGQJQVJSRE9ORQkJMHg0MAorCWZpZWxkCUNDQVJSRU4JCTB4MTAKKwlmaWVsZAlDQ1NDQkVOCQkweDA4CisJZmllbGQJQ0NTQ0JESVIJMHgwNAorCWZpZWxkCUNDU0NCUkVTRVQJMHgwMQorfQorCisvKgorICogQ01DIFJhbSBCSVNUCisgKi8KK3JlZ2lzdGVyIENNQ19SQU1CSVNUIHsKKwlhZGRyZXNzCQkJMHgwQUQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCVNHX0VMRU1FTlRfU0laRQkJMHg4MAorCWZpZWxkCVNDQlJBTUJJU1RfRkFJTAkJMHg0MAorCWZpZWxkCVNHX0JJU1RfRkFJTAkJMHgyMAorCWZpZWxkCVNHX0JJU1RfRU4JCTB4MTAKKwlmaWVsZAlDTUNfQlVGRkVSX0JJU1RfRkFJTAkweDAyCisJZmllbGQJQ01DX0JVRkZFUl9CSVNUX0VOCTB4MDEKK30KKworLyoKKyAqIENNQyBTRyBSQU0gRGF0YSBQb3J0CisgKi8KK3JlZ2lzdGVyIENDU0dSQU0geworCWFkZHJlc3MJCQkweDBCMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBDTUMgU0NCIFJBTSBEYXRhIFBvcnQKKyAqLworcmVnaXN0ZXIgQ0NTQ0JSQU0geworCWFkZHJlc3MJCQkweDBCMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0NIQU4KK30KKworLyoKKyAqIEZsZXggRE1BIEFkZHJlc3MuCisgKi8KK3JlZ2lzdGVyIEZMRVhBRFIgeworCWFkZHJlc3MJCQkweDBCMAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIEZsZXggRE1BIEJ5dGUgQ291bnQKKyAqLworcmVnaXN0ZXIgRkxFWENOVCB7CisJYWRkcmVzcwkJCTB4MEIzCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogRmxleCBETUEgU3RhdHVzCisgKi8KK3JlZ2lzdGVyIEZMRVhETUFTVEFUIHsKKwlhZGRyZXNzCQkJMHgwQjUKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlGTEVYRE1BRVJSCTB4MDIKKwlmaWVsZAlGTEVYRE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBGbGV4IERNQSBEYXRhIFBvcnQKKyAqLworcmVnaXN0ZXIgRkxFWERBVEEgeworCWFkZHJlc3MJCQkweDBCNgorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogQm9hcmQgRGF0YQorICovCityZWdpc3RlciBCUkREQVQgeworCWFkZHJlc3MJCQkweDBCOAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogQm9hcmQgQ29udHJvbAorICovCityZWdpc3RlciBCUkRDVEwgeworCWFkZHJlc3MJCQkweDBCOQorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fU0NTSQorCWZpZWxkCUZMWEFSQkFDSwkweDgwCisJZmllbGQJRkxYQVJCUkVRCTB4NDAKKwlmaWVsZAlCUkRBRERSCQkweDM4CisJZmllbGQJQlJERU4JCTB4MDQKKwlmaWVsZAlCUkRSVwkJMHgwMgorCWZpZWxkCUJSRFNUQgkJMHgwMQorfQorCisvKgorICogU2VyaWFsIEVFUFJPTSBBZGRyZXNzCisgKi8KK3JlZ2lzdGVyIFNFRUFEUiB7CisJYWRkcmVzcwkJCTB4MEJBCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTZXJpYWwgRUVQUk9NIERhdGEKKyAqLworcmVnaXN0ZXIgU0VFREFUIHsKKwlhZGRyZXNzCQkJMHgwQkMKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9TQ1NJCit9CisKKy8qCisgKiBTZXJpYWwgRUVQUk9NIFN0YXR1cworICovCityZWdpc3RlciBTRUVTVEFUIHsKKwlhZGRyZXNzCQkJMHgwQkUKKwlhY2Nlc3NfbW9kZQlSTworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlJTklUX0RPTkUJMHg4MAorCWZpZWxkCVNFRU9QQ09ERQkweDcwCisJZmllbGQJTERBTFRJRF9MCTB4MDgKKwlmaWVsZAlTRUVBUkJBQ0sJMHgwNAorCWZpZWxkCVNFRUJVU1kJCTB4MDIKKwlmaWVsZAlTRUVTVEFSVAkweDAxCit9CisKKy8qCisgKiBTZXJpYWwgRUVQUk9NIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgU0VFQ1RMIHsKKwlhZGRyZXNzCQkJMHgwQkUKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKKwlmaWVsZAlTRUVPUENPREUJMHg3MCB7CisJCVNFRU9QX0VSQVNFCTB4NzAsCisJCVNFRU9QX1JFQUQJMHg2MCwKKwkJU0VFT1BfV1JJVEUJMHg1MCwKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZm91ciBjb21tYW5kcyB1c2Ugc3BlY2lhbAorCSAqIGFkZHJlc3NlcyBmb3IgZGlmZmVyZW50aWF0aW9uLgorCSAqLworCQlTRUVPUF9FUkFMCTB4NDAKKwl9CisJbWFzawlTRUVPUF9FV0VOCTB4NDAKKwltYXNrCVNFRU9QX1dBTEwJMHg0MAorCW1hc2sJU0VFT1BfRVdEUwkweDQwCisJZmllbGQJU0VFUlNUCQkweDAyCisJZmllbGQJU0VFU1RBUlQJMHgwMQorfQorCitjb25zdCBTRUVPUF9FUkFMX0FERFIJMHg4MAorY29uc3QgU0VFT1BfRVdFTl9BRERSCTB4QzAKK2NvbnN0IFNFRU9QX1dSQUxfQUREUgkweDQwCitjb25zdCBTRUVPUF9FV0RTX0FERFIJMHgwMAorCisvKgorICogU0NCIENvdW50ZXIKKyAqLworcmVnaXN0ZXIgU0NCQ05UIHsKKwlhZGRyZXNzCQkJMHgwQkYKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX1NDU0kKK30KKworLyoKKyAqIERhdGEgRklGTyBXcml0ZSBBZGRyZXNzCisgKiBQb2ludGVyIHRvIHRoZSBuZXh0IFFXRCBsb2NhdGlvbiB0byBiZSB3cml0dGVuIHRvIHRoZSBkYXRhIEZJRk8uCisgKi8KK3JlZ2lzdGVyIERGV0FERFIgeworCWFkZHJlc3MJCQkweDBDMAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRFNQIEZpbHRlciBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERTUEZMVFJDVEwgeworCWFkZHJlc3MJCQkweDBDMAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJRkxUUkRJU0FCTEUJMHgyMAorCWZpZWxkCUVER0VTRU5TRQkweDEwCisJZmllbGQJRFNQRkNOVFNFTAkweDBGCit9CisKKy8qCisgKiBEU1AgRGF0YSBDaGFubmVsIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgRFNQREFUQUNUTCB7CisJYWRkcmVzcwkJCTB4MEMxCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlCWVBBU1NFTkFCCTB4ODAKKwlmaWVsZAlERVNRRElTCQkweDEwCisJZmllbGQJUkNWUk9GRlNURElTCTB4MDQKKwlmaWVsZAlYTUlUT0ZGU1RESVMJMHgwMgorfQorCisvKgorICogRGF0YSBGSUZPIFJlYWQgQWRkcmVzcworICogUG9pbnRlciB0byB0aGUgbmV4dCBRV0QgbG9jYXRpb24gdG8gYmUgcmVhZCBmcm9tIHRoZSBkYXRhIEZJRk8uCisgKi8KK3JlZ2lzdGVyIERGUkFERFIgeworCWFkZHJlc3MJCQkweDBDMgorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRFNQIFJFUSBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERTUFJFUUNUTCB7CisJYWRkcmVzcwkJCTB4MEMyCisJYWNjZXNzX21vZGUJUlcKKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlNQU5SRVFDVEwJMHhDMAorCWZpZWxkCU1BTlJFUURMWQkweDNGCit9CisKKy8qCisgKiBEU1AgQUNLIENvbnRyb2wKKyAqLworcmVnaXN0ZXIgRFNQQUNLQ1RMIHsKKwlhZGRyZXNzCQkJMHgwQzMKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCU1BTkFDS0NUTAkweEMwCisJZmllbGQJTUFOQUNLRExZCTB4M0YKK30KKworLyoKKyAqIERhdGEgRklGTyBEYXRhCisgKiBSZWFkL1dyaXRlIGJ5dGUgcG9ydCBpbnRvIHRoZSBkYXRhIEZJRk8uICBUaGUgcmVhZCBhbmQgd3JpdGUKKyAqIEZJRk8gcG9pbnRlcnMgaW5jcmVtZW50IHdpdGggZWFjaCByZWFkIGFuZCB3cml0ZSByZXNwZWN0aXZlbHkKKyAqIHRvIHRoaXMgcG9ydC4KKyAqLworcmVnaXN0ZXIgREZEQVQgeworCWFkZHJlc3MJCQkweDBDNAorCWFjY2Vzc19tb2RlCVJXCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBEU1AgQ2hhbm5lbCBTZWxlY3QKKyAqLworcmVnaXN0ZXIgRFNQU0VMRUNUIHsKKwlhZGRyZXNzCQkJMHgwQzQKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0NGRworCWZpZWxkCUFVVE9JTkNFTgkweDgwCisJZmllbGQJRFNQU0VMCQkweDFGCit9CisKK2NvbnN0IE5VTURTUFMgMHgxNAorCisvKgorICogV3JpdGUgQmlhcyBDb250cm9sCisgKi8KK3JlZ2lzdGVyIFdSVEJJQVNDVEwgeworCWFkZHJlc3MJCQkweDBDNQorCWFjY2Vzc19tb2RlCVdPCisJbW9kZXMJCU1fQ0ZHCisJZmllbGQJQVVUT1hCQ0RJUwkweDgwCisJZmllbGQJWE1JVE1BTlZBTAkweDNGCit9CisKKy8qCisgKiBDdXJyZW50bHkgdGhlIFdSVEJJQVNDVEwgaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQuCisgKi8KK2NvbnN0IFdSVEJJQVNDVExfSFBfREVGQVVMVCAweDAKKworLyoKKyAqIFJlY2VpdmVyIEJpYXMgQ29udHJvbAorICovCityZWdpc3RlciBSQ1ZSQklPU0NUTCB7CisJYWRkcmVzcwkJCTB4MEM2CisJYWNjZXNzX21vZGUJV08KKwltb2RlcwkJTV9DRkcKKwlmaWVsZAlBVVRPUkJDRElTCTB4ODAKKwlmaWVsZAlSQ1ZSTUFOVkFMCTB4M0YKK30KKworLyoKKyAqIFdyaXRlIEJpYXMgQ2FsY3VsYXRvcgorICovCityZWdpc3RlciBXUlRCSUFTQ0FMQyB7CisJYWRkcmVzcwkJCTB4MEM3CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIERhdGEgRklGTyBQb2ludGVycworICogQ29udGFpbnMgdGhlIGJ5dGUgb2Zmc2V0IGZyb20gREZXQUREUiBhbmQgRFdSQUREUiB0byB0aGUgY3VycmVudAorICogRklGTyB3cml0ZS9yZWFkIGxvY2F0aW9ucy4KKyAqLworcmVnaXN0ZXIgREZQVFJTIHsKKwlhZGRyZXNzCQkJMHgwQzgKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogUmVjZWl2ZXIgQmlhcyBDYWxjdWxhdG9yCisgKi8KK3JlZ2lzdGVyIFJDVlJCSUFTQ0FMQyB7CisJYWRkcmVzcwkJCTB4MEM4CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIERhdGEgRklGTyBCYWNrdXAgUmVhZCBQb2ludGVyCisgKiBDb250YWlucyB0aGUgZGF0YSBGSUZPIGFkZHJlc3MgdG8gYmUgcmVzdG9yZWQgaWYgdGhlIGxhc3QKKyAqIGRhdGEgYWNjZXNzZWQgZnJvbSB0aGUgZGF0YSBGSUZPIHdhcyBub3QgdHJhbnNmZXJyZWQgc3VjY2Vzc2Z1bGx5LgorICovCityZWdpc3RlciBERkJLUFRSIHsKKwlhZGRyZXNzCQkJMHgwQzkKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKKwltb2RlcwkJTV9ERkYwLCBNX0RGRjEKK30KKworLyoKKyAqIFNrZXcgQ2FsY3VsYXRvcgorICovCityZWdpc3RlciBTS0VXQ0FMQyB7CisJYWRkcmVzcwkJCTB4MEM5CisJYWNjZXNzX21vZGUJUk8KKwltb2RlcwkJTV9DRkcKK30KKworLyoKKyAqIERhdGEgRklGTyBEZWJ1ZyBDb250cm9sCisgKi8KK3JlZ2lzdGVyIERGREJDVEwgeworCWFkZHJlc3MJCQkJMHgwQ0IKKwlhY2Nlc3NfbW9kZQlSVworCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorCWZpZWxkCURGRl9DSU9fV1JfUkRZCQkweDIwCisJZmllbGQJREZGX0NJT19SRF9SRFkJCTB4MTAKKwlmaWVsZAlERkZfRElSX0VSUgkJMHgwOAorCWZpZWxkCURGRl9SQU1CSVNUX0ZBSUwJMHgwNAorCWZpZWxkCURGRl9SQU1CSVNUX0RPTkUJMHgwMgorCWZpZWxkCURGRl9SQU1CSVNUX0VOCQkweDAxCit9CisKKy8qCisgKiBEYXRhIEZJRk8gU3BhY2UgQ291bnQKKyAqIE51bWJlciBvZiBGSUZPIGxvY2F0aW9ucyB0aGF0IGFyZSBmcmVlLgorICovCityZWdpc3RlciBERlNDTlQgeworCWFkZHJlc3MJCQkweDBDQworCWFjY2Vzc19tb2RlCVJPCisJc2l6ZQkJMgorCW1vZGVzCQlNX0RGRjAsIE1fREZGMQorfQorCisvKgorICogRGF0YSBGSUZPIEJ5dGUgQ291bnQKKyAqIE51bWJlciBvZiBmaWxsZWQgRklGTyBsb2NhdGlvbnMuCisgKi8KK3JlZ2lzdGVyIERGQkNOVCB7CisJYWRkcmVzcwkJCTB4MENFCisJYWNjZXNzX21vZGUJUk8KKwlzaXplCQkyCisJbW9kZXMJCU1fREZGMCwgTV9ERkYxCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUHJvZ3JhbSBPdmVybGF5IEFkZHJlc3MuCisgKiBMb3cgYWRkcmVzcyBtdXN0IGJlIHdyaXR0ZW4gcHJpb3IgdG8gaGlnaCBhZGRyZXNzLgorICovCityZWdpc3RlciBPVkxZQUREUiB7CisJYWRkcmVzcwkJCTB4MEQ0CisJbW9kZXMJCU1fU0NTSQorCXNpemUJCTIKKwlhY2Nlc3NfbW9kZQlSVworfQorCisvKgorICogU2VxdWVuY2VyIENvbnRyb2wgMAorICogRXJyb3IgZGV0ZWN0aW9uIG1vZGUsIHNwZWVkIGNvbmZpZ3VyYXRpb24sCisgKiBzaW5nbGUgc3RlcCwgYnJlYWtwb2ludHMgYW5kIHByb2dyYW0gbG9hZC4KKyAqLworcmVnaXN0ZXIgU0VRQ1RMMCB7CisJYWRkcmVzcwkJCTB4MEQ2CisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlQRVJST1JESVMJMHg4MAorCWZpZWxkCVBBVVNFRElTCTB4NDAKKwlmaWVsZAlGQUlMRElTCQkweDIwCisJZmllbGQJRkFTVE1PREUJMHgxMAorCWZpZWxkCUJSS0FEUklOVEVOCTB4MDgKKwlmaWVsZAlTVEVQCQkweDA0CisJZmllbGQJU0VRUkVTRVQJMHgwMgorCWZpZWxkCUxPQURSQU0JCTB4MDEKK30KKworLyoKKyAqIFNlcXVlbmNlciBDb250cm9sIDEKKyAqIEluc3RydWN0aW9uIFJBTSBEaWFnbm9zdGljcworICovCityZWdpc3RlciBTRVFDVEwxIHsKKwlhZGRyZXNzCQkJMHgwRDcKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCU9WUkxBWV9EQVRBX0NISwkweDA4CisJZmllbGQJUkFNQklTVF9ET05FCTB4MDQKKwlmaWVsZAlSQU1CSVNUX0ZBSUwJMHgwMgorCWZpZWxkCVJBTUJJU1RfRU4JMHgwMQorfQorCisvKgorICogU2VxdWVuY2VyIEZsYWdzCisgKiBaZXJvIGFuZCBDYXJyeSBzdGF0ZSBvZiB0aGUgQUxVLgorICovCityZWdpc3RlciBGTEFHUyB7CisJYWRkcmVzcwkJCTB4MEQ4CisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlaRVJPCQkweDAyCisJZmllbGQJQ0FSUlkJCTB4MDEKK30KKworLyoKKyAqIFNlcXVlbmNlciBJbnRlcnJ1cHQgQ29udHJvbAorICovIAorcmVnaXN0ZXIgU0VRSU5UQ1RMIHsKKwlhZGRyZXNzCQkJMHgwRDkKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCUlOVFZFQzFEU0wJMHg4MAorCWZpZWxkCUlOVDFfQ09OVEVYVAkweDIwCisJZmllbGQJU0NTX1NFUV9JTlQxTTEJMHgxMAorCWZpZWxkCVNDU19TRVFfSU5UMU0wCTB4MDgKKwlmaWVsZAlJTlRNQVNLMgkweDA0CisJZmllbGQJSU5UTUFTSzEJMHgwMgorCWZpZWxkCUlSRVQJCTB4MDEKK30KKworLyoKKyAqIFNlcXVlbmNlciBSQU0gRGF0YSBQb3J0CisgKiBTaW5nbGUgYnl0ZSB3aW5kb3cgaW50byB0aGUgU2VxdWVuY2VyIEluc3RydWN0aW9uIFJhbSBhcmVhIHN0YXJ0aW5nCisgKiBhdCB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgYnkgT1ZMWUFERFIuICBUbyB3cml0ZSBhIGZ1bGwgaW5zdHJ1Y3Rpb24gd29yZCwKKyAqIHNpbXBseSB3cml0ZSBmb3VyIGJ5dGVzIGluIHN1Y2Nlc3Npb24uICBPVkxZQUREUiB3aWxsIGluY3JlbWVudCBhZnRlciB0aGUKKyAqIG1vc3Qgc2lnbmlmaWNhbnQgaW5zdHJ1dGlvbiBieXRlICh0aGUgYnl0ZSB3aXRoIHRoZSBwYXJpdHkgYml0KSBpcyB3cml0dGVuLgorICovCityZWdpc3RlciBTRVFSQU0geworCWFkZHJlc3MJCQkweDBEQQorCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUHJvZ3JhbSBDb3VudGVyCisgKiBMb3cgYnl0ZSBtdXN0IGJlIHdyaXR0ZW4gcHJpb3IgdG8gaGlnaCBieXRlLgorICovCityZWdpc3RlciBQUkdNQ05UIHsKKwlhZGRyZXNzCQkJMHgwREUKKwlhY2Nlc3NfbW9kZQlSVworCXNpemUJCTIKK30KKworLyoKKyAqIEFjY3VtdWxhdG9yCisgKi8KK3JlZ2lzdGVyIEFDQ1VNIHsKKwlhZGRyZXNzCQkJMHgwRTAKKwlhY2Nlc3NfbW9kZSBSVworCWFjY3VtdWxhdG9yCit9CisKKy8qCisgKiBTb3VyY2UgSW5kZXggUmVnaXN0ZXIKKyAqIEluY3JlbWVudGluZyBpbmRleCBmb3IgcmVhZHMgb2YgU0lORElSIGFuZCB0aGUgZGVzdGluYXRpb24gKGxvdyBieXRlIG9ubHkpCisgKiBmb3IgYW55IGltbWVkaWF0ZSBvcGVyYW5kcyBwYXNzZWQgaW4gam1wLCBqYywgam5jLCBjYWxsIGluc3RydWN0aW9ucy4KKyAqIEV4YW1wbGU6CisgKgkJbXZpCTB4RkYJY2FsbCBzb21lX3JvdXRpbmU7CisgKgorICogIFdpbGwgc2V0IFNJTkRFWFswXSB0byAweEZGIGFuZCBjYWxsIHRoZSByb3V0aW5lICJzb21lX3JvdXRpbmUuCisgKi8KK3JlZ2lzdGVyIFNJTkRFWAl7CisJYWRkcmVzcwkJCTB4MEUyCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJc2luZGV4Cit9CisKKy8qCisgKiBEZXN0aW5hdGlvbiBJbmRleCBSZWdpc3RlcgorICogSW5jcmVtZW50aW5nIGluZGV4IGZvciB3cml0ZXMgdG8gRElORElSLiAgQ2FuIGJlIHVzZWQgYXMgYSBzY3JhdGNoIHJlZ2lzdGVyLgorICovCityZWdpc3RlciBESU5ERVggeworCWFkZHJlc3MJCQkweDBFNAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorfQorCisvKgorICogQnJlYWsgQWRkcmVzcworICogU2VxdWVuY2VyIGluc3RydWN0aW9uIGJyZWFrcG9pbnQgYWRkcmVzcyBhZGRyZXNzLgorICovCityZWdpc3RlciBCUktBRERSMCB7CisJYWRkcmVzcwkJCTB4MEU2CisJYWNjZXNzX21vZGUJUlcKK30KKworcmVnaXN0ZXIgQlJLQUREUjEgeworCWFkZHJlc3MJCQkweDBFNgorCWFjY2Vzc19tb2RlCVJXCisJZmllbGQJQlJLRElTCQkweDgwCS8qIERpc2FibGUgQnJlYWtwb2ludCAqLworfQorCisvKgorICogQWxsIE9uZXMKKyAqIEFsbCByZWFkcyB0byB0aGlzIHJlZ2lzdGVyIHJldHVybiB0aGUgdmFsdWUgMHhGRi4KKyAqLworcmVnaXN0ZXIgQUxMT05FUyB7CisJYWRkcmVzcwkJCTB4MEU4CisJYWNjZXNzX21vZGUgUk8KKwlhbGxvbmVzCit9CisKKy8qCisgKiBBbGwgWmVyb3MKKyAqIEFsbCByZWFkcyB0byB0aGlzIHJlZ2lzdGVyIHJldHVybiB0aGUgdmFsdWUgMC4KKyAqLworcmVnaXN0ZXIgQUxMWkVST1MgeworCWFkZHJlc3MJCQkweDBFQQorCWFjY2Vzc19tb2RlIFJPCisJYWxsemVyb3MKK30KKworLyoKKyAqIE5vIERlc3RpbmF0aW9uCisgKiBXcml0ZXMgdG8gdGhpcyByZWdpc3RlciBoYXZlIG5vIGVmZmVjdC4KKyAqLworcmVnaXN0ZXIgTk9ORSB7CisJYWRkcmVzcwkJCTB4MEVBCisJYWNjZXNzX21vZGUgV08KKwlub25lCit9CisKKy8qCisgKiBTb3VyY2UgSW5kZXggSW5kaXJlY3QKKyAqIFJlYWRpbmcgdGhpcyByZWdpc3RlciBpcyBlcXVpdmFsZW50IHRvIHJlYWRpbmcgKHJlZ2lzdGVyX2Jhc2UgKyBTSU5ERVgpIGFuZAorICogaW5jcmVtZW50aW5nIFNJTkRFWCBieSAxLgorICovCityZWdpc3RlciBTSU5ESVIJeworCWFkZHJlc3MJCQkweDBFQworCWFjY2Vzc19tb2RlIFJPCit9CisKKy8qCisgKiBEZXN0aW5hdGlvbiBJbmRleCBJbmRpcmVjdAorICogV3JpdGluZyB0aGlzIHJlZ2lzdGVyIGlzIGVxdWl2YWxlbnQgdG8gd3JpdGluZyB0byAocmVnaXN0ZXJfYmFzZSArIERJTkRFWCkKKyAqIGFuZCBpbmNyZW1lbnRpbmcgRElOREVYIGJ5IDEuCisgKi8KK3JlZ2lzdGVyIERJTkRJUgkgeworCWFkZHJlc3MJCQkweDBFRAorCWFjY2Vzc19tb2RlIFdPCit9CisKKy8qCisgKiBGdW5jdGlvbiBPbmUKKyAqIDIncyBjb21wbGVtZW50IHRvIGJpdCB2YWx1ZSBjb252ZXJzaW9uLiAgV3JpdGUgdGhlIDIncyBjb21wbGVtZW50IHZhbHVlCisgKiAoMC03IG9ubHkpIHRvIHRoZSB0b3AgbmliYmxlIGFuZCByZXRyaWV2ZSB0aGUgYml0IGluZGV4ZWQgYnkgdGhhdCB2YWx1ZQorICogb24gdGhlIG5leHQgcmVhZCBvZiB0aGlzIHJlZ2lzdGVyLiAKKyAqIEV4YW1wbGU6CisgKglXcml0ZQkweDYwCisgKglSZWFkCTB4NDAKKyAqLworcmVnaXN0ZXIgRlVOQ1RJT04xIHsKKwlhZGRyZXNzCQkJMHgwRjAKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogU3RhY2sKKyAqIFdpbmRvdyBpbnRvIHRoZSBzdGFjay4gIEVhY2ggc3RhY2sgbG9jYXRpb24gaXMgMTAgYml0cyB3aWRlIHJlcG9ydGVkCisgKiBsb3cgYnl0ZSBmb2xsb3dlZCBieSBoaWdoIGJ5dGUuICBUaGVyZSBhcmUgOCBzdGFjayBsb2NhdGlvbnMuCisgKi8KK3JlZ2lzdGVyIFNUQUNLIHsKKwlhZGRyZXNzCQkJMHgwRjIKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogSW50ZXJydXB0IFZlY3RvciAxIEFkZHJlc3MKKyAqIEludGVycnVwdCBicmFuY2ggYWRkcmVzcyBmb3IgU0NTIFNFUV9JTlQxIG1vZGUgMCBhbmQgMSBpbnRlcnJ1cHRzLgorICovCityZWdpc3RlciBJTlRWRUMxX0FERFIgeworCWFkZHJlc3MJCQkweDBGNAorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX0NGRworfQorCisvKgorICogQ3VycmVudCBBZGRyZXNzCisgKiBBZGRyZXNzIG9mIHRoZSBTRVFSQU0gaW5zdHJ1Y3Rpb24gY3VycmVudGx5IGV4ZWN1dGluZyBpbnN0cnVjdGlvbi4KKyAqLworcmVnaXN0ZXIgQ1VSQUREUiB7CisJYWRkcmVzcwkJCTB4MEY0CisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fU0NTSQorfQorCisvKgorICogSW50ZXJydXB0IFZlY3RvciAyIEFkZHJlc3MKKyAqIEludGVycnVwdCBicmFuY2ggYWRkcmVzcyBmb3IgSFNUX1NFUV9JTlQyIGludGVycnVwdHMuCisgKi8KK3JlZ2lzdGVyIElOVFZFQzJfQUREUiB7CisJYWRkcmVzcwkJCTB4MEY2CisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyCisJbW9kZXMJCU1fQ0ZHCit9CisKKy8qCisgKiBMYXN0IEFkZHJlc3MKKyAqIEFkZHJlc3Mgb2YgdGhlIFNFUVJBTSBpbnN0cnVjdGlvbiBleGVjdXRlZCBwcmlvciB0byB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAqLworcmVnaXN0ZXIgTEFTVEFERFIgeworCWFkZHJlc3MJCQkweDBGNgorCWFjY2Vzc19tb2RlCVJXCisJc2l6ZQkJMgorCW1vZGVzCQlNX1NDU0kKK30KKworcmVnaXN0ZXIgQUhEX1BDSV9DT05GSUdfQkFTRSB7CisJYWRkcmVzcwkJCTB4MTAwCisJYWNjZXNzX21vZGUJUlcKKwlzaXplCQkyNTYKKwltb2RlcwkJTV9DRkcKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTY3JhdGNoIFJBTSBPZmZzZXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3NjcmF0Y2hfcmFtIHsKKwkvKiBNb2RlIFNwZWNpZmljICovCisJYWRkcmVzcwkJCTB4MEEwCisJc2l6ZQk4CisJbW9kZXMJMCwgMSwgMiwgMworCVJFRzAgeworCQlzaXplCQkyCisJfQorCVJFRzEgeworCQlzaXplCQkyCisJfQorCVJFR19JU1IgeworCQlzaXplCQkyCisJfQorCVNHX1NUQVRFIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlTRUdTX0FWQUlMCTB4MDEKKwkJZmllbGQJTE9BRElOR19ORUVERUQJMHgwMgorCQlmaWVsZAlGRVRDSF9JTlBST0cJMHgwNAorCX0KKwkvKgorCSAqIFRyYWNrIHdoZXRoZXIgdGhlIHRyYW5zZmVyIGJ5dGUgY291bnQgZm9yCisJICogdGhlIGN1cnJlbnQgZGF0YSBwaGFzZSBpcyBvZGQuCisJICovCisJREFUQV9DT1VOVF9PREQgeworCQlzaXplCQkxCisJfQorfQorCitzY3JhdGNoX3JhbSB7CisJLyogTW9kZSBTcGVjaWZpYyAqLworCWFkZHJlc3MJCQkweDBGOAorCXNpemUJOAorCW1vZGVzCTAsIDEsIDIsIDMKKwlMT05HSk1QX0FERFIgeworCQlzaXplCQkyCisJfQorCUFDQ1VNX1NBVkUgeworCQlzaXplCQkxCisJfQorfQorCisKK3NjcmF0Y2hfcmFtIHsKKwlhZGRyZXNzCQkJMHgxMDAKKwlzaXplCTEyOAorCW1vZGVzCTAsIDEsIDIsIDMKKwkvKgorCSAqIFBlciAib3RoZXItaWQiIGV4ZWN1dGlvbiBxdWV1ZXMuICBXZSB1c2UgYW4gYXJyYXkgb2YKKwkgKiB0YWlsIHBvaW50ZXJzIGludG8gbGlzdHMgb2YgU0NCcyBzb3J0ZWQgYnkgIm90aGVyLWlkIi4KKwkgKiBUaGUgZXhlY3V0aW9uIGhlYWQgcG9pbnRlciB0aHJlYWRzIHRoZSBoZWFkIFNDQnMgZm9yCisJICogZWFjaCBsaXN0LgorCSAqLworCVdBSVRJTkdfU0NCX1RBSUxTIHsKKwkJc2l6ZQkJMzIKKwl9CisJV0FJVElOR19USURfSEVBRCB7CisJCXNpemUJCTIKKwl9CisJV0FJVElOR19USURfVEFJTCB7CisJCXNpemUJCTIKKwl9CisJLyoKKwkgKiBTQ0JJRCBvZiB0aGUgbmV4dCBTQ0IgaW4gdGhlIG5ldyBTQ0IgcXVldWUuCisJICovCisJTkVYVF9RVUVVRURfU0NCX0FERFIgeworCQlzaXplCQk0CisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBoYXZlCisJICogY29tcGxldGVkIGJ1dCBoYXZlIG5vdCBiZWVuCisJICogcHV0IGludG8gdGhlIHFvdXRmaWZvLgorCSAqLworCUNPTVBMRVRFX1NDQl9IRUFEIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIFRoZSBsaXN0IG9mIGNvbXBsZXRlZCBTQ0JzIGluCisJICogdGhlIGFjdGl2ZSBETUEuCisJICovCisJQ09NUExFVEVfU0NCX0RNQUlOUFJPR19IRUFEIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIGhlYWQgb2YgbGlzdCBvZiBTQ0JzIHRoYXQgaGF2ZQorCSAqIGNvbXBsZXRlZCBidXQgbmVlZCB0byBiZSB1cGxvYWRlZAorCSAqIHRvIHRoZSBob3N0IHByaW9yIHRvIGJlaW5nIGNvbXBsZXRlZC4KKwkgKi8KKwlDT01QTEVURV9ETUFfU0NCX0hFQUQgeworCQlzaXplCQkyCisJfQorCS8qIENvdW50aW5nIHNlbWFwaG9yZSB0byBwcmV2ZW50IG5ldyBzZWxlY3Qtb3V0cyAqLworCVFGUkVFWkVfQ09VTlQgeworCQlzaXplCQkyCisJfQorCS8qCisJICogTW9kZSB0byByZXN0b3JlIG9uIGxlZ2FjeSBpZGxlIGxvb3AgZXhpdC4KKwkgKi8KKwlTQVZFRF9NT0RFIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIFNpbmdsZSBieXRlIGJ1ZmZlciB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUgdHlwZSBvciBtZXNzYWdlCisJICogdG8gc2VuZCB0byBhIHRhcmdldC4KKwkgKi8KKwlNU0dfT1VUIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBQYXJhbWV0ZXJzIGZvciBETUEgTG9naWMgKi8KKwlETUFQQVJBTVMgeworCQlzaXplCQkxCisJCWZpZWxkCVBSRUxPQURFTgkweDgwCisJCWZpZWxkCVdJREVPREQJCTB4NDAKKwkJZmllbGQJU0NTSUVOCQkweDIwCisJCWZpZWxkCVNETUFFTgkJMHgxMAorCQlmaWVsZAlTRE1BRU5BQ0sJMHgxMAorCQlmaWVsZAlIRE1BRU4JCTB4MDgKKwkJZmllbGQJSERNQUVOQUNLCTB4MDgKKwkJZmllbGQJRElSRUNUSU9OCTB4MDQJLyogU2V0IGluZGljYXRlcyBQQ0ktPlNDU0kgKi8KKwkJZmllbGQJRklGT0ZMVVNICTB4MDIKKwkJZmllbGQJRklGT1JFU0VUCTB4MDEKKwl9CisJU0VRX0ZMQUdTIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlOT1RfSURFTlRJRklFRAkJMHg4MAorCQlmaWVsZAlOT19DREJfU0VOVAkJMHg0MAorCQlmaWVsZAlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCisJCWZpZWxkCURQSEFTRQkJCTB4MjAKKwkJLyogVGFyZ2V0IGZsYWdzICovCisJCWZpZWxkCVRBUkdfQ01EX1BFTkRJTkcJMHgxMAorCQlmaWVsZAlDTURQSEFTRV9QRU5ESU5HCTB4MDgKKwkJZmllbGQJRFBIQVNFX1BFTkRJTkcJCTB4MDQKKwkJZmllbGQJU1BIQVNFX1BFTkRJTkcJCTB4MDIKKwkJZmllbGQJTk9fRElTQ09OTkVDVAkJMHgwMQorCX0KKwkvKgorCSAqIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUKKwkgKiB0YXJnZXQvY2hhbm5lbC9sdW4gb2YgYQorCSAqIHJlY29ubmVjdGluZyB0YXJnZXQKKwkgKi8KKwlTQVZFRF9TQ1NJSUQgeworCQlzaXplCQkxCisJfQorCVNBVkVEX0xVTiB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBUaGUgbGFzdCBidXMgcGhhc2UgYXMgc2VlbiBieSB0aGUgc2VxdWVuY2VyLiAKKwkgKi8KKwlMQVNUUEhBU0UgeworCQlzaXplCQkxCisJCWZpZWxkCUNESQkJMHg4MAorCQlmaWVsZAlJT0kJCTB4NDAKKwkJZmllbGQJTVNHSQkJMHgyMAorCQlmaWVsZAlQX0JVU0ZSRUUJMHgwMQorCQllbnVtCVBIQVNFX01BU0sgIENET3xJT098TVNHTyB7CisJCQlQX0RBVEFPVVQJMHgwLAorCQkJUF9EQVRBSU4JSU9PLAorCQkJUF9EQVRBT1VUX0RUCVBfREFUQU9VVHxNU0dPLAorCQkJUF9EQVRBSU5fRFQJUF9EQVRBSU58TVNHTywKKwkJCVBfQ09NTUFORAlDRE8sCisJCQlQX01FU0dPVVQJQ0RPfE1TR08sCisJCQlQX1NUQVRVUwlDRE98SU9PLAorCQkJUF9NRVNHSU4JQ0RPfElPT3xNU0dPCisJCX0KKwl9CisJLyoKKwkgKiBWYWx1ZSB0byAib3IiIGludG8gdGhlIFNDQlBUUlsxXSB2YWx1ZSB0bworCSAqIGluZGljYXRlIHRoYXQgYW4gZW50cnkgaW4gdGhlIFFJTkZJRk8gaXMgdmFsaWQuCisJICovCisJUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIEJhc2UgYWRkcmVzcyBvZiBvdXIgc2hhcmVkIGRhdGEgd2l0aCB0aGUga2VybmVsIGRyaXZlciBpbiBob3N0CisJICogbWVtb3J5LiAgVGhpcyBpbmNsdWRlcyB0aGUgcW91dGZpZm8gYW5kIHRhcmdldCBtb2RlCisJICogaW5jb21pbmcgY29tbWFuZCBxdWV1ZS4KKwkgKi8KKwlTSEFSRURfREFUQV9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIFBvaW50ZXIgdG8gbG9jYXRpb24gaW4gaG9zdCBtZW1vcnkgZm9yIG5leHQKKwkgKiBwb3NpdGlvbiBpbiB0aGUgcW91dGZpZm8uCisJICovCisJUU9VVEZJRk9fTkVYVF9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIEtlcm5lbCBhbmQgc2VxdWVuY2VyIG9mZnNldHMgaW50byB0aGUgcXVldWUgb2YKKwkgKiBpbmNvbWluZyB0YXJnZXQgbW9kZSBjb21tYW5kIGRlc2NyaXB0b3JzLiAgVGhlCisJICogcXVldWUgaXMgZnVsbCB3aGVuIHRoZSBLRVJORUxfVFFJTlBPUyA9PSBUUUlOUE9TLgorCSAqLworCUtFUk5FTF9UUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlUUUlOUE9TIHsgICAgICAgICAgICAgICAgCisJCXNpemUJCTEKKwl9CisJQVJHXzEgeworCQlzaXplCQkxCisJCW1hc2sJU0VORF9NU0cJCTB4ODAKKwkJbWFzawlTRU5EX1NFTlNFCQkweDQwCisJCW1hc2sJU0VORF9SRUoJCTB4MjAKKwkJbWFzawlNU0dPVVRfUEhBU0VNSVMJCTB4MTAKKwkJbWFzawlFWElUX01TR19MT09QCQkweDA4CisJCW1hc2sJQ09OVF9NU0dfTE9PUF9XUklURQkweDA0CisJCW1hc2sJQ09OVF9NU0dfTE9PUF9SRUFECTB4MDMKKwkJbWFzawlDT05UX01TR19MT09QX1RBUkcJMHgwMgorCQlhbGlhcwlSRVRVUk5fMQorCX0KKwlBUkdfMiB7CisJCXNpemUJCTEKKwkJYWxpYXMJUkVUVVJOXzIKKwl9CisKKwkvKgorCSAqIFNuYXBzaG90IG9mIE1TR19PVVQgdGFrZW4gYWZ0ZXIgZWFjaCBtZXNzYWdlIGlzIHNlbnQuCisJICovCisJTEFTVF9NU0cgeworCQlzaXplCQkxCisJfQorCisJLyoKKwkgKiBTZXF1ZW5jZXMgdGhlIGtlcm5lbCBkcml2ZXIgaGFzIG9rYXllZCBmb3IgdXMuICBUaGlzIGFsbG93cworCSAqIHRoZSBkcml2ZXIgdG8gZG8gdGhpbmdzIGxpa2UgcHJldmVudCBpbml0aWF0b3Igb3IgdGFyZ2V0CisJICogb3BlcmF0aW9ucy4KKwkgKi8KKwlTQ1NJU0VRX1RFTVBMQVRFIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlNQU5VQUxDVEwJMHg0MAorCQlmaWVsZAlFTlNFTEkJCTB4MjAKKwkJZmllbGQJRU5SU0VMSQkJMHgxMAorCQlmaWVsZAlNQU5VQUxQCQkweDBDCisJCWZpZWxkCUVOQVVUT0FUTlAJMHgwMgorCQlmaWVsZAlBTFRTVElNCQkweDAxCisJfQorCisJLyoKKwkgKiBUaGUgaW5pdGlhdG9yIHNwZWNpZmllZCB0YWcgZm9yIHRoaXMgdGFyZ2V0IG1vZGUgdHJhbnNhY3Rpb24uCisJICovCisJSU5JVElBVE9SX1RBRyB7CisJCXNpemUJCTEKKwl9CisKKwlTRVFfRkxBR1MyIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlUQVJHRVRfTVNHX1BFTkRJTkcJICAweDAyCisJCWZpZWxkCVNFTEVDVE9VVF9RRlJPWkVOCSAgMHgwNAorCX0KKworCUFMTE9DRklGT19TQ0JQVFIgeworCQlzaXplCQkyCisJfQorCisJLyoKKwkgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0LCB3aGVuIGludGVycnVwdCBjb2FsZXNjaW5nCisJICogaXMgZW5hYmxlZCwgYmVmb3JlIGlzc3VlaW5nIGEgQ01EQ01QTFQgaW50ZXJydXB0IGZvciBhIGNvbXBsZXRlZAorCSAqIGNvbW1hbmQuCisJICovCisJSU5UX0NPQUxFU0NJTkdfVElNRVIgeworCQlzaXplCQkyCisJfQorCisJLyoKKwkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tbWFuZHMgdG8gY29hbGVzY2UgaW50byBhIHNpbmdsZSBpbnRlcnJ1cHQuCisJICogQWN0dWFsbHkgdGhlIDIncyBjb21wbGVtZW50IG9mIHRoYXQgdmFsdWUgdG8gc2ltcGxpZnkgc2VxdWVuY2VyCisJICogY29kZS4KKwkgKi8KKwlJTlRfQ09BTEVTQ0lOR19NQVhDTURTIHsKKwkJc2l6ZQkJMQorCX0KKworCS8qCisJICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGNvbW1hbmRzIHN0aWxsIG91dHN0YW5kaW5nIHJlcXVpcmVkCisJICogdG8gY29udGludWUgY29hbGVzY2luZyAoMidzIGNvbXBsZW1lbnQgb2YgdmFsdWUpLgorCSAqLworCUlOVF9DT0FMRVNDSU5HX01JTkNNRFMgeworCQlzaXplCQkxCisJfQorCisJLyoKKwkgKiBOdW1iZXIgb2YgY29tbWFuZHMgImluLWZsaWdodCIuCisJICovCisJQ01EU19QRU5ESU5HIHsKKwkJc2l6ZQkJMgorCX0KKworCS8qCisJICogVGhlIGNvdW50IG9mIGNvbW1hbmRzIHRoYXQgaGF2ZSBiZWVuIGNvYWxlc2NlZC4KKwkgKi8KKwlJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCB7CisJCXNpemUJCTEKKwl9CisKKwkvKgorCSAqIFNpbmNlIHRoZSBIU19NQUlCT1ggaXMgc2VsZiBjbGVhcmluZywgY29weSBpdHMgY29udGVudHMgdG8KKwkgKiB0aGlzIHBvc2l0aW9uIGluIHNjcmF0Y2ggcmFtIGV2ZXJ5IHRpbWUgaXQgY2hhbmdlcy4KKwkgKi8KKwlMT0NBTF9IU19NQUlMQk9YIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIFRhcmdldC1tb2RlIENEQiB0eXBlIHRvIENEQiBsZW5ndGggdGFibGUgdXNlZAorCSAqIGluIG5vbi1wYWNrZXRpemVkIG9wZXJhdGlvbi4KKwkgKi8KKwlDTURTSVpFX1RBQkxFIHsKKwkJc2l6ZQkJOAorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGFyZHdhcmUgU0NCIERlZmluaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NjYiB7CisJYWRkcmVzcwkJCTB4MTgwCisJc2l6ZQk2NAorCW1vZGVzCTAsIDEsIDIsIDMKKwlTQ0JfUkVTSURVQUxfREFUQUNOVCB7CisJCXNpemUJNAorCQlhbGlhcwlTQ0JfQ0RCX1NUT1JFCisJCWFsaWFzCVNDQl9IT1NUX0NEQl9QVFIKKwl9CisJU0NCX1JFU0lEVUFMX1NHUFRSIHsKKwkJc2l6ZQk0CisJCWZpZWxkCVNHX0FERFJfTUFTSwkJMHhmOAkvKiBJbiB0aGUgbGFzdCBieXRlICovCisJCWZpZWxkCVNHX09WRVJSVU5fUkVTSUQJMHgwMgkvKiBJbiB0aGUgZmlyc3QgYnl0ZSAqLworCQlmaWVsZAlTR19MSVNUX05VTEwJCTB4MDEJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwl9CisJU0NCX1NDU0lfU1RBVFVTIHsKKwkJc2l6ZQkxCisJCWFsaWFzCVNDQl9IT1NUX0NEQl9MRU4KKwl9CisJU0NCX1RBUkdFVF9QSEFTRVMgeworCQlzaXplCTEKKwl9CisJU0NCX1RBUkdFVF9EQVRBX0RJUiB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFSR0VUX0lUQUcgeworCQlzaXplCTEKKwl9CisJU0NCX1NFTlNFX0JVU0FERFIgeworCQkvKgorCQkgKiBPbmx5IHZhbGlkIGlmIENEQiBsZW5ndGggaXMgbGVzcyB0aGFuIDEzIGJ5dGVzIG9yCisJCSAqIHdlIGFyZSB1c2luZyBhIENEQiBwb2ludGVyLiAgT3RoZXJ3aXNlIGNvbnRhaW5zCisJCSAqIHRoZSBsYXN0IDQgYnl0ZXMgb2YgZW1iZWRkZWQgY2RiIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJc2l6ZQk0CisJCWFsaWFzCVNDQl9ORVhUX0NPTVBMRVRFCisJfQorCVNDQl9UQUcgeworCQlhbGlhcwlTQ0JfRklGT19VU0VfQ09VTlQKKwkJc2l6ZQkyCisJfQorCVNDQl9DT05UUk9MIHsKKwkJc2l6ZQkxCisJCWZpZWxkCVRBUkdFVF9TQ0IJMHg4MAorCQlmaWVsZAlESVNDRU5CCQkweDQwCisJCWZpZWxkCVRBR19FTkIJCTB4MjAKKwkJZmllbGQJTUtfTUVTU0FHRQkweDEwCisJCWZpZWxkCVNUQVRVU19SQ1ZECTB4MDgKKwkJZmllbGQJRElTQ09OTkVDVEVECTB4MDQKKwkJZmllbGQJU0NCX1RBR19UWVBFCTB4MDMKKwl9CisJU0NCX1NDU0lJRCB7CisJCXNpemUJMQorCQlmaWVsZAlUSUQJMHhGMAorCQlmaWVsZAlPSUQJMHgwRgorCX0KKwlTQ0JfTFVOIHsKKwkJc2l6ZQkxCisJCWZpZWxkCUxJRAkweGZmCisJfQorCVNDQl9UQVNLX0FUVFJJQlVURSB7CisJCXNpemUJMQorCQkvKgorCQkgKiBPdmVybG9hZGVkIGZpZWxkIGZvciBub24tcGFja2V0aXplZCAKKwkJICogaWdub3JlIHdpZGUgcmVzaWR1ZSBtZXNzYWdlIGhhbmRsaW5nLgorCQkgKi8KKwkJZmllbGQJU0NCX1hGRVJMRU5fT0RECTB4MDEKKwl9CisJU0NCX0NEQl9MRU4geworCQlzaXplCTEKKwkJZmllbGQJU0NCX0NEQl9MRU5fUFRSCTB4ODAJLyogQ0RCIGluIGhvc3QgbWVtb3J5ICovCisJfQorCVNDQl9UQVNLX01BTkFHRU1FTlQgeworCQlzaXplCTEKKwl9CisJU0NCX0RBVEFQVFIgeworCQlzaXplCTgKKwl9CisJU0NCX0RBVEFDTlQgeworCQkvKgorCQkgKiBUaGUgbGFzdCBieXRlIGlzIHJlYWxseSB0aGUgaGlnaCBhZGRyZXNzIGJpdHMgZm9yCisJCSAqIHRoZSBkYXRhIGFkZHJlc3MuCisJCSAqLworCQlzaXplCTQKKwkJZmllbGQJU0dfTEFTVF9TRUcJCTB4ODAJLyogSW4gdGhlIGZvdXJ0aCBieXRlICovCisJCWZpZWxkCVNHX0hJR0hfQUREUl9CSVRTCTB4N0YJLyogSW4gdGhlIGZvdXJ0aCBieXRlICovCisJfQorCVNDQl9TR1BUUiB7CisJCXNpemUJNAorCQlmaWVsZAlTR19TVEFUVVNfVkFMSUQJMHgwNAkvKiBJbiB0aGUgZmlyc3QgYnl0ZSAqLworCQlmaWVsZAlTR19GVUxMX1JFU0lECTB4MDIJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwkJZmllbGQJU0dfTElTVF9OVUxMCTB4MDEJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwl9CisJU0NCX0JVU0FERFIgeworCQlzaXplCTQKKwl9CisJU0NCX05FWFQgeworCQlhbGlhcwlTQ0JfTkVYVF9TQ0JfQlVTQUREUgorCQlzaXplCTIKKwl9CisJU0NCX05FWFQyIHsKKwkJc2l6ZQkyCisJfQorCVNDQl9TUEFSRSB7CisJCXNpemUJOAorCQlhbGlhcwlTQ0JfUEtUX0xVTgorCX0KKwlTQ0JfRElTQ09OTkVDVEVEX0xJU1RTIHsKKwkJc2l6ZQk4CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgTUtfTUVTU0FHRV9CSVRfT0ZGU0VUCTQKK2NvbnN0IFRJRF9TSElGVAkJNAorY29uc3QgVEFSR0VUX0NNRF9DTVBMVAkweGZlCitjb25zdCBJTlZBTElEX0FERFIJMHg4MAorI2RlZmluZSBTQ0JfTElTVF9OVUxMCTB4ZmYKKyNkZWZpbmUgUU9VVEZJRk9fRU5UUllfVkFMSURfVE9HR0xFCTB4ODAKKworY29uc3QgQ0NTR0FERFJfTUFYCTB4ODAKK2NvbnN0IENDU0NCQUREUl9NQVgJMHg4MAorY29uc3QgQ0NTR1JBTV9NQVhTRUdTCTE2CisKKy8qIFNlbGVjdGlvbiBUaW1lb3V0IFRpbWVyIENvbnN0YW50cyAqLworY29uc3QgU1RJTUVTRUxfU0hJRlQJMworY29uc3QgU1RJTUVTRUxfTUlOCTB4MTgKK2NvbnN0IFNUSU1FU0VMX0JVR19BREoJMHg4CisKKy8qIFdEVFIgTWVzc2FnZSB2YWx1ZXMgKi8KK2NvbnN0IEJVU184X0JJVAkJCTB4MDAKK2NvbnN0IEJVU18xNl9CSVQJCTB4MDEKK2NvbnN0IEJVU18zMl9CSVQJCTB4MDIKKworLyogT2Zmc2V0IG1heGltdW1zICovCitjb25zdCBNQVhfT0ZGU0VUCQkweGZlCitjb25zdCBNQVhfT0ZGU0VUX1BBQ0VECQkweGZlCitjb25zdCBNQVhfT0ZGU0VUX1BBQ0VEX0JVRwkweDdmCisvKgorICogU29tZSAxNjAgZGV2aWNlcyBpbmNvcnJlY3RseSBhY2NlcHQgMHhmZSBhcyBhCisgKiBzeW5jIG9mZnNldCwgYnV0IHdpbGwgb3ZlcnJ1biB0aGlzIHZhbHVlLiAgTGltaXQKKyAqIHRvIDB4N2YgZm9yIHNwZWVkIGxvd2VyIHRoYW4gVTMyMCB3aGljaCB3aWxsCisgKiBhdm9pZCB0aGUgcGVyc2lzdGVudCBzeW5jIG9mZnNldCBvdmVycnVucy4KKyAqLworY29uc3QgTUFYX09GRlNFVF9OT05fUEFDRUQJMHg3ZgorY29uc3QgSE9TVF9NU0cJCQkweGZmCisKKy8qCisgKiBUaGUgc2l6ZSBvZiBvdXIgc2Vuc2UgYnVmZmVycy4KKyAqIFNlbnNlIGJ1ZmZlciBtYXBwaW5nIGNhbiBiZSBoYW5kbGVkIGluIGVpdGhlciBvZiB0d28gd2F5cy4KKyAqIFRoZSBmaXJzdCBpcyB0byBhbGxvY2F0ZSBhIGRtYW1hcCBmb3IgZWFjaCB0cmFuc2FjdGlvbi4KKyAqIERlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlLCBkbWFtYXBzIGNhbiBiZSBjb3N0bHkuIFRoZQorICogYWx0ZXJuYXRpdmUgaXMgdG8gc3RhdGljYWxseSBtYXAgdGhlIGJ1ZmZlcnMgaW4gbXVjaCB0aGUgc2FtZQorICogd2F5IHdlIGhhbmRsZSBvdXIgc2NhdHRlciBnYXRoZXIgbGlzdHMuICBUaGUgZHJpdmVyIGltcGxlbWVudHMKKyAqIHRoZSBsYXRlci4KKyAqLworY29uc3QgQUhEX1NFTlNFX0JVRlNJWkUJCTI1NgorCisvKiBUYXJnZXQgbW9kZSBjb21tYW5kIHByb2Nlc3NpbmcgY29uc3RhbnRzICovCitjb25zdCBDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1CisKK2NvbnN0IFNUQVRVU19CVVNZCQkweDA4Citjb25zdCBTVEFUVVNfUVVFVUVfRlVMTAkJMHgyOAorY29uc3QgU1RBVFVTX1BLVF9TRU5TRQkJMHhGRgorY29uc3QgVEFSR0VUX0RBVEFfSU4JCTEKKworY29uc3QgU0NCX1RSQU5TRkVSX1NJWkVfRlVMTF9MVU4JNTYKK2NvbnN0IFNDQl9UUkFOU0ZFUl9TSVpFXzFCWVRFX0xVTgk0OAorLyogUEtUX09WRVJSVU5fQlVGU0laRSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMjU2IGxlc3MgdGhhbiA2NEsgKi8KK2NvbnN0IFBLVF9PVkVSUlVOX0JVRlNJWkUJNTEyCisKKy8qCisgKiBUaW1lciBwYXJhbWV0ZXJzLgorICovCitjb25zdCBBSERfVElNRVJfVVNfUEVSX1RJQ0sJMjUKK2NvbnN0IEFIRF9USU1FUl9NQVhfVElDS1MJMHhGRkZGCitjb25zdCBBSERfVElNRVJfTUFYX1VTCQkoQUhEX1RJTUVSX01BWF9USUNLUyAqIEFIRF9USU1FUl9VU19QRVJfVElDSykKKworLyoKKyAqIERvd25sb2FkZWQgKGtlcm5lbCBpbnNlcnRlZCkgY29uc3RhbnRzCisgKi8KK2NvbnN0IFNHX1BSRUZFVENIX0NOVCBkb3dubG9hZAorY29uc3QgU0dfUFJFRkVUQ0hfQ05UX0xJTUlUIGRvd25sb2FkCitjb25zdCBTR19QUkVGRVRDSF9BTElHTl9NQVNLIGRvd25sb2FkCitjb25zdCBTR19QUkVGRVRDSF9BRERSX01BU0sgZG93bmxvYWQKK2NvbnN0IFNHX1NJWkVPRiBkb3dubG9hZAorY29uc3QgUEtUX09WRVJSVU5fQlVGT0ZGU0VUIGRvd25sb2FkCitjb25zdCBTQ0JfVFJBTlNGRVJfU0laRQlkb3dubG9hZAorCisvKgorICogQklPUyBTQ0Igb2Zmc2V0cworICovCitjb25zdCBOVlJBTV9TQ0JfT0ZGU0VUCTB4MkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5zZXEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMzliYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguc2VxCkBAIC0wLDAgKzEsMjA1OCBAQAorLyoKKyAqIEFkYXB0ZWMgVTMyMCBkZXZpY2UgZHJpdmVyIGZpcm13YXJlIGZvciBMaW51eCBhbmQgRnJlZUJTRC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMSBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTkgJCIKK1BBVENIX0FSR19MSVNUID0gInN0cnVjdCBhaGRfc29mdGMgKmFoZCIKK1BSRUZJWCA9ICJhaGRfIgorCisjaW5jbHVkZSAiYWljNzl4eC5yZWciCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisKK3Jlc3RhcnQ6CitpZiAoKGFoZC0+YnVncyAmIEFIRF9JTlRDT0xMSVNJT05fQlVHKSAhPSAwKSB7CisJdGVzdAlTRVFJTlRDT0RFLCAweEZGIGp6IGlkbGVfbG9vcDsKKwlTRVRfU0VRSU5UQ09ERShOT19TRVFJTlQpCit9CisKK2lkbGVfbG9vcDoKKworCWlmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogQ29udmVydCBFUlJPUiBzdGF0dXMgaW50byBhIHNlcXVlbmNlcgorCQkgKiBpbnRlcnJ1cHQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIGFuCisJCSAqIGludGVycnVwdCBjb2xsaXNpb24gb24gdGhlIGhhcmR3YXJlCisJCSAqIHNldHRpbmcgb2YgSFdFUlIuCisJCSAqLworCQl0ZXN0CUVSUk9SLCAweEZGIGp6IG5vX2Vycm9yX3NldDsKKwkJU0VUX1NFUUlOVENPREUoU0FXX0hXRVJSKQorbm9fZXJyb3Jfc2V0OgorCX0KKwlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKKwl0ZXN0CVNDU0lTRVEwLCBFTlNFTE98RU5BUkJPIGpueiBpZGxlX2xvb3BfY2hlY2tidXM7CisJdGVzdAlTRVFfRkxBR1MyLCBTRUxFQ1RPVVRfUUZST1pFTiBqbnogaWRsZV9sb29wX2NoZWNrYnVzOworCWNtcAlXQUlUSU5HX1RJRF9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMIGplIGlkbGVfbG9vcF9jaGVja2J1czsKKwkvKgorCSAqIEVOU0VMTyBpcyBjbGVhcmVkIGJ5IGEgU0VMRE8sIHNvIHdlIG11c3QgdGVzdCBmb3IgU0VMRE8KKwkgKiBvbmUgbGFzdCB0aW1lLgorCSAqLworQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlTU1RBVDAsIFNFTERPIGpueiBzZWxlY3Rfb3V0OworRU5EX0NSSVRJQ0FMOworCWNhbGwJc3RhcnRfc2VsZWN0aW9uOworaWRsZV9sb29wX2NoZWNrYnVzOgorQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlTU1RBVDAsIFNFTERPIGpueiBzZWxlY3Rfb3V0OworRU5EX0NSSVRJQ0FMOworCXRlc3QJU1NUQVQwLCBTRUxESSBqbnogc2VsZWN0X2luOworCXRlc3QJU0NTSVBIQVNFLCB+REFUQV9QSEFTRV9NQVNLIGp6IGlkbGVfbG9vcF9jaGVja19ub25wYWNrcmVxOworCXRlc3QJU0NTSVNJR08sIEFUTk8ganogaWRsZV9sb29wX2NoZWNrX25vbnBhY2tyZXE7CisJY2FsbAl1bmV4cGVjdGVkX25vbnBrdF9waGFzZV9maW5kX2N0eHQ7CitpZGxlX2xvb3BfY2hlY2tfbm9ucGFja3JlcToKKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiAuICsgMjsKKwljYWxsCXVuZXhwZWN0ZWRfbm9ucGt0X3BoYXNlX2ZpbmRfY3R4dDsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9GQUlOVF9MRURfQlVHKSAhPSAwKSB7CisJCWFuZAlBLCBGSUZPMEZSRUV8RklGTzFGUkVFLCBERkZTVEFUOworCQljbXAJQSwgRklGTzBGUkVFfEZJRk8xRlJFRSBqbmUgLiArIDM7CisJCWFuZAlTQkxLQ1RMLCB+RElBR0xFREVOfERJQUdMRURPTjsKKwkJam1wCS4gKyAyOworCQlvcglTQkxLQ1RMLCBESUFHTEVERU58RElBR0xFRE9OOworCX0KKwljYWxsCWlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOworCWNhbGwJaWRsZV9sb29wX3NlcnZpY2VfZmlmb3M7CisJY2FsbAlpZGxlX2xvb3BfY2NoYW47CisJam1wCWlkbGVfbG9vcDsKKworQkVHSU5fQ1JJVElDQUw7CitpZGxlX2xvb3BfZ3NmaWZvOgorCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQoraWRsZV9sb29wX2dzZmlmb19pbl9zY3NpX21vZGU6CisJdGVzdAlMUUlTVEFUMiwgTFFJR1NBVkFJTCBqeiByZXR1cm47CisJLyoKKwkgKiBXZSBoYXZlIHJlY2VpdmVkIGdvb2Qgc3RhdHVzIGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgVGhlcmUgbWF5CisJICogc3RpbGwgYmUgZGF0YSBpbiBvdXIgRklGT3MgZHJhaW5pbmcgdG8gdGhlIGhvc3QuICBDb21wbGV0ZQorCSAqIHRoZSBTQ0Igb25seSBpZiBhbGwgZGF0YSBoYXMgdHJhbnNmZXJyZWQgdG8gdGhlIGhvc3QuCisJICovCitnb29kX3N0YXR1c19JVV9kb25lOgorCWJtb3YJU0NCUFRSLCBHU0ZJRk8sIDI7CisJY2xyCVNDQl9TQ1NJX1NUQVRVUzsKKwkvKgorCSAqIElmIGEgY29tbWFuZCBjb21wbGV0ZWQgYmVmb3JlIGFuIGF0dGVtcHRlZCB0YXNrIG1hbmFnZW1lbnQKKwkgKiBmdW5jdGlvbiBjb21wbGV0ZWQsIG5vdGlmeSB0aGUgaG9zdCBhZnRlciBkaXNhYmxpbmcgYW55CisJICogcGVuZGluZyBzZWxlY3Qtb3V0cy4KKwkgKi8KKwl0ZXN0CVNDQl9UQVNLX01BTkFHRU1FTlQsIDB4RkYganogZ3NmaWZvX2NvbXBsZXRlX25vcm1hbGx5OworCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxJTkdPIGpueiAuICsgMjsKKwlhbmQJU0NTSVNFUTAsIH5FTlNFTE87CisJU0VUX1NFUUlOVENPREUoVEFTS01HTVRfQ01EX0NNUExUX09LQVkpCitnc2ZpZm9fY29tcGxldGVfbm9ybWFsbHk6CisJb3IJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEOworCisJLyoKKwkgKiBTaW5jZSB0aGlzIHN0YXR1cyBkaWQgbm90IGNvbnN1bWUgYSBGSUZPLCB3ZSBoYXZlIHRvCisJICogYmUgYSBiaXQgbW9yZSBkaWxsaWdlbnQgaW4gaG93IHdlIGNoZWNrIGZvciBGSUZPcyBwZXJ0YWluaW5nCisJICogdG8gdGhpcyB0cmFuc2FjdGlvbi4gIFRoZXJlIGFyZSB0d28gc3RhdGVzIHRoYXQgYSBGSUZPIHN0aWxsCisJICogdHJhbnNmZXJyaW5nIGRhdGEgbWF5IGJlIGluLgorCSAqCisJICogMSkgQ29uZmlndXJlZCBhbmQgZHJhaW5pbmcgdG8gdGhlIGhvc3QsIHdpdGggYSBGSUZPIGhhbmRsZXIuCisJICogMikgUGVuZGluZyBjZmc0ZGF0YSwgZmlmbyBub3QgZW1wdHkuCisJICoKKwkgKiBDYXNlIDEgY2FuIGJlIGRldGVjdGVkIGJ5IG5vdGljaW5nIGEgbm9uLXplcm8gRklGTyBhY3RpdmUKKwkgKiBjb3VudCBpbiB0aGUgU0NCLiAgSW4gdGhpcyBjYXNlLCB3ZSBhbGxvdyB0aGUgcm91dGluZSBzZXJ2aWNpbmcKKwkgKiB0aGUgRklGTyB0byBjb21wbGV0ZSB0aGUgU0NCLgorCSAqIAorCSAqIENhc2UgMiBpbXBsaWVzIGVpdGhlciBhIHBlbmRpbmcgb3IgeWV0IHRvIG9jY3VyIHNhdmUgZGF0YQorCSAqIHBvaW50ZXJzIGZvciB0aGlzIHNhbWUgY29udGV4dCBpbiB0aGUgb3RoZXIgRklGTy4gIFNvLCBpZgorCSAqIHdlIGRldGVjdCBjYXNlIDEsIHdlIHdpbGwgcHJvcGVybHkgZGVmZXIgdGhlIHBvc3Qgb2YgdGhlIFNDQgorCSAqIGFuZCBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC4gIFRoZSBwZW5kaW5nIGNmZzRkYXRhIHdpbGwKKwkgKiBub3RpY2UgdGhhdCBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGNvbXBsZXRlIHRoZSBTQ0IuCisJICovCisJdGVzdAlTQ0JfRklGT19VU0VfQ09VTlQsIDB4RkYgam56IGlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOworCWNhbGwJY29tcGxldGU7CitFTkRfQ1JJVElDQUw7CisJam1wCWlkbGVfbG9vcF9nc2ZpZm9faW5fc2NzaV9tb2RlOworCitpZGxlX2xvb3Bfc2VydmljZV9maWZvczoKKwlTRVRfTU9ERShNX0RGRjAsIE1fREZGMCkKKwl0ZXN0CUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSIGpueiBpZGxlX2xvb3BfbmV4dF9maWZvOworCWNhbGwJbG9uZ2ptcDsKK2lkbGVfbG9vcF9uZXh0X2ZpZm86CisJU0VUX01PREUoTV9ERkYxLCBNX0RGRjEpCisJdGVzdAlMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUiBqeiBsb25nam1wOworcmV0dXJuOgorCXJldDsKKworaWRsZV9sb29wX2NjaGFuOgorCVNFVF9NT0RFKE1fQ0NIQU4sIE1fQ0NIQU4pCisJdGVzdAlRT0ZGX0NUTFNUQSwgSFNfTUFJTEJPWF9BQ1QganoJaHNfbWFpbGJveF9lbXB0eTsKKwlvcglRT0ZGX0NUTFNUQSwgSFNfTUFJTEJPWF9BQ1Q7CisJbW92CUxPQ0FMX0hTX01BSUxCT1gsIEhTX01BSUxCT1g7Citoc19tYWlsYm94X2VtcHR5OgorQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlDQ1NDQkNUTCwgQ0NBUlJFTnxDQ1NDQkVOIGp6IHNjYmRtYV9pZGxlOworCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRElSIGpueiBmZXRjaF9uZXdfc2NiX2lucHJvZzsKKwl0ZXN0CUNDU0NCQ1RMLCBDQ1NDQkRPTkUganogcmV0dXJuOworRU5EX0NSSVRJQ0FMOworCS8qIEZBTExUSFJPVUdIICovCitzY2JkbWFfdG9ob3N0X2RvbmU6CisJdGVzdAlDQ1NDQkNUTCwgQ0NBUlJFTiBqeiBmaWxsX3FvdXRmaWZvX2RtYWRvbmU7CisJLyoKKwkgKiBBbiBTQ0IgaGFzIGJlZW4gc3VjY2VzZnVsbHkgdXBsb2FkZWQgdG8gdGhlIGhvc3QuCisJICogSWYgdGhlIFNDQiB3YXMgdXBsb2FkZWQgZm9yIHNvbWUgcmVhc29uIG90aGVyIHRoYW4KKwkgKiBiYWQgU0NTSSBzdGF0dXMgKGN1cnJlbnRseSBvbmx5IGZvciB1bmRlcnJ1bnMpLCB3ZQorCSAqIHF1ZXVlIHRoZSBTQ0IgZm9yIG5vcm1hbCBjb21wbGV0aW9uLiAgT3RoZXJ3aXNlLCB3ZQorCSAqIHdhaXQgdW50aWwgYW55IHNlbGVjdC1vdXQgYWN0aXZpdHkgaGFzIGhhbHRlZCwgYW5kCisJICogdGhlbiBub3RpZnkgdGhlIGhvc3Qgc28gdGhhdCB0aGUgdHJhbnNhY3Rpb24gY2FuIGJlCisJICogZGVhbHQgd2l0aC4KKwkgKi8KKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywgMHhmZiBqbnogc2NiZG1hX25vdGlmeV9ob3N0OworCWFuZAlDQ1NDQkNUTCwgfihDQ0FSUkVOfENDU0NCRU4pOworCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JfTkVYVF9DT01QTEVURSwgMjsKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKKwlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBTQ0JQVFIsIDIgcmV0Oworc2NiZG1hX25vdGlmeV9ob3N0OgorCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorCXRlc3QJU0NTSVNFUTAsIEVOU0VMTyBqbnogcmV0dXJuOworCXRlc3QJU1NUQVQwLCAoU0VMRE98U0VMSU5HTykgam56IHJldHVybjsKKwlTRVRfTU9ERShNX0NDSEFOLCBNX0NDSEFOKQorCS8qCisJICogUmVtb3ZlIFNDQiBhbmQgbm90aWZ5IGhvc3QuCisJICovCisJYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7CisJYm1vdglDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9ORVhUX0NPTVBMRVRFLCAyOworCVNFVF9TRVFJTlRDT0RFKEJBRF9TQ0JfU1RBVFVTKQorCXJldDsKK2ZpbGxfcW91dGZpZm9fZG1hZG9uZToKKwlhbmQJQ0NTQ0JDVEwsIH4oQ0NBUlJFTnxDQ1NDQkVOKTsKKwljYWxsCXFvdXRmaWZvX3VwZGF0ZWQ7CisJbXZpCUNPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTDsKKwlibW92CVFPVVRGSUZPX05FWFRfQUREUiwgU0NCSEFERFIsIDQ7CisJdGVzdAlRT0ZGX0NUTFNUQSwgU0RTQ0JfUk9MTE9WUiBqeiByZXR1cm47CisJYm1vdglRT1VURklGT19ORVhUX0FERFIsIFNIQVJFRF9EQVRBX0FERFIsIDQ7CisJeG9yCVFPVVRGSUZPX0VOVFJZX1ZBTElEX1RBRywgUU9VVEZJRk9fRU5UUllfVkFMSURfVE9HR0xFIHJldDsKKworcW91dGZpZm9fdXBkYXRlZDoKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZG1hJ2VkCisJICogdG8gdGhlIGhvc3QsIGFsd2F5cyBjb2FsZXNjZS4gIE90aGVyd2lzZSBob25vciB0aGUKKwkgKiBob3N0J3Mgd2lzaGVzLgorCSAqLworCWNtcAlDT01QTEVURV9ETUFfU0NCX0hFQURbMV0sIFNDQl9MSVNUX05VTEwgam5lIGNvYWxlc2NlX2J5X2NvdW50OworCWNtcAlDT01QTEVURV9TQ0JfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqbmUgY29hbGVzY2VfYnlfY291bnQ7CisJdGVzdAlMT0NBTF9IU19NQUlMQk9YLCBFTklOVF9DT0FMRVNDRSBqeiBpc3N1ZV9jbWRjbXBsdDsKKworCS8qCisJICogSWYgd2UgaGF2ZSByZWxhdGl2ZWx5IGZldyBjb21tYW5kcyBvdXRzdGFuZGluZywgZG9uJ3QKKwkgKiBib3RoZXIgd2FpdGluZyBmb3IgYW5vdGhlciBjb21tYW5kIHRvIGNvbXBsZXRlLgorCSAqLworCXRlc3QJQ01EU19QRU5ESU5HWzFdLCAweEZGIGpueiBjb2FsZXNjZV9ieV9jb3VudDsKKwkvKiBBZGQgLTEgc28gdGhhdCBqbmMgbWVhbnMgPD0gbm90IGp1c3QgPCAqLworCWFkZAlBLCAtMSwgSU5UX0NPQUxFU0NJTkdfTUlOQ01EUzsKKwlhZGQJTk9ORSwgQSwgQ01EU19QRU5ESU5HOworCWpuYwlpc3N1ZV9jbWRjbXBsdDsKKwkKKwkvKgorCSAqIElmIGNvYWxlc2NpbmcsIG9ubHkgY29hbGVzY2UgdXAgdG8gdGhlIGxpbWl0CisJICogcHJvdmlkZWQgYnkgdGhlIGhvc3QgZHJpdmVyLgorCSAqLworY29hbGVzY2VfYnlfY291bnQ6CisJbW92CUEsIElOVF9DT0FMRVNDSU5HX01BWENNRFM7CisJYWRkCU5PTkUsIEEsIElOVF9DT0FMRVNDSU5HX0NNRENPVU5UOworCWpjCWlzc3VlX2NtZGNtcGx0OworCS8qCisJICogSWYgdGhlIHRpbWVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLAorCSAqIGZpcmUgaXQgdXAuCisJICovCisJdGVzdAlJTlRDVEwsIFNXVE1JTlRNQVNLIGp6IHJldHVybjsKKwlibW92CVNXVElNRVIsIElOVF9DT0FMRVNDSU5HX1RJTUVSLCAyOworCW12aQlDTFJTRVFJTlRTVEFULCBDTFJTRVFfU1dUTVJUTzsKKwlvcglJTlRDVEwsIFNXVE1JTlRFTnxTV1RJTUVSX1NUQVJUOworCWFuZAlJTlRDVEwsIH5TV1RNSU5UTUFTSyByZXQ7CisKK2lzc3VlX2NtZGNtcGx0OgorCW12aQlJTlRTVEFULCBDTURDTVBMVDsKKwljbHIJSU5UX0NPQUxFU0NJTkdfQ01EQ09VTlQ7CisJb3IJSU5UQ1RMLCBTV1RNSU5UTUFTSyByZXQ7CisKK0JFR0lOX0NSSVRJQ0FMOworZmV0Y2hfbmV3X3NjYl9pbnByb2c6CisJdGVzdAlDQ1NDQkNUTCwgQVJSRE9ORSBqeiByZXR1cm47CitmZXRjaF9uZXdfc2NiX2RvbmU6CisJYW5kCUNDU0NCQ1RMLCB+KENDQVJSRU58Q0NTQ0JFTik7CisJYm1vdglSRUcwLCBTQ0JQVFIsIDI7CisJY2xyCUE7CisJYWRkCUNNRFNfUEVORElORywgMTsKKwlhZGMJQ01EU19QRU5ESU5HWzFdLCBBOworCWlmICgoYWhkLT5idWdzICYgQUhEX1BLVF9MVU5fQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqICJTaG9ydCBMdW5zIiBhcmUgbm90IHBsYWNlZCBpbnRvIG91dGdvaW5nIExRCisJCSAqIHBhY2tldHMgaW4gdGhlIGNvcnJlY3QgYnl0ZSBvcmRlci4gIFVzZSBhIGZ1bGwKKwkJICogc2l6ZWQgbHVuIGZpZWxkIGluc3RlYWQgYW5kIGZpbGwgaXQgd2l0aCB0aGUKKwkJICogb25lIGJ5dGUgb2YgbHVuIGluZm9ybWF0aW9uIHdlIHN1cHBvcnQuCisJCSAqLworCQltb3YJU0NCX1BLVF9MVU5bNl0sIFNDQl9MVU47CisJfQorCS8qCisJICogVGhlIEZJRk8gdXNlIGNvdW50IGZpZWxkIGlzIHNoYXJlZCB3aXRoIHRoZQorCSAqIHRhZyBzZXQgYnkgdGhlIGhvc3Qgc28gdGhhdCBvdXIgU0NCIGRtYSBlbmdpbmUKKwkgKiBrbm93cyB0aGUgY29ycmVjdCBsb2NhdGlvbiB0byBzdG9yZSB0aGUgU0NCLgorCSAqIFNldCBpdCB0byB6ZXJvIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBTQ0IuCisJICovCisJY2xyCVNDQl9GSUZPX1VTRV9DT1VOVDsKKwkvKiBVcGRhdGUgdGhlIG5leHQgU0NCIGFkZHJlc3MgdG8gZG93bmxvYWQuICovCisJYm1vdglORVhUX1FVRVVFRF9TQ0JfQUREUiwgU0NCX05FWFRfU0NCX0JVU0FERFIsIDQ7CisJbXZpCVNDQl9ORVhUWzFdLCBTQ0JfTElTVF9OVUxMOworCW12aQlTQ0JfTkVYVDJbMV0sIFNDQl9MSVNUX05VTEw7CisJLyogSW5jcmVtZW50IG91ciBwb3NpdGlvbiBpbiB0aGUgUUlORklGTy4gKi8KKwltb3YJTk9ORSwgU05TQ0JfUU9GRjsKKwkvKgorCSAqIFNDQnMgdGhhdCB3YW50IHRvIHNlbmQgbWVzc2FnZXMgYXJlIGFsd2F5cworCSAqIHF1ZXVlZCBpbmRlcGVuZGVudGx5LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhleQorCSAqIGFyZSBhdCB0aGUgaGVhZCBvZiB0aGUgU0NCIGxpc3QgdG8gc2VsZWN0IG91dAorCSAqIHRvIGEgdGFyZ2V0IGFuZCB3ZSB3aWxsIHNlZSB0aGUgTUtfTUVTU0FHRSBmbGFnLgorCSAqLworCXRlc3QJU0NCX0NPTlRST0wsIE1LX01FU1NBR0Ugam56IGZpcnN0X25ld190YXJnZXRfc2NiOworCXNocglTSU5ERVgsIDMsIFNDQl9TQ1NJSUQ7CisJYW5kCVNJTkRFWCwgfjB4MTsKKwltdmkJU0lOREVYWzFdLCAoV0FJVElOR19TQ0JfVEFJTFMgPj4gOCk7CisJYm1vdglESU5ERVgsIFNJTkRFWCwgMjsKKwlibW92CVNDQlBUUiwgU0lORElSLCAyOworCWJtb3YJRElORElSLCBSRUcwLCAyOworCWNtcAlTQ0JQVFJbMV0sIFNDQl9MSVNUX05VTEwgamUgZmlyc3RfbmV3X3RhcmdldF9zY2I7CisJYm1vdglTQ0JfTkVYVCwgUkVHMCwgMiByZXQ7CitmaXJzdF9uZXdfdGFyZ2V0X3NjYjoKKwljbXAJV0FJVElOR19USURfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqZSBmaXJzdF9uZXdfc2NiOworCWJtb3YJU0NCUFRSLCBXQUlUSU5HX1RJRF9UQUlMLCAyOworCWJtb3YJU0NCX05FWFQyLCBSRUcwLCAyOworCWJtb3YJV0FJVElOR19USURfVEFJTCwgUkVHMCwgMiByZXQ7CitmaXJzdF9uZXdfc2NiOgorCWJtb3YJV0FJVElOR19USURfSEVBRCwgUkVHMCwgMjsKKwlibW92CVdBSVRJTkdfVElEX1RBSUwsIFJFRzAsIDIgcmV0OworRU5EX0NSSVRJQ0FMOworCitzY2JkbWFfaWRsZToKKwkvKgorCSAqIEdpdmUgcHJlY2VkZW5jZSB0byBkb3dubG9hZGluZyBuZXcgU0NCcyB0byBleGVjdXRlCisJICogdW5sZXNzIHNlbGVjdC1vdXRzIGFyZSBjdXJyZW50bHkgZnJvemVuLgorCSAqLworCXRlc3QJU0VRX0ZMQUdTMiwgU0VMRUNUT1VUX1FGUk9aRU4gam56IC4gKyAyOworQkVHSU5fQ1JJVElDQUw7CisJdGVzdAlRT0ZGX0NUTFNUQSwgTkVXX1NDQl9BVkFJTCBqbnogZmV0Y2hfbmV3X3NjYjsKKwljbXAJQ09NUExFVEVfRE1BX1NDQl9IRUFEWzFdLCBTQ0JfTElTVF9OVUxMIGpuZSBkbWFfY29tcGxldGVfc2NiOworCWNtcAlDT01QTEVURV9TQ0JfSEVBRFsxXSwgU0NCX0xJU1RfTlVMTCBqZSByZXR1cm47CisJLyogRkFMTFRIUk9VR0ggKi8KK2ZpbGxfcW91dGZpZm86CisJLyoKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBTQ0JzIHdlIGFyZSBkbWFpbmcganVzdAorCSAqIGluIGNhc2UgdGhlIERNQSBmYWlscyBvciBpcyBhYm9ydGVkLgorCSAqLworCW1vdglBLCBRT1VURklGT19FTlRSWV9WQUxJRF9UQUc7CisJYm1vdglDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQsIENPTVBMRVRFX1NDQl9IRUFELCAyOworCW12aQlDQ1NDQkNUTCwgQ0NTQ0JSRVNFVDsKKwlibW92CVNDQkhBRERSLCBRT1VURklGT19ORVhUX0FERFIsIDQ7CisJYm1vdglTQ0JQVFIsIENPTVBMRVRFX1NDQl9IRUFELCAyOworZmlsbF9xb3V0Zmlmb19sb29wOgorCW1vdglDQ1NDQlJBTSwgU0NCUFRSOworCW9yCUNDU0NCUkFNLCBBLCBTQ0JQVFJbMV07CisJbW92CU5PTkUsIFNEU0NCX1FPRkY7CisJaW5jCUlOVF9DT0FMRVNDSU5HX0NNRENPVU5UOworCWFkZAlDTURTX1BFTkRJTkcsIC0xOworCWFkYwlDTURTX1BFTkRJTkdbMV0sIC0xOworCWNtcAlTQ0JfTkVYVF9DT01QTEVURVsxXSwgU0NCX0xJU1RfTlVMTCBqZSBmaWxsX3FvdXRmaWZvX2RvbmU7CisJY21wCUNDU0NCQUREUiwgQ0NTQ0JBRERSX01BWCBqZSBmaWxsX3FvdXRmaWZvX2RvbmU7CisJdGVzdAlRT0ZGX0NUTFNUQSwgU0RTQ0JfUk9MTE9WUiBqbnogZmlsbF9xb3V0Zmlmb19kb25lOworCWJtb3YJU0NCUFRSLCBTQ0JfTkVYVF9DT01QTEVURSwgMjsKKwlqbXAJZmlsbF9xb3V0Zmlmb19sb29wOworZmlsbF9xb3V0Zmlmb19kb25lOgorCW1vdglTQ0JIQ05ULCBDQ1NDQkFERFI7CisJbXZpCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJYm1vdglDT01QTEVURV9TQ0JfSEVBRCwgU0NCX05FWFRfQ09NUExFVEUsIDI7CisJbXZpCVNDQl9ORVhUX0NPTVBMRVRFWzFdLCBTQ0JfTElTVF9OVUxMIHJldDsKKworZmV0Y2hfbmV3X3NjYjoKKwlibW92CVNDQkhBRERSLCBORVhUX1FVRVVFRF9TQ0JfQUREUiwgNDsKKwltdmkJQ0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSfENDU0NCUkVTRVQgam1wIGRtYV9zY2I7CitkbWFfY29tcGxldGVfc2NiOgorCWJtb3YJU0NCUFRSLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIDI7CisJYm1vdglTQ0JIQUREUiwgU0NCX0JVU0FERFIsIDQ7CisJbXZpCUNDQVJSRU58Q0NTQ0JFTnxDQ1NDQlJFU0VUIGptcCBkbWFfc2NiOworRU5EX0NSSVRJQ0FMOworCisvKgorICogRWl0aGVyIHBvc3Qgb3IgZmV0Y2ggYW4gU0NCIGZyb20gaG9zdCBtZW1vcnkuICBUaGUgY2FsbGVyCisgKiBpcyByZXNwb25zaWJsZSBmb3IgcG9sbGluZyBmb3IgdHJhbnNmZXIgY29tcGxldGlvbi4KKyAqCisgKiBQcmVyZXF1aXNpdHM6IE1vZGUgPT0gTV9DQ0hBTgorICoJCSBTSU5ERVggY29udGFpbnMgQ0NTQ0JDVEwgZmxhZ3MKKyAqCQkgU0NCSEFERFIgc2V0IHRvIEhvc3QgU0NCIGFkZHJlc3MKKyAqCQkgU0NCUFRSIHNldCB0byBTQ0Igc3JjIGxvY2F0aW9uIG9uICJwdXNoIiBvcGVyYXRpb25zCisgKi8KK1NFVF9TUkNfTU9ERQlNX0NDSEFOOworU0VUX0RTVF9NT0RFCU1fQ0NIQU47CitkbWFfc2NiOgorCW12aQlTQ0JIQ05ULCBTQ0JfVFJBTlNGRVJfU0laRTsKKwltb3YJQ0NTQ0JDVEwsIFNJTkRFWCByZXQ7CisKK0JFR0lOX0NSSVRJQ0FMOworc2V0am1wOgorCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMiByZXQ7CitzZXRqbXBfaW5saW5lOgorCWJtb3YJTE9OR0pNUF9BRERSLCBTVEFDSywgMjsKK2xvbmdqbXA6CisJYm1vdglTVEFDSywgTE9OR0pNUF9BRERSLCAyIHJldDsKK0VORF9DUklUSUNBTDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBDaGlwIEJ1ZyBXb3JrIEFyb3VuZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNdXN0IGRpc2FibGUgaW50ZXJydXB0cyB3aGVuIHNldHRpbmcgdGhlIG1vZGUgcG9pbnRlcgorICogcmVnaXN0ZXIgYXMgYW4gaW50ZXJydXB0IG9jY3VycmluZyBtaWQgdXBkYXRlIHdpbGwKKyAqIGZhaWwgdG8gc3RvcmUgdGhlIG5ldyBtb2RlIHZhbHVlIGZvciByZXN0b3JhdGlvbiBvbgorICogYW4gaXJldC4KKyAqLworaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VUX01PREVfQlVHKSAhPSAwKSB7CitzZXRfbW9kZV93b3JrX2Fyb3VuZDoKKwltdmkJU0VRSU5UQ1RMLCBJTlRWRUMxRFNMOworCW1vdglNT0RFX1BUUiwgU0lOREVYOworCWNscglTRVFJTlRDVEwgcmV0OworCit0b2dnbGVfZGZmX21vZGVfd29ya19hcm91bmQ6CisJbXZpCVNFUUlOVENUTCwgSU5UVkVDMURTTDsKKwl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOworCWNscglTRVFJTlRDVEwgcmV0OworfQorCisKK2lmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsKK3NldF9zZXFpbnRfd29ya19hcm91bmQ6CisJbW92CVNFUUlOVENPREUsIFNJTkRFWDsKKwltdmkJU0VRSU5UQ09ERSwgTk9fU0VRSU5UIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBQYWNrZXRpemVkIExvbmdKbXAgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NFVF9TUkNfTU9ERQlNX1NDU0k7CitTRVRfRFNUX01PREUJTV9TQ1NJOworc3RhcnRfc2VsZWN0aW9uOgorQkVHSU5fQ1JJVElDQUw7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfU0VOVF9TQ0JfVVBEQVRFX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBSYXpvciAjNDk0CisJCSAqIFJldiBBIGhhcmR3YXJlIGZhaWxzIHRvIHVwZGF0ZSBMQVNUL0NVUlIvTkVYVFNDQgorCQkgKiBjb3JyZWN0bHkgYWZ0ZXIgYSBwYWNrZXRpemVkIHNlbGVjdGlvbiBpbiBzZXZlcmFsCisJCSAqIHNpdHVhdGlvbnM6CisJCSAqCisJCSAqIDEpIElmIG9ubHkgb25lIGNvbW1hbmQgZXhpc3RlZCBpbiB0aGUgcXVldWUsIHRoZQorCQkgKiAgICBMQVNUL0NVUlIvTkVYVFNDQiBhcmUgdW5jaGFuZ2VkLgorCQkgKgorCQkgKiAyKSBJbiBhIG5vbiBRQVMsIHByb3RvY29sIGFsbG93ZWQgcGhhc2UgY2hhbmdlLAorCQkgKiAgICB0aGUgcXVldWUgaXMgc2hpZnRlZCAxIHRvbyBmYXIuICBMQVNUU0NCIGlzCisJCSAqICAgIHRoZSBsYXN0IFNDQiB0aGF0IHdhcyBjb3JyZWN0bHkgcHJvY2Vzc2VkLgorCQkgKiAKKwkJICogMykgSW4gdGhlIFFBUyBjYXNlLCBpZiB0aGUgZnVsbCBsaXN0IG9mIGNvbW1hbmRzCisJCSAqICAgIHdhcyBzdWNjZXNzZnVsbHkgc2VudCwgTkVYVFNDQiBpcyBOVUxMIGFuZCBuZWl0aGVyCisJCSAqICAgIENVUlJTQ0Igbm9yIExBU1RTQ0IgY2FuIGJlIHRydXN0ZWQuICBXZSBtdXN0CisJCSAqICAgIG1hbnVhbGx5IHdhbGsgdGhlIGxpc3QgY291bnRpbmcgTUFYQ01EQ05UIGVsZW1lbnRzCisJCSAqICAgIHRvIGZpbmQgdGhlIGxhc3QgU0NCIHRoYXQgd2FzIHNlbnQgY29ycmVjdGx5LgorCQkgKgorCQkgKiBUbyBzaW1wbGlmeSB0aGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW4gU0VMRE8KKwkJICogaGFuZGxpbmcsIHdlIGluaXRpYWxpemUgTEFTVFNDQiBwcmlvciB0byBlbmFibGluZworCQkgKiBzZWxlY3Rpb24gc28gd2UgY2FuIHJlbHkgb24gaXQgZXZlbiBmb3IgY2FzZSAjMSBhYm92ZS4KKwkJICovCisJCWJtb3YJTEFTVFNDQiwgV0FJVElOR19USURfSEVBRCwgMjsKKwl9CisJYm1vdglDVVJSU0NCLCBXQUlUSU5HX1RJRF9IRUFELCAyOworCWJtb3YJU0NCUFRSLCBXQUlUSU5HX1RJRF9IRUFELCAyOworCXNocglTRUxPSUQsIDQsIFNDQl9TQ1NJSUQ7CisJLyoKKwkgKiBJZiB3ZSB3YW50IHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBkZXZpY2UsIGVuc3VyZQorCSAqIHdlIGFyZSBzZWxlY3Rpbmcgd2l0aCBhdG4gaXJyZWdhcmRsZXNzIG9mIG91ciBwYWNrZXRpemVkCisJICogYWdyZWVtZW50LiAgU2luY2UgU1BJNCBvbmx5IGFsbG93cyB0YXJnZXQgcmVzZXQgb3IgUFBSCisJICogbWVzc2FnZXMgaWYgdGhpcyBpcyBhIHBhY2tldGl6ZWQgY29ubmVjdGlvbiwgdGhlIGNoYW5nZQorCSAqIHRvIG91ciBuZWdvdGlhdGlvbiB0YWJsZSBlbnRyeSBmb3IgdGhpcyBzZWxlY3Rpb24gd2lsbAorCSAqIGJlIGNsZWFyZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyBhY3RlZCBvbi4KKwkgKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IC4gKyAzOworCW1vdglORUdPQUREUiwgU0VMT0lEOworCW9yCU5FR0NPTk9QVFMsIEVOQVVUT0FUTk87CisJb3IJU0NTSVNFUTAsIEVOU0VMTyByZXQ7CitFTkRfQ1JJVElDQUw7CisKKy8qCisgKiBBbGxvY2F0ZSBhIEZJRk8gZm9yIGEgbm9uLXBhY2tldGl6ZWQgdHJhbnNhY3Rpb24uCisgKiBJbiBSZXZBIGhhcmR3YXJlLCBib3RoIEZJRk9zIG11c3QgYmUgZnJlZSBiZWZvcmUgd2UKKyAqIGNhbiBhbGxvY2F0ZSBhIEZJRk8gZm9yIGEgbm9uLXBhY2tldGl6ZWQgdHJhbnNhY3Rpb24uCisgKi8KK2FsbG9jYXRlX2ZpZm9fbG9vcDoKKwkvKgorCSAqIERvIHdoYXRldmVyIHdvcmsgaXMgcmVxdWlyZWQgdG8gZnJlZSBhIEZJRk8uCisJICovCisJY2FsbAlpZGxlX2xvb3Bfc2VydmljZV9maWZvczsKKwlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKK2FsbG9jYXRlX2ZpZm86CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfTk9OUEFDS0ZJRk9fQlVHKSAhPSAwKSB7CisJCWFuZAlBLCBGSUZPMEZSRUV8RklGTzFGUkVFLCBERkZTVEFUOworCQljbXAJQSwgRklGTzBGUkVFfEZJRk8xRlJFRSBqbmUgYWxsb2NhdGVfZmlmb19sb29wOworCX0gZWxzZSB7CisJCXRlc3QJREZGU1RBVCwgRklGTzFGUkVFIGpueiBhbGxvY2F0ZV9maWZvMTsKKwkJdGVzdAlERkZTVEFULCBGSUZPMEZSRUUganogYWxsb2NhdGVfZmlmb19sb29wOworCQltdmkJREZGU1RBVCwgQl9DVVJSRklGT18wOworCQlTRVRfTU9ERShNX0RGRjAsIE1fREZGMCkKKwkJYm1vdglTQ0JQVFIsIEFMTE9DRklGT19TQ0JQVFIsIDIgcmV0OworCX0KK1NFVF9TUkNfTU9ERQlNX1NDU0k7CitTRVRfRFNUX01PREUJTV9TQ1NJOworYWxsb2NhdGVfZmlmbzE6CisJbXZpCURGRlNUQVQsIENVUlJGSUZPXzE7CisJU0VUX01PREUoTV9ERkYxLCBNX0RGRjEpCisJYm1vdglTQ0JQVFIsIEFMTE9DRklGT19TQ0JQVFIsIDIgcmV0OworCisvKgorICogV2UgaGF2ZSBiZWVuIHJlc2VsZWN0ZWQgYXMgYW4gaW5pdGlhdG9yCisgKiBvciBzZWxlY3RlZCBhcyBhIHRhcmdldC4KKyAqLworU0VUX1NSQ19NT0RFCU1fU0NTSTsKK1NFVF9EU1RfTU9ERQlNX1NDU0k7CitzZWxlY3RfaW46CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQlVTRlJFRVJFVl9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogVGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgYnVzIGhhcyBub3QKKwkJICogYWxyZWFkeSBnb25lIGZyZWUgcHJpb3IgdG8gY2xlYXJpbmcKKwkJICogYW55IHN0YWxlIGJ1c2ZyZWUgc3RhdHVzLiAgVGhpcyBhdm9pZHMKKwkJICogYSB3aW5kb3cgd2hlcmVieSBhIGJ1c2ZyZWUganVzdCBhZnRlcgorCQkgKiBhIHNlbGVjdGlvbiBjb3VsZCBiZSBtaXNzZWQuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBCU1lJIGp6IC4gKyAyOworCQltdmkJQ0xSU0lOVDEsQ0xSQlVTRlJFRTsKKwkJb3IJU0lNT0RFMSwgRU5CVVNGUkVFOworCX0KKwlvcglTWEZSQ1RMMCwgU1BJT0VOOworCWFuZAlTQVZFRF9TQ1NJSUQsIFNFTElEX01BU0ssIFNFTElEOworCWFuZAlBLCBPSUQsIElPV05JRDsKKwlvcglTQVZFRF9TQ1NJSUQsIEE7CisJbXZpCUNMUlNJTlQwLCBDTFJTRUxESTsKKwlqbXAJSVRsb29wOworCisvKgorICogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQgb3V0LgorICoKKyAqIENsZWFyIFNFTERPLgorICogRGVxdWV1ZSBhbGwgU0NCcyBzZW50IGZyb20gdGhlIHdhaXRpbmcgcXVldWUKKyAqIFJlcXVldWUgYWxsIFNDQnMgKm5vdCogc2VudCB0byB0aGUgdGFpbCBvZiB0aGUgd2FpdGluZyBxdWV1ZQorICogVGFrZSBSYXpvciAjNDk0IGludG8gYWNjb3VudCBmb3IgYWJvdmUuCisgKgorICogSW4gUGFja2V0aXplZCBNb2RlOgorICoJUmV0dXJuIHRvIHRoZSBpZGxlIGxvb3AuICBPdXIgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCB0YWtlCisgKgljYXJlIG9mIGFueSBpbmNvbWluZyBMX1FzLgorICoKKyAqIEluIE5vbi1QYWNrZXRpemUgTW9kZToKKyAqCUNvbnRpbnVlIHRvIG91ciBub3JtYWwgc3RhdGUgbWFjaGluZS4KKyAqLworU0VUX1NSQ19NT0RFCU1fU0NTSTsKK1NFVF9EU1RfTU9ERQlNX1NDU0k7CitzZWxlY3Rfb3V0OgorQkVHSU5fQ1JJVElDQUw7CisJLyogQ2xlYXIgb3V0IGFsbCBTQ0JzIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50LiAqLworCWlmICgoYWhkLT5idWdzICYgQUhEX1NFTlRfU0NCX1VQREFURV9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogRm9yIHBhY2tldGl6ZWQsIHRoZSBMUU8gbWFuYWdlciBjbGVhcnMgRU5TRUxPIG9uCisJCSAqIHRoZSBhc3NlcnRpb24gb2YgU0VMRE8uICBJZiB3ZSBhcmUgbm9uLXBhY2tldGl6ZWQsCisJCSAqIExBU1RTQ0IgYW5kIENVUlJTQ0IgYXJlIGFjY3VyYXRlLgorCQkgKi8KKwkJdGVzdAlTQ1NJU0VRMCwgRU5TRUxPIGpueiB1c2VfbGFzdHNjYjsKKworCQkvKgorCQkgKiBUaGUgdXBkYXRlIGlzIGNvcnJlY3QgZm9yIExRT1NUQVQxIGVycm9ycy4gIEFsbAorCQkgKiBidXQgTFFPQlVTRlJFRSBhcmUgaGFuZGxlZCBieSBrZXJuZWwgaW50ZXJydXB0cy4KKwkJICogSWYgd2Ugc2VlIExRT0JVU0ZSRUUsIHJldHVybiB0byB0aGUgaWRsZSBsb29wLgorCQkgKiBPbmNlIHdlIGFyZSBvdXQgb2YgdGhlIHNlbGVjdF9vdXQgY3JpdGljYWwgc2VjdGlvbiwKKwkJICogdGhlIGtlcm5lbCB3aWxsIGNsZWFudXAgdGhlIExRT0JVU0ZSRUUgYW5kIHdlIHdpbGwKKwkJICogZXZlbnR1YWxseSByZXN0YXJ0IHRoZSBzZWxlY3Rpb24gaWYgYXBwcm9wcmlhdGUuCisJCSAqLworCQl0ZXN0CUxRT1NUQVQxLCBMUU9CVVNGUkVFIGpueiBpZGxlX2xvb3A7CisKKwkJLyoKKwkJICogT24gYSBwaGFzZSBjaGFuZ2Ugb3VzdHNpZGUgb2YgcGFja2V0IGJvdW5kYXJpZXMsCisJCSAqIExBU1RTQ0IgcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIFNDQiBjb250ZXh0CisJCSAqIG9uIHRoZSBidXMuCisJCSAqLworCQl0ZXN0CUxRT1NUQVQyLCBMUU9QSEFDSEdPVVRQS1Qgam56IHVzZV9sYXN0c2NiOworCisJCS8qCisJCSAqIElmIHRoZSBoYXJkd2FyZSBoYXMgdHJhdmVyc2VkIHRoZSB3aG9sZSBsaXN0LCBORVhUU0NCCisJCSAqIHdpbGwgYmUgTlVMTCwgQ1VSUlNDQiBhbmQgTEFTVFNDQiBjYW5ub3QgYmUgdHJ1c3RlZCwKKwkJICogYnV0IE1BWENNRENOVCBpcyBhY2N1cmF0ZS4gIElmIHdlIHN0b3AgcGFydCB3YXkgdGhyb3VnaAorCQkgKiB0aGUgbGlzdCBvciBvbmx5IGhhZCBvbmUgY29tbWFuZCB0byBpc3N1ZSwgTkVYVFNDQlsxXSBpcworCQkgKiBub3QgTlVMTCBhbmQgTEFTVFNDQiBpcyB0aGUgbGFzdCBjb21tYW5kIHRvIGdvIG91dC4KKwkJICovCisJCWNtcAlORVhUU0NCWzFdLCBTQ0JfTElTVF9OVUxMIGpuZSB1c2VfbGFzdHNjYjsKKworCQkvKgorCQkgKiBCcnV0ZSBmb3JjZSB3YWxrLgorCQkgKi8KKwkJYm1vdglTQ0JQVFIsIFdBSVRJTkdfVElEX0hFQUQsIDI7CisJCW12aQlTRVFJTlRDVEwsIElOVFZFQzFEU0w7CisJCW12aQlNT0RFX1BUUiwgTUtfTU9ERShNX0NGRywgTV9DRkcpOworCQltb3YJQSwgTUFYQ01EQ05UOworCQltdmkJTU9ERV9QVFIsIE1LX01PREUoTV9TQ1NJLCBNX1NDU0kpOworCQljbHIJU0VRSU5UQ1RMOworZmluZF9sYXN0c2NiX2xvb3A6CisJCWRlYwlBOworCQl0ZXN0CUEsIDB4RkYganogZm91bmRfbGFzdF9zZW50X3NjYjsKKwkJYm1vdglTQ0JQVFIsIFNDQl9ORVhULCAyOworCQlqbXAJZmluZF9sYXN0c2NiX2xvb3A7Cit1c2VfbGFzdHNjYjoKKwkJYm1vdglTQ0JQVFIsIExBU1RTQ0IsIDI7Citmb3VuZF9sYXN0X3NlbnRfc2NiOgorCQlibW92CUNVUlJTQ0IsIFNDQlBUUiwgMjsKK2N1cnNjYl93d19kb25lOgorCX0gZWxzZSB7CisJCWJtb3YJU0NCUFRSLCBDVVJSU0NCLCAyOworCX0KKworCS8qCisJICogUmVxdWV1ZSBhbnkgU0NCcyBub3Qgc2VudCwgdG8gdGhlIHRhaWwgb2YgdGhlIHdhaXRpbmcgUS4KKwkgKi8KKwljbXAJU0NCX05FWFRbMV0sIFNDQl9MSVNUX05VTEwgamUgc2VsZWN0X291dF9saXN0X2RvbmU7CisKKwkvKgorCSAqIFdlIGtub3cgdGhhdCBuZWl0aGVyIHRoZSBwZXItVElEIGxpc3Qgbm9yIHRoZSBsaXN0IG9mCisJICogVElEcyBpcyBlbXB0eS4gIFVzZSB0aGlzIGtub3dsZWRnZSB0byBvdXIgYWR2YW50YWdlLgorCSAqLworCWJtb3YJUkVHMCwgU0NCX05FWFQsIDI7CisJYm1vdglTQ0JQVFIsIFdBSVRJTkdfVElEX1RBSUwsIDI7CisJYm1vdglTQ0JfTkVYVDIsIFJFRzAsIDI7CisJYm1vdglXQUlUSU5HX1RJRF9UQUlMLCBSRUcwLCAyOworCWptcAlzZWxlY3Rfb3V0X2luY190aWRfcTsKKworc2VsZWN0X291dF9saXN0X2RvbmU6CisJLyoKKwkgKiBUaGUgd2hvbGUgbGlzdCBtYWRlIGl0LiAgSnVzdCBjbGVhciBvdXIgVElEJ3MgdGFpbCBwb2ludGVyCisJICogdW5sZXNzIHdlIHdlcmUgcXVldWVkIGluZGVwZW5kZW50bHkgZHVlIHRvIG91ciBuZWVkIHRvCisJICogc2VuZCBhIG1lc3NhZ2UuCisJICovCisJdGVzdAlTQ0JfQ09OVFJPTCwgTUtfTUVTU0FHRSBqbnogc2VsZWN0X291dF9pbmNfdGlkX3E7CisJc2hyCURJTkRFWCwgMywgU0NCX1NDU0lJRDsKKwlvcglESU5ERVgsIDE7CS8qIFdhbnQgb25seSB0aGUgc2Vjb25kIGJ5dGUgKi8KKwltdmkJRElOREVYWzFdLCAoKFdBSVRJTkdfU0NCX1RBSUxTKSA+PiA4KTsKKwltdmkJRElORElSLCBTQ0JfTElTVF9OVUxMOworc2VsZWN0X291dF9pbmNfdGlkX3E6CisJYm1vdglTQ0JQVFIsIFdBSVRJTkdfVElEX0hFQUQsIDI7CisJYm1vdglXQUlUSU5HX1RJRF9IRUFELCBTQ0JfTkVYVDIsIDI7CisJY21wCVdBSVRJTkdfVElEX0hFQURbMV0sIFNDQl9MSVNUX05VTEwgam5lIC4gKyAyOworCW12aQlXQUlUSU5HX1RJRF9UQUlMWzFdLCBTQ0JfTElTVF9OVUxMOworCWJtb3YJU0NCUFRSLCBDVVJSU0NCLCAyOworCW12aQlDTFJTSU5UMCwgQ0xSU0VMRE87CisJdGVzdAlMUU9TVEFUMiwgTFFPUEhBQ0hHT1VUUEtUIGpueiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwl0ZXN0CUxRT1NUQVQxLCBMUU9QSEFDSEdJTlBLVCBqbnogdW5leHBlY3RlZF9ub25wa3RfcGhhc2U7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwYWNrZXRpemVkIGNvbm5lY3Rpb24sIHJldHVybiB0byBvdXIKKwkgKiBpZGxlX2xvb3AgYW5kIGxldCBvdXIgaW50ZXJydXB0IGhhbmRsZXIgZGVhbCB3aXRoCisJICogYW55IGNvbm5lY3Rpb24gc2V0dXAvdGVhcmRvd24gaXNzdWVzLiAgVGhlIG9ubHkKKwkgKiBleGNlcHRpb25zIGFyZSB0aGUgY2FzZSBvZiBNS19NRVNTQUdFIGFuZCB0YXNrIG1hbmFnZW1lbnQKKwkgKiBTQ0JzLgorCSAqLworCWlmICgoYWhkLT5idWdzICYgQUhEX0xRT19BVE5PX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBJbiB0aGUgQSwgdGhlIExRTyBtYW5hZ2VyIHRyYW5zaXRpb25zIHRvIExRT1NUT1AwIGV2ZW4gaWYKKwkJICogd2UgaGF2ZSBzZWxlY3RlZCBvdXQgd2l0aCBBVE4gYXNzZXJ0ZWQgYW5kIHRoZSB0YXJnZXQKKwkJICogUkVRcyBpbiBhIG5vbi1wYWNrZXQgcGhhc2UuCisJCSAqLworCQl0ZXN0IAlTQ0JfQ09OVFJPTCwgTUtfTUVTU0FHRSBqeiBzZWxlY3Rfb3V0X25vX21lc3NhZ2U7CisJCXRlc3QJU0NTSVNJR08sIEFUTk8gam56IHNlbGVjdF9vdXRfbm9uX3BhY2tldGl6ZWQ7CitzZWxlY3Rfb3V0X25vX21lc3NhZ2U6CisJfQorCXRlc3QJTFFPU1RBVDIsIExRT1NUT1AwIGp6IHNlbGVjdF9vdXRfbm9uX3BhY2tldGl6ZWQ7CisJdGVzdAlTQ0JfVEFTS19NQU5BR0VNRU5ULCAweEZGIGp6IGlkbGVfbG9vcDsKKwlTRVRfU0VRSU5UQ09ERShUQVNLTUdNVF9GVU5DX0NPTVBMRVRFKQorCWptcAlpZGxlX2xvb3A7CisKK3NlbGVjdF9vdXRfbm9uX3BhY2tldGl6ZWQ6CisJLyogTm9uIHBhY2tldGl6ZWQgcmVxdWVzdC4gKi8KKwlhbmQgICAgIFNDU0lTRVEwLCB+RU5TRUxPOworCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1cyBoYXMgbm90CisJCSAqIGFscmVhZHkgZ29uZSBmcmVlIHByaW9yIHRvIGNsZWFyaW5nCisJCSAqIGFueSBzdGFsZSBidXNmcmVlIHN0YXR1cy4gIFRoaXMgYXZvaWRzCisJCSAqIGEgd2luZG93IHdoZXJlYnkgYSBidXNmcmVlIGp1c3QgYWZ0ZXIKKwkJICogYSBzZWxlY3Rpb24gY291bGQgYmUgbWlzc2VkLgorCQkgKi8KKwkJdGVzdAlTQ1NJU0lHSSwgQlNZSSBqeiAuICsgMjsKKwkJbXZpCUNMUlNJTlQxLENMUkJVU0ZSRUU7CisJCW9yCVNJTU9ERTEsIEVOQlVTRlJFRTsKKwl9CisJbW92CVNBVkVEX1NDU0lJRCwgU0NCX1NDU0lJRDsKKwltb3YJU0FWRURfTFVOLCBTQ0JfTFVOOworCW12aQlTRVFfRkxBR1MsIE5PX0NEQl9TRU5UOworRU5EX0NSSVRJQ0FMOworCW9yCVNYRlJDVEwwLCBTUElPRU47CisKKwkvKgorCSAqIEFzIHNvb24gYXMgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCBzZWxlY3Rpb24sIHRoZSB0YXJnZXQKKwkgKiBzaG91bGQgZ28gaW50byB0aGUgbWVzc2FnZSBvdXQgcGhhc2Ugc2luY2Ugd2UgaGF2ZSBBVE4KKwkgKiBhc3NlcnRlZC4KKwkgKi8KKwltdmkJTVNHX09VVCwgTVNHX0lERU5USUZZRkxBRzsKKworCS8qCisJICogTWFpbiBsb29wIGZvciBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMuICBXYWl0IGZvciB0aGUKKwkgKiB0YXJnZXQgdG8gYXNzZXJ0IFJFUSBiZWZvcmUgY2hlY2tpbmcgTVNHLCBDL0QgYW5kIEkvTyBmb3IKKwkgKiB0aGUgYnVzIHBoYXNlLgorCSAqLworbWVzZ2luX3BoYXNlbWlzOgorSVRsb29wOgorCWNhbGwJcGhhc2VfbG9jazsKKworCW1vdglBLCBMQVNUUEhBU0U7CisKKwl0ZXN0CUEsIH5QX0RBVEFJTl9EVAlqeiBwX2RhdGE7CisJY21wCUEsUF9DT01NQU5ECWplIHBfY29tbWFuZDsKKwljbXAJQSxQX01FU0dPVVQJamUgcF9tZXNnb3V0OworCWNtcAlBLFBfU1RBVFVTCWplIHBfc3RhdHVzOworCWNtcAlBLFBfTUVTR0lOCWplIHBfbWVzZ2luOworCisJU0VUX1NFUUlOVENPREUoQkFEX1BIQVNFKQorCWptcAlJVGxvb3A7CQkJLyogVHJ5IHJlYWRpbmcgdGhlIGJ1cyBhZ2Fpbi4gKi8KKworLyoKKyAqIENvbW1hbmQgcGhhc2UuICBTZXQgdXAgdGhlIERNQSByZWdpc3RlcnMgYW5kIGxldCAnZXIgcmlwLgorICovCitwX2NvbW1hbmQ6CisJdGVzdAlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEIGp6IHBfY29tbWFuZF9va2F5OworCVNFVF9TRVFJTlRDT0RFKFBST1RPX1ZJT0xBVElPTikKK3BfY29tbWFuZF9va2F5OgorCXRlc3QJTU9ERV9QVFIsIH4oTUtfTU9ERShNX0RGRjEsIE1fREZGMSkpCisJCWpueiBwX2NvbW1hbmRfYWxsb2NhdGVfZmlmbzsKKwkvKgorCSAqIENvbW1hbmQgcmV0cnkuICBGcmVlIG91ciBjdXJyZW50IEZJRk8gYW5kCisJICogcmUtYWxsb2NhdGUgYSBGSUZPIHNvIHRyYW5zZmVyIHN0YXRlIGlzCisJICogcmVzZXQuCisJICovCitTRVRfU1JDX01PREUJTV9ERkYxOworU0VUX0RTVF9NT0RFCU1fREZGMTsKKwltdmkJREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorcF9jb21tYW5kX2FsbG9jYXRlX2ZpZm86CisJYm1vdglBTExPQ0ZJRk9fU0NCUFRSLCBTQ0JQVFIsIDI7CisJY2FsbAlhbGxvY2F0ZV9maWZvOworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7CisJYWRkCU5PTkUsIC0xNywgU0NCX0NEQl9MRU47CisJam5jCXBfY29tbWFuZF9lbWJlZGRlZDsKK3BfY29tbWFuZF9mcm9tX2hvc3Q6CisJYm1vdglIQUREUlswXSwgU0NCX0hPU1RfQ0RCX1BUUiwgOTsKKwltdmkJU0dfQ0FDSEVfUFJFLCBMQVNUX1NFRzsKKwltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOKTsKKwlqbXAJcF9jb21tYW5kX3hmZXI7CitwX2NvbW1hbmRfZW1iZWRkZWQ6CisJYm1vdglTSENOVFswXSwgU0NCX0NEQl9MRU4sICAxOworCWJtb3YJREZEQVQsIFNDQl9DREJfU1RPUkUsIDE2OyAKKwltdmkJREZDTlRSTCwgU0NTSUVOOworcF9jb21tYW5kX3hmZXI6CisJYW5kCVNFUV9GTEFHUywgfk5PX0NEQl9TRU5UOworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9GQVNUX0NEQl9ERUxJVkVSWSkgIT0gMCkgeworCQkvKgorCQkgKiBUbyBzcGVlZCB1cCBDREIgZGVsaXZlcnkgaW4gUmV2IEIsIGFsbCBDREIgYWNrcworCQkgKiBhcmUgInJlbGVhc2VkIiB0byB0aGUgb3V0cHV0IHN5bmMgYXMgc29vbiBhcyB0aGUKKwkJICogY29tbWFuZCBwaGFzZSBzdGFydHMuICBUaGVyZSBpcyBvbmx5IG9uZSBwcm9ibGVtCisJCSAqIHdpdGggdGhpcyBhcHByb2FjaC4gIElmIHRoZSB0YXJnZXQgY2hhbmdlcyBwaGFzZQorCQkgKiBiZWZvcmUgYWxsIGRhdGEgYXJlIHNlbnQsIHdlIGhhdmUgbGVmdCBvdmVyIGFja3MKKwkJICogdGhhdCBjYW4gZ28gb3V0IG9uIHRoZSBidXMgaW4gYSBkYXRhIHBoYXNlLiAgRHVlCisJCSAqIHRvIG90aGVyIGNoaXAgY29udHJhaW50cywgdGhpcyBvbmx5IGhhcHBlbnMgaWYKKwkJICogdGhlIHRhcmdldCBnb2VzIHRvIGRhdGEtaW4sIGJ1dCBpZiB0aGUgYWNrcyBnbworCQkgKiBvdXQgYmVmb3JlIHdlIGNhbiB0ZXN0IFNET05FLCB3ZSdsbCB0aGluayB0aGF0CisJCSAqIHRoZSB0cmFuc2ZlciBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gIFdvcmsKKwkJICogYXJvdW5kIHRoaXMgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgNDAwbnMgb3IKKwkJICogODAwbnMgZGVhZCB0aW1lIGJldHdlZW4gY29tbWFuZCBwaGFzZSBhbmQgdGhlIFJFUQorCQkgKiBvZiB0aGUgbmV3IHBoYXNlLiAgSWYgdGhlIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQKKwkJICogc3VjY2Vzc2Z1bGx5LCBTQ1NJRU4gc2hvdWxkIGZhbGwgKmxvbmcqIGJlZm9yZSB3ZQorCQkgKiBzZWUgYSBwaGFzZSBjaGFuZ2UuICBXZSB0aHVzIHRyZWF0IGFueSBwaGFzZW1pc3MKKwkJICogdGhhdCBvY2N1cnMgYmVmb3JlIFNDU0lFTiBmYWxscyBhcyBhbiBpbmNvbXBsZXRlCisJCSAqIHRyYW5zZmVyLgorCQkgKi8KKwkJdGVzdAlTU1RBVDEsIFBIQVNFTUlTIGpueiBwX2NvbW1hbmRfeGZlcl9mYWlsZWQ7CisJCXRlc3QJREZDTlRSTCwgU0NTSUVOIGpueiAuIC0gMTsKKwl9IGVsc2UgeworCQl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqbnogLjsKKwl9CisJLyoKKwkgKiBETUEgQ2hhbm5lbCBhdXRvbWF0aWNhbGx5IGRpc2FibGVkLgorCSAqIERvbid0IGFsbG93IGEgZGF0YSBwaGFzZSBpZiB0aGUgY29tbWFuZAorCSAqIHdhcyBub3QgZnVsbHkgdHJhbnNmZXJyZWQuCisJICovCisJdGVzdAlTU1RBVDIsIFNET05FIGpueiBJVGxvb3A7CitwX2NvbW1hbmRfeGZlcl9mYWlsZWQ6CisJb3IJU0VRX0ZMQUdTLCBOT19DREJfU0VOVDsKKwlqbXAJSVRsb29wOworCisKKy8qCisgKiBTdGF0dXMgcGhhc2UuICBXYWl0IGZvciB0aGUgZGF0YSBieXRlIHRvIGFwcGVhciwgdGhlbiByZWFkIGl0CisgKiBhbmQgc3RvcmUgaXQgaW50byB0aGUgU0NCLgorICovCitTRVRfU1JDX01PREUJTV9TQ1NJOworU0VUX0RTVF9NT0RFCU1fU0NTSTsKK3Bfc3RhdHVzOgorCXRlc3QJU0VRX0ZMQUdTLE5PVF9JREVOVElGSUVEIGpueiBtZXNnaW5fcHJvdG9fdmlvbGF0aW9uOworcF9zdGF0dXNfb2theToKKwltb3YJU0NCX1NDU0lfU1RBVFVTLCBTQ1NJREFUOworCW9yCVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRDsKKwlqbXAJSVRsb29wOworCisvKgorICogTWVzc2FnZSBvdXQgcGhhc2UuICBJZiBNU0dfT1VUIGlzIE1TR19JREVOVElGWUZMQUcsIGJ1aWxkIGEgZnVsbAorICogaW5kZW50aWZ5IG1lc3NhZ2Ugc2VxdWVuY2UgYW5kIHNlbmQgaXQgdG8gdGhlIHRhcmdldC4gIFRoZSBob3N0IG1heQorICogb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBieSBzZXR0aW5nIHRoZSBNS19NRVNTQUdFIGJpdCBpbiB0aGUgU0NCCisgKiBjb250cm9sIGJ5dGUuICBUaGlzIHdpbGwgY2F1c2UgdXMgdG8gaW50ZXJydXB0IHRoZSBob3N0IGFuZCBhbGxvdworICogaXQgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHBoYXNlIGNvbXBsZXRlbHkgb24gaXRzIG93bi4gIElmIHRoZSBiaXQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhcmdldCBpcyBzZXQsIHdlIHdpbGwgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QsCisgKiB0aGVyZWJ5IGFsbG93aW5nIGl0IHRvIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBuZXh0IHNlbGVjdGlvbiByZWdhcmRsZXNzCisgKiBvZiB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgc2VudC4KKyAqIAorICogSWYgTVNHX09VVCBpcyA9PSBIT1NUX01TRywgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QgYW5kIHRha2UgYSBtZXNzYWdlLgorICogVGhpcyBpcyBkb25lIHRvIGFsbG93IHRoZSBob3N0IHRvIHNlbmQgbWVzc2FnZXMgb3V0c2lkZSBvZiBhbiBpZGVudGlmeQorICogc2VxdWVuY2Ugd2hpbGUgcHJvdGVjdGluZyB0aGUgc2VxZW5jZXIgZnJvbSB0ZXN0aW5nIHRoZSBNS19NRVNTQUdFIGJpdAorICogb24gYW4gU0NCIHRoYXQgbWlnaHQgbm90IGJlIGZvciB0aGUgY3VycmVudCBuZXh1cy4gKEZvciBleGFtcGxlLCBhCisgKiBCRFIgbWVzc2FnZSBpbiByZXNwb25jZSB0byBhIGJhZCByZXNlbGVjdGlvbiB3b3VsZCBsZWF2ZSB1cyBwb2ludGVkIHRvCisgKiBhbiBTQ0IgdGhhdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQpLgorICoKKyAqIE90aGVyd2lzZSwgdHJlYXQgTVNHX09VVCBhcyBhIDEgYnl0ZSBtZXNzYWdlIHRvIHNlbmQgKGFib3J0LCBhYm9ydCB0YWcsCisgKiBidXMgZGV2aWNlIHJlc2V0KS4KKyAqCisgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXNzYWdlcyB0byBzZW5kLCBNU0dfT1VUIHNob3VsZCBiZSBzZXQgdG8gTVNHX05PT1AsCisgKiBpbiBjYXNlIHRoZSB0YXJnZXQgZGVjaWRlcyB0byBwdXQgdXMgaW4gdGhpcyBwaGFzZSBmb3Igc29tZSBzdHJhbmdlCisgKiByZWFzb24uCisgKi8KK3BfbWVzZ291dF9yZXRyeToKKwkvKiBUdXJuIG9uIEFUTiBmb3IgdGhlIHJldHJ5ICovCisJbXZpCVNDU0lTSUdPLCBBVE5POworcF9tZXNnb3V0OgorCW1vdglTSU5ERVgsIE1TR19PVVQ7CisJY21wCVNJTkRFWCwgTVNHX0lERU5USUZZRkxBRyBqbmUgcF9tZXNnb3V0X2Zyb21faG9zdDsKKwl0ZXN0CVNDQl9DT05UUk9MLE1LX01FU1NBR0UJam56IGhvc3RfbWVzc2FnZV9sb29wOworcF9tZXNnb3V0X2lkZW50aWZ5OgorCW9yCVNJTkRFWCwgTVNHX0lERU5USUZZRkxBR3xESVNDRU5CLCBTQ0JfTFVOOworCXRlc3QJU0NCX0NPTlRST0wsIERJU0NFTkIgam56IC4gKyAyOworCWFuZAlTSU5ERVgsIH5ESVNDRU5COworLyoKKyAqIFNlbmQgYSB0YWcgbWVzc2FnZSBpZiBUQUdfRU5CIGlzIHNldCBpbiB0aGUgU0NCIGNvbnRyb2wgYmxvY2suCisgKiBVc2UgU0NCX05PTlBBQ0tFVF9UQUcgYXMgdGhlIHRhZyB2YWx1ZS4KKyAqLworcF9tZXNnb3V0X3RhZzoKKwl0ZXN0CVNDQl9DT05UUk9MLFRBR19FTkIganogIHBfbWVzZ291dF9vbmVieXRlOworCW1vdglTQ1NJREFULCBTSU5ERVg7CS8qIFNlbmQgdGhlIGlkZW50aWZ5IG1lc3NhZ2UgKi8KKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwlhbmQJU0NTSURBVCxUQUdfRU5CfFNDQl9UQUdfVFlQRSxTQ0JfQ09OVFJPTDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwltb3YJU0NCUFRSIGptcCBwX21lc2dvdXRfb25lYnl0ZTsKKy8qCisgKiBJbnRlcnJ1cHQgdGhlIGRyaXZlciwgYW5kIGFsbG93IGl0IHRvIGhhbmRsZSB0aGlzIG1lc3NhZ2UKKyAqIHBoYXNlIGFuZCBhbnkgcmVxdWlyZWQgcmV0cmllcy4KKyAqLworcF9tZXNnb3V0X2Zyb21faG9zdDoKKwljbXAJU0lOREVYLCBIT1NUX01TRwlqbmUgcF9tZXNnb3V0X29uZWJ5dGU7CisJam1wCWhvc3RfbWVzc2FnZV9sb29wOworCitwX21lc2dvdXRfb25lYnl0ZToKKwltdmkJQ0xSU0lOVDEsIENMUkFUTk87CisJbW92CVNDU0lEQVQsIFNJTkRFWDsKKworLyoKKyAqIElmIHRoZSBuZXh0IGJ1cyBwaGFzZSBhZnRlciBBVE4gZHJvcHMgaXMgbWVzc2FnZSBvdXQsIGl0IG1lYW5zCisgKiB0aGF0IHRoZSB0YXJnZXQgaXMgcmVxdWVzdGluZyB0aGF0IHRoZSBsYXN0IG1lc3NhZ2UocykgYmUgcmVzZW50LgorICovCisJY2FsbAlwaGFzZV9sb2NrOworCWNtcAlMQVNUUEhBU0UsIFBfTUVTR09VVAlqZSBwX21lc2dvdXRfcmV0cnk7CisKK3BfbWVzZ291dF9kb25lOgorCW12aQlDTFJTSU5UMSxDTFJBVE5POwkvKiBCZSBzdXJlIHRvIHR1cm4gQVROTyBvZmYgKi8KKwltb3YJTEFTVF9NU0csIE1TR19PVVQ7CisJbXZpCU1TR19PVVQsIE1TR19OT09QOwkvKiBObyBtZXNzYWdlIGxlZnQgKi8KKwlqbXAJSVRsb29wOworCisvKgorICogTWVzc2FnZSBpbiBwaGFzZS4gIEJ5dGVzIGFyZSByZWFkIHVzaW5nIEF1dG9tYXRpYyBQSU8gbW9kZS4KKyAqLworcF9tZXNnaW46CisJLyogcmVhZCB0aGUgMXN0IG1lc3NhZ2UgYnl0ZSAqLworCW12aQlBQ0NVTQkJY2FsbCBpbmJfZmlyc3Q7CisKKwl0ZXN0CUEsTVNHX0lERU5USUZZRkxBRwlqbnogbWVzZ2luX2lkZW50aWZ5OworCWNtcAlBLE1TR19ESVNDT05ORUNUCWplIG1lc2dpbl9kaXNjb25uZWN0OworCWNtcAlBLE1TR19TQVZFREFUQVBPSU5URVIJamUgbWVzZ2luX3NkcHRyczsKKwljbXAJQUxMWkVST1MsQQkJamUgbWVzZ2luX2NvbXBsZXRlOworCWNtcAlBLE1TR19SRVNUT1JFUE9JTlRFUlMJamUgbWVzZ2luX3JkcHRyczsKKwljbXAJQSxNU0dfSUdOX1dJREVfUkVTSURVRQlqZSBtZXNnaW5faWduX3dpZGVfcmVzaWR1ZTsKKwljbXAJQSxNU0dfTk9PUAkJamUgbWVzZ2luX2RvbmU7CisKKy8qCisgKiBQdXNoZWQgbWVzc2FnZSBsb29wIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8KKyAqIHJ1biBpdCdzIG93biBtZXNzYWdlIHN0YXRlIGVuZ2luZS4gIFRvIGF2b2lkIGFuCisgKiBleHRyYSBub3AgaW5zdHJ1Y3Rpb24gYWZ0ZXIgc2lnbmFsaW5nIHRoZSBrZXJuZWwsCisgKiB3ZSBwZXJmb3JtIHRoZSBwaGFzZV9sb2NrIGJlZm9yZSBjaGVja2luZyB0byBzZWUKKyAqIGlmIHdlIHNob3VsZCBleGl0IHRoZSBsb29wIGFuZCBza2lwIHRoZSBwaGFzZV9sb2NrCisgKiBpbiB0aGUgSVRsb29wLiAgUGVyZm9ybWluZyBiYWNrIHRvIGJhY2sgcGhhc2VfbG9ja3MKKyAqIHNob3VsZG4ndCBodXJ0LCBidXQgd2h5IGRvIGl0IHR3aWNlLi4uCisgKi8KK2hvc3RfbWVzc2FnZV9sb29wOgorCWNhbGwJcGhhc2VfbG9jazsJLyogQmVuaWduIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICovCisJU0VUX1NFUUlOVENPREUoSE9TVF9NU0dfTE9PUCkKKwljbXAJUkVUVVJOXzEsIEVYSVRfTVNHX0xPT1AJamUgSVRsb29wOworCWNtcAlSRVRVUk5fMSwgQ09OVF9NU0dfTE9PUF9XUklURQlqbmUgLiArIDM7CisJbW92CVNDU0lEQVQsIFJFVFVSTl8yOworCWptcAlob3N0X21lc3NhZ2VfbG9vcDsKKwkvKiBNdXN0IGJlIENPTlRfTVNHX0xPT1BfUkVBRCAqLworCW1vdglOT05FLCBTQ1NJREFUOwkvKiBBQ0sgQnl0ZSAqLworCWptcAlob3N0X21lc3NhZ2VfbG9vcDsKKworbWVzZ2luX2lnbl93aWRlX3Jlc2lkdWU6CisJbW92CVNBVkVEX01PREUsIE1PREVfUFRSOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorCXNocglORUdPQUREUiwgNCwgU0FWRURfU0NTSUlEOworCW1vdglBLCBORUdDT05PUFRTOworCVJFU1RPUkVfTU9ERShTQVZFRF9NT0RFKQorCXRlc3QJQSwgV0lERVhGRVIganogbWVzZ2luX3JlamVjdDsKKwkvKiBQdWxsIHRoZSByZXNpZHVlIGJ5dGUgKi8KKwltdmkJUkVHMAljYWxsIGluYl9uZXh0OworCWNtcAlSRUcwLCAweDAxIGpuZSBtZXNnaW5fcmVqZWN0OworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEwganogLiArIDI7CisJdGVzdAlTQ0JfVEFTS19BVFRSSUJVVEUsIFNDQl9YRkVSTEVOX09ERCBqbnogbWVzZ2luX2RvbmU7CisJU0VUX1NFUUlOVENPREUoSUdOX1dJREVfUkVTKQorCWptcAltZXNnaW5fZG9uZTsKKworbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjoKKwlTRVRfU0VRSU5UQ09ERShQUk9UT19WSU9MQVRJT04pCisJam1wCW1lc2dpbl9kb25lOworbWVzZ2luX3JlamVjdDoKKwltdmkJTVNHX01FU1NBR0VfUkVKRUNUCWNhbGwgbWtfbWVzZzsKK21lc2dpbl9kb25lOgorCW1vdglOT05FLFNDU0lEQVQ7CQkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworCWptcAlJVGxvb3A7CisKKyNkZWZpbmUgSU5ERVhfRElTQ19MSVNUKHNjc2lpZCwgbHVuKQkJCQkJXAorCWFuZAlBLCAweEMwLCBzY3NpaWQ7CQkJCQlcCisJb3IJU0NCUFRSLCBBLCBsdW47CQkJCQkJXAorCWNscglTQ0JQVFJbMV07CQkJCQkJXAorCWFuZAlTSU5ERVgsIDB4MzAsIHNjc2lpZDsJCQkJCVwKKwlzaHIJU0lOREVYLCAzOwkvKiBNdWx0aXBseSBieSAyICovCQkJXAorCWFkZAlTSU5ERVgsIChTQ0JfRElTQ09OTkVDVEVEX0xJU1RTICYgMHhGRik7CQlcCisJbXZpCVNJTkRFWFsxXSwgKChTQ0JfRElTQ09OTkVDVEVEX0xJU1RTID4+IDgpICYgMHhGRikKKworbWVzZ2luX2lkZW50aWZ5OgorCS8qCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB0YXJnZXQgaXMgdXNpbmcgdGFnZ2VkIG9yIG5vbi10YWdnZWQKKwkgKiB0cmFuc2FjdGlvbnMgYnkgZmlyc3QgbG9va2luZyBhdCB0aGUgdHJhbnNhY3Rpb24gc3RvcmVkIGluCisJICogdGhlIHBlci1kZXZpY2UsIGRpc2Nvbm5lY3RlZCBhcnJheS4gIElmIHRoZXJlIGlzIG5vIHVudGFnZ2VkCisJICogdHJhbnNhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0LCB0aGlzIG11c3QgYmUgYSB0YWdnZWQgdHJhbnNhY3Rpb24uCisJICovCisJYW5kCVNBVkVEX0xVTiwgTVNHX0lERU5USUZZX0xVTk1BU0ssIEE7CisJSU5ERVhfRElTQ19MSVNUKFNBVkVEX1NDU0lJRCwgU0FWRURfTFVOKTsKKwlibW92CURJTkRFWCwgU0lOREVYLCAyOworCWJtb3YJUkVHMCwgU0lORElSLCAyOworCWNtcAlSRUcwWzFdLCBTQ0JfTElTVF9OVUxMIGplIHNub29wX3RhZzsKKwkvKiBVbnRhZ2dlZC4gIENsZWFyIHRoZSBidXN5IHRhYmxlIGVudHJ5IGFuZCBzZXR1cCB0aGUgU0NCLiAqLworCWJtb3YJRElORElSLCBBTExPTkVTLCAyOworCWJtb3YJU0NCUFRSLCBSRUcwLCAyOworCWptcAlzZXR1cF9TQ0I7CisKKy8qCisgKiBIZXJlIHdlICJzbm9vcCIgdGhlIGJ1cyBsb29raW5nIGZvciBhIFNJTVBMRSBRVUVVRSBUQUcgbWVzc2FnZS4KKyAqIElmIHdlIGdldCBvbmUsIHdlIHVzZSB0aGUgdGFnIHJldHVybmVkIHRvIGZpbmQgdGhlIHByb3BlcgorICogU0NCLiAgQWZ0ZXIgcmVjZWl2aW5nIHRoZSB0YWcsIGxvb2sgZm9yIHRoZSBTQ0IgYXQgU0NCIGxvY2F0aW9ucyB0YWcgYW5kCisgKiB0YWcgKyAyNTYuCisgKi8KK3Nub29wX3RhZzoKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKSB7CisJCW9yCVNFUV9GTEFHUywgMHg4MDsKKwl9CisJbW92CU5PTkUsIFNDU0lEQVQ7CQkvKiBBQ0sgSWRlbnRpZnkgTVNHICovCisJY2FsbAlwaGFzZV9sb2NrOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDE7CisJfQorCWNtcAlMQVNUUEhBU0UsIFBfTUVTR0lOCWpuZSBub3RfZm91bmRfSVRsb29wOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDI7CisJfQorCWNtcAlTQ1NJQlVTLCBNU0dfU0lNUExFX1FfVEFHIGpuZSBub3RfZm91bmQ7CitnZXRfdGFnOgorCWNscglTQ0JQVFJbMV07CisJbXZpCVNDQlBUUgljYWxsIGluYl9uZXh0OwkvKiB0YWcgdmFsdWUgKi8KK3ZlcmlmeV9zY2I6CisJdGVzdAlTQ0JfQ09OVFJPTCxESVNDT05ORUNURUQganogdmVyaWZ5X290aGVyX3NjYjsKKwltb3YJQSwgU0FWRURfU0NTSUlEOworCWNtcAlTQ0JfU0NTSUlELCBBIGpuZSB2ZXJpZnlfb3RoZXJfc2NiOworCW1vdglBLCBTQVZFRF9MVU47CisJY21wCVNDQl9MVU4sIEEgamUgc2V0dXBfU0NCX2Rpc2Nvbm5lY3RlZDsKK3ZlcmlmeV9vdGhlcl9zY2I6CisJeG9yCVNDQlBUUlsxXSwgMTsKKwl0ZXN0CVNDQlBUUlsxXSwgMHhGRiBqbnogdmVyaWZ5X3NjYjsKKwlqbXAJbm90X2ZvdW5kOworCisvKgorICogRW5zdXJlIHRoYXQgdGhlIFNDQiB0aGUgdGFnIHBvaW50cyB0byBpcyBmb3IKKyAqIGFuIFNDQiB0cmFuc2FjdGlvbiB0byB0aGUgcmVjb25uZWN0aW5nIHRhcmdldC4KKyAqLworc2V0dXBfU0NCOgorCWlmICgoYWhkLT5mbGFncyAmIEFIRF9TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDEwOworCX0KKwl0ZXN0CVNDQl9DT05UUk9MLERJU0NPTk5FQ1RFRCBqeiBub3RfZm91bmQ7CitzZXR1cF9TQ0JfZGlzY29ubmVjdGVkOgorCWFuZAlTQ0JfQ09OVFJPTCx+RElTQ09OTkVDVEVEOworCWNscglTRVFfRkxBR1M7CS8qIG1ha2Ugbm90ZSBvZiBJREVOVElGWSAqLworCXRlc3QJU0NCX1NHUFRSLCBTR19MSVNUX05VTEwgam56IC4gKyAzOworCWJtb3YJQUxMT0NGSUZPX1NDQlBUUiwgU0NCUFRSLCAyOworCWNhbGwJYWxsb2NhdGVfZmlmbzsKKwkvKiBTZWUgaWYgdGhlIGhvc3Qgd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdXBvbiByZWNvbm5lY3Rpb24gKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IG1lc2dpbl9kb25lOworCW12aQlIT1NUX01TRwljYWxsIG1rX21lc2c7CisJam1wCW1lc2dpbl9kb25lOworCitub3RfZm91bmQ6CisJU0VUX1NFUUlOVENPREUoTk9fTUFUQ0gpCisJam1wCW1lc2dpbl9kb25lOworCitub3RfZm91bmRfSVRsb29wOgorCVNFVF9TRVFJTlRDT0RFKE5PX01BVENIKQorCWptcAlJVGxvb3A7CisKKy8qCisgKiBXZSByZWNlaXZlZCBhICJjb21tYW5kIGNvbXBsZXRlIiBtZXNzYWdlLiAgUHV0IHRoZSBTQ0Igb24gdGhlIGNvbXBsZXRlCisgKiBxdWV1ZSBhbmQgdHJpZ2dlciBhIGNvbXBsZXRpb24gaW50ZXJydXB0IHZpYSB0aGUgaWRsZSBsb29wLiAgQmVmb3JlIGRvaW5nCisgKiBzbywgY2hlY2sgdG8gc2VlIGlmIHRoZXJlCisgKiBpcyBhIHJlc2lkdWFsIG9yIHRoZSBzdGF0dXMgYnl0ZSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVEFUVVNfR09PRCAoMCkuCisgKiBJbiBlaXRoZXIgb2YgdGhlc2UgY29uZGl0aW9ucywgd2UgdXBsb2FkIHRoZSBTQ0IgYmFjayB0byB0aGUgaG9zdCBzbyBpdCBjYW4KKyAqIHByb2Nlc3MgdGhpcyBpbmZvcm1hdGlvbi4gIEluIHRoZSBjYXNlIG9mIGEgbm9uIHplcm8gc3RhdHVzIGJ5dGUsIHdlIAorICogYWRkaXRpb25hbGx5IGludGVycnVwdCB0aGUga2VybmVsIGRyaXZlciBzeW5jaHJvbm91c2x5LCBhbGxvd2luZyBpdCB0bworICogZGVjaWRlIGlmIHNlbnNlIHNob3VsZCBiZSByZXRyaWV2ZWQuICBJZiB0aGUga2VybmVsIGRyaXZlciB3aXNoZXMgdG8gcmVxdWVzdAorICogc2Vuc2UsIGl0IHdpbGwgZmlsbCB0aGUga2VybmVsIFNDQiB3aXRoIGEgcmVxdWVzdCBzZW5zZSBjb21tYW5kLCByZXF1ZXVlCisgKiBpdCB0byB0aGUgUUlORklGTyBhbmQgdGVsbCB1cyBub3QgdG8gcG9zdCB0byB0aGUgUU9VVEZJRk8gYnkgc2V0dGluZyAKKyAqIFJFVFVSTl8xIHRvIFNFTkRfU0VOU0UuCisgKi8KK21lc2dpbl9jb21wbGV0ZToKKworCS8qCisJICogSWYgQVROIGlzIHJhaXNlZCwgd2Ugc3RpbGwgd2FudCB0byBnaXZlIHRoZSB0YXJnZXQgYSBtZXNzYWdlLgorCSAqIFBlcmhhcHMgdGhlcmUgd2FzIGEgcGFyaXR5IGVycm9yIG9uIHRoaXMgbGFzdCBtZXNzYWdlIGJ5dGUuCisJICogRWl0aGVyIHdheSwgdGhlIHRhcmdldCBzaG91bGQgdGFrZSB1cyB0byBtZXNzYWdlIG91dCBwaGFzZQorCSAqIGFuZCB0aGVuIGF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGNvbW1hbmQgYWdhaW4uICBXZSBzaG91bGQgdXNlIGEKKwkgKiBjcml0aWNhbCBzZWN0aW9uIGhlcmUgdG8gZ3VhcmQgYWdhaW5zdCBhIHRpbWVvdXQgdHJpZ2dlcmluZworCSAqIGZvciB0aGlzIGNvbW1hbmQgYW5kIHNldHRpbmcgQVROIHdoaWxlIHdlIGFyZSBzdGlsbCBwcm9jZXNzaW5nCisJICogdGhlIGNvbXBsZXRpb24uCisJdGVzdAlTQ1NJU0lHSSwgQVROSSBqbnogbWVzZ2luX2RvbmU7CisJICovCisKKwkvKgorCSAqIElmIHdlIGFyZSBpZGVudGlmaWVkIGFuZCBoYXZlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBDREIsCisJICogYW55IHN0YXR1cyB3aWxsIGRvLiAgT3B0aW1pemUgdGhpcyBmYXN0IHBhdGguCisJICovCisJdGVzdAlTQ0JfQ09OVFJPTCwgU1RBVFVTX1JDVkQganogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQganogY29tcGxldGVfYWNjZXB0ZWQ7CisKKwkvKgorCSAqIElmIHRoZSB0YXJnZXQgbmV2ZXIgc2VudCBhbiBpZGVudGlmeSBtZXNzYWdlIGJ1dCBpbnN0ZWFkIHdlbnQKKwkgKiB0byBtZXNnaW4gdG8gZ2l2ZSBhbiBpbnZhbGlkIG1lc3NhZ2UsIGxldCB0aGUgaG9zdCBhYm9ydCB1cy4KKwkgKi8KKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUQgam56IG1lc2dpbl9wcm90b192aW9sYXRpb247CisKKwkvKgorCSAqIElmIHdlIHJlY2V2aWVkIGdvb2Qgc3RhdHVzIGJ1dCBuZXZlciBzdWNjZXNzZnVsbHkgc2VudCB0aGUKKwkgKiBjZGIsIGFib3J0IHRoZSBjb21tYW5kLgorCSAqLworCXRlc3QJU0NCX1NDU0lfU1RBVFVTLDB4ZmYJam56IGNvbXBsZXRlX2FjY2VwdGVkOworCXRlc3QJU0VRX0ZMQUdTLCBOT19DREJfU0VOVCBqbnogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKK2NvbXBsZXRlX2FjY2VwdGVkOgorCisJLyoKKwkgKiBTZWUgaWYgd2UgYXR0ZW1wdGVkIHRvIGRlbGl2ZXIgYSBtZXNzYWdlIGJ1dCB0aGUgdGFyZ2V0IGluZ25vcmVkIHVzLgorCSAqLworCXRlc3QJU0NCX0NPTlRST0wsIE1LX01FU1NBR0UganogY29tcGxldGVfbm9tc2c7CisJU0VUX1NFUUlOVENPREUoTUtNU0dfRkFJTEVEKQorY29tcGxldGVfbm9tc2c6CisJY2FsbAlxdWV1ZV9zY2JfY29tcGxldGlvbjsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKKworZnJlZXplX3F1ZXVlOgorCS8qIENhbmNlbCBhbnkgcGVuZGluZyBzZWxlY3Qtb3V0LiAqLworCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxJTkdPIGpueiAuICsgMjsKKwlhbmQJU0NTSVNFUTAsIH5FTlNFTE87CisJbW92CUFDQ1VNX1NBVkUsIEE7CisJY2xyCUE7CisJYWRkCVFGUkVFWkVfQ09VTlQsIDE7CisJYWRjCVFGUkVFWkVfQ09VTlRbMV0sIEE7CisJb3IJU0VRX0ZMQUdTMiwgU0VMRUNUT1VUX1FGUk9aRU47CisJbW92CUEsIEFDQ1VNX1NBVkUgcmV0OworCisvKgorICogQ29tcGxldGUgdGhlIGN1cnJlbnQgRklGTydzIFNDQiBpZiBkYXRhIGZvciB0aGlzIHNhbWUKKyAqIFNDQiBpcyBub3QgdHJhbnNmZXJyaW5nIGluIHRoZSBvdGhlciBGSUZPLgorICovCitTRVRfU1JDX01PREUJTV9ERkYxOworU0VUX0RTVF9NT0RFCU1fREZGMTsKK3BrdF9jb21wbGV0ZV9zY2JfaWZfZmlmb3NfaWRsZToKKwlibW92CUFSR18xLCBTQ0JQVFIsIDI7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITjsKKwlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKKwlibW92CVNDQlBUUiwgQVJHXzEsIDI7CisJdGVzdAlTQ0JfRklGT19VU0VfQ09VTlQsIDB4RkYgam56IHJldHVybjsKK3F1ZXVlX3NjYl9jb21wbGV0aW9uOgorCXRlc3QJU0NCX1NDU0lfU1RBVFVTLDB4ZmYJam56IGJhZF9zdGF0dXM7CisJLyoKKwkgKiBDaGVjayBmb3IgcmVzaWR1YWxzCisJICovCisJdGVzdAlTQ0JfU0dQVFIsIFNHX0xJU1RfTlVMTCBqbnogY29tcGxldGU7CS8qIE5vIHhmZXIgKi8KKwl0ZXN0CVNDQl9TR1BUUiwgU0dfRlVMTF9SRVNJRCBqbnogdXBsb2FkX3NjYjsvKiBOZXZlciB4ZmVyZWQgKi8KKwl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUiwgU0dfTElTVF9OVUxMIGp6IHVwbG9hZF9zY2I7Citjb21wbGV0ZToKKwlibW92CVNDQl9ORVhUX0NPTVBMRVRFLCBDT01QTEVURV9TQ0JfSEVBRCwgMjsKKwlibW92CUNPTVBMRVRFX1NDQl9IRUFELCBTQ0JQVFIsIDIgcmV0OworYmFkX3N0YXR1czoKKwljbXAJU0NCX1NDU0lfU1RBVFVTLCBTVEFUVVNfUEtUX1NFTlNFIGplIHVwbG9hZF9zY2I7CisJY2FsbAlmcmVlemVfcXVldWU7Cit1cGxvYWRfc2NiOgorCS8qCisJICogUmVzdG9yZSBTQ0IgVEFHIHNpbmNlIHdlIHJldXNlIHRoaXMgZmllbGQKKwkgKiBpbiB0aGUgc2VxdWVuY2VyLiAgV2UgZG9uJ3Qgd2FudCB0byBjb3JydXB0CisJICogaXQgb24gdGhlIGhvc3QuCisJICovCisJYm1vdglTQ0JfVEFHLCBTQ0JQVFIsIDI7CisJYm1vdglTQ0JfTkVYVF9DT01QTEVURSwgQ09NUExFVEVfRE1BX1NDQl9IRUFELCAyOworCWJtb3YJQ09NUExFVEVfRE1BX1NDQl9IRUFELCBTQ0JQVFIsIDI7CisJb3IJU0NCX1NHUFRSLCBTR19TVEFUVVNfVkFMSUQgcmV0OworCisvKgorICogSXMgaXQgYSBkaXNjb25uZWN0IG1lc3NhZ2U/ICBTZXQgYSBmbGFnIGluIHRoZSBTQ0IgdG8gcmVtaW5kIHVzCisgKiBhbmQgYXdhaXQgdGhlIGJ1cyBnb2luZyBmcmVlLiAgSWYgdGhpcyBpcyBhbiB1bnRhZ2dlZCB0cmFuc2FjdGlvbgorICogc3RvcmUgdGhlIFNDQiBpZCBmb3IgaXQgaW4gb3VyIHVudGFnZ2VkIHRhcmdldCB0YWJsZSBmb3IgbG9va3VwIG9uCisgKiBhIHJlc2VsY3Rpb24uCisgKi8KK21lc2dpbl9kaXNjb25uZWN0OgorCS8qCisJICogSWYgQVROIGlzIHJhaXNlZCwgd2Ugc3RpbGwgd2FudCB0byBnaXZlIHRoZSB0YXJnZXQgYSBtZXNzYWdlLgorCSAqIFBlcmhhcHMgdGhlcmUgd2FzIGEgcGFyaXR5IGVycm9yIG9uIHRoaXMgbGFzdCBtZXNzYWdlIGJ5dGUKKwkgKiBvciB3ZSB3YW50IHRvIGFib3J0IHRoaXMgY29tbWFuZC4gIEVpdGhlciB3YXksIHRoZSB0YXJnZXQKKwkgKiBzaG91bGQgdGFrZSB1cyB0byBtZXNzYWdlIG91dCBwaGFzZSBhbmQgdGhlbiBhdHRlbXB0IHRvCisJICogZGlzY29ubmVjdCBhZ2Fpbi4KKwkgKiBYWFggLSBXYWl0IGZvciBtb3JlIHRlc3RpbmcuCisJdGVzdAlTQ1NJU0lHSSwgQVROSSBqbnogbWVzZ2luX2RvbmU7CisJICovCisJdGVzdAlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UCisJCWpueiBtZXNnaW5fcHJvdG9fdmlvbGF0aW9uOworCW9yCVNDQl9DT05UUk9MLERJU0NPTk5FQ1RFRDsKKwl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CIGpueiBhd2FpdF9idXNmcmVlOworcXVldWVfZGlzY19zY2I6CisJYm1vdglSRUcwLCBTQ0JQVFIsIDI7CisJSU5ERVhfRElTQ19MSVNUKFNBVkVEX1NDU0lJRCwgU0FWRURfTFVOKTsKKwlibW92CURJTkRFWCwgU0lOREVYLCAyOworCWJtb3YJRElORElSLCBSRUcwLCAyOworCWJtb3YJU0NCUFRSLCBSRUcwLCAyOworCS8qIEZBTExUSFJPVUdIICovCithd2FpdF9idXNmcmVlOgorCWFuZAlTSU1PREUxLCB+RU5CVVNGUkVFOworCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSA9PSAwKSB7CisJCS8qCisJCSAqIEluIHRoZSBCVVNGUkVFUkVWX0JVRyBjYXNlLCB0aGUKKwkJICogYnVzZnJlZSBzdGF0dXMgd2FzIGNsZWFyZWQgYXQgdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgY29ubmVjdGlvbi4KKwkJICovCisJCW12aQlDTFJTSU5UMSxDTFJCVVNGUkVFOworCX0KKwltb3YJTk9ORSwgU0NTSURBVDsJCS8qIEFjayB0aGUgbGFzdCBieXRlICovCisJdGVzdAlNT0RFX1BUUiwgfihNS19NT0RFKE1fREZGMSwgTV9ERkYxKSkKKwkJam56IGF3YWl0X2J1c2ZyZWVfbm90X21fZGZmOworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7Cithd2FpdF9idXNmcmVlX2NscmNobjoKKwltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOOworYXdhaXRfYnVzZnJlZV9ub3RfbV9kZmY6CisJY2FsbAljbGVhcl90YXJnZXRfc3RhdGU7CisJdGVzdAlTU1RBVDEsUkVRSU5JVHxCVVNGUkVFCWp6IC47CisJdGVzdAlTU1RBVDEsIEJVU0ZSRUUgam56IGlkbGVfbG9vcDsKKwlTRVRfU0VRSU5UQ09ERShNSVNTRURfQlVTRlJFRSkKKworCisvKgorICogU2F2ZSBkYXRhIHBvaW50ZXJzIG1lc3NhZ2U6CisgKiBDb3B5aW5nIFJBTSB2YWx1ZXMgYmFjayB0byBTQ0IsIGZvciBTYXZlIERhdGEgUG9pbnRlcnMgbWVzc2FnZSwgYnV0CisgKiBvbmx5IGlmIHdlJ3ZlIGFjdHVhbGx5IGJlZW4gaW50byBhIGRhdGEgcGhhc2UgdG8gY2hhbmdlIHRoZW0uICBUaGlzCisgKiBwcm90ZWN0cyBhZ2FpbnN0IGJvZ3VzIGRhdGEgaW4gc2NyYXRjaCByYW0gYW5kIHRoZSByZXNpZHVhbCBjb3VudHMKKyAqIHNpbmNlIHRoZXkgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgd2hlbiB3ZSBnbyBpbnRvIGRhdGFfaW4gb3IgZGF0YV9vdXQuCisgKiBBY2sgdGhlIG1lc3NhZ2UgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAqLworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7CittZXNnaW5fc2RwdHJzOgorCW1vdglOT05FLFNDU0lEQVQ7CQkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworCXRlc3QJU0VRX0ZMQUdTLCBEUEhBU0UJanogSVRsb29wOworCWNhbGwJc2F2ZV9wb2ludGVyczsKKwlqbXAJSVRsb29wOworCitzYXZlX3BvaW50ZXJzOgorCS8qCisJICogSWYgd2UgYXJlIGFza2VkIHRvIHNhdmUgb3VyIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlCisJICogdHJhbnNmZXIsIGp1c3QgbWFyayB1cyBhdCB0aGUgZW5kIHJhdGhlciB0aGFuIHBlcmZvcm0gYQorCSAqIGZ1bGwgc2F2ZS4KKwkgKi8KKwl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfTElTVF9OVUxMIGp6IHNhdmVfcG9pbnRlcnNfZnVsbDsKKwlvcglTQ0JfU0dQVFIsIFNHX0xJU1RfTlVMTCByZXQ7CisKK3NhdmVfcG9pbnRlcnNfZnVsbDoKKwkvKgorCSAqIFRoZSBTQ0JfREFUQVBUUiBiZWNvbWVzIHRoZSBjdXJyZW50IFNIQUREUi4KKwkgKiBBbGwgb3RoZXIgaW5mb3JtYXRpb24gY29tZXMgZGlyZWN0bHkgZnJvbSBvdXIgcmVzaWR1YWwKKwkgKiBzdGF0ZS4KKwkgKi8KKwlibW92CVNDQl9EQVRBUFRSLCBTSEFERFIsIDg7CisJYm1vdglTQ0JfREFUQUNOVCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIDggcmV0OworCisvKgorICogUmVzdG9yZSBwb2ludGVycyBtZXNzYWdlPyAgRGF0YSBwb2ludGVycyBhcmUgcmVjb3BpZWQgZnJvbSB0aGUKKyAqIFNDQiBhbnl0aW1lIHdlIGVudGVyIGEgZGF0YSBwaGFzZSBmb3IgdGhlIGZpcnN0IHRpbWUsIHNvIGFsbAorICogd2UgbmVlZCB0byBkbyBpcyBjbGVhciB0aGUgRFBIQVNFIGZsYWcgYW5kIGxldCB0aGUgZGF0YSBwaGFzZQorICogY29kZSBkbyB0aGUgcmVzdC4gIFdlIGFsc28gcmVzZXQvcmVhbGxvY2F0ZSB0aGUgRklGTyB0byBtYWtlCisgKiBzdXJlIHdlIGhhdmUgYSBjbGVhbiBzdGFydCBmb3IgdGhlIG5leHQgZGF0YSBvciBjb21tYW5kIHBoYXNlLgorICovCittZXNnaW5fcmRwdHJzOgorCWFuZAlTRVFfRkxBR1MsIH5EUEhBU0U7CisJdGVzdAlNT0RFX1BUUiwgfihNS19NT0RFKE1fREZGMSwgTV9ERkYxKSkgam56IG1zZ2luX3JkcHRyc19nZXRfZmlmbzsKKwltdmkJREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorbXNnaW5fcmRwdHJzX2dldF9maWZvOgorCWNhbGwJYWxsb2NhdGVfZmlmbzsKKwlqbXAJbWVzZ2luX2RvbmU7CisKK2NsZWFyX3RhcmdldF9zdGF0ZToKKwltdmkJTEFTVFBIQVNFLCBQX0JVU0ZSRUU7CisJLyogY2xlYXIgdGFyZ2V0IHNwZWNpZmljIGZsYWdzICovCisJbXZpCVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQgcmV0OworCitwaGFzZV9sb2NrOiAgICAgCisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfRUFSTFlfUkVRX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBEb24ndCBpZ25vcmUgcGVyc2lzdGVudCBSRVEgYXNzZXJ0aW9ucyBqdXN0IGJlY2F1c2UKKwkJICogdGhleSB3ZXJlIGFzc2VydGVkIHdpdGhpbiB0aGUgYnVzIHNldHRsZSBkZWxheSB3aW5kb3cuCisJCSAqIFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIGRldmljZXMgbGlrZSB0aGUgR0VNMzE4CisJCSAqIHRoYXQgdmlvbGF0ZSB0aGUgU0NTSSBzcGVjLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvCisJCSAqIGNvdW50IFJFUSB3aGlsZSB3ZSBhcmUgd2FpdGluZyBmb3IgaXQgdG8gZmFsbCBkdXJpbmcKKwkJICogYW4gYXN5bmMgcGhhc2UgZHVlIHRvIG91ciBhc3NlcnRlZCBBQ0suICBFYWNoCisJCSAqIHNlcXVlbmNlciBpbnN0cnVjdGlvbiB0YWtlcyB+MjVucywgc28gdGhlIFJFUSBtdXN0CisJCSAqIGxhc3QgYXQgbGVhc3QgMTAwbnMgaW4gb3JkZXIgdG8gYmUgY291bnRlZCBhcyBhIHRydWUKKwkJICogUkVRLgorCQkgKi8KKwkJdGVzdAlTQ1NJUEhBU0UsIDB4RkYgam56IHBoYXNlX2xvY2tlZDsKKwkJdGVzdAlTQ1NJU0lHSSwgQUNLSSBqbnogcGhhc2VfbG9jazsKKwkJdGVzdAlTQ1NJU0lHSSwgUkVRSSBqeiBwaGFzZV9sb2NrOworCQl0ZXN0CVNDU0lQSEFTRSwgMHhGRiBqbnogcGhhc2VfbG9ja2VkOworCQl0ZXN0CVNDU0lTSUdJLCBBQ0tJIGpueiBwaGFzZV9sb2NrOworCQl0ZXN0CVNDU0lTSUdJLCBSRVFJIGp6IHBoYXNlX2xvY2s7CitwaGFzZV9sb2NrZWQ6CisJfSBlbHNlIHsKKwkJdGVzdAlTQ1NJUEhBU0UsIDB4RkYganogLjsKKwl9CisJdGVzdAlTU1RBVDEsIFNDU0lQRVJSIGpueiBwaGFzZV9sb2NrOworcGhhc2VfbG9ja19sYXRjaF9waGFzZToKKwlhbmQJTEFTVFBIQVNFLCBQSEFTRV9NQVNLLCBTQ1NJU0lHSSByZXQ7CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gcmVhZCBkYXRhIGluIEF1dG9tYXRpYyBQSU8gbW9kZS4KKyAqCisgKiBBbiBBQ0sgaXMgbm90IHNlbnQgb24gaW5wdXQgZnJvbSB0aGUgdGFyZ2V0IHVudGlsIFNDU0lEQVRMIGlzIHJlYWQgZnJvbS4KKyAqIFNvIHdlIHdhaXQgdW50aWwgU0NTSURBVEwgaXMgbGF0Y2hlZCAodGhlIHVzdWFsIHdheSksIHRoZW4gcmVhZCB0aGUgZGF0YQorICogYnl0ZSBkaXJlY3RseSBvZmYgdGhlIGJ1cyB1c2luZyBTQ1NJQlVTTC4gIFdoZW4gd2UgaGF2ZSBwdWxsZWQgdGhlIEFUTgorICogbGluZSwgb3Igd2UganVzdCB3YW50IHRvIGFja25vd2xlZGdlIHRoZSBieXRlLCB0aGVuIHdlIGRvIGEgZHVtbXkgcmVhZAorICogZnJvbSBTQ0lTREFUTC4gIFRoZSBTQ1NJIHNwZWMgZ3VhcmFudGVlcyB0aGF0IHRoZSB0YXJnZXQgd2lsbCBob2xkIHRoZQorICogZGF0YSBieXRlIG9uIHRoZSBidXMgdW50aWwgd2Ugc2VuZCBvdXIgQUNLLgorICoKKyAqIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGVzZSBhcmUgY2FsbGVkIGluIGEgcGFydGljdWxhciBzZXF1ZW5jZSwKKyAqIGFuZCB0aGF0IFJFUSBpcyBhbHJlYWR5IHNldCB3aGVuIGluYl9maXJzdCBpcyBjYWxsZWQuICBpbmJfe2ZpcnN0LG5leHR9CisgKiB1c2UgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFzIGluYi4KKyAqLworaW5iX25leHQ6CisJbW92CU5PTkUsU0NTSURBVDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCitpbmJfbmV4dF93YWl0OgorCS8qCisJICogSWYgdGhlcmUgaXMgYSBwYXJpdHkgZXJyb3IsIHdhaXQgZm9yIHRoZSBrZXJuZWwgdG8KKwkgKiBzZWUgdGhlIGludGVycnVwdCBhbmQgcHJlcGFyZSBvdXIgbWVzc2FnZSByZXNwb25zZQorCSAqIGJlZm9yZSBjb250aW51aW5nLgorCSAqLworCXRlc3QJU0NTSVBIQVNFLCAweEZGIGp6IC47CisJdGVzdAlTU1RBVDEsIFNDU0lQRVJSIGpueiBpbmJfbmV4dF93YWl0OworaW5iX25leHRfY2hlY2tfcGhhc2U6CisJYW5kCUxBU1RQSEFTRSwgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHSU4gam5lIG1lc2dpbl9waGFzZW1pczsKK2luYl9maXJzdDoKKwljbHIJRElOREVYWzFdOworCW1vdglESU5ERVgsU0lOREVYOworCW1vdglESU5ESVIsU0NTSUJVUwlyZXQ7CQkvKnJlYWQgYnl0ZSBkaXJlY3RseSBmcm9tIGJ1cyovCitpbmJfbGFzdDoKKwltb3YJTk9ORSxTQ1NJREFUIHJldDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisKK21rX21lc2c6CisJbXZpCVNDU0lTSUdPLCBBVE5POworCW1vdglNU0dfT1VULFNJTkRFWCByZXQ7CisKK1NFVF9TUkNfTU9ERQlNX0RGRjE7CitTRVRfRFNUX01PREUJTV9ERkYxOworZGlzYWJsZV9jY3NnZW46CisJdGVzdAlTR19TVEFURSwgRkVUQ0hfSU5QUk9HIGp6IGRpc2FibGVfY2NzZ2VuX2ZldGNoX2RvbmU7CisJY2xyCUNDU0dDVEw7CitkaXNhYmxlX2Njc2dlbl9mZXRjaF9kb25lOgorCWNscglTR19TVEFURSByZXQ7CisKK3NlcnZpY2VfZmlmbzoKKwkvKgorCSAqIERvIHdlIGhhdmUgYW55IHByZWZldGNoIGxlZnQ/Pz8KKwkgKi8KKwl0ZXN0CVNHX1NUQVRFLCBTRUdTX0FWQUlMIGpueiBpZGxlX3NnX2F2YWlsOworCisJLyoKKwkgKiBDYW4gdGhpcyBGSUZPIGhhdmUgYWNjZXNzIHRvIHRoZSBTL0cgY2FjaGUgeWV0PworCSAqLworCXRlc3QJQ0NTR0NUTCwgU0dfQ0FDSEVfQVZBSUwganogcmV0dXJuOworCisJLyogRGlkIHdlIGp1c3QgZmluaXNoIGZldGNoaW5nIHNlZ3M/ICovCisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRE9ORSBqbnogaWRsZV9zZ2ZldGNoX2NvbXBsZXRlOworCisJLyogQXJlIHdlIGFjdGl2ZWx5IGZldGNoaW5nIHNlZ21lbnRzPyAqLworCXRlc3QJQ0NTR0NUTCwgQ0NTR0VOQUNLIGpueiByZXR1cm47CisKKwkvKgorCSAqIFdlIGZldGNoIGEgImNhY2hlbGluZSBhbGlnbmVkIiBhbmQgc2l6ZWQgYW1vdW50IG9mIGRhdGEKKwkgKiBzbyB3ZSBkb24ndCBlbmQgdXAgcmVmZXJlbmNpbmcgYSBub24tZXhpc3RhbnQgcGFnZS4KKwkgKiBDYWNoZWxpbmUgYWxpZ25lZCBpcyBpbiBxdW90ZXMgYmVjYXVzZSB0aGUga2VybmVsIHdpbGwKKwkgKiBzZXQgdGhlIHByZWZldGNoIGFtb3VudCB0byBhIHJlYXNvbmFibGUgbGV2ZWwgaWYgdGhlCisJICogY2FjaGVsaW5lIHNpemUgaXMgdW5rbm93bi4KKwkgKi8KKwlibW92CVNHSEFERFIsIFNDQl9SRVNJRFVBTF9TR1BUUiwgNDsKKwltdmkJU0dIQ05ULCBTR19QUkVGRVRDSF9DTlQ7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUkVHX1NMT1dfU0VUVExFX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBOZWVkIHR3byBpbnN0cnVjdGlvbiBiZXR3ZWVuICJ0b3VjaGVzIiBvZiBTR0hBRERSLgorCQkgKi8KKwkJbm9wOworCX0KKwlhbmQJU0dIQUREUlswXSwgU0dfUFJFRkVUQ0hfQUxJR05fTUFTSywgU0NCX1JFU0lEVUFMX1NHUFRSOworCW12aQlDQ1NHQ1RMLCBDQ1NHRU58Q0NTR1JFU0VUOworCW9yCVNHX1NUQVRFLCBGRVRDSF9JTlBST0cgcmV0OworaWRsZV9zZ2ZldGNoX2NvbXBsZXRlOgorCS8qCisJICogR3VhcmQgYWdhaW5zdCBTR19DQUNIRV9BVkFJTCBhY3RpdmF0aW5nIGR1cmluZyBzZyBmZXRjaAorCSAqIHJlcXVlc3QgaW4gdGhlIG90aGVyIEZJRk8uCisJICovCisJdGVzdAlTR19TVEFURSwgRkVUQ0hfSU5QUk9HIGp6IHJldHVybjsKKwljbHIJQ0NTR0NUTDsKKwlhbmQJQ0NTR0FERFIsIFNHX1BSRUZFVENIX0FERFJfTUFTSywgU0NCX1JFU0lEVUFMX1NHUFRSOworCW12aQlTR19TVEFURSwgU0VHU19BVkFJTHxMT0FESU5HX05FRURFRDsKK2lkbGVfc2dfYXZhaWw6CisJLyogRG9lcyB0aGUgaGFyZHdhcmUgaGF2ZSBzcGFjZSBmb3IgYW5vdGhlciBTRyBlbnRyeT8gKi8KKwl0ZXN0CURGU1RBVFVTLCBQUkVMT0FEX0FWQUlMIGp6IHJldHVybjsKKwkvKgorCSAqIE9uIHRoZSBBLCBwcmVsb2FkaW5nIGEgc2VnbWVudCBiZWZvcmUgSERNQUVOQUNLCisJICogY29tZXMgdHJ1ZSBjYW4gY2xvYmJlciB0aGUgc2hhZGRvdyBhZGRyZXNzIG9mIHRoZQorCSAqIGZpcnN0IHNlZ21lbnQgaW4gdGhlIFMvRyBGSUZPLiAgV2FpdCB1bnRpbCBpdCBpcworCSAqIHNhZmUgdG8gcHJvY2VlZC4KKwkgKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0RGQ05UUkxfT1BUUykgPT0gMCkgeworCQl0ZXN0CURGQ05UUkwsIEhETUFFTkFDSyBqeiByZXR1cm47CisJfQorCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCWJtb3YJSEFERFIsIENDU0dSQU0sIDg7CisJfSBlbHNlIHsKKwkJYm1vdiAJSEFERFIsIENDU0dSQU0sIDQ7CisJfQorCWJtb3YJSENOVCwgQ0NTR1JBTSwgMzsKKwlibW92CVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdLCBDQ1NHUkFNLCAxOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF8zOUJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCWFuZAlIQUREUls0XSwgU0dfSElHSF9BRERSX0JJVFMsIFNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdOworCX0KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkvKiBTa2lwIDQgYnl0ZXMgb2YgcGFkLiAqLworCQlhZGQJQ0NTR0FERFIsIDQ7CisJfQorc2dfYWR2YW5jZToKKwljbHIJQTsJCQkvKiBhZGQgc2l6ZW9mKHN0cnVjdCBzY2F0dGVyKSAqLworCWFkZAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sU0dfU0laRU9GOworCWFkYwlTQ0JfUkVTSURVQUxfU0dQVFJbMV0sQTsKKwlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzJdLEE7CisJYWRjCVNDQl9SRVNJRFVBTF9TR1BUUlszXSxBOworCW1vdglTSU5ERVgsIFNDQl9SRVNJRFVBTF9TR1BUUlswXTsKKwl0ZXN0CVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdLCBTR19MQVNUX1NFRyBqeiAuICsgMzsKKwlvcglTSU5ERVgsIExBU1RfU0VHOworCWNscglTR19TVEFURTsKKwltb3YJU0dfQ0FDSEVfUFJFLCBTSU5ERVg7CisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpICE9IDApIHsKKwkJLyoKKwkJICogVXNlIFNDU0lFTldSRElTIHNvIHRoYXQgU0NTSUVOIGlzIG5ldmVyCisJCSAqIG1vZGlmaWVkIGJ5IHRoaXMgb3BlcmF0aW9uLgorCQkgKi8KKwkJb3IJREZDTlRSTCwgUFJFTE9BREVOfEhETUFFTnxTQ1NJRU5XUkRJUzsKKwl9IGVsc2UgeworCQlvcglERkNOVFJMLCBQUkVMT0FERU58SERNQUVOOworCX0KKwkvKgorCSAqIERvIHdlIGhhdmUgYW5vdGhlciBzZWdtZW50IGluIHRoZSBjYWNoZT8KKwkgKi8KKwlhZGQJTk9ORSwgU0dfUFJFRkVUQ0hfQ05UX0xJTUlULCBDQ1NHQUREUjsKKwlqbmMJcmV0dXJuOworCWFuZAlTR19TVEFURSwgflNFR1NfQVZBSUwgcmV0OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgRE1BIGFkZHJlc3MgYW5kIGNvdW50ZXIgZnJvbSB0aGUgU0NCLgorICovCitsb2FkX2ZpcnN0X3NlZzoKKwlibW92CUhBRERSLCBTQ0JfREFUQVBUUiwgMTE7CisJYW5kCVJFR19JU1IsIH5TR19GVUxMX1JFU0lELCBTQ0JfU0dQVFJbMF07CisJdGVzdAlTQ0JfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogLiArIDI7CisJb3IJUkVHX0lTUiwgTEFTVF9TRUc7CisJbW92CVNHX0NBQ0hFX1BSRSwgUkVHX0lTUjsKKwltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOKTsKKwkvKgorCSAqIFNpbmNlIHdlJ3ZlIGFyZSBlbnRlcmluZyBhIGRhdGEgcGhhc2UsIHdlIHdpbGwKKwkgKiByZWx5IG9uIHRoZSBTQ0JfUkVTSUQqIGZpZWxkcy4gIEluaXRpYWxpemUgdGhlCisJICogcmVzaWR1YWwgYW5kIGNsZWFyIHRoZSBmdWxsIHJlc2lkdWFsIGZsYWcuCisJICovCisJYW5kCVNDQl9TR1BUUlswXSwgflNHX0ZVTExfUkVTSUQ7CisJYm1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0NCX0RBVEFDTlRbM10sIDU7CisJLyogSWYgd2UgbmVlZCBtb3JlIFMvRyBlbGVtZW50cywgdGVsbCB0aGUgaWRsZSBsb29wICovCisJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcgam56IC4gKyAyOworCW12aQlTR19TVEFURSwgTE9BRElOR19ORUVERUQgcmV0OworCWNscglTR19TVEFURSByZXQ7CisKK3BfZGF0YV9oYW5kbGVfeGZlcjoKKwljYWxsCXNldGptcDsKKwl0ZXN0CVNHX1NUQVRFLCBMT0FESU5HX05FRURFRCBqbnogc2VydmljZV9maWZvOworcF9kYXRhX2NsZWFyX2hhbmRsZXI6CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFIgcmV0OworCitwX2RhdGE6CisJdGVzdAlTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UCWp6IHBfZGF0YV9hbGxvd2VkOworCVNFVF9TRVFJTlRDT0RFKFBST1RPX1ZJT0xBVElPTikKK3BfZGF0YV9hbGxvd2VkOgorIAorCXRlc3QJU0VRX0ZMQUdTLCBEUEhBU0UJanogZGF0YV9waGFzZV9pbml0aWFsaXplOworCisJLyoKKwkgKiBJZiB3ZSByZS1lbnRlciB0aGUgZGF0YSBwaGFzZSBhZnRlciBnb2luZyB0aHJvdWdoIGFub3RoZXIKKwkgKiBwaGFzZSwgb3VyIHRyYW5zZmVyIGxvY2F0aW9uIGhhcyBhbG1vc3QgY2VydGFpbmx5IGJlZW4KKwkgKiBjb3JydXB0ZWQgYnkgdGhlIGludGVydmVpbmluZywgbm9uLWRhdGEsIHRyYW5zZmVycy4gIEFzaworCSAqIHRoZSBob3N0IGRyaXZlciB0byBmaXggdXMgdXAgYmFzZWQgb24gdGhlIHRyYW5zZmVyIHJlc2lkdWFsCisJICogdW5sZXNzIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIHNob3VsZCBiZSBiaXRidWNrZXRpbmcuCisJICovCisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqbnogcF9kYXRhX2JpdGJ1Y2tldDsKKwlTRVRfU0VRSU5UQ09ERShQREFUQV9SRUlOSVQpCisJam1wCWRhdGFfcGhhc2VfaW5ib3VuZHM7CisKK3BfZGF0YV9iaXRidWNrZXQ6CisJLyoKKwkgKiBUdXJuIG9uIGBCaXQgQnVja2V0JyBtb2RlLCB3YWl0IHVudGlsIHRoZSB0YXJnZXQgdGFrZXMKKwkgKiB1cyB0byBhbm90aGVyIHBoYXNlLCBhbmQgdGhlbiBub3RpZnkgdGhlIGhvc3QuCisJICovCisJbW92CVNBVkVEX01PREUsIE1PREVfUFRSOworCXRlc3QJTU9ERV9QVFIsIH4oTUtfTU9ERShNX0RGRjEsIE1fREZGMSkpCisJCWpueiBiaXRidWNrZXRfbm90X21fZGZmOworCS8qCisJICogRW5zdXJlIHRoYXQgYW55IEZJRk8gY29udGVudHMgYXJlIGNsZWFyZWQgb3V0IGFuZCB0aGUKKwkgKiBGSUZPIGZyZWUnZCBwcmlvciB0byBzdGFydGluZyB0aGUgQklUQlVDS0VULiAgQklUQlVDS0VUCisJICogZG9lc24ndCBkaXNjYXJkIGRhdGEgYWxyZWFkeSBpbiB0aGUgRklGTy4KKwkgKi8KKwltdmkJREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UOworCVNFVF9NT0RFKE1fU0NTSSwgTV9TQ1NJKQorYml0YnVja2V0X25vdF9tX2RmZjoKKwlvcglTWEZSQ1RMMSxCSVRCVUNLRVQ7CisJLyogV2FpdCBmb3Igbm9uLWRhdGEgcGhhc2UuICovCisJdGVzdAlTQ1NJUEhBU0UsIH5EQVRBX1BIQVNFX01BU0sganogLjsKKwlhbmQJU1hGUkNUTDEsIH5CSVRCVUNLRVQ7CisJUkVTVE9SRV9NT0RFKFNBVkVEX01PREUpCitTRVRfU1JDX01PREUJTV9ERkYxOworU0VUX0RTVF9NT0RFCU1fREZGMTsKKwlTRVRfU0VRSU5UQ09ERShEQVRBX09WRVJSVU4pCisJam1wCUlUbG9vcDsKKworZGF0YV9waGFzZV9pbml0aWFsaXplOgorCXRlc3QJU0NCX1NHUFRSWzBdLCBTR19MSVNUX05VTEwgam56IHBfZGF0YV9iaXRidWNrZXQ7CisJY2FsbAlsb2FkX2ZpcnN0X3NlZzsKK2RhdGFfcGhhc2VfaW5ib3VuZHM6CisJLyogV2UgaGF2ZSBzZWVuIGEgZGF0YSBwaGFzZSBhdCBsZWFzdCBvbmNlLiAqLworCW9yCVNFUV9GTEFHUywgRFBIQVNFOworCW1vdglTQVZFRF9NT0RFLCBNT0RFX1BUUjsKKwl0ZXN0CVNHX1NUQVRFLCBMT0FESU5HX05FRURFRCBqeiBkYXRhX2dyb3VwX2RtYV9sb29wOworCWNhbGwJcF9kYXRhX2hhbmRsZV94ZmVyOworZGF0YV9ncm91cF9kbWFfbG9vcDoKKwkvKgorCSAqIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBpZiBlaXRoZXIgdGhlIGxhc3Qgc2VnbWVudAorCSAqIGNvbXBsZXRlcyBvciB0aGUgdGFyZ2V0IGNoYW5nZXMgcGhhc2UuICBCb3RoIGNvbmRpdGlvbnMKKwkgKiB3aWxsIGNsZWFyIFNDU0lFTi4KKwkgKi8KKwljYWxsCWlkbGVfbG9vcF9zZXJ2aWNlX2ZpZm9zOworCWNhbGwJaWRsZV9sb29wX2NjaGFuOworCWNhbGwJaWRsZV9sb29wX2dzZmlmbzsKKwlSRVNUT1JFX01PREUoU0FWRURfTU9ERSkKKwl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqbnogZGF0YV9ncm91cF9kbWFfbG9vcDsKKworZGF0YV9ncm91cF9kbWFmaW5pc2g6CisJLyoKKwkgKiBUaGUgdHJhbnNmZXIgaGFzIHRlcm1pbmF0ZWQgZWl0aGVyIGR1ZSB0byBhIHBoYXNlCisJICogY2hhbmdlLCBhbmQvb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxhc3Qgc2VnbWVudC4KKwkgKiBXZSBoYXZlIHR3byBnb2FscyBoZXJlLiAgRG8gYXMgbXVjaCBvdGhlciB3b3JrCisJICogYXMgcG9zc2libGUgd2hpbGUgdGhlIGRhdGEgZmlmbyBkcmFpbnMgb24gYSByZWFkCisJICogYW5kIHJlc3BvbmQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSB0byB0aGUgc3RhbmRhcmQKKwkgKiBtZXNzYWdlcyAoc2F2ZSBkYXRhIHBvaW50ZXJzL2Rpc2Nvbm5lY3QgYW5kIGNvbW1hbmQKKwkgKiBjb21wbGV0ZSkgdGhhdCB1c3VhbGx5IGZvbGxvdyBhIGRhdGEgcGhhc2UuCisJICovCisJY2FsbAljYWxjX3Jlc2lkdWFsOworCisJLyoKKwkgKiBHbyBhaGVhZCBhbmQgc2h1dCBkb3duIHRoZSBETUEgZW5naW5lIG5vdy4KKwkgKi8KKwl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqbnogZGF0YV9waGFzZV9maW5pc2g7CitkYXRhX2dyb3VwX2ZpZm9mbHVzaDoKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9BVVRPRkxVU0hfQlVHKSAhPSAwKSB7CisJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGVuYWJsZWQgdGhlIGF1dG8tYWNrIGZlYXR1cmUuICBUaGlzIG1lYW5zCisJICogdGhhdCB0aGUgY29udHJvbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHRyYW5zZmVycmVkCisJICogc29tZSBvdmVycnVuIGJ5dGVzIGludG8gdGhlIGRhdGEgRklGTyBhbmQgYWNrZWQgdGhlbQorCSAqIG9uIHRoZSBidXMuICBUaGUgb25seSB3YXkgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uIGlzCisJICogdG8gd2FpdCBmb3IgTEFTVF9TRUdfRE9ORSB0byBjb21lIHRydWUgb24gYSBjb21wbGV0ZWQKKwkgKiB0cmFuc2ZlciBhbmQgdGhlbiB0ZXN0IHRvIHNlZSBpZiB0aGUgZGF0YSBGSUZPIGlzCisJICogbm9uLWVtcHR5LiAgV2Uga25vdyB0aGVyZSBpcyBtb3JlIGRhdGEgeWV0IHRvIHRyYW5zZmVyCisJICogaWYgU0dfTElTVF9OVUxMIGlzIG5vdCB5ZXQgc2V0LCB0aHVzIHRoZXJlIGNhbm5vdCBiZQorCSAqIGFuIG92ZXJydW4uCisJICovCisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqeiBkYXRhX3BoYXNlX2ZpbmlzaDsKKwl0ZXN0CVNHX0NBQ0hFX1NIQURPVywgTEFTVF9TRUdfRE9ORSBqeiAuOworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAgam56IGRhdGFfcGhhc2VfZmluaXNoOworCS8qIE92ZXJydW4gKi8KKwlqbXAJcF9kYXRhOworZGF0YV9waGFzZV9maW5pc2g6CisJLyoKKwkgKiBJZiB0aGUgdGFyZ2V0IGhhcyBsZWZ0IHVzIGluIGRhdGEgcGhhc2UsIGxvb3AgdGhyb3VnaAorCSAqIHRoZSBkbWEgY29kZSBhZ2Fpbi4gIFdlIHdpbGwgb25seSBsb29wIGlmIHRoZXJlIGlzIGEKKwkgKiBkYXRhIG92ZXJydW4uICAKKwkgKi8KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkgeworCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGpueiBkYXRhX3BoYXNlX2RvbmU7CisJfQorCWlmICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUIGp6IC47CisJCXRlc3QJU0NTSVBIQVNFLCBEQVRBX1BIQVNFX01BU0sgam56IHBfZGF0YTsKKwl9CisKK2RhdGFfcGhhc2VfZG9uZToKKwkvKiBLaWxsIG9mZiBhbnkgcGVuZGluZyBwcmVmZXRjaCAqLworCWNhbGwJZGlzYWJsZV9jY3NnZW47CisJb3IgCUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRV9QRU5ESU5HIGp6IElUbG9vcDsKKwkJLyoKKwkJYW5kCVNFUV9GTEFHUywgfkRQSEFTRV9QRU5ESU5HOworCQkgKiBGb3IgZGF0YS1pbiBwaGFzZXMsIHdhaXQgZm9yIGFueSBwZW5kaW5nIGFja3MgZnJvbSB0aGUKKwkJICogaW5pdGlhdG9yIGJlZm9yZSBjaGFuZ2luZyBwaGFzZS4gIFdlIG9ubHkgbmVlZCB0bworCQkgKiBzZW5kIElnbm9yZSBXaWRlIFJlc2lkdWUgbWVzc2FnZXMgZm9yIGRhdGEtaW4gcGhhc2VzLgorCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqeiB0YXJnZXRfSVRsb29wOworCQl0ZXN0CVNTVEFUMSwgUkVRSU5JVAlqbnogLjsKKwkJdGVzdAlTQ0JfVEFTS19BVFRSSUJVVEUsIFNDQl9YRkVSTEVOX09ERCBqeiB0YXJnZXRfSVRsb29wOworCQlTRVRfTU9ERShNX1NDU0ksIE1fU0NTSSkKKwkJdGVzdAlORUdDT05PUFRTLCBXSURFWEZFUiBqeiB0YXJnZXRfSVRsb29wOworCQkgKi8KKwkJLyoKKwkJICogSXNzdWUgYW4gSWdub3JlIFdpZGUgUmVzaWR1ZSBNZXNzYWdlLgorCQltdmkJUF9NRVNHSU58QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJbXZpCU1TR19JR05fV0lERV9SRVNJRFVFIGNhbGwgdGFyZ2V0X291dGI7CisJCW12aQkxIGNhbGwgdGFyZ2V0X291dGI7CisJCWptcAl0YXJnZXRfSVRsb29wOworCQkgKi8KKwl9IGVsc2UgeworCQlqbXAJSVRsb29wOworCX0KKworLyoKKyAqIFdlIGFzc3VtZSB0aGF0LCBldmVuIHRob3VnaCBkYXRhIG1heSBzdGlsbCBiZQorICogdHJhbnNmZXJyaW5nIHRvIHRoZSBob3N0LCB0aGF0IHRoZSBTQ1NJIHNpZGUgb2YKKyAqIHRoZSBETUEgZW5naW5lIGlzIG5vdyBpbiBhIHN0YXRpYyBzdGF0ZS4gIFRoaXMKKyAqIGFsbG93cyB1cyB0byB1cGRhdGUgb3VyIG5vdGlvbiBvZiB3aGVyZSB3ZSBhcmUKKyAqIGluIHRoaXMgdHJhbnNmZXIuCisgKgorICogSWYsIGJ5IGNoYW5jZSwgd2Ugc3RvcHBlZCBiZWZvcmUgYmVpbmcgYWJsZQorICogdG8gZmV0Y2ggYWRkaXRpb25hbCBzZWdtZW50cyBmb3IgdGhpcyB0cmFuc2ZlciwKKyAqIHlldCB0aGUgbGFzdCBTL0cgd2FzIGNvbXBsZXRlbHkgZXhoYXVzdGVkLAorICogY2FsbCBvdXIgaWRsZSBsb29wIHVudGlsIGl0IGlzIGFibGUgdG8gbG9hZAorICogYW5vdGhlciBzZWdtZW50LiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGltbWVkaWF0ZWx5CisgKiBwaWNrdXAgb24gdGhlIG5leHQgc2VnbWVudCBvbiB0aGUgbmV4dCBkYXRhIHBoYXNlLgorICoKKyAqIElmIHdlIGhhcHBlbmVkIHRvIHN0b3Agb24gdGhlIGxhc3Qgc2VnbWVudCwgdGhlbgorICogb3VyIHJlc2lkdWFsIGluZm9ybWF0aW9uIGlzIHN0aWxsIGNvcnJlY3QgZnJvbQorICogdGhlIGlkbGUgbG9vcCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBwZXJmb3JtCisgKiBhbnkgZml4dXBzLgorICovCityZXNpZHVhbF9iZWZvcmVfbGFzdF9zZWc6CisJdGVzdCAgICBNREZGU1RBVCwgU0hWQUxJRAlqbnogc2dwdHJfZml4dXA7CisJLyoKKwkgKiBDYW4gbmV2ZXIgaGFwcGVuIGZyb20gYW4gaW50ZXJydXB0IGFzIHRoZSBwYWNrZXRpemVkCisJICogaGFyZHdhcmUgd2lsbCBvbmx5IGludGVycnVwdCB1cyBvbmNlIFNIVkFMSUQgb3IKKwkgKiBMQVNUX1NFR19ET05FLgorCSAqLworCWNhbGwJaWRsZV9sb29wX3NlcnZpY2VfZmlmb3M7CisJUkVTVE9SRV9NT0RFKFNBVkVEX01PREUpCisJLyogRkFMTFRIUk9VR0ggKi8KK2NhbGNfcmVzaWR1YWw6CisJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHIGp6IHJlc2lkdWFsX2JlZm9yZV9sYXN0X3NlZzsKKwkvKiBSZWNvcmQgaWYgd2UndmUgY29uc3VtZWQgYWxsIFMvRyBlbnRyaWVzICovCisJdGVzdAlNREZGU1RBVCwgU0hWQUxJRAlqeiAuICsgMjsKKwlibW92CVNDQl9SRVNJRFVBTF9EQVRBQ05ULCBTSENOVCwgMyByZXQ7CisJb3IJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEwgcmV0OworCitzZ3B0cl9maXh1cDoKKwkvKgorCSAqIEZpeHVwIHRoZSByZXNpZHVhbCBuZXh0IFMvRyBwb2ludGVyLiAgVGhlIFMvRyBwcmVsb2FkCisJICogZmVhdHVyZSBvZiB0aGUgY2hpcCBhbGxvd3MgdXMgdG8gbG9hZCB0d28gZWxlbWVudHMKKwkgKiBpbiBhZGRpdGlvbiB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50LiAgV2UKKwkgKiBzdG9yZSB0aGUgYm90dG9tIGJ5dGUgb2YgdGhlIG5leHQgUy9HIHBvaW50ZXIgaW4KKwkgKiB0aGUgU0dfQ0FDSEVfUFRSIHJlZ2lzdGVyIHNvIHdlIGNhbiByZXN0b3JlIHRoZQorCSAqIGNvcnJlY3QgdmFsdWUgd2hlbiB0aGUgRE1BIGNvbXBsZXRlcy4gIElmIHRoZSBuZXh0CisJICogc2cgcHRyIHZhbHVlIGhhcyBhZHZhbmNlZCB0byB0aGUgcG9pbnQgd2hlcmUgaGlnaGVyCisJICogYnl0ZXMgaW4gdGhlIGFkZHJlc3MgaGF2ZSBiZWVuIGFmZmVjdGVkLCBmaXggdGhlbQorCSAqIHRvby4KKwkgKi8KKwl0ZXN0CVNHX0NBQ0hFX1NIQURPVywgMHg4MCBqeiBzZ3B0cl9maXh1cF9kb25lOworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCAweDgwIGpueiBzZ3B0cl9maXh1cF9kb25lOworCWFkZAlTQ0JfUkVTSURVQUxfU0dQVFJbMV0sIC0xOworCWFkYwlTQ0JfUkVTSURVQUxfU0dQVFJbMl0sIC0xOyAKKwlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzNdLCAtMTsKK3NncHRyX2ZpeHVwX2RvbmU6CisJYW5kCVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfQUREUl9NQVNLLCBTR19DQUNIRV9TSEFET1c7CisJY2xyCVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdOyAvKiBXZSBhcmUgbm90IHRoZSBsYXN0IHNlZyAqLworCWJtb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlQsIFNIQ05ULCAzIHJldDsKKworZXhwb3J0IHRpbWVyX2lzcjoKKwljYWxsCWlzc3VlX2NtZGNtcGx0OworCW12aQlDTFJTRVFJTlRTVEFULCBDTFJTRVFfU1dUTVJUTzsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9TRVRfTU9ERV9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogSW4gSDJBNCwgdGhlIG1vZGUgcG9pbnRlciBpcyBub3Qgc2F2ZWQKKwkJICogZm9yIGludHZlYzIsIGJ1dCBpcyByZXN0b3JlZCBvbiBpcmV0LgorCQkgKiBUaGlzIGNhbiBsZWFkIHRvIHRoZSByZXN0b3JhdGlvbiBvZiBhCisJCSAqIGJvZ3VzIG1vZGUgcHRyLiAgTWFudWFsbHkgY2xlYXIgdGhlCisJCSAqIGludG1hc2sgYml0cyBhbmQgZG8gYSBub3JtYWwgcmV0dXJuCisJCSAqIHRvIGNvbXBlbnNhdGUuCisJCSAqLworCQlhbmQJU0VRSU5UQ1RMLCB+KElOVE1BU0syfElOVE1BU0sxKSByZXQ7CisJfSBlbHNlIHsKKwkJb3IJU0VRSU5UQ1RMLCBJUkVUIHJldDsKKwl9CisKK2V4cG9ydCBzZXFfaXNyOgorCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpID09IDApIHsKKwkJLyoKKwkJICogT24gUmV2QSBTaWxpY29uLCBpZiB0aGUgdGFyZ2V0IHJldHVybnMgdXMgdG8gZGF0YS1vdXQKKwkJICogYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IHRyYWluZWQgZm9yIGRhdGEtb3V0LCBpdCBpcworCQkgKiBwb3NzaWJsZSBmb3IgdXMgdG8gdHJhbnNpdGlvbiB0aGUgZnJlZSBydW5uaW5nIGNsb2NrIHRvCisJCSAqIGRhdGEtdmFsaWQgYmVmb3JlIHRoZSByZXF1aXJlZCAxMDBucyBQMSBzZXR1cCB0aW1lICg4IFAxCisJCSAqIGFzc2VydGlvbnMgaW4gZmFzdC0xNjAgbW9kZSkuICBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYKKwkJICogdGhpcyBMLVEgaXMgYSBjb250aW51YXRpb24gb2YgYSBkYXRhIHRyYW5zZmVyIGZvciB3aGljaAorCQkgKiB3ZSBoYXZlIGFscmVhZHkgcHJlZmV0Y2hlZCBkYXRhIGludG8gb3VyIEZJRk8gKExRL0RhdGEKKwkJICogZm9sbG93ZWQgYnkgTFEvRGF0YSBmb3IgdGhlIHNhbWUgd3JpdGUgdHJhbnNhY3Rpb24pLgorCQkgKiBUaGlzIGNhbiBjYXVzZSBzb21lIHRhcmdldCBpbXBsZW1lbnRhdGlvbnMgdG8gbWlzcyB0aGUKKwkJICogZmlyc3QgZmV3IGRhdGEgdHJhbnNmZXJzIG9uIHRoZSBidXMuICBXZSBkZXRlY3QgdGhpcworCQkgKiBzaXR1YXRpb24gYnkgbm90aWNpbmcgdGhhdCB0aGlzIGlzIHRoZSBmaXJzdCBkYXRhIHRyYW5zZmVyCisJCSAqIGFmdGVyIGFuIExRIChMUUlXT1JLT05MUSB0cnVlKSwgdGhhdCB0aGUgZGF0YSB0cmFuc2ZlciBpcworCQkgKiBhIGNvbnRpbnVhdGlvbiBvZiBhIHRyYW5zZmVyIGFscmVhZHkgc2V0dXAgaW4gb3VyIEZJRk8KKwkJICogKFNBVkVQVFJTIGludGVycnVwdCksIGFuZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBhIHdyaXRlCisJCSAqIChESVJFQ1RJT04gc2V0IGluIERGQ05UUkwpLiBUaGUgZGVsYXkgaXMgcGVyZm9ybWVkIGJ5CisJCSAqIGRpc2FibGluZyBTQ1NJRU4gdW50aWwgd2Ugc2VlIHRoZSBmaXJzdCBSRVEgZnJvbSB0aGUKKwkJICogdGFyZ2V0LgorCQkgKiAKKwkJICogRmlyc3QgaW5zdHJ1Y3Rpb24gaW4gYW4gSVNSIGNhbm5vdCBiZSBhIGJyYW5jaCBvbgorCQkgKiBSZXYgQS4gIFNuYXBzaG90IExRSVNUQVQyIHNvIHRoZSBzdGF0dXMgaXMgbm90IG1pc3NlZAorCQkgKiBhbmQgZGVmZmVyIHRoZSB0ZXN0IGJ5IG9uZSBpbnN0cnVjdGlvbi4KKwkJICovCisJCW1vdglSRUdfSVNSLCBMUUlTVEFUMjsKKwkJdGVzdAlSRUdfSVNSLCBMUUlXT1JLT05MUSBqeiBtYWluX2lzcjsKKwkJdGVzdAlTRVFJTlRTUkMsIFNBVkVQVFJTICBqeiBtYWluX2lzcjsKKwkJdGVzdAlMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUiBqeiBzYXZlcHRyX2FjdGl2ZV9maWZvOworCQkvKgorCQkgKiBTd2l0Y2ggdG8gdGhlIGFjdGl2ZSBGSUZPIGFmdGVyIGNsZWFyaW5nIHRoZSBzbmFwc2hvdAorCQkgKiBzYXZlcG9pbnRlciBpbiB0aGUgY3VycmVudCBGSUZPLiAgV2UgZG8gdGhpcyBzbyB0aGF0CisJCSAqIGEgcGVuZGluZyBDVFhURE9ORSBvciBTQVZFUFRSIGlzIHZpc2libGUgaW4gdGhlIGFjdGl2ZQorCQkgKiBGSUZPLiAgVGhpcyBzdGF0dXMgaXMgdGhlIG9ubHkgd2F5IHdlIGNhbiBkZXRlY3QgaWYgd2UKKwkJICogaGF2ZSBsb3N0IHRoZSByYWNlIChlLmcuIGhvc3QgcGF1c2VkIHVzKSBhbmQgb3VyIGF0dGVwdHMKKwkJICogdG8gZGlzYWJsZSB0aGUgY2hhbm5lbCBvY2N1cnJlZCBhZnRlciBhbGwgUkVRcyB3ZXJlCisJCSAqIGFscmVhZHkgc2VlbiBhbmQgYWNrZWQgKFJFUUlOSVQgbmV2ZXIgY29tZXMgdHJ1ZSkuCisJCSAqLworCQltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOOworCQl4b3IJTU9ERV9QVFIsIE1LX01PREUoTV9ERkYxLCBNX0RGRjEpOworCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqeiBpbnRlcnJ1cHRfcmV0dXJuOworCQlhbmQJREZDTlRSTCwgflNDU0lFTjsKK3NuYXBzaG90X3dhaXRfZGF0YV92YWxpZDoKKwkJdGVzdAlTRVFJTlRTUkMsIChDVFhURE9ORXxTQVZFUFRSUykgam56IHNuYXBzaG90X2RhdGFfdmFsaWQ7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUCWp6IHNuYXBzaG90X3dhaXRfZGF0YV92YWxpZDsKK3NuYXBzaG90X2RhdGFfdmFsaWQ6CisJCW9yCURGQ05UUkwsIFNDU0lFTjsKKwkJb3IJU0VRSU5UQ1RMLCBJUkVUIHJldDsKK3NuYXBzaG90X3NhdmVwdHI6CisJCW12aQlERkZTWEZSQ1RMLCBDTFJDSE47CisJCW9yCVNFUUlOVENUTCwgSVJFVCByZXQ7CittYWluX2lzcjoKKwl9CisJdGVzdAlTRVFJTlRTUkMsIENGRzREQVRBCWpueiBjZmc0ZGF0YV9pbnRyOworCXRlc3QJU0VRSU5UU1JDLCBDRkc0SVNUQVQJam56IGNmZzRpc3RhdF9pbnRyOworCXRlc3QJU0VRSU5UU1JDLCBTQVZFUFRSUwlqbnogc2F2ZXB0cl9pbnRyOworCXRlc3QJU0VRSU5UU1JDLCBDRkc0SUNNRAlqbnogY2ZnNGljbWRfaW50cjsKKwlTRVRfU0VRSU5UQ09ERShJTlZBTElEX1NFUUlOVCkKKworLyoKKyAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2Ygc2F2ZSBwb2ludGVycyBpbnRlcnJ1cHRzOgorICogVGhlIGZpcnN0IGlzIGEgc25hcHNob3Qgc2F2ZSBwb2ludGVycyB3aGVyZSB0aGUgY3VycmVudCBGSUZPIGlzIG5vdAorICogYWN0aXZlIGFuZCBjb250YWlucyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHBvbml0ZXIgaW5mb3JtYXRpb24uCisgKiBUaGlzIGhhcHBlbnMgYmV0d2VlbiBwYWNrZXRzIGluIGEgc3RyZWFtIGZvciBhIHNpbmdsZSBMX1EuICBTaW5jZSB3ZQorICogYXJlIG5vdCBwZXJmb3JtaW5nIGEgcG9pbnRlciBzYXZlLCB3ZSBjYW4gc2FmZWx5IGNsZWFyIHRoZSBjaGFubmVsCisgKiBzbyBpdCBjYW4gYmUgdXNlZCBmb3Igb3RoZXIgdHJhbnNhY3Rpb25zLiAgT24gUlRJIGNhcGFibGUgY29udHJvbGxlcnMsCisgKiB3aGVyZSBzbmFwc2hvdHMgY2FuLCBhbmQgYXJlLCBkaXNhYmxlZCwgdGhlIGNvZGUgdG8gaGFuZGxlIHRoaXMgdHlwZQorICogb2Ygc25hcHNob3QgaXMgbm90IGFjdGl2ZS4KKyAqCisgKiBUaGUgc2Vjb25kIGNhc2UgaXMgYSBzYXZlIHBvaW50ZXJzIG9uIGFuIGFjdGl2ZSBGSUZPIHdoaWNoIG9jY3VycworICogaWYgdGhlIHRhcmdldCBjaGFuZ2VzIHRvIGEgbmV3IExfUSBvciBidXNmcmVlcy9RQVNlcyBhbmQgdGhlIHRyYW5zZmVyCisgKiBoYXMgYSByZXNpZHVhbC4gIFRoaXMgc2hvdWxkIG9jY3VyIGNvaW5jaWRlbnQgd2l0aCBhIGN0eHRkb25lLiAgV2UKKyAqIGRpc2FibGUgdGhlIGludGVycnVwdCBhbmQgYWxsb3cgb3VyIGFjdGl2ZSByb3V0aW5lIHRvIGhhbmRsZSB0aGUKKyAqIHNhdmUuCisgKi8KK3NhdmVwdHJfaW50cjoKKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKSB7CisJCXRlc3QJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFIgam56IHNuYXBzaG90X3NhdmVwdHI7CisJfQorc2F2ZXB0cl9hY3RpdmVfZmlmbzoKKwlhbmQJU0VRSU1PREUsIH5FTlNBVkVQVFJTOworCW9yCVNFUUlOVENUTCwgSVJFVCByZXQ7CisKK2NmZzRkYXRhX2ludHI6CisJdGVzdAlTQ0JfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqbnogcGt0X2hhbmRsZV9vdmVycnVuX2luY191c2VfY291bnQ7CisJY2FsbAlsb2FkX2ZpcnN0X3NlZzsKKwljYWxsCXBrdF9oYW5kbGVfeGZlcjsKKwlpbmMJU0NCX0ZJRk9fVVNFX0NPVU5UOworaW50ZXJydXB0X3JldHVybjoKKwlvcglTRVFJTlRDVEwsIElSRVQgcmV0OworCitjZmc0aXN0YXRfaW50cjoKKwljYWxsCWZyZWV6ZV9xdWV1ZTsKKwlhZGQJTk9ORSwgLTEzLCBTQ0JfQ0RCX0xFTjsKKwlqbmMJY2ZnNGlzdGF0X2hhdmVfc2Vuc2VfYWRkcjsKKwl0ZXN0CVNDQl9DREJfTEVOLCBTQ0JfQ0RCX0xFTl9QVFIgam56IGNmZzRpc3RhdF9oYXZlX3NlbnNlX2FkZHI7CisJLyoKKwkgKiBIb3N0IHNldHMgdXAgYWRkcmVzcy9jb3VudCBhbmQgZW5hYmxlcyB0cmFuc2Zlci4KKwkgKi8KKwlTRVRfU0VRSU5UQ09ERShDRkc0SVNUQVRfSU5UUikKKwlqbXAJY2ZnNGlzdGF0X3NldHVwX2hhbmRsZXI7CitjZmc0aXN0YXRfaGF2ZV9zZW5zZV9hZGRyOgorCWJtb3YJSEFERFIsIFNDQl9TRU5TRV9CVVNBRERSLCA0OworCW12aQlIQ05UWzFdLCAoQUhEX1NFTlNFX0JVRlNJWkUgPj4gOCk7CisJbXZpCVNHX0NBQ0hFX1BSRSwgTEFTVF9TRUc7CisJbXZpCURGQ05UUkwsIFBSRUxPQURFTnxTQ1NJRU58SERNQUVOOworY2ZnNGlzdGF0X3NldHVwX2hhbmRsZXI6CisJLyoKKwkgKiBTdGF0dXMgcGt0IGlzIHRyYW5zZmVycmluZyB0byBob3N0LgorCSAqIFdhaXQgaW4gaWRsZSBsb29wIGZvciB0cmFuc2ZlciB0byBjb21wbGV0ZS4KKwkgKiBJZiBhIGNvbW1hbmQgY29tcGxldGVkIGJlZm9yZSBhbiBhdHRlbXB0ZWQKKwkgKiB0YXNrIG1hbmFnZW1lbnQgZnVuY3Rpb24gY29tcGxldGVkLCBub3RpZnkgdGhlIGhvc3QuCisJICovCisJdGVzdAlTQ0JfVEFTS19NQU5BR0VNRU5ULCAweEZGIGp6IGNmZzRpc3RhdF9ub190YXNrbWdtdF9mdW5jOworCVNFVF9TRVFJTlRDT0RFKFRBU0tNR01UX0NNRF9DTVBMVF9PS0FZKQorY2ZnNGlzdGF0X25vX3Rhc2ttZ210X2Z1bmM6CisJY2FsbAlwa3RfaGFuZGxlX3N0YXR1czsKKwlvcglTRVFJTlRDVEwsIElSRVQgcmV0OworCitjZmc0aWNtZF9pbnRyOgorCS8qCisJICogSW4gdGhlIGNhc2Ugb2YgRE1BaW5nIGEgQ0RCIGZyb20gdGhlIGhvc3QsIHRoZSBub3JtYWwKKwkgKiBDREIgYnVmZmVyIGlzIGZvcm1hdHRlZCB3aXRoIGFuIDggYnl0ZSBhZGRyZXNzIGZvbGxvd2VkCisJICogYnkgYSAxIGJ5dGUgY291bnQuCisJICovCisJYm1vdglIQUREUlswXSwgU0NCX0hPU1RfQ0RCX1BUUiwgOTsKKwltdmkJU0dfQ0FDSEVfUFJFLCBMQVNUX1NFRzsKKwltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOKTsKKwljYWxsCXBrdF9oYW5kbGVfY2RiOworCW9yCVNFUUlOVENUTCwgSVJFVCByZXQ7CisKKy8qCisgKiBTZWUgaWYgdGhlIHRhcmdldCBoYXMgZ29uZSBvbiBpbiB0aGlzIGNvbnRleHQgY3JlYXRpbmcgYW4KKyAqIG92ZXJydW4gY29uZGl0aW9uLiAgRm9yIHRoZSB3cml0ZSBjYXNlLCB0aGUgaGFyZHdhcmUgY2Fubm90CisgKiBhY2sgYnl0ZXMgdW50aWwgZGF0YSBhcmUgcHJvdmlkZWQuICBTbywgaWYgdGhlIHRhcmdldCBiZWdpbnMKKyAqIGFub3RoZXIgIHBhY2tldCB3aXRob3V0IGNoYW5naW5nIGNvbnRleHRzLCBpbXBseWluZyB3ZSBhcmUKKyAqIG5vdCBzaXR0aW5nIG9uIGEgcGFja2V0IGJvdW5kYXJ5LCB3ZSBhcmUgaW4gYW4gb3ZlcnJ1bgorICogc2l0dWF0aW9uLiAgRm9yIHRoZSByZWFkIGNhc2UsIHRoZSBoYXJkd2FyZSB3aWxsIGNvbnRpbnVlIHRvCisgKiBhY2sgYnl0ZXMgaW50byB0aGUgRklGTywgYW5kIG1heSBldmVuIGFjayB0aGUgbGFzdCBvdmVycnVuIHBhY2tldAorICogaW50byB0aGUgRklGTy4gICBJZiB0aGUgRklGTyBzaG91bGQgYmVjb21lIG5vbi1lbXB0eSwgd2UgYXJlIGluCisgKiBhIHJlYWQgb3ZlcnJ1biBjYXNlLgorICovCisjZGVmaW5lIGNoZWNrX292ZXJydW4JCQkJCQkJXAorCS8qIE5vdCBvbiBhIHBhY2tldCBib3VuZGFyeS4gKi8JCQkJCVwKKwl0ZXN0IAlNREZGU1RBVCwgRExaRVJPIGp6IHBrdF9oYW5kbGVfb3ZlcnJ1bjsJCQlcCisJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqeiBwa3RfaGFuZGxlX292ZXJydW4KKworcGt0X2hhbmRsZV94ZmVyOgorCXRlc3QJU0dfU1RBVEUsIExPQURJTkdfTkVFREVEIGp6IHBrdF9sYXN0X3NlZzsKKwljYWxsCXNldGptcDsKKwl0ZXN0CVNFUUlOVFNSQywgU0FWRVBUUlMgam56IHBrdF9zYXZlcHRyczsKKwl0ZXN0CVNDU0lQSEFTRSwgfkRBVEFfUEhBU0VfTUFTSyBqeiAuICsgMjsKKwl0ZXN0CVNDU0lTSUdPLCBBVE5PIGpueiAuICsgMjsKKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiBwa3Rfc2VydmljZV9maWZvOworCS8qCisJICogRGVmZXIgaGFuZGxpbmcgb2YgdGhpcyBOT05QQUNLUkVRIHVudGlsIHdlCisJICogY2FuIGJlIHN1cmUgaXQgcGVydGFpbnMgdG8gdGhpcyBGSUZPLiAgU0FWRVBUUlMKKwkgKiB3aWxsIG5vdCBiZSBhc3NlcnRlZCBpZiB0aGUgTk9OUEFDS1JFUSBpcyBmb3IgdXMsCisJICogc28gd2UgbXVzdCBzaW11bGF0ZSBpdCBpZiBzaGFkZG93IGlzIHZhbGlkLiAgSWYKKwkgKiBzaGFkZG93IGlzIG5vdCB2YWxpZCwga2VlcCBydW5uaW5nIHRoaXMgRklGTyB1bnRpbCB3ZQorCSAqIGhhdmUgc2F0aXNmaWVkIHRoZSB0cmFuc2ZlciBieSBsb2FkaW5nIHNlZ21lbnRzIGFuZAorCSAqIHdhaXRpbmcgZm9yIGVpdGhlciBzaGFkZG93IHZhbGlkIG9yIGxhc3Rfc2VnX2RvbmUuCisJICovCisJdGVzdAlNREZGU1RBVCwgU0hWQUxJRCBqbnogcGt0X3NhdmVwdHJzOworcGt0X3NlcnZpY2VfZmlmbzoKKwl0ZXN0CVNHX1NUQVRFLCBMT0FESU5HX05FRURFRCBqbnogc2VydmljZV9maWZvOworcGt0X2xhc3Rfc2VnOgorCWNhbGwJc2V0am1wOworCXRlc3QJU0VRSU5UU1JDLCBTQVZFUFRSUyBqbnogcGt0X3NhdmVwdHJzOworCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGpueiBwa3RfbGFzdF9zZWdfZG9uZTsKKwl0ZXN0CVNDU0lQSEFTRSwgfkRBVEFfUEhBU0VfTUFTSyBqeiAuICsgMjsKKwl0ZXN0CVNDU0lTSUdPLCBBVE5PIGpueiAuICsgMjsKKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiByZXR1cm47CisJdGVzdAlNREZGU1RBVCwgU0hWQUxJRCBqeiByZXR1cm47CisJLyogRkFMTFRIUk9VR0ggKi8KKworLyoKKyAqIEVpdGhlciBhIFNBVkVQVFJTIGludGVycnVwdCBjb25kaXRpb24gaXMgcGVuZGluZyBmb3IgdGhpcyBGSUZPCisgKiBvciB3ZSBoYXZlIGEgcGVuZGluZyBOT05QQUNLUkVRIGZvciB0aGlzIEZJRk8uICBXZSBkaWZmZXJlbnRpYXRlCisgKiBiZXR3ZWVuIHRoZSB0d28gYnkgY2FwdHVyaW5nIHRoZSBzdGF0ZSBvZiB0aGUgU0FWRVBUUlMgaW50ZXJydXB0CisgKiBwcmlvciB0byBjbGVhcmluZyB0aGlzIHN0YXR1cyBhbmQgZXhlY3V0aW5nIHRoZSBjb21tb24gY29kZSBmb3IKKyAqIHRoZXNlIHR3byBjYXNlcy4KKyAqLworcGt0X3NhdmVwdHJzOgorQkVHSU5fQ1JJVElDQUw7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQVVUT0ZMVVNIX0JVRykgIT0gMCkgeworCQlvcglERkNOVFJMLCBGSUZPRkxVU0g7CisJfQorCW1vdglSRUcwLCBTRVFJTlRTUkM7CisJY2FsbAljYWxjX3Jlc2lkdWFsOworCWNhbGwJc2F2ZV9wb2ludGVyczsKKwltdmkJQ0xSU0VRSU5UU1JDLCBDTFJTQVZFUFRSUzsKKwljYWxsCWRpc2FibGVfY2NzZ2VuOworCW9yCVNFUUlNT0RFLCBFTlNBVkVQVFJTOworCXRlc3QJREZDTlRSTCwgRElSRUNUSU9OIGpueiBwa3Rfc2F2ZXB0cnNfY2hlY2tfc3RhdHVzOworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAgam56IHBrdF9zYXZlcHRyc19jaGVja19zdGF0dXM7CisJLyoKKwkgKiBLZWVwIGEgaGFuZGxlciBhcm91bmQgZm9yIHRoaXMgRklGTyB1bnRpbCBpdCBkcmFpbnMKKwkgKiB0byB0aGUgaG9zdCB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb24ndCBjb21wbGV0ZSB0aGUKKwkgKiBjb21tYW5kIHRvIHRoZSBob3N0IGJlZm9yZSB0aGUgZGF0YSBhcnJpdmVzLgorCSAqLworcGt0X3NhdmVwdHJzX3dhaXRfZmlmb2VtcDoKKwljYWxsCXNldGptcDsKKwl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHJldHVybjsKK3BrdF9zYXZlcHRyc19jaGVja19zdGF0dXM6CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFI7CisJdGVzdAlSRUcwLCBTQVZFUFRSUyBqeiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7CitFTkRfQ1JJVElDQUw7CisKKy8qCisgKiBMQVNUX1NFR19ET05FIHN0YXR1cyBoYXMgYmVlbiBzZWVuIGluIHRoZSBjdXJyZW50IEZJRk8uCisgKiBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBvZiB0aGUgYWxsb3dlZCBkYXRhIGZvciB0aGlzCisgKiBjb21tYW5kIGhhcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgdGhlIFNDU0kgYW5kIGhvc3QgYnVzZXMuCisgKiBDaGVjayBmb3Igb3ZlcnJ1biBhbmQgc2VlIGlmIHdlIGNhbiBjb21wbGV0ZSB0aGlzIGNvbW1hbmQuCisgKi8KK3BrdF9sYXN0X3NlZ19kb25lOgorQkVHSU5fQ1JJVElDQUw7CisJLyoKKwkgKiBNYXJrIHRyYW5zZmVyIGFzIGNvbXBsZXRlZC4KKwkgKi8KKwlvcglTQ0JfU0dQVFIsIFNHX0xJU1RfTlVMTDsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIGN1cnJlbnQgY29udGV4dCB0byBmaW5pc2ggdG8gdmVyaWZ5IHRoYXQKKwkgKiBubyBvdmVycnVuIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQuCisJICovCisJdGVzdAlTRVFJTlRTUkMsIENUWFRET05FIGpueiBwa3RfY3R4dF9kb25lOworCWNhbGwJc2V0am1wOworcGt0X3dhaXRfY3R4dF9kb25lX2xvb3A6CisJdGVzdAlTRVFJTlRTUkMsIENUWFRET05FIGpueiBwa3RfY3R4dF9kb25lOworCS8qCisJICogQSBzdWZmaWNpZW50bHkgbGFyZ2Ugb3ZlcnJ1biBvciBhIE5PTlBBQ0tSRVEgbWF5CisJICogcHJldmVudCBDVFhURE9ORSBmcm9tIGV2ZXIgYXNzZXJ0aW5nLCBzbyB3ZSBtdXN0CisJICogcG9sbCBmb3IgdGhlc2Ugc3RhdHVzZXMgdG9vLgorCSAqLworCWNoZWNrX292ZXJydW47CisJdGVzdAlTU1RBVDIsIE5PTlBBQ0tSRVEganogcmV0dXJuOworCXRlc3QJU0VRSU5UU1JDLCBDVFhURE9ORSBqeiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwkvKiBGQUxMVEhST1VHSCAqLworCitwa3RfY3R4dF9kb25lOgorCWNoZWNrX292ZXJydW47CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFI7CisJLyoKKwkgKiBJZiBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQsIGl0IGlzIHNhZmUgdG8gc2tpcAorCSAqIHRoZSBjaGVjayB0byBzZWUgaWYgYW5vdGhlciBGSUZPIGlzIGFjdGl2ZSBiZWNhdXNlCisJICogTEFTVF9TRUdfRE9ORSBoYXMgYmVlbiBvYnNlcnZlZC4gIEhvd2V2ZXIsIHdlIGNoZWNrCisJICogdGhlIEZJRk8gYW55d2F5IHNpbmNlIGl0IGNvc3RzIHVzIG9ubHkgb25lIGV4dHJhCisJICogaW5zdHJ1Y3Rpb24gdG8gbGV2ZXJhZ2UgY29tbW9uIGNvZGUgdG8gcGVyZm9ybSB0aGUKKwkgKiBTQ0IgY29tcGxldGlvbi4KKwkgKi8KKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7CitFTkRfQ1JJVElDQUw7CisKKy8qCisgKiBNdXN0IHdhaXQgdW50aWwgQ0RCIHhmZXIgaXMgb3ZlciBiZWZvcmUgaXNzdWluZyB0aGUKKyAqIGNsZWFyIGNoYW5uZWwuCisgKi8KK3BrdF9oYW5kbGVfY2RiOgorCWNhbGwJc2V0am1wOworCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGp6IHJldHVybjsKKwlvcglMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUjsKKwltdmkJREZGU1hGUkNUTCwgQ0xSQ0hOIHJldDsKKworLyoKKyAqIFdhdGNoIG92ZXIgdGhlIHN0YXR1cyB0cmFuc2Zlci4gIE91ciBob3N0IHNlbnNlIGJ1ZmZlciBpcworICogbGFyZ2UgZW5vdWdoIHRvIHRha2UgdGhlIG1heGltdW0gYWxsb3dlZCBzdGF0dXMgcGFja2V0LgorICogTm9uZS10aGUtbGVzcywgd2UgbXVzdCBzdGlsbCBjYXRjaCBhbmQgcmVwb3J0IG92ZXJydW5zIHRvCisgKiB0aGUgaG9zdC4gIEFkZGl0aW9uYWxseSwgcHJvcGVybHkgY2F0Y2ggdW5leHBlY3RlZCBub24tcGFja2V0CisgKiBwaGFzZXMgdGhhdCBhcmUgdHlwaWNhbGx5IGNhdXNlZCBieSBDUkMgZXJyb3JzIGluIHN0YXR1cyBwYWNrZXQKKyAqIHRyYW5zbWlzc2lvbi4KKyAqLworcGt0X2hhbmRsZV9zdGF0dXM6CisJY2FsbAlzZXRqbXA7CisJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHX0RPTkUgam56IHBrdF9zdGF0dXNfY2hlY2tfb3ZlcnJ1bjsKKwl0ZXN0CVNFUUlOVFNSQywgQ1RYVERPTkUganogcGt0X3N0YXR1c19jaGVja19ub25wYWNrcmVxOworCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGpueiBwa3Rfc3RhdHVzX2NoZWNrX292ZXJydW47Citwa3Rfc3RhdHVzX0lVX2RvbmU6CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQVVUT0ZMVVNIX0JVRykgIT0gMCkgeworCQlvcglERkNOVFJMLCBGSUZPRkxVU0g7CisJfQorCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogcmV0dXJuOworQkVHSU5fQ1JJVElDQUw7CisJb3IJTE9OR0pNUF9BRERSWzFdLCBJTlZBTElEX0FERFI7CisJbXZpCVNDQl9TQ1NJX1NUQVRVUywgU1RBVFVTX1BLVF9TRU5TRTsKKwlvcglTQ0JfQ09OVFJPTCwgU1RBVFVTX1JDVkQ7CisJam1wCXBrdF9jb21wbGV0ZV9zY2JfaWZfZmlmb3NfaWRsZTsKK0VORF9DUklUSUNBTDsKK3BrdF9zdGF0dXNfY2hlY2tfb3ZlcnJ1bjoKKwkvKgorCSAqIFN0YXR1cyBQS1Qgb3ZlcnJ1bnMgYXJlIHVuY2VyaW1vbmlvdXNseSByZWNvdmVyZWQgd2l0aCBhCisJICogYnVzIHJlc2V0LiAgSWYgd2UndmUgb3ZlcnJ1biwgbGV0IHRoZSBob3N0IGtub3cgc28gdGhhdAorCSAqIHJlY292ZXJ5IGNhbiBiZSBwZXJmb3JtZWQuCisJICoKKwkgKiBMQVNUX1NFR19ET05FIGhhcyBiZWVuIG9ic2VydmVkLiAgSWYgZWl0aGVyIENUWFRET05FIG9yCisJICogYSBOT05QQUNLUkVRIHBoYXNlIGNoYW5nZSBoYXZlIG9jY3VycmVkIGFuZCB0aGUgRklGTyBpcworCSAqIGVtcHR5LCB0aGVyZSBpcyBubyBvdmVycnVuLgorCSAqLworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogcGt0X3N0YXR1c19yZXBvcnRfb3ZlcnJ1bjsKKwl0ZXN0CVNFUUlOVFNSQywgQ1RYVERPTkUganogLiArIDI7CisJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqbnogcGt0X3N0YXR1c19JVV9kb25lOworCXRlc3QJU0NTSVBIQVNFLCB+REFUQV9QSEFTRV9NQVNLIGp6IHJldHVybjsKKwl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGpueiBwa3Rfc3RhdHVzX2NoZWNrX25vbnBhY2tyZXE7Citwa3Rfc3RhdHVzX3JlcG9ydF9vdmVycnVuOgorCVNFVF9TRVFJTlRDT0RFKFNUQVRVU19PVkVSUlVOKQorCS8qIFNFUVVFTkNFUiBSRVNUQVJURUQgKi8KK3BrdF9zdGF0dXNfY2hlY2tfbm9ucGFja3JlcToKKwkvKgorCSAqIENUWFRET05FIG1heSBiZSBoZWxkIG9mZiBpZiBhIE5PTlBBQ0tSRVEgaXMgYXNzb2NpYXRlZCB3aXRoCisJICogdGhlIGN1cnJlbnQgY29udGV4dC4gIElmIGEgTk9OUEFDS1JFUSBpcyBvYnNlcnZlZCwgZGVjaWRlCisJICogaWYgaXQgaXMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuICBJZiBpdCBpcyBmb3IgdGhlIGN1cnJlbnQKKwkgKiBjb250ZXh0LCB3ZSBtdXN0IGRlZmVyIE5PTlBBQ0tSRVEgcHJvY2Vzc2luZyB1bnRpbCBhbGwgZGF0YQorCSAqIGhhcyB0cmFuc2ZlcnJlZCB0byB0aGUgaG9zdC4KKwkgKi8KKwl0ZXN0CVNDU0lQSEFTRSwgfkRBVEFfUEhBU0VfTUFTSyBqeiByZXR1cm47CisJdGVzdAlTQ1NJU0lHTywgQVROTyBqbnogLiArIDI7CisJdGVzdAlTU1RBVDIsIE5PTlBBQ0tSRVEganogcmV0dXJuOworCXRlc3QJU0VRSU5UU1JDLCBDVFhURE9ORSBqbnogcGt0X3N0YXR1c19JVV9kb25lOworCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogcmV0dXJuOworCS8qCisJICogVGhlIHVuZXhwZWN0ZWQgbm9ucGt0IHBoYXNlIGhhbmRsZXIgYXNzdW1lcyB0aGF0IGFueQorCSAqIGRhdGEgY2hhbm5lbCB1c2Ugd2lsbCBoYXZlIGEgRklGTyByZWZlcmVuY2UgY291bnQuICBJdAorCSAqIHR1cm5zIG91dCB0aGF0IHRoZSBzdGF0dXMgaGFuZGxlciBkb2Vzbid0IG5lZWQgYSByZWZlcm5jZQorCSAqIGNvdW50IHNpbmNlIHRoZSBzdGF0dXMgcmVjZWl2ZWQgZmxhZywgYW5kIHRodXMgY29tcGxldGlvbgorCSAqIHByb2Nlc3NpbmcsIGNhbm5vdCBiZSBzZXQgdW50aWwgdGhlIGhhbmRsZXIgaXMgZmluaXNoZWQuCisJICogV2UgaW5jcmVtZW50IHRoZSBjb3VudCBoZXJlIHRvIG1ha2UgdGhlIG5vbnBrdCBoYW5kbGVyCisJICogaGFwcHkuCisJICovCisJaW5jCVNDQl9GSUZPX1VTRV9DT1VOVDsKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICogTm9ucGFja3JlcSBpcyBhIHBvbGxlZCBzdGF0dXMuICBJdCBjYW4gY29tZSB0cnVlIGluIHRocmVlIHNpdHVhdGlvbnM6CisgKiB3ZSBoYXZlIHJlY2VpdmVkIGFuIExfUSwgd2UgaGF2ZSBzZW50IG9uZSBvciBtb3JlIExfUXMsIG9yIHRoZXJlIGlzIG5vCisgKiBMX1EgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBSRVEgKFJFUSBvY2N1cnMgaW1tZWRpYXRlbHkgYWZ0ZXIgYQorICogKHJlKXNlbGVjdGlvbikuICBSb3V0aW5lcyB0aGF0IGtub3cgdGhhdCB0aGUgY29udGV4dCByZXNwb25zaWJsZSBmb3IgdGhpcworICogbm9ucGFja3JlcSBjYWxsIGRpcmVjdGx5IGludG8gdW5leHBlY3RlZF9ub25wa3RfcGhhc2UuICBJbiB0aGUgY2FzZSBvZiB0aGUKKyAqIHRvcCBsZXZlbCBpZGxlIGxvb3AsIHdlIGV4aGF1c3QgYWxsIGFjdGl2ZSBjb250ZXh0cyBwcmlvciB0byBkZXRlcm1pbmluZyB0aGF0CisgKiB3ZSBzaW1wbHkgZG8gbm90IGhhdmUgdGhlIGZ1bGwgSV9UX0xfUSBmb3IgdGhpcyBwaGFzZS4KKyAqLwordW5leHBlY3RlZF9ub25wa3RfcGhhc2VfZmluZF9jdHh0OgorCS8qCisJICogVGhpcyBub25wYWNrcmVxIGlzIG1vc3QgbGlrZWx5IGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIHRhZ3MKKwkgKiBpbiBhIEZJRk8gb3IgYW4gb3V0Z29pbmcgTFEuICBPbmx5IHRyZWF0IGl0IGFzIGFuIElfVCBvbmx5CisJICogbm9ucGFja3JlcSBpZiB3ZSd2ZSBjbGVhcmVkIG91dCB0aGUgRklGT3MgYW5kIGhhbmRsZWQgYW55CisJICogcGVuZGluZyBTRUxETy4KKwkgKi8KK1NFVF9TUkNfTU9ERQlNX1NDU0k7CitTRVRfRFNUX01PREUJTV9TQ1NJOworCWFuZAlBLCBGSUZPMUZSRUV8RklGTzBGUkVFLCBERkZTVEFUOworCWNtcAlBLCBGSUZPMUZSRUV8RklGTzBGUkVFIGpuZSByZXR1cm47CisJdGVzdAlTU1RBVDAsIFNFTERPIGpueiByZXR1cm47CisJbXZpCVNDQlBUUlsxXSwgU0NCX0xJU1RfTlVMTDsKK3VuZXhwZWN0ZWRfbm9ucGt0X3BoYXNlOgorCXRlc3QJTU9ERV9QVFIsIH4oTUtfTU9ERShNX0RGRjEsIE1fREZGMSkpCisJCWpueiB1bmV4cGVjdGVkX25vbnBrdF9tb2RlX2NsZWFyZWQ7CitTRVRfU1JDX01PREUJTV9ERkYwOworU0VUX0RTVF9NT0RFCU1fREZGMDsKKwlvcglMT05HSk1QX0FERFJbMV0sIElOVkFMSURfQUREUjsKKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCW12aQlERkZTWEZSQ1RMLCBDTFJDSE47Cit1bmV4cGVjdGVkX25vbnBrdF9tb2RlX2NsZWFyZWQ6CisJbXZpCUNMUlNJTlQyLCBDTFJOT05QQUNLUkVROworCXRlc3QJU0NTSVBIQVNFLCB+KE1TR19JTl9QSEFTRXxNU0dfT1VUX1BIQVNFKSBqbnogaWxsZWdhbF9waGFzZTsKKwlTRVRfU0VRSU5UQ09ERShFTlRFUklOR19OT05QQUNLKQorCWptcAlJVGxvb3A7CisKK2lsbGVnYWxfcGhhc2U6CisJU0VUX1NFUUlOVENPREUoSUxMRUdBTF9QSEFTRSkKKwlqbXAJSVRsb29wOworCisvKgorICogV2UgaGF2ZSBlbnRlcmVkIGFuIG92ZXJydW4gc2l0dWF0aW9uLiAgSWYgd2UgaGF2ZSB3b3JraW5nCisgKiBCSVRCVUNLRVQsIGZsaXAgdGhhdCBvbiBhbmQgbGV0IHRoZSBoYXJkd2FyZSBlYXQgYW55IG92ZXJydW4KKyAqIGRhdGEuICBPdGhlcndpc2UgdXNlIGFuIG92ZXJydW4gYnVmZmVyIGluIHRoZSBob3N0IHRvIHNpbXVsYXRlCisgKiBCSVRCVUNLRVQuCisgKi8KK3BrdF9oYW5kbGVfb3ZlcnJ1bl9pbmNfdXNlX2NvdW50OgorCWluYwlTQ0JfRklGT19VU0VfQ09VTlQ7Citwa3RfaGFuZGxlX292ZXJydW46CisJU0VUX1NFUUlOVENPREUoQ0ZHNE9WRVJSVU4pCisJY2FsbAlmcmVlemVfcXVldWU7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0JJVEJVQ0tFVF9CVUcpID09IDApIHsKKwkJb3IJREZGU1hGUkNUTCwgREZGQklUQlVDS0VUOworU0VUX1NSQ19NT0RFCU1fREZGMTsKK1NFVF9EU1RfTU9ERQlNX0RGRjE7CisJfSBlbHNlIHsKKwkJY2FsbAlsb2FkX292ZXJydW5fYnVmOworCQltdmkJREZDTlRSTCwgKEhETUFFTnxTQ1NJRU58UFJFTE9BREVOKTsKKwl9CisJY2FsbAlzZXRqbXA7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0JJVEJVQ0tFVF9CVUcpICE9IDApIHsKKwkJdGVzdAlERlNUQVRVUywgUFJFTE9BRF9BVkFJTCBqeiBvdmVycnVuX2xvYWRfZG9uZTsKKwkJY2FsbAlsb2FkX292ZXJydW5fYnVmOworCQlvcglERkNOVFJMLCBQUkVMT0FERU47CitvdmVycnVuX2xvYWRfZG9uZToKKwkJdGVzdAlTRVFJTlRTUkMsIENUWFRET05FIGpueiBwa3Rfb3ZlcnJ1bl9lbmQ7CisJfSBlbHNlIHsKKwkJdGVzdAlERkZTWEZSQ1RMLCBERkZCSVRCVUNLRVQganogcGt0X292ZXJydW5fZW5kOworCX0KKwl0ZXN0CVNTVEFUMiwgTk9OUEFDS1JFUSBqeiByZXR1cm47Citwa3Rfb3ZlcnJ1bl9lbmQ6CisJb3IJU0NCX1JFU0lEVUFMX1NHUFRSLCBTR19PVkVSUlVOX1JFU0lEOworCXRlc3QJU0VRSU5UU1JDLCBDVFhURE9ORSBqeiB1bmV4cGVjdGVkX25vbnBrdF9waGFzZTsKKwlkZWMJU0NCX0ZJRk9fVVNFX0NPVU5UOworCW9yCUxPTkdKTVBfQUREUlsxXSwgSU5WQUxJRF9BRERSOworCXRlc3QJU0NCX0NPTlRST0wsIFNUQVRVU19SQ1ZEIGpueiBwa3RfY29tcGxldGVfc2NiX2lmX2ZpZm9zX2lkbGU7CisJbXZpCURGRlNYRlJDVEwsIENMUkNITiByZXQ7CisKK2lmICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSAhPSAwKSB7Citsb2FkX292ZXJydW5fYnVmOgorCS8qCisJICogTG9hZCBhIGR1bW15IHNlZ21lbnQgaWYgcHJlbG9hZCBzcGFjZSBpcyBhdmFpbGFibGUuCisJICovCisJbW92IAlIQUREUlswXSwgU0hBUkVEX0RBVEFfQUREUjsKKwlhZGQJSEFERFJbMV0sIFBLVF9PVkVSUlVOX0JVRk9GRlNFVCwgU0hBUkVEX0RBVEFfQUREUlsxXTsKKwltb3YJQUNDVU1fU0FWRSwgQTsKKwljbHIJQTsKKwlhZGMJSEFERFJbMl0sIEEsIFNIQVJFRF9EQVRBX0FERFJbMl07CisJYWRjCUhBRERSWzNdLCBBLCBTSEFSRURfREFUQV9BRERSWzNdOworCW1vdglBLCBBQ0NVTV9TQVZFOworCWJtb3YJSEFERFJbNF0sIEFMTFpFUk9TLCA0OworCS8qIFBLVF9PVkVSUlVOX0JVRlNJWkUgaXMgYSBtdWx0aXBsZSBvZiAyNTYgKi8KKwljbHIJSENOVFswXTsKKwltdmkJSENOVFsxXSwgKChQS1RfT1ZFUlJVTl9CVUZTSVpFID4+IDgpICYgMHhGRik7CisJY2xyCUhDTlRbMl0gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdmYjFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMKQEAgLTAsMCArMSw5ODg4IEBACisvKgorICogQ29yZSByb3V0aW5lcyBhbmQgdGFibGVzIHNoYXJlYWJsZSBhY3Jvc3MgT1MgcGxhdGZvcm1zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAyIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5jIzIwMiAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljNzl4eF9pbmxpbmUuaCIKKyNpbmNsdWRlICJhaWNhc20vYWljYXNtX2luc2Zvcm1hdC5oIgorI2Vsc2UKKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3OXh4X29zbS5oPgorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoZF9zb2Z0Y190YWlscSBhaGRfdGFpbHEgPSBUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGFoZF90YWlscSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb29rdXAgVGFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyICphaGRfY2hpcF9uYW1lc1tdID0KK3sKKwkiTk9ORSIsCisJImFpYzc5MDEiLAorCSJhaWM3OTAyIiwKKwkiYWljNzkwMUEiCit9Oworc3RhdGljIGNvbnN0IHVfaW50IG51bV9jaGlwX25hbWVzID0gTlVNX0VMRU1FTlRTKGFoZF9jaGlwX25hbWVzKTsKKworLyoKKyAqIEhhcmR3YXJlIGVycm9yIGNvZGVzLgorICovCitzdHJ1Y3QgYWhkX2hhcmRfZXJyb3JfZW50cnkgeworICAgICAgICB1aW50OF90IGVycm5vOworCWNoYXIgKmVycm1lc2c7Cit9OworCitzdGF0aWMgc3RydWN0IGFoZF9oYXJkX2Vycm9yX2VudHJ5IGFoZF9oYXJkX2Vycm9yc1tdID0geworCXsgRFNDVE1PVVQsCSJEaXNjYXJkIFRpbWVyIGhhcyB0aW1lZCBvdXQiIH0sCisJeyBJTExPUENPREUsCSJJbGxlZ2FsIE9wY29kZSBpbiBzZXF1ZW5jZXIgcHJvZ3JhbSIgfSwKKwl7IFNRUEFSRVJSLAkiU2VxdWVuY2VyIFBhcml0eSBFcnJvciIgfSwKKwl7IERQQVJFUlIsCSJEYXRhLXBhdGggUGFyaXR5IEVycm9yIiB9LAorCXsgTVBBUkVSUiwJIlNjcmF0Y2ggb3IgU0NCIE1lbW9yeSBQYXJpdHkgRXJyb3IiIH0sCisJeyBDSU9QQVJFUlIsCSJDSU9CVVMgUGFyaXR5IEVycm9yIiB9LAorfTsKK3N0YXRpYyBjb25zdCB1X2ludCBudW1fZXJyb3JzID0gTlVNX0VMRU1FTlRTKGFoZF9oYXJkX2Vycm9ycyk7CisKK3N0YXRpYyBzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5IGFoZF9waGFzZV90YWJsZVtdID0KK3sKKwl7IFBfREFUQU9VVCwJTVNHX05PT1AsCQkiaW4gRGF0YS1vdXQgcGhhc2UiCX0sCisJeyBQX0RBVEFJTiwJTVNHX0lOSVRJQVRPUl9ERVRfRVJSLAkiaW4gRGF0YS1pbiBwaGFzZSIJfSwKKwl7IFBfREFUQU9VVF9EVCwJTVNHX05PT1AsCQkiaW4gRFQgRGF0YS1vdXQgcGhhc2UiCX0sCisJeyBQX0RBVEFJTl9EVCwJTVNHX0lOSVRJQVRPUl9ERVRfRVJSLAkiaW4gRFQgRGF0YS1pbiBwaGFzZSIJfSwKKwl7IFBfQ09NTUFORCwJTVNHX05PT1AsCQkiaW4gQ29tbWFuZCBwaGFzZSIJfSwKKwl7IFBfTUVTR09VVCwJTVNHX05PT1AsCQkiaW4gTWVzc2FnZS1vdXQgcGhhc2UiCX0sCisJeyBQX1NUQVRVUywJTVNHX0lOSVRJQVRPUl9ERVRfRVJSLAkiaW4gU3RhdHVzIHBoYXNlIgl9LAorCXsgUF9NRVNHSU4sCU1TR19QQVJJVFlfRVJST1IsCSJpbiBNZXNzYWdlLWluIHBoYXNlIgl9LAorCXsgUF9CVVNGUkVFLAlNU0dfTk9PUCwJCSJ3aGlsZSBpZGxlIgkJfSwKKwl7IDAsCQlNU0dfTk9PUCwJCSJpbiB1bmtub3duIHBoYXNlIgl9Cit9OworCisvKgorICogSW4gbW9zdCBjYXNlcyB3ZSBvbmx5IHdpc2ggdG8gaXR0ZXJhdGUgb3ZlciByZWFsIHBoYXNlcywgc28KKyAqIGV4Y2x1ZGUgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBjb3VudC4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50IG51bV9waGFzZXMgPSBOVU1fRUxFTUVOVFMoYWhkX3BoYXNlX3RhYmxlKSAtIDE7CisKKy8qIE91ciBTZXF1ZW5jZXIgUHJvZ3JhbSAqLworI2luY2x1ZGUgImFpYzc5eHhfc2VxLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV90cmFuc21pc3Npb25fZXJyb3Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfaGFuZGxlX2xxaXBoYXNlX2Vycm9yKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJCSAgdV9pbnQgbHFpc3RhdDEpOworc3RhdGljIGludAkJYWhkX2hhbmRsZV9wa3RfYnVzZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgICB1X2ludCBidXNmcmVldGltZSk7CitzdGF0aWMgaW50CQlhaGRfaGFuZGxlX25vbnBrdF9idXNmcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV9wcm90b192aW9sYXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworCitzdGF0aWMgc3RydWN0IGFoZF90bW9kZV90c3RhdGUqCisJCQlhaGRfYWxsb2NfdHN0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCk7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAkJYWhkX2ZyZWVfdHN0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJdV9pbnQgc2NzaV9pZCwgY2hhciBjaGFubmVsLCBpbnQgZm9yY2UpOworI2VuZGlmCitzdGF0aWMgdm9pZAkJYWhkX2RldmxpbWl0ZWRfc3luY3JhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICosCisJCQkJCQl1X2ludCAqcGVyaW9kLAorCQkJCQkJdV9pbnQgKnBwcl9vcHRpb25zLAorCQkJCQkJcm9sZV90IHJvbGUpOworc3RhdGljIHZvaWQJCWFoZF91cGRhdGVfbmVnX3RhYmxlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgICAgc3RydWN0IGFoZF90cmFuc2luZm8gKnRpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGRfdXBkYXRlX3BlbmRpbmdfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoZF9zY2JfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyB2b2lkCQlhaGRfc2V0dXBfaW5pdGlhdG9yX21zZ291dChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIHZvaWQJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGRfY29uc3RydWN0X3NkdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkCQlhaGRfY29uc3RydWN0X3dkdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgIHVfaW50IGJ1c193aWR0aCk7CitzdGF0aWMgdm9pZAkJYWhkX2NvbnN0cnVjdF9wcHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICB1X2ludCBwZXJpb2QsIHVfaW50IG9mZnNldCwKKwkJCQkJICB1X2ludCBidXNfd2lkdGgsIHVfaW50IHBwcl9vcHRpb25zKTsKK3N0YXRpYyB2b2lkCQlhaGRfY2xlYXJfbXNnX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV9tZXNzYWdlX3BoYXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit0eXBlZGVmIGVudW0geworCUFIRE1TR18xQiwKKwlBSERNU0dfMkIsCisJQUhETVNHX0VYVAorfSBhaGRfbXNndHlwZTsKK3N0YXRpYyBpbnQJCWFoZF9zZW50X21zZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tc2d0eXBlIHR5cGUsCisJCQkJICAgICB1X2ludCBtc2d2YWwsIGludCBmdWxsKTsKK3N0YXRpYyBpbnQJCWFoZF9wYXJzZV9tc2coc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgaW50CQlhaGRfaGFuZGxlX21zZ19yZWplY3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoZF9oYW5kbGVfaWduX3dpZGVfcmVzaWR1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoZF9yZWluaXRpYWxpemVfZGF0YXB0cnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfaGFuZGxlX2RldnJlc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgIHVfaW50IGx1biwgY2FtX3N0YXR1cyBzdGF0dXMsCisJCQkJCSAgICBjaGFyICptZXNzYWdlLCBpbnQgdmVyYm9zZV9sZXZlbCk7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAkJYWhkX3NldHVwX3RhcmdldF9tc2dpbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOworI2VuZGlmCisKK3N0YXRpYyB1X2ludAkJYWhkX3NnbGlzdF9zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdV9pbnQJCWFoZF9zZ2xpc3RfYWxsb2NzaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgYnVzX2RtYW1hcF9jYWxsYmFja190CisJCQlhaGRfZG1hbWFwX2NiOyAKK3N0YXRpYyB2b2lkCQlhaGRfaW5pdGlhbGl6ZV9oc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIGludAkJYWhkX2luaXRfc2NiZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9maW5pX3NjYmRhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfc2V0dXBfaW9jZWxsX3dvcmthcm91bmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfaW9jZWxsX2ZpcnN0X3NlbGVjdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9hZGRfY29sX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgc3RydWN0IHNjYiAqc2NiLCB1X2ludCBjb2xfaWR4KTsKK3N0YXRpYyB2b2lkCQlhaGRfcmVtX2NvbF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhkX2NoaXBfaW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJCWFoZF9xaW5maWZvX3JlcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgc3RydWN0IHNjYiAqcHJldl9zY2IsCisJCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIGludAkJYWhkX3FpbmZpZm9fY291bnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBpbnQJCWFoZF9zZWFyY2hfc2NiX2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdGFyZ2V0LAorCQkJCQkgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJCSAgICByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkJCQkgICAgYWhkX3NlYXJjaF9hY3Rpb24gYWN0aW9uLAorCQkJCQkgICAgdV9pbnQgKmxpc3RfaGVhZCwgdV9pbnQgdGlkKTsKK3N0YXRpYyB2b2lkCQlhaGRfc3RpdGNoX3RpZF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHVfaW50IHRpZF9wcmV2LCB1X2ludCB0aWRfY3VyLAorCQkJCQkgICAgdV9pbnQgdGlkX25leHQpOworc3RhdGljIHZvaWQJCWFoZF9hZGRfc2NiX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgdV9pbnQgc2NiaWQpOworc3RhdGljIHVfaW50CQlhaGRfcmVtX3dzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBzY2JpZCwKKwkJCQkgICAgIHVfaW50IHByZXYsIHVfaW50IG5leHQsIHVfaW50IHRpZCk7CitzdGF0aWMgdm9pZAkJYWhkX3Jlc2V0X2N1cnJlbnRfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgYWhkX2NhbGxiYWNrX3QJYWhkX3Jlc2V0X3BvbGw7CitzdGF0aWMgYWhkX2NhbGxiYWNrX3QJYWhkX3N0YXRfdGltZXI7CisjaWZkZWYgQUhEX0RVTVBfU0VRCitzdGF0aWMgdm9pZAkJYWhkX2R1bXBzZXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJCWFoZF9sb2Fkc2VxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgaW50CQlhaGRfY2hlY2tfcGF0Y2goc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQlzdHJ1Y3QgcGF0Y2ggKipzdGFydF9wYXRjaCwKKwkJCQkJdV9pbnQgc3RhcnRfaW5zdHIsIHVfaW50ICpza2lwX2FkZHIpOworc3RhdGljIHVfaW50CQlhaGRfcmVzb2x2ZV9zZXFhZGRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHVfaW50IGFkZHJlc3MpOworc3RhdGljIHZvaWQJCWFoZF9kb3dubG9hZF9pbnN0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgIHVfaW50IGluc3RycHRyLCB1aW50OF90ICpkY29uc3RzKTsKK3N0YXRpYyBpbnQJCWFoZF9wcm9iZV9zdGFja19zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgaW50CQlhaGRfc2NiX2FjdGl2ZV9pbl9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhkX3J1bl9kYXRhX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKK3N0YXRpYyB2b2lkCQlhaGRfcXVldWVfbHN0YXRlX2V2ZW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICpsc3RhdGUsCisJCQkJCSAgICAgICB1X2ludCBpbml0aWF0b3JfaWQsCisJCQkJCSAgICAgICB1X2ludCBldmVudF90eXBlLAorCQkJCQkgICAgICAgdV9pbnQgZXZlbnRfYXJnKTsKK3N0YXRpYyB2b2lkCQlhaGRfdXBkYXRlX3Njc2lpZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgdV9pbnQgdGFyZ2lkX21hc2spOworc3RhdGljIGludAkJYWhkX2hhbmRsZV90YXJnZXRfY21kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgc3RydWN0IHRhcmdldF9jbWQgKmNtZCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByaXZhdGUgSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9hc3NlcnRfYXRuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgaW50CWFoZF9jdXJyZW50bHlfcGFja2V0aXplZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIGludAlhaGRfc2V0X2FjdGl2ZV9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfYXNzZXJ0X2F0bihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgQVROTyk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYXMgYSBwYWNrZXRpemVkCisgKiBhZ3JlZW1lbnQuICBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB3ZQorICogYXJlIGN1cnJlbnRseSBpbiBhIHBhY2tldGl6ZWQgdHJhbnNmZXIuICBXZSBjb3VsZAorICoganVzdCBhcyBlYXNpbHkgYmUgc2VuZGluZyBvciByZWNlaXZpbmcgYSBtZXNzYWdlLgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CithaGRfY3VycmVudGx5X3BhY2tldGl6ZWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWFoZF9tb2RlX3N0YXRlCSBzYXZlZF9tb2RlczsKKwlpbnQJCSBwYWNrZXRpemVkOworCisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWlmICgoYWhkLT5idWdzICYgQUhEX1BLVElaRURfU1RBVFVTX0JVRykgIT0gMCkgeworCQkvKgorCQkgKiBUaGUgcGFja2V0aXplZCBiaXQgcmVmZXJzIHRvIHRoZSBsYXN0CisJCSAqIGNvbm5lY3Rpb24sIG5vdCB0aGUgY3VycmVudCBvbmUuICBDaGVjaworCQkgKiBmb3Igbm9uLXplcm8gTFFJU1RBVEUgaW5zdGVhZC4KKwkJICovCisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCXBhY2tldGl6ZWQgPSBhaGRfaW5iKGFoZCwgTFFJU1RBVEUpICE9IDA7CisJfSBlbHNlIHsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCQlwYWNrZXRpemVkID0gYWhkX2luYihhaGQsIExRSVNUQVQyKSAmIFBBQ0tFVElaRUQ7CisJfQorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCXJldHVybiAocGFja2V0aXplZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoZF9zZXRfYWN0aXZlX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IGFjdGl2ZV9maWZvOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJYWN0aXZlX2ZpZm8gPSBhaGRfaW5iKGFoZCwgREZGU1RBVCkgJiBDVVJSRklGTzsKKwlzd2l0Y2ggKGFjdGl2ZV9maWZvKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJYWhkX3NldF9tb2RlcyhhaGQsIGFjdGl2ZV9maWZvLCBhY3RpdmVfZmlmbyk7CisJCXJldHVybiAoMSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVzdGFydCB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZnJvbSBhZGRyZXNzIHplcm8KKyAqLwordm9pZAorYWhkX3Jlc3RhcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCisJYWhkX3BhdXNlKGFoZCk7CisKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisKKwkvKiBObyBtb3JlIHBlbmRpbmcgbWVzc2FnZXMgKi8KKwlhaGRfY2xlYXJfbXNnX3N0YXRlKGFoZCk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgMCk7CQkvKiBEZS1hc3NlcnQgQlNZICovCisJYWhkX291dGIoYWhkLCBNU0dfT1VULCBNU0dfTk9PUCk7CS8qIE5vIG1lc3NhZ2UgdG8gc2VuZCAqLworCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDEsIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMSkgJiB+QklUQlVDS0VUKTsKKwlhaGRfb3V0YihhaGQsIFNFUUlOVENUTCwgMCk7CisJYWhkX291dGIoYWhkLCBMQVNUUEhBU0UsIFBfQlVTRlJFRSk7CisJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MsIDApOworCWFoZF9vdXRiKGFoZCwgU0FWRURfU0NTSUlELCAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNBVkVEX0xVTiwgMHhGRik7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBzZXF1ZW5jZXIncyBpZGVhIG9mIFRRSU5QT1MKKwkgKiBtYXRjaGVzIG91ciBvd24uICBUaGUgc2VxdWVuY2VyIGluY3JlbWVudHMgVFFJTlBPUworCSAqIG9ubHkgYWZ0ZXIgaXQgc2VlcyBhIERNQSBjb21wbGV0ZSBhbmQgYSByZXNldCBjb3VsZAorCSAqIG9jY3VyIGJlZm9yZSB0aGUgaW5jcmVtZW50IGxlYXZpbmcgdGhlIGtlcm5lbCB0byBiZWxpZXZlCisJICogdGhlIGNvbW1hbmQgYXJyaXZlZCBidXQgdGhlIHNlcXVlbmNlciB0byBub3QuCisJICovCisJYWhkX291dGIoYWhkLCBUUUlOUE9TLCBhaGQtPnRxaW5maWZvbmV4dCk7CisKKwkvKiBBbHdheXMgYWxsb3cgcmVzZWxlY3Rpb24gKi8KKwlhaGRfb3V0YihhaGQsIFNDU0lTRVExLAorCQkgYWhkX2luYihhaGQsIFNDU0lTRVFfVEVNUExBVEUpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0NIQU4sIEFIRF9NT0RFX0NDSEFOKTsKKwlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIEZBU1RNT0RFfFNFUVJFU0VUKTsKKwlhaGRfdW5wYXVzZShhaGQpOworfQorCit2b2lkCithaGRfY2xlYXJfZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGZpZm8pCit7CisJYWhkX21vZGVfc3RhdGUJIHNhdmVkX21vZGVzOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19GSUZPUykgIT0gMCkKKwkJcHJpbnRmKCIlczogQ2xlYXJpbmcgRklGTyAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZmlmbyk7CisjZW5kaWYKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIGZpZm8sIGZpZm8pOworCWFoZF9vdXRiKGFoZCwgREZGU1hGUkNUTCwgUlNUQ0hOfENMUlNIQ05UKTsKKwlpZiAoKGFoZF9pbmIoYWhkLCBTR19TVEFURSkgJiBGRVRDSF9JTlBST0cpICE9IDApCisJCWFoZF9vdXRiKGFoZCwgQ0NTR0NUTCwgQ0NTR1JFU0VUKTsKKwlhaGRfb3V0YihhaGQsIExPTkdKTVBfQUREUiArIDEsIElOVkFMSURfQUREUik7CisJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIElucHV0L091dHB1dCBRdWV1ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRmx1c2ggYW5kIGNvbXBsZXRlZCBjb21tYW5kcyB0aGF0IGFyZSBzaXR0aW5nIGluIHRoZSBjb21tYW5kCisgKiBjb21wbGV0ZSBxdWV1ZXMgZG93biBvbiB0aGUgY2hpcCBidXQgaGF2ZSB5ZXQgdG8gYmUgZG1hJ2VkIGJhY2sgdXAuCisgKi8KK3ZvaWQKK2FoZF9mbHVzaF9xb3V0ZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0CQlzY2IgKnNjYjsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJc2F2ZWRfc2NicHRyOworCXVfaW50CQljY3NjYmN0bDsKKwl1X2ludAkJc2NiaWQ7CisJdV9pbnQJCW5leHRfc2NiaWQ7CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisKKwkvKgorCSAqIENvbXBsZXRlIGFueSBTQ0JzIHRoYXQganVzdCBmaW5pc2hlZCBiZWluZworCSAqIERNQSdlZCBpbnRvIHRoZSBxb3V0Zmlmby4KKwkgKi8KKwlhaGRfcnVuX3FvdXRmaWZvKGFoZCk7CisKKwkvKgorCSAqIEZsdXNoIHRoZSBnb29kIHN0YXR1cyBGSUZPIGZvciBjb21wZWx0ZWQgcGFja2V0aXplZCBjb21tYW5kcy4KKwkgKi8KKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJc2F2ZWRfc2NicHRyID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwl3aGlsZSAoKGFoZF9pbmIoYWhkLCBMUUlTVEFUMikgJiBMUUlHU0FWQUlMKSAhPSAwKSB7CisJCXVfaW50IGZpZm9fbW9kZTsKKwkJdV9pbnQgaTsKKwkJCisJCXNjYmlkID0gKGFoZF9pbmIoYWhkLCBHU0ZJRk8rMSkgPDwgOCkKKwkJICAgICAgfCBhaGRfaW5iKGFoZCwgR1NGSUZPKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogV2FybmluZyAtIEdTRklGTyBTQ0IgJWQgaW52YWxpZFxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBEZXRlcm1pbmUgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBzdGlsbCBhY3RpdmUgaW4KKwkJICogYW55IEZJRk8uICBJZiBpdCBpcywgd2UgbXVzdCBmbHVzaCB0aGF0IEZJRk8gdG8KKwkJICogdGhlIGhvc3QgYmVmb3JlIGNvbXBsZXRpbmcgdGhlICBjb21tYW5kLgorCQkgKi8KKwkJZmlmb19tb2RlID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJLyogVG9nZ2xlIHRvIHRoZSBvdGhlciBtb2RlLiAqLworCQkJZmlmb19tb2RlIF49IDE7CisJCQlhaGRfc2V0X21vZGVzKGFoZCwgZmlmb19tb2RlLCBmaWZvX21vZGUpOworCQkJaWYgKGFoZF9zY2JfYWN0aXZlX2luX2ZpZm8oYWhkLCBzY2IpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWFoZF9ydW5fZGF0YV9maWZvKGFoZCwgc2NiKTsKKworCQkJLyoKKwkJCSAqIENsZWFyaW5nIHRoaXMgdHJhbnNhY3Rpb24gaW4gdGhpcyBGSUZPIG1heQorCQkJICogY2F1c2UgYSBDRkc0REFUQSBmb3IgdGhpcyBzYW1lIHRyYW5zYWN0aW9uCisJCQkgKiB0byBhc3NlcnQgaW4gdGhlIG90aGVyIEZJRk8uICBNYWtlIHN1cmUgd2UKKwkJCSAqIGxvb3Agb25lIG1vcmUgdGltZSBhbmQgY2hlY2sgdGhlIG90aGVyIEZJRk8uCisJCQkgKi8KKwkJCWkgPSAwOworCQl9CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCWlmICgoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpICYgU0dfTElTVF9OVUxMKSA9PSAwCisJCSAmJiAoKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSAmIFNHX0ZVTExfUkVTSUQpICE9IDAKKwkJICB8fCAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIpCisJCSAgICAgICYgU0dfTElTVF9OVUxMKSAhPSAwKSkgeworCQkJdV9pbnQgY29tcF9oZWFkOworCisJCQkvKgorCQkJICogVGhlIHRyYW5zZmVyIGNvbXBsZXRlZCB3aXRoIGEgcmVzaWR1YWwuCisJCQkgKiBQbGFjZSB0aGlzIFNDQiBvbiB0aGUgY29tcGxldGUgRE1BIGxpc3QKKwkJCSAqIHNvIHRoYXQgd2UgVXBkYXRlIG91ciBpbi1jb3JlIGNvcHkgb2YgdGhlCisJCQkgKiBTQ0IgYmVmb3JlIGNvbXBsZXRpbmcgdGhlIGNvbW1hbmQuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1NDU0lfU1RBVFVTLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1NHUFRSLAorCQkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9TR1BUUikKKwkJCQkgfCBTR19TVEFUVVNfVkFMSUQpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfVEFHLCBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJCWNvbXBfaGVhZCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVF9DT01QTEVURSwgY29tcF9oZWFkKTsKKwkJCWlmIChTQ0JJRF9JU19OVUxMKGNvbXBfaGVhZCkpCisJCQkJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsCisJCQkJCSBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJfSBlbHNlCisJCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwl9CisJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JwdHIpOworCisJLyoKKwkgKiBTZXR1cCBmb3IgY29tbWFuZCBjaGFubmVsIHBvcnRpb24gb2YgZmx1c2guCisJICovCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIFdhaXQgZm9yIGFueSBpbnByb2dyZXNzIERNQSB0byBjb21wbGV0ZSBhbmQgY2xlYXIgRE1BIHN0YXRlCisJICogaWYgdGhpcyBpZiBmb3IgYW4gU0NCIGluIHRoZSBxaW5maWZvLgorCSAqLworCXdoaWxlICgoKGNjc2NiY3RsID0gYWhkX2luYihhaGQsIENDU0NCQ1RMKSkgJiAoQ0NBUlJFTnxDQ1NDQkVOKSkgIT0gMCkgeworCisJCWlmICgoY2NzY2JjdGwgJiAoQ0NTQ0JESVJ8Q0NBUlJFTikpID09IChDQ1NDQkRJUnxDQ0FSUkVOKSkgeworCQkJaWYgKChjY3NjYmN0bCAmIEFSUkRPTkUpICE9IDApCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKGNjc2NiY3RsICYgQ0NTQ0JET05FKSAhPSAwKQorCQkJYnJlYWs7CisJCWFoZF9kZWxheSgyMDApOworCX0KKwlpZiAoKGNjc2NiY3RsICYgQ0NTQ0JESVIpICE9IDApCisJCWFoZF9vdXRiKGFoZCwgQ0NTQ0JDVEwsIGNjc2NiY3RsICYgfihDQ0FSUkVOfENDU0NCRU4pKTsKKworCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJLyoKKwkgKiBNYW51YWxseSB1cGRhdGUvY29tcGxldGUgYW55IGNvbXBsZXRlZCBTQ0JzIHRoYXQgYXJlIHdhaXRpbmcgdG8gYmUKKwkgKiBETUEnZWQgYmFjayB1cCB0byB0aGUgaG9zdC4KKwkgKi8KKwlzY2JpZCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQpOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JpZCkpIHsKKwkJdWludDhfdCAqaHNjYl9wdHI7CisJCXVfaW50CSBpOworCQkKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCW5leHRfc2NiaWQgPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogV2FybmluZyAtIERNQS11cCBhbmQgY29tcGxldGUgIgorCQkJICAgICAgICJTQ0IgJWQgaW52YWxpZFxuIiwgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJY29udGludWU7CisJCX0KKwkJaHNjYl9wdHIgPSAodWludDhfdCAqKXNjYi0+aHNjYjsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiKTsgaSsrKQorCQkJKmhzY2JfcHRyKysgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgaSk7CisKKwkJYWhkX2NvbXBsZXRlX3NjYihhaGQsIHNjYik7CisJCXNjYmlkID0gbmV4dF9zY2JpZDsKKwl9CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOworCisJc2NiaWQgPSBhaGRfaW53KGFoZCwgQ09NUExFVEVfU0NCX0hFQUQpOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JpZCkpIHsKKworCQlhaGRfc2V0X3NjYnB0cihhaGQsIHNjYmlkKTsKKwkJbmV4dF9zY2JpZCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBXYXJuaW5nIC0gQ29tcGxldGUgU0NCICVkIGludmFsaWRcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJY29udGludWU7CisJCX0KKworCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwkJc2NiaWQgPSBuZXh0X3NjYmlkOworCX0KKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9IRUFELCBTQ0JfTElTVF9OVUxMKTsKKworCS8qCisJICogUmVzdG9yZSBzdGF0ZS4KKwkgKi8KKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkX3NjYnB0cik7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7CisJYWhkLT5mbGFncyB8PSBBSERfVVBEQVRFX1BFTkRfQ01EUzsKK30KKworLyoKKyAqIERldGVybWluZSBpZiBhbiBTQ0IgZm9yIGEgcGFja2V0aXplZCB0cmFuc2FjdGlvbgorICogaXMgYWN0aXZlIGluIGEgRklGTy4KKyAqLworc3RhdGljIGludAorYWhkX3NjYl9hY3RpdmVfaW5fZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKworCS8qCisJICogVGhlIEZJRk8gaXMgb25seSBhY3RpdmUgZm9yIG91ciB0cmFuc2FjdGlvbiBpZgorCSAqIHRoZSBTQ0JQVFIgbWF0Y2hlcyB0aGUgU0NCJ3MgSUQgYW5kIHRoZSBmaXJtd2FyZQorCSAqIGhhcyBpbnN0YWxsZWQgYSBoYW5kbGVyIGZvciB0aGUgRklGTyBvciB3ZSBoYXZlCisJICogYSBwZW5kaW5nIFNBVkVQVFJTIG9yIENGRzREQVRBIGludGVycnVwdC4KKwkgKi8KKwlpZiAoYWhkX2dldF9zY2JwdHIoYWhkKSAhPSBTQ0JfR0VUX1RBRyhzY2IpCisJIHx8ICgoYWhkX2luYihhaGQsIExPTkdKTVBfQUREUisxKSAmIElOVkFMSURfQUREUikgIT0gMAorCSAgJiYgKGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpICYgKENGRzREQVRBfFNBVkVQVFJTKSkgPT0gMCkpCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogUnVuIGEgZGF0YSBmaWZvIHRvIGNvbXBsZXRpb24gZm9yIGEgdHJhbnNhY3Rpb24gd2Uga25vdworICogaGFzIGNvbXBsZXRlZCBhY3Jvc3MgdGhlIFNDU0kgYnVzIChnb29kIHN0YXR1cyBoYXMgYmVlbgorICogcmVjZWl2ZWQpLiAgV2UgYXJlIGFscmVhZHkgc2V0IHRvIHRoZSBjb3JyZWN0IEZJRk8gbW9kZQorICogb24gZW50cnkgdG8gdGhpcyByb3V0aW5lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gb3BlcmF0ZSBleGFjdGx5IGFzIHRoZSBmaXJtd2FyZQorICogd291bGQgd2hlbiBydW5uaW5nIHRoaXMgRklGTy4gIENhcmUgbXVzdCBiZSB0YWtlbiB0byB1cGRhdGUKKyAqIHRoaXMgcm91dGluZSBhbnkgdGltZSB0aGUgZmlybXdhcmUncyBGSUZPIGFsZ29yaXRobSBpcworICogY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9ydW5fZGF0YV9maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVfaW50IHNlcWludHNyYzsKKworCXdoaWxlICgxKSB7CisJCXNlcWludHNyYyA9IGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpOworCQlpZiAoKHNlcWludHNyYyAmIENGRzREQVRBKSAhPSAwKSB7CisJCQl1aW50MzJfdCBkYXRhY250OworCQkJdWludDMyX3Qgc2dwdHI7CisKKwkJCS8qCisJCQkgKiBDbGVhciBmdWxsIHJlc2lkdWFsIGZsYWcuCisJCQkgKi8KKwkJCXNncHRyID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfU0dQVFIpICYgflNHX0ZVTExfUkVTSUQ7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9TR1BUUiwgc2dwdHIpOworCisJCQkvKgorCQkJICogTG9hZCBkYXRhY250IGFuZCBhZGRyZXNzLgorCQkJICovCisJCQlkYXRhY250ID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfREFUQUNOVCk7CisJCQlpZiAoKGRhdGFjbnQgJiBBSERfRE1BX0xBU1RfU0VHKSAhPSAwKSB7CisJCQkJc2dwdHIgfD0gTEFTVF9TRUc7CisJCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJCQl9IGVsc2UKKwkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7CisJCQlhaGRfb3V0cShhaGQsIEhBRERSLCBhaGRfaW5xX3NjYnJhbShhaGQsIFNDQl9EQVRBUFRSKSk7CisJCQlhaGRfb3V0bChhaGQsIEhDTlQsIGRhdGFjbnQgJiBBSERfU0dfTEVOX01BU0spOworCQkJYWhkX291dGIoYWhkLCBTR19DQUNIRV9QUkUsIHNncHRyKTsKKwkJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgUFJFTE9BREVOfFNDU0lFTnxIRE1BRU4pOworCisJCQkvKgorCQkJICogSW5pdGlhbGl6ZSBSZXNpZHVhbCBGaWVsZHMuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQrMywgZGF0YWNudCA+PiAyNCk7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIgJiBTR19QVFJfTUFTSyk7CisKKwkJCS8qCisJCQkgKiBNYXJrIHRoZSBTQ0IgYXMgaGF2aW5nIGEgRklGTyBpbiB1c2UuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5ULAorCQkJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkgKyAxKTsKKworCQkJLyoKKwkJCSAqIEluc3RhbGwgYSAiZmFrZSIgaGFuZGxlciBmb3IgdGhpcyBGSUZPLgorCQkJICovCisJCQlhaGRfb3V0dyhhaGQsIExPTkdKTVBfQUREUiwgMCk7CisKKwkJCS8qCisJCQkgKiBOb3RpZnkgdGhlIGhhcmR3YXJlIHRoYXQgd2UgaGF2ZSBzYXRpc2ZpZWQKKwkJCSAqIHRoaXMgc2VxdWVuY2VyIGludGVycnVwdC4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBDTFJTRVFJTlRTUkMsIENMUkNGRzREQVRBKTsKKwkJfSBlbHNlIGlmICgoc2VxaW50c3JjICYgU0FWRVBUUlMpICE9IDApIHsKKwkJCXVpbnQzMl90IHNncHRyOworCQkJdWludDMyX3QgcmVzaWQ7CisKKwkJCWlmICgoYWhkX2luYihhaGQsIExPTkdKTVBfQUREUisxKSZJTlZBTElEX0FERFIpICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIFNuYXBzaG90IFNhdmUgUG9pbnRlcnMuICBDbGVhcgorCQkJCSAqIHRoZSBzbmFwc2hvdCBhbmQgY29udGludWUuCisJCQkJICovCisJCQkJYWhkX291dGIoYWhkLCBERkZTWEZSQ1RMLCBDTFJDSE4pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRGlzYWJsZSBTL0cgZmV0Y2ggc28gdGhlIERNQSBlbmdpbmUKKwkJCSAqIGlzIGF2YWlsYWJsZSB0byBmdXR1cmUgdXNlcnMuCisJCQkgKi8KKwkJCWlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIEZFVENIX0lOUFJPRykgIT0gMCkKKwkJCQlhaGRfb3V0YihhaGQsIENDU0dDVEwsIDApOworCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisKKwkJCS8qCisJCQkgKiBGbHVzaCB0aGUgZGF0YSBGSUZPLiAgU3RyaWNrbHkgb25seQorCQkJICogbmVjZXNzYXJ5IGZvciBSZXYgQSBwYXJ0cy4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLAorCQkJCSBhaGRfaW5iKGFoZCwgREZDTlRSTCkgfCBGSUZPRkxVU0gpOworCisJCQkvKgorCQkJICogQ2FsY3VsYXRlIHJlc2lkdWFsLgorCQkJICovCisJCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCXJlc2lkID0gYWhkX2lubChhaGQsIFNIQ05UKTsKKwkJCXJlc2lkIHw9CisJCQkgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCszKSA8PCAyNDsKKwkJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIHJlc2lkKTsKKwkJCWlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykgJiBMQVNUX1NFRykgPT0gMCkgeworCQkJCS8qCisJCQkJICogTXVzdCBiYWNrIHVwIHRvIHRoZSBjb3JyZWN0IFMvRyBlbGVtZW50LgorCQkJCSAqIFR5cGljYWxseSB0aGlzIGp1c3QgbWVhbnMgcmVzZXR0aW5nIG91cgorCQkJCSAqIGxvdyBieXRlIHRvIHRoZSBvZmZzZXQgaW4gdGhlIFNHX0NBQ0hFLAorCQkJCSAqIGJ1dCBpZiB3ZSB3cmFwcGVkLCB3ZSBoYXZlIHRvIGNvcnJlY3QKKwkJCQkgKiB0aGUgb3RoZXIgYnl0ZXMgb2YgdGhlIHNncHRyIHRvby4KKwkJCQkgKi8KKwkJCQlpZiAoKGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpICYgMHg4MCkgIT0gMAorCQkJCSAmJiAoc2dwdHIgJiAweDgwKSA9PSAwKQorCQkJCQlzZ3B0ciAtPSAweDEwMDsKKwkJCQlzZ3B0ciAmPSB+MHhGRjsKKwkJCQlzZ3B0ciB8PSBhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKQorCQkJCSAgICAgICAmIFNHX0FERFJfTUFTSzsKKwkJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIpOworCQkJCWFoZF9vdXRiKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQgKyAzLCAwKTsKKwkJCX0gZWxzZSBpZiAoKHJlc2lkICYgQUhEX1NHX0xFTl9NQVNLKSA9PSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIsCisJCQkJCSBzZ3B0ciB8IFNHX0xJU1RfTlVMTCk7CisJCQl9CisJCQkvKgorCQkJICogU2F2ZSBQb2ludGVycy4KKwkJCSAqLworCQkJYWhkX291dHEoYWhkLCBTQ0JfREFUQVBUUiwgYWhkX2lucShhaGQsIFNIQUREUikpOworCQkJYWhkX291dGwoYWhkLCBTQ0JfREFUQUNOVCwgcmVzaWQpOworCQkJYWhkX291dGwoYWhkLCBTQ0JfU0dQVFIsIHNncHRyKTsKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSU0VRSU5UU1JDLCBDTFJTQVZFUFRSUyk7CisJCQlhaGRfb3V0YihhaGQsIFNFUUlNT0RFLAorCQkJCSBhaGRfaW5iKGFoZCwgU0VRSU1PREUpIHwgRU5TQVZFUFRSUyk7CisJCQkvKgorCQkJICogSWYgdGhlIGRhdGEgaXMgdG8gdGhlIFNDU0kgYnVzLCB3ZSBhcmUKKwkJCSAqIGRvbmUsIG90aGVyd2lzZSB3YWl0IGZvciBGSUZPRU1QLgorCQkJICovCisJCQlpZiAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIERJUkVDVElPTikgIT0gMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX1NUQVRFKSAmIExPQURJTkdfTkVFREVEKSAhPSAwKSB7CisJCQl1aW50MzJfdCBzZ3B0cjsKKwkJCXVpbnQ2NF90IGRhdGFfYWRkcjsKKwkJCXVpbnQzMl90IGRhdGFfbGVuOworCQkJdV9pbnQJIGRmY250cmw7CisKKwkJCS8qCisJCQkgKiBEaXNhYmxlIFMvRyBmZXRjaCBzbyB0aGUgRE1BIGVuZ2luZQorCQkJICogaXMgYXZhaWxhYmxlIHRvIGZ1dHVyZSB1c2Vycy4KKwkJCSAqLworCQkJaWYgKChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpICYgRkVUQ0hfSU5QUk9HKSAhPSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBDQ1NHQ1RMLCAwKTsKKwkJCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCBMT0FESU5HX05FRURFRCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciB0aGUgRE1BIGVuZ2luZSB0byBub3RpY2UgdGhhdCB0aGUKKwkJCSAqIGhvc3QgdHJhbnNmZXIgaXMgZW5hYmxlZCBhbmQgdGhhdCB0aGVyZSBpcworCQkJICogc3BhY2UgaW4gdGhlIFMvRyBGSUZPIGZvciBuZXcgc2VnbWVudHMgYmVmb3JlCisJCQkgKiBsb2FkaW5nIG1vcmUgc2VnbWVudHMuCisJCQkgKi8KKwkJCWlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIFBSRUxPQURfQVZBSUwpID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIEhETUFFTkFDSykgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIERldGVybWluZSB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IFMvRworCQkJICogZWxlbWVudCB0byBsb2FkLgorCQkJICovCisJCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCXNncHRyICY9IFNHX1BUUl9NQVNLOworCQkJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCQlzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqc2c7CisKKwkJCQlzZyA9IGFoZF9zZ19idXNfdG9fdmlydChhaGQsIHNjYiwgc2dwdHIpOworCQkJCWRhdGFfYWRkciA9IHNnLT5hZGRyOworCQkJCWRhdGFfbGVuID0gc2ctPmxlbjsKKwkJCQlzZ3B0ciArPSBzaXplb2YoKnNnKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0CWFoZF9kbWFfc2VnICpzZzsKKworCQkJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisJCQkJZGF0YV9hZGRyID0gc2ctPmxlbiAmIEFIRF9TR19ISUdIX0FERFJfTUFTSzsKKwkJCQlkYXRhX2FkZHIgPDw9IDg7CisJCQkJZGF0YV9hZGRyIHw9IHNnLT5hZGRyOworCQkJCWRhdGFfbGVuID0gc2ctPmxlbjsKKwkJCQlzZ3B0ciArPSBzaXplb2YoKnNnKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVwZGF0ZSByZXNpZHVhbCBpbmZvcm1hdGlvbi4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCszLCBkYXRhX2xlbiA+PiAyNCk7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiwgc2dwdHIpOworCisJCQkvKgorCQkJICogTG9hZCB0aGUgUy9HLgorCQkJICovCisJCQlpZiAoZGF0YV9sZW4gJiBBSERfRE1BX0xBU1RfU0VHKSB7CisJCQkJc2dwdHIgfD0gTEFTVF9TRUc7CisJCQkJYWhkX291dGIoYWhkLCBTR19TVEFURSwgMCk7CisJCQl9CisJCQlhaGRfb3V0cShhaGQsIEhBRERSLCBkYXRhX2FkZHIpOworCQkJYWhkX291dGwoYWhkLCBIQ05ULCBkYXRhX2xlbiAmIEFIRF9TR19MRU5fTUFTSyk7CisJCQlhaGRfb3V0YihhaGQsIFNHX0NBQ0hFX1BSRSwgc2dwdHIgJiAweEZGKTsKKworCQkJLyoKKwkJCSAqIEFkdmVydGlzZSB0aGUgc2VnbWVudCB0byB0aGUgaGFyZHdhcmUuCisJCQkgKi8KKwkJCWRmY250cmwgPSBhaGRfaW5iKGFoZCwgREZDTlRSTCl8UFJFTE9BREVOfEhETUFFTjsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9ORVdfREZDTlRSTF9PUFRTKSE9MCkgeworCQkJCS8qCisJCQkJICogVXNlIFNDU0lFTldSRElTIHNvIHRoYXQgU0NTSUVOCisJCQkJICogaXMgbmV2ZXIgbW9kaWZpZWQgYnkgdGhpcworCQkJCSAqIG9wZXJhdGlvbi4KKwkJCQkgKi8KKwkJCQlkZmNudHJsIHw9IFNDU0lFTldSRElTOworCQkJfQorCQkJYWhkX291dGIoYWhkLCBERkNOVFJMLCBkZmNudHJsKTsKKwkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIFNHX0NBQ0hFX1NIQURPVykKKwkJCSAmIExBU1RfU0VHX0RPTkUpICE9IDApIHsKKworCQkJLyoKKwkJCSAqIFRyYW5zZmVyIGNvbXBsZXRlZCB0byB0aGUgZW5kIG9mIFNHIGxpc3QKKwkJCSAqIGFuZCBoYXMgZmx1c2hlZCB0byB0aGUgaG9zdC4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfU0dQVFIsCisJCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSB8IFNHX0xJU1RfTlVMTCk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoYWhkX2luYihhaGQsIERGU1RBVFVTKSAmIEZJRk9FTVApICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWFoZF9kZWxheSgyMDApOworCX0KKwkvKgorCSAqIENsZWFyIGFueSBoYW5kbGVyIGZvciB0aGlzIEZJRk8sIGRlY3JlbWVudAorCSAqIHRoZSBGSUZPIHVzZSBjb3VudCBmb3IgdGhlIFNDQiwgYW5kIHJlbGVhc2UKKwkgKiB0aGUgRklGTy4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIExPTkdKTVBfQUREUiArIDEsIElOVkFMSURfQUREUik7CisJYWhkX291dGIoYWhkLCBTQ0JfRklGT19VU0VfQ09VTlQsCisJCSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9GSUZPX1VTRV9DT1VOVCkgLSAxKTsKKwlhaGRfb3V0YihhaGQsIERGRlNYRlJDVEwsIENMUkNITik7Cit9CisKK3ZvaWQKK2FoZF9ydW5fcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKwl1X2ludCAgc2NiX2luZGV4OworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JVTk5JTkdfUU9VVEZJRk8pICE9IDApCisJCXBhbmljKCJhaGRfcnVuX3FvdXRmaWZvIHJlY3Vyc2lvbiIpOworCWFoZC0+ZmxhZ3MgfD0gQUhEX1JVTk5JTkdfUU9VVEZJRk87CisJYWhkX3N5bmNfcW91dGZpZm8oYWhkLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJd2hpbGUgKChhaGQtPnFvdXRmaWZvW2FoZC0+cW91dGZpZm9uZXh0XQorCSAgICAgJiBRT1VURklGT19FTlRSWV9WQUxJRF9MRSkgPT0gYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnKSB7CisKKwkJc2NiX2luZGV4ID0gYWhkX2xlMTZ0b2goYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0KKwkJCQkgICAgICAmIH5RT1VURklGT19FTlRSWV9WQUxJRF9MRSk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBXQVJOSU5HIG5vIGNvbW1hbmQgZm9yIHNjYiAlZCAiCisJCQkgICAgICAgIihjbWRjbXBsdClcblFPVVRQT1MgPSAlZFxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JfaW5kZXgsCisJCQkgICAgICAgYWhkLT5xb3V0Zmlmb25leHQpOworCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQl9IGVsc2UKKwkJCWFoZF9jb21wbGV0ZV9zY2IoYWhkLCBzY2IpOworCisJCWFoZC0+cW91dGZpZm9uZXh0ID0gKGFoZC0+cW91dGZpZm9uZXh0KzEpICYgKEFIRF9RT1VUX1NJWkUtMSk7CisJCWlmIChhaGQtPnFvdXRmaWZvbmV4dCA9PSAwKQorCQkJYWhkLT5xb3V0Zmlmb25leHRfdmFsaWRfdGFnIF49IFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFOworCX0KKwlhaGQtPmZsYWdzICY9IH5BSERfUlVOTklOR19RT1VURklGTzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FoZF9oYW5kbGVfaHdlcnJpbnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCS8qCisJICogU29tZSBjYXRhc3Ryb3BoaWMgaGFyZHdhcmUgZXJyb3IgaGFzIG9jY3VycmVkLgorCSAqIFByaW50IGl0IGZvciB0aGUgdXNlciBhbmQgZGlzYWJsZSB0aGUgY29udHJvbGxlci4KKwkgKi8KKwlpbnQgaTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoZF9pbmIoYWhkLCBFUlJPUik7CisJZm9yIChpID0gMDsgaSA8IG51bV9lcnJvcnM7IGkrKykgeworCQlpZiAoKGVycm9yICYgYWhkX2hhcmRfZXJyb3JzW2ldLmVycm5vKSAhPSAwKQorCQkJcHJpbnRmKCIlczogaHdlcnJpbnQsICVzXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9oYXJkX2Vycm9yc1tpXS5lcnJtZXNnKTsKKwl9CisKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJcGFuaWMoIkJSS0FEUklOVCIpOworCisJLyogVGVsbCBldmVyeW9uZSB0aGF0IHRoaXMgSEJBIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwlhaGRfYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIEFMTF9DSEFOTkVMUywKKwkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsIFJPTEVfVU5LTk9XTiwKKwkJICAgICAgIENBTV9OT19IQkEpOworCisJLyogVGVsbCB0aGUgc3lzdGVtIHRoYXQgdGhpcyBjb250cm9sbGVyIGhhcyBnb25lIGF3YXkuICovCisJYWhkX2ZyZWUoYWhkKTsKK30KKwordm9pZAorYWhkX2hhbmRsZV9zZXFpbnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbnRzdGF0KQoreworCXVfaW50IHNlcWludGNvZGU7CisKKwkvKgorCSAqIFNhdmUgdGhlIHNlcXVlbmNlciBpbnRlcnJ1cHQgY29kZSBhbmQgY2xlYXIgdGhlIFNFUUlOVAorCSAqIGJpdC4gV2Ugd2lsbCB1bnBhdXNlIHRoZSBzZXF1ZW5jZXIsIGlmIGFwcHJvcHJpYXRlLAorCSAqIGFmdGVyIHNlcnZpY2luZyB0aGUgcmVxdWVzdC4KKwkgKi8KKwlzZXFpbnRjb2RlID0gYWhkX2luYihhaGQsIFNFUUlOVENPREUpOworCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTRVFJTlQpOworCWlmICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogVW5wYXVzZSB0aGUgc2VxdWVuY2VyIGFuZCBsZXQgaXQgY2xlYXIKKwkJICogU0VRSU5UIGJ5IHdyaXRpbmcgTk9fU0VRSU5UIHRvIGl0LiAgVGhpcworCQkgKiB3aWxsIGNhdXNlIHRoZSBzZXF1ZW5jZXIgdG8gYmUgcGF1c2VkIGFnYWluLAorCQkgKiB3aGljaCBpcyB0aGUgZXhwZWN0ZWQgc3RhdGUgb2YgdGhpcyByb3V0aW5lLgorCQkgKi8KKwkJYWhkX3VucGF1c2UoYWhkKTsKKwkJd2hpbGUgKCFhaGRfaXNfcGF1c2VkKGFoZCkpCisJCQk7CisJCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTRVFJTlQpOworCX0KKwlhaGRfdXBkYXRlX21vZGVzKGFoZCk7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQlwcmludGYoIiVzOiBIYW5kbGUgU2VxaW50IENhbGxlZCBmb3IgY29kZSAlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNlcWludGNvZGUpOworI2VuZGlmCisJc3dpdGNoIChzZXFpbnRjb2RlKSB7CisJY2FzZSBCQURfU0NCX1NUQVRVUzoKKwl7CisJCXN0cnVjdAlzY2IgKnNjYjsKKwkJdV9pbnQJc2NiaWQ7CisJCWludAljbWRzX3BlbmRpbmc7CisKKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQlhaGRfY29tcGxldGVfc2NiKGFoZCwgc2NiKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXM6IFdBUk5JTkcgbm8gY29tbWFuZCBmb3Igc2NiICVkICIKKwkJCSAgICAgICAiKGJhZCBzdGF0dXMpXG4iLCBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCX0KKwkJY21kc19wZW5kaW5nID0gYWhkX2ludyhhaGQsIENNRFNfUEVORElORyk7CisJCWlmIChjbWRzX3BlbmRpbmcgPiAwKQorCQkJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIGNtZHNfcGVuZGluZyAtIDEpOworCQlicmVhazsKKwl9CisJY2FzZSBFTlRFUklOR19OT05QQUNLOgorCXsKKwkJc3RydWN0CXNjYiAqc2NiOworCQl1X2ludAlzY2JpZDsKKworCQlBSERfQVNTRVJUX01PREVTKGFoZCwgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSwKKwkJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFNvbWVob3cgbmVlZCB0byBrbm93IGlmIHRoaXMKKwkJCSAqIGlzIGZyb20gYSBzZWxlY3Rpb24gb3IgcmVzZWxlY3Rpb24uCisJCQkgKiBGcm9tIHRoYXQsIHdlIGNhbiBkZXRlcm1pbmUgdGFyZ2V0CisJCQkgKiBJRCBzbyB3ZSBhdCBsZWFzdCBoYXZlIGFuIElfVCBuZXh1cy4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJYWhkX291dGIoYWhkLCBTQVZFRF9TQ1NJSUQsIHNjYi0+aHNjYi0+c2NzaWlkKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0FWRURfTFVOLCBzY2ItPmhzY2ItPmx1bik7CisJCQlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUywgMHgwKTsKKwkJfQorCQlpZiAoKGFoZF9pbmIoYWhkLCBMUUlTVEFUMikgJiBMUUlQSEFTRV9PVVRQS1QpICE9IDAKKwkJICYmIChhaGRfaW5iKGFoZCwgU0NTSVNJR08pICYgQVROTykgIT0gMCkgeworCQkJLyoKKwkJCSAqIFBoYXNlIGNoYW5nZSBhZnRlciByZWFkIHN0cmVhbSB3aXRoCisJCQkgKiBDUkMgZXJyb3Igd2l0aCBQMCBhc3NlcnRlZCBvbiBsYXN0CisJCQkgKiBwYWNrZXQuCisJCQkgKi8KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCQkJcHJpbnRmKCIlczogQXNzdW1pbmcgTFFJUEhBU0VfTkxRIHdpdGggIgorCQkJCSAgICAgICAiUDAgYXNzZXJ0aW9uXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCQl9CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCQlwcmludGYoIiVzOiBFbnRlcmluZyBOT05QQUNLXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCQlicmVhazsKKwl9CisJY2FzZSBJTlZBTElEX1NFUUlOVDoKKwkJcHJpbnRmKCIlczogSW52YWxpZCBTZXF1ZW5jZXIgaW50ZXJydXB0IG9jY3VycmVkLlxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFUVVNfT1ZFUlJVTjoKKwl7CisJCXN0cnVjdAlzY2IgKnNjYjsKKwkJdV9pbnQJc2NiaWQ7CisKKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMKQorCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQllbHNlCisJCQlwcmludGYoIiVzOiAiLCBhaGRfbmFtZShhaGQpKTsKKwkJcHJpbnRmKCJTQ0IgJWQgUGFja2V0aXplZCBTdGF0dXMgT3ZlcnJ1biIsIHNjYmlkKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCWJyZWFrOworCX0KKwljYXNlIENGRzRJU1RBVF9JTlRSOgorCXsKKwkJc3RydWN0CXNjYiAqc2NiOworCQl1X2ludAlzY2JpZDsKKworCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJCXByaW50ZigiQ0ZHNElTVEFUOiBGcmVlIFNDQiAlZCByZWZlcmVuY2VkIiwgc2NiaWQpOworCQkJcGFuaWMoIkZvciBzYWZldHkiKTsKKwkJfQorCQlhaGRfb3V0cShhaGQsIEhBRERSLCBzY2ItPnNlbnNlX2J1c2FkZHIpOworCQlhaGRfb3V0dyhhaGQsIEhDTlQsIEFIRF9TRU5TRV9CVUZTSVpFKTsKKwkJYWhkX291dGIoYWhkLCBIQ05UICsgMiwgMCk7CisJCWFoZF9vdXRiKGFoZCwgU0dfQ0FDSEVfUFJFLCBTR19MQVNUX1NFRyk7CisJCWFoZF9vdXRiKGFoZCwgREZDTlRSTCwgUFJFTE9BREVOfFNDU0lFTnxIRE1BRU4pOworCQlicmVhazsKKwl9CisJY2FzZSBJTExFR0FMX1BIQVNFOgorCXsKKwkJdV9pbnQgYnVzX3BoYXNlOworCisJCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCQlwcmludGYoIiVzOiBJTExFR0FMX1BIQVNFIDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBidXNfcGhhc2UpOworCisJCXN3aXRjaCAoYnVzX3BoYXNlKSB7CisJCWNhc2UgUF9EQVRBT1VUOgorCQljYXNlIFBfREFUQUlOOgorCQljYXNlIFBfREFUQU9VVF9EVDoKKwkJY2FzZSBQX0RBVEFJTl9EVDoKKwkJY2FzZSBQX01FU0dPVVQ6CisJCWNhc2UgUF9TVEFUVVM6CisJCWNhc2UgUF9NRVNHSU46CisJCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCQlwcmludGYoIiVzOiBJc3N1ZWQgQnVzIFJlc2V0LlxuIiwgYWhkX25hbWUoYWhkKSk7CisJCQlicmVhazsKKwkJY2FzZSBQX0NPTU1BTkQ6CisJCXsKKwkJCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCQkJc3RydWN0CXNjYiAqc2NiOworCQkJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRhcmdfaW5mbzsKKwkJCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCQlzdHJ1Y3QJYWhkX3RyYW5zaW5mbyAqdGluZm87CisJCQl1X2ludAlzY2JpZDsKKworCQkJLyoKKwkJCSAqIElmIGEgdGFyZ2V0IHRha2VzIHVzIGludG8gdGhlIGNvbW1hbmQgcGhhc2UKKwkJCSAqIGFzc3VtZSB0aGF0IGl0IGhhcyBiZWVuIGV4dGVybmFsbHkgcmVzZXQgYW5kCisJCQkgKiBoYXMgdGh1cyBsb3N0IG91ciBwcmV2aW91cyBwYWNrZXRpemVkIG5lZ290aWF0aW9uCisJCQkgKiBhZ3JlZW1lbnQuICBTaW5jZSB3ZSBoYXZlIG5vdCBzZW50IGFuIGlkZW50aWZ5CisJCQkgKiBtZXNzYWdlIGFuZCBtYXkgbm90IGhhdmUgZnVsbHkgcXVhbGlmaWVkIHRoZQorCQkJICogY29ubmVjdGlvbiwgd2UgY2hhbmdlIG91ciBjb21tYW5kIHRvIFRVUiwgYXNzZXJ0CisJCQkgKiBBVE4gYW5kIEFCT1JUIHRoZSB0YXNrIHdoZW4gd2UgZ28gdG8gbWVzc2FnZSBpbgorCQkJICogcGhhc2UuICBUaGUgT1NNIHdpbGwgc2VlIHRoZSBSRVFVRVVFX1JFUVVFU1QKKwkJCSAqIHN0YXR1cyBhbmQgcmV0cnkgdGhlIGNvbW1hbmQuCisJCQkgKi8KKwkJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRmKCJJbnZhbGlkIHBoYXNlIHdpdGggbm8gdmFsaWQgU0NCLiAgIgorCQkJCSAgICAgICAiUmVzZXR0aW5nIGJ1cy5cbiIpOworCQkJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLAorCQkJCQkJICAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIFNDQl9HRVRfT1VSX0lEKHNjYiksCisJCQkJCSAgICBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCisJCQkJCSAgICBTQ0JfR0VUX0xVTihzY2IpLAorCQkJCQkgICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKwkJCXRhcmdfaW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCQkJCWRldmluZm8uY2hhbm5lbCwKKwkJCQkJCQlkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkJZGV2aW5mby50YXJnZXQsCisJCQkJCQkJJnRzdGF0ZSk7CisJCQl0aW5mbyA9ICZ0YXJnX2luZm8tPmN1cnI7CisJCQlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhEX1RSQU5TX0FDVElWRSwgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAvKnBlcmlvZCovMCwKKwkJCQkJIC8qb2Zmc2V0Ki8wLCAvKnBwcl9vcHRpb25zKi8wLAorCQkJCQkgQUhEX1RSQU5TX0FDVElWRSwgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ0RCX1NUT1JFLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSsxLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSsyLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSszLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSs0LCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSs1LCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9MRU4sIDYpOworCQkJc2NiLT5oc2NiLT5jb250cm9sICY9IH4oVEFHX0VOQnxTQ0JfVEFHX1RZUEUpOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCBzY2ItPmhzY2ItPmNvbnRyb2wpOworCQkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCQlhaGRfb3V0YihhaGQsIFNBVkVEX1NDU0lJRCwgc2NiLT5oc2NiLT5zY3NpaWQpOworCQkJLyoKKwkJCSAqIFRoZSBsdW4gaXMgMCwgcmVnYXJkbGVzcyBvZiB0aGUgU0NCJ3MgbHVuCisJCQkgKiBhcyB3ZSBoYXZlIG5vdCBzZW50IGFuIGlkZW50aWZ5IG1lc3NhZ2UuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0FWRURfTFVOLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTLCAwKTsKKwkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCQlzY2ItPmZsYWdzICY9IH4oU0NCX1BBQ0tFVElaRUQpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQUJPUlR8U0NCX0NNRFBIQVNFX0FCT1JUOworCQkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJCWFoZF9mcmVlemVfc2NiKHNjYik7CisKKwkJCS8qCisJCQkgKiBBbGxvdyB0aGUgc2VxdWVuY2VyIHRvIGNvbnRpbnVlIHdpdGgKKwkJCSAqIG5vbi1wYWNrIHByb2Nlc3NpbmcuCisJCQkgKi8KKwkJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgQ0xSTFFPUEhBQ0hHSU5QS1QpOworCQkJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHKSAhPSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQxLCAwKTsKKwkJCX0KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKKwkJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNvbW1hbmQgcGhhc2UgZnJvbSAiCisJCQkJICAgICAgICJwYWNrZXRpemVkIHRhcmdldFxuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQ0ZHNE9WRVJSVU46CisJeworCQlzdHJ1Y3QJc2NiICpzY2I7CisJCXVfaW50CXNjYl9pbmRleDsKKwkJCisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKKwkJCXByaW50ZigiJXM6IENGRzRPVkVSUlVOIG1vZGUgPSAleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCSAgICAgICBhaGRfaW5iKGFoZCwgTU9ERV9QVFIpKTsKKwkJfQorI2VuZGlmCisJCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogQXR0ZW1wdCB0byB0cmFuc2ZlciB0byBhbiBTQ0IgdGhhdCBpcworCQkJICogbm90IG91dHN0YW5kaW5nLgorCQkJICovCisJCQlhaGRfYXNzZXJ0X2F0bihhaGQpOworCQkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCQlhaGQtPm1zZ291dF9idWZbMF0gPSBNU0dfQUJPUlRfVEFTSzsKKwkJCWFoZC0+bXNnb3V0X2xlbiA9IDE7CisJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQlhaGQtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKwkJCS8qCisJCQkgKiBDbGVhciBzdGF0dXMgcmVjZWl2ZWQgZmxhZyB0byBwcmV2ZW50IGFueQorCQkJICogYXR0ZW1wdCB0byBjb21wbGV0ZSB0aGlzIGJvZ3VzIFNDQi4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKKwkJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkKKwkJCQkgJiB+U1RBVFVTX1JDVkQpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERVTVBfQ0FSRF9TVEFURToKKwl7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUERBVEFfUkVJTklUOgorCXsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19SRUNPVkVSWSkgIT0gMCkgeworCQkJcHJpbnRmKCIlczogUERBVEFfUkVJTklUIC0gREZDTlRSTCA9IDB4JXggIgorCQkJICAgICAgICJTR19DQUNIRV9TSEFET1cgPSAweCV4XG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9pbmIoYWhkLCBERkNOVFJMKSwKKwkJCSAgICAgICBhaGRfaW5iKGFoZCwgU0dfQ0FDSEVfU0hBRE9XKSk7CisJCX0KKyNlbmRpZgorCQlhaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzKGFoZCk7CisJCWJyZWFrOworCX0KKwljYXNlIEhPU1RfTVNHX0xPT1A6CisJeworCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKworCQkvKgorCQkgKiBUaGUgc2VxdWVuY2VyIGhhcyBlbmNvdW50ZXJlZCBhIG1lc3NhZ2UgcGhhc2UKKwkJICogdGhhdCByZXF1aXJlcyBob3N0IGFzc2lzdGFuY2UgZm9yIGNvbXBsZXRpb24uCisJCSAqIFdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlIHBoYXNlKHMpLCB3ZSB3aWxsIGJlCisJCSAqIG5vdGlmaWVkIGJ5IHRoZSBzZXF1ZW5jZXIgYWZ0ZXIgZWFjaCBieXRlIGlzCisJCSAqIHRyYW5zZmVyZWQgc28gd2UgY2FuIHRyYWNrIGJ1cyBwaGFzZSBjaGFuZ2VzLgorCQkgKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gYSBIT1NUX01TR19MT09QCisJCSAqIGludGVycnVwdCwgaW5pdGlhbGl6ZSB0aGUgc3RhdGUgb2YgdGhlIGhvc3QgbWVzc2FnZQorCQkgKiBsb29wLgorCQkgKi8KKwkJYWhkX2ZldGNoX2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCWlmIChhaGQtPm1zZ190eXBlID09IE1TR19UWVBFX05PTkUpIHsKKwkJCXN0cnVjdCBzY2IgKnNjYjsKKwkJCXVfaW50IHNjYl9pbmRleDsKKwkJCXVfaW50IGJ1c19waGFzZTsKKworCQkJYnVzX3BoYXNlID0gYWhkX2luYihhaGQsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCQlpZiAoYnVzX3BoYXNlICE9IFBfTUVTR0lOCisJCQkgJiYgYnVzX3BoYXNlICE9IFBfTUVTR09VVCkgeworCQkJCXByaW50ZigiYWhkX2ludHI6IEhPU1RfTVNHX0xPT1AgYmFkICIKKwkJCQkgICAgICAgInBoYXNlIDB4JXhcbiIsIGJ1c19waGFzZSk7CisJCQkJLyoKKwkJCQkgKiBQcm9iYWJseSB0cmFuc2l0aW9uZWQgdG8gYnVzIGZyZWUgYmVmb3JlCisJCQkJICogd2UgZ290IGhlcmUuICBKdXN0IHB1bnQgdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQkJCWFoZF9jbGVhcl9pbnRzdGF0KGFoZCk7CisJCQkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYl9pbmRleCk7CisJCQlpZiAoZGV2aW5mby5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dPVVQpCisJCQkJCWFoZF9zZXR1cF9pbml0aWF0b3JfbXNnb3V0KGFoZCwKKwkJCQkJCQkJICAgJmRldmluZm8sCisJCQkJCQkJCSAgIHNjYik7CisJCQkJZWxzZSB7CisJCQkJCWFoZC0+bXNnX3R5cGUgPQorCQkJCQkgICAgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOworCQkJCQlhaGQtPm1zZ2luX2luZGV4ID0gMDsKKwkJCQl9CisJCQl9CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJCQllbHNlIHsKKwkJCQlpZiAoYnVzX3BoYXNlID09IFBfTUVTR09VVCkgeworCQkJCQlhaGQtPm1zZ190eXBlID0KKwkJCQkJICAgIE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCQkJCX0KKwkJCQllbHNlIAorCQkJCQlhaGRfc2V0dXBfdGFyZ2V0X21zZ2luKGFoZCwKKwkJCQkJCQkgICAgICAgJmRldmluZm8sCisJCQkJCQkJICAgICAgIHNjYik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWFoZF9oYW5kbGVfbWVzc2FnZV9waGFzZShhaGQpOworCQlicmVhazsKKwl9CisJY2FzZSBOT19NQVRDSDoKKwl7CisJCS8qIEVuc3VyZSB3ZSBkb24ndCBsZWF2ZSB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlIG9uICovCisJCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9TQ1NJX01TSywgQUhEX01PREVfU0NTSV9NU0spOworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCBhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgfkVOU0VMTyk7CisKKwkJcHJpbnRmKCIlczolYzolZDogbm8gYWN0aXZlIFNDQiBmb3IgcmVjb25uZWN0aW5nICIKKwkJICAgICAgICJ0YXJnZXQgLSBpc3N1aW5nIEJVUyBERVZJQ0UgUkVTRVRcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCAnQScsIGFoZF9pbmIoYWhkLCBTRUxJRCkgPj4gNCk7CisJCXByaW50ZigiU0FWRURfU0NTSUlEID09IDB4JXgsIFNBVkVEX0xVTiA9PSAweCV4LCAiCisJCSAgICAgICAiUkVHMCA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpLCBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSwKKwkJICAgICAgIGFoZF9pbncoYWhkLCBSRUcwKSwgYWhkX2luYihhaGQsIEFDQ1VNKSk7CisJCXByaW50ZigiU0VRX0ZMQUdTID09IDB4JXgsIFNDQlBUUiA9PSAweCV4LCBCVFQgPT0gMHgleCwgIgorCQkgICAgICAgIlNJTkRFWCA9PSAweCV4XG4iLAorCQkgICAgICAgYWhkX2luYihhaGQsIFNFUV9GTEFHUyksIGFoZF9nZXRfc2NicHRyKGFoZCksCisJCSAgICAgICBhaGRfZmluZF9idXN5X3RjbChhaGQsCisJCQkJCSBCVUlMRF9UQ0woYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCksCisJCQkJCQkgICBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSkpLAorCQkgICAgICAgYWhkX2ludyhhaGQsIFNJTkRFWCkpOworCQlwcmludGYoIlNFTElEID09IDB4JXgsIFNDQl9TQ1NJSUQgPT0gMHgleCwgU0NCX0xVTiA9PSAweCV4LCAiCisJCSAgICAgICAiU0NCX0NPTlRST0wgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9pbmIoYWhkLCBTRUxJRCksIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NDU0lJRCksCisJCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9MVU4pLAorCQkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkpOworCQlwcmludGYoIlNDU0lCVVNbMF0gPT0gMHgleCwgU0NTSVNJR0kgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9pbmIoYWhkLCBTQ1NJQlVTKSwgYWhkX2luYihhaGQsIFNDU0lTSUdJKSk7CisJCXByaW50ZigiU1hGUkNUTDAgPT0gMHgleFxuIiwgYWhkX2luYihhaGQsIFNYRlJDVEwwKSk7CisJCXByaW50ZigiU0VRQ1RMMCA9PSAweCV4XG4iLCBhaGRfaW5iKGFoZCwgU0VRQ1RMMCkpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCWFoZC0+bXNnb3V0X2J1ZlswXSA9IE1TR19CVVNfREVWX1JFU0VUOworCQlhaGQtPm1zZ291dF9sZW4gPSAxOworCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQlhaGRfb3V0YihhaGQsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwkJYWhkX2Fzc2VydF9hdG4oYWhkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUFJPVE9fVklPTEFUSU9OOgorCXsKKwkJYWhkX2hhbmRsZV9wcm90b192aW9sYXRpb24oYWhkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSUdOX1dJREVfUkVTOgorCXsKKwkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisKKwkJYWhkX2ZldGNoX2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCWFoZF9oYW5kbGVfaWduX3dpZGVfcmVzaWR1ZShhaGQsICZkZXZpbmZvKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQkFEX1BIQVNFOgorCXsKKwkJdV9pbnQgbGFzdHBoYXNlOworCisJCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCQlwcmludGYoIiVzOiVjOiVkOiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICV4LCAiCisJCSAgICAgICAibGFzdHBoYXNlID0gMHgleC4gIEF0dGVtcHRpbmcgdG8gY29udGludWVcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCAnQScsCisJCSAgICAgICBTQ1NJSURfVEFSR0VUKGFoZCwgYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCkpLAorCQkgICAgICAgbGFzdHBoYXNlLCBhaGRfaW5iKGFoZCwgU0NTSVNJR0kpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUlTU0VEX0JVU0ZSRUU6CisJeworCQl1X2ludCBsYXN0cGhhc2U7CisKKwkJbGFzdHBoYXNlID0gYWhkX2luYihhaGQsIExBU1RQSEFTRSk7CisJCXByaW50ZigiJXM6JWM6JWQ6IE1pc3NlZCBidXNmcmVlLiAiCisJCSAgICAgICAiTGFzdHBoYXNlID0gMHgleCwgQ3VycGhhc2UgPSAweCV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgJ0EnLAorCQkgICAgICAgU0NTSUlEX1RBUkdFVChhaGQsIGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpKSwKKwkJICAgICAgIGxhc3RwaGFzZSwgYWhkX2luYihhaGQsIFNDU0lTSUdJKSk7CisJCWFoZF9yZXN0YXJ0KGFoZCk7CisJCXJldHVybjsKKwl9CisJY2FzZSBEQVRBX09WRVJSVU46CisJeworCQkvKgorCQkgKiBXaGVuIHRoZSBzZXF1ZW5jZXIgZGV0ZWN0cyBhbiBvdmVycnVuLCBpdAorCQkgKiBwbGFjZXMgdGhlIGNvbnRyb2xsZXIgaW4gIkJJVEJVQ0tFVCIgbW9kZQorCQkgKiBhbmQgYWxsb3dzIHRoZSB0YXJnZXQgdG8gY29tcGxldGUgaXRzIHRyYW5zZmVyLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBjb3VudGVycyBnZXQgdXBkYXRlZAorCQkgKiB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGluIHRoaXMgbW9kZSwgc28gd2UgaGF2ZQorCQkgKiBubyB3YXkgb2Yga25vd2luZyBob3cgbGFyZ2UgdGhlIG92ZXJydW4gd2FzLgorCQkgKi8KKwkJc3RydWN0CXNjYiAqc2NiOworCQl1X2ludAlzY2JpbmRleDsKKyNpZmRlZiBBSERfREVCVUcKKwkJdV9pbnQJbGFzdHBoYXNlOworI2VuZGlmCisKKwkJc2NiaW5kZXggPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmluZGV4KTsKKyNpZmRlZiBBSERfREVCVUcKKwkJbGFzdHBoYXNlID0gYWhkX2luYihhaGQsIExBU1RQSEFTRSk7CisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApIHsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiZGF0YSBvdmVycnVuIGRldGVjdGVkICVzLiAgVGFnID09IDB4JXguXG4iLAorCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkobGFzdHBoYXNlKS0+cGhhc2Vtc2csCisJCQkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIiVzIHNlZW4gRGF0YSBQaGFzZS4gIExlbmd0aCA9ICVsZC4gICIKKwkJCSAgICAgICAiTnVtU0dzID0gJWQuXG4iLAorCQkJICAgICAgIGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgRFBIQVNFCisJCQkgICAgICAgPyAiSGF2ZSIgOiAiSGF2ZW4ndCIsCisJCQkgICAgICAgYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSwgc2NiLT5zZ19jb3VudCk7CisJCQlhaGRfZHVtcF9zZ2xpc3Qoc2NiKTsKKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogU2V0IHRoaXMgYW5kIGl0IHdpbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGUKKwkJICogdGFyZ2V0IGRvZXMgYSBjb21tYW5kIGNvbXBsZXRlLgorCQkgKi8KKwkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKKwkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUtNU0dfRkFJTEVEOgorCXsKKwkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdCBzY2IgKnNjYjsKKwkJdV9pbnQgc2NiaWQ7CisKKwkJYWhkX2ZldGNoX2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCXByaW50ZigiJXM6JWM6JWQ6JWQ6IEF0dGVtcHQgdG8gaXNzdWUgbWVzc2FnZSBmYWlsZWRcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby5sdW4pOworCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlpZiAoc2NiICE9IE5VTEwKKwkJICYmIChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkKKwkJCS8qCisJCQkgKiBFbnN1cmUgdGhhdCB3ZSBkaWRuJ3QgcHV0IGEgc2Vjb25kIGluc3RhbmNlIG9mIHRoaXMKKwkJCSAqIFNDQiBpbnRvIHRoZSBRSU5GSUZPLgorCQkJICovCisJCQlhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCisJCQkJCSAgIFNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYiksCisJCQkJCSAgIFNDQl9HRVRfTFVOKHNjYiksIFNDQl9HRVRfVEFHKHNjYiksCisJCQkJCSAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkJICAgU0VBUkNIX1JFTU9WRSk7CisJCWFoZF9vdXRiKGFoZCwgU0NCX0NPTlRST0wsCisJCQkgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkgJiB+TUtfTUVTU0FHRSk7CisJCWJyZWFrOworCX0KKwljYXNlIFRBU0tNR01UX0ZVTkNfQ09NUExFVEU6CisJeworCQl1X2ludAlzY2JpZDsKKwkJc3RydWN0CXNjYiAqc2NiOworCisJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgIT0gTlVMTCkgeworCQkJdV9pbnQJICAgbHVuOworCQkJdV9pbnQJICAgdGFnOworCQkJY2FtX3N0YXR1cyBlcnJvcjsKKworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJcHJpbnRmKCJUYXNrIE1hbmFnZW1lbnQgRnVuYyAweCV4IENvbXBsZXRlXG4iLAorCQkJICAgICAgIHNjYi0+aHNjYi0+dGFza19tYW5hZ2VtZW50KTsKKwkJCWx1biA9IENBTV9MVU5fV0lMRENBUkQ7CisJCQl0YWcgPSBTQ0JfTElTVF9OVUxMOworCisJCQlzd2l0Y2ggKHNjYi0+aHNjYi0+dGFza19tYW5hZ2VtZW50KSB7CisJCQljYXNlIFNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLOgorCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQljYXNlIFNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLX1NFVDoKKwkJCWNhc2UgU0lVX1RBU0tNR01UX0NMRUFSX1RBU0tfU0VUOgorCQkJCWx1biA9IHNjYi0+aHNjYi0+bHVuOworCQkJCWVycm9yID0gQ0FNX1JFUV9BQk9SVEVEOworCQkJCWFoZF9hYm9ydF9zY2JzKGFoZCwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpLAorCQkJCQkgICAgICAgJ0EnLCBsdW4sIHRhZywgUk9MRV9JTklUSUFUT1IsCisJCQkJCSAgICAgICBlcnJvcik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNJVV9UQVNLTUdNVF9MVU5fUkVTRVQ6CisJCQkJbHVuID0gc2NiLT5oc2NiLT5sdW47CisJCQljYXNlIFNJVV9UQVNLTUdNVF9UQVJHRVRfUkVTRVQ6CisJCQl7CisJCQkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisKKwkJCQlhaGRfc2NiX2RldmluZm8oYWhkLCAmZGV2aW5mbywgc2NiKTsKKwkJCQllcnJvciA9IENBTV9CRFJfU0VOVDsKKwkJCQlhaGRfaGFuZGxlX2RldnJlc2V0KGFoZCwgJmRldmluZm8sIGx1biwKKwkJCQkJCSAgICBDQU1fQkRSX1NFTlQsCisJCQkJCQkgICAgbHVuICE9IENBTV9MVU5fV0lMRENBUkQKKwkJCQkJCSAgICA/ICJMdW4gUmVzZXQiCisJCQkJCQkgICAgOiAiVGFyZ2V0IFJlc2V0IiwKKwkJCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzApOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCQlwYW5pYygiVW5leHBlY3RlZCBUYXNrTWdtdCBGdW5jXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBUQVNLTUdNVF9DTURfQ01QTFRfT0tBWToKKwl7CisJCXVfaW50CXNjYmlkOworCQlzdHJ1Y3QJc2NiICpzY2I7CisKKwkJLyoKKwkJICogQW4gQUJPUlQgVEFTSyBUTUYgZmFpbGVkIHRvIGJlIGRlbGl2ZXJlZCBiZWZvcmUKKwkJICogdGhlIHRhcmdldGVkIGNvbW1hbmQgY29tcGxldGVkIG5vcm1hbGx5LgorCQkgKi8KKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogUmVtb3ZlIHRoZSBzZWNvbmQgaW5zdGFuY2Ugb2YgdGhpcyBTQ0IgZnJvbQorCQkJICogdGhlIFFJTkZJRk8gaWYgaXQgaXMgc3RpbGwgdGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiU0NCIGNvbXBsZXRlcyBiZWZvcmUgVE1GXG4iKTsKKwkJCS8qCisJCQkgKiBIYW5kbGUgbG9zaW5nIHRoZSByYWNlLiAgV2FpdCB1bnRpbCBhbnkKKwkJCSAqIGN1cnJlbnQgc2VsZWN0aW9uIGNvbXBsZXRlcy4gIFdlIHdpbGwgdGhlbgorCQkJICogc2V0IHRoZSBUTUYgYmFjayB0byB6ZXJvIGluIHRoaXMgU0NCIHNvIHRoYXQKKwkJCSAqIHRoZSBzZXF1ZW5jZXIgZG9lc24ndCBib3RoZXIgdG8gaXNzdWUgYW5vdGhlcgorCQkJICogc2VxdWVuY2VyIGludGVycnVwdCBmb3IgaXRzIGNvbXBsZXRpb24uCisJCQkgKi8KKwkJCXdoaWxlICgoYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIEVOU0VMTykgIT0gMAorCQkJICAgICYmIChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIFNFTERPKSA9PSAwCisJCQkgICAgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDEpICYgU0VMVE8pID09IDApCisJCQkJOworCQkJYWhkX291dGIoYWhkLCBTQ0JfVEFTS19NQU5BR0VNRU5ULCAwKTsKKwkJCWFoZF9zZWFyY2hfcWluZmlmbyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwgIAorCQkJCQkgICBTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfR0VUX1RBRyhzY2IpLCAKKwkJCQkJICAgUk9MRV9JTklUSUFUT1IsIC8qc3RhdHVzKi8wLCAgIAorCQkJCQkgICBTRUFSQ0hfUkVNT1ZFKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBUUkFDRVBPSU5UMDoKKwljYXNlIFRSQUNFUE9JTlQxOgorCWNhc2UgVFJBQ0VQT0lOVDI6CisJY2FzZSBUUkFDRVBPSU5UMzoKKwkJcHJpbnRmKCIlczogVHJhY2Vwb2ludCAlZFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIHNlcWludGNvZGUgLSBUUkFDRVBPSU5UMCk7CisJCWJyZWFrOworCWNhc2UgTk9fU0VRSU5UOgorCQlicmVhazsKKwljYXNlIFNBV19IV0VSUjoKKwkJYWhkX2hhbmRsZV9od2VycmludChhaGQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzOiBVbmV4cGVjdGVkIFNFUUlOVENPREUgJWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBzZXFpbnRjb2RlKTsKKwkJYnJlYWs7CisJfQorCS8qCisJICogIFRoZSBzZXF1ZW5jZXIgaXMgcGF1c2VkIGltbWVkaWF0ZWx5IG9uCisJICogIGEgU0VRSU5ULCBzbyB3ZSBzaG91bGQgcmVzdGFydCBpdCB3aGVuCisJICogIHdlJ3JlIGRvbmUuCisJICovCisJYWhkX3VucGF1c2UoYWhkKTsKK30KKwordm9pZAorYWhkX2hhbmRsZV9zY3NpaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCkKK3sKKwlzdHJ1Y3Qgc2NiCSpzY2I7CisJdV9pbnQJCSBzdGF0dXMwOworCXVfaW50CQkgc3RhdHVzMzsKKwl1X2ludAkJIHN0YXR1czsKKwl1X2ludAkJIGxxaXN0YXQxOworCXVfaW50CQkgbHFvc3RhdDA7CisJdV9pbnQJCSBzY2JpZDsKKwl1X2ludAkJIGJ1c2ZyZWV0aW1lOworCisJYWhkX3VwZGF0ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKworCXN0YXR1czMgPSBhaGRfaW5iKGFoZCwgU1NUQVQzKSAmIChOVFJBTVBFUlJ8T1NSQU1QRVJSKTsKKwlzdGF0dXMwID0gYWhkX2luYihhaGQsIFNTVEFUMCkgJiAoSU9FUlJ8T1ZFUlJVTnxTRUxESXxTRUxETyk7CisJc3RhdHVzID0gYWhkX2luYihhaGQsIFNTVEFUMSkgJiAoU0VMVE98U0NTSVJTVEl8QlVTRlJFRXxTQ1NJUEVSUik7CisJbHFpc3RhdDEgPSBhaGRfaW5iKGFoZCwgTFFJU1RBVDEpOworCWxxb3N0YXQwID0gYWhkX2luYihhaGQsIExRT1NUQVQwKTsKKwlidXNmcmVldGltZSA9IGFoZF9pbmIoYWhkLCBTU1RBVDIpICYgQlVTRlJFRVRJTUU7CisJaWYgKChzdGF0dXMwICYgKFNFTERJfFNFTERPKSkgIT0gMCkgeworCQl1X2ludCBzaW1vZGUwOworCisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCXNpbW9kZTAgPSBhaGRfaW5iKGFoZCwgU0lNT0RFMCk7CisJCXN0YXR1czAgJj0gc2ltb2RlMCAmIChJT0VSUnxPVkVSUlVOfFNFTERJfFNFTERPKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCX0KKwlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJaWYgKHNjYiAhPSBOVUxMCisJICYmIChhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKSAmIE5PVF9JREVOVElGSUVEKSAhPSAwKQorCQlzY2IgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKKwlpZiAoKHN0YXR1czAgJiBJT0VSUikgIT0gMCkgeworCQl1X2ludCBub3dfbHZkOworCisJCW5vd19sdmQgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCkgJiBFTkFCNDA7CisJCXByaW50ZigiJXM6IFRyYW5zY2VpdmVyIFN0YXRlIEhhcyBDaGFuZ2VkIHRvICVzIG1vZGVcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBub3dfbHZkID8gIkxWRCIgOiAiU0UiKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMCwgQ0xSSU9FUlIpOworCQkvKgorCQkgKiBBIGNoYW5nZSBpbiBJL08gbW9kZSBpcyBlcXVpdmFsZW50IHRvIGEgYnVzIHJlc2V0LgorCQkgKi8KKwkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOworCQlhaGRfcGF1c2UoYWhkKTsKKwkJYWhkX3NldHVwX2lvY2VsbF93b3JrYXJvdW5kKGFoZCk7CisJCWFoZF91bnBhdXNlKGFoZCk7CisJfSBlbHNlIGlmICgoc3RhdHVzMCAmIE9WRVJSVU4pICE9IDApIHsKKwkJcHJpbnRmKCIlczogU0NTSSBvZmZzZXQgb3ZlcnJ1biBkZXRlY3RlZC4gIFJlc2V0dGluZyBidXMuXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9UUlVFKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkgeworCQlwcmludGYoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgQVxuIiwgYWhkX25hbWUoYWhkKSk7CisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKkluaXRpYXRlIFJlc2V0Ki9GQUxTRSk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVBFUlIpICE9IDApIHsKKwkJYWhkX2hhbmRsZV90cmFuc21pc3Npb25fZXJyb3IoYWhkKTsKKwl9IGVsc2UgaWYgKGxxb3N0YXQwICE9IDApIHsKKwkJcHJpbnRmKCIlczogbHFvc3RhdDAgPT0gMHgleCFcbiIsIGFoZF9uYW1lKGFoZCksIGxxb3N0YXQwKTsKKwkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQwLCBscW9zdGF0MCk7CisJCWlmICgoYWhkLT5idWdzICYgQUhEX0NMUkxRT19BVVRPQ0xSX0JVRykgIT0gMCkgeworCQkJYWhkX291dGIoYWhkLCBDTFJMUU9JTlQxLCAwKTsKKwkJfQorCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNFTFRPKSAhPSAwKSB7CisJCXVfaW50ICBzY2JpZDsKKworCQkvKiBTdG9wIHRoZSBzZWxlY3Rpb24gKi8KKwkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgMCk7CisKKwkJLyogTm8gbW9yZSBwZW5kaW5nIG1lc3NhZ2VzICovCisJCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKKworCQkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdGUgKi8KKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0VMVElNRU98Q0xSQlVTRlJFRXxDTFJTQ1NJUEVSUik7CisKKwkJLyoKKwkJICogQWx0aG91Z2ggdGhlIGRyaXZlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQorCQkgKiAnU2VsZWN0aW9uIGluIFByb2dyZXNzJyBzdGF0dXMgYml0LCB0aGUgYnVzeQorCQkgKiBMRUQgZG9lcy4gIFNFTElOR08gaXMgb25seSBjbGVhcmVkIGJ5IGEgc3VjZXNzZnVsbAorCQkgKiBzZWxlY3Rpb24sIHNvIHdlIG11c3QgbWFudWFsbHkgY2xlYXIgaXQgdG8gaW5zdXJlCisJCSAqIHRoZSBMRUQgdHVybnMgb2ZmIGp1c3QgaW5jYXNlIG5vIGZ1dHVyZSBzdWNjZXNzZnVsCisJCSAqIHNlbGVjdGlvbnMgb2NjdXIgKGUuZy4gbm8gZGV2aWNlcyBvbiB0aGUgYnVzKS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDAsIENMUlNFTElOR08pOworCisJCXNjYmlkID0gYWhkX2ludyhhaGQsIFdBSVRJTkdfVElEX0hFQUQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBhaGRfaW50ciAtIHJlZmVyZW5jZWQgc2NiIG5vdCAiCisJCQkgICAgICAgInZhbGlkIGR1cmluZyBTRUxUTyBzY2IoMHgleClcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQpOworCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGFoZF9kZXZpbmZvIGRldmluZm87CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTFRPKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiU2F3IFNlbGVjdGlvbiBUaW1lb3V0IGZvciBTQ0IgMHgleFxuIiwKKwkJCQkgICAgICAgc2NiaWQpOworCQkJfQorI2VuZGlmCisJCQkvKgorCQkJICogRm9yY2UgYSByZW5lZ290aWF0aW9uIHdpdGggdGhpcyB0YXJnZXQganVzdCBpbgorCQkJICogY2FzZSB0aGUgY2FibGUgd2FzIHB1bGxlZCBhbmQgd2lsbCBsYXRlciBiZQorCQkJICogcmUtYXR0YWNoZWQuICBUaGUgdGFyZ2V0IG1heSBmb3JnZXQgaXRzIG5lZ290aWF0aW9uCisJCQkgKiBzZXR0aW5ncyB3aXRoIHVzIHNob3VsZCBpdCBhdHRlbXB0IHRvIHJlc2VsZWN0CisJCQkgKiBkdXJpbmcgdGhlIGludGVycnVwdGlvbi4gIFRoZSB0YXJnZXQgd2lsbCBub3QgaXNzdWUKKwkJCSAqIGEgdW5pdCBhdHRlbnRpb24gaW4gdGhpcyBjYXNlLCBzbyB3ZSBtdXN0IGFsd2F5cworCQkJICogcmVuZWdvdGlhdGUuCisJCQkgKi8KKwkJCWFoZF9zY2JfZGV2aW5mbyhhaGQsICZkZXZpbmZvLCBzY2IpOworCQkJYWhkX2ZvcmNlX3JlbmVnb3RpYXRpb24oYWhkLCAmZGV2aW5mbyk7CisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9TRUxfVElNRU9VVCk7CisJCQlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOworCQl9CisJCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwkJYWhkX2lvY2VsbF9maXJzdF9zZWxlY3Rpb24oYWhkKTsKKwkJYWhkX3VucGF1c2UoYWhkKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMwICYgKFNFTERJfFNFTERPKSkgIT0gMCkgeworCQlhaGRfaW9jZWxsX2ZpcnN0X3NlbGVjdGlvbihhaGQpOworCQlhaGRfdW5wYXVzZShhaGQpOworCX0gZWxzZSBpZiAoc3RhdHVzMyAhPSAwKSB7CisJCXByaW50ZigiJXM6IFNDU0kgQ2VsbCBwYXJpdHkgZXJyb3IgU1NUQVQzID09IDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzdGF0dXMzKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMywgc3RhdHVzMyk7CisJfSBlbHNlIGlmICgobHFpc3RhdDEgJiAoTFFJUEhBU0VfTFF8TFFJUEhBU0VfTkxRKSkgIT0gMCkgeworCQlhaGRfaGFuZGxlX2xxaXBoYXNlX2Vycm9yKGFoZCwgbHFpc3RhdDEpOworCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgTFFJQ1JDSV9OTFEpICE9IDApIHsKKwkJLyoKKwkJICogVGhpcyBzdGF0dXMgY2FuIGJlIGRlbGF5ZWQgZHVyaW5nIHNvbWUKKwkJICogc3RyZWFtaW5nIG9wZXJhdGlvbnMuICBUaGUgU0NTSVBIQVNFCisJCSAqIGhhbmRsZXIgaGFzIGFscmVhZHkgZGVhbHQgd2l0aCB0aGlzIGNhc2UKKwkJICogc28ganVzdCBjbGVhciB0aGUgZXJyb3IuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIENMUkxRSUNSQ0lfTkxRKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgJiBCVVNGUkVFKSAhPSAwKSB7CisJCXVfaW50IGxxb3N0YXQxOworCQlpbnQgICByZXN0YXJ0OworCQlpbnQgICBjbGVhcl9maWZvOworCQlpbnQgICBwYWNrZXRpemVkOworCQl1X2ludCBtb2RlOworCisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkJICogV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4gdGhlIHdhaXRpbmcgUSBmb3IgdGhpcyB0YXJnZXQsCisJCSAqIHRoYXQgaXMgYWZmZWN0ZWQgYnkgdGhpcyBidXNmcmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvCisJCSAqIGdvIGFib3V0IHNlbGVjdGluZyB0aGUgdGFyZ2V0IHdoaWxlIHdlIGhhbmRsZSB0aGUgZXZlbnQuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCAwKTsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUgd2hhdCB3ZSB3ZXJlIHVwIHRvIGF0IHRoZSB0aW1lIG9mCisJCSAqIHRoZSBidXNmcmVlLgorCQkgKi8KKwkJbW9kZSA9IEFIRF9NT0RFX1NDU0k7CisJCWJ1c2ZyZWV0aW1lID0gYWhkX2luYihhaGQsIFNTVEFUMikgJiBCVVNGUkVFVElNRTsKKwkJbHFvc3RhdDEgPSBhaGRfaW5iKGFoZCwgTFFPU1RBVDEpOworCQlzd2l0Y2ggKGJ1c2ZyZWV0aW1lKSB7CisJCWNhc2UgQlVTRlJFRV9ERkYwOgorCQljYXNlIEJVU0ZSRUVfREZGMToKKwkJeworCQkJdV9pbnQJc2NiaWQ7CisJCQlzdHJ1Y3QJc2NiICpzY2I7CisKKwkJCW1vZGUgPSBidXNmcmVldGltZSA9PSBCVVNGUkVFX0RGRjAKKwkJCSAgICAgPyBBSERfTU9ERV9ERkYwIDogQUhEX01PREVfREZGMTsKKwkJCWFoZF9zZXRfbW9kZXMoYWhkLCBtb2RlLCBtb2RlKTsKKwkJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRmKCIlczogSW52YWxpZCBTQ0IgJWQgaW4gREZGJWQgIgorCQkJCSAgICAgICAiZHVyaW5nIHVuZXhwZWN0ZWQgYnVzZnJlZVxuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc2NiaWQsIG1vZGUpOworCQkJCXBhY2tldGl6ZWQgPSAwOworCQkJfSBlbHNlCisJCQkJcGFja2V0aXplZCA9IChzY2ItPmZsYWdzICYgU0NCX1BBQ0tFVElaRUQpICE9IDA7CisJCQljbGVhcl9maWZvID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQlVTRlJFRV9MUU86CisJCQljbGVhcl9maWZvID0gMDsKKwkJCXBhY2tldGl6ZWQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljbGVhcl9maWZvID0gMDsKKwkJCXBhY2tldGl6ZWQgPSAgKGxxb3N0YXQxICYgTFFPQlVTRlJFRSkgIT0gMDsKKwkJCWlmICghcGFja2V0aXplZAorCQkJICYmIGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkKKwkJCQlwYWNrZXRpemVkID0gMTsKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQkJcHJpbnRmKCJTYXcgQnVzZnJlZS4gIEJ1c2ZyZWV0aW1lID0gMHgleC5cbiIsCisJCQkgICAgICAgYnVzZnJlZXRpbWUpOworI2VuZGlmCisJCS8qCisJCSAqIEJ1c2ZyZWVzIHRoYXQgb2NjdXIgaW4gbm9uLXBhY2tldGl6ZWQgcGhhc2VzIGFyZQorCQkgKiBoYW5kbGVkIGJ5IHRoZSBub25wa3RfYnVzZnJlZSBoYW5kbGVyLgorCQkgKi8KKwkJaWYgKHBhY2tldGl6ZWQgJiYgYWhkX2luYihhaGQsIExBU1RQSEFTRSkgPT0gUF9CVVNGUkVFKSB7CisJCQlyZXN0YXJ0ID0gYWhkX2hhbmRsZV9wa3RfYnVzZnJlZShhaGQsIGJ1c2ZyZWV0aW1lKTsKKwkJfSBlbHNlIHsKKwkJCXBhY2tldGl6ZWQgPSAwOworCQkJcmVzdGFydCA9IGFoZF9oYW5kbGVfbm9ucGt0X2J1c2ZyZWUoYWhkKTsKKwkJfQorCQkvKgorCQkgKiBDbGVhciB0aGUgYnVzZnJlZSBpbnRlcnJ1cHQgc3RhdHVzLiAgVGhlIHNldHRpbmcgb2YKKwkJICogdGhlIGludGVycnVwdCBpcyBhIHB1bHNlLCBzbyBpbiBhIHBlcmZlY3Qgd29ybGQsIHdlCisJCSAqIHdvdWxkIG5vdCBuZWVkIHRvIG11Y2sgd2l0aCB0aGUgRU5CVVNGUkVFIGxvZ2ljLiAgVGhpcworCQkgKiB3b3VsZCBlbnN1cmUgdGhhdCBpZiB0aGUgYnVzIG1vdmVzIG9uIHRvIGFub3RoZXIKKwkJICogY29ubmVjdGlvbiwgYnVzZnJlZSBwcm90ZWN0aW9uIGlzIHN0aWxsIGluIGZvcmNlLiAgSWYKKwkJICogQlVTRlJFRVJFViBpcyBicm9rZW4sIGhvd2V2ZXIsIHdlIG11c3QgbWFudWFsbHkgY2xlYXIKKwkJICogdGhlIEVOQlVTRlJFRSBpZiB0aGUgYnVzZnJlZSBvY2N1cnJlZCBkdXJpbmcgYSBub24tcGFjaworCQkgKiBjb25uZWN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcKKwkJICogZnV0dXJlLCBwYWNrZXRpemVkLCBjb25uZWN0aW9ucy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUkJVU0ZSRUUpOworCQlpZiAocGFja2V0aXplZCA9PSAwCisJCSAmJiAoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKQorCQkJYWhkX291dGIoYWhkLCBTSU1PREUxLAorCQkJCSBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+RU5CVVNGUkVFKTsKKworCQlpZiAoY2xlYXJfZmlmbykKKwkJCWFoZF9jbGVhcl9maWZvKGFoZCwgbW9kZSk7CisKKwkJYWhkX2NsZWFyX21zZ19zdGF0ZShhaGQpOworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWlmIChyZXN0YXJ0KSB7CisJCQlhaGRfcmVzdGFydChhaGQpOworCQl9IGVsc2UgeworCQkJYWhkX3VucGF1c2UoYWhkKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiJXM6IE1pc3NpbmcgY2FzZSBpbiBhaGRfaGFuZGxlX3Njc2lpbnQuIHN0YXR1cyA9ICV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgc3RhdHVzKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlhaGRfY2xlYXJfaW50c3RhdChhaGQpOworCQlhaGRfdW5wYXVzZShhaGQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfdHJhbnNtaXNzaW9uX2Vycm9yKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJc2NiICpzY2I7CisJdV9pbnQJc2NiaWQ7CisJdV9pbnQJbHFpc3RhdDE7CisJdV9pbnQJbHFpc3RhdDI7CisJdV9pbnQJbXNnX291dDsKKwl1X2ludAljdXJwaGFzZTsKKwl1X2ludAlsYXN0cGhhc2U7CisJdV9pbnQJcGVycmRpYWc7CisJdV9pbnQJY3VyX2NvbDsKKwlpbnQJc2lsZW50OworCisJc2NiID0gTlVMTDsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJbHFpc3RhdDEgPSBhaGRfaW5iKGFoZCwgTFFJU1RBVDEpICYgfihMUUlQSEFTRV9MUXxMUUlQSEFTRV9OTFEpOworCWxxaXN0YXQyID0gYWhkX2luYihhaGQsIExRSVNUQVQyKTsKKwlpZiAoKGxxaXN0YXQxICYgKExRSUNSQ0lfTkxRfExRSUNSQ0lfTFEpKSA9PSAwCisJICYmIChhaGQtPmJ1Z3MgJiBBSERfTkxRSUNSQ19ERUxBWUVEX0JVRykgIT0gMCkgeworCQl1X2ludCBscWlzdGF0ZTsKKworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCQlscWlzdGF0ZSA9IGFoZF9pbmIoYWhkLCBMUUlTVEFURSk7CisJCWlmICgobHFpc3RhdGUgPj0gMHgxRSAmJiBscWlzdGF0ZSA8PSAweDI0KQorCQkgfHwgKGxxaXN0YXRlID09IDB4MjkpKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1JFQ09WRVJZKSAhPSAwKSB7CisJCQkJcHJpbnRmKCIlczogTkxRQ1JDIGZvdW5kIHZpYSBMUUlTVEFURVxuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCQl9CisjZW5kaWYKKwkJCWxxaXN0YXQxIHw9IExRSUNSQ0lfTkxROworCQl9CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwl9CisKKwlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIGxxaXN0YXQxKTsKKwlsYXN0cGhhc2UgPSBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKTsKKwljdXJwaGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCXBlcnJkaWFnID0gYWhkX2luYihhaGQsIFBFUlJESUFHKTsKKwltc2dfb3V0ID0gTVNHX0lOSVRJQVRPUl9ERVRfRVJSOworCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlNDU0lQRVJSKTsKKwkKKwkvKgorCSAqIFRyeSB0byBmaW5kIHRoZSBTQ0IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuCisJICovCisJc2lsZW50ID0gRkFMU0U7CisJaWYgKGxxaXN0YXQxID09IDAKKwkgfHwgKGxxaXN0YXQxICYgTFFJQ1JDSV9OTFEpICE9IDApIHsKKwkgCWlmICgobHFpc3RhdDEgJiAoTFFJQ1JDSV9OTFF8TFFJT1ZFUklfTkxRKSkgIT0gMCkKKwkJCWFoZF9zZXRfYWN0aXZlX2ZpZm8oYWhkKTsKKwkJc2NiaWQgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiAhPSBOVUxMICYmIFNDQl9JU19TSUxFTlQoc2NiKSkKKwkJCXNpbGVudCA9IFRSVUU7CisJfQorCisJY3VyX2NvbCA9IDA7CisJaWYgKHNpbGVudCA9PSBGQUxTRSkgeworCQlwcmludGYoIiVzOiBUcmFuc21pc3Npb24gZXJyb3IgZGV0ZWN0ZWRcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlhaGRfbHFpc3RhdDFfcHJpbnQobHFpc3RhdDEsICZjdXJfY29sLCA1MCk7CisJCWFoZF9sYXN0cGhhc2VfcHJpbnQobGFzdHBoYXNlLCAmY3VyX2NvbCwgNTApOworCQlhaGRfc2NzaXNpZ2lfcHJpbnQoY3VycGhhc2UsICZjdXJfY29sLCA1MCk7CisJCWFoZF9wZXJyZGlhZ19wcmludChwZXJyZGlhZywgJmN1cl9jb2wsIDUwKTsKKwkJcHJpbnRmKCJcbiIpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJfQorCisJaWYgKChscWlzdGF0MSAmIChMUUlPVkVSSV9MUXxMUUlPVkVSSV9OTFEpKSAhPSAwKSB7CisJCWlmIChzaWxlbnQgPT0gRkFMU0UpIHsKKwkJCXByaW50ZigiJXM6IEdyb3NzIHByb3RvY29sIGVycm9yIGR1cmluZyBpbmNvbWluZyAiCisJCQkgICAgICAgInBhY2tldC4gIGxxaXN0YXQxID09IDB4JXguICBSZXNldHRpbmcgYnVzLlxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBscWlzdGF0MSk7CisJCX0KKwkJYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCAnQScsIC8qSW5pdGlhdGUgUmVzZXQqL1RSVUUpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICgobHFpc3RhdDEgJiBMUUlDUkNJX0xRKSAhPSAwKSB7CisJCS8qCisJCSAqIEEgQ1JDIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIG9uIGFuIGluY29taW5nIExRLgorCQkgKiBUaGUgYnVzIGlzIGN1cnJlbnRseSBodW5nIG9uIHRoZSBsYXN0IEFDSy4KKwkJICogSGl0IExRSVJFVFJZIHRvIHJlbGVhc2UgdGhlIGxhc3QgYWNrLCBhbmQKKwkJICogd2FpdCBmb3IgdGhlIHNlcXVlbmNlciB0byBkZXRlcm1pbmUgdGhhdCBBVE5PCisJCSAqIGlzIGFzc2VydGVkIHdoaWxlIGluIG1lc3NhZ2Ugb3V0IHRvIHRha2UgdXMKKwkJICogdG8gb3VyIGhvc3QgbWVzc2FnZSBsb29wLiAgTm8gTk9OUEFDS1JFUSBvcgorCQkgKiBMUUlQSEFTRSB0eXBlIGVycm9ycyB3aWxsIG9jY3VyIGluIHRoaXMKKwkJICogc2NlbmFyaW8uICBBZnRlciB0aGlzIGZpcnN0IExRSVJFVFJZLCB0aGUgTFFJCisJCSAqIG1hbmFnZXIgd2lsbCBiZSBpbiBJU0VMTyB3aGVyZSBpdCB3aWxsCisJCSAqIGhhcHBpbHkgc2l0IHVudGlsIGFub3RoZXIgcGFja2V0IHBoYXNlIGJlZ2lucy4KKwkJICogVW5leHBlY3RlZCBidXMgZnJlZSBkZXRlY3Rpb24gaXMgZW5hYmxlZAorCQkgKiB0aHJvdWdoIGFueSBwaGFzZXMgdGhhdCBvY2N1ciBhZnRlciB3ZSByZWxlYXNlCisJCSAqIHRoaXMgbGFzdCBhY2sgdW50aWwgdGhlIExRSSBtYW5hZ2VyIHNlZXMgYQorCQkgKiBwYWNrZXQgcGhhc2UuICBUaGlzIGltcGxpZXMgd2UgbWF5IGhhdmUgdG8KKwkJICogaWdub3JlIGEgcGVyZmVjdGx5IHZhbGlkICJ1bmV4ZWN0ZWQgYnVzZnJlZSIKKwkJICogYWZ0ZXIgb3VyICJpbml0aWF0b3IgZGV0ZWN0ZWQgZXJyb3IiIG1lc3NhZ2UgaXMKKwkJICogc2VudC4gIEEgYnVzZnJlZSBpcyB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgYWZ0ZXIKKwkJICogd2UgdGVsbCB0aGUgdGFyZ2V0IHRoYXQgaXQncyBMX1Egd2FzIGNvcnJ1cHRlZC4KKwkJICogKFNQSTRSMDkgMTAuNy4zLjMuMykKKwkJICovCisJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CisJCXByaW50ZigiTFFJUmV0cnkgZm9yIExRSUNSQ0lfTFEgdG8gcmVsZWFzZSBBQ0tcbiIpOworCX0gZWxzZSBpZiAoKGxxaXN0YXQxICYgTFFJQ1JDSV9OTFEpICE9IDApIHsKKwkJLyoKKwkJICogV2UgZGV0ZWN0ZWQgYSBDUkMgZXJyb3IgaW4gYSBOT04tTFEgcGFja2V0LgorCQkgKiBUaGUgaGFyZHdhcmUgaGFzIHZhcnlpbmcgYmVoYXZpb3IgaW4gdGhpcyBzaXR1YXRpb24KKwkJICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyBwYWNrZXQgd2FzIHBhcnQgb2YgYQorCQkgKiBzdHJlYW0gb3Igbm90LgorCQkgKgorCQkgKiBQS1QgYnkgUEtUIG1vZGU6CisJCSAqIFRoZSBoYXJkd2FyZSBoYXMgYWxyZWFkeSBhY2tlZCB0aGUgY29tcGxldGUgcGFja2V0LgorCQkgKiBJZiB0aGUgdGFyZ2V0IGhvbm9ycyBvdXIgb3V0c3RhbmRpbmcgQVROIGNvbmRpdGlvbiwKKwkJICogd2Ugc2hvdWxkIGJlIChvciBzb29uIHdpbGwgYmUpIGluIE1TR09VVCBwaGFzZS4KKwkJICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIExRSVBIQVNFX0xRIHN0YXR1cyBiaXQgYXMgdGhlCisJCSAqIGhhcmR3YXJlIHdhcyBleHBlY3RpbmcgYW5vdGhlciBMUS4gIFVuZXhwZWN0ZWQKKwkJICogYnVzZnJlZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4gIE9uY2UgTFFJUEhBU0VfTFEgaXMKKwkJICogdHJ1ZSAoZmlyc3QgZW50cnkgaW50byBob3N0IG1lc3NhZ2UgbG9vcCBpcyBtdWNoCisJCSAqIHRoZSBzYW1lKSwgd2UgbXVzdCBjbGVhciBMUUlQSEFTRV9MUSBhbmQgaGl0CisJCSAqIExRSVJFVFJZIHNvIHRoZSBoYXJkd2FyZSBpcyByZWFkeSB0byBoYW5kbGUKKwkJICogYSBmdXR1cmUgTFEuICBOT05QQUNLUkVRIHdpbGwgbm90IGJlIGFzc2VydGVkIGFnYWluCisJCSAqIG9uY2Ugd2UgaGl0IExRSVJFVFJZIHVudGlsIGFub3RoZXIgcGFja2V0IGlzCisJCSAqIHByb2Nlc3NlZC4gIFRoZSB0YXJnZXQgbWF5IGVpdGhlciBnbyBidXNmcmVlCisJCSAqIG9yIHN0YXJ0IGFub3RoZXIgcGFja2V0IGluIHJlc3BvbnNlIHRvIG91ciBtZXNzYWdlLgorCQkgKgorCQkgKiBSZWFkIFN0cmVhbWluZyBQMCBhc3NlcnRlZDoKKwkJICogSWYgd2UgcmFpc2UgQVROIGFuZCB0aGUgdGFyZ2V0IGNvbXBsZXRlcyB0aGUgZW50aXJlCisJCSAqIHN0cmVhbSAoUDAgYXNzZXJ0ZWQgZHVyaW5nIHRoZSBsYXN0IHBhY2tldCksIHRoZQorCQkgKiBoYXJkd2FyZSB3aWxsIGFjayBhbGwgZGF0YSBhbmQgcmV0dXJuIHRvIHRoZSBJU1RBUlQKKwkJICogc3RhdGUuICBXaGVuIHRoZSB0YXJnZXQgcmVwb25kcyB0byBvdXIgQVROIGNvbmRpdGlvbiwKKwkJICogTFFJUEhBU0VfTFEgd2lsbCBiZSBhc3NlcnRlZC4gIFdlIHNob3VsZCByZXNwb25kIHRvCisJCSAqIHRoaXMgd2l0aCBhbiBMUUlSRVRSWSB0byBwcmVwYXJlIGZvciBhbnkgZnV0dXJlCisJCSAqIHBhY2tldHMuICBOT05QQUNLUkVRIHdpbGwgbm90IGJlIGFzc2VydGVkIGFnYWluCisJCSAqIG9uY2Ugd2UgaGl0IExRSVJFVFJZIHVudGlsIGFub3RoZXIgcGFja2V0IGlzCisJCSAqIHByb2Nlc3NlZC4gIFRoZSB0YXJnZXQgbWF5IGVpdGhlciBnbyBidXNmcmVlIG9yCisJCSAqIHN0YXJ0IGFub3RoZXIgcGFja2V0IGluIHJlc3BvbnNlIHRvIG91ciBtZXNzYWdlLgorCQkgKiBCdXNmcmVlIGRldGVjdGlvbiBpcyBlbmFibGVkLgorCQkgKgorCQkgKiBSZWFkIFN0cmVhbWluZyBQMCBub3QgYXNzZXJ0ZWQ6CisJCSAqIElmIHdlIHJhaXNlIEFUTiBhbmQgdGhlIHRhcmdldCB0cmFuc2l0aW9ucyB0bworCQkgKiBNU0dPVVQgaW4gb3IgYWZ0ZXIgYSBwYWNrZXQgd2hlcmUgUDAgaXMgbm90CisJCSAqIGFzc2VydGVkLCB0aGUgaGFyZHdhcmUgd2lsbCBhc3NlcnQgTFFJUEhBU0VfTkxRLgorCQkgKiBXZSBzaG91bGQgcmVzcG9uZCB0byB0aGUgTFFJUEhBU0VfTkxRIHdpdGggYW4KKwkJICogTFFJUkVUUlkuICBTaG91bGQgdGhlIHRhcmdldCBzdGF5IGluIGEgbm9uLXBrdAorCQkgKiBwaGFzZSBhZnRlciB3ZSBzZW5kIG91ciBtZXNzYWdlLCB0aGUgaGFyZHdhcmUKKwkJICogd2lsbCBhc3NlcnQgTFFJUEhBU0VfTFEuICBSZWNvdmVyeSBpcyB0aGVuIGp1c3QgYXMKKwkJICogbGlzdGVkIGFib3ZlIGZvciB0aGUgcmVhZCBzdHJlYW1pbmcgd2l0aCBQMCBhc3NlcnRlZC4KKwkJICogQnVzZnJlZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4KKwkJICovCisJCWlmIChzaWxlbnQgPT0gRkFMU0UpCisJCQlwcmludGYoIkxRSUNSQ19OTFFcbiIpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IE5vIFNDQiB2YWxpZCBmb3IgTFFJQ1JDX05MUS4gICIKKwkJCSAgICAgICAiUmVzZXR0aW5nIGJ1c1xuIiwgYWhkX25hbWUoYWhkKSk7CisJCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKChscWlzdGF0MSAmIExRSUJBRExRSSkgIT0gMCkgeworCQlwcmludGYoIk5lZWQgdG8gaGFuZGxlIEJBRExRSSFcbiIpOworCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKChwZXJyZGlhZyAmIChQQVJJVFlFUlJ8UFJFVlBIQVNFKSkgPT0gUEFSSVRZRVJSKSB7CisJCWlmICgoY3VycGhhc2UgJiB+UF9EQVRBSU5fRFQpICE9IDApIHsKKwkJCS8qIEFjayB0aGUgYnl0ZS4gIFNvIHdlIGNhbiBjb250aW51ZS4gKi8KKwkJCWlmIChzaWxlbnQgPT0gRkFMU0UpCisJCQkJcHJpbnRmKCJBY2tpbmcgJXMgdG8gY2xlYXIgcGVycm9yXG4iLAorCQkJCSAgICBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGN1cnBoYXNlKS0+cGhhc2Vtc2cpOworCQkJYWhkX2luYihhaGQsIFNDU0lEQVQpOworCQl9CisJCisJCWlmIChjdXJwaGFzZSA9PSBQX01FU0dJTikKKwkJCW1zZ19vdXQgPSBNU0dfUEFSSVRZX0VSUk9SOworCX0KKworCS8qCisJICogV2UndmUgc2V0IHRoZSBoYXJkd2FyZSB0byBhc3NlcnQgQVROIGlmIHdlIAorCSAqIGdldCBhIHBhcml0eSBlcnJvciBvbiAiaW4iIHBoYXNlcywgc28gYWxsIHdlCisJICogbmVlZCB0byBkbyBpcyBzdHVmZiB0aGUgbWVzc2FnZSBidWZmZXIgd2l0aAorCSAqIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlLiAgIkluIiBwaGFzZXMgaGF2ZSBzZXQKKwkgKiBtZXNnX291dCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBNU0dfTk9QLgorCSAqLworCWFoZC0+c2VuZF9tc2dfcGVycm9yID0gbXNnX291dDsKKwlpZiAoc2NiICE9IE5VTEwgJiYgbXNnX291dCA9PSBNU0dfSU5JVElBVE9SX0RFVF9FUlIpCisJCXNjYi0+ZmxhZ3MgfD0gU0NCX1RSQU5TTUlTU0lPTl9FUlJPUjsKKwlhaGRfb3V0YihhaGQsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJYWhkX3VucGF1c2UoYWhkKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfbHFpcGhhc2VfZXJyb3Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBscWlzdGF0MSkKK3sKKwkvKgorCSAqIENsZWFyIHRoZSBzb3VyY2VzIG9mIHRoZSBpbnRlcnJ1cHRzLgorCSAqLworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIGxxaXN0YXQxKTsKKworCS8qCisJICogSWYgdGhlICJpbGxlZ2FsIiBwaGFzZSBjaGFuZ2VzIHdlcmUgaW4gcmVzcG9uc2UKKwkgKiB0byBvdXIgQVROIHRvIGZsYWcgYSBDUkMgZXJyb3IsIEFORCB3ZSBlbmRlZCB1cAorCSAqIG9uIHBhY2tldCBib3VuZGFyaWVzLCBjbGVhciB0aGUgZXJyb3IsIHJlc3RhcnQgdGhlCisJICogTFFJIG1hbmFnZXIgYXMgYXBwcm9wcmlhdGUsIGFuZCBnbyBvbiBvdXIgbWVycnkKKwkgKiB3YXkgdG93YXJkIHNlbmRpbmcgdGhlIG1lc3NhZ2UuICBPdGhlcndpc2UsIHJlc2V0CisJICogdGhlIGJ1cyB0byBjbGVhciB0aGUgZXJyb3IuCisJICovCisJYWhkX3NldF9hY3RpdmVfZmlmbyhhaGQpOworCWlmICgoYWhkX2luYihhaGQsIFNDU0lTSUdPKSAmIEFUTk8pICE9IDAKKwkgJiYgKGFoZF9pbmIoYWhkLCBNREZGU1RBVCkgJiBETFpFUk8pICE9IDApIHsKKwkJaWYgKChscWlzdGF0MSAmIExRSVBIQVNFX0xRKSAhPSAwKSB7CisJCQlwcmludGYoIkxRSVJFVFJZIGZvciBMUUlQSEFTRV9MUVxuIik7CisJCQlhaGRfb3V0YihhaGQsIExRQ1RMMiwgTFFJUkVUUlkpOworCQl9IGVsc2UgaWYgKChscWlzdGF0MSAmIExRSVBIQVNFX05MUSkgIT0gMCkgeworCQkJcHJpbnRmKCJMUUlSRVRSWSBmb3IgTFFJUEhBU0VfTkxRXG4iKTsKKwkJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CisJCX0gZWxzZQorCQkJcGFuaWMoImFoZF9oYW5kbGVfbHFpcGhhc2VfZXJyb3I6IE5vIHBoYXNlIGVycm9yc1xuIik7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlNDU0lJTlQpOworCQlhaGRfdW5wYXVzZShhaGQpOworCX0gZWxzZSB7CisJCXByaW50ZigiUmVzZXRpbmcgQ2hhbm5lbCBmb3IgTFFJIFBoYXNlIGVycm9yXG4iKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgLypJbml0aWF0ZSBSZXNldCovVFJVRSk7CisJfQorfQorCisvKgorICogUGFja2V0aXplZCB1bmV4cGVjdGVkIG9yIGV4cGVjdGVkIGJ1c2ZyZWUuCisgKiBFbnRlcmVkIGluIG1vZGUgYmFzZWQgb24gYnVzZnJlZXRpbWUuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9oYW5kbGVfcGt0X2J1c2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBidXNmcmVldGltZSkKK3sKKwl1X2ludCBscW9zdGF0MTsKKworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCB+KEFIRF9NT0RFX1VOS05PV05fTVNLfEFIRF9NT0RFX0NGR19NU0spLAorCQkJIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSykpOworCWxxb3N0YXQxID0gYWhkX2luYihhaGQsIExRT1NUQVQxKTsKKwlpZiAoKGxxb3N0YXQxICYgTFFPQlVTRlJFRSkgIT0gMCkgeworCQlzdHJ1Y3Qgc2NiICpzY2I7CisJCXVfaW50IHNjYmlkOworCQl1X2ludCBzYXZlZF9zY2JwdHI7CisJCXVfaW50IHdhaXRpbmdfaDsKKwkJdV9pbnQgd2FpdGluZ190OworCQl1X2ludCBuZXh0OworCisJCWlmICgoYnVzZnJlZXRpbWUgJiBCVVNGUkVFX0xRTykgPT0gMCkKKwkJCXByaW50ZigiJXM6IFdhcm5pbmcsIEJVU0ZSRUUgdGltZSBpcyAweCV4LiAgIgorCQkJICAgICAgICJFeHBlY3RlZCBCVVNGUkVFX0xRTy5cbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYnVzZnJlZXRpbWUpOworCQkvKgorCQkgKiBUaGUgTFFPIG1hbmFnZXIgZGV0ZWN0ZWQgYW4gdW5leHBlY3RlZCBidXNmcmVlCisJCSAqIGVpdGhlcjoKKwkJICoKKwkJICogMSkgRHVyaW5nIGFuIG91dGdvaW5nIExRLgorCQkgKiAyKSBBZnRlciBhbiBvdXRnb2luZyBMUSBidXQgYmVmb3JlIHRoZSBmaXJzdAorCQkgKiAgICBSRVEgb2YgdGhlIGNvbW1hbmQgcGFja2V0LgorCQkgKiAzKSBEdXJpbmcgYW4gb3V0Z29pbmcgY29tbWFuZCBwYWNrZXQuCisJCSAqCisJCSAqIEluIGFsbCBjYXNlcywgQ1VSUlNDQiBpcyBwb2ludGluZyB0byB0aGUKKwkJICogU0NCIHRoYXQgZW5jb3VudGVyZWQgdGhlIGZhaWx1cmUuICBDbGVhbgorCQkgKiB1cCB0aGUgcXVldWUsIGNsZWFyIFNFTERPIGFuZCBMUU9CVVNGUkVFLAorCQkgKiBhbmQgYWxsb3cgdGhlIHNlcXVlbmNlciB0byByZXN0YXJ0IHRoZSBzZWxlY3QKKwkJICogb3V0IGF0IGl0cyBsZXN1cmUuCisJCSAqLworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCXNjYmlkID0gYWhkX2ludyhhaGQsIENVUlJTQ0IpOworCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKQorCQkgICAgICAgcGFuaWMoIlNDQiBub3QgdmFsaWQgZHVyaW5nIExRT0JVU0ZSRUUiKTsKKwkJLyoKKwkJICogQ2xlYXIgdGhlIHN0YXR1cy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgQ0xSTFFPQlVTRlJFRSk7CisJCWlmICgoYWhkLT5idWdzICYgQUhEX0NMUkxRT19BVVRPQ0xSX0JVRykgIT0gMCkKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgMCk7CisJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIGFoZF9pbmIoYWhkLCBTQ1NJU0VRMCkgJiB+RU5TRUxPKTsKKwkJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMCwgQ0xSU0VMRE8pOworCisJCS8qCisJCSAqIFJldHVybiB0aGUgTFFPIG1hbmFnZXIgdG8gaXRzIGlkbGUgbG9vcC4gIEl0IHdpbGwKKwkJICogbm90IGRvIHRoaXMgYXV0b21hdGljYWxseSBpZiB0aGUgYnVzZnJlZSBvY2N1cnMKKwkJICogYWZ0ZXIgdGhlIGZpcnN0IFJFUSBvZiBlaXRoZXIgdGhlIExRIG9yIGNvbW1hbmQKKwkJICogcGFja2V0IG9yIGJldHdlZW4gdGhlIExRIGFuZCBjb21tYW5kIHBhY2tldC4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBhaGRfaW5iKGFoZCwgTFFDVEwyKSB8IExRT1RPSURMRSk7CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB3YWl0aW5nIGZvciBzZWxlY3Rpb24gcXVldWUgc28KKwkJICogd2UgcmVzdGFydCBvbiB0aGUgY29ycmVjdCBTQ0IuCisJCSAqLworCQl3YWl0aW5nX2ggPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCk7CisJCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCWlmICh3YWl0aW5nX2ggIT0gc2NiaWQpIHsKKworCQkJYWhkX291dHcoYWhkLCBXQUlUSU5HX1RJRF9IRUFELCBzY2JpZCk7CisJCQl3YWl0aW5nX3QgPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfVEFJTCk7CisJCQlpZiAod2FpdGluZ190ID09IHdhaXRpbmdfaCkgeworCQkJCWFoZF9vdXR3KGFoZCwgV0FJVElOR19USURfVEFJTCwgc2NiaWQpOworCQkJCW5leHQgPSBTQ0JfTElTVF9OVUxMOworCQkJfSBlbHNlIHsKKwkJCQlhaGRfc2V0X3NjYnB0cihhaGQsIHdhaXRpbmdfaCk7CisJCQkJbmV4dCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKTsKKwkJCX0KKwkJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiaWQpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVDIsIG5leHQpOworCQl9CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NicHRyKTsKKwkJaWYgKHNjYi0+Y3JjX3JldHJ5X2NvdW50IDwgQUhEX01BWF9MUV9DUkNfRVJST1JTKSB7CisJCQlpZiAoU0NCX0lTX1NJTEVOVChzY2IpID09IEZBTFNFKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiUHJvYmFibGUgb3V0Z29pbmcgTFEgQ1JDIGVycm9yLiAgIgorCQkJCSAgICAgICAiUmV0cnlpbmcgY29tbWFuZFxuIik7CisJCQl9CisJCQlzY2ItPmNyY19yZXRyeV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKKwkJCWFoZF9mcmVlemVfc2NiKHNjYik7CisJCQlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOworCQl9CisJCS8qIFJldHVybiB1bnBhdXNpbmcgdGhlIHNlcXVlbmNlci4gKi8KKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgaWYgKChhaGRfaW5iKGFoZCwgUEVSUkRJQUcpICYgUEFSSVRZRVJSKSAhPSAwKSB7CisJCS8qCisJCSAqIElnbm9yZSB3aGF0IGFyZSByZWFsbHkgcGFyaXR5IGVycm9ycyB0aGF0CisJCSAqIG9jY3VyIG9uIHRoZSBsYXN0IFJFUSBvZiBhIGZyZWUgcnVubmluZworCQkgKiBjbG9jayBwcmlvciB0byBnb2luZyBidXNmcmVlLiAgU29tZSBkcml2ZXMKKwkJICogZG8gbm90IHByb3Blcmx5IGFjdGl2ZSBuZWdhdGUganVzdCBiZWZvcmUKKwkJICogZ29pbmcgYnVzZnJlZSByZXN1bHRpbmcgaW4gYSBwYXJpdHkgZ2xpdGNoLgorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0NTSVBFUlJ8Q0xSQlVTRlJFRSk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUFTS0VEX0VSUk9SUykgIT0gMCkKKwkJCXByaW50ZigiJXM6IFBhcml0eSBvbiBsYXN0IFJFUSBkZXRlY3RlZCAiCisJCQkgICAgICAgImR1cmluZyBidXNmcmVlIHBoYXNlLlxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCQkvKiBSZXR1cm4gdW5wYXVzaW5nIHRoZSBzZXF1ZW5jZXIuICovCisJCXJldHVybiAoMCk7CisJfQorCWlmIChhaGQtPnNyY19tb2RlICE9IEFIRF9NT0RFX1NDU0kpIHsKKwkJdV9pbnQJc2NiaWQ7CisJCXN0cnVjdAlzY2IgKnNjYjsKKworCQlzY2JpZCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOworCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCXByaW50ZigiVW5leHBlY3RlZCBQS1QgYnVzZnJlZSBjb25kaXRpb25cbiIpOworCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCWFoZF9hYm9ydF9zY2JzKGFoZCwgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpLCAnQScsCisJCQkgICAgICAgU0NCX0dFVF9MVU4oc2NiKSwgU0NCX0dFVF9UQUcoc2NiKSwKKwkJCSAgICAgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1VORVhQX0JVU0ZSRUUpOworCisJCS8qIFJldHVybiByZXN0YXJ0aW5nIHRoZSBzZXF1ZW5jZXIuICovCisJCXJldHVybiAoMSk7CisJfQorCXByaW50ZigiJXM6IFVuZXhwZWN0ZWQgUEtUIGJ1c2ZyZWUgY29uZGl0aW9uXG4iLCBhaGRfbmFtZShhaGQpKTsKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJLyogUmVzdGFydCB0aGUgc2VxdWVuY2VyLiAqLworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBOb24tcGFja2V0aXplZCB1bmV4cGVjdGVkIG9yIGV4cGVjdGVkIGJ1c2ZyZWUuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9oYW5kbGVfbm9ucGt0X2J1c2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdAlzY2IgKnNjYjsKKwl1X2ludAlsYXN0cGhhc2U7CisJdV9pbnQJc2F2ZWRfc2NzaWlkOworCXVfaW50CXNhdmVkX2x1bjsKKwl1X2ludAl0YXJnZXQ7CisJdV9pbnQJaW5pdGlhdG9yX3JvbGVfaWQ7CisJdV9pbnQJc2NiaWQ7CisJdV9pbnQJcHByX2J1c2ZyZWU7CisJaW50CXByaW50ZXJyb3I7CisKKwkvKgorCSAqIExvb2sgYXQgd2hhdCBwaGFzZSB3ZSB3ZXJlIGxhc3QgaW4uICBJZiBpdHMgbWVzc2FnZSBvdXQsCisJICogY2hhbmNlcyBhcmUgcHJldHR5IGdvb2QgdGhhdCB0aGUgYnVzZnJlZSB3YXMgaW4gcmVzcG9uc2UKKwkgKiB0byBvbmUgb2Ygb3VyIGFib3J0IHJlcXVlc3RzLgorCSAqLworCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCXNhdmVkX3Njc2lpZCA9IGFoZF9pbmIoYWhkLCBTQVZFRF9TQ1NJSUQpOworCXNhdmVkX2x1biA9IGFoZF9pbmIoYWhkLCBTQVZFRF9MVU4pOworCXRhcmdldCA9IFNDU0lJRF9UQVJHRVQoYWhkLCBzYXZlZF9zY3NpaWQpOworCWluaXRpYXRvcl9yb2xlX2lkID0gU0NTSUlEX09VUl9JRChzYXZlZF9zY3NpaWQpOworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIGluaXRpYXRvcl9yb2xlX2lkLAorCQkJICAgIHRhcmdldCwgc2F2ZWRfbHVuLCAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwlwcmludGVycm9yID0gMTsKKworCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwlpZiAoc2NiICE9IE5VTEwKKwkgJiYgKGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgTk9UX0lERU5USUZJRUQpICE9IDApCisJCXNjYiA9IE5VTEw7CisKKwlwcHJfYnVzZnJlZSA9IChhaGQtPm1zZ19mbGFncyAmIE1TR19GTEFHX0VYUEVDVF9QUFJfQlVTRlJFRSkgIT0gMDsKKwlpZiAobGFzdHBoYXNlID09IFBfTUVTR09VVCkgeworCQl1X2ludCB0YWc7CisKKwkJdGFnID0gU0NCX0xJU1RfTlVMTDsKKwkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR18xQiwgTVNHX0FCT1JUX1RBRywgVFJVRSkKKwkJIHx8IGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR18xQiwgTVNHX0FCT1JULCBUUlVFKSkgeworCQkJaW50IGZvdW5kOworCQkJaW50IHNlbnRfbXNnOworCisJCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwkJCQlwcmludGYoIkFib3J0IGZvciB1bmlkZW50aWZpZWQgIgorCQkJCSAgICAgICAiY29ubmVjdGlvbiBjb21wbGV0ZWQuXG4iKTsKKwkJCQkvKiByZXN0YXJ0IHRoZSBzZXF1ZW5jZXIuICovCisJCQkJcmV0dXJuICgxKTsKKwkJCX0KKwkJCXNlbnRfbXNnID0gYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4IC0gMV07CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNDQiAlZCAtIEFib3J0JXMgQ29tcGxldGVkLlxuIiwKKwkJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpLAorCQkJICAgICAgIHNlbnRfbXNnID09IE1TR19BQk9SVF9UQUcgPyAiIiA6ICIgVGFnIik7CisKKwkJCWlmIChzZW50X21zZyA9PSBNU0dfQUJPUlRfVEFHKQorCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisKKwkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9DTURQSEFTRV9BQk9SVCkgIT0gMCkgeworCQkJCS8qCisJCQkJICogVGhpcyBhYm9ydCBpcyBpbiByZXNwb25zZSB0byBhbgorCQkJCSAqIHVuZXhwZWN0ZWQgc3dpdGNoIHRvIGNvbW1hbmQgcGhhc2UKKwkJCQkgKiBmb3IgYSBwYWNrZXRpemVkIGNvbm5lY3Rpb24uICBTaW5jZQorCQkJCSAqIHRoZSBpZGVudGlmeSBtZXNzYWdlIHdhcyBuZXZlciBzZW50LAorCQkJCSAqICJzYXZlZCBsdW4iIGlzIDAuICBXZSByZWFsbHkgd2FudCB0bworCQkJCSAqIGFib3J0IG9ubHkgdGhlIFNDQiB0aGF0IGVuY291bnRlcmVkCisJCQkJICogdGhpcyBlcnJvciwgd2hpY2ggY291bGQgaGF2ZSBhIGRpZmZlcmVudAorCQkJCSAqIGx1bi4gIFRoZSBTQ0Igd2lsbCBiZSByZXRyaWVkIHNvIHRoZSBPUworCQkJCSAqIHdpbGwgc2VlIHRoZSBVQSBhZnRlciByZW5lZ290aWF0aW5nIHRvCisJCQkJICogcGFja2V0aXplZC4KKwkJCQkgKi8KKwkJCQl0YWcgPSBTQ0JfR0VUX1RBRyhzY2IpOworCQkJCXNhdmVkX2x1biA9IHNjYi0+aHNjYi0+bHVuOworCQkJfQorCQkJZm91bmQgPSBhaGRfYWJvcnRfc2NicyhhaGQsIHRhcmdldCwgJ0EnLCBzYXZlZF9sdW4sCisJCQkJCSAgICAgICB0YWcsIFJPTEVfSU5JVElBVE9SLAorCQkJCQkgICAgICAgQ0FNX1JFUV9BQk9SVEVEKTsKKwkJCXByaW50ZigiZm91bmQgPT0gMHgleFxuIiwgZm91bmQpOworCQkJcHJpbnRlcnJvciA9IDA7CisJCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHXzFCLAorCQkJCQlNU0dfQlVTX0RFVl9SRVNFVCwgVFJVRSkpIHsKKyNpZmRlZiBfX0ZyZWVCU0RfXworCQkJLyoKKwkJCSAqIERvbid0IG1hcmsgdGhlIHVzZXIncyByZXF1ZXN0IGZvciB0aGlzIEJEUgorCQkJICogYXMgY29tcGxldGluZyB3aXRoIENBTV9CRFJfU0VOVC4gIENBTTMKKwkJCSAqIHNwZWNpZmllcyBDQU1fUkVRX0NNUC4KKwkJCSAqLworCQkJaWYgKHNjYiAhPSBOVUxMCisJCQkgJiYgc2NiLT5pb19jdHgtPmNjYl9oLmZ1bmNfY29kZT09IFhQVF9SRVNFVF9ERVYKKwkJCSAmJiBhaGRfbWF0Y2hfc2NiKGFoZCwgc2NiLCB0YXJnZXQsICdBJywKKwkJCQkJICBDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLAorCQkJCQkgIFJPTEVfSU5JVElBVE9SKSkKKwkJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFfQ01QKTsKKyNlbmRpZgorCQkJYWhkX2hhbmRsZV9kZXZyZXNldChhaGQsICZkZXZpbmZvLCBDQU1fTFVOX1dJTERDQVJELAorCQkJCQkgICAgQ0FNX0JEUl9TRU5ULCAiQnVzIERldmljZSBSZXNldCIsCisJCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzApOworCQkJcHJpbnRlcnJvciA9IDA7CisJCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHX0VYVCwgTVNHX0VYVF9QUFIsIEZBTFNFKQorCQkJJiYgcHByX2J1c2ZyZWUgPT0gMCkgeworCQkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQkJLyoKKwkJCSAqIFBQUiBSZWplY3RlZC4gIFRyeSBub24tcHByIG5lZ290aWF0aW9uCisJCQkgKiBhbmQgcmV0cnkgY29tbWFuZC4KKwkJCSAqLworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIlBQUiBuZWdvdGlhdGlvbiByZWplY3RlZCBidXNmcmVlLlxuIik7CisjZW5kaWYKKwkJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGRldmluZm8uY2hhbm5lbCwKKwkJCQkJCSAgICBkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkgICAgZGV2aW5mby50YXJnZXQsICZ0c3RhdGUpOworCQkJdGluZm8tPmN1cnIudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQkJdGluZm8tPmdvYWwucHByX29wdGlvbnMgPSAwOworCQkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoZCwgc2NiKTsKKwkJCXByaW50ZXJyb3IgPSAwOworCQl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfV0RUUiwgRkFMU0UpCisJCQkmJiBwcHJfYnVzZnJlZSA9PSAwKSB7CisJCQkvKgorCQkJICogTmVnb3RpYXRpb24gUmVqZWN0ZWQuICBHby1uYXJyb3cgYW5kCisJCQkgKiByZXRyeSBjb21tYW5kLgorCQkJICovCisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJCXByaW50ZigiV0RUUiBuZWdvdGlhdGlvbiByZWplY3RlZCBidXNmcmVlLlxuIik7CisjZW5kaWYKKwkJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywKKwkJCQkgICAgICBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCSAgICAgIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJICAgICAgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoZCwgc2NiKTsKKwkJCXByaW50ZXJyb3IgPSAwOworCQl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfU0RUUiwgRkFMU0UpCisJCQkmJiBwcHJfYnVzZnJlZSA9PSAwKSB7CisJCQkvKgorCQkJICogTmVnb3RpYXRpb24gUmVqZWN0ZWQuICBHby1hc3luYyBhbmQKKwkJCSAqIHJldHJ5IGNvbW1hbmQuCisJCQkgKi8KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCisJCQkJcHJpbnRmKCJTRFRSIG5lZ290aWF0aW9uIHJlamVjdGVkIGJ1c2ZyZWUuXG4iKTsKKyNlbmRpZgorCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLAorCQkJCQkvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsCisJCQkJCS8qcHByX29wdGlvbnMqLzAsCisJCQkJCUFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJCS8qcGF1c2VkKi9UUlVFKTsKKwkJCWFoZF9xaW5maWZvX3JlcXVldWVfdGFpbChhaGQsIHNjYik7CisJCQlwcmludGVycm9yID0gMDsKKwkJfSBlbHNlIGlmICgoYWhkLT5tc2dfZmxhZ3MgJiBNU0dfRkxBR19FWFBFQ1RfSURFX0JVU0ZSRUUpICE9IDAKKwkJCSYmIGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR18xQiwKKwkJCQkJIE1TR19JTklUSUFUT1JfREVUX0VSUiwgVFJVRSkpIHsKKworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIkV4cGVjdGVkIElERSBCdXNmcmVlXG4iKTsKKyNlbmRpZgorCQkJcHJpbnRlcnJvciA9IDA7CisJCX0gZWxzZSBpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfRVhQRUNUX1FBU1JFSl9CVVNGUkVFKQorCQkJJiYgYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHXzFCLAorCQkJCQlNU0dfTUVTU0FHRV9SRUpFQ1QsIFRSVUUpKSB7CisKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCisJCQkJcHJpbnRmKCJFeHBlY3RlZCBRQVMgUmVqZWN0IEJ1c2ZyZWVcbiIpOworI2VuZGlmCisJCQlwcmludGVycm9yID0gMDsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGJ1c2ZyZWUgcmVxdWlyZWQgZmxhZyBpcyBob25vcmVkIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGUgbWVzc2FnZSBwaGFzZXMuICBXZSBjaGVjayBpdCBsYXN0IGluIGNhc2Ugd2UKKwkgKiBoYWQgdG8gc2VuZCBzb21lIG90aGVyIG1lc3NhZ2UgdGhhdCBjYXVzZWQgYSBidXNmcmVlLgorCSAqLworCWlmIChwcmludGVycm9yICE9IDAKKwkgJiYgKGxhc3RwaGFzZSA9PSBQX01FU0dJTiB8fCBsYXN0cGhhc2UgPT0gUF9NRVNHT1VUKQorCSAmJiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfRVhQRUNUX1BQUl9CVVNGUkVFKSAhPSAwKSkgeworCisJCWFoZF9mcmVlemVfZGV2cShhaGQsIHNjYik7CisJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJaWYgKChhaGQtPm1zZ19mbGFncyAmIE1TR19GTEFHX0lVX1JFUV9DSEFOR0VEKSAhPSAwKSB7CisJCQlhaGRfYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQkgICAgICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkgICAgICAgU0NCX0dFVF9MVU4oc2NiKSwgU0NCX0xJU1RfTlVMTCwKKwkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsIENBTV9SRVFfQUJPUlRFRCk7CisJCX0gZWxzZSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJCXByaW50ZigiUFBSIE5lZ290aWF0aW9uIEJ1c2ZyZWUuXG4iKTsKKyNlbmRpZgorCQkJYWhkX2RvbmUoYWhkLCBzY2IpOworCQl9CisJCXByaW50ZXJyb3IgPSAwOworCX0KKwlpZiAocHJpbnRlcnJvciAhPSAwKSB7CisJCWludCBhYm9ydGVkOworCisJCWFib3J0ZWQgPSAwOworCQlpZiAoc2NiICE9IE5VTEwpIHsKKwkJCXVfaW50IHRhZzsKKworCQkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKQorCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQllbHNlCisJCQkJdGFnID0gU0NCX0xJU1RfTlVMTDsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCWFib3J0ZWQgPSBhaGRfYWJvcnRfc2NicyhhaGQsIHRhcmdldCwgJ0EnLAorCQkJCSAgICAgICBTQ0JfR0VUX0xVTihzY2IpLCB0YWcsCisJCQkJICAgICAgIFJPTEVfSU5JVElBVE9SLAorCQkJCSAgICAgICBDQU1fVU5FWFBfQlVTRlJFRSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgaGFkIG5vdCBmdWxseSBpZGVudGlmaWVkIHRoaXMgY29ubmVjdGlvbiwKKwkJCSAqIHNvIHdlIGNhbm5vdCBhYm9ydCBhbnl0aGluZy4KKwkJCSAqLworCQkJcHJpbnRmKCIlczogIiwgYWhkX25hbWUoYWhkKSk7CisJCX0KKwkJaWYgKGxhc3RwaGFzZSAhPSBQX0JVU0ZSRUUpCisJCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGQsICZkZXZpbmZvKTsKKwkJcHJpbnRmKCJVbmV4cGVjdGVkIGJ1c2ZyZWUgJXMsICVkIFNDQnMgYWJvcnRlZCwgIgorCQkgICAgICAgIlBSR01DTlQgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkobGFzdHBoYXNlKS0+cGhhc2Vtc2csCisJCSAgICAgICBhYm9ydGVkLAorCQkgICAgICAgYWhkX2luYihhaGQsIFBSR01DTlQpCisJCQl8IChhaGRfaW5iKGFoZCwgUFJHTUNOVCsxKSA8PCA4KSk7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwl9CisJLyogQWx3YXlzIHJlc3RhcnQgdGhlIHNlcXVlbmNlci4gKi8KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2hhbmRsZV9wcm90b192aW9sYXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdAlzY2IgKnNjYjsKKwl1X2ludAlzY2JpZDsKKwl1X2ludAlzZXFfZmxhZ3M7CisJdV9pbnQJY3VycGhhc2U7CisJdV9pbnQJbGFzdHBoYXNlOworCWludAlmb3VuZDsKKworCWFoZF9mZXRjaF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwlzZXFfZmxhZ3MgPSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKTsKKwljdXJwaGFzZSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCWxhc3RwaGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCWlmICgoc2VxX2ZsYWdzICYgTk9UX0lERU5USUZJRUQpICE9IDApIHsKKworCQkvKgorCQkgKiBUaGUgcmVjb25uZWN0aW5nIHRhcmdldCBlaXRoZXIgZGlkIG5vdCBzZW5kIGFuCisJCSAqIGlkZW50aWZ5IG1lc3NhZ2UsIG9yIGRpZCwgYnV0IHdlIGRpZG4ndCBmaW5kIGFuIFNDQgorCQkgKiB0byBtYXRjaC4KKwkJICovCisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIlRhcmdldCBkaWQgbm90IHNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZS4gIgorCQkgICAgICAgIkxBU1RQSEFTRSA9IDB4JXguXG4iLCBsYXN0cGhhc2UpOworCQlzY2IgPSBOVUxMOworCX0gZWxzZSBpZiAoc2NiID09IE5VTEwpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFuIFNDQiBhY3RpdmUgZm9yIHRoaXMKKwkJICogdHJhbnNhY3Rpb24uICBQcmludCBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIGJ1cy4KKwkJICovCisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIk5vIFNDQiBmb3VuZCBkdXJpbmcgcHJvdG9jb2wgdmlvbGF0aW9uXG4iKTsKKwkJZ290byBwcm90b192aW9sYXRpb25fcmVzZXQ7CisJfSBlbHNlIHsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VRVUVOQ0VfRkFJTCk7CisJCWlmICgoc2VxX2ZsYWdzICYgTk9fQ0RCX1NFTlQpICE9IDApIHsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXByaW50ZigiTm8gb3IgaW5jb21wbGV0ZSBDREIgc2VudCB0byBkZXZpY2UuXG4iKTsKKwkJfSBlbHNlIGlmICgoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ09OVFJPTCkKKwkJCSAgJiBTVEFUVVNfUkNWRCkgPT0gMCkgeworCQkJLyoKKwkJCSAqIFRoZSB0YXJnZXQgbmV2ZXIgYm90aGVyZWQgdG8gcHJvdmlkZSBzdGF0dXMgdG8KKwkJCSAqIHVzIHByaW9yIHRvIGNvbXBsZXRpbmcgdGhlIGNvbW1hbmQuICBTaW5jZSB3ZSBkb24ndAorCQkJICoga25vdyB0aGUgZGlzcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kLCB3ZSBtdXN0IGF0dGVtcHQKKwkJCSAqIHRvIGFib3J0IGl0LiAgQXNzZXJ0IEFUTiBhbmQgcHJlcGFyZSB0byBzZW5kIGFuIGFib3J0CisJCQkgKiBtZXNzYWdlLgorCQkJICovCisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIkNvbXBsZXRlZCBjb21tYW5kIHdpdGhvdXQgc3RhdHVzLlxuIik7CisJCX0gZWxzZSB7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlVua25vd24gcHJvdG9jb2wgdmlvbGF0aW9uLlxuIik7CisJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCX0KKwl9CisJaWYgKChsYXN0cGhhc2UgJiB+UF9EQVRBSU5fRFQpID09IDAKKwkgfHwgbGFzdHBoYXNlID09IFBfQ09NTUFORCkgeworcHJvdG9fdmlvbGF0aW9uX3Jlc2V0OgorCQkvKgorCQkgKiBUYXJnZXQgZWl0aGVyIHdlbnQgZGlyZWN0bHkgdG8gZGF0YQorCQkgKiBwaGFzZSBvciBkaWRuJ3QgcmVzcG9uZCB0byBvdXIgQVROLgorCQkgKiBUaGUgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIGJsb3cKKwkJICogaXQgYXdheSB3aXRoIGEgYnVzIHJlc2V0LgorCQkgKi8KKwkJZm91bmQgPSBhaGRfcmVzZXRfY2hhbm5lbChhaGQsICdBJywgVFJVRSk7CisJCXByaW50ZigiJXM6IElzc3VlZCBDaGFubmVsICVjIEJ1cyBSZXNldC4gIgorCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZFxuIiwgYWhkX25hbWUoYWhkKSwgJ0EnLCBmb3VuZCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGVhdmUgdGhlIHNlbGVjdGlvbiBoYXJkd2FyZSBvZmYgaW4gY2FzZQorCQkgKiB0aGlzIGFib3J0IGF0dGVtcHQgd2lsbCBhZmZlY3QgeWV0IHRvCisJCSAqIGJlIHNlbnQgY29tbWFuZHMuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLAorCQkJIGFoZF9pbmIoYWhkLCBTQ1NJU0VRMCkgJiB+RU5TRUxPKTsKKwkJYWhkX2Fzc2VydF9hdG4oYWhkKTsKKwkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCQlhaGQtPm1zZ291dF9idWZbMF0gPSBNU0dfQUJPUlRfVEFTSzsKKwkJCWFoZC0+bXNnb3V0X2xlbiA9IDE7CisJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQlhaGQtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKwkJfSBlbHNlIHsKKwkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FCT1JUOworCQl9CisJCXByaW50ZigiUHJvdG9jb2wgdmlvbGF0aW9uICVzLiAgQXR0ZW1wdGluZyB0byBhYm9ydC5cbiIsCisJCSAgICAgICBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGN1cnBoYXNlKS0+cGhhc2Vtc2cpOworCX0KK30KKworLyoKKyAqIEZvcmNlIHJlbmVnb3RpYXRpb24gdG8gb2NjdXIgdGhlIG5leHQgdGltZSB3ZSBpbml0aWF0ZQorICogYSBjb21tYW5kIHRvIHRoZSBjdXJyZW50IGRldmljZS4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9mb3JjZV9yZW5lZ290aWF0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0YXJnX2luZm87CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJGb3JjaW5nIHJlbmVnb3RpYXRpb25cbiIpOworCX0KKyNlbmRpZgorCXRhcmdfaW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLAorCQkJCQlkZXZpbmZvLT5jaGFubmVsLAorCQkJCQlkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCQlkZXZpbmZvLT50YXJnZXQsCisJCQkJCSZ0c3RhdGUpOworCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCBkZXZpbmZvLCB0c3RhdGUsCisJCQkgICAgICAgdGFyZ19pbmZvLCBBSERfTkVHX0lGX05PTl9BU1lOQyk7Cit9CisKKyNkZWZpbmUgQUhEX01BWF9TVEVQUyAyMDAwCit2b2lkCithaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkX21vZGVfc3RhdGUJc2F2ZWRfbW9kZXM7CisJaW50CQlzdGVwcGluZzsKKwlpbnQJCXN0ZXBzOworCWludAkJZmlyc3RfaW5zdHI7CisJdV9pbnQJCXNpbW9kZTA7CisJdV9pbnQJCXNpbW9kZTE7CisJdV9pbnQJCXNpbW9kZTM7CisJdV9pbnQJCWxxaW1vZGUwOworCXVfaW50CQlscWltb2RlMTsKKwl1X2ludAkJbHFvbW9kZTA7CisJdV9pbnQJCWxxb21vZGUxOworCisJaWYgKGFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zID09IDApCisJCXJldHVybjsKKworCXN0ZXBwaW5nID0gRkFMU0U7CisJc3RlcHMgPSAwOworCWZpcnN0X2luc3RyID0gMDsKKwlzaW1vZGUwID0gMDsKKwlzaW1vZGUxID0gMDsKKwlzaW1vZGUzID0gMDsKKwlscWltb2RlMCA9IDA7CisJbHFpbW9kZTEgPSAwOworCWxxb21vZGUwID0gMDsKKwlscW9tb2RlMSA9IDA7CisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWZvciAoOzspIHsKKwkJc3RydWN0CWNzICpjczsKKwkJdV9pbnQJc2VxYWRkcjsKKwkJdV9pbnQJaTsKKworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCXNlcWFkZHIgPSBhaGRfaW5iKGFoZCwgQ1VSQUREUikKKwkJCXwgKGFoZF9pbmIoYWhkLCBDVVJBRERSKzEpIDw8IDgpOworCisJCWNzID0gYWhkLT5jcml0aWNhbF9zZWN0aW9uczsKKwkJZm9yIChpID0gMDsgaSA8IGFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBpKyssIGNzKyspIHsKKwkJCQorCQkJaWYgKGNzLT5iZWdpbiA8IHNlcWFkZHIgJiYgY3MtPmVuZCA+PSBzZXFhZGRyKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gYWhkLT5udW1fY3JpdGljYWxfc2VjdGlvbnMpCisJCQlicmVhazsKKworCQlpZiAoc3RlcHMgPiBBSERfTUFYX1NURVBTKSB7CisJCQlwcmludGYoIiVzOiBJbmZpbml0ZSBsb29wIGluIGNyaXRpY2FsIHNlY3Rpb25cbiIKKwkJCSAgICAgICAiJXM6IEZpcnN0IEluc3RydWN0aW9uIDB4JXggbm93IDB4JXhcbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX25hbWUoYWhkKSwgZmlyc3RfaW5zdHIsCisJCQkgICAgICAgc2VxYWRkcik7CisJCQlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJCQlwYW5pYygiY3JpdGljYWwgc2VjdGlvbiBsb29wIik7CisJCX0KKworCQlzdGVwcysrOworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCisJCQlwcmludGYoIiVzOiBTaW5nbGUgc3RlcHBpbmcgYXQgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCSAgICAgICBzZXFhZGRyKTsKKyNlbmRpZgorCQlpZiAoc3RlcHBpbmcgPT0gRkFMU0UpIHsKKworCQkJZmlyc3RfaW5zdHIgPSBzZXFhZGRyOworICAJCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworICAJCQlzaW1vZGUwID0gYWhkX2luYihhaGQsIFNJTU9ERTApOworCQkJc2ltb2RlMyA9IGFoZF9pbmIoYWhkLCBTSU1PREUzKTsKKwkJCWxxaW1vZGUwID0gYWhkX2luYihhaGQsIExRSU1PREUwKTsKKwkJCWxxaW1vZGUxID0gYWhkX2luYihhaGQsIExRSU1PREUxKTsKKwkJCWxxb21vZGUwID0gYWhkX2luYihhaGQsIExRT01PREUwKTsKKwkJCWxxb21vZGUxID0gYWhkX2luYihhaGQsIExRT01PREUxKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNJTU9ERTMsIDApOworCQkJYWhkX291dGIoYWhkLCBMUUlNT0RFMCwgMCk7CisJCQlhaGRfb3V0YihhaGQsIExRSU1PREUxLCAwKTsKKwkJCWFoZF9vdXRiKGFoZCwgTFFPTU9ERTAsIDApOworCQkJYWhkX291dGIoYWhkLCBMUU9NT0RFMSwgMCk7CisJCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCQlzaW1vZGUxID0gYWhkX2luYihhaGQsIFNJTU9ERTEpOworCQkJLyoKKwkJCSAqIFdlIGRvbid0IGNsZWFyIEVOQlVTRlJFRS4gIFVuZm9ydHVuYXRlbHkKKwkJCSAqIHdlIGNhbm5vdCByZS1lbmFibGUgYnVzZnJlZSBkZXRlY3Rpb24gd2l0aGluCisJCQkgKiB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBzbyB3ZSBtdXN0IGxlYXZlIGl0CisJCQkgKiBvbiB3aGlsZSBzaW5nbGUgc3RlcHBpbmcuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMSwgc2ltb2RlMSAmIEVOQlVTRlJFRSk7CisJCQlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIGFoZF9pbmIoYWhkLCBTRVFDVEwwKSB8IFNURVApOworCQkJc3RlcHBpbmcgPSBUUlVFOworCQl9CisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUkJVU0ZSRUUpOworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLCBhaGQtPnNhdmVkX2RzdF9tb2RlKTsKKwkJYWhkX291dGIoYWhkLCBIQ05UUkwsIGFoZC0+dW5wYXVzZSk7CisJCXdoaWxlICghYWhkX2lzX3BhdXNlZChhaGQpKQorCQkJYWhkX2RlbGF5KDIwMCk7CisJCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKKwl9CisJaWYgKHN0ZXBwaW5nKSB7CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgc2ltb2RlMCk7CisJCWFoZF9vdXRiKGFoZCwgU0lNT0RFMywgc2ltb2RlMyk7CisJCWFoZF9vdXRiKGFoZCwgTFFJTU9ERTAsIGxxaW1vZGUwKTsKKwkJYWhkX291dGIoYWhkLCBMUUlNT0RFMSwgbHFpbW9kZTEpOworCQlhaGRfb3V0YihhaGQsIExRT01PREUwLCBscW9tb2RlMCk7CisJCWFoZF9vdXRiKGFoZCwgTFFPTU9ERTEsIGxxb21vZGUxKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCQlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIGFoZF9pbmIoYWhkLCBTRVFDVEwwKSAmIH5TVEVQKTsKKyAgCQlhaGRfb3V0YihhaGQsIFNJTU9ERTEsIHNpbW9kZTEpOworCQkvKgorCQkgKiBTQ1NJSU5UIHNlZW1zIHRvIGdsaXRjaCBvY2Nhc3Npb25hbGx5IHdoZW4KKwkJICogdGhlIGludGVycnVwdCBtYXNrcyBhcmUgcmVzdG9yZWQuICBDbGVhciBTQ1NJSU5UCisJCSAqIG9uZSBtb3JlIHRpbWUgc28gdGhhdCBvbmx5IHBlcnNpc3RlbnQgZXJyb3JzCisJCSAqIGFyZSBzZWVuIGFzIGEgcmVhbCBpbnRlcnJ1cHQuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJfQorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworfQorCisvKgorICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cy4KKyAqLwordm9pZAorYWhkX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCB+KEFIRF9NT0RFX1VOS05PV05fTVNLfEFIRF9NT0RFX0NGR19NU0spLAorCQkJIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSykpOworCS8qIENsZWFyIGFueSBpbnRlcnJ1cHQgY29uZGl0aW9ucyB0aGlzIG1heSBoYXZlIGNhdXNlZCAqLworCWFoZF9vdXRiKGFoZCwgQ0xSTFFJSU5UMCwgQ0xSTFFJQVROUUFTfENMUkxRSUNSQ1QxfENMUkxRSUNSQ1QyCisJCQkJIHxDTFJMUUlCQURMUVR8Q0xSTFFJQVROTFF8Q0xSTFFJQVROQ01EKTsKKwlhaGRfb3V0YihhaGQsIENMUkxRSUlOVDEsIENMUkxRSVBIQVNFX0xRfENMUkxRSVBIQVNFX05MUXxDTFJMSVFBQk9SVAorCQkJCSB8Q0xSTFFJQ1JDSV9MUXxDTFJMUUlDUkNJX05MUXxDTFJMUUlCQURMUUkKKwkJCQkgfENMUkxRSU9WRVJJX0xRfENMUkxRSU9WRVJJX05MUXxDTFJOT05QQUNLUkVRKTsKKwlhaGRfb3V0YihhaGQsIENMUkxRT0lOVDAsIENMUkxRT1RBUkdTQ0JQRVJSfENMUkxRT1NUT1BUMnxDTFJMUU9BVE5MUQorCQkJCSB8Q0xSTFFPQVROUEtUfENMUkxRT1RDUkMpOworCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgQ0xSTFFPSU5JVFNDQlBFUlJ8Q0xSTFFPU1RPUEkyfENMUkxRT0JBRFFBUworCQkJCSB8Q0xSTFFPQlVTRlJFRXxDTFJMUU9QSEFDSEdJTlBLVCk7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHKSAhPSAwKSB7CisJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMCwgMCk7CisJCWFoZF9vdXRiKGFoZCwgQ0xSTFFPSU5UMSwgMCk7CisJfQorCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDMsIENMUk5UUkFNUEVSUnxDTFJPU1JBTVBFUlIpOworCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlNFTFRJTUVPfENMUkFUTk98Q0xSU0NTSVJTVEkKKwkJCQl8Q0xSQlVTRlJFRXxDTFJTQ1NJUEVSUnxDTFJSRVFJTklUKTsKKwlhaGRfb3V0YihhaGQsIENMUlNJTlQwLCBDTFJTRUxET3xDTFJTRUxESXxDTFJTRUxJTkdPCisJCQkgICAgICAgIHxDTFJJT0VSUnxDTFJPVkVSUlVOKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIERlYnVnZ2luZyBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhEX0RFQlVHCit1aW50MzJfdCBhaGRfZGVidWcgPSBBSERfREVCVUdfT1BUUzsKKyNlbmRpZgordm9pZAorYWhkX3ByaW50X3NjYihzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqaHNjYjsKKwlpbnQgaTsKKworCWhzY2IgPSBzY2ItPmhzY2I7CisJcHJpbnRmKCJzY2I6JXAgY29udHJvbDoweCV4IHNjc2lpZDoweCV4IGx1bjolZCBjZGJfbGVuOiVkXG4iLAorCSAgICAgICAodm9pZCAqKXNjYiwKKwkgICAgICAgaHNjYi0+Y29udHJvbCwKKwkgICAgICAgaHNjYi0+c2NzaWlkLAorCSAgICAgICBoc2NiLT5sdW4sCisJICAgICAgIGhzY2ItPmNkYl9sZW4pOworCXByaW50ZigiU2hhcmVkIERhdGE6ICIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiKTsgaSsrKQorCQlwcmludGYoIiUjMDJ4IiwgaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiW2ldKTsKKwlwcmludGYoIiAgICAgICAgZGF0YXB0cjolI3gleCBkYXRhY250OiUjeCBzZ3B0cjolI3ggdGFnOiUjeFxuIiwKKwkgICAgICAgKHVpbnQzMl90KSgoYWhkX2xlNjR0b2goaHNjYi0+ZGF0YXB0cikgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJICAgICAgICh1aW50MzJfdCkoYWhkX2xlNjR0b2goaHNjYi0+ZGF0YXB0cikgJiAweEZGRkZGRkZGKSwKKwkgICAgICAgYWhkX2xlMzJ0b2goaHNjYi0+ZGF0YWNudCksCisJICAgICAgIGFoZF9sZTMydG9oKGhzY2ItPnNncHRyKSwKKwkgICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisJYWhkX2R1bXBfc2dsaXN0KHNjYik7Cit9CisKK3ZvaWQKK2FoZF9kdW1wX3NnbGlzdChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50IGk7CisKKwlpZiAoc2NiLT5zZ19jb3VudCA+IDApIHsKKwkJaWYgKChzY2ItPmFoZF9zb2Z0Yy0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJc3RydWN0IGFoZF9kbWE2NF9zZWcgKnNnX2xpc3Q7CisKKwkJCXNnX2xpc3QgPSAoc3RydWN0IGFoZF9kbWE2NF9zZWcqKXNjYi0+c2dfbGlzdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKKwkJCQl1aW50NjRfdCBhZGRyOworCQkJCXVpbnQzMl90IGxlbjsKKworCQkJCWFkZHIgPSBhaGRfbGU2NHRvaChzZ19saXN0W2ldLmFkZHIpOworCQkJCWxlbiA9IGFoZF9sZTMydG9oKHNnX2xpc3RbaV0ubGVuKTsKKwkJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkJXNcbiIsCisJCQkJICAgICAgIGksCisJCQkJICAgICAgICh1aW50MzJfdCkoKGFkZHIgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJCQkJICAgICAgICh1aW50MzJfdCkoYWRkciAmIDB4RkZGRkZGRkYpLAorCQkJCSAgICAgICBzZ19saXN0W2ldLmxlbiAmIEFIRF9TR19MRU5fTUFTSywKKwkJCQkgICAgICAgKHNnX2xpc3RbaV0ubGVuICYgQUhEX0RNQV9MQVNUX1NFRykKKwkJCQkgICAgID8gIiBMYXN0IiA6ICIiKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBhaGRfZG1hX3NlZyAqc2dfbGlzdDsKKworCQkJc2dfbGlzdCA9IChzdHJ1Y3QgYWhkX2RtYV9zZWcqKXNjYi0+c2dfbGlzdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKKwkJCQl1aW50MzJfdCBsZW47CisKKwkJCQlsZW4gPSBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmxlbik7CisJCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZCVzXG4iLAorCQkJCSAgICAgICBpLAorCQkJCSAgICAgICAobGVuICYgQUhEX1NHX0hJR0hfQUREUl9NQVNLKSA+PiAyNCwKKwkJCQkgICAgICAgYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5hZGRyKSwKKwkJCQkgICAgICAgbGVuICYgQUhEX1NHX0xFTl9NQVNLLAorCQkJCSAgICAgICBsZW4gJiBBSERfRE1BX0xBU1RfU0VHID8gIiBMYXN0IiA6ICIiKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogVHJhbnNmZXIgTmVnb3RpYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBbGxvY2F0ZSBwZXIgdGFyZ2V0IG1vZGUgaW5zdGFuY2UgKElEIHdlIHJlc3BvbmQgdG8gYXMgYSB0YXJnZXQpCisgKiB0cmFuc2ZlciBuZWdvdGlhdGlvbiBkYXRhIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqCithaGRfYWxsb2NfdHN0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgc2NzaV9pZCwgY2hhciBjaGFubmVsKQoreworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICptYXN0ZXJfdHN0YXRlOworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50IGk7CisKKwltYXN0ZXJfdHN0YXRlID0gYWhkLT5lbmFibGVkX3RhcmdldHNbYWhkLT5vdXJfaWRdOworCWlmIChhaGQtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSAhPSBOVUxMCisJICYmIGFoZC0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdICE9IG1hc3Rlcl90c3RhdGUpCisJCXBhbmljKCIlczogYWhkX2FsbG9jX3RzdGF0ZSAtIFRhcmdldCBhbHJlYWR5IGFsbG9jYXRlZCIsCisJCSAgICAgIGFoZF9uYW1lKGFoZCkpOworCXRzdGF0ZSA9IG1hbGxvYyhzaXplb2YoKnRzdGF0ZSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKHRzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFsbG9jYXRlZCBhIG1hc3RlciB0c3RhdGUsIGNvcHkgdXNlciBzZXR0aW5ncyBmcm9tCisJICogdGhlIG1hc3RlciB0c3RhdGUgKHRha2VuIGZyb20gU1JBTSBvciB0aGUgRUVQUk9NKSBmb3IgdGhpcworCSAqIGNoYW5uZWwsIGJ1dCByZXNldCBvdXIgY3VycmVudCBhbmQgZ29hbCBzZXR0aW5ncyB0byBhc3luYy9uYXJyb3cKKwkgKiB1bnRpbCBhbiBpbml0aWF0b3IgdGFsa3MgdG8gdXMuCisJICovCisJaWYgKG1hc3Rlcl90c3RhdGUgIT0gTlVMTCkgeworCQltZW1jcHkodHN0YXRlLCBtYXN0ZXJfdHN0YXRlLCBzaXplb2YoKnRzdGF0ZSkpOworCQltZW1zZXQodHN0YXRlLT5lbmFibGVkX2x1bnMsIDAsIHNpemVvZih0c3RhdGUtPmVuYWJsZWRfbHVucykpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJbWVtc2V0KCZ0c3RhdGUtPnRyYW5zaW5mb1tpXS5jdXJyLCAwLAorCQkJICAgICAgc2l6ZW9mKHRzdGF0ZS0+dHJhbnNpbmZvW2ldLmN1cnIpKTsKKwkJCW1lbXNldCgmdHN0YXRlLT50cmFuc2luZm9baV0uZ29hbCwgMCwKKwkJCSAgICAgIHNpemVvZih0c3RhdGUtPnRyYW5zaW5mb1tpXS5nb2FsKSk7CisJCX0KKwl9IGVsc2UKKwkJbWVtc2V0KHRzdGF0ZSwgMCwgc2l6ZW9mKCp0c3RhdGUpKTsKKwlhaGQtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSA9IHRzdGF0ZTsKKwlyZXR1cm4gKHRzdGF0ZSk7Cit9CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKy8qCisgKiBGcmVlIHBlciB0YXJnZXQgbW9kZSBpbnN0YW5jZSAoSUQgd2UgcmVzcG9uZCB0byBhcyBhIHRhcmdldCkKKyAqIHRyYW5zZmVyIG5lZ290aWF0aW9uIGRhdGEgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9mcmVlX3RzdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCwgaW50IGZvcmNlKQoreworCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkvKgorCSAqIERvbid0IGNsZWFuIHVwIG91ciAibWFzdGVyIiB0c3RhdGUuCisJICogSXQgaGFzIG91ciBkZWZhdWx0IHVzZXIgc2V0dGluZ3MuCisJICovCisJaWYgKHNjc2lfaWQgPT0gYWhkLT5vdXJfaWQKKwkgJiYgZm9yY2UgPT0gRkFMU0UpCisJCXJldHVybjsKKworCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdOworCWlmICh0c3RhdGUgIT0gTlVMTCkKKwkJZnJlZSh0c3RhdGUsIE1fREVWQlVGKTsKKwlhaGQtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSA9IE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqIENhbGxlZCB3aGVuIHdlIGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gdG8gYSB0YXJnZXQgb24gdGhlIGJ1cywKKyAqIHRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG5lYXJlc3QgcGVyaW9kIHRvIHRoZSBpbnB1dCBwZXJpb2QgbGltaXRlZAorICogYnkgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgYnVzIGNvbm5lY3Rpdml0eSBvZiBhbmQgc3luYyBzZXR0aW5ncyBmb3IKKyAqIHRoZSB0YXJnZXQuCisgKi8KK3ZvaWQKK2FoZF9kZXZsaW1pdGVkX3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJCXVfaW50ICpwZXJpb2QsIHVfaW50ICpwcHJfb3B0aW9ucywgcm9sZV90IHJvbGUpCit7CisJc3RydWN0CWFoZF90cmFuc2luZm8gKnRyYW5zaW5mbzsKKwl1X2ludAltYXhzeW5jOworCisJaWYgKChhaGRfaW5iKGFoZCwgU0JMS0NUTCkgJiBFTkFCNDApICE9IDAKKwkgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDIpICYgRVhQX0FDVElWRSkgPT0gMCkgeworCQltYXhzeW5jID0gQUhEX1NZTkNSQVRFX1BBQ0VEOworCX0gZWxzZSB7CisJCW1heHN5bmMgPSBBSERfU1lOQ1JBVEVfVUxUUkE7CisJCS8qIENhbid0IGRvIERUIHJlbGF0ZWQgb3B0aW9ucyBvbiBhbiBTRSBidXMgKi8KKwkJKnBwcl9vcHRpb25zICY9IE1TR19FWFRfUFBSX1FBU19SRVE7CisJfQorCS8qCisJICogTmV2ZXIgYWxsb3cgYSB2YWx1ZSBoaWdoZXIgdGhhbiBvdXIgY3VycmVudCBnb2FsCisJICogcGVyaW9kIG90aGVyd2lzZSB3ZSBtYXkgYWxsb3cgYSB0YXJnZXQgaW5pdGlhdGVkCisJICogbmVnb3RpYXRpb24gdG8gZ28gYWJvdmUgdGhlIGxpbWl0IGFzIHNldCBieSB0aGUKKwkgKiB1c2VyLiAgSW4gdGhlIGNhc2Ugb2YgYW4gaW5pdGlhdG9yIGluaXRpYXRlZAorCSAqIHN5bmMgbmVnb3RpYXRpb24sIHdlIGxpbWl0IGJhc2VkIG9uIHRoZSB1c2VyCisJICogc2V0dGluZy4gIFRoaXMgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gc3RpbGwgYWNjZXB0CisJICogaW5jb21pbmcgbmVnb3RpYXRpb25zIGV2ZW4gaWYgdGFyZ2V0IGluaXRpYXRlZAorCSAqIG5lZ290aWF0aW9uIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisJaWYgKHJvbGUgPT0gUk9MRV9UQVJHRVQpCisJCXRyYW5zaW5mbyA9ICZ0aW5mby0+dXNlcjsKKwllbHNlIAorCQl0cmFuc2luZm8gPSAmdGluZm8tPmdvYWw7CisJKnBwcl9vcHRpb25zICY9ICh0cmFuc2luZm8tPnBwcl9vcHRpb25zfE1TR19FWFRfUFBSX1BDT01QX0VOKTsKKwlpZiAodHJhbnNpbmZvLT53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKSB7CisJCW1heHN5bmMgPSBNQVgobWF4c3luYywgQUhEX1NZTkNSQVRFX1VMVFJBMik7CisJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCX0KKwlpZiAodHJhbnNpbmZvLT5wZXJpb2QgPT0gMCkgeworCQkqcGVyaW9kID0gMDsKKwkJKnBwcl9vcHRpb25zID0gMDsKKwl9IGVsc2UgeworCQkqcGVyaW9kID0gTUFYKCpwZXJpb2QsIHRyYW5zaW5mby0+cGVyaW9kKTsKKwkJYWhkX2ZpbmRfc3luY3JhdGUoYWhkLCBwZXJpb2QsIHBwcl9vcHRpb25zLCBtYXhzeW5jKTsKKwl9Cit9CisKKy8qCisgKiBMb29rIHVwIHRoZSB2YWxpZCBwZXJpb2QgdG8gU0NTSVJBVEUgY29udmVyc2lvbiBpbiBvdXIgdGFibGUuCisgKiBSZXR1cm4gdGhlIHBlcmlvZCBhbmQgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHRhcmdldAorICogaWYgdGhpcyB3YXMgdGhlIGJlZ2lubmluZyBvZiBhbiBTRFRSLgorICovCit2b2lkCithaGRfZmluZF9zeW5jcmF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50ICpwZXJpb2QsCisJCSAgdV9pbnQgKnBwcl9vcHRpb25zLCB1X2ludCBtYXhzeW5jKQoreworCWlmICgqcGVyaW9kIDwgbWF4c3luYykKKwkJKnBlcmlvZCA9IG1heHN5bmM7CisKKwlpZiAoKCpwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMAorCSAmJiAqcGVyaW9kID4gQUhEX1NZTkNSQVRFX01JTl9EVCkKKwkJKnBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CisJCQorCWlmICgqcGVyaW9kID4gQUhEX1NZTkNSQVRFX01JTikKKwkJKnBlcmlvZCA9IDA7CisKKwkvKiBIb25vciBQUFIgb3B0aW9uIGNvbmZvcm1hbmNlIHJ1bGVzLiAqLworCWlmICgqcGVyaW9kID4gQUhEX1NZTkNSQVRFX1BBQ0VEKQorCQkqcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX1JUSTsKKworCWlmICgoKnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSA9PSAwKQorCQkqcHByX29wdGlvbnMgJj0gKE1TR19FWFRfUFBSX0RUX1JFUXxNU0dfRVhUX1BQUl9RQVNfUkVRKTsKKworCWlmICgoKnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSA9PSAwKQorCQkqcHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfUUFTX1JFUTsKKworCS8qIFNraXAgYWxsIFBBQ0VEIG9ubHkgZW50cmllcyBpZiBJVSBpcyBub3QgYXZhaWxhYmxlICovCisJaWYgKCgqcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpID09IDAKKwkgJiYgKnBlcmlvZCA8IEFIRF9TWU5DUkFURV9EVCkKKwkJKnBlcmlvZCA9IEFIRF9TWU5DUkFURV9EVDsKKworCS8qIFNraXAgYWxsIERUIG9ubHkgZW50cmllcyBpZiBEVCBpcyBub3QgYXZhaWxhYmxlICovCisJaWYgKCgqcHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpID09IDAKKwkgJiYgKnBlcmlvZCA8IEFIRF9TWU5DUkFURV9VTFRSQTIpCisJCSpwZXJpb2QgPSBBSERfU1lOQ1JBVEVfVUxUUkEyOworfQorCisvKgorICogVHJ1bmNhdGUgdGhlIGdpdmVuIHN5bmNocm9ub3VzIG9mZnNldCB0byBhIHZhbHVlIHRoZQorICogY3VycmVudCBhZGFwdGVyIHR5cGUgYW5kIHN5bmNyYXRlIGFyZSBjYXBhYmxlIG9mLgorICovCit2b2lkCithaGRfdmFsaWRhdGVfb2Zmc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJICAgIHVfaW50IHBlcmlvZCwgdV9pbnQgKm9mZnNldCwgaW50IHdpZGUsCisJCSAgICByb2xlX3Qgcm9sZSkKK3sKKwl1X2ludCBtYXhvZmZzZXQ7CisKKwkvKiBMaW1pdCBvZmZzZXQgdG8gd2hhdCB3ZSBjYW4gZG8gKi8KKwlpZiAocGVyaW9kID09IDApCisJCW1heG9mZnNldCA9IDA7CisJZWxzZSBpZiAocGVyaW9kIDw9IEFIRF9TWU5DUkFURV9QQUNFRCkgeworCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQUNFRF9ORUdUQUJMRV9CVUcpICE9IDApCisJCQltYXhvZmZzZXQgPSBNQVhfT0ZGU0VUX1BBQ0VEX0JVRzsKKwkJZWxzZQorCQkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9QQUNFRDsKKwl9IGVsc2UKKwkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9OT05fUEFDRUQ7CisJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCBtYXhvZmZzZXQpOworCWlmICh0aW5mbyAhPSBOVUxMKSB7CisJCWlmIChyb2xlID09IFJPTEVfVEFSR0VUKQorCQkJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCB0aW5mby0+dXNlci5vZmZzZXQpOworCQllbHNlCisJCQkqb2Zmc2V0ID0gTUlOKCpvZmZzZXQsIHRpbmZvLT5nb2FsLm9mZnNldCk7CisJfQorfQorCisvKgorICogVHJ1bmNhdGUgdGhlIGdpdmVuIHRyYW5zZmVyIHdpZHRoIHBhcmFtZXRlciB0byBhIHZhbHVlIHRoZQorICogY3VycmVudCBhZGFwdGVyIHR5cGUgaXMgY2FwYWJsZSBvZi4KKyAqLwordm9pZAorYWhkX3ZhbGlkYXRlX3dpZHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvLAorCQkgICB1X2ludCAqYnVzX3dpZHRoLCByb2xlX3Qgcm9sZSkKK3sKKwlzd2l0Y2ggKCpidXNfd2lkdGgpIHsKKwlkZWZhdWx0OgorCQlpZiAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSB7CisJCQkvKiBSZXNwb25kIFdpZGUgKi8KKwkJCSpidXNfd2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOgorCQkqYnVzX3dpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwkJYnJlYWs7CisJfQorCWlmICh0aW5mbyAhPSBOVUxMKSB7CisJCWlmIChyb2xlID09IFJPTEVfVEFSR0VUKQorCQkJKmJ1c193aWR0aCA9IE1JTih0aW5mby0+dXNlci53aWR0aCwgKmJ1c193aWR0aCk7CisJCWVsc2UKKwkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPmdvYWwud2lkdGgsICpidXNfd2lkdGgpOworCX0KK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgYml0bWFzayBvZiB0YXJnZXRzIGZvciB3aGljaCB0aGUgY29udHJvbGxlciBzaG91bGQKKyAqIG5lZ290aWF0ZSB3aXRoIGF0IHRoZSBuZXh0IGNvbnZlbmllbnQgb3BvcnR1bml0eS4gIFRoaXMgY3VycmVudGx5CisgKiBtZWFucyB0aGUgbmV4dCB0aW1lIHdlIHNlbmQgdGhlIGluaXRpYWwgaWRlbnRpZnkgbWVzc2FnZXMgZm9yCisgKiBhIG5ldyB0cmFuc2FjdGlvbi4KKyAqLworaW50CithaGRfdXBkYXRlX25lZ19yZXF1ZXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgICAgc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZSwKKwkJICAgICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywgYWhkX25lZ190eXBlIG5lZ190eXBlKQoreworCXVfaW50IGF1dG9fbmVnb3RpYXRlX29yaWc7CisKKwlhdXRvX25lZ290aWF0ZV9vcmlnID0gdHN0YXRlLT5hdXRvX25lZ290aWF0ZTsKKwlpZiAobmVnX3R5cGUgPT0gQUhEX05FR19BTFdBWVMpIHsKKwkJLyoKKwkJICogRm9yY2Ugb3VyICJjdXJyZW50IiBzZXR0aW5ncyB0byBiZQorCQkgKiB1bmtub3duIHNvIHRoYXQgdW5sZXNzIGEgYnVzIHJlc2V0CisJCSAqIG9jY3VycyB0aGUgbmVlZCB0byByZW5lZ290aWF0ZSBpcworCQkgKiByZWNvcmRlZCBwZXJzaXN0ZW50bHkuCisJCSAqLworCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgIT0gMCkKKwkJCXRpbmZvLT5jdXJyLndpZHRoID0gQUhEX1dJRFRIX1VOS05PV047CisJCXRpbmZvLT5jdXJyLnBlcmlvZCA9IEFIRF9QRVJJT0RfVU5LTk9XTjsKKwkJdGluZm8tPmN1cnIub2Zmc2V0ID0gQUhEX09GRlNFVF9VTktOT1dOOworCX0KKwlpZiAodGluZm8tPmN1cnIucGVyaW9kICE9IHRpbmZvLT5nb2FsLnBlcmlvZAorCSB8fCB0aW5mby0+Y3Vyci53aWR0aCAhPSB0aW5mby0+Z29hbC53aWR0aAorCSB8fCB0aW5mby0+Y3Vyci5vZmZzZXQgIT0gdGluZm8tPmdvYWwub2Zmc2V0CisJIHx8IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICE9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zCisJIHx8IChuZWdfdHlwZSA9PSBBSERfTkVHX0lGX05PTl9BU1lOQworCSAgJiYgKHRpbmZvLT5nb2FsLm9mZnNldCAhPSAwCisJICAgfHwgdGluZm8tPmdvYWwud2lkdGggIT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVAorCSAgIHx8IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zICE9IDApKSkKKwkJdHN0YXRlLT5hdXRvX25lZ290aWF0ZSB8PSBkZXZpbmZvLT50YXJnZXRfbWFzazsKKwllbHNlCisJCXRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJj0gfmRldmluZm8tPnRhcmdldF9tYXNrOworCisJcmV0dXJuIChhdXRvX25lZ290aWF0ZV9vcmlnICE9IHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUpOworfQorCisvKgorICogVXBkYXRlIHRoZSB1c2VyL2dvYWwvY3VyciB0YWJsZXMgb2Ygc3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyAqIHBhcmFtZXRlcnMgYXMgd2VsbCBhcywgaW4gdGhlIGNhc2Ugb2YgYSBjdXJyZW50IG9yIGFjdGl2ZSB1cGRhdGUsCisgKiBhbnkgZGF0YSBzdHJ1Y3R1cmVzIG9uIHRoZSBob3N0IGNvbnRyb2xsZXIuICBJbiB0aGUgY2FzZSBvZiBhbgorICogYWN0aXZlIHVwZGF0ZSwgdGhlIHNwZWNpZmllZCB0YXJnZXQgaXMgY3VycmVudGx5IHRhbGtpbmcgdG8gdXMgb24KKyAqIHRoZSBidXMsIHNvIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXIgdXBkYXRlIG11c3QgdGFrZSBlZmZlY3QKKyAqIGltbWVkaWF0ZWx5LgorICovCit2b2lkCithaGRfc2V0X3N5bmNyYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQsIHVfaW50IHBwcl9vcHRpb25zLAorCQkgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCkKK3sKKwlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAlvbGRfcGVyaW9kOworCXVfaW50CW9sZF9vZmZzZXQ7CisJdV9pbnQJb2xkX3BwcjsKKwlpbnQJYWN0aXZlOworCWludAl1cGRhdGVfbmVlZGVkOworCisJYWN0aXZlID0gKHR5cGUgJiBBSERfVFJBTlNfQUNUSVZFKSA9PSBBSERfVFJBTlNfQUNUSVZFOworCXVwZGF0ZV9uZWVkZWQgPSAwOworCisJaWYgKHBlcmlvZCA9PSAwIHx8IG9mZnNldCA9PSAwKSB7CisJCXBlcmlvZCA9IDA7CisJCW9mZnNldCA9IDA7CisJfQorCisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKworCWlmICgodHlwZSAmIEFIRF9UUkFOU19VU0VSKSAhPSAwKSB7CisJCXRpbmZvLT51c2VyLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPnVzZXIub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+dXNlci5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCX0KKworCWlmICgodHlwZSAmIEFIRF9UUkFOU19HT0FMKSAhPSAwKSB7CisJCXRpbmZvLT5nb2FsLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPmdvYWwub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCX0KKworCW9sZF9wZXJpb2QgPSB0aW5mby0+Y3Vyci5wZXJpb2Q7CisJb2xkX29mZnNldCA9IHRpbmZvLT5jdXJyLm9mZnNldDsKKwlvbGRfcHByCSAgID0gdGluZm8tPmN1cnIucHByX29wdGlvbnM7CisKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfQ1VSKSAhPSAwCisJICYmIChvbGRfcGVyaW9kICE9IHBlcmlvZAorCSAgfHwgb2xkX29mZnNldCAhPSBvZmZzZXQKKwkgIHx8IG9sZF9wcHIgIT0gcHByX29wdGlvbnMpKSB7CisKKwkJdXBkYXRlX25lZWRlZCsrOworCisJCXRpbmZvLT5jdXJyLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPmN1cnIub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCisJCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCWlmIChib290dmVyYm9zZSkgeworCQkJaWYgKG9mZnNldCAhPSAwKSB7CisJCQkJaW50IG9wdGlvbnM7CisKKwkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgc3luY2hyb25vdXMgd2l0aCAiCisJCQkJICAgICAgICJwZXJpb2QgPSAweCV4LCBvZmZzZXQgPSAweCV4IiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+dGFyZ2V0LAorCQkJCSAgICAgICBwZXJpb2QsIG9mZnNldCk7CisJCQkJb3B0aW9ucyA9IDA7CisJCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1JEX1NUUk0pICE9IDApIHsKKwkJCQkJcHJpbnRmKCIoUkRTVFJNIik7CisJCQkJCW9wdGlvbnMrKzsKKwkJCQl9CisJCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkJCQlwcmludGYoIiVzIiwgb3B0aW9ucyA/ICJ8RFQiIDogIihEVCIpOworCQkJCQlvcHRpb25zKys7CisJCQkJfQorCQkJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKwkJCQkJcHJpbnRmKCIlcyIsIG9wdGlvbnMgPyAifElVIiA6ICIoSVUiKTsKKwkJCQkJb3B0aW9ucysrOworCQkJCX0KKwkJCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUlRJKSAhPSAwKSB7CisJCQkJCXByaW50ZigiJXMiLCBvcHRpb25zID8gInxSVEkiIDogIihSVEkiKTsKKwkJCQkJb3B0aW9ucysrOworCQkJCX0KKwkJCQlpZiAoKHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUUFTX1JFUSkgIT0gMCkgeworCQkJCQlwcmludGYoIiVzIiwgb3B0aW9ucyA/ICJ8UUFTIiA6ICIoUUFTIik7CisJCQkJCW9wdGlvbnMrKzsKKwkJCQl9CisJCQkJaWYgKG9wdGlvbnMgIT0gMCkKKwkJCQkJcHJpbnRmKCIpXG4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHVzaW5nICIKKwkJCQkgICAgICAgImFzeW5jaHJvbm91cyB0cmFuc2ZlcnMlc1xuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+dGFyZ2V0LAorCQkJCSAgICAgICAocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9RQVNfUkVRKSAhPSAwCisJCQkJICAgICA/ICAiKFFBUykiIDogIiIpOworCQkJfQorCQl9CisJfQorCS8qCisJICogQWx3YXlzIHJlZnJlc2ggdGhlIG5lZy10YWJsZSB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgdGhlCisJICogc2VxdWVuY2VyIHNldHRpbmcgdGhlIEVOQVROTyBiaXQgZm9yIGEgTUtfTUVTU0FHRSByZXF1ZXN0LgorCSAqIFdlIHdpbGwgYWx3YXlzIHJlbmVnb3RpYXRlIGluIHRoYXQgY2FzZSBpZiB0aGlzIGlzIGEKKwkgKiBwYWNrZXRpemVkIHJlcXVlc3QuICBBbHNvIG1hbmFnZSB0aGUgYnVzZnJlZSBleHBlY3RlZCBmbGFnCisJICogZnJvbSB0aGlzIGNvbW1vbiByb3V0aW5lIHNvIHRoYXQgd2UgY2F0Y2ggY2hhbmdlcyBkdWUgdG8KKwkgKiBXRFRSIG9yIFNEVFIgbWVzc2FnZXMuCisJICovCisJaWYgKCh0eXBlICYgQUhEX1RSQU5TX0NVUikgIT0gMCkgeworCQlpZiAoIXBhdXNlZCkKKwkJCWFoZF9wYXVzZShhaGQpOworCQlhaGRfdXBkYXRlX25lZ190YWJsZShhaGQsIGRldmluZm8sICZ0aW5mby0+Y3Vycik7CisJCWlmICghcGF1c2VkKQorCQkJYWhkX3VucGF1c2UoYWhkKTsKKwkJaWYgKGFoZC0+bXNnX3R5cGUgIT0gTVNHX1RZUEVfTk9ORSkgeworCQkJaWYgKChvbGRfcHByICYgTVNHX0VYVF9QUFJfSVVfUkVRKQorCQkJICE9IChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkpIHsKKyNpZmRlZiBBSERfREVCVUcKKwkJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJCXByaW50ZigiRXhwZWN0aW5nIElVIENoYW5nZSBidXNmcmVlXG4iKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfUFBSX0JVU0ZSRUUKKwkJCQkJICAgICAgIHwgIE1TR19GTEFHX0lVX1JFUV9DSEFOR0VEOworCQkJfQorCQkJaWYgKChvbGRfcHByICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQkJcHJpbnRmKCJQUFIgd2l0aCBJVV9SRVEgb3V0c3RhbmRpbmdcbiIpOworI2VuZGlmCisJCQkJYWhkLT5tc2dfZmxhZ3MgfD0gTVNHX0ZMQUdfRVhQRUNUX1BQUl9CVVNGUkVFOworCQkJfQorCQl9CisJfQorCisJdXBkYXRlX25lZWRlZCArPSBhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgZGV2aW5mbywgdHN0YXRlLAorCQkJCQkJdGluZm8sIEFIRF9ORUdfVE9fR09BTCk7CisKKwlpZiAodXBkYXRlX25lZWRlZCAmJiBhY3RpdmUpCisJCWFoZF91cGRhdGVfcGVuZGluZ19zY2JzKGFoZCk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHVzZXIvZ29hbC9jdXJyIHRhYmxlcyBvZiB3aWRlIG5lZ290aWF0aW9uCisgKiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMsIGluIHRoZSBjYXNlIG9mIGEgY3VycmVudCBvciBhY3RpdmUgdXBkYXRlLAorICogYW55IGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgaG9zdCBjb250cm9sbGVyLiAgSW4gdGhlIGNhc2Ugb2YgYW4KKyAqIGFjdGl2ZSB1cGRhdGUsIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGlzIGN1cnJlbnRseSB0YWxraW5nIHRvIHVzIG9uCisgKiB0aGUgYnVzLCBzbyB0aGUgdHJhbnNmZXIgcGFyYW1ldGVyIHVwZGF0ZSBtdXN0IHRha2UgZWZmZWN0CisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZAorYWhkX3NldF93aWR0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkgICAgICB1X2ludCB3aWR0aCwgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCkKK3sKKwlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAlvbGR3aWR0aDsKKwlpbnQJYWN0aXZlOworCWludAl1cGRhdGVfbmVlZGVkOworCisJYWN0aXZlID0gKHR5cGUgJiBBSERfVFJBTlNfQUNUSVZFKSA9PSBBSERfVFJBTlNfQUNUSVZFOworCXVwZGF0ZV9uZWVkZWQgPSAwOworCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfVVNFUikgIT0gMCkKKwkJdGluZm8tPnVzZXIud2lkdGggPSB3aWR0aDsKKworCWlmICgodHlwZSAmIEFIRF9UUkFOU19HT0FMKSAhPSAwKQorCQl0aW5mby0+Z29hbC53aWR0aCA9IHdpZHRoOworCisJb2xkd2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfQ1VSKSAhPSAwICYmIG9sZHdpZHRoICE9IHdpZHRoKSB7CisKKwkJdXBkYXRlX25lZWRlZCsrOworCisJCXRpbmZvLT5jdXJyLndpZHRoID0gd2lkdGg7CisJCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCWlmIChib290dmVyYm9zZSkgeworCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHVzaW5nICVkYml0IHRyYW5zZmVyc1xuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT50YXJnZXQsCisJCQkgICAgICAgOCAqICgweDAxIDw8IHdpZHRoKSk7CisJCX0KKwl9CisKKwlpZiAoKHR5cGUgJiBBSERfVFJBTlNfQ1VSKSAhPSAwKSB7CisJCWlmICghcGF1c2VkKQorCQkJYWhkX3BhdXNlKGFoZCk7CisJCWFoZF91cGRhdGVfbmVnX3RhYmxlKGFoZCwgZGV2aW5mbywgJnRpbmZvLT5jdXJyKTsKKwkJaWYgKCFwYXVzZWQpCisJCQlhaGRfdW5wYXVzZShhaGQpOworCX0KKworCXVwZGF0ZV9uZWVkZWQgKz0gYWhkX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGQsIGRldmluZm8sIHRzdGF0ZSwKKwkJCQkJCXRpbmZvLCBBSERfTkVHX1RPX0dPQUwpOworCWlmICh1cGRhdGVfbmVlZGVkICYmIGFjdGl2ZSkKKwkJYWhkX3VwZGF0ZV9wZW5kaW5nX3NjYnMoYWhkKTsKKworfQorCisvKgorICogVXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRhZ2dlZCBxdWV1aW5nIGZvciBhIGdpdmVuIHRhcmdldC4KKyAqLwordm9pZAorYWhkX3NldF90YWdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCSAgICAgYWhkX3F1ZXVlX2FsZyBhbGcpCit7CisJYWhkX3BsYXRmb3JtX3NldF90YWdzKGFoZCwgZGV2aW5mbywgYWxnKTsKKwlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGRldmluZm8tPmx1biwgQUNfVFJBTlNGRVJfTkVHLCAmYWxnKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF91cGRhdGVfbmVnX3RhYmxlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbykKK3sKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJcGVyaW9kOworCXVfaW50CQlwcHJfb3B0czsKKwl1X2ludAkJY29uX29wdHM7CisJdV9pbnQJCW9mZnNldDsKKwl1X2ludAkJc2F2ZWRfbmVnb2FkZHI7CisJdWludDhfdAkJaW9jZWxsX29wdHNbc2l6ZW9mKGFoZC0+aW9jZWxsX29wdHMpXTsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisKKwlzYXZlZF9uZWdvYWRkciA9IGFoZF9pbmIoYWhkLCBORUdPQUREUik7CisJYWhkX291dGIoYWhkLCBORUdPQUREUiwgZGV2aW5mby0+dGFyZ2V0KTsKKwlwZXJpb2QgPSB0aW5mby0+cGVyaW9kOworCW9mZnNldCA9IHRpbmZvLT5vZmZzZXQ7CisJbWVtY3B5KGlvY2VsbF9vcHRzLCBhaGQtPmlvY2VsbF9vcHRzLCBzaXplb2YoYWhkLT5pb2NlbGxfb3B0cykpOyAKKwlwcHJfb3B0cyA9IHRpbmZvLT5wcHJfb3B0aW9ucyAmIChNU0dfRVhUX1BQUl9RQVNfUkVRfE1TR19FWFRfUFBSX0RUX1JFUQorCQkJCQl8TVNHX0VYVF9QUFJfSVVfUkVRfE1TR19FWFRfUFBSX1JUSSk7CisJY29uX29wdHMgPSAwOworCWlmIChwZXJpb2QgPT0gMCkKKwkJcGVyaW9kID0gQUhEX1NZTkNSQVRFX0FTWU5DOworCWlmIChwZXJpb2QgPT0gQUhEX1NZTkNSQVRFXzE2MCkgeworCisJCWlmICgoYWhkLT5idWdzICYgQUhEX1BBQ0VEX05FR1RBQkxFX0JVRykgIT0gMCkgeworCQkJLyoKKwkJCSAqIFdoZW4gdGhlIFNQSTQgc3BlYyB3YXMgZmluYWxpemVkLCBQQUNFIHRyYW5zZmVycworCQkJICogd2FzIG5vdCBtYWRlIGEgY29uZmlndXJhYmxlIG9wdGlvbiBpbiB0aGUgUFBSCisJCQkgKiBtZXNzYWdlLiAgSW5zdGVhZCBpdCBpcyBhc3N1bWVkIHRvIGJlIGVuYWJsZWQgZm9yCisJCQkgKiBhbnkgc3luY3JhdGUgZmFzdGVyIHRoYW4gODBNSHouICBOZXZlcnRoZWxlc3MsCisJCQkgKiBIYXJwb29uMkE0IGFsbG93cyB0aGlzIHRvIGJlIGNvbmZpZ3VyYWJsZS4KKwkJCSAqCisJCQkgKiBIYXJwb29uMkE0IGFsc28gYXNzdW1lcyBhdCBtb3N0IDIgZGF0YSBieXRlcyBwZXIKKwkJCSAqIG5lZ290aWF0ZWQgUkVRL0FDSyBvZmZzZXQuICBQYWNlZCB0cmFuc2ZlcnMgdGFrZQorCQkJICogNCwgc28gd2UgbXVzdCBhZGp1c3Qgb3VyIG9mZnNldC4KKwkJCSAqLworCQkJcHByX29wdHMgfD0gUFBST1BUX1BBQ0U7CisJCQlvZmZzZXQgKj0gMjsKKworCQkJLyoKKwkJCSAqIEhhcnBvb24yQSBhc3N1bWVkIHRoYXQgdGhlcmUgd291bGQgYmUgYQorCQkJICogZmFsbGJhY2sgcmF0ZSBiZXR3ZWVuIDE2ME1IeiBhbmQgODBNaHosCisJCQkgKiBzbyA3IGlzIHVzZWQgYXMgdGhlIHBlcmlvZCBmYWN0b3IgcmF0aGVyCisJCQkgKiB0aGFuIDggZm9yIDE2ME1Iei4KKwkJCSAqLworCQkJcGVyaW9kID0gQUhEX1NZTkNSQVRFX1JFVkFfMTYwOworCQl9CisJCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUENPTVBfRU4pID09IDApCisJCQlpb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSAmPQorCQkJICAgIH5BSERfUFJFQ09NUF9NQVNLOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFByZWNvbXAgc2hvdWxkIGJlIGRpc2FibGVkIGZvciBub24tcGFjZWQgdHJhbnNmZXJzLgorCQkgKi8KKwkJaW9jZWxsX29wdHNbQUhEX1BSRUNPTVBfU0xFV19JTkRFWF0gJj0gfkFIRF9QUkVDT01QX01BU0s7CisKKwkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19JT0NFTExfT1BUUykgIT0gMAorCQkgJiYgKHBwcl9vcHRzICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwKSB7CisJCQkvKgorCQkJICogU2xvdyBkb3duIG91ciBDUkMgaW50ZXJ2YWwgdG8gYmUKKwkJCSAqIGNvbXBhdGlibGUgd2l0aCBkZXZpY2VzIHRoYXQgY2FuJ3QKKwkJCSAqIGhhbmRsZSBhIENSQyBhdCBmdWxsIHNwZWVkLgorCQkJICovCisJCQljb25fb3B0cyB8PSBFTlNMT1dDUkM7CisJCX0KKwl9CisKKwlhaGRfb3V0YihhaGQsIEFOTkVYQ09MLCBBSERfQU5ORVhDT0xfUFJFQ09NUF9TTEVXKTsKKwlhaGRfb3V0YihhaGQsIEFOTkVYREFULCBpb2NlbGxfb3B0c1tBSERfUFJFQ09NUF9TTEVXX0lOREVYXSk7CisJYWhkX291dGIoYWhkLCBBTk5FWENPTCwgQUhEX0FOTkVYQ09MX0FNUExJVFVERSk7CisJYWhkX291dGIoYWhkLCBBTk5FWERBVCwgaW9jZWxsX29wdHNbQUhEX0FNUExJVFVERV9JTkRFWF0pOworCisJYWhkX291dGIoYWhkLCBORUdQRVJJT0QsIHBlcmlvZCk7CisJYWhkX291dGIoYWhkLCBORUdQUFJPUFRTLCBwcHJfb3B0cyk7CisJYWhkX291dGIoYWhkLCBORUdPRkZTRVQsIG9mZnNldCk7CisKKwlpZiAodGluZm8tPndpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorCQljb25fb3B0cyB8PSBXSURFWEZFUjsKKworCS8qCisJICogRHVyaW5nIHBhY2tldGl6ZWQgdHJhbnNmZXJzLCB0aGUgdGFyZ2V0IHdpbGwKKwkgKiBnaXZlIHVzIHRoZSBvcG9ydHVuaXR5IHRvIHNlbmQgY29tbWFuZCBwYWNrZXRzCisJICogd2l0aG91dCB1cyBhc3NlcnRpbmcgYXR0ZW50aW9uLgorCSAqLworCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSA9PSAwKQorCQljb25fb3B0cyB8PSBFTkFVVE9BVE5POworCWFoZF9vdXRiKGFoZCwgTkVHQ09OT1BUUywgY29uX29wdHMpOworCWFoZF9vdXRiKGFoZCwgTkVHT0FERFIsIHNhdmVkX25lZ29hZGRyKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKK30KKworLyoKKyAqIFdoZW4gdGhlIHRyYW5zZmVyIHNldHRpbmdzIGZvciBhIGNvbm5lY3Rpb24gY2hhbmdlLCBzZXR1cCBmb3IKKyAqIG5lZ290aWF0aW9uIGluIHBlbmRpbmcgU0NCcyB0byBlZmZlY3QgdGhlIGNoYW5nZSBhcyBxdWlja2x5IGFzCisgKiBwb3NzaWJsZS4gIFdlIGFsc28gY2FuY2VsIGFueSBuZWdvdGlhdGlvbnMgdGhhdCBhcmUgc2NoZWR1bGVkCisgKiBmb3IgaW5mbGlnaHQgU0NCcyB0aGF0IGhhdmUgbm90IGJlZW4gc3RhcnRlZCB5ZXQuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfdXBkYXRlX3BlbmRpbmdfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0CQlzY2IgKnBlbmRpbmdfc2NiOworCWludAkJcGVuZGluZ19zY2JfY291bnQ7CisJdV9pbnQJCXNjYl90YWc7CisJaW50CQlwYXVzZWQ7CisJdV9pbnQJCXNhdmVkX3NjYnB0cjsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIHBlbmRpbmcgU0NCIGxpc3QgYW5kIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUKKwkgKiBTQ0JzIHRoZXJlIGhhdmUgdGhlIHByb3BlciBzZXR0aW5ncy4gIFdlIGNhbiBvbmx5IHNhZmVseQorCSAqIGNsZWFyIHRoZSBuZWdvdGlhdGlvbiByZXF1aXJlZCBmbGFnIChzZXR0aW5nIHJlcXVpcmVzIHRoZQorCSAqIGV4ZWN1dGlvbiBxdWV1ZSB0byBiZSBtb2RpZmllZCkgYW5kIHRoaXMgaXMgb25seSBwb3NzaWJsZQorCSAqIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBhdHRlbXB0aW5nIHRvIHNlbGVjdCBvdXQgZm9yIHRoaXMKKwkgKiBTQ0IuICBGb3IgdGhpcyByZWFzb24sIGFsbCBjYWxsZXJzIG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUKKwkgKiBpZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIG5lZ290aWF0aW9uIHNldHRpbmdzIGZvciB0aGUgY3VycmVudGx5CisJICogYWN0aXZlIHRyYW5zYWN0aW9uIG9uIHRoZSBidXMuCisJICovCisJcGVuZGluZ19zY2JfY291bnQgPSAwOworCUxJU1RfRk9SRUFDSChwZW5kaW5nX3NjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CisJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpwZW5kaW5nX2hzY2I7CisJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQlhaGRfc2NiX2RldmluZm8oYWhkLCAmZGV2aW5mbywgcGVuZGluZ19zY2IpOworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLmNoYW5uZWwsCisJCQkJCSAgICBkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCSAgICBkZXZpbmZvLnRhcmdldCwgJnRzdGF0ZSk7CisJCXBlbmRpbmdfaHNjYiA9IHBlbmRpbmdfc2NiLT5oc2NiOworCQlpZiAoKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBkZXZpbmZvLnRhcmdldF9tYXNrKSA9PSAwCisJCSAmJiAocGVuZGluZ19zY2ItPmZsYWdzICYgU0NCX0FVVE9fTkVHT1RJQVRFKSAhPSAwKSB7CisJCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgJj0gflNDQl9BVVRPX05FR09USUFURTsKKwkJCXBlbmRpbmdfaHNjYi0+Y29udHJvbCAmPSB+TUtfTUVTU0FHRTsKKwkJfQorCQlhaGRfc3luY19zY2IoYWhkLCBwZW5kaW5nX3NjYiwKKwkJCSAgICAgQlVTX0RNQVNZTkNfUFJFUkVBRHxCVVNfRE1BU1lOQ19QUkVXUklURSk7CisJCXBlbmRpbmdfc2NiX2NvdW50Kys7CisJfQorCisJaWYgKHBlbmRpbmdfc2NiX2NvdW50ID09IDApCisJCXJldHVybjsKKworCWlmIChhaGRfaXNfcGF1c2VkKGFoZCkpIHsKKwkJcGF1c2VkID0gMTsKKwl9IGVsc2UgeworCQlwYXVzZWQgPSAwOworCQlhaGRfcGF1c2UoYWhkKTsKKwl9CisKKwkvKgorCSAqIEZvcmNlIHRoZSBzZXF1ZW5jZXIgdG8gcmVpbml0aWFsaXplIHRoZSBzZWxlY3Rpb24gZm9yCisJICogdGhlIGNvbW1hbmQgYXQgdGhlIGhlYWQgb2YgdGhlIGV4ZWN1dGlvbiBxdWV1ZSBpZiBpdAorCSAqIGhhcyBhbHJlYWR5IGJlZW4gc2V0dXAuICBUaGUgbmVnb3RpYXRpb24gY2hhbmdlcyBtYXkKKwkgKiBlZmZlY3Qgd2hldGhlciB3ZSBzZWxlY3Qtb3V0IHdpdGggQVROLgorCSAqLworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOworCXNhdmVkX3NjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJLyogRW5zdXJlIHRoYXQgdGhlIGhzY2JzIGRvd24gb24gdGhlIGNhcmQgbWF0Y2ggdGhlIG5ldyBpbmZvcm1hdGlvbiAqLworCWZvciAoc2NiX3RhZyA9IDA7IHNjYl90YWcgPCBhaGQtPnNjYl9kYXRhLm1heGhzY2JzOyBzY2JfdGFnKyspIHsKKwkJc3RydWN0CWhhcmR3YXJlX3NjYiAqcGVuZGluZ19oc2NiOworCQl1X2ludAljb250cm9sOworCisJCXBlbmRpbmdfc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfdGFnKTsKKwkJaWYgKHBlbmRpbmdfc2NiID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JfdGFnKTsKKwkJcGVuZGluZ19oc2NiID0gcGVuZGluZ19zY2ItPmhzY2I7CisJCWNvbnRyb2wgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKTsKKwkJY29udHJvbCAmPSB+TUtfTUVTU0FHRTsKKwkJY29udHJvbCB8PSBwZW5kaW5nX2hzY2ItPmNvbnRyb2wgJiBNS19NRVNTQUdFOworCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCBjb250cm9sKTsKKwl9CisJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JwdHIpOworCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGRfdW5wYXVzZShhaGQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXRoaW5nIEluZm9ybWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FoZF9mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCWFoZF9tb2RlX3N0YXRlCXNhdmVkX21vZGVzOworCXVfaW50CQlzYXZlZF9zY3NpaWQ7CisJcm9sZV90CQlyb2xlOworCWludAkJb3VyX2lkOworCisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKworCWlmIChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIFRBUkdFVCkKKwkJcm9sZSA9IFJPTEVfVEFSR0VUOworCWVsc2UKKwkJcm9sZSA9IFJPTEVfSU5JVElBVE9SOworCisJaWYgKHJvbGUgPT0gUk9MRV9UQVJHRVQKKwkgJiYgKGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpICYgQ01EUEhBU0VfUEVORElORykgIT0gMCkgeworCQkvKiBXZSB3ZXJlIHNlbGVjdGVkLCBzbyBwdWxsIG91ciBpZCBmcm9tIFRBUkdJRElOICovCisJCW91cl9pZCA9IGFoZF9pbmIoYWhkLCBUQVJHSURJTikgJiBPSUQ7CisJfSBlbHNlIGlmIChyb2xlID09IFJPTEVfVEFSR0VUKQorCQlvdXJfaWQgPSBhaGRfaW5iKGFoZCwgVE9XTklEKTsKKwllbHNlCisJCW91cl9pZCA9IGFoZF9pbmIoYWhkLCBJT1dOSUQpOworCisJc2F2ZWRfc2NzaWlkID0gYWhkX2luYihhaGQsIFNBVkVEX1NDU0lJRCk7CisJYWhkX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLAorCQkJICAgIG91cl9pZCwKKwkJCSAgICBTQ1NJSURfVEFSR0VUKGFoZCwgc2F2ZWRfc2NzaWlkKSwKKwkJCSAgICBhaGRfaW5iKGFoZCwgU0FWRURfTFVOKSwKKwkJCSAgICBTQ1NJSURfQ0hBTk5FTChhaGQsIHNhdmVkX3Njc2lpZCksCisJCQkgICAgcm9sZSk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7Cit9CisKK3ZvaWQKK2FoZF9wcmludF9kZXZpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXByaW50ZigiJXM6JWM6JWQ6JWQ6ICIsIGFoZF9uYW1lKGFoZCksICdBJywKKwkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworfQorCitzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5KgorYWhkX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpCit7CisJc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSAqZW50cnk7CisJc3RydWN0IGFoZF9waGFzZV90YWJsZV9lbnRyeSAqbGFzdF9lbnRyeTsKKworCS8qCisJICogbnVtX3BoYXNlcyBkb2Vzbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgZW50cnkgd2hpY2gKKwkgKiB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBwaGFzZSBkb2Vzbid0IG1hdGNoLgorCSAqLworCWxhc3RfZW50cnkgPSAmYWhkX3BoYXNlX3RhYmxlW251bV9waGFzZXNdOworCWZvciAoZW50cnkgPSBhaGRfcGhhc2VfdGFibGU7IGVudHJ5IDwgbGFzdF9lbnRyeTsgZW50cnkrKykgeworCQlpZiAocGhhc2UgPT0gZW50cnktPnBoYXNlKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoZW50cnkpOworfQorCit2b2lkCithaGRfY29tcGlsZV9kZXZpbmZvKHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCisJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwgcm9sZV90IHJvbGUpCit7CisJZGV2aW5mby0+b3VyX3Njc2lpZCA9IG91cl9pZDsKKwlkZXZpbmZvLT50YXJnZXQgPSB0YXJnZXQ7CisJZGV2aW5mby0+bHVuID0gbHVuOworCWRldmluZm8tPnRhcmdldF9vZmZzZXQgPSB0YXJnZXQ7CisJZGV2aW5mby0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJZGV2aW5mby0+cm9sZSA9IHJvbGU7CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlkZXZpbmZvLT50YXJnZXRfb2Zmc2V0ICs9IDg7CisJZGV2aW5mby0+dGFyZ2V0X21hc2sgPSAoMHgwMSA8PCBkZXZpbmZvLT50YXJnZXRfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9zY2JfZGV2aW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJc3RydWN0IHNjYiAqc2NiKQoreworCXJvbGVfdAlyb2xlOworCWludAlvdXJfaWQ7CisKKwlvdXJfaWQgPSBTQ1NJSURfT1VSX0lEKHNjYi0+aHNjYi0+c2NzaWlkKTsKKwlyb2xlID0gUk9MRV9JTklUSUFUT1I7CisJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQVJHRVRfU0NCKSAhPSAwKQorCQlyb2xlID0gUk9MRV9UQVJHRVQ7CisJYWhkX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLCBvdXJfaWQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCSAgICBTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpLCByb2xlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1lc3NhZ2UgUGhhc2UgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdoZW4gYW4gaW5pdGlhdG9yIHRyYW5zYWN0aW9uIHdpdGggdGhlIE1LX01FU1NBR0UgZmxhZyBlaXRoZXIgcmVjb25uZWN0cworICogb3IgZW50ZXJzIHRoZSBpbml0aWFsIG1lc3NhZ2Ugb3V0IHBoYXNlLCB3ZSBhcmUgaW50ZXJydXB0ZWQuICBGaWxsIG91cgorICogb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSBhbmQgYmVnaW5nIGhhbmRpbmcKKyAqIHRoZSBtZXNzYWdlIHBoYXNlKHMpIG1hbnVhbGx5LgorICovCitzdGF0aWMgdm9pZAorYWhkX3NldHVwX2luaXRpYXRvcl9tc2dvdXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkgICBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJLyoKKwkgKiBUbyBmYWNpbGl0YXRlIGFkZGluZyBtdWx0aXBsZSBtZXNzYWdlcyB0b2dldGhlciwKKwkgKiBlYWNoIHJvdXRpbmUgc2hvdWxkIGluY3JlbWVudCB0aGUgaW5kZXggYW5kIGxlbgorCSAqIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHNldHRpbmcgdGhlbSBleHBsaWNpdGx5LgorCSAqLworCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwlhaGQtPm1zZ291dF9sZW4gPSAwOworCisJaWYgKGFoZF9jdXJyZW50bHlfcGFja2V0aXplZChhaGQpKQorCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19QQUNLRVRJWkVEOworCisJaWYgKGFoZC0+c2VuZF9tc2dfcGVycm9yCisJICYmIGFoZF9pbmIoYWhkLCBNU0dfT1VUKSA9PSBIT1NUX01TRykgeworCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBhaGQtPnNlbmRfbXNnX3BlcnJvcjsKKwkJYWhkLT5tc2dvdXRfbGVuKys7CisJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJcHJpbnRmKCJTZXR0aW5nIHVwIGZvciBQYXJpdHkgRXJyb3IgZGVsaXZlcnlcbiIpOworI2VuZGlmCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHNjYiA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6IFdBUk5JTkcuIE5vIHBlbmRpbmcgbWVzc2FnZSBmb3IgIgorCQkgICAgICAgIklfVCBtc2dpbi4gIElzc3VpbmcgTk8tT1BcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfTk9PUDsKKwkJYWhkLT5tc2dvdXRfbGVuKys7CisJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQlyZXR1cm47CisJfQorCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX0RFVklDRV9SRVNFVCkgPT0gMAorCSAmJiAoc2NiLT5mbGFncyAmIFNDQl9QQUNLRVRJWkVEKSA9PSAwCisJICYmIGFoZF9pbmIoYWhkLCBNU0dfT1VUKSA9PSBNU0dfSURFTlRJRllGTEFHKSB7CisJCXVfaW50IGlkZW50aWZ5X21zZzsKKworCQlpZGVudGlmeV9tc2cgPSBNU0dfSURFTlRJRllGTEFHIHwgU0NCX0dFVF9MVU4oc2NiKTsKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBESVNDRU5CKSAhPSAwKQorCQkJaWRlbnRpZnlfbXNnIHw9IE1TR19JREVOVElGWV9ESVNDRkxBRzsKKwkJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gaWRlbnRpZnlfbXNnOworCQlhaGQtPm1zZ291dF9sZW4rKzsKKworCQlpZiAoKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDApIHsKKwkJCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9CisJCQkgICAgc2NiLT5oc2NiLT5jb250cm9sICYgKFRBR19FTkJ8U0NCX1RBR19UWVBFKTsKKwkJCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQlhaGQtPm1zZ291dF9sZW4gKz0gMjsKKwkJfQorCX0KKworCWlmIChzY2ItPmZsYWdzICYgU0NCX0RFVklDRV9SRVNFVCkgeworCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfQlVTX0RFVl9SRVNFVDsKKwkJYWhkLT5tc2dvdXRfbGVuKys7CisJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJcHJpbnRmKCJCdXMgRGV2aWNlIFJlc2V0IE1lc3NhZ2UgU2VudFxuIik7CisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgorCQkgKiB0aGUgYnVzZnJlZS4gIFdlIG1heSBoYXZlIGFuIGVudHJ5IGluIHRoZSB3YWl0aW5nCisJCSAqIFEgZm9yIHRoaXMgdGFyZ2V0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnbyBhYm91dAorCQkgKiBzZWxlY3Rpbmcgd2hpbGUgd2UgaGFuZGxlIHRoZSBidXNmcmVlIGFuZCBibG93IGl0CisJCSAqIGF3YXkuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCAwKTsKKwl9IGVsc2UgaWYgKChzY2ItPmZsYWdzICYgU0NCX0FCT1JUKSAhPSAwKSB7CisKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKSB7CisJCQlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfQUJPUlRfVEFHOworCQl9IGVsc2UgeworCQkJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUOworCQl9CisJCWFoZC0+bXNnb3V0X2xlbisrOworCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCXByaW50ZigiQWJvcnQlcyBNZXNzYWdlIFNlbnRcbiIsCisJCSAgICAgICAoc2NiLT5oc2NiLT5jb250cm9sICYgVEFHX0VOQikgIT0gMCA/ICIgVGFnIiA6ICIiKTsKKwkJLyoKKwkJICogQ2xlYXIgb3VyIHNlbGVjdGlvbiBoYXJkd2FyZSBpbiBhZHZhbmNlIG9mCisJCSAqIHRoZSBidXNmcmVlLiAgV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4gdGhlIHdhaXRpbmcKKwkJICogUSBmb3IgdGhpcyB0YXJnZXQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvIGFib3V0CisJCSAqIHNlbGVjdGluZyB3aGlsZSB3ZSBoYW5kbGUgdGhlIGJ1c2ZyZWUgYW5kIGJsb3cgaXQKKwkJICogYXdheS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOworCX0gZWxzZSBpZiAoKHNjYi0+ZmxhZ3MgJiAoU0NCX0FVVE9fTkVHT1RJQVRFfFNDQl9ORUdPVElBVEUpKSAhPSAwKSB7CisJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coYWhkLCBkZXZpbmZvKTsKKwkJLyoKKwkJICogQ2xlYXIgb3VyIHNlbGVjdGlvbiBoYXJkd2FyZSBpbiBhZHZhbmNlIG9mIHBvdGVudGlhbAorCQkgKiBQUFIgSVUgc3RhdHVzIGNoYW5nZSBidXNmcmVlLiAgV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4KKwkJICogdGhlIHdhaXRpbmcgUSBmb3IgdGhpcyB0YXJnZXQsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvCisJCSAqIGFib3V0IHNlbGVjdGluZyB3aGlsZSB3ZSBoYW5kbGUgdGhlIGJ1c2ZyZWUgYW5kIGJsb3cKKwkJICogaXQgYXdheS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOworCX0gZWxzZSB7CisJCXByaW50ZigiYWhkX2ludHI6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgIgorCQkgICAgICAgImRvZXMgbm90IGhhdmUgYSB3YWl0aW5nIG1lc3NhZ2VcbiIpOworCQlwcmludGYoIlNDU0lJRCA9ICV4LCB0YXJnZXRfbWFzayA9ICV4XG4iLCBzY2ItPmhzY2ItPnNjc2lpZCwKKwkJICAgICAgIGRldmluZm8tPnRhcmdldF9tYXNrKTsKKwkJcGFuaWMoIlNDQiA9ICVkLCBTQ0IgQ29udHJvbCA9ICV4OiV4LCBNU0dfT1VUID0gJXggIgorCQkgICAgICAiU0NCIGZsYWdzID0gJXgiLCBTQ0JfR0VUX1RBRyhzY2IpLCBzY2ItPmhzY2ItPmNvbnRyb2wsCisJCSAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpLCBhaGRfaW5iKGFoZCwgTVNHX09VVCksCisJCSAgICAgIHNjYi0+ZmxhZ3MpOworCX0KKworCS8qCisJICogQ2xlYXIgdGhlIE1LX01FU1NBR0UgZmxhZyBmcm9tIHRoZSBTQ0Igc28gd2UgYXJlbid0CisJICogYXNrZWQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UgYWdhaW4uCisJICovCisJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKKwkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpICYgfk1LX01FU1NBR0UpOworCXNjYi0+aHNjYi0+Y29udHJvbCAmPSB+TUtfTUVTU0FHRTsKKwlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX0lOSVRJQVRPUl9NU0dPVVQ7Cit9CisKKy8qCisgKiBCdWlsZCBhbiBhcHByb3ByaWF0ZSB0cmFuc2ZlciBuZWdvdGlhdGlvbiBtZXNzYWdlIGZvciB0aGUKKyAqIGN1cnJlbnRseSBhY3RpdmUgdGFyZ2V0LgorICovCitzdGF0aWMgdm9pZAorYWhkX2J1aWxkX3RyYW5zZmVyX21zZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwkvKgorCSAqIFdlIG5lZWQgdG8gaW5pdGlhdGUgdHJhbnNmZXIgbmVnb3RpYXRpb25zLgorCSAqIElmIG91ciBjdXJyZW50IGFuZCBnb2FsIHNldHRpbmdzIGFyZSBpZGVudGljYWwsCisJICogd2Ugd2FudCB0byByZW5lZ290aWF0ZSBkdWUgdG8gYSBjaGVjayBjb25kaXRpb24uCisJICovCisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CWRvd2lkZTsKKwlpbnQJZG9zeW5jOworCWludAlkb3BwcjsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJcHByX29wdGlvbnM7CisJdV9pbnQJb2Zmc2V0OworCisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKwkvKgorCSAqIEZpbHRlciBvdXIgcGVyaW9kIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uCisJICogSWYgd2UgY2FuJ3QgcGVyZm9ybSBEVCB0cmFuc2ZlcnMgb24gdGhpcyBzZWdtZW50IChub3QgaW4gTFZECisJICogbW9kZSBmb3IgaW5zdGFuY2UpLCB0aGVuIG91ciBkZWNpc2lvbiB0byBpc3N1ZSBhIFBQUiBtZXNzYWdlCisJICogbWF5IGNoYW5nZS4KKwkgKi8KKwlwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJb2Zmc2V0ID0gdGluZm8tPmdvYWwub2Zmc2V0OworCXBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnM7CisJLyogVGFyZ2V0IGluaXRpYXRlZCBQUFIgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFNDU0kgc3BlYyAqLworCWlmIChkZXZpbmZvLT5yb2xlID09IFJPTEVfVEFSR0VUKQorCQlwcHJfb3B0aW9ucyA9IDA7CisJYWhkX2RldmxpbWl0ZWRfc3luY3JhdGUoYWhkLCB0aW5mbywgJnBlcmlvZCwKKwkJCQkmcHByX29wdGlvbnMsIGRldmluZm8tPnJvbGUpOworCWRvd2lkZSA9IHRpbmZvLT5jdXJyLndpZHRoICE9IHRpbmZvLT5nb2FsLndpZHRoOworCWRvc3luYyA9IHRpbmZvLT5jdXJyLm9mZnNldCAhPSBvZmZzZXQgfHwgdGluZm8tPmN1cnIucGVyaW9kICE9IHBlcmlvZDsKKwkvKgorCSAqIE9ubHkgdXNlIFBQUiBpZiB3ZSBoYXZlIG9wdGlvbnMgdGhhdCBuZWVkIGl0LCBldmVuIGlmIHRoZSBkZXZpY2UKKwkgKiBjbGFpbXMgdG8gc3VwcG9ydCBpdC4gIFRoZXJlIG1pZ2h0IGJlIGFuIGV4cGFuZGVyIGluIHRoZSB3YXkKKwkgKiB0aGF0IGRvZXNuJ3QuCisJICovCisJZG9wcHIgPSBwcHJfb3B0aW9ucyAhPSAwOworCisJaWYgKCFkb3dpZGUgJiYgIWRvc3luYyAmJiAhZG9wcHIpIHsKKwkJZG93aWRlID0gdGluZm8tPmdvYWwud2lkdGggIT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwkJZG9zeW5jID0gdGluZm8tPmdvYWwub2Zmc2V0ICE9IDA7CisJfQorCisJaWYgKCFkb3dpZGUgJiYgIWRvc3luYyAmJiAhZG9wcHIpIHsKKwkJLyoKKwkJICogRm9yY2UgYXN5bmMgd2l0aCBhIFdEVFIgbWVzc2FnZSBpZiB3ZSBoYXZlIGEgd2lkZSBidXMsCisJCSAqIG9yIGp1c3QgaXNzdWUgYW4gU0RUUiB3aXRoIGEgMCBvZmZzZXQuCisJCSAqLworCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgIT0gMCkKKwkJCWRvd2lkZSA9IDE7CisJCWVsc2UKKwkJCWRvc3luYyA9IDE7CisKKwkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQkJcHJpbnRmKCJFbnN1cmluZyBhc3luY1xuIik7CisJCX0KKwl9CisJLyogVGFyZ2V0IGluaXRpYXRlZCBQUFIgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFNDU0kgc3BlYyAqLworCWlmIChkZXZpbmZvLT5yb2xlID09IFJPTEVfVEFSR0VUKQorCQlkb3BwciA9IDA7CisKKwkvKgorCSAqIEJvdGggdGhlIFBQUiBtZXNzYWdlIGFuZCBTRFRSIG1lc3NhZ2UgcmVxdWlyZSB0aGUKKwkgKiBnb2FsIHN5bmNyYXRlIHRvIGJlIGxpbWl0ZWQgdG8gd2hhdCB0aGUgdGFyZ2V0IGRldmljZQorCSAqIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgKGJhc2VkIG9uIHdoZXRoZXIgYW4gTFZELT5TRQorCSAqIGV4cGFuZGVyIGlzIG9uIHRoZSBidXMpLCBzbyBjb21iaW5lIHRoZXNlIHR3byBjYXNlcy4KKwkgKiBSZWdhcmRsZXNzLCBndWFyYW50ZWUgdGhhdCBpZiB3ZSBhcmUgdXNpbmcgV0RUUiBhbmQgU0RUUgorCSAqIG1lc3NhZ2VzIHRoYXQgV0RUUiBjb21lcyBmaXJzdC4KKwkgKi8KKwlpZiAoZG9wcHIgfHwgKGRvc3luYyAmJiAhZG93aWRlKSkgeworCisJCW9mZnNldCA9IHRpbmZvLT5nb2FsLm9mZnNldDsKKwkJYWhkX3ZhbGlkYXRlX29mZnNldChhaGQsIHRpbmZvLCBwZXJpb2QsICZvZmZzZXQsCisJCQkJICAgIGRvcHByID8gdGluZm8tPmdvYWwud2lkdGgKKwkJCQkJICA6IHRpbmZvLT5jdXJyLndpZHRoLAorCQkJCSAgICBkZXZpbmZvLT5yb2xlKTsKKwkJaWYgKGRvcHByKSB7CisJCQlhaGRfY29uc3RydWN0X3BwcihhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LAorCQkJCQkgIHRpbmZvLT5nb2FsLndpZHRoLCBwcHJfb3B0aW9ucyk7CisJCX0gZWxzZSB7CisJCQlhaGRfY29uc3RydWN0X3NkdHIoYWhkLCBkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCk7CisJCX0KKwl9IGVsc2UgeworCQlhaGRfY29uc3RydWN0X3dkdHIoYWhkLCBkZXZpbmZvLCB0aW5mby0+Z29hbC53aWR0aCk7CisJfQorfQorCisvKgorICogQnVpbGQgYSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiBtZXNzYWdlIGluIG91ciBtZXNzYWdlCisgKiBidWZmZXIgYmFzZWQgb24gdGhlIGlucHV0IHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfY29uc3RydWN0X3NkdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPT0gMCkKKwkJcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1NEVFJfTEVOOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfU0RUUjsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBwZXJpb2Q7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gb2Zmc2V0OworCWFoZC0+bXNnb3V0X2xlbiArPSA1OworCWlmIChib290dmVyYm9zZSkgeworCQlwcmludGYoIiglczolYzolZDolZCk6IFNlbmRpbmcgU0RUUiBwZXJpb2QgJXgsIG9mZnNldCAleFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGRldmluZm8tPmx1biwgcGVyaW9kLCBvZmZzZXQpOworCX0KK30KKworLyoKKyAqIEJ1aWxkIGEgd2lkZSBuZWdvdGlhdGVpb24gbWVzc2FnZSBpbiBvdXIgbWVzc2FnZQorICogYnVmZmVyIGJhc2VkIG9uIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZAorYWhkX2NvbnN0cnVjdF93ZHRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgICB1X2ludCBidXNfd2lkdGgpCit7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVEVOREVEOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfV0RUUl9MRU47CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9XRFRSOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IGJ1c193aWR0aDsKKwlhaGQtPm1zZ291dF9sZW4gKz0gNDsKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFdEVFIgJXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisJCSAgICAgICBkZXZpbmZvLT5sdW4sIGJ1c193aWR0aCk7CisJfQorfQorCisvKgorICogQnVpbGQgYSBwYXJhbGxlbCBwcm90b2NvbCByZXF1ZXN0IG1lc3NhZ2UgaW4gb3VyIG1lc3NhZ2UKKyAqIGJ1ZmZlciBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9jb25zdHJ1Y3RfcHByKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LCB1X2ludCBidXNfd2lkdGgsCisJCSAgdV9pbnQgcHByX29wdGlvbnMpCit7CisJLyoKKwkgKiBBbHdheXMgcmVxdWVzdCBwcmVjb21wZW5zYXRpb24gZnJvbQorCSAqIHRoZSBvdGhlciB0YXJnZXQgaWYgd2UgYXJlIHJ1bm5pbmcKKwkgKiBhdCBwYWNlZCBzeW5jcmF0ZXMuCisJICovCisJaWYgKHBlcmlvZCA8PSBBSERfU1lOQ1JBVEVfUEFDRUQpCisJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1BDT01QX0VOOworCWlmIChvZmZzZXQgPT0gMCkKKwkJcGVyaW9kID0gQUhEX0FTWU5DX1hGRVJfUEVSSU9EOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1BQUl9MRU47CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9QUFI7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gcGVyaW9kOworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IDA7CisJYWhkLT5tc2dvdXRfYnVmW2FoZC0+bXNnb3V0X2luZGV4KytdID0gb2Zmc2V0OworCWFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSA9IGJ1c193aWR0aDsKKwlhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10gPSBwcHJfb3B0aW9uczsKKwlhaGQtPm1zZ291dF9sZW4gKz0gODsKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFBQUiBidXNfd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQkgICAgICAgIm9mZnNldCAleCwgcHByX29wdGlvbnMgJXhcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJICAgICAgIGJ1c193aWR0aCwgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhciBhbnkgYWN0aXZlIG1lc3NhZ2Ugc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfY2xlYXJfbXNnX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJYWhkLT5zZW5kX21zZ19wZXJyb3IgPSAwOworCWFoZC0+bXNnX2ZsYWdzID0gTVNHX0ZMQUdfTk9ORTsKKwlhaGQtPm1zZ291dF9sZW4gPSAwOworCWFoZC0+bXNnaW5faW5kZXggPSAwOworCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9OT05FOworCWlmICgoYWhkX2luYihhaGQsIFNDU0lTSUdPKSAmIEFUTk8pICE9IDApIHsKKwkJLyoKKwkJICogVGhlIHRhcmdldCBkaWRuJ3QgY2FyZSB0byByZXNwb25kIHRvIG91cgorCQkgKiBtZXNzYWdlIHJlcXVlc3QsIHNvIGNsZWFyIEFUTi4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUkFUTk8pOworCX0KKwlhaGRfb3V0YihhaGQsIE1TR19PVVQsIE1TR19OT09QKTsKKwlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsCisJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+VEFSR0VUX01TR19QRU5ESU5HKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKK30KKworLyoKKyAqIE1hbnVhbCBtZXNzYWdlIGxvb3AgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfbWVzc2FnZV9waGFzZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7IAorCXN0cnVjdAlhaGRfZGV2aW5mbyBkZXZpbmZvOworCXVfaW50CWJ1c19waGFzZTsKKwlpbnQJZW5kX3Nlc3Npb247CisKKwlhaGRfZmV0Y2hfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwllbmRfc2Vzc2lvbiA9IEZBTFNFOworCWJ1c19waGFzZSA9IGFoZF9pbmIoYWhkLCBMQVNUUEhBU0UpOworCisJaWYgKChhaGRfaW5iKGFoZCwgTFFJU1RBVDIpICYgTFFJUEhBU0VfT1VUUEtUKSAhPSAwKSB7CisJCXByaW50ZigiTFFJUkVUUlkgZm9yIExRSVBIQVNFX09VVFBLVFxuIik7CisJCWFoZF9vdXRiKGFoZCwgTFFDVEwyLCBMUUlSRVRSWSk7CisJfQorcmVzd2l0Y2g6CisJc3dpdGNoIChhaGQtPm1zZ190eXBlKSB7CisJY2FzZSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOgorCXsKKwkJaW50IGxhc3RieXRlOworCQlpbnQgcGhhc2VtaXM7CisJCWludCBtc2dkb25lOworCisJCWlmIChhaGQtPm1zZ291dF9sZW4gPT0gMCAmJiBhaGQtPnNlbmRfbXNnX3BlcnJvciA9PSAwKQorCQkJcGFuaWMoIkhPU1RfTVNHX0xPT1AgaW50ZXJydXB0IHdpdGggbm8gYWN0aXZlIG1lc3NhZ2UiKTsKKworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwkJCXByaW50ZigiSU5JVElBVE9SX01TR19PVVQiKTsKKwkJfQorI2VuZGlmCisJCXBoYXNlbWlzID0gYnVzX3BoYXNlICE9IFBfTUVTR09VVDsKKwkJaWYgKHBoYXNlbWlzKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQkJcHJpbnRmKCIgUEhBU0VNSVMgJXNcbiIsCisJCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkoYnVzX3BoYXNlKQorCQkJCQkJCSAgICAgLT5waGFzZW1zZyk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChidXNfcGhhc2UgPT0gUF9NRVNHSU4pIHsKKwkJCQkvKgorCQkJCSAqIENoYW5nZSBnZWFycyBhbmQgc2VlIGlmCisJCQkJICogdGhpcyBtZXNzYWdlcyBpcyBvZiBpbnRlcmVzdCB0bworCQkJCSAqIHVzIG9yIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0bworCQkJCSAqIHRoZSBzZXF1ZW5jZXIuCisJCQkJICovCisJCQkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSQVROTyk7CisJCQkJYWhkLT5zZW5kX21zZ19wZXJyb3IgPSAwOworCQkJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU47CisJCQkJYWhkLT5tc2dpbl9pbmRleCA9IDA7CisJCQkJZ290byByZXN3aXRjaDsKKwkJCX0KKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFoZC0+c2VuZF9tc2dfcGVycm9yKSB7CisJCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIiBieXRlIDB4JXhcbiIsIGFoZC0+c2VuZF9tc2dfcGVycm9yKTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIElmIHdlIGFyZSBub3RpZnlpbmcgdGhlIHRhcmdldCBvZiBhIENSQyBlcnJvcgorCQkJICogZHVyaW5nIHBhY2tldGl6ZWQgb3BlcmF0aW9ucywgdGhlIHRhcmdldCBpcworCQkJICogd2l0aGluIGl0cyByaWdodHMgdG8gYWNrbm93bGVkZ2Ugb3VyIG1lc3NhZ2UKKwkJCSAqIHdpdGggYSBidXNmcmVlLgorCQkJICovCisJCQlpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfUEFDS0VUSVpFRCkgIT0gMAorCQkJICYmIGFoZC0+c2VuZF9tc2dfcGVycm9yID09IE1TR19JTklUSUFUT1JfREVUX0VSUikKKwkJCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfSURFX0JVU0ZSRUU7CisKKwkJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzIsIGFoZC0+c2VuZF9tc2dfcGVycm9yKTsKKwkJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzEsIENPTlRfTVNHX0xPT1BfV1JJVEUpOworCQkJYnJlYWs7CisJCX0KKworCQltc2dkb25lCT0gYWhkLT5tc2dvdXRfaW5kZXggPT0gYWhkLT5tc2dvdXRfbGVuOworCQlpZiAobXNnZG9uZSkgeworCQkJLyoKKwkJCSAqIFRoZSB0YXJnZXQgaGFzIHJlcXVlc3RlZCBhIHJldHJ5LgorCQkJICogUmUtYXNzZXJ0IEFUTiwgcmVzZXQgb3VyIG1lc3NhZ2UgaW5kZXggdG8KKwkJCSAqIDAsIGFuZCB0cnkgYWdhaW4uCisJCQkgKi8KKwkJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCX0KKworCQlsYXN0Ynl0ZSA9IGFoZC0+bXNnb3V0X2luZGV4ID09IChhaGQtPm1zZ291dF9sZW4gLSAxKTsKKwkJaWYgKGxhc3RieXRlKSB7CisJCQkvKiBMYXN0IGJ5dGUgaXMgc2lnbmlmaWVkIGJ5IGRyb3BwaW5nIEFUTiAqLworCQkJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSQVROTyk7CisJCX0KKworCQkvKgorCQkgKiBDbGVhciBvdXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgcHJlc2VudAorCQkgKiB0aGUgbmV4dCBieXRlIG9uIHRoZSBidXMuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCXByaW50ZigiIGJ5dGUgMHgleFxuIiwKKwkJCSAgICAgICBhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXhdKTsKKyNlbmRpZgorCQlhaGRfb3V0YihhaGQsIFJFVFVSTl8yLCBhaGQtPm1zZ291dF9idWZbYWhkLT5tc2dvdXRfaW5kZXgrK10pOworCQlhaGRfb3V0YihhaGQsIFJFVFVSTl8xLCBDT05UX01TR19MT09QX1dSSVRFKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOgorCXsKKwkJaW50IHBoYXNlbWlzOworCQlpbnQgbWVzc2FnZV9kb25lOworCisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX0lOIik7CisJCX0KKyNlbmRpZgorCQlwaGFzZW1pcyA9IGJ1c19waGFzZSAhPSBQX01FU0dJTjsKKwkJaWYgKHBoYXNlbWlzKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQkJcHJpbnRmKCIgUEhBU0VNSVMgJXNcbiIsCisJCQkJICAgICAgIGFoZF9sb29rdXBfcGhhc2VfZW50cnkoYnVzX3BoYXNlKQorCQkJCQkJCSAgICAgLT5waGFzZW1zZyk7CisJCQl9CisjZW5kaWYKKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dPVVQKKwkJCSAmJiAoYWhkLT5zZW5kX21zZ19wZXJyb3IgIT0gMAorCQkJICB8fCAoYWhkLT5tc2dvdXRfbGVuICE9IDAKKwkJCSAgICYmIGFoZC0+bXNnb3V0X2luZGV4ID09IDApKSkgeworCQkJCWFoZC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQkJCWdvdG8gcmVzd2l0Y2g7CisJCQl9CisJCQllbmRfc2Vzc2lvbiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFB1bGwgdGhlIGJ5dGUgaW4gd2l0aG91dCBhY2tpbmcgaXQgKi8KKwkJYWhkLT5tc2dpbl9idWZbYWhkLT5tc2dpbl9pbmRleF0gPSBhaGRfaW5iKGFoZCwgU0NTSUJVUyk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApCisJCQlwcmludGYoIiBieXRlIDB4JXhcbiIsCisJCQkgICAgICAgYWhkLT5tc2dpbl9idWZbYWhkLT5tc2dpbl9pbmRleF0pOworI2VuZGlmCisKKwkJbWVzc2FnZV9kb25lID0gYWhkX3BhcnNlX21zZyhhaGQsICZkZXZpbmZvKTsKKworCQlpZiAobWVzc2FnZV9kb25lKSB7CisJCQkvKgorCQkJICogQ2xlYXIgb3VyIGluY29taW5nIG1lc3NhZ2UgYnVmZmVyIGluIGNhc2UgdGhlcmUKKwkJCSAqIGlzIGFub3RoZXIgbWVzc2FnZSBmb2xsb3dpbmcgdGhpcyBvbmUuCisJCQkgKi8KKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGlsbGljaXRlZCBhIHJlc3BvbnNlLAorCQkJICogYXNzZXJ0IEFUTiBzbyB0aGUgdGFyZ2V0IHRha2VzIHVzIHRvIHRoZQorCQkJICogbWVzc2FnZSBvdXQgcGhhc2UuCisJCQkgKi8KKwkJCWlmIChhaGQtPm1zZ291dF9sZW4gIT0gMCkgeworI2lmZGVmIEFIRF9ERUJVRworCQkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCQkJCXByaW50ZigiQXNzZXJ0aW5nIEFUTiBmb3IgcmVzcG9uc2VcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCQl9CisJCX0gZWxzZSAKKwkJCWFoZC0+bXNnaW5faW5kZXgrKzsKKworCQlpZiAobWVzc2FnZV9kb25lID09IE1TR0xPT1BfVEVSTUlOQVRFRCkgeworCQkJZW5kX3Nlc3Npb24gPSBUUlVFOworCQl9IGVsc2UgeworCQkJLyogQWNrIHRoZSBieXRlICovCisJCQlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJSRVFJTklUKTsKKwkJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzEsIENPTlRfTVNHX0xPT1BfUkVBRCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTVNHX1RZUEVfVEFSR0VUX01TR0lOOgorCXsKKwkJaW50IG1zZ2RvbmU7CisJCWludCBtc2dvdXRfcmVxdWVzdDsKKworCQkvKgorCQkgKiBCeSBkZWZhdWx0LCB0aGUgbWVzc2FnZSBsb29wIHdpbGwgY29udGludWUuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFJFVFVSTl8xLCBDT05UX01TR19MT09QX1RBUkcpOworCisJCWlmIChhaGQtPm1zZ291dF9sZW4gPT0gMCkKKwkJCXBhbmljKCJUYXJnZXQgTVNHSU4gd2l0aCBubyBhY3RpdmUgbWVzc2FnZSIpOworCisJCS8qCisJCSAqIElmIHdlIGludGVycnVwdGVkIGEgbWVzZ291dCBzZXNzaW9uLCB0aGUgaW5pdGlhdG9yCisJCSAqIHdpbGwgbm90IGtub3cgdGhpcyB1bnRpbCBvdXIgZmlyc3QgUkVRLiAgU28sIHdlCisJCSAqIG9ubHkgaG9ub3IgbWVzZ291dCByZXF1ZXN0cyBhZnRlciB3ZSd2ZSBzZW50IG91cgorCQkgKiBmaXJzdCBieXRlLgorCQkgKi8KKwkJaWYgKChhaGRfaW5iKGFoZCwgU0NTSVNJR0kpICYgQVROSSkgIT0gMAorCQkgJiYgYWhkLT5tc2dvdXRfaW5kZXggPiAwKQorCQkJbXNnb3V0X3JlcXVlc3QgPSBUUlVFOworCQllbHNlCisJCQltc2dvdXRfcmVxdWVzdCA9IEZBTFNFOworCisJCWlmIChtc2dvdXRfcmVxdWVzdCkgeworCisJCQkvKgorCQkJICogQ2hhbmdlIGdlYXJzIGFuZCBzZWUgaWYKKwkJCSAqIHRoaXMgbWVzc2FnZXMgaXMgb2YgaW50ZXJlc3QgdG8KKwkJCSAqIHVzIG9yIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0bworCQkJICogdGhlIHNlcXVlbmNlci4KKwkJCSAqLworCQkJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTSUdPLCBQX01FU0dPVVQgfCBCU1lPKTsKKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCQkJLyogRHVtbXkgcmVhZCB0byBSRVEgZm9yIGZpcnN0IGJ5dGUgKi8KKwkJCWFoZF9pbmIoYWhkLCBTQ1NJREFUKTsKKwkJCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDAsCisJCQkJIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMCkgfCBTUElPRU4pOworCQkJYnJlYWs7CisJCX0KKworCQltc2dkb25lID0gYWhkLT5tc2dvdXRfaW5kZXggPT0gYWhkLT5tc2dvdXRfbGVuOworCQlpZiAobXNnZG9uZSkgeworCQkJYWhkX291dGIoYWhkLCBTWEZSQ1RMMCwKKwkJCQkgYWhkX2luYihhaGQsIFNYRlJDVEwwKSAmIH5TUElPRU4pOworCQkJZW5kX3Nlc3Npb24gPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBQcmVzZW50IHRoZSBuZXh0IGJ5dGUgb24gdGhlIGJ1cy4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDAsIGFoZF9pbmIoYWhkLCBTWEZSQ1RMMCkgfCBTUElPRU4pOworCQlhaGRfb3V0YihhaGQsIFNDU0lEQVQsIGFoZC0+bXNnb3V0X2J1ZlthaGQtPm1zZ291dF9pbmRleCsrXSk7CisJCWJyZWFrOworCX0KKwljYXNlIE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ6CisJeworCQlpbnQgbGFzdGJ5dGU7CisJCWludCBtc2dkb25lOworCisJCS8qCisJCSAqIEJ5IGRlZmF1bHQsIHRoZSBtZXNzYWdlIGxvb3Agd2lsbCBjb250aW51ZS4KKwkJICovCisJCWFoZF9vdXRiKGFoZCwgUkVUVVJOXzEsIENPTlRfTVNHX0xPT1BfVEFSRyk7CisKKwkJLyoKKwkJICogVGhlIGluaXRpYXRvciBzaWduYWxzIHRoYXQgdGhpcyBpcworCQkgKiB0aGUgbGFzdCBieXRlIGJ5IGRyb3BwaW5nIEFUTi4KKwkJICovCisJCWxhc3RieXRlID0gKGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkgJiBBVE5JKSA9PSAwOworCisJCS8qCisJCSAqIFJlYWQgdGhlIGxhdGNoZWQgYnl0ZSwgYnV0IHR1cm4gb2ZmIFNQSU9FTiBmaXJzdAorCQkgKiBzbyB0aGF0IHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkgY2F1c2UgYSBSRVEgZm9yIHRoZQorCQkgKiBuZXh0IGJ5dGUuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNYRlJDVEwwLCBhaGRfaW5iKGFoZCwgU1hGUkNUTDApICYgflNQSU9FTik7CisJCWFoZC0+bXNnaW5fYnVmW2FoZC0+bXNnaW5faW5kZXhdID0gYWhkX2luYihhaGQsIFNDU0lEQVQpOworCQltc2dkb25lID0gYWhkX3BhcnNlX21zZyhhaGQsICZkZXZpbmZvKTsKKwkJaWYgKG1zZ2RvbmUgPT0gTVNHTE9PUF9URVJNSU5BVEVEKSB7CisJCQkvKgorCQkJICogVGhlIG1lc3NhZ2UgaXMgKnJlYWxseSogZG9uZSBpbiB0aGF0IGl0IGNhdXNlZAorCQkJICogdXMgdG8gZ28gdG8gYnVzIGZyZWUuICBUaGUgc2VxdWVuY2VyIGhhcyBhbHJlYWR5CisJCQkgKiBiZWVuIHJlc2V0IGF0IHRoaXMgcG9pbnQsIHNvIHB1bGwgdGhlIGVqZWN0aW9uCisJCQkgKiBoYW5kbGUuCisJCQkgKi8KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJYWhkLT5tc2dpbl9pbmRleCsrOworCisJCS8qCisJCSAqIFhYWCBSZWFkIHNwZWMgYWJvdXQgaW5pdGlhdG9yIGRyb3BwaW5nIEFUTiB0b28gc29vbgorCQkgKiAgICAgYW5kIHVzZSBtc2dkb25lIHRvIGRldGVjdCBpdC4KKwkJICovCisJCWlmIChtc2dkb25lID09IE1TR0xPT1BfTVNHQ09NUExFVEUpIHsKKwkJCWFoZC0+bXNnaW5faW5kZXggPSAwOworCisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGlsbGljaXRlZCBhIHJlc3BvbnNlLCB0cmFuc2l0aW9uCisJCQkgKiB0byB0aGUgTWVzc2FnZSBpbiBwaGFzZSBhbmQgc2VuZCBpdC4KKwkJCSAqLworCQkJaWYgKGFoZC0+bXNnb3V0X2xlbiAhPSAwKSB7CisJCQkJYWhkX291dGIoYWhkLCBTQ1NJU0lHTywgUF9NRVNHSU4gfCBCU1lPKTsKKwkJCQlhaGRfb3V0YihhaGQsIFNYRlJDVEwwLAorCQkJCQkgYWhkX2luYihhaGQsIFNYRlJDVEwwKSB8IFNQSU9FTik7CisJCQkJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dJTjsKKwkJCQlhaGQtPm1zZ2luX2luZGV4ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChsYXN0Ynl0ZSkKKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJZWxzZSB7CisJCQkvKiBBc2sgZm9yIHRoZSBuZXh0IGJ5dGUuICovCisJCQlhaGRfb3V0YihhaGQsIFNYRlJDVEwwLAorCQkJCSBhaGRfaW5iKGFoZCwgU1hGUkNUTDApIHwgU1BJT0VOKTsKKwkJfQorCisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwYW5pYygiVW5rbm93biBSRVFJTklUIG1lc3NhZ2UgdHlwZSIpOworCX0KKworCWlmIChlbmRfc2Vzc2lvbikgeworCQlpZiAoKGFoZC0+bXNnX2ZsYWdzICYgTVNHX0ZMQUdfUEFDS0VUSVpFRCkgIT0gMCkgeworCQkJcHJpbnRmKCIlczogUmV0dXJuaW5nIHRvIElkbGUgTG9vcFxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKwkJCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKKworCQkJLyoKKwkJCSAqIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgYSBjbGVhcl90YXJnZXRfc3RhdGUuCisJCQkgKi8KKwkJCWFoZF9vdXRiKGFoZCwgTEFTVFBIQVNFLCBQX0JVU0ZSRUUpOworCQkJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MsIE5PVF9JREVOVElGSUVEfE5PX0NEQl9TRU5UKTsKKwkJCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgRkFTVE1PREV8U0VRUkVTRVQpOworCQl9IGVsc2UgeworCQkJYWhkX2NsZWFyX21zZ19zdGF0ZShhaGQpOworCQkJYWhkX291dGIoYWhkLCBSRVRVUk5fMSwgRVhJVF9NU0dfTE9PUCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBTZWUgaWYgd2Ugc2VudCBhIHBhcnRpY3VsYXIgZXh0ZW5kZWQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LgorICogSWYgImZ1bGwiIGlzIHRydWUsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIHRhcmdldCBzYXcgdGhlIGZ1bGwKKyAqIG1lc3NhZ2UuICBJZiAiZnVsbCIgaXMgZmFsc2UsIHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc2F3IGF0CisgKiBsZWFzdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorYWhkX3NlbnRfbXNnKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21zZ3R5cGUgdHlwZSwgdV9pbnQgbXNndmFsLCBpbnQgZnVsbCkKK3sKKwlpbnQgZm91bmQ7CisJdV9pbnQgaW5kZXg7CisKKwlmb3VuZCA9IEZBTFNFOworCWluZGV4ID0gMDsKKworCXdoaWxlIChpbmRleCA8IGFoZC0+bXNnb3V0X2xlbikgeworCQlpZiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4XSA9PSBNU0dfRVhURU5ERUQpIHsKKwkJCXVfaW50IGVuZF9pbmRleDsKKworCQkJZW5kX2luZGV4ID0gaW5kZXggKyAxICsgYWhkLT5tc2dvdXRfYnVmW2luZGV4ICsgMV07CisJCQlpZiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4KzJdID09IG1zZ3ZhbAorCQkJICYmIHR5cGUgPT0gQUhETVNHX0VYVCkgeworCisJCQkJaWYgKGZ1bGwpIHsKKwkJCQkJaWYgKGFoZC0+bXNnb3V0X2luZGV4ID4gZW5kX2luZGV4KQorCQkJCQkJZm91bmQgPSBUUlVFOworCQkJCX0gZWxzZSBpZiAoYWhkLT5tc2dvdXRfaW5kZXggPiBpbmRleCkKKwkJCQkJZm91bmQgPSBUUlVFOworCQkJfQorCQkJaW5kZXggPSBlbmRfaW5kZXg7CisJCX0gZWxzZSBpZiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4XSA+PSBNU0dfU0lNUExFX1RBU0sKKwkJCSYmIGFoZC0+bXNnb3V0X2J1ZltpbmRleF0gPD0gTVNHX0lHTl9XSURFX1JFU0lEVUUpIHsKKworCQkJLyogU2tpcCB0YWcgdHlwZSBhbmQgdGFnIGlkIG9yIHJlc2lkdWUgcGFyYW0qLworCQkJaW5kZXggKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIFNpbmdsZSBieXRlIG1lc3NhZ2UgKi8KKwkJCWlmICh0eXBlID09IEFIRE1TR18xQgorCQkJICYmIGFoZC0+bXNnb3V0X2luZGV4ID4gaW5kZXgKKwkJCSAmJiAoYWhkLT5tc2dvdXRfYnVmW2luZGV4XSA9PSBtc2d2YWwKKwkJCSAgfHwgKChhaGQtPm1zZ291dF9idWZbaW5kZXhdICYgTVNHX0lERU5USUZZRkxBRykgIT0gMAorCQkJICAgJiYgbXNndmFsID09IE1TR19JREVOVElGWUZMQUcpKSkKKwkJCQlmb3VuZCA9IFRSVUU7CisJCQlpbmRleCsrOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoZm91bmQpOworfQorCisvKgorICogV2FpdCBmb3IgYSBjb21wbGV0ZSBpbmNvbWluZyBtZXNzYWdlLCBwYXJzZSBpdCwgYW5kIHJlc3BvbmQgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9wYXJzZV9tc2coc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCit7CisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CXJlamVjdDsKKwlpbnQJZG9uZTsKKwlpbnQJcmVzcG9uc2U7CisKKwlkb25lID0gTVNHTE9PUF9JTl9QUk9HOworCXJlc3BvbnNlID0gRkFMU0U7CisJcmVqZWN0ID0gRkFMU0U7CisJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKworCS8qCisJICogUGFyc2UgYXMgbXVjaCBvZiB0aGUgbWVzc2FnZSBhcyBpcyBhdmFpbGFibGUsCisJICogcmVqZWN0aW5nIGl0IGlmIHdlIGRvbid0IHN1cHBvcnQgaXQuICBXaGVuCisJICogdGhlIGVudGlyZSBtZXNzYWdlIGlzIGF2YWlsYWJsZSBhbmQgaGFzIGJlZW4KKwkgKiBoYW5kbGVkLCByZXR1cm4gTVNHTE9PUF9NU0dDT01QTEVURSwgaW5kaWNhdGluZworCSAqIHRoYXQgd2UgaGF2ZSBwYXJzZWQgYW4gZW50aXJlIG1lc3NhZ2UuCisJICoKKwkgKiBJbiB0aGUgY2FzZSBvZiBleHRlbmRlZCBtZXNzYWdlcywgd2UgYWNjZXB0IHRoZSBsZW5ndGgKKwkgKiBieXRlIG91dHJpZ2h0IGFuZCBwZXJmb3JtIG1vcmUgY2hlY2tpbmcgb25jZSB3ZSBrbm93IHRoZQorCSAqIGV4dGVuZGVkIG1lc3NhZ2UgdHlwZS4KKwkgKi8KKwlzd2l0Y2ggKGFoZC0+bXNnaW5fYnVmWzBdKSB7CisJY2FzZSBNU0dfRElTQ09OTkVDVDoKKwljYXNlIE1TR19TQVZFREFUQVBPSU5URVI6CisJY2FzZSBNU0dfQ01EQ09NUExFVEU6CisJY2FzZSBNU0dfUkVTVE9SRVBPSU5URVJTOgorCWNhc2UgTVNHX0lHTl9XSURFX1JFU0lEVUU6CisJCS8qCisJCSAqIEVuZCBvdXIgbWVzc2FnZSBsb29wIGFzIHRoZXNlIGFyZSBtZXNzYWdlcworCQkgKiB0aGUgc2VxdWVuY2VyIGhhbmRsZXMgb24gaXRzIG93bi4KKwkJICovCisJCWRvbmUgPSBNU0dMT09QX1RFUk1JTkFURUQ7CisJCWJyZWFrOworCWNhc2UgTVNHX01FU1NBR0VfUkVKRUNUOgorCQlyZXNwb25zZSA9IGFoZF9oYW5kbGVfbXNnX3JlamVjdChhaGQsIGRldmluZm8pOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTVNHX05PT1A6CisJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQlicmVhazsKKwljYXNlIE1TR19FWFRFTkRFRDoKKwl7CisJCS8qIFdhaXQgZm9yIGVub3VnaCBvZiB0aGUgbWVzc2FnZSB0byBiZWdpbiB2YWxpZGF0aW9uICovCisJCWlmIChhaGQtPm1zZ2luX2luZGV4IDwgMikKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGFoZC0+bXNnaW5fYnVmWzJdKSB7CisJCWNhc2UgTVNHX0VYVF9TRFRSOgorCQl7CisJCQl1X2ludAkgcGVyaW9kOworCQkJdV9pbnQJIHBwcl9vcHRpb25zOworCQkJdV9pbnQJIG9mZnNldDsKKwkJCXVfaW50CSBzYXZlZF9vZmZzZXQ7CisJCQkKKwkJCWlmIChhaGQtPm1zZ2luX2J1ZlsxXSAhPSBNU0dfRVhUX1NEVFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBib3RoIGFyZ3MgYmVmb3JlIHZhbGlkYXRpbmcKKwkJCSAqIGFuZCBhY3Rpbmcgb24gdGhpcyBtZXNzYWdlLgorCQkJICoKKwkJCSAqIEFkZCBvbmUgdG8gTVNHX0VYVF9TRFRSX0xFTiB0byBhY2NvdW50IGZvcgorCQkJICogdGhlIGV4dGVuZGVkIG1lc3NhZ2UgcHJlYW1ibGUuCisJCQkgKi8KKwkJCWlmIChhaGQtPm1zZ2luX2luZGV4IDwgKE1TR19FWFRfU0RUUl9MRU4gKyAxKSkKKwkJCQlicmVhazsKKworCQkJcGVyaW9kID0gYWhkLT5tc2dpbl9idWZbM107CisJCQlwcHJfb3B0aW9ucyA9IDA7CisJCQlzYXZlZF9vZmZzZXQgPSBvZmZzZXQgPSBhaGQtPm1zZ2luX2J1Zls0XTsKKwkJCWFoZF9kZXZsaW1pdGVkX3N5bmNyYXRlKGFoZCwgdGluZm8sICZwZXJpb2QsCisJCQkJCQkmcHByX29wdGlvbnMsIGRldmluZm8tPnJvbGUpOworCQkJYWhkX3ZhbGlkYXRlX29mZnNldChhaGQsIHRpbmZvLCBwZXJpb2QsICZvZmZzZXQsCisJCQkJCSAgICB0aW5mby0+Y3Vyci53aWR0aCwgZGV2aW5mby0+cm9sZSk7CisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkICIKKwkJCQkgICAgICAgIlNEVFIgcGVyaW9kICV4LCBvZmZzZXQgJXhcblx0IgorCQkJCSAgICAgICAiRmlsdGVyZWQgdG8gcGVyaW9kICV4LCBvZmZzZXQgJXhcbiIsCisJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCSAgICAgICBhaGQtPm1zZ2luX2J1ZlszXSwgc2F2ZWRfb2Zmc2V0LAorCQkJCSAgICAgICBwZXJpb2QsIG9mZnNldCk7CisJCQl9CisJCQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgZGV2aW5mbywgcGVyaW9kLAorCQkJCQkgb2Zmc2V0LCBwcHJfb3B0aW9ucywKKwkJCQkJIEFIRF9UUkFOU19BQ1RJVkV8QUhEX1RSQU5TX0dPQUwsCisJCQkJCSAvKnBhdXNlZCovVFJVRSk7CisKKwkJCS8qCisJCQkgKiBTZWUgaWYgd2UgaW5pdGlhdGVkIFN5bmMgTmVnb3RpYXRpb24KKwkJCSAqIGFuZCBkaWRuJ3QgaGF2ZSB0byBmYWxsIGRvd24gdG8gYXN5bmMKKwkJCSAqIHRyYW5zZmVycy4KKwkJCSAqLworCQkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfU0RUUiwgVFJVRSkpIHsKKwkJCQkvKiBXZSBzdGFydGVkIGl0ICovCisJCQkJaWYgKHNhdmVkX29mZnNldCAhPSBvZmZzZXQpIHsKKwkJCQkJLyogV2VudCB0b28gbG93IC0gZm9yY2UgYXN5bmMgKi8KKwkJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogU2VuZCBvdXIgb3duIFNEVFIgaW4gcmVwbHkKKwkJCQkgKi8KKwkJCQlpZiAoYm9vdHZlcmJvc2UKKwkJCQkgJiYgZGV2aW5mby0+cm9sZSA9PSBST0xFX0lOSVRJQVRPUikgeworCQkJCQlwcmludGYoIiglczolYzolZDolZCk6IFRhcmdldCAiCisJCQkJCSAgICAgICAiSW5pdGlhdGVkIFNEVFJcbiIsCisJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJCX0KKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKwkJCQlhaGRfY29uc3RydWN0X3NkdHIoYWhkLCBkZXZpbmZvLAorCQkJCQkJICAgcGVyaW9kLCBvZmZzZXQpOworCQkJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlyZXNwb25zZSA9IFRSVUU7CisJCQl9CisJCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTVNHX0VYVF9XRFRSOgorCQl7CisJCQl1X2ludCBidXNfd2lkdGg7CisJCQl1X2ludCBzYXZlZF93aWR0aDsKKwkJCXVfaW50IHNlbmRpbmdfcmVwbHk7CisKKwkJCXNlbmRpbmdfcmVwbHkgPSBGQUxTRTsKKwkJCWlmIChhaGQtPm1zZ2luX2J1ZlsxXSAhPSBNU0dfRVhUX1dEVFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBvdXIgYXJnIGJlZm9yZSB2YWxpZGF0aW5nCisJCQkgKiBhbmQgYWN0aW5nIG9uIHRoaXMgbWVzc2FnZS4KKwkJCSAqCisJCQkgKiBBZGQgb25lIHRvIE1TR19FWFRfV0RUUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhkLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1dEVFJfTEVOICsgMSkpCisJCQkJYnJlYWs7CisKKwkJCWJ1c193aWR0aCA9IGFoZC0+bXNnaW5fYnVmWzNdOworCQkJc2F2ZWRfd2lkdGggPSBidXNfd2lkdGg7CisJCQlhaGRfdmFsaWRhdGVfd2lkdGgoYWhkLCB0aW5mbywgJmJ1c193aWR0aCwKKwkJCQkJICAgZGV2aW5mby0+cm9sZSk7CisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkIFdEVFIgIgorCQkJCSAgICAgICAiJXggZmlsdGVyZWQgdG8gJXhcbiIsCisJCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCSAgICAgICBzYXZlZF93aWR0aCwgYnVzX3dpZHRoKTsKKwkJCX0KKworCQkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfV0RUUiwgVFJVRSkpIHsKKwkJCQkvKgorCQkJCSAqIERvbid0IHNlbmQgYSBXRFRSIGJhY2sgdG8gdGhlCisJCQkJICogdGFyZ2V0LCBzaW5jZSB3ZSBhc2tlZCBmaXJzdC4KKwkJCQkgKiBJZiB0aGUgd2lkdGggd2VudCBoaWdoZXIgdGhhbiBvdXIKKwkJCQkgKiByZXF1ZXN0LCByZWplY3QgaXQuCisJCQkJICovCisJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoKSB7CisJCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVxdWVzdGVkICVkQml0ICIKKwkJCQkJICAgICAgICJ0cmFuc2ZlcnMuICBSZWplY3RpbmcuLi5cbiIsCisJCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4sCisJCQkJCSAgICAgICA4ICogKDB4MDEgPDwgYnVzX3dpZHRoKSk7CisJCQkJCWJ1c193aWR0aCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgb3VyIG93biBXRFRSIGluIHJlcGx5CisJCQkJICovCisJCQkJaWYgKGJvb3R2ZXJib3NlCisJCQkJICYmIGRldmluZm8tPnJvbGUgPT0gUk9MRV9JTklUSUFUT1IpIHsKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBXRFRSXG4iLAorCQkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQl9CisJCQkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisJCQkJYWhkX2NvbnN0cnVjdF93ZHRyKGFoZCwgZGV2aW5mbywgYnVzX3dpZHRoKTsKKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJcmVzcG9uc2UgPSBUUlVFOworCQkJCXNlbmRpbmdfcmVwbHkgPSBUUlVFOworCQkJfQorCQkJLyoKKwkJCSAqIEFmdGVyIGEgd2lkZSBtZXNzYWdlLCB3ZSBhcmUgYXN5bmMsIGJ1dAorCQkJICogc29tZSBkZXZpY2VzIGRvbid0IHNlZW0gdG8gaG9ub3IgdGhpcyBwb3J0aW9uCisJCQkgKiBvZiB0aGUgc3BlYy4gIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiBvZiB0aGUKKwkJCSAqIHN5bmMgY29tcG9uZW50IG9mIG91ciB0cmFuc2ZlciBhZ3JlZW1lbnQgZXZlbgorCQkJICogaWYgb3VyIGdvYWwgaXMgYXN5bmMuICBCeSB1cGRhdGluZyBvdXIgd2lkdGgKKwkJCSAqIGFmdGVyIGZvcmNpbmcgdGhlIG5lZ290aWF0aW9uLCB3ZSBhdm9pZAorCQkJICogcmVuZWdvdGlhdGluZyBmb3Igd2lkdGguCisJCQkgKi8KKwkJCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCBkZXZpbmZvLCB0c3RhdGUsCisJCQkJCSAgICAgICB0aW5mbywgQUhEX05FR19BTFdBWVMpOworCQkJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIGJ1c193aWR0aCwKKwkJCQkgICAgICBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAorCQkJCSAgICAgIC8qcGF1c2VkKi9UUlVFKTsKKwkJCWlmIChzZW5kaW5nX3JlcGx5ID09IEZBTFNFICYmIHJlamVjdCA9PSBGQUxTRSkgeworCisJCQkJLyoKKwkJCQkgKiBXZSB3aWxsIGFsd2F5cyBoYXZlIGFuIFNEVFIgdG8gc2VuZC4KKwkJCQkgKi8KKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKwkJCQlhaGRfYnVpbGRfdHJhbnNmZXJfbXNnKGFoZCwgZGV2aW5mbyk7CisJCQkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCXJlc3BvbnNlID0gVFJVRTsKKwkJCX0KKwkJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNU0dfRVhUX1BQUjoKKwkJeworCQkJdV9pbnQJcGVyaW9kOworCQkJdV9pbnQJb2Zmc2V0OworCQkJdV9pbnQJYnVzX3dpZHRoOworCQkJdV9pbnQJcHByX29wdGlvbnM7CisJCQl1X2ludAlzYXZlZF93aWR0aDsKKwkJCXVfaW50CXNhdmVkX29mZnNldDsKKwkJCXVfaW50CXNhdmVkX3Bwcl9vcHRpb25zOworCisJCQlpZiAoYWhkLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9QUFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBhbGwgYXJncyBiZWZvcmUgdmFsaWRhdGluZworCQkJICogYW5kIGFjdGluZyBvbiB0aGlzIG1lc3NhZ2UuCisJCQkgKgorCQkJICogQWRkIG9uZSB0byBNU0dfRVhUX1BQUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhkLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1BQUl9MRU4gKyAxKSkKKwkJCQlicmVhazsKKworCQkJcGVyaW9kID0gYWhkLT5tc2dpbl9idWZbM107CisJCQlvZmZzZXQgPSBhaGQtPm1zZ2luX2J1Zls1XTsKKwkJCWJ1c193aWR0aCA9IGFoZC0+bXNnaW5fYnVmWzZdOworCQkJc2F2ZWRfd2lkdGggPSBidXNfd2lkdGg7CisJCQlwcHJfb3B0aW9ucyA9IGFoZC0+bXNnaW5fYnVmWzddOworCQkJLyoKKwkJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgYSBEVCBvbmx5CisJCQkgKiBwZXJpb2QgZmFjdG9yIHdpdGggbm8gRFQgb3B0aW9uCisJCQkgKiBzZXQgaW1wbGllcyBhc3luYy4KKwkJCSAqLworCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgPT0gMAorCQkJICYmIHBlcmlvZCA8PSA5KQorCQkJCW9mZnNldCA9IDA7CisJCQlzYXZlZF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCQkJc2F2ZWRfb2Zmc2V0ID0gb2Zmc2V0OworCisJCQkvKgorCQkJICogVHJhbnNmZXIgb3B0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaWYgd2UKKwkJCSAqIGFyZSBuZWdvdGlhdGluZyB3aWRlLgorCQkJICovCisJCQlpZiAoYnVzX3dpZHRoID09IDApCisJCQkJcHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfUUFTX1JFUTsKKworCQkJYWhkX3ZhbGlkYXRlX3dpZHRoKGFoZCwgdGluZm8sICZidXNfd2lkdGgsCisJCQkJCSAgIGRldmluZm8tPnJvbGUpOworCQkJYWhkX2RldmxpbWl0ZWRfc3luY3JhdGUoYWhkLCB0aW5mbywgJnBlcmlvZCwKKwkJCQkJCSZwcHJfb3B0aW9ucywgZGV2aW5mby0+cm9sZSk7CisJCQlhaGRfdmFsaWRhdGVfb2Zmc2V0KGFoZCwgdGluZm8sIHBlcmlvZCwgJm9mZnNldCwKKwkJCQkJICAgIGJ1c193aWR0aCwgZGV2aW5mby0+cm9sZSk7CisKKwkJCWlmIChhaGRfc2VudF9tc2coYWhkLCBBSERNU0dfRVhULCBNU0dfRVhUX1BQUiwgVFJVRSkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGFyZSB1bmFibGUgdG8gZG8gYW55IG9mIHRoZQorCQkJCSAqIHJlcXVlc3RlZCBvcHRpb25zICh3ZSB3ZW50IHRvbyBsb3cpLAorCQkJCSAqIHRoZW4gd2UnbGwgaGF2ZSB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoCisJCQkJIHx8IHNhdmVkX29mZnNldCAhPSBvZmZzZXQKKwkJCQkgfHwgc2F2ZWRfcHByX29wdGlvbnMgIT0gcHByX29wdGlvbnMpIHsKKwkJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQkJcGVyaW9kID0gMDsKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCQkJYnVzX3dpZHRoID0gMDsKKwkJCQkJcHByX29wdGlvbnMgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRldmluZm8tPnJvbGUgIT0gUk9MRV9UQVJHRVQpCisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJICAgICAgICJJbml0aWF0ZWQgUFBSXG4iLAorCQkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogSW5pdGlhdG9yICIKKwkJCQkJICAgICAgICJJbml0aWF0ZWQgUFBSXG4iLAorCQkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKwkJCQlhaGRfY29uc3RydWN0X3BwcihhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LAorCQkJCQkJICBidXNfd2lkdGgsIHBwcl9vcHRpb25zKTsKKwkJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJcmVzcG9uc2UgPSBUUlVFOworCQkJfQorCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCBQUFIgd2lkdGggJXgsICIKKwkJCQkgICAgICAgInBlcmlvZCAleCwgb2Zmc2V0ICV4LG9wdGlvbnMgJXhcbiIKKwkJCQkgICAgICAgIlx0RmlsdGVyZWQgdG8gd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQkJCSAgICAgICAib2Zmc2V0ICV4LCBvcHRpb25zICV4XG4iLAorCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAgICAgc2F2ZWRfd2lkdGgsIGFoZC0+bXNnaW5fYnVmWzNdLAorCQkJCSAgICAgICBzYXZlZF9vZmZzZXQsIHNhdmVkX3Bwcl9vcHRpb25zLAorCQkJCSAgICAgICBidXNfd2lkdGgsIHBlcmlvZCwgb2Zmc2V0LCBwcHJfb3B0aW9ucyk7CisJCQl9CisJCQlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgYnVzX3dpZHRoLAorCQkJCSAgICAgIEFIRF9UUkFOU19BQ1RJVkV8QUhEX1RSQU5TX0dPQUwsCisJCQkJICAgICAgLypwYXVzZWQqL1RSVUUpOworCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIHBlcmlvZCwKKwkJCQkJIG9mZnNldCwgcHByX29wdGlvbnMsCisJCQkJCSBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAorCQkJCQkgLypwYXVzZWQqL1RSVUUpOworCisJCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQkvKiBVbmtub3duIGV4dGVuZGVkIG1lc3NhZ2UuICBSZWplY3QgaXQuICovCisJCQlyZWplY3QgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCWNhc2UgTVNHX0JVU19ERVZfUkVTRVQ6CisJCWFoZF9oYW5kbGVfZGV2cmVzZXQoYWhkLCBkZXZpbmZvLCBDQU1fTFVOX1dJTERDQVJELAorCQkJCSAgICBDQU1fQkRSX1NFTlQsCisJCQkJICAgICJCdXMgRGV2aWNlIFJlc2V0IFJlY2VpdmVkIiwKKwkJCQkgICAgLyp2ZXJib3NlX2xldmVsKi8wKTsKKwkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJZG9uZSA9IE1TR0xPT1BfVEVSTUlOQVRFRDsKKwkJYnJlYWs7CisJY2FzZSBNU0dfQUJPUlRfVEFHOgorCWNhc2UgTVNHX0FCT1JUOgorCWNhc2UgTVNHX0NMRUFSX1FVRVVFOgorCXsKKwkJaW50IHRhZzsKKworCQkvKiBUYXJnZXQgbW9kZSBtZXNzYWdlcyAqLworCQlpZiAoZGV2aW5mby0+cm9sZSAhPSBST0xFX1RBUkdFVCkgeworCQkJcmVqZWN0ID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCXRhZyA9IFNDQl9MSVNUX05VTEw7CisJCWlmIChhaGQtPm1zZ2luX2J1ZlswXSA9PSBNU0dfQUJPUlRfVEFHKQorCQkJdGFnID0gYWhkX2luYihhaGQsIElOSVRJQVRPUl9UQUcpOworCQlhaGRfYWJvcnRfc2NicyhhaGQsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCSAgICAgICBkZXZpbmZvLT5sdW4sIHRhZywgUk9MRV9UQVJHRVQsCisJCQkgICAgICAgQ0FNX1JFUV9BQk9SVEVEKTsKKworCQl0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tkZXZpbmZvLT5vdXJfc2NzaWlkXTsKKwkJaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgYWhkX3Rtb2RlX2xzdGF0ZSogbHN0YXRlOworCisJCQlsc3RhdGUgPSB0c3RhdGUtPmVuYWJsZWRfbHVuc1tkZXZpbmZvLT5sdW5dOworCQkJaWYgKGxzdGF0ZSAhPSBOVUxMKSB7CisJCQkJYWhkX3F1ZXVlX2xzdGF0ZV9ldmVudChhaGQsIGxzdGF0ZSwKKwkJCQkJCSAgICAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCQkJICAgICAgIGFoZC0+bXNnaW5fYnVmWzBdLAorCQkJCQkJICAgICAgIC8qYXJnKi90YWcpOworCQkJCWFoZF9zZW5kX2xzdGF0ZV9ldmVudHMoYWhkLCBsc3RhdGUpOworCQkJfQorCQl9CisJCWFoZF9yZXN0YXJ0KGFoZCk7CisJCWRvbmUgPSBNU0dMT09QX1RFUk1JTkFURUQ7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCWNhc2UgTVNHX1FBU19SRVFVRVNUOgorI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJcHJpbnRmKCIlczogUUFTIHJlcXVlc3QuICBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSkpOworI2VuZGlmCisJCWFoZC0+bXNnX2ZsYWdzIHw9IE1TR19GTEFHX0VYUEVDVF9RQVNSRUpfQlVTRlJFRTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE1TR19URVJNX0lPX1BST0M6CisJZGVmYXVsdDoKKwkJcmVqZWN0ID0gVFJVRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlamVjdCkgeworCQkvKgorCQkgKiBTZXR1cCB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisJCSAqLworCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoZC0+bXNnb3V0X2xlbiA9IDE7CisJCWFoZC0+bXNnb3V0X2J1ZlswXSA9IE1TR19NRVNTQUdFX1JFSkVDVDsKKwkJZG9uZSA9IE1TR0xPT1BfTVNHQ09NUExFVEU7CisJCXJlc3BvbnNlID0gVFJVRTsKKwl9CisKKwlpZiAoZG9uZSAhPSBNU0dMT09QX0lOX1BST0cgJiYgIXJlc3BvbnNlKQorCQkvKiBDbGVhciB0aGUgb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIgKi8KKwkJYWhkLT5tc2dvdXRfbGVuID0gMDsKKworCXJldHVybiAoZG9uZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbWVzc2FnZSByZWplY3QgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorYWhkX2hhbmRsZV9tc2dfcmVqZWN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCS8qCisJICogV2hhdCB3ZSBjYXJlIGFib3V0IGhlcmUgaXMgaWYgd2UgaGFkIGFuCisJICogb3V0c3RhbmRpbmcgU0RUUiBvciBXRFRSIG1lc3NhZ2UgZm9yIHRoaXMKKwkgKiB0YXJnZXQuICBJZiB3ZSBkaWQsIHRoaXMgaXMgYSBzaWduYWwgdGhhdAorCSAqIHRoZSB0YXJnZXQgaXMgcmVmdXNpbmcgbmVnb3RpYXRpb24uCisJICovCisJc3RydWN0IHNjYiAqc2NiOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50IHNjYl9pbmRleDsKKwl1X2ludCBsYXN0X21zZzsKKwlpbnQgICByZXNwb25zZSA9IDA7CisKKwlzY2JfaW5kZXggPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiX2luZGV4KTsKKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCS8qIE1pZ2h0IGJlIG5lY2Vzc2FyeSAqLworCWxhc3RfbXNnID0gYWhkX2luYihhaGQsIExBU1RfTVNHKTsKKworCWlmIChhaGRfc2VudF9tc2coYWhkLCBBSERNU0dfRVhULCBNU0dfRVhUX1BQUiwgLypmdWxsKi9GQUxTRSkpIHsKKwkJaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfUFBSLCAvKmZ1bGwqL1RSVUUpCisJCSAmJiB0aW5mby0+Z29hbC5wZXJpb2QgPD0gQUhEX1NZTkNSQVRFX1BBQ0VEKSB7CisJCQkvKgorCQkJICogVGFyZ2V0IG1heSBub3QgbGlrZSBvdXIgU1BJLTQgUFBSIE9wdGlvbnMuCisJCQkgKiBBdHRlbXB0IHRvIG5lZ290aWF0ZSA4ME1IeiB3aGljaCB3aWxsIHR1cm4KKwkJCSAqIG9mZiB0aGVzZSBvcHRpb25zLgorCQkJICovCisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFBQUiBSZWplY3RlZC4gIgorCQkJCSAgICAgICAiVHJ5aW5nIHNpbXBsZSBVMTYwIFBQUlxuIiwKKwkJCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJfQorCQkJdGluZm8tPmdvYWwucGVyaW9kID0gQUhEX1NZTkNSQVRFX0RUOworCQkJdGluZm8tPmdvYWwucHByX29wdGlvbnMgJj0gTVNHX0VYVF9QUFJfSVVfUkVRCisJCQkJCQl8ICBNU0dfRVhUX1BQUl9RQVNfUkVRCisJCQkJCQl8ICBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFBQUiBtZXNzYWdlLgorCQkJICogQXR0ZW1wdCB0byBuZWdvdGlhdGUgU1BJLTIgc3R5bGUuCisJCQkgKi8KKwkJCWlmIChib290dmVyYm9zZSkgeworCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogUFBSIFJlamVjdGVkLiAiCisJCQkJICAgICAgICJUcnlpbmcgV0RUUi9TRFRSXG4iLAorCQkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CisJCQl9CisJCQl0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyA9IDA7CisJCQl0aW5mby0+Y3Vyci50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCQl0aW5mby0+Z29hbC50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCX0KKwkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQlhaGQtPm1zZ291dF9sZW4gPSAwOworCQlhaGRfYnVpbGRfdHJhbnNmZXJfbXNnKGFoZCwgZGV2aW5mbyk7CisJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJcmVzcG9uc2UgPSAxOworCX0gZWxzZSBpZiAoYWhkX3NlbnRfbXNnKGFoZCwgQUhETVNHX0VYVCwgTVNHX0VYVF9XRFRSLCAvKmZ1bGwqL0ZBTFNFKSkgeworCisJCS8qIG5vdGUgOGJpdCB4ZmVycyAqLworCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgV0lERSBuZWdvdGlhdGlvbi4gIFVzaW5nICIKKwkJICAgICAgICI4Yml0IHRyYW5zZmVyc1xuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkgICAgICBBSERfVFJBTlNfQUNUSVZFfEFIRF9UUkFOU19HT0FMLAorCQkJICAgICAgLypwYXVzZWQqL1RSVUUpOworCQkvKgorCQkgKiBObyBuZWVkIHRvIGNsZWFyIHRoZSBzeW5jIHJhdGUuICBJZiB0aGUgdGFyZ2V0CisJCSAqIGRpZCBub3QgYWNjZXB0IHRoZSBjb21tYW5kLCBvdXIgc3luY3JhdGUgaXMKKwkJICogdW5hZmZlY3RlZC4gIElmIHRoZSB0YXJnZXQgc3RhcnRlZCB0aGUgbmVnb3RpYXRpb24sCisJCSAqIGJ1dCByZWplY3RlZCBvdXIgcmVzcG9uc2UsIHdlIGFscmVhZHkgY2xlYXJlZCB0aGUKKwkJICogc3luYyByYXRlIGJlZm9yZSBzZW5kaW5nIG91ciBXRFRSLgorCQkgKi8KKwkJaWYgKHRpbmZvLT5nb2FsLm9mZnNldCAhPSB0aW5mby0+Y3Vyci5vZmZzZXQpIHsKKworCQkJLyogU3RhcnQgdGhlIHN5bmMgbmVnb3RpYXRpb24gKi8KKwkJCWFoZC0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisJCQlhaGRfYnVpbGRfdHJhbnNmZXJfbXNnKGFoZCwgZGV2aW5mbyk7CisJCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCQlyZXNwb25zZSA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKGFoZF9zZW50X21zZyhhaGQsIEFIRE1TR19FWFQsIE1TR19FWFRfU0RUUiwgLypmdWxsKi9GQUxTRSkpIHsKKwkJLyogbm90ZSBhc3luY2ggeGZlcnMgYW5kIGNsZWFyIGZsYWcgKi8KKwkJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIC8qcGVyaW9kKi8wLAorCQkJCSAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKKwkJCQkgQUhEX1RSQU5TX0FDVElWRXxBSERfVFJBTlNfR09BTCwKKwkJCQkgLypwYXVzZWQqL1RSVUUpOworCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgc3luY2hyb25vdXMgbmVnb3RpYXRpb24uICIKKwkJICAgICAgICJVc2luZyBhc3luY2hyb25vdXMgdHJhbnNmZXJzXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwl9IGVsc2UgaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBNU0dfU0lNUExFX1RBU0spICE9IDApIHsKKwkJaW50IHRhZ190eXBlOworCQlpbnQgbWFzazsKKworCQl0YWdfdHlwZSA9IChzY2ItPmhzY2ItPmNvbnRyb2wgJiBNU0dfU0lNUExFX1RBU0spOworCisJCWlmICh0YWdfdHlwZSA9PSBNU0dfU0lNUExFX1RBU0spIHsKKwkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyB0YWdnZWQgY29tbWFuZHMuICAiCisJCQkgICAgICAgIlBlcmZvcm1pbmcgbm9uLXRhZ2dlZCBJL09cbiIsIGFoZF9uYW1lKGFoZCksCisJCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJYWhkX3NldF90YWdzKGFoZCwgZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOworCQkJbWFzayA9IH4weDIzOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzICVzIHRhZ2dlZCBjb21tYW5kcy4gICIKKwkJCSAgICAgICAiUGVyZm9ybWluZyBzaW1wbGUgcXVldWUgdGFnZ2VkIEkvTyBvbmx5XG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJCSAgICAgICBkZXZpbmZvLT5sdW4sIHRhZ190eXBlID09IE1TR19PUkRFUkVEX1RBU0sKKwkJCSAgICAgICA/ICJvcmRlcmVkIiA6ICJoZWFkIG9mIHF1ZXVlIik7CisJCQlhaGRfc2V0X3RhZ3MoYWhkLCBkZXZpbmZvLCBBSERfUVVFVUVfQkFTSUMpOworCQkJbWFzayA9IH4weDAzOworCQl9CisKKwkJLyoKKwkJICogUmVzZW5kIHRoZSBpZGVudGlmeSBmb3IgdGhpcyBDQ0IgYXMgdGhlIHRhcmdldAorCQkgKiBtYXkgYmVsaWV2ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCBvdGhlcndpc2UuCisJCSAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLAorCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NPTlRST0wpICYgbWFzayk7CisJIAlzY2ItPmhzY2ItPmNvbnRyb2wgJj0gbWFzazsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl90YWcoc2NiLCAvKmVuYWJsZWQqL0ZBTFNFLAorCQkJCQkvKnR5cGUqL01TR19TSU1QTEVfVEFTSyk7CisJCWFoZF9vdXRiKGFoZCwgTVNHX09VVCwgTVNHX0lERU5USUZZRkxBRyk7CisJCWFoZF9hc3NlcnRfYXRuKGFoZCk7CisJCWFoZF9idXN5X3RjbChhaGQsIEJVSUxEX1RDTChzY2ItPmhzY2ItPnNjc2lpZCwgZGV2aW5mby0+bHVuKSwKKwkJCSAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisKKwkJLyoKKwkJICogUmVxdWV1ZSBhbGwgdGFnZ2VkIGNvbW1hbmRzIGZvciB0aGlzIHRhcmdldAorCQkgKiBjdXJyZW50bHkgaW4gb3VyIHBvc2Vzc2lvbiBzbyB0aGV5IGNhbiBiZQorCQkgKiBjb252ZXJ0ZWQgdG8gdW50YWdnZWQgY29tbWFuZHMuCisJCSAqLworCQlhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYiksCisJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkgICBTQ0JfR0VUX0xVTihzY2IpLCAvKnRhZyovU0NCX0xJU1RfTlVMTCwKKwkJCQkgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRLAorCQkJCSAgIFNFQVJDSF9DT01QTEVURSk7CisJfSBlbHNlIGlmIChhaGRfc2VudF9tc2coYWhkLCBBSERNU0dfMUIsIE1TR19JREVOVElGWUZMQUcsIFRSVUUpKSB7CisJCS8qCisJCSAqIE1vc3QgbGlrZWx5IHRoZSBkZXZpY2UgYmVsaWV2ZXMgdGhhdCB3ZSBoYWQKKwkJICogcHJldmlvdXNseSBuZWdvdGlhdGVkIHBhY2tldGl6ZWQuCisJCSAqLworCQlhaGQtPm1zZ19mbGFncyB8PSBNU0dfRkxBR19FWFBFQ1RfUFBSX0JVU0ZSRUUKKwkJCSAgICAgICB8ICBNU0dfRkxBR19JVV9SRVFfQ0hBTkdFRDsKKworCQlhaGRfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGQsIGRldmluZm8pOworCQlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coYWhkLCBkZXZpbmZvKTsKKwkJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCQlyZXNwb25zZSA9IDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCisJCSAqLworCQlwcmludGYoIiVzOiVjOiVkOiBNZXNzYWdlIHJlamVjdCBmb3IgJXggLS0gaWdub3JlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGxhc3RfbXNnKTsKKwl9CisJcmV0dXJuIChyZXNwb25zZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGluZ25vcmUgd2lkZSByZXNpZHVlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCit7CisJdV9pbnQgc2NiX2luZGV4OworCXN0cnVjdCBzY2IgKnNjYjsKKworCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfaW5kZXgpOworCS8qCisJICogWFhYIEFjdHVhbGx5IGNoZWNrIGRhdGEgZGlyZWN0aW9uIGluIHRoZSBzZXF1ZW5jZXI/CisJICogUGVyaGFwcyBhZGQgZGF0YWRpciB0byBzb21lIHNwYXJlIGJpdHMgaW4gdGhlIGhzY2I/CisJICovCisJaWYgKChhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTKSAmIERQSEFTRSkgPT0gMAorCSB8fCBhaGRfZ2V0X3RyYW5zZmVyX2RpcihzY2IpICE9IENBTV9ESVJfSU4pIHsKKwkJLyoKKwkJICogSWdub3JlIHRoZSBtZXNzYWdlIGlmIHdlIGhhdmVuJ3QKKwkJICogc2VlbiBhbiBhcHByb3ByaWF0ZSBkYXRhIHBoYXNlIHlldC4KKwkJICovCisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgdGhlIHJlc2lkdWFsIG9jY3VycmVkIG9uIHRoZSBsYXN0CisJCSAqIHRyYW5zZmVyIGFuZCB0aGUgdHJhbnNmZXIgcmVxdWVzdCB3YXMKKwkJICogZXhwZWN0ZWQgdG8gZW5kIG9uIGFuIG9kZCBjb3VudCwgZG8KKwkJICogbm90aGluZy4gIE90aGVyd2lzZSwgc3VidHJhY3QgYSBieXRlCisJCSAqIGFuZCB1cGRhdGUgdGhlIHJlc2lkdWFsIGNvdW50IGFjY29yZGluZ2x5LgorCQkgKi8KKwkJdWludDMyX3Qgc2dwdHI7CisKKwkJc2dwdHIgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUik7CisJCWlmICgoc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDAKKwkJICYmIChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9UQVNLX0FUVFJJQlVURSkKKwkJICAgICAmIFNDQl9YRkVSTEVOX09ERCkgIT0gMCkgeworCQkJLyoKKwkJCSAqIElmIHRoZSByZXNpZHVhbCBvY2N1cnJlZCBvbiB0aGUgbGFzdAorCQkJICogdHJhbnNmZXIgYW5kIHRoZSB0cmFuc2ZlciByZXF1ZXN0IHdhcworCQkJICogZXhwZWN0ZWQgdG8gZW5kIG9uIGFuIG9kZCBjb3VudCwgZG8KKwkJCSAqIG5vdGhpbmcuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCXVpbnQzMl90IGRhdGFfY250OworCQkJdWludDY0X3QgZGF0YV9hZGRyOworCQkJdWludDMyX3Qgc2dsZW47CisKKwkJCS8qIFB1bGwgaW4gdGhlIHJlc3Qgb2YgdGhlIHNncHRyICovCisJCQlzZ3B0ciA9IGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCWRhdGFfY250ID0gYWhkX2lubF9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfREFUQUNOVCk7CisJCQlpZiAoKHNncHRyICYgU0dfTElTVF9OVUxMKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgcmVzaWR1YWwgZGF0YSBjb3VudCBpcyBub3QgdXBkYXRlZAorCQkJCSAqIGZvciB0aGUgY29tbWFuZCBydW4gdG8gY29tcGxldGlvbiBjYXNlLgorCQkJCSAqIEV4cGxpY2l0bHkgemVybyB0aGUgY291bnQuCisJCQkJICovCisJCQkJZGF0YV9jbnQgJj0gfkFIRF9TR19MRU5fTUFTSzsKKwkJCX0KKwkJCWRhdGFfYWRkciA9IGFoZF9pbnEoYWhkLCBTSEFERFIpOworCQkJZGF0YV9jbnQgKz0gMTsKKwkJCWRhdGFfYWRkciAtPSAxOworCQkJc2dwdHIgJj0gU0dfUFRSX01BU0s7CisJCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKKworCQkJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisKKwkJCQkvKgorCQkJCSAqIFRoZSByZXNpZHVhbCBzZyBwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IFMvRworCQkJCSAqIHRvIGxvYWQgc28gd2UgbXVzdCBnbyBiYWNrIG9uZS4KKwkJCQkgKi8KKwkJCQlzZy0tOworCQkJCXNnbGVuID0gYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0s7CisJCQkJaWYgKHNnICE9IHNjYi0+c2dfbGlzdAorCQkJCSAmJiBzZ2xlbiA8IChkYXRhX2NudCAmIEFIRF9TR19MRU5fTUFTSykpIHsKKworCQkJCQlzZy0tOworCQkJCQlzZ2xlbiA9IGFoZF9sZTMydG9oKHNnLT5sZW4pOworCQkJCQkvKgorCQkJCQkgKiBQcmVzZXJ2ZSBIaWdoIEFkZHJlc3MgYW5kIFNHX0xJU1QKKwkJCQkJICogYml0cyB3aGlsZSBzZXR0aW5nIHRoZSBjb3VudCB0byAxLgorCQkJCQkgKi8KKwkJCQkJZGF0YV9jbnQgPSAxfChzZ2xlbiYofkFIRF9TR19MRU5fTUFTSykpOworCQkJCQlkYXRhX2FkZHIgPSBhaGRfbGU2NHRvaChzZy0+YWRkcikKKwkJCQkJCSAgKyAoc2dsZW4gJiBBSERfU0dfTEVOX01BU0spCisJCQkJCQkgIC0gMTsKKworCQkJCQkvKgorCQkJCQkgKiBJbmNyZW1lbnQgc2cgc28gaXQgcG9pbnRzIHRvIHRoZQorCQkJCQkgKiAibmV4dCIgc2cuCisJCQkJCSAqLworCQkJCQlzZysrOworCQkJCQlzZ3B0ciA9IGFoZF9zZ192aXJ0X3RvX2J1cyhhaGQsIHNjYiwKKwkJCQkJCQkJICAgc2cpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKworCQkJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisKKwkJCQkvKgorCQkJCSAqIFRoZSByZXNpZHVhbCBzZyBwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IFMvRworCQkJCSAqIHRvIGxvYWQgc28gd2UgbXVzdCBnbyBiYWNrIG9uZS4KKwkJCQkgKi8KKwkJCQlzZy0tOworCQkJCXNnbGVuID0gYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0s7CisJCQkJaWYgKHNnICE9IHNjYi0+c2dfbGlzdAorCQkJCSAmJiBzZ2xlbiA8IChkYXRhX2NudCAmIEFIRF9TR19MRU5fTUFTSykpIHsKKworCQkJCQlzZy0tOworCQkJCQlzZ2xlbiA9IGFoZF9sZTMydG9oKHNnLT5sZW4pOworCQkJCQkvKgorCQkJCQkgKiBQcmVzZXJ2ZSBIaWdoIEFkZHJlc3MgYW5kIFNHX0xJU1QKKwkJCQkJICogYml0cyB3aGlsZSBzZXR0aW5nIHRoZSBjb3VudCB0byAxLgorCQkJCQkgKi8KKwkJCQkJZGF0YV9jbnQgPSAxfChzZ2xlbiYofkFIRF9TR19MRU5fTUFTSykpOworCQkJCQlkYXRhX2FkZHIgPSBhaGRfbGUzMnRvaChzZy0+YWRkcikKKwkJCQkJCSAgKyAoc2dsZW4gJiBBSERfU0dfTEVOX01BU0spCisJCQkJCQkgIC0gMTsKKworCQkJCQkvKgorCQkJCQkgKiBJbmNyZW1lbnQgc2cgc28gaXQgcG9pbnRzIHRvIHRoZQorCQkJCQkgKiAibmV4dCIgc2cuCisJCQkJCSAqLworCQkJCQlzZysrOworCQkJCQlzZ3B0ciA9IGFoZF9zZ192aXJ0X3RvX2J1cyhhaGQsIHNjYiwKKwkJCQkJCQkJICBzZyk7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIFRvZ2dsZSB0aGUgIm9kZG5lc3MiIG9mIHRoZSB0cmFuc2ZlciBsZW5ndGgKKwkJCSAqIHRvIGhhbmRsZSB0aGlzIG1pZC10cmFuc2ZlciBpZ25vcmUgd2lkZQorCQkJICogcmVzaWR1ZS4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBvZGRuZXNzIGlzCisJCQkgKiBjb3JyZWN0IGZvciBzdWJzZXF1ZW50IGRhdGEgdHJhbnNmZXJzLgorCQkJICovCisJCQlhaGRfb3V0YihhaGQsIFNDQl9UQVNLX0FUVFJJQlVURSwKKwkJCSAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9UQVNLX0FUVFJJQlVURSkKKwkJCSAgICBeIFNDQl9YRkVSTEVOX09ERCk7CisKKwkJCWFoZF9vdXRsKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSLCBzZ3B0cik7CisJCQlhaGRfb3V0bChhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05ULCBkYXRhX2NudCk7CisJCQkvKgorCQkJICogVGhlIEZJRk8ncyBwb2ludGVycyB3aWxsIGJlIHVwZGF0ZWQgaWYvd2hlbiB0aGUKKwkJCSAqIHNlcXVlbmNlciByZS1lbnRlcnMgYSBkYXRhIHBoYXNlLgorCQkJICovCisJCX0KKwl9Cit9CisKKworLyoKKyAqIFJlaW5pdGlhbGl6ZSB0aGUgZGF0YSBwb2ludGVycyBmb3IgdGhlIGFjdGl2ZSB0cmFuc2ZlcgorICogYmFzZWQgb24gaXRzIGN1cnJlbnQgcmVzaWR1YWwuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJCSBzY2IgKnNjYjsKKwlhaGRfbW9kZV9zdGF0ZQkgc2F2ZWRfbW9kZXM7CisJdV9pbnQJCSBzY2JfaW5kZXg7CisJdV9pbnQJCSB3YWl0OworCXVpbnQzMl90CSBzZ3B0cjsKKwl1aW50MzJfdAkgcmVzaWQ7CisJdWludDY0X3QJIGRhdGFwdHI7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfREZGMF9NU0t8QUhEX01PREVfREZGMV9NU0ssCisJCQkgQUhEX01PREVfREZGMF9NU0t8QUhEX01PREVfREZGMV9NU0spOworCQkJIAorCXNjYl9pbmRleCA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JfaW5kZXgpOworCisJLyoKKwkgKiBSZWxlYXNlIGFuZCByZWFjcXVpcmUgdGhlIEZJRk8gc28gd2UKKwkgKiBoYXZlIGEgY2xlYW4gc2xhdGUuCisJICovCisJYWhkX291dGIoYWhkLCBERkZTWEZSQ1RMLCBDTFJDSE4pOworCXdhaXQgPSAxMDAwOworCXdoaWxlICgtLXdhaXQgJiYgIShhaGRfaW5iKGFoZCwgTURGRlNUQVQpICYgRklGT0ZSRUUpKQorCQlhaGRfZGVsYXkoMTAwKTsKKwlpZiAod2FpdCA9PSAwKSB7CisJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJcHJpbnRmKCJhaGRfcmVpbml0aWFsaXplX2RhdGFwdHJzOiBGb3JjaW5nIEZJRk8gZnJlZS5cbiIpOworCQlhaGRfb3V0YihhaGQsIERGRlNYRlJDVEwsIFJTVENITnxDTFJTSENOVCk7CisJfQorCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJYWhkX291dGIoYWhkLCBERkZTVEFULAorCQkgYWhkX2luYihhaGQsIERGRlNUQVQpCisJCXwgKHNhdmVkX21vZGVzID09IDB4MTEgPyBDVVJSRklGT18xIDogQ1VSUkZJRk9fMCkpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaW5pdGlhbCB2YWx1ZXMgZm9yIGRhdGFfYWRkciBhbmQgZGF0YV9jbnQKKwkgKiBmb3IgcmVzdW1pbmcgdGhlIGRhdGEgcGhhc2UuCisJICovCisJc2dwdHIgPSAoYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfUkVTSURVQUxfU0dQVFIgKyAzKSA8PCAyNCkKKwkgICAgICB8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9TR1BUUiArIDIpIDw8IDE2KQorCSAgICAgIHwgKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSICsgMSkgPDwgOCkKKwkgICAgICB8CWFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwlzZ3B0ciAmPSBTR19QVFJfTUFTSzsKKworCXJlc2lkID0gKGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQgKyAyKSA8PCAxNikKKwkgICAgICB8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9SRVNJRFVBTF9EQVRBQ05UICsgMSkgPDwgOCkKKwkgICAgICB8IGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX0RBVEFDTlQpOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJc3RydWN0IGFoZF9kbWE2NF9zZWcgKnNnOworCisJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCBzZ3B0cik7CisKKwkJLyogVGhlIHJlc2lkdWFsIHNnX3B0ciBhbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IHNnICovCisJCXNnLS07CisKKwkJZGF0YXB0ciA9IGFoZF9sZTY0dG9oKHNnLT5hZGRyKQorCQkJKyAoYWhkX2xlMzJ0b2goc2ctPmxlbikgJiBBSERfU0dfTEVOX01BU0spCisJCQktIHJlc2lkOworCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNywgZGF0YXB0ciA+PiA1Nik7CisJCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA2LCBkYXRhcHRyID4+IDQ4KTsKKwkJYWhkX291dGIoYWhkLCBIQUREUiArIDUsIGRhdGFwdHIgPj4gNDApOworCQlhaGRfb3V0YihhaGQsIEhBRERSICsgNCwgZGF0YXB0ciA+PiAzMik7CisJfSBlbHNlIHsKKwkJc3RydWN0CSBhaGRfZG1hX3NlZyAqc2c7CisKKwkJc2cgPSBhaGRfc2dfYnVzX3RvX3ZpcnQoYWhkLCBzY2IsIHNncHRyKTsKKworCQkvKiBUaGUgcmVzaWR1YWwgc2dfcHRyIGFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgc2cgKi8KKwkJc2ctLTsKKworCQlkYXRhcHRyID0gYWhkX2xlMzJ0b2goc2ctPmFkZHIpCisJCQkrIChhaGRfbGUzMnRvaChzZy0+bGVuKSAmIEFIRF9TR19MRU5fTUFTSykKKwkJCS0gcmVzaWQ7CisJCWFoZF9vdXRiKGFoZCwgSEFERFIgKyA0LAorCQkJIChhaGRfbGUzMnRvaChzZy0+bGVuKSAmIH5BSERfU0dfTEVOX01BU0spID4+IDI0KTsKKwl9CisJYWhkX291dGIoYWhkLCBIQUREUiArIDMsIGRhdGFwdHIgPj4gMjQpOworCWFoZF9vdXRiKGFoZCwgSEFERFIgKyAyLCBkYXRhcHRyID4+IDE2KTsKKwlhaGRfb3V0YihhaGQsIEhBRERSICsgMSwgZGF0YXB0ciA+PiA4KTsKKwlhaGRfb3V0YihhaGQsIEhBRERSLCBkYXRhcHRyKTsKKwlhaGRfb3V0YihhaGQsIEhDTlQgKyAyLCByZXNpZCA+PiAxNik7CisJYWhkX291dGIoYWhkLCBIQ05UICsgMSwgcmVzaWQgPj4gOCk7CisJYWhkX291dGIoYWhkLCBIQ05ULCByZXNpZCk7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIGVmZmVjdHMgb2YgaXNzdWluZyBhIGJ1cyBkZXZpY2UgcmVzZXQgbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9oYW5kbGVfZGV2cmVzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICB1X2ludCBsdW4sIGNhbV9zdGF0dXMgc3RhdHVzLCBjaGFyICptZXNzYWdlLAorCQkgICAgaW50IHZlcmJvc2VfbGV2ZWwpCit7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJc3RydWN0IGFoZF90bW9kZV90c3RhdGUqIHRzdGF0ZTsKKyNlbmRpZgorCWludCBmb3VuZDsKKworCWZvdW5kID0gYWhkX2Fib3J0X3NjYnMoYWhkLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmNoYW5uZWwsCisJCQkgICAgICAgbHVuLCBTQ0JfTElTVF9OVUxMLCBkZXZpbmZvLT5yb2xlLAorCQkJICAgICAgIHN0YXR1cyk7CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKwkvKgorCSAqIFNlbmQgYW4gaW1tZWRpYXRlIG5vdGlmeSBjY2IgdG8gYWxsIHRhcmdldCBtb3JkIHBlcmlwaGVyYWwKKwkgKiBkcml2ZXJzIGFmZmVjdGVkIGJ5IHRoaXMgYWN0aW9uLgorCSAqLworCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW2RldmluZm8tPm91cl9zY3NpaWRdOworCWlmICh0c3RhdGUgIT0gTlVMTCkgeworCQl1X2ludCBjdXJfbHVuOworCQl1X2ludCBtYXhfbHVuOworCisJCWlmIChsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCQkJY3VyX2x1biA9IDA7CisJCQltYXhfbHVuID0gQUhEX05VTV9MVU5TIC0gMTsKKwkJfSBlbHNlIHsKKwkJCWN1cl9sdW4gPSBsdW47CisJCQltYXhfbHVuID0gbHVuOworCQl9CisJCWZvciAoY3VyX2x1biA8PSBtYXhfbHVuOyBjdXJfbHVuKyspIHsKKwkJCXN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2N1cl9sdW5dOworCQkJaWYgKGxzdGF0ZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlhaGRfcXVldWVfbHN0YXRlX2V2ZW50KGFoZCwgbHN0YXRlLCBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCQkgICAgICAgTVNHX0JVU19ERVZfUkVTRVQsIC8qYXJnKi8wKTsKKwkJCWFoZF9zZW5kX2xzdGF0ZV9ldmVudHMoYWhkLCBsc3RhdGUpOworCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIEdvIGJhY2sgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyBhbmQgcmVuZWdvdGlhdGUuCisJICovCisJYWhkX3NldF93aWR0aChhaGQsIGRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCSAgICAgIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgZGV2aW5mbywgLypwZXJpb2QqLzAsIC8qb2Zmc2V0Ki8wLAorCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkKKwlhaGRfc2VuZF9hc3luYyhhaGQsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGx1biwgQUNfU0VOVF9CRFIsIE5VTEwpOworCisJaWYgKG1lc3NhZ2UgIT0gTlVMTAorCSAmJiAodmVyYm9zZV9sZXZlbCA8PSBib290dmVyYm9zZSkpCisJCXByaW50ZigiJXM6ICVzIG9uICVjOiVkLiAlZCBTQ0JzIGFib3J0ZWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBtZXNzYWdlLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGZvdW5kKTsKK30KKworI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorc3RhdGljIHZvaWQKK2FoZF9zZXR1cF90YXJnZXRfbXNnaW4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICAgICBzdHJ1Y3Qgc2NiICpzY2IpCit7CisKKwkvKiAgICAgICAgICAgICAgCisJICogVG8gZmFjaWxpdGF0ZSBhZGRpbmcgbXVsdGlwbGUgbWVzc2FnZXMgdG9nZXRoZXIsCisJICogZWFjaCByb3V0aW5lIHNob3VsZCBpbmNyZW1lbnQgdGhlIGluZGV4IGFuZCBsZW4KKwkgKiB2YXJpYWJsZXMgaW5zdGVhZCBvZiBzZXR0aW5nIHRoZW0gZXhwbGljaXRseS4KKwkgKi8gICAgICAgICAgICAgCisJYWhkLT5tc2dvdXRfaW5kZXggPSAwOworCWFoZC0+bXNnb3V0X2xlbiA9IDA7CisKKwlpZiAoc2NiICE9IE5VTEwgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfQVVUT19ORUdPVElBVEUpICE9IDApCisJCWFoZF9idWlsZF90cmFuc2Zlcl9tc2coYWhkLCBkZXZpbmZvKTsKKwllbHNlCisJCXBhbmljKCJhaGRfaW50cjogQVdBSVRJTkcgdGFyZ2V0IG1lc3NhZ2Ugd2l0aCBubyBtZXNzYWdlIik7CisKKwlhaGQtPm1zZ291dF9pbmRleCA9IDA7CisJYWhkLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dJTjsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1X2ludAorYWhkX3NnbGlzdF9zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlidXNfc2l6ZV90IGxpc3Rfc2l6ZTsKKworCWxpc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWhkX2RtYV9zZWcpICogQUhEX05TRUc7CisJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApCisJCWxpc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWhkX2RtYTY0X3NlZykgKiBBSERfTlNFRzsKKwlyZXR1cm4gKGxpc3Rfc2l6ZSk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG9wdGltdW0gUy9HIExpc3QgYWxsb2NhdGlvbiBzaXplLiAgUy9HIGVsZW1lbnRzIHVzZWQKKyAqIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uIG11c3QgYmUgcGh5c2ljYWxseSBjb250aWd1b3VzLiAgQXNzdW1lIHRoZQorICogT1Mgd2lsbCBhbGxvY2F0ZSBmdWxsIHBhZ2VzIHRvIHVzLCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVxdWVzdAorICogbGVzcyB0aGFuIGEgcGFnZS4KKyAqLworc3RhdGljIHVfaW50CithaGRfc2dsaXN0X2FsbG9jc2l6ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYnVzX3NpemVfdCBzZ19saXN0X2luY3JlbWVudDsKKwlidXNfc2l6ZV90IHNnX2xpc3Rfc2l6ZTsKKwlidXNfc2l6ZV90IG1heF9saXN0X3NpemU7CisJYnVzX3NpemVfdCBiZXN0X2xpc3Rfc2l6ZTsKKworCS8qIFN0YXJ0IG91dCB3aXRoIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGZvciBBSERfTlNFRy4gKi8KKwlzZ19saXN0X2luY3JlbWVudCA9IGFoZF9zZ2xpc3Rfc2l6ZShhaGQpOworCXNnX2xpc3Rfc2l6ZSA9IHNnX2xpc3RfaW5jcmVtZW50OworCisJLyogR2V0IHVzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIGEgcGFnZSBpbiBzaXplLiAqLworCXdoaWxlICgoc2dfbGlzdF9zaXplICsgc2dfbGlzdF9pbmNyZW1lbnQpIDw9IFBBR0VfU0laRSkKKwkJc2dfbGlzdF9zaXplICs9IHNnX2xpc3RfaW5jcmVtZW50OworCisJLyoKKwkgKiBUcnkgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2Ygd2FzdGFnZSBieSBhbGxvY2F0aW5nCisJICogbXVsdGlwbGUgcGFnZXMuCisJICovCisJYmVzdF9saXN0X3NpemUgPSBzZ19saXN0X3NpemU7CisJbWF4X2xpc3Rfc2l6ZSA9IHJvdW5kdXAoc2dfbGlzdF9pbmNyZW1lbnQsIFBBR0VfU0laRSk7CisJaWYgKG1heF9saXN0X3NpemUgPCA0ICogUEFHRV9TSVpFKQorCQltYXhfbGlzdF9zaXplID0gNCAqIFBBR0VfU0laRTsKKwlpZiAobWF4X2xpc3Rfc2l6ZSA+IChBSERfU0NCX01BWF9BTExPQyAqIHNnX2xpc3RfaW5jcmVtZW50KSkKKwkJbWF4X2xpc3Rfc2l6ZSA9IChBSERfU0NCX01BWF9BTExPQyAqIHNnX2xpc3RfaW5jcmVtZW50KTsKKwl3aGlsZSAoKHNnX2xpc3Rfc2l6ZSArIHNnX2xpc3RfaW5jcmVtZW50KSA8PSBtYXhfbGlzdF9zaXplCisJICAgJiYgIChzZ19saXN0X3NpemUgJSBQQUdFX1NJWkUpICE9IDApIHsKKwkJYnVzX3NpemVfdCBuZXdfbW9kOworCQlidXNfc2l6ZV90IGJlc3RfbW9kOworCisJCXNnX2xpc3Rfc2l6ZSArPSBzZ19saXN0X2luY3JlbWVudDsKKwkJbmV3X21vZCA9IHNnX2xpc3Rfc2l6ZSAlIFBBR0VfU0laRTsKKwkJYmVzdF9tb2QgPSBiZXN0X2xpc3Rfc2l6ZSAlIFBBR0VfU0laRTsKKwkJaWYgKG5ld19tb2QgPiBiZXN0X21vZCB8fCBuZXdfbW9kID09IDApIHsKKwkJCWJlc3RfbGlzdF9zaXplID0gc2dfbGlzdF9zaXplOworCQl9CisJfQorCXJldHVybiAoYmVzdF9saXN0X3NpemUpOworfQorCisvKgorICogQWxsb2NhdGUgYSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgYSBuZXcgZGV2aWNlCisgKiBhbmQgcGVyZm9ybSBpbml0aWFsIGluaXRpYWxpemlvbi4KKyAqLworc3RydWN0IGFoZF9zb2Z0YyAqCithaGRfYWxsb2Modm9pZCAqcGxhdGZvcm1fYXJnLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCAgYWhkX3NvZnRjICphaGQ7CisKKyNpZm5kZWYJX19GcmVlQlNEX18KKwlhaGQgPSBtYWxsb2Moc2l6ZW9mKCphaGQpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmICghYWhkKSB7CisJCXByaW50ZigiYWljN3h4eDogY2Fubm90IG1hbGxvYyBzb2Z0YyFcbiIpOworCQlmcmVlKG5hbWUsIE1fREVWQlVGKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2Vsc2UKKwlhaGQgPSBkZXZpY2VfZ2V0X3NvZnRjKChkZXZpY2VfdClwbGF0Zm9ybV9hcmcpOworI2VuZGlmCisJbWVtc2V0KGFoZCwgMCwgc2l6ZW9mKCphaGQpKTsKKwlhaGQtPnNlZXBfY29uZmlnID0gbWFsbG9jKHNpemVvZigqYWhkLT5zZWVwX2NvbmZpZyksCisJCQkJICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKKyNpZm5kZWYJX19GcmVlQlNEX18KKwkJZnJlZShhaGQsIE1fREVWQlVGKTsKKyNlbmRpZgorCQlmcmVlKG5hbWUsIE1fREVWQlVGKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJTElTVF9JTklUKCZhaGQtPnBlbmRpbmdfc2Nicyk7CisJLyogV2UgZG9uJ3Qga25vdyBvdXIgdW5pdCBudW1iZXIgdW50aWwgdGhlIE9TTSBzZXRzIGl0ICovCisJYWhkLT5uYW1lID0gbmFtZTsKKwlhaGQtPnVuaXQgPSAtMTsKKwlhaGQtPmRlc2NyaXB0aW9uID0gTlVMTDsKKwlhaGQtPmJ1c19kZXNjcmlwdGlvbiA9IE5VTEw7CisJYWhkLT5jaGFubmVsID0gJ0EnOworCWFoZC0+Y2hpcCA9IEFIRF9OT05FOworCWFoZC0+ZmVhdHVyZXMgPSBBSERfRkVOT05FOworCWFoZC0+YnVncyA9IEFIRF9CVUdOT05FOworCWFoZC0+ZmxhZ3MgPSBBSERfU1BDSEtfRU5CX0F8QUhEX1JFU0VUX0JVU19BfEFIRF9URVJNX0VOQl9BCisJCSAgIHwgQUhEX0VYVEVOREVEX1RSQU5TX0F8QUhEX1NUUFdMRVZFTF9BOworCWFoZF90aW1lcl9pbml0KCZhaGQtPnJlc2V0X3RpbWVyKTsKKwlhaGRfdGltZXJfaW5pdCgmYWhkLT5zdGF0X3RpbWVyKTsKKwlhaGQtPmludF9jb2FsZXNjaW5nX3RpbWVyID0gQUhEX0lOVF9DT0FMRVNDSU5HX1RJTUVSX0RFRkFVTFQ7CisJYWhkLT5pbnRfY29hbGVzY2luZ19tYXhjbWRzID0gQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfREVGQVVMVDsKKwlhaGQtPmludF9jb2FsZXNjaW5nX21pbmNtZHMgPSBBSERfSU5UX0NPQUxFU0NJTkdfTUlOQ01EU19ERUZBVUxUOworCWFoZC0+aW50X2NvYWxlc2NpbmdfdGhyZXNob2xkID0gQUhEX0lOVF9DT0FMRVNDSU5HX1RIUkVTSE9MRF9ERUZBVUxUOworCWFoZC0+aW50X2NvYWxlc2Npbmdfc3RvcF90aHJlc2hvbGQgPQorCSAgICBBSERfSU5UX0NPQUxFU0NJTkdfU1RPUF9USFJFU0hPTERfREVGQVVMVDsKKworCWlmIChhaGRfcGxhdGZvcm1fYWxsb2MoYWhkLCBwbGF0Zm9ybV9hcmcpICE9IDApIHsKKwkJYWhkX2ZyZWUoYWhkKTsKKwkJYWhkID0gTlVMTDsKKwl9CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpICE9IDApIHsKKwkJcHJpbnRmKCIlczogc2NiIHNpemUgPSAweCV4LCBoc2NiIHNpemUgPSAweCV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgKHVfaW50KXNpemVvZihzdHJ1Y3Qgc2NiKSwKKwkJICAgICAgICh1X2ludClzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikpOworCX0KKyNlbmRpZgorCXJldHVybiAoYWhkKTsKK30KKworaW50CithaGRfc29mdGNfaW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwlhaGQtPnVucGF1c2UgPSAwOworCWFoZC0+cGF1c2UgPSBQQVVTRTsgCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhkX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7CisKKyNpZiBBSERfUENJX0NPTkZJRyA+IDAKKwkvKgorCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQorCSAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KKwkgKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTVVMVElfRlVOQykgIT0gMCkgeworCQlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCQkJYWhkX2Rldl9zb2Z0Y190IGxpc3RfcGNpOworCQkJYWhkX2Rldl9zb2Z0Y190IHBjaTsKKworCQkJbGlzdF9wY2kgPSBsaXN0X2FoZC0+ZGV2X3NvZnRjOworCQkJcGNpID0gYWhkLT5kZXZfc29mdGM7CisJCQlpZiAoYWhkX2dldF9wY2lfc2xvdChsaXN0X3BjaSkgPT0gYWhkX2dldF9wY2lfc2xvdChwY2kpCisJCQkgJiYgYWhkX2dldF9wY2lfYnVzKGxpc3RfcGNpKSA9PSBhaGRfZ2V0X3BjaV9idXMocGNpKSkgeworCQkJCXN0cnVjdCBhaGRfc29mdGMgKm1hc3RlcjsKKwkJCQlzdHJ1Y3QgYWhkX3NvZnRjICpzbGF2ZTsKKworCQkJCWlmIChhaGRfZ2V0X3BjaV9mdW5jdGlvbihsaXN0X3BjaSkgPT0gMCkgeworCQkJCQltYXN0ZXIgPSBsaXN0X2FoZDsKKwkJCQkJc2xhdmUgPSBhaGQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWFzdGVyID0gYWhkOworCQkJCQlzbGF2ZSA9IGxpc3RfYWhkOworCQkJCX0KKwkJCQlzbGF2ZS0+ZmxhZ3MgJj0gfkFIRF9CSU9TX0VOQUJMRUQ7IAorCQkJCXNsYXZlLT5mbGFncyB8PQorCQkJCSAgICBtYXN0ZXItPmZsYWdzICYgQUhEX0JJT1NfRU5BQkxFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyoKKwkgKiBJbnNlcnRpb24gc29ydCBpbnRvIG91ciBsaXN0IG9mIHNvZnRjcy4KKwkgKi8KKwlsaXN0X2FoZCA9IFRBSUxRX0ZJUlNUKCZhaGRfdGFpbHEpOworCXdoaWxlIChsaXN0X2FoZCAhPSBOVUxMCisJICAgICYmIGFoZF9zb2Z0Y19jb21wKGFoZCwgbGlzdF9haGQpIDw9IDApCisJCWxpc3RfYWhkID0gVEFJTFFfTkVYVChsaXN0X2FoZCwgbGlua3MpOworCWlmIChsaXN0X2FoZCAhPSBOVUxMKQorCQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RfYWhkLCBhaGQsIGxpbmtzKTsKKwllbHNlCisJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGRfdGFpbHEsIGFoZCwgbGlua3MpOworCWFoZC0+aW5pdF9sZXZlbCsrOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBpbiBzb2Z0YyBwb2ludGVyIGlzIGZvciBhCisgKiBjb250cm9sbGVyIHRoYXQgaXMgc3RpbGwgY29uZmlndXJlZC4KKyAqLworc3RydWN0IGFoZF9zb2Z0YyAqCithaGRfZmluZF9zb2Z0YyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqbGlzdF9haGQ7CisKKwlUQUlMUV9GT1JFQUNIKGxpc3RfYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCQlpZiAobGlzdF9haGQgPT0gYWhkKQorCQkJcmV0dXJuIChhaGQpOworCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCit2b2lkCithaGRfc2V0X3VuaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgdW5pdCkKK3sKKwlhaGQtPnVuaXQgPSB1bml0OworfQorCit2b2lkCithaGRfc2V0X25hbWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpuYW1lKQoreworCWlmIChhaGQtPm5hbWUgIT0gTlVMTCkKKwkJZnJlZShhaGQtPm5hbWUsIE1fREVWQlVGKTsKKwlhaGQtPm5hbWUgPSBuYW1lOworfQorCit2b2lkCithaGRfZnJlZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKGFoZC0+aW5pdF9sZXZlbCkgeworCWRlZmF1bHQ6CisJY2FzZSA1OgorCQlhaGRfc2h1dGRvd24oYWhkKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIDQ6CisJCWFoZF9kbWFtYXBfdW5sb2FkKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJCSAgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMzoKKwkJYWhkX2RtYW1lbV9mcmVlKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnFvdXRmaWZvLAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwKTsKKwkJYWhkX2RtYW1hcF9kZXN0cm95KGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJCSAgIGFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIDI6CisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQpOworCWNhc2UgMToKKyNpZm5kZWYgX19saW51eF9fCisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBhaGQtPmJ1ZmZlcl9kbWF0KTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIDA6CisJCWJyZWFrOworCX0KKworI2lmbmRlZiBfX2xpbnV4X18KKwlhaGRfZG1hX3RhZ19kZXN0cm95KGFoZCwgYWhkLT5wYXJlbnRfZG1hdCk7CisjZW5kaWYKKwlhaGRfcGxhdGZvcm1fZnJlZShhaGQpOworCWFoZF9maW5pX3NjYmRhdGEoYWhkKTsKKwlmb3IgKGkgPSAwOyBpIDwgQUhEX05VTV9UQVJHRVRTOyBpKyspIHsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQl0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tpXTsKKwkJaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJCQlpbnQgajsKKworCQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fTFVOUzsgaisrKSB7CisJCQkJc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZTsKKworCQkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2pdOworCQkJCWlmIChsc3RhdGUgIT0gTlVMTCkgeworCQkJCQl4cHRfZnJlZV9wYXRoKGxzdGF0ZS0+cGF0aCk7CisJCQkJCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlmcmVlKHRzdGF0ZSwgTV9ERVZCVUYpOworCQl9CisJfQorI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCWlmIChhaGQtPmJsYWNrX2hvbGUgIT0gTlVMTCkgeworCQl4cHRfZnJlZV9wYXRoKGFoZC0+YmxhY2tfaG9sZS0+cGF0aCk7CisJCWZyZWUoYWhkLT5ibGFja19ob2xlLCBNX0RFVkJVRik7CisJfQorI2VuZGlmCisJaWYgKGFoZC0+bmFtZSAhPSBOVUxMKQorCQlmcmVlKGFoZC0+bmFtZSwgTV9ERVZCVUYpOworCWlmIChhaGQtPnNlZXBfY29uZmlnICE9IE5VTEwpCisJCWZyZWUoYWhkLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCWlmIChhaGQtPnNhdmVkX3N0YWNrICE9IE5VTEwpCisJCWZyZWUoYWhkLT5zYXZlZF9zdGFjaywgTV9ERVZCVUYpOworI2lmbmRlZiBfX0ZyZWVCU0RfXworCWZyZWUoYWhkLCBNX0RFVkJVRik7CisjZW5kaWYKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2FoZF9zaHV0ZG93bih2b2lkICphcmcpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKilhcmc7CisKKwkvKgorCSAqIFN0b3AgcGVyaW9kaWMgdGltZXIgY2FsbGJhY2tzLgorCSAqLworCWFoZF90aW1lcl9zdG9wKCZhaGQtPnJlc2V0X3RpbWVyKTsKKwlhaGRfdGltZXJfc3RvcCgmYWhkLT5zdGF0X3RpbWVyKTsKKworCS8qIFRoaXMgd2lsbCByZXNldCBtb3N0IHJlZ2lzdGVycyB0byAwLCBidXQgbm90IGFsbCAqLworCWFoZF9yZXNldChhaGQsIC8qcmVpbml0Ki9GQUxTRSk7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgY29udHJvbGxlciBhbmQgcmVjb3JkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgaXQKKyAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUganVzdCBhZnRlciBhIHJlc2V0LiAgSWYgInJlaW5pdCIgaXMKKyAqIG5vbi16ZXJvLCB0aGlzIHJlc2V0IG9jY3VyZWQgYWZ0ZXIgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgKiBhbmQgdGhlIGNhbGxlciByZXF1ZXN0cyB0aGF0IHRoZSBjaGlwIGJlIGZ1bGx5IHJlaW5pdGlhbGl6ZWQKKyAqIHRvIGEgcnVuYWJsZSBzdGF0ZS4gIENoaXAgaW50ZXJydXB0cyBhcmUgKm5vdCogZW5hYmxlZCBhZnRlcgorICogYSByZWluaXRpYWxpemF0aW9uLiAgVGhlIGNhbGxlciBtdXN0IGVuYWJsZSBpbnRlcnJ1cHRzIHZpYQorICogYWhkX2ludHJfZW5hYmxlKCkuCisgKi8KK2ludAorYWhkX3Jlc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHJlaW5pdCkKK3sKKwl1X2ludAkgc3hmcmN0bDE7CisJaW50CSB3YWl0OworCXVpbnQzMl90IGNtZDsKKwkKKwkvKgorCSAqIFByZXNlcnZlIHRoZSB2YWx1ZSBvZiB0aGUgU1hGUkNUTDEgcmVnaXN0ZXIgZm9yIGFsbCBjaGFubmVscy4KKwkgKiBJdCBjb250YWlucyBzZXR0aW5ncyB0aGF0IGFmZmVjdCB0ZXJtaW5hdGlvbiBhbmQgd2UgZG9uJ3Qgd2FudAorCSAqIHRvIGRpc3R1cmIgdGhlIGludGVncml0eSBvZiB0aGUgYnVzLgorCSAqLworCWFoZF9wYXVzZShhaGQpOworCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJc3hmcmN0bDEgPSBhaGRfaW5iKGFoZCwgU1hGUkNUTDEpOworCisJY21kID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCAvKmJ5dGVzKi8yKTsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQ0lYX0NISVBSU1RfQlVHKSAhPSAwKSB7CisJCXVpbnQzMl90IG1vZF9jbWQ7CisKKwkJLyoKKwkJICogQTQgUmF6b3IgIzYzMgorCQkgKiBEdXJpbmcgdGhlIGFzc2VydGlvbiBvZiBDSElQUlNULCB0aGUgY2hpcAorCQkgKiBkb2VzIG5vdCBkaXNhYmxlIGl0cyBwYXJpdHkgbG9naWMgcHJpb3IgdG8KKwkJICogdGhlIHN0YXJ0IG9mIHRoZSByZXNldC4gIFRoaXMgbWF5IGNhdXNlIGEKKwkJICogcGFyaXR5IGVycm9yIHRvIGJlIGRldGVjdGVkIGFuZCB0aHVzIGEKKwkJICogc3B1cmlvdXMgU0VSUiBvciBQRVJSIGFzc2VydGlvbi4gIERpc2JsZQorCQkgKiBQRVJSIGFuZCBTRVJSIHJlc3BvbnNlcyBkdXJpbmcgdGhlIENISVBSU1QuCisJCSAqLworCQltb2RfY21kID0gY21kICYgfihQQ0lNX0NNRF9QRVJSRVNQRU58UENJTV9DTURfU0VSUkVTUEVOKTsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwKKwkJCQkgICAgIG1vZF9jbWQsIC8qYnl0ZXMqLzIpOworCX0KKwlhaGRfb3V0YihhaGQsIEhDTlRSTCwgQ0hJUFJTVCB8IGFoZC0+cGF1c2UpOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgcmVzZXQgaGFzIGZpbmlzaGVkLiAgV2UgZGVsYXkgMTAwMHVzCisJICogcHJpb3IgdG8gcmVhZGluZyB0aGUgcmVnaXN0ZXIgdG8gbWFrZSBzdXJlIHRoZSBjaGlwCisJICogaGFzIHN1ZmZpY2llbnRseSBjb21wbGV0ZWQgaXRzIHJlc2V0IHRvIGhhbmRsZSByZWdpc3RlcgorCSAqIGFjY2Vzc2VzLgorCSAqLworCXdhaXQgPSAxMDAwOworCWRvIHsKKwkJYWhkX2RlbGF5KDEwMDApOworCX0gd2hpbGUgKC0td2FpdCAmJiAhKGFoZF9pbmIoYWhkLCBIQ05UUkwpICYgQ0hJUFJTVEFDSykpOworCisJaWYgKHdhaXQgPT0gMCkgeworCQlwcmludGYoIiVzOiBXQVJOSU5HIC0gRmFpbGVkIGNoaXAgcmVzZXQhICAiCisJCSAgICAgICAiVHJ5aW5nIHRvIGluaXRpYWxpemUgYW55d2F5LlxuIiwgYWhkX25hbWUoYWhkKSk7CisJfQorCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBhaGQtPnBhdXNlKTsKKworCWlmICgoYWhkLT5idWdzICYgQUhEX1BDSVhfQ0hJUFJTVF9CVUcpICE9IDApIHsKKwkJLyoKKwkJICogQ2xlYXIgYW55IGxhdGNoZWQgUENJIGVycm9yIHN0YXR1cyBhbmQgcmVzdG9yZQorCQkgKiBwcmV2aW91cyBTRVJSIGFuZCBQRVJSIHJlc3BvbnNlIGVuYWJsZXMuCisJCSAqLworCQlhaGRfcGNpX3dyaXRlX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJUl9TVEFUVVMgKyAxLAorCQkJCSAgICAgMHhGRiwgLypieXRlcyovMSk7CisJCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsCisJCQkJICAgICBjbWQsIC8qYnl0ZXMqLzIpOworCX0KKworCS8qCisJICogTW9kZSBzaG91bGQgYmUgU0NTSSBhZnRlciBhIGNoaXAgcmVzZXQsIGJ1dCBsZXRzCisJICogc2V0IGl0IGp1c3QgdG8gYmUgc2FmZS4gIFdlIHRvdWNoIHRoZSBNT0RFX1BUUgorCSAqIHJlZ2lzdGVyIGRpcmVjdGx5IHNvIGFzIHRvIGJ5cGFzcyB0aGUgbGF6eSB1cGRhdGUKKwkgKiBjb2RlIGluIGFoZF9zZXRfbW9kZXMoKS4KKwkgKi8KKwlhaGRfa25vd25fbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIE1PREVfUFRSLAorCQkgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKSk7CisKKwkvKgorCSAqIFJlc3RvcmUgU1hGUkNUTDEuCisJICoKKwkgKiBXZSBtdXN0IGFsd2F5cyBpbml0aWFsaXplIFNUUFdFTiB0byAxIGJlZm9yZSB3ZQorCSAqIHJlc3RvcmUgdGhlIHNhdmVkIHZhbHVlcy4gIFNUUFdFTiBpcyBpbml0aWFsaXplZAorCSAqIHRvIGEgdHJpLXN0YXRlIGNvbmRpdGlvbiB3aGljaCBjYW4gb25seSBiZSBjbGVhcmVkCisJICogYnkgdHVybmluZyBpdCBvbi4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIFNYRlJDVEwxLCBzeGZyY3RsMXxTVFBXRU4pOworCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDEsIHN4ZnJjdGwxKTsKKworCS8qIERldGVybWluZSBjaGlwIGNvbmZpZ3VyYXRpb24gKi8KKwlhaGQtPmZlYXR1cmVzICY9IH5BSERfV0lERTsKKwlpZiAoKGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIFNFTFdJREUpICE9IDApCisJCWFoZC0+ZmVhdHVyZXMgfD0gQUhEX1dJREU7CisKKwkvKgorCSAqIElmIGEgcmVjb3ZlcnkgYWN0aW9uIGhhcyBmb3JjZWQgYSBjaGlwIHJlc2V0LAorCSAqIHJlLWluaXRpYWxpemUgdGhlIGNoaXAgdG8gb3VyIGxpa2luZy4KKwkgKi8KKwlpZiAocmVpbml0ICE9IDApCisJCWFoZF9jaGlwX2luaXQoYWhkKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBTQ0JzIGF2YWlsYWJsZSBvbiB0aGUgY29udHJvbGxlcgorICovCitpbnQKK2FoZF9wcm9iZV9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkgeworCWludCBpOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJZm9yIChpID0gMDsgaSA8IEFIRF9TQ0JfTUFYOyBpKyspIHsKKwkJaW50IGo7CisKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBpKTsKKwkJYWhkX291dHcoYWhkLCBTQ0JfQkFTRSwgaSk7CisJCWZvciAoaiA9IDI7IGogPCA2NDsgaisrKQorCQkJYWhkX291dGIoYWhkLCBTQ0JfQkFTRStqLCAwKTsKKwkJLyogU3RhcnQgb3V0IGxpZmUgYXMgdW5hbGxvY2F0ZWQgKG5lZWRpbmcgYW4gYWJvcnQpICovCisJCWFoZF9vdXRiKGFoZCwgU0NCX0NPTlRST0wsIE1LX01FU1NBR0UpOworCQlpZiAoYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfQkFTRSkgIT0gaSkKKwkJCWJyZWFrOworCQlhaGRfc2V0X3NjYnB0cihhaGQsIDApOworCQlpZiAoYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfQkFTRSkgIT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gKGkpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2RtYW1hcF9jYih2b2lkICphcmcsIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgbnNlZywgaW50IGVycm9yKSAKK3sKKwlkbWFfYWRkcl90ICpiYWRkcjsKKworCWJhZGRyID0gKGRtYV9hZGRyX3QgKilhcmc7CisJKmJhZGRyID0gc2Vncy0+ZHNfYWRkcjsKK30KKworc3RhdGljIHZvaWQKK2FoZF9pbml0aWFsaXplX2hzY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhaGQtPnNjYl9kYXRhLm1heGhzY2JzOyBpKyspIHsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBpKTsKKworCQkvKiBDbGVhciB0aGUgY29udHJvbCBieXRlLiAqLworCQlhaGRfb3V0YihhaGQsIFNDQl9DT05UUk9MLCAwKTsKKworCQkvKiBTZXQgdGhlIG5leHQgcG9pbnRlciAqLworCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhULCBTQ0JfTElTVF9OVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9pbml0X3NjYmRhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdAlzY2JfZGF0YSAqc2NiX2RhdGE7CisJaW50CWk7CisKKwlzY2JfZGF0YSA9ICZhaGQtPnNjYl9kYXRhOworCVRBSUxRX0lOSVQoJnNjYl9kYXRhLT5mcmVlX3NjYnMpOworCWZvciAoaSA9IDA7IGkgPCBBSERfTlVNX1RBUkdFVFMgKiBBSERfTlVNX0xVTlNfTk9OUEtUOyBpKyspCisJCUxJU1RfSU5JVCgmc2NiX2RhdGEtPmZyZWVfc2NiX2xpc3RzW2ldKTsKKwlMSVNUX0lOSVQoJnNjYl9kYXRhLT5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QpOworCVNMSVNUX0lOSVQoJnNjYl9kYXRhLT5oc2NiX21hcHMpOworCVNMSVNUX0lOSVQoJnNjYl9kYXRhLT5zZ19tYXBzKTsKKwlTTElTVF9JTklUKCZzY2JfZGF0YS0+c2Vuc2VfbWFwcyk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBoYXJkd2FyZSBTQ0JzIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KKwlzY2JfZGF0YS0+bWF4aHNjYnMgPSBhaGRfcHJvYmVfc2NicyhhaGQpOworCWlmIChzY2JfZGF0YS0+bWF4aHNjYnMgPT0gMCkgeworCQlwcmludGYoIiVzOiBObyBTQ0Igc3BhY2UgZm91bmRcbiIsIGFoZF9uYW1lKGFoZCkpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwlhaGRfaW5pdGlhbGl6ZV9oc2NicyhhaGQpOworCisJLyoKKwkgKiBDcmVhdGUgb3VyIERNQSB0YWdzLiAgVGhlc2UgdGFncyBkZWZpbmUgdGhlIGtpbmRzIG9mIGRldmljZQorCSAqIGFjY2Vzc2libGUgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBtZW1vcnkgbWFwcGluZ3Mgd2Ugd2lsbAorCSAqIG5lZWQgdG8gcGVyZm9ybSBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbi4KKwkgKgorCSAqIFVubGVzcyB3ZSBuZWVkIHRvIGZ1cnRoZXIgcmVzdHJpY3QgdGhlIGFsbG9jYXRpb24sIHdlIHJlbHkKKwkgKiBvbiB0aGUgcmVzdHJpY3Rpb25zIG9mIHRoZSBwYXJlbnQgZG1hdCwgaGVuY2UgdGhlIGNvbW1vbgorCSAqIHVzZSBvZiBNQVhBRERSIGFuZCBNQVhTSVpFLgorCSAqLworCisJLyogRE1BIHRhZyBmb3Igb3VyIGhhcmR3YXJlIHNjYiBzdHJ1Y3R1cmVzICovCisJaWYgKGFoZF9kbWFfdGFnX2NyZWF0ZShhaGQsIGFoZC0+cGFyZW50X2RtYXQsIC8qYWxpZ25tZW50Ki8xLAorCQkJICAgICAgIC8qYm91bmRhcnkqL0JVU19TUEFDRV9NQVhBRERSXzMyQklUICsgMSwKKwkJCSAgICAgICAvKmxvd2FkZHIqL0JVU19TUEFDRV9NQVhBRERSXzMyQklULAorCQkJICAgICAgIC8qaGlnaGFkZHIqL0JVU19TUEFDRV9NQVhBRERSLAorCQkJICAgICAgIC8qZmlsdGVyKi9OVUxMLCAvKmZpbHRlcmFyZyovTlVMTCwKKwkJCSAgICAgICBQQUdFX1NJWkUsIC8qbnNlZ21lbnRzKi8xLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0JVU19TUEFDRV9NQVhTSVpFXzMyQklULAorCQkJICAgICAgIC8qZmxhZ3MqLzAsICZzY2JfZGF0YS0+aHNjYl9kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogRE1BIHRhZyBmb3Igb3VyIFMvRyBzdHJ1Y3R1cmVzLiAqLworCWlmIChhaGRfZG1hX3RhZ19jcmVhdGUoYWhkLCBhaGQtPnBhcmVudF9kbWF0LCAvKmFsaWdubWVudCovOCwKKwkJCSAgICAgICAvKmJvdW5kYXJ5Ki9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCArIDEsCisJCQkgICAgICAgLypsb3dhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwKKwkJCSAgICAgICAvKmhpZ2hhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUiwKKwkJCSAgICAgICAvKmZpbHRlciovTlVMTCwgLypmaWx0ZXJhcmcqL05VTEwsCisJCQkgICAgICAgYWhkX3NnbGlzdF9hbGxvY3NpemUoYWhkKSwgLypuc2VnbWVudHMqLzEsCisJCQkgICAgICAgLyptYXhzZWdzeiovQlVTX1NQQUNFX01BWFNJWkVfMzJCSVQsCisJCQkgICAgICAgLypmbGFncyovMCwgJnNjYl9kYXRhLT5zZ19kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpICE9IDApCisJCXByaW50ZigiJXM6IGFoZF9zZ2xpc3RfYWxsb2NzaXplID0gMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIGFoZF9zZ2xpc3RfYWxsb2NzaXplKGFoZCkpOworI2VuZGlmCisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogRE1BIHRhZyBmb3Igb3VyIHNlbnNlIGJ1ZmZlcnMuICBXZSBhbGxvY2F0ZSBpbiBwYWdlIHNpemVkIGNodW5rcyAqLworCWlmIChhaGRfZG1hX3RhZ19jcmVhdGUoYWhkLCBhaGQtPnBhcmVudF9kbWF0LCAvKmFsaWdubWVudCovMSwKKwkJCSAgICAgICAvKmJvdW5kYXJ5Ki9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCArIDEsCisJCQkgICAgICAgLypsb3dhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwKKwkJCSAgICAgICAvKmhpZ2hhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUiwKKwkJCSAgICAgICAvKmZpbHRlciovTlVMTCwgLypmaWx0ZXJhcmcqL05VTEwsCisJCQkgICAgICAgUEFHRV9TSVpFLCAvKm5zZWdtZW50cyovMSwKKwkJCSAgICAgICAvKm1heHNlZ3N6Ki9CVVNfU1BBQ0VfTUFYU0laRV8zMkJJVCwKKwkJCSAgICAgICAvKmZsYWdzKi8wLCAmc2NiX2RhdGEtPnNlbnNlX2RtYXQpICE9IDApIHsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCXNjYl9kYXRhLT5pbml0X2xldmVsKys7CisKKwkvKiBQZXJmb3JtIGluaXRpYWwgQ0NCIGFsbG9jYXRpb24gKi8KKwlhaGRfYWxsb2Nfc2NicyhhaGQpOworCisJaWYgKHNjYl9kYXRhLT5udW1zY2JzID09IDApIHsKKwkJcHJpbnRmKCIlczogYWhkX2luaXRfc2NiZGF0YSAtICIKKwkJICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgaW5pdGlhbCBzY2JzXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSB3ZXJlIHN1Y2Nlc3NmdWxsCisJICovCisJcmV0dXJuICgwKTsgCisKK2Vycm9yX2V4aXQ6CisKKwlyZXR1cm4gKEVOT01FTSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NiICoKK2FoZF9maW5kX3NjYl9ieV90YWcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YWcpCit7CisJc3RydWN0IHNjYiAqc2NiOworCisJLyoKKwkgKiBMb29rIG9uIHRoZSBwZW5kaW5nIGxpc3QuCisJICovCisJTElTVF9GT1JFQUNIKHNjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CisJCWlmIChTQ0JfR0VUX1RBRyhzY2IpID09IHRhZykKKwkJCXJldHVybiAoc2NiKTsKKwl9CisKKwkvKgorCSAqIFRoZW4gb24gYWxsIG9mIHRoZSBjb2xsaXNpb24gZnJlZSBsaXN0cy4KKwkgKi8KKwlUQUlMUV9GT1JFQUNIKHNjYiwgJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzLCBsaW5rcy50cWUpIHsKKwkJc3RydWN0IHNjYiAqbGlzdF9zY2I7CisKKwkJbGlzdF9zY2IgPSBzY2I7CisJCWRvIHsKKwkJCWlmIChTQ0JfR0VUX1RBRyhsaXN0X3NjYikgPT0gdGFnKQorCQkJCXJldHVybiAobGlzdF9zY2IpOworCQkJbGlzdF9zY2IgPSBMSVNUX05FWFQobGlzdF9zY2IsIGNvbGxpc2lvbl9saW5rcyk7CisJCX0gd2hpbGUgKGxpc3Rfc2NiKTsKKwl9CisKKwkvKgorCSAqIEFuZCBmaW5hbGx5IG9uIHRoZSBnZW5lcmljIGZyZWUgbGlzdC4KKwkgKi8KKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsIGxpbmtzLmxlKSB7CisJCWlmIChTQ0JfR0VUX1RBRyhzY2IpID09IHRhZykKKwkJCXJldHVybiAoc2NiKTsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2Zpbmlfc2NiZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IHNjYl9kYXRhICpzY2JfZGF0YTsKKworCXNjYl9kYXRhID0gJmFoZC0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc2NiX2RhdGEtPmluaXRfbGV2ZWwpIHsKKwlkZWZhdWx0OgorCWNhc2UgNzoKKwl7CisJCXN0cnVjdCBtYXBfbm9kZSAqc25zX21hcDsKKworCQl3aGlsZSAoKHNuc19tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPnNlbnNlX21hcHMpKSAhPSBOVUxMKSB7CisJCQlTTElTVF9SRU1PVkVfSEVBRCgmc2NiX2RhdGEtPnNlbnNlX21hcHMsIGxpbmtzKTsKKwkJCWFoZF9kbWFtYXBfdW5sb2FkKGFoZCwgc2NiX2RhdGEtPnNlbnNlX2RtYXQsCisJCQkJCSAgc25zX21hcC0+ZG1hbWFwKTsKKwkJCWFoZF9kbWFtZW1fZnJlZShhaGQsIHNjYl9kYXRhLT5zZW5zZV9kbWF0LAorCQkJCQlzbnNfbWFwLT52YWRkciwgc25zX21hcC0+ZG1hbWFwKTsKKwkJCWZyZWUoc25zX21hcCwgTV9ERVZCVUYpOworCQl9CisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgNjoKKwl7CisJCXN0cnVjdCBtYXBfbm9kZSAqc2dfbWFwOworCisJCXdoaWxlICgoc2dfbWFwID0gU0xJU1RfRklSU1QoJnNjYl9kYXRhLT5zZ19tYXBzKSkgIT0gTlVMTCkgeworCQkJU0xJU1RfUkVNT1ZFX0hFQUQoJnNjYl9kYXRhLT5zZ19tYXBzLCBsaW5rcyk7CisJCQlhaGRfZG1hbWFwX3VubG9hZChhaGQsIHNjYl9kYXRhLT5zZ19kbWF0LAorCQkJCQkgIHNnX21hcC0+ZG1hbWFwKTsKKwkJCWFoZF9kbWFtZW1fZnJlZShhaGQsIHNjYl9kYXRhLT5zZ19kbWF0LAorCQkJCQlzZ19tYXAtPnZhZGRyLCBzZ19tYXAtPmRtYW1hcCk7CisJCQlmcmVlKHNnX21hcCwgTV9ERVZCVUYpOworCQl9CisJCWFoZF9kbWFfdGFnX2Rlc3Ryb3koYWhkLCBzY2JfZGF0YS0+c2dfZG1hdCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgNToKKwl7CisJCXN0cnVjdCBtYXBfbm9kZSAqaHNjYl9tYXA7CisKKwkJd2hpbGUgKChoc2NiX21hcCA9IFNMSVNUX0ZJUlNUKCZzY2JfZGF0YS0+aHNjYl9tYXBzKSkgIT0gTlVMTCkgeworCQkJU0xJU1RfUkVNT1ZFX0hFQUQoJnNjYl9kYXRhLT5oc2NiX21hcHMsIGxpbmtzKTsKKwkJCWFoZF9kbWFtYXBfdW5sb2FkKGFoZCwgc2NiX2RhdGEtPmhzY2JfZG1hdCwKKwkJCQkJICBoc2NiX21hcC0+ZG1hbWFwKTsKKwkJCWFoZF9kbWFtZW1fZnJlZShhaGQsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJCWhzY2JfbWFwLT52YWRkciwgaHNjYl9tYXAtPmRtYW1hcCk7CisJCQlmcmVlKGhzY2JfbWFwLCBNX0RFVkJVRik7CisJCX0KKwkJYWhkX2RtYV90YWdfZGVzdHJveShhaGQsIHNjYl9kYXRhLT5oc2NiX2RtYXQpOworCQkvKiBGQUxMVEhST1VHSCAqLworCX0KKwljYXNlIDQ6CisJY2FzZSAzOgorCWNhc2UgMjoKKwljYXNlIDE6CisJY2FzZSAwOgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBEU1AgZmlsdGVyIEJ5cGFzcyBtdXN0IGJlIGVuYWJsZWQgdW50aWwgdGhlIGZpcnN0IHNlbGVjdGlvbgorICogYWZ0ZXIgYSBjaGFuZ2UgaW4gYnVzIG1vZGUgKFJhem9yICM0OTEgYW5kICM0OTMpLgorICovCitzdGF0aWMgdm9pZAorYWhkX3NldHVwX2lvY2VsbF93b3JrYXJvdW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCWFoZF9vdXRiKGFoZCwgRFNQREFUQUNUTCwgYWhkX2luYihhaGQsIERTUERBVEFDVEwpCisJICAgICAgIHwgQllQQVNTRU5BQiB8IFJDVlJPRkZTVERJUyB8IFhNSVRPRkZTVERJUyk7CisJYWhkX291dGIoYWhkLCBTSU1PREUwLCBhaGRfaW5iKGFoZCwgU0lNT0RFMCkgfCAoRU5TRUxET3xFTlNFTERJKSk7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQlwcmludGYoIiVzOiBTZXR0aW5nIHVwIGlvY2VsbCB3b3JrYXJvdW5kXG4iLCBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9IQURfRklSU1RfU0VMOworfQorCitzdGF0aWMgdm9pZAorYWhkX2lvY2VsbF9maXJzdF9zZWxlY3Rpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWFoZF9tb2RlX3N0YXRlCXNhdmVkX21vZGVzOworCXVfaW50CQlzYmxrY3RsOworCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX0hBRF9GSVJTVF9TRUwpICE9IDApCisJCXJldHVybjsKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCXNibGtjdGwgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApCisJCXByaW50ZigiJXM6IGlvY2VsbCBmaXJzdCBzZWxlY3Rpb25cbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCisJaWYgKChzYmxrY3RsICYgRU5BQjQwKSAhPSAwKSB7CisJCWFoZF9vdXRiKGFoZCwgRFNQREFUQUNUTCwKKwkJCSBhaGRfaW5iKGFoZCwgRFNQREFUQUNUTCkgJiB+QllQQVNTRU5BQik7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkKKwkJCXByaW50ZigiJXM6IEJZUEFTUyBub3cgZGlzYWJsZWRcbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCisJfQorCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgYWhkX2luYihhaGQsIFNJTU9ERTApICYgfihFTlNFTERPfEVOU0VMREkpKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7CisJYWhkLT5mbGFncyB8PSBBSERfSEFEX0ZJUlNUX1NFTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQ0IgTWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaGRfYWRkX2NvbF9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLCB1X2ludCBjb2xfaWR4KQoreworCXN0cnVjdAlzY2JfbGlzdCAqZnJlZV9saXN0OworCXN0cnVjdAlzY2JfdGFpbHEgKmZyZWVfdGFpbHE7CisJc3RydWN0CXNjYiAqZmlyc3Rfc2NiOworCisJc2NiLT5mbGFncyB8PSBTQ0JfT05fQ09MX0xJU1Q7CisJQUhEX1NFVF9TQ0JfQ09MX0lEWChzY2IsIGNvbF9pZHgpOworCWZyZWVfbGlzdCA9ICZhaGQtPnNjYl9kYXRhLmZyZWVfc2NiX2xpc3RzW2NvbF9pZHhdOworCWZyZWVfdGFpbHEgPSAmYWhkLT5zY2JfZGF0YS5mcmVlX3NjYnM7CisJZmlyc3Rfc2NiID0gTElTVF9GSVJTVChmcmVlX2xpc3QpOworCWlmIChmaXJzdF9zY2IgIT0gTlVMTCkgeworCQlMSVNUX0lOU0VSVF9BRlRFUihmaXJzdF9zY2IsIHNjYiwgY29sbGlzaW9uX2xpbmtzKTsKKwl9IGVsc2UgeworCQlMSVNUX0lOU0VSVF9IRUFEKGZyZWVfbGlzdCwgc2NiLCBjb2xsaXNpb25fbGlua3MpOworCQlUQUlMUV9JTlNFUlRfVEFJTChmcmVlX3RhaWxxLCBzY2IsIGxpbmtzLnRxZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX3JlbV9jb2xfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3QJc2NiX2xpc3QgKmZyZWVfbGlzdDsKKwlzdHJ1Y3QJc2NiX3RhaWxxICpmcmVlX3RhaWxxOworCXN0cnVjdAlzY2IgKmZpcnN0X3NjYjsKKwl1X2ludAljb2xfaWR4OworCisJc2NiLT5mbGFncyAmPSB+U0NCX09OX0NPTF9MSVNUOworCWNvbF9pZHggPSBBSERfR0VUX1NDQl9DT0xfSURYKGFoZCwgc2NiKTsKKwlmcmVlX2xpc3QgPSAmYWhkLT5zY2JfZGF0YS5mcmVlX3NjYl9saXN0c1tjb2xfaWR4XTsKKwlmcmVlX3RhaWxxID0gJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzOworCWZpcnN0X3NjYiA9IExJU1RfRklSU1QoZnJlZV9saXN0KTsKKwlpZiAoZmlyc3Rfc2NiID09IHNjYikgeworCQlzdHJ1Y3Qgc2NiICpuZXh0X3NjYjsKKworCQkvKgorCQkgKiBNYWludGFpbiBvcmRlciBpbiB0aGUgY29sbGlzaW9uIGZyZWUKKwkJICogbGlzdHMgZm9yIGZhaXJuZXNzIGlmIHRoaXMgZGV2aWNlIGhhcworCQkgKiBvdGhlciBjb2xsaWRpbmcgdGFncyBhY3RpdmUuCisJCSAqLworCQluZXh0X3NjYiA9IExJU1RfTkVYVChzY2IsIGNvbGxpc2lvbl9saW5rcyk7CisJCWlmIChuZXh0X3NjYiAhPSBOVUxMKSB7CisJCQlUQUlMUV9JTlNFUlRfQUZURVIoZnJlZV90YWlscSwgc2NiLAorCQkJCQkgICBuZXh0X3NjYiwgbGlua3MudHFlKTsKKwkJfQorCQlUQUlMUV9SRU1PVkUoZnJlZV90YWlscSwgc2NiLCBsaW5rcy50cWUpOworCX0KKwlMSVNUX1JFTU9WRShzY2IsIGNvbGxpc2lvbl9saW5rcyk7Cit9CisKKy8qCisgKiBHZXQgYSBmcmVlIHNjYi4gSWYgdGhlcmUgYXJlIG5vbmUsIHNlZSBpZiB3ZSBjYW4gYWxsb2NhdGUgYSBuZXcgU0NCLgorICovCitzdHJ1Y3Qgc2NiICoKK2FoZF9nZXRfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY29sX2lkeCkKK3sKKwlzdHJ1Y3Qgc2NiICpzY2I7CisJaW50IHRyaWVzOworCisJdHJpZXMgPSAwOworbG9va19hZ2FpbjoKKwlUQUlMUV9GT1JFQUNIKHNjYiwgJmFoZC0+c2NiX2RhdGEuZnJlZV9zY2JzLCBsaW5rcy50cWUpIHsKKwkJaWYgKEFIRF9HRVRfU0NCX0NPTF9JRFgoYWhkLCBzY2IpICE9IGNvbF9pZHgpIHsKKwkJCWFoZF9yZW1fY29sX2xpc3QoYWhkLCBzY2IpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlpZiAoKHNjYiA9IExJU1RfRklSU1QoJmFoZC0+c2NiX2RhdGEuYW55X2Rldl9mcmVlX3NjYl9saXN0KSkgPT0gTlVMTCkgeworCisJCWlmICh0cmllcysrICE9IDApCisJCQlyZXR1cm4gKE5VTEwpOworCQlhaGRfYWxsb2Nfc2NicyhhaGQpOworCQlnb3RvIGxvb2tfYWdhaW47CisJfQorCUxJU1RfUkVNT1ZFKHNjYiwgbGlua3MubGUpOworCWlmIChjb2xfaWR4ICE9IEFIRF9ORVZFUl9DT0xfSURYCisJICYmIChzY2ItPmNvbF9zY2IgIT0gTlVMTCkKKwkgJiYgKHNjYi0+Y29sX3NjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKSB7CisJCUxJU1RfUkVNT1ZFKHNjYi0+Y29sX3NjYiwgbGlua3MubGUpOworCQlhaGRfYWRkX2NvbF9saXN0KGFoZCwgc2NiLT5jb2xfc2NiLCBjb2xfaWR4KTsKKwl9Citmb3VuZDoKKwlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7CisJcmV0dXJuIChzY2IpOworfQorCisvKgorICogUmV0dXJuIGFuIFNDQiByZXNvdXJjZSB0byB0aGUgZnJlZSBsaXN0LgorICovCit2b2lkCithaGRfZnJlZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7ICAgICAgIAorCisJLyogQ2xlYW4gdXAgZm9yIHRoZSBuZXh0IHVzZXIgKi8KKwlzY2ItPmZsYWdzID0gU0NCX0ZMQUdfTk9ORTsKKwlzY2ItPmhzY2ItPmNvbnRyb2wgPSAwOworCWFoZC0+c2NiX2RhdGEuc2NiaW5kZXhbU0NCX0dFVF9UQUcoc2NiKV0gPSBOVUxMOworCisJaWYgKHNjYi0+Y29sX3NjYiA9PSBOVUxMKSB7CisKKwkJLyoKKwkJICogTm8gY29sbGlzaW9uIHBvc3NpYmxlLiAgSnVzdCBmcmVlIG5vcm1hbGx5LgorCQkgKi8KKwkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsCisJCQkJIHNjYiwgbGlua3MubGUpOworCX0gZWxzZSBpZiAoKHNjYi0+Y29sX3NjYi0+ZmxhZ3MgJiBTQ0JfT05fQ09MX0xJU1QpICE9IDApIHsKKworCQkvKgorCQkgKiBUaGUgU0NCIHdlIG1pZ2h0IGhhdmUgY29sbGlkZWQgd2l0aCBpcyBvbgorCQkgKiBhIGZyZWUgY29sbGlzaW9uIGxpc3QuICBQdXQgYm90aCBTQ0JzIG9uCisJCSAqIHRoZSBnZW5lcmljIGxpc3QuCisJCSAqLworCQlhaGRfcmVtX2NvbF9saXN0KGFoZCwgc2NiLT5jb2xfc2NiKTsKKwkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsCisJCQkJIHNjYiwgbGlua3MubGUpOworCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnNjYl9kYXRhLmFueV9kZXZfZnJlZV9zY2JfbGlzdCwKKwkJCQkgc2NiLT5jb2xfc2NiLCBsaW5rcy5sZSk7CisJfSBlbHNlIGlmICgoc2NiLT5jb2xfc2NiLT5mbGFncworCQkgICYgKFNDQl9QQUNLRVRJWkVEfFNDQl9BQ1RJVkUpKSA9PSBTQ0JfQUNUSVZFCisJCSYmIChzY2ItPmNvbF9zY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKSB7CisKKwkJLyoKKwkJICogVGhlIFNDQiB3ZSBtaWdodCBjb2xsaWRlIHdpdGggb24gdGhlIG5leHQgYWxsb2NhdGlvbgorCQkgKiBpcyBzdGlsbCBhY3RpdmUgaW4gYSBub24tcGFja2V0aXplZCwgdGFnZ2VkLCBjb250ZXh0LgorCQkgKiBQdXQgdXMgb24gdGhlIFNDQiBjb2xsaXNpb24gbGlzdC4KKwkJICovCisJCWFoZF9hZGRfY29sX2xpc3QoYWhkLCBzY2IsCisJCQkJIEFIRF9HRVRfU0NCX0NPTF9JRFgoYWhkLCBzY2ItPmNvbF9zY2IpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgU0NCIHdlIG1pZ2h0IGNvbGxpZGUgd2l0aCBvbiB0aGUgbmV4dCBhbGxvY2F0aW9uCisJCSAqIGlzIGVpdGhlciBhY3RpdmUgaW4gYSBwYWNrZXRpemVkIGNvbnRleHQsIG9yIGZyZWUuCisJCSAqIFNpbmNlIHdlIGNhbid0IGNvbGxpZGUsIHB1dCB0aGlzIFNDQiBvbiB0aGUgZ2VuZXJpYworCQkgKiBmcmVlIGxpc3QuCisJCSAqLworCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnNjYl9kYXRhLmFueV9kZXZfZnJlZV9zY2JfbGlzdCwKKwkJCQkgc2NiLCBsaW5rcy5sZSk7CisJfQorCisJYWhkX3BsYXRmb3JtX3NjYl9mcmVlKGFoZCwgc2NiKTsKK30KKwordm9pZAorYWhkX2FsbG9jX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CisJc3RydWN0IHNjYgkqbmV4dF9zY2I7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqaHNjYjsKKwlzdHJ1Y3QgbWFwX25vZGUgKmhzY2JfbWFwOworCXN0cnVjdCBtYXBfbm9kZSAqc2dfbWFwOworCXN0cnVjdCBtYXBfbm9kZSAqc2Vuc2VfbWFwOworCXVpbnQ4X3QJCSpzZWdzOworCXVpbnQ4X3QJCSpzZW5zZV9kYXRhOworCWRtYV9hZGRyX3QJIGhzY2JfYnVzYWRkcjsKKwlkbWFfYWRkcl90CSBzZ19idXNhZGRyOworCWRtYV9hZGRyX3QJIHNlbnNlX2J1c2FkZHI7CisJaW50CQkgbmV3Y291bnQ7CisJaW50CQkgaTsKKworCXNjYl9kYXRhID0gJmFoZC0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhLT5udW1zY2JzID49IEFIRF9TQ0JfTUFYX0FMTE9DKQorCQkvKiBDYW4ndCBhbGxvY2F0ZSBhbnkgbW9yZSAqLworCQlyZXR1cm47CisKKwlpZiAoc2NiX2RhdGEtPnNjYnNfbGVmdCAhPSAwKSB7CisJCWludCBvZmZzZXQ7CisKKwkJb2Zmc2V0ID0gKFBBR0VfU0laRSAvIHNpemVvZigqaHNjYikpIC0gc2NiX2RhdGEtPnNjYnNfbGVmdDsKKwkJaHNjYl9tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPmhzY2JfbWFwcyk7CisJCWhzY2IgPSAmKChzdHJ1Y3QgaGFyZHdhcmVfc2NiICopaHNjYl9tYXAtPnZhZGRyKVtvZmZzZXRdOworCQloc2NiX2J1c2FkZHIgPSBoc2NiX21hcC0+cGh5c2FkZHIgKyAob2Zmc2V0ICogc2l6ZW9mKCpoc2NiKSk7CisJfSBlbHNlIHsKKwkJaHNjYl9tYXAgPSBtYWxsb2Moc2l6ZW9mKCpoc2NiX21hcCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisKKwkJaWYgKGhzY2JfbWFwID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmF0Y2ggb2YgaGFyZHdhcmUgU0NCcyAqLworCQlpZiAoYWhkX2RtYW1lbV9hbGxvYyhhaGQsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJICAgICAodm9pZCAqKikmaHNjYl9tYXAtPnZhZGRyLAorCQkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZoc2NiX21hcC0+ZG1hbWFwKSAhPSAwKSB7CisJCQlmcmVlKGhzY2JfbWFwLCBNX0RFVkJVRik7CisJCQlyZXR1cm47CisJCX0KKworCQlTTElTVF9JTlNFUlRfSEVBRCgmc2NiX2RhdGEtPmhzY2JfbWFwcywgaHNjYl9tYXAsIGxpbmtzKTsKKworCQlhaGRfZG1hbWFwX2xvYWQoYWhkLCBzY2JfZGF0YS0+aHNjYl9kbWF0LCBoc2NiX21hcC0+ZG1hbWFwLAorCQkJCWhzY2JfbWFwLT52YWRkciwgUEFHRV9TSVpFLCBhaGRfZG1hbWFwX2NiLAorCQkJCSZoc2NiX21hcC0+cGh5c2FkZHIsIC8qZmxhZ3MqLzApOworCisJCWhzY2IgPSAoc3RydWN0IGhhcmR3YXJlX3NjYiAqKWhzY2JfbWFwLT52YWRkcjsKKwkJaHNjYl9idXNhZGRyID0gaHNjYl9tYXAtPnBoeXNhZGRyOworCQlzY2JfZGF0YS0+c2Nic19sZWZ0ID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpoc2NiKTsKKwl9CisKKwlpZiAoc2NiX2RhdGEtPnNnc19sZWZ0ICE9IDApIHsKKwkJaW50IG9mZnNldDsKKworCQlvZmZzZXQgPSAoKGFoZF9zZ2xpc3RfYWxsb2NzaXplKGFoZCkgLyBhaGRfc2dsaXN0X3NpemUoYWhkKSkKKwkJICAgICAgIC0gc2NiX2RhdGEtPnNnc19sZWZ0KSAqIGFoZF9zZ2xpc3Rfc2l6ZShhaGQpOworCQlzZ19tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPnNnX21hcHMpOworCQlzZWdzID0gc2dfbWFwLT52YWRkciArIG9mZnNldDsKKwkJc2dfYnVzYWRkciA9IHNnX21hcC0+cGh5c2FkZHIgKyBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJc2dfbWFwID0gbWFsbG9jKHNpemVvZigqc2dfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKworCQlpZiAoc2dfbWFwID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmF0Y2ggb2YgUy9HIGxpc3RzICovCisJCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgc2NiX2RhdGEtPnNnX2RtYXQsCisJCQkJICAgICAodm9pZCAqKikmc2dfbWFwLT52YWRkciwKKwkJCQkgICAgIEJVU19ETUFfTk9XQUlULCAmc2dfbWFwLT5kbWFtYXApICE9IDApIHsKKwkJCWZyZWUoc2dfbWFwLCBNX0RFVkJVRik7CisJCQlyZXR1cm47CisJCX0KKworCQlTTElTVF9JTlNFUlRfSEVBRCgmc2NiX2RhdGEtPnNnX21hcHMsIHNnX21hcCwgbGlua3MpOworCisJCWFoZF9kbWFtYXBfbG9hZChhaGQsIHNjYl9kYXRhLT5zZ19kbWF0LCBzZ19tYXAtPmRtYW1hcCwKKwkJCQlzZ19tYXAtPnZhZGRyLCBhaGRfc2dsaXN0X2FsbG9jc2l6ZShhaGQpLAorCQkJCWFoZF9kbWFtYXBfY2IsICZzZ19tYXAtPnBoeXNhZGRyLCAvKmZsYWdzKi8wKTsKKworCQlzZWdzID0gc2dfbWFwLT52YWRkcjsKKwkJc2dfYnVzYWRkciA9IHNnX21hcC0+cGh5c2FkZHI7CisJCXNjYl9kYXRhLT5zZ3NfbGVmdCA9CisJCSAgICBhaGRfc2dsaXN0X2FsbG9jc2l6ZShhaGQpIC8gYWhkX3NnbGlzdF9zaXplKGFoZCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpCisJCQlwcmludGYoIk1hcHBlZCBTRyBkYXRhXG4iKTsKKyNlbmRpZgorCX0KKworCWlmIChzY2JfZGF0YS0+c2Vuc2VfbGVmdCAhPSAwKSB7CisJCWludCBvZmZzZXQ7CisKKwkJb2Zmc2V0ID0gUEFHRV9TSVpFIC0gKEFIRF9TRU5TRV9CVUZTSVpFICogc2NiX2RhdGEtPnNlbnNlX2xlZnQpOworCQlzZW5zZV9tYXAgPSBTTElTVF9GSVJTVCgmc2NiX2RhdGEtPnNlbnNlX21hcHMpOworCQlzZW5zZV9kYXRhID0gc2Vuc2VfbWFwLT52YWRkciArIG9mZnNldDsKKwkJc2Vuc2VfYnVzYWRkciA9IHNlbnNlX21hcC0+cGh5c2FkZHIgKyBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJc2Vuc2VfbWFwID0gbWFsbG9jKHNpemVvZigqc2Vuc2VfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKworCQlpZiAoc2Vuc2VfbWFwID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmF0Y2ggb2Ygc2Vuc2UgYnVmZmVycyAqLworCQlpZiAoYWhkX2RtYW1lbV9hbGxvYyhhaGQsIHNjYl9kYXRhLT5zZW5zZV9kbWF0LAorCQkJCSAgICAgKHZvaWQgKiopJnNlbnNlX21hcC0+dmFkZHIsCisJCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJnNlbnNlX21hcC0+ZG1hbWFwKSAhPSAwKSB7CisJCQlmcmVlKHNlbnNlX21hcCwgTV9ERVZCVUYpOworCQkJcmV0dXJuOworCQl9CisKKwkJU0xJU1RfSU5TRVJUX0hFQUQoJnNjYl9kYXRhLT5zZW5zZV9tYXBzLCBzZW5zZV9tYXAsIGxpbmtzKTsKKworCQlhaGRfZG1hbWFwX2xvYWQoYWhkLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwgc2Vuc2VfbWFwLT5kbWFtYXAsCisJCQkJc2Vuc2VfbWFwLT52YWRkciwgUEFHRV9TSVpFLCBhaGRfZG1hbWFwX2NiLAorCQkJCSZzZW5zZV9tYXAtPnBoeXNhZGRyLCAvKmZsYWdzKi8wKTsKKworCQlzZW5zZV9kYXRhID0gc2Vuc2VfbWFwLT52YWRkcjsKKwkJc2Vuc2VfYnVzYWRkciA9IHNlbnNlX21hcC0+cGh5c2FkZHI7CisJCXNjYl9kYXRhLT5zZW5zZV9sZWZ0ID0gUEFHRV9TSVpFIC8gQUhEX1NFTlNFX0JVRlNJWkU7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19NRU1PUlkpCisJCQlwcmludGYoIk1hcHBlZCBzZW5zZSBkYXRhXG4iKTsKKyNlbmRpZgorCX0KKworCW5ld2NvdW50ID0gTUlOKHNjYl9kYXRhLT5zZW5zZV9sZWZ0LCBzY2JfZGF0YS0+c2Nic19sZWZ0KTsKKwluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgc2NiX2RhdGEtPnNnc19sZWZ0KTsKKwluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgKEFIRF9TQ0JfTUFYX0FMTE9DIC0gc2NiX2RhdGEtPm51bXNjYnMpKTsKKwlzY2JfZGF0YS0+c2Vuc2VfbGVmdCAtPSBuZXdjb3VudDsKKwlzY2JfZGF0YS0+c2Nic19sZWZ0IC09IG5ld2NvdW50OworCXNjYl9kYXRhLT5zZ3NfbGVmdCAtPSBuZXdjb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgbmV3Y291bnQ7IGkrKykgeworCQl1X2ludCBjb2xfdGFnOworCisJCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisjaWZuZGVmIF9fbGludXhfXworCQlpbnQgZXJyb3I7CisjZW5kaWYKKwkJbmV4dF9zY2IgPSAoc3RydWN0IHNjYiAqKW1hbGxvYyhzaXplb2YoKm5leHRfc2NiKSwKKwkJCQkJCU1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChuZXh0X3NjYiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJcGRhdGEgPSAoc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICopbWFsbG9jKHNpemVvZigqcGRhdGEpLAorCQkJCQkJCSAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCQlmcmVlKG5leHRfc2NiLCBNX0RFVkJVRik7CisJCQlicmVhazsKKwkJfQorCQluZXh0X3NjYi0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCQluZXh0X3NjYi0+aHNjYl9tYXAgPSBoc2NiX21hcDsKKwkJbmV4dF9zY2ItPnNnX21hcCA9IHNnX21hcDsKKwkJbmV4dF9zY2ItPnNlbnNlX21hcCA9IHNlbnNlX21hcDsKKwkJbmV4dF9zY2ItPnNnX2xpc3QgPSBzZWdzOworCQluZXh0X3NjYi0+c2Vuc2VfZGF0YSA9IHNlbnNlX2RhdGE7CisJCW5leHRfc2NiLT5zZW5zZV9idXNhZGRyID0gc2Vuc2VfYnVzYWRkcjsKKwkJbWVtc2V0KGhzY2IsIDAsIHNpemVvZigqaHNjYikpOworCQluZXh0X3NjYi0+aHNjYiA9IGhzY2I7CisJCWhzY2ItPmhzY2JfYnVzYWRkciA9IGFoZF9odG9sZTMyKGhzY2JfYnVzYWRkcik7CisKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciBhbHdheXMgc3RhcnRzIHdpdGggdGhlIHNlY29uZCBlbnRyeS4KKwkJICogVGhlIGZpcnN0IGVudHJ5IGlzIGVtYmVkZGVkIGluIHRoZSBzY2IuCisJCSAqLworCQluZXh0X3NjYi0+c2dfbGlzdF9idXNhZGRyID0gc2dfYnVzYWRkcjsKKwkJaWYgKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApCisJCQluZXh0X3NjYi0+c2dfbGlzdF9idXNhZGRyCisJCQkgICAgKz0gc2l6ZW9mKHN0cnVjdCBhaGRfZG1hNjRfc2VnKTsKKwkJZWxzZQorCQkJbmV4dF9zY2ItPnNnX2xpc3RfYnVzYWRkciArPSBzaXplb2Yoc3RydWN0IGFoZF9kbWFfc2VnKTsKKwkJbmV4dF9zY2ItPmFoZF9zb2Z0YyA9IGFoZDsKKwkJbmV4dF9zY2ItPmZsYWdzID0gU0NCX0ZMQUdfTk9ORTsKKyNpZm5kZWYgX19saW51eF9fCisJCWVycm9yID0gYWhkX2RtYW1hcF9jcmVhdGUoYWhkLCBhaGQtPmJ1ZmZlcl9kbWF0LCAvKmZsYWdzKi8wLAorCQkJCQkgICZuZXh0X3NjYi0+ZG1hbWFwKTsKKwkJaWYgKGVycm9yICE9IDApIHsKKwkJCWZyZWUobmV4dF9zY2IsIE1fREVWQlVGKTsKKwkJCWZyZWUocGRhdGEsIE1fREVWQlVGKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJbmV4dF9zY2ItPmhzY2ItPnRhZyA9IGFoZF9odG9sZTE2KHNjYl9kYXRhLT5udW1zY2JzKTsKKwkJY29sX3RhZyA9IHNjYl9kYXRhLT5udW1zY2JzIF4gMHgxMDA7CisJCW5leHRfc2NiLT5jb2xfc2NiID0gYWhkX2ZpbmRfc2NiX2J5X3RhZyhhaGQsIGNvbF90YWcpOworCQlpZiAobmV4dF9zY2ItPmNvbF9zY2IgIT0gTlVMTCkKKwkJCW5leHRfc2NiLT5jb2xfc2NiLT5jb2xfc2NiID0gbmV4dF9zY2I7CisJCWFoZF9mcmVlX3NjYihhaGQsIG5leHRfc2NiKTsKKwkJaHNjYisrOworCQloc2NiX2J1c2FkZHIgKz0gc2l6ZW9mKCpoc2NiKTsKKwkJc2VncyArPSBhaGRfc2dsaXN0X3NpemUoYWhkKTsKKwkJc2dfYnVzYWRkciArPSBhaGRfc2dsaXN0X3NpemUoYWhkKTsKKwkJc2Vuc2VfZGF0YSArPSBBSERfU0VOU0VfQlVGU0laRTsKKwkJc2Vuc2VfYnVzYWRkciArPSBBSERfU0VOU0VfQlVGU0laRTsKKwkJc2NiX2RhdGEtPm51bXNjYnMrKzsKKwl9Cit9CisKK3ZvaWQKK2FoZF9jb250cm9sbGVyX2luZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqc3BlZWQ7CisJY29uc3QgY2hhciAqdHlwZTsKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihidWYsICIlczogIiwgYWhkX2NoaXBfbmFtZXNbYWhkLT5jaGlwICYgQUhEX0NISVBJRF9NQVNLXSk7CisJYnVmICs9IGxlbjsKKworCXNwZWVkID0gIlVsdHJhMzIwICI7CisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpICE9IDApIHsKKwkJdHlwZSA9ICJXaWRlICI7CisJfSBlbHNlIHsKKwkJdHlwZSA9ICJTaW5nbGUgIjsKKwl9CisJbGVuID0gc3ByaW50ZihidWYsICIlcyVzQ2hhbm5lbCAlYywgU0NTSSBJZD0lZCwgIiwKKwkJICAgICAgc3BlZWQsIHR5cGUsIGFoZC0+Y2hhbm5lbCwgYWhkLT5vdXJfaWQpOworCWJ1ZiArPSBsZW47CisKKwlzcHJpbnRmKGJ1ZiwgIiVzLCAlZCBTQ0JzIiwgYWhkLT5idXNfZGVzY3JpcHRpb24sCisJCWFoZC0+c2NiX2RhdGEubWF4aHNjYnMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2hhbm5lbF9zdHJpbmdzW10gPSB7CisJIlByaW1hcnkgTG93IiwKKwkiUHJpbWFyeSBIaWdoIiwKKwkiU2Vjb25kYXJ5IExvdyIsIAorCSJTZWNvbmRhcnkgSGlnaCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXJtc3RhdF9zdHJpbmdzW10gPSB7CisJIlRlcm1pbmF0ZWQgQ29ycmVjdGx5IiwKKwkiT3ZlciBUZXJtaW5hdGVkIiwKKwkiVW5kZXIgVGVybWluYXRlZCIsCisJIk5vdCBDb25maWd1cmVkIgorfTsKKworLyoKKyAqIFN0YXJ0IHRoZSBib2FyZCwgcmVhZHkgZm9yIG5vcm1hbCBvcGVyYXRpb24KKyAqLworaW50CithaGRfaW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDhfdAkJKmJhc2VfdmFkZHI7CisJdWludDhfdAkJKm5leHRfdmFkZHI7CisJZG1hX2FkZHJfdAkgbmV4dF9iYWRkcjsKKwlzaXplX3QJCSBkcml2ZXJfZGF0YV9zaXplOworCWludAkJIGk7CisJaW50CQkgZXJyb3I7CisJdV9pbnQJCSB3YXJuX3VzZXI7CisJdWludDhfdAkJIGN1cnJlbnRfc2Vuc2luZzsKKwl1aW50OF90CQkgZnN0YXQ7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKworCWFoZC0+c3RhY2tfc2l6ZSA9IGFoZF9wcm9iZV9zdGFja19zaXplKGFoZCk7CisJYWhkLT5zYXZlZF9zdGFjayA9IG1hbGxvYyhhaGQtPnN0YWNrX3NpemUgKiBzaXplb2YodWludDE2X3QpLAorCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoYWhkLT5zYXZlZF9zdGFjayA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IHRoZSBjb21waWxlciBoYXNuJ3Qgb3Zlci1hZ3Jlc3NpdmVseQorCSAqIHBhZGRlZCBpbXBvcnRhbnQgc3RydWN0dXJlcy4KKwkgKi8KKwlpZiAoc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpICE9IDY0KQorCQlwYW5pYygiSGFyZHdhcmUgU0NCIHNpemUgaXMgaW5jb3JyZWN0Iik7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9ERUJVR19TRVFVRU5DRVIpICE9IDApCisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1NFUVVFTkNFUl9ERUJVRzsKKyNlbmRpZgorCisJLyoKKwkgKiBEZWZhdWx0IHRvIGFsbG93aW5nIGluaXRpYXRvciBvcGVyYXRpb25zLgorCSAqLworCWFoZC0+ZmxhZ3MgfD0gQUhEX0lOSVRJQVRPUlJPTEU7CisKKwkvKgorCSAqIE9ubHkgYWxsb3cgdGFyZ2V0IG1vZGUgZmVhdHVyZXMgaWYgdGhpcyB1bml0IGhhcyB0aGVtIGVuYWJsZWQuCisJICovCisJaWYgKChBSERfVE1PREVfRU5BQkxFICYgKDB4MSA8PCBhaGQtPnVuaXQpKSA9PSAwKQorCQlhaGQtPmZlYXR1cmVzICY9IH5BSERfVEFSR0VUTU9ERTsKKworI2lmbmRlZiBfX2xpbnV4X18KKwkvKiBETUEgdGFnIGZvciBtYXBwaW5nIGJ1ZmZlcnMgaW50byBkZXZpY2UgdmlzaWJsZSBzcGFjZS4gKi8KKwlpZiAoYWhkX2RtYV90YWdfY3JlYXRlKGFoZCwgYWhkLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzEsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovYWhkLT5mbGFncyAmIEFIRF8zOUJJVF9BRERSRVNTSU5HCisJCQkJCT8gKGRtYV9hZGRyX3QpMHg3RkZGRkZGRkZGVUxMCisJCQkJCTogQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIC8qbWF4c2l6ZSovKEFIRF9OU0VHIC0gMSkgKiBQQUdFX1NJWkUsCisJCQkgICAgICAgLypuc2VnbWVudHMqL0FIRF9OU0VHLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0FIRF9NQVhUUkFOU0ZFUl9TSVpFLAorCQkJICAgICAgIC8qZmxhZ3MqL0JVU19ETUFfQUxMT0NOT1csCisJCQkgICAgICAgJmFoZC0+YnVmZmVyX2RtYXQpICE9IDApIHsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKyNlbmRpZgorCisJYWhkLT5pbml0X2xldmVsKys7CisKKwkvKgorCSAqIERNQSB0YWcgZm9yIG91ciBjb21tYW5kIGZpZm9zIGFuZCBvdGhlciBkYXRhIGluIHN5c3RlbSBtZW1vcnkKKwkgKiB0aGUgY2FyZCdzIHNlcXVlbmNlciBtdXN0IGJlIGFibGUgdG8gYWNjZXNzLiAgRm9yIGluaXRpYXRvcgorCSAqIHJvbGVzLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcW91dGZpZm8uICBXaGVuIHByb3ZpZGluZworCSAqIGZvciB0aGUgdGFyZ2V0IG1vZGUgcm9sZSwgd2UgbXVzdCBhZGRpdGlvbmFsbHkgcHJvdmlkZSBzcGFjZSBmb3IKKwkgKiB0aGUgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmQgZmlmby4KKwkgKi8KKwlkcml2ZXJfZGF0YV9zaXplID0gQUhEX1NDQl9NQVggKiBzaXplb2YodWludDE2X3QpCisJCQkgKyBzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYik7CisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1RBUkdFVE1PREUpICE9IDApCisJCWRyaXZlcl9kYXRhX3NpemUgKz0gQUhEX1RNT0RFX0NNRFMgKiBzaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpOworCWlmICgoYWhkLT5idWdzICYgQUhEX1BLVF9CSVRCVUNLRVRfQlVHKSAhPSAwKQorCQlkcml2ZXJfZGF0YV9zaXplICs9IFBLVF9PVkVSUlVOX0JVRlNJWkU7CisJaWYgKGFoZF9kbWFfdGFnX2NyZWF0ZShhaGQsIGFoZC0+cGFyZW50X2RtYXQsIC8qYWxpZ25tZW50Ki8xLAorCQkJICAgICAgIC8qYm91bmRhcnkqL0JVU19TUEFDRV9NQVhBRERSXzMyQklUICsgMSwKKwkJCSAgICAgICAvKmxvd2FkZHIqL0JVU19TUEFDRV9NQVhBRERSXzMyQklULAorCQkJICAgICAgIC8qaGlnaGFkZHIqL0JVU19TUEFDRV9NQVhBRERSLAorCQkJICAgICAgIC8qZmlsdGVyKi9OVUxMLCAvKmZpbHRlcmFyZyovTlVMTCwKKwkJCSAgICAgICBkcml2ZXJfZGF0YV9zaXplLAorCQkJICAgICAgIC8qbnNlZ21lbnRzKi8xLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0JVU19TUEFDRV9NQVhTSVpFXzMyQklULAorCQkJICAgICAgIC8qZmxhZ3MqLzAsICZhaGQtPnNoYXJlZF9kYXRhX2RtYXQpICE9IDApIHsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKworCWFoZC0+aW5pdF9sZXZlbCsrOworCisJLyogQWxsb2NhdGlvbiBvZiBkcml2ZXIgZGF0YSAqLworCWlmIChhaGRfZG1hbWVtX2FsbG9jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJICAgICAodm9pZCAqKikmYmFzZV92YWRkciwKKwkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCkgIT0gMCkgeworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJYWhkLT5pbml0X2xldmVsKys7CisKKwkvKiBBbmQgcGVybWFuZW50bHkgbWFwIGl0IGluICovCisJYWhkX2RtYW1hcF9sb2FkKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCWJhc2VfdmFkZHIsIGRyaXZlcl9kYXRhX3NpemUsIGFoZF9kbWFtYXBfY2IsCisJCQkmYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyLCAvKmZsYWdzKi8wKTsKKwlhaGQtPnFvdXRmaWZvID0gKHVpbnQxNl90ICopYmFzZV92YWRkcjsKKwluZXh0X3ZhZGRyID0gKHVpbnQ4X3QgKikmYWhkLT5xb3V0Zmlmb1tBSERfUU9VVF9TSVpFXTsKKwluZXh0X2JhZGRyID0gYWhkLT5zaGFyZWRfZGF0YV9idXNhZGRyICsgQUhEX1FPVVRfU0laRSpzaXplb2YodWludDE2X3QpOworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9UQVJHRVRNT0RFKSAhPSAwKSB7CisJCWFoZC0+dGFyZ2V0Y21kcyA9IChzdHJ1Y3QgdGFyZ2V0X2NtZCAqKW5leHRfdmFkZHI7CisJCW5leHRfdmFkZHIgKz0gQUhEX1RNT0RFX0NNRFMgKiBzaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpOworCQluZXh0X2JhZGRyICs9IEFIRF9UTU9ERV9DTURTICogc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKTsKKwl9CisKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgIT0gMCkgeworCQlhaGQtPm92ZXJydW5fYnVmID0gbmV4dF92YWRkcjsKKwkJbmV4dF92YWRkciArPSBQS1RfT1ZFUlJVTl9CVUZTSVpFOworCQluZXh0X2JhZGRyICs9IFBLVF9PVkVSUlVOX0JVRlNJWkU7CisJfQorCisJLyoKKwkgKiBXZSBuZWVkIG9uZSBTQ0IgdG8gc2VydmUgYXMgdGhlICJuZXh0IFNDQiIuICBTaW5jZSB0aGUKKwkgKiB0YWcgaWRlbnRpZmllciBpbiB0aGlzIFNDQiB3aWxsIG5ldmVyIGJlIHVzZWQsIHRoZXJlIGlzCisJICogbm8gcG9pbnQgaW4gdXNpbmcgYSB2YWxpZCBIU0NCIHRhZyBmcm9tIGFuIFNDQiBwdWxsZWQgZnJvbQorCSAqIHRoZSBzdGFuZGFyZCBmcmVlIHBvb2wuICBTbywgd2UgYWxsb2NhdGUgdGhpcyAic2VudGluZWwiCisJICogc3BlY2lhbGx5IGZyb20gdGhlIERNQSBzYWZlIG1lbW9yeSBjaHVuayB1c2VkIGZvciB0aGUgUU9VVEZJRk8uCisJICovCisJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiID0gKHN0cnVjdCBoYXJkd2FyZV9zY2IgKiluZXh0X3ZhZGRyOworCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyID0gYWhkX2h0b2xlMzIobmV4dF9iYWRkcik7CisKKwlhaGQtPmluaXRfbGV2ZWwrKzsKKworCS8qIEFsbG9jYXRlIFNDQiBkYXRhIG5vdyB0aGF0IGJ1ZmZlcl9kbWF0IGlzIGluaXRpYWxpemVkICovCisJaWYgKGFoZF9pbml0X3NjYmRhdGEoYWhkKSAhPSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfSU5JVElBVE9SUk9MRSkgPT0gMCkKKwkJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX0JVU19BOworCisJLyoKKwkgKiBCZWZvcmUgY29tbWl0dGluZyB0aGVzZSBzZXR0aW5ncyB0byB0aGUgY2hpcCwgZ2l2ZQorCSAqIHRoZSBPU00gb25lIGxhc3QgY2hhbmNlIHRvIG1vZGlmeSBvdXIgY29uZmlndXJhdGlvbi4KKwkgKi8KKwlhaGRfcGxhdGZvcm1faW5pdChhaGQpOworCisJLyogQnJpbmcgdXAgdGhlIGNoaXAuICovCisJYWhkX2NoaXBfaW5pdChhaGQpOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfQ1VSUkVOVF9TRU5TSU5HKSA9PSAwKQorCQlnb3RvIGluaXRfZG9uZTsKKworCS8qCisJICogVmVyaWZ5IHRlcm1pbmF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgZHJhdyBhbmQKKwkgKiB3YXJuIHVzZXIgaWYgdGhlIGJ1cyBpcyBvdmVyL3VuZGVyIHRlcm1pbmF0ZWQuCisJICovCisJZXJyb3IgPSBhaGRfd3JpdGVfZmxleHBvcnQoYWhkLCBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwsCisJCQkJICAgQ1VSU0VOU0VfRU5CKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAxXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJZ290byBpbml0X2RvbmU7CisJfQorCWZvciAoaSA9IDIwLCBmc3RhdCA9IEZMWF9GU1RBVF9CVVNZOworCSAgICAgKGZzdGF0ICYgRkxYX0ZTVEFUX0JVU1kpICE9IDAgJiYgaTsgaS0tKSB7CisJCWVycm9yID0gYWhkX3JlYWRfZmxleHBvcnQoYWhkLCBGTFhBRERSX0ZMRVhTVEFULCAmZnN0YXQpOworCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJcHJpbnRmKCIlczogY3VycmVudCBzZW5zaW5nIHRpbWVvdXQgMlxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKwkJCWdvdG8gaW5pdF9kb25lOworCQl9CisJfQorCWlmIChpID09IDApIHsKKwkJcHJpbnRmKCIlczogVGltZWRvdXQgZHVyaW5nIGN1cnJlbnQtc2Vuc2luZyB0ZXN0XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCWdvdG8gaW5pdF9kb25lOworCX0KKworCS8qIExhdGNoIEN1cnJlbnQgU2Vuc2luZyBzdGF0dXMuICovCisJZXJyb3IgPSBhaGRfcmVhZF9mbGV4cG9ydChhaGQsIEZMWEFERFJfQ1VSUkVOVF9TVEFULCAmY3VycmVudF9zZW5zaW5nKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIiVzOiBjdXJyZW50IHNlbnNpbmcgdGltZW91dCAzXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJZ290byBpbml0X2RvbmU7CisJfQorCisJLyogRGlhYmxlIGN1cnJlbnQgc2Vuc2luZy4gKi8KKwlhaGRfd3JpdGVfZmxleHBvcnQoYWhkLCBGTFhBRERSX1JPTVNUQVRfQ1VSU0VOU0VDVEwsIDApOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19URVJNQ1RMKSAhPSAwKSB7CisJCXByaW50ZigiJXM6IGN1cnJlbnRfc2Vuc2luZyA9PSAweCV4XG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY3VycmVudF9zZW5zaW5nKTsKKwl9CisjZW5kaWYKKwl3YXJuX3VzZXIgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGN1cnJlbnRfc2Vuc2luZyA+Pj0gRkxYX0NTVEFUX1NISUZUKSB7CisJCXVfaW50IHRlcm1fc3RhdDsKKworCQl0ZXJtX3N0YXQgPSAoY3VycmVudF9zZW5zaW5nICYgRkxYX0NTVEFUX01BU0spOworCQlzd2l0Y2ggKHRlcm1fc3RhdCkgeworCQljYXNlIEZMWF9DU1RBVF9PVkVSOgorCQljYXNlIEZMWF9DU1RBVF9VTkRFUjoKKwkJCXdhcm5fdXNlcisrOworCQljYXNlIEZMWF9DU1RBVF9JTlZBTElEOgorCQljYXNlIEZMWF9DU1RBVF9PS0FZOgorCQkJaWYgKHdhcm5fdXNlciA9PSAwICYmIGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisJCQlwcmludGYoIiVzOiAlcyBDaGFubmVsICVzXG4iLCBhaGRfbmFtZShhaGQpLAorCQkJICAgICAgIGNoYW5uZWxfc3RyaW5nc1tpXSwgdGVybXN0YXRfc3RyaW5nc1t0ZXJtX3N0YXRdKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh3YXJuX3VzZXIpIHsKKwkJcHJpbnRmKCIlczogV0FSTklORy4gVGVybWluYXRpb24gaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LlxuIgorCQkgICAgICAgIiVzOiBXQVJOSU5HLiBTQ1NJIGJ1cyBvcGVyYXRpb25zIG1heSBGQUlMLlxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGFoZF9uYW1lKGFoZCkpOworCX0KK2luaXRfZG9uZToKKwlhaGRfcmVzdGFydChhaGQpOworCWFoZF90aW1lcl9yZXNldCgmYWhkLT5zdGF0X3RpbWVyLCBBSERfU1RBVF9VUERBVEVfVVMsCisJCQlhaGRfc3RhdF90aW1lciwgYWhkKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogKFJlKWluaXRpYWxpemUgY2hpcCBzdGF0ZSBhZnRlciBhIGNoaXAgcmVzZXQuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfY2hpcF9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1aW50MzJfdCBidXNhZGRyOworCXVfaW50CSBzeGZyY3RsMTsKKwl1X2ludAkgc2NzaXNlcV90ZW1wbGF0ZTsKKwl1X2ludAkgd2FpdDsKKwl1X2ludAkgaTsKKwl1X2ludAkgdGFyZ2V0OworCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCS8qCisJICogVGFrZSB0aGUgTEVEIG91dCBvZiBkaWFnbm9zdGljIG1vZGUKKwkgKi8KKwlhaGRfb3V0YihhaGQsIFNCTEtDVEwsIGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIH4oRElBR0xFREVOfERJQUdMRURPTikpOworCisJLyoKKwkgKiBSZXR1cm4gSFNfTUFJTEJPWCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkgKi8KKwlhaGQtPmhzX21haWxib3ggPSAwOworCWFoZF9vdXRiKGFoZCwgSFNfTUFJTEJPWCwgMCk7CisKKwkvKiBTZXQgdGhlIFNDU0kgSWQsIFNYRlJDVEwwLCBTWEZSQ1RMMSwgYW5kIFNJTU9ERTEuICovCisJYWhkX291dGIoYWhkLCBJT1dOSUQsIGFoZC0+b3VyX2lkKTsKKwlhaGRfb3V0YihhaGQsIFRPV05JRCwgYWhkLT5vdXJfaWQpOworCXN4ZnJjdGwxID0gKGFoZC0+ZmxhZ3MgJiBBSERfVEVSTV9FTkJfQSkgIT0gMCA/IFNUUFdFTiA6IDA7CisJc3hmcmN0bDEgfD0gKGFoZC0+ZmxhZ3MgJiBBSERfU1BDSEtfRU5CX0EpICE9IDAgPyBFTlNQQ0hLIDogMDsKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9MT05HX1NFVElNT19CVUcpCisJICYmIChhaGQtPnNlbHRpbWUgIT0gU1RJTUVTRUxfTUlOKSkgeworCQkvKgorCQkgKiBUaGUgc2VsZWN0aW9uIHRpbWVyIGR1cmF0aW9uIGlzIHR3aWNlIGFzIGxvbmcKKwkJICogYXMgaXQgc2hvdWxkIGJlLiAgSGFsdmUgaXQgYnkgYWRkaW5nICIxIiB0bworCQkgKiB0aGUgdXNlciBzcGVjaWZpZWQgc2V0dGluZy4KKwkJICovCisJCXN4ZnJjdGwxIHw9IGFoZC0+c2VsdGltZSArIFNUSU1FU0VMX0JVR19BREo7CisJfSBlbHNlIHsKKwkJc3hmcmN0bDEgfD0gYWhkLT5zZWx0aW1lOworCX0KKwkJCisJYWhkX291dGIoYWhkLCBTWEZSQ1RMMCwgREZPTik7CisJYWhkX291dGIoYWhkLCBTWEZSQ1RMMSwgc3hmcmN0bDF8YWhkLT5zZWx0aW1lfEVOU1RJTUVSfEFDVE5FR0VOKTsKKwlhaGRfb3V0YihhaGQsIFNJTU9ERTEsIEVOU0VMVElNT3xFTlNDU0lSU1R8RU5TQ1NJUEVSUik7CisKKwkvKgorCSAqIE5vdyB0aGF0IHRlcm1pbmF0aW9uIGlzIHNldCwgd2FpdCBmb3IgdXAKKwkgKiB0byA1MDBtcyBmb3Igb3VyIHRyYW5zY2VpdmVycyB0byBzZXR0bGUuICBJZgorCSAqIHRoZSBhZGFwdGVyIGRvZXMgbm90IGhhdmUgYSBjYWJsZSBhdHRhY2hlZCwKKwkgKiB0aGUgdHJhbnNjZWl2ZXJzIG1heSBuZXZlciBzZXR0bGUsIHNvIGRvbid0CisJICogY29tcGxhaW4gaWYgd2UgZmFpbCBoZXJlLgorCSAqLworCWZvciAod2FpdCA9IDEwMDAwOworCSAgICAgKGFoZF9pbmIoYWhkLCBTQkxLQ1RMKSAmIChFTkFCNDB8RU5BQjIwKSkgPT0gMCAmJiB3YWl0OworCSAgICAgd2FpdC0tKQorCQlhaGRfZGVsYXkoMTAwKTsKKworCS8qIENsZWFyIGFueSBmYWxzZSBidXMgcmVzZXRzIGR1ZSB0byB0aGUgdHJhbnNjZWl2ZXJzIHNldHRsaW5nICovCisJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0NTSVJTVEkpOworCWFoZF9vdXRiKGFoZCwgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKworCS8qIEluaXRpYWxpemUgbW9kZSBzcGVjaWZpYyBTL0cgc3RhdGUuICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfREZGMCArIGksIEFIRF9NT0RFX0RGRjAgKyBpKTsKKwkJYWhkX291dGIoYWhkLCBMT05HSk1QX0FERFIgKyAxLCBJTlZBTElEX0FERFIpOworCQlhaGRfb3V0YihhaGQsIFNHX1NUQVRFLCAwKTsKKwkJYWhkX291dGIoYWhkLCBDTFJTRVFJTlRTUkMsIDB4RkYpOworCQlhaGRfb3V0YihhaGQsIFNFUUlNT0RFLAorCQkJIEVOU0FWRVBUUlN8RU5DRkc0REFUQXxFTkNGRzRJU1RBVAorCQkJfEVOQ0ZHNFRTVEFUfEVOQ0ZHNElDTUR8RU5DRkc0VENNRCk7CisJfQorCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKKwlhaGRfb3V0YihhaGQsIERTQ09NTUFORDAsIGFoZF9pbmIoYWhkLCBEU0NPTU1BTkQwKXxNUEFSQ0tFTnxDQUNIRVRIRU4pOworCWFoZF9vdXRiKGFoZCwgREZGX1RIUlNILCBSRF9ERlRIUlNIXzc1fFdSX0RGVEhSU0hfNzUpOworCWFoZF9vdXRiKGFoZCwgU0lNT0RFMCwgRU5JT0VSUnxFTk9WRVJSVU4pOworCWFoZF9vdXRiKGFoZCwgU0lNT0RFMywgRU5OVFJBTVBFUlJ8RU5PU1JBTVBFUlIpOworCWlmICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKSB7CisJCWFoZF9vdXRiKGFoZCwgT1BUSU9OTU9ERSwgQVVUT0FDS0VOfEFVVE9fTVNHT1VUX0RFKTsKKwl9IGVsc2UgeworCQlhaGRfb3V0YihhaGQsIE9QVElPTk1PREUsIEFVVE9BQ0tFTnxCVVNGUkVFUkVWfEFVVE9fTVNHT1VUX0RFKTsKKwl9CisJYWhkX291dGIoYWhkLCBTQ1NDSEtOLCBDVVJSRklGT0RFRnxXSURFUkVTRU58U0hWQUxJRFNURElTKTsKKwlpZiAoKGFoZC0+Y2hpcCAmIEFIRF9CVVNfTUFTSykgPT0gQUhEX1BDSVgpCisJCS8qCisJCSAqIERvIG5vdCBpc3N1ZSBhIHRhcmdldCBhYm9ydCB3aGVuIGEgc3BsaXQgY29tcGxldGlvbgorCQkgKiBlcnJvciBvY2N1cnMuICBMZXQgb3VyIFBDSVggaW50ZXJydXB0IGhhbmRsZXIgZGVhbAorCQkgKiB3aXRoIGl0IGluc3RlYWQuIEgyQTQgUmF6b3IgIzYyNQorCQkgKi8KKwkJYWhkX291dGIoYWhkLCBQQ0lYQ1RMLCBhaGRfaW5iKGFoZCwgUENJWENUTCkgfCBTUExUU1RBRElTKTsKKworCWlmICgoYWhkLT5idWdzICYgQUhEX0xRT09WRVJSVU5fQlVHKSAhPSAwKQorCQlhaGRfb3V0YihhaGQsIExRT1NDU0NUTCwgTFFPTk9DSEtPVkVSKTsKKworCS8qCisJICogVHdlYWsgSU9DRUxMIHNldHRpbmdzLgorCSAqLworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9IUF9CT0FSRCkgIT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNRFNQUzsgaSsrKSB7CisJCQlhaGRfb3V0YihhaGQsIERTUFNFTEVDVCwgaSk7CisJCQlhaGRfb3V0YihhaGQsIFdSVEJJQVNDVEwsIFdSVEJJQVNDVExfSFBfREVGQVVMVCk7CisJCX0KKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKQorCQkJcHJpbnRmKCIlczogV1JUQklBU0NUTCBub3cgMHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJCSAgICAgICBXUlRCSUFTQ1RMX0hQX0RFRkFVTFQpOworI2VuZGlmCisJfQorCWFoZF9zZXR1cF9pb2NlbGxfd29ya2Fyb3VuZChhaGQpOworCisJLyoKKwkgKiBFbmFibGUgTFFJIE1hbmFnZXIgaW50ZXJydXB0cy4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIExRSU1PREUxLCBFTkxRSVBIQVNFX0xRfEVOTFFJUEhBU0VfTkxRfEVOTElRQUJPUlQKKwkJCSAgICAgIHwgRU5MUUlDUkNJX0xRfEVOTFFJQ1JDSV9OTFF8RU5MUUlCQURMUUkKKwkJCSAgICAgIHwgRU5MUUlPVkVSSV9MUXxFTkxRSU9WRVJJX05MUSk7CisJYWhkX291dGIoYWhkLCBMUU9NT0RFMCwgRU5MUU9BVE5MUXxFTkxRT0FUTlBLVHxFTkxRT1RDUkMpOworCS8qCisJICogQW4gaW50ZXJydXB0IGZyb20gTFFPQlVTRlJFRSBpcyBtYWRlIHJlZHVuZGFudCBieSB0aGUKKwkgKiBCVVNGUkVFIGludGVycnVwdC4gIFdlIGNob29zZSB0byBoYXZlIHRoZSBzZXF1ZW5jZXIgY2F0Y2gKKwkgKiBMUU9QSENIR0lOUEtUIGVycm9ycyBtYW51YWxseSBmb3IgdGhlIGNvbW1hbmQgcGhhc2UgYXQgdGhlCisJICogc3RhcnQgb2YgYSBwYWNrZXRpemVkIHNlbGVjdGlvbiBjYXNlLgorCWFoZF9vdXRiKGFoZCwgTFFPTU9ERTEsIEVOTFFPQlVTRlJFRXxFTkxRT1BIQUNIR0lOUEtUKTsKKwkgKi8KKwlhaGRfb3V0YihhaGQsIExRT01PREUxLCAwKTsKKworCS8qCisJICogU2V0dXAgc2VxdWVuY2VyIGludGVycnVwdCBoYW5kbGVycy4KKwkgKi8KKwlhaGRfb3V0dyhhaGQsIElOVFZFQzFfQUREUiwgYWhkX3Jlc29sdmVfc2VxYWRkcihhaGQsIExBQkVMX3NlcV9pc3IpKTsKKwlhaGRfb3V0dyhhaGQsIElOVFZFQzJfQUREUiwgYWhkX3Jlc29sdmVfc2VxYWRkcihhaGQsIExBQkVMX3RpbWVyX2lzcikpOworCisJLyoKKwkgKiBTZXR1cCBTQ0IgT2Zmc2V0IHJlZ2lzdGVycy4KKwkgKi8KKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfTFVOX0JVRykgIT0gMCkgeworCQlhaGRfb3V0YihhaGQsIExVTlBUUiwgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwKKwkJCSBwa3RfbG9uZ19sdW4pKTsKKwl9IGVsc2UgeworCQlhaGRfb3V0YihhaGQsIExVTlBUUiwgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwgbHVuKSk7CisJfQorCWFoZF9vdXRiKGFoZCwgQ01ETEVOUFRSLCBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCBjZGJfbGVuKSk7CisJYWhkX291dGIoYWhkLCBBVFRSUFRSLCBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCB0YXNrX2F0dHJpYnV0ZSkpOworCWFoZF9vdXRiKGFoZCwgRkxBR1BUUiwgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwgdGFza19tYW5hZ2VtZW50KSk7CisJYWhkX291dGIoYWhkLCBDTURQVFIsIG9mZnNldG9mKHN0cnVjdCBoYXJkd2FyZV9zY2IsCisJCQkJICAgICAgIHNoYXJlZF9kYXRhLmlkYXRhLmNkYikpOworCWFoZF9vdXRiKGFoZCwgUU5FWFRQVFIsCisJCSBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCBuZXh0X2hzY2JfYnVzYWRkcikpOworCWFoZF9vdXRiKGFoZCwgQUJSVEJJVFBUUiwgTUtfTUVTU0FHRV9CSVRfT0ZGU0VUKTsKKwlhaGRfb3V0YihhaGQsIEFCUlRCWVRFUFRSLCBvZmZzZXRvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiLCBjb250cm9sKSk7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUEtUX0xVTl9CVUcpICE9IDApIHsKKwkJYWhkX291dGIoYWhkLCBMVU5MRU4sCisJCQkgc2l6ZW9mKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+cGt0X2xvbmdfbHVuKSAtIDEpOworCX0gZWxzZSB7CisJCWFoZF9vdXRiKGFoZCwgTFVOTEVOLCBMVU5MRU5fU0lOR0xFX0xFVkVMX0xVTik7CisJfQorCWFoZF9vdXRiKGFoZCwgQ0RCTElNSVQsIFNDQl9DREJfTEVOX1BUUiAtIDEpOworCWFoZF9vdXRiKGFoZCwgTUFYQ01ELCAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNDQkFVVE9QVFIsCisJCSBBVVNDQlBUUl9FTiB8IG9mZnNldG9mKHN0cnVjdCBoYXJkd2FyZV9zY2IsIHRhZykpOworCisJLyogV2UgaGF2ZW4ndCBiZWVuIGVuYWJsZWQgZm9yIHRhcmdldCBtb2RlIHlldC4gKi8KKwlhaGRfb3V0YihhaGQsIE1VTFRBUkdJRCwgMCk7CisJYWhkX291dGIoYWhkLCBNVUxUQVJHSUQgKyAxLCAwKTsKKworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwkvKiBJbml0aWFsaXplIHRoZSBuZWdvdGlhdGlvbiB0YWJsZS4gKi8KKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfTkVXX0lPQ0VMTF9PUFRTKSA9PSAwKSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBzcGFyZSBieXRlcyBpbiB0aGUgbmVnIHRhYmxlIHRvIGF2b2lkCisJCSAqIHNwdXJpb3VzIHBhcml0eSBlcnJvcnMuCisJCSAqLworCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspIHsKKwkJCWFoZF9vdXRiKGFoZCwgTkVHT0FERFIsIHRhcmdldCk7CisJCQlhaGRfb3V0YihhaGQsIEFOTkVYQ09MLCBBSERfQU5ORVhDT0xfUEVSX0RFVjApOworCQkJZm9yIChpID0gMDsgaSA8IEFIRF9OVU1fUEVSX0RFVl9BTk5FWENPTFM7IGkrKykKKwkJCQlhaGRfb3V0YihhaGQsIEFOTkVYREFULCAwKTsKKwkJfQorCX0KKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspIHsKKwkJc3RydWN0CSBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QJIGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJIGFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgdGFyZ2V0LCAmdHN0YXRlKTsKKwkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsCisJCQkJICAgIHRhcmdldCwgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkgICAgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJCWFoZF91cGRhdGVfbmVnX3RhYmxlKGFoZCwgJmRldmluZm8sICZ0aW5mby0+Y3Vycik7CisJfQorCisJYWhkX291dGIoYWhkLCBDTFJTSU5UMywgTlRSQU1QRVJSfE9TUkFNUEVSUik7CisJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlNDU0lJTlQpOworCisjaWZkZWYgTkVFRFNfTU9SRV9URVNUSU5HCisJLyoKKwkgKiBBbHdheXMgZW5hYmxlIGFib3J0IG9uIGluY29taW5nIExfUXMgaWYgdGhpcyBmZWF0dXJlIGlzCisJICogc3VwcG9ydGVkLiAgV2UgdXNlIHRoaXMgdG8gY2F0Y2ggaW52YWxpZCBTQ0IgcmVmZXJlbmNlcy4KKwkgKi8KKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9BQk9SVF9MUUlfQlVHKSA9PSAwKQorCQlhaGRfb3V0YihhaGQsIExRQ1RMMSwgQUJPUlRQRU5ESU5HKTsKKwllbHNlCisjZW5kaWYKKwkJYWhkX291dGIoYWhkLCBMUUNUTDEsIDApOworCisJLyogQWxsIG9mIG91ciBxdWV1ZXMgYXJlIGVtcHR5ICovCisJYWhkLT5xb3V0Zmlmb25leHQgPSAwOworCWFoZC0+cW91dGZpZm9uZXh0X3ZhbGlkX3RhZyA9IFFPVVRGSUZPX0VOVFJZX1ZBTElEX0xFOworCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHLCBRT1VURklGT19FTlRSWV9WQUxJRCA+PiA4KTsKKwlmb3IgKGkgPSAwOyBpIDwgQUhEX1FPVVRfU0laRTsgaSsrKQorCQlhaGQtPnFvdXRmaWZvW2ldID0gMDsKKwlhaGRfc3luY19xb3V0ZmlmbyhhaGQsIEJVU19ETUFTWU5DX1BSRVJFQUQpOworCisJYWhkLT5xaW5maWZvbmV4dCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFIRF9RSU5fU0laRTsgaSsrKQorCQlhaGQtPnFpbmZpZm9baV0gPSBTQ0JfTElTVF9OVUxMOworCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1RBUkdFVE1PREUpICE9IDApIHsKKwkJLyogQWxsIHRhcmdldCBjb21tYW5kIGJsb2NrcyBzdGFydCBvdXQgaW52YWxpZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIRF9UTU9ERV9DTURTOyBpKyspCisJCQlhaGQtPnRhcmdldGNtZHNbaV0uY21kX3ZhbGlkID0gMDsKKwkJYWhkX3N5bmNfdHFpbmZpZm8oYWhkLCBCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhkLT50cWluZmlmb25leHQgPSAxOworCQlhaGRfb3V0YihhaGQsIEtFUk5FTF9UUUlOUE9TLCBhaGQtPnRxaW5maWZvbmV4dCAtIDEpOworCQlhaGRfb3V0YihhaGQsIFRRSU5QT1MsIGFoZC0+dHFpbmZpZm9uZXh0KTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFNjcmF0Y2ggUmFtLiAqLworCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTLCAwKTsKKwlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUzIsIDApOworCisJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgd2FpdGluZyBzZWxlY3Rpb25zICovCisJYWhkX291dHcoYWhkLCBXQUlUSU5HX1RJRF9IRUFELCBTQ0JfTElTVF9OVUxMKTsKKwlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX1RBSUwsIFNDQl9MSVNUX05VTEwpOworCWZvciAoaSA9IDA7IGkgPCBBSERfTlVNX1RBUkdFVFM7IGkrKykKKwkJYWhkX291dHcoYWhkLCBXQUlUSU5HX1NDQl9UQUlMUyArICgyICogaSksIFNDQl9MSVNUX05VTEwpOworCisJLyoKKwkgKiBOb2JvZHkgaXMgd2FpdGluZyB0byBiZSBETUFlZCBpbnRvIHRoZSBRT1VURklGTy4KKwkgKi8KKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9IRUFELCBTQ0JfTElTVF9OVUxMKTsKKwlhaGRfb3V0dyhhaGQsIENPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRCwgU0NCX0xJU1RfTlVMTCk7CisJYWhkX291dHcoYWhkLCBDT01QTEVURV9ETUFfU0NCX0hFQUQsIFNDQl9MSVNUX05VTEwpOworCisJLyoKKwkgKiBUaGUgRnJlZXplIENvdW50IGlzIDAuCisJICovCisJYWhkX291dHcoYWhkLCBRRlJFRVpFX0NPVU5ULCAwKTsKKworCS8qCisJICogVGVsbCB0aGUgc2VxdWVuY2VyIHdoZXJlIGl0IGNhbiBmaW5kIG91ciBhcnJheXMgaW4gbWVtb3J5LgorCSAqLworCWJ1c2FkZHIgPSBhaGQtPnNoYXJlZF9kYXRhX2J1c2FkZHI7CisJYWhkX291dGIoYWhkLCBTSEFSRURfREFUQV9BRERSLCBidXNhZGRyICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBTSEFSRURfREFUQV9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNIQVJFRF9EQVRBX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFNIQVJFRF9EQVRBX0FERFIgKyAzLCAoYnVzYWRkciA+PiAyNCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX05FWFRfQUREUiwgYnVzYWRkciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSICsgMSwgKGJ1c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIFFPVVRGSUZPX05FWFRfQUREUiArIDIsIChidXNhZGRyID4+IDE2KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgUU9VVEZJRk9fTkVYVF9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisKKwkvKgorCSAqIFNldHVwIHRoZSBhbGxvd2VkIFNDU0kgU2VxdWVuY2VzIGJhc2VkIG9uIG9wZXJhdGlvbmFsIG1vZGUuCisJICogSWYgd2UgYXJlIGEgdGFyZ2V0LCB3ZSdsbCBlbmFibGUgc2VsZWN0IGluIG9wZXJhdGlvbnMgb25jZQorCSAqIHdlJ3ZlIGhhZCBhIGx1biBlbmFibGVkLgorCSAqLworCXNjc2lzZXFfdGVtcGxhdGUgPSBFTkFVVE9BVE5QOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKQorCQlzY3Npc2VxX3RlbXBsYXRlIHw9IEVOUlNFTEk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFLCBzY3Npc2VxX3RlbXBsYXRlKTsKKworCS8qIFRoZXJlIGFyZSBubyBidXN5IFNDQnMgeWV0LiAqLworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgQUhEX05VTV9UQVJHRVRTOyB0YXJnZXQrKykgeworCQlpbnQgbHVuOworCisJCWZvciAobHVuID0gMDsgbHVuIDwgQUhEX05VTV9MVU5TX05PTlBLVDsgbHVuKyspCisJCQlhaGRfdW5idXN5X3RjbChhaGQsIEJVSUxEX1RDTF9SQVcodGFyZ2V0LCAnQScsIGx1bikpOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgY29kZSB0byBjb21tYW5kIGxlbmd0aCB0YWJsZS4KKwkgKiBWZW5kb3IgVW5pcXVlIGNvZGVzIGFyZSBzZXQgdG8gMCBzbyB3ZSBvbmx5IGNhcHR1cmUKKwkgKiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgY2RiLiAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4KKwkgKiB3aGVuIHRhcmdldCBtb2RlIGlzIGVuYWJsZWQuCisJICovCisJYWhkX291dGIoYWhkLCBDTURTSVpFX1RBQkxFLCA1KTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyAxLCA5KTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyAyLCA5KTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyAzLCAwKTsKKwlhaGRfb3V0YihhaGQsIENNRFNJWkVfVEFCTEUgKyA0LCAxNSk7CisJYWhkX291dGIoYWhkLCBDTURTSVpFX1RBQkxFICsgNSwgMTEpOworCWFoZF9vdXRiKGFoZCwgQ01EU0laRV9UQUJMRSArIDYsIDApOworCWFoZF9vdXRiKGFoZCwgQ01EU0laRV9UQUJMRSArIDcsIDApOworCQkKKwkvKiBUZWxsIHRoZSBzZXF1ZW5jZXIgb2Ygb3VyIGluaXRpYWwgcXVldWUgcG9zaXRpb25zICovCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisJYWhkX291dGIoYWhkLCBRT0ZGX0NUTFNUQSwgU0NCX1FTSVpFXzUxMik7CisJYWhkLT5xaW5maWZvbmV4dCA9IDA7CisJYWhkX3NldF9obnNjYl9xb2ZmKGFoZCwgYWhkLT5xaW5maWZvbmV4dCk7CisJYWhkX3NldF9oZXNjYl9xb2ZmKGFoZCwgMCk7CisJYWhkX3NldF9zbnNjYl9xb2ZmKGFoZCwgMCk7CisJYWhkX3NldF9zZXNjYl9xb2ZmKGFoZCwgMCk7CisJYWhkX3NldF9zZHNjYl9xb2ZmKGFoZCwgMCk7CisKKwkvKgorCSAqIFRlbGwgdGhlIHNlcXVlbmNlciB3aGljaCBTQ0Igd2lsbCBiZSB0aGUgbmV4dCBvbmUgaXQgcmVjZWl2ZXMuCisJICovCisJYnVzYWRkciA9IGFoZF9sZTMydG9oKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisKKwkvKgorCSAqIERlZmF1bHQgdG8gY29hbGVzY2luZyBkaXNhYmxlZC4KKwkgKi8KKwlhaGRfb3V0dyhhaGQsIElOVF9DT0FMRVNDSU5HX0NNRENPVU5ULCAwKTsKKwlhaGRfb3V0dyhhaGQsIENNRFNfUEVORElORywgMCk7CisJYWhkX3VwZGF0ZV9jb2FsZXNjaW5nX3ZhbHVlcyhhaGQsIGFoZC0+aW50X2NvYWxlc2NpbmdfdGltZXIsCisJCQkJICAgICBhaGQtPmludF9jb2FsZXNjaW5nX21heGNtZHMsCisJCQkJICAgICBhaGQtPmludF9jb2FsZXNjaW5nX21pbmNtZHMpOworCWFoZF9lbmFibGVfY29hbGVzY2luZyhhaGQsIEZBTFNFKTsKKworCWFoZF9sb2Fkc2VxKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworfQorCisvKgorICogU2V0dXAgZGVmYXVsdCBkZXZpY2UgYW5kIGNvbnRyb2xsZXIgc2V0dGluZ3MuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBvdXIgcHJvYmUgaGFzCisgKiBkZXRlcm1pbmVkIHRoYXQgbm8gY29uZmlndXJhdGlvbiBkYXRhIGlzIGF2YWlsYWJsZS4KKyAqLworaW50CithaGRfZGVmYXVsdF9jb25maWcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludAl0YXJnOworCisJYWhkLT5vdXJfaWQgPSA3OworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHRzdGF0ZSB0byBob3VzZSBpbmZvcm1hdGlvbiBmb3Igb3VyCisJICogaW5pdGlhdG9yIHByZXNlbmNlIG9uIHRoZSBidXMgYXMgd2VsbCBhcyB0aGUgdXNlcgorCSAqIGRhdGEgZm9yIGFueSB0YXJnZXQgbW9kZSBpbml0aWF0b3IuCisJICovCisJaWYgKGFoZF9hbGxvY190c3RhdGUoYWhkLCBhaGQtPm91cl9pZCwgJ0EnKSA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBhaGRfdG1vZGVfdHN0YXRlLiAgIgorCQkgICAgICAgIkZhaWxpbmcgYXR0YWNoXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKworCWZvciAodGFyZyA9IDA7IHRhcmcgPCBBSERfTlVNX1RBUkdFVFM7IHRhcmcrKykgeworCQlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdAkgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQl1aW50MTZfdCB0YXJnZXRfbWFzazsKKworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgdGFyZywgJnRzdGF0ZSk7CisJCS8qCisJCSAqIFdlIHN1cHBvcnQgU1BDMiBhbmQgU1BJNC4KKwkJICovCisJCXRpbmZvLT51c2VyLnByb3RvY29sX3ZlcnNpb24gPSA0OworCQl0aW5mby0+dXNlci50cmFuc3BvcnRfdmVyc2lvbiA9IDQ7CisKKwkJdGFyZ2V0X21hc2sgPSAweDAxIDw8IHRhcmc7CisJCWFoZC0+dXNlcl9kaXNjZW5hYmxlIHw9IHRhcmdldF9tYXNrOworCQl0c3RhdGUtPmRpc2NlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisJCWFoZC0+dXNlcl90YWdlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisjaWZkZWYgQUhEX0ZPUkNFXzE2MAorCQl0aW5mby0+dXNlci5wZXJpb2QgPSBBSERfU1lOQ1JBVEVfRFQ7CisjZWxzZQorCQl0aW5mby0+dXNlci5wZXJpb2QgPSBBSERfU1lOQ1JBVEVfMTYwOworI2VuZGlmCisJCXRpbmZvLT51c2VyLm9mZnNldCA9IE1BWF9PRkZTRVQ7CisJCXRpbmZvLT51c2VyLnBwcl9vcHRpb25zID0gTVNHX0VYVF9QUFJfUkRfU1RSTQorCQkJCQl8IE1TR19FWFRfUFBSX1dSX0ZMT1cKKwkJCQkJfCBNU0dfRVhUX1BQUl9IT0xEX01DUworCQkJCQl8IE1TR19FWFRfUFBSX0lVX1JFUQorCQkJCQl8IE1TR19FWFRfUFBSX1FBU19SRVEKKwkJCQkJfCBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpICE9IDApCisJCQl0aW5mby0+dXNlci5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9SVEk7CisKKwkJdGluZm8tPnVzZXIud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKworCQkvKgorCQkgKiBTdGFydCBvdXQgQXN5bmMvTmFycm93L1VudGFnZ2VkIGFuZCB3aXRoCisJCSAqIGNvbnNlcnZhdGl2ZSBwcm90b2NvbCBzdXBwb3J0LgorCQkgKi8KKwkJdGluZm8tPmdvYWwucHJvdG9jb2xfdmVyc2lvbiA9IDI7CisJCXRpbmZvLT5nb2FsLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmN1cnIucHJvdG9jb2xfdmVyc2lvbiA9IDI7CisJCXRpbmZvLT5jdXJyLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgYWhkLT5vdXJfaWQsCisJCQkJICAgIHRhcmcsIENBTV9MVU5fV0lMRENBUkQsCisJCQkJICAgICdBJywgUk9MRV9JTklUSUFUT1IpOworCQl0c3RhdGUtPnRhZ2VuYWJsZSAmPSB+dGFyZ2V0X21hc2s7CisJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCSAgICAgIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9UUlVFKTsKKwkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsCisJCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFBhcnNlIGRldmljZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICovCitpbnQKK2FoZF9wYXJzZV9jZmdkYXRhKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNlZXByb21fY29uZmlnICpzYykKK3sKKwlpbnQgdGFyZzsKKwlpbnQgbWF4X3Rhcmc7CisKKwltYXhfdGFyZyA9IHNjLT5tYXhfdGFyZ2V0cyAmIENGTUFYVEFSRzsKKwlhaGQtPm91cl9pZCA9IHNjLT5icnRpbWVfaWQgJiBDRlNDU0lJRDsKKworCS8qCisJICogQWxsb2NhdGUgYSB0c3RhdGUgdG8gaG91c2UgaW5mb3JtYXRpb24gZm9yIG91cgorCSAqIGluaXRpYXRvciBwcmVzZW5jZSBvbiB0aGUgYnVzIGFzIHdlbGwgYXMgdGhlIHVzZXIKKwkgKiBkYXRhIGZvciBhbnkgdGFyZ2V0IG1vZGUgaW5pdGlhdG9yLgorCSAqLworCWlmIChhaGRfYWxsb2NfdHN0YXRlKGFoZCwgYWhkLT5vdXJfaWQsICdBJykgPT0gTlVMTCkgeworCQlwcmludGYoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgYWhkX3Rtb2RlX3RzdGF0ZS4gICIKKwkJICAgICAgICJGYWlsaW5nIGF0dGFjaFxuIiwgYWhkX25hbWUoYWhkKSk7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9CisKKwlmb3IgKHRhcmcgPSAwOyB0YXJnIDwgbWF4X3Rhcmc7IHRhcmcrKykgeworCQlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdAkgYWhkX3RyYW5zaW5mbyAqdXNlcl90aW5mbzsKKwkJc3RydWN0CSBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCXVpbnQxNl90IHRhcmdldF9tYXNrOworCisJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnLCAmdHN0YXRlKTsKKwkJdXNlcl90aW5mbyA9ICZ0aW5mby0+dXNlcjsKKworCQkvKgorCQkgKiBXZSBzdXBwb3J0IFNQQzIgYW5kIFNQSTQuCisJCSAqLworCQl0aW5mby0+dXNlci5wcm90b2NvbF92ZXJzaW9uID0gNDsKKwkJdGluZm8tPnVzZXIudHJhbnNwb3J0X3ZlcnNpb24gPSA0OworCisJCXRhcmdldF9tYXNrID0gMHgwMSA8PCB0YXJnOworCQlhaGQtPnVzZXJfZGlzY2VuYWJsZSAmPSB+dGFyZ2V0X21hc2s7CisJCXRzdGF0ZS0+ZGlzY2VuYWJsZSAmPSB+dGFyZ2V0X21hc2s7CisJCWFoZC0+dXNlcl90YWdlbmFibGUgJj0gfnRhcmdldF9tYXNrOworCQlpZiAoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGRElTQykgeworCQkJdHN0YXRlLT5kaXNjZW5hYmxlIHw9IHRhcmdldF9tYXNrOworCQkJYWhkLT51c2VyX2Rpc2NlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisJCQlhaGQtPnVzZXJfdGFnZW5hYmxlIHw9IHRhcmdldF9tYXNrOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENhbm5vdCBiZSBwYWNrZXRpemVkIHdpdGhvdXQgZGlzY29ubmVjdGlvbi4KKwkJCSAqLworCQkJc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmPSB+Q0ZQQUNLRVRJWkVEOworCQl9CisKKwkJdXNlcl90aW5mby0+cHByX29wdGlvbnMgPSAwOworCQl1c2VyX3RpbmZvLT5wZXJpb2QgPSAoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGWEZFUik7CisJCWlmICh1c2VyX3RpbmZvLT5wZXJpb2QgPCBDRlhGRVJfQVNZTkMpIHsKKwkJCWlmICh1c2VyX3RpbmZvLT5wZXJpb2QgPD0gQUhEX1BFUklPRF8xME1IeikKKwkJCQl1c2VyX3RpbmZvLT5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9EVF9SRVE7CisJCQl1c2VyX3RpbmZvLT5vZmZzZXQgPSBNQVhfT0ZGU0VUOworCQl9IGVsc2UgIHsKKwkJCXVzZXJfdGluZm8tPm9mZnNldCA9IDA7CisJCQl1c2VyX3RpbmZvLT5wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJCX0KKyNpZmRlZiBBSERfRk9SQ0VfMTYwCisJCWlmICh1c2VyX3RpbmZvLT5wZXJpb2QgPD0gQUhEX1NZTkNSQVRFXzE2MCkKKwkJCXVzZXJfdGluZm8tPnBlcmlvZCA9IEFIRF9TWU5DUkFURV9EVDsKKyNlbmRpZgorCisJCWlmICgoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGUEFDS0VUSVpFRCkgIT0gMCkgeworCQkJdXNlcl90aW5mby0+cHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUkRfU1RSTQorCQkJCQkJfCAgTVNHX0VYVF9QUFJfV1JfRkxPVworCQkJCQkJfCAgTVNHX0VYVF9QUFJfSE9MRF9NQ1MKKwkJCQkJCXwgIE1TR19FWFRfUFBSX0lVX1JFUTsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9SVEkpICE9IDApCisJCQkJdXNlcl90aW5mby0+cHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfUlRJOworCQl9CisKKwkJaWYgKChzYy0+ZGV2aWNlX2ZsYWdzW3RhcmddICYgQ0ZRQVMpICE9IDApCisJCQl1c2VyX3RpbmZvLT5wcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9RQVNfUkVROworCisJCWlmICgoc2MtPmRldmljZV9mbGFnc1t0YXJnXSAmIENGV0lERUIpICE9IDApCisJCQl1c2VyX3RpbmZvLT53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworCQllbHNlCisJCQl1c2VyX3RpbmZvLT53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTUlTQykgIT0gMCkKKwkJCXByaW50ZigiKCVkKTogJXg6JXg6JXg6JXhcbiIsIHRhcmcsIHVzZXJfdGluZm8tPndpZHRoLAorCQkJICAgICAgIHVzZXJfdGluZm8tPnBlcmlvZCwgdXNlcl90aW5mby0+b2Zmc2V0LAorCQkJICAgICAgIHVzZXJfdGluZm8tPnBwcl9vcHRpb25zKTsKKyNlbmRpZgorCQkvKgorCQkgKiBTdGFydCBvdXQgQXN5bmMvTmFycm93L1VudGFnZ2VkIGFuZCB3aXRoCisJCSAqIGNvbnNlcnZhdGl2ZSBwcm90b2NvbCBzdXBwb3J0LgorCQkgKi8KKwkJdHN0YXRlLT50YWdlbmFibGUgJj0gfnRhcmdldF9tYXNrOworCQl0aW5mby0+Z29hbC5wcm90b2NvbF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQl0aW5mby0+Y3Vyci5wcm90b2NvbF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmN1cnIudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwKKwkJCQkgICAgdGFyZywgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkgICAgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisJCWFoZF9zZXRfd2lkdGgoYWhkLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCSAgICAgIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9UUlVFKTsKKwkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAvKnBlcmlvZCovMCwgLypvZmZzZXQqLzAsCisJCQkJIC8qcHByX29wdGlvbnMqLzAsIEFIRF9UUkFOU19DVVJ8QUhEX1RSQU5TX0dPQUwsCisJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwl9CisKKwlhaGQtPmZsYWdzICY9IH5BSERfU1BDSEtfRU5CX0E7CisJaWYgKHNjLT5iaW9zX2NvbnRyb2wgJiBDRlNQQVJJVFkpCisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1NQQ0hLX0VOQl9BOworCisJYWhkLT5mbGFncyAmPSB+QUhEX1JFU0VUX0JVU19BOworCWlmIChzYy0+Ymlvc19jb250cm9sICYgQ0ZSRVNFVEIpCisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU0VUX0JVU19BOworCisJYWhkLT5mbGFncyAmPSB+QUhEX0VYVEVOREVEX1RSQU5TX0E7CisJaWYgKHNjLT5iaW9zX2NvbnRyb2wgJiBDRkVYVEVORCkKKwkJYWhkLT5mbGFncyB8PSBBSERfRVhURU5ERURfVFJBTlNfQTsKKworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9CSU9TX0VOQUJMRUQ7CisJaWYgKChzYy0+Ymlvc19jb250cm9sICYgQ0ZCSU9TU1RBVEUpID09IENGQlNfRU5BQkxFRCkKKwkJYWhkLT5mbGFncyB8PSBBSERfQklPU19FTkFCTEVEOworCisJYWhkLT5mbGFncyAmPSB+QUhEX1NUUFdMRVZFTF9BOworCWlmICgoc2MtPmFkYXB0ZXJfY29udHJvbCAmIENGU1RQV0xFVkVMKSAhPSAwKQorCQlhaGQtPmZsYWdzIHw9IEFIRF9TVFBXTEVWRUxfQTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBQYXJzZSBkZXZpY2UgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworaW50CithaGRfcGFyc2VfdnBkZGF0YShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCB2cGRfY29uZmlnICp2cGQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGRfdmVyaWZ5X3ZwZF9ja3N1bSh2cGQpOworCWlmIChlcnJvciA9PSAwKQorCQlyZXR1cm4gKEVJTlZBTCk7CisJaWYgKCh2cGQtPmJpb3NfZmxhZ3MgJiBWUERCT09USE9TVCkgIT0gMCkKKwkJYWhkLT5mbGFncyB8PSBBSERfQk9PVF9DSEFOTkVMOworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9pbnRyX2VuYWJsZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBlbmFibGUpCit7CisJdV9pbnQgaGNudHJsOworCisJaGNudHJsID0gYWhkX2luYihhaGQsIEhDTlRSTCk7CisJaGNudHJsICY9IH5JTlRFTjsKKwlhaGQtPnBhdXNlICY9IH5JTlRFTjsKKwlhaGQtPnVucGF1c2UgJj0gfklOVEVOOworCWlmIChlbmFibGUpIHsKKwkJaGNudHJsIHw9IElOVEVOOworCQlhaGQtPnBhdXNlIHw9IElOVEVOOworCQlhaGQtPnVucGF1c2UgfD0gSU5URU47CisJfQorCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBoY250cmwpOworfQorCit2b2lkCithaGRfdXBkYXRlX2NvYWxlc2NpbmdfdmFsdWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGltZXIsIHVfaW50IG1heGNtZHMsCisJCQkgICAgIHVfaW50IG1pbmNtZHMpCit7CisJaWYgKHRpbWVyID4gQUhEX1RJTUVSX01BWF9VUykKKwkJdGltZXIgPSBBSERfVElNRVJfTUFYX1VTOworCWFoZC0+aW50X2NvYWxlc2NpbmdfdGltZXIgPSB0aW1lcjsKKworCWlmIChtYXhjbWRzID4gQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfTUFYKQorCQltYXhjbWRzID0gQUhEX0lOVF9DT0FMRVNDSU5HX01BWENNRFNfTUFYOworCWlmIChtaW5jbWRzID4gQUhEX0lOVF9DT0FMRVNDSU5HX01JTkNNRFNfTUFYKQorCQltaW5jbWRzID0gQUhEX0lOVF9DT0FMRVNDSU5HX01JTkNNRFNfTUFYOworCWFoZC0+aW50X2NvYWxlc2NpbmdfbWF4Y21kcyA9IG1heGNtZHM7CisJYWhkX291dHcoYWhkLCBJTlRfQ09BTEVTQ0lOR19USU1FUiwgdGltZXIgLyBBSERfVElNRVJfVVNfUEVSX1RJQ0spOworCWFoZF9vdXRiKGFoZCwgSU5UX0NPQUxFU0NJTkdfTUFYQ01EUywgLW1heGNtZHMpOworCWFoZF9vdXRiKGFoZCwgSU5UX0NPQUxFU0NJTkdfTUlOQ01EUywgLW1pbmNtZHMpOworfQorCit2b2lkCithaGRfZW5hYmxlX2NvYWxlc2Npbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgZW5hYmxlKQoreworCisJYWhkLT5oc19tYWlsYm94ICY9IH5FTklOVF9DT0FMRVNDRTsKKwlpZiAoZW5hYmxlKQorCQlhaGQtPmhzX21haWxib3ggfD0gRU5JTlRfQ09BTEVTQ0U7CisJYWhkX291dGIoYWhkLCBIU19NQUlMQk9YLCBhaGQtPmhzX21haWxib3gpOworCWFoZF9mbHVzaF9kZXZpY2Vfd3JpdGVzKGFoZCk7CisJYWhkX3J1bl9xb3V0ZmlmbyhhaGQpOworfQorCisvKgorICogRW5zdXJlIHRoYXQgdGhlIGNhcmQgaXMgcGF1c2VkIGluIGEgbG9jYXRpb24KKyAqIG91dHNpZGUgb2YgYWxsIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCB0aGF0IGFsbAorICogcGVuZGluZyB3b3JrIGlzIGNvbXBsZXRlZCBwcmlvciB0byByZXR1cm5pbmcuCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gb3V0c2lkZQorICogYW4gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQKK2FoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2ludCBpbnRzdGF0OworCXVfaW50IG1heGxvb3BzOworCXVfaW50IHFmcmVlemVfY250OworCisJbWF4bG9vcHMgPSAxMDAwOworCWFoZC0+ZmxhZ3MgfD0gQUhEX0FMTF9JTlRFUlJVUFRTOworCWFoZF9wYXVzZShhaGQpOworCS8qCisJICogSW5jcmVtZW50IHRoZSBRRnJlZXplIENvdW50IHNvIHRoYXQgdGhlIHNlcXVlbmNlcgorCSAqIHdpbGwgbm90IHN0YXJ0IG5ldyBzZWxlY3Rpb25zLiAgV2UgZG8gdGhpcyBvbmx5CisJICogdW50aWwgd2UgYXJlIHNhZmVseSBwYXVzZWQgd2l0aG91dCBmdXJ0aGVyIHNlbGVjdGlvbnMKKwkgKiBwZW5kaW5nLgorCSAqLworCWFoZF9vdXR3KGFoZCwgUUZSRUVaRV9DT1VOVCwgYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpICsgMSk7CisJYWhkX291dGIoYWhkLCBTRVFfRkxBR1MyLCBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgfCBTRUxFQ1RPVVRfUUZST1pFTik7CisJZG8geworCQlzdHJ1Y3Qgc2NiICp3YWl0aW5nX3NjYjsKKworCQlhaGRfdW5wYXVzZShhaGQpOworCQlhaGRfaW50cihhaGQpOworCQlhaGRfcGF1c2UoYWhkKTsKKwkJYWhkX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oYWhkKTsKKwkJaW50c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCQlpZiAoKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSA9PSAwKQorCQkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwKKwkJCQkgYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH5FTlNFTE8pOworCQkvKgorCQkgKiBJbiB0aGUgbm9uLXBhY2tldGl6ZWQgY2FzZSwgdGhlIHNlcXVlbmNlciAoZm9yIFJldiBBKSwKKwkJICogcmVsaWVzIG9uIEVOU0VMTyByZW1haW5pbmcgc2V0IGFmdGVyIFNFTERPLiAgVGhlIGhhcmR3YXJlCisJCSAqIGF1dG8tY2xlYXJzIEVOU0VMTyBpbiB0aGUgcGFja2V0aXplZCBjYXNlLgorCQkgKi8KKwkJd2FpdGluZ19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsCisJCQkJCSAgICAgYWhkX2ludyhhaGQsIFdBSVRJTkdfVElEX0hFQUQpKTsKKwkJaWYgKHdhaXRpbmdfc2NiICE9IE5VTEwKKwkJICYmICh3YWl0aW5nX3NjYi0+ZmxhZ3MgJiBTQ0JfUEFDS0VUSVpFRCkgPT0gMAorCQkgJiYgKGFoZF9pbmIoYWhkLCBTU1RBVDApICYgKFNFTERPfFNFTElOR08pKSAhPSAwKQorCQkJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwKKwkJCQkgYWhkX2luYihhaGQsIFNDU0lTRVEwKSB8IEVOU0VMTyk7CisJfSB3aGlsZSAoLS1tYXhsb29wcworCSAgICAgICYmIChpbnRzdGF0ICE9IDB4RkYgfHwgKGFoZC0+ZmVhdHVyZXMgJiBBSERfUkVNT1ZBQkxFKSA9PSAwKQorCSAgICAgICYmICgoaW50c3RhdCAmIElOVF9QRU5EKSAhPSAwCisJICAgICAgIHx8IChhaGRfaW5iKGFoZCwgU0NTSVNFUTApICYgRU5TRUxPKSAhPSAwCisJICAgICAgIHx8IChhaGRfaW5iKGFoZCwgU1NUQVQwKSAmIChTRUxET3xTRUxJTkdPKSkgIT0gMCkpOworCisJaWYgKG1heGxvb3BzID09IDApIHsKKwkJcHJpbnRmKCJJbmZpbml0ZSBpbnRlcnJ1cHQgbG9vcCwgSU5UU1RBVCA9ICV4IiwKKwkJICAgICAgYWhkX2luYihhaGQsIElOVFNUQVQpKTsKKwl9CisJcWZyZWV6ZV9jbnQgPSBhaGRfaW53KGFoZCwgUUZSRUVaRV9DT1VOVCk7CisJaWYgKHFmcmVlemVfY250ID09IDApIHsKKwkJcHJpbnRmKCIlczogYWhkX3BhdXNlX2FuZF9mbHVzaHdvcmsgd2l0aCAwIHFmcmVlemUgY291bnQhXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJfSBlbHNlIHsKKwkJcWZyZWV6ZV9jbnQtLTsKKwl9CisJYWhkX291dHcoYWhkLCBRRlJFRVpFX0NPVU5ULCBxZnJlZXplX2NudCk7CisJaWYgKHFmcmVlemVfY250ID09IDApCisJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwKKwkJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+U0VMRUNUT1VUX1FGUk9aRU4pOworCisJYWhkX2ZsdXNoX3FvdXRmaWZvKGFoZCk7CisKKwlhaGRfcGxhdGZvcm1fZmx1c2h3b3JrKGFoZCk7CisJYWhkLT5mbGFncyAmPSB+QUhEX0FMTF9JTlRFUlJVUFRTOworfQorCitpbnQKK2FoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKworCWFoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKGFoZCk7CisKKwlpZiAoTElTVF9GSVJTVCgmYWhkLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKKwkJYWhkX3VucGF1c2UoYWhkKTsKKwkJcmV0dXJuIChFQlVTWSk7CisJfQorCWFoZF9zaHV0ZG93bihhaGQpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorYWhkX3Jlc3VtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwlhaGRfcmVzZXQoYWhkLCAvKnJlaW5pdCovVFJVRSk7CisJYWhkX2ludHJfZW5hYmxlKGFoZCwgVFJVRSk7IAorCWFoZF9yZXN0YXJ0KGFoZCk7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1c3kgVGFyZ2V0IFRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTZXQgU0NCUFRSIHRvIHRoZSBTQ0IgdGhhdCBjb250YWlucyB0aGUgYnVzeQorICogdGFibGUgZW50cnkgZm9yIFRDTC4gIFJldHVybiB0aGUgb2Zmc2V0IGludG8KKyAqIHRoZSBTQ0IgdGhhdCBjb250YWlucyB0aGUgZW50cnkgZm9yIFRDTC4KKyAqIHNhdmVkX3NjYmlkIGlzIGRlcmVmZXJlbmNlZCBhbmQgc2V0IHRvIHRoZQorICogc2NiaWQgdGhhdCBzaG91bGQgYmUgcmVzdG9yZWQgb25jZSBtYW5pcHVhbHRpb24KKyAqIG9mIHRoZSBUQ0wgZW50cnkgaXMgY29tcGxldGUuCisgKi8KK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2luZGV4X2J1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgKnNhdmVkX3NjYmlkLCB1X2ludCB0Y2wpCit7CisJLyoKKwkgKiBJbmRleCB0byB0aGUgU0NCIHRoYXQgY29udGFpbnMgdGhlIGJ1c3kgZW50cnkuCisJICovCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJKnNhdmVkX3NjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlhaGRfc2V0X3NjYnB0cihhaGQsIFRDTF9MVU4odGNsKQorCQkgICAgIHwgKChUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpICYgMHhDKSA8PCA0KSk7CisKKwkvKgorCSAqIEFuZCBub3cgY2FsY3VsYXRlIHRoZSBTQ0Igb2Zmc2V0IHRvIHRoZSBlbnRyeS4KKwkgKiBFYWNoIGVudHJ5IGlzIDIgYnl0ZXMgd2lkZSwgaGVuY2UgdGhlCisJICogbXVsdGlwbGljYXRpb24gYnkgMi4KKwkgKi8KKwlyZXR1cm4gKCgoVENMX1RBUkdFVF9PRkZTRVQodGNsKSAmIDB4MykgPDwgMSkgKyBTQ0JfRElTQ09OTkVDVEVEX0xJU1RTKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgdW50YWdnZWQgdHJhbnNhY3Rpb24gaWQgZm9yIGEgZ2l2ZW4gdGFyZ2V0L2NoYW5uZWwgbHVuLgorICovCit1X2ludAorYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCit7CisJdV9pbnQgc2NiaWQ7CisJdV9pbnQgc2NiX29mZnNldDsKKwl1X2ludCBzYXZlZF9zY2JwdHI7CisJCQorCXNjYl9vZmZzZXQgPSBhaGRfaW5kZXhfYnVzeV90Y2woYWhkLCAmc2F2ZWRfc2NicHRyLCB0Y2wpOworCXNjYmlkID0gYWhkX2lud19zY2JyYW0oYWhkLCBzY2Jfb2Zmc2V0KTsKKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkX3NjYnB0cik7CisJcmV0dXJuIChzY2JpZCk7Cit9CisKK3ZvaWQKK2FoZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCwgdV9pbnQgc2NiaWQpCit7CisJdV9pbnQgc2NiX29mZnNldDsKKwl1X2ludCBzYXZlZF9zY2JwdHI7CisJCQorCXNjYl9vZmZzZXQgPSBhaGRfaW5kZXhfYnVzeV90Y2woYWhkLCAmc2F2ZWRfc2NicHRyLCB0Y2wpOworCWFoZF9vdXR3KGFoZCwgc2NiX29mZnNldCwgc2NiaWQpOworCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NicHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNDQiBhbmQgU0NCIHF1ZXVlIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYWhkX21hdGNoX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IHRhcmdldCwKKwkgICAgICBjaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUpCit7CisJaW50IHRhcmcgPSBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYik7CisJY2hhciBjaGFuID0gU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKTsKKwlpbnQgc2x1biA9IFNDQl9HRVRfTFVOKHNjYik7CisJaW50IG1hdGNoOworCisJbWF0Y2ggPSAoKGNoYW4gPT0gY2hhbm5lbCkgfHwgKGNoYW5uZWwgPT0gQUxMX0NIQU5ORUxTKSk7CisJaWYgKG1hdGNoICE9IDApCisJCW1hdGNoID0gKCh0YXJnID09IHRhcmdldCkgfHwgKHRhcmdldCA9PSBDQU1fVEFSR0VUX1dJTERDQVJEKSk7CisJaWYgKG1hdGNoICE9IDApCisJCW1hdGNoID0gKChsdW4gPT0gc2x1bikgfHwgKGx1biA9PSBDQU1fTFVOX1dJTERDQVJEKSk7CisJaWYgKG1hdGNoICE9IDApIHsKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKwkJaW50IGdyb3VwOworCisJCWdyb3VwID0gWFBUX0ZDX0dST1VQKHNjYi0+aW9fY3R4LT5jY2JfaC5mdW5jX2NvZGUpOworCQlpZiAocm9sZSA9PSBST0xFX0lOSVRJQVRPUikgeworCQkJbWF0Y2ggPSAoZ3JvdXAgIT0gWFBUX0ZDX0dST1VQX1RNT0RFKQorCQkJICAgICAgJiYgKCh0YWcgPT0gU0NCX0dFVF9UQUcoc2NiKSkKKwkJCSAgICAgICB8fCAodGFnID09IFNDQl9MSVNUX05VTEwpKTsKKwkJfSBlbHNlIGlmIChyb2xlID09IFJPTEVfVEFSR0VUKSB7CisJCQltYXRjaCA9IChncm91cCA9PSBYUFRfRkNfR1JPVVBfVE1PREUpCisJCQkgICAgICAmJiAoKHRhZyA9PSBzY2ItPmlvX2N0eC0+Y3Npby50YWdfaWQpCisJCQkgICAgICAgfHwgKHRhZyA9PSBTQ0JfTElTVF9OVUxMKSk7CisJCX0KKyNlbHNlIC8qICFBSERfVEFSR0VUX01PREUgKi8KKwkJbWF0Y2ggPSAoKHRhZyA9PSBTQ0JfR0VUX1RBRyhzY2IpKSB8fCAodGFnID09IFNDQl9MSVNUX05VTEwpKTsKKyNlbmRpZiAvKiBBSERfVEFSR0VUX01PREUgKi8KKwl9CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3ZvaWQKK2FoZF9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpbnQJdGFyZ2V0OworCWNoYXIJY2hhbm5lbDsKKwlpbnQJbHVuOworCisJdGFyZ2V0ID0gU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpOworCWx1biA9IFNDQl9HRVRfTFVOKHNjYik7CisJY2hhbm5lbCA9IFNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYik7CisJCisJYWhkX3NlYXJjaF9xaW5maWZvKGFoZCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sCisJCQkgICAvKnRhZyovU0NCX0xJU1RfTlVMTCwgUk9MRV9VTktOT1dOLAorCQkJICAgQ0FNX1JFUVVFVUVfUkVRLCBTRUFSQ0hfQ09NUExFVEUpOworCisJYWhkX3BsYXRmb3JtX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKK30KKwordm9pZAorYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBzY2IJKnByZXZfc2NiOworCWFoZF9tb2RlX3N0YXRlCSBzYXZlZF9tb2RlczsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0NIQU4sIEFIRF9NT0RFX0NDSEFOKTsKKwlwcmV2X3NjYiA9IE5VTEw7CisJaWYgKGFoZF9xaW5maWZvX2NvdW50KGFoZCkgIT0gMCkgeworCQl1X2ludCBwcmV2X3RhZzsKKwkJdV9pbnQgcHJldl9wb3M7CisKKwkJcHJldl9wb3MgPSBBSERfUUlOX1dSQVAoYWhkLT5xaW5maWZvbmV4dCAtIDEpOworCQlwcmV2X3RhZyA9IGFoZC0+cWluZmlmb1twcmV2X3Bvc107CisJCXByZXZfc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBwcmV2X3RhZyk7CisJfQorCWFoZF9xaW5maWZvX3JlcXVldWUoYWhkLCBwcmV2X3NjYiwgc2NiKTsKKwlhaGRfc2V0X2huc2NiX3FvZmYoYWhkLCBhaGQtPnFpbmZpZm9uZXh0KTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9xaW5maWZvX3JlcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpwcmV2X3NjYiwKKwkJICAgIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpZiAocHJldl9zY2IgPT0gTlVMTCkgeworCQl1aW50MzJfdCBidXNhZGRyOworCisJCWJ1c2FkZHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcik7CisJCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAwLCBidXNhZGRyICYgMHhGRik7CisJCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOworCQlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMiwgKGJ1c2FkZHIgPj4gMTYpICYgMHhGRik7CisJCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAzLCAoYnVzYWRkciA+PiAyNCkgJiAweEZGKTsKKwl9IGVsc2UgeworCQlwcmV2X3NjYi0+aHNjYi0+bmV4dF9oc2NiX2J1c2FkZHIgPSBzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcjsKKwkJYWhkX3N5bmNfc2NiKGFoZCwgcHJldl9zY2IsIAorCQkJICAgICBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKKwl9CisJYWhkLT5xaW5maWZvW0FIRF9RSU5fV1JBUChhaGQtPnFpbmZpZm9uZXh0KV0gPSBTQ0JfR0VUX1RBRyhzY2IpOworCWFoZC0+cWluZmlmb25leHQrKzsKKwlzY2ItPmhzY2ItPm5leHRfaHNjYl9idXNhZGRyID0gYWhkLT5uZXh0X3F1ZXVlZF9oc2NiLT5oc2NiX2J1c2FkZHI7CisJYWhkX3N5bmNfc2NiKGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKK30KKworc3RhdGljIGludAorYWhkX3FpbmZpZm9fY291bnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IHFpbnBvczsKKwl1X2ludCB3cmFwX3FpbnBvczsKKwl1X2ludCB3cmFwX3FpbmZpZm9uZXh0OworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlxaW5wb3MgPSBhaGRfZ2V0X3Nuc2NiX3FvZmYoYWhkKTsKKwl3cmFwX3FpbnBvcyA9IEFIRF9RSU5fV1JBUChxaW5wb3MpOworCXdyYXBfcWluZmlmb25leHQgPSBBSERfUUlOX1dSQVAoYWhkLT5xaW5maWZvbmV4dCk7CisJaWYgKHdyYXBfcWluZmlmb25leHQgPj0gd3JhcF9xaW5wb3MpCisJCXJldHVybiAod3JhcF9xaW5maWZvbmV4dCAtIHdyYXBfcWlucG9zKTsKKwllbHNlCisJCXJldHVybiAod3JhcF9xaW5maWZvbmV4dAorCQkgICAgICArIE5VTV9FTEVNRU5UUyhhaGQtPnFpbmZpZm8pIC0gd3JhcF9xaW5wb3MpOworfQorCit2b2lkCithaGRfcmVzZXRfY21kc19wZW5kaW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJCXNjYiAqc2NiOworCWFoZF9tb2RlX3N0YXRlCXNhdmVkX21vZGVzOworCXVfaW50CQlwZW5kaW5nX2NtZHM7CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIERvbid0IGNvdW50IGFueSBjb21tYW5kcyBhcyBvdXRzdGFuZGluZyB0aGF0IHRoZQorCSAqIHNlcXVlbmNlciBoYXMgYWxyZWFkeSBtYXJrZWQgZm9yIGNvbXBsZXRpb24uCisJICovCisJYWhkX2ZsdXNoX3FvdXRmaWZvKGFoZCk7CisKKwlwZW5kaW5nX2NtZHMgPSAwOworCUxJU1RfRk9SRUFDSChzY2IsICZhaGQtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQlwZW5kaW5nX2NtZHMrKzsKKwl9CisJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIHBlbmRpbmdfY21kcyAtIGFoZF9xaW5maWZvX2NvdW50KGFoZCkpOworCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWFoZC0+ZmxhZ3MgJj0gfkFIRF9VUERBVEVfUEVORF9DTURTOworfQorCitpbnQKK2FoZF9zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkgICBhaGRfc2VhcmNoX2FjdGlvbiBhY3Rpb24pCit7CisJc3RydWN0IHNjYgkqc2NiOworCXN0cnVjdCBzY2IJKnByZXZfc2NiOworCWFoZF9tb2RlX3N0YXRlCSBzYXZlZF9tb2RlczsKKwl1X2ludAkJIHFpbnN0YXJ0OworCXVfaW50CQkgcWlucG9zOworCXVfaW50CQkgcWludGFpbDsKKwl1X2ludAkJIHRpZF9uZXh0OworCXVfaW50CQkgdGlkX3ByZXY7CisJdV9pbnQJCSBzY2JpZDsKKwl1X2ludAkJIHNhdmVkc2NicHRyOworCXVpbnQzMl90CSBidXNhZGRyOworCWludAkJIGZvdW5kOworCWludAkJIHRhcmdldHM7CisKKwkvKiBNdXN0IGJlIGluIENDSEFOIG1vZGUgKi8KKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NDSEFOLCBBSERfTU9ERV9DQ0hBTik7CisKKwkvKgorCSAqIEhhbHQgYW55IHBlbmRpbmcgU0NCIERNQS4gIFRoZSBzZXF1ZW5jZXIgd2lsbCByZWluaXRpYXRlCisJICogdGhpcyBkbWEgaWYgdGhlIHFpbmZpZm8gaXMgbm90IGVtcHR5IG9uY2Ugd2UgdW5wYXVzZS4KKwkgKi8KKwlpZiAoKGFoZF9pbmIoYWhkLCBDQ1NDQkNUTCkgJiAoQ0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSKSkKKwkgPT0gKENDQVJSRU58Q0NTQ0JFTnxDQ1NDQkRJUikpIHsKKwkJYWhkX291dGIoYWhkLCBDQ1NDQkNUTCwKKwkJCSBhaGRfaW5iKGFoZCwgQ0NTQ0JDVEwpICYgfihDQ0FSUkVOfENDU0NCRU4pKTsKKwkJd2hpbGUgKChhaGRfaW5iKGFoZCwgQ0NTQ0JDVEwpICYgKENDQVJSRU58Q0NTQ0JFTikpICE9IDApCisJCQk7CisJfQorCS8qIERldGVybWluZSBzZXF1ZW5jZXIncyBwb3NpdGlvbiBpbiB0aGUgcWluZmlmby4gKi8KKwlxaW50YWlsID0gQUhEX1FJTl9XUkFQKGFoZC0+cWluZmlmb25leHQpOworCXFpbnN0YXJ0ID0gYWhkX2dldF9zbnNjYl9xb2ZmKGFoZCk7CisJcWlucG9zID0gQUhEX1FJTl9XUkFQKHFpbnN0YXJ0KTsKKwlmb3VuZCA9IDA7CisJcHJldl9zY2IgPSBOVUxMOworCisJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfUFJJTlQpIHsKKwkJcHJpbnRmKCJxaW5zdGFydCA9ICVkIHFpbmZpZm9uZXh0ID0gJWRcblFJTkZJRk86IiwKKwkJICAgICAgIHFpbnN0YXJ0LCBhaGQtPnFpbmZpZm9uZXh0KTsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggYW4gZW1wdHkgcXVldWUuICBFbnRyaWVzIHRoYXQgYXJlIG5vdCBjaG9zZW4KKwkgKiBmb3IgcmVtb3ZhbCB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBxdWV1ZSBhcyB3ZSBnby4KKwkgKi8KKwlhaGQtPnFpbmZpZm9uZXh0ID0gcWluc3RhcnQ7CisJYnVzYWRkciA9IGFoZF9sZTMydG9oKGFoZC0+bmV4dF9xdWV1ZWRfaHNjYi0+aHNjYl9idXNhZGRyKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMCwgYnVzYWRkciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAxLCAoYnVzYWRkciA+PiA4KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgTkVYVF9RVUVVRURfU0NCX0FERFIgKyAyLCAoYnVzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIE5FWFRfUVVFVUVEX1NDQl9BRERSICsgMywgKGJ1c2FkZHIgPj4gMjQpICYgMHhGRik7CisKKwl3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpIHsKKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJxaW5wb3MgPSAlZCwgU0NCIGluZGV4ID0gJWRcbiIsCisJCQkJcWlucG9zLCBhaGQtPnFpbmZpZm9bcWlucG9zXSk7CisJCQlwYW5pYygiTG9vcCAxXG4iKTsKKwkJfQorCisJCWlmIChhaGRfbWF0Y2hfc2NiKGFoZCwgc2NiLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkgeworCQkJLyoKKwkJCSAqIFdlIGZvdW5kIGFuIHNjYiB0aGF0IG5lZWRzIHRvIGJlIGFjdGVkIG9uLgorCQkJICovCisJCQlmb3VuZCsrOworCQkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCWNhc2UgU0VBUkNIX0NPTVBMRVRFOgorCQkJeworCQkJCWNhbV9zdGF0dXMgb3N0YXQ7CisJCQkJY2FtX3N0YXR1cyBjc3RhdDsKKworCQkJCW9zdGF0ID0gYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAob3N0YXQgPT0gQ0FNX1JFUV9JTlBST0cpCisJCQkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwKKwkJCQkJCQkJICAgc3RhdHVzKTsKKwkJCQljc3RhdCA9IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYik7CisJCQkJaWYgKGNzdGF0ICE9IENBTV9SRVFfQ01QKQorCQkJCQlhaGRfZnJlZXplX3NjYihzY2IpOworCQkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisJCQkJCXByaW50ZigiSW5hY3RpdmUgU0NCIGluIHFpbmZpZm9cbiIpOworCQkJCWFoZF9kb25lKGFoZCwgc2NiKTsKKworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQl9CisJCQljYXNlIFNFQVJDSF9SRU1PVkU6CisJCQkJYnJlYWs7CisJCQljYXNlIFNFQVJDSF9QUklOVDoKKwkJCQlwcmludGYoIiAweCV4IiwgYWhkLT5xaW5maWZvW3FpbnBvc10pOworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQljYXNlIFNFQVJDSF9DT1VOVDoKKwkJCQlhaGRfcWluZmlmb19yZXF1ZXVlKGFoZCwgcHJldl9zY2IsIHNjYik7CisJCQkJcHJldl9zY2IgPSBzY2I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhaGRfcWluZmlmb19yZXF1ZXVlKGFoZCwgcHJldl9zY2IsIHNjYik7CisJCQlwcmV2X3NjYiA9IHNjYjsKKwkJfQorCQlxaW5wb3MgPSBBSERfUUlOX1dSQVAocWlucG9zKzEpOworCX0KKworCWFoZF9zZXRfaG5zY2JfcW9mZihhaGQsIGFoZC0+cWluZmlmb25leHQpOworCisJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfUFJJTlQpCisJCXByaW50ZigiXG5XQUlUSU5HX1RJRF9RVUVVRVM6XG4iKTsKKworCS8qCisJICogU2VhcmNoIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0cy4gIFdlIHRyYXZlcnNlIHRoZQorCSAqIGxpc3Qgb2YgInRoZWlyIGlkcyIgd2FpdGluZyBmb3Igc2VsZWN0aW9uIGFuZCwgaWYKKwkgKiBhcHByb3ByaWF0ZSwgdHJhdmVyc2UgdGhlIFNDQnMgb2YgZWFjaCAidGhlaXIgaWQiCisJICogbG9va2luZyBmb3IgbWF0Y2hlcy4KKwkgKi8KKwlzYXZlZHNjYnB0ciA9IGFoZF9nZXRfc2NicHRyKGFoZCk7CisJdGlkX25leHQgPSBhaGRfaW53KGFoZCwgV0FJVElOR19USURfSEVBRCk7CisJdGlkX3ByZXYgPSBTQ0JfTElTVF9OVUxMOworCXRhcmdldHMgPSAwOworCWZvciAoc2NiaWQgPSB0aWRfbmV4dDsgIVNDQklEX0lTX05VTEwoc2NiaWQpOyBzY2JpZCA9IHRpZF9uZXh0KSB7CisJCXVfaW50IHRpZF9oZWFkOworCisJCS8qCisJCSAqIFdlIGxpbWl0IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgU0NCcyBzaW5jZQorCQkgKiBNS19NRVNTQUdFIFNDQnMgYXJlIG5vdCBpbiB0aGUgcGVyLXRpZCBsaXN0cy4KKwkJICovCisJCXRhcmdldHMrKzsKKwkJaWYgKHRhcmdldHMgPiBBSERfU0NCX01BWCkgeworCQkJcGFuaWMoIlRJRCBMSVNUIExPT1AiKTsKKwkJfQorCQlpZiAoc2NiaWQgPj0gYWhkLT5zY2JfZGF0YS5udW1zY2JzKSB7CisJCQlwcmludGYoIiVzOiBXYWl0aW5nIFRJRCBMaXN0IGluY29uc2lzdGVuY3kuICIKKwkJCSAgICAgICAiU0NCIGluZGV4ID09IDB4JXgsIHlldCBudW1zY2JzID09IDB4JXguIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCwgYWhkLT5zY2JfZGF0YS5udW1zY2JzKTsKKwkJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwkJCXBhbmljKCJmb3Igc2FmZXR5Iik7CisJCX0KKwkJc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogU0NCID0gMHgleCBOb3QgQWN0aXZlIVxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQlwYW5pYygiV2FpdGluZyBUSUQgTGlzdCB0cmF2ZXJzYWxcbiIpOworCQl9CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiaWQpOworCQl0aWRfbmV4dCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKTsKKwkJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBzY2IsIHRhcmdldCwgY2hhbm5lbCwgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkgIFNDQl9MSVNUX05VTEwsIFJPTEVfVU5LTk9XTikgPT0gMCkgeworCQkJdGlkX3ByZXYgPSBzY2JpZDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2UgZm91bmQgYSBsaXN0IG9mIHNjYnMgdGhhdCBuZWVkcyB0byBiZSBzZWFyY2hlZC4KKwkJICovCisJCWlmIChhY3Rpb24gPT0gU0VBUkNIX1BSSU5UKQorCQkJcHJpbnRmKCIgICAgICAgJWQgKCAiLCBTQ0JfR0VUX1RBUkdFVChhaGQsIHNjYikpOworCQl0aWRfaGVhZCA9IHNjYmlkOworCQlmb3VuZCArPSBhaGRfc2VhcmNoX3NjYl9saXN0KGFoZCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkgICAgIGx1biwgdGFnLCByb2xlLCBzdGF0dXMsCisJCQkJCSAgICAgYWN0aW9uLCAmdGlkX2hlYWQsCisJCQkJCSAgICAgU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpKTsKKwkJaWYgKHRpZF9oZWFkICE9IHNjYmlkKQorCQkJYWhkX3N0aXRjaF90aWRfbGlzdChhaGQsIHRpZF9wcmV2LCB0aWRfaGVhZCwgdGlkX25leHQpOworCQlpZiAoIVNDQklEX0lTX05VTEwodGlkX2hlYWQpKQorCQkJdGlkX3ByZXYgPSB0aWRfaGVhZDsKKwkJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfUFJJTlQpCisJCQlwcmludGYoIilcbiIpOworCX0KKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkc2NicHRyKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKKwlyZXR1cm4gKGZvdW5kKTsKK30KKworc3RhdGljIGludAorYWhkX3NlYXJjaF9zY2JfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJICAgIGludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cywKKwkJICAgIGFoZF9zZWFyY2hfYWN0aW9uIGFjdGlvbiwgdV9pbnQgKmxpc3RfaGVhZCwgdV9pbnQgdGlkKQoreworCXN0cnVjdAlzY2IgKnNjYjsKKwl1X2ludAlzY2JpZDsKKwl1X2ludAluZXh0OworCXVfaW50CXByZXY7CisJaW50CWZvdW5kOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlmb3VuZCA9IDA7CisJcHJldiA9IFNDQl9MSVNUX05VTEw7CisJbmV4dCA9ICpsaXN0X2hlYWQ7CisJZm9yIChzY2JpZCA9IG5leHQ7ICFTQ0JJRF9JU19OVUxMKHNjYmlkKTsgc2NiaWQgPSBuZXh0KSB7CisJCWlmIChzY2JpZCA+PSBhaGQtPnNjYl9kYXRhLm51bXNjYnMpIHsKKwkJCXByaW50ZigiJXM6U0NCIExpc3QgaW5jb25zaXN0ZW5jeS4gIgorCQkJICAgICAgICJTQ0IgPT0gMHgleCwgeWV0IG51bXNjYnMgPT0gMHgleC4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksIHNjYmlkLCBhaGQtPnNjYl9kYXRhLm51bXNjYnMpOworCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQkJcGFuaWMoImZvciBzYWZldHkiKTsKKwkJfQorCQlzY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIHNjYmlkKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBTQ0IgPSAlZCBOb3QgQWN0aXZlIVxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpLCBzY2JpZCk7CisJCQlwYW5pYygiV2FpdGluZyBMaXN0IHRyYXZlcnNhbFxuIik7CisJCX0KKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JpZCk7CisJCW5leHQgPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUKTsKKwkJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBzY2IsIHRhcmdldCwgY2hhbm5lbCwKKwkJCQkgIGx1biwgU0NCX0xJU1RfTlVMTCwgcm9sZSkgPT0gMCkgeworCQkJcHJldiA9IHNjYmlkOworCQkJY29udGludWU7CisJCX0KKwkJZm91bmQrKzsKKwkJc3dpdGNoIChhY3Rpb24pIHsKKwkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCXsKKwkJCWNhbV9zdGF0dXMgb3N0YXQ7CisJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQlvc3RhdCA9IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYik7CisJCQlpZiAob3N0YXQgPT0gQ0FNX1JFUV9JTlBST0cpCisJCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBzdGF0dXMpOworCQkJY3N0YXQgPSBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJaWYgKGNzdGF0ICE9IENBTV9SRVFfQ01QKQorCQkJCWFoZF9mcmVlemVfc2NiKHNjYik7CisJCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKQorCQkJCXByaW50ZigiSW5hY3RpdmUgU0NCIGluIFdhaXRpbmcgTGlzdFxuIik7CisJCQlhaGRfZG9uZShhaGQsIHNjYik7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQl9CisJCWNhc2UgU0VBUkNIX1JFTU9WRToKKwkJCWFoZF9yZW1fd3NjYihhaGQsIHNjYmlkLCBwcmV2LCBuZXh0LCB0aWQpOworCQkJaWYgKHByZXYgPT0gU0NCX0xJU1RfTlVMTCkKKwkJCQkqbGlzdF9oZWFkID0gbmV4dDsKKwkJCWJyZWFrOworCQljYXNlIFNFQVJDSF9QUklOVDoKKwkJCXByaW50ZigiMHgleCAiLCBzY2JpZCk7CisJCWNhc2UgU0VBUkNIX0NPVU5UOgorCQkJcHJldiA9IHNjYmlkOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZvdW5kID4gQUhEX1NDQl9NQVgpCisJCQlwYW5pYygiU0NCIExJU1QgTE9PUCIpOworCX0KKwlpZiAoYWN0aW9uID09IFNFQVJDSF9DT01QTEVURQorCSB8fCBhY3Rpb24gPT0gU0VBUkNIX1JFTU9WRSkKKwkJYWhkX291dHcoYWhkLCBDTURTX1BFTkRJTkcsIGFoZF9pbncoYWhkLCBDTURTX1BFTkRJTkcpIC0gZm91bmQpOworCXJldHVybiAoZm91bmQpOworfQorCitzdGF0aWMgdm9pZAorYWhkX3N0aXRjaF90aWRfbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRpZF9wcmV2LAorCQkgICAgdV9pbnQgdGlkX2N1ciwgdV9pbnQgdGlkX25leHQpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKworCWlmIChTQ0JJRF9JU19OVUxMKHRpZF9jdXIpKSB7CisKKwkJLyogQnlwYXNzIGN1cnJlbnQgVElEIGxpc3QgKi8KKwkJaWYgKFNDQklEX0lTX05VTEwodGlkX3ByZXYpKSB7CisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX0hFQUQsIHRpZF9uZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWFoZF9zZXRfc2NicHRyKGFoZCwgdGlkX3ByZXYpOworCQkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVDIsIHRpZF9uZXh0KTsKKwkJfQorCQlpZiAoU0NCSURfSVNfTlVMTCh0aWRfbmV4dCkpCisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX1RBSUwsIHRpZF9wcmV2KTsKKwl9IGVsc2UgeworCisJCS8qIFN0aXRjaCB0aHJvdWdoIHRpZF9jdXIgKi8KKwkJaWYgKFNDQklEX0lTX05VTEwodGlkX3ByZXYpKSB7CisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX0hFQUQsIHRpZF9jdXIpOworCQl9IGVsc2UgeworCQkJYWhkX3NldF9zY2JwdHIoYWhkLCB0aWRfcHJldik7CisJCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhUMiwgdGlkX2N1cik7CisJCX0KKwkJYWhkX3NldF9zY2JwdHIoYWhkLCB0aWRfY3VyKTsKKwkJYWhkX291dHcoYWhkLCBTQ0JfTkVYVDIsIHRpZF9uZXh0KTsKKworCQlpZiAoU0NCSURfSVNfTlVMTCh0aWRfbmV4dCkpCisJCQlhaGRfb3V0dyhhaGQsIFdBSVRJTkdfVElEX1RBSUwsIHRpZF9jdXIpOworCX0KK30KKworLyoKKyAqIE1hbmlwdWxhdGUgdGhlIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBzY2IgdGhhdCBmb2xsb3dzIHRoZSBvbmUgdGhhdCB3ZSByZW1vdmUuCisgKi8KK3N0YXRpYyB1X2ludAorYWhkX3JlbV93c2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgc2NiaWQsCisJICAgICB1X2ludCBwcmV2LCB1X2ludCBuZXh0LCB1X2ludCB0aWQpCit7CisJdV9pbnQgdGFpbF9vZmZzZXQ7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCWlmICghU0NCSURfSVNfTlVMTChwcmV2KSkgeworCQlhaGRfc2V0X3NjYnB0cihhaGQsIHByZXYpOworCQlhaGRfb3V0dyhhaGQsIFNDQl9ORVhULCBuZXh0KTsKKwl9CisKKwkvKgorCSAqIFNDQnMgdGhhdCBoYWQgTUtfTUVTU0FHRSBzZXQgaW4gdGhlbSB3aWxsIG5vdAorCSAqIGJlIHF1ZXVlZCB0byB0aGUgcGVyLXRhcmdldCBsaXN0cywgc28gZG9uJ3QKKwkgKiBibGluZGx5IGNsZWFyIHRoZSB0YWlsIHBvaW50ZXIuCisJICovCisJdGFpbF9vZmZzZXQgPSBXQUlUSU5HX1NDQl9UQUlMUyArICgyICogdGlkKTsKKwlpZiAoU0NCSURfSVNfTlVMTChuZXh0KQorCSAmJiBhaGRfaW53KGFoZCwgdGFpbF9vZmZzZXQpID09IHNjYmlkKQorCQlhaGRfb3V0dyhhaGQsIHRhaWxfb2Zmc2V0LCBwcmV2KTsKKwlhaGRfYWRkX3NjYl90b19mcmVlX2xpc3QoYWhkLCBzY2JpZCk7CisJcmV0dXJuIChuZXh0KTsKK30KKworLyoKKyAqIEFkZCB0aGUgU0NCIGFzIHNlbGVjdGVkIGJ5IFNDQlBUUiBvbnRvIHRoZSBvbiBjaGlwIGxpc3Qgb2YKKyAqIGZyZWUgaGFyZHdhcmUgU0NCcy4gIFRoaXMgbGlzdCBpcyBlbXB0eS91bnVzZWQgaWYgd2UgYXJlIG5vdAorICogcGVyZm9ybWluZyBTQ0IgcGFnaW5nLgorICovCitzdGF0aWMgdm9pZAorYWhkX2FkZF9zY2JfdG9fZnJlZV9saXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgc2NiaWQpCit7CisvKiBYWFggTmVlZCBzb21lIG90aGVyIG1lY2hhbmlzbSB0byBkZXNpZ25hdGUgImZyZWUiLiAqLworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgdGFnIHNvIHRoYXQgb3VyIGFib3J0CisJICogcm91dGluZXMgZG9uJ3QgdGhpbmsgaXQncyBhY3RpdmUuCisJYWhkX291dGIoYWhkLCBTQ0JfVEFHLCBTQ0JfTElTVF9OVUxMKTsKKwkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVycm9yIEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBYm9ydCBhbGwgU0NCcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBkZXNjcmlwdGlvbiAodGFyZ2V0L2NoYW5uZWwvbHVuL3RhZyksCisgKiBzZXR0aW5nIHRoZWlyIHN0YXR1cyB0byB0aGUgcGFzc2VkIGluIHN0YXR1cyBpZiB0aGUgc3RhdHVzIGhhcyBub3QgYWxyZWFkeQorICogYmVlbiBtb2RpZmllZCBmcm9tIENBTV9SRVFfSU5QUk9HLiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgc2VxdWVuY2VyCisgKiBpcyBwYXVzZWQgYmVmb3JlIGl0IGlzIGNhbGxlZC4KKyAqLworaW50CithaGRfYWJvcnRfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkgICAgICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQoreworCXN0cnVjdAkJc2NiICpzY2JwOworCXN0cnVjdAkJc2NiICpzY2JwX25leHQ7CisJdV9pbnQJCWksIGo7CisJdV9pbnQJCW1heHRhcmdldDsKKwl1X2ludAkJbWlubHVuOworCXVfaW50CQltYXhsdW47CisJaW50CQlmb3VuZDsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKworCS8qIHJlc3RvcmUgdGhpcyB3aGVuIHdlJ3JlIGRvbmUgKi8KKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCisJZm91bmQgPSBhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgU0NCX0xJU1RfTlVMTCwKKwkJCQkgICByb2xlLCBDQU1fUkVRVUVVRV9SRVEsIFNFQVJDSF9DT01QTEVURSk7CisKKwkvKgorCSAqIENsZWFuIG91dCB0aGUgYnVzeSB0YXJnZXQgdGFibGUgZm9yIGFueSB1bnRhZ2dlZCBjb21tYW5kcy4KKwkgKi8KKwlpID0gMDsKKwltYXh0YXJnZXQgPSAxNjsKKwlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJaSA9IHRhcmdldDsKKwkJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQkJaSArPSA4OworCQltYXh0YXJnZXQgPSBpICsgMTsKKwl9CisKKwlpZiAobHVuID09IENBTV9MVU5fV0lMRENBUkQpIHsKKwkJbWlubHVuID0gMDsKKwkJbWF4bHVuID0gQUhEX05VTV9MVU5TX05PTlBLVDsKKwl9IGVsc2UgaWYgKGx1biA+PSBBSERfTlVNX0xVTlNfTk9OUEtUKSB7CisJCW1pbmx1biA9IG1heGx1biA9IDA7CisJfSBlbHNlIHsKKwkJbWlubHVuID0gbHVuOworCQltYXhsdW4gPSBsdW4gKyAxOworCX0KKworCWlmIChyb2xlICE9IFJPTEVfVEFSR0VUKSB7CisJCWZvciAoO2kgPCBtYXh0YXJnZXQ7IGkrKykgeworCQkJZm9yIChqID0gbWlubHVuO2ogPCBtYXhsdW47IGorKykgeworCQkJCXVfaW50IHNjYmlkOworCQkJCXVfaW50IHRjbDsKKworCQkJCXRjbCA9IEJVSUxEX1RDTF9SQVcoaSwgJ0EnLCBqKTsKKwkJCQlzY2JpZCA9IGFoZF9maW5kX2J1c3lfdGNsKGFoZCwgdGNsKTsKKwkJCQlzY2JwID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBzY2JpZCk7CisJCQkJaWYgKHNjYnAgPT0gTlVMTAorCQkJCSB8fCBhaGRfbWF0Y2hfc2NiKGFoZCwgc2NicCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJICBsdW4sIHRhZywgcm9sZSkgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJYWhkX3VuYnVzeV90Y2woYWhkLCBCVUlMRF9UQ0xfUkFXKGksICdBJywgaikpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBEb24ndCBhYm9ydCBjb21tYW5kcyB0aGF0IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQsCisJICogYnV0IGhhdmVuJ3QgcXVpdGUgbWFkZSBpdCB1cCB0byB0aGUgaG9zdCB5ZXQuCisJICovCisJYWhkX2ZsdXNoX3FvdXRmaWZvKGFoZCk7CisKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIHBlbmRpbmcgQ0NCIGxpc3QgYW5kIGxvb2sgZm9yCisJICogY29tbWFuZHMgZm9yIHRoaXMgdGFyZ2V0IHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KKwkgKiBUaGVzZSBhcmUgb3RoZXIgdGFnZ2VkIGNvbW1hbmRzIHRoYXQgd2VyZQorCSAqIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZXNldCBvY2N1cnJlZC4KKwkgKi8KKwlzY2JwX25leHQgPSBMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2Nicyk7CisJd2hpbGUgKHNjYnBfbmV4dCAhPSBOVUxMKSB7CisJCXNjYnAgPSBzY2JwX25leHQ7CisJCXNjYnBfbmV4dCA9IExJU1RfTkVYVChzY2JwLCBwZW5kaW5nX2xpbmtzKTsKKwkJaWYgKGFoZF9tYXRjaF9zY2IoYWhkLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkgeworCQkJY2FtX3N0YXR1cyBvc3RhdDsKKworCQkJb3N0YXQgPSBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwKTsKKwkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwLCBzdGF0dXMpOworCQkJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYnApICE9IENBTV9SRVFfQ01QKQorCQkJCWFoZF9mcmVlemVfc2NiKHNjYnApOworCQkJaWYgKChzY2JwLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0Igb24gcGVuZGluZyBsaXN0XG4iKTsKKwkJCWFoZF9kb25lKGFoZCwgc2NicCk7CisJCQlmb3VuZCsrOworCQl9CisJfQorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKGFoZCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZywgcm9sZSwgc3RhdHVzKTsKKwlhaGQtPmZsYWdzIHw9IEFIRF9VUERBVEVfUEVORF9DTURTOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHZvaWQKK2FoZF9yZXNldF9jdXJyZW50X2J1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDhfdCBzY3Npc2VxOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJYWhkX291dGIoYWhkLCBTSU1PREUxLCBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+RU5TQ1NJUlNUKTsKKwlzY3Npc2VxID0gYWhkX2luYihhaGQsIFNDU0lTRVEwKSAmIH4oRU5TRUxPfEVOQVJCT3xTQ1NJUlNUTyk7CisJYWhkX291dGIoYWhkLCBTQ1NJU0VRMCwgc2NzaXNlcSB8IFNDU0lSU1RPKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCWFoZF9kZWxheShBSERfQlVTUkVTRVRfREVMQVkpOworCS8qIFR1cm4gb2ZmIHRoZSBidXMgcmVzZXQgKi8KKwlhaGRfb3V0YihhaGQsIFNDU0lTRVEwLCBzY3Npc2VxKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCWFoZF9kZWxheShBSERfQlVTUkVTRVRfREVMQVkpOworCWlmICgoYWhkLT5idWdzICYgQUhEX1NDU0lSU1RfQlVHKSAhPSAwKSB7CisJCS8qCisJCSAqIDJBIFJhem9yICM0NzQKKwkJICogQ2VydGFpbiBjaGlwIHN0YXRlIGlzIG5vdCBjbGVhcmVkIGZvcgorCQkgKiBTQ1NJIGJ1cyByZXNldHMgdGhhdCB3ZSBpbml0aWF0ZSwgc28KKwkJICogd2UgbXVzdCByZXNldCB0aGUgY2hpcC4KKwkJICovCisJCWFoZF9yZXNldChhaGQsIC8qcmVpbml0Ki9UUlVFKTsKKwkJYWhkX2ludHJfZW5hYmxlKGFoZCwgLyplbmFibGUqL1RSVUUpOworCQlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwl9CisKKwlhaGRfY2xlYXJfaW50c3RhdChhaGQpOworfQorCitpbnQKK2FoZF9yZXNldF9jaGFubmVsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLCBpbnQgaW5pdGlhdGVfcmVzZXQpCit7CisJc3RydWN0CWFoZF9kZXZpbmZvIGRldmluZm87CisJdV9pbnQJaW5pdGlhdG9yOworCXVfaW50CXRhcmdldDsKKwl1X2ludAltYXhfc2NzaWlkOworCWludAlmb3VuZDsKKwl1X2ludAlmaWZvOworCXVfaW50CW5leHRfZmlmbzsKKworCWFoZC0+cGVuZGluZ19kZXZpY2UgPSBOVUxMOworCisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKKwkJCSAgICBDQU1fVEFSR0VUX1dJTERDQVJELAorCQkJICAgIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCSAgICBjaGFubmVsLCBST0xFX1VOS05PV04pOworCWFoZF9wYXVzZShhaGQpOworCisJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoZCk7CisKKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkgeworCQlhaGRfcnVuX3RxaW5maWZvKGFoZCwgLypwYXVzZWQqL1RSVUUpOworCX0KKyNlbmRpZgorCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKworCS8qCisJICogRGlzYWJsZSBzZWxlY3Rpb25zIHNvIG5vIGF1dG9tYXRpYyBoYXJkd2FyZQorCSAqIGZ1bmN0aW9ucyB3aWxsIG1vZGlmeSBjaGlwIHN0YXRlLgorCSAqLworCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTAsIDApOworCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTEsIDApOworCisJLyoKKwkgKiBTYWZlbHkgc2h1dCBkb3duIG91ciBETUEgZW5naW5lcy4gIEFsd2F5cyBzdGFydCB3aXRoCisJICogdGhlIEZJRk8gdGhhdCBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSAoaWYgYW55IGFyZQorCSAqIGFjdGl2ZWx5IGNvbm5lY3RlZCkuCisJICovCisJbmV4dF9maWZvID0gZmlmbyA9IGFoZF9pbmIoYWhkLCBERkZTVEFUKSAmIENVUlJGSUZPOworCWlmIChuZXh0X2ZpZm8gPiBDVVJSRklGT18xKQorCQkvKiBJZiBkaXNjb25uZWNlZCwgYXJiaXRyYXJpbHkgc3RhcnQgd2l0aCBGSUZPMS4gKi8KKwkJbmV4dF9maWZvID0gZmlmbyA9IDA7CisJZG8geworCQluZXh0X2ZpZm8gXj0gQ1VSUkZJRk9fMTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIG5leHRfZmlmbywgbmV4dF9maWZvKTsKKwkJYWhkX291dGIoYWhkLCBERkNOVFJMLAorCQkJIGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIH4oU0NTSUVOfEhETUFFTikpOworCQl3aGlsZSAoKGFoZF9pbmIoYWhkLCBERkNOVFJMKSAmIEhETUFFTkFDSykgIT0gMCkKKwkJCWFoZF9kZWxheSgxMCk7CisJCS8qCisJCSAqIFNldCBDVVJSRklGTyB0byB0aGUgbm93IGluYWN0aXZlIGNoYW5uZWwuCisJCSAqLworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJCWFoZF9vdXRiKGFoZCwgREZGU1RBVCwgbmV4dF9maWZvKTsKKwl9IHdoaWxlIChuZXh0X2ZpZm8gIT0gZmlmbyk7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBidXMgaWYgd2UgYXJlIGluaXRpYXRpbmcgdGhpcyByZXNldAorCSAqLworCWFoZF9jbGVhcl9tc2dfc3RhdGUoYWhkKTsKKwlhaGRfb3V0YihhaGQsIFNJTU9ERTEsCisJCSBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgJiB+KEVOQlVTRlJFRXxFTlNDU0lSU1R8RU5CVVNGUkVFKSk7CisKKwlpZiAoaW5pdGlhdGVfcmVzZXQpCisJCWFoZF9yZXNldF9jdXJyZW50X2J1cyhhaGQpOworCisJYWhkX2NsZWFyX2ludHN0YXQoYWhkKTsKKworCS8qCisJICogQ2xlYW4gdXAgYWxsIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlCisJICogcGVuZGluZyB0cmFuc2FjdGlvbnMgb24gdGhpcyBidXMuCisJICovCisJZm91bmQgPSBhaGRfYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIGNoYW5uZWwsCisJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCSAgICAgICBST0xFX1VOS05PV04sIENBTV9TQ1NJX0JVU19SRVNFVCk7CisKKwkvKgorCSAqIENsZWFudXAgYW55dGhpbmcgbGVmdCBpbiB0aGUgRklGT3MuCisJICovCisJYWhkX2NsZWFyX2ZpZm8oYWhkLCAwKTsKKwlhaGRfY2xlYXJfZmlmbyhhaGQsIDEpOworCisJLyoKKwkgKiBSZXZlcnQgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbCB3ZSByZW5lZ290aWF0ZS4KKwkgKi8KKwltYXhfc2NzaWlkID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNSA6IDc7CisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD0gbWF4X3Njc2lpZDsgdGFyZ2V0KyspIHsKKworCQlpZiAoYWhkLT5lbmFibGVkX3RhcmdldHNbdGFyZ2V0XSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZvciAoaW5pdGlhdG9yID0gMDsgaW5pdGlhdG9yIDw9IG1heF9zY3NpaWQ7IGluaXRpYXRvcisrKSB7CisJCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKworCQkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgdGFyZ2V0LCBpbml0aWF0b3IsCisJCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELAorCQkJCQkgICAgJ0EnLCBST0xFX1VOS05PV04pOworCQkJYWhkX3NldF93aWR0aChhaGQsICZkZXZpbmZvLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCSAgICAgIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkJCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgLypwZXJpb2QqLzAsCisJCQkJCSAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKKwkJCQkJIEFIRF9UUkFOU19DVVIsIC8qcGF1c2VkKi9UUlVFKTsKKwkJfQorCX0KKworI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCW1heF9zY3NpaWQgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE1IDogNzsKKworCS8qCisJICogU2VuZCBhbiBpbW1lZGlhdGUgbm90aWZ5IGNjYiB0byBhbGwgdGFyZ2V0IG1vcmUgcGVyaXBoZXJhbAorCSAqIGRyaXZlcnMgYWZmZWN0ZWQgYnkgdGhpcyBhY3Rpb24uCisJICovCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD0gbWF4X3Njc2lpZDsgdGFyZ2V0KyspIHsKKwkJc3RydWN0IGFoZF90bW9kZV90c3RhdGUqIHRzdGF0ZTsKKwkJdV9pbnQgbHVuOworCisJCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW3RhcmdldF07CisJCWlmICh0c3RhdGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGx1biA9IDA7IGx1biA8IEFIRF9OVU1fTFVOUzsgbHVuKyspIHsKKwkJCXN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl07CisJCQlpZiAobHN0YXRlID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWFoZF9xdWV1ZV9sc3RhdGVfZXZlbnQoYWhkLCBsc3RhdGUsIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCQkJCSAgICAgICBFVkVOVF9UWVBFX0JVU19SRVNFVCwgLyphcmcqLzApOworCQkJYWhkX3NlbmRfbHN0YXRlX2V2ZW50cyhhaGQsIGxzdGF0ZSk7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBOb3RpZnkgdGhlIFhQVCB0aGF0IGEgYnVzIHJlc2V0IG9jY3VycmVkICovCisJYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLmNoYW5uZWwsIENBTV9UQVJHRVRfV0lMRENBUkQsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19CVVNfUkVTRVQsIE5VTEwpOworCWFoZF9yZXN0YXJ0KGFoZCk7CisJLyoKKwkgKiBGcmVlemUgdGhlIFNJTVEgdW50aWwgb3VyIHBvbGxlciBjYW4gZGV0ZXJtaW5lIHRoYXQKKwkgKiB0aGUgYnVzIHJlc2V0IGhhcyByZWFsbHkgZ29uZSBhd2F5LiAgV2Ugc2V0IHRoZSBpbml0aWFsCisJICogdGltZXIgdG8gMCB0byBoYXZlIHRoZSBjaGVjayBwZXJmb3JtZWQgYXMgc29vbiBhcyBwb3NzaWJsZQorCSAqIGZyb20gdGhlIHRpbWVyIGNvbnRleHQuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX1BPTExfQUNUSVZFKSA9PSAwKSB7CisJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU0VUX1BPTExfQUNUSVZFOworCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKwkJYWhkX3RpbWVyX3Jlc2V0KCZhaGQtPnJlc2V0X3RpbWVyLCAwLCBhaGRfcmVzZXRfcG9sbCwgYWhkKTsKKwl9CisJcmV0dXJuIChmb3VuZCk7Cit9CisKKworI2RlZmluZSBBSERfUkVTRVRfUE9MTF9VUyAxMDAwCitzdGF0aWMgdm9pZAorYWhkX3Jlc2V0X3BvbGwodm9pZCAqYXJnKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwl1X2ludAlzY3Npc2VxMTsKKwl1X2xvbmcJbDsKKwl1X2xvbmcJczsKKwkKKwlhaGRfbGlzdF9sb2NrKCZsKTsKKwlhaGQgPSBhaGRfZmluZF9zb2Z0Yygoc3RydWN0IGFoZF9zb2Z0YyAqKWFyZyk7CisJaWYgKGFoZCA9PSBOVUxMKSB7CisJCXByaW50ZigiYWhkX3Jlc2V0X3BvbGw6IEluc3RhbmNlICVwIG5vIGxvbmdlciBleGlzdHNcbiIsIGFyZyk7CisJCWFoZF9saXN0X3VubG9jaygmbCk7CisJCXJldHVybjsKKwl9CisJYWhkX2xvY2soYWhkLCAmcyk7CisJYWhkX3BhdXNlKGFoZCk7CisJYWhkX3VwZGF0ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIENMUlNJTlQxLCBDTFJTQ1NJUlNUSSk7CisJaWYgKChhaGRfaW5iKGFoZCwgU1NUQVQxKSAmIFNDU0lSU1RJKSAhPSAwKSB7CisJCWFoZF90aW1lcl9yZXNldCgmYWhkLT5yZXNldF90aW1lciwgQUhEX1JFU0VUX1BPTExfVVMsCisJCQkJYWhkX3Jlc2V0X3BvbGwsIGFoZCk7CisJCWFoZF91bnBhdXNlKGFoZCk7CisJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCWFoZF9saXN0X3VubG9jaygmbCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXNldCBpcyBub3cgbG93LiAgQ29tcGxldGUgY2hpcCByZWluaXRpYWxpemF0aW9uLiAqLworCWFoZF9vdXRiKGFoZCwgU0lNT0RFMSwgYWhkX2luYihhaGQsIFNJTU9ERTEpIHwgRU5TQ1NJUlNUKTsKKwlzY3Npc2VxMSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFKTsKKwlhaGRfb3V0YihhaGQsIFNDU0lTRVExLCBzY3Npc2VxMSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CisJYWhkX3VucGF1c2UoYWhkKTsKKwlhaGQtPmZsYWdzICY9IH5BSERfUkVTRVRfUE9MTF9BQ1RJVkU7CisJYWhkX3VubG9jayhhaGQsICZzKTsKKwlhaGRfcmVsZWFzZV9zaW1xKGFoZCk7CisJYWhkX2xpc3RfdW5sb2NrKCZsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogU3RhdGlzdGljcyBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaGRfc3RhdF90aW1lcih2b2lkICphcmcpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlsOworCXVfbG9uZwlzOworCWludAllbmludF9jb2FsOworCQorCWFoZF9saXN0X2xvY2soJmwpOworCWFoZCA9IGFoZF9maW5kX3NvZnRjKChzdHJ1Y3QgYWhkX3NvZnRjICopYXJnKTsKKwlpZiAoYWhkID09IE5VTEwpIHsKKwkJcHJpbnRmKCJhaGRfc3RhdF90aW1lcjogSW5zdGFuY2UgJXAgbm8gbG9uZ2VyIGV4aXN0c1xuIiwgYXJnKTsKKwkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKKwkJcmV0dXJuOworCX0KKwlhaGRfbG9jayhhaGQsICZzKTsKKworCWVuaW50X2NvYWwgPSBhaGQtPmhzX21haWxib3ggJiBFTklOVF9DT0FMRVNDRTsKKwlpZiAoYWhkLT5jbWRjbXBsdF90b3RhbCA+IGFoZC0+aW50X2NvYWxlc2NpbmdfdGhyZXNob2xkKQorCQllbmludF9jb2FsIHw9IEVOSU5UX0NPQUxFU0NFOworCWVsc2UgaWYgKGFoZC0+Y21kY21wbHRfdG90YWwgPCBhaGQtPmludF9jb2FsZXNjaW5nX3N0b3BfdGhyZXNob2xkKQorCQllbmludF9jb2FsICY9IH5FTklOVF9DT0FMRVNDRTsKKworCWlmIChlbmludF9jb2FsICE9IChhaGQtPmhzX21haWxib3ggJiBFTklOVF9DT0FMRVNDRSkpIHsKKwkJYWhkX2VuYWJsZV9jb2FsZXNjaW5nKGFoZCwgZW5pbnRfY29hbCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfSU5UX0NPQUxFU0NJTkcpICE9IDApCisJCQlwcmludGYoIiVzOiBJbnRlcnJ1cHQgY29hbGVzY2luZyAiCisJCQkgICAgICAgIm5vdyAlc2FibGVkLiBDbWRzICVkXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCQkgICAgICAgKGVuaW50X2NvYWwgJiBFTklOVF9DT0FMRVNDRSkgPyAiZW4iIDogImRpcyIsCisJCQkgICAgICAgYWhkLT5jbWRjbXBsdF90b3RhbCk7CisjZW5kaWYKKwl9CisKKwlhaGQtPmNtZGNtcGx0X2J1Y2tldCA9IChhaGQtPmNtZGNtcGx0X2J1Y2tldCsxKSAmIChBSERfU1RBVF9CVUNLRVRTLTEpOworCWFoZC0+Y21kY21wbHRfdG90YWwgLT0gYWhkLT5jbWRjbXBsdF9jb3VudHNbYWhkLT5jbWRjbXBsdF9idWNrZXRdOworCWFoZC0+Y21kY21wbHRfY291bnRzW2FoZC0+Y21kY21wbHRfYnVja2V0XSA9IDA7CisJYWhkX3RpbWVyX3Jlc2V0KCZhaGQtPnN0YXRfdGltZXIsIEFIRF9TVEFUX1VQREFURV9VUywKKwkJCWFoZF9zdGF0X3RpbWVyLCBhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJYWhkX2xpc3RfdW5sb2NrKCZsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTdGF0dXMgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FoZF9oYW5kbGVfc2NiX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpZiAoc2NiLT5oc2NiLT5zaGFyZWRfZGF0YS5pc3RhdHVzLnNjc2lfc3RhdHVzICE9IDApIHsKKwkJYWhkX2hhbmRsZV9zY3NpX3N0YXR1cyhhaGQsIHNjYik7CisJfSBlbHNlIHsKKwkJYWhkX2NhbGNfcmVzaWR1YWwoYWhkLCBzY2IpOworCQlhaGRfZG9uZShhaGQsIHNjYik7CisJfQorfQorCit2b2lkCithaGRfaGFuZGxlX3Njc2lfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisJdV9pbnQgIHFmcmVlemVfY250OworCisJLyoKKwkgKiBUaGUgc2VxdWVuY2VyIGZyZWV6ZXMgaXRzIHNlbGVjdC1vdXQgcXVldWUKKwkgKiBhbnl0aW1lIGEgU0NTSSBzdGF0dXMgZXJyb3Igb2NjdXJzLiAgV2UgbXVzdAorCSAqIGhhbmRsZSB0aGUgZXJyb3IgYW5kIGRlY3JlbWVudCB0aGUgUUZSRUVaRSBjb3VudAorCSAqIHRvIGFsbG93IHRoZSBzZXF1ZW5jZXIgdG8gY29udGludWUuCisJICovCisJaHNjYiA9IHNjYi0+aHNjYjsgCisKKwkvKiBGcmVlemUgdGhlIHF1ZXVlIHVudGlsIHRoZSBjbGllbnQgc2VlcyB0aGUgZXJyb3IuICovCisJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwlhaGRfZnJlZXplX3NjYihzY2IpOworCXFmcmVlemVfY250ID0gYWhkX2ludyhhaGQsIFFGUkVFWkVfQ09VTlQpOworCWlmIChxZnJlZXplX2NudCA9PSAwKSB7CisJCXByaW50ZigiJXM6IEJhZCBzdGF0dXMgd2l0aCAwIHFmcmVlemUgY291bnQhXG4iLCBhaGRfbmFtZShhaGQpKTsKKwl9IGVsc2UgeworCQlxZnJlZXplX2NudC0tOworCQlhaGRfb3V0dyhhaGQsIFFGUkVFWkVfQ09VTlQsIHFmcmVlemVfY250KTsKKwl9CisJaWYgKHFmcmVlemVfY250ID09IDApCisJCWFoZF9vdXRiKGFoZCwgU0VRX0ZMQUdTMiwKKwkJCSBhaGRfaW5iKGFoZCwgU0VRX0ZMQUdTMikgJiB+U0VMRUNUT1VUX1FGUk9aRU4pOworCisJLyogRG9uJ3Qgd2FudCB0byBjbG9iYmVyIHRoZSBvcmlnaW5hbCBzZW5zZSBjb2RlICovCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBTQ0JfU0VOU0UgRmxhZyBhbmQgcGVyZm9ybQorCQkgKiBhIG5vcm1hbCBjb21tYW5kIGNvbXBsZXRpb24uCisJCSAqLworCQlzY2ItPmZsYWdzICY9IH5TQ0JfU0VOU0U7CisJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0FVVE9TRU5TRV9GQUlMKTsKKwkJYWhkX2RvbmUoYWhkLCBzY2IpOworCQlyZXR1cm47CisJfQorCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SKTsKKwlhaGRfc2V0X3Njc2lfc3RhdHVzKHNjYiwgaHNjYi0+c2hhcmVkX2RhdGEuaXN0YXR1cy5zY3NpX3N0YXR1cyk7CisJc3dpdGNoIChoc2NiLT5zaGFyZWRfZGF0YS5pc3RhdHVzLnNjc2lfc3RhdHVzKSB7CisJY2FzZSBTVEFUVVNfUEtUX1NFTlNFOgorCXsKKwkJc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqc2l1OworCisJCWFoZF9zeW5jX3NlbnNlKGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJCXNpdSA9IChzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICopc2NiLT5zZW5zZV9kYXRhOworCQlhaGRfc2V0X3Njc2lfc3RhdHVzKHNjYiwgc2l1LT5zdGF0dXMpOworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSAhPSAwKSB7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNDQiAweCV4IFJlY2VpdmVkIFBLVCBTdGF0dXMgb2YgMHgleFxuIiwKKwkJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpLCBzaXUtPnN0YXR1cyk7CisJCQlwcmludGYoIlx0ZmxhZ3MgPSAweCV4LCBzZW5zZSBsZW4gPSAweCV4LCAiCisJCQkgICAgICAgInBrdGZhaWwgPSAweCV4XG4iLAorCQkJICAgICAgIHNpdS0+ZmxhZ3MsIHNjc2lfNGJ0b3VsKHNpdS0+c2Vuc2VfbGVuZ3RoKSwKKwkJCSAgICAgICBzY3NpXzRidG91bChzaXUtPnBrdF9mYWlsdXJlc19sZW5ndGgpKTsKKwkJfQorI2VuZGlmCisJCWlmICgoc2l1LT5mbGFncyAmIFNJVV9SU1BWQUxJRCkgIT0gMCkgeworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJaWYgKHNjc2lfNGJ0b3VsKHNpdS0+cGt0X2ZhaWx1cmVzX2xlbmd0aCkgPCA0KSB7CisJCQkJcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgcGt0X2ZhaWx1cmVzXG4iKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlzd2l0Y2ggKFNJVV9QS1RGQUlMX0NPREUoc2l1KSkgeworCQkJCWNhc2UgU0lVX1BGQ19OT05FOgorCQkJCQlwcmludGYoIk5vIHBhY2tldCBmYWlsdXJlIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTSVVfUEZDX0NJVV9GSUVMRFNfSU5WQUxJRDoKKwkJCQkJcHJpbnRmKCJJbnZhbGlkIENvbW1hbmQgSVUgRmllbGRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNJVV9QRkNfVE1GX05PVF9TVVBQT1JURUQ6CisJCQkJCXByaW50ZigiVE1GIG5vdCBzdXBwb3J0ZFxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0lVX1BGQ19UTUZfRkFJTEVEOgorCQkJCQlwcmludGYoIlRNRiBmYWlsZWRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNJVV9QRkNfSU5WQUxJRF9UWVBFX0NPREU6CisJCQkJCXByaW50ZigiSW52YWxpZCBMX1EgVHlwZSBjb2RlXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTSVVfUEZDX0lMTEVHQUxfUkVRVUVTVDoKKwkJCQkJcHJpbnRmKCJJbGxlZ2FsIHJlcXVlc3RcbiIpOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChzaXUtPnN0YXR1cyA9PSBTQ1NJX1NUQVRVU19PSykKKwkJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsCisJCQkJCQkJICAgQ0FNX1JFUV9DTVBfRVJSKTsKKwkJfQorCQlpZiAoKHNpdS0+ZmxhZ3MgJiBTSVVfU05TVkFMSUQpICE9IDApIHsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX1BLVF9TRU5TRTsKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfU0VOU0UpICE9IDApCisJCQkJcHJpbnRmKCJTZW5zZSBkYXRhIGF2YWlsYWJsZVxuIik7CisjZW5kaWYKKwkJfQorCQlhaGRfZG9uZShhaGQsIHNjYik7CisJCWJyZWFrOworCX0KKwljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCWNhc2UgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORDoKKwl7CisJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QgYWhkX2RtYV9zZWcgKnNnOworCQlzdHJ1Y3Qgc2NzaV9zZW5zZSAqc2M7CisJCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0YXJnX2luZm87CisJCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCXN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbzsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1NFTlNFKSB7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNDQiAlZDogcmVxdWVzdHMgQ2hlY2sgU3RhdHVzXG4iLAorCQkJICAgICAgIFNDQl9HRVRfVEFHKHNjYikpOworCQl9CisjZW5kaWYKKworCQlpZiAoYWhkX3BlcmZvcm1fYXV0b3NlbnNlKHNjYikgPT0gMCkKKwkJCWJyZWFrOworCisJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIFNDQl9HRVRfT1VSX0lEKHNjYiksCisJCQkJICAgIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQkgICAgU0NCX0dFVF9MVU4oc2NiKSwKKwkJCQkgICAgU0NCX0dFVF9DSEFOTkVMKGFoZCwgc2NiKSwKKwkJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQl0YXJnX2luZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwKKwkJCQkJCWRldmluZm8uY2hhbm5lbCwKKwkJCQkJCWRldmluZm8ub3VyX3Njc2lpZCwKKwkJCQkJCWRldmluZm8udGFyZ2V0LAorCQkJCQkJJnRzdGF0ZSk7CisJCXRpbmZvID0gJnRhcmdfaW5mby0+Y3VycjsKKwkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCXNjID0gKHN0cnVjdCBzY3NpX3NlbnNlICopaHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiOworCQkvKgorCQkgKiBTYXZlIG9mZiB0aGUgcmVzaWR1YWwgaWYgdGhlcmUgaXMgb25lLgorCQkgKi8KKwkJYWhkX3VwZGF0ZV9yZXNpZHVhbChhaGQsIHNjYik7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgeworCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJcHJpbnRmKCJTZW5kaW5nIFNlbnNlXG4iKTsKKwkJfQorI2VuZGlmCisJCXNjYi0+c2dfY291bnQgPSAwOworCQlzZyA9IGFoZF9zZ19zZXR1cChhaGQsIHNjYiwgc2csIGFoZF9nZXRfc2Vuc2VfYnVmYWRkcihhaGQsIHNjYiksCisJCQkJICBhaGRfZ2V0X3NlbnNlX2J1ZnNpemUoYWhkLCBzY2IpLAorCQkJCSAgLypsYXN0Ki9UUlVFKTsKKwkJc2MtPm9wY29kZSA9IFJFUVVFU1RfU0VOU0U7CisJCXNjLT5ieXRlMiA9IDA7CisJCWlmICh0aW5mby0+cHJvdG9jb2xfdmVyc2lvbiA8PSBTQ1NJX1JFVl8yCisJCSAmJiBTQ0JfR0VUX0xVTihzY2IpIDwgOCkKKwkJCXNjLT5ieXRlMiA9IFNDQl9HRVRfTFVOKHNjYikgPDwgNTsKKwkJc2MtPnVudXNlZFswXSA9IDA7CisJCXNjLT51bnVzZWRbMV0gPSAwOworCQlzYy0+bGVuZ3RoID0gYWhkX2dldF9zZW5zZV9idWZzaXplKGFoZCwgc2NiKTsKKwkJc2MtPmNvbnRyb2wgPSAwOworCisJCS8qCisJCSAqIFdlIGNhbid0IGFsbG93IHRoZSB0YXJnZXQgdG8gZGlzY29ubmVjdC4KKwkJICogVGhpcyB3aWxsIGJlIGFuIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGFuZAorCQkgKiBoYXZpbmcgdGhlIHRhcmdldCBkaXNjb25uZWN0IHdpbGwgbWFrZSB0aGlzCisJCSAqIHRyYW5zYWN0aW9uIGluZGVzdGluZ3Vpc2hhYmxlIGZyb20gb3V0c3RhbmRpbmcKKwkJICogdGFnZ2VkIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWhzY2ItPmNvbnRyb2wgPSAwOworCisJCS8qCisJCSAqIFRoaXMgcmVxdWVzdCBzZW5zZSBjb3VsZCBiZSBiZWNhdXNlIHRoZQorCQkgKiB0aGUgZGV2aWNlIGxvc3QgcG93ZXIgb3IgaW4gc29tZSBvdGhlcgorCQkgKiB3YXkgaGFzIGxvc3Qgb3VyIHRyYW5zZmVyIG5lZ290aWF0aW9ucy4KKwkJICogUmVuZWdvdGlhdGUgaWYgYXBwcm9wcmlhdGUuICBVbml0IGF0dGVudGlvbgorCQkgKiBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCBiZWZvcmUgYW55IGRhdGEKKwkJICogcGhhc2VzIG9jY3VyLgorCQkgKi8KKwkJaWYgKGFoZF9nZXRfcmVzaWR1YWwoc2NiKSA9PSBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpKSB7CisJCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgJmRldmluZm8sCisJCQkJCSAgICAgICB0c3RhdGUsIHRhcmdfaW5mbywKKwkJCQkJICAgICAgIEFIRF9ORUdfSUZfTk9OX0FTWU5DKTsKKwkJfQorCQlpZiAodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIGRldmluZm8udGFyZ2V0X21hc2spIHsKKwkJCWhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKwkJCXNjYi0+ZmxhZ3MgJj0KKwkJCSAgICB+KFNDQl9ORUdPVElBVEV8U0NCX0FCT1JUfFNDQl9ERVZJQ0VfUkVTRVQpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQVVUT19ORUdPVElBVEU7CisJCX0KKwkJaHNjYi0+Y2RiX2xlbiA9IHNpemVvZigqc2MpOworCQlhaGRfc2V0dXBfZGF0YV9zY2IoYWhkLCBzY2IpOworCQlzY2ItPmZsYWdzIHw9IFNDQl9TRU5TRTsKKwkJYWhkX3F1ZXVlX3NjYihhaGQsIHNjYik7CisJCS8qCisJCSAqIEVuc3VyZSB3ZSBoYXZlIGVub3VnaCB0aW1lIHRvIGFjdHVhbGx5CisJCSAqIHJldHJpZXZlIHRoZSBzZW5zZS4KKwkJICovCisJCWFoZF9zY2JfdGltZXJfcmVzZXQoc2NiLCA1ICogMTAwMDAwMCk7CisJCWJyZWFrOworCX0KKwljYXNlIFNDU0lfU1RBVFVTX09LOgorCQlwcmludGYoIiVzOiBJbnRlcnJ1cHRlZCBmb3Igc3RhdXMgb2YgMD8/P1xuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJCWFoZF9kb25lKGFoZCwgc2NiKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSByZXNpZHVhbCBmb3IgYSBqdXN0IGNvbXBsZXRlZCBTQ0IuCisgKi8KK3ZvaWQKK2FoZF9jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0IGluaXRpYXRvcl9zdGF0dXMgKnNwa3Q7CisJdWludDMyX3Qgc2dwdHI7CisJdWludDMyX3QgcmVzaWRfc2dwdHI7CisJdWludDMyX3QgcmVzaWQ7CisKKwkvKgorCSAqIDUgY2FzZXMuCisJICogMSkgTm8gcmVzaWR1YWwuCisJICogICAgU0dfU1RBVFVTX1ZBTElEIGNsZWFyIGluIHNncHRyLgorCSAqIDIpIFRyYW5zZmVybGVzcyBjb21tYW5kCisJICogMykgTmV2ZXIgcGVyZm9ybWVkIGFueSB0cmFuc2ZlcnMuCisJICogICAgc2dwdHIgaGFzIFNHX0ZVTExfUkVTSUQgc2V0LgorCSAqIDQpIE5vIHJlc2lkdWFsIGJ1dCB0YXJnZXQgZGlkIG5vdAorCSAqICAgIHNhdmUgZGF0YSBwb2ludGVycyBhZnRlciB0aGUKKwkgKiAgICBsYXN0IHRyYW5zZmVyLCBzbyBzZ3B0ciB3YXMKKwkgKiAgICBuZXZlciB1cGRhdGVkLgorCSAqIDUpIFdlIGhhdmUgYSBwYXJ0aWFsIHJlc2lkdWFsLgorCSAqICAgIFVzZSByZXNpZHVhbF9zZ3B0ciB0byBkZXRlcm1pbmUKKwkgKiAgICB3aGVyZSB3ZSBhcmUuCisJICovCisKKwloc2NiID0gc2NiLT5oc2NiOworCXNncHRyID0gYWhkX2xlMzJ0b2goaHNjYi0+c2dwdHIpOworCWlmICgoc2dwdHIgJiBTR19TVEFUVVNfVkFMSUQpID09IDApCisJCS8qIENhc2UgMSAqLworCQlyZXR1cm47CisJc2dwdHIgJj0gflNHX1NUQVRVU19WQUxJRDsKKworCWlmICgoc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDApCisJCS8qIENhc2UgMiAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIFJlc2lkdWFsIGZpZWxkcyBhcmUgdGhlIHNhbWUgaW4gYm90aAorCSAqIHRhcmdldCBhbmQgaW5pdGlhdG9yIHN0YXR1cyBwYWNrZXRzLAorCSAqIHNvIHdlIGNhbiBhbHdheXMgdXNlIHRoZSBpbml0aWF0b3IgZmllbGRzCisJICogcmVnYXJkbGVzcyBvZiB0aGUgcm9sZSBmb3IgdGhpcyBTQ0IuCisJICovCisJc3BrdCA9ICZoc2NiLT5zaGFyZWRfZGF0YS5pc3RhdHVzOworCXJlc2lkX3NncHRyID0gYWhkX2xlMzJ0b2goc3BrdC0+cmVzaWR1YWxfc2dwdHIpOworCWlmICgoc2dwdHIgJiBTR19GVUxMX1JFU0lEKSAhPSAwKSB7CisJCS8qIENhc2UgMyAqLworCQlyZXNpZCA9IGFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYik7CisJfSBlbHNlIGlmICgocmVzaWRfc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDApIHsKKwkJLyogQ2FzZSA0ICovCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKChyZXNpZF9zZ3B0ciAmIFNHX09WRVJSVU5fUkVTSUQpICE9IDApIHsKKwkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQlwcmludGYoImRhdGEgb3ZlcnJ1biBkZXRlY3RlZCBUYWcgPT0gMHgleC5cbiIsCisJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJYWhkX2ZyZWV6ZV9kZXZxKGFoZCwgc2NiKTsKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKKwkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoKHJlc2lkX3NncHRyICYgflNHX1BUUl9NQVNLKSAhPSAwKSB7CisJCXBhbmljKCJCb2d1cyByZXNpZCBzZ3B0ciB2YWx1ZSAweCV4XG4iLCByZXNpZF9zZ3B0cik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWhkX2RtYV9zZWcgKnNnOworCisJCS8qCisJCSAqIFJlbWFpbmRlciBvZiB0aGUgU0cgd2hlcmUgdGhlIHRyYW5zZmVyCisJCSAqIHN0b3BwZWQuICAKKwkJICovCisJCXJlc2lkID0gYWhkX2xlMzJ0b2goc3BrdC0+cmVzaWR1YWxfZGF0YWNudCkgJiBBSERfU0dfTEVOX01BU0s7CisJCXNnID0gYWhkX3NnX2J1c190b192aXJ0KGFoZCwgc2NiLCByZXNpZF9zZ3B0ciAmIFNHX1BUUl9NQVNLKTsKKworCQkvKiBUaGUgcmVzaWR1YWwgc2dfcHRyIGFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgc2cgKi8KKwkJc2ctLTsKKworCQkvKgorCQkgKiBBZGQgdXAgdGhlIGNvbnRlbnRzIG9mIGFsbCByZXNpZHVhbAorCQkgKiBTRyBzZWdtZW50cyB0aGF0IGFyZSBhZnRlciB0aGUgU0cgd2hlcmUKKwkJICogdGhlIHRyYW5zZmVyIHN0b3BwZWQuCisJCSAqLworCQl3aGlsZSAoKGFoZF9sZTMydG9oKHNnLT5sZW4pICYgQUhEX0RNQV9MQVNUX1NFRykgPT0gMCkgeworCQkJc2crKzsKKwkJCXJlc2lkICs9IGFoZF9sZTMydG9oKHNnLT5sZW4pICYgQUhEX1NHX0xFTl9NQVNLOworCQl9CisJfQorCWlmICgoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgPT0gMCkKKwkJYWhkX3NldF9yZXNpZHVhbChzY2IsIHJlc2lkKTsKKwllbHNlCisJCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCByZXNpZCk7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01JU0MpICE9IDApIHsKKwkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQlwcmludGYoIkhhbmRsZWQgJXNSZXNpZHVhbCBvZiAlZCBieXRlc1xuIiwKKwkJICAgICAgIChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSA/ICJTZW5zZSAiIDogIiIsIHJlc2lkKTsKKwl9CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBBSERfVEFSR0VUX01PREUKKy8qCisgKiBBZGQgYSB0YXJnZXQgbW9kZSBldmVudCB0byB0aGlzIGx1bidzIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkCithaGRfcXVldWVfbHN0YXRlX2V2ZW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZSwKKwkJICAgICAgIHVfaW50IGluaXRpYXRvcl9pZCwgdV9pbnQgZXZlbnRfdHlwZSwgdV9pbnQgZXZlbnRfYXJnKQoreworCXN0cnVjdCBhaGRfdG1vZGVfZXZlbnQgKmV2ZW50OworCWludCBwZW5kaW5nOworCisJeHB0X2ZyZWV6ZV9kZXZxKGxzdGF0ZS0+cGF0aCwgLypjb3VudCovMSk7CisJaWYgKGxzdGF0ZS0+ZXZlbnRfd19pZHggPj0gbHN0YXRlLT5ldmVudF9yX2lkeCkKKwkJcGVuZGluZyA9IGxzdGF0ZS0+ZXZlbnRfd19pZHggLSBsc3RhdGUtPmV2ZW50X3JfaWR4OworCWVsc2UKKwkJcGVuZGluZyA9IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSArIDEKKwkJCS0gKGxzdGF0ZS0+ZXZlbnRfcl9pZHggLSBsc3RhdGUtPmV2ZW50X3dfaWR4KTsKKworCWlmIChldmVudF90eXBlID09IEVWRU5UX1RZUEVfQlVTX1JFU0VUCisJIHx8IGV2ZW50X3R5cGUgPT0gTVNHX0JVU19ERVZfUkVTRVQpIHsKKwkJLyoKKwkJICogQW55IGVhcmxpZXIgZXZlbnRzIGFyZSBpcnJlbGV2YW50LCBzbyByZXNldCBvdXIgYnVmZmVyLgorCQkgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGFsbG93aW5nIHVzIHRvIGRlYWwgd2l0aCByZXNldAorCQkgKiBmbG9vZHMgKGFuIGV4dGVybmFsIGRldmljZSBob2xkaW5nIGRvd24gdGhlIHJlc2V0IGxpbmUpCisJCSAqIHdpdGhvdXQgbG9zaW5nIHRoZSBldmVudCB0aGF0IGlzIHJlYWxseSBpbnRlcmVzdGluZy4KKwkJICovCisJCWxzdGF0ZS0+ZXZlbnRfcl9pZHggPSAwOworCQlsc3RhdGUtPmV2ZW50X3dfaWR4ID0gMDsKKwkJeHB0X3JlbGVhc2VfZGV2cShsc3RhdGUtPnBhdGgsIHBlbmRpbmcsIC8qcnVucXVldWUqL0ZBTFNFKTsKKwl9CisKKwlpZiAocGVuZGluZyA9PSBBSERfVE1PREVfRVZFTlRfQlVGRkVSX1NJWkUpIHsKKwkJeHB0X3ByaW50X3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJcHJpbnRmKCJpbW1lZGlhdGUgZXZlbnQgJXg6JXggbG9zdFxuIiwKKwkJICAgICAgIGxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdLmV2ZW50X3R5cGUsCisJCSAgICAgICBsc3RhdGUtPmV2ZW50X2J1ZmZlcltsc3RhdGUtPmV2ZW50X3JfaWR4XS5ldmVudF9hcmcpOworCQlsc3RhdGUtPmV2ZW50X3JfaWR4Kys7CisJCWlmIChsc3RhdGUtPmV2ZW50X3JfaWR4ID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkKKwkJCWxzdGF0ZS0+ZXZlbnRfcl9pZHggPSAwOworCQl4cHRfcmVsZWFzZV9kZXZxKGxzdGF0ZS0+cGF0aCwgLypjb3VudCovMSwgLypydW5xdWV1ZSovRkFMU0UpOworCX0KKworCWV2ZW50ID0gJmxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfd19pZHhdOworCWV2ZW50LT5pbml0aWF0b3JfaWQgPSBpbml0aWF0b3JfaWQ7CisJZXZlbnQtPmV2ZW50X3R5cGUgPSBldmVudF90eXBlOworCWV2ZW50LT5ldmVudF9hcmcgPSBldmVudF9hcmc7CisJbHN0YXRlLT5ldmVudF93X2lkeCsrOworCWlmIChsc3RhdGUtPmV2ZW50X3dfaWR4ID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkKKwkJbHN0YXRlLT5ldmVudF93X2lkeCA9IDA7Cit9CisKKy8qCisgKiBTZW5kIGFueSB0YXJnZXQgbW9kZSBldmVudHMgcXVldWVkIHVwIHdhaXRpbmcKKyAqIGZvciBpbW1lZGlhdGUgbm90aWZ5IHJlc291cmNlcy4KKyAqLwordm9pZAorYWhkX3NlbmRfbHN0YXRlX2V2ZW50cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICpsc3RhdGUpCit7CisJc3RydWN0IGNjYl9oZHIgKmNjYmg7CisJc3RydWN0IGNjYl9pbW1lZF9ub3RpZnkgKmlub3Q7CisKKwl3aGlsZSAobHN0YXRlLT5ldmVudF9yX2lkeCAhPSBsc3RhdGUtPmV2ZW50X3dfaWR4CisJICAgICYmIChjY2JoID0gU0xJU1RfRklSU1QoJmxzdGF0ZS0+aW1tZWRfbm90aWZpZXMpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBhaGRfdG1vZGVfZXZlbnQgKmV2ZW50OworCisJCWV2ZW50ID0gJmxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdOworCQlTTElTVF9SRU1PVkVfSEVBRCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcywgc2ltX2xpbmtzLnNsZSk7CisJCWlub3QgPSAoc3RydWN0IGNjYl9pbW1lZF9ub3RpZnkgKiljY2JoOworCQlzd2l0Y2ggKGV2ZW50LT5ldmVudF90eXBlKSB7CisJCWNhc2UgRVZFTlRfVFlQRV9CVVNfUkVTRVQ6CisJCQljY2JoLT5zdGF0dXMgPSBDQU1fU0NTSV9CVVNfUkVTRVR8Q0FNX0RFVl9RRlJaTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2NiaC0+c3RhdHVzID0gQ0FNX01FU1NBR0VfUkVDVnxDQU1fREVWX1FGUlpOOworCQkJaW5vdC0+bWVzc2FnZV9hcmdzWzBdID0gZXZlbnQtPmV2ZW50X3R5cGU7CisJCQlpbm90LT5tZXNzYWdlX2FyZ3NbMV0gPSBldmVudC0+ZXZlbnRfYXJnOworCQkJYnJlYWs7CisJCX0KKwkJaW5vdC0+aW5pdGlhdG9yX2lkID0gZXZlbnQtPmluaXRpYXRvcl9pZDsKKwkJaW5vdC0+c2Vuc2VfbGVuID0gMDsKKwkJeHB0X2RvbmUoKHVuaW9uIGNjYiAqKWlub3QpOworCQlsc3RhdGUtPmV2ZW50X3JfaWR4Kys7CisJCWlmIChsc3RhdGUtPmV2ZW50X3JfaWR4ID09IEFIRF9UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkKKwkJCWxzdGF0ZS0+ZXZlbnRfcl9pZHggPSAwOworCX0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKiogU2VxdWVuY2VyIFByb2dyYW0gUGF0Y2hpbmcvRG93bmxvYWQgKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQUhEX0RVTVBfU0VRCit2b2lkCithaGRfZHVtcHNlcShzdHJ1Y3QgYWhkX3NvZnRjKiBhaGQpCit7CisJaW50IGk7CisJaW50IG1heF9wcm9nOworCisJbWF4X3Byb2cgPSAyMDQ4OworCisJYWhkX291dGIoYWhkLCBTRVFDVEwwLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKKwlhaGRfb3V0YihhaGQsIFBSR01DTlQsIDApOworCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCsxLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3Byb2c7IGkrKykgeworCQl1aW50OF90IGluc19ieXRlc1s0XTsKKworCQlhaGRfaW5zYihhaGQsIFNFUVJBTSwgaW5zX2J5dGVzLCA0KTsKKwkJcHJpbnRmKCIweCUwOHhcbiIsIGluc19ieXRlc1swXSA8PCAyNAorCQkJCSB8IGluc19ieXRlc1sxXSA8PCAxNgorCQkJCSB8IGluc19ieXRlc1syXSA8PCA4CisJCQkJIHwgaW5zX2J5dGVzWzNdKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2FoZF9sb2Fkc2VxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJY3MgY3NfdGFibGVbbnVtX2NyaXRpY2FsX3NlY3Rpb25zXTsKKwl1X2ludAliZWdpbl9zZXRbbnVtX2NyaXRpY2FsX3NlY3Rpb25zXTsKKwl1X2ludAllbmRfc2V0W251bV9jcml0aWNhbF9zZWN0aW9uc107CisJc3RydWN0CXBhdGNoICpjdXJfcGF0Y2g7CisJdV9pbnQJY3NfY291bnQ7CisJdV9pbnQJY3VyX2NzOworCXVfaW50CWk7CisJaW50CWRvd25sb2FkZWQ7CisJdV9pbnQJc2tpcF9hZGRyOworCXVfaW50CXNnX3ByZWZldGNoX2NudDsKKwl1X2ludAlzZ19wcmVmZXRjaF9jbnRfbGltaXQ7CisJdV9pbnQJc2dfcHJlZmV0Y2hfYWxpZ247CisJdV9pbnQJc2dfc2l6ZTsKKwl1aW50OF90CWRvd25sb2FkX2NvbnN0c1tET1dOTE9BRF9DT05TVF9DT1VOVF07CisKKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IERvd25sb2FkaW5nIFNlcXVlbmNlciBQcm9ncmFtLi4uIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCisjaWYgRE9XTkxPQURfQ09OU1RfQ09VTlQgIT0gNworI2Vycm9yICJEb3dubG9hZCBDb25zdCBNaXNtYXRjaCIKKyNlbmRpZgorCS8qCisJICogU3RhcnQgb3V0IHdpdGggMCBjcml0aWNhbCBzZWN0aW9ucworCSAqIHRoYXQgYXBwbHkgdG8gdGhpcyBmaXJtd2FyZSBsb2FkLgorCSAqLworCWNzX2NvdW50ID0gMDsKKwljdXJfY3MgPSAwOworCW1lbXNldChiZWdpbl9zZXQsIDAsIHNpemVvZihiZWdpbl9zZXQpKTsKKwltZW1zZXQoZW5kX3NldCwgMCwgc2l6ZW9mKGVuZF9zZXQpKTsKKworCS8qCisJICogU2V0dXAgZG93bmxvYWRhYmxlIGNvbnN0YW50IHRhYmxlLgorCSAqIAorCSAqIFRoZSBjb21wdXRhdGlvbiBmb3IgdGhlIFMvRyBwcmVmZXRjaCB2YXJpYWJsZXMgaXMKKwkgKiBhIGJpdCBjb21wbGljYXRlZC4gIFdlIHdvdWxkIGxpa2UgdG8gYWx3YXlzIGZldGNoCisJICogaW4gdGVybXMgb2YgY2FjaGVsaW5lZCBzaXplZCBpbmNyZW1lbnRzLiAgSG93ZXZlciwKKwkgKiBpZiB0aGUgY2FjaGVsaW5lIGlzIG5vdCBhbiBldmVuIG11bHRpcGxlIG9mIHRoZQorCSAqIFNHIGVsZW1lbnQgc2l6ZSBvciBpcyBsYXJnZXIgdGhhbiBvdXIgU0cgUkFNLCB1c2luZworCSAqIGp1c3QgdGhlIGNhY2hlIHNpemUgbWlnaHQgbGVhdmUgdXMgd2l0aCBvbmx5IGEgcG9ydGlvbgorCSAqIG9mIGFuIFNHIGVsZW1lbnQgYXQgdGhlIHRhaWwgb2YgYSBwcmVmZXRjaC4gIElmIHRoZQorCSAqIGNhY2hlbGluZSBpcyBsYXJnZXIgdGhhbiBvdXIgUy9HIHByZWZldGNoIGJ1ZmZlciBsZXNzCisJICogdGhlIHNpemUgb2YgYW4gU0cgZWxlbWVudCwgd2UgbWF5IHJvdW5kIGRvd24gdG8gYSBjYWNoZWxpbmUKKwkgKiB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgb3IgYWxsIG9mIHRoZSBTL0cgb2YgaW50ZXJlc3QKKwkgKiB3aXRoaW4gdGhlIGJvdW5kcyBvZiBvdXIgUy9HIHJhbS4gIFByb3ZpZGUgdmFyaWFibGVzIHRvCisJICogdGhlIHNlcXVlbmNlciB0aGF0IHdpbGwgYWxsb3cgaXQgdG8gaGFuZGxlIHRoZXNlIGVkZ2UKKwkgKiBjYXNlcy4KKwkgKi8KKwkvKiBTdGFydCBieSBhbGlnbmluZyB0byB0aGUgbmVhcmVzdCBjYWNoZWxpbmUuICovCisJc2dfcHJlZmV0Y2hfYWxpZ24gPSBhaGQtPnBjaV9jYWNoZXNpemU7CisJaWYgKHNnX3ByZWZldGNoX2FsaWduID09IDApCisJCXNnX3ByZWZldGNoX2FsaWduID0gODsKKwkvKiBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIuICovCisJd2hpbGUgKHBvd2Vyb2YyKHNnX3ByZWZldGNoX2FsaWduKSA9PSAwKQorCQlzZ19wcmVmZXRjaF9hbGlnbi0tOworCS8qCisJICogSWYgdGhlIGNhY2hlbGluZSBib3VuZGFyeSBpcyBncmVhdGVyIHRoYW4gaGFsZiBvdXIgcHJlZmV0Y2ggUkFNCisJICogd2UgcmlzayBub3QgYmVpbmcgYWJsZSB0byBmZXRjaCBldmVuIGEgc2luZ2xlIGNvbXBsZXRlIFMvRworCSAqIHNlZ21lbnQgaWYgd2UgYWxpZ24gdG8gdGhhdCBib3VuZGFyeS4KKwkgKi8KKwlpZiAoc2dfcHJlZmV0Y2hfYWxpZ24gPiBDQ1NHQUREUl9NQVgvMikKKwkJc2dfcHJlZmV0Y2hfYWxpZ24gPSBDQ1NHQUREUl9NQVgvMjsKKwkvKiBTdGFydCBieSBmZXRjaGluZyBhIHNpbmdsZSBjYWNoZWxpbmUuICovCisJc2dfcHJlZmV0Y2hfY250ID0gc2dfcHJlZmV0Y2hfYWxpZ247CisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHByZWZldGNoIGNvdW50IGJ5IGNhY2hlbGluZXMgdW50aWwKKwkgKiBhdCBsZWFzdCBvbmUgUy9HIGVsZW1lbnQgd2lsbCBmaXQuCisJICovCisJc2dfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWhkX2RtYV9zZWcpOworCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKQorCQlzZ19zaXplID0gc2l6ZW9mKHN0cnVjdCBhaGRfZG1hNjRfc2VnKTsKKwl3aGlsZSAoc2dfcHJlZmV0Y2hfY250IDwgc2dfc2l6ZSkKKwkJc2dfcHJlZmV0Y2hfY250ICs9IHNnX3ByZWZldGNoX2FsaWduOworCS8qCisJICogSWYgdGhlIGNhY2hlbGluZSBpcyBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZgorCSAqIHRoZSBTL0cgc2l6ZSwgd2UgbWF5IG9ubHkgZ2V0IGEgcGFydGlhbCBTL0cgd2hlbgorCSAqIHdlIGFsaWduLiBBZGQgYSBjYWNoZWxpbmUgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKwkgKi8KKwlpZiAoKHNnX3ByZWZldGNoX2FsaWduICUgc2dfc2l6ZSkgIT0gMAorCSAmJiAoc2dfcHJlZmV0Y2hfY250IDwgQ0NTR0FERFJfTUFYKSkKKwkJc2dfcHJlZmV0Y2hfY250ICs9IHNnX3ByZWZldGNoX2FsaWduOworCS8qCisJICogTGFzdGx5LCBjb21wdXRlIGEgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2VyIGNhbiB1c2UKKwkgKiB0byBkZXRlcm1pbmUgaWYgdGhlIHJlbWFpbmRlciBvZiB0aGUgQ0NTR1JBTSBidWZmZXIKKwkgKiBoYXMgYSBmdWxsIFMvRyBlbGVtZW50IGluIGl0LgorCSAqLworCXNnX3ByZWZldGNoX2NudF9saW1pdCA9IC0oc2dfcHJlZmV0Y2hfY250IC0gc2dfc2l6ZSArIDEpOworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9DTlRdID0gc2dfcHJlZmV0Y2hfY250OworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9DTlRfTElNSVRdID0gc2dfcHJlZmV0Y2hfY250X2xpbWl0OworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9BTElHTl9NQVNLXSA9IH4oc2dfcHJlZmV0Y2hfYWxpZ24gLSAxKTsKKwlkb3dubG9hZF9jb25zdHNbU0dfUFJFRkVUQ0hfQUREUl9NQVNLXSA9IChzZ19wcmVmZXRjaF9hbGlnbiAtIDEpOworCWRvd25sb2FkX2NvbnN0c1tTR19TSVpFT0ZdID0gc2dfc2l6ZTsKKwlkb3dubG9hZF9jb25zdHNbUEtUX09WRVJSVU5fQlVGT0ZGU0VUXSA9CisJCShhaGQtPm92ZXJydW5fYnVmIC0gKHVpbnQ4X3QgKilhaGQtPnFvdXRmaWZvKSAvIDI1NjsKKwlkb3dubG9hZF9jb25zdHNbU0NCX1RSQU5TRkVSX1NJWkVdID0gU0NCX1RSQU5TRkVSX1NJWkVfMUJZVEVfTFVOOworCWN1cl9wYXRjaCA9IHBhdGNoZXM7CisJZG93bmxvYWRlZCA9IDA7CisJc2tpcF9hZGRyID0gMDsKKwlhaGRfb3V0YihhaGQsIFNFUUNUTDAsIFBFUlJPUkRJU3xGQUlMRElTfEZBU1RNT0RFfExPQURSQU0pOworCWFoZF9vdXRiKGFoZCwgUFJHTUNOVCwgMCk7CisJYWhkX291dGIoYWhkLCBQUkdNQ05UKzEsIDApOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZXFwcm9nKS80OyBpKyspIHsKKwkJaWYgKGFoZF9jaGVja19wYXRjaChhaGQsICZjdXJfcGF0Y2gsIGksICZza2lwX2FkZHIpID09IDApIHsKKwkJCS8qCisJCQkgKiBEb24ndCBkb3dubG9hZCB0aGlzIGluc3RydWN0aW9uIGFzIGl0CisJCQkgKiBpcyBpbiBhIHBhdGNoIHRoYXQgd2FzIHJlbW92ZWQuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIE1vdmUgdGhyb3VnaCB0aGUgQ1MgdGFibGUgdW50aWwgd2UgZmluZCBhIENTCisJCSAqIHRoYXQgbWlnaHQgYXBwbHkgdG8gdGhpcyBpbnN0cnVjdGlvbi4KKwkJICovCisJCWZvciAoOyBjdXJfY3MgPCBudW1fY3JpdGljYWxfc2VjdGlvbnM7IGN1cl9jcysrKSB7CisJCQlpZiAoY3JpdGljYWxfc2VjdGlvbnNbY3VyX2NzXS5lbmQgPD0gaSkgeworCQkJCWlmIChiZWdpbl9zZXRbY3NfY291bnRdID09IFRSVUUKKwkJCQkgJiYgZW5kX3NldFtjc19jb3VudF0gPT0gRkFMU0UpIHsKKwkJCQkJY3NfdGFibGVbY3NfY291bnRdLmVuZCA9IGRvd25sb2FkZWQ7CisJCQkJIAllbmRfc2V0W2NzX2NvdW50XSA9IFRSVUU7CisJCQkJCWNzX2NvdW50Kys7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGNyaXRpY2FsX3NlY3Rpb25zW2N1cl9jc10uYmVnaW4gPD0gaQorCQkJICYmIGJlZ2luX3NldFtjc19jb3VudF0gPT0gRkFMU0UpIHsKKwkJCQljc190YWJsZVtjc19jb3VudF0uYmVnaW4gPSBkb3dubG9hZGVkOworCQkJCWJlZ2luX3NldFtjc19jb3VudF0gPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYWhkX2Rvd25sb2FkX2luc3RyKGFoZCwgaSwgZG93bmxvYWRfY29uc3RzKTsKKwkJZG93bmxvYWRlZCsrOworCX0KKworCWFoZC0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zID0gY3NfY291bnQ7CisJaWYgKGNzX2NvdW50ICE9IDApIHsKKworCQljc19jb3VudCAqPSBzaXplb2Yoc3RydWN0IGNzKTsKKwkJYWhkLT5jcml0aWNhbF9zZWN0aW9ucyA9IG1hbGxvYyhjc19jb3VudCwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJaWYgKGFoZC0+Y3JpdGljYWxfc2VjdGlvbnMgPT0gTlVMTCkKKwkJCXBhbmljKCJhaGRfbG9hZHNlcTogQ291bGQgbm90IG1hbGxvYyIpOworCQltZW1jcHkoYWhkLT5jcml0aWNhbF9zZWN0aW9ucywgY3NfdGFibGUsIGNzX2NvdW50KTsKKwl9CisJYWhkX291dGIoYWhkLCBTRVFDVEwwLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIgJWQgaW5zdHJ1Y3Rpb25zIGRvd25sb2FkZWRcbiIsIGRvd25sb2FkZWQpOworCQlwcmludGYoIiVzOiBGZWF0dXJlcyAweCV4LCBCdWdzIDB4JXgsIEZsYWdzIDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGQtPmZlYXR1cmVzLCBhaGQtPmJ1Z3MsIGFoZC0+ZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludAorYWhkX2NoZWNrX3BhdGNoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHBhdGNoICoqc3RhcnRfcGF0Y2gsCisJCXVfaW50IHN0YXJ0X2luc3RyLCB1X2ludCAqc2tpcF9hZGRyKQoreworCXN0cnVjdAlwYXRjaCAqY3VyX3BhdGNoOworCXN0cnVjdAlwYXRjaCAqbGFzdF9wYXRjaDsKKwl1X2ludAludW1fcGF0Y2hlczsKKworCW51bV9wYXRjaGVzID0gc2l6ZW9mKHBhdGNoZXMpL3NpemVvZihzdHJ1Y3QgcGF0Y2gpOworCWxhc3RfcGF0Y2ggPSAmcGF0Y2hlc1tudW1fcGF0Y2hlc107CisJY3VyX3BhdGNoID0gKnN0YXJ0X3BhdGNoOworCisJd2hpbGUgKGN1cl9wYXRjaCA8IGxhc3RfcGF0Y2ggJiYgc3RhcnRfaW5zdHIgPT0gY3VyX3BhdGNoLT5iZWdpbikgeworCisJCWlmIChjdXJfcGF0Y2gtPnBhdGNoX2Z1bmMoYWhkKSA9PSAwKSB7CisKKwkJCS8qIFN0YXJ0IHJlamVjdGluZyBjb2RlICovCisJCQkqc2tpcF9hZGRyID0gc3RhcnRfaW5zdHIgKyBjdXJfcGF0Y2gtPnNraXBfaW5zdHI7CisJCQljdXJfcGF0Y2ggKz0gY3VyX3BhdGNoLT5za2lwX3BhdGNoOworCQl9IGVsc2UgeworCQkJLyogQWNjZXB0ZWQgdGhpcyBwYXRjaC4gIEFkdmFuY2UgdG8gdGhlIG5leHQKKwkJCSAqIG9uZSBhbmQgd2FpdCBmb3Igb3VyIGludHJ1Y3Rpb24gcG9pbnRlciB0bworCQkJICogaGl0IHRoaXMgcG9pbnQuCisJCQkgKi8KKwkJCWN1cl9wYXRjaCsrOworCQl9CisJfQorCisJKnN0YXJ0X3BhdGNoID0gY3VyX3BhdGNoOworCWlmIChzdGFydF9pbnN0ciA8ICpza2lwX2FkZHIpCisJCS8qIFN0aWxsIHNraXBwaW5nICovCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdV9pbnQKK2FoZF9yZXNvbHZlX3NlcWFkZHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBhZGRyZXNzKQoreworCXN0cnVjdCBwYXRjaCAqY3VyX3BhdGNoOworCWludCBhZGRyZXNzX29mZnNldDsKKwl1X2ludCBza2lwX2FkZHI7CisJdV9pbnQgaTsKKworCWFkZHJlc3Nfb2Zmc2V0ID0gMDsKKwljdXJfcGF0Y2ggPSBwYXRjaGVzOworCXNraXBfYWRkciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRkcmVzczspIHsKKworCQlhaGRfY2hlY2tfcGF0Y2goYWhkLCAmY3VyX3BhdGNoLCBpLCAmc2tpcF9hZGRyKTsKKworCQlpZiAoc2tpcF9hZGRyID4gaSkgeworCQkJaW50IGVuZF9hZGRyOworCisJCQllbmRfYWRkciA9IE1JTihhZGRyZXNzLCBza2lwX2FkZHIpOworCQkJYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOworCQkJaSA9IHNraXBfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWkrKzsKKwkJfQorCX0KKwlyZXR1cm4gKGFkZHJlc3MgLSBhZGRyZXNzX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfZG93bmxvYWRfaW5zdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbnN0cnB0ciwgdWludDhfdCAqZGNvbnN0cykKK3sKKwl1bmlvbglpbnNfZm9ybWF0cyBpbnN0cjsKKwlzdHJ1Y3QJaW5zX2Zvcm1hdDEgKmZtdDFfaW5zOworCXN0cnVjdAlpbnNfZm9ybWF0MyAqZm10M19pbnM7CisJdV9pbnQJb3Bjb2RlOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUgaXMgYWx3YXlzIGNvbXBpbGVkIGludG8gYSBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKwkgKi8KKwlpbnN0ci5pbnRlZ2VyID0gYWhkX2xlMzJ0b2goKih1aW50MzJfdCopJnNlcXByb2dbaW5zdHJwdHIgKiA0XSk7CisKKwlmbXQxX2lucyA9ICZpbnN0ci5mb3JtYXQxOworCWZtdDNfaW5zID0gTlVMTDsKKworCS8qIFB1bGwgdGhlIG9wY29kZSAqLworCW9wY29kZSA9IGluc3RyLmZvcm1hdDEub3Bjb2RlOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBSUNfT1BfSk1QOgorCWNhc2UgQUlDX09QX0pDOgorCWNhc2UgQUlDX09QX0pOQzoKKwljYXNlIEFJQ19PUF9DQUxMOgorCWNhc2UgQUlDX09QX0pORToKKwljYXNlIEFJQ19PUF9KTlo6CisJY2FzZSBBSUNfT1BfSkU6CisJY2FzZSBBSUNfT1BfSlo6CisJeworCQlmbXQzX2lucyA9ICZpbnN0ci5mb3JtYXQzOworCQlmbXQzX2lucy0+YWRkcmVzcyA9IGFoZF9yZXNvbHZlX3NlcWFkZHIoYWhkLCBmbXQzX2lucy0+YWRkcmVzcyk7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgQUlDX09QX09SOgorCWNhc2UgQUlDX09QX0FORDoKKwljYXNlIEFJQ19PUF9YT1I6CisJY2FzZSBBSUNfT1BfQUREOgorCWNhc2UgQUlDX09QX0FEQzoKKwljYXNlIEFJQ19PUF9CTU9WOgorCQlpZiAoZm10MV9pbnMtPnBhcml0eSAhPSAwKSB7CisJCQlmbXQxX2lucy0+aW1tZWRpYXRlID0gZGNvbnN0c1tmbXQxX2lucy0+aW1tZWRpYXRlXTsKKwkJfQorCQlmbXQxX2lucy0+cGFyaXR5ID0gMDsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEFJQ19PUF9ST0w6CisJeworCQlpbnQgaSwgY291bnQ7CisKKwkJLyogQ2FsY3VsYXRlIG9kZCBwYXJpdHkgZm9yIHRoZSBpbnN0cnVjdGlvbiAqLworCQlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCAzMTsgaSsrKSB7CisJCQl1aW50MzJfdCBtYXNrOworCisJCQltYXNrID0gMHgwMSA8PCBpOworCQkJaWYgKChpbnN0ci5pbnRlZ2VyICYgbWFzaykgIT0gMCkKKwkJCQljb3VudCsrOworCQl9CisJCWlmICgoY291bnQgJiAweDAxKSA9PSAwKQorCQkJaW5zdHIuZm9ybWF0MS5wYXJpdHkgPSAxOworCisJCS8qIFRoZSBzZXF1ZW5jZXIgaXMgYSBsaXR0bGUgZW5kaWFuIGNwdSAqLworCQlpbnN0ci5pbnRlZ2VyID0gYWhkX2h0b2xlMzIoaW5zdHIuaW50ZWdlcik7CisJCWFoZF9vdXRzYihhaGQsIFNFUVJBTSwgaW5zdHIuYnl0ZXMsIDQpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcGFuaWMoIlVua25vd24gb3Bjb2RlIGVuY291bnRlcmVkIGluIHNlcSBwcm9ncmFtIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludAorYWhkX3Byb2JlX3N0YWNrX3NpemUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludCBsYXN0X3Byb2JlOworCisJbGFzdF9wcm9iZSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IGk7CisKKwkJLyoKKwkJICogV2UgYXZvaWQgdXNpbmcgMCBhcyBhIHBhdHRlcm4gdG8gYXZvaWQKKwkJICogY29uZnVzaW9uIGlmIHRoZSBzdGFjayBpbXBsZW1lbnRhdGlvbgorCQkgKiAiYmFjay1maWxscyIgd2l0aCB6ZXJvcyB3aGVuICJwb3BpbmcnCisJCSAqIGVudHJpZXMuCisJCSAqLworCQlmb3IgKGkgPSAxOyBpIDw9IGxhc3RfcHJvYmUrMTsgaSsrKSB7CisJCSAgICAgICBhaGRfb3V0YihhaGQsIFNUQUNLLCBpICYgMHhGRik7CisJCSAgICAgICBhaGRfb3V0YihhaGQsIFNUQUNLLCAoaSA+PiA4KSAmIDB4RkYpOworCQl9CisKKwkJLyogVmVyaWZ5ICovCisJCWZvciAoaSA9IGxhc3RfcHJvYmUrMTsgaSA+IDA7IGktLSkgeworCQkJdV9pbnQgc3RhY2tfZW50cnk7CisKKwkJCXN0YWNrX2VudHJ5ID0gYWhkX2luYihhaGQsIFNUQUNLKQorCQkJCSAgICB8KGFoZF9pbmIoYWhkLCBTVEFDSykgPDwgOCk7CisJCQlpZiAoc3RhY2tfZW50cnkgIT0gaSkKKwkJCQlnb3RvIHNpemVkOworCQl9CisJCWxhc3RfcHJvYmUrKzsKKwl9CitzaXplZDoKKwlyZXR1cm4gKGxhc3RfcHJvYmUpOworfQorCit2b2lkCithaGRfZHVtcF9hbGxfY2FyZHNfc3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgYWhkX3NvZnRjICpsaXN0X2FoZDsKKworCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUobGlzdF9haGQpOworCX0KK30KKworaW50CithaGRfcHJpbnRfcmVnaXN0ZXIoYWhkX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwgdV9pbnQgbnVtX2VudHJpZXMsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50IGFkZHJlc3MsIHVfaW50IHZhbHVlLAorCQkgICB1X2ludCAqY3VyX2NvbHVtbiwgdV9pbnQgd3JhcF9wb2ludCkKK3sKKwlpbnQJcHJpbnRlZDsKKwl1X2ludAlwcmludGVkX21hc2s7CisKKwlpZiAoY3VyX2NvbHVtbiAhPSBOVUxMICYmICpjdXJfY29sdW1uID49IHdyYXBfcG9pbnQpIHsKKwkJcHJpbnRmKCJcbiIpOworCQkqY3VyX2NvbHVtbiA9IDA7CisJfQorCXByaW50ZWQgPSBwcmludGYoIiVzWzB4JXhdIiwgbmFtZSwgdmFsdWUpOworCWlmICh0YWJsZSA9PSBOVUxMKSB7CisJCXByaW50ZWQgKz0gcHJpbnRmKCIgIik7CisJCSpjdXJfY29sdW1uICs9IHByaW50ZWQ7CisJCXJldHVybiAocHJpbnRlZCk7CisJfQorCXByaW50ZWRfbWFzayA9IDA7CisJd2hpbGUgKHByaW50ZWRfbWFzayAhPSAweEZGKSB7CisJCWludCBlbnRyeTsKKworCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBudW1fZW50cmllczsgZW50cnkrKykgeworCQkJaWYgKCgodmFsdWUgJiB0YWJsZVtlbnRyeV0ubWFzaykKKwkJCSAgIT0gdGFibGVbZW50cnldLnZhbHVlKQorCQkJIHx8ICgocHJpbnRlZF9tYXNrICYgdGFibGVbZW50cnldLm1hc2spCisJCQkgID09IHRhYmxlW2VudHJ5XS5tYXNrKSkKKwkJCQljb250aW51ZTsKKworCQkJcHJpbnRlZCArPSBwcmludGYoIiVzJXMiLAorCQkJCQkgIHByaW50ZWRfbWFzayA9PSAwID8gIjooIiA6ICJ8IiwKKwkJCQkJICB0YWJsZVtlbnRyeV0ubmFtZSk7CisJCQlwcmludGVkX21hc2sgfD0gdGFibGVbZW50cnldLm1hc2s7CisJCQkKKwkJCWJyZWFrOworCQl9CisJCWlmIChlbnRyeSA+PSBudW1fZW50cmllcykKKwkJCWJyZWFrOworCX0KKwlpZiAocHJpbnRlZF9tYXNrICE9IDApCisJCXByaW50ZWQgKz0gcHJpbnRmKCIpICIpOworCWVsc2UKKwkJcHJpbnRlZCArPSBwcmludGYoIiAiKTsKKwlpZiAoY3VyX2NvbHVtbiAhPSBOVUxMKQorCQkqY3VyX2NvbHVtbiArPSBwcmludGVkOworCXJldHVybiAocHJpbnRlZCk7Cit9CisKK3ZvaWQKK2FoZF9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0cnVjdCBzY2IJKnNjYjsKKwlhaGRfbW9kZV9zdGF0ZQkgc2F2ZWRfbW9kZXM7CisJdV9pbnQJCSBkZmZzdGF0OworCWludAkJIHBhdXNlZDsKKwl1X2ludAkJIHNjYl9pbmRleDsKKwl1X2ludAkJIHNhdmVkX3NjYl9pbmRleDsKKwl1X2ludAkJIGN1cl9jb2w7CisJaW50CQkgaTsKKworCWlmIChhaGRfaXNfcGF1c2VkKGFoZCkpIHsKKwkJcGF1c2VkID0gMTsKKwl9IGVsc2UgeworCQlwYXVzZWQgPSAwOworCQlhaGRfcGF1c2UoYWhkKTsKKwl9CisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlwcmludGYoIj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBEdW1wIENhcmQgU3RhdGUgQmVnaW5zIDw8PDw8PDw8PDw8PDw8PDw8XG4iCisJICAgICAgICIlczogRHVtcGluZyBDYXJkIFN0YXRlIGF0IHByb2dyYW0gYWRkcmVzcyAweCV4IE1vZGUgMHgleFxuIiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgCisJICAgICAgIGFoZF9pbmIoYWhkLCBDVVJBRERSKSB8IChhaGRfaW5iKGFoZCwgQ1VSQUREUisxKSA8PCA4KSwKKwkgICAgICAgYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLAorCQkJCSAgICBhaGQtPnNhdmVkX2RzdF9tb2RlKSk7CisJaWYgKHBhdXNlZCkKKwkJcHJpbnRmKCJDYXJkIHdhcyBwYXVzZWRcbiIpOworCisJaWYgKGFoZF9jaGVja19jbWRjbXBsdHF1ZXVlcyhhaGQpKQorCQlwcmludGYoIkNvbXBsZXRpb25zIGFyZSBwZW5kaW5nXG4iKTsKKworCS8qCisJICogTW9kZSBpbmRlcGVuZGVudCByZWdpc3RlcnMuCisJICovCisJY3VyX2NvbCA9IDA7CisJYWhkX2hzX21haWxib3hfcHJpbnQoYWhkX2luYihhaGQsIExPQ0FMX0hTX01BSUxCT1gpLCAmY3VyX2NvbCwgNTApOworCWFoZF9pbnRjdGxfcHJpbnQoYWhkX2luYihhaGQsIElOVENUTCksICZjdXJfY29sLCA1MCk7CisJYWhkX3NlcWludHN0YXRfcHJpbnQoYWhkX2luYihhaGQsIFNFUUlOVFNUQVQpLCAmY3VyX2NvbCwgNTApOworCWFoZF9zYXZlZF9tb2RlX3ByaW50KGFoZF9pbmIoYWhkLCBTQVZFRF9NT0RFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfZGZmc3RhdF9wcmludChhaGRfaW5iKGFoZCwgREZGU1RBVCksICZjdXJfY29sLCA1MCk7CisJYWhkX3Njc2lzaWdpX3ByaW50KGFoZF9pbmIoYWhkLCBTQ1NJU0lHSSksICZjdXJfY29sLCA1MCk7CisJYWhkX3Njc2lwaGFzZV9wcmludChhaGRfaW5iKGFoZCwgU0NTSVBIQVNFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2NzaWJ1c19wcmludChhaGRfaW5iKGFoZCwgU0NTSUJVUyksICZjdXJfY29sLCA1MCk7CisJYWhkX2xhc3RwaGFzZV9wcmludChhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2NzaXNlcTBfcHJpbnQoYWhkX2luYihhaGQsIFNDU0lTRVEwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2NzaXNlcTFfcHJpbnQoYWhkX2luYihhaGQsIFNDU0lTRVExKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2VxY3RsMF9wcmludChhaGRfaW5iKGFoZCwgU0VRQ1RMMCksICZjdXJfY29sLCA1MCk7CisJYWhkX3NlcWludGN0bF9wcmludChhaGRfaW5iKGFoZCwgU0VRSU5UQ1RMKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc2VxX2ZsYWdzX3ByaW50KGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MpLCAmY3VyX2NvbCwgNTApOworCWFoZF9zZXFfZmxhZ3MyX3ByaW50KGFoZF9pbmIoYWhkLCBTRVFfRkxBR1MyKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc3N0YXQwX3ByaW50KGFoZF9pbmIoYWhkLCBTU1RBVDApLCAmY3VyX2NvbCwgNTApOworCWFoZF9zc3RhdDFfcHJpbnQoYWhkX2luYihhaGQsIFNTVEFUMSksICZjdXJfY29sLCA1MCk7CisJYWhkX3NzdGF0Ml9wcmludChhaGRfaW5iKGFoZCwgU1NUQVQyKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfc3N0YXQzX3ByaW50KGFoZF9pbmIoYWhkLCBTU1RBVDMpLCAmY3VyX2NvbCwgNTApOworCWFoZF9wZXJyZGlhZ19wcmludChhaGRfaW5iKGFoZCwgUEVSUkRJQUcpLCAmY3VyX2NvbCwgNTApOworCWFoZF9zaW1vZGUxX3ByaW50KGFoZF9pbmIoYWhkLCBTSU1PREUxKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFpc3RhdDBfcHJpbnQoYWhkX2luYihhaGQsIExRSVNUQVQwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFpc3RhdDFfcHJpbnQoYWhkX2luYihhaGQsIExRSVNUQVQxKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFpc3RhdDJfcHJpbnQoYWhkX2luYihhaGQsIExRSVNUQVQyKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFvc3RhdDBfcHJpbnQoYWhkX2luYihhaGQsIExRT1NUQVQwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFvc3RhdDFfcHJpbnQoYWhkX2luYihhaGQsIExRT1NUQVQxKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGRfbHFvc3RhdDJfcHJpbnQoYWhkX2luYihhaGQsIExRT1NUQVQyKSwgJmN1cl9jb2wsIDUwKTsKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJcblNDQiBDb3VudCA9ICVkIENNRFNfUEVORElORyA9ICVkIExBU1RTQ0IgMHgleCAiCisJICAgICAgICJDVVJSU0NCIDB4JXggTkVYVFNDQiAweCV4XG4iLAorCSAgICAgICBhaGQtPnNjYl9kYXRhLm51bXNjYnMsIGFoZF9pbncoYWhkLCBDTURTX1BFTkRJTkcpLAorCSAgICAgICBhaGRfaW53KGFoZCwgTEFTVFNDQiksIGFoZF9pbncoYWhkLCBDVVJSU0NCKSwKKwkgICAgICAgYWhkX2ludyhhaGQsIE5FWFRTQ0IpKTsKKwljdXJfY29sID0gMDsKKwkvKiBRSU5GSUZPICovCisJYWhkX3NlYXJjaF9xaW5maWZvKGFoZCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwgQUxMX0NIQU5ORUxTLAorCQkJICAgQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCSAgIFJPTEVfVU5LTk9XTiwgLypzdGF0dXMqLzAsIFNFQVJDSF9QUklOVCk7CisJc2F2ZWRfc2NiX2luZGV4ID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlwcmludGYoIlBlbmRpbmcgbGlzdDoiKTsKKwlpID0gMDsKKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhkLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJaWYgKGkrKyA+IEFIRF9TQ0JfTUFYKQorCQkJYnJlYWs7CisJCWN1cl9jb2wgPSBwcmludGYoIlxuJTNkIEZJRk9fVVNFWzB4JXhdICIsIFNDQl9HRVRfVEFHKHNjYiksCisJCQkJIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0ZJRk9fVVNFX0NPVU5UKSk7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgU0NCX0dFVF9UQUcoc2NiKSk7CisJCWFoZF9zY2JfY29udHJvbF9wcmludChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKSwKKwkJCQkgICAgICAmY3VyX2NvbCwgNjApOworCQlhaGRfc2NiX3Njc2lpZF9wcmludChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9TQ1NJSUQpLAorCQkJCSAgICAgJmN1cl9jb2wsIDYwKTsKKwl9CisJcHJpbnRmKCJcblRvdGFsICVkXG4iLCBpKTsKKworCXByaW50ZigiS2VybmVsIEZyZWUgU0NCIGxpc3Q6ICIpOworCWkgPSAwOworCVRBSUxRX0ZPUkVBQ0goc2NiLCAmYWhkLT5zY2JfZGF0YS5mcmVlX3NjYnMsIGxpbmtzLnRxZSkgeworCQlzdHJ1Y3Qgc2NiICpsaXN0X3NjYjsKKworCQlsaXN0X3NjYiA9IHNjYjsKKwkJZG8geworCQkJcHJpbnRmKCIlZCAiLCBTQ0JfR0VUX1RBRyhsaXN0X3NjYikpOworCQkJbGlzdF9zY2IgPSBMSVNUX05FWFQobGlzdF9zY2IsIGNvbGxpc2lvbl9saW5rcyk7CisJCX0gd2hpbGUgKGxpc3Rfc2NiICYmIGkrKyA8IEFIRF9TQ0JfTUFYKTsKKwl9CisKKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhkLT5zY2JfZGF0YS5hbnlfZGV2X2ZyZWVfc2NiX2xpc3QsIGxpbmtzLmxlKSB7CisJCWlmIChpKysgPiBBSERfU0NCX01BWCkKKwkJCWJyZWFrOworCQlwcmludGYoIiVkICIsIFNDQl9HRVRfVEFHKHNjYikpOworCX0KKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoIlNlcXVlbmNlciBDb21wbGV0ZSBETUEtaW5wcm9nIGxpc3Q6ICIpOworCXNjYl9pbmRleCA9IGFoZF9pbncoYWhkLCBDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQpOworCWkgPSAwOworCXdoaWxlICghU0NCSURfSVNfTlVMTChzY2JfaW5kZXgpICYmIGkrKyA8IEFIRF9TQ0JfTUFYKSB7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2NiX2luZGV4KTsKKwkJcHJpbnRmKCIlZCAiLCBzY2JfaW5kZXgpOworCQlzY2JfaW5kZXggPSBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUX0NPTVBMRVRFKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJTZXF1ZW5jZXIgQ29tcGxldGUgbGlzdDogIik7CisJc2NiX2luZGV4ID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX1NDQl9IRUFEKTsKKwlpID0gMDsKKwl3aGlsZSAoIVNDQklEX0lTX05VTEwoc2NiX2luZGV4KSAmJiBpKysgPCBBSERfU0NCX01BWCkgeworCQlhaGRfc2V0X3NjYnB0cihhaGQsIHNjYl9pbmRleCk7CisJCXByaW50ZigiJWQgIiwgc2NiX2luZGV4KTsKKwkJc2NiX2luZGV4ID0gYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVF9DT01QTEVURSk7CisJfQorCXByaW50ZigiXG4iKTsKKworCQorCXByaW50ZigiU2VxdWVuY2VyIERNQS1VcCBhbmQgQ29tcGxldGUgbGlzdDogIik7CisJc2NiX2luZGV4ID0gYWhkX2ludyhhaGQsIENPTVBMRVRFX0RNQV9TQ0JfSEVBRCk7CisJaSA9IDA7CisJd2hpbGUgKCFTQ0JJRF9JU19OVUxMKHNjYl9pbmRleCkgJiYgaSsrIDwgQUhEX1NDQl9NQVgpIHsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkICIsIHNjYl9pbmRleCk7CisJCXNjYl9pbmRleCA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFRfQ09NUExFVEUpOworCX0KKwlwcmludGYoIlxuIik7CisJYWhkX3NldF9zY2JwdHIoYWhkLCBzYXZlZF9zY2JfaW5kZXgpOworCWRmZnN0YXQgPSBhaGRfaW5iKGFoZCwgREZGU1RBVCk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworI2lmZGVmIEFIRF9ERUJVRworCQlzdHJ1Y3Qgc2NiICpmaWZvX3NjYjsKKyNlbmRpZgorCQl1X2ludAkgICAgZmlmb19zY2JwdHI7CisKKwkJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0RGRjAgKyBpLCBBSERfTU9ERV9ERkYwICsgaSk7CisJCWZpZm9fc2NicHRyID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwkJcHJpbnRmKCJcbiVzOiBGSUZPJWQgJXMsIExPTkdKTVAgPT0gMHgleCwgU0NCIDB4JXhcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBpLAorCQkgICAgICAgKGRmZnN0YXQgJiAoRklGTzBGUkVFIDw8IGkpKSA/ICJGcmVlIiA6ICJBY3RpdmUiLAorCQkgICAgICAgYWhkX2ludyhhaGQsIExPTkdKTVBfQUREUiksIGZpZm9fc2NicHRyKTsKKwkJY3VyX2NvbCA9IDA7CisJCWFoZF9zZXFpbW9kZV9wcmludChhaGRfaW5iKGFoZCwgU0VRSU1PREUpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfc2VxaW50c3JjX3ByaW50KGFoZF9pbmIoYWhkLCBTRVFJTlRTUkMpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfZGZjbnRybF9wcmludChhaGRfaW5iKGFoZCwgREZDTlRSTCksICZjdXJfY29sLCA1MCk7CisJCWFoZF9kZnN0YXR1c19wcmludChhaGRfaW5iKGFoZCwgREZTVEFUVVMpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfc2dfY2FjaGVfc2hhZG93X3ByaW50KGFoZF9pbmIoYWhkLCBTR19DQUNIRV9TSEFET1cpLAorCQkJCQkgICZjdXJfY29sLCA1MCk7CisJCWFoZF9zZ19zdGF0ZV9wcmludChhaGRfaW5iKGFoZCwgU0dfU1RBVEUpLCAmY3VyX2NvbCwgNTApOworCQlhaGRfZGZmc3hmcmN0bF9wcmludChhaGRfaW5iKGFoZCwgREZGU1hGUkNUTCksICZjdXJfY29sLCA1MCk7CisJCWFoZF9zb2ZmY250X3ByaW50KGFoZF9pbmIoYWhkLCBTT0ZGQ05UKSwgJmN1cl9jb2wsIDUwKTsKKwkJYWhkX21kZmZzdGF0X3ByaW50KGFoZF9pbmIoYWhkLCBNREZGU1RBVCksICZjdXJfY29sLCA1MCk7CisJCWlmIChjdXJfY29sID4gNTApIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJCWN1cl9jb2wgPSAwOworCQl9CisJCWN1cl9jb2wgKz0gcHJpbnRmKCJTSEFERFIgPSAweCV4JXgsIFNIQ05UID0gMHgleCAiLAorCQkJCSAgYWhkX2lubChhaGQsIFNIQUREUis0KSwKKwkJCQkgIGFoZF9pbmwoYWhkLCBTSEFERFIpLAorCQkJCSAgKGFoZF9pbmIoYWhkLCBTSENOVCkKKwkJCQl8IChhaGRfaW5iKGFoZCwgU0hDTlQgKyAxKSA8PCA4KQorCQkJCXwgKGFoZF9pbmIoYWhkLCBTSENOVCArIDIpIDw8IDE2KSkpOworCQlpZiAoY3VyX2NvbCA+IDUwKSB7CisJCQlwcmludGYoIlxuIik7CisJCQljdXJfY29sID0gMDsKKwkJfQorCQljdXJfY29sICs9IHByaW50ZigiSEFERFIgPSAweCV4JXgsIEhDTlQgPSAweCV4ICIsCisJCQkJICBhaGRfaW5sKGFoZCwgSEFERFIrNCksCisJCQkJICBhaGRfaW5sKGFoZCwgSEFERFIpLAorCQkJCSAgKGFoZF9pbmIoYWhkLCBIQ05UKQorCQkJCXwgKGFoZF9pbmIoYWhkLCBIQ05UICsgMSkgPDwgOCkKKwkJCQl8IChhaGRfaW5iKGFoZCwgSENOVCArIDIpIDw8IDE2KSkpOworCQlhaGRfY2NzZ2N0bF9wcmludChhaGRfaW5iKGFoZCwgQ0NTR0NUTCksICZjdXJfY29sLCA1MCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfU0cpICE9IDApIHsKKwkJCWZpZm9fc2NiID0gYWhkX2xvb2t1cF9zY2IoYWhkLCBmaWZvX3NjYnB0cik7CisJCQlpZiAoZmlmb19zY2IgIT0gTlVMTCkKKwkJCQlhaGRfZHVtcF9zZ2xpc3QoZmlmb19zY2IpOworCQl9CisjZW5kaWYKKwl9CisJcHJpbnRmKCJcbkxRSU46ICIpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorCQlwcmludGYoIjB4JXggIiwgYWhkX2luYihhaGQsIExRSU4gKyBpKSk7CisJcHJpbnRmKCJcbiIpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJcHJpbnRmKCIlczogTFFJU1RBVEUgPSAweCV4LCBMUU9TVEFURSA9IDB4JXgsIE9QVElPTk1PREUgPSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW5iKGFoZCwgTFFJU1RBVEUpLCBhaGRfaW5iKGFoZCwgTFFPU1RBVEUpLAorCSAgICAgICBhaGRfaW5iKGFoZCwgT1BUSU9OTU9ERSkpOworCXByaW50ZigiJXM6IE9TX1NQQUNFX0NOVCA9IDB4JXggTUFYQ01EQ05UID0gMHgleFxuIiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkX2luYihhaGQsIE9TX1NQQUNFX0NOVCksCisJICAgICAgIGFoZF9pbmIoYWhkLCBNQVhDTURDTlQpKTsKKwlhaGRfc2ltb2RlMF9wcmludChhaGRfaW5iKGFoZCwgU0lNT0RFMCksICZjdXJfY29sLCA1MCk7CisJcHJpbnRmKCJcbiIpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DQ0hBTiwgQUhEX01PREVfQ0NIQU4pOworCWN1cl9jb2wgPSAwOworCWFoZF9jY3NjYmN0bF9wcmludChhaGRfaW5iKGFoZCwgQ0NTQ0JDVEwpLCAmY3VyX2NvbCwgNTApOworCXByaW50ZigiXG4iKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgYWhkLT5zYXZlZF9zcmNfbW9kZSwgYWhkLT5zYXZlZF9kc3RfbW9kZSk7CisJcHJpbnRmKCIlczogUkVHMCA9PSAweCV4LCBTSU5ERVggPSAweCV4LCBESU5ERVggPSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfaW53KGFoZCwgUkVHMCksIGFoZF9pbncoYWhkLCBTSU5ERVgpLAorCSAgICAgICBhaGRfaW53KGFoZCwgRElOREVYKSk7CisJcHJpbnRmKCIlczogU0NCUFRSID09IDB4JXgsIFNDQl9ORVhUID09IDB4JXgsIFNDQl9ORVhUMiA9PSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBhaGRfZ2V0X3NjYnB0cihhaGQpLAorCSAgICAgICBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUKSwKKwkgICAgICAgYWhkX2lud19zY2JyYW0oYWhkLCBTQ0JfTkVYVDIpKTsKKwlwcmludGYoIkNEQiAleCAleCAleCAleCAleCAleFxuIiwKKwkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKSwKKwkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKzEpLAorCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DREJfU1RPUkUrMiksCisJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0NEQl9TVE9SRSszKSwKKwkgICAgICAgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQ0RCX1NUT1JFKzQpLAorCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DREJfU1RPUkUrNSkpOworCXByaW50ZigiU1RBQ0s6Iik7CisJZm9yIChpID0gMDsgaSA8IGFoZC0+c3RhY2tfc2l6ZTsgaSsrKSB7CisJCWFoZC0+c2F2ZWRfc3RhY2tbaV0gPQorCQkgICAgYWhkX2luYihhaGQsIFNUQUNLKXwoYWhkX2luYihhaGQsIFNUQUNLKSA8PCA4KTsKKwkJcHJpbnRmKCIgMHgleCIsIGFoZC0+c2F2ZWRfc3RhY2tbaV0pOworCX0KKwlmb3IgKGkgPSBhaGQtPnN0YWNrX3NpemUtMTsgaSA+PSAwOyBpLS0pIHsKKwkJYWhkX291dGIoYWhkLCBTVEFDSywgYWhkLT5zYXZlZF9zdGFja1tpXSAmIDB4RkYpOworCQlhaGRfb3V0YihhaGQsIFNUQUNLLCAoYWhkLT5zYXZlZF9zdGFja1tpXSA+PiA4KSAmIDB4RkYpOworCX0KKwlwcmludGYoIlxuPDw8PDw8PDw8PDw8PDw8PDwgRHVtcCBDYXJkIFN0YXRlIEVuZHMgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+XG4iKTsKKwlhaGRfcGxhdGZvcm1fZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7CisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGRfdW5wYXVzZShhaGQpOworfQorCit2b2lkCithaGRfZHVtcF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKwl1X2ludAkgICAgICAgc2F2ZWRfc2NiX2luZGV4OworCWludAkgICAgICAgaTsKKworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfU0NTSSwgQUhEX01PREVfU0NTSSk7CisJc2F2ZWRfc2NiX2luZGV4ID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKKwlmb3IgKGkgPSAwOyBpIDwgQUhEX1NDQl9NQVg7IGkrKykgeworCQlhaGRfc2V0X3NjYnB0cihhaGQsIGkpOworCQlwcmludGYoIiUzZCIsIGkpOworCQlwcmludGYoIihDVFJMIDB4JXggSUQgMHgleCBOIDB4JXggTjIgMHgleCBTRyAweCV4LCBSU0cgMHgleClcbiIsCisJCSAgICAgICBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9DT05UUk9MKSwKKwkJICAgICAgIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX1NDU0lJRCksCisJCSAgICAgICBhaGRfaW53X3NjYnJhbShhaGQsIFNDQl9ORVhUKSwKKwkJICAgICAgIGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX05FWFQyKSwKKwkJICAgICAgIGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1NHUFRSKSwKKwkJICAgICAgIGFoZF9pbmxfc2NicmFtKGFoZCwgU0NCX1JFU0lEVUFMX1NHUFRSKSk7CisJfQorCXByaW50ZigiXG4iKTsKKwlhaGRfc2V0X3NjYnB0cihhaGQsIHNhdmVkX3NjYl9pbmRleCk7CisJYWhkX3Jlc3RvcmVfbW9kZXMoYWhkLCBzYXZlZF9tb2Rlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZsZXhwb3J0IExvZ2ljICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVhZCBjb3VudCAxNmJpdCB3b3JkcyBmcm9tIDE2Yml0IHdvcmQgYWRkcmVzcyBzdGFydF9hZGRyIGZyb20gdGhlCisgKiBTRUVQUk9NIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sbGVyLCBpbnRvIGJ1ZiwgdXNpbmcgdGhlIGNvbnRyb2xsZXIncworICogU0VFUFJPTSByZWFkaW5nIHN0YXRlIG1hY2hpbmUuICBPcHRpb25hbGx5IHRyZWF0IHRoZSBkYXRhIGFzIGEgYnl0ZQorICogc3RyZWFtIGluIHRlcm1zIG9mIGJ5dGUgb3JkZXIuCisgKi8KK2ludAorYWhkX3JlYWRfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVpbnQxNl90ICpidWYsCisJCSB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCwgaW50IGJ5dGVzdHJlYW0pCit7CisJdV9pbnQgY3VyX2FkZHI7CisJdV9pbnQgZW5kX2FkZHI7CisJaW50ICAgZXJyb3I7CisKKwkvKgorCSAqIElmIHdlIG5ldmVyIG1ha2UgaXQgdGhyb3VnaCB0aGUgbG9vcCBldmVuIG9uY2UsCisJICogd2Ugd2VyZSBwYXNzZWQgaW52YWxpZCBhcmd1bWVudHMuCisJICovCisJZXJyb3IgPSBFSU5WQUw7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgY291bnQ7CisJZm9yIChjdXJfYWRkciA9IHN0YXJ0X2FkZHI7IGN1cl9hZGRyIDwgZW5kX2FkZHI7IGN1cl9hZGRyKyspIHsKKworCQlhaGRfb3V0YihhaGQsIFNFRUFEUiwgY3VyX2FkZHIpOworCQlhaGRfb3V0YihhaGQsIFNFRUNUTCwgU0VFT1BfUkVBRCB8IFNFRVNUQVJUKTsKKwkJCisJCWVycm9yID0gYWhkX3dhaXRfc2VlcHJvbShhaGQpOworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKwkJaWYgKGJ5dGVzdHJlYW0gIT0gMCkgeworCQkJdWludDhfdCAqYnl0ZXN0cmVhbV9wdHI7CisKKwkJCWJ5dGVzdHJlYW1fcHRyID0gKHVpbnQ4X3QgKilidWY7CisJCQkqYnl0ZXN0cmVhbV9wdHIrKyA9IGFoZF9pbmIoYWhkLCBTRUVEQVQpOworCQkJKmJ5dGVzdHJlYW1fcHRyID0gYWhkX2luYihhaGQsIFNFRURBVCsxKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBhaGRfaW53KCkgYWxyZWFkeSBoYW5kbGVzIG1hY2hpbmUgYnl0ZSBvcmRlci4KKwkJCSAqLworCQkJKmJ1ZiA9IGFoZF9pbncoYWhkLCBTRUVEQVQpOworCQl9CisJCWJ1ZisrOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFdyaXRlIGNvdW50IDE2Yml0IHdvcmRzIGZyb20gYnVmLCBpbnRvIFNFRVBST00gYXR0YWNoZSB0byB0aGUKKyAqIGNvbnRyb2xsZXIgc3RhcnRpbmcgYXQgMTZiaXQgd29yZCBhZGRyZXNzIHN0YXJ0X2FkZHIsIHVzaW5nIHRoZQorICogY29udHJvbGxlcidzIFNFRVBST00gd3JpdGluZyBzdGF0ZSBtYWNoaW5lLgorICovCitpbnQKK2FoZF93cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdWludDE2X3QgKmJ1ZiwKKwkJICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCkKK3sKKwl1X2ludCBjdXJfYWRkcjsKKwl1X2ludCBlbmRfYWRkcjsKKwlpbnQgICBlcnJvcjsKKwlpbnQgICByZXR2YWw7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwllcnJvciA9IEVOT0VOVDsKKworCS8qIFBsYWNlIHRoZSBjaGlwIGludG8gd3JpdGUtZW5hYmxlIG1vZGUgKi8KKwlhaGRfb3V0YihhaGQsIFNFRUFEUiwgU0VFT1BfRVdFTl9BRERSKTsKKwlhaGRfb3V0YihhaGQsIFNFRUNUTCwgU0VFT1BfRVdFTiB8IFNFRVNUQVJUKTsKKwllcnJvciA9IGFoZF93YWl0X3NlZXByb20oYWhkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgZGF0YS4gIElmIHdlIGRvbid0IGdldCB0aHJvdWdodCB0aGUgbG9vcCBhdAorCSAqIGxlYXN0IG9uY2UsIHRoZSBhcmd1bWVudHMgd2VyZSBpbnZhbGlkLgorCSAqLworCXJldHZhbCA9IEVJTlZBTDsKKwllbmRfYWRkciA9IHN0YXJ0X2FkZHIgKyBjb3VudDsKKwlmb3IgKGN1cl9hZGRyID0gc3RhcnRfYWRkcjsgY3VyX2FkZHIgPCBlbmRfYWRkcjsgY3VyX2FkZHIrKykgeworCQlhaGRfb3V0dyhhaGQsIFNFRURBVCwgKmJ1ZisrKTsKKwkJYWhkX291dGIoYWhkLCBTRUVBRFIsIGN1cl9hZGRyKTsKKwkJYWhkX291dGIoYWhkLCBTRUVDVEwsIFNFRU9QX1dSSVRFIHwgU0VFU1RBUlQpOworCQkKKwkJcmV0dmFsID0gYWhkX3dhaXRfc2VlcHJvbShhaGQpOworCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBEaXNhYmxlIHdyaXRlcy4KKwkgKi8KKwlhaGRfb3V0YihhaGQsIFNFRUFEUiwgU0VFT1BfRVdEU19BRERSKTsKKwlhaGRfb3V0YihhaGQsIFNFRUNUTCwgU0VFT1BfRVdEUyB8IFNFRVNUQVJUKTsKKwllcnJvciA9IGFoZF93YWl0X3NlZXByb20oYWhkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAoZXJyb3IpOworCXJldHVybiAocmV0dmFsKTsKK30KKworLyoKKyAqIFdhaXQgfjEwMHVzIGZvciB0aGUgc2VyaWFsIGVlcHJvbSB0byBzYXRpc2Z5IG91ciByZXF1ZXN0LgorICovCitpbnQKK2FoZF93YWl0X3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWludCBjbnQ7CisKKwljbnQgPSAyMDsKKwl3aGlsZSAoKGFoZF9pbmIoYWhkLCBTRUVTVEFUKSAmIChTRUVBUkJBQ0t8U0VFQlVTWSkpICE9IDAgJiYgLS1jbnQpCisJCWFoZF9kZWxheSg1KTsKKworCWlmIChjbnQgPT0gMCkKKwkJcmV0dXJuIChFVElNRURPVVQpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgdHdvIGNoZWNrc3VtcyBpbiB0aGUgcGVyX2NoYW5uZWwKKyAqIHZpdGFsIHByb2R1Y3QgZGF0YSBzdHJ1Y3QuCisgKi8KK2ludAorYWhkX3ZlcmlmeV92cGRfY2tzdW0oc3RydWN0IHZwZF9jb25maWcgKnZwZCkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4YWRkcjsKKwl1aW50MzJfdCBjaGVja3N1bTsKKwl1aW50OF90ICp2cGRhcnJheTsKKworCXZwZGFycmF5ID0gKHVpbnQ4X3QgKil2cGQ7CisJbWF4YWRkciA9IG9mZnNldG9mKHN0cnVjdCB2cGRfY29uZmlnLCB2cGRfY2hlY2tzdW0pOworCWNoZWNrc3VtID0gMDsKKwlmb3IgKGkgPSBvZmZzZXRvZihzdHJ1Y3QgdnBkX2NvbmZpZywgcmVzb3VyY2VfdHlwZSk7IGkgPCBtYXhhZGRyOyBpKyspCisJCWNoZWNrc3VtID0gY2hlY2tzdW0gKyB2cGRhcnJheVtpXTsKKwlpZiAoY2hlY2tzdW0gPT0gMAorCSB8fCAoLWNoZWNrc3VtICYgMHhGRikgIT0gdnBkLT52cGRfY2hlY2tzdW0pCisJCXJldHVybiAoMCk7CisKKwljaGVja3N1bSA9IDA7CisJbWF4YWRkciA9IG9mZnNldG9mKHN0cnVjdCB2cGRfY29uZmlnLCBjaGVja3N1bSk7CisJZm9yIChpID0gb2Zmc2V0b2Yoc3RydWN0IHZwZF9jb25maWcsIGRlZmF1bHRfdGFyZ2V0X2ZsYWdzKTsKKwkgICAgIGkgPCBtYXhhZGRyOyBpKyspCisJCWNoZWNrc3VtID0gY2hlY2tzdW0gKyB2cGRhcnJheVtpXTsKKwlpZiAoY2hlY2tzdW0gPT0gMAorCSB8fCAoLWNoZWNrc3VtICYgMHhGRikgIT0gdnBkLT5jaGVja3N1bSkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKDEpOworfQorCitpbnQKK2FoZF92ZXJpZnlfY2tzdW0oc3RydWN0IHNlZXByb21fY29uZmlnICpzYykKK3sKKwlpbnQgaTsKKwlpbnQgbWF4YWRkcjsKKwl1aW50MzJfdCBjaGVja3N1bTsKKwl1aW50MTZfdCAqc2NhcnJheTsKKworCW1heGFkZHIgPSAoc2l6ZW9mKCpzYykvMikgLSAxOworCWNoZWNrc3VtID0gMDsKKwlzY2FycmF5ID0gKHVpbnQxNl90ICopc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4YWRkcjsgaSsrKQorCQljaGVja3N1bSA9IGNoZWNrc3VtICsgc2NhcnJheVtpXTsKKwlpZiAoY2hlY2tzdW0gPT0gMAorCSB8fCAoY2hlY2tzdW0gJiAweEZGRkYpICE9IHNjLT5jaGVja3N1bSkgeworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCXJldHVybiAoMSk7CisJfQorfQorCitpbnQKK2FoZF9hY3F1aXJlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBTRUVQUk9NIHR5cGUKKwkgKiBmcm9tIHRoZSBmbGV4cG9ydCBsb2dpYywgYnV0IHVuZm9ydHVuYXRlbHkgbm90CisJICogYWxsIGltcGxlbWVudGF0aW9ucyBoYXZlIHRoaXMgbG9naWMgYW5kIHRoZXJlIGlzCisJICogbm8gcHJvZ3JhbWF0aWMgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgbG9naWMKKwkgKiBpcyBwcmVzZW50LgorCSAqLworCXJldHVybiAoMSk7CisjaWYgMAorCXVpbnQ4X3QJc2VldHlwZTsKKwlpbnQJZXJyb3I7CisKKwllcnJvciA9IGFoZF9yZWFkX2ZsZXhwb3J0KGFoZCwgRkxYQUREUl9ST01TVEFUX0NVUlNFTlNFQ1RMLCAmc2VldHlwZSk7CisJaWYgKGVycm9yICE9IDAKKyAgICAgICAgIHx8ICgoc2VldHlwZSAmIEZMWF9ST01TVEFUX1NFRUNGRykgPT0gRkxYX1JPTVNUQVRfU0VFX05PTkUpKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoMSk7CisjZW5kaWYKK30KKwordm9pZAorYWhkX3JlbGVhc2Vfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyogQ3VycmVudGx5IGEgbm8tb3AgKi8KK30KKworaW50CithaGRfd3JpdGVfZmxleHBvcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBhZGRyLCB1X2ludCB2YWx1ZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfU0NTSV9NU0ssIEFIRF9NT0RFX1NDU0lfTVNLKTsKKwlpZiAoYWRkciA+IDcpCisJCXBhbmljKCJhaGRfd3JpdGVfZmxleHBvcnQ6IGFkZHJlc3Mgb3V0IG9mIHJhbmdlIik7CisJYWhkX291dGIoYWhkLCBCUkRDVEwsIEJSREVOfChhZGRyIDw8IDMpKTsKKwllcnJvciA9IGFoZF93YWl0X2ZsZXhwb3J0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCWFoZF9vdXRiKGFoZCwgQlJEREFULCB2YWx1ZSk7CisJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwlhaGRfb3V0YihhaGQsIEJSRENUTCwgQlJEU1RCfEJSREVOfChhZGRyIDw8IDMpKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCWFoZF9vdXRiKGFoZCwgQlJEQ1RMLCBCUkRFTnwoYWRkciA8PCAzKSk7CisJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwlhaGRfb3V0YihhaGQsIEJSRENUTCwgMCk7CisJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK2FoZF9yZWFkX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRkciwgdWludDhfdCAqdmFsdWUpCit7CisJaW50CWVycm9yOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJaWYgKGFkZHIgPiA3KQorCQlwYW5pYygiYWhkX3JlYWRfZmxleHBvcnQ6IGFkZHJlc3Mgb3V0IG9mIHJhbmdlIik7CisJYWhkX291dGIoYWhkLCBCUkRDVEwsIEJSRFJXfEJSREVOfChhZGRyIDw8IDMpKTsKKwllcnJvciA9IGFoZF93YWl0X2ZsZXhwb3J0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCSp2YWx1ZSA9IGFoZF9pbmIoYWhkLCBCUkREQVQpOworCWFoZF9vdXRiKGFoZCwgQlJEQ1RMLCAwKTsKKwlhaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGQpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBXYWl0IGF0IG1vc3QgMiBzZWNvbmRzIGZvciBmbGV4cG9ydCBhcmJpdHJhdGlvbiB0byBzdWNjZWVkLgorICovCitpbnQKK2FoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgY250OworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJY250ID0gMTAwMDAwMCAqIDIgLyA1OworCXdoaWxlICgoYWhkX2luYihhaGQsIEJSRENUTCkgJiBGTFhBUkJBQ0spID09IDAgJiYgLS1jbnQpCisJCWFoZF9kZWxheSg1KTsKKworCWlmIChjbnQgPT0gMCkKKwkJcmV0dXJuIChFVElNRURPVVQpOworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCitjYW1fc3RhdHVzCithaGRfZmluZF90bW9kZV9kZXZzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGNhbV9zaW0gKnNpbSwgdW5pb24gY2NiICpjY2IsCisJCSAgICBzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqKnRzdGF0ZSwKKwkJICAgIHN0cnVjdCBhaGRfdG1vZGVfbHN0YXRlICoqbHN0YXRlLAorCQkgICAgaW50IG5vdGZvdW5kX2ZhaWx1cmUpCit7CisKKwlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfVEFSR0VUTU9ERSkgPT0gMCkKKwkJcmV0dXJuIChDQU1fUkVRX0lOVkFMSUQpOworCisJLyoKKwkgKiBIYW5kbGUgdGhlICdibGFjayBob2xlJyBkZXZpY2UgdGhhdCBzdWNrcyB1cAorCSAqIHJlcXVlc3RzIHRvIHVuYXR0YWNoZWQgbHVucyBvbiBlbmFibGVkIHRhcmdldHMuCisJICovCisJaWYgKGNjYi0+Y2NiX2gudGFyZ2V0X2lkID09IENBTV9UQVJHRVRfV0lMRENBUkQKKwkgJiYgY2NiLT5jY2JfaC50YXJnZXRfbHVuID09IENBTV9MVU5fV0lMRENBUkQpIHsKKwkJKnRzdGF0ZSA9IE5VTEw7CisJCSpsc3RhdGUgPSBhaGQtPmJsYWNrX2hvbGU7CisJfSBlbHNlIHsKKwkJdV9pbnQgbWF4X2lkOworCisJCW1heF9pZCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTUgOiA3OworCQlpZiAoY2NiLT5jY2JfaC50YXJnZXRfaWQgPiBtYXhfaWQpCisJCQlyZXR1cm4gKENBTV9USURfSU5WQUxJRCk7CisKKwkJaWYgKGNjYi0+Y2NiX2gudGFyZ2V0X2x1biA+PSBBSERfTlVNX0xVTlMpCisJCQlyZXR1cm4gKENBTV9MVU5fSU5WQUxJRCk7CisKKwkJKnRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW2NjYi0+Y2NiX2gudGFyZ2V0X2lkXTsKKwkJKmxzdGF0ZSA9IE5VTEw7CisJCWlmICgqdHN0YXRlICE9IE5VTEwpCisJCQkqbHN0YXRlID0KKwkJCSAgICAoKnRzdGF0ZSktPmVuYWJsZWRfbHVuc1tjY2ItPmNjYl9oLnRhcmdldF9sdW5dOworCX0KKworCWlmIChub3Rmb3VuZF9mYWlsdXJlICE9IDAgJiYgKmxzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gKENBTV9QQVRIX0lOVkFMSUQpOworCisJcmV0dXJuIChDQU1fUkVRX0NNUCk7Cit9CisKK3ZvaWQKK2FoZF9oYW5kbGVfZW5fbHVuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGNhbV9zaW0gKnNpbSwgdW5pb24gY2NiICpjY2IpCit7CisjaWYgTk9UX1lFVAorCXN0cnVjdAkgICBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0CSAgIGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZTsKKwlzdHJ1Y3QJICAgY2NiX2VuX2x1biAqY2VsOworCWNhbV9zdGF0dXMgc3RhdHVzOworCXVfaW50CSAgIHRhcmdldDsKKwl1X2ludAkgICBsdW47CisJdV9pbnQJICAgdGFyZ2V0X21hc2s7CisJdV9sb25nCSAgIHM7CisJY2hhcgkgICBjaGFubmVsOworCisJc3RhdHVzID0gYWhkX2ZpbmRfdG1vZGVfZGV2cyhhaGQsIHNpbSwgY2NiLCAmdHN0YXRlLCAmbHN0YXRlLAorCQkJCSAgICAgLypub3Rmb3VuZF9mYWlsdXJlKi9GQUxTRSk7CisKKwlpZiAoc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCWNjYi0+Y2NiX2guc3RhdHVzID0gc3RhdHVzOworCQlyZXR1cm47CisJfQorCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJUk9MRSkgIT0gMCkgeworCQl1X2ludAkgICBvdXJfaWQ7CisKKwkJb3VyX2lkID0gYWhkLT5vdXJfaWQ7CisJCWlmIChjY2ItPmNjYl9oLnRhcmdldF9pZCAhPSBvdXJfaWQpIHsKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpICE9IDAKKwkJICAgCSAmJiAoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBPbmx5IGFsbG93IGFkZGl0aW9uYWwgdGFyZ2V0cyBpZgorCQkJCSAqIHRoZSBpbml0aWF0b3Igcm9sZSBpcyBkaXNhYmxlZC4KKwkJCQkgKiBUaGUgaGFyZHdhcmUgY2Fubm90IGhhbmRsZSBhIHJlLXNlbGVjdC1pbgorCQkJCSAqIG9uIHRoZSBpbml0aWF0b3IgaWQgZHVyaW5nIGEgcmUtc2VsZWN0LW91dAorCQkJCSAqIG9uIGEgZGlmZmVyZW50IHRhcmdldCBpZC4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBDQU1fVElEX0lOVkFMSUQ7CisJCQl9IGVsc2UgaWYgKChhaGQtPmZsYWdzICYgQUhEX0lOSVRJQVRPUlJPTEUpICE9IDAKKwkJCQl8fCBhaGQtPmVuYWJsZWRfbHVucyA+IDApIHsKKwkJCQkvKgorCQkJCSAqIE9ubHkgYWxsb3cgb3VyIHRhcmdldCBpZCB0byBjaGFuZ2UKKwkJCQkgKiBpZiB0aGUgaW5pdGlhdG9yIHJvbGUgaXMgbm90IGNvbmZpZ3VyZWQKKwkJCQkgKiBhbmQgdGhlcmUgYXJlIG5vIGVuYWJsZWQgbHVucyB3aGljaAorCQkJCSAqIGFyZSBhdHRhY2hlZCB0byB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQKKwkJCQkgKiBzY3NpIGlkLgorCQkJCSAqLworCQkJCXN0YXR1cyA9IENBTV9USURfSU5WQUxJRDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzdGF0dXMgIT0gQ0FNX1JFUV9DTVApIHsKKwkJY2NiLT5jY2JfaC5zdGF0dXMgPSBzdGF0dXM7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlIG5vdyBoYXZlIGFuIGlkIHRoYXQgaXMgdmFsaWQuCisJICogSWYgd2UgYXJlbid0IGluIHRhcmdldCBtb2RlLCBzd2l0Y2ggbW9kZXMuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpID09IDAKKwkgJiYgY2NiLT5jY2JfaC50YXJnZXRfaWQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgeworCQl1X2xvbmcJczsKKworCQlwcmludGYoIkNvbmZpZ3VyaW5nIFRhcmdldCBNb2RlXG4iKTsKKwkJYWhkX2xvY2soYWhkLCAmcyk7CisJCWlmIChMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2NicykgIT0gTlVMTCkgeworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fQlVTWTsKKwkJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCQlyZXR1cm47CisJCX0KKwkJYWhkLT5mbGFncyB8PSBBSERfVEFSR0VUUk9MRTsKKwkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJUk9MRSkgPT0gMCkKKwkJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9JTklUSUFUT1JST0xFOworCQlhaGRfcGF1c2UoYWhkKTsKKwkJYWhkX2xvYWRzZXEoYWhkKTsKKwkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwl9CisJY2VsID0gJmNjYi0+Y2VsOworCXRhcmdldCA9IGNjYi0+Y2NiX2gudGFyZ2V0X2lkOworCWx1biA9IGNjYi0+Y2NiX2gudGFyZ2V0X2x1bjsKKwljaGFubmVsID0gU0lNX0NIQU5ORUwoYWhkLCBzaW0pOworCXRhcmdldF9tYXNrID0gMHgwMSA8PCB0YXJnZXQ7CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQl0YXJnZXRfbWFzayA8PD0gODsKKworCWlmIChjZWwtPmVuYWJsZSAhPSAwKSB7CisJCXVfaW50IHNjc2lzZXExOworCisJCS8qIEFyZSB3ZSBhbHJlYWR5IGVuYWJsZWQ/PyAqLworCQlpZiAobHN0YXRlICE9IE5VTEwpIHsKKwkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7CisJCQlwcmludGYoIkx1biBhbHJlYWR5IGVuYWJsZWRcbiIpOworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0FMUkRZX0VOQTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjZWwtPmdycDZfbGVuICE9IDAKKwkJIHx8IGNlbC0+Z3JwN19sZW4gIT0gMCkgeworCQkJLyoKKwkJCSAqIERvbid0ICh5ZXQ/KSBzdXBwb3J0IHZlbmRvcgorCQkJICogc3BlY2lmaWMgY29tbWFuZHMuCisJCQkgKi8KKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOworCQkJcHJpbnRmKCJOb24temVybyBHcm91cCBDb2Rlc1xuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBTZWVtcyB0byBiZSBva2F5LgorCQkgKiBTZXR1cCBvdXIgZGF0YSBzdHJ1Y3R1cmVzLgorCQkgKi8KKwkJaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEICYmIHRzdGF0ZSA9PSBOVUxMKSB7CisJCQl0c3RhdGUgPSBhaGRfYWxsb2NfdHN0YXRlKGFoZCwgdGFyZ2V0LCBjaGFubmVsKTsKKwkJCWlmICh0c3RhdGUgPT0gTlVMTCkgeworCQkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7CisJCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSB0c3RhdGVcbiIpOworCQkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWxzdGF0ZSA9IG1hbGxvYyhzaXplb2YoKmxzdGF0ZSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChsc3RhdGUgPT0gTlVMTCkgeworCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJCXByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgbHN0YXRlXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtc2V0KGxzdGF0ZSwgMCwgc2l6ZW9mKCpsc3RhdGUpKTsKKwkJc3RhdHVzID0geHB0X2NyZWF0ZV9wYXRoKCZsc3RhdGUtPnBhdGgsIC8qcGVyaXBoKi9OVUxMLAorCQkJCQkgeHB0X3BhdGhfcGF0aF9pZChjY2ItPmNjYl9oLnBhdGgpLAorCQkJCQkgeHB0X3BhdGhfdGFyZ2V0X2lkKGNjYi0+Y2NiX2gucGF0aCksCisJCQkJCSB4cHRfcGF0aF9sdW5faWQoY2NiLT5jY2JfaC5wYXRoKSk7CisJCWlmIChzdGF0dXMgIT0gQ0FNX1JFUV9DTVApIHsKKwkJCWZyZWUobHN0YXRlLCBNX0RFVkJVRik7CisJCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSBwYXRoXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFU1JDX1VOQVZBSUw7CisJCQlyZXR1cm47CisJCX0KKwkJU0xJU1RfSU5JVCgmbHN0YXRlLT5hY2NlcHRfdGlvcyk7CisJCVNMSVNUX0lOSVQoJmxzdGF0ZS0+aW1tZWRfbm90aWZpZXMpOworCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJYWhkX3BhdXNlKGFoZCk7CisJCWlmICh0YXJnZXQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgeworCQkJdHN0YXRlLT5lbmFibGVkX2x1bnNbbHVuXSA9IGxzdGF0ZTsKKwkJCWFoZC0+ZW5hYmxlZF9sdW5zKys7CisKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpICE9IDApIHsKKwkJCQl1X2ludCB0YXJnaWRfbWFzazsKKworCQkJCXRhcmdpZF9tYXNrID0gYWhkX2luYihhaGQsIFRBUkdJRCkKKwkJCQkJICAgIHwgKGFoZF9pbmIoYWhkLCBUQVJHSUQgKyAxKSA8PCA4KTsKKworCQkJCXRhcmdpZF9tYXNrIHw9IHRhcmdldF9tYXNrOworCQkJCWFoZF9vdXRiKGFoZCwgVEFSR0lELCB0YXJnaWRfbWFzayk7CisJCQkJYWhkX291dGIoYWhkLCBUQVJHSUQrMSwgKHRhcmdpZF9tYXNrID4+IDgpKTsKKwkJCQkKKwkJCQlhaGRfdXBkYXRlX3Njc2lpZChhaGQsIHRhcmdpZF9tYXNrKTsKKwkJCX0gZWxzZSB7CisJCQkJdV9pbnQgb3VyX2lkOworCQkJCWNoYXIgIGNoYW5uZWw7CisKKwkJCQljaGFubmVsID0gU0lNX0NIQU5ORUwoYWhkLCBzaW0pOworCQkJCW91cl9pZCA9IFNJTV9TQ1NJX0lEKGFoZCwgc2ltKTsKKworCQkJCS8qCisJCQkJICogVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc2VsZWN0aW9ucworCQkJCSAqIGFyZSBub3QgZW5hYmxlZAorCQkJCSAqLworCQkJCWlmICh0YXJnZXQgIT0gb3VyX2lkKSB7CisJCQkJCXVfaW50IHNibGtjdGw7CisJCQkJCWNoYXIgIGN1cl9jaGFubmVsOworCQkJCQlpbnQgICBzd2FwOworCisJCQkJCXNibGtjdGwgPSBhaGRfaW5iKGFoZCwgU0JMS0NUTCk7CisJCQkJCWN1cl9jaGFubmVsID0gKHNibGtjdGwgJiBTRUxCVVNCKQorCQkJCQkJICAgID8gJ0InIDogJ0EnOworCQkJCQlpZiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfVFdJTikgPT0gMCkKKwkJCQkJCWN1cl9jaGFubmVsID0gJ0EnOworCQkJCQlzd2FwID0gY3VyX2NoYW5uZWwgIT0gY2hhbm5lbDsKKwkJCQkJYWhkLT5vdXJfaWQgPSB0YXJnZXQ7CisKKwkJCQkJaWYgKHN3YXApCisJCQkJCQlhaGRfb3V0YihhaGQsIFNCTEtDVEwsCisJCQkJCQkJIHNibGtjdGwgXiBTRUxCVVNCKTsKKworCQkJCQlhaGRfb3V0YihhaGQsIFNDU0lJRCwgdGFyZ2V0KTsKKworCQkJCQlpZiAoc3dhcCkKKwkJCQkJCWFoZF9vdXRiKGFoZCwgU0JMS0NUTCwgc2Jsa2N0bCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCWFoZC0+YmxhY2tfaG9sZSA9IGxzdGF0ZTsKKwkJLyogQWxsb3cgc2VsZWN0LWluIG9wZXJhdGlvbnMgKi8KKwkJaWYgKGFoZC0+YmxhY2tfaG9sZSAhPSBOVUxMICYmIGFoZC0+ZW5hYmxlZF9sdW5zID4gMCkgeworCQkJc2NzaXNlcTEgPSBhaGRfaW5iKGFoZCwgU0NTSVNFUV9URU1QTEFURSk7CisJCQlzY3Npc2VxMSB8PSBFTlNFTEk7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXExKTsKKwkJCXNjc2lzZXExID0gYWhkX2luYihhaGQsIFNDU0lTRVExKTsKKwkJCXNjc2lzZXExIHw9IEVOU0VMSTsKKwkJCWFoZF9vdXRiKGFoZCwgU0NTSVNFUTEsIHNjc2lzZXExKTsKKwkJfQorCQlhaGRfdW5wYXVzZShhaGQpOworCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfQ01QOworCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQlwcmludGYoIkx1biBub3cgZW5hYmxlZCBmb3IgdGFyZ2V0IG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2IgKnNjYjsKKwkJaW50IGksIGVtcHR5OworCisJCWlmIChsc3RhdGUgPT0gTlVMTCkgeworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0lOVkFMSUQ7CisJCQlyZXR1cm47CisJCX0KKworCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJCisJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9DTVA7CisJCUxJU1RfRk9SRUFDSChzY2IsICZhaGQtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkJc3RydWN0IGNjYl9oZHIgKmNjYmg7CisKKwkJCWNjYmggPSAmc2NiLT5pb19jdHgtPmNjYl9oOworCQkJaWYgKGNjYmgtPmZ1bmNfY29kZSA9PSBYUFRfQ09OVF9UQVJHRVRfSU8KKwkJCSAmJiAheHB0X3BhdGhfY29tcChjY2JoLT5wYXRoLCBjY2ItPmNjYl9oLnBhdGgpKXsKKwkJCQlwcmludGYoIkNUSU8gcGVuZGluZ1xuIik7CisJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CisJCQkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZiAoU0xJU1RfRklSU1QoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiQVRJT3MgcGVuZGluZ1xuIik7CisJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKKwkJfQorCisJCWlmIChTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykgIT0gTlVMTCkgeworCQkJcHJpbnRmKCJJTk9UcyBwZW5kaW5nXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOworCQl9CisKKwkJaWYgKGNjYi0+Y2NiX2guc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQkJcmV0dXJuOworCQl9CisKKwkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJcHJpbnRmKCJUYXJnZXQgbW9kZSBkaXNhYmxlZFxuIik7CisJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKworCQlhaGRfcGF1c2UoYWhkKTsKKwkJLyogQ2FuIHdlIGNsZWFuIHVwIHRoZSB0YXJnZXQgdG9vPyAqLworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJCXRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl0gPSBOVUxMOworCQkJYWhkLT5lbmFibGVkX2x1bnMtLTsKKwkJCWZvciAoZW1wdHkgPSAxLCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlpZiAodHN0YXRlLT5lbmFibGVkX2x1bnNbaV0gIT0gTlVMTCkgeworCQkJCQllbXB0eSA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJaWYgKGVtcHR5KSB7CisJCQkJYWhkX2ZyZWVfdHN0YXRlKGFoZCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJLypmb3JjZSovRkFMU0UpOworCQkJCWlmIChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJX1RJRCkgeworCQkJCQl1X2ludCB0YXJnaWRfbWFzazsKKworCQkJCQl0YXJnaWRfbWFzayA9IGFoZF9pbmIoYWhkLCBUQVJHSUQpCisJCQkJCQkgICAgfCAoYWhkX2luYihhaGQsIFRBUkdJRCArIDEpCisJCQkJCQkgICAgICAgPDwgOCk7CisKKwkJCQkJdGFyZ2lkX21hc2sgJj0gfnRhcmdldF9tYXNrOworCQkJCQlhaGRfb3V0YihhaGQsIFRBUkdJRCwgdGFyZ2lkX21hc2spOworCQkJCQlhaGRfb3V0YihhaGQsIFRBUkdJRCsxLAorCQkJCQkgCSAodGFyZ2lkX21hc2sgPj4gOCkpOworCQkJCQlhaGRfdXBkYXRlX3Njc2lpZChhaGQsIHRhcmdpZF9tYXNrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWFoZC0+YmxhY2tfaG9sZSA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBhbGxvdyBzZWxlY3Rpb25zIHdpdGhvdXQKKwkJCSAqIG91ciBibGFjayBob2xlIGRldmljZS4KKwkJCSAqLworCQkJZW1wdHkgPSBUUlVFOworCQl9CisJCWlmIChhaGQtPmVuYWJsZWRfbHVucyA9PSAwKSB7CisJCQkvKiBEaXNhbGxvdyBzZWxlY3QtaW4gKi8KKwkJCXVfaW50IHNjc2lzZXExOworCisJCQlzY3Npc2VxMSA9IGFoZF9pbmIoYWhkLCBTQ1NJU0VRX1RFTVBMQVRFKTsKKwkJCXNjc2lzZXExICY9IH5FTlNFTEk7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXExKTsKKwkJCXNjc2lzZXExID0gYWhkX2luYihhaGQsIFNDU0lTRVExKTsKKwkJCXNjc2lzZXExICY9IH5FTlNFTEk7CisJCQlhaGRfb3V0YihhaGQsIFNDU0lTRVExLCBzY3Npc2VxMSk7CisKKwkJCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSVJPTEUpID09IDApIHsKKwkJCQlwcmludGYoIkNvbmZpZ3VyaW5nIEluaXRpYXRvciBNb2RlXG4iKTsKKwkJCQlhaGQtPmZsYWdzICY9IH5BSERfVEFSR0VUUk9MRTsKKwkJCQlhaGQtPmZsYWdzIHw9IEFIRF9JTklUSUFUT1JST0xFOworCQkJCWFoZF9wYXVzZShhaGQpOworCQkJCWFoZF9sb2Fkc2VxKGFoZCk7CisJCQkJYWhkX3Jlc3RhcnQoYWhkKTsKKwkJCQkvKgorCQkJCSAqIFVucGF1c2VkLiAgVGhlIGV4dHJhIHVucGF1c2UKKwkJCQkgKiB0aGF0IGZvbGxvd3MgaXMgaGFybWxlc3MuCisJCQkJICovCisJCQl9CisJCX0KKwkJYWhkX3VucGF1c2UoYWhkKTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FoZF91cGRhdGVfc2NzaWlkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGFyZ2lkX21hc2spCit7CisjaWYgTk9UX1lFVAorCXVfaW50IHNjc2lpZF9tYXNrOworCXVfaW50IHNjc2lpZDsKKworCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9NVUxUSV9USUQpID09IDApCisJCXBhbmljKCJhaGRfdXBkYXRlX3Njc2lpZCBjYWxsZWQgb24gbm9uLW11bHRpdGlkIHVuaXRcbiIpOworCisJLyoKKwkgKiBTaW5jZSB3ZSB3aWxsIHJlbHkgb24gdGhlIFRBUkdJRCBtYXNrCisJICogZm9yIHNlbGVjdGlvbiBlbmFibGVzLCBlbnN1cmUgdGhhdCBPSUQKKwkgKiBpbiBTQ1NJSUQgaXMgbm90IHNldCB0byBzb21lIG90aGVyIElECisJICogdGhhdCB3ZSBkb24ndCB3YW50IHRvIGFsbG93IHNlbGVjdGlvbnMgb24uCisJICovCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1VMVFJBMikgIT0gMCkKKwkJc2NzaWlkID0gYWhkX2luYihhaGQsIFNDU0lJRF9VTFRSQTIpOworCWVsc2UKKwkJc2NzaWlkID0gYWhkX2luYihhaGQsIFNDU0lJRCk7CisJc2NzaWlkX21hc2sgPSAweDEgPDwgKHNjc2lpZCAmIE9JRCk7CisJaWYgKCh0YXJnaWRfbWFzayAmIHNjc2lpZF9tYXNrKSA9PSAwKSB7CisJCXVfaW50IG91cl9pZDsKKworCQkvKiBmZnMgY291bnRzIGZyb20gMSAqLworCQlvdXJfaWQgPSBmZnModGFyZ2lkX21hc2spOworCQlpZiAob3VyX2lkID09IDApCisJCQlvdXJfaWQgPSBhaGQtPm91cl9pZDsKKwkJZWxzZQorCQkJb3VyX2lkLS07CisJCXNjc2lpZCAmPSBUSUQ7CisJCXNjc2lpZCB8PSBvdXJfaWQ7CisJfQorCWlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9VTFRSQTIpICE9IDApCisJCWFoZF9vdXRiKGFoZCwgU0NTSUlEX1VMVFJBMiwgc2NzaWlkKTsKKwllbHNlCisJCWFoZF9vdXRiKGFoZCwgU0NTSUlELCBzY3NpaWQpOworI2VuZGlmCit9CisKK3ZvaWQKK2FoZF9ydW5fdHFpbmZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgcGF1c2VkKQoreworCXN0cnVjdCB0YXJnZXRfY21kICpjbWQ7CisKKwlhaGRfc3luY190cWluZmlmbyhhaGQsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwl3aGlsZSAoKGNtZCA9ICZhaGQtPnRhcmdldGNtZHNbYWhkLT50cWluZmlmb25leHRdKS0+Y21kX3ZhbGlkICE9IDApIHsKKworCQkvKgorCQkgKiBPbmx5IGFkdmFuY2UgdGhyb3VnaCB0aGUgcXVldWUgaWYgd2UKKwkJICogaGF2ZSB0aGUgcmVzb3VyY2VzIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQuCisJCSAqLworCQlpZiAoYWhkX2hhbmRsZV90YXJnZXRfY21kKGFoZCwgY21kKSAhPSAwKQorCQkJYnJlYWs7CisKKwkJY21kLT5jbWRfdmFsaWQgPSAwOworCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQtPnRxaW5maWZvbmV4dCksCisJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSwKKwkJCQlCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhkLT50cWluZmlmb25leHQrKzsKKworCQkvKgorCQkgKiBMYXppbHkgdXBkYXRlIG91ciBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IG1vZGUgaW5jb21pbmcKKwkJICogY29tbWFuZCBxdWV1ZSBhcyBzZWVuIGJ5IHRoZSBzZXF1ZW5jZXIuCisJCSAqLworCQlpZiAoKGFoZC0+dHFpbmZpZm9uZXh0ICYgKEhPU1RfVFFJTlBPUyAtIDEpKSA9PSAxKSB7CisJCQl1X2ludCBoc19tYWlsYm94OworCisJCQloc19tYWlsYm94ID0gYWhkX2luYihhaGQsIEhTX01BSUxCT1gpOworCQkJaHNfbWFpbGJveCAmPSB+SE9TVF9UUUlOUE9TOworCQkJaHNfbWFpbGJveCB8PSBhaGQtPnRxaW5maWZvbmV4dCAmIEhPU1RfVFFJTlBPUzsKKwkJCWFoZF9vdXRiKGFoZCwgSFNfTUFJTEJPWCwgaHNfbWFpbGJveCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9oYW5kbGVfdGFyZ2V0X2NtZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCB0YXJnZXRfY21kICpjbWQpCit7CisJc3RydWN0CSAgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAkgIGFoZF90bW9kZV9sc3RhdGUgKmxzdGF0ZTsKKwlzdHJ1Y3QJICBjY2JfYWNjZXB0X3RpbyAqYXRpbzsKKwl1aW50OF90ICpieXRlOworCWludAkgIGluaXRpYXRvcjsKKwlpbnQJICB0YXJnZXQ7CisJaW50CSAgbHVuOworCisJaW5pdGlhdG9yID0gU0NTSUlEX1RBUkdFVChhaGQsIGNtZC0+c2NzaWlkKTsKKwl0YXJnZXQgPSBTQ1NJSURfT1VSX0lEKGNtZC0+c2NzaWlkKTsKKwlsdW4gICAgPSAoY21kLT5pZGVudGlmeSAmIE1TR19JREVOVElGWV9MVU5NQVNLKTsKKworCWJ5dGUgPSBjbWQtPmJ5dGVzOworCXRzdGF0ZSA9IGFoZC0+ZW5hYmxlZF90YXJnZXRzW3RhcmdldF07CisJbHN0YXRlID0gTlVMTDsKKwlpZiAodHN0YXRlICE9IE5VTEwpCisJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl07CisKKwkvKgorCSAqIENvbW1hbmRzIGZvciBkaXNhYmxlZCBsdW5zIGdvIHRvIHRoZSBibGFjayBob2xlIGRyaXZlci4KKwkgKi8KKwlpZiAobHN0YXRlID09IE5VTEwpCisJCWxzdGF0ZSA9IGFoZC0+YmxhY2tfaG9sZTsKKworCWF0aW8gPSAoc3RydWN0IGNjYl9hY2NlcHRfdGlvKilTTElTVF9GSVJTVCgmbHN0YXRlLT5hY2NlcHRfdGlvcyk7CisJaWYgKGF0aW8gPT0gTlVMTCkgeworCQlhaGQtPmZsYWdzIHw9IEFIRF9UUUlORklGT19CTE9DS0VEOworCQkvKgorCQkgKiBXYWl0IGZvciBtb3JlIEFUSU9zIGZyb20gdGhlIHBlcmlwaGVyYWwgZHJpdmVyIGZvciB0aGlzIGx1bi4KKwkJICovCisJCXJldHVybiAoMSk7CisJfSBlbHNlCisJCWFoZC0+ZmxhZ3MgJj0gfkFIRF9UUUlORklGT19CTE9DS0VEOworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfVFFJTikgIT0gMCkKKwkJcHJpbnRmKCJJbmNvbWluZyBjb21tYW5kIGZyb20gJWQgZm9yICVkOiVkJXNcbiIsCisJCSAgICAgICBpbml0aWF0b3IsIHRhcmdldCwgbHVuLAorCQkgICAgICAgbHN0YXRlID09IGFoZC0+YmxhY2tfaG9sZSA/ICIoQmxhY2sgSG9sZWQpIiA6ICIiKTsKKyNlbmRpZgorCVNMSVNUX1JFTU9WRV9IRUFEKCZsc3RhdGUtPmFjY2VwdF90aW9zLCBzaW1fbGlua3Muc2xlKTsKKworCWlmIChsc3RhdGUgPT0gYWhkLT5ibGFja19ob2xlKSB7CisJCS8qIEZpbGwgaW4gdGhlIHdpbGRjYXJkcyAqLworCQlhdGlvLT5jY2JfaC50YXJnZXRfaWQgPSB0YXJnZXQ7CisJCWF0aW8tPmNjYl9oLnRhcmdldF9sdW4gPSBsdW47CisJfQorCisJLyoKKwkgKiBQYWNrYWdlIGl0IHVwIGFuZCBzZW5kIGl0IG9mZiB0bworCSAqIHdob21ldmVyIGhhcyB0aGlzIGx1biBlbmFibGVkLgorCSAqLworCWF0aW8tPnNlbnNlX2xlbiA9IDA7CisJYXRpby0+aW5pdF9pZCA9IGluaXRpYXRvcjsKKwlpZiAoYnl0ZVswXSAhPSAweEZGKSB7CisJCS8qIFRhZyB3YXMgaW5jbHVkZWQgKi8KKwkJYXRpby0+dGFnX2FjdGlvbiA9ICpieXRlKys7CisJCWF0aW8tPnRhZ19pZCA9ICpieXRlKys7CisJCWF0aW8tPmNjYl9oLmZsYWdzID0gQ0FNX1RBR19BQ1RJT05fVkFMSUQ7CisJfSBlbHNlIHsKKwkJYXRpby0+Y2NiX2guZmxhZ3MgPSAwOworCX0KKwlieXRlKys7CisKKwkvKiBPa2F5LiAgTm93IGRldGVybWluZSB0aGUgY2RiIHNpemUgYmFzZWQgb24gdGhlIGNvbW1hbmQgY29kZSAqLworCXN3aXRjaCAoKmJ5dGUgPj4gQ01EX0dST1VQX0NPREVfU0hJRlQpIHsKKwljYXNlIDA6CisJCWF0aW8tPmNkYl9sZW4gPSA2OworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCQlhdGlvLT5jZGJfbGVuID0gMTA7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJYXRpby0+Y2RiX2xlbiA9IDE2OworCQlicmVhazsKKwljYXNlIDU6CisJCWF0aW8tPmNkYl9sZW4gPSAxMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCWRlZmF1bHQ6CisJCS8qIE9ubHkgY29weSB0aGUgb3Bjb2RlLiAqLworCQlhdGlvLT5jZGJfbGVuID0gMTsKKwkJcHJpbnRmKCJSZXNlcnZlZCBvciBWVSBjb21tYW5kIGNvZGUgdHlwZSBlbmNvdW50ZXJlZFxuIik7CisJCWJyZWFrOworCX0KKwkKKwltZW1jcHkoYXRpby0+Y2RiX2lvLmNkYl9ieXRlcywgYnl0ZSwgYXRpby0+Y2RiX2xlbik7CisKKwlhdGlvLT5jY2JfaC5zdGF0dXMgfD0gQ0FNX0NEQl9SRUNWRDsKKworCWlmICgoY21kLT5pZGVudGlmeSAmIE1TR19JREVOVElGWV9ESVNDRkxBRykgPT0gMCkgeworCQkvKgorCQkgKiBXZSB3ZXJlbid0IGFsbG93ZWQgdG8gZGlzY29ubmVjdC4KKwkJICogV2UncmUgaGFuZ2luZyBvbiB0aGUgYnVzIHVudGlsIGEKKwkJICogY29udGludWUgdGFyZ2V0IEkvTyBjb21lcyBpbiByZXNwb25zZQorCQkgKiB0byB0aGlzIGFjY2VwdCB0aW8uCisJCSAqLworI2lmZGVmIEFIRF9ERUJVRworCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1RRSU4pICE9IDApCisJCQlwcmludGYoIlJlY2VpdmVkIEltbWVkaWF0ZSBDb21tYW5kICVkOiVkOiVkIC0gJXBcbiIsCisJCQkgICAgICAgaW5pdGlhdG9yLCB0YXJnZXQsIGx1biwgYWhkLT5wZW5kaW5nX2RldmljZSk7CisjZW5kaWYKKwkJYWhkLT5wZW5kaW5nX2RldmljZSA9IGxzdGF0ZTsKKwkJYWhkX2ZyZWV6ZV9jY2IoKHVuaW9uIGNjYiAqKWF0aW8pOworCQlhdGlvLT5jY2JfaC5mbGFncyB8PSBDQU1fRElTX0RJU0NPTk5FQ1Q7CisJfQorCXhwdF9kb25lKCh1bmlvbiBjY2IqKWF0aW8pOworCXJldHVybiAoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYmM1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKQEAgLTAsMCArMSw5NjUgQEAKKy8qCisgKiBJbmxpbmUgcm91dGluZXMgc2hhcmVhYmxlIGFjcm9zcyBPUyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4X2lubGluZS5oIzUxICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmIF9BSUM3OVhYX0lOTElORV9IXworI2RlZmluZSBfQUlDNzlYWF9JTkxJTkVfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERlYnVnZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSBjaGFyICphaGRfbmFtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCitzdGF0aWMgX19pbmxpbmUgY2hhciAqCithaGRfbmFtZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuIChhaGQtPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2tub3duX21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgICAgIGFoZF9tb2RlIHNyYywgYWhkX21vZGUgZHN0KTsKK3N0YXRpYyBfX2lubGluZSBhaGRfbW9kZV9zdGF0ZSBhaGRfYnVpbGRfbW9kZV9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICAgYWhkX21vZGUgc3JjLAorCQkJCQkJICAgIGFoZF9tb2RlIGRzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIGFoZF9tb2RlX3N0YXRlIHN0YXRlLAorCQkJCQkgICAgYWhkX21vZGUgKnNyYywgYWhkX21vZGUgKmRzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjLAorCQkJCSAgIGFoZF9tb2RlIGRzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfdXBkYXRlX21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfYXNzZXJ0X21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjbW9kZSwKKwkJCQkgICAgICBhaGRfbW9kZSBkc3Rtb2RlLCBjb25zdCBjaGFyICpmaWxlLAorCQkJCSAgICAgIGludCBsaW5lKTsKK3N0YXRpYyBfX2lubGluZSBhaGRfbW9kZV9zdGF0ZSBhaGRfc2F2ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3Jlc3RvcmVfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICAgICBhaGRfbW9kZV9zdGF0ZSBzdGF0ZSk7CitzdGF0aWMgX19pbmxpbmUgaW50ICBhaGRfaXNfcGF1c2VkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfcGF1c2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF91bnBhdXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfa25vd25fbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZSBzcmMsIGFoZF9tb2RlIGRzdCkKK3sKKwlhaGQtPnNyY19tb2RlID0gc3JjOworCWFoZC0+ZHN0X21vZGUgPSBkc3Q7CisJYWhkLT5zYXZlZF9zcmNfbW9kZSA9IHNyYzsKKwlhaGQtPnNhdmVkX2RzdF9tb2RlID0gZHN0OworfQorCitzdGF0aWMgX19pbmxpbmUgYWhkX21vZGVfc3RhdGUKK2FoZF9idWlsZF9tb2RlX3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjLCBhaGRfbW9kZSBkc3QpCit7CisJcmV0dXJuICgoc3JjIDw8IFNSQ19NT0RFX1NISUZUKSB8IChkc3QgPDwgRFNUX01PREVfU0hJRlQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9leHRyYWN0X21vZGVfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZV9zdGF0ZSBzdGF0ZSwKKwkJICAgICAgIGFoZF9tb2RlICpzcmMsIGFoZF9tb2RlICpkc3QpCit7CisJKnNyYyA9IChzdGF0ZSAmIFNSQ19NT0RFKSA+PiBTUkNfTU9ERV9TSElGVDsKKwkqZHN0ID0gKHN0YXRlICYgRFNUX01PREUpID4+IERTVF9NT0RFX1NISUZUOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlIHNyYywgYWhkX21vZGUgZHN0KQoreworCWlmIChhaGQtPnNyY19tb2RlID09IHNyYyAmJiBhaGQtPmRzdF9tb2RlID09IGRzdCkKKwkJcmV0dXJuOworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGQtPnNyY19tb2RlID09IEFIRF9NT0RFX1VOS05PV04KKwkgfHwgYWhkLT5kc3RfbW9kZSA9PSBBSERfTU9ERV9VTktOT1dOKQorCQlwYW5pYygiU2V0dGluZyBtb2RlIHByaW9yIHRvIHNhdmluZyBpdC5cbiIpOworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfTU9ERVBUUikgIT0gMCkKKwkJcHJpbnRmKCIlczogU2V0dGluZyBtb2RlIDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBhaGRfYnVpbGRfbW9kZV9zdGF0ZShhaGQsIHNyYywgZHN0KSk7CisjZW5kaWYKKwlhaGRfb3V0YihhaGQsIE1PREVfUFRSLCBhaGRfYnVpbGRfbW9kZV9zdGF0ZShhaGQsIHNyYywgZHN0KSk7CisJYWhkLT5zcmNfbW9kZSA9IHNyYzsKKwlhaGQtPmRzdF9tb2RlID0gZHN0OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3VwZGF0ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJYWhkX21vZGVfc3RhdGUgbW9kZV9wdHI7CisJYWhkX21vZGUgc3JjOworCWFoZF9tb2RlIGRzdDsKKworCW1vZGVfcHRyID0gYWhkX2luYihhaGQsIE1PREVfUFRSKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX01PREVQVFIpICE9IDApCisJCXByaW50ZigiUmVhZGluZyBtb2RlIDB4JXhcbiIsIG1vZGVfcHRyKTsKKyNlbmRpZgorCWFoZF9leHRyYWN0X21vZGVfc3RhdGUoYWhkLCBtb2RlX3B0ciwgJnNyYywgJmRzdCk7CisJYWhkX2tub3duX21vZGVzKGFoZCwgc3JjLCBkc3QpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2Fzc2VydF9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlIHNyY21vZGUsCisJCSBhaGRfbW9kZSBkc3Rtb2RlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoKHNyY21vZGUgJiBBSERfTUtfTVNLKGFoZC0+c3JjX21vZGUpKSA9PSAwCisJIHx8IChkc3Rtb2RlICYgQUhEX01LX01TSyhhaGQtPmRzdF9tb2RlKSkgPT0gMCkgeworCQlwYW5pYygiJXM6JXM6JWQ6IE1vZGUgYXNzZXJ0aW9uIGZhaWxlZC5cbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBmaWxlLCBsaW5lKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIGFoZF9tb2RlX3N0YXRlCithaGRfc2F2ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJaWYgKGFoZC0+c3JjX21vZGUgPT0gQUhEX01PREVfVU5LTk9XTgorCSB8fCBhaGQtPmRzdF9tb2RlID09IEFIRF9NT0RFX1VOS05PV04pCisJCWFoZF91cGRhdGVfbW9kZXMoYWhkKTsKKworCXJldHVybiAoYWhkX2J1aWxkX21vZGVfc3RhdGUoYWhkLCBhaGQtPnNyY19tb2RlLCBhaGQtPmRzdF9tb2RlKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfcmVzdG9yZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlX3N0YXRlIHN0YXRlKQoreworCWFoZF9tb2RlIHNyYzsKKwlhaGRfbW9kZSBkc3Q7CisKKwlhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKGFoZCwgc3RhdGUsICZzcmMsICZkc3QpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBzcmMsIGRzdCk7Cit9CisKKyNkZWZpbmUgQUhEX0FTU0VSVF9NT0RFUyhhaGQsIHNvdXJjZSwgZGVzdCkgXAorCWFoZF9hc3NlcnRfbW9kZXMoYWhkLCBzb3VyY2UsIGRlc3QsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIGhhcyBoYWx0ZWQgY29kZSBleGVjdXRpb24uCisgKiBSZXR1cm5zIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUgc2VxdWVuY2VyIGlzIHN0b3BwZWQuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoZF9pc19wYXVzZWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZF9pbmIoYWhkLCBIQ05UUkwpICYgUEFVU0UpICE9IDApOworfQorCisvKgorICogUmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZXIgc3RvcCBhbmQgd2FpdCwgaW5kZWZpbml0ZWx5LCBmb3IgaXQKKyAqIHRvIHN0b3AuICBUaGUgc2VxdWVuY2VyIHdpbGwgb25seSBhY2tub3dsZWRnZSB0aGF0IGl0IGlzIHBhdXNlZAorICogb25jZSBpdCBoYXMgcmVhY2hlZCBhbiBpbnN0cnVjdGlvbiBib3VuZGFyeSBhbmQgUEFVU0VESVMgaXMKKyAqIGNsZWFyZWQgaW4gdGhlIFNFUUNUTCByZWdpc3Rlci4gIFRoZSBzZXF1ZW5jZXIgbWF5IHVzZSBQQVVTRURJUworICogZm9yIGNyaXRpY2FsIHNlY3Rpb25zLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3BhdXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGRfb3V0YihhaGQsIEhDTlRSTCwgYWhkLT5wYXVzZSk7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBzZXF1ZW5jZXIgY2FuIGRpc2FibGUgcGF1c2luZyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sIHdlCisJICogbXVzdCBsb29wIHVudGlsIGl0IGFjdHVhbGx5IHN0b3BzLgorCSAqLworCXdoaWxlIChhaGRfaXNfcGF1c2VkKGFoZCkgPT0gMCkKKwkJOworfQorCisvKgorICogQWxsb3cgdGhlIHNlcXVlbmNlciB0byBjb250aW51ZSBwcm9ncmFtIGV4ZWN1dGlvbi4KKyAqIFdlIGNoZWNrIGhlcmUgdG8gZW5zdXJlIHRoYXQgbm8gYWRkaXRpb25hbCBpbnRlcnJ1cHQKKyAqIHNvdXJjZXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgc2VxdWVuY2VyIHRvIGhhbHQgaGF2ZSBiZWVuCisgKiBhc3NlcnRlZC4gIElmLCBmb3IgZXhhbXBsZSwgYSBTQ1NJIGJ1cyByZXNldCBpcyBkZXRlY3RlZAorICogd2hpbGUgd2UgYXJlIGZpZWxkaW5nIGEgZGlmZmVyZW50LCBwYXVzaW5nLCBpbnRlcnJ1cHQgdHlwZSwKKyAqIHdlIGRvbid0IHdhbnQgdG8gcmVsZWFzZSB0aGUgc2VxdWVuY2VyIGJlZm9yZSBnb2luZyBiYWNrCisgKiBpbnRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZGVhbGluZyB3aXRoIHRoaXMgbmV3CisgKiBjb25kaXRpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdW5wYXVzZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyoKKwkgKiBBdXRvbWF0aWNhbGx5IHJlc3RvcmUgb3VyIG1vZGVzIHRvIHRob3NlIHNhdmVkCisJICogcHJpb3IgdG8gdGhlIGZpcnN0IGNoYW5nZSBvZiB0aGUgbW9kZS4KKwkgKi8KKwlpZiAoYWhkLT5zYXZlZF9zcmNfbW9kZSAhPSBBSERfTU9ERV9VTktOT1dOCisJICYmIGFoZC0+c2F2ZWRfZHN0X21vZGUgIT0gQUhEX01PREVfVU5LTk9XTikgeworCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVVBEQVRFX1BFTkRfQ01EUykgIT0gMCkKKwkJCWFoZF9yZXNldF9jbWRzX3BlbmRpbmcoYWhkKTsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIGFoZC0+c2F2ZWRfc3JjX21vZGUsIGFoZC0+c2F2ZWRfZHN0X21vZGUpOworCX0KKworCWlmICgoYWhkX2luYihhaGQsIElOVFNUQVQpICYgfkNNRENNUExUKSA9PSAwKQorCQlhaGRfb3V0YihhaGQsIEhDTlRSTCwgYWhkLT51bnBhdXNlKTsKKworCWFoZF9rbm93bl9tb2RlcyhhaGQsIEFIRF9NT0RFX1VOS05PV04sIEFIRF9NT0RFX1VOS05PV04pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogU2NhdHRlciBHYXRoZXIgTGlzdCBIYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQJKmFoZF9zZ19zZXR1cChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCQkgICAgICB2b2lkICpzZ3B0ciwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCSAgICAgIGJ1c19zaXplX3QgbGVuLCBpbnQgbGFzdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAkgYWhkX3NldHVwX3NjYl9jb21tb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQJIGFoZF9zZXR1cF9kYXRhX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQJIGFoZF9zZXR1cF9ub3hmZXJfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgc3RydWN0IHNjYiAqc2NiKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQgKgorYWhkX3NnX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLAorCSAgICAgdm9pZCAqc2dwdHIsIGRtYV9hZGRyX3QgYWRkciwgYnVzX3NpemVfdCBsZW4sIGludCBsYXN0KQoreworCXNjYi0+c2dfY291bnQrKzsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNAorCSAmJiAoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqKXNncHRyOworCQlzZy0+YWRkciA9IGFoZF9odG9sZTY0KGFkZHIpOworCQlzZy0+bGVuID0gYWhkX2h0b2xlMzIobGVuIHwgKGxhc3QgPyBBSERfRE1BX0xBU1RfU0VHIDogMCkpOworCQlyZXR1cm4gKHNnICsgMSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYV9zZWcgKilzZ3B0cjsKKwkJc2ctPmFkZHIgPSBhaGRfaHRvbGUzMihhZGRyICYgMHhGRkZGRkZGRik7CisJCXNnLT5sZW4gPSBhaGRfaHRvbGUzMihsZW4gfCAoKGFkZHIgPj4gOCkgJiAweDdGMDAwMDAwKQorCQkJCSAgICB8IChsYXN0ID8gQUhEX0RNQV9MQVNUX1NFRyA6IDApKTsKKwkJcmV0dXJuIChzZyArIDEpOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXR1cF9zY2JfY29tbW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCS8qIFhYWCBIYW5kbGUgdGFyZ2V0IG1vZGUgU0NCcy4gKi8KKwlzY2ItPmNyY19yZXRyeV9jb3VudCA9IDA7CisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1BBQ0tFVElaRUQpICE9IDApIHsKKwkJLyogWFhYIHdoYXQgYWJvdXQgQUNBPz8gIEl0IGlzIHR5cGUgNCwgYnV0IFRBR19UWVBFID09IDB4My4gKi8KKwkJc2NiLT5oc2NiLT50YXNrX2F0dHJpYnV0ZSA9IHNjYi0+aHNjYi0+Y29udHJvbCAmIFNDQl9UQUdfVFlQRTsKKwl9IGVsc2UgeworCQlpZiAoYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSAmIDB4MDEpCisJCQlzY2ItPmhzY2ItPnRhc2tfYXR0cmlidXRlID0gU0NCX1hGRVJMRU5fT0REOworCQllbHNlCisJCQlzY2ItPmhzY2ItPnRhc2tfYXR0cmlidXRlID0gMDsKKwl9CisKKwlpZiAoc2NiLT5oc2NiLT5jZGJfbGVuIDw9IE1BWF9DREJfTEVOX1dJVEhfU0VOU0VfQUREUgorCSB8fCAoc2NiLT5oc2NiLT5jZGJfbGVuICYgU0NCX0NEQl9MRU5fUFRSKSAhPSAwKQorCQlzY2ItPmhzY2ItPnNoYXJlZF9kYXRhLmlkYXRhLmNkYl9wbHVzX3NhZGRyLnNlbnNlX2FkZHIgPQorCQkgICAgYWhkX2h0b2xlMzIoc2NiLT5zZW5zZV9idXNhZGRyKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXR1cF9kYXRhX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwkvKgorCSAqIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlICJjdXJyZW50IiBkYXRhIHBvbnRlciBhcmVhLgorCSAqLworCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqKXNjYi0+c2dfbGlzdDsKKwkJc2NiLT5oc2NiLT5kYXRhcHRyID0gc2ctPmFkZHI7CisJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47CisJfSBlbHNlIHsKKwkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKwkJdWludDMyX3QgKmRhdGFwdHJfd29yZHM7CisKKwkJc2cgPSAoc3RydWN0IGFoZF9kbWFfc2VnICopc2NiLT5zZ19saXN0OworCQlkYXRhcHRyX3dvcmRzID0gKHVpbnQzMl90Kikmc2NiLT5oc2NiLT5kYXRhcHRyOworCQlkYXRhcHRyX3dvcmRzWzBdID0gc2ctPmFkZHI7CisJCWRhdGFwdHJfd29yZHNbMV0gPSAwOworCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJdWludDY0X3QgaGlnaF9hZGRyOworCisJCQloaWdoX2FkZHIgPSBhaGRfbGUzMnRvaChzZy0+bGVuKSAmIDB4N0YwMDAwMDA7CisJCQlzY2ItPmhzY2ItPmRhdGFwdHIgfD0gYWhkX2h0b2xlNjQoaGlnaF9hZGRyIDw8IDgpOworCQl9CisJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47CisJfQorCS8qCisJICogTm90ZSB3aGVyZSB0byBmaW5kIHRoZSBTRyBlbnRyaWVzIGluIGJ1cyBzcGFjZS4KKwkgKiBXZSBhbHNvIHNldCB0aGUgZnVsbCByZXNpZHVhbCBmbGFnIHdoaWNoIHRoZSAKKwkgKiBzZXF1ZW5jZXIgd2lsbCBjbGVhciBhcyBzb29uIGFzIGEgZGF0YSB0cmFuc2ZlcgorCSAqIG9jY3Vycy4KKwkgKi8KKwlzY2ItPmhzY2ItPnNncHRyID0gYWhkX2h0b2xlMzIoc2NiLT5zZ19saXN0X2J1c2FkZHJ8U0dfRlVMTF9SRVNJRCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2V0dXBfbm94ZmVyX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzY2ItPmhzY2ItPnNncHRyID0gYWhkX2h0b2xlMzIoU0dfTElTVF9OVUxMKTsKKwlzY2ItPmhzY2ItPmRhdGFwdHIgPSAwOworCXNjYi0+aHNjYi0+ZGF0YWNudCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNZW1vcnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgc2l6ZV90CWFoZF9zZ19zaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCAqCisJCQlhaGRfc2dfYnVzX3RvX3ZpcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkJCSAgIHVpbnQzMl90IHNnX2J1c2FkZHIpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CisJCQlhaGRfc2dfdmlydF90b19idXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkJCSAgIHZvaWQgKnNnKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9zeW5jX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc3luY19zZ2xpc3Qoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQlzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc3luY19zZW5zZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgIHVfaW50IGluZGV4KTsKKworc3RhdGljIF9faW5saW5lIHNpemVfdAorYWhkX3NnX3NpemUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWlmICgoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKQorCQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgYWhkX2RtYTY0X3NlZykpOworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBhaGRfZG1hX3NlZykpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCAqCithaGRfc2dfYnVzX3RvX3ZpcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHNnX2J1c2FkZHIpCit7CisJZG1hX2FkZHJfdCBzZ19vZmZzZXQ7CisKKwkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEsIG5vdCAwICovCisJc2dfb2Zmc2V0ID0gc2dfYnVzYWRkciAtIChzY2ItPnNnX2xpc3RfYnVzYWRkciAtIGFoZF9zZ19zaXplKGFoZCkpOworCXJldHVybiAoKHVpbnQ4X3QgKilzY2ItPnNnX2xpc3QgKyBzZ19vZmZzZXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoZF9zZ192aXJ0X3RvX2J1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2cpCit7CisJZG1hX2FkZHJfdCBzZ19vZmZzZXQ7CisKKwkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEsIG5vdCAwICovCisJc2dfb2Zmc2V0ID0gKCh1aW50OF90ICopc2cgLSAodWludDhfdCAqKXNjYi0+c2dfbGlzdCkKKwkJICAtIGFoZF9zZ19zaXplKGFoZCk7CisKKwlyZXR1cm4gKHNjYi0+c2dfbGlzdF9idXNhZGRyICsgc2dfb2Zmc2V0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zeW5jX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuaHNjYl9kbWF0LAorCQkJc2NiLT5oc2NiX21hcC0+ZG1hbWFwLAorCQkJLypvZmZzZXQqLyh1aW50OF90KilzY2ItPmhzY2IgLSBzY2ItPmhzY2JfbWFwLT52YWRkciwKKwkJCS8qbGVuKi9zaXplb2YoKnNjYi0+aHNjYiksIG9wKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zeW5jX3NnbGlzdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWlmIChzY2ItPnNnX2NvdW50ID09IDApCisJCXJldHVybjsKKworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuc2dfZG1hdCwKKwkJCXNjYi0+c2dfbWFwLT5kbWFtYXAsCisJCQkvKm9mZnNldCovc2NiLT5zZ19saXN0X2J1c2FkZHIgLSBhaGRfc2dfc2l6ZShhaGQpLAorCQkJLypsZW4qL2FoZF9zZ19zaXplKGFoZCkgKiBzY2ItPnNnX2NvdW50LCBvcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc3luY19zZW5zZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuc2Vuc2VfZG1hdCwKKwkJCXNjYi0+c2Vuc2VfbWFwLT5kbWFtYXAsCisJCQkvKm9mZnNldCovc2NiLT5zZW5zZV9idXNhZGRyLAorCQkJLypsZW4qL0FIRF9TRU5TRV9CVUZTSVpFLCBvcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhkX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbmRleCkKK3sKKwlyZXR1cm4gKCgodWludDhfdCAqKSZhaGQtPnRhcmdldGNtZHNbaW5kZXhdKQorCSAgICAgICAtICh1aW50OF90ICopYWhkLT5xb3V0Zmlmbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNaXNjZWxhbmVvdXMgU3VwcG9ydCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKgorCQkJYWhkX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICBjaGFyIGNoYW5uZWwsIHVfaW50IG91cl9pZCwKKwkJCQkJICAgIHVfaW50IHJlbW90ZV9pZCwKKwkJCQkJICAgIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICoqdHN0YXRlKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MTZfdAorCQkJYWhkX2ludyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX291dHcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0LAorCQkJCSB1X2ludCB2YWx1ZSk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoZF9pbmwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9vdXRsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwKKwkJCQkgdWludDMyX3QgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVpbnQ2NF90CisJCQlhaGRfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfb3V0cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsCisJCQkJIHVpbnQ2NF90IHZhbHVlKTsKK3N0YXRpYyBfX2lubGluZSB1X2ludAlhaGRfZ2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zY2JwdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBzY2JwdHIpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfaG5zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9obnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfaGVzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc25zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zbnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc2RzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3NldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9pbmJfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KTsKK3N0YXRpYyBfX2lubGluZSB1X2ludAlhaGRfaW53X3NjYnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoZF9pbmxfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KTsKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorCQkJYWhkX2lucV9zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBvZmZzZXQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9xdWV1ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHVpbnQ4X3QgKgorCQkJYWhkX2dldF9zZW5zZV9idWYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoZF9nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQorCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoYWhkLCBzY2IpOworCWVsc2UKKwkJYWhkX2RvbmUoYWhkLCBzY2IpOworfQorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciByZXBvcnRlZCBhIHJlc2lkdWFsCisgKiBmb3IgdGhpcyBTQ0IvdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQorCQlhaGRfY2FsY19yZXNpZHVhbChhaGQsIHNjYik7Cit9CisKKy8qCisgKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIHRyYW5zZmVyIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgdGhlIHNwZWNpZmllZCBvdXJfaWQvcmVtb3RlX2lkIHBhaXIuCisgKi8KK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqCithaGRfZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLCB1X2ludCBvdXJfaWQsCisJCSAgICB1X2ludCByZW1vdGVfaWQsIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICoqdHN0YXRlKQoreworCS8qCisJICogVHJhbnNmZXIgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBzdG9yZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUKKwkgKiBvZiB0aGUgdGFyZ2V0IHJvbGUuICBTaW5jZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBjb25uZWN0aW9uCisJICogaW4gdGhlIGluaXRpYXRvciByb2xlIHRvIGEgZ2l2ZW4gdGFyZ2V0IGFyZSB0aGUgc2FtZSBhcworCSAqIHdoZW4gdGhlIHJvbGVzIGFyZSByZXZlcnNlZCwgd2UgcHJldGVuZCB3ZSBhcmUgdGhlIHRhcmdldC4KKwkgKi8KKwlpZiAoY2hhbm5lbCA9PSAnQicpCisJCW91cl9pZCArPSA4OworCSp0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tvdXJfaWRdOworCXJldHVybiAoJigqdHN0YXRlKS0+dHJhbnNpbmZvW3JlbW90ZV9pZF0pOworfQorCisjZGVmaW5lIEFIRF9DT1BZX0NPTF9JRFgoZHN0LCBzcmMpCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlkc3QtPmhzY2ItPnNjc2lpZCA9IHNyYy0+aHNjYi0+c2NzaWlkOwkJCVwKKwlkc3QtPmhzY2ItPmx1biA9IHNyYy0+aHNjYi0+bHVuOwkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBfX2lubGluZSB1aW50MTZfdAorYWhkX2ludyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpCit7CisJcmV0dXJuICgoYWhkX2luYihhaGQsIHBvcnQrMSkgPDwgOCkgfCBhaGRfaW5iKGFoZCwgcG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX291dHcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0LCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0YihhaGQsIHBvcnQsIHZhbHVlICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoZF9pbmwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0KQoreworCXJldHVybiAoKGFoZF9pbmIoYWhkLCBwb3J0KSkKKwkgICAgICB8IChhaGRfaW5iKGFoZCwgcG9ydCsxKSA8PCA4KQorCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzIpIDw8IDE2KQorCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzMpIDw8IDI0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfb3V0bChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsIHVpbnQzMl90IHZhbHVlKQoreworCWFoZF9vdXRiKGFoZCwgcG9ydCwgKHZhbHVlKSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsxLCAoKHZhbHVlKSA+PiA4KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsyLCAoKHZhbHVlKSA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrMywgKCh2YWx1ZSkgPj4gMjQpICYgMHhGRik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorYWhkX2lucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpCit7CisJcmV0dXJuICgoYWhkX2luYihhaGQsIHBvcnQpKQorCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzEpIDw8IDgpCisJICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMikgPDwgMTYpCisJICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMykgPDwgMjQpCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs0KSkgPDwgMzIpCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs1KSkgPDwgNDApCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs2KSkgPDwgNDgpCisJICAgICAgfCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs3KSkgPDwgNTYpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9vdXRxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwgdWludDY0X3QgdmFsdWUpCit7CisJYWhkX291dGIoYWhkLCBwb3J0LCB2YWx1ZSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsxLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrMiwgKHZhbHVlID4+IDE2KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCszLCAodmFsdWUgPj4gMjQpICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzQsICh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrNSwgKHZhbHVlID4+IDQwKSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCs2LCAodmFsdWUgPj4gNDgpICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzcsICh2YWx1ZSA+PiA1NikgJiAweEZGKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfZ2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJcmV0dXJuIChhaGRfaW5iKGFoZCwgU0NCUFRSKSB8IChhaGRfaW5iKGFoZCwgU0NCUFRSICsgMSkgPDwgOCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9zY2JwdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBzY2JwdHIpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJYWhkX291dGIoYWhkLCBTQ0JQVFIsIHNjYnB0ciAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgU0NCUFRSKzEsIChzY2JwdHIgPj4gOCkgJiAweEZGKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfZ2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoYWhkX2lud19hdG9taWMoYWhkLCBITlNDQl9RT0ZGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0d19hdG9taWMoYWhkLCBITlNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2dldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKGFoZF9pbmIoYWhkLCBIRVNDQl9RT0ZGKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2V0X2hlc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0YihhaGQsIEhFU0NCX1FPRkYsIHZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfZ2V0X3Nuc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IG9sZHZhbHVlOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlvbGR2YWx1ZSA9IGFoZF9pbncoYWhkLCBTTlNDQl9RT0ZGKTsKKwlhaGRfb3V0dyhhaGQsIFNOU0NCX1FPRkYsIG9sZHZhbHVlKTsKKwlyZXR1cm4gKG9sZHZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXRfc25zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHZhbHVlKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJYWhkX291dHcoYWhkLCBTTlNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2dldF9zZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCXJldHVybiAoYWhkX2luYihhaGQsIFNFU0NCX1FPRkYpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHZhbHVlKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJYWhkX291dGIoYWhkLCBTRVNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2dldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOworCXJldHVybiAoYWhkX2luYihhaGQsIFNEU0NCX1FPRkYpIHwgKGFoZF9pbmIoYWhkLCBTRFNDQl9RT0ZGICsgMSkgPDwgOCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlhaGRfb3V0YihhaGQsIFNEU0NCX1FPRkYsIHZhbHVlICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBTRFNDQl9RT0ZGKzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdV9pbnQKK2FoZF9pbmJfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KQoreworCXVfaW50IHZhbHVlOworCisJLyoKKwkgKiBXb3JrYXJvdW5kIFBDSS1YIFJldiBBLiBoYXJkd2FyZSBidWcuCisJICogQWZ0ZXIgYSBob3N0IHJlYWQgb2YgU0NCIG1lbW9yeSwgdGhlIGNoaXAKKwkgKiBtYXkgYmVjb21lIGNvbmZ1c2VkIGludG8gdGhpbmtpbmcgcHJlZmV0Y2gKKwkgKiB3YXMgcmVxdWlyZWQuICBUaGlzIHN0YXJ0cyB0aGUgZGlzY2FyZCB0aW1lcgorCSAqIHJ1bm5pbmcgYW5kIGNhbiBjYXVzZSBhbiB1bmV4cGVjdGVkIGRpc2NhcmQKKwkgKiB0aW1lciBpbnRlcnJ1cHQuICBUaGUgd29yayBhcm91bmQgaXMgdG8gcmVhZAorCSAqIGEgbm9ybWFsIHJlZ2lzdGVyIHByaW9yIHRvIHRoZSBleGhhdXN0aW9uIG9mCisJICogdGhlIGRpc2NhcmQgdGltZXIuICBUaGUgbW9kZSBwb2ludGVyIHJlZ2lzdGVyCisJICogaGFzIG5vIHNpZGUgZWZmZWN0cyBhbmQgc28gc2VydmVzIHdlbGwgZm9yCisJICogdGhpcyBwdXJwb3NlLgorCSAqCisJICogUmF6b3IgIzUyOAorCSAqLworCXZhbHVlID0gYWhkX2luYihhaGQsIG9mZnNldCk7CisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1BDSVhfU0NCUkFNX1JEX0JVRykgIT0gMCkKKwkJYWhkX2luYihhaGQsIE1PREVfUFRSKTsKKwlyZXR1cm4gKHZhbHVlKTsKK30KKworc3RhdGljIF9faW5saW5lIHVfaW50CithaGRfaW53X3NjYnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKGFoZF9pbmJfc2NicmFtKGFoZCwgb2Zmc2V0KQorCSAgICAgIHwgKGFoZF9pbmJfc2NicmFtKGFoZCwgb2Zmc2V0KzEpIDw8IDgpKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CithaGRfaW5sX3NjYnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKGFoZF9pbndfc2NicmFtKGFoZCwgb2Zmc2V0KQorCSAgICAgIHwgKGFoZF9pbndfc2NicmFtKGFoZCwgb2Zmc2V0KzIpIDw8IDE2KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorYWhkX2lucV9zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBvZmZzZXQpCit7CisJcmV0dXJuIChhaGRfaW5sX3NjYnJhbShhaGQsIG9mZnNldCkKKwkgICAgICB8ICgodWludDY0X3QpYWhkX2lubF9zY2JyYW0oYWhkLCBvZmZzZXQrNCkpIDw8IDMyKTsKK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY2IgKgorYWhkX2xvb2t1cF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YWcpCit7CisJc3RydWN0IHNjYiogc2NiOworCisJaWYgKHRhZyA+PSBBSERfU0NCX01BWCkKKwkJcmV0dXJuIChOVUxMKTsKKwlzY2IgPSBhaGQtPnNjYl9kYXRhLnNjYmluZGV4W3RhZ107CisJaWYgKHNjYiAhPSBOVUxMKQorCQlhaGRfc3luY19zY2IoYWhkLCBzY2IsCisJCQkgICAgIEJVU19ETUFTWU5DX1BPU1RSRUFEfEJVU19ETUFTWU5DX1BPU1RXUklURSk7CisJcmV0dXJuIChzY2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqcV9oc2NiOworCXVpbnQzMl90IHNhdmVkX2hzY2JfYnVzYWRkcjsKKworCS8qCisJICogT3VyIHF1ZXVpbmcgbWV0aG9kIGlzIGEgYml0IHRyaWNreS4gIFRoZSBjYXJkCisJICoga25vd3MgaW4gYWR2YW5jZSB3aGljaCBIU0NCIChieSBhZGRyZXNzKSB0byBkb3dubG9hZCwKKwkgKiBhbmQgd2UgY2FuJ3QgZGlzYXBwb2ludCBpdC4gIFRvIGFjaGlldmUgdGhpcywgdGhlIG5leHQKKwkgKiBIU0NCIHRvIGRvd25sb2FkIGlzIHNhdmVkIG9mZiBpbiBhaGQtPm5leHRfcXVldWVkX2hzY2IuCisJICogV2hlbiB3ZSBhcmUgY2FsbGVkIHRvIHF1ZXVlICJhbiBhcmJpdHJhcnkgc2NiIiwKKwkgKiB3ZSBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgaW5jb21pbmcgSFNDQiB0byB0aGUgb25lCisJICogdGhlIHNlcXVlbmNlciBrbm93cyBhYm91dCwgc3dhcCBIU0NCIHBvaW50ZXJzIGFuZAorCSAqIGZpbmFsbHkgYXNzaWduIHRoZSBTQ0IgdG8gdGhlIHRhZyBpbmRleGVkIGxvY2F0aW9uCisJICogaW4gdGhlIHNjYl9hcnJheS4gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHdlIGNhbiBzdGlsbAorCSAqIGxvY2F0ZSB0aGUgY29ycmVjdCBTQ0IgYnkgU0NCX1RBRy4KKwkgKi8KKwlxX2hzY2IgPSBhaGQtPm5leHRfcXVldWVkX2hzY2I7CisJc2F2ZWRfaHNjYl9idXNhZGRyID0gcV9oc2NiLT5oc2NiX2J1c2FkZHI7CisJbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNjYi0+aHNjYikpOworCXFfaHNjYi0+aHNjYl9idXNhZGRyID0gc2F2ZWRfaHNjYl9idXNhZGRyOworCXFfaHNjYi0+bmV4dF9oc2NiX2J1c2FkZHIgPSBzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcjsKKworCS8qIE5vdyBzd2FwIEhTQ0IgcG9pbnRlcnMuICovCisJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiID0gc2NiLT5oc2NiOworCXNjYi0+aHNjYiA9IHFfaHNjYjsKKworCS8qIE5vdyBkZWZpbmUgdGhlIG1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCIGluIHRoZSBzY2JpbmRleCAqLworCWFoZC0+c2NiX2RhdGEuc2NiaW5kZXhbU0NCX0dFVF9UQUcoc2NiKV0gPSBzY2I7Cit9CisKKy8qCisgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgYWJvdXQgYSBuZXcgdHJhbnNhY3Rpb24gdG8gZXhlY3V0ZS4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9xdWV1ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2IoYWhkLCBzY2IpOworCisJaWYgKFNDQklEX0lTX05VTEwoU0NCX0dFVF9UQUcoc2NiKSkpCisJCXBhbmljKCJBdHRlbXB0IHRvIHF1ZXVlIGludmFsaWQgU0NCIHRhZyAleFxuIiwKKwkJICAgICAgU0NCX0dFVF9UQUcoc2NiKSk7CisKKwkvKgorCSAqIEtlZXAgYSBoaXN0b3J5IG9mIFNDQnMgd2UndmUgZG93bmxvYWRlZCBpbiB0aGUgcWluZmlmby4KKwkgKi8KKwlhaGQtPnFpbmZpZm9bQUhEX1FJTl9XUkFQKGFoZC0+cWluZmlmb25leHQpXSA9IFNDQl9HRVRfVEFHKHNjYik7CisJYWhkLT5xaW5maWZvbmV4dCsrOworCisJaWYgKHNjYi0+c2dfY291bnQgIT0gMCkKKwkJYWhkX3NldHVwX2RhdGFfc2NiKGFoZCwgc2NiKTsKKwllbHNlCisJCWFoZF9zZXR1cF9ub3hmZXJfc2NiKGFoZCwgc2NiKTsKKwlhaGRfc2V0dXBfc2NiX2NvbW1vbihhaGQsIHNjYik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBvdXIgZGF0YSBpcyBjb25zaXN0ZW50IGZyb20gdGhlCisJICogcGVyc3BlY3RpdmUgb2YgdGhlIGFkYXB0ZXIuCisJICovCisJYWhkX3N5bmNfc2NiKGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUVVFVUUpICE9IDApIHsKKwkJdWludDY0X3QgaG9zdF9kYXRhcHRyOworCisJCWhvc3RfZGF0YXB0ciA9IGFoZF9sZTY0dG9oKHNjYi0+aHNjYi0+ZGF0YXB0cik7CisJCXByaW50ZigiJXM6IFF1ZXVlaW5nIFNDQiAweCV4IGJ1cyBhZGRyIDB4JXggLSAweCV4JXgvMHgleFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICBTQ0JfR0VUX1RBRyhzY2IpLCBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPmhzY2JfYnVzYWRkciksCisJCSAgICAgICAodV9pbnQpKChob3N0X2RhdGFwdHIgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJCSAgICAgICAodV9pbnQpKGhvc3RfZGF0YXB0ciAmIDB4RkZGRkZGRkYpLAorCQkgICAgICAgYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5kYXRhY250KSk7CisJfQorI2VuZGlmCisJLyogVGVsbCB0aGUgYWRhcHRlciBhYm91dCB0aGUgbmV3bHkgcXVldWVkIFNDQiAqLworCWFoZF9zZXRfaG5zY2JfcW9mZihhaGQsIGFoZC0+cWluZmlmb25leHQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDhfdCAqCithaGRfZ2V0X3NlbnNlX2J1ZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNjYi0+c2Vuc2VfZGF0YSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhkX2dldF9zZW5zZV9idWZhZGRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5zZW5zZV9idXNhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEludGVycnVwdCBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9zeW5jX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoZF9zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKTsKK3N0YXRpYyBfX2lubGluZSB1X2ludAlhaGRfY2hlY2tfY21kY21wbHRxdWV1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBfX2lubGluZSBpbnQJYWhkX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zeW5jX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkvKm9mZnNldCovMCwgLypsZW4qL0FIQ19TQ0JfTUFYICogc2l6ZW9mKHVpbnQxNl90KSwgb3ApOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3N5bmNfdHFpbmZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgb3ApCit7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJCWFoZF90YXJnZXRjbWRfb2Zmc2V0KGFoZCwgMCksCisJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSAqIEFIRF9UTU9ERV9DTURTLAorCQkJCW9wKTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFNlZSBpZiB0aGUgZmlybXdhcmUgaGFzIHBvc3RlZCBhbnkgY29tcGxldGVkIGNvbW1hbmRzCisgKiBpbnRvIG91ciBpbi1jb3JlIGNvbW1hbmQgY29tcGxldGUgZmlmb3MuCisgKi8KKyNkZWZpbmUgQUhEX1JVTl9RT1VURklGTyAweDEKKyNkZWZpbmUgQUhEX1JVTl9UUUlORklGTyAweDIKK3N0YXRpYyBfX2lubGluZSB1X2ludAorYWhkX2NoZWNrX2NtZGNtcGx0cXVldWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2ludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkvKm9mZnNldCovYWhkLT5xb3V0Zmlmb25leHQsIC8qbGVuKi8yLAorCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQpOworCWlmICgoYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0KKwkgICAgICYgUU9VVEZJRk9fRU5UUllfVkFMSURfTEUpID09IGFoZC0+cW91dGZpZm9uZXh0X3ZhbGlkX3RhZykKKwkJcmV0dmFsIHw9IEFIRF9SVU5fUU9VVEZJRk87CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1RBUkdFVFJPTEUpICE9IDAKKwkgJiYgKGFoZC0+ZmxhZ3MgJiBBSERfVFFJTkZJRk9fQkxPQ0tFRCkgPT0gMCkgeworCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhkLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQtPnRxaW5maWZvZm5leHQpLAorCQkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAorCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwkJaWYgKGFoZC0+dGFyZ2V0Y21kc1thaGQtPnRxaW5maWZvbmV4dF0uY21kX3ZhbGlkICE9IDApCisJCQlyZXR2YWwgfD0gQUhEX1JVTl9UUUlORklGTzsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKy8qCisgKiBDYXRjaCBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlcgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CithaGRfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdV9pbnQJaW50c3RhdDsKKworCWlmICgoYWhkLT5wYXVzZSAmIElOVEVOKSA9PSAwKSB7CisJCS8qCisJCSAqIE91ciBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNoaXAKKwkJICogYW5kIG1heSBiZSBkaXNhYmxlZCBmb3IgcmUtZW50cmFuY3kgcmVhc29ucywKKwkJICogc28ganVzdCByZXR1cm4uICBUaGlzIGlzIGxpa2VseSBqdXN0IGEgc2hhcmVkCisJCSAqIGludGVycnVwdC4KKwkJICovCisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBJbnN0ZWFkIG9mIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIsCisJICogaW5mZXIgdGhlIGNhdXNlIG9mIHRoZSBpbnRlcnJ1cHQgYnkgY2hlY2tpbmcgb3VyIGluLWNvcmUKKwkgKiBjb21wbGV0aW9uIHF1ZXVlcy4gIFRoaXMgYXZvaWRzIGEgY29zdGx5IFBDSSBidXMgcmVhZCBpbgorCSAqIG1vc3QgY2FzZXMuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX0FMTF9JTlRFUlJVUFRTKSA9PSAwCisJICYmIChhaGRfY2hlY2tfY21kY21wbHRxdWV1ZXMoYWhkKSAhPSAwKSkKKwkJaW50c3RhdCA9IENNRENNUExUOworCWVsc2UKKwkJaW50c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKKworCWlmICgoaW50c3RhdCAmIElOVF9QRU5EKSA9PSAwKQorCQlyZXR1cm4gKDApOworCisJaWYgKGludHN0YXQgJiBDTURDTVBMVCkgeworCQlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSQ01ESU5UKTsKKworCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgY2hpcCBzZWVzIHRoYXQgd2UndmUgY2xlYXJlZAorCQkgKiB0aGlzIGludGVycnVwdCBiZWZvcmUgd2Ugd2FsayB0aGUgb3V0cHV0IGZpZm8uCisJCSAqIE90aGVyd2lzZSwgd2UgbWF5LCBkdWUgdG8gcG9zdGVkIGJ1cyB3cml0ZXMsCisJCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIgd2UgZmluaXNoIHRoZSBzY2FuLAorCQkgKiBhbmQgYWZ0ZXIgdGhlIHNlcXVlbmNlciBoYXMgYWRkZWQgbmV3IGVudHJpZXMKKwkJICogYW5kIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgYWdhaW4uCisJCSAqLworCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9JTlRDT0xMSVNJT05fQlVHKSAhPSAwKSB7CisJCQlpZiAoYWhkX2lzX3BhdXNlZChhaGQpKSB7CisJCQkJLyoKKwkJCQkgKiBQb3RlbnRpYWxseSBsb3N0IFNFUUlOVC4KKwkJCQkgKiBJZiBTRVFJTlRDT0RFIGlzIG5vbi16ZXJvLAorCQkJCSAqIHNpbXVsYXRlIHRoZSBTRVFJTlQuCisJCQkJICovCisJCQkJaWYgKGFoZF9pbmIoYWhkLCBTRVFJTlRDT0RFKSAhPSBOT19TRVFJTlQpCisJCQkJCWludHN0YXQgfD0gU0VRSU5UOworCQkJfQorCQl9IGVsc2UgeworCQkJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKKwkJfQorCQlhaGRfcnVuX3FvdXRmaWZvKGFoZCk7CisJCWFoZC0+Y21kY21wbHRfY291bnRzW2FoZC0+Y21kY21wbHRfYnVja2V0XSsrOworCQlhaGQtPmNtZGNtcGx0X3RvdGFsKys7CisjaWZkZWYgQUhEX1RBUkdFVF9NT0RFCisJCWlmICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKQorCQkJYWhkX3J1bl90cWluZmlmbyhhaGQsIC8qcGF1c2VkKi9GQUxTRSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBzdGF0dXNlcyB0aGF0IG1heSBpbnZhbGlkYXRlIG91ciBjYWNoZWQKKwkgKiBjb3B5IG9mIElOVFNUQVQgc2VwYXJhdGVseS4KKwkgKi8KKwlpZiAoaW50c3RhdCA9PSAweEZGICYmIChhaGQtPmZlYXR1cmVzICYgQUhEX1JFTU9WQUJMRSkgIT0gMCkgeworCQkvKiBIb3QgZWplY3QuICBEbyBub3RoaW5nICovCisJfSBlbHNlIGlmIChpbnRzdGF0ICYgSFdFUlJJTlQpIHsKKwkJYWhkX2hhbmRsZV9od2VycmludChhaGQpOworCX0gZWxzZSBpZiAoKGludHN0YXQgJiAoUENJSU5UfFNQTFRJTlQpKSAhPSAwKSB7CisJCWFoZC0+YnVzX2ludHIoYWhkKTsKKwl9IGVsc2UgeworCisJCWlmICgoaW50c3RhdCAmIFNFUUlOVCkgIT0gMCkKKwkJCWFoZF9oYW5kbGVfc2VxaW50KGFoZCwgaW50c3RhdCk7CisKKwkJaWYgKChpbnRzdGF0ICYgU0NTSUlOVCkgIT0gMCkKKwkJCWFoZF9oYW5kbGVfc2NzaWludChhaGQsIGludHN0YXQpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisjZW5kaWYgIC8qIF9BSUM3OVhYX0lOTElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyODc3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKQEAgLTAsMCArMSw1MDE3IEBACisvKgorICogQWRhcHRlYyBBSUM3OXh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2xpbnV4L2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMjMTcxICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgRG91ZyBMZWRmb3JkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSAiYWljNzl4eF9vc20uaCIKKyNpbmNsdWRlICJhaWM3OXh4X2lubGluZS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisvKgorICogSW5jbHVkZSBhaWNsaWIuYyBhcyBwYXJ0IG9mIG91cgorICogIm1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGhhcmQiIHdvcmsgYXJvdW5kLgorICovCisjaW5jbHVkZSAiYWljbGliLmMiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBfX3NldHVwICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpbmNsdWRlICJzZC5oIgkJCS8qIEZvciBnZW9tZXRyeSBkZXRlY3Rpb24gKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIEZvciBmZXRjaGluZyBzeXN0ZW0gbWVtb3J5IHNpemUgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBGb3Igc3NsZWVwL21zbGVlcCAqLworCisvKgorICogTG9jayBwcm90ZWN0aW5nIG1hbmlwdWxhdGlvbiBvZiB0aGUgYWhkIHNvZnRjIGxpc3QuCisgKi8KK3NwaW5sb2NrX3QgYWhkX2xpc3Rfc3BpbmxvY2s7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qIEZvciBkeW5hbWljIHNnbGlzdCBzaXplIGNhbGN1bGF0aW9uLiAqLwordV9pbnQgYWhkX2xpbnV4X25zZWc7CisjZW5kaWYKKworLyoKKyAqIEJ1Y2tldCBzaXplIGZvciBjb3VudGluZyBnb29kIGNvbW1hbmRzIGluIGJldHdlZW4gYmFkIG9uZXMuCisgKi8KKyNkZWZpbmUgQUhEX0xJTlVYX0VSUl9USFJFU0gJMTAwMAorCisvKgorICogU2V0IHRoaXMgdG8gdGhlIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgU0NTSSBidXMgcmVzZXQuCisgKiBOb3RlLCB3ZSBob25vciB0aGlzIG9ubHkgZm9yIHRoZSBpbml0aWFsIGJ1cyByZXNldC4KKyAqIFRoZSBzY3NpIGVycm9yIHJlY292ZXJ5IGNvZGUgcGVyZm9ybXMgaXRzIG93biBidXMgc2V0dGxlCisgKiBkZWxheSBoYW5kbGluZyBmb3IgZXJyb3IgcmVjb3ZlcnkgYWN0aW9ucy4KKyAqLworI2lmZGVmIENPTkZJR19BSUM3OVhYX1JFU0VUX0RFTEFZX01TCisjZGVmaW5lIEFJQzc5WFhfUkVTRVRfREVMQVkgQ09ORklHX0FJQzc5WFhfUkVTRVRfREVMQVlfTVMKKyNlbHNlCisjZGVmaW5lIEFJQzc5WFhfUkVTRVRfREVMQVkgNTAwMAorI2VuZGlmCisKKy8qCisgKiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMgYWxsb3dlZCBwZXItZGV2aWNlLAorICogYWRkIGEgbGluZSB0byB0aGUgbGlsby5jb25mIGZpbGUgbGlrZToKKyAqIGFwcGVuZD0iYWljNzl4eD12ZXJib3NlLHRhZ19pbmZvOnt7MzIsMzIsMzIsMzJ9LHszMiwzMiwzMiwzMn19IgorICogd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGZpcnN0IGZvdXIgZGV2aWNlcyBvbiB0aGUgZmlyc3QgdHdvCisgKiBjb250cm9sbGVycyBiZWluZyBzZXQgdG8gYSB0YWdnZWQgcXVldWUgZGVwdGggb2YgMzIuCisgKgorICogVGhlIHRhZ19jb21tYW5kcyBpcyBhbiBhcnJheSBvZiAxNiB0byBhbGxvdyBmb3Igd2lkZSBhbmQgdHdpbiBhZGFwdGVycy4KKyAqIFR3aW4gYWRhcHRlcnMgd2lsbCB1c2UgaW5kZXhlcyAwLTcgZm9yIGNoYW5uZWwgMCwgYW5kIGluZGV4ZXMgOC0xNQorICogZm9yIGNoYW5uZWwgMS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHRhZ19jb21tYW5kc1sxNl07CS8qIEFsbG93IGZvciB3aWRlL3R3aW4gYWRhcHRlcnMuICovCit9IGFkYXB0ZXJfdGFnX2luZm9fdDsKKworLyoKKyAqIE1vZGlmeSB0aGlzIGFzIHlvdSBzZWUgZml0IGZvciB5b3VyIHN5c3RlbS4KKyAqCisgKiAwCQkJdGFnZ2VkIHF1ZXVpbmcgZGlzYWJsZWQKKyAqIDEgPD0gbiA8PSAyNTMJbiA9PSBtYXggdGFncyBldmVyIGRpc3BhdGNoZWQuCisgKgorICogVGhlIGRyaXZlciB3aWxsIHRocm90dGxlIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgZGlzcGF0Y2hlZCB0byBhCisgKiBkZXZpY2UgaWYgaXQgcmV0dXJucyBxdWV1ZSBmdWxsLiAgRm9yIGRldmljZXMgd2l0aCBhIGZpeGVkIG1heGltdW0KKyAqIHF1ZXVlIGRlcHRoLCB0aGUgZHJpdmVyIHdpbGwgZXZlbnR1YWxseSBkZXRlcm1pbmUgdGhpcyBkZXB0aCBhbmQKKyAqIGxvY2sgaXQgaW4gKGEgY29uc29sZSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGxvY2sKKyAqIGhhcyBvY2N1cnJlZCkuICBPbiBzb21lIGRldmljZXMsIHF1ZXVlIGZ1bGwgaXMgcmV0dXJuZWQgZm9yIGEgdGVtcG9yYXJ5CisgKiByZXNvdXJjZSBzaG9ydGFnZS4gIFRoZXNlIGRldmljZXMgd2lsbCByZXR1cm4gcXVldWUgZnVsbCBhdCB2YXJ5aW5nCisgKiBkZXB0aHMuICBUaGUgZHJpdmVyIHdpbGwgdGhyb3R0bGUgYmFjayB3aGVuIHRoZSBxdWV1ZSBmdWxscyBvY2N1ciBhbmQKKyAqIGF0dGVtcHQgdG8gc2xvd2x5IGluY3JlYXNlIHRoZSBkZXB0aCBvdmVyIHRpbWUgYXMgdGhlIGRldmljZSByZWNvdmVycworICogZnJvbSB0aGUgcmVzb3VyY2Ugc2hvcnRhZ2UuCisgKgorICogSW4gdGhpcyBleGFtcGxlLCB0aGUgZmlyc3QgbGluZSB3aWxsIGRpc2FibGUgdGFnZ2VkIHF1ZXVlaW5nIGZvciBhbGwKKyAqIHRoZSBkZXZpY2VzIG9uIHRoZSBmaXJzdCBwcm9iZWQgYWljNzl4eCBhZGFwdGVyLgorICoKKyAqIFRoZSBzZWNvbmQgbGluZSBlbmFibGVzIHRhZ2dlZCBxdWV1ZWluZyB3aXRoIDQgY29tbWFuZHMvTFVOIGZvciBJRHMKKyAqICgwLCAyLTExLCAxMy0xNSksIGRpc2FibGVzIHRhZ2dlZCBxdWV1ZWluZyBmb3IgSUQgMTIsIGFuZCB0ZWxscyB0aGUKKyAqIGRyaXZlciB0byBhdHRlbXB0IHRvIHVzZSB1cCB0byA2NCB0YWdzIGZvciBJRCAxLgorICoKKyAqIFRoZSB0aGlyZCBsaW5lIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBsaW5lLgorICoKKyAqIFRoZSBmb3VydGggbGluZSBkaXNhYmxlcyB0YWdnZWQgcXVldWVpbmcgZm9yIGRldmljZXMgMCBhbmQgMy4gIEl0CisgKiBlbmFibGVzIHRhZ2dlZCBxdWV1ZWluZyBmb3IgdGhlIG90aGVyIElEcywgd2l0aCAxNiBjb21tYW5kcy9MVU4KKyAqIGZvciBJRHMgMSBhbmQgNCwgMTI3IGNvbW1hbmRzL0xVTiBmb3IgSUQgOCwgYW5kIDQgY29tbWFuZHMvTFVOIGZvcgorICogSURzIDIsIDUtNywgYW5kIDktMTUuCisgKi8KKworLyoKKyAqIE5PVEU6IFRoZSBiZWxvdyBzdHJ1Y3R1cmUgaXMgZm9yIHJlZmVyZW5jZSBvbmx5LCB0aGUgYWN0dWFsIHN0cnVjdHVyZQorICogICAgICAgdG8gbW9kaWZ5IGluIG9yZGVyIHRvIGNoYW5nZSB0aGluZ3MgaXMganVzdCBiZWxvdyB0aGlzIGNvbW1lbnQgYmxvY2suCithZGFwdGVyX3RhZ19pbmZvX3QgYWljNzl4eF90YWdfaW5mb1tdID0KK3sKKwl7ezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9fSwKKwl7ezQsIDY0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCA0LCA0LCA0fX0sCisJe3swLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX0sCisJe3swLCAxNiwgNCwgMCwgMTYsIDQsIDQsIDQsIDEyNywgNCwgNCwgNCwgNCwgNCwgNCwgNH19Cit9OworKi8KKworI2lmZGVmIENPTkZJR19BSUM3OVhYX0NNRFNfUEVSX0RFVklDRQorI2RlZmluZSBBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSBDT05GSUdfQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UKKyNlbHNlCisjZGVmaW5lIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFIEFIRF9NQVhfUVVFVUUKKyNlbmRpZgorCisjZGVmaW5lIEFJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTIHsJCQkJCVwKKwlBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzc5WFhfQ01EU19QRVJfREVWSUNFLCBBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzc5WFhfQ01EU19QRVJfREVWSUNFLCBBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3OVhYX0NNRFNfUEVSX0RFVklDRSwgQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzc5WFhfQ01EU19QRVJfREVWSUNFCQlcCit9CisKKy8qCisgKiBCeSBkZWZhdWx0LCB1c2UgdGhlIG51bWJlciBvZiBjb21tYW5kcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSB1c2VycyBrZXJuZWwgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGFkYXB0ZXJfdGFnX2luZm9fdCBhaWM3OXh4X3RhZ19pbmZvW10gPQoreworCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzc5WFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDNzlYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3OVhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30KK307CisKKy8qCisgKiBCeSBkZWZhdWx0LCByZWFkIHN0cmVhbWluZyBpcyBkaXNhYmxlZC4gIEluIHRoZW9yeSwKKyAqIHJlYWQgc3RyZWFtaW5nIHNob3VsZCBlbmhhbmNlIHBlcmZvcm1hbmNlLCBidXQgZWFybHkKKyAqIFUzMjAgZHJpdmUgZmlybXdhcmUgYWN0dWFsbHkgcGVyZm9ybXMgc2xvd2VyIHdpdGgKKyAqIHJlYWQgc3RyZWFtaW5nIGVuYWJsZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfQUlDNzlYWF9FTkFCTEVfUkRfU1RSTQorI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0gMHhGRkZGCisjZWxzZQorI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0gMAorI2VuZGlmCisKK3N0YXRpYyB1aW50MTZfdCBhaWM3OXh4X3JkX3N0cm1faW5mb1tdID0KK3sKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0sCisJQUlDNzlYWF9DT05GSUdFRF9SRF9TVFJNLAorCUFJQzc5WFhfQ09ORklHRURfUkRfU1RSTSwKKwlBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk0KK307CisKKy8qCisgKiBEViBvcHRpb246CisgKgorICogcG9zaXRpdmUgdmFsdWUgPSBEViBFbmFibGVkCisgKiB6ZXJvCQkgID0gRFYgRGlzYWJsZWQKKyAqIG5lZ2F0aXZlIHZhbHVlID0gRFYgRGVmYXVsdCBmb3IgYWRhcHRlciB0eXBlL3NlZXByb20KKyAqLworI2lmZGVmIENPTkZJR19BSUM3OVhYX0RWX1NFVFRJTkcKKyNkZWZpbmUgQUlDNzlYWF9DT05GSUdFRF9EViBDT05GSUdfQUlDNzlYWF9EVl9TRVRUSU5HCisjZWxzZQorI2RlZmluZSBBSUM3OVhYX0NPTkZJR0VEX0RWIC0xCisjZW5kaWYKKworc3RhdGljIGludDhfdCBhaWM3OXh4X2R2X3NldHRpbmdzW10gPQoreworCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYsCisJQUlDNzlYWF9DT05GSUdFRF9EViwKKwlBSUM3OVhYX0NPTkZJR0VEX0RWLAorCUFJQzc5WFhfQ09ORklHRURfRFYKK307CisKKy8qCisgKiBUaGUgSS9PIGNlbGwgb24gdGhlIGNoaXAgaXMgdmVyeSBjb25maWd1cmFibGUgaW4gcmVzcGVjdCB0byBpdHMgYW5hbG9nCisgKiBjaGFyYWN0ZXJpc3RpY3MuICBTZXQgdGhlIGRlZmF1bHRzIGhlcmU7IHRoZXkgY2FuIGJlIG92ZXJyaWRlbiB3aXRoCisgKiB0aGUgcHJvcGVyIGluc21vZCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzCit7CisJdWludDhfdAlwcmVjb21wOworCXVpbnQ4X3QJc2xld3JhdGU7CisJdWludDhfdCBhbXBsaXR1ZGU7Cit9OworI2RlZmluZSBBSUM3OVhYX0RFRkFVTFRfUFJFQ09NUAkJMHhGRgorI2RlZmluZSBBSUM3OVhYX0RFRkFVTFRfU0xFV1JBVEUJMHhGRgorI2RlZmluZSBBSUM3OVhYX0RFRkFVTFRfQU1QTElUVURFCTB4RkYKKyNkZWZpbmUgQUlDNzlYWF9ERUZBVUxUX0lPT1BUUwkJCVwKK3sJCQkJCQlcCisJQUlDNzlYWF9ERUZBVUxUX1BSRUNPTVAsCQlcCisJQUlDNzlYWF9ERUZBVUxUX1NMRVdSQVRFLAkJXAorCUFJQzc5WFhfREVGQVVMVF9BTVBMSVRVREUJCVwKK30KKyNkZWZpbmUgQUlDNzlYWF9QUkVDT01QX0lOREVYCTAKKyNkZWZpbmUgQUlDNzlYWF9TTEVXUkFURV9JTkRFWAkxCisjZGVmaW5lIEFJQzc5WFhfQU1QTElUVURFX0lOREVYCTIKK3N0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzIGFpYzc5eHhfaW9jZWxsX2luZm9bXSA9Cit7CisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUywKKwlBSUM3OVhYX0RFRkFVTFRfSU9PUFRTLAorCUFJQzc5WFhfREVGQVVMVF9JT09QVFMsCisJQUlDNzlYWF9ERUZBVUxUX0lPT1BUUworfTsKKworLyoKKyAqIFRoZXJlIHNob3VsZCBiZSBhIHNwZWNpZmljIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBpbiBzY3NpLmgsIGJ1dAorICogaXQgc2VlbXMgdGhhdCBtb3N0IGRyaXZlcnMgaWdub3JlIGl0LgorICovCisjZGVmaW5lIERJRF9VTkRFUkZMT1cgICBESURfRVJST1IKKwordm9pZAorYWhkX3ByaW50X3BhdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcHJpbnRrKCIoc2NzaSVkOiVjOiVkOiVkKTogIiwKKwkgICAgICAgYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X25vLAorCSAgICAgICBzY2IgIT0gTlVMTCA/IFNDQl9HRVRfQ0hBTk5FTChhaGQsIHNjYikgOiAnWCcsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9UQVJHRVQoYWhkLCBzY2IpIDogLTEsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9MVU4oc2NiKSA6IC0xKTsKK30KKworLyoKKyAqIFhYWCAtIHRoZXNlIG9wdGlvbnMgYXBwbHkgdW5pbGF0ZXJhbGx5IHRvIF9hbGxfIGFkYXB0ZXJzCisgKiAgICAgICBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQuICBFeGNlcHRpb25zIHRvIHRoaXMKKyAqICAgICAgIHJ1bGUgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cy4KKyAqLworCisvKgorICogU2tpcCB0aGUgc2NzaSBidXMgcmVzZXQuICBOb24gMCBtYWtlIHVzIHNraXAgdGhlIHJlc2V0IGF0IHN0YXJ0dXAuICBUaGlzCisgKiBoYXMgbm8gZWZmZWN0IG9uIGFueSBsYXRlciByZXNldHMgdGhhdCBtaWdodCBvY2N1ciBkdWUgdG8gdGhpbmdzIGxpa2UKKyAqIFNDU0kgYnVzIHRpbWVvdXRzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9ub19yZXNldDsKKworLyoKKyAqIENlcnRhaW4gUENJIG1vdGhlcmJvYXJkcyB3aWxsIHNjYW4gUENJIGRldmljZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwKKyAqIG90aGVycyBzY2FuIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QsIGFuZCB0aGV5IHRlbmQgdG8gZG8gYWxsIGtpbmRzIG9mCisgKiBzdHJhbmdlIHRoaW5ncyB3aGVuIHRoZXkgY29tZSBpbnRvIGNvbnRhY3Qgd2l0aCBQQ0kgYnJpZGdlIGNoaXBzLiAgVGhlCisgKiBuZXQgcmVzdWx0IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIFBDSSBjYXJkIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCB0byBib290CisgKiB0aGUgbWFjaGluZSBpcyB2ZXJ5IGhhcmQgdG8gZGV0ZWN0LiAgTW9zdCBtb3RoZXJib2FyZHMgZ28gZnJvbSBsb3dlc3QKKyAqIFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0LCBhbmQgdGhlIGZpcnN0IFNDU0kgY29udHJvbGxlciBmb3VuZCBpcyB0aGUKKyAqIG9uZSB5b3UgYm9vdCBmcm9tLiAgVGhlIG9ubHkgZXhjZXB0aW9ucyB0byB0aGlzIGFyZSB3aGVuIGEgY29udHJvbGxlcgorICogaGFzIGl0cyBCSU9TIGRpc2FibGVkLiAgU28sIHdlIGJ5IGRlZmF1bHQgc29ydCBhbGwgb2Ygb3VyIFNDU0kgY29udHJvbGxlcnMKKyAqIGZyb20gbG93ZXN0IFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0IFBDSSBzbG90IG51bWJlci4gIFdlIGFsc28gZm9yY2UKKyAqIGFsbCBjb250cm9sbGVycyB3aXRoIHRoZWlyIEJJT1MgZGlzYWJsZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFRoaXMKKyAqIHdvcmtzIG9uICphbG1vc3QqIGFsbCBjb21wdXRlcnMuICBXaGVyZSBpdCBkb2Vzbid0IHdvcmssIHdlIGhhdmUgdGhpcworICogb3B0aW9uLiAgU2V0dGluZyB0aGlzIG9wdGlvbiB0byBub24tMCB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0CisgKiB0byBoaWdoZXN0IGZpcnN0LCB0aGVuIGxvd2VzdCwgYnV0IHdpbGwgc3RpbGwgbGVhdmUgY2FyZHMgd2l0aCB0aGVpciBCSU9TCisgKiBkaXNhYmxlZCBhdCB0aGUgdmVyeSBlbmQuICBUaGF0IHNob3VsZCBmaXggZXZlcnlvbmUgdXAgdW5sZXNzIHRoZXJlIGFyZQorICogcmVhbGx5IHN0cmFuZ2UgY2lydW1zdGFuY2VzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9yZXZlcnNlX3NjYW47CisKKy8qCisgKiBTaG91bGQgd2UgZm9yY2UgRVhURU5ERUQgdHJhbnNsYXRpb24gb24gYSBjb250cm9sbGVyLgorICogICAgIDAgPT0gVXNlIHdoYXRldmVyIGlzIGluIHRoZSBTRUVQUk9NIG9yIGRlZmF1bHQgdG8gb2ZmCisgKiAgICAgMSA9PSBVc2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIFNFRVBST00gb3IgZGVmYXVsdCB0byBvbgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9leHRlbmRlZDsKKworLyoKKyAqIFBDSSBidXMgcGFyaXR5IGNoZWNraW5nIG9mIHRoZSBBZGFwdGVjIGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBzb21ld2hhdAorICogZHViaW91cyBhdCBiZXN0LiAgVG8gbXkga25vd2xlZGdlLCB0aGlzIG9wdGlvbiBoYXMgbmV2ZXIgYWN0dWFsbHkKKyAqIHNvbHZlZCBhIFBDSSBwYXJpdHkgcHJvYmxlbSwgYnV0IG9uIGNlcnRhaW4gbWFjaGluZXMgd2l0aCBicm9rZW4gUENJCisgKiBjaGlwc2V0IGNvbmZpZ3VyYXRpb25zLCBpdCBjYW4gZ2VuZXJhdGUgdG9ucyBvZiBmYWxzZSBlcnJvciBtZXNzYWdlcy4KKyAqIEl0J3MgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciBmb3IgY29tcGxldGVuZXNzLgorICogICAwCSAgID0gU2h1dCBvZmYgUENJIHBhcml0eSBjaGVjaworICogICBub24tMCA9IEVuYWJsZSBQQ0kgcGFyaXR5IGNoZWNrCisgKgorICogTk9URTogeW91IGNhbid0IGFjdHVhbGx5IHBhc3MgLTEgb24gdGhlIGxpbG8gcHJvbXB0LiAgU28sIHRvIHNldCB0aGlzCisgKiB2YXJpYWJsZSB0byAtMSB5b3Ugd291bGQgYWN0dWFsbHkgd2FudCB0byBzaW1wbHkgcGFzcyB0aGUgdmFyaWFibGUKKyAqIG5hbWUgd2l0aG91dCBhIG51bWJlci4gIFRoYXQgd2lsbCBpbnZlcnQgdGhlIDAgd2hpY2ggd2lsbCByZXN1bHQgaW4KKyAqIC0xLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9wY2lfcGFyaXR5ID0gfjA7CisKKy8qCisgKiBUaGVyZSBhcmUgbG90cyBvZiBicm9rZW4gY2hpcHNldHMgaW4gdGhlIHdvcmxkLiAgU29tZSBvZiB0aGVtIHdpbGwKKyAqIHZpb2xhdGUgdGhlIFBDSSBzcGVjIHdoZW4gd2UgaXNzdWUgYnl0ZSBzaXplZCBtZW1vcnkgd3JpdGVzIHRvIG91cgorICogY29udHJvbGxlci4gIEkvTyBtYXBwZWQgcmVnaXN0ZXIgYWNjZXNzLCBpZiBhbGxvd2VkIGJ5IHRoZSBnaXZlbgorICogcGxhdGZvcm0sIHdpbGwgd29yayBpbiBhbG1vc3QgYWxsIGNhc2VzLgorICovCit1aW50MzJfdCBhaWM3OXh4X2FsbG93X21lbWlvID0gfjA7CisKKy8qCisgKiBhaWM3OXh4X2RldGVjdCgpIGhhcyBiZWVuIHJ1biwgc28gcmVnaXN0ZXIgYWxsIGRldmljZSBhcnJpdmFscworICogaW1tZWRpYXRlbHkgd2l0aCB0aGUgc3lzdGVtIHJhdGhlciB0aGFuIGRlZmVycmluZyB0byB0aGUgc29ydGVkCisgKiBhdHRhY2htZW50IHBlcmZvcm1lZCBieSBhaWM3OXh4X2RldGVjdCgpLgorICovCitpbnQgYWljNzl4eF9kZXRlY3RfY29tcGxldGU7CisKKy8qCisgKiBTbyB0aGF0IHdlIGNhbiBzZXQgaG93IGxvbmcgZWFjaCBkZXZpY2UgaXMgZ2l2ZW4gYXMgYSBzZWxlY3Rpb24gdGltZW91dC4KKyAqIFRoZSB0YWJsZSBvZiB2YWx1ZXMgZ29lcyBsaWtlIHRoaXM6CisgKiAgIDAgLSAyNTZtcworICogICAxIC0gMTI4bXMKKyAqICAgMiAtIDY0bXMKKyAqICAgMyAtIDMybXMKKyAqIFdlIGRlZmF1bHQgdG8gMjU2bXMgYmVjYXVzZSBzb21lIG9sZGVyIGRldmljZXMgbmVlZCBhIGxvbmdlciB0aW1lCisgKiB0byByZXNwb25kIHRvIGluaXRpYWwgc2VsZWN0aW9uLgorICovCitzdGF0aWMgdWludDMyX3QgYWljNzl4eF9zZWx0aW1lOworCisvKgorICogQ2VydGFpbiBkZXZpY2VzIGRvIG5vdCBwZXJmb3JtIGFueSBhZ2luZyBvbiBjb21tYW5kcy4gIFNob3VsZCB0aGUKKyAqIGRldmljZSBiZSBzYXR1cmF0ZWQgYnkgY29tbWFuZHMgaW4gb25lIHBvcnRpb24gb2YgdGhlIGRpc2ssIGl0IGlzCisgKiBwb3NzaWJsZSBmb3IgdHJhbnNhY3Rpb25zIG9uIGZhciBhd2F5IHNlY3RvcnMgdG8gbmV2ZXIgYmUgc2VydmljZWQuCisgKiBUbyBoYW5kbGUgdGhlc2UgZGV2aWNlcywgd2UgY2FuIHBlcmlvZGljYWxseSBzZW5kIGFuIG9yZGVyZWQgdGFnIHRvCisgKiBmb3JjZSBhbGwgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIHRvIGJlIHNlcnZpY2VkIHByaW9yIHRvIGEgbmV3CisgKiB0cmFuc2FjdGlvbi4KKyAqLwordWludDMyX3QgYWljNzl4eF9wZXJpb2RpY19vdGFnOworCisvKgorICogTW9kdWxlIGluZm9ybWF0aW9uIGFuZCBzZXR0YWJsZSBvcHRpb25zLgorICovCitzdGF0aWMgY2hhciAqYWljNzl4eCA9IE5VTEw7CisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IEp1c3RpbiBULiBHaWJicyA8Z2liYnNAc2NzaWd1eS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFkYXB0ZWMgQWljNzkwWCBVMzIwIFNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9WRVJTSU9OKEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOworbW9kdWxlX3BhcmFtKGFpYzc5eHgsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWljNzl4eCwKKyJwZXJpb2QgZGVsaW1pdGVkLCBvcHRpb25zIHN0cmluZy5cbiIKKyIJdmVyYm9zZQkJCUVuYWJsZSB2ZXJib3NlL2RpYWdub3N0aWMgbG9nZ2luZ1xuIgorIglhbGxvd19tZW1pbwkJQWxsb3cgZGV2aWNlIHJlZ2lzdGVycyB0byBiZSBtZW1vcnkgbWFwcGVkXG4iCisiCWRlYnVnCQkJQml0bWFzayBvZiBkZWJ1ZyB2YWx1ZXMgdG8gZW5hYmxlXG4iCisiCW5vX3Jlc2V0CQlTdXByZXNzIGluaXRpYWwgYnVzIHJlc2V0c1xuIgorIglleHRlbmRlZAkJRW5hYmxlIGV4dGVuZGVkIGdlb21ldHJ5IG9uIGFsbCBjb250cm9sbGVyc1xuIgorIglwZXJpb2RpY19vdGFnCQlTZW5kIGFuIG9yZGVyZWQgdGFnZ2VkIHRyYW5zYWN0aW9uXG4iCisiCQkJCXBlcmlvZGljYWxseSB0byBwcmV2ZW50IHRhZyBzdGFydmF0aW9uLlxuIgorIgkJCQlUaGlzIG1heSBiZSByZXF1aXJlZCBieSBzb21lIG9sZGVyIGRpc2tcbiIKKyIJCQkJb3IgZHJpdmVzL1JBSUQgYXJyYXlzLlxuIgorIglyZXZlcnNlX3NjYW4JCVNvcnQgUENJIGRldmljZXMgaGlnaGVzdCBCdXMvU2xvdCB0byBsb3dlc3RcbiIKKyIJdGFnX2luZm86PHRhZ19zdHI+CVNldCBwZXItdGFyZ2V0IHRhZyBkZXB0aFxuIgorIglnbG9iYWxfdGFnX2RlcHRoOjxpbnQ+CUdsb2JhbCB0YWcgZGVwdGggZm9yIGFsbCB0YXJnZXRzIG9uIGFsbCBidXNlc1xuIgorIglyZF9zdHJtOjxyZF9zdHJtX21hc2tzPiBTZXQgcGVyLXRhcmdldCByZWFkIHN0cmVhbWluZyBzZXR0aW5nLlxuIgorIglkdjo8ZHZfc2V0dGluZ3M+CVNldCBwZXItY29udHJvbGxlciBEb21haW4gVmFsaWRhdGlvbiBTZXR0aW5nLlxuIgorIglzbGV3cmF0ZTo8c2xld3JhdGVfbGlzdD5TZXQgdGhlIHNpZ25hbCBzbGV3IHJhdGUgKDAtMTUpLlxuIgorIglwcmVjb21wOjxwY29tcF9saXN0PglTZXQgdGhlIHNpZ25hbCBwcmVjb21wZW5zYXRpb24gKDAtNykuXG4iCisiCWFtcGxpdHVkZTo8aW50PgkJU2V0IHRoZSBzaWduYWwgYW1wbGl0dWRlICgwLTcpLlxuIgorIglzZWx0aW1lOjxpbnQ+CQlTZWxlY3Rpb24gVGltZW91dDpcbiIKKyIJCQkJKDAvMjU2bXMsMS8xMjhtcywyLzY0bXMsMy8zMm1zKVxuIgorIlxuIgorIglTYW1wbGUgL2V0Yy9tb2Rwcm9iZS5jb25mIGxpbmU6XG4iCisiCQlFbmFibGUgdmVyYm9zZSBsb2dnaW5nXG4iCisiCQlTZXQgdGFnIGRlcHRoIG9uIENvbnRyb2xsZXIgMi9UYXJnZXQgMiB0byAxMCB0YWdzXG4iCisiCQlTaG9ydGVuIHRoZSBzZWxlY3Rpb24gdGltZW91dCB0byAxMjhtc1xuIgorIlxuIgorIglvcHRpb25zIGFpYzc5eHggJ2FpYzc5eHg9dmVyYm9zZS50YWdfaW5mbzp7e30ue30uey4uMTB9fS5zZWx0aW1lOjEnXG4iCisiXG4iCisiCVNhbXBsZSAvZXRjL21vZHByb2JlLmNvbmYgbGluZTpcbiIKKyIJCUNoYW5nZSBSZWFkIFN0cmVhbWluZyBmb3IgQ29udHJvbGxlcidzIDIgYW5kIDNcbiIKKyJcbiIKKyIJb3B0aW9ucyBhaWM3OXh4ICdhaWM3OXh4PXJkX3N0cm06ey4uMHhGRkYwLjB4QzBGMH0nIik7CisKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKiwKKwkJCQkJIHN0cnVjdCBzY2IgKik7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJIFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9maWx0ZXJfaW5xdWlyeShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2Rldl90aW1lZF91bmZyZWV6ZSh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfc2l6ZV9uc2VnKHZvaWQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYyBpbnQgIGFoZF9saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfa2lsbF9kdl90aHJlYWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9kdl90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0YXJnZXQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkJICAgICB1X2ludCByZXF1ZXN0X2xlbmd0aCk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfdHVyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICAgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfcmViKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9kdl9zdShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJCSAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgaW50IGFoZF9saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIF9faW5saW5lIGludCBhaGRfbGludXhfZHZfZmFsbGJhY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfZHZfY29tcGxldGUoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2dlbmVyYXRlX2R2X3BhdHRlcm4oc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHVfaW50IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdV9pbnQgYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X3NldHVwX3VzZXJfcmRfc3RybV9zZXR0aW5ncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQgYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCoJYWhkX2xpbnV4X2FsbG9jX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkJCSAgICAgICB1X2ludCwgdV9pbnQpOworc3RhdGljIHZvaWQJCQlhaGRfbGludXhfZnJlZV90YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyosCisJCQkJCQkgICAgICBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCopOworc3RhdGljIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKglhaGRfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMqLAorCQkJCQkJICAgICAgIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0KiwKKwkJCQkJCSAgICAgICB1X2ludCk7CitzdGF0aWMgdm9pZAkJCWFoZF9saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkJCSAgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKik7CitzdGF0aWMgdm9pZCBhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjKiwKKwkJCQkgICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9zZXR1cF90YWdfaW5mb19nbG9iYWwoY2hhciAqcCk7CitzdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoZF9saW51eF9zZXR1cF90YWdfaW5mbzsKK3N0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX3JkX3N0cm1faW5mbzsKK3N0YXRpYyBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgYWhkX2xpbnV4X3NldHVwX2R2Oworc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm87CitzdGF0aWMgaW50IGFoZF9saW51eF9uZXh0X3VuaXQodm9pZCk7CitzdGF0aWMgdm9pZCBhaGRfcnVucV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGFpYzc5eHhfc2V0dXAoY2hhciAqYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldHVwX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3RlYXJkb3duX3J1bnFfdGFza2xldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgorCQkgICAgIGFoZF9saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgY2hhbm5lbCwKKwkJCQkJICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgaW50IGFsbG9jKTsKK3N0YXRpYyBzdHJ1Y3QgYWhkX2NtZCAqYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICoKKwkJICAgICBhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyosIHN0cnVjdCBzY2IqKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zY2hlZHVsZV9jb21wbGV0ZXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9SVU5fQ01QTFRfUV9USU1FUikgPT0gMCkgeworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9SVU5fQ01QTFRfUV9USU1FUjsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXM7CisJCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOworCX0KK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9zY2hlZHVsZV9ydW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl0YXNrbGV0X3NjaGVkdWxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCk7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0dXBfcnVucV90YXNrbGV0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl0YXNrbGV0X2luaXQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0LCBhaGRfcnVucV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKWFoZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdGVhcmRvd25fcnVucV90YXNrbGV0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl0YXNrbGV0X2tpbGwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0KTsKK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlKgorYWhkX2xpbnV4X2dldF9kZXZpY2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjaGFubmVsLCB1X2ludCB0YXJnZXQsCisJCSAgICAgdV9pbnQgbHVuLCBpbnQgYWxsb2MpCit7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCisJdGFyZ2V0X29mZnNldCA9IHRhcmdldDsKKwlpZiAoY2hhbm5lbCAhPSAwKQorCQl0YXJnZXRfb2Zmc2V0ICs9IDg7CisJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XTsKKwlpZiAodGFyZyA9PSBOVUxMKSB7CisJCWlmIChhbGxvYyAhPSAwKSB7CisJCQl0YXJnID0gYWhkX2xpbnV4X2FsbG9jX3RhcmdldChhaGQsIGNoYW5uZWwsIHRhcmdldCk7CisJCQlpZiAodGFyZyA9PSBOVUxMKQorCQkJCXJldHVybiAoTlVMTCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIChOVUxMKTsKKwl9CisJZGV2ID0gdGFyZy0+ZGV2aWNlc1tsdW5dOworCWlmIChkZXYgPT0gTlVMTCAmJiBhbGxvYyAhPSAwKQorCQlkZXYgPSBhaGRfbGludXhfYWxsb2NfZGV2aWNlKGFoZCwgdGFyZywgbHVuKTsKKwlyZXR1cm4gKGRldik7Cit9CisKKyNkZWZpbmUgQUhEX0xJTlVYX01BWF9SRVRVUk5FRF9FUlJPUlMgNAorc3RhdGljIHN0cnVjdCBhaGRfY21kICoKK2FoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQorewkKKwlzdHJ1Y3QJYWhkX2NtZCAqYWNtZDsKKwl1X2xvbmcJZG9uZV9mbGFnczsKKwlpbnQJd2l0aF9lcnJvcnM7CisKKwl3aXRoX2Vycm9ycyA9IDA7CisJYWhkX2RvbmVfbG9jayhhaGQsICZkb25lX2ZsYWdzKTsKKwl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXEpKSAhPSBOVUxMKSB7CisJCVNjc2lfQ21uZCAqY21kOworCisJCWlmICh3aXRoX2Vycm9ycyA+IEFIRF9MSU5VWF9NQVhfUkVUVVJORURfRVJST1JTKSB7CisJCQkvKgorCQkJICogTGludXggdXNlcyBzdGFjayByZWN1cnNpb24gdG8gcmVxdWV1ZQorCQkJICogY29tbWFuZHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZWQuICBBdm9pZAorCQkJICogYmxvd2luZyBvdXQgdGhlIHN0YWNrIGJ5ICJzcG9vbiBmZWVkaW5nIgorCQkJICogY29tbWFuZHMgdGhhdCBjb21wbGV0ZWQgd2l0aCBlcnJvciBiYWNrCisJCQkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpbiBjYXNlIHRoZXkgYXJlIGdvaW5nCisJCQkgKiB0byBiZSByZXRyaWVkLiAiaWNrIgorCQkJICovCisJCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7CisJCQlicmVhazsKKwkJfQorCQlUQUlMUV9SRU1PVkUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxLAorCQkJICAgICBhY21kLCBhY21kX2xpbmtzLnRxZSk7CisJCWNtZCA9ICZhY21kX3Njc2lfY21kKGFjbWQpOworCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkgIT0gRElEX09LCisJCSB8fCAoY21kLT5yZXN1bHQgJiAweEZGKSAhPSBTQ1NJX1NUQVRVU19PSykKKwkJCXdpdGhfZXJyb3JzKys7CisKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwl9CisJYWhkX2RvbmVfdW5sb2NrKGFoZCwgJmRvbmVfZmxhZ3MpOworCXJldHVybiAoYWNtZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCSAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKK3sKKwlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX0ZSRUVaRV9USUxfRU1QVFkpICE9IDAKKwkgJiYgZGV2LT5hY3RpdmUgPT0gMCkgeworCQlkZXYtPmZsYWdzICY9IH5BSERfREVWX0ZSRUVaRV9USUxfRU1QVFk7CisJCWRldi0+cWZyb3plbi0tOworCX0KKworCWlmIChUQUlMUV9GSVJTVCgmZGV2LT5idXN5cSkgPT0gTlVMTAorCSB8fCBkZXYtPm9wZW5pbmdzID09IDAgfHwgZGV2LT5xZnJvemVuICE9IDApCisJCXJldHVybjsKKworCWFoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKGFoZCwgZGV2KTsKK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICoKK2FoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCQorCWlmICgoYWhkLT5mbGFncyAmIEFIRF9SRVNPVVJDRV9TSE9SVEFHRSkgIT0gMAorCSB8fCAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDAKKwkgICYmIEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpID09IDApKQorCQlyZXR1cm4gKE5VTEwpOworCXJldHVybiAoVEFJTFFfRklSU1QoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCXdoaWxlICgoZGV2ID0gYWhkX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGQpKSAhPSBOVUxMKSB7CisJCVRBSUxRX1JFTU9WRSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7CisJCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfT05fUlVOX0xJU1Q7CisJCWFoZF9saW51eF9jaGVja19kZXZpY2VfcXVldWUoYWhkLCBkZXYpOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJU2NzaV9DbW5kICpjbWQ7CisJaW50IGRpcmVjdGlvbjsKKworCWNtZCA9IHNjYi0+aW9fY3R4OworCWRpcmVjdGlvbiA9IHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJYWhkX3N5bmNfc2dsaXN0KGFoZCwgc2NiLCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJcGNpX3VubWFwX3NnKGFoZC0+ZGV2X3NvZnRjLCBzZywgY21kLT51c2Vfc2csIGRpcmVjdGlvbik7CisJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7CisJCXBjaV91bm1hcF9zaW5nbGUoYWhkLT5kZXZfc29mdGMsCisJCQkJIHNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIsCisJCQkJIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBkaXJlY3Rpb24pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQlVJTERfU0NTSUlEKGFoZCwgY21kKQkJCQkJCVwKKwkoKCgoY21kKS0+ZGV2aWNlLT5pZCA8PCBUSURfU0hJRlQpICYgVElEKSB8IChhaGQpLT5vdXJfaWQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogIEhvc3QgdGVtcGxhdGUgZW50cnkgcG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGNvbnN0IGNoYXIgKmFoZF9saW51eF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9xdWV1ZShTY3NpX0NtbmQgKiwgdm9pZCAoKikoU2NzaV9DbW5kICopKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqKTsKK3N0YXRpYyBpbnQJICAgYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqKTsKK3N0YXRpYyB2b2lkCSAgIGFoZF9saW51eF9zbGF2ZV9kZXN0cm95KFNjc2lfRGV2aWNlICopOworI2lmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlKiwKKwkJCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSosIHNlY3Rvcl90LCBpbnRbXSk7CisjZW5kaWYKKyNlbHNlCitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgdm9pZAkgICBhaGRfbGludXhfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisJCQkJCQlTY3NpX0RldmljZSAqc2NzaV9kZXZzKTsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIGludAkgICBhaGRfbGludXhfYmlvc3BhcmFtKERpc2sgKiwga2Rldl90LCBpbnRbXSk7CisjZW5kaWYKKyNlbmRpZgorc3RhdGljIGludAkgICBhaGRfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQJICAgYWhkX2xpbnV4X2Rldl9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50CSAgIGFoZF9saW51eF9hYm9ydChTY3NpX0NtbmQgKik7CisKKy8qCisgKiBDYWxjdWxhdGUgYSBzYWZlIHZhbHVlIGZvciBBSERfTlNFRyAoYXMgZXhwcmVzc2VkIHRocm91Z2ggYWhkX2xpbnV4X25zZWcpLgorICoKKyAqIEluIHByZS0yLjUuWC4uLgorICogVGhlIG1pZGxheWVyIGFsbG9jYXRlcyBhbiBTL0cgYXJyYXkgZHluYW1pY2FsbHkgd2hlbiBhIGNvbW1hbmQgaXMgaXNzdWVkCisgKiB1c2luZyBTQ1NJIG1hbGxvYy4gIFRoaXMgYXJyYXksIHdoaWNoIGlzIGluIGFuIE9TIGRlcGVuZGVudCBmb3JtYXQgdGhhdAorICogbXVzdCBsYXRlciBiZSBjb3BpZWQgdG8gb3VyIHByaXZhdGUgUy9HIGxpc3QsIGlzIHNpemVkIHRvIGhvdXNlIGp1c3QgdGhlCisgKiBudW1iZXIgb2Ygc2VnbWVudHMgbmVlZGVkIGZvciB0aGUgY3VycmVudCB0cmFuc2Zlci4gIFNpbmNlIHRoZSBjb2RlIHRoYXQKKyAqIHNpemVzIHRoZSBTQ1NJIG1hbGxvYyBwb29sIGRvZXMgbm90IHRha2UgaW50byBjb25zaWRlcmF0aW9uIGZyYWdtZW50YXRpb24KKyAqIG9mIHRoZSBwb29sLCBleGVjdXRpbmcgdHJhbnNhY3Rpb25zIG51bWJlcmluZyBqdXN0IGEgZnJhY3Rpb24gb2Ygb3VyCisgKiBjb25jdXJyZW50IHRyYW5zYWN0aW9uIGxpbWl0IHdpdGggU0cgbGlzdCBsZW5ndGhzIGFwcm9hY2hpbmcgQUhDX05TRUcgd2lsbAorICogcXVpY2tseSBkZXBsZWF0IHRoZSBTQ1NJIG1hbGxvYyBwb29sIG9mIHVzYWJsZSBzcGFjZS4gIFVuZm9ydHVuYXRlbHksIHRoZQorICogbWlkLWxheWVyIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSB0aGlzIHNjc2kgbWFsbG9jIGZhaWx1cmVzIGZvciB0aGUgUy9HCisgKiBhcnJheSBhbmQgdGhlIHJlc3VsdCBjYW4gYmUgYSBsb2NrdXAgb2YgdGhlIEkvTyBzdWJzeXN0ZW0uICBXZSB0cnkgdG8gc2l6ZQorICogb3VyIFMvRyBsaXN0IHNvIHRoYXQgaXQgc2F0aXNmaWVzIG91ciBkcml2ZXJzIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzIGluCisgKiBhZGRpdGlvbiB0byBhdm9pZGluZyBmcmFnbWVudGF0aW9uIG9mIHRoZSBTQ1NJIG1hbGxvYyBwb29sLgorICovCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NpemVfbnNlZyh2b2lkKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXVfaW50IGN1cl9zaXplOworCXVfaW50IGJlc3Rfc2l6ZTsKKworCS8qCisJICogVGhlIFNDU0kgYWxsb2NhdG9yIHJvdW5kcyB0byB0aGUgbmVhcmVzdCA1MTIgYnl0ZXMKKwkgKiBhbiBjYW5ub3QgYWxsb2NhdGUgYWNyb3NzIGEgcGFnZSBib3VuZGFyeS4gIE91ciBhbGdvcml0aG0KKwkgKiBpcyB0byBzdGFydCBhdCAxSyBvZiBzY3NpIG1hbGxvYyBzcGFjZSBwZXItY29tbWFuZCBhbmQKKwkgKiBsb29wIHRocm91Z2ggYWxsIGZhY3RvcnMgb2YgdGhlIFBBR0VfU0laRSBhbmQgcGljayB0aGUgYmVzdC4KKwkgKi8KKwliZXN0X3NpemUgPSAwOworCWZvciAoY3VyX3NpemUgPSAxMDI0OyBjdXJfc2l6ZSA8PSBQQUdFX1NJWkU7IGN1cl9zaXplICo9IDIpIHsKKwkJdV9pbnQgbnNlZzsKKworCQluc2VnID0gY3VyX3NpemUgLyBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKwkJaWYgKG5zZWcgPCBBSERfTElOVVhfTUlOX05TRUcpCisJCQljb250aW51ZTsKKworCQlpZiAoYmVzdF9zaXplID09IDApIHsKKwkJCWJlc3Rfc2l6ZSA9IGN1cl9zaXplOworCQkJYWhkX2xpbnV4X25zZWcgPSBuc2VnOworCQl9IGVsc2UgeworCQkJdV9pbnQgYmVzdF9yZW07CisJCQl1X2ludCBjdXJfcmVtOworCisJCQkvKgorCQkJICogQ29tcGFyZSB0aGUgdHJhaXRzIG9mIHRoZSBjdXJyZW50ICJiZXN0X3NpemUiCisJCQkgKiB3aXRoIHRoZSBjdXJyZW50IHNpemUgdG8gZGV0ZXJtaW5lIGlmIHRoZQorCQkJICogY3VycmVudCBzaXplIGlzIGEgYmV0dGVyIHNpemUuCisJCQkgKi8KKwkJCWJlc3RfcmVtID0gYmVzdF9zaXplICUgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJCQljdXJfcmVtID0gY3VyX3NpemUgJSBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKwkJCWlmIChjdXJfcmVtIDwgYmVzdF9yZW0pIHsKKwkJCQliZXN0X3NpemUgPSBjdXJfc2l6ZTsKKwkJCQlhaGRfbGludXhfbnNlZyA9IG5zZWc7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFRyeSB0byBkZXRlY3QgYW4gQWRhcHRlYyA3OVhYIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9saW51eF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJaW50ICAgICBmb3VuZDsKKwlpbnQJZXJyb3IgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLyoKKwkgKiBJdCBpcyBhIGJ1ZyB0aGF0IHRoZSB1cHBlciBsYXllciB0YWtlcworCSAqIHRoaXMgbG9jayBqdXN0IHByaW9yIHRvIGNhbGxpbmcgdXMuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCisKKwkvKgorCSAqIFNhbml0eSBjaGVja2luZyBvZiBMaW51eCBTQ1NJIGRhdGEgc3RydWN0dXJlcyBzbworCSAqIHRoYXQgc29tZSBvZiBvdXIgaGFja3NeSF5IXkheSF5IYXNzdW1wdGlvbnMgYXJlbid0CisJICogdmlvbGF0ZWQuCisJICovCisJaWYgKG9mZnNldG9mKHN0cnVjdCBhaGRfY21kX2ludGVybmFsLCBlbmQpCisJICA+IG9mZnNldG9mKHN0cnVjdCBzY3NpX2NtbmQsIGhvc3Rfc2NyaWJibGUpKSB7CisJCXByaW50ZigiYWhkX2xpbnV4X2RldGVjdDogU0NTSSBkYXRhIHN0cnVjdHVyZXMgY2hhbmdlZC5cbiIpOworCQlwcmludGYoImFoZF9saW51eF9kZXRlY3Q6IFVuYWJsZSB0byBhdHRhY2hcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBzaXplIGZvciBvdXIgU2NhdHRlciBHYXR0aGVyIGxpc3RzLgorCSAqLworCWFoZF9saW51eF9zaXplX25zZWcoKTsKKyNpZmRlZiBNT0RVTEUKKwkvKgorCSAqIElmIHdlJ3ZlIGJlZW4gcGFzc2VkIGFueSBwYXJhbWV0ZXJzLCBwcm9jZXNzIHRoZW0gbm93LgorCSAqLworCWlmIChhaWM3OXh4KQorCQlhaWM3OXh4X3NldHVwKGFpYzc5eHgpOworI2VuZGlmCisKKwl0ZW1wbGF0ZS0+cHJvY19uYW1lID0gImFpYzc5eHgiOworCisJLyoKKwkgKiBJbml0aWFsaXplIG91ciBzb2Z0YyBsaXN0IGxvY2sgcHJpb3IgdG8KKwkgKiBwcm9iaW5nIGZvciBhbnkgYWRhcHRlcnMuCisJICovCisJYWhkX2xpc3RfbG9ja2luaXQoKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwllcnJvciA9IGFoZF9saW51eF9wY2lfaW5pdCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggdGhlIFNDU0kgbGF5ZXIgYWxsCisJICogY29udHJvbGxlcnMgd2UndmUgZm91bmQuCisJICovCisJZm91bmQgPSAwOworCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCisJCWlmIChhaGRfbGludXhfcmVnaXN0ZXJfaG9zdChhaGQsIHRlbXBsYXRlKSA9PSAwKQorCQkJZm91bmQrKzsKKwl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc3Bpbl9sb2NrX2lycSgmaW9fcmVxdWVzdF9sb2NrKTsKKyNlbmRpZgorCWFpYzc5eHhfZGV0ZWN0X2NvbXBsZXRlKys7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qCisgKiBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKKyAqIG1vZHVsZS4KKyAqLworc3RhdGljIGludAorYWhkX2xpbnV4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZyBsOworCisJYWhkX2xpc3RfbG9jaygmbCk7CisJaWYgKGhvc3QgIT0gTlVMTCkgeworCisJCS8qCisJCSAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgcGVyZm9ybQorCQkgKiB0aGUgZnJlZSBkaXJlY3RseSwgYnV0IGNoZWNrIG91cgorCQkgKiBsaXN0IGZvciBleHRyYSBzYW5pdHkuCisJCSAqLworCQlhaGQgPSBhaGRfZmluZF9zb2Z0YygqKHN0cnVjdCBhaGRfc29mdGMgKiopaG9zdC0+aG9zdGRhdGEpOworCQlpZiAoYWhkICE9IE5VTEwpIHsKKwkJCXVfbG9uZyBzOworCisJCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJCWFoZF9pbnRyX2VuYWJsZShhaGQsIEZBTFNFKTsKKwkJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCQlhaGRfZnJlZShhaGQpOworCQl9CisJfQorCWFoZF9saXN0X3VubG9jaygmbCk7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorYWhkX2xpbnV4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbNTEyXTsKKwljaGFyCWFoZF9pbmZvWzI1Nl07CisJY2hhciAgICpicDsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CisKKwlicCA9ICZidWZmZXJbMF07CisJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChicCwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCXN0cmNweShicCwgIkFkYXB0ZWMgQUlDNzlYWCBQQ0ktWCBTQ1NJIEhCQSBEUklWRVIsIFJldiAiKTsKKwlzdHJjYXQoYnAsIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOworCXN0cmNhdChicCwgIlxuIik7CisJc3RyY2F0KGJwLCAiICAgICAgICA8Iik7CisJc3RyY2F0KGJwLCBhaGQtPmRlc2NyaXB0aW9uKTsKKwlzdHJjYXQoYnAsICI+XG4iKTsKKwlzdHJjYXQoYnAsICIgICAgICAgICIpOworCWFoZF9jb250cm9sbGVyX2luZm8oYWhkLCBhaGRfaW5mbyk7CisJc3RyY2F0KGJwLCBhaGRfaW5mbyk7CisJc3RyY2F0KGJwLCAiXG4iKTsKKworCXJldHVybiAoYnApOworfQorCisvKgorICogUXVldWUgYW4gU0NCIHRvIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfcXVldWUoU2NzaV9DbW5kICogY21kLCB2b2lkICgqc2NzaV9kb25lKSAoU2NzaV9DbW5kICopKQoreworCXN0cnVjdAkgYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CSBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJdV9sb25nCSBmbGFnczsKKworCWFoZCA9ICooc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKgorCSAqIFNhdmUgdGhlIGNhbGxiYWNrIG9uIGNvbXBsZXRpb24gZnVuY3Rpb24uCisJICovCisJY21kLT5zY3NpX2RvbmUgPSBzY3NpX2RvbmU7CisKKwlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoZCwgJmZsYWdzKTsKKworCS8qCisJICogQ2xvc2UgdGhlIHJhY2Ugb2YgYSBjb21tYW5kIHRoYXQgd2FzIGluIHRoZSBwcm9jZXNzIG9mCisJICogYmVpbmcgcXVldWVkIHRvIHVzIGp1c3QgYXMgb3VyIHNpbXEgd2FzIGZyb3plbi4gIExldAorCSAqIERWIGNvbW1hbmRzIHRocm91Z2ggc28gbG9uZyBhcyB3ZSBhcmUgb25seSBmcm96ZW4gdG8KKwkgKiBwZXJmb3JtIERWLgorCSAqLworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gIT0gMAorCSAmJiBBSERfRFZfQ01EKGNtZCkgPT0gMCkgeworCisJCWFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIENBTV9SRVFVRVVFX1JFUSk7CisJCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOworCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCQkJCSAgIC8qYWxsb2MqL1RSVUUpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kLCBDQU1fUkVTUkNfVU5BVkFJTCk7CisJCWFoZF9saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhkLCBjbWQpOworCQlhaGRfc2NoZWR1bGVfY29tcGxldGVxKGFoZCk7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7CisJCXByaW50ZigiJXM6IGFpYzc5eHhfbGludXhfcXVldWUgLSBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIVxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoY21kLT5jbWRfbGVuID4gTUFYX0NEQl9MRU4pCisJCXJldHVybiAoLUVJTlZBTCk7CisJY21kLT5yZXN1bHQgPSBDQU1fUkVRX0lOUFJPRyA8PCAxNjsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmZGV2LT5idXN5cSwgKHN0cnVjdCBhaGRfY21kICopY21kLCBhY21kX2xpbmtzLnRxZSk7CisJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkgeworCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7CisJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhkX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKGFoZCk7CisJfQorCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZmbGFncyk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBBbGxvYyAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZGV2aWNlLT5pZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwlzdHJ1Y3QJYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZwlmbGFnczsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoZF9uYW1lKGFoZCksIGRldmljZS0+aWQpOworCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhkLCAmZmxhZ3MpOworCS8qCisJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQorCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKKwkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KKwkgKi8KKwlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9VTkNPTkZJR1VSRUQ7CisJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9TTEFWRV9DT05GSUdVUkVEOworCQlkZXYtPnNjc2lfZGV2aWNlID0gZGV2aWNlOworCQlhaGRfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKGFoZCwgZGV2KTsKKwl9CisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NsYXZlX2Rlc3Ryb3koU2NzaV9EZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKKwl1X2xvbmcJZmxhZ3M7CisKKwlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU2xhdmUgRGVzdHJveSAlZFxuIiwgYWhkX25hbWUoYWhkKSwgZGV2aWNlLT5pZCk7CisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZmbGFncyk7CisJZGV2ID0gYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBkZXZpY2UtPmNoYW5uZWwsCisJCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCisJCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKKworCS8qCisJICogRmlsdGVyIG91dCAic2lsbHkiIGRlbGV0aW9ucyBvZiByZWFsIGRldmljZXMgYnkgb25seQorCSAqIGRlbGV0aW5nIGRldmljZXMgdGhhdCBoYXZlIGhhZCBzbGF2ZV9jb25maWd1cmUoKQorCSAqIGNhbGxlZCBvbiB0aGVtLiAgQWxsIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIG5vdAorCSAqIGJlZW4gY29uZmlndXJlZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZCBieQorCSAqIHRoZSByZWZjb3VudGluZyBwcm9jZXNzLgorCSAqLworCWlmIChkZXYgIT0gTlVMTAorCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfU0xBVkVfQ09ORklHVVJFRCkgIT0gMCkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVU5DT05GSUdVUkVEOworCQlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpCisJCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCisJCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSA9PSAwKQorCQkJYWhkX2xpbnV4X2ZyZWVfZGV2aWNlKGFoZCwgZGV2KTsKKwl9CisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKyNlbHNlCisvKgorICogU2V0cyB0aGUgcXVldWUgZGVwdGggZm9yIGVhY2ggU0NTSSBkZXZpY2UgaGFuZ2luZworICogb2ZmIHRoZSBpbnB1dCBob3N0IGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKiBob3N0LAorCQkJICAgICBTY3NpX0RldmljZSAqIHNjc2lfZGV2cykKK3sKKwlTY3NpX0RldmljZSAqZGV2aWNlOworCVNjc2lfRGV2aWNlICpsZGV2OworCXN0cnVjdAlhaGRfc29mdGMgKmFoZDsKKwl1X2xvbmcJZmxhZ3M7CisKKwlhaGQgPSAqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJZm9yIChkZXZpY2UgPSBzY3NpX2RldnM7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpIHsKKworCQkvKgorCQkgKiBXYXRjaCBvdXQgZm9yIGR1cGxpY2F0ZSBkZXZpY2VzLiAgVGhpcyB3b3JrcyBhcm91bmQKKwkJICogc29tZSBxdWlya3MgaW4gaG93IHRoZSBTQ1NJIHNjYW5uaW5nIGNvZGUgZG9lcyBpdHMKKwkJICogZGV2aWNlIG1hbmFnZW1lbnQuCisJCSAqLworCQlmb3IgKGxkZXYgPSBzY3NpX2RldnM7IGxkZXYgIT0gZGV2aWNlOyBsZGV2ID0gbGRldi0+bmV4dCkgeworCQkJaWYgKGxkZXYtPmhvc3QgPT0gZGV2aWNlLT5ob3N0CisJCQkgJiYgbGRldi0+Y2hhbm5lbCA9PSBkZXZpY2UtPmNoYW5uZWwKKwkJCSAmJiBsZGV2LT5pZCA9PSBkZXZpY2UtPmlkCisJCQkgJiYgbGRldi0+bHVuID09IGRldmljZS0+bHVuKQorCQkJCWJyZWFrOworCQl9CisJCS8qIFNraXAgZHVwbGljYXRlLiAqLworCQlpZiAobGRldiAhPSBkZXZpY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoZGV2aWNlLT5ob3N0ID09IGhvc3QpIHsKKwkJCXN0cnVjdAkgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCisJCQkvKgorCQkJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQorCQkJICogaXQgc28gd2UgZG9uJ3QgZnJlZSBhbmQgYWxsb2NhdGUgdGhlIGRldmljZQorCQkJICogc3RydWN0dXJlIG9uIGV2ZXJ5IGNvbW1hbmQuCisJCQkgKi8KKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aWNlLT5jaGFubmVsLAorCQkJCQkJICAgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCisJCQkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKwkJCWlmIChkZXYgIT0gTlVMTCkgeworCQkJCWRldi0+ZmxhZ3MgJj0gfkFIRF9ERVZfVU5DT05GSUdVUkVEOworCQkJCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7CisJCQkJYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChhaGQsIGRldik7CisJCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IGRldi0+b3BlbmluZ3MKKwkJCQkJCSAgICArIGRldi0+YWN0aXZlOworCQkJCWlmICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUMKKwkJCQkJCXwgQUhEX0RFVl9RX1RBR0dFRCkpID09IDApIHsKKwkJCQkJLyoKKwkJCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQKKwkJCQkJICogdHJhbnNhY3Rpb25zIHRvIHVzIGF0IGFueSB0aW1lIGV2ZW4KKwkJCQkJICogdGhvdWdoIHdlIGNhbiBvbmx5IGV4ZWN1dGUgdGhlbQorCQkJCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuCisJCQkJCSAqIFRoaXMgc2hvdWxkIHJlbW92ZSBzb21lIGxhdGVuY3kuCisJCQkJCSAqLworCQkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gMjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pCisvKgorICogUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCithaGRfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCXVpbnQ4X3QgKmJoOworI2Vsc2UKK2FoZF9saW51eF9iaW9zcGFyYW0oRGlzayAqZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSkKK3sKKwlzdHJ1Y3QJc2NzaV9kZXZpY2UgKnNkZXYgPSBkaXNrLT5kZXZpY2U7CisJdV9sb25nCWNhcGFjaXR5ID0gZGlzay0+Y2FwYWNpdHk7CisJc3RydWN0CWJ1ZmZlcl9oZWFkICpiaDsKKyNlbmRpZgorCWludAkgaGVhZHM7CisJaW50CSBzZWN0b3JzOworCWludAkgY3lsaW5kZXJzOworCWludAkgcmV0OworCWludAkgZXh0ZW5kZWQ7CisJc3RydWN0CSBhaGRfc29mdGMgKmFoZDsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWJoID0gc2NzaV9iaW9zX3B0YWJsZShiZGV2KTsKKyNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMTcpCisJYmggPSBicmVhZChNS0RFVihNQUpPUihkZXYpLCBNSU5PUihkZXYpICYgfjB4ZiksIDAsIGJsb2NrX3NpemUoZGV2KSk7CisjZWxzZQorCWJoID0gYnJlYWQoTUtERVYoTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSAmIH4weGYpLCAwLCAxMDI0KTsKKyNlbmRpZgorCisJaWYgKGJoKSB7CisJCXJldCA9IHNjc2lfcGFydHNpemUoYmgsIGNhcGFjaXR5LAorCQkJCSAgICAmZ2VvbVsyXSwgJmdlb21bMF0sICZnZW9tWzFdKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCWtmcmVlKGJoKTsKKyNlbHNlCisJCWJyZWxzZShiaCk7CisjZW5kaWYKKwkJaWYgKHJldCAhPSAtMSkKKwkJCXJldHVybiAocmV0KTsKKwl9CisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisJY3lsaW5kZXJzID0gYWljX3NlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzLCBzZWN0b3JzKTsKKworCWlmIChhaWM3OXh4X2V4dGVuZGVkICE9IDApCisJCWV4dGVuZGVkID0gMTsKKwllbHNlCisJCWV4dGVuZGVkID0gKGFoZC0+ZmxhZ3MgJiBBSERfRVhURU5ERURfVFJBTlNfQSkgIT0gMDsKKwlpZiAoZXh0ZW5kZWQgJiYgY3lsaW5kZXJzID49IDEwMjQpIHsKKwkJaGVhZHMgPSAyNTU7CisJCXNlY3RvcnMgPSA2MzsKKwkJY3lsaW5kZXJzID0gYWljX3NlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzLCBzZWN0b3JzKTsKKwl9CisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogQWJvcnQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfYWJvcnQoU2NzaV9DbW5kICpjbWQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCXN0cnVjdCBhaGRfY21kICphY21kOworCXN0cnVjdCBhaGRfY21kICpsaXN0X2FjbWQ7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2NiICpwZW5kaW5nX3NjYjsKKwl1X2xvbmcgczsKKwl1X2ludCAgc2F2ZWRfc2NicHRyOworCXVfaW50ICBhY3RpdmVfc2NicHRyOworCXVfaW50ICBsYXN0X3BoYXNlOworCXVfaW50ICBjZGJfYnl0ZTsKKwlpbnQgICAgcmV0dmFsOworCWludCAgICB3YXNfcGF1c2VkOworCWludCAgICBwYXVzZWQ7CisJaW50ICAgIHdhaXQ7CisJaW50ICAgIGRpc2Nvbm5lY3RlZDsKKwlhaGRfbW9kZV9zdGF0ZSBzYXZlZF9tb2RlczsKKworCXBlbmRpbmdfc2NiID0gTlVMTDsKKwlwYXVzZWQgPSBGQUxTRTsKKwl3YWl0ID0gRkFMU0U7CisJYWhkID0gKihzdHJ1Y3QgYWhkX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlhY21kID0gKHN0cnVjdCBhaGRfY21kICopY21kOworCisJcHJpbnRmKCIlczolZDolZDolZDogQXR0ZW1wdGluZyB0byBhYm9ydCBjbWQgJXA6IiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkgICAgICAgY21kLT5kZXZpY2UtPmx1biwgY21kKTsKKwlmb3IgKGNkYl9ieXRlID0gMDsgY2RiX2J5dGUgPCBjbWQtPmNtZF9sZW47IGNkYl9ieXRlKyspCisJCXByaW50ZigiIDB4JXgiLCBjbWQtPmNtbmRbY2RiX2J5dGVdKTsKKwlwcmludGYoIlxuIik7CisKKwkvKgorCSAqIEluIGFsbCB2ZXJzaW9ucyBvZiBMaW51eCwgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZAorCSAqIGEgbWFqb3IgZmxhdyBpbiBob3cgdGhlIG1pZC1sYXllciBpcyBsb2NrZWQgZG93bgorCSAqIGlmIHdlIGFyZSB0byBzbGVlcCBzdWNjZXNzZnVsbHkgaW4gb3VyIGVycm9yIGhhbmRsZXIKKwkgKiB3aGlsZSBhbGxvd2luZyBvdXIgaW50ZXJydXB0IGhhbmRsZXIgdG8gcnVuLiAgU2luY2UKKwkgKiB0aGUgbWlkbGF5ZXIgYWNxdWlyZXMgZWl0aGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgb3IKKwkgKiBvdXIgbG9jayBwcmlvciB0byBjYWxsaW5nIHVzLCB3ZSBtdXN0IHVzZSB0aGUKKwkgKiBzcGluX3VubG9ja19pcnEoKSBtZXRob2QgZm9yIHVubG9ja2luZyBvdXIgbG9jay4KKwkgKiBUaGlzIHdpbGwgZm9yY2UgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIG9uIHRoZQorCSAqIGN1cnJlbnQgQ1BVLiAgU2luY2UgdGhlIEVIIHRocmVhZCBzaG91bGQgbm90IGhhdmUKKwkgKiBiZWVuIHJ1bm5pbmcgd2l0aCBDUFUgaW50ZXJydXB0cyBkaXNhYmxlZCBvdGhlciB0aGFuCisJICogYnkgYWNxdWlyaW5nIGVpdGhlciB0aGUgaW9fcmVxdWVzdF9sb2NrIG9yIG91ciBvd24KKwkgKiBsb2NrLCB0aGlzICpzaG91bGQqIGJlIHNhZmUuCisJICovCisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZzKTsKKworCS8qCisJICogRmlyc3QgZGV0ZXJtaW5lIGlmIHdlIGN1cnJlbnRseSBvd24gdGhpcyBjb21tYW5kLgorCSAqIFN0YXJ0IGJ5IHNlYXJjaGluZyB0aGUgZGV2aWNlIHF1ZXVlLiAgSWYgbm90IGZvdW5kCisJICogdGhlcmUsIGNoZWNrIHRoZSBwZW5kaW5nX3NjYiBsaXN0LiAgSWYgbm90IGZvdW5kCisJICogYXQgYWxsLCBhbmQgdGhlIHN5c3RlbSB3YW50ZWQgdXMgdG8ganVzdCBhYm9ydCB0aGUKKwkgKiBjb21tYW5kLCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwlkZXYgPSBhaGRfbGludXhfZ2V0X2RldmljZShhaGQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJCSAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkgICAvKmFsbG9jKi9GQUxTRSk7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJLyoKKwkJICogTm8gdGFyZ2V0IGRldmljZSBmb3IgdGhpcyBjb21tYW5kIGV4aXN0cywKKwkJICogc28gd2UgbXVzdCBub3Qgc3RpbGwgb3duIHRoZSBjb21tYW5kLgorCQkgKi8KKwkJcHJpbnRmKCIlczolZDolZDolZDogSXMgbm90IGFuIGFjdGl2ZSBkZXZpY2VcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLAorCQkgICAgICAgY21kLT5kZXZpY2UtPmx1bik7CisJCXJldHZhbCA9IFNVQ0NFU1M7CisJCWdvdG8gbm9fY21kOworCX0KKworCVRBSUxRX0ZPUkVBQ0gobGlzdF9hY21kLCAmZGV2LT5idXN5cSwgYWNtZF9saW5rcy50cWUpIHsKKwkJaWYgKGxpc3RfYWNtZCA9PSBhY21kKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGxpc3RfYWNtZCAhPSBOVUxMKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgZm91bmQgb24gZGV2aWNlIHF1ZXVlXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlUQUlMUV9SRU1PVkUoJmRldi0+YnVzeXEsIGxpc3RfYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7CisJCXJldHZhbCA9IFNVQ0NFU1M7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIGNtZCBpbiB0aGUgcGVuZGluZyBsaXN0LgorCSAqLworCUxJU1RfRk9SRUFDSChwZW5kaW5nX3NjYiwgJmFoZC0+cGVuZGluZ19zY2JzLCBwZW5kaW5nX2xpbmtzKSB7CisJCWlmIChwZW5kaW5nX3NjYi0+aW9fY3R4ID09IGNtZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChwZW5kaW5nX3NjYiA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgbm90IGZvdW5kXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlpZiAoKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpICE9IDApIHsKKwkJLyoKKwkJICogV2UgY2FuJ3QgcXVldWUgdHdvIHJlY292ZXJ5IGFjdGlvbnMgdXNpbmcgdGhlIHNhbWUgU0NCCisJCSAqLworCQlyZXR2YWwgPSBGQUlMRUQ7CisJCWdvdG8gIGRvbmU7CisJfQorCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgY2FyZCBkb2Vzbid0IGRvIGFueXRoaW5nCisJICogYmVoaW5kIG91ciBiYWNrLiAgQWxzbyBtYWtlIHN1cmUgdGhhdCB3ZQorCSAqIGRpZG4ndCAianVzdCIgbWlzcyBhbiBpbnRlcnJ1cHQgdGhhdCB3b3VsZAorCSAqIGFmZmVjdCB0aGlzIGNtZC4KKwkgKi8KKwl3YXNfcGF1c2VkID0gYWhkX2lzX3BhdXNlZChhaGQpOworCWFoZF9wYXVzZV9hbmRfZmx1c2h3b3JrKGFoZCk7CisJcGF1c2VkID0gVFJVRTsKKworCWlmICgocGVuZGluZ19zY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGFscmVhZHkgY29tcGxldGVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlwcmludGYoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKKwkgICAgICAgYWhkX25hbWUoYWhkKSwgd2FzX3BhdXNlZCA/ICIiIDogIm5vdCAiKTsKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisKKwlkaXNjb25uZWN0ZWQgPSBUUlVFOworCWlmIChhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIFNDQl9HRVRfVEFHKHBlbmRpbmdfc2NiKSwKKwkJCSAgICAgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUV9BQk9SVEVELAorCQkJICAgICAgIFNFQVJDSF9DT01QTEVURSkgPiAwKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCQkJY21kLT5kZXZpY2UtPmx1bik7CisJCXJldHZhbCA9IFNVQ0NFU1M7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCWxhc3RfcGhhc2UgPSBhaGRfaW5iKGFoZCwgTEFTVFBIQVNFKTsKKwlzYXZlZF9zY2JwdHIgPSBhaGRfZ2V0X3NjYnB0cihhaGQpOworCWFjdGl2ZV9zY2JwdHIgPSBzYXZlZF9zY2JwdHI7CisJaWYgKGRpc2Nvbm5lY3RlZCAmJiAoYWhkX2luYihhaGQsIFNFUV9GTEFHUykgJiBOT1RfSURFTlRJRklFRCkgPT0gMCkgeworCQlzdHJ1Y3Qgc2NiICpidXNfc2NiOworCisJCWJ1c19zY2IgPSBhaGRfbG9va3VwX3NjYihhaGQsIGFjdGl2ZV9zY2JwdHIpOworCQlpZiAoYnVzX3NjYiA9PSBwZW5kaW5nX3NjYikKKwkJCWRpc2Nvbm5lY3RlZCA9IEZBTFNFOworCX0KKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgcGVuZGluZ19zY2IgaXMgdGhlIHNjYiBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogcGFzc2VkIGluIGNvbW1hbmQuICBUaGF0IGNvbW1hbmQgaXMgY3VycmVudGx5IGFjdGl2ZSBvbiB0aGUKKwkgKiBidXMgb3IgaXMgaW4gdGhlIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KKwkgKi8KKwlpZiAobGFzdF9waGFzZSAhPSBQX0JVU0ZSRUUKKwkgJiYgU0NCX0dFVF9UQUcocGVuZGluZ19zY2IpID09IGFjdGl2ZV9zY2JwdHIpIHsKKworCQkvKgorCQkgKiBXZSdyZSBhY3RpdmUgb24gdGhlIGJ1cywgc28gYXNzZXJ0IEFUTgorCQkgKiBhbmQgaG9wZSB0aGF0IHRoZSB0YXJnZXQgcmVzcG9uZHMuCisJCSAqLworCQlwZW5kaW5nX3NjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgYWN0aXZlX3NjYnB0cik7CisJCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQk9SVDsKKwkJYWhkX291dGIoYWhkLCBNU0dfT1VULCBIT1NUX01TRyk7CisJCWFoZF9vdXRiKGFoZCwgU0NTSVNJR08sIGxhc3RfcGhhc2V8QVROTyk7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IERldmljZSBpcyBhY3RpdmUsIGFzc2VydGluZyBBVE5cbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCXdhaXQgPSBUUlVFOworCX0gZWxzZSBpZiAoZGlzY29ubmVjdGVkKSB7CisKKwkJLyoKKwkJICogQWN0dWFsbHkgcmUtcXVldWUgdGhpcyBTQ0IgaW4gYW4gYXR0ZW1wdAorCQkgKiB0byBzZWxlY3QgdGhlIGRldmljZSBiZWZvcmUgaXQgcmVjb25uZWN0cy4KKwkJICovCisJCXBlbmRpbmdfc2NiLT5mbGFncyB8PSBTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQk9SVDsKKwkJYWhkX3NldF9zY2JwdHIoYWhkLCBTQ0JfR0VUX1RBRyhwZW5kaW5nX3NjYikpOworCQlwZW5kaW5nX3NjYi0+aHNjYi0+Y2RiX2xlbiA9IDA7CisJCXBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX2F0dHJpYnV0ZSA9IDA7CisJCXBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX21hbmFnZW1lbnQgPSBTSVVfVEFTS01HTVRfQUJPUlRfVEFTSzsKKworCQlpZiAoKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9QQUNLRVRJWkVEKSAhPSAwKSB7CisJCQkvKgorCQkJICogTWFyayB0aGUgU0NCIGhhcyBoYXZpbmcgYW4gb3V0c3RhbmRpbmcKKwkJCSAqIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbi4gIFNob3VsZCB0aGUgY29tbWFuZAorCQkJICogY29tcGxldGUgbm9ybWFsbHkgYmVmb3JlIHRoZSB0YXNrIG1hbmFnZW1lbnQKKwkJCSAqIGZ1bmN0aW9uIGNhbiBiZSBzZW50LCB0aGUgaG9zdCB3aWxsIGJlIG5vdGlmaWVkCisJCQkgKiB0byBhYm9ydCBvdXIgcmVxdWV1ZWQgU0NCLgorCQkJICovCisJCQlhaGRfb3V0YihhaGQsIFNDQl9UQVNLX01BTkFHRU1FTlQsCisJCQkJIHBlbmRpbmdfc2NiLT5oc2NiLT50YXNrX21hbmFnZW1lbnQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIG5vbi1wYWNrZXRpemVkLCBzZXQgdGhlIE1LX01FU1NBR0UgY29udHJvbAorCQkJICogYml0IGluZGljYXRpbmcgdGhhdCB3ZSBkZXNpcmUgdG8gc2VuZCBhIG1lc3NhZ2UuCisJCQkgKiBXZSBhbHNvIHNldCB0aGUgZGlzY29ubmVjdGVkIGZsYWcgc2luY2UgdGhlcmUgaXMKKwkJCSAqIG5vIGd1YXJhbnRlZSB0aGF0IG91ciBTQ0IgY29udHJvbCBieXRlIG1hdGNoZXMKKwkJCSAqIHRoZSB2ZXJzaW9uIG9uIHRoZSBjYXJkLiAgV2UgZG9uJ3Qgd2FudCB0aGUKKwkJCSAqIHNlcXVlbmNlciB0byBhYm9ydCB0aGUgY29tbWFuZCB0aGlua2luZyBhbgorCQkJICogdW5zb2xpY2l0ZWQgcmVzZWxlY3Rpb24gb2NjdXJyZWQuCisJCQkgKi8KKwkJCXBlbmRpbmdfc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0V8RElTQ09OTkVDVEVEOworCisJCQkvKgorCQkJICogVGhlIHNlcXVlbmNlciB3aWxsIG5ldmVyIHJlLXJlZmVyZW5jZSB0aGUKKwkJCSAqIGluLWNvcmUgU0NCLiAgVG8gbWFrZSBzdXJlIHdlIGFyZSBub3RpZmllZAorCQkJICogZHVyaW5nIHJlc2xlY3Rpb24sIHNldCB0aGUgTUtfTUVTU0FHRSBmbGFnIGluCisJCQkgKiB0aGUgY2FyZCdzIGNvcHkgb2YgdGhlIFNDQi4KKwkJCSAqLworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwKKwkJCQkgYWhkX2luYihhaGQsIFNDQl9DT05UUk9MKXxNS19NRVNTQUdFKTsKKwkJfQorCisJCS8qCisJCSAqIENsZWFyIG91dCBhbnkgZW50cmllcyBpbiB0aGUgUUlORklGTyBmaXJzdAorCQkgKiBzbyB3ZSBhcmUgdGhlIG5leHQgU0NCIGZvciB0aGlzIHRhcmdldAorCQkgKiB0byBydW4uCisJCSAqLworCQlhaGRfc2VhcmNoX3FpbmZpZm8oYWhkLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCQkJICAgU0NCX0xJU1RfTlVMTCwgUk9MRV9JTklUSUFUT1IsCisJCQkJICAgQ0FNX1JFUVVFVUVfUkVRLCBTRUFSQ0hfQ09NUExFVEUpOworCQlhaGRfcWluZmlmb19yZXF1ZXVlX3RhaWwoYWhkLCBwZW5kaW5nX3NjYik7CisJCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NicHRyKTsKKwkJYWhkX3ByaW50X3BhdGgoYWhkLCBwZW5kaW5nX3NjYik7CisJCXByaW50ZigiRGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgcmUtcXVldWluZyBTQ0JcbiIpOworCQl3YWl0ID0gVFJVRTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBVbmFibGUgdG8gZGVsaXZlciBtZXNzYWdlXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR2YWwgPSBGQUlMRUQ7CisJCWdvdG8gZG9uZTsKKwl9CisKK25vX2NtZDoKKwkvKgorCSAqIE91ciBhc3N1bXB0aW9uIGlzIHRoYXQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgY29tbWFuZCwgbm8KKwkgKiByZWNvdmVyeSBhY3Rpb24gd2FzIHJlcXVpcmVkLCBzbyB3ZSByZXR1cm4gc3VjY2Vzcy4gIEFnYWluLAorCSAqIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIG1pZC1sYXllciByZWNvdmVyeSBlbmdpbmUgYXJlIG5vdAorCSAqIHdlbGwgZGVmaW5lZCwgc28gdGhpcyBtYXkgY2hhbmdlIGluIHRpbWUuCisJICovCisJcmV0dmFsID0gU1VDQ0VTUzsKK2RvbmU6CisJaWYgKHBhdXNlZCkKKwkJYWhkX3VucGF1c2UoYWhkKTsKKwlpZiAod2FpdCkgeworCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkJaW50IHJldDsKKworCQlwZW5kaW5nX3NjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX1NDQl9VUF9FSF9TRU07CisJCXNwaW5fdW5sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworCQlpbml0X3RpbWVyKCZ0aW1lcik7CisJCXRpbWVyLmRhdGEgPSAodV9sb25nKXBlbmRpbmdfc2NiOworCQl0aW1lci5leHBpcmVzID0gamlmZmllcyArICg1ICogSFopOworCQl0aW1lci5mdW5jdGlvbiA9IGFoZF9saW51eF9zZW1fdGltZW91dDsKKwkJYWRkX3RpbWVyKCZ0aW1lcik7CisJCXByaW50ZigiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CisJCWRvd24oJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwkJcHJpbnRmKCJSZWNvdmVyeSBjb2RlIGF3YWtlXG4iKTsKKyAgICAgICAgCXJldCA9IGRlbF90aW1lcl9zeW5jKCZ0aW1lcik7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcHJpbnRmKCJUaW1lciBFeHBpcmVkXG4iKTsKKwkJCXJldHZhbCA9IEZBSUxFRDsKKwkJfQorCQlzcGluX2xvY2tfaXJxKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJfQorCWFoZF9zY2hlZHVsZV9ydW5xKGFoZCk7CisJYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOworCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kZXZfcmVzZXRfY29tcGxldGUoU2NzaV9DbW5kICpjbWQpCit7CisJZnJlZShjbWQsIE1fREVWQlVGKTsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gc2VuZCBhIHRhcmdldCByZXNldCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgdGhhdCB0aW1lZCBvdXQuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXN0cnVjdAlzY3NpX2NtbmQgKnJlY292ZXJ5X2NtZDsKKwlzdHJ1Y3QJYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXN0cnVjdAlhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlzY2IgKnNjYjsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiICpoc2NiOworCXVfbG9uZwlzOworCXN0cnVjdAl0aW1lcl9saXN0IHRpbWVyOworCWludAlyZXR2YWw7CisKKwlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJlY292ZXJ5X2NtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJaWYgKCFyZWNvdmVyeV9jbWQpCisJCXJldHVybiAoRkFJTEVEKTsKKwltZW1zZXQocmVjb3ZlcnlfY21kLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfY21uZCkpOworCXJlY292ZXJ5X2NtZC0+ZGV2aWNlID0gY21kLT5kZXZpY2U7CisJcmVjb3ZlcnlfY21kLT5zY3NpX2RvbmUgPSBhaGRfbGludXhfZGV2X3Jlc2V0X2NvbXBsZXRlOworI2lmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IERldmljZSByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCBjbWQpOworI2VuZGlmCisJYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGQsICZzKTsKKworCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICBjbWQtPmRldmljZS0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwkJa2ZyZWUocmVjb3ZlcnlfY21kKTsKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKwlpZiAoKHNjYiA9IGFoZF9nZXRfc2NiKGFoZCwgQUhEX05FVkVSX0NPTF9JRFgpKSA9PSBOVUxMKSB7CisJCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwkJa2ZyZWUocmVjb3ZlcnlfY21kKTsKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCSAgICBjbWQtPmRldmljZS0+aWQsICZ0c3RhdGUpOworCXJlY292ZXJ5X2NtZC0+cmVzdWx0ID0gQ0FNX1JFUV9JTlBST0cgPDwgMTY7CisJcmVjb3ZlcnlfY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilzY2I7CisJc2NiLT5pb19jdHggPSByZWNvdmVyeV9jbWQ7CisJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7CisJc2NiLT5zZ19jb3VudCA9IDA7CisJYWhkX3NldF9yZXNpZHVhbChzY2IsIDApOworCWFoZF9zZXRfc2Vuc2VfcmVzaWR1YWwoc2NiLCAwKTsKKwloc2NiID0gc2NiLT5oc2NiOworCWhzY2ItPmNvbnRyb2wgPSAwOworCWhzY2ItPnNjc2lpZCA9IEJVSUxEX1NDU0lJRChhaGQsIGNtZCk7CisJaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKKwloc2NiLT5jZGJfbGVuID0gMDsKKwloc2NiLT50YXNrX21hbmFnZW1lbnQgPSBTSVVfVEFTS01HTVRfTFVOX1JFU0VUOworCXNjYi0+ZmxhZ3MgfD0gU0NCX0RFVklDRV9SRVNFVHxTQ0JfUkVDT1ZFUllfU0NCfFNDQl9BQ1RJVkU7CisJaWYgKCh0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOworCX0gZWxzZSB7CisJCWhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKwl9CisJZGV2LT5vcGVuaW5ncy0tOworCWRldi0+YWN0aXZlKys7CisJZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKKwlMSVNUX0lOU0VSVF9IRUFEKCZhaGQtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwlhaGRfcXVldWVfc2NiKGFoZCwgc2NiKTsKKworCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX1NDQl9VUF9FSF9TRU07CisJc3Bpbl91bmxvY2tfaXJxKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmRhdGEgPSAodV9sb25nKXNjYjsKKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArICg1ICogSFopOworCXRpbWVyLmZ1bmN0aW9uID0gYWhkX2xpbnV4X3NlbV90aW1lb3V0OworCWFkZF90aW1lcigmdGltZXIpOworCXByaW50ZigiUmVjb3ZlcnkgY29kZSBzbGVlcGluZ1xuIik7CisJZG93bigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCXByaW50ZigiUmVjb3ZlcnkgY29kZSBhd2FrZVxuIik7CisJcmV0dmFsID0gU1VDQ0VTUzsKKwlpZiAoZGVsX3RpbWVyX3N5bmMoJnRpbWVyKSA9PSAwKSB7CisJCXByaW50ZigiVGltZXIgRXhwaXJlZFxuIik7CisJCXJldHZhbCA9IEZBSUxFRDsKKwl9CisJc3Bpbl9sb2NrX2lycSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworCWFoZF9zY2hlZHVsZV9ydW5xKGFoZCk7CisJYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGQpOworCWFoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGQsICZzKTsKKwlwcmludGYoIiVzOiBEZXZpY2UgcmVzZXQgcmV0dXJuaW5nIDB4JXhcbiIsIGFoZF9uYW1lKGFoZCksIHJldHZhbCk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKgorICogUmVzZXQgdGhlIFNDU0kgYnVzLgorICovCitzdGF0aWMgaW50CithaGRfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKKwl1X2xvbmcgczsKKwlpbnQgICAgZm91bmQ7CisKKwlhaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworI2lmZGVmIEFIRF9ERUJVRworCWlmICgoYWhkX2RlYnVnICYgQUhEX1NIT1dfUkVDT1ZFUlkpICE9IDApCisJCXByaW50ZigiJXM6IEJ1cyByZXNldCBjYWxsZWQgZm9yIGNtZCAlcFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZCk7CisjZW5kaWYKKwlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoZCwgJnMpOworCWZvdW5kID0gYWhkX3Jlc2V0X2NoYW5uZWwoYWhkLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgIC8qaW5pdGlhdGUgcmVzZXQqL1RSVUUpOworCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKKwlhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhkLCAmcyk7CisKKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IFNDU0kgYnVzIHJlc2V0IGRlbGl2ZXJlZC4gIgorCQkgICAgICAgIiVkIFNDQnMgYWJvcnRlZC5cbiIsIGFoZF9uYW1lKGFoZCksIGZvdW5kKTsKKworCXJldHVybiAoU1VDQ0VTUyk7Cit9CisKK1Njc2lfSG9zdF9UZW1wbGF0ZSBhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImFpYzc5eHgiLAorCS5wcm9jX2luZm8JCT0gYWhkX2xpbnV4X3Byb2NfaW5mbywKKwkuaW5mbwkJCT0gYWhkX2xpbnV4X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhaGRfbGludXhfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGRfbGludXhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWhkX2xpbnV4X2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhaGRfbGludXhfYnVzX3Jlc2V0LAorI2lmIGRlZmluZWQoX19pMzg2X18pCisJLmJpb3NfcGFyYW0JCT0gYWhkX2xpbnV4X2Jpb3NwYXJhbSwKKyNlbmRpZgorCS5jYW5fcXVldWUJCT0gQUhEX01BWF9RVUVVRSwKKwkudGhpc19pZAkJPSAtMSwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNsYXZlX2FsbG9jCQk9IGFoZF9saW51eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWhkX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBhaGRfbGludXhfc2xhdmVfZGVzdHJveSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhc2tsZXQgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbiAyLjQuWCBhbmQgYWJvdmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBhIHRhc2tsZXQsCisgKiBzbyB3ZSBtdXN0IHJlLWFjcXVpcmUgb3VyIGxvY2sgcHJpb3IgdG8gZXhlY3V0aW5nIHRoaXMgY29kZS4KKyAqIEluIGFsbCBwcmlvciBrZXJuZWxzLCBhaGRfc2NoZWR1bGVfcnVucSgpIGNhbGxzIHRoaXMgcm91dGluZQorICogZGlyZWN0bHkgYW5kIGFoZF9zY2hlZHVsZV9ydW5xKCkgaXMgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhaGRfc29mdGMqIGFoZDsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZyBmbGFnczsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopZGF0YTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJd2hpbGUgKChkZXYgPSBhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkpICE9IE5VTEwpIHsKKwkKKwkJVEFJTFFfUkVNT1ZFKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKKwkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhkX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShhaGQsIGRldik7CisJCS8qIFllaWxkIHRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKKwkJYWhkX2xvY2soYWhkLCAmZmxhZ3MpOworCX0KKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1cyBETUEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYWhkX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCBwYXJlbnQsCisJCSAgIGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfc2l6ZV90IGJvdW5kYXJ5LAorCQkgICBkbWFfYWRkcl90IGxvd2FkZHIsIGRtYV9hZGRyX3QgaGlnaGFkZHIsCisJCSAgIGJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLAorCQkgICBidXNfc2l6ZV90IG1heHNpemUsIGludCBuc2VnbWVudHMsCisJCSAgIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV90YWdfdCAqcmV0X3RhZykKK3sKKwlidXNfZG1hX3RhZ190IGRtYXQ7CisKKwlkbWF0ID0gbWFsbG9jKHNpemVvZigqZG1hdCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGRtYXQgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJLyoKKwkgKiBMaW51eCBpcyB2ZXJ5IHNpbXBsaXN0aWMgYWJvdXQgRE1BIG1lbW9yeS4gIEZvciBub3cgZG9uJ3QKKwkgKiBtYWludGFpbiBhbGwgc3BlY2lmaWNhdGlvbiBpbmZvcm1hdGlvbi4gIE9uY2UgTGludXggc3VwcGxpZXMKKwkgKiBiZXR0ZXIgZmFjaWxpdGllcyBmb3IgZG9pbmcgdGhlc2Ugb3BlcmF0aW9ucywgb3IgdGhlCisJICogbmVlZHMgb2YgdGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBjaGFuZ2UsIHdlIG1pZ2h0IG5lZWQgdG8gZG8KKwkgKiBtb3JlIGhlcmUuCisJICovCisJZG1hdC0+YWxpZ25tZW50ID0gYWxpZ25tZW50OworCWRtYXQtPmJvdW5kYXJ5ID0gYm91bmRhcnk7CisJZG1hdC0+bWF4c2l6ZSA9IG1heHNpemU7CisJKnJldF90YWcgPSBkbWF0OworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQpCit7CisJZnJlZShkbWF0LCBNX0RFVkJVRik7Cit9CisKK2ludAorYWhkX2RtYW1lbV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgdm9pZCoqIHZhZGRyLAorCQkgaW50IGZsYWdzLCBidXNfZG1hbWFwX3QgKm1hcHApCit7CisJYnVzX2RtYW1hcF90IG1hcDsKKworCW1hcCA9IG1hbGxvYyhzaXplb2YoKm1hcCksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJLyoKKwkgKiBBbHRob3VnaCB3ZSBjYW4gZG1hIGRhdGEgYWJvdmUgNEdCLCBvdXIKKwkgKiAiY29uc2lzdGVudCIgbWVtb3J5IGlzIGJlbG93IDRHQiBmb3IKKwkgKiBzcGFjZSBlZmZpY2llbmN5IHJlYXNvbnMgKG9ubHkgbmVlZCBhIDRieXRlCisJICogYWRkcmVzcykuICBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gcmVzZXQKKwkgKiBvdXIgZG1hIG1hc2sgd2hlbiBkb2luZyBhbGxvY2F0aW9ucy4KKwkgKi8KKwlpZiAoYWhkLT5kZXZfc29mdGMgIT0gTlVMTCkKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soYWhkLT5kZXZfc29mdGMsIDB4RkZGRkZGRkYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3OXh4OiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlrZnJlZShtYXApOworCQkJcmV0dXJuIChFTk9ERVYpOworCQl9CisJKnZhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsCisJCQkJICAgICAgZG1hdC0+bWF4c2l6ZSwgJm1hcC0+YnVzX2FkZHIpOworCWlmIChhaGQtPmRldl9zb2Z0YyAhPSBOVUxMKQorCQlpZiAocGNpX3NldF9kbWFfbWFzayhhaGQtPmRldl9zb2Z0YywKKwkJCQkgICAgIGFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2spKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3OXh4OiBObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlrZnJlZShtYXApOworCQkJcmV0dXJuIChFTk9ERVYpOworCQl9CisJaWYgKCp2YWRkciA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJKm1hcHAgPSBtYXA7CisJcmV0dXJuKDApOworfQorCit2b2lkCithaGRfZG1hbWVtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsCisJCXZvaWQqIHZhZGRyLCBidXNfZG1hbWFwX3QgbWFwKQoreworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWhkLT5kZXZfc29mdGMsIGRtYXQtPm1heHNpemUsCisJCQkgICAgdmFkZHIsIG1hcC0+YnVzX2FkZHIpOworfQorCitpbnQKK2FoZF9kbWFtYXBfbG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkJdm9pZCAqYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgYnVzX2RtYW1hcF9jYWxsYmFja190ICpjYiwKKwkJdm9pZCAqY2JfYXJnLCBpbnQgZmxhZ3MpCit7CisJLyoKKwkgKiBBc3N1bWUgZm9yIG5vdyB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIHVzZWQgZHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24gYW5kIG5vdCBmb3IgcGVyLXRyYW5zYWN0aW9uIGJ1ZmZlciBtYXBwaW5nLgorCSAqLworCWJ1c19kbWFfc2VnbWVudF90IHN0YWNrX3NnOworCisJc3RhY2tfc2cuZHNfYWRkciA9IG1hcC0+YnVzX2FkZHI7CisJc3RhY2tfc2cuZHNfbGVuID0gZG1hdC0+bWF4c2l6ZTsKKwljYihjYl9hcmcsICZzdGFja19zZywgLypuc2VnKi8xLCAvKmVycm9yKi8wKTsKKwlyZXR1cm4gKDApOworfQorCit2b2lkCithaGRfZG1hbWFwX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJLyoKKwkgKiBUaGUgbWFwIG1heSBpcyBOVUxMIGluIG91ciA8IDIuMy5YIGltcGxlbWVudGF0aW9uLgorCSAqLworCWlmIChtYXAgIT0gTlVMTCkKKwkJZnJlZShtYXAsIE1fREVWQlVGKTsKK30KKworaW50CithaGRfZG1hbWFwX3VubG9hZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBQbGF0Zm9ybSBEZXBlbmRlbnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDb21wYXJlICJsZWZ0IGhhbmQiIHNvZnRjIHdpdGggInJpZ2h0IGhhbmQiIHNvZnRjLCByZXR1cm5pbmc6CisgKiA8IDAgLSBsYWhkIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gcmFoZAorICogICAwIC0gU29mdGNzIGFyZSBlcXVhbAorICogPiAwIC0gbGFoZCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiByYWhkCisgKi8KK2ludAorYWhkX3NvZnRjX2NvbXAoc3RydWN0IGFoZF9zb2Z0YyAqbGFoZCwgc3RydWN0IGFoZF9zb2Z0YyAqcmFoZCkKK3sKKwlpbnQJdmFsdWU7CisKKwkvKgorCSAqIFVuZGVyIExpbnV4LCBjYXJkcyBhcmUgb3JkZXJlZCBhcyBmb2xsb3dzOgorCSAqCTEpIFBDSSBkZXZpY2VzIHRoYXQgYXJlIG1hcmtlZCBhcyB0aGUgYm9vdCBjb250cm9sbGVyLgorCSAqCTIpIFBDSSBkZXZpY2VzIHdpdGggQklPUyBlbmFibGVkIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgorCSAqCTMpIEFsbCByZW1haW5pbmcgUENJIGRldmljZXMgc29ydGVkIGJ5IGJ1cy9zbG90L2Z1bmMuCisJICovCisjaWYgMAorCXZhbHVlID0gKGxhaGQtPmZsYWdzICYgQUhEX0JPT1RfQ0hBTk5FTCkKKwkgICAgICAtIChyYWhkLT5mbGFncyAmIEFIRF9CT09UX0NIQU5ORUwpOworCWlmICh2YWx1ZSAhPSAwKQorCQkvKiBDb250cm9sbGVycyBzZXQgZm9yIGJvb3QgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCisJCXJldHVybiAodmFsdWUpOworI2VuZGlmCisKKwl2YWx1ZSA9IChsYWhkLT5mbGFncyAmIEFIRF9CSU9TX0VOQUJMRUQpCisJICAgICAgLSAocmFoZC0+ZmxhZ3MgJiBBSERfQklPU19FTkFCTEVEKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJLyogQ29udHJvbGxlcnMgd2l0aCBCSU9TIGVuYWJsZWQgaGF2ZSBhICpoaWdoZXIqIHByaW9yaXR5ICovCisJCXJldHVybiAodmFsdWUpOworCisJLyogU3RpbGwgZXF1YWwuICBTb3J0IGJ5IGJ1cy9zbG90L2Z1bmMuICovCisJaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCisJCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKGxhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMocmFoZC0+ZGV2X3NvZnRjKTsKKwllbHNlCisJCXZhbHVlID0gYWhkX2dldF9wY2lfYnVzKHJhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9idXMobGFoZC0+ZGV2X3NvZnRjKTsKKwlpZiAodmFsdWUgIT0gMCkKKwkJcmV0dXJuICh2YWx1ZSk7CisJaWYgKGFpYzc5eHhfcmV2ZXJzZV9zY2FuICE9IDApCisJCXZhbHVlID0gYWhkX2dldF9wY2lfc2xvdChsYWhkLT5kZXZfc29mdGMpCisJCSAgICAgIC0gYWhkX2dldF9wY2lfc2xvdChyYWhkLT5kZXZfc29mdGMpOworCWVsc2UKKwkJdmFsdWUgPSBhaGRfZ2V0X3BjaV9zbG90KHJhaGQtPmRldl9zb2Z0YykKKwkJICAgICAgLSBhaGRfZ2V0X3BjaV9zbG90KGxhaGQtPmRldl9zb2Z0Yyk7CisJaWYgKHZhbHVlICE9IDApCisJCXJldHVybiAodmFsdWUpOworCisJdmFsdWUgPSByYWhkLT5jaGFubmVsIC0gbGFoZC0+Y2hhbm5lbDsKKwlyZXR1cm4gKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF90YWdfaW5mbyh1X2xvbmcgYXJnLCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKSAmJiAodGFyZyA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpCisJICYmICh0YXJnIDwgQUhEX05VTV9UQVJHRVRTKSkgeworCQlhaWM3OXh4X3RhZ19pbmZvW2luc3RhbmNlXS50YWdfY29tbWFuZHNbdGFyZ10gPSB2YWx1ZSAmIDB4MUZGOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm8odV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKwlpZiAoKGluc3RhbmNlID49IDApCisJICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X3JkX3N0cm1faW5mbykpKSB7CisJCWFpYzc5eHhfcmRfc3RybV9pbmZvW2luc3RhbmNlXSA9IHZhbHVlICYgMHhGRkZGOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInJkX3N0cm1bJWRdID0gMHgleFxuIiwgaW5zdGFuY2UsIHZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2V0dXBfZHYodV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKwlpZiAoKGluc3RhbmNlID49IDApCisJICYmIChpbnN0YW5jZSA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2R2X3NldHRpbmdzKSkpIHsKKwkJYWljNzl4eF9kdl9zZXR0aW5nc1tpbnN0YW5jZV0gPSB2YWx1ZTsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCJkdlslZF0gPSAlZFxuIiwgaW5zdGFuY2UsIHZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8odV9sb25nIGluZGV4LCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljNzl4eF9pb2NlbGxfaW5mbykpKSB7CisJCXVpbnQ4X3QgKmlvY2VsbF9pbmZvOworCisJCWlvY2VsbF9pbmZvID0gKHVpbnQ4X3QqKSZhaWM3OXh4X2lvY2VsbF9pbmZvW2luc3RhbmNlXTsKKwkJaW9jZWxsX2luZm9baW5kZXhdID0gdmFsdWUgJiAweEZGRkY7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiaW9jZWxsWyVkOiVsZF0gPSAlZFxuIiwgaW5zdGFuY2UsIGluZGV4LCB2YWx1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChjaGFyICpwKQoreworCWludCB0YWdzLCBpLCBqOworCisJdGFncyA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKSAmIDB4ZmY7CisJcHJpbnRmKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU1FTlRTKGFpYzc5eHhfdGFnX2luZm8pOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fVEFSR0VUUzsgaisrKSB7CisJCQlhaWM3OXh4X3RhZ19pbmZvW2ldLnRhZ19jb21tYW5kc1tqXSA9IHRhZ3M7CisJCX0KKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgTGludXggYm9vdCBwYXJhbWV0ZXJzLiBUaGlzIHJvdXRpbmUgYWxsb3dzIGZvciBhc3NpZ25pbmcgYSB2YWx1ZQorICogdG8gYSBwYXJhbWV0ZXIgd2l0aCBhICc6JyBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXIgYW5kIHRoZSB2YWx1ZS4KKyAqIGllLiBhaWM3OXh4PXN0cHdsZXY6MSxleHRlbmRlZAorICovCitzdGF0aWMgaW50CithaWM3OXh4X3NldHVwKGNoYXIgKnMpCit7CisJaW50CWksIG47CisJY2hhciAgICpwOworCWNoYXIgICAqZW5kOworCisJc3RhdGljIHN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXVpbnQzMl90ICpmbGFnOworCX0gb3B0aW9uc1tdID0geworCQl7ICJleHRlbmRlZCIsICZhaWM3OXh4X2V4dGVuZGVkIH0sCisJCXsgIm5vX3Jlc2V0IiwgJmFpYzc5eHhfbm9fcmVzZXQgfSwKKwkJeyAidmVyYm9zZSIsICZhaWM3OXh4X3ZlcmJvc2UgfSwKKwkJeyAiYWxsb3dfbWVtaW8iLCAmYWljNzl4eF9hbGxvd19tZW1pb30sCisjaWZkZWYgQUhEX0RFQlVHCisJCXsgImRlYnVnIiwgJmFoZF9kZWJ1ZyB9LAorI2VuZGlmCisJCXsgInJldmVyc2Vfc2NhbiIsICZhaWM3OXh4X3JldmVyc2Vfc2NhbiB9LAorCQl7ICJwZXJpb2RpY19vdGFnIiwgJmFpYzc5eHhfcGVyaW9kaWNfb3RhZyB9LAorCQl7ICJwY2lfcGFyaXR5IiwgJmFpYzc5eHhfcGNpX3Bhcml0eSB9LAorCQl7ICJzZWx0aW1lIiwgJmFpYzc5eHhfc2VsdGltZSB9LAorCQl7ICJ0YWdfaW5mbyIsIE5VTEwgfSwKKwkJeyAiZ2xvYmFsX3RhZ19kZXB0aCIsIE5VTEx9LAorCQl7ICJyZF9zdHJtIiwgTlVMTCB9LAorCQl7ICJkdiIsIE5VTEwgfSwKKwkJeyAic2xld3JhdGUiLCBOVUxMIH0sCisJCXsgInByZWNvbXAiLCBOVUxMIH0sCisJCXsgImFtcGxpdHVkZSIsIE5VTEwgfSwKKwl9OworCisJZW5kID0gc3RyY2hyKHMsICdcMCcpOworCisJLyoKKwkgKiBYWFggaWE2NCBnY2MgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBOVU1fRUxFTUVOVFMKKwkgKiB3aWxsIG5ldmVyIGJlIDAgaW4gdGhpcyBjYXNlLgorCSAqLyAgICAgIAorCW4gPSAwOyAgCisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJnMsICIsLiIpKSAhPSBOVUxMKSB7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMob3B0aW9ucyk7IGkrKykgeworCisJCQluID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm5hbWUsIHAsIG4pID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gTlVNX0VMRU1FTlRTKG9wdGlvbnMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cm5jbXAocCwgImdsb2JhbF90YWdfZGVwdGgiLCBuKSA9PSAwKSB7CisJCQlhaGRfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKHAgKyBuKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ0YWdfaW5mbyIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCisJCQkgICAgMiwgYWhkX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJyZF9zdHJtIiwgbikgPT0gMCkgeworCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInJkX3N0cm0iLCBwICsgbiwgZW5kLAorCQkJICAgIDEsIGFoZF9saW51eF9zZXR1cF9yZF9zdHJtX2luZm8sIDApOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgImR2IiwgbikgPT0gMCkgeworCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oImR2IiwgcCArIG4sIGVuZCwgMSwKKwkJCSAgICBhaGRfbGludXhfc2V0dXBfZHYsIDApOworCQl9IGVsc2UgaWYgKHN0cm5jbXAocCwgInNsZXdyYXRlIiwgbikgPT0gMCkgeworCQkJcyA9IGFpY19wYXJzZV9icmFjZV9vcHRpb24oInNsZXdyYXRlIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9TTEVXUkFURV9JTkRFWCk7CisJCX0gZWxzZSBpZiAoc3RybmNtcChwLCAicHJlY29tcCIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJwcmVjb21wIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9QUkVDT01QX0lOREVYKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJhbXBsaXR1ZGUiLCBuKSA9PSAwKSB7CisJCQlzID0gYWljX3BhcnNlX2JyYWNlX29wdGlvbigiYW1wbGl0dWRlIiwKKwkJCSAgICBwICsgbiwgZW5kLCAxLCBhaGRfbGludXhfc2V0dXBfaW9jZWxsX2luZm8sCisJCQkgICAgQUlDNzlYWF9BTVBMSVRVREVfSU5ERVgpOworCQl9IGVsc2UgaWYgKHBbbl0gPT0gJzonKSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgPSBzaW1wbGVfc3RydG91bChwICsgbiArIDEsIE5VTEwsIDApOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHAsICJ2ZXJib3NlIiwgbikpIHsKKwkJCSoob3B0aW9uc1tpXS5mbGFnKSA9IDE7CisJCX0gZWxzZSB7CisJCQkqKG9wdGlvbnNbaV0uZmxhZykgXj0gMHhGRkZGRkZGRjsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWljNzl4eD0iLCBhaWM3OXh4X3NldHVwKTsKKwordWludDMyX3QgYWljNzl4eF92ZXJib3NlOworCitpbnQKK2FoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKK3sKKwljaGFyCWJ1Zls4MF07CisJc3RydWN0CVNjc2lfSG9zdCAqaG9zdDsKKwljaGFyCSpuZXdfbmFtZTsKKwl1X2xvbmcJczsKKwl1X2xvbmcJdGFyZ2V0OworCisJdGVtcGxhdGUtPm5hbWUgPSBhaGQtPmRlc2NyaXB0aW9uOworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYWhkX3NvZnRjICopKTsKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkqKChzdHJ1Y3QgYWhkX3NvZnRjICoqKWhvc3QtPmhvc3RkYXRhKSA9IGFoZDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc2NzaV9hc3NpZ25fbG9jayhob3N0LCAmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworI2VsaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCisJaG9zdC0+bG9jayA9ICZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jazsKKyNlbmRpZgorCWFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCA9IGhvc3Q7CisJaG9zdC0+Y2FuX3F1ZXVlID0gQUhEX01BWF9RVUVVRTsKKwlob3N0LT5jbWRfcGVyX2x1biA9IDI7CisJaG9zdC0+c2dfdGFibGVzaXplID0gQUhEX05TRUc7CisJaG9zdC0+dGhpc19pZCA9IGFoZC0+b3VyX2lkOworCWhvc3QtPmlycSA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxOworCWhvc3QtPm1heF9pZCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTYgOiA4OworCWhvc3QtPm1heF9sdW4gPSBBSERfTlVNX0xVTlM7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IEFIRF9OU0VHOworCWFoZF9zZXRfdW5pdChhaGQsIGFoZF9saW51eF9uZXh0X3VuaXQoKSk7CisJc3ByaW50ZihidWYsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKKwluZXdfbmFtZSA9IG1hbGxvYyhzdHJsZW4oYnVmKSArIDEsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKG5ld19uYW1lICE9IE5VTEwpIHsKKwkJc3RyY3B5KG5ld19uYW1lLCBidWYpOworCQlhaGRfc2V0X25hbWUoYWhkLCBuZXdfbmFtZSk7CisJfQorCWhvc3QtPnVuaXF1ZV9pZCA9IGFoZC0+dW5pdDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlzY3NpX3NldF9wY2lfZGV2aWNlKGhvc3QsIGFoZC0+ZGV2X3NvZnRjKTsKKyNlbmRpZgorCWFoZF9saW51eF9zZXR1cF91c2VyX3JkX3N0cm1fc2V0dGluZ3MoYWhkKTsKKwlhaGRfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgPSBrZXJuZWxfdGhyZWFkKGFoZF9saW51eF9kdl90aHJlYWQsIGFoZCwgMCk7CisJYWhkX2xvY2soYWhkLCAmcyk7CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkIDwgMCkgeworCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERWIHRocmVhZCwgZXJyb3I9ICVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQpOworCQlyZXR1cm4gKC1haGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCk7CisJfQorCS8qCisJICogSW5pdGlhbGx5IGFsbG9jYXRlICphbGwqIG9mIG91ciBsaW51eCB0YXJnZXQgb2JqZWN0cworCSAqIHNvIHRoYXQgdGhlIERWIHRocmVhZCB3aWxsIHNjYW4gdGhlbSBhbGwgaW4gcGFyYWxsZWwKKwkgKiBqdXN0IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4gIEFueSBkZXZpY2UgdGhhdAorCSAqIGRvZXMgbm90IGV4aXN0IHdpbGwgaGF2ZSBpdHMgdGFyZ2V0IG9iamVjdCBkZXN0cm95ZWQKKwkgKiBieSB0aGUgc2VsZWN0aW9uIHRpbWVvdXQgaGFuZGxlci4gIEluIHRoZSBjYXNlIG9mIGEKKwkgKiBkZXZpY2UgdGhhdCBhcHBlYXJzIGFmdGVyIHRoZSBpbml0aWFsIERWIHNjYW4sIGFzeW5jCisJICogbmVnb3RpYXRpb24gd2lsbCBvY2N1ciBmb3IgdGhlIGZpcnN0IGNvbW1hbmQsIGFuZCBEVgorCSAqIHdpbGwgY29tZW5jZSBzaG91bGQgdGhhdCBmaXJzdCBjb21tYW5kIGJlIHN1Y2Nlc3NmdWwuCisJICovCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBob3N0LT5tYXhfaWQ7IHRhcmdldCsrKSB7CisKKwkJLyoKKwkJICogU2tpcCBvdXIgb3duIElELiAgU29tZSBDb21wYXEvSFAgc3RvcmFnZSBkZXZpY2VzCisJCSAqIGhhdmUgZW5jbG9zdXJlIG1hbmFnZW1lbnQgZGV2aWNlcyB0aGF0IHJlc3BvbmQgdG8KKwkJICogc2luZ2xlIGJpdCBzZWxlY3Rpb24gKGkuZS4gc2VsZWN0aW5nIG91cnNlbHZlcykuCisJCSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgZWl0aGVyIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uCisJCSAqIG9yIGEgbW9kaWZpZWQga2VybmVsIHdpbGwgYmUgdXNlZCB0byBwcm9iZSB0aGlzCisJCSAqIElEIGlmIGl0IGlzIGFwcHJvcHJpYXRlLiAgVG8gYWNjb21tb2RhdGUgdGhlc2UKKwkJICogaW5zdGFsbGF0aW9ucywgYWhjX2xpbnV4X2FsbG9jX3RhcmdldCgpIHdpbGwgYWxsb2NhdGUKKwkJICogZm9yIG91ciBJRCBpZiBhc2tlZCB0byBkbyBzby4KKwkJICovCisJCWlmICh0YXJnZXQgPT0gYWhkLT5vdXJfaWQpIAorCQkJY29udGludWU7CisKKwkJYWhkX2xpbnV4X2FsbG9jX3RhcmdldChhaGQsIDAsIHRhcmdldCk7CisJfQorCWFoZF9pbnRyX2VuYWJsZShhaGQsIFRSVUUpOworCWFoZF9saW51eF9zdGFydF9kdihhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc2NzaV9hZGRfaG9zdChob3N0LCAmYWhkLT5kZXZfc29mdGMtPmRldik7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKwordWludDY0X3QKK2FoZF9saW51eF9nZXRfbWVtc2l6ZSh2b2lkKQoreworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJc2lfbWVtaW5mbygmc2kpOworCXJldHVybiAoKHVpbnQ2NF90KXNpLnRvdGFscmFtIDw8IFBBR0VfU0hJRlQpOworfQorCisvKgorICogRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHVuaXQgbnVtYmVyIHRvIHVzZQorICogZm9yIGEgbmV3IGRldmljZS4gIFdlIGRvbid0IGp1c3QgdXNlIGEgc3RhdGljCisgKiBjb3VudCB0byBoYW5kbGUgdGhlICJyZXBlYXRlZCBob3QtKHVuKXBsdWciCisgKiBzY2VuYXJpby4KKyAqLworc3RhdGljIGludAorYWhkX2xpbnV4X25leHRfdW5pdCh2b2lkKQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKKwlpbnQgdW5pdDsKKworCXVuaXQgPSAwOworcmV0cnk6CisJVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChhaGQtPnVuaXQgPT0gdW5pdCkgeworCQkJdW5pdCsrOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuaXQpOworfQorCisvKgorICogUGxhY2UgdGhlIFNDU0kgYnVzIGludG8gYSBrbm93biBzdGF0ZSBieSBlaXRoZXIgcmVzZXR0aW5nIGl0LAorICogb3IgZm9yY2luZyB0cmFuc2ZlciBuZWdvdGlhdGlvbnMgb24gdGhlIG5leHQgY29tbWFuZCB0byBhbnkKKyAqIHRhcmdldC4KKyAqLworc3RhdGljIHZvaWQKK2FoZF9saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2ludCB0YXJnZXRfaWQ7CisJdV9pbnQgbnVtdGFyZzsKKworCXRhcmdldF9pZCA9IDA7CisJbnVtdGFyZyA9IDA7CisKKwlpZiAoYWljNzl4eF9ub19yZXNldCAhPSAwKQorCQlhaGQtPmZsYWdzICY9IH5BSERfUkVTRVRfQlVTX0E7CisKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfUkVTRVRfQlVTX0EpICE9IDApCisJCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgJ0EnLCAvKmluaXRpYXRlX3Jlc2V0Ki9UUlVFKTsKKwllbHNlCisJCW51bXRhcmcgPSAoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSA/IDE2IDogODsKKworCS8qCisJICogRm9yY2UgbmVnb3RpYXRpb24gdG8gYXN5bmMgZm9yIGFsbCB0YXJnZXRzIHRoYXQKKwkgKiB3aWxsIG5vdCBzZWUgYW4gaW5pdGlhbCBidXMgcmVzZXQuCisJICovCisJZm9yICg7IHRhcmdldF9pZCA8IG51bXRhcmc7IHRhcmdldF9pZCsrKSB7CisJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQlzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgJ0EnLCBhaGQtPm91cl9pZCwKKwkJCQkJICAgIHRhcmdldF9pZCwgJnRzdGF0ZSk7CisJCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIGFoZC0+b3VyX2lkLCB0YXJnZXRfaWQsCisJCQkJICAgIENBTV9MVU5fV0lMRENBUkQsICdBJywgUk9MRV9JTklUSUFUT1IpOworCQlhaGRfdXBkYXRlX25lZ19yZXF1ZXN0KGFoZCwgJmRldmluZm8sIHRzdGF0ZSwKKwkJCQkgICAgICAgdGluZm8sIEFIRF9ORUdfQUxXQVlTKTsKKwl9CisJLyogR2l2ZSB0aGUgYnVzIHNvbWUgdGltZSB0byByZWNvdmVyICovCisJaWYgKChhaGQtPmZsYWdzICYgQUhEX1JFU0VUX0JVU19BKSAhPSAwKSB7CisJCWFoZF9mcmVlemVfc2ltcShhaGQpOworCQlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGQ7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9CisJCSAgICBqaWZmaWVzICsgKEFJQzc5WFhfUkVTRVRfREVMQVkgKiBIWikvMTAwMDsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9CisJCSAgICAoYWhkX2xpbnV4X2NhbGxiYWNrX3QgKilhaGRfcmVsZWFzZV9zaW1xOworCQlhZGRfdGltZXIoJmFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCX0KK30KKworaW50CithaGRfcGxhdGZvcm1fYWxsb2Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB2b2lkICpwbGF0Zm9ybV9hcmcpCit7CisJYWhkLT5wbGF0Zm9ybV9kYXRhID0KKwkgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCW1lbXNldChhaGQtPnBsYXRmb3JtX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYWhkX3BsYXRmb3JtX2RhdGEpKTsKKwlUQUlMUV9JTklUKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcSk7CisJVEFJTFFfSU5JVCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSk7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnEgPSBBSERfTElOVVhfTk9JUlE7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzayA9IDB4RkZGRkZGRkY7CisJYWhkX2xvY2tpbml0KGFoZCk7CisJYWhkX2RvbmVfbG9ja2luaXQoYWhkKTsKKwlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhkOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmZ1bmN0aW9uID0KKwkgICAgKGFoZF9saW51eF9jYWxsYmFja190ICopYWhkX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWU7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCWluaXRfTVVURVhfTE9DS0VEKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOworCWFoZF9zZXR1cF9ydW5xX3Rhc2tsZXQoYWhkKTsKKwlhaGQtPnNlbHRpbWUgPSAoYWljNzl4eF9zZWx0aW1lICYgMHgzKSA8PCA0OworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCWludCBpLCBqOworCisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7CisJCWRlbF90aW1lcl9zeW5jKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJCWFoZF9saW51eF9raWxsX2R2X3RocmVhZChhaGQpOworCQlhaGRfdGVhcmRvd25fcnVucV90YXNrbGV0KGFoZCk7CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJCXNjc2lfcmVtb3ZlX2hvc3QoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0KTsKKyNlbmRpZgorCQkJc2NzaV9ob3N0X3B1dChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQl9CisKKwkJLyogZGVzdHJveSBhbGwgb2YgdGhlIGRldmljZSBhbmQgdGFyZ2V0IG9iamVjdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIRF9OVU1fVEFSR0VUUzsgaSsrKSB7CisJCQl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW2ldOworCQkJaWYgKHRhcmcgIT0gTlVMTCkgeworCQkJCS8qIEtlZXAgdGFyZ2V0IGFyb3VuZCB0aHJvdWdoIHRoZSBsb29wLiAqLworCQkJCXRhcmctPnJlZmNvdW50Kys7CisJCQkJZm9yIChqID0gMDsgaiA8IEFIRF9OVU1fTFVOUzsgaisrKSB7CisKKwkJCQkJaWYgKHRhcmctPmRldmljZXNbal0gPT0gTlVMTCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkZXYgPSB0YXJnLT5kZXZpY2VzW2pdOworCQkJCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEZvcmNpYmx5IGZyZWUgdGhlIHRhcmdldCBub3cgdGhhdAorCQkJCSAqIGFsbCBkZXZpY2VzIGFyZSBnb25lLgorCQkJCSAqLworCQkJCWFoZF9saW51eF9mcmVlX3RhcmdldChhaGQsIHRhcmcpOworCQkJfQorCQl9CisKKwkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxICE9IEFIRF9MSU5VWF9OT0lSUSkKKwkJCWZyZWVfaXJxKGFoZC0+cGxhdGZvcm1fZGF0YS0+aXJxLCBhaGQpOworCQlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFDRV9QSU8KKwkJICYmIGFoZC0+YnNoc1swXS5pb3BvcnQgIT0gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGFoZC0+YnNoc1swXS5pb3BvcnQsIDI1Nik7CisJCWlmIChhaGQtPnRhZ3NbMV0gPT0gQlVTX1NQQUNFX1BJTworCQkgJiYgYWhkLT5ic2hzWzFdLmlvcG9ydCAhPSAwKQorCQkJcmVsZWFzZV9yZWdpb24oYWhkLT5ic2hzWzFdLmlvcG9ydCwgMjU2KTsKKwkJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8KKwkJICYmIGFoZC0+YnNoc1swXS5tYWRkciAhPSBOVUxMKSB7CisJCQlpb3VubWFwKGFoZC0+YnNoc1swXS5tYWRkcik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYWhkLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKKwkJCQkJICAgMHgxMDAwKTsKKwkJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIAkJLyoKKwkJICogSW4gMi40IHdlIGRldGFjaCBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIGJlZm9yZSB0aGUgUENJCisJCSAqIGxheWVyIGludm9rZXMgb3VyIHJlbW92ZSBjYWxsYmFjay4gIE5vIHBlci1pbnN0YW5jZQorCQkgKiBkZXRhY2ggaXMgcHJvdmlkZWQsIHNvIHdlIG11c3QgcmVhY2ggaW5zaWRlIHRoZSBQQ0kKKwkJICogc3Vic3lzdGVtJ3MgaW50ZXJuYWxzIGFuZCBkZXRhY2ggb3VyIGRyaXZlciBtYW51YWxseS4KKwkJICovCisJCWlmIChhaGQtPmRldl9zb2Z0YyAhPSBOVUxMKQorCQkJYWhkLT5kZXZfc29mdGMtPmRyaXZlciA9IE5VTEw7CisjZW5kaWYKKwkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEsIE1fREVWQlVGKTsKKwl9Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9pbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwkvKgorCSAqIExvb2t1cCBhbmQgY29tbWl0IGFueSBtb2RpZmllZCBJTyBDZWxsIG9wdGlvbnMuCisJICovCisJaWYgKGFoZC0+dW5pdCA8IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2lvY2VsbF9pbmZvKSkgeworCQlzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzICppb2NlbGxfb3B0czsKKworCQlpb2NlbGxfb3B0cyA9ICZhaWM3OXh4X2lvY2VsbF9pbmZvW2FoZC0+dW5pdF07CisJCWlmIChpb2NlbGxfb3B0cy0+cHJlY29tcCAhPSBBSUM3OVhYX0RFRkFVTFRfUFJFQ09NUCkKKwkJCUFIRF9TRVRfUFJFQ09NUChhaGQsIGlvY2VsbF9vcHRzLT5wcmVjb21wKTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5zbGV3cmF0ZSAhPSBBSUM3OVhYX0RFRkFVTFRfU0xFV1JBVEUpCisJCQlBSERfU0VUX1NMRVdSQVRFKGFoZCwgaW9jZWxsX29wdHMtPnNsZXdyYXRlKTsKKwkJaWYgKGlvY2VsbF9vcHRzLT5hbXBsaXR1ZGUgIT0gQUlDNzlYWF9ERUZBVUxUX0FNUExJVFVERSkKKwkJCUFIRF9TRVRfQU1QTElUVURFKGFoZCwgaW9jZWxsX29wdHMtPmFtcGxpdHVkZSk7CisJfQorCit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIFNDQl9HRVRfVEFSR0VUKGFoZCwgc2NiKSwKKwkJCQlTQ0JfR0VUX0NIQU5ORUwoYWhkLCBzY2IpLAorCQkJCVNDQl9HRVRfTFVOKHNjYiksIFNDQl9MSVNUX05VTEwsCisJCQkJUk9MRV9VTktOT1dOLCBDQU1fUkVRVUVVRV9SRVEpOworfQorCit2b2lkCithaGRfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCSAgICAgIGFoZF9xdWV1ZV9hbGcgYWxnKQoreworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXY7CisJaW50IHdhc19xdWV1aW5nOworCWludCBub3dfcXVldWluZzsKKworCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKKwkJCQkgICBkZXZpbmZvLT50YXJnZXQsCisJCQkJICAgZGV2aW5mby0+bHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJd2FzX3F1ZXVpbmcgPSBkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEKTsKKwlzd2l0Y2ggKGFsZykgeworCWRlZmF1bHQ6CisJY2FzZSBBSERfUVVFVUVfTk9ORToKKwkJbm93X3F1ZXVpbmcgPSAwOworCQlicmVhazsgCisJY2FzZSBBSERfUVVFVUVfQkFTSUM6CisJCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX0JBU0lDOworCQlicmVhazsKKwljYXNlIEFIRF9RVUVVRV9UQUdHRUQ6CisJCW5vd19xdWV1aW5nID0gQUhEX0RFVl9RX1RBR0dFRDsKKwkJYnJlYWs7CisJfQorCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWSkgPT0gMAorCSAmJiAod2FzX3F1ZXVpbmcgIT0gbm93X3F1ZXVpbmcpCisJICYmIChkZXYtPmFjdGl2ZSAhPSAwKSkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfRlJFRVpFX1RJTF9FTVBUWTsKKwkJZGV2LT5xZnJvemVuKys7CisJfQorCisJZGV2LT5mbGFncyAmPSB+KEFIRF9ERVZfUV9CQVNJQ3xBSERfREVWX1FfVEFHR0VEfEFIRF9ERVZfUEVSSU9ESUNfT1RBRyk7CisJaWYgKG5vd19xdWV1aW5nKSB7CisJCXVfaW50IHVzZXJ0YWdzOworCisJCXVzZXJ0YWdzID0gYWhkX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhkLCBkZXZpbmZvKTsKKwkJaWYgKCF3YXNfcXVldWluZykgeworCQkJLyoKKwkJCSAqIFN0YXJ0IG91dCBhZ3Jlc3NpdmVseSBhbmQgYWxsb3cgb3VyCisJCQkgKiBkeW5hbWljIHF1ZXVlIGRlcHRoIGFsZ29yaXRobSB0byB0YWtlCisJCQkgKiBjYXJlIG9mIHRoZSByZXN0LgorCQkJICovCisJCQlkZXYtPm1heHRhZ3MgPSB1c2VydGFnczsKKwkJCWRldi0+b3BlbmluZ3MgPSBkZXYtPm1heHRhZ3MgLSBkZXYtPmFjdGl2ZTsKKwkJfQorCQlpZiAoZGV2LT5tYXh0YWdzID09IDApIHsKKwkJCS8qCisJCQkgKiBRdWV1ZWluZyBpcyBkaXNhYmxlZCBieSB0aGUgdXNlci4KKwkJCSAqLworCQkJZGV2LT5vcGVuaW5ncyA9IDE7CisJCX0gZWxzZSBpZiAoYWxnID09IEFIRF9RVUVVRV9UQUdHRUQpIHsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9RX1RBR0dFRDsKKwkJCWlmIChhaWM3OXh4X3BlcmlvZGljX290YWcgIT0gMCkKKwkJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUEVSSU9ESUNfT1RBRzsKKwkJfSBlbHNlCisJCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfUV9CQVNJQzsKKwl9IGVsc2UgeworCQkvKiBXZSBjYW4gb25seSBoYXZlIG9uZSBvcGVuaW5nLiAqLworCQlkZXYtPm1heHRhZ3MgPSAwOworCQlkZXYtPm9wZW5pbmdzID0gIDEgLSBkZXYtPmFjdGl2ZTsKKwl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChkZXYtPnNjc2lfZGV2aWNlICE9IE5VTEwpIHsKKwkJc3dpdGNoICgoZGV2LT5mbGFncyAmIChBSERfREVWX1FfQkFTSUN8QUhEX0RFVl9RX1RBR0dFRCkpKSB7CisJCWNhc2UgQUhEX0RFVl9RX0JBU0lDOgorCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKKwkJCQkJCU1TR19TSU1QTEVfVEFTSywKKwkJCQkJCWRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSk7CisJCQlicmVhazsKKwkJY2FzZSBBSERfREVWX1FfVEFHR0VEOgorCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKKwkJCQkJCU1TR19PUkRFUkVEX1RBU0ssCisJCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogV2UgYWxsb3cgdGhlIE9TIHRvIHF1ZXVlIDIgdW50YWdnZWQgdHJhbnNhY3Rpb25zIHRvCisJCQkgKiB1cyBhdCBhbnkgdGltZSBldmVuIHRob3VnaCB3ZSBjYW4gb25seSBleGVjdXRlIHRoZW0KKwkJCSAqIHNlcmlhbGx5IG9uIHRoZSBjb250cm9sbGVyL2RldmljZS4gIFRoaXMgc2hvdWxkCisJCQkgKiByZW1vdmUgc29tZSBsYXRlbmN5LgorCQkJICovCisJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYtPnNjc2lfZGV2aWNlLAorCQkJCQkJLypOT04tVEFHR0VEKi8wLAorCQkJCQkJLypxdWV1ZSBkZXB0aCovMik7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorfQorCitpbnQKK2FoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwgY2hhciBjaGFubmVsLAorCQkJaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQoreworCWludCB0YXJnOworCWludCBtYXh0YXJnOworCWludCBtYXhsdW47CisJaW50IGNsdW47CisJaW50IGNvdW50OworCisJaWYgKHRhZyAhPSBTQ0JfTElTVF9OVUxMKQorCQlyZXR1cm4gKDApOworCisJdGFyZyA9IDA7CisJaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7CisJCXRhcmcgPSB0YXJnZXQ7CisJCW1heHRhcmcgPSB0YXJnICsgMTsKKwl9IGVsc2UgeworCQltYXh0YXJnID0gKGFoZC0+ZmVhdHVyZXMgJiBBSERfV0lERSkgPyAxNiA6IDg7CisJfQorCWNsdW4gPSAwOworCWlmIChsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCQljbHVuID0gbHVuOworCQltYXhsdW4gPSBjbHVuICsgMTsKKwl9IGVsc2UgeworCQltYXhsdW4gPSBBSERfTlVNX0xVTlM7CisJfQorCisJY291bnQgPSAwOworCWZvciAoOyB0YXJnIDwgbWF4dGFyZzsgdGFyZysrKSB7CisKKwkJZm9yICg7IGNsdW4gPCBtYXhsdW47IGNsdW4rKykgeworCQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwkJCXN0cnVjdCBhaGRfYnVzeXEgKmJ1c3lxOworCQkJc3RydWN0IGFoZF9jbWQgKmFjbWQ7CisKKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgLypjaGFuKi8wLCB0YXJnLAorCQkJCQkJICAgY2x1biwgLyphbGxvYyovRkFMU0UpOworCQkJaWYgKGRldiA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlidXN5cSA9ICZkZXYtPmJ1c3lxOworCQkJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoYnVzeXEpKSAhPSBOVUxMKSB7CisJCQkJU2NzaV9DbW5kICpjbWQ7CisKKwkJCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKKwkJCQlUQUlMUV9SRU1PVkUoYnVzeXEsIGFjbWQsCisJCQkJCSAgICAgYWNtZF9saW5rcy50cWUpOworCQkJCWNvdW50Kys7CisJCQkJY21kLT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7CisJCQkJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gKGNvdW50KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF90aHJlYWRfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2xvbmcgZmxhZ3M7CisKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisJZGVsX3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1JVTl9DTVBMVF9RX1RJTUVSOworCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwkvKgorCSAqIEZyZWV6ZSB0aGUgc2ltcSBhbmQgc2lnbmFsIGFoZF9saW51eF9xdWV1ZSB0byBub3QgbGV0IGFueQorCSAqIG1vcmUgY29tbWFuZHMgdGhyb3VnaAorCSAqLworCWlmICgoYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIRF9EVl9BQ1RJVkUpID09IDApIHsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQorCQkJcHJpbnRmKCIlczogU3RhcnRpbmcgRFZcbiIsIGFoZF9uYW1lKGFoZCkpOworI2VuZGlmCisKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfQUNUSVZFOworCQlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKworCQkvKiBXYWtlIHVwIHRoZSBEViBrdGhyZWFkICovCisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJfQorfQorCitzdGF0aWMgaW50CithaGRfbGludXhfZHZfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCWludAl0YXJnZXQ7CisJdV9sb25nCXM7CisKKwlhaGQgPSAoc3RydWN0IGFoZF9zb2Z0YyAqKWRhdGE7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpCisJCXByaW50ZigiSW4gRFYgVGhyZWFkXG4iKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDb21wbGV0ZSB0aHJlYWQgY3JlYXRpb24uCisJICovCisJbG9ja19rZXJuZWwoKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjApCisJLyoKKwkgKiBEb24ndCBjYXJlIGFib3V0IGFueSBzaWduYWxzLgorCSAqLworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIDApOworCisJZGFlbW9uaXplKCk7CisJc3ByaW50ZihjdXJyZW50LT5jb21tLCAiYWhkX2R2XyVkIiwgYWhkLT51bml0KTsKKyNlbHNlCisJZGFlbW9uaXplKCJhaGRfZHZfJWQiLCBhaGQtPnVuaXQpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX0ZSRUVaRTsKKyNlbmRpZgorCXVubG9ja19rZXJuZWwoKTsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIFVzZSBkb3duX2ludGVycnVwdGlibGUoKSByYXRoZXIgdGhhbiBkb3duKCkgdG8KKwkJICogYXZvaWQgaW5jbHVzaW9uIGluIHRoZSBsb2FkIGF2ZXJhZ2UuCisJCSAqLworCQlkb3duX2ludGVycnVwdGlibGUoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKworCQkvKiBDaGVjayB0byBzZWUgaWYgd2UndmUgYmVlbiBzaWduYWxlZCB0byBleGl0ICovCisJCWFoZF9sb2NrKGFoZCwgJnMpOworCQlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfU0hVVERPV04pICE9IDApIHsKKwkJCWFoZF91bmxvY2soYWhkLCAmcyk7CisJCQlicmVhazsKKwkJfQorCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisjaWZkZWYgQUhEX0RFQlVHCisJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKKwkJCXByaW50ZigiJXM6IEJlZ2lubmluZyBEb21haW4gVmFsaWRhdGlvblxuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKyNlbmRpZgorCisJCS8qCisJCSAqIFdhaXQgZm9yIGFueSBwZW5kaW5nIGNvbW1hbmRzIHRvIGRyYWluIGJlZm9yZSBwcm9jZWVkaW5nLgorCQkgKi8KKwkJYWhkX2xvY2soYWhkLCAmcyk7CisJCXdoaWxlIChMSVNUX0ZJUlNUKCZhaGQtPnBlbmRpbmdfc2NicykgIT0gTlVMTCkgeworCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX0VNUFRZOworCQkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCQkJYWhkX2xvY2soYWhkLCAmcyk7CisJCX0KKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgU0lNUSB0byBiZSByZWxlYXNlZCBzbyB0aGF0IERWIGlzIHRoZQorCQkgKiBvbmx5IHJlYXNvbiB0aGUgcXVldWUgaXMgZnJvemVuLgorCQkgKi8KKwkJd2hpbGUgKEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpID09IDApIHsKKwkJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhEX0RWX1dBSVRfU0lNUV9SRUxFQVNFOworCQkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCQkJYWhkX2xvY2soYWhkLCAmcyk7CisJCX0KKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKworCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IEFIRF9OVU1fVEFSR0VUUzsgdGFyZ2V0KyspCisJCQlhaGRfbGludXhfZHZfdGFyZ2V0KGFoZCwgdGFyZ2V0KTsKKworCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX0RWX0FDVElWRTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKworCQkvKgorCQkgKiBSZWxlYXNlIHRoZSBTSU1RIHNvIHRoYXQgbm9ybWFsIGNvbW1hbmRzIGFyZQorCQkgKiBhbGxvd2VkIHRvIGNvbnRpbnVlIG9uIHRoZSBidXMuCisJCSAqLworCQlhaGRfcmVsZWFzZV9zaW1xKGFoZCk7CisJfQorCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9raWxsX2R2X3RocmVhZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdV9sb25nIHM7CisKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgIT0gMCkgeworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIRF9EVl9TSFVURE9XTjsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKworCQkvKgorCQkgKiBVc2UgdGhlIGVoX3NlbSBhcyBhbiBpbmRpY2F0b3IgdGhhdCB0aGUKKwkJICogZHYgdGhyZWFkIGlzIGV4aXRpbmcuICBOb3RlIHRoYXQgdGhlIGR2CisJCSAqIHRocmVhZCBtdXN0IHN0aWxsIHJldHVybiBhZnRlciBwZXJmb3JtaW5nCisJCSAqIHRoZSB1cCBvbiBvdXIgc2VtYXBob3JlIGJlZm9yZSBpdCBoYXMKKwkJICogY29tcGxldGVseSBleGl0ZWQgdGhpcyBtb2R1bGUuICBVbmZvcnR1bmF0ZWx5LAorCQkgKiB0aGVyZSBzZWVtcyB0byBiZSBubyBlYXN5IHdheSB0byB3YWl0IGZvciB0aGUKKwkJICogZXhpdCBvZiBhIHRocmVhZCBmb3Igd2hpY2ggeW91IGFyZSBub3QgdGhlCisJCSAqIHBhcmVudCAoZHYgdGhyZWFkcyBhcmUgcGFyZW50ZWQgYnkgaW5pdCkuCisJCSAqIENyb3NzIHlvdXIgZmluZ2Vycy4uLgorCQkgKi8KKwkJZG93bigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCisJCS8qCisJCSAqIE1hcmsgdGhlIGR2IHRocmVhZCBhcyBhbHJlYWR5IGRlYWQuICBUaGlzCisJCSAqIGF2b2lkcyBhdHRlbXB0aW5nIHRvIGtpbGwgaXQgYSBzZWNvbmQgdGltZS4KKwkJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtdXN0IGtpbGwgdGhlCisJCSAqIERWIHRocmVhZCBiZWZvcmUgY2FsbGluZyBhaGRfZnJlZSgpIGluIHRoZQorCQkgKiBtb2R1bGUgc2h1dGRvd24gY2FzZSB0byBhdm9pZCBib2d1cyBsb2NraW5nCisJCSAqIGluIHRoZSBTQ1NJIG1pZC1sYXllciwgYnV0IHdlIGFoZF9mcmVlKCkgaXMKKwkJICogY2FsbGVkIHdpdGhvdXQga2lsbGluZyB0aGUgRFYgdGhyZWFkIGluIHRoZQorCQkgKiBpbnN0YW5jZSBkZXRhY2ggY2FzZSwgc28gYWhkX3BsYXRmb3JtX2ZyZWUoKQorCQkgKiBjYWxscyB1cyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUgRFYgdGhyZWFkCisJCSAqIGlzIGRlYWQuCisJCSAqLworCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCA9IDA7CisJfSBlbHNlIHsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwl9Cit9CisKKyNkZWZpbmUgQUhEX0xJTlVYX0RWX0lOUV9TSE9SVF9MRU4JMzYKKyNkZWZpbmUgQUhEX0xJTlVYX0RWX0lOUV9MRU4JCTI1NgorI2RlZmluZSBBSERfTElOVVhfRFZfVElNRU9VVAkJKEhaIC8gNCkKKworI2RlZmluZSBBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgbmV3c3RhdGUpIFwKKwlhaGRfc2V0X2R2X3N0YXRlKGFoZCwgdGFyZywgbmV3c3RhdGUsIF9fTElORV9fKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3NldF9kdl9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkgYWhkX2R2X3N0YXRlIG5ld3N0YXRlLCB1X2ludCBsaW5lKQoreworCWFoZF9kdl9zdGF0ZSBvbGRzdGF0ZTsKKworCW9sZHN0YXRlID0gdGFyZy0+ZHZfc3RhdGU7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKQorCQlwcmludGYoIiVzOiVkOiBHb2luZyBmcm9tIHN0YXRlICVkIHRvIHN0YXRlICVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgbGluZSwgb2xkc3RhdGUsIG5ld3N0YXRlKTsKKyNlbmRpZgorCisJaWYgKG9sZHN0YXRlID09IG5ld3N0YXRlKQorCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSsrOworCWVsc2UKKwkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCXRhcmctPmR2X3N0YXRlID0gbmV3c3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZHZfdGFyZ2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGFyZ2V0X29mZnNldCkKK3sKKwlzdHJ1Y3QJIGFoZF9kZXZpbmZvIGRldmluZm87CisJc3RydWN0CSBhaGRfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdAkgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0CSBzY3NpX2RldmljZSAqc2NzaV9kZXY7CisJc3RydWN0CSBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlOworCXVpbnQ4X3QgKmJ1ZmZlcjsKKwl1X2xvbmcJIHM7CisJdV9pbnQJIHRpbWVvdXQ7CisJaW50CSBlY2hvX3NpemU7CisKKwlzZW5zZSA9IE5VTEw7CisJYnVmZmVyID0gTlVMTDsKKwllY2hvX3NpemUgPSAwOworCWFoZF9sb2NrKGFoZCwgJnMpOworCXRhcmcgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJaWYgKHRhcmcgPT0gTlVMTCB8fCAodGFyZy0+ZmxhZ3MgJiBBSERfRFZfUkVRVUlSRUQpID09IDApIHsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJcmV0dXJuOworCX0KKwlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZy0+dGFyZ2V0LCAvKmx1biovMCwKKwkJCSAgICB0YXJnLT5jaGFubmVsICsgJ0EnLCBST0xFX0lOSVRJQVRPUik7CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQlwcmludGYoIlBlcmZvcm1pbmcgRFZcbiIpOworCX0KKyNlbmRpZgorCisJYWhkX3VubG9jayhhaGQsICZzKTsKKworCWNtZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfY21uZCksIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJc2NzaV9kZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY3NpX2RldmljZSksIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJc2NzaV9kZXYtPmhvc3QgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3Q7CisJc2NzaV9kZXYtPmlkID0gZGV2aW5mby50YXJnZXQ7CisJc2NzaV9kZXYtPmx1biA9IGRldmluZm8ubHVuOworCXNjc2lfZGV2LT5jaGFubmVsID0gZGV2aW5mby5jaGFubmVsIC0gJ0EnOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgPSBzY3NpX2RldjsKKworCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKworCXdoaWxlICh0YXJnLT5kdl9zdGF0ZSAhPSBBSERfRFZfU1RBVEVfRVhJVCkgeworCQl0aW1lb3V0ID0gQUhEX0xJTlVYX0RWX1RJTUVPVVQ7CisJCXN3aXRjaCAodGFyZy0+ZHZfc3RhdGUpIHsKKwkJY2FzZSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DOgorCQljYXNlIEFIRF9EVl9TVEFURV9JTlFfQVNZTkM6CisJCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlk6CisJCQkvKgorCQkJICogU2V0IHRoaW5ncyB0byBhc3luYyBuYXJyb3cgdG8gcmVkdWNlIHRoZQorCQkJICogY2hhbmNlIHRoYXQgdGhlIElOUSB3aWxsIGZhaWwuCisJCQkgKi8KKwkJCWFoZF9sb2NrKGFoZCwgJnMpOworCQkJYWhkX3NldF9zeW5jcmF0ZShhaGQsICZkZXZpbmZvLCAwLCAwLCAwLAorCQkJCQkgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJCQlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQkJdGltZW91dCA9IDEwICogSFo7CisJCQl0YXJnLT5mbGFncyAmPSB+QUhEX0lOUV9WQUxJRDsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlk6CisJCXsKKwkJCXVfaW50IGlucV9sZW47CisKKwkJCWlmICh0YXJnLT5kdl9zdGF0ZSA9PSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKQorCQkJCWlucV9sZW4gPSBBSERfTElOVVhfRFZfSU5RX1NIT1JUX0xFTjsKKwkJCWVsc2UKKwkJCQlpbnFfbGVuID0gdGFyZy0+aW5xX2RhdGEtPmFkZGl0aW9uYWxfbGVuZ3RoICsgNTsKKwkJCWFoZF9saW51eF9kdl9pbnEoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnLCBpbnFfbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQUhEX0RWX1NUQVRFX1RVUjoKKwkJY2FzZSBBSERfRFZfU1RBVEVfQlVTWToKKwkJCXRpbWVvdXQgPSA1ICogSFo7CisJCQlhaGRfbGludXhfZHZfdHVyKGFoZCwgY21kLCAmZGV2aW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBBSERfRFZfU1RBVEVfUkVCRDoKKwkJCWFoZF9saW51eF9kdl9yZWJkKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBBSERfRFZfU1RBVEVfV0VCOgorCQkJYWhkX2xpbnV4X2R2X3dlYihhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBSERfRFZfU1RBVEVfUkVCOgorCQkJYWhkX2xpbnV4X2R2X3JlYihhaGQsIGNtZCwgJmRldmluZm8sIHRhcmcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBSERfRFZfU1RBVEVfU1U6CisJCQlhaGRfbGludXhfZHZfc3UoYWhkLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKKwkJCXRpbWVvdXQgPSA1MCAqIEhaOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgJmRldmluZm8pOworCQkJcHJpbnRmKCJVbmtub3duIERWIHN0YXRlICVkXG4iLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFF1ZXVlIHRoZSBjb21tYW5kIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLworCQkvKiBBYnVzZSBlaF90aW1lb3V0IGluIHRoZSBzY3NpX2NtbmQgc3RydWN0IGZvciBvdXIgcHVycG9zZXMgKi8KKwkJaW5pdF90aW1lcigmY21kLT5laF90aW1lb3V0KTsKKyNpZmRlZiBBSERfREVCVUcKKwkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCS8qCisJCQkgKiBBbGwgb2YgdGhlIHByaW50ZnMgZHVyaW5nIG5lZ290aWF0aW9uCisJCQkgKiByZWFsbHkgc2xvdyBkb3duIHRoZSBuZWdvdGlhdGlvbi4KKwkJCSAqIEFkZCBhIGJpdCBvZiB0aW1lIGp1c3QgdG8gYmUgc2FmZS4KKwkJCSAqLworCQkJdGltZW91dCArPSBIWjsKKyNlbmRpZgorCQlzY3NpX2FkZF90aW1lcihjbWQsIHRpbWVvdXQsIGFoZF9saW51eF9kdl90aW1lb3V0KTsKKwkJLyoKKwkJICogSW4gMi41LlgsIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgY2FsbHMgZnJvbSB0aGUKKwkJICogIm1pZGxheWVyIiAod2hpY2ggd2UgYXJlIGVtdWxhdGluZykgd2lsbCBoYXZlIHRoZQorCQkgKiBhaGQgaG9zdCBsb2NrIGhlbGQuICBGb3Igb3RoZXIga2VybmVscywgdGhlCisJCSAqIGlvX3JlcXVlc3RfbG9jayBtdXN0IGJlIGhlbGQuCisJCSAqLworI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAorCQlhaGRfbG9jayhhaGQsICZzKTsKKyNlbHNlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssIHMpOworI2VuZGlmCisJCWFoZF9saW51eF9xdWV1ZShjbWQsIGFoZF9saW51eF9kdl9jb21wbGV0ZSk7CisjaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCisJCWFoZF91bmxvY2soYWhkLCAmcyk7CisjZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb19yZXF1ZXN0X2xvY2ssIHMpOworI2VuZGlmCisJCWRvd25faW50ZXJydXB0aWJsZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKKwkJLyoKKwkJICogV2FpdCBmb3IgdGhlIFNJTVEgdG8gYmUgcmVsZWFzZWQgc28gdGhhdCBEViBpcyB0aGUKKwkJICogb25seSByZWFzb24gdGhlIHF1ZXVlIGlzIGZyb3plbi4KKwkJICovCisJCWFoZF9sb2NrKGFoZCwgJnMpOworCQl3aGlsZSAoQUhEX0RWX1NJTVFfRlJPWkVOKGFoZCkgPT0gMCkgeworCQkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0U7CisJCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJCQlhaGRfbG9jayhhaGQsICZzKTsKKwkJfQorCQlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisJCWFoZF9saW51eF9kdl90cmFuc2l0aW9uKGFoZCwgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJfQorCitvdXQ6CisJaWYgKCh0YXJnLT5mbGFncyAmIEFIRF9JTlFfVkFMSUQpICE9IDAKKwkgJiYgYWhkX2xpbnV4X2dldF9kZXZpY2UoYWhkLCBkZXZpbmZvLmNoYW5uZWwgLSAnQScsCisJCQkJIGRldmluZm8udGFyZ2V0LCBkZXZpbmZvLmx1biwKKwkJCQkgLyphbGxvYyovRkFMU0UpID09IE5VTEwpIHsKKwkJLyoKKwkJICogVGhlIERWIHN0YXRlIG1hY2hpbmUgZmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGlzIGRldmljZS4gIAorCQkgKiBUaGlzIGlzIG5vcm1hbCBpZiBEViBpcyBkaXNhYmxlZC4gIFNpbmNlIHdlIGhhdmUgaW5xdWlyeQorCQkgKiBkYXRhLCBmaWx0ZXIgaXQgYW5kIHVzZSB0aGUgIm9wdGltaXN0aWMiIG5lZ290aWF0aW9uCisJCSAqIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIGlucXVpcnkgc3RyaW5nLgorCQkgKi8KKwkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgJmRldmluZm8pOworCQlpZiAoKHRhcmctPmZsYWdzICYgKEFIRF9CQVNJQ19EVnxBSERfRU5IQU5DRURfRFYpKSAhPSAwKSB7CisJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsICZkZXZpbmZvKTsKKwkJCXByaW50ZigiRFYgZmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXZpY2UuICAiCisJCQkgICAgICAgIlBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBhZ2FpbnN0ICIKKwkJCSAgICAgICAidGhpcyBkcml2ZXIuXG4iKTsKKwkJfQorCX0KKworCWlmIChjbWQgIT0gTlVMTCkKKwkJZnJlZShjbWQsIE1fREVWQlVGKTsKKworCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2ICE9IE5VTEwpIHsKKwkJZnJlZShhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2LCBNX0RFVkJVRik7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgPSBOVUxMOworCX0KKworCWFoZF9sb2NrKGFoZCwgJnMpOworCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkgeworCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCQl0YXJnLT5kdl9idWZmZXIgPSBOVUxMOworCX0KKwlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKSB7CisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCQl0YXJnLT5kdl9idWZmZXIxID0gTlVMTDsKKwl9CisJdGFyZy0+ZmxhZ3MgJj0gfkFIRF9EVl9SRVFVSVJFRDsKKwlpZiAodGFyZy0+cmVmY291bnQgPT0gMCkKKwkJYWhkX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoZCwgdGFyZyk7CisJYWhkX3VubG9jayhhaGQsICZzKTsKK30KKworc3RhdGljIF9faW5saW5lIGludAorYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCXVfbG9uZyBzOworCWludCByZXR2YWw7CisKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlyZXR2YWwgPSBhaGRfbGludXhfZmFsbGJhY2soYWhkLCBkZXZpbmZvKTsKKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQlzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sCisJCQlzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKwl1X2ludDMyX3Qgc3RhdHVzOworCisJc3RhdHVzID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIHRhcmctPmlucV9kYXRhLAorCQkJCSAgYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCksCisJCQkJICBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpKTsKKworCQorI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQlwcmludGYoIkVudGVyaW5nIGFoZF9saW51eF9kdl90cmFuc2l0aW9uLCBzdGF0ZT0gJWQsICIKKwkJICAgICAgICJzdGF0dXM9IDB4JXgsIGNtZC0+cmVzdWx0PSAweCV4XG4iLCB0YXJnLT5kdl9zdGF0ZSwKKwkJICAgICAgIHN0YXR1cywgY21kLT5yZXN1bHQpOworCX0KKyNlbmRpZgorCisJc3dpdGNoICh0YXJnLT5kdl9zdGF0ZSkgeworCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQzoKKwljYXNlIEFIRF9EVl9TVEFURV9JTlFfQVNZTkM6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJeworCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKzEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19UVVI6CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQorCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQorCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlk6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJeworCQkJdV9pbnQgeHBvcnRmbGFnczsKKwkJCXVfaW50IHNwaTNkYXRhOworCisJCQlpZiAobWVtY21wKHRhcmctPmlucV9kYXRhLCB0YXJnLT5kdl9idWZmZXIsCisJCQkJICAgQUhEX0xJTlVYX0RWX0lOUV9MRU4pICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIElucXVpcnkgZGF0YSBtdXN0IGhhdmUgY2hhbmdlZC4KKwkJCQkgKiBUcnkgZnJvbSB0aGUgdG9wIGFnYWluLgorCQkJCSAqLworCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUrMSk7CisJCQl0YXJnLT5mbGFncyB8PSBBSERfSU5RX1ZBTElEOworCQkJaWYgKGFoZF9saW51eF91c2VyX2R2X3NldHRpbmcoYWhkKSA9PSAwKQorCQkJCWJyZWFrOworCisJCQl4cG9ydGZsYWdzID0gdGFyZy0+aW5xX2RhdGEtPmZsYWdzOworCQkJaWYgKCh4cG9ydGZsYWdzICYgKFNJRF9TeW5jfFNJRF9XQnVzMTYpKSA9PSAwKQorCQkJCWJyZWFrOworCisJCQlzcGkzZGF0YSA9IHRhcmctPmlucV9kYXRhLT5zcGkzZGF0YTsKKwkJCXN3aXRjaCAoc3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUX1NUKSB7CisJCQlkZWZhdWx0OgorCQkJY2FzZSBTSURfU1BJX0NMT0NLX1NUOgorCQkJCS8qIEFzc3VtZSBvbmx5IGJhc2ljIERWIGlzIHN1cHBvcnRlZC4gKi8KKwkJCQl0YXJnLT5mbGFncyB8PSBBSERfQkFTSUNfRFY7CisJCQkJYnJlYWs7CisJCQljYXNlIFNJRF9TUElfQ0xPQ0tfRFQ6CisJCQljYXNlIFNJRF9TUElfQ0xPQ0tfRFRfU1Q6CisJCQkJdGFyZy0+ZmxhZ3MgfD0gQUhEX0VOSEFOQ0VEX0RWOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19UVVI6CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQorCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisKKwkJCWlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9CVVNZKTsKKwkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQorCQkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBSERfRFZfU1RBVEVfSU5RX1ZFUklGWToKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQl7CisKKwkJCWlmIChtZW1jbXAodGFyZy0+aW5xX2RhdGEsIHRhcmctPmR2X2J1ZmZlciwKKwkJCQkgICBBSERfTElOVVhfRFZfSU5RX0xFTikgPT0gMCkgeworCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQkJCWludCBpOworCisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIklucXVpcnkgYnVmZmVyIG1pc21hdGNoOiIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBBSERfTElOVVhfRFZfSU5RX0xFTjsgaSsrKSB7CisJCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKKwkJCQkJCXByaW50ZigiXG4gICAgICAgICIpOworCQkJCQlwcmludGYoIjB4JXg6MHgwJXggIiwKKwkJCQkJICAgICAgICgodWludDhfdCAqKXRhcmctPmlucV9kYXRhKVtpXSwgCisJCQkJCSAgICAgICB0YXJnLT5kdl9idWZmZXJbaV0pOworCQkJCX0KKwkJCQlwcmludGYoIlxuIik7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgorCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KKwkJCSAqLworCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKKwkJCQkJIEFIRF9EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKwkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgeworCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKKwkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBEbyBub3QgY291bnQgImZhbGxpbmcgYmFjayIKKwkJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgorCQkJCSAqLworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5ID0gMDsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQorCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfVFVSOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCQlpZiAoKHRhcmctPmZsYWdzICYgQUhEX0JBU0lDX0RWKSAhPSAwKSB7CisJCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7CisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlkpOworCQkJfSBlbHNlIGlmICgodGFyZy0+ZmxhZ3MgJiBBSERfRU5IQU5DRURfRFYpICE9IDApIHsKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1JFQkQpOworCQkJfSBlbHNlIHsKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1NfUkVUUlk6CisJCWNhc2UgU1NfVFVSOgorCQkJaWYgKChzdGF0dXMgJiBTU19FUlJNQVNLKSA9PSBFQlVTWSkgeworCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfQlVTWSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgeworCQkJCWlmIChhaGRfbGludXhfZHZfZmFsbGJhY2soYWhkLCBkZXZpbmZvKSAhPSAwKSB7CisJCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkJCSBBSERfRFZfU1RBVEVfRVhJVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgorCQkJCSAqIGFnYWluc3Qgb3VyIHJldHJpZXMuCisJCQkJICovCisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCQkJfQorCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5ID49IDEwKSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJCXByaW50ZigiRFYgVFVSIHJldGllcyBleGhhdXN0ZWRcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgU1NRX0RFTEFZKQorCQkJCXNzbGVlcCgxKTsKKworCQkJYnJlYWs7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1NVKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfUkVCRDoKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQl7CisJCQl1aW50MzJfdCBlY2hvX3NpemU7CisKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfV0VCKTsKKwkJCWVjaG9fc2l6ZSA9IHNjc2lfM2J0b3VsKCZ0YXJnLT5kdl9idWZmZXJbMV0pOworCQkJZWNob19zaXplICY9IDB4MUZGRjsKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJcHJpbnRmKCJFY2hvIGJ1ZmZlciBzaXplPSAlZFxuIiwgZWNob19zaXplKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGVjaG9fc2l6ZSA9PSAwKSB7CisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogR2VuZXJhdGUgdGhlIGJ1ZmZlciBwYXR0ZXJuICovCisJCQl0YXJnLT5kdl9lY2hvX3NpemUgPSBlY2hvX3NpemU7CisJCQlhaGRfbGludXhfZ2VuZXJhdGVfZHZfcGF0dGVybih0YXJnKTsKKwkJCS8qCisJCQkgKiBTZXR1cCBpbml0aWFsIG5lZ290aWF0aW9uIHZhbHVlcy4KKwkJCSAqLworCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1JFVFJZOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDw9IDEwKQorCQkJCWJyZWFrOworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkRWIFJFQkQgcmV0aWVzIGV4aGF1c3RlZFxuIik7CisJCQl9CisjZW5kaWYKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgU1NfRkFUQUw6CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogU2V0dXAgaW5pdGlhbCBuZWdvdGlhdGlvbiB2YWx1ZXMKKwkJCSAqIGFuZCB0cnkgbGV2ZWwgMSBEVi4KKwkJCSAqLworCQkJYWhkX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KGFoZCwgZGV2aW5mbyk7CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0lOUV9WRVJJRlkpOworCQkJdGFyZy0+ZHZfZWNob19zaXplID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfV0VCOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX1JFQik7CisJCQlicmVhazsKKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkgQUhEX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19SRVRSWToKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKKwkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7CisJCQkJaWYgKGFoZF9saW51eF9kdl9mYWxsYmFjayhhaGQsIGRldmluZm8pICE9IDApIHsKKwkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCisJCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KKwkJCQkgKi8KKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkRWIFdFQiByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCX0KKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfUkVCOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCQlpZiAobWVtY21wKHRhcmctPmR2X2J1ZmZlciwgdGFyZy0+ZHZfYnVmZmVyMSwKKwkJCQkgICB0YXJnLT5kdl9lY2hvX3NpemUpICE9IDApIHsKKwkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkKKwkJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCQkJIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCQllbHNlCisJCQkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLAorCQkJCQkJCSBBSERfRFZfU1RBVEVfV0VCKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKSB7CisJCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwkJCQl0YXJnLT5kdl9idWZmZXIgPSBOVUxMOworCQkJfQorCQkJaWYgKHRhcmctPmR2X2J1ZmZlcjEgIT0gTlVMTCkgeworCQkJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCQkJCXRhcmctPmR2X2J1ZmZlcjEgPSBOVUxMOworCQkJfQorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1JFVFJZOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKwkJCQlpZiAoYWhkX2xpbnV4X2R2X2ZhbGxiYWNrKGFoZCwgZGV2aW5mbykgIT0gMCkgeworCQkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywKKwkJCQkJCQkgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9XRUIpOworCQkJfQorCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDw9IDEwKSB7CisJCQkJaWYgKChzdGF0dXMgJiAoU1NRX0RFTEFZX1JBTkRPTXxTU1FfREVMQVkpKSE9IDApCisJCQkJCW1zbGVlcChhaGQtPm91cl9pZCoxMDAwLzEwKTsKKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJcHJpbnRmKCJEViBSRUIgcmV0aWVzIGV4aGF1c3RlZFxuIik7CisJCQl9CisjZW5kaWYKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIRF9EVl9TVEFURV9TVToKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsIEFIRF9EVl9TVEFURV9FWElUKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBSERfRFZfU1RBVEVfQlVTWToKKwkJc3dpdGNoIChzdGF0dXMgJiBTU19NQVNLKSB7CisJCWNhc2UgU1NfTk9QOgorCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhEX1NFVF9EVl9TVEFURShhaGQsIHRhcmcsCisJCQkJCSBBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1RVUjoKKwkJY2FzZSBTU19SRVRSWToKKwkJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlpZiAoYWhkX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKKwkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJfSBlbHNlIGlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDYwKSB7CisJCQkJaWYgKChzdGF0dXMgJiBTU1FfREVMQVkpICE9IDApCisJCQkJCXNzbGVlcCgxKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgQUhEX0RFQlVHCisJCQkJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCQkJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCQkJCXByaW50ZigiRFYgQlVTWSByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBSERfU0VUX0RWX1NUQVRFKGFoZCwgdGFyZywgQUhEX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzOiBJbnZhbGlkIERWIGNvbXBsZXRpb24gc3RhdGUgJWRcbiIsIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICB0YXJnLT5kdl9zdGF0ZSk7CisJCUFIRF9TRVRfRFZfU1RBVEUoYWhkLCB0YXJnLCBBSERfRFZfU1RBVEVfRVhJVCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kdl9maWxsX2NtZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJICAgICAgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvKQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSk7CisJY21kLT5kZXZpY2UgPSBhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3Njc2lfZGV2OworCWNtZC0+c2NzaV9kb25lID0gYWhkX2xpbnV4X2R2X2NvbXBsZXRlOworfQorCisvKgorICogU3ludGhlc2l6ZSBhbiBpbnF1aXJ5IGNvbW1hbmQuICBPbiB0aGUgcmV0dXJuIHRyaXAsIGl0J2xsIGJlCisgKiBzbmlmZmVkIGFuZCB0aGUgZGV2aWNlIHRyYW5zZmVyIHNldHRpbmdzIHNldCBmb3IgdXMuCisgKi8KK3N0YXRpYyB2b2lkCithaGRfbGludXhfZHZfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCAqdGFyZywKKwkJIHVfaW50IHJlcXVlc3RfbGVuZ3RoKQoreworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBJTlFcbiIpOworCX0KKyNlbmRpZgorCWlmICh0YXJnLT5pbnFfZGF0YSA9PSBOVUxMKQorCQl0YXJnLT5pbnFfZGF0YSA9IG1hbGxvYyhBSERfTElOVVhfRFZfSU5RX0xFTiwKKwkJCQkJTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlpZiAodGFyZy0+ZHZfc3RhdGUgPiBBSERfRFZfU1RBVEVfSU5RX0FTWU5DKSB7CisJCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKKwkJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJCXRhcmctPmR2X2J1ZmZlciA9IG1hbGxvYyhBSERfTElOVVhfRFZfSU5RX0xFTiwKKwkJCQkJIE1fREVWQlVGLCBNX1dBSVRPSyk7CisJfQorCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1JFQUQ7CisJY21kLT5jbWRfbGVuID0gNjsKKwljbWQtPmNtbmRbMF0gPSBJTlFVSVJZOworCWNtZC0+Y21uZFs0XSA9IHJlcXVlc3RfbGVuZ3RoOworCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gcmVxdWVzdF9sZW5ndGg7CisJaWYgKHRhcmctPmR2X3N0YXRlID4gQUhEX0RWX1NUQVRFX0lOUV9BU1lOQykKKwkJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjsKKwllbHNlCisJCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5pbnFfZGF0YTsKKwltZW1zZXQoY21kLT5yZXF1ZXN0X2J1ZmZlciwgMCwgQUhEX0xJTlVYX0RWX0lOUV9MRU4pOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3R1cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQlwcmludGYoIlNlbmRpbmcgVFVSXG4iKTsKKwl9CisjZW5kaWYKKwkvKiBEbyBhIFRVUiB0byBjbGVhciBvdXQgYW55IG5vbi1mYXRhbCB0cmFuc2l0aW9uYWwgc3RhdGUgKi8KKwlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfTk9ORTsKKwljbWQtPmNtZF9sZW4gPSA2OworCWNtZC0+Y21uZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKK30KKworI2RlZmluZSBBSERfUkVCRF9MRU4gNAorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCSBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBSRUJEXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKEFIRF9SRUJEX0xFTiwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlhaGRfbGludXhfZHZfZmlsbF9jbWQoYWhkLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwljbWQtPmNtZF9sZW4gPSAxMDsKKwljbWQtPmNtbmRbMF0gPSBSRUFEX0JVRkZFUjsKKwljbWQtPmNtbmRbMV0gPSAweDBiOworCXNjc2lfdWx0bzNiKEFIRF9SRUJEX0xFTiwgJmNtZC0+Y21uZFs2XSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSBBSERfUkVCRF9MRU47CisJY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCit7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFdFQlxuIik7CisJfQorI2VuZGlmCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1dSSVRFOworCWNtZC0+Y21kX2xlbiA9IDEwOworCWNtZC0+Y21uZFswXSA9IFdSSVRFX0JVRkZFUjsKKwljbWQtPmNtbmRbMV0gPSAweDBhOworCXNjc2lfdWx0bzNiKHRhcmctPmR2X2VjaG9fc2l6ZSwgJmNtZC0+Y21uZFs2XSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSB0YXJnLT5kdl9lY2hvX3NpemU7CisJY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2R2X3JlYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCit7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFJFQlxuIik7CisJfQorI2VuZGlmCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1JFQUQ7CisJY21kLT5jbWRfbGVuID0gMTA7CisJY21kLT5jbW5kWzBdID0gUkVBRF9CVUZGRVI7CisJY21kLT5jbW5kWzFdID0gMHgwYTsKKwlzY3NpX3VsdG8zYih0YXJnLT5kdl9lY2hvX3NpemUsICZjbWQtPmNtbmRbNl0pOworCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gdGFyZy0+ZHZfZWNob19zaXplOworCWNtZC0+dW5kZXJmbG93ID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmR2X2J1ZmZlcjE7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZHZfc3Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKKwkJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmcpCit7CisJdV9pbnQgbGU7CisKKwlsZSA9IFNJRF9JU19SRU1PVkFCTEUodGFyZy0+aW5xX2RhdGEpID8gU1NTX0xPRUogOiAwOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX0RWKSB7CisJCWFoZF9wcmludF9kZXZpbmZvKGFoZCwgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBTVVxuIik7CisJfQorI2VuZGlmCisJYWhkX2xpbnV4X2R2X2ZpbGxfY21kKGFoZCwgY21kLCBkZXZpbmZvKTsKKwljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX05PTkU7CisJY21kLT5jbWRfbGVuID0gNjsKKwljbWQtPmNtbmRbMF0gPSBTVEFSVF9TVE9QX1VOSVQ7CisJY21kLT5jbW5kWzRdID0gbGUgfCBTU1NfU1RBUlQ7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdHJ1Y3QJYWhkX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QJYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoZF90cmFuc2luZm8gKmdvYWw7CisJc3RydWN0CWFoZF90bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAl3aWR0aDsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJb2Zmc2V0OworCXVfaW50CXBwcl9vcHRpb25zOworCXVfaW50CWN1cl9zcGVlZDsKKwl1X2ludAl3aWRlX3NwZWVkOworCXVfaW50CW5hcnJvd19zcGVlZDsKKwl1X2ludAlmYWxsYmFja19zcGVlZDsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikgeworCQlhaGRfcHJpbnRfZGV2aW5mbyhhaGQsIGRldmluZm8pOworCQlwcmludGYoIlRyeWluZyB0byBmYWxsYmFja1xuIik7CisJfQorI2VuZGlmCisJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1tkZXZpbmZvLT50YXJnZXRfb2Zmc2V0XTsKKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCWdvYWwgPSAmdGluZm8tPmdvYWw7CisJd2lkdGggPSBnb2FsLT53aWR0aDsKKwlwZXJpb2QgPSBnb2FsLT5wZXJpb2Q7CisJb2Zmc2V0ID0gZ29hbC0+b2Zmc2V0OworCXBwcl9vcHRpb25zID0gZ29hbC0+cHByX29wdGlvbnM7CisJaWYgKG9mZnNldCA9PSAwKQorCQlwZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJaWYgKHRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9PSAwKQorCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBNQVgocGVyaW9kLCBBSERfU1lOQ1JBVEVfVUxUUkEyKTsKKwlpZiAodGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9PSAwKQorCQl0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID0gcGVyaW9kOworCWlmICh0YXJnLT5kdl9tYXhfd2lkdGggPT0gMCkKKwkJdGFyZy0+ZHZfbWF4X3dpZHRoID0gd2lkdGg7CisJaWYgKHRhcmctPmR2X21heF9wcHJfb3B0aW9ucyA9PSAwKQorCQl0YXJnLT5kdl9tYXhfcHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKwlpZiAodGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyA9PSAwKQorCQl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CisKKwljdXJfc3BlZWQgPSBhaWNfY2FsY19zcGVlZCh3aWR0aCwgcGVyaW9kLCBvZmZzZXQsIEFIRF9TWU5DUkFURV9NSU4pOworCXdpZGVfc3BlZWQgPSBhaWNfY2FsY19zcGVlZChNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCwKKwkJCQkJICB0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kLAorCQkJCQkgIE1BWF9PRkZTRVQsIEFIRF9TWU5DUkFURV9NSU4pOworCW5hcnJvd19zcGVlZCA9IGFpY19jYWxjX3NwZWVkKE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJCSAgICB0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QsCisJCQkJCSAgICBNQVhfT0ZGU0VULCBBSERfU1lOQ1JBVEVfTUlOKTsKKwlmYWxsYmFja19zcGVlZCA9IGFpY19jYWxjX3NwZWVkKHdpZHRoLCBwZXJpb2QrMSwgb2Zmc2V0LAorCQkJCQkgICAgICBBSERfU1lOQ1JBVEVfTUlOKTsKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJcHJpbnRmKCJjdXJfc3BlZWQ9ICVkLCB3aWRlX3NwZWVkPSAlZCwgbmFycm93X3NwZWVkPSAlZCwgIgorCQkgICAgICAgImZhbGxiYWNrX3NwZWVkPSAlZFxuIiwgY3VyX3NwZWVkLCB3aWRlX3NwZWVkLAorCQkgICAgICAgbmFycm93X3NwZWVkLCBmYWxsYmFja19zcGVlZCk7CisJfQorI2VuZGlmCisKKwlpZiAoY3VyX3NwZWVkID4gMTYwMDAwKSB7CisJCS8qCisJCSAqIFBhY2VkL0RUL0lVX1JFUSBvbmx5IHRyYW5zZmVyIHNwZWVkcy4gIEFsbCB3ZQorCQkgKiBjYW4gZG8gaXMgZmFsbGJhY2sgaW4gdGVybXMgb2Ygc3luY3JhdGUuCisJCSAqLworCQlwZXJpb2QrKzsKKwl9IGVsc2UgaWYgKGN1cl9zcGVlZCA+IDgwMDAwKSB7CisJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUcnkgd2l0aG91dCBJVV9SRVEgYXMgaXQgbWF5IGJlIGNvbmZ1c2luZworCQkJICogYW4gZXhwYW5kZXIuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9JVV9SRVE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUGFjZWQvRFQgb25seSB0cmFuc2ZlciBzcGVlZHMuICBBbGwgd2UKKwkJCSAqIGNhbiBkbyBpcyBmYWxsYmFjayBpbiB0ZXJtcyBvZiBzeW5jcmF0ZS4KKwkJCSAqLworCQkJcGVyaW9kKys7CisJCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKKwkJfQorCX0gZWxzZSBpZiAoY3VyX3NwZWVkID4gMzMwMCkgeworCisJCS8qCisJCSAqIEluIHRoaXMgcmFuZ2Ugd2UgdGhlIGZvbGxvd2luZworCQkgKiBvcHRpb25zIG9yZGVyZWQgZnJvbSBoaWdoZXN0IHRvCisJCSAqIGxvd2VzdCBkZXNpcmVhYmlsaXR5OgorCQkgKgorCQkgKiBvIFdpZGUvRFQKKwkJICogbyBXaWRlL25vbi1EVAorCQkgKiBvIE5hcnJvdyBhdCBhIHBvdGVudGFsbHkgaGlnaGVyIHN5bmMgcmF0ZS4KKwkJICoKKwkJICogQWxsIG1vZGVzIGFyZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBJVV9SRVEKKwkJICogc2V0IHNpbmNlIHVzaW5nIElVcyBtYXkgY29uZnVzZSBhbiBleHBhbmRlci4KKwkJICovCisJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKworCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0lVX1JFUTsKKwkJfSBlbHNlIGlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUcnkgZ29pbmcgbm9uLURULgorCQkJICovCisJCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKKwkJCXBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CisJCX0gZWxzZSBpZiAodGFyZy0+ZHZfbGFzdF9wcHJfb3B0aW9ucyAhPSAwKSB7CisJCQkvKgorCQkJICogVHJ5IHdpdGhvdXQgUUFTIG9yIGFueSBvdGhlciBQUFIgb3B0aW9ucy4KKwkJCSAqIFdlIG1heSBuZWVkIGEgbm9uLVBQUiBtZXNzYWdlIHRvIHdvcmsgd2l0aAorCQkJICogYW4gZXhwYW5kZXIuICBXZSBsb29rIGF0IHRoZSAibGFzdCBQUFIgb3B0aW9ucyIKKwkJCSAqIHNvIHdlIHdpbGwgcGVyZm9ybSB0aGlzIGZhbGxiYWNrIGV2ZW4gaWYgdGhlCisJCQkgKiB0YXJnZXQgcmVzcG9uZGVkIHRvIG91ciBQUFIgbmVnb3RpYXRpb24gd2l0aAorCQkJICogbm8gb3B0aW9uIGJpdHMgc2V0LgorCQkJICovCisJCQlwcHJfb3B0aW9ucyA9IDA7CisJCX0gZWxzZSBpZiAod2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgbmV4dCBuYXJyb3cgc3BlZWQgaXMgZ3JlYXRlciB0aGFuCisJCQkgKiB0aGUgbmV4dCB3aWRlIHNwZWVkLCBmYWxsYmFjayB0byBuYXJyb3cuCisJCQkgKiBPdGhlcndpc2UgZmFsbGJhY2sgdG8gdGhlIG5leHQgRFQvV2lkZSBzZXR0aW5nLgorCQkJICogVGhlIG5hcnJvdyBhc3luYyBzcGVlZCB3aWxsIGFsd2F5cyBiZSBzbWFsbGVyCisJCQkgKiB0aGFuIHRoZSB3aWRlIGFzeW5jIHNwZWVkLCBzbyBoYW5kbGUgdGhpcyBjYXNlCisJCQkgKiBzcGVjaWZpY2FsbHkuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQkJaWYgKG5hcnJvd19zcGVlZCA+IGZhbGxiYWNrX3NwZWVkCisJCQkgfHwgcGVyaW9kID49IEFIRF9BU1lOQ19YRkVSX1BFUklPRCkgeworCQkJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBwZXJpb2QrMTsKKwkJCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisJCQkJcGVyaW9kID0gdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kOworCQkJfSBlbHNlIHsKKwkJCQlwZXJpb2QrKzsKKwkJCX0KKwkJfSBlbHNlIGlmICgoYWhkLT5mZWF0dXJlcyAmIEFIRF9XSURFKSAhPSAwCisJCQkmJiB0YXJnLT5kdl9tYXhfd2lkdGggIT0gMAorCQkJJiYgd2lkZV9zcGVlZCA+PSBmYWxsYmFja19zcGVlZAorCQkJJiYgKHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPD0gQUhEX0FTWU5DX1hGRVJfUEVSSU9ECisJCQkgfHwgcGVyaW9kID49IEFIRF9BU1lOQ19YRkVSX1BFUklPRCkpIHsKKworCQkJLyoKKwkJCSAqIFdlIGFyZSBuYXJyb3cuICBUcnkgZmFsbGluZyBiYWNrCisJCQkgKiB0byB0aGUgbmV4dCB3aWRlIHNwZWVkIHdpdGggCisJCQkgKiBhbGwgc3VwcG9ydGVkIHBwciBvcHRpb25zIHNldC4KKwkJCSAqLworCQkJdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID0gcGVyaW9kKzE7CisJCQl3aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworCQkJcGVyaW9kID0gdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZDsKKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQl9IGVsc2UgeworCQkJLyogT25seSBuYXJyb3cgZmFsbGJhY2sgaXMgYWxsb3dlZC4gKi8KKwkJCXBlcmlvZCsrOworCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJb2Zmc2V0ID0gTUFYX09GRlNFVDsKKwlhaGRfZmluZF9zeW5jcmF0ZShhaGQsICZwZXJpb2QsICZwcHJfb3B0aW9ucywgQUhEX1NZTkNSQVRFX1BBQ0VEKTsKKwlhaGRfc2V0X3dpZHRoKGFoZCwgZGV2aW5mbywgd2lkdGgsIEFIRF9UUkFOU19HT0FMLCBGQUxTRSk7CisJaWYgKHBlcmlvZCA9PSAwKSB7CisJCXBlcmlvZCA9IDA7CisJCW9mZnNldCA9IDA7CisJCXBwcl9vcHRpb25zID0gMDsKKwkJaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQpCisJCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJCWVsc2UKKwkJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBBSERfQVNZTkNfWEZFUl9QRVJJT0Q7CisJfQorCWFoZF9zZXRfc3luY3JhdGUoYWhkLCBkZXZpbmZvLCBwZXJpb2QsIG9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhEX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kdl90aW1lb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CXNjYiAqc2NiOworCXVfbG9uZwlmbGFnczsKKworCWFoZCA9ICooKHN0cnVjdCBhaGRfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKTsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7CisKKyNpZmRlZiBBSERfREVCVUcKKwlpZiAoYWhkX2RlYnVnICYgQUhEX1NIT1dfRFYpIHsKKwkJcHJpbnRmKCIlczogVGltZW91dCB3aGlsZSBkb2luZyBEViBjb21tYW5kICV4LlxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+Y21uZFswXSk7CisJCWFoZF9kdW1wX2NhcmRfc3RhdGUoYWhkKTsKKwl9CisjZW5kaWYKKwkKKwkvKgorCSAqIEd1YXJkIGFnYWluc3QgImRvbmUgcmFjZSIuICBObyBhY3Rpb24gaXMKKwkgKiByZXF1aXJlZCBpZiB3ZSBqdXN0IGNvbXBsZXRlZC4KKwkgKi8KKwlpZiAoKHNjYiA9IChzdHJ1Y3Qgc2NiICopY21kLT5ob3N0X3NjcmliYmxlKSA9PSBOVUxMKSB7CisJCWFoZF91bmxvY2soYWhkLCAmZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDb21tYW5kIGhhcyBub3QgY29tcGxldGVkLiAgTWFyayB0aGlzCisJICogU0NCIGFzIGhhdmluZyBmYWlsaW5nIHN0YXR1cyBwcmlvciB0bworCSAqIHJlc2V0dGluZyB0aGUgYnVzLCBzbyB3ZSBnZXQgdGhlIGNvcnJlY3QKKwkgKiBlcnJvciBjb2RlLgorCSAqLworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgIT0gMCkKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQVVUT1NFTlNFX0ZBSUwpOworCWVsc2UKKwkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOworCWFoZF9yZXNldF9jaGFubmVsKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsIC8qaW5pdGlhdGUqL1RSVUUpOworCisJLyoKKwkgKiBBZGQgYSBtaW5pbWFsIGJ1cyBzZXR0bGUgZGVsYXkgZm9yIGRldmljZXMgdGhhdCBhcmUgc2xvdyB0bworCSAqIHJlc3BvbmQgYWZ0ZXIgYnVzIHJlc2V0cy4KKwkgKi8KKwlhaGRfZnJlZXplX3NpbXEoYWhkKTsKKwlpbml0X3RpbWVyKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmRhdGEgPSAodV9sb25nKWFoZDsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAyOworCWFoZC0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPQorCSAgICAoYWhkX2xpbnV4X2NhbGxiYWNrX3QgKilhaGRfcmVsZWFzZV9zaW1xOworCWFkZF90aW1lcigmYWhkLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lcik7CisJaWYgKGFoZF9saW51eF9uZXh0X2RldmljZV90b19ydW4oYWhkKSAhPSBOVUxMKQorCQlhaGRfc2NoZWR1bGVfcnVucShhaGQpOworCWFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9kdl9jb21wbGV0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKigoc3RydWN0IGFoZF9zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCisJLyogRGVsZXRlIHRoZSBEViB0aW1lciBiZWZvcmUgaXQgZ29lcyBvZmYhICovCisJc2NzaV9kZWxldGVfdGltZXIoY21kKTsKKworI2lmZGVmIEFIRF9ERUJVRworCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19EVikKKwkJcHJpbnRmKCIlczolYzolZDogQ29tbWFuZCBjb21wbGV0ZWQsIHN0YXR1cz0gMHgleFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPnJlc3VsdCk7CisjZW5kaWYKKworCS8qIFdha2UgdXAgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKwl1cCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5kdl9jbWRfc2VtKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCXVpbnQxNl90IGI7CisJdV9pbnQJIGk7CisJdV9pbnQJIGo7CisKKwlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKHRhcmctPmR2X2VjaG9fc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmR2X2J1ZmZlcjEsIE1fREVWQlVGKTsKKwl0YXJnLT5kdl9idWZmZXIxID0gbWFsbG9jKHRhcmctPmR2X2VjaG9fc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKworCWkgPSAwOworCisJYiA9IDB4MDAwMTsKKwlmb3IgKGogPSAwIDsgaSA8IHRhcmctPmR2X2VjaG9fc2l6ZTsgaisrKSB7CisJCWlmIChqIDwgMzIpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHNlcXVlbnRpYWwgbnVtYmVycy4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSBqICYgMHhmZjsKKwkJfSBlbHNlIGlmIChqIDwgNDgpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHJlcGVhdGluZyAweDAwMDAsIDB4ZmZmZi4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAoaiAmIDB4MDIpID8gMHhmZiA6IDB4MDA7CisJCX0gZWxzZSBpZiAoaiA8IDY0KSB7CisJCQkvKgorCQkJICogMzJieXRlcyBvZiByZXBlYXRpbmcgMHg1NTU1LCAweGFhYWEuCisJCQkgKi8KKwkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKGogJiAweDAyKSA/IDB4YWEgOiAweDU1OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlbWFpbmluZyBidWZmZXIgaXMgZmlsbGVkIHdpdGggYSByZXBlYXRpbmcKKwkJCSAqIHBhdHRlciBvZjoKKwkJCSAqCisJCQkgKgkgMHhmZmZmCisJCQkgKgl+MHgwMDAxIDw8IHNoaWZ0ZWQgb25jZSBpbiBlYWNoIGxvb3AuCisJCQkgKi8KKwkJCWlmIChqICYgMHgwMikgeworCQkJCWlmIChqICYgMHgwMSkgeworCQkJCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IH4oYiA+PiA4KSAmIDB4ZmY7CisJCQkJCWIgPDw9IDE7CisJCQkJCWlmIChiID09IDB4MDAwMCkKKwkJCQkJCWIgPSAweDAwMDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAofmIgJiAweGZmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gMHhmZjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHVfaW50CithaGRfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdGF0aWMgaW50IHdhcm5lZF91c2VyOworCXVfaW50IHRhZ3M7CisKKwl0YWdzID0gMDsKKwlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgZGV2aW5mby0+dGFyZ2V0X21hc2spICE9IDApIHsKKwkJaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF90YWdfaW5mbykpIHsKKworCQkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKKwkJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuICBVc2luZyBkZWZhdWx0c1xuIgorImFpYzc5eHg6IFBsZWFzZSB1cGRhdGUgdGhlIGFpYzc5eHhfdGFnX2luZm8gYXJyYXkgaW5cbiIKKyJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJCXdhcm5lZF91c2VyKys7CisJCQl9CisJCQl0YWdzID0gQUhEX01BWF9RVUVVRTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXJfdGFnX2luZm9fdCAqdGFnX2luZm87CisKKwkJCXRhZ19pbmZvID0gJmFpYzc5eHhfdGFnX2luZm9bYWhkLT51bml0XTsKKwkJCXRhZ3MgPSB0YWdfaW5mby0+dGFnX2NvbW1hbmRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCQkJaWYgKHRhZ3MgPiBBSERfTUFYX1FVRVVFKQorCQkJCXRhZ3MgPSBBSERfTUFYX1FVRVVFOworCQl9CisJfQorCXJldHVybiAodGFncyk7Cit9CisKK3N0YXRpYyB1X2ludAorYWhkX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RhdGljIGludCB3YXJuZWRfdXNlcjsKKwlpbnQgZHY7CisKKwlpZiAoYWhkLT51bml0ID49IE5VTV9FTEVNRU5UUyhhaWM3OXh4X2R2X3NldHRpbmdzKSkgeworCisJCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7CisJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljNzl4eDogV0FSTklORzogSW5zdWZmaWNpZW50IGR2IHNldHRpbmdzIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF9kdl9zZXR0aW5ncyBhcnJheSBpbiIKKyJhaWM3OXh4OiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJd2FybmVkX3VzZXIrKzsKKwkJfQorCQlkdiA9IC0xOworCX0gZWxzZSB7CisKKwkJZHYgPSBhaWM3OXh4X2R2X3NldHRpbmdzW2FoZC0+dW5pdF07CisJfQorCisJaWYgKGR2IDwgMCkgeworCQkvKgorCQkgKiBBcHBseSB0aGUgZGVmYXVsdC4KKwkJICovCisJCWR2ID0gMTsKKwkJaWYgKGFoZC0+c2VlcF9jb25maWcgIT0gMCkKKwkJCWR2ID0gKGFoZC0+c2VlcF9jb25maWctPmJpb3NfY29udHJvbCAmIENGRU5BQkxFRFYpOworCX0KKwlyZXR1cm4gKGR2KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9zZXR1cF91c2VyX3JkX3N0cm1fc2V0dGluZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXN0YXRpYwlpbnQgd2FybmVkX3VzZXI7CisJdV9pbnQJcmRfc3RybV9tYXNrOworCXVfaW50CXRhcmdldF9pZDsKKworCS8qCisJICogSWYgd2UgaGF2ZSBzcGVjaWZpYyByZWFkIHN0cmVhbWluZyBpbmZvIGZvciB0aGlzIGNvbnRyb2xsZXIsCisJICogYXBwbHkgaXQuICBPdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0cy4KKwkgKi8KKwkgaWYgKGFoZC0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljNzl4eF9yZF9zdHJtX2luZm8pKSB7CisKKwkJaWYgKHdhcm5lZF91c2VyID09IDApIHsKKworCQkJcHJpbnRmKEtFUk5fV0FSTklORworImFpYzc5eHg6IFdBUk5JTkc6IEluc3VmZmljaWVudCByZF9zdHJtIGluc3RhbmNlc1xuIgorImFpYzc5eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljNzl4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljNzl4eF9yZF9zdHJtX2luZm8gYXJyYXlcbiIKKyJhaWM3OXh4OiBpbiB0aGUgYWljNzl4eF9vc20uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJd2FybmVkX3VzZXIrKzsKKwkJfQorCQlyZF9zdHJtX21hc2sgPSBBSUM3OVhYX0NPTkZJR0VEX1JEX1NUUk07CisJfSBlbHNlIHsKKworCQlyZF9zdHJtX21hc2sgPSBhaWM3OXh4X3JkX3N0cm1faW5mb1thaGQtPnVuaXRdOworCX0KKwlmb3IgKHRhcmdldF9pZCA9IDA7IHRhcmdldF9pZCA8IDE2OyB0YXJnZXRfaWQrKykgeworCQlzdHJ1Y3QgYWhkX2RldmluZm8gZGV2aW5mbzsKKwkJc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsICdBJywgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCQlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBhaGQtPm91cl9pZCwgdGFyZ2V0X2lkLAorCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELCAnQScsIFJPTEVfSU5JVElBVE9SKTsKKwkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX1JEX1NUUk07CisJCWlmICgocmRfc3RybV9tYXNrICYgZGV2aW5mby50YXJnZXRfbWFzaykgIT0gMCkKKwkJCXRpbmZvLT51c2VyLnBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JEX1NUUk07CisJfQorfQorCisvKgorICogRGV0ZXJtaW5lcyB0aGUgcXVldWUgZGVwdGggZm9yIGEgZ2l2ZW4gZGV2aWNlLgorICovCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CWFoZF9kZXZpbmZvIGRldmluZm87CisJdV9pbnQJdGFnczsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgYWhkLT5vdXJfaWQsCisJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCisJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJyA6ICdCJywKKwkJCSAgICBST0xFX0lOSVRJQVRPUik7CisJdGFncyA9IGFoZF9saW51eF91c2VyX3RhZ2RlcHRoKGFoZCwgJmRldmluZm8pOworCWlmICh0YWdzICE9IDAKKwkgJiYgZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMCisJICYmIGRldi0+c2NzaV9kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgIT0gMCkgeworCisJCWFoZF9zZXRfdGFncyhhaGQsICZkZXZpbmZvLCBBSERfUVVFVUVfVEFHR0VEKTsKKwkJYWhkX3ByaW50X2RldmluZm8oYWhkLCAmZGV2aW5mbyk7CisJCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKKwl9IGVsc2UgeworCQlhaGRfc2V0X3RhZ3MoYWhkLCAmZGV2aW5mbywgQUhEX1FVRVVFX05PTkUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9ydW5fZGV2aWNlX3F1ZXVlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QJIGFoZF9jbWQgKmFjbWQ7CisJc3RydWN0CSBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QJIHNjYiAqc2NiOworCXN0cnVjdAkgaGFyZHdhcmVfc2NiICpoc2NiOworCXN0cnVjdAkgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CSBhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJdV9pbnQJIGNvbF9pZHg7CisJdWludDE2X3QgbWFzazsKKworCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfT05fUlVOX0xJU1QpICE9IDApCisJCXBhbmljKCJydW5uaW5nIGRldmljZSBvbiBydW4gbGlzdCIpOworCisJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoJmRldi0+YnVzeXEpKSAhPSBOVUxMCisJICAgICYmIGRldi0+b3BlbmluZ3MgPiAwICYmIGRldi0+cWZyb3plbiA9PSAwKSB7CisKKwkJLyoKKwkJICogU2NoZWR1bGUgdXMgdG8gcnVuIGxhdGVyLiAgVGhlIG9ubHkgcmVhc29uIHdlIGFyZSBub3QKKwkJICogcnVubmluZyBpcyBiZWNhdXNlIHRoZSB3aG9sZSBjb250cm9sbGVyIFEgaXMgZnJvemVuLgorCQkgKi8KKwkJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCisJCSAmJiBBSERfRFZfU0lNUV9GUk9aRU4oYWhkKSA9PSAwKSB7CisKKwkJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLAorCQkJCQkgIGRldiwgbGlua3MpOworCQkJZGV2LT5mbGFncyB8PSBBSERfREVWX09OX1JVTl9MSVNUOworCQkJcmV0dXJuOworCQl9CisKKwkJY21kID0gJmFjbWRfc2NzaV9jbWQoYWNtZCk7CisKKwkJLyoKKwkJICogR2V0IGFuIHNjYiB0byB1c2UuCisJCSAqLworCQl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCAnQScsIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgY21kLT5kZXZpY2UtPmlkLCAmdHN0YXRlKTsKKwkJaWYgKChkZXYtPmZsYWdzICYgKEFIRF9ERVZfUV9UQUdHRUR8QUhEX0RFVl9RX0JBU0lDKSkgPT0gMAorCQkgfHwgKHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfSVVfUkVRKSAhPSAwKSB7CisJCQljb2xfaWR4ID0gQUhEX05FVkVSX0NPTF9JRFg7CisJCX0gZWxzZSB7CisJCQljb2xfaWR4ID0gQUhEX0JVSUxEX0NPTF9JRFgoY21kLT5kZXZpY2UtPmlkLAorCQkJCQkJICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQl9CisJCWlmICgoc2NiID0gYWhkX2dldF9zY2IoYWhkLCBjb2xfaWR4KSkgPT0gTlVMTCkgeworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsCisJCQkJCSBkZXYsIGxpbmtzKTsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhEX0RFVl9PTl9SVU5fTElTVDsKKwkJCWFoZC0+ZmxhZ3MgfD0gQUhEX1JFU09VUkNFX1NIT1JUQUdFOworCQkJcmV0dXJuOworCQl9CisJCVRBSUxRX1JFTU9WRSgmZGV2LT5idXN5cSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQlzY2ItPmlvX2N0eCA9IGNtZDsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYgPSBkZXY7CisJCWhzY2IgPSBzY2ItPmhzY2I7CisJCWNtZC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopc2NiOworCisJCS8qCisJCSAqIEZpbGwgb3V0IGJhc2ljcyBvZiB0aGUgSFNDQi4KKwkJICovCisJCWhzY2ItPmNvbnRyb2wgPSAwOworCQloc2NiLT5zY3NpaWQgPSBCVUlMRF9TQ1NJSUQoYWhkLCBjbWQpOworCQloc2NiLT5sdW4gPSBjbWQtPmRldmljZS0+bHVuOworCQlzY2ItPmhzY2ItPnRhc2tfbWFuYWdlbWVudCA9IDA7CisJCW1hc2sgPSBTQ0JfR0VUX1RBUkdFVF9NQVNLKGFoZCwgc2NiKTsKKworCQlpZiAoKGFoZC0+dXNlcl9kaXNjZW5hYmxlICYgbWFzaykgIT0gMCkKKwkJCWhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKworCSAJaWYgKEFIRF9EVl9DTUQoY21kKSAhPSAwKQorCQkJc2NiLT5mbGFncyB8PSBTQ0JfU0lMRU5UOworCisJCWlmICgodGluZm8tPmN1cnIucHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApCisJCQlzY2ItPmZsYWdzIHw9IFNDQl9QQUNLRVRJWkVEOworCisJCWlmICgodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIG1hc2spICE9IDApIHsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCX0KKworCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhEX0RFVl9RX1RBR0dFRHxBSERfREVWX1FfQkFTSUMpKSAhPSAwKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJaW50CW1zZ19ieXRlczsKKwkJCXVpbnQ4X3QgdGFnX21zZ3NbMl07CisKKwkJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKKwkJCWlmIChtc2dfYnl0ZXMgJiYgdGFnX21zZ3NbMF0gIT0gTVNHX1NJTVBMRV9UQVNLKSB7CisJCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKKwkJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKKwkJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSERfT1RBR19USFJFU0gKKwkJCSAmJiAoZGV2LT5mbGFncyAmIEFIRF9ERVZfUV9UQUdHRUQpICE9IDApIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19PUkRFUkVEX1RBU0s7CisJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfVEFTSzsKKwkJCX0KKwkJfQorCisJCWhzY2ItPmNkYl9sZW4gPSBjbWQtPmNtZF9sZW47CisJCW1lbWNweShoc2NiLT5zaGFyZWRfZGF0YS5pZGF0YS5jZGIsIGNtZC0+Y21uZCwgaHNjYi0+Y2RiX2xlbik7CisKKwkJc2NiLT5zZ19jb3VudCA9IDA7CisJCWFoZF9zZXRfcmVzaWR1YWwoc2NiLCAwKTsKKwkJYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOworCQlpZiAoY21kLT51c2Vfc2cgIT0gMCkgeworCQkJdm9pZAkqc2c7CisJCQlzdHJ1Y3QJIHNjYXR0ZXJsaXN0ICpjdXJfc2VnOworCQkJdV9pbnQJIG5zZWc7CisJCQlpbnQJIGRpcjsKKworCQkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJZGlyID0gc2NzaV90b19wY2lfZG1hX2RpcihjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCW5zZWcgPSBwY2lfbWFwX3NnKGFoZC0+ZGV2X3NvZnRjLCBjdXJfc2VnLAorCQkJCQkgIGNtZC0+dXNlX3NnLCBkaXIpOworCQkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7CisJCQlmb3IgKHNnID0gc2NiLT5zZ19saXN0OyBuc2VnID4gMDsgbnNlZy0tLCBjdXJfc2VnKyspIHsKKwkJCQlkbWFfYWRkcl90IGFkZHI7CisJCQkJYnVzX3NpemVfdCBsZW47CisKKwkJCQlhZGRyID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7CisJCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKKwkJCQlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuICs9IGxlbjsKKwkJCQlzZyA9IGFoZF9zZ19zZXR1cChhaGQsIHNjYiwgc2csIGFkZHIsIGxlbiwKKwkJCQkJCSAgLypsYXN0Ki9uc2VnID09IDEpOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuICE9IDApIHsKKwkJCXZvaWQgKnNnOworCQkJZG1hX2FkZHJfdCBhZGRyOworCQkJaW50IGRpcjsKKworCQkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCQlkaXIgPSBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJYWRkciA9IHBjaV9tYXBfc2luZ2xlKGFoZC0+ZGV2X3NvZnRjLAorCQkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZGlyKTsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+eGZlcl9sZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOworCQkJc2cgPSBhaGRfc2dfc2V0dXAoYWhkLCBzY2IsIHNnLCBhZGRyLAorCQkJCQkgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCAvKmxhc3QqL1RSVUUpOworCQl9CisKKwkJTElTVF9JTlNFUlRfSEVBRCgmYWhkLT5wZW5kaW5nX3NjYnMsIHNjYiwgcGVuZGluZ19saW5rcyk7CisJCWRldi0+b3BlbmluZ3MtLTsKKwkJZGV2LT5hY3RpdmUrKzsKKwkJZGV2LT5jb21tYW5kc19pc3N1ZWQrKzsKKworCQkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50aW5nIGJ1Y2tldCBhbmQgZHVtcCBpZiBuZWVkZWQgKi8KKwkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yKSB7CisJCQlkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvcisrOworCQkJaWYgKGRldi0+dGFyZ2V0LT5jbWRzX3NpbmNlX2Vycm9yID4KKwkJCSAgICBBSERfTElOVVhfRVJSX1RIUkVTSCkKKwkJCQlkZXYtPnRhcmdldC0+Y21kc19zaW5jZV9lcnJvciA9IDA7CisJCX0KKworCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX1BFUklPRElDX09UQUcpICE9IDApCisJCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOworCQlzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkU7CisJCWFoZF9xdWV1ZV9zY2IoYWhkLCBzY2IpOworCX0KK30KKworLyoKKyAqIFNDU0kgY29udHJvbGxlciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworaXJxcmV0dXJuX3QKK2FoZF9saW51eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlmbGFnczsKKwlpbnQJb3VyczsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3NvZnRjICopIGRldl9pZDsKKwlhaGRfbG9jayhhaGQsICZmbGFncyk7IAorCW91cnMgPSBhaGRfaW50cihhaGQpOworCWlmIChhaGRfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoZCkgIT0gTlVMTCkKKwkJYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKKwlhaGRfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoZCk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CisJcmV0dXJuIElSUV9SRVRWQUwob3Vycyk7Cit9CisKK3ZvaWQKK2FoZF9wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCisJd2hpbGUgKGFoZF9saW51eF9ydW5fY29tcGxldGVfcXVldWUoYWhkKSAhPSBOVUxMKQorCQk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWhkX2xpbnV4X3RhcmdldCoKK2FoZF9saW51eF9hbGxvY190YXJnZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjaGFubmVsLCB1X2ludCB0YXJnZXQpCit7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7CisKKwl0YXJnID0gbWFsbG9jKHNpemVvZigqdGFyZyksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKHRhcmcgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwltZW1zZXQodGFyZywgMCwgc2l6ZW9mKCp0YXJnKSk7CisJdGFyZy0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJdGFyZy0+dGFyZ2V0ID0gdGFyZ2V0OworCXRhcmctPmFoZCA9IGFoZDsKKwl0YXJnLT5mbGFncyA9IEFIRF9EVl9SRVFVSVJFRDsKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0XSA9IHRhcmc7CisJcmV0dXJuICh0YXJnKTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9mcmVlX3RhcmdldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QgYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50IG91cl9pZDsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCWNoYXIgY2hhbm5lbDsKKworCS8qCisJICogRm9yY2UgYSBuZWdvdGlhdGlvbiB0byBhc3luYy9uYXJyb3cgb24gYW55CisJICogZnV0dXJlIGNvbW1hbmQgdG8gdGhpcyBkZXZpY2UgdW5sZXNzIGEgYnVzCisJICogcmVzZXQgb2NjdXJzIGJldHdlZW4gbm93IGFuZCB0aGF0IGNvbW1hbmQuCisJICovCisJY2hhbm5lbCA9ICdBJyArIHRhcmctPmNoYW5uZWw7CisJb3VyX2lkID0gYWhkLT5vdXJfaWQ7CisJdGFyZ2V0X29mZnNldCA9IHRhcmctPnRhcmdldDsKKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBjaGFubmVsLCBvdXJfaWQsCisJCQkJICAgIHRhcmctPnRhcmdldCwgJnRzdGF0ZSk7CisJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywgb3VyX2lkLCB0YXJnLT50YXJnZXQsIENBTV9MVU5fV0lMRENBUkQsCisJCQkgICAgY2hhbm5lbCwgUk9MRV9JTklUSUFUT1IpOworCWFoZF9zZXRfc3luY3JhdGUoYWhkLCAmZGV2aW5mbywgMCwgMCwgMCwKKwkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGRfc2V0X3dpZHRoKGFoZCwgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCSAgICAgIEFIRF9UUkFOU19HT0FMLCAvKnBhdXNlZCovRkFMU0UpOworCWFoZF91cGRhdGVfbmVnX3JlcXVlc3QoYWhkLCAmZGV2aW5mbywgdHN0YXRlLCB0aW5mbywgQUhEX05FR19BTFdBWVMpOworIAlhaGQtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF0gPSBOVUxMOworCWlmICh0YXJnLT5pbnFfZGF0YSAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmlucV9kYXRhLCBNX0RFVkJVRik7CisJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCWZyZWUodGFyZywgTV9ERVZCVUYpOworfQorCitzdGF0aWMgc3RydWN0IGFoZF9saW51eF9kZXZpY2UqCithaGRfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJIHN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnLCB1X2ludCBsdW4pCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCWRldiA9IG1hbGxvYyhzaXplb2YoKmRldiksIE1fREVWQlVHLCBNX05PV0FJVCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJVEFJTFFfSU5JVCgmZGV2LT5idXN5cSk7CisJZGV2LT5mbGFncyA9IEFIRF9ERVZfVU5DT05GSUdVUkVEOworCWRldi0+bHVuID0gbHVuOworCWRldi0+dGFyZ2V0ID0gdGFyZzsKKworCS8qCisJICogV2Ugc3RhcnQgb3V0IGxpZmUgdXNpbmcgdW50YWdnZWQKKwkgKiB0cmFuc2FjdGlvbnMgb2Ygd2hpY2ggd2UgYWxsb3cgb25lLgorCSAqLworCWRldi0+b3BlbmluZ3MgPSAxOworCisJLyoKKwkgKiBTZXQgbWF4dGFncyB0byAwLiAgVGhpcyB3aWxsIGJlIGNoYW5nZWQgaWYgd2UKKwkgKiBsYXRlciBkZXRlcm1pbmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoCisJICogYSB0YWdnZWQgcXVldWluZyBjYXBhYmxlIGRldmljZS4KKwkgKi8KKwlkZXYtPm1heHRhZ3MgPSAwOworCQorCXRhcmctPnJlZmNvdW50Kys7CisJdGFyZy0+ZGV2aWNlc1tsdW5dID0gZGV2OworCXJldHVybiAoZGV2KTsKK30KKworc3RhdGljIHZvaWQKK2FoZF9saW51eF9mcmVlX2RldmljZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFoZF9saW51eF90YXJnZXQgKnRhcmc7CisKKwlkZWxfdGltZXIoJmRldi0+dGltZXIpOworCXRhcmcgPSBkZXYtPnRhcmdldDsKKwl0YXJnLT5kZXZpY2VzW2Rldi0+bHVuXSA9IE5VTEw7CisJZnJlZShkZXYsIE1fREVWQlVGKTsKKwl0YXJnLT5yZWZjb3VudC0tOworCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwCisJICYmICh0YXJnLT5mbGFncyAmIEFIRF9EVl9SRVFVSVJFRCkgPT0gMCkKKwkJYWhkX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoZCwgdGFyZyk7Cit9CisKK3ZvaWQKK2FoZF9zZW5kX2FzeW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLAorCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBBQ19UUkFOU0ZFUl9ORUc6CisJeworCQljaGFyCWJ1Zls4MF07CisJCXN0cnVjdAlhaGRfbGludXhfdGFyZ2V0ICp0YXJnOworCQlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwkJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJYWhkX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCWluZm8uYnVmZmVyID0gYnVmOworCQlpbmZvLmxlbmd0aCA9IHNpemVvZihidWYpOworCQlpbmZvLm9mZnNldCA9IDA7CisJCWluZm8ucG9zID0gMDsKKwkJdGluZm8gPSBhaGRfZmV0Y2hfdHJhbnNpbmZvKGFoZCwgY2hhbm5lbCwgYWhkLT5vdXJfaWQsCisJCQkJCSAgICB0YXJnZXQsICZ0c3RhdGUpOworCisJCS8qCisJCSAqIERvbid0IGJvdGhlciByZXBvcnRpbmcgcmVzdWx0cyB3aGlsZQorCQkgKiBuZWdvdGlhdGlvbnMgYXJlIHN0aWxsIHBlbmRpbmcuCisJCSAqLworCQlpZiAodGluZm8tPmN1cnIucGVyaW9kICE9IHRpbmZvLT5nb2FsLnBlcmlvZAorCQkgfHwgdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGgKKwkJIHx8IHRpbmZvLT5jdXJyLm9mZnNldCAhPSB0aW5mby0+Z29hbC5vZmZzZXQKKwkJIHx8IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zICE9IHRpbmZvLT5nb2FsLnBwcl9vcHRpb25zKQorCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHRoYXQKKwkJICogYXJlIGlkZW50aWNhbCB0byB0aG9zZSBsYXN0IHJlcG9ydGVkLgorCQkgKi8KKwkJdGFyZyA9IGFoZC0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRdOworCQlpZiAodGFyZyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgPT0gdGFyZy0+bGFzdF90aW5mby5wZXJpb2QKKwkJICYmIHRpbmZvLT5jdXJyLndpZHRoID09IHRhcmctPmxhc3RfdGluZm8ud2lkdGgKKwkJICYmIHRpbmZvLT5jdXJyLm9mZnNldCA9PSB0YXJnLT5sYXN0X3RpbmZvLm9mZnNldAorCQkgJiYgdGluZm8tPmN1cnIucHByX29wdGlvbnMgPT0gdGFyZy0+bGFzdF90aW5mby5wcHJfb3B0aW9ucykKKwkJCWlmIChib290dmVyYm9zZSA9PSAwKQorCQkJCWJyZWFrOworCisJCXRhcmctPmxhc3RfdGluZm8ucGVyaW9kID0gdGluZm8tPmN1cnIucGVyaW9kOworCQl0YXJnLT5sYXN0X3RpbmZvLndpZHRoID0gdGluZm8tPmN1cnIud2lkdGg7CisJCXRhcmctPmxhc3RfdGluZm8ub2Zmc2V0ID0gdGluZm8tPmN1cnIub2Zmc2V0OworCQl0YXJnLT5sYXN0X3RpbmZvLnBwcl9vcHRpb25zID0gdGluZm8tPmN1cnIucHByX29wdGlvbnM7CisKKwkJcHJpbnRmKCIoJXM6JWM6IiwgYWhkX25hbWUoYWhkKSwgY2hhbm5lbCk7CisJCWlmICh0YXJnZXQgPT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkKKwkJCXByaW50ZigiKik6ICIpOworCQllbHNlCisJCQlwcmludGYoIiVkKTogIiwgdGFyZ2V0KTsKKwkJYWhkX2Zvcm1hdF90cmFuc2luZm8oJmluZm8sICZ0aW5mby0+Y3Vycik7CisJCWlmIChpbmZvLnBvcyA8IGluZm8ubGVuZ3RoKQorCQkJKmluZm8uYnVmZmVyID0gJ1wwJzsKKwkJZWxzZQorCQkJYnVmW2luZm8ubGVuZ3RoIC0gMV0gPSAnXDAnOworCQlwcmludGYoIiVzIiwgYnVmKTsKKwkJYnJlYWs7CisJfQorICAgICAgICBjYXNlIEFDX1NFTlRfQkRSOgorCXsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCVdBUk5fT04obHVuICE9IENBTV9MVU5fV0lMRENBUkQpOworCQlzY3NpX3JlcG9ydF9kZXZpY2VfcmVzZXQoYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LAorCQkJCQkgY2hhbm5lbCAtICdBJywgdGFyZ2V0KTsKKyNlbHNlCisJCVNjc2lfRGV2aWNlICpzY3NpX2RldjsKKworCQkvKgorCQkgKiBGaW5kIHRoZSBTQ1NJIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworCQkgKiByZXF1ZXN0IGFuZCBpbmRpY2F0ZSB0aGF0IGEgVUEgaXMgZXhwZWN0ZWQuCisJCSAqLworCQlmb3IgKHNjc2lfZGV2ID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X3F1ZXVlOworCQkgICAgIHNjc2lfZGV2ICE9IE5VTEw7IHNjc2lfZGV2ID0gc2NzaV9kZXYtPm5leHQpIHsKKwkJCWlmIChjaGFubmVsIC0gJ0EnID09IHNjc2lfZGV2LT5jaGFubmVsCisJCQkgJiYgdGFyZ2V0ID09IHNjc2lfZGV2LT5pZAorCQkJICYmIChsdW4gPT0gQ0FNX0xVTl9XSUxEQ0FSRAorCQkJICB8fCBsdW4gPT0gc2NzaV9kZXYtPmx1bikpIHsKKwkJCQlzY3NpX2Rldi0+d2FzX3Jlc2V0ID0gMTsKKwkJCQlzY3NpX2Rldi0+ZXhwZWN0aW5nX2NjX3VhID0gMTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCX0KKyAgICAgICAgY2FzZSBBQ19CVVNfUkVTRVQ6CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QgIT0gTlVMTCkgeworCQkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCwKKwkJCQkJICAgICAgY2hhbm5lbCAtICdBJyk7CisJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYW5pYygiYWhkX3NlbmRfYXN5bmM6IFVuZXhwZWN0ZWQgYXN5bmMgZXZlbnQiKTsKKyAgICAgICAgfQorfQorCisvKgorICogQ2FsbHMgdGhlIGhpZ2hlciBsZXZlbCBzY3NpIGRvbmUgZnVuY3Rpb24gYW5kIGZyZWVzIHRoZSBzY2IuCisgKi8KK3ZvaWQKK2FoZF9kb25lKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCVNjc2lfQ21uZCAqY21kOworCXN0cnVjdAkgIGFoZF9saW51eF9kZXZpY2UgKmRldjsKKworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApIHsKKwkJcHJpbnRmKCJTQ0IgJWQgZG9uZSdkIHR3aWNlXG4iLCBTQ0JfR0VUX1RBRyhzY2IpKTsKKwkJYWhkX2R1bXBfY2FyZF9zdGF0ZShhaGQpOworCQlwYW5pYygiU3RvcHBpbmcgZm9yIHNhZmV0eSIpOworCX0KKwlMSVNUX1JFTU9WRShzY2IsIHBlbmRpbmdfbGlua3MpOworCWNtZCA9IHNjYi0+aW9fY3R4OworCWRldiA9IHNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2OworCWRldi0+YWN0aXZlLS07CisJZGV2LT5vcGVuaW5ncysrOworCWlmICgoY21kLT5yZXN1bHQgJiAoQ0FNX0RFVl9RRlJaTiA8PCAxNikpICE9IDApIHsKKwkJY21kLT5yZXN1bHQgJj0gfihDQU1fREVWX1FGUlpOIDw8IDE2KTsKKwkJZGV2LT5xZnJvemVuLS07CisJfQorCWFoZF9saW51eF91bm1hcF9zY2IoYWhkLCBzY2IpOworCisJLyoKKwkgKiBHdWFyZCBhZ2FpbnN0IHN0YWxlIHNlbnNlIGRhdGEuCisJICogVGhlIExpbnV4IG1pZC1sYXllciBhc3N1bWVzIHRoYXQgc2Vuc2UKKwkgKiB3YXMgcmV0cmlldmVkIGFueXRpbWUgdGhlIGZpcnN0IGJ5dGUgb2YKKwkgKiB0aGUgc2Vuc2UgYnVmZmVyIGxvb2tzICJzYW5lIi4KKwkgKi8KKwljbWQtPnNlbnNlX2J1ZmZlclswXSA9IDA7CisJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9JTlBST0cpIHsKKwkJdWludDMyX3QgYW1vdW50X3hmZXJyZWQ7CisKKwkJYW1vdW50X3hmZXJyZWQgPQorCQkgICAgYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKSAtIGFoZF9nZXRfcmVzaWR1YWwoc2NiKTsKKwkJaWYgKChzY2ItPmZsYWdzICYgU0NCX1RSQU5TTUlTU0lPTl9FUlJPUikgIT0gMCkgeworI2lmZGVmIEFIRF9ERUJVRworCQkJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NSVNDKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiU2V0IENBTV9VTkNPUl9QQVJJVFlcbiIpOworCQkJfQorI2VuZGlmCisJCQlhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9VTkNPUl9QQVJJVFkpOworI2lmZGVmIEFIRF9SRVBPUlRfVU5ERVJGTE9XUworCQkvKgorCQkgKiBUaGlzIGNvZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhcyBzb21lCisJCSAqIGNsaWVudHMgb2YgdGhlIFNDU0kgc3lzdGVtIGRvIG5vdCBwcm9wZXJseQorCQkgKiBpbml0aWFsaXplIHRoZSB1bmRlcmZsb3cgcGFyYW1ldGVyLiAgVGhpcworCQkgKiByZXN1bHRzIGluIHNwdXJpb3VzIHRlcm1pbmF0aW9uIG9mIGNvbW1hbmRzCisJCSAqIHRoYXQgY29tcGxldGUgYXMgZXhwZWN0ZWQgKGUuZy4gdW5kZXJmbG93IGlzCisJCSAqIGFsbG93ZWQgYXMgY29tbWFuZCBjYW4gcmV0dXJuIHZhcmlhYmxlIGFtb3VudHMKKwkJICogb2YgZGF0YS4KKwkJICovCisJCX0gZWxzZSBpZiAoYW1vdW50X3hmZXJyZWQgPCBzY2ItPmlvX2N0eC0+dW5kZXJmbG93KSB7CisJCQl1X2ludCBpOworCisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIkNEQjoiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPmlvX2N0eC0+Y21kX2xlbjsgaSsrKQorCQkJCXByaW50ZigiIDB4JXgiLCBzY2ItPmlvX2N0eC0+Y21uZFtpXSk7CisJCQlwcmludGYoIlxuIik7CisJCQlhaGRfcHJpbnRfcGF0aChhaGQsIHNjYik7CisJCQlwcmludGYoIlNhdyB1bmRlcmZsb3cgKCVsZCBvZiAlbGQgYnl0ZXMpLiAiCisJCQkgICAgICAgIlRyZWF0ZWQgYXMgZXJyb3JcbiIsCisJCQkJYWhkX2dldF9yZXNpZHVhbChzY2IpLAorCQkJCWFoZF9nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikpOworCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fREFUQV9SVU5fRVJSKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRX0NNUCk7CisJCX0KKwl9IGVsc2UgaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1NDU0lfU1RBVFVTX0VSUk9SKSB7CisJCWFoZF9saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoYWhkLCBkZXYsIHNjYik7CisJfSBlbHNlIGlmIChhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9TRUxfVElNRU9VVCkgeworCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVU5DT05GSUdVUkVEOworCQlpZiAoQUhEX0RWX0NNRChjbWQpID09IEZBTFNFKQorCQkJZGV2LT50YXJnZXQtPmZsYWdzICY9IH5BSERfRFZfUkVRVUlSRUQ7CisJfQorCS8qCisJICogU3RhcnQgRFYgZm9yIGRldmljZXMgdGhhdCByZXF1aXJlIGl0IGFzc3VtaW5nIHRoZSBmaXJzdCBjb21tYW5kCisJICogc2VudCBkb2VzIG5vdCByZXN1bHQgaW4gYSBzZWxlY3Rpb24gdGltZW91dC4KKwkgKi8KKwlpZiAoYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSAhPSBDQU1fU0VMX1RJTUVPVVQKKwkgJiYgKGRldi0+dGFyZ2V0LT5mbGFncyAmIEFIRF9EVl9SRVFVSVJFRCkgIT0gMCkKKwkJYWhkX2xpbnV4X3N0YXJ0X2R2KGFoZCk7CisKKwlpZiAoZGV2LT5vcGVuaW5ncyA9PSAxCisJICYmIGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9DTVAKKwkgJiYgYWhkX2dldF9zY3NpX3N0YXR1cyhzY2IpICE9IFNDU0lfU1RBVFVTX1FVRVVFX0ZVTEwpCisJCWRldi0+dGFnX3N1Y2Nlc3NfY291bnQrKzsKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyBkZWFsIHdpdGggdGVtcG9yYXJ5IGludGVybmFsIHJlc291cmNlCisJICogc2hvcnRhZ2VzIGJ5IHJldHVybmluZyBxdWV1ZSBmdWxsLiAgV2hlbiB0aGUgcXVldWUKKwkgKiBmdWxsIG9jY3VycnMsIHdlIHRocm90dGxlIGJhY2suICBTbG93bHkgdHJ5IHRvIGdldAorCSAqIGJhY2sgdG8gb3VyIHByZXZpb3VzIHF1ZXVlIGRlcHRoLgorCSAqLworCWlmICgoZGV2LT5vcGVuaW5ncyArIGRldi0+YWN0aXZlKSA8IGRldi0+bWF4dGFncworCSAmJiBkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID4gQUhEX1RBR19TVUNDRVNTX0lOVEVSVkFMKSB7CisJCWRldi0+dGFnX3N1Y2Nlc3NfY291bnQgPSAwOworCQlkZXYtPm9wZW5pbmdzKys7CisJfQorCisJaWYgKGRldi0+YWN0aXZlID09IDApCisJCWRldi0+Y29tbWFuZHNfc2luY2VfaWRsZV9vcl9vdGFnID0gMDsKKworCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkpIHsKKwkJaWYgKChkZXYtPmZsYWdzICYgQUhEX0RFVl9VTkNPTkZJR1VSRUQpICE9IDAKKwkJICYmIGRldi0+YWN0aXZlID09IDAKKwkJICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9USU1FUl9BQ1RJVkUpID09IDApCisJCQlhaGRfbGludXhfZnJlZV9kZXZpY2UoYWhkLCBkZXYpOworCX0gZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBBSERfREVWX09OX1JVTl9MSVNUKSA9PSAwKSB7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKKwkJZGV2LT5mbGFncyB8PSBBSERfREVWX09OX1JVTl9MSVNUOworCX0KKworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpICE9IDApIHsKKwkJcHJpbnRmKCJSZWNvdmVyeSBTQ0IgY29tcGxldGVzXG4iKTsKKwkJaWYgKGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX0JEUl9TRU5UCisJCSB8fCBhaGRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfQUJPUlRFRCkKKwkJCWFoZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0NNRF9USU1FT1VUKTsKKwkJaWYgKChzY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX1NDQl9VUF9FSF9TRU0pICE9IDApIHsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9TQ0JfVVBfRUhfU0VNOworCQkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwkJfQorCX0KKworCWFoZF9mcmVlX3NjYihhaGQsIHNjYik7CisJYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGQsIGNtZCk7CisKKwlpZiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfV0FJVF9TSU1RX0VNUFRZKSAhPSAwCisJICYmIExJU1RfRklSU1QoJmFoZC0+cGVuZGluZ19zY2JzKSA9PSBOVUxMKSB7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9EVl9XQUlUX1NJTVFfRU1QVFk7CisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgIHN0cnVjdCBhaGRfbGludXhfZGV2aWNlICpkZXYsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3QJYWhkX2RldmluZm8gZGV2aW5mbzsKKworCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgYWhkLT5vdXJfaWQsCisJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCisJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMCA/ICdBJyA6ICdCJywKKwkJCSAgICBST0xFX0lOSVRJQVRPUik7CisJCisJLyoKKwkgKiBXZSBkb24ndCBjdXJyZW50bHkgdHJ1c3QgdGhlIG1pZC1sYXllciB0bworCSAqIHByb3Blcmx5IGRlYWwgd2l0aCBxdWV1ZSBmdWxsIG9yIGJ1c3kuICBTbywKKwkgKiB3aGVuIG9uZSBvY2N1cnMsIHdlIHRlbGwgdGhlIG1pZC1sYXllciB0bworCSAqIHVuY29uZGl0aW9uYWxseSByZXF1ZXVlIHRoZSBjb21tYW5kIHRvIHVzCisJICogc28gdGhhdCB3ZSBjYW4gcmV0cnkgaXQgb3Vyc2VsdmVzLiAgV2UgYWxzbworCSAqIGltcGxlbWVudCBvdXIgb3duIHRocm90dGxpbmcgbWVjaGFuaXNtIHNvCisJICogd2UgZG9uJ3QgY2xvYmJlciB0aGUgZGV2aWNlIHdpdGggdG9vIG1hbnkKKwkgKiBjb21tYW5kcy4KKwkgKi8KKwlzd2l0Y2ggKGFoZF9nZXRfc2NzaV9zdGF0dXMoc2NiKSkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCWNhc2UgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORDoKKwljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCXsKKwkJU2NzaV9DbW5kICpjbWQ7CisKKwkJLyoKKwkJICogQ29weSBzZW5zZSBpbmZvcm1hdGlvbiB0byB0aGUgT1MncyBjbWQKKwkJICogc3RydWN0dXJlIGlmIGl0IGlzIGF2YWlsYWJsZS4KKwkJICovCisJCWNtZCA9IHNjYi0+aW9fY3R4OworCQlpZiAoKHNjYi0+ZmxhZ3MgJiAoU0NCX1NFTlNFfFNDQl9QS1RfU0VOU0UpKSAhPSAwKSB7CisJCQlzdHJ1Y3Qgc2NzaV9zdGF0dXNfaXVfaGVhZGVyICpzaXU7CisJCQl1X2ludCBzZW5zZV9zaXplOworCQkJdV9pbnQgc2Vuc2Vfb2Zmc2V0OworCisJCQlpZiAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgeworCQkJCXNlbnNlX3NpemUgPSBNSU4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCisJCQkJCSAgICAgICAtIGFoZF9nZXRfc2Vuc2VfcmVzaWR1YWwoc2NiKSwKKwkJCQkJCSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCQlzZW5zZV9vZmZzZXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIENvcHkgb25seSB0aGUgc2Vuc2UgZGF0YSBpbnRvIHRoZSBwcm92aWRlZAorCQkJCSAqIGJ1ZmZlci4KKwkJCQkgKi8KKwkJCQlzaXUgPSAoc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqKQorCQkJCSAgICBzY2ItPnNlbnNlX2RhdGE7CisJCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzY3NpXzRidG91bChzaXUtPnNlbnNlX2xlbmd0aCksCisJCQkJCQlzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJCQlzZW5zZV9vZmZzZXQgPSBTSVVfU0VOU0VfT0ZGU0VUKHNpdSk7CisJCQl9CisKKwkJCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgYWhkX2dldF9zZW5zZV9idWYoYWhkLCBzY2IpCisJCQkgICAgICAgKyBzZW5zZV9vZmZzZXQsIHNlbnNlX3NpemUpOworCQkJY21kLT5yZXN1bHQgfD0gKERSSVZFUl9TRU5TRSA8PCAyNCk7CisKKyNpZmRlZiBBSERfREVCVUcKKwkJCWlmIChhaGRfZGVidWcgJiBBSERfU0hPV19TRU5TRSkgeworCQkJCWludCBpOworCisJCQkJcHJpbnRmKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YSBhdCAlZDoiLAorCQkJCSAgICAgICBzZW5zZV9zaXplLCBzZW5zZV9vZmZzZXQpOworCQkJCWZvciAoaSA9IDA7IGkgPCBzZW5zZV9zaXplOyBpKyspIHsKKwkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQorCQkJCQkJcHJpbnRmKCJcbiIpOworCQkJCQlwcmludGYoIjB4JXggIiwgY21kLT5zZW5zZV9idWZmZXJbaV0pOworCQkJCX0KKwkJCQlwcmludGYoIlxuIik7CisJCQl9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMOgorCXsKKwkJLyoKKwkJICogQnkgdGhlIHRpbWUgdGhlIGNvcmUgZHJpdmVyIGhhcyByZXR1cm5lZCB0aGlzCisJCSAqIGNvbW1hbmQsIGFsbCBvdGhlciBjb21tYW5kcyB0aGF0IHdlcmUgcXVldWVkCisJCSAqIHRvIHVzIGJ1dCBub3QgdGhlIGRldmljZSBoYXZlIGJlZW4gcmV0dXJuZWQuCisJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IGRldi0+YWN0aXZlIGlzIGVxdWFsIHRvCisJCSAqIHRoZSBudW1iZXIgb2YgY29tbWFuZHMgYWN0dWFsbHkgcXVldWVkIHRvCisJCSAqIHRoZSBkZXZpY2UuCisJCSAqLworCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKKwkJaWYgKGRldi0+YWN0aXZlICE9IDApIHsKKwkJCS8qCisJCQkgKiBEcm9wIG91ciBvcGVuaW5nIGNvdW50IHRvIHRoZSBudW1iZXIKKwkJCSAqIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBvdXRzdGFuZGluZy4KKwkJCSAqLworCQkJZGV2LT5vcGVuaW5ncyA9IDA7CisjaWZkZWYgQUhEX0RFQlVHCisJCQlpZiAoKGFoZF9kZWJ1ZyAmIEFIRF9TSE9XX1FGVUxMKSAhPSAwKSB7CisJCQkJYWhkX3ByaW50X3BhdGgoYWhkLCBzY2IpOworCQkJCXByaW50ZigiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLAorCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKKworCQkJCWRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudCsrOworCQkJCS8qCisJCQkJICogSWYgd2UgcmVwZWF0ZWRseSBzZWUgYSBxdWV1ZSBmdWxsCisJCQkJICogYXQgdGhlIHNhbWUgcXVldWUgZGVwdGgsIHRoaXMKKwkJCQkgKiBkZXZpY2UgaGFzIGEgZml4ZWQgbnVtYmVyIG9mIHRhZworCQkJCSAqIHNsb3RzLiAgTG9jayBpbiB0aGlzIHRhZyBkZXB0aAorCQkJCSAqIHNvIHdlIHN0b3Agc2VlaW5nIHF1ZXVlIGZ1bGxzIGZyb20KKwkJCQkgKiB0aGlzIGRldmljZS4KKwkJCQkgKi8KKwkJCQlpZiAoZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50CisJCQkJID09IEFIRF9MT0NLX1RBR1NfQ09VTlQpIHsKKwkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7CisJCQkJCWFoZF9wcmludF9wYXRoKGFoZCwgc2NiKTsKKwkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCisJCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwgPSBkZXYtPmFjdGl2ZTsKKwkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQgPSAwOworCQkJfQorCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOworCQkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKKwkJCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhhaGQsICZkZXZpbmZvLAorCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSERfREVWX1FfQkFTSUMpCisJCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIERyb3AgZG93biB0byBhIHNpbmdsZSBvcGVuaW5nLCBhbmQgdHJlYXQgdGhpcworCQkgKiBhcyBpZiB0aGUgdGFyZ2V0IHJldHVybmVkIEJVU1kgU0NTSSBzdGF0dXMuCisJCSAqLworCQlkZXYtPm9wZW5pbmdzID0gMTsKKwkJYWhkX3BsYXRmb3JtX3NldF90YWdzKGFoZCwgJmRldmluZm8sCisJCQkgICAgIChkZXYtPmZsYWdzICYgQUhEX0RFVl9RX0JBU0lDKQorCQkJICAgPyBBSERfUVVFVUVfQkFTSUMgOiBBSERfUVVFVUVfVEFHR0VEKTsKKwkJYWhkX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX0JVU1kpOworCQkvKiBGQUxMVEhST1VHSCAqLworCX0KKwljYXNlIFNDU0lfU1RBVFVTX0JVU1k6CisJCS8qCisJCSAqIFNldCBhIHNob3J0IHRpbWVyIHRvIGRlZmVyIHNlbmRpbmcgY29tbWFuZHMgZm9yCisJCSAqIGEgYml0IHNpbmNlIExpbnV4IHdpbGwgbm90IGRlbGF5IGluIHRoaXMgY2FzZS4KKwkJICovCisJCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfVElNRVJfQUNUSVZFKSAhPSAwKSB7CisJCQlwcmludGYoIiVzOiVjOiVkOiBEZXZpY2UgVGltZXIgc3RpbGwgYWN0aXZlIGR1cmluZyAiCisJCQkgICAgICAgImJ1c3kgcHJvY2Vzc2luZ1xuIiwgYWhkX25hbWUoYWhkKSwKKwkJCQlkZXYtPnRhcmdldC0+Y2hhbm5lbCwgZGV2LT50YXJnZXQtPnRhcmdldCk7CisJCQlicmVhazsKKwkJfQorCQlkZXYtPmZsYWdzIHw9IEFIRF9ERVZfVElNRVJfQUNUSVZFOworCQlkZXYtPnFmcm96ZW4rKzsKKwkJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJCWRldi0+dGltZXIuZGF0YSA9ICh1X2xvbmcpZGV2OworCQlkZXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaLzIpOworCQlkZXYtPnRpbWVyLmZ1bmN0aW9uID0gYWhkX2xpbnV4X2Rldl90aW1lZF91bmZyZWV6ZTsKKwkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhkX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIFNjc2lfQ21uZCAqY21kKQoreworCS8qCisJICogVHlwaWNhbGx5LCB0aGUgY29tcGxldGUgcXVldWUgaGFzIHZlcnkgZmV3IGVudHJpZXMKKwkgKiBxdWV1ZWQgdG8gaXQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBlbXB0aWVkIGJ5CisJICogYWhkX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZSwgc28gc29ydGluZyB0aGUgZW50cmllcworCSAqIGJ5IGdlbmVyYXRpb24gbnVtYmVyIHNob3VsZCBiZSBpbmV4cGVuc2l2ZS4KKwkgKiBXZSBwZXJmb3JtIHRoZSBzb3J0IHNvIHRoYXQgY29tbWFuZHMgdGhhdCBjb21wbGV0ZQorCSAqIHdpdGggYW4gZXJyb3IgYXJlIHJldHVuZWQgaW4gdGhlIG9yZGVyIG9yaWdpb25hbGx5CisJICogcXVldWVkIHRvIHRoZSBjb250cm9sbGVyIHNvIHRoYXQgYW55IHN1YnNlcXVlbnQgcmV0cmllcworCSAqIGFyZSBwZXJmb3JtZWQgaW4gb3JkZXIuICBUaGUgdW5kZXJseWluZyBhaGQgcm91dGluZXMgZG8KKwkgKiBub3QgZ3VhcmFudGVlIHRoZSBvcmRlciB0aGF0IGFib3J0ZWQgY29tbWFuZHMgd2lsbCBiZQorCSAqIHJldHVybmVkIHRvIHVzLgorCSAqLworCXN0cnVjdCBhaGRfY29tcGxldGVxICpjb21wbGV0ZXE7CisJc3RydWN0IGFoZF9jbWQgKmxpc3RfY21kOworCXN0cnVjdCBhaGRfY21kICphY21kOworCisJLyoKKwkgKiBNYXAgQ0FNIGVycm9yIGNvZGVzIGludG8gTGludXggRXJyb3IgY29kZXMuICBXZQorCSAqIGF2b2lkIHRoZSBjb252ZXJzaW9uIHNvIHRoYXQgdGhlIERWIGNvZGUgaGFzIHRoZQorCSAqIGZ1bGwgZXJyb3IgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHdoZW4gbWFraW5nCisJICogc3RhdGUgY2hhbmdlIGRlY2lzaW9ucy4KKwkgKi8KKwlpZiAoQUhEX0RWX0NNRChjbWQpID09IEZBTFNFKSB7CisJCXVpbnQzMl90IHN0YXR1czsKKwkJdV9pbnQgbmV3X3N0YXR1czsKKworCQlzdGF0dXMgPSBhaGRfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKTsKKwkJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgeworCQkJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwkJCXN0cnVjdCBhaGRfZGV2aW5mbyBkZXZpbmZvOworCQkJY2FtX3N0YXR1cyBjYW1fc3RhdHVzOworCQkJdWludDMyX3QgYWN0aW9uOworCQkJdV9pbnQgc2NzaV9zdGF0dXM7CisKKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJCQkgICBjbWQtPmRldmljZS0+aWQsCisJCQkJCQkgICBjbWQtPmRldmljZS0+bHVuLAorCQkJCQkJICAgLyphbGxvYyovRkFMU0UpOworCisJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJZ290byBub19mYWxsYmFjazsKKworCQkJYWhkX2NvbXBpbGVfZGV2aW5mbygmZGV2aW5mbywKKwkJCQkJICAgIGFoZC0+b3VyX2lkLAorCQkJCQkgICAgZGV2LT50YXJnZXQtPnRhcmdldCwgZGV2LT5sdW4sCisJCQkJCSAgICBkZXYtPnRhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnOidCJywKKwkJCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKworCQkJc2NzaV9zdGF0dXMgPSBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpOworCQkJY2FtX3N0YXR1cyA9IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpOworCQkJYWN0aW9uID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIGRldi0+dGFyZ2V0LT5pbnFfZGF0YSwKKwkJCQkJCSAgY2FtX3N0YXR1cywgc2NzaV9zdGF0dXMpOworCQkJaWYgKChhY3Rpb24gJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKworCQkJCS8qIFVwZGF0ZSBzdGF0cyAqLworCQkJCWRldi0+dGFyZ2V0LT5lcnJvcnNfZGV0ZWN0ZWQrKzsKKwkJCQlpZiAoZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPT0gMCkKKwkJCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IrKzsKKwkJCQllbHNlIHsKKwkJCQkJZGV2LT50YXJnZXQtPmNtZHNfc2luY2VfZXJyb3IgPSAwOworCQkJCQlhaGRfbGludXhfZmFsbGJhY2soYWhkLCAmZGV2aW5mbyk7CisJCQkJfQorCQkJfQorCQl9Citub19mYWxsYmFjazoKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBDQU1fUkVRX0lOUFJPRzoKKwkJY2FzZSBDQU1fUkVRX0NNUDoKKwkJY2FzZSBDQU1fU0NTSV9TVEFUVVNfRVJST1I6CisJCQluZXdfc3RhdHVzID0gRElEX09LOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1JFUV9BQk9SVEVEOgorCQkJbmV3X3N0YXR1cyA9IERJRF9BQk9SVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9CVVNZOgorCQkJbmV3X3N0YXR1cyA9IERJRF9CVVNfQlVTWTsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFfSU5WQUxJRDoKKwkJY2FzZSBDQU1fUEFUSF9JTlZBTElEOgorCQkJbmV3X3N0YXR1cyA9IERJRF9CQURfVEFSR0VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgorCQkJbmV3X3N0YXR1cyA9IERJRF9OT19DT05ORUNUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1NDU0lfQlVTX1JFU0VUOgorCQljYXNlIENBTV9CRFJfU0VOVDoKKwkJCW5ld19zdGF0dXMgPSBESURfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fVU5DT1JfUEFSSVRZOgorCQkJbmV3X3N0YXR1cyA9IERJRF9QQVJJVFk7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fQ01EX1RJTUVPVVQ6CisJCQluZXdfc3RhdHVzID0gRElEX1RJTUVfT1VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1VBX0FCT1JUOgorCQljYXNlIENBTV9SRVFfQ01QX0VSUjoKKwkJY2FzZSBDQU1fQVVUT1NFTlNFX0ZBSUw6CisJCWNhc2UgQ0FNX05PX0hCQToKKwkJY2FzZSBDQU1fREFUQV9SVU5fRVJSOgorCQljYXNlIENBTV9VTkVYUF9CVVNGUkVFOgorCQljYXNlIENBTV9TRVFVRU5DRV9GQUlMOgorCQljYXNlIENBTV9DQ0JfTEVOX0VSUjoKKwkJY2FzZSBDQU1fUFJPVklERV9GQUlMOgorCQljYXNlIENBTV9SRVFfVEVSTUlPOgorCQljYXNlIENBTV9VTlJFQ19IQkFfRVJST1I6CisJCWNhc2UgQ0FNX1JFUV9UT09fQklHOgorCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFVRVVFX1JFUToKKwkJCS8qCisJCQkgKiBJZiB3ZSB3YW50IHRoZSByZXF1ZXN0IHJlcXVldWVkLCBtYWtlIHN1cmUgdGhlcmUKKwkJCSAqIGFyZSBzdWZmaWNlbnQgcmV0cmllcy4gIEluIHRoZSBvbGQgc2NzaSBlcnJvciBjb2RlLAorCQkJICogd2UgdXNlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYSByZXN1bHQgY29kZSB0aGF0CisJCQkgKiBieXBhc3NlZCB0aGUgcmV0cnkgY291bnQuICBOb3cgd2UgbXVzdCB1c2UgdGhpcworCQkJICogaGFjay4gIFdlIGFsc28gImZha2UiIGEgY2hlY2sgY29uZGl0aW9uIHdpdGgKKwkJCSAqIGEgc2Vuc2UgY29kZSBvZiBBQk9SVEVEIENPTU1BTkQuICBUaGlzIHNlZW1zIHRvCisJCQkgKiBldm9rZSBhIHJldHJ5IGV2ZW4gaWYgdGhpcyBjb21tYW5kIGlzIGJlaW5nIHNlbnQKKwkJCSAqIHZpYSB0aGUgZWggdGhyZWFkLiAgSWNrISAgSWNrISAgSWNrIQorCQkJICovCisJCQlpZiAoY21kLT5yZXRyaWVzID4gMCkKKwkJCQljbWQtPnJldHJpZXMtLTsKKwkJCW5ld19zdGF0dXMgPSBESURfT0s7CisJCQlhaGRfY21kX3NldF9zY3NpX3N0YXR1cyhjbWQsIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQpOworCQkJY21kLT5yZXN1bHQgfD0gKERSSVZFUl9TRU5TRSA8PCAyNCk7CisJCQltZW1zZXQoY21kLT5zZW5zZV9idWZmZXIsIDAsCisJCQkgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQljbWQtPnNlbnNlX2J1ZmZlclswXSA9IFNTRF9FUlJDT0RFX1ZBTElECisJCQkJCSAgICAgfCBTU0RfQ1VSUkVOVF9FUlJPUjsKKwkJCWNtZC0+c2Vuc2VfYnVmZmVyWzJdID0gU1NEX0tFWV9BQk9SVEVEX0NPTU1BTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJbmV3X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgbmV3X3N0YXR1cyk7CisJfQorCisJY29tcGxldGVxID0gJmFoZC0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxOworCWxpc3RfY21kID0gVEFJTFFfRklSU1QoY29tcGxldGVxKTsKKwlhY21kID0gKHN0cnVjdCBhaGRfY21kICopY21kOworCXdoaWxlIChsaXN0X2NtZCAhPSBOVUxMCisJICAgICYmIGFjbWRfc2NzaV9jbWQobGlzdF9jbWQpLnNlcmlhbF9udW1iZXIKKwkgICAgIDwgYWNtZF9zY3NpX2NtZChhY21kKS5zZXJpYWxfbnVtYmVyKQorCQlsaXN0X2NtZCA9IFRBSUxRX05FWFQobGlzdF9jbWQsIGFjbWRfbGlua3MudHFlKTsKKwlpZiAobGlzdF9jbWQgIT0gTlVMTCkKKwkJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0X2NtZCwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCWVsc2UKKwkJVEFJTFFfSU5TRVJUX1RBSUwoY29tcGxldGVxLCBhY21kLCBhY21kX2xpbmtzLnRxZSk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZmlsdGVyX2lucXVpcnkoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8pCit7CisJc3RydWN0CXNjc2lfaW5xdWlyeV9kYXRhICpzaWQ7CisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdHJhbnNpbmZvICp1c2VyOworCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpnb2FsOworCXN0cnVjdAlhaGRfdHJhbnNpbmZvICpjdXJyOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0CWFoZF9saW51eF9kZXZpY2UgKmRldjsKKwl1X2ludAl3aWR0aDsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJb2Zmc2V0OworCXVfaW50CXBwcl9vcHRpb25zOworCXVfaW50CXRyYW5zX3ZlcnNpb247CisJdV9pbnQJcHJvdF92ZXJzaW9uOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhpcyBsdW4gYWN0dWFsbHkgZXhpc3RzLiAgSWYgc28sCisJICogaG9sZCBvbiB0byBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2Ugc3RydWN0dXJlLgorCSAqIElmIG5vdCwgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGRldmljZSBhbmQKKwkgKiBkb24ndCBib3RoZXIgcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGlzIGlucXVpcnkKKwkgKiBjb21tYW5kLgorCSAqLworCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKKwkJCQkgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKworCXNpZCA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilkZXYtPnRhcmdldC0+aW5xX2RhdGE7CisJaWYgKFNJRF9RVUFMKHNpZCkgPT0gU0lEX1FVQUxfTFVfQ09OTkVDVEVEKSB7CisKKwkJZGV2LT5mbGFncyAmPSB+QUhEX0RFVl9VTkNPTkZJR1VSRUQ7CisJfSBlbHNlIHsKKwkJZGV2LT5mbGFncyB8PSBBSERfREVWX1VOQ09ORklHVVJFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXBkYXRlIG91ciBub3Rpb24gb2YgdGhpcyBkZXZpY2UncyB0cmFuc2ZlcgorCSAqIG5lZ290aWF0aW9uIGNhcGFiaWxpdGllcy4KKwkgKi8KKwl0aW5mbyA9IGFoZF9mZXRjaF90cmFuc2luZm8oYWhkLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCXVzZXIgPSAmdGluZm8tPnVzZXI7CisJZ29hbCA9ICZ0aW5mby0+Z29hbDsKKwljdXJyID0gJnRpbmZvLT5jdXJyOworCXdpZHRoID0gdXNlci0+d2lkdGg7CisJcGVyaW9kID0gdXNlci0+cGVyaW9kOworCW9mZnNldCA9IHVzZXItPm9mZnNldDsKKwlwcHJfb3B0aW9ucyA9IHVzZXItPnBwcl9vcHRpb25zOworCXRyYW5zX3ZlcnNpb24gPSB1c2VyLT50cmFuc3BvcnRfdmVyc2lvbjsKKwlwcm90X3ZlcnNpb24gPSBNSU4odXNlci0+cHJvdG9jb2xfdmVyc2lvbiwgU0lEX0FOU0lfUkVWKHNpZCkpOworCisJLyoKKwkgKiBPbmx5IGF0dGVtcHQgU1BJMy80IG9uY2Ugd2UndmUgdmVyaWZpZWQgdGhhdAorCSAqIHRoZSBkZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQgU1BJMy80IGZlYXR1cmVzLgorCSAqLworCWlmIChwcm90X3ZlcnNpb24gPCBTQ1NJX1JFVl8yKQorCQl0cmFuc192ZXJzaW9uID0gU0lEX0FOU0lfUkVWKHNpZCk7CisJZWxzZQorCQl0cmFuc192ZXJzaW9uID0gU0NTSV9SRVZfMjsKKworCWlmICgoc2lkLT5mbGFncyAmIFNJRF9XQnVzMTYpID09IDApCisJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwlpZiAoKHNpZC0+ZmxhZ3MgJiBTSURfU3luYykgPT0gMCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCQlwcHJfb3B0aW9ucyA9IDA7CisJfQorCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfUUFTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfUUFTX1JFUTsKKwlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROworCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfSVVTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSAoTVNHX0VYVF9QUFJfRFRfUkVRCisJCQkgICAgICB8IE1TR19FWFRfUFBSX1FBU19SRVEpOworCisJaWYgKHByb3RfdmVyc2lvbiA+IFNDU0lfUkVWXzIKKwkgJiYgcHByX29wdGlvbnMgIT0gMCkKKwkJdHJhbnNfdmVyc2lvbiA9IHVzZXItPnRyYW5zcG9ydF92ZXJzaW9uOworCisJYWhkX3ZhbGlkYXRlX3dpZHRoKGFoZCwgLyp0aW5mbyBsaW1pdCovTlVMTCwgJndpZHRoLCBST0xFX1VOS05PV04pOworCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCBBSERfU1lOQ1JBVEVfTUFYKTsKKwlhaGRfdmFsaWRhdGVfb2Zmc2V0KGFoZCwgLyp0aW5mbyBsaW1pdCovTlVMTCwgcGVyaW9kLAorCQkJICAgICZvZmZzZXQsIHdpZHRoLCBST0xFX1VOS05PV04pOworCWlmIChvZmZzZXQgPT0gMCB8fCBwZXJpb2QgPT0gMCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCQlwcHJfb3B0aW9ucyA9IDA7CisJfQorCS8qIEFwcGx5IG91ciBmaWx0ZXJlZCB1c2VyIHNldHRpbmdzLiAqLworCWN1cnItPnRyYW5zcG9ydF92ZXJzaW9uID0gdHJhbnNfdmVyc2lvbjsKKwljdXJyLT5wcm90b2NvbF92ZXJzaW9uID0gcHJvdF92ZXJzaW9uOworCWFoZF9zZXRfd2lkdGgoYWhkLCBkZXZpbmZvLCB3aWR0aCwgQUhEX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJYWhkX3NldF9zeW5jcmF0ZShhaGQsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0LCBwcHJfb3B0aW9ucywKKwkJCSBBSERfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKK30KKwordm9pZAorYWhkX2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGQtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4rKzsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDEpIHsKKwkJc2NzaV9ibG9ja19yZXF1ZXN0cyhhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworCQlhaGRfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGQsIENBTV9UQVJHRVRfV0lMRENBUkQsIEFMTF9DSEFOTkVMUywKKwkJCQkJQ0FNX0xVTl9XSUxEQ0FSRCwgU0NCX0xJU1RfTlVMTCwKKwkJCQkJUk9MRV9JTklUSUFUT1IsIENBTV9SRVFVRVVFX1JFUSk7CisJfQorfQorCit2b2lkCithaGRfcmVsZWFzZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwl1X2xvbmcgczsKKwlpbnQgICAgdW5ibG9ja19yZXFzOworCisJdW5ibG9ja19yZXFzID0gMDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlpZiAoYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuLS07CisJaWYgKGFoZC0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAwKSB7CisJCXVuYmxvY2tfcmVxcyA9IDE7CisJfQorCWlmIChBSERfRFZfU0lNUV9GUk9aRU4oYWhkKQorCSAmJiAoKGFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0UpICE9IDApKSB7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIRF9EVl9XQUlUX1NJTVFfUkVMRUFTRTsKKwkJdXAoJmFoZC0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKwl9CisJYWhkX3NjaGVkdWxlX3J1bnEoYWhkKTsKKwlhaGRfdW5sb2NrKGFoZCwgJnMpOworCS8qCisJICogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGhlcmUuICBUaGUgbWlkLWxheWVyCisJICogc2hvdWxkIGtlZXAgaXRzIG93biBmcmVlemUgY291bnQgYW5kIHVzZQorCSAqIGEgYm90dG9tIGhhbGYgaGFuZGxlciB0byBydW4gdGhlIHF1ZXVlcworCSAqIHNvIHdlIGNhbiB1bmJsb2NrIHdpdGggb3VyIG93biBsb2NrIGhlbGQuCisJICovCisJaWYgKHVuYmxvY2tfcmVxcykKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoZC0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfc2VtX3RpbWVvdXQodV9sb25nIGFyZykKK3sKKwlzdHJ1Y3QJc2NiICpzY2I7CisJc3RydWN0CWFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZwlzOworCisJc2NiID0gKHN0cnVjdCBzY2IgKilhcmc7CisJYWhkID0gc2NiLT5haGRfc29mdGM7CisJYWhkX2xvY2soYWhkLCAmcyk7CisJaWYgKChzY2ItPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX1NDQl9VUF9FSF9TRU0pICE9IDApIHsKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmPSB+QUhEX1NDQl9VUF9FSF9TRU07CisJCXVwKCZhaGQtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJfQorCWFoZF91bmxvY2soYWhkLCAmcyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplKHVfbG9uZyBhcmcpCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CisJdV9sb25nIHM7CisKKwlkZXYgPSAoc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKilhcmc7CisJYWhkID0gZGV2LT50YXJnZXQtPmFoZDsKKwlhaGRfbG9jayhhaGQsICZzKTsKKwlkZXYtPmZsYWdzICY9IH5BSERfREVWX1RJTUVSX0FDVElWRTsKKwlpZiAoZGV2LT5xZnJvemVuID4gMCkKKwkJZGV2LT5xZnJvemVuLS07CisJaWYgKGRldi0+cWZyb3plbiA9PSAwCisJICYmIChkZXYtPmZsYWdzICYgQUhEX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkKKwkJYWhkX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoYWhkLCBkZXYpOworCWlmICgoZGV2LT5mbGFncyAmIEFIRF9ERVZfVU5DT05GSUdVUkVEKSAhPSAwCisJICYmIGRldi0+YWN0aXZlID09IDApCisJCWFoZF9saW51eF9mcmVlX2RldmljZShhaGQsIGRldik7CisJYWhkX3VubG9jayhhaGQsICZzKTsKK30KKwordm9pZAorYWhkX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldjsKKwlpbnQgdGFyZ2V0OworCWludCBtYXh0YXJnZXQ7CisJaW50IGx1bjsKKwlpbnQgaTsKKworCW1heHRhcmdldCA9IChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID8gMTUgOiA3OworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDw9bWF4dGFyZ2V0OyB0YXJnZXQrKykgeworCisJCWZvciAobHVuID0gMDsgbHVuIDwgQUhEX05VTV9MVU5TOyBsdW4rKykgeworCQkJc3RydWN0IGFoZF9jbWQgKmFjbWQ7CisKKwkJCWRldiA9IGFoZF9saW51eF9nZXRfZGV2aWNlKGFoZCwgMCwgdGFyZ2V0LAorCQkJCQkJICAgbHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXByaW50ZigiRGV2USglZDolZDolZCk6ICIsIDAsIHRhcmdldCwgbHVuKTsKKwkJCWkgPSAwOworCQkJVEFJTFFfRk9SRUFDSChhY21kLCAmZGV2LT5idXN5cSwgYWNtZF9saW5rcy50cWUpIHsKKwkJCQlpZiAoaSsrID4gQUhEX1NDQl9NQVgpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCIlZCB3YWl0aW5nXG4iLCBpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQKK2FoZF9saW51eF9pbml0KHZvaWQpCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXJldHVybiBhaGRfbGludXhfZGV0ZWN0KCZhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZSk7CisjZWxzZQorCXNjc2lfcmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOworCWlmIChhaWM3OXh4X2RyaXZlcl90ZW1wbGF0ZS5wcmVzZW50ID09IDApIHsKKwkJc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwKKwkJCQkgICAgICAgJmFpYzc5eHhfZHJpdmVyX3RlbXBsYXRlKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwlyZXR1cm4gKDApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorYWhkX2xpbnV4X2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQ7CisKKwkvKgorCSAqIFNodXRkb3duIERWIHRocmVhZHMgYmVmb3JlIGdvaW5nIGludG8gdGhlIFNDU0kgbWlkLWxheWVyLgorCSAqIFRoaXMgYXZvaWRzIHNpdHVhdGlvbnMgd2hlcmUgdGhlIG1pZC1sYXllciBsb2NrcyB0aGUgZW50aXJlCisJICoga2VybmVsIHNvIHRoYXQgd2FpdGluZyBmb3Igb3VyIERWIHRocmVhZHMgdG8gZXhpdCBsZWFkcworCSAqIHRvIGRlYWRsb2NrLgorCSAqLworCVRBSUxRX0ZPUkVBQ0goYWhkLCAmYWhkX3RhaWxxLCBsaW5rcykgeworCisJCWFoZF9saW51eF9raWxsX2R2X3RocmVhZChhaGQpOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCS8qCisJICogSW4gMi40IHdlIGhhdmUgdG8gdW5yZWdpc3RlciBmcm9tIHRoZSBQQ0kgY29yZSBfYWZ0ZXJfCisJICogdW5yZWdpc3RlcmluZyBmcm9tIHRoZSBzY3NpIG1pZGxheWVyIHRvIGF2b2lkIGRhbmdsaW5nCisJICogcmVmZXJlbmNlcy4KKwkgKi8KKwlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOworI2VuZGlmCisJYWhkX2xpbnV4X3BjaV9leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KGFoZF9saW51eF9pbml0KTsKK21vZHVsZV9leGl0KGFoZF9saW51eF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWY5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCkBAIC0wLDAgKzEsMTE0NyBAQAorLyoKKyAqIEFkYXB0ZWMgQUlDNzl4eCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oIzEzNyAkCisgKgorICovCisjaWZuZGVmIF9BSUM3OVhYX0xJTlVYX0hfCisjZGVmaW5lIF9BSUM3OVhYX0xJTlVYX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+IC8qIEZvciB0YXNrbGV0IHN1cHBvcnQuICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUlDX0xJQl9QUkVGSVggYWhkCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKy8qIE5hbWUgc3BhY2UgY29uZmxpY3Qgd2l0aCBCU0QgcXVldWUgbWFjcm9zICovCisjaWZkZWYgTElTVF9IRUFECisjdW5kZWYgTElTVF9IRUFECisjZW5kaWYKKworI2luY2x1ZGUgImNhbS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisjaW5jbHVkZSAic2NzaV9pdS5oIgorI2luY2x1ZGUgImFpY2xpYi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVidWdnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19BSUM3OVhYX0RFQlVHX0VOQUJMRQorI2lmZGVmIENPTkZJR19BSUM3OVhYX0RFQlVHX01BU0sKKyNkZWZpbmUgQUhEX0RFQlVHIDEKKyNkZWZpbmUgQUhEX0RFQlVHX09QVFMgQ09ORklHX0FJQzc5WFhfREVCVUdfTUFTSworI2Vsc2UKKy8qCisgKiBDb21waWxlIGluIGRlYnVnZ2luZyBjb2RlLCBidXQgZG8gbm90IGVuYWJsZSBhbnkgcHJpbnRmcy4KKyAqLworI2RlZmluZSBBSERfREVCVUcgMQorI2RlZmluZSBBSERfREVCVUdfT1BUUyAwCisjZW5kaWYKKy8qIE5vIGRlYnVnZ2luZyBjb2RlLiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1pc2MgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCXJvdW5kdXAoeCwgeSkgICAoKCgoeCkrKCh5KS0xKSkvKHkpKSooeSkpCisjZGVmaW5lCXBvd2Vyb2YyKHgpCSgoKCh4KS0xKSYoeCkpPT0wKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGb3J3YXJkIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoZF9zb2Z0YzsKK3R5cGVkZWYgc3RydWN0IHBjaV9kZXYgKmFoZF9kZXZfc29mdGNfdDsKK3R5cGVkZWYgU2NzaV9DbW5kICAgICAgKmFoZF9pb19jdHhfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnl0ZSBPcmRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgYWhkX2h0b2JlMTYoeCkJY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgYWhkX2h0b2JlMzIoeCkJY3B1X3RvX2JlMzIoeCkKKyNkZWZpbmUgYWhkX2h0b2JlNjQoeCkJY3B1X3RvX2JlNjQoeCkKKyNkZWZpbmUgYWhkX2h0b2xlMTYoeCkJY3B1X3RvX2xlMTYoeCkKKyNkZWZpbmUgYWhkX2h0b2xlMzIoeCkJY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgYWhkX2h0b2xlNjQoeCkJY3B1X3RvX2xlNjQoeCkKKworI2RlZmluZSBhaGRfYmUxNnRvaCh4KQliZTE2X3RvX2NwdSh4KQorI2RlZmluZSBhaGRfYmUzMnRvaCh4KQliZTMyX3RvX2NwdSh4KQorI2RlZmluZSBhaGRfYmU2NHRvaCh4KQliZTY0X3RvX2NwdSh4KQorI2RlZmluZSBhaGRfbGUxNnRvaCh4KQlsZTE2X3RvX2NwdSh4KQorI2RlZmluZSBhaGRfbGUzMnRvaCh4KQlsZTMyX3RvX2NwdSh4KQorI2RlZmluZSBhaGRfbGU2NHRvaCh4KQlsZTY0X3RvX2NwdSh4KQorCisjaWZuZGVmIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKworI2lmbmRlZiBCSUdfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4gNDMyMQorI2VuZGlmCisKKyNpZm5kZWYgQllURV9PUkRFUgorI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorI2RlZmluZSBCWVRFX09SREVSIEJJR19FTkRJQU4KKyNlbmRpZgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2VuZGlmIC8qIEJZVEVfT1JERVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ29uZmlndXJhdGlvbiBEYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB1aW50MzJfdCBhaWM3OXh4X2FsbG93X21lbWlvOworZXh0ZXJuIGludCBhaWM3OXh4X2RldGVjdF9jb21wbGV0ZTsKK2V4dGVybiBTY3NpX0hvc3RfVGVtcGxhdGUgYWljNzl4eF9kcml2ZXJfdGVtcGxhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCdXMgU3BhY2UvRE1BICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgdWludDMyX3QgYnVzX3NpemVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlCVVNfU1BBQ0VfTUVNSU8sCisJQlVTX1NQQUNFX1BJTworfSBidXNfc3BhY2VfdGFnX3Q7CisKK3R5cGVkZWYgdW5pb24geworCXVfbG9uZwkJICBpb3BvcnQ7CisJdm9sYXRpbGUgdWludDhfdCBfX2lvbWVtICptYWRkcjsKK30gYnVzX3NwYWNlX2hhbmRsZV90OworCit0eXBlZGVmIHN0cnVjdCBidXNfZG1hX3NlZ21lbnQKK3sKKwlkbWFfYWRkcl90CWRzX2FkZHI7CisJYnVzX3NpemVfdAlkc19sZW47Cit9IGJ1c19kbWFfc2VnbWVudF90OworCitzdHJ1Y3QgYWhkX2xpbnV4X2RtYV90YWcKK3sKKwlidXNfc2l6ZV90CWFsaWdubWVudDsKKwlidXNfc2l6ZV90CWJvdW5kYXJ5OworCWJ1c19zaXplX3QJbWF4c2l6ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBhaGRfbGludXhfZG1hX3RhZyogYnVzX2RtYV90YWdfdDsKKworc3RydWN0IGFoZF9saW51eF9kbWFtYXAKK3sKKwlkbWFfYWRkcl90CWJ1c19hZGRyOworfTsKK3R5cGVkZWYgc3RydWN0IGFoZF9saW51eF9kbWFtYXAqIGJ1c19kbWFtYXBfdDsKKwordHlwZWRlZiBpbnQgYnVzX2RtYV9maWx0ZXJfdCh2b2lkKiwgZG1hX2FkZHJfdCk7Cit0eXBlZGVmIHZvaWQgYnVzX2RtYW1hcF9jYWxsYmFja190KHZvaWQgKiwgYnVzX2RtYV9zZWdtZW50X3QgKiwgaW50LCBpbnQpOworCisjZGVmaW5lIEJVU19ETUFfV0FJVE9LCQkweDAKKyNkZWZpbmUgQlVTX0RNQV9OT1dBSVQJCTB4MQorI2RlZmluZSBCVVNfRE1BX0FMTE9DTk9XCTB4MgorI2RlZmluZSBCVVNfRE1BX0xPQURfU0VHUwkweDQJLyoKKwkJCQkJICogQXJndW1lbnQgaXMgYW4gUy9HIGxpc3Qgbm90CisJCQkJCSAqIGEgc2luZ2xlIGJ1ZmZlci4KKwkJCQkJICovCisKKyNkZWZpbmUgQlVTX1NQQUNFX01BWEFERFIJMHhGRkZGRkZGRgorI2RlZmluZSBCVVNfU1BBQ0VfTUFYQUREUl8zMkJJVAkweEZGRkZGRkZGCisjZGVmaW5lIEJVU19TUEFDRV9NQVhTSVpFXzMyQklUCTB4RkZGRkZGRkYKKworaW50CWFoZF9kbWFfdGFnX2NyZWF0ZShzdHJ1Y3QgYWhkX3NvZnRjICosIGJ1c19kbWFfdGFnX3QgLypwYXJlbnQqLywKKwkJCSAgIGJ1c19zaXplX3QgLyphbGlnbm1lbnQqLywgYnVzX3NpemVfdCAvKmJvdW5kYXJ5Ki8sCisJCQkgICBkbWFfYWRkcl90IC8qbG93YWRkciovLCBkbWFfYWRkcl90IC8qaGlnaGFkZHIqLywKKwkJCSAgIGJ1c19kbWFfZmlsdGVyX3QqLypmaWx0ZXIqLywgdm9pZCAqLypmaWx0ZXJhcmcqLywKKwkJCSAgIGJ1c19zaXplX3QgLyptYXhzaXplKi8sIGludCAvKm5zZWdtZW50cyovLAorCQkJICAgYnVzX3NpemVfdCAvKm1heHNlZ3N6Ki8sIGludCAvKmZsYWdzKi8sCisJCQkgICBidXNfZG1hX3RhZ190ICovKmRtYV90YWdwKi8pOworCit2b2lkCWFoZF9kbWFfdGFnX2Rlc3Ryb3koc3RydWN0IGFoZF9zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qdGFnKi8pOworCitpbnQJYWhkX2RtYW1lbV9hbGxvYyhzdHJ1Y3QgYWhkX3NvZnRjICosIGJ1c19kbWFfdGFnX3QgLypkbWF0Ki8sCisJCQkgdm9pZCoqIC8qdmFkZHIqLywgaW50IC8qZmxhZ3MqLywKKwkJCSBidXNfZG1hbWFwX3QqIC8qbWFwcCovKTsKKwordm9pZAlhaGRfZG1hbWVtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qZG1hdCovLAorCQkJdm9pZCogLyp2YWRkciovLCBidXNfZG1hbWFwX3QgLyptYXAqLyk7CisKK3ZvaWQJYWhkX2RtYW1hcF9kZXN0cm95KHN0cnVjdCBhaGRfc29mdGMgKiwgYnVzX2RtYV90YWdfdCAvKnRhZyovLAorCQkJICAgYnVzX2RtYW1hcF90IC8qbWFwKi8pOworCitpbnQJYWhkX2RtYW1hcF9sb2FkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYnVzX2RtYV90YWdfdCAvKmRtYXQqLywKKwkJCWJ1c19kbWFtYXBfdCAvKm1hcCovLCB2b2lkICogLypidWYqLywKKwkJCWJ1c19zaXplX3QgLypidWZsZW4qLywgYnVzX2RtYW1hcF9jYWxsYmFja190ICosCisJCQl2b2lkICovKmNhbGxiYWNrX2FyZyovLCBpbnQgLypmbGFncyovKTsKKworaW50CWFoZF9kbWFtYXBfdW5sb2FkKHN0cnVjdCBhaGRfc29mdGMgKiwgYnVzX2RtYV90YWdfdCwgYnVzX2RtYW1hcF90KTsKKworLyoKKyAqIE9wZXJhdGlvbnMgcGVyZm9ybWVkIGJ5IGFoZF9kbWFtYXBfc3luYygpLgorICovCisjZGVmaW5lIEJVU19ETUFTWU5DX1BSRVJFQUQJMHgwMQkvKiBwcmUtcmVhZCBzeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgQlVTX0RNQVNZTkNfUE9TVFJFQUQJMHgwMgkvKiBwb3N0LXJlYWQgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIEJVU19ETUFTWU5DX1BSRVdSSVRFCTB4MDQJLyogcHJlLXdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBCVVNfRE1BU1lOQ19QT1NUV1JJVEUJMHgwOAkvKiBwb3N0LXdyaXRlIHN5bmNocm9uaXphdGlvbiAqLworCisvKgorICogWFhYCisgKiBhaGRfZG1hbWFwX3N5bmMgaXMgb25seSB1c2VkIG9uIGJ1ZmZlcnMgYWxsb2NhdGVkIHdpdGgKKyAqIHRoZSBwY2lfYWxsb2NfY29uc2lzdGVudCgpIEFQSS4gIEFsdGhvdWdoIEknbSBub3Qgc3VyZSBob3cKKyAqIHRoaXMgd29ya3Mgb24gYXJjaGl0ZWN0dXJlcyB3aXRoIGEgd3JpdGUgYnVmZmVyLCBMaW51eCBkb2VzCisgKiBub3QgaGF2ZSBhbiBBUEkgdG8gc3luYyAiY29oZXJlbnQiIG1lbW9yeS4gIFBlcmhhcHMgd2UgbmVlZAorICogdG8gZG8gYW4gbWIoKT8KKyAqLworI2RlZmluZSBhaGRfZG1hbWFwX3N5bmMoYWhkLCBkbWFfdGFnLCBkbWFtYXAsIG9mZnNldCwgbGVuLCBvcCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFRpbWVyIERhdGFTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QgYWhkX3RpbWVyX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVAorI2RlZmluZSBBSUNfREVCVUdfUkVHSVNURVJTIDEKKyNlbHNlCisjZGVmaW5lIEFJQ19ERUJVR19SRUdJU1RFUlMgMAorI2VuZGlmCisjaW5jbHVkZSAiYWljNzl4eC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVGltZXIgRmFjaWxpdGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBhaGRfdGltZXJfaW5pdCBpbml0X3RpbWVyCisjZGVmaW5lIGFoZF90aW1lcl9zdG9wIGRlbF90aW1lcl9zeW5jCit0eXBlZGVmIHZvaWQgYWhkX2xpbnV4X2NhbGxiYWNrX3QgKHVfbG9uZyk7ICAKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGltZXIsIHVfaW50IHVzZWMsCisJCQkJICAgICBhaGRfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAqYXJnKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zY2JfdGltZXJfcmVzZXQoc3RydWN0IHNjYiAqc2NiLCB1X2ludCB1c2VjKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGltZXIsIHVfaW50IHVzZWMsIGFoZF9jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCisJYWhkID0gKHN0cnVjdCBhaGRfc29mdGMgKilhcmc7CisJZGVsX3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZGF0YSA9ICh1X2xvbmcpYXJnOworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArICh1c2VjICogSFopLzEwMDAwMDA7CisJdGltZXItPmZ1bmN0aW9uID0gKGFoZF9saW51eF9jYWxsYmFja190KilmdW5jOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfc2NiX3RpbWVyX3Jlc2V0KHN0cnVjdCBzY2IgKnNjYiwgdV9pbnQgdXNlYykKK3sKKwltb2RfdGltZXIoJnNjYi0+aW9fY3R4LT5laF90aW1lb3V0LCBqaWZmaWVzICsgKHVzZWMgKiBIWikvMTAwMDAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIHx8IGRlZmluZWQoU0NTSV9IQVNfSE9TVF9MT0NLKSkKKyNkZWZpbmUgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyAxCisjZWxzZQorI2RlZmluZSBBSERfU0NTSV9IQVNfSE9TVF9MT0NLIDAKKyNlbmRpZgorCisjZGVmaW5lIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04gIjEuMy4xMSIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRnJvbnQgRW5kIFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGNhc3QgdGhlIExpbnV4IHN0cnVjdCBzY3NpX2NtbmQgdG8gc29tZXRoaW5nCisgKiB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHF1ZXVlIG1hY3Jvcy4gIFRoZSBsaW51eCBzdHJ1Y3R1cmUgaGFzCisgKiBwbGVudHkgb2Ygc3BhY2UgdG8gaG9sZCB0aGUgbGlua3MgZmllbGRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBxdWV1ZQorICogbWFjcm9zLCBidXQgdGhlIHF1ZXVlIG1hY29ycyByZXF1aXJlIHRoZW0gdG8gaGF2ZSB0aGUgY29ycmVjdCB0eXBlLgorICovCitzdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbCB7CisJLyogQXJlYSBvd25lZCBieSB0aGUgTGludXggc2NzaSBsYXllci4gKi8KKwl1aW50OF90CXByaXZhdGVbb2Zmc2V0b2Yoc3RydWN0IHNjc2lfY21uZCwgU0NwLlN0YXR1cyldOworCXVuaW9uIHsKKwkJU1RBSUxRX0VOVFJZKGFoZF9jbWQpCXN0ZTsKKwkJTElTVF9FTlRSWShhaGRfY21kKQlsZTsKKwkJVEFJTFFfRU5UUlkoYWhkX2NtZCkJdHFlOworCX0gbGlua3M7CisJdWludDMyX3QJCQllbmQ7Cit9OworCitzdHJ1Y3QgYWhkX2NtZCB7CisJdW5pb24geworCQlzdHJ1Y3QgYWhkX2NtZF9pbnRlcm5hbAlpY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kCXNjc2lfY21kOworCX0gdW47Cit9OworCisjZGVmaW5lIGFjbWRfaWNtZChjbWQpICgoY21kKS0+dW4uaWNtZCkKKyNkZWZpbmUgYWNtZF9zY3NpX2NtZChjbWQpICgoY21kKS0+dW4uc2NzaV9jbWQpCisjZGVmaW5lIGFjbWRfbGlua3MgdW4uaWNtZC5saW5rcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldmljZSBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEEgcGVyIHByb2JlZCBkZXZpY2Ugc3RydWN0dXJlIHVzZWQgdG8gZGVhbCB3aXRoIHNvbWUgZXJyb3IgcmVjb3ZlcnkKKyAqIHNjZW5hcmlvcyB0aGF0IHRoZSBMaW51eCBtaWQtbGF5ZXIgY29kZSBqdXN0IGRvZXNuJ3Qga25vdyBob3cgdG8KKyAqIGhhbmRsZS4gIFRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciBhIGRldmljZSBvbmx5IGJlY29tZXMgcGVyc2lzdGVudAorICogYWZ0ZXIgYSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGlucXVpcnkgY29tbWFuZCB0byB0aGUgdGFyZ2V0IHdoZW4KKyAqIHRoYXQgaW5xdWlyeSBkYXRhIGluZGljYXRlcyBhIGx1biBpcyBwcmVzZW50LgorICovCitUQUlMUV9IRUFEKGFoZF9idXN5cSwgYWhkX2NtZCk7Cit0eXBlZGVmIGVudW0geworCUFIRF9ERVZfVU5DT05GSUdVUkVECSA9IDB4MDEsCisJQUhEX0RFVl9GUkVFWkVfVElMX0VNUFRZID0gMHgwMiwgLyogRnJlZXplIHF1ZXVlIHVudGlsIGFjdGl2ZSA9PSAwICovCisJQUhEX0RFVl9USU1FUl9BQ1RJVkUJID0gMHgwNCwgLyogT3VyIHRpbWVyIGlzIGFjdGl2ZSAqLworCUFIRF9ERVZfT05fUlVOX0xJU1QJID0gMHgwOCwgLyogUXVldWVkIHRvIGJlIHJ1biBsYXRlciAqLworCUFIRF9ERVZfUV9CQVNJQwkJID0gMHgxMCwgLyogQWxsb3cgYmFzaWMgZGV2aWNlIHF1ZXVpbmcgKi8KKwlBSERfREVWX1FfVEFHR0VECSA9IDB4MjAsIC8qIEFsbG93IGZ1bGwgU0NTSTIgY29tbWFuZCBxdWV1ZWluZyAqLworCUFIRF9ERVZfUEVSSU9ESUNfT1RBRwkgPSAweDQwLCAvKiBTZW5kIE9UQUcgdG8gcHJldmVudCBzdGFydmF0aW9uICovCisJQUhEX0RFVl9TTEFWRV9DT05GSUdVUkVEID0gMHg4MAkgLyogc2xhdmVfY29uZmlndXJlKCkgaGFzIGJlZW4gY2FsbGVkICovCit9IGFoZF9saW51eF9kZXZfZmxhZ3M7CisKK3N0cnVjdCBhaGRfbGludXhfdGFyZ2V0Oworc3RydWN0IGFoZF9saW51eF9kZXZpY2UgeworCVRBSUxRX0VOVFJZKGFoZF9saW51eF9kZXZpY2UpIGxpbmtzOworCXN0cnVjdAkJCWFoZF9idXN5cSBidXN5cTsKKworCS8qCisJICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgY3VycmVudGx5CisJICogcXVldWVkIHRvIHRoZSBkZXZpY2UuCisJICovCisJaW50CQkJYWN0aXZlOworCisJLyoKKwkgKiBUaGUgY3VycmVudGx5IGFsbG93ZWQgbnVtYmVyIG9mIAorCSAqIHRyYW5zYWN0aW9ucyB0aGF0IGNhbiBiZSBxdWV1ZWQgdG8KKwkgKiB0aGUgZGV2aWNlLiAgTXVzdCBiZSBzaWduZWQgZm9yCisJICogY29udmVyc2lvbiBmcm9tIHRhZ2dlZCB0byB1bnRhZ2dlZAorCSAqIG1vZGUgd2hlcmUgdGhlIGRldmljZSBtYXkgaGF2ZSBtb3JlCisJICogdGhhbiBvbmUgb3V0c3RhbmRpbmcgYWN0aXZlIHRyYW5zYWN0aW9uLgorCSAqLworCWludAkJCW9wZW5pbmdzOworCisJLyoKKwkgKiBBIHBvc2l0aXZlIGNvdW50IGluZGljYXRlcyB0aGF0IHRoaXMKKwkgKiBkZXZpY2UncyBxdWV1ZSBpcyBoYWx0ZWQuCisJICovCisJdV9pbnQJCQlxZnJvemVuOworCQorCS8qCisJICogQ3VtdWxhdGl2ZSBjb21tYW5kIGNvdW50ZXIuCisJICovCisJdV9sb25nCQkJY29tbWFuZHNfaXNzdWVkOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMgd2hlbgorCSAqIHJ1bm5pbmcgYXQgb3VyIGN1cnJlbnQgb3BlbmluZyBsZXZlbAorCSAqIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBieQorCSAqIHRoaXMgZGV2aWNlIHNpbmNlIHRoZSBsYXN0IFFVRVVFIEZVTEwuCisJICovCisJdV9pbnQJCQl0YWdfc3VjY2Vzc19jb3VudDsKKyNkZWZpbmUgQUhEX1RBR19TVUNDRVNTX0lOVEVSVkFMIDUwCisKKwlhaGRfbGludXhfZGV2X2ZsYWdzCWZsYWdzOworCisJLyoKKwkgKiBQZXIgZGV2aWNlIHRpbWVyLgorCSAqLworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCisJLyoKKwkgKiBUaGUgaGlnaCBsaW1pdCBmb3IgdGhlIHRhZ3MgdmFyaWFibGUuCisJICovCisJdV9pbnQJCQltYXh0YWdzOworCisJLyoKKwkgKiBUaGUgY29tcHV0ZWQgbnVtYmVyIG9mIHRhZ3Mgb3V0c3RhbmRpbmcKKwkgKiBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBRVUVVRSBGVUxMIGV2ZW50LgorCSAqLworCXVfaW50CQkJdGFnc19vbl9sYXN0X3F1ZXVlZnVsbDsKKworCS8qCisJICogSG93IG1hbnkgdGltZXMgd2UgaGF2ZSBzZWVuIGEgcXVldWUgZnVsbAorCSAqIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIHRhZ3MuICBUaGlzIGlzIHVzZWQKKwkgKiB0byBzdG9wIG91ciBhZGFwdGl2ZSBxdWV1ZSBkZXB0aCBhbGdvcml0aG0KKwkgKiBvbiBkZXZpY2VzIHdpdGggYSBmaXhlZCBudW1iZXIgb2YgdGFncy4KKwkgKi8KKwl1X2ludAkJCWxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQ7CisjZGVmaW5lIEFIRF9MT0NLX1RBR1NfQ09VTlQgNTAKKworCS8qCisJICogSG93IG1hbnkgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBxdWV1ZWQKKwkgKiB3aXRob3V0IHRoZSBkZXZpY2UgZ29pbmcgaWRsZS4gIFdlIHVzZQorCSAqIHRoaXMgc3RhdGlzdGljIHRvIGRldGVybWluZSB3aGVuIHRvIGlzc3VlCisJICogYW4gb3JkZXJlZCB0YWcgdG8gcHJldmVudCB0cmFuc2FjdGlvbgorCSAqIHN0YXJ2YXRpb24uICBUaGlzIHN0YXRpc3RpYyBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBpZiB0aGUgQUhEX0RFVl9QRVJJT0RJQ19PVEFHIGZsYWcgaXMgc2V0CisJICogb24gdGhpcyBkZXZpY2UuCisJICovCisJdV9pbnQJCQljb21tYW5kc19zaW5jZV9pZGxlX29yX290YWc7CisjZGVmaW5lIEFIRF9PVEFHX1RIUkVTSAk1MDAKKworCWludAkJCWx1bjsKKwlTY3NpX0RldmljZQkgICAgICAgKnNjc2lfZGV2aWNlOworCXN0cnVjdAkJCWFoZF9saW51eF90YXJnZXQgKnRhcmdldDsKK307CisKK3R5cGVkZWYgZW51bSB7CisJQUhEX0RWX1JFUVVJUkVECQkgPSAweDAxLAorCUFIRF9JTlFfVkFMSUQJCSA9IDB4MDIsCisJQUhEX0JBU0lDX0RWCQkgPSAweDA0LAorCUFIRF9FTkhBTkNFRF9EVgkJID0gMHgwOAorfSBhaGRfbGludXhfdGFyZ19mbGFnczsKKworLyogRFYgU3RhdGVzICovCit0eXBlZGVmIGVudW0geworCUFIRF9EVl9TVEFURV9FWElUID0gMCwKKwlBSERfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DLAorCUFIRF9EVl9TVEFURV9JTlFfQVNZTkMsCisJQUhEX0RWX1NUQVRFX0lOUV9BU1lOQ19WRVJJRlksCisJQUhEX0RWX1NUQVRFX1RVUiwKKwlBSERfRFZfU1RBVEVfUkVCRCwKKwlBSERfRFZfU1RBVEVfSU5RX1ZFUklGWSwKKwlBSERfRFZfU1RBVEVfV0VCLAorCUFIRF9EVl9TVEFURV9SRUIsCisJQUhEX0RWX1NUQVRFX1NVLAorCUFIRF9EVl9TVEFURV9CVVNZCit9IGFoZF9kdl9zdGF0ZTsKKworc3RydWN0IGFoZF9saW51eF90YXJnZXQgeworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlCSAqZGV2aWNlc1tBSERfTlVNX0xVTlNdOworCWludAkJCSAgY2hhbm5lbDsKKwlpbnQJCQkgIHRhcmdldDsKKwlpbnQJCQkgIHJlZmNvdW50OworCXN0cnVjdCBhaGRfdHJhbnNpbmZvCSAgbGFzdF90aW5mbzsKKwlzdHJ1Y3QgYWhkX3NvZnRjCSAqYWhkOworCWFoZF9saW51eF90YXJnX2ZsYWdzCSAgZmxhZ3M7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnFfZGF0YTsKKwkvKgorCSAqIFRoZSBuZXh0ICJmYWxsYmFjayIgcGVyaW9kIHRvIHVzZSBmb3IgbmFycm93L3dpZGUgdHJhbnNmZXJzLgorCSAqLworCXVpbnQ4X3QJCQkgIGR2X25leHRfbmFycm93X3BlcmlvZDsKKwl1aW50OF90CQkJICBkdl9uZXh0X3dpZGVfcGVyaW9kOworCXVpbnQ4X3QJCQkgIGR2X21heF93aWR0aDsKKwl1aW50OF90CQkJICBkdl9tYXhfcHByX29wdGlvbnM7CisJdWludDhfdAkJCSAgZHZfbGFzdF9wcHJfb3B0aW9uczsKKwl1X2ludAkJCSAgZHZfZWNob19zaXplOworCWFoZF9kdl9zdGF0ZQkJICBkdl9zdGF0ZTsKKwl1X2ludAkJCSAgZHZfc3RhdGVfcmV0cnk7CisJdWludDhfdAkJCSAqZHZfYnVmZmVyOworCXVpbnQ4X3QJCQkgKmR2X2J1ZmZlcjE7CisKKwkvKgorCSAqIEN1bXVsYXRpdmUgY291bnRlciBvZiBlcnJvcnMuCisJICovCisJdV9sb25nCQkJZXJyb3JzX2RldGVjdGVkOworCXVfbG9uZwkJCWNtZHNfc2luY2VfZXJyb3I7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqIERlZmluaXRpb25zIFJlcXVpcmVkIGJ5IHRoZSBDb3JlICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE51bWJlciBvZiBTRyBzZWdtZW50cyB3ZSByZXF1aXJlLiAgU28gbG9uZyBhcyB0aGUgUy9HIHNlZ21lbnRzIGZvcgorICogYSBwYXJ0aWN1bGFyIHRyYW5zYWN0aW9uIGFyZSBhbGxvY2F0ZWQgaW4gYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMKKyAqIG1hbm5lciBhbmQgYXJlIGFsbG9jYXRlZCBiZWxvdyA0R0IsIHRoZSBudW1iZXIgb2YgUy9HIHNlZ21lbnRzIGlzCisgKiB1bnJlc3RyaWN0ZWQuCisgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qCisgKiBXZSBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiBwcmUtMi41IGtlcm5lbHMgdG8KKyAqIGF2b2lkIGZyYWdtZW50YXRpb24gaXNzdWVzIGluIHRoZSBTQ1NJIG1pZC1sYXllcidzIHByaXZhdGUgbWVtb3J5CisgKiBhbGxvY2F0b3IuICBTZWUgYWljNzl4eF9vc20uYyBhaGRfbGludXhfc2l6ZV9uc2VnKCkgZm9yIGRldGFpbHMuCisgKi8KK2V4dGVybiB1X2ludCBhaGRfbGludXhfbnNlZzsKKyNkZWZpbmUJQUhEX05TRUcgYWhkX2xpbnV4X25zZWcKKyNkZWZpbmUJQUhEX0xJTlVYX01JTl9OU0VHIDY0CisjZWxzZQorI2RlZmluZQlBSERfTlNFRyAxMjgKKyNlbmRpZgorCisvKgorICogUGVyLVNDQiBPU00gc3RvcmFnZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSERfU0NCX1VQX0VIX1NFTSA9IDB4MQorfSBhaGRfbGludXhfc2NiX2ZsYWdzOworCitzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBhaGRfbGludXhfZGV2aWNlCSpkZXY7CisJZG1hX2FkZHJfdAkJIGJ1Zl9idXNhZGRyOworCXVpbnQzMl90CQkgeGZlcl9sZW47CisJdWludDMyX3QJCSBzZW5zZV9yZXNpZDsJLyogQXV0by1TZW5zZSByZXNpZHVhbCAqLworCWFoZF9saW51eF9zY2JfZmxhZ3MJIGZsYWdzOworfTsKKworLyoKKyAqIERlZmluZSBhIHN0cnVjdHVyZSB1c2VkIGZvciBlYWNoIGhvc3QgYWRhcHRlci4gIEFsbCBtZW1iZXJzIGFyZQorICogYWxpZ25lZCBvbiBhIGJvdW5kYXJ5ID49IHRoZSBzaXplIG9mIHRoZSBtZW1iZXIgdG8gaG9ub3IgdGhlCisgKiBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIG9mIHRoZSB2YXJpb3VzIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkKKyAqIHRoaXMgZHJpdmVyLgorICovCit0eXBlZGVmIGVudW0geworCUFIRF9EVl9XQUlUX1NJTVFfRU1QVFkJID0gMHgwMSwKKwlBSERfRFZfV0FJVF9TSU1RX1JFTEVBU0UgPSAweDAyLAorCUFIRF9EVl9BQ1RJVkUJCSA9IDB4MDQsCisJQUhEX0RWX1NIVVRET1dOCQkgPSAweDA4LAorCUFIRF9SVU5fQ01QTFRfUV9USU1FUgkgPSAweDEwCit9IGFoZF9saW51eF9zb2Z0Y19mbGFnczsKKworVEFJTFFfSEVBRChhaGRfY29tcGxldGVxLCBhaGRfY21kKTsKKworc3RydWN0IGFoZF9wbGF0Zm9ybV9kYXRhIHsKKwkvKgorCSAqIEZpZWxkcyBhY2Nlc3NlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorCSAqLworCXN0cnVjdCBhaGRfbGludXhfdGFyZ2V0ICp0YXJnZXRzW0FIRF9OVU1fVEFSR0VUU107IAorCVRBSUxRX0hFQUQoLCBhaGRfbGludXhfZGV2aWNlKSBkZXZpY2VfcnVucTsKKwlzdHJ1Y3QgYWhkX2NvbXBsZXRlcQkgY29tcGxldGVxOworCisJc3BpbmxvY2tfdAkJIHNwaW5fbG9jazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJIHJ1bnFfdGFza2xldDsKKwl1X2ludAkJCSBxZnJvemVuOworCXBpZF90CQkJIGR2X3BpZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgY29tcGxldGVxX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CSByZXNldF90aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgc3RhdHNfdGltZXI7CisJc3RydWN0IHNlbWFwaG9yZQkgZWhfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUJIGR2X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCSBkdl9jbWRfc2VtOwkvKiBYWFggVGhpcyBuZWVkcyB0byBiZSBpbgorCQkJCQkJICogdGhlIHRhcmdldCBzdHJ1Y3QKKwkJCQkJCSAqLworCXN0cnVjdCBzY3NpX2RldmljZQkqZHZfc2NzaV9kZXY7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgKmhvc3Q7CQkvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLworI2RlZmluZSBBSERfTElOVVhfTk9JUlEJKCh1aW50MzJfdCl+MCkKKwl1aW50MzJfdAkJIGlycTsJCS8qIElSUSBmb3IgdGhpcyBhZGFwdGVyICovCisJdWludDMyX3QJCSBiaW9zX2FkZHJlc3M7CisJdWludDMyX3QJCSBtZW1fYnVzYWRkcjsJLyogTWVtIEJhc2UgQWRkciAqLworCXVpbnQ2NF90CQkgaHdfZG1hX21hc2s7CisJYWhkX2xpbnV4X3NvZnRjX2ZsYWdzCSBmbGFnczsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBPUyBVdGlsaXR5IFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIHByaW50ZiBwcmludGsKKyNkZWZpbmUgTV9OT1dBSVQgR0ZQX0FUT01JQworI2RlZmluZSBNX1dBSVRPSyAwCisjZGVmaW5lIG1hbGxvYyhzaXplLCB0eXBlLCBmbGFncykga21hbGxvYyhzaXplLCBmbGFncykKKyNkZWZpbmUgZnJlZShwdHIsIHR5cGUpIGtmcmVlKHB0cikKKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2RlbGF5KGxvbmcpOworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9kZWxheShsb25nIHVzZWMpCit7CisJLyoKKwkgKiB1ZGVsYXkgb24gTGludXggY2FuIGhhdmUgcHJvYmxlbXMgZm9yCisJICogbXVsdGktbWlsbGlzZWNvbmQgd2FpdHMuICBXYWl0IGF0IG1vc3QKKwkgKiAxMDI0dXMgcGVyIGNhbGwuCisJICovCisJd2hpbGUgKHVzZWMgPiAwKSB7CisJCXVkZWxheSh1c2VjICUgMTAyNCk7CisJCXVzZWMgLT0gMTAyNDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvdyBMZXZlbCBJL08gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB1aW50OF90IGFoZF9pbmIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB1aW50MTZfdCBhaGRfaW53X2F0b21pYyhzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX291dGIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50OF90IHZhbCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwKKwkJCQkgICAgIGxvbmcgcG9ydCwgdWludDE2X3QgdmFsKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9vdXRzYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQsCisJCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2luc2Ioc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LAorCQkJICAgICAgIHVpbnQ4X3QgKiwgaW50IGNvdW50KTsKKworc3RhdGljIF9faW5saW5lIHVpbnQ4X3QKK2FoZF9pbmIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KQoreworCXVpbnQ4X3QgeDsKKworCWlmIChhaGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPKSB7CisJCXggPSByZWFkYihhaGQtPmJzaHNbMF0ubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQl4ID0gaW5iKGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKChwb3J0KSAmIDB4RkYpKTsKKwl9CisJbWIoKTsKKwlyZXR1cm4gKHgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDE2X3QKK2FoZF9pbndfYXRvbWljKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCkKK3sKKwl1aW50OF90IHg7CisKKwlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFDRV9NRU1JTykgeworCQl4ID0gcmVhZHcoYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJeCA9IGludyhhaGQtPmJzaHNbKHBvcnQpID4+IDhdLmlvcG9ydCArICgocG9ydCkgJiAweEZGKSk7CisJfQorCW1iKCk7CisJcmV0dXJuICh4KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9vdXRiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpCit7CisJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJd3JpdGViKHZhbCwgYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJb3V0Yih2YWwsIGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKHBvcnQgJiAweEZGKSk7CisJfQorCW1iKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50MTZfdCB2YWwpCit7CisJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJd3JpdGV3KHZhbCwgYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJb3V0dyh2YWwsIGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKHBvcnQgJiAweEZGKSk7CisJfQorCW1iKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfb3V0c2Ioc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50OF90ICphcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCisJLyoKKwkgKiBUaGVyZSBpcyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIG9uIExpbnV4CisJICogYnV0IHdlIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZyBzcGVlZCBjcml0aWNhbCBhbmQgdGhpcworCSAqIHNob3VsZCB3b3JrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlhaGRfb3V0YihhaGQsIHBvcnQsICphcnJheSsrKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9pbnNiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhfdCAqYXJyYXksIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogVGhlcmUgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBvbiBMaW51eAorCSAqIGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgc3BlZWQgY3JpdGljYWwgYW5kIHRoaXMKKwkgKiBzaG91bGQgd29yay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJKmFycmF5KysgPSBhaGRfaW5iKGFoZCwgcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCWFoZF9saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkJU2NzaV9Ib3N0X1RlbXBsYXRlICopOworCit1aW50NjRfdAlhaGRfbGludXhfZ2V0X21lbXNpemUodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJldHR5IFByaW50aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW5mb19zdHIgeworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgbGVuZ3RoOworCW9mZl90IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKwordm9pZAlhaGRfZm9ybWF0X3RyYW5zaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NraW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NrIHByb3RlY3RpbmcgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbG9ja2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3VubG9jayhzdHJ1Y3QgYWhkX3NvZnRjICosIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKKworLyogTG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBvZiB0aGUgYWJvdmUgbG9jayBpbiBtaWRsYXllciBlbnRyeSBwb2ludHMuICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwKKwkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncyk7CisKKy8qIExvY2sgaGVsZCBkdXJpbmcgY29tbWFuZCBjb21wZWxldGlvbiB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9kb25lX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZG9uZV9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCisvKiBMb2NrIGhlbGQgZHVyaW5nIGFoZF9saXN0IG1hbmlwdWxhdGlvbiBhbmQgYWhkIHNvZnRjIGZyZWVzICovCitleHRlcm4gc3BpbmxvY2tfdCBhaGRfbGlzdF9zcGlubG9jazsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saXN0X2xvY2tpbml0KHZvaWQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2xvY2soc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhkLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJLyoKKwkgKiBJbiAyLjUuWCBhbmQgc29tZSAyLjQuWCB2ZXJzaW9ucywgdGhlIG1pZGxheWVyIHRha2VzIG91cgorCSAqIGxvY2sganVzdCBiZWZvcmUgY2FsbGluZyB1cywgc28gd2UgYXZvaWQgbG9ja2luZyBhZ2Fpbi4KKwkgKiBGb3Igb3RoZXIga2VybmVsIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuCisJICoganVzdCBiZWZvcmUgb3VyIGVudHJ5IHBvaW50IGlzIGNhbGxlZC4gIEluIHRoaXMgY2FzZSwgd2UKKwkgKiB0cmFkZSB0aGUgaW9fcmVxdWVzdF9sb2NrIGZvciBvdXIgcGVyLXNvZnRjIGxvY2suCisJICovCisjaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCisJc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fdW5sb2NrKCZhaGQtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJc3Bpbl9sb2NrKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfZG9uZV9sb2NraW5pdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyoKKwkgKiBJbiAyLjUuWCwgb3VyIG93biBsb2NrIGlzIGhlbGQgZHVyaW5nIGNvbXBsZXRpb25zLgorCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHVzZWQuCisJICogSW4gZWl0aGVyIGNhc2UsIHdlIGNhbid0IGluaXRpYWxpemUgdGhpcyBsb2NrIGFnYWluLgorCSAqLworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2RvbmVfbG9jayhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIRF9TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fbG9jaygmaW9fcmVxdWVzdF9sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisjaWYgQUhEX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCisJc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saXN0X2xvY2tpbml0KHZvaWQpCit7CisJc3Bpbl9sb2NrX2luaXQoJmFoZF9saXN0X3NwaW5sb2NrKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9saXN0X2xvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFoZF9saXN0X3NwaW5sb2NrLCAqZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2xpc3RfdW5sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFoZF9saXN0X3NwaW5sb2NrLCAqZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFBDSU1feHh4OiBtYXNrIHRvIGxvY2F0ZSBzdWJmaWVsZCBpbiByZWdpc3RlcgorICogUENJUl94eHg6IGNvbmZpZyByZWdpc3RlciBvZmZzZXQKKyAqIFBDSUNfeHh4OiBkZXZpY2UgY2xhc3MKKyAqIFBDSVNfeHh4OiBkZXZpY2Ugc3ViY2xhc3MKKyAqIFBDSVBfeHh4OiBkZXZpY2UgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlCisgKiBQQ0lWX3h4eDogUENJIHZlbmRvciBJRCAob25seSByZXF1aXJlZCB0byBmaXh1cCBhbmNpZW50IGRldmljZXMpCisgKiBQQ0lEX3h4eDogZGV2aWNlIElECisgKi8KKyNkZWZpbmUgUENJUl9ERVZWRU5ET1IJCTB4MDAKKyNkZWZpbmUgUENJUl9WRU5ET1IJCTB4MDAKKyNkZWZpbmUgUENJUl9ERVZJQ0UJCTB4MDIKKyNkZWZpbmUgUENJUl9DT01NQU5ECQkweDA0CisjZGVmaW5lIFBDSU1fQ01EX1BPUlRFTgkJMHgwMDAxCisjZGVmaW5lIFBDSU1fQ01EX01FTUVOCQkweDAwMDIKKyNkZWZpbmUgUENJTV9DTURfQlVTTUFTVEVSRU4JMHgwMDA0CisjZGVmaW5lIFBDSU1fQ01EX01XUklDRU4JMHgwMDEwCisjZGVmaW5lIFBDSU1fQ01EX1BFUlJFU1BFTgkweDAwNDAKKyNkZWZpbmUJUENJTV9DTURfU0VSUkVTUEVOCTB4MDEwMAorI2RlZmluZSBQQ0lSX1NUQVRVUwkJMHgwNgorI2RlZmluZSBQQ0lSX1JFVklECQkweDA4CisjZGVmaW5lIFBDSVJfUFJPR0lGCQkweDA5CisjZGVmaW5lIFBDSVJfU1VCQ0xBU1MJCTB4MGEKKyNkZWZpbmUgUENJUl9DTEFTUwkJMHgwYgorI2RlZmluZSBQQ0lSX0NBQ0hFTE5TWgkJMHgwYworI2RlZmluZSBQQ0lSX0xBVFRJTUVSCQkweDBkCisjZGVmaW5lIFBDSVJfSEVBREVSVFlQRQkJMHgwZQorI2RlZmluZSBQQ0lNX01GREVWCQkweDgwCisjZGVmaW5lIFBDSVJfQklTVAkJMHgwZgorI2RlZmluZSBQQ0lSX0NBUF9QVFIJCTB4MzQKKworLyogY29uZmlnIHJlZ2lzdGVycyBmb3IgaGVhZGVyIHR5cGUgMCBkZXZpY2VzICovCisjZGVmaW5lIFBDSVJfTUFQUwkweDEwCisjZGVmaW5lIFBDSVJfU1VCVkVORF8wCTB4MmMKKyNkZWZpbmUgUENJUl9TVUJERVZfMAkweDJlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENJLVggZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBDSVhSX0NPTU1BTkQJMHg5NgorI2RlZmluZSBQQ0lYUl9ERVZBRERSCTB4OTgKKyNkZWZpbmUgUENJWE1fREVWQUREUl9GTlVNCTB4MDAwMwkvKiBGdW5jdGlvbiBOdW1iZXIgKi8KKyNkZWZpbmUgUENJWE1fREVWQUREUl9ETlVNCTB4MDBGOAkvKiBEZXZpY2UgTnVtYmVyICovCisjZGVmaW5lIFBDSVhNX0RFVkFERFJfQk5VTQkweEZGMDAJLyogQnVzIE51bWJlciAqLworI2RlZmluZSBQQ0lYUl9TVEFUVVMJMHg5QQorI2RlZmluZSBQQ0lYTV9TVEFUVVNfNjRCSVQJMHgwMDAxCS8qIEFjdGl2ZSA2NGJpdCBjb25uZWN0aW9uIHRvIGRldmljZS4gKi8KKyNkZWZpbmUgUENJWE1fU1RBVFVTXzEzM0NBUAkweDAwMDIJLyogRGV2aWNlIGlzIDEzM01IeiBjYXBhYmxlICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19TQ0RJU0MJMHgwMDA0CS8qIFNwbGl0IENvbXBsZXRpb24gRGlzY2FyZGVkICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19VTkVYUFNDCTB4MDAwOAkvKiBVbmV4cGVjdGVkIFNwbGl0IENvbXBsZXRpb24gKi8KKyNkZWZpbmUgUENJWE1fU1RBVFVTX0NNUExFWERFVgkweDAwMTAJLyogRGV2aWNlIENvbXBsZXhpdHkgKHNldCA9PSBicmlkZ2UpICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhNUkRCQwkweDAwNjAJLyogTWF4aW11bSBCdXJzdCBSZWFkIENvdW50ICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhTUExJVFMJMHgwMzgwCS8qIE1heGltdW0gU3BsaXQgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19NQVhDUkRTCTB4MUMwMAkvKiBNYXhpbXVtIEN1bXVsYXRpdmUgUmVhZCBTaXplICovCisjZGVmaW5lIFBDSVhNX1NUQVRVU19SQ1ZEU0NFTQkweDIwMDAJLyogUmVjZWl2ZWQgYSBTcGxpdCBDb21wIHcvRXJyb3IgbXNnICovCisKK2V4dGVybiBzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3OXh4X3BjaV9kcml2ZXI7CisKK3R5cGVkZWYgZW51bQoreworCUFIRF9QT1dFUl9TVEFURV9EMCwKKwlBSERfUE9XRVJfU1RBVEVfRDEsCisJQUhEX1BPV0VSX1NUQVRFX0QyLAorCUFIRF9QT1dFUl9TVEFURV9EMworfSBhaGRfcG93ZXJfc3RhdGU7CisKK3ZvaWQgYWhkX3Bvd2VyX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgYWhkX3Bvd2VyX3N0YXRlIG5ld19zdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCQkgYWhkX2xpbnV4X3BjaV9pbml0KHZvaWQpOwordm9pZAkJCSBhaGRfbGludXhfcGNpX2V4aXQodm9pZCk7CitpbnQJCQkgYWhkX3BjaV9tYXBfcmVnaXN0ZXJzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitpbnQJCQkgYWhkX3BjaV9tYXBfaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZF9kZXZfc29mdGNfdCBwY2ksCisJCQkJCSAgICAgaW50IHJlZywgaW50IHdpZHRoKTsKKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CithaGRfcGNpX3JlYWRfY29uZmlnKGFoZF9kZXZfc29mdGNfdCBwY2ksIGludCByZWcsIGludCB3aWR0aCkKK3sKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxOgorCXsKKwkJdWludDhfdCByZXR2YWw7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWNhc2UgMjoKKwl7CisJCXVpbnQxNl90IHJldHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWNhc2UgNDoKKwl7CisJCXVpbnQzMl90IHJldHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaSwgcmVnLCAmcmV0dmFsKTsKKwkJcmV0dXJuIChyZXR2YWwpOworCX0KKwlkZWZhdWx0OgorCQlwYW5pYygiYWhkX3BjaV9yZWFkX2NvbmZpZzogUmVhZCBzaXplIHRvbyBiaWciKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCQlyZXR1cm4gKDApOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3BjaV93cml0ZV9jb25maWcoYWhkX2Rldl9zb2Z0Y190IHBjaSwKKwkJCQkJICBpbnQgcmVnLCB1aW50MzJfdCB2YWx1ZSwKKwkJCQkJICBpbnQgd2lkdGgpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3BjaV93cml0ZV9jb25maWcoYWhkX2Rldl9zb2Z0Y190IHBjaSwgaW50IHJlZywgdWludDMyX3QgdmFsdWUsIGludCB3aWR0aCkKK3sKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSAxOgorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaSwgcmVnLCB2YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJhaGRfcGNpX3dyaXRlX2NvbmZpZzogV3JpdGUgc2l6ZSB0b28gYmlnIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhkX2dldF9wY2lfZnVuY3Rpb24oYWhkX2Rldl9zb2Z0Y190KTsKK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZF9kZXZfc29mdGNfdCBwY2kpCit7CisJcmV0dXJuIChQQ0lfRlVOQyhwY2ktPmRldmZuKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhkX2dldF9wY2lfc2xvdChhaGRfZGV2X3NvZnRjX3QpOworc3RhdGljIF9faW5saW5lIGludAorYWhkX2dldF9wY2lfc2xvdChhaGRfZGV2X3NvZnRjX3QgcGNpKQoreworCXJldHVybiAoUENJX1NMT1QocGNpLT5kZXZmbikpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IGFoZF9nZXRfcGNpX2J1cyhhaGRfZGV2X3NvZnRjX3QpOworc3RhdGljIF9faW5saW5lIGludAorYWhkX2dldF9wY2lfYnVzKGFoZF9kZXZfc29mdGNfdCBwY2kpCit7CisJcmV0dXJuIChwY2ktPmJ1cy0+bnVtYmVyKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoc3RydWN0IGFoZF9zb2Z0YyAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfZmx1c2hfZGV2aWNlX3dyaXRlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJLyogWFhYIElzIHRoaXMgc3VmZmljaWVudCBmb3IgYWxsIGFyY2hpdGVjdHVyZXM/Pz8gKi8KKwlhaGRfaW5iKGFoZCwgSU5UU1RBVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb2MgRlMgU3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCitpbnQJYWhkX2xpbnV4X3Byb2NfaW5mbyhjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCwgaW50KTsKKyNlbHNlCitpbnQJYWhkX2xpbnV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwKKwkJCSAgICBvZmZfdCwgaW50LCBpbnQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRG9tYWluIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFIRF9EVl9DTUQoY21kKSAoKGNtZCktPnNjc2lfZG9uZSA9PSBhaGRfbGludXhfZHZfY29tcGxldGUpCisjZGVmaW5lIEFIRF9EVl9TSU1RX0ZST1pFTihhaGQpCQkJCQlcCisJKCgoKGFoZCktPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhEX0RWX0FDVElWRSkgIT0gMCkJXAorCSAmJiAoYWhkKS0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAxKQorCisvKioqKioqKioqKioqKioqKioqKioqKiogVHJhbnNhY3Rpb24gQWNjZXNzIFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICosIHVpbnQzMl90KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfY21kX2dldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhkX2dldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NiICopOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldF90cmFuc2FjdGlvbl90YWcoc3RydWN0IHNjYiAqLCBpbnQsIHVfaW50KTsKK3N0YXRpYyBfX2lubGluZSB1X2xvbmcgYWhkX2dldF90cmFuc2Zlcl9sZW5ndGgoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhkX2dldF90cmFuc2Zlcl9kaXIoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqLCB1X2xvbmcpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3NldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IsIHVfbG9uZyByZXNpZCk7CitzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoZF9nZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB1X2xvbmcgYWhkX2dldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICopOworc3RhdGljIF9faW5saW5lIGludCBhaGRfcGVyZm9ybV9hdXRvc2Vuc2Uoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGRfZ2V0X3NlbnNlX2J1ZnNpemUoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkgICAgICAgc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9ub3RpZnlfeGZlcl9zZXR0aW5nc19jaGFuZ2Uoc3RydWN0IGFoZF9zb2Z0YyAqLAorCQkJCQkJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfcGxhdGZvcm1fc2NiX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2ZyZWV6ZV9zY2Ioc3RydWN0IHNjYiAqc2NiKTsKKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQoreworCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX1NUQVRVU19NQVNLIDw8IDE2KTsKKwljbWQtPnJlc3VsdCB8PSBzdGF0dXMgPDwgMTY7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlhaGRfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLT5pb19jdHgsc3RhdHVzKTsKK30KKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kLCB1aW50MzJfdCBzdGF0dXMpCit7CisJY21kLT5yZXN1bHQgJj0gfjB4RkZGRjsKKwljbWQtPnJlc3VsdCB8PSBzdGF0dXM7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKnNjYiwgdWludDMyX3Qgc3RhdHVzKQoreworCWFoZF9jbWRfc2V0X3Njc2lfc3RhdHVzKHNjYi0+aW9fY3R4LCBzdGF0dXMpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gKChjbWQtPnJlc3VsdCA+PiAxNikgJiBDQU1fU1RBVFVTX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKGFoZF9jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2ItPmlvX2N0eCkpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9jbWRfZ2V0X3Njc2lfc3RhdHVzKFNjc2lfQ21uZCAqY21kKQoreworCXJldHVybiAoY21kLT5yZXN1bHQgJiAweEZGRkYpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VpbnQzMl90IGFoZF9nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoYWhkX2NtZF9nZXRfc2NzaV9zdGF0dXMoc2NiLT5pb19jdHgpKTsKK30KKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9zZXRfdHJhbnNhY3Rpb25fdGFnKHN0cnVjdCBzY2IgKnNjYiwgaW50IGVuYWJsZWQsIHVfaW50IHR5cGUpCit7CisJLyoKKwkgKiBOb3RoaW5nIHRvIGRvIGZvciBsaW51eCBhcyB0aGUgaW5jb21pbmcgdHJhbnNhY3Rpb24KKwkgKiBoYXMgbm8gY29uY2VwdCBvZiB0YWcvbm9uIHRhZ2dlZCwgZXRjLgorCSAqLworfQorCitzdGF0aWMgX19pbmxpbmUKK3VfbG9uZyBhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuKTsKK30KKworc3RhdGljIF9faW5saW5lCitpbnQgYWhkX2dldF90cmFuc2Zlcl9kaXIoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5pb19jdHgtPnNjX2RhdGFfZGlyZWN0aW9uKTsKK30KKworc3RhdGljIF9faW5saW5lCit2b2lkIGFoZF9zZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqc2NiLCB1X2xvbmcgcmVzaWQpCit7CisJc2NiLT5pb19jdHgtPnJlc2lkID0gcmVzaWQ7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGRfc2V0X3NlbnNlX3Jlc2lkdWFsKHN0cnVjdCBzY2IgKnNjYiwgdV9sb25nIHJlc2lkKQoreworCXNjYi0+cGxhdGZvcm1fZGF0YS0+c2Vuc2VfcmVzaWQgPSByZXNpZDsKK30KKworc3RhdGljIF9faW5saW5lCit1X2xvbmcgYWhkX2dldF9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChzY2ItPmlvX2N0eC0+cmVzaWQpOworfQorCitzdGF0aWMgX19pbmxpbmUKK3VfbG9uZyBhaGRfZ2V0X3NlbnNlX3Jlc2lkdWFsKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNjYi0+cGxhdGZvcm1fZGF0YS0+c2Vuc2VfcmVzaWQpOworfQorCitzdGF0aWMgX19pbmxpbmUKK2ludCBhaGRfcGVyZm9ybV9hdXRvc2Vuc2Uoc3RydWN0IHNjYiAqc2NiKQoreworCS8qCisJICogV2UgYWx3YXlzIHBlcmZvcm0gYXV0b3NlbnNlIGluIExpbnV4LgorCSAqIE9uIG90aGVyIHBsYXRmb3JtcyB0aGlzIGlzIHNldCBvbiBhCisJICogcGVyLXRyYW5zYWN0aW9uIGJhc2lzLgorCSAqLworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhkX2dldF9zZW5zZV9idWZzaXplKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9ub3RpZnlfeGZlcl9zZXR0aW5nc19jaGFuZ2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCXN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgZm9yIGxpbnV4ICovCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGRfcGxhdGZvcm1fc2NiX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJYWhkLT5mbGFncyAmPSB+QUhEX1JFU09VUkNFX1NIT1JUQUdFOworfQorCitpbnQJYWhkX3BsYXRmb3JtX2FsbG9jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdm9pZCAqcGxhdGZvcm1fYXJnKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2luaXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2ZyZWV6ZV9kZXZxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKTsKK3ZvaWQJYWhkX2ZyZWV6ZV9zaW1xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCWFoZF9yZWxlYXNlX3NpbXEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoZF9mcmVlemVfc2NiKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpZiAoKHNjYi0+aW9fY3R4LT5yZXN1bHQgJiAoQ0FNX0RFVl9RRlJaTiA8PCAxNikpID09IDApIHsKKyAgICAgICAgICAgICAgICBzY2ItPmlvX2N0eC0+cmVzdWx0IHw9IENBTV9ERVZfUUZSWk4gPDwgMTY7CisgICAgICAgICAgICAgICAgc2NiLT5wbGF0Zm9ybV9kYXRhLT5kZXYtPnFmcm96ZW4rKzsKKyAgICAgICAgfQorfQorCit2b2lkCWFoZF9wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIGFoZF9xdWV1ZV9hbGcpOworaW50CWFoZF9wbGF0Zm9ybV9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwKKwkJCQljaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywKKwkJCQlyb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKTsKK2lycXJldHVybl90CisJYWhkX2xpbnV4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7Cit2b2lkCWFoZF9wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK2ludAlhaGRfc29mdGNfY29tcChzdHJ1Y3QgYWhkX3NvZnRjICosIHN0cnVjdCBhaGRfc29mdGMgKik7Cit2b2lkCWFoZF9kb25lKHN0cnVjdCBhaGRfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7Cit2b2lkCWFoZF9zZW5kX2FzeW5jKHN0cnVjdCBhaGRfc29mdGMgKiwgY2hhciBjaGFubmVsLAorCQkgICAgICAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGFjX2NvZGUsIHZvaWQgKik7Cit2b2lkCWFoZF9wcmludF9wYXRoKHN0cnVjdCBhaGRfc29mdGMgKiwgc3RydWN0IHNjYiAqKTsKK3ZvaWQJYWhkX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBBSERfUENJX0NPTkZJRyAxCisjZWxzZQorI2RlZmluZSBBSERfUENJX0NPTkZJRyAwCisjZW5kaWYKKyNkZWZpbmUgYm9vdHZlcmJvc2UgYWljNzl4eF92ZXJib3NlCitleHRlcm4gdWludDMyX3QgYWljNzl4eF92ZXJib3NlOworCisjZW5kaWYgLyogX0FJQzc5WFhfTElOVVhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkYWYwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogTGludXggZHJpdmVyIGF0dGFjaG1lbnQgZ2x1ZSBmb3IgUENJIGJhc2VkIFUzMjAgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc21fcGNpLmMjMjUgJAorICovCisKKyNpbmNsdWRlICJhaWM3OXh4X29zbS5oIgorI2luY2x1ZGUgImFpYzc5eHhfaW5saW5lLmgiCisjaW5jbHVkZSAiYWljNzl4eF9wY2kuaCIKKworc3RhdGljIGludAlhaGRfbGludXhfcGNpX2Rldl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50CWFoZF9saW51eF9wY2lfcmVzZXJ2ZV9pb19yZWdpb25zKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJCSB1X2xvbmcgKmJhc2UsIHVfbG9uZyAqYmFzZTIpOworc3RhdGljIGludAlhaGRfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgdV9sb25nICpidXNfYWRkciwKKwkJCQkJCSB1aW50OF90IF9faW9tZW0gKiptYWRkcik7CitzdGF0aWMgdm9pZAlhaGRfbGludXhfcGNpX2Rldl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCisvKiBEZWZpbmUgdGhlIG1hY3JvIGxvY2FsbHkgc2luY2UgaXQncyBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBjbGFzcyBvZiBjaGlwcy4KKyAqLworI2RlZmluZSBJRCh4KSAgICAgICAgICAgIFwKKwlJRDJDKHgpLCAgICAgICAgIFwKKwlJRDJDKElESVJPQyh4KSkKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFoZF9saW51eF9wY2lfaWRfdGFibGVbXSA9IHsKKwkvKiBhaWM3OTAxIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MzIwQSksCisJSUQoSURfQUhBXzI5MzIwQUxQKSwKKwkvKiBhaWM3OTAyIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MzIwKSwKKwlJRChJRF9BSEFfMjkzMjBCKSwKKwlJRChJRF9BSEFfMjkzMjBMUCksCisJSUQoSURfQUhBXzM5MzIwKSwKKwlJRChJRF9BSEFfMzkzMjBfQiksCisJSUQoSURfQUhBXzM5MzIwQSksCisJSUQoSURfQUhBXzM5MzIwRCksCisJSUQoSURfQUhBXzM5MzIwRF9IUCksCisJSUQoSURfQUhBXzM5MzIwRF9CKSwKKwlJRChJRF9BSEFfMzkzMjBEX0JfSFApLAorCS8qIEdlbmVyaWMgY2hpcCBwcm9iZXMgZm9yIGRldmljZXMgd2UgZG9uJ3Qga25vdyBleGFjdGx5LiAqLworCUlEMTYoSURfQUlDNzkwMSAmIElEXzkwMDVfR0VORVJJQ19NQVNLKSwKKwlJRChJRF9BSUM3OTAxQSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQxNihJRF9BSUM3OTAyICYgSURfOTAwNV9HRU5FUklDX01BU0spLAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWhkX2xpbnV4X3BjaV9pZF90YWJsZSk7CisKK3N0cnVjdCBwY2lfZHJpdmVyIGFpYzc5eHhfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWljNzl4eCIsCisJLnByb2JlCQk9IGFoZF9saW51eF9wY2lfZGV2X3Byb2JlLAorCS5yZW1vdmUJCT0gYWhkX2xpbnV4X3BjaV9kZXZfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGFoZF9saW51eF9wY2lfaWRfdGFibGUKK307CisKK3N0YXRpYyB2b2lkCithaGRfbGludXhfcGNpX2Rldl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFoZF9zb2Z0YyAqYWhkOworCXVfbG9uZyBsOworCisJLyoKKwkgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IHBlcmZvcm0KKwkgKiB0aGUgZnJlZSBkaXJlY3RseSwgYnV0IGNoZWNrIG91cgorCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KKwkgKi8KKwlhaGRfbGlzdF9sb2NrKCZsKTsKKwlhaGQgPSBhaGRfZmluZF9zb2Z0Yygoc3RydWN0IGFoZF9zb2Z0YyAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJaWYgKGFoZCAhPSBOVUxMKSB7CisJCXVfbG9uZyBzOworCisJCVRBSUxRX1JFTU9WRSgmYWhkX3RhaWxxLCBhaGQsIGxpbmtzKTsKKwkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKKwkJYWhkX2xvY2soYWhkLCAmcyk7CisJCWFoZF9pbnRyX2VuYWJsZShhaGQsIEZBTFNFKTsKKwkJYWhkX3VubG9jayhhaGQsICZzKTsKKwkJYWhkX2ZyZWUoYWhkKTsKKwl9IGVsc2UKKwkJYWhkX2xpc3RfdW5sb2NrKCZsKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3BjaV9kZXZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJY2hhcgkJIGJ1Zls4MF07CisJc3RydWN0CQkgYWhkX3NvZnRjICphaGQ7CisJYWhkX2Rldl9zb2Z0Y190CSBwY2k7CisJc3RydWN0CQkgYWhkX3BjaV9pZGVudGl0eSAqZW50cnk7CisJY2hhcgkJKm5hbWU7CisJaW50CQkgZXJyb3I7CisKKwkvKgorCSAqIFNvbWUgQklPU2VuIHJlcG9ydCB0aGUgc2FtZSBkZXZpY2UgbXVsdGlwbGUgdGltZXMuCisJICovCisJVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwcm9iZWRfcGRldjsKKworCQlwcm9iZWRfcGRldiA9IGFoZC0+ZGV2X3NvZnRjOworCQlpZiAocHJvYmVkX3BkZXYtPmJ1cy0+bnVtYmVyID09IHBkZXYtPmJ1cy0+bnVtYmVyCisJCSAmJiBwcm9iZWRfcGRldi0+ZGV2Zm4gPT0gcGRldi0+ZGV2Zm4pCisJCQlicmVhazsKKwl9CisJaWYgKGFoZCAhPSBOVUxMKSB7CisJCS8qIFNraXAgZHVwbGljYXRlLiAqLworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKworCXBjaSA9IHBkZXY7CisJZW50cnkgPSBhaGRfZmluZF9wY2lfZGV2aWNlKHBjaSk7CisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgc29mdGMgZm9yIHRoaXMgY2FyZCBhbmQKKwkgKiBzZXQgaXQgdXAgZm9yIGF0dGFjaG1lbnQgYnkgb3VyCisJICogY29tbW9uIGRldGVjdCByb3V0aW5lLgorCSAqLworCXNwcmludGYoYnVmLCAiYWhkX3BjaTolZDolZDolZCIsCisJCWFoZF9nZXRfcGNpX2J1cyhwY2kpLAorCQlhaGRfZ2V0X3BjaV9zbG90KHBjaSksCisJCWFoZF9nZXRfcGNpX2Z1bmN0aW9uKHBjaSkpOworCW5hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAoLUVOT01FTSk7CisJc3RyY3B5KG5hbWUsIGJ1Zik7CisJYWhkID0gYWhkX2FsbG9jKE5VTEwsIG5hbWUpOworCWlmIChhaGQgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PTUVNKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJYWhkX2ZyZWUoYWhkKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgeworCQl1aW50NjRfdCAgIG1lbXNpemU7CisJCWNvbnN0IHVpbnQ2NF90IG1hc2tfMzliaXQgPSAweDdGRkZGRkZGRkZVTEw7CisKKwkJbWVtc2l6ZSA9IGFoZF9saW51eF9nZXRfbWVtc2l6ZSgpOworCisJCWlmIChtZW1zaXplID49IDB4ODAwMDAwMDAwMFVMTAorCSAJICYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spID09IDApIHsKKwkJCWFoZC0+ZmxhZ3MgfD0gQUhEXzY0QklUX0FERFJFU1NJTkc7CisJCQlhaGQtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gRE1BXzY0QklUX01BU0s7CisJCX0gZWxzZSBpZiAobWVtc2l6ZSA+IDB4ODAwMDAwMDAKKwkJCSYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgbWFza18zOWJpdCkgPT0gMCkgeworCQkJYWhkLT5mbGFncyB8PSBBSERfMzlCSVRfQUREUkVTU0lORzsKKwkJCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBtYXNrXzM5Yml0OworCQl9CisJfSBlbHNlIHsKKwkJcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+aHdfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKKwl9CisJYWhkLT5kZXZfc29mdGMgPSBwY2k7CisJZXJyb3IgPSBhaGRfcGNpX2NvbmZpZyhhaGQsIGVudHJ5KTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlhaGRfZnJlZShhaGQpOworCQlyZXR1cm4gKC1lcnJvcik7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhaGQpOworCWlmIChhaWM3OXh4X2RldGVjdF9jb21wbGV0ZSkgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJYWhkX2xpbnV4X3JlZ2lzdGVyX2hvc3QoYWhkLCAmYWljNzl4eF9kcml2ZXJfdGVtcGxhdGUpOworI2Vsc2UKKwkJcHJpbnRmKCJhaWM3OXh4OiBpZ25vcmluZyBQQ0kgZGV2aWNlIGZvdW5kIGFmdGVyICIKKwkJICAgICAgICJpbml0aWFsaXphdGlvblxuIik7CisJCXJldHVybiAoLUVOT0RFVik7CisjZW5kaWYKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CithaGRfbGludXhfcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKHBjaV9tb2R1bGVfaW5pdCgmYWljNzl4eF9wY2lfZHJpdmVyKSk7Cit9CisKK3ZvaWQKK2FoZF9saW51eF9wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWljNzl4eF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIGludAorYWhkX2xpbnV4X3BjaV9yZXNlcnZlX2lvX3JlZ2lvbnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2xvbmcgKmJhc2UsCisJCQkJIHVfbG9uZyAqYmFzZTIpCit7CisJKmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWhkLT5kZXZfc29mdGMsIDApOworCS8qCisJICogVGhpcyBpcyByZWFsbHkgdGhlIDNyZCBiYXIgYW5kIHNob3VsZCBiZSBhdCBpbmRleCAyLAorCSAqIGJ1dCB0aGUgTGludXggUENJIGNvZGUgZG9lc24ndCBrbm93IGhvdyB0byAiY291bnQiIDY0Yml0CisJICogYmFycy4KKwkgKi8KKwkqYmFzZTIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWhkLT5kZXZfc29mdGMsIDMpOworCWlmICgqYmFzZSA9PSAwIHx8ICpiYXNlMiA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisJaWYgKHJlcXVlc3RfcmVnaW9uKCpiYXNlLCAyNTYsICJhaWM3OXh4IikgPT0gMCkKKwkJcmV0dXJuIChFTk9NRU0pOworCWlmIChyZXF1ZXN0X3JlZ2lvbigqYmFzZTIsIDI1NiwgImFpYzc5eHgiKSA9PSAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKCpiYXNlMiwgMjU2KTsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGRfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJIHVfbG9uZyAqYnVzX2FkZHIsCisJCQkJIHVpbnQ4X3QgX19pb21lbSAqKm1hZGRyKQoreworCXVfbG9uZwlzdGFydDsKKwl1X2xvbmcJYmFzZV9wYWdlOworCXVfbG9uZwliYXNlX29mZnNldDsKKwlpbnQJZXJyb3I7CisKKwlpZiAoYWljNzl4eF9hbGxvd19tZW1pbyA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwlpZiAoKGFoZC0+YnVncyAmIEFIRF9QQ0lYX01NQVBJT19CVUcpICE9IDApCisJCXJldHVybiAoRU5PTUVNKTsKKworCWVycm9yID0gMDsKKwlzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChhaGQtPmRldl9zb2Z0YywgMSk7CisJYmFzZV9wYWdlID0gc3RhcnQgJiBQQUdFX01BU0s7CisJYmFzZV9vZmZzZXQgPSBzdGFydCAtIGJhc2VfcGFnZTsKKwlpZiAoc3RhcnQgIT0gMCkgeworCQkqYnVzX2FkZHIgPSBzdGFydDsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwLCAiYWljNzl4eCIpID09IDApCisJCQllcnJvciA9IEVOT01FTTsKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCSptYWRkciA9IGlvcmVtYXBfbm9jYWNoZShiYXNlX3BhZ2UsIGJhc2Vfb2Zmc2V0ICsgMjU2KTsKKwkJCWlmICgqbWFkZHIgPT0gTlVMTCkgeworCQkJCWVycm9yID0gRU5PTUVNOworCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwKTsKKwkJCX0gZWxzZQorCQkJCSptYWRkciArPSBiYXNlX29mZnNldDsKKwkJfQorCX0gZWxzZQorCQllcnJvciA9IEVOT01FTTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50CithaGRfcGNpX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVpbnQzMl90IGNvbW1hbmQ7CisJdV9sb25nCSBiYXNlOworCXVpbnQ4X3QJX19pb21lbSAqbWFkZHI7CisJaW50CSBlcnJvcjsKKworCS8qCisJICogSWYgaXRzIGFsbG93ZWQsIHdlIHByZWZlciBtZW1vcnkgbWFwcGVkIGFjY2Vzcy4KKwkgKi8KKwljb21tYW5kID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCA0KTsKKwljb21tYW5kICY9IH4oUENJTV9DTURfUE9SVEVOfFBDSU1fQ01EX01FTUVOKTsKKwliYXNlID0gMDsKKwltYWRkciA9IE5VTEw7CisJZXJyb3IgPSBhaGRfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihhaGQsICZiYXNlLCAmbWFkZHIpOworCWlmIChlcnJvciA9PSAwKSB7CisJCWFoZC0+cGxhdGZvcm1fZGF0YS0+bWVtX2J1c2FkZHIgPSBiYXNlOworCQlhaGQtPnRhZ3NbMF0gPSBCVVNfU1BBQ0VfTUVNSU87CisJCWFoZC0+YnNoc1swXS5tYWRkciA9IG1hZGRyOworCQlhaGQtPnRhZ3NbMV0gPSBCVVNfU1BBQ0VfTUVNSU87CisJCWFoZC0+YnNoc1sxXS5tYWRkciA9IG1hZGRyICsgMHgxMDA7CisJCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsCisJCQkJICAgICBjb21tYW5kIHwgUENJTV9DTURfTUVNRU4sIDQpOworCisJCWlmIChhaGRfcGNpX3Rlc3RfcmVnaXN0ZXJfYWNjZXNzKGFoZCkgIT0gMCkgeworCisJCQlwcmludGYoImFpYzc5eHg6IFBDSSBEZXZpY2UgJWQ6JWQ6JWQgIgorCQkJICAgICAgICJmYWlsZWQgbWVtb3J5IG1hcHBlZCB0ZXN0LiAgVXNpbmcgUElPLlxuIiwKKwkJCSAgICAgICBhaGRfZ2V0X3BjaV9idXMoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX3Nsb3QoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZC0+ZGV2X3NvZnRjKSk7CisJCQlpb3VubWFwKG1hZGRyKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihhaGQtPnBsYXRmb3JtX2RhdGEtPm1lbV9idXNhZGRyLAorCQkJCQkgICAweDEwMDApOworCQkJYWhkLT5ic2hzWzBdLm1hZGRyID0gTlVMTDsKKwkJCW1hZGRyID0gTlVMTDsKKwkJfSBlbHNlCisJCQljb21tYW5kIHw9IFBDSU1fQ01EX01FTUVOOworCX0gZWxzZSBpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJhaWM3OXh4OiBQQ0klZDolZDolZCBNRU0gcmVnaW9uIDB4JWx4ICIKKwkJICAgICAgICJ1bmF2YWlsYWJsZS4gQ2Fubm90IG1lbW9yeSBtYXAgZGV2aWNlLlxuIiwKKwkJICAgICAgIGFoZF9nZXRfcGNpX2J1cyhhaGQtPmRldl9zb2Z0YyksCisJCSAgICAgICBhaGRfZ2V0X3BjaV9zbG90KGFoZC0+ZGV2X3NvZnRjKSwKKwkJICAgICAgIGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZC0+ZGV2X3NvZnRjKSwKKwkJICAgICAgIGJhc2UpOworCX0KKworCWlmIChtYWRkciA9PSBOVUxMKSB7CisJCXVfbG9uZwkgYmFzZTI7CisKKwkJZXJyb3IgPSBhaGRfbGludXhfcGNpX3Jlc2VydmVfaW9fcmVnaW9ucyhhaGQsICZiYXNlLCAmYmFzZTIpOworCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJYWhkLT50YWdzWzBdID0gQlVTX1NQQUNFX1BJTzsKKwkJCWFoZC0+dGFnc1sxXSA9IEJVU19TUEFDRV9QSU87CisJCQlhaGQtPmJzaHNbMF0uaW9wb3J0ID0gYmFzZTsKKwkJCWFoZC0+YnNoc1sxXS5pb3BvcnQgPSBiYXNlMjsKKwkJCWNvbW1hbmQgfD0gUENJTV9DTURfUE9SVEVOOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJhaWM3OXh4OiBQQ0klZDolZDolZCBJTyByZWdpb25zIDB4JWx4IGFuZCAweCVseCIKKwkJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtYXAgZGV2aWNlLlxuIiwKKwkJCSAgICAgICBhaGRfZ2V0X3BjaV9idXMoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX3Nsb3QoYWhkLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoZF9nZXRfcGNpX2Z1bmN0aW9uKGFoZC0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBiYXNlLCBiYXNlMik7CisJCX0KKwl9CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgY29tbWFuZCwgNCk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK2ludAorYWhkX3BjaV9tYXBfaW50KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGFoZC0+ZGV2X3NvZnRjLT5pcnEsIGFoZF9saW51eF9pc3IsCisJCQkgICAgU0FfU0hJUlEsICJhaWM3OXh4IiwgYWhkKTsKKwlpZiAoZXJyb3IgPT0gMCkKKwkJYWhkLT5wbGF0Zm9ybV9kYXRhLT5pcnEgPSBhaGQtPmRldl9zb2Z0Yy0+aXJxOworCQorCXJldHVybiAoLWVycm9yKTsKK30KKwordm9pZAorYWhkX3Bvd2VyX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9wb3dlcl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShhaGQtPmRldl9zb2Z0YywgbmV3X3N0YXRlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2JiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCkBAIC0wLDAgKzEsOTg3IEBACisvKgorICogUHJvZHVjdCBzcGVjaWZpYyBwcm9iZSBhbmQgYXR0YWNoIHJvdXRpbmVzIGZvcjoKKyAqCWFpYzc5MDEgYW5kIGFpYzc5MDIgU0NTSSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0yMDAxIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eF9wY2kuYyM3NyAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljNzl4eF9pbmxpbmUuaCIKKyNlbHNlCisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljNzl4eF9vc20uaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3OXh4X2lubGluZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWM3OXh4X3BjaS5oIgorCitzdGF0aWMgX19pbmxpbmUgdWludDY0X3QKK2FoZF9jb21wb3NlX2lkKHVfaW50IGRldmljZSwgdV9pbnQgdmVuZG9yLCB1X2ludCBzdWJkZXZpY2UsIHVfaW50IHN1YnZlbmRvcikKK3sKKwl1aW50NjRfdCBpZDsKKworCWlkID0gc3VidmVuZG9yCisJICAgfCAoc3ViZGV2aWNlIDw8IDE2KQorCSAgIHwgKCh1aW50NjRfdCl2ZW5kb3IgPDwgMzIpCisJICAgfCAoKHVpbnQ2NF90KWRldmljZSA8PCA0OCk7CisKKwlyZXR1cm4gKGlkKTsKK30KKworI2RlZmluZSBJRF9BSUM3OTAyX1BDSV9SRVZfQTQJCTB4MworI2RlZmluZSBJRF9BSUM3OTAyX1BDSV9SRVZfQjAJCTB4MTAKKyNkZWZpbmUgU1VCSURfSFAJCQkweDBFMTEKKworI2RlZmluZSBERVZJRF85MDA1X0hPU1RSQUlEKGlkKSAoKGlkKSAmIDB4ODApCisKKyNkZWZpbmUgREVWSURfOTAwNV9UWVBFKGlkKSAoKGlkKSAmIDB4RikKKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9IQkEJCTB4MAkvKiBTdGFuZGFyZCBDYXJkICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfSEJBXzJFWFQJMHgxCS8qIDIgRXh0ZXJuYWwgUG9ydHMgKi8KKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9JUk9DCQkweDgJLyogUmFpZCgwLDEsMTApIENhcmQgKi8KKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9NQgkJMHhGCS8qIE9uIE1vdGhlcmJvYXJkICovCisKKyNkZWZpbmUgREVWSURfOTAwNV9NRlVOQyhpZCkgKChpZCkgJiAweDEwKQorCisjZGVmaW5lIERFVklEXzkwMDVfUEFDS0VUSVpFRChpZCkgKChpZCkgJiAweDgwMDApCisKKyNkZWZpbmUgU1VCSURfOTAwNV9UWVBFKGlkKSAoKGlkKSAmIDB4RikKKyNkZWZpbmUJCVNVQklEXzkwMDVfVFlQRV9IQkEJCTB4MAkvKiBTdGFuZGFyZCBDYXJkICovCisjZGVmaW5lCQlTVUJJRF85MDA1X1RZUEVfTUIJCTB4RgkvKiBPbiBNb3RoZXJib2FyZCAqLworCisjZGVmaW5lIFNVQklEXzkwMDVfQVVUT1RFUk0oaWQpCSgoKGlkKSAmIDB4MTApID09IDApCisKKyNkZWZpbmUgU1VCSURfOTAwNV9MRUdBQ1lDT05OX0ZVTkMoaWQpICgoaWQpICYgMHgyMCkKKworI2RlZmluZSBTVUJJRF85MDA1X1NFRVBUWVBFKGlkKSAoKGlkKSAmIDB4MEMwKSA+PiA2KQorI2RlZmluZQkJU1VCSURfOTAwNV9TRUVQVFlQRV9OT05FCTB4MAorI2RlZmluZQkJU1VCSURfOTAwNV9TRUVQVFlQRV80SwkJMHgxCisKK3N0YXRpYyBhaGRfZGV2aWNlX3NldHVwX3QgYWhkX2FpYzc5MDFfc2V0dXA7CitzdGF0aWMgYWhkX2RldmljZV9zZXR1cF90IGFoZF9haWM3OTAxQV9zZXR1cDsKK3N0YXRpYyBhaGRfZGV2aWNlX3NldHVwX3QgYWhkX2FpYzc5MDJfc2V0dXA7CitzdGF0aWMgYWhkX2RldmljZV9zZXR1cF90IGFoZF9haWM3OTBYX3NldHVwOworCitzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdID0KK3sKKwkvKiBhaWM3OTAxIGJhc2VkIGNvbnRyb2xsZXJzICovCisJeworCQlJRF9BSEFfMjkzMjBBLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMjBBIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAxX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTMyMEFMUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwQUxQIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAxX3NldHVwCisJfSwKKwkvKiBhaWM3OTAyIGJhc2VkIGNvbnRyb2xsZXJzICovCQorCXsKKwkJSURfQUhBXzI5MzIwLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMjAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5MzIwQiwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwQiBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkzMjBMUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzIwTFAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDFBX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5MzIwIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMF9CLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzkzMjAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5MzIwQSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5MzIwQSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzkzMjBELAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzkzMjBEIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMERfSFAsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAoSFAgT0VNKSAzOTMyMEQgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhkX2FpYzc5MDJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5MzIwRF9CLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzkzMjBEIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCisJCWFoZF9haWM3OTAyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTMyMERfQl9IUCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIChIUCBPRU0pIDM5MzIwRCBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0sCisJLyogR2VuZXJpYyBjaGlwIHByb2JlcyBmb3IgZGV2aWNlcyB3ZSBkb24ndCBrbm93ICdleGFjdGx5JyAqLworCXsKKwkJSURfQUlDNzkwMSAmIElEXzkwMDVfR0VORVJJQ19NQVNLLAorCQlJRF85MDA1X0dFTkVSSUNfTUFTSywKKwkJIkFkYXB0ZWMgQUlDNzkwMSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMV9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3OTAxQSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBBSUM3OTAxQSBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMUFfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzkwMiAmIElEXzkwMDVfR0VORVJJQ19NQVNLLAorCQlJRF85MDA1X0dFTkVSSUNfTUFTSywKKwkJIkFkYXB0ZWMgQUlDNzkwMiBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMl9zZXR1cAorCX0KK307CisKK2NvbnN0IHVfaW50IGFoZF9udW1fcGNpX2RldnMgPSBOVU1fRUxFTUVOVFMoYWhkX3BjaV9pZGVudF90YWJsZSk7CisJCQorI2RlZmluZQlERVZDT05GSUcJCTB4NDAKKyNkZWZpbmUJCVBDSVhJTklUUEFUCTB4MDAwMEUwMDB1bAorI2RlZmluZQkJCVBDSVhJTklUX1BDSTMzXzY2CTB4MDAwMEUwMDB1bAorI2RlZmluZQkJCVBDSVhJTklUX1BDSVg1MF82NgkweDAwMDBDMDAwdWwKKyNkZWZpbmUJCQlQQ0lYSU5JVF9QQ0lYNjZfMTAwCTB4MDAwMEEwMDB1bAorI2RlZmluZQkJCVBDSVhJTklUX1BDSVgxMDBfMTMzCTB4MDAwMDgwMDB1bAorI2RlZmluZQlQQ0lfQlVTX01PREVTX0lOREVYKGRldmNvbmZpZykJXAorCSgoKGRldmNvbmZpZykgJiBQQ0lYSU5JVFBBVCkgPj4gMTMpCitzdGF0aWMgY29uc3QgY2hhciAqcGNpX2J1c19tb2Rlc1tdID0KK3sKKwkiUENJIGJ1cyBtb2RlIHVua25vd24iLAorCSJQQ0kgYnVzIG1vZGUgdW5rbm93biIsCisJIlBDSSBidXMgbW9kZSB1bmtub3duIiwKKwkiUENJIGJ1cyBtb2RlIHVua25vd24iLAorCSJQQ0ktWCAxMDEtMTMzTWh6IiwKKwkiUENJLVggNjctMTAwTWh6IiwKKwkiUENJLVggNTAtNjZNaHoiLAorCSJQQ0kgMzMgb3IgNjZNaHoiCit9OworCisjZGVmaW5lCQlURVNUTU9ERQkweDAwMDAwODAwdWwKKyNkZWZpbmUJCUlSRFlfUlNUCTB4MDAwMDAyMDB1bAorI2RlZmluZQkJRlJBTUVfUlNUCTB4MDAwMDAxMDB1bAorI2RlZmluZQkJUENJNjRCSVQJMHgwMDAwMDA4MHVsCisjZGVmaW5lCQlNUkRDRU4JCTB4MDAwMDAwNDB1bAorI2RlZmluZQkJRU5ESUFOU0VMCTB4MDAwMDAwMjB1bAorI2RlZmluZQkJTUlYUVdFTkRJQU5FTgkweDAwMDAwMDA4dWwKKyNkZWZpbmUJCURBQ0VOCQkweDAwMDAwMDA0dWwKKyNkZWZpbmUJCVNUUFdMRVZFTAkweDAwMDAwMDAydWwKKyNkZWZpbmUJCVFXRU5ESUFOU0VMCTB4MDAwMDAwMDF1bAorCisjZGVmaW5lCURFVkNPTkZJRzEJCTB4NDQKKyNkZWZpbmUJCVBSRVFESVMJCTB4MDEKKworI2RlZmluZQlDU0laRV9MQVRUSU1FCQkweDBjCisjZGVmaW5lCQlDQUNIRVNJWkUJMHgwMDAwMDBmZnVsCisjZGVmaW5lCQlMQVRUSU1FCQkweDAwMDBmZjAwdWwKKworc3RhdGljIGludAlhaGRfY2hlY2tfZXh0cG9ydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworc3RhdGljIHZvaWQJYWhkX2NvbmZpZ3VyZV90ZXJtaW5hdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCSAgdV9pbnQgYWRhcHRlcl9jb250cm9sKTsKK3N0YXRpYyB2b2lkCWFoZF9wY2lfc3BsaXRfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGludHN0YXQpOworCitzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSAqCithaGRfZmluZF9wY2lfZGV2aWNlKGFoZF9kZXZfc29mdGNfdCBwY2kpCit7CisJdWludDY0X3QgIGZ1bGxfaWQ7CisJdWludDE2X3QgIGRldmljZTsKKwl1aW50MTZfdCAgdmVuZG9yOworCXVpbnQxNl90ICBzdWJkZXZpY2U7CisJdWludDE2X3QgIHN1YnZlbmRvcjsKKwlzdHJ1Y3QJICBhaGRfcGNpX2lkZW50aXR5ICplbnRyeTsKKwl1X2ludAkgIGk7CisKKwl2ZW5kb3IgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9ERVZWRU5ET1IsIC8qYnl0ZXMqLzIpOworCWRldmljZSA9IGFoZF9wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX0RFVklDRSwgLypieXRlcyovMik7CisJc3VidmVuZG9yID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfU1VCVkVORF8wLCAvKmJ5dGVzKi8yKTsKKwlzdWJkZXZpY2UgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9TVUJERVZfMCwgLypieXRlcyovMik7CisJZnVsbF9pZCA9IGFoZF9jb21wb3NlX2lkKGRldmljZSwKKwkJCQkgdmVuZG9yLAorCQkJCSBzdWJkZXZpY2UsCisJCQkJIHN1YnZlbmRvcik7CisKKwkvKgorCSAqIENvbnRyb2xsZXJzLCBtYXNrIG91dCB0aGUgSVJPQy9Ib3N0UkFJRCBiaXQKKwkgKi8KKwkKKwlmdWxsX2lkICY9IElEX0FMTF9JUk9DX01BU0s7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWhkX251bV9wY2lfZGV2czsgaSsrKSB7CisJCWVudHJ5ID0gJmFoZF9wY2lfaWRlbnRfdGFibGVbaV07CisJCWlmIChlbnRyeS0+ZnVsbF9pZCA9PSAoZnVsbF9pZCAmIGVudHJ5LT5pZF9tYXNrKSkgeworCQkJLyogSG9ub3IgZXhjbHVzaW9uIGVudHJpZXMuICovCisJCQlpZiAoZW50cnktPm5hbWUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJcmV0dXJuIChlbnRyeSk7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworaW50CithaGRfcGNpX2NvbmZpZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBhaGRfcGNpX2lkZW50aXR5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgc2NiX2RhdGEgKnNoYXJlZF9zY2JfZGF0YTsKKwl1X2xvbmcJCSBsOworCXVfaW50CQkgY29tbWFuZDsKKwl1aW50MzJfdAkgZGV2Y29uZmlnOworCXVpbnQxNl90CSBzdWJ2ZW5kb3I7IAorCWludAkJIGVycm9yOworCisJc2hhcmVkX3NjYl9kYXRhID0gTlVMTDsKKwlhaGQtPmRlc2NyaXB0aW9uID0gZW50cnktPm5hbWU7CisJLyoKKwkgKiBSZWNvcmQgaWYgdGhpcyBpcyBhbiBIUCBib2FyZC4KKwkgKi8KKwlzdWJ2ZW5kb3IgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLAorCQkJCQlQQ0lSX1NVQlZFTkRfMCwgLypieXRlcyovMik7CisJaWYgKHN1YnZlbmRvciA9PSBTVUJJRF9IUCkKKwkJYWhkLT5mbGFncyB8PSBBSERfSFBfQk9BUkQ7CisKKwllcnJvciA9IGVudHJ5LT5zZXR1cChhaGQpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKwkKKwlkZXZjb25maWcgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBERVZDT05GSUcsIC8qYnl0ZXMqLzQpOworCWlmICgoZGV2Y29uZmlnICYgUENJWElOSVRQQVQpID09IFBDSVhJTklUX1BDSTMzXzY2KSB7CisJCWFoZC0+Y2hpcCB8PSBBSERfUENJOworCQkvKiBEaXNhYmxlIFBDSVggd29ya2Fyb3VuZHMgd2hlbiBydW5uaW5nIGluIFBDSSBtb2RlLiAqLworCQlhaGQtPmJ1Z3MgJj0gfkFIRF9QQ0lYX0JVR19NQVNLOworCX0gZWxzZSB7CisJCWFoZC0+Y2hpcCB8PSBBSERfUENJWDsKKwl9CisJYWhkLT5idXNfZGVzY3JpcHRpb24gPSBwY2lfYnVzX21vZGVzW1BDSV9CVVNfTU9ERVNfSU5ERVgoZGV2Y29uZmlnKV07CisKKwlhaGRfcG93ZXJfc3RhdGVfY2hhbmdlKGFoZCwgQUhEX1BPV0VSX1NUQVRFX0QwKTsKKworCWVycm9yID0gYWhkX3BjaV9tYXBfcmVnaXN0ZXJzKGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBJZiB3ZSBuZWVkIHRvIHN1cHBvcnQgaGlnaCBtZW1vcnksIGVuYWJsZSBkdWFsCisJICogYWRkcmVzcyBjeWNsZXMuICBUaGlzIGJpdCBtdXN0IGJlIHNldCB0byBlbmFibGUKKwkgKiBoaWdoIGFkZHJlc3MgYml0IGdlbmVyYXRpb24gZXZlbiBpZiB3ZSBhcmUgb24gYQorCSAqIDY0Yml0IGJ1cyAoUENJNjRCSVQgc2V0IGluIGRldmNvbmZpZykuCisJICovCisJaWYgKChhaGQtPmZsYWdzICYgKEFIRF8zOUJJVF9BRERSRVNTSU5HfEFIRF82NEJJVF9BRERSRVNTSU5HKSkgIT0gMCkgeworCQl1aW50MzJfdCBkZXZjb25maWc7CisKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogRW5hYmxpbmcgMzlCaXQgQWRkcmVzc2luZ1xuIiwKKwkJCSAgICAgICBhaGRfbmFtZShhaGQpKTsKKwkJZGV2Y29uZmlnID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywKKwkJCQkJCURFVkNPTkZJRywgLypieXRlcyovNCk7CisJCWRldmNvbmZpZyB8PSBEQUNFTjsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIERFVkNPTkZJRywKKwkJCQkgICAgIGRldmNvbmZpZywgLypieXRlcyovNCk7CisJfQorCQorCS8qIEVuc3VyZSBidXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCAqLworCWNvbW1hbmQgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIC8qYnl0ZXMqLzIpOworCWNvbW1hbmQgfD0gUENJTV9DTURfQlVTTUFTVEVSRU47CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgY29tbWFuZCwgLypieXRlcyovMik7CisKKwllcnJvciA9IGFoZF9zb2Z0Y19pbml0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJYWhkLT5idXNfaW50ciA9IGFoZF9wY2lfaW50cjsKKworCWVycm9yID0gYWhkX3Jlc2V0KGFoZCwgLypyZWluaXQqL0ZBTFNFKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChFTlhJTyk7CisKKwlhaGQtPnBjaV9jYWNoZXNpemUgPQorCSAgICBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLAorCQkJCS8qYnl0ZXMqLzEpICYgQ0FDSEVTSVpFOworCWFoZC0+cGNpX2NhY2hlc2l6ZSAqPSA0OworCisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCS8qIFNlZSBpZiB3ZSBoYXZlIGEgU0VFUFJPTSBhbmQgcGVyZm9ybSBhdXRvLXRlcm0gKi8KKwllcnJvciA9IGFoZF9jaGVja19leHRwb3J0KGFoZCk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJLyogQ29yZSBpbml0aWFsaXphdGlvbiAqLworCWVycm9yID0gYWhkX2luaXQoYWhkKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIEFsbG93IGludGVycnVwdHMgbm93IHRoYXQgd2UgYXJlIGNvbXBsZXRlbHkgc2V0dXAuCisJICovCisJZXJyb3IgPSBhaGRfcGNpX21hcF9pbnQoYWhkKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhaGRfbGlzdF9sb2NrKCZsKTsKKwkvKgorCSAqIExpbmsgdGhpcyBzb2Z0YyBpbiB3aXRoIGFsbCBvdGhlciBhaGQgaW5zdGFuY2VzLgorCSAqLworCWFoZF9zb2Z0Y19pbnNlcnQoYWhkKTsKKwlhaGRfbGlzdF91bmxvY2soJmwpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNvbWUgc2ltcGxlIHRlc3RzIHRoYXQgc2hvdWxkIGNhdGNoIHNpdHVhdGlvbnMgd2hlcmUKKyAqIG91ciByZWdpc3RlcnMgYXJlIGludmFsaWRseSBtYXBwZWQuCisgKi8KK2ludAorYWhkX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDMyX3QgY21kOworCXVfaW50CSB0YXJncGNpc3RhdDsKKwl1X2ludAkgcGNpX3N0YXR1czE7CisJaW50CSBlcnJvcjsKKwl1aW50OF90CSBoY250cmw7CisKKwllcnJvciA9IEVJTzsKKworCS8qCisJICogRW5hYmxlIFBDSSBlcnJvciBpbnRlcnJ1cHQgc3RhdHVzLCBidXQgc3VwcHJlc3MgTk1JcworCSAqIGdlbmVyYXRlZCBieSBTRVJSIHJhaXNlZCBkdWUgdG8gdGFyZ2V0IGFib3J0cy4KKwkgKi8KKwljbWQgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIC8qYnl0ZXMqLzIpOworCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsCisJCQkgICAgIGNtZCAmIH5QQ0lNX0NNRF9TRVJSRVNQRU4sIC8qYnl0ZXMqLzIpOworCisJLyoKKwkgKiBGaXJzdCBhIHNpbXBsZSB0ZXN0IHRvIHNlZSBpZiBhbnkKKwkgKiByZWdpc3RlcnMgY2FuIGJlIHJlYWQuICBSZWFkaW5nCisJICogSENOVFJMIGhhcyBubyBzaWRlIGVmZmVjdHMgYW5kIGhhcworCSAqIGF0IGxlYXN0IG9uZSBiaXQgdGhhdCBpcyBndWFyYW50ZWVkIHRvCisJICogYmUgemVybyBzbyBpdCBpcyBhIGdvb2QgcmVnaXN0ZXIgdG8KKwkgKiB1c2UgZm9yIHRoaXMgdGVzdC4KKwkgKi8KKwloY250cmwgPSBhaGRfaW5iKGFoZCwgSENOVFJMKTsKKwlpZiAoaGNudHJsID09IDB4RkYpCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogTmV4dCBjcmVhdGUgYSBzaXR1YXRpb24gd2hlcmUgd3JpdGUgY29tYmluaW5nCisJICogb3IgcmVhZCBwcmVmZXRjaGluZyBjb3VsZCBiZSBpbml0aWF0ZWQgYnkgdGhlCisJICogQ1BVIG9yIGhvc3QgYnJpZGdlLiAgT3VyIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0CisJICogZWl0aGVyLCBzbyBsb29rIGZvciBkYXRhIGNvcnJ1cHRpb24gYW5kL29yIGZsYWdlZAorCSAqIFBDSSBlcnJvcnMuICBGaXJzdCBwYXVzZSB3aXRob3V0IGNhdXNpbmcgYW5vdGhlcgorCSAqIGNoaXAgcmVzZXQuCisJICovCisJaGNudHJsICY9IH5DSElQUlNUOworCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBoY250cmx8UEFVU0UpOworCXdoaWxlIChhaGRfaXNfcGF1c2VkKGFoZCkgPT0gMCkKKwkJOworCisJLyogQ2xlYXIgYW55IFBDSSBlcnJvcnMgdGhhdCBvY2N1cnJlZCBiZWZvcmUgb3VyIGRyaXZlciBhdHRhY2hlZC4gKi8KKwlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCXRhcmdwY2lzdGF0ID0gYWhkX2luYihhaGQsIFRBUkdQQ0lTVEFUKTsKKwlhaGRfb3V0YihhaGQsIFRBUkdQQ0lTVEFULCB0YXJncGNpc3RhdCk7CisJcGNpX3N0YXR1czEgPSBhaGRfcGNpX3JlYWRfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLAorCQkJCQkgIFBDSVJfU1RBVFVTICsgMSwgLypieXRlcyovMSk7CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfU1RBVFVTICsgMSwKKwkJCSAgICAgcGNpX3N0YXR1czEsIC8qYnl0ZXMqLzEpOworCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9TQ1NJLCBBSERfTU9ERV9TQ1NJKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSUENJSU5UKTsKKworCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgUEVSUk9SRElTKTsKKwlhaGRfb3V0bChhaGQsIFNSQU1fQkFTRSwgMHg1YWE1NTVhYSk7CisJaWYgKGFoZF9pbmwoYWhkLCBTUkFNX0JBU0UpICE9IDB4NWFhNTU1YWEpCisJCWdvdG8gZmFpbDsKKworCWlmICgoYWhkX2luYihhaGQsIElOVFNUQVQpICYgUENJSU5UKSAhPSAwKSB7CisJCXVfaW50IHRhcmdwY2lzdGF0OworCisJCWFoZF9zZXRfbW9kZXMoYWhkLCBBSERfTU9ERV9DRkcsIEFIRF9NT0RFX0NGRyk7CisJCXRhcmdwY2lzdGF0ID0gYWhkX2luYihhaGQsIFRBUkdQQ0lTVEFUKTsKKwkJaWYgKCh0YXJncGNpc3RhdCAmIFNUQSkgIT0gMCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwllcnJvciA9IDA7CisKK2ZhaWw6CisJaWYgKChhaGRfaW5iKGFoZCwgSU5UU1RBVCkgJiBQQ0lJTlQpICE9IDApIHsKKworCQlhaGRfc2V0X21vZGVzKGFoZCwgQUhEX01PREVfQ0ZHLCBBSERfTU9ERV9DRkcpOworCQl0YXJncGNpc3RhdCA9IGFoZF9pbmIoYWhkLCBUQVJHUENJU1RBVCk7CisKKwkJLyogU2lsZW50bHkgY2xlYXIgYW55IGxhdGNoZWQgZXJyb3JzLiAqLworCQlhaGRfb3V0YihhaGQsIFRBUkdQQ0lTVEFULCB0YXJncGNpc3RhdCk7CisJCXBjaV9zdGF0dXMxID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywKKwkJCQkJCSAgUENJUl9TVEFUVVMgKyAxLCAvKmJ5dGVzKi8xKTsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIFBDSVJfU1RBVFVTICsgMSwKKwkJCQkgICAgIHBjaV9zdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKwkJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlBDSUlOVCk7CisJfQorCWFoZF9vdXRiKGFoZCwgU0VRQ1RMMCwgUEVSUk9SRElTfEZBSUxESVMpOworCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIGNtZCwgLypieXRlcyovMik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgZXh0ZXJuYWwgcG9ydCBsb2dpYyBmb3IgYSBzZXJpYWwgZWVwcm9tCisgKiBhbmQgdGVybWluYXRpb24vY2FibGUgZGV0ZWN0aW9uIGNvbnRybHMuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF9jaGVja19leHRwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlzdHJ1Y3QJdnBkX2NvbmZpZyB2cGQ7CisJc3RydWN0CXNlZXByb21fY29uZmlnICpzYzsKKwl1X2ludAlhZGFwdGVyX2NvbnRyb2w7CisJaW50CWhhdmVfc2VlcHJvbTsKKwlpbnQJZXJyb3I7CisKKwlzYyA9IGFoZC0+c2VlcF9jb25maWc7CisJaGF2ZV9zZWVwcm9tID0gYWhkX2FjcXVpcmVfc2VlcHJvbShhaGQpOworCWlmIChoYXZlX3NlZXByb20pIHsKKwkJdV9pbnQgc3RhcnRfYWRkcjsKKworCQkvKgorCQkgKiBGZXRjaCBWUEQgZm9yIHRoaXMgZnVuY3Rpb24gYW5kIHBhcnNlIGl0LgorCQkgKi8KKwkJaWYgKGJvb3R2ZXJib3NlKSAKKwkJCXByaW50ZigiJXM6IFJlYWRpbmcgVlBEIGZyb20gU0VFUFJPTS4uLiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisKKwkJLyogQWRkcmVzcyBpcyBhbHdheXMgaW4gdW5pdHMgb2YgMTZiaXQgd29yZHMgKi8KKwkJc3RhcnRfYWRkciA9ICgoMiAqIHNpemVvZigqc2MpKQorCQkJICAgICsgKHNpemVvZih2cGQpICogKGFoZC0+Y2hhbm5lbCAtICdBJykpKSAvIDI7CisKKwkJZXJyb3IgPSBhaGRfcmVhZF9zZWVwcm9tKGFoZCwgKHVpbnQxNl90ICopJnZwZCwKKwkJCQkJIHN0YXJ0X2FkZHIsIHNpemVvZih2cGQpLzIsCisJCQkJCSAvKmJ5dGVzdHJlYW0qL1RSVUUpOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gYWhkX3BhcnNlX3ZwZGRhdGEoYWhkLCAmdnBkKTsKKwkJaWYgKGJvb3R2ZXJib3NlKSAKKwkJCXByaW50ZigiJXM6IFZQRCBwYXJzaW5nICVzXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCQkgICAgICAgZXJyb3IgPT0gMCA/ICJzdWNjZXNzZnVsIiA6ICJmYWlsZWQiKTsKKworCQlpZiAoYm9vdHZlcmJvc2UpIAorCQkJcHJpbnRmKCIlczogUmVhZGluZyBTRUVQUk9NLi4uIiwgYWhkX25hbWUoYWhkKSk7CisKKwkJLyogQWRkcmVzcyBpcyBhbHdheXMgaW4gdW5pdHMgb2YgMTZiaXQgd29yZHMgKi8KKwkJc3RhcnRfYWRkciA9IChzaXplb2YoKnNjKSAvIDIpICogKGFoZC0+Y2hhbm5lbCAtICdBJyk7CisKKwkJZXJyb3IgPSBhaGRfcmVhZF9zZWVwcm9tKGFoZCwgKHVpbnQxNl90ICopc2MsCisJCQkJCSBzdGFydF9hZGRyLCBzaXplb2YoKnNjKS8yLAorCQkJCQkgLypieXRlc3RyZWFtKi9GQUxTRSk7CisKKwkJaWYgKGVycm9yICE9IDApIHsKKwkJCXByaW50ZigiVW5hYmxlIHRvIHJlYWQgU0VFUFJPTVxuIik7CisJCQloYXZlX3NlZXByb20gPSAwOworCQl9IGVsc2UgeworCQkJaGF2ZV9zZWVwcm9tID0gYWhkX3ZlcmlmeV9ja3N1bShzYyk7CisKKwkJCWlmIChib290dmVyYm9zZSkgeworCQkJCWlmIChoYXZlX3NlZXByb20gPT0gMCkKKwkJCQkJcHJpbnRmICgiY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmICgiZG9uZS5cbiIpOworCQkJfQorCQl9CisJCWFoZF9yZWxlYXNlX3NlZXByb20oYWhkKTsKKwl9CisKKwlpZiAoIWhhdmVfc2VlcHJvbSkgeworCQl1X2ludAkgIG52cmFtX3NjYjsKKworCQkvKgorCQkgKiBQdWxsIHNjcmF0Y2ggcmFtIHNldHRpbmdzIGFuZCB0cmVhdCB0aGVtIGFzCisJCSAqIGlmIHRoZXkgYXJlIHRoZSBjb250ZW50cyBvZiBhbiBzZWVwcm9tIGlmCisJCSAqIHRoZSAnQURQVCcsICdCSU9TJywgb3IgJ0FTUEknIHNpZ25hdHVyZSBpcyBmb3VuZAorCQkgKiBpbiBTQ0IgMHhGRi4gIFdlIG1hbnVhbGx5IGNvbXBvc2UgdGhlIGRhdGEgYXMgMTZiaXQKKwkJICogdmFsdWVzIHRvIGF2b2lkIGVuZGlhbiBpc3N1ZXMuCisJCSAqLworCQlhaGRfc2V0X3NjYnB0cihhaGQsIDB4RkYpOworCQludnJhbV9zY2IgPSBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgTlZSQU1fU0NCX09GRlNFVCk7CisJCWlmIChudnJhbV9zY2IgIT0gMHhGRgorCQkgJiYgKChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMCkgPT0gJ0EnCisJCSAgICYmIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0JBU0UgKyAxKSA9PSAnRCcKKwkJICAgJiYgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQkFTRSArIDIpID09ICdQJworCQkgICAmJiBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMykgPT0gJ1QnKQorCQkgIHx8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMCkgPT0gJ0InCisJCSAgICYmIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0JBU0UgKyAxKSA9PSAnSScKKwkJICAgJiYgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQkFTRSArIDIpID09ICdPJworCQkgICAmJiBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMykgPT0gJ1MnKQorCQkgIHx8IChhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMCkgPT0gJ0EnCisJCSAgICYmIGFoZF9pbmJfc2NicmFtKGFoZCwgU0NCX0JBU0UgKyAxKSA9PSAnUycKKwkJICAgJiYgYWhkX2luYl9zY2JyYW0oYWhkLCBTQ0JfQkFTRSArIDIpID09ICdQJworCQkgICAmJiBhaGRfaW5iX3NjYnJhbShhaGQsIFNDQl9CQVNFICsgMykgPT0gJ0knKSkpIHsKKwkJCXVpbnQxNl90ICpzY19kYXRhOworCQkJaW50CSAgaTsKKworCQkJYWhkX3NldF9zY2JwdHIoYWhkLCBudnJhbV9zY2IpOworCQkJc2NfZGF0YSA9ICh1aW50MTZfdCAqKXNjOworCQkJZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDIpCisJCQkJKnNjX2RhdGErKyA9IGFoZF9pbndfc2NicmFtKGFoZCwgU0NCX0JBU0UraSk7CisJCQloYXZlX3NlZXByb20gPSBhaGRfdmVyaWZ5X2Nrc3VtKHNjKTsKKwkJCWlmIChoYXZlX3NlZXByb20pCisJCQkJYWhkLT5mbGFncyB8PSBBSERfU0NCX0NPTkZJR19VU0VEOworCQl9CisJfQorCisjaWYgQUhEX0RFQlVHCisJaWYgKGhhdmVfc2VlcHJvbSAhPSAwCisJICYmIChhaGRfZGVidWcgJiBBSERfRFVNUF9TRUVQUk9NKSAhPSAwKSB7CisJCXVpbnQxNl90ICpzY19kYXRhOworCQlpbnQJICBpOworCisJCXByaW50ZigiJXM6IFNlZXByb20gQ29udGVudHM6IiwgYWhkX25hbWUoYWhkKSk7CisJCXNjX2RhdGEgPSAodWludDE2X3QgKilzYzsKKwkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoKnNjKSk7IGkgKz0gMikKKwkJCXByaW50ZigiXG5cdDB4JS40eCIsIHNjX2RhdGFbaV0pOworCQlwcmludGYoIlxuIik7CisJfQorI2VuZGlmCisKKwlpZiAoIWhhdmVfc2VlcHJvbSkgeworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoIiVzOiBObyBTRUVQUk9NIGF2YWlsYWJsZS5cbiIsIGFoZF9uYW1lKGFoZCkpOworCQlhaGQtPmZsYWdzIHw9IEFIRF9VU0VERUZBVUxUUzsKKwkJZXJyb3IgPSBhaGRfZGVmYXVsdF9jb25maWcoYWhkKTsKKwkJYWRhcHRlcl9jb250cm9sID0gQ0ZBVVRPVEVSTXxDRlNFQVVUT1RFUk07CisJCWZyZWUoYWhkLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCQlhaGQtPnNlZXBfY29uZmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQllcnJvciA9IGFoZF9wYXJzZV9jZmdkYXRhKGFoZCwgc2MpOworCQlhZGFwdGVyX2NvbnRyb2wgPSBzYy0+YWRhcHRlcl9jb250cm9sOworCX0KKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlhaGRfY29uZmlndXJlX3Rlcm1pbmF0aW9uKGFoZCwgYWRhcHRlcl9jb250cm9sKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfY29uZmlndXJlX3Rlcm1pbmF0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRhcHRlcl9jb250cm9sKQoreworCWludAkgZXJyb3I7CisJdV9pbnQJIHN4ZnJjdGwxOworCXVpbnQ4X3QJIHRlcm1jdGw7CisJdWludDMyX3QgZGV2Y29uZmlnOworCisJZGV2Y29uZmlnID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlkZXZjb25maWcgJj0gflNUUFdMRVZFTDsKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfU1RQV0xFVkVMX0EpICE9IDApCisJCWRldmNvbmZpZyB8PSBTVFBXTEVWRUw7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTVFBXTEVWRUwgaXMgJXNcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLCAoZGV2Y29uZmlnICYgU1RQV0xFVkVMKSA/ICJvbiIgOiAib2ZmIik7CisJYWhkX3BjaV93cml0ZV9jb25maWcoYWhkLT5kZXZfc29mdGMsIERFVkNPTkZJRywgZGV2Y29uZmlnLCAvKmJ5dGVzKi80KTsKKyAKKwkvKiBNYWtlIHN1cmUgY3VycmVudCBzZW5zaW5nIGlzIG9mZi4gKi8KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfQ1VSUkVOVF9TRU5TSU5HKSAhPSAwKSB7CisJCSh2b2lkKWFoZF93cml0ZV9mbGV4cG9ydChhaGQsIEZMWEFERFJfUk9NU1RBVF9DVVJTRU5TRUNUTCwgMCk7CisJfQorCisJLyoKKwkgKiBSZWFkIHRvIHNlbnNlLiAgV3JpdGUgdG8gc2V0LgorCSAqLworCWVycm9yID0gYWhkX3JlYWRfZmxleHBvcnQoYWhkLCBGTFhBRERSX1RFUk1DVEwsICZ0ZXJtY3RsKTsKKwlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGQVVUT1RFUk0pID09IDApIHsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogTWFudWFsIFByaW1hcnkgVGVybWluYXRpb25cbiIsCisJCQkgICAgICAgYWhkX25hbWUoYWhkKSk7CisJCXRlcm1jdGwgJj0gfihGTFhfVEVSTUNUTF9FTlBSSUxPV3xGTFhfVEVSTUNUTF9FTlBSSUhJR0gpOworCQlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGU1RFUk0pICE9IDApCisJCQl0ZXJtY3RsIHw9IEZMWF9URVJNQ1RMX0VOUFJJTE9XOworCQlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGV1NURVJNKSAhPSAwKQorCQkJdGVybWN0bCB8PSBGTFhfVEVSTUNUTF9FTlBSSUhJR0g7CisJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7CisJCXByaW50ZigiJXM6IFByaW1hcnkgQXV0by1UZXJtIFNlbnNpbmcgZmFpbGVkISAiCisJCSAgICAgICAiVXNpbmcgRGVmYXVsdHMuXG4iLCBhaGRfbmFtZShhaGQpKTsKKwkJdGVybWN0bCA9IEZMWF9URVJNQ1RMX0VOUFJJTE9XfEZMWF9URVJNQ1RMX0VOUFJJSElHSDsKKwl9CisKKwlpZiAoKGFkYXB0ZXJfY29udHJvbCAmIENGU0VBVVRPVEVSTSkgPT0gMCkgeworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoIiVzOiBNYW51YWwgU2Vjb25kYXJ5IFRlcm1pbmF0aW9uXG4iLAorCQkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCQl0ZXJtY3RsICY9IH4oRkxYX1RFUk1DVExfRU5TRUNMT1d8RkxYX1RFUk1DVExfRU5TRUNISUdIKTsKKwkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRlNFTE9XVEVSTSkgIT0gMCkKKwkJCXRlcm1jdGwgfD0gRkxYX1RFUk1DVExfRU5TRUNMT1c7CisJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTRUhJR0hURVJNKSAhPSAwKQorCQkJdGVybWN0bCB8PSBGTFhfVEVSTUNUTF9FTlNFQ0hJR0g7CisJfSBlbHNlIGlmIChlcnJvciAhPSAwKSB7CisJCXByaW50ZigiJXM6IFNlY29uZGFyeSBBdXRvLVRlcm0gU2Vuc2luZyBmYWlsZWQhICIKKwkJICAgICAgICJVc2luZyBEZWZhdWx0cy5cbiIsIGFoZF9uYW1lKGFoZCkpOworCQl0ZXJtY3RsIHw9IEZMWF9URVJNQ1RMX0VOU0VDTE9XfEZMWF9URVJNQ1RMX0VOU0VDSElHSDsKKwl9CisKKwkvKgorCSAqIE5vdyBzZXQgdGhlIHRlcm1pbmF0aW9uIGJhc2VkIG9uIHdoYXQgd2UgZm91bmQuCisJICovCisJc3hmcmN0bDEgPSBhaGRfaW5iKGFoZCwgU1hGUkNUTDEpICYgflNUUFdFTjsKKwlpZiAoKHRlcm1jdGwgJiBGTFhfVEVSTUNUTF9FTlBSSUxPVykgIT0gMCkgeworCQlhaGQtPmZsYWdzIHw9IEFIRF9URVJNX0VOQl9BOworCQlzeGZyY3RsMSB8PSBTVFBXRU47CisJfQorCS8qIE11c3Qgc2V0IHRoZSBsYXRjaCBvbmNlIGluIG9yZGVyIHRvIGJlIGVmZmVjdGl2ZS4gKi8KKwlhaGRfb3V0YihhaGQsIFNYRlJDVEwxLCBzeGZyY3RsMXxTVFBXRU4pOworCWFoZF9vdXRiKGFoZCwgU1hGUkNUTDEsIHN4ZnJjdGwxKTsKKworCWVycm9yID0gYWhkX3dyaXRlX2ZsZXhwb3J0KGFoZCwgRkxYQUREUl9URVJNQ1RMLCB0ZXJtY3RsKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIiVzOiBVbmFibGUgdG8gc2V0IHRlcm1pbmF0aW9uIHNldHRpbmdzIVxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCkpOworCX0gZWxzZSBpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIlczogUHJpbWFyeSBIaWdoIGJ5dGUgdGVybWluYXRpb24gJXNhYmxlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICAodGVybWN0bCAmIEZMWF9URVJNQ1RMX0VOUFJJSElHSCkgPyAiRW4iIDogIkRpcyIpOworCisJCXByaW50ZigiJXM6IFByaW1hcnkgTG93IGJ5dGUgdGVybWluYXRpb24gJXNhYmxlZFxuIiwKKwkJICAgICAgIGFoZF9uYW1lKGFoZCksCisJCSAgICAgICAodGVybWN0bCAmIEZMWF9URVJNQ1RMX0VOUFJJTE9XKSA/ICJFbiIgOiAiRGlzIik7CisKKwkJcHJpbnRmKCIlczogU2Vjb25kYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAlc2FibGVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgICh0ZXJtY3RsICYgRkxYX1RFUk1DVExfRU5TRUNISUdIKSA/ICJFbiIgOiAiRGlzIik7CisKKwkJcHJpbnRmKCIlczogU2Vjb25kYXJ5IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQpLAorCQkgICAgICAgKHRlcm1jdGwgJiBGTFhfVEVSTUNUTF9FTlNFQ0xPVykgPyAiRW4iIDogIkRpcyIpOworCX0KKwlyZXR1cm47Cit9CisKKyNkZWZpbmUJRFBFCTB4ODAKKyNkZWZpbmUgU1NFCTB4NDAKKyNkZWZpbmUJUk1BCTB4MjAKKyNkZWZpbmUJUlRBCTB4MTAKKyNkZWZpbmUgU1RBCTB4MDgKKyNkZWZpbmUgRFBSCTB4MDEKKworc3RhdGljIGNvbnN0IGNoYXIgKnNwbGl0X3N0YXR1c19zb3VyY2VbXSA9Cit7CisJIkRGRjAiLAorCSJERkYxIiwKKwkiT1ZMWSIsCisJIkNNQyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcGNpX3N0YXR1c19zb3VyY2VbXSA9Cit7CisJIkRGRjAiLAorCSJERkYxIiwKKwkiU0ciLAorCSJDTUMiLAorCSJPVkxZIiwKKwkiTk9ORSIsCisJIk1TSSIsCisJIlRBUkciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc3BsaXRfc3RhdHVzX3N0cmluZ3NbXSA9Cit7CisJIiVzOiBSZWNlaXZlZCBzcGxpdCByZXNwb25zZSBpbiAlcy5cbiIsCisJIiVzOiBSZWNlaXZlZCBzcGxpdCBjb21wbGV0aW9uIGVycm9yIG1lc3NhZ2UgaW4gJXNcbiIsCisJIiVzOiBSZWNlaXZlIG92ZXJydW4gaW4gJXNcbiIsCisJIiVzOiBDb3VudCBub3QgY29tcGxldGUgaW4gJXNcbiIsCisJIiVzOiBTcGxpdCBjb21wbGV0aW9uIGRhdGEgYnVja2V0IGluICVzXG4iLAorCSIlczogU3BsaXQgY29tcGxldGlvbiBhZGRyZXNzIGVycm9yIGluICVzXG4iLAorCSIlczogU3BsaXQgY29tcGxldGlvbiBieXRlIGNvdW50IGVycm9yIGluICVzXG4iLAorCSIlczogU2lnbmFsZWQgVGFyZ2V0LWFib3J0IHRvIGVhcmx5IHRlcm1pbmF0ZSBhIHNwbGl0IGluICVzXG4iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcGNpX3N0YXR1c19zdHJpbmdzW10gPQoreworCSIlczogRGF0YSBQYXJpdHkgRXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdmlhIFBFUlIjIGluICVzXG4iLAorCSIlczogVGFyZ2V0IGluaXRpYWwgd2FpdCBzdGF0ZSBlcnJvciBpbiAlc1xuIiwKKwkiJXM6IFNwbGl0IGNvbXBsZXRpb24gcmVhZCBkYXRhIHBhcml0eSBlcnJvciBpbiAlc1xuIiwKKwkiJXM6IFNwbGl0IGNvbXBsZXRpb24gYWRkcmVzcyBhdHRyaWJ1dGUgcGFyaXR5IGVycm9yIGluICVzXG4iLAorCSIlczogUmVjZWl2ZWQgYSBUYXJnZXQgQWJvcnQgaW4gJXNcbiIsCisJIiVzOiBSZWNlaXZlZCBhIE1hc3RlciBBYm9ydCBpbiAlc1xuIiwKKwkiJXM6IFNpZ25hbCBTeXN0ZW0gRXJyb3IgRGV0ZWN0ZWQgaW4gJXNcbiIsCisJIiVzOiBBZGRyZXNzIG9yIFdyaXRlIFBoYXNlIFBhcml0eSBFcnJvciBEZXRlY3RlZCBpbiAlcy5cbiIKK307CisKK3ZvaWQKK2FoZF9wY2lfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJdWludDhfdAkJcGNpX3N0YXR1c1s4XTsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJcGNpX3N0YXR1czE7CisJdV9pbnQJCWludHN0YXQ7CisJdV9pbnQJCWk7CisJdV9pbnQJCXJlZzsKKwkKKwlpbnRzdGF0ID0gYWhkX2luYihhaGQsIElOVFNUQVQpOworCisJaWYgKChpbnRzdGF0ICYgU1BMVElOVCkgIT0gMCkKKwkJYWhkX3BjaV9zcGxpdF9pbnRyKGFoZCwgaW50c3RhdCk7CisKKwlpZiAoKGludHN0YXQgJiBQQ0lJTlQpID09IDApCisJCXJldHVybjsKKworCXByaW50ZigiJXM6IFBDSSBlcnJvciBJbnRlcnJ1cHRcbiIsIGFoZF9uYW1lKGFoZCkpOworCXNhdmVkX21vZGVzID0gYWhkX3NhdmVfbW9kZXMoYWhkKTsKKwlhaGRfZHVtcF9jYXJkX3N0YXRlKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX0NGRywgQUhEX01PREVfQ0ZHKTsKKwlmb3IgKGkgPSAwLCByZWcgPSBERjBQQ0lTVEFUOyBpIDwgODsgaSsrLCByZWcrKykgeworCisJCWlmIChpID09IDUpCisJCQljb250aW51ZTsKKwkJcGNpX3N0YXR1c1tpXSA9IGFoZF9pbmIoYWhkLCByZWcpOworCQkvKiBDbGVhciBsYXRjaGVkIGVycm9ycy4gIFNvIG91ciBpbnRlcnJ1cHQgZGVhc3NlcnRzLiAqLworCQlhaGRfb3V0YihhaGQsIHJlZywgcGNpX3N0YXR1c1tpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl1X2ludCBiaXQ7CisJCisJCWlmIChpID09IDUpCisJCQljb250aW51ZTsKKworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisKKwkJCWlmICgocGNpX3N0YXR1c1tpXSAmICgweDEgPDwgYml0KSkgIT0gMCkgeworCQkJCXN0YXRpYyBjb25zdCBjaGFyICpzOworCisJCQkJcyA9IHBjaV9zdGF0dXNfc3RyaW5nc1tiaXRdOworCQkJCWlmIChpID09IDcvKlRBUkcqLyAmJiBiaXQgPT0gMykKKwkJCQkJcyA9ICIlczogU2lnbmFsZWQgVGFyZ2V0IEFib3J0XG4iOworCQkJCXByaW50ZihzLCBhaGRfbmFtZShhaGQpLCBwY2lfc3RhdHVzX3NvdXJjZVtpXSk7CisJCQl9CisJCX0JCisJfQorCXBjaV9zdGF0dXMxID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywKKwkJCQkJICBQQ0lSX1NUQVRVUyArIDEsIC8qYnl0ZXMqLzEpOworCWFoZF9wY2lfd3JpdGVfY29uZmlnKGFoZC0+ZGV2X3NvZnRjLCBQQ0lSX1NUQVRVUyArIDEsCisJCQkgICAgIHBjaV9zdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKwlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKKwlhaGRfb3V0YihhaGQsIENMUklOVCwgQ0xSUENJSU5UKTsKKwlhaGRfdW5wYXVzZShhaGQpOworfQorCitzdGF0aWMgdm9pZAorYWhkX3BjaV9zcGxpdF9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCkKK3sKKwl1aW50OF90CQlzcGxpdF9zdGF0dXNbNF07CisJdWludDhfdAkJc3BsaXRfc3RhdHVzMVs0XTsKKwl1aW50OF90CQlzZ19zcGxpdF9zdGF0dXNbMl07CisJdWludDhfdAkJc2dfc3BsaXRfc3RhdHVzMVsyXTsKKwlhaGRfbW9kZV9zdGF0ZQlzYXZlZF9tb2RlczsKKwl1X2ludAkJaTsKKwl1aW50MTZfdAlwY2l4X3N0YXR1czsKKworCS8qCisJICogQ2hlY2sgZm9yIHNwbGl0cyBpbiBhbGwgbW9kZXMuICBNb2RlcyAwIGFuZCAxCisJICogYWRkaXRpb25hbGx5IGhhdmUgU0cgZW5naW5lIHNwbGl0cyB0byBsb29rIGF0LgorCSAqLworCXBjaXhfc3RhdHVzID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJWFJfU1RBVFVTLAorCQkJCQkgIC8qYnl0ZXMqLzIpOworCXByaW50ZigiJXM6IFBDSSBTcGxpdCBJbnRlcnJ1cHQgLSBQQ0ktWCBzdGF0dXMgPSAweCV4XG4iLAorCSAgICAgICBhaGRfbmFtZShhaGQpLCBwY2l4X3N0YXR1cyk7CisJc2F2ZWRfbW9kZXMgPSBhaGRfc2F2ZV9tb2RlcyhhaGQpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJYWhkX3NldF9tb2RlcyhhaGQsIGksIGkpOworCisJCXNwbGl0X3N0YXR1c1tpXSA9IGFoZF9pbmIoYWhkLCBEQ0hTUExUU1RBVDApOworCQlzcGxpdF9zdGF0dXMxW2ldID0gYWhkX2luYihhaGQsIERDSFNQTFRTVEFUMSk7CisJCS8qIENsZWFyIGxhdGNoZWQgZXJyb3JzLiAgU28gb3VyIGludGVycnVwdCBkZWFzc2VydHMuICovCisJCWFoZF9vdXRiKGFoZCwgRENIU1BMVFNUQVQwLCBzcGxpdF9zdGF0dXNbaV0pOworCQlhaGRfb3V0YihhaGQsIERDSFNQTFRTVEFUMSwgc3BsaXRfc3RhdHVzMVtpXSk7CisJCWlmIChpID4gMSkKKwkJCWNvbnRpbnVlOworCQlzZ19zcGxpdF9zdGF0dXNbaV0gPSBhaGRfaW5iKGFoZCwgU0dTUExUU1RBVDApOworCQlzZ19zcGxpdF9zdGF0dXMxW2ldID0gYWhkX2luYihhaGQsIFNHU1BMVFNUQVQxKTsKKwkJLyogQ2xlYXIgbGF0Y2hlZCBlcnJvcnMuICBTbyBvdXIgaW50ZXJydXB0IGRlYXNzZXJ0cy4gKi8KKwkJYWhkX291dGIoYWhkLCBTR1NQTFRTVEFUMCwgc2dfc3BsaXRfc3RhdHVzW2ldKTsKKwkJYWhkX291dGIoYWhkLCBTR1NQTFRTVEFUMSwgc2dfc3BsaXRfc3RhdHVzMVtpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1X2ludCBiaXQ7CisKKwkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCisJCQlpZiAoKHNwbGl0X3N0YXR1c1tpXSAmICgweDEgPDwgYml0KSkgIT0gMCkgeworCQkJCXN0YXRpYyBjb25zdCBjaGFyICpzOworCisJCQkJcyA9IHNwbGl0X3N0YXR1c19zdHJpbmdzW2JpdF07CisJCQkJcHJpbnRmKHMsIGFoZF9uYW1lKGFoZCksCisJCQkJICAgICAgIHNwbGl0X3N0YXR1c19zb3VyY2VbaV0pOworCQkJfQorCisJCQlpZiAoaSA+IDEpCisJCQkJY29udGludWU7CisKKwkJCWlmICgoc2dfc3BsaXRfc3RhdHVzW2ldICYgKDB4MSA8PCBiaXQpKSAhPSAwKSB7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgKnM7CisKKwkJCQlzID0gc3BsaXRfc3RhdHVzX3N0cmluZ3NbYml0XTsKKwkJCQlwcmludGYocywgYWhkX25hbWUoYWhkKSwgIlNHIik7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBDbGVhciBQQ0ktWCBzdGF0dXMgYml0cy4KKwkgKi8KKwlhaGRfcGNpX3dyaXRlX2NvbmZpZyhhaGQtPmRldl9zb2Z0YywgUENJWFJfU1RBVFVTLAorCQkJICAgICBwY2l4X3N0YXR1cywgLypieXRlcyovMik7CisJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUlNQTFRJTlQpOworCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworfQorCitzdGF0aWMgaW50CithaGRfYWljNzkwMV9zZXR1cChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisKKwlhaGQtPmNoaXAgPSBBSERfQUlDNzkwMTsKKwlhaGQtPmZlYXR1cmVzID0gQUhEX0FJQzc5MDFfRkU7CisJcmV0dXJuIChhaGRfYWljNzkwWF9zZXR1cChhaGQpKTsKK30KKworc3RhdGljIGludAorYWhkX2FpYzc5MDFBX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKworCWFoZC0+Y2hpcCA9IEFIRF9BSUM3OTAxQTsKKwlhaGQtPmZlYXR1cmVzID0gQUhEX0FJQzc5MDFBX0ZFOworCXJldHVybiAoYWhkX2FpYzc5MFhfc2V0dXAoYWhkKSk7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9haWM3OTAyX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlhaGQtPmNoaXAgPSBBSERfQUlDNzkwMjsKKwlhaGQtPmZlYXR1cmVzID0gQUhEX0FJQzc5MDJfRkU7CisJcmV0dXJuIChhaGRfYWljNzkwWF9zZXR1cChhaGQpKTsKK30KKworc3RhdGljIGludAorYWhkX2FpYzc5MFhfc2V0dXAoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCWFoZF9kZXZfc29mdGNfdCBwY2k7CisJdV9pbnQgcmV2OworCisJcGNpID0gYWhkLT5kZXZfc29mdGM7CisJcmV2ID0gYWhkX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfUkVWSUQsIC8qYnl0ZXMqLzEpOworCWlmIChyZXYgPCBJRF9BSUM3OTAyX1BDSV9SRVZfQTQpIHsKKwkJcHJpbnRmKCIlczogVW5hYmxlIHRvIGF0dGFjaCB0byB1bnN1cHBvcnRlZCBjaGlwIHJldmlzaW9uICVkXG4iLAorCQkgICAgICAgYWhkX25hbWUoYWhkKSwgcmV2KTsKKwkJYWhkX3BjaV93cml0ZV9jb25maWcocGNpLCBQQ0lSX0NPTU1BTkQsIDAsIC8qYnl0ZXMqLzIpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisJYWhkLT5jaGFubmVsID0gYWhkX2dldF9wY2lfZnVuY3Rpb24ocGNpKSArICdBJzsKKwlpZiAocmV2IDwgSURfQUlDNzkwMl9QQ0lfUkVWX0IwKSB7CisJCS8qCisJCSAqIEVuYWJsZSBBIHNlcmllcyB3b3JrYXJvdW5kcy4KKwkJICovCisJCWFoZC0+YnVncyB8PSBBSERfU0VOVF9TQ0JfVVBEQVRFX0JVR3xBSERfQUJPUlRfTFFJX0JVRworCQkJICB8ICBBSERfUEtUX0JJVEJVQ0tFVF9CVUd8QUhEX0xPTkdfU0VUSU1PX0JVRworCQkJICB8ICBBSERfTkxRSUNSQ19ERUxBWUVEX0JVR3xBSERfU0NTSVJTVF9CVUcKKwkJCSAgfCAgQUhEX0xRT19BVE5PX0JVR3xBSERfQVVUT0ZMVVNIX0JVRworCQkJICB8ICBBSERfQ0xSTFFPX0FVVE9DTFJfQlVHfEFIRF9QQ0lYX01NQVBJT19CVUcKKwkJCSAgfCAgQUhEX1BDSVhfQ0hJUFJTVF9CVUd8QUhEX1BDSVhfU0NCUkFNX1JEX0JVRworCQkJICB8ICBBSERfUEtUSVpFRF9TVEFUVVNfQlVHfEFIRF9QS1RfTFVOX0JVRworCQkJICB8ICBBSERfTURGRl9XU0NCUFRSX0JVR3xBSERfUkVHX1NMT1dfU0VUVExFX0JVRworCQkJICB8ICBBSERfU0VUX01PREVfQlVHfEFIRF9CVVNGUkVFUkVWX0JVRworCQkJICB8ICBBSERfTk9OUEFDS0ZJRk9fQlVHfEFIRF9QQUNFRF9ORUdUQUJMRV9CVUcKKwkJCSAgfCAgQUhEX0ZBSU5UX0xFRF9CVUc7CisKKwkJLyoKKwkJICogSU8gQ2VsbCBwYXJhbXRlciBzZXR1cC4KKwkJICovCisJCUFIRF9TRVRfUFJFQ09NUChhaGQsIEFIRF9QUkVDT01QX0NVVEJBQ0tfMjkpOworCisJCWlmICgoYWhkLT5mbGFncyAmIEFIRF9IUF9CT0FSRCkgPT0gMCkKKwkJCUFIRF9TRVRfU0xFV1JBVEUoYWhkLCBBSERfU0xFV1JBVEVfREVGX1JFVkEpOworCX0gZWxzZSB7CisJCXVfaW50IGRldmNvbmZpZzE7CisKKwkJYWhkLT5mZWF0dXJlcyB8PSBBSERfUlRJfEFIRF9ORVdfSU9DRUxMX09QVFMKKwkJCSAgICAgIHwgIEFIRF9ORVdfREZDTlRSTF9PUFRTfEFIRF9GQVNUX0NEQl9ERUxJVkVSWTsKKwkJYWhkLT5idWdzIHw9IEFIRF9MUU9PVkVSUlVOX0JVR3xBSERfRUFSTFlfUkVRX0JVRzsKKworCQkvKgorCQkgKiBTb21lIGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgaW4gdGhlIDc5MDFCLgorCQkgKi8KKwkJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX01VTFRJX0ZVTkMpICE9IDApCisJCQlhaGQtPmJ1Z3MgfD0gQUhEX0lOVENPTExJU0lPTl9CVUd8QUhEX0FCT1JUX0xRSV9CVUc7CisKKwkJLyoKKwkJICogSU8gQ2VsbCBwYXJhbXRlciBzZXR1cC4KKwkJICovCisJCUFIRF9TRVRfUFJFQ09NUChhaGQsIEFIRF9QUkVDT01QX0NVVEJBQ0tfMjkpOworCQlBSERfU0VUX1NMRVdSQVRFKGFoZCwgQUhEX1NMRVdSQVRFX0RFRl9SRVZCKTsKKwkJQUhEX1NFVF9BTVBMSVRVREUoYWhkLCBBSERfQU1QTElUVURFX0RFRik7CisKKwkJLyoKKwkJICogU2V0IHRoZSBQUkVRRElTIGJpdCBmb3IgSDJCIHdoaWNoIGRpc2FibGVzIHNvbWUgd29ya2Fyb3VuZAorCQkgKiB0aGF0IGRvZXNuJ3Qgd29yayBvbiByZWd1bGFyIFBDSSBidXNzZXMuCisJCSAqIFhYWCAtIEZpbmQgb3V0IGV4YWN0bHkgd2hhdCB0aGlzIGRvZXMgZnJvbSB0aGUgaGFyZHdhcmUKKwkJICogCSBmb2xrcyEKKwkJICovCisJCWRldmNvbmZpZzEgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgREVWQ09ORklHMSwgLypieXRlcyovMSk7CisJCWFoZF9wY2lfd3JpdGVfY29uZmlnKHBjaSwgREVWQ09ORklHMSwKKwkJCQkgICAgIGRldmNvbmZpZzF8UFJFUURJUywgLypieXRlcyovMSk7CisJCWRldmNvbmZpZzEgPSBhaGRfcGNpX3JlYWRfY29uZmlnKHBjaSwgREVWQ09ORklHMSwgLypieXRlcyovMSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2ZlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBBZGFwdGVjIEFJQzc5eHggZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkJAorICoKKyAqLworI2lmbmRlZiBfQUlDNzlYWF9QQ0lfSF8KKyNkZWZpbmUgX0FJQzc5WFhfUENJX0hfCisKKyNkZWZpbmUgSURfQUxMX01BU0sJCQkweEZGRkZGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgSURfQUxMX0lST0NfTUFTSwkJMHhGRjdGRkZGRkZGRkZGRkZGdWxsCisjZGVmaW5lIElEX0RFVl9WRU5ET1JfTUFTSwkJMHhGRkZGRkZGRjAwMDAwMDAwdWxsCisjZGVmaW5lIElEXzkwMDVfR0VORVJJQ19NQVNLCQkweEZGRjBGRkZGMDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfOTAwNV9HRU5FUklDX0lST0NfTUFTSwkweEZGNzBGRkZGMDAwMDAwMDB1bGwKKworI2RlZmluZSBJRF9BSUM3OTAxCQkJMHg4MDBGOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTMyMEEJCQkweDgwMDA5MDA1MDA2MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwQUxQCQkJMHg4MDE3OTAwNTAwNDQ5MDA1dWxsCisKKyNkZWZpbmUgSURfQUlDNzkwMUEJCQkweDgwMUU5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwCQkJMHg4MDEyOTAwNTAwNDI5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTMyMEIJCQkweDgwMTM5MDA1MDA0MzkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MzIwTFAJCQkweDgwMTQ5MDA1MDA0NDkwMDV1bGwKKworI2RlZmluZSBJRF9BSUM3OTAyCQkJMHg4MDFGOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FJQzc5MDJfQgkJCTB4ODAxRDkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjAJCQkweDgwMTA5MDA1MDA0MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzM5MzIwX0IJCQkweDgwMTU5MDA1MDA0MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzM5MzIwQQkJCTB4ODAxNjkwMDUwMDQwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjBECQkJMHg4MDExOTAwNTAwNDE5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTMyMERfQgkJCTB4ODAxQzkwMDUwMDQxOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzkzMjBEX0hQCQkweDgwMTE5MDA1MDBBQzBFMTF1bGwKKyNkZWZpbmUgSURfQUhBXzM5MzIwRF9CX0hQCQkweDgwMUM5MDA1MDBBQzBFMTF1bGwKKworI2VuZGlmIC8qIF9BSUM3OVhYX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFjZDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiBTdHJpbmcgaGFuZGxpbmcgY29kZSBjb3VydGVzeSBvZiBHZXJhcmQgUm91ZGllcidzIDxncm91ZGllckBjbHViLWludGVybmV0LmZyPgorICogc3ltIGRyaXZlci4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYyMxOSAkCisgKi8KKyNpbmNsdWRlICJhaWM3OXh4X29zbS5oIgorI2luY2x1ZGUgImFpYzc5eHhfaW5saW5lLmgiCisKK3N0YXRpYyB2b2lkCWNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQJY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQJYWhkX2R1bXBfdGFyZ2V0X3N0YXRlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkgICAgICBzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkJICAgICAgdV9pbnQgb3VyX2lkLCBjaGFyIGNoYW5uZWwsCisJCQkJICAgICAgdV9pbnQgdGFyZ2V0X2lkLCB1X2ludCB0YXJnZXRfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkCWFoZF9kdW1wX2RldmljZV9zdGF0ZShzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkJICAgICAgc3RydWN0IGFoZF9saW51eF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWFoZF9wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCSAgICAgICBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMgdm9pZAorY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaWYgKGluZm8tPnBvcyArIGxlbiA+IGluZm8tPm9mZnNldCArIGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+b2Zmc2V0ICsgaW5mby0+bGVuZ3RoIC0gaW5mby0+cG9zOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZm8tPnBvcyA8IGluZm8tPm9mZnNldCkgeworCQlvZmZfdCBwYXJ0aWFsOworCisJCXBhcnRpYWwgPSBpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3M7CisJCWRhdGEgKz0gcGFydGlhbDsKKwkJaW5mby0+cG9zICs9IHBhcnRpYWw7CisJCWxlbiAgLT0gcGFydGlhbDsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlpbmZvLT5idWZmZXIgKz0gbGVuOworCX0KK30KKworc3RhdGljIGludAorY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzI1Nl07CisJaW50IGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOworCXJldHVybiAobGVuKTsKK30KKwordm9pZAorYWhkX2Zvcm1hdF90cmFuc2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhkX3RyYW5zaW5mbyAqdGluZm8pCit7CisJdV9pbnQgc3BlZWQ7CisJdV9pbnQgZnJlcTsKKwl1X2ludCBtYjsKKworCWlmICh0aW5mby0+cGVyaW9kID09IEFIRF9QRVJJT0RfVU5LTk9XTikgeworCQljb3B5X2luZm8oaW5mbywgIlJlbmVnb3RpYXRpb24gUGVuZGluZ1xuIik7CisJCXJldHVybjsKKwl9CisgICAgICAgIHNwZWVkID0gMzMwMDsKKyAgICAgICAgZnJlcSA9IDA7CisJaWYgKHRpbmZvLT5vZmZzZXQgIT0gMCkgeworCQlmcmVxID0gYWljX2NhbGNfc3luY3NyYXRlKHRpbmZvLT5wZXJpb2QpOworCQlzcGVlZCA9IGZyZXE7CisJfQorCXNwZWVkICo9ICgweDAxIDw8IHRpbmZvLT53aWR0aCk7CisgICAgICAgIG1iID0gc3BlZWQgLyAxMDAwOworICAgICAgICBpZiAobWIgPiAwKQorCQljb3B5X2luZm8oaW5mbywgIiVkLiUwM2RNQi9zIHRyYW5zZmVycyIsIG1iLCBzcGVlZCAlIDEwMDApOworICAgICAgICBlbHNlCisJCWNvcHlfaW5mbyhpbmZvLCAiJWRLQi9zIHRyYW5zZmVycyIsIHNwZWVkKTsKKworCWlmIChmcmVxICE9IDApIHsKKwkJaW50CXByaW50ZWRfb3B0aW9uczsKKworCQlwcmludGVkX29wdGlvbnMgPSAwOworCQljb3B5X2luZm8oaW5mbywgIiAoJWQuJTAzZE1IeiIsIGZyZXEgLyAxMDAwLCBmcmVxICUgMTAwMCk7CisJCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUkRfU1RSTSkgIT0gMCkgeworCQkJY29weV9pbmZvKGluZm8sICIgUkRTVFJNIik7CisJCQlwcmludGVkX29wdGlvbnMrKzsKKwkJfQorCQlpZiAoKHRpbmZvLT5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkJY29weV9pbmZvKGluZm8sICIlcyIsIHByaW50ZWRfb3B0aW9ucyA/ICJ8RFQiIDogIiBEVCIpOworCQkJcHJpbnRlZF9vcHRpb25zKys7CisJCX0KKwkJaWYgKCh0aW5mby0+cHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9JVV9SRVEpICE9IDApIHsKKwkJCWNvcHlfaW5mbyhpbmZvLCAiJXMiLCBwcmludGVkX29wdGlvbnMgPyAifElVIiA6ICIgSVUiKTsKKwkJCXByaW50ZWRfb3B0aW9ucysrOworCQl9CisJCWlmICgodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfUlRJKSAhPSAwKSB7CisJCQljb3B5X2luZm8oaW5mbywgIiVzIiwKKwkJCQkgIHByaW50ZWRfb3B0aW9ucyA/ICJ8UlRJIiA6ICIgUlRJIik7CisJCQlwcmludGVkX29wdGlvbnMrKzsKKwkJfQorCQlpZiAoKHRpbmZvLT5wcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX1FBU19SRVEpICE9IDApIHsKKwkJCWNvcHlfaW5mbyhpbmZvLCAiJXMiLAorCQkJCSAgcHJpbnRlZF9vcHRpb25zID8gInxRQVMiIDogIiBRQVMiKTsKKwkJCXByaW50ZWRfb3B0aW9ucysrOworCQl9CisJfQorCisJaWYgKHRpbmZvLT53aWR0aCA+IDApIHsKKwkJaWYgKGZyZXEgIT0gMCkgeworCQkJY29weV9pbmZvKGluZm8sICIsICIpOworCQl9IGVsc2UgeworCQkJY29weV9pbmZvKGluZm8sICIgKCIpOworCQl9CisJCWNvcHlfaW5mbyhpbmZvLCAiJWRiaXQpIiwgOCAqICgweDAxIDw8IHRpbmZvLT53aWR0aCkpOworCX0gZWxzZSBpZiAoZnJlcSAhPSAwKSB7CisJCWNvcHlfaW5mbyhpbmZvLCAiKSIpOworCX0KKwljb3B5X2luZm8oaW5mbywgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCithaGRfZHVtcF90YXJnZXRfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCSAgICAgIHVfaW50IG91cl9pZCwgY2hhciBjaGFubmVsLCB1X2ludCB0YXJnZXRfaWQsCisJCSAgICAgIHVfaW50IHRhcmdldF9vZmZzZXQpCit7CisJc3RydWN0CWFoZF9saW51eF90YXJnZXQgKnRhcmc7CisJc3RydWN0CWFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGRfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CWx1bjsKKworCXRpbmZvID0gYWhkX2ZldGNoX3RyYW5zaW5mbyhhaGQsIGNoYW5uZWwsIG91cl9pZCwKKwkJCQkgICAgdGFyZ2V0X2lkLCAmdHN0YXRlKTsKKwljb3B5X2luZm8oaW5mbywgIlRhcmdldCAlZCBOZWdvdGlhdGlvbiBTZXR0aW5nc1xuIiwgdGFyZ2V0X2lkKTsKKwljb3B5X2luZm8oaW5mbywgIlx0VXNlcjogIik7CisJYWhkX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT51c2VyKTsKKwl0YXJnID0gYWhkLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF9vZmZzZXRdOworCWlmICh0YXJnID09IE5VTEwpCisJCXJldHVybjsKKworCWNvcHlfaW5mbyhpbmZvLCAiXHRHb2FsOiAiKTsKKwlhaGRfZm9ybWF0X3RyYW5zaW5mbyhpbmZvLCAmdGluZm8tPmdvYWwpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRDdXJyOiAiKTsKKwlhaGRfZm9ybWF0X3RyYW5zaW5mbyhpbmZvLCAmdGluZm8tPmN1cnIpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRUcmFuc21pc3Npb24gRXJyb3JzICVsZFxuIiwgdGFyZy0+ZXJyb3JzX2RldGVjdGVkKTsKKworCWZvciAobHVuID0gMDsgbHVuIDwgQUhEX05VTV9MVU5TOyBsdW4rKykgeworCQlzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2OworCisJCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKKworCQlpZiAoZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlhaGRfZHVtcF9kZXZpY2Vfc3RhdGUoaW5mbywgZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGRfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhkX2xpbnV4X2RldmljZSAqZGV2KQoreworCWNvcHlfaW5mbyhpbmZvLCAiXHRDaGFubmVsICVjIFRhcmdldCAlZCBMdW4gJWQgU2V0dGluZ3NcbiIsCisJCSAgZGV2LT50YXJnZXQtPmNoYW5uZWwgKyAnQScsIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuKTsKKworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdENvbW1hbmRzIFF1ZXVlZCAlbGRcbiIsIGRldi0+Y29tbWFuZHNfaXNzdWVkKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kcyBBY3RpdmUgJWRcbiIsIGRldi0+YWN0aXZlKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kIE9wZW5pbmdzICVkXG4iLCBkZXYtPm9wZW5pbmdzKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRNYXggVGFnZ2VkIE9wZW5pbmdzICVkXG4iLCBkZXYtPm1heHRhZ3MpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdERldmljZSBRdWV1ZSBGcm96ZW4gQ291bnQgJWRcbiIsIGRldi0+cWZyb3plbik7Cit9CisKK3N0YXRpYyBpbnQKK2FoZF9wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJYWhkX21vZGVfc3RhdGUgc2F2ZWRfbW9kZXM7CisJaW50IGhhdmVfc2VlcHJvbTsKKwl1X2xvbmcgczsKKwlpbnQgcGF1c2VkOworCWludCB3cml0dGVuOworCisJLyogRGVmYXVsdCB0byBmYWlsdXJlLiAqLworCXdyaXR0ZW4gPSAtRUlOVkFMOworCWFoZF9sb2NrKGFoZCwgJnMpOworCXBhdXNlZCA9IGFoZF9pc19wYXVzZWQoYWhkKTsKKwlpZiAoIXBhdXNlZCkKKwkJYWhkX3BhdXNlKGFoZCk7CisKKwlzYXZlZF9tb2RlcyA9IGFoZF9zYXZlX21vZGVzKGFoZCk7CisJYWhkX3NldF9tb2RlcyhhaGQsIEFIRF9NT0RFX1NDU0ksIEFIRF9NT0RFX1NDU0kpOworCWlmIChsZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBzZWVwcm9tX2NvbmZpZykpIHsKKwkJcHJpbnRmKCJhaGRfcHJvY193cml0ZV9zZWVwcm9tOiBpbmNvcnJlY3QgYnVmZmVyIHNpemVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGF2ZV9zZWVwcm9tID0gYWhkX3ZlcmlmeV9ja3N1bSgoc3RydWN0IHNlZXByb21fY29uZmlnKilidWZmZXIpOworCWlmIChoYXZlX3NlZXByb20gPT0gMCkgeworCQlwcmludGYoImFoZF9wcm9jX3dyaXRlX3NlZXByb206IGNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGF2ZV9zZWVwcm9tID0gYWhkX2FjcXVpcmVfc2VlcHJvbShhaGQpOworCWlmICghaGF2ZV9zZWVwcm9tKSB7CisJCXByaW50ZigiYWhkX3Byb2Nfd3JpdGVfc2VlcHJvbTogTm8gU2VyaWFsIEVFUFJPTVxuIik7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQl1X2ludCBzdGFydF9hZGRyOworCisJCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKKwkJCWFoZC0+c2VlcF9jb25maWcgPSBtYWxsb2Moc2l6ZW9mKCphaGQtPnNlZXBfY29uZmlnKSwKKwkJCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJCWlmIChhaGQtPnNlZXBfY29uZmlnID09IE5VTEwpIHsKKwkJCQlwcmludGYoImFpYzc5eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBzZXJpYWwgIgorCQkJCSAgICAgICAiZWVwcm9tIGJ1ZmZlci4gIFdyaXRlIGZhaWxpbmdcbiIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlwcmludGYoImFpYzc5eHg6IFdyaXRpbmcgU2VyaWFsIEVFUFJPTVxuIik7CisJCXN0YXJ0X2FkZHIgPSAzMiAqIChhaGQtPmNoYW5uZWwgLSAnQScpOworCQlhaGRfd3JpdGVfc2VlcHJvbShhaGQsICh1X2ludDE2X3QgKilidWZmZXIsIHN0YXJ0X2FkZHIsCisJCQkJICBzaXplb2Yoc3RydWN0IHNlZXByb21fY29uZmlnKS8yKTsKKwkJYWhkX3JlYWRfc2VlcHJvbShhaGQsICh1aW50MTZfdCAqKWFoZC0+c2VlcF9jb25maWcsCisJCQkJIHN0YXJ0X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc2VlcHJvbV9jb25maWcpLzIsCisJCQkJIC8qQnl0ZVN0cmVhbSovRkFMU0UpOworCQlhaGRfcmVsZWFzZV9zZWVwcm9tKGFoZCk7CisJCXdyaXR0ZW4gPSBsZW5ndGg7CisJfQorCitkb25lOgorCWFoZF9yZXN0b3JlX21vZGVzKGFoZCwgc2F2ZWRfbW9kZXMpOworCWlmICghcGF1c2VkKQorCQlhaGRfdW5wYXVzZShhaGQpOworCWFoZF91bmxvY2soYWhkLCAmcyk7CisJcmV0dXJuICh3cml0dGVuKTsKK30KKy8qCisgKiBSZXR1cm4gaW5mb3JtYXRpb24gdG8gaGFuZGxlIC9wcm9jIHN1cHBvcnQgZm9yIHRoZSBkcml2ZXIuCisgKi8KK2ludAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorYWhkX2xpbnV4X3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkgICAgaW50IGxlbmd0aCwgaW50IGhvc3RubywgaW50IGlub3V0KQorI2Vsc2UKK2FoZF9saW51eF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAorCQkgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCisjZW5kaWYKK3sKKwlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CisJc3RydWN0CWluZm9fc3RyIGluZm87CisJY2hhcglhaGRfaW5mb1syNTZdOworCXVfbG9uZwlsOworCXVfaW50CW1heF90YXJnOworCXVfaW50CWk7CisJaW50CXJldHZhbDsKKworCXJldHZhbCA9IC1FSU5WQUw7CisJYWhkX2xpc3RfbG9jaygmbCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJVEFJTFFfRk9SRUFDSChhaGQsICZhaGRfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChhaGQtPnBsYXRmb3JtX2RhdGEtPmhvc3QtPmhvc3Rfbm8gPT0gaG9zdG5vKQorCQkJYnJlYWs7CisJfQorI2Vsc2UKKwlhaGQgPSBhaGRfZmluZF9zb2Z0YygqKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhKTsKKyNlbmRpZgorCisJaWYgKGFoZCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwkgLyogSGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlPyAqLyAKKwlpZiAoaW5vdXQgPT0gVFJVRSkgeworCQlyZXR2YWwgPSBhaGRfcHJvY193cml0ZV9zZWVwcm9tKGFoZCwgYnVmZmVyLCBsZW5ndGgpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHN0YXJ0KQorCQkqc3RhcnQgPSBidWZmZXI7CisKKwlpbmZvLmJ1ZmZlcgk9IGJ1ZmZlcjsKKwlpbmZvLmxlbmd0aAk9IGxlbmd0aDsKKwlpbmZvLm9mZnNldAk9IG9mZnNldDsKKwlpbmZvLnBvcwk9IDA7CisKKwljb3B5X2luZm8oJmluZm8sICJBZGFwdGVjIEFJQzc5eHggZHJpdmVyIHZlcnNpb246ICVzXG4iLAorCQkgIEFJQzc5WFhfRFJJVkVSX1ZFUlNJT04pOworCWNvcHlfaW5mbygmaW5mbywgIiVzXG4iLCBhaGQtPmRlc2NyaXB0aW9uKTsKKwlhaGRfY29udHJvbGxlcl9pbmZvKGFoZCwgYWhkX2luZm8pOworCWNvcHlfaW5mbygmaW5mbywgIiVzXG4iLCBhaGRfaW5mbyk7CisJY29weV9pbmZvKCZpbmZvLCAiQWxsb2NhdGVkIFNDQnM6ICVkLCBTRyBMaXN0IExlbmd0aDogJWRcblxuIiwKKwkJICBhaGQtPnNjYl9kYXRhLm51bXNjYnMsIEFIRF9OU0VHKTsKKworCW1heF90YXJnID0gMTU7CisKKwlpZiAoYWhkLT5zZWVwX2NvbmZpZyA9PSBOVUxMKQorCQljb3B5X2luZm8oJmluZm8sICJObyBTZXJpYWwgRUVQUk9NXG4iKTsKKwllbHNlIHsKKwkJY29weV9pbmZvKCZpbmZvLCAiU2VyaWFsIEVFUFJPTTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCphaGQtPnNlZXBfY29uZmlnKS8yOyBpKyspIHsKKwkJCWlmICgoKGkgJSA4KSA9PSAwKSAmJiAoaSAhPSAwKSkgeworCQkJCWNvcHlfaW5mbygmaW5mbywgIlxuIik7CisJCQl9CisJCQljb3B5X2luZm8oJmluZm8sICIweCUuNHggIiwKKwkJCQkgICgodWludDE2X3QqKWFoZC0+c2VlcF9jb25maWcpW2ldKTsKKwkJfQorCQljb3B5X2luZm8oJmluZm8sICJcbiIpOworCX0KKwljb3B5X2luZm8oJmluZm8sICJcbiIpOworCisJaWYgKChhaGQtPmZlYXR1cmVzICYgQUhEX1dJREUpID09IDApCisJCW1heF90YXJnID0gNzsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4X3Rhcmc7IGkrKykgeworCisJCWFoZF9kdW1wX3RhcmdldF9zdGF0ZShhaGQsICZpbmZvLCBhaGQtPm91cl9pZCwgJ0EnLAorCQkJCSAgICAgIC8qdGFyZ2V0X2lkKi9pLCAvKnRhcmdldF9vZmZzZXQqL2kpOworCX0KKwlyZXR2YWwgPSBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0ID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7Citkb25lOgorCWFoZF9saXN0X3VubG9jaygmbCk7CisJcmV0dXJuIChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9yZWcuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMWFjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZy5oX3NoaXBwZWQKQEAgLTAsMCArMSwzNzc2IEBACisvKgorICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKyAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHguc2VxIzk0ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5yZWcjNzAgJAorICovCit0eXBlZGVmIGludCAoYWhkX3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpOwordHlwZWRlZiBzdHJ1Y3QgYWhkX3JlZ19wYXJzZV9lbnRyeSB7CisJY2hhcgkqbmFtZTsKKwl1aW50OF90CSB2YWx1ZTsKKwl1aW50OF90CSBtYXNrOworfSBhaGRfcmVnX3BhcnNlX2VudHJ5X3Q7CisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21vZGVfcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX21vZGVfcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNT0RFX1BUUiIsIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UU1RBVCIsIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludGNvZGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxaW50Y29kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRSU5UQ09ERSIsIDB4MDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmludF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJpbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUklOVCIsIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Vycm9yX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Vycm9yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJFUlJPUiIsIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmVycl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJlcnJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUkVSUiIsIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hjbnRybF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9oY250cmxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhDTlRSTCIsIDB4MDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2huc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaG5zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE5TQ0JfUU9GRiIsIDB4MDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hlc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaGVzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSEVTQ0JfUU9GRiIsIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hzX21haWxib3hfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaHNfbWFpbGJveF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSFNfTUFJTEJPWCIsIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNlcWludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xyc2VxaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSU0VRSU5UU1RBVCIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRSU5UU1RBVCIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N3dGltZXJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc3d0aW1lcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1dUSU1FUiIsIDB4MGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nuc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc25zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU05TQ0JfUU9GRiIsIDB4MTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nlc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VTQ0JfUU9GRiIsIDB4MTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nkc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2RzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0RTQ0JfUU9GRiIsIDB4MTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FvZmZfY3Rsc3RhX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FvZmZfY3Rsc3RhX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT0ZGX0NUTFNUQSIsIDB4MTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVENUTCIsIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmY250cmxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZjbnRybF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZDTlRSTCIsIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzY29tbWFuZDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZHNjb21tYW5kMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNDT01NQU5EMCIsIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Rmc3RhdHVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Rmc3RhdHVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlNUQVRVUyIsIDB4MWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnX2NhY2hlX3NoYWRvd19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ19jYWNoZV9zaGFkb3dfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1NIQURPVyIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FyYmN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9hcmJjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSQkNUTCIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnX2NhY2hlX3ByZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ19jYWNoZV9wcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1BSRSIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaW5fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbHFpbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFJTiIsIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3R5cGVwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfdHlwZXB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFlQRVBUUiIsIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RhZ3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF90YWdwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRBR1BUUiIsIDB4MjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2x1bnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9sdW5wdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxVTlBUUiIsIDB4MjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RhdGFsZW5wdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGF0YWxlbnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREFUQUxFTlBUUiIsIDB4MjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N0YXRsZW5wdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc3RhdGxlbnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1RBVExFTlBUUiIsIDB4MjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtZGxlbnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWRsZW5wdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRExFTlBUUiIsIDB4MjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2F0dHJwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYXR0cnB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVRUUlBUUiIsIDB4MjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsYWdwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZmxhZ3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxBR1BUUiIsIDB4MjcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtZHB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWRwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFBUUiIsIDB4MjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FuZXh0cHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FuZXh0cHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRTkVYVFBUUiIsIDB4MjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2lkcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2lkcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJRFBUUiIsIDB4MmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FicnRieXRlcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FicnRieXRlcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQlJUQllURVBUUiIsIDB4MmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FicnRiaXRwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYWJydGJpdHB0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUJSVEJJVFBUUiIsIDB4MmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZGJ5dGVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX21heGNtZGJ5dGVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNQVhDTURCWVRFUyIsIDB4MmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZDJyY3ZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbWF4Y21kMnJjdl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTUFYQ01EMlJDViIsIDB4MmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nob3J0dGhyZXNoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nob3J0dGhyZXNoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSE9SVFRIUkVTSCIsIDB4MmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2x1bmxlbl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9sdW5sZW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxVTkxFTiIsIDB4MzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NkYmxpbWl0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NkYmxpbWl0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDREJMSU1JVCIsIDB4MzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tYXhjbWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRCIsIDB4MzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21heGNtZGNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tYXhjbWRjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRENOVCIsIDB4MzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxcnN2ZDAxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxcnN2ZDAxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQwMSIsIDB4MzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxcnN2ZDE2X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxcnN2ZDE2X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQxNiIsIDB4MzUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxcnN2ZDE3X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxcnN2ZDE3X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQxNyIsIDB4MzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtZHJzdmQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtZHJzdmQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURSU1ZEMCIsIDB4MzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxY3RsMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scWN0bDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRQ1RMMCIsIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxY3RsMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scWN0bDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRQ1RMMSIsIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2Jpc3QwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2Jpc3QwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NCSVNUMCIsIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxY3RsMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scWN0bDJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRQ1RMMiIsIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2Jpc3QxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2Jpc3QxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NCSVNUMSIsIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzZXEwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzZXEwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0VRMCIsIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzZXExX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzZXExX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0VRMSIsIDB4M2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N4ZnJjdGwwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N4ZnJjdGwwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMCIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2J1c2luaXRpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9idXNpbml0aWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU0lOSVRJRCIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RsY291bnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGxjb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRExDT1VOVCIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N4ZnJjdGwxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N4ZnJjdGwxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMSIsIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2J1c3RhcmdpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9idXN0YXJnaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1RBUkdJRCIsIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N4ZnJjdGwyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N4ZnJjdGwyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMiIsIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZnN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZmc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZGU1RBVCIsIDB4M2YsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzaWdvX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzaWdvX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHTyIsIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX211bHRhcmdpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tdWx0YXJnaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1VTFRBUkdJRCIsIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lzaWdpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzaWdpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHSSIsIDB4NDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lwaGFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY3NpcGhhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lQSEFTRSIsIDB4NDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lkYXQwX2ltZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY3NpZGF0MF9pbWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lEQVQwX0lNRyIsIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lkYXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NzaWRhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSURBVCIsIDB4NDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2lidXNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NzaWJ1c19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSUJVUyIsIDB4NDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RhcmdpZGluX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3RhcmdpZGluX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHSURJTiIsIDB4NDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlbGlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NlbGlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUxJRCIsIDB4NDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NibGtjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2Jsa2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0JMS0NUTCIsIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX29wdGlvbm1vZGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3B0aW9ubW9kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1BUSU9OTU9ERSIsIDB4NGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMCIsIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMSIsIDB4NGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMSIsIDB4NGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0Ml9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMiIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BlcnJkaWFnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BlcnJkaWFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQRVJSRElBRyIsIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFURSIsIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NvZmZjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc29mZmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU09GRkNOVCIsIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFURSIsIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFUMCIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmxxaWludDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFpaW50MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFJSU5UMCIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaW1vZGUwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaW1vZGUwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlNT0RFMCIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaW1vZGUxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaW1vZGUxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlNT0RFMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFUMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscmxxaWludDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFpaW50MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFJSU5UMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxaXN0YXQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxaXN0YXQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlTVEFUMiIsIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NzdGF0M19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zc3RhdDNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlM19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNpbnQzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NscnNpbnQzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb21vZGUwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb21vZGUwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9NT0RFMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFUMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Nscmxxb2ludDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFvaW50MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFPSU5UMCIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFUMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Nscmxxb2ludDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2xybHFvaW50MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0xSTFFPSU5UMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb21vZGUxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb21vZGUxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9NT0RFMSIsIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3N0YXQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xxb3N0YXQyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUU9TVEFUMiIsIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX29zX3NwYWNlX2NudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9vc19zcGFjZV9jbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TX1NQQUNFX0NOVCIsIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbW9kZTFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2ltb2RlMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMSIsIDB4NTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2dzZmlmb19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9nc2ZpZm9fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkdTRklGTyIsIDB4NTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZnN4ZnJjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZmc3hmcmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZGU1hGUkNUTCIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xxb3Njc2N0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9scW9zY3NjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRT1NDU0NUTCIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25leHRzY2JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmV4dHNjYl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVYVFNDQiIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NscnNlcWludHNyY19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbHJzZXFpbnRzcmNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUlNFUUlOVFNSQyIsIDB4NWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludHNyY19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZXFpbnRzcmNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUlOVFNSQyIsIDB4NWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2N1cnJzY2JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY3VycnNjYl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1VSUlNDQiIsIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWltb2RlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NlcWltb2RlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFJTU9ERSIsIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21kZmZzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX21kZmZzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNREZGU1RBVCIsIDB4NWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NyY2NvbnRyb2xfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY3JjY29udHJvbF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1JDQ09OVFJPTCIsIDB4NWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZnRhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmZ0YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGRlRBRyIsIDB4NWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RzY2JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbGFzdHNjYl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVFNDQiIsIDB4NWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2l0ZXN0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2l0ZXN0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJVEVTVCIsIDB4NWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2lvcGRuY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2lvcGRuY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJT1BETkNUTCIsIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NoYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQUREUiIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ29hZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX25lZ29hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJORUdPQUREUiIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RncnBjcmNpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RncnBjcmNpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJER1JQQ1JDSSIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ3BlcmlvZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9uZWdwZXJpb2RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FR1BFUklPRCIsIDB4NjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BhY2tjcmNpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BhY2tjcmNpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQQUNLQ1JDSSIsIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ29mZnNldF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9uZWdvZmZzZXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FR09GRlNFVCIsIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ3Bwcm9wdHNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmVncHByb3B0c19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHUFBST1BUUyIsIDB4NjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25lZ2Nvbm9wdHNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmVnY29ub3B0c19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHQ09OT1BUUyIsIDB4NjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FubmV4Y29sX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FubmV4Y29sX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWENPTCIsIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Njc2Noa25fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NzY2hrbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTQ0hLTiIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FubmV4ZGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FubmV4ZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWERBVCIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2lvd25pZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pb3duaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklPV05JRCIsIDB4NjcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDk2MGN0bDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsOTYwY3RsMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMOTYwQ1RMMCIsIDB4NjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NoY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NoY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSENOVCIsIDB4NjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Rvd25pZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF90b3duaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRPV05JRCIsIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDk2MGN0bDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsOTYwY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMOTYwQ1RMMSIsIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDk2MGNudDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsOTYwY250MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMOTYwQ05UMCIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3hzaWdfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfeHNpZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiWFNJRyIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlbG9pZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWxvaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFTE9JRCIsIDB4NmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGN0bDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY3RsMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ1RMMCIsIDB4NmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZhaXJuZXNzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZhaXJuZXNzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGQUlSTkVTUyIsIDB4NmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGN0bDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ1RMMSIsIDB4NmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbDQwMGNudDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGxsNDAwY250MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ05UMCIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3VuZmFpcm5lc3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfdW5mYWlybmVzc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVU5GQUlSTkVTUyIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2hhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BsbGRlbGF5X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3BsbGRlbGF5X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQTExERUxBWSIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hvZG1hYWRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2hvZG1hYWRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT0RNQUFEUiIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hvZG1hY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2hvZG1hY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT0RNQUNOVCIsIDB4NzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSENOVCIsIDB4NzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2hvZG1hZW5fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaG9kbWFlbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE9ETUFFTiIsIDB4N2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnaGFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2doYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQUREUiIsIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmhhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYmhhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JIQUREUiIsIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnaGNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ2hjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHSENOVCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmhjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NiaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCSENOVCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZl90aHJzaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmZfdGhyc2hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGRl9USFJTSCIsIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvbWFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcm9tYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUk9NQUREUiIsIDB4OGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvbWNudHJsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3JvbWNudHJsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJST01DTlRSTCIsIDB4OGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvbWRhdGFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcm9tZGF0YV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUk9NREFUQSIsIDB4OGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMCIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JvZW5hYmxlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3JvZW5hYmxlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJST0VOQUJMRSIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMCIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMCIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25zZW5hYmxlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX25zZW5hYmxlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJOU0VOQUJMRSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMSIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX29zdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9vc3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TVCIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHJ4bXNnM19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hyeG1zZzNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFJYTVNHMyIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3J4bXNnM19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNyeG1zZzNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1JYTVNHMyIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3BjaXhjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcGNpeGN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUENJWENUTCIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlyeG1zZzNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXJ4bXNnM19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVJYTVNHMyIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlzZXFiY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlzZXFiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3NlcWJjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY21jc2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNlcWJjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGNoc2VxYmNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRENIU0VRQkNOVCIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3NwbHRzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNzcGx0c3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlzcGx0c3RhdDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXNwbHRzdGF0MF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNwbHRzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hzcGx0c3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNQTFRTVEFUMCIsIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RjaHNwbHRzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kY2hzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRDSFNQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3NwbHRzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWNzcGx0c3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNQ1NQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlzcGx0c3RhdDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfb3ZseXNwbHRzdGF0MV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNQTFRTVEFUMSIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2cwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMCIsIDB4OTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMCIsIDB4OTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2cxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMSIsIDB4OTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMSIsIDB4OTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2cyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2cyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMiIsIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMiIsIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nncnhtc2czX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nncnhtc2czX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1JYTVNHMyIsIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhZHIzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NsdnNwbHRvdXRhZHIzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTFZTUExUT1VUQURSMyIsIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nnc2VxYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ3NlcWJjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHU0VRQkNOVCIsIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhdHRyMF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zbHZzcGx0b3V0YXR0cjBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNMVlNQTFRPVVRBVFRSMCIsIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhdHRyMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zbHZzcGx0b3V0YXR0cjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNMVlNQTFRPVVRBVFRSMSIsIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NsdnNwbHRvdXRhdHRyMl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zbHZzcGx0b3V0YXR0cjJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNMVlNQTFRPVVRBVFRSMiIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nnc3BsdHN0YXQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nnc3BsdHN0YXQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1NQTFRTVEFUMCIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NmdW5jdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZnVuY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNGVU5DVCIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3Nnc3BsdHN0YXQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Nnc3BsdHN0YXQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR1NQTFRTVEFUMSIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmMHBjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGYwcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREYwUENJU1RBVCIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JlZzBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcmVnMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHMCIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmMXBjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGYxcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREYxUENJU1RBVCIsIDB4YTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NncGNpc3RhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZ3BjaXN0YXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHUENJU1RBVCIsIDB4YTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JlZzFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcmVnMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHMSIsIDB4YTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY3BjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY21jcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DUENJU1RBVCIsIDB4YTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlwY2lzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlwY2lzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZUENJU1RBVCIsIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JlZ19pc3JfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcmVnX2lzcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHX0lTUiIsIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NnX3N0YXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NnX3N0YXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR19TVEFURSIsIDB4YTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX21zaXBjaXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbXNpcGNpc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNJUENJU1RBVCIsIDB4YTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RhcmdwY2lzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3RhcmdwY2lzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHUENJU1RBVCIsIDB4YTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RhdGFfY291bnRfb2RkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RhdGFfY291bnRfb2RkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQVRBX0NPVU5UX09ERCIsIDB4YTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQlBUUiIsIDB4YTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jY3NjYmFjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUNOVCIsIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmF1dG9wdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2NiYXV0b3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCQVVUT1BUUiIsIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2dhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2dhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQUREUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jY3NjYmFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUREUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiYWRyX2JrX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NiYWRyX2JrX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFEUl9CSyIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NtY19yYW1iaXN0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtY19yYW1iaXN0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTUNfUkFNQklTVCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2djdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2NzZ2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0NUTCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NiY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NiY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNUTCIsIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2dyYW1fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY2NzZ3JhbV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR1JBTSIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhhZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZmxleGFkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxFWEFEUiIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Njc2NicmFtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Njc2NicmFtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQlJBTSIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZmxleGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxFWENOVCIsIDB4YjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhkbWFzdGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZsZXhkbWFzdGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEVYRE1BU1RBVCIsIDB4YjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsZXhkYXRhX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZsZXhkYXRhX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEVYREFUQSIsIDB4YjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2JyZGRhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9icmRkYXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRERBVCIsIDB4YjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2JyZGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9icmRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRENUTCIsIDB4YjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZWFkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWVhZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRUFEUiIsIDB4YmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZWRhdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWVkYXRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRURBVCIsIDB4YmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZWVjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRUNUTCIsIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlZXN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2Vlc3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VFU1RBVCIsIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkNOVCIsIDB4YmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Rmd2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZ3YWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZXQUREUiIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcGZsdHJjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZHNwZmx0cmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNQRkxUUkNUTCIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcGRhdGFjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZHNwZGF0YWN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNQREFUQUNUTCIsIDB4YzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmcmFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZSQUREUiIsIDB4YzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcHJlcWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kc3ByZXFjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRTUFJFUUNUTCIsIDB4YzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcGFja2N0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kc3BhY2tjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRTUEFDS0NUTCIsIDB4YzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2RmZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkRBVCIsIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RzcHNlbGVjdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kc3BzZWxlY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRTUFNFTEVDVCIsIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dydGJpYXNjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfd3J0Ymlhc2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV1JUQklBU0NUTCIsIDB4YzUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JjdnJiaW9zY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3JjdnJiaW9zY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJSQ1ZSQklPU0NUTCIsIDB4YzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dydGJpYXNjYWxjX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3dydGJpYXNjYWxjX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJXUlRCSUFTQ0FMQyIsIDB4YzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmcHRyc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZnB0cnNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGUFRSUyIsIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3JjdnJiaWFzY2FsY19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9yY3ZyYmlhc2NhbGNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJDVlJCSUFTQ0FMQyIsIDB4YzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmYmtwdHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZia3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZCS1BUUiIsIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NrZXdjYWxjX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NrZXdjYWxjX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTS0VXQ0FMQyIsIDB4YzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmZGJjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfZGZkYmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZEQkNUTCIsIDB4Y2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Rmc2NudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZnNjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGU0NOVCIsIDB4Y2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RmYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kZmJjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQkNOVCIsIDB4Y2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX292bHlhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX292bHlhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJPVkxZQUREUiIsIDB4ZDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWN0bDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxY3RsMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRQ1RMMCIsIDB4ZDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWN0bDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxY3RsMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRQ1RMMSIsIDB4ZDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ZsYWdzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEFHUyIsIDB4ZDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcWludGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZXFpbnRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUlOVENUTCIsIDB4ZDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcXJhbV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zZXFyYW1fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUVJBTSIsIDB4ZGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3ByZ21jbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcHJnbWNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUFJHTUNOVCIsIDB4ZGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FjY3VtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FjY3VtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQ0NVTSIsIDB4ZTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRFWCIsIDB4ZTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRFWCIsIDB4ZTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Jya2FkZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Jya2FkZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMSIsIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Jya2FkZHIwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2Jya2FkZHIwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJCUktBRERSMCIsIDB4ZTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FsbG9uZXNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYWxsb25lc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT05FUyIsIDB4ZTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FsbHplcm9zX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FsbHplcm9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExaRVJPUyIsIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX25vbmVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbm9uZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTk9ORSIsIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRJUiIsIDB4ZWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRJUiIsIDB4ZWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2Z1bmN0aW9uMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9mdW5jdGlvbjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZVTkNUSU9OMSIsIDB4ZjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3N0YWNrX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3N0YWNrX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFDSyIsIDB4ZjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2N1cmFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY3VyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ1VSQUREUiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHZlYzFfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnR2ZWMxX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzFfQUREUiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludHZlYzJfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbnR2ZWMyX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVFZFQzJfQUREUiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xhc3RhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUQUREUiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xvbmdqbXBfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9sb25nam1wX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxPTkdKTVBfQUREUiIsIDB4ZjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2FjY3VtX3NhdmVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYWNjdW1fc2F2ZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUNDVU1fU0FWRSIsIDB4ZmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dhaXRpbmdfc2NiX3RhaWxzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3dhaXRpbmdfc2NiX3RhaWxzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJXQUlUSU5HX1NDQl9UQUlMUyIsIDB4MTAwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9haGRfcGNpX2NvbmZpZ19iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FoZF9wY2lfY29uZmlnX2Jhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFIRF9QQ0lfQ09ORklHX0JBU0UiLCAweDEwMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc3JhbV9iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NyYW1fYmFzZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1JBTV9CQVNFIiwgMHgxMDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3dhaXRpbmdfdGlkX2hlYWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfd2FpdGluZ190aWRfaGVhZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV0FJVElOR19USURfSEVBRCIsIDB4MTIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF93YWl0aW5nX3RpZF90YWlsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3dhaXRpbmdfdGlkX3RhaWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfVElEX1RBSUwiLCAweDEyMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfbmV4dF9xdWV1ZWRfc2NiX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbmV4dF9xdWV1ZWRfc2NiX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FWFRfUVVFVUVEX1NDQl9BRERSIiwgMHgxMjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2NvbXBsZXRlX3NjYl9oZWFkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NvbXBsZXRlX3NjYl9oZWFkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9TQ0JfSEVBRCIsIDB4MTI4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9jb21wbGV0ZV9zY2JfZG1haW5wcm9nX2hlYWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfY29tcGxldGVfc2NiX2RtYWlucHJvZ19oZWFkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDT01QTEVURV9TQ0JfRE1BSU5QUk9HX0hFQUQiLCAweDEyYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY29tcGxldGVfZG1hX3NjYl9oZWFkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NvbXBsZXRlX2RtYV9zY2JfaGVhZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfRE1BX1NDQl9IRUFEIiwgMHgxMmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3FmcmVlemVfY291bnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcWZyZWV6ZV9jb3VudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zYXZlZF9tb2RlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NhdmVkX21vZGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX01PREUiLCAweDEzMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfbXNnX291dF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9tc2dfb3V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNU0dfT1VUIiwgMHgxMzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2RtYXBhcmFtc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9kbWFwYXJhbXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRNQVBBUkFNUyIsIDB4MTMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zZXFfZmxhZ3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFfRkxBR1MiLCAweDEzMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2F2ZWRfc2NzaWlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NhdmVkX3Njc2lpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfU0NTSUlEIiwgMHgxMzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NhdmVkX2x1bl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zYXZlZF9sdW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsIDB4MTM1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9sYXN0cGhhc2VfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfbGFzdHBoYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUUEhBU0UiLCAweDEzNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfcW91dGZpZm9fZW50cnlfdmFsaWRfdGFnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3FvdXRmaWZvX2VudHJ5X3ZhbGlkX3RhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHIiwgMHgxMzcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsIDB4MTM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9xb3V0Zmlmb19uZXh0X2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19ORVhUX0FERFIiLCAweDEzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfa2VybmVsX3RxaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfa2VybmVsX3RxaW5wb3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9UUUlOUE9TIiwgMHgxNDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3RxaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfdHFpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsIDB4MTQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9hcmdfMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9hcmdfMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVJHXzEiLCAweDE0MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfYXJnXzJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfYXJnXzJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFSR18yIiwgMHgxNDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2xhc3RfbXNnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xhc3RfbXNnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY3Npc2VxX3RlbXBsYXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lTRVFfVEVNUExBVEUiLCAweDE0NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfaW5pdGlhdG9yX3RhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9pbml0aWF0b3JfdGFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTklUSUFUT1JfVEFHIiwgMHgxNDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NlcV9mbGFnczJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfc2VxX2ZsYWdzMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTMiIsIDB4MTQ3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9hbGxvY2ZpZm9fc2NicHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2FsbG9jZmlmb19zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLCAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX1RJTUVSIiwgMHgxNGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludF9jb2FsZXNjaW5nX21heGNtZHNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGRfaW50X2NvYWxlc2NpbmdfbWF4Y21kc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUFYQ01EUyIsIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ludF9jb2FsZXNjaW5nX21pbmNtZHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVF9DT0FMRVNDSU5HX01JTkNNRFMiLCAweDE0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY21kc19wZW5kaW5nX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2NtZHNfcGVuZGluZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU19QRU5ESU5HIiwgMHgxNGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX2ludF9jb2FsZXNjaW5nX2NtZGNvdW50X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2ludF9jb2FsZXNjaW5nX2NtZGNvdW50X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCIsIDB4MTUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX2xvY2FsX2hzX21haWxib3hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxPQ0FMX0hTX01BSUxCT1giLCAweDE1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfY21kc2l6ZV90YWJsZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9jbWRzaXplX3RhYmxlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTSVpFX1RBQkxFIiwgMHgxNTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9iYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQkFTRSIsIDB4MTgwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfcmVzaWR1YWxfZGF0YWNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfcmVzaWR1YWxfZGF0YWNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX0RBVEFDTlQiLCAweDE4MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3Jlc2lkdWFsX3NncHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9yZXNpZHVhbF9zZ3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX1NHUFRSIiwgMHgxODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9zY3NpX3N0YXR1c19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2Jfc2NzaV9zdGF0dXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJX1NUQVRVUyIsIDB4MTg4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfdGFyZ2V0X3BoYXNlc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFyZ2V0X3BoYXNlc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBUkdFVF9QSEFTRVMiLCAweDE4OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3RhcmdldF9kYXRhX2Rpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFyZ2V0X2RhdGFfZGlyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX0RBVEFfRElSIiwgMHgxOGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl90YXJnZXRfaXRhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFyZ2V0X2l0YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfSVRBRyIsIDB4MThiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2Jfc2Vuc2VfYnVzYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2Jfc2Vuc2VfYnVzYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NFTlNFX0JVU0FERFIiLCAweDE4YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3RhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFHIiwgMHgxOTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9jb250cm9sX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9jb250cm9sX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ09OVFJPTCIsIDB4MTkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2Jfc2NzaWlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJSUQiLCAweDE5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX2x1bl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfbHVuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTFVOIiwgMHgxOTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl90YXNrX2F0dHJpYnV0ZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFza19hdHRyaWJ1dGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVNLX0FUVFJJQlVURSIsIDB4MTk1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfY2RiX2xlbl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfY2RiX2xlbl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0NEQl9MRU4iLCAweDE5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3Rhc2tfbWFuYWdlbWVudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfdGFza19tYW5hZ2VtZW50X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFTS19NQU5BR0VNRU5UIiwgMHgxOTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9kYXRhcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9kYXRhcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQVBUUiIsIDB4MTk4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfZGF0YWNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfZGF0YWNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0RBVEFDTlQiLCAweDFhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX3NncHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9zZ3B0cl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NHUFRSIiwgMHgxYTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9idXNhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9idXNhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQlVTQUREUiIsIDB4MWE4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfbmV4dF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2JfbmV4dF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX05FWFQiLCAweDFhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworI2lmIEFJQ19ERUJVR19SRUdJU1RFUlMKK2FoZF9yZWdfcHJpbnRfdCBhaGRfc2NiX25leHQyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9uZXh0Ml9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX05FWFQyIiwgMHgxYWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGRfcmVnX3ByaW50X3QgYWhkX3NjYl9zcGFyZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoZF9zY2Jfc3BhcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TUEFSRSIsIDB4MWIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkKKyNlbmRpZgorCisjaWYgQUlDX0RFQlVHX1JFR0lTVEVSUworYWhkX3JlZ19wcmludF90IGFoZF9zY2JfZGlzY29ubmVjdGVkX2xpc3RzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhkX3NjYl9kaXNjb25uZWN0ZWRfbGlzdHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9ESVNDT05ORUNURURfTElTVFMiLCAweDFiOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApCisjZW5kaWYKKworCisjZGVmaW5lCU1PREVfUFRSICAgICAgICAJCTB4MDAKKyNkZWZpbmUJCURTVF9NT0RFICAgICAgICAJMHg3MAorI2RlZmluZQkJU1JDX01PREUgICAgICAgIAkweDA3CisKKyNkZWZpbmUJSU5UU1RBVCAgICAgICAgIAkJMHgwMQorI2RlZmluZQkJSU5UX1BFTkQgICAgICAgIAkweGZmCisjZGVmaW5lCQlIV0VSUklOVCAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUJSS0FEUklOVCAgICAgICAJMHg0MAorI2RlZmluZQkJU1dUTUlOVCAgICAgICAgIAkweDIwCisjZGVmaW5lCQlQQ0lJTlQgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNDU0lJTlQgICAgICAgICAJMHgwOAorI2RlZmluZQkJU0VRSU5UICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDTURDTVBMVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNQTFRJTlQgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUUlOVENPREUgICAgICAJCTB4MDIKKyNkZWZpbmUJCUJBRF9TQ0JfU1RBVFVTICAJMHgxYQorI2RlZmluZQkJU0FXX0hXRVJSICAgICAgIAkweDE5CisjZGVmaW5lCQlUUkFDRVBPSU5UMyAgICAgCTB4MTgKKyNkZWZpbmUJCVRSQUNFUE9JTlQyICAgICAJMHgxNworI2RlZmluZQkJVFJBQ0VQT0lOVDEgICAgIAkweDE2CisjZGVmaW5lCQlUUkFDRVBPSU5UMCAgICAgCTB4MTUKKyNkZWZpbmUJCVRBU0tNR01UX0NNRF9DTVBMVF9PS0FZCTB4MTQKKyNkZWZpbmUJCVRBU0tNR01UX0ZVTkNfQ09NUExFVEUJMHgxMworI2RlZmluZQkJRU5URVJJTkdfTk9OUEFDSwkweDEyCisjZGVmaW5lCQlDRkc0T1ZFUlJVTiAgICAgCTB4MTEKKyNkZWZpbmUJCVNUQVRVU19PVkVSUlVOICAJMHgxMAorI2RlZmluZQkJQ0ZHNElTVEFUX0lOVFIgIAkweDBmCisjZGVmaW5lCQlJTlZBTElEX1NFUUlOVCAgCTB4MGUKKyNkZWZpbmUJCUlMTEVHQUxfUEhBU0UgICAJMHgwZAorI2RlZmluZQkJRFVNUF9DQVJEX1NUQVRFIAkweDBjCisjZGVmaW5lCQlNSVNTRURfQlVTRlJFRSAgCTB4MGIKKyNkZWZpbmUJCU1LTVNHX0ZBSUxFRCAgICAJMHgwYQorI2RlZmluZQkJREFUQV9PVkVSUlVOICAgIAkweDA5CisjZGVmaW5lCQlCQURfU1RBVFVTICAgICAgCTB4MDgKKyNkZWZpbmUJCUhPU1RfTVNHX0xPT1AgICAJMHgwNworI2RlZmluZQkJUERBVEFfUkVJTklUICAgIAkweDA2CisjZGVmaW5lCQlJR05fV0lERV9SRVMgICAgCTB4MDUKKyNkZWZpbmUJCU5PX01BVENIICAgICAgICAJMHgwNAorI2RlZmluZQkJUFJPVE9fVklPTEFUSU9OIAkweDAzCisjZGVmaW5lCQlTRU5EX1JFSkVDVCAgICAgCTB4MDIKKyNkZWZpbmUJCUJBRF9QSEFTRSAgICAgICAJMHgwMQorI2RlZmluZQkJTk9fU0VRSU5UICAgICAgIAkweDAwCisKKyNkZWZpbmUJQ0xSSU5UICAgICAgICAgIAkJMHgwMworI2RlZmluZQkJQ0xSSFdFUlJJTlQgICAgIAkweDgwCisjZGVmaW5lCQlDTFJCUktBRFJJTlQgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNXVE1JTlQgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSUENJSU5UICAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJTQ1NJSU5UICAgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNFUUlOVCAgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ01ESU5UICAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJTUExUSU5UICAgICAgCTB4MDEKKworI2RlZmluZQlFUlJPUiAgICAgICAgICAgCQkweDA0CisjZGVmaW5lCQlDSU9QQVJFUlIgICAgICAgCTB4ODAKKyNkZWZpbmUJCUNJT0FDQ0VTRkFJTCAgICAJMHg0MAorI2RlZmluZQkJTVBBUkVSUiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlEUEFSRVJSICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNRUEFSRVJSICAgICAgICAJMHgwOAorI2RlZmluZQkJSUxMT1BDT0RFICAgICAgIAkweDA0CisjZGVmaW5lCQlEU0NUTU9VVCAgICAgICAgCTB4MDIKKworI2RlZmluZQlDTFJFUlIgICAgICAgICAgCQkweDA0CisjZGVmaW5lCQlDTFJDSU9QQVJFUlIgICAgCTB4ODAKKyNkZWZpbmUJCUNMUkNJT0FDQ0VTRkFJTCAJMHg0MAorI2RlZmluZQkJQ0xSTVBBUkVSUiAgICAgIAkweDIwCisjZGVmaW5lCQlDTFJEUEFSRVJSICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUlNRUEFSRVJSICAgICAJMHgwOAorI2RlZmluZQkJQ0xSSUxMT1BDT0RFICAgIAkweDA0CisjZGVmaW5lCQlDTFJEU0NUTU9VVCAgICAgCTB4MDIKKworI2RlZmluZQlIQ05UUkwgICAgICAgICAgCQkweDA1CisjZGVmaW5lCQlTRVFfUkVTRVQgICAgICAgCTB4ODAKKyNkZWZpbmUJCVBPV1JETiAgICAgICAgICAJMHg0MAorI2RlZmluZQkJU1dJTlQgICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTV1RJTUVSX1NUQVJUX0IgCTB4MDgKKyNkZWZpbmUJCVBBVVNFICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJSU5URU4gICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlDSElQUlNUICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUNISVBSU1RBQ0sgICAgICAJMHgwMQorCisjZGVmaW5lCUhOU0NCX1FPRkYgICAgICAJCTB4MDYKKworI2RlZmluZQlIRVNDQl9RT0ZGICAgICAgCQkweDA4CisKKyNkZWZpbmUJSFNfTUFJTEJPWCAgICAgIAkJMHgwYgorI2RlZmluZQkJSE9TVF9UUUlOUE9TICAgIAkweDgwCisjZGVmaW5lCQlFTklOVF9DT0FMRVNDRSAgCTB4NDAKKworI2RlZmluZQlDTFJTRVFJTlRTVEFUICAgCQkweDBjCisjZGVmaW5lCQlDTFJTRVFfU1dUTVJUTyAgCTB4MTAKKyNkZWZpbmUJCUNMUlNFUV9TRVFJTlQgICAJMHgwOAorI2RlZmluZQkJQ0xSU0VRX1NDU0lJTlQgIAkweDA0CisjZGVmaW5lCQlDTFJTRVFfUENJSU5UICAgCTB4MDIKKyNkZWZpbmUJCUNMUlNFUV9TUExUSU5UICAJMHgwMQorCisjZGVmaW5lCVNFUUlOVFNUQVQgICAgICAJCTB4MGMKKyNkZWZpbmUJCVNFUV9TV1RNUlRPICAgICAJMHgxMAorI2RlZmluZQkJU0VRX1NFUUlOVCAgICAgIAkweDA4CisjZGVmaW5lCQlTRVFfU0NTSUlOVCAgICAgCTB4MDQKKyNkZWZpbmUJCVNFUV9QQ0lJTlQgICAgICAJMHgwMgorI2RlZmluZQkJU0VRX1NQTFRJTlQgICAgIAkweDAxCisKKyNkZWZpbmUJU1dUSU1FUiAgICAgICAgIAkJMHgwZQorCisjZGVmaW5lCVNOU0NCX1FPRkYgICAgICAJCTB4MTAKKworI2RlZmluZQlTRVNDQl9RT0ZGICAgICAgCQkweDEyCisKKyNkZWZpbmUJU0RTQ0JfUU9GRiAgICAgIAkJMHgxNAorCisjZGVmaW5lCVFPRkZfQ1RMU1RBICAgICAJCTB4MTYKKyNkZWZpbmUJCUVNUFRZX1NDQl9BVkFJTCAJMHg4MAorI2RlZmluZQkJTkVXX1NDQl9BVkFJTCAgIAkweDQwCisjZGVmaW5lCQlTRFNDQl9ST0xMT1ZSICAgCTB4MjAKKyNkZWZpbmUJCUhTX01BSUxCT1hfQUNUICAJMHgxMAorI2RlZmluZQkJU0NCX1FTSVpFICAgICAgIAkweDBmCisjZGVmaW5lCQlTQ0JfUVNJWkVfMTYzODQgCTB4MGMKKyNkZWZpbmUJCVNDQl9RU0laRV84MTkyICAJMHgwYgorI2RlZmluZQkJU0NCX1FTSVpFXzQwOTYgIAkweDBhCisjZGVmaW5lCQlTQ0JfUVNJWkVfMjA0OCAgCTB4MDkKKyNkZWZpbmUJCVNDQl9RU0laRV8xMDI0ICAJMHgwOAorI2RlZmluZQkJU0NCX1FTSVpFXzUxMiAgIAkweDA3CisjZGVmaW5lCQlTQ0JfUVNJWkVfMjU2ICAgCTB4MDYKKyNkZWZpbmUJCVNDQl9RU0laRV8xMjggICAJMHgwNQorI2RlZmluZQkJU0NCX1FTSVpFXzY0ICAgIAkweDA0CisjZGVmaW5lCQlTQ0JfUVNJWkVfMzIgICAgCTB4MDMKKyNkZWZpbmUJCVNDQl9RU0laRV8xNiAgICAJMHgwMgorI2RlZmluZQkJU0NCX1FTSVpFXzggICAgIAkweDAxCisjZGVmaW5lCQlTQ0JfUVNJWkVfNCAgICAgCTB4MDAKKworI2RlZmluZQlJTlRDVEwgICAgICAgICAgCQkweDE4CisjZGVmaW5lCQlTV1RNSU5UTUFTSyAgICAgCTB4ODAKKyNkZWZpbmUJCVNXVE1JTlRFTiAgICAgICAJMHg0MAorI2RlZmluZQkJU1dUSU1FUl9TVEFSVCAgIAkweDIwCisjZGVmaW5lCQlBVVRPQ0xSQ01ESU5UICAgCTB4MTAKKyNkZWZpbmUJCVBDSUlOVEVOICAgICAgICAJMHgwOAorI2RlZmluZQkJU0NTSUlOVEVOICAgICAgIAkweDA0CisjZGVmaW5lCQlTRVFJTlRFTiAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNQTFRJTlRFTiAgICAgICAJMHgwMQorCisjZGVmaW5lCURGQ05UUkwgICAgICAgICAJCTB4MTkKKyNkZWZpbmUJCVNDU0lFTldSRElTICAgICAJMHg0MAorI2RlZmluZQkJU0NTSUVOQUNLICAgICAgIAkweDIwCisjZGVmaW5lCQlESVJFQ1RJT05BQ0sgICAgCTB4MDQKKyNkZWZpbmUJCUZJRk9GTFVTSEFDSyAgICAJMHgwMgorI2RlZmluZQkJRElSRUNUSU9ORU4gICAgIAkweDAxCisKKyNkZWZpbmUJRFNDT01NQU5EMCAgICAgIAkJMHgxOQorI2RlZmluZQkJQ0FDSEVUSEVOICAgICAgIAkweDgwCisjZGVmaW5lCQlEUEFSQ0tFTiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1QQVJDS0VOICAgICAgICAJMHgyMAorI2RlZmluZQkJRVhUUkVRTENLICAgICAgIAkweDEwCisjZGVmaW5lCQlESVNBQkxFX1RXQVRFICAgCTB4MDIKKyNkZWZpbmUJCUNJT1BBUkNLRU4gICAgICAJMHgwMQorCisjZGVmaW5lCURGU1RBVFVTICAgICAgICAJCTB4MWEKKyNkZWZpbmUJCVBSRUxPQURfQVZBSUwgICAJMHg4MAorI2RlZmluZQkJUEtUX1BSRUxPQURfQVZBSUwJMHg0MAorI2RlZmluZQkJTVJFUVBFTkQgICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE9ORSAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCURGVEhSRVNIICAgICAgICAJMHgwNAorI2RlZmluZQkJRklGT0ZVTEwgICAgICAgIAkweDAyCisjZGVmaW5lCQlGSUZPRU1QICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTR19DQUNIRV9TSEFET1cgCQkweDFiCisjZGVmaW5lCQlPRERfU0VHICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUxBU1RfU0VHICAgICAgICAJMHgwMgorI2RlZmluZQkJTEFTVF9TRUdfRE9ORSAgIAkweDAxCisKKyNkZWZpbmUJQVJCQ1RMICAgICAgICAgIAkJMHgxYgorI2RlZmluZQkJUkVTRVRfSEFSQiAgICAgIAkweDgwCisjZGVmaW5lCQlSRVRSWV9TV0VOICAgICAgCTB4MDgKKyNkZWZpbmUJCVVTRV9USU1FICAgICAgICAJMHgwNworCisjZGVmaW5lCVNHX0NBQ0hFX1BSRSAgICAJCTB4MWIKKworI2RlZmluZQlMUUlOICAgICAgICAgICAgCQkweDIwCisKKyNkZWZpbmUJVFlQRVBUUiAgICAgICAgIAkJMHgyMAorCisjZGVmaW5lCVRBR1BUUiAgICAgICAgICAJCTB4MjEKKworI2RlZmluZQlMVU5QVFIgICAgICAgICAgCQkweDIyCisKKyNkZWZpbmUJREFUQUxFTlBUUiAgICAgIAkJMHgyMworCisjZGVmaW5lCVNUQVRMRU5QVFIgICAgICAJCTB4MjQKKworI2RlZmluZQlDTURMRU5QVFIgICAgICAgCQkweDI1CisKKyNkZWZpbmUJQVRUUlBUUiAgICAgICAgIAkJMHgyNgorCisjZGVmaW5lCUZMQUdQVFIgICAgICAgICAJCTB4MjcKKworI2RlZmluZQlDTURQVFIgICAgICAgICAgCQkweDI4CisKKyNkZWZpbmUJUU5FWFRQVFIgICAgICAgIAkJMHgyOQorCisjZGVmaW5lCUlEUFRSICAgICAgICAgICAJCTB4MmEKKworI2RlZmluZQlBQlJUQllURVBUUiAgICAgCQkweDJiCisKKyNkZWZpbmUJQUJSVEJJVFBUUiAgICAgIAkJMHgyYworCisjZGVmaW5lCU1BWENNREJZVEVTICAgICAJCTB4MmQKKworI2RlZmluZQlNQVhDTUQyUkNWICAgICAgCQkweDJlCisKKyNkZWZpbmUJU0hPUlRUSFJFU0ggICAgIAkJMHgyZgorCisjZGVmaW5lCUxVTkxFTiAgICAgICAgICAJCTB4MzAKKyNkZWZpbmUJCVRMVU5MRU4gICAgICAgICAJMHhmMAorI2RlZmluZQkJSUxVTkxFTiAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJQ0RCTElNSVQgICAgICAgIAkJMHgzMQorCisjZGVmaW5lCU1BWENNRCAgICAgICAgICAJCTB4MzIKKworI2RlZmluZQlNQVhDTURDTlQgICAgICAgCQkweDMzCisKKyNkZWZpbmUJTFFSU1ZEMDEgICAgICAgIAkJMHgzNAorCisjZGVmaW5lCUxRUlNWRDE2ICAgICAgICAJCTB4MzUKKworI2RlZmluZQlMUVJTVkQxNyAgICAgICAgCQkweDM2CisKKyNkZWZpbmUJQ01EUlNWRDAgICAgICAgIAkJMHgzNworCisjZGVmaW5lCUxRQ1RMMCAgICAgICAgICAJCTB4MzgKKyNkZWZpbmUJCUxRSVRBUkdDTFQgICAgICAJMHhjMAorI2RlZmluZQkJTFFJSU5JVEdDTFQgICAgIAkweDMwCisjZGVmaW5lCQlMUTBUQVJHQ0xUICAgICAgCTB4MGMKKyNkZWZpbmUJCUxRMElOSVRHQ0xUICAgICAJMHgwMworCisjZGVmaW5lCUxRQ1RMMSAgICAgICAgICAJCTB4MzgKKyNkZWZpbmUJCVBDSTJQQ0kgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0lOR0xFQ01EICAgICAgIAkweDAyCisjZGVmaW5lCQlBQk9SVFBFTkRJTkcgICAgCTB4MDEKKworI2RlZmluZQlTQ1NCSVNUMCAgICAgICAgCQkweDM5CisjZGVmaW5lCQlHU0JJU1RFUlIgICAgICAgCTB4NDAKKyNkZWZpbmUJCUdTQklTVERPTkUgICAgICAJMHgyMAorI2RlZmluZQkJR1NCSVNUUlVOICAgICAgIAkweDEwCisjZGVmaW5lCQlPU0JJU1RFUlIgICAgICAgCTB4MDQKKyNkZWZpbmUJCU9TQklTVERPTkUgICAgICAJMHgwMgorI2RlZmluZQkJT1NCSVNUUlVOICAgICAgIAkweDAxCisKKyNkZWZpbmUJTFFDVEwyICAgICAgICAgIAkJMHgzOQorI2RlZmluZQkJTFFJUkVUUlkgICAgICAgIAkweDgwCisjZGVmaW5lCQlMUUlDT05USU5VRSAgICAgCTB4NDAKKyNkZWZpbmUJCUxRSVRPSURMRSAgICAgICAJMHgyMAorI2RlZmluZQkJTFFJUEFVU0UgICAgICAgIAkweDEwCisjZGVmaW5lCQlMUU9SRVRSWSAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUxRT0NPTlRJTlVFICAgICAJMHgwNAorI2RlZmluZQkJTFFPVE9JRExFICAgICAgIAkweDAyCisjZGVmaW5lCQlMUU9QQVVTRSAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NCSVNUMSAgICAgICAgCQkweDNhCisjZGVmaW5lCQlOVEJJU1RFUlIgICAgICAgCTB4MDQKKyNkZWZpbmUJCU5UQklTVERPTkUgICAgICAJMHgwMgorI2RlZmluZQkJTlRCSVNUUlVOICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0NTSVNFUTAgICAgICAgIAkJMHgzYQorI2RlZmluZQkJVEVNT0RFTyAgICAgICAgIAkweDgwCisjZGVmaW5lCQlFTlNFTE8gICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOQVJCTyAgICAgICAgICAJMHgyMAorI2RlZmluZQkJRk9SQ0VCVVNGUkVFICAgIAkweDEwCisjZGVmaW5lCQlTQ1NJUlNUTyAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJU0VRMSAgICAgICAgCQkweDNiCisKKyNkZWZpbmUJU1hGUkNUTDAgICAgICAgIAkJMHgzYworI2RlZmluZQkJREZPTiAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlERlBFWFAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUJJT1NDQU5DRUxFTiAgICAJMHgxMAorI2RlZmluZQkJU1BJT0VOICAgICAgICAgIAkweDA4CisKKyNkZWZpbmUJQlVTSU5JVElEICAgICAgIAkJMHgzYworCisjZGVmaW5lCURMQ09VTlQgICAgICAgICAJCTB4M2MKKworI2RlZmluZQlTWEZSQ1RMMSAgICAgICAgCQkweDNkCisjZGVmaW5lCQlCSVRCVUNLRVQgICAgICAgCTB4ODAKKyNkZWZpbmUJCUVOU0FDSEsgICAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TUENISyAgICAgICAgIAkweDIwCisjZGVmaW5lCQlTVElNRVNFTCAgICAgICAgCTB4MTgKKyNkZWZpbmUJCUVOU1RJTUVSICAgICAgICAJMHgwNAorI2RlZmluZQkJQUNUTkVHRU4gICAgICAgIAkweDAyCisjZGVmaW5lCQlTVFBXRU4gICAgICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNUQVJHSUQgICAgICAgCQkweDNlCisKKyNkZWZpbmUJU1hGUkNUTDIgICAgICAgIAkJMHgzZQorI2RlZmluZQkJQVVUT1JTVERJUyAgICAgIAkweDEwCisjZGVmaW5lCQlDTURETUFFTiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUFTVSAgICAgICAgICAgICAJMHgwNworCisjZGVmaW5lCURGRlNUQVQgICAgICAgICAJCTB4M2YKKyNkZWZpbmUJCUNVUlJGSUZPICAgICAgICAJMHgwMworI2RlZmluZQkJRklGTzFGUkVFICAgICAgIAkweDIwCisjZGVmaW5lCQlGSUZPMEZSRUUgICAgICAgCTB4MTAKKyNkZWZpbmUJCUNVUlJGSUZPX05PTkUgICAJMHgwMworI2RlZmluZQkJQ1VSUkZJRk9fMSAgICAgIAkweDAxCisjZGVmaW5lCQlDVVJSRklGT18wICAgICAgCTB4MDAKKworI2RlZmluZQlTQ1NJU0lHTyAgICAgICAgCQkweDQwCisjZGVmaW5lCQlDRE8gICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUlPTyAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHTyAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlBVE5PICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTE8gICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZTyAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS08gICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCU1VTFRBUkdJRCAgICAgICAJCTB4NDAKKworI2RlZmluZQlTQ1NJU0lHSSAgICAgICAgCQkweDQxCisjZGVmaW5lCQlBVE5JICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTEkgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZSSAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFJICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS0kgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lQSEFTRSAgICAgICAJCTB4NDIKKyNkZWZpbmUJCVNUQVRVU19QSEFTRSAgICAJMHgyMAorI2RlZmluZQkJQ09NTUFORF9QSEFTRSAgIAkweDEwCisjZGVmaW5lCQlNU0dfSU5fUEhBU0UgICAgCTB4MDgKKyNkZWZpbmUJCU1TR19PVVRfUEhBU0UgICAJMHgwNAorI2RlZmluZQkJREFUQV9QSEFTRV9NQVNLIAkweDAzCisjZGVmaW5lCQlEQVRBX0lOX1BIQVNFICAgCTB4MDIKKyNkZWZpbmUJCURBVEFfT1VUX1BIQVNFICAJMHgwMQorCisjZGVmaW5lCVNDU0lEQVQwX0lNRyAgICAJCTB4NDMKKworI2RlZmluZQlTQ1NJREFUICAgICAgICAgCQkweDQ0CisKKyNkZWZpbmUJU0NTSUJVUyAgICAgICAgIAkJMHg0NgorCisjZGVmaW5lCVRBUkdJRElOICAgICAgICAJCTB4NDgKKyNkZWZpbmUJCUNMS09VVCAgICAgICAgICAJMHg4MAorI2RlZmluZQkJVEFSR0lEICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0VMSUQgICAgICAgICAgIAkJMHg0OQorI2RlZmluZQkJU0VMSURfTUFTSyAgICAgIAkweGYwCisjZGVmaW5lCQlPTkVCSVQgICAgICAgICAgCTB4MDgKKworI2RlZmluZQlTQkxLQ1RMICAgICAgICAgCQkweDRhCisjZGVmaW5lCQlESUFHTEVERU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCURJQUdMRURPTiAgICAgICAJMHg0MAorI2RlZmluZQkJRU5BQjQwICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTkFCMjAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFTFdJREUgICAgICAgICAJMHgwMgorCisjZGVmaW5lCU9QVElPTk1PREUgICAgICAJCTB4NGEKKyNkZWZpbmUJCU9QVElPTk1PREVfREVGQVVMVFMJMHgwMgorI2RlZmluZQkJQklPU0NBTkNUTCAgICAgIAkweDgwCisjZGVmaW5lCQlBVVRPQUNLRU4gICAgICAgCTB4NDAKKyNkZWZpbmUJCUJJQVNDQU5DVEwgICAgICAJMHgyMAorI2RlZmluZQkJQlVTRlJFRVJFViAgICAgIAkweDEwCisjZGVmaW5lCQlFTkRHRk9STUNISyAgICAgCTB4MDQKKyNkZWZpbmUJCUFVVE9fTVNHT1VUX0RFICAJMHgwMgorCisjZGVmaW5lCVNTVEFUMCAgICAgICAgICAJCTB4NGIKKyNkZWZpbmUJCVRBUkdFVCAgICAgICAgICAJMHg4MAorI2RlZmluZQkJU0VMRE8gICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTRUxESSAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNFTElOR08gICAgICAgICAJMHgxMAorI2RlZmluZQkJSU9FUlIgICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlPVkVSUlVOICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNQSU9SRFkgICAgICAgICAJMHgwMgorI2RlZmluZQkJQVJCRE8gICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSU0lOVDAgICAgICAgIAkJMHg0YgorI2RlZmluZQkJQ0xSU0VMRE8gICAgICAgIAkweDQwCisjZGVmaW5lCQlDTFJTRUxESSAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUlNFTElOR08gICAgICAJMHgxMAorI2RlZmluZQkJQ0xSSU9FUlIgICAgICAgIAkweDA4CisjZGVmaW5lCQlDTFJPVkVSUlVOICAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUlNQSU9SRFkgICAgICAJMHgwMgorI2RlZmluZQkJQ0xSQVJCRE8gICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lNT0RFMCAgICAgICAgIAkJMHg0YgorI2RlZmluZQkJRU5TRUxETyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNFTERJICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOU0VMSU5HTyAgICAgICAJMHgxMAorI2RlZmluZQkJRU5JT0VSUiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTk9WRVJSVU4gICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOU1BJT1JEWSAgICAgICAJMHgwMgorI2RlZmluZQkJRU5BUkJETyAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSU0lOVDEgICAgICAgIAkJMHg0YworI2RlZmluZQkJQ0xSU0VMVElNRU8gICAgIAkweDgwCisjZGVmaW5lCQlDTFJBVE5PICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNDU0lSU1RJICAgICAJMHgyMAorI2RlZmluZQkJQ0xSQlVTRlJFRSAgICAgIAkweDA4CisjZGVmaW5lCQlDTFJTQ1NJUEVSUiAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUlNUUkIyRkFTVCAgICAJMHgwMgorI2RlZmluZQkJQ0xSUkVRSU5JVCAgICAgIAkweDAxCisKKyNkZWZpbmUJU1NUQVQxICAgICAgICAgIAkJMHg0YworI2RlZmluZQkJU0VMVE8gICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlBVE5UQVJHICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNDU0lSU1RJICAgICAgICAJMHgyMAorI2RlZmluZQkJUEhBU0VNSVMgICAgICAgIAkweDEwCisjZGVmaW5lCQlCVVNGUkVFICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNDU0lQRVJSICAgICAgICAJMHgwNAorI2RlZmluZQkJU1RSQjJGQVNUICAgICAgIAkweDAyCisjZGVmaW5lCQlSRVFJTklUICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTU1RBVDIgICAgICAgICAgCQkweDRkCisjZGVmaW5lCQlCVVNGUkVFVElNRSAgICAgCTB4YzAKKyNkZWZpbmUJCU5PTlBBQ0tSRVEgICAgICAJMHgyMAorI2RlZmluZQkJRVhQX0FDVElWRSAgICAgIAkweDEwCisjZGVmaW5lCQlCU1lYICAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVdJREVfUkVTICAgICAgICAJMHgwNAorI2RlZmluZQkJU0RPTkUgICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlETUFET05FICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUJVU0ZSRUVfREZGMSAgICAJMHhjMAorI2RlZmluZQkJQlVTRlJFRV9ERkYwICAgIAkweDgwCisjZGVmaW5lCQlCVVNGUkVFX0xRTyAgICAgCTB4NDAKKworI2RlZmluZQlDTFJTSU5UMiAgICAgICAgCQkweDRkCisjZGVmaW5lCQlDTFJOT05QQUNLUkVRICAgCTB4MjAKKyNkZWZpbmUJCUNMUldJREVfUkVTICAgICAJMHgwNAorI2RlZmluZQkJQ0xSU0RPTkUgICAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJETUFET05FICAgICAgCTB4MDEKKworI2RlZmluZQlTSU1PREUyICAgICAgICAgCQkweDRkCisjZGVmaW5lCQlFTldJREVfUkVTICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOU0RPTkUgICAgICAgICAJMHgwMgorI2RlZmluZQkJRU5ETUFET05FICAgICAgIAkweDAxCisKKyNkZWZpbmUJUEVSUkRJQUcgICAgICAgIAkJMHg0ZQorI2RlZmluZQkJSElaRVJPICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlISVBFUlIgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBSRVZQSEFTRSAgICAgICAJMHgyMAorI2RlZmluZQkJUEFSSVRZRVJSICAgICAgIAkweDEwCisjZGVmaW5lCQlBSVBFUlIgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNSQ0VSUiAgICAgICAgICAJMHgwNAorI2RlZmluZQkJREdGT1JNRVJSICAgICAgIAkweDAyCisjZGVmaW5lCQlEVEVSUiAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlMUUlTVEFURSAgICAgICAgCQkweDRlCisKKyNkZWZpbmUJU09GRkNOVCAgICAgICAgIAkJMHg0ZgorCisjZGVmaW5lCUxRT1NUQVRFICAgICAgICAJCTB4NGYKKworI2RlZmluZQlMUUlTVEFUMCAgICAgICAgCQkweDUwCisjZGVmaW5lCQlMUUlBVE5RQVMgICAgICAgCTB4MjAKKyNkZWZpbmUJCUxRSUNSQ1QxICAgICAgICAJMHgxMAorI2RlZmluZQkJTFFJQ1JDVDIgICAgICAgIAkweDA4CisjZGVmaW5lCQlMUUlCQURMUVQgICAgICAgCTB4MDQKKyNkZWZpbmUJCUxRSUFUTkxRICAgICAgICAJMHgwMgorI2RlZmluZQkJTFFJQVROQ01EICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSTFFJSU5UMCAgICAgIAkJMHg1MAorI2RlZmluZQkJQ0xSTFFJQVROUUFTICAgIAkweDIwCisjZGVmaW5lCQlDTFJMUUlDUkNUMSAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUkxRSUNSQ1QyICAgICAJMHgwOAorI2RlZmluZQkJQ0xSTFFJQkFETFFUICAgIAkweDA0CisjZGVmaW5lCQlDTFJMUUlBVE5MUSAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUkxRSUFUTkNNRCAgICAJMHgwMQorCisjZGVmaW5lCUxRSU1PREUwICAgICAgICAJCTB4NTAKKyNkZWZpbmUJCUVOTFFJQVROUUFTSyAgICAJMHgyMAorI2RlZmluZQkJRU5MUUlDUkNUMSAgICAgIAkweDEwCisjZGVmaW5lCQlFTkxRSUNSQ1QyICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOTFFJQkFETFFUICAgICAJMHgwNAorI2RlZmluZQkJRU5MUUlBVE5MUSAgICAgIAkweDAyCisjZGVmaW5lCQlFTkxRSUFUTkNNRCAgICAgCTB4MDEKKworI2RlZmluZQlMUUlNT0RFMSAgICAgICAgCQkweDUxCisjZGVmaW5lCQlFTkxRSVBIQVNFX0xRICAgCTB4ODAKKyNkZWZpbmUJCUVOTFFJUEhBU0VfTkxRICAJMHg0MAorI2RlZmluZQkJRU5MSVFBQk9SVCAgICAgIAkweDIwCisjZGVmaW5lCQlFTkxRSUNSQ0lfTFEgICAgCTB4MTAKKyNkZWZpbmUJCUVOTFFJQ1JDSV9OTFEgICAJMHgwOAorI2RlZmluZQkJRU5MUUlCQURMUUkgICAgIAkweDA0CisjZGVmaW5lCQlFTkxRSU9WRVJJX0xRICAgCTB4MDIKKyNkZWZpbmUJCUVOTFFJT1ZFUklfTkxRICAJMHgwMQorCisjZGVmaW5lCUxRSVNUQVQxICAgICAgICAJCTB4NTEKKyNkZWZpbmUJCUxRSVBIQVNFX0xRICAgICAJMHg4MAorI2RlZmluZQkJTFFJUEhBU0VfTkxRICAgIAkweDQwCisjZGVmaW5lCQlMUUlBQk9SVCAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUxRSUNSQ0lfTFEgICAgICAJMHgxMAorI2RlZmluZQkJTFFJQ1JDSV9OTFEgICAgIAkweDA4CisjZGVmaW5lCQlMUUlCQURMUUkgICAgICAgCTB4MDQKKyNkZWZpbmUJCUxRSU9WRVJJX0xRICAgICAJMHgwMgorI2RlZmluZQkJTFFJT1ZFUklfTkxRICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSTFFJSU5UMSAgICAgIAkJMHg1MQorI2RlZmluZQkJQ0xSTFFJUEhBU0VfTFEgIAkweDgwCisjZGVmaW5lCQlDTFJMUUlQSEFTRV9OTFEgCTB4NDAKKyNkZWZpbmUJCUNMUkxJUUFCT1JUICAgICAJMHgyMAorI2RlZmluZQkJQ0xSTFFJQ1JDSV9MUSAgIAkweDEwCisjZGVmaW5lCQlDTFJMUUlDUkNJX05MUSAgCTB4MDgKKyNkZWZpbmUJCUNMUkxRSUJBRExRSSAgICAJMHgwNAorI2RlZmluZQkJQ0xSTFFJT1ZFUklfTFEgIAkweDAyCisjZGVmaW5lCQlDTFJMUUlPVkVSSV9OTFEgCTB4MDEKKworI2RlZmluZQlMUUlTVEFUMiAgICAgICAgCQkweDUyCisjZGVmaW5lCQlQQUNLRVRJWkVEICAgICAgCTB4ODAKKyNkZWZpbmUJCUxRSVBIQVNFX09VVFBLVCAJMHg0MAorI2RlZmluZQkJTFFJV09SS09OTFEgICAgIAkweDIwCisjZGVmaW5lCQlMUUlXQUlURklGTyAgICAgCTB4MTAKKyNkZWZpbmUJCUxRSVNUT1BQS1QgICAgICAJMHgwOAorI2RlZmluZQkJTFFJU1RPUExRICAgICAgIAkweDA0CisjZGVmaW5lCQlMUUlTVE9QQ01EICAgICAgCTB4MDIKKyNkZWZpbmUJCUxRSUdTQVZBSUwgICAgICAJMHgwMQorCisjZGVmaW5lCVNTVEFUMyAgICAgICAgICAJCTB4NTMKKyNkZWZpbmUJCU5UUkFNUEVSUiAgICAgICAJMHgwMgorI2RlZmluZQkJT1NSQU1QRVJSICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lNT0RFMyAgICAgICAgIAkJMHg1MworI2RlZmluZQkJRU5OVFJBTVBFUlIgICAgIAkweDAyCisjZGVmaW5lCQlFTk9TUkFNUEVSUiAgICAgCTB4MDEKKworI2RlZmluZQlDTFJTSU5UMyAgICAgICAgCQkweDUzCisjZGVmaW5lCQlDTFJOVFJBTVBFUlIgICAgCTB4MDIKKyNkZWZpbmUJCUNMUk9TUkFNUEVSUiAgICAJMHgwMQorCisjZGVmaW5lCUxRT01PREUwICAgICAgICAJCTB4NTQKKyNkZWZpbmUJCUVOTFFPVEFSR1NDQlBFUlIJMHgxMAorI2RlZmluZQkJRU5MUU9TVE9QVDIgICAgIAkweDA4CisjZGVmaW5lCQlFTkxRT0FUTkxRICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOTFFPQVROUEtUICAgICAJMHgwMgorI2RlZmluZQkJRU5MUU9UQ1JDICAgICAgIAkweDAxCisKKyNkZWZpbmUJTFFPU1RBVDAgICAgICAgIAkJMHg1NAorI2RlZmluZQkJTFFPVEFSR1NDQlBFUlIgIAkweDEwCisjZGVmaW5lCQlMUU9TVE9QVDIgICAgICAgCTB4MDgKKyNkZWZpbmUJCUxRT0FUTkxRICAgICAgICAJMHgwNAorI2RlZmluZQkJTFFPQVROUEtUICAgICAgIAkweDAyCisjZGVmaW5lCQlMUU9UQ1JDICAgICAgICAgCTB4MDEKKworI2RlZmluZQlDTFJMUU9JTlQwICAgICAgCQkweDU0CisjZGVmaW5lCQlDTFJMUU9UQVJHU0NCUEVSUgkweDEwCisjZGVmaW5lCQlDTFJMUU9TVE9QVDIgICAgCTB4MDgKKyNkZWZpbmUJCUNMUkxRT0FUTkxRICAgICAJMHgwNAorI2RlZmluZQkJQ0xSTFFPQVROUEtUICAgIAkweDAyCisjZGVmaW5lCQlDTFJMUU9UQ1JDICAgICAgCTB4MDEKKworI2RlZmluZQlMUU9TVEFUMSAgICAgICAgCQkweDU1CisjZGVmaW5lCQlMUU9JTklUU0NCUEVSUiAgCTB4MTAKKyNkZWZpbmUJCUxRT1NUT1BJMiAgICAgICAJMHgwOAorI2RlZmluZQkJTFFPQkFEUUFTICAgICAgIAkweDA0CisjZGVmaW5lCQlMUU9CVVNGUkVFICAgICAgCTB4MDIKKyNkZWZpbmUJCUxRT1BIQUNIR0lOUEtUICAJMHgwMQorCisjZGVmaW5lCUNMUkxRT0lOVDEgICAgICAJCTB4NTUKKyNkZWZpbmUJCUNMUkxRT0lOSVRTQ0JQRVJSCTB4MTAKKyNkZWZpbmUJCUNMUkxRT1NUT1BJMiAgICAJMHgwOAorI2RlZmluZQkJQ0xSTFFPQkFEUUFTICAgIAkweDA0CisjZGVmaW5lCQlDTFJMUU9CVVNGUkVFICAgCTB4MDIKKyNkZWZpbmUJCUNMUkxRT1BIQUNIR0lOUEtUCTB4MDEKKworI2RlZmluZQlMUU9NT0RFMSAgICAgICAgCQkweDU1CisjZGVmaW5lCQlFTkxRT0lOSVRTQ0JQRVJSCTB4MTAKKyNkZWZpbmUJCUVOTFFPU1RPUEkyICAgICAJMHgwOAorI2RlZmluZQkJRU5MUU9CQURRQVMgICAgIAkweDA0CisjZGVmaW5lCQlFTkxRT0JVU0ZSRUUgICAgCTB4MDIKKyNkZWZpbmUJCUVOTFFPUEhBQ0hHSU5QS1QJMHgwMQorCisjZGVmaW5lCUxRT1NUQVQyICAgICAgICAJCTB4NTYKKyNkZWZpbmUJCUxRT1BLVCAgICAgICAgICAJMHhlMAorI2RlZmluZQkJTFFPV0FJVEZJRk8gICAgIAkweDEwCisjZGVmaW5lCQlMUU9QSEFDSEdPVVRQS1QgCTB4MDIKKyNkZWZpbmUJCUxRT1NUT1AwICAgICAgICAJMHgwMQorCisjZGVmaW5lCU9TX1NQQUNFX0NOVCAgICAJCTB4NTYKKworI2RlZmluZQlTSU1PREUxICAgICAgICAgCQkweDU3CisjZGVmaW5lCQlFTlNFTFRJTU8gICAgICAgCTB4ODAKKyNkZWZpbmUJCUVOQVROVEFSRyAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TQ1NJUlNUICAgICAgIAkweDIwCisjZGVmaW5lCQlFTlBIQVNFTUlTICAgICAgCTB4MTAKKyNkZWZpbmUJCUVOQlVTRlJFRSAgICAgICAJMHgwOAorI2RlZmluZQkJRU5TQ1NJUEVSUiAgICAgIAkweDA0CisjZGVmaW5lCQlFTlNUUkIyRkFTVCAgICAgCTB4MDIKKyNkZWZpbmUJCUVOUkVRSU5JVCAgICAgICAJMHgwMQorCisjZGVmaW5lCUdTRklGTyAgICAgICAgICAJCTB4NTgKKworI2RlZmluZQlERkZTWEZSQ1RMICAgICAgCQkweDVhCisjZGVmaW5lCQlERkZCSVRCVUNLRVQgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNIQ05UICAgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ0hOICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlSU1RDSE4gICAgICAgICAgCTB4MDEKKworI2RlZmluZQlMUU9TQ1NDVEwgICAgICAgCQkweDVhCisjZGVmaW5lCQlMUU9IMkFfVkVSU0lPTiAgCTB4ODAKKyNkZWZpbmUJCUxRT05PQ0hLT1ZFUiAgICAJMHgwMQorCisjZGVmaW5lCU5FWFRTQ0IgICAgICAgICAJCTB4NWEKKworI2RlZmluZQlDTFJTRVFJTlRTUkMgICAgCQkweDViCisjZGVmaW5lCQlDTFJDVFhURE9ORSAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNBVkVQVFJTICAgICAJMHgyMAorI2RlZmluZQkJQ0xSQ0ZHNERBVEEgICAgIAkweDEwCisjZGVmaW5lCQlDTFJDRkc0SVNUQVQgICAgCTB4MDgKKyNkZWZpbmUJCUNMUkNGRzRUU1RBVCAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ0ZHNElDTUQgICAgIAkweDAyCisjZGVmaW5lCQlDTFJDRkc0VENNRCAgICAgCTB4MDEKKworI2RlZmluZQlTRVFJTlRTUkMgICAgICAgCQkweDViCisjZGVmaW5lCQlDVFhURE9ORSAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNBVkVQVFJTICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0ZHNERBVEEgICAgICAgIAkweDEwCisjZGVmaW5lCQlDRkc0SVNUQVQgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNGRzRUU1RBVCAgICAgICAJMHgwNAorI2RlZmluZQkJQ0ZHNElDTUQgICAgICAgIAkweDAyCisjZGVmaW5lCQlDRkc0VENNRCAgICAgICAgCTB4MDEKKworI2RlZmluZQlDVVJSU0NCICAgICAgICAgCQkweDVjCisKKyNkZWZpbmUJU0VRSU1PREUgICAgICAgIAkJMHg1YworI2RlZmluZQkJRU5DVFhURE9ORSAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNBVkVQVFJTICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOQ0ZHNERBVEEgICAgICAJMHgxMAorI2RlZmluZQkJRU5DRkc0SVNUQVQgICAgIAkweDA4CisjZGVmaW5lCQlFTkNGRzRUU1RBVCAgICAgCTB4MDQKKyNkZWZpbmUJCUVOQ0ZHNElDTUQgICAgICAJMHgwMgorI2RlZmluZQkJRU5DRkc0VENNRCAgICAgIAkweDAxCisKKyNkZWZpbmUJTURGRlNUQVQgICAgICAgIAkJMHg1ZAorI2RlZmluZQkJU0hDTlRORUdBVElWRSAgIAkweDQwCisjZGVmaW5lCQlTSENOVE1JTlVTMSAgICAgCTB4MjAKKyNkZWZpbmUJCUxBU1RTRE9ORSAgICAgICAJMHgxMAorI2RlZmluZQkJU0hWQUxJRCAgICAgICAgIAkweDA4CisjZGVmaW5lCQlETFpFUk8gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCURBVEFJTkZJRk8gICAgICAJMHgwMgorI2RlZmluZQkJRklGT0ZSRUUgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ1JDQ09OVFJPTCAgICAgIAkJMHg1ZAorI2RlZmluZQkJQ1JDVkFMQ0hLRU4gICAgIAkweDQwCisKKyNkZWZpbmUJREZGVEFHICAgICAgICAgIAkJMHg1ZQorCisjZGVmaW5lCUxBU1RTQ0IgICAgICAgICAJCTB4NWUKKworI2RlZmluZQlTQ1NJVEVTVCAgICAgICAgCQkweDVlCisjZGVmaW5lCQlDTlRSVEVTVCAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNFTF9UWFBMTF9ERUJVRyAJMHgwNAorCisjZGVmaW5lCUlPUEROQ1RMICAgICAgICAJCTB4NWYKKyNkZWZpbmUJCURJU0FCTEVfT0UgICAgICAJMHg4MAorI2RlZmluZQkJUEROX0lESVNUICAgICAgIAkweDA0CisjZGVmaW5lCQlQRE5fRElGRlNFTlNFICAgCTB4MDEKKworI2RlZmluZQlTSEFERFIgICAgICAgICAgCQkweDYwCisKKyNkZWZpbmUJTkVHT0FERFIgICAgICAgIAkJMHg2MAorCisjZGVmaW5lCURHUlBDUkNJICAgICAgICAJCTB4NjAKKworI2RlZmluZQlORUdQRVJJT0QgICAgICAgCQkweDYxCisKKyNkZWZpbmUJUEFDS0NSQ0kgICAgICAgIAkJMHg2MgorCisjZGVmaW5lCU5FR09GRlNFVCAgICAgICAJCTB4NjIKKworI2RlZmluZQlORUdQUFJPUFRTICAgICAgCQkweDYzCisjZGVmaW5lCQlQUFJPUFRfUEFDRSAgICAgCTB4MDgKKyNkZWZpbmUJCVBQUk9QVF9RQVMgICAgICAJMHgwNAorI2RlZmluZQkJUFBST1BUX0RUICAgICAgIAkweDAyCisjZGVmaW5lCQlQUFJPUFRfSVVUICAgICAgCTB4MDEKKworI2RlZmluZQlORUdDT05PUFRTICAgICAgCQkweDY0CisjZGVmaW5lCQlFTlNOQVBTSE9UICAgICAgCTB4NDAKKyNkZWZpbmUJCVJUSV9XUlRESVMgICAgICAJMHgyMAorI2RlZmluZQkJUlRJX09WUkRUUk4gICAgIAkweDEwCisjZGVmaW5lCQlFTlNMT1dDUkMgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQVVUT0FUTkkgICAgICAJMHgwNAorI2RlZmluZQkJRU5BVVRPQVROTyAgICAgIAkweDAyCisjZGVmaW5lCQlXSURFWEZFUiAgICAgICAgCTB4MDEKKworI2RlZmluZQlBTk5FWENPTCAgICAgICAgCQkweDY1CisKKyNkZWZpbmUJU0NTQ0hLTiAgICAgICAgIAkJMHg2NgorI2RlZmluZQkJU1RTRUxTS0lERElTICAgIAkweDQwCisjZGVmaW5lCQlDVVJSRklGT0RFRiAgICAgCTB4MjAKKyNkZWZpbmUJCVdJREVSRVNFTiAgICAgICAJMHgxMAorI2RlZmluZQkJU0RPTkVNU0tESVMgICAgIAkweDA4CisjZGVmaW5lCQlERkZBQ1RDTFIgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNIVkFMSURTVERJUyAgICAJMHgwMgorI2RlZmluZQkJTFNUU0dDTFJESVMgICAgIAkweDAxCisKKyNkZWZpbmUJQU5ORVhEQVQgICAgICAgIAkJMHg2NgorCisjZGVmaW5lCUlPV05JRCAgICAgICAgICAJCTB4NjcKKworI2RlZmluZQlQTEw5NjBDVEwwICAgICAgCQkweDY4CisKKyNkZWZpbmUJU0hDTlQgICAgICAgICAgIAkJMHg2OAorCisjZGVmaW5lCVRPV05JRCAgICAgICAgICAJCTB4NjkKKworI2RlZmluZQlQTEw5NjBDVEwxICAgICAgCQkweDY5CisKKyNkZWZpbmUJUExMOTYwQ05UMCAgICAgIAkJMHg2YQorCisjZGVmaW5lCVhTSUcgICAgICAgICAgICAJCTB4NmEKKworI2RlZmluZQlTRUxPSUQgICAgICAgICAgCQkweDZiCisKKyNkZWZpbmUJUExMNDAwQ1RMMCAgICAgIAkJMHg2YworI2RlZmluZQkJUExMX1ZDT1NFTCAgICAgIAkweDgwCisjZGVmaW5lCQlQTExfUFdETiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBMTF9OUyAgICAgICAgICAJMHgzMAorI2RlZmluZQkJUExMX0VOTFVEICAgICAgIAkweDA4CisjZGVmaW5lCQlQTExfRU5MUEYgICAgICAgCTB4MDQKKyNkZWZpbmUJCVBMTF9ETFBGICAgICAgICAJMHgwMgorI2RlZmluZQkJUExMX0VORkJNICAgICAgIAkweDAxCisKKyNkZWZpbmUJRkFJUk5FU1MgICAgICAgIAkJMHg2YworCisjZGVmaW5lCVBMTDQwMENUTDEgICAgICAJCTB4NmQKKyNkZWZpbmUJCVBMTF9DTlRFTiAgICAgICAJMHg4MAorI2RlZmluZQkJUExMX0NOVENMUiAgICAgIAkweDQwCisjZGVmaW5lCQlQTExfUlNUICAgICAgICAgCTB4MDEKKworI2RlZmluZQlQTEw0MDBDTlQwICAgICAgCQkweDZlCisKKyNkZWZpbmUJVU5GQUlSTkVTUyAgICAgIAkJMHg2ZQorCisjZGVmaW5lCUhBRERSICAgICAgICAgICAJCTB4NzAKKworI2RlZmluZQlQTExERUxBWSAgICAgICAgCQkweDcwCisjZGVmaW5lCQlTUExJVF9EUk9QX1JFUSAgCTB4ODAKKworI2RlZmluZQlIT0RNQUFEUiAgICAgICAgCQkweDcwCisKKyNkZWZpbmUJSE9ETUFDTlQgICAgICAgIAkJMHg3OAorCisjZGVmaW5lCUhDTlQgICAgICAgICAgICAJCTB4NzgKKworI2RlZmluZQlIT0RNQUVOICAgICAgICAgCQkweDdhCisKKyNkZWZpbmUJU0dIQUREUiAgICAgICAgIAkJMHg3YworCisjZGVmaW5lCVNDQkhBRERSICAgICAgICAJCTB4N2MKKworI2RlZmluZQlTR0hDTlQgICAgICAgICAgCQkweDg0CisKKyNkZWZpbmUJU0NCSENOVCAgICAgICAgIAkJMHg4NAorCisjZGVmaW5lCURGRl9USFJTSCAgICAgICAJCTB4ODgKKyNkZWZpbmUJCVdSX0RGVEhSU0ggICAgICAJMHg3MAorI2RlZmluZQkJUkRfREZUSFJTSCAgICAgIAkweDA3CisjZGVmaW5lCQlXUl9ERlRIUlNIX01BWCAgCTB4NzAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfOTAgICAJMHg2MAorI2RlZmluZQkJV1JfREZUSFJTSF84NSAgIAkweDUwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzc1ICAgCTB4NDAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfNjMgICAJMHgzMAorI2RlZmluZQkJV1JfREZUSFJTSF81MCAgIAkweDIwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzI1ICAgCTB4MTAKKyNkZWZpbmUJCVJEX0RGVEhSU0hfTUFYICAJMHgwNworI2RlZmluZQkJUkRfREZUSFJTSF85MCAgIAkweDA2CisjZGVmaW5lCQlSRF9ERlRIUlNIXzg1ICAgCTB4MDUKKyNkZWZpbmUJCVJEX0RGVEhSU0hfNzUgICAJMHgwNAorI2RlZmluZQkJUkRfREZUSFJTSF82MyAgIAkweDAzCisjZGVmaW5lCQlSRF9ERlRIUlNIXzUwICAgCTB4MDIKKyNkZWZpbmUJCVJEX0RGVEhSU0hfMjUgICAJMHgwMQorI2RlZmluZQkJV1JfREZUSFJTSF9NSU4gIAkweDAwCisjZGVmaW5lCQlSRF9ERlRIUlNIX01JTiAgCTB4MDAKKworI2RlZmluZQlST01BRERSICAgICAgICAgCQkweDhhCisKKyNkZWZpbmUJUk9NQ05UUkwgICAgICAgIAkJMHg4ZAorI2RlZmluZQkJUk9NT1AgICAgICAgICAgIAkweGUwCisjZGVmaW5lCQlST01TUEQgICAgICAgICAgCTB4MTgKKyNkZWZpbmUJCVJFUEVBVCAgICAgICAgICAJMHgwMgorI2RlZmluZQkJUkRZICAgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJUk9NREFUQSAgICAgICAgIAkJMHg4ZQorCisjZGVmaW5lCUNNQ1JYTVNHMCAgICAgICAJCTB4OTAKKworI2RlZmluZQlST0VOQUJMRSAgICAgICAgCQkweDkwCisjZGVmaW5lCQlNU0lST0VOICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCU9WTFlST0VOICAgICAgICAJMHgxMAorI2RlZmluZQkJQ01DUk9FTiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTR1JPRU4gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCURDSDFST0VOICAgICAgICAJMHgwMgorI2RlZmluZQkJRENIMFJPRU4gICAgICAgIAkweDAxCisKKyNkZWZpbmUJT1ZMWVJYTVNHMCAgICAgIAkJMHg5MAorCisjZGVmaW5lCURDSFJYTVNHMCAgICAgICAJCTB4OTAKKworI2RlZmluZQlPVkxZUlhNU0cxICAgICAgCQkweDkxCisKKyNkZWZpbmUJTlNFTkFCTEUgICAgICAgIAkJMHg5MQorI2RlZmluZQkJTVNJTlNFTiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlPVkxZTlNFTiAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUNNQ05TRU4gICAgICAgICAJMHgwOAorI2RlZmluZQkJU0dOU0VOICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlEQ0gxTlNFTiAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURDSDBOU0VOICAgICAgICAJMHgwMQorCisjZGVmaW5lCURDSFJYTVNHMSAgICAgICAJCTB4OTEKKworI2RlZmluZQlDTUNSWE1TRzEgICAgICAgCQkweDkxCisKKyNkZWZpbmUJRENIUlhNU0cyICAgICAgIAkJMHg5MgorCisjZGVmaW5lCU9WTFlSWE1TRzIgICAgICAJCTB4OTIKKworI2RlZmluZQlDTUNSWE1TRzIgICAgICAgCQkweDkyCisKKyNkZWZpbmUJT1NUICAgICAgICAgICAgIAkJMHg5MgorCisjZGVmaW5lCURDSFJYTVNHMyAgICAgICAJCTB4OTMKKworI2RlZmluZQlDTUNSWE1TRzMgICAgICAgCQkweDkzCisKKyNkZWZpbmUJUENJWENUTCAgICAgICAgIAkJMHg5MworI2RlZmluZQkJU0VSUlBVTFNFICAgICAgIAkweDgwCisjZGVmaW5lCQlVTkVYUFNDSUVOICAgICAgCTB4MjAKKyNkZWZpbmUJCVNQTFRTTUFESVMgICAgICAJMHgxMAorI2RlZmluZQkJU1BMVFNUQURJUyAgICAgIAkweDA4CisjZGVmaW5lCQlTUlNQRFBFRU4gICAgICAgCTB4MDQKKyNkZWZpbmUJCVRTQ1NFUlJFTiAgICAgICAJMHgwMgorI2RlZmluZQkJQ01QQUJDRElTICAgICAgIAkweDAxCisKKyNkZWZpbmUJT1ZMWVJYTVNHMyAgICAgIAkJMHg5MworCisjZGVmaW5lCU9WTFlTRVFCQ05UICAgICAJCTB4OTQKKworI2RlZmluZQlDTUNTRVFCQ05UICAgICAgCQkweDk0CisKKyNkZWZpbmUJRENIU0VRQkNOVCAgICAgIAkJMHg5NAorCisjZGVmaW5lCUNNQ1NQTFRTVEFUMCAgICAJCTB4OTYKKworI2RlZmluZQlPVkxZU1BMVFNUQVQwICAgCQkweDk2CisKKyNkZWZpbmUJRENIU1BMVFNUQVQwICAgIAkJMHg5NgorCisjZGVmaW5lCURDSFNQTFRTVEFUMSAgICAJCTB4OTcKKworI2RlZmluZQlDTUNTUExUU1RBVDEgICAgCQkweDk3CisKKyNkZWZpbmUJT1ZMWVNQTFRTVEFUMSAgIAkJMHg5NworCisjZGVmaW5lCVNHUlhNU0cwICAgICAgICAJCTB4OTgKKyNkZWZpbmUJCUNETlVNICAgICAgICAgICAJMHhmOAorI2RlZmluZQkJQ0ZOVU0gICAgICAgICAgIAkweDA3CisKKyNkZWZpbmUJU0xWU1BMVE9VVEFEUjAgIAkJMHg5OAorI2RlZmluZQkJTE9XRVJfQUREUiAgICAgIAkweDdmCisKKyNkZWZpbmUJU0dSWE1TRzEgICAgICAgIAkJMHg5OQorI2RlZmluZQkJQ0JOVU0gICAgICAgICAgIAkweGZmCisKKyNkZWZpbmUJU0xWU1BMVE9VVEFEUjEgIAkJMHg5OQorI2RlZmluZQkJUkVRX0ROVU0gICAgICAgIAkweGY4CisjZGVmaW5lCQlSRVFfRk5VTSAgICAgICAgCTB4MDcKKworI2RlZmluZQlTR1JYTVNHMiAgICAgICAgCQkweDlhCisjZGVmaW5lCQlNSU5ERVggICAgICAgICAgCTB4ZmYKKworI2RlZmluZQlTTFZTUExUT1VUQURSMiAgCQkweDlhCisjZGVmaW5lCQlSRVFfQk5VTSAgICAgICAgCTB4ZmYKKworI2RlZmluZQlTR1JYTVNHMyAgICAgICAgCQkweDliCisjZGVmaW5lCQlNQ0xBU1MgICAgICAgICAgCTB4MGYKKworI2RlZmluZQlTTFZTUExUT1VUQURSMyAgCQkweDliCisjZGVmaW5lCQlUQUdfTlVNICAgICAgICAgCTB4MWYKKyNkZWZpbmUJCVJMWE9SRCAgICAgICAgICAJMHgxMAorCisjZGVmaW5lCVNHU0VRQkNOVCAgICAgICAJCTB4OWMKKworI2RlZmluZQlTTFZTUExUT1VUQVRUUjAgCQkweDljCisjZGVmaW5lCQlMT1dFUl9CQ05UICAgICAgCTB4ZmYKKworI2RlZmluZQlTTFZTUExUT1VUQVRUUjEgCQkweDlkCisjZGVmaW5lCQlDTVBMVF9ETlVNICAgICAgCTB4ZjgKKyNkZWZpbmUJCUNNUExUX0ZOVU0gICAgICAJMHgwNworCisjZGVmaW5lCVNMVlNQTFRPVVRBVFRSMiAJCTB4OWUKKyNkZWZpbmUJCUNNUExUX0JOVU0gICAgICAJMHhmZgorCisjZGVmaW5lCVNHU1BMVFNUQVQwICAgICAJCTB4OWUKKyNkZWZpbmUJCVNUQUVURVJNICAgICAgICAJMHg4MAorI2RlZmluZQkJU0NCQ0VSUiAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ0FERVJSICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNDREFUQlVDS0VUICAgICAJMHgxMAorI2RlZmluZQkJQ05UTk9UQ01QTFQgICAgIAkweDA4CisjZGVmaW5lCQlSWE9WUlVOICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVJYU0NFTVNHICAgICAgICAJMHgwMgorI2RlZmluZQkJUlhTUExUUlNQICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0ZVTkNUICAgICAgICAgIAkJMHg5ZgorI2RlZmluZQkJVEVTVF9HUk9VUCAgICAgIAkweGYwCisjZGVmaW5lCQlURVNUX05VTSAgICAgICAgCTB4MGYKKworI2RlZmluZQlTR1NQTFRTVEFUMSAgICAgCQkweDlmCisjZGVmaW5lCQlSWERBVEFCVUNLRVQgICAgCTB4MDEKKworI2RlZmluZQlERjBQQ0lTVEFUICAgICAgCQkweGEwCisKKyNkZWZpbmUJUkVHMCAgICAgICAgICAgIAkJMHhhMAorCisjZGVmaW5lCURGMVBDSVNUQVQgICAgICAJCTB4YTEKKworI2RlZmluZQlTR1BDSVNUQVQgICAgICAgCQkweGEyCisKKyNkZWZpbmUJUkVHMSAgICAgICAgICAgIAkJMHhhMgorCisjZGVmaW5lCUNNQ1BDSVNUQVQgICAgICAJCTB4YTMKKworI2RlZmluZQlPVkxZUENJU1RBVCAgICAgCQkweGE0CisjZGVmaW5lCQlTQ0FBUEVSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVJEUEVSUiAgICAgICAgICAJMHgwNAorCisjZGVmaW5lCVJFR19JU1IgICAgICAgICAJCTB4YTQKKworI2RlZmluZQlTR19TVEFURSAgICAgICAgCQkweGE2CisjZGVmaW5lCQlGRVRDSF9JTlBST0cgICAgCTB4MDQKKyNkZWZpbmUJCUxPQURJTkdfTkVFREVEICAJMHgwMgorI2RlZmluZQkJU0VHU19BVkFJTCAgICAgIAkweDAxCisKKyNkZWZpbmUJTVNJUENJU1RBVCAgICAgIAkJMHhhNgorI2RlZmluZQkJUk1BICAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlSVEEgICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUlBFTkRNU0kgICAgICAJMHgwOAorI2RlZmluZQkJRFBSICAgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJVEFSR1BDSVNUQVQgICAgIAkJMHhhNworI2RlZmluZQkJRFBFICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTU0UgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNUQSAgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJVFdBVEVSUiAgICAgICAgIAkweDAyCisKKyNkZWZpbmUJREFUQV9DT1VOVF9PREQgIAkJMHhhNworCisjZGVmaW5lCVNDQlBUUiAgICAgICAgICAJCTB4YTgKKworI2RlZmluZQlDQ1NDQkFDTlQgICAgICAgCQkweGFiCisKKyNkZWZpbmUJU0NCQVVUT1BUUiAgICAgIAkJMHhhYgorI2RlZmluZQkJQVVTQ0JQVFJfRU4gICAgIAkweDgwCisjZGVmaW5lCQlTQ0JQVFJfQUREUiAgICAgCTB4MzgKKyNkZWZpbmUJCVNDQlBUUl9PRkYgICAgICAJMHgwNworCisjZGVmaW5lCUNDU0dBRERSICAgICAgICAJCTB4YWMKKworI2RlZmluZQlDQ1NDQkFERFIgICAgICAgCQkweGFjCisKKyNkZWZpbmUJQ0NTQ0JBRFJfQksgICAgIAkJMHhhYworCisjZGVmaW5lCUNNQ19SQU1CSVNUICAgICAJCTB4YWQKKyNkZWZpbmUJCVNHX0VMRU1FTlRfU0laRSAJMHg4MAorI2RlZmluZQkJU0NCUkFNQklTVF9GQUlMIAkweDQwCisjZGVmaW5lCQlTR19CSVNUX0ZBSUwgICAgCTB4MjAKKyNkZWZpbmUJCVNHX0JJU1RfRU4gICAgICAJMHgxMAorI2RlZmluZQkJQ01DX0JVRkZFUl9CSVNUX0ZBSUwJMHgwMgorI2RlZmluZQkJQ01DX0JVRkZFUl9CSVNUX0VOCTB4MDEKKworI2RlZmluZQlDQ1NHQ1RMICAgICAgICAgCQkweGFkCisjZGVmaW5lCQlDQ1NHRU4gICAgICAgICAgCTB4MGMKKyNkZWZpbmUJCUNDU0dET05FICAgICAgICAJMHg4MAorI2RlZmluZQkJU0dfQ0FDSEVfQVZBSUwgIAkweDEwCisjZGVmaW5lCQlDQ1NHRU5BQ0sgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNHX0ZFVENIX1JFUSAgICAJMHgwMgorI2RlZmluZQkJQ0NTR1JFU0VUICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NTQ0JDVEwgICAgICAgIAkJMHhhZAorI2RlZmluZQkJQ0NTQ0JET05FICAgICAgIAkweDgwCisjZGVmaW5lCQlBUlJET05FICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNDQVJSRU4gICAgICAgICAJMHgxMAorI2RlZmluZQkJQ0NTQ0JFTiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlDQ1NDQkRJUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNDU0NCUkVTRVQgICAgICAJMHgwMQorCisjZGVmaW5lCUNDU0dSQU0gICAgICAgICAJCTB4YjAKKworI2RlZmluZQlGTEVYQURSICAgICAgICAgCQkweGIwCisKKyNkZWZpbmUJQ0NTQ0JSQU0gICAgICAgIAkJMHhiMAorCisjZGVmaW5lCUZMRVhDTlQgICAgICAgICAJCTB4YjMKKworI2RlZmluZQlGTEVYRE1BU1RBVCAgICAgCQkweGI1CisjZGVmaW5lCQlGTEVYRE1BRVJSICAgICAgCTB4MDIKKyNkZWZpbmUJCUZMRVhETUFET05FICAgICAJMHgwMQorCisjZGVmaW5lCUZMRVhEQVRBICAgICAgICAJCTB4YjYKKworI2RlZmluZQlCUkREQVQgICAgICAgICAgCQkweGI4CisKKyNkZWZpbmUJQlJEQ1RMICAgICAgICAgIAkJMHhiOQorI2RlZmluZQkJRkxYQVJCQUNLICAgICAgIAkweDgwCisjZGVmaW5lCQlGTFhBUkJSRVEgICAgICAgCTB4NDAKKyNkZWZpbmUJCUJSREFERFIgICAgICAgICAJMHgzOAorI2RlZmluZQkJQlJERU4gICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlCUkRSVyAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUJSRFNUQiAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFRUFEUiAgICAgICAgICAJCTB4YmEKKworI2RlZmluZQlTRUVEQVQgICAgICAgICAgCQkweGJjCisKKyNkZWZpbmUJU0VFQ1RMICAgICAgICAgIAkJMHhiZQorI2RlZmluZQkJU0VFT1BfRVdFTiAgICAgIAkweDQwCisjZGVmaW5lCQlTRUVPUF9XQUxMICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFRU9QX0VXRFMgICAgICAJMHg0MAorI2RlZmluZQkJU0VFT1BDT0RFICAgICAgIAkweDcwCisjZGVmaW5lCQlTRUVSU1QgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNFRVNUQVJUICAgICAgICAJMHgwMQorI2RlZmluZQkJU0VFT1BfRVJBU0UgICAgIAkweDcwCisjZGVmaW5lCQlTRUVPUF9SRUFEICAgICAgCTB4NjAKKyNkZWZpbmUJCVNFRU9QX1dSSVRFICAgICAJMHg1MAorI2RlZmluZQkJU0VFT1BfRVJBTCAgICAgIAkweDQwCisKKyNkZWZpbmUJU0VFU1RBVCAgICAgICAgIAkJMHhiZQorI2RlZmluZQkJSU5JVF9ET05FICAgICAgIAkweDgwCisjZGVmaW5lCQlMREFMVElEX0wgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNFRUFSQkFDSyAgICAgICAJMHgwNAorI2RlZmluZQkJU0VFQlVTWSAgICAgICAgIAkweDAyCisKKyNkZWZpbmUJU0NCQ05UICAgICAgICAgIAkJMHhiZgorCisjZGVmaW5lCURGV0FERFIgICAgICAgICAJCTB4YzAKKworI2RlZmluZQlEU1BGTFRSQ1RMICAgICAgCQkweGMwCisjZGVmaW5lCQlGTFRSRElTQUJMRSAgICAgCTB4MjAKKyNkZWZpbmUJCUVER0VTRU5TRSAgICAgICAJMHgxMAorI2RlZmluZQkJRFNQRkNOVFNFTCAgICAgIAkweDBmCisKKyNkZWZpbmUJRFNQREFUQUNUTCAgICAgIAkJMHhjMQorI2RlZmluZQkJQllQQVNTRU5BQiAgICAgIAkweDgwCisjZGVmaW5lCQlERVNRRElTICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVJDVlJPRkZTVERJUyAgICAJMHgwNAorI2RlZmluZQkJWE1JVE9GRlNURElTICAgIAkweDAyCisKKyNkZWZpbmUJREZSQUREUiAgICAgICAgIAkJMHhjMgorCisjZGVmaW5lCURTUFJFUUNUTCAgICAgICAJCTB4YzIKKyNkZWZpbmUJCU1BTlJFUUNUTCAgICAgICAJMHhjMAorI2RlZmluZQkJTUFOUkVRRExZICAgICAgIAkweDNmCisKKyNkZWZpbmUJRFNQQUNLQ1RMICAgICAgIAkJMHhjMworI2RlZmluZQkJTUFOQUNLQ1RMICAgICAgIAkweGMwCisjZGVmaW5lCQlNQU5BQ0tETFkgICAgICAgCTB4M2YKKworI2RlZmluZQlERkRBVCAgICAgICAgICAgCQkweGM0CisKKyNkZWZpbmUJRFNQU0VMRUNUICAgICAgIAkJMHhjNAorI2RlZmluZQkJQVVUT0lOQ0VOICAgICAgIAkweDgwCisjZGVmaW5lCQlEU1BTRUwgICAgICAgICAgCTB4MWYKKworI2RlZmluZQlXUlRCSUFTQ1RMICAgICAgCQkweGM1CisjZGVmaW5lCQlBVVRPWEJDRElTICAgICAgCTB4ODAKKyNkZWZpbmUJCVhNSVRNQU5WQUwgICAgICAJMHgzZgorCisjZGVmaW5lCVJDVlJCSU9TQ1RMICAgICAJCTB4YzYKKyNkZWZpbmUJCUFVVE9SQkNESVMgICAgICAJMHg4MAorI2RlZmluZQkJUkNWUk1BTlZBTCAgICAgIAkweDNmCisKKyNkZWZpbmUJV1JUQklBU0NBTEMgICAgIAkJMHhjNworCisjZGVmaW5lCURGUFRSUyAgICAgICAgICAJCTB4YzgKKworI2RlZmluZQlSQ1ZSQklBU0NBTEMgICAgCQkweGM4CisKKyNkZWZpbmUJREZCS1BUUiAgICAgICAgIAkJMHhjOQorCisjZGVmaW5lCVNLRVdDQUxDICAgICAgICAJCTB4YzkKKworI2RlZmluZQlERkRCQ1RMICAgICAgICAgCQkweGNiCisjZGVmaW5lCQlERkZfQ0lPX1dSX1JEWSAgCTB4MjAKKyNkZWZpbmUJCURGRl9DSU9fUkRfUkRZICAJMHgxMAorI2RlZmluZQkJREZGX0RJUl9FUlIgICAgIAkweDA4CisjZGVmaW5lCQlERkZfUkFNQklTVF9GQUlMCTB4MDQKKyNkZWZpbmUJCURGRl9SQU1CSVNUX0RPTkUJMHgwMgorI2RlZmluZQkJREZGX1JBTUJJU1RfRU4gIAkweDAxCisKKyNkZWZpbmUJREZTQ05UICAgICAgICAgIAkJMHhjYworCisjZGVmaW5lCURGQkNOVCAgICAgICAgICAJCTB4Y2UKKworI2RlZmluZQlPVkxZQUREUiAgICAgICAgCQkweGQ0CisKKyNkZWZpbmUJU0VRQ1RMMCAgICAgICAgIAkJMHhkNgorI2RlZmluZQkJUEVSUk9SRElTICAgICAgIAkweDgwCisjZGVmaW5lCQlQQVVTRURJUyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUZBSUxESVMgICAgICAgICAJMHgyMAorI2RlZmluZQkJRkFTVE1PREUgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUktBRFJJTlRFTiAgICAgCTB4MDgKKyNkZWZpbmUJCVNURVAgICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VRUkVTRVQgICAgICAgIAkweDAyCisjZGVmaW5lCQlMT0FEUkFNICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTRVFDVEwxICAgICAgICAgCQkweGQ3CisjZGVmaW5lCQlPVlJMQVlfREFUQV9DSEsgCTB4MDgKKyNkZWZpbmUJCVJBTUJJU1RfRE9ORSAgICAJMHgwNAorI2RlZmluZQkJUkFNQklTVF9GQUlMICAgIAkweDAyCisjZGVmaW5lCQlSQU1CSVNUX0VOICAgICAgCTB4MDEKKworI2RlZmluZQlGTEFHUyAgICAgICAgICAgCQkweGQ4CisjZGVmaW5lCQlaRVJPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNBUlJZICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUUlOVENUTCAgICAgICAJCTB4ZDkKKyNkZWZpbmUJCUlOVFZFQzFEU0wgICAgICAJMHg4MAorI2RlZmluZQkJSU5UMV9DT05URVhUICAgIAkweDIwCisjZGVmaW5lCQlTQ1NfU0VRX0lOVDFNMSAgCTB4MTAKKyNkZWZpbmUJCVNDU19TRVFfSU5UMU0wICAJMHgwOAorI2RlZmluZQkJSU5UTUFTSzIgICAgICAgIAkweDA0CisjZGVmaW5lCQlJTlRNQVNLMSAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUlSRVQgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUVJBTSAgICAgICAgICAJCTB4ZGEKKworI2RlZmluZQlQUkdNQ05UICAgICAgICAgCQkweGRlCisKKyNkZWZpbmUJQUNDVU0gICAgICAgICAgIAkJMHhlMAorCisjZGVmaW5lCVNJTkRFWCAgICAgICAgICAJCTB4ZTIKKworI2RlZmluZQlESU5ERVggICAgICAgICAgCQkweGU0CisKKyNkZWZpbmUJQlJLQUREUjEgICAgICAgIAkJMHhlNgorI2RlZmluZQkJQlJLRElTICAgICAgICAgIAkweDgwCisKKyNkZWZpbmUJQlJLQUREUjAgICAgICAgIAkJMHhlNgorCisjZGVmaW5lCUFMTE9ORVMgICAgICAgICAJCTB4ZTgKKworI2RlZmluZQlBTExaRVJPUyAgICAgICAgCQkweGVhCisKKyNkZWZpbmUJTk9ORSAgICAgICAgICAgIAkJMHhlYQorCisjZGVmaW5lCVNJTkRJUiAgICAgICAgICAJCTB4ZWMKKworI2RlZmluZQlESU5ESVIgICAgICAgICAgCQkweGVkCisKKyNkZWZpbmUJRlVOQ1RJT04xICAgICAgIAkJMHhmMAorCisjZGVmaW5lCVNUQUNLICAgICAgICAgICAJCTB4ZjIKKworI2RlZmluZQlDVVJBRERSICAgICAgICAgCQkweGY0CisKKyNkZWZpbmUJSU5UVkVDMV9BRERSICAgIAkJMHhmNAorCisjZGVmaW5lCUlOVFZFQzJfQUREUiAgICAJCTB4ZjYKKworI2RlZmluZQlMQVNUQUREUiAgICAgICAgCQkweGY2CisKKyNkZWZpbmUJTE9OR0pNUF9BRERSICAgIAkJMHhmOAorCisjZGVmaW5lCUFDQ1VNX1NBVkUgICAgICAJCTB4ZmEKKworI2RlZmluZQlXQUlUSU5HX1NDQl9UQUlMUwkJMHgxMDAKKworI2RlZmluZQlBSERfUENJX0NPTkZJR19CQVNFCQkweDEwMAorCisjZGVmaW5lCVNSQU1fQkFTRSAgICAgICAJCTB4MTAwCisKKyNkZWZpbmUJV0FJVElOR19USURfSEVBRAkJMHgxMjAKKworI2RlZmluZQlXQUlUSU5HX1RJRF9UQUlMCQkweDEyMgorCisjZGVmaW5lCU5FWFRfUVVFVUVEX1NDQl9BRERSCQkweDEyNAorCisjZGVmaW5lCUNPTVBMRVRFX1NDQl9IRUFECQkweDEyOAorCisjZGVmaW5lCUNPTVBMRVRFX1NDQl9ETUFJTlBST0dfSEVBRAkJMHgxMmEKKworI2RlZmluZQlDT01QTEVURV9ETUFfU0NCX0hFQUQJCTB4MTJjCisKKyNkZWZpbmUJUUZSRUVaRV9DT1VOVCAgIAkJMHgxMmUKKworI2RlZmluZQlTQVZFRF9NT0RFICAgICAgCQkweDEzMAorCisjZGVmaW5lCU1TR19PVVQgICAgICAgICAJCTB4MTMxCisKKyNkZWZpbmUJRE1BUEFSQU1TICAgICAgIAkJMHgxMzIKKyNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAorI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNETUFFTiAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU0RNQUVOQUNLICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE1BRU5BQ0sgICAgICAgCTB4MDgKKyNkZWZpbmUJCUhETUFFTiAgICAgICAgICAJMHgwOAorI2RlZmluZQkJRElSRUNUSU9OICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRkxVU0ggICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9SRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUV9GTEFHUyAgICAgICAJCTB4MTMzCisjZGVmaW5lCQlOT1RfSURFTlRJRklFRCAgCTB4ODAKKyNkZWZpbmUJCU5PX0NEQl9TRU5UICAgICAJMHg0MAorI2RlZmluZQkJVEFSR0VUX0NNRF9JU19UQUdHRUQJMHg0MAorI2RlZmluZQkJRFBIQVNFICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlUQVJHX0NNRF9QRU5ESU5HCTB4MTAKKyNkZWZpbmUJCUNNRFBIQVNFX1BFTkRJTkcJMHgwOAorI2RlZmluZQkJRFBIQVNFX1BFTkRJTkcgIAkweDA0CisjZGVmaW5lCQlTUEhBU0VfUEVORElORyAgCTB4MDIKKyNkZWZpbmUJCU5PX0RJU0NPTk5FQ1QgICAJMHgwMQorCisjZGVmaW5lCVNBVkVEX1NDU0lJRCAgICAJCTB4MTM0CisKKyNkZWZpbmUJU0FWRURfTFVOICAgICAgIAkJMHgxMzUKKworI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDEzNgorI2RlZmluZQkJUEhBU0VfTUFTSyAgICAgIAkweGUwCisjZGVmaW5lCQlDREkgICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUlPSSAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHSSAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlQX0JVU0ZSRUUgICAgICAgCTB4MDEKKyNkZWZpbmUJCVBfTUVTR0lOICAgICAgICAJMHhlMAorI2RlZmluZQkJUF9TVEFUVVMgICAgICAgIAkweGMwCisjZGVmaW5lCQlQX01FU0dPVVQgICAgICAgCTB4YTAKKyNkZWZpbmUJCVBfQ09NTUFORCAgICAgICAJMHg4MAorI2RlZmluZQkJUF9EQVRBSU5fRFQgICAgIAkweDYwCisjZGVmaW5lCQlQX0RBVEFJTiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBfREFUQU9VVF9EVCAgICAJMHgyMAorI2RlZmluZQkJUF9EQVRBT1VUICAgICAgIAkweDAwCisKKyNkZWZpbmUJUU9VVEZJRk9fRU5UUllfVkFMSURfVEFHCQkweDEzNworCisjZGVmaW5lCVNIQVJFRF9EQVRBX0FERFIJCTB4MTM4CisKKyNkZWZpbmUJUU9VVEZJRk9fTkVYVF9BRERSCQkweDEzYworCisjZGVmaW5lCUtFUk5FTF9UUUlOUE9TICAJCTB4MTQwCisKKyNkZWZpbmUJVFFJTlBPUyAgICAgICAgIAkJMHgxNDEKKworI2RlZmluZQlBUkdfMSAgICAgICAgICAgCQkweDE0MgorI2RlZmluZQlSRVRVUk5fMSAgICAgICAgCQkweDE0MgorI2RlZmluZQkJU0VORF9NU0cgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRU5EX1NFTlNFICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTkRfUkVKICAgICAgICAJMHgyMAorI2RlZmluZQkJTVNHT1VUX1BIQVNFTUlTIAkweDEwCisjZGVmaW5lCQlFWElUX01TR19MT09QICAgCTB4MDgKKyNkZWZpbmUJCUNPTlRfTVNHX0xPT1BfV1JJVEUJMHgwNAorI2RlZmluZQkJQ09OVF9NU0dfTE9PUF9SRUFECTB4MDMKKyNkZWZpbmUJCUNPTlRfTVNHX0xPT1BfVEFSRwkweDAyCisKKyNkZWZpbmUJQVJHXzIgICAgICAgICAgIAkJMHgxNDMKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHgxNDMKKworI2RlZmluZQlMQVNUX01TRyAgICAgICAgCQkweDE0NAorCisjZGVmaW5lCVNDU0lTRVFfVEVNUExBVEUJCTB4MTQ1CisjZGVmaW5lCQlNQU5VQUxDVEwgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU0VMSSAgICAgICAgICAJMHgyMAorI2RlZmluZQkJRU5SU0VMSSAgICAgICAgIAkweDEwCisjZGVmaW5lCQlNQU5VQUxQICAgICAgICAgCTB4MGMKKyNkZWZpbmUJCUVOQVVUT0FUTlAgICAgICAJMHgwMgorI2RlZmluZQkJQUxUU1RJTSAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJSU5JVElBVE9SX1RBRyAgIAkJMHgxNDYKKworI2RlZmluZQlTRVFfRkxBR1MyICAgICAgCQkweDE0NworI2RlZmluZQkJU0VMRUNUT1VUX1FGUk9aRU4JMHgwNAorI2RlZmluZQkJVEFSR0VUX01TR19QRU5ESU5HCTB4MDIKKworI2RlZmluZQlBTExPQ0ZJRk9fU0NCUFRSCQkweDE0OAorCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX1RJTUVSCQkweDE0YQorCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX01BWENNRFMJCTB4MTRjCisKKyNkZWZpbmUJSU5UX0NPQUxFU0NJTkdfTUlOQ01EUwkJMHgxNGQKKworI2RlZmluZQlDTURTX1BFTkRJTkcgICAgCQkweDE0ZQorCisjZGVmaW5lCUlOVF9DT0FMRVNDSU5HX0NNRENPVU5UCQkweDE1MAorCisjZGVmaW5lCUxPQ0FMX0hTX01BSUxCT1gJCTB4MTUxCisKKyNkZWZpbmUJQ01EU0laRV9UQUJMRSAgIAkJMHgxNTIKKworI2RlZmluZQlTQ0JfQkFTRSAgICAgICAgCQkweDE4MAorCisjZGVmaW5lCVNDQl9SRVNJRFVBTF9EQVRBQ05UCQkweDE4MAorI2RlZmluZQlTQ0JfQ0RCX1NUT1JFICAgCQkweDE4MAorI2RlZmluZQlTQ0JfSE9TVF9DREJfUFRSCQkweDE4MAorCisjZGVmaW5lCVNDQl9SRVNJRFVBTF9TR1BUUgkJMHgxODQKKyNkZWZpbmUJCVNHX0FERFJfTUFTSyAgICAJMHhmOAorI2RlZmluZQkJU0dfT1ZFUlJVTl9SRVNJRAkweDAyCisKKyNkZWZpbmUJU0NCX1NDU0lfU1RBVFVTIAkJMHgxODgKKyNkZWZpbmUJU0NCX0hPU1RfQ0RCX0xFTgkJMHgxODgKKworI2RlZmluZQlTQ0JfVEFSR0VUX1BIQVNFUwkJMHgxODkKKworI2RlZmluZQlTQ0JfVEFSR0VUX0RBVEFfRElSCQkweDE4YQorCisjZGVmaW5lCVNDQl9UQVJHRVRfSVRBRyAJCTB4MThiCisKKyNkZWZpbmUJU0NCX1NFTlNFX0JVU0FERFIJCTB4MThjCisjZGVmaW5lCVNDQl9ORVhUX0NPTVBMRVRFCQkweDE4YworCisjZGVmaW5lCVNDQl9UQUcgICAgICAgICAJCTB4MTkwCisjZGVmaW5lCVNDQl9GSUZPX1VTRV9DT1VOVAkJMHgxOTAKKworI2RlZmluZQlTQ0JfQ09OVFJPTCAgICAgCQkweDE5MgorI2RlZmluZQkJVEFSR0VUX1NDQiAgICAgIAkweDgwCisjZGVmaW5lCQlESVNDRU5CICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVRBR19FTkIgICAgICAgICAJMHgyMAorI2RlZmluZQkJTUtfTUVTU0FHRSAgICAgIAkweDEwCisjZGVmaW5lCQlTVEFUVVNfUkNWRCAgICAgCTB4MDgKKyNkZWZpbmUJCURJU0NPTk5FQ1RFRCAgICAJMHgwNAorI2RlZmluZQkJU0NCX1RBR19UWVBFICAgIAkweDAzCisKKyNkZWZpbmUJU0NCX1NDU0lJRCAgICAgIAkJMHgxOTMKKyNkZWZpbmUJCVRJRCAgICAgICAgICAgICAJMHhmMAorI2RlZmluZQkJT0lEICAgICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0NCX0xVTiAgICAgICAgIAkJMHgxOTQKKyNkZWZpbmUJCUxJRCAgICAgICAgICAgICAJMHhmZgorCisjZGVmaW5lCVNDQl9UQVNLX0FUVFJJQlVURQkJMHgxOTUKKyNkZWZpbmUJCVNDQl9YRkVSTEVOX09ERCAJMHgwMQorCisjZGVmaW5lCVNDQl9DREJfTEVOICAgICAJCTB4MTk2CisjZGVmaW5lCQlTQ0JfQ0RCX0xFTl9QVFIgCTB4ODAKKworI2RlZmluZQlTQ0JfVEFTS19NQU5BR0VNRU5UCQkweDE5NworCisjZGVmaW5lCVNDQl9EQVRBUFRSICAgICAJCTB4MTk4CisKKyNkZWZpbmUJU0NCX0RBVEFDTlQgICAgIAkJMHgxYTAKKyNkZWZpbmUJCVNHX0xBU1RfU0VHICAgICAJMHg4MAorI2RlZmluZQkJU0dfSElHSF9BRERSX0JJVFMJMHg3ZgorCisjZGVmaW5lCVNDQl9TR1BUUiAgICAgICAJCTB4MWE0CisjZGVmaW5lCQlTR19TVEFUVVNfVkFMSUQgCTB4MDQKKyNkZWZpbmUJCVNHX0ZVTExfUkVTSUQgICAJMHgwMgorI2RlZmluZQkJU0dfTElTVF9OVUxMICAgIAkweDAxCisKKyNkZWZpbmUJU0NCX0JVU0FERFIgICAgIAkJMHgxYTgKKworI2RlZmluZQlTQ0JfTkVYVCAgICAgICAgCQkweDFhYworI2RlZmluZQlTQ0JfTkVYVF9TQ0JfQlVTQUREUgkJMHgxYWMKKworI2RlZmluZQlTQ0JfTkVYVDIgICAgICAgCQkweDFhZQorCisjZGVmaW5lCVNDQl9TUEFSRSAgICAgICAJCTB4MWIwCisjZGVmaW5lCVNDQl9QS1RfTFVOICAgICAJCTB4MWIwCisKKyNkZWZpbmUJU0NCX0RJU0NPTk5FQ1RFRF9MSVNUUwkJMHgxYjgKKworCisjZGVmaW5lCUFIRF9USU1FUl9VU19QRVJfVElDSwkweDE5CisjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFX0ZVTExfTFVOCTB4MzgKKyNkZWZpbmUJU1RBVFVTX1FVRVVFX0ZVTEwJMHgyOAorI2RlZmluZQlTVEFUVVNfQlVTWQkweDA4CisjZGVmaW5lCU1BWF9PRkZTRVRfTk9OX1BBQ0VECTB4N2YKKyNkZWZpbmUJTUFYX09GRlNFVF9QQUNFRAkweGZlCisjZGVmaW5lCUJVU18zMl9CSVQJMHgwMgorI2RlZmluZQlDQ1NHQUREUl9NQVgJMHg4MAorI2RlZmluZQlUSURfU0hJRlQJMHgwNAorI2RlZmluZQlNS19NRVNTQUdFX0JJVF9PRkZTRVQJMHgwNAorI2RlZmluZQlXUlRCSUFTQ1RMX0hQX0RFRkFVTFQJMHgwMAorI2RlZmluZQlTRUVPUF9FV0RTX0FERFIJMHgwMAorI2RlZmluZQlBSERfQU1QTElUVURFX1NISUZUCTB4MDAKKyNkZWZpbmUJQUhEX0FNUExJVFVERV9NQVNLCTB4MDcKKyNkZWZpbmUJQUhEX0FOTkVYQ09MX0FNUExJVFVERQkweDA2CisjZGVmaW5lCUFIRF9TTEVXUkFURV9ERUZfUkVWQQkweDA4CisjZGVmaW5lCUFIRF9TTEVXUkFURV9TSElGVAkweDAzCisjZGVmaW5lCUFIRF9TTEVXUkFURV9NQVNLCTB4NzgKKyNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18yOQkweDA2CisjZGVmaW5lCUFIRF9OVU1fUEVSX0RFVl9BTk5FWENPTFMJMHgwNAorI2RlZmluZQlCX0NVUlJGSUZPXzAJMHgwMgorI2RlZmluZQlMVU5MRU5fU0lOR0xFX0xFVkVMX0xVTgkweDBmCisjZGVmaW5lCU5WUkFNX1NDQl9PRkZTRVQJMHgyYworI2RlZmluZQlBSERfVElNRVJfTUFYX1VTCTB4MThmZmU3CisjZGVmaW5lCUFIRF9USU1FUl9NQVhfVElDS1MJMHhmZmZmCisjZGVmaW5lCVNUQVRVU19QS1RfU0VOU0UJMHhmZgorI2RlZmluZQlDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1CisjZGVmaW5lCUFIRF9TRU5TRV9CVUZTSVpFCTB4MTAwCisjZGVmaW5lCU1BWF9PRkZTRVRfUEFDRURfQlVHCTB4N2YKKyNkZWZpbmUJQlVTXzhfQklUCTB4MDAKKyNkZWZpbmUJU1RJTUVTRUxfQlVHX0FESgkweDA4CisjZGVmaW5lCVNUSU1FU0VMX01JTgkweDE4CisjZGVmaW5lCVNUSU1FU0VMX1NISUZUCTB4MDMKKyNkZWZpbmUJQ0NTR1JBTV9NQVhTRUdTCTB4MTAKKyNkZWZpbmUJSU5WQUxJRF9BRERSCTB4ODAKKyNkZWZpbmUJVEFSR0VUX0NNRF9DTVBMVAkweGZlCisjZGVmaW5lCVNFRU9QX1dSQUxfQUREUgkweDQwCisjZGVmaW5lCVNFRU9QX0VSQUxfQUREUgkweDgwCisjZGVmaW5lCUFIRF9BTVBMSVRVREVfREVGCTB4MDcKKyNkZWZpbmUJQUhEX1NMRVdSQVRFX0RFRl9SRVZCCTB4MDgKKyNkZWZpbmUJQUhEX1BSRUNPTVBfQ1VUQkFDS18zNwkweDA3CisjZGVmaW5lCUFIRF9QUkVDT01QX0NVVEJBQ0tfMTcJMHgwNAorI2RlZmluZQlBSERfUFJFQ09NUF9TSElGVAkweDAwCisjZGVmaW5lCUFIRF9QUkVDT01QX01BU0sJMHgwNworI2RlZmluZQlBSERfQU5ORVhDT0xfUFJFQ09NUF9TTEVXCTB4MDQKKyNkZWZpbmUJU1JDX01PREVfU0hJRlQJMHgwMAorI2RlZmluZQlQS1RfT1ZFUlJVTl9CVUZTSVpFCTB4MjAwCisjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFXzFCWVRFX0xVTgkweDMwCisjZGVmaW5lCVRBUkdFVF9EQVRBX0lOCTB4MDEKKyNkZWZpbmUJSE9TVF9NU0cJMHhmZgorI2RlZmluZQlNQVhfT0ZGU0VUCTB4ZmUKKyNkZWZpbmUJQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lCUNDU0NCQUREUl9NQVgJMHg4MAorI2RlZmluZQlOVU1EU1BTIAkweDE0CisjZGVmaW5lCVNFRU9QX0VXRU5fQUREUgkweGMwCisjZGVmaW5lCUFIRF9BTk5FWENPTF9QRVJfREVWMAkweDA0CisjZGVmaW5lCURTVF9NT0RFX1NISUZUCTB4MDQKKworCisvKiBEb3dubG9hZGVkIENvbnN0YW50IERlZmluaXRpb25zICovCisjZGVmaW5lCVNDQl9UUkFOU0ZFUl9TSVpFCTB4MDYKKyNkZWZpbmUJUEtUX09WRVJSVU5fQlVGT0ZGU0VUCTB4MDUKKyNkZWZpbmUJU0dfU0laRU9GCTB4MDQKKyNkZWZpbmUJU0dfUFJFRkVUQ0hfQUREUl9NQVNLCTB4MDMKKyNkZWZpbmUJU0dfUFJFRkVUQ0hfQUxJR05fTUFTSwkweDAyCisjZGVmaW5lCVNHX1BSRUZFVENIX0NOVF9MSU1JVAkweDAxCisjZGVmaW5lCVNHX1BSRUZFVENIX0NOVAkweDAwCisjZGVmaW5lCURPV05MT0FEX0NPTlNUX0NPVU5UCTB4MDcKKworCisvKiBFeHBvcnRlZCBMYWJlbHMgKi8KKyNkZWZpbmUJTEFCRUxfc2VxX2lzciAJMHgyNjkKKyNkZWZpbmUJTEFCRUxfdGltZXJfaXNyCTB4MjY1CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZ19wcmludC5jX3NoaXBwZWQgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3JlZ19wcmludC5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5OGE3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcmVnX3ByaW50LmNfc2hpcHBlZApAQCAtMCwwICsxLDM2MzUgQEAKKy8qCisgKiBETyBOT1QgRURJVCAtIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljNzl4eC5zZXEjOTQgJAorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnJlZyM3MCAkCisgKi8KKworI2luY2x1ZGUgImFpYzc5eHhfb3NtLmgiCisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTU9ERV9QVFJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTUkNfTU9ERSIsCQkweDA3LCAweDA3IH0sCisJeyAiRFNUX01PREUiLAkJMHg3MCwgMHg3MCB9Cit9OworCitpbnQKK2FoZF9tb2RlX3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTU9ERV9QVFJfcGFyc2VfdGFibGUsIDIsICJNT0RFX1BUUiIsCisJICAgIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgSU5UU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIlNQTFRJTlQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNNRENNUExUIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRVFJTlQiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNDU0lJTlQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlBDSUlOVCIsCQkweDEwLCAweDEwIH0sCisJeyAiU1dUTUlOVCIsCQkweDIwLCAweDIwIH0sCisJeyAiQlJLQURSSU5UIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJIV0VSUklOVCIsCQkweDgwLCAweDgwIH0sCisJeyAiSU5UX1BFTkQiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9pbnRzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihJTlRTVEFUX3BhcnNlX3RhYmxlLCA5LCAiSU5UU1RBVCIsCisJICAgIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRSU5UQ09ERV9wYXJzZV90YWJsZVtdID0geworCXsgIk5PX1NFUUlOVCIsCQkweDAwLCAweGZmIH0sCisJeyAiQkFEX1BIQVNFIiwJCTB4MDEsIDB4ZmYgfSwKKwl7ICJTRU5EX1JFSkVDVCIsCTB4MDIsIDB4ZmYgfSwKKwl7ICJQUk9UT19WSU9MQVRJT04iLAkweDAzLCAweGZmIH0sCisJeyAiTk9fTUFUQ0giLAkJMHgwNCwgMHhmZiB9LAorCXsgIklHTl9XSURFX1JFUyIsCTB4MDUsIDB4ZmYgfSwKKwl7ICJQREFUQV9SRUlOSVQiLAkweDA2LCAweGZmIH0sCisJeyAiSE9TVF9NU0dfTE9PUCIsCTB4MDcsIDB4ZmYgfSwKKwl7ICJCQURfU1RBVFVTIiwJCTB4MDgsIDB4ZmYgfSwKKwl7ICJEQVRBX09WRVJSVU4iLAkweDA5LCAweGZmIH0sCisJeyAiTUtNU0dfRkFJTEVEIiwJMHgwYSwgMHhmZiB9LAorCXsgIk1JU1NFRF9CVVNGUkVFIiwJMHgwYiwgMHhmZiB9LAorCXsgIkRVTVBfQ0FSRF9TVEFURSIsCTB4MGMsIDB4ZmYgfSwKKwl7ICJJTExFR0FMX1BIQVNFIiwJMHgwZCwgMHhmZiB9LAorCXsgIklOVkFMSURfU0VRSU5UIiwJMHgwZSwgMHhmZiB9LAorCXsgIkNGRzRJU1RBVF9JTlRSIiwJMHgwZiwgMHhmZiB9LAorCXsgIlNUQVRVU19PVkVSUlVOIiwJMHgxMCwgMHhmZiB9LAorCXsgIkNGRzRPVkVSUlVOIiwJMHgxMSwgMHhmZiB9LAorCXsgIkVOVEVSSU5HX05PTlBBQ0siLAkweDEyLCAweGZmIH0sCisJeyAiVEFTS01HTVRfRlVOQ19DT01QTEVURSIsMHgxMywgMHhmZiB9LAorCXsgIlRBU0tNR01UX0NNRF9DTVBMVF9PS0FZIiwweDE0LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDAiLAkweDE1LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDEiLAkweDE2LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDIiLAkweDE3LCAweGZmIH0sCisJeyAiVFJBQ0VQT0lOVDMiLAkweDE4LCAweGZmIH0sCisJeyAiU0FXX0hXRVJSIiwJCTB4MTksIDB4ZmYgfSwKKwl7ICJCQURfU0NCX1NUQVRVUyIsCTB4MWEsIDB4ZmYgfQorfTsKKworaW50CithaGRfc2VxaW50Y29kZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRSU5UQ09ERV9wYXJzZV90YWJsZSwgMjcsICJTRVFJTlRDT0RFIiwKKwkgICAgMHgwMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJJTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTUExUSU5UIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJDTURJTlQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNMUlNFUUlOVCIsCQkweDA0LCAweDA0IH0sCisJeyAiQ0xSU0NTSUlOVCIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0xSUENJSU5UIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJTV1RNSU5UIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJCUktBRFJJTlQiLAkweDQwLCAweDQwIH0sCisJeyAiQ0xSSFdFUlJJTlQiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NscmludF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSSU5UX3BhcnNlX3RhYmxlLCA4LCAiQ0xSSU5UIiwKKwkgICAgMHgwMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBFUlJPUl9wYXJzZV90YWJsZVtdID0geworCXsgIkRTQ1RNT1VUIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJJTExPUENPREUiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNRUEFSRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJEUEFSRVJSIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJNUEFSRVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDSU9BQ0NFU0ZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiQ0lPUEFSRVJSIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfZXJyb3JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKEVSUk9SX3BhcnNlX3RhYmxlLCA3LCAiRVJST1IiLAorCSAgICAweDA0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUkVSUl9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkRTQ1RNT1VUIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUklMTE9QQ09ERSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJTUVBBUkVSUiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJEUEFSRVJSIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJNUEFSRVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJDSU9BQ0NFU0ZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiQ0xSQ0lPUEFSRVJSIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9jbHJlcnJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUkVSUl9wYXJzZV90YWJsZSwgNywgIkNMUkVSUiIsCisJICAgIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgSENOVFJMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0hJUFJTVCIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0hJUFJTVEFDSyIsCQkweDAxLCAweDAxIH0sCisJeyAiSU5URU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlBBVVNFIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTV1RJTUVSX1NUQVJUX0IiLAkweDA4LCAweDA4IH0sCisJeyAiU1dJTlQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBPV1JETiIsCQkweDQwLCAweDQwIH0sCisJeyAiU0VRX1JFU0VUIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfaGNudHJsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihIQ05UUkxfcGFyc2VfdGFibGUsIDgsICJIQ05UUkwiLAorCSAgICAweDA1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9obnNjYl9xb2ZmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE5TQ0JfUU9GRiIsCisJICAgIDB4MDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2hlc2NiX3FvZmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIRVNDQl9RT0ZGIiwKKwkgICAgMHgwOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBIU19NQUlMQk9YX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5JTlRfQ09BTEVTQ0UiLAkweDQwLCAweDQwIH0sCisJeyAiSE9TVF9UUUlOUE9TIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9oc19tYWlsYm94X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihIU19NQUlMQk9YX3BhcnNlX3RhYmxlLCAyLCAiSFNfTUFJTEJPWCIsCisJICAgIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0VRSU5UU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUlNFUV9TUExUSU5UIiwJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlNFUV9QQ0lJTlQiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0VRX1NDU0lJTlQiLAkweDA0LCAweDA0IH0sCisJeyAiQ0xSU0VRX1NFUUlOVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJTRVFfU1dUTVJUTyIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfY2xyc2VxaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0VRSU5UU1RBVF9wYXJzZV90YWJsZSwgNSwgIkNMUlNFUUlOVFNUQVQiLAorCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUlOVFNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRVFfU1BMVElOVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJTRVFfUENJSU5UIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRVFfU0NTSUlOVCIsCTB4MDQsIDB4MDQgfSwKKwl7ICJTRVFfU0VRSU5UIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRVFfU1dUTVJUTyIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfc2VxaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRSU5UU1RBVF9wYXJzZV90YWJsZSwgNSwgIlNFUUlOVFNUQVQiLAorCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zd3RpbWVyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1dUSU1FUiIsCisJICAgIDB4MGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Nuc2NiX3FvZmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTTlNDQl9RT0ZGIiwKKwkgICAgMHgxMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2VzY2JfcW9mZl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFU0NCX1FPRkYiLAorCSAgICAweDEyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZHNjYl9xb2ZmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0RTQ0JfUU9GRiIsCisJICAgIDB4MTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUU9GRl9DVExTVEFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTQ0JfUVNJWkVfNCIsCTB4MDAsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfOCIsCTB4MDEsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTYiLAkweDAyLCAweDBmIH0sCisJeyAiU0NCX1FTSVpFXzMyIiwJMHgwMywgMHgwZiB9LAorCXsgIlNDQl9RU0laRV82NCIsCTB4MDQsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTI4IiwJMHgwNSwgMHgwZiB9LAorCXsgIlNDQl9RU0laRV8yNTYiLAkweDA2LCAweDBmIH0sCisJeyAiU0NCX1FTSVpFXzUxMiIsCTB4MDcsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTAyNCIsCTB4MDgsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMjA0OCIsCTB4MDksIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfNDA5NiIsCTB4MGEsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfODE5MiIsCTB4MGIsIDB4MGYgfSwKKwl7ICJTQ0JfUVNJWkVfMTYzODQiLAkweDBjLCAweDBmIH0sCisJeyAiU0NCX1FTSVpFIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJIU19NQUlMQk9YX0FDVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTRFNDQl9ST0xMT1ZSIiwJMHgyMCwgMHgyMCB9LAorCXsgIk5FV19TQ0JfQVZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiRU1QVFlfU0NCX0FWQUlMIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9xb2ZmX2N0bHN0YV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUU9GRl9DVExTVEFfcGFyc2VfdGFibGUsIDE4LCAiUU9GRl9DVExTVEEiLAorCSAgICAweDE2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IElOVENUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNQTFRJTlRFTiIsCQkweDAxLCAweDAxIH0sCisJeyAiU0VRSU5URU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDU0lJTlRFTiIsCQkweDA0LCAweDA0IH0sCisJeyAiUENJSU5URU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkFVVE9DTFJDTURJTlQiLAkweDEwLCAweDEwIH0sCisJeyAiU1dUSU1FUl9TVEFSVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJTV1RNSU5URU4iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNXVE1JTlRNQVNLIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9pbnRjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKElOVENUTF9wYXJzZV90YWJsZSwgOCwgIklOVENUTCIsCisJICAgIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgREZDTlRSTF9wYXJzZV90YWJsZVtdID0geworCXsgIkRJUkVDVElPTkVOIiwJMHgwMSwgMHgwMSB9LAorCXsgIkZJRk9GTFVTSCIsCQkweDAyLCAweDAyIH0sCisJeyAiRklGT0ZMVVNIQUNLIiwJMHgwMiwgMHgwMiB9LAorCXsgIkRJUkVDVElPTiIsCQkweDA0LCAweDA0IH0sCisJeyAiRElSRUNUSU9OQUNLIiwJMHgwNCwgMHgwNCB9LAorCXsgIkhETUFFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiSERNQUVOQUNLIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTQ1NJRU4iLAkJMHgyMCwgMHgyMCB9LAorCXsgIlNDU0lFTkFDSyIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NTSUVOV1JESVMiLAkweDQwLCAweDQwIH0sCisJeyAiUFJFTE9BREVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfZGZjbnRybF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoREZDTlRSTF9wYXJzZV90YWJsZSwgMTEsICJERkNOVFJMIiwKKwkgICAgMHgxOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU0NPTU1BTkQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0lPUEFSQ0tFTiIsCQkweDAxLCAweDAxIH0sCisJeyAiRElTQUJMRV9UV0FURSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJFWFRSRVFMQ0siLAkJMHgxMCwgMHgxMCB9LAorCXsgIk1QQVJDS0VOIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJEUEFSQ0tFTiIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0FDSEVUSEVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfZHNjb21tYW5kMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNDT01NQU5EMF9wYXJzZV90YWJsZSwgNiwgIkRTQ09NTUFORDAiLAorCSAgICAweDE5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGU1RBVFVTX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRklGT0VNUCIsCQkweDAxLCAweDAxIH0sCisJeyAiRklGT0ZVTEwiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkRGVEhSRVNIIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJIRE9ORSIsCQkweDA4LCAweDA4IH0sCisJeyAiTVJFUVBFTkQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBLVF9QUkVMT0FEX0FWQUlMIiwJMHg0MCwgMHg0MCB9LAorCXsgIlBSRUxPQURfQVZBSUwiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2Rmc3RhdHVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihERlNUQVRVU19wYXJzZV90YWJsZSwgNywgIkRGU1RBVFVTIiwKKwkgICAgMHgxYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR19DQUNIRV9TSEFET1dfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMQVNUX1NFR19ET05FIiwJMHgwMSwgMHgwMSB9LAorCXsgIkxBU1RfU0VHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJPRERfU0VHIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTR19BRERSX01BU0siLAkweGY4LCAweGY4IH0KK307CisKK2ludAorYWhkX3NnX2NhY2hlX3NoYWRvd19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dfQ0FDSEVfU0hBRE9XX3BhcnNlX3RhYmxlLCA0LCAiU0dfQ0FDSEVfU0hBRE9XIiwKKwkgICAgMHgxYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBBUkJDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJVU0VfVElNRSIsCQkweDA3LCAweDA3IH0sCisJeyAiUkVUUllfU1dFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiUkVTRVRfSEFSQiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2FyYmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQVJCQ1RMX3BhcnNlX3RhYmxlLCAzLCAiQVJCQ1RMIiwKKwkgICAgMHgxYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR19DQUNIRV9QUkVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMQVNUX1NFRyIsCQkweDAyLCAweDAyIH0sCisJeyAiT0REX1NFRyIsCQkweDA0LCAweDA0IH0sCisJeyAiU0dfQUREUl9NQVNLIiwJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoZF9zZ19jYWNoZV9wcmVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHX0NBQ0hFX1BSRV9wYXJzZV90YWJsZSwgMywgIlNHX0NBQ0hFX1BSRSIsCisJICAgIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxaW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUUlOIiwKKwkgICAgMHgyMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfdHlwZXB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRZUEVQVFIiLAorCSAgICAweDIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF90YWdwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQUdQVFIiLAorCSAgICAweDIxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9sdW5wdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMVU5QVFIiLAorCSAgICAweDIyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kYXRhbGVucHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREFUQUxFTlBUUiIsCisJICAgIDB4MjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3N0YXRsZW5wdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFUTEVOUFRSIiwKKwkgICAgMHgyNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY21kbGVucHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01ETEVOUFRSIiwKKwkgICAgMHgyNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYXR0cnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFUVFJQVFIiLAorCSAgICAweDI2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9mbGFncHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRkxBR1BUUiIsCisJICAgIDB4MjcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NtZHB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFBUUiIsCisJICAgIDB4MjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3FuZXh0cHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU5FWFRQVFIiLAorCSAgICAweDI5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pZHB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklEUFRSIiwKKwkgICAgMHgyYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWJydGJ5dGVwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQlJUQllURVBUUiIsCisJICAgIDB4MmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FicnRiaXRwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQlJUQklUUFRSIiwKKwkgICAgMHgyYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbWF4Y21kYnl0ZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNQVhDTURCWVRFUyIsCisJICAgIDB4MmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX21heGNtZDJyY3ZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNQVhDTUQyUkNWIiwKKwkgICAgMHgyZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hvcnR0aHJlc2hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSE9SVFRIUkVTSCIsCisJICAgIDB4MmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFVOTEVOX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiSUxVTkxFTiIsCQkweDBmLCAweDBmIH0sCisJeyAiVExVTkxFTiIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhkX2x1bmxlbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFVOTEVOX3BhcnNlX3RhYmxlLCAyLCAiTFVOTEVOIiwKKwkgICAgMHgzMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY2RibGltaXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDREJMSU1JVCIsCisJICAgIDB4MzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX21heGNtZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRCIsCisJICAgIDB4MzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX21heGNtZGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1BWENNRENOVCIsCisJICAgIDB4MzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxcnN2ZDAxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFSU1ZEMDEiLAorCSAgICAweDM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9scXJzdmQxNl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxRUlNWRDE2IiwKKwkgICAgMHgzNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbHFyc3ZkMTdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMUVJTVkQxNyIsCisJICAgIDB4MzYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NtZHJzdmQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EUlNWRDAiLAorCSAgICAweDM3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRQ1RMMF9wYXJzZV90YWJsZVtdID0geworCXsgIkxRMElOSVRHQ0xUIiwJMHgwMywgMHgwMyB9LAorCXsgIkxRMFRBUkdDTFQiLAkJMHgwYywgMHgwYyB9LAorCXsgIkxRSUlOSVRHQ0xUIiwJMHgzMCwgMHgzMCB9LAorCXsgIkxRSVRBUkdDTFQiLAkJMHhjMCwgMHhjMCB9Cit9OworCitpbnQKK2FoZF9scWN0bDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRQ1RMMF9wYXJzZV90YWJsZSwgNCwgIkxRQ1RMMCIsCisJICAgIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFDVEwxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQUJPUlRQRU5ESU5HIiwJMHgwMSwgMHgwMSB9LAorCXsgIlNJTkdMRUNNRCIsCQkweDAyLCAweDAyIH0sCisJeyAiUENJMlBDSSIsCQkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX2xxY3RsMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFDVEwxX3BhcnNlX3RhYmxlLCAzLCAiTFFDVEwxIiwKKwkgICAgMHgzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NCSVNUMF9wYXJzZV90YWJsZVtdID0geworCXsgIk9TQklTVFJVTiIsCQkweDAxLCAweDAxIH0sCisJeyAiT1NCSVNURE9ORSIsCQkweDAyLCAweDAyIH0sCisJeyAiT1NCSVNURVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJHU0JJU1RSVU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkdTQklTVERPTkUiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkdTQklTVEVSUiIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3Njc2Jpc3QwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NCSVNUMF9wYXJzZV90YWJsZSwgNiwgIlNDU0JJU1QwIiwKKwkgICAgMHgzOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUUNUTDJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMUU9QQVVTRSIsCQkweDAxLCAweDAxIH0sCisJeyAiTFFPVE9JRExFIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJMUU9DT05USU5VRSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJMUU9SRVRSWSIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFJUEFVU0UiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkxRSVRPSURMRSIsCQkweDIwLCAweDIwIH0sCisJeyAiTFFJQ09OVElOVUUiLAkweDQwLCAweDQwIH0sCisJeyAiTFFJUkVUUlkiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWN0bDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRQ1RMMl9wYXJzZV90YWJsZSwgOCwgIkxRQ1RMMiIsCisJICAgIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTQklTVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJOVEJJU1RSVU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIk5UQklTVERPTkUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIk5UQklTVEVSUiIsCQkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3Njc2Jpc3QxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NCSVNUMV9wYXJzZV90YWJsZSwgMywgIlNDU0JJU1QxIiwKKwkgICAgMHgzYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0VRMF9wYXJzZV90YWJsZVtdID0geworCXsgIlNDU0lSU1RPIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJGT1JDRUJVU0ZSRUUiLAkweDEwLCAweDEwIH0sCisJeyAiRU5BUkJPIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJFTlNFTE8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRFTU9ERU8iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY3Npc2VxMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NTSVNFUTBfcGFyc2VfdGFibGUsIDUsICJTQ1NJU0VRMCIsCisJICAgIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTSVNFUTFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBTFRTVElNIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkFVVE9BVE5QIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJNQU5VQUxQIiwJCTB4MGMsIDB4MGMgfSwKKwl7ICJFTlJTRUxJIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNFTEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIk1BTlVBTENUTCIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3Njc2lzZXExX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NJU0VRMV9wYXJzZV90YWJsZSwgNiwgIlNDU0lTRVExIiwKKwkgICAgMHgzYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTWEZSQ1RMMF9wYXJzZV90YWJsZVtdID0geworCXsgIlNQSU9FTiIsCQkweDA4LCAweDA4IH0sCisJeyAiQklPU0NBTkNFTEVOIiwJMHgxMCwgMHgxMCB9LAorCXsgIkRGUEVYUCIsCQkweDQwLCAweDQwIH0sCisJeyAiREZPTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3N4ZnJjdGwwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTWEZSQ1RMMF9wYXJzZV90YWJsZSwgNCwgIlNYRlJDVEwwIiwKKwkgICAgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYnVzaW5pdGlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTSU5JVElEIiwKKwkgICAgMHgzYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGxjb3VudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRMQ09VTlQiLAorCSAgICAweDNjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNYRlJDVEwxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU1RQV0VOIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJBQ1RORUdFTiIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5TVElNRVIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNUSU1FU0VMIiwJCTB4MTgsIDB4MTggfSwKKwl7ICJFTlNQQ0hLIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJFTlNBQ0hLIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJCSVRCVUNLRVQiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zeGZyY3RsMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU1hGUkNUTDFfcGFyc2VfdGFibGUsIDcsICJTWEZSQ1RMMSIsCisJICAgIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2J1c3RhcmdpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1RBUkdJRCIsCisJICAgIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBU1UiLAkJMHgwNywgMHgwNyB9LAorCXsgIkNNRERNQUVOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJBVVRPUlNURElTIiwJCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfc3hmcmN0bDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNYRlJDVEwyX3BhcnNlX3RhYmxlLCAzLCAiU1hGUkNUTDIiLAorCSAgICAweDNlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGRlNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDVVJSRklGT18wIiwJCTB4MDAsIDB4MDMgfSwKKwl7ICJDVVJSRklGT18xIiwJCTB4MDEsIDB4MDMgfSwKKwl7ICJDVVJSRklGT19OT05FIiwJMHgwMywgMHgwMyB9LAorCXsgIkZJRk8wRlJFRSIsCQkweDEwLCAweDEwIH0sCisJeyAiRklGTzFGUkVFIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDVVJSRklGTyIsCQkweDAzLCAweDAzIH0KK307CisKK2ludAorYWhkX2RmZnN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERGRlNUQVRfcGFyc2VfdGFibGUsIDYsICJERkZTVEFUIiwKKwkgICAgMHgzZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0lHT19wYXJzZV90YWJsZVtdID0geworCXsgIlBfREFUQU9VVCIsCQkweDAwLCAweGUwIH0sCisJeyAiUF9EQVRBT1VUX0RUIiwJMHgyMCwgMHhlMCB9LAorCXsgIlBfREFUQUlOIiwJCTB4NDAsIDB4ZTAgfSwKKwl7ICJQX0RBVEFJTl9EVCIsCTB4NjAsIDB4ZTAgfSwKKwl7ICJQX0NPTU1BTkQiLAkJMHg4MCwgMHhlMCB9LAorCXsgIlBfTUVTR09VVCIsCQkweGEwLCAweGUwIH0sCisJeyAiUF9TVEFUVVMiLAkJMHhjMCwgMHhlMCB9LAorCXsgIlBfTUVTR0lOIiwJCTB4ZTAsIDB4ZTAgfSwKKwl7ICJBQ0tPIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSRVFPIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJCU1lPIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTRUxPIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJBVE5PIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJNU0dPIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJJT08iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNETyIsCQkweDgwLCAweDgwIH0sCisJeyAiUEhBU0VfTUFTSyIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhkX3Njc2lzaWdvX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NJU0lHT19wYXJzZV90YWJsZSwgMTcsICJTQ1NJU0lHTyIsCisJICAgIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX211bHRhcmdpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1VTFRBUkdJRCIsCisJICAgIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTSVNJR0lfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHhlMCB9LAorCXsgIlBfREFUQU9VVF9EVCIsCTB4MjAsIDB4ZTAgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweGUwIH0sCisJeyAiUF9EQVRBSU5fRFQiLAkweDYwLCAweGUwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ZTAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhlMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0sCisJeyAiQUNLSSIsCQkweDAxLCAweDAxIH0sCisJeyAiUkVRSSIsCQkweDAyLCAweDAyIH0sCisJeyAiQlNZSSIsCQkweDA0LCAweDA0IH0sCisJeyAiU0VMSSIsCQkweDA4LCAweDA4IH0sCisJeyAiQVROSSIsCQkweDEwLCAweDEwIH0sCisJeyAiTVNHSSIsCQkweDIwLCAweDIwIH0sCisJeyAiSU9JIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDREkiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlBIQVNFX01BU0siLAkJMHhlMCwgMHhlMCB9Cit9OworCitpbnQKK2FoZF9zY3Npc2lnaV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NTSVNJR0lfcGFyc2VfdGFibGUsIDE3LCAiU0NTSVNJR0kiLAorCSAgICAweDQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lQSEFTRV9wYXJzZV90YWJsZVtdID0geworCXsgIkRBVEFfT1VUX1BIQVNFIiwJMHgwMSwgMHgwMyB9LAorCXsgIkRBVEFfSU5fUEhBU0UiLAkweDAyLCAweDAzIH0sCisJeyAiREFUQV9QSEFTRV9NQVNLIiwJMHgwMywgMHgwMyB9LAorCXsgIk1TR19PVVRfUEhBU0UiLAkweDA0LCAweDA0IH0sCisJeyAiTVNHX0lOX1BIQVNFIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNPTU1BTkRfUEhBU0UiLAkweDEwLCAweDEwIH0sCisJeyAiU1RBVFVTX1BIQVNFIiwJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoZF9zY3NpcGhhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDU0lQSEFTRV9wYXJzZV90YWJsZSwgNywgIlNDU0lQSEFTRSIsCisJICAgIDB4NDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Njc2lkYXQwX2ltZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lEQVQwX0lNRyIsCisJICAgIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Njc2lkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJREFUIiwKKwkgICAgMHg0NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2NzaWJ1c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lCVVMiLAorCSAgICAweDQ2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFRBUkdJRElOX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiVEFSR0lEIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJDTEtPVVQiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF90YXJnaWRpbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoVEFSR0lESU5fcGFyc2VfdGFibGUsIDIsICJUQVJHSURJTiIsCisJICAgIDB4NDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VMSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJPTkVCSVQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElEX01BU0siLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoZF9zZWxpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VMSURfcGFyc2VfdGFibGUsIDIsICJTRUxJRCIsCisJICAgIDB4NDksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0JMS0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFTFdJREUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQUIyMCIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5BQjQwIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJESUFHTEVET04iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRJQUdMRURFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NibGtjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNCTEtDVExfcGFyc2VfdGFibGUsIDUsICJTQkxLQ1RMIiwKKwkgICAgMHg0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPUFRJT05NT0RFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQVVUT19NU0dPVVRfREUiLAkweDAyLCAweDAyIH0sCisJeyAiRU5ER0ZPUk1DSEsiLAkweDA0LCAweDA0IH0sCisJeyAiQlVTRlJFRVJFViIsCQkweDEwLCAweDEwIH0sCisJeyAiQklBU0NBTkNUTCIsCQkweDIwLCAweDIwIH0sCisJeyAiQVVUT0FDS0VOIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJCSU9TQ0FOQ1RMIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJPUFRJT05NT0RFX0RFRkFVTFRTIiwweDAyLCAweDAyIH0KK307CisKK2ludAorYWhkX29wdGlvbm1vZGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9QVElPTk1PREVfcGFyc2VfdGFibGUsIDcsICJPUFRJT05NT0RFIiwKKwkgICAgMHg0YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBUkJETyIsCQkweDAxLCAweDAxIH0sCisJeyAiU1BJT1JEWSIsCQkweDAyLCAweDAyIH0sCisJeyAiT1ZFUlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiSU9FUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNFTERJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRUxETyIsCQkweDQwLCAweDQwIH0sCisJeyAiVEFSR0VUIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc3N0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDBfcGFyc2VfdGFibGUsIDgsICJTU1RBVDAiLAorCSAgICAweDRiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENMUlNJTlQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSQVJCRE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlNQSU9SRFkiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNMUk9WRVJSVU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNMUklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJTRUxJTkdPIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJTRUxESSIsCQkweDIwLCAweDIwIH0sCisJeyAiQ0xSU0VMRE8iLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9jbHJzaW50MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDBfcGFyc2VfdGFibGUsIDcsICJDTFJTSU5UMCIsCisJICAgIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOQVJCRE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOU1BJT1JEWSIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5PVkVSUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0VMREkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOU0VMRE8iLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zaW1vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTSU1PREUwX3BhcnNlX3RhYmxlLCA3LCAiU0lNT0RFMCIsCisJICAgIDB4NGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJSRVFJTklUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJTVFJCMkZBU1QiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0NTSVBFUlIiLAkweDA0LCAweDA0IH0sCisJeyAiQ0xSQlVTRlJFRSIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0xSU0NTSVJTVEkiLAkweDIwLCAweDIwIH0sCisJeyAiQ0xSQVROTyIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0xSU0VMVElNRU8iLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NscnNpbnQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTFJTSU5UMV9wYXJzZV90YWJsZSwgNywgIkNMUlNJTlQxIiwKKwkgICAgMHg0YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSRVFJTklUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTVFJCMkZBU1QiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDU0lQRVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQSEFTRU1JUyIsCQkweDEwLCAweDEwIH0sCisJeyAiU0NTSVJTVEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkFUTlRBUkciLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNFTFRPIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc3N0YXQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDFfcGFyc2VfdGFibGUsIDgsICJTU1RBVDEiLAorCSAgICAweDRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNTVEFUMl9wYXJzZV90YWJsZVtdID0geworCXsgIkJVU0ZSRUVfTFFPIiwJMHg0MCwgMHhjMCB9LAorCXsgIkJVU0ZSRUVfREZGMCIsCTB4ODAsIDB4YzAgfSwKKwl7ICJCVVNGUkVFX0RGRjEiLAkweGMwLCAweGMwIH0sCisJeyAiRE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCisJeyAiU0RPTkUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIldJREVfUkVTIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCU1lYIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFWFBfQUNUSVZFIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJOT05QQUNLUkVRIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJCVVNGUkVFVElNRSIsCTB4YzAsIDB4YzAgfQorfTsKKworaW50CithaGRfc3N0YXQyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTU1RBVDJfcGFyc2VfdGFibGUsIDEwLCAiU1NUQVQyIiwKKwkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJTSU5UMl9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkRNQURPTkUiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlNET05FIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJXSURFX1JFUyIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJOT05QQUNLUkVRIiwJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoZF9jbHJzaW50Ml9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDJfcGFyc2VfdGFibGUsIDQsICJDTFJTSU5UMiIsCisJICAgIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMl9wYXJzZV90YWJsZVtdID0geworCXsgIkVORE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5TRE9ORSIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5XSURFX1JFUyIsCQkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3NpbW9kZTJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNJTU9ERTJfcGFyc2VfdGFibGUsIDMsICJTSU1PREUyIiwKKwkgICAgMHg0ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQRVJSRElBR19wYXJzZV90YWJsZVtdID0geworCXsgIkRURVJSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJER0ZPUk1FUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNSQ0VSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiQUlQRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQQVJJVFlFUlIiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBSRVZQSEFTRSIsCQkweDIwLCAweDIwIH0sCisJeyAiSElQRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJISVpFUk8iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9wZXJyZGlhZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUEVSUkRJQUdfcGFyc2VfdGFibGUsIDgsICJQRVJSRElBRyIsCisJICAgIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxaXN0YXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFJU1RBVEUiLAorCSAgICAweDRlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zb2ZmY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU09GRkNOVCIsCisJICAgIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2xxb3N0YXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTFFPU1RBVEUiLAorCSAgICAweDRmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRSVNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTFFJQVROQ01EIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJMUUlBVE5MUSIsCQkweDAyLCAweDAyIH0sCisJeyAiTFFJQkFETFFUIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJMUUlDUkNUMiIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFJQ1JDVDEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkxRSUFUTlFBUyIsCQkweDIwLCAweDIwIH0KK307CisKK2ludAorYWhkX2xxaXN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUUlTVEFUMF9wYXJzZV90YWJsZSwgNiwgIkxRSVNUQVQwIiwKKwkgICAgMHg1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJMUUlJTlQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSTFFJQVROQ01EIiwJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkxRSUFUTkxRIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUkxRSUJBRExRVCIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTFJMUUlDUkNUMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJMUUlDUkNUMSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJMUUlBVE5RQVMiLAkweDIwLCAweDIwIH0KK307CisKK2ludAorYWhkX2NscmxxaWludDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUkxRSUlOVDBfcGFyc2VfdGFibGUsIDYsICJDTFJMUUlJTlQwIiwKKwkgICAgMHg1MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUUlNT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOTFFJQVROQ01EIiwJMHgwMSwgMHgwMSB9LAorCXsgIkVOTFFJQVROTFEiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOTFFJQkFETFFUIiwJMHgwNCwgMHgwNCB9LAorCXsgIkVOTFFJQ1JDVDIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkVOTFFJQ1JDVDEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOTFFJQVROUUFTSyIsCTB4MjAsIDB4MjAgfQorfTsKKworaW50CithaGRfbHFpbW9kZTBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRSU1PREUwX3BhcnNlX3RhYmxlLCA2LCAiTFFJTU9ERTAiLAorCSAgICAweDUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRSU1PREUxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5MUUlPVkVSSV9OTFEiLAkweDAxLCAweDAxIH0sCisJeyAiRU5MUUlPVkVSSV9MUSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkxRSUJBRExRSSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJFTkxRSUNSQ0lfTkxRIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVOTFFJQ1JDSV9MUSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJFTkxJUUFCT1JUIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJFTkxRSVBIQVNFX05MUSIsCTB4NDAsIDB4NDAgfSwKKwl7ICJFTkxRSVBIQVNFX0xRIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWltb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFJTU9ERTFfcGFyc2VfdGFibGUsIDgsICJMUUlNT0RFMSIsCisJICAgIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFJU1RBVDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMUUlPVkVSSV9OTFEiLAkweDAxLCAweDAxIH0sCisJeyAiTFFJT1ZFUklfTFEiLAkweDAyLCAweDAyIH0sCisJeyAiTFFJQkFETFFJIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJMUUlDUkNJX05MUSIsCTB4MDgsIDB4MDggfSwKKwl7ICJMUUlDUkNJX0xRIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJMUUlBQk9SVCIsCQkweDIwLCAweDIwIH0sCisJeyAiTFFJUEhBU0VfTkxRIiwJMHg0MCwgMHg0MCB9LAorCXsgIkxRSVBIQVNFX0xRIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWlzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFJU1RBVDFfcGFyc2VfdGFibGUsIDgsICJMUUlTVEFUMSIsCisJICAgIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSTFFJSU5UMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkxRSU9WRVJJX05MUSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJDTFJMUUlPVkVSSV9MUSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJMUUlCQURMUUkiLAkweDA0LCAweDA0IH0sCisJeyAiQ0xSTFFJQ1JDSV9OTFEiLAkweDA4LCAweDA4IH0sCisJeyAiQ0xSTFFJQ1JDSV9MUSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJMSVFBQk9SVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJMUUlQSEFTRV9OTFEiLAkweDQwLCAweDQwIH0sCisJeyAiQ0xSTFFJUEhBU0VfTFEiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NscmxxaWludDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENMUkxRSUlOVDFfcGFyc2VfdGFibGUsIDgsICJDTFJMUUlJTlQxIiwKKwkgICAgMHg1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUUlTVEFUMl9wYXJzZV90YWJsZVtdID0geworCXsgIkxRSUdTQVZBSUwiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkxRSVNUT1BDTUQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkxRSVNUT1BMUSIsCQkweDA0LCAweDA0IH0sCisJeyAiTFFJU1RPUFBLVCIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFJV0FJVEZJRk8iLAkweDEwLCAweDEwIH0sCisJeyAiTFFJV09SS09OTFEiLAkweDIwLCAweDIwIH0sCisJeyAiTFFJUEhBU0VfT1VUUEtUIiwJMHg0MCwgMHg0MCB9LAorCXsgIlBBQ0tFVElaRUQiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9scWlzdGF0Ml9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFJU1RBVDJfcGFyc2VfdGFibGUsIDgsICJMUUlTVEFUMiIsCisJICAgIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQzX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiT1NSQU1QRVJSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJOVFJBTVBFUlIiLAkJMHgwMiwgMHgwMiB9Cit9OworCitpbnQKK2FoZF9zc3RhdDNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNTVEFUM19wYXJzZV90YWJsZSwgMiwgIlNTVEFUMyIsCisJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFM19wYXJzZV90YWJsZVtdID0geworCXsgIkVOT1NSQU1QRVJSIiwJMHgwMSwgMHgwMSB9LAorCXsgIkVOTlRSQU1QRVJSIiwJMHgwMiwgMHgwMiB9Cit9OworCitpbnQKK2FoZF9zaW1vZGUzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTSU1PREUzX3BhcnNlX3RhYmxlLCAyLCAiU0lNT0RFMyIsCisJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJPU1JBTVBFUlIiLAkweDAxLCAweDAxIH0sCisJeyAiQ0xSTlRSQU1QRVJSIiwJMHgwMiwgMHgwMiB9Cit9OworCitpbnQKK2FoZF9jbHJzaW50M19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDNfcGFyc2VfdGFibGUsIDIsICJDTFJTSU5UMyIsCisJICAgIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTFFPTU9ERTBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJFTkxRT1RDUkMiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOTFFPQVROUEtUIiwJMHgwMiwgMHgwMiB9LAorCXsgIkVOTFFPQVROTFEiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOTFFPU1RPUFQyIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVOTFFPVEFSR1NDQlBFUlIiLAkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhkX2xxb21vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9NT0RFMF9wYXJzZV90YWJsZSwgNSwgIkxRT01PREUwIiwKKwkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMUU9TVEFUMF9wYXJzZV90YWJsZVtdID0geworCXsgIkxRT1RDUkMiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkxRT0FUTlBLVCIsCQkweDAyLCAweDAyIH0sCisJeyAiTFFPQVROTFEiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkxRT1NUT1BUMiIsCQkweDA4LCAweDA4IH0sCisJeyAiTFFPVEFSR1NDQlBFUlIiLAkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhkX2xxb3N0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9TVEFUMF9wYXJzZV90YWJsZSwgNSwgIkxRT1NUQVQwIiwKKwkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTFJMUU9JTlQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSTFFPVENSQyIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0xSTFFPQVROUEtUIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUkxRT0FUTkxRIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkxRT1NUT1BUMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJMUU9UQVJHU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfY2xybHFvaW50MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSTFFPSU5UMF9wYXJzZV90YWJsZSwgNSwgIkNMUkxRT0lOVDAiLAorCSAgICAweDU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTFFPUEhBQ0hHSU5QS1QiLAkweDAxLCAweDAxIH0sCisJeyAiTFFPQlVTRlJFRSIsCQkweDAyLCAweDAyIH0sCisJeyAiTFFPQkFEUUFTIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJMUU9TVE9QSTIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkxRT0lOSVRTQ0JQRVJSIiwJMHgxMCwgMHgxMCB9Cit9OworCitpbnQKK2FoZF9scW9zdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFPU1RBVDFfcGFyc2VfdGFibGUsIDUsICJMUU9TVEFUMSIsCisJICAgIDB4NTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSTFFPSU5UMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUkxRT1BIQUNIR0lOUEtUIiwJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkxRT0JVU0ZSRUUiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSTFFPQkFEUUFTIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkxRT1NUT1BJMiIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJMUU9JTklUU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfY2xybHFvaW50MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0xSTFFPSU5UMV9wYXJzZV90YWJsZSwgNSwgIkNMUkxRT0lOVDEiLAorCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT01PREUxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5MUU9QSEFDSEdJTlBLVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkxRT0JVU0ZSRUUiLAkweDAyLCAweDAyIH0sCisJeyAiRU5MUU9CQURRQVMiLAkweDA0LCAweDA0IH0sCisJeyAiRU5MUU9TVE9QSTIiLAkweDA4LCAweDA4IH0sCisJeyAiRU5MUU9JTklUU0NCUEVSUiIsCTB4MTAsIDB4MTAgfQorfTsKKworaW50CithaGRfbHFvbW9kZTFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKExRT01PREUxX3BhcnNlX3RhYmxlLCA1LCAiTFFPTU9ERTEiLAorCSAgICAweDU1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NUQVQyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTFFPU1RPUDAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkxRT1BIQUNIR09VVFBLVCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJMUU9XQUlURklGTyIsCTB4MTAsIDB4MTAgfSwKKwl7ICJMUU9QS1QiLAkJMHhlMCwgMHhlMCB9Cit9OworCitpbnQKK2FoZF9scW9zdGF0Ml9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTFFPU1RBVDJfcGFyc2VfdGFibGUsIDQsICJMUU9TVEFUMiIsCisJICAgIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX29zX3NwYWNlX2NudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TX1NQQUNFX0NOVCIsCisJICAgIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMV9wYXJzZV90YWJsZVtdID0geworCXsgIkVOUkVRSU5JVCIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5TVFJCMkZBU1QiLAkweDAyLCAweDAyIH0sCisJeyAiRU5TQ1NJUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5CVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlBIQVNFTUlTIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNDU0lSU1QiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOQVROVEFSRyIsCQkweDQwLCAweDQwIH0sCisJeyAiRU5TRUxUSU1PIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc2ltb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0lNT0RFMV9wYXJzZV90YWJsZSwgOCwgIlNJTU9ERTEiLAorCSAgICAweDU3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9nc2ZpZm9fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJHU0ZJRk8iLAorCSAgICAweDU4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGRlNYRlJDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSU1RDSE4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkNITiIsCQkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0hDTlQiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkRGRkJJVEJVQ0tFVCIsCTB4MDgsIDB4MDggfQorfTsKKworaW50CithaGRfZGZmc3hmcmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoREZGU1hGUkNUTF9wYXJzZV90YWJsZSwgNCwgIkRGRlNYRlJDVEwiLAorCSAgICAweDVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IExRT1NDU0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkxRT05PQ0hLT1ZFUiIsCTB4MDEsIDB4MDEgfSwKKwl7ICJMUU9IMkFfVkVSU0lPTiIsCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfbHFvc2NzY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihMUU9TQ1NDVExfcGFyc2VfdGFibGUsIDIsICJMUU9TQ1NDVEwiLAorCSAgICAweDVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9uZXh0c2NiX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVYVFNDQiIsCisJICAgIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0VRSU5UU1JDX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0xSQ0ZHNFRDTUQiLAkweDAxLCAweDAxIH0sCisJeyAiQ0xSQ0ZHNElDTUQiLAkweDAyLCAweDAyIH0sCisJeyAiQ0xSQ0ZHNFRTVEFUIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkNGRzRJU1RBVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJDRkc0REFUQSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJDTFJTQVZFUFRSUyIsCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJDVFhURE9ORSIsCTB4NDAsIDB4NDAgfQorfTsKKworaW50CithaGRfY2xyc2VxaW50c3JjX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTFJTRVFJTlRTUkNfcGFyc2VfdGFibGUsIDcsICJDTFJTRVFJTlRTUkMiLAorCSAgICAweDViLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUlOVFNSQ19wYXJzZV90YWJsZVtdID0geworCXsgIkNGRzRUQ01EIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDRkc0SUNNRCIsCQkweDAyLCAweDAyIH0sCisJeyAiQ0ZHNFRTVEFUIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDRkc0SVNUQVQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNGRzREQVRBIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTQVZFUFRSUyIsCQkweDIwLCAweDIwIH0sCisJeyAiQ1RYVERPTkUiLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zZXFpbnRzcmNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNFUUlOVFNSQ19wYXJzZV90YWJsZSwgNywgIlNFUUlOVFNSQyIsCisJICAgIDB4NWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2N1cnJzY2JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDVVJSU0NCIiwKKwkgICAgMHg1YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFJTU9ERV9wYXJzZV90YWJsZVtdID0geworCXsgIkVOQ0ZHNFRDTUQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOQ0ZHNElDTUQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQ0ZHNFRTVEFUIiwJMHgwNCwgMHgwNCB9LAorCXsgIkVOQ0ZHNElTVEFUIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVOQ0ZHNERBVEEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0FWRVBUUlMiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOQ1RYVERPTkUiLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zZXFpbW9kZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRSU1PREVfcGFyc2VfdGFibGUsIDcsICJTRVFJTU9ERSIsCisJICAgIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTURGRlNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJGSUZPRlJFRSIsCQkweDAxLCAweDAxIH0sCisJeyAiREFUQUlORklGTyIsCQkweDAyLCAweDAyIH0sCisJeyAiRExaRVJPIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTSFZBTElEIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJMQVNUU0RPTkUiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNIQ05UTUlOVVMxIiwJMHgyMCwgMHgyMCB9LAorCXsgIlNIQ05UTkVHQVRJVkUiLAkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX21kZmZzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihNREZGU1RBVF9wYXJzZV90YWJsZSwgNywgIk1ERkZTVEFUIiwKKwkgICAgMHg1ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDUkNDT05UUk9MX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ1JDVkFMQ0hLRU4iLAkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX2NyY2NvbnRyb2xfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENSQ0NPTlRST0xfcGFyc2VfdGFibGUsIDEsICJDUkNDT05UUk9MIiwKKwkgICAgMHg1ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZmdGFnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZGVEFHIiwKKwkgICAgMHg1ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbGFzdHNjYl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RTQ0IiLAorCSAgICAweDVlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lURVNUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0VMX1RYUExMX0RFQlVHIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNOVFJURVNUIiwJCTB4MDgsIDB4MDggfQorfTsKKworaW50CithaGRfc2NzaXRlc3RfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDU0lURVNUX3BhcnNlX3RhYmxlLCAyLCAiU0NTSVRFU1QiLAorCSAgICAweDVlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IElPUEROQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUEROX0RJRkZTRU5TRSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJQRE5fSURJU1QiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkRJU0FCTEVfT0UiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9pb3BkbmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoSU9QRE5DVExfcGFyc2VfdGFibGUsIDMsICJJT1BETkNUTCIsCisJICAgIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NoYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQUREUiIsCisJICAgIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX25lZ29hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHT0FERFIiLAorCSAgICAweDYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kZ3JwY3JjaV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRHUlBDUkNJIiwKKwkgICAgMHg2MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbmVncGVyaW9kX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTkVHUEVSSU9EIiwKKwkgICAgMHg2MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcGFja2NyY2lfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJQQUNLQ1JDSSIsCisJICAgIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX25lZ29mZnNldF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FR09GRlNFVCIsCisJICAgIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgTkVHUFBST1BUU19wYXJzZV90YWJsZVtdID0geworCXsgIlBQUk9QVF9JVVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlBQUk9QVF9EVCIsCQkweDAyLCAweDAyIH0sCisJeyAiUFBST1BUX1FBUyIsCQkweDA0LCAweDA0IH0sCisJeyAiUFBST1BUX1BBQ0UiLAkweDA4LCAweDA4IH0KK307CisKK2ludAorYWhkX25lZ3Bwcm9wdHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5FR1BQUk9QVFNfcGFyc2VfdGFibGUsIDQsICJORUdQUFJPUFRTIiwKKwkgICAgMHg2MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBORUdDT05PUFRTX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiV0lERVhGRVIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOQVVUT0FUTk8iLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQVVUT0FUTkkiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOU0xPV0NSQyIsCQkweDA4LCAweDA4IH0sCisJeyAiUlRJX09WUkRUUk4iLAkweDEwLCAweDEwIH0sCisJeyAiUlRJX1dSVERJUyIsCQkweDIwLCAweDIwIH0sCisJeyAiRU5TTkFQU0hPVCIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX25lZ2Nvbm9wdHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5FR0NPTk9QVFNfcGFyc2VfdGFibGUsIDcsICJORUdDT05PUFRTIiwKKwkgICAgMHg2NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYW5uZXhjb2xfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTk5FWENPTCIsCisJICAgIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NTQ0hLTl9wYXJzZV90YWJsZVtdID0geworCXsgIkxTVFNHQ0xSRElTIiwJMHgwMSwgMHgwMSB9LAorCXsgIlNIVkFMSURTVERJUyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJERkZBQ1RDTFIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNET05FTVNLRElTIiwJMHgwOCwgMHgwOCB9LAorCXsgIldJREVSRVNFTiIsCQkweDEwLCAweDEwIH0sCisJeyAiQ1VSUkZJRk9ERUYiLAkweDIwLCAweDIwIH0sCisJeyAiU1RTRUxTS0lERElTIiwJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoZF9zY3NjaGtuX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ1NDSEtOX3BhcnNlX3RhYmxlLCA3LCAiU0NTQ0hLTiIsCisJICAgIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FubmV4ZGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQU5ORVhEQVQiLAorCSAgICAweDY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pb3duaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJT1dOSUQiLAorCSAgICAweDY3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFBMTDk2MENUTDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJQTExfRU5GQk0iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlBMTF9ETFBGIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJQTExfRU5MUEYiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlBMTF9FTkxVRCIsCQkweDA4LCAweDA4IH0sCisJeyAiUExMX05TIiwJCTB4MzAsIDB4MzAgfSwKKwl7ICJQTExfUFdETiIsCQkweDQwLCAweDQwIH0sCisJeyAiUExMX1ZDT1NFTCIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3BsbDk2MGN0bDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFBMTDk2MENUTDBfcGFyc2VfdGFibGUsIDcsICJQTEw5NjBDVEwwIiwKKwkgICAgMHg2OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSENOVCIsCisJICAgIDB4NjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Rvd25pZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRPV05JRCIsCisJICAgIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUExMOTYwQ1RMMV9wYXJzZV90YWJsZVtdID0geworCXsgIlBMTF9SU1QiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlBMTF9DTlRDTFIiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlBMTF9DTlRFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3BsbDk2MGN0bDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFBMTDk2MENUTDFfcGFyc2VfdGFibGUsIDMsICJQTEw5NjBDVEwxIiwKKwkgICAgMHg2OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcGxsOTYwY250MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlBMTDk2MENOVDAiLAorCSAgICAweDZhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF94c2lnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiWFNJRyIsCisJICAgIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NlbG9pZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFTE9JRCIsCisJICAgIDB4NmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUExMNDAwQ1RMMF9wYXJzZV90YWJsZVtdID0geworCXsgIlBMTF9FTkZCTSIsCQkweDAxLCAweDAxIH0sCisJeyAiUExMX0RMUEYiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlBMTF9FTkxQRiIsCQkweDA0LCAweDA0IH0sCisJeyAiUExMX0VOTFVEIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQTExfTlMiLAkJMHgzMCwgMHgzMCB9LAorCXsgIlBMTF9QV0ROIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQTExfVkNPU0VMIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGxsNDAwY3RsMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUExMNDAwQ1RMMF9wYXJzZV90YWJsZSwgNywgIlBMTDQwMENUTDAiLAorCSAgICAweDZjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9mYWlybmVzc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZBSVJORVNTIiwKKwkgICAgMHg2YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQTEw0MDBDVEwxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUExMX1JTVCIsCQkweDAxLCAweDAxIH0sCisJeyAiUExMX0NOVENMUiIsCQkweDQwLCAweDQwIH0sCisJeyAiUExMX0NOVEVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGxsNDAwY3RsMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUExMNDAwQ1RMMV9wYXJzZV90YWJsZSwgMywgIlBMTDQwMENUTDEiLAorCSAgICAweDZkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9wbGw0MDBjbnQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUExMNDAwQ05UMCIsCisJICAgIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3VuZmFpcm5lc3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJVTkZBSVJORVNTIiwKKwkgICAgMHg2ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaGFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsCisJICAgIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUExMREVMQVlfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTUExJVF9EUk9QX1JFUSIsCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGxsZGVsYXlfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFBMTERFTEFZX3BhcnNlX3RhYmxlLCAxLCAiUExMREVMQVkiLAorCSAgICAweDcwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9ob2RtYWFkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhPRE1BQURSIiwKKwkgICAgMHg3MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaG9kbWFjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT0RNQUNOVCIsCisJICAgIDB4NzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQ05UIiwKKwkgICAgMHg3OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaG9kbWFlbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhPRE1BRU4iLAorCSAgICAweDdhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZ2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0dIQUREUiIsCisJICAgIDB4N2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYmhhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCSEFERFIiLAorCSAgICAweDdjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZ2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTR0hDTlQiLAorCSAgICAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JoY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCSENOVCIsCisJICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgREZGX1RIUlNIX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiV1JfREZUSFJTSF9NSU4iLAkweDAwLCAweDcwIH0sCisJeyAiUkRfREZUSFJTSF9NSU4iLAkweDAwLCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF8yNSIsCTB4MDEsIDB4MDcgfSwKKwl7ICJSRF9ERlRIUlNIXzUwIiwJMHgwMiwgMHgwNyB9LAorCXsgIlJEX0RGVEhSU0hfNjMiLAkweDAzLCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF83NSIsCTB4MDQsIDB4MDcgfSwKKwl7ICJSRF9ERlRIUlNIXzg1IiwJMHgwNSwgMHgwNyB9LAorCXsgIlJEX0RGVEhSU0hfOTAiLAkweDA2LCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF9NQVgiLAkweDA3LCAweDA3IH0sCisJeyAiV1JfREZUSFJTSF8yNSIsCTB4MTAsIDB4NzAgfSwKKwl7ICJXUl9ERlRIUlNIXzUwIiwJMHgyMCwgMHg3MCB9LAorCXsgIldSX0RGVEhSU0hfNjMiLAkweDMwLCAweDcwIH0sCisJeyAiV1JfREZUSFJTSF83NSIsCTB4NDAsIDB4NzAgfSwKKwl7ICJXUl9ERlRIUlNIXzg1IiwJMHg1MCwgMHg3MCB9LAorCXsgIldSX0RGVEhSU0hfOTAiLAkweDYwLCAweDcwIH0sCisJeyAiV1JfREZUSFJTSF9NQVgiLAkweDcwLCAweDcwIH0sCisJeyAiUkRfREZUSFJTSCIsCQkweDA3LCAweDA3IH0sCisJeyAiV1JfREZUSFJTSCIsCQkweDcwLCAweDcwIH0KK307CisKK2ludAorYWhkX2RmZl90aHJzaF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoREZGX1RIUlNIX3BhcnNlX3RhYmxlLCAxOCwgIkRGRl9USFJTSCIsCisJICAgIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3JvbWFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJST01BRERSIiwKKwkgICAgMHg4YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBST01DTlRSTF9wYXJzZV90YWJsZVtdID0geworCXsgIlJEWSIsCQkweDAxLCAweDAxIH0sCisJeyAiUkVQRUFUIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJST01TUEQiLAkJMHgxOCwgMHgxOCB9LAorCXsgIlJPTU9QIiwJCTB4ZTAsIDB4ZTAgfQorfTsKKworaW50CithaGRfcm9tY250cmxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFJPTUNOVFJMX3BhcnNlX3RhYmxlLCA0LCAiUk9NQ05UUkwiLAorCSAgICAweDhkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9yb21kYXRhX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUk9NREFUQSIsCisJICAgIDB4OGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DUlhNU0cwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIkNETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfY21jcnhtc2cwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihDTUNSWE1TRzBfcGFyc2VfdGFibGUsIDIsICJDTUNSWE1TRzAiLAorCSAgICAweDkwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFJPRU5BQkxFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRENIMFJPRU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkRDSDFST0VOIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTR1JPRU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNNQ1JPRU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIk9WTFlST0VOIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJNU0lST0VOIiwJCTB4MjAsIDB4MjAgfQorfTsKKworaW50CithaGRfcm9lbmFibGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFJPRU5BQkxFX3BhcnNlX3RhYmxlLCA2LCAiUk9FTkFCTEUiLAorCSAgICAweDkwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDRk5VTSIsCQkweDA3LCAweDA3IH0sCisJeyAiQ0ROVU0iLAkJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoZF9vdmx5cnhtc2cwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0cwX3BhcnNlX3RhYmxlLCAyLCAiT1ZMWVJYTVNHMCIsCisJICAgIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0cwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIkNETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfZGNocnhtc2cwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihEQ0hSWE1TRzBfcGFyc2VfdGFibGUsIDIsICJEQ0hSWE1TRzAiLAorCSAgICAweDkwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX292bHlyeG1zZzFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzFfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBOU0VOQUJMRV9wYXJzZV90YWJsZVtdID0geworCXsgIkRDSDBOU0VOIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJEQ0gxTlNFTiIsCQkweDAyLCAweDAyIH0sCisJeyAiU0dOU0VOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTUNOU0VOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJPVkxZTlNFTiIsCQkweDEwLCAweDEwIH0sCisJeyAiTVNJTlNFTiIsCQkweDIwLCAweDIwIH0KK307CisKK2ludAorYWhkX25zZW5hYmxlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOU0VOQUJMRV9wYXJzZV90YWJsZSwgNiwgIk5TRU5BQkxFIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX2RjaHJ4bXNnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRENIUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiRENIUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQk5VTSIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX2NtY3J4bXNnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiQ01DUlhNU0cxIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEQ0hSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9kY2hyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFJYTVNHMl9wYXJzZV90YWJsZSwgMSwgIkRDSFJYTVNHMiIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVJYTVNHMl9wYXJzZV90YWJsZVtdID0geworCXsgIk1JTkRFWCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX292bHlyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlSWE1TRzJfcGFyc2VfdGFibGUsIDEsICJPVkxZUlhNU0cyIiwKKwkgICAgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNSWE1TRzJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNSU5ERVgiLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9jbWNyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENNQ1JYTVNHMl9wYXJzZV90YWJsZSwgMSwgIkNNQ1JYTVNHMiIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX29zdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk9TVCIsCisJICAgIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIUlhNU0czX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTUNMQVNTIiwJCTB4MGYsIDB4MGYgfQorfTsKKworaW50CithaGRfZGNocnhtc2czX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihEQ0hSWE1TRzNfcGFyc2VfdGFibGUsIDEsICJEQ0hSWE1TRzMiLAorCSAgICAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENNQ1JYTVNHM19wYXJzZV90YWJsZVtdID0geworCXsgIk1DTEFTUyIsCQkweDBmLCAweDBmIH0KK307CisKK2ludAorYWhkX2NtY3J4bXNnM19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DUlhNU0czX3BhcnNlX3RhYmxlLCAxLCAiQ01DUlhNU0czIiwKKwkgICAgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBQQ0lYQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ01QQUJDRElTIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJUU0NTRVJSRU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNSU1BEUEVFTiIsCQkweDA0LCAweDA0IH0sCisJeyAiU1BMVFNUQURJUyIsCQkweDA4LCAweDA4IH0sCisJeyAiU1BMVFNNQURJUyIsCQkweDEwLCAweDEwIH0sCisJeyAiVU5FWFBTQ0lFTiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0VSUlBVTFNFIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcGNpeGN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoUENJWENUTF9wYXJzZV90YWJsZSwgNywgIlBDSVhDVEwiLAorCSAgICAweDkzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IE9WTFlSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9Cit9OworCitpbnQKK2FoZF9vdmx5cnhtc2czX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZUlhNU0czX3BhcnNlX3RhYmxlLCAxLCAiT1ZMWVJYTVNHMyIsCisJICAgIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX292bHlzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWVNFUUJDTlQiLAorCSAgICAweDk0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jbWNzZXFiY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01DU0VRQkNOVCIsCisJICAgIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2RjaHNlcWJjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQ0hTRVFCQ05UIiwKKwkgICAgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNTUExUU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSWFNQTFRSU1AiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJYU0NFTVNHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSWE9WUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTlROT1RDTVBMVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJTQ0RBVEJVQ0tFVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ0FERVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JDRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTVEFFVEVSTSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NtY3NwbHRzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DU1BMVFNUQVQwX3BhcnNlX3RhYmxlLCA4LCAiQ01DU1BMVFNUQVQwIiwKKwkgICAgMHg5NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCisJeyAiUlhPVlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiQ05UTk9UQ01QTFQiLAkweDA4LCAweDA4IH0sCisJeyAiU0NEQVRCVUNLRVQiLAkweDEwLCAweDEwIH0sCisJeyAiU0NBREVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NCQ0VSUiIsCQkweDQwLCAweDQwIH0sCisJeyAiU1RBRVRFUk0iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9vdmx5c3BsdHN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihPVkxZU1BMVFNUQVQwX3BhcnNlX3RhYmxlLCA4LCAiT1ZMWVNQTFRTVEFUMCIsCisJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhTUExUUlNQIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJSWFNDRU1TRyIsCQkweDAyLCAweDAyIH0sCisJeyAiUlhPVlJVTiIsCQkweDA0LCAweDA0IH0sCisJeyAiQ05UTk9UQ01QTFQiLAkweDA4LCAweDA4IH0sCisJeyAiU0NEQVRCVUNLRVQiLAkweDEwLCAweDEwIH0sCisJeyAiU0NBREVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiU0NCQ0VSUiIsCQkweDQwLCAweDQwIH0sCisJeyAiU1RBRVRFUk0iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kY2hzcGx0c3RhdDBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFNQTFRTVEFUMF9wYXJzZV90YWJsZSwgOCwgIkRDSFNQTFRTVEFUMCIsCisJICAgIDB4OTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRENIU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9kY2hzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERDSFNQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIkRDSFNQTFRTVEFUMSIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ01DU1BMVFNUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUlhEQVRBQlVDS0VUIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9jbWNzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENNQ1NQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIkNNQ1NQTFRTVEFUMSIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgT1ZMWVNQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQorfTsKKworaW50CithaGRfb3ZseXNwbHRzdGF0MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoT1ZMWVNQTFRTVEFUMV9wYXJzZV90YWJsZSwgMSwgIk9WTFlTUExUU1RBVDEiLAorCSAgICAweDk3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNHUlhNU0cwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIkNETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfc2dyeG1zZzBfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHUlhNU0cwX3BhcnNlX3RhYmxlLCAyLCAiU0dSWE1TRzAiLAorCSAgICAweDk4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBRFIwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTE9XRVJfQUREUiIsCQkweDdmLCAweDdmIH0KK307CisKK2ludAorYWhkX3NsdnNwbHRvdXRhZHIwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTTFZTUExUT1VUQURSMF9wYXJzZV90YWJsZSwgMSwgIlNMVlNQTFRPVVRBRFIwIiwKKwkgICAgMHg5OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1JYTVNHMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNCTlVNIiwJCTB4ZmYsIDB4ZmYgfQorfTsKKworaW50CithaGRfc2dyeG1zZzFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHUlhNU0cxX3BhcnNlX3RhYmxlLCAxLCAiU0dSWE1TRzEiLAorCSAgICAweDk5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBRFIxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkVRX0ZOVU0iLAkJMHgwNywgMHgwNyB9LAorCXsgIlJFUV9ETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfc2x2c3BsdG91dGFkcjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNMVlNQTFRPVVRBRFIxX3BhcnNlX3RhYmxlLCAyLCAiU0xWU1BMVE9VVEFEUjEiLAorCSAgICAweDk5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNHUlhNU0cyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTUlOREVYIiwJCTB4ZmYsIDB4ZmYgfQorfTsKKworaW50CithaGRfc2dyeG1zZzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHUlhNU0cyX3BhcnNlX3RhYmxlLCAxLCAiU0dSWE1TRzIiLAorCSAgICAweDlhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBRFIyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkVRX0JOVU0iLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9zbHZzcGx0b3V0YWRyMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0xWU1BMVE9VVEFEUjJfcGFyc2VfdGFibGUsIDEsICJTTFZTUExUT1VUQURSMiIsCisJICAgIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dSWE1TRzNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQ0xBU1MiLAkJMHgwZiwgMHgwZiB9Cit9OworCitpbnQKK2FoZF9zZ3J4bXNnM19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dSWE1TRzNfcGFyc2VfdGFibGUsIDEsICJTR1JYTVNHMyIsCisJICAgIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0xWU1BMVE9VVEFEUjNfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSTFhPUkQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlRBR19OVU0iLAkJMHgxZiwgMHgxZiB9Cit9OworCitpbnQKK2FoZF9zbHZzcGx0b3V0YWRyM19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0xWU1BMVE9VVEFEUjNfcGFyc2VfdGFibGUsIDIsICJTTFZTUExUT1VUQURSMyIsCisJICAgIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3Nnc2VxYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHU0VRQkNOVCIsCisJICAgIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0xWU1BMVE9VVEFUVFIwX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTE9XRVJfQkNOVCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX3NsdnNwbHRvdXRhdHRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0xWU1BMVE9VVEFUVFIwX3BhcnNlX3RhYmxlLCAxLCAiU0xWU1BMVE9VVEFUVFIwIiwKKwkgICAgMHg5YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTTFZTUExUT1VUQVRUUjFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTVBMVF9GTlVNIiwJCTB4MDcsIDB4MDcgfSwKKwl7ICJDTVBMVF9ETlVNIiwJCTB4ZjgsIDB4ZjggfQorfTsKKworaW50CithaGRfc2x2c3BsdG91dGF0dHIxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTTFZTUExUT1VUQVRUUjFfcGFyc2VfdGFibGUsIDIsICJTTFZTUExUT1VUQVRUUjEiLAorCSAgICAweDlkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNMVlNQTFRPVVRBVFRSMl9wYXJzZV90YWJsZVtdID0geworCXsgIkNNUExUX0JOVU0iLAkJMHhmZiwgMHhmZiB9Cit9OworCitpbnQKK2FoZF9zbHZzcGx0b3V0YXR0cjJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNMVlNQTFRPVVRBVFRSMl9wYXJzZV90YWJsZSwgMSwgIlNMVlNQTFRPVVRBVFRSMiIsCisJICAgIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dTUExUU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSWFNQTFRSU1AiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJYU0NFTVNHIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSWE9WUlVOIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDTlROT1RDTVBMVCIsCTB4MDgsIDB4MDggfSwKKwl7ICJTQ0RBVEJVQ0tFVCIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ0FERVJSIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JDRVJSIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTVEFFVEVSTSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3Nnc3BsdHN0YXQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTR1NQTFRTVEFUMF9wYXJzZV90YWJsZSwgOCwgIlNHU1BMVFNUQVQwIiwKKwkgICAgMHg5ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRlVOQ1RfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJURVNUX05VTSIsCQkweDBmLCAweDBmIH0sCisJeyAiVEVTVF9HUk9VUCIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhkX3NmdW5jdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0ZVTkNUX3BhcnNlX3RhYmxlLCAyLCAiU0ZVTkNUIiwKKwkgICAgMHg5ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1NQTFRTVEFUMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJYREFUQUJVQ0tFVCIsCTB4MDEsIDB4MDEgfQorfTsKKworaW50CithaGRfc2dzcGx0c3RhdDFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNHU1BMVFNUQVQxX3BhcnNlX3RhYmxlLCAxLCAiU0dTUExUU1RBVDEiLAorCSAgICAweDlmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGMFBDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2RmMHBjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERGMFBDSVNUQVRfcGFyc2VfdGFibGUsIDgsICJERjBQQ0lTVEFUIiwKKwkgICAgMHhhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcmVnMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJFRzAiLAorCSAgICAweGEwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERGMVBDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2RmMXBjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERGMVBDSVNUQVRfcGFyc2VfdGFibGUsIDgsICJERjFQQ0lTVEFUIiwKKwkgICAgMHhhMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTR1BDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NncGNpc3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0dQQ0lTVEFUX3BhcnNlX3RhYmxlLCA3LCAiU0dQQ0lTVEFUIiwKKwkgICAgMHhhMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcmVnMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlJFRzEiLAorCSAgICAweGEyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IENNQ1BDSVNUQVRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJEUFIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRXQVRFUlIiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlJEUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiU0NBQVBFUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlJUQSIsCQkweDEwLCAweDEwIH0sCisJeyAiUk1BIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2NtY3BjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENNQ1BDSVNUQVRfcGFyc2VfdGFibGUsIDgsICJDTUNQQ0lTVEFUIiwKKwkgICAgMHhhMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBPVkxZUENJU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIkRQUiIsCQkweDAxLCAweDAxIH0sCisJeyAiUkRQRVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTQ0FBUEVSUiIsCQkweDA4LCAweDA4IH0sCisJeyAiUlRBIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJSTUEiLAkJMHgyMCwgMHgyMCB9LAorCXsgIlNTRSIsCQkweDQwLCAweDQwIH0sCisJeyAiRFBFIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfb3ZseXBjaXN0YXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE9WTFlQQ0lTVEFUX3BhcnNlX3RhYmxlLCA3LCAiT1ZMWVBDSVNUQVQiLAorCSAgICAweGE0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9yZWdfaXNyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkVHX0lTUiIsCisJICAgIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0dfU1RBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRUdTX0FWQUlMIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJMT0FESU5HX05FRURFRCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJGRVRDSF9JTlBST0ciLAkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3NnX3N0YXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTR19TVEFURV9wYXJzZV90YWJsZSwgMywgIlNHX1NUQVRFIiwKKwkgICAgMHhhNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBNU0lQQ0lTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRFBSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJUV0FURVJSIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJQRU5ETVNJIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJSVEEiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlJNQSIsCQkweDIwLCAweDIwIH0sCisJeyAiU1NFIiwJCTB4NDAsIDB4NDAgfQorfTsKKworaW50CithaGRfbXNpcGNpc3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTVNJUENJU1RBVF9wYXJzZV90YWJsZSwgNiwgIk1TSVBDSVNUQVQiLAorCSAgICAweGE2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFRBUkdQQ0lTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiVFdBVEVSUiIsCQkweDAyLCAweDAyIH0sCisJeyAiU1RBIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTU0UiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRQRSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3RhcmdwY2lzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihUQVJHUENJU1RBVF9wYXJzZV90YWJsZSwgNCwgIlRBUkdQQ0lTVEFUIiwKKwkgICAgMHhhNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGF0YV9jb3VudF9vZGRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEQVRBX0NPVU5UX09ERCIsCisJICAgIDB4YTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQlBUUiIsCisJICAgIDB4YTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Njc2NiYWNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUNOVCIsCisJICAgIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCQVVUT1BUUl9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQlBUUl9PRkYiLAkJMHgwNywgMHgwNyB9LAorCXsgIlNDQlBUUl9BRERSIiwJMHgzOCwgMHgzOCB9LAorCXsgIkFVU0NCUFRSX0VOIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY2JhdXRvcHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTQ0JBVVRPUFRSX3BhcnNlX3RhYmxlLCAzLCAiU0NCQVVUT1BUUiIsCisJICAgIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Njc2dhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0FERFIiLAorCSAgICAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jY3NjYmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFERFIiLAorCSAgICAweGFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jY3NjYmFkcl9ia19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQURSX0JLIiwKKwkgICAgMHhhYywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDTUNfUkFNQklTVF9wYXJzZV90YWJsZVtdID0geworCXsgIkNNQ19CVUZGRVJfQklTVF9FTiIsCTB4MDEsIDB4MDEgfSwKKwl7ICJDTUNfQlVGRkVSX0JJU1RfRkFJTCIsMHgwMiwgMHgwMiB9LAorCXsgIlNHX0JJU1RfRU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNHX0JJU1RfRkFJTCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJTQ0JSQU1CSVNUX0ZBSUwiLAkweDQwLCAweDQwIH0sCisJeyAiU0dfRUxFTUVOVF9TSVpFIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9jbWNfcmFtYmlzdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ01DX1JBTUJJU1RfcGFyc2VfdGFibGUsIDYsICJDTUNfUkFNQklTVCIsCisJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQ0NTR0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0dSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiU0dfRkVUQ0hfUkVRIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNDU0dFTkFDSyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0dfQ0FDSEVfQVZBSUwiLAkweDEwLCAweDEwIH0sCisJeyAiQ0NTR0RPTkUiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkNDU0dFTiIsCQkweDBjLCAweDBjIH0KK307CisKK2ludAorYWhkX2Njc2djdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKENDU0dDVExfcGFyc2VfdGFibGUsIDYsICJDQ1NHQ1RMIiwKKwkgICAgMHhhZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBDQ1NDQkNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0NCUkVTRVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNDU0NCRElSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJDQ1NDQkVOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJDQ0FSUkVOIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJBUlJET05FIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDQ1NDQkRPTkUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9jY3NjYmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoQ0NTQ0JDVExfcGFyc2VfdGFibGUsIDYsICJDQ1NDQkNUTCIsCisJICAgIDB4YWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Njc2dyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHUkFNIiwKKwkgICAgMHhiMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZmxleGFkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZMRVhBRFIiLAorCSAgICAweGIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jY3NjYnJhbV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCUkFNIiwKKwkgICAgMHhiMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZmxleGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZMRVhDTlQiLAorCSAgICAweGIzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IEZMRVhETUFTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRkxFWERNQURPTkUiLAkweDAxLCAweDAxIH0sCisJeyAiRkxFWERNQUVSUiIsCQkweDAyLCAweDAyIH0KK307CisKK2ludAorYWhkX2ZsZXhkbWFzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihGTEVYRE1BU1RBVF9wYXJzZV90YWJsZSwgMiwgIkZMRVhETUFTVEFUIiwKKwkgICAgMHhiNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZmxleGRhdGFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEVYREFUQSIsCisJICAgIDB4YjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2JyZGRhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRERBVCIsCisJICAgIDB4YjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgQlJEQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQlJEU1RCIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJCUkRSVyIsCQkweDAyLCAweDAyIH0sCisJeyAiQlJERU4iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkJSREFERFIiLAkJMHgzOCwgMHgzOCB9LAorCXsgIkZMWEFSQlJFUSIsCQkweDQwLCAweDQwIH0sCisJeyAiRkxYQVJCQUNLIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfYnJkY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihCUkRDVExfcGFyc2VfdGFibGUsIDYsICJCUkRDVEwiLAorCSAgICAweGI5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZWVhZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUVBRFIiLAorCSAgICAweGJhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZWVkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUVEQVQiLAorCSAgICAweGJjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFRUNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFRU9QX0VSQUwiLAkJMHg0MCwgMHg3MCB9LAorCXsgIlNFRU9QX1dSSVRFIiwJMHg1MCwgMHg3MCB9LAorCXsgIlNFRU9QX1JFQUQiLAkJMHg2MCwgMHg3MCB9LAorCXsgIlNFRU9QX0VSQVNFIiwJMHg3MCwgMHg3MCB9LAorCXsgIlNFRVNUQVJUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTRUVSU1QiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNFRU9QQ09ERSIsCQkweDcwLCAweDcwIH0sCisJeyAiU0VFT1BfRVdFTiIsCQkweDQwLCAweDQwIH0sCisJeyAiU0VFT1BfV0FMTCIsCQkweDQwLCAweDQwIH0sCisJeyAiU0VFT1BfRVdEUyIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3NlZWN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VFQ1RMX3BhcnNlX3RhYmxlLCAxMCwgIlNFRUNUTCIsCisJICAgIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VFU1RBVF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFRVNUQVJUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTRUVCVVNZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRUVBUkJBQ0siLAkJMHgwNCwgMHgwNCB9LAorCXsgIkxEQUxUSURfTCIsCQkweDA4LCAweDA4IH0sCisJeyAiU0VFT1BDT0RFIiwJCTB4NzAsIDB4NzAgfSwKKwl7ICJJTklUX0RPTkUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zZWVzdGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRUVTVEFUX3BhcnNlX3RhYmxlLCA2LCAiU0VFU1RBVCIsCisJICAgIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkNOVCIsCisJICAgIDB4YmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Rmd2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERldBRERSIiwKKwkgICAgMHhjMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU1BGTFRSQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRFNQRkNOVFNFTCIsCQkweDBmLCAweDBmIH0sCisJeyAiRURHRVNFTlNFIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJGTFRSRElTQUJMRSIsCTB4MjAsIDB4MjAgfQorfTsKKworaW50CithaGRfZHNwZmx0cmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNQRkxUUkNUTF9wYXJzZV90YWJsZSwgMywgIkRTUEZMVFJDVEwiLAorCSAgICAweGMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERTUERBVEFDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJYTUlUT0ZGU1RESVMiLAkweDAyLCAweDAyIH0sCisJeyAiUkNWUk9GRlNURElTIiwJMHgwNCwgMHgwNCB9LAorCXsgIkRFU1FESVMiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkJZUEFTU0VOQUIiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kc3BkYXRhY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihEU1BEQVRBQ1RMX3BhcnNlX3RhYmxlLCA0LCAiRFNQREFUQUNUTCIsCisJICAgIDB4YzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2RmcmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlJBRERSIiwKKwkgICAgMHhjMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU1BSRVFDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQU5SRVFETFkiLAkJMHgzZiwgMHgzZiB9LAorCXsgIk1BTlJFUUNUTCIsCQkweGMwLCAweGMwIH0KK307CisKK2ludAorYWhkX2RzcHJlcWN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNQUkVRQ1RMX3BhcnNlX3RhYmxlLCAyLCAiRFNQUkVRQ1RMIiwKKwkgICAgMHhjMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBEU1BBQ0tDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJNQU5BQ0tETFkiLAkJMHgzZiwgMHgzZiB9LAorCXsgIk1BTkFDS0NUTCIsCQkweGMwLCAweGMwIH0KK307CisKK2ludAorYWhkX2RzcGFja2N0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoRFNQQUNLQ1RMX3BhcnNlX3RhYmxlLCAyLCAiRFNQQUNLQ1RMIiwKKwkgICAgMHhjMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZkYXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkRBVCIsCisJICAgIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRFNQU0VMRUNUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRFNQU0VMIiwJCTB4MWYsIDB4MWYgfSwKKwl7ICJBVVRPSU5DRU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kc3BzZWxlY3RfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERTUFNFTEVDVF9wYXJzZV90YWJsZSwgMiwgIkRTUFNFTEVDVCIsCisJICAgIDB4YzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgV1JUQklBU0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlhNSVRNQU5WQUwiLAkJMHgzZiwgMHgzZiB9LAorCXsgIkFVVE9YQkNESVMiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF93cnRiaWFzY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihXUlRCSUFTQ1RMX3BhcnNlX3RhYmxlLCAyLCAiV1JUQklBU0NUTCIsCisJICAgIDB4YzUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgUkNWUkJJT1NDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJSQ1ZSTUFOVkFMIiwJCTB4M2YsIDB4M2YgfSwKKwl7ICJBVVRPUkJDRElTIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfcmN2cmJpb3NjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFJDVlJCSU9TQ1RMX3BhcnNlX3RhYmxlLCAyLCAiUkNWUkJJT1NDVEwiLAorCSAgICAweGM2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93cnRiaWFzY2FsY19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldSVEJJQVNDQUxDIiwKKwkgICAgMHhjNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZwdHJzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZQVFJTIiwKKwkgICAgMHhjOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcmN2cmJpYXNjYWxjX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUkNWUkJJQVNDQUxDIiwKKwkgICAgMHhjOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfZGZia3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQktQVFIiLAorCSAgICAweGM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9za2V3Y2FsY19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNLRVdDQUxDIiwKKwkgICAgMHhjOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBERkRCQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiREZGX1JBTUJJU1RfRU4iLAkweDAxLCAweDAxIH0sCisJeyAiREZGX1JBTUJJU1RfRE9ORSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJERkZfUkFNQklTVF9GQUlMIiwJMHgwNCwgMHgwNCB9LAorCXsgIkRGRl9ESVJfRVJSIiwJMHgwOCwgMHgwOCB9LAorCXsgIkRGRl9DSU9fUkRfUkRZIiwJMHgxMCwgMHgxMCB9LAorCXsgIkRGRl9DSU9fV1JfUkRZIiwJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoZF9kZmRiY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihERkRCQ1RMX3BhcnNlX3RhYmxlLCA2LCAiREZEQkNUTCIsCisJICAgIDB4Y2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2Rmc2NudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGU0NOVCIsCisJICAgIDB4Y2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2RmYmNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGQkNOVCIsCisJICAgIDB4Y2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX292bHlhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1ZMWUFERFIiLAorCSAgICAweGQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNFUUNUTDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJMT0FEUkFNIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTRVFSRVNFVCIsCQkweDAyLCAweDAyIH0sCisJeyAiU1RFUCIsCQkweDA0LCAweDA0IH0sCisJeyAiQlJLQURSSU5URU4iLAkweDA4LCAweDA4IH0sCisJeyAiRkFTVE1PREUiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkZBSUxESVMiLAkJMHgyMCwgMHgyMCB9LAorCXsgIlBBVVNFRElTIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQRVJST1JESVMiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zZXFjdGwwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFDVEwwX3BhcnNlX3RhYmxlLCA4LCAiU0VRQ1RMMCIsCisJICAgIDB4ZDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRQ1RMMV9wYXJzZV90YWJsZVtdID0geworCXsgIlJBTUJJU1RfRU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJBTUJJU1RfRkFJTCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJSQU1CSVNUX0RPTkUiLAkweDA0LCAweDA0IH0sCisJeyAiT1ZSTEFZX0RBVEFfQ0hLIiwJMHgwOCwgMHgwOCB9Cit9OworCitpbnQKK2FoZF9zZXFjdGwxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFDVEwxX3BhcnNlX3RhYmxlLCA0LCAiU0VRQ1RMMSIsCisJICAgIDB4ZDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgRkxBR1NfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDQVJSWSIsCQkweDAxLCAweDAxIH0sCisJeyAiWkVSTyIsCQkweDAyLCAweDAyIH0KK307CisKK2ludAorYWhkX2ZsYWdzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihGTEFHU19wYXJzZV90YWJsZSwgMiwgIkZMQUdTIiwKKwkgICAgMHhkOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFJTlRDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJJUkVUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJJTlRNQVNLMSIsCQkweDAyLCAweDAyIH0sCisJeyAiSU5UTUFTSzIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNDU19TRVFfSU5UMU0wIiwJMHgwOCwgMHgwOCB9LAorCXsgIlNDU19TRVFfSU5UMU0xIiwJMHgxMCwgMHgxMCB9LAorCXsgIklOVDFfQ09OVEVYVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJJTlRWRUMxRFNMIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc2VxaW50Y3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihTRVFJTlRDVExfcGFyc2VfdGFibGUsIDcsICJTRVFJTlRDVEwiLAorCSAgICAweGQ5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zZXFyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFSQU0iLAorCSAgICAweGRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9wcmdtY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUFJHTUNOVCIsCisJICAgIDB4ZGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FjY3VtX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUNDVU0iLAorCSAgICAweGUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zaW5kZXhfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSU5ERVgiLAorCSAgICAweGUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kaW5kZXhfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESU5ERVgiLAorCSAgICAweGU0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IEJSS0FERFIxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQlJLRElTIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfYnJrYWRkcjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKEJSS0FERFIxX3BhcnNlX3RhYmxlLCAxLCAiQlJLQUREUjEiLAorCSAgICAweGU2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9icmthZGRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSS0FERFIwIiwKKwkgICAgMHhlNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWxsb25lc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9ORVMiLAorCSAgICAweGU4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9hbGx6ZXJvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTFpFUk9TIiwKKwkgICAgMHhlYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbm9uZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5PTkUiLAorCSAgICAweGVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSU5ESVIiLAorCSAgICAweGVjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9kaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESU5ESVIiLAorCSAgICAweGVkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9mdW5jdGlvbjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGVU5DVElPTjEiLAorCSAgICAweGYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zdGFja19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNUQUNLIiwKKwkgICAgMHhmMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY3VyYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNVUkFERFIiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnR2ZWMxX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMxX0FERFIiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnR2ZWMyX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRWRUMyX0FERFIiLAorCSAgICAweGY2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9sYXN0YWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RBRERSIiwKKwkgICAgMHhmNiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbG9uZ2ptcF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9OR0pNUF9BRERSIiwKKwkgICAgMHhmOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWNjdW1fc2F2ZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFDQ1VNX1NBVkUiLAorCSAgICAweGZhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93YWl0aW5nX3NjYl90YWlsc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfU0NCX1RBSUxTIiwKKwkgICAgMHgxMDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FoZF9wY2lfY29uZmlnX2Jhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBSERfUENJX0NPTkZJR19CQVNFIiwKKwkgICAgMHgxMDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NyYW1fYmFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNSQU1fQkFTRSIsCisJICAgIDB4MTAwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93YWl0aW5nX3RpZF9oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV0FJVElOR19USURfSEVBRCIsCisJICAgIDB4MTIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF93YWl0aW5nX3RpZF90YWlsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiV0FJVElOR19USURfVEFJTCIsCisJICAgIDB4MTIyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9uZXh0X3F1ZXVlZF9zY2JfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FWFRfUVVFVUVEX1NDQl9BRERSIiwKKwkgICAgMHgxMjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NvbXBsZXRlX3NjYl9oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCX0hFQUQiLAorCSAgICAweDEyOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfY29tcGxldGVfc2NiX2RtYWlucHJvZ19oZWFkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCX0RNQUlOUFJPR19IRUFEIiwKKwkgICAgMHgxMmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2NvbXBsZXRlX2RtYV9zY2JfaGVhZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNPTVBMRVRFX0RNQV9TQ0JfSEVBRCIsCisJICAgIDB4MTJjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9xZnJlZXplX2NvdW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUZSRUVaRV9DT1VOVCIsCisJICAgIDB4MTJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zYXZlZF9tb2RlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0FWRURfTU9ERSIsCisJICAgIDB4MTMwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9tc2dfb3V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsCisJICAgIDB4MTMxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IERNQVBBUkFNU19wYXJzZV90YWJsZVtdID0geworCXsgIkZJRk9SRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiRklGT0ZMVVNIIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJESVJFQ1RJT04iLAkJMHgwNCwgMHgwNCB9LAorCXsgIkhETUFFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiSERNQUVOQUNLIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRE1BRU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNETUFFTkFDSyIsCQkweDEwLCAweDEwIH0sCisJeyAiU0NTSUVOIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJXSURFT0REIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQUkVMT0FERU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9kbWFwYXJhbXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKERNQVBBUkFNU19wYXJzZV90YWJsZSwgMTAsICJETUFQQVJBTVMiLAorCSAgICAweDEzMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTRVFfRkxBR1NfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJOT19ESVNDT05ORUNUIiwJMHgwMSwgMHgwMSB9LAorCXsgIlNQSEFTRV9QRU5ESU5HIiwJMHgwMiwgMHgwMiB9LAorCXsgIkRQSEFTRV9QRU5ESU5HIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNNRFBIQVNFX1BFTkRJTkciLAkweDA4LCAweDA4IH0sCisJeyAiVEFSR19DTURfUEVORElORyIsCTB4MTAsIDB4MTAgfSwKKwl7ICJEUEhBU0UiLAkJMHgyMCwgMHgyMCB9LAorCXsgIk5PX0NEQl9TRU5UIiwJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVF9DTURfSVNfVEFHR0VEIiwweDQwLCAweDQwIH0sCisJeyAiTk9UX0lERU5USUZJRUQiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX3NlcV9mbGFnc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTX3BhcnNlX3RhYmxlLCA5LCAiU0VRX0ZMQUdTIiwKKwkgICAgMHgxMzMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NhdmVkX3Njc2lpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsCisJICAgIDB4MTM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zYXZlZF9sdW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQVZFRF9MVU4iLAorCSAgICAweDEzNSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBMQVNUUEhBU0VfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHhlMCB9LAorCXsgIlBfREFUQU9VVF9EVCIsCTB4MjAsIDB4ZTAgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweGUwIH0sCisJeyAiUF9EQVRBSU5fRFQiLAkweDYwLCAweGUwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ZTAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhlMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0sCisJeyAiUF9CVVNGUkVFIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJNU0dJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJJT0kiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNESSIsCQkweDgwLCAweDgwIH0sCisJeyAiUEhBU0VfTUFTSyIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhkX2xhc3RwaGFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTEFTVFBIQVNFX3BhcnNlX3RhYmxlLCAxMywgIkxBU1RQSEFTRSIsCisJICAgIDB4MTM2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9xb3V0Zmlmb19lbnRyeV92YWxpZF90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGT19FTlRSWV9WQUxJRF9UQUciLAorCSAgICAweDEzNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2hhcmVkX2RhdGFfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQVJFRF9EQVRBX0FERFIiLAorCSAgICAweDEzOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfcW91dGZpZm9fbmV4dF9hZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVEZJRk9fTkVYVF9BRERSIiwKKwkgICAgMHgxM2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2tlcm5lbF90cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1RRSU5QT1MiLAorCSAgICAweDE0MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfdHFpbnBvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRRSU5QT1MiLAorCSAgICAweDE0MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBBUkdfMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNPTlRfTVNHX0xPT1BfVEFSRyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDT05UX01TR19MT09QX1JFQUQiLAkweDAzLCAweDAzIH0sCisJeyAiQ09OVF9NU0dfTE9PUF9XUklURSIsMHgwNCwgMHgwNCB9LAorCXsgIkVYSVRfTVNHX0xPT1AiLAkweDA4LCAweDA4IH0sCisJeyAiTVNHT1VUX1BIQVNFTUlTIiwJMHgxMCwgMHgxMCB9LAorCXsgIlNFTkRfUkVKIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRU5EX1NFTlNFIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTRU5EX01TRyIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhkX2FyZ18xX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihBUkdfMV9wYXJzZV90YWJsZSwgOCwgIkFSR18xIiwKKwkgICAgMHgxNDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2FyZ18yX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQVJHXzIiLAorCSAgICAweDE0MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfbGFzdF9tc2dfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsCisJICAgIDB4MTQ0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJBTFRTVElNIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFTkFVVE9BVE5QIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJNQU5VQUxQIiwJCTB4MGMsIDB4MGMgfSwKKwl7ICJFTlJTRUxJIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNFTEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIk1BTlVBTENUTCIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhkX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGUsIDYsICJTQ1NJU0VRX1RFTVBMQVRFIiwKKwkgICAgMHgxNDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX2luaXRpYXRvcl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTklUSUFUT1JfVEFHIiwKKwkgICAgMHgxNDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTMl9wYXJzZV90YWJsZVtdID0geworCXsgIlRBUkdFVF9NU0dfUEVORElORyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTRUxFQ1RPVVRfUUZST1pFTiIsCTB4MDQsIDB4MDQgfQorfTsKKworaW50CithaGRfc2VxX2ZsYWdzMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTMl9wYXJzZV90YWJsZSwgMiwgIlNFUV9GTEFHUzIiLAorCSAgICAweDE0NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfYWxsb2NmaWZvX3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkFMTE9DRklGT19TQ0JQVFIiLAorCSAgICAweDE0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaW50X2NvYWxlc2NpbmdfdGltZXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19USU1FUiIsCisJICAgIDB4MTRhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnRfY29hbGVzY2luZ19tYXhjbWRzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUFYQ01EUyIsCisJICAgIDB4MTRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9pbnRfY29hbGVzY2luZ19taW5jbWRzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UX0NPQUxFU0NJTkdfTUlOQ01EUyIsCisJICAgIDB4MTRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jbWRzX3BlbmRpbmdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTX1BFTkRJTkciLAorCSAgICAweDE0ZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfaW50X2NvYWxlc2NpbmdfY21kY291bnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJJTlRfQ09BTEVTQ0lOR19DTURDT1VOVCIsCisJICAgIDB4MTUwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9sb2NhbF9oc19tYWlsYm94X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTE9DQUxfSFNfTUFJTEJPWCIsCisJICAgIDB4MTUxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9jbWRzaXplX3RhYmxlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ01EU0laRV9UQUJMRSIsCisJICAgIDB4MTUyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfYmFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9CQVNFIiwKKwkgICAgMHgxODAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9yZXNpZHVhbF9kYXRhY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX0RBVEFDTlQiLAorCSAgICAweDE4MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ0JfUkVTSURVQUxfU0dQVFJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19MSVNUX05VTEwiLAkweDAxLCAweDAxIH0sCisJeyAiU0dfT1ZFUlJVTl9SRVNJRCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTR19BRERSX01BU0siLAkweGY4LCAweGY4IH0KK307CisKK2ludAorYWhkX3NjYl9yZXNpZHVhbF9zZ3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX1JFU0lEVUFMX1NHUFRSX3BhcnNlX3RhYmxlLCAzLCAiU0NCX1JFU0lEVUFMX1NHUFRSIiwKKwkgICAgMHgxODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9zY3NpX3N0YXR1c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJX1NUQVRVUyIsCisJICAgIDB4MTg4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfdGFyZ2V0X3BoYXNlc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfUEhBU0VTIiwKKwkgICAgMHgxODksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl90YXJnZXRfZGF0YV9kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX0RBVEFfRElSIiwKKwkgICAgMHgxOGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl90YXJnZXRfaXRhZ19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfSVRBRyIsCisJICAgIDB4MThiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2Jfc2Vuc2VfYnVzYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TRU5TRV9CVVNBRERSIiwKKwkgICAgMHgxOGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFHIiwKKwkgICAgMHgxOTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0NPTlRST0xfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTQ0JfVEFHX1RZUEUiLAkweDAzLCAweDAzIH0sCisJeyAiRElTQ09OTkVDVEVEIiwJMHgwNCwgMHgwNCB9LAorCXsgIlNUQVRVU19SQ1ZEIiwJMHgwOCwgMHgwOCB9LAorCXsgIk1LX01FU1NBR0UiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlRBR19FTkIiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkRJU0NFTkIiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVF9TQ0IiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY2JfY29udHJvbF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX0NPTlRST0xfcGFyc2VfdGFibGUsIDcsICJTQ0JfQ09OVFJPTCIsCisJICAgIDB4MTkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9TQ1NJSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJPSUQiLAkJMHgwZiwgMHgwZiB9LAorCXsgIlRJRCIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhkX3NjYl9zY3NpaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9TQ1NJSURfcGFyc2VfdGFibGUsIDIsICJTQ0JfU0NTSUlEIiwKKwkgICAgMHgxOTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0xVTl9wYXJzZV90YWJsZVtdID0geworCXsgIkxJRCIsCQkweGZmLCAweGZmIH0KK307CisKK2ludAorYWhkX3NjYl9sdW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9MVU5fcGFyc2VfdGFibGUsIDEsICJTQ0JfTFVOIiwKKwkgICAgMHgxOTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX1RBU0tfQVRUUklCVVRFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0NCX1hGRVJMRU5fT0REIiwJMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoZF9zY2JfdGFza19hdHRyaWJ1dGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9UQVNLX0FUVFJJQlVURV9wYXJzZV90YWJsZSwgMSwgIlNDQl9UQVNLX0FUVFJJQlVURSIsCisJICAgIDB4MTk1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhkX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9DREJfTEVOX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0NCX0NEQl9MRU5fUFRSIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoZF9zY2JfY2RiX2xlbl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX0NEQl9MRU5fcGFyc2VfdGFibGUsIDEsICJTQ0JfQ0RCX0xFTiIsCisJICAgIDB4MTk2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfdGFza19tYW5hZ2VtZW50X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBU0tfTUFOQUdFTUVOVCIsCisJICAgIDB4MTk3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfZGF0YXB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9EQVRBUFRSIiwKKwkgICAgMHgxOTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGRfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0RBVEFDTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19ISUdIX0FERFJfQklUUyIsCTB4N2YsIDB4N2YgfSwKKwl7ICJTR19MQVNUX1NFRyIsCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGRfc2NiX2RhdGFjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKFNDQl9EQVRBQ05UX3BhcnNlX3RhYmxlLCAyLCAiU0NCX0RBVEFDTlQiLAorCSAgICAweDFhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoZF9yZWdfcGFyc2VfZW50cnlfdCBTQ0JfU0dQVFJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19MSVNUX05VTEwiLAkweDAxLCAweDAxIH0sCisJeyAiU0dfRlVMTF9SRVNJRCIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTR19TVEFUVVNfVkFMSUQiLAkweDA0LCAweDA0IH0KK307CisKK2ludAorYWhkX3NjYl9zZ3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGRfcHJpbnRfcmVnaXN0ZXIoU0NCX1NHUFRSX3BhcnNlX3RhYmxlLCAzLCAiU0NCX1NHUFRSIiwKKwkgICAgMHgxYTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9idXNhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0JVU0FERFIiLAorCSAgICAweDFhOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2NiX25leHRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTkVYVCIsCisJICAgIDB4MWFjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoZF9zY2JfbmV4dDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTkVYVDIiLAorCSAgICAweDFhZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGRfc2NiX3NwYXJlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoZF9wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NQQVJFIiwKKwkgICAgMHgxYjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhkX3NjYl9kaXNjb25uZWN0ZWRfbGlzdHNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhkX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfRElTQ09OTkVDVEVEX0xJU1RTIiwKKwkgICAgMHgxYjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfc2VxLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfc2VxLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M0NzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9zZXEuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTEzOSBAQAorLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3OXh4LnNlcSM5NCAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzc5eHgucmVnIzcwICQKKyAqLworc3RhdGljIHVpbnQ4X3Qgc2VxcHJvZ1tdID0geworCTB4ZmYsIDB4MDIsIDB4MDYsIDB4NzgsCisJMHgwMCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAxLCAweGVhLCAweDA0LCAweDMwLAorCTB4ZmYsIDB4MDQsIDB4MGMsIDB4NzgsCisJMHgxOSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDE5LCAweGVhLCAweDA0LCAweDAwLAorCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDYwLCAweDNhLCAweDFhLCAweDY4LAorCTB4MDQsIDB4NDcsIDB4MWIsIDB4NjgsCisJMHhmZiwgMHgyMSwgMHgxYiwgMHg3MCwKKwkweDQwLCAweDRiLCAweDkyLCAweDY5LAorCTB4MDAsIDB4ZTIsIDB4NTQsIDB4NTksCisJMHg0MCwgMHg0YiwgMHg5MiwgMHg2OSwKKwkweDIwLCAweDRiLCAweDgyLCAweDY5LAorCTB4ZmMsIDB4NDIsIDB4MjQsIDB4NzgsCisJMHgxMCwgMHg0MCwgMHgyNCwgMHg3OCwKKwkweDAwLCAweGUyLCAweGM0LCAweDVkLAorCTB4MjAsIDB4NGQsIDB4MjgsIDB4NzgsCisJMHgwMCwgMHhlMiwgMHhjNCwgMHg1ZCwKKwkweDMwLCAweDNmLCAweGMwLCAweDA5LAorCTB4MzAsIDB4ZTAsIDB4MzAsIDB4NjAsCisJMHg3ZiwgMHg0YSwgMHg5NCwgMHgwOCwKKwkweDAwLCAweGUyLCAweDMyLCAweDQwLAorCTB4YzAsIDB4NGEsIDB4OTQsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OCwKKwkweDAwLCAweGUyLCAweDU2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4NjYsIDB4NTgsCisJMHgwMCwgMHhlMiwgMHgwNiwgMHg0MCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMSwgMHg1MiwgMHg2NCwgMHg3OCwKKwkweDAyLCAweDU4LCAweDUwLCAweDMxLAorCTB4ZmYsIDB4ZWEsIDB4MTAsIDB4MGIsCisJMHhmZiwgMHg5NywgMHg0ZiwgMHg3OCwKKwkweDUwLCAweDRiLCAweDRhLCAweDY4LAorCTB4YmYsIDB4M2EsIDB4NzQsIDB4MDgsCisJMHgxNCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDE0LCAweGVhLCAweDA0LCAweDAwLAorCTB4MDgsIDB4OTIsIDB4MjUsIDB4MDMsCisJMHhmZiwgMHg5MCwgMHgzZiwgMHg2OCwKKwkweDAwLCAweGUyLCAweDU2LCAweDViLAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NDAsCisJMHgwMCwgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDAxLCAweGVhLCAweDAwLCAweDMwLAorCTB4ODAsIDB4ZjksIDB4NWUsIDB4NjgsCisJMHgwMCwgMHhlMiwgMHg0MiwgMHg1OSwKKwkweDExLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MTEsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHg4MCwgMHhmOSwgMHg0MiwgMHg3OSwKKwkweGZmLCAweGVhLCAweGQ0LCAweDBkLAorCTB4MjIsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgyMiwgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDEwLCAweDE2LCAweDcwLCAweDc4LAorCTB4MDEsIDB4MGIsIDB4YTIsIDB4MzIsCisJMHgxMCwgMHgxNiwgMHgyYywgMHgwMCwKKwkweDE4LCAweGFkLCAweDAwLCAweDc5LAorCTB4MDQsIDB4YWQsIDB4Y2EsIDB4NjgsCisJMHg4MCwgMHhhZCwgMHg2NCwgMHg3OCwKKwkweDEwLCAweGFkLCAweDk4LCAweDc4LAorCTB4ZmYsIDB4ODgsIDB4ODMsIDB4NjgsCisJMHhlNywgMHhhZCwgMHg1YSwgMHgwOSwKKwkweDAyLCAweDhjLCAweDU5LCAweDMyLAorCTB4MDIsIDB4MjgsIDB4MTksIDB4MzMsCisJMHgwMiwgMHhhOCwgMHg1MCwgMHgzNiwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHg0MCwgMHgzYSwgMHg2NCwgMHg2OCwKKwkweDUwLCAweDRiLCAweDY0LCAweDY4LAorCTB4MjIsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgyMiwgMHhlYSwgMHgwMCwgMHgwMCwKKwkweGU3LCAweGFkLCAweDVhLCAweDA5LAorCTB4MDIsIDB4OGMsIDB4NTksIDB4MzIsCisJMHgxYSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDFhLCAweGVhLCAweDA0LCAweDAwLAorCTB4ZmYsIDB4ZWEsIDB4ZDQsIDB4MGQsCisJMHhlNywgMHhhZCwgMHg1YSwgMHgwOSwKKwkweDAwLCAweGUyLCAweGE2LCAweDU4LAorCTB4ZmYsIDB4ZWEsIDB4NTYsIDB4MDIsCisJMHgwNCwgMHg3YywgMHg3OCwgMHgzMiwKKwkweDIwLCAweDE2LCAweDY0LCAweDc4LAorCTB4MDQsIDB4MzgsIDB4NzksIDB4MzIsCisJMHg4MCwgMHgzNywgMHg2ZiwgMHgxNiwKKwkweGZmLCAweDJkLCAweGI1LCAweDYwLAorCTB4ZmYsIDB4MjksIDB4YjUsIDB4NjAsCisJMHg0MCwgMHg1MSwgMHhjNSwgMHg3OCwKKwkweGZmLCAweDRmLCAweGI1LCAweDY4LAorCTB4ZmYsIDB4NGQsIDB4YzEsIDB4MTksCisJMHgwMCwgMHg0ZSwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweGM0LCAweDUwLAorCTB4MDEsIDB4NGMsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHg1MCwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweGM0LCAweDQ4LAorCTB4ODAsIDB4MTgsIDB4NjQsIDB4NzgsCisJMHgwMiwgMHg0YSwgMHgxZCwgMHgzMCwKKwkweDEwLCAweGVhLCAweDE4LCAweDAwLAorCTB4NjAsIDB4MTgsIDB4MzAsIDB4MDAsCisJMHg3ZiwgMHgxOCwgMHgzMCwgMHgwYywKKwkweDAyLCAweGVhLCAweDAyLCAweDAwLAorCTB4ZmYsIDB4ZWEsIDB4YTAsIDB4MGEsCisJMHg4MCwgMHgxOCwgMHgzMCwgMHgwNCwKKwkweDQwLCAweGFkLCAweDY0LCAweDc4LAorCTB4ZTcsIDB4YWQsIDB4NWEsIDB4MDksCisJMHgwMiwgMHhhOCwgMHg0MCwgMHgzMSwKKwkweGZmLCAweGVhLCAweGMwLCAweDA5LAorCTB4MDEsIDB4NGUsIDB4OWQsIDB4MWEsCisJMHgwMCwgMHg0ZiwgMHg5ZiwgMHgyMiwKKwkweDAxLCAweDk0LCAweDZkLCAweDMzLAorCTB4MDEsIDB4ZWEsIDB4MjAsIDB4MzMsCisJMHgwNCwgMHhhYywgMHg0OSwgMHgzMiwKKwkweGZmLCAweGVhLCAweDVhLCAweDAzLAorCTB4ZmYsIDB4ZWEsIDB4NWUsIDB4MDMsCisJMHgwMSwgMHgxMCwgMHhkNCwgMHgzMSwKKwkweDEwLCAweDkyLCAweGY1LCAweDY4LAorCTB4M2QsIDB4OTMsIDB4YzUsIDB4MjksCisJMHhmZSwgMHhlMiwgMHhjNCwgMHgwOSwKKwkweDAxLCAweGVhLCAweGM2LCAweDAxLAorCTB4MDIsIDB4ZTIsIDB4YzgsIDB4MzEsCisJMHgwMiwgMHhlYywgMHg1MCwgMHgzMSwKKwkweDAyLCAweGEwLCAweGRhLCAweDMxLAorCTB4ZmYsIDB4YTksIDB4ZjQsIDB4NzAsCisJMHgwMiwgMHhhMCwgMHg1OCwgMHgzNywKKwkweGZmLCAweDIxLCAweGZkLCAweDcwLAorCTB4MDIsIDB4MjIsIDB4NTEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHg1YywgMHgzMywKKwkweDAyLCAweGEwLCAweDQ0LCAweDM2LAorCTB4MDIsIDB4YTAsIDB4NDAsIDB4MzIsCisJMHgwMiwgMHhhMCwgMHg0NCwgMHgzNiwKKwkweDA0LCAweDQ3LCAweDA1LCAweDY5LAorCTB4NDAsIDB4MTYsIDB4MzAsIDB4NjksCisJMHhmZiwgMHgyZCwgMHgzNSwgMHg2MSwKKwkweGZmLCAweDI5LCAweDY1LCAweDcwLAorCTB4MDEsIDB4MzcsIDB4YzEsIDB4MzEsCisJMHgwMiwgMHgyOCwgMHg1NSwgMHgzMiwKKwkweDAxLCAweGVhLCAweDVhLCAweDAxLAorCTB4MDQsIDB4M2MsIDB4ZjksIDB4MzAsCisJMHgwMiwgMHgyOCwgMHg1MSwgMHgzMSwKKwkweDAxLCAweGE4LCAweDYwLCAweDMxLAorCTB4MDAsIDB4YTksIDB4NjAsIDB4MDEsCisJMHgwMSwgMHgxNCwgMHhkNCwgMHgzMSwKKwkweDAxLCAweDUwLCAweGExLCAweDFhLAorCTB4ZmYsIDB4NGUsIDB4OWQsIDB4MWEsCisJMHhmZiwgMHg0ZiwgMHg5ZiwgMHgyMiwKKwkweGZmLCAweDhkLCAweDI5LCAweDcxLAorCTB4ODAsIDB4YWMsIDB4MjgsIDB4NzEsCisJMHgyMCwgMHgxNiwgMHgyOCwgMHg2OSwKKwkweDAyLCAweDhjLCAweDUxLCAweDMxLAorCTB4MDAsIDB4ZTIsIDB4MTIsIDB4NDEsCisJMHgwMSwgMHhhYywgMHgwOCwgMHgzMSwKKwkweDA5LCAweGVhLCAweDVhLCAweDAxLAorCTB4MDIsIDB4OGMsIDB4NTEsIDB4MzIsCisJMHhmZiwgMHhlYSwgMHgxYSwgMHgwNywKKwkweDA0LCAweDI0LCAweGY5LCAweDMwLAorCTB4MWQsIDB4ZWEsIDB4M2EsIDB4NDEsCisJMHgwMiwgMHgyYywgMHg1MSwgMHgzMSwKKwkweDA0LCAweGE4LCAweGY5LCAweDMwLAorCTB4MTksIDB4ZWEsIDB4M2EsIDB4NDEsCisJMHgwNiwgMHhlYSwgMHgwOCwgMHg4MSwKKwkweDAxLCAweGUyLCAweDVhLCAweDM1LAorCTB4MDIsIDB4ZjIsIDB4ZjAsIDB4MzUsCisJMHgwMiwgMHhmMiwgMHhmMCwgMHgzMSwKKwkweDAyLCAweGY4LCAweGU0LCAweDM1LAorCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCisJMHgwMSwgMHhlMiwgMHgwMCwgMHgzMCwKKwkweGZmLCAweGVhLCAweGIyLCAweDBkLAorCTB4ODAsIDB4ZWEsIDB4YjIsIDB4MDEsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKKwkweGZmLCAweGVhLCAweGIyLCAweDBkLAorCTB4MDEsIDB4ZTIsIDB4MDQsIDB4MzAsCisJMHgwMSwgMHhlYSwgMHgwNCwgMHgzNCwKKwkweDAyLCAweDIwLCAweGJkLCAweDMwLAorCTB4MDIsIDB4MjAsIDB4YjksIDB4MzAsCisJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKKwkweDRjLCAweDkzLCAweGQ3LCAweDI4LAorCTB4MTAsIDB4OTIsIDB4NjMsIDB4NzksCisJMHgwMSwgMHg2YiwgMHhjMCwgMHgzMCwKKwkweDAyLCAweDY0LCAweGM4LCAweDAwLAorCTB4NDAsIDB4M2EsIDB4NzQsIDB4MDQsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgzMCwgMHgzZiwgMHhjMCwgMHgwOSwKKwkweDMwLCAweGUwLCAweDY0LCAweDYxLAorCTB4MjAsIDB4M2YsIDB4N2EsIDB4NjksCisJMHgxMCwgMHgzZiwgMHg2NCwgMHg3OSwKKwkweDAyLCAweGVhLCAweDdlLCAweDAwLAorCTB4MDAsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgwMSwgMHhlYSwgMHgwMCwgMHgzMCwKKwkweDAyLCAweDQ4LCAweDUxLCAweDM1LAorCTB4MDEsIDB4ZWEsIDB4N2UsIDB4MDAsCisJMHgxMSwgMHhlYSwgMHg0NCwgMHg1OSwKKwkweDExLCAweGVhLCAweDAwLCAweDAwLAorCTB4MDIsIDB4NDgsIDB4NTEsIDB4MzUsCisJMHgwOCwgMHhlYSwgMHg5OCwgMHgwMCwKKwkweDA4LCAweDU3LCAweGFlLCAweDAwLAorCTB4MDgsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHhmMCwgMHg0OSwgMHg2OCwgMHgwYSwKKwkweDBmLCAweDY3LCAweGMwLCAweDA5LAorCTB4MDAsIDB4MzQsIDB4NjksIDB4MDIsCisJMHgyMCwgMHhlYSwgMHg5NiwgMHgwMCwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4NDAsIDB4M2EsIDB4YWUsIDB4NjksCisJMHgwMiwgMHg1NSwgMHgwNiwgMHg2OCwKKwkweDAyLCAweDU2LCAweGFlLCAweDY5LAorCTB4ZmYsIDB4NWIsIDB4YWUsIDB4NjEsCisJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKKwkweDgwLCAweGVhLCAweGIyLCAweDAxLAorCTB4NDQsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMSwgMHgzMywgMHhjMCwgMHgzMSwKKwkweDMzLCAweGVhLCAweDAwLCAweDAwLAorCTB4ZmYsIDB4ZWEsIDB4YjIsIDB4MDksCisJMHhmZiwgMHhlMCwgMHhjMCwgMHgxOSwKKwkweGZmLCAweGUwLCAweGIwLCAweDc5LAorCTB4MDIsIDB4YWMsIDB4NTEsIDB4MzEsCisJMHgwMCwgMHhlMiwgMHhhNiwgMHg0MSwKKwkweDAyLCAweDVlLCAweDUwLCAweDMxLAorCTB4MDIsIDB4YTgsIDB4YjgsIDB4MzAsCisJMHgwMiwgMHg1YywgMHg1MCwgMHgzMSwKKwkweGZmLCAweGFkLCAweGMxLCAweDcxLAorCTB4MDIsIDB4YWMsIDB4NDEsIDB4MzEsCisJMHgwMiwgMHgyMiwgMHg1MSwgMHgzMSwKKwkweDAyLCAweGEwLCAweDVjLCAweDMzLAorCTB4MDIsIDB4YTAsIDB4NDQsIDB4MzIsCisJMHgwMCwgMHhlMiwgMHhjYSwgMHg0MSwKKwkweDEwLCAweDkyLCAweGNiLCAweDY5LAorCTB4M2QsIDB4OTMsIDB4YzksIDB4MjksCisJMHgwMSwgMHhlNCwgMHhjOCwgMHgwMSwKKwkweDAxLCAweGVhLCAweGNhLCAweDAxLAorCTB4ZmYsIDB4ZWEsIDB4ZGEsIDB4MDEsCisJMHgwMiwgMHgyMCwgMHg1MSwgMHgzMSwKKwkweDAyLCAweGFlLCAweDQxLCAweDMyLAorCTB4ZmYsIDB4MjEsIDB4ZDMsIDB4NjEsCisJMHhmZiwgMHhlYSwgMHg0NiwgMHgwMiwKKwkweDAyLCAweDVjLCAweDUwLCAweDMxLAorCTB4NDAsIDB4ZWEsIDB4OTYsIDB4MDAsCisJMHgwMiwgMHg1NiwgMHhjYywgMHg2ZCwKKwkweDAxLCAweDU1LCAweGNjLCAweDZkLAorCTB4MTAsIDB4OTIsIDB4ZGYsIDB4NzksCisJMHgxMCwgMHg0MCwgMHhlOCwgMHg2OSwKKwkweDAxLCAweDU2LCAweGU4LCAweDc5LAorCTB4ZmYsIDB4OTcsIDB4MDcsIDB4NzgsCisJMHgxMywgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDEzLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MDYsIDB4NDAsCisJMHhiZiwgMHgzYSwgMHg3NCwgMHgwOCwKKwkweDA4LCAweGVhLCAweDk4LCAweDAwLAorCTB4MDgsIDB4NTcsIDB4YWUsIDB4MDAsCisJMHgwMSwgMHg5MywgMHg2OSwgMHgzMiwKKwkweDAxLCAweDk0LCAweDZiLCAweDMyLAorCTB4NDAsIDB4ZWEsIDB4NjYsIDB4MDIsCisJMHgwOCwgMHgzYywgMHg3OCwgMHgwMCwKKwkweDgwLCAweGVhLCAweDYyLCAweDAyLAorCTB4MDAsIDB4ZTIsIDB4YjgsIDB4NWIsCisJMHgwMSwgMHgzNiwgMHhjMSwgMHgzMSwKKwkweDlmLCAweGUwLCAweDRjLCAweDdjLAorCTB4ODAsIDB4ZTAsIDB4MGMsIDB4NzIsCisJMHhhMCwgMHhlMCwgMHg0NCwgMHg3MiwKKwkweGMwLCAweGUwLCAweDNhLCAweDcyLAorCTB4ZTAsIDB4ZTAsIDB4NzQsIDB4NzIsCisJMHgwMSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAxLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHg4MCwgMHgzMywgMHgxMywgMHg3YSwKKwkweDAzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHhlZSwgMHgwMCwgMHgxYSwgMHg2YSwKKwkweDA1LCAweGVhLCAweGI0LCAweDAwLAorCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDAyLCAweGE4LCAweDkwLCAweDMyLAorCTB4MDAsIDB4ZTIsIDB4NmEsIDB4NTksCisJMHhlZiwgMHg5NiwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweDJhLCAweDUyLAorCTB4MDksIDB4ODAsIDB4ZTEsIDB4MzAsCisJMHgwMiwgMHhlYSwgMHgzNiwgMHgwMCwKKwkweGE4LCAweGVhLCAweDMyLCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MzAsIDB4NDIsCisJMHgwMSwgMHg5NiwgMHhkMSwgMHgzMCwKKwkweDEwLCAweDgwLCAweDg5LCAweDMxLAorCTB4MjAsIDB4ZWEsIDB4MzIsIDB4MDAsCisJMHhiZiwgMHgzMywgMHg2NywgMHgwYSwKKwkweDIwLCAweDE5LCAweDMyLCAweDZhLAorCTB4MDIsIDB4NGQsIDB4ZjgsIDB4NjksCisJMHg0MCwgMHgzMywgMHg2NywgMHgwMiwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4ODAsIDB4MzMsIDB4YjUsIDB4NmEsCisJMHgwMSwgMHg0NCwgMHgxMCwgMHgzMywKKwkweDA4LCAweDkyLCAweDI1LCAweDAzLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgxMCwgMHhlYSwgMHg4MCwgMHgwMCwKKwkweDAxLCAweDMxLCAweGM1LCAweDMxLAorCTB4ODAsIDB4ZTIsIDB4NjAsIDB4NjIsCisJMHgxMCwgMHg5MiwgMHg4NSwgMHg2YSwKKwkweGMwLCAweDk0LCAweGM1LCAweDAxLAorCTB4NDAsIDB4OTIsIDB4NTEsIDB4NmEsCisJMHhiZiwgMHhlMiwgMHhjNCwgMHgwOSwKKwkweDIwLCAweDkyLCAweDY1LCAweDdhLAorCTB4MDEsIDB4ZTIsIDB4ODgsIDB4MzAsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKKwkweGEwLCAweDM2LCAweDZkLCAweDYyLAorCTB4MjMsIDB4OTIsIDB4ODksIDB4MDgsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKKwkweGEwLCAweDM2LCAweDZkLCAweDYyLAorCTB4MDAsIDB4YTgsIDB4NjQsIDB4NDIsCisJMHhmZiwgMHhlMiwgMHg2NCwgMHg2MiwKKwkweDAwLCAweGUyLCAweDg0LCAweDQyLAorCTB4NDAsIDB4ZWEsIDB4OTgsIDB4MDAsCisJMHgwMSwgMHhlMiwgMHg4OCwgMHgzMCwKKwkweDAwLCAweGUyLCAweGI4LCAweDViLAorCTB4YTAsIDB4MzYsIDB4NDMsIDB4NzIsCisJMHg0MCwgMHhlYSwgMHg5OCwgMHgwMCwKKwkweDAxLCAweDMxLCAweDg5LCAweDMyLAorCTB4MDgsIDB4ZWEsIDB4NjIsIDB4MDIsCisJMHgwMCwgMHhlMiwgMHhmOCwgMHg0MSwKKwkweGUwLCAweGVhLCAweGQ0LCAweDViLAorCTB4ODAsIDB4ZTAsIDB4YzAsIDB4NmEsCisJMHgwNCwgMHhlMCwgMHg2NiwgMHg3MywKKwkweDAyLCAweGUwLCAweDk2LCAweDczLAorCTB4MDAsIDB4ZWEsIDB4MWUsIDB4NzMsCisJMHgwMywgMHhlMCwgMHhhNiwgMHg3MywKKwkweDIzLCAweGUwLCAweDk2LCAweDcyLAorCTB4MDgsIDB4ZTAsIDB4YmMsIDB4NzIsCisJMHgwMCwgMHhlMiwgMHhiOCwgMHg1YiwKKwkweDA3LCAweGVhLCAweDUwLCAweDU5LAorCTB4MDcsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHgwOCwgMHg0MiwgMHhmOSwgMHg3MSwKKwkweDA0LCAweDQyLCAweDkzLCAweDYyLAorCTB4MDEsIDB4NDMsIDB4ODksIDB4MzAsCisJMHgwMCwgMHhlMiwgMHg4NCwgMHg0MiwKKwkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAorCTB4MDAsIDB4ZTIsIDB4ODQsIDB4NDIsCisJMHgwMSwgMHgwMCwgMHg2MCwgMHgzMiwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHg0YywgMHgzNCwgMHhjMSwgMHgyOCwKKwkweDAxLCAweDY0LCAweGMwLCAweDMxLAorCTB4MDAsIDB4MzAsIDB4NDUsIDB4NTksCisJMHgwMSwgMHgzMCwgMHgwMSwgMHgzMCwKKwkweDAxLCAweGUwLCAweGJhLCAweDdhLAorCTB4YTAsIDB4ZWEsIDB4Y2EsIDB4NWIsCisJMHgwMSwgMHhhMCwgMHhiYSwgMHg2MiwKKwkweDAxLCAweDg0LCAweGFmLCAweDdhLAorCTB4MDEsIDB4OTUsIDB4YmQsIDB4NmEsCisJMHgwNSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDA1LCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCisJMHgwMywgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDAzLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4YmMsIDB4NDIsCisJMHgwNywgMHhlYSwgMHhkYywgMHg1YiwKKwkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgzZiwgMHhlMCwgMHg2YSwgMHgwYSwKKwkweGMwLCAweDM0LCAweGMxLCAweDA5LAorCTB4MDAsIDB4MzUsIDB4NTEsIDB4MDEsCisJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKKwkweDMwLCAweDM0LCAweGM1LCAweDA5LAorCTB4M2QsIDB4ZTIsIDB4YzQsIDB4MjksCisJMHhiOCwgMHhlMiwgMHhjNCwgMHgxOSwKKwkweDAxLCAweGVhLCAweGM2LCAweDAxLAorCTB4MDIsIDB4ZTIsIDB4YzgsIDB4MzEsCisJMHgwMiwgMHhlYywgMHg0MCwgMHgzMSwKKwkweGZmLCAweGExLCAweGRjLCAweDcyLAorCTB4MDIsIDB4ZTgsIDB4ZGEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHg1MCwgMHgzMSwKKwkweDAwLCAweGUyLCAweGZlLCAweDQyLAorCTB4ODAsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKKwkweDAwLCAweGUyLCAweGI4LCAweDViLAorCTB4MDEsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHhlMCwgMHgzNiwgMHgxOSwgMHg2MywKKwkweDAyLCAweDMzLCAweDY3LCAweDAyLAorCTB4MjAsIDB4NDYsIDB4MTIsIDB4NjMsCisJMHhmZiwgMHhlYSwgMHg1MiwgMHgwOSwKKwkweGE4LCAweGVhLCAweGNhLCAweDViLAorCTB4MDQsIDB4OTIsIDB4ZjksIDB4N2EsCisJMHgwMSwgMHgzNCwgMHhjMSwgMHgzMSwKKwkweDAwLCAweDkzLCAweGY5LCAweDYyLAorCTB4MDEsIDB4MzUsIDB4YzEsIDB4MzEsCisJMHgwMCwgMHg5NCwgMHgwMywgMHg3MywKKwkweDAxLCAweGE5LCAweDUyLCAweDExLAorCTB4ZmYsIDB4YTksIDB4ZWUsIDB4NmEsCisJMHgwMCwgMHhlMiwgMHgxMiwgMHg0MywKKwkweDEwLCAweDMzLCAweDY3LCAweDAyLAorCTB4MDQsIDB4OTIsIDB4MTMsIDB4N2IsCisJMHhmYiwgMHg5MiwgMHgyNSwgMHgwYiwKKwkweGZmLCAweGVhLCAweDY2LCAweDBhLAorCTB4MDEsIDB4YTQsIDB4MGQsIDB4NmIsCisJMHgwMiwgMHhhOCwgMHg5MCwgMHgzMiwKKwkweDAwLCAweGUyLCAweDZhLCAweDU5LAorCTB4MTAsIDB4OTIsIDB4YmQsIDB4N2EsCisJMHhmZiwgMHhlYSwgMHhkYywgMHg1YiwKKwkweDAwLCAweGUyLCAweGJjLCAweDQyLAorCTB4MDQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwNCwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweGJjLCAweDQyLAorCTB4MDQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwNCwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4MDgsIDB4OTIsIDB4YjUsIDB4N2EsCisJMHhjMCwgMHgzMywgMHgyOSwgMHg3YiwKKwkweDgwLCAweDMzLCAweGI1LCAweDZhLAorCTB4ZmYsIDB4ODgsIDB4MjksIDB4NmIsCisJMHg0MCwgMHgzMywgMHhiNSwgMHg2YSwKKwkweDEwLCAweDkyLCAweDJmLCAweDdiLAorCTB4MGEsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwYSwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweDRlLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4ODIsIDB4NDMsCisJMHg1MCwgMHg0YiwgMHgzNiwgMHg2YiwKKwkweGJmLCAweDNhLCAweDc0LCAweDA4LAorCTB4MDEsIDB4ZTAsIDB4ZjQsIDB4MzEsCisJMHhmZiwgMHhlYSwgMHhjMCwgMHgwOSwKKwkweDAxLCAweDJlLCAweDVkLCAweDFhLAorCTB4MDAsIDB4MmYsIDB4NWYsIDB4MjIsCisJMHgwNCwgMHg0NywgMHg4ZiwgMHgwMiwKKwkweDAxLCAweGZhLCAweGMwLCAweDM1LAorCTB4MDIsIDB4YTgsIDB4ODQsIDB4MzIsCisJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHg0MiwgMHg1MSwgMHgzMSwKKwkweGZmLCAweDkwLCAweDY1LCAweDY4LAorCTB4ZmYsIDB4ODgsIDB4NWIsIDB4NmIsCisJMHgwMSwgMHhhNCwgMHg1NywgMHg2YiwKKwkweDAyLCAweGE0LCAweDVmLCAweDZiLAorCTB4MDEsIDB4ODQsIDB4NWYsIDB4N2IsCisJMHgwMiwgMHgyOCwgMHgxOSwgMHgzMywKKwkweDAyLCAweGE4LCAweDUwLCAweDM2LAorCTB4ZmYsIDB4ODgsIDB4NWYsIDB4NzMsCisJMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweDAyLCAweGE4LCAweDIwLCAweDMzLAorCTB4MDIsIDB4MmMsIDB4MTksIDB4MzMsCisJMHgwMiwgMHhhOCwgMHg1OCwgMHgzMiwKKwkweDA0LCAweGE0LCAweDQ5LCAweDA3LAorCTB4YzAsIDB4MzMsIDB4YjUsIDB4NmEsCisJMHgwNCwgMHg5MiwgMHgyNSwgMHgwMywKKwkweDIwLCAweDkyLCAweDgzLCAweDZiLAorCTB4MDIsIDB4YTgsIDB4NDAsIDB4MzEsCisJMHhjMCwgMHgzNCwgMHhjMSwgMHgwOSwKKwkweDAwLCAweDM1LCAweDUxLCAweDAxLAorCTB4ZmYsIDB4ZWEsIDB4NTIsIDB4MDksCisJMHgzMCwgMHgzNCwgMHhjNSwgMHgwOSwKKwkweDNkLCAweGUyLCAweGM0LCAweDI5LAorCTB4YjgsIDB4ZTIsIDB4YzQsIDB4MTksCisJMHgwMSwgMHhlYSwgMHhjNiwgMHgwMSwKKwkweDAyLCAweGUyLCAweGM4LCAweDMxLAorCTB4MDIsIDB4YTAsIDB4ZGEsIDB4MzEsCisJMHgwMiwgMHhhMCwgMHg1MCwgMHgzMSwKKwkweGY3LCAweDU3LCAweGFlLCAweDA4LAorCTB4MDgsIDB4ZWEsIDB4OTgsIDB4MDAsCisJMHgwMSwgMHg0NCwgMHhkNCwgMHgzMSwKKwkweGVlLCAweDAwLCAweDhjLCAweDZiLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHhiNCwgMHg1YiwKKwkweDA5LCAweDRjLCAweDhlLCAweDdiLAorCTB4MDgsIDB4NGMsIDB4MDYsIDB4NjgsCisJMHgwYiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDBiLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDEsIDB4NDQsIDB4ZDQsIDB4MzEsCisJMHgyMCwgMHgzMywgMHhmOSwgMHg3OSwKKwkweDAwLCAweGUyLCAweDllLCAweDViLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMSwgMHg4NCwgMHhhMywgMHg3YiwKKwkweDAxLCAweGE0LCAweDQ5LCAweDA3LAorCTB4MDgsIDB4NjAsIDB4MzAsIDB4MzMsCisJMHgwOCwgMHg4MCwgMHg0MSwgMHgzNywKKwkweGRmLCAweDMzLCAweDY3LCAweDBhLAorCTB4ZWUsIDB4MDAsIDB4YjAsIDB4NmIsCisJMHgwNSwgMHhlYSwgMHhiNCwgMHgwMCwKKwkweDMzLCAweGVhLCAweDQ0LCAweDU5LAorCTB4MzMsIDB4ZWEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHg2YSwgMHg1OSwKKwkweDAwLCAweGUyLCAweGJjLCAweDQyLAorCTB4MDEsIDB4ZWEsIDB4NmMsIDB4MDIsCisJMHhjMCwgMHhlYSwgMHg2NiwgMHgwNiwKKwkweGZmLCAweDQyLCAweGM0LCAweDZiLAorCTB4MDEsIDB4NDEsIDB4YjgsIDB4NmIsCisJMHgwMiwgMHg0MSwgMHhiOCwgMHg3YiwKKwkweGZmLCAweDQyLCAweGM0LCAweDZiLAorCTB4MDEsIDB4NDEsIDB4YjgsIDB4NmIsCisJMHgwMiwgMHg0MSwgMHhiOCwgMHg3YiwKKwkweGZmLCAweDQyLCAweGM0LCAweDdiLAorCTB4MDQsIDB4NGMsIDB4YjgsIDB4NmIsCisJMHhlMCwgMHg0MSwgMHg2YywgMHgwZSwKKwkweDAxLCAweDQ0LCAweGQ0LCAweDMxLAorCTB4ZmYsIDB4NDIsIDB4Y2MsIDB4N2IsCisJMHgwNCwgMHg0YywgMHhjYywgMHg2YiwKKwkweGUwLCAweDQxLCAweDZjLCAweDBhLAorCTB4ZTAsIDB4MzYsIDB4ZjksIDB4NjEsCisJMHhmZiwgMHhlYSwgMHhjYSwgMHgwOSwKKwkweDAxLCAweGUyLCAweGM4LCAweDMxLAorCTB4MDEsIDB4NDYsIDB4ZGEsIDB4MzUsCisJMHgwMSwgMHg0NCwgMHhkNCwgMHgzNSwKKwkweDEwLCAweGVhLCAweDgwLCAweDAwLAorCTB4MDEsIDB4ZTIsIDB4NjIsIDB4MzYsCisJMHgwNCwgMHhhNiwgMHhlNCwgMHg3YiwKKwkweGZmLCAweGVhLCAweDVhLCAweDA5LAorCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MGQsCisJMHgwMSwgMHhhNiwgMHgwMiwgMHg2YywKKwkweDEwLCAweGFkLCAweDY0LCAweDc4LAorCTB4ODAsIDB4YWQsIDB4ZmEsIDB4NmIsCisJMHgwOCwgMHhhZCwgMHg2NCwgMHg2OCwKKwkweDA0LCAweDg0LCAweGY5LCAweDMwLAorCTB4MDAsIDB4ZWEsIDB4MDgsIDB4ODEsCisJMHhmZiwgMHhlYSwgMHhkNCwgMHgwOSwKKwkweDAyLCAweDg0LCAweGY5LCAweDg4LAorCTB4MGQsIDB4ZWEsIDB4NWEsIDB4MDEsCisJMHgwNCwgMHhhNiwgMHg0YywgMHgwNSwKKwkweDA0LCAweGE2LCAweDY0LCAweDc4LAorCTB4ZmYsIDB4ZWEsIDB4NWEsIDB4MDksCisJMHgwMywgMHg4NCwgMHg1OSwgMHg4OSwKKwkweDAzLCAweGVhLCAweDRjLCAweDAxLAorCTB4ODAsIDB4MWEsIDB4NjQsIDB4NzgsCisJMHgwOCwgMHgxOSwgMHg2NCwgMHg3OCwKKwkweDA4LCAweGIwLCAweGUwLCAweDMwLAorCTB4MDQsIDB4YjAsIDB4ZTAsIDB4MzAsCisJMHgwMywgMHhiMCwgMHhmMCwgMHgzMCwKKwkweDAxLCAweGIwLCAweDA2LCAweDMzLAorCTB4N2YsIDB4ODMsIDB4ZTksIDB4MDgsCisJMHgwNCwgMHhhYywgMHg1OCwgMHgxOSwKKwkweGZmLCAweGVhLCAweGMwLCAweDA5LAorCTB4MDQsIDB4ODQsIDB4MDksIDB4OWIsCisJMHgwMCwgMHg4NSwgMHgwYiwgMHgyMywKKwkweDAwLCAweDg2LCAweDBkLCAweDIzLAorCTB4MDAsIDB4ODcsIDB4MGYsIDB4MjMsCisJMHgwMSwgMHg4NCwgMHhjNSwgMHgzMSwKKwkweDgwLCAweDgzLCAweDI1LCAweDdjLAorCTB4MDIsIDB4ZTIsIDB4YzQsIDB4MDEsCisJMHhmZiwgMHhlYSwgMHg0YywgMHgwOSwKKwkweDAxLCAweGUyLCAweDM2LCAweDMwLAorCTB4YzgsIDB4MTksIDB4MzIsIDB4MDAsCisJMHg4OCwgMHgxOSwgMHgzMiwgMHgwMCwKKwkweDAxLCAweGFjLCAweGQ0LCAweDk5LAorCTB4MDAsIDB4ZTIsIDB4NjQsIDB4NTAsCisJMHhmZSwgMHhhNiwgMHg0YywgMHgwZCwKKwkweDBiLCAweDk4LCAweGUxLCAweDMwLAorCTB4ZmQsIDB4YTQsIDB4NDksIDB4MDksCisJMHg4MCwgMHhhMywgMHgzOSwgMHg3YywKKwkweDAyLCAweGE0LCAweDQ4LCAweDAxLAorCTB4MDEsIDB4YTQsIDB4MzYsIDB4MzAsCisJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKKwkweGZkLCAweGE0LCAweDQ5LCAweDBiLAorCTB4MDUsIDB4YTMsIDB4MDcsIDB4MzMsCisJMHg4MCwgMHg4MywgMHg0NSwgMHg2YywKKwkweDAyLCAweGVhLCAweDRjLCAweDA1LAorCTB4ZmYsIDB4ZWEsIDB4NGMsIDB4MGQsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKKwkweDAyLCAweGE2LCAweGU2LCAweDZiLAorCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDUsCisJMHhjMCwgMHgzMywgMHg1MywgMHg3YywKKwkweDAzLCAweGVhLCAweDUwLCAweDU5LAorCTB4MDMsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHgyMCwgMHgzMywgMHg3NywgMHg3YywKKwkweDAxLCAweDg0LCAweDVkLCAweDZjLAorCTB4MDYsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgwNiwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweDdhLCAweDQ0LAorCTB4MDEsIDB4MDAsIDB4NjAsIDB4MzIsCisJMHhlZSwgMHgwMCwgMHg2NiwgMHg2YywKKwkweDA1LCAweGVhLCAweGI0LCAweDAwLAorCTB4MzMsIDB4ZWEsIDB4NDQsIDB4NTksCisJMHgzMywgMHhlYSwgMHgwMCwgMHgwMCwKKwkweDgwLCAweDNkLCAweDdhLCAweDAwLAorCTB4ZmMsIDB4NDIsIDB4NjgsIDB4N2MsCisJMHg3ZiwgMHgzZCwgMHg3YSwgMHgwOCwKKwkweDAwLCAweDMwLCAweDQ1LCAweDU5LAorCTB4MDEsIDB4MzAsIDB4MDEsIDB4MzAsCisJMHgwOSwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDA5LCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMSwgMHhhNCwgMHg1ZCwgMHg2YywKKwkweDAwLCAweGUyLCAweDMwLCAweDVjLAorCTB4MjAsIDB4MzMsIDB4NjcsIDB4MDIsCisJMHgwMSwgMHgwMCwgMHg2MCwgMHgzMiwKKwkweDAyLCAweGE2LCAweDgyLCAweDdjLAorCTB4MDAsIDB4ZTIsIDB4NDYsIDB4NWMsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKKwkweDAwLCAweGUyLCAweDY2LCAweDU4LAorCTB4MDAsIDB4ZTIsIDB4M2EsIDB4NTgsCisJMHgwMCwgMHgzMCwgMHg0NSwgMHg1OSwKKwkweDAxLCAweDMwLCAweDAxLCAweDMwLAorCTB4MjAsIDB4MTksIDB4ODIsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHhiMiwgMHg1YywKKwkweDA0LCAweDE5LCAweDljLCAweDZjLAorCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCisJMHgwMSwgMHg4NCwgMHg5ZCwgMHg3YywKKwkweDAxLCAweDFiLCAweDk2LCAweDdjLAorCTB4MDEsIDB4MWEsIDB4OWMsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHg0YywgMHg0NCwKKwkweDgwLCAweDRiLCAweGEyLCAweDZjLAorCTB4MDEsIDB4NGMsIDB4OWUsIDB4N2MsCisJMHgwMywgMHg0MiwgMHg0YywgMHg2YywKKwkweDAwLCAweGUyLCAweGUwLCAweDViLAorCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCisJMHgwNCwgMHgzMywgMHhmOSwgMHg3OSwKKwkweDAwLCAweGUyLCAweGY4LCAweDQxLAorCTB4MDgsIDB4NWQsIDB4YmEsIDB4NmMsCisJMHgwMCwgMHhlMiwgMHg1NiwgMHg1OCwKKwkweDAwLCAweDMwLCAweDQ1LCAweDU5LAorCTB4MDEsIDB4MzAsIDB4MDEsIDB4MzAsCisJMHgwMiwgMHgxYiwgMHhhYSwgMHg3YywKKwkweDA4LCAweDVkLCAweGI4LCAweDdjLAorCTB4MDMsIDB4NjgsIDB4MDAsIDB4MzcsCisJMHgwMSwgMHg4NCwgMHgwOSwgMHgwNywKKwkweDgwLCAweDFiLCAweGM0LCAweDdjLAorCTB4ODAsIDB4ODQsIDB4YzUsIDB4NmMsCisJMHhmZiwgMHg4NSwgMHgwYiwgMHgxYiwKKwkweGZmLCAweDg2LCAweDBkLCAweDIzLAorCTB4ZmYsIDB4ODcsIDB4MGYsIDB4MjMsCisJMHhmOCwgMHgxYiwgMHgwOCwgMHgwYiwKKwkweGZmLCAweGVhLCAweDA2LCAweDBiLAorCTB4MDMsIDB4NjgsIDB4MDAsIDB4MzcsCisJMHgwMCwgMHhlMiwgMHhjNCwgMHg1OCwKKwkweDEwLCAweGVhLCAweDE4LCAweDAwLAorCTB4ZjksIDB4ZDksIDB4YjIsIDB4MGQsCisJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKKwkweDAxLCAweDUyLCAweDQ4LCAweDMxLAorCTB4MjAsIDB4YTQsIDB4ZWUsIDB4N2MsCisJMHgyMCwgMHg1YiwgMHhlZSwgMHg3YywKKwkweDgwLCAweGY5LCAweGZjLCAweDdjLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDAsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMCwKKwkweDA0LCAweDE5LCAweDA4LCAweDdkLAorCTB4ZGYsIDB4MTksIDB4MzIsIDB4MDgsCisJMHg2MCwgMHg1YiwgMHhlNiwgMHg2YywKKwkweDAxLCAweDRjLCAweGUyLCAweDdjLAorCTB4MjAsIDB4MTksIDB4MzIsIDB4MDAsCisJMHgwMSwgMHhkOSwgMHhiMiwgMHgwNSwKKwkweDAyLCAweGVhLCAweGI0LCAweDAwLAorCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCisJMHgxMCwgMHg1YiwgMHgwMCwgMHg2ZCwKKwkweDA4LCAweDViLCAweDBhLCAweDZkLAorCTB4MjAsIDB4NWIsIDB4ZmEsIDB4NmMsCisJMHgwMiwgMHg1YiwgMHgyYSwgMHg2ZCwKKwkweDBlLCAweGVhLCAweDUwLCAweDU5LAorCTB4MGUsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHg4MCwgMHhmOSwgMHhlYSwgMHg2YywKKwkweGRmLCAweDVjLCAweGI4LCAweDA4LAorCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCisJMHgwMSwgMHhhNCwgMHhlNSwgMHg2ZCwKKwkweDAwLCAweGUyLCAweDMwLCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4MzQsIDB4NWQsCisJMHgwMSwgMHg5MCwgMHgyMSwgMHgxYiwKKwkweDAxLCAweGQ5LCAweGIyLCAweDA1LAorCTB4MDAsIDB4ZTIsIDB4MzIsIDB4NWIsCisJMHhmMywgMHg5NiwgMHhkNSwgMHgxOSwKKwkweDAwLCAweGUyLCAweDE4LCAweDU1LAorCTB4ODAsIDB4OTYsIDB4MTksIDB4NmQsCisJMHgwZiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDBmLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MjAsIDB4NDUsCisJMHgwNCwgMHg4YywgMHhlMSwgMHgzMCwKKwkweDAxLCAweGVhLCAweGYyLCAweDAwLAorCTB4MDIsIDB4ZWEsIDB4MzYsIDB4MDAsCisJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKKwkweGZmLCAweDk3LCAweDI3LCAweDdkLAorCTB4MTQsIDB4ZWEsIDB4NTAsIDB4NTksCisJMHgxNCwgMHhlYSwgMHgwNCwgMHgwMCwKKwkweDAwLCAweGUyLCAweDk2LCAweDVkLAorCTB4MDEsIDB4ZDksIDB4YjIsIDB4MDUsCisJMHgwOSwgMHg4MCwgMHhlMSwgMHgzMCwKKwkweDAyLCAweGVhLCAweDM2LCAweDAwLAorCTB4YTgsIDB4ZWEsIDB4MzIsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHg4ZSwgMHg1ZCwKKwkweDAxLCAweGQ5LCAweGIyLCAweDA1LAorCTB4MDIsIDB4YTYsIDB4NDQsIDB4N2QsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKKwkweDIwLCAweDViLCAweDUyLCAweDZkLAorCTB4ZmMsIDB4NDIsIDB4M2UsIDB4N2QsCisJMHgxMCwgMHg0MCwgMHg0MCwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDQyLCAweDdkLAorCTB4MDgsIDB4NWQsIDB4NTIsIDB4NmQsCisJMHgwMiwgMHhhNiwgMHhlNiwgMHg2YiwKKwkweDAwLCAweGUyLCAweDNlLCAweDU5LAorCTB4MjAsIDB4NWIsIDB4NTIsIDB4NmQsCisJMHgwMSwgMHgxYiwgMHg3MiwgMHg2ZCwKKwkweGZjLCAweDQyLCAweDRlLCAweDdkLAorCTB4MTAsIDB4NDAsIDB4NTAsIDB4NmQsCisJMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKKwkweDA4LCAweDVkLCAweDY0LCAweDc4LAorCTB4MDIsIDB4MTksIDB4MzIsIDB4MDAsCisJMHgwMSwgMHg1YiwgMHg0MCwgMHgzMSwKKwkweDAwLCAweGUyLCAweGIyLCAweDVjLAorCTB4MDAsIDB4ZTIsIDB4OWUsIDB4NWIsCisJMHgyMCwgMHhlYSwgMHhiNiwgMHgwMCwKKwkweDAwLCAweGUyLCAweGUwLCAweDViLAorCTB4MjAsIDB4NWMsIDB4YjgsIDB4MDAsCisJMHgwNCwgMHgxOSwgMHg2OCwgMHg2ZCwKKwkweDAxLCAweDFhLCAweDY4LCAweDZkLAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCisJMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4MjAsIDB4YTAsIDB4Y2MsIDB4N2QsCisJMHhmZiwgMHg5MCwgMHgyMSwgMHgxYiwKKwkweDA4LCAweDkyLCAweDQzLCAweDZiLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCisJMHgwMSwgMHhhNCwgMHg0OSwgMHgwMywKKwkweDQwLCAweDViLCAweDgyLCAweDZkLAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCisJMHg0MCwgMHg1YiwgMHg4MiwgMHg2ZCwKKwkweDA0LCAweDVkLCAweGU2LCAweDdkLAorCTB4MDEsIDB4MWEsIDB4ZTYsIDB4N2QsCisJMHgyMCwgMHg0ZCwgMHg2NCwgMHg3OCwKKwkweDQwLCAweDViLCAweGNjLCAweDdkLAorCTB4MDQsIDB4NWQsIDB4ZTYsIDB4N2QsCisJMHgwMSwgMHgxYSwgMHhlNiwgMHg3ZCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCisJMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDAyLCAweGVhLCAweGI0LCAweDA0LAorCTB4MDAsIDB4ZTIsIDB4M2UsIDB4NTksCisJMHgwMSwgMHgxYiwgMHg2NCwgMHg3OCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4MDIsIDB4ZWEsIDB4YjQsIDB4MDQsCisJMHgwMCwgMHhlMiwgMHgzZSwgMHg1OSwKKwkweDAxLCAweDFiLCAweGFhLCAweDZkLAorCTB4NDAsIDB4NWIsIDB4YjgsIDB4N2QsCisJMHgwMSwgMHgxYiwgMHhhYSwgMHg2ZCwKKwkweDAyLCAweDE5LCAweDMyLCAweDAwLAorCTB4MDEsIDB4MWEsIDB4NjQsIDB4NzgsCisJMHg4MCwgMHhmOSwgMHhmMiwgMHgwMSwKKwkweGZmLCAweGVhLCAweDEwLCAweDAzLAorCTB4MDgsIDB4OTIsIDB4MjUsIDB4MDMsCisJMHgwMCwgMHhlMiwgMHg0MiwgMHg0MywKKwkweDAxLCAweDFhLCAweGI0LCAweDdkLAorCTB4NDAsIDB4NWIsIDB4YjAsIDB4N2QsCisJMHgwMSwgMHgxYSwgMHg5ZSwgMHg2ZCwKKwkweGZjLCAweDQyLCAweDY0LCAweDc4LAorCTB4MDEsIDB4MWEsIDB4YjgsIDB4NmQsCisJMHgxMCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDEwLCAweGVhLCAweDA0LCAweDAwLAorCTB4ZmMsIDB4NDIsIDB4NjQsIDB4NzgsCisJMHgxMCwgMHg0MCwgMHhiZSwgMHg2ZCwKKwkweDIwLCAweDRkLCAweDY0LCAweDc4LAorCTB4NDAsIDB4NWIsIDB4OWUsIDB4NmQsCisJMHgwMSwgMHgxYSwgMHg2NCwgMHg3OCwKKwkweDAxLCAweDkwLCAweDIxLCAweDFiLAorCTB4MzAsIDB4M2YsIDB4YzAsIDB4MDksCisJMHgzMCwgMHhlMCwgMHg2NCwgMHg2MCwKKwkweDQwLCAweDRiLCAweDY0LCAweDY4LAorCTB4ZmYsIDB4ZWEsIDB4NTIsIDB4MDEsCisJMHhlZSwgMHgwMCwgMHhkMiwgMHg2ZCwKKwkweDgwLCAweGY5LCAweGYyLCAweDAxLAorCTB4ZmYsIDB4OTAsIDB4MjEsIDB4MWIsCisJMHgwMiwgMHhlYSwgMHhiNCwgMHgwMCwKKwkweDIwLCAweGVhLCAweDlhLCAweDAwLAorCTB4ZjMsIDB4NDIsIDB4ZGUsIDB4NmQsCisJMHgxMiwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDEyLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwZCwgMHhlYSwgMHg1MCwgMHg1OSwKKwkweDBkLCAweGVhLCAweDA0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4ZjgsIDB4NDEsCisJMHgwMSwgMHg5MCwgMHgyMSwgMHgxYiwKKwkweDExLCAweGVhLCAweDUwLCAweDU5LAorCTB4MTEsIDB4ZWEsIDB4MDQsIDB4MDAsCisJMHgwMCwgMHhlMiwgMHgzMiwgMHg1YiwKKwkweDA4LCAweDVhLCAweGI0LCAweDAwLAorCTB4MDAsIDB4ZTIsIDB4MGMsIDB4NWUsCisJMHhhOCwgMHhlYSwgMHgzMiwgMHgwMCwKKwkweDAwLCAweGUyLCAweDNlLCAweDU5LAorCTB4ODAsIDB4MWEsIDB4ZmEsIDB4N2QsCisJMHgwMCwgMHhlMiwgMHgwYywgMHg1ZSwKKwkweDgwLCAweDE5LCAweDMyLCAweDAwLAorCTB4NDAsIDB4NWIsIDB4MDAsIDB4NmUsCisJMHgwOCwgMHg1YSwgMHgwMCwgMHg3ZSwKKwkweDIwLCAweDRkLCAweDY0LCAweDc4LAorCTB4MDIsIDB4ODQsIDB4MDksIDB4MDMsCisJMHg0MCwgMHg1YiwgMHhjYywgMHg3ZCwKKwkweGZmLCAweDkwLCAweDIxLCAweDFiLAorCTB4ODAsIDB4ZjksIDB4ZjIsIDB4MDEsCisJMHgwOCwgMHg5MiwgMHg0MywgMHg2YiwKKwkweDAyLCAweGVhLCAweGI0LCAweDA0LAorCTB4MDEsIDB4MzgsIDB4ZTEsIDB4MzAsCisJMHgwNSwgMHgzOSwgMHhlMywgMHg5OCwKKwkweDAxLCAweGUwLCAweGY0LCAweDMxLAorCTB4ZmYsIDB4ZWEsIDB4YzAsIDB4MDksCisJMHgwMCwgMHgzYSwgMHhlNSwgMHgyMCwKKwkweDAwLCAweDNiLCAweGU3LCAweDIwLAorCTB4MDEsIDB4ZmEsIDB4YzAsIDB4MzEsCisJMHgwNCwgMHhlYSwgMHhlOCwgMHgzMCwKKwkweGZmLCAweGVhLCAweGYwLCAweDA4LAorCTB4MDIsIDB4ZWEsIDB4ZjIsIDB4MDAsCisJMHhmZiwgMHhlYSwgMHhmNCwgMHgwYworfTsKKwordHlwZWRlZiBpbnQgYWhkX3BhdGNoX2Z1bmNfdCAoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIyX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIyX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIxX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIxX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9QS1RfQklUQlVDS0VUX0JVRykgPT0gMCk7Cit9CisKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDIwX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDIwX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+ZmVhdHVyZXMgJiBBSERfUlRJKSA9PSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTlfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMTlfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9JTklUSUFUT1JST0xFKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMThfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMThfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTdfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMTdfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0FVVE9GTFVTSF9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxNl9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNV9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxNV9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzM5QklUX0FERFJFU1NJTkcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxNF9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxNF9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxM19mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxM19mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmZlYXR1cmVzICYgQUhEX05FV19ERkNOVFJMX09QVFMpID09IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxMl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gxMl9mdW5jKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKChhaGQtPmJ1Z3MgJiBBSERfUkVHX1NMT1dfU0VUVExFX0JVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGRfcGF0Y2hfZnVuY190IGFoZF9wYXRjaDExX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDExX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9FQVJMWV9SRVFfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMTBfZnVuYzsKKworc3RhdGljIGludAorYWhkX3BhdGNoMTBfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSA9PSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoOV9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2g5X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+ZmxhZ3MgJiBBSERfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoOF9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2g4X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9MUU9fQVROT19CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g3X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDdfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0JVU0ZSRUVSRVZfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoNl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2g2X2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9OT05QQUNLRklGT19CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g1X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDVfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1NFTlRfU0NCX1VQREFURV9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2g0X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDRfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX1BLVF9MVU5fQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoM19mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gzX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9GQUlOVF9MRURfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoZF9wYXRjaF9mdW5jX3QgYWhkX3BhdGNoMl9mdW5jOworCitzdGF0aWMgaW50CithaGRfcGF0Y2gyX2Z1bmMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoKGFoZC0+YnVncyAmIEFIRF9TRVRfTU9ERV9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gxX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDFfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgoYWhkLT5idWdzICYgQUhEX0lOVENPTExJU0lPTl9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhkX3BhdGNoX2Z1bmNfdCBhaGRfcGF0Y2gwX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoZF9wYXRjaDBfZnVuYyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHN0cnVjdCBwYXRjaCB7CisJYWhkX3BhdGNoX2Z1bmNfdAkJKnBhdGNoX2Z1bmM7CisJdWludDMyX3QJCSBiZWdpbgkJOjEwLAorCQkJCSBza2lwX2luc3RyCToxMCwKKwkJCQkgc2tpcF9wYXRjaAk6MTI7Cit9IHBhdGNoZXNbXSA9IHsKKwl7IGFoZF9wYXRjaDFfZnVuYywgMCwgMywgMyB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMywgMywgMyB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA0LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gzX2Z1bmMsIDIwLCA1LCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDI5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDMwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDM3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDQ3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ4LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDUxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDY1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDY2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDY5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDcwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDczLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDc0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g0X2Z1bmMsIDEwNywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxNjIsIDYsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMTY4LCAyLCAxIH0sCisJeyBhaGRfcGF0Y2g1X2Z1bmMsIDE3MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxNzksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMTgwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g2X2Z1bmMsIDE4MSwgMiwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAxODMsIDYsIDMgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgMTg2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDE4NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAxOTAsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMTkxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g3X2Z1bmMsIDE5MywgMiwgMSB9LAorCXsgYWhkX3BhdGNoNV9mdW5jLCAyMDEsIDE2LCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDIxNywgMSwgMSB9LAorCXsgYWhkX3BhdGNoOF9mdW5jLCAyMzcsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMjQxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDI0MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoN19mdW5jLCAyNDUsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMjU5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDI2MCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAyNjMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMjY0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDI2NywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAyNjgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzIzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDMyNCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCAzMzIsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzMzLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDMzNiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzMzcsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgMzQzLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDM0NCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAzNDYsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzQ3LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g5X2Z1bmMsIDM2NiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoOV9mdW5jLCAzNjksIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDlfZnVuYywgMzcxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2g5X2Z1bmMsIDM4MywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCAzOTMsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgMzk0LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDM5NiwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCAzOTcsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNDA1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQwNiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA0MTksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDIwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMF9mdW5jLCA0NTAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNDU3LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDQ1OCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA0NzAsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDcxLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMV9mdW5jLCA0NzYsIDYsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNDgyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxMl9mdW5jLCA1MDUsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDEzX2Z1bmMsIDUxNCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTRfZnVuYywgNTE1LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDUxNiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTVfZnVuYywgNTE5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxNF9mdW5jLCA1MjAsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE2X2Z1bmMsIDUzMSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1MzIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNTUxLCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU1MiwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA1NTUsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTU2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU2MSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1NjIsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNTY2LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDU2NywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA1NjgsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNTY5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyX2Z1bmMsIDU4MCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1ODEsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE3X2Z1bmMsIDU4NSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMThfZnVuYywgNTkwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxOV9mdW5jLCA1OTEsIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDE4X2Z1bmMsIDU5NSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA1OTYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDJfZnVuYywgNTk5LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDYwMCwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMl9mdW5jLCA2MTUsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjE2LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gyMF9mdW5jLCA2MTcsIDE0LCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDYzNSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2MzYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIwX2Z1bmMsIDYzNywgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA2NDksIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNjUwLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDY1NywgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA2NTgsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDE3X2Z1bmMsIDY4MSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMTdfZnVuYywgNzE5LCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDczMCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3MzEsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDFfZnVuYywgNzQ4LCAxLCAyIH0sCisJeyBhaGRfcGF0Y2gwX2Z1bmMsIDc0OSwgMSwgMSB9LAorCXsgYWhkX3BhdGNoMV9mdW5jLCA3NTEsIDEsIDIgfSwKKwl7IGFoZF9wYXRjaDBfZnVuYywgNzUyLCAxLCAxIH0sCisJeyBhaGRfcGF0Y2gxX2Z1bmMsIDc1NSwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NTYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIxX2Z1bmMsIDc1OCwgMSwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NTksIDIsIDEgfSwKKwl7IGFoZF9wYXRjaDIyX2Z1bmMsIDc2MiwgNCwgMiB9LAorCXsgYWhkX3BhdGNoMF9mdW5jLCA3NjYsIDEsIDEgfSwKKwl7IGFoZF9wYXRjaDIyX2Z1bmMsIDc3NCwgMTEsIDEgfQorfTsKKworc3RhdGljIHN0cnVjdCBjcyB7CisJdWludDE2X3QJYmVnaW47CisJdWludDE2X3QJZW5kOworfSBjcml0aWNhbF9zZWN0aW9uc1tdID0geworCXsgMTEsIDEyIH0sCisJeyAxMywgMTQgfSwKKwl7IDI5LCA0MiB9LAorCXsgNTYsIDU5IH0sCisJeyAxMDEsIDEyOCB9LAorCXsgMTI5LCAxNTcgfSwKKwl7IDE1OSwgMTYyIH0sCisJeyAxNzAsIDE3OCB9LAorCXsgMjAxLCAyNTAgfSwKKwl7IDY4MSwgNjk3IH0sCisJeyA2OTcsIDcxMSB9LAorCXsgNzIxLCA3MjUgfQorfTsKKworc3RhdGljIGNvbnN0IGludCBudW1fY3JpdGljYWxfc2VjdGlvbnMgPSBzaXplb2YoY3JpdGljYWxfc2VjdGlvbnMpCisJCQkJICAgICAgIC8gc2l6ZW9mKCpjcml0aWNhbF9zZWN0aW9ucyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmMTZmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaApAQCAtMCwwICsxLDEzNTIgQEAKKy8qCisgKiBDb3JlIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgc2hhcmVhYmxlIGFjcm9zcyBPUyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LmgjNzkgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX0FJQzdYWFhfSF8KKyNkZWZpbmUgX0FJQzdYWFhfSF8KKworLyogUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJhaWM3eHh4X3JlZy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGb3J3YXJkIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoY19wbGF0Zm9ybV9kYXRhOworc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhOworc3RydWN0IHNlZXByb21fZGVzY3JpcHRvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVc2VmdWwgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjZGVmaW5lIE5VTV9FTEVNRU5UUyhhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoKmFycmF5KSkKKworI2RlZmluZSBBTExfQ0hBTk5FTFMgJ1wwJworI2RlZmluZSBBTExfVEFSR0VUU19NQVNLIDB4RkZGRgorI2RlZmluZSBJTklUSUFUT1JfV0lMRENBUkQJKH4wKQorCisjZGVmaW5lIFNDU0lJRF9UQVJHRVQoYWhjLCBzY3NpaWQpIFwKKwkoKChzY3NpaWQpICYgKCgoKGFoYyktPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApID8gVFdJTl9USUQgOiBUSUQpKSBcCisJPj4gVElEX1NISUZUKQorI2RlZmluZSBTQ1NJSURfT1VSX0lEKHNjc2lpZCkgXAorCSgoc2NzaWlkKSAmIE9JRCkKKyNkZWZpbmUgU0NTSUlEX0NIQU5ORUwoYWhjLCBzY3NpaWQpIFwKKwkoKCgoYWhjKS0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgXAorICAgICAgICA/ICgoKChzY3NpaWQpICYgVFdJTl9DSE5MQikgIT0gMCkgPyAnQicgOiAnQScpIFwKKyAgICAgICA6ICdBJykKKyNkZWZpbmUJU0NCX0lTX1NDU0lCVVNfQihhaGMsIHNjYikgXAorCShTQ1NJSURfQ0hBTk5FTChhaGMsIChzY2IpLT5oc2NiLT5zY3NpaWQpID09ICdCJykKKyNkZWZpbmUJU0NCX0dFVF9PVVJfSUQoc2NiKSBcCisJU0NTSUlEX09VUl9JRCgoc2NiKS0+aHNjYi0+c2NzaWlkKQorI2RlZmluZQlTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYikgXAorCVNDU0lJRF9UQVJHRVQoKGFoYyksIChzY2IpLT5oc2NiLT5zY3NpaWQpCisjZGVmaW5lCVNDQl9HRVRfQ0hBTk5FTChhaGMsIHNjYikgXAorCVNDU0lJRF9DSEFOTkVMKGFoYywgKHNjYiktPmhzY2ItPnNjc2lpZCkKKyNkZWZpbmUJU0NCX0dFVF9MVU4oc2NiKSBcCisJKChzY2IpLT5oc2NiLT5sdW4gJiBMSUQpCisjZGVmaW5lIFNDQl9HRVRfVEFSR0VUX09GRlNFVChhaGMsIHNjYikJXAorCShTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYikgKyAoU0NCX0lTX1NDU0lCVVNfQihhaGMsIHNjYikgPyA4IDogMCkpCisjZGVmaW5lIFNDQl9HRVRfVEFSR0VUX01BU0soYWhjLCBzY2IpIFwKKwkoMHgwMSA8PCAoU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKSkpCisjaWZkZWYgQUhDX0RFQlVHCisjZGVmaW5lIFNDQl9JU19TSUxFTlQoc2NiKQkJCQkJXAorCSgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUFTS0VEX0VSUk9SUykgPT0gMAkJXAorICAgICAgJiYgKCgoc2NiKS0+ZmxhZ3MgJiBTQ0JfU0lMRU5UKSAhPSAwKSkKKyNlbHNlCisjZGVmaW5lIFNDQl9JU19TSUxFTlQoc2NiKQkJCQkJXAorCSgoKHNjYiktPmZsYWdzICYgU0NCX1NJTEVOVCkgIT0gMCkKKyNlbmRpZgorI2RlZmluZSBUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpIFwKKwkoKCgodGNsKSA+PiA0KSAmIFRJRCkgPj4gNCkKKyNkZWZpbmUgVENMX0xVTih0Y2wpIFwKKwkodGNsICYgKEFIQ19OVU1fTFVOUyAtIDEpKQorI2RlZmluZSBCVUlMRF9UQ0woc2NzaWlkLCBsdW4pIFwKKwkoKGx1bikgfCAoKChzY3NpaWQpICYgVElEKSA8PCA0KSkKKworI2lmbmRlZglBSENfVEFSR0VUX01PREUKKyN1bmRlZglBSENfVE1PREVfRU5BQkxFCisjZGVmaW5lCUFIQ19UTU9ERV9FTkFCTEUgMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIERyaXZlciBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCB0YXJnZXRzLgorICovCisjZGVmaW5lIEFIQ19OVU1fVEFSR0VUUyAxNgorCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBsdW5zLgorICogVGhlIGlkZW50aWZ5IG1lc3NhZ2Ugb25seSBzdXBwb3J0cyA2NCBsdW5zIGluIFNQSTMuCisgKiBZb3UgY2FuIGhhdmUgMl42NCBsdW5zIHdoZW4gaW5mb3JtYXRpb24gdW5pdCB0cmFuc2ZlcnMgYXJlIGVuYWJsZWQsCisgKiBidXQgaXQgaXMgZG91YnRmdWwgdGhpcyBkcml2ZXIgd2lsbCBldmVyIHN1cHBvcnQgSVVUcy4KKyAqLworI2RlZmluZSBBSENfTlVNX0xVTlMgNjQKKworLyoKKyAqIFRoZSBtYXhpbXVtIHRyYW5zZmVyIHBlciBTL0cgc2VnbWVudC4KKyAqLworI2RlZmluZSBBSENfTUFYVFJBTlNGRVJfU0laRQkgMHgwMGZmZmZmZgkvKiBsaW1pdGVkIGJ5IDI0Yml0IGNvdW50ZXIgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBTQ0Igc3RvcmFnZSBpbiBoYXJkd2FyZSBvbiBhIGNvbnRyb2xsZXIuCisgKiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgYW4gdXBwZXIgYm91bmQuICBDb250cm9sbGVycyB2YXJ5IGluIHRoZSBudW1iZXIKKyAqIHRoZXkgYWN0dWFsbHkgc3VwcG9ydC4KKyAqLworI2RlZmluZSBBSENfU0NCX01BWAkyNTUKKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHRyYW5zYWN0aW9ucyBzdXBwb3J0ZWQgcGVyIGRyaXZlciBpbnN0YW5jZS4KKyAqIFNlcXVlbmNlciBDb250cm9sIEJsb2NrcyAoU0NCcykgc3RvcmUgcGVyLXRyYW5zYWN0aW9uIGluZm9ybWF0aW9uLiAgQWx0aG91Z2gKKyAqIHRoZSBzcGFjZSBmb3IgU0NCcyBvbiB0aGUgaG9zdCBhZGFwdGVyIHZhcmllcyBieSBtb2RlbCwgdGhlIGRyaXZlciB3aWxsCisgKiBwYWdlIHRoZSBTQ0JzIGJldHdlZW4gaG9zdCBhbmQgY29udHJvbGxlciBtZW1vcnkgYXMgbmVlZGVkLiAgV2UgYXJlIGxpbWl0ZWQKKyAqIHRvIDI1MyBiZWNhdXNlOgorICogCTEpIFRoZSA4Yml0IG5hdHVyZSBvZiB0aGUgUklTQyBlbmdpbmUgaG9sZHMgdXMgdG8gYW4gOGJpdCB2YWx1ZS4KKyAqIAkyKSBXZSByZXNlcnZlIG9uZSB2YWx1ZSwgMjU1LCB0byByZXByZXNlbnQgdGhlIGludmFsaWQgZWxlbWVudC4KKyAqCTMpIE91ciBpbnB1dCBxdWV1ZSBzY2hlbWUgcmVxdWlyZXMgb25lIFNDQiB0byBhbHdheXMgYmUgcmVzZXJ2ZWQKKyAqCSAgIGluIGFkdmFuY2Ugb2YgcXVldWluZyBhbnkgU0NCcy4gIFRoaXMgdGFrZXMgdXMgZG93biB0byAyNTQuCisgKgk0KSBUbyBoYW5kbGUgb3VyIG91dHB1dCBxdWV1ZSBjb3JyZWN0bHkgb24gbWFjaGluZXMgdGhhdCBvbmx5CisgKiAJICAgc3VwcG9ydCAzMmJpdCBzdG9yZXMsIHdlIG11c3QgY2xlYXIgdGhlIGFycmF5IDQgYnl0ZXMgYXQgYQorICoJICAgdGltZS4gIFRvIGF2b2lkIGNvbGxpZGluZyB3aXRoIGEgRE1BIHdyaXRlIGZyb20gdGhlIHNlcXVlbmNlciwKKyAqCSAgIHdlIG11c3QgYmUgc3VyZSB0aGF0IDQgc2xvdHMgYXJlIGVtcHR5IHdoZW4gd2Ugd3JpdGUgdG8gY2xlYXIKKyAqCSAgIHRoZSBxdWV1ZS4gIFRoaXMgcmVkdWNlcyB1cyB0byAyNTMgU0NCczogMSB0aGF0IGp1c3QgY29tcGxldGVkCisgKgkgICBhbmQgdGhlIGtub3duIHRocmVlIGFkZGl0aW9uYWwgZW1wdHkgc2xvdHMgaW4gdGhlIHF1ZXVlIHRoYXQKKyAqCSAgIHByZWNlZGUgaXQuCisgKi8KKyNkZWZpbmUgQUhDX01BWF9RVUVVRQkyNTMKKworLyoKKyAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBTQ0Igc3RvcmFnZSB3ZSBhbGxvY2F0ZSBpbiBob3N0IG1lbW9yeS4gIFRoaXMKKyAqIG51bWJlciBzaG91bGQgcmVmbGVjdCB0aGUgMSBhZGRpdGlvbmFsIFNDQiB3ZSByZXF1aXJlIHRvIGhhbmRsZSBvdXIKKyAqIHFpbmZpZm8gbWVjaGFuaXNtLgorICovCisjZGVmaW5lIEFIQ19TQ0JfTUFYX0FMTE9DIChBSENfTUFYX1FVRVVFKzEpCisKKy8qCisgKiBSaW5nIEJ1ZmZlciBvZiBpbmNvbWluZyB0YXJnZXQgY29tbWFuZHMuCisgKiBXZSBhbGxvY2F0ZSAyNTYgdG8gc2ltcGxpZnkgdGhlIGxvZ2ljIGluIHRoZSBzZXF1ZW5jZXIKKyAqIGJ5IHVzaW5nIHRoZSBuYXR1cmFsIHdyYXAgcG9pbnQgb2YgYW4gOGJpdCBjb3VudGVyLgorICovCisjZGVmaW5lIEFIQ19UTU9ERV9DTURTCTI1NgorCisvKiBSZXNldCBsaW5lIGFzc2VydGlvbiB0aW1lIGluIHVzICovCisjZGVmaW5lIEFIQ19CVVNSRVNFVF9ERUxBWQkyNQorCisvKioqKioqKioqKioqKioqKioqKiBDaGlwIENoYXJhY3RlcmlzdGljcy9PcGVyYXRpbmcgU2V0dGluZ3MgICoqKioqKioqKioqKioqKioqLworLyoKKyAqIENoaXAgVHlwZQorICogVGhlIGNoaXAgb3JkZXIgaXMgZnJvbSBsZWFzdCBzb3BoaXN0aWNhdGVkIHRvIG1vc3Qgc29waGlzdGljYXRlZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSENfTk9ORQk9IDB4MDAwMCwKKwlBSENfQ0hJUElEX01BU0sJPSAweDAwRkYsCisJQUhDX0FJQzc3NzAJPSAweDAwMDEsCisJQUhDX0FJQzc4NTAJPSAweDAwMDIsCisJQUhDX0FJQzc4NTUJPSAweDAwMDMsCisJQUhDX0FJQzc4NTkJPSAweDAwMDQsCisJQUhDX0FJQzc4NjAJPSAweDAwMDUsCisJQUhDX0FJQzc4NzAJPSAweDAwMDYsCisJQUhDX0FJQzc4ODAJPSAweDAwMDcsCisJQUhDX0FJQzc4OTUJPSAweDAwMDgsCisJQUhDX0FJQzc4OTVDCT0gMHgwMDA5LAorCUFIQ19BSUM3ODkwCT0gMHgwMDBhLAorCUFIQ19BSUM3ODk2CT0gMHgwMDBiLAorCUFIQ19BSUM3ODkyCT0gMHgwMDBjLAorCUFIQ19BSUM3ODk5CT0gMHgwMDBkLAorCUFIQ19WTAkJPSAweDAxMDAsCS8qIEJ1cyB0eXBlIFZMICovCisJQUhDX0VJU0EJPSAweDAyMDAsCS8qIEJ1cyB0eXBlIEVJU0EgKi8KKwlBSENfUENJCQk9IDB4MDQwMCwJLyogQnVzIHR5cGUgUENJICovCisJQUhDX0JVU19NQVNLCT0gMHgwRjAwCit9IGFoY19jaGlwOworCisvKgorICogRmVhdHVyZXMgYXZhaWxhYmxlIGluIGVhY2ggY2hpcCB0eXBlLgorICovCit0eXBlZGVmIGVudW0geworCUFIQ19GRU5PTkUJPSAweDAwMDAwLAorCUFIQ19VTFRSQQk9IDB4MDAwMDEsCS8qIFN1cHBvcnRzIDIwTUh6IFRyYW5zZmVycyAqLworCUFIQ19VTFRSQTIJPSAweDAwMDAyLAkvKiBTdXBwb3J0cyA0ME1IeiBUcmFuc2ZlcnMgKi8KKwlBSENfV0lERSAgCT0gMHgwMDAwNCwJLyogV2lkZSBDaGFubmVsICovCisJQUhDX1RXSU4JPSAweDAwMDA4LAkvKiBUd2luIENoYW5uZWwgKi8KKwlBSENfTU9SRV9TUkFNCT0gMHgwMDAxMCwJLyogODAgYnl0ZXMgaW5zdGVhZCBvZiA2NCAqLworCUFIQ19DTURfQ0hBTgk9IDB4MDAwMjAsCS8qIEhhcyBhIENvbW1hbmQgRE1BIENoYW5uZWwgKi8KKwlBSENfUVVFVUVfUkVHUwk9IDB4MDAwNDAsCS8qIEhhcyBRdWV1ZSBtYW5hZ2VtZW50IHJlZ2lzdGVycyAqLworCUFIQ19TR19QUkVMT0FECT0gMHgwMDA4MCwJLyogQ2FuIHBlcmZvcm0gYXV0by1TRyBwcmVsb2FkICovCisJQUhDX1NQSU9DQVAJPSAweDAwMTAwLAkvKiBIYXMgYSBTZXJpYWwgUG9ydCBJL08gQ2FwIFJlZ2lzdGVyICovCisJQUhDX01VTFRJX1RJRAk9IDB4MDAyMDAsCS8qIEhhcyBiaXRtYXNrIG9mIFRJRHMgZm9yIHNlbGVjdC1pbiAqLworCUFIQ19IU19NQUlMQk9YCT0gMHgwMDQwMCwJLyogSGFzIEhTX01BSUxCT1ggcmVnaXN0ZXIgKi8KKwlBSENfRFQJCT0gMHgwMDgwMCwJLyogRG91YmxlIFRyYW5zaXRpb24gdHJhbnNmZXJzICovCisJQUhDX05FV19URVJNQ1RMCT0gMHgwMTAwMCwJLyogTmV3ZXIgdGVybWluYXRpb24gc2NoZW1lICovCisJQUhDX01VTFRJX0ZVTkMJPSAweDAyMDAwLAkvKiBNdWx0aS1GdW5jdGlvbiBUd2luIENoYW5uZWwgRGV2aWNlICovCisJQUhDX0xBUkdFX1NDQlMJPSAweDA0MDAwLAkvKiA2NGJ5dGUgU0NCcyAqLworCUFIQ19BVVRPUkFURQk9IDB4MDgwMDAsCS8qIEF1dG9tYXRpYyB1cGRhdGUgb2YgU0NTSVJBVEUvT0ZGU0VUKi8KKwlBSENfQVVUT1BBVVNFCT0gMHgxMDAwMCwJLyogQXV0b21hdGljIHBhdXNlIG9uIHJlZ2lzdGVyIGFjY2VzcyAqLworCUFIQ19UQVJHRVRNT0RFCT0gMHgyMDAwMCwJLyogSGFzIHRlc3RlZCB0YXJnZXQgbW9kZSBzdXBwb3J0ICovCisJQUhDX01VTFRJUk9MRQk9IDB4NDAwMDAsCS8qIFNwYWNlIGZvciB0d28gcm9sZXMgYXQgYSB0aW1lICovCisJQUhDX1JFTU9WQUJMRQk9IDB4ODAwMDAsCS8qIEhvdC1Td2FwIHN1cHBvcnRlZCAqLworCUFIQ19BSUM3NzcwX0ZFCT0gQUhDX0ZFTk9ORSwKKwkvKgorCSAqIFRoZSByZWFsIDc4NTAgZG9lcyBub3Qgc3VwcG9ydCBVbHRyYSBtb2RlcywgYnV0IHRoZXJlIGFyZQorCSAqIHNldmVyYWwgY2FyZHMgdGhhdCB1c2UgdGhlIGdlbmVyaWMgNzg1MCBQQ0kgSUQgZXZlbiB0aG91Z2gKKwkgKiB0aGV5IGFyZSB1c2luZyBhbiBVbHRyYSBjYXBhYmxlIGNoaXAgKDc4NTkvNzg2MCkuICBXZSBzdGFydAorCSAqIG91dCB3aXRoIHRoZSBBSENfVUxUUkEgZmVhdHVyZSBzZXQgYW5kIHRoZW4gY2hlY2sgdGhlIERFVlNUQVRVUworCSAqIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpZiB0aGUgY2FwYWJpbGl0eSBpcyByZWFsbHkgcHJlc2VudC4KKwkgKi8KKwlBSENfQUlDNzg1MF9GRQk9IEFIQ19TUElPQ0FQfEFIQ19BVVRPUEFVU0V8QUhDX1RBUkdFVE1PREV8QUhDX1VMVFJBLAorCUFIQ19BSUM3ODYwX0ZFCT0gQUhDX0FJQzc4NTBfRkUsCisJQUhDX0FJQzc4NzBfRkUJPSBBSENfVEFSR0VUTU9ERSwKKwlBSENfQUlDNzg4MF9GRQk9IEFIQ19BSUM3ODcwX0ZFfEFIQ19VTFRSQSwKKwkvKgorCSAqIEFsdGhvdWdoIHdlIGhhdmUgc3BhY2UgZm9yIGJvdGggdGhlIGluaXRpYXRvciBhbmQKKwkgKiB0YXJnZXQgcm9sZXMgb24gVUxUUkEyIGNoaXBzLCB3ZSBjdXJyZW50bHkgZGlzYWJsZQorCSAqIHRoZSBpbml0aWF0b3Igcm9sZSB0byBhbGxvdyBtdWx0aS1zY3NpLWlkIHRhcmdldCBtb2RlCisJICogY29uZmlndXJhdGlvbnMuICBXZSBjYW4gb25seSByZXNwb25kIG9uIHRoZSBzYW1lIFNDU0kKKwkgKiBJRCBhcyBvdXIgaW5pdGlhdG9yIHJvbGUgaWYgd2UgYWxsb3cgaW5pdGlhdG9yIG9wZXJhdGlvbi4KKwkgKiBBdCBzb21lIHBvaW50LCB3ZSBzaG91bGQgYWRkIGEgY29uZmlndXJhdGlvbiBrbm9iIHRvCisJICogYWxsb3cgYm90aCByb2xlcyB0byBiZSBsb2FkZWQuCisJICovCisJQUhDX0FJQzc4OTBfRkUJPSBBSENfTU9SRV9TUkFNfEFIQ19DTURfQ0hBTnxBSENfVUxUUkEyCisJCQkgIHxBSENfUVVFVUVfUkVHU3xBSENfU0dfUFJFTE9BRHxBSENfTVVMVElfVElECisJCQkgIHxBSENfSFNfTUFJTEJPWHxBSENfTkVXX1RFUk1DVEx8QUhDX0xBUkdFX1NDQlMKKwkJCSAgfEFIQ19UQVJHRVRNT0RFLAorCUFIQ19BSUM3ODkyX0ZFCT0gQUhDX0FJQzc4OTBfRkV8QUhDX0RUfEFIQ19BVVRPUkFURXxBSENfQVVUT1BBVVNFLAorCUFIQ19BSUM3ODk1X0ZFCT0gQUhDX0FJQzc4ODBfRkV8QUhDX01PUkVfU1JBTXxBSENfQVVUT1BBVVNFCisJCQkgIHxBSENfQ01EX0NIQU58QUhDX01VTFRJX0ZVTkN8QUhDX0xBUkdFX1NDQlMsCisJQUhDX0FJQzc4OTVDX0ZFCT0gQUhDX0FJQzc4OTVfRkV8QUhDX01VTFRJX1RJRCwKKwlBSENfQUlDNzg5Nl9GRQk9IEFIQ19BSUM3ODkwX0ZFfEFIQ19NVUxUSV9GVU5DLAorCUFIQ19BSUM3ODk5X0ZFCT0gQUhDX0FJQzc4OTJfRkV8QUhDX01VTFRJX0ZVTkMKK30gYWhjX2ZlYXR1cmU7CisKKy8qCisgKiBCdWdzIGluIHRoZSBzaWxpY29uIHRoYXQgd2Ugd29yayBhcm91bmQgaW4gc29mdHdhcmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhDX0JVR05PTkUJCT0gMHgwMCwKKwkvKgorCSAqIE9uIGFsbCBjaGlwcyBwcmlvciB0byB0aGUgVTIgcHJvZHVjdCBsaW5lLAorCSAqIHRoZSBXSURFT0REIFMvRyBzZWdtZW50IGZlYXR1cmUgZG9lcyBub3QKKwkgKiB3b3JrIGR1cmluZyBzY3NpLT5Ib3N0QnVzIHRyYW5zZmVycy4KKwkgKi8KKwlBSENfVE1PREVfV0lERU9ERF9CVUcJPSAweDAxLAorCS8qCisJICogT24gdGhlIGFpYzc4OTAvOTEgUmV2IDAgY2hpcHMsIHRoZSBhdXRvZmx1c2gKKwkgKiBmZWF0dXJlIGRvZXMgbm90IHdvcmsuICBBIG1hbnVhbCBmbHVzaCBvZgorCSAqIHRoZSBETUEgRklGTyBpcyByZXF1aXJlZC4KKwkgKi8KKwlBSENfQVVUT0ZMVVNIX0JVRwk9IDB4MDIsCisJLyoKKwkgKiBPbiBtYW55IGNoaXBzLCBjYWNoZWxpbmUgc3RyZWFtaW5nIGRvZXMgbm90IHdvcmsuCisJICovCisJQUhDX0NBQ0hFVEhFTl9CVUcJPSAweDA0LAorCS8qCisJICogT24gdGhlIGFpYzc4OTYvOTcgY2hpcHMsIGNhY2hlbGluZQorCSAqIHN0cmVhbWluZyBtdXN0IGJlIGVuYWJsZWQuCisJICovCisJQUhDX0NBQ0hFVEhFTl9ESVNfQlVHCT0gMHgwOCwKKwkvKgorCSAqIFBDSSAyLjEgUmV0cnkgZmFpbHVyZSBvbiBub24tZW1wdHkgZGF0YSBmaWZvLgorCSAqLworCUFIQ19QQ0lfMl8xX1JFVFJZX0JVRwk9IDB4MTAsCisJLyoKKwkgKiBDb250cm9sbGVyIGRvZXMgbm90IGhhbmRsZSBjYWNoZWxpbmUgcmVzaWR1YWxzCisJICogcHJvcGVybHkgb24gUy9HIHNlZ21lbnRzIGlmIFBDSSBNV0kgaW5zdHJ1Y3Rpb25zCisJICogYXJlIGFsbG93ZWQuCisJICovCisJQUhDX1BDSV9NV0lfQlVHCQk9IDB4MjAsCisJLyoKKwkgKiBBbiBTQ0IgdXBsb2FkIHVzaW5nIHRoZSBTQ0IgY2hhbm5lbCdzCisJICogYXV0byBhcnJheSBlbnRyeSBjb3B5IGZlYXR1cmUgbWF5IAorCSAqIGNvcnJ1cHQgZGF0YS4gIFRoaXMgYXBwZWFycyB0byBvbmx5CisJICogb2NjdXIgb24gNjZNSHogc3lzdGVtcy4KKwkgKi8KKwlBSENfU0NCQ0hBTl9VUExPQURfQlVHCT0gMHg0MAorfSBhaGNfYnVnOworCisvKgorICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyBzZXR0aW5ncy4KKyAqIFRoZSBkcml2ZXIgZGV0ZXJtaW5lcyB0aGVzZSBzZXR0aW5ncyBieSBwcm9iaW5nIHRoZQorICogY2hpcC9jb250cm9sbGVyJ3MgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSENfRk5PTkUJICAgICAgPSAweDAwMCwKKwlBSENfUFJJTUFSWV9DSEFOTkVMICAgPSAweDAwMywgIC8qCisJCQkJCSAqIFRoZSBjaGFubmVsIHRoYXQgc2hvdWxkCisJCQkJCSAqIGJlIHByb2JlZCBmaXJzdC4KKwkJCQkJICovCisJQUhDX1VTRURFRkFVTFRTCSAgICAgID0gMHgwMDQsICAvKgorCQkJCQkgKiBGb3IgY2FyZHMgd2l0aG91dCBhbiBzZWVwcm9tCisJCQkJCSAqIG9yIGEgQklPUyB0byBpbml0aWFsaXplIHRoZSBjaGlwJ3MKKwkJCQkJICogU1JBTSwgd2UgdXNlIHRoZSBkZWZhdWx0IHRhcmdldAorCQkJCQkgKiBzZXR0aW5ncy4KKwkJCQkJICovCisJQUhDX1NFUVVFTkNFUl9ERUJVRyAgID0gMHgwMDgsCisJQUhDX1NIQVJFRF9TUkFNCSAgICAgID0gMHgwMTAsCisJQUhDX0xBUkdFX1NFRVBST00gICAgID0gMHgwMjAsICAvKiBVc2VzIEM1Nl82NiBub3QgQzQ2ICovCisJQUhDX1JFU0VUX0JVU19BCSAgICAgID0gMHgwNDAsCisJQUhDX1JFU0VUX0JVU19CCSAgICAgID0gMHgwODAsCisJQUhDX0VYVEVOREVEX1RSQU5TX0EgID0gMHgxMDAsCisJQUhDX0VYVEVOREVEX1RSQU5TX0IgID0gMHgyMDAsCisJQUhDX1RFUk1fRU5CX0EJICAgICAgPSAweDQwMCwKKwlBSENfVEVSTV9FTkJfQgkgICAgICA9IDB4ODAwLAorCUFIQ19JTklUSUFUT1JST0xFICAgICA9IDB4MTAwMCwgIC8qCisJCQkJCSAgKiBBbGxvdyBpbml0aWF0b3Igb3BlcmF0aW9ucyBvbgorCQkJCQkgICogdGhpcyBjb250cm9sbGVyLgorCQkJCQkgICovCisJQUhDX1RBUkdFVFJPTEUJICAgICAgPSAweDIwMDAsICAvKgorCQkJCQkgICogQWxsb3cgdGFyZ2V0IG9wZXJhdGlvbnMgb24gdGhpcworCQkJCQkgICogY29udHJvbGxlci4KKwkJCQkJICAqLworCUFIQ19ORVdFRVBST01fRk1UICAgICA9IDB4NDAwMCwKKwlBSENfUkVTT1VSQ0VfU0hPUlRBR0UgPSAweDgwMDAsCisJQUhDX1RRSU5GSUZPX0JMT0NLRUQgID0gMHgxMDAwMCwgIC8qIEJsb2NrZWQgd2FpdGluZyBmb3IgQVRJT3MgKi8KKwlBSENfSU5UNTBfU1BFRURGTEVYICAgPSAweDIwMDAwLCAgLyoKKwkJCQkJICAgKiBJbnRlcm5hbCA1MHBpbiBjb25uZWN0b3IKKwkJCQkJICAgKiBzaXRzIGJlaGluZCBhbiBhaWMzODYwCisJCQkJCSAgICovCisJQUhDX1NDQl9CVFQJICAgICAgPSAweDQwMDAwLCAgLyoKKwkJCQkJICAgKiBUaGUgYnVzeSB0YXJnZXRzIHRhYmxlIGlzCisJCQkJCSAgICogc3RvcmVkIGluIFNDQiBzcGFjZSByYXRoZXIKKwkJCQkJICAgKiB0aGFuIFNSQU0uCisJCQkJCSAgICovCisJQUhDX0JJT1NfRU5BQkxFRCAgICAgID0gMHg4MDAwMCwKKwlBSENfQUxMX0lOVEVSUlVQVFMgICAgPSAweDEwMDAwMCwKKwlBSENfUEFHRVNDQlMJICAgICAgPSAweDQwMDAwMCwgIC8qIEVuYWJsZSBTQ0IgcGFnaW5nICovCisJQUhDX0VER0VfSU5URVJSVVBUICAgID0gMHg4MDAwMDAsICAvKiBEZXZpY2UgdXNlcyBlZGdlIHRyaWdnZXJlZCBpbnRzICovCisJQUhDXzM5QklUX0FERFJFU1NJTkcgID0gMHgxMDAwMDAwLCAvKiBVc2UgMzkgYml0IGFkZHJlc3Npbmcgc2NoZW1lLiAqLworCUFIQ19MU0NCU19FTkFCTEVEICAgICA9IDB4MjAwMDAwMCwgLyogNjRCeXRlIFNDQnMgZW5hYmxlZCAqLworCUFIQ19TQ0JfQ09ORklHX1VTRUQgICA9IDB4NDAwMDAwMCwgLyogTm8gU0VFUFJPTSBidXQgU0NCMiBoYWQgaW5mby4gKi8KKwlBSENfTk9fQklPU19JTklUICAgICAgPSAweDgwMDAwMDAsIC8qIE5vIEJJT1MgbGVmdCBvdmVyIHNldHRpbmdzLiAqLworCUFIQ19ESVNBQkxFX1BDSV9QRVJSICA9IDB4MTAwMDAwMDAsCisJQUhDX0hBU19URVJNX0xPR0lDICAgID0gMHgyMDAwMDAwMAorfSBhaGNfZmxhZzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGFyZHdhcmUgIFNDQiBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBkcml2ZXIga2VlcHMgdXAgdG8gTUFYX1NDQiBzY2Igc3RydWN0dXJlcyBwZXIgY2FyZCBpbiBtZW1vcnkuICBUaGUgU0NCCisgKiBjb25zaXN0cyBvZiBhICJoYXJkd2FyZSBTQ0IiIG1pcnJvcmluZyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgY2FyZAorICogYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhlIGtlcm5lbCBzdG9yZXMgZm9yIGVhY2ggdHJhbnNhY3Rpb24uCisgKgorICogVG8gbWluaW1pemUgc3BhY2UgdXRpbGl6YXRpb24sIGEgcG9ydGlvbiBvZiB0aGUgaGFyZHdhcmUgc2NiIHN0b3JlcworICogZGlmZmVyZW50IGRhdGEgZHVyaW5nIGRpZmZlcmVudCBwb3J0aW9ucyBvZiBhIFNDU0kgdHJhbnNhY3Rpb24uCisgKiBBcyBpbml0aWFsaXplZCBieSB0aGUgaG9zdCBkcml2ZXIgZm9yIHRoZSBpbml0aWF0b3Igcm9sZSwgdGhpcyBhcmVhCisgKiBjb250YWlucyB0aGUgU0NTSSBjZGIgKG9yIGEgcG9pbnRlciB0byB0aGUgIGNkYikgdG8gYmUgZXhlY3V0ZWQuICBBZnRlcgorICogdGhlIGNkYiBoYXMgYmVlbiBwcmVzZW50ZWQgdG8gdGhlIHRhcmdldCwgdGhpcyBhcmVhIHNlcnZlcyB0byBzdG9yZQorICogcmVzaWR1YWwgdHJhbnNmZXIgaW5mb3JtYXRpb24gYW5kIHRoZSBTQ1NJIHN0YXR1cyBieXRlLgorICogRm9yIHRoZSB0YXJnZXQgcm9sZSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJlYSBkbyBub3QgY2hhbmdlLCBidXQKKyAqIHN0aWxsIHNlcnZlIGEgZGlmZmVyZW50IHB1cnBvc2UgdGhhbiBmb3IgdGhlIGluaXRpYXRvciByb2xlLiAgU2VlCisgKiBzdHJ1Y3QgdGFyZ2V0X2RhdGEgZm9yIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFN0YXR1cyBpbmZvcm1hdGlvbiBlbWJlZGRlZCBpbiB0aGUgc2hhcmVkIHBvcml0b24gb2YKKyAqIGFuIFNDQiBhZnRlciBwYXNzaW5nIHRoZSBjZGIgdG8gdGhlIHRhcmdldC4gIFRoZSBrZXJuZWwKKyAqIGRyaXZlciB3aWxsIG9ubHkgcmVhZCB0aGlzIGRhdGEgZm9yIHRyYW5zYWN0aW9ucyB0aGF0CisgKiBjb21wbGV0ZSBhYm5vcm1hbGx5IChub24temVybyBzdGF0dXMgYnl0ZSkuCisgKi8KK3N0cnVjdCBzdGF0dXNfcGt0IHsKKwl1aW50MzJfdCByZXNpZHVhbF9kYXRhY250OwkvKiBSZXNpZHVhbCBpbiB0aGUgY3VycmVudCBTL0cgc2VnICovCisJdWludDMyX3QgcmVzaWR1YWxfc2dfcHRyOwkvKiBUaGUgbmV4dCBTL0cgZm9yIHRoaXMgdHJhbnNmZXIgKi8KKwl1aW50OF90CSBzY3NpX3N0YXR1czsJCS8qIFN0YW5kYXJkIFNDU0kgc3RhdHVzIGJ5dGUgKi8KK307CisKKy8qCisgKiBUYXJnZXQgbW9kZSB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgZGF0YSBTQ0Igc2VnbWVudC4KKyAqLworc3RydWN0IHRhcmdldF9kYXRhIHsKKwl1aW50MzJfdCByZXNpZHVhbF9kYXRhY250OwkvKiBSZXNpZHVhbCBpbiB0aGUgY3VycmVudCBTL0cgc2VnICovCisJdWludDMyX3QgcmVzaWR1YWxfc2dfcHRyOwkvKiBUaGUgbmV4dCBTL0cgZm9yIHRoaXMgdHJhbnNmZXIgKi8KKwl1aW50OF90ICBzY3NpX3N0YXR1czsJCS8qIFNDU0kgc3RhdHVzIHRvIGdpdmUgdG8gaW5pdGlhdG9yICovCisJdWludDhfdCAgdGFyZ2V0X3BoYXNlczsJCS8qIEJpdG1hcCBvZiBwaGFzZXMgdG8gZXhlY3V0ZSAqLworCXVpbnQ4X3QgIGRhdGFfcGhhc2U7CQkvKiBEYXRhLUluIG9yIERhdGEtT3V0ICovCisJdWludDhfdCAgaW5pdGlhdG9yX3RhZzsJCS8qIEluaXRpYXRvcidzIHRyYW5zYWN0aW9uIHRhZyAqLworfTsKKworc3RydWN0IGhhcmR3YXJlX3NjYiB7CisvKjAqLwl1bmlvbiB7CisJCS8qCisJCSAqIElmIHRoZSBjZGIgaXMgMTIgYnl0ZXMgb3IgbGVzcywgd2UgZW1iZWQgaXQgZGlyZWN0bHkKKwkJICogaW4gdGhlIFNDQi4gIEZvciBsb25nZXIgY2Ricywgd2UgZW1iZWQgdGhlIGFkZHJlc3MKKwkJICogb2YgdGhlIGNkYiBwYXlsb2FkIGFzIHNlZW4gYnkgdGhlIGNoaXAgYW5kIGEgRE1BCisJCSAqIGlzIHVzZWQgdG8gcHVsbCBpdCBpbi4KKwkJICovCisJCXVpbnQ4X3QJIGNkYlsxMl07CisJCXVpbnQzMl90IGNkYl9wdHI7CisJCXN0cnVjdAkgc3RhdHVzX3BrdCBzdGF0dXM7CisJCXN0cnVjdAkgdGFyZ2V0X2RhdGEgdGRhdGE7CisJfSBzaGFyZWRfZGF0YTsKKy8qCisgKiBBIHdvcmQgYWJvdXQgcmVzaWR1YWxzLgorICogVGhlIHNjYiBpcyBwcmVzZW50ZWQgdG8gdGhlIHNlcXVlbmNlciB3aXRoIHRoZSBkYXRhcHRyIGFuZCBkYXRhY250CisgKiBmaWVsZHMgaW5pdGlhbGl6ZWQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBTL0cgZWxlbWVudCB0bworICogdHJhbnNmZXIuICBUaGUgc2dwdHIgZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGJ1cyBhZGRyZXNzIGZvcgorICogdGhlIFMvRyBlbGVtZW50IHRoYXQgZm9sbG93cyB0aGUgZmlyc3QgaW4gdGhlIGluIGNvcmUgUy9HIGFycmF5CisgKiBvcidlZCB3aXRoIHRoZSBTR19GVUxMX1JFU0lEIGZsYWcuICBTZ3B0ciBtYXkgcG9pbnQgdG8gYW4gaW52YWxpZAorICogUy9HIGVudHJ5IGZvciB0aGlzIHRyYW5zZmVyIChzaW5nbGUgUy9HIGVsZW1lbnQgdHJhbnNmZXIgd2l0aCB0aGUKKyAqIGZpcnN0IGVsZW1lbnRzIGFkZHJlc3MgYW5kIGxlbmd0aCBwcmVsb2FkZWQgaW4gdGhlIGRhdGFwdHIvZGF0YWNudAorICogZmllbGRzKS4gIElmIG5vIHRyYW5zZmVyIGlzIHRvIG9jY3VyLCBzZ3B0ciBpcyBzZXQgdG8gU0dfTElTVF9OVUxMLgorICogVGhlIFNHX0ZVTExfUkVTSUQgZmxhZyBlbnN1cmVzIHRoYXQgdGhlIHJlc2lkdWFsIHdpbGwgYmUgY29ycmVjdGx5CisgKiBub3RlZCBldmVuIGlmIG5vIGRhdGEgdHJhbnNmZXJzIG9jY3VyLiAgT25jZSB0aGUgZGF0YSBwaGFzZSBpcyBlbnRlcmVkLAorICogdGhlIHJlc2lkdWFsIHNncHRyIGFuZCBkYXRhY250IGFyZSBsb2FkZWQgZnJvbSB0aGUgc2dwdHIgYW5kIHRoZQorICogZGF0YWNudCBmaWVsZHMuICBBZnRlciBlYWNoIFMvRyBlbGVtZW50J3MgZGF0YXB0ciBhbmQgbGVuZ3RoIGFyZQorICogbG9hZGVkIGludG8gdGhlIGhhcmR3YXJlLCB0aGUgcmVzaWR1YWwgc2dwdHIgaXMgYWR2YW5jZWQuICBBZnRlcgorICogZWFjaCBTL0cgZWxlbWVudCBpcyBleHBpcmVkLCBpdHMgZGF0YWNudCBmaWVsZCBpcyBjaGVja2VkIHRvIHNlZQorICogaWYgdGhlIExBU1RfU0VHIGZsYWcgaXMgc2V0LiAgSWYgc28sIFNHX0xJU1RfTlVMTCBpcyBzZXQgaW4gdGhlCisgKiByZXNpZHVhbCBzZyBwdHIgYW5kIHRoZSB0cmFuc2ZlciBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiAgSWYgdGhlCisgKiBzZXF1ZW5jZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZXJlIGlzIGEgcmVzaWR1YWwgaW4gdGhlIHRyYW5mZXIsIGl0CisgKiB3aWxsIHNldCB0aGUgU0dfUkVTSURfVkFMSUQgZmxhZyBpbiBzZ3B0ciBhbmQgZG1hIHRoZSBzY2IgYmFjayBpbnRvCisgKiBob3N0IG1lbW9yeS4gIFRvIHN1bWFyaXplOgorICoKKyAqIFNlcXVlbmNlcjoKKyAqCW8gQSByZXNpZHVhbCBoYXMgb2NjdXJyZWQgaWYgU0dfRlVMTF9SRVNJRCBpcyBzZXQgaW4gc2dwdHIsCisgKgkgIG9yIHJlc2lkdWFsX3NncHRyIGRvZXMgbm90IGhhdmUgU0dfTElTVF9OVUxMIHNldC4KKyAqCisgKglvIFdlIGFyZSB0cmFuc2ZlcmluZyB0aGUgbGFzdCBzZWdtZW50IGlmIHJlc2lkdWFsX2RhdGFjbnQgaGFzCisgKgkgIHRoZSBTR19MQVNUX1NFRyBmbGFnIHNldC4KKyAqCisgKiBIb3N0OgorICoJbyBBIHJlc2lkdWFsIGhhcyBvY2N1cnJlZCBpZiBhIGNvbXBsZXRlZCBzY2IgaGFzIHRoZQorICoJICBTR19SRVNJRF9WQUxJRCBmbGFnIHNldC4KKyAqCisgKglvIHJlc2lkdWFsX3NncHRyIGFuZCBzZ3B0ciByZWZlciB0byB0aGUgIm5leHQiIHNnIGVudHJ5CisgKgkgIGFuZCBzbyBtYXkgcG9pbnQgYmV5b25kIHRoZSBsYXN0IHZhbGlkIHNnIGVudHJ5IGZvciB0aGUKKyAqCSAgdHJhbnNmZXIuCisgKi8gCisvKjEyKi8JdWludDMyX3QgZGF0YXB0cjsKKy8qMTYqLwl1aW50MzJfdCBkYXRhY250OwkJLyoKKwkJCQkJICogQnl0ZSAzIChudW1iZXJlZCBmcm9tIDApIG9mCisJCQkJCSAqIHRoZSBkYXRhY250IGlzIHJlYWxseSB0aGUKKwkJCQkJICogNHRoIGJ5dGUgaW4gdGhhdCBkYXRhIGFkZHJlc3MuCisJCQkJCSAqLworLyoyMCovCXVpbnQzMl90IHNncHRyOworI2RlZmluZSBTR19QVFJfTUFTSwkweEZGRkZGRkY4CisvKjI0Ki8JdWludDhfdCAgY29udHJvbDsJLyogU2VlIFNDQl9DT05UUk9MIGluIGFpYzd4eHgucmVnIGZvciBkZXRhaWxzICovCisvKjI1Ki8JdWludDhfdCAgc2NzaWlkOwkvKiB3aGF0IHRvIGxvYWQgaW4gdGhlIFNDU0lJRCByZWdpc3RlciAqLworLyoyNiovCXVpbnQ4X3QgIGx1bjsKKy8qMjcqLwl1aW50OF90ICB0YWc7CQkJLyoKKwkJCQkJICogSW5kZXggaW50byBvdXIga2VybmVsIFNDQiBhcnJheS4KKwkJCQkJICogQWxzbyB1c2VkIGFzIHRoZSB0YWcgZm9yIHRhZ2dlZCBJL08KKwkJCQkJICovCisvKjI4Ki8JdWludDhfdCAgY2RiX2xlbjsKKy8qMjkqLwl1aW50OF90ICBzY3NpcmF0ZTsJCS8qIFZhbHVlIGZvciBTQ1NJUkFURSByZWdpc3RlciAqLworLyozMCovCXVpbnQ4X3QgIHNjc2lvZmZzZXQ7CQkvKiBWYWx1ZSBmb3IgU0NTSU9GRlNFVCByZWdpc3RlciAqLworLyozMSovCXVpbnQ4X3QgIG5leHQ7CQkJLyoKKwkJCQkJICogVXNlZCBmb3IgdGhyZWFkaW5nIFNDQnMgaW4gdGhlCisJCQkJCSAqICJXYWl0aW5nIGZvciBTZWxlY3Rpb24iIGFuZAorCQkJCQkgKiAiRGlzY29ubmVjdGVkIFNDQiIgbGlzdHMgZG93bgorCQkJCQkgKiBpbiB0aGUgc2VxdWVuY2VyLgorCQkJCQkgKi8KKy8qMzIqLwl1aW50OF90ICBjZGIzMlszMl07CQkvKgorCQkJCQkgKiBDREIgc3RvcmFnZSBmb3IgY2RicyBvZiBzaXplCisJCQkJCSAqIDEzLT4zMi4gIFdlIHN0b3JlIHRoZW0gaGVyZQorCQkJCQkgKiBiZWNhdXNlIGhhcmR3YXJlIHNjYnMgYXJlCisJCQkJCSAqIGFsbG9jYXRlZCBmcm9tIERNQSBzYWZlCisJCQkJCSAqIG1lbW9yeSBzbyB3ZSBhcmUgZ3VhcmFudGVlZAorCQkJCQkgKiB0aGUgY29udHJvbGxlciBjYW4gYWNjZXNzCisJCQkJCSAqIHRoaXMgZGF0YS4KKwkJCQkJICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIEtlcm5lbCBTQ0IgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFNvbWUgZmllbGRzIG9mIHRoZSBTQ0IgYXJlIE9TIGRlcGVuZGVudC4gIEhlcmUgd2UgY29sbGVjdCB0aGUKKyAqIGRlZmluaXRpb25zIGZvciBlbGVtZW50cyB0aGF0IGFsbCBPUyBwbGF0Zm9ybXMgbmVlZCB0byBpbmNsdWRlCisgKiBpbiB0aGVyZSBTQ0IgZGVmaW5pdGlvbi4KKyAqLworCisvKgorICogRGVmaW5pdGlvbiBvZiBhIHNjYXR0ZXIvZ2F0aGVyIGVsZW1lbnQgYXMgdHJhbnNmZXJlZCB0byB0aGUgY29udHJvbGxlci4KKyAqIFRoZSBhaWM3eHh4IGNoaXBzIG9ubHkgc3VwcG9ydCBhIDI0Yml0IGxlbmd0aC4gIFdlIHVzZSB0aGUgdG9wIGJ5dGUgb2YKKyAqIHRoZSBsZW5ndGggdG8gc3RvcmUgYWRkaXRpb25hbCBhZGRyZXNzIGJpdHMgYW5kIGEgZmxhZyB0byBpbmRpY2F0ZQorICogdGhhdCBhIGdpdmVuIHNlZ21lbnQgdGVybWluYXRlcyB0aGUgdHJhbnNmZXIuICBUaGlzIGdpdmVzIHVzIGFuCisgKiBhZGRyZXNzYWJsZSByYW5nZSBvZiA1MTJHQiBvbiBtYWNoaW5lcyB3aXRoIDY0Yml0IFBDSSBvciB3aXRoIGNoaXBzCisgKiB0aGF0IGNhbiBzdXBwb3J0IGR1YWwgYWRkcmVzcyBjeWNsZXMgb24gMzJiaXQgUENJIGJ1c3Nlcy4KKyAqLworc3RydWN0IGFoY19kbWFfc2VnIHsKKwl1aW50MzJfdAlhZGRyOworCXVpbnQzMl90CWxlbjsKKyNkZWZpbmUJQUhDX0RNQV9MQVNUX1NFRwkweDgwMDAwMDAwCisjZGVmaW5lCUFIQ19TR19ISUdIX0FERFJfTUFTSwkweDdGMDAwMDAwCisjZGVmaW5lCUFIQ19TR19MRU5fTUFTSwkJMHgwMEZGRkZGRgorfTsKKworc3RydWN0IHNnX21hcF9ub2RlIHsKKwlidXNfZG1hbWFwX3QJCSBzZ19kbWFtYXA7CisJZG1hX2FkZHJfdAkJIHNnX3BoeXNhZGRyOworCXN0cnVjdCBhaGNfZG1hX3NlZyoJIHNnX3ZhZGRyOworCVNMSVNUX0VOVFJZKHNnX21hcF9ub2RlKSBsaW5rczsKK307CisKKy8qCisgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIFNDQi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlTQ0JfRlJFRQkJPSAweDAwMDAsCisJU0NCX09USEVSVENMX1RJTUVPVVQJPSAweDAwMDIsLyoKKwkJCQkJICAqIEFub3RoZXIgZGV2aWNlIHdhcyBhY3RpdmUKKwkJCQkJICAqIGR1cmluZyB0aGUgZmlyc3QgdGltZW91dCBmb3IKKwkJCQkJICAqIHRoaXMgU0NCIHNvIHdlIGdhdmUgb3Vyc2VsdmVzCisJCQkJCSAgKiBhbiBhZGRpdGlvbmFsIHRpbWVvdXQgcGVyaW9kCisJCQkJCSAgKiBpbiBjYXNlIGl0IHdhcyBob2dnaW5nIHRoZQorCQkJCQkgICogYnVzLgorCQkJCSAgICAgICAgICAqLworCVNDQl9ERVZJQ0VfUkVTRVQJPSAweDAwMDQsCisJU0NCX1NFTlNFCQk9IDB4MDAwOCwKKwlTQ0JfQ0RCMzJfUFRSCQk9IDB4MDAxMCwKKwlTQ0JfUkVDT1ZFUllfU0NCCT0gMHgwMDIwLAorCVNDQl9BVVRPX05FR09USUFURQk9IDB4MDA0MCwvKiBOZWdvdGlhdGUgdG8gYWNoaWV2ZSBnb2FsLiAqLworCVNDQl9ORUdPVElBVEUJCT0gMHgwMDgwLC8qIE5lZ290aWF0aW9uIGZvcmNlZCBmb3IgY29tbWFuZC4gKi8KKwlTQ0JfQUJPUlQJCT0gMHgwMTAwLAorCVNDQl9VTlRBR0dFRFEJCT0gMHgwMjAwLAorCVNDQl9BQ1RJVkUJCT0gMHgwNDAwLAorCVNDQl9UQVJHRVRfSU1NRURJQVRFCT0gMHgwODAwLAorCVNDQl9UUkFOU01JU1NJT05fRVJST1IJPSAweDEwMDAsLyoKKwkJCQkJICAqIFdlIGRldGVjdGVkIGEgcGFyaXR5IG9yIENSQworCQkJCQkgICogZXJyb3IgdGhhdCBoYXMgZWZmZWN0ZWQgdGhlCisJCQkJCSAgKiBwYXlsb2FkIG9mIHRoZSBjb21tYW5kLiAgVGhpcworCQkJCQkgICogZmxhZyBpcyBjaGVja2VkIHdoZW4gbm9ybWFsCisJCQkJCSAgKiBzdGF0dXMgaXMgcmV0dXJuZWQgdG8gY2F0Y2gKKwkJCQkJICAqIHRoZSBjYXNlIG9mIGEgdGFyZ2V0IG5vdAorCQkJCQkgICogcmVzcG9uZGluZyB0byBvdXIgYXR0ZW1wdAorCQkJCQkgICogdG8gcmVwb3J0IHRoZSBlcnJvci4KKwkJCQkJICAqLworCVNDQl9UQVJHRVRfU0NCCQk9IDB4MjAwMCwKKwlTQ0JfU0lMRU5UCQk9IDB4NDAwMCAvKgorCQkJCQkgICogQmUgcXVpZXQgYWJvdXQgdHJhbnNtaXNzaW9uIHR5cGUKKwkJCQkJICAqIGVycm9ycy4gIFRoZXkgYXJlIGV4cGVjdGVkIGFuZCB3ZQorCQkJCQkgICogZG9uJ3Qgd2FudCB0byB1cHNldCB0aGUgdXNlci4gIFRoaXMKKwkJCQkJICAqIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgZHVyaW5nIERWLgorCQkJCQkgICovCit9IHNjYl9mbGFnOworCitzdHJ1Y3Qgc2NiIHsKKwlzdHJ1Y3QJaGFyZHdhcmVfc2NiCSAqaHNjYjsKKwl1bmlvbiB7CisJCVNMSVNUX0VOVFJZKHNjYikgIHNsZTsKKwkJVEFJTFFfRU5UUlkoc2NiKSAgdHFlOworCX0gbGlua3M7CisJTElTVF9FTlRSWShzY2IpCQkgIHBlbmRpbmdfbGlua3M7CisJYWhjX2lvX2N0eF90CQkgIGlvX2N0eDsKKwlzdHJ1Y3QgYWhjX3NvZnRjCSAqYWhjX3NvZnRjOworCXNjYl9mbGFnCQkgIGZsYWdzOworI2lmbmRlZiBfX2xpbnV4X18KKwlidXNfZG1hbWFwX3QJCSAgZG1hbWFwOworI2VuZGlmCisJc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzZ19tYXBfbm9kZQkgKnNnX21hcDsKKwlzdHJ1Y3QgYWhjX2RtYV9zZWcgCSAqc2dfbGlzdDsKKwlkbWFfYWRkcl90CQkgIHNnX2xpc3RfcGh5czsKKwl1X2ludAkJCSAgc2dfY291bnQ7LyogSG93IGZ1bGwgYWhjX2RtYV9zZWcgaXMgKi8KK307CisKK3N0cnVjdCBzY2JfZGF0YSB7CisJU0xJU1RfSEVBRCgsIHNjYikgZnJlZV9zY2JzOwkvKgorCQkJCQkgKiBQb29sIG9mIFNDQnMgcmVhZHkgdG8gYmUgYXNzaWduZWQKKwkJCQkJICogY29tbWFuZHMgdG8gZXhlY3V0ZS4KKwkJCQkJICovCisJc3RydWN0CXNjYiAqc2NiaW5kZXhbMjU2XTsJLyoKKwkJCQkJICogTWFwcGluZyBmcm9tIHRhZyB0byBTQ0IuCisJCQkJCSAqIEFzIHRhZyBpZGVudGlmaWVycyBhcmUgYW4KKwkJCQkJICogOGJpdCB2YWx1ZSwgd2UgcHJvdmlkZSBzcGFjZQorCQkJCQkgKiBmb3IgYWxsIHBvc3NpYmxlIHRhZyB2YWx1ZXMuCisJCQkJCSAqIEFueSBsb29rdXBzIHRvIGVudHJpZXMgYXQgb3IKKwkJCQkJICogYWJvdmUgQUhDX1NDQl9NQVhfQUxMT0Mgd2lsbAorCQkJCQkgKiBhbHdheXMgZmFpbC4KKwkJCQkJICovCisJc3RydWN0CWhhcmR3YXJlX3NjYgkqaHNjYnM7CS8qIEFycmF5IG9mIGhhcmR3YXJlIFNDQnMgKi8KKwlzdHJ1Y3QJc2NiICpzY2JhcnJheTsJCS8qIEFycmF5IG9mIGtlcm5lbCBTQ0JzICovCisJc3RydWN0CXNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2U7IC8qIFBlciBTQ0Igc2Vuc2UgZGF0YSAqLworCisJLyoKKwkgKiAiQnVzIiBhZGRyZXNzZXMgb2Ygb3VyIGRhdGEgc3RydWN0dXJlcy4KKwkgKi8KKwlidXNfZG1hX3RhZ190CSBoc2NiX2RtYXQ7CS8qIGRtYXQgZm9yIG91ciBoYXJkd2FyZSBTQ0IgYXJyYXkgKi8KKwlidXNfZG1hbWFwX3QJIGhzY2JfZG1hbWFwOworCWRtYV9hZGRyX3QJIGhzY2JfYnVzYWRkcjsKKwlidXNfZG1hX3RhZ190CSBzZW5zZV9kbWF0OworCWJ1c19kbWFtYXBfdAkgc2Vuc2VfZG1hbWFwOworCWRtYV9hZGRyX3QJIHNlbnNlX2J1c2FkZHI7CisJYnVzX2RtYV90YWdfdAkgc2dfZG1hdDsJLyogZG1hdCBmb3Igb3VyIHNnIHNlZ21lbnRzICovCisJU0xJU1RfSEVBRCgsIHNnX21hcF9ub2RlKSBzZ19tYXBzOworCXVpbnQ4X3QJbnVtc2NiczsKKwl1aW50OF90CW1heGhzY2JzOwkJLyogTnVtYmVyIG9mIFNDQnMgb24gdGhlIGNhcmQgKi8KKwl1aW50OF90CWluaXRfbGV2ZWw7CQkvKgorCQkJCQkgKiBIb3cgZmFyIHdlJ3ZlIGluaXRpYWxpemVkCisJCQkJCSAqIHRoaXMgc3RydWN0dXJlLgorCQkJCQkgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb25uZWN0aW9uIGRlc2NpcHRvciBmb3Igc2VsZWN0LWluIHJlcXVlc3RzIGluIHRhcmdldCBtb2RlLgorICovCitzdHJ1Y3QgdGFyZ2V0X2NtZCB7CisJdWludDhfdCBzY3NpaWQ7CQkvKiBPdXIgSUQgYW5kIHRoZSBpbml0aWF0b3IncyBJRCAqLworCXVpbnQ4X3QgaWRlbnRpZnk7CS8qIElkZW50aWZ5IG1lc3NhZ2UgKi8KKwl1aW50OF90IGJ5dGVzWzIyXTsJLyogCisJCQkJICogQnl0ZXMgY29udGFpbnMgYW55IGFkZGl0aW9uYWwgbWVzc2FnZQorCQkJCSAqIGJ5dGVzIHRlcm1pbmF0ZWQgYnkgMHhGRi4gIFRoZSByZW1haW5kZXIKKwkJCQkgKiBpcyB0aGUgY2RiIHRvIGV4ZWN1dGUuCisJCQkJICovCisJdWludDhfdCBjbWRfdmFsaWQ7CS8qCisJCQkJICogV2hlbiBhIGNvbW1hbmQgaXMgY29tcGxldGUsIHRoZSBmaXJtd2FyZQorCQkJCSAqIHdpbGwgc2V0IGNtZF92YWxpZCB0byBhbGwgYml0cyBzZXQuCisJCQkJICogQWZ0ZXIgdGhlIGhvc3QgaGFzIHNlZW4gdGhlIGNvbW1hbmQsCisJCQkJICogdGhlIGJpdHMgYXJlIGNsZWFyZWQuICBUaGlzIGFsbG93cyB1cworCQkJCSAqIHRvIGp1c3QgcGVlayBhdCBob3N0IG1lbW9yeSB0byBkZXRlcm1pbmUKKwkJCQkgKiBpZiBtb3JlIHdvcmsgaXMgY29tcGxldGUuIGNtZF92YWxpZCBpcyBvbgorCQkJCSAqIGFuIDggYnl0ZSBib3VuZGFyeSB0byBzaW1wbGlmeSBzZXR0aW5nCisJCQkJICogaXQgb24gYWljNzg4MCBoYXJkd2FyZSB3aGljaCBvbmx5IGhhcworCQkJCSAqIGxpbWl0ZWQgZGlyZWN0IGFjY2VzcyB0byB0aGUgRE1BIEZJRk8uCisJCQkJICovCisJdWludDhfdCBwYWRbN107Cit9OworCisvKgorICogTnVtYmVyIG9mIGV2ZW50cyB3ZSBjYW4gYnVmZmVyIHVwIGlmIHdlIHJ1biBvdXQKKyAqIG9mIGltbWVkaWF0ZSBub3RpZnkgY2Nicy4KKyAqLworI2RlZmluZSBBSENfVE1PREVfRVZFTlRfQlVGRkVSX1NJWkUgOAorc3RydWN0IGFoY190bW9kZV9ldmVudCB7CisJdWludDhfdCBpbml0aWF0b3JfaWQ7CisJdWludDhfdCBldmVudF90eXBlOwkvKiBNU0cgdHlwZSBvciBFVkVOVF9UWVBFX0JVU19SRVNFVCAqLworI2RlZmluZQlFVkVOVF9UWVBFX0JVU19SRVNFVCAweEZGCisJdWludDhfdCBldmVudF9hcmc7Cit9OworCisvKgorICogUGVyIGVuYWJsZWQgbHVuIHRhcmdldCBtb2RlIHN0YXRlLgorICogQXMgdGhpcyBzdGF0ZSBpcyBkaXJlY3RseSBpbmZsdWVuY2VkIGJ5IHRoZSBob3N0IE9TJ2VzIHRhcmdldCBtb2RlCisgKiBlbnZpcm9ubWVudCwgd2UgbGV0IHRoZSBPUyBtb2R1bGUgZGVmaW5lIGl0LiAgRm9yd2FyZCBkZWNsYXJlIHRoZQorICogc3RydWN0dXJlIGhlcmUgc28gd2UgY2FuIHN0b3JlIGFycmF5cyBvZiB0aGVtLCBldGMuIGluIE9TIG5ldXRyYWwKKyAqIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERSAKK3N0cnVjdCBhaGNfdG1vZGVfbHN0YXRlIHsKKwlzdHJ1Y3QgY2FtX3BhdGggKnBhdGg7CisJc3RydWN0IGNjYl9oZHJfc2xpc3QgYWNjZXB0X3Rpb3M7CisJc3RydWN0IGNjYl9oZHJfc2xpc3QgaW1tZWRfbm90aWZpZXM7CisJc3RydWN0IGFoY190bW9kZV9ldmVudCBldmVudF9idWZmZXJbQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFXTsKKwl1aW50OF90IGV2ZW50X3JfaWR4OworCXVpbnQ4X3QgZXZlbnRfd19pZHg7Cit9OworI2Vsc2UKK3N0cnVjdCBhaGNfdG1vZGVfbHN0YXRlOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiBEYXRhc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFIQ19UUkFOU19DVVIJCTB4MDEJLyogTW9kaWZ5IGN1cnJlbnQgbmVvZ3RpYXRpb24gc3RhdHVzICovCisjZGVmaW5lIEFIQ19UUkFOU19BQ1RJVkUJMHgwMwkvKiBBc3N1bWUgdGhpcyB0YXJnZXQgaXMgb24gdGhlIGJ1cyAqLworI2RlZmluZSBBSENfVFJBTlNfR09BTAkJMHgwNAkvKiBNb2RpZnkgbmVnb3RpYXRpb24gZ29hbCAqLworI2RlZmluZSBBSENfVFJBTlNfVVNFUgkJMHgwOAkvKiBNb2RpZnkgdXNlciBuZWdvdGlhdGlvbiBzZXR0aW5ncyAqLworCisjZGVmaW5lIEFIQ19XSURUSF9VTktOT1dOCTB4RkYKKyNkZWZpbmUgQUhDX1BFUklPRF9VTktOT1dOCTB4RkYKKyNkZWZpbmUgQUhDX09GRlNFVF9VTktOT1dOCTB4RkYKKyNkZWZpbmUgQUhDX1BQUl9PUFRTX1VOS05PV04JMHhGRgorCisvKgorICogVHJhbnNmZXIgTmVnb3RpYXRpb24gSW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBhaGNfdHJhbnNpbmZvIHsKKwl1aW50OF90IHByb3RvY29sX3ZlcnNpb247CS8qIFNDU0kgUmV2aXNpb24gbGV2ZWwgKi8KKwl1aW50OF90IHRyYW5zcG9ydF92ZXJzaW9uOwkvKiBTUEkgUmV2aXNpb24gbGV2ZWwgKi8KKwl1aW50OF90IHdpZHRoOwkJCS8qIEJ1cyB3aWR0aCAqLworCXVpbnQ4X3QgcGVyaW9kOwkJCS8qIFN5bmMgcmF0ZSBmYWN0b3IgKi8KKwl1aW50OF90IG9mZnNldDsJCQkvKiBTeW5jIG9mZnNldCAqLworCXVpbnQ4X3QgcHByX29wdGlvbnM7CQkvKiBQYXJhbGxlbCBQcm90b2NvbCBSZXF1ZXN0IG9wdGlvbnMgKi8KK307CisKKy8qCisgKiBQZXItaW5pdGlhdG9yIGN1cnJlbnQsIGdvYWwgYW5kIHVzZXIgdHJhbnNmZXIgbmVnb3RpYXRpb24gaW5mb3JtYXRpb24uICovCitzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyB7CisJdWludDhfdCBzY3NpcmF0ZTsJCS8qIENvbXB1dGVkIHZhbHVlIGZvciBTQ1NJUkFURSByZWcgKi8KKwlzdHJ1Y3QgYWhjX3RyYW5zaW5mbyBjdXJyOworCXN0cnVjdCBhaGNfdHJhbnNpbmZvIGdvYWw7CisJc3RydWN0IGFoY190cmFuc2luZm8gdXNlcjsKK307CisKKy8qCisgKiBQZXIgZW5hYmxlZCB0YXJnZXQgSUQgc3RhdGUuCisgKiBQb2ludGVycyB0byBsdW4gdGFyZ2V0IHN0YXRlIGFzIHdlbGwgYXMgc3luYy93aWRlIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCisgKiBmb3IgZWFjaCBpbml0aWF0b3I8LT50YXJnZXQgbWFwcGluZy4gIEZvciB0aGUgaW5pdGlhdG9yIHJvbGUgd2UgcHJldGVuZAorICogdGhhdCB3ZSBhcmUgdGhlIHRhcmdldCBhbmQgdGhlIHRhcmdldHMgYXJlIHRoZSBpbml0aWF0b3JzIHNpbmNlIHRoZQorICogbmVnb3RpYXRpb24gaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiByb2xlLgorICovCitzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSB7CisJc3RydWN0IGFoY190bW9kZV9sc3RhdGUqCWVuYWJsZWRfbHVuc1tBSENfTlVNX0xVTlNdOworCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvCXRyYW5zaW5mb1tBSENfTlVNX1RBUkdFVFNdOworCisJLyoKKwkgKiBQZXIgaW5pdGlhdG9yIHN0YXRlIGJpdG1hc2tzLgorCSAqLworCXVpbnQxNl90CSBhdXRvX25lZ290aWF0ZTsvKiBBdXRvIE5lZ290aWF0aW9uIFJlcXVpcmVkICovCisJdWludDE2X3QJIHVsdHJhZW5iOwkvKiBVc2luZyB1bHRyYSBzeW5jIHJhdGUgICovCisJdWludDE2X3QJIGRpc2NlbmFibGU7CS8qIERpc2Nvbm5lY3Rpb24gYWxsb3dlZCAgKi8KKwl1aW50MTZfdAkgdGFnZW5hYmxlOwkvKiBUYWdnZWQgUXVldWluZyBhbGxvd2VkICovCit9OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIG91ciB0YWJsZSBvZiBhbGxvd2VkIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJhdGVzLgorICovCitzdHJ1Y3QgYWhjX3N5bmNyYXRlIHsKKwl1X2ludCBzeGZyX3UyOwkvKiBWYWx1ZSBvZiB0aGUgU1hGUiBwYXJhbWV0ZXIgZm9yIFVsdHJhMisgQ2hpcHMgKi8KKwl1X2ludCBzeGZyOwkvKiBWYWx1ZSBvZiB0aGUgU1hGUiBwYXJhbWV0ZXIgZm9yIDw9IFVsdHJhIENoaXBzICovCisjZGVmaW5lCQlVTFRSQV9TWEZSIDB4MTAwCS8qIFJhdGUgUmVxdWlyZXMgVWx0cmEgTW9kZSBzZXQgKi8KKyNkZWZpbmUJCVNUX1NYRlIJICAgMHgwMTAJLyogUmF0ZSBTaW5nbGUgVHJhbnNpdGlvbiBPbmx5ICovCisjZGVmaW5lCQlEVF9TWEZSCSAgIDB4MDQwCS8qIFJhdGUgRG91YmxlIFRyYW5zaXRpb24gT25seSAqLworCXVpbnQ4X3QgcGVyaW9kOyAvKiBQZXJpb2QgdG8gc2VuZCB0byBTQ1NJIHRhcmdldCAqLworCWNoYXIgKnJhdGU7Cit9OworCisvKiBTYWZlIGFuZCB2YWxpZCBwZXJpb2QgZm9yIGFzeW5jIG5lZ290aWF0aW9ucy4gKi8KKyNkZWZpbmUJQUhDX0FTWU5DX1hGRVJfUEVSSU9EIDB4NDUKKyNkZWZpbmUJQUhDX1VMVFJBMl9YRkVSX1BFUklPRCAweDBhCisKKy8qCisgKiBJbmRleGVzIGludG8gb3VyIHRhYmxlIG9mIHN5bmNyb25vdXMgdHJhbnNmZXIgcmF0ZXMuCisgKi8KKyNkZWZpbmUgQUhDX1NZTkNSQVRFX0RUCQkwCisjZGVmaW5lIEFIQ19TWU5DUkFURV9VTFRSQTIJMQorI2RlZmluZSBBSENfU1lOQ1JBVEVfVUxUUkEJMworI2RlZmluZSBBSENfU1lOQ1JBVEVfRkFTVAk2CisjZGVmaW5lIEFIQ19TWU5DUkFURV9NQVgJQUhDX1NZTkNSQVRFX0RUCisjZGVmaW5lCUFIQ19TWU5DUkFURV9NSU4JMTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvb2t1cCBUYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQaGFzZSAtPiBuYW1lIGFuZCBtZXNzYWdlIG91dCByZXNwb25zZQorICogdG8gcGFyaXR5IGVycm9ycyBpbiBlYWNoIHBoYXNlIHRhYmxlLiAKKyAqLworc3RydWN0IGFoY19waGFzZV90YWJsZV9lbnRyeSB7CisgICAgICAgIHVpbnQ4X3QgcGhhc2U7CisgICAgICAgIHVpbnQ4X3QgbWVzZ19vdXQ7IC8qIE1lc3NhZ2UgcmVzcG9uc2UgdG8gcGFyaXR5IGVycm9ycyAqLworCWNoYXIgKnBoYXNlbXNnOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcmlhbCBFRVBST00gRm9ybWF0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHNlZXByb21fY29uZmlnIHsKKy8qCisgKiBQZXIgU0NTSSBJRCBDb25maWd1cmF0aW9uIEZsYWdzCisgKi8KKwl1aW50MTZfdCBkZXZpY2VfZmxhZ3NbMTZdOwkvKiB3b3JkcyAwLTE1ICovCisjZGVmaW5lCQlDRlhGRVIJCTB4MDAwNwkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lCQlDRlNZTkNICQkweDAwMDgJLyogZW5hYmxlIHN5bmNocm9ub3VzIHRyYW5zZmVyICovCisjZGVmaW5lCQlDRkRJU0MJCTB4MDAxMAkvKiBlbmFibGUgZGlzY29ubmVjdGlvbiAqLworI2RlZmluZQkJQ0ZXSURFQgkJMHgwMDIwCS8qIHdpZGUgYnVzIGRldmljZSAqLworI2RlZmluZQkJQ0ZTWU5DSElTVUxUUkEJMHgwMDQwCS8qIENGU1lOQ0ggaXMgYW4gdWx0cmEgb2Zmc2V0ICgyOTQwQVUpKi8KKyNkZWZpbmUJCUNGU1lOQ1NJTkdMRQkweDAwODAJLyogU2luZ2xlLVRyYW5zaXRpb24gc2lnbmFsbGluZyAqLworI2RlZmluZQkJQ0ZTVEFSVAkJMHgwMTAwCS8qIHNlbmQgc3RhcnQgdW5pdCBTQ1NJIGNvbW1hbmQgKi8KKyNkZWZpbmUJCUNGSU5DQklPUwkweDAyMDAJLyogaW5jbHVkZSBpbiBCSU9TIHNjYW4gKi8KKyNkZWZpbmUJCUNGUk5GT1VORAkweDA0MDAJLyogcmVwb3J0IGV2ZW4gaWYgbm90IGZvdW5kICovCisjZGVmaW5lCQlDRk1VTFRJTFVOREVWCTB4MDgwMAkvKiBQcm9iZSBtdWx0aXBsZSBsdW5zIGluIEJJT1Mgc2NhbiAqLworI2RlZmluZQkJQ0ZXQkNBQ0hFRU5CCTB4NDAwMAkvKiBFbmFibGUgVy1CZWhpbmQgQ2FjaGUgb24gZGlza3MgKi8KKyNkZWZpbmUJCUNGV0JDQUNIRU5PUAkweGMwMDAJLyogRG9uJ3QgdG91Y2ggVy1CZWhpbmQgQ2FjaGUgKi8KKworLyoKKyAqIEJJT1MgQ29udHJvbCBCaXRzCisgKi8KKwl1aW50MTZfdCBiaW9zX2NvbnRyb2w7CQkvKiB3b3JkIDE2ICovCisjZGVmaW5lCQlDRlNVUFJFTQkweDAwMDEJLyogc3VwcG9ydCBhbGwgcmVtb3ZlYWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUJCUNGU1VQUkVNQgkweDAwMDIJLyogc3VwcG9ydCByZW1vdmVhYmxlIGJvb3QgZHJpdmVzICovCisjZGVmaW5lCQlDRkJJT1NFTgkweDAwMDQJLyogQklPUyBlbmFibGVkICovCisjZGVmaW5lCQlDRkJJT1NfQlVTU0NBTgkweDAwMDgJLyogSGF2ZSB0aGUgQklPUyBTY2FuIHRoZSBCdXMgKi8KKyNkZWZpbmUJCUNGU00yRFJWCTB4MDAxMAkvKiBzdXBwb3J0IG1vcmUgdGhhbiB0d28gZHJpdmVzICovCisjZGVmaW5lCQlDRlNUUFdMRVZFTAkweDAwMTAJLyogVGVybWluYXRpb24gbGV2ZWwgY29udHJvbCAqLworI2RlZmluZQkJQ0YyODRYRVhURU5ECTB4MDAyMAkvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiAoMjg0eCBjYXJkcykgKi8JCisjZGVmaW5lCQlDRkNUUkxfQQkweDAwMjAJLyogQklPUyBkaXNwbGF5cyBDdHJsLUEgbWVzc2FnZSAqLwkKKyNkZWZpbmUJCUNGVEVSTV9NRU5VCTB4MDA0MAkvKiBCSU9TIGRpc3BsYXlzIHRlcm1pbmF0aW9uIG1lbnUgKi8JCisjZGVmaW5lCQlDRkVYVEVORAkweDAwODAJLyogZXh0ZW5kZWQgdHJhbnNsYXRpb24gZW5hYmxlZCAqLworI2RlZmluZQkJQ0ZTQ0FNRU4JMHgwMTAwCS8qIFNDQU0gZW5hYmxlICovCisjZGVmaW5lCQlDRk1TR19MRVZFTAkweDA2MDAJLyogQklPUyBNZXNzYWdlIExldmVsICovCisjZGVmaW5lCQkJQ0ZNU0dfVkVSQk9TRQkweDAwMDAKKyNkZWZpbmUJCQlDRk1TR19TSUxFTlQJMHgwMjAwCisjZGVmaW5lCQkJQ0ZNU0dfRElBRwkweDA0MDAKKyNkZWZpbmUJCUNGQk9PVENECTB4MDgwMCAgLyogU3VwcG9ydCBCb290YWJsZSBDRC1ST00gKi8KKy8qCQlVTlVTRUQJCTB4ZmYwMAkqLworCisvKgorICogSG9zdCBBZGFwdGVyIENvbnRyb2wgQml0cworICovCisJdWludDE2X3QgYWRhcHRlcl9jb250cm9sOwkvKiB3b3JkIDE3ICovCQorI2RlZmluZQkJQ0ZBVVRPVEVSTQkweDAwMDEJLyogUGVyZm9ybSBBdXRvIHRlcm1pbmF0aW9uICovCisjZGVmaW5lCQlDRlVMVFJBRU4JMHgwMDAyCS8qIFVsdHJhIFNDU0kgc3BlZWQgZW5hYmxlICovCisjZGVmaW5lCQlDRjI4NFhTRUxUTyAgICAgMHgwMDAzCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICgyODR4IGNhcmRzKSAqLworI2RlZmluZQkJQ0YyODRYRklGTyAgICAgIDB4MDAwQwkvKiBGSUZPIFRocmVzaG9sZCAoMjg0eCBjYXJkcykgKi8KKyNkZWZpbmUJCUNGU1RFUk0JCTB4MDAwNAkvKiBTQ1NJIGxvdyBieXRlIHRlcm1pbmF0aW9uICovCisjZGVmaW5lCQlDRldTVEVSTQkweDAwMDgJLyogU0NTSSBoaWdoIGJ5dGUgdGVybWluYXRpb24gKi8KKyNkZWZpbmUJCUNGU1BBUklUWQkweDAwMTAJLyogU0NTSSBwYXJpdHkgKi8KKyNkZWZpbmUJCUNGMjg0WFNURVJNICAgICAweDAwMjAJLyogU0NTSSBsb3cgYnl0ZSB0ZXJtICgyODR4IGNhcmRzKSAqLwkKKyNkZWZpbmUJCUNGTVVMVElMVU4JMHgwMDIwCisjZGVmaW5lCQlDRlJFU0VUQgkweDAwNDAJLyogcmVzZXQgU0NTSSBidXMgYXQgYm9vdCAqLworI2RlZmluZQkJQ0ZDTFVTVEVSRU5CCTB4MDA4MAkvKiBDbHVzdGVyIEVuYWJsZSAqLworI2RlZmluZQkJQ0ZCT09UQ0hBTgkweDAzMDAJLyogcHJvYmUgdGhpcyBjaGFubmVsIGZpcnN0ICovCisjZGVmaW5lCQlDRkJPT1RDSEFOU0hJRlQgOAorI2RlZmluZQkJQ0ZTRUFVVE9URVJNCTB4MDQwMAkvKiBVbHRyYTIgUGVyZm9ybSBzZWNvbmRhcnkgQXV0byBUZXJtKi8KKyNkZWZpbmUJCUNGU0VMT1dURVJNCTB4MDgwMAkvKiBVbHRyYTIgc2Vjb25kYXJ5IGxvdyB0ZXJtICovCisjZGVmaW5lCQlDRlNFSElHSFRFUk0JMHgxMDAwCS8qIFVsdHJhMiBzZWNvbmRhcnkgaGlnaCB0ZXJtICovCisjZGVmaW5lCQlDRkVOQUJMRURWCTB4NDAwMAkvKiBQZXJmb3JtIERvbWFpbiBWYWxpZGF0aW9uKi8KKworLyoKKyAqIEJ1cyBSZWxlYXNlIFRpbWUsIEhvc3QgQWRhcHRlciBJRAorICovCisJdWludDE2X3QgYnJ0aW1lX2lkOwkJLyogd29yZCAxOCAqLworI2RlZmluZQkJQ0ZTQ1NJSUQJMHgwMDBmCS8qIGhvc3QgYWRhcHRlciBTQ1NJIElEICovCisvKgkJVU5VU0VECQkweDAwZjAJKi8KKyNkZWZpbmUJCUNGQlJUSU1FCTB4ZmYwMAkvKiBidXMgcmVsZWFzZSB0aW1lICovCisKKy8qCisgKiBNYXhpbXVtIHRhcmdldHMKKyAqLworCXVpbnQxNl90IG1heF90YXJnZXRzOwkJLyogd29yZCAxOSAqLwkKKyNkZWZpbmUJCUNGTUFYVEFSRwkweDAwZmYJLyogbWF4aW11bSB0YXJnZXRzICovCisjZGVmaW5lCQlDRkJPT1RMVU4JMHgwZjAwCS8qIEx1biB0byBib290IGZyb20gKi8KKyNkZWZpbmUJCUNGQk9PVElECTB4ZjAwMAkvKiBUYXJnZXQgdG8gYm9vdCBmcm9tICovCisJdWludDE2X3QgcmVzXzFbMTBdOwkJLyogd29yZHMgMjAtMjkgKi8KKwl1aW50MTZfdCBzaWduYXR1cmU7CQkvKiBTaWduYXR1cmUgPT0gMHgyNTAgKi8KKyNkZWZpbmUJCUNGU0lHTkFUVVJFCTB4MjUwCisjZGVmaW5lCQlDRlNJR05BVFVSRTIJMHgzMDAKKwl1aW50MTZfdCBjaGVja3N1bTsJCS8qIHdvcmQgMzEgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNZXNzYWdlIEJ1ZmZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCU1TR19UWVBFX05PTkUJCQk9IDB4MDAsCisJTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVAk9IDB4MDEsCisJTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOCT0gMHgwMiwKKwlNU0dfVFlQRV9UQVJHRVRfTVNHT1VUCQk9IDB4MDMsCisJTVNHX1RZUEVfVEFSR0VUX01TR0lOCQk9IDB4MDQKK30gYWhjX21zZ190eXBlOworCit0eXBlZGVmIGVudW0geworCU1TR0xPT1BfSU5fUFJPRywKKwlNU0dMT09QX01TR0NPTVBMRVRFLAorCU1TR0xPT1BfVEVSTUlOQVRFRAorfSBtc2dfbG9vcF9zdGF0OworCisvKioqKioqKioqKioqKioqKioqKioqKiogU29mdHdhcmUgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgKioqKioqKioqKioqKioqKioqKioqLworVEFJTFFfSEVBRChzY2JfdGFpbHEsIHNjYik7CisKK3N0cnVjdCBhaGNfYWljNzc3MF9zb2Z0YyB7CisJLyoKKwkgKiBTYXZlZCByZWdpc3RlciBzdGF0ZSB1c2VkIGZvciBjaGlwX2luaXQoKS4KKwkgKi8KKwl1aW50OF90IGJ1c3NwZDsKKwl1aW50OF90IGJ1c3RpbWU7Cit9OworCitzdHJ1Y3QgYWhjX3BjaV9zb2Z0YyB7CisJLyoKKwkgKiBTYXZlZCByZWdpc3RlciBzdGF0ZSB1c2VkIGZvciBjaGlwX2luaXQoKS4KKwkgKi8KKwl1aW50MzJfdCAgZGV2Y29uZmlnOworCXVpbnQxNl90ICB0YXJnY3JjY250OworCXVpbnQ4X3QgICBjb21tYW5kOworCXVpbnQ4X3QgICBjc2l6ZV9sYXR0aW1lOworCXVpbnQ4X3QgICBvcHRpb25tb2RlOworCXVpbnQ4X3QgICBjcmNjb250cm9sMTsKKwl1aW50OF90ICAgZHNjb21tYW5kMDsKKwl1aW50OF90ICAgZHNwY2lzdGF0dXM7CisJdWludDhfdCAgIHNjYmJhZGRyOworCXVpbnQ4X3QgICBkZmZfdGhyc2g7Cit9OworCit1bmlvbiBhaGNfYnVzX3NvZnRjIHsKKwlzdHJ1Y3QgYWhjX2FpYzc3NzBfc29mdGMgYWljNzc3MF9zb2Z0YzsKKwlzdHJ1Y3QgYWhjX3BjaV9zb2Z0YyBwY2lfc29mdGM7Cit9OworCit0eXBlZGVmIHZvaWQgKCphaGNfYnVzX2ludHJfdCkoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3R5cGVkZWYgaW50ICgqYWhjX2J1c19jaGlwX2luaXRfdCkoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3R5cGVkZWYgaW50ICgqYWhjX2J1c19zdXNwZW5kX3QpKHN0cnVjdCBhaGNfc29mdGMgKik7Cit0eXBlZGVmIGludCAoKmFoY19idXNfcmVzdW1lX3QpKHN0cnVjdCBhaGNfc29mdGMgKik7Cit0eXBlZGVmIHZvaWQgYWhjX2NhbGxiYWNrX3QgKHZvaWQgKik7CisKK3N0cnVjdCBhaGNfc29mdGMgeworCWJ1c19zcGFjZV90YWdfdCAgICAgICAgICAgdGFnOworCWJ1c19zcGFjZV9oYW5kbGVfdCAgICAgICAgYnNoOworI2lmbmRlZiBfX2xpbnV4X18KKwlidXNfZG1hX3RhZ190CQkgIGJ1ZmZlcl9kbWF0OyAgIC8qIGRtYXQgZm9yIGJ1ZmZlciBJL08gKi8KKyNlbmRpZgorCXN0cnVjdCBzY2JfZGF0YQkJICpzY2JfZGF0YTsKKworCXN0cnVjdCBzY2IJCSAqbmV4dF9xdWV1ZWRfc2NiOworCisJLyoKKwkgKiBTQ0JzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgdG8gdGhlIGNvbnRyb2xsZXIKKwkgKi8KKwlMSVNUX0hFQUQoLCBzY2IpCSAgcGVuZGluZ19zY2JzOworCisJLyoKKwkgKiBDb3VudGluZyBsb2NrIGZvciBkZWZlcnJpbmcgdGhlIHJlbGVhc2Ugb2YgYWRkaXRpb25hbAorCSAqIHVudGFnZ2VkIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSB1bnRhZ2dlZF9xdWV1ZXMuICBXaGVuCisJICogdGhlIGxvY2sgaXMgZGVjcmVtZW50ZWQgdG8gMCwgYWxsIHF1ZXVlcyBpbiB0aGUKKwkgKiB1bnRhZ2dlZF9xdWV1ZXMgYXJyYXkgYXJlIHJ1bi4KKwkgKi8KKwl1X2ludAkJCSAgdW50YWdnZWRfcXVldWVfbG9jazsKKworCS8qCisJICogUGVyLXRhcmdldCBxdWV1ZSBvZiB1bnRhZ2dlZC10cmFuc2FjdGlvbnMuICBUaGUKKwkgKiB0cmFuc2FjdGlvbiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgaXMgdGhlCisJICogY3VycmVudGx5IHBlbmRpbmcgdW50YWdnZWQgdHJhbnNhY3Rpb24gZm9yIHRoZQorCSAqIHRhcmdldC4gIFRoZSBkcml2ZXIgb25seSBhbGxvd3MgYSBzaW5nbGUgdW50YWdnZWQKKwkgKiB0cmFuc2FjdGlvbiBwZXIgdGFyZ2V0LgorCSAqLworCXN0cnVjdCBzY2JfdGFpbHEJICB1bnRhZ2dlZF9xdWV1ZXNbQUhDX05VTV9UQVJHRVRTXTsKKworCS8qCisJICogQnVzIGF0dGFjaG1lbnQgc3BlY2lmaWMgZGF0YS4KKwkgKi8KKwl1bmlvbiBhaGNfYnVzX3NvZnRjCSAgYnVzX3NvZnRjOworCisJLyoKKwkgKiBQbGF0Zm9ybSBzcGVjaWZpYyBkYXRhLgorCSAqLworCXN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKKworCS8qCisJICogUGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uLgorCSAqLworCWFoY19kZXZfc29mdGNfdAkJICBkZXZfc29mdGM7CisKKwkvKgorCSAqIEJ1cyBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uCisJICovCisJYWhjX2J1c19pbnRyX3QJCSAgYnVzX2ludHI7CisKKwkvKgorCSAqIEJ1cyBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiByZXF1aXJlZAorCSAqIGFmdGVyIGEgY2hpcCByZXNldC4KKwkgKi8KKwlhaGNfYnVzX2NoaXBfaW5pdF90CSAgYnVzX2NoaXBfaW5pdDsKKworCS8qCisJICogQnVzIHNwZWNpZmljIHN1c3BlbmQgcm91dGluZS4KKwkgKi8KKwlhaGNfYnVzX3N1c3BlbmRfdAkgIGJ1c19zdXNwZW5kOworCisJLyoKKwkgKiBCdXMgc3BlY2lmaWMgcmVzdW1lIHJvdXRpbmUuCisJICovCisJYWhjX2J1c19yZXN1bWVfdAkgIGJ1c19yZXN1bWU7CisKKwkvKgorCSAqIFRhcmdldCBtb2RlIHJlbGF0ZWQgc3RhdGUga2VwdCBvbiBhIHBlciBlbmFibGVkIGx1biBiYXNpcy4KKwkgKiBUYXJnZXRzIHRoYXQgYXJlIG5vdCBlbmFibGVkIHdpbGwgaGF2ZSBudWxsIGVudHJpZXMuCisJICogQXMgYW4gaW5pdGlhdG9yLCB3ZSBrZWVwIG9uZSB0YXJnZXQgZW50cnkgZm9yIG91ciBpbml0aWF0b3IKKwkgKiBJRCB0byBzdG9yZSBvdXIgc3luYy93aWRlIHRyYW5zZmVyIHNldHRpbmdzLgorCSAqLworCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICAqZW5hYmxlZF90YXJnZXRzW0FIQ19OVU1fVEFSR0VUU107CisKKwkvKgorCSAqIFRoZSBibGFjayBob2xlIGRldmljZSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVxdWVzdHMgZm9yCisJICogZGlzYWJsZWQgbHVucyBvbiBlbmFibGVkIHRhcmdldHMuCisJICovCisJc3RydWN0IGFoY190bW9kZV9sc3RhdGUgICpibGFja19ob2xlOworCisJLyoKKwkgKiBEZXZpY2UgaW5zdGFuY2UgY3VycmVudGx5IG9uIHRoZSBidXMgYXdhaXRpbmcgYSBjb250aW51ZSBUSU8KKwkgKiBmb3IgYSBjb21tYW5kIHRoYXQgd2FzIG5vdCBnaXZlbiB0aGUgZGlzY29ubmVjdCBwcml2ZWxlZGdlLgorCSAqLworCXN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlICAqcGVuZGluZ19kZXZpY2U7CisKKwkvKgorCSAqIENhcmQgY2hhcmFjdGVyaXN0aWNzCisJICovCisJYWhjX2NoaXAJCSAgY2hpcDsKKwlhaGNfZmVhdHVyZQkJICBmZWF0dXJlczsKKwlhaGNfYnVnCQkJICBidWdzOworCWFoY19mbGFnCQkgIGZsYWdzOworCXN0cnVjdCBzZWVwcm9tX2NvbmZpZwkgKnNlZXBfY29uZmlnOworCisJLyogVmFsdWVzIHRvIHN0b3JlIGluIHRoZSBTRVFDVEwgcmVnaXN0ZXIgZm9yIHBhdXNlIGFuZCB1bnBhdXNlICovCisJdWludDhfdAkJCSAgdW5wYXVzZTsKKwl1aW50OF90CQkJICBwYXVzZTsKKworCS8qIENvbW1hbmQgUXVldWVzICovCisJdWludDhfdAkJCSAgcW91dGZpZm9uZXh0OworCXVpbnQ4X3QJCQkgIHFpbmZpZm9uZXh0OworCXVpbnQ4X3QJCQkgKnFvdXRmaWZvOworCXVpbnQ4X3QJCQkgKnFpbmZpZm87CisKKwkvKiBDcml0aWNhbCBTZWN0aW9uIERhdGEgKi8KKwlzdHJ1Y3QgY3MJCSAqY3JpdGljYWxfc2VjdGlvbnM7CisJdV9pbnQJCQkgIG51bV9jcml0aWNhbF9zZWN0aW9uczsKKworCS8qIExpbmtzIGZvciBjaGFpbmluZyBzb2Z0Y3MgKi8KKwlUQUlMUV9FTlRSWShhaGNfc29mdGMpCSAgbGlua3M7CisKKwkvKiBDaGFubmVsIE5hbWVzICgnQScsICdCJywgZXRjLikgKi8KKwljaGFyCQkJICBjaGFubmVsOworCWNoYXIJCQkgIGNoYW5uZWxfYjsKKworCS8qIEluaXRpYXRvciBCdXMgSUQgKi8KKwl1aW50OF90CQkJICBvdXJfaWQ7CisJdWludDhfdAkJCSAgb3VyX2lkX2I7CisKKwkvKgorCSAqIFBDSSBlcnJvciBkZXRlY3Rpb24uCisJICovCisJaW50CQkJICB1bnNvbGljaXRlZF9pbnRzOworCisJLyoKKwkgKiBUYXJnZXQgaW5jb21pbmcgY29tbWFuZCBGSUZPLgorCSAqLworCXN0cnVjdCB0YXJnZXRfY21kCSAqdGFyZ2V0Y21kczsKKwl1aW50OF90CQkJICB0cWluZmlmb25leHQ7CisKKwkvKgorCSAqIENhY2hlZCBjb3B5IG9mIHRoZSBzZXF1ZW5jZXIgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwl1aW50OF90CQkJICBzZXFjdGw7CisKKwkvKgorCSAqIEluY29taW5nIGFuZCBvdXRnb2luZyBtZXNzYWdlIGhhbmRsaW5nLgorCSAqLworCXVpbnQ4X3QJCQkgIHNlbmRfbXNnX3BlcnJvcjsKKwlhaGNfbXNnX3R5cGUJCSAgbXNnX3R5cGU7CisJdWludDhfdAkJCSAgbXNnb3V0X2J1ZlsxMl07LyogTWVzc2FnZSB3ZSBhcmUgc2VuZGluZyAqLworCXVpbnQ4X3QJCQkgIG1zZ2luX2J1ZlsxMl07LyogTWVzc2FnZSB3ZSBhcmUgcmVjZWl2aW5nICovCisJdV9pbnQJCQkgIG1zZ291dF9sZW47CS8qIExlbmd0aCBvZiBtZXNzYWdlIHRvIHNlbmQgKi8KKwl1X2ludAkJCSAgbXNnb3V0X2luZGV4OwkvKiBDdXJyZW50IGluZGV4IGluIG1zZ291dCAqLworCXVfaW50CQkJICBtc2dpbl9pbmRleDsJLyogQ3VycmVudCBpbmRleCBpbiBtc2dpbiAqLworCisJLyoKKwkgKiBNYXBwaW5nIGluZm9ybWF0aW9uIGZvciBkYXRhIHN0cnVjdHVyZXMgc2hhcmVkCisJICogYmV0d2VlbiB0aGUgc2VxdWVuY2VyIGFuZCBrZXJuZWwuCisJICovCisJYnVzX2RtYV90YWdfdAkJICBwYXJlbnRfZG1hdDsKKwlidXNfZG1hX3RhZ190CQkgIHNoYXJlZF9kYXRhX2RtYXQ7CisJYnVzX2RtYW1hcF90CQkgIHNoYXJlZF9kYXRhX2RtYW1hcDsKKwlkbWFfYWRkcl90CQkgIHNoYXJlZF9kYXRhX2J1c2FkZHI7CisKKwkvKgorCSAqIEJ1cyBhZGRyZXNzIG9mIHRoZSBvbmUgYnl0ZSBidWZmZXIgdXNlZCB0bworCSAqIHdvcmstYXJvdW5kIGEgRE1BIGJ1ZyBmb3IgY2hpcHMgPD0gYWljNzg4MAorCSAqIGluIHRhcmdldCBtb2RlLgorCSAqLworCWRtYV9hZGRyX3QJCSAgZG1hX2J1Z19idWY7CisKKwkvKiBOdW1iZXIgb2YgZW5hYmxlZCB0YXJnZXQgbW9kZSBkZXZpY2Ugb24gdGhpcyBjYXJkICovCisJdV9pbnQJCQkgIGVuYWJsZWRfbHVuczsKKworCS8qIEluaXRpYWxpemF0aW9uIGxldmVsIG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgKi8KKwl1X2ludAkJCSAgaW5pdF9sZXZlbDsKKworCS8qIFBDSSBjYWNoZWxpbmUgc2l6ZS4gKi8KKwl1X2ludAkJCSAgcGNpX2NhY2hlc2l6ZTsKKworCS8qCisJICogQ291bnQgb2YgcGFyaXR5IGVycm9ycyB3ZSBoYXZlIHNlZW4gYXMgYSB0YXJnZXQuCisJICogV2UgYXV0by1kaXNhYmxlIHBhcml0eSBlcnJvciBjaGVja2luZyBhZnRlciBzZWVpbmcKKwkgKiBBSENfUENJX1RBUkdFVF9QRVJSX1RIUkVTSCBudW1iZXIgb2YgZXJyb3JzLgorCSAqLworCXVfaW50CQkJICBwY2lfdGFyZ2V0X3BlcnJfY291bnQ7CisjZGVmaW5lCQlBSENfUENJX1RBUkdFVF9QRVJSX1RIUkVTSAkxMAorCisJLyogTWF4aW11bSBudW1iZXIgb2Ygc2VxdWVuY2VyIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQuICovCisJdV9pbnQJCQkgIGluc3RydWN0aW9uX3JhbV9zaXplOworCisJLyogUGVyLVVuaXQgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gKi8KKwljb25zdCBjaGFyCQkgKmRlc2NyaXB0aW9uOworCWNoYXIJCQkgKm5hbWU7CisJaW50CQkJICB1bml0OworCisJLyogU2VsZWN0aW9uIFRpbWVyIHNldHRpbmdzICovCisJaW50CQkJICBzZWx0aW1lOworCWludAkJCSAgc2VsdGltZV9iOworCisJdWludDE2X3QJIAkgIHVzZXJfZGlzY2VuYWJsZTsvKiBEaXNjb25uZWN0aW9uIGFsbG93ZWQgICovCisJdWludDE2X3QJCSAgdXNlcl90YWdlbmFibGU7LyogVGFnZ2VkIFF1ZXVpbmcgYWxsb3dlZCAqLworfTsKKworVEFJTFFfSEVBRChhaGNfc29mdGNfdGFpbHEsIGFoY19zb2Z0Yyk7CitleHRlcm4gc3RydWN0IGFoY19zb2Z0Y190YWlscSBhaGNfdGFpbHE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogQWN0aXZlIERldmljZSBJbmZvcm1hdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVJPTEVfVU5LTk9XTiwKKwlST0xFX0lOSVRJQVRPUiwKKwlST0xFX1RBUkdFVAorfSByb2xlX3Q7CisKK3N0cnVjdCBhaGNfZGV2aW5mbyB7CisJaW50CSBvdXJfc2NzaWlkOworCWludAkgdGFyZ2V0X29mZnNldDsKKwl1aW50MTZfdCB0YXJnZXRfbWFzazsKKwl1X2ludAkgdGFyZ2V0OworCXVfaW50CSBsdW47CisJY2hhcgkgY2hhbm5lbDsKKwlyb2xlX3QJIHJvbGU7CQkvKgorCQkJCSAqIE9ubHkgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IGlmIG5vdAorCQkJCSAqIGluIHRoZSBidXNmcmVlIHN0YXRlLgorCQkJCSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgaW50IChhaGNfZGV2aWNlX3NldHVwX3QpKHN0cnVjdCBhaGNfc29mdGMgKik7CisKK3N0cnVjdCBhaGNfcGNpX2lkZW50aXR5IHsKKwl1aW50NjRfdAkJIGZ1bGxfaWQ7CisJdWludDY0X3QJCSBpZF9tYXNrOworCWNoYXIJCQkqbmFtZTsKKwlhaGNfZGV2aWNlX3NldHVwX3QJKnNldHVwOworfTsKK2V4dGVybiBzdHJ1Y3QgYWhjX3BjaV9pZGVudGl0eSBhaGNfcGNpX2lkZW50X3RhYmxlW107CitleHRlcm4gY29uc3QgdV9pbnQgYWhjX251bV9wY2lfZGV2czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZML0VJU0EgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaWM3NzcwX2lkZW50aXR5IHsKKwl1aW50MzJfdAkJIGZ1bGxfaWQ7CisJdWludDMyX3QJCSBpZF9tYXNrOworCWNvbnN0IGNoYXIJCSpuYW1lOworCWFoY19kZXZpY2Vfc2V0dXBfdAkqc2V0dXA7Cit9OworZXh0ZXJuIHN0cnVjdCBhaWM3NzcwX2lkZW50aXR5IGFpYzc3NzBfaWRlbnRfdGFibGVbXTsKK2V4dGVybiBjb25zdCBpbnQgYWhjX251bV9haWM3NzcwX2RldnM7CisKKyNkZWZpbmUgQUhDX0VJU0FfU0xPVF9PRkZTRVQJMHhjMDAKKyNkZWZpbmUgQUhDX0VJU0FfSU9TSVpFCQkweDEwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfaW50CQkJYWhjX2luZGV4X2J1c3lfdGNsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGNsKTsKK3ZvaWQJCQlhaGNfdW5idXN5X3RjbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRjbCk7Cit2b2lkCQkJYWhjX2J1c3lfdGNsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgIHVfaW50IHRjbCwgdV9pbnQgYnVzeWlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBGcm9udCBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoY19wY2lfaWRlbnRpdHkJKmFoY19maW5kX3BjaV9kZXZpY2UoYWhjX2Rldl9zb2Z0Y190KTsKK2ludAkJCSBhaGNfcGNpX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICosCisJCQkJCXN0cnVjdCBhaGNfcGNpX2lkZW50aXR5ICopOworaW50CQkJIGFoY19wY2lfdGVzdF9yZWdpc3Rlcl9hY2Nlc3Moc3RydWN0IGFoY19zb2Z0YyAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBFSVNBL1ZMIEZyb250IEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICphaWM3NzcwX2ZpbmRfZGV2aWNlKHVpbnQzMl90KTsKK2ludAkJCSBhaWM3NzcwX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCXN0cnVjdCBhaWM3NzcwX2lkZW50aXR5ICosCisJCQkJCXVfaW50IHBvcnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLworaW50CQlhaGNfcHJvYmVfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICopOwordm9pZAkJYWhjX3J1bl91bnRhZ2dlZF9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCWFoY19ydW5fdW50YWdnZWRfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NiX3RhaWxxICpxdWV1ZSk7Cit2b2lkCQlhaGNfcWluZmlmb19yZXF1ZXVlX3RhaWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgc3RydWN0IHNjYiAqc2NiKTsKK2ludAkJYWhjX21hdGNoX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCSAgICAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwgaW50IGx1biwKKwkJCSAgICAgIHVfaW50IHRhZywgcm9sZV90IHJvbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFoY19zb2Z0YwkqYWhjX2FsbG9jKHZvaWQgKnBsYXRmb3JtX2FyZywgY2hhciAqbmFtZSk7CitpbnQJCQkgYWhjX3NvZnRjX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3ZvaWQJCQkgYWhjX2NvbnRyb2xsZXJfaW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgKmJ1Zik7CitpbnQJCQkgYWhjX2NoaXBfaW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworaW50CQkJIGFoY19pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Cit2b2lkCQkJIGFoY19pbnRyX2VuYWJsZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBlbmFibGUpOwordm9pZAkJCSBhaGNfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworaW50CQkJIGFoY19zdXNwZW5kKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7IAoraW50CQkJIGFoY19yZXN1bWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQkgYWhjX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhjX3NvZnRjICopOworc3RydWN0IGFoY19zb2Z0YwkqYWhjX2ZpbmRfc29mdGMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQkgYWhjX3NldF91bml0KHN0cnVjdCBhaGNfc29mdGMgKiwgaW50KTsKK3ZvaWQJCQkgYWhjX3NldF9uYW1lKHN0cnVjdCBhaGNfc29mdGMgKiwgY2hhciAqKTsKK3ZvaWQJCQkgYWhjX2FsbG9jX3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQkgYWhjX2ZyZWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK2ludAkJCSBhaGNfcmVzZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgcmVpbml0KTsKK3ZvaWQJCQkgYWhjX3NodXRkb3duKHZvaWQgKmFyZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW50ZXJydXB0IFNlcnZpY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCQkJYWhjX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQlhaGNfcnVuX3FvdXRmaWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCit2b2lkCQkJYWhjX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBwYXVzZWQpOworI2VuZGlmCit2b2lkCQkJYWhjX2hhbmRsZV9icmthZHJpbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQlhaGNfaGFuZGxlX3NlcWludChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGludHN0YXQpOwordm9pZAkJCWFoY19oYW5kbGVfc2NzaWludChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHVfaW50IGludHN0YXQpOwordm9pZAkJCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFcnJvciBSZWNvdmVyeSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVNFQVJDSF9DT01QTEVURSwKKwlTRUFSQ0hfQ09VTlQsCisJU0VBUkNIX1JFTU9WRQorfSBhaGNfc2VhcmNoX2FjdGlvbjsKK2ludAkJCWFoY19zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCisJCQkJCSAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAorCQkJCQkgICByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkJCQkgICBhaGNfc2VhcmNoX2FjdGlvbiBhY3Rpb24pOworaW50CQkJYWhjX3NlYXJjaF91bnRhZ2dlZF9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJICAgYWhjX2lvX2N0eF90IGN0eCwKKwkJCQkJCSAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJCQkJCSAgIGludCBsdW4sIHVpbnQzMl90IHN0YXR1cywKKwkJCQkJCSAgIGFoY19zZWFyY2hfYWN0aW9uIGFjdGlvbik7CitpbnQJCQlhaGNfc2VhcmNoX2Rpc2NfbGlzdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCisJCQkJCSAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJCSAgICAgaW50IHN0b3Bfb25fZmlyc3QsIGludCByZW1vdmUsCisJCQkJCSAgICAgaW50IHNhdmVfc3RhdGUpOwordm9pZAkJCWFoY19mcmVlemVfZGV2cShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYik7CitpbnQJCQlhaGNfcmVzZXRfY2hhbm5lbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgY2hhbm5lbCwKKwkJCQkJICBpbnQgaW5pdGlhdGVfcmVzZXQpOworaW50CQkJYWhjX2Fib3J0X3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LAorCQkJCSAgICAgICBjaGFyIGNoYW5uZWwsIGludCBsdW4sIHVfaW50IHRhZywKKwkJCQkgICAgICAgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cyk7Cit2b2lkCQkJYWhjX3Jlc3RhcnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3ZvaWQJCQlhaGNfY2FsY19yZXNpZHVhbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgc3RydWN0IHNjYiAqc2NiKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVXRpbGl0eSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3BoYXNlX3RhYmxlX2VudHJ5KgorCQkJYWhjX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpOwordm9pZAkJCWFoY19jb21waWxlX2RldmluZm8oc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJCQkgICAgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCisJCQkJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwKKwkJCQkJICAgIHJvbGVfdCByb2xlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3N5bmNyYXRlKglhaGNfZmluZF9zeW5jcmF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50ICpwZXJpb2QsCisJCQkJCSAgdV9pbnQgKnBwcl9vcHRpb25zLCB1X2ludCBtYXhzeW5jKTsKK3VfaW50CQkJYWhjX2ZpbmRfcGVyaW9kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJdV9pbnQgc2NzaXJhdGUsIHVfaW50IG1heHN5bmMpOwordm9pZAkJCWFoY192YWxpZGF0ZV9vZmZzZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICAgc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvLAorCQkJCQkgICAgc3RydWN0IGFoY19zeW5jcmF0ZSAqc3luY3JhdGUsCisJCQkJCSAgICB1X2ludCAqb2Zmc2V0LCBpbnQgd2lkZSwKKwkJCQkJICAgIHJvbGVfdCByb2xlKTsKK3ZvaWQJCQlhaGNfdmFsaWRhdGVfd2lkdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCisJCQkJCSAgIHVfaW50ICpidXNfd2lkdGgsCisJCQkJCSAgIHJvbGVfdCByb2xlKTsKKy8qCisgKiBOZWdvdGlhdGlvbiB0eXBlcy4gIFRoZXNlIGFyZSB1c2VkIHRvIHF1YWxpZnkgaWYgd2Ugc2hvdWxkIHJlbmVnb3RpYXRlCisgKiBldmVuIGlmIG91ciBnb2FsIGFuZCBjdXJyZW50IHRyYW5zcG9ydCBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhDX05FR19UT19HT0FMLAkvKiBSZW5lZ290aWF0ZSBvbmx5IGlmIGdvYWwgYW5kIGN1cnIgZGlmZmVyLiAqLworCUFIQ19ORUdfSUZfTk9OX0FTWU5DLAkvKiBSZW5lZ290aWF0ZSBzbyBsb25nIGFzIGdvYWwgaXMgbm9uLWFzeW5jLiAqLworCUFIQ19ORUdfQUxXQVlTCQkvKiBSZW5lZ290aWF0IGV2ZW4gaWYgZ29hbCBpcyBhc3luYy4gKi8KK30gYWhjX25lZ190eXBlOworaW50CQkJYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChzdHJ1Y3QgYWhjX3NvZnRjKiwKKwkJCQkJICAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyosCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSosCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyosCisJCQkJCSAgICAgICBhaGNfbmVnX3R5cGUpOwordm9pZAkJCWFoY19zZXRfd2lkdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkgICAgICB1X2ludCB3aWR0aCwgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCk7Cit2b2lkCQkJYWhjX3NldF9zeW5jcmF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkJCSBzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZSwKKwkJCQkJIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAorCQkJCQkgdV9pbnQgcHByX29wdGlvbnMsCisJCQkJCSB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKTsKK3R5cGVkZWYgZW51bSB7CisJQUhDX1FVRVVFX05PTkUsCisJQUhDX1FVRVVFX0JBU0lDLAorCUFIQ19RVUVVRV9UQUdHRUQKK30gYWhjX3F1ZXVlX2FsZzsKKwordm9pZAkJCWFoY19zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkJICAgICBhaGNfcXVldWVfYWxnIGFsZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhcmdldCBNb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCit2b2lkCQlhaGNfc2VuZF9sc3RhdGVfZXZlbnRzKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkgICAgICAgc3RydWN0IGFoY190bW9kZV9sc3RhdGUgKik7Cit2b2lkCQlhaGNfaGFuZGxlX2VuX2x1bihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYik7CitjYW1fc3RhdHVzCWFoY19maW5kX3Rtb2RlX2RldnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYiwKKwkJCQkgICAgc3RydWN0IGFoY190bW9kZV90c3RhdGUgKip0c3RhdGUsCisJCQkJICAgIHN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlICoqbHN0YXRlLAorCQkJCSAgICBpbnQgbm90Zm91bmRfZmFpbHVyZSk7CisjaWZuZGVmIEFIQ19UTU9ERV9FTkFCTEUKKyNkZWZpbmUgQUhDX1RNT0RFX0VOQUJMRSAwCisjZW5kaWYKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGVidWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIQ19ERUJVRworZXh0ZXJuIHVpbnQzMl90IGFoY19kZWJ1ZzsKKyNkZWZpbmUJQUhDX1NIT1dfTUlTQwkJMHgwMDAxCisjZGVmaW5lCUFIQ19TSE9XX1NFTlNFCQkweDAwMDIKKyNkZWZpbmUgQUhDX0RVTVBfU0VFUFJPTQkweDAwMDQKKyNkZWZpbmUgQUhDX1NIT1dfVEVSTUNUTAkweDAwMDgKKyNkZWZpbmUgQUhDX1NIT1dfTUVNT1JZCQkweDAwMTAKKyNkZWZpbmUgQUhDX1NIT1dfTUVTU0FHRVMJMHgwMDIwCisjZGVmaW5lCUFIQ19TSE9XX0RWCQkweDAwNDAKKyNkZWZpbmUgQUhDX1NIT1dfU0VMVE8JCTB4MDA4MAorI2RlZmluZSBBSENfU0hPV19RRlVMTAkJMHgwMjAwCisjZGVmaW5lIEFIQ19TSE9XX1FVRVVFCQkweDA0MDAKKyNkZWZpbmUgQUhDX1NIT1dfVFFJTgkJMHgwODAwCisjZGVmaW5lIEFIQ19TSE9XX01BU0tFRF9FUlJPUlMJMHgxMDAwCisjZGVmaW5lIEFIQ19ERUJVR19TRVFVRU5DRVIJMHgyMDAwCisjZW5kaWYKK3ZvaWQJCQlhaGNfcHJpbnRfc2NiKHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCQkJYWhjX3ByaW50X2RldmluZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2KTsKK3ZvaWQJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitpbnQJCQlhaGNfcHJpbnRfcmVnaXN0ZXIoYWhjX3JlZ19wYXJzZV9lbnRyeV90ICp0YWJsZSwKKwkJCQkJICAgdV9pbnQgbnVtX2VudHJpZXMsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHVfaW50IGFkZHJlc3MsCisJCQkJCSAgIHVfaW50IHZhbHVlLAorCQkJCQkgICB1X2ludCAqY3VyX2NvbHVtbiwKKwkJCQkJICAgdV9pbnQgd3JhcF9wb2ludCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTRUVQUk9NICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCWFoY19hY3F1aXJlX3NlZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICBzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCk7Cit2b2lkCQlhaGNfcmVsZWFzZV9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkKTsKKyNlbmRpZiAvKiBfQUlDN1hYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBlYzcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5yZWcKQEAgLTAsMCArMSwxNTk0IEBACisvKgorICogQWljN3h4eCByZWdpc3RlciBhbmQgc2NyYXRjaCByYW0gZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJEZyZWVCU0QkCisgKi8KK1ZFUlNJT04gPSAiJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnJlZyMzOSAkIgorCisvKgorICogVGhpcyBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgYWljN3h4eF9hc20gdXRpbGl0eSBmb3IgdXNlIGluIGFzc2VtYmxpbmcKKyAqIGZpcm13YXJlIGZvciB0aGUgYWljN3h4eCBmYW1pbHkgb2YgU0NTSSBob3N0IGFkYXB0ZXJzIGFzIHdlbGwgYXMgdG8gZ2VuZXJhdGUKKyAqIGEgQyBoZWFkZXIgZmlsZSBmb3IgdXNlIGluIHRoZSBrZXJuZWwgcG9ydGlvbiBvZiB0aGUgQWljN3h4eCBkcml2ZXIuCisgKgorICogQWxsIHBhZ2UgbnVtYmVycyByZWZlciB0byB0aGUgQWRhcHRlYyBBSUMtNzc3MCBEYXRhIEJvb2sgYXZhaWxhYmxlIGZyb20KKyAqIEFkYXB0ZWMncyBUZWNobmljYWwgRG9jdW1lbnRzIERlcGFydG1lbnQgMS04MDAtOTM0LTI3NjYKKyAqLworCisvKgorICogU0NTSSBTZXF1ZW5jZSBDb250cm9sIChwLiAzLTExKS4KKyAqIEVhY2ggYml0LCB3aGVuIHNldCBzdGFydHMgYSBzcGVjaWZpYyBTQ1NJIHNlcXVlbmNlIG9uIHRoZSBidXMKKyAqLworcmVnaXN0ZXIgU0NTSVNFUSB7CisJYWRkcmVzcwkJCTB4MDAwCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlURU1PREUJCTB4ODAKKwlmaWVsZAlFTlNFTE8JCTB4NDAKKwlmaWVsZAlFTlNFTEkJCTB4MjAKKwlmaWVsZAlFTlJTRUxJCQkweDEwCisJZmllbGQJRU5BVVRPQVROTwkweDA4CisJZmllbGQJRU5BVVRPQVROSQkweDA0CisJZmllbGQJRU5BVVRPQVROUAkweDAyCisJZmllbGQJU0NTSVJTVE8JMHgwMQorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDAgUmVnaXN0ZXIgKHBwLiAzLTEzKS4KKyAqIENvbnRyb2xzIHRoZSBTQ1NJIG1vZHVsZSBkYXRhIHBhdGguCisgKi8KK3JlZ2lzdGVyIFNYRlJDVEwwIHsKKwlhZGRyZXNzCQkJMHgwMDEKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCURGT04JCTB4ODAKKwlmaWVsZAlERlBFWFAJCTB4NDAKKwlmaWVsZAlGQVNUMjAJCTB4MjAKKwlmaWVsZAlDTFJTVENOVAkweDEwCisJZmllbGQJU1BJT0VOCQkweDA4CisJZmllbGQJU0NBTUVOCQkweDA0CisJZmllbGQJQ0xSQ0hOCQkweDAyCit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvbnRyb2wgMSBSZWdpc3RlciAocHAuIDMtMTQsMTUpLgorICogQ29udHJvbHMgdGhlIFNDU0kgbW9kdWxlIGRhdGEgcGF0aC4KKyAqLworcmVnaXN0ZXIgU1hGUkNUTDEgeworCWFkZHJlc3MJCQkweDAwMgorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJQklUQlVDS0VUCTB4ODAKKwlmaWVsZAlTV1JBUEVOCQkweDQwCisJZmllbGQJRU5TUENISwkJMHgyMAorCW1hc2sJU1RJTUVTRUwJMHgxOAorCWZpZWxkCUVOU1RJTUVSCTB4MDQKKwlmaWVsZAlBQ1RORUdFTgkweDAyCisJZmllbGQJU1RQV0VOCQkweDAxCS8qIFBvd2VyZWQgVGVybWluYXRpb24gKi8KK30KKworLyoKKyAqIFNDU0kgQ29udHJvbCBTaWduYWwgUmVhZCBSZWdpc3RlciAocC4gMy0xNSkuCisgKiBSZWFkcyB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBTQ1NJIGJ1cyBwaW5zCisgKi8KK3JlZ2lzdGVyIFNDU0lTSUdJIHsKKwlhZGRyZXNzCQkJMHgwMDMKKwlhY2Nlc3NfbW9kZSBSTworCWZpZWxkCUNESQkJMHg4MAorCWZpZWxkCUlPSQkJMHg0MAorCWZpZWxkCU1TR0kJCTB4MjAKKwlmaWVsZAlBVE5JCQkweDEwCisJZmllbGQJU0VMSQkJMHgwOAorCWZpZWxkCUJTWUkJCTB4MDQKKwlmaWVsZAlSRVFJCQkweDAyCisJZmllbGQJQUNLSQkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyBpbiBTQ1NJU0lHSQorICovCisJbWFzawlQSEFTRV9NQVNLCUNESXxJT0l8TVNHSQorCW1hc2sJUF9EQVRBT1VUCTB4MDAKKwltYXNrCVBfREFUQUlOCUlPSQorCW1hc2sJUF9EQVRBT1VUX0RUCVBfREFUQU9VVHxNU0dJCisJbWFzawlQX0RBVEFJTl9EVAlQX0RBVEFJTnxNU0dJCisJbWFzawlQX0NPTU1BTkQJQ0RJCisJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwltYXNrCVBfU1RBVFVTCUNESXxJT0kKKwltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorfQorCisvKgorICogU0NTSSBDb250cm9sIFNpZ25hbCBXcml0ZSBSZWdpc3RlciAocC4gMy0xNikuCisgKiBXcml0aW5nIHRvIHRoaXMgcmVnaXN0ZXIgbW9kaWZpZXMgdGhlIGNvbnRyb2wgc2lnbmFscyBvbiB0aGUgYnVzLiAgT25seQorICogdGhvc2Ugc2lnbmFscyB0aGF0IGFyZSBhbGxvd2VkIGluIHRoZSBjdXJyZW50IG1vZGUgKEluaXRpYXRvci9UYXJnZXQpIGFyZQorICogYXNzZXJ0ZWQuCisgKi8KK3JlZ2lzdGVyIFNDU0lTSUdPIHsKKwlhZGRyZXNzCQkJMHgwMDMKKwlhY2Nlc3NfbW9kZSBXTworCWZpZWxkCUNETwkJMHg4MAorCWZpZWxkCUlPTwkJMHg0MAorCWZpZWxkCU1TR08JCTB4MjAKKwlmaWVsZAlBVE5PCQkweDEwCisJZmllbGQJU0VMTwkJMHgwOAorCWZpZWxkCUJTWU8JCTB4MDQKKwlmaWVsZAlSRVFPCQkweDAyCisJZmllbGQJQUNLTwkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyB0byB3cml0ZSBpbnRvIFNDU0lTSUcwCisgKi8KKwltYXNrCVBIQVNFX01BU0sJQ0RJfElPSXxNU0dJCisJbWFzawlQX0RBVEFPVVQJMHgwMAorCW1hc2sJUF9EQVRBSU4JSU9JCisJbWFzawlQX0NPTU1BTkQJQ0RJCisJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwltYXNrCVBfU1RBVFVTCUNESXxJT0kKKwltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorfQorCisvKiAKKyAqIFNDU0kgUmF0ZSBDb250cm9sIChwLiAzLTE3KS4KKyAqIENvbnRlbnRzIG9mIHRoaXMgcmVnaXN0ZXIgZGV0ZXJtaW5lIHRoZSBTeW5jaHJvbm91cyBTQ1NJIGRhdGEgdHJhbnNmZXIKKyAqIHJhdGUgYW5kIHRoZSBtYXhpbXVtIHN5bmNocm9ub3VzIFJlcS9BY2sgb2Zmc2V0LiAgQW4gb2Zmc2V0IG9mIDAgaW4gdGhlCisgKiBTT0ZTICgzOjApIGJpdHMgZGlzYWJsZXMgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMuICBBbnkgb2Zmc2V0IHZhbHVlCisgKiBncmVhdGVyIHRoYW4gMCBlbmFibGVzIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKyAqLworcmVnaXN0ZXIgU0NTSVJBVEUgeworCWFkZHJlc3MJCQkweDAwNAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJV0lERVhGRVIJMHg4MAkJLyogV2lkZSB0cmFuc2ZlciBjb250cm9sICovCisJZmllbGQJRU5BQkxFX0NSQwkweDQwCQkvKiBDUkMgZm9yIEQtUGhhc2VzICovCisJZmllbGQJU0lOR0xFX0VER0UJMHgxMAkJLyogRGlzYWJsZSBEVCBUcmFuc2ZlcnMgKi8KKwltYXNrCVNYRlIJCTB4NzAJCS8qIFN5bmMgdHJhbnNmZXIgcmF0ZSAqLworCW1hc2sJU1hGUl9VTFRSQTIJMHgwZgkJLyogU3luYyB0cmFuc2ZlciByYXRlICovCisJbWFzawlTT0ZTCQkweDBmCQkvKiBTeW5jIG9mZnNldCAqLworfQorCisvKgorICogU0NTSSBJRCAocC4gMy0xOCkuCisgKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGJvYXJkIGFuZCB0aGUgY3VycmVudCB0YXJnZXQgb24gdGhlCisgKiBzZWxlY3RlZCBjaGFubmVsLgorICovCityZWdpc3RlciBTQ1NJSUQJeworCWFkZHJlc3MJCQkweDAwNQorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlUSUQJCTB4ZjAJCS8qIFRhcmdldCBJRCBtYXNrICovCisJbWFzawlUV0lOX1RJRAkweDcwCisJZmllbGQJVFdJTl9DSE5MQgkweDgwCisJbWFzawlPSUQJCTB4MGYJCS8qIE91ciBJRCBtYXNrICovCisJLyoKKwkgKiBTQ1NJIE1heGltdW0gT2Zmc2V0IChwLiA0LTYxIGFpYzc4OTAvOTEgRGF0YSBCb29rKQorCSAqIFRoZSBhaWM3ODkwLzkxIGFsbG93IGFuIG9mZnNldCBvZiB1cCB0byAxMjcgdHJhbnNmZXJzIGluIGJvdGggd2lkZQorCSAqIGFuZCBuYXJyb3cgbW9kZS4KKwkgKi8KKwlhbGlhcwlTQ1NJT0ZGU0VUCisJbWFzawlTT0ZTX1VMVFJBMgkweDdmCQkvKiBTeW5jIG9mZnNldCBVMiBjaGlwcyAqLworfQorCisvKgorICogU0NTSSBMYXRjaGVkIERhdGEgKHAuIDMtMTkpLgorICogUmVhZC9Xcml0ZSBsYXRjaGVzIHVzZWQgdG8gdHJhbnNmZXIgZGF0YSBvbiB0aGUgU0NTSSBidXMgZHVyaW5nCisgKiBBdXRvbWF0aWMgb3IgTWFudWFsIFBJTyBtb2RlLiAgU0NTSURBVEggY2FuIGJlIHVzZWQgZm9yIHRoZQorICogdXBwZXIgYnl0ZSBvZiBhIDE2Yml0IHdpZGUgYXN5bmNocm9ub3VzZSBkYXRhIHBoYXNlIHRyYW5zZmVyLgorICovCityZWdpc3RlciBTQ1NJREFUTCB7CisJYWRkcmVzcwkJCTB4MDA2CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgU0NTSURBVEggeworCWFkZHJlc3MJCQkweDAwNworCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBTQ1NJIFRyYW5zZmVyIENvdW50IChwcC4gMy0xOSwyMCkKKyAqIFRoZXNlIHJlZ2lzdGVycyBjb3VudCBkb3duIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQKKyAqIGFjcm9zcyB0aGUgU0NTSSBidXMuICBUaGUgY291bnRlciBpcyBkZWNyZW1lbnRlZCBvbmx5IG9uY2UKKyAqIHRoZSBkYXRhIGhhcyBiZWVuIHNhZmVseSB0cmFuc2ZlcnJlZC4gIFNET05FIGluIFNTVEFUMCBpcworICogc2V0IHdoZW4gU1RDTlQgZ29lcyB0byAwCisgKi8gCityZWdpc3RlciBTVENOVCB7CisJYWRkcmVzcwkJCTB4MDA4CisJc2l6ZQkzCisJYWNjZXNzX21vZGUgUlcKK30KKworLyogQUxUX01PREUgcmVnaXN0ZXJzIChVbHRyYTIgYW5kIFVsdHJhMTYwIGNoaXBzKSAqLworcmVnaXN0ZXIgU1hGUkNUTDIgeworCWFkZHJlc3MJCQkweDAxMworCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJQVVUT1JTVERJUwkweDEwCisJZmllbGQJQ01ERE1BRU4JMHgwOAorCW1hc2sJQVNZTkNfU0VUVVAJMHgwNworfQorCisvKiBBTFRfTU9ERSByZWdpc3RlciBvbiBVbHRyYTE2MCBjaGlwcyAqLworcmVnaXN0ZXIgT1BUSU9OTU9ERSB7CisJYWRkcmVzcwkJCTB4MDA4CisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlBVVRPUkFURUVOCQkweDgwCisJZmllbGQJQVVUT0FDS0VOCQkweDQwCisJZmllbGQJQVROTUdNTlRFTgkJMHgyMAorCWZpZWxkCUJVU0ZSRUVSRVYJCTB4MTAKKwlmaWVsZAlFWFBQSEFTRURJUwkJMHgwOAorCWZpZWxkCVNDU0lEQVRMX0lNR0VOCQkweDA0CisJZmllbGQJQVVUT19NU0dPVVRfREUJCTB4MDIKKwlmaWVsZAlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorCW1hc2sJT1BUSU9OTU9ERV9ERUZBVUxUUwlBVVRPX01TR09VVF9ERXxESVNfTVNHSU5fRFVBTEVER0UKK30KKworLyogQUxUX01PREUgcmVnaXN0ZXIgb24gVWx0cmExNjAgY2hpcHMgKi8KK3JlZ2lzdGVyIFRBUkdDUkNDTlQgeworCWFkZHJlc3MJCQkweDAwYQorCXNpemUJMgorCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAwIChwLiAzLTIwKQorICogV3JpdGluZyBhIDEgdG8gYSBiaXQgY2xlYXJzIHRoZSBhc3NvY2lhdGVkIFNDU0kgSW50ZXJydXB0IGluIFNTVEFUMC4KKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDAgeworCWFkZHJlc3MJCQkweDAwYgorCWFjY2Vzc19tb2RlIFdPCisJZmllbGQJQ0xSU0VMRE8JMHg0MAorCWZpZWxkCUNMUlNFTERJCTB4MjAKKwlmaWVsZAlDTFJTRUxJTkdPCTB4MTAKKwlmaWVsZAlDTFJTV1JBUAkweDA4CisJZmllbGQJQ0xSSU9FUlIJMHgwOAkvKiBVbHRyYTIgT25seSAqLworCWZpZWxkCUNMUlNQSU9SRFkJMHgwMgorfQorCisvKgorICogU0NTSSBTdGF0dXMgMCAocC4gMy0yMSkKKyAqIENvbnRhaW5zIG9uZSBzZXQgb2YgU0NTSSBJbnRlcnJ1cHQgY29kZXMKKyAqIFRoZXNlIGFyZSBtb3N0IGxpa2VseSBvZiBpbnRlcmVzdCB0byB0aGUgc2VxdWVuY2VyCisgKi8KK3JlZ2lzdGVyIFNTVEFUMAl7CisJYWRkcmVzcwkJCTB4MDBiCisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlUQVJHRVQJCTB4ODAJLyogQm9hcmQgYWN0aW5nIGFzIHRhcmdldCAqLworCWZpZWxkCVNFTERPCQkweDQwCS8qIFNlbGVjdGlvbiBEb25lICovCisJZmllbGQJU0VMREkJCTB4MjAJLyogQm9hcmQgaGFzIGJlZW4gc2VsZWN0ZWQgKi8KKwlmaWVsZAlTRUxJTkdPCQkweDEwCS8qIFNlbGVjdGlvbiBJbiBQcm9ncmVzcyAqLworCWZpZWxkCVNXUkFQCQkweDA4CS8qIDI0Yml0IGNvdW50ZXIgd3JhcCAqLworCWZpZWxkCUlPRVJSCQkweDA4CS8qIExWRCBUcmFuY2VpdmVyIG1vZGUgY2hhbmdlZCAqLworCWZpZWxkCVNET05FCQkweDA0CS8qIFNUQ05UID0gMHgwMDAwMDAgKi8KKwlmaWVsZAlTUElPUkRZCQkweDAyCS8qIFNDU0kgUElPIFJlYWR5ICovCisJZmllbGQJRE1BRE9ORQkJMHgwMQkvKiBETUEgdHJhbnNmZXIgY29tcGxldGVkICovCit9CisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAxIChwLiAzLTIzKQorICogV3JpdGluZyBhIDEgdG8gYSBiaXQgY2xlYXJzIHRoZSBhc3NvY2lhdGVkIFNDU0kgSW50ZXJydXB0IGluIFNTVEFUMS4KKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDEgeworCWFkZHJlc3MJCQkweDAwYworCWFjY2Vzc19tb2RlIFdPCisJZmllbGQJQ0xSU0VMVElNRU8JMHg4MAorCWZpZWxkCUNMUkFUTk8JCTB4NDAKKwlmaWVsZAlDTFJTQ1NJUlNUSQkweDIwCisJZmllbGQJQ0xSQlVTRlJFRQkweDA4CisJZmllbGQJQ0xSU0NTSVBFUlIJMHgwNAorCWZpZWxkCUNMUlBIQVNFQ0hHCTB4MDIKKwlmaWVsZAlDTFJSRVFJTklUCTB4MDEKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDEgKHAuIDMtMjQpCisgKi8KK3JlZ2lzdGVyIFNTVEFUMQl7CisJYWRkcmVzcwkJCTB4MDBjCisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlTRUxUTwkJMHg4MAorCWZpZWxkCUFUTlRBUkcgCTB4NDAKKwlmaWVsZAlTQ1NJUlNUSQkweDIwCisJZmllbGQJUEhBU0VNSVMJMHgxMAorCWZpZWxkCUJVU0ZSRUUJCTB4MDgKKwlmaWVsZAlTQ1NJUEVSUgkweDA0CisJZmllbGQJUEhBU0VDSEcJMHgwMgorCWZpZWxkCVJFUUlOSVQJCTB4MDEKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDIgKHBwLiAzLTI1LDI2KQorICovCityZWdpc3RlciBTU1RBVDIgeworCWFkZHJlc3MJCQkweDAwZAorCWFjY2Vzc19tb2RlIFJPCisJZmllbGQJT1ZFUlJVTgkJMHg4MAorCWZpZWxkCVNIVkFMSUQJCTB4NDAJLyogU2hhZGRvdyBMYXllciBub24temVybyAqLworCWZpZWxkCUVYUF9BQ1RJVkUJMHgxMAkvKiBTQ1NJIEV4cGFuZGVyIEFjdGl2ZSAqLworCWZpZWxkCUNSQ1ZBTEVSUgkweDA4CS8qIENSQyBkb2Vzbid0IG1hdGNoIChVMyBvbmx5KSAqLworCWZpZWxkCUNSQ0VOREVSUgkweDA0CS8qIE5vIHRlcm1pbmFsIENSQyBwYWNrZXQgKFUzIG9ubHkpICovCisJZmllbGQJQ1JDUkVRRVJSCTB4MDIJLyogSWxsZWdhbCBDUkMgcGFja2V0IHJlcSAoVTMgb25seSkgKi8KKwlmaWVsZAlEVUFMX0VER0VfRVJSCTB4MDEJLyogSW5jb3JyZWN0IGRhdGEgcGhhc2UgKFUzIG9ubHkpICovCisJbWFzawlTRkNOVAkJMHgxZgorfQorCisvKgorICogU0NTSSBTdGF0dXMgMyAocC4gMy0yNikKKyAqLworcmVnaXN0ZXIgU1NUQVQzIHsKKwlhZGRyZXNzCQkJMHgwMGUKKwlhY2Nlc3NfbW9kZSBSTworCW1hc2sJU0NTSUNOVAkJMHhmMAorCW1hc2sJT0ZGQ05UCQkweDBmCisJbWFzawlVMk9GRkNOVAkweDdmCit9CisKKy8qCisgKiBTQ1NJIElEIGZvciB0aGUgYWljNzg5MC85MSBjaGlwcworICovCityZWdpc3RlciBTQ1NJSURfVUxUUkEyIHsKKwlhZGRyZXNzCQkJMHgwMGYKKwlhY2Nlc3NfbW9kZSBSVworCW1hc2sJVElECQkweGYwCQkvKiBUYXJnZXQgSUQgbWFzayAqLworCW1hc2sJT0lECQkweDBmCQkvKiBPdXIgSUQgbWFzayAqLworfQorCisvKgorICogU0NTSSBJbnRlcnJ1cHQgTW9kZSAxIChwLiAzLTI4KQorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUwIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTAgeworCWFkZHJlc3MJCQkweDAxMAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRU5TRUxETwkJMHg0MAorCWZpZWxkCUVOU0VMREkJCTB4MjAKKwlmaWVsZAlFTlNFTElOR08JMHgxMAorCWZpZWxkCUVOU1dSQVAJCTB4MDgKKwlmaWVsZAlFTklPRVJSCQkweDA4CS8qIExWRCBUcmFuY2VpdmVyIG1vZGUgY2hhbmdlcyAqLworCWZpZWxkCUVOU0RPTkUJCTB4MDQKKwlmaWVsZAlFTlNQSU9SRFkJMHgwMgorCWZpZWxkCUVORE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBTQ1NJIEludGVycnVwdCBNb2RlIDEgKHBwLiAzLTI4LDI5KQorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUxIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTEgeworCWFkZHJlc3MJCQkweDAxMQorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRU5TRUxUSU1PCTB4ODAKKwlmaWVsZAlFTkFUTlRBUkcJMHg0MAorCWZpZWxkCUVOU0NTSVJTVAkweDIwCisJZmllbGQJRU5QSEFTRU1JUwkweDEwCisJZmllbGQJRU5CVVNGUkVFCTB4MDgKKwlmaWVsZAlFTlNDU0lQRVJSCTB4MDQKKwlmaWVsZAlFTlBIQVNFQ0hHCTB4MDIKKwlmaWVsZAlFTlJFUUlOSVQJMHgwMQorfQorCisvKgorICogU0NTSSBEYXRhIEJ1cyAoSGlnaCkgKHAuIDMtMjkpCisgKiBUaGlzIHJlZ2lzdGVyIHJlYWRzIGRhdGEgb24gdGhlIFNDU0kgRGF0YSBidXMgZGlyZWN0bHkuCisgKi8KK3JlZ2lzdGVyIFNDU0lCVVNMIHsKKwlhZGRyZXNzCQkJMHgwMTIKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTQ1NJQlVTSCB7CisJYWRkcmVzcwkJCTB4MDEzCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDU0kvSG9zdCBBZGRyZXNzIChwLiAzLTMwKQorICogVGhlc2UgcmVnaXN0ZXJzIGhvbGQgdGhlIGhvc3QgYWRkcmVzcyBmb3IgdGhlIGJ5dGUgYWJvdXQgdG8gYmUKKyAqIHRyYW5zZmVycmVkIG9uIHRoZSBTQ1NJIGJ1cy4gIFRoZXkgYXJlIGNvdW50ZWQgdXAgaW4gdGhlIHNhbWUKKyAqIG1hbm5lciBhcyBTVENOVCBpcyBjb3VudGVkIGRvd24uICBTSEFERFIgc2hvdWxkIGFsd2F5cyBiZSB1c2VkCisgKiB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgYnl0ZSB0cmFuc2ZlcnJlZCBzaW5jZSBIQUREUgorICogY2FuIGJlIHNrZXdlZCBieSB3cml0ZSBhaGVhZC4KKyAqLworcmVnaXN0ZXIgU0hBRERSIHsKKwlhZGRyZXNzCQkJMHgwMTQKKwlzaXplCTQKKwlhY2Nlc3NfbW9kZSBSTworfQorCisvKgorICogU2VsZWN0aW9uIFRpbWVvdXQgVGltZXIgKHAuIDMtMzApCisgKi8KK3JlZ2lzdGVyIFNFTFRJTUVSIHsKKwlhZGRyZXNzCQkJMHgwMTgKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVNUQUdFNgkJMHgyMAorCWZpZWxkCVNUQUdFNQkJMHgxMAorCWZpZWxkCVNUQUdFNAkJMHgwOAorCWZpZWxkCVNUQUdFMwkJMHgwNAorCWZpZWxkCVNUQUdFMgkJMHgwMgorCWZpZWxkCVNUQUdFMQkJMHgwMQorCWFsaWFzCVRBUkdJRElOCit9CisKKy8qCisgKiBTZWxlY3Rpb24vUmVzZWxlY3Rpb24gSUQgKHAuIDMtMzEpCisgKiBVcHBlciBmb3VyIGJpdHMgYXJlIHRoZSBkZXZpY2UgaWQuICBUaGUgT05FQklUIGlzIHNldCB3aGVuIHRoZSByZS9zZWxlY3RpbmcKKyAqIGRldmljZSBkaWQgbm90IHNldCBpdHMgb3duIElELgorICovCityZWdpc3RlciBTRUxJRCB7CisJYWRkcmVzcwkJCTB4MDE5CisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFTElEX01BU0sJMHhmMAorCWZpZWxkCU9ORUJJVAkJMHgwOAorfQorCityZWdpc3RlciBTQ0FNQ1RMIHsKKwlhZGRyZXNzCQkJMHgwMWEKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCUVOU0NBTVNFTE8JMHg4MAorCWZpZWxkCUNMUlNDQU1TRUxJRAkweDQwCisJZmllbGQJQUxUU1RJTQkJMHgyMAorCWZpZWxkCURGTFRUSUQJCTB4MTAKKwltYXNrCVNDQU1MVkwJCTB4MDMKK30KKworLyoKKyAqIFRhcmdldCBNb2RlIFNlbGVjdGluZyBpbiBJRCBiaXRtYXNrIChhaWM3ODkwLzkxLzk2Lzk3KQorICovCityZWdpc3RlciBUQVJHSUQgeworCWFkZHJlc3MJCQkweDAxYgorCXNpemUJCQkyCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNlcmlhbCBQb3J0IEkvTyBDYWJhYmlsaXR5IHJlZ2lzdGVyIChwLiA0LTk1IGFpYzc4NjAgRGF0YSBCb29rKQorICogSW5kaWNhdGVzIGlmIGV4dGVybmFsIGxvZ2ljIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjaGlwIHRvCisgKiBwZXJmb3JtIHRoZSB0YXNrcyBvZiBhY2Nlc3NpbmcgYSBzZXJpYWwgZWVwcm9tLCB0ZXN0aW5nIHRlcm1pbmF0aW9uCisgKiBzdHJlbmd0aCwgYW5kIHBlcmZvcm1pbmcgY2FibGUgZGV0ZWN0aW9uLiAgT24gdGhlIGFpYzc4NjAsIG1vc3Qgb2YKKyAqIHRoZXNlIGZlYXR1cmVzIGFyZSBoYW5kbGVkIG9uIGNoaXAsIGJ1dCBvbiB0aGUgYWljNzg1NSBhbiBhdHRhY2hlZAorICogYWljMzgwMCBkb2VzIHRoZSBncnVudCB3b3JrLgorICovCityZWdpc3RlciBTUElPQ0FQIHsKKwlhZGRyZXNzCQkJMHgwMWIKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVNPRlQxCQkweDgwCisJZmllbGQJU09GVDAJCTB4NDAKKwlmaWVsZAlTT0ZUQ01ERU4JMHgyMAkKKwlmaWVsZAlFWFRfQlJEQ1RMCTB4MTAJLyogRXh0ZXJuYWwgQm9hcmQgY29udHJvbCAqLworCWZpZWxkCVNFRVBST00JCTB4MDgJLyogRXh0ZXJuYWwgc2VyaWFsIGVlcHJvbSBsb2dpYyAqLworCWZpZWxkCUVFUFJPTQkJMHgwNAkvKiBXcml0YWJsZSBleHRlcm5hbCBCSU9TIFJPTSAqLworCWZpZWxkCVJPTQkJMHgwMgkvKiBMb2dpYyBmb3IgYWNjZXNzaW5nIGV4dGVybmFsIFJPTSAqLworCWZpZWxkCVNTUElPQ1BTCTB4MDEJLyogVGVybWluYXRpb24gYW5kIGNhYmxlIGRldGVjdGlvbiAqLworfQorCityZWdpc3RlciBCUkRDVEwJeworCWFkZHJlc3MJCQkweDAxZAorCWZpZWxkCUJSRERBVDcJCTB4ODAKKwlmaWVsZAlCUkREQVQ2CQkweDQwCisJZmllbGQJQlJEREFUNQkJMHgyMAorCWZpZWxkCUJSRFNUQgkJMHgxMAorCWZpZWxkCUJSRENTCQkweDA4CisJZmllbGQJQlJEUlcJCTB4MDQKKwlmaWVsZAlCUkRDVEwxCQkweDAyCisJZmllbGQJQlJEQ1RMMAkJMHgwMQorCS8qIDc4OTAgRGVmaW5pdGlvbnMgKi8KKwlmaWVsZAlCUkREQVQ0CQkweDEwCisJZmllbGQJQlJEREFUMwkJMHgwOAorCWZpZWxkCUJSRERBVDIJCTB4MDQKKwlmaWVsZAlCUkRSV19VTFRSQTIJMHgwMgorCWZpZWxkCUJSRFNUQl9VTFRSQTIJMHgwMQorfQorCisvKgorICogU2VyaWFsIEVFUFJPTSBDb250cm9sIChwLiA0LTkyIGluIDc4NzAgRGF0YWJvb2spCisgKiBDb250cm9scyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBhbiBleHRlcm5hbCBzZXJpYWwgMS1iaXQKKyAqIEVFUFJPTSBEZXZpY2UuICBJbiBvcmRlciB0byBhY2Nlc3MgdGhlIHNlcmlhbCBFRVBST00sIHlvdSBtdXN0CisgKiBmaXJzdCBzZXQgdGhlIFNFRU1TIGJpdCB0aGF0IGdlbmVyYXRlcyBhIHJlcXVlc3QgdG8gdGhlIG1lbW9yeQorICogcG9ydCBmb3IgYWNjZXNzIHRvIHRoZSBzZXJpYWwgRUVQUk9NIGRldmljZS4gIFdoZW4gdGhlIG1lbW9yeQorICogcG9ydCBpcyBub3QgYnVzeSBzZXJ2aWNpbmcgYW5vdGhlciByZXF1ZXN0LCBpdCByZWNvbmZpZ3VyZXMKKyAqIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2VyaWFsIEVFUFJPTS4gIFdoZW4gdGhpcyBoYXBwZW5zLCBTRUVSRFkKKyAqIGdldHMgc2V0IGhpZ2ggdG8gdmVyaWZ5IHRoYXQgdGhlIG1lbW9yeSBwb3J0IGFjY2VzcyBoYXMgYmVlbgorICogZ3JhbnRlZC4gIAorICoKKyAqIEFmdGVyIHN1Y2Nlc3NmdWwgYXJiaXRyYXRpb24gZm9yIHRoZSBtZW1vcnkgcG9ydCwgdGhlIFNFRUNTIGJpdCBvZiAKKyAqIHRoZSBTRUVDVEwgcmVnaXN0ZXIgaXMgY29ubmVjdGVkIHRvIHRoZSBjaGlwIHNlbGVjdC4gIFRoZSBTRUVDSywgCisgKiBTRUVETywgYW5kIFNFRURJIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNsb2NrLCBkYXRhIG91dCwgYW5kIGRhdGEgaW4gCisgKiBsaW5lcyByZXNwZWN0aXZlbHkuICBUaGUgU0VFUkRZIGJpdCBvZiBTRUVDVEwgaXMgdXNlZnVsIGluIHRoYXQgaXQgCisgKiBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgd3JpdGUgdG8gdGhlIFNFRUNUTCByZWdpc3RlciwgCisgKiB0aGUgU0VFUkRZIGdvZXMgaGlnaCA4MDAgbnNlYyBsYXRlci4gIFRoZSBvbmUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgCisgKiB3aGVuIHdlIGZpcnN0IHJlcXVlc3QgYWNjZXNzIHRvIHRoZSBtZW1vcnkgcG9ydC4gIFRoZSBTRUVSRFkgZ29lcyAKKyAqIGhpZ2ggdG8gc2lnbmlmeSB0aGF0IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIGFuZCwgZm9yIHRoaXMgY2FzZSwgaGFzIAorICogbm8gaW1wbGllZCB0aW1pbmcuCisgKgorICogU2VlIDkzY3g2LmMgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBwcm90b2NvbCBuZWNlc3NhcnkgdG8gCisgKiByZWFkIHRoZSBzZXJpYWwgRUVQUk9NLgorICovCityZWdpc3RlciBTRUVDVEwgeworCWFkZHJlc3MJCQkweDAxZQorCWZpZWxkCUVYVEFSQkFDSwkweDgwCisJZmllbGQJRVhUQVJCUkVRCTB4NDAKKwlmaWVsZAlTRUVNUwkJMHgyMAorCWZpZWxkCVNFRVJEWQkJMHgxMAorCWZpZWxkCVNFRUNTCQkweDA4CisJZmllbGQJU0VFQ0sJCTB4MDQKKwlmaWVsZAlTRUVETwkJMHgwMgorCWZpZWxkCVNFRURJCQkweDAxCit9CisvKgorICogU0NTSSBCbG9jayBDb250cm9sIChwLiAzLTMyKQorICogQ29udHJvbHMgQnVzIHR5cGUgYW5kIGNoYW5uZWwgc2VsZWN0aW9uLiAgSW4gYSB0d2luIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICogYWRkcmVzc2VzIDB4MDAtMHgxZSBhcmUgZ2F0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgYmFzZWQgb24gdGhpcworICogcmVnaXN0ZXIuICBTRUxXSURFIGFsbG93cyBmb3IgdGhlIGNvZXhpc3RlbmNlIG9mIDhiaXQgYW5kIDE2Yml0IGRldmljZXMKKyAqIG9uIGEgd2lkZSBidXMuCisgKi8KK3JlZ2lzdGVyIFNCTEtDVEwgeworCWFkZHJlc3MJCQkweDAxZgorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRElBR0xFREVOCTB4ODAJLyogQWljNzhYMCBvbmx5ICovCisJZmllbGQJRElBR0xFRE9OCTB4NDAJLyogQWljNzhYMCBvbmx5ICovCisJZmllbGQJQVVUT0ZMVVNIRElTCTB4MjAKKwlmaWVsZAlTRUxCVVNCCQkweDA4CisJZmllbGQJRU5BQjQwCQkweDA4CS8qIExWRCB0cmFuc2NlaXZlciBhY3RpdmUgKi8KKwlmaWVsZAlFTkFCMjAJCTB4MDQJLyogU0UvSFZEIHRyYW5zY2VpdmVyIGFjdGl2ZSAqLworCWZpZWxkCVNFTFdJREUJCTB4MDIKKwlmaWVsZAlYQ1ZSCQkweDAxCS8qIEV4dGVybmFsIHRyYW5zY2VpdmVyIGFjdGl2ZSAqLworfQorCisvKgorICogU2VxdWVuY2VyIENvbnRyb2wgKHAuIDMtMzMpCisgKiBFcnJvciBkZXRlY3Rpb24gbW9kZSBhbmQgc3BlZWQgY29uZmlndXJhdGlvbgorICovCityZWdpc3RlciBTRVFDVEwgeworCWFkZHJlc3MJCQkweDA2MAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJUEVSUk9SRElTCTB4ODAKKwlmaWVsZAlQQVVTRURJUwkweDQwCisJZmllbGQJRkFJTERJUwkJMHgyMAorCWZpZWxkCUZBU1RNT0RFCTB4MTAKKwlmaWVsZAlCUktBRFJJTlRFTgkweDA4CisJZmllbGQJU1RFUAkJMHgwNAorCWZpZWxkCVNFUVJFU0VUCTB4MDIKKwlmaWVsZAlMT0FEUkFNCQkweDAxCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUkFNIERhdGEgKHAuIDMtMzQpCisgKiBTaW5nbGUgYnl0ZSB3aW5kb3cgaW50byB0aGUgU2NyYXRjaCBSYW0gYXJlYSBzdGFydGluZyBhdCB0aGUgYWRkcmVzcworICogc3BlY2lmaWVkIGJ5IFNFUUFERFIwIGFuZCBTRVFBRERSMS4gIFRvIHdyaXRlIGEgZnVsbCB3b3JkLCBzaW1wbHkgd3JpdGUKKyAqIGZvdXIgYnl0ZXMgaW4gc3VjY2Vzc2lvbi4gIFRoZSBTRVFBRERScyB3aWxsIGluY3JlbWVudCBhZnRlciB0aGUgbW9zdAorICogc2lnbmlmaWNhbnQgYnl0ZSBpcyB3cml0dGVuCisgKi8KK3JlZ2lzdGVyIFNFUVJBTSB7CisJYWRkcmVzcwkJCTB4MDYxCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNlcXVlbmNlciBBZGRyZXNzIFJlZ2lzdGVycyAocC4gMy0zNSkKKyAqIE9ubHkgdGhlIGZpcnN0IGJpdCBvZiBTRVFBRERSMSBob2xkcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCisgKi8KK3JlZ2lzdGVyIFNFUUFERFIwIHsKKwlhZGRyZXNzCQkJMHgwNjIKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTRVFBRERSMSB7CisJYWRkcmVzcwkJCTB4MDYzCisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFUUFERFIxX01BU0sJMHgwMQorfQorCisvKgorICogQWNjdW11bGF0b3IKKyAqIFdlIGNoZWF0IGJ5IHBhc3NpbmcgYXJndW1lbnRzIGluIHRoZSBBY2N1bXVsYXRvciB1cCB0byB0aGUga2VybmVsIGRyaXZlcgorICovCityZWdpc3RlciBBQ0NVTSB7CisJYWRkcmVzcwkJCTB4MDY0CisJYWNjZXNzX21vZGUgUlcKKwlhY2N1bXVsYXRvcgorfQorCityZWdpc3RlciBTSU5ERVgJeworCWFkZHJlc3MJCQkweDA2NQorCWFjY2Vzc19tb2RlIFJXCisJc2luZGV4Cit9CisKK3JlZ2lzdGVyIERJTkRFWCB7CisJYWRkcmVzcwkJCTB4MDY2CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgQUxMT05FUyB7CisJYWRkcmVzcwkJCTB4MDY5CisJYWNjZXNzX21vZGUgUk8KKwlhbGxvbmVzCit9CisKK3JlZ2lzdGVyIEFMTFpFUk9TIHsKKwlhZGRyZXNzCQkJMHgwNmEKKwlhY2Nlc3NfbW9kZSBSTworCWFsbHplcm9zCit9CisKK3JlZ2lzdGVyIE5PTkUgeworCWFkZHJlc3MJCQkweDA2YQorCWFjY2Vzc19tb2RlIFdPCisJbm9uZQorfQorCityZWdpc3RlciBGTEFHUyB7CisJYWRkcmVzcwkJCTB4MDZiCisJYWNjZXNzX21vZGUgUk8KKwlmaWVsZAlaRVJPCQkweDAyCisJZmllbGQJQ0FSUlkJCTB4MDEKK30KKworcmVnaXN0ZXIgU0lORElSCXsKKwlhZGRyZXNzCQkJMHgwNmMKKwlhY2Nlc3NfbW9kZSBSTworfQorCityZWdpc3RlciBESU5ESVIJIHsKKwlhZGRyZXNzCQkJMHgwNmQKKwlhY2Nlc3NfbW9kZSBXTworfQorCityZWdpc3RlciBGVU5DVElPTjEgeworCWFkZHJlc3MJCQkweDA2ZQorCWFjY2Vzc19tb2RlIFJXCit9CisKK3JlZ2lzdGVyIFNUQUNLIHsKKwlhZGRyZXNzCQkJMHgwNmYKKwlhY2Nlc3NfbW9kZSBSTworfQorCitjb25zdAlTVEFDS19TSVpFCTQKKworLyoKKyAqIEJvYXJkIENvbnRyb2wgKHAuIDMtNDMpCisgKi8KK3JlZ2lzdGVyIEJDVEwgeworCWFkZHJlc3MJCQkweDA4NAorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJQUNFCQkweDA4CisJZmllbGQJRU5BQkxFCQkweDAxCit9CisKKy8qCisgKiBPbiB0aGUgYWljNzhYMCBjaGlwcywgQm9hcmQgQ29udHJvbCBpcyByZXBsYWNlZCBieSB0aGUgRFNDb21tYW5kCisgKiByZWdpc3RlciAocC4gNC02NCkKKyAqLworcmVnaXN0ZXIgRFNDT01NQU5EMCB7CisJYWRkcmVzcwkJCTB4MDg0CisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlDQUNIRVRIRU4JMHg4MAkvKiBDYWNoZSBUaHJlc2hvbGQgZW5hYmxlICovCisJZmllbGQJRFBBUkNLRU4JMHg0MAkvKiBEYXRhIFBhcml0eSBDaGVjayBFbmFibGUgKi8KKwlmaWVsZAlNUEFSQ0tFTgkweDIwCS8qIE1lbW9yeSBQYXJpdHkgQ2hlY2sgRW5hYmxlICovCisJZmllbGQJRVhUUkVRTENLCTB4MTAJLyogRXh0ZXJuYWwgUmVxdWVzdCBMb2NrICovCisJLyogYWljNzg5MC85MS85Ni85NyBvbmx5ICovCisJZmllbGQJSU5UU0NCUkFNU0VMCTB4MDgJLyogSW50ZXJuYWwgU0NCIFJBTSBTZWxlY3QgKi8KKwlmaWVsZAlSQU1QUwkJMHgwNAkvKiBFeHRlcm5hbCBTQ0IgUkFNIFByZXNlbnQgKi8KKwlmaWVsZAlVU0NCU0laRTMyCTB4MDIJLyogVXNlIDMyYnl0ZSBTQ0IgUGFnZSBTaXplICovCisJZmllbGQJQ0lPUEFSQ0tFTgkweDAxCS8qIEludGVybmFsIGJ1cyBwYXJpdHkgZXJyb3IgZW5hYmxlICovCit9CisKK3JlZ2lzdGVyIERTQ09NTUFORDEgeworCWFkZHJlc3MJCQkweDA4NQorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlEU0xBVFQJCTB4ZmMJLyogUENJIGxhdGVuY3kgdGltZXIgKG5vbi11bHRyYTIpICovCisJZmllbGQJSEFERExEU0VMMQkweDAyCS8qIEhvc3QgQWRkcmVzcyBMb2FkIFNlbGVjdCBCaXRzICovCisJZmllbGQJSEFERExEU0VMMAkweDAxCit9CisKKy8qCisgKiBCdXMgT24vT2ZmIFRpbWUgKHAuIDMtNDQpIGFpYzc3NzAgb25seQorICovCityZWdpc3RlciBCVVNUSU1FIHsKKwlhZGRyZXNzCQkJMHgwODUKKwlhY2Nlc3NfbW9kZSBSVworCW1hc2sJQk9GRgkJMHhmMAorCW1hc2sJQk9OCQkweDBmCit9CisKKy8qCisgKiBCdXMgU3BlZWQgKHAuIDMtNDUpIGFpYzc3NzAgb25seQorICovCityZWdpc3RlciBCVVNTUEQgeworCWFkZHJlc3MJCQkweDA4NgorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlERlRIUlNICQkweGMwCisJbWFzawlTVEJPRkYJCTB4MzgKKwltYXNrCVNUQk9OCQkweDA3CisJbWFzawlERlRIUlNIXzEwMAkweGMwCisJbWFzawlERlRIUlNIXzc1CTB4ODAKK30KKworLyogYWljNzg1MC81NS82MC83MC84MC85NSBvbmx5ICovCityZWdpc3RlciBEU1BDSVNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDg2CisJbWFzawlERlRIUlNIXzEwMAkweGMwCit9CisKKy8qIGFpYzc4OTAvOTEvOTYvOTcgb25seSAqLworcmVnaXN0ZXIgSFNfTUFJTEJPWCB7CisJYWRkcmVzcwkJCTB4MDg2CisJbWFzawlIT1NUX01BSUxCT1gJMHhGMAorCW1hc2sJU0VRX01BSUxCT1gJMHgwRgorCW1hc2sJSE9TVF9UUUlOUE9TCTB4ODAJLyogQm91bmRhcnkgYXQgZWl0aGVyIDAgb3IgMTI4ICovCit9CisKK2NvbnN0CUhPU1RfTUFJTEJPWF9TSElGVAk0Citjb25zdAlTRVFfTUFJTEJPWF9TSElGVAkwCisKKy8qCisgKiBIb3N0IENvbnRyb2wgKHAuIDMtNDcpIFIvVworICogT3ZlcmFsbCBob3N0IGNvbnRyb2wgb2YgdGhlIGRldmljZS4KKyAqLworcmVnaXN0ZXIgSENOVFJMIHsKKwlhZGRyZXNzCQkJMHgwODcKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVBPV1JETgkJMHg0MAorCWZpZWxkCVNXSU5UCQkweDEwCisJZmllbGQJSVJRTVMJCTB4MDgKKwlmaWVsZAlQQVVTRQkJMHgwNAorCWZpZWxkCUlOVEVOCQkweDAyCisJZmllbGQJQ0hJUFJTVAkJMHgwMQorCWZpZWxkCUNISVBSU1RBQ0sJMHgwMQorfQorCisvKgorICogSG9zdCBBZGRyZXNzIChwLiAzLTQ4KQorICogVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgYnl0ZSBhYm91dAorICogdG8gYmUgdHJhbnNmZXJyZWQgYWNyb3NzIHRoZSBob3N0IGJ1cy4KKyAqLworcmVnaXN0ZXIgSEFERFIgeworCWFkZHJlc3MJCQkweDA4OAorCXNpemUJNAorCWFjY2Vzc19tb2RlIFJXCit9CisKK3JlZ2lzdGVyIEhDTlQgeworCWFkZHJlc3MJCQkweDA4YworCXNpemUJMworCWFjY2Vzc19tb2RlIFJXCit9CisKKy8qCisgKiBTQ0IgUG9pbnRlciAocC4gMy00OSkKKyAqIEdhdGUgb25lIG9mIHRoZSBTQ0JzIGludG8gdGhlIFNDQkFSUkFZIHdpbmRvdy4KKyAqLworcmVnaXN0ZXIgU0NCUFRSIHsKKwlhZGRyZXNzCQkJMHgwOTAKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogSW50ZXJydXB0IFN0YXR1cyAocC4gMy01MCkKKyAqIFN0YXR1cyBmb3Igc3lzdGVtIGludGVycnVwdHMKKyAqLworcmVnaXN0ZXIgSU5UU1RBVCB7CisJYWRkcmVzcwkJCTB4MDkxCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlCUktBRFJJTlQgMHgwOAorCWZpZWxkCVNDU0lJTlQJICAweDA0CisJZmllbGQJQ01EQ01QTFQgIDB4MDIKKwlmaWVsZAlTRVFJTlQgICAgMHgwMQorCW1hc2sJQkFEX1BIQVNFCVNFUUlOVAkJLyogdW5rbm93biBzY3NpIGJ1cyBwaGFzZSAqLworCW1hc2sJU0VORF9SRUpFQ1QJMHgxMHxTRVFJTlQJLyogc2VuZGluZyBhIG1lc3NhZ2UgcmVqZWN0ICovCisJbWFzawlQUk9UT19WSU9MQVRJT04JMHgyMHxTRVFJTlQJLyogU0NTSSBwcm90b2NvbCB2aW9sYXRpb24gKi8gCisJbWFzawlOT19NQVRDSAkweDMwfFNFUUlOVAkvKiBubyBjbWQgbWF0Y2ggZm9yIHJlY29ubmVjdCAqLworCW1hc2sJSUdOX1dJREVfUkVTCTB4NDB8U0VRSU5UCS8qIENvbXBsZXggSUdOIFdpZGUgUmVzIE1zZyAqLworCW1hc2sJUERBVEFfUkVJTklUCTB4NTB8U0VRSU5UCS8qCisJCQkJCQkgKiBSZXR1cm5lZCB0byBkYXRhIHBoYXNlCisJCQkJCQkgKiB0aGF0IHJlcXVpcmVzIGRhdGEKKwkJCQkJCSAqIHRyYW5zZmVyIHBvaW50ZXJzIHRvIGJlCisJCQkJCQkgKiByZWNhbGN1bGF0ZWQgZnJvbSB0aGUKKwkJCQkJCSAqIHRyYW5zZmVyIHJlc2lkdWFsLgorCQkJCQkJICovCisJbWFzawlIT1NUX01TR19MT09QCTB4NjB8U0VRSU5UCS8qCisJCQkJCQkgKiBUaGUgYnVzIGlzIHJlYWR5IGZvciB0aGUKKwkJCQkJCSAqIGhvc3QgdG8gcGVyZm9ybSBhbm90aGVyCisJCQkJCQkgKiBtZXNzYWdlIHRyYW5zYWN0aW9uLiAgVGhpcworCQkJCQkJICogbWVjaGFuaXNtIGlzIHVzZWQgZm9yIHRoaW5ncworCQkJCQkJICogbGlrZSBzeW5jL3dpZGUgbmVnb3RpYXRpb24KKwkJCQkJCSAqIHRoYXQgcmVxdWlyZSBhIGtlcm5lbCBiYXNlZAorCQkJCQkJICogbWVzc2FnZSBzdGF0ZSBlbmdpbmUuCisJCQkJCQkgKi8KKwltYXNrCUJBRF9TVEFUVVMJMHg3MHxTRVFJTlQJLyogQmFkIHN0YXR1cyBmcm9tIHRhcmdldCAqLworCW1hc2sJUEVSUl9ERVRFQ1RFRAkweDgwfFNFUUlOVAkvKgorCQkJCQkJICogRWl0aGVyIHRoZSBwaGFzZV9sb2NrCisJCQkJCQkgKiBvciBpbmJfbmV4dCByb3V0aW5lIGhhcworCQkJCQkJICogbm90aWNlZCBhIHBhcml0eSBlcnJvci4KKwkJCQkJCSAqLworCW1hc2sJREFUQV9PVkVSUlVOCTB4OTB8U0VRSU5UCS8qCisJCQkJCQkgKiBUYXJnZXQgYXR0ZW1wdGVkIHRvIHdyaXRlCisJCQkJCQkgKiBiZXlvbmQgdGhlIGJvdW5kcyBvZiBpdHMKKwkJCQkJCSAqIGNvbW1hbmQuCisJCQkJCQkgKi8KKwltYXNrCU1LTVNHX0ZBSUxFRAkweGEwfFNFUUlOVAkvKgorCQkJCQkJICogVGFyZ2V0IGNvbXBsZXRlZCBjb21tYW5kCisJCQkJCQkgKiB3aXRob3V0IGhvbm9yaW5nIG91ciBBVE4KKwkJCQkJCSAqIHJlcXVlc3QgdG8gaXNzdWUgYSBtZXNzYWdlLiAKKwkJCQkJCSAqLworCW1hc2sJTUlTU0VEX0JVU0ZSRUUJMHhiMHxTRVFJTlQJLyoKKwkJCQkJCSAqIFRoZSBzZXF1ZW5jZXIgbmV2ZXIgc2F3CisJCQkJCQkgKiB0aGUgYnVzIGdvIGZyZWUgYWZ0ZXIKKwkJCQkJCSAqIGVpdGhlciBhIGNvbW1hbmQgY29tcGxldGUKKwkJCQkJCSAqIG9yIGRpc2Nvbm5lY3QgbWVzc2FnZS4KKwkJCQkJCSAqLworCW1hc2sJU0NCX01JU01BVENICTB4YzB8U0VRSU5UCS8qCisJCQkJCQkgKiBEb3dubG9hZGVkIFNDQidzIHRhZyBkb2VzCisJCQkJCQkgKiBub3QgbWF0Y2ggdGhlIGVudHJ5IHdlCisJCQkJCQkgKiBpbnRlbmRlZCB0byBkb3dubG9hZC4KKwkJCQkJCSAqLworCW1hc2sJTk9fRlJFRV9TQ0IJMHhkMHxTRVFJTlQJLyoKKwkJCQkJCSAqIGdldF9mcmVlX29yX2Rpc2Nfc2NiIGZhaWxlZC4KKwkJCQkJCSAqLworCW1hc2sJT1VUX09GX1JBTkdFCTB4ZTB8U0VRSU5UCisKKwltYXNrCVNFUUlOVF9NQVNLCTB4ZjB8U0VRSU5UCS8qIFNFUUlOVCBTdGF0dXMgQ29kZXMgKi8KKwltYXNrCUlOVF9QRU5EICAoQlJLQURSSU5UfFNFUUlOVHxTQ1NJSU5UfENNRENNUExUKQorfQorCisvKgorICogSGFyZCBFcnJvciAocC4gMy01MykKKyAqIFJlcG9ydGluZyBvZiBjYXRhc3Ryb3BoaWMgZXJyb3JzLiAgWW91IHVzdWFsbHkgY2Fubm90IHJlY292ZXIgZnJvbQorICogdGhlc2Ugd2l0aG91dCBhIGZ1bGwgYm9hcmQgcmVzZXQuCisgKi8KK3JlZ2lzdGVyIEVSUk9SIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZSBSTworCWZpZWxkCUNJT1BBUkVSUgkweDgwCS8qIFVsdHJhMiBvbmx5ICovCisJZmllbGQJUENJRVJSU1RBVAkweDQwCS8qIFBDSSBvbmx5ICovCisJZmllbGQJTVBBUkVSUgkJMHgyMAkvKiBQQ0kgb25seSAqLworCWZpZWxkCURQQVJFUlIJCTB4MTAJLyogUENJIG9ubHkgKi8KKwlmaWVsZAlTUVBBUkVSUgkweDA4CisJZmllbGQJSUxMT1BDT0RFCTB4MDQKKwlmaWVsZAlJTExTQUREUgkweDAyCisJZmllbGQJSUxMSEFERFIJMHgwMQorfQorCisvKgorICogQ2xlYXIgSW50ZXJydXB0IFN0YXR1cyAocC4gMy01MikKKyAqLworcmVnaXN0ZXIgQ0xSSU5UIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZSBXTworCWZpZWxkCUNMUlBBUkVSUgkweDEwCS8qIFBDSSBvbmx5ICovCisJZmllbGQJQ0xSQlJLQURSSU5UCTB4MDgKKwlmaWVsZAlDTFJTQ1NJSU5UICAgICAgMHgwNAorCWZpZWxkCUNMUkNNRElOVCAJMHgwMgorCWZpZWxkCUNMUlNFUUlOVCAJMHgwMQorfQorCityZWdpc3RlciBERkNOVFJMIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZSBSVworCWZpZWxkCVBSRUxPQURFTgkweDgwCS8qIGFpYzc4OTAgb25seSAqLworCWZpZWxkCVdJREVPREQJCTB4NDAKKwlmaWVsZAlTQ1NJRU4JCTB4MjAKKwlmaWVsZAlTRE1BRU4JCTB4MTAKKwlmaWVsZAlTRE1BRU5BQ0sJMHgxMAorCWZpZWxkCUhETUFFTgkJMHgwOAorCWZpZWxkCUhETUFFTkFDSwkweDA4CisJZmllbGQJRElSRUNUSU9OCTB4MDQKKwlmaWVsZAlGSUZPRkxVU0gJMHgwMgorCWZpZWxkCUZJRk9SRVNFVAkweDAxCit9CisKK3JlZ2lzdGVyIERGU1RBVFVTIHsKKwlhZGRyZXNzCQkJMHgwOTQKKwlhY2Nlc3NfbW9kZSBSTworCWZpZWxkCVBSRUxPQURfQVZBSUwJMHg4MAorCWZpZWxkCURGQ0FDSEVUSAkweDQwCisJZmllbGQJRklGT1FXREVNUAkweDIwCisJZmllbGQJTVJFUVBFTkQJMHgxMAorCWZpZWxkCUhET05FCQkweDA4CisJZmllbGQJREZUSFJFU0gJMHgwNAorCWZpZWxkCUZJRk9GVUxMCTB4MDIKKwlmaWVsZAlGSUZPRU1QCQkweDAxCit9CisKK3JlZ2lzdGVyIERGV0FERFIgeworCWFkZHJlc3MJCQkweDk1CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgREZSQUREUiB7CisJYWRkcmVzcwkJCTB4OTcKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBERkRBVCB7CisJYWRkcmVzcwkJCTB4MDk5CisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDQiBBdXRvIEluY3JlbWVudCAocC4gMy01OSkKKyAqIEJ5dGUgb2Zmc2V0IGludG8gdGhlIFNDQiBBcnJheSBhbmQgYW4gb3B0aW9uYWwgYml0IHRvIGFsbG93IGF1dG8KKyAqIGluY3JlbWVudGluZyBvZiB0aGUgYWRkcmVzcyBkdXJpbmcgZG93bmxvYWQgYW5kIHVwbG9hZCBvcGVyYXRpb25zCisgKi8KK3JlZ2lzdGVyIFNDQkNOVCB7CisJYWRkcmVzcwkJCTB4MDlhCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlTQ0JBVVRPCQkweDgwCisJbWFzawlTQ0JDTlRfTUFTSwkweDFmCit9CisKKy8qCisgKiBRdWV1ZSBJbiBGSUZPIChwLiAzLTYwKQorICogSW5wdXQgcXVldWUgZm9yIHF1ZXVlZCBTQ0JzIChjb21tYW5kcyB0aGF0IHRoZSBzZXFlbmNlciBoYXMgeWV0IHRvIHN0YXJ0KQorICovCityZWdpc3RlciBRSU5GSUZPIHsKKwlhZGRyZXNzCQkJMHgwOWIKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogUXVldWUgSW4gQ291bnQgKHAuIDMtNjApCisgKiBOdW1iZXIgb2YgcXVldWVkIFNDQnMKKyAqLworcmVnaXN0ZXIgUUlOQ05UCXsKKwlhZGRyZXNzCQkJMHgwOWMKKwlhY2Nlc3NfbW9kZSBSTworfQorCisvKgorICogUXVldWUgT3V0IEZJRk8gKHAuIDMtNjEpCisgKiBRdWV1ZSBvZiBTQ0JzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgYW5kIGF3YWl0IHRoZSBob3N0CisgKi8KK3JlZ2lzdGVyIFFPVVRGSUZPIHsKKwlhZGRyZXNzCQkJMHgwOWQKKwlhY2Nlc3NfbW9kZSBXTworfQorCityZWdpc3RlciBDUkNDT05UUk9MMSB7CisJYWRkcmVzcwkJCTB4MDlkCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlDUkNPTlNFRU4JCTB4ODAKKwlmaWVsZAlDUkNWQUxDSEtFTgkJMHg0MAorCWZpZWxkCUNSQ0VORENIS0VOCQkweDIwCisJZmllbGQJQ1JDUkVRQ0hLRU4JCTB4MTAKKwlmaWVsZAlUQVJHQ1JDRU5ERU4JCTB4MDgKKwlmaWVsZAlUQVJHQ1JDQ05URU4JCTB4MDQKK30KKworCisvKgorICogUXVldWUgT3V0IENvdW50IChwLiAzLTYxKQorICogTnVtYmVyIG9mIHF1ZXVlZCBTQ0JzIGluIHRoZSBPdXQgRklGTworICovCityZWdpc3RlciBRT1VUQ05UIHsKKwlhZGRyZXNzCQkJMHgwOWUKKwlhY2Nlc3NfbW9kZSBSTworfQorCityZWdpc3RlciBTQ1NJUEhBU0UgeworCWFkZHJlc3MJCQkweDA5ZQorCWFjY2Vzc19tb2RlIFJPCisJZmllbGQJU1RBVFVTX1BIQVNFCTB4MjAKKwlmaWVsZAlDT01NQU5EX1BIQVNFCTB4MTAKKwlmaWVsZAlNU0dfSU5fUEhBU0UJMHgwOAorCWZpZWxkCU1TR19PVVRfUEhBU0UJMHgwNAorCWZpZWxkCURBVEFfSU5fUEhBU0UJMHgwMgorCWZpZWxkCURBVEFfT1VUX1BIQVNFCTB4MDEKKwltYXNrCURBVEFfUEhBU0VfTUFTSwkweDAzCit9CisKKy8qCisgKiBTcGVjaWFsIEZ1bmN0aW9uCisgKi8KK3JlZ2lzdGVyIFNGVU5DVCB7CisJYWRkcmVzcwkJCTB4MDlmCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlBTFRfTU9ERQkweDgwCit9CisKKy8qCisgKiBTQ0IgRGVmaW5pdGlvbiAocC4gNS00KQorICovCitzY2IgeworCWFkZHJlc3MJCTB4MGEwCisJc2l6ZQkJNjQKKworCVNDQl9DREJfUFRSIHsKKwkJc2l6ZQk0CisJCWFsaWFzCVNDQl9SRVNJRFVBTF9EQVRBQ05UCisJCWFsaWFzCVNDQl9DREJfU1RPUkUKKwl9CisJU0NCX1JFU0lEVUFMX1NHUFRSIHsKKwkJc2l6ZQk0CisJfQorCVNDQl9TQ1NJX1NUQVRVUyB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFSR0VUX1BIQVNFUyB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFSR0VUX0RBVEFfRElSIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9UQVJHRVRfSVRBRyB7CisJCXNpemUJMQorCX0KKwlTQ0JfREFUQVBUUiB7CisJCXNpemUJNAorCX0KKwlTQ0JfREFUQUNOVCB7CisJCS8qCisJCSAqIFRoZSBsYXN0IGJ5dGUgaXMgcmVhbGx5IHRoZSBoaWdoIGFkZHJlc3MgYml0cyBmb3IKKwkJICogdGhlIGRhdGEgYWRkcmVzcy4KKwkJICovCisJCXNpemUJNAorCQlmaWVsZAlTR19MQVNUX1NFRwkJMHg4MAkvKiBJbiB0aGUgZm91cnRoIGJ5dGUgKi8KKwkJbWFzawlTR19ISUdIX0FERFJfQklUUwkweDdGCS8qIEluIHRoZSBmb3VydGggYnl0ZSAqLworCX0KKwlTQ0JfU0dQVFIgeworCQlzaXplCTQKKwkJZmllbGQJU0dfUkVTSURfVkFMSUQJMHgwNAkvKiBJbiB0aGUgZmlyc3QgYnl0ZSAqLworCQlmaWVsZAlTR19GVUxMX1JFU0lECTB4MDIJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwkJZmllbGQJU0dfTElTVF9OVUxMCTB4MDEJLyogSW4gdGhlIGZpcnN0IGJ5dGUgKi8KKwl9CisJU0NCX0NPTlRST0wgeworCQlzaXplCTEKKwkJZmllbGQJVEFSR0VUX1NDQgkJCTB4ODAKKwkJZmllbGQJU1RBVFVTX1JDVkQJCQkweDgwCisJCWZpZWxkCURJU0NFTkIJCQkJMHg0MAorCQlmaWVsZAlUQUdfRU5CCQkJCTB4MjAKKwkJZmllbGQJTUtfTUVTU0FHRQkJCTB4MTAKKwkJZmllbGQJVUxUUkFFTkIJCQkweDA4CisJCWZpZWxkCURJU0NPTk5FQ1RFRAkJCTB4MDQKKwkJbWFzawlTQ0JfVEFHX1RZUEUJCQkweDAzCisJfQorCVNDQl9TQ1NJSUQgeworCQlzaXplCTEKKwkJZmllbGQJVFdJTl9DSE5MQgkJCTB4ODAKKwkJbWFzawlUV0lOX1RJRAkJCTB4NzAKKwkJbWFzawlUSUQJCQkJMHhmMAorCQltYXNrCU9JRAkJCQkweDBmCisJfQorCVNDQl9MVU4geworCQlmaWVsZAlTQ0JfWEZFUkxFTl9PREQJCQkweDgwCisJCW1hc2sJTElECQkJCTB4M2YKKwkJc2l6ZQkxCisJfQorCVNDQl9UQUcgeworCQlzaXplCTEKKwl9CisJU0NCX0NEQl9MRU4geworCQlzaXplCTEKKwl9CisJU0NCX1NDU0lSQVRFIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9TQ1NJT0ZGU0VUIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9ORVhUIHsKKwkJc2l6ZQkxCisJfQorCVNDQl82NF9TUEFSRSB7CisJCXNpemUJMTYKKwl9CisJU0NCXzY0X0JUVCB7CisJCXNpemUJMTYKKwl9Cit9CisKK2NvbnN0CVNDQl9VUExPQURfU0laRQkJMzIKK2NvbnN0CVNDQl9ET1dOTE9BRF9TSVpFCTMyCitjb25zdAlTQ0JfRE9XTkxPQURfU0laRV82NAk0OAorCitjb25zdAlTR19TSVpFT0YJMHgwOAkJLyogc2l6ZW9mKHN0cnVjdCBhaGNfZG1hKSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUhBLTI4NDAtb25seSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCityZWdpc3RlciBTRUVDVExfMjg0MCB7CisJYWRkcmVzcwkJCTB4MGMwCisJYWNjZXNzX21vZGUgUlcKKwlmaWVsZAlDU18yODQwCQkweDA0CisJZmllbGQJQ0tfMjg0MAkJMHgwMgorCWZpZWxkCURPXzI4NDAJCTB4MDEKK30KKworcmVnaXN0ZXIgU1RBVFVTXzI4NDAgeworCWFkZHJlc3MJCQkweDBjMQorCWFjY2Vzc19tb2RlIFJXCisJZmllbGQJRUVQUk9NX1RGCTB4ODAKKwltYXNrCUJJT1NfU0VMCTB4NjAKKwltYXNrCUFEU0VMCQkweDFlCisJZmllbGQJRElfMjg0MAkJMHgwMQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUlDLTc4NzAtb25seSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCityZWdpc3RlciBDQ0hBRERSIHsKKwlhZGRyZXNzCQkJMHgwRTAKKwlzaXplIDgKK30KKworcmVnaXN0ZXIgQ0NIQ05UIHsKKwlhZGRyZXNzCQkJMHgwRTgKK30KKworcmVnaXN0ZXIgQ0NTR1JBTSB7CisJYWRkcmVzcwkJCTB4MEU5Cit9CisKK3JlZ2lzdGVyIENDU0dBRERSIHsKKwlhZGRyZXNzCQkJMHgwRUEKK30KKworcmVnaXN0ZXIgQ0NTR0NUTCB7CisJYWRkcmVzcwkJCTB4MEVCCisJZmllbGQJQ0NTR0RPTkUJMHg4MAorCWZpZWxkCUNDU0dFTgkJMHgwOAorCWZpZWxkCVNHX0ZFVENIX05FRURFRCAweDAyCS8qIEJpdCB1c2VkIGZvciBzb2Z0d2FyZSBzdGF0ZSAqLworCWZpZWxkCUNDU0dSRVNFVAkweDAxCit9CisKK3JlZ2lzdGVyIENDU0NCQ05UIHsKKwlhZGRyZXNzCQkJMHhFRgorfQorCityZWdpc3RlciBDQ1NDQkNUTCB7CisJYWRkcmVzcwkJCTB4MEVFCisJZmllbGQJQ0NTQ0JET05FCTB4ODAKKwlmaWVsZAlBUlJET05FCQkweDQwCS8qIFNDQiBBcnJheSBwcmVmZXRjaCBkb25lICovCisJZmllbGQJQ0NBUlJFTgkJMHgxMAorCWZpZWxkCUNDU0NCRU4JCTB4MDgKKwlmaWVsZAlDQ1NDQkRJUgkweDA0CisJZmllbGQJQ0NTQ0JSRVNFVAkweDAxCit9CisKK3JlZ2lzdGVyIENDU0NCQUREUiB7CisJYWRkcmVzcwkJCTB4MEVECit9CisKK3JlZ2lzdGVyIENDU0NCUkFNIHsKKwlhZGRyZXNzCQkJMHhFQworfQorCisvKgorICogU0NCIGJhbmsgYWRkcmVzcyAoNzg5NS83ODk2Lzk3IG9ubHkpCisgKi8KK3JlZ2lzdGVyIFNDQkJBRERSIHsKKwlhZGRyZXNzCQkJMHgwRjAKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBDQ1NDQlBUUiB7CisJYWRkcmVzcwkJCTB4MEYxCit9CisKK3JlZ2lzdGVyIEhOU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDBGNAorfQorCityZWdpc3RlciBTTlNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwRjYKK30KKworcmVnaXN0ZXIgU0RTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MEY4Cit9CisKK3JlZ2lzdGVyIFFPRkZfQ1RMU1RBIHsKKwlhZGRyZXNzCQkJMHgwRkEKKwlmaWVsZAlTQ0JfQVZBSUwJMHg0MAorCWZpZWxkCVNOU0NCX1JPTExPVkVSCTB4MjAKKwlmaWVsZAlTRFNDQl9ST0xMT1ZFUgkweDEwCisJbWFzawlTQ0JfUVNJWkUJMHgwNworCW1hc2sJU0NCX1FTSVpFXzI1NgkweDA2Cit9CisKK3JlZ2lzdGVyIERGRl9USFJTSCB7CisJYWRkcmVzcwkJCTB4MEZCCisJbWFzawlXUl9ERlRIUlNICTB4NzAKKwltYXNrCVJEX0RGVEhSU0gJMHgwNworCW1hc2sJUkRfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJUkRfREZUSFJTSF8yNQkweDAxCisJbWFzawlSRF9ERlRIUlNIXzUwCTB4MDIKKwltYXNrCVJEX0RGVEhSU0hfNjMJMHgwMworCW1hc2sJUkRfREZUSFJTSF83NQkweDA0CisJbWFzawlSRF9ERlRIUlNIXzg1CTB4MDUKKwltYXNrCVJEX0RGVEhSU0hfOTAJMHgwNgorCW1hc2sJUkRfREZUSFJTSF9NQVgJMHgwNworCW1hc2sJV1JfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJV1JfREZUSFJTSF8yNQkweDEwCisJbWFzawlXUl9ERlRIUlNIXzUwCTB4MjAKKwltYXNrCVdSX0RGVEhSU0hfNjMJMHgzMAorCW1hc2sJV1JfREZUSFJTSF83NQkweDQwCisJbWFzawlXUl9ERlRIUlNIXzg1CTB4NTAKKwltYXNrCVdSX0RGVEhSU0hfOTAJMHg2MAorCW1hc2sJV1JfREZUSFJTSF9NQVgJMHg3MAorfQorCityZWdpc3RlciBTR19DQUNIRV9QUkUgeworCWFjY2Vzc19tb2RlIFdPCisJYWRkcmVzcwkJCTB4MGZjCisJbWFzawlTR19BRERSX01BU0sJMHhmOAorCWZpZWxkCUxBU1RfU0VHCTB4MDIKKwlmaWVsZAlMQVNUX1NFR19ET05FCTB4MDEKK30KKworcmVnaXN0ZXIgU0dfQ0FDSEVfU0hBRE9XIHsKKwlhY2Nlc3NfbW9kZSBSTworCWFkZHJlc3MJCQkweDBmYworCW1hc2sJU0dfQUREUl9NQVNLCTB4ZjgKKwlmaWVsZAlMQVNUX1NFRwkweDAyCisJZmllbGQJTEFTVF9TRUdfRE9ORQkweDAxCit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNjcmF0Y2ggUkFNIE9mZnNldHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhlc2Ugb2Zmc2V0cyBhcmUgZWl0aGVyIHRvIHZhbHVlcyB0aGF0IGFyZSBpbml0aWFsaXplZCBieSB0aGUgYm9hcmQncworICogQklPUyBvciBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBzZXF1ZW5jZXIgY29kZS4KKyAqCisgKiBUaGUgaG9zdCBhZGFwdGVyIGNhcmQgKGF0IGxlYXN0IHRoZSBCSU9TKSB1c2VzIDIwLTJmIGZvciBTQ1NJCisgKiBkZXZpY2UgaW5mb3JtYXRpb24sIDMyLTMzIGFuZCA1YS01ZiBhcyB3ZWxsLiBBcyBpdCB0dXJucyBvdXQsIHRoZQorICogQklPUyB0cmFzaGVzIDIwLTJmLCB3cml0aW5nIHRoZSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiByZXN1bHRzCisgKiBvbiB0b3Agb2YgdGhlIEJJT1MgdmFsdWVzLCBzbyB3ZSByZS11c2UgdGhvc2UgZm9yIG91ciBwZXItdGFyZ2V0CisgKiBzY3JhdGNoc3BhY2UgKGFjdHVhbGx5IGEgdmFsdWUgdGhhdCBjYW4gYmUgY29waWVkIGRpcmVjdGx5IGludG8KKyAqIFNDU0lSQVRFKS4gIFRoZSBrZXJuZWwgZHJpdmVyIHdpbGwgZW5hYmxlIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uCisgKiBmb3IgYWxsIHRhcmdldHMgdGhhdCBoYXZlIGEgdmFsdWUgb3RoZXIgdGhhbiAwIGluIHRoZSBsb3dlciBmb3VyCisgKiBiaXRzIG9mIHRoZSB0YXJnZXQgc2NyYXRjaCBzcGFjZS4gIFRoaXMgc2hvdWxkIHdvcmsgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciB0aGUgYmlvcyBoYXMgYmVlbiBpbnN0YWxsZWQuCisgKi8KKworc2NyYXRjaF9yYW0geworCWFkZHJlc3MJCTB4MDIwCisJc2l6ZQkJNTgKKworCS8qCisJICogMSBieXRlIHBlciB0YXJnZXQgc3RhcnRpbmcgYXQgdGhpcyBhZGRyZXNzIGZvciBjb25maWd1cmF0aW9uIHZhbHVlcworCSAqLworCUJVU1lfVEFSR0VUUyB7CisJCWFsaWFzCQlUQVJHX1NDU0lSQVRFCisJCXNpemUJCTE2CisJfQorCS8qCisJICogQml0IHZlY3RvciBvZiB0YXJnZXRzIHRoYXQgaGF2ZSBVTFRSQSBlbmFibGVkIGFzIHNldCBieQorCSAqIHRoZSBCSU9TLiAgVGhlIFNlcXVlbmNlciByZWxpZXMgb24gYSBwZXItU0NCIGZpZWxkIHRvCisJICogY29udHJvbCB3aGV0aGVyIHRvIGVuYWJsZSBVbHRyYSB0cmFuc2ZlcnMgb3Igbm90LiAgRHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24sIHdlIHJlYWQgdGhpcyBmaWVsZCBhbmQgcmV1c2UgaXQgZm9yIDIKKwkgKiBlbnRyaWVzIGluIHRoZSBidXN5IHRhcmdldCB0YWJsZS4KKwkgKi8KKwlVTFRSQV9FTkIgeworCQlhbGlhcwkJQ01EU0laRV9UQUJMRQorCQlzaXplCQkyCisJfQorCS8qCisJICogQml0IHZlY3RvciBvZiB0YXJnZXRzIHRoYXQgaGF2ZSBkaXNjb25uZWN0aW9uIGRpc2FibGVkIGFzIHNldCBieQorCSAqIHRoZSBCSU9TLiAgVGhlIFNlcXVlbmNlciByZWxpZXMgaW4gYSBwZXItU0NCIGZpZWxkIHRvIGNvbnRyb2wgdGhlCisJICogZGlzY29ubmVjdCBwcml2ZWxkZ2UuICBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHdlIHJlYWQgdGhpcyBmaWVsZAorCSAqIGFuZCByZXVzZSBpdCBmb3IgMiBlbnRyaWVzIGluIHRoZSBidXN5IHRhcmdldCB0YWJsZS4KKwkgKi8KKwlESVNDX0RTQiB7CisJCXNpemUJCTIKKwl9CisJQ01EU0laRV9UQUJMRV9UQUlMIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIFBhcnRpYWwgdHJhbnNmZXIgcGFzdCBjYWNoZWxpbmUgZW5kIHRvIGJlCisJICogdHJhbnNmZXJyZWQgdXNpbmcgYW4gZXh0cmEgUy9HLgorCSAqLworCU1XSV9SRVNJRFVBTCB7CisJCXNpemUJCTEKKwkJYWxpYXMJVEFSR19JTU1FRElBVEVfU0NCCisJfQorCS8qCisJICogU0NCSUQgb2YgdGhlIG5leHQgU0NCIHRvIGJlIHN0YXJ0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuCisJICovCisJTkVYVF9RVUVVRURfU0NCIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIFNpbmdsZSBieXRlIGJ1ZmZlciB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUgdHlwZSBvciBtZXNzYWdlCisJICogdG8gc2VuZCB0byBhIHRhcmdldC4KKwkgKi8KKwlNU0dfT1VUIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBQYXJhbWV0ZXJzIGZvciBETUEgTG9naWMgKi8KKwlETUFQQVJBTVMgeworCQlzaXplCQkxCisJCWZpZWxkCVBSRUxPQURFTgkweDgwCisJCWZpZWxkCVdJREVPREQJCTB4NDAKKwkJZmllbGQJU0NTSUVOCQkweDIwCisJCWZpZWxkCVNETUFFTgkJMHgxMAorCQlmaWVsZAlTRE1BRU5BQ0sJMHgxMAorCQlmaWVsZAlIRE1BRU4JCTB4MDgKKwkJZmllbGQJSERNQUVOQUNLCTB4MDgKKwkJZmllbGQJRElSRUNUSU9OCTB4MDQJLyogU2V0IGluZGljYXRlcyBQQ0ktPlNDU0kgKi8KKwkJZmllbGQJRklGT0ZMVVNICTB4MDIKKwkJZmllbGQJRklGT1JFU0VUCTB4MDEKKwl9CisJU0VRX0ZMQUdTIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlOT1RfSURFTlRJRklFRAkJMHg4MAorCQlmaWVsZAlOT19DREJfU0VOVAkJMHg0MAorCQlmaWVsZAlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCisJCWZpZWxkCURQSEFTRQkJCTB4MjAKKwkJLyogVGFyZ2V0IGZsYWdzICovCisJCWZpZWxkCVRBUkdfQ01EX1BFTkRJTkcJMHgxMAorCQlmaWVsZAlDTURQSEFTRV9QRU5ESU5HCTB4MDgKKwkJZmllbGQJRFBIQVNFX1BFTkRJTkcJCTB4MDQKKwkJZmllbGQJU1BIQVNFX1BFTkRJTkcJCTB4MDIKKwkJZmllbGQJTk9fRElTQ09OTkVDVAkJMHgwMQorCX0KKwkvKgorCSAqIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUKKwkgKiB0YXJnZXQvY2hhbm5lbC9sdW4gb2YgYQorCSAqIHJlY29ubmVjdGluZyB0YXJnZXQKKwkgKi8KKwlTQVZFRF9TQ1NJSUQgeworCQlzaXplCQkxCisJfQorCVNBVkVEX0xVTiB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBUaGUgbGFzdCBidXMgcGhhc2UgYXMgc2VlbiBieSB0aGUgc2VxdWVuY2VyLiAKKwkgKi8KKwlMQVNUUEhBU0UgeworCQlzaXplCQkxCisJCWZpZWxkCUNESQkJMHg4MAorCQlmaWVsZAlJT0kJCTB4NDAKKwkJZmllbGQJTVNHSQkJMHgyMAorCQltYXNrCVBIQVNFX01BU0sJQ0RJfElPSXxNU0dJCisJCW1hc2sJUF9EQVRBT1VUCTB4MDAKKwkJbWFzawlQX0RBVEFJTglJT0kKKwkJbWFzawlQX0NPTU1BTkQJQ0RJCisJCW1hc2sJUF9NRVNHT1VUCUNESXxNU0dJCisJCW1hc2sJUF9TVEFUVVMJQ0RJfElPSQorCQltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorCQltYXNrCVBfQlVTRlJFRQkweDAxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgYXdhaXRpbmcKKwkgKiBzZWxlY3Rpb24KKwkgKi8KKwlXQUlUSU5HX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBhcmUKKwkgKiBkaXNjb25uZWN0ZWQuICBVc2VkIGZvciBTQ0IKKwkgKiBwYWdpbmcuCisJICovCisJRElTQ09OTkVDVEVEX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBhcmUKKwkgKiBub3QgaW4gdXNlLiAgVXNlZCBmb3IgU0NCIHBhZ2luZy4KKwkgKi8KKwlGUkVFX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogaGVhZCBvZiBsaXN0IG9mIFNDQnMgdGhhdCBoYXZlCisJICogY29tcGxldGVkIGJ1dCBoYXZlIG5vdCBiZWVuCisJICogcHV0IGludG8gdGhlIHFvdXRmaWZvLgorCSAqLworCUNPTVBMRVRFX1NDQkggeworCQlzaXplCQkxCisJfQorCS8qCisJICogQWRkcmVzcyBvZiB0aGUgaGFyZHdhcmUgc2NiIGFycmF5IGluIHRoZSBob3N0LgorCSAqLworCUhTQ0JfQUREUiB7CisJCXNpemUJCTQKKwl9CisJLyoKKwkgKiBCYXNlIGFkZHJlc3Mgb2Ygb3VyIHNoYXJlZCBkYXRhIHdpdGggdGhlIGtlcm5lbCBkcml2ZXIgaW4gaG9zdAorCSAqIG1lbW9yeS4gIFRoaXMgaW5jbHVkZXMgdGhlIHFvdXRmaWZvIGFuZCB0YXJnZXQgbW9kZQorCSAqIGluY29taW5nIGNvbW1hbmQgcXVldWUuCisJICovCisJU0hBUkVEX0RBVEFfQUREUiB7CisJCXNpemUJCTQKKwl9CisJS0VSTkVMX1FJTlBPUyB7CisJCXNpemUJCTEKKwl9CisJUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlRT1VUUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIEtlcm5lbCBhbmQgc2VxdWVuY2VyIG9mZnNldHMgaW50byB0aGUgcXVldWUgb2YKKwkgKiBpbmNvbWluZyB0YXJnZXQgbW9kZSBjb21tYW5kIGRlc2NyaXB0b3JzLiAgVGhlCisJICogcXVldWUgaXMgZnVsbCB3aGVuIHRoZSBLRVJORUxfVFFJTlBPUyA9PSBUUUlOUE9TLgorCSAqLworCUtFUk5FTF9UUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlUUUlOUE9TIHsgICAgICAgICAgICAgICAgCisJCXNpemUJCTEKKwl9CisJQVJHXzEgeworCQlzaXplCQkxCisJCW1hc2sJU0VORF9NU0cJCTB4ODAKKwkJbWFzawlTRU5EX1NFTlNFCQkweDQwCisJCW1hc2sJU0VORF9SRUoJCTB4MjAKKwkJbWFzawlNU0dPVVRfUEhBU0VNSVMJCTB4MTAKKwkJbWFzawlFWElUX01TR19MT09QCQkweDA4CisJCW1hc2sJQ09OVF9NU0dfTE9PUAkJMHgwNAorCQltYXNrCUNPTlRfVEFSR19TRVNTSU9OCTB4MDIKKwkJYWxpYXMJUkVUVVJOXzEKKwl9CisJQVJHXzIgeworCQlzaXplCQkxCisJCWFsaWFzCVJFVFVSTl8yCisJfQorCisJLyoKKwkgKiBTbmFwc2hvdCBvZiBNU0dfT1VUIHRha2VuIGFmdGVyIGVhY2ggbWVzc2FnZSBpcyBzZW50LgorCSAqLworCUxBU1RfTVNHIHsKKwkJc2l6ZQkJMQorCX0KKworCS8qCisJICogU2VxdWVuY2VzIHRoZSBrZXJuZWwgZHJpdmVyIGhhcyBva2F5ZWQgZm9yIHVzLiAgVGhpcyBhbGxvd3MKKwkgKiB0aGUgZHJpdmVyIHRvIGRvIHRoaW5ncyBsaWtlIHByZXZlbnQgaW5pdGlhdG9yIG9yIHRhcmdldAorCSAqIG9wZXJhdGlvbnMuCisJICovCisJU0NTSVNFUV9URU1QTEFURSB7CisJCXNpemUJCTEKKwkJZmllbGQJRU5TRUxPCQkweDQwCisJCWZpZWxkCUVOU0VMSQkJMHgyMAorCQlmaWVsZAlFTlJTRUxJCQkweDEwCisJCWZpZWxkCUVOQVVUT0FUTk8JMHgwOAorCQlmaWVsZAlFTkFVVE9BVE5JCTB4MDQKKwkJZmllbGQJRU5BVVRPQVROUAkweDAyCisJfQorfQorCitzY3JhdGNoX3JhbSB7CisJYWRkcmVzcwkJMHgwNTYKKwlzaXplCQk0CisJLyoKKwkgKiBUaGVzZSBzY3JhdGNoIHJhbSBsb2NhdGlvbnMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSAyNzRYIEJJT1MuCisJICogV2UgcmV1c2UgdGhlbSBhZnRlciBjYXB0dXJpbmcgdGhlIEJJT1Mgc2V0dGluZ3MgZHVyaW5nCisJICogaW5pdGlhbGl6YXRpb24uCisJICovCisKKwkvKgorCSAqIFRoZSBpbml0aWF0b3Igc3BlY2lmaWVkIHRhZyBmb3IgdGhpcyB0YXJnZXQgbW9kZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwlIQV8yNzRfQklPU0dMT0JBTCB7CisJCXNpemUJMQorCQlmaWVsZAlIQV8yNzRfRVhURU5ERURfVFJBTlMJMHgwMQorCQlhbGlhcwlJTklUSUFUT1JfVEFHCisJfQorCisJU0VRX0ZMQUdTMiB7CisJCXNpemUJMQorCQlmaWVsZAlTQ0JfRE1BCQkJMHgwMQorCQlmaWVsZAlUQVJHRVRfTVNHX1BFTkRJTkcJMHgwMgorCX0KK30KKworc2NyYXRjaF9yYW0geworCWFkZHJlc3MJCTB4MDVhCisJc2l6ZQkJNgorCS8qCisJICogVGhlc2UgYXJlIHJlc2VydmVkIHJlZ2lzdGVycyBpbiB0aGUgY2FyZCdzIHNjcmF0Y2ggcmFtIG9uIHRoZSAyNzQyLgorCSAqIFRoZSBFSVNBIGNvbmZpZ3VyYWl0b24gY2hpcCBpcyBtYXBwZWQgaGVyZS4gIE9uIFJldiBFLiBvZiB0aGUKKwkgKiBhaWM3NzcwLCB0aGUgc2VxdWVuY2VyIGNhbiB1c2UgdGhpcyBhcmVhIGZvciBzY3JhdGNoLCBidXQgdGhlCisJICogaG9zdCBjYW5ub3QgZGlyZWN0bHkgYWNjZXNzIHRoZXNlIHJlZ2lzdGVycy4gIE9uIGxhdGVyIGNoaXBzLCB0aGlzCisJICogYXJlYSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBieSBib3RoIHRoZSBob3N0IGFuZCB0aGUgc2VxdWVuY2VyLgorCSAqIEV2ZW4gb24gbGF0ZXIgY2hpcHMsIG1hbnkgb2YgdGhlc2UgbG9jYXRpb25zIGFyZSBpbml0aWFsaXplZCBieQorCSAqIHRoZSBCSU9TLgorCSAqLworCVNDU0lDT05GIHsKKwkJc2l6ZQkJMQorCQlmaWVsZAlURVJNX0VOQgkweDgwCisJCWZpZWxkCVJFU0VUX1NDU0kJMHg0MAorCQlmaWVsZAlFTlNQQ0hLCQkweDIwCisJCW1hc2sJSFNDU0lJRAkJMHgwNwkvKiBvdXIgU0NTSSBJRCAqLworCQltYXNrCUhXU0NTSUlECTB4MGYJLyogb3VyIFNDU0kgSUQgaWYgV2lkZSBCdXMgKi8KKwl9CisJSU5UREVGIHsKKwkJYWRkcmVzcwkJMHgwNWMKKwkJc2l6ZQkJMQorCQlmaWVsZAlFREdFX1RSSUcJMHg4MAorCQltYXNrCVZFQ1RPUgkJMHgwZgorCX0KKwlIT1NUQ09ORiB7CisJCWFkZHJlc3MJCTB4MDVkCisJCXNpemUJCTEKKwl9CisJSEFfMjc0X0JJT1NDVFJMCXsKKwkJYWRkcmVzcwkJMHgwNWYKKwkJc2l6ZQkJMQorCQltYXNrCUJJT1NNT0RFCQkweDMwCisJCW1hc2sJQklPU0RJU0FCTEVECQkweDMwCQorCQlmaWVsZAlDSEFOTkVMX0JfUFJJTUFSWQkweDA4CisJfQorfQorCitzY3JhdGNoX3JhbSB7CisJYWRkcmVzcwkJMHgwNzAKKwlzaXplCQkxNgorCisJLyoKKwkgKiBQZXIgdGFyZ2V0IFNDU0kgb2Zmc2V0IHZhbHVlcyBmb3IgVWx0cmEyIGNvbnRyb2xsZXJzLgorCSAqLworCVRBUkdfT0ZGU0VUIHsKKwkJc2l6ZQkJMTYKKwl9Cit9CisKK2NvbnN0IFRJRF9TSElGVAkJNAorY29uc3QgU0NCX0xJU1RfTlVMTAkweGZmCitjb25zdCBUQVJHRVRfQ01EX0NNUExUCTB4ZmUKKworY29uc3QgQ0NTR0FERFJfTUFYCTB4ODAKK2NvbnN0IENDU0dSQU1fTUFYU0VHUwkxNgorCisvKiBXRFRSIE1lc3NhZ2UgdmFsdWVzICovCitjb25zdCBCVVNfOF9CSVQJCQkweDAwCitjb25zdCBCVVNfMTZfQklUCQkweDAxCitjb25zdCBCVVNfMzJfQklUCQkweDAyCisKKy8qIE9mZnNldCBtYXhpbXVtcyAqLworY29uc3QgTUFYX09GRlNFVF84QklUCQkweDBmCitjb25zdCBNQVhfT0ZGU0VUXzE2QklUCQkweDA4Citjb25zdCBNQVhfT0ZGU0VUX1VMVFJBMgkJMHg3ZgorY29uc3QgTUFYX09GRlNFVAkJMHg3ZgorY29uc3QgSE9TVF9NU0cJCQkweGZmCisKKy8qIFRhcmdldCBtb2RlIGNvbW1hbmQgcHJvY2Vzc2luZyBjb25zdGFudHMgKi8KK2NvbnN0IENNRF9HUk9VUF9DT0RFX1NISUZUCTB4MDUKKworY29uc3QgU1RBVFVTX0JVU1kJCTB4MDgKK2NvbnN0IFNUQVRVU19RVUVVRV9GVUxMCTB4MjgKK2NvbnN0IFRBUkdFVF9EQVRBX0lOCQkxCisKKy8qCisgKiBEb3dubG9hZGVkIChrZXJuZWwgaW5zZXJ0ZWQpIGNvbnN0YW50cworICovCisvKiBPZmZzZXRzIGludG8gdGhlIFNDQklEIGFycmF5IHdoZXJlIGRpZmZlcmVudCBkYXRhIGlzIHN0b3JlZCAqLworY29uc3QgUU9VVEZJRk9fT0ZGU0VUIGRvd25sb2FkCitjb25zdCBRSU5GSUZPX09GRlNFVCBkb3dubG9hZAorY29uc3QgQ0FDSEVTSVpFX01BU0sgZG93bmxvYWQKK2NvbnN0IElOVkVSVEVEX0NBQ0hFU0laRV9NQVNLIGRvd25sb2FkCitjb25zdCBTR19QUkVGRVRDSF9DTlQgZG93bmxvYWQKK2NvbnN0IFNHX1BSRUZFVENIX0FMSUdOX01BU0sgZG93bmxvYWQKK2NvbnN0IFNHX1BSRUZFVENIX0FERFJfTUFTSyBkb3dubG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5zZXEgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LnNlcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRiNzQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5zZXEKQEAgLTAsMCArMSwyMzk4IEBACisvKgorICogQWRhcHRlYyAyNzR4LzI4NHgvMjk0eCBkZXZpY2UgZHJpdmVyIGZpcm13YXJlIGZvciBMaW51eCBhbmQgRnJlZUJTRC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMSBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCitWRVJTSU9OID0gIiRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5zZXEjNTYgJCIKK1BBVENIX0FSR19MSVNUID0gInN0cnVjdCBhaGNfc29mdGMgKmFoYyIKK1BSRUZJWCA9ICJhaGNfIgorCisjaW5jbHVkZSAiYWljN3h4eC5yZWciCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisKKy8qCisgKiBBIGZldyB3b3JkcyBvbiB0aGUgd2FpdGluZyBTQ0IgbGlzdDoKKyAqIEFmdGVyIHN0YXJ0aW5nIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUsIHdlIGNoZWNrIGZvciByZWNvbm5lY3RpbmcgdGFyZ2V0cworICogYXMgd2VsbCBhcyBmb3Igb3VyIHNlbGVjdGlvbiB0byBjb21wbGV0ZSBqdXN0IGluIGNhc2UgdGhlIHJlc2VsZWN0aW9uIHdpbnMKKyAqIGJ1cyBhcmJpdHJhdGlvbi4gIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHdlIG11c3Qga2VlcCB0cmFjayBvZiB0aGUKKyAqIFNDQiB0aGF0IHdlJ3ZlIGFscmVhZHkgcHVsbGVkIGZyb20gdGhlIFFJTkZJRk8gYW5kIHN0YXJ0ZWQgdGhlIHNlbGVjdGlvbgorICogb24ganVzdCBpbiBjYXNlIHRoZSByZXNlbGVjdGlvbiB3aW5zIHNvIHRoYXQgd2UgY2FuIHJldHJ5IHRoZSBzZWxlY3Rpb24gYXQKKyAqIGEgbGF0ZXIgdGltZS4gIFRoaXMgcHJvYmxlbSBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgaG9sZGluZyBhIHNpbmdsZSBlbnRyeQorICogaW4gc2NyYXRjaCByYW0gc2luY2UgYSByZWNvbm5lY3RpbmcgdGFyZ2V0IGNhbiByZXF1ZXN0IHNlbnNlIGFuZCB0aGlzIHdpbGwKKyAqIGNyZWF0ZSB5ZXQgYW5vdGhlciBTQ0Igd2FpdGluZyBmb3Igc2VsZWN0aW9uLiAgVGhlIHNvbHV0aW9uIHVzZWQgaGVyZSBpcyB0byAKKyAqIHVzZSBieXRlIDI3IG9mIHRoZSBTQ0IgYXMgYSBwc3VlZG8tbmV4dCBwb2ludGVyIGFuZCB0byB0aHJlYWQgYSBsaXN0CisgKiBvZiBTQ0JzIHRoYXQgYXJlIGF3YWl0aW5nIHNlbGVjdGlvbi4gIFNpbmNlIDAtMHhmZSBhcmUgdmFsaWQgU0NCIGluZGV4ZXMsIAorICogU0NCX0xJU1RfTlVMTCBpcyAweGZmIHdoaWNoIGlzIG91dCBvZiByYW5nZS4gIEFuIGVudHJ5IGlzIGFsc28gYWRkZWQgdG8KKyAqIHRoaXMgbGlzdCBldmVyeXRpbWUgYSByZXF1ZXN0IHNlbnNlIG9jY3VycyBvciBhZnRlciBjb21wbGV0aW5nIGEgbm9uLXRhZ2dlZAorICogY29tbWFuZCBmb3Igd2hpY2ggYSBzZWNvbmQgU0NCIGhhcyBiZWVuIHF1ZXVlZC4gIFRoZSBzZXF1ZW5jZXIgd2lsbAorICogYXV0b21hdGljYWxseSBjb25zdW1lIHRoZSBlbnRyaWVzLgorICovCisKK2J1c19mcmVlX3NlbDoKKwkvKgorCSAqIFR1cm4gb2ZmIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUuICBXZSBuZWVkIHRvIHJlc2V0IHRoZQorCSAqIHNlbGVjdGlvbiByZXF1ZXN0IGluIG9yZGVyIHRvIHBlcmZvcm0gYSBuZXcgc2VsZWN0aW9uLgorCSAqLworCWFuZAlTQ1NJU0VRLCBURU1PREV8RU5TRUxJfEVOUlNFTEl8RU5BVVRPQVROUDsKKwlhbmQJU0lNT0RFMSwgfkVOQlVTRlJFRTsKK3BvbGxfZm9yX3dvcms6CisJY2FsbAljbGVhcl90YXJnZXRfc3RhdGU7CisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJY2xyCVNDU0lCVVNMOworCX0KKwl0ZXN0CVNDU0lTRVEsIEVOU0VMTwlqbnogcG9sbF9mb3Jfc2VsZWN0aW9uOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCXhvcglTQkxLQ1RMLFNFTEJVU0I7CS8qIFRvZ2dsZSB0byB0aGUgb3RoZXIgYnVzICovCisJCXRlc3QJU0NTSVNFUSwgRU5TRUxPCQlqbnogcG9sbF9mb3Jfc2VsZWN0aW9uOworCX0KKwljbXAJV0FJVElOR19TQ0JILFNDQl9MSVNUX05VTEwgam5lIHN0YXJ0X3dhaXRpbmc7Citwb2xsX2Zvcl93b3JrX2xvb3A6CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJeG9yCVNCTEtDVEwsU0VMQlVTQjsJLyogVG9nZ2xlIHRvIHRoZSBvdGhlciBidXMgKi8KKwl9CisJdGVzdAlTU1RBVDAsIFNFTERPfFNFTERJCWpueiBzZWxlY3Rpb247Cit0ZXN0X3F1ZXVlOgorCS8qIEhhcyB0aGUgZHJpdmVyIHBvc3RlZCBhbnkgd29yayBmb3IgdXM/ICovCitCRUdJTl9DUklUSUNBTDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCkgeworCQl0ZXN0CVFPRkZfQ1RMU1RBLCBTQ0JfQVZBSUwganogcG9sbF9mb3Jfd29ya19sb29wOworCX0gZWxzZSB7CisJCW1vdglBLCBRSU5QT1M7CisJCWNtcAlLRVJORUxfUUlOUE9TLCBBIGplIHBvbGxfZm9yX3dvcmtfbG9vcDsKKwl9CisJbW92CUFSR18xLCBORVhUX1FVRVVFRF9TQ0I7CisKKwkvKgorCSAqIFdlIGhhdmUgYXQgbGVhc3Qgb25lIHF1ZXVlZCBTQ0Igbm93IGFuZCB3ZSBkb24ndCBoYXZlIGFueSAKKwkgKiBTQ0JzIGluIHRoZSBsaXN0IG9mIFNDQnMgYXdhaXRpbmcgc2VsZWN0aW9uLiAgQWxsb2NhdGUgYQorCSAqIGNhcmQgU0NCIGZvciB0aGUgaG9zdCdzIFNDQiBhbmQgZ2V0IHRvIHdvcmsgb24gaXQuCisJICovCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCW1vdglBTExaRVJPUwljYWxsCWdldF9mcmVlX29yX2Rpc2Nfc2NiOworCX0gZWxzZSB7CisJCS8qIEluIHRoZSBub24tcGFnaW5nIGNhc2UsIHRoZSBTQ0JJRCA9PSBoYXJkd2FyZSBTQ0IgaW5kZXggKi8KKwkJbW92CVNDQlBUUiwgQVJHXzE7CisJfQorCW9yCVNFUV9GTEFHUzIsIFNDQl9ETUE7CitFTkRfQ1JJVElDQUw7CitkbWFfcXVldWVkX3NjYjoKKwkvKgorCSAqIERNQSB0aGUgU0NCIGZyb20gaG9zdCByYW0gaW50byB0aGUgY3VycmVudCBTQ0IgbG9jYXRpb24uCisJICovCisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CUFSR18xCWNhbGwgZG1hX3NjYjsKKwkvKgorCSAqIENoZWNrIG9uZSBsYXN0IHRpbWUgdG8gc2VlIGlmIHRoaXMgU0NCIHdhcyBjYW5jZWxlZAorCSAqIGJlZm9yZSB3ZSBjb21wbGV0ZWQgdGhlIERNQSBvcGVyYXRpb24uICBJZiBpdCB3YXMsCisJICogdGhlIFFJTkZJRk8gbmV4dCBwb2ludGVyIHdpbGwgbm90IG1hdGNoIG91ciBzYXZlZAorCSAqIHZhbHVlLgorCSAqLworCW1vdglBLCBBUkdfMTsKK0JFR0lOX0NSSVRJQ0FMOworCWNtcAlORVhUX1FVRVVFRF9TQ0IsIEEgam5lIGFib3J0X3FpbnNjYjsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKSB7CisJCWNtcAlTQ0JfVEFHLCBBIGplIC4gKyAyOworCQltdmkJU0NCX01JU01BVENIIGNhbGwgc2V0X3NlcWludDsKKwl9CisJbW92CU5FWFRfUVVFVUVEX1NDQiwgU0NCX05FWFQ7CisJbW92CVNDQl9ORVhULFdBSVRJTkdfU0NCSDsKKwltb3YJV0FJVElOR19TQ0JILCBTQ0JQVFI7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJbW92CU5PTkUsIFNOU0NCX1FPRkY7CisJfSBlbHNlIHsKKwkJaW5jCVFJTlBPUzsKKwl9CisJYW5kCVNFUV9GTEFHUzIsIH5TQ0JfRE1BOworRU5EX0NSSVRJQ0FMOworc3RhcnRfd2FpdGluZzoKKwkvKgorCSAqIFN0YXJ0IHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgd2FpdGluZyBTQ0IgbGlzdC4KKwkgKi8KKwltb3YJU0NCUFRSLCBXQUlUSU5HX1NDQkg7CisJY2FsbAlzdGFydF9zZWxlY3Rpb247CisKK3BvbGxfZm9yX3NlbGVjdGlvbjoKKwkvKgorCSAqIFR3aW4gY2hhbm5lbCBkZXZpY2VzIGNhbm5vdCBoYW5kbGUgdGhpbmdzIGxpa2UgU0VMVE8KKwkgKiBpbnRlcnJ1cHRzIG9uIHRoZSAiYmFja2dyb3VuZCIgY2hhbm5lbC4gIFNvLCB3aGlsZQorCSAqIHNlbGVjdGluZywga2VlcCBwb2xsaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgdW50aWwKKwkgKiBlaXRoZXIgYSBzZWxlY3Rpb24gb3IgcmVzZWxlY3Rpb24gb2NjdXJzLgorCSAqLworCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxESQlqeiBwb2xsX2Zvcl9zZWxlY3Rpb247CisKK3NlbGVjdGlvbjoKKwkvKgorCSAqIFdlIGFyZW4ndCBleHBlY3RpbmcgYSBidXMgZnJlZSwgc28gaW50ZXJydXB0CisJICogdGhlIGtlcm5lbCBkcml2ZXIgaWYgaXQgaGFwcGVucy4KKwkgKi8KKwltdmkJQ0xSU0lOVDEsQ0xSQlVTRlJFRTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJb3IJU0lNT0RFMSwgRU5CVVNGUkVFOworCX0KKworCS8qCisJICogR3VhcmQgYWdhaW5zdCBhIGJ1cyBmcmVlIGFmdGVyIChyZSlzZWxlY3Rpb24KKwkgKiBidXQgcHJpb3IgdG8gZW5hYmxpbmcgdGhlIGJ1c2ZyZWUgaW50ZXJydXB0LiAgU0VMREkKKwkgKiBhbmQgU0VMRE8gd2lsbCBiZSBjbGVhcmVkIGluIHRoYXQgY2FzZS4KKwkgKi8KKwl0ZXN0CVNTVEFUMCwgU0VMREl8U0VMRE8JanogYnVzX2ZyZWVfc2VsOworCXRlc3QJU1NUQVQwLFNFTERPCWpueiBzZWxlY3Rfb3V0Oworc2VsZWN0X2luOgorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKSB7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCQl0ZXN0CVNTVEFUMCwgVEFSR0VUCWp6IGluaXRpYXRvcl9yZXNlbGVjdDsKKwkJfQorCQltdmkJQ0xSU0lOVDAsIENMUlNFTERJOworCisJCS8qCisJCSAqIFdlJ3ZlIGp1c3QgYmVlbiBzZWxlY3RlZC4gIEFzc2VydCBCU1kgYW5kCisJCSAqIHNldHVwIHRoZSBwaGFzZSBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzCisJCSAqIGZyb20gdGhlIHRhcmdldC4KKwkJICovCisJCW12aQlTQ1NJU0lHTywgUF9NRVNHT1VUfEJTWU87CisKKwkJLyoKKwkJICogU2V0dXAgdGhlIERNQSBmb3Igc2VuZGluZyB0aGUgaWRlbnRpZnkgYW5kCisJCSAqIGNvbW1hbmQgaW5mb3JtYXRpb24uCisJCSAqLworCQltdmkJU0VRX0ZMQUdTLCBDTURQSEFTRV9QRU5ESU5HOworCisJCW1vdiAgICAgQSwgVFFJTlBPUzsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQltdmkJRElOREVYLCBDQ0hBRERSOworCQkJbXZpCVNIQVJFRF9EQVRBX0FERFIgY2FsbCBzZXRfMzJieXRlX2FkZHI7CisJCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQ7CisJCX0gZWxzZSB7CisJCQltdmkJRElOREVYLCBIQUREUjsKKwkJCW12aQlTSEFSRURfREFUQV9BRERSIGNhbGwgc2V0XzMyYnl0ZV9hZGRyOworCQkJbXZpCURGQ05UUkwsIEZJRk9SRVNFVDsKKwkJfQorCisJCS8qIEluaXRpYXRvciB0aGF0IHNlbGVjdGVkIHVzICovCisJCWFuZAlTQVZFRF9TQ1NJSUQsIFNFTElEX01BU0ssIFNFTElEOworCQkvKiBUaGUgVGFyZ2V0IElEIHdlIHdlcmUgc2VsZWN0ZWQgYXQgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCkgeworCQkJYW5kCUEsIE9JRCwgVEFSR0lESU47CisJCX0gZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQlhbmQJQSwgT0lELCBTQ1NJSURfVUxUUkEyOworCQl9IGVsc2UgeworCQkJYW5kCUEsIE9JRCwgU0NTSUlEOworCQl9CisJCW9yCVNBVkVEX1NDU0lJRCwgQTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJCXRlc3QgCVNCTEtDVEwsIFNFTEJVU0IganogLiArIDI7CisJCQlvcglTQVZFRF9TQ1NJSUQsIFRXSU5fQ0hOTEI7CisJCX0KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQltb3YJQ0NTQ0JSQU0sIFNBVkVEX1NDU0lJRDsKKwkJfSBlbHNlIHsKKwkJCW1vdglERkRBVCwgU0FWRURfU0NTSUlEOworCQl9CisKKwkJLyoKKwkJICogSWYgQVROIGlzbid0IGFzc2VydGVkLCB0aGUgdGFyZ2V0IGlzbid0IGludGVyZXN0ZWQKKwkJICogaW4gdGFsa2luZyB0byB1cy4gIEdvIGRpcmVjdGx5IHRvIGJ1cyBmcmVlLgorCQkgKiBYWFggU0NTSS0xIG1heSByZXF1aXJlIHVzIHRvIGFzc3VtZSBsdW4gMCBpZgorCQkgKiBBVE4gaXMgZmFsc2UuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCWp6CXRhcmdldF9idXNmcmVlOworCisJCS8qCisJCSAqIFdhdGNoIEFUTiBjbG9zZWx5IG5vdyBhcyB3ZSBwdWxsIGluIG1lc3NhZ2VzIGZyb20gdGhlCisJCSAqIGluaXRpYXRvci4gIFdlIGZvbGxvdyB0aGUgZ3VpZGxpbmVzIGZyb20gc2VjdGlvbiA2LjUKKwkJICogb2YgdGhlIFNDU0ktMiBzcGVjIGZvciB3aGF0IG1lc3NhZ2VzIGFyZSBhbGxvd2VkIHdoZW4uCisJCSAqLworCQljYWxsCXRhcmdldF9pbmI7CisKKwkJLyoKKwkJICogT3VyIGZpcnN0IG1lc3NhZ2UgbXVzdCBiZSBvbmUgb2YgSURFTlRJRlksIEFCT1JULCBvcgorCQkgKiBCVVNfREVWSUNFX1JFU0VULgorCQkgKi8KKwkJdGVzdAlESU5ERVgsIE1TR19JREVOVElGWUZMQUcganogaG9zdF90YXJnZXRfbWVzc2FnZV9sb29wOworCQkvKiBTdG9yZSBmb3IgaG9zdCAqLworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCW1vdglDQ1NDQlJBTSwgRElOREVYOworCQl9IGVsc2UgeworCQkJbW92CURGREFULCBESU5ERVg7CisJCX0KKwkJYW5kCVNBVkVEX0xVTiwgTVNHX0lERU5USUZZX0xVTk1BU0ssIERJTkRFWDsKKworCQkvKiBSZW1lbWJlciBmb3IgZGlzY29ubmVjdGlvbiBkZWNpc2lvbiAqLworCQl0ZXN0CURJTkRFWCwgTVNHX0lERU5USUZZX0RJU0NGTEFHIGpueiAuICsgMjsKKwkJLyogWFhYIEhvbm9yIHBlciB0YXJnZXQgc2V0dGluZ3MgdG9vICovCisJCW9yCVNFUV9GTEFHUywgTk9fRElTQ09OTkVDVDsKKworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCWp6CWlkZW50X21lc3NhZ2VzX2RvbmU7CisJCWNhbGwJdGFyZ2V0X2luYjsKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIHRhZ2dlZCByZXF1ZXN0LCB0aGUgdGFnZ2VkIG1lc3NhZ2UgbXVzdAorCQkgKiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGlkZW50aWZ5LiAgV2UgdGVzdCBmb3IgYSB2YWxpZAorCQkgKiB0YWcgbWVzc2FnZSBieSBzZWVpbmcgaWYgaXQgaXMgPj0gTVNHX1NJTVBMRV9RX1RBRyBhbmQKKwkJICogPCBNU0dfSUdOX1dJREVfUkVTSURVRS4KKwkJICovCisJCWFkZAlBLCAtTVNHX1NJTVBMRV9RX1RBRywgRElOREVYOworCQlqbmMJaWRlbnRfbWVzc2FnZXNfZG9uZV9tc2dfcGVuZGluZzsKKwkJYWRkCUEsIC1NU0dfSUdOX1dJREVfUkVTSURVRSwgRElOREVYOworCQlqYwlpZGVudF9tZXNzYWdlc19kb25lX21zZ19wZW5kaW5nOworCisJCS8qIFN0b3JlIGZvciBob3N0ICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJbW92CUNDU0NCUkFNLCBESU5ERVg7CisJCX0gZWxzZSB7CisJCQltb3YJREZEQVQsIERJTkRFWDsKKwkJfQorCQkKKwkJLyoKKwkJICogSWYgdGhlIGluaXRpYXRvciBkb2Vzbid0IGZlZWwgbGlrZSBwcm92aWRpbmcgYSB0YWcgbnVtYmVyLAorCQkgKiB3ZSd2ZSBnb3QgYSBmYWlsZWQgc2VsZWN0aW9uIGFuZCBtdXN0IHRyYW5zaXRpb24gdG8gYnVzCisJCSAqIGZyZWUuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCWp6CXRhcmdldF9idXNmcmVlOworCisJCS8qCisJCSAqIFN0b3JlIHRoZSB0YWcgZm9yIHRoZSBob3N0LgorCQkgKi8KKwkJY2FsbAl0YXJnZXRfaW5iOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCW1vdglDQ1NDQlJBTSwgRElOREVYOworCQl9IGVsc2UgeworCQkJbW92CURGREFULCBESU5ERVg7CisJCX0KKwkJbW92CUlOSVRJQVRPUl9UQUcsIERJTkRFWDsKKwkJb3IJU0VRX0ZMQUdTLCBUQVJHRVRfQ01EX0lTX1RBR0dFRDsKKworaWRlbnRfbWVzc2FnZXNfZG9uZToKKwkJLyogVGVybWluYXRlIHRoZSBpZGVudCBsaXN0ICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJbXZpCUNDU0NCUkFNLCBTQ0JfTElTVF9OVUxMOworCQl9IGVsc2UgeworCQkJbXZpCURGREFULCBTQ0JfTElTVF9OVUxMOworCQl9CisJCW9yCVNFUV9GTEFHUywgVEFSR19DTURfUEVORElORzsKKwkJdGVzdAlTRVFfRkxBR1MyLCBUQVJHRVRfTVNHX1BFTkRJTkcKKwkJCWpueiB0YXJnZXRfbWVzZ291dF9wZW5kaW5nOworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JIGpueiB0YXJnZXRfbWVzZ291dF9jb250aW51ZTsKKwkJam1wCXRhcmdldF9JVGxvb3A7CisKKworaWRlbnRfbWVzc2FnZXNfZG9uZV9tc2dfcGVuZGluZzoKKwkJb3IJU0VRX0ZMQUdTMiwgVEFSR0VUX01TR19QRU5ESU5HOworCQlqbXAJaWRlbnRfbWVzc2FnZXNfZG9uZTsKKworCQkvKgorCQkgKiBQdXNoZWQgbWVzc2FnZSBsb29wIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8KKwkJICogcnVuIGl0J3Mgb3duIHRhcmdldCBtb2RlIG1lc3NhZ2Ugc3RhdGUgZW5naW5lLgorCQkgKi8KK2hvc3RfdGFyZ2V0X21lc3NhZ2VfbG9vcDoKKwkJbXZpCUhPU1RfTVNHX0xPT1AgY2FsbCBzZXRfc2VxaW50OworCQljbXAJUkVUVVJOXzEsIEVYSVRfTVNHX0xPT1AJamUgdGFyZ2V0X0lUbG9vcDsKKwkJdGVzdAlTU1RBVDAsIFNQSU9SRFkganogLjsKKwkJam1wCWhvc3RfdGFyZ2V0X21lc3NhZ2VfbG9vcDsKKwl9CisKK2lmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKSB7CisvKgorICogUmVzZWxlY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGJ5IGEgdGFyZ2V0LiBNYWtlIGEgbm90ZSB0aGF0IHdlJ3ZlIGJlZW4KKyAqIHJlc2VsZWN0ZWQsIGJ1dCBoYXZlbid0IHNlZW4gYW4gSURFTlRJRlkgbWVzc2FnZSBmcm9tIHRoZSB0YXJnZXQgeWV0LgorICovCitpbml0aWF0b3JfcmVzZWxlY3Q6CisJLyogWFhYIHRlc3QgZm9yIGFuZCBoYW5kbGUgT05FIEJJVCBjb25kaXRpb24gKi8KKwlvcglTWEZSQ1RMMCwgU1BJT0VOfENMUlNUQ05UfENMUkNITjsKKwlhbmQJU0FWRURfU0NTSUlELCBTRUxJRF9NQVNLLCBTRUxJRDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWFuZAlBLCBPSUQsIFNDU0lJRF9VTFRSQTI7CisJfSBlbHNlIHsKKwkJYW5kCUEsIE9JRCwgU0NTSUlEOworCX0KKwlvcglTQVZFRF9TQ1NJSUQsIEE7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJdGVzdAlTQkxLQ1RMLCBTRUxCVVNCCWp6IC4gKyAyOworCQlvcglTQVZFRF9TQ1NJSUQsIFRXSU5fQ0hOTEI7CisJfQorCW12aQlDTFJTSU5UMCwgQ0xSU0VMREk7CisJam1wCUlUbG9vcDsKK30KKworYWJvcnRfcWluc2NiOgorCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7CisJam1wCXBvbGxfZm9yX3dvcmtfbG9vcDsKKworc3RhcnRfc2VsZWN0aW9uOgorCS8qCisJICogSWYgYnVzIHJlc2V0IGludGVycnVwdHMgaGF2ZSBiZWVuIGRpc2FibGVkIChmcm9tIGEgcHJldmlvdXMKKwkgKiByZXNldCksIHJlLWVuYWJsZSB0aGVtIG5vdy4gIFJlc2V0cyBhcmUgb25seSBvZiBpbnRlcmVzdAorCSAqIHdoZW4gd2UgaGF2ZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMsIHNvIHdlIGNhbiBzYWZlbHkKKwkgKiBkZWZlciByZS1lbmFibGluZyB0aGUgaW50ZXJydXB0IHVudGlsLCBhcyBhbiBpbml0aWF0b3IsCisJICogd2Ugc3RhcnQgc2VuZGluZyBvdXQgdHJhbnNhY3Rpb25zIGFnYWluLgorCSAqLworCXRlc3QJU0lNT0RFMSwgRU5TQ1NJUlNUCWpueiAuICsgMzsKKwltdmkJQ0xSU0lOVDEsIENMUlNDU0lSU1RJOworCW9yCVNJTU9ERTEsIEVOU0NTSVJTVDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQlhbmQJU0lOREVYLH5TRUxCVVNCLFNCTEtDVEw7LyogQ2xlYXIgY2hhbm5lbCBzZWxlY3QgYml0ICovCisJCXRlc3QJU0NCX1NDU0lJRCwgVFdJTl9DSE5MQiBqeiAuICsgMjsKKwkJb3IJU0lOREVYLCBTRUxCVVNCOworCQltb3YJU0JMS0NUTCxTSU5ERVg7CQkvKiBzZWxlY3QgY2hhbm5lbCAqLworCX0KK2luaXRpYWxpemVfc2NzaWlkOgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJbW92CVNDU0lJRF9VTFRSQTIsIFNDQl9TQ1NJSUQ7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCWFuZAlTQ1NJSUQsIFRXSU5fVElEfE9JRCwgU0NCX1NDU0lJRDsKKwl9IGVsc2UgeworCQltb3YJU0NTSUlELCBTQ0JfU0NTSUlEOworCX0KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQltb3YJU0lOREVYLCBTQ1NJU0VRX1RFTVBMQVRFOworCQl0ZXN0CVNDQl9DT05UUk9MLCBUQVJHRVRfU0NCIGp6IC4gKyAyOworCQlvcglTSU5ERVgsIFRFTU9ERTsKKwkJbW92CVNDU0lTRVEsIFNJTkRFWCByZXQ7CisJfSBlbHNlIHsKKwkJbW92CVNDU0lTRVEsIFNDU0lTRVFfVEVNUExBVEUgcmV0OworCX0KKworLyoKKyAqIEluaXRpYWxpemUgdHJhbnNmZXIgc2V0dGluZ3Mgd2l0aCBTQ0IgcHJvdmlkZWQgc2V0dGluZ3MuCisgKi8KK3NldF90cmFuc2Zlcl9zZXR0aW5nczoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApIHsKKwkJdGVzdAlTQ0JfQ09OVFJPTCwgVUxUUkFFTkIganogLiArIDI7CisJCW9yCVNYRlJDVEwwLCBGQVNUMjA7CisJfSAKKwkvKgorCSAqIEluaXRpYWxpemUgU0NTSVJBVEUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yIHRoaXMgdGFyZ2V0LgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYm1vdglTQ1NJUkFURSwgU0NCX1NDU0lSQVRFLCAyIHJldDsKKwl9IGVsc2UgeworCQltb3YJU0NTSVJBVEUsIFNDQl9TQ1NJUkFURSByZXQ7CisJfQorCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworLyoKKyAqIFdlIGNhcmVmdWxseSB0b2dnbGUgU1BJT0VOIHRvIGFsbG93IHVzIHRvIHJldHVybiB0aGUgCisgKiBtZXNzYWdlIGJ5dGUgd2UgcmVjZWl2ZSBzbyBpdCBjYW4gYmUgY2hlY2tlZCBwcmlvciB0bworICogZHJpdmluZyBSRVEgb24gdGhlIGJ1cyBmb3IgdGhlIG5leHQgYnl0ZS4KKyAqLwordGFyZ2V0X2luYjoKKwkvKgorCSAqIERyaXZlIFJFUSBvbiB0aGUgYnVzIGJ5IGVuYWJsaW5nIFNDU0kgUElPLgorCSAqLworCW9yCVNYRlJDVEwwLCBTUElPRU47CisJLyogV2FpdCBmb3IgdGhlIGJ5dGUgKi8KKwl0ZXN0CVNTVEFUMCwgU1BJT1JEWSBqeiAuOworCS8qIFByZXZlbnQgb3VyIHJlYWQgZnJvbSB0cmlnZ2VyaW5nIGFub3RoZXIgUkVRICovCisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCS8qIFNhdmUgbGF0Y2hlZCBjb250ZW50cyAqLworCW1vdglESU5ERVgsIFNDU0lEQVRMIHJldDsKK30KKworLyoKKyAqIEFmdGVyIHRoZSBzZWxlY3Rpb24sIHJlbW92ZSB0aGlzIFNDQiBmcm9tIHRoZSAid2FpdGluZyBTQ0IiCisgKiBsaXN0LiAgVGhpcyBpcyBhY2hpZXZlZCBieSBzaW1wbHkgbW92aW5nIG91ciAibmV4dCIgcG9pbnRlciBpbnRvCisgKiBXQUlUSU5HX1NDQkguICBPdXIgbmV4dCBwb2ludGVyIHdpbGwgYmUgc2V0IHRvIG51bGwgdGhlIG5leHQgdGltZSB0aGlzCisgKiBTQ0IgaXMgdXNlZCwgc28gZG9uJ3QgYm90aGVyIHdpdGggaXQgbm93LgorICovCitzZWxlY3Rfb3V0OgorCS8qIFR1cm4gb2ZmIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUgKi8KKwlhbmQJU0NTSVNFUSwgVEVNT0RFfEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlAsIFNDU0lTRVE7CisJbW92CVNDQlBUUiwgV0FJVElOR19TQ0JIOworCW1vdglXQUlUSU5HX1NDQkgsU0NCX05FWFQ7CisJbW92CVNBVkVEX1NDU0lJRCwgU0NCX1NDU0lJRDsKKwlhbmQJU0FWRURfTFVOLCBMSUQsIFNDQl9MVU47CisJY2FsbAlzZXRfdHJhbnNmZXJfc2V0dGluZ3M7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJdGVzdAlTU1RBVDAsIFRBUkdFVAlqeiBpbml0aWF0b3Jfc2VsZWN0OworCisJCW9yCVNYRlJDVEwwLCBDTFJTVENOVHxDTFJDSE47CisKKwkJLyoKKwkJICogUHV0IHRhZyBpbiBjb25ub25pY2FsIGxvY2F0aW9uIHNpbmNlIG5vdAorCQkgKiBhbGwgY29ubmVjdGlvbnMgaGF2ZSBhbiBTQ0IuCisJCSAqLworCQltb3YJSU5JVElBVE9SX1RBRywgU0NCX1RBUkdFVF9JVEFHOworCisJCS8qCisJCSAqIFdlJ3ZlIGp1c3QgcmUtc2VsZWN0ZWQgYW4gaW5pdGlhdG9yLgorCQkgKiBBc3NlcnQgQlNZIGFuZCBzZXR1cCB0aGUgcGhhc2UgZm9yCisJCSAqIHNlbmRpbmcgb3VyIGlkZW50aWZ5IG1lc3NhZ2VzLgorCQkgKi8KKwkJbXZpCVBfTUVTR0lOfEJTWU8gY2FsbCBjaGFuZ2VfcGhhc2U7CisJCW12aQlDTFJTSU5UMCwgQ0xSU0VMRE87CisKKwkJLyoKKwkJICogU3RhcnQgb3V0IHdpdGggYSBzaW1wbGUgaWRlbnRpZnkgbWVzc2FnZS4KKwkJICovCisJCW9yCVNBVkVEX0xVTiwgTVNHX0lERU5USUZZRkxBRyBjYWxsIHRhcmdldF9vdXRiOworCisJCS8qCisJCSAqIElmIHdlIGFyZSB0aGUgcmVzdWx0IG9mIGEgdGFnZ2VkIGNvbW1hbmQsIHNlbmQKKwkJICogYSBzaW1wbGUgUSB0YWcgYW5kIHRoZSB0YWcgaWQuCisJCSAqLworCQl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CCWp6IC4gKyAzOworCQltdmkJTVNHX1NJTVBMRV9RX1RBRyBjYWxsIHRhcmdldF9vdXRiOworCQltb3YJU0NCX1RBUkdFVF9JVEFHIGNhbGwgdGFyZ2V0X291dGI7Cit0YXJnZXRfc3luY2NtZDoKKwkJLyoKKwkJICogTm93IGRldGVybWluZSB3aGF0IHBoYXNlcyB0aGUgaG9zdCB3YW50cyB1cworCQkgKiB0byBnbyB0aHJvdWdoLgorCQkgKi8KKwkJbW92CVNFUV9GTEFHUywgU0NCX1RBUkdFVF9QSEFTRVM7CisJCQorCQl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFCWp6IHRhcmdldF9JVGxvb3A7CisJCW12aQlQX01FU0dJTnxCU1lPIGNhbGwgY2hhbmdlX3BoYXNlOworCQlqbXAJaG9zdF90YXJnZXRfbWVzc2FnZV9sb29wOwordGFyZ2V0X0lUbG9vcDoKKwkJLyoKKwkJICogU3RhcnQgaG9ub3JpbmcgQVROIHNpZ25hbHMgbm93IHRoYXQKKwkJICogd2UgcHJvcGVybHkgaWRlbnRpZmllZCBvdXJzZWx2ZXMuCisJCSAqLworCQl0ZXN0CVNDU0lTSUdJLCBBVE5JCQkJam56IHRhcmdldF9tZXNnb3V0OworCQl0ZXN0CVNFUV9GTEFHUywgQ01EUEhBU0VfUEVORElORwlqbnogdGFyZ2V0X2NtZHBoYXNlOworCQl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFX1BFTkRJTkcJam56IHRhcmdldF9kcGhhc2U7CisJCXRlc3QJU0VRX0ZMQUdTLCBTUEhBU0VfUEVORElORwlqbnogdGFyZ2V0X3NwaGFzZTsKKworCQkvKgorCQkgKiBObyBtb3JlIHdvcmsgdG8gZG8uICBFaXRoZXIgZGlzY29ubmVjdCBvciBub3QgZGVwZW5kaW5nCisJCSAqIG9uIHRoZSBzdGF0ZSBvZiBOT19ESVNDT05ORUNULgorCQkgKi8KKwkJdGVzdAlTRVFfRkxBR1MsIE5PX0RJU0NPTk5FQ1QganogdGFyZ2V0X2Rpc2Nvbm5lY3Q7IAorCQltdmkJVEFSR19JTU1FRElBVEVfU0NCLCBTQ0JfTElTVF9OVUxMOworCQljYWxsCWNvbXBsZXRlX3RhcmdldF9jbWQ7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQkJbW92CUFMTFpFUk9TCWNhbGwJZ2V0X2ZyZWVfb3JfZGlzY19zY2I7CisJCX0KKwkJY21wCVRBUkdfSU1NRURJQVRFX1NDQiwgU0NCX0xJU1RfTlVMTCBqZSAuOworCQltdmkJRE1BUEFSQU1TLCBIRE1BRU58RElSRUNUSU9OfEZJRk9SRVNFVDsKKwkJbW92CVRBUkdfSU1NRURJQVRFX1NDQiBjYWxsIGRtYV9zY2I7CisJCWNhbGwJc2V0X3RyYW5zZmVyX3NldHRpbmdzOworCQlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOOworCQlqbXAJdGFyZ2V0X3N5bmNjbWQ7CisKK3RhcmdldF9tZXNnb3V0OgorCQltdmkJU0NTSVNJR08sIFBfTUVTR09VVHxCU1lPOwordGFyZ2V0X21lc2dvdXRfY29udGludWU6CisJCWNhbGwJdGFyZ2V0X2luYjsKK3RhcmdldF9tZXNnb3V0X3BlbmRpbmc6CisJCWFuZAlTRVFfRkxBR1MyLCB+VEFSR0VUX01TR19QRU5ESU5HOworCQkvKiBMb2NhbCBQcm9jZXNzaW5nIGdvZXMgaGVyZS4uLiAqLworCQlqbXAJaG9zdF90YXJnZXRfbWVzc2FnZV9sb29wOworCQkKK3RhcmdldF9kaXNjb25uZWN0OgorCQltdmkJUF9NRVNHSU58QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRQlqeiAuICsgMjsKKwkJbXZpCU1TR19TQVZFREFUQVBPSU5URVIgY2FsbCB0YXJnZXRfb3V0YjsKKwkJbXZpCU1TR19ESVNDT05ORUNUIGNhbGwgdGFyZ2V0X291dGI7CisKK3RhcmdldF9idXNmcmVlX3dhaXQ6CisJCS8qIFdhaXQgZm9yIHByZWNlZGluZyBJL08gc2Vzc2lvbiB0byBjb21wbGV0ZS4gKi8KKwkJdGVzdAlTQ1NJU0lHSSwgQUNLSSBqbnogLjsKK3RhcmdldF9idXNmcmVlOgorCQlhbmQJU0lNT0RFMSwgfkVOQlVTRlJFRTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJY2xyCVNDU0lCVVNMOworCQl9CisJCWNscglTQ1NJU0lHTzsKKwkJbXZpCUxBU1RQSEFTRSwgUF9CVVNGUkVFOworCQljYWxsCWNvbXBsZXRlX3RhcmdldF9jbWQ7CisJCWptcAlwb2xsX2Zvcl93b3JrOworCit0YXJnZXRfY21kcGhhc2U6CisJCS8qCisJCSAqIFRoZSB0YXJnZXQgaGFzIGRyb3BwZWQgQVROIChkb2Vzbid0IHdhbnQgdG8gYWJvcnQgb3IgQkRSKQorCQkgKiBhbmQgd2UgYmVsaWV2ZSB0aGlzIHNlbGVjdGlvbiB0byBiZSB2YWxpZC4gIElmIHRoZSByaW5nCisJCSAqIGJ1ZmZlciBmb3IgbmV3IGNvbW1hbmRzIGlzIGZ1bGwsIHJldHVybiBidXN5IG9yIHF1ZXVlIGZ1bGwuCisJCSAqLworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfSFNfTUFJTEJPWCkgIT0gMCkgeworCQkJYW5kCUEsIEhPU1RfVFFJTlBPUywgSFNfTUFJTEJPWDsKKwkJfSBlbHNlIHsKKwkJCW1vdglBLCBLRVJORUxfVFFJTlBPUzsKKwkJfQorCQljbXAJVFFJTlBPUywgQSBqbmUgdHFpbmZpZm9faGFzX3NwYWNlOworCQltdmkJUF9TVEFUVVN8QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJdGVzdAlTRVFfRkxBR1MsIFRBUkdFVF9DTURfSVNfVEFHR0VEIGp6IC4gKyAzOworCQltdmkJU1RBVFVTX1FVRVVFX0ZVTEwgY2FsbCB0YXJnZXRfb3V0YjsKKwkJam1wCXRhcmdldF9idXNmcmVlX3dhaXQ7CisJCW12aQlTVEFUVVNfQlVTWSBjYWxsIHRhcmdldF9vdXRiOworCQlqbXAJdGFyZ2V0X2J1c2ZyZWVfd2FpdDsKK3RxaW5maWZvX2hhc19zcGFjZToJCisJCW12aQlQX0NPTU1BTkR8QlNZTyBjYWxsIGNoYW5nZV9waGFzZTsKKwkJY2FsbAl0YXJnZXRfaW5iOworCQltb3YJQSwgRElOREVYOworCQkvKiBTdG9yZSBmb3IgaG9zdCAqLworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCW1vdglDQ1NDQlJBTSwgQTsKKwkJfSBlbHNlIHsKKwkJCW1vdglERkRBVCwgQTsKKwkJfQorCisJCS8qCisJCSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKwkJICogYmFzZWQgb24gdGhlIGNvbW1hbmQgZ3JvdXAgY29kZSB2aWEgdGFibGUgbG9va3VwLgorCQkgKiBXZSByZXVzZSB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgVEFSR19TQ1NJUkFURQorCQkgKiBCSU9TIGFycmF5IGZvciB0aGlzIHRhYmxlLiBDb3VudCBpcyBvbmUgbGVzcyB0aGFuCisJCSAqIHRoZSB0b3RhbCBmb3IgdGhlIGNvbW1hbmQgc2luY2Ugd2UndmUgYWxyZWFkeSBmZXRjaGVkCisJCSAqIHRoZSBmaXJzdCBieXRlLgorCQkgKi8KKwkJc2hyCUEsIENNRF9HUk9VUF9DT0RFX1NISUZUOworCQlhZGQJU0lOREVYLCBDTURTSVpFX1RBQkxFLCBBOworCQltb3YJQSwgU0lORElSOworCisJCXRlc3QJQSwgMHhGRiBqeiBjb21tYW5kX3BoYXNlX2RvbmU7CisJCW9yCVNYRlJDVEwwLCBTUElPRU47Citjb21tYW5kX2xvb3A6CisJCXRlc3QJU1NUQVQwLCBTUElPUkRZIGp6IC47CisJCWNtcAlBLCAxIGpuZSAuICsgMjsKKwkJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOwkvKiBMYXN0IEJ5dGUgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQltb3YJQ0NTQ0JSQU0sIFNDU0lEQVRMOworCQl9IGVsc2UgeworCQkJbW92CURGREFULCBTQ1NJREFUTDsKKwkJfQorCQlkZWMJQTsKKwkJdGVzdAlBLCAweEZGIGpueiBjb21tYW5kX2xvb3A7CisKK2NvbW1hbmRfcGhhc2VfZG9uZToKKwkJYW5kCVNFUV9GTEFHUywgfkNNRFBIQVNFX1BFTkRJTkc7CisJCWptcAl0YXJnZXRfSVRsb29wOworCit0YXJnZXRfZHBoYXNlOgorCQkvKgorCQkgKiBEYXRhIHBoYXNlcyBvbiB0aGUgYnVzIGFyZSBmcm9tIHRoZQorCQkgKiBwZXJzcGVjdGl2ZSBvZiB0aGUgaW5pdGlhdG9yLiAgVGhlIGRtYQorCQkgKiBjb2RlIGxvb2tzIGF0IExBU1RQSEFTRSB0byBkZXRlcm1pbmUgdGhlCisJCSAqIGRhdGEgZGlyZWN0aW9uIG9mIHRoZSBETUEuICBUb2dnbGUgaXQgZm9yCisJCSAqIHRhcmdldCB0cmFuc2ZlcnMuCisJCSAqLworCQl4b3IJTEFTVFBIQVNFLCBJT0ksIFNDQl9UQVJHRVRfREFUQV9ESVI7CisJCW9yCVNDQl9UQVJHRVRfREFUQV9ESVIsIEJTWU8gY2FsbCBjaGFuZ2VfcGhhc2U7CisJCWptcAlwX2RhdGE7CisKK3RhcmdldF9zcGhhc2U6CisJCW12aQlQX1NUQVRVU3xCU1lPIGNhbGwgY2hhbmdlX3BoYXNlOworCQltdmkJTEFTVFBIQVNFLCBQX1NUQVRVUzsKKwkJbW92CVNDQl9TQ1NJX1NUQVRVUyBjYWxsIHRhcmdldF9vdXRiOworCQkvKiBYWFggV2F0Y2ggZm9yIEFUTiBvciBwYXJpdHkgZXJyb3JzPz8/ICovCisJCW12aQlTQ1NJU0lHTywgUF9NRVNHSU58QlNZTzsKKwkJLyogTVNHX0NNRENNUExUIGlzIDAsIGJ1dCB3ZSBjYW4ndCBkbyBhbiBpbW1lZGlhdGUgb2YgMCAqLworCQltb3YJQUxMWkVST1MgY2FsbCB0YXJnZXRfb3V0YjsKKwkJam1wCXRhcmdldF9idXNmcmVlX3dhaXQ7CisJCitjb21wbGV0ZV90YXJnZXRfY21kOgorCQl0ZXN0CVNFUV9GTEFHUywgVEFSR19DTURfUEVORElORwlqbnogLiArIDI7CisJCW1vdglTQ0JfVEFHIGptcCBjb21wbGV0ZV9wb3N0OworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCS8qIFNldCB0aGUgdmFsaWQgYnl0ZSAqLworCQkJbXZpCUNDU0NCQUREUiwgMjQ7CisJCQltb3YJQ0NTQ0JSQU0sIEFMTE9ORVM7CisJCQltdmkJQ0NIQ05ULCAyODsKKwkJCW9yCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQl0ZXN0CUNDU0NCQ1RMLCBDQ1NDQkRPTkUganogLjsKKwkJCWNscglDQ1NDQkNUTDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCB0aGUgdmFsaWQgYnl0ZSAqLworCQkJb3IJREZDTlRSTCwgRklGT1JFU0VUOworCQkJbXZpCURGV0FERFIsIDM7IC8qIFRoaXJkIDY0Yml0IHdvcmQgb3IgYnl0ZSAyNCAqLworCQkJbW92CURGREFULCBBTExPTkVTOworCQkJbXZpCTI4CWNhbGwgc2V0X2hjbnQ7CisJCQlvcglERkNOVFJMLCBIRE1BRU58RklGT0ZMVVNIOworCQkJY2FsbAlkbWFfZmluaXNoOworCQl9CisJCWluYwlUUUlOUE9TOworCQltdmkJSU5UU1RBVCxDTURDTVBMVCByZXQ7CisJfQorCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworaW5pdGlhdG9yX3NlbGVjdDoKKwlvcglTWEZSQ1RMMCwgU1BJT0VOfENMUlNUQ05UfENMUkNITjsKKwkvKgorCSAqIEFzIHNvb24gYXMgd2UgZ2V0IGEgc3VjY2Vzc2Z1bCBzZWxlY3Rpb24sIHRoZSB0YXJnZXQKKwkgKiBzaG91bGQgZ28gaW50byB0aGUgbWVzc2FnZSBvdXQgcGhhc2Ugc2luY2Ugd2UgaGF2ZSBBVE4KKwkgKiBhc3NlcnRlZC4KKwkgKi8KKwltdmkJTVNHX09VVCwgTVNHX0lERU5USUZZRkxBRzsKKwltdmkJU0VRX0ZMQUdTLCBOT19DREJfU0VOVDsKKwltdmkJQ0xSU0lOVDAsIENMUlNFTERPOworCisJLyoKKwkgKiBNYWluIGxvb3AgZm9yIGluZm9ybWF0aW9uIHRyYW5zZmVyIHBoYXNlcy4gIFdhaXQgZm9yIHRoZQorCSAqIHRhcmdldCB0byBhc3NlcnQgUkVRIGJlZm9yZSBjaGVja2luZyBNU0csIEMvRCBhbmQgSS9PIGZvcgorCSAqIHRoZSBidXMgcGhhc2UuCisJICovCittZXNnaW5fcGhhc2VtaXM6CitJVGxvb3A6CisJY2FsbAlwaGFzZV9sb2NrOworCisJbW92CUEsIExBU1RQSEFTRTsKKworCXRlc3QJQSwgflBfREFUQUlOCWp6IHBfZGF0YTsKKwljbXAJQSxQX0NPTU1BTkQJamUgcF9jb21tYW5kOworCWNtcAlBLFBfTUVTR09VVAlqZSBwX21lc2dvdXQ7CisJY21wCUEsUF9TVEFUVVMJamUgcF9zdGF0dXM7CisJY21wCUEsUF9NRVNHSU4JamUgcF9tZXNnaW47CisKKwltdmkJQkFEX1BIQVNFIGNhbGwgc2V0X3NlcWludDsKKwlqbXAJSVRsb29wOwkJCS8qIFRyeSByZWFkaW5nIHRoZSBidXMgYWdhaW4uICovCisKK2F3YWl0X2J1c2ZyZWU6CisJYW5kCVNJTU9ERTEsIH5FTkJVU0ZSRUU7CisJbW92CU5PTkUsIFNDU0lEQVRMOwkJLyogQWNrIHRoZSBsYXN0IGJ5dGUgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWNscglTQ1NJQlVTTDsJLyogUHJldmVudCBiaXQgbGVha2FnZSBkdXJpbnQgU0VMVE8gKi8KKwl9CisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCXRlc3QJU1NUQVQxLFJFUUlOSVR8QlVTRlJFRQlqeiAuOworCXRlc3QJU1NUQVQxLCBCVVNGUkVFIGpueiBwb2xsX2Zvcl93b3JrOworCW12aQlNSVNTRURfQlVTRlJFRSBjYWxsIHNldF9zZXFpbnQ7Cit9CisJCitjbGVhcl90YXJnZXRfc3RhdGU6CisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGRyaXZlciBtYXkgcmVzZXQgdXMKKwkgKiBhdCBhbnkgdGltZSwgZXZlbiBpbiB0aGUgbWlkZGxlIG9mIGEgRE1BLCBzbworCSAqIGNsZWFyIERGQ05UUkwgdG9vLgorCSAqLworCWNscglERkNOVFJMOworCW9yCVNYRlJDVEwwLCBDTFJTVENOVHxDTFJDSE47CisKKwkvKgorCSAqIFdlIGRvbid0IGtub3cgdGhlIHRhcmdldCB3ZSB3aWxsIGNvbm5lY3QgdG8sCisJICogc28gZGVmYXVsdCB0byBuYXJyb3cgdHJhbnNmZXJzIHRvIGF2b2lkCisJICogcGFyaXR5IHByb2JsZW1zLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYm1vdglTQ1NJUkFURSwgQUxMWkVST1MsIDI7CisJfSBlbHNlIHsKKwkJY2xyCVNDU0lSQVRFOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApIHsKKwkJCWFuZAlTWEZSQ1RMMCwgfihGQVNUMjApOworCQl9CisJfQorCW12aQlMQVNUUEhBU0UsIFBfQlVTRlJFRTsKKwkvKiBjbGVhciB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgKi8KKwltdmkJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVCByZXQ7CisKK3NnX2FkdmFuY2U6CisJY2xyCUE7CQkJLyogYWRkIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcikgKi8KKwlhZGQJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLFNHX1NJWkVPRjsKKwlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzFdLEE7CisJYWRjCVNDQl9SRVNJRFVBTF9TR1BUUlsyXSxBOworCWFkYwlTQ0JfUkVTSURVQUxfU0dQVFJbM10sQSByZXQ7CisKK2lmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworZGlzYWJsZV9jY3NnZW46CisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4ganogcmV0dXJuOworCXRlc3QJQ0NTR0NUTCwgQ0NTR0RPTkUganogLjsKK2Rpc2FibGVfY2NzZ2VuX2ZldGNoX2RvbmU6CisJY2xyCUNDU0dDVEw7CisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4gam56IC47CisJcmV0OworaWRsZV9sb29wOgorCS8qCisJICogRG8gd2UgbmVlZCBhbnkgbW9yZSBzZWdtZW50cyBmb3IgdGhpcyB0cmFuc2Zlcj8KKwkgKi8KKwl0ZXN0CVNDQl9SRVNJRFVBTF9EQVRBQ05UWzNdLCBTR19MQVNUX1NFRyBqbnogcmV0dXJuOworCisJLyogRGlkIHdlIGp1c3QgZmluaXNoIGZldGNoaW5nIHNlZ3M/ICovCisJY21wCUNDU0dDVEwsIENDU0dFTnxDQ1NHRE9ORSBqZSBpZGxlX3NnZmV0Y2hfY29tcGxldGU7CisKKwkvKiBBcmUgd2UgYWN0aXZlbHkgZmV0Y2hpbmcgc2VnbWVudHM/ICovCisJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4gam56IHJldHVybjsKKworCS8qCisJICogRG8gd2UgaGF2ZSBhbnkgcHJlZmV0Y2ggbGVmdD8/PworCSAqLworCWNtcAlDQ1NHQUREUiwgU0dfUFJFRkVUQ0hfQ05UIGpuZSBpZGxlX3NnX2F2YWlsOworCisJLyoKKwkgKiBOZWVkIHRvIGZldGNoIHNlZ21lbnRzLCBidXQgd2UgY2FuIG9ubHkgZG8gdGhhdAorCSAqIGlmIHRoZSBjb21tYW5kIGNoYW5uZWwgaXMgY29tcGxldGVseSBpZGxlLiAgTWFrZQorCSAqIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhbiBTQ0IgcHJlZmV0Y2ggZ29pbmcgb24uCisJICovCisJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JFTiBqbnogcmV0dXJuOworCisJLyoKKwkgKiBXZSBmZXRjaCBhICJjYWNoZWxpbmUgYWxpZ25lZCIgYW5kIHNpemVkIGFtb3VudCBvZiBkYXRhCisJICogc28gd2UgZG9uJ3QgZW5kIHVwIHJlZmVyZW5jaW5nIGEgbm9uLWV4aXN0YW50IHBhZ2UuCisJICogQ2FjaGVsaW5lIGFsaWduZWQgaXMgaW4gcXVvdGVzIGJlY2F1c2UgdGhlIGtlcm5lbCB3aWxsCisJICogc2V0IHRoZSBwcmVmZXRjaCBhbW91bnQgdG8gYSByZWFzb25hYmxlIGxldmVsIGlmIHRoZQorCSAqIGNhY2hlbGluZSBzaXplIGlzIHVua25vd24uCisJICovCisJbXZpCUNDSENOVCwgU0dfUFJFRkVUQ0hfQ05UOworCWFuZAlDQ0hBRERSWzBdLCBTR19QUkVGRVRDSF9BTElHTl9NQVNLLCBTQ0JfUkVTSURVQUxfU0dQVFI7CisJYm1vdglDQ0hBRERSWzFdLCBTQ0JfUkVTSURVQUxfU0dQVFJbMV0sIDM7CisJbXZpCUNDU0dDVEwsIENDU0dFTnxDQ1NHUkVTRVQgcmV0OworaWRsZV9zZ2ZldGNoX2NvbXBsZXRlOgorCWNhbGwJZGlzYWJsZV9jY3NnZW5fZmV0Y2hfZG9uZTsKKwlhbmQJQ0NTR0FERFIsIFNHX1BSRUZFVENIX0FERFJfTUFTSywgU0NCX1JFU0lEVUFMX1NHUFRSOworaWRsZV9zZ19hdmFpbDoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCS8qIERvZXMgdGhlIGhhcmR3YXJlIGhhdmUgc3BhY2UgZm9yIGFub3RoZXIgU0cgZW50cnk/ICovCisJCXRlc3QJREZTVEFUVVMsIFBSRUxPQURfQVZBSUwganogcmV0dXJuOworCQlibW92IAlIQUREUiwgQ0NTR1JBTSwgNzsKKwkJYm1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgQ0NTR1JBTSwgMTsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCW1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSBjYWxsIHNldF9oaGFkZHI7CisJCX0KKwkJY2FsbAlzZ19hZHZhbmNlOworCQltb3YJU0lOREVYLCBTQ0JfUkVTSURVQUxfU0dQVFJbMF07CisJCXRlc3QJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNHX0xBU1RfU0VHIGp6IC4gKyAyOworCQlvcglTSU5ERVgsIExBU1RfU0VHOworCQltb3YJU0dfQ0FDSEVfUFJFLCBTSU5ERVg7CisJCS8qIExvYWQgdGhlIHNlZ21lbnQgKi8KKwkJb3IJREZDTlRSTCwgUFJFTE9BREVOOworCX0KKwlyZXQ7Cit9CisKK2lmICgoYWhjLT5idWdzICYgQUhDX1BDSV9NV0lfQlVHKSAhPSAwICYmIGFoYy0+cGNpX2NhY2hlc2l6ZSAhPSAwKSB7CisvKgorICogQ2FsY3VsYXRlIHRoZSB0cmFpbGluZyBwb3J0aW9uIG9mIHRoaXMgUy9HIHNlZ21lbnQgdGhhdCBjYW5ub3QKKyAqIGJlIHRyYW5zZmVycmVkIHVzaW5nIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSBQQ0kgdHJhbnNhY3Rpb25zLiAgCisgKiBYWFggQ2FuIHdlIG9wdGltaXplIHRoaXMgZm9yIFBDSSB3cml0ZXMgb25seT8/PworICovCitjYWxjX213aV9yZXNpZHVhbDoKKwkvKgorCSAqIElmIHRoZSBlbmRpbmcgYWRkcmVzcyBpcyBvbiBhIGNhY2hlbGluZSBib3VuZGFyeSwKKwkgKiB0aGVyZSBpcyBubyBuZWVkIGZvciBhbiBleHRyYSBzZWdtZW50LgorCSAqLworCW1vdglBLCBIQ05UWzBdOworCWFkZAlBLCBBLCBIQUREUlswXTsKKwlhbmQJQSwgQ0FDSEVTSVpFX01BU0s7CisJdGVzdAlBLCAweEZGIGp6IHJldHVybjsKKworCS8qCisJICogSWYgdGhlIHRyYW5zZmVyIGlzIGxlc3MgdGhhbiBhIGNhY2hsaW5lLAorCSAqIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIGV4dHJhIHNlZ21lbnQuCisJICovCisJdGVzdAlIQ05UWzFdLCAweEZGCWpueiBjYWxjX213aV9yZXNpZHVhbF9maW5hbDsKKwl0ZXN0CUhDTlRbMl0sIDB4RkYJam56IGNhbGNfbXdpX3Jlc2lkdWFsX2ZpbmFsOworCWFkZAlOT05FLCBJTlZFUlRFRF9DQUNIRVNJWkVfTUFTSywgSENOVFswXTsKKwlqbmMJcmV0dXJuOworCitjYWxjX213aV9yZXNpZHVhbF9maW5hbDoKKwltb3YJTVdJX1JFU0lEVUFMLCBBOworCW5vdAlBOworCWluYwlBOworCWFkZAlIQ05UWzBdLCBBOworCWFkYwlIQ05UWzFdLCAtMTsKKwlhZGMJSENOVFsyXSwgLTEgcmV0OworfQorCitwX2RhdGE6CisJdGVzdAlTRVFfRkxBR1MsTk9UX0lERU5USUZJRUR8Tk9fQ0RCX1NFTlQganogcF9kYXRhX2FsbG93ZWQ7CisJbXZpCVBST1RPX1ZJT0xBVElPTiBjYWxsIHNldF9zZXFpbnQ7CitwX2RhdGFfYWxsb3dlZDoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW12aQlETUFQQVJBTVMsIFBSRUxPQURFTnxTQ1NJRU58SERNQUVOOworCX0gZWxzZSB7CisJCW12aQlETUFQQVJBTVMsIFdJREVPRER8U0NTSUVOfFNETUFFTnxIRE1BRU58RklGT1JFU0VUOworCX0KKwl0ZXN0CUxBU1RQSEFTRSwgSU9JIGpueiAuICsgMjsKKwlvcglETUFQQVJBTVMsIERJUkVDVElPTjsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgdmFsaWQgUy9HIGVsZW1lbnRzICovCisJCW12aQlDQ1NHQUREUiwgU0dfUFJFRkVUQ0hfQ05UOworCX0KKwl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFCWp6IGRhdGFfcGhhc2VfaW5pdGlhbGl6ZTsKKworCS8qCisJICogSWYgd2UgcmUtZW50ZXIgdGhlIGRhdGEgcGhhc2UgYWZ0ZXIgZ29pbmcgdGhyb3VnaCBhbm90aGVyCisJICogcGhhc2UsIG91ciB0cmFuc2ZlciBsb2NhdGlvbiBoYXMgYWxtb3N0IGNlcnRhaW5seSBiZWVuCisJICogY29ycnVwdGVkIGJ5IHRoZSBpbnRlcnZlaW5pbmcsIG5vbi1kYXRhLCB0cmFuc2ZlcnMuICBBc2sKKwkgKiB0aGUgaG9zdCBkcml2ZXIgdG8gZml4IHVzIHVwIGJhc2VkIG9uIHRoZSB0cmFuc2ZlciByZXNpZHVhbC4KKwkgKi8KKwltdmkJUERBVEFfUkVJTklUCWNhbGwgc2V0X3NlcWludDsKKwlqbXAJZGF0YV9waGFzZV9sb29wOworCitkYXRhX3BoYXNlX2luaXRpYWxpemU6CisJLyogV2UgaGF2ZSBzZWVuIGEgZGF0YSBwaGFzZSBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKwlvcglTRVFfRkxBR1MsIERQSEFTRTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgRE1BIGFkZHJlc3MgYW5kIGNvdW50ZXIgZnJvbSB0aGUgU0NCLgorCSAqIEFsc28gc2V0IFNDQl9SRVNJRFVBTF9TR1BUUiwgaW5jbHVkaW5nIHRoZSBMQVNUX1NFRworCSAqIGZsYWcgaW4gdGhlIGhpZ2hlc3QgYnl0ZSBvZiB0aGUgZGF0YSBjb3VudC4gIFdlIGNhbm5vdAorCSAqIG1vZGlmeSB0aGUgc2F2ZWQgdmFsdWVzIGluIHRoZSBTQ0IgdW50aWwgd2Ugc2VlIGEgc2F2ZQorCSAqIGRhdGEgcG9pbnRlcnMgbWVzc2FnZS4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkvKiBUaGUgbG93ZXN0IGFkZHJlc3MgYnl0ZSBtdXN0IGJlIGxvYWRlZCBsYXN0LiAqLworCQltb3YJU0NCX0RBVEFDTlRbM10gY2FsbCBzZXRfaGhhZGRyOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJYm1vdglIQUREUiwgU0NCX0RBVEFQVFIsIDc7CisJCWJtb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNDQl9EQVRBQ05UWzNdLCA1OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0NCX0RBVEFQVFIJY2FsbCBiY29weV83OworCQltdmkJRElOREVYLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDM7CisJCW12aQlTQ0JfREFUQUNOVCArIDMgY2FsbCBiY29weV81OworCX0KKwlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMCAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCkgeworCQljYWxsCWNhbGNfbXdpX3Jlc2lkdWFsOworCX0KKwlhbmQJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCB+U0dfRlVMTF9SRVNJRDsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQlibW92CVNUQ05ULCBIQ05ULCAzOworCQl9IGVsc2UgeworCQkJY2FsbAlzZXRfc3RjbnRfZnJvbV9oY250OworCQl9CisJfQorCitkYXRhX3BoYXNlX2xvb3A6CisJLyogR3VhcmQgYWdhaW5zdCBvdmVycnVucyAqLworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEwganogZGF0YV9waGFzZV9pbmJvdW5kczsKKworCS8qCisJICogVHVybiBvbiBgQml0IEJ1Y2tldCcgbW9kZSwgd2FpdCB1bnRpbCB0aGUgdGFyZ2V0IHRha2VzCisJICogdXMgdG8gYW5vdGhlciBwaGFzZSwgYW5kIHRoZW4gbm90aWZ5IHRoZSBob3N0LgorCSAqLworCWFuZAlETUFQQVJBTVMsIERJUkVDVElPTjsKKwltb3YJREZDTlRSTCwgRE1BUEFSQU1TOworCW9yCVNYRlJDVEwxLEJJVEJVQ0tFVDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJdGVzdAlTU1RBVDEsUEhBU0VNSVMJanogLjsKKwl9IGVsc2UgeworCQl0ZXN0CVNDU0lQSEFTRSwgREFUQV9QSEFTRV9NQVNLIGpueiAuOworCX0KKwlhbmQJU1hGUkNUTDEsIH5CSVRCVUNLRVQ7CisJbXZpCURBVEFfT1ZFUlJVTiBjYWxsIHNldF9zZXFpbnQ7CisJam1wCUlUbG9vcDsKKworZGF0YV9waGFzZV9pbmJvdW5kczoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW1vdglTSU5ERVgsIFNDQl9SRVNJRFVBTF9TR1BUUlswXTsKKwkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogLiArIDI7CisJCW9yCVNJTkRFWCwgTEFTVF9TRUc7CisJCW1vdglTR19DQUNIRV9QUkUsIFNJTkRFWDsKKwkJbW92CURGQ05UUkwsIERNQVBBUkFNUzsKK3VsdHJhMl9kbWFfbG9vcDoKKwkJY2FsbAlpZGxlX2xvb3A7CisJCS8qCisJCSAqIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBpZiBlaXRoZXIgdGhlIGxhc3Qgc2VnbWVudAorCQkgKiBjb21wbGV0ZXMgb3IgdGhlIHRhcmdldCBjaGFuZ2VzIHBoYXNlLgorCQkgKi8KKwkJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHX0RPTkUgam56IHVsdHJhMl9kbWFmaW5pc2g7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJCQkgLyoKKwkJCQkgICogQXMgYSB0YXJnZXQsIHdlIGNvbnRyb2wgdGhlIHBoYXNlcywKKwkJCQkgICogc28gaWdub3JlIFBIQVNFTUlTLgorCQkJCSAgKi8KKwkJCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGpueiB1bHRyYTJfZG1hX2xvb3A7CisJCQl9CisJCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworCQkJCXRlc3QJU1NUQVQxLFBIQVNFTUlTCWp6IHVsdHJhMl9kbWFfbG9vcDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRlc3QJREZDTlRSTCwgU0NTSUVOIGpueiB1bHRyYTJfZG1hX2xvb3A7CisJCX0KKwordWx0cmEyX2RtYWZpbmlzaDoKKwkJLyoKKwkJICogVGhlIHRyYW5zZmVyIGhhcyB0ZXJtaW5hdGVkIGVpdGhlciBkdWUgdG8gYSBwaGFzZQorCQkgKiBjaGFuZ2UsIGFuZC9vciB0aGUgY29tcGxldGlvbiBvZiB0aGUgbGFzdCBzZWdtZW50LgorCQkgKiBXZSBoYXZlIHR3byBnb2FscyBoZXJlLiAgRG8gYXMgbXVjaCBvdGhlciB3b3JrCisJCSAqIGFzIHBvc3NpYmxlIHdoaWxlIHRoZSBkYXRhIGZpZm8gZHJhaW5zIG9uIGEgcmVhZAorCQkgKiBhbmQgcmVzcG9uZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHRvIHRoZSBzdGFuZGFyZAorCQkgKiBtZXNzYWdlcyAoc2F2ZSBkYXRhIHBvaW50ZXJzL2Rpc2Nvbm5lY3QgYW5kIGNvbW1hbmQKKwkJICogY29tcGxldGUpIHRoYXQgdXN1YWxseSBmb2xsb3cgYSBkYXRhIHBoYXNlLgorCQkgKi8KKwkJaWYgKChhaGMtPmJ1Z3MgJiBBSENfQVVUT0ZMVVNIX0JVRykgIT0gMCkgeworCQkJLyoKKwkJCSAqIE9uIGNoaXBzIHdpdGggYnJva2VuIGF1dG8tZmx1c2gsIHN0YXJ0CisJCQkgKiB0aGUgZmx1c2hpbmcgcHJvY2VzcyBub3cuICBXZSdsbCBwb2tlCisJCQkgKiB0aGUgY2hpcCBmcm9tIHRpbWUgdG8gdGltZSB0byBrZWVwIHRoZQorCQkJICogZmx1c2ggcHJvY2VzcyBnb2luZyBhcyB3ZSBjb21wbGV0ZSB0aGUKKwkJCSAqIGRhdGEgcGhhc2UuCisJCQkgKi8KKwkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJfQorCQkvKgorCQkgKiBXZSBhc3N1bWUgdGhhdCwgZXZlbiB0aG91Z2ggZGF0YSBtYXkgc3RpbGwgYmUKKwkJICogdHJhbnNmZXJyaW5nIHRvIHRoZSBob3N0LCB0aGF0IHRoZSBTQ1NJIHNpZGUgb2YKKwkJICogdGhlIERNQSBlbmdpbmUgaXMgbm93IGluIGEgc3RhdGljIHN0YXRlLiAgVGhpcworCQkgKiBhbGxvd3MgdXMgdG8gdXBkYXRlIG91ciBub3Rpb24gb2Ygd2hlcmUgd2UgYXJlCisJCSAqIGluIHRoaXMgdHJhbnNmZXIuCisJCSAqCisJCSAqIElmLCBieSBjaGFuY2UsIHdlIHN0b3BwZWQgYmVmb3JlIGJlaW5nIGFibGUKKwkJICogdG8gZmV0Y2ggYWRkaXRpb25hbCBzZWdtZW50cyBmb3IgdGhpcyB0cmFuc2ZlciwKKwkJICogeWV0IHRoZSBsYXN0IFMvRyB3YXMgY29tcGxldGVseSBleGhhdXN0ZWQsCisJCSAqIGNhbGwgb3VyIGlkbGUgbG9vcCB1bnRpbCBpdCBpcyBhYmxlIHRvIGxvYWQKKwkJICogYW5vdGhlciBzZWdtZW50LiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGltbWVkaWF0ZWx5CisJCSAqIHBpY2t1cCBvbiB0aGUgbmV4dCBzZWdtZW50IG9uIHRoZSBuZXh0IGRhdGEgcGhhc2UuCisJCSAqCisJCSAqIElmIHdlIGhhcHBlbmVkIHRvIHN0b3Agb24gdGhlIGxhc3Qgc2VnbWVudCwgdGhlbgorCQkgKiBvdXIgcmVzaWR1YWwgaW5mb3JtYXRpb24gaXMgc3RpbGwgY29ycmVjdCBmcm9tCisJCSAqIHRoZSBpZGxlIGxvb3AgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybQorCQkgKiBhbnkgZml4dXBzLgorCQkgKi8KK3VsdHJhMl9lbnN1cmVfc2c6CisJCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFRyBqeiB1bHRyYTJfc2h2YWxpZDsKKwkJLyogUmVjb3JkIGlmIHdlJ3ZlIGNvbnN1bWVkIGFsbCBTL0cgZW50cmllcyAqLworCQl0ZXN0CVNTVEFUMiwgU0hWQUxJRAlqbnogcmVzaWR1YWxzX2NvcnJlY3Q7CisJCW9yCVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfTElTVF9OVUxMOworCQlqbXAJcmVzaWR1YWxzX2NvcnJlY3Q7CisKK3VsdHJhMl9zaHZhbGlkOgorCQl0ZXN0CVNTVEFUMiwgU0hWQUxJRAlqbnogc2dwdHJfZml4dXA7CisJCWNhbGwJaWRsZV9sb29wOworCQlqbXAJdWx0cmEyX2Vuc3VyZV9zZzsKKworc2dwdHJfZml4dXA6CisJCS8qCisJCSAqIEZpeHVwIHRoZSByZXNpZHVhbCBuZXh0IFMvRyBwb2ludGVyLiAgVGhlIFMvRyBwcmVsb2FkCisJCSAqIGZlYXR1cmUgb2YgdGhlIGNoaXAgYWxsb3dzIHVzIHRvIGxvYWQgdHdvIGVsZW1lbnRzCisJCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnQuICBXZQorCQkgKiBzdG9yZSB0aGUgYm90dG9tIGJ5dGUgb2YgdGhlIG5leHQgUy9HIHBvaW50ZXIgaW4KKwkJICogdGhlIFNHX0NBQ0VQVFIgcmVnaXN0ZXIgc28gd2UgY2FuIHJlc3RvcmUgdGhlCisJCSAqIGNvcnJlY3QgdmFsdWUgd2hlbiB0aGUgRE1BIGNvbXBsZXRlcy4gIElmIHRoZSBuZXh0CisJCSAqIHNnIHB0ciB2YWx1ZSBoYXMgYWR2YW5jZWQgdG8gdGhlIHBvaW50IHdoZXJlIGhpZ2hlcgorCQkgKiBieXRlcyBpbiB0aGUgYWRkcmVzcyBoYXZlIGJlZW4gYWZmZWN0ZWQsIGZpeCB0aGVtCisJCSAqIHRvby4KKwkJICovCisJCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCAweDgwIGp6IHNncHRyX2ZpeHVwX2RvbmU7CisJCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCAweDgwIGpueiBzZ3B0cl9maXh1cF9kb25lOworCQlhZGQJU0NCX1JFU0lEVUFMX1NHUFRSWzFdLCAtMTsKKwkJYWRjCVNDQl9SRVNJRFVBTF9TR1BUUlsyXSwgLTE7IAorCQlhZGMJU0NCX1JFU0lEVUFMX1NHUFRSWzNdLCAtMTsKK3NncHRyX2ZpeHVwX2RvbmU6CisJCWFuZAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0FERFJfTUFTSywgU0dfQ0FDSEVfU0hBRE9XOworCQkvKiBXZSBhcmUgbm90IHRoZSBsYXN0IHNlZyAqLworCQlhbmQJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIH5TR19MQVNUX1NFRzsKK3Jlc2lkdWFsc19jb3JyZWN0OgorCQkvKgorCQkgKiBHbyBhaGVhZCBhbmQgc2h1dCBkb3duIHRoZSBETUEgZW5naW5lIG5vdy4KKwkJICogSW4gdGhlIGZ1dHVyZSwgd2UnbGwgd2FudCB0byBoYW5kbGUgZW5kIG9mCisJCSAqIHRyYW5zZmVyIG1lc3NhZ2VzIHByaW9yIHRvIGRvaW5nIHRoaXMsIGJ1dCB0aGlzCisJCSAqIHJlcXVpcmVzIHNpbWlsYXIgcmVzdHJ1Y3R1cmluZyBmb3IgcHJlLVVMVFJBMgorCQkgKiBjb250cm9sbGVycy4KKwkJICovCisJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04gam56IHVsdHJhMl9maWZvZW1wdHk7Cit1bHRyYTJfZmlmb2ZsdXNoOgorCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJCWlmICgoYWhjLT5idWdzICYgQUhDX0FVVE9GTFVTSF9CVUcpICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIE9uIFJldiBBIG9mIHRoZSBhaWM3ODkwLCB0aGUgYXV0b2ZsdXNoCisJCQkJICogZmVhdHVyZSBkb2Vzbid0IGZ1bmN0aW9uIGNvcnJlY3RseS4KKwkJCQkgKiBQZXJmb3JtIGFuIGV4cGxpY2l0IG1hbnVhbCBmbHVzaC4gIER1cmluZworCQkJCSAqIGEgbWFudWFsIGZsdXNoLCB0aGUgRklGT0VNUCBiaXQgYmVjb21lcworCQkJCSAqIHRydWUgZXZlcnkgdGltZSB0aGUgUENJIEZJRk8gZW1wdGllcworCQkJCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBTQ1NJIEZJRk8uCisJCQkJICogSXQgY2FuIHRha2UgdXAgdG8gNCBjbG9jayBjeWNsZXMgZm9yIHRoZQorCQkJCSAqIFNDU0kgRklGTyB0byBnZXQgZGF0YSBpbnRvIHRoZSBQQ0kgRklGTworCQkJCSAqIGFuZCBmb3IgRklGT0VNUCB0byBkZS1hc3NlcnQuICBIZXJlIHdlCisJCQkJICogZ3VhcmQgYWdhaW5zdCB0aGlzIGNvbmRpdGlvbiBieSBtYWtpbmcKKwkJCQkgKiBzdXJlIHRoZSBGSUZPRU1QIGJpdCBzdGF5cyBvbiBmb3IgNSBmdWxsCisJCQkJICogY2xvY2sgY3ljbGVzLgorCQkJCSAqLworCQkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9maWZvZmx1c2g7CisJCQkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqeiB1bHRyYTJfZmlmb2ZsdXNoOworCQkJCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogdWx0cmEyX2ZpZm9mbHVzaDsKKwkJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9maWZvZmx1c2g7CisJCQl9CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9maWZvZmx1c2g7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZW5hYmxlIHRoZSBhdXRvLWFjayBmZWF0dXJlIG9uIERUIGNhcGFibGUKKwkJCSAqIGNvbnRyb2xsZXJzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBjb250cm9sbGVyIG1heQorCQkJICogaGF2ZSBhbHJlYWR5IHRyYW5zZmVycmVkIHNvbWUgb3ZlcnJ1biBieXRlcyBpbnRvCisJCQkgKiB0aGUgZGF0YSBGSUZPIGFuZCBhY2tlZCB0aGVtIG9uIHRoZSBidXMuICBUaGUgb25seQorCQkJICogd2F5IHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbiBpcyB0byB3YWl0IGZvcgorCQkJICogTEFTVF9TRUdfRE9ORSB0byBjb21lIHRydWUgb24gYSBjb21wbGV0ZWQgdHJhbnNmZXIKKwkJCSAqIGFuZCB0aGVuIHRlc3QgdG8gc2VlIGlmIHRoZSBkYXRhIEZJRk8gaXMgbm9uLWVtcHR5LgorCQkJICovCisJCQl0ZXN0CVNDQl9SRVNJRFVBTF9TR1BUUlswXSwgU0dfTElTVF9OVUxMCisJCQkJanogdWx0cmEyX3dhaXRfZmlmb2VtcDsKKwkJCXRlc3QJU0dfQ0FDSEVfU0hBRE9XLCBMQVNUX1NFR19ET05FIGp6IC47CisJCQkvKgorCQkJICogRklGT0VNUCBjYW4gbGFnIExBU1RfU0VHX0RPTkUuICBXYWl0IGEgZmV3CisJCQkgKiBjbG9ja3MgYmVmb3JlIGNhbGxpbmcgdGhpcyBhbiBvdmVycnVuLgorCQkJICovCisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGpueiB1bHRyYTJfZmlmb2VtcHR5OworCQkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqbnogdWx0cmEyX2ZpZm9lbXB0eTsKKwkJCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAgam56IHVsdHJhMl9maWZvZW1wdHk7CisJCQkvKiBPdmVycnVuICovCisJCQlqbXAJZGF0YV9waGFzZV9sb29wOwordWx0cmEyX3dhaXRfZmlmb2VtcDoKKwkJCXRlc3QJREZTVEFUVVMsIEZJRk9FTVAganogLjsKKwkJfQordWx0cmEyX2ZpZm9lbXB0eToKKwkJLyogRG9uJ3QgY2xvYmJlciBhbiBpbnByb2dyZXNzIGhvc3QgZGF0YSB0cmFuc2ZlciAqLworCQl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogdWx0cmEyX2ZpZm9lbXB0eTsKK3VsdHJhMl9kbWFoYWx0OgorCQlhbmQgICAgIERGQ05UUkwsIH4oU0NTSUVOfEhETUFFTik7CisJCXRlc3QJREZDTlRSTCwgU0NTSUVOfEhETUFFTiBqbnogLjsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCS8qCisJCQkgKiBLZWVwIEhIQUREUiBjbGVhcmVkIGZvciBmdXR1cmUsIDMyYml0IGFkZHJlc3NlZAorCQkJICogb25seSwgRE1BIG9wZXJhdGlvbnMuCisJCQkgKgorCQkJICogRHVlIHRvIGJheW9uZXR0ZSBzdHlsZSBTL0cgaGFuZGxpbmcsIG91ciByZXNpZHVhbAorCQkJICogZGF0YSBtdXN0IGJlICJmaXhlZCB1cCIgb25jZSB0aGUgdHJhbnNmZXIgaXMgaGFsdGVkLgorCQkJICogSGVyZSB3ZSBmaXh1cCB0aGUgSFNIQUREUiBzdG9yZWQgaW4gdGhlIGhpZ2ggYnl0ZQorCQkJICogb2YgdGhlIHJlc2lkdWFsIGRhdGEgY250LiAgQnkgcG9zdHBvbmluZyB0aGUgZml4dXAsCisJCQkgKiB3ZSBjYW4gYmF0Y2ggdGhlIGNsZWFyaW5nIG9mIEhBRERSIHdpdGggdGhlIGZpeHVwLgorCQkJICogSWYgd2UgaGFsdGVkIG9uIHRoZSBsYXN0IHNlZ21lbnQsIHRoZSByZXNpZHVhbCBpcworCQkJICogYWxyZWFkeSBjb3JyZWN0LiAgIElmIHdlIGFyZSBub3Qgb24gdGhlIGxhc3QKKwkJCSAqIHNlZ21lbnQsIGNvcHkgdGhlIGhpZ2ggYWRkcmVzcyBkaXJlY3RseSBmcm9tIEhTSEFERFIuCisJCQkgKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IG1haW50YWluaW5nIHRoZQorCQkJICogU0dfTEFTVF9TRUcgZmxhZyBhcyBpdCB3aWxsIGFsd2F5cyBiZSBmYWxzZSBpbiB0aGUKKwkJCSAqIGNhc2Ugd2hlcmUgYW4gdXBkYXRlIGlzIHJlcXVpcmVkLgorCQkJICovCisJCQlvcglEU0NPTU1BTkQxLCBIQURETERTRUwwOworCQkJdGVzdAlTR19DQUNIRV9TSEFET1csIExBU1RfU0VHIGpueiAuICsgMjsKKwkJCW1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0hBRERSOworCQkJY2xyCUhBRERSOworCQkJYW5kCURTQ09NTUFORDEsIH5IQURETERTRUwwOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgYXJlIHRoZSBsYXN0IFNHIGJsb2NrLCB0ZWxsIHRoZSBoYXJkd2FyZS4gKi8KKwkJaWYgKChhaGMtPmJ1Z3MgJiBBSENfUENJX01XSV9CVUcpICE9IDAKKwkJICAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCkgeworCQkJdGVzdAlNV0lfUkVTSURVQUwsIDB4RkYgam56IGRtYV9taWRfc2c7CisJCX0KKwkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogZG1hX21pZF9zZzsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJCXRlc3QJU1NUQVQwLCBUQVJHRVQganogZG1hX2xhc3Rfc2c7CisJCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVE1PREVfV0lERU9ERF9CVUcpICE9IDApIHsKKwkJCQl0ZXN0CURNQVBBUkFNUywgRElSRUNUSU9OIGp6IGRtYV9taWRfc2c7CisJCQl9CisJCX0KK2RtYV9sYXN0X3NnOgorCQlhbmQJRE1BUEFSQU1TLCB+V0lERU9ERDsKK2RtYV9taWRfc2c6CisJCS8qIFN0YXJ0IERNQSBkYXRhIHRyYW5zZmVyLiAqLworCQltb3YJREZDTlRSTCwgRE1BUEFSQU1TOworZG1hX2xvb3A6CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJY2FsbAlpZGxlX2xvb3A7CisJCX0KKwkJdGVzdAlTU1RBVDAsRE1BRE9ORQlqbnogZG1hX2RtYWRvbmU7CisJCXRlc3QJU1NUQVQxLFBIQVNFTUlTCWp6IGRtYV9sb29wOwkvKiBpZS4gdW5kZXJydW4gKi8KK2RtYV9waGFzZW1pczoKKwkJLyoKKwkJICogV2Ugd2lsbCBiZSAiZG9uZSIgRE1BaW5nIHdoZW4gdGhlIHRyYW5zZmVyIGNvdW50IGdvZXMgdG8KKwkJICogemVybywgb3IgdGhlIHRhcmdldCBjaGFuZ2VzIHRoZSBwaGFzZSAoaW4gbGlnaHQgb2YgdGhpcywKKwkJICogaXQgbWFrZXMgc2Vuc2UgdGhhdCB0aGUgRE1BIGNpcmN1aXRyeSBkb2Vzbid0IEFDSyB3aGVuCisJCSAqIFBIQVNFTUlTIGlzIGFjdGl2ZSkuICBJZiB3ZSBhcmUgZG9pbmcgYSBTQ1NJLT5Ib3N0IHRyYW5zZmVyLAorCQkgKiB0aGUgZGF0YSBGSUZPIHNob3VsZCBiZSBmbHVzaGVkIGF1dG8tbWFnaWNhbGx5IG9uIFNUQ05UPTAKKwkJICogb3IgYSBwaGFzZSBjaGFuZ2UsIHNvIGp1c3Qgd2FpdCBmb3IgRklGTyBlbXB0eSBzdGF0dXMuCisJCSAqLworZG1hX2NoZWNrZmlmbzoKKwkJdGVzdAlERkNOVFJMLERJUkVDVElPTglqbnogZG1hX2ZpZm9lbXB0eTsKK2RtYV9maWZvZmx1c2g6CisJCXRlc3QJREZTVEFUVVMsRklGT0VNUAlqeiBkbWFfZmlmb2ZsdXNoOworZG1hX2ZpZm9lbXB0eToKKwkJLyogRG9uJ3QgY2xvYmJlciBhbiBpbnByb2dyZXNzIGhvc3QgZGF0YSB0cmFuc2ZlciAqLworCQl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogZG1hX2ZpZm9lbXB0eTsKKworCQkvKgorCQkgKiBOb3cgc2h1dCBvZmYgdGhlIERNQSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIERNQQorCQkgKiBoYXJkd2FyZSBoYXMgYWN0dWFsbHkgc3RvcHBlZC4gIFRvdWNoaW5nIHRoZSBETUEKKwkJICogY291bnRlcnMsIGV0Yy4gd2hpbGUgYSBETUEgaXMgYWN0aXZlIHdpbGwgcmVzdWx0CisJCSAqIGluIGFuIElMTFNBRERSIGV4Y2VwdGlvbi4KKwkJICovCitkbWFfZG1hZG9uZToKKwkJYW5kCURGQ05UUkwsIH4oU0NTSUVOfFNETUFFTnxIRE1BRU4pOworZG1hX2hhbHQ6CisJCS8qCisJCSAqIFNvbWUgcmV2aXNpb25zIG9mIHRoZSBhaWM3OFhYIGhhdmUgYSBwcm9ibGVtIHdoZXJlLCBpZiB0aGUKKwkJICogZGF0YSBmaWZvIGlzIGZ1bGwsIGJ1dCB0aGUgUENJIGlucHV0IGxhdGNoIGlzIG5vdCBlbXB0eSwgCisJCSAqIEhETUFFTiBjYW5ub3QgYmUgY2xlYXJlZC4gIFRoZSBmaXggdXNlZCBoZXJlIGlzIHRvIGRyYWluCisJCSAqIHRoZSBwcmVmZXRjaGVkIGJ1dCB1bnVzZWQgZGF0YSBmcm9tIHRoZSBkYXRhIGZpZm8gdW50aWwKKwkJICogdGhlcmUgaXMgc3BhY2UgZm9yIHRoZSBpbnB1dCBsYXRjaCB0byBkcmFpbi4KKwkJICovCisJCWlmICgoYWhjLT5idWdzICYgQUhDX1BDSV8yXzFfUkVUUllfQlVHKSAhPSAwKSB7CisJCQltb3YJTk9ORSwgREZEQVQ7CisJCX0KKwkJdGVzdAlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxIRE1BRU4pIGpueiBkbWFfaGFsdDsKKworCQkvKiBTZWUgaWYgd2UgaGF2ZSBjb21wbGV0ZWQgdGhpcyBsYXN0IHNlZ21lbnQgKi8KKwkJdGVzdAlTVENOVFswXSwgMHhmZglqbnogZGF0YV9waGFzZV9maW5pc2g7CisJCXRlc3QJU1RDTlRbMV0sIDB4ZmYJam56IGRhdGFfcGhhc2VfZmluaXNoOworCQl0ZXN0CVNUQ05UWzJdLCAweGZmCWpueiBkYXRhX3BoYXNlX2ZpbmlzaDsKKworCQkvKgorCQkgKiBBZHZhbmNlIHRoZSBzY2F0dGVyLWdhdGhlciBwb2ludGVycyBpZiBuZWVkZWQgCisJCSAqLworCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMAorCQkgICYmIGFoYy0+cGNpX2NhY2hlc2l6ZSAhPSAwKSB7CisJCQl0ZXN0CU1XSV9SRVNJRFVBTCwgMHhGRiBqeiBub19td2lfcmVzaWQ7CisJCQkvKgorCQkJICogUmVsb2FkIEhBRERSIGZyb20gU0hBRERSIGFuZCBzZXR1cCB0aGUKKwkJCSAqIGNvdW50IHRvIGJlIHRoZSBzaXplIG9mIG91ciByZXNpZHVhbC4KKwkJCSAqLworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQkJYm1vdglIQUREUiwgU0hBRERSLCA0OworCQkJCW1vdglIQ05ULCBNV0lfUkVTSURVQUw7CisJCQkJYm1vdglIQ05UWzFdLCBBTExaRVJPUywgMjsKKwkJCX0gZWxzZSB7CisJCQkJbXZpCURJTkRFWCwgSEFERFI7CisJCQkJbXZpCVNIQUREUiBjYWxsIGJjb3B5XzQ7CisJCQkJbW92CU1XSV9SRVNJRFVBTCBjYWxsIHNldF9oY250OworCQkJfQorCQkJY2xyCU1XSV9SRVNJRFVBTDsKKwkJCWptcAlzZ19sb2FkX2RvbmU7Citub19td2lfcmVzaWQ6CisJCX0KKwkJdGVzdAlTQ0JfUkVTSURVQUxfREFUQUNOVFszXSwgU0dfTEFTVF9TRUcganogc2dfbG9hZDsKKwkJb3IJU0NCX1JFU0lEVUFMX1NHUFRSWzBdLCBTR19MSVNUX05VTEw7CisJCWptcAlkYXRhX3BoYXNlX2ZpbmlzaDsKK3NnX2xvYWQ6CisJCS8qCisJCSAqIExvYWQgdGhlIG5leHQgU0cgZWxlbWVudCdzIGRhdGEgYWRkcmVzcyBhbmQgbGVuZ3RoCisJCSAqIGludG8gdGhlIERNQSBlbmdpbmUuICBJZiB3ZSBkb24ndCBoYXZlIGhhcmR3YXJlCisJCSAqIHRvIHBlcmZvcm0gYSBwcmVmZXRjaCwgd2UnbGwgaGF2ZSB0byBmZXRjaCB0aGUKKwkJICogc2VnbWVudCBmcm9tIGhvc3QgbWVtb3J5IGZpcnN0LgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQkvKiBXYWl0IGZvciB0aGUgaWRsZSBsb29wIHRvIGNvbXBsZXRlICovCisJCQl0ZXN0CUNDU0dDVEwsIENDU0dFTiBqeiAuICsgMzsKKwkJCWNhbGwJaWRsZV9sb29wOworCQkJdGVzdAlDQ1NHQ1RMLCBDQ1NHRU4gam56IC4gLSAxOworCQkJYm1vdiAJSEFERFIsIENDU0dSQU0sIDc7CisJCQkvKgorCQkJICogV29ya2Fyb3VuZCBmb3IgZmxha3kgZXh0ZXJuYWwgU0NCIFJBTQorCQkJICogb24gY2VydGFpbiBhaWM3ODk1IHNldHVwcy4gIEl0IHNlZW1zCisJCQkgKiB1bmFibGUgdG8gaGFuZGxlIGRpcmVjdCB0cmFuc2ZlcnMgZnJvbQorCQkJICogUy9HIHJhbSB0byBjZXJ0YWluIFNDQiBsb2NhdGlvbnMuCisJCQkgKi8KKwkJCW1vdglTSU5ERVgsIENDU0dSQU07CisJCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIFNJTkRFWDsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYWhjLT5mbGFncyAmIEFIQ18zOUJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCQkJbW92CUFMTFpFUk9TIGNhbGwgc2V0X2hoYWRkcjsKKwkJCX0KKwkJCW12aQlESU5ERVgsIEhBRERSOworCQkJbXZpCVNDQl9SRVNJRFVBTF9TR1BUUgljYWxsIGJjb3B5XzQ7CisKKwkJCW12aQlTR19TSVpFT0YJY2FsbCBzZXRfaGNudDsKKworCQkJb3IJREZDTlRSTCwgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisKKwkJCWNhbGwJZG1hX2ZpbmlzaDsKKworCQkJbXZpCURJTkRFWCwgSEFERFI7CisJCQljYWxsCWRmZGF0X2luXzc7CisJCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbM10sIERGREFUOworCQl9CisKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCW1vdglTQ0JfUkVTSURVQUxfREFUQUNOVFszXSBjYWxsIHNldF9oaGFkZHI7CisKKwkJCS8qCisJCQkgKiBUaGUgbG93ZXN0IGFkZHJlc3MgYnl0ZSBtdXN0IGJlIGxvYWRlZAorCQkJICogbGFzdCBhcyBpdCB0cmlnZ2VycyB0aGUgY29tcHV0YXRpb24gb2YKKwkJCSAqIHNvbWUgaXRlbXMgaW4gdGhlIFBDSSBibG9jay4gIFRoZSBVTFRSQTIKKwkJCSAqIGNoaXBzIGRvIHRoaXMgb24gUFJFTE9BRC4KKwkJCSAqLworCQkJbW92CUhBRERSLCBIQUREUjsKKwkJfQorCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMAorCQkgICYmIGFoYy0+cGNpX2NhY2hlc2l6ZSAhPSAwKSB7CisJCQljYWxsIGNhbGNfbXdpX3Jlc2lkdWFsOworCQl9CisKKwkJLyogUG9pbnQgdG8gdGhlIG5ldyBuZXh0IHNnIGluIG1lbW9yeSAqLworCQljYWxsCXNnX2FkdmFuY2U7CisKK3NnX2xvYWRfZG9uZToKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCQlibW92CVNUQ05ULCBIQ05ULCAzOworCQl9IGVsc2UgeworCQkJY2FsbAlzZXRfc3RjbnRfZnJvbV9oY250OworCQl9CisKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKwkJCXRlc3QJU1NUQVQwLCBUQVJHRVQgam56IGRhdGFfcGhhc2VfbG9vcDsKKwkJfQorCX0KK2RhdGFfcGhhc2VfZmluaXNoOgorCS8qCisJICogSWYgdGhlIHRhcmdldCBoYXMgbGVmdCB1cyBpbiBkYXRhIHBoYXNlLCBsb29wIHRocm91Z2gKKwkgKiB0aGUgZG1hIGNvZGUgYWdhaW4uICBJbiB0aGUgY2FzZSBvZiBVTFRSQTIgYWRhcHRlcnMsCisJICogd2Ugc2hvdWxkIG9ubHkgbG9vcCBpZiB0aGVyZSBpcyBhIGRhdGEgb3ZlcnJ1bi4gIEZvcgorCSAqIGFsbCBvdGhlciBhZGFwdGVycywgd2UnbGwgbG9vcCBhZnRlciBlYWNoIFMvRyBlbGVtZW50CisJICogaXMgbG9hZGVkIGFzIHdlbGwgYXMgaWYgdGhlcmUgaXMgYW4gb3ZlcnJ1bi4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQl0ZXN0CVNTVEFUMCwgVEFSR0VUIGpueiBkYXRhX3BoYXNlX2RvbmU7CisJfQorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKSB7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUIGp6IC47CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQkJdGVzdAlTU1RBVDEsUEhBU0VNSVMJanogZGF0YV9waGFzZV9sb29wOworCQl9IGVsc2UgeworCQkJdGVzdAlTQ1NJUEhBU0UsIERBVEFfUEhBU0VfTUFTSyBqbnogZGF0YV9waGFzZV9sb29wOworCQl9CisJfQorCitkYXRhX3BoYXNlX2RvbmU6CisJLyoKKwkgKiBBZnRlciBhIERNQSBmaW5pc2hlcywgc2F2ZSB0aGUgU0cgYW5kIFNUQ05UIHJlc2lkdWFscyBiYWNrIGludG8KKwkgKiB0aGUgU0NCLiAgV2UgdXNlIFNUQ05UIGluc3RlYWQgb2YgSENOVCwgc2luY2UgaXQncyBhIHJlZmxlY3Rpb24KKwkgKiBvZiBob3cgbWFueSBieXRlcyB3ZXJlIHRyYW5zZmVycmVkIG9uIHRoZSBTQ1NJIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIGhvc3QpIGJ1cy4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJLyogS2lsbCBvZmYgYW55IHBlbmRpbmcgcHJlZmV0Y2ggKi8KKwkJY2FsbAlkaXNhYmxlX2Njc2dlbjsKKwl9CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBoaWdoIGFkZHJlc3MgYnl0ZSBzbyB0aGF0IGFsbCBvdGhlciBETUEKKwkJICogb3BlcmF0aW9ucywgd2hpY2ggdXNlIDMyYml0IGFkZHJlc3NpbmcsIGNhbiBhc3N1bWUKKwkJICogSEhBRERSIGlzIDAuCisJCSAqLworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQkJbW92CUFMTFpFUk9TIGNhbGwgc2V0X2hoYWRkcjsKKwkJfQorCX0KKworCS8qCisJICogVXBkYXRlIG91ciByZXNpZHVhbCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIGlzCisJICogbG9zdCBieSBzb21lIG90aGVyIHR5cGUgb2YgU0NTSSBJL08gKGUuZy4gUElPKS4gIElmIHdlIGhhdmUKKwkgKiB0cmFuc2ZlcnJlZCBhbGwgZGF0YSwgbm8gdXBkYXRlIGlzIG5lZWRlZC4KKwkgKgorCSAqLworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSLCBTR19MSVNUX05VTEwgam56IHJlc2lkdWFsX3VwZGF0ZV9kb25lOworCWlmICgoYWhjLT5idWdzICYgQUhDX1BDSV9NV0lfQlVHKSAhPSAwCisJICAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCkgeworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCXRlc3QJTVdJX1JFU0lEVUFMLCAweEZGIGp6IGJtb3ZfcmVzaWQ7CisJCX0KKwkJbW92CUEsIE1XSV9SRVNJRFVBTDsKKwkJYWRkCVNDQl9SRVNJRFVBTF9EQVRBQ05UWzBdLCBBLCBTVENOVFswXTsKKwkJY2xyCUE7CisJCWFkYwlTQ0JfUkVTSURVQUxfREFUQUNOVFsxXSwgQSwgU1RDTlRbMV07CisJCWFkYwlTQ0JfUkVTSURVQUxfREFUQUNOVFsyXSwgQSwgU1RDTlRbMl07CisJCWNscglNV0lfUkVTSURVQUw7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQkJam1wCS4gKyAyOworYm1vdl9yZXNpZDoKKwkJCWJtb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlQsIFNUQ05ULCAzOworCQl9CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CVNDQl9SRVNJRFVBTF9EQVRBQ05ULCBTVENOVCwgMzsKKwl9IGVsc2UgeworCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbMF0sIFNUQ05UWzBdOworCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbMV0sIFNUQ05UWzFdOworCQltb3YJU0NCX1JFU0lEVUFMX0RBVEFDTlRbMl0sIFNUQ05UWzJdOworCX0KK3Jlc2lkdWFsX3VwZGF0ZV9kb25lOgorCS8qCisJICogU2luY2Ugd2UndmUgYmVlbiB0aHJvdWdoIGEgZGF0YSBwaGFzZSwgdGhlIFNDQl9SRVNJRCogZmllbGRzCisJICogYXJlIG5vdyBpbml0aWFsaXplZC4gIENsZWFyIHRoZSBmdWxsIHJlc2lkdWFsIGZsYWcuCisJICovCisJYW5kCVNDQl9TR1BUUlswXSwgflNHX0ZVTExfUkVTSUQ7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCS8qIENsZWFyIHRoZSBjaGFubmVsIGluIGNhc2Ugd2UgcmV0dXJuIHRvIGRhdGEgcGhhc2UgbGF0ZXIgKi8KKwkJb3IJU1hGUkNUTDAsIENMUlNUQ05UfENMUkNITjsKKwkJb3IJU1hGUkNUTDAsIENMUlNUQ05UfENMUkNITjsKKwl9CisKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFX1BFTkRJTkcganogSVRsb29wOworCQlhbmQJU0VRX0ZMQUdTLCB+RFBIQVNFX1BFTkRJTkc7CisJCS8qCisJCSAqIEZvciBkYXRhLWluIHBoYXNlcywgd2FpdCBmb3IgYW55IHBlbmRpbmcgYWNrcyBmcm9tIHRoZQorCQkgKiBpbml0aWF0b3IgYmVmb3JlIGNoYW5naW5nIHBoYXNlLiAgV2Ugb25seSBuZWVkIHRvCisJCSAqIHNlbmQgSWdub3JlIFdpZGUgUmVzaWR1ZSBtZXNzYWdlcyBmb3IgZGF0YS1pbiBwaGFzZXMuCisJCSAqLworCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqeiB0YXJnZXRfSVRsb29wOworCQl0ZXN0CVNTVEFUMSwgUkVRSU5JVAlqbnogLjsKKwkJdGVzdAlTQ0JfTFVOLCBTQ0JfWEZFUkxFTl9PREQganogdGFyZ2V0X0lUbG9vcDsKKwkJdGVzdAlTQ1NJUkFURSwgV0lERVhGRVIganogdGFyZ2V0X0lUbG9vcDsKKwkJLyoKKwkJICogSXNzdWUgYW4gSWdub3JlIFdpZGUgUmVzaWR1ZSBNZXNzYWdlLgorCQkgKi8KKwkJbXZpCVBfTUVTR0lOfEJTWU8gY2FsbCBjaGFuZ2VfcGhhc2U7CisJCW12aQlNU0dfSUdOX1dJREVfUkVTSURVRSBjYWxsIHRhcmdldF9vdXRiOworCQltdmkJMSBjYWxsIHRhcmdldF9vdXRiOworCQlqbXAJdGFyZ2V0X0lUbG9vcDsKKwl9IGVsc2UgeworCQlqbXAJSVRsb29wOworCX0KKworaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOSVRJQVRPUlJPTEUpICE9IDApIHsKKy8qCisgKiBDb21tYW5kIHBoYXNlLiAgU2V0IHVwIHRoZSBETUEgcmVnaXN0ZXJzIGFuZCBsZXQgJ2VyIHJpcC4KKyAqLworcF9jb21tYW5kOgorCXRlc3QJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRCBqeiBwX2NvbW1hbmRfb2theTsKKwltdmkJUFJPVE9fVklPTEFUSU9OIGNhbGwgc2V0X3NlcWludDsKK3BfY29tbWFuZF9va2F5OgorCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92CUhDTlRbMF0sIFNDQl9DREJfTEVOLCAgMTsKKwkJYm1vdglIQ05UWzFdLCBBTExaRVJPUywgMjsKKwkJbXZpCVNHX0NBQ0hFX1BSRSwgTEFTVF9TRUc7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CVNUQ05UWzBdLCBTQ0JfQ0RCX0xFTiwgMTsKKwkJYm1vdglTVENOVFsxXSwgQUxMWkVST1MsIDI7CisJfSBlbHNlIHsKKwkJbW92CVNUQ05UWzBdLCBTQ0JfQ0RCX0xFTjsKKwkJY2xyCVNUQ05UWzFdOworCQljbHIJU1RDTlRbMl07CisJfQorCWFkZAlOT05FLCAtMTMsIFNDQl9DREJfTEVOOworCW12aQlTQ0JfQ0RCX1NUT1JFIGpuYyBwX2NvbW1hbmRfZW1iZWRkZWQ7CitwX2NvbW1hbmRfZnJvbV9ob3N0OgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYm1vdglIQUREUlswXSwgU0NCX0NEQl9QVFIsIDQ7CisJCW12aQlERkNOVFJMLCAoUFJFTE9BREVOfFNDU0lFTnxIRE1BRU58RElSRUNUSU9OKTsKKwl9IGVsc2UgeworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJCWJtb3YJSEFERFJbMF0sIFNDQl9DREJfUFRSLCA0OworCQkJYm1vdglIQ05ULCBTVENOVCwgMzsKKwkJfSBlbHNlIHsKKwkJCW12aQlESU5ERVgsIEhBRERSOworCQkJbXZpCVNDQl9DREJfUFRSIGNhbGwgYmNvcHlfNDsKKwkJCW1vdglTQ0JfQ0RCX0xFTiBjYWxsIHNldF9oY250OworCQl9CisJCW12aQlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxIRE1BRU58RElSRUNUSU9OfEZJRk9SRVNFVCk7CisJfQorCWptcAlwX2NvbW1hbmRfeGZlcjsKK3BfY29tbWFuZF9lbWJlZGRlZDoKKwkvKgorCSAqIFRoZSBkYXRhIGZpZm8gc2VlbXMgdG8gcmVxdWlyZSA0IGJ5dGUgYWxpZ25lZAorCSAqIHRyYW5zZmVycyBmcm9tIHRoZSBzZXF1ZW5jZXIuICBGb3JjZSB0aGlzIHRvCisJICogYmUgdGhlIGNhc2UgYnkgY2xlYXJpbmcgSEFERFJbMF0gZXZlbiB0aG91Z2gKKwkgKiB3ZSBhcmVuJ3QgZ29pbmcgdG8gdG91Y2ggaG9zdCBtZW1vcnkuCisJICovCisJY2xyCUhBRERSWzBdOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJbXZpCURGQ05UUkwsIChQUkVMT0FERU58U0NTSUVOfERJUkVDVElPTik7CisJCWJtb3YJREZEQVQsIFNDQl9DREJfU1RPUkUsIDEyOyAKKwl9IGVsc2UgaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCQkvKgorCQkJICogT24gdGhlIDc4OTUgdGhlIGRhdGEgRklGTyB3aWxsCisJCQkgKiBnZXQgY29ycnVwdGVkIGlmIHlvdSB0cnkgdG8gZHVtcAorCQkJICogZGF0YSBmcm9tIGV4dGVybmFsIFNDQiBtZW1vcnkgaW50bworCQkJICogdGhlIEZJRk8gd2hpbGUgaXQgaXMgZW5hYmxlZC4gIFNvLAorCQkJICogZmlsbCB0aGUgZmlmbyBhbmQgdGhlbiBlbmFibGUgU0NTSQorCQkJICogdHJhbnNmZXJzLgorCQkJICovCisJCQltdmkJREZDTlRSTCwgKERJUkVDVElPTnxGSUZPUkVTRVQpOworCQl9IGVsc2UgeworCQkJbXZpCURGQ05UUkwsIChTQ1NJRU58U0RNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQpOworCQl9CisJCWJtb3YJREZEQVQsIFNDQl9DREJfU1RPUkUsIDEyOyAKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApIHsKKwkJCW12aQlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxESVJFQ1RJT058RklGT0ZMVVNIKTsKKwkJfSBlbHNlIHsKKwkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJfQorCX0gZWxzZSB7CisJCW12aQlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxESVJFQ1RJT058RklGT1JFU0VUKTsKKwkJY2FsbAljb3B5X3RvX2ZpZm9fNjsKKwkJY2FsbAljb3B5X3RvX2ZpZm9fNjsKKwkJb3IJREZDTlRSTCwgRklGT0ZMVVNIOworCX0KK3BfY29tbWFuZF94ZmVyOgorCWFuZAlTRVFfRkxBR1MsIH5OT19DREJfU0VOVDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApIHsKKwkJdGVzdAlTU1RBVDAsIFNET05FIGpueiAuICsgMjsKKwkJdGVzdCAgICBTU1RBVDEsIFBIQVNFTUlTIGp6IC4gLSAxOworCQkvKgorCQkgKiBXYWl0IGZvciBvdXIgQUNLIHRvIGdvLWF3YXkgb24gaXQncyBvd24KKwkJICogaW5zdGVhZCBvZiBiZWluZyBraWxsZWQgYnkgU0NTSUVOIGdldHRpbmcgY2xlYXJlZC4KKwkJICovCisJCXRlc3QJU0NTSVNJR0ksIEFDS0kgam56IC47CisJfSBlbHNlIHsKKwkJdGVzdAlERkNOVFJMLCBTQ1NJRU4gam56IC47CisJfQorCXRlc3QJU1NUQVQwLCBTRE9ORSBqbnogcF9jb21tYW5kX3N1Y2Nlc3NmdWw7CisJLyoKKwkgKiBEb24ndCBhbGxvdyBhIGRhdGEgcGhhc2UgaWYgdGhlIGNvbW1hbmQKKwkgKiB3YXMgbm90IGZ1bGx5IHRyYW5zZmVycmVkLgorCSAqLworCW9yCVNFUV9GTEFHUywgTk9fQ0RCX1NFTlQ7CitwX2NvbW1hbmRfc3VjY2Vzc2Z1bDoKKwlhbmQJREZDTlRSTCwgfihTQ1NJRU58U0RNQUVOfEhETUFFTik7CisJdGVzdAlERkNOVFJMLCAoU0NTSUVOfFNETUFFTnxIRE1BRU4pIGpueiAuOworCWptcAlJVGxvb3A7CisKKy8qCisgKiBTdGF0dXMgcGhhc2UuICBXYWl0IGZvciB0aGUgZGF0YSBieXRlIHRvIGFwcGVhciwgdGhlbiByZWFkIGl0CisgKiBhbmQgc3RvcmUgaXQgaW50byB0aGUgU0NCLgorICovCitwX3N0YXR1czoKKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUQgam56IG1lc2dpbl9wcm90b192aW9sYXRpb247CitwX3N0YXR1c19va2F5OgorCW1vdglTQ0JfU0NTSV9TVEFUVVMsIFNDU0lEQVRMOworCW9yCVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRDsKKwlqbXAJSVRsb29wOworCisvKgorICogTWVzc2FnZSBvdXQgcGhhc2UuICBJZiBNU0dfT1VUIGlzIE1TR19JREVOVElGWUZMQUcsIGJ1aWxkIGEgZnVsbAorICogaW5kZW50aWZ5IG1lc3NhZ2Ugc2VxdWVuY2UgYW5kIHNlbmQgaXQgdG8gdGhlIHRhcmdldC4gIFRoZSBob3N0IG1heQorICogb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBieSBzZXR0aW5nIHRoZSBNS19NRVNTQUdFIGJpdCBpbiB0aGUgU0NCCisgKiBjb250cm9sIGJ5dGUuICBUaGlzIHdpbGwgY2F1c2UgdXMgdG8gaW50ZXJydXB0IHRoZSBob3N0IGFuZCBhbGxvdworICogaXQgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHBoYXNlIGNvbXBsZXRlbHkgb24gaXRzIG93bi4gIElmIHRoZSBiaXQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhcmdldCBpcyBzZXQsIHdlIHdpbGwgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QsCisgKiB0aGVyZWJ5IGFsbG93aW5nIGl0IHRvIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBuZXh0IHNlbGVjdGlvbiByZWdhcmRsZXNzCisgKiBvZiB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgc2VudC4KKyAqIAorICogSWYgTVNHX09VVCBpcyA9PSBIT1NUX01TRywgYWxzbyBpbnRlcnJ1cHQgdGhlIGhvc3QgYW5kIHRha2UgYSBtZXNzYWdlLgorICogVGhpcyBpcyBkb25lIHRvIGFsbG93IHRoZSBob3N0IHRvIHNlbmQgbWVzc2FnZXMgb3V0c2lkZSBvZiBhbiBpZGVudGlmeQorICogc2VxdWVuY2Ugd2hpbGUgcHJvdGVjdGluZyB0aGUgc2VxZW5jZXIgZnJvbSB0ZXN0aW5nIHRoZSBNS19NRVNTQUdFIGJpdAorICogb24gYW4gU0NCIHRoYXQgbWlnaHQgbm90IGJlIGZvciB0aGUgY3VycmVudCBuZXh1cy4gKEZvciBleGFtcGxlLCBhCisgKiBCRFIgbWVzc2FnZSBpbiByZXNwb25jZSB0byBhIGJhZCByZXNlbGVjdGlvbiB3b3VsZCBsZWF2ZSB1cyBwb2ludGVkIHRvCisgKiBhbiBTQ0IgdGhhdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQpLgorICoKKyAqIE90aGVyd2lzZSwgdHJlYXQgTVNHX09VVCBhcyBhIDEgYnl0ZSBtZXNzYWdlIHRvIHNlbmQgKGFib3J0LCBhYm9ydCB0YWcsCisgKiBidXMgZGV2aWNlIHJlc2V0KS4KKyAqCisgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXNzYWdlcyB0byBzZW5kLCBNU0dfT1VUIHNob3VsZCBiZSBzZXQgdG8gTVNHX05PT1AsCisgKiBpbiBjYXNlIHRoZSB0YXJnZXQgZGVjaWRlcyB0byBwdXQgdXMgaW4gdGhpcyBwaGFzZSBmb3Igc29tZSBzdHJhbmdlCisgKiByZWFzb24uCisgKi8KK3BfbWVzZ291dF9yZXRyeToKKwkvKiBUdXJuIG9uIEFUTiBmb3IgdGhlIHJldHJ5ICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSA9PSAwKSB7CisJCW9yCVNDU0lTSUdPLCBBVE5PLCBMQVNUUEhBU0U7CisJfSBlbHNlIHsKKwkJbXZpCVNDU0lTSUdPLCBBVE5POworCX0KK3BfbWVzZ291dDoKKwltb3YJU0lOREVYLCBNU0dfT1VUOworCWNtcAlTSU5ERVgsIE1TR19JREVOVElGWUZMQUcgam5lIHBfbWVzZ291dF9mcm9tX2hvc3Q7CisJdGVzdAlTQ0JfQ09OVFJPTCxNS19NRVNTQUdFCWpueiBob3N0X21lc3NhZ2VfbG9vcDsKK3BfbWVzZ291dF9pZGVudGlmeToKKwlvcglTSU5ERVgsIE1TR19JREVOVElGWUZMQUd8RElTQ0VOQiwgU0FWRURfTFVOOworCXRlc3QJU0NCX0NPTlRST0wsIERJU0NFTkIgam56IC4gKyAyOworCWFuZAlTSU5ERVgsIH5ESVNDRU5COworLyoKKyAqIFNlbmQgYSB0YWcgbWVzc2FnZSBpZiBUQUdfRU5CIGlzIHNldCBpbiB0aGUgU0NCIGNvbnRyb2wgYmxvY2suCisgKiBVc2UgU0NCX1RBRyAodGhlIHBvc2l0aW9uIGluIHRoZSBrZXJuZWwncyBTQ0IgYXJyYXkpIGFzIHRoZSB0YWcgdmFsdWUuCisgKi8KK3BfbWVzZ291dF90YWc6CisJdGVzdAlTQ0JfQ09OVFJPTCxUQUdfRU5CIGp6ICBwX21lc2dvdXRfb25lYnl0ZTsKKwltb3YJU0NTSURBVEwsIFNJTkRFWDsJLyogU2VuZCB0aGUgaWRlbnRpZnkgbWVzc2FnZSAqLworCWNhbGwJcGhhc2VfbG9jazsKKwljbXAJTEFTVFBIQVNFLCBQX01FU0dPVVQJam5lIHBfbWVzZ291dF9kb25lOworCWFuZAlTQ1NJREFUTCxUQUdfRU5CfFNDQl9UQUdfVFlQRSxTQ0JfQ09OVFJPTDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwltb3YJU0NCX1RBRwlqbXAgcF9tZXNnb3V0X29uZWJ5dGU7CisvKgorICogSW50ZXJydXB0IHRoZSBkcml2ZXIsIGFuZCBhbGxvdyBpdCB0byBoYW5kbGUgdGhpcyBtZXNzYWdlCisgKiBwaGFzZSBhbmQgYW55IHJlcXVpcmVkIHJldHJpZXMuCisgKi8KK3BfbWVzZ291dF9mcm9tX2hvc3Q6CisJY21wCVNJTkRFWCwgSE9TVF9NU0cJam5lIHBfbWVzZ291dF9vbmVieXRlOworCWptcAlob3N0X21lc3NhZ2VfbG9vcDsKKworcF9tZXNnb3V0X29uZWJ5dGU6CisJbXZpCUNMUlNJTlQxLCBDTFJBVE5POworCW1vdglTQ1NJREFUTCwgU0lOREVYOworCisvKgorICogSWYgdGhlIG5leHQgYnVzIHBoYXNlIGFmdGVyIEFUTiBkcm9wcyBpcyBtZXNzYWdlIG91dCwgaXQgbWVhbnMKKyAqIHRoYXQgdGhlIHRhcmdldCBpcyByZXF1ZXN0aW5nIHRoYXQgdGhlIGxhc3QgbWVzc2FnZShzKSBiZSByZXNlbnQuCisgKi8KKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWplIHBfbWVzZ291dF9yZXRyeTsKKworcF9tZXNnb3V0X2RvbmU6CisJbXZpCUNMUlNJTlQxLENMUkFUTk87CS8qIEJlIHN1cmUgdG8gdHVybiBBVE5PIG9mZiAqLworCW1vdglMQVNUX01TRywgTVNHX09VVDsKKwltdmkJTVNHX09VVCwgTVNHX05PT1A7CS8qIE5vIG1lc3NhZ2UgbGVmdCAqLworCWptcAlJVGxvb3A7CisKKy8qCisgKiBNZXNzYWdlIGluIHBoYXNlLiAgQnl0ZXMgYXJlIHJlYWQgdXNpbmcgQXV0b21hdGljIFBJTyBtb2RlLgorICovCitwX21lc2dpbjoKKwltdmkJQUNDVU0JCWNhbGwgaW5iX2ZpcnN0OwkvKiByZWFkIHRoZSAxc3QgbWVzc2FnZSBieXRlICovCisKKwl0ZXN0CUEsTVNHX0lERU5USUZZRkxBRwlqbnogbWVzZ2luX2lkZW50aWZ5OworCWNtcAlBLE1TR19ESVNDT05ORUNUCWplIG1lc2dpbl9kaXNjb25uZWN0OworCWNtcAlBLE1TR19TQVZFREFUQVBPSU5URVIJamUgbWVzZ2luX3NkcHRyczsKKwljbXAJQUxMWkVST1MsQQkJamUgbWVzZ2luX2NvbXBsZXRlOworCWNtcAlBLE1TR19SRVNUT1JFUE9JTlRFUlMJamUgbWVzZ2luX3JkcHRyczsKKwljbXAJQSxNU0dfSUdOX1dJREVfUkVTSURVRQlqZSBtZXNnaW5faWduX3dpZGVfcmVzaWR1ZTsKKwljbXAJQSxNU0dfTk9PUAkJamUgbWVzZ2luX2RvbmU7CisKKy8qCisgKiBQdXNoZWQgbWVzc2FnZSBsb29wIHRvIGFsbG93IHRoZSBrZXJuZWwgdG8KKyAqIHJ1biBpdCdzIG93biBtZXNzYWdlIHN0YXRlIGVuZ2luZS4gIFRvIGF2b2lkIGFuCisgKiBleHRyYSBub3AgaW5zdHJ1Y3Rpb24gYWZ0ZXIgc2lnbmFsaW5nIHRoZSBrZXJuZWwsCisgKiB3ZSBwZXJmb3JtIHRoZSBwaGFzZV9sb2NrIGJlZm9yZSBjaGVja2luZyB0byBzZWUKKyAqIGlmIHdlIHNob3VsZCBleGl0IHRoZSBsb29wIGFuZCBza2lwIHRoZSBwaGFzZV9sb2NrCisgKiBpbiB0aGUgSVRsb29wLiAgUGVyZm9ybWluZyBiYWNrIHRvIGJhY2sgcGhhc2VfbG9ja3MKKyAqIHNob3VsZG4ndCBodXJ0LCBidXQgd2h5IGRvIGl0IHR3aWNlLi4uCisgKi8KK2hvc3RfbWVzc2FnZV9sb29wOgorCW12aQlIT1NUX01TR19MT09QIGNhbGwgc2V0X3NlcWludDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCVJFVFVSTl8xLCBFWElUX01TR19MT09QCWplIElUbG9vcCArIDE7CisJam1wCWhvc3RfbWVzc2FnZV9sb29wOworCittZXNnaW5faWduX3dpZGVfcmVzaWR1ZToKK2lmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJdGVzdAlTQ1NJUkFURSwgV0lERVhGRVIganogbWVzZ2luX3JlamVjdDsKKwkvKiBQdWxsIHRoZSByZXNpZHVlIGJ5dGUgKi8KKwltdmkJQVJHXzEJY2FsbCBpbmJfbmV4dDsKKwljbXAJQVJHXzEsIDB4MDEgam5lIG1lc2dpbl9yZWplY3Q7CisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqeiAuICsgMjsKKwl0ZXN0CVNDQl9MVU4sIFNDQl9YRkVSTEVOX09ERCBqbnogbWVzZ2luX2RvbmU7CisJbXZpCUlHTl9XSURFX1JFUyBjYWxsIHNldF9zZXFpbnQ7CisJam1wCW1lc2dpbl9kb25lOworfQorCittZXNnaW5fcHJvdG9fdmlvbGF0aW9uOgorCW12aQlQUk9UT19WSU9MQVRJT04gY2FsbCBzZXRfc2VxaW50OworCWptcAltZXNnaW5fZG9uZTsKK21lc2dpbl9yZWplY3Q6CisJbXZpCU1TR19NRVNTQUdFX1JFSkVDVAljYWxsIG1rX21lc2c7CittZXNnaW5fZG9uZToKKwltb3YJTk9ORSxTQ1NJREFUTDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisJam1wCUlUbG9vcDsKKworLyoKKyAqIFdlIHJlY2VpdmVkIGEgImNvbW1hbmQgY29tcGxldGUiIG1lc3NhZ2UuICBQdXQgdGhlIFNDQl9UQUcgaW50byB0aGUgUU9VVEZJRk8sCisgKiBhbmQgdHJpZ2dlciBhIGNvbXBsZXRpb24gaW50ZXJydXB0LiAgQmVmb3JlIGRvaW5nIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlcmUKKyAqIGlzIGEgcmVzaWR1YWwgb3IgdGhlIHN0YXR1cyBieXRlIGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIFNUQVRVU19HT09EICgwKS4KKyAqIEluIGVpdGhlciBvZiB0aGVzZSBjb25kaXRpb25zLCB3ZSB1cGxvYWQgdGhlIFNDQiBiYWNrIHRvIHRoZSBob3N0IHNvIGl0IGNhbgorICogcHJvY2VzcyB0aGlzIGluZm9ybWF0aW9uLiAgSW4gdGhlIGNhc2Ugb2YgYSBub24gemVybyBzdGF0dXMgYnl0ZSwgd2UgCisgKiBhZGRpdGlvbmFsbHkgaW50ZXJydXB0IHRoZSBrZXJuZWwgZHJpdmVyIHN5bmNocm9ub3VzbHksIGFsbG93aW5nIGl0IHRvCisgKiBkZWNpZGUgaWYgc2Vuc2Ugc2hvdWxkIGJlIHJldHJpZXZlZC4gIElmIHRoZSBrZXJuZWwgZHJpdmVyIHdpc2hlcyB0byByZXF1ZXN0CisgKiBzZW5zZSwgaXQgd2lsbCBmaWxsIHRoZSBrZXJuZWwgU0NCIHdpdGggYSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQsIHJlcXVldWUKKyAqIGl0IHRvIHRoZSBRSU5GSUZPIGFuZCB0ZWxsIHVzIG5vdCB0byBwb3N0IHRvIHRoZSBRT1VURklGTyBieSBzZXR0aW5nIAorICogUkVUVVJOXzEgdG8gU0VORF9TRU5TRS4KKyAqLworbWVzZ2luX2NvbXBsZXRlOgorCisJLyoKKwkgKiBJZiBBVE4gaXMgcmFpc2VkLCB3ZSBzdGlsbCB3YW50IHRvIGdpdmUgdGhlIHRhcmdldCBhIG1lc3NhZ2UuCisJICogUGVyaGFwcyB0aGVyZSB3YXMgYSBwYXJpdHkgZXJyb3Igb24gdGhpcyBsYXN0IG1lc3NhZ2UgYnl0ZS4KKwkgKiBFaXRoZXIgd2F5LCB0aGUgdGFyZ2V0IHNob3VsZCB0YWtlIHVzIHRvIG1lc3NhZ2Ugb3V0IHBoYXNlCisJICogYW5kIHRoZW4gYXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY29tbWFuZCBhZ2Fpbi4gIFdlIHNob3VsZCB1c2UgYQorCSAqIGNyaXRpY2FsIHNlY3Rpb24gaGVyZSB0byBndWFyZCBhZ2FpbnN0IGEgdGltZW91dCB0cmlnZ2VyaW5nCisJICogZm9yIHRoaXMgY29tbWFuZCBhbmQgc2V0dGluZyBBVE4gd2hpbGUgd2UgYXJlIHN0aWxsIHByb2Nlc3NpbmcKKwkgKiB0aGUgY29tcGxldGlvbi4KKwl0ZXN0CVNDU0lTSUdJLCBBVE5JIGpueiBtZXNnaW5fZG9uZTsKKwkgKi8KKworCS8qCisJICogSWYgd2UgYXJlIGlkZW50aWZpZWQgYW5kIGhhdmUgc3VjY2Vzc2Z1bGx5IHNlbnQgdGhlIENEQiwKKwkgKiBhbnkgc3RhdHVzIHdpbGwgZG8uICBPcHRpbWl6ZSB0aGlzIGZhc3QgcGF0aC4KKwkgKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBTVEFUVVNfUkNWRCBqeiBtZXNnaW5fcHJvdG9fdmlvbGF0aW9uOworCXRlc3QJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVCBqeiBjb21wbGV0ZV9hY2NlcHRlZDsgCisKKwkvKgorCSAqIElmIHRoZSB0YXJnZXQgbmV2ZXIgc2VudCBhbiBpZGVudGlmeSBtZXNzYWdlIGJ1dCBpbnN0ZWFkIHdlbnQKKwkgKiB0byBtZXNnaW4gdG8gZ2l2ZSBhbiBpbnZhbGlkIG1lc3NhZ2UsIGxldCB0aGUgaG9zdCBhYm9ydCB1cy4KKwkgKi8KKwl0ZXN0CVNFUV9GTEFHUywgTk9UX0lERU5USUZJRUQgam56IG1lc2dpbl9wcm90b192aW9sYXRpb247CisKKwkvKgorCSAqIElmIHdlIHJlY2V2aWVkIGdvb2Qgc3RhdHVzIGJ1dCBuZXZlciBzdWNjZXNzZnVsbHkgc2VudCB0aGUKKwkgKiBjZGIsIGFib3J0IHRoZSBjb21tYW5kLgorCSAqLworCXRlc3QJU0NCX1NDU0lfU1RBVFVTLDB4ZmYJam56IGNvbXBsZXRlX2FjY2VwdGVkOworCXRlc3QJU0VRX0ZMQUdTLCBOT19DREJfU0VOVCBqbnogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKKworY29tcGxldGVfYWNjZXB0ZWQ6CisJLyoKKwkgKiBTZWUgaWYgd2UgYXR0ZW1wdGVkIHRvIGRlbGl2ZXIgYSBtZXNzYWdlIGJ1dCB0aGUgdGFyZ2V0IGluZ25vcmVkIHVzLgorCSAqLworCXRlc3QJU0NCX0NPTlRST0wsIE1LX01FU1NBR0UganogLiArIDI7CisJbXZpCU1LTVNHX0ZBSUxFRCBjYWxsIHNldF9zZXFpbnQ7CisKKwkvKgorCSAqIENoZWNrIGZvciByZXNpZHVhbHMKKwkgKi8KKwl0ZXN0CVNDQl9TR1BUUiwgU0dfTElTVF9OVUxMIGpueiBjaGVja19zdGF0dXM7LyogTm8geGZlciAqLworCXRlc3QJU0NCX1NHUFRSLCBTR19GVUxMX1JFU0lEIGpueiB1cGxvYWRfc2NiOy8qIE5ldmVyIHhmZXJlZCAqLworCXRlc3QJU0NCX1JFU0lEVUFMX1NHUFRSLCBTR19MSVNUX05VTEwganogdXBsb2FkX3NjYjsKK2NoZWNrX3N0YXR1czoKKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywweGZmCWp6IGNvbXBsZXRlOwkvKiBHb29kIFN0YXR1cz8gKi8KK3VwbG9hZF9zY2I6CisJb3IJU0NCX1NHUFRSLCBTR19SRVNJRF9WQUxJRDsKKwltdmkJRE1BUEFSQU1TLCBGSUZPUkVTRVQ7CisJbW92CVNDQl9UQUcJCWNhbGwgZG1hX3NjYjsKKwl0ZXN0CVNDQl9TQ1NJX1NUQVRVUywgMHhmZglqeiBjb21wbGV0ZTsJLyogSnVzdCBhIHJlc2lkdWFsPyAqLworCW12aQlCQURfU1RBVFVTIGNhbGwgc2V0X3NlcWludDsJCS8qIGxldCBkcml2ZXIga25vdyAqLworCWNtcAlSRVRVUk5fMSwgU0VORF9TRU5TRQlqbmUgY29tcGxldGU7CisJY2FsbAlhZGRfc2NiX3RvX2ZyZWVfbGlzdDsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKK2NvbXBsZXRlOgorCW1vdglTQ0JfVEFHIGNhbGwgY29tcGxldGVfcG9zdDsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKK30KKworY29tcGxldGVfcG9zdDoKKwkvKiBQb3N0IHRoZSBTQ0JJRCBpbiBTSU5ERVggYW5kIGlzc3VlIGFuIGludGVycnVwdCAqLworCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7CisJbW92CUFSR18xLCBTSU5ERVg7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJbW92CUEsIFNEU0NCX1FPRkY7CisJfSBlbHNlIHsKKwkJbW92CUEsIFFPVVRQT1M7CisJfQorCW12aQlRT1VURklGT19PRkZTRVQgY2FsbCBwb3N0X2J5dGVfc2V0dXA7CisJbW92CUFSR18xIGNhbGwgcG9zdF9ieXRlOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSA9PSAwKSB7CisJCWluYyAJUU9VVFBPUzsKKwl9CisJbXZpCUlOVFNUQVQsQ01EQ01QTFQgcmV0OworCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworLyoKKyAqIElzIGl0IGEgZGlzY29ubmVjdCBtZXNzYWdlPyAgU2V0IGEgZmxhZyBpbiB0aGUgU0NCIHRvIHJlbWluZCB1cworICogYW5kIGF3YWl0IHRoZSBidXMgZ29pbmcgZnJlZS4gIElmIHRoaXMgaXMgYW4gdW50YWdnZWQgdHJhbnNhY3Rpb24KKyAqIHN0b3JlIHRoZSBTQ0IgaWQgZm9yIGl0IGluIG91ciB1bnRhZ2dlZCB0YXJnZXQgdGFibGUgZm9yIGxvb2t1cCBvbgorICogYSByZXNlbGN0aW9uLgorICovCittZXNnaW5fZGlzY29ubmVjdDoKKwkvKgorCSAqIElmIEFUTiBpcyByYWlzZWQsIHdlIHN0aWxsIHdhbnQgdG8gZ2l2ZSB0aGUgdGFyZ2V0IGEgbWVzc2FnZS4KKwkgKiBQZXJoYXBzIHRoZXJlIHdhcyBhIHBhcml0eSBlcnJvciBvbiB0aGlzIGxhc3QgbWVzc2FnZSBieXRlCisJICogb3Igd2Ugd2FudCB0byBhYm9ydCB0aGlzIGNvbW1hbmQuICBFaXRoZXIgd2F5LCB0aGUgdGFyZ2V0CisJICogc2hvdWxkIHRha2UgdXMgdG8gbWVzc2FnZSBvdXQgcGhhc2UgYW5kIHRoZW4gYXR0ZW1wdCB0bworCSAqIGRpc2Nvbm5lY3QgYWdhaW4uCisJICogWFhYIC0gV2FpdCBmb3IgbW9yZSB0ZXN0aW5nLgorCXRlc3QJU0NTSVNJR0ksIEFUTkkgam56IG1lc2dpbl9kb25lOworCSAqLworCXRlc3QJU0VRX0ZMQUdTLCBOT1RfSURFTlRJRklFRHxOT19DREJfU0VOVAorCQlqbnogbWVzZ2luX3Byb3RvX3Zpb2xhdGlvbjsKKwlvcglTQ0JfQ09OVFJPTCxESVNDT05ORUNURUQ7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCWNhbGwJYWRkX3NjYl90b19kaXNjX2xpc3Q7CisJfQorCXRlc3QJU0NCX0NPTlRST0wsIFRBR19FTkIgam56IGF3YWl0X2J1c2ZyZWU7CisJbW92CUFSR18xLCBTQ0JfVEFHOworCWFuZAlTQVZFRF9MVU4sIExJRCwgU0NCX0xVTjsKKwltb3YJU0NCX1NDU0lJRAljYWxsIHNldF9idXN5X3RhcmdldDsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKKworLyoKKyAqIFNhdmUgZGF0YSBwb2ludGVycyBtZXNzYWdlOgorICogQ29weWluZyBSQU0gdmFsdWVzIGJhY2sgdG8gU0NCLCBmb3IgU2F2ZSBEYXRhIFBvaW50ZXJzIG1lc3NhZ2UsIGJ1dAorICogb25seSBpZiB3ZSd2ZSBhY3R1YWxseSBiZWVuIGludG8gYSBkYXRhIHBoYXNlIHRvIGNoYW5nZSB0aGVtLiAgVGhpcworICogcHJvdGVjdHMgYWdhaW5zdCBib2d1cyBkYXRhIGluIHNjcmF0Y2ggcmFtIGFuZCB0aGUgcmVzaWR1YWwgY291bnRzCisgKiBzaW5jZSB0aGV5IGFyZSBvbmx5IGluaXRpYWxpemVkIHdoZW4gd2UgZ28gaW50byBkYXRhX2luIG9yIGRhdGFfb3V0LgorICogQWNrIHRoZSBtZXNzYWdlIGFzIHNvb24gYXMgcG9zc2libGUuICBGb3IgY2hpcHMgd2l0aG91dCBTL0cgcGlwZWxpbmluZywKKyAqIHdlIGNhbiBvbmx5IGFjayB0aGUgbWVzc2FnZSBhZnRlciBTSEFERFIgaGFzIGJlZW4gc2F2ZWQuICBPbiB0aGVzZQorICogY2hpcHMsIFNIQUREUiBpbmNyZW1lbnRzIHdpdGggZXZlcnkgYnVzIHRyYW5zYWN0aW9uLCBldmVuIFBJTy4KKyAqLworbWVzZ2luX3NkcHRyczoKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW1vdglOT05FLFNDU0lEQVRMOwkJLypkdW1teSByZWFkIGZyb20gbGF0Y2ggdG8gQUNLKi8KKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRQlqeiBJVGxvb3A7CisJfSBlbHNlIHsKKwkJdGVzdAlTRVFfRkxBR1MsIERQSEFTRQlqeiBtZXNnaW5fZG9uZTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSBhc2tlZCB0byBzYXZlIG91ciBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZQorCSAqIHRyYW5zZmVyLCBqdXN0IG1hcmsgdXMgYXQgdGhlIGVuZCByYXRoZXIgdGhhbiBwZXJmb3JtIGEKKwkgKiBmdWxsIHNhdmUuCisJICovCisJdGVzdAlTQ0JfUkVTSURVQUxfU0dQVFJbMF0sIFNHX0xJU1RfTlVMTCBqeiBtZXNnaW5fc2RwdHJzX2Z1bGw7CisJb3IJU0NCX1NHUFRSLCBTR19MSVNUX05VTEw7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlqbXAJSVRsb29wOworCX0gZWxzZSB7CisJCWptcAltZXNnaW5fZG9uZTsKKwl9CisKK21lc2dpbl9zZHB0cnNfZnVsbDoKKworCS8qCisJICogVGhlIFNDQl9TR1BUUiBiZWNvbWVzIHRoZSBuZXh0IG9uZSB3ZSdsbCBkb3dubG9hZCwKKwkgKiBhbmQgdGhlIFNDQl9EQVRBUFRSIGJlY29tZXMgdGhlIGN1cnJlbnQgU0hBRERSLgorCSAqIFVzZSB0aGUgcmVzaWR1YWwgbnVtYmVyIHNpbmNlIFNUQ05UIGlzIGNvcnJ1cHRlZCBieQorCSAqIGFueSBtZXNzYWdlIHRyYW5zZmVyLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CVNDQl9EQVRBUFRSLCBTSEFERFIsIDQ7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJCW1vdglOT05FLFNDU0lEQVRMOwkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworCQl9CisJCWJtb3YJU0NCX0RBVEFDTlQsIFNDQl9SRVNJRFVBTF9EQVRBQ05ULCA4OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIFNDQl9EQVRBUFRSOworCQltdmkJU0hBRERSIGNhbGwgYmNvcHlfNDsKKwkJbW92CU5PTkUsU0NTSURBVEw7CS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisJCW12aQlTQ0JfUkVTSURVQUxfREFUQUNOVCBjYWxsIGJjb3B5Xzg7CisJfQorCWptcAlJVGxvb3A7CisKKy8qCisgKiBSZXN0b3JlIHBvaW50ZXJzIG1lc3NhZ2U/ICBEYXRhIHBvaW50ZXJzIGFyZSByZWNvcGllZCBmcm9tIHRoZQorICogU0NCIGFueXRpbWUgd2UgZW50ZXIgYSBkYXRhIHBoYXNlIGZvciB0aGUgZmlyc3QgdGltZSwgc28gYWxsCisgKiB3ZSBuZWVkIHRvIGRvIGlzIGNsZWFyIHRoZSBEUEhBU0UgZmxhZyBhbmQgbGV0IHRoZSBkYXRhIHBoYXNlCisgKiBjb2RlIGRvIHRoZSByZXN0LiAgV2UgYWxzbyByZXNldC9yZWFsbG9jYXRlIHRoZSBGSUZPIHRvIG1ha2UKKyAqIHN1cmUgd2UgaGF2ZSBhIGNsZWFuIHN0YXJ0IGZvciB0aGUgbmV4dCBkYXRhIG9yIGNvbW1hbmQgcGhhc2UuCisgKi8KK21lc2dpbl9yZHB0cnM6CisJYW5kCVNFUV9GTEFHUywgfkRQSEFTRTsJCS8qCisJCQkJCQkgKiBXZSdsbCByZWxvYWQgdGhlbQorCQkJCQkJICogdGhlIG5leHQgdGltZSB0aHJvdWdoCisJCQkJCQkgKiB0aGUgZGF0YXBoYXNlLgorCQkJCQkJICovCisJb3IJU1hGUkNUTDAsIENMUlNUQ05UfENMUkNITjsKKwlqbXAJbWVzZ2luX2RvbmU7CisKKy8qCisgKiBJbmRleCBpbnRvIG91ciBCdXN5IFRhcmdldCB0YWJsZS4gIFNJTkRFWCBhbmQgRElOREVYIGFyZSBtb2RpZmllZAorICogdXBvbiByZXR1cm4uICBTQ0JQVFIgbWF5IGJlIG1vZGlmaWVkIGJ5IHRoaXMgYWN0aW9uLgorICovCitzZXRfYnVzeV90YXJnZXQ6CisJc2hyCURJTkRFWCwgNCwgU0lOREVYOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCW1vdglTQ0JQVFIsIFNBVkVEX0xVTjsKKwkJYWRkCURJTkRFWCwgU0NCXzY0X0JUVDsKKwl9IGVsc2UgeworCQlhZGQJRElOREVYLCBCVVNZX1RBUkdFVFM7CisJfQorCW1vdglESU5ESVIsIEFSR18xIHJldDsKKworLyoKKyAqIElkZW50aWZ5IG1lc3NhZ2U/ICBGb3IgYSByZWNvbm5lY3RpbmcgdGFyZ2V0LCB0aGlzIHRlbGxzIHVzIHRoZSBsdW4KKyAqIHRoYXQgdGhlIHJlY29ubmVjdGlvbiBpcyBmb3IgLSBmaW5kIHRoZSBjb3JyZWN0IFNDQiBhbmQgc3dpdGNoIHRvIGl0LAorICogY2xlYXJpbmcgdGhlICJkaXNjb25uZWN0ZWQiIGJpdCBzbyB3ZSBkb24ndCAiZmluZCIgaXQgYnkgYWNjaWRlbnQgbGF0ZXIuCisgKi8KK21lc2dpbl9pZGVudGlmeToKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIGEgdGFyZ2V0IGlzIHVzaW5nIHRhZ2dlZCBvciBub24tdGFnZ2VkCisJICogdHJhbnNhY3Rpb25zIGJ5IGZpcnN0IGxvb2tpbmcgYXQgdGhlIHRyYW5zYWN0aW9uIHN0b3JlZCBpbgorCSAqIHRoZSBidXN5IHRhcmdldCBhcnJheS4gIElmIHRoZXJlIGlzIG5vIHVudGFnZ2VkIHRyYW5zYWN0aW9uCisJICogZm9yIHRoaXMgdGFyZ2V0IG9yIHRoZSB0cmFuc2FjdGlvbiBpcyBmb3IgYSBkaWZmZXJlbnQgbHVuLCB0aGVuCisJICogdGhpcyBtdXN0IGJlIGEgdGFnZ2VkIHRyYW5zYWN0aW9uLgorCSAqLworCXNocglTSU5ERVgsIDQsIFNBVkVEX1NDU0lJRDsKKwlhbmQJU0FWRURfTFVOLCBNU0dfSURFTlRJRllfTFVOTUFTSywgQTsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgIT0gMCkgeworCQlhZGQJU0lOREVYLCBTQ0JfNjRfQlRUOworCQltb3YJU0NCUFRSLCBTQVZFRF9MVU47CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJCWFkZAlOT05FLCAtU0NCXzY0X0JUVCwgU0lOREVYOworCQkJamMJLiArIDI7CisJCQltdmkJSU5UU1RBVCwgT1VUX09GX1JBTkdFOworCQkJbm9wOworCQkJYWRkCU5PTkUsIC0oU0NCXzY0X0JUVCArIDE2KSwgU0lOREVYOworCQkJam5jCS4gKyAyOworCQkJbXZpCUlOVFNUQVQsIE9VVF9PRl9SQU5HRTsKKwkJCW5vcDsKKwkJfQorCX0gZWxzZSB7CisJCWFkZAlTSU5ERVgsIEJVU1lfVEFSR0VUUzsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQkJYWRkCU5PTkUsIC1CVVNZX1RBUkdFVFMsIFNJTkRFWDsKKwkJCWpjCS4gKyAyOworCQkJbXZpCUlOVFNUQVQsIE9VVF9PRl9SQU5HRTsKKwkJCW5vcDsKKwkJCWFkZAlOT05FLCAtKEJVU1lfVEFSR0VUUyArIDE2KSwgU0lOREVYOworCQkJam5jCS4gKyAyOworCQkJbXZpCUlOVFNUQVQsIE9VVF9PRl9SQU5HRTsKKwkJCW5vcDsKKwkJfQorCX0KKwltb3YJQVJHXzEsIFNJTkRJUjsKKwljbXAJQVJHXzEsIFNDQl9MSVNUX05VTEwJamUgc25vb3BfdGFnOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQltb3YJQVJHXzEgY2FsbCBmaW5kU0NCOworCX0gZWxzZSB7CisJCW1vdglTQ0JQVFIsIEFSR18xOworCX0KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgIT0gMCkgeworCQlqbXAgc2V0dXBfU0NCX2lkX2x1bl9va2F5OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIG9ubHkgYWxsb3cgb25lIHVudGFnZ2VkIGNvbW1hbmQgcGVyLXRhcmdldAorCQkgKiBhdCBhIHRpbWUuICBTbywgaWYgdGhlIGx1biBkb2Vzbid0IG1hdGNoLCBsb29rCisJCSAqIGZvciBhIHRhZyBtZXNzYWdlLgorCQkgKi8KKwkJYW5kCUEsIExJRCwgU0NCX0xVTjsKKwkJY21wCVNBVkVEX0xVTiwgQQlqZSBzZXR1cF9TQ0JfaWRfbHVuX29rYXk7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQkJLyoKKwkJCSAqIGZpbmRTQ0IgcmVtb3ZlcyB0aGUgU0NCIGZyb20gdGhlCisJCQkgKiBkaXNjb25uZWN0ZWQgbGlzdCwgc28gd2UgbXVzdCByZXBsYWNlCisJCQkgKiBpdCB0aGVyZSBzaG91bGQgdGhpcyBTQ0IgYmUgZm9yIGFub3RoZXIKKwkJCSAqIGx1bi4KKwkJCSAqLworCQkJY2FsbAljbGVhbnVwX3NjYjsKKwkJfQorCX0KKworLyoKKyAqIEhlcmUgd2UgInNub29wIiB0aGUgYnVzIGxvb2tpbmcgZm9yIGEgU0lNUExFIFFVRVVFIFRBRyBtZXNzYWdlLgorICogSWYgd2UgZ2V0IG9uZSwgd2UgdXNlIHRoZSB0YWcgcmV0dXJuZWQgdG8gZmluZCB0aGUgcHJvcGVyCisgKiBTQ0IuICBXaXRoIFNDQiBwYWdpbmcsIHdlIG11c3Qgc2VhcmNoIGZvciBub24tdGFnZ2VkCisgKiB0cmFuc2FjdGlvbnMgc2luY2UgdGhlIFNDQiBtYXkgZXhpc3QgaW4gYW55IHNsb3QuICBJZiB3ZSdyZSBub3QKKyAqIHVzaW5nIFNDQiBwYWdpbmcsIHdlIGNhbiB1c2UgdGhlIHRhZyBhcyB0aGUgZGlyZWN0IGluZGV4IHRvIHRoZQorICogU0NCLgorICovCitzbm9vcF90YWc6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQlvcglTRVFfRkxBR1MsIDB4ODA7CisJfQorCW1vdglOT05FLFNDU0lEQVRMOwkJLyogQUNLIElkZW50aWZ5IE1TRyAqLworCWNhbGwJcGhhc2VfbG9jazsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0VRVUVOQ0VSX0RFQlVHKSAhPSAwKSB7CisJCW9yCVNFUV9GTEFHUywgMHgxOworCX0KKwljbXAJTEFTVFBIQVNFLCBQX01FU0dJTglqbmUgbm90X2ZvdW5kOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDI7CisJfQorCWNtcAlTQ1NJQlVTTCxNU0dfU0lNUExFX1FfVEFHIGpuZSBub3RfZm91bmQ7CitnZXRfdGFnOgorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQltdmkJQVJHXzEJY2FsbCBpbmJfbmV4dDsJLyogdGFnIHZhbHVlICovCisJCW1vdglBUkdfMQljYWxsIGZpbmRTQ0I7CisJfSBlbHNlIHsKKwkJbXZpCUFSR18xCWNhbGwgaW5iX25leHQ7CS8qIHRhZyB2YWx1ZSAqLworCQltb3YJU0NCUFRSLCBBUkdfMTsKKwl9CisKKy8qCisgKiBFbnN1cmUgdGhhdCB0aGUgU0NCIHRoZSB0YWcgcG9pbnRzIHRvIGlzIGZvcgorICogYW4gU0NCIHRyYW5zYWN0aW9uIHRvIHRoZSByZWNvbm5lY3RpbmcgdGFyZ2V0LgorICovCitzZXR1cF9TQ0I6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQlvcglTRVFfRkxBR1MsIDB4NDsKKwl9CisJbW92CUEsIFNDQl9TQ1NJSUQ7CisJY21wCVNBVkVEX1NDU0lJRCwgQQlqbmUgbm90X2ZvdW5kX2NsZWFudXBfc2NiOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TRVFVRU5DRVJfREVCVUcpICE9IDApIHsKKwkJb3IJU0VRX0ZMQUdTLCAweDg7CisJfQorc2V0dXBfU0NCX2lkX29rYXk6CisJYW5kCUEsIExJRCwgU0NCX0xVTjsKKwljbXAJU0FWRURfTFVOLCBBCWpuZSBub3RfZm91bmRfY2xlYW51cF9zY2I7CitzZXR1cF9TQ0JfaWRfbHVuX29rYXk6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCkgeworCQlvcglTRVFfRkxBR1MsIDB4MTA7CisJfQorCXRlc3QJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEIGp6IG5vdF9mb3VuZF9jbGVhbnVwX3NjYjsKKwlhbmQJU0NCX0NPTlRST0wsfkRJU0NPTk5FQ1RFRDsKKwl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CCWpueiBzZXR1cF9TQ0JfdGFnZ2VkOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCW1vdglBLCBTQ0JQVFI7CisJfQorCW12aQlBUkdfMSwgU0NCX0xJU1RfTlVMTDsKKwltb3YJU0FWRURfU0NTSUlECWNhbGwJc2V0X2J1c3lfdGFyZ2V0OworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCW1vdglTQ0JQVFIsIEE7CisJfQorc2V0dXBfU0NCX3RhZ2dlZDoKKwljbHIJU0VRX0ZMQUdTOwkvKiBtYWtlIG5vdGUgb2YgSURFTlRJRlkgKi8KKwljYWxsCXNldF90cmFuc2Zlcl9zZXR0aW5nczsKKwkvKiBTZWUgaWYgdGhlIGhvc3Qgd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdXBvbiByZWNvbm5lY3Rpb24gKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IG1lc2dpbl9kb25lOworCW12aQlIT1NUX01TRwljYWxsIG1rX21lc2c7CisJam1wCW1lc2dpbl9kb25lOworCitub3RfZm91bmRfY2xlYW51cF9zY2I6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCWNhbGwJY2xlYW51cF9zY2I7CisJfQorbm90X2ZvdW5kOgorCW12aQlOT19NQVRDSCBjYWxsIHNldF9zZXFpbnQ7CisJam1wCW1lc2dpbl9kb25lOworCitta19tZXNnOgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQlvcglTQ1NJU0lHTywgQVROTywgTEFTVFBIQVNFOworCX0gZWxzZSB7CisJCW12aQlTQ1NJU0lHTywgQVROTzsKKwl9CisJbW92CU1TR19PVVQsU0lOREVYIHJldDsKKworLyoKKyAqIEZ1bmN0aW9ucyB0byByZWFkIGRhdGEgaW4gQXV0b21hdGljIFBJTyBtb2RlLgorICoKKyAqIEFjY29yZGluZyB0byBBZGFwdGVjJ3MgZG9jdW1lbnRhdGlvbiwgYW4gQUNLIGlzIG5vdCBzZW50IG9uIGlucHV0IGZyb20KKyAqIHRoZSB0YXJnZXQgdW50aWwgU0NTSURBVEwgaXMgcmVhZCBmcm9tLiAgU28gd2Ugd2FpdCB1bnRpbCBTQ1NJREFUTCBpcworICogbGF0Y2hlZCAodGhlIHVzdWFsIHdheSksIHRoZW4gcmVhZCB0aGUgZGF0YSBieXRlIGRpcmVjdGx5IG9mZiB0aGUgYnVzCisgKiB1c2luZyBTQ1NJQlVTTC4gIFdoZW4gd2UgaGF2ZSBwdWxsZWQgdGhlIEFUTiBsaW5lLCBvciB3ZSBqdXN0IHdhbnQgdG8KKyAqIGFja25vd2xlZGdlIHRoZSBieXRlLCB0aGVuIHdlIGRvIGEgZHVtbXkgcmVhZCBmcm9tIFNDSVNEQVRMLiAgVGhlIFNDU0kKKyAqIHNwZWMgZ3VhcmFudGVlcyB0aGF0IHRoZSB0YXJnZXQgd2lsbCBob2xkIHRoZSBkYXRhIGJ5dGUgb24gdGhlIGJ1cyB1bnRpbAorICogd2Ugc2VuZCBvdXIgQUNLLgorICoKKyAqIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGVzZSBhcmUgY2FsbGVkIGluIGEgcGFydGljdWxhciBzZXF1ZW5jZSwKKyAqIGFuZCB0aGF0IFJFUSBpcyBhbHJlYWR5IHNldCB3aGVuIGluYl9maXJzdCBpcyBjYWxsZWQuICBpbmJfe2ZpcnN0LG5leHR9CisgKiB1c2UgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9uIGFzIGluYi4KKyAqLworaW5iX25leHRfd2FpdF9wZXJyOgorCW12aQlQRVJSX0RFVEVDVEVEIGNhbGwgc2V0X3NlcWludDsKKwlqbXAJaW5iX25leHRfd2FpdDsKK2luYl9uZXh0OgorCW1vdglOT05FLFNDU0lEQVRMOwkJLypkdW1teSByZWFkIGZyb20gbGF0Y2ggdG8gQUNLKi8KK2luYl9uZXh0X3dhaXQ6CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhcml0eSBlcnJvciwgd2FpdCBmb3IgdGhlIGtlcm5lbCB0bworCSAqIHNlZSB0aGUgaW50ZXJydXB0IGFuZCBwcmVwYXJlIG91ciBtZXNzYWdlIHJlc3BvbnNlCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJdGVzdAlTU1RBVDEsIFJFUUlOSVQJanogaW5iX25leHRfd2FpdDsKKwl0ZXN0CVNTVEFUMSwgU0NTSVBFUlIgam56IGluYl9uZXh0X3dhaXRfcGVycjsKK2luYl9uZXh0X2NoZWNrX3BoYXNlOgorCWFuZAlMQVNUUEhBU0UsIFBIQVNFX01BU0ssIFNDU0lTSUdJOworCWNtcAlMQVNUUEhBU0UsIFBfTUVTR0lOIGpuZSBtZXNnaW5fcGhhc2VtaXM7CitpbmJfZmlyc3Q6CisJbW92CURJTkRFWCxTSU5ERVg7CisJbW92CURJTkRJUixTQ1NJQlVTTAlyZXQ7CQkvKnJlYWQgYnl0ZSBkaXJlY3RseSBmcm9tIGJ1cyovCitpbmJfbGFzdDoKKwltb3YJTk9ORSxTQ1NJREFUTCByZXQ7CQkvKmR1bW15IHJlYWQgZnJvbSBsYXRjaCB0byBBQ0sqLworfQorCitpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworLyoKKyAqIENoYW5nZSB0byBhIG5ldyBwaGFzZS4gIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgc3RhdGUgb2YgdGhlIEkvTyBzaWduYWwsCisgKiBmcm9tIG91dCB0byBpbiwgd2FpdCBhbiBhZGRpdGlvbmFsIGRhdGEgcmVsZWFzZSBkZWxheSBiZWZvcmUgY29udGludWluZy4KKyAqLworY2hhbmdlX3BoYXNlOgorCS8qIFdhaXQgZm9yIHByZWNlZWRpbmcgSS9PIHNlc3Npb24gdG8gY29tcGxldGUuICovCisJdGVzdAlTQ1NJU0lHSSwgQUNLSSBqbnogLjsKKworCS8qIENoYW5nZSB0aGUgcGhhc2UgKi8KKwlhbmQJRElOREVYLCBJT0ksIFNDU0lTSUdJOworCW1vdglTQ1NJU0lHTywgU0lOREVYOworCWFuZAlBLCBJT0ksIFNJTkRFWDsKKworCS8qCisJICogSWYgdGhlIGRhdGEgZGlyZWN0aW9uIGhhcyBjaGFuZ2VkLCBmcm9tCisJICogb3V0IChpbml0aWF0b3IgZHJpdmluZykgdG8gaW4gKHRhcmdldCBkcml2aW5nKSwKKwkgKiB3ZSBtdXN0IHdhaXQgYXQgbGVhc3QgYSBkYXRhIHJlbGVhc2UgZGVsYXkgcGx1cworCSAqIHRoZSBub3JtYWwgYnVzIHNldHRsZSBkZWxheS4gW1NDU0kgSUlJIFNQSSAxMC4xMS4wXQorCSAqLworCWNtcCAJRElOREVYLCBBIGplIGNoYW5nZV9waGFzZV93YWl0OworCXRlc3QJU0lOREVYLCBJT0kganogY2hhbmdlX3BoYXNlX3dhaXQ7CisJY2FsbAljaGFuZ2VfcGhhc2Vfd2FpdDsKK2NoYW5nZV9waGFzZV93YWl0OgorCW5vcDsKKwlub3A7CisJbm9wOworCW5vcCByZXQ7CisKKy8qCisgKiBTZW5kIGEgYnl0ZSB0byBhbiBpbml0aWF0b3IgaW4gQXV0b21hdGljIFBJTyBtb2RlLgorICovCit0YXJnZXRfb3V0YjoKKwlvcglTWEZSQ1RMMCwgU1BJT0VOOworCXRlc3QJU1NUQVQwLCBTUElPUkRZCWp6IC47CisJbW92CVNDU0lEQVRMLCBTSU5ERVg7CisJdGVzdAlTU1RBVDAsIFNQSU9SRFkJanogLjsKKwlhbmQJU1hGUkNUTDAsIH5TUElPRU4gcmV0OworfQorCQorLyoKKyAqIExvY2F0ZSBhIGRpc2Nvbm5lY3RlZCBTQ0IgYnkgU0NCSUQuICBVcG9uIHJldHVybiwgU0NCUFRSIGFuZCBTSU5ERVggd2lsbAorICogYmUgc2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgU0NCLiAgSWYgdGhlIFNDQiBjYW5ub3QgYmUgZm91bmQgbG9jYWxseSwKKyAqIGl0IHdpbGwgYmUgcGFnZWQgaW4gZnJvbSBob3N0IG1lbW9yeS4gIFJFVFVSTl8yIHN0b3JlcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAqIHByZWNlZGluZyBTQ0IgaW4gdGhlIGRpc2Nvbm5lY3RlZCBsaXN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwCisgKiByZW1vdmFsIG9mIHRoZSBmb3VuZCBTQ0IgZnJvbSB0aGUgZGlzY29ubmVjdGVkIGxpc3QuCisgKi8KK2lmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworQkVHSU5fQ1JJVElDQUw7CitmaW5kU0NCOgorCW1vdglBLCBTSU5ERVg7CQkJLyogVGFnIHBhc3NlZCBpbiBTSU5ERVggKi8KKwljbXAJRElTQ09OTkVDVEVEX1NDQkgsIFNDQl9MSVNUX05VTEwgamUgZmluZFNDQl9ub3RGb3VuZDsKKwltb3YJU0NCUFRSLCBESVNDT05ORUNURURfU0NCSDsJLyogSW5pdGlhbGl6ZSBTQ0JQVFIgKi8KKwltdmkJQVJHXzIsIFNDQl9MSVNUX05VTEw7CQkvKiBIZWFkIG9mIGxpc3QgKi8KKwlqbXAJZmluZFNDQl9sb29wOworZmluZFNDQl9uZXh0OgorCWNtcAlTQ0JfTkVYVCwgU0NCX0xJU1RfTlVMTCBqZSBmaW5kU0NCX25vdEZvdW5kOworCW1vdglBUkdfMiwgU0NCUFRSOworCW1vdglTQ0JQVFIsU0NCX05FWFQ7CitmaW5kU0NCX2xvb3A6CisJY21wCVNDQl9UQUcsIEEJam5lIGZpbmRTQ0JfbmV4dDsKK3JlbV9zY2JfZnJvbV9kaXNjX2xpc3Q6CisJY21wCUFSR18yLCBTQ0JfTElTVF9OVUxMCWplIHJIZWFkOworCW1vdglESU5ERVgsIFNDQl9ORVhUOworCW1vdglTSU5ERVgsIFNDQlBUUjsKKwltb3YJU0NCUFRSLCBBUkdfMjsKKwltb3YJU0NCX05FWFQsIERJTkRFWDsKKwltb3YJU0NCUFRSLCBTSU5ERVggcmV0OworckhlYWQ6CisJbW92CURJU0NPTk5FQ1RFRF9TQ0JILFNDQl9ORVhUIHJldDsKK0VORF9DUklUSUNBTDsKK2ZpbmRTQ0Jfbm90Rm91bmQ6CisJLyoKKwkgKiBXZSBkaWRuJ3QgZmluZCBpdC4gIFBhZ2UgaW4gdGhlIFNDQi4KKwkgKi8KKwltb3YJQVJHXzEsIEE7IC8qIFNhdmUgdGFnICovCisJbW92CUFMTFpFUk9TIGNhbGwgZ2V0X2ZyZWVfb3JfZGlzY19zY2I7CisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CUFSR18xCWptcCBkbWFfc2NiOworfQorCisvKgorICogUHJlcGFyZSB0aGUgaGFyZHdhcmUgdG8gcG9zdCBhIGJ5dGUgdG8gaG9zdCBtZW1vcnkgZ2l2ZW4gYW4KKyAqIGluZGV4IG9mIChBICsgKDI1NiAqIFNJTkRFWCkpIGFuZCBhIGJhc2UgYWRkcmVzcyBvZiBTSEFSRURfREFUQV9BRERSLgorICovCitwb3N0X2J5dGVfc2V0dXA6CisJbW92CUFSR18yLCBTSU5ERVg7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCW12aQlESU5ERVgsIENDSEFERFI7CisJCW12aQlTSEFSRURfREFUQV9BRERSIGNhbGwJc2V0XzFieXRlX2FkZHI7CisJCW12aQlDQ0hDTlQsIDE7CisJCW12aQlDQ1NDQkNUTCwgQ0NTQ0JSRVNFVCByZXQ7CisJfSBlbHNlIHsKKwkJbXZpCURJTkRFWCwgSEFERFI7CisJCW12aQlTSEFSRURfREFUQV9BRERSIGNhbGwJc2V0XzFieXRlX2FkZHI7CisJCW12aQkxCWNhbGwgc2V0X2hjbnQ7CisJCW12aQlERkNOVFJMLCBGSUZPUkVTRVQgcmV0OworCX0KKworcG9zdF9ieXRlOgorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92CUNDU0NCUkFNLCBTSU5ERVgsIDE7CisJCW9yCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRE9ORSBqeiAuOworCQljbHIJQ0NTQ0JDVEwgcmV0OworCX0gZWxzZSB7CisJCW1vdglERkRBVCwgU0lOREVYOworCQlvcglERkNOVFJMLCBIRE1BRU58RklGT0ZMVVNIOworCQlqbXAJZG1hX2ZpbmlzaDsKKwl9CisKK3BoYXNlX2xvY2tfcGVycjoKKwltdmkJUEVSUl9ERVRFQ1RFRCBjYWxsIHNldF9zZXFpbnQ7CitwaGFzZV9sb2NrOiAgICAgCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhcml0eSBlcnJvciwgd2FpdCBmb3IgdGhlIGtlcm5lbCB0bworCSAqIHNlZSB0aGUgaW50ZXJydXB0IGFuZCBwcmVwYXJlIG91ciBtZXNzYWdlIHJlc3BvbnNlCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJdGVzdAlTU1RBVDEsIFJFUUlOSVQganogcGhhc2VfbG9jazsKKwl0ZXN0CVNTVEFUMSwgU0NTSVBFUlIgam56IHBoYXNlX2xvY2tfcGVycjsKK3BoYXNlX2xvY2tfbGF0Y2hfcGhhc2U6CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSA9PSAwKSB7CisJCWFuZAlTQ1NJU0lHTywgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJfQorCWFuZAlMQVNUUEhBU0UsIFBIQVNFX01BU0ssIFNDU0lTSUdJIHJldDsKKworaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKSB7CitzZXRfaGNudDoKKwltb3YJSENOVFswXSwgU0lOREVYOworY2xlYXJfaGNudDoKKwljbHIJSENOVFsxXTsKKwljbHIJSENOVFsyXSByZXQ7CisKK3NldF9zdGNudF9mcm9tX2hjbnQ6CisJbW92CVNUQ05UWzBdLCBIQ05UWzBdOworCW1vdglTVENOVFsxXSwgSENOVFsxXTsKKwltb3YJU1RDTlRbMl0sIEhDTlRbMl0gcmV0OworCitiY29weV84OgorCW1vdglESU5ESVIsIFNJTkRJUjsKK2Jjb3B5Xzc6CisJbW92CURJTkRJUiwgU0lORElSOworCW1vdglESU5ESVIsIFNJTkRJUjsKK2Jjb3B5XzU6CisJbW92CURJTkRJUiwgU0lORElSOworYmNvcHlfNDoKKwltb3YJRElORElSLCBTSU5ESVI7CitiY29weV8zOgorCW1vdglESU5ESVIsIFNJTkRJUjsKKwltb3YJRElORElSLCBTSU5ESVI7CisJbW92CURJTkRJUiwgU0lORElSIHJldDsKK30KKworaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApIHsKKy8qCisgKiBTZXR1cCBhZGRyIGFzc3VtaW5nIHRoYXQgQSBpcyBhbiBpbmRleCBpbnRvCisgKiBhbiBhcnJheSBvZiAzMmJ5dGUgb2JqZWN0cywgU0lOREVYIGNvbnRhaW5zCisgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoYXQgYXJyYXksIGFuZCBESU5ERVgKKyAqIGNvbnRhaW5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uCisgKiB0byBzdG9yZSB0aGUgaW5kZXhlZCBhZGRyZXNzLgorICovCitzZXRfMzJieXRlX2FkZHI6CisJc2hyCUFSR18yLCAzLCBBOworCXNobAlBLCA1OworCWptcAlzZXRfMWJ5dGVfYWRkcjsKK30KKworLyoKKyAqIFNldHVwIGFkZHIgYXNzdW1pbmcgdGhhdCBBIGlzIGFuIGluZGV4IGludG8KKyAqIGFuIGFycmF5IG9mIDY0Ynl0ZSBvYmplY3RzLCBTSU5ERVggY29udGFpbnMKKyAqIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhhdCBhcnJheSwgYW5kIERJTkRFWAorICogY29udGFpbnMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbG9jYXRpb24KKyAqIHRvIHN0b3JlIHRoZSBpbmRleGVkIGFkZHJlc3MuCisgKi8KK3NldF82NGJ5dGVfYWRkcjoKKwlzaHIJQVJHXzIsIDIsIEE7CisJc2hsCUEsIDY7CisKKy8qCisgKiBTZXR1cCBhZGRyIGFzc3VtaW5nIHRoYXQgQSArIChBUkdfMiAqIDI1NikgaXMgYW4KKyAqIGluZGV4IGludG8gYW4gYXJyYXkgb2YgMWJ5dGUgb2JqZWN0cywgU0lOREVYIGNvbnRhaW5zCisgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoYXQgYXJyYXksIGFuZCBESU5ERVggY29udGFpbnMKKyAqIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21wdXRlZAorICogYWRkcmVzcy4KKyAqLworc2V0XzFieXRlX2FkZHI6CisJYWRkICAgICBESU5ESVIsIEEsIFNJTkRJUjsKKwltb3YgICAgIEEsIEFSR18yOworCWFkYwlESU5ESVIsIEEsIFNJTkRJUjsKKwljbHIJQTsKKwlhZGMJRElORElSLCBBLCBTSU5ESVI7CisJYWRjCURJTkRJUiwgQSwgU0lORElSIHJldDsKKworLyoKKyAqIEVpdGhlciBwb3N0IG9yIGZldGNoIGFuIFNDQiBmcm9tIGhvc3QgbWVtb3J5IGJhc2VkIG9uIHRoZQorICogRElSRUNUSU9OIGJpdCBpbiBETUFQQVJBTVMuIFRoZSBob3N0IFNDQiBpbmRleCBpcyBpbiBTSU5ERVguCisgKi8KK2RtYV9zY2I6CisJbW92CUEsIFNJTkRFWDsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJbXZpCURJTkRFWCwgQ0NIQUREUjsKKwkJbXZpCUhTQ0JfQUREUiBjYWxsIHNldF82NGJ5dGVfYWRkcjsKKwkJbW92CUNDU0NCUFRSLCBTQ0JQVFI7CisJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04ganogZG1hX3NjYl90b2hvc3Q7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCQltdmkJQ0NIQ05ULCBTQ0JfRE9XTkxPQURfU0laRV82NDsKKwkJfSBlbHNlIHsKKwkJCW12aQlDQ0hDTlQsIFNDQl9ET1dOTE9BRF9TSVpFOworCQl9CisJCW12aQlDQ1NDQkNUTCwgQ0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSfENDU0NCUkVTRVQ7CisJCWNtcAlDQ1NDQkNUTCwgQ0NTQ0JET05FfEFSUkRPTkV8Q0NBUlJFTnxDQ1NDQkVOfENDU0NCRElSIGpuZSAuOworCQlqbXAJZG1hX3NjYl9maW5pc2g7CitkbWFfc2NiX3RvaG9zdDoKKwkJbXZpCUNDSENOVCwgU0NCX1VQTE9BRF9TSVpFOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQ7CisJCQlibW92CUNDU0NCUkFNLCBTQ0JfQkFTRSwgU0NCX1VQTE9BRF9TSVpFOworCQkJb3IJQ0NTQ0JDVEwsIENDU0NCRU58Q0NTQ0JSRVNFVDsKKwkJCXRlc3QJQ0NTQ0JDVEwsIENDU0NCRE9ORSBqeiAuOworCQl9IGVsc2UgaWYgKChhaGMtPmJ1Z3MgJiBBSENfU0NCQ0hBTl9VUExPQURfQlVHKSAhPSAwKSB7CisJCQltdmkJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JSRVNFVDsKKwkJCWNtcAlDQ1NDQkNUTCwgQVJSRE9ORXxDQ0FSUkVOIGpuZSAuOworCQkJbXZpCUNDSENOVCwgU0NCX1VQTE9BRF9TSVpFOworCQkJbXZpCUNDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQljbXAJQ0NTQ0JDVEwsIENDU0NCRE9ORXxDQ1NDQkVOIGpuZSAuOworCQl9IGVsc2UgeworCQkJbXZpCUNDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCRU58Q0NTQ0JSRVNFVDsKKwkJCWNtcAlDQ1NDQkNUTCwgQ0NTQ0JET05FfEFSUkRPTkV8Q0NBUlJFTnxDQ1NDQkVOIGpuZSAuOworCQl9CitkbWFfc2NiX2ZpbmlzaDoKKwkJY2xyCUNDU0NCQ1RMOworCQl0ZXN0CUNDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCRU4gam56IC47CisJCXJldDsKKwl9IGVsc2UgeworCQltdmkJRElOREVYLCBIQUREUjsKKwkJbXZpCUhTQ0JfQUREUiBjYWxsIHNldF82NGJ5dGVfYWRkcjsKKwkJbXZpCVNDQl9ET1dOTE9BRF9TSVpFIGNhbGwgc2V0X2hjbnQ7CisJCW1vdglERkNOVFJMLCBETUFQQVJBTVM7CisJCXRlc3QJRE1BUEFSQU1TLCBESVJFQ1RJT04Jam56IGRtYV9zY2JfZnJvbWhvc3Q7CisJCS8qIEZpbGwgaXQgd2l0aCB0aGUgU0NCIGRhdGEgKi8KK2NvcHlfc2NiX3RvZmlmbzoKKwkJbXZpCVNJTkRFWCwgU0NCX0JBU0U7CisJCWFkZAlBLCBTQ0JfRE9XTkxPQURfU0laRSwgU0lOREVYOworY29weV9zY2JfdG9maWZvX2xvb3A6CisJCWNhbGwJY29weV90b19maWZvXzg7CisJCWNtcAlTSU5ERVgsIEEgam5lIGNvcHlfc2NiX3RvZmlmb19sb29wOworCQlvcglERkNOVFJMLCBIRE1BRU58RklGT0ZMVVNIOworCQlqbXAJZG1hX2ZpbmlzaDsKK2RtYV9zY2JfZnJvbWhvc3Q6CisJCW12aQlESU5ERVgsIFNDQl9CQVNFOworCQlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfMl8xX1JFVFJZX0JVRykgIT0gMCkgeworCQkJLyoKKwkJCSAqIFRoZSBQQ0kgbW9kdWxlIHdpbGwgb25seSBpc3N1ZSBhIFBDSQorCQkJICogcmV0cnkgaWYgdGhlIGRhdGEgRklGTyBpcyBlbXB0eS4gIElmIHRoZQorCQkJICogaG9zdCBkaXNjb25uZWN0cyBpbiB0aGUgbWlkZGxlIG9mIGEKKwkJCSAqIHRyYW5zZmVyLCB3ZSBtdXN0IGVtcHR5IHRoZSBmaWZvIG9mIGFsbAorCQkJICogYXZhaWxhYmxlIGRhdGEgdG8gZm9yY2UgdGhlIGNoaXAgdG8KKwkJCSAqIGNvbnRpbnVlIHRoZSB0cmFuc2Zlci4gIFRoaXMgZG9lcyBub3QKKwkJCSAqIGhhcHBlbiBmb3IgU0NTSSB0cmFuc2ZlcnMgYXMgdGhlIFNDU0kgbW9kdWxlCisJCQkgKiB3aWxsIGRyYWluIHRoZSBGSUZPIGFzIGRhdGEgYXJlIG1hZGUgYXZhaWxhYmxlLgorCQkJICogV2hlbiB0aGUgaGFuZyBvY2N1cnMsIHdlIGtub3cgdGhhdCBhIG11bHRpcGxlCisJCQkgKiBvZiA4IGJ5dGVzIGlzIGluIHRoZSBGSUZPIGJlY2F1c2UgdGhlIFBDSQorCQkJICogbW9kdWxlIGhhcyBhbiA4IGJ5dGUgaW5wdXQgbGF0Y2ggdGhhdCBvbmx5CisJCQkgKiBkdW1wcyB0byB0aGUgRklGTyB3aGVuIEhDTlQgPT0gMCBvciB0aGUKKwkJCSAqIGxhdGNoIGlzIGZ1bGwuCisJCQkgKi8KKwkJCWNscglBOworCQkJLyogV2FpdCBmb3IgYXQgbGVhc3QgOCBieXRlcyBvZiBkYXRhIHRvIGFycml2ZS4gKi8KK2RtYV9zY2JfaGFuZ19maWZvOgorCQkJdGVzdAlERlNUQVRVUywgRklGT1FXREVNUCBqbnogZG1hX3NjYl9oYW5nX2ZpZm87CitkbWFfc2NiX2hhbmdfd2FpdDoKKwkJCXRlc3QJREZTVEFUVVMsIE1SRVFQRU5EIGpueiBkbWFfc2NiX2hhbmdfd2FpdDsKKwkJCXRlc3QJREZTVEFUVVMsIEhET05FCWpueiBkbWFfc2NiX2hhbmdfZG1hX2RvbmU7CisJCQl0ZXN0CURGU1RBVFVTLCBIRE9ORQlqbnogZG1hX3NjYl9oYW5nX2RtYV9kb25lOworCQkJdGVzdAlERlNUQVRVUywgSERPTkUJam56IGRtYV9zY2JfaGFuZ19kbWFfZG9uZTsKKwkJCS8qCisJCQkgKiBUaGUgUENJIG1vZHVsZSBubyBsb25nZXIgaW50ZW5kcyB0byBwZXJmb3JtCisJCQkgKiBhIFBDSSB0cmFuc2FjdGlvbi4gIERyYWluIHRoZSBmaWZvLgorCQkJICovCitkbWFfc2NiX2hhbmdfZG1hX2RyYWluX2ZpZm86CisJCQlub3QJQSwgSENOVDsKKwkJCWFkZAlBLCBTQ0JfRE9XTkxPQURfU0laRStTQ0JfQkFTRSsxOworCQkJYW5kCUEsIH4weDc7CisJCQltb3YJRElORElSLERGREFUOworCQkJY21wCURJTkRFWCwgQSBqbmUgLiAtIDE7CisJCQljbXAJRElOREVYLCBTQ0JfRE9XTkxPQURfU0laRStTQ0JfQkFTRQorCQkJCWplCWRtYV9maW5pc2hfbm93YWl0OworCQkJLyogUmVzdG9yZSBBIGFzIHRoZSBsaW5lcyBsZWZ0IHRvIHRyYW5zZmVyLiAqLworCQkJYWRkCUEsIC1TQ0JfQkFTRSwgRElOREVYOworCQkJc2hyCUEsIDM7CisJCQlqbXAJZG1hX3NjYl9oYW5nX2ZpZm87CitkbWFfc2NiX2hhbmdfZG1hX2RvbmU6CisJCQlhbmQJREZDTlRSTCwgfkhETUFFTjsKKwkJCXRlc3QJREZDTlRSTCwgSERNQUVOIGpueiAuOworCQkJYWRkCVNFUUFERFIwLCBBOworCQl9IGVsc2UgeworCQkJY2FsbAlkbWFfZmluaXNoOworCQl9CisJCWNhbGwJZGZkYXRfaW5fODsKKwkJY2FsbAlkZmRhdF9pbl84OworCQljYWxsCWRmZGF0X2luXzg7CitkZmRhdF9pbl84OgorCQltb3YJRElORElSLERGREFUOworZGZkYXRfaW5fNzoKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKKwkJbW92CURJTkRJUixERkRBVDsKK2RmZGF0X2luXzI6CisJCW1vdglESU5ESVIsREZEQVQ7CisJCW1vdglESU5ESVIsREZEQVQgcmV0OworCX0KKworY29weV90b19maWZvXzg6CisJbW92CURGREFULFNJTkRJUjsKKwltb3YJREZEQVQsU0lORElSOworY29weV90b19maWZvXzY6CisJbW92CURGREFULFNJTkRJUjsKK2NvcHlfdG9fZmlmb181OgorCW1vdglERkRBVCxTSU5ESVI7Citjb3B5X3RvX2ZpZm9fNDoKKwltb3YJREZEQVQsU0lORElSOworCW1vdglERkRBVCxTSU5ESVI7CisJbW92CURGREFULFNJTkRJUjsKKwltb3YJREZEQVQsU0lORElSIHJldDsKKworLyoKKyAqIFdhaXQgZm9yIERNQSBmcm9tIGhvc3QgbWVtb3J5IHRvIGRhdGEgRklGTyB0byBjb21wbGV0ZSwgdGhlbiBkaXNhYmxlCisgKiBETUEgYW5kIHdhaXQgZm9yIGl0IHRvIGFja25vd2xlZGdlIHRoYXQgaXQncyBvZmYuCisgKi8KK2RtYV9maW5pc2g6CisJdGVzdAlERlNUQVRVUyxIRE9ORQlqeiBkbWFfZmluaXNoOworZG1hX2ZpbmlzaF9ub3dhaXQ6CisJLyogVHVybiBvZmYgRE1BICovCisJYW5kCURGQ05UUkwsIH5IRE1BRU47CisJdGVzdAlERkNOVFJMLCBIRE1BRU4gam56IC47CisJcmV0OworCisvKgorICogUmVzdG9yZSBhbiBTQ0IgdGhhdCBmYWlsZWQgdG8gbWF0Y2ggYW4gaW5jb21pbmcgcmVzZWxlY3Rpb24KKyAqIHRvIHRoZSBjb3JyZWN0L3NhZmUgc3RhdGUuICBJZiB0aGUgU0NCIGlzIGZvciBhIGRpc2Nvbm5lY3RlZAorICogdHJhbnNhY3Rpb24sIGl0IG11c3QgYmUgcmV0dXJuZWQgdG8gdGhlIGRpc2Nvbm5lY3RlZCBsaXN0LgorICogSWYgaXQgaXMgbm90IGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUsIGl0IG11c3QgYmUgZnJlZS4KKyAqLworY2xlYW51cF9zY2I6CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCXRlc3QJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEIGpueiBhZGRfc2NiX3RvX2Rpc2NfbGlzdDsKKwl9CithZGRfc2NiX3RvX2ZyZWVfbGlzdDoKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApIHsKK0JFR0lOX0NSSVRJQ0FMOworCQltb3YJU0NCX05FWFQsIEZSRUVfU0NCSDsKKwkJbXZpCVNDQl9UQUcsIFNDQl9MSVNUX05VTEw7CisJCW1vdglGUkVFX1NDQkgsIFNDQlBUUiByZXQ7CitFTkRfQ1JJVElDQUw7CisJfSBlbHNlIHsKKwkJbXZpCVNDQl9UQUcsIFNDQl9MSVNUX05VTEwgcmV0OworCX0KKworaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKK3NldF9oaGFkZHI6CisJb3IJRFNDT01NQU5EMSwgSEFERExEU0VMMDsKKwlhbmQJSEFERFIsIFNHX0hJR0hfQUREUl9CSVRTLCBTSU5ERVg7CisJYW5kCURTQ09NTUFORDEsIH5IQURETERTRUwwIHJldDsKK30KKworaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CitnZXRfZnJlZV9vcl9kaXNjX3NjYjoKK0JFR0lOX0NSSVRJQ0FMOworCWNtcAlGUkVFX1NDQkgsIFNDQl9MSVNUX05VTEwgam5lIGRlcXVldWVfZnJlZV9zY2I7CisJY21wCURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTElTVF9OVUxMIGpuZSBkZXF1ZXVlX2Rpc2Nfc2NiOworcmV0dXJuX2Vycm9yOgorCW12aQlOT19GUkVFX1NDQiBjYWxsIHNldF9zZXFpbnQ7CisJbXZpCVNJTkRFWCwgU0NCX0xJU1RfTlVMTAlyZXQ7CitkZXF1ZXVlX2Rpc2Nfc2NiOgorCW1vdglTQ0JQVFIsIERJU0NPTk5FQ1RFRF9TQ0JIOworCW1vdglESVNDT05ORUNURURfU0NCSCwgU0NCX05FWFQ7CitFTkRfQ1JJVElDQUw7CisJbXZpCURNQVBBUkFNUywgRklGT1JFU0VUOworCW1vdglTQ0JfVEFHCWptcCBkbWFfc2NiOworQkVHSU5fQ1JJVElDQUw7CitkZXF1ZXVlX2ZyZWVfc2NiOgorCW1vdglTQ0JQVFIsIEZSRUVfU0NCSDsKKwltb3YJRlJFRV9TQ0JILCBTQ0JfTkVYVCByZXQ7CitFTkRfQ1JJVElDQUw7CisKK2FkZF9zY2JfdG9fZGlzY19saXN0OgorLyoKKyAqIExpbmsgdGhpcyBTQ0IgaW50byB0aGUgRElTQ09OTkVDVEVEIGxpc3QuICBUaGlzIGxpc3QgaG9sZHMgdGhlCisgKiBjYW5kaWRhdGVzIGZvciBwYWdpbmcgb3V0IGFuIFNDQiBpZiBvbmUgaXMgbmVlZGVkIGZvciBhIG5ldyBjb21tYW5kLgorICogTW9kaWZ5aW5nIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBpcyBhIGNyaXRpY2FsKHBhdXNlIGRpc3NhYmxlZCkgc2VjdGlvbi4KKyAqLworQkVHSU5fQ1JJVElDQUw7CisJbW92CVNDQl9ORVhULCBESVNDT05ORUNURURfU0NCSDsKKwltb3YJRElTQ09OTkVDVEVEX1NDQkgsIFNDQlBUUiByZXQ7CitFTkRfQ1JJVElDQUw7Cit9CitzZXRfc2VxaW50OgorCW1vdglJTlRTVEFULCBTSU5ERVg7CisJbm9wOworcmV0dXJuOgorCXJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfOTNjeDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhkNjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5jCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogSW50ZXJmYWNlIGZvciB0aGUgOTNDNjYvNTYvNDYvMjYvMDYgc2VyaWFsIGVlcHJvbSBwYXJ0cy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgRGFuaWVsIE0uIEVpc2NoZW4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4XzkzY3g2LmMjMTcgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKy8qCisgKiAgIFRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIDkzQzY2LzU2LzQ2LzI2LzA2IGNoaXBzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgICAgICAgICAgU3RhcnQgIE9QCSAgICAqCisgKiAgICAgRnVuY3Rpb24gICBCaXQgIENvZGUgIEFkZHJlc3MqKiAgRGF0YSAgICAgRGVzY3JpcHRpb24KKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgUkVBRCAgICAgICAgMSAgICAxMCAgIEE1IC0gQTAgICAgICAgICAgICAgUmVhZHMgZGF0YSBzdG9yZWQgaW4gbWVtb3J5LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHNwZWNpZmllZCBhZGRyZXNzCisgKiAgICAgRVdFTiAgICAgICAgMSAgICAwMCAgIDExWFhYWCAgICAgICAgICAgICAgV3JpdGUgZW5hYmxlIG11c3QgcHJlY2VkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBwcm9ncmFtbWluZyBtb2RlcworICogICAgIEVSQVNFICAgICAgIDEgICAgMTEgICBBNSAtIEEwICAgICAgICAgICAgIEVyYXNlIHJlZ2lzdGVyIEE1QTRBM0EyQTFBMAorICogICAgIFdSSVRFICAgICAgIDEgICAgMDEgICBBNSAtIEEwICAgRDE1IC0gRDAgIFdyaXRlcyByZWdpc3RlcgorICogICAgIEVSQUwgICAgICAgIDEgICAgMDAgICAxMFhYWFggICAgICAgICAgICAgIEVyYXNlIGFsbCByZWdpc3RlcnMKKyAqICAgICBXUkFMICAgICAgICAxICAgIDAwICAgMDFYWFhYICAgIEQxNSAtIEQwICBXcml0ZXMgdG8gYWxsIHJlZ2lzdGVycworICogICAgIEVXRFMgICAgICAgIDEgICAgMDAgICAwMFhYWFggICAgICAgICAgICAgIERpc2FibGVzIGFsbCBwcm9ncmFtbWluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucworICogICAgICpOb3RlOiBBIHZhbHVlIG9mIFggZm9yIGFkZHJlc3MgaXMgYSBkb24ndCBjYXJlIGNvbmRpdGlvbi4KKyAqICAgICoqTm90ZTogVGhlcmUgYXJlIDggYWRkcmVzcyBiaXRzIGZvciB0aGUgOTNDNTYvNjYgY2hpcHMgdW5saWtlCisgKgkgICAgICB0aGUgOTNDNDYvMjYvMDYgY2hpcHMgd2hpY2ggaGF2ZSA2IGFkZHJlc3MgYml0cy4KKyAqCisgKiAgIFRoZSA5M0M0NiBoYXMgYSBmb3VyIHdpcmUgaW50ZXJmYWNlOiBjbG9jaywgY2hpcCBzZWxlY3QsIGRhdGEgaW4sIGFuZAorICogICBkYXRhIG91dC4gIEluIG9yZGVyIHRvIHBlcmZvcm0gb25lIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMsIHlvdSBuZWVkCisgKiAgIHRvIGVuYWJsZSB0aGUgY2hpcCBzZWxlY3QgZm9yIGEgY2xvY2sgcGVyaW9kICh0eXBpY2FsbHkgYSBtaW5pbXVtIG9mCisgKiAgIDEgdXNlYywgd2l0aCB0aGUgY2xvY2sgaGlnaCBhbmQgbG93IGEgbWluaW11bSBvZiA3NTAgYW5kIDI1MCBuc2VjCisgKiAgIHJlc3BlY3RpdmVseSkuICBXaGlsZSB0aGUgY2hpcCBzZWxlY3QgcmVtYWlucyBoaWdoLCB5b3UgY2FuIGNsb2NrIGluCisgKiAgIHRoZSBpbnN0cnVjdGlvbnMgKGFib3ZlKSBzdGFydGluZyB3aXRoIHRoZSBzdGFydCBiaXQsIGZvbGxvd2VkIGJ5IHRoZQorICogICBPUCBjb2RlLCBBZGRyZXNzLCBhbmQgRGF0YSAoaWYgbmVlZGVkKS4gIEZvciB0aGUgUkVBRCBpbnN0cnVjdGlvbiwgdGhlCisgKiAgIHJlcXVlc3RlZCAxNi1iaXQgcmVnaXN0ZXIgY29udGVudHMgaXMgcmVhZCBmcm9tIHRoZSBkYXRhIG91dCBsaW5lIGJ1dAorICogICBpcyBwcmVjZWRlZCBieSBhbiBpbml0aWFsIHplcm8gKGxlYWRpbmcgMCwgZm9sbG93ZWQgYnkgMTYtYml0cywgTVNCCisgKiAgIGZpcnN0KS4gIFRoZSBjbG9jayBjeWNsaW5nIGZyb20gbG93IHRvIGhpZ2ggaW5pdGlhdGVzIHRoZSBuZXh0IGRhdGEKKyAqICAgYml0IHRvIGJlIHNlbnQgZnJvbSB0aGUgY2hpcC4KKyAqCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljN3h4eF9pbmxpbmUuaCIKKyNpbmNsdWRlICJhaWM3eHh4XzkzY3g2LmgiCisjZWxzZQorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfb3NtLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3eHh4XzkzY3g2Lmg+CisjZW5kaWYKKworLyoKKyAqIFJpZ2h0IG5vdywgd2Ugb25seSBoYXZlIHRvIHJlYWQgdGhlIFNFRVBST00uICBCdXQgd2UgbWFrZSBpdCBlYXNpZXIgdG8KKyAqIGFkZCBvdGhlciA5M0N4NiBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgeworICAJdWludDhfdCBsZW47CisgCXVpbnQ4X3QgYml0c1s5XTsKK30gc2VlcHJvbV9yZWFkID0gezMsIHsxLCAxLCAwfX07CisKK3N0YXRpYyBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9ld2VuID0gezksIHsxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwfX07CitzdGF0aWMgc3RydWN0IHNlZXByb21fY21kIHNlZXByb21fZXdkcyA9IHs5LCB7MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH19Oworc3RhdGljIHN0cnVjdCBzZWVwcm9tX2NtZCBzZWVwcm9tX3dyaXRlID0gezMsIHsxLCAwLCAxfX07CisKKy8qCisgKiBXYWl0IGZvciB0aGUgU0VFUkRZIHRvIGdvIGhpZ2g7IGFib3V0IDgwMCBucy4KKyAqLworI2RlZmluZSBDTE9DS19QVUxTRShzZCwgcmR5KQkJCQlcCisJd2hpbGUgKChTRUVQUk9NX1NUQVRVU19JTkIoc2QpICYgcmR5KSA9PSAwKSB7CVwKKwkJOyAgLyogRG8gbm90aGluZyAqLwkJCVwKKwl9CQkJCQkJXAorCSh2b2lkKVNFRVBST01fSU5CKHNkKTsJLyogQ2xlYXIgY2xvY2sgKi8KKworLyoKKyAqIFNlbmQgYSBTVEFSVCBjb25kaXRpb24gYW5kIHRoZSBnaXZlbiBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitzZW5kX3NlZXByb21fY21kKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLCBzdHJ1Y3Qgc2VlcHJvbV9jbWQgKmNtZCkKK3sKKwl1aW50OF90IHRlbXA7CisJaW50IGkgPSAwOworCisJLyogU2VuZCBjaGlwIHNlbGVjdCBmb3Igb25lIGNsb2NrIGN5Y2xlLiAqLworCXRlbXAgPSBzZC0+c2RfTVMgXiBzZC0+c2RfQ1M7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5sZW47IGkrKykgeworCQlpZiAoY21kLT5iaXRzW2ldICE9IDApCisJCQl0ZW1wIF49IHNkLT5zZF9ETzsKKwkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQlTRUVQUk9NX09VVEIoc2QsIHRlbXAgXiBzZC0+c2RfQ0spOworCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCWlmIChjbWQtPmJpdHNbaV0gIT0gMCkKKwkJCXRlbXAgXj0gc2QtPnNkX0RPOworCX0KK30KKworLyoKKyAqIENsZWFyIENTIHB1dCB0aGUgY2hpcCBpbiB0aGUgcmVzZXQgc3RhdGUsIHdoZXJlIGl0IGNhbiB3YWl0IGZvciBuZXcgY29tbWFuZHMuCisgKi8KK3N0YXRpYyB2b2lkCityZXNldF9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkKQoreworCXVpbnQ4X3QgdGVtcDsKKworCXRlbXAgPSBzZC0+c2RfTVM7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBhbmQgMCBpZgorICogbm90IHN1Y2Nlc3NmdWwuCisgKi8KK2ludAorYWhjX3JlYWRfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwgdWludDE2X3QgKmJ1ZiwKKwkJIHVfaW50IHN0YXJ0X2FkZHIsIHVfaW50IGNvdW50KQoreworCWludCBpID0gMDsKKwl1X2ludCBrID0gMDsKKwl1aW50MTZfdCB2OworCXVpbnQ4X3QgdGVtcDsKKworCS8qCisJICogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVycyBvZiB0aGUgc2VlcHJvbS4gIFRoZSBsb29wCisJICogd2lsbCByYW5nZSBmcm9tIDAgdG8gY291bnQtMS4KKwkgKi8KKwlmb3IgKGsgPSBzdGFydF9hZGRyOyBrIDwgY291bnQgKyBzdGFydF9hZGRyOyBrKyspIHsKKwkJLyoKKwkJICogTm93IHdlJ3JlIHJlYWR5IHRvIHNlbmQgdGhlIHJlYWQgY29tbWFuZCBmb2xsb3dlZCBieSB0aGUKKwkJICogYWRkcmVzcyBvZiB0aGUgMTYtYml0IHJlZ2lzdGVyIHdlIHdhbnQgdG8gcmVhZC4KKwkJICovCisJCXNlbmRfc2VlcHJvbV9jbWQoc2QsICZzZWVwcm9tX3JlYWQpOworCisJCS8qIFNlbmQgdGhlIDYgb3IgOCBiaXQgYWRkcmVzcyAoTVNCIGZpcnN0LCBMU0IgbGFzdCkuICovCisJCXRlbXAgPSBzZC0+c2RfTVMgXiBzZC0+c2RfQ1M7CisJCWZvciAoaSA9IChzZC0+c2RfY2hpcCAtIDEpOyBpID49IDA7IGktLSkgeworCQkJaWYgKChrICYgKDEgPDwgaSkpICE9IDApCisJCQkJdGVtcCBePSBzZC0+c2RfRE87CisJCQlTRUVQUk9NX09VVEIoc2QsIHRlbXApOworCQkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwkJCUNMT0NLX1BVTFNFKHNkLCBzZC0+c2RfUkRZKTsKKwkJCWlmICgoayAmICgxIDw8IGkpKSAhPSAwKQorCQkJCXRlbXAgXj0gc2QtPnNkX0RPOworCQl9CisKKwkJLyoKKwkJICogTm93IHJlYWQgdGhlIDE2IGJpdCByZWdpc3Rlci4gIEFuIGluaXRpYWwgMCBwcmVjZWRlcyB0aGUKKwkJICogcmVnaXN0ZXIgY29udGVudHMgd2hpY2ggYmVnaW5zIHdpdGggYml0IDE1IChNU0IpIGFuZCBlbmRzCisJCSAqIHdpdGggYml0IDAgKExTQikuICBUaGUgaW5pdGlhbCAwIHdpbGwgYmUgc2hpZnRlZCBvZmYgdGhlCisJCSAqIHRvcCBvZiBvdXIgd29yZCBhcyB3ZSBsZXQgdGhlIGxvb3AgcnVuIGZyb20gMCB0byAxNi4KKwkJICovCisJCXYgPSAwOworCQlmb3IgKGkgPSAxNjsgaSA+PSAwOyBpLS0pIHsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCQl2IDw8PSAxOworCQkJaWYgKFNFRVBST01fREFUQV9JTkIoc2QpICYgc2QtPnNkX0RJKQorCQkJCXYgfD0gMTsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCBeIHNkLT5zZF9DSyk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCX0KKworCQlidWZbayAtIHN0YXJ0X2FkZHJdID0gdjsKKworCQkvKiBSZXNldCB0aGUgY2hpcCBzZWxlY3QgZm9yIHRoZSBuZXh0IGNvbW1hbmQgY3ljbGUuICovCisJCXJlc2V0X3NlZXByb20oc2QpOworCX0KKyNpZmRlZiBBSENfRFVNUF9FRVBST00KKwlwcmludGYoIlxuU2VyaWFsIEVFUFJPTTpcblx0Iik7CisJZm9yIChrID0gMDsgayA8IGNvdW50OyBrID0gayArIDEpIHsKKwkJaWYgKCgoayAlIDgpID09IDApICYmIChrICE9IDApKSB7CisJCQlwcmludGYgKCJcblx0Iik7CisJCX0KKwkJcHJpbnRmICgiIDB4JXgiLCBidWZba10pOworCX0KKwlwcmludGYgKCJcbiIpOworI2VuZGlmCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm4gMSBpZiBzdWNjZXNzZnVsIGFuZCAwIGlmCisgKiBub3Qgc3VjY2Vzc2Z1bC4KKyAqLworaW50CithaGNfd3JpdGVfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwgdWludDE2X3QgKmJ1ZiwKKwkJICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCkKK3sKKwl1aW50MTZfdCB2OworCXVpbnQ4X3QgdGVtcDsKKwlpbnQgaSwgazsKKworCS8qIFBsYWNlIHRoZSBjaGlwIGludG8gd3JpdGUtZW5hYmxlIG1vZGUgKi8KKwlzZW5kX3NlZXByb21fY21kKHNkLCAmc2VlcHJvbV9ld2VuKTsKKwlyZXNldF9zZWVwcm9tKHNkKTsKKworCS8qIFdyaXRlIGFsbCByZXF1ZXN0ZWQgZGF0YSBvdXQgdG8gdGhlIHNlZXByb20uICovCisJdGVtcCA9IHNkLT5zZF9NUyBeIHNkLT5zZF9DUzsKKwlmb3IgKGsgPSBzdGFydF9hZGRyOyBrIDwgY291bnQgKyBzdGFydF9hZGRyOyBrKyspIHsKKwkJLyogU2VuZCB0aGUgd3JpdGUgY29tbWFuZCAqLworCQlzZW5kX3NlZXByb21fY21kKHNkLCAmc2VlcHJvbV93cml0ZSk7CisKKwkJLyogU2VuZCB0aGUgNiBvciA4IGJpdCBhZGRyZXNzIChNU0IgZmlyc3QpLiAqLworCQlmb3IgKGkgPSAoc2QtPnNkX2NoaXAgLSAxKTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICgoayAmICgxIDw8IGkpKSAhPSAwKQorCQkJCXRlbXAgXj0gc2QtPnNkX0RPOworCQkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwkJCUNMT0NLX1BVTFNFKHNkLCBzZC0+c2RfUkRZKTsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCBeIHNkLT5zZF9DSyk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCQlpZiAoKGsgJiAoMSA8PCBpKSkgIT0gMCkKKwkJCQl0ZW1wIF49IHNkLT5zZF9ETzsKKwkJfQorCisJCS8qIFdyaXRlIHRoZSAxNiBiaXQgdmFsdWUsIE1TQiBmaXJzdCAqLworCQl2ID0gYnVmW2sgLSBzdGFydF9hZGRyXTsKKwkJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoKHYgJiAoMSA8PCBpKSkgIT0gMCkKKwkJCQl0ZW1wIF49IHNkLT5zZF9ETzsKKwkJCVNFRVBST01fT1VUQihzZCwgdGVtcCk7CisJCQlDTE9DS19QVUxTRShzZCwgc2QtPnNkX1JEWSk7CisJCQlTRUVQUk9NX09VVEIoc2QsIHRlbXAgXiBzZC0+c2RfQ0spOworCQkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQkJaWYgKCh2ICYgKDEgPDwgaSkpICE9IDApCisJCQkJdGVtcCBePSBzZC0+c2RfRE87CisJCX0KKworCQkvKiBXYWl0IGZvciB0aGUgY2hpcCB0byBjb21wbGV0ZSB0aGUgd3JpdGUgKi8KKwkJdGVtcCA9IHNkLT5zZF9NUzsKKwkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wKTsKKwkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQl0ZW1wID0gc2QtPnNkX01TIF4gc2QtPnNkX0NTOworCQlkbyB7CisJCQlTRUVQUk9NX09VVEIoc2QsIHRlbXApOworCQkJQ0xPQ0tfUFVMU0Uoc2QsIHNkLT5zZF9SRFkpOworCQkJU0VFUFJPTV9PVVRCKHNkLCB0ZW1wIF4gc2QtPnNkX0NLKTsKKwkJCUNMT0NLX1BVTFNFKHNkLCBzZC0+c2RfUkRZKTsKKwkJfSB3aGlsZSAoKFNFRVBST01fREFUQV9JTkIoc2QpICYgc2QtPnNkX0RJKSA9PSAwKTsKKworCQlyZXNldF9zZWVwcm9tKHNkKTsKKwl9CisKKwkvKiBQdXQgdGhlIGNoaXAgYmFjayBpbnRvIHdyaXRlLXByb3RlY3QgbW9kZSAqLworCXNlbmRfc2VlcHJvbV9jbWQoc2QsICZzZWVwcm9tX2V3ZHMpOworCXJlc2V0X3NlZXByb20oc2QpOworCisJcmV0dXJuICgxKTsKK30KKworaW50CithaGNfdmVyaWZ5X2Nrc3VtKHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MpCit7CisJaW50IGk7CisJaW50IG1heGFkZHI7CisJdWludDMyX3QgY2hlY2tzdW07CisJdWludDE2X3QgKnNjYXJyYXk7CisKKwltYXhhZGRyID0gKHNpemVvZigqc2MpLzIpIC0gMTsKKwljaGVja3N1bSA9IDA7CisJc2NhcnJheSA9ICh1aW50MTZfdCAqKXNjOworCisJZm9yIChpID0gMDsgaSA8IG1heGFkZHI7IGkrKykKKwkJY2hlY2tzdW0gPSBjaGVja3N1bSArIHNjYXJyYXlbaV07CisJaWYgKGNoZWNrc3VtID09IDAKKwkgfHwgKGNoZWNrc3VtICYgMHhGRkZGKSAhPSBzYy0+Y2hlY2tzdW0pIHsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oMSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF85M2N4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWM0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4XzkzY3g2LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBJbnRlcmZhY2UgdG8gdGhlIDkzQzQ2LzU2IHNlcmlhbCBFRVBST00gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIEJJT1MKKyAqIHNldHRpbmdzIGZvciB0aGUgYWljN3h4eCBiYXNlZCBhZGFwdGVjIFNDU0kgY29udHJvbGxlcnMuICBJdCBjYW4KKyAqIGFsc28gYmUgdXNlZCBmb3IgOTNDMjYgYW5kIDkzQzA2IHNlcmlhbCBFRVBST01TLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMjAwMCBKdXN0aW4gVC4gR2liYnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4XzkzY3g2LmgjMTIgJAorICoKKyAqICRGcmVlQlNEJAorICovCisjaWZuZGVmIF9BSUM3WFhYXzkzQ1g2X0hfCisjZGVmaW5lIF9BSUM3WFhYXzkzQ1g2X0hfCisKK3R5cGVkZWYgZW51bSB7CisJQzQ2ID0gNiwKKwlDNTZfNjYgPSA4Cit9IHNlZXByb21fY2hpcF90OworCitzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgYWhjX3NvZnRjICpzZF9haGM7CisJdV9pbnQgc2RfY29udHJvbF9vZmZzZXQ7CisJdV9pbnQgc2Rfc3RhdHVzX29mZnNldDsKKwl1X2ludCBzZF9kYXRhb3V0X29mZnNldDsKKwlzZWVwcm9tX2NoaXBfdCBzZF9jaGlwOworCXVpbnQxNl90IHNkX01TOworCXVpbnQxNl90IHNkX1JEWTsKKwl1aW50MTZfdCBzZF9DUzsKKwl1aW50MTZfdCBzZF9DSzsKKwl1aW50MTZfdCBzZF9ETzsKKwl1aW50MTZfdCBzZF9ESTsKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCBjb3VudCAxNi1iaXQgd29yZHMgZnJvbSB0aGUgc2VyaWFsIEVFUFJPTSBhbmQKKyAqIHJldHVybiB0aGVpciB2YWx1ZSBpbiBidWYuICBUaGUgcG9ydCBhZGRyZXNzIG9mIHRoZSBhaWM3eHh4IHNlcmlhbCBFRVBST00KKyAqIGNvbnRyb2wgcmVnaXN0ZXIgaXMgcGFzc2VkIGluIGFzIG9mZnNldC4gIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUKKyAqIGFsc28gcGFzc2VkIGluOgorICoKKyAqICAgQ1MgIC0gQ2hpcCBzZWxlY3QKKyAqICAgQ0sgIC0gQ2xvY2sKKyAqICAgRE8gIC0gRGF0YSBvdXQKKyAqICAgREkgIC0gRGF0YSBpbgorICogICBSRFkgLSBTRUVQUk9NIHJlYWR5CisgKiAgIE1TICAtIE1lbW9yeSBwb3J0IG1vZGUgc2VsZWN0CisgKgorICogIEEgZmFpbGVkIHJlYWQgYXR0ZW1wdCByZXR1cm5zIDAsIGFuZCBhIHN1Y2Nlc3NmdWwgcmVhZCByZXR1cm5zIDEuCisgKi8KKworI2RlZmluZQlTRUVQUk9NX0lOQihzZCkgXAorCWFoY19pbmIoc2QtPnNkX2FoYywgc2QtPnNkX2NvbnRyb2xfb2Zmc2V0KQorI2RlZmluZQlTRUVQUk9NX09VVEIoc2QsIHZhbHVlKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWFoY19vdXRiKHNkLT5zZF9haGMsIHNkLT5zZF9jb250cm9sX29mZnNldCwgdmFsdWUpOwlcCisJYWhjX2ZsdXNoX2RldmljZV93cml0ZXMoc2QtPnNkX2FoYyk7CQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lCVNFRVBST01fU1RBVFVTX0lOQihzZCkgXAorCWFoY19pbmIoc2QtPnNkX2FoYywgc2QtPnNkX3N0YXR1c19vZmZzZXQpCisjZGVmaW5lCVNFRVBST01fREFUQV9JTkIoc2QpIFwKKwlhaGNfaW5iKHNkLT5zZF9haGMsIHNkLT5zZF9kYXRhb3V0X29mZnNldCkKKworaW50IGFoY19yZWFkX3NlZXByb20oc3RydWN0IHNlZXByb21fZGVzY3JpcHRvciAqc2QsIHVpbnQxNl90ICpidWYsCisJCSAgICAgdV9pbnQgc3RhcnRfYWRkciwgdV9pbnQgY291bnQpOworaW50IGFoY193cml0ZV9zZWVwcm9tKHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLCB1aW50MTZfdCAqYnVmLAorCQkgICAgICB1X2ludCBzdGFydF9hZGRyLCB1X2ludCBjb3VudCk7CitpbnQgYWhjX3ZlcmlmeV9ja3N1bShzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKKworI2VuZGlmIC8qIF9BSUM3WFhYXzkzQ1g2X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmI0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwpAQCAtMCwwICsxLDc0NTEgQEAKKy8qCisgKiBDb3JlIHJvdXRpbmVzIGFuZCB0YWJsZXMgc2hhcmVhYmxlIGFjcm9zcyBPUyBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDIgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LmMjMTM0ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKKyNpbmNsdWRlICJhaWM3eHh4X2lubGluZS5oIgorI2luY2x1ZGUgImFpY2FzbS9haWNhc21faW5zZm9ybWF0LmgiCisjZWxzZQorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfb3NtLmg+CisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWNhc20vYWljYXNtX2luc2Zvcm1hdC5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29mdGMgRGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3NvZnRjX3RhaWxxIGFoY190YWlscSA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIoYWhjX3RhaWxxKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvb2t1cCBUYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIgKmFoY19jaGlwX25hbWVzW10gPQoreworCSJOT05FIiwKKwkiYWljNzc3MCIsCisJImFpYzc4NTAiLAorCSJhaWM3ODU1IiwKKwkiYWljNzg1OSIsCisJImFpYzc4NjAiLAorCSJhaWM3ODcwIiwKKwkiYWljNzg4MCIsCisJImFpYzc4OTUiLAorCSJhaWM3ODk1QyIsCisJImFpYzc4OTAvOTEiLAorCSJhaWM3ODk2Lzk3IiwKKwkiYWljNzg5MiIsCisJImFpYzc4OTkiCit9Oworc3RhdGljIGNvbnN0IHVfaW50IG51bV9jaGlwX25hbWVzID0gTlVNX0VMRU1FTlRTKGFoY19jaGlwX25hbWVzKTsKKworLyoKKyAqIEhhcmR3YXJlIGVycm9yIGNvZGVzLgorICovCitzdHJ1Y3QgYWhjX2hhcmRfZXJyb3JfZW50cnkgeworICAgICAgICB1aW50OF90IGVycm5vOworCWNoYXIgKmVycm1lc2c7Cit9OworCitzdGF0aWMgc3RydWN0IGFoY19oYXJkX2Vycm9yX2VudHJ5IGFoY19oYXJkX2Vycm9yc1tdID0geworCXsgSUxMSEFERFIsCSJJbGxlZ2FsIEhvc3QgQWNjZXNzIiB9LAorCXsgSUxMU0FERFIsCSJJbGxlZ2FsIFNlcXVlbmNlciBBZGRyZXNzIHJlZmVycmVuY2VkIiB9LAorCXsgSUxMT1BDT0RFLAkiSWxsZWdhbCBPcGNvZGUgaW4gc2VxdWVuY2VyIHByb2dyYW0iIH0sCisJeyBTUVBBUkVSUiwJIlNlcXVlbmNlciBQYXJpdHkgRXJyb3IiIH0sCisJeyBEUEFSRVJSLAkiRGF0YS1wYXRoIFBhcml0eSBFcnJvciIgfSwKKwl7IE1QQVJFUlIsCSJTY3JhdGNoIG9yIFNDQiBNZW1vcnkgUGFyaXR5IEVycm9yIiB9LAorCXsgUENJRVJSU1RBVCwJIlBDSSBFcnJvciBkZXRlY3RlZCIgfSwKKwl7IENJT1BBUkVSUiwJIkNJT0JVUyBQYXJpdHkgRXJyb3IiIH0sCit9Oworc3RhdGljIGNvbnN0IHVfaW50IG51bV9lcnJvcnMgPSBOVU1fRUxFTUVOVFMoYWhjX2hhcmRfZXJyb3JzKTsKKworc3RhdGljIHN0cnVjdCBhaGNfcGhhc2VfdGFibGVfZW50cnkgYWhjX3BoYXNlX3RhYmxlW10gPQoreworCXsgUF9EQVRBT1VULAlNU0dfTk9PUCwJCSJpbiBEYXRhLW91dCBwaGFzZSIJfSwKKwl7IFBfREFUQUlOLAlNU0dfSU5JVElBVE9SX0RFVF9FUlIsCSJpbiBEYXRhLWluIHBoYXNlIgl9LAorCXsgUF9EQVRBT1VUX0RULAlNU0dfTk9PUCwJCSJpbiBEVCBEYXRhLW91dCBwaGFzZSIJfSwKKwl7IFBfREFUQUlOX0RULAlNU0dfSU5JVElBVE9SX0RFVF9FUlIsCSJpbiBEVCBEYXRhLWluIHBoYXNlIgl9LAorCXsgUF9DT01NQU5ELAlNU0dfTk9PUCwJCSJpbiBDb21tYW5kIHBoYXNlIgl9LAorCXsgUF9NRVNHT1VULAlNU0dfTk9PUCwJCSJpbiBNZXNzYWdlLW91dCBwaGFzZSIJfSwKKwl7IFBfU1RBVFVTLAlNU0dfSU5JVElBVE9SX0RFVF9FUlIsCSJpbiBTdGF0dXMgcGhhc2UiCX0sCisJeyBQX01FU0dJTiwJTVNHX1BBUklUWV9FUlJPUiwJImluIE1lc3NhZ2UtaW4gcGhhc2UiCX0sCisJeyBQX0JVU0ZSRUUsCU1TR19OT09QLAkJIndoaWxlIGlkbGUiCQl9LAorCXsgMCwJCU1TR19OT09QLAkJImluIHVua25vd24gcGhhc2UiCX0KK307CisKKy8qCisgKiBJbiBtb3N0IGNhc2VzIHdlIG9ubHkgd2lzaCB0byBpdHRlcmF0ZSBvdmVyIHJlYWwgcGhhc2VzLCBzbworICogZXhjbHVkZSB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIGNvdW50LgorICovCitzdGF0aWMgY29uc3QgdV9pbnQgbnVtX3BoYXNlcyA9IE5VTV9FTEVNRU5UUyhhaGNfcGhhc2VfdGFibGUpIC0gMTsKKworLyoKKyAqIFZhbGlkIFNDU0lSQVRFIHZhbHVlcy4gIChwLiAzLTE3KQorICogUHJvdmlkZXMgYSBtYXBwaW5nIG9mIHRyYW5mZXIgcGVyaW9kcyBpbiBucyB0byB0aGUgcHJvcGVyIHZhbHVlIHRvCisgKiBzdGljayBpbiB0aGUgc2NzaXhmZXIgcmVnLgorICovCitzdGF0aWMgc3RydWN0IGFoY19zeW5jcmF0ZSBhaGNfc3luY3JhdGVzW10gPQoreworICAgICAgLyogdWx0cmEyICAgIGZhc3QvdWx0cmEgIHBlcmlvZCAgICAgcmF0ZSAqLworCXsgMHg0MiwgICAgICAweDAwMCwgICAgICA5LCAgICAgICI4MC4wIiB9LAorCXsgMHgwMywgICAgICAweDAwMCwgICAgIDEwLCAgICAgICI0MC4wIiB9LAorCXsgMHgwNCwgICAgICAweDAwMCwgICAgIDExLCAgICAgICIzMy4wIiB9LAorCXsgMHgwNSwgICAgICAweDEwMCwgICAgIDEyLCAgICAgICIyMC4wIiB9LAorCXsgMHgwNiwgICAgICAweDExMCwgICAgIDE1LCAgICAgICIxNi4wIiB9LAorCXsgMHgwNywgICAgICAweDEyMCwgICAgIDE4LCAgICAgICIxMy40IiB9LAorCXsgMHgwOCwgICAgICAweDAwMCwgICAgIDI1LCAgICAgICIxMC4wIiB9LAorCXsgMHgxOSwgICAgICAweDAxMCwgICAgIDMxLCAgICAgICI4LjAiICB9LAorCXsgMHgxYSwgICAgICAweDAyMCwgICAgIDM3LCAgICAgICI2LjY3IiB9LAorCXsgMHgxYiwgICAgICAweDAzMCwgICAgIDQzLCAgICAgICI1LjciICB9LAorCXsgMHgxYywgICAgICAweDA0MCwgICAgIDUwLCAgICAgICI1LjAiICB9LAorCXsgMHgwMCwgICAgICAweDA1MCwgICAgIDU2LCAgICAgICI0LjQiICB9LAorCXsgMHgwMCwgICAgICAweDA2MCwgICAgIDYyLCAgICAgICI0LjAiICB9LAorCXsgMHgwMCwgICAgICAweDA3MCwgICAgIDY4LCAgICAgICIzLjYiICB9LAorCXsgMHgwMCwgICAgICAweDAwMCwgICAgICAwLCAgICAgIE5VTEwgICB9Cit9OworCisvKiBPdXIgU2VxdWVuY2VyIFByb2dyYW0gKi8KKyNpbmNsdWRlICJhaWM3eHh4X3NlcS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQJCWFoY19mb3JjZV9yZW5lZ290aWF0aW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCXN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgc3RydWN0IGFoY190bW9kZV90c3RhdGUqCisJCQlhaGNfYWxsb2NfdHN0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAkJYWhjX2ZyZWVfdHN0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJdV9pbnQgc2NzaV9pZCwgY2hhciBjaGFubmVsLCBpbnQgZm9yY2UpOworI2VuZGlmCitzdGF0aWMgc3RydWN0IGFoY19zeW5jcmF0ZSoKKwkJCWFoY19kZXZsaW1pdGVkX3N5bmNyYXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqLAorCQkJCQkJdV9pbnQgKnBlcmlvZCwKKwkJCQkJCXVfaW50ICpwcHJfb3B0aW9ucywKKwkJCQkJCXJvbGVfdCByb2xlKTsKK3N0YXRpYyB2b2lkCQlhaGNfdXBkYXRlX3BlbmRpbmdfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQJCWFoY19mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoY19zY2JfZGV2aW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCXN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyB2b2lkCQlhaGNfYXNzZXJ0X2F0bihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQJCWFoY19zZXR1cF9pbml0aWF0b3JfbXNnb3V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCSAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJCSAgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQJCWFoY19jb25zdHJ1Y3Rfc2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQpOworc3RhdGljIHZvaWQJCWFoY19jb25zdHJ1Y3Rfd2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgdV9pbnQgYnVzX3dpZHRoKTsKK3N0YXRpYyB2b2lkCQlhaGNfY29uc3RydWN0X3BwcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJCQkgIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LAorCQkJCQkgIHVfaW50IGJ1c193aWR0aCwgdV9pbnQgcHByX29wdGlvbnMpOworc3RhdGljIHZvaWQJCWFoY19jbGVhcl9tc2dfc3RhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkCQlhaGNfaGFuZGxlX3Byb3RvX3Zpb2xhdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQJCWFoY19oYW5kbGVfbWVzc2FnZV9waGFzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwordHlwZWRlZiBlbnVtIHsKKwlBSENNU0dfMUIsCisJQUhDTVNHXzJCLAorCUFIQ01TR19FWFQKK30gYWhjX21zZ3R5cGU7CitzdGF0aWMgaW50CQlhaGNfc2VudF9tc2coc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBhaGNfbXNndHlwZSB0eXBlLAorCQkJCSAgICAgdV9pbnQgbXNndmFsLCBpbnQgZnVsbCk7CitzdGF0aWMgaW50CQlhaGNfcGFyc2VfbXNnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIGludAkJYWhjX2hhbmRsZV9tc2dfcmVqZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGNfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKTsKK3N0YXRpYyB2b2lkCQlhaGNfcmVpbml0aWFsaXplX2RhdGFwdHJzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZAkJYWhjX2hhbmRsZV9kZXZyZXNldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkJCSAgICBjYW1fc3RhdHVzIHN0YXR1cywgY2hhciAqbWVzc2FnZSwKKwkJCQkJICAgIGludCB2ZXJib3NlX2xldmVsKTsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKK3N0YXRpYyB2b2lkCQlhaGNfc2V0dXBfdGFyZ2V0X21zZ2luKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYik7CisjZW5kaWYKKworc3RhdGljIGJ1c19kbWFtYXBfY2FsbGJhY2tfdAlhaGNfZG1hbWFwX2NiOyAKK3N0YXRpYyB2b2lkCQkJYWhjX2J1aWxkX2ZyZWVfc2NiX2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQJCQlhaGNfaW5pdF9zY2JkYXRhKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZAkJCWFoY19maW5pX3NjYmRhdGEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkCQlhaGNfcWluZmlmb19yZXF1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgIHN0cnVjdCBzY2IgKnByZXZfc2NiLAorCQkJCQkgICAgc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBpbnQJCWFoY19xaW5maWZvX2NvdW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdV9pbnQJCWFoY19yZW1fc2NiX2Zyb21fZGlzY19saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCSAgIHVfaW50IHByZXYsIHVfaW50IHNjYnB0cik7CitzdGF0aWMgdm9pZAkJYWhjX2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdV9pbnQJCWFoY19yZW1fd3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICB1X2ludCBzY2Jwb3MsIHVfaW50IHByZXYpOworc3RhdGljIHZvaWQJCWFoY19yZXNldF9jdXJyZW50X2J1cyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworI2lmZGVmIEFIQ19EVU1QX1NFUQorc3RhdGljIHZvaWQJCWFoY19kdW1wc2VxKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisjZW5kaWYKK3N0YXRpYyBpbnQJCWFoY19sb2Fkc2VxKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50CQlhaGNfY2hlY2tfcGF0Y2goc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQlzdHJ1Y3QgcGF0Y2ggKipzdGFydF9wYXRjaCwKKwkJCQkJdV9pbnQgc3RhcnRfaW5zdHIsIHVfaW50ICpza2lwX2FkZHIpOworc3RhdGljIHZvaWQJCWFoY19kb3dubG9hZF9pbnN0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgIHVfaW50IGluc3RycHRyLCB1aW50OF90ICpkY29uc3RzKTsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKK3N0YXRpYyB2b2lkCQlhaGNfcXVldWVfbHN0YXRlX2V2ZW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgIHN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlICpsc3RhdGUsCisJCQkJCSAgICAgICB1X2ludCBpbml0aWF0b3JfaWQsCisJCQkJCSAgICAgICB1X2ludCBldmVudF90eXBlLAorCQkJCQkgICAgICAgdV9pbnQgZXZlbnRfYXJnKTsKK3N0YXRpYyB2b2lkCQlhaGNfdXBkYXRlX3Njc2lpZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgdV9pbnQgdGFyZ2lkX21hc2spOworc3RhdGljIGludAkJYWhjX2hhbmRsZV90YXJnZXRfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICAgc3RydWN0IHRhcmdldF9jbWQgKmNtZCk7CisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVzdGFydCB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZnJvbSBhZGRyZXNzIHplcm8KKyAqLwordm9pZAorYWhjX3Jlc3RhcnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCisJYWhjX3BhdXNlKGFoYyk7CisKKwkvKiBObyBtb3JlIHBlbmRpbmcgbWVzc2FnZXMuICovCisJYWhjX2NsZWFyX21zZ19zdGF0ZShhaGMpOworCisJYWhjX291dGIoYWhjLCBTQ1NJU0lHTywgMCk7CQkvKiBEZS1hc3NlcnQgQlNZICovCisJYWhjX291dGIoYWhjLCBNU0dfT1VULCBNU0dfTk9PUCk7CS8qIE5vIG1lc3NhZ2UgdG8gc2VuZCAqLworCWFoY19vdXRiKGFoYywgU1hGUkNUTDEsIGFoY19pbmIoYWhjLCBTWEZSQ1RMMSkgJiB+QklUQlVDS0VUKTsKKwlhaGNfb3V0YihhaGMsIExBU1RQSEFTRSwgUF9CVVNGUkVFKTsKKwlhaGNfb3V0YihhaGMsIFNBVkVEX1NDU0lJRCwgMHhGRik7CisJYWhjX291dGIoYWhjLCBTQVZFRF9MVU4sIDB4RkYpOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgc2VxdWVuY2VyJ3MgaWRlYSBvZiBUUUlOUE9TCisJICogbWF0Y2hlcyBvdXIgb3duLiAgVGhlIHNlcXVlbmNlciBpbmNyZW1lbnRzIFRRSU5QT1MKKwkgKiBvbmx5IGFmdGVyIGl0IHNlZXMgYSBETUEgY29tcGxldGUgYW5kIGEgcmVzZXQgY291bGQKKwkgKiBvY2N1ciBiZWZvcmUgdGhlIGluY3JlbWVudCBsZWF2aW5nIHRoZSBrZXJuZWwgdG8gYmVsaWV2ZQorCSAqIHRoZSBjb21tYW5kIGFycml2ZWQgYnV0IHRoZSBzZXF1ZW5jZXIgdG8gbm90LgorCSAqLworCWFoY19vdXRiKGFoYywgVFFJTlBPUywgYWhjLT50cWluZmlmb25leHQpOworCisJLyogQWx3YXlzIGFsbG93IHJlc2VsZWN0aW9uICovCisJYWhjX291dGIoYWhjLCBTQ1NJU0VRLAorCQkgYWhjX2luYihhaGMsIFNDU0lTRVFfVEVNUExBVEUpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJLyogRW5zdXJlIHRoYXQgbm8gRE1BIG9wZXJhdGlvbnMgYXJlIGluIHByb2dyZXNzICovCisJCWFoY19vdXRiKGFoYywgQ0NTQ0JDTlQsIDApOworCQlhaGNfb3V0YihhaGMsIENDU0dDVEwsIDApOworCQlhaGNfb3V0YihhaGMsIENDU0NCQ1RMLCAwKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSB3ZXJlIGluIHRoZSBwcm9jZXNzIG9mIERNQSdpbmcgU0NCIGRhdGEgaW50bworCSAqIGFuIFNDQiwgcmVwbGFjZSB0aGF0IFNDQiBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBwcmV2ZW50cworCSAqIGFuIFNDQiBsZWFrLgorCSAqLworCWlmICgoYWhjX2luYihhaGMsIFNFUV9GTEFHUzIpICYgU0NCX0RNQSkgIT0gMCkgeworCQlhaGNfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QoYWhjKTsKKwkJYWhjX291dGIoYWhjLCBTRVFfRkxBR1MyLAorCQkJIGFoY19pbmIoYWhjLCBTRVFfRkxBR1MyKSAmIH5TQ0JfRE1BKTsKKwl9CisJYWhjX291dGIoYWhjLCBNV0lfUkVTSURVQUwsIDApOworCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBhaGMtPnNlcWN0bCk7CisJYWhjX291dGIoYWhjLCBTRVFBRERSMCwgMCk7CisJYWhjX291dGIoYWhjLCBTRVFBRERSMSwgMCk7CisJYWhjX3VucGF1c2UoYWhjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSW5wdXQvT3V0cHV0IFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FoY19ydW5fcW91dGZpZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKwl1X2ludCAgc2NiX2luZGV4OworCisJYWhjX3N5bmNfcW91dGZpZm8oYWhjLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CisJd2hpbGUgKGFoYy0+cW91dGZpZm9bYWhjLT5xb3V0Zmlmb25leHRdICE9IFNDQl9MSVNUX05VTEwpIHsKKworCQlzY2JfaW5kZXggPSBhaGMtPnFvdXRmaWZvW2FoYy0+cW91dGZpZm9uZXh0XTsKKwkJaWYgKChhaGMtPnFvdXRmaWZvbmV4dCAmIDB4MDMpID09IDB4MDMpIHsKKwkJCXVfaW50IG1vZG5leHQ7CisKKwkJCS8qCisJCQkgKiBDbGVhciAzMmJpdHMgb2YgUU9VVEZJRk8gYXQgYSB0aW1lCisJCQkgKiBzbyB0aGF0IHdlIGRvbid0IGNsb2JiZXIgYW4gaW5jb21pbmcKKwkJCSAqIGJ5dGUgRE1BIHRvIHRoZSBhcnJheSBvbiBhcmNoaXRlY3R1cmVzCisJCQkgKiB0aGF0IG9ubHkgc3VwcG9ydCAzMmJpdCBsb2FkIGFuZCBzdG9yZQorCQkJICogb3BlcmF0aW9ucy4KKwkJCSAqLworCQkJbW9kbmV4dCA9IGFoYy0+cW91dGZpZm9uZXh0ICYgfjB4MzsKKwkJCSooKHVpbnQzMl90ICopKCZhaGMtPnFvdXRmaWZvW21vZG5leHRdKSkgPSAweEZGRkZGRkZGVUw7CisJCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJCWFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJCQkvKm9mZnNldCovbW9kbmV4dCwgLypsZW4qLzQsCisJCQkJCUJVU19ETUFTWU5DX1BSRVJFQUQpOworCQl9CisJCWFoYy0+cW91dGZpZm9uZXh0Kys7CisKKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IFdBUk5JTkcgbm8gY29tbWFuZCBmb3Igc2NiICVkICIKKwkJCSAgICAgICAiKGNtZGNtcGx0KVxuUU9VVFBPUyA9ICVkXG4iLAorCQkJICAgICAgIGFoY19uYW1lKGFoYyksIHNjYl9pbmRleCwKKwkJCSAgICAgICAoYWhjLT5xb3V0Zmlmb25leHQgLSAxKSAmIDB4RkYpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBTYXZlIG9mZiB0aGUgcmVzaWR1YWwKKwkJICogaWYgdGhlcmUgaXMgb25lLgorCQkgKi8KKwkJYWhjX3VwZGF0ZV9yZXNpZHVhbChhaGMsIHNjYik7CisJCWFoY19kb25lKGFoYywgc2NiKTsKKwl9Cit9CisKK3ZvaWQKK2FoY19ydW5fdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlhaGNfcnVuX3VudGFnZ2VkX3F1ZXVlKGFoYywgJmFoYy0+dW50YWdnZWRfcXVldWVzW2ldKTsKK30KKwordm9pZAorYWhjX3J1bl91bnRhZ2dlZF9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2JfdGFpbHEgKnF1ZXVlKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKworCWlmIChhaGMtPnVudGFnZ2VkX3F1ZXVlX2xvY2sgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKChzY2IgPSBUQUlMUV9GSVJTVChxdWV1ZSkpICE9IE5VTEwKKwkgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSA9PSAwKSB7CisJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FDVElWRTsKKwkJYWhjX3F1ZXVlX3NjYihhaGMsIHNjYik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcnJ1cHQgSGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorYWhjX2hhbmRsZV9icmthZHJpbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCS8qCisJICogV2UgdXBzZXQgdGhlIHNlcXVlbmNlciA6LSgKKwkgKiBMb29rdXAgdGhlIGVycm9yIG1lc3NhZ2UKKwkgKi8KKwlpbnQgaTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19pbmIoYWhjLCBFUlJPUik7CisJZm9yIChpID0gMDsgZXJyb3IgIT0gMSAmJiBpIDwgbnVtX2Vycm9yczsgaSsrKQorCQllcnJvciA+Pj0gMTsKKwlwcmludGYoIiVzOiBicmthZHJpbnQsICVzIGF0IHNlcWFkZHIgPSAweCV4XG4iLAorCSAgICAgICBhaGNfbmFtZShhaGMpLCBhaGNfaGFyZF9lcnJvcnNbaV0uZXJybWVzZywKKwkgICAgICAgYWhjX2luYihhaGMsIFNFUUFERFIwKSB8CisJICAgICAgIChhaGNfaW5iKGFoYywgU0VRQUREUjEpIDw8IDgpKTsKKworCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKworCS8qIFRlbGwgZXZlcnlvbmUgdGhhdCB0aGlzIEhCQSBpcyBubyBsb25nZXIgYXZhaWxhYmxlICovCisJYWhjX2Fib3J0X3NjYnMoYWhjLCBDQU1fVEFSR0VUX1dJTERDQVJELCBBTExfQ0hBTk5FTFMsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLCBST0xFX1VOS05PV04sCisJCSAgICAgICBDQU1fTk9fSEJBKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzIGJ5IHJlc2V0dGluZyB0aGUgY29udHJvbGxlciAqLworCWFoY19zaHV0ZG93bihhaGMpOworfQorCit2b2lkCithaGNfaGFuZGxlX3NlcWludChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGludHN0YXQpCit7CisJc3RydWN0IHNjYiAqc2NiOworCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOworCQorCWFoY19mZXRjaF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCisJLyoKKwkgKiBDbGVhciB0aGUgdXBwZXIgYnl0ZSB0aGF0IGhvbGRzIFNFUUlOVCBzdGF0dXMKKwkgKiBjb2RlcyBhbmQgY2xlYXIgdGhlIFNFUUlOVCBiaXQuIFdlIHdpbGwgdW5wYXVzZQorCSAqIHRoZSBzZXF1ZW5jZXIsIGlmIGFwcHJvcHJpYXRlLCBhZnRlciBzZXJ2aWNpbmcKKwkgKiB0aGUgcmVxdWVzdC4KKwkgKi8KKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0VRSU5UKTsKKwlzd2l0Y2ggKGludHN0YXQgJiBTRVFJTlRfTUFTSykgeworCWNhc2UgQkFEX1NUQVRVUzoKKwl7CisJCXVfaW50ICBzY2JfaW5kZXg7CisJCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisKKwkJLyoKKwkJICogU2V0IHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSB0byAwIChkb24ndAorCQkgKiBzZW5kIHNlbnNlKS4gIFRoZSBzZW5zZSBjb2RlIHdpbGwgY2hhbmdlCisJCSAqIHRoaXMgaWYgbmVlZGVkLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBSRVRVUk5fMSwgMCk7CisKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciB3aWxsIG5vdGlmeSB1cyB3aGVuIGEgY29tbWFuZAorCQkgKiBoYXMgYW4gZXJyb3IgdGhhdCB3b3VsZCBiZSBvZiBpbnRlcmVzdCB0bworCQkgKiB0aGUga2VybmVsLiAgVGhpcyBhbGxvd3MgdXMgdG8gbGVhdmUgdGhlIHNlcXVlbmNlcgorCQkgKiBydW5uaW5nIGluIHRoZSBjb21tb24gY2FzZSBvZiBjb21tYW5kIGNvbXBsZXRlcworCQkgKiB3aXRob3V0IGVycm9yLiAgVGhlIHNlcXVlbmNlciB3aWxsIGFscmVhZHkgaGF2ZQorCQkgKiBkbWEnZCB0aGUgU0NCIGJhY2sgdXAgdG8gdXMsIHNvIHdlIGNhbiByZWZlcmVuY2UKKwkJICogdGhlIGluIGtlcm5lbCBjb3B5IGRpcmVjdGx5LgorCQkgKi8KKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9UQUcpOworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CisJCQlwcmludGYoImFoY19pbnRyIC0gcmVmZXJlbmNlZCBzY2IgIgorCQkJICAgICAgICJub3QgdmFsaWQgZHVyaW5nIHNlcWludCAweCV4IHNjYiglZClcbiIsCisJCQkgICAgICAgaW50c3RhdCwgc2NiX2luZGV4KTsKKwkJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJCXBhbmljKCJmb3Igc2FmZXR5Iik7CisJCQlnb3RvIHVucGF1c2U7CisJCX0KKworCQloc2NiID0gc2NiLT5oc2NiOyAKKworCQkvKiBEb24ndCB3YW50IHRvIGNsb2JiZXIgdGhlIG9yaWdpbmFsIHNlbnNlIGNvZGUgKi8KKwkJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKSB7CisJCQkvKgorCQkJICogQ2xlYXIgdGhlIFNDQl9TRU5TRSBGbGFnIGFuZCBoYXZlCisJCQkgKiB0aGUgc2VxdWVuY2VyIGRvIGEgbm9ybWFsIGNvbW1hbmQKKwkJCSAqIGNvbXBsZXRlLgorCQkJICovCisJCQlzY2ItPmZsYWdzICY9IH5TQ0JfU0VOU0U7CisJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9BVVRPU0VOU0VfRkFJTCk7CisJCQlicmVhazsKKwkJfQorCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9TQ1NJX1NUQVRVU19FUlJPUik7CisJCS8qIEZyZWV6ZSB0aGUgcXVldWUgdW50aWwgdGhlIGNsaWVudCBzZWVzIHRoZSBlcnJvci4gKi8KKwkJYWhjX2ZyZWV6ZV9kZXZxKGFoYywgc2NiKTsKKwkJYWhjX2ZyZWV6ZV9zY2Ioc2NiKTsKKwkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIGhzY2ItPnNoYXJlZF9kYXRhLnN0YXR1cy5zY3NpX3N0YXR1cyk7CisJCXN3aXRjaCAoaHNjYi0+c2hhcmVkX2RhdGEuc3RhdHVzLnNjc2lfc3RhdHVzKSB7CisJCWNhc2UgU0NTSV9TVEFUVVNfT0s6CisJCQlwcmludGYoIiVzOiBJbnRlcnJ1cHRlZCBmb3Igc3RhdXMgb2YgMD8/P1xuIiwKKwkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lfU1RBVFVTX0NNRF9URVJNSU5BVEVEOgorCQljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6CisJCXsKKwkJCXN0cnVjdCBhaGNfZG1hX3NlZyAqc2c7CisJCQlzdHJ1Y3Qgc2NzaV9zZW5zZSAqc2M7CisJCQlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGFyZ19pbmZvOworCQkJc3RydWN0IGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwkJCXN0cnVjdCBhaGNfdHJhbnNpbmZvICp0aW5mbzsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19TRU5TRSkgeworCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQlwcmludGYoIlNDQiAlZDogcmVxdWVzdHMgQ2hlY2sgU3RhdHVzXG4iLAorCQkJCSAgICAgICBzY2ItPmhzY2ItPnRhZyk7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKGFoY19wZXJmb3JtX2F1dG9zZW5zZShzY2IpID09IDApCisJCQkJYnJlYWs7CisKKwkJCXRhcmdfaW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLAorCQkJCQkJCWRldmluZm8uY2hhbm5lbCwKKwkJCQkJCQlkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkJZGV2aW5mby50YXJnZXQsCisJCQkJCQkJJnRzdGF0ZSk7CisJCQl0aW5mbyA9ICZ0YXJnX2luZm8tPmN1cnI7CisJCQlzZyA9IHNjYi0+c2dfbGlzdDsKKwkJCXNjID0gKHN0cnVjdCBzY3NpX3NlbnNlICopKCZoc2NiLT5zaGFyZWRfZGF0YS5jZGIpOyAKKwkJCS8qCisJCQkgKiBTYXZlIG9mZiB0aGUgcmVzaWR1YWwgaWYgdGhlcmUgaXMgb25lLgorCQkJICovCisJCQlhaGNfdXBkYXRlX3Jlc2lkdWFsKGFoYywgc2NiKTsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19TRU5TRSkgeworCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQlwcmludGYoIlNlbmRpbmcgU2Vuc2VcbiIpOworCQkJfQorI2VuZGlmCisJCQlzZy0+YWRkciA9IGFoY19nZXRfc2Vuc2VfYnVmYWRkcihhaGMsIHNjYik7CisJCQlzZy0+bGVuID0gYWhjX2dldF9zZW5zZV9idWZzaXplKGFoYywgc2NiKTsKKwkJCXNnLT5sZW4gfD0gQUhDX0RNQV9MQVNUX1NFRzsKKworCQkJLyogRml4dXAgYnl0ZSBvcmRlciAqLworCQkJc2ctPmFkZHIgPSBhaGNfaHRvbGUzMihzZy0+YWRkcik7CisJCQlzZy0+bGVuID0gYWhjX2h0b2xlMzIoc2ctPmxlbik7CisKKwkJCXNjLT5vcGNvZGUgPSBSRVFVRVNUX1NFTlNFOworCQkJc2MtPmJ5dGUyID0gMDsKKwkJCWlmICh0aW5mby0+cHJvdG9jb2xfdmVyc2lvbiA8PSBTQ1NJX1JFVl8yCisJCQkgJiYgU0NCX0dFVF9MVU4oc2NiKSA8IDgpCisJCQkJc2MtPmJ5dGUyID0gU0NCX0dFVF9MVU4oc2NiKSA8PCA1OworCQkJc2MtPnVudXNlZFswXSA9IDA7CisJCQlzYy0+dW51c2VkWzFdID0gMDsKKwkJCXNjLT5sZW5ndGggPSBzZy0+bGVuOworCQkJc2MtPmNvbnRyb2wgPSAwOworCisJCQkvKgorCQkJICogV2UgY2FuJ3QgYWxsb3cgdGhlIHRhcmdldCB0byBkaXNjb25uZWN0LgorCQkJICogVGhpcyB3aWxsIGJlIGFuIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGFuZAorCQkJICogaGF2aW5nIHRoZSB0YXJnZXQgZGlzY29ubmVjdCB3aWxsIG1ha2UgdGhpcworCQkJICogdHJhbnNhY3Rpb24gaW5kZXN0aW5ndWlzaGFibGUgZnJvbSBvdXRzdGFuZGluZworCQkJICogdGFnZ2VkIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJaHNjYi0+Y29udHJvbCA9IDA7CisKKwkJCS8qCisJCQkgKiBUaGlzIHJlcXVlc3Qgc2Vuc2UgY291bGQgYmUgYmVjYXVzZSB0aGUKKwkJCSAqIHRoZSBkZXZpY2UgbG9zdCBwb3dlciBvciBpbiBzb21lIG90aGVyCisJCQkgKiB3YXkgaGFzIGxvc3Qgb3VyIHRyYW5zZmVyIG5lZ290aWF0aW9ucy4KKwkJCSAqIFJlbmVnb3RpYXRlIGlmIGFwcHJvcHJpYXRlLiAgVW5pdCBhdHRlbnRpb24KKwkJCSAqIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkIGJlZm9yZSBhbnkgZGF0YQorCQkJICogcGhhc2VzIG9jY3VyLgorCQkJICovCisJCQlpZiAoYWhjX2dldF9yZXNpZHVhbChzY2IpIAorCQkJID09IGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikpIHsKKwkJCQlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgJmRldmluZm8sCisJCQkJCQkgICAgICAgdHN0YXRlLCB0YXJnX2luZm8sCisJCQkJCQkgICAgICAgQUhDX05FR19JRl9OT05fQVNZTkMpOworCQkJfQorCQkJaWYgKHRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgJiBkZXZpbmZvLnRhcmdldF9tYXNrKSB7CisJCQkJaHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOworCQkJCXNjYi0+ZmxhZ3MgJj0gflNDQl9ORUdPVElBVEU7CisJCQkJc2NiLT5mbGFncyB8PSBTQ0JfQVVUT19ORUdPVElBVEU7CisJCQl9CisJCQloc2NiLT5jZGJfbGVuID0gc2l6ZW9mKCpzYyk7CisJCQloc2NiLT5kYXRhcHRyID0gc2ctPmFkZHI7IAorCQkJaHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47CisJCQloc2NiLT5zZ3B0ciA9IHNjYi0+c2dfbGlzdF9waHlzIHwgU0dfRlVMTF9SRVNJRDsKKwkJCWhzY2ItPnNncHRyID0gYWhjX2h0b2xlMzIoaHNjYi0+c2dwdHIpOworCQkJc2NiLT5zZ19jb3VudCA9IDE7CisJCQlzY2ItPmZsYWdzIHw9IFNDQl9TRU5TRTsKKwkJCWFoY19xaW5maWZvX3JlcXVldWVfdGFpbChhaGMsIHNjYik7CisJCQlhaGNfb3V0YihhaGMsIFJFVFVSTl8xLCBTRU5EX1NFTlNFKTsKKwkJCS8qCisJCQkgKiBFbnN1cmUgd2UgaGF2ZSBlbm91Z2ggdGltZSB0byBhY3R1YWxseQorCQkJICogcmV0cmlldmUgdGhlIHNlbnNlLgorCQkJICovCisJCQlhaGNfc2NiX3RpbWVyX3Jlc2V0KHNjYiwgNSAqIDEwMDAwMDApOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIE5PX01BVENIOgorCXsKKwkJLyogRW5zdXJlIHdlIGRvbid0IGxlYXZlIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUgb24gKi8KKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLAorCQkJIGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CisKKwkJcHJpbnRmKCIlczolYzolZDogbm8gYWN0aXZlIFNDQiBmb3IgcmVjb25uZWN0aW5nICIKKwkJICAgICAgICJ0YXJnZXQgLSBpc3N1aW5nIEJVUyBERVZJQ0UgUkVTRVRcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0KTsKKwkJcHJpbnRmKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKKwkJICAgICAgICJBUkdfMSA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLCBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMSksIGFoY19pbmIoYWhjLCBBQ0NVTSkpOworCQlwcmludGYoIlNFUV9GTEFHUyA9PSAweCV4LCBTQ0JQVFIgPT0gMHgleCwgQlRUID09IDB4JXgsICIKKwkJICAgICAgICJTSU5ERVggPT0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpLCBhaGNfaW5iKGFoYywgU0NCUFRSKSwKKwkJICAgICAgIGFoY19pbmRleF9idXN5X3RjbChhaGMsCisJCQkgICAgQlVJTERfVENMKGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLAorCQkJCSAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9MVU4pKSksCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0lOREVYKSk7CisJCXByaW50ZigiU0NTSUlEID09IDB4JXgsIFNDQl9TQ1NJSUQgPT0gMHgleCwgU0NCX0xVTiA9PSAweCV4LCAiCisJCSAgICAgICAiU0NCX1RBRyA9PSAweCV4LCBTQ0JfQ09OVFJPTCA9PSAweCV4XG4iLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDU0lJRCksIGFoY19pbmIoYWhjLCBTQ0JfU0NTSUlEKSwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQ0JfTFVOKSwgYWhjX2luYihhaGMsIFNDQl9UQUcpLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSk7CisJCXByaW50ZigiU0NTSUJVU0wgPT0gMHgleCwgU0NTSVNJR0kgPT0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQ1NJQlVTTCksIGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkpOworCQlwcmludGYoIlNYRlJDVEwwID09IDB4JXhcbiIsIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkpOworCQlwcmludGYoIlNFUUNUTCA9PSAweCV4XG4iLCBhaGNfaW5iKGFoYywgU0VRQ1RMKSk7CisJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJYWhjLT5tc2dvdXRfYnVmWzBdID0gTVNHX0JVU19ERVZfUkVTRVQ7CisJCWFoYy0+bXNnb3V0X2xlbiA9IDE7CisJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJYWhjLT5tc2dfdHlwZSA9IE1TR19UWVBFX0lOSVRJQVRPUl9NU0dPVVQ7CisJCWFoY19vdXRiKGFoYywgTVNHX09VVCwgSE9TVF9NU0cpOworCQlhaGNfYXNzZXJ0X2F0bihhaGMpOworCQlicmVhazsKKwl9CisJY2FzZSBTRU5EX1JFSkVDVDogCisJeworCQl1X2ludCByZWpieXRlID0gYWhjX2luYihhaGMsIEFDQ1VNKTsKKwkJcHJpbnRmKCIlczolYzolZDogV2FybmluZyAtIHVua25vd24gbWVzc2FnZSByZWNlaXZlZCBmcm9tICIKKwkJICAgICAgICJ0YXJnZXQgKDB4JXgpLiAgUmVqZWN0aW5nXG4iLCAKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8uY2hhbm5lbCwgZGV2aW5mby50YXJnZXQsIHJlamJ5dGUpOworCQlicmVhazsgCisJfQorCWNhc2UgUFJPVE9fVklPTEFUSU9OOgorCXsKKwkJYWhjX2hhbmRsZV9wcm90b192aW9sYXRpb24oYWhjKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSUdOX1dJREVfUkVTOgorCQlhaGNfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoYWhjLCAmZGV2aW5mbyk7CisJCWJyZWFrOworCWNhc2UgUERBVEFfUkVJTklUOgorCQlhaGNfcmVpbml0aWFsaXplX2RhdGFwdHJzKGFoYyk7CisJCWJyZWFrOworCWNhc2UgQkFEX1BIQVNFOgorCXsKKwkJdV9pbnQgbGFzdHBoYXNlOworCisJCWxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOworCQlwcmludGYoIiVzOiVjOiVkOiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICV4LCAiCisJCSAgICAgICAibGFzdHBoYXNlID0gMHgleC4gIEF0dGVtcHRpbmcgdG8gY29udGludWVcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkgICAgICAgbGFzdHBoYXNlLCBhaGNfaW5iKGFoYywgU0NTSVNJR0kpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUlTU0VEX0JVU0ZSRUU6CisJeworCQl1X2ludCBsYXN0cGhhc2U7CisKKwkJbGFzdHBoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7CisJCXByaW50ZigiJXM6JWM6JWQ6IE1pc3NlZCBidXNmcmVlLiAiCisJCSAgICAgICAiTGFzdHBoYXNlID0gMHgleCwgQ3VycGhhc2UgPSAweCV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKKwkJICAgICAgIGxhc3RwaGFzZSwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CisJCWFoY19yZXN0YXJ0KGFoYyk7CisJCXJldHVybjsKKwl9CisJY2FzZSBIT1NUX01TR19MT09QOgorCXsKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciBoYXMgZW5jb3VudGVyZWQgYSBtZXNzYWdlIHBoYXNlCisJCSAqIHRoYXQgcmVxdWlyZXMgaG9zdCBhc3Npc3RhbmNlIGZvciBjb21wbGV0aW9uLgorCQkgKiBXaGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZSBwaGFzZShzKSwgd2Ugd2lsbCBiZQorCQkgKiBub3RpZmllZCBieSB0aGUgc2VxdWVuY2VyIGFmdGVyIGVhY2ggYnl0ZSBpcworCQkgKiB0cmFuc2ZlcmVkIHNvIHdlIGNhbiB0cmFjayBidXMgcGhhc2UgY2hhbmdlcy4KKwkJICoKKwkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIGEgSE9TVF9NU0dfTE9PUAorCQkgKiBpbnRlcnJ1cHQsIGluaXRpYWxpemUgdGhlIHN0YXRlIG9mIHRoZSBob3N0IG1lc3NhZ2UKKwkJICogbG9vcC4KKwkJICovCisJCWlmIChhaGMtPm1zZ190eXBlID09IE1TR19UWVBFX05PTkUpIHsKKwkJCXN0cnVjdCBzY2IgKnNjYjsKKwkJCXVfaW50IHNjYl9pbmRleDsKKwkJCXVfaW50IGJ1c19waGFzZTsKKworCQkJYnVzX3BoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCQlpZiAoYnVzX3BoYXNlICE9IFBfTUVTR0lOCisJCQkgJiYgYnVzX3BoYXNlICE9IFBfTUVTR09VVCkgeworCQkJCXByaW50ZigiYWhjX2ludHI6IEhPU1RfTVNHX0xPT1AgYmFkICIKKwkJCQkgICAgICAgInBoYXNlIDB4JXhcbiIsCisJCQkJICAgICAgYnVzX3BoYXNlKTsKKwkJCQkvKgorCQkJCSAqIFByb2JhYmx5IHRyYW5zaXRpb25lZCB0byBidXMgZnJlZSBiZWZvcmUKKwkJCQkgKiB3ZSBnb3QgaGVyZS4gIEp1c3QgcHVudCB0aGUgbWVzc2FnZS4KKwkJCQkgKi8KKwkJCQlhaGNfY2xlYXJfaW50c3RhdChhaGMpOworCQkJCWFoY19yZXN0YXJ0KGFoYyk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJCQlpZiAoZGV2aW5mby5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQkJaWYgKHNjYiA9PSBOVUxMKQorCQkJCQlwYW5pYygiSE9TVF9NU0dfTE9PUCB3aXRoICIKKwkJCQkJICAgICAgImludmFsaWQgU0NCICV4XG4iLCBzY2JfaW5kZXgpOworCisJCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dPVVQpCisJCQkJCWFoY19zZXR1cF9pbml0aWF0b3JfbXNnb3V0KGFoYywKKwkJCQkJCQkJICAgJmRldmluZm8sCisJCQkJCQkJCSAgIHNjYik7CisJCQkJZWxzZSB7CisJCQkJCWFoYy0+bXNnX3R5cGUgPQorCQkJCQkgICAgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOworCQkJCQlhaGMtPm1zZ2luX2luZGV4ID0gMDsKKwkJCQl9CisJCQl9CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJCQllbHNlIHsKKwkJCQlpZiAoYnVzX3BoYXNlID09IFBfTUVTR09VVCkgeworCQkJCQlhaGMtPm1zZ190eXBlID0KKwkJCQkJICAgIE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQkJCWFoYy0+bXNnaW5faW5kZXggPSAwOworCQkJCX0KKwkJCQllbHNlIAorCQkJCQlhaGNfc2V0dXBfdGFyZ2V0X21zZ2luKGFoYywKKwkJCQkJCQkgICAgICAgJmRldmluZm8sCisJCQkJCQkJICAgICAgIHNjYik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWFoY19oYW5kbGVfbWVzc2FnZV9waGFzZShhaGMpOworCQlicmVhazsKKwl9CisJY2FzZSBQRVJSX0RFVEVDVEVEOgorCXsKKwkJLyoKKwkJICogSWYgd2UndmUgY2xlYXJlZCB0aGUgcGFyaXR5IGVycm9yIGludGVycnVwdAorCQkgKiBidXQgdGhlIHNlcXVlbmNlciBzdGlsbCBiZWxpZXZlcyB0aGF0IFNDU0lQRVJSCisJCSAqIGlzIHRydWUsIGl0IG11c3QgYmUgdGhhdCB0aGUgcGFyaXR5IGVycm9yIGlzCisJCSAqIGZvciB0aGUgY3VycmVudGx5IHByZXNlbnRlZCBieXRlIG9uIHRoZSBidXMsCisJCSAqIGFuZCB3ZSBhcmUgbm90IGluIGEgcGhhc2UgKGRhdGEtaW4pIHdoZXJlIHdlIHdpbGwKKwkJICogZXZlbnR1YWxseSBhY2sgdGhpcyBieXRlLiAgQWNrIHRoZSBieXRlIGFuZAorCQkgKiB0aHJvdyBpdCBhd2F5IGluIHRoZSBob3BlIHRoYXQgdGhlIHRhcmdldCB3aWxsCisJCSAqIHRha2UgdXMgdG8gbWVzc2FnZSBvdXQgdG8gZGVsaXZlciB0aGUgYXBwcm9wcmlhdGUKKwkJICogZXJyb3IgbWVzc2FnZS4KKwkJICovCisJCWlmICgoaW50c3RhdCAmIFNDU0lJTlQpID09IDAKKwkJICYmIChhaGNfaW5iKGFoYywgU1NUQVQxKSAmIFNDU0lQRVJSKSAhPSAwKSB7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkgeworCQkJCXVfaW50IGN1cnBoYXNlOworCisJCQkJLyoKKwkJCQkgKiBUaGUgaGFyZHdhcmUgd2lsbCBvbmx5IGxldCB5b3UgYWNrIGJ5dGVzCisJCQkJICogaWYgdGhlIGV4cGVjdGVkIHBoYXNlIGluIFNDU0lTSUdPIG1hdGNoZXMKKwkJCQkgKiB0aGUgY3VycmVudCBwaGFzZS4gIE1ha2Ugc3VyZSB0aGlzIGlzCisJCQkJICogY3VycmVudGx5IHRoZSBjYXNlLgorCQkJCSAqLworCQkJCWN1cnBoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCQkJYWhjX291dGIoYWhjLCBMQVNUUEhBU0UsIGN1cnBoYXNlKTsKKwkJCQlhaGNfb3V0YihhaGMsIFNDU0lTSUdPLCBjdXJwaGFzZSk7CisJCQl9CisJCQlpZiAoKGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiAoQ0RJfE1TR0kpKSA9PSAwKSB7CisJCQkJaW50IHdhaXQ7CisKKwkJCQkvKgorCQkJCSAqIEluIGEgZGF0YSBwaGFzZS4gIEZhc3RlciB0byBiaXRidWNrZXQKKwkJCQkgKiB0aGUgZGF0YSB0aGFuIHRvIGluZGl2aWR1YWxseSBhY2sgZWFjaAorCQkJCSAqIGJ5dGUuICBUaGlzIGlzIGFsc28gdGhlIG9ubHkgc3RyYXRlZ3kKKwkJCQkgKiB0aGF0IHdpbGwgd29yayB3aXRoIEFVVE9BQ0sgZW5hYmxlZC4KKwkJCQkgKi8KKwkJCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwxLAorCQkJCQkgYWhjX2luYihhaGMsIFNYRlJDVEwxKSB8IEJJVEJVQ0tFVCk7CisJCQkJd2FpdCA9IDUwMDA7CisJCQkJd2hpbGUgKC0td2FpdCAhPSAwKSB7CisJCQkJCWlmICgoYWhjX2luYihhaGMsIFNDU0lTSUdJKQorCQkJCQkgICYgKENESXxNU0dJKSkgIT0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQlhaGNfZGVsYXkoMTAwKTsKKwkJCQl9CisJCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwKKwkJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMSkgJiB+QklUQlVDS0VUKTsKKwkJCQlpZiAod2FpdCA9PSAwKSB7CisJCQkJCXN0cnVjdAlzY2IgKnNjYjsKKwkJCQkJdV9pbnQJc2NiX2luZGV4OworCisJCQkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQkJCQlwcmludGYoIlVuYWJsZSB0byBjbGVhciBwYXJpdHkgZXJyb3IuICAiCisJCQkJCSAgICAgICAiUmVzZXR0aW5nIGJ1cy5cbiIpOworCQkJCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCQkJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKKwkJCQkJaWYgKHNjYiAhPSBOVUxMKQorCQkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLAorCQkJCQkJICAgIENBTV9VTkNPUl9QQVJJVFkpOworCQkJCQlhaGNfcmVzZXRfY2hhbm5lbChhaGMsIGRldmluZm8uY2hhbm5lbCwgCisJCQkJCQkJICAvKmluaXQgcmVzZXQqL1RSVUUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYWhjX2luYihhaGMsIFNDU0lEQVRMKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBEQVRBX09WRVJSVU46CisJeworCQkvKgorCQkgKiBXaGVuIHRoZSBzZXF1ZW5jZXIgZGV0ZWN0cyBhbiBvdmVycnVuLCBpdAorCQkgKiBwbGFjZXMgdGhlIGNvbnRyb2xsZXIgaW4gIkJJVEJVQ0tFVCIgbW9kZQorCQkgKiBhbmQgYWxsb3dzIHRoZSB0YXJnZXQgdG8gY29tcGxldGUgaXRzIHRyYW5zZmVyLgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBjb3VudGVycyBnZXQgdXBkYXRlZAorCQkgKiB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGluIHRoaXMgbW9kZSwgc28gd2UgaGF2ZQorCQkgKiBubyB3YXkgb2Yga25vd2luZyBob3cgbGFyZ2UgdGhlIG92ZXJydW4gd2FzLgorCQkgKi8KKwkJdV9pbnQgc2NiaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCXVfaW50IGxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOworCQl1X2ludCBpOworCisJCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiaW5kZXgpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoYXNlczsgaSsrKSB7CisJCQlpZiAobGFzdHBoYXNlID09IGFoY19waGFzZV90YWJsZVtpXS5waGFzZSkKKwkJCQlicmVhazsKKwkJfQorCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiZGF0YSBvdmVycnVuIGRldGVjdGVkICVzLiIKKwkJICAgICAgICIgIFRhZyA9PSAweCV4LlxuIiwKKwkJICAgICAgIGFoY19waGFzZV90YWJsZVtpXS5waGFzZW1zZywKKyAgCQkgICAgICAgc2NiLT5oc2NiLT50YWcpOworCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiJXMgc2VlbiBEYXRhIFBoYXNlLiAgTGVuZ3RoID0gJWxkLiAgTnVtU0dzID0gJWQuXG4iLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNFUV9GTEFHUykgJiBEUEhBU0UgPyAiSGF2ZSIgOiAiSGF2ZW4ndCIsCisJCSAgICAgICBhaGNfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpLCBzY2ItPnNnX2NvdW50KTsKKwkJaWYgKHNjYi0+c2dfY291bnQgPiAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisKKwkJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkXG4iLAorCQkJCSAgICAgICBpLAorCQkJCSAgICAgICAoYWhjX2xlMzJ0b2goc2NiLT5zZ19saXN0W2ldLmxlbikgPj4gMjQKKwkJCQkgICAgICAgICYgU0dfSElHSF9BRERSX0JJVFMpLAorCQkJCSAgICAgICBhaGNfbGUzMnRvaChzY2ItPnNnX2xpc3RbaV0uYWRkciksCisJCQkJICAgICAgIGFoY19sZTMydG9oKHNjYi0+c2dfbGlzdFtpXS5sZW4pCisJCQkJICAgICAgICYgQUhDX1NHX0xFTl9NQVNLKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBTZXQgdGhpcyBhbmQgaXQgd2lsbCB0YWtlIGVmZmVjdCB3aGVuIHRoZQorCQkgKiB0YXJnZXQgZG9lcyBhIGNvbW1hbmQgY29tcGxldGUuCisJCSAqLworCQlhaGNfZnJlZXplX2RldnEoYWhjLCBzY2IpOworCQlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpID09IDApIHsKKwkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0RBVEFfUlVOX0VSUik7CisJCX0gZWxzZSB7CisJCQlzY2ItPmZsYWdzICY9IH5TQ0JfU0VOU0U7CisJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9BVVRPU0VOU0VfRkFJTCk7CisJCX0KKwkJYWhjX2ZyZWV6ZV9zY2Ioc2NiKTsKKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQkvKgorCQkJICogQ2xlYXIgdGhlIGNoYW5uZWwgaW4gY2FzZSB3ZSByZXR1cm4KKwkJCSAqIHRvIGRhdGEgcGhhc2UgbGF0ZXIuCisJCQkgKi8KKwkJCWFoY19vdXRiKGFoYywgU1hGUkNUTDAsCisJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkgfCBDTFJTVENOVHxDTFJDSE4pOworCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwKKwkJCQkgYWhjX2luYihhaGMsIFNYRlJDVEwwKSB8IENMUlNUQ05UfENMUkNITik7CisJCX0KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCXVfaW50IGRzY29tbWFuZDE7CisKKwkJCS8qIEVuc3VyZSBISEFERFIgaXMgMCBmb3IgZnV0dXJlIERNQSBvcGVyYXRpb25zLiAqLworCQkJZHNjb21tYW5kMSA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQxKTsKKwkJCWFoY19vdXRiKGFoYywgRFNDT01NQU5EMSwgZHNjb21tYW5kMSB8IEhBRERMRFNFTDApOworCQkJYWhjX291dGIoYWhjLCBIQUREUiwgMCk7CisJCQlhaGNfb3V0YihhaGMsIERTQ09NTUFORDEsIGRzY29tbWFuZDEpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIE1LTVNHX0ZBSUxFRDoKKwl7CisJCXVfaW50IHNjYmluZGV4OworCisJCXByaW50ZigiJXM6JWM6JWQ6JWQ6IEF0dGVtcHQgdG8gaXNzdWUgbWVzc2FnZSBmYWlsZWRcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLmNoYW5uZWwsIGRldmluZm8udGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby5sdW4pOworCQlzY2JpbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JpbmRleCk7CisJCWlmIChzY2IgIT0gTlVMTAorCQkgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKSAhPSAwKQorCQkJLyoKKwkJCSAqIEVuc3VyZSB0aGF0IHdlIGRpZG4ndCBwdXQgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgdGhpcworCQkJICogU0NCIGludG8gdGhlIFFJTkZJRk8uCisJCQkgKi8KKwkJCWFoY19zZWFyY2hfcWluZmlmbyhhaGMsIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwKKwkJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoYywgc2NiKSwKKwkJCQkJICAgU0NCX0dFVF9MVU4oc2NiKSwgc2NiLT5oc2NiLT50YWcsCisJCQkJCSAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkJICAgU0VBUkNIX1JFTU9WRSk7CisJCWJyZWFrOworCX0KKwljYXNlIE5PX0ZSRUVfU0NCOgorCXsKKwkJcHJpbnRmKCIlczogTm8gZnJlZSBvciBkaXNjb25uZWN0ZWQgU0NCc1xuIiwgYWhjX25hbWUoYWhjKSk7CisJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJcGFuaWMoImZvciBzYWZldHkiKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0NCX01JU01BVENIOgorCXsKKwkJdV9pbnQgc2NicHRyOworCisJCXNjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCQlwcmludGYoIkJvZ3VzIFRBRyBhZnRlciBETUEuICBTQ0JQVFIgJWQsIHRhZyAlZCwgb3VyIHRhZyAlZFxuIiwKKwkJICAgICAgIHNjYnB0ciwgYWhjX2luYihhaGMsIEFSR18xKSwKKwkJICAgICAgIGFoYy0+c2NiX2RhdGEtPmhzY2JzW3NjYnB0cl0udGFnKTsKKwkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCQlwYW5pYygiZm9yIHNhZnRleSIpOworCQlicmVhazsKKwl9CisJY2FzZSBPVVRfT0ZfUkFOR0U6CisJeworCQlwcmludGYoIiVzOiBCVFQgY2FsY3VsYXRpb24gb3V0IG9mIHJhbmdlXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcHJpbnRmKCJTQVZFRF9TQ1NJSUQgPT0gMHgleCwgU0FWRURfTFVOID09IDB4JXgsICIKKwkJICAgICAgICJBUkdfMSA9PSAweCV4IEFDQ1VNID0gMHgleFxuIiwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBTQVZFRF9TQ1NJSUQpLCBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKKwkJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMSksIGFoY19pbmIoYWhjLCBBQ0NVTSkpOworCQlwcmludGYoIlNFUV9GTEFHUyA9PSAweCV4LCBTQ0JQVFIgPT0gMHgleCwgQlRUID09IDB4JXgsICIKKwkJICAgICAgICJTSU5ERVggPT0gMHgleFxuLCBBID09IDB4JXhcbiIsCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0VRX0ZMQUdTKSwgYWhjX2luYihhaGMsIFNDQlBUUiksCisJCSAgICAgICBhaGNfaW5kZXhfYnVzeV90Y2woYWhjLAorCQkJICAgIEJVSUxEX1RDTChhaGNfaW5iKGFoYywgU0FWRURfU0NTSUlEKSwKKwkJCQkgICAgICBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSkpLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNJTkRFWCksCisJCSAgICAgICBhaGNfaW5iKGFoYywgQUNDVU0pKTsKKwkJcHJpbnRmKCJTQ1NJSUQgPT0gMHgleCwgU0NCX1NDU0lJRCA9PSAweCV4LCBTQ0JfTFVOID09IDB4JXgsICIKKwkJICAgICAgICJTQ0JfVEFHID09IDB4JXgsIFNDQl9DT05UUk9MID09IDB4JXhcbiIsCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0NTSUlEKSwgYWhjX2luYihhaGMsIFNDQl9TQ1NJSUQpLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDQl9MVU4pLCBhaGNfaW5iKGFoYywgU0NCX1RBRyksCisJCSAgICAgICBhaGNfaW5iKGFoYywgU0NCX0NPTlRST0wpKTsKKwkJcHJpbnRmKCJTQ1NJQlVTTCA9PSAweCV4LCBTQ1NJU0lHSSA9PSAweCV4XG4iLAorCQkgICAgICAgYWhjX2luYihhaGMsIFNDU0lCVVNMKSwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CisJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJcGFuaWMoImZvciBzYWZldHkiKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByaW50ZigiYWhjX2ludHI6IHNlcWludCwgIgorCQkgICAgICAgImludHN0YXQgPT0gMHgleCwgc2NzaXNpZ2kgPSAweCV4XG4iLAorCQkgICAgICAgaW50c3RhdCwgYWhjX2luYihhaGMsIFNDU0lTSUdJKSk7CisJCWJyZWFrOworCX0KK3VucGF1c2U6CisJLyoKKwkgKiAgVGhlIHNlcXVlbmNlciBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgb24KKwkgKiAgYSBTRVFJTlQsIHNvIHdlIHNob3VsZCByZXN0YXJ0IGl0IHdoZW4KKwkgKiAgd2UncmUgZG9uZS4KKwkgKi8KKwlhaGNfdW5wYXVzZShhaGMpOworfQorCit2b2lkCithaGNfaGFuZGxlX3Njc2lpbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBpbnRzdGF0KQoreworCXVfaW50CXNjYl9pbmRleDsKKwl1X2ludAlzdGF0dXMwOworCXVfaW50CXN0YXR1czsKKwlzdHJ1Y3QJc2NiICpzY2I7CisJY2hhcgljdXJfY2hhbm5lbDsKKwljaGFyCWludHJfY2hhbm5lbDsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwCisJICYmICgoYWhjX2luYihhaGMsIFNCTEtDVEwpICYgU0VMQlVTQikgIT0gMCkpCisJCWN1cl9jaGFubmVsID0gJ0InOworCWVsc2UKKwkJY3VyX2NoYW5uZWwgPSAnQSc7CisJaW50cl9jaGFubmVsID0gY3VyX2NoYW5uZWw7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlzdGF0dXMwID0gYWhjX2luYihhaGMsIFNTVEFUMCkgJiBJT0VSUjsKKwllbHNlCisJCXN0YXR1czAgPSAwOworCXN0YXR1cyA9IGFoY19pbmIoYWhjLCBTU1RBVDEpICYgKFNFTFRPfFNDU0lSU1RJfEJVU0ZSRUV8U0NTSVBFUlIpOworCWlmIChzdGF0dXMgPT0gMCAmJiBzdGF0dXMwID09IDApIHsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJCS8qIFRyeSB0aGUgb3RoZXIgY2hhbm5lbCAqLworCQkgCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpIF4gU0VMQlVTQik7CisJCQlzdGF0dXMgPSBhaGNfaW5iKGFoYywgU1NUQVQxKQorCQkJICAgICAgICYgKFNFTFRPfFNDU0lSU1RJfEJVU0ZSRUV8U0NTSVBFUlIpOworCQkJaW50cl9jaGFubmVsID0gKGN1cl9jaGFubmVsID09ICdBJykgPyAnQicgOiAnQSc7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlwcmludGYoIiVzOiBTcHVyaW91cyBTQ1NJIGludGVycnVwdFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCQlhaGNfdW5wYXVzZShhaGMpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBzZXF1ZW5jZXIgaXMgaW4gYSBzYWZlIGxvY2F0aW9uLiAqLworCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoYyk7CisKKwlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCWlmIChzY2IgIT0gTlVMTAorCSAmJiAoYWhjX2luYihhaGMsIFNFUV9GTEFHUykgJiBOT1RfSURFTlRJRklFRCkgIT0gMCkKKwkJc2NiID0gTlVMTDsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDAKKwkgJiYgKHN0YXR1czAgJiBJT0VSUikgIT0gMCkgeworCQlpbnQgbm93X2x2ZDsKKworCQlub3dfbHZkID0gYWhjX2luYihhaGMsIFNCTEtDVEwpICYgRU5BQjQwOworCQlwcmludGYoIiVzOiBUcmFuc2NlaXZlciBTdGF0ZSBIYXMgQ2hhbmdlZCB0byAlcyBtb2RlXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgbm93X2x2ZCA/ICJMVkQiIDogIlNFIik7CisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDAsIENMUklPRVJSKTsKKwkJLyoKKwkJICogV2hlbiB0cmFuc2l0aW9uaW5nIHRvIFNFIG1vZGUsIHRoZSByZXNldCBsaW5lCisJCSAqIGdsaXRjaGVzLCB0cmlnZ2VyaW5nIGFuIGFyYml0cmF0aW9uIGJ1ZyBpbiBzb21lCisJCSAqIFVsdHJhMiBjb250cm9sbGVycy4gIFRoaXMgYnVnIGlzIGNsZWFyZWQgd2hlbiB3ZQorCQkgKiBhc3NlcnQgdGhlIHJlc2V0IGxpbmUuICBTaW5jZSBhIHJlc2V0IGdsaXRjaCBoYXMKKwkJICogYWxyZWFkeSBvY2N1cnJlZCB3aXRoIHRoaXMgdHJhbnNpdGlvbiBhbmQgYQorCQkgKiB0cmFuc2NlaXZlciBzdGF0ZSBjaGFuZ2UgaXMgaGFuZGxlZCBqdXN0IGxpa2UKKwkJICogYSBidXMgcmVzZXQgYW55d2F5LCBhc3NlcnRpbmcgdGhlIHJlc2V0IGxpbmUKKwkJICogb3Vyc2VsdmVzIGlzIHNhZmUuCisJCSAqLworCQlhaGNfcmVzZXRfY2hhbm5lbChhaGMsIGludHJfY2hhbm5lbCwKKwkJCQkgLypJbml0aWF0ZSBSZXNldCovbm93X2x2ZCA9PSAwKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkgeworCQlwcmludGYoIiVzOiBTb21lb25lIHJlc2V0IGNoYW5uZWwgJWNcbiIsCisJCQlhaGNfbmFtZShhaGMpLCBpbnRyX2NoYW5uZWwpOworCQlpZiAoaW50cl9jaGFubmVsICE9IGN1cl9jaGFubmVsKQorCQkgCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpIF4gU0VMQlVTQik7CisJCWFoY19yZXNldF9jaGFubmVsKGFoYywgaW50cl9jaGFubmVsLCAvKkluaXRpYXRlIFJlc2V0Ki9GQUxTRSk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgU0NTSVBFUlIpICE9IDApIHsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIHRoZSBidXMgcGhhc2UgYW5kIHF1ZXVlIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCisJCSAqIFNDU0lQRVJSIGlzIGxhdGNoZWQgdHJ1ZSBhcyBzb29uIGFzIGEgcGFyaXR5IGVycm9yCisJCSAqIG9jY3Vycy4gIElmIHRoZSBzZXF1ZW5jZXIgYWNrZWQgdGhlIHRyYW5zZmVyIHRoYXQKKwkJICogY2F1c2VkIHRoZSBwYXJpdHkgZXJyb3IgYW5kIHRoZSBjdXJyZW50bHkgcHJlc2VudGVkCisJCSAqIHRyYW5zZmVyIG9uIHRoZSBidXMgaGFzIGNvcnJlY3QgcGFyaXR5LCBTQ1NJUEVSUiB3aWxsCisJCSAqIGJlIGNsZWFyZWQgYnkgQ0xSU0NTSVBFUlIuICBVc2UgdGhpcyB0byBkZXRlcm1pbmUgaWYKKwkJICogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIGxhc3QgcGhhc2UgdGhlIHNlcXVlbmNlciByZWNvcmRlZCwKKwkJICogb3IgdGhlIGN1cnJlbnQgcGhhc2UgcHJlc2VudGVkIG9uIHRoZSBidXMuCisJCSAqLworCQlzdHJ1Y3QJYWhjX2RldmluZm8gZGV2aW5mbzsKKwkJdV9pbnQJbWVzZ19vdXQ7CisJCXVfaW50CWN1cnBoYXNlOworCQl1X2ludAllcnJvcnBoYXNlOworCQl1X2ludAlsYXN0cGhhc2U7CisJCXVfaW50CXNjc2lyYXRlOworCQl1X2ludAlpOworCQl1X2ludAlzc3RhdDI7CisJCWludAlzaWxlbnQ7CisKKwkJbGFzdHBoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7CisJCWN1cnBoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisJCXNzdGF0MiA9IGFoY19pbmIoYWhjLCBTU1RBVDIpOworCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJTQ1NJUEVSUik7CisJCS8qCisJCSAqIEZvciBhbGwgcGhhc2VzIHNhdmUgREFUQSwgdGhlIHNlcXVlbmNlciB3b24ndAorCQkgKiBhdXRvbWF0aWNhbGx5IGFjayBhIGJ5dGUgdGhhdCBoYXMgYSBwYXJpdHkgZXJyb3IKKwkJICogaW4gaXQuICBTbyB0aGUgb25seSB3YXkgdGhhdCB0aGUgY3VycmVudCBwaGFzZQorCQkgKiBjb3VsZCBiZSAnZGF0YS1pbicgaXMgaWYgdGhlIHBhcml0eSBlcnJvciBpcyBmb3IKKwkJICogYW4gYWxyZWFkeSBhY2tlZCBieXRlIGluIHRoZSBkYXRhIHBoYXNlLiAgRHVyaW5nCisJCSAqIHN5bmNocm9ub3VzIGRhdGEtaW4gdHJhbnNmZXJzLCB3ZSBtYXkgYWN0dWFsbHkKKwkJICogYWNrIGJ5dGVzIGJlZm9yZSBsYXRjaGluZyB0aGUgY3VycmVudCBwaGFzZSBpbgorCQkgKiBMQVNUUEhBU0UsIGxlYWRpbmcgdG8gdGhlIGRpc2NyZXBhbmN5IGJldHdlZW4KKwkJICogY3VycGhhc2UgYW5kIGxhc3RwaGFzZS4KKwkJICovCisJCWlmICgoYWhjX2luYihhaGMsIFNTVEFUMSkgJiBTQ1NJUEVSUikgIT0gMAorCQkgfHwgY3VycGhhc2UgPT0gUF9EQVRBSU4gfHwgY3VycGhhc2UgPT0gUF9EQVRBSU5fRFQpCisJCQllcnJvcnBoYXNlID0gY3VycGhhc2U7CisJCWVsc2UKKwkJCWVycm9ycGhhc2UgPSBsYXN0cGhhc2U7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9waGFzZXM7IGkrKykgeworCQkJaWYgKGVycm9ycGhhc2UgPT0gYWhjX3BoYXNlX3RhYmxlW2ldLnBoYXNlKQorCQkJCWJyZWFrOworCQl9CisJCW1lc2dfb3V0ID0gYWhjX3BoYXNlX3RhYmxlW2ldLm1lc2dfb3V0OworCQlzaWxlbnQgPSBGQUxTRTsKKwkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQlpZiAoU0NCX0lTX1NJTEVOVChzY2IpKQorCQkJCXNpbGVudCA9IFRSVUU7CisJCQllbHNlCisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfVFJBTlNNSVNTSU9OX0VSUk9SOworCQl9IGVsc2UKKwkJCXByaW50ZigiJXM6JWM6JWQ6ICIsIGFoY19uYW1lKGFoYyksIGludHJfY2hhbm5lbCwKKwkJCSAgICAgICBTQ1NJSURfVEFSR0VUKGFoYywgYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCkpKTsKKwkJc2NzaXJhdGUgPSBhaGNfaW5iKGFoYywgU0NTSVJBVEUpOworCQlpZiAoc2lsZW50ID09IEZBTFNFKSB7CisJCQlwcmludGYoInBhcml0eSBlcnJvciBkZXRlY3RlZCAlcy4gIgorCQkJICAgICAgICJTRVFBRERSKDB4JXgpIFNDU0lSQVRFKDB4JXgpXG4iLAorCQkJICAgICAgIGFoY19waGFzZV90YWJsZVtpXS5waGFzZW1zZywKKwkJCSAgICAgICBhaGNfaW53KGFoYywgU0VRQUREUjApLAorCQkJICAgICAgIHNjc2lyYXRlKTsKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkgeworCQkJCWlmICgoc3N0YXQyICYgQ1JDVkFMRVJSKSAhPSAwKQorCQkJCQlwcmludGYoIlx0Q1JDIFZhbHVlIE1pc21hdGNoXG4iKTsKKwkJCQlpZiAoKHNzdGF0MiAmIENSQ0VOREVSUikgIT0gMCkKKwkJCQkJcHJpbnRmKCJcdE5vIHRlcm1pbmFsIENSQyBwYWNrZXQgIgorCQkJCQkgICAgICAgInJlY2V2aWVkXG4iKTsKKwkJCQlpZiAoKHNzdGF0MiAmIENSQ1JFUUVSUikgIT0gMCkKKwkJCQkJcHJpbnRmKCJcdElsbGVnYWwgQ1JDIHBhY2tldCAiCisJCQkJCSAgICAgICAicmVxdWVzdFxuIik7CisJCQkJaWYgKChzc3RhdDIgJiBEVUFMX0VER0VfRVJSKSAhPSAwKQorCQkJCQlwcmludGYoIlx0VW5leHBlY3RlZCAlc0RUIERhdGEgUGhhc2VcbiIsCisJCQkJCSAgICAgICAoc2NzaXJhdGUgJiBTSU5HTEVfRURHRSkKKwkJCQkJICAgICA/ICIiIDogIm5vbi0iKTsKKwkJCX0KKwkJfQorCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMAorCQkgJiYgKHNzdGF0MiAmIERVQUxfRURHRV9FUlIpICE9IDApIHsKKwkJCS8qCisJCQkgKiBUaGlzIGVycm9yIGFwcGxpZXMgcmVnYXJkbGVzcyBvZgorCQkJICogZGF0YSBkaXJlY3Rpb24sIHNvIGlnbm9yZSB0aGUgdmFsdWUKKwkJCSAqIGluIHRoZSBwaGFzZSB0YWJsZS4KKwkJCSAqLworCQkJbWVzZ19vdXQgPSBNU0dfSU5JVElBVE9SX0RFVF9FUlI7CisJCX0KKworCQkvKgorCQkgKiBXZSd2ZSBzZXQgdGhlIGhhcmR3YXJlIHRvIGFzc2VydCBBVE4gaWYgd2UgICAKKwkJICogZ2V0IGEgcGFyaXR5IGVycm9yIG9uICJpbiIgcGhhc2VzLCBzbyBhbGwgd2UgIAorCQkgKiBuZWVkIHRvIGRvIGlzIHN0dWZmIHRoZSBtZXNzYWdlIGJ1ZmZlciB3aXRoCisJCSAqIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlLiAgIkluIiBwaGFzZXMgaGF2ZSBzZXQKKwkJICogbWVzZ19vdXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gTVNHX05PUC4KKwkJICovCisJCWlmIChtZXNnX291dCAhPSBNU0dfTk9PUCkgeworCQkJaWYgKGFoYy0+bXNnX3R5cGUgIT0gTVNHX1RZUEVfTk9ORSkKKwkJCQlhaGMtPnNlbmRfbXNnX3BlcnJvciA9IFRSVUU7CisJCQllbHNlCisJCQkJYWhjX291dGIoYWhjLCBNU0dfT1VULCBtZXNnX291dCk7CisJCX0KKwkJLyoKKwkJICogRm9yY2UgYSByZW5lZ290aWF0aW9uIHdpdGggdGhpcyB0YXJnZXQganVzdCBpbgorCQkgKiBjYXNlIHdlIGFyZSBvdXQgb2Ygc3luYyBmb3Igc29tZSBleHRlcm5hbCByZWFzb24KKwkJICogdW5rbm93biAob3IgdW5yZXBvcnRlZCkgYnkgdGhlIHRhcmdldC4KKwkJICovCisJCWFoY19mZXRjaF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQlhaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGMsICZkZXZpbmZvKTsKKworCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWFoY191bnBhdXNlKGFoYyk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgU0VMVE8pICE9IDApIHsKKwkJdV9pbnQJc2NicHRyOworCisJCS8qIFN0b3AgdGhlIHNlbGVjdGlvbiAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsIDApOworCisJCS8qIE5vIG1vcmUgcGVuZGluZyBtZXNzYWdlcyAqLworCQlhaGNfY2xlYXJfbXNnX3N0YXRlKGFoYyk7CisKKwkJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXRlICovCisJCWFoY19vdXRiKGFoYywgU0lNT0RFMSwgYWhjX2luYihhaGMsIFNJTU9ERTEpICYgfkVOQlVTRlJFRSk7CisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlNFTFRJTUVPfENMUkJVU0ZSRUV8Q0xSU0NTSVBFUlIpOworCisJCS8qCisJCSAqIEFsdGhvdWdoIHRoZSBkcml2ZXIgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUKKwkJICogJ1NlbGVjdGlvbiBpbiBQcm9ncmVzcycgc3RhdHVzIGJpdCwgdGhlIGJ1c3kKKwkJICogTEVEIGRvZXMuICBTRUxJTkdPIGlzIG9ubHkgY2xlYXJlZCBieSBhIHN1Y2Vzc2Z1bGwKKwkJICogc2VsZWN0aW9uLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGNsZWFyIGl0IHRvIGluc3VyZQorCQkgKiB0aGUgTEVEIHR1cm5zIG9mZiBqdXN0IGluY2FzZSBubyBmdXR1cmUgc3VjY2Vzc2Z1bAorCQkgKiBzZWxlY3Rpb25zIG9jY3VyIChlLmcuIG5vIGRldmljZXMgb24gdGhlIGJ1cykuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIENMUlNJTlQwLCBDTFJTRUxJTkdPKTsKKworCQlzY2JwdHIgPSBhaGNfaW5iKGFoYywgV0FJVElOR19TQ0JIKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNjYnB0cik7CisJCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogYWhjX2ludHIgLSByZWZlcmVuY2VkIHNjYiBub3QgIgorCQkJICAgICAgICJ2YWxpZCBkdXJpbmcgU0VMVE8gc2NiKCVkLCAlZClcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgc2NicHRyLCBzY2JfaW5kZXgpOworCQkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX1NFTFRPKSAhPSAwKSB7CisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJCXByaW50ZigiU2F3IFNlbGVjdGlvbiBUaW1lb3V0IGZvciBTQ0IgMHgleFxuIiwKKwkJCQkgICAgICAgc2NiX2luZGV4KTsKKwkJCX0KKyNlbmRpZgorCQkJLyoKKwkJCSAqIEZvcmNlIGEgcmVuZWdvdGlhdGlvbiB3aXRoIHRoaXMgdGFyZ2V0IGp1c3QgaW4KKwkJCSAqIGNhc2UgdGhlIGNhYmxlIHdhcyBwdWxsZWQgYW5kIHdpbGwgbGF0ZXIgYmUKKwkJCSAqIHJlLWF0dGFjaGVkLiAgVGhlIHRhcmdldCBtYXkgZm9yZ2V0IGl0cyBuZWdvdGlhdGlvbgorCQkJICogc2V0dGluZ3Mgd2l0aCB1cyBzaG91bGQgaXQgYXR0ZW1wdCB0byByZXNlbGVjdAorCQkJICogZHVyaW5nIHRoZSBpbnRlcnJ1cHRpb24uICBUaGUgdGFyZ2V0IHdpbGwgbm90IGlzc3VlCisJCQkgKiBhIHVuaXQgYXR0ZW50aW9uIGluIHRoaXMgY2FzZSwgc28gd2UgbXVzdCBhbHdheXMKKwkJCSAqIHJlbmVnb3RpYXRlLgorCQkJICovCisJCQlhaGNfc2NiX2RldmluZm8oYWhjLCAmZGV2aW5mbywgc2NiKTsKKwkJCWFoY19mb3JjZV9yZW5lZ290aWF0aW9uKGFoYywgJmRldmluZm8pOworCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VMX1RJTUVPVVQpOworCQkJYWhjX2ZyZWV6ZV9kZXZxKGFoYywgc2NiKTsKKwkJfQorCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSU0NTSUlOVCk7CisJCWFoY19yZXN0YXJ0KGFoYyk7CisJfSBlbHNlIGlmICgoc3RhdHVzICYgQlVTRlJFRSkgIT0gMAorCQkmJiAoYWhjX2luYihhaGMsIFNJTU9ERTEpICYgRU5CVVNGUkVFKSAhPSAwKSB7CisJCXN0cnVjdAlhaGNfZGV2aW5mbyBkZXZpbmZvOworCQl1X2ludAlsYXN0cGhhc2U7CisJCXVfaW50CXNhdmVkX3Njc2lpZDsKKwkJdV9pbnQJc2F2ZWRfbHVuOworCQl1X2ludAl0YXJnZXQ7CisJCXVfaW50CWluaXRpYXRvcl9yb2xlX2lkOworCQljaGFyCWNoYW5uZWw7CisJCWludAlwcmludGVycm9yOworCisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkJICogV2UgbWF5IGhhdmUgYW4gZW50cnkgaW4gdGhlIHdhaXRpbmcgUSBmb3IgdGhpcyB0YXJnZXQsCisJCSAqIHRoYXQgaXMgYWZmZWN0ZWQgYnkgdGhpcyBidXNmcmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvCisJCSAqIGdvIGFib3V0IHNlbGVjdGluZyB0aGUgdGFyZ2V0IHdoaWxlIHdlIGhhbmRsZSB0aGUgZXZlbnQuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsCisJCQkgYWhjX2luYihhaGMsIFNDU0lTRVEpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKworCQkvKgorCQkgKiBEaXNhYmxlIGJ1c2ZyZWUgaW50ZXJydXB0cyBhbmQgY2xlYXIgdGhlIGJ1c2ZyZWUKKwkJICogaW50ZXJydXB0IHN0YXR1cy4gIFdlIGRvIHRoaXMgaGVyZSBzbyB0aGF0IHNldmVyYWwKKwkJICogYnVzIHRyYW5zYWN0aW9ucyBvY2N1ciBwcmlvciB0byBjbGVhcmluZyB0aGUgU0NTSUlOVAorCQkgKiBsYXRjaC4gIEl0IGNhbiB0YWtlIGEgYml0IGZvciB0aGUgY2xlYXJpbmcgdG8gdGFrZSBlZmZlY3QuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIGFoY19pbmIoYWhjLCBTSU1PREUxKSAmIH5FTkJVU0ZSRUUpOworCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJCVVNGUkVFfENMUlNDU0lQRVJSKTsKKworCQkvKgorCQkgKiBMb29rIGF0IHdoYXQgcGhhc2Ugd2Ugd2VyZSBsYXN0IGluLgorCQkgKiBJZiBpdHMgbWVzc2FnZSBvdXQsIGNoYW5jZXMgYXJlIHByZXR0eSBnb29kCisJCSAqIHRoYXQgdGhlIGJ1c2ZyZWUgd2FzIGluIHJlc3BvbnNlIHRvIG9uZSBvZgorCQkgKiBvdXIgYWJvcnQgcmVxdWVzdHMuCisJCSAqLworCQlsYXN0cGhhc2UgPSBhaGNfaW5iKGFoYywgTEFTVFBIQVNFKTsKKwkJc2F2ZWRfc2NzaWlkID0gYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCk7CisJCXNhdmVkX2x1biA9IGFoY19pbmIoYWhjLCBTQVZFRF9MVU4pOworCQl0YXJnZXQgPSBTQ1NJSURfVEFSR0VUKGFoYywgc2F2ZWRfc2NzaWlkKTsKKwkJaW5pdGlhdG9yX3JvbGVfaWQgPSBTQ1NJSURfT1VSX0lEKHNhdmVkX3Njc2lpZCk7CisJCWNoYW5uZWwgPSBTQ1NJSURfQ0hBTk5FTChhaGMsIHNhdmVkX3Njc2lpZCk7CisJCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIGluaXRpYXRvcl9yb2xlX2lkLAorCQkJCSAgICB0YXJnZXQsIHNhdmVkX2x1biwgY2hhbm5lbCwgUk9MRV9JTklUSUFUT1IpOworCQlwcmludGVycm9yID0gMTsKKworCQlpZiAobGFzdHBoYXNlID09IFBfTUVTR09VVCkgeworCQkJdV9pbnQgdGFnOworCisJCQl0YWcgPSBTQ0JfTElTVF9OVUxMOworCQkJaWYgKGFoY19zZW50X21zZyhhaGMsIEFIQ01TR18xQiwgTVNHX0FCT1JUX1RBRywgVFJVRSkKKwkJCSB8fCBhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfMUIsIE1TR19BQk9SVCwgVFJVRSkpIHsKKwkJCQlpZiAoYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4IC0gMV0KKwkJCQkgPT0gTVNHX0FCT1JUX1RBRykKKwkJCQkJdGFnID0gc2NiLT5oc2NiLT50YWc7CisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJCXByaW50ZigiU0NCICVkIC0gQWJvcnQlcyBDb21wbGV0ZWQuXG4iLAorCQkJCSAgICAgICBzY2ItPmhzY2ItPnRhZywgdGFnID09IFNDQl9MSVNUX05VTEwgPworCQkJCSAgICAgICAiIiA6ICIgVGFnIik7CisJCQkJYWhjX2Fib3J0X3NjYnMoYWhjLCB0YXJnZXQsIGNoYW5uZWwsCisJCQkJCSAgICAgICBzYXZlZF9sdW4sIHRhZywKKwkJCQkJICAgICAgIFJPTEVfSU5JVElBVE9SLAorCQkJCQkgICAgICAgQ0FNX1JFUV9BQk9SVEVEKTsKKwkJCQlwcmludGVycm9yID0gMDsKKwkJCX0gZWxzZSBpZiAoYWhjX3NlbnRfbXNnKGFoYywgQUhDTVNHXzFCLAorCQkJCQkJTVNHX0JVU19ERVZfUkVTRVQsIFRSVUUpKSB7CisjaWZkZWYgX19GcmVlQlNEX18KKwkJCQkvKgorCQkJCSAqIERvbid0IG1hcmsgdGhlIHVzZXIncyByZXF1ZXN0IGZvciB0aGlzIEJEUgorCQkJCSAqIGFzIGNvbXBsZXRpbmcgd2l0aCBDQU1fQkRSX1NFTlQuICBDQU0zCisJCQkJICogc3BlY2lmaWVzIENBTV9SRVFfQ01QLgorCQkJCSAqLworCQkJCWlmIChzY2IgIT0gTlVMTAorCQkJCSAmJiBzY2ItPmlvX2N0eC0+Y2NiX2guZnVuY19jb2RlPT0gWFBUX1JFU0VUX0RFVgorCQkJCSAmJiBhaGNfbWF0Y2hfc2NiKGFoYywgc2NiLCB0YXJnZXQsIGNoYW5uZWwsCisJCQkJCQkgIENBTV9MVU5fV0lMRENBUkQsCisJCQkJCQkgIFNDQl9MSVNUX05VTEwsCisJCQkJCQkgIFJPTEVfSU5JVElBVE9SKSkgeworCQkJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9SRVFfQ01QKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJCQkJICAgIGluaXRpYXRvcl9yb2xlX2lkLAorCQkJCQkJICAgIHRhcmdldCwKKwkJCQkJCSAgICBDQU1fTFVOX1dJTERDQVJELAorCQkJCQkJICAgIGNoYW5uZWwsCisJCQkJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQkJCWFoY19oYW5kbGVfZGV2cmVzZXQoYWhjLCAmZGV2aW5mbywKKwkJCQkJCSAgICBDQU1fQkRSX1NFTlQsCisJCQkJCQkgICAgIkJ1cyBEZXZpY2UgUmVzZXQiLAorCQkJCQkJICAgIC8qdmVyYm9zZV9sZXZlbCovMCk7CisJCQkJcHJpbnRlcnJvciA9IDA7CisJCQl9IGVsc2UgaWYgKGFoY19zZW50X21zZyhhaGMsIEFIQ01TR19FWFQsCisJCQkJCQlNU0dfRVhUX1BQUiwgRkFMU0UpKSB7CisJCQkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQkJCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkJCQkvKgorCQkJCSAqIFBQUiBSZWplY3RlZC4gIFRyeSBub24tcHByIG5lZ290aWF0aW9uCisJCQkJICogYW5kIHJldHJ5IGNvbW1hbmQuCisJCQkJICovCisJCQkJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywKKwkJCQkJCQkgICAgZGV2aW5mby5jaGFubmVsLAorCQkJCQkJCSAgICBkZXZpbmZvLm91cl9zY3NpaWQsCisJCQkJCQkJICAgIGRldmluZm8udGFyZ2V0LAorCQkJCQkJCSAgICAmdHN0YXRlKTsKKwkJCQl0aW5mby0+Y3Vyci50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCQkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQkJCXRpbmZvLT5nb2FsLnBwcl9vcHRpb25zID0gMDsKKwkJCQlhaGNfcWluZmlmb19yZXF1ZXVlX3RhaWwoYWhjLCBzY2IpOworCQkJCXByaW50ZXJyb3IgPSAwOworCQkJfSBlbHNlIGlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULAorCQkJCQkJTVNHX0VYVF9XRFRSLCBGQUxTRSkpIHsKKwkJCQkvKgorCQkJCSAqIE5lZ290aWF0aW9uIFJlamVjdGVkLiAgR28tbmFycm93IGFuZAorCQkJCSAqIHJldHJ5IGNvbW1hbmQuCisJCQkJICovCisJCQkJYWhjX3NldF93aWR0aChhaGMsICZkZXZpbmZvLAorCQkJCQkgICAgICBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCQkgICAgICBBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19HT0FMLAorCQkJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCQkJYWhjX3FpbmZpZm9fcmVxdWV1ZV90YWlsKGFoYywgc2NiKTsKKwkJCQlwcmludGVycm9yID0gMDsKKwkJCX0gZWxzZSBpZiAoYWhjX3NlbnRfbXNnKGFoYywgQUhDTVNHX0VYVCwKKwkJCQkJCU1TR19FWFRfU0RUUiwgRkFMU0UpKSB7CisJCQkJLyoKKwkJCQkgKiBOZWdvdGlhdGlvbiBSZWplY3RlZC4gIEdvLWFzeW5jIGFuZAorCQkJCSAqIHJldHJ5IGNvbW1hbmQuCisJCQkJICovCisJCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLAorCQkJCQkJLypzeW5jcmF0ZSovTlVMTCwKKwkJCQkJCS8qcGVyaW9kKi8wLCAvKm9mZnNldCovMCwKKwkJCQkJCS8qcHByX29wdGlvbnMqLzAsCisJCQkJCQlBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19HT0FMLAorCQkJCQkJLypwYXVzZWQqL1RSVUUpOworCQkJCWFoY19xaW5maWZvX3JlcXVldWVfdGFpbChhaGMsIHNjYik7CisJCQkJcHJpbnRlcnJvciA9IDA7CisJCQl9CisJCX0KKwkJaWYgKHByaW50ZXJyb3IgIT0gMCkgeworCQkJdV9pbnQgaTsKKworCQkJaWYgKHNjYiAhPSBOVUxMKSB7CisJCQkJdV9pbnQgdGFnOworCisJCQkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKQorCQkJCQl0YWcgPSBzY2ItPmhzY2ItPnRhZzsKKwkJCQllbHNlCisJCQkJCXRhZyA9IFNDQl9MSVNUX05VTEw7CisJCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJCWFoY19hYm9ydF9zY2JzKGFoYywgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkgICAgICAgU0NCX0dFVF9MVU4oc2NiKSwgdGFnLAorCQkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsCisJCQkJCSAgICAgICBDQU1fVU5FWFBfQlVTRlJFRSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogV2UgaGFkIG5vdCBmdWxseSBpZGVudGlmaWVkIHRoaXMgY29ubmVjdGlvbiwKKwkJCQkgKiBzbyB3ZSBjYW5ub3QgYWJvcnQgYW55dGhpbmcuCisJCQkJICovCisJCQkJcHJpbnRmKCIlczogIiwgYWhjX25hbWUoYWhjKSk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoYXNlczsgaSsrKSB7CisJCQkJaWYgKGxhc3RwaGFzZSA9PSBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2UpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGxhc3RwaGFzZSAhPSBQX0JVU0ZSRUUpIHsKKwkJCQkvKgorCQkJCSAqIFJlbmVnb3RpYXRlIHdpdGggdGhpcyBkZXZpY2UgYXQgdGhlCisJCQkJICogbmV4dCBvcG9ydHVuaXR5IGp1c3QgaW4gY2FzZSB0aGlzIGJ1c2ZyZWUKKwkJCQkgKiBpcyBkdWUgdG8gYSBuZWdvdGlhdGlvbiBtaXNtYXRjaCB3aXRoIHRoZQorCQkJCSAqIGRldmljZS4KKwkJCQkgKi8KKwkJCQlhaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihhaGMsICZkZXZpbmZvKTsKKwkJCX0KKwkJCXByaW50ZigiVW5leHBlY3RlZCBidXNmcmVlICVzXG4iCisJCQkgICAgICAgIlNFUUFERFIgPT0gMHgleFxuIiwKKwkJCSAgICAgICBhaGNfcGhhc2VfdGFibGVbaV0ucGhhc2Vtc2csCisJCQkgICAgICAgYWhjX2luYihhaGMsIFNFUUFERFIwKQorCQkJCXwgKGFoY19pbmIoYWhjLCBTRVFBRERSMSkgPDwgOCkpOworCQl9CisJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVzOiBNaXNzaW5nIGNhc2UgaW4gYWhjX2hhbmRsZV9zY3NpaW50LiBzdGF0dXMgPSAleFxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIHN0YXR1cyk7CisJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwl9Cit9CisKKy8qCisgKiBGb3JjZSByZW5lZ290aWF0aW9uIHRvIG9jY3VyIHRoZSBuZXh0IHRpbWUgd2UgaW5pdGlhdGUKKyAqIGEgY29tbWFuZCB0byB0aGUgY3VycmVudCBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfZm9yY2VfcmVuZWdvdGlhdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGFyZ19pbmZvOworCXN0cnVjdAlhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwl0YXJnX2luZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywKKwkJCQkJZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkJZGV2aW5mby0+dGFyZ2V0LAorCQkJCQkmdHN0YXRlKTsKKwlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgZGV2aW5mbywgdHN0YXRlLAorCQkJICAgICAgIHRhcmdfaW5mbywgQUhDX05FR19JRl9OT05fQVNZTkMpOworfQorCisjZGVmaW5lIEFIQ19NQVhfU1RFUFMgMjAwMAordm9pZAorYWhjX2NsZWFyX2NyaXRpY2FsX3NlY3Rpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludAlzdGVwcGluZzsKKwlpbnQJc3RlcHM7CisJdV9pbnQJc2ltb2RlMDsKKwl1X2ludAlzaW1vZGUxOworCisJaWYgKGFoYy0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zID09IDApCisJCXJldHVybjsKKworCXN0ZXBwaW5nID0gRkFMU0U7CisJc3RlcHMgPSAwOworCXNpbW9kZTAgPSAwOworCXNpbW9kZTEgPSAwOworCWZvciAoOzspIHsKKwkJc3RydWN0CWNzICpjczsKKwkJdV9pbnQJc2VxYWRkcjsKKwkJdV9pbnQJaTsKKworCQlzZXFhZGRyID0gYWhjX2luYihhaGMsIFNFUUFERFIwKQorCQkJfCAoYWhjX2luYihhaGMsIFNFUUFERFIxKSA8PCA4KTsKKworCQkvKgorCQkgKiBTZXFhZGRyIHJlcHJlc2VudHMgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSwgCisJCSAqIHNvIHdlIGFyZSByZWFsbHkgZXhlY3V0aW5nIHRoZSBpbnN0cnVjdGlvbiBqdXN0CisJCSAqIGJlZm9yZSBpdC4KKwkJICovCisJCWlmIChzZXFhZGRyICE9IDApCisJCQlzZXFhZGRyIC09IDE7CisJCWNzID0gYWhjLT5jcml0aWNhbF9zZWN0aW9uczsKKwkJZm9yIChpID0gMDsgaSA8IGFoYy0+bnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBpKyssIGNzKyspIHsKKwkJCQorCQkJaWYgKGNzLT5iZWdpbiA8IHNlcWFkZHIgJiYgY3MtPmVuZCA+PSBzZXFhZGRyKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gYWhjLT5udW1fY3JpdGljYWxfc2VjdGlvbnMpCisJCQlicmVhazsKKworCQlpZiAoc3RlcHMgPiBBSENfTUFYX1NURVBTKSB7CisJCQlwcmludGYoIiVzOiBJbmZpbml0ZSBsb29wIGluIGNyaXRpY2FsIHNlY3Rpb25cbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CisJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CisJCQlwYW5pYygiY3JpdGljYWwgc2VjdGlvbiBsb29wIik7CisJCX0KKworCQlzdGVwcysrOworCQlpZiAoc3RlcHBpbmcgPT0gRkFMU0UpIHsKKworCQkJLyoKKwkJCSAqIERpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzIHNvIHRoYXQgdGhlCisJCQkgKiBzZXF1ZW5jZXIgd2lsbCBub3QgYmUgc3R1Y2sgYnkgYSBwYXVzaW5nCisJCQkgKiBpbnRlcnJ1cHQgY29uZGl0aW9uIHdoaWxlIHdlIGF0dGVtcHQgdG8KKwkJCSAqIGxlYXZlIGEgY3JpdGljYWwgc2VjdGlvbi4KKwkJCSAqLworCQkJc2ltb2RlMCA9IGFoY19pbmIoYWhjLCBTSU1PREUwKTsKKwkJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgMCk7CisJCQlzaW1vZGUxID0gYWhjX2luYihhaGMsIFNJTU9ERTEpOworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQkJCS8qCisJCQkJICogT24gRFQgY2xhc3MgY29udHJvbGxlcnMsIHdlCisJCQkJICogdXNlIHRoZSBlbmhhbmNlZCBidXNmcmVlIGxvZ2ljLgorCQkJCSAqIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHJlLWVuYWJsZQorCQkJCSAqIGJ1c2ZyZWUgZGV0ZWN0aW9uIHdpdGhpbiB0aGUKKwkJCQkgKiBjdXJyZW50IGNvbm5lY3Rpb24sIHNvIHdlIG11c3QKKwkJCQkgKiBsZWF2ZSBpdCBvbiB3aGlsZSBzaW5nbGUgc3RlcHBpbmcuCisJCQkJICovCisJCQkJYWhjX291dGIoYWhjLCBTSU1PREUxLCBzaW1vZGUxICYgRU5CVVNGUkVFKTsKKwkJCWVsc2UKKwkJCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIDApOworCQkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlNDU0lJTlQpOworCQkJYWhjX291dGIoYWhjLCBTRVFDVEwsIGFoYy0+c2VxY3RsIHwgU1RFUCk7CisJCQlzdGVwcGluZyA9IFRSVUU7CisJCX0KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKSB7CisJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJCVVNGUkVFKTsKKwkJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwkJfQorCQlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT51bnBhdXNlKTsKKwkJd2hpbGUgKCFhaGNfaXNfcGF1c2VkKGFoYykpCisJCQlhaGNfZGVsYXkoMjAwKTsKKwl9CisJaWYgKHN0ZXBwaW5nKSB7CisJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgc2ltb2RlMCk7CisJCWFoY19vdXRiKGFoYywgU0lNT0RFMSwgc2ltb2RlMSk7CisJCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBhaGMtPnNlcWN0bCk7CisJfQorfQorCisvKgorICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cy4KKyAqLwordm9pZAorYWhjX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCS8qIENsZWFyIGFueSBpbnRlcnJ1cHQgY29uZGl0aW9ucyB0aGlzIG1heSBoYXZlIGNhdXNlZCAqLworCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlNFTFRJTUVPfENMUkFUTk98Q0xSU0NTSVJTVEkKKwkJCQl8Q0xSQlVTRlJFRXxDTFJTQ1NJUEVSUnxDTFJQSEFTRUNIR3wKKwkJCQlDTFJSRVFJTklUKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19vdXRiKGFoYywgQ0xSU0lOVDAsIENMUlNFTERPfENMUlNFTERJfENMUlNFTElOR08pOworIAlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJTQ1NJSU5UKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWJ1Z2dpbmcgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIQ19ERUJVRwordWludDMyX3QgYWhjX2RlYnVnID0gQUhDX0RFQlVHX09QVFM7CisjZW5kaWYKKwordm9pZAorYWhjX3ByaW50X3NjYihzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiID0gc2NiLT5oc2NiOworCisJcHJpbnRmKCJzY2I6JXAgY29udHJvbDoweCV4IHNjc2lpZDoweCV4IGx1bjolZCBjZGJfbGVuOiVkXG4iLAorCSAgICAgICAodm9pZCAqKXNjYiwKKwkgICAgICAgaHNjYi0+Y29udHJvbCwKKwkgICAgICAgaHNjYi0+c2NzaWlkLAorCSAgICAgICBoc2NiLT5sdW4sCisJICAgICAgIGhzY2ItPmNkYl9sZW4pOworCXByaW50ZigiU2hhcmVkIERhdGE6ICIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaHNjYi0+c2hhcmVkX2RhdGEuY2RiKTsgaSsrKQorCQlwcmludGYoIiUjMDJ4IiwgaHNjYi0+c2hhcmVkX2RhdGEuY2RiW2ldKTsKKwlwcmludGYoIiAgICAgICAgZGF0YXB0cjolI3ggZGF0YWNudDolI3ggc2dwdHI6JSN4IHRhZzolI3hcbiIsCisJCWFoY19sZTMydG9oKGhzY2ItPmRhdGFwdHIpLAorCQlhaGNfbGUzMnRvaChoc2NiLT5kYXRhY250KSwKKwkJYWhjX2xlMzJ0b2goaHNjYi0+c2dwdHIpLAorCQloc2NiLT50YWcpOworCWlmIChzY2ItPnNnX2NvdW50ID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7CisJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkXG4iLAorCQkJICAgICAgIGksCisJCQkgICAgICAgKGFoY19sZTMydG9oKHNjYi0+c2dfbGlzdFtpXS5sZW4pID4+IDI0CisJCQkgICAgICAgICYgU0dfSElHSF9BRERSX0JJVFMpLAorCQkJICAgICAgIGFoY19sZTMydG9oKHNjYi0+c2dfbGlzdFtpXS5hZGRyKSwKKwkJCSAgICAgICBhaGNfbGUzMnRvaChzY2ItPnNnX2xpc3RbaV0ubGVuKSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFRyYW5zZmVyIE5lZ290aWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQWxsb2NhdGUgcGVyIHRhcmdldCBtb2RlIGluc3RhbmNlIChJRCB3ZSByZXNwb25kIHRvIGFzIGEgdGFyZ2V0KQorICogdHJhbnNmZXIgbmVnb3RpYXRpb24gZGF0YSBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgc3RydWN0IGFoY190bW9kZV90c3RhdGUgKgorYWhjX2FsbG9jX3RzdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqbWFzdGVyX3RzdGF0ZTsKKwlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCWludCBpOworCisJbWFzdGVyX3RzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2FoYy0+b3VyX2lkXTsKKwlpZiAoY2hhbm5lbCA9PSAnQicpIHsKKwkJc2NzaV9pZCArPSA4OworCQltYXN0ZXJfdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbYWhjLT5vdXJfaWRfYiArIDhdOworCX0KKwlpZiAoYWhjLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF0gIT0gTlVMTAorCSAmJiBhaGMtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSAhPSBtYXN0ZXJfdHN0YXRlKQorCQlwYW5pYygiJXM6IGFoY19hbGxvY190c3RhdGUgLSBUYXJnZXQgYWxyZWFkeSBhbGxvY2F0ZWQiLAorCQkgICAgICBhaGNfbmFtZShhaGMpKTsKKwl0c3RhdGUgPSAoc3RydWN0IGFoY190bW9kZV90c3RhdGUqKW1hbGxvYyhzaXplb2YoKnRzdGF0ZSksCisJCQkJCQkgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmICh0c3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhbGxvY2F0ZWQgYSBtYXN0ZXIgdHN0YXRlLCBjb3B5IHVzZXIgc2V0dGluZ3MgZnJvbQorCSAqIHRoZSBtYXN0ZXIgdHN0YXRlICh0YWtlbiBmcm9tIFNSQU0gb3IgdGhlIEVFUFJPTSkgZm9yIHRoaXMKKwkgKiBjaGFubmVsLCBidXQgcmVzZXQgb3VyIGN1cnJlbnQgYW5kIGdvYWwgc2V0dGluZ3MgdG8gYXN5bmMvbmFycm93CisJICogdW50aWwgYW4gaW5pdGlhdG9yIHRhbGtzIHRvIHVzLgorCSAqLworCWlmIChtYXN0ZXJfdHN0YXRlICE9IE5VTEwpIHsKKwkJbWVtY3B5KHRzdGF0ZSwgbWFzdGVyX3RzdGF0ZSwgc2l6ZW9mKCp0c3RhdGUpKTsKKwkJbWVtc2V0KHRzdGF0ZS0+ZW5hYmxlZF9sdW5zLCAwLCBzaXplb2YodHN0YXRlLT5lbmFibGVkX2x1bnMpKTsKKwkJdHN0YXRlLT51bHRyYWVuYiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykgeworCQkJbWVtc2V0KCZ0c3RhdGUtPnRyYW5zaW5mb1tpXS5jdXJyLCAwLAorCQkJICAgICAgc2l6ZW9mKHRzdGF0ZS0+dHJhbnNpbmZvW2ldLmN1cnIpKTsKKwkJCW1lbXNldCgmdHN0YXRlLT50cmFuc2luZm9baV0uZ29hbCwgMCwKKwkJCSAgICAgIHNpemVvZih0c3RhdGUtPnRyYW5zaW5mb1tpXS5nb2FsKSk7CisJCX0KKwl9IGVsc2UKKwkJbWVtc2V0KHRzdGF0ZSwgMCwgc2l6ZW9mKCp0c3RhdGUpKTsKKwlhaGMtPmVuYWJsZWRfdGFyZ2V0c1tzY3NpX2lkXSA9IHRzdGF0ZTsKKwlyZXR1cm4gKHRzdGF0ZSk7Cit9CisKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKy8qCisgKiBGcmVlIHBlciB0YXJnZXQgbW9kZSBpbnN0YW5jZSAoSUQgd2UgcmVzcG9uZCB0byBhcyBhIHRhcmdldCkKKyAqIHRyYW5zZmVyIG5lZ290aWF0aW9uIGRhdGEgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19mcmVlX3RzdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHNjc2lfaWQsIGNoYXIgY2hhbm5lbCwgaW50IGZvcmNlKQoreworCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisKKwkvKgorCSAqIERvbid0IGNsZWFuIHVwIG91ciAibWFzdGVyIiB0c3RhdGUuCisJICogSXQgaGFzIG91ciBkZWZhdWx0IHVzZXIgc2V0dGluZ3MuCisJICovCisJaWYgKCgoY2hhbm5lbCA9PSAnQicgJiYgc2NzaV9pZCA9PSBhaGMtPm91cl9pZF9iKQorCSAgfHwgKGNoYW5uZWwgPT0gJ0EnICYmIHNjc2lfaWQgPT0gYWhjLT5vdXJfaWQpKQorCSAmJiBmb3JjZSA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlzY3NpX2lkICs9IDg7CisJdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbc2NzaV9pZF07CisJaWYgKHRzdGF0ZSAhPSBOVUxMKQorCQlmcmVlKHRzdGF0ZSwgTV9ERVZCVUYpOworCWFoYy0+ZW5hYmxlZF90YXJnZXRzW3Njc2lfaWRdID0gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBhbiBhY3RpdmUgY29ubmVjdGlvbiB0byBhIHRhcmdldCBvbiB0aGUgYnVzLAorICogdGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbmVhcmVzdCBzeW5jcmF0ZSB0byB0aGUgaW5wdXQgcGVyaW9kIGxpbWl0ZWQKKyAqIGJ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGJ1cyBjb25uZWN0aXZpdHkgb2YgYW5kIHN5bmMgc2V0dGluZ3MgZm9yCisgKiB0aGUgdGFyZ2V0LgorICovCitzdHJ1Y3QgYWhjX3N5bmNyYXRlICoKK2FoY19kZXZsaW1pdGVkX3N5bmNyYXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJCXVfaW50ICpwZXJpb2QsIHVfaW50ICpwcHJfb3B0aW9ucywgcm9sZV90IHJvbGUpCit7CisJc3RydWN0CWFoY190cmFuc2luZm8gKnRyYW5zaW5mbzsKKwl1X2ludAltYXhzeW5jOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlpZiAoKGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIEVOQUI0MCkgIT0gMAorCQkgJiYgKGFoY19pbmIoYWhjLCBTU1RBVDIpICYgRVhQX0FDVElWRSkgPT0gMCkgeworCQkJbWF4c3luYyA9IEFIQ19TWU5DUkFURV9EVDsKKwkJfSBlbHNlIHsKKwkJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkE7CisJCQkvKiBDYW4ndCBkbyBEVCBvbiBhbiBTRSBidXMgKi8KKwkJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCQl9CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgeworCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX1VMVFJBOworCX0gZWxzZSB7CisJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfRkFTVDsKKwl9CisJLyoKKwkgKiBOZXZlciBhbGxvdyBhIHZhbHVlIGhpZ2hlciB0aGFuIG91ciBjdXJyZW50IGdvYWwKKwkgKiBwZXJpb2Qgb3RoZXJ3aXNlIHdlIG1heSBhbGxvdyBhIHRhcmdldCBpbml0aWF0ZWQKKwkgKiBuZWdvdGlhdGlvbiB0byBnbyBhYm92ZSB0aGUgbGltaXQgYXMgc2V0IGJ5IHRoZQorCSAqIHVzZXIuICBJbiB0aGUgY2FzZSBvZiBhbiBpbml0aWF0b3IgaW5pdGlhdGVkCisJICogc3luYyBuZWdvdGlhdGlvbiwgd2UgbGltaXQgYmFzZWQgb24gdGhlIHVzZXIKKwkgKiBzZXR0aW5nLiAgVGhpcyBhbGxvd3MgdGhlIHN5c3RlbSB0byBzdGlsbCBhY2NlcHQKKwkgKiBpbmNvbWluZyBuZWdvdGlhdGlvbnMgZXZlbiBpZiB0YXJnZXQgaW5pdGlhdGVkCisJICogbmVnb3RpYXRpb24gaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKwlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJdHJhbnNpbmZvID0gJnRpbmZvLT51c2VyOworCWVsc2UgCisJCXRyYW5zaW5mbyA9ICZ0aW5mby0+Z29hbDsKKwkqcHByX29wdGlvbnMgJj0gdHJhbnNpbmZvLT5wcHJfb3B0aW9uczsKKwlpZiAodHJhbnNpbmZvLT53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKSB7CisJCW1heHN5bmMgPSBNQVgobWF4c3luYywgQUhDX1NZTkNSQVRFX1VMVFJBMik7CisJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCX0KKwlpZiAodHJhbnNpbmZvLT5wZXJpb2QgPT0gMCkgeworCQkqcGVyaW9kID0gMDsKKwkJKnBwcl9vcHRpb25zID0gMDsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJKnBlcmlvZCA9IE1BWCgqcGVyaW9kLCB0cmFuc2luZm8tPnBlcmlvZCk7CisJcmV0dXJuIChhaGNfZmluZF9zeW5jcmF0ZShhaGMsIHBlcmlvZCwgcHByX29wdGlvbnMsIG1heHN5bmMpKTsKK30KKworLyoKKyAqIExvb2sgdXAgdGhlIHZhbGlkIHBlcmlvZCB0byBTQ1NJUkFURSBjb252ZXJzaW9uIGluIG91ciB0YWJsZS4KKyAqIFJldHVybiB0aGUgcGVyaW9kIGFuZCBvZmZzZXQgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgdGFyZ2V0CisgKiBpZiB0aGlzIHdhcyB0aGUgYmVnaW5uaW5nIG9mIGFuIFNEVFIuCisgKi8KK3N0cnVjdCBhaGNfc3luY3JhdGUgKgorYWhjX2ZpbmRfc3luY3JhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCAqcGVyaW9kLAorCQkgIHVfaW50ICpwcHJfb3B0aW9ucywgdV9pbnQgbWF4c3luYykKK3sKKwlzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCkKKwkJKnBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CisKKwkvKiBTa2lwIGFsbCBEVCBvbmx5IGVudHJpZXMgaWYgRFQgaXMgbm90IGF2YWlsYWJsZSAqLworCWlmICgoKnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSA9PSAwCisJICYmIG1heHN5bmMgPCBBSENfU1lOQ1JBVEVfVUxUUkEyKQorCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX1VMVFJBMjsKKwkKKwlmb3IgKHN5bmNyYXRlID0gJmFoY19zeW5jcmF0ZXNbbWF4c3luY107CisJICAgICBzeW5jcmF0ZS0+cmF0ZSAhPSBOVUxMOworCSAgICAgc3luY3JhdGUrKykgeworCisJCS8qCisJCSAqIFRoZSBVbHRyYTIgdGFibGUgZG9lc24ndCBnbyBhcyBsb3cKKwkJICogYXMgZm9yIHRoZSBGYXN0L1VsdHJhIGNhcmRzLgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMAorCQkgJiYgKHN5bmNyYXRlLT5zeGZyX3UyID09IDApKQorCQkJYnJlYWs7CisKKwkJaWYgKCpwZXJpb2QgPD0gc3luY3JhdGUtPnBlcmlvZCkgeworCQkJLyoKKwkJCSAqIFdoZW4gcmVzcG9uZGluZyB0byBhIHRhcmdldCB0aGF0IHJlcXVlc3RzCisJCQkgKiBzeW5jLCB0aGUgcmVxdWVzdGVkIHJhdGUgbWF5IGZhbGwgYmV0d2VlbgorCQkJICogdHdvIHJhdGVzIHRoYXQgd2UgY2FuIG91dHB1dCwgYnV0IHN0aWxsIGJlCisJCQkgKiBhIHJhdGUgdGhhdCB3ZSBjYW4gcmVjZWl2ZS4gIEJlY2F1c2Ugb2YgdGhpcywKKwkJCSAqIHdlIHdhbnQgdG8gcmVzcG9uZCB0byB0aGUgdGFyZ2V0IHdpdGgKKwkJCSAqIHRoZSBzYW1lIHJhdGUgdGhhdCBpdCBzZW50IHRvIHVzIGV2ZW4KKwkJCSAqIGlmIHRoZSBwZXJpb2Qgd2UgdXNlIHRvIHNlbmQgZGF0YSB0byBpdAorCQkJICogaXMgbG93ZXIuICBPbmx5IGxvd2VyIHRoZSByZXNwb25zZSBwZXJpb2QKKwkJCSAqIGlmIHdlIG11c3QuCisJCQkgKi8KKwkJCWlmIChzeW5jcmF0ZSA9PSAmYWhjX3N5bmNyYXRlc1ttYXhzeW5jXSkKKwkJCQkqcGVyaW9kID0gc3luY3JhdGUtPnBlcmlvZDsKKworCQkJLyoKKwkJCSAqIEF0IHNvbWUgc3BlZWRzLCB3ZSBvbmx5IHN1cHBvcnQKKwkJCSAqIFNUIHRyYW5zZmVycy4KKwkJCSAqLworCQkgCWlmICgoc3luY3JhdGUtPnN4ZnJfdTIgJiBTVF9TWEZSKSAhPSAwKQorCQkJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKCpwZXJpb2QgPT0gMCkKKwkgfHwgKHN5bmNyYXRlLT5yYXRlID09IE5VTEwpCisJIHx8ICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDAKKwkgICYmIChzeW5jcmF0ZS0+c3hmcl91MiA9PSAwKSkpIHsKKwkJLyogVXNlIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMuICovCisJCSpwZXJpb2QgPSAwOworCQlzeW5jcmF0ZSA9IE5VTEw7CisJCSpwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfRFRfUkVROworCX0KKwlyZXR1cm4gKHN5bmNyYXRlKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSBhbiBlbnRyeSBpbiBvdXIgc3luY3JhdGUgdGFibGUgdG8gdGhlIFNDU0kgZXF1aXZhbGVudAorICogc3luYyAicGVyaW9kIiBmYWN0b3IuCisgKi8KK3VfaW50CithaGNfZmluZF9wZXJpb2Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBzY3NpcmF0ZSwgdV9pbnQgbWF4c3luYykKK3sKKwlzdHJ1Y3QgYWhjX3N5bmNyYXRlICpzeW5jcmF0ZTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCXNjc2lyYXRlICY9IFNYRlJfVUxUUkEyOworCWVsc2UKKwkJc2NzaXJhdGUgJj0gU1hGUjsKKworCXN5bmNyYXRlID0gJmFoY19zeW5jcmF0ZXNbbWF4c3luY107CisJd2hpbGUgKHN5bmNyYXRlLT5yYXRlICE9IE5VTEwpIHsKKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQlpZiAoc3luY3JhdGUtPnN4ZnJfdTIgPT0gMCkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKHNjc2lyYXRlID09IChzeW5jcmF0ZS0+c3hmcl91MiAmIFNYRlJfVUxUUkEyKSkKKwkJCQlyZXR1cm4gKHN5bmNyYXRlLT5wZXJpb2QpOworCQl9IGVsc2UgaWYgKHNjc2lyYXRlID09IChzeW5jcmF0ZS0+c3hmciAmIFNYRlIpKSB7CisJCQkJcmV0dXJuIChzeW5jcmF0ZS0+cGVyaW9kKTsKKwkJfQorCQlzeW5jcmF0ZSsrOworCX0KKwlyZXR1cm4gKDApOyAvKiBhc3luYyAqLworfQorCisvKgorICogVHJ1bmNhdGUgdGhlIGdpdmVuIHN5bmNocm9ub3VzIG9mZnNldCB0byBhIHZhbHVlIHRoZQorICogY3VycmVudCBhZGFwdGVyIHR5cGUgYW5kIHN5bmNyYXRlIGFyZSBjYXBhYmxlIG9mLgorICovCit2b2lkCithaGNfdmFsaWRhdGVfb2Zmc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJICAgIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJICAgIHN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlLAorCQkgICAgdV9pbnQgKm9mZnNldCwgaW50IHdpZGUsIHJvbGVfdCByb2xlKQoreworCXVfaW50IG1heG9mZnNldDsKKworCS8qIExpbWl0IG9mZnNldCB0byB3aGF0IHdlIGNhbiBkbyAqLworCWlmIChzeW5jcmF0ZSA9PSBOVUxMKSB7CisJCW1heG9mZnNldCA9IDA7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisJfSBlbHNlIHsKKwkJaWYgKHdpZGUpCisJCQltYXhvZmZzZXQgPSBNQVhfT0ZGU0VUXzE2QklUOworCQllbHNlCisJCQltYXhvZmZzZXQgPSBNQVhfT0ZGU0VUXzhCSVQ7CisJfQorCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgbWF4b2Zmc2V0KTsKKwlpZiAodGluZm8gIT0gTlVMTCkgeworCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgdGluZm8tPnVzZXIub2Zmc2V0KTsKKwkJZWxzZQorCQkJKm9mZnNldCA9IE1JTigqb2Zmc2V0LCB0aW5mby0+Z29hbC5vZmZzZXQpOworCX0KK30KKworLyoKKyAqIFRydW5jYXRlIHRoZSBnaXZlbiB0cmFuc2ZlciB3aWR0aCBwYXJhbWV0ZXIgdG8gYSB2YWx1ZSB0aGUKKyAqIGN1cnJlbnQgYWRhcHRlciB0eXBlIGlzIGNhcGFibGUgb2YuCisgKi8KK3ZvaWQKK2FoY192YWxpZGF0ZV93aWR0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKKwkJICAgdV9pbnQgKmJ1c193aWR0aCwgcm9sZV90IHJvbGUpCit7CisJc3dpdGNoICgqYnVzX3dpZHRoKSB7CisJZGVmYXVsdDoKKwkJaWYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgeworCQkJLyogUmVzcG9uZCBXaWRlICovCisJCQkqYnVzX3dpZHRoID0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgTVNHX0VYVF9XRFRSX0JVU184X0JJVDoKKwkJKmJ1c193aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisJCWJyZWFrOworCX0KKwlpZiAodGluZm8gIT0gTlVMTCkgeworCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPnVzZXIud2lkdGgsICpidXNfd2lkdGgpOworCQllbHNlCisJCQkqYnVzX3dpZHRoID0gTUlOKHRpbmZvLT5nb2FsLndpZHRoLCAqYnVzX3dpZHRoKTsKKwl9Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGJpdG1hc2sgb2YgdGFyZ2V0cyBmb3Igd2hpY2ggdGhlIGNvbnRyb2xsZXIgc2hvdWxkCisgKiBuZWdvdGlhdGUgd2l0aCBhdCB0aGUgbmV4dCBjb252ZW5pZW50IG9wb3J0dW5pdHkuICBUaGlzIGN1cnJlbnRseQorICogbWVhbnMgdGhlIG5leHQgdGltZSB3ZSBzZW5kIHRoZSBpbml0aWFsIGlkZW50aWZ5IG1lc3NhZ2VzIGZvcgorICogYSBuZXcgdHJhbnNhY3Rpb24uCisgKi8KK2ludAorYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgICAgIHN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGUsCisJCSAgICAgICBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm8sIGFoY19uZWdfdHlwZSBuZWdfdHlwZSkKK3sKKwl1X2ludCBhdXRvX25lZ290aWF0ZV9vcmlnOworCisJYXV0b19uZWdvdGlhdGVfb3JpZyA9IHRzdGF0ZS0+YXV0b19uZWdvdGlhdGU7CisJaWYgKG5lZ190eXBlID09IEFIQ19ORUdfQUxXQVlTKSB7CisJCS8qCisJCSAqIEZvcmNlIG91ciAiY3VycmVudCIgc2V0dGluZ3MgdG8gYmUKKwkJICogdW5rbm93biBzbyB0aGF0IHVubGVzcyBhIGJ1cyByZXNldAorCQkgKiBvY2N1cnMgdGhlIG5lZWQgdG8gcmVuZWdvdGlhdGUgaXMKKwkJICogcmVjb3JkZWQgcGVyc2lzdGVudGx5LgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApCisJCQl0aW5mby0+Y3Vyci53aWR0aCA9IEFIQ19XSURUSF9VTktOT1dOOworCQl0aW5mby0+Y3Vyci5wZXJpb2QgPSBBSENfUEVSSU9EX1VOS05PV047CisJCXRpbmZvLT5jdXJyLm9mZnNldCA9IEFIQ19PRkZTRVRfVU5LTk9XTjsKKwl9CisJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCAhPSB0aW5mby0+Z29hbC5wZXJpb2QKKwkgfHwgdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGgKKwkgfHwgdGluZm8tPmN1cnIub2Zmc2V0ICE9IHRpbmZvLT5nb2FsLm9mZnNldAorCSB8fCB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyAhPSB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucworCSB8fCAobmVnX3R5cGUgPT0gQUhDX05FR19JRl9OT05fQVNZTkMKKwkgICYmICh0aW5mby0+Z29hbC5vZmZzZXQgIT0gMAorCSAgIHx8IHRpbmZvLT5nb2FsLndpZHRoICE9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQKKwkgICB8fCB0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyAhPSAwKSkpCisJCXRzdGF0ZS0+YXV0b19uZWdvdGlhdGUgfD0gZGV2aW5mby0+dGFyZ2V0X21hc2s7CisJZWxzZQorCQl0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICY9IH5kZXZpbmZvLT50YXJnZXRfbWFzazsKKworCXJldHVybiAoYXV0b19uZWdvdGlhdGVfb3JpZyAhPSB0c3RhdGUtPmF1dG9fbmVnb3RpYXRlKTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgdXNlci9nb2FsL2N1cnIgdGFibGVzIG9mIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uCisgKiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMsIGluIHRoZSBjYXNlIG9mIGEgY3VycmVudCBvciBhY3RpdmUgdXBkYXRlLAorICogYW55IGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgaG9zdCBjb250cm9sbGVyLiAgSW4gdGhlIGNhc2Ugb2YgYW4KKyAqIGFjdGl2ZSB1cGRhdGUsIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGlzIGN1cnJlbnRseSB0YWxraW5nIHRvIHVzIG9uCisgKiB0aGUgYnVzLCBzbyB0aGUgdHJhbnNmZXIgcGFyYW1ldGVyIHVwZGF0ZSBtdXN0IHRha2UgZWZmZWN0CisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZAorYWhjX3NldF9zeW5jcmF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJIHN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlLCB1X2ludCBwZXJpb2QsCisJCSB1X2ludCBvZmZzZXQsIHVfaW50IHBwcl9vcHRpb25zLCB1X2ludCB0eXBlLCBpbnQgcGF1c2VkKQoreworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50CW9sZF9wZXJpb2Q7CisJdV9pbnQJb2xkX29mZnNldDsKKwl1X2ludAlvbGRfcHByOworCWludAlhY3RpdmU7CisJaW50CXVwZGF0ZV9uZWVkZWQ7CisKKwlhY3RpdmUgPSAodHlwZSAmIEFIQ19UUkFOU19BQ1RJVkUpID09IEFIQ19UUkFOU19BQ1RJVkU7CisJdXBkYXRlX25lZWRlZCA9IDA7CisKKwlpZiAoc3luY3JhdGUgPT0gTlVMTCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCX0KKworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfVVNFUikgIT0gMCkgeworCQl0aW5mby0+dXNlci5wZXJpb2QgPSBwZXJpb2Q7CisJCXRpbmZvLT51c2VyLm9mZnNldCA9IG9mZnNldDsKKwkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKwl9CisKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfR09BTCkgIT0gMCkgeworCQl0aW5mby0+Z29hbC5wZXJpb2QgPSBwZXJpb2Q7CisJCXRpbmZvLT5nb2FsLm9mZnNldCA9IG9mZnNldDsKKwkJdGluZm8tPmdvYWwucHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKwl9CisKKwlvbGRfcGVyaW9kID0gdGluZm8tPmN1cnIucGVyaW9kOworCW9sZF9vZmZzZXQgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7CisJb2xkX3BwcgkgICA9IHRpbmZvLT5jdXJyLnBwcl9vcHRpb25zOworCisJaWYgKCh0eXBlICYgQUhDX1RSQU5TX0NVUikgIT0gMAorCSAmJiAob2xkX3BlcmlvZCAhPSBwZXJpb2QKKwkgIHx8IG9sZF9vZmZzZXQgIT0gb2Zmc2V0CisJICB8fCBvbGRfcHByICE9IHBwcl9vcHRpb25zKSkgeworCQl1X2ludAlzY3NpcmF0ZTsKKworCQl1cGRhdGVfbmVlZGVkKys7CisJCXNjc2lyYXRlID0gdGluZm8tPnNjc2lyYXRlOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisKKwkJCXNjc2lyYXRlICY9IH4oU1hGUl9VTFRSQTJ8U0lOR0xFX0VER0V8RU5BQkxFX0NSQyk7CisJCQlpZiAoc3luY3JhdGUgIT0gTlVMTCkgeworCQkJCXNjc2lyYXRlIHw9IHN5bmNyYXRlLT5zeGZyX3UyOworCQkJCWlmICgocHByX29wdGlvbnMgJiBNU0dfRVhUX1BQUl9EVF9SRVEpICE9IDApCisJCQkJCXNjc2lyYXRlIHw9IEVOQUJMRV9DUkM7CisJCQkJZWxzZQorCQkJCQlzY3NpcmF0ZSB8PSBTSU5HTEVfRURHRTsKKwkJCX0KKwkJfSBlbHNlIHsKKworCQkJc2NzaXJhdGUgJj0gfihTWEZSfFNPRlMpOworCQkJLyoKKwkJCSAqIEVuc3VyZSBVbHRyYSBtb2RlIGlzIHNldCBwcm9wZXJseSBmb3IKKwkJCSAqIHRoaXMgdGFyZ2V0LgorCQkJICovCisJCQl0c3RhdGUtPnVsdHJhZW5iICY9IH5kZXZpbmZvLT50YXJnZXRfbWFzazsKKwkJCWlmIChzeW5jcmF0ZSAhPSBOVUxMKSB7CisJCQkJaWYgKHN5bmNyYXRlLT5zeGZyICYgVUxUUkFfU1hGUikgeworCQkJCQl0c3RhdGUtPnVsdHJhZW5iIHw9CisJCQkJCQlkZXZpbmZvLT50YXJnZXRfbWFzazsKKwkJCQl9CisJCQkJc2NzaXJhdGUgfD0gc3luY3JhdGUtPnN4ZnIgJiBTWEZSOworCQkJCXNjc2lyYXRlIHw9IG9mZnNldCAmIFNPRlM7CisJCQl9CisJCQlpZiAoYWN0aXZlKSB7CisJCQkJdV9pbnQgc3hmcmN0bDA7CisKKwkJCQlzeGZyY3RsMCA9IGFoY19pbmIoYWhjLCBTWEZSQ1RMMCk7CisJCQkJc3hmcmN0bDAgJj0gfkZBU1QyMDsKKwkJCQlpZiAodHN0YXRlLT51bHRyYWVuYiAmIGRldmluZm8tPnRhcmdldF9tYXNrKQorCQkJCQlzeGZyY3RsMCB8PSBGQVNUMjA7CisJCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwgc3hmcmN0bDApOworCQkJfQorCQl9CisJCWlmIChhY3RpdmUpIHsKKwkJCWFoY19vdXRiKGFoYywgU0NTSVJBVEUsIHNjc2lyYXRlKTsKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCQkJYWhjX291dGIoYWhjLCBTQ1NJT0ZGU0VULCBvZmZzZXQpOworCQl9CisKKwkJdGluZm8tPnNjc2lyYXRlID0gc2NzaXJhdGU7CisJCXRpbmZvLT5jdXJyLnBlcmlvZCA9IHBlcmlvZDsKKwkJdGluZm8tPmN1cnIub2Zmc2V0ID0gb2Zmc2V0OworCQl0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCisJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCWlmIChib290dmVyYm9zZSkgeworCQkJaWYgKG9mZnNldCAhPSAwKSB7CisJCQkJcHJpbnRmKCIlczogdGFyZ2V0ICVkIHN5bmNocm9ub3VzIGF0ICVzTUh6JXMsICIKKwkJCQkgICAgICAgIm9mZnNldCA9IDB4JXhcbiIsIGFoY19uYW1lKGFoYyksCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgc3luY3JhdGUtPnJhdGUsCisJCQkJICAgICAgIChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkKKwkJCQkgICAgICAgPyAiIERUIiA6ICIiLCBvZmZzZXQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgdXNpbmcgIgorCQkJCSAgICAgICAiYXN5bmNocm9ub3VzIHRyYW5zZmVyc1xuIiwKKwkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0KTsKKwkJCX0KKwkJfQorCX0KKworCXVwZGF0ZV9uZWVkZWQgKz0gYWhjX3VwZGF0ZV9uZWdfcmVxdWVzdChhaGMsIGRldmluZm8sIHRzdGF0ZSwKKwkJCQkJCXRpbmZvLCBBSENfTkVHX1RPX0dPQUwpOworCisJaWYgKHVwZGF0ZV9uZWVkZWQpCisJCWFoY191cGRhdGVfcGVuZGluZ19zY2JzKGFoYyk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHVzZXIvZ29hbC9jdXJyIHRhYmxlcyBvZiB3aWRlIG5lZ290aWF0aW9uCisgKiBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMsIGluIHRoZSBjYXNlIG9mIGEgY3VycmVudCBvciBhY3RpdmUgdXBkYXRlLAorICogYW55IGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgaG9zdCBjb250cm9sbGVyLiAgSW4gdGhlIGNhc2Ugb2YgYW4KKyAqIGFjdGl2ZSB1cGRhdGUsIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGlzIGN1cnJlbnRseSB0YWxraW5nIHRvIHVzIG9uCisgKiB0aGUgYnVzLCBzbyB0aGUgdHJhbnNmZXIgcGFyYW1ldGVyIHVwZGF0ZSBtdXN0IHRha2UgZWZmZWN0CisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZAorYWhjX3NldF93aWR0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkgICAgICB1X2ludCB3aWR0aCwgdV9pbnQgdHlwZSwgaW50IHBhdXNlZCkKK3sKKwlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludAlvbGR3aWR0aDsKKwlpbnQJYWN0aXZlOworCWludAl1cGRhdGVfbmVlZGVkOworCisJYWN0aXZlID0gKHR5cGUgJiBBSENfVFJBTlNfQUNUSVZFKSA9PSBBSENfVFJBTlNfQUNUSVZFOworCXVwZGF0ZV9uZWVkZWQgPSAwOworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfVVNFUikgIT0gMCkKKwkJdGluZm8tPnVzZXIud2lkdGggPSB3aWR0aDsKKworCWlmICgodHlwZSAmIEFIQ19UUkFOU19HT0FMKSAhPSAwKQorCQl0aW5mby0+Z29hbC53aWR0aCA9IHdpZHRoOworCisJb2xkd2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKKwlpZiAoKHR5cGUgJiBBSENfVFJBTlNfQ1VSKSAhPSAwICYmIG9sZHdpZHRoICE9IHdpZHRoKSB7CisJCXVfaW50CXNjc2lyYXRlOworCisJCXVwZGF0ZV9uZWVkZWQrKzsKKwkJc2NzaXJhdGUgPSAgdGluZm8tPnNjc2lyYXRlOworCQlzY3NpcmF0ZSAmPSB+V0lERVhGRVI7CisJCWlmICh3aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkKKwkJCXNjc2lyYXRlIHw9IFdJREVYRkVSOworCisJCXRpbmZvLT5zY3NpcmF0ZSA9IHNjc2lyYXRlOworCisJCWlmIChhY3RpdmUpCisJCQlhaGNfb3V0YihhaGMsIFNDU0lSQVRFLCBzY3NpcmF0ZSk7CisKKwkJdGluZm8tPmN1cnIud2lkdGggPSB3aWR0aDsKKworCQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19UUkFOU0ZFUl9ORUcsIE5VTEwpOworCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCXByaW50ZigiJXM6IHRhcmdldCAlZCB1c2luZyAlZGJpdCB0cmFuc2ZlcnNcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIDggKiAoMHgwMSA8PCB3aWR0aCkpOworCQl9CisJfQorCisJdXBkYXRlX25lZWRlZCArPSBhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgZGV2aW5mbywgdHN0YXRlLAorCQkJCQkJdGluZm8sIEFIQ19ORUdfVE9fR09BTCk7CisJaWYgKHVwZGF0ZV9uZWVkZWQpCisJCWFoY191cGRhdGVfcGVuZGluZ19zY2JzKGFoYyk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGFnZ2VkIHF1ZXVpbmcgZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorICovCit2b2lkCithaGNfc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJICAgICBhaGNfcXVldWVfYWxnIGFsZykKK3sKKyAJYWhjX3BsYXRmb3JtX3NldF90YWdzKGFoYywgZGV2aW5mbywgYWxnKTsKKyAJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisgCQkgICAgICAgZGV2aW5mby0+bHVuLCBBQ19UUkFOU0ZFUl9ORUcsICZhbGcpOworfQorCisvKgorICogV2hlbiB0aGUgdHJhbnNmZXIgc2V0dGluZ3MgZm9yIGEgY29ubmVjdGlvbiBjaGFuZ2UsIHVwZGF0ZSBhbnkKKyAqIGluLXRyYW5zaXQgU0NCcyB0byBjb250YWluIHRoZSBuZXcgZGF0YSBzbyB0aGUgaGFyZHdhcmUgd2lsbAorICogYmUgc2V0IGNvcnJlY3RseSBkdXJpbmcgZnV0dXJlIChyZSlzZWxlY3Rpb25zLgorICovCitzdGF0aWMgdm9pZAorYWhjX3VwZGF0ZV9wZW5kaW5nX3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdAlzY2IgKnBlbmRpbmdfc2NiOworCWludAlwZW5kaW5nX3NjYl9jb3VudDsKKwlpbnQJaTsKKwlpbnQJcGF1c2VkOworCXVfaW50CXNhdmVkX3NjYnB0cjsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIHBlbmRpbmcgU0NCIGxpc3QgYW5kIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUKKwkgKiBTQ0JzIHRoZXJlIGhhdmUgdGhlIHByb3BlciBzZXR0aW5ncy4KKwkgKi8KKwlwZW5kaW5nX3NjYl9jb3VudCA9IDA7CisJTElTVF9GT1JFQUNIKHBlbmRpbmdfc2NiLCAmYWhjLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisJCXN0cnVjdCBoYXJkd2FyZV9zY2IgKnBlbmRpbmdfaHNjYjsKKwkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCWFoY19zY2JfZGV2aW5mbyhhaGMsICZkZXZpbmZvLCBwZW5kaW5nX3NjYik7CisJCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8uY2hhbm5lbCwKKwkJCQkJICAgIGRldmluZm8ub3VyX3Njc2lpZCwKKwkJCQkJICAgIGRldmluZm8udGFyZ2V0LCAmdHN0YXRlKTsKKwkJcGVuZGluZ19oc2NiID0gcGVuZGluZ19zY2ItPmhzY2I7CisJCXBlbmRpbmdfaHNjYi0+Y29udHJvbCAmPSB+VUxUUkFFTkI7CisJCWlmICgodHN0YXRlLT51bHRyYWVuYiAmIGRldmluZm8udGFyZ2V0X21hc2spICE9IDApCisJCQlwZW5kaW5nX2hzY2ItPmNvbnRyb2wgfD0gVUxUUkFFTkI7CisJCXBlbmRpbmdfaHNjYi0+c2NzaXJhdGUgPSB0aW5mby0+c2NzaXJhdGU7CisJCXBlbmRpbmdfaHNjYi0+c2NzaW9mZnNldCA9IHRpbmZvLT5jdXJyLm9mZnNldDsKKwkJaWYgKCh0c3RhdGUtPmF1dG9fbmVnb3RpYXRlICYgZGV2aW5mby50YXJnZXRfbWFzaykgPT0gMAorCQkgJiYgKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9BVVRPX05FR09USUFURSkgIT0gMCkgeworCQkJcGVuZGluZ19zY2ItPmZsYWdzICY9IH5TQ0JfQVVUT19ORUdPVElBVEU7CisJCQlwZW5kaW5nX2hzY2ItPmNvbnRyb2wgJj0gfk1LX01FU1NBR0U7CisJCX0KKwkJYWhjX3N5bmNfc2NiKGFoYywgcGVuZGluZ19zY2IsCisJCQkgICAgIEJVU19ETUFTWU5DX1BSRVJFQUR8QlVTX0RNQVNZTkNfUFJFV1JJVEUpOworCQlwZW5kaW5nX3NjYl9jb3VudCsrOworCX0KKworCWlmIChwZW5kaW5nX3NjYl9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoYWhjX2lzX3BhdXNlZChhaGMpKSB7CisJCXBhdXNlZCA9IDE7CisJfSBlbHNlIHsKKwkJcGF1c2VkID0gMDsKKwkJYWhjX3BhdXNlKGFoYyk7CisJfQorCisJc2F2ZWRfc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJLyogRW5zdXJlIHRoYXQgdGhlIGhzY2JzIGRvd24gb24gdGhlIGNhcmQgbWF0Y2ggdGhlIG5ldyBpbmZvcm1hdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBhaGMtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKSB7CisJCXN0cnVjdAloYXJkd2FyZV9zY2IgKnBlbmRpbmdfaHNjYjsKKwkJdV9pbnQJY29udHJvbDsKKwkJdV9pbnQJc2NiX3RhZzsKKworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgaSk7CisJCXNjYl90YWcgPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCXBlbmRpbmdfc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfdGFnKTsKKwkJaWYgKHBlbmRpbmdfc2NiID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlwZW5kaW5nX2hzY2IgPSBwZW5kaW5nX3NjYi0+aHNjYjsKKwkJY29udHJvbCA9IGFoY19pbmIoYWhjLCBTQ0JfQ09OVFJPTCk7CisJCWNvbnRyb2wgJj0gfihVTFRSQUVOQnxNS19NRVNTQUdFKTsKKwkJY29udHJvbCB8PSBwZW5kaW5nX2hzY2ItPmNvbnRyb2wgJiAoVUxUUkFFTkJ8TUtfTUVTU0FHRSk7CisJCWFoY19vdXRiKGFoYywgU0NCX0NPTlRST0wsIGNvbnRyb2wpOworCQlhaGNfb3V0YihhaGMsIFNDQl9TQ1NJUkFURSwgcGVuZGluZ19oc2NiLT5zY3NpcmF0ZSk7CisJCWFoY19vdXRiKGFoYywgU0NCX1NDU0lPRkZTRVQsIHBlbmRpbmdfaHNjYi0+c2NzaW9mZnNldCk7CisJfQorCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOworCisJaWYgKHBhdXNlZCA9PSAwKQorCQlhaGNfdW5wYXVzZShhaGMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXRoaW5nIEluZm9ybWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FoY19mZXRjaF9kZXZpbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCXVfaW50CXNhdmVkX3Njc2lpZDsKKwlyb2xlX3QJcm9sZTsKKwlpbnQJb3VyX2lkOworCisJaWYgKGFoY19pbmIoYWhjLCBTU1RBVDApICYgVEFSR0VUKQorCQlyb2xlID0gUk9MRV9UQVJHRVQ7CisJZWxzZQorCQlyb2xlID0gUk9MRV9JTklUSUFUT1I7CisKKwlpZiAocm9sZSA9PSBST0xFX1RBUkdFVAorCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9USUQpICE9IDAKKwkgJiYgKGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpCisgCSAgICYgKENNRFBIQVNFX1BFTkRJTkd8VEFSR19DTURfUEVORElOR3xOT19ESVNDT05ORUNUKSkgIT0gMCkgeworCQkvKiBXZSB3ZXJlIHNlbGVjdGVkLCBzbyBwdWxsIG91ciBpZCBmcm9tIFRBUkdJRElOICovCisJCW91cl9pZCA9IGFoY19pbmIoYWhjLCBUQVJHSURJTikgJiBPSUQ7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCW91cl9pZCA9IGFoY19pbmIoYWhjLCBTQ1NJSURfVUxUUkEyKSAmIE9JRDsKKwllbHNlCisJCW91cl9pZCA9IGFoY19pbmIoYWhjLCBTQ1NJSUQpICYgT0lEOworCisJc2F2ZWRfc2NzaWlkID0gYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCk7CisJYWhjX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLAorCQkJICAgIG91cl9pZCwKKwkJCSAgICBTQ1NJSURfVEFSR0VUKGFoYywgc2F2ZWRfc2NzaWlkKSwKKwkJCSAgICBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSwKKwkJCSAgICBTQ1NJSURfQ0hBTk5FTChhaGMsIHNhdmVkX3Njc2lpZCksCisJCQkgICAgcm9sZSk7Cit9CisKK3N0cnVjdCBhaGNfcGhhc2VfdGFibGVfZW50cnkqCithaGNfbG9va3VwX3BoYXNlX2VudHJ5KGludCBwaGFzZSkKK3sKKwlzdHJ1Y3QgYWhjX3BoYXNlX3RhYmxlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgYWhjX3BoYXNlX3RhYmxlX2VudHJ5ICpsYXN0X2VudHJ5OworCisJLyoKKwkgKiBudW1fcGhhc2VzIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBlbnRyeSB3aGljaAorCSAqIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHBoYXNlIGRvZXNuJ3QgbWF0Y2guCisJICovCisJbGFzdF9lbnRyeSA9ICZhaGNfcGhhc2VfdGFibGVbbnVtX3BoYXNlc107CisJZm9yIChlbnRyeSA9IGFoY19waGFzZV90YWJsZTsgZW50cnkgPCBsYXN0X2VudHJ5OyBlbnRyeSsrKSB7CisJCWlmIChwaGFzZSA9PSBlbnRyeS0+cGhhc2UpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIChlbnRyeSk7Cit9CisKK3ZvaWQKK2FoY19jb21waWxlX2RldmluZm8oc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCB1X2ludCBvdXJfaWQsIHVfaW50IHRhcmdldCwKKwkJICAgIHVfaW50IGx1biwgY2hhciBjaGFubmVsLCByb2xlX3Qgcm9sZSkKK3sKKwlkZXZpbmZvLT5vdXJfc2NzaWlkID0gb3VyX2lkOworCWRldmluZm8tPnRhcmdldCA9IHRhcmdldDsKKwlkZXZpbmZvLT5sdW4gPSBsdW47CisJZGV2aW5mby0+dGFyZ2V0X29mZnNldCA9IHRhcmdldDsKKwlkZXZpbmZvLT5jaGFubmVsID0gY2hhbm5lbDsKKwlkZXZpbmZvLT5yb2xlID0gcm9sZTsKKwlpZiAoY2hhbm5lbCA9PSAnQicpCisJCWRldmluZm8tPnRhcmdldF9vZmZzZXQgKz0gODsKKwlkZXZpbmZvLT50YXJnZXRfbWFzayA9ICgweDAxIDw8IGRldmluZm8tPnRhcmdldF9vZmZzZXQpOworfQorCit2b2lkCithaGNfcHJpbnRfZGV2aW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlwcmludGYoIiVzOiVjOiVkOiVkOiAiLCBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfc2NiX2RldmluZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCXN0cnVjdCBzY2IgKnNjYikKK3sKKwlyb2xlX3QJcm9sZTsKKwlpbnQJb3VyX2lkOworCisJb3VyX2lkID0gU0NTSUlEX09VUl9JRChzY2ItPmhzY2ItPnNjc2lpZCk7CisJcm9sZSA9IFJPTEVfSU5JVElBVE9SOworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9UQVJHRVRfU0NCKSAhPSAwKQorCQlyb2xlID0gUk9MRV9UQVJHRVQ7CisJYWhjX2NvbXBpbGVfZGV2aW5mbyhkZXZpbmZvLCBvdXJfaWQsIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwKKwkJCSAgICBTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpLCByb2xlKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIE1lc3NhZ2UgUGhhc2UgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FoY19hc3NlcnRfYXRuKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1X2ludCBzY3Npc2lnbzsKKworCXNjc2lzaWdvID0gQVROTzsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpID09IDApCisJCXNjc2lzaWdvIHw9IGFoY19pbmIoYWhjLCBTQ1NJU0lHSSk7CisJYWhjX291dGIoYWhjLCBTQ1NJU0lHTywgc2NzaXNpZ28pOworfQorCisvKgorICogV2hlbiBhbiBpbml0aWF0b3IgdHJhbnNhY3Rpb24gd2l0aCB0aGUgTUtfTUVTU0FHRSBmbGFnIGVpdGhlciByZWNvbm5lY3RzCisgKiBvciBlbnRlcnMgdGhlIGluaXRpYWwgbWVzc2FnZSBvdXQgcGhhc2UsIHdlIGFyZSBpbnRlcnJ1cHRlZC4gIEZpbGwgb3VyCisgKiBvdXRnb2luZyBtZXNzYWdlIGJ1ZmZlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGFuZCBiZWdpbmcgaGFuZGluZworICogdGhlIG1lc3NhZ2UgcGhhc2UocykgbWFudWFsbHkuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfc2V0dXBfaW5pdGlhdG9yX21zZ291dChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCSAgIHN0cnVjdCBzY2IgKnNjYikKK3sKKwkvKgorCSAqIFRvIGZhY2lsaXRhdGUgYWRkaW5nIG11bHRpcGxlIG1lc3NhZ2VzIHRvZ2V0aGVyLAorCSAqIGVhY2ggcm91dGluZSBzaG91bGQgaW5jcmVtZW50IHRoZSBpbmRleCBhbmQgbGVuCisJICogdmFyaWFibGVzIGluc3RlYWQgb2Ygc2V0dGluZyB0aGVtIGV4cGxpY2l0bHkuCisJICovCisJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisKKwlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfREVWSUNFX1JFU0VUKSA9PSAwCisJICYmIGFoY19pbmIoYWhjLCBNU0dfT1VUKSA9PSBNU0dfSURFTlRJRllGTEFHKSB7CisJCXVfaW50IGlkZW50aWZ5X21zZzsKKworCQlpZGVudGlmeV9tc2cgPSBNU0dfSURFTlRJRllGTEFHIHwgU0NCX0dFVF9MVU4oc2NiKTsKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBESVNDRU5CKSAhPSAwKQorCQkJaWRlbnRpZnlfbXNnIHw9IE1TR19JREVOVElGWV9ESVNDRkxBRzsKKwkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gaWRlbnRpZnlfbXNnOworCQlhaGMtPm1zZ291dF9sZW4rKzsKKworCQlpZiAoKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDApIHsKKwkJCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9CisJCQkgICAgc2NiLT5oc2NiLT5jb250cm9sICYgKFRBR19FTkJ8U0NCX1RBR19UWVBFKTsKKwkJCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IHNjYi0+aHNjYi0+dGFnOworCQkJYWhjLT5tc2dvdXRfbGVuICs9IDI7CisJCX0KKwl9CisKKwlpZiAoc2NiLT5mbGFncyAmIFNDQl9ERVZJQ0VfUkVTRVQpIHsKKwkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0JVU19ERVZfUkVTRVQ7CisJCWFoYy0+bXNnb3V0X2xlbisrOworCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiQnVzIERldmljZSBSZXNldCBNZXNzYWdlIFNlbnRcbiIpOworCQkvKgorCQkgKiBDbGVhciBvdXIgc2VsZWN0aW9uIGhhcmR3YXJlIGluIGFkdmFuY2Ugb2YKKwkJICogdGhlIGJ1c2ZyZWUuICBXZSBtYXkgaGF2ZSBhbiBlbnRyeSBpbiB0aGUgd2FpdGluZworCQkgKiBRIGZvciB0aGlzIHRhcmdldCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gZ28gYWJvdXQKKwkJICogc2VsZWN0aW5nIHdoaWxlIHdlIGhhbmRsZSB0aGUgYnVzZnJlZSBhbmQgYmxvdyBpdAorCQkgKiBhd2F5LgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCAoYWhjX2luYihhaGMsIFNDU0lTRVEpICYgfkVOU0VMTykpOworCX0gZWxzZSBpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQUJPUlQpICE9IDApIHsKKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBUQUdfRU5CKSAhPSAwKQorCQkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUX1RBRzsKKwkJZWxzZQorCQkJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0FCT1JUOworCQlhaGMtPm1zZ291dF9sZW4rKzsKKwkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQlwcmludGYoIkFib3J0JXMgTWVzc2FnZSBTZW50XG4iLAorCQkgICAgICAgKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICE9IDAgPyAiIFRhZyIgOiAiIik7CisJCS8qCisJCSAqIENsZWFyIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgaW4gYWR2YW5jZSBvZgorCQkgKiB0aGUgYnVzZnJlZS4gIFdlIG1heSBoYXZlIGFuIGVudHJ5IGluIHRoZSB3YWl0aW5nCisJCSAqIFEgZm9yIHRoaXMgdGFyZ2V0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnbyBhYm91dAorCQkgKiBzZWxlY3Rpbmcgd2hpbGUgd2UgaGFuZGxlIHRoZSBidXNmcmVlIGFuZCBibG93IGl0CisJCSAqIGF3YXkuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNDU0lTRVEsIChhaGNfaW5iKGFoYywgU0NTSVNFUSkgJiB+RU5TRUxPKSk7CisJfSBlbHNlIGlmICgoc2NiLT5mbGFncyAmIChTQ0JfQVVUT19ORUdPVElBVEV8U0NCX05FR09USUFURSkpICE9IDApIHsKKwkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhhaGMsIGRldmluZm8pOworCX0gZWxzZSB7CisJCXByaW50ZigiYWhjX2ludHI6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgIgorCQkgICAgICAgImRvZXMgbm90IGhhdmUgYSB3YWl0aW5nIG1lc3NhZ2VcbiIpOworCQlwcmludGYoIlNDU0lJRCA9ICV4LCB0YXJnZXRfbWFzayA9ICV4XG4iLCBzY2ItPmhzY2ItPnNjc2lpZCwKKwkJICAgICAgIGRldmluZm8tPnRhcmdldF9tYXNrKTsKKwkJcGFuaWMoIlNDQiA9ICVkLCBTQ0IgQ29udHJvbCA9ICV4LCBNU0dfT1VUID0gJXggIgorCQkgICAgICAiU0NCIGZsYWdzID0gJXgiLCBzY2ItPmhzY2ItPnRhZywgc2NiLT5oc2NiLT5jb250cm9sLAorCQkgICAgICBhaGNfaW5iKGFoYywgTVNHX09VVCksIHNjYi0+ZmxhZ3MpOworCX0KKworCS8qCisJICogQ2xlYXIgdGhlIE1LX01FU1NBR0UgZmxhZyBmcm9tIHRoZSBTQ0Igc28gd2UgYXJlbid0CisJICogYXNrZWQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UgYWdhaW4uCisJICovCisJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSAmIH5NS19NRVNTQUdFKTsKKwlzY2ItPmhzY2ItPmNvbnRyb2wgJj0gfk1LX01FU1NBR0U7CisJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworfQorCisvKgorICogQnVpbGQgYW4gYXBwcm9wcmlhdGUgdHJhbnNmZXIgbmVnb3RpYXRpb24gbWVzc2FnZSBmb3IgdGhlCisgKiBjdXJyZW50bHkgYWN0aXZlIHRhcmdldC4KKyAqLworc3RhdGljIHZvaWQKK2FoY19idWlsZF90cmFuc2Zlcl9tc2coc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJLyoKKwkgKiBXZSBuZWVkIHRvIGluaXRpYXRlIHRyYW5zZmVyIG5lZ290aWF0aW9ucy4KKwkgKiBJZiBvdXIgY3VycmVudCBhbmQgZ29hbCBzZXR0aW5ncyBhcmUgaWRlbnRpY2FsLAorCSAqIHdlIHdhbnQgdG8gcmVuZWdvdGlhdGUgZHVlIHRvIGEgY2hlY2sgY29uZGl0aW9uLgorCSAqLworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlhaGNfc3luY3JhdGUgKnJhdGU7CisJaW50CWRvd2lkZTsKKwlpbnQJZG9zeW5jOworCWludAlkb3BwcjsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJcHByX29wdGlvbnM7CisJdV9pbnQJb2Zmc2V0OworCisJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+b3VyX3Njc2lpZCwKKwkJCQkgICAgZGV2aW5mby0+dGFyZ2V0LCAmdHN0YXRlKTsKKwkvKgorCSAqIEZpbHRlciBvdXIgcGVyaW9kIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uCisJICogSWYgd2UgY2FuJ3QgcGVyZm9ybSBEVCB0cmFuc2ZlcnMgb24gdGhpcyBzZWdtZW50IChub3QgaW4gTFZECisJICogbW9kZSBmb3IgaW5zdGFuY2UpLCB0aGVuIG91ciBkZWNpc2lvbiB0byBpc3N1ZSBhIFBQUiBtZXNzYWdlCisJICogbWF5IGNoYW5nZS4KKwkgKi8KKwlwZXJpb2QgPSB0aW5mby0+Z29hbC5wZXJpb2Q7CisJb2Zmc2V0ID0gdGluZm8tPmdvYWwub2Zmc2V0OworCXBwcl9vcHRpb25zID0gdGluZm8tPmdvYWwucHByX29wdGlvbnM7CisJLyogVGFyZ2V0IGluaXRpYXRlZCBQUFIgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFNDU0kgc3BlYyAqLworCWlmIChkZXZpbmZvLT5yb2xlID09IFJPTEVfVEFSR0VUKQorCQlwcHJfb3B0aW9ucyA9IDA7CisJcmF0ZSA9IGFoY19kZXZsaW1pdGVkX3N5bmNyYXRlKGFoYywgdGluZm8sICZwZXJpb2QsCisJCQkJICAgICAgICZwcHJfb3B0aW9ucywgZGV2aW5mby0+cm9sZSk7CisJZG93aWRlID0gdGluZm8tPmN1cnIud2lkdGggIT0gdGluZm8tPmdvYWwud2lkdGg7CisJZG9zeW5jID0gdGluZm8tPmN1cnIub2Zmc2V0ICE9IG9mZnNldCB8fCB0aW5mby0+Y3Vyci5wZXJpb2QgIT0gcGVyaW9kOworCS8qCisJICogT25seSB1c2UgUFBSIGlmIHdlIGhhdmUgb3B0aW9ucyB0aGF0IG5lZWQgaXQsIGV2ZW4gaWYgdGhlIGRldmljZQorCSAqIGNsYWltcyB0byBzdXBwb3J0IGl0LiAgVGhlcmUgbWlnaHQgYmUgYW4gZXhwYW5kZXIgaW4gdGhlIHdheQorCSAqIHRoYXQgZG9lc24ndC4KKwkgKi8KKwlkb3BwciA9IHBwcl9vcHRpb25zICE9IDA7CisKKwlpZiAoIWRvd2lkZSAmJiAhZG9zeW5jICYmICFkb3BwcikgeworCQlkb3dpZGUgPSB0aW5mby0+Z29hbC53aWR0aCAhPSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOworCQlkb3N5bmMgPSB0aW5mby0+Z29hbC5vZmZzZXQgIT0gMDsKKwl9CisKKwlpZiAoIWRvd2lkZSAmJiAhZG9zeW5jICYmICFkb3BwcikgeworCQkvKgorCQkgKiBGb3JjZSBhc3luYyB3aXRoIGEgV0RUUiBtZXNzYWdlIGlmIHdlIGhhdmUgYSB3aWRlIGJ1cywKKwkJICogb3IganVzdCBpc3N1ZSBhbiBTRFRSIHdpdGggYSAwIG9mZnNldC4KKwkJICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKQorCQkJZG93aWRlID0gMTsKKwkJZWxzZQorCQkJZG9zeW5jID0gMTsKKworCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCQlwcmludGYoIkVuc3VyaW5nIGFzeW5jXG4iKTsKKwkJfQorCX0KKworCS8qIFRhcmdldCBpbml0aWF0ZWQgUFBSIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBTQ1NJIHNwZWMgKi8KKwlpZiAoZGV2aW5mby0+cm9sZSA9PSBST0xFX1RBUkdFVCkKKwkJZG9wcHIgPSAwOworCisJLyoKKwkgKiBCb3RoIHRoZSBQUFIgbWVzc2FnZSBhbmQgU0RUUiBtZXNzYWdlIHJlcXVpcmUgdGhlCisJICogZ29hbCBzeW5jcmF0ZSB0byBiZSBsaW1pdGVkIHRvIHdoYXQgdGhlIHRhcmdldCBkZXZpY2UKKwkgKiBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIChiYXNlZCBvbiB3aGV0aGVyIGFuIExWRC0+U0UKKwkgKiBleHBhbmRlciBpcyBvbiB0aGUgYnVzKSwgc28gY29tYmluZSB0aGVzZSB0d28gY2FzZXMuCisJICogUmVnYXJkbGVzcywgZ3VhcmFudGVlIHRoYXQgaWYgd2UgYXJlIHVzaW5nIFdEVFIgYW5kIFNEVFIKKwkgKiBtZXNzYWdlcyB0aGF0IFdEVFIgY29tZXMgZmlyc3QuCisJICovCisJaWYgKGRvcHByIHx8IChkb3N5bmMgJiYgIWRvd2lkZSkpIHsKKworCQlvZmZzZXQgPSB0aW5mby0+Z29hbC5vZmZzZXQ7CisJCWFoY192YWxpZGF0ZV9vZmZzZXQoYWhjLCB0aW5mbywgcmF0ZSwgJm9mZnNldCwKKwkJCQkgICAgZG9wcHIgPyB0aW5mby0+Z29hbC53aWR0aAorCQkJCQkgIDogdGluZm8tPmN1cnIud2lkdGgsCisJCQkJICAgIGRldmluZm8tPnJvbGUpOworCQlpZiAoZG9wcHIpIHsKKwkJCWFoY19jb25zdHJ1Y3RfcHByKGFoYywgZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsCisJCQkJCSAgdGluZm8tPmdvYWwud2lkdGgsIHBwcl9vcHRpb25zKTsKKwkJfSBlbHNlIHsKKwkJCWFoY19jb25zdHJ1Y3Rfc2R0cihhaGMsIGRldmluZm8sIHBlcmlvZCwgb2Zmc2V0KTsKKwkJfQorCX0gZWxzZSB7CisJCWFoY19jb25zdHJ1Y3Rfd2R0cihhaGMsIGRldmluZm8sIHRpbmZvLT5nb2FsLndpZHRoKTsKKwl9Cit9CisKKy8qCisgKiBCdWlsZCBhIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIG1lc3NhZ2UgaW4gb3VyIG1lc3NhZ2UKKyAqIGJ1ZmZlciBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19jb25zdHJ1Y3Rfc2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQpCit7CisJaWYgKG9mZnNldCA9PSAwKQorCQlwZXJpb2QgPSBBSENfQVNZTkNfWEZFUl9QRVJJT0Q7CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVEVOREVEOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfU0RUUl9MRU47CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9TRFRSOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IHBlcmlvZDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBvZmZzZXQ7CisJYWhjLT5tc2dvdXRfbGVuICs9IDU7CisJaWYgKGJvb3R2ZXJib3NlKSB7CisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBTRFRSIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby0+bHVuLCBwZXJpb2QsIG9mZnNldCk7CisJfQorfQorCisvKgorICogQnVpbGQgYSB3aWRlIG5lZ290aWF0aW9uIG1lc3NhZ2UgaW4gb3VyIG1lc3NhZ2UKKyAqIGJ1ZmZlciBiYXNlZCBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19jb25zdHJ1Y3Rfd2R0cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgdV9pbnQgYnVzX3dpZHRoKQoreworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1dEVFJfTEVOOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRfV0RUUjsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBidXNfd2lkdGg7CisJYWhjLT5tc2dvdXRfbGVuICs9IDQ7CisJaWYgKGJvb3R2ZXJib3NlKSB7CisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogU2VuZGluZyBXRFRSICV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkgICAgICAgZGV2aW5mby0+bHVuLCBidXNfd2lkdGgpOworCX0KK30KKworLyoKKyAqIEJ1aWxkIGEgcGFyYWxsZWwgcHJvdG9jb2wgcmVxdWVzdCBtZXNzYWdlIGluIG91ciBtZXNzYWdlCisgKiBidWZmZXIgYmFzZWQgb24gdGhlIGlucHV0IHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfY29uc3RydWN0X3BwcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICB1X2ludCBwZXJpb2QsIHVfaW50IG9mZnNldCwgdV9pbnQgYnVzX3dpZHRoLAorCQkgIHVfaW50IHBwcl9vcHRpb25zKQoreworCWlmIChvZmZzZXQgPT0gMCkKKwkJcGVyaW9kID0gQUhDX0FTWU5DX1hGRVJfUEVSSU9EOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IE1TR19FWFRFTkRFRDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBNU0dfRVhUX1BQUl9MRU47CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gTVNHX0VYVF9QUFI7CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gcGVyaW9kOworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IDA7CisJYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdID0gb2Zmc2V0OworCWFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSA9IGJ1c193aWR0aDsKKwlhaGMtPm1zZ291dF9idWZbYWhjLT5tc2dvdXRfaW5kZXgrK10gPSBwcHJfb3B0aW9uczsKKwlhaGMtPm1zZ291dF9sZW4gKz0gODsKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBTZW5kaW5nIFBQUiBidXNfd2lkdGggJXgsIHBlcmlvZCAleCwgIgorCQkgICAgICAgIm9mZnNldCAleCwgcHByX29wdGlvbnMgJXhcbiIsIGFoY19uYW1lKGFoYyksCisJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJICAgICAgIGJ1c193aWR0aCwgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhciBhbnkgYWN0aXZlIG1lc3NhZ2Ugc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfY2xlYXJfbXNnX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGMtPm1zZ291dF9sZW4gPSAwOworCWFoYy0+bXNnaW5faW5kZXggPSAwOworCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9OT05FOworCWlmICgoYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIEFUTkkpICE9IDApIHsKKwkJLyoKKwkJICogVGhlIHRhcmdldCBkaWRuJ3QgY2FyZSB0byByZXNwb25kIHRvIG91cgorCQkgKiBtZXNzYWdlIHJlcXVlc3QsIHNvIGNsZWFyIEFUTi4KKwkJICovCisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUkFUTk8pOworCX0KKwlhaGNfb3V0YihhaGMsIE1TR19PVVQsIE1TR19OT09QKTsKKwlhaGNfb3V0YihhaGMsIFNFUV9GTEFHUzIsCisJCSBhaGNfaW5iKGFoYywgU0VRX0ZMQUdTMikgJiB+VEFSR0VUX01TR19QRU5ESU5HKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19oYW5kbGVfcHJvdG9fdmlvbGF0aW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QJYWhjX2RldmluZm8gZGV2aW5mbzsKKwlzdHJ1Y3QJc2NiICpzY2I7CisJdV9pbnQJc2NiaWQ7CisJdV9pbnQJc2VxX2ZsYWdzOworCXVfaW50CWN1cnBoYXNlOworCXVfaW50CWxhc3RwaGFzZTsKKwlpbnQJZm91bmQ7CisKKwlhaGNfZmV0Y2hfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwlzY2JpZCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYmlkKTsKKwlzZXFfZmxhZ3MgPSBhaGNfaW5iKGFoYywgU0VRX0ZMQUdTKTsKKwljdXJwaGFzZSA9IGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLOworCWxhc3RwaGFzZSA9IGFoY19pbmIoYWhjLCBMQVNUUEhBU0UpOworCWlmICgoc2VxX2ZsYWdzICYgTk9UX0lERU5USUZJRUQpICE9IDApIHsKKworCQkvKgorCQkgKiBUaGUgcmVjb25uZWN0aW5nIHRhcmdldCBlaXRoZXIgZGlkIG5vdCBzZW5kIGFuCisJCSAqIGlkZW50aWZ5IG1lc3NhZ2UsIG9yIGRpZCwgYnV0IHdlIGRpZG4ndCBmaW5kIGFuIFNDQgorCQkgKiB0byBtYXRjaC4KKwkJICovCisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQlwcmludGYoIlRhcmdldCBkaWQgbm90IHNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZS4gIgorCQkgICAgICAgIkxBU1RQSEFTRSA9IDB4JXguXG4iLCBsYXN0cGhhc2UpOworCQlzY2IgPSBOVUxMOworCX0gZWxzZSBpZiAoc2NiID09IE5VTEwpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFuIFNDQiBhY3RpdmUgZm9yIHRoaXMKKwkJICogdHJhbnNhY3Rpb24uICBQcmludCBhbiBlcnJvciBhbmQgcmVzZXQgdGhlIGJ1cy4KKwkJICovCisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQlwcmludGYoIk5vIFNDQiBmb3VuZCBkdXJpbmcgcHJvdG9jb2wgdmlvbGF0aW9uXG4iKTsKKwkJZ290byBwcm90b192aW9sYXRpb25fcmVzZXQ7CisJfSBlbHNlIHsKKwkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fU0VRVUVOQ0VfRkFJTCk7CisJCWlmICgoc2VxX2ZsYWdzICYgTk9fQ0RCX1NFTlQpICE9IDApIHsKKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiTm8gb3IgaW5jb21wbGV0ZSBDREIgc2VudCB0byBkZXZpY2UuXG4iKTsKKwkJfSBlbHNlIGlmICgoYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSAmIFNUQVRVU19SQ1ZEKSA9PSAwKSB7CisJCQkvKgorCQkJICogVGhlIHRhcmdldCBuZXZlciBib3RoZXJlZCB0byBwcm92aWRlIHN0YXR1cyB0bworCQkJICogdXMgcHJpb3IgdG8gY29tcGxldGluZyB0aGUgY29tbWFuZC4gIFNpbmNlIHdlIGRvbid0CisJCQkgKiBrbm93IHRoZSBkaXNwb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQsIHdlIG11c3QgYXR0ZW1wdAorCQkJICogdG8gYWJvcnQgaXQuICBBc3NlcnQgQVROIGFuZCBwcmVwYXJlIHRvIHNlbmQgYW4gYWJvcnQKKwkJCSAqIG1lc3NhZ2UuCisJCQkgKi8KKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiQ29tcGxldGVkIGNvbW1hbmQgd2l0aG91dCBzdGF0dXMuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiVW5rbm93biBwcm90b2NvbCB2aW9sYXRpb24uXG4iKTsKKwkJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJfQorCX0KKwlpZiAoKGxhc3RwaGFzZSAmIH5QX0RBVEFJTl9EVCkgPT0gMAorCSB8fCBsYXN0cGhhc2UgPT0gUF9DT01NQU5EKSB7Citwcm90b192aW9sYXRpb25fcmVzZXQ6CisJCS8qCisJCSAqIFRhcmdldCBlaXRoZXIgd2VudCBkaXJlY3RseSB0byBkYXRhL2NvbW1hbmQKKwkJICogcGhhc2Ugb3IgZGlkbid0IHJlc3BvbmQgdG8gb3VyIEFUTi4KKwkJICogVGhlIG9ubHkgc2FmZSB0aGluZyB0byBkbyBpcyB0byBibG93CisJCSAqIGl0IGF3YXkgd2l0aCBhIGJ1cyByZXNldC4KKwkJICovCisJCWZvdW5kID0gYWhjX3Jlc2V0X2NoYW5uZWwoYWhjLCAnQScsIFRSVUUpOworCQlwcmludGYoIiVzOiBJc3N1ZWQgQ2hhbm5lbCAlYyBCdXMgUmVzZXQuICIKKwkJICAgICAgICIlZCBTQ0JzIGFib3J0ZWRcbiIsIGFoY19uYW1lKGFoYyksICdBJywgZm91bmQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIExlYXZlIHRoZSBzZWxlY3Rpb24gaGFyZHdhcmUgb2ZmIGluIGNhc2UKKwkJICogdGhpcyBhYm9ydCBhdHRlbXB0IHdpbGwgYWZmZWN0IHlldCB0bworCQkgKiBiZSBzZW50IGNvbW1hbmRzLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLAorCQkJIGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIH5FTlNFTE8pOworCQlhaGNfYXNzZXJ0X2F0bihhaGMpOworCQlhaGNfb3V0YihhaGMsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJCWFoYy0+bXNnb3V0X2J1ZlswXSA9IE1TR19BQk9SVF9UQVNLOworCQkJYWhjLT5tc2dvdXRfbGVuID0gMTsKKwkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUOworCQl9IGVsc2UgeworCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQUJPUlQ7CisJCX0KKwkJcHJpbnRmKCJQcm90b2NvbCB2aW9sYXRpb24gJXMuICBBdHRlbXB0aW5nIHRvIGFib3J0LlxuIiwKKwkJICAgICAgIGFoY19sb29rdXBfcGhhc2VfZW50cnkoY3VycGhhc2UpLT5waGFzZW1zZyk7CisJfQorfQorCisvKgorICogTWFudWFsIG1lc3NhZ2UgbG9vcCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZAorYWhjX2hhbmRsZV9tZXNzYWdlX3BoYXNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sgCisJc3RydWN0CWFoY19kZXZpbmZvIGRldmluZm87CisJdV9pbnQJYnVzX3BoYXNlOworCWludAllbmRfc2Vzc2lvbjsKKworCWFoY19mZXRjaF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCWVuZF9zZXNzaW9uID0gRkFMU0U7CisJYnVzX3BoYXNlID0gYWhjX2luYihhaGMsIFNDU0lTSUdJKSAmIFBIQVNFX01BU0s7CisKK3Jlc3dpdGNoOgorCXN3aXRjaCAoYWhjLT5tc2dfdHlwZSkgeworCWNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDoKKwl7CisJCWludCBsYXN0Ynl0ZTsKKwkJaW50IHBoYXNlbWlzOworCQlpbnQgbXNnZG9uZTsKKworCQlpZiAoYWhjLT5tc2dvdXRfbGVuID09IDApCisJCQlwYW5pYygiSE9TVF9NU0dfTE9PUCBpbnRlcnJ1cHQgd2l0aCBubyBhY3RpdmUgbWVzc2FnZSIpOworCisjaWZkZWYgQUhDX0RFQlVHCisJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQkJcHJpbnRmKCJJTklUSUFUT1JfTVNHX09VVCIpOworCQl9CisjZW5kaWYKKwkJcGhhc2VtaXMgPSBidXNfcGhhc2UgIT0gUF9NRVNHT1VUOworCQlpZiAocGhhc2VtaXMpIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUVTU0FHRVMpICE9IDApIHsKKwkJCQlwcmludGYoIiBQSEFTRU1JUyAlc1xuIiwKKwkJCQkgICAgICAgYWhjX2xvb2t1cF9waGFzZV9lbnRyeShidXNfcGhhc2UpCisJCQkJCQkJICAgICAtPnBoYXNlbXNnKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGJ1c19waGFzZSA9PSBQX01FU0dJTikgeworCQkJCS8qCisJCQkJICogQ2hhbmdlIGdlYXJzIGFuZCBzZWUgaWYKKwkJCQkgKiB0aGlzIG1lc3NhZ2VzIGlzIG9mIGludGVyZXN0IHRvCisJCQkJICogdXMgb3Igc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvCisJCQkJICogdGhlIHNlcXVlbmNlci4KKwkJCQkgKi8KKwkJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJCQlhaGMtPnNlbmRfbXNnX3BlcnJvciA9IEZBTFNFOworCQkJCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU47CisJCQkJYWhjLT5tc2dpbl9pbmRleCA9IDA7CisJCQkJZ290byByZXN3aXRjaDsKKwkJCX0KKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFoYy0+c2VuZF9tc2dfcGVycm9yKSB7CisJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCQlwcmludGYoIiBieXRlIDB4JXhcbiIsIGFoYy0+c2VuZF9tc2dfcGVycm9yKTsKKyNlbmRpZgorCQkJYWhjX291dGIoYWhjLCBTQ1NJREFUTCwgTVNHX1BBUklUWV9FUlJPUik7CisJCQlicmVhazsKKwkJfQorCisJCW1zZ2RvbmUJPSBhaGMtPm1zZ291dF9pbmRleCA9PSBhaGMtPm1zZ291dF9sZW47CisJCWlmIChtc2dkb25lKSB7CisJCQkvKgorCQkJICogVGhlIHRhcmdldCBoYXMgcmVxdWVzdGVkIGEgcmV0cnkuCisJCQkgKiBSZS1hc3NlcnQgQVROLCByZXNldCBvdXIgbWVzc2FnZSBpbmRleCB0bworCQkJICogMCwgYW5kIHRyeSBhZ2Fpbi4KKwkJCSAqLworCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJYWhjX2Fzc2VydF9hdG4oYWhjKTsKKwkJfQorCisJCWxhc3RieXRlID0gYWhjLT5tc2dvdXRfaW5kZXggPT0gKGFoYy0+bXNnb3V0X2xlbiAtIDEpOworCQlpZiAobGFzdGJ5dGUpIHsKKwkJCS8qIExhc3QgYnl0ZSBpcyBzaWduaWZpZWQgYnkgZHJvcHBpbmcgQVROICovCisJCQlhaGNfb3V0YihhaGMsIENMUlNJTlQxLCBDTFJBVE5PKTsKKwkJfQorCisJCS8qCisJCSAqIENsZWFyIG91ciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBwcmVzZW50CisJCSAqIHRoZSBuZXh0IGJ5dGUgb24gdGhlIGJ1cy4KKwkJICovCisJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJcHJpbnRmKCIgYnl0ZSAweCV4XG4iLAorCQkJICAgICAgIGFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleF0pOworI2VuZGlmCisJCWFoY19vdXRiKGFoYywgU0NTSURBVEwsIGFoYy0+bXNnb3V0X2J1ZlthaGMtPm1zZ291dF9pbmRleCsrXSk7CisJCWJyZWFrOworCX0KKwljYXNlIE1TR19UWVBFX0lOSVRJQVRPUl9NU0dJTjoKKwl7CisJCWludCBwaGFzZW1pczsKKwkJaW50IG1lc3NhZ2VfZG9uZTsKKworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKSB7CisJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJCXByaW50ZigiSU5JVElBVE9SX01TR19JTiIpOworCQl9CisjZW5kaWYKKwkJcGhhc2VtaXMgPSBidXNfcGhhc2UgIT0gUF9NRVNHSU47CisJCWlmIChwaGFzZW1pcykgeworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkgeworCQkJCXByaW50ZigiIFBIQVNFTUlTICVzXG4iLAorCQkJCSAgICAgICBhaGNfbG9va3VwX3BoYXNlX2VudHJ5KGJ1c19waGFzZSkKKwkJCQkJCQkgICAgIC0+cGhhc2Vtc2cpOworCQkJfQorI2VuZGlmCisJCQlhaGMtPm1zZ2luX2luZGV4ID0gMDsKKwkJCWlmIChidXNfcGhhc2UgPT0gUF9NRVNHT1VUCisJCQkgJiYgKGFoYy0+c2VuZF9tc2dfcGVycm9yID09IFRSVUUKKwkJCSAgfHwgKGFoYy0+bXNnb3V0X2xlbiAhPSAwCisJCQkgICAmJiBhaGMtPm1zZ291dF9pbmRleCA9PSAwKSkpIHsKKwkJCQlhaGMtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKwkJCQlnb3RvIHJlc3dpdGNoOworCQkJfQorCQkJZW5kX3Nlc3Npb24gPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQdWxsIHRoZSBieXRlIGluIHdpdGhvdXQgYWNraW5nIGl0ICovCisJCWFoYy0+bXNnaW5fYnVmW2FoYy0+bXNnaW5faW5kZXhdID0gYWhjX2luYihhaGMsIFNDU0lCVVNMKTsKKyNpZmRlZiBBSENfREVCVUcKKwkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkKKwkJCXByaW50ZigiIGJ5dGUgMHgleFxuIiwKKwkJCSAgICAgICBhaGMtPm1zZ2luX2J1ZlthaGMtPm1zZ2luX2luZGV4XSk7CisjZW5kaWYKKworCQltZXNzYWdlX2RvbmUgPSBhaGNfcGFyc2VfbXNnKGFoYywgJmRldmluZm8pOworCisJCWlmIChtZXNzYWdlX2RvbmUpIHsKKwkJCS8qCisJCQkgKiBDbGVhciBvdXIgaW5jb21pbmcgbWVzc2FnZSBidWZmZXIgaW4gY2FzZSB0aGVyZQorCQkJICogaXMgYW5vdGhlciBtZXNzYWdlIGZvbGxvd2luZyB0aGlzIG9uZS4KKwkJCSAqLworCQkJYWhjLT5tc2dpbl9pbmRleCA9IDA7CisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIG1lc3NhZ2UgaWxsaWNpdGVkIGEgcmVzcG9uc2UsCisJCQkgKiBhc3NlcnQgQVROIHNvIHRoZSB0YXJnZXQgdGFrZXMgdXMgdG8gdGhlCisJCQkgKiBtZXNzYWdlIG91dCBwaGFzZS4KKwkJCSAqLworCQkJaWYgKGFoYy0+bXNnb3V0X2xlbiAhPSAwKSB7CisjaWZkZWYgQUhDX0RFQlVHCisJCQkJaWYgKChhaGNfZGVidWcgJiBBSENfU0hPV19NRVNTQUdFUykgIT0gMCkgeworCQkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJCQkJcHJpbnRmKCJBc3NlcnRpbmcgQVROIGZvciByZXNwb25zZVxuIik7CisJCQkJfQorI2VuZGlmCisJCQkJYWhjX2Fzc2VydF9hdG4oYWhjKTsKKwkJCX0KKwkJfSBlbHNlIAorCQkJYWhjLT5tc2dpbl9pbmRleCsrOworCisJCWlmIChtZXNzYWdlX2RvbmUgPT0gTVNHTE9PUF9URVJNSU5BVEVEKSB7CisJCQllbmRfc2Vzc2lvbiA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQkvKiBBY2sgdGhlIGJ5dGUgKi8KKwkJCWFoY19vdXRiKGFoYywgQ0xSU0lOVDEsIENMUlJFUUlOSVQpOworCQkJYWhjX2luYihhaGMsIFNDU0lEQVRMKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBNU0dfVFlQRV9UQVJHRVRfTVNHSU46CisJeworCQlpbnQgbXNnZG9uZTsKKwkJaW50IG1zZ291dF9yZXF1ZXN0OworCisJCWlmIChhaGMtPm1zZ291dF9sZW4gPT0gMCkKKwkJCXBhbmljKCJUYXJnZXQgTVNHSU4gd2l0aCBubyBhY3RpdmUgbWVzc2FnZSIpOworCisJCS8qCisJCSAqIElmIHdlIGludGVycnVwdGVkIGEgbWVzZ291dCBzZXNzaW9uLCB0aGUgaW5pdGlhdG9yCisJCSAqIHdpbGwgbm90IGtub3cgdGhpcyB1bnRpbCBvdXIgZmlyc3QgUkVRLiAgU28sIHdlCisJCSAqIG9ubHkgaG9ub3IgbWVzZ291dCByZXF1ZXN0cyBhZnRlciB3ZSd2ZSBzZW50IG91cgorCQkgKiBmaXJzdCBieXRlLgorCQkgKi8KKwkJaWYgKChhaGNfaW5iKGFoYywgU0NTSVNJR0kpICYgQVROSSkgIT0gMAorCQkgJiYgYWhjLT5tc2dvdXRfaW5kZXggPiAwKQorCQkJbXNnb3V0X3JlcXVlc3QgPSBUUlVFOworCQllbHNlCisJCQltc2dvdXRfcmVxdWVzdCA9IEZBTFNFOworCisJCWlmIChtc2dvdXRfcmVxdWVzdCkgeworCisJCQkvKgorCQkJICogQ2hhbmdlIGdlYXJzIGFuZCBzZWUgaWYKKwkJCSAqIHRoaXMgbWVzc2FnZXMgaXMgb2YgaW50ZXJlc3QgdG8KKwkJCSAqIHVzIG9yIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0bworCQkJICogdGhlIHNlcXVlbmNlci4KKwkJCSAqLworCQkJYWhjLT5tc2dfdHlwZSA9IE1TR19UWVBFX1RBUkdFVF9NU0dPVVQ7CisJCQlhaGNfb3V0YihhaGMsIFNDU0lTSUdPLCBQX01FU0dPVVQgfCBCU1lPKTsKKwkJCWFoYy0+bXNnaW5faW5kZXggPSAwOworCQkJLyogRHVtbXkgcmVhZCB0byBSRVEgZm9yIGZpcnN0IGJ5dGUgKi8KKwkJCWFoY19pbmIoYWhjLCBTQ1NJREFUTCk7CisJCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLAorCQkJCSBhaGNfaW5iKGFoYywgU1hGUkNUTDApIHwgU1BJT0VOKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNnZG9uZSA9IGFoYy0+bXNnb3V0X2luZGV4ID09IGFoYy0+bXNnb3V0X2xlbjsKKwkJaWYgKG1zZ2RvbmUpIHsKKwkJCWFoY19vdXRiKGFoYywgU1hGUkNUTDAsCisJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkgJiB+U1BJT0VOKTsKKwkJCWVuZF9zZXNzaW9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogUHJlc2VudCB0aGUgbmV4dCBieXRlIG9uIHRoZSBidXMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCBhaGNfaW5iKGFoYywgU1hGUkNUTDApIHwgU1BJT0VOKTsKKwkJYWhjX291dGIoYWhjLCBTQ1NJREFUTCwgYWhjLT5tc2dvdXRfYnVmW2FoYy0+bXNnb3V0X2luZGV4KytdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTVNHX1RZUEVfVEFSR0VUX01TR09VVDoKKwl7CisJCWludCBsYXN0Ynl0ZTsKKwkJaW50IG1zZ2RvbmU7CisKKwkJLyoKKwkJICogVGhlIGluaXRpYXRvciBzaWduYWxzIHRoYXQgdGhpcyBpcworCQkgKiB0aGUgbGFzdCBieXRlIGJ5IGRyb3BwaW5nIEFUTi4KKwkJICovCisJCWxhc3RieXRlID0gKGFoY19pbmIoYWhjLCBTQ1NJU0lHSSkgJiBBVE5JKSA9PSAwOworCisJCS8qCisJCSAqIFJlYWQgdGhlIGxhdGNoZWQgYnl0ZSwgYnV0IHR1cm4gb2ZmIFNQSU9FTiBmaXJzdAorCQkgKiBzbyB0aGF0IHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkgY2F1c2UgYSBSRVEgZm9yIHRoZQorCQkgKiBuZXh0IGJ5dGUuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCBhaGNfaW5iKGFoYywgU1hGUkNUTDApICYgflNQSU9FTik7CisJCWFoYy0+bXNnaW5fYnVmW2FoYy0+bXNnaW5faW5kZXhdID0gYWhjX2luYihhaGMsIFNDU0lEQVRMKTsKKwkJbXNnZG9uZSA9IGFoY19wYXJzZV9tc2coYWhjLCAmZGV2aW5mbyk7CisJCWlmIChtc2dkb25lID09IE1TR0xPT1BfVEVSTUlOQVRFRCkgeworCQkJLyoKKwkJCSAqIFRoZSBtZXNzYWdlIGlzICpyZWFsbHkqIGRvbmUgaW4gdGhhdCBpdCBjYXVzZWQKKwkJCSAqIHVzIHRvIGdvIHRvIGJ1cyBmcmVlLiAgVGhlIHNlcXVlbmNlciBoYXMgYWxyZWFkeQorCQkJICogYmVlbiByZXNldCBhdCB0aGlzIHBvaW50LCBzbyBwdWxsIHRoZSBlamVjdGlvbgorCQkJICogaGFuZGxlLgorCQkJICovCisJCQlyZXR1cm47CisJCX0KKwkJCisJCWFoYy0+bXNnaW5faW5kZXgrKzsKKworCQkvKgorCQkgKiBYWFggUmVhZCBzcGVjIGFib3V0IGluaXRpYXRvciBkcm9wcGluZyBBVE4gdG9vIHNvb24KKwkJICogICAgIGFuZCB1c2UgbXNnZG9uZSB0byBkZXRlY3QgaXQuCisJCSAqLworCQlpZiAobXNnZG9uZSA9PSBNU0dMT09QX01TR0NPTVBMRVRFKSB7CisJCQlhaGMtPm1zZ2luX2luZGV4ID0gMDsKKworCQkJLyoKKwkJCSAqIElmIHRoaXMgbWVzc2FnZSBpbGxpY2l0ZWQgYSByZXNwb25zZSwgdHJhbnNpdGlvbgorCQkJICogdG8gdGhlIE1lc3NhZ2UgaW4gcGhhc2UgYW5kIHNlbmQgaXQuCisJCQkgKi8KKwkJCWlmIChhaGMtPm1zZ291dF9sZW4gIT0gMCkgeworCQkJCWFoY19vdXRiKGFoYywgU0NTSVNJR08sIFBfTUVTR0lOIHwgQlNZTyk7CisJCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwKKwkJCQkJIGFoY19pbmIoYWhjLCBTWEZSQ1RMMCkgfCBTUElPRU4pOworCQkJCWFoYy0+bXNnX3R5cGUgPSBNU0dfVFlQRV9UQVJHRVRfTVNHSU47CisJCQkJYWhjLT5tc2dpbl9pbmRleCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAobGFzdGJ5dGUpCisJCQllbmRfc2Vzc2lvbiA9IFRSVUU7CisJCWVsc2UgeworCQkJLyogQXNrIGZvciB0aGUgbmV4dCBieXRlLiAqLworCQkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMCwKKwkJCQkgYWhjX2luYihhaGMsIFNYRlJDVEwwKSB8IFNQSU9FTik7CisJCX0KKworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcGFuaWMoIlVua25vd24gUkVRSU5JVCBtZXNzYWdlIHR5cGUiKTsKKwl9CisKKwlpZiAoZW5kX3Nlc3Npb24pIHsKKwkJYWhjX2NsZWFyX21zZ19zdGF0ZShhaGMpOworCQlhaGNfb3V0YihhaGMsIFJFVFVSTl8xLCBFWElUX01TR19MT09QKTsKKwl9IGVsc2UKKwkJYWhjX291dGIoYWhjLCBSRVRVUk5fMSwgQ09OVF9NU0dfTE9PUCk7Cit9CisKKy8qCisgKiBTZWUgaWYgd2Ugc2VudCBhIHBhcnRpY3VsYXIgZXh0ZW5kZWQgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LgorICogSWYgImZ1bGwiIGlzIHRydWUsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIHRhcmdldCBzYXcgdGhlIGZ1bGwKKyAqIG1lc3NhZ2UuICBJZiAiZnVsbCIgaXMgZmFsc2UsIHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc2F3IGF0CisgKiBsZWFzdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludAorYWhjX3NlbnRfbXNnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYWhjX21zZ3R5cGUgdHlwZSwgdV9pbnQgbXNndmFsLCBpbnQgZnVsbCkKK3sKKwlpbnQgZm91bmQ7CisJdV9pbnQgaW5kZXg7CisKKwlmb3VuZCA9IEZBTFNFOworCWluZGV4ID0gMDsKKworCXdoaWxlIChpbmRleCA8IGFoYy0+bXNnb3V0X2xlbikgeworCQlpZiAoYWhjLT5tc2dvdXRfYnVmW2luZGV4XSA9PSBNU0dfRVhURU5ERUQpIHsKKwkJCXVfaW50IGVuZF9pbmRleDsKKworCQkJZW5kX2luZGV4ID0gaW5kZXggKyAxICsgYWhjLT5tc2dvdXRfYnVmW2luZGV4ICsgMV07CisJCQlpZiAoYWhjLT5tc2dvdXRfYnVmW2luZGV4KzJdID09IG1zZ3ZhbAorCQkJICYmIHR5cGUgPT0gQUhDTVNHX0VYVCkgeworCisJCQkJaWYgKGZ1bGwpIHsKKwkJCQkJaWYgKGFoYy0+bXNnb3V0X2luZGV4ID4gZW5kX2luZGV4KQorCQkJCQkJZm91bmQgPSBUUlVFOworCQkJCX0gZWxzZSBpZiAoYWhjLT5tc2dvdXRfaW5kZXggPiBpbmRleCkKKwkJCQkJZm91bmQgPSBUUlVFOworCQkJfQorCQkJaW5kZXggPSBlbmRfaW5kZXg7CisJCX0gZWxzZSBpZiAoYWhjLT5tc2dvdXRfYnVmW2luZGV4XSA+PSBNU0dfU0lNUExFX1RBU0sKKwkJCSYmIGFoYy0+bXNnb3V0X2J1ZltpbmRleF0gPD0gTVNHX0lHTl9XSURFX1JFU0lEVUUpIHsKKworCQkJLyogU2tpcCB0YWcgdHlwZSBhbmQgdGFnIGlkIG9yIHJlc2lkdWUgcGFyYW0qLworCQkJaW5kZXggKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIFNpbmdsZSBieXRlIG1lc3NhZ2UgKi8KKwkJCWlmICh0eXBlID09IEFIQ01TR18xQgorCQkJICYmIGFoYy0+bXNnb3V0X2J1ZltpbmRleF0gPT0gbXNndmFsCisJCQkgJiYgYWhjLT5tc2dvdXRfaW5kZXggPiBpbmRleCkKKwkJCQlmb3VuZCA9IFRSVUU7CisJCQlpbmRleCsrOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoZm91bmQpOworfQorCisvKgorICogV2FpdCBmb3IgYSBjb21wbGV0ZSBpbmNvbWluZyBtZXNzYWdlLCBwYXJzZSBpdCwgYW5kIHJlc3BvbmQgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbnQKK2FoY19wYXJzZV9tc2coc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJc3RydWN0CWFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCXN0cnVjdAlhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJaW50CXJlamVjdDsKKwlpbnQJZG9uZTsKKwlpbnQJcmVzcG9uc2U7CisJdV9pbnQJdGFyZ19zY3NpcmF0ZTsKKworCWRvbmUgPSBNU0dMT09QX0lOX1BST0c7CisJcmVzcG9uc2UgPSBGQUxTRTsKKwlyZWplY3QgPSBGQUxTRTsKKwl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCXRhcmdfc2NzaXJhdGUgPSB0aW5mby0+c2NzaXJhdGU7CisKKwkvKgorCSAqIFBhcnNlIGFzIG11Y2ggb2YgdGhlIG1lc3NhZ2UgYXMgaXMgYXZhaWxhYmxlLAorCSAqIHJlamVjdGluZyBpdCBpZiB3ZSBkb24ndCBzdXBwb3J0IGl0LiAgV2hlbgorCSAqIHRoZSBlbnRpcmUgbWVzc2FnZSBpcyBhdmFpbGFibGUgYW5kIGhhcyBiZWVuCisJICogaGFuZGxlZCwgcmV0dXJuIE1TR0xPT1BfTVNHQ09NUExFVEUsIGluZGljYXRpbmcKKwkgKiB0aGF0IHdlIGhhdmUgcGFyc2VkIGFuIGVudGlyZSBtZXNzYWdlLgorCSAqCisJICogSW4gdGhlIGNhc2Ugb2YgZXh0ZW5kZWQgbWVzc2FnZXMsIHdlIGFjY2VwdCB0aGUgbGVuZ3RoCisJICogYnl0ZSBvdXRyaWdodCBhbmQgcGVyZm9ybSBtb3JlIGNoZWNraW5nIG9uY2Ugd2Uga25vdyB0aGUKKwkgKiBleHRlbmRlZCBtZXNzYWdlIHR5cGUuCisJICovCisJc3dpdGNoIChhaGMtPm1zZ2luX2J1ZlswXSkgeworCWNhc2UgTVNHX0RJU0NPTk5FQ1Q6CisJY2FzZSBNU0dfU0FWRURBVEFQT0lOVEVSOgorCWNhc2UgTVNHX0NNRENPTVBMRVRFOgorCWNhc2UgTVNHX1JFU1RPUkVQT0lOVEVSUzoKKwljYXNlIE1TR19JR05fV0lERV9SRVNJRFVFOgorCQkvKgorCQkgKiBFbmQgb3VyIG1lc3NhZ2UgbG9vcCBhcyB0aGVzZSBhcmUgbWVzc2FnZXMKKwkJICogdGhlIHNlcXVlbmNlciBoYW5kbGVzIG9uIGl0cyBvd24uCisJCSAqLworCQlkb25lID0gTVNHTE9PUF9URVJNSU5BVEVEOworCQlicmVhazsKKwljYXNlIE1TR19NRVNTQUdFX1JFSkVDVDoKKwkJcmVzcG9uc2UgPSBhaGNfaGFuZGxlX21zZ19yZWplY3QoYWhjLCBkZXZpbmZvKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE1TR19OT09QOgorCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJYnJlYWs7CisJY2FzZSBNU0dfRVhURU5ERUQ6CisJeworCQkvKiBXYWl0IGZvciBlbm91Z2ggb2YgdGhlIG1lc3NhZ2UgdG8gYmVnaW4gdmFsaWRhdGlvbiAqLworCQlpZiAoYWhjLT5tc2dpbl9pbmRleCA8IDIpCisJCQlicmVhazsKKwkJc3dpdGNoIChhaGMtPm1zZ2luX2J1ZlsyXSkgeworCQljYXNlIE1TR19FWFRfU0RUUjoKKwkJeworCQkJc3RydWN0CSBhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCQkJdV9pbnQJIHBlcmlvZDsKKwkJCXVfaW50CSBwcHJfb3B0aW9uczsKKwkJCXVfaW50CSBvZmZzZXQ7CisJCQl1X2ludAkgc2F2ZWRfb2Zmc2V0OworCQkJCisJCQlpZiAoYWhjLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9TRFRSX0xFTikgeworCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYWl0IHVudGlsIHdlIGhhdmUgYm90aCBhcmdzIGJlZm9yZSB2YWxpZGF0aW5nCisJCQkgKiBhbmQgYWN0aW5nIG9uIHRoaXMgbWVzc2FnZS4KKwkJCSAqCisJCQkgKiBBZGQgb25lIHRvIE1TR19FWFRfU0RUUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhjLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1NEVFJfTEVOICsgMSkpCisJCQkJYnJlYWs7CisKKwkJCXBlcmlvZCA9IGFoYy0+bXNnaW5fYnVmWzNdOworCQkJcHByX29wdGlvbnMgPSAwOworCQkJc2F2ZWRfb2Zmc2V0ID0gb2Zmc2V0ID0gYWhjLT5tc2dpbl9idWZbNF07CisJCQlzeW5jcmF0ZSA9IGFoY19kZXZsaW1pdGVkX3N5bmNyYXRlKGFoYywgdGluZm8sICZwZXJpb2QsCisJCQkJCQkJICAgJnBwcl9vcHRpb25zLAorCQkJCQkJCSAgIGRldmluZm8tPnJvbGUpOworCQkJYWhjX3ZhbGlkYXRlX29mZnNldChhaGMsIHRpbmZvLCBzeW5jcmF0ZSwgJm9mZnNldCwKKwkJCQkJICAgIHRhcmdfc2NzaXJhdGUgJiBXSURFWEZFUiwKKwkJCQkJICAgIGRldmluZm8tPnJvbGUpOworCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCAiCisJCQkJICAgICAgICJTRFRSIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG5cdCIKKwkJCQkgICAgICAgIkZpbHRlcmVkIHRvIHBlcmlvZCAleCwgb2Zmc2V0ICV4XG4iLAorCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAgICAgYWhjLT5tc2dpbl9idWZbM10sIHNhdmVkX29mZnNldCwKKwkJCQkgICAgICAgcGVyaW9kLCBvZmZzZXQpOworCQkJfQorCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsIGRldmluZm8sIAorCQkJCQkgc3luY3JhdGUsIHBlcmlvZCwKKwkJCQkJIG9mZnNldCwgcHByX29wdGlvbnMsCisJCQkJCSBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19HT0FMLAorCQkJCQkgLypwYXVzZWQqL1RSVUUpOworCisJCQkvKgorCQkJICogU2VlIGlmIHdlIGluaXRpYXRlZCBTeW5jIE5lZ290aWF0aW9uCisJCQkgKiBhbmQgZGlkbid0IGhhdmUgdG8gZmFsbCBkb3duIHRvIGFzeW5jCisJCQkgKiB0cmFuc2ZlcnMuCisJCQkgKi8KKwkJCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1NEVFIsIFRSVUUpKSB7CisJCQkJLyogV2Ugc3RhcnRlZCBpdCAqLworCQkJCWlmIChzYXZlZF9vZmZzZXQgIT0gb2Zmc2V0KSB7CisJCQkJCS8qIFdlbnQgdG9vIGxvdyAtIGZvcmNlIGFzeW5jICovCisJCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgb3VyIG93biBTRFRSIGluIHJlcGx5CisJCQkJICovCisJCQkJaWYgKGJvb3R2ZXJib3NlCisJCQkJICYmIGRldmluZm8tPnJvbGUgPT0gUk9MRV9JTklUSUFUT1IpIHsKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBTRFRSXG4iLAorCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJCQl9CisJCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisJCQkJYWhjX2NvbnN0cnVjdF9zZHRyKGFoYywgZGV2aW5mbywKKwkJCQkJCSAgIHBlcmlvZCwgb2Zmc2V0KTsKKwkJCQlhaGMtPm1zZ291dF9pbmRleCA9IDA7CisJCQkJcmVzcG9uc2UgPSBUUlVFOworCQkJfQorCQkJZG9uZSA9IE1TR0xPT1BfTVNHQ09NUExFVEU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE1TR19FWFRfV0RUUjoKKwkJeworCQkJdV9pbnQgYnVzX3dpZHRoOworCQkJdV9pbnQgc2F2ZWRfd2lkdGg7CisJCQl1X2ludCBzZW5kaW5nX3JlcGx5OworCisJCQlzZW5kaW5nX3JlcGx5ID0gRkFMU0U7CisJCQlpZiAoYWhjLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9XRFRSX0xFTikgeworCQkJCXJlamVjdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXYWl0IHVudGlsIHdlIGhhdmUgb3VyIGFyZyBiZWZvcmUgdmFsaWRhdGluZworCQkJICogYW5kIGFjdGluZyBvbiB0aGlzIG1lc3NhZ2UuCisJCQkgKgorCQkJICogQWRkIG9uZSB0byBNU0dfRVhUX1dEVFJfTEVOIHRvIGFjY291bnQgZm9yCisJCQkgKiB0aGUgZXh0ZW5kZWQgbWVzc2FnZSBwcmVhbWJsZS4KKwkJCSAqLworCQkJaWYgKGFoYy0+bXNnaW5faW5kZXggPCAoTVNHX0VYVF9XRFRSX0xFTiArIDEpKQorCQkJCWJyZWFrOworCisJCQlidXNfd2lkdGggPSBhaGMtPm1zZ2luX2J1ZlszXTsKKwkJCXNhdmVkX3dpZHRoID0gYnVzX3dpZHRoOworCQkJYWhjX3ZhbGlkYXRlX3dpZHRoKGFoYywgdGluZm8sICZidXNfd2lkdGgsCisJCQkJCSAgIGRldmluZm8tPnJvbGUpOworCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBSZWNlaXZlZCBXRFRSICIKKwkJCQkgICAgICAgIiV4IGZpbHRlcmVkIHRvICV4XG4iLAorCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAgICAgc2F2ZWRfd2lkdGgsIGJ1c193aWR0aCk7CisJCQl9CisKKwkJCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1dEVFIsIFRSVUUpKSB7CisJCQkJLyoKKwkJCQkgKiBEb24ndCBzZW5kIGEgV0RUUiBiYWNrIHRvIHRoZQorCQkJCSAqIHRhcmdldCwgc2luY2Ugd2UgYXNrZWQgZmlyc3QuCisJCQkJICogSWYgdGhlIHdpZHRoIHdlbnQgaGlnaGVyIHRoYW4gb3VyCisJCQkJICogcmVxdWVzdCwgcmVqZWN0IGl0LgorCQkJCSAqLworCQkJCWlmIChzYXZlZF93aWR0aCA+IGJ1c193aWR0aCkgeworCQkJCQlyZWplY3QgPSBUUlVFOworCQkJCQlwcmludGYoIiglczolYzolZDolZCk6IHJlcXVlc3RlZCAlZEJpdCAiCisJCQkJCSAgICAgICAidHJhbnNmZXJzLiAgUmVqZWN0aW5nLi4uXG4iLAorCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCQkgICAgICAgOCAqICgweDAxIDw8IGJ1c193aWR0aCkpOworCQkJCQlidXNfd2lkdGggPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIG91ciBvd24gV0RUUiBpbiByZXBseQorCQkJCSAqLworCQkJCWlmIChib290dmVyYm9zZQorCQkJCSAmJiBkZXZpbmZvLT5yb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogVGFyZ2V0ICIKKwkJCQkJICAgICAgICJJbml0aWF0ZWQgV0RUUlxuIiwKKwkJCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJCSAgICAgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CisJCQkJfQorCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlhaGMtPm1zZ291dF9sZW4gPSAwOworCQkJCWFoY19jb25zdHJ1Y3Rfd2R0cihhaGMsIGRldmluZm8sIGJ1c193aWR0aCk7CisJCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCXJlc3BvbnNlID0gVFJVRTsKKwkJCQlzZW5kaW5nX3JlcGx5ID0gVFJVRTsKKwkJCX0KKwkJCS8qCisJCQkgKiBBZnRlciBhIHdpZGUgbWVzc2FnZSwgd2UgYXJlIGFzeW5jLCBidXQKKwkJCSAqIHNvbWUgZGV2aWNlcyBkb24ndCBzZWVtIHRvIGhvbm9yIHRoaXMgcG9ydGlvbgorCQkJICogb2YgdGhlIHNwZWMuICBGb3JjZSBhIHJlbmVnb3RpYXRpb24gb2YgdGhlCisJCQkgKiBzeW5jIGNvbXBvbmVudCBvZiBvdXIgdHJhbnNmZXIgYWdyZWVtZW50IGV2ZW4KKwkJCSAqIGlmIG91ciBnb2FsIGlzIGFzeW5jLiAgQnkgdXBkYXRpbmcgb3VyIHdpZHRoCisJCQkgKiBhZnRlciBmb3JjaW5nIHRoZSBuZWdvdGlhdGlvbiwgd2UgYXZvaWQKKwkJCSAqIHJlbmVnb3RpYXRpbmcgZm9yIHdpZHRoLgorCQkJICovCisJCQlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgZGV2aW5mbywgdHN0YXRlLAorCQkJCQkgICAgICAgdGluZm8sIEFIQ19ORUdfQUxXQVlTKTsKKwkJCWFoY19zZXRfd2lkdGgoYWhjLCBkZXZpbmZvLCBidXNfd2lkdGgsCisJCQkJICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKKwkJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCQlpZiAoc2VuZGluZ19yZXBseSA9PSBGQUxTRSAmJiByZWplY3QgPT0gRkFMU0UpIHsKKworCQkJCS8qCisJCQkJICogV2Ugd2lsbCBhbHdheXMgaGF2ZSBhbiBTRFRSIHRvIHNlbmQuCisJCQkJICovCisJCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisJCQkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhhaGMsIGRldmluZm8pOworCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlyZXNwb25zZSA9IFRSVUU7CisJCQl9CisJCQlkb25lID0gTVNHTE9PUF9NU0dDT01QTEVURTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTVNHX0VYVF9QUFI6CisJCXsKKwkJCXN0cnVjdAlhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCQkJdV9pbnQJcGVyaW9kOworCQkJdV9pbnQJb2Zmc2V0OworCQkJdV9pbnQJYnVzX3dpZHRoOworCQkJdV9pbnQJcHByX29wdGlvbnM7CisJCQl1X2ludAlzYXZlZF93aWR0aDsKKwkJCXVfaW50CXNhdmVkX29mZnNldDsKKwkJCXVfaW50CXNhdmVkX3Bwcl9vcHRpb25zOworCisJCQlpZiAoYWhjLT5tc2dpbl9idWZbMV0gIT0gTVNHX0VYVF9QUFJfTEVOKSB7CisJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBhbGwgYXJncyBiZWZvcmUgdmFsaWRhdGluZworCQkJICogYW5kIGFjdGluZyBvbiB0aGlzIG1lc3NhZ2UuCisJCQkgKgorCQkJICogQWRkIG9uZSB0byBNU0dfRVhUX1BQUl9MRU4gdG8gYWNjb3VudCBmb3IKKwkJCSAqIHRoZSBleHRlbmRlZCBtZXNzYWdlIHByZWFtYmxlLgorCQkJICovCisJCQlpZiAoYWhjLT5tc2dpbl9pbmRleCA8IChNU0dfRVhUX1BQUl9MRU4gKyAxKSkKKwkJCQlicmVhazsKKworCQkJcGVyaW9kID0gYWhjLT5tc2dpbl9idWZbM107CisJCQlvZmZzZXQgPSBhaGMtPm1zZ2luX2J1Zls1XTsKKwkJCWJ1c193aWR0aCA9IGFoYy0+bXNnaW5fYnVmWzZdOworCQkJc2F2ZWRfd2lkdGggPSBidXNfd2lkdGg7CisJCQlwcHJfb3B0aW9ucyA9IGFoYy0+bXNnaW5fYnVmWzddOworCQkJLyoKKwkJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgYSBEVCBvbmx5CisJCQkgKiBwZXJpb2QgZmFjdG9yIHdpdGggbm8gRFQgb3B0aW9uCisJCQkgKiBzZXQgaW1wbGllcyBhc3luYy4KKwkJCSAqLworCQkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgPT0gMAorCQkJICYmIHBlcmlvZCA9PSA5KQorCQkJCW9mZnNldCA9IDA7CisJCQlzYXZlZF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCQkJc2F2ZWRfb2Zmc2V0ID0gb2Zmc2V0OworCisJCQkvKgorCQkJICogTWFzayBvdXQgYW55IG9wdGlvbnMgd2UgZG9uJ3Qgc3VwcG9ydAorCQkJICogb24gYW55IGNvbnRyb2xsZXIuICBUcmFuc2ZlciBvcHRpb25zIGFyZQorCQkJICogb25seSBhdmFpbGFibGUgaWYgd2UgYXJlIG5lZ290aWF0aW5nIHdpZGUuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zICY9IE1TR19FWFRfUFBSX0RUX1JFUTsKKwkJCWlmIChidXNfd2lkdGggPT0gMCkKKwkJCQlwcHJfb3B0aW9ucyA9IDA7CisKKwkJCWFoY192YWxpZGF0ZV93aWR0aChhaGMsIHRpbmZvLCAmYnVzX3dpZHRoLAorCQkJCQkgICBkZXZpbmZvLT5yb2xlKTsKKwkJCXN5bmNyYXRlID0gYWhjX2RldmxpbWl0ZWRfc3luY3JhdGUoYWhjLCB0aW5mbywgJnBlcmlvZCwKKwkJCQkJCQkgICAmcHByX29wdGlvbnMsCisJCQkJCQkJICAgZGV2aW5mby0+cm9sZSk7CisJCQlhaGNfdmFsaWRhdGVfb2Zmc2V0KGFoYywgdGluZm8sIHN5bmNyYXRlLAorCQkJCQkgICAgJm9mZnNldCwgYnVzX3dpZHRoLAorCQkJCQkgICAgZGV2aW5mby0+cm9sZSk7CisKKwkJCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1BQUiwgVFJVRSkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGFyZSB1bmFibGUgdG8gZG8gYW55IG9mIHRoZQorCQkJCSAqIHJlcXVlc3RlZCBvcHRpb25zICh3ZSB3ZW50IHRvbyBsb3cpLAorCQkJCSAqIHRoZW4gd2UnbGwgaGF2ZSB0byByZWplY3QgdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJaWYgKHNhdmVkX3dpZHRoID4gYnVzX3dpZHRoCisJCQkJIHx8IHNhdmVkX29mZnNldCAhPSBvZmZzZXQKKwkJCQkgfHwgc2F2ZWRfcHByX29wdGlvbnMgIT0gcHByX29wdGlvbnMpIHsKKwkJCQkJcmVqZWN0ID0gVFJVRTsKKwkJCQkJcGVyaW9kID0gMDsKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCQkJYnVzX3dpZHRoID0gMDsKKwkJCQkJcHByX29wdGlvbnMgPSAwOworCQkJCQlzeW5jcmF0ZSA9IE5VTEw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGV2aW5mby0+cm9sZSAhPSBST0xFX1RBUkdFVCkKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBUYXJnZXQgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBQUFJcbiIsCisJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBJbml0aWF0b3IgIgorCQkJCQkgICAgICAgIkluaXRpYXRlZCBQUFJcbiIsCisJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlhaGMtPm1zZ291dF9sZW4gPSAwOworCQkJCWFoY19jb25zdHJ1Y3RfcHByKGFoYywgZGV2aW5mbywgcGVyaW9kLCBvZmZzZXQsCisJCQkJCQkgIGJ1c193aWR0aCwgcHByX29wdGlvbnMpOworCQkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCQlyZXNwb25zZSA9IFRSVUU7CisJCQl9CisJCQlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIiglczolYzolZDolZCk6IFJlY2VpdmVkIFBQUiB3aWR0aCAleCwgIgorCQkJCSAgICAgICAicGVyaW9kICV4LCBvZmZzZXQgJXgsb3B0aW9ucyAleFxuIgorCQkJCSAgICAgICAiXHRGaWx0ZXJlZCB0byB3aWR0aCAleCwgcGVyaW9kICV4LCAiCisJCQkJICAgICAgICJvZmZzZXQgJXgsIG9wdGlvbnMgJXhcbiIsCisJCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuLAorCQkJCSAgICAgICBzYXZlZF93aWR0aCwgYWhjLT5tc2dpbl9idWZbM10sCisJCQkJICAgICAgIHNhdmVkX29mZnNldCwgc2F2ZWRfcHByX29wdGlvbnMsCisJCQkJICAgICAgIGJ1c193aWR0aCwgcGVyaW9kLCBvZmZzZXQsIHBwcl9vcHRpb25zKTsKKwkJCX0KKwkJCWFoY19zZXRfd2lkdGgoYWhjLCBkZXZpbmZvLCBidXNfd2lkdGgsCisJCQkJICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKKwkJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCQlhaGNfc2V0X3N5bmNyYXRlKGFoYywgZGV2aW5mbywKKwkJCQkJIHN5bmNyYXRlLCBwZXJpb2QsCisJCQkJCSBvZmZzZXQsIHBwcl9vcHRpb25zLAorCQkJCQkgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCwKKwkJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwkJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCS8qIFVua25vd24gZXh0ZW5kZWQgbWVzc2FnZS4gIFJlamVjdCBpdC4gKi8KKwkJCXJlamVjdCA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJY2FzZSBNU0dfQlVTX0RFVl9SRVNFVDoKKwkJYWhjX2hhbmRsZV9kZXZyZXNldChhaGMsIGRldmluZm8sCisJCQkJICAgIENBTV9CRFJfU0VOVCwKKwkJCQkgICAgIkJ1cyBEZXZpY2UgUmVzZXQgUmVjZWl2ZWQiLAorCQkJCSAgICAvKnZlcmJvc2VfbGV2ZWwqLzApOworCQlhaGNfcmVzdGFydChhaGMpOworCQlkb25lID0gTVNHTE9PUF9URVJNSU5BVEVEOworCQlicmVhazsKKwljYXNlIE1TR19BQk9SVF9UQUc6CisJY2FzZSBNU0dfQUJPUlQ6CisJY2FzZSBNU0dfQ0xFQVJfUVVFVUU6CisJeworCQlpbnQgdGFnOworCisJCS8qIFRhcmdldCBtb2RlIG1lc3NhZ2VzICovCisJCWlmIChkZXZpbmZvLT5yb2xlICE9IFJPTEVfVEFSR0VUKSB7CisJCQlyZWplY3QgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJdGFnID0gU0NCX0xJU1RfTlVMTDsKKwkJaWYgKGFoYy0+bXNnaW5fYnVmWzBdID09IE1TR19BQk9SVF9UQUcpCisJCQl0YWcgPSBhaGNfaW5iKGFoYywgSU5JVElBVE9SX1RBRyk7CisJCWFoY19hYm9ydF9zY2JzKGFoYywgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5jaGFubmVsLAorCQkJICAgICAgIGRldmluZm8tPmx1biwgdGFnLCBST0xFX1RBUkdFVCwKKwkJCSAgICAgICBDQU1fUkVRX0FCT1JURUQpOworCisJCXRzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2RldmluZm8tPm91cl9zY3NpaWRdOworCQlpZiAodHN0YXRlICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2RldmluZm8tPmx1bl07CisJCQlpZiAobHN0YXRlICE9IE5VTEwpIHsKKwkJCQlhaGNfcXVldWVfbHN0YXRlX2V2ZW50KGFoYywgbHN0YXRlLAorCQkJCQkJICAgICAgIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJCQkgICAgICAgYWhjLT5tc2dpbl9idWZbMF0sCisJCQkJCQkgICAgICAgLyphcmcqL3RhZyk7CisJCQkJYWhjX3NlbmRfbHN0YXRlX2V2ZW50cyhhaGMsIGxzdGF0ZSk7CisJCQl9CisJCX0KKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwkJZG9uZSA9IE1TR0xPT1BfVEVSTUlOQVRFRDsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBNU0dfVEVSTV9JT19QUk9DOgorCWRlZmF1bHQ6CisJCXJlamVjdCA9IFRSVUU7CisJCWJyZWFrOworCX0KKworCWlmIChyZWplY3QpIHsKKwkJLyoKKwkJICogU2V0dXAgdG8gcmVqZWN0IHRoZSBtZXNzYWdlLgorCQkgKi8KKwkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQlhaGMtPm1zZ291dF9sZW4gPSAxOworCQlhaGMtPm1zZ291dF9idWZbMF0gPSBNU0dfTUVTU0FHRV9SRUpFQ1Q7CisJCWRvbmUgPSBNU0dMT09QX01TR0NPTVBMRVRFOworCQlyZXNwb25zZSA9IFRSVUU7CisJfQorCisJaWYgKGRvbmUgIT0gTVNHTE9PUF9JTl9QUk9HICYmICFyZXNwb25zZSkKKwkJLyogQ2xlYXIgdGhlIG91dGdvaW5nIG1lc3NhZ2UgYnVmZmVyICovCisJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisKKwlyZXR1cm4gKGRvbmUpOworfQorCisvKgorICogUHJvY2VzcyBhIG1lc3NhZ2UgcmVqZWN0IG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK2FoY19oYW5kbGVfbXNnX3JlamVjdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwkvKgorCSAqIFdoYXQgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGlmIHdlIGhhZCBhbgorCSAqIG91dHN0YW5kaW5nIFNEVFIgb3IgV0RUUiBtZXNzYWdlIGZvciB0aGlzCisJICogdGFyZ2V0LiAgSWYgd2UgZGlkLCB0aGlzIGlzIGEgc2lnbmFsIHRoYXQKKwkgKiB0aGUgdGFyZ2V0IGlzIHJlZnVzaW5nIG5lZ290aWF0aW9uLgorCSAqLworCXN0cnVjdCBzY2IgKnNjYjsKKwlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0IGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1X2ludCBzY2JfaW5kZXg7CisJdV9pbnQgbGFzdF9tc2c7CisJaW50ICAgcmVzcG9uc2UgPSAwOworCisJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9UQUcpOworCXNjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKKwl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCS8qIE1pZ2h0IGJlIG5lY2Vzc2FyeSAqLworCWxhc3RfbXNnID0gYWhjX2luYihhaGMsIExBU1RfTVNHKTsKKworCWlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1BQUiwgLypmdWxsKi9GQUxTRSkpIHsKKwkJLyoKKwkJICogVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFBQUiBtZXNzYWdlLgorCQkgKiBBdHRlbXB0IHRvIG5lZ290aWF0ZSBTUEktMiBzdHlsZS4KKwkJICovCisJCWlmIChib290dmVyYm9zZSkgeworCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiBQUFIgUmVqZWN0ZWQuICIKKwkJCSAgICAgICAiVHJ5aW5nIFdEVFIvU0RUUlxuIiwKKwkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJICAgICAgIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+bHVuKTsKKwkJfQorCQl0aW5mby0+Z29hbC5wcHJfb3B0aW9ucyA9IDA7CisJCXRpbmZvLT5jdXJyLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJdGluZm8tPmdvYWwudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQlhaGMtPm1zZ291dF9pbmRleCA9IDA7CisJCWFoYy0+bXNnb3V0X2xlbiA9IDA7CisJCWFoY19idWlsZF90cmFuc2Zlcl9tc2coYWhjLCBkZXZpbmZvKTsKKwkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQlyZXNwb25zZSA9IDE7CisJfSBlbHNlIGlmIChhaGNfc2VudF9tc2coYWhjLCBBSENNU0dfRVhULCBNU0dfRVhUX1dEVFIsIC8qZnVsbCovRkFMU0UpKSB7CisKKwkJLyogbm90ZSA4Yml0IHhmZXJzICovCisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBXSURFIG5lZ290aWF0aW9uLiAgVXNpbmcgIgorCQkgICAgICAgIjhiaXQgdHJhbnNmZXJzXG4iLCBhaGNfbmFtZShhaGMpLAorCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCQlhaGNfc2V0X3dpZHRoKGFoYywgZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCSAgICAgIEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0dPQUwsCisJCQkgICAgICAvKnBhdXNlZCovVFJVRSk7CisJCS8qCisJCSAqIE5vIG5lZWQgdG8gY2xlYXIgdGhlIHN5bmMgcmF0ZS4gIElmIHRoZSB0YXJnZXQKKwkJICogZGlkIG5vdCBhY2NlcHQgdGhlIGNvbW1hbmQsIG91ciBzeW5jcmF0ZSBpcworCQkgKiB1bmFmZmVjdGVkLiAgSWYgdGhlIHRhcmdldCBzdGFydGVkIHRoZSBuZWdvdGlhdGlvbiwKKwkJICogYnV0IHJlamVjdGVkIG91ciByZXNwb25zZSwgd2UgYWxyZWFkeSBjbGVhcmVkIHRoZQorCQkgKiBzeW5jIHJhdGUgYmVmb3JlIHNlbmRpbmcgb3VyIFdEVFIuCisJCSAqLworCQlpZiAodGluZm8tPmdvYWwub2Zmc2V0ICE9IHRpbmZvLT5jdXJyLm9mZnNldCkgeworCisJCQkvKiBTdGFydCB0aGUgc3luYyBuZWdvdGlhdGlvbiAqLworCQkJYWhjLT5tc2dvdXRfaW5kZXggPSAwOworCQkJYWhjLT5tc2dvdXRfbGVuID0gMDsKKwkJCWFoY19idWlsZF90cmFuc2Zlcl9tc2coYWhjLCBkZXZpbmZvKTsKKwkJCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwkJCXJlc3BvbnNlID0gMTsKKwkJfQorCX0gZWxzZSBpZiAoYWhjX3NlbnRfbXNnKGFoYywgQUhDTVNHX0VYVCwgTVNHX0VYVF9TRFRSLCAvKmZ1bGwqL0ZBTFNFKSkgeworCQkvKiBub3RlIGFzeW5jaCB4ZmVycyBhbmQgY2xlYXIgZmxhZyAqLworCQlhaGNfc2V0X3N5bmNyYXRlKGFoYywgZGV2aW5mbywgLypzeW5jcmF0ZSovTlVMTCwgLypwZXJpb2QqLzAsCisJCQkJIC8qb2Zmc2V0Ki8wLCAvKnBwcl9vcHRpb25zKi8wLAorCQkJCSBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19HT0FMLAorCQkJCSAvKnBhdXNlZCovVFJVRSk7CisJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbi4gIgorCQkgICAgICAgIlVzaW5nIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnNcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBkZXZpbmZvLT5jaGFubmVsLAorCQkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOworCX0gZWxzZSBpZiAoKHNjYi0+aHNjYi0+Y29udHJvbCAmIE1TR19TSU1QTEVfVEFTSykgIT0gMCkgeworCQlpbnQgdGFnX3R5cGU7CisJCWludCBtYXNrOworCisJCXRhZ190eXBlID0gKHNjYi0+aHNjYi0+Y29udHJvbCAmIE1TR19TSU1QTEVfVEFTSyk7CisKKwkJaWYgKHRhZ190eXBlID09IE1TR19TSU1QTEVfVEFTSykgeworCQkJcHJpbnRmKCIoJXM6JWM6JWQ6JWQpOiByZWZ1c2VzIHRhZ2dlZCBjb21tYW5kcy4gICIKKwkJCSAgICAgICAiUGVyZm9ybWluZyBub24tdGFnZ2VkIEkvT1xuIiwgYWhjX25hbWUoYWhjKSwKKwkJCSAgICAgICBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1bik7CisJCQlhaGNfc2V0X3RhZ3MoYWhjLCBkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJCQltYXNrID0gfjB4MjM7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiglczolYzolZDolZCk6IHJlZnVzZXMgJXMgdGFnZ2VkIGNvbW1hbmRzLiAgIgorCQkJICAgICAgICJQZXJmb3JtaW5nIHNpbXBsZSBxdWV1ZSB0YWdnZWQgSS9PIG9ubHlcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAorCQkJICAgICAgIGRldmluZm8tPmx1biwgdGFnX3R5cGUgPT0gTVNHX09SREVSRURfVEFTSworCQkJICAgICAgID8gIm9yZGVyZWQiIDogImhlYWQgb2YgcXVldWUiKTsKKwkJCWFoY19zZXRfdGFncyhhaGMsIGRldmluZm8sIEFIQ19RVUVVRV9CQVNJQyk7CisJCQltYXNrID0gfjB4MDM7CisJCX0KKworCQkvKgorCQkgKiBSZXNlbmQgdGhlIGlkZW50aWZ5IGZvciB0aGlzIENDQiBhcyB0aGUgdGFyZ2V0CisJCSAqIG1heSBiZWxpZXZlIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkIG90aGVyd2lzZS4KKwkJICovCisJCWFoY19vdXRiKGFoYywgU0NCX0NPTlRST0wsCisJCQkgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSAmIG1hc2spOworCSAJc2NiLT5oc2NiLT5jb250cm9sICY9IG1hc2s7CisJCWFoY19zZXRfdHJhbnNhY3Rpb25fdGFnKHNjYiwgLyplbmFibGVkKi9GQUxTRSwKKwkJCQkJLyp0eXBlKi9NU0dfU0lNUExFX1RBU0spOworCQlhaGNfb3V0YihhaGMsIE1TR19PVVQsIE1TR19JREVOVElGWUZMQUcpOworCQlhaGNfYXNzZXJ0X2F0bihhaGMpOworCisJCS8qCisJCSAqIFRoaXMgdHJhbnNhY3Rpb24gaXMgbm93IGF0IHRoZSBoZWFkIG9mCisJCSAqIHRoZSB1bnRhZ2dlZCBxdWV1ZSBmb3IgdGhpcyB0YXJnZXQuCisJCSAqLworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQkJc3RydWN0IHNjYl90YWlscSAqdW50YWdnZWRfcTsKKworCQkJdW50YWdnZWRfcSA9CisJCQkgICAgJihhaGMtPnVudGFnZ2VkX3F1ZXVlc1tkZXZpbmZvLT50YXJnZXRfb2Zmc2V0XSk7CisJCQlUQUlMUV9JTlNFUlRfSEVBRCh1bnRhZ2dlZF9xLCBzY2IsIGxpbmtzLnRxZSk7CisJCQlzY2ItPmZsYWdzIHw9IFNDQl9VTlRBR0dFRFE7CisJCX0KKwkJYWhjX2J1c3lfdGNsKGFoYywgQlVJTERfVENMKHNjYi0+aHNjYi0+c2NzaWlkLCBkZXZpbmZvLT5sdW4pLAorCQkJICAgICBzY2ItPmhzY2ItPnRhZyk7CisKKwkJLyoKKwkJICogUmVxdWV1ZSBhbGwgdGFnZ2VkIGNvbW1hbmRzIGZvciB0aGlzIHRhcmdldAorCQkgKiBjdXJyZW50bHkgaW4gb3VyIHBvc2Vzc2lvbiBzbyB0aGV5IGNhbiBiZQorCQkgKiBjb252ZXJ0ZWQgdG8gdW50YWdnZWQgY29tbWFuZHMuCisJCSAqLworCQlhaGNfc2VhcmNoX3FpbmZpZm8oYWhjLCBTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYiksCisJCQkJICAgU0NCX0dFVF9DSEFOTkVMKGFoYywgc2NiKSwKKwkJCQkgICBTQ0JfR0VUX0xVTihzY2IpLCAvKnRhZyovU0NCX0xJU1RfTlVMTCwKKwkJCQkgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRLAorCQkJCSAgIFNFQVJDSF9DT01QTEVURSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCisJCSAqLworCQlwcmludGYoIiVzOiVjOiVkOiBNZXNzYWdlIHJlamVjdCBmb3IgJXggLS0gaWdub3JlZFxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKKwkJICAgICAgIGxhc3RfbXNnKTsKKwl9CisJcmV0dXJuIChyZXNwb25zZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGluZ25vcmUgd2lkZSByZXNpZHVlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfaGFuZGxlX2lnbl93aWRlX3Jlc2lkdWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJdV9pbnQgc2NiX2luZGV4OworCXN0cnVjdCBzY2IgKnNjYjsKKworCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHNjYl9pbmRleCk7CisJLyoKKwkgKiBYWFggQWN0dWFsbHkgY2hlY2sgZGF0YSBkaXJlY3Rpb24gaW4gdGhlIHNlcXVlbmNlcj8KKwkgKiBQZXJoYXBzIGFkZCBkYXRhZGlyIHRvIHNvbWUgc3BhcmUgYml0cyBpbiB0aGUgaHNjYj8KKwkgKi8KKwlpZiAoKGFoY19pbmIoYWhjLCBTRVFfRkxBR1MpICYgRFBIQVNFKSA9PSAwCisJIHx8IGFoY19nZXRfdHJhbnNmZXJfZGlyKHNjYikgIT0gQ0FNX0RJUl9JTikgeworCQkvKgorCQkgKiBJZ25vcmUgdGhlIG1lc3NhZ2UgaWYgd2UgaGF2ZW4ndAorCQkgKiBzZWVuIGFuIGFwcHJvcHJpYXRlIGRhdGEgcGhhc2UgeWV0LgorCQkgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiB0aGUgcmVzaWR1YWwgb2NjdXJyZWQgb24gdGhlIGxhc3QKKwkJICogdHJhbnNmZXIgYW5kIHRoZSB0cmFuc2ZlciByZXF1ZXN0IHdhcworCQkgKiBleHBlY3RlZCB0byBlbmQgb24gYW4gb2RkIGNvdW50LCBkbworCQkgKiBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzdWJ0cmFjdCBhIGJ5dGUKKwkJICogYW5kIHVwZGF0ZSB0aGUgcmVzaWR1YWwgY291bnQgYWNjb3JkaW5nbHkuCisJCSAqLworCQl1aW50MzJfdCBzZ3B0cjsKKworCQlzZ3B0ciA9IGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfU0dQVFIpOworCQlpZiAoKHNncHRyICYgU0dfTElTVF9OVUxMKSAhPSAwCisJCSAmJiAoYWhjX2luYihhaGMsIFNDQl9MVU4pICYgU0NCX1hGRVJMRU5fT0REKSAhPSAwKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHJlc2lkdWFsIG9jY3VycmVkIG9uIHRoZSBsYXN0CisJCQkgKiB0cmFuc2ZlciBhbmQgdGhlIHRyYW5zZmVyIHJlcXVlc3Qgd2FzCisJCQkgKiBleHBlY3RlZCB0byBlbmQgb24gYW4gb2RkIGNvdW50LCBkbworCQkJICogbm90aGluZy4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJc3RydWN0IGFoY19kbWFfc2VnICpzZzsKKwkJCXVpbnQzMl90IGRhdGFfY250OworCQkJdWludDMyX3QgZGF0YV9hZGRyOworCQkJdWludDMyX3Qgc2dsZW47CisKKwkJCS8qIFB1bGwgaW4gYWxsIG9mIHRoZSBzZ3B0ciAqLworCQkJc2dwdHIgPSBhaGNfaW5sKGFoYywgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKwkJCWRhdGFfY250ID0gYWhjX2lubChhaGMsIFNDQl9SRVNJRFVBTF9EQVRBQ05UKTsKKworCQkJaWYgKChzZ3B0ciAmIFNHX0xJU1RfTlVMTCkgIT0gMCkgeworCQkJCS8qCisJCQkJICogVGhlIHJlc2lkdWFsIGRhdGEgY291bnQgaXMgbm90IHVwZGF0ZWQKKwkJCQkgKiBmb3IgdGhlIGNvbW1hbmQgcnVuIHRvIGNvbXBsZXRpb24gY2FzZS4KKwkJCQkgKiBFeHBsaWNpdGx5IHplcm8gdGhlIGNvdW50LgorCQkJCSAqLworCQkJCWRhdGFfY250ICY9IH5BSENfU0dfTEVOX01BU0s7CisJCQl9CisKKwkJCWRhdGFfYWRkciA9IGFoY19pbmwoYWhjLCBTSEFERFIpOworCisJCQlkYXRhX2NudCArPSAxOworCQkJZGF0YV9hZGRyIC09IDE7CisJCQlzZ3B0ciAmPSBTR19QVFJfTUFTSzsKKworCQkJc2cgPSBhaGNfc2dfYnVzX3RvX3ZpcnQoc2NiLCBzZ3B0cik7CisKKwkJCS8qCisJCQkgKiBUaGUgcmVzaWR1YWwgc2cgcHRyIHBvaW50cyB0byB0aGUgbmV4dCBTL0cKKwkJCSAqIHRvIGxvYWQgc28gd2UgbXVzdCBnbyBiYWNrIG9uZS4KKwkJCSAqLworCQkJc2ctLTsKKwkJCXNnbGVuID0gYWhjX2xlMzJ0b2goc2ctPmxlbikgJiBBSENfU0dfTEVOX01BU0s7CisJCQlpZiAoc2cgIT0gc2NiLT5zZ19saXN0CisJCQkgJiYgc2dsZW4gPCAoZGF0YV9jbnQgJiBBSENfU0dfTEVOX01BU0spKSB7CisKKwkJCQlzZy0tOworCQkJCXNnbGVuID0gYWhjX2xlMzJ0b2goc2ctPmxlbik7CisJCQkJLyoKKwkJCQkgKiBQcmVzZXJ2ZSBIaWdoIEFkZHJlc3MgYW5kIFNHX0xJU1QgYml0cworCQkJCSAqIHdoaWxlIHNldHRpbmcgdGhlIGNvdW50IHRvIDEuCisJCQkJICovCisJCQkJZGF0YV9jbnQgPSAxIHwgKHNnbGVuICYgKH5BSENfU0dfTEVOX01BU0spKTsKKwkJCQlkYXRhX2FkZHIgPSBhaGNfbGUzMnRvaChzZy0+YWRkcikKKwkJCQkJICArIChzZ2xlbiAmIEFIQ19TR19MRU5fTUFTSykgLSAxOworCisJCQkJLyoKKwkJCQkgKiBJbmNyZW1lbnQgc2cgc28gaXQgcG9pbnRzIHRvIHRoZQorCQkJCSAqICJuZXh0IiBzZy4KKwkJCQkgKi8KKwkJCQlzZysrOworCQkJCXNncHRyID0gYWhjX3NnX3ZpcnRfdG9fYnVzKHNjYiwgc2cpOworCQkJfQorCQkJYWhjX291dGwoYWhjLCBTQ0JfUkVTSURVQUxfU0dQVFIsIHNncHRyKTsKKwkJCWFoY19vdXRsKGFoYywgU0NCX1JFU0lEVUFMX0RBVEFDTlQsIGRhdGFfY250KTsKKwkJCS8qCisJCQkgKiBUb2dnbGUgdGhlICJvZGRuZXNzIiBvZiB0aGUgdHJhbnNmZXIgbGVuZ3RoCisJCQkgKiB0byBoYW5kbGUgdGhpcyBtaWQtdHJhbnNmZXIgaWdub3JlIHdpZGUKKwkJCSAqIHJlc2lkdWUuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgb2RkbmVzcyBpcworCQkJICogY29ycmVjdCBmb3Igc3Vic2VxdWVudCBkYXRhIHRyYW5zZmVycy4KKwkJCSAqLworCQkJYWhjX291dGIoYWhjLCBTQ0JfTFVOLAorCQkJCSBhaGNfaW5iKGFoYywgU0NCX0xVTikgXiBTQ0JfWEZFUkxFTl9PREQpOworCQl9CisJfQorfQorCisKKy8qCisgKiBSZWluaXRpYWxpemUgdGhlIGRhdGEgcG9pbnRlcnMgZm9yIHRoZSBhY3RpdmUgdHJhbnNmZXIKKyAqIGJhc2VkIG9uIGl0cyBjdXJyZW50IHJlc2lkdWFsLgorICovCitzdGF0aWMgdm9pZAorYWhjX3JlaW5pdGlhbGl6ZV9kYXRhcHRycyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0CSBzY2IgKnNjYjsKKwlzdHJ1Y3QJIGFoY19kbWFfc2VnICpzZzsKKwl1X2ludAkgc2NiX2luZGV4OworCXVpbnQzMl90IHNncHRyOworCXVpbnQzMl90IHJlc2lkOworCXVpbnQzMl90IGRhdGFwdHI7CisKKwlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCXNncHRyID0gKGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfU0dQVFIgKyAzKSA8PCAyNCkKKwkgICAgICB8IChhaGNfaW5iKGFoYywgU0NCX1JFU0lEVUFMX1NHUFRSICsgMikgPDwgMTYpCisJICAgICAgfCAoYWhjX2luYihhaGMsIFNDQl9SRVNJRFVBTF9TR1BUUiArIDEpIDw8IDgpCisJICAgICAgfAlhaGNfaW5iKGFoYywgU0NCX1JFU0lEVUFMX1NHUFRSKTsKKworCXNncHRyICY9IFNHX1BUUl9NQVNLOworCXNnID0gYWhjX3NnX2J1c190b192aXJ0KHNjYiwgc2dwdHIpOworCisJLyogVGhlIHJlc2lkdWFsIHNnX3B0ciBhbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IHNnICovCisJc2ctLTsKKworCXJlc2lkID0gKGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDIpIDw8IDE2KQorCSAgICAgIHwgKGFoY19pbmIoYWhjLCBTQ0JfUkVTSURVQUxfREFUQUNOVCArIDEpIDw8IDgpCisJICAgICAgfCBhaGNfaW5iKGFoYywgU0NCX1JFU0lEVUFMX0RBVEFDTlQpOworCisJZGF0YXB0ciA9IGFoY19sZTMydG9oKHNnLT5hZGRyKQorCQkrIChhaGNfbGUzMnRvaChzZy0+bGVuKSAmIEFIQ19TR19MRU5fTUFTSykKKwkJLSByZXNpZDsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQl1X2ludCBkc2NvbW1hbmQxOworCisJCWRzY29tbWFuZDEgPSBhaGNfaW5iKGFoYywgRFNDT01NQU5EMSk7CisJCWFoY19vdXRiKGFoYywgRFNDT01NQU5EMSwgZHNjb21tYW5kMSB8IEhBRERMRFNFTDApOworCQlhaGNfb3V0YihhaGMsIEhBRERSLAorCQkJIChhaGNfbGUzMnRvaChzZy0+bGVuKSA+PiAyNCkgJiBTR19ISUdIX0FERFJfQklUUyk7CisJCWFoY19vdXRiKGFoYywgRFNDT01NQU5EMSwgZHNjb21tYW5kMSk7CisJfQorCWFoY19vdXRiKGFoYywgSEFERFIgKyAzLCBkYXRhcHRyID4+IDI0KTsKKwlhaGNfb3V0YihhaGMsIEhBRERSICsgMiwgZGF0YXB0ciA+PiAxNik7CisJYWhjX291dGIoYWhjLCBIQUREUiArIDEsIGRhdGFwdHIgPj4gOCk7CisJYWhjX291dGIoYWhjLCBIQUREUiwgZGF0YXB0cik7CisJYWhjX291dGIoYWhjLCBIQ05UICsgMiwgcmVzaWQgPj4gMTYpOworCWFoY19vdXRiKGFoYywgSENOVCArIDEsIHJlc2lkID4+IDgpOworCWFoY19vdXRiKGFoYywgSENOVCwgcmVzaWQpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJYWhjX291dGIoYWhjLCBTVENOVCArIDIsIHJlc2lkID4+IDE2KTsKKwkJYWhjX291dGIoYWhjLCBTVENOVCArIDEsIHJlc2lkID4+IDgpOworCQlhaGNfb3V0YihhaGMsIFNUQ05ULCByZXNpZCk7CisJfQorfQorCisvKgorICogSGFuZGxlIHRoZSBlZmZlY3RzIG9mIGlzc3VpbmcgYSBidXMgZGV2aWNlIHJlc2V0IG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkCithaGNfaGFuZGxlX2RldnJlc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgY2FtX3N0YXR1cyBzdGF0dXMsIGNoYXIgKm1lc3NhZ2UsIGludCB2ZXJib3NlX2xldmVsKQoreworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlKiB0c3RhdGU7CisJdV9pbnQgbHVuOworI2VuZGlmCisJaW50IGZvdW5kOworCisJZm91bmQgPSBhaGNfYWJvcnRfc2NicyhhaGMsIGRldmluZm8tPnRhcmdldCwgZGV2aW5mby0+Y2hhbm5lbCwKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBTQ0JfTElTVF9OVUxMLCBkZXZpbmZvLT5yb2xlLAorCQkJICAgICAgIHN0YXR1cyk7CisKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKwkvKgorCSAqIFNlbmQgYW4gaW1tZWRpYXRlIG5vdGlmeSBjY2IgdG8gYWxsIHRhcmdldCBtb3JkIHBlcmlwaGVyYWwKKwkgKiBkcml2ZXJzIGFmZmVjdGVkIGJ5IHRoaXMgYWN0aW9uLgorCSAqLworCXRzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2RldmluZm8tPm91cl9zY3NpaWRdOworCWlmICh0c3RhdGUgIT0gTlVMTCkgeworCQlmb3IgKGx1biA9IDA7IGx1biA8IEFIQ19OVU1fTFVOUzsgbHVuKyspIHsKKwkJCXN0cnVjdCBhaGNfdG1vZGVfbHN0YXRlKiBsc3RhdGU7CisKKwkJCWxzdGF0ZSA9IHRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl07CisJCQlpZiAobHN0YXRlID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWFoY19xdWV1ZV9sc3RhdGVfZXZlbnQoYWhjLCBsc3RhdGUsIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJCSAgICAgICBNU0dfQlVTX0RFVl9SRVNFVCwgLyphcmcqLzApOworCQkJYWhjX3NlbmRfbHN0YXRlX2V2ZW50cyhhaGMsIGxzdGF0ZSk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogR28gYmFjayB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIGFuZCByZW5lZ290aWF0ZS4KKwkgKi8KKwlhaGNfc2V0X3dpZHRoKGFoYywgZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJICAgICAgQUhDX1RSQU5TX0NVUiwgLypwYXVzZWQqL1RSVUUpOworCWFoY19zZXRfc3luY3JhdGUoYWhjLCBkZXZpbmZvLCAvKnN5bmNyYXRlKi9OVUxMLAorCQkJIC8qcGVyaW9kKi8wLCAvKm9mZnNldCovMCwgLypwcHJfb3B0aW9ucyovMCwKKwkJCSBBSENfVFJBTlNfQ1VSLCAvKnBhdXNlZCovVFJVRSk7CisJCisJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19TRU5UX0JEUiwgTlVMTCk7CisKKwlpZiAobWVzc2FnZSAhPSBOVUxMCisJICYmICh2ZXJib3NlX2xldmVsIDw9IGJvb3R2ZXJib3NlKSkKKwkJcHJpbnRmKCIlczogJXMgb24gJWM6JWQuICVkIFNDQnMgYWJvcnRlZFxuIiwgYWhjX25hbWUoYWhjKSwKKwkJICAgICAgIG1lc3NhZ2UsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwgZm91bmQpOworfQorCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCitzdGF0aWMgdm9pZAorYWhjX3NldHVwX3RhcmdldF9tc2dpbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJICAgICAgIHN0cnVjdCBzY2IgKnNjYikKK3sKKworCS8qICAgICAgICAgICAgICAKKwkgKiBUbyBmYWNpbGl0YXRlIGFkZGluZyBtdWx0aXBsZSBtZXNzYWdlcyB0b2dldGhlciwKKwkgKiBlYWNoIHJvdXRpbmUgc2hvdWxkIGluY3JlbWVudCB0aGUgaW5kZXggYW5kIGxlbgorCSAqIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHNldHRpbmcgdGhlbSBleHBsaWNpdGx5LgorCSAqLyAgICAgICAgICAgICAKKwlhaGMtPm1zZ291dF9pbmRleCA9IDA7CisJYWhjLT5tc2dvdXRfbGVuID0gMDsKKworCWlmIChzY2IgIT0gTlVMTCAmJiAoc2NiLT5mbGFncyAmIFNDQl9BVVRPX05FR09USUFURSkgIT0gMCkKKwkJYWhjX2J1aWxkX3RyYW5zZmVyX21zZyhhaGMsIGRldmluZm8pOworCWVsc2UKKwkJcGFuaWMoImFoY19pbnRyOiBBV0FJVElORyB0YXJnZXQgbWVzc2FnZSB3aXRoIG5vIG1lc3NhZ2UiKTsKKworCWFoYy0+bXNnb3V0X2luZGV4ID0gMDsKKwlhaGMtPm1zZ190eXBlID0gTVNHX1RZUEVfVEFSR0VUX01TR0lOOworfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFsbG9jYXRlIGEgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yIGEgbmV3IGRldmljZQorICogYW5kIHBlcmZvcm0gaW5pdGlhbCBpbml0aWFsaXppb24uCisgKi8KK3N0cnVjdCBhaGNfc29mdGMgKgorYWhjX2FsbG9jKHZvaWQgKnBsYXRmb3JtX2FyZywgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgIGFoY19zb2Z0YyAqYWhjOworCWludAlpOworCisjaWZuZGVmCV9fRnJlZUJTRF9fCisJYWhjID0gbWFsbG9jKHNpemVvZigqYWhjKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoIWFoYykgeworCQlwcmludGYoImFpYzd4eHg6IGNhbm5vdCBtYWxsb2Mgc29mdGMhXG4iKTsKKwkJZnJlZShuYW1lLCBNX0RFVkJVRik7CisJCXJldHVybiBOVUxMOworCX0KKyNlbHNlCisJYWhjID0gZGV2aWNlX2dldF9zb2Z0YygoZGV2aWNlX3QpcGxhdGZvcm1fYXJnKTsKKyNlbmRpZgorCW1lbXNldChhaGMsIDAsIHNpemVvZigqYWhjKSk7CisJYWhjLT5zZWVwX2NvbmZpZyA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2VlcF9jb25maWcpLAorCQkJCSAgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoYWhjLT5zZWVwX2NvbmZpZyA9PSBOVUxMKSB7CisjaWZuZGVmCV9fRnJlZUJTRF9fCisJCWZyZWUoYWhjLCBNX0RFVkJVRik7CisjZW5kaWYKKwkJZnJlZShuYW1lLCBNX0RFVkJVRik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCUxJU1RfSU5JVCgmYWhjLT5wZW5kaW5nX3NjYnMpOworCS8qIFdlIGRvbid0IGtub3cgb3VyIHVuaXQgbnVtYmVyIHVudGlsIHRoZSBPU00gc2V0cyBpdCAqLworCWFoYy0+bmFtZSA9IG5hbWU7CisJYWhjLT51bml0ID0gLTE7CisJYWhjLT5kZXNjcmlwdGlvbiA9IE5VTEw7CisJYWhjLT5jaGFubmVsID0gJ0EnOworCWFoYy0+Y2hhbm5lbF9iID0gJ0InOworCWFoYy0+Y2hpcCA9IEFIQ19OT05FOworCWFoYy0+ZmVhdHVyZXMgPSBBSENfRkVOT05FOworCWFoYy0+YnVncyA9IEFIQ19CVUdOT05FOworCWFoYy0+ZmxhZ3MgPSBBSENfRk5PTkU7CisJLyoKKwkgKiBEZWZhdWx0IHRvIGFsbCBlcnJvciByZXBvcnRpbmcgZW5hYmxlZCB3aXRoIHRoZQorCSAqIHNlcXVlbmNlciBvcGVyYXRpbmcgYXQgaXRzIGZhc3Rlc3Qgc3BlZWQuCisJICogVGhlIGJ1cyBhdHRhY2ggY29kZSBtYXkgbW9kaWZ5IHRoaXMuCisJICovCisJYWhjLT5zZXFjdGwgPSBGQVNUTU9ERTsKKworCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykKKwkJVEFJTFFfSU5JVCgmYWhjLT51bnRhZ2dlZF9xdWV1ZXNbaV0pOworCWlmIChhaGNfcGxhdGZvcm1fYWxsb2MoYWhjLCBwbGF0Zm9ybV9hcmcpICE9IDApIHsKKwkJYWhjX2ZyZWUoYWhjKTsKKwkJYWhjID0gTlVMTDsKKwl9CisJcmV0dXJuIChhaGMpOworfQorCitpbnQKK2FoY19zb2Z0Y19pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCS8qIFRoZSBJUlFNUyBiaXQgaXMgb25seSB2YWxpZCBvbiBWTCBhbmQgRUlTQSBjaGlwcyAqLworCWlmICgoYWhjLT5jaGlwICYgQUhDX1BDSSkgPT0gMCkKKwkJYWhjLT51bnBhdXNlID0gYWhjX2luYihhaGMsIEhDTlRSTCkgJiBJUlFNUzsKKwllbHNlCisJCWFoYy0+dW5wYXVzZSA9IDA7CisJYWhjLT5wYXVzZSA9IGFoYy0+dW5wYXVzZSB8IFBBVVNFOyAKKwkvKiBYWFggVGhlIHNoYXJlZCBzY2IgZGF0YSBzdHVmZiBzaG91bGQgYmUgZGVwcmVjYXRlZCAqLworCWlmIChhaGMtPnNjYl9kYXRhID09IE5VTEwpIHsKKwkJYWhjLT5zY2JfZGF0YSA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2NiX2RhdGEpLAorCQkJCSAgICAgICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQlpZiAoYWhjLT5zY2JfZGF0YSA9PSBOVUxMKQorCQkJcmV0dXJuIChFTk9NRU0pOworCQltZW1zZXQoYWhjLT5zY2JfZGF0YSwgMCwgc2l6ZW9mKCphaGMtPnNjYl9kYXRhKSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhjX3NvZnRjX2luc2VydChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqbGlzdF9haGM7CisKKyNpZiBBSENfUENJX0NPTkZJRyA+IDAKKwkvKgorCSAqIFNlY29uZCBGdW5jdGlvbiBQQ0kgZGV2aWNlcyBuZWVkIHRvIGluaGVyaXQgc29tZQorCSAqIHNldHRpbmdzIGZyb20gZnVuY3Rpb24gMC4KKwkgKi8KKwlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19CVVNfTUFTSykgPT0gQUhDX1BDSQorCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9GVU5DKSAhPSAwKSB7CisJCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisJCQlhaGNfZGV2X3NvZnRjX3QgbGlzdF9wY2k7CisJCQlhaGNfZGV2X3NvZnRjX3QgcGNpOworCisJCQlsaXN0X3BjaSA9IGxpc3RfYWhjLT5kZXZfc29mdGM7CisJCQlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwkJCWlmIChhaGNfZ2V0X3BjaV9zbG90KGxpc3RfcGNpKSA9PSBhaGNfZ2V0X3BjaV9zbG90KHBjaSkKKwkJCSAmJiBhaGNfZ2V0X3BjaV9idXMobGlzdF9wY2kpID09IGFoY19nZXRfcGNpX2J1cyhwY2kpKSB7CisJCQkJc3RydWN0IGFoY19zb2Z0YyAqbWFzdGVyOworCQkJCXN0cnVjdCBhaGNfc29mdGMgKnNsYXZlOworCisJCQkJaWYgKGFoY19nZXRfcGNpX2Z1bmN0aW9uKGxpc3RfcGNpKSA9PSAwKSB7CisJCQkJCW1hc3RlciA9IGxpc3RfYWhjOworCQkJCQlzbGF2ZSA9IGFoYzsKKwkJCQl9IGVsc2UgeworCQkJCQltYXN0ZXIgPSBhaGM7CisJCQkJCXNsYXZlID0gbGlzdF9haGM7CisJCQkJfQorCQkJCXNsYXZlLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsgCisJCQkJc2xhdmUtPmZsYWdzIHw9CisJCQkJICAgIG1hc3Rlci0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEOworCQkJCXNsYXZlLT5mbGFncyAmPSB+QUhDX1BSSU1BUllfQ0hBTk5FTDsgCisJCQkJc2xhdmUtPmZsYWdzIHw9CisJCQkJICAgIG1hc3Rlci0+ZmxhZ3MgJiBBSENfUFJJTUFSWV9DSEFOTkVMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIEluc2VydGlvbiBzb3J0IGludG8gb3VyIGxpc3Qgb2Ygc29mdGNzLgorCSAqLworCWxpc3RfYWhjID0gVEFJTFFfRklSU1QoJmFoY190YWlscSk7CisJd2hpbGUgKGxpc3RfYWhjICE9IE5VTEwKKwkgICAgJiYgYWhjX3NvZnRjX2NvbXAoYWhjLCBsaXN0X2FoYykgPD0gMCkKKwkJbGlzdF9haGMgPSBUQUlMUV9ORVhUKGxpc3RfYWhjLCBsaW5rcyk7CisJaWYgKGxpc3RfYWhjICE9IE5VTEwpCisJCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdF9haGMsIGFoYywgbGlua3MpOworCWVsc2UKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoY190YWlscSwgYWhjLCBsaW5rcyk7CisJYWhjLT5pbml0X2xldmVsKys7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhhdCB0aGUgcGFzc2VkIGluIHNvZnRjIHBvaW50ZXIgaXMgZm9yIGEKKyAqIGNvbnRyb2xsZXIgdGhhdCBpcyBzdGlsbCBjb25maWd1cmVkLgorICovCitzdHJ1Y3QgYWhjX3NvZnRjICoKK2FoY19maW5kX3NvZnRjKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICpsaXN0X2FoYzsKKworCVRBSUxRX0ZPUkVBQ0gobGlzdF9haGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChsaXN0X2FoYyA9PSBhaGMpCisJCQlyZXR1cm4gKGFoYyk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3ZvaWQKK2FoY19zZXRfdW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB1bml0KQoreworCWFoYy0+dW5pdCA9IHVuaXQ7Cit9CisKK3ZvaWQKK2FoY19zZXRfbmFtZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgKm5hbWUpCit7CisJaWYgKGFoYy0+bmFtZSAhPSBOVUxMKQorCQlmcmVlKGFoYy0+bmFtZSwgTV9ERVZCVUYpOworCWFoYy0+bmFtZSA9IG5hbWU7Cit9CisKK3ZvaWQKK2FoY19mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoYWhjLT5pbml0X2xldmVsKSB7CisJZGVmYXVsdDoKKwljYXNlIDU6CisJCWFoY19zaHV0ZG93bihhaGMpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgNDoKKwkJYWhjX2RtYW1hcF91bmxvYWQoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJICBhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAzOgorCQlhaGNfZG1hbWVtX2ZyZWUoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+cW91dGZpZm8sCisJCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQlhaGNfZG1hbWFwX2Rlc3Ryb3koYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJICAgYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXApOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMjoKKwkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIGFoYy0+c2hhcmVkX2RhdGFfZG1hdCk7CisJY2FzZSAxOgorI2lmbmRlZiBfX2xpbnV4X18KKwkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIGFoYy0+YnVmZmVyX2RtYXQpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJfQorCisjaWZuZGVmIF9fbGludXhfXworCWFoY19kbWFfdGFnX2Rlc3Ryb3koYWhjLCBhaGMtPnBhcmVudF9kbWF0KTsKKyNlbmRpZgorCWFoY19wbGF0Zm9ybV9mcmVlKGFoYyk7CisJYWhjX2Zpbmlfc2NiZGF0YShhaGMpOworCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykgeworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCisJCXRzdGF0ZSA9IGFoYy0+ZW5hYmxlZF90YXJnZXRzW2ldOworCQlpZiAodHN0YXRlICE9IE5VTEwpIHsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKwkJCWludCBqOworCisJCQlmb3IgKGogPSAwOyBqIDwgQUhDX05VTV9MVU5TOyBqKyspIHsKKwkJCQlzdHJ1Y3QgYWhjX3Rtb2RlX2xzdGF0ZSAqbHN0YXRlOworCisJCQkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbal07CisJCQkJaWYgKGxzdGF0ZSAhPSBOVUxMKSB7CisJCQkJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJCQkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCWZyZWUodHN0YXRlLCBNX0RFVkJVRik7CisJCX0KKwl9CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJaWYgKGFoYy0+YmxhY2tfaG9sZSAhPSBOVUxMKSB7CisJCXhwdF9mcmVlX3BhdGgoYWhjLT5ibGFja19ob2xlLT5wYXRoKTsKKwkJZnJlZShhaGMtPmJsYWNrX2hvbGUsIE1fREVWQlVGKTsKKwl9CisjZW5kaWYKKwlpZiAoYWhjLT5uYW1lICE9IE5VTEwpCisJCWZyZWUoYWhjLT5uYW1lLCBNX0RFVkJVRik7CisJaWYgKGFoYy0+c2VlcF9jb25maWcgIT0gTlVMTCkKKwkJZnJlZShhaGMtPnNlZXBfY29uZmlnLCBNX0RFVkJVRik7CisjaWZuZGVmIF9fRnJlZUJTRF9fCisJZnJlZShhaGMsIE1fREVWQlVGKTsKKyNlbmRpZgorCXJldHVybjsKK30KKwordm9pZAorYWhjX3NodXRkb3duKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CisJaW50CWk7CisKKwlhaGMgPSAoc3RydWN0IGFoY19zb2Z0YyAqKWFyZzsKKworCS8qIFRoaXMgd2lsbCByZXNldCBtb3N0IHJlZ2lzdGVycyB0byAwLCBidXQgbm90IGFsbCAqLworCWFoY19yZXNldChhaGMsIC8qcmVpbml0Ki9GQUxTRSk7CisJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCAwKTsKKwlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCAwKTsKKwlhaGNfb3V0YihhaGMsIERTUENJU1RBVFVTLCAwKTsKKworCWZvciAoaSA9IFRBUkdfU0NTSVJBVEU7IGkgPCBTQ1NJQ09ORjsgaSsrKQorCQlhaGNfb3V0YihhaGMsIGksIDApOworfQorCisvKgorICogUmVzZXQgdGhlIGNvbnRyb2xsZXIgYW5kIHJlY29yZCBzb21lIGluZm9ybWF0aW9uIGFib3V0IGl0CisgKiB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIGp1c3QgYWZ0ZXIgYSByZXNldC4gIElmICJyZWluaXQiIGlzCisgKiBub24temVybywgdGhpcyByZXNldCBvY2N1cmVkIGFmdGVyIGluaXRpYWwgY29uZmlndXJhdGlvbgorICogYW5kIHRoZSBjYWxsZXIgcmVxdWVzdHMgdGhhdCB0aGUgY2hpcCBiZSBmdWxseSByZWluaXRpYWxpemVkCisgKiB0byBhIHJ1bmFibGUgc3RhdGUuICBDaGlwIGludGVycnVwdHMgYXJlICpub3QqIGVuYWJsZWQgYWZ0ZXIKKyAqIGEgcmVpbml0aWFsaXphdGlvbi4gIFRoZSBjYWxsZXIgbXVzdCBlbmFibGUgaW50ZXJydXB0cyB2aWEKKyAqIGFoY19pbnRyX2VuYWJsZSgpLgorICovCitpbnQKK2FoY19yZXNldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCByZWluaXQpCit7CisJdV9pbnQJc2Jsa2N0bDsKKwl1X2ludAlzeGZyY3RsMV9hLCBzeGZyY3RsMV9iOworCWludAllcnJvcjsKKwlpbnQJd2FpdDsKKwkKKwkvKgorCSAqIFByZXNlcnZlIHRoZSB2YWx1ZSBvZiB0aGUgU1hGUkNUTDEgcmVnaXN0ZXIgZm9yIGFsbCBjaGFubmVscy4KKwkgKiBJdCBjb250YWlucyBzZXR0aW5ncyB0aGF0IGFmZmVjdCB0ZXJtaW5hdGlvbiBhbmQgd2UgZG9uJ3Qgd2FudAorCSAqIHRvIGRpc3R1cmIgdGhlIGludGVncml0eSBvZiB0aGUgYnVzLgorCSAqLworCWFoY19wYXVzZShhaGMpOworCWlmICgoYWhjX2luYihhaGMsIEhDTlRSTCkgJiBDSElQUlNUKSAhPSAwKSB7CisJCS8qCisJCSAqIFRoZSBjaGlwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBzaW5jZQorCQkgKiBQQ0kvRUlTQS9WTEIgYnVzIHJlc2V0LiAgRG9uJ3QgdHJ1c3QKKwkJICogImxlZnQgb3ZlciBCSU9TIGRhdGEiLgorCQkgKi8KKwkJYWhjLT5mbGFncyB8PSBBSENfTk9fQklPU19JTklUOworCX0KKwlzeGZyY3RsMV9iID0gMDsKKwlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzApIHsKKwkJdV9pbnQgc2Jsa2N0bDsKKworCQkvKgorCQkgKiBTYXZlIGNoYW5uZWwgQidzIHNldHRpbmdzIGluIGNhc2UgdGhpcyBjaGlwCisJCSAqIGlzIHNldHVwIGZvciBUV0lOIGNoYW5uZWwgb3BlcmF0aW9uLgorCQkgKi8KKwkJc2Jsa2N0bCA9IGFoY19pbmIoYWhjLCBTQkxLQ1RMKTsKKwkJYWhjX291dGIoYWhjLCBTQkxLQ1RMLCBzYmxrY3RsIHwgU0VMQlVTQik7CisJCXN4ZnJjdGwxX2IgPSBhaGNfaW5iKGFoYywgU1hGUkNUTDEpOworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIHNibGtjdGwgJiB+U0VMQlVTQik7CisJfQorCXN4ZnJjdGwxX2EgPSBhaGNfaW5iKGFoYywgU1hGUkNUTDEpOworCisJYWhjX291dGIoYWhjLCBIQ05UUkwsIENISVBSU1QgfCBhaGMtPnBhdXNlKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIHJlc2V0IGhhcyBmaW5pc2hlZC4gIFdlIGRlbGF5IDEwMDB1cworCSAqIHByaW9yIHRvIHJlYWRpbmcgdGhlIHJlZ2lzdGVyIHRvIG1ha2Ugc3VyZSB0aGUgY2hpcAorCSAqIGhhcyBzdWZmaWNpZW50bHkgY29tcGxldGVkIGl0cyByZXNldCB0byBoYW5kbGUgcmVnaXN0ZXIKKwkgKiBhY2Nlc3Nlcy4KKwkgKi8KKwl3YWl0ID0gMTAwMDsKKwlkbyB7CisJCWFoY19kZWxheSgxMDAwKTsKKwl9IHdoaWxlICgtLXdhaXQgJiYgIShhaGNfaW5iKGFoYywgSENOVFJMKSAmIENISVBSU1RBQ0spKTsKKworCWlmICh3YWl0ID09IDApIHsKKwkJcHJpbnRmKCIlczogV0FSTklORyAtIEZhaWxlZCBjaGlwIHJlc2V0ISAgIgorCQkgICAgICAgIlRyeWluZyB0byBpbml0aWFsaXplIGFueXdheS5cbiIsIGFoY19uYW1lKGFoYykpOworCX0KKwlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT5wYXVzZSk7CisKKwkvKiBEZXRlcm1pbmUgY2hhbm5lbCBjb25maWd1cmF0aW9uICovCisJc2Jsa2N0bCA9IGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIChTRUxCVVNCfFNFTFdJREUpOworCS8qIE5vIFR3aW4gQ2hhbm5lbCBQQ0kgY2FyZHMgKi8KKwlpZiAoKGFoYy0+Y2hpcCAmIEFIQ19QQ0kpICE9IDApCisJCXNibGtjdGwgJj0gflNFTEJVU0I7CisJc3dpdGNoIChzYmxrY3RsKSB7CisJY2FzZSAwOgorCQkvKiBTaW5nbGUgTmFycm93IENoYW5uZWwgKi8KKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBXaWRlIENoYW5uZWwgKi8KKwkJYWhjLT5mZWF0dXJlcyB8PSBBSENfV0lERTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQkvKiBUd2luIENoYW5uZWwgKi8KKwkJYWhjLT5mZWF0dXJlcyB8PSBBSENfVFdJTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgVW5zdXBwb3J0ZWQgYWRhcHRlciB0eXBlLiAgSWdub3JpbmdcbiIpOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qCisJICogUmVsb2FkIHN4ZnJjdGwxLgorCSAqCisJICogV2UgbXVzdCBhbHdheXMgaW5pdGlhbGl6ZSBTVFBXRU4gdG8gMSBiZWZvcmUgd2UKKwkgKiByZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZXMuICBTVFBXRU4gaXMgaW5pdGlhbGl6ZWQKKwkgKiB0byBhIHRyaS1zdGF0ZSBjb25kaXRpb24gd2hpY2ggY2FuIG9ubHkgYmUgY2xlYXJlZAorCSAqIGJ5IHR1cm5pbmcgaXQgb24uCisJICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJdV9pbnQgc2Jsa2N0bDsKKworCQlzYmxrY3RsID0gYWhjX2luYihhaGMsIFNCTEtDVEwpOworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIHNibGtjdGwgfCBTRUxCVVNCKTsKKwkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgc3hmcmN0bDFfYik7CisJCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgc2Jsa2N0bCAmIH5TRUxCVVNCKTsKKwl9CisJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgc3hmcmN0bDFfYSk7CisKKwllcnJvciA9IDA7CisJaWYgKHJlaW5pdCAhPSAwKQorCQkvKgorCQkgKiBJZiBhIHJlY292ZXJ5IGFjdGlvbiBoYXMgZm9yY2VkIGEgY2hpcCByZXNldCwKKwkJICogcmUtaW5pdGlhbGl6ZSB0aGUgY2hpcCB0byBvdXIgbGlraW5nLgorCQkgKi8KKwkJZXJyb3IgPSBhaGMtPmJ1c19jaGlwX2luaXQoYWhjKTsKKyNpZmRlZiBBSENfRFVNUF9TRVEKKwllbHNlIAorCQlhaGNfZHVtcHNlcShhaGMpOworI2VuZGlmCisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIFNDQnMgYXZhaWxhYmxlIG9uIHRoZSBjb250cm9sbGVyCisgKi8KK2ludAorYWhjX3Byb2JlX3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKSB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUhDX1NDQl9NQVg7IGkrKykgeworCisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBpKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfQkFTRSwgaSk7CisJCWlmIChhaGNfaW5iKGFoYywgU0NCX0JBU0UpICE9IGkpCisJCQlicmVhazsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIDApOworCQlpZiAoYWhjX2luYihhaGMsIFNDQl9CQVNFKSAhPSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoaSk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfZG1hbWFwX2NiKHZvaWQgKmFyZywgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2VnLCBpbnQgZXJyb3IpIAoreworCWRtYV9hZGRyX3QgKmJhZGRyOworCisJYmFkZHIgPSAoZG1hX2FkZHJfdCAqKWFyZzsKKwkqYmFkZHIgPSBzZWdzLT5kc19hZGRyOworfQorCitzdGF0aWMgdm9pZAorYWhjX2J1aWxkX2ZyZWVfc2NiX2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBzY2JzaXplOworCWludCBpOworCisJc2Nic2l6ZSA9IDMyOworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19MU0NCU19FTkFCTEVEKSAhPSAwKQorCQlzY2JzaXplID0gNjQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnM7IGkrKykgeworCQlpbnQgajsKKworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgaSk7CisKKwkJLyoKKwkJICogVG91Y2ggYWxsIFNDQiBieXRlcyB0byBhdm9pZCBwYXJpdHkgZXJyb3JzCisJCSAqIHNob3VsZCBvbmUgb2Ygb3VyIGRlYnVnZ2luZyByb3V0aW5lcyByZWFkCisJCSAqIGFuIG90aGVyd2lzZSB1bmluaXRpYXRsaXplZCBieXRlLgorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IHNjYnNpemU7IGorKykKKwkJCWFoY19vdXRiKGFoYywgU0NCX0JBU0UraiwgMHhGRik7CisKKwkJLyogQ2xlYXIgdGhlIGNvbnRyb2wgYnl0ZS4gKi8KKwkJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwgMCk7CisKKwkJLyogU2V0IHRoZSBuZXh0IHBvaW50ZXIgKi8KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKQorCQkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgaSsxKTsKKwkJZWxzZSAKKwkJCWFoY19vdXRiKGFoYywgU0NCX05FWFQsIFNDQl9MSVNUX05VTEwpOworCisJCS8qIE1ha2UgdGhlIHRhZyBudW1iZXIsIFNDU0lJRCwgYW5kIGx1biBpbnZhbGlkICovCisJCWFoY19vdXRiKGFoYywgU0NCX1RBRywgU0NCX0xJU1RfTlVMTCk7CisJCWFoY19vdXRiKGFoYywgU0NCX1NDU0lJRCwgMHhGRik7CisJCWFoY19vdXRiKGFoYywgU0NCX0xVTiwgMHhGRik7CisJfQorCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCS8qIFNDQiAwIGhlYWRzIHRoZSBmcmVlIGxpc3QuICovCisJCWFoY19vdXRiKGFoYywgRlJFRV9TQ0JILCAwKTsKKwl9IGVsc2UgeworCQkvKiBObyBmcmVlIGxpc3QuICovCisJCWFoY19vdXRiKGFoYywgRlJFRV9TQ0JILCBTQ0JfTElTVF9OVUxMKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbGFzdCBTQ0IgdGVybWluYXRlcyB0aGUgZnJlZSBsaXN0ICovCisJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGktMSk7CisJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgU0NCX0xJU1RfTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19pbml0X3NjYmRhdGEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CisKKwlzY2JfZGF0YSA9IGFoYy0+c2NiX2RhdGE7CisJU0xJU1RfSU5JVCgmc2NiX2RhdGEtPmZyZWVfc2Nicyk7CisJU0xJU1RfSU5JVCgmc2NiX2RhdGEtPnNnX21hcHMpOworCisJLyogQWxsb2NhdGUgU0NCIHJlc291cmNlcyAqLworCXNjYl9kYXRhLT5zY2JhcnJheSA9CisJICAgIChzdHJ1Y3Qgc2NiICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NiKSAqIEFIQ19TQ0JfTUFYX0FMTE9DLAorCQkJCSBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChzY2JfZGF0YS0+c2NiYXJyYXkgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCW1lbXNldChzY2JfZGF0YS0+c2NiYXJyYXksIDAsIHNpemVvZihzdHJ1Y3Qgc2NiKSAqIEFIQ19TQ0JfTUFYX0FMTE9DKTsKKworCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGhhcmR3YXJlIFNDQnMgYW5kIGluaXRpYWxpemUgdGhlbSAqLworCisJc2NiX2RhdGEtPm1heGhzY2JzID0gYWhjX3Byb2JlX3NjYnMoYWhjKTsKKwlpZiAoYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMgPT0gMCkgeworCQlwcmludGYoIiVzOiBObyBTQ0Igc3BhY2UgZm91bmRcbiIsIGFoY19uYW1lKGFoYykpOworCQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBvdXIgRE1BIHRhZ3MuICBUaGVzZSB0YWdzIGRlZmluZSB0aGUga2luZHMgb2YgZGV2aWNlCisJICogYWNjZXNzaWJsZSBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIG1lbW9yeSBtYXBwaW5ncyB3ZSB3aWxsCisJICogbmVlZCB0byBwZXJmb3JtIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLgorCSAqCisJICogVW5sZXNzIHdlIG5lZWQgdG8gZnVydGhlciByZXN0cmljdCB0aGUgYWxsb2NhdGlvbiwgd2UgcmVseQorCSAqIG9uIHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIHBhcmVudCBkbWF0LCBoZW5jZSB0aGUgY29tbW9uCisJICogdXNlIG9mIE1BWEFERFIgYW5kIE1BWFNJWkUuCisJICovCisKKwkvKiBETUEgdGFnIGZvciBvdXIgaGFyZHdhcmUgc2NiIHN0cnVjdHVyZXMgKi8KKwlpZiAoYWhjX2RtYV90YWdfY3JlYXRlKGFoYywgYWhjLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzEsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIEFIQ19TQ0JfTUFYX0FMTE9DICogc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpLAorCQkJICAgICAgIC8qbnNlZ21lbnRzKi8xLAorCQkJICAgICAgIC8qbWF4c2Vnc3oqL0JVU19TUEFDRV9NQVhTSVpFXzMyQklULAorCQkJICAgICAgIC8qZmxhZ3MqLzAsICZzY2JfZGF0YS0+aHNjYl9kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogQWxsb2NhdGlvbiBmb3Igb3VyIGhzY2JzICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBzY2JfZGF0YS0+aHNjYl9kbWF0LAorCQkJICAgICAodm9pZCAqKikmc2NiX2RhdGEtPmhzY2JzLAorCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJnNjYl9kYXRhLT5oc2NiX2RtYW1hcCkgIT0gMCkgeworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJc2NiX2RhdGEtPmluaXRfbGV2ZWwrKzsKKworCS8qIEFuZCBwZXJtYW5lbnRseSBtYXAgdGhlbSAqLworCWFoY19kbWFtYXBfbG9hZChhaGMsIHNjYl9kYXRhLT5oc2NiX2RtYXQsIHNjYl9kYXRhLT5oc2NiX2RtYW1hcCwKKwkJCXNjYl9kYXRhLT5oc2NicywKKwkJCUFIQ19TQ0JfTUFYX0FMTE9DICogc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpLAorCQkJYWhjX2RtYW1hcF9jYiwgJnNjYl9kYXRhLT5oc2NiX2J1c2FkZHIsIC8qZmxhZ3MqLzApOworCisJc2NiX2RhdGEtPmluaXRfbGV2ZWwrKzsKKworCS8qIERNQSB0YWcgZm9yIG91ciBzZW5zZSBidWZmZXJzICovCisJaWYgKGFoY19kbWFfdGFnX2NyZWF0ZShhaGMsIGFoYy0+cGFyZW50X2RtYXQsIC8qYWxpZ25tZW50Ki8xLAorCQkJICAgICAgIC8qYm91bmRhcnkqL0JVU19TUEFDRV9NQVhBRERSXzMyQklUICsgMSwKKwkJCSAgICAgICAvKmxvd2FkZHIqL0JVU19TUEFDRV9NQVhBRERSXzMyQklULAorCQkJICAgICAgIC8qaGlnaGFkZHIqL0JVU19TUEFDRV9NQVhBRERSLAorCQkJICAgICAgIC8qZmlsdGVyKi9OVUxMLCAvKmZpbHRlcmFyZyovTlVMTCwKKwkJCSAgICAgICBBSENfU0NCX01BWF9BTExPQyAqIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSwKKwkJCSAgICAgICAvKm5zZWdtZW50cyovMSwKKwkJCSAgICAgICAvKm1heHNlZ3N6Ki9CVVNfU1BBQ0VfTUFYU0laRV8zMkJJVCwKKwkJCSAgICAgICAvKmZsYWdzKi8wLCAmc2NiX2RhdGEtPnNlbnNlX2RtYXQpICE9IDApIHsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCXNjYl9kYXRhLT5pbml0X2xldmVsKys7CisKKwkvKiBBbGxvY2F0ZSB0aGVtICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwKKwkJCSAgICAgKHZvaWQgKiopJnNjYl9kYXRhLT5zZW5zZSwKKwkJCSAgICAgQlVTX0RNQV9OT1dBSVQsICZzY2JfZGF0YS0+c2Vuc2VfZG1hbWFwKSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogQW5kIHBlcm1hbmVudGx5IG1hcCB0aGVtICovCisJYWhjX2RtYW1hcF9sb2FkKGFoYywgc2NiX2RhdGEtPnNlbnNlX2RtYXQsIHNjYl9kYXRhLT5zZW5zZV9kbWFtYXAsCisJCQlzY2JfZGF0YS0+c2Vuc2UsCisJCQlBSENfU0NCX01BWF9BTExPQyAqIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSwKKwkJCWFoY19kbWFtYXBfY2IsICZzY2JfZGF0YS0+c2Vuc2VfYnVzYWRkciwgLypmbGFncyovMCk7CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogRE1BIHRhZyBmb3Igb3VyIFMvRyBzdHJ1Y3R1cmVzLiAgV2UgYWxsb2NhdGUgaW4gcGFnZSBzaXplZCBjaHVua3MgKi8KKwlpZiAoYWhjX2RtYV90YWdfY3JlYXRlKGFoYywgYWhjLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzgsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIFBBR0VfU0laRSwgLypuc2VnbWVudHMqLzEsCisJCQkgICAgICAgLyptYXhzZWdzeiovQlVTX1NQQUNFX01BWFNJWkVfMzJCSVQsCisJCQkgICAgICAgLypmbGFncyovMCwgJnNjYl9kYXRhLT5zZ19kbWF0KSAhPSAwKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKwlzY2JfZGF0YS0+aW5pdF9sZXZlbCsrOworCisJLyogUGVyZm9ybSBpbml0aWFsIENDQiBhbGxvY2F0aW9uICovCisJbWVtc2V0KHNjYl9kYXRhLT5oc2NicywgMCwKKwkgICAgICAgQUhDX1NDQl9NQVhfQUxMT0MgKiBzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikpOworCWFoY19hbGxvY19zY2JzKGFoYyk7CisKKwlpZiAoc2NiX2RhdGEtPm51bXNjYnMgPT0gMCkgeworCQlwcmludGYoIiVzOiBhaGNfaW5pdF9zY2JkYXRhIC0gIgorCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbml0aWFsIHNjYnNcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCS8qCisJICogUmVzZXJ2ZSB0aGUgbmV4dCBxdWV1ZWQgU0NCLgorCSAqLworCWFoYy0+bmV4dF9xdWV1ZWRfc2NiID0gYWhjX2dldF9zY2IoYWhjKTsKKworCS8qCisJICogTm90ZSB0aGF0IHdlIHdlcmUgc3VjY2Vzc2Z1bGwKKwkgKi8KKwlyZXR1cm4gKDApOyAKKworZXJyb3JfZXhpdDoKKworCXJldHVybiAoRU5PTUVNKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19maW5pX3NjYmRhdGEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2JfZGF0YSAqc2NiX2RhdGE7CisKKwlzY2JfZGF0YSA9IGFoYy0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc2NiX2RhdGEtPmluaXRfbGV2ZWwpIHsKKwlkZWZhdWx0OgorCWNhc2UgNzoKKwl7CisJCXN0cnVjdCBzZ19tYXBfbm9kZSAqc2dfbWFwOworCisJCXdoaWxlICgoc2dfbWFwID0gU0xJU1RfRklSU1QoJnNjYl9kYXRhLT5zZ19tYXBzKSkhPSBOVUxMKSB7CisJCQlTTElTVF9SRU1PVkVfSEVBRCgmc2NiX2RhdGEtPnNnX21hcHMsIGxpbmtzKTsKKwkJCWFoY19kbWFtYXBfdW5sb2FkKGFoYywgc2NiX2RhdGEtPnNnX2RtYXQsCisJCQkJCSAgc2dfbWFwLT5zZ19kbWFtYXApOworCQkJYWhjX2RtYW1lbV9mcmVlKGFoYywgc2NiX2RhdGEtPnNnX2RtYXQsCisJCQkJCXNnX21hcC0+c2dfdmFkZHIsCisJCQkJCXNnX21hcC0+c2dfZG1hbWFwKTsKKwkJCWZyZWUoc2dfbWFwLCBNX0RFVkJVRik7CisJCX0KKwkJYWhjX2RtYV90YWdfZGVzdHJveShhaGMsIHNjYl9kYXRhLT5zZ19kbWF0KTsKKwl9CisJY2FzZSA2OgorCQlhaGNfZG1hbWFwX3VubG9hZChhaGMsIHNjYl9kYXRhLT5zZW5zZV9kbWF0LAorCQkJCSAgc2NiX2RhdGEtPnNlbnNlX2RtYW1hcCk7CisJY2FzZSA1OgorCQlhaGNfZG1hbWVtX2ZyZWUoYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwgc2NiX2RhdGEtPnNlbnNlLAorCQkJCXNjYl9kYXRhLT5zZW5zZV9kbWFtYXApOworCQlhaGNfZG1hbWFwX2Rlc3Ryb3koYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCwKKwkJCQkgICBzY2JfZGF0YS0+c2Vuc2VfZG1hbWFwKTsKKwljYXNlIDQ6CisJCWFoY19kbWFfdGFnX2Rlc3Ryb3koYWhjLCBzY2JfZGF0YS0+c2Vuc2VfZG1hdCk7CisJY2FzZSAzOgorCQlhaGNfZG1hbWFwX3VubG9hZChhaGMsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJICBzY2JfZGF0YS0+aHNjYl9kbWFtYXApOworCWNhc2UgMjoKKwkJYWhjX2RtYW1lbV9mcmVlKGFoYywgc2NiX2RhdGEtPmhzY2JfZG1hdCwgc2NiX2RhdGEtPmhzY2JzLAorCQkJCXNjYl9kYXRhLT5oc2NiX2RtYW1hcCk7CisJCWFoY19kbWFtYXBfZGVzdHJveShhaGMsIHNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQkJICAgc2NiX2RhdGEtPmhzY2JfZG1hbWFwKTsKKwljYXNlIDE6CisJCWFoY19kbWFfdGFnX2Rlc3Ryb3koYWhjLCBzY2JfZGF0YS0+aHNjYl9kbWF0KTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlicmVhazsKKwl9CisJaWYgKHNjYl9kYXRhLT5zY2JhcnJheSAhPSBOVUxMKQorCQlmcmVlKHNjYl9kYXRhLT5zY2JhcnJheSwgTV9ERVZCVUYpOworfQorCit2b2lkCithaGNfYWxsb2Nfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IHNjYl9kYXRhICpzY2JfZGF0YTsKKwlzdHJ1Y3Qgc2NiICpuZXh0X3NjYjsKKwlzdHJ1Y3Qgc2dfbWFwX25vZGUgKnNnX21hcDsKKwlkbWFfYWRkcl90IHBoeXNhZGRyOworCXN0cnVjdCBhaGNfZG1hX3NlZyAqc2VnczsKKwlpbnQgbmV3Y291bnQ7CisJaW50IGk7CisKKwlzY2JfZGF0YSA9IGFoYy0+c2NiX2RhdGE7CisJaWYgKHNjYl9kYXRhLT5udW1zY2JzID49IEFIQ19TQ0JfTUFYX0FMTE9DKQorCQkvKiBDYW4ndCBhbGxvY2F0ZSBhbnkgbW9yZSAqLworCQlyZXR1cm47CisKKwluZXh0X3NjYiA9ICZzY2JfZGF0YS0+c2NiYXJyYXlbc2NiX2RhdGEtPm51bXNjYnNdOworCisJc2dfbWFwID0gbWFsbG9jKHNpemVvZigqc2dfbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKworCWlmIChzZ19tYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogQWxsb2NhdGUgUy9HIHNwYWNlIGZvciB0aGUgbmV4dCBiYXRjaCBvZiBTQ0JTICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBzY2JfZGF0YS0+c2dfZG1hdCwKKwkJCSAgICAgKHZvaWQgKiopJnNnX21hcC0+c2dfdmFkZHIsCisJCQkgICAgIEJVU19ETUFfTk9XQUlULCAmc2dfbWFwLT5zZ19kbWFtYXApICE9IDApIHsKKwkJZnJlZShzZ19tYXAsIE1fREVWQlVGKTsKKwkJcmV0dXJuOworCX0KKworCVNMSVNUX0lOU0VSVF9IRUFEKCZzY2JfZGF0YS0+c2dfbWFwcywgc2dfbWFwLCBsaW5rcyk7CisKKwlhaGNfZG1hbWFwX2xvYWQoYWhjLCBzY2JfZGF0YS0+c2dfZG1hdCwgc2dfbWFwLT5zZ19kbWFtYXAsCisJCQlzZ19tYXAtPnNnX3ZhZGRyLCBQQUdFX1NJWkUsIGFoY19kbWFtYXBfY2IsCisJCQkmc2dfbWFwLT5zZ19waHlzYWRkciwgLypmbGFncyovMCk7CisKKwlzZWdzID0gc2dfbWFwLT5zZ192YWRkcjsKKwlwaHlzYWRkciA9IHNnX21hcC0+c2dfcGh5c2FkZHI7CisKKwluZXdjb3VudCA9IChQQUdFX1NJWkUgLyAoQUhDX05TRUcgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSkpOworCW5ld2NvdW50ID0gTUlOKG5ld2NvdW50LCAoQUhDX1NDQl9NQVhfQUxMT0MgLSBzY2JfZGF0YS0+bnVtc2NicykpOworCWZvciAoaSA9IDA7IGkgPCBuZXdjb3VudDsgaSsrKSB7CisJCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisjaWZuZGVmIF9fbGludXhfXworCQlpbnQgZXJyb3I7CisjZW5kaWYKKwkJcGRhdGEgPSAoc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICopbWFsbG9jKHNpemVvZigqcGRhdGEpLAorCQkJCQkJCSAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChwZGF0YSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCW5leHRfc2NiLT5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCW5leHRfc2NiLT5zZ19tYXAgPSBzZ19tYXA7CisJCW5leHRfc2NiLT5zZ19saXN0ID0gc2VnczsKKwkJLyoKKwkJICogVGhlIHNlcXVlbmNlciBhbHdheXMgc3RhcnRzIHdpdGggdGhlIHNlY29uZCBlbnRyeS4KKwkJICogVGhlIGZpcnN0IGVudHJ5IGlzIGVtYmVkZGVkIGluIHRoZSBzY2IuCisJCSAqLworCQluZXh0X3NjYi0+c2dfbGlzdF9waHlzID0gcGh5c2FkZHIgKyBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKTsKKwkJbmV4dF9zY2ItPmFoY19zb2Z0YyA9IGFoYzsKKwkJbmV4dF9zY2ItPmZsYWdzID0gU0NCX0ZSRUU7CisjaWZuZGVmIF9fbGludXhfXworCQllcnJvciA9IGFoY19kbWFtYXBfY3JlYXRlKGFoYywgYWhjLT5idWZmZXJfZG1hdCwgLypmbGFncyovMCwKKwkJCQkJICAmbmV4dF9zY2ItPmRtYW1hcCk7CisJCWlmIChlcnJvciAhPSAwKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJbmV4dF9zY2ItPmhzY2IgPSAmc2NiX2RhdGEtPmhzY2JzW3NjYl9kYXRhLT5udW1zY2JzXTsKKwkJbmV4dF9zY2ItPmhzY2ItPnRhZyA9IGFoYy0+c2NiX2RhdGEtPm51bXNjYnM7CisJCVNMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMsCisJCQkJICBuZXh0X3NjYiwgbGlua3Muc2xlKTsKKwkJc2VncyArPSBBSENfTlNFRzsKKwkJcGh5c2FkZHIgKz0gKEFIQ19OU0VHICogc2l6ZW9mKHN0cnVjdCBhaGNfZG1hX3NlZykpOworCQluZXh0X3NjYisrOworCQlhaGMtPnNjYl9kYXRhLT5udW1zY2JzKys7CisJfQorfQorCit2b2lkCithaGNfY29udHJvbGxlcl9pbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgY2hhciAqYnVmKQoreworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzOiAiLCBhaGNfY2hpcF9uYW1lc1thaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0tdKTsKKwlidWYgKz0gbGVuOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKQorIAkJbGVuID0gc3ByaW50ZihidWYsICJUd2luIENoYW5uZWwsIEEgU0NTSSBJZD0lZCwgIgorCQkJICAgICAgIkIgU0NTSSBJZD0lZCwgcHJpbWFyeSAlYywgIiwKKwkJCSAgICAgIGFoYy0+b3VyX2lkLCBhaGMtPm91cl9pZF9iLAorCQkJICAgICAgKGFoYy0+ZmxhZ3MgJiBBSENfUFJJTUFSWV9DSEFOTkVMKSArICdBJyk7CisJZWxzZSB7CisJCWNvbnN0IGNoYXIgKnNwZWVkOworCQljb25zdCBjaGFyICp0eXBlOworCisJCXNwZWVkID0gIiI7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgeworCQkJc3BlZWQgPSAiVWx0cmEgIjsKKwkJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkgeworCQkJc3BlZWQgPSAiVWx0cmExNjAgIjsKKwkJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJCXNwZWVkID0gIlVsdHJhMiAiOworCQl9CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJCQl0eXBlID0gIldpZGUiOworCQl9IGVsc2UgeworCQkJdHlwZSA9ICJTaW5nbGUiOworCQl9CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXMlcyBDaGFubmVsICVjLCBTQ1NJIElkPSVkLCAiLAorCQkJICAgICAgc3BlZWQsIHR5cGUsIGFoYy0+Y2hhbm5lbCwgYWhjLT5vdXJfaWQpOworCX0KKwlidWYgKz0gbGVuOworCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKQorCQlzcHJpbnRmKGJ1ZiwgIiVkLyVkIFNDQnMiLAorCQkJYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMsIEFIQ19NQVhfUVVFVUUpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICIlZCBTQ0JzIiwgYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMpOworfQorCitpbnQKK2FoY19jaGlwX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludAkgdGVybTsKKwlpbnQJIGVycm9yOworCXVfaW50CSBpOworCXVfaW50CSBzY3NpX2NvbmY7CisJdV9pbnQJIHNjc2lzZXFfdGVtcGxhdGU7CisJdWludDMyX3QgcGh5c2FkZHI7CisKKwlhaGNfb3V0YihhaGMsIFNFUV9GTEFHUywgMCk7CisJYWhjX291dGIoYWhjLCBTRVFfRkxBR1MyLCAwKTsKKworCS8qIFNldCB0aGUgU0NTSSBJZCwgU1hGUkNUTDAsIFNYRlJDVEwxLCBhbmQgU0lNT0RFMSwgZm9yIGJvdGggY2hhbm5lbHMqLworCWlmIChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pIHsKKworCQkvKgorCQkgKiBTZXR1cCBDaGFubmVsIEIgZmlyc3QuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIGFoY19pbmIoYWhjLCBTQkxLQ1RMKSB8IFNFTEJVU0IpOworCQl0ZXJtID0gKGFoYy0+ZmxhZ3MgJiBBSENfVEVSTV9FTkJfQikgIT0gMCA/IFNUUFdFTiA6IDA7CisJCWFoY19vdXRiKGFoYywgU0NTSUlELCBhaGMtPm91cl9pZF9iKTsKKwkJc2NzaV9jb25mID0gYWhjX2luYihhaGMsIFNDU0lDT05GICsgMSk7CisJCWFoY19vdXRiKGFoYywgU1hGUkNUTDEsIChzY3NpX2NvbmYgJiAoRU5TUENIS3xTVElNRVNFTCkpCisJCQkJCXx0ZXJtfGFoYy0+c2VsdGltZV9ifEVOU1RJTUVSfEFDVE5FR0VOKTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgYWhjX2luYihhaGMsIFNJTU9ERTApfEVOSU9FUlIpOworCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIEVOU0VMVElNT3xFTlNDU0lSU1R8RU5TQ1NJUEVSUik7CisJCWFoY19vdXRiKGFoYywgU1hGUkNUTDAsIERGT058U1BJT0VOKTsKKworCQkvKiBTZWxlY3QgQ2hhbm5lbCBBICovCisJCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgYWhjX2luYihhaGMsIFNCTEtDVEwpICYgflNFTEJVU0IpOworCX0KKwl0ZXJtID0gKGFoYy0+ZmxhZ3MgJiBBSENfVEVSTV9FTkJfQSkgIT0gMCA/IFNUUFdFTiA6IDA7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJYWhjX291dGIoYWhjLCBTQ1NJSURfVUxUUkEyLCBhaGMtPm91cl9pZCk7CisJZWxzZQorCQlhaGNfb3V0YihhaGMsIFNDU0lJRCwgYWhjLT5vdXJfaWQpOworCXNjc2lfY29uZiA9IGFoY19pbmIoYWhjLCBTQ1NJQ09ORik7CisJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgKHNjc2lfY29uZiAmIChFTlNQQ0hLfFNUSU1FU0VMKSkKKwkJCQl8dGVybXxhaGMtPnNlbHRpbWUKKwkJCQl8RU5TVElNRVJ8QUNUTkVHRU4pOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCWFoY19vdXRiKGFoYywgU0lNT0RFMCwgYWhjX2luYihhaGMsIFNJTU9ERTApfEVOSU9FUlIpOworCWFoY19vdXRiKGFoYywgU0lNT0RFMSwgRU5TRUxUSU1PfEVOU0NTSVJTVHxFTlNDU0lQRVJSKTsKKwlhaGNfb3V0YihhaGMsIFNYRlJDVEwwLCBERk9OfFNQSU9FTik7CisKKwkvKiBUaGVyZSBhcmUgbm8gdW50YWdnZWQgU0NCcyBhY3RpdmUgeWV0LiAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWFoY191bmJ1c3lfdGNsKGFoYywgQlVJTERfVENMKGkgPDwgNCwgMCkpOworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgIT0gMCkgeworCQkJaW50IGx1bjsKKworCQkJLyoKKwkJCSAqIFRoZSBTQ0IgYmFzZWQgQlRUIGFsbG93cyBhbiBlbnRyeSBwZXIKKwkJCSAqIHRhcmdldCBhbmQgbHVuIHBhaXIuCisJCQkgKi8KKwkJCWZvciAobHVuID0gMTsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykKKwkJCQlhaGNfdW5idXN5X3RjbChhaGMsIEJVSUxEX1RDTChpIDw8IDQsIGx1bikpOworCQl9CisJfQorCisJLyogQWxsIG9mIG91ciBxdWV1ZXMgYXJlIGVtcHR5ICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlhaGMtPnFvdXRmaWZvW2ldID0gU0NCX0xJU1RfTlVMTDsKKwlhaGNfc3luY19xb3V0ZmlmbyhhaGMsIEJVU19ETUFTWU5DX1BSRVJFQUQpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlhaGMtPnFpbmZpZm9baV0gPSBTQ0JfTElTVF9OVUxMOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCkgeworCQlhaGNfb3V0YihhaGMsIFRBUkdJRCwgMCk7CisJCWFoY19vdXRiKGFoYywgVEFSR0lEICsgMSwgMCk7CisJfQorCisJLyoKKwkgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgd2hlcmUgaXQgY2FuIGZpbmQgb3VyIGFycmF5cyBpbiBtZW1vcnkuCisJICovCisJcGh5c2FkZHIgPSBhaGMtPnNjYl9kYXRhLT5oc2NiX2J1c2FkZHI7CisJYWhjX291dGIoYWhjLCBIU0NCX0FERFIsIHBoeXNhZGRyICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBIU0NCX0FERFIgKyAxLCAocGh5c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIEhTQ0JfQUREUiArIDIsIChwaHlzYWRkciA+PiAxNikgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIEhTQ0JfQUREUiArIDMsIChwaHlzYWRkciA+PiAyNCkgJiAweEZGKTsKKworCXBoeXNhZGRyID0gYWhjLT5zaGFyZWRfZGF0YV9idXNhZGRyOworCWFoY19vdXRiKGFoYywgU0hBUkVEX0RBVEFfQUREUiwgcGh5c2FkZHIgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIFNIQVJFRF9EQVRBX0FERFIgKyAxLCAocGh5c2FkZHIgPj4gOCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIFNIQVJFRF9EQVRBX0FERFIgKyAyLCAocGh5c2FkZHIgPj4gMTYpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBTSEFSRURfREFUQV9BRERSICsgMywgKHBoeXNhZGRyID4+IDI0KSAmIDB4RkYpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBncm91cCBjb2RlIHRvIGNvbW1hbmQgbGVuZ3RoIHRhYmxlLgorCSAqIFRoaXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZXMgaW4gVEFSR19TQ1NJUkFURSwgc28gb25seQorCSAqIHNldHVwIHRoZSB0YWJsZSBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCB0aGF0IGluZm9ybWF0aW9uLgorCSAqLworCWFoY19vdXRiKGFoYywgQ01EU0laRV9UQUJMRSwgNSk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgMSwgOSk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgMiwgOSk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgMywgMCk7CisJYWhjX291dGIoYWhjLCBDTURTSVpFX1RBQkxFICsgNCwgMTUpOworCWFoY19vdXRiKGFoYywgQ01EU0laRV9UQUJMRSArIDUsIDExKTsKKwlhaGNfb3V0YihhaGMsIENNRFNJWkVfVEFCTEUgKyA2LCAwKTsKKwlhaGNfb3V0YihhaGMsIENNRFNJWkVfVEFCTEUgKyA3LCAwKTsKKwkJCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0hTX01BSUxCT1gpICE9IDApCisJCWFoY19vdXRiKGFoYywgSFNfTUFJTEJPWCwgMCk7CisKKwkvKiBUZWxsIHRoZSBzZXF1ZW5jZXIgb2Ygb3VyIGluaXRpYWwgcXVldWUgcG9zaXRpb25zICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RBUkdFVE1PREUpICE9IDApIHsKKwkJYWhjLT50cWluZmlmb25leHQgPSAxOworCQlhaGNfb3V0YihhaGMsIEtFUk5FTF9UUUlOUE9TLCBhaGMtPnRxaW5maWZvbmV4dCAtIDEpOworCQlhaGNfb3V0YihhaGMsIFRRSU5QT1MsIGFoYy0+dHFpbmZpZm9uZXh0KTsKKwl9CisJYWhjLT5xaW5maWZvbmV4dCA9IDA7CisJYWhjLT5xb3V0Zmlmb25leHQgPSAwOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgUU9GRl9DVExTVEEsIFNDQl9RU0laRV8yNTYpOworCQlhaGNfb3V0YihhaGMsIEhOU0NCX1FPRkYsIGFoYy0+cWluZmlmb25leHQpOworCQlhaGNfb3V0YihhaGMsIFNOU0NCX1FPRkYsIGFoYy0+cWluZmlmb25leHQpOworCQlhaGNfb3V0YihhaGMsIFNEU0NCX1FPRkYsIDApOworCX0gZWxzZSB7CisJCWFoY19vdXRiKGFoYywgS0VSTkVMX1FJTlBPUywgYWhjLT5xaW5maWZvbmV4dCk7CisJCWFoY19vdXRiKGFoYywgUUlOUE9TLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwkJYWhjX291dGIoYWhjLCBRT1VUUE9TLCBhaGMtPnFvdXRmaWZvbmV4dCk7CisJfQorCisJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgd2FpdGluZyBzZWxlY3Rpb25zICovCisJYWhjX291dGIoYWhjLCBXQUlUSU5HX1NDQkgsIFNDQl9MSVNUX05VTEwpOworCisJLyogT3VyIGRpc2Nvbm5lY3Rpb24gbGlzdCBpcyBlbXB0eSB0b28gKi8KKwlhaGNfb3V0YihhaGMsIERJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTElTVF9OVUxMKTsKKworCS8qIE1lc3NhZ2Ugb3V0IGJ1ZmZlciBzdGFydHMgZW1wdHkgKi8KKwlhaGNfb3V0YihhaGMsIE1TR19PVVQsIE1TR19OT09QKTsKKworCS8qCisJICogU2V0dXAgdGhlIGFsbG93ZWQgU0NTSSBTZXF1ZW5jZXMgYmFzZWQgb24gb3BlcmF0aW9uYWwgbW9kZS4KKwkgKiBJZiB3ZSBhcmUgYSB0YXJnZXQsIHdlJ2xsIGVuYWxiZSBzZWxlY3QgaW4gb3BlcmF0aW9ucyBvbmNlCisJICogd2UndmUgaGFkIGEgbHVuIGVuYWJsZWQuCisJICovCisJc2NzaXNlcV90ZW1wbGF0ZSA9IEVOU0VMT3xFTkFVVE9BVE5PfEVOQVVUT0FUTlA7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOSVRJQVRPUlJPTEUpICE9IDApCisJCXNjc2lzZXFfdGVtcGxhdGUgfD0gRU5SU0VMSTsKKwlhaGNfb3V0YihhaGMsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXFfdGVtcGxhdGUpOworCisJLyogSW5pdGlhbGl6ZSBvdXIgbGlzdCBvZiBmcmVlIFNDQnMuICovCisJYWhjX2J1aWxkX2ZyZWVfc2NiX2xpc3QoYWhjKTsKKworCS8qCisJICogVGVsbCB0aGUgc2VxdWVuY2VyIHdoaWNoIFNDQiB3aWxsIGJlIHRoZSBuZXh0IG9uZSBpdCByZWNlaXZlcy4KKwkgKi8KKwlhaGNfb3V0YihhaGMsIE5FWFRfUVVFVUVEX1NDQiwgYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2ItPnRhZyk7CisKKwkvKgorCSAqIExvYWQgdGhlIFNlcXVlbmNlciBwcm9ncmFtIGFuZCBFbmFibGUgdGhlIGFkYXB0ZXIKKwkgKiBpbiAiZmFzdCIgbW9kZS4KKwkgKi8KKwlpZiAoYm9vdHZlcmJvc2UpCisJCXByaW50ZigiJXM6IERvd25sb2FkaW5nIFNlcXVlbmNlciBQcm9ncmFtLi4uIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYykpOworCisJZXJyb3IgPSBhaGNfbG9hZHNlcShhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJaW50IHdhaXQ7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgdXAgdG8gNTAwbXMgZm9yIG91ciB0cmFuc2NlaXZlcnMKKwkJICogdG8gc2V0dGxlLiAgSWYgdGhlIGFkYXB0ZXIgZG9lcyBub3QgaGF2ZQorCQkgKiBhIGNhYmxlIGF0dGFjaGVkLCB0aGUgdHJhbnNjZWl2ZXJzIG1heQorCQkgKiBuZXZlciBzZXR0bGUsIHNvIGRvbid0IGNvbXBsYWluIGlmIHdlCisJCSAqIGZhaWwgaGVyZS4KKwkJICovCisJCWZvciAod2FpdCA9IDUwMDA7CisJCSAgICAgKGFoY19pbmIoYWhjLCBTQkxLQ1RMKSAmIChFTkFCNDB8RU5BQjIwKSkgPT0gMCAmJiB3YWl0OworCQkgICAgIHdhaXQtLSkKKwkJCWFoY19kZWxheSgxMDApOworCX0KKwlhaGNfcmVzdGFydChhaGMpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgYm9hcmQsIHJlYWR5IGZvciBub3JtYWwgb3BlcmF0aW9uCisgKi8KK2ludAorYWhjX2luaXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludAkgbWF4X3Rhcmc7CisJdV9pbnQJIGk7CisJdV9pbnQJIHNjc2lfY29uZjsKKwl1X2ludAkgdWx0cmFlbmI7CisJdV9pbnQJIGRpc2NlbmFibGU7CisJdV9pbnQJIHRhZ2VuYWJsZTsKKwlzaXplX3QJIGRyaXZlcl9kYXRhX3NpemU7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19ERUJVR19TRVFVRU5DRVIpICE9IDApCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX1NFUVVFTkNFUl9ERUJVRzsKKyNlbmRpZgorCisjaWZkZWYgQUhDX1BSSU5UX1NSQU0KKwlwcmludGYoIlNjcmF0Y2ggUmFtOiIpOworCWZvciAoaSA9IDB4MjA7IGkgPCAweDVmOyBpKyspIHsKKwkJaWYgKCgoaSAlIDgpID09IDApICYmIChpICE9IDApKSB7CisJCQlwcmludGYgKCJcbiAgICAgICAgICAgICAgIik7CisJCX0KKwkJcHJpbnRmICgiIDB4JXgiLCBhaGNfaW5iKGFoYywgaSkpOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTU9SRV9TUkFNKSAhPSAwKSB7CisJCWZvciAoaSA9IDB4NzA7IGkgPCAweDdmOyBpKyspIHsKKwkJCWlmICgoKGkgJSA4KSA9PSAwKSAmJiAoaSAhPSAwKSkgeworCQkJCXByaW50ZiAoIlxuICAgICAgICAgICAgICAiKTsKKwkJCX0KKwkJCXByaW50ZiAoIiAweCV4IiwgYWhjX2luYihhaGMsIGkpKTsKKwkJfQorCX0KKwlwcmludGYgKCJcbiIpOworCS8qCisJICogUmVhZGluZyB1bmluaXRpYWxpemVkIHNjcmF0Y2ggcmFtIG1heQorCSAqIGdlbmVyYXRlIHBhcml0eSBlcnJvcnMuCisJICovCisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CisjZW5kaWYKKwltYXhfdGFyZyA9IDE1OworCisJLyoKKwkgKiBBc3N1bWUgd2UgaGF2ZSBhIGJvYXJkIGF0IHRoaXMgc3RhZ2UgYW5kIGl0IGhhcyBiZWVuIHJlc2V0LgorCSAqLworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19VU0VERUZBVUxUUykgIT0gMCkKKwkJYWhjLT5vdXJfaWQgPSBhaGMtPm91cl9pZF9iID0gNzsKKwkKKwkvKgorCSAqIERlZmF1bHQgdG8gYWxsb3dpbmcgaW5pdGlhdG9yIG9wZXJhdGlvbnMuCisJICovCisJYWhjLT5mbGFncyB8PSBBSENfSU5JVElBVE9SUk9MRTsKKworCS8qCisJICogT25seSBhbGxvdyB0YXJnZXQgbW9kZSBmZWF0dXJlcyBpZiB0aGlzIHVuaXQgaGFzIHRoZW0gZW5hYmxlZC4KKwkgKi8KKwlpZiAoKEFIQ19UTU9ERV9FTkFCTEUgJiAoMHgxIDw8IGFoYy0+dW5pdCkpID09IDApCisJCWFoYy0+ZmVhdHVyZXMgJj0gfkFIQ19UQVJHRVRNT0RFOworCisjaWZuZGVmIF9fbGludXhfXworCS8qIERNQSB0YWcgZm9yIG1hcHBpbmcgYnVmZmVycyBpbnRvIGRldmljZSB2aXNpYmxlIHNwYWNlLiAqLworCWlmIChhaGNfZG1hX3RhZ19jcmVhdGUoYWhjLCBhaGMtPnBhcmVudF9kbWF0LCAvKmFsaWdubWVudCovMSwKKwkJCSAgICAgICAvKmJvdW5kYXJ5Ki9CVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCArIDEsCisJCQkgICAgICAgLypsb3dhZGRyKi9haGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcKKwkJCQkJPyAoZG1hX2FkZHJfdCkweDdGRkZGRkZGRkZVTEwKKwkJCQkJOiBCVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwKKwkJCSAgICAgICAvKmhpZ2hhZGRyKi9CVVNfU1BBQ0VfTUFYQUREUiwKKwkJCSAgICAgICAvKmZpbHRlciovTlVMTCwgLypmaWx0ZXJhcmcqL05VTEwsCisJCQkgICAgICAgLyptYXhzaXplKi8oQUhDX05TRUcgLSAxKSAqIFBBR0VfU0laRSwKKwkJCSAgICAgICAvKm5zZWdtZW50cyovQUhDX05TRUcsCisJCQkgICAgICAgLyptYXhzZWdzeiovQUhDX01BWFRSQU5TRkVSX1NJWkUsCisJCQkgICAgICAgLypmbGFncyovQlVTX0RNQV9BTExPQ05PVywKKwkJCSAgICAgICAmYWhjLT5idWZmZXJfZG1hdCkgIT0gMCkgeworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorI2VuZGlmCisKKwlhaGMtPmluaXRfbGV2ZWwrKzsKKworCS8qCisJICogRE1BIHRhZyBmb3Igb3VyIGNvbW1hbmQgZmlmb3MgYW5kIG90aGVyIGRhdGEgaW4gc3lzdGVtIG1lbW9yeQorCSAqIHRoZSBjYXJkJ3Mgc2VxdWVuY2VyIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MuICBGb3IgaW5pdGlhdG9yCisJICogcm9sZXMsIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBxaW5maWZvIGFuZCBxb3V0Zmlmby4KKwkgKiBUaGUgcWluZmlmbyBhbmQgcW91dGZpZm8gYXJlIGNvbXBvc2VkIG9mIDI1NiAxIGJ5dGUgZWxlbWVudHMuIAorCSAqIFdoZW4gcHJvdmlkaW5nIGZvciB0aGUgdGFyZ2V0IG1vZGUgcm9sZSwgd2UgbXVzdCBhZGRpdGlvbmFsbHkKKwkgKiBwcm92aWRlIHNwYWNlIGZvciB0aGUgaW5jb21pbmcgdGFyZ2V0IGNvbW1hbmQgZmlmbyBhbmQgYW4gZXh0cmEKKwkgKiBieXRlIHRvIGRlYWwgd2l0aCBhIGRtYSBidWcgaW4gc29tZSBjaGlwIHZlcnNpb25zLgorCSAqLworCWRyaXZlcl9kYXRhX3NpemUgPSAyICogMjU2ICogc2l6ZW9mKHVpbnQ4X3QpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UQVJHRVRNT0RFKSAhPSAwKQorCQlkcml2ZXJfZGF0YV9zaXplICs9IEFIQ19UTU9ERV9DTURTICogc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKQorCQkJCSArIC8qRE1BIFdpZGVPZGQgQnVnIEJ1ZmZlciovMTsKKwlpZiAoYWhjX2RtYV90YWdfY3JlYXRlKGFoYywgYWhjLT5wYXJlbnRfZG1hdCwgLyphbGlnbm1lbnQqLzEsCisJCQkgICAgICAgLypib3VuZGFyeSovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQgKyAxLAorCQkJICAgICAgIC8qbG93YWRkciovQlVTX1NQQUNFX01BWEFERFJfMzJCSVQsCisJCQkgICAgICAgLypoaWdoYWRkciovQlVTX1NQQUNFX01BWEFERFIsCisJCQkgICAgICAgLypmaWx0ZXIqL05VTEwsIC8qZmlsdGVyYXJnKi9OVUxMLAorCQkJICAgICAgIGRyaXZlcl9kYXRhX3NpemUsCisJCQkgICAgICAgLypuc2VnbWVudHMqLzEsCisJCQkgICAgICAgLyptYXhzZWdzeiovQlVTX1NQQUNFX01BWFNJWkVfMzJCSVQsCisJCQkgICAgICAgLypmbGFncyovMCwgJmFoYy0+c2hhcmVkX2RhdGFfZG1hdCkgIT0gMCkgeworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJYWhjLT5pbml0X2xldmVsKys7CisKKwkvKiBBbGxvY2F0aW9uIG9mIGRyaXZlciBkYXRhICovCisJaWYgKGFoY19kbWFtZW1fYWxsb2MoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkgICAgICh2b2lkICoqKSZhaGMtPnFvdXRmaWZvLAorCQkJICAgICBCVVNfRE1BX05PV0FJVCwgJmFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwKSAhPSAwKSB7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9CisKKwlhaGMtPmluaXRfbGV2ZWwrKzsKKworCS8qIEFuZCBwZXJtYW5lbnRseSBtYXAgaXQgaW4gKi8KKwlhaGNfZG1hbWFwX2xvYWQoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJYWhjLT5xb3V0ZmlmbywgZHJpdmVyX2RhdGFfc2l6ZSwgYWhjX2RtYW1hcF9jYiwKKwkJCSZhaGMtPnNoYXJlZF9kYXRhX2J1c2FkZHIsIC8qZmxhZ3MqLzApOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RBUkdFVE1PREUpICE9IDApIHsKKwkJYWhjLT50YXJnZXRjbWRzID0gKHN0cnVjdCB0YXJnZXRfY21kICopYWhjLT5xb3V0ZmlmbzsKKwkJYWhjLT5xb3V0ZmlmbyA9ICh1aW50OF90ICopJmFoYy0+dGFyZ2V0Y21kc1tBSENfVE1PREVfQ01EU107CisJCWFoYy0+ZG1hX2J1Z19idWYgPSBhaGMtPnNoYXJlZF9kYXRhX2J1c2FkZHIKKwkJCQkgKyBkcml2ZXJfZGF0YV9zaXplIC0gMTsKKwkJLyogQWxsIHRhcmdldCBjb21tYW5kIGJsb2NrcyBzdGFydCBvdXQgaW52YWxpZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IEFIQ19UTU9ERV9DTURTOyBpKyspCisJCQlhaGMtPnRhcmdldGNtZHNbaV0uY21kX3ZhbGlkID0gMDsKKwkJYWhjX3N5bmNfdHFpbmZpZm8oYWhjLCBCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhjLT5xb3V0ZmlmbyA9ICh1aW50OF90ICopJmFoYy0+dGFyZ2V0Y21kc1syNTZdOworCX0KKwlhaGMtPnFpbmZpZm8gPSAmYWhjLT5xb3V0Zmlmb1syNTZdOworCisJYWhjLT5pbml0X2xldmVsKys7CisKKwkvKiBBbGxvY2F0ZSBTQ0IgZGF0YSBub3cgdGhhdCBidWZmZXJfZG1hdCBpcyBpbml0aWFsaXplZCAqLworCWlmIChhaGMtPnNjYl9kYXRhLT5tYXhoc2NicyA9PSAwKQorCQlpZiAoYWhjX2luaXRfc2NiZGF0YShhaGMpICE9IDApCisJCQlyZXR1cm4gKEVOT01FTSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgdHN0YXRlIHRvIGhvdXNlIGluZm9ybWF0aW9uIGZvciBvdXIKKwkgKiBpbml0aWF0b3IgcHJlc2VuY2Ugb24gdGhlIGJ1cyBhcyB3ZWxsIGFzIHRoZSB1c2VyCisJICogZGF0YSBmb3IgYW55IHRhcmdldCBtb2RlIGluaXRpYXRvci4KKwkgKi8KKwlpZiAoYWhjX2FsbG9jX3RzdGF0ZShhaGMsIGFoYy0+b3VyX2lkLCAnQScpID09IE5VTEwpIHsKKwkJcHJpbnRmKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGFoY190bW9kZV90c3RhdGUuICAiCisJCSAgICAgICAiRmFpbGluZyBhdHRhY2hcbiIsIGFoY19uYW1lKGFoYykpOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApIHsKKwkJaWYgKGFoY19hbGxvY190c3RhdGUoYWhjLCBhaGMtPm91cl9pZF9iLCAnQicpID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBhaGNfdG1vZGVfdHN0YXRlLiAgIgorCQkJICAgICAgICJGYWlsaW5nIGF0dGFjaFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKwl9CisKKwlpZiAoYWhjLT5zY2JfZGF0YS0+bWF4aHNjYnMgPCBBSENfU0NCX01BWF9BTExPQykgeworCQlhaGMtPmZsYWdzIHw9IEFIQ19QQUdFU0NCUzsKKwl9IGVsc2UgeworCQlhaGMtPmZsYWdzICY9IH5BSENfUEFHRVNDQlM7CisJfQorCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01JU0MpIHsKKwkJcHJpbnRmKCIlczogaGFyZHdhcmUgc2NiICV1IGJ5dGVzOyBrZXJuZWwgc2NiICV1IGJ5dGVzOyAiCisJCSAgICAgICAiYWhjX2RtYSAldSBieXRlc1xuIiwKKwkJCWFoY19uYW1lKGFoYyksCisJCQkodV9pbnQpc2l6ZW9mKHN0cnVjdCBoYXJkd2FyZV9zY2IpLAorCQkJKHVfaW50KXNpemVvZihzdHJ1Y3Qgc2NiKSwKKwkJCSh1X2ludClzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSk7CisJfQorI2VuZGlmIC8qIEFIQ19ERUJVRyAqLworCisJLyoKKwkgKiBMb29rIGF0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IGJvYXJkIGluaXRpYWxpemF0aW9uIG9yCisJICogdGhlIGJvYXJkIGJpb3MgaGFzIGxlZnQgdXMuCisJICovCisJaWYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgeworCQlzY3NpX2NvbmYgPSBhaGNfaW5iKGFoYywgU0NTSUNPTkYgKyAxKTsKKwkJaWYgKChzY3NpX2NvbmYgJiBSRVNFVF9TQ1NJKSAhPSAwCisJCSAmJiAoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwKQorCQkJYWhjLT5mbGFncyB8PSBBSENfUkVTRVRfQlVTX0I7CisJfQorCisJc2NzaV9jb25mID0gYWhjX2luYihhaGMsIFNDU0lDT05GKTsKKwlpZiAoKHNjc2lfY29uZiAmIFJFU0VUX1NDU0kpICE9IDAKKwkgJiYgKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkKKwkJYWhjLT5mbGFncyB8PSBBSENfUkVTRVRfQlVTX0E7CisKKwl1bHRyYWVuYiA9IDA7CQorCXRhZ2VuYWJsZSA9IEFMTF9UQVJHRVRTX01BU0s7CisKKwkvKiBHcmFiIHRoZSBkaXNjb25uZWN0aW9uIGRpc2FibGUgdGFibGUgYW5kIGludmVydCBpdCBmb3Igb3VyIG5lZWRzICovCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSAhPSAwKSB7CisJCXByaW50ZigiJXM6IEhvc3QgQWRhcHRlciBCaW9zIGRpc2FibGVkLiAgVXNpbmcgZGVmYXVsdCBTQ1NJICIKKwkJCSJkZXZpY2UgcGFyYW1ldGVyc1xuIiwgYWhjX25hbWUoYWhjKSk7CisJCWFoYy0+ZmxhZ3MgfD0gQUhDX0VYVEVOREVEX1RSQU5TX0F8QUhDX0VYVEVOREVEX1RSQU5TX0J8CisJCQkgICAgICBBSENfVEVSTV9FTkJfQXxBSENfVEVSTV9FTkJfQjsKKwkJZGlzY2VuYWJsZSA9IEFMTF9UQVJHRVRTX01BU0s7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkKKwkJCXVsdHJhZW5iID0gQUxMX1RBUkdFVFNfTUFTSzsKKwl9IGVsc2UgeworCQlkaXNjZW5hYmxlID0gfigoYWhjX2luYihhaGMsIERJU0NfRFNCICsgMSkgPDwgOCkKKwkJCSAgIHwgYWhjX2luYihhaGMsIERJU0NfRFNCKSk7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIChBSENfVUxUUkF8QUhDX1VMVFJBMikpICE9IDApCisJCQl1bHRyYWVuYiA9IChhaGNfaW5iKGFoYywgVUxUUkFfRU5CICsgMSkgPDwgOCkKKwkJCQkgICAgICB8IGFoY19pbmIoYWhjLCBVTFRSQV9FTkIpOworCX0KKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIChBSENfV0lERXxBSENfVFdJTikpID09IDApCisJCW1heF90YXJnID0gNzsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4X3Rhcmc7IGkrKykgeworCQlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJCXN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJCXVfaW50IG91cl9pZDsKKwkJdV9pbnQgdGFyZ2V0X2lkOworCQljaGFyIGNoYW5uZWw7CisKKwkJY2hhbm5lbCA9ICdBJzsKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJCXRhcmdldF9pZCA9IGk7CisJCWlmIChpID4gNyAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCQljaGFubmVsID0gJ0InOworCQkJb3VyX2lkID0gYWhjLT5vdXJfaWRfYjsKKwkJCXRhcmdldF9pZCA9IGkgJSA4OworCQl9CisJCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGNoYW5uZWwsIG91cl9pZCwKKwkJCQkJICAgIHRhcmdldF9pZCwgJnRzdGF0ZSk7CisJCS8qIERlZmF1bHQgdG8gYXN5bmMgbmFycm93IGFjcm9zcyB0aGUgYm9hcmQgKi8KKwkJbWVtc2V0KHRpbmZvLCAwLCBzaXplb2YoKnRpbmZvKSk7CisJCWlmIChhaGMtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSB7CisJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkKKwkJCQl0aW5mby0+dXNlci53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworCisJCQkvKgorCQkJICogVGhlc2Ugd2lsbCBiZSB0cnVuY2F0ZWQgd2hlbiB3ZSBkZXRlcm1pbmUgdGhlCisJCQkgKiBjb25uZWN0aW9uIHR5cGUgd2UgaGF2ZSB3aXRoIHRoZSB0YXJnZXQuCisJCQkgKi8KKwkJCXRpbmZvLT51c2VyLnBlcmlvZCA9IGFoY19zeW5jcmF0ZXMtPnBlcmlvZDsKKwkJCXRpbmZvLT51c2VyLm9mZnNldCA9IE1BWF9PRkZTRVQ7CisJCX0gZWxzZSB7CisJCQl1X2ludCBzY3NpcmF0ZTsKKwkJCXVpbnQxNl90IG1hc2s7CisKKwkJCS8qIFRha2UgdGhlIHNldHRpbmdzIGxlZnRvdmVyIGluIHNjcmF0Y2ggUkFNLiAqLworCQkJc2NzaXJhdGUgPSBhaGNfaW5iKGFoYywgVEFSR19TQ1NJUkFURSArIGkpOworCQkJbWFzayA9ICgweDAxIDw8IGkpOworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJCXVfaW50IG9mZnNldDsKKwkJCQl1X2ludCBtYXhzeW5jOworCisJCQkJaWYgKChzY3NpcmF0ZSAmIFNPRlMpID09IDB4MEYpIHsKKwkJCQkJLyoKKwkJCQkJICogSGF2ZW4ndCBuZWdvdGlhdGVkIHlldCwKKwkJCQkJICogc28gdGhlIGZvcm1hdCBpcyBkaWZmZXJlbnQuCisJCQkJCSAqLworCQkJCQlzY3NpcmF0ZSA9IChzY3NpcmF0ZSAmIFNYRlIpID4+IDQKKwkJCQkJCSB8ICh1bHRyYWVuYiAmIG1hc2spCisJCQkJCQkgID8gMHgwOCA6IDB4MAorCQkJCQkJIHwgKHNjc2lyYXRlICYgV0lERVhGRVIpOworCQkJCQlvZmZzZXQgPSBNQVhfT0ZGU0VUX1VMVFJBMjsKKwkJCQl9IGVsc2UKKwkJCQkJb2Zmc2V0ID0gYWhjX2luYihhaGMsIFRBUkdfT0ZGU0VUICsgaSk7CisJCQkJaWYgKChzY3NpcmF0ZSAmIH5XSURFWEZFUikgPT0gMCAmJiBvZmZzZXQgIT0gMCkKKwkJCQkJLyogU2V0IHRvIHRoZSBsb3dlc3Qgc3luYyByYXRlLCA1TUh6ICovCisJCQkJCXNjc2lyYXRlIHw9IDB4MWM7CisJCQkJbWF4c3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTI7CisJCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQkJCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX0RUOworCQkJCXRpbmZvLT51c2VyLnBlcmlvZCA9CisJCQkJICAgIGFoY19maW5kX3BlcmlvZChhaGMsIHNjc2lyYXRlLCBtYXhzeW5jKTsKKwkJCQlpZiAob2Zmc2V0ID09IDApCisJCQkJCXRpbmZvLT51c2VyLnBlcmlvZCA9IDA7CisJCQkJZWxzZQorCQkJCQl0aW5mby0+dXNlci5vZmZzZXQgPSBNQVhfT0ZGU0VUOworCQkJCWlmICgoc2NzaXJhdGUgJiBTWEZSX1VMVFJBMikgPD0gOC8qMTBNSHoqLworCQkJCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkKKwkJCQkJdGluZm8tPnVzZXIucHByX29wdGlvbnMgPQorCQkJCQkgICAgTVNHX0VYVF9QUFJfRFRfUkVROworCQkJfSBlbHNlIGlmICgoc2NzaXJhdGUgJiBTT0ZTKSAhPSAwKSB7CisJCQkJaWYgKChzY3NpcmF0ZSAmIFNYRlIpID09IDB4NDAKKwkJCQkgJiYgKHVsdHJhZW5iICYgbWFzaykgIT0gMCkgeworCQkJCQkvKiBUcmVhdCAxME1IeiBhcyBhIG5vbi11bHRyYSBzcGVlZCAqLworCQkJCQlzY3NpcmF0ZSAmPSB+U1hGUjsKKwkJCQkgCXVsdHJhZW5iICY9IH5tYXNrOworCQkJCX0KKwkJCQl0aW5mby0+dXNlci5wZXJpb2QgPSAKKwkJCQkgICAgYWhjX2ZpbmRfcGVyaW9kKGFoYywgc2NzaXJhdGUsCisJCQkJCQkgICAgKHVsdHJhZW5iICYgbWFzaykKKwkJCQkJCSAgID8gQUhDX1NZTkNSQVRFX1VMVFJBCisJCQkJCQkgICA6IEFIQ19TWU5DUkFURV9GQVNUKTsKKwkJCQlpZiAodGluZm8tPnVzZXIucGVyaW9kICE9IDApCisJCQkJCXRpbmZvLT51c2VyLm9mZnNldCA9IE1BWF9PRkZTRVQ7CisJCQl9CisJCQlpZiAodGluZm8tPnVzZXIucGVyaW9kID09IDApCisJCQkJdGluZm8tPnVzZXIub2Zmc2V0ID0gMDsKKwkJCWlmICgoc2NzaXJhdGUgJiBXSURFWEZFUikgIT0gMAorCQkJICYmIChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApCisJCQkJdGluZm8tPnVzZXIud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKwkJCXRpbmZvLT51c2VyLnByb3RvY29sX3ZlcnNpb24gPSA0OworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQkJCXRpbmZvLT51c2VyLnRyYW5zcG9ydF92ZXJzaW9uID0gMzsKKwkJCWVsc2UKKwkJCQl0aW5mby0+dXNlci50cmFuc3BvcnRfdmVyc2lvbiA9IDI7CisJCQl0aW5mby0+Z29hbC5wcm90b2NvbF92ZXJzaW9uID0gMjsKKwkJCXRpbmZvLT5nb2FsLnRyYW5zcG9ydF92ZXJzaW9uID0gMjsKKwkJCXRpbmZvLT5jdXJyLnByb3RvY29sX3ZlcnNpb24gPSAyOworCQkJdGluZm8tPmN1cnIudHJhbnNwb3J0X3ZlcnNpb24gPSAyOworCQl9CisJCXRzdGF0ZS0+dWx0cmFlbmIgPSAwOworCX0KKwlhaGMtPnVzZXJfZGlzY2VuYWJsZSA9IGRpc2NlbmFibGU7CisJYWhjLT51c2VyX3RhZ2VuYWJsZSA9IHRhZ2VuYWJsZTsKKworCXJldHVybiAoYWhjLT5idXNfY2hpcF9pbml0KGFoYykpOworfQorCit2b2lkCithaGNfaW50cl9lbmFibGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgZW5hYmxlKQoreworCXVfaW50IGhjbnRybDsKKworCWhjbnRybCA9IGFoY19pbmIoYWhjLCBIQ05UUkwpOworCWhjbnRybCAmPSB+SU5URU47CisJYWhjLT5wYXVzZSAmPSB+SU5URU47CisJYWhjLT51bnBhdXNlICY9IH5JTlRFTjsKKwlpZiAoZW5hYmxlKSB7CisJCWhjbnRybCB8PSBJTlRFTjsKKwkJYWhjLT5wYXVzZSB8PSBJTlRFTjsKKwkJYWhjLT51bnBhdXNlIHw9IElOVEVOOworCX0KKwlhaGNfb3V0YihhaGMsIEhDTlRSTCwgaGNudHJsKTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBjYXJkIGlzIHBhdXNlZCBpbiBhIGxvY2F0aW9uCisgKiBvdXRzaWRlIG9mIGFsbCBjcml0aWNhbCBzZWN0aW9ucyBhbmQgdGhhdCBhbGwKKyAqIHBlbmRpbmcgd29yayBpcyBjb21wbGV0ZWQgcHJpb3IgdG8gcmV0dXJuaW5nLgorICogVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUKKyAqIGFuIGludGVycnVwdCBjb250ZXh0LgorICovCit2b2lkCithaGNfcGF1c2VfYW5kX2ZsdXNod29yayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGludHN0YXQ7CisJaW50IG1heGxvb3BzOworCWludCBwYXVzZWQ7CisKKwltYXhsb29wcyA9IDEwMDA7CisJYWhjLT5mbGFncyB8PSBBSENfQUxMX0lOVEVSUlVQVFM7CisJcGF1c2VkID0gRkFMU0U7CisJZG8geworCQlpZiAocGF1c2VkKQorCQkJYWhjX3VucGF1c2UoYWhjKTsKKwkJYWhjX2ludHIoYWhjKTsKKwkJYWhjX3BhdXNlKGFoYyk7CisJCXBhdXNlZCA9IFRSVUU7CisJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgYWhjX2luYihhaGMsIFNDU0lTRVEpICYgfkVOU0VMTyk7CisJCWFoY19jbGVhcl9jcml0aWNhbF9zZWN0aW9uKGFoYyk7CisJCWludHN0YXQgPSBhaGNfaW5iKGFoYywgSU5UU1RBVCk7CisJfSB3aGlsZSAoLS1tYXhsb29wcworCSAgICAgICYmIChpbnRzdGF0ICE9IDB4RkYgfHwgKGFoYy0+ZmVhdHVyZXMgJiBBSENfUkVNT1ZBQkxFKSA9PSAwKQorCSAgICAgICYmICgoaW50c3RhdCAmIElOVF9QRU5EKSAhPSAwCisJICAgICAgIHx8IChhaGNfaW5iKGFoYywgU1NUQVQwKSAmIChTRUxET3xTRUxJTkdPKSkgIT0gMCkpOworCWlmIChtYXhsb29wcyA9PSAwKSB7CisJCXByaW50ZigiSW5maW5pdGUgaW50ZXJydXB0IGxvb3AsIElOVFNUQVQgPSAleCIsCisJCSAgICAgICBhaGNfaW5iKGFoYywgSU5UU1RBVCkpOworCX0KKwlhaGNfcGxhdGZvcm1fZmx1c2h3b3JrKGFoYyk7CisJYWhjLT5mbGFncyAmPSB+QUhDX0FMTF9JTlRFUlJVUFRTOworfQorCitpbnQKK2FoY19zdXNwZW5kKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCWFoY19wYXVzZV9hbmRfZmx1c2h3b3JrKGFoYyk7CisKKwlpZiAoTElTVF9GSVJTVCgmYWhjLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKKwkJYWhjX3VucGF1c2UoYWhjKTsKKwkJcmV0dXJuIChFQlVTWSk7CisJfQorCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJLyoKKwkgKiBYWFggV2hhdCBhYm91dCBBVElPcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNlcnZpY2VkPworCSAqIFBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgcmVmdXNlIHRvIGJlIHN1c3BlbmRlZCBpZiB3ZQorCSAqIGFyZSBhY3RpbmcgaW4gYSB0YXJnZXQgcm9sZS4KKwkgKi8KKwlpZiAoYWhjLT5wZW5kaW5nX2RldmljZSAhPSBOVUxMKSB7CisJCWFoY191bnBhdXNlKGFoYyk7CisJCXJldHVybiAoRUJVU1kpOworCX0KKyNlbmRpZgorCWFoY19zaHV0ZG93bihhaGMpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorYWhjX3Jlc3VtZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisKKwlhaGNfcmVzZXQoYWhjLCAvKnJlaW5pdCovVFJVRSk7CisJYWhjX2ludHJfZW5hYmxlKGFoYywgVFJVRSk7IAorCWFoY19yZXN0YXJ0KGFoYyk7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEJ1c3kgVGFyZ2V0IFRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSZXR1cm4gdGhlIHVudGFnZ2VkIHRyYW5zYWN0aW9uIGlkIGZvciBhIGdpdmVuIHRhcmdldC9jaGFubmVsIGx1bi4KKyAqIE9wdGlvbmFsbHksIGNsZWFyIHRoZSBlbnRyeS4KKyAqLwordV9pbnQKK2FoY19pbmRleF9idXN5X3RjbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRjbCkKK3sKKwl1X2ludCBzY2JpZDsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApIHsKKwkJdV9pbnQgc2F2ZWRfc2NicHRyOworCQkKKwkJc2F2ZWRfc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBUQ0xfTFVOKHRjbCkpOworCQlzY2JpZCA9IGFoY19pbmIoYWhjLCBTQ0JfNjRfQlRUICsgVENMX1RBUkdFVF9PRkZTRVQodGNsKSk7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOworCX0gZWxzZSB7CisJCXRhcmdldF9vZmZzZXQgPSBUQ0xfVEFSR0VUX09GRlNFVCh0Y2wpOworCQlzY2JpZCA9IGFoY19pbmIoYWhjLCBCVVNZX1RBUkdFVFMgKyB0YXJnZXRfb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gKHNjYmlkKTsKK30KKwordm9pZAorYWhjX3VuYnVzeV90Y2woc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCB0Y2wpCit7CisJdV9pbnQgdGFyZ2V0X29mZnNldDsKKworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCXVfaW50IHNhdmVkX3NjYnB0cjsKKwkJCisJCXNhdmVkX3NjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgVENMX0xVTih0Y2wpKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfNjRfQlRUK1RDTF9UQVJHRVRfT0ZGU0VUKHRjbCksIFNDQl9MSVNUX05VTEwpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2F2ZWRfc2NicHRyKTsKKwl9IGVsc2UgeworCQl0YXJnZXRfb2Zmc2V0ID0gVENMX1RBUkdFVF9PRkZTRVQodGNsKTsKKwkJYWhjX291dGIoYWhjLCBCVVNZX1RBUkdFVFMgKyB0YXJnZXRfb2Zmc2V0LCBTQ0JfTElTVF9OVUxMKTsKKwl9Cit9CisKK3ZvaWQKK2FoY19idXN5X3RjbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRjbCwgdV9pbnQgc2NiaWQpCit7CisJdV9pbnQgdGFyZ2V0X29mZnNldDsKKworCWlmICgoYWhjLT5mbGFncyAmIEFIQ19TQ0JfQlRUKSAhPSAwKSB7CisJCXVfaW50IHNhdmVkX3NjYnB0cjsKKwkJCisJCXNhdmVkX3NjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgVENMX0xVTih0Y2wpKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfNjRfQlRUICsgVENMX1RBUkdFVF9PRkZTRVQodGNsKSwgc2NiaWQpOworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2F2ZWRfc2NicHRyKTsKKwl9IGVsc2UgeworCQl0YXJnZXRfb2Zmc2V0ID0gVENMX1RBUkdFVF9PRkZTRVQodGNsKTsKKwkJYWhjX291dGIoYWhjLCBCVVNZX1RBUkdFVFMgKyB0YXJnZXRfb2Zmc2V0LCBzY2JpZCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLworaW50CithaGNfbWF0Y2hfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiLCBpbnQgdGFyZ2V0LAorCSAgICAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSkKK3sKKwlpbnQgdGFyZyA9IFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKTsKKwljaGFyIGNoYW4gPSBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpOworCWludCBzbHVuID0gU0NCX0dFVF9MVU4oc2NiKTsKKwlpbnQgbWF0Y2g7CisKKwltYXRjaCA9ICgoY2hhbiA9PSBjaGFubmVsKSB8fCAoY2hhbm5lbCA9PSBBTExfQ0hBTk5FTFMpKTsKKwlpZiAobWF0Y2ggIT0gMCkKKwkJbWF0Y2ggPSAoKHRhcmcgPT0gdGFyZ2V0KSB8fCAodGFyZ2V0ID09IENBTV9UQVJHRVRfV0lMRENBUkQpKTsKKwlpZiAobWF0Y2ggIT0gMCkKKwkJbWF0Y2ggPSAoKGx1biA9PSBzbHVuKSB8fCAobHVuID09IENBTV9MVU5fV0lMRENBUkQpKTsKKwlpZiAobWF0Y2ggIT0gMCkgeworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCQlpbnQgZ3JvdXA7CisKKwkJZ3JvdXAgPSBYUFRfRkNfR1JPVVAoc2NiLT5pb19jdHgtPmNjYl9oLmZ1bmNfY29kZSk7CisJCWlmIChyb2xlID09IFJPTEVfSU5JVElBVE9SKSB7CisJCQltYXRjaCA9IChncm91cCAhPSBYUFRfRkNfR1JPVVBfVE1PREUpCisJCQkgICAgICAmJiAoKHRhZyA9PSBzY2ItPmhzY2ItPnRhZykKKwkJCSAgICAgICB8fCAodGFnID09IFNDQl9MSVNUX05VTEwpKTsKKwkJfSBlbHNlIGlmIChyb2xlID09IFJPTEVfVEFSR0VUKSB7CisJCQltYXRjaCA9IChncm91cCA9PSBYUFRfRkNfR1JPVVBfVE1PREUpCisJCQkgICAgICAmJiAoKHRhZyA9PSBzY2ItPmlvX2N0eC0+Y3Npby50YWdfaWQpCisJCQkgICAgICAgfHwgKHRhZyA9PSBTQ0JfTElTVF9OVUxMKSk7CisJCX0KKyNlbHNlIC8qICFBSENfVEFSR0VUX01PREUgKi8KKwkJbWF0Y2ggPSAoKHRhZyA9PSBzY2ItPmhzY2ItPnRhZykgfHwgKHRhZyA9PSBTQ0JfTElTVF9OVUxMKSk7CisjZW5kaWYgLyogQUhDX1RBUkdFVF9NT0RFICovCisJfQorCisJcmV0dXJuIG1hdGNoOworfQorCit2b2lkCithaGNfZnJlZXplX2RldnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50CXRhcmdldDsKKwljaGFyCWNoYW5uZWw7CisJaW50CWx1bjsKKworCXRhcmdldCA9IFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKTsKKwlsdW4gPSBTQ0JfR0VUX0xVTihzY2IpOworCWNoYW5uZWwgPSBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpOworCQorCWFoY19zZWFyY2hfcWluZmlmbyhhaGMsIHRhcmdldCwgY2hhbm5lbCwgbHVuLAorCQkJICAgLyp0YWcqL1NDQl9MSVNUX05VTEwsIFJPTEVfVU5LTk9XTiwKKwkJCSAgIENBTV9SRVFVRVVFX1JFUSwgU0VBUkNIX0NPTVBMRVRFKTsKKworCWFoY19wbGF0Zm9ybV9mcmVlemVfZGV2cShhaGMsIHNjYik7Cit9CisKK3ZvaWQKK2FoY19xaW5maWZvX3JlcXVldWVfdGFpbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzdHJ1Y3Qgc2NiICpwcmV2X3NjYjsKKworCXByZXZfc2NiID0gTlVMTDsKKwlpZiAoYWhjX3FpbmZpZm9fY291bnQoYWhjKSAhPSAwKSB7CisJCXVfaW50IHByZXZfdGFnOworCQl1aW50OF90IHByZXZfcG9zOworCisJCXByZXZfcG9zID0gYWhjLT5xaW5maWZvbmV4dCAtIDE7CisJCXByZXZfdGFnID0gYWhjLT5xaW5maWZvW3ByZXZfcG9zXTsKKwkJcHJldl9zY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIHByZXZfdGFnKTsKKwl9CisJYWhjX3FpbmZpZm9fcmVxdWV1ZShhaGMsIHByZXZfc2NiLCBzY2IpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgSE5TQ0JfUU9GRiwgYWhjLT5xaW5maWZvbmV4dCk7CisJfSBlbHNlIHsKKwkJYWhjX291dGIoYWhjLCBLRVJORUxfUUlOUE9TLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfcWluZmlmb19yZXF1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqcHJldl9zY2IsCisJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaWYgKHByZXZfc2NiID09IE5VTEwpIHsKKwkJYWhjX291dGIoYWhjLCBORVhUX1FVRVVFRF9TQ0IsIHNjYi0+aHNjYi0+dGFnKTsKKwl9IGVsc2UgeworCQlwcmV2X3NjYi0+aHNjYi0+bmV4dCA9IHNjYi0+aHNjYi0+dGFnOworCQlhaGNfc3luY19zY2IoYWhjLCBwcmV2X3NjYiwgCisJCQkgICAgIEJVU19ETUFTWU5DX1BSRVJFQUR8QlVTX0RNQVNZTkNfUFJFV1JJVEUpOworCX0KKwlhaGMtPnFpbmZpZm9bYWhjLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworCXNjYi0+aHNjYi0+bmV4dCA9IGFoYy0+bmV4dF9xdWV1ZWRfc2NiLT5oc2NiLT50YWc7CisJYWhjX3N5bmNfc2NiKGFoYywgc2NiLCBCVVNfRE1BU1lOQ19QUkVSRUFEfEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKK30KKworc3RhdGljIGludAorYWhjX3FpbmZpZm9fY291bnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXVpbnQ4X3QgcWlucG9zOworCXVpbnQ4X3QgZGlmZjsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCXFpbnBvcyA9IGFoY19pbmIoYWhjLCBTTlNDQl9RT0ZGKTsKKwkJYWhjX291dGIoYWhjLCBTTlNDQl9RT0ZGLCBxaW5wb3MpOworCX0gZWxzZQorCQlxaW5wb3MgPSBhaGNfaW5iKGFoYywgUUlOUE9TKTsKKwlkaWZmID0gYWhjLT5xaW5maWZvbmV4dCAtIHFpbnBvczsKKwlyZXR1cm4gKGRpZmYpOworfQorCitpbnQKK2FoY19zZWFyY2hfcWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzLAorCQkgICBhaGNfc2VhcmNoX2FjdGlvbiBhY3Rpb24pCit7CisJc3RydWN0CXNjYiAqc2NiOworCXN0cnVjdAlzY2IgKnByZXZfc2NiOworCXVpbnQ4X3QgcWluc3RhcnQ7CisJdWludDhfdCBxaW5wb3M7CisJdWludDhfdCBxaW50YWlsOworCXVpbnQ4X3QgbmV4dDsKKwl1aW50OF90IHByZXY7CisJdWludDhfdCBjdXJzY2JwdHI7CisJaW50CWZvdW5kOworCWludAloYXZlX3FyZWdzOworCisJcWludGFpbCA9IGFoYy0+cWluZmlmb25leHQ7CisJaGF2ZV9xcmVncyA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDA7CisJaWYgKGhhdmVfcXJlZ3MpIHsKKwkJcWluc3RhcnQgPSBhaGNfaW5iKGFoYywgU05TQ0JfUU9GRik7CisJCWFoY19vdXRiKGFoYywgU05TQ0JfUU9GRiwgcWluc3RhcnQpOworCX0gZWxzZQorCQlxaW5zdGFydCA9IGFoY19pbmIoYWhjLCBRSU5QT1MpOworCXFpbnBvcyA9IHFpbnN0YXJ0OworCWZvdW5kID0gMDsKKwlwcmV2X3NjYiA9IE5VTEw7CisKKwlpZiAoYWN0aW9uID09IFNFQVJDSF9DT01QTEVURSkgeworCQkvKgorCQkgKiBEb24ndCBhdHRlbXB0IHRvIHJ1biBhbnkgcXVldWVkIHVudGFnZ2VkIHRyYW5zYWN0aW9ucworCQkgKiB1bnRpbCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBhYm9ydCBwcm9jZXNzLgorCQkgKi8KKwkJYWhjX2ZyZWV6ZV91bnRhZ2dlZF9xdWV1ZXMoYWhjKTsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggYW4gZW1wdHkgcXVldWUuICBFbnRyaWVzIHRoYXQgYXJlIG5vdCBjaG9zZW4KKwkgKiBmb3IgcmVtb3ZhbCB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBxdWV1ZSBhcyB3ZSBnby4KKwkgKi8KKwlhaGMtPnFpbmZpZm9uZXh0ID0gcWlucG9zOworCWFoY19vdXRiKGFoYywgTkVYVF9RVUVVRURfU0NCLCBhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYi0+dGFnKTsKKworCXdoaWxlIChxaW5wb3MgIT0gcWludGFpbCkgeworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFoYy0+cWluZmlmb1txaW5wb3NdKTsKKwkJaWYgKHNjYiA9PSBOVUxMKSB7CisJCQlwcmludGYoInFpbnBvcyA9ICVkLCBTQ0IgaW5kZXggPSAlZFxuIiwKKwkJCQlxaW5wb3MsIGFoYy0+cWluZmlmb1txaW5wb3NdKTsKKwkJCXBhbmljKCJMb29wIDFcbiIpOworCQl9CisKKwkJaWYgKGFoY19tYXRjaF9zY2IoYWhjLCBzY2IsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcsIHJvbGUpKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gc2NiIHRoYXQgbmVlZHMgdG8gYmUgYWN0ZWQgb24uCisJCQkgKi8KKwkJCWZvdW5kKys7CisJCQlzd2l0Y2ggKGFjdGlvbikgeworCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCQl7CisJCQkJY2FtX3N0YXR1cyBvc3RhdDsKKwkJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBzdGF0dXMpOworCQkJCWNzdGF0ID0gYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCisJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CisJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKKwkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gcWluZmlmb1xuIik7CisJCQkJYWhjX2RvbmUoYWhjLCBzY2IpOworCisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCX0KKwkJCWNhc2UgU0VBUkNIX1JFTU9WRToKKwkJCQlicmVhazsKKwkJCWNhc2UgU0VBUkNIX0NPVU5UOgorCQkJCWFoY19xaW5maWZvX3JlcXVldWUoYWhjLCBwcmV2X3NjYiwgc2NiKTsKKwkJCQlwcmV2X3NjYiA9IHNjYjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFoY19xaW5maWZvX3JlcXVldWUoYWhjLCBwcmV2X3NjYiwgc2NiKTsKKwkJCXByZXZfc2NiID0gc2NiOworCQl9CisJCXFpbnBvcysrOworCX0KKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgSE5TQ0JfUU9GRiwgYWhjLT5xaW5maWZvbmV4dCk7CisJfSBlbHNlIHsKKwkJYWhjX291dGIoYWhjLCBLRVJORUxfUUlOUE9TLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9CisKKwlpZiAoYWN0aW9uICE9IFNFQVJDSF9DT1VOVAorCSAmJiAoZm91bmQgIT0gMCkKKwkgJiYgKHFpbnN0YXJ0ICE9IGFoYy0+cWluZmlmb25leHQpKSB7CisJCS8qCisJCSAqIFRoZSBzZXF1ZW5jZXIgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGRtYWluZworCQkgKiBkb3duIHRoZSBTQ0IgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuCisJCSAqIFRoaXMgY291bGQgYmUgcHJvYmxlbWF0aWMgaWYgZWl0aGVyIHRoZSBmaXJzdCwKKwkJICogb3IgdGhlIHNlY29uZCBTQ0IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZQorCQkgKiAodGhlIGZpcnN0IFNDQiBpbmNsdWRlcyBhIHBvaW50ZXIgdG8gdGhlICJuZXh0IgorCQkgKiBTQ0IgdG8gZG1hKS4gSWYgd2UgaGF2ZSByZW1vdmVkIGFueSBlbnRyaWVzLCBzd2FwCisJCSAqIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBxdWV1ZSB3aXRoIHRoZSBuZXh0IEhTQ0IKKwkJICogc28gdGhlIHNlcXVlbmNlciB3aWxsIG5vdGljZSB0aGF0IE5FWFRfUVVFVUVEX1NDQgorCQkgKiBoYXMgY2hhbmdlZCBkdXJpbmcgaXRzIGRtYSBhdHRlbXB0IGFuZCB3aWxsIHJldHJ5CisJCSAqIHRoZSBETUEuCisJCSAqLworCQlzY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFoYy0+cWluZmlmb1txaW5zdGFydF0pOworCisJCWlmIChzY2IgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJmb3VuZCA9ICVkLCBxaW5zdGFydCA9ICVkLCBxaW5maWZpb25leHQgPSAlZFxuIiwKKwkJCQlmb3VuZCwgcWluc3RhcnQsIGFoYy0+cWluZmlmb25leHQpOworCQkJcGFuaWMoIkZpcnN0L1NlY29uZCBRaW5maWZvIGZpeHVwXG4iKTsKKwkJfQorCQkvKgorCQkgKiBhaGNfc3dhcF93aXRoX25leHRfaHNjYiBmb3JjZXMgb3VyIG5leHQgcG9pbnRlciB0bworCQkgKiBwb2ludCB0byB0aGUgcmVzZXJ2ZWQgU0NCIGZvciBmdXR1cmUgY29tbWFuZHMuICBTYXZlCisJCSAqIGFuZCByZXN0b3JlIG91ciBvcmlnaW5hbCBuZXh0IHBvaW50ZXIgdG8gbWFpbnRhaW4KKwkJICogcXVldWUgaW50ZWdyaXR5LgorCQkgKi8KKwkJbmV4dCA9IHNjYi0+aHNjYi0+bmV4dDsKKwkJYWhjLT5zY2JfZGF0YS0+c2NiaW5kZXhbc2NiLT5oc2NiLT50YWddID0gTlVMTDsKKwkJYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2IoYWhjLCBzY2IpOworCQlzY2ItPmhzY2ItPm5leHQgPSBuZXh0OworCQlhaGMtPnFpbmZpZm9bcWluc3RhcnRdID0gc2NiLT5oc2NiLT50YWc7CisKKwkJLyogVGVsbCB0aGUgY2FyZCBhYm91dCB0aGUgbmV3IGhlYWQgb2YgdGhlIHFpbmZpZm8uICovCisJCWFoY19vdXRiKGFoYywgTkVYVF9RVUVVRURfU0NCLCBzY2ItPmhzY2ItPnRhZyk7CisKKwkJLyogRml4dXAgdGhlIHRhaWwgIm5leHQiIHBvaW50ZXIuICovCisJCXFpbnRhaWwgPSBhaGMtPnFpbmZpZm9uZXh0IC0gMTsKKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBhaGMtPnFpbmZpZm9bcWludGFpbF0pOworCQlzY2ItPmhzY2ItPm5leHQgPSBhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYi0+dGFnOworCX0KKworCS8qCisJICogU2VhcmNoIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0LgorCSAqLworCWN1cnNjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCW5leHQgPSBhaGNfaW5iKGFoYywgV0FJVElOR19TQ0JIKTsgIC8qIFN0YXJ0IGF0IGhlYWQgb2YgbGlzdC4gKi8KKwlwcmV2ID0gU0NCX0xJU1RfTlVMTDsKKworCXdoaWxlIChuZXh0ICE9IFNDQl9MSVNUX05VTEwpIHsKKwkJdWludDhfdCBzY2JfaW5kZXg7CisKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIG5leHQpOworCQlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgU0NCX1RBRyk7CisJCWlmIChzY2JfaW5kZXggPj0gYWhjLT5zY2JfZGF0YS0+bnVtc2NicykgeworCQkJcHJpbnRmKCJXYWl0aW5nIExpc3QgaW5jb25zaXN0ZW5jeS4gIgorCQkJICAgICAgICJTQ0IgaW5kZXggPT0gJWQsIHlldCBudW1zY2JzID09ICVkLiIsCisJCQkgICAgICAgc2NiX2luZGV4LCBhaGMtPnNjYl9kYXRhLT5udW1zY2JzKTsKKwkJCWFoY19kdW1wX2NhcmRfc3RhdGUoYWhjKTsKKwkJCXBhbmljKCJmb3Igc2FmZXR5Iik7CisJCX0KKwkJc2NiID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JfaW5kZXgpOworCQlpZiAoc2NiID09IE5VTEwpIHsKKwkJCXByaW50Zigic2NiX2luZGV4ID0gJWQsIG5leHQgPSAlZFxuIiwKKwkJCQlzY2JfaW5kZXgsIG5leHQpOworCQkJcGFuaWMoIldhaXRpbmcgTGlzdCB0cmF2ZXJzYWxcbiIpOworCQl9CisJCWlmIChhaGNfbWF0Y2hfc2NiKGFoYywgc2NiLCB0YXJnZXQsIGNoYW5uZWwsCisJCQkJICBsdW4sIFNDQl9MSVNUX05VTEwsIHJvbGUpKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gc2NiIHRoYXQgbmVlZHMgdG8gYmUgYWN0ZWQgb24uCisJCQkgKi8KKwkJCWZvdW5kKys7CisJCQlzd2l0Y2ggKGFjdGlvbikgeworCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCQl7CisJCQkJY2FtX3N0YXR1cyBvc3RhdDsKKwkJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLAorCQkJCQkJCQkgICBzdGF0dXMpOworCQkJCWNzdGF0ID0gYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCisJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CisJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKKwkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gV2FpdGluZyBMaXN0XG4iKTsKKwkJCQlhaGNfZG9uZShhaGMsIHNjYik7CisJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCX0KKwkJCWNhc2UgU0VBUkNIX1JFTU9WRToKKwkJCQluZXh0ID0gYWhjX3JlbV93c2NiKGFoYywgbmV4dCwgcHJldik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNFQVJDSF9DT1VOVDoKKwkJCQlwcmV2ID0gbmV4dDsKKwkJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCQorCQkJcHJldiA9IG5leHQ7CisJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJfQorCX0KKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgY3Vyc2NicHRyKTsKKworCWZvdW5kICs9IGFoY19zZWFyY2hfdW50YWdnZWRfcXVldWVzKGFoYywgLyphaGNfaW9fY3R4X3QqL05VTEwsIHRhcmdldCwKKwkJCQkJICAgIGNoYW5uZWwsIGx1biwgc3RhdHVzLCBhY3Rpb24pOworCisJaWYgKGFjdGlvbiA9PSBTRUFSQ0hfQ09NUExFVEUpCisJCWFoY19yZWxlYXNlX3VudGFnZ2VkX3F1ZXVlcyhhaGMpOworCXJldHVybiAoZm91bmQpOworfQorCitpbnQKK2FoY19zZWFyY2hfdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYWhjX2lvX2N0eF90IGN0eCwKKwkJCSAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdWludDMyX3Qgc3RhdHVzLAorCQkJICAgYWhjX3NlYXJjaF9hY3Rpb24gYWN0aW9uKQoreworCXN0cnVjdAlzY2IgKnNjYjsKKwlpbnQJbWF4dGFyZ2V0OworCWludAlmb3VuZDsKKwlpbnQJaTsKKworCWlmIChhY3Rpb24gPT0gU0VBUkNIX0NPTVBMRVRFKSB7CisJCS8qCisJCSAqIERvbid0IGF0dGVtcHQgdG8gcnVuIGFueSBxdWV1ZWQgdW50YWdnZWQgdHJhbnNhY3Rpb25zCisJCSAqIHVudGlsIHdlIGFyZSBkb25lIHdpdGggdGhlIGFib3J0IHByb2Nlc3MuCisJCSAqLworCQlhaGNfZnJlZXplX3VudGFnZ2VkX3F1ZXVlcyhhaGMpOworCX0KKworCWZvdW5kID0gMDsKKwlpID0gMDsKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCisJCW1heHRhcmdldCA9IDE2OworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKworCQkJaSA9IHRhcmdldDsKKwkJCWlmIChjaGFubmVsID09ICdCJykKKwkJCQlpICs9IDg7CisJCQltYXh0YXJnZXQgPSBpICsgMTsKKwkJfQorCX0gZWxzZSB7CisJCW1heHRhcmdldCA9IDA7CisJfQorCisJZm9yICg7IGkgPCBtYXh0YXJnZXQ7IGkrKykgeworCQlzdHJ1Y3Qgc2NiX3RhaWxxICp1bnRhZ2dlZF9xOworCQlzdHJ1Y3Qgc2NiICpuZXh0X3NjYjsKKworCQl1bnRhZ2dlZF9xID0gJihhaGMtPnVudGFnZ2VkX3F1ZXVlc1tpXSk7CisJCW5leHRfc2NiID0gVEFJTFFfRklSU1QodW50YWdnZWRfcSk7CisJCXdoaWxlIChuZXh0X3NjYiAhPSBOVUxMKSB7CisKKwkJCXNjYiA9IG5leHRfc2NiOworCQkJbmV4dF9zY2IgPSBUQUlMUV9ORVhUKHNjYiwgbGlua3MudHFlKTsKKworCQkJLyoKKwkJCSAqIFRoZSBoZWFkIG9mIHRoZSBsaXN0IG1heSBiZSB0aGUgY3VycmVudGx5CisJCQkgKiBhY3RpdmUgdW50YWdnZWQgY29tbWFuZCBmb3IgYSBkZXZpY2UuCisJCQkgKiBXZSdyZSBvbmx5IHNlYXJjaGluZyBmb3IgY29tbWFuZHMgdGhhdAorCQkJICogaGF2ZSBub3QgYmVlbiBzdGFydGVkLiAgQSB0cmFuc2FjdGlvbgorCQkJICogbWFya2VkIGFjdGl2ZSBidXQgc3RpbGwgaW4gdGhlIHFpbmZpZm8KKwkJCSAqIGlzIHJlbW92ZWQgYnkgdGhlIHFpbmZpZm8gc2Nhbm5pbmcgY29kZQorCQkJICogYWJvdmUuCisJCQkgKi8KKwkJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpICE9IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChhaGNfbWF0Y2hfc2NiKGFoYywgc2NiLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKwkJCQkJICBTQ0JfTElTVF9OVUxMLCBST0xFX0lOSVRJQVRPUikgPT0gMAorCQkJIHx8IChjdHggIT0gTlVMTCAmJiBjdHggIT0gc2NiLT5pb19jdHgpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gc2NiIHRoYXQgbmVlZHMgdG8gYmUgYWN0ZWQgb24uCisJCQkgKi8KKwkJCWZvdW5kKys7CisJCQlzd2l0Y2ggKGFjdGlvbikgeworCQkJY2FzZSBTRUFSQ0hfQ09NUExFVEU6CisJCQl7CisJCQkJY2FtX3N0YXR1cyBvc3RhdDsKKwkJCQljYW1fc3RhdHVzIGNzdGF0OworCisJCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpOworCQkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBzdGF0dXMpOworCQkJCWNzdGF0ID0gYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKTsKKwkJCQlpZiAoY3N0YXQgIT0gQ0FNX1JFUV9DTVApCisJCQkJCWFoY19mcmVlemVfc2NiKHNjYik7CisJCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkKKwkJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0IgaW4gdW50YWdnZWRRXG4iKTsKKwkJCQlhaGNfZG9uZShhaGMsIHNjYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFNFQVJDSF9SRU1PVkU6CisJCQkJc2NiLT5mbGFncyAmPSB+U0NCX1VOVEFHR0VEUTsKKwkJCQlUQUlMUV9SRU1PVkUodW50YWdnZWRfcSwgc2NiLCBsaW5rcy50cWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBTRUFSQ0hfQ09VTlQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoYWN0aW9uID09IFNFQVJDSF9DT01QTEVURSkKKwkJYWhjX3JlbGVhc2VfdW50YWdnZWRfcXVldWVzKGFoYyk7CisJcmV0dXJuIChmb3VuZCk7Cit9CisKK2ludAorYWhjX3NlYXJjaF9kaXNjX2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsCisJCSAgICAgaW50IGx1biwgdV9pbnQgdGFnLCBpbnQgc3RvcF9vbl9maXJzdCwgaW50IHJlbW92ZSwKKwkJICAgICBpbnQgc2F2ZV9zdGF0ZSkKK3sKKwlzdHJ1Y3QJc2NiICpzY2JwOworCXVfaW50CW5leHQ7CisJdV9pbnQJcHJldjsKKwl1X2ludAljb3VudDsKKwl1X2ludAlhY3RpdmVfc2NiOworCisJY291bnQgPSAwOworCW5leHQgPSBhaGNfaW5iKGFoYywgRElTQ09OTkVDVEVEX1NDQkgpOworCXByZXYgPSBTQ0JfTElTVF9OVUxMOworCisJaWYgKHNhdmVfc3RhdGUpIHsKKwkJLyogcmVzdG9yZSB0aGlzIHdoZW4gd2UncmUgZG9uZSAqLworCQlhY3RpdmVfc2NiID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJfSBlbHNlCisJCS8qIFNpbGVuY2UgY29tcGlsZXIgKi8KKwkJYWN0aXZlX3NjYiA9IFNDQl9MSVNUX05VTEw7CisKKwl3aGlsZSAobmV4dCAhPSBTQ0JfTElTVF9OVUxMKSB7CisJCXVfaW50IHNjYl9pbmRleDsKKworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgbmV4dCk7CisJCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwkJaWYgKHNjYl9pbmRleCA+PSBhaGMtPnNjYl9kYXRhLT5udW1zY2JzKSB7CisJCQlwcmludGYoIkRpc2Nvbm5lY3RlZCBMaXN0IGluY29uc2lzdGVuY3kuICIKKwkJCSAgICAgICAiU0NCIGluZGV4ID09ICVkLCB5ZXQgbnVtc2NicyA9PSAlZC4iLAorCQkJICAgICAgIHNjYl9pbmRleCwgYWhjLT5zY2JfZGF0YS0+bnVtc2Nicyk7CisJCQlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CisJCQlwYW5pYygiZm9yIHNhZmV0eSIpOworCQl9CisKKwkJaWYgKG5leHQgPT0gcHJldikgeworCQkJcGFuaWMoIkRpc2Nvbm5lY3RlZCBMaXN0IExvb3AuICIKKwkJCSAgICAgICJjdXIgU0NCUFRSID09ICV4LCBwcmV2IFNDQlBUUiA9PSAleC4iLAorCQkJICAgICAgbmV4dCwgcHJldik7CisJCX0KKwkJc2NicCA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiX2luZGV4KTsKKwkJaWYgKGFoY19tYXRjaF9zY2IoYWhjLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKwkJCQkgIHRhZywgUk9MRV9JTklUSUFUT1IpKSB7CisJCQljb3VudCsrOworCQkJaWYgKHJlbW92ZSkgeworCQkJCW5leHQgPQorCQkJCSAgICBhaGNfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChhaGMsIHByZXYsIG5leHQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmV2ID0gbmV4dDsKKwkJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJCX0KKwkJCWlmIChzdG9wX29uX2ZpcnN0KQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJcHJldiA9IG5leHQ7CisJCQluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwkJfQorCX0KKwlpZiAoc2F2ZV9zdGF0ZSkKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGFjdGl2ZV9zY2IpOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogUmVtb3ZlIGFuIFNDQiBmcm9tIHRoZSBvbiBjaGlwIGxpc3Qgb2YgZGlzY29ubmVjdGVkIHRyYW5zYWN0aW9ucy4KKyAqIFRoaXMgaXMgZW1wdHkvdW51c2VkIGlmIHdlIGFyZSBub3QgcGVyZm9ybWluZyBTQ0IgcGFnaW5nLgorICovCitzdGF0aWMgdV9pbnQKK2FoY19yZW1fc2NiX2Zyb21fZGlzY19saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcHJldiwgdV9pbnQgc2NicHRyKQoreworCXVfaW50IG5leHQ7CisKKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NicHRyKTsKKwluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKworCWFoY19vdXRiKGFoYywgU0NCX0NPTlRST0wsIDApOworCisJYWhjX2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KGFoYyk7CisKKwlpZiAocHJldiAhPSBTQ0JfTElTVF9OVUxMKSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBwcmV2KTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgbmV4dCk7CisJfSBlbHNlCisJCWFoY19vdXRiKGFoYywgRElTQ09OTkVDVEVEX1NDQkgsIG5leHQpOworCisJcmV0dXJuIChuZXh0KTsKK30KKworLyoKKyAqIEFkZCB0aGUgU0NCIGFzIHNlbGVjdGVkIGJ5IFNDQlBUUiBvbnRvIHRoZSBvbiBjaGlwIGxpc3Qgb2YKKyAqIGZyZWUgaGFyZHdhcmUgU0NCcy4gIFRoaXMgbGlzdCBpcyBlbXB0eS91bnVzZWQgaWYgd2UgYXJlIG5vdAorICogcGVyZm9ybWluZyBTQ0IgcGFnaW5nLgorICovCitzdGF0aWMgdm9pZAorYWhjX2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIHRhZyBzbyB0aGF0IG91ciBhYm9ydAorCSAqIHJvdXRpbmVzIGRvbid0IHRoaW5rIGl0J3MgYWN0aXZlLgorCSAqLworCWFoY19vdXRiKGFoYywgU0NCX1RBRywgU0NCX0xJU1RfTlVMTCk7CisKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApIHsKKwkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgYWhjX2luYihhaGMsIEZSRUVfU0NCSCkpOworCQlhaGNfb3V0YihhaGMsIEZSRUVfU0NCSCwgYWhjX2luYihhaGMsIFNDQlBUUikpOworCX0KK30KKworLyoKKyAqIE1hbmlwdWxhdGUgdGhlIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBzY2IgdGhhdCBmb2xsb3dzIHRoZSBvbmUgdGhhdCB3ZSByZW1vdmUuCisgKi8KK3N0YXRpYyB1X2ludAorYWhjX3JlbV93c2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgc2NicG9zLCB1X2ludCBwcmV2KQoreyAgICAgICAKKwl1X2ludCBjdXJzY2IsIG5leHQ7CisKKwkvKgorCSAqIFNlbGVjdCB0aGUgU0NCIHdlIHdhbnQgdG8gYWJvcnQgYW5kCisJICogcHVsbCB0aGUgbmV4dCBwb2ludGVyIG91dCBvZiBpdC4KKwkgKi8KKwljdXJzY2IgPSBhaGNfaW5iKGFoYywgU0NCUFRSKTsKKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NicG9zKTsKKwluZXh0ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKworCS8qIENsZWFyIHRoZSBuZWNlc3NhcnkgZmllbGRzICovCisJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwgMCk7CisKKwlhaGNfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QoYWhjKTsKKworCS8qIHVwZGF0ZSB0aGUgd2FpdGluZyBsaXN0ICovCisJaWYgKHByZXYgPT0gU0NCX0xJU1RfTlVMTCkgeworCQkvKiBGaXJzdCBpbiB0aGUgbGlzdCAqLworCQlhaGNfb3V0YihhaGMsIFdBSVRJTkdfU0NCSCwgbmV4dCk7IAorCisJCS8qCisJCSAqIEVuc3VyZSB3ZSBhcmVuJ3QgYXR0ZW1wdGluZyB0byBwZXJmb3JtCisJCSAqIHNlbGVjdGlvbiBmb3IgdGhpcyBlbnRyeS4KKwkJICovCisJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgKGFoY19pbmIoYWhjLCBTQ1NJU0VRKSAmIH5FTlNFTE8pKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZWxlY3QgdGhlIHNjYiB0aGF0IHBvaW50ZWQgdG8gdXMgCisJCSAqIGFuZCB1cGRhdGUgaXRzIG5leHQgcG9pbnRlci4KKwkJICovCisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBwcmV2KTsKKwkJYWhjX291dGIoYWhjLCBTQ0JfTkVYVCwgbmV4dCk7CisJfQorCisJLyoKKwkgKiBQb2ludCB1cyBiYWNrIGF0IHRoZSBvcmlnaW5hbCBzY2IgcG9zaXRpb24uCisJICovCisJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGN1cnNjYik7CisJcmV0dXJuIG5leHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFcnJvciBIYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQWJvcnQgYWxsIFNDQnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gZGVzY3JpcHRpb24gKHRhcmdldC9jaGFubmVsL2x1bi90YWcpLAorICogc2V0dGluZyB0aGVpciBzdGF0dXMgdG8gdGhlIHBhc3NlZCBpbiBzdGF0dXMgaWYgdGhlIHN0YXR1cyBoYXMgbm90IGFscmVhZHkKKyAqIGJlZW4gbW9kaWZpZWQgZnJvbSBDQU1fUkVRX0lOUFJPRy4gIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIHNlcXVlbmNlcgorICogaXMgcGF1c2VkIGJlZm9yZSBpdCBpcyBjYWxsZWQuCisgKi8KK2ludAorYWhjX2Fib3J0X3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LCBjaGFyIGNoYW5uZWwsCisJICAgICAgIGludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlzdHJ1Y3QJc2NiICpzY2JwOworCXN0cnVjdAlzY2IgKnNjYnBfbmV4dDsKKwl1X2ludAlhY3RpdmVfc2NiOworCWludAlpLCBqOworCWludAltYXh0YXJnZXQ7CisJaW50CW1pbmx1bjsKKwlpbnQJbWF4bHVuOworCisJaW50CWZvdW5kOworCisJLyoKKwkgKiBEb24ndCBhdHRlbXB0IHRvIHJ1biBhbnkgcXVldWVkIHVudGFnZ2VkIHRyYW5zYWN0aW9ucworCSAqIHVudGlsIHdlIGFyZSBkb25lIHdpdGggdGhlIGFib3J0IHByb2Nlc3MuCisJICovCisJYWhjX2ZyZWV6ZV91bnRhZ2dlZF9xdWV1ZXMoYWhjKTsKKworCS8qIHJlc3RvcmUgdGhpcyB3aGVuIHdlJ3JlIGRvbmUgKi8KKwlhY3RpdmVfc2NiID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisKKwlmb3VuZCA9IGFoY19zZWFyY2hfcWluZmlmbyhhaGMsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCBTQ0JfTElTVF9OVUxMLAorCQkJCSAgIHJvbGUsIENBTV9SRVFVRVVFX1JFUSwgU0VBUkNIX0NPTVBMRVRFKTsKKworCS8qCisJICogQ2xlYW4gb3V0IHRoZSBidXN5IHRhcmdldCB0YWJsZSBmb3IgYW55IHVudGFnZ2VkIGNvbW1hbmRzLgorCSAqLworCWkgPSAwOworCW1heHRhcmdldCA9IDE2OworCWlmICh0YXJnZXQgIT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRCkgeworCQlpID0gdGFyZ2V0OworCQlpZiAoY2hhbm5lbCA9PSAnQicpCisJCQlpICs9IDg7CisJCW1heHRhcmdldCA9IGkgKyAxOworCX0KKworCWlmIChsdW4gPT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCisJCS8qCisJCSAqIFVubGVzcyB3ZSBhcmUgdXNpbmcgYW4gU0NCIGJhc2VkCisJCSAqIGJ1c3kgdGFyZ2V0cyB0YWJsZSwgdGhlcmUgaXMgb25seQorCQkgKiBvbmUgdGFibGUgZW50cnkgZm9yIGFsbCBsdW5zIG9mCisJCSAqIGEgdGFyZ2V0LgorCQkgKi8KKwkJbWlubHVuID0gMDsKKwkJbWF4bHVuID0gMTsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApCisJCQltYXhsdW4gPSBBSENfTlVNX0xVTlM7CisJfSBlbHNlIHsKKwkJbWlubHVuID0gbHVuOworCQltYXhsdW4gPSBsdW4gKyAxOworCX0KKworCWlmIChyb2xlICE9IFJPTEVfVEFSR0VUKSB7CisJCWZvciAoO2kgPCBtYXh0YXJnZXQ7IGkrKykgeworCQkJZm9yIChqID0gbWlubHVuO2ogPCBtYXhsdW47IGorKykgeworCQkJCXVfaW50IHNjYmlkOworCQkJCXVfaW50IHRjbDsKKworCQkJCXRjbCA9IEJVSUxEX1RDTChpIDw8IDQsIGopOworCQkJCXNjYmlkID0gYWhjX2luZGV4X2J1c3lfdGNsKGFoYywgdGNsKTsKKwkJCQlzY2JwID0gYWhjX2xvb2t1cF9zY2IoYWhjLCBzY2JpZCk7CisJCQkJaWYgKHNjYnAgPT0gTlVMTAorCQkJCSB8fCBhaGNfbWF0Y2hfc2NiKGFoYywgc2NicCwgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJICBsdW4sIHRhZywgcm9sZSkgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJYWhjX3VuYnVzeV90Y2woYWhjLCBCVUlMRF9UQ0woaSA8PCA0LCBqKSk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBHbyB0aHJvdWdoIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBhbmQgcmVtb3ZlIGFueSBlbnRyaWVzIHdlCisJCSAqIGhhdmUgcXVldWVkIGZvciBjb21wbGV0aW9uLCAwJ2luZyB0aGVpciBjb250cm9sIGJ5dGUgdG9vLgorCQkgKiBXZSBzYXZlIHRoZSBhY3RpdmUgU0NCIGFuZCByZXN0b3JlIGl0IG91cnNlbHZlcywgc28gdGhlcmUKKwkJICogaXMgbm8gcmVhc29uIGZvciB0aGlzIHNlYXJjaCB0byByZXN0b3JlIGl0IHRvby4KKwkJICovCisJCWFoY19zZWFyY2hfZGlzY19saXN0KGFoYywgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZywKKwkJCQkgICAgIC8qc3RvcF9vbl9maXJzdCovRkFMU0UsIC8qcmVtb3ZlKi9UUlVFLAorCQkJCSAgICAgLypzYXZlX3N0YXRlKi9GQUxTRSk7CisJfQorCisJLyoKKwkgKiBHbyB0aHJvdWdoIHRoZSBoYXJkd2FyZSBTQ0IgYXJyYXkgbG9va2luZyBmb3IgY29tbWFuZHMgdGhhdAorCSAqIHdlcmUgYWN0aXZlIGJ1dCBub3Qgb24gYW55IGxpc3QuICBJbiBzb21lIGNhc2VzLCB0aGVzZSByZW1uYW50cworCSAqIG1pZ2h0IG5vdCBzdGlsbCBoYXZlIG1hcHBpbmdzIGluIHRoZSBzY2JpbmRleCBhcnJheSAoZS5nLiB1bmV4cGVjdGVkCisJICogYnVzIGZyZWUgd2l0aCB0aGUgc2FtZSBzY2IgcXVldWVkIGZvciBhbiBhYm9ydCkuICBEb24ndCBob2xkIHRoaXMKKwkgKiBhZ2FpbnN0IHRoZW0uCisJICovCisJZm9yIChpID0gMDsgaSA8IGFoYy0+c2NiX2RhdGEtPm1heGhzY2JzOyBpKyspIHsKKwkJdV9pbnQgc2NiaWQ7CisKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIGkpOworCQlzY2JpZCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwkJc2NicCA9IGFoY19sb29rdXBfc2NiKGFoYywgc2NiaWQpOworCQlpZiAoKHNjYnAgPT0gTlVMTCAmJiBzY2JpZCAhPSBTQ0JfTElTVF9OVUxMKQorCQkgfHwgKHNjYnAgIT0gTlVMTAorCQkgICYmIGFoY19tYXRjaF9zY2IoYWhjLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkpCisJCQlhaGNfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QoYWhjKTsKKwl9CisKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIHBlbmRpbmcgQ0NCIGxpc3QgYW5kIGxvb2sgZm9yCisJICogY29tbWFuZHMgZm9yIHRoaXMgdGFyZ2V0IHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KKwkgKiBUaGVzZSBhcmUgb3RoZXIgdGFnZ2VkIGNvbW1hbmRzIHRoYXQgd2VyZQorCSAqIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZXNldCBvY2N1cnJlZC4KKwkgKi8KKwlzY2JwX25leHQgPSBMSVNUX0ZJUlNUKCZhaGMtPnBlbmRpbmdfc2Nicyk7CisJd2hpbGUgKHNjYnBfbmV4dCAhPSBOVUxMKSB7CisJCXNjYnAgPSBzY2JwX25leHQ7CisJCXNjYnBfbmV4dCA9IExJU1RfTkVYVChzY2JwLCBwZW5kaW5nX2xpbmtzKTsKKwkJaWYgKGFoY19tYXRjaF9zY2IoYWhjLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLCByb2xlKSkgeworCQkJY2FtX3N0YXR1cyBvc3RhdDsKKworCQkJb3N0YXQgPSBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwKTsKKwkJCWlmIChvc3RhdCA9PSBDQU1fUkVRX0lOUFJPRykKKwkJCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2JwLCBzdGF0dXMpOworCQkJaWYgKGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYnApICE9IENBTV9SRVFfQ01QKQorCQkJCWFoY19mcmVlemVfc2NiKHNjYnApOworCQkJaWYgKChzY2JwLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisJCQkJcHJpbnRmKCJJbmFjdGl2ZSBTQ0Igb24gcGVuZGluZyBsaXN0XG4iKTsKKwkJCWFoY19kb25lKGFoYywgc2NicCk7CisJCQlmb3VuZCsrOworCQl9CisJfQorCWFoY19vdXRiKGFoYywgU0NCUFRSLCBhY3RpdmVfc2NiKTsKKwlhaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhhaGMsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcsIHJvbGUsIHN0YXR1cyk7CisJYWhjX3JlbGVhc2VfdW50YWdnZWRfcXVldWVzKGFoYyk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgdm9pZAorYWhjX3Jlc2V0X2N1cnJlbnRfYnVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1aW50OF90IHNjc2lzZXE7CisKKwlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIGFoY19pbmIoYWhjLCBTSU1PREUxKSAmIH5FTlNDU0lSU1QpOworCXNjc2lzZXEgPSBhaGNfaW5iKGFoYywgU0NTSVNFUSk7CisJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBzY3Npc2VxIHwgU0NTSVJTVE8pOworCWFoY19mbHVzaF9kZXZpY2Vfd3JpdGVzKGFoYyk7CisJYWhjX2RlbGF5KEFIQ19CVVNSRVNFVF9ERUxBWSk7CisJLyogVHVybiBvZmYgdGhlIGJ1cyByZXNldCAqLworCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgc2NzaXNlcSAmIH5TQ1NJUlNUTyk7CisKKwlhaGNfY2xlYXJfaW50c3RhdChhaGMpOworCisJLyogUmUtZW5hYmxlIHJlc2V0IGludGVycnVwdHMgKi8KKwlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIGFoY19pbmIoYWhjLCBTSU1PREUxKSB8IEVOU0NTSVJTVCk7Cit9CisKK2ludAorYWhjX3Jlc2V0X2NoYW5uZWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyIGNoYW5uZWwsIGludCBpbml0aWF0ZV9yZXNldCkKK3sKKwlzdHJ1Y3QJYWhjX2RldmluZm8gZGV2aW5mbzsKKwl1X2ludAlpbml0aWF0b3IsIHRhcmdldCwgbWF4X3Njc2lpZDsKKwl1X2ludAlzYmxrY3RsOworCXVfaW50CXNjc2lzZXE7CisJdV9pbnQJc2ltb2RlMTsKKwlpbnQJZm91bmQ7CisJaW50CXJlc3RhcnRfbmVlZGVkOworCWNoYXIJY3VyX2NoYW5uZWw7CisKKwlhaGMtPnBlbmRpbmdfZGV2aWNlID0gTlVMTDsKKworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKKwkJCSAgICBDQU1fVEFSR0VUX1dJTERDQVJELAorCQkJICAgIENBTV9MVU5fV0lMRENBUkQsCisJCQkgICAgY2hhbm5lbCwgUk9MRV9VTktOT1dOKTsKKwlhaGNfcGF1c2UoYWhjKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgc2VxdWVuY2VyIGlzIGluIGEgc2FmZSBsb2NhdGlvbi4gKi8KKwlhaGNfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihhaGMpOworCisJLyoKKwkgKiBSdW4gb3VyIGNvbW1hbmQgY29tcGxldGUgZmlmb3MgdG8gZW5zdXJlIHRoYXQgd2UgcGVyZm9ybQorCSAqIGNvbXBsZXRpb24gcHJvY2Vzc2luZyBvbiBhbnkgY29tbWFuZHMgdGhhdCAnY29tcGxldGVkJworCSAqIGJlZm9yZSB0aGUgcmVzZXQgb2NjdXJyZWQuCisJICovCisJYWhjX3J1bl9xb3V0ZmlmbyhhaGMpOworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCS8qCisJICogWFhYIC0gSW4gVHdpbiBtb2RlLCB0aGUgdHFpbmZpZm8gbWF5IGhhdmUgY29tbWFuZHMKKwkgKgkgZm9yIGFuIHVuYWZmZWN0ZWQgY2hhbm5lbCBpbiBpdC4gIEhvd2V2ZXIsIGlmCisJICoJIHdlIGhhdmUgcnVuIG91dCBvZiBBVElPIHJlc291cmNlcyB0byBkcmFpbiB0aGF0CisJICoJIHF1ZXVlLCB3ZSBtYXkgbm90IGdldCB0aGVtIGFsbCBvdXQgaGVyZS4gIEZ1cnRoZXIsCisJICoJIHRoZSBibG9ja2VkIHRyYW5zYWN0aW9ucyBmb3IgdGhlIHJlc2V0IGNoYW5uZWwKKwkgKgkgc2hvdWxkIGp1c3QgYmUga2lsbGVkIG9mZiwgaXJyZXNwZWNpdHZlIG9mIHdoZXRoZXIKKwkgKgkgd2UgYXJlIGJsb2NrZWQgb24gQVRJTyByZXNvdXJjZXMuICBXcml0ZSBhIHJvdXRpbmUKKwkgKgkgdG8gY29tcGFjdCB0aGUgdHFpbmZpZm8gYXBwcm9wcmlhdGVseS4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkgeworCQlhaGNfcnVuX3RxaW5maWZvKGFoYywgLypwYXVzZWQqL1RSVUUpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBSZXNldCB0aGUgYnVzIGlmIHdlIGFyZSBpbml0aWF0aW5nIHRoaXMgcmVzZXQKKwkgKi8KKwlzYmxrY3RsID0gYWhjX2luYihhaGMsIFNCTEtDVEwpOworCWN1cl9jaGFubmVsID0gJ0EnOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwCisJICYmICgoc2Jsa2N0bCAmIFNFTEJVU0IpICE9IDApKQorCSAgICBjdXJfY2hhbm5lbCA9ICdCJzsKKwlzY3Npc2VxID0gYWhjX2luYihhaGMsIFNDU0lTRVFfVEVNUExBVEUpOworCWlmIChjdXJfY2hhbm5lbCAhPSBjaGFubmVsKSB7CisJCS8qIENhc2UgMTogQ29tbWFuZCBmb3IgYW5vdGhlciBidXMgaXMgYWN0aXZlCisJCSAqIFN0ZWFsdGhpbHkgcmVzZXQgdGhlIG90aGVyIGJ1cyB3aXRob3V0CisJCSAqIHVwc2V0dGluZyB0aGUgY3VycmVudCBidXMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNCTEtDVEwsIHNibGtjdGwgXiBTRUxCVVNCKTsKKwkJc2ltb2RlMSA9IGFoY19pbmIoYWhjLCBTSU1PREUxKSAmIH4oRU5CVVNGUkVFfEVOU0NTSVJTVCk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJCS8qCisJCSAqIEJ1cyByZXNldHMgY2xlYXIgRU5TRUxJLCBzbyB3ZSBjYW5ub3QKKwkJICogZGVmZXIgcmUtZW5hYmxpbmcgYnVzIHJlc2V0IGludGVycnVwdHMKKwkJICogaWYgd2UgYXJlIGluIHRhcmdldCBtb2RlLgorCQkgKi8KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApCisJCQlzaW1vZGUxIHw9IEVOU0NTSVJTVDsKKyNlbmRpZgorCQlhaGNfb3V0YihhaGMsIFNJTU9ERTEsIHNpbW9kZTEpOworCQlpZiAoaW5pdGlhdGVfcmVzZXQpCisJCQlhaGNfcmVzZXRfY3VycmVudF9idXMoYWhjKTsKKwkJYWhjX2NsZWFyX2ludHN0YXQoYWhjKTsKKwkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBzY3Npc2VxICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApKTsKKwkJYWhjX291dGIoYWhjLCBTQkxLQ1RMLCBzYmxrY3RsKTsKKwkJcmVzdGFydF9uZWVkZWQgPSBGQUxTRTsKKwl9IGVsc2UgeworCQkvKiBDYXNlIDI6IEEgY29tbWFuZCBmcm9tIHRoaXMgYnVzIGlzIGFjdGl2ZSBvciB3ZSdyZSBpZGxlICovCisJCXNpbW9kZTEgPSBhaGNfaW5iKGFoYywgU0lNT0RFMSkgJiB+KEVOQlVTRlJFRXxFTlNDU0lSU1QpOworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCQkvKgorCQkgKiBCdXMgcmVzZXRzIGNsZWFyIEVOU0VMSSwgc28gd2UgY2Fubm90CisJCSAqIGRlZmVyIHJlLWVuYWJsaW5nIGJ1cyByZXNldCBpbnRlcnJ1cHRzCisJCSAqIGlmIHdlIGFyZSBpbiB0YXJnZXQgbW9kZS4KKwkJICovCisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKQorCQkJc2ltb2RlMSB8PSBFTlNDU0lSU1Q7CisjZW5kaWYKKwkJYWhjX291dGIoYWhjLCBTSU1PREUxLCBzaW1vZGUxKTsKKwkJaWYgKGluaXRpYXRlX3Jlc2V0KQorCQkJYWhjX3Jlc2V0X2N1cnJlbnRfYnVzKGFoYyk7CisJCWFoY19jbGVhcl9pbnRzdGF0KGFoYyk7CisJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgc2NzaXNlcSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSk7CisJCXJlc3RhcnRfbmVlZGVkID0gVFJVRTsKKwl9CisKKwkvKgorCSAqIENsZWFuIHVwIGFsbCB0aGUgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZQorCSAqIHBlbmRpbmcgdHJhbnNhY3Rpb25zIG9uIHRoaXMgYnVzLgorCSAqLworCWZvdW5kID0gYWhjX2Fib3J0X3NjYnMoYWhjLCBDQU1fVEFSR0VUX1dJTERDQVJELCBjaGFubmVsLAorCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCisJCQkgICAgICAgUk9MRV9VTktOT1dOLCBDQU1fU0NTSV9CVVNfUkVTRVQpOworCisJbWF4X3Njc2lpZCA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpID8gMTUgOiA3OworCisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJLyoKKwkgKiBTZW5kIGFuIGltbWVkaWF0ZSBub3RpZnkgY2NiIHRvIGFsbCB0YXJnZXQgbW9yZSBwZXJpcGhlcmFsCisJICogZHJpdmVycyBhZmZlY3RlZCBieSB0aGlzIGFjdGlvbi4KKwkgKi8KKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8PSBtYXhfc2NzaWlkOyB0YXJnZXQrKykgeworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSogdHN0YXRlOworCQl1X2ludCBsdW47CisKKwkJdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbdGFyZ2V0XTsKKwkJaWYgKHRzdGF0ZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgeworCQkJc3RydWN0IGFoY190bW9kZV9sc3RhdGUqIGxzdGF0ZTsKKworCQkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbbHVuXTsKKwkJCWlmIChsc3RhdGUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJYWhjX3F1ZXVlX2xzdGF0ZV9ldmVudChhaGMsIGxzdGF0ZSwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKKwkJCQkJICAgICAgIEVWRU5UX1RZUEVfQlVTX1JFU0VULCAvKmFyZyovMCk7CisJCQlhaGNfc2VuZF9sc3RhdGVfZXZlbnRzKGFoYywgbHN0YXRlKTsKKwkJfQorCX0KKyNlbmRpZgorCS8qIE5vdGlmeSB0aGUgWFBUIHRoYXQgYSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KKwlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8uY2hhbm5lbCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKKwkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX0JVU19SRVNFVCwgTlVMTCk7CisKKwkvKgorCSAqIFJldmVydCB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIHVudGlsIHdlIHJlbmVnb3RpYXRlLgorCSAqLworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDw9IG1heF9zY3NpaWQ7IHRhcmdldCsrKSB7CisKKwkJaWYgKGFoYy0+ZW5hYmxlZF90YXJnZXRzW3RhcmdldF0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGluaXRpYXRvciA9IDA7IGluaXRpYXRvciA8PSBtYXhfc2NzaWlkOyBpbml0aWF0b3IrKykgeworCQkJc3RydWN0IGFoY19kZXZpbmZvIGRldmluZm87CisKKwkJCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIHRhcmdldCwgaW5pdGlhdG9yLAorCQkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkJICAgIGNoYW5uZWwsIFJPTEVfVU5LTk9XTik7CisJCQlhaGNfc2V0X3dpZHRoKGFoYywgJmRldmluZm8sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisJCQkJICAgICAgQUhDX1RSQU5TX0NVUiwgLypwYXVzZWQqL1RSVUUpOworCQkJYWhjX3NldF9zeW5jcmF0ZShhaGMsICZkZXZpbmZvLCAvKnN5bmNyYXRlKi9OVUxMLAorCQkJCQkgLypwZXJpb2QqLzAsIC8qb2Zmc2V0Ki8wLAorCQkJCQkgLypwcHJfb3B0aW9ucyovMCwgQUhDX1RSQU5TX0NVUiwKKwkJCQkJIC8qcGF1c2VkKi9UUlVFKTsKKwkJfQorCX0KKworCWlmIChyZXN0YXJ0X25lZWRlZCkKKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwllbHNlCisJCWFoY191bnBhdXNlKGFoYyk7CisJcmV0dXJuIGZvdW5kOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSZXNpZHVhbCBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ2FsY3VsYXRlIHRoZSByZXNpZHVhbCBmb3IgYSBqdXN0IGNvbXBsZXRlZCBTQ0IuCisgKi8KK3ZvaWQKK2FoY19jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0IHN0YXR1c19wa3QgKnNwa3Q7CisJdWludDMyX3Qgc2dwdHI7CisJdWludDMyX3QgcmVzaWRfc2dwdHI7CisJdWludDMyX3QgcmVzaWQ7CisKKwkvKgorCSAqIDUgY2FzZXMuCisJICogMSkgTm8gcmVzaWR1YWwuCisJICogICAgU0dfUkVTSURfVkFMSUQgY2xlYXIgaW4gc2dwdHIuCisJICogMikgVHJhbnNmZXJsZXNzIGNvbW1hbmQKKwkgKiAzKSBOZXZlciBwZXJmb3JtZWQgYW55IHRyYW5zZmVycy4KKwkgKiAgICBzZ3B0ciBoYXMgU0dfRlVMTF9SRVNJRCBzZXQuCisJICogNCkgTm8gcmVzaWR1YWwgYnV0IHRhcmdldCBkaWQgbm90CisJICogICAgc2F2ZSBkYXRhIHBvaW50ZXJzIGFmdGVyIHRoZQorCSAqICAgIGxhc3QgdHJhbnNmZXIsIHNvIHNncHRyIHdhcworCSAqICAgIG5ldmVyIHVwZGF0ZWQuCisJICogNSkgV2UgaGF2ZSBhIHBhcnRpYWwgcmVzaWR1YWwuCisJICogICAgVXNlIHJlc2lkdWFsX3NncHRyIHRvIGRldGVybWluZQorCSAqICAgIHdoZXJlIHdlIGFyZS4KKwkgKi8KKworCWhzY2IgPSBzY2ItPmhzY2I7CisJc2dwdHIgPSBhaGNfbGUzMnRvaChoc2NiLT5zZ3B0cik7CisJaWYgKChzZ3B0ciAmIFNHX1JFU0lEX1ZBTElEKSA9PSAwKQorCQkvKiBDYXNlIDEgKi8KKwkJcmV0dXJuOworCXNncHRyICY9IH5TR19SRVNJRF9WQUxJRDsKKworCWlmICgoc2dwdHIgJiBTR19MSVNUX05VTEwpICE9IDApCisJCS8qIENhc2UgMiAqLworCQlyZXR1cm47CisKKwlzcGt0ID0gJmhzY2ItPnNoYXJlZF9kYXRhLnN0YXR1czsKKwlyZXNpZF9zZ3B0ciA9IGFoY19sZTMydG9oKHNwa3QtPnJlc2lkdWFsX3NnX3B0cik7CisJaWYgKChzZ3B0ciAmIFNHX0ZVTExfUkVTSUQpICE9IDApIHsKKwkJLyogQ2FzZSAzICovCisJCXJlc2lkID0gYWhjX2dldF90cmFuc2Zlcl9sZW5ndGgoc2NiKTsKKwl9IGVsc2UgaWYgKChyZXNpZF9zZ3B0ciAmIFNHX0xJU1RfTlVMTCkgIT0gMCkgeworCQkvKiBDYXNlIDQgKi8KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoKHJlc2lkX3NncHRyICYgflNHX1BUUl9NQVNLKSAhPSAwKSB7CisJCXBhbmljKCJCb2d1cyByZXNpZCBzZ3B0ciB2YWx1ZSAweCV4XG4iLCByZXNpZF9zZ3B0cik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFoY19kbWFfc2VnICpzZzsKKworCQkvKgorCQkgKiBSZW1haW5kZXIgb2YgdGhlIFNHIHdoZXJlIHRoZSB0cmFuc2ZlcgorCQkgKiBzdG9wcGVkLiAgCisJCSAqLworCQlyZXNpZCA9IGFoY19sZTMydG9oKHNwa3QtPnJlc2lkdWFsX2RhdGFjbnQpICYgQUhDX1NHX0xFTl9NQVNLOworCQlzZyA9IGFoY19zZ19idXNfdG9fdmlydChzY2IsIHJlc2lkX3NncHRyICYgU0dfUFRSX01BU0spOworCisJCS8qIFRoZSByZXNpZHVhbCBzZ19wdHIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCBzZyAqLworCQlzZy0tOworCisJCS8qCisJCSAqIEFkZCB1cCB0aGUgY29udGVudHMgb2YgYWxsIHJlc2lkdWFsCisJCSAqIFNHIHNlZ21lbnRzIHRoYXQgYXJlIGFmdGVyIHRoZSBTRyB3aGVyZQorCQkgKiB0aGUgdHJhbnNmZXIgc3RvcHBlZC4KKwkJICovCisJCXdoaWxlICgoYWhjX2xlMzJ0b2goc2ctPmxlbikgJiBBSENfRE1BX0xBU1RfU0VHKSA9PSAwKSB7CisJCQlzZysrOworCQkJcmVzaWQgKz0gYWhjX2xlMzJ0b2goc2ctPmxlbikgJiBBSENfU0dfTEVOX01BU0s7CisJCX0KKwl9CisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSA9PSAwKQorCQlhaGNfc2V0X3Jlc2lkdWFsKHNjYiwgcmVzaWQpOworCWVsc2UKKwkJYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIHJlc2lkKTsKKworI2lmZGVmIEFIQ19ERUJVRworCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUlTQykgIT0gMCkgeworCQlhaGNfcHJpbnRfcGF0aChhaGMsIHNjYik7CisJCXByaW50ZigiSGFuZGxlZCAlc1Jlc2lkdWFsIG9mICVkIGJ5dGVzXG4iLAorCQkgICAgICAgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpID8gIlNlbnNlICIgOiAiIiwgcmVzaWQpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUYXJnZXQgTW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorLyoKKyAqIEFkZCBhIHRhcmdldCBtb2RlIGV2ZW50IHRvIHRoaXMgbHVuJ3MgcXVldWUKKyAqLworc3RhdGljIHZvaWQKK2FoY19xdWV1ZV9sc3RhdGVfZXZlbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX3Rtb2RlX2xzdGF0ZSAqbHN0YXRlLAorCQkgICAgICAgdV9pbnQgaW5pdGlhdG9yX2lkLCB1X2ludCBldmVudF90eXBlLCB1X2ludCBldmVudF9hcmcpCit7CisJc3RydWN0IGFoY190bW9kZV9ldmVudCAqZXZlbnQ7CisJaW50IHBlbmRpbmc7CisKKwl4cHRfZnJlZXplX2RldnEobHN0YXRlLT5wYXRoLCAvKmNvdW50Ki8xKTsKKwlpZiAobHN0YXRlLT5ldmVudF93X2lkeCA+PSBsc3RhdGUtPmV2ZW50X3JfaWR4KQorCQlwZW5kaW5nID0gbHN0YXRlLT5ldmVudF93X2lkeCAtIGxzdGF0ZS0+ZXZlbnRfcl9pZHg7CisJZWxzZQorCQlwZW5kaW5nID0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFICsgMQorCQkJLSAobHN0YXRlLT5ldmVudF9yX2lkeCAtIGxzdGF0ZS0+ZXZlbnRfd19pZHgpOworCisJaWYgKGV2ZW50X3R5cGUgPT0gRVZFTlRfVFlQRV9CVVNfUkVTRVQKKwkgfHwgZXZlbnRfdHlwZSA9PSBNU0dfQlVTX0RFVl9SRVNFVCkgeworCQkvKgorCQkgKiBBbnkgZWFybGllciBldmVudHMgYXJlIGlycmVsZXZhbnQsIHNvIHJlc2V0IG91ciBidWZmZXIuCisJCSAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgYWxsb3dpbmcgdXMgdG8gZGVhbCB3aXRoIHJlc2V0CisJCSAqIGZsb29kcyAoYW4gZXh0ZXJuYWwgZGV2aWNlIGhvbGRpbmcgZG93biB0aGUgcmVzZXQgbGluZSkKKwkJICogd2l0aG91dCBsb3NpbmcgdGhlIGV2ZW50IHRoYXQgaXMgcmVhbGx5IGludGVyZXN0aW5nLgorCQkgKi8KKwkJbHN0YXRlLT5ldmVudF9yX2lkeCA9IDA7CisJCWxzdGF0ZS0+ZXZlbnRfd19pZHggPSAwOworCQl4cHRfcmVsZWFzZV9kZXZxKGxzdGF0ZS0+cGF0aCwgcGVuZGluZywgLypydW5xdWV1ZSovRkFMU0UpOworCX0KKworCWlmIChwZW5kaW5nID09IEFIQ19UTU9ERV9FVkVOVF9CVUZGRVJfU0laRSkgeworCQl4cHRfcHJpbnRfcGF0aChsc3RhdGUtPnBhdGgpOworCQlwcmludGYoImltbWVkaWF0ZSBldmVudCAleDoleCBsb3N0XG4iLAorCQkgICAgICAgbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF9yX2lkeF0uZXZlbnRfdHlwZSwKKwkJICAgICAgIGxzdGF0ZS0+ZXZlbnRfYnVmZmVyW2xzdGF0ZS0+ZXZlbnRfcl9pZHhdLmV2ZW50X2FyZyk7CisJCWxzdGF0ZS0+ZXZlbnRfcl9pZHgrKzsKKwkJaWYgKGxzdGF0ZS0+ZXZlbnRfcl9pZHggPT0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFKQorCQkJbHN0YXRlLT5ldmVudF9yX2lkeCA9IDA7CisJCXhwdF9yZWxlYXNlX2RldnEobHN0YXRlLT5wYXRoLCAvKmNvdW50Ki8xLCAvKnJ1bnF1ZXVlKi9GQUxTRSk7CisJfQorCisJZXZlbnQgPSAmbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF93X2lkeF07CisJZXZlbnQtPmluaXRpYXRvcl9pZCA9IGluaXRpYXRvcl9pZDsKKwlldmVudC0+ZXZlbnRfdHlwZSA9IGV2ZW50X3R5cGU7CisJZXZlbnQtPmV2ZW50X2FyZyA9IGV2ZW50X2FyZzsKKwlsc3RhdGUtPmV2ZW50X3dfaWR4Kys7CisJaWYgKGxzdGF0ZS0+ZXZlbnRfd19pZHggPT0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFKQorCQlsc3RhdGUtPmV2ZW50X3dfaWR4ID0gMDsKK30KKworLyoKKyAqIFNlbmQgYW55IHRhcmdldCBtb2RlIGV2ZW50cyBxdWV1ZWQgdXAgd2FpdGluZworICogZm9yIGltbWVkaWF0ZSBub3RpZnkgcmVzb3VyY2VzLgorICovCit2b2lkCithaGNfc2VuZF9sc3RhdGVfZXZlbnRzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY190bW9kZV9sc3RhdGUgKmxzdGF0ZSkKK3sKKwlzdHJ1Y3QgY2NiX2hkciAqY2NiaDsKKwlzdHJ1Y3QgY2NiX2ltbWVkX25vdGlmeSAqaW5vdDsKKworCXdoaWxlIChsc3RhdGUtPmV2ZW50X3JfaWR4ICE9IGxzdGF0ZS0+ZXZlbnRfd19pZHgKKwkgICAgJiYgKGNjYmggPSBTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykpICE9IE5VTEwpIHsKKwkJc3RydWN0IGFoY190bW9kZV9ldmVudCAqZXZlbnQ7CisKKwkJZXZlbnQgPSAmbHN0YXRlLT5ldmVudF9idWZmZXJbbHN0YXRlLT5ldmVudF9yX2lkeF07CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZsc3RhdGUtPmltbWVkX25vdGlmaWVzLCBzaW1fbGlua3Muc2xlKTsKKwkJaW5vdCA9IChzdHJ1Y3QgY2NiX2ltbWVkX25vdGlmeSAqKWNjYmg7CisJCXN3aXRjaCAoZXZlbnQtPmV2ZW50X3R5cGUpIHsKKwkJY2FzZSBFVkVOVF9UWVBFX0JVU19SRVNFVDoKKwkJCWNjYmgtPnN0YXR1cyA9IENBTV9TQ1NJX0JVU19SRVNFVHxDQU1fREVWX1FGUlpOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljY2JoLT5zdGF0dXMgPSBDQU1fTUVTU0FHRV9SRUNWfENBTV9ERVZfUUZSWk47CisJCQlpbm90LT5tZXNzYWdlX2FyZ3NbMF0gPSBldmVudC0+ZXZlbnRfdHlwZTsKKwkJCWlub3QtPm1lc3NhZ2VfYXJnc1sxXSA9IGV2ZW50LT5ldmVudF9hcmc7CisJCQlicmVhazsKKwkJfQorCQlpbm90LT5pbml0aWF0b3JfaWQgPSBldmVudC0+aW5pdGlhdG9yX2lkOworCQlpbm90LT5zZW5zZV9sZW4gPSAwOworCQl4cHRfZG9uZSgodW5pb24gY2NiICopaW5vdCk7CisJCWxzdGF0ZS0+ZXZlbnRfcl9pZHgrKzsKKwkJaWYgKGxzdGF0ZS0+ZXZlbnRfcl9pZHggPT0gQUhDX1RNT0RFX0VWRU5UX0JVRkZFUl9TSVpFKQorCQkJbHN0YXRlLT5ldmVudF9yX2lkeCA9IDA7CisJfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKiBTZXF1ZW5jZXIgUHJvZ3JhbSBQYXRjaGluZy9Eb3dubG9hZCAqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBBSENfRFVNUF9TRVEKK3ZvaWQKK2FoY19kdW1wc2VxKHN0cnVjdCBhaGNfc29mdGMqIGFoYykKK3sKKwlpbnQgaTsKKworCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIwLCAwKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIxLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZTsgaSsrKSB7CisJCXVpbnQ4X3QgaW5zX2J5dGVzWzRdOworCisJCWFoY19pbnNiKGFoYywgU0VRUkFNLCBpbnNfYnl0ZXMsIDQpOworCQlwcmludGYoIjB4JTA4eFxuIiwgaW5zX2J5dGVzWzBdIDw8IDI0CisJCQkJIHwgaW5zX2J5dGVzWzFdIDw8IDE2CisJCQkJIHwgaW5zX2J5dGVzWzJdIDw8IDgKKwkJCQkgfCBpbnNfYnl0ZXNbM10pOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50CithaGNfbG9hZHNlcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0CWNzIGNzX3RhYmxlW251bV9jcml0aWNhbF9zZWN0aW9uc107CisJdV9pbnQJYmVnaW5fc2V0W251bV9jcml0aWNhbF9zZWN0aW9uc107CisJdV9pbnQJZW5kX3NldFtudW1fY3JpdGljYWxfc2VjdGlvbnNdOworCXN0cnVjdAlwYXRjaCAqY3VyX3BhdGNoOworCXVfaW50CWNzX2NvdW50OworCXVfaW50CWN1cl9jczsKKwl1X2ludAlpOworCXVfaW50CXNraXBfYWRkcjsKKwl1X2ludAlzZ19wcmVmZXRjaF9jbnQ7CisJaW50CWRvd25sb2FkZWQ7CisJdWludDhfdAlkb3dubG9hZF9jb25zdHNbN107CisKKwkvKgorCSAqIFN0YXJ0IG91dCB3aXRoIDAgY3JpdGljYWwgc2VjdGlvbnMKKwkgKiB0aGF0IGFwcGx5IHRvIHRoaXMgZmlybXdhcmUgbG9hZC4KKwkgKi8KKwljc19jb3VudCA9IDA7CisJY3VyX2NzID0gMDsKKwltZW1zZXQoYmVnaW5fc2V0LCAwLCBzaXplb2YoYmVnaW5fc2V0KSk7CisJbWVtc2V0KGVuZF9zZXQsIDAsIHNpemVvZihlbmRfc2V0KSk7CisKKwkvKiBTZXR1cCBkb3dubG9hZGFibGUgY29uc3RhbnQgdGFibGUgKi8KKwlkb3dubG9hZF9jb25zdHNbUU9VVEZJRk9fT0ZGU0VUXSA9IDA7CisJaWYgKGFoYy0+dGFyZ2V0Y21kcyAhPSBOVUxMKQorCQlkb3dubG9hZF9jb25zdHNbUU9VVEZJRk9fT0ZGU0VUXSArPSAzMjsKKwlkb3dubG9hZF9jb25zdHNbUUlORklGT19PRkZTRVRdID0gZG93bmxvYWRfY29uc3RzW1FPVVRGSUZPX09GRlNFVF0gKyAxOworCWRvd25sb2FkX2NvbnN0c1tDQUNIRVNJWkVfTUFTS10gPSBhaGMtPnBjaV9jYWNoZXNpemUgLSAxOworCWRvd25sb2FkX2NvbnN0c1tJTlZFUlRFRF9DQUNIRVNJWkVfTUFTS10gPSB+KGFoYy0+cGNpX2NhY2hlc2l6ZSAtIDEpOworCXNnX3ByZWZldGNoX2NudCA9IGFoYy0+cGNpX2NhY2hlc2l6ZTsKKwlpZiAoc2dfcHJlZmV0Y2hfY250IDwgKDIgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSkpCisJCXNnX3ByZWZldGNoX2NudCA9IDIgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKTsKKwlkb3dubG9hZF9jb25zdHNbU0dfUFJFRkVUQ0hfQ05UXSA9IHNnX3ByZWZldGNoX2NudDsKKwlkb3dubG9hZF9jb25zdHNbU0dfUFJFRkVUQ0hfQUxJR05fTUFTS10gPSB+KHNnX3ByZWZldGNoX2NudCAtIDEpOworCWRvd25sb2FkX2NvbnN0c1tTR19QUkVGRVRDSF9BRERSX01BU0tdID0gKHNnX3ByZWZldGNoX2NudCAtIDEpOworCisJY3VyX3BhdGNoID0gcGF0Y2hlczsKKwlkb3dubG9hZGVkID0gMDsKKwlza2lwX2FkZHIgPSAwOworCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERXxMT0FEUkFNKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIwLCAwKTsKKwlhaGNfb3V0YihhaGMsIFNFUUFERFIxLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2VxcHJvZykvNDsgaSsrKSB7CisJCWlmIChhaGNfY2hlY2tfcGF0Y2goYWhjLCAmY3VyX3BhdGNoLCBpLCAmc2tpcF9hZGRyKSA9PSAwKSB7CisJCQkvKgorCQkJICogRG9uJ3QgZG93bmxvYWQgdGhpcyBpbnN0cnVjdGlvbiBhcyBpdAorCQkJICogaXMgaW4gYSBwYXRjaCB0aGF0IHdhcyByZW1vdmVkLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkb3dubG9hZGVkID09IGFoYy0+aW5zdHJ1Y3Rpb25fcmFtX3NpemUpIHsKKwkJCS8qCisJCQkgKiBXZSdyZSBhYm91dCB0byBleGNlZWQgdGhlIGluc3RydWN0aW9uCisJCQkgKiBzdG9yYWdlIGNhcGFjaXR5IGZvciB0aGlzIGNoaXAuICBGYWlsCisJCQkgKiB0aGUgbG9hZC4KKwkJCSAqLworCQkJcHJpbnRmKCJcbiVzOiBQcm9ncmFtIHRvbyBsYXJnZSBmb3IgaW5zdHJ1Y3Rpb24gbWVtb3J5ICIKKwkJCSAgICAgICAic2l6ZSBvZiAlZCFcbiIsIGFoY19uYW1lKGFoYyksCisJCQkgICAgICAgYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKworCQkvKgorCQkgKiBNb3ZlIHRocm91Z2ggdGhlIENTIHRhYmxlIHVudGlsIHdlIGZpbmQgYSBDUworCQkgKiB0aGF0IG1pZ2h0IGFwcGx5IHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisJCSAqLworCQlmb3IgKDsgY3VyX2NzIDwgbnVtX2NyaXRpY2FsX3NlY3Rpb25zOyBjdXJfY3MrKykgeworCQkJaWYgKGNyaXRpY2FsX3NlY3Rpb25zW2N1cl9jc10uZW5kIDw9IGkpIHsKKwkJCQlpZiAoYmVnaW5fc2V0W2NzX2NvdW50XSA9PSBUUlVFCisJCQkJICYmIGVuZF9zZXRbY3NfY291bnRdID09IEZBTFNFKSB7CisJCQkJCWNzX3RhYmxlW2NzX2NvdW50XS5lbmQgPSBkb3dubG9hZGVkOworCQkJCSAJZW5kX3NldFtjc19jb3VudF0gPSBUUlVFOworCQkJCQljc19jb3VudCsrOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjcml0aWNhbF9zZWN0aW9uc1tjdXJfY3NdLmJlZ2luIDw9IGkKKwkJCSAmJiBiZWdpbl9zZXRbY3NfY291bnRdID09IEZBTFNFKSB7CisJCQkJY3NfdGFibGVbY3NfY291bnRdLmJlZ2luID0gZG93bmxvYWRlZDsKKwkJCQliZWdpbl9zZXRbY3NfY291bnRdID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWFoY19kb3dubG9hZF9pbnN0cihhaGMsIGksIGRvd25sb2FkX2NvbnN0cyk7CisJCWRvd25sb2FkZWQrKzsKKwl9CisKKwlhaGMtPm51bV9jcml0aWNhbF9zZWN0aW9ucyA9IGNzX2NvdW50OworCWlmIChjc19jb3VudCAhPSAwKSB7CisKKwkJY3NfY291bnQgKj0gc2l6ZW9mKHN0cnVjdCBjcyk7CisJCWFoYy0+Y3JpdGljYWxfc2VjdGlvbnMgPSBtYWxsb2MoY3NfY291bnQsIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChhaGMtPmNyaXRpY2FsX3NlY3Rpb25zID09IE5VTEwpCisJCQlwYW5pYygiYWhjX2xvYWRzZXE6IENvdWxkIG5vdCBtYWxsb2MiKTsKKwkJbWVtY3B5KGFoYy0+Y3JpdGljYWxfc2VjdGlvbnMsIGNzX3RhYmxlLCBjc19jb3VudCk7CisJfQorCWFoY19vdXRiKGFoYywgU0VRQ1RMLCBQRVJST1JESVN8RkFJTERJU3xGQVNUTU9ERSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCIgJWQgaW5zdHJ1Y3Rpb25zIGRvd25sb2FkZWRcbiIsIGRvd25sb2FkZWQpOworCQlwcmludGYoIiVzOiBGZWF0dXJlcyAweCV4LCBCdWdzIDB4JXgsIEZsYWdzIDB4JXhcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpLCBhaGMtPmZlYXR1cmVzLCBhaGMtPmJ1Z3MsIGFoYy0+ZmxhZ3MpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfY2hlY2tfcGF0Y2goc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgcGF0Y2ggKipzdGFydF9wYXRjaCwKKwkJdV9pbnQgc3RhcnRfaW5zdHIsIHVfaW50ICpza2lwX2FkZHIpCit7CisJc3RydWN0CXBhdGNoICpjdXJfcGF0Y2g7CisJc3RydWN0CXBhdGNoICpsYXN0X3BhdGNoOworCXVfaW50CW51bV9wYXRjaGVzOworCisJbnVtX3BhdGNoZXMgPSBzaXplb2YocGF0Y2hlcykvc2l6ZW9mKHN0cnVjdCBwYXRjaCk7CisJbGFzdF9wYXRjaCA9ICZwYXRjaGVzW251bV9wYXRjaGVzXTsKKwljdXJfcGF0Y2ggPSAqc3RhcnRfcGF0Y2g7CisKKwl3aGlsZSAoY3VyX3BhdGNoIDwgbGFzdF9wYXRjaCAmJiBzdGFydF9pbnN0ciA9PSBjdXJfcGF0Y2gtPmJlZ2luKSB7CisKKwkJaWYgKGN1cl9wYXRjaC0+cGF0Y2hfZnVuYyhhaGMpID09IDApIHsKKworCQkJLyogU3RhcnQgcmVqZWN0aW5nIGNvZGUgKi8KKwkJCSpza2lwX2FkZHIgPSBzdGFydF9pbnN0ciArIGN1cl9wYXRjaC0+c2tpcF9pbnN0cjsKKwkJCWN1cl9wYXRjaCArPSBjdXJfcGF0Y2gtPnNraXBfcGF0Y2g7CisJCX0gZWxzZSB7CisJCQkvKiBBY2NlcHRlZCB0aGlzIHBhdGNoLiAgQWR2YW5jZSB0byB0aGUgbmV4dAorCQkJICogb25lIGFuZCB3YWl0IGZvciBvdXIgaW50cnVjdGlvbiBwb2ludGVyIHRvCisJCQkgKiBoaXQgdGhpcyBwb2ludC4KKwkJCSAqLworCQkJY3VyX3BhdGNoKys7CisJCX0KKwl9CisKKwkqc3RhcnRfcGF0Y2ggPSBjdXJfcGF0Y2g7CisJaWYgKHN0YXJ0X2luc3RyIDwgKnNraXBfYWRkcikKKwkJLyogU3RpbGwgc2tpcHBpbmcgKi8KKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfZG93bmxvYWRfaW5zdHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBpbnN0cnB0ciwgdWludDhfdCAqZGNvbnN0cykKK3sKKwl1bmlvbglpbnNfZm9ybWF0cyBpbnN0cjsKKwlzdHJ1Y3QJaW5zX2Zvcm1hdDEgKmZtdDFfaW5zOworCXN0cnVjdAlpbnNfZm9ybWF0MyAqZm10M19pbnM7CisJdV9pbnQJb3Bjb2RlOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUgaXMgYWx3YXlzIGNvbXBpbGVkIGludG8gYSBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKwkgKi8KKwlpbnN0ci5pbnRlZ2VyID0gYWhjX2xlMzJ0b2goKih1aW50MzJfdCopJnNlcXByb2dbaW5zdHJwdHIgKiA0XSk7CisKKwlmbXQxX2lucyA9ICZpbnN0ci5mb3JtYXQxOworCWZtdDNfaW5zID0gTlVMTDsKKworCS8qIFB1bGwgdGhlIG9wY29kZSAqLworCW9wY29kZSA9IGluc3RyLmZvcm1hdDEub3Bjb2RlOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBSUNfT1BfSk1QOgorCWNhc2UgQUlDX09QX0pDOgorCWNhc2UgQUlDX09QX0pOQzoKKwljYXNlIEFJQ19PUF9DQUxMOgorCWNhc2UgQUlDX09QX0pORToKKwljYXNlIEFJQ19PUF9KTlo6CisJY2FzZSBBSUNfT1BfSkU6CisJY2FzZSBBSUNfT1BfSlo6CisJeworCQlzdHJ1Y3QgcGF0Y2ggKmN1cl9wYXRjaDsKKwkJaW50IGFkZHJlc3Nfb2Zmc2V0OworCQl1X2ludCBhZGRyZXNzOworCQl1X2ludCBza2lwX2FkZHI7CisJCXVfaW50IGk7CisKKwkJZm10M19pbnMgPSAmaW5zdHIuZm9ybWF0MzsKKwkJYWRkcmVzc19vZmZzZXQgPSAwOworCQlhZGRyZXNzID0gZm10M19pbnMtPmFkZHJlc3M7CisJCWN1cl9wYXRjaCA9IHBhdGNoZXM7CisJCXNraXBfYWRkciA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGFkZHJlc3M7KSB7CisKKwkJCWFoY19jaGVja19wYXRjaChhaGMsICZjdXJfcGF0Y2gsIGksICZza2lwX2FkZHIpOworCisJCQlpZiAoc2tpcF9hZGRyID4gaSkgeworCQkJCWludCBlbmRfYWRkcjsKKworCQkJCWVuZF9hZGRyID0gTUlOKGFkZHJlc3MsIHNraXBfYWRkcik7CisJCQkJYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOworCQkJCWkgPSBza2lwX2FkZHI7CisJCQl9IGVsc2UgeworCQkJCWkrKzsKKwkJCX0KKwkJfQorCQlhZGRyZXNzIC09IGFkZHJlc3Nfb2Zmc2V0OworCQlmbXQzX2lucy0+YWRkcmVzcyA9IGFkZHJlc3M7CisJCS8qIEZBTExUSFJPVUdIICovCisJfQorCWNhc2UgQUlDX09QX09SOgorCWNhc2UgQUlDX09QX0FORDoKKwljYXNlIEFJQ19PUF9YT1I6CisJY2FzZSBBSUNfT1BfQUREOgorCWNhc2UgQUlDX09QX0FEQzoKKwljYXNlIEFJQ19PUF9CTU9WOgorCQlpZiAoZm10MV9pbnMtPnBhcml0eSAhPSAwKSB7CisJCQlmbXQxX2lucy0+aW1tZWRpYXRlID0gZGNvbnN0c1tmbXQxX2lucy0+aW1tZWRpYXRlXTsKKwkJfQorCQlmbXQxX2lucy0+cGFyaXR5ID0gMDsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwCisJCSAmJiBvcGNvZGUgPT0gQUlDX09QX0JNT1YpIHsKKwkJCS8qCisJCQkgKiBCbG9jayBtb3ZlIHdhcyBhZGRlZCBhdCB0aGUgc2FtZSB0aW1lCisJCQkgKiBhcyB0aGUgY29tbWFuZCBjaGFubmVsLiAgVmVyaWZ5IHRoYXQKKwkJCSAqIHRoaXMgaXMgb25seSBhIG1vdmUgb2YgYSBzaW5nbGUgZWxlbWVudAorCQkJICogYW5kIGNvbnZlcnQgdGhlIEJNT1YgdG8gYSBNT1YKKwkJCSAqIChBTkQgd2l0aCBhbiBpbW1lZGlhdGUgb2YgRkYpLgorCQkJICovCisJCQlpZiAoZm10MV9pbnMtPmltbWVkaWF0ZSAhPSAxKQorCQkJCXBhbmljKCIlczogQk1PViBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCSAgICAgIGFoY19uYW1lKGFoYykpOworCQkJZm10MV9pbnMtPm9wY29kZSA9IEFJQ19PUF9BTkQ7CisJCQlmbXQxX2lucy0+aW1tZWRpYXRlID0gMHhmZjsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgQUlDX09QX1JPTDoKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJaW50IGksIGNvdW50OworCisJCQkvKiBDYWxjdWxhdGUgb2RkIHBhcml0eSBmb3IgdGhlIGluc3RydWN0aW9uICovCisJCQlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCAzMTsgaSsrKSB7CisJCQkJdWludDMyX3QgbWFzazsKKworCQkJCW1hc2sgPSAweDAxIDw8IGk7CisJCQkJaWYgKChpbnN0ci5pbnRlZ2VyICYgbWFzaykgIT0gMCkKKwkJCQkJY291bnQrKzsKKwkJCX0KKwkJCWlmICgoY291bnQgJiAweDAxKSA9PSAwKQorCQkJCWluc3RyLmZvcm1hdDEucGFyaXR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIENvbXByZXNzIHRoZSBpbnN0cnVjdGlvbiBmb3Igb2xkZXIgc2VxdWVuY2VycyAqLworCQkJaWYgKGZtdDNfaW5zICE9IE5VTEwpIHsKKwkJCQlpbnN0ci5pbnRlZ2VyID0KKwkJCQkJZm10M19pbnMtPmltbWVkaWF0ZQorCQkJCSAgICAgIHwgKGZtdDNfaW5zLT5zb3VyY2UgPDwgOCkKKwkJCQkgICAgICB8IChmbXQzX2lucy0+YWRkcmVzcyA8PCAxNikKKwkJCQkgICAgICB8CShmbXQzX2lucy0+b3Bjb2RlIDw8IDI1KTsKKwkJCX0gZWxzZSB7CisJCQkJaW5zdHIuaW50ZWdlciA9CisJCQkJCWZtdDFfaW5zLT5pbW1lZGlhdGUKKwkJCQkgICAgICB8IChmbXQxX2lucy0+c291cmNlIDw8IDgpCisJCQkJICAgICAgfCAoZm10MV9pbnMtPmRlc3RpbmF0aW9uIDw8IDE2KQorCQkJCSAgICAgIHwJKGZtdDFfaW5zLT5yZXQgPDwgMjQpCisJCQkJICAgICAgfAkoZm10MV9pbnMtPm9wY29kZSA8PCAyNSk7CisJCQl9CisJCX0KKwkJLyogVGhlIHNlcXVlbmNlciBpcyBhIGxpdHRsZSBlbmRpYW4gY3B1ICovCisJCWluc3RyLmludGVnZXIgPSBhaGNfaHRvbGUzMihpbnN0ci5pbnRlZ2VyKTsKKwkJYWhjX291dHNiKGFoYywgU0VRUkFNLCBpbnN0ci5ieXRlcywgNCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJVbmtub3duIG9wY29kZSBlbmNvdW50ZXJlZCBpbiBzZXEgcHJvZ3JhbSIpOworCQlicmVhazsKKwl9Cit9CisKK2ludAorYWhjX3ByaW50X3JlZ2lzdGVyKGFoY19yZWdfcGFyc2VfZW50cnlfdCAqdGFibGUsIHVfaW50IG51bV9lbnRyaWVzLAorCQkgICBjb25zdCBjaGFyICpuYW1lLCB1X2ludCBhZGRyZXNzLCB1X2ludCB2YWx1ZSwKKwkJICAgdV9pbnQgKmN1cl9jb2x1bW4sIHVfaW50IHdyYXBfcG9pbnQpCit7CisJaW50CXByaW50ZWQ7CisJdV9pbnQJcHJpbnRlZF9tYXNrOworCisJaWYgKGN1cl9jb2x1bW4gIT0gTlVMTCAmJiAqY3VyX2NvbHVtbiA+PSB3cmFwX3BvaW50KSB7CisJCXByaW50ZigiXG4iKTsKKwkJKmN1cl9jb2x1bW4gPSAwOworCX0KKwlwcmludGVkID0gcHJpbnRmKCIlc1sweCV4XSIsIG5hbWUsIHZhbHVlKTsKKwlpZiAodGFibGUgPT0gTlVMTCkgeworCQlwcmludGVkICs9IHByaW50ZigiICIpOworCQkqY3VyX2NvbHVtbiArPSBwcmludGVkOworCQlyZXR1cm4gKHByaW50ZWQpOworCX0KKwlwcmludGVkX21hc2sgPSAwOworCXdoaWxlIChwcmludGVkX21hc2sgIT0gMHhGRikgeworCQlpbnQgZW50cnk7CisKKwkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgbnVtX2VudHJpZXM7IGVudHJ5KyspIHsKKwkJCWlmICgoKHZhbHVlICYgdGFibGVbZW50cnldLm1hc2spCisJCQkgICE9IHRhYmxlW2VudHJ5XS52YWx1ZSkKKwkJCSB8fCAoKHByaW50ZWRfbWFzayAmIHRhYmxlW2VudHJ5XS5tYXNrKQorCQkJICA9PSB0YWJsZVtlbnRyeV0ubWFzaykpCisJCQkJY29udGludWU7CisKKwkJCXByaW50ZWQgKz0gcHJpbnRmKCIlcyVzIiwKKwkJCQkJICBwcmludGVkX21hc2sgPT0gMCA/ICI6KCIgOiAifCIsCisJCQkJCSAgdGFibGVbZW50cnldLm5hbWUpOworCQkJcHJpbnRlZF9tYXNrIHw9IHRhYmxlW2VudHJ5XS5tYXNrOworCQkJCisJCQlicmVhazsKKwkJfQorCQlpZiAoZW50cnkgPj0gbnVtX2VudHJpZXMpCisJCQlicmVhazsKKwl9CisJaWYgKHByaW50ZWRfbWFzayAhPSAwKQorCQlwcmludGVkICs9IHByaW50ZigiKSAiKTsKKwllbHNlCisJCXByaW50ZWQgKz0gcHJpbnRmKCIgIik7CisJaWYgKGN1cl9jb2x1bW4gIT0gTlVMTCkKKwkJKmN1cl9jb2x1bW4gKz0gcHJpbnRlZDsKKwlyZXR1cm4gKHByaW50ZWQpOworfQorCit2b2lkCithaGNfZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QJc2NiICpzY2I7CisJc3RydWN0CXNjYl90YWlscSAqdW50YWdnZWRfcTsKKwl1X2ludAljdXJfY29sOworCWludAlwYXVzZWQ7CisJaW50CXRhcmdldDsKKwlpbnQJbWF4dGFyZ2V0OworCWludAlpOworCXVpbnQ4X3QgbGFzdF9waGFzZTsKKwl1aW50OF90IHFpbnBvczsKKwl1aW50OF90IHFpbnRhaWw7CisJdWludDhfdCBxb3V0cG9zOworCXVpbnQ4X3Qgc2NiX2luZGV4OworCXVpbnQ4X3Qgc2F2ZWRfc2NicHRyOworCisJaWYgKGFoY19pc19wYXVzZWQoYWhjKSkgeworCQlwYXVzZWQgPSAxOworCX0gZWxzZSB7CisJCXBhdXNlZCA9IDA7CisJCWFoY19wYXVzZShhaGMpOworCX0KKworCXNhdmVkX3NjYnB0ciA9IGFoY19pbmIoYWhjLCBTQ0JQVFIpOworCWxhc3RfcGhhc2UgPSBhaGNfaW5iKGFoYywgTEFTVFBIQVNFKTsKKwlwcmludGYoIj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBEdW1wIENhcmQgU3RhdGUgQmVnaW5zIDw8PDw8PDw8PDw8PDw8PDw8XG4iCisJICAgICAgICIlczogRHVtcGluZyBDYXJkIFN0YXRlICVzLCBhdCBTRVFBRERSIDB4JXhcbiIsCisJICAgICAgIGFoY19uYW1lKGFoYyksIGFoY19sb29rdXBfcGhhc2VfZW50cnkobGFzdF9waGFzZSktPnBoYXNlbXNnLAorCSAgICAgICBhaGNfaW5iKGFoYywgU0VRQUREUjApIHwgKGFoY19pbmIoYWhjLCBTRVFBRERSMSkgPDwgOCkpOworCWlmIChwYXVzZWQpCisJCXByaW50ZigiQ2FyZCB3YXMgcGF1c2VkXG4iKTsKKwlwcmludGYoIkFDQ1VNID0gMHgleCwgU0lOREVYID0gMHgleCwgRElOREVYID0gMHgleCwgQVJHXzIgPSAweCV4XG4iLAorCSAgICAgICBhaGNfaW5iKGFoYywgQUNDVU0pLCBhaGNfaW5iKGFoYywgU0lOREVYKSwgYWhjX2luYihhaGMsIERJTkRFWCksCisJICAgICAgIGFoY19pbmIoYWhjLCBBUkdfMikpOworCXByaW50ZigiSENOVCA9IDB4JXggU0NCUFRSID0gMHgleFxuIiwgYWhjX2luYihhaGMsIEhDTlQpLAorCSAgICAgICBhaGNfaW5iKGFoYywgU0NCUFRSKSk7CisJY3VyX2NvbCA9IDA7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKQorCQlhaGNfc2NzaXBoYXNlX3ByaW50KGFoY19pbmIoYWhjLCBTQ1NJUEhBU0UpLCAmY3VyX2NvbCwgNTApOworCWFoY19zY3Npc2lnaV9wcmludChhaGNfaW5iKGFoYywgU0NTSVNJR0kpLCAmY3VyX2NvbCwgNTApOworCWFoY19lcnJvcl9wcmludChhaGNfaW5iKGFoYywgRVJST1IpLCAmY3VyX2NvbCwgNTApOworCWFoY19zY3NpYnVzbF9wcmludChhaGNfaW5iKGFoYywgU0NTSUJVU0wpLCAmY3VyX2NvbCwgNTApOworCWFoY19sYXN0cGhhc2VfcHJpbnQoYWhjX2luYihhaGMsIExBU1RQSEFTRSksICZjdXJfY29sLCA1MCk7CisJYWhjX3Njc2lzZXFfcHJpbnQoYWhjX2luYihhaGMsIFNDU0lTRVEpLCAmY3VyX2NvbCwgNTApOworCWFoY19zYmxrY3RsX3ByaW50KGFoY19pbmIoYWhjLCBTQkxLQ1RMKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc2NzaXJhdGVfcHJpbnQoYWhjX2luYihhaGMsIFNDU0lSQVRFKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc2VxY3RsX3ByaW50KGFoY19pbmIoYWhjLCBTRVFDVEwpLCAmY3VyX2NvbCwgNTApOworCWFoY19zZXFfZmxhZ3NfcHJpbnQoYWhjX2luYihhaGMsIFNFUV9GTEFHUyksICZjdXJfY29sLCA1MCk7CisJYWhjX3NzdGF0MF9wcmludChhaGNfaW5iKGFoYywgU1NUQVQwKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc3N0YXQxX3ByaW50KGFoY19pbmIoYWhjLCBTU1RBVDEpLCAmY3VyX2NvbCwgNTApOworCWFoY19zc3RhdDJfcHJpbnQoYWhjX2luYihhaGMsIFNTVEFUMiksICZjdXJfY29sLCA1MCk7CisJYWhjX3NzdGF0M19wcmludChhaGNfaW5iKGFoYywgU1NUQVQzKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfc2ltb2RlMF9wcmludChhaGNfaW5iKGFoYywgU0lNT0RFMCksICZjdXJfY29sLCA1MCk7CisJYWhjX3NpbW9kZTFfcHJpbnQoYWhjX2luYihhaGMsIFNJTU9ERTEpLCAmY3VyX2NvbCwgNTApOworCWFoY19zeGZyY3RsMF9wcmludChhaGNfaW5iKGFoYywgU1hGUkNUTDApLCAmY3VyX2NvbCwgNTApOworCWFoY19kZmNudHJsX3ByaW50KGFoY19pbmIoYWhjLCBERkNOVFJMKSwgJmN1cl9jb2wsIDUwKTsKKwlhaGNfZGZzdGF0dXNfcHJpbnQoYWhjX2luYihhaGMsIERGU1RBVFVTKSwgJmN1cl9jb2wsIDUwKTsKKwlpZiAoY3VyX2NvbCAhPSAwKQorCQlwcmludGYoIlxuIik7CisJcHJpbnRmKCJTVEFDSzoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1RBQ0tfU0laRTsgaSsrKQorCSAgICAgICBwcmludGYoIiAweCV4IiwgYWhjX2luYihhaGMsIFNUQUNLKXwoYWhjX2luYihhaGMsIFNUQUNLKSA8PCA4KSk7CisJcHJpbnRmKCJcblNDQiBjb3VudCA9ICVkXG4iLCBhaGMtPnNjYl9kYXRhLT5udW1zY2JzKTsKKwlwcmludGYoIktlcm5lbCBORVhUUVNDQiA9ICVkXG4iLCBhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYi0+dGFnKTsKKwlwcmludGYoIkNhcmQgTkVYVFFTQ0IgPSAlZFxuIiwgYWhjX2luYihhaGMsIE5FWFRfUVVFVUVEX1NDQikpOworCS8qIFFJTkZJRk8gKi8KKwlwcmludGYoIlFJTkZJRk8gZW50cmllczogIik7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJcWlucG9zID0gYWhjX2luYihhaGMsIFNOU0NCX1FPRkYpOworCQlhaGNfb3V0YihhaGMsIFNOU0NCX1FPRkYsIHFpbnBvcyk7CisJfSBlbHNlCisJCXFpbnBvcyA9IGFoY19pbmIoYWhjLCBRSU5QT1MpOworCXFpbnRhaWwgPSBhaGMtPnFpbmZpZm9uZXh0OworCXdoaWxlIChxaW5wb3MgIT0gcWludGFpbCkgeworCQlwcmludGYoIiVkICIsIGFoYy0+cWluZmlmb1txaW5wb3NdKTsKKwkJcWlucG9zKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiV2FpdGluZyBRdWV1ZSBlbnRyaWVzOiAiKTsKKwlzY2JfaW5kZXggPSBhaGNfaW5iKGFoYywgV0FJVElOR19TQ0JIKTsKKwlpID0gMDsKKwl3aGlsZSAoc2NiX2luZGV4ICE9IFNDQl9MSVNUX05VTEwgJiYgaSsrIDwgMjU2KSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkOiVkICIsIHNjYl9pbmRleCwgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJEaXNjb25uZWN0ZWQgUXVldWUgZW50cmllczogIik7CisJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKKwlpID0gMDsKKwl3aGlsZSAoc2NiX2luZGV4ICE9IFNDQl9MSVNUX05VTEwgJiYgaSsrIDwgMjU2KSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzY2JfaW5kZXgpOworCQlwcmludGYoIiVkOiVkICIsIHNjYl9pbmRleCwgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCQkKKwlhaGNfc3luY19xb3V0ZmlmbyhhaGMsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwlwcmludGYoIlFPVVRGSUZPIGVudHJpZXM6ICIpOworCXFvdXRwb3MgPSBhaGMtPnFvdXRmaWZvbmV4dDsKKwlpID0gMDsKKwl3aGlsZSAoYWhjLT5xb3V0Zmlmb1txb3V0cG9zXSAhPSBTQ0JfTElTVF9OVUxMICYmIGkrKyA8IDI1NikgeworCQlwcmludGYoIiVkICIsIGFoYy0+cW91dGZpZm9bcW91dHBvc10pOworCQlxb3V0cG9zKys7CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiU2VxdWVuY2VyIEZyZWUgU0NCIExpc3Q6ICIpOworCXNjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBGUkVFX1NDQkgpOworCWkgPSAwOworCXdoaWxlIChzY2JfaW5kZXggIT0gU0NCX0xJU1RfTlVMTCAmJiBpKysgPCAyNTYpIHsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNjYl9pbmRleCk7CisJCXByaW50ZigiJWQgIiwgc2NiX2luZGV4KTsKKwkJc2NiX2luZGV4ID0gYWhjX2luYihhaGMsIFNDQl9ORVhUKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJcHJpbnRmKCJTZXF1ZW5jZXIgU0NCIEluZm86ICIpOworCWZvciAoaSA9IDA7IGkgPCBhaGMtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKSB7CisJCWFoY19vdXRiKGFoYywgU0NCUFRSLCBpKTsKKwkJY3VyX2NvbCA9IHByaW50ZigiXG4lM2QgIiwgaSk7CisKKwkJYWhjX3NjYl9jb250cm9sX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfQ09OVFJPTCksICZjdXJfY29sLCA2MCk7CisJCWFoY19zY2Jfc2NzaWlkX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfU0NTSUlEKSwgJmN1cl9jb2wsIDYwKTsKKwkJYWhjX3NjYl9sdW5fcHJpbnQoYWhjX2luYihhaGMsIFNDQl9MVU4pLCAmY3VyX2NvbCwgNjApOworCQlhaGNfc2NiX3RhZ19wcmludChhaGNfaW5iKGFoYywgU0NCX1RBRyksICZjdXJfY29sLCA2MCk7CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiUGVuZGluZyBsaXN0OiAiKTsKKwlpID0gMDsKKwlMSVNUX0ZPUkVBQ0goc2NiLCAmYWhjLT5wZW5kaW5nX3NjYnMsIHBlbmRpbmdfbGlua3MpIHsKKwkJaWYgKGkrKyA+IDI1NikKKwkJCWJyZWFrOworCQljdXJfY29sID0gcHJpbnRmKCJcbiUzZCAiLCBzY2ItPmhzY2ItPnRhZyk7CisJCWFoY19zY2JfY29udHJvbF9wcmludChzY2ItPmhzY2ItPmNvbnRyb2wsICZjdXJfY29sLCA2MCk7CisJCWFoY19zY2Jfc2NzaWlkX3ByaW50KHNjYi0+aHNjYi0+c2NzaWlkLCAmY3VyX2NvbCwgNjApOworCQlhaGNfc2NiX2x1bl9wcmludChzY2ItPmhzY2ItPmx1biwgJmN1cl9jb2wsIDYwKTsKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSA9PSAwKSB7CisJCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgc2NiLT5oc2NiLT50YWcpOworCQkJcHJpbnRmKCIoIik7CisJCQlhaGNfc2NiX2NvbnRyb2xfcHJpbnQoYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKSwKKwkJCQkJICAgICAgJmN1cl9jb2wsIDYwKTsKKwkJCWFoY19zY2JfdGFnX3ByaW50KGFoY19pbmIoYWhjLCBTQ0JfVEFHKSwgJmN1cl9jb2wsIDYwKTsKKwkJCXByaW50ZigiKSIpOworCQl9CisJfQorCXByaW50ZigiXG4iKTsKKworCXByaW50ZigiS2VybmVsIEZyZWUgU0NCIGxpc3Q6ICIpOworCWkgPSAwOworCVNMSVNUX0ZPUkVBQ0goc2NiLCAmYWhjLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBsaW5rcy5zbGUpIHsKKwkJaWYgKGkrKyA+IDI1NikKKwkJCWJyZWFrOworCQlwcmludGYoIiVkICIsIHNjYi0+aHNjYi0+dGFnKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJbWF4dGFyZ2V0ID0gKGFoYy0+ZmVhdHVyZXMgJiAoQUhDX1dJREV8QUhDX1RXSU4pKSA/IDE1IDogNzsKKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8PSBtYXh0YXJnZXQ7IHRhcmdldCsrKSB7CisJCXVudGFnZ2VkX3EgPSAmYWhjLT51bnRhZ2dlZF9xdWV1ZXNbdGFyZ2V0XTsKKwkJaWYgKFRBSUxRX0ZJUlNUKHVudGFnZ2VkX3EpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCJVbnRhZ2dlZCBRKCVkKTogIiwgdGFyZ2V0KTsKKwkJaSA9IDA7CisJCVRBSUxRX0ZPUkVBQ0goc2NiLCB1bnRhZ2dlZF9xLCBsaW5rcy50cWUpIHsKKwkJCWlmIChpKysgPiAyNTYpCisJCQkJYnJlYWs7CisJCQlwcmludGYoIiVkICIsIHNjYi0+aHNjYi0+dGFnKTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisJYWhjX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCXByaW50ZigiXG48PDw8PDw8PDw8PDw8PDw8PCBEdW1wIENhcmQgU3RhdGUgRW5kcyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOworCWFoY19vdXRiKGFoYywgU0NCUFRSLCBzYXZlZF9zY2JwdHIpOworCWlmIChwYXVzZWQgPT0gMCkKKwkJYWhjX3VucGF1c2UoYWhjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBBSENfVEFSR0VUX01PREUKK2NhbV9zdGF0dXMKK2FoY19maW5kX3Rtb2RlX2RldnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYiwKKwkJICAgIHN0cnVjdCBhaGNfdG1vZGVfdHN0YXRlICoqdHN0YXRlLAorCQkgICAgc3RydWN0IGFoY190bW9kZV9sc3RhdGUgKipsc3RhdGUsCisJCSAgICBpbnQgbm90Zm91bmRfZmFpbHVyZSkKK3sKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UQVJHRVRNT0RFKSA9PSAwKQorCQlyZXR1cm4gKENBTV9SRVFfSU5WQUxJRCk7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgJ2JsYWNrIGhvbGUnIGRldmljZSB0aGF0IHN1Y2tzIHVwCisJICogcmVxdWVzdHMgdG8gdW5hdHRhY2hlZCBsdW5zIG9uIGVuYWJsZWQgdGFyZ2V0cy4KKwkgKi8KKwlpZiAoY2NiLT5jY2JfaC50YXJnZXRfaWQgPT0gQ0FNX1RBUkdFVF9XSUxEQ0FSRAorCSAmJiBjY2ItPmNjYl9oLnRhcmdldF9sdW4gPT0gQ0FNX0xVTl9XSUxEQ0FSRCkgeworCQkqdHN0YXRlID0gTlVMTDsKKwkJKmxzdGF0ZSA9IGFoYy0+YmxhY2tfaG9sZTsKKwl9IGVsc2UgeworCQl1X2ludCBtYXhfaWQ7CisKKwkJbWF4X2lkID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgPyAxNSA6IDc7CisJCWlmIChjY2ItPmNjYl9oLnRhcmdldF9pZCA+IG1heF9pZCkKKwkJCXJldHVybiAoQ0FNX1RJRF9JTlZBTElEKTsKKworCQlpZiAoY2NiLT5jY2JfaC50YXJnZXRfbHVuID49IEFIQ19OVU1fTFVOUykKKwkJCXJldHVybiAoQ0FNX0xVTl9JTlZBTElEKTsKKworCQkqdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbY2NiLT5jY2JfaC50YXJnZXRfaWRdOworCQkqbHN0YXRlID0gTlVMTDsKKwkJaWYgKCp0c3RhdGUgIT0gTlVMTCkKKwkJCSpsc3RhdGUgPQorCQkJICAgICgqdHN0YXRlKS0+ZW5hYmxlZF9sdW5zW2NjYi0+Y2NiX2gudGFyZ2V0X2x1bl07CisJfQorCisJaWYgKG5vdGZvdW5kX2ZhaWx1cmUgIT0gMCAmJiAqbHN0YXRlID09IE5VTEwpCisJCXJldHVybiAoQ0FNX1BBVEhfSU5WQUxJRCk7CisKKwlyZXR1cm4gKENBTV9SRVFfQ01QKTsKK30KKwordm9pZAorYWhjX2hhbmRsZV9lbl9sdW4oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgY2FtX3NpbSAqc2ltLCB1bmlvbiBjY2IgKmNjYikKK3sKKwlzdHJ1Y3QJICAgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAkgICBhaGNfdG1vZGVfbHN0YXRlICpsc3RhdGU7CisJc3RydWN0CSAgIGNjYl9lbl9sdW4gKmNlbDsKKwljYW1fc3RhdHVzIHN0YXR1czsKKwl1X2xvbmcJICAgczsKKwl1X2ludAkgICB0YXJnZXQ7CisJdV9pbnQJICAgbHVuOworCXVfaW50CSAgIHRhcmdldF9tYXNrOworCXVfaW50CSAgIG91cl9pZDsKKwlpbnQJICAgZXJyb3I7CisJY2hhcgkgICBjaGFubmVsOworCisJc3RhdHVzID0gYWhjX2ZpbmRfdG1vZGVfZGV2cyhhaGMsIHNpbSwgY2NiLCAmdHN0YXRlLCAmbHN0YXRlLAorCQkJCSAgICAgLypub3Rmb3VuZF9mYWlsdXJlKi9GQUxTRSk7CisKKwlpZiAoc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCWNjYi0+Y2NiX2guc3RhdHVzID0gc3RhdHVzOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhbV9zaW1fYnVzKHNpbSkgPT0gMCkKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJZWxzZQorCQlvdXJfaWQgPSBhaGMtPm91cl9pZF9iOworCisJaWYgKGNjYi0+Y2NiX2gudGFyZ2V0X2lkICE9IG91cl9pZCkgeworCQkvKgorCQkgKiBvdXJfaWQgcmVwcmVzZW50cyBvdXIgaW5pdGlhdG9yIElELCBvcgorCQkgKiB0aGUgSUQgb2YgdGhlIGZpcnN0IHRhcmdldCB0byBoYXZlIGFuCisJCSAqIGVuYWJsZWQgbHVuIGluIHRhcmdldCBtb2RlLiAgVGhlcmUgYXJlCisJCSAqIHR3byBjYXNlcyB0aGF0IG1heSBwcmVjbHVkZSBlbmFibGluZyBhCisJCSAqIHRhcmdldCBpZCBvdGhlciB0aGFuIG91cl9pZC4KKwkJICoKKwkJICogICBvIG91cl9pZCBpcyBmb3IgYW4gYWN0aXZlIGluaXRpYXRvciByb2xlLgorCQkgKiAgICAgU2luY2UgdGhlIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQKKwkJICogICAgIHJlc2VsZWN0aW9ucyB0byB0aGUgaW5pdGlhdG9yIHJvbGUgYXQKKwkJICogICAgIGFueXRoaW5nIG90aGVyIHRoYW4gb3VyX2lkLCBhbmQgb3VyX2lkCisJCSAqICAgICBpcyB1c2VkIGJ5IHRoZSBoYXJkd2FyZSB0byBpbmRpY2F0ZSB0aGUKKwkJICogICAgIElEIHRvIHVzZSBmb3IgYm90aCBzZWxlY3Qtb3V0IGFuZAorCQkgKiAgICAgcmVzZWxlY3Qtb3V0IG9wZXJhdGlvbnMsIHRoZSBvbmx5IHRhcmdldAorCQkgKiAgICAgSUQgd2UgY2FuIHN1cHBvcnQgaW4gdGhpcyBtb2RlIGlzIG91cl9pZC4KKwkJICoKKwkJICogICBvIFRoZSBNVUxUQVJHSUQgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZAorCQkgKiAgICAgYSBwcmV2aW91cyB0YXJnZXQgbW9kZSBJRCBoYXMgYmVlbiBlbmFibGVkLgorCQkgKi8KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJUk9MRSkgIT0gMCkgeworCisJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfVElEKSAhPSAwCisJCSAgIAkgJiYgKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCkgeworCQkJCS8qCisJCQkJICogT25seSBhbGxvdyBhZGRpdGlvbmFsIHRhcmdldHMgaWYKKwkJCQkgKiB0aGUgaW5pdGlhdG9yIHJvbGUgaXMgZGlzYWJsZWQuCisJCQkJICogVGhlIGhhcmR3YXJlIGNhbm5vdCBoYW5kbGUgYSByZS1zZWxlY3QtaW4KKwkJCQkgKiBvbiB0aGUgaW5pdGlhdG9yIGlkIGR1cmluZyBhIHJlLXNlbGVjdC1vdXQKKwkJCQkgKiBvbiBhIGRpZmZlcmVudCB0YXJnZXQgaWQuCisJCQkJICovCisJCQkJc3RhdHVzID0gQ0FNX1RJRF9JTlZBTElEOworCQkJfSBlbHNlIGlmICgoYWhjLT5mbGFncyAmIEFIQ19JTklUSUFUT1JST0xFKSAhPSAwCisJCQkJfHwgYWhjLT5lbmFibGVkX2x1bnMgPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBPbmx5IGFsbG93IG91ciB0YXJnZXQgaWQgdG8gY2hhbmdlCisJCQkJICogaWYgdGhlIGluaXRpYXRvciByb2xlIGlzIG5vdCBjb25maWd1cmVkCisJCQkJICogYW5kIHRoZXJlIGFyZSBubyBlbmFibGVkIGx1bnMgd2hpY2gKKwkJCQkgKiBhcmUgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCisJCQkJICogc2NzaSBpZC4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBDQU1fVElEX0lOVkFMSUQ7CisJCQl9CisJCX0gZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfVElEKSA9PSAwCisJCQkmJiBhaGMtPmVuYWJsZWRfbHVucyA+IDApIHsKKworCQkJc3RhdHVzID0gQ0FNX1RJRF9JTlZBTElEOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgeworCQljY2ItPmNjYl9oLnN0YXR1cyA9IHN0YXR1czsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2Ugbm93IGhhdmUgYW4gaWQgdGhhdCBpcyB2YWxpZC4KKwkgKiBJZiB3ZSBhcmVuJ3QgaW4gdGFyZ2V0IG1vZGUsIHN3aXRjaCBtb2Rlcy4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgPT0gMAorCSAmJiBjY2ItPmNjYl9oLnRhcmdldF9pZCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7CisJCXVfbG9uZwkgczsKKwkJYWhjX2ZsYWcgc2F2ZWRfZmxhZ3M7CisKKwkJcHJpbnRmKCJDb25maWd1cmluZyBUYXJnZXQgTW9kZVxuIik7CisJCWFoY19sb2NrKGFoYywgJnMpOworCQlpZiAoTElTVF9GSVJTVCgmYWhjLT5wZW5kaW5nX3NjYnMpICE9IE5VTEwpIHsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX0JVU1k7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJcmV0dXJuOworCQl9CisJCXNhdmVkX2ZsYWdzID0gYWhjLT5mbGFnczsKKwkJYWhjLT5mbGFncyB8PSBBSENfVEFSR0VUUk9MRTsKKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJUk9MRSkgPT0gMCkKKwkJCWFoYy0+ZmxhZ3MgJj0gfkFIQ19JTklUSUFUT1JST0xFOworCQlhaGNfcGF1c2UoYWhjKTsKKwkJZXJyb3IgPSBhaGNfbG9hZHNlcShhaGMpOworCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJLyoKKwkJCSAqIFJlc3RvcmUgb3JpZ2luYWwgY29uZmlndXJhdGlvbiBhbmQgbm90aWZ5CisJCQkgKiB0aGUgY2FsbGVyIHRoYXQgd2UgY2Fubm90IHN1cHBvcnQgdGFyZ2V0IG1vZGUuCisJCQkgKiBTaW5jZSB0aGUgYWRhcHRlciBzdGFydGVkIG91dCBpbiB0aGlzCisJCQkgKiBjb25maWd1cmF0aW9uLCB0aGUgZmlybXdhcmUgbG9hZCB3aWxsIHN1Y2NlZWQsCisJCQkgKiBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBjaGVja2luZyBhaGNfbG9hZHNlcSdzCisJCQkgKiByZXR1cm4gdmFsdWUuCisJCQkgKi8KKwkJCWFoYy0+ZmxhZ3MgPSBzYXZlZF9mbGFnczsKKwkJCSh2b2lkKWFoY19sb2Fkc2VxKGFoYyk7CisJCQlhaGNfcmVzdGFydChhaGMpOworCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX0ZVTkNfTk9UQVZBSUw7CisJCQlyZXR1cm47CisJCX0KKwkJYWhjX3Jlc3RhcnQoYWhjKTsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwl9CisJY2VsID0gJmNjYi0+Y2VsOworCXRhcmdldCA9IGNjYi0+Y2NiX2gudGFyZ2V0X2lkOworCWx1biA9IGNjYi0+Y2NiX2gudGFyZ2V0X2x1bjsKKwljaGFubmVsID0gU0lNX0NIQU5ORUwoYWhjLCBzaW0pOworCXRhcmdldF9tYXNrID0gMHgwMSA8PCB0YXJnZXQ7CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQl0YXJnZXRfbWFzayA8PD0gODsKKworCWlmIChjZWwtPmVuYWJsZSAhPSAwKSB7CisJCXVfaW50IHNjc2lzZXE7CisKKwkJLyogQXJlIHdlIGFscmVhZHkgZW5hYmxlZD8/ICovCisJCWlmIChsc3RhdGUgIT0gTlVMTCkgeworCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJCXByaW50ZigiTHVuIGFscmVhZHkgZW5hYmxlZFxuIik7CisJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9MVU5fQUxSRFlfRU5BOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGNlbC0+Z3JwNl9sZW4gIT0gMAorCQkgfHwgY2VsLT5ncnA3X2xlbiAhPSAwKSB7CisJCQkvKgorCQkJICogRG9uJ3QgKHlldD8pIHN1cHBvcnQgdmVuZG9yCisJCQkgKiBzcGVjaWZpYyBjb21tYW5kcy4KKwkJCSAqLworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CisJCQlwcmludGYoIk5vbi16ZXJvIEdyb3VwIENvZGVzXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIFNlZW1zIHRvIGJlIG9rYXkuCisJCSAqIFNldHVwIG91ciBkYXRhIHN0cnVjdHVyZXMuCisJCSAqLworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQgJiYgdHN0YXRlID09IE5VTEwpIHsKKwkJCXRzdGF0ZSA9IGFoY19hbGxvY190c3RhdGUoYWhjLCB0YXJnZXQsIGNoYW5uZWwpOworCQkJaWYgKHRzdGF0ZSA9PSBOVUxMKSB7CisJCQkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJCQlwcmludGYoIkNvdWxkbid0IGFsbG9jYXRlIHRzdGF0ZVxuIik7CisJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbHN0YXRlID0gbWFsbG9jKHNpemVvZigqbHN0YXRlKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwkJaWYgKGxzdGF0ZSA9PSBOVUxMKSB7CisJCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQkJcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSBsc3RhdGVcbiIpOworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKKwkJCXJldHVybjsKKwkJfQorCQltZW1zZXQobHN0YXRlLCAwLCBzaXplb2YoKmxzdGF0ZSkpOworCQlzdGF0dXMgPSB4cHRfY3JlYXRlX3BhdGgoJmxzdGF0ZS0+cGF0aCwgLypwZXJpcGgqL05VTEwsCisJCQkJCSB4cHRfcGF0aF9wYXRoX2lkKGNjYi0+Y2NiX2gucGF0aCksCisJCQkJCSB4cHRfcGF0aF90YXJnZXRfaWQoY2NiLT5jY2JfaC5wYXRoKSwKKwkJCQkJIHhwdF9wYXRoX2x1bl9pZChjY2ItPmNjYl9oLnBhdGgpKTsKKwkJaWYgKHN0YXR1cyAhPSBDQU1fUkVRX0NNUCkgeworCQkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKwkJCXhwdF9wcmludF9wYXRoKGNjYi0+Y2NiX2gucGF0aCk7CisJCQlwcmludGYoIkNvdWxkbid0IGFsbG9jYXRlIHBhdGhcbiIpOworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVTUkNfVU5BVkFJTDsKKwkJCXJldHVybjsKKwkJfQorCQlTTElTVF9JTklUKCZsc3RhdGUtPmFjY2VwdF90aW9zKTsKKwkJU0xJU1RfSU5JVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcyk7CisJCWFoY19sb2NrKGFoYywgJnMpOworCQlhaGNfcGF1c2UoYWhjKTsKKwkJaWYgKHRhcmdldCAhPSBDQU1fVEFSR0VUX1dJTERDQVJEKSB7CisJCQl0c3RhdGUtPmVuYWJsZWRfbHVuc1tsdW5dID0gbHN0YXRlOworCQkJYWhjLT5lbmFibGVkX2x1bnMrKzsKKworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCkgeworCQkJCXVfaW50IHRhcmdpZF9tYXNrOworCisJCQkJdGFyZ2lkX21hc2sgPSBhaGNfaW5iKGFoYywgVEFSR0lEKQorCQkJCQkgICAgfCAoYWhjX2luYihhaGMsIFRBUkdJRCArIDEpIDw8IDgpOworCisJCQkJdGFyZ2lkX21hc2sgfD0gdGFyZ2V0X21hc2s7CisJCQkJYWhjX291dGIoYWhjLCBUQVJHSUQsIHRhcmdpZF9tYXNrKTsKKwkJCQlhaGNfb3V0YihhaGMsIFRBUkdJRCsxLCAodGFyZ2lkX21hc2sgPj4gOCkpOworCQkJCQorCQkJCWFoY191cGRhdGVfc2NzaWlkKGFoYywgdGFyZ2lkX21hc2spOworCQkJfSBlbHNlIHsKKwkJCQl1X2ludCBvdXJfaWQ7CisJCQkJY2hhciAgY2hhbm5lbDsKKworCQkJCWNoYW5uZWwgPSBTSU1fQ0hBTk5FTChhaGMsIHNpbSk7CisJCQkJb3VyX2lkID0gU0lNX1NDU0lfSUQoYWhjLCBzaW0pOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzZWxlY3Rpb25zCisJCQkJICogYXJlIG5vdCBlbmFibGVkCisJCQkJICovCisJCQkJaWYgKHRhcmdldCAhPSBvdXJfaWQpIHsKKwkJCQkJdV9pbnQgc2Jsa2N0bDsKKwkJCQkJY2hhciAgY3VyX2NoYW5uZWw7CisJCQkJCWludCAgIHN3YXA7CisKKwkJCQkJc2Jsa2N0bCA9IGFoY19pbmIoYWhjLCBTQkxLQ1RMKTsKKwkJCQkJY3VyX2NoYW5uZWwgPSAoc2Jsa2N0bCAmIFNFTEJVU0IpCisJCQkJCQkgICAgPyAnQicgOiAnQSc7CisJCQkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSA9PSAwKQorCQkJCQkJY3VyX2NoYW5uZWwgPSAnQSc7CisJCQkJCXN3YXAgPSBjdXJfY2hhbm5lbCAhPSBjaGFubmVsOworCQkJCQlpZiAoY2hhbm5lbCA9PSAnQScpCisJCQkJCQlhaGMtPm91cl9pZCA9IHRhcmdldDsKKwkJCQkJZWxzZQorCQkJCQkJYWhjLT5vdXJfaWRfYiA9IHRhcmdldDsKKworCQkJCQlpZiAoc3dhcCkKKwkJCQkJCWFoY19vdXRiKGFoYywgU0JMS0NUTCwKKwkJCQkJCQkgc2Jsa2N0bCBeIFNFTEJVU0IpOworCisJCQkJCWFoY19vdXRiKGFoYywgU0NTSUlELCB0YXJnZXQpOworCisJCQkJCWlmIChzd2FwKQorCQkJCQkJYWhjX291dGIoYWhjLCBTQkxLQ1RMLCBzYmxrY3RsKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJYWhjLT5ibGFja19ob2xlID0gbHN0YXRlOworCQkvKiBBbGxvdyBzZWxlY3QtaW4gb3BlcmF0aW9ucyAqLworCQlpZiAoYWhjLT5ibGFja19ob2xlICE9IE5VTEwgJiYgYWhjLT5lbmFibGVkX2x1bnMgPiAwKSB7CisJCQlzY3Npc2VxID0gYWhjX2luYihhaGMsIFNDU0lTRVFfVEVNUExBVEUpOworCQkJc2NzaXNlcSB8PSBFTlNFTEk7CisJCQlhaGNfb3V0YihhaGMsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXEpOworCQkJc2NzaXNlcSA9IGFoY19pbmIoYWhjLCBTQ1NJU0VRKTsKKwkJCXNjc2lzZXEgfD0gRU5TRUxJOworCQkJYWhjX291dGIoYWhjLCBTQ1NJU0VRLCBzY3Npc2VxKTsKKwkJfQorCQlhaGNfdW5wYXVzZShhaGMpOworCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfQ01QOworCQl4cHRfcHJpbnRfcGF0aChjY2ItPmNjYl9oLnBhdGgpOworCQlwcmludGYoIkx1biBub3cgZW5hYmxlZCBmb3IgdGFyZ2V0IG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2IgKnNjYjsKKwkJaW50IGksIGVtcHR5OworCisJCWlmIChsc3RhdGUgPT0gTlVMTCkgeworCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fTFVOX0lOVkFMSUQ7CisJCQlyZXR1cm47CisJCX0KKworCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJCisJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9DTVA7CisJCUxJU1RfRk9SRUFDSChzY2IsICZhaGMtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkJc3RydWN0IGNjYl9oZHIgKmNjYmg7CisKKwkJCWNjYmggPSAmc2NiLT5pb19jdHgtPmNjYl9oOworCQkJaWYgKGNjYmgtPmZ1bmNfY29kZSA9PSBYUFRfQ09OVF9UQVJHRVRfSU8KKwkJCSAmJiAheHB0X3BhdGhfY29tcChjY2JoLT5wYXRoLCBjY2ItPmNjYl9oLnBhdGgpKXsKKwkJCQlwcmludGYoIkNUSU8gcGVuZGluZ1xuIik7CisJCQkJY2NiLT5jY2JfaC5zdGF0dXMgPSBDQU1fUkVRX0lOVkFMSUQ7CisJCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZiAoU0xJU1RfRklSU1QoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiQVRJT3MgcGVuZGluZ1xuIik7CisJCQljY2ItPmNjYl9oLnN0YXR1cyA9IENBTV9SRVFfSU5WQUxJRDsKKwkJfQorCisJCWlmIChTTElTVF9GSVJTVCgmbHN0YXRlLT5pbW1lZF9ub3RpZmllcykgIT0gTlVMTCkgeworCQkJcHJpbnRmKCJJTk9UcyBwZW5kaW5nXG4iKTsKKwkJCWNjYi0+Y2NiX2guc3RhdHVzID0gQ0FNX1JFUV9JTlZBTElEOworCQl9CisKKwkJaWYgKGNjYi0+Y2NiX2guc3RhdHVzICE9IENBTV9SRVFfQ01QKSB7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJcmV0dXJuOworCQl9CisKKwkJeHB0X3ByaW50X3BhdGgoY2NiLT5jY2JfaC5wYXRoKTsKKwkJcHJpbnRmKCJUYXJnZXQgbW9kZSBkaXNhYmxlZFxuIik7CisJCXhwdF9mcmVlX3BhdGgobHN0YXRlLT5wYXRoKTsKKwkJZnJlZShsc3RhdGUsIE1fREVWQlVGKTsKKworCQlhaGNfcGF1c2UoYWhjKTsKKwkJLyogQ2FuIHdlIGNsZWFuIHVwIHRoZSB0YXJnZXQgdG9vPyAqLworCQlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJCXRzdGF0ZS0+ZW5hYmxlZF9sdW5zW2x1bl0gPSBOVUxMOworCQkJYWhjLT5lbmFibGVkX2x1bnMtLTsKKwkJCWZvciAoZW1wdHkgPSAxLCBpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlpZiAodHN0YXRlLT5lbmFibGVkX2x1bnNbaV0gIT0gTlVMTCkgeworCQkJCQllbXB0eSA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJaWYgKGVtcHR5KSB7CisJCQkJYWhjX2ZyZWVfdHN0YXRlKGFoYywgdGFyZ2V0LCBjaGFubmVsLAorCQkJCQkJLypmb3JjZSovRkFMU0UpOworCQkJCWlmIChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgeworCQkJCQl1X2ludCB0YXJnaWRfbWFzazsKKworCQkJCQl0YXJnaWRfbWFzayA9IGFoY19pbmIoYWhjLCBUQVJHSUQpCisJCQkJCQkgICAgfCAoYWhjX2luYihhaGMsIFRBUkdJRCArIDEpCisJCQkJCQkgICAgICAgPDwgOCk7CisKKwkJCQkJdGFyZ2lkX21hc2sgJj0gfnRhcmdldF9tYXNrOworCQkJCQlhaGNfb3V0YihhaGMsIFRBUkdJRCwgdGFyZ2lkX21hc2spOworCQkJCQlhaGNfb3V0YihhaGMsIFRBUkdJRCsxLAorCQkJCQkgCSAodGFyZ2lkX21hc2sgPj4gOCkpOworCQkJCQlhaGNfdXBkYXRlX3Njc2lpZChhaGMsIHRhcmdpZF9tYXNrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWFoYy0+YmxhY2tfaG9sZSA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBXZSBjYW4ndCBhbGxvdyBzZWxlY3Rpb25zIHdpdGhvdXQKKwkJCSAqIG91ciBibGFjayBob2xlIGRldmljZS4KKwkJCSAqLworCQkJZW1wdHkgPSBUUlVFOworCQl9CisJCWlmIChhaGMtPmVuYWJsZWRfbHVucyA9PSAwKSB7CisJCQkvKiBEaXNhbGxvdyBzZWxlY3QtaW4gKi8KKwkJCXVfaW50IHNjc2lzZXE7CisKKwkJCXNjc2lzZXEgPSBhaGNfaW5iKGFoYywgU0NTSVNFUV9URU1QTEFURSk7CisJCQlzY3Npc2VxICY9IH5FTlNFTEk7CisJCQlhaGNfb3V0YihhaGMsIFNDU0lTRVFfVEVNUExBVEUsIHNjc2lzZXEpOworCQkJc2NzaXNlcSA9IGFoY19pbmIoYWhjLCBTQ1NJU0VRKTsKKwkJCXNjc2lzZXEgJj0gfkVOU0VMSTsKKwkJCWFoY19vdXRiKGFoYywgU0NTSVNFUSwgc2NzaXNlcSk7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSVJPTEUpID09IDApIHsKKwkJCQlwcmludGYoIkNvbmZpZ3VyaW5nIEluaXRpYXRvciBNb2RlXG4iKTsKKwkJCQlhaGMtPmZsYWdzICY9IH5BSENfVEFSR0VUUk9MRTsKKwkJCQlhaGMtPmZsYWdzIHw9IEFIQ19JTklUSUFUT1JST0xFOworCQkJCS8qCisJCQkJICogUmV0dXJuaW5nIHRvIGEgY29uZmlndXJhdGlvbiB0aGF0CisJCQkJICogZml0IHByZXZpb3VzbHkgd2lsbCBhbHdheXMgc3VjY2VlZC4KKwkJCQkgKi8KKwkJCQkodm9pZClhaGNfbG9hZHNlcShhaGMpOworCQkJCWFoY19yZXN0YXJ0KGFoYyk7CisJCQkJLyoKKwkJCQkgKiBVbnBhdXNlZC4gIFRoZSBleHRyYSB1bnBhdXNlCisJCQkJICogdGhhdCBmb2xsb3dzIGlzIGhhcm1sZXNzLgorCQkJCSAqLworCQkJfQorCQl9CisJCWFoY191bnBhdXNlKGFoYyk7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX3VwZGF0ZV9zY3NpaWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCB0YXJnaWRfbWFzaykKK3sKKwl1X2ludCBzY3NpaWRfbWFzazsKKwl1X2ludCBzY3NpaWQ7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfVElEKSA9PSAwKQorCQlwYW5pYygiYWhjX3VwZGF0ZV9zY3NpaWQgY2FsbGVkIG9uIG5vbi1tdWx0aXRpZCB1bml0XG4iKTsKKworCS8qCisJICogU2luY2Ugd2Ugd2lsbCByZWx5IG9uIHRoZSBUQVJHSUQgbWFzaworCSAqIGZvciBzZWxlY3Rpb24gZW5hYmxlcywgZW5zdXJlIHRoYXQgT0lECisJICogaW4gU0NTSUlEIGlzIG5vdCBzZXQgdG8gc29tZSBvdGhlciBJRAorCSAqIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyBzZWxlY3Rpb25zIG9uLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCXNjc2lpZCA9IGFoY19pbmIoYWhjLCBTQ1NJSURfVUxUUkEyKTsKKwllbHNlCisJCXNjc2lpZCA9IGFoY19pbmIoYWhjLCBTQ1NJSUQpOworCXNjc2lpZF9tYXNrID0gMHgxIDw8IChzY3NpaWQgJiBPSUQpOworCWlmICgodGFyZ2lkX21hc2sgJiBzY3NpaWRfbWFzaykgPT0gMCkgeworCQl1X2ludCBvdXJfaWQ7CisKKwkJLyogZmZzIGNvdW50cyBmcm9tIDEgKi8KKwkJb3VyX2lkID0gZmZzKHRhcmdpZF9tYXNrKTsKKwkJaWYgKG91cl9pZCA9PSAwKQorCQkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJCWVsc2UKKwkJCW91cl9pZC0tOworCQlzY3NpaWQgJj0gVElEOworCQlzY3NpaWQgfD0gb3VyX2lkOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlhaGNfb3V0YihhaGMsIFNDU0lJRF9VTFRSQTIsIHNjc2lpZCk7CisJZWxzZQorCQlhaGNfb3V0YihhaGMsIFNDU0lJRCwgc2NzaWlkKTsKK30KKwordm9pZAorYWhjX3J1bl90cWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBwYXVzZWQpCit7CisJc3RydWN0IHRhcmdldF9jbWQgKmNtZDsKKworCS8qCisJICogSWYgdGhlIGNhcmQgc3VwcG9ydHMgYXV0by1hY2Nlc3MgcGF1c2UsCisJICogd2UgY2FuIGFjY2VzcyB0aGUgY2FyZCBkaXJlY3RseSByZWdhcmRsZXNzCisJICogb2Ygd2hldGhlciBpdCBpcyBwYXVzZWQgb3Igbm90LgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19BVVRPUEFVU0UpICE9IDApCisJCXBhdXNlZCA9IFRSVUU7CisKKwlhaGNfc3luY190cWluZmlmbyhhaGMsIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwl3aGlsZSAoKGNtZCA9ICZhaGMtPnRhcmdldGNtZHNbYWhjLT50cWluZmlmb25leHRdKS0+Y21kX3ZhbGlkICE9IDApIHsKKworCQkvKgorCQkgKiBPbmx5IGFkdmFuY2UgdGhyb3VnaCB0aGUgcXVldWUgaWYgd2UKKwkJICogaGF2ZSB0aGUgcmVzb3VyY2VzIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQuCisJCSAqLworCQlpZiAoYWhjX2hhbmRsZV90YXJnZXRfY21kKGFoYywgY21kKSAhPSAwKQorCQkJYnJlYWs7CisKKwkJY21kLT5jbWRfdmFsaWQgPSAwOworCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhjX3RhcmdldGNtZF9vZmZzZXQoYWhjLCBhaGMtPnRxaW5maWZvbmV4dCksCisJCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSwKKwkJCQlCVVNfRE1BU1lOQ19QUkVSRUFEKTsKKwkJYWhjLT50cWluZmlmb25leHQrKzsKKworCQkvKgorCQkgKiBMYXppbHkgdXBkYXRlIG91ciBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IG1vZGUgaW5jb21pbmcKKwkJICogY29tbWFuZCBxdWV1ZSBhcyBzZWVuIGJ5IHRoZSBzZXF1ZW5jZXIuCisJCSAqLworCQlpZiAoKGFoYy0+dHFpbmZpZm9uZXh0ICYgKEhPU1RfVFFJTlBPUyAtIDEpKSA9PSAxKSB7CisJCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfSFNfTUFJTEJPWCkgIT0gMCkgeworCQkJCXVfaW50IGhzX21haWxib3g7CisKKwkJCQloc19tYWlsYm94ID0gYWhjX2luYihhaGMsIEhTX01BSUxCT1gpOworCQkJCWhzX21haWxib3ggJj0gfkhPU1RfVFFJTlBPUzsKKwkJCQloc19tYWlsYm94IHw9IGFoYy0+dHFpbmZpZm9uZXh0ICYgSE9TVF9UUUlOUE9TOworCQkJCWFoY19vdXRiKGFoYywgSFNfTUFJTEJPWCwgaHNfbWFpbGJveCk7CisJCQl9IGVsc2UgeworCQkJCWlmICghcGF1c2VkKQorCQkJCQlhaGNfcGF1c2UoYWhjKTsJCisJCQkJYWhjX291dGIoYWhjLCBLRVJORUxfVFFJTlBPUywKKwkJCQkJIGFoYy0+dHFpbmZpZm9uZXh0ICYgSE9TVF9UUUlOUE9TKTsKKwkJCQlpZiAoIXBhdXNlZCkKKwkJCQkJYWhjX3VucGF1c2UoYWhjKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludAorYWhjX2hhbmRsZV90YXJnZXRfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHRhcmdldF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QJICBhaGNfdG1vZGVfdHN0YXRlICp0c3RhdGU7CisJc3RydWN0CSAgYWhjX3Rtb2RlX2xzdGF0ZSAqbHN0YXRlOworCXN0cnVjdAkgIGNjYl9hY2NlcHRfdGlvICphdGlvOworCXVpbnQ4X3QgKmJ5dGU7CisJaW50CSAgaW5pdGlhdG9yOworCWludAkgIHRhcmdldDsKKwlpbnQJICBsdW47CisKKwlpbml0aWF0b3IgPSBTQ1NJSURfVEFSR0VUKGFoYywgY21kLT5zY3NpaWQpOworCXRhcmdldCA9IFNDU0lJRF9PVVJfSUQoY21kLT5zY3NpaWQpOworCWx1biAgICA9IChjbWQtPmlkZW50aWZ5ICYgTVNHX0lERU5USUZZX0xVTk1BU0spOworCisJYnl0ZSA9IGNtZC0+Ynl0ZXM7CisJdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbdGFyZ2V0XTsKKwlsc3RhdGUgPSBOVUxMOworCWlmICh0c3RhdGUgIT0gTlVMTCkKKwkJbHN0YXRlID0gdHN0YXRlLT5lbmFibGVkX2x1bnNbbHVuXTsKKworCS8qCisJICogQ29tbWFuZHMgZm9yIGRpc2FibGVkIGx1bnMgZ28gdG8gdGhlIGJsYWNrIGhvbGUgZHJpdmVyLgorCSAqLworCWlmIChsc3RhdGUgPT0gTlVMTCkKKwkJbHN0YXRlID0gYWhjLT5ibGFja19ob2xlOworCisJYXRpbyA9IChzdHJ1Y3QgY2NiX2FjY2VwdF90aW8qKVNMSVNUX0ZJUlNUKCZsc3RhdGUtPmFjY2VwdF90aW9zKTsKKwlpZiAoYXRpbyA9PSBOVUxMKSB7CisJCWFoYy0+ZmxhZ3MgfD0gQUhDX1RRSU5GSUZPX0JMT0NLRUQ7CisJCS8qCisJCSAqIFdhaXQgZm9yIG1vcmUgQVRJT3MgZnJvbSB0aGUgcGVyaXBoZXJhbCBkcml2ZXIgZm9yIHRoaXMgbHVuLgorCQkgKi8KKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogQVRJT3MgZXhoYXVzdGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJcmV0dXJuICgxKTsKKwl9IGVsc2UKKwkJYWhjLT5mbGFncyAmPSB+QUhDX1RRSU5GSUZPX0JMT0NLRUQ7CisjaWYgMAorCXByaW50ZigiSW5jb21pbmcgY29tbWFuZCBmcm9tICVkIGZvciAlZDolZCVzXG4iLAorCSAgICAgICBpbml0aWF0b3IsIHRhcmdldCwgbHVuLAorCSAgICAgICBsc3RhdGUgPT0gYWhjLT5ibGFja19ob2xlID8gIihCbGFjayBIb2xlZCkiIDogIiIpOworI2VuZGlmCisJU0xJU1RfUkVNT1ZFX0hFQUQoJmxzdGF0ZS0+YWNjZXB0X3Rpb3MsIHNpbV9saW5rcy5zbGUpOworCisJaWYgKGxzdGF0ZSA9PSBhaGMtPmJsYWNrX2hvbGUpIHsKKwkJLyogRmlsbCBpbiB0aGUgd2lsZGNhcmRzICovCisJCWF0aW8tPmNjYl9oLnRhcmdldF9pZCA9IHRhcmdldDsKKwkJYXRpby0+Y2NiX2gudGFyZ2V0X2x1biA9IGx1bjsKKwl9CisKKwkvKgorCSAqIFBhY2thZ2UgaXQgdXAgYW5kIHNlbmQgaXQgb2ZmIHRvCisJICogd2hvbWV2ZXIgaGFzIHRoaXMgbHVuIGVuYWJsZWQuCisJICovCisJYXRpby0+c2Vuc2VfbGVuID0gMDsKKwlhdGlvLT5pbml0X2lkID0gaW5pdGlhdG9yOworCWlmIChieXRlWzBdICE9IDB4RkYpIHsKKwkJLyogVGFnIHdhcyBpbmNsdWRlZCAqLworCQlhdGlvLT50YWdfYWN0aW9uID0gKmJ5dGUrKzsKKwkJYXRpby0+dGFnX2lkID0gKmJ5dGUrKzsKKwkJYXRpby0+Y2NiX2guZmxhZ3MgPSBDQU1fVEFHX0FDVElPTl9WQUxJRDsKKwl9IGVsc2UgeworCQlhdGlvLT5jY2JfaC5mbGFncyA9IDA7CisJfQorCWJ5dGUrKzsKKworCS8qIE9rYXkuICBOb3cgZGV0ZXJtaW5lIHRoZSBjZGIgc2l6ZSBiYXNlZCBvbiB0aGUgY29tbWFuZCBjb2RlICovCisJc3dpdGNoICgqYnl0ZSA+PiBDTURfR1JPVVBfQ09ERV9TSElGVCkgeworCWNhc2UgMDoKKwkJYXRpby0+Y2RiX2xlbiA9IDY7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJCWF0aW8tPmNkYl9sZW4gPSAxMDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhdGlvLT5jZGJfbGVuID0gMTY7CisJCWJyZWFrOworCWNhc2UgNToKKwkJYXRpby0+Y2RiX2xlbiA9IDEyOworCQlicmVhazsKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkJLyogT25seSBjb3B5IHRoZSBvcGNvZGUuICovCisJCWF0aW8tPmNkYl9sZW4gPSAxOworCQlwcmludGYoIlJlc2VydmVkIG9yIFZVIGNvbW1hbmQgY29kZSB0eXBlIGVuY291bnRlcmVkXG4iKTsKKwkJYnJlYWs7CisJfQorCQorCW1lbWNweShhdGlvLT5jZGJfaW8uY2RiX2J5dGVzLCBieXRlLCBhdGlvLT5jZGJfbGVuKTsKKworCWF0aW8tPmNjYl9oLnN0YXR1cyB8PSBDQU1fQ0RCX1JFQ1ZEOworCisJaWYgKChjbWQtPmlkZW50aWZ5ICYgTVNHX0lERU5USUZZX0RJU0NGTEFHKSA9PSAwKSB7CisJCS8qCisJCSAqIFdlIHdlcmVuJ3QgYWxsb3dlZCB0byBkaXNjb25uZWN0LgorCQkgKiBXZSdyZSBoYW5naW5nIG9uIHRoZSBidXMgdW50aWwgYQorCQkgKiBjb250aW51ZSB0YXJnZXQgSS9PIGNvbWVzIGluIHJlc3BvbnNlCisJCSAqIHRvIHRoaXMgYWNjZXB0IHRpby4KKwkJICovCisjaWYgMAorCQlwcmludGYoIlJlY2VpdmVkIEltbWVkaWF0ZSBDb21tYW5kICVkOiVkOiVkIC0gJXBcbiIsCisJCSAgICAgICBpbml0aWF0b3IsIHRhcmdldCwgbHVuLCBhaGMtPnBlbmRpbmdfZGV2aWNlKTsKKyNlbmRpZgorCQlhaGMtPnBlbmRpbmdfZGV2aWNlID0gbHN0YXRlOworCQlhaGNfZnJlZXplX2NjYigodW5pb24gY2NiICopYXRpbyk7CisJCWF0aW8tPmNjYl9oLmZsYWdzIHw9IENBTV9ESVNfRElTQ09OTkVDVDsKKwl9CisJeHB0X2RvbmUoKHVuaW9uIGNjYiopYXRpbyk7CisJcmV0dXJuICgwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2lubGluZS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M4YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaApAQCAtMCwwICsxLDY0OSBAQAorLyoKKyAqIElubGluZSByb3V0aW5lcyBzaGFyZWFibGUgYWNyb3NzIE9TIHBsYXRmb3Jtcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMjAwMSBKdXN0aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHhfaW5saW5lLmgjNDMgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX0FJQzdYWFhfSU5MSU5FX0hfCisjZGVmaW5lIF9BSUM3WFhYX0lOTElORV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXF1ZW5jZXIgRXhlY3V0aW9uIENvbnRyb2wgKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3BhdXNlX2J1Z19maXgoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBfX2lubGluZSBpbnQgIGFoY19pc19wYXVzZWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19wYXVzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3VucGF1c2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworLyoKKyAqIFdvcmsgYXJvdW5kIGFueSBjaGlwIGJ1Z3MgcmVsYXRlZCB0byBoYWx0aW5nIHNlcXVlbmNlciBleGVjdXRpb24uCisgKiBPbiBVbHRyYTIgY29udHJvbGxlcnMsIHdlIG11c3QgY2xlYXIgdGhlIENJT0JVUyBzdHJldGNoIHNpZ25hbCBieQorICogcmVhZGluZyBhIHJlZ2lzdGVyIHRoYXQgd2lsbCBzZXQgdGhpcyBzaWduYWwgYW5kIGRlYXNzZXJ0IGl0LgorICogV2l0aG91dCB0aGlzIHdvcmthcm91bmQsIGlmIHRoZSBjaGlwIGlzIHBhdXNlZCwgYnkgYW4gaW50ZXJydXB0IG9yCisgKiBtYW51YWwgcGF1c2Ugd2hpbGUgYWNjZXNzaW5nIHNjYiByYW0sIGFjY2Vzc2VzIHRvIGNlcnRhaW4gcmVnaXN0ZXJzCisgKiB3aWxsIGhhbmcgdGhlIHN5c3RlbSAoaW5maW5pdGUgcGNpIHJldHJpZXMpLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3BhdXNlX2J1Z19maXgoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCSh2b2lkKWFoY19pbmIoYWhjLCBDQ1NDQkNUTCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIGhhcyBoYWx0ZWQgY29kZSBleGVjdXRpb24uCisgKiBSZXR1cm5zIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGUgc2VxdWVuY2VyIGlzIHN0b3BwZWQuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK2FoY19pc19wYXVzZWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgUEFVU0UpICE9IDApOworfQorCisvKgorICogUmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZXIgc3RvcCBhbmQgd2FpdCwgaW5kZWZpbml0ZWx5LCBmb3IgaXQKKyAqIHRvIHN0b3AuICBUaGUgc2VxdWVuY2VyIHdpbGwgb25seSBhY2tub3dsZWRnZSB0aGF0IGl0IGlzIHBhdXNlZAorICogb25jZSBpdCBoYXMgcmVhY2hlZCBhbiBpbnN0cnVjdGlvbiBib3VuZGFyeSBhbmQgUEFVU0VESVMgaXMKKyAqIGNsZWFyZWQgaW4gdGhlIFNFUUNUTCByZWdpc3Rlci4gIFRoZSBzZXF1ZW5jZXIgbWF5IHVzZSBQQVVTRURJUworICogZm9yIGNyaXRpY2FsIHNlY3Rpb25zLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3BhdXNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT5wYXVzZSk7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBzZXF1ZW5jZXIgY2FuIGRpc2FibGUgcGF1c2luZyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sIHdlCisJICogbXVzdCBsb29wIHVudGlsIGl0IGFjdHVhbGx5IHN0b3BzLgorCSAqLworCXdoaWxlIChhaGNfaXNfcGF1c2VkKGFoYykgPT0gMCkKKwkJOworCisJYWhjX3BhdXNlX2J1Z19maXgoYWhjKTsKK30KKworLyoKKyAqIEFsbG93IHRoZSBzZXF1ZW5jZXIgdG8gY29udGludWUgcHJvZ3JhbSBleGVjdXRpb24uCisgKiBXZSBjaGVjayBoZXJlIHRvIGVuc3VyZSB0aGF0IG5vIGFkZGl0aW9uYWwgaW50ZXJydXB0CisgKiBzb3VyY2VzIHRoYXQgd291bGQgY2F1c2UgdGhlIHNlcXVlbmNlciB0byBoYWx0IGhhdmUgYmVlbgorICogYXNzZXJ0ZWQuICBJZiwgZm9yIGV4YW1wbGUsIGEgU0NTSSBidXMgcmVzZXQgaXMgZGV0ZWN0ZWQKKyAqIHdoaWxlIHdlIGFyZSBmaWVsZGluZyBhIGRpZmZlcmVudCwgcGF1c2luZywgaW50ZXJydXB0IHR5cGUsCisgKiB3ZSBkb24ndCB3YW50IHRvIHJlbGVhc2UgdGhlIHNlcXVlbmNlciBiZWZvcmUgZ29pbmcgYmFjaworICogaW50byBvdXIgaW50ZXJydXB0IGhhbmRsZXIgYW5kIGRlYWxpbmcgd2l0aCB0aGlzIG5ldworICogY29uZGl0aW9uLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3VucGF1c2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWlmICgoYWhjX2luYihhaGMsIElOVFNUQVQpICYgKFNDU0lJTlQgfCBTRVFJTlQgfCBCUktBRFJJTlQpKSA9PSAwKQorCQlhaGNfb3V0YihhaGMsIEhDTlRSTCwgYWhjLT51bnBhdXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIFVudGFnZ2VkIFRyYW5zYWN0aW9uIFJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19mcmVlemVfdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfcmVsZWFzZV91bnRhZ2dlZF9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworLyoKKyAqIEJsb2NrIG91ciBjb21wbGV0aW9uIHJvdXRpbmUgZnJvbSBzdGFydGluZyB0aGUgbmV4dCB1bnRhZ2dlZAorICogdHJhbnNhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0IG9yIHRhcmdldCBsdW4uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfZnJlZXplX3VudGFnZ2VkX3F1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpID09IDApCisJCWFoYy0+dW50YWdnZWRfcXVldWVfbG9jaysrOworfQorCisvKgorICogQWxsb3cgdGhlIG5leHQgdW50YWdnZWQgdHJhbnNhY3Rpb24gZm9yIHRoaXMgdGFyZ2V0IG9yIHRhcmdldCBsdW4KKyAqIHRvIGJlIGV4ZWN1dGVkLiAgV2UgdXNlIGEgY291bnRpbmcgc2VtYXBob3JlIHRvIGFsbG93IHRoZSBsb2NrCisgKiB0byBiZSBhY3F1aXJlZCByZWN1cnNpdmVseS4gIE9uY2UgdGhlIGNvdW50IGRyb3BzIHRvIHplcm8sIHRoZQorICogdHJhbnNhY3Rpb24gcXVldWVzIHdpbGwgYmUgcnVuLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3JlbGVhc2VfdW50YWdnZWRfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQlhaGMtPnVudGFnZ2VkX3F1ZXVlX2xvY2stLTsKKwkJaWYgKGFoYy0+dW50YWdnZWRfcXVldWVfbG9jayA9PSAwKQorCQkJYWhjX3J1bl91bnRhZ2dlZF9xdWV1ZXMoYWhjKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNZW1vcnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19kbWFfc2VnICoKKwkJCWFoY19zZ19idXNfdG9fdmlydChzdHJ1Y3Qgc2NiICpzY2IsCisJCQkJCSAgIHVpbnQzMl90IHNnX2J1c2FkZHIpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CisJCQlhaGNfc2dfdmlydF90b19idXMoc3RydWN0IHNjYiAqc2NiLAorCQkJCQkgICBzdHJ1Y3QgYWhjX2RtYV9zZWcgKnNnKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorCQkJYWhjX2hzY2JfYnVzYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19zeW5jX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY19zZ2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQlzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoY190YXJnZXRjbWRfb2Zmc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgICB1X2ludCBpbmRleCk7CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2RtYV9zZWcgKgorYWhjX3NnX2J1c190b192aXJ0KHN0cnVjdCBzY2IgKnNjYiwgdWludDMyX3Qgc2dfYnVzYWRkcikKK3sKKwlpbnQgc2dfaW5kZXg7CisKKwlzZ19pbmRleCA9IChzZ19idXNhZGRyIC0gc2NiLT5zZ19saXN0X3BoeXMpL3NpemVvZihzdHJ1Y3QgYWhjX2RtYV9zZWcpOworCS8qIHNnX2xpc3RfcGh5cyBwb2ludHMgdG8gZW50cnkgMSwgbm90IDAgKi8KKwlzZ19pbmRleCsrOworCisJcmV0dXJuICgmc2NiLT5zZ19saXN0W3NnX2luZGV4XSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhjX3NnX3ZpcnRfdG9fYnVzKHN0cnVjdCBzY2IgKnNjYiwgc3RydWN0IGFoY19kbWFfc2VnICpzZykKK3sKKwlpbnQgc2dfaW5kZXg7CisKKwkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEsIG5vdCAwICovCisJc2dfaW5kZXggPSBzZyAtICZzY2ItPnNnX2xpc3RbMV07CisKKwlyZXR1cm4gKHNjYi0+c2dfbGlzdF9waHlzICsgKHNnX2luZGV4ICogc2l6ZW9mKCpzY2ItPnNnX2xpc3QpKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhjX2hzY2JfYnVzYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KQoreworCXJldHVybiAoYWhjLT5zY2JfZGF0YS0+aHNjYl9idXNhZGRyCisJCSsgKHNpemVvZihzdHJ1Y3QgaGFyZHdhcmVfc2NiKSAqIGluZGV4KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc3luY19zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCkKK3sKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNjYl9kYXRhLT5oc2NiX2RtYXQsCisJCQlhaGMtPnNjYl9kYXRhLT5oc2NiX2RtYW1hcCwKKwkJCS8qb2Zmc2V0Ki8oc2NiLT5oc2NiIC0gYWhjLT5oc2NicykgKiBzaXplb2YoKnNjYi0+aHNjYiksCisJCQkvKmxlbiovc2l6ZW9mKCpzY2ItPmhzY2IpLCBvcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc3luY19zZ2xpc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCkKK3sKKwlpZiAoc2NiLT5zZ19jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNjYl9kYXRhLT5zZ19kbWF0LCBzY2ItPnNnX21hcC0+c2dfZG1hbWFwLAorCQkJLypvZmZzZXQqLyhzY2ItPnNnX2xpc3QgLSBzY2ItPnNnX21hcC0+c2dfdmFkZHIpCisJCQkJKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSwKKwkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSAqIHNjYi0+c2dfY291bnQsIG9wKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CithaGNfdGFyZ2V0Y21kX29mZnNldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KQoreworCXJldHVybiAoKCh1aW50OF90ICopJmFoYy0+dGFyZ2V0Y21kc1tpbmRleF0pIC0gYWhjLT5xb3V0Zmlmbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWJ1Z2dpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgY2hhciAqYWhjX25hbWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworc3RhdGljIF9faW5saW5lIGNoYXIgKgorYWhjX25hbWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoYWhjLT5uYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIE1pc2NlbGFuZW91cyBTdXBwb3J0IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX3VwZGF0ZV9yZXNpZHVhbChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICoKKwkJCWFoY19mZXRjaF90cmFuc2luZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICAgY2hhciBjaGFubmVsLCB1X2ludCBvdXJfaWQsCisJCQkJCSAgICB1X2ludCByZW1vdGVfaWQsCisJCQkJCSAgICBzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqKnRzdGF0ZSk7CitzdGF0aWMgX19pbmxpbmUgdWludDE2X3QKKwkJCWFoY19pbncoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19vdXR3KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCwKKwkJCQkgdV9pbnQgdmFsdWUpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CisJCQlhaGNfaW5sKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfb3V0bChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsCisJCQkJIHVpbnQzMl90IHZhbHVlKTsKK3N0YXRpYyBfX2lubGluZSB1aW50NjRfdAorCQkJYWhjX2lucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX291dHEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0LAorCQkJCSB1aW50NjRfdCB2YWx1ZSk7CitzdGF0aWMgX19pbmxpbmUgc3RydWN0IHNjYioKKwkJCWFoY19nZXRfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfZnJlZV9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCWFoY19xdWV1ZV9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKgorCQkJYWhjX2dldF9zZW5zZV9idWYoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKKwkJCWFoY19nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VxdWVuY2VyIHJlcG9ydGVkIGEgcmVzaWR1YWwKKyAqIGZvciB0aGlzIFNDQi90cmFuc2FjdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY191cGRhdGVfcmVzaWR1YWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJdWludDMyX3Qgc2dwdHI7CisKKwlzZ3B0ciA9IGFoY19sZTMydG9oKHNjYi0+aHNjYi0+c2dwdHIpOworCWlmICgoc2dwdHIgJiBTR19SRVNJRF9WQUxJRCkgIT0gMCkKKwkJYWhjX2NhbGNfcmVzaWR1YWwoYWhjLCBzY2IpOworfQorCisvKgorICogUmV0dXJuIHBvaW50ZXJzIHRvIHRoZSB0cmFuc2ZlciBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbgorICogZm9yIHRoZSBzcGVjaWZpZWQgb3VyX2lkL3JlbW90ZV9pZCBwYWlyLgorICovCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKgorYWhjX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgY2hhbm5lbCwgdV9pbnQgb3VyX2lkLAorCQkgICAgdV9pbnQgcmVtb3RlX2lkLCBzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqKnRzdGF0ZSkKK3sKKwkvKgorCSAqIFRyYW5zZmVyIGRhdGEgc3RydWN0dXJlcyBhcmUgc3RvcmVkIGZyb20gdGhlIHBlcnNwZWN0aXZlCisJICogb2YgdGhlIHRhcmdldCByb2xlLiAgU2luY2UgdGhlIHBhcmFtZXRlcnMgZm9yIGEgY29ubmVjdGlvbgorCSAqIGluIHRoZSBpbml0aWF0b3Igcm9sZSB0byBhIGdpdmVuIHRhcmdldCBhcmUgdGhlIHNhbWUgYXMKKwkgKiB3aGVuIHRoZSByb2xlcyBhcmUgcmV2ZXJzZWQsIHdlIHByZXRlbmQgd2UgYXJlIHRoZSB0YXJnZXQuCisJICovCisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlvdXJfaWQgKz0gODsKKwkqdHN0YXRlID0gYWhjLT5lbmFibGVkX3RhcmdldHNbb3VyX2lkXTsKKwlyZXR1cm4gKCYoKnRzdGF0ZSktPnRyYW5zaW5mb1tyZW1vdGVfaWRdKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQxNl90CithaGNfaW53KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGNfaW5iKGFoYywgcG9ydCsxKSA8PCA4KSB8IGFoY19pbmIoYWhjLCBwb3J0KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfb3V0dyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsIHVfaW50IHZhbHVlKQoreworCWFoY19vdXRiKGFoYywgcG9ydCwgdmFsdWUgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorYWhjX2lubChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpCit7CisJcmV0dXJuICgoYWhjX2luYihhaGMsIHBvcnQpKQorCSAgICAgIHwgKGFoY19pbmIoYWhjLCBwb3J0KzEpIDw8IDgpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMikgPDwgMTYpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMykgPDwgMjQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19vdXRsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCwgdWludDMyX3QgdmFsdWUpCit7CisJYWhjX291dGIoYWhjLCBwb3J0LCAodmFsdWUpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzEsICgodmFsdWUpID4+IDgpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzIsICgodmFsdWUpID4+IDE2KSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCszLCAoKHZhbHVlKSA+PiAyNCkgJiAweEZGKTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQ2NF90CithaGNfaW5xKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGNfaW5iKGFoYywgcG9ydCkpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMSkgPDwgOCkKKwkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCsyKSA8PCAxNikKKwkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCszKSA8PCAyNCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzQpKSA8PCAzMikKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzUpKSA8PCA0MCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzYpKSA8PCA0OCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzcpKSA8PCA1NikpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX291dHEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0LCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlhaGNfb3V0YihhaGMsIHBvcnQsIHZhbHVlICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCsyLCAodmFsdWUgPj4gMTYpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzMsICh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrNCwgKHZhbHVlID4+IDMyKSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCs1LCAodmFsdWUgPj4gNDApICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzYsICh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrNywgKHZhbHVlID4+IDU2KSAmIDB4RkYpOworfQorCisvKgorICogR2V0IGEgZnJlZSBzY2IuIElmIHRoZXJlIGFyZSBub25lLCBzZWUgaWYgd2UgY2FuIGFsbG9jYXRlIGEgbmV3IFNDQi4KKyAqLworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY2IgKgorYWhjX2dldF9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBzY2IgKnNjYjsKKworCWlmICgoc2NiID0gU0xJU1RfRklSU1QoJmFoYy0+c2NiX2RhdGEtPmZyZWVfc2NicykpID09IE5VTEwpIHsKKwkJYWhjX2FsbG9jX3NjYnMoYWhjKTsKKwkJc2NiID0gU0xJU1RfRklSU1QoJmFoYy0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7CisJCWlmIChzY2IgPT0gTlVMTCkKKwkJCXJldHVybiAoTlVMTCk7CisJfQorCVNMSVNUX1JFTU9WRV9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMsIGxpbmtzLnNsZSk7CisJcmV0dXJuIChzY2IpOworfQorCisvKgorICogUmV0dXJuIGFuIFNDQiByZXNvdXJjZSB0byB0aGUgZnJlZSBsaXN0LgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2ZyZWVfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreyAgICAgICAKKwlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiOworCisJaHNjYiA9IHNjYi0+aHNjYjsKKwkvKiBDbGVhbiB1cCBmb3IgdGhlIG5leHQgdXNlciAqLworCWFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W2hzY2ItPnRhZ10gPSBOVUxMOworCXNjYi0+ZmxhZ3MgPSBTQ0JfRlJFRTsKKwloc2NiLT5jb250cm9sID0gMDsKKworCVNMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMsIHNjYiwgbGlua3Muc2xlKTsKKworCS8qIE5vdGlmeSB0aGUgT1NNIHRoYXQgYSByZXNvdXJjZSBpcyBub3cgYXZhaWxhYmxlLiAqLworCWFoY19wbGF0Zm9ybV9zY2JfZnJlZShhaGMsIHNjYik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc2NiICoKK2FoY19sb29rdXBfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGFnKQoreworCXN0cnVjdCBzY2IqIHNjYjsKKworCXNjYiA9IGFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W3RhZ107CisJaWYgKHNjYiAhPSBOVUxMKQorCQlhaGNfc3luY19zY2IoYWhjLCBzY2IsCisJCQkgICAgIEJVU19ETUFTWU5DX1BPU1RSRUFEfEJVU19ETUFTWU5DX1BPU1RXUklURSk7CisJcmV0dXJuIChzY2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0IGhhcmR3YXJlX3NjYiAqcV9oc2NiOworCXVfaW50ICBzYXZlZF90YWc7CisKKwkvKgorCSAqIE91ciBxdWV1aW5nIG1ldGhvZCBpcyBhIGJpdCB0cmlja3kuICBUaGUgY2FyZAorCSAqIGtub3dzIGluIGFkdmFuY2Ugd2hpY2ggSFNDQiB0byBkb3dubG9hZCwgYW5kIHdlCisJICogY2FuJ3QgZGlzYXBwb2ludCBpdC4gIFRvIGFjaGlldmUgdGhpcywgdGhlIG5leHQKKwkgKiBTQ0IgdG8gZG93bmxvYWQgaXMgc2F2ZWQgb2ZmIGluIGFoYy0+bmV4dF9xdWV1ZWRfc2NiLgorCSAqIFdoZW4gd2UgYXJlIGNhbGxlZCB0byBxdWV1ZSAiYW4gYXJiaXRyYXJ5IHNjYiIsCisJICogd2UgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGluY29taW5nIEhTQ0IgdG8gdGhlIG9uZQorCSAqIHRoZSBzZXF1ZW5jZXIga25vd3MgYWJvdXQsIHN3YXAgSFNDQiBwb2ludGVycyBhbmQKKwkgKiBmaW5hbGx5IGFzc2lnbiB0aGUgU0NCIHRvIHRoZSB0YWcgaW5kZXhlZCBsb2NhdGlvbgorCSAqIGluIHRoZSBzY2JfYXJyYXkuICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBjYW4gc3RpbGwKKwkgKiBsb2NhdGUgdGhlIGNvcnJlY3QgU0NCIGJ5IFNDQl9UQUcuCisJICovCisJcV9oc2NiID0gYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2I7CisJc2F2ZWRfdGFnID0gcV9oc2NiLT50YWc7CisJbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNjYi0+aHNjYikpOworCWlmICgoc2NiLT5mbGFncyAmIFNDQl9DREIzMl9QVFIpICE9IDApIHsKKwkJcV9oc2NiLT5zaGFyZWRfZGF0YS5jZGJfcHRyID0KKwkJICAgIGFoY19odG9sZTMyKGFoY19oc2NiX2J1c2FkZHIoYWhjLCBxX2hzY2ItPnRhZykKKwkJCSAgICAgICsgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3YXJlX3NjYiwgY2RiMzIpKTsKKwl9CisJcV9oc2NiLT50YWcgPSBzYXZlZF90YWc7CisJcV9oc2NiLT5uZXh0ID0gc2NiLT5oc2NiLT50YWc7CisKKwkvKiBOb3cgc3dhcCBIU0NCIHBvaW50ZXJzLiAqLworCWFoYy0+bmV4dF9xdWV1ZWRfc2NiLT5oc2NiID0gc2NiLT5oc2NiOworCXNjYi0+aHNjYiA9IHFfaHNjYjsKKworCS8qIE5vdyBkZWZpbmUgdGhlIG1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCIGluIHRoZSBzY2JpbmRleCAqLworCWFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W3NjYi0+aHNjYi0+dGFnXSA9IHNjYjsKK30KKworLyoKKyAqIFRlbGwgdGhlIHNlcXVlbmNlciBhYm91dCBhIG5ldyB0cmFuc2FjdGlvbiB0byBleGVjdXRlLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3F1ZXVlX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlhaGNfc3dhcF93aXRoX25leHRfaHNjYihhaGMsIHNjYik7CisKKwlpZiAoc2NiLT5oc2NiLT50YWcgPT0gU0NCX0xJU1RfTlVMTAorCSB8fCBzY2ItPmhzY2ItPm5leHQgPT0gU0NCX0xJU1RfTlVMTCkKKwkJcGFuaWMoIkF0dGVtcHQgdG8gcXVldWUgaW52YWxpZCBTQ0IgdGFnICV4OiV4XG4iLAorCQkgICAgICBzY2ItPmhzY2ItPnRhZywgc2NiLT5oc2NiLT5uZXh0KTsKKworCS8qCisJICogU2V0dXAgZGF0YSAib2RkbmVzcyIuCisJICovCisJc2NiLT5oc2NiLT5sdW4gJj0gTElEOworCWlmIChhaGNfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpICYgMHgxKQorCQlzY2ItPmhzY2ItPmx1biB8PSBTQ0JfWEZFUkxFTl9PREQ7CisKKwkvKgorCSAqIEtlZXAgYSBoaXN0b3J5IG9mIFNDQnMgd2UndmUgZG93bmxvYWRlZCBpbiB0aGUgcWluZmlmby4KKwkgKi8KKwlhaGMtPnFpbmZpZm9bYWhjLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworCisJLyoKKwkgKiBNYWtlIHN1cmUgb3VyIGRhdGEgaXMgY29uc2lzdGVudCBmcm9tIHRoZQorCSAqIHBlcnNwZWN0aXZlIG9mIHRoZSBhZGFwdGVyLgorCSAqLworCWFoY19zeW5jX3NjYihhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFUkVBRHxCVVNfRE1BU1lOQ19QUkVXUklURSk7CisKKwkvKiBUZWxsIHRoZSBhZGFwdGVyIGFib3V0IHRoZSBuZXdseSBxdWV1ZWQgU0NCICovCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJYWhjX291dGIoYWhjLCBITlNDQl9RT0ZGLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9IGVsc2UgeworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQVVUT1BBVVNFKSA9PSAwKQorCQkJYWhjX3BhdXNlKGFoYyk7CisJCWFoY19vdXRiKGFoYywgS0VSTkVMX1FJTlBPUywgYWhjLT5xaW5maWZvbmV4dCk7CisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19BVVRPUEFVU0UpID09IDApCisJCQlhaGNfdW5wYXVzZShhaGMpOworCX0KK30KKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKgorYWhjX2dldF9zZW5zZV9idWYoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IHNjYiAtIGFoYy0+c2NiX2RhdGEtPnNjYmFycmF5OworCXJldHVybiAoJmFoYy0+c2NiX2RhdGEtPnNlbnNlW29mZnNldF0pOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoY19nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gc2NiIC0gYWhjLT5zY2JfZGF0YS0+c2NiYXJyYXk7CisJcmV0dXJuIChhaGMtPnNjYl9kYXRhLT5zZW5zZV9idXNhZGRyCisJICAgICAgKyAob2Zmc2V0ICogc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcnJ1cHQgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY190cWluZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCk7CitzdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhjX2NoZWNrX2NtZGNtcGx0cXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgaW50CWFoY19pbnRyKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCkKK3sKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJLypvZmZzZXQqLzAsIC8qbGVuKi8yNTYsIG9wKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50IG9wKQoreworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKSB7CisJCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2hhcmVkX2RhdGFfZG1hdCwKKwkJCQlhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCQlhaGNfdGFyZ2V0Y21kX29mZnNldChhaGMsIDApLAorCQkJCXNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCkgKiBBSENfVE1PREVfQ01EUywKKwkJCQlvcCk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBTZWUgaWYgdGhlIGZpcm13YXJlIGhhcyBwb3N0ZWQgYW55IGNvbXBsZXRlZCBjb21tYW5kcworICogaW50byBvdXIgaW4tY29yZSBjb21tYW5kIGNvbXBsZXRlIGZpZm9zLgorICovCisjZGVmaW5lIEFIQ19SVU5fUU9VVEZJRk8gMHgxCisjZGVmaW5lIEFIQ19SVU5fVFFJTkZJRk8gMHgyCitzdGF0aWMgX19pbmxpbmUgdV9pbnQKK2FoY19jaGVja19jbWRjbXBsdHF1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9pbnQgcmV0dmFsOworCisJcmV0dmFsID0gMDsKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAorCQkJLypvZmZzZXQqL2FoYy0+cW91dGZpZm9uZXh0LCAvKmxlbiovMSwKKwkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwlpZiAoYWhjLT5xb3V0Zmlmb1thaGMtPnFvdXRmaWZvbmV4dF0gIT0gU0NCX0xJU1RfTlVMTCkKKwkJcmV0dmFsIHw9IEFIQ19SVU5fUU9VVEZJRk87CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJaWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDAKKwkgJiYgKGFoYy0+ZmxhZ3MgJiBBSENfVFFJTkZJRk9fQkxPQ0tFRCkgPT0gMCkgeworCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkJYWhjX3RhcmdldGNtZF9vZmZzZXQoYWhjLCBhaGMtPnRxaW5maWZvZm5leHQpLAorCQkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAorCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKKwkJaWYgKGFoYy0+dGFyZ2V0Y21kc1thaGMtPnRxaW5maWZvbmV4dF0uY21kX3ZhbGlkICE9IDApCisJCQlyZXR2YWwgfD0gQUhDX1JVTl9UUUlORklGTzsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKy8qCisgKiBDYXRjaCBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlcgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfaW50cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9pbnQJaW50c3RhdDsKKworCWlmICgoYWhjLT5wYXVzZSAmIElOVEVOKSA9PSAwKSB7CisJCS8qCisJCSAqIE91ciBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNoaXAKKwkJICogYW5kIG1heSBiZSBkaXNhYmxlZCBmb3IgcmUtZW50cmFuY3kgcmVhc29ucywKKwkJICogc28ganVzdCByZXR1cm4uICBUaGlzIGlzIGxpa2VseSBqdXN0IGEgc2hhcmVkCisJCSAqIGludGVycnVwdC4KKwkJICovCisJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogSW5zdGVhZCBvZiBkaXJlY3RseSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLAorCSAqIGluZmVyIHRoZSBjYXVzZSBvZiB0aGUgaW50ZXJydXB0IGJ5IGNoZWNraW5nIG91ciBpbi1jb3JlCisJICogY29tcGxldGlvbiBxdWV1ZXMuICBUaGlzIGF2b2lkcyBhIGNvc3RseSBQQ0kgYnVzIHJlYWQgaW4KKwkgKiBtb3N0IGNhc2VzLgorCSAqLworCWlmICgoYWhjLT5mbGFncyAmIChBSENfQUxMX0lOVEVSUlVQVFN8QUhDX0VER0VfSU5URVJSVVBUKSkgPT0gMAorCSAmJiAoYWhjX2NoZWNrX2NtZGNtcGx0cXVldWVzKGFoYykgIT0gMCkpCisJCWludHN0YXQgPSBDTURDTVBMVDsKKwllbHNlIHsKKwkJaW50c3RhdCA9IGFoY19pbmIoYWhjLCBJTlRTVEFUKTsKKwl9CisKKwlpZiAoKGludHN0YXQgJiBJTlRfUEVORCkgPT0gMCkgeworI2lmIEFIQ19QQ0lfQ09ORklHID4gMAorCQlpZiAoYWhjLT51bnNvbGljaXRlZF9pbnRzID4gNTAwKSB7CisJCQlhaGMtPnVuc29saWNpdGVkX2ludHMgPSAwOworCQkJaWYgKChhaGMtPmNoaXAgJiBBSENfUENJKSAhPSAwCisJCQkgJiYgKGFoY19pbmIoYWhjLCBFUlJPUikgJiBQQ0lFUlJTVEFUKSAhPSAwKQorCQkJCWFoYy0+YnVzX2ludHIoYWhjKTsKKwkJfQorI2VuZGlmCisJCWFoYy0+dW5zb2xpY2l0ZWRfaW50cysrOworCQlyZXR1cm4gKDApOworCX0KKwlhaGMtPnVuc29saWNpdGVkX2ludHMgPSAwOworCisJaWYgKGludHN0YXQgJiBDTURDTVBMVCkgeworCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSQ01ESU5UKTsKKworCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgY2hpcCBzZWVzIHRoYXQgd2UndmUgY2xlYXJlZAorCQkgKiB0aGlzIGludGVycnVwdCBiZWZvcmUgd2Ugd2FsayB0aGUgb3V0cHV0IGZpZm8uCisJCSAqIE90aGVyd2lzZSwgd2UgbWF5LCBkdWUgdG8gcG9zdGVkIGJ1cyB3cml0ZXMsCisJCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIgd2UgZmluaXNoIHRoZSBzY2FuLAorCQkgKiBhbmQgYWZ0ZXIgdGhlIHNlcXVlbmNlciBoYXMgYWRkZWQgbmV3IGVudHJpZXMKKwkJICogYW5kIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgYWdhaW4uCisJCSAqLworCQlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCQlhaGNfcnVuX3FvdXRmaWZvKGFoYyk7CisjaWZkZWYgQUhDX1RBUkdFVF9NT0RFCisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xFKSAhPSAwKQorCQkJYWhjX3J1bl90cWluZmlmbyhhaGMsIC8qcGF1c2VkKi9GQUxTRSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBzdGF0dXNlcyB0aGF0IG1heSBpbnZhbGlkYXRlIG91ciBjYWNoZWQKKwkgKiBjb3B5IG9mIElOVFNUQVQgc2VwYXJhdGVseS4KKwkgKi8KKwlpZiAoaW50c3RhdCA9PSAweEZGICYmIChhaGMtPmZlYXR1cmVzICYgQUhDX1JFTU9WQUJMRSkgIT0gMCkgeworCQkvKiBIb3QgZWplY3QuICBEbyBub3RoaW5nICovCisJfSBlbHNlIGlmIChpbnRzdGF0ICYgQlJLQURSSU5UKSB7CisJCWFoY19oYW5kbGVfYnJrYWRyaW50KGFoYyk7CisJfSBlbHNlIGlmICgoaW50c3RhdCAmIChTRVFJTlR8U0NTSUlOVCkpICE9IDApIHsKKworCQlhaGNfcGF1c2VfYnVnX2ZpeChhaGMpOworCisJCWlmICgoaW50c3RhdCAmIFNFUUlOVCkgIT0gMCkKKwkJCWFoY19oYW5kbGVfc2VxaW50KGFoYywgaW50c3RhdCk7CisKKwkJaWYgKChpbnRzdGF0ICYgU0NTSUlOVCkgIT0gMCkKKwkJCWFoY19oYW5kbGVfc2NzaWludChhaGMsIGludHN0YXQpOworCX0KKwlyZXR1cm4gKDEpOworfQorCisjZW5kaWYgIC8qIF9BSUM3WFhYX0lOTElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxYzZhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTAsMCArMSw1MDQzIEBACisvKgorICogQWRhcHRlYyBBSUM3eHh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2xpbnV4L2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMjMjM1ICQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgSm9obiBBeWNvY2sKKyAqICAgVGhlIFVuaXZlcnNpdHkgb2YgQ2FsZ2FyeSBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTb3VyY2VzIGluY2x1ZGUgdGhlIEFkYXB0ZWMgMTc0MCBkcml2ZXIgKGFoYTE3NDAuYyksIHRoZSBVbHRyYXN0b3IgMjRGCisgKiBkcml2ZXIgKHVsdHJhc3Rvci5jKSwgdmFyaW91cyBMaW51eCBrZXJuZWwgc291cmNlLCB0aGUgQWRhcHRlYyBFSVNBCisgKiBjb25maWcgZmlsZSAoIWFkcDc3NzEuY2ZnKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDBBIFNlcmllcyBVc2VyJ3MgR3VpZGUsCisgKiB0aGUgTGludXggS2VybmVsIEhhY2tlcidzIEd1aWRlLCBXcml0aW5nIGEgU0NTSSBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCwKKyAqIHRoZSBBZGFwdGVjIDE1NDIgZHJpdmVyIChhaGExNTQyLmMpLCB0aGUgQWRhcHRlYyBFSVNBIG92ZXJsYXkgZmlsZQorICogKGFkcDc3NzAub3ZsKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDAgU2VyaWVzIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLAorICogdGhlIEFkYXB0ZWMgQUlDLTc3NzAgRGF0YSBCb29rLCB0aGUgQU5TSSBTQ1NJIHNwZWNpZmljYXRpb24sIHRoZQorICogQU5TSSBTQ1NJLTIgc3BlY2lmaWNhdGlvbiAoZHJhZnQgMTBjKSwgLi4uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgTW9kaWZpY2F0aW9ucyBieSBEYW5pZWwgTS4gRWlzY2hlbiAoZGVpc2NoZW5AaXdvcmtzLkludGVyV29ya3Mub3JnKToKKyAqCisgKiAgU3Vic3RhbnRpYWxseSBtb2RpZmllZCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHdpZGUgYW5kIHR3aW4gYnVzCisgKiAgYWRhcHRlcnMsIERNQWluZyBvZiBTQ0JzLCB0YWdnZWQgcXVldWVpbmcsIElSUSBzaGFyaW5nLCBidWcgZml4ZXMsCisgKiAgU0NCIHBhZ2luZywgYW5kIG90aGVyIHJld29yayBvZiB0aGUgY29kZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhhbmtzIGFsc28gZ28gdG8gKGluIGFscGhhYmV0aWNhbCBvcmRlcikgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgICBSb3J5IEJvbHQgICAgIC0gU2VxdWVuY2VyIGJ1ZyBmaXhlcworICogICAgSmF5IEVzdGFicm9vayAtIEluaXRpYWwgREVDIEFscGhhIHN1cHBvcnQKKyAqICAgIERvdWcgTGVkZm9yZCAgLSBNdWNoIG5lZWRlZCBhYm9ydC9yZXNldCBidWcgZml4ZXMKKyAqICAgIEthaSBNYWtpc2FyYSAgLSBETUFpbmcgb2YgU0NCcworICoKKyAqICBBIEJvb3QgdGltZSBvcHRpb24gd2FzIGFsc28gYWRkZWQgZm9yIG5vdCByZXNldHRpbmcgdGhlIHNjc2kgYnVzLgorICoKKyAqICAgIEZvcm06ICBhaWM3eHh4PWV4dGVuZGVkCisgKiAgICAgICAgICAgYWljN3h4eD1ub19yZXNldAorICogICAgICAgICAgIGFpYzd4eHg9dmVyYm9zZQorICoKKyAqICBEYW5pZWwgTS4gRWlzY2hlbiwgZGVpc2NoZW5AaXdvcmtzLkludGVyV29ya3Mub3JnLCAxLzIzLzk3CisgKgorICogIElkOiBhaWM3eHh4LmMsdiA0LjEgMTk5Ny8wNi8xMiAwODoyMzo0MiBkZWFuZyBFeHAKKyAqLworCisvKgorICogRnVydGhlciBkcml2ZXIgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBEb3VnIExlZGZvcmQKKyAqCisgKiBUaGVzZSBjaGFuZ2VzIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgdGVybXMgYXMgdGhlIEZyZWVCU0QKKyAqIGRyaXZlciB3cml0dGVuIGJ5IEp1c3RpbiBHaWJicy4gIFBsZWFzZSBzZWUgaGlzIENvcHlyaWdodCBub3RpY2UgYWJvdmUKKyAqIGZvciB0aGUgZXhhY3QgdGVybXMgYW5kIGNvbmRpdGlvbnMgY292ZXJpbmcgbXkgY2hhbmdlcyBhcyB3ZWxsIGFzIHRoZQorICogd2FycmFudHkgc3RhdGVtZW50LgorICoKKyAqIE1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgYWljN3h4eC5jLHYgNC4xIGRyaXZlciBmcm9tIERhbiBFaXNjaGVuIGluY2x1ZGUKKyAqIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG86CisgKgorICogIDE6IEltcG9ydCBvZiB0aGUgbGF0ZXN0IEZyZWVCU0Qgc2VxdWVuY2VyIGNvZGUgZm9yIHRoaXMgZHJpdmVyCisgKiAgMjogTW9kaWZpY2F0aW9uIG9mIGtlcm5lbCBjb2RlIHRvIGFjY29tbW9kYXRlIGRpZmZlcmVudCBzZXF1ZW5jZXIgc2VtYW50aWNzCisgKiAgMzogRXh0ZW5zaXZlIGNoYW5nZXMgdGhyb3VnaG91dCBrZXJuZWwgcG9ydGlvbiBvZiBkcml2ZXIgdG8gaW1wcm92ZQorICogICAgIGFib3J0L3Jlc2V0IHByb2Nlc3NpbmcgYW5kIGVycm9yIGhhbm5kbGluZworICogIDQ6IE90aGVyIHdvcmsgY29udHJpYnV0ZWQgYnkgdmFyaW91cyBwZW9wbGUgb24gdGhlIEludGVybmV0CisgKiAgNTogQ2hhbmdlcyB0byBwcmludGsgaW5mb3JtYXRpb24gYW5kIHZlcmJvc2l0eSBzZWxlY3Rpb24gY29kZQorICogIDY6IEdlbmVyYWwgcmVsaWFiaWxpdHkgcmVsYXRlZCBjaGFuZ2VzLCBlc3BlY2lhbGx5IGluIElSUSBtYW5hZ2VtZW50CisgKiAgNzogTW9kaWZpY2F0aW9ucyB0byB0aGUgZGVmYXVsdCBwcm9iZS9hdHRhY2ggb3JkZXIgZm9yIHN1cHBvcnRlZCBjYXJkcworICogIDg6IFNNUCBmcmllbmRsaW5lc3MgaGFzIGJlZW4gaW1wcm92ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgImFpYzd4eHhfb3NtLmgiCisjaW5jbHVkZSAiYWljN3h4eF9pbmxpbmUuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworLyoKKyAqIEluY2x1ZGUgYWljbGliLmMgYXMgcGFydCBvZiBvdXIKKyAqICJtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBoYXJkIiB3b3JrIGFyb3VuZC4KKyAqLworI2luY2x1ZGUgImFpY2xpYi5jIgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19zZXR1cCAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaW5jbHVkZSAic2QuaCIJCQkvKiBGb3IgZ2VvbWV0cnkgZGV0ZWN0aW9uICovCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBGb3IgZmV0Y2hpbmcgc3lzdGVtIG1lbW9yeSBzaXplICovCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CQkvKiBGb3IgYmxvY2tfc2l6ZSgpICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHNzbGVlcC9tc2xlZXAgKi8KKworLyoKKyAqIExvY2sgcHJvdGVjdGluZyBtYW5pcHVsYXRpb24gb2YgdGhlIGFoYyBzb2Z0YyBsaXN0LgorICovCitzcGlubG9ja190IGFoY19saXN0X3NwaW5sb2NrOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisvKiBGb3IgZHluYW1pYyBzZ2xpc3Qgc2l6ZSBjYWxjdWxhdGlvbi4gKi8KK3VfaW50IGFoY19saW51eF9uc2VnOworI2VuZGlmCisKKy8qCisgKiBTZXQgdGhpcyB0byB0aGUgZGVsYXkgaW4gc2Vjb25kcyBhZnRlciBTQ1NJIGJ1cyByZXNldC4KKyAqIE5vdGUsIHdlIGhvbm9yIHRoaXMgb25seSBmb3IgdGhlIGluaXRpYWwgYnVzIHJlc2V0LgorICogVGhlIHNjc2kgZXJyb3IgcmVjb3ZlcnkgY29kZSBwZXJmb3JtcyBpdHMgb3duIGJ1cyBzZXR0bGUKKyAqIGRlbGF5IGhhbmRsaW5nIGZvciBlcnJvciByZWNvdmVyeSBhY3Rpb25zLgorICovCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfUkVTRVRfREVMQVlfTVMKKyNkZWZpbmUgQUlDN1hYWF9SRVNFVF9ERUxBWSBDT05GSUdfQUlDN1hYWF9SRVNFVF9ERUxBWV9NUworI2Vsc2UKKyNkZWZpbmUgQUlDN1hYWF9SRVNFVF9ERUxBWSA1MDAwCisjZW5kaWYKKworLyoKKyAqIENvbnRyb2wgY29sbGVjdGlvbiBvZiBTQ1NJIHRyYW5zZmVyIHN0YXRpc3RpY3MgZm9yIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICoKKyAqIE5PVEU6IERvIE5PVCBlbmFibGUgdGhpcyB3aGVuIHJ1bm5pbmcgb24ga2VybmVscyB2ZXJzaW9uIDEuMi54IGFuZCBiZWxvdy4KKyAqIE5PVEU6IFRoaXMgZG9lcyBhZmZlY3QgcGVyZm9ybWFuY2Ugc2luY2UgaXQgaGFzIHRvIG1haW50YWluIHN0YXRpc3RpY3MuCisgKi8KKyNpZmRlZiBDT05GSUdfQUlDN1hYWF9QUk9DX1NUQVRTCisjZGVmaW5lIEFJQzdYWFhfUFJPQ19TVEFUUworI2VuZGlmCisKKy8qCisgKiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHRhZ2dlZCB0cmFuc2FjdGlvbnMgYWxsb3dlZCBwZXItZGV2aWNlLAorICogYWRkIGEgbGluZSB0byB0aGUgbGlsby5jb25mIGZpbGUgbGlrZToKKyAqIGFwcGVuZD0iYWljN3h4eD12ZXJib3NlLHRhZ19pbmZvOnt7MzIsMzIsMzIsMzJ9LHszMiwzMiwzMiwzMn19IgorICogd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGZpcnN0IGZvdXIgZGV2aWNlcyBvbiB0aGUgZmlyc3QgdHdvCisgKiBjb250cm9sbGVycyBiZWluZyBzZXQgdG8gYSB0YWdnZWQgcXVldWUgZGVwdGggb2YgMzIuCisgKgorICogVGhlIHRhZ19jb21tYW5kcyBpcyBhbiBhcnJheSBvZiAxNiB0byBhbGxvdyBmb3Igd2lkZSBhbmQgdHdpbiBhZGFwdGVycy4KKyAqIFR3aW4gYWRhcHRlcnMgd2lsbCB1c2UgaW5kZXhlcyAwLTcgZm9yIGNoYW5uZWwgMCwgYW5kIGluZGV4ZXMgOC0xNQorICogZm9yIGNoYW5uZWwgMS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgdGFnX2NvbW1hbmRzWzE2XTsJLyogQWxsb3cgZm9yIHdpZGUvdHdpbiBhZGFwdGVycy4gKi8KK30gYWRhcHRlcl90YWdfaW5mb190OworCisvKgorICogTW9kaWZ5IHRoaXMgYXMgeW91IHNlZSBmaXQgZm9yIHlvdXIgc3lzdGVtLgorICoKKyAqIDAJCQl0YWdnZWQgcXVldWluZyBkaXNhYmxlZAorICogMSA8PSBuIDw9IDI1MwluID09IG1heCB0YWdzIGV2ZXIgZGlzcGF0Y2hlZC4KKyAqCisgKiBUaGUgZHJpdmVyIHdpbGwgdGhyb3R0bGUgdGhlIG51bWJlciBvZiBjb21tYW5kcyBkaXNwYXRjaGVkIHRvIGEKKyAqIGRldmljZSBpZiBpdCByZXR1cm5zIHF1ZXVlIGZ1bGwuICBGb3IgZGV2aWNlcyB3aXRoIGEgZml4ZWQgbWF4aW11bQorICogcXVldWUgZGVwdGgsIHRoZSBkcml2ZXIgd2lsbCBldmVudHVhbGx5IGRldGVybWluZSB0aGlzIGRlcHRoIGFuZAorICogbG9jayBpdCBpbiAoYSBjb25zb2xlIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbG9jaworICogaGFzIG9jY3VycmVkKS4gIE9uIHNvbWUgZGV2aWNlcywgcXVldWUgZnVsbCBpcyByZXR1cm5lZCBmb3IgYSB0ZW1wb3JhcnkKKyAqIHJlc291cmNlIHNob3J0YWdlLiAgVGhlc2UgZGV2aWNlcyB3aWxsIHJldHVybiBxdWV1ZSBmdWxsIGF0IHZhcnlpbmcKKyAqIGRlcHRocy4gIFRoZSBkcml2ZXIgd2lsbCB0aHJvdHRsZSBiYWNrIHdoZW4gdGhlIHF1ZXVlIGZ1bGxzIG9jY3VyIGFuZAorICogYXR0ZW1wdCB0byBzbG93bHkgaW5jcmVhc2UgdGhlIGRlcHRoIG92ZXIgdGltZSBhcyB0aGUgZGV2aWNlIHJlY292ZXJzCisgKiBmcm9tIHRoZSByZXNvdXJjZSBzaG9ydGFnZS4KKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIHdpbGwgZGlzYWJsZSB0YWdnZWQgcXVldWVpbmcgZm9yIGFsbAorICogdGhlIGRldmljZXMgb24gdGhlIGZpcnN0IHByb2JlZCBhaWM3eHh4IGFkYXB0ZXIuCisgKgorICogVGhlIHNlY29uZCBsaW5lIGVuYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIHdpdGggNCBjb21tYW5kcy9MVU4gZm9yIElEcworICogKDAsIDItMTEsIDEzLTE1KSwgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciBJRCAxMiwgYW5kIHRlbGxzIHRoZQorICogZHJpdmVyIHRvIGF0dGVtcHQgdG8gdXNlIHVwIHRvIDY0IHRhZ3MgZm9yIElEIDEuCisgKgorICogVGhlIHRoaXJkIGxpbmUgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpbmUuCisgKgorICogVGhlIGZvdXJ0aCBsaW5lIGRpc2FibGVzIHRhZ2dlZCBxdWV1ZWluZyBmb3IgZGV2aWNlcyAwIGFuZCAzLiAgSXQKKyAqIGVuYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciB0aGUgb3RoZXIgSURzLCB3aXRoIDE2IGNvbW1hbmRzL0xVTgorICogZm9yIElEcyAxIGFuZCA0LCAxMjcgY29tbWFuZHMvTFVOIGZvciBJRCA4LCBhbmQgNCBjb21tYW5kcy9MVU4gZm9yCisgKiBJRHMgMiwgNS03LCBhbmQgOS0xNS4KKyAqLworCisvKgorICogTk9URTogVGhlIGJlbG93IHN0cnVjdHVyZSBpcyBmb3IgcmVmZXJlbmNlIG9ubHksIHRoZSBhY3R1YWwgc3RydWN0dXJlCisgKiAgICAgICB0byBtb2RpZnkgaW4gb3JkZXIgdG8gY2hhbmdlIHRoaW5ncyBpcyBqdXN0IGJlbG93IHRoaXMgY29tbWVudCBibG9jay4KK2FkYXB0ZXJfdGFnX2luZm9fdCBhaWM3eHh4X3RhZ19pbmZvW10gPQoreworCXt7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH19LAorCXt7NCwgNjQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDQsIDQsIDR9fSwKKwl7ezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9fSwKKwl7ezAsIDE2LCA0LCAwLCAxNiwgNCwgNCwgNCwgMTI3LCA0LCA0LCA0LCA0LCA0LCA0LCA0fX0KK307CisqLworCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfQ01EU19QRVJfREVWSUNFCisjZGVmaW5lIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFIENPTkZJR19BSUM3WFhYX0NNRFNfUEVSX0RFVklDRQorI2Vsc2UKKyNkZWZpbmUgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UgQUhDX01BWF9RVUVVRQorI2VuZGlmCisKKyNkZWZpbmUgQUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFMgewkJCQkJXAorCUFJQzdYWFhfQ01EU19QRVJfREVWSUNFLCBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzdYWFhfQ01EU19QRVJfREVWSUNFLCBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsCQlcCisJQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UsIEFJQzdYWFhfQ01EU19QRVJfREVWSUNFLAkJXAorCUFJQzdYWFhfQ01EU19QRVJfREVWSUNFLCBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwJCVwKKwlBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSwgQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0UJCVwKK30KKworLyoKKyAqIEJ5IGRlZmF1bHQsIHVzZSB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIHNwZWNpZmllZCBieQorICogdGhlIHVzZXJzIGtlcm5lbCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgYWRhcHRlcl90YWdfaW5mb190IGFpYzd4eHhfdGFnX2luZm9bXSA9Cit7CisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfSwKKwl7QUlDN1hYWF9DT05GSUdFRF9UQUdfQ09NTUFORFN9LAorCXtBSUM3WFhYX0NPTkZJR0VEX1RBR19DT01NQU5EU30sCisJe0FJQzdYWFhfQ09ORklHRURfVEFHX0NPTU1BTkRTfQorfTsKKworLyoKKyAqIERWIG9wdGlvbjoKKyAqCisgKiBwb3NpdGl2ZSB2YWx1ZSA9IERWIEVuYWJsZWQKKyAqIHplcm8JCSAgPSBEViBEaXNhYmxlZAorICogbmVnYXRpdmUgdmFsdWUgPSBEViBEZWZhdWx0IGZvciBhZGFwdGVyIHR5cGUvc2VlcHJvbQorICovCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfRFZfU0VUVElORworI2RlZmluZSBBSUM3WFhYX0NPTkZJR0VEX0RWIENPTkZJR19BSUM3WFhYX0RWX1NFVFRJTkcKKyNlbHNlCisjZGVmaW5lIEFJQzdYWFhfQ09ORklHRURfRFYgLTEKKyNlbmRpZgorCitzdGF0aWMgaW50OF90IGFpYzd4eHhfZHZfc2V0dGluZ3NbXSA9Cit7CisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EViwKKwlBSUM3WFhYX0NPTkZJR0VEX0RWLAorCUFJQzdYWFhfQ09ORklHRURfRFYsCisJQUlDN1hYWF9DT05GSUdFRF9EVgorfTsKKworLyoKKyAqIFRoZXJlIHNob3VsZCBiZSBhIHNwZWNpZmljIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBpbiBzY3NpLmgsIGJ1dAorICogaXQgc2VlbXMgdGhhdCBtb3N0IGRyaXZlcnMgaWdub3JlIGl0LgorICovCisjZGVmaW5lIERJRF9VTkRFUkZMT1cgICBESURfRVJST1IKKwordm9pZAorYWhjX3ByaW50X3BhdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcHJpbnRrKCIoc2NzaSVkOiVjOiVkOiVkKTogIiwKKwkgICAgICAgYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LT5ob3N0X25vLAorCSAgICAgICBzY2IgIT0gTlVMTCA/IFNDQl9HRVRfQ0hBTk5FTChhaGMsIHNjYikgOiAnWCcsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9UQVJHRVQoYWhjLCBzY2IpIDogLTEsCisJICAgICAgIHNjYiAhPSBOVUxMID8gU0NCX0dFVF9MVU4oc2NiKSA6IC0xKTsKK30KKworLyoKKyAqIFhYWCAtIHRoZXNlIG9wdGlvbnMgYXBwbHkgdW5pbGF0ZXJhbGx5IHRvIF9hbGxfIDI3NHgvMjg0eC8yOTR4CisgKiAgICAgICBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQuICBFeGNlcHRpb25zIHRvIHRoaXMKKyAqICAgICAgIHJ1bGUgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cy4KKyAqLworCisvKgorICogU2tpcCB0aGUgc2NzaSBidXMgcmVzZXQuICBOb24gMCBtYWtlIHVzIHNraXAgdGhlIHJlc2V0IGF0IHN0YXJ0dXAuICBUaGlzCisgKiBoYXMgbm8gZWZmZWN0IG9uIGFueSBsYXRlciByZXNldHMgdGhhdCBtaWdodCBvY2N1ciBkdWUgdG8gdGhpbmdzIGxpa2UKKyAqIFNDU0kgYnVzIHRpbWVvdXRzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9ub19yZXNldDsKKworLyoKKyAqIENlcnRhaW4gUENJIG1vdGhlcmJvYXJkcyB3aWxsIHNjYW4gUENJIGRldmljZXMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwKKyAqIG90aGVycyBzY2FuIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QsIGFuZCB0aGV5IHRlbmQgdG8gZG8gYWxsIGtpbmRzIG9mCisgKiBzdHJhbmdlIHRoaW5ncyB3aGVuIHRoZXkgY29tZSBpbnRvIGNvbnRhY3Qgd2l0aCBQQ0kgYnJpZGdlIGNoaXBzLiAgVGhlCisgKiBuZXQgcmVzdWx0IG9mIGFsbCB0aGlzIGlzIHRoYXQgdGhlIFBDSSBjYXJkIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCB0byBib290CisgKiB0aGUgbWFjaGluZSBpcyB2ZXJ5IGhhcmQgdG8gZGV0ZWN0LiAgTW9zdCBtb3RoZXJib2FyZHMgZ28gZnJvbSBsb3dlc3QKKyAqIFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0LCBhbmQgdGhlIGZpcnN0IFNDU0kgY29udHJvbGxlciBmb3VuZCBpcyB0aGUKKyAqIG9uZSB5b3UgYm9vdCBmcm9tLiAgVGhlIG9ubHkgZXhjZXB0aW9ucyB0byB0aGlzIGFyZSB3aGVuIGEgY29udHJvbGxlcgorICogaGFzIGl0cyBCSU9TIGRpc2FibGVkLiAgU28sIHdlIGJ5IGRlZmF1bHQgc29ydCBhbGwgb2Ygb3VyIFNDU0kgY29udHJvbGxlcnMKKyAqIGZyb20gbG93ZXN0IFBDSSBzbG90IG51bWJlciB0byBoaWdoZXN0IFBDSSBzbG90IG51bWJlci4gIFdlIGFsc28gZm9yY2UKKyAqIGFsbCBjb250cm9sbGVycyB3aXRoIHRoZWlyIEJJT1MgZGlzYWJsZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFRoaXMKKyAqIHdvcmtzIG9uICphbG1vc3QqIGFsbCBjb21wdXRlcnMuICBXaGVyZSBpdCBkb2Vzbid0IHdvcmssIHdlIGhhdmUgdGhpcworICogb3B0aW9uLiAgU2V0dGluZyB0aGlzIG9wdGlvbiB0byBub24tMCB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0CisgKiB0byBoaWdoZXN0IGZpcnN0LCB0aGVuIGxvd2VzdCwgYnV0IHdpbGwgc3RpbGwgbGVhdmUgY2FyZHMgd2l0aCB0aGVpciBCSU9TCisgKiBkaXNhYmxlZCBhdCB0aGUgdmVyeSBlbmQuICBUaGF0IHNob3VsZCBmaXggZXZlcnlvbmUgdXAgdW5sZXNzIHRoZXJlIGFyZQorICogcmVhbGx5IHN0cmFuZ2UgY2lydW1zdGFuY2VzLgorICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9yZXZlcnNlX3NjYW47CisKKy8qCisgKiBTaG91bGQgd2UgZm9yY2UgRVhURU5ERUQgdHJhbnNsYXRpb24gb24gYSBjb250cm9sbGVyLgorICogICAgIDAgPT0gVXNlIHdoYXRldmVyIGlzIGluIHRoZSBTRUVQUk9NIG9yIGRlZmF1bHQgdG8gb2ZmCisgKiAgICAgMSA9PSBVc2Ugd2hhdGV2ZXIgaXMgaW4gdGhlIFNFRVBST00gb3IgZGVmYXVsdCB0byBvbgorICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9leHRlbmRlZDsKKworLyoKKyAqIFBDSSBidXMgcGFyaXR5IGNoZWNraW5nIG9mIHRoZSBBZGFwdGVjIGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBzb21ld2hhdAorICogZHViaW91cyBhdCBiZXN0LiAgVG8gbXkga25vd2xlZGdlLCB0aGlzIG9wdGlvbiBoYXMgbmV2ZXIgYWN0dWFsbHkKKyAqIHNvbHZlZCBhIFBDSSBwYXJpdHkgcHJvYmxlbSwgYnV0IG9uIGNlcnRhaW4gbWFjaGluZXMgd2l0aCBicm9rZW4gUENJCisgKiBjaGlwc2V0IGNvbmZpZ3VyYXRpb25zIHdoZXJlIHN0cmF5IFBDSSB0cmFuc2FjdGlvbnMgd2l0aCBiYWQgcGFyaXR5IGFyZQorICogdGhlIG5vcm0gcmF0aGVyIHRoYW4gdGhlIGV4Y2VwdGlvbiwgdGhlIGVycm9yIG1lc3NhZ2VzIGNhbiBiZSBvdmVyd2VsbWluZy4KKyAqIEl0J3MgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciBmb3IgY29tcGxldGVuZXNzLgorICogICAwCSAgID0gU2h1dCBvZmYgUENJIHBhcml0eSBjaGVjaworICogICBub24tMCA9IHJldmVyc2UgcG9sYXJpdHkgcGNpIHBhcml0eSBjaGVja2luZworICovCitzdGF0aWMgdWludDMyX3QgYWljN3h4eF9wY2lfcGFyaXR5ID0gfjA7CisKKy8qCisgKiBDZXJ0YWluIG5ld2VyIG1vdGhlcmJvYXJkcyBoYXZlIHB1dCBuZXcgUENJIGJhc2VkIGRldmljZXMgaW50byB0aGUKKyAqIElPIHNwYWNlcyB0aGF0IHVzZWQgdG8gdHlwaWNhbGx5IGJlIG9jY3VwaWVkIGJ5IFZMQiBvciBFSVNBIGNhcmRzLgorICogVGhpcyBvdmVybGFwIGNhbiBjYXVzZSB0aGVzZSBuZXdlciBtb3RoZXJib2FyZHMgdG8gbG9jayB1cCB3aGVuIHNjYW5uZWQKKyAqIGZvciBvbGRlciBFSVNBIGFuZCBWTEIgZGV2aWNlcy4gIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gbm9uLTAgd2lsbAorICogY2F1c2UgdGhlIGRyaXZlciB0byBza2lwIHNjYW5uaW5nIGZvciBhbnkgVkxCIG9yIEVJU0EgY29udHJvbGxlcnMgYW5kCisgKiBvbmx5IHN1cHBvcnQgdGhlIFBDSSBjb250cm9sbGVycy4gIE5PVEU6IHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUga2VybmVsCisgKiBvcyBjb21waWxlZCB3aXRoIFBDSSBzdXBwb3J0IGRpc2FibGVkLCB0aGVuIHNldHRpbmcgdGhpcyB0byBub24tMAorICogd291bGQgcmVzdWx0IGluIG5ldmVyIGZpbmRpbmcgYW55IGRldmljZXMgOikKKyAqLworI2lmbmRlZiBDT05GSUdfQUlDN1hYWF9QUk9CRV9FSVNBX1ZMCit1aW50MzJfdCBhaWM3eHh4X3Byb2JlX2Vpc2Ffdmw7CisjZWxzZQordWludDMyX3QgYWljN3h4eF9wcm9iZV9laXNhX3ZsID0gfjA7CisjZW5kaWYKKworLyoKKyAqIFRoZXJlIGFyZSBsb3RzIG9mIGJyb2tlbiBjaGlwc2V0cyBpbiB0aGUgd29ybGQuICBTb21lIG9mIHRoZW0gd2lsbAorICogdmlvbGF0ZSB0aGUgUENJIHNwZWMgd2hlbiB3ZSBpc3N1ZSBieXRlIHNpemVkIG1lbW9yeSB3cml0ZXMgdG8gb3VyCisgKiBjb250cm9sbGVyLiAgSS9PIG1hcHBlZCByZWdpc3RlciBhY2Nlc3MsIGlmIGFsbG93ZWQgYnkgdGhlIGdpdmVuCisgKiBwbGF0Zm9ybSwgd2lsbCB3b3JrIGluIGFsbW9zdCBhbGwgY2FzZXMuCisgKi8KK3VpbnQzMl90IGFpYzd4eHhfYWxsb3dfbWVtaW8gPSB+MDsKKworLyoKKyAqIGFpYzd4eHhfZGV0ZWN0KCkgaGFzIGJlZW4gcnVuLCBzbyByZWdpc3RlciBhbGwgZGV2aWNlIGFycml2YWxzCisgKiBpbW1lZGlhdGVseSB3aXRoIHRoZSBzeXN0ZW0gcmF0aGVyIHRoYW4gZGVmZXJyaW5nIHRvIHRoZSBzb3J0ZWQKKyAqIGF0dGFjaG1lbnQgcGVyZm9ybWVkIGJ5IGFpYzd4eHhfZGV0ZWN0KCkuCisgKi8KK2ludCBhaWM3eHh4X2RldGVjdF9jb21wbGV0ZTsKKworLyoKKyAqIFNvIHRoYXQgd2UgY2FuIHNldCBob3cgbG9uZyBlYWNoIGRldmljZSBpcyBnaXZlbiBhcyBhIHNlbGVjdGlvbiB0aW1lb3V0LgorICogVGhlIHRhYmxlIG9mIHZhbHVlcyBnb2VzIGxpa2UgdGhpczoKKyAqICAgMCAtIDI1Nm1zCisgKiAgIDEgLSAxMjhtcworICogICAyIC0gNjRtcworICogICAzIC0gMzJtcworICogV2UgZGVmYXVsdCB0byAyNTZtcyBiZWNhdXNlIHNvbWUgb2xkZXIgZGV2aWNlcyBuZWVkIGEgbG9uZ2VyIHRpbWUKKyAqIHRvIHJlc3BvbmQgdG8gaW5pdGlhbCBzZWxlY3Rpb24uCisgKi8KK3N0YXRpYyB1aW50MzJfdCBhaWM3eHh4X3NlbHRpbWU7CisKKy8qCisgKiBDZXJ0YWluIGRldmljZXMgZG8gbm90IHBlcmZvcm0gYW55IGFnaW5nIG9uIGNvbW1hbmRzLiAgU2hvdWxkIHRoZQorICogZGV2aWNlIGJlIHNhdHVyYXRlZCBieSBjb21tYW5kcyBpbiBvbmUgcG9ydGlvbiBvZiB0aGUgZGlzaywgaXQgaXMKKyAqIHBvc3NpYmxlIGZvciB0cmFuc2FjdGlvbnMgb24gZmFyIGF3YXkgc2VjdG9ycyB0byBuZXZlciBiZSBzZXJ2aWNlZC4KKyAqIFRvIGhhbmRsZSB0aGVzZSBkZXZpY2VzLCB3ZSBjYW4gcGVyaW9kaWNhbGx5IHNlbmQgYW4gb3JkZXJlZCB0YWcgdG8KKyAqIGZvcmNlIGFsbCBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgdG8gYmUgc2VydmljZWQgcHJpb3IgdG8gYSBuZXcKKyAqIHRyYW5zYWN0aW9uLgorICovCit1aW50MzJfdCBhaWM3eHh4X3BlcmlvZGljX290YWc7CisKKy8qCisgKiBNb2R1bGUgaW5mb3JtYXRpb24gYW5kIHNldHRhYmxlIG9wdGlvbnMuCisgKi8KK3N0YXRpYyBjaGFyICphaWM3eHh4ID0gTlVMTDsKKworTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogSnVzdGluIFQuIEdpYmJzIDxnaWJic0BzY3NpZ3V5LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWRhcHRlYyBBaWM3N1hYLzc4WFggU0NTSSBIb3N0IEJ1cyBBZGFwdGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oQUlDN1hYWF9EUklWRVJfVkVSU0lPTik7Cittb2R1bGVfcGFyYW0oYWljN3h4eCwgY2hhcnAsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhaWM3eHh4LAorInBlcmlvZCBkZWxpbWl0ZWQsIG9wdGlvbnMgc3RyaW5nLlxuIgorIgl2ZXJib3NlCQkJRW5hYmxlIHZlcmJvc2UvZGlhZ25vc3RpYyBsb2dnaW5nXG4iCisiCWFsbG93X21lbWlvCQlBbGxvdyBkZXZpY2UgcmVnaXN0ZXJzIHRvIGJlIG1lbW9yeSBtYXBwZWRcbiIKKyIJZGVidWcJCQlCaXRtYXNrIG9mIGRlYnVnIHZhbHVlcyB0byBlbmFibGVcbiIKKyIJbm9fcHJvYmUJCVRvZ2dsZSBFSVNBL1ZMQiBjb250cm9sbGVyIHByb2JpbmdcbiIKKyIJcHJvYmVfZWlzYV92bAkJVG9nZ2xlIEVJU0EvVkxCIGNvbnRyb2xsZXIgcHJvYmluZ1xuIgorIglub19yZXNldAkJU3VwcmVzcyBpbml0aWFsIGJ1cyByZXNldHNcbiIKKyIJZXh0ZW5kZWQJCUVuYWJsZSBleHRlbmRlZCBnZW9tZXRyeSBvbiBhbGwgY29udHJvbGxlcnNcbiIKKyIJcGVyaW9kaWNfb3RhZwkJU2VuZCBhbiBvcmRlcmVkIHRhZ2dlZCB0cmFuc2FjdGlvblxuIgorIgkJCQlwZXJpb2RpY2FsbHkgdG8gcHJldmVudCB0YWcgc3RhcnZhdGlvbi5cbiIKKyIJCQkJVGhpcyBtYXkgYmUgcmVxdWlyZWQgYnkgc29tZSBvbGRlciBkaXNrXG4iCisiCQkJCWRyaXZlcyBvciBSQUlEIGFycmF5cy5cbiIKKyIJcmV2ZXJzZV9zY2FuCQlTb3J0IFBDSSBkZXZpY2VzIGhpZ2hlc3QgQnVzL1Nsb3QgdG8gbG93ZXN0XG4iCisiCXRhZ19pbmZvOjx0YWdfc3RyPglTZXQgcGVyLXRhcmdldCB0YWcgZGVwdGhcbiIKKyIJZ2xvYmFsX3RhZ19kZXB0aDo8aW50PglHbG9iYWwgdGFnIGRlcHRoIGZvciBldmVyeSB0YXJnZXRcbiIKKyIJCQkJb24gZXZlcnkgYnVzXG4iCisiCWR2Ojxkdl9zZXR0aW5ncz4JU2V0IHBlci1jb250cm9sbGVyIERvbWFpbiBWYWxpZGF0aW9uIFNldHRpbmcuXG4iCisiCXNlbHRpbWU6PGludD4JCVNlbGVjdGlvbiBUaW1lb3V0XG4iCisiCQkJCSgwLzI1Nm1zLDEvMTI4bXMsMi82NG1zLDMvMzJtcylcbiIKKyJcbiIKKyIJU2FtcGxlIC9ldGMvbW9kcHJvYmUuY29uZiBsaW5lOlxuIgorIgkJVG9nZ2xlIEVJU0EvVkxCIHByb2JpbmdcbiIKKyIJCVNldCB0YWcgZGVwdGggb24gQ29udHJvbGxlciAxL1RhcmdldCAxIHRvIDEwIHRhZ3NcbiIKKyIJCVNob3J0ZW4gdGhlIHNlbGVjdGlvbiB0aW1lb3V0IHRvIDEyOG1zXG4iCisiXG4iCisiCW9wdGlvbnMgYWljN3h4eCAnYWljN3h4eD1wcm9iZV9laXNhX3ZsLnRhZ19pbmZvOnt7fS57LjEwfX0uc2VsdGltZToxJ1xuIgorKTsKKworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2hhbmRsZV9zY3NpX3N0YXR1cyhzdHJ1Y3QgYWhjX3NvZnRjICosCisJCQkJCSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqLAorCQkJCQkgc3RydWN0IHNjYiAqKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgU2NzaV9DbW5kICpjbWQpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KHN0cnVjdCBhaGNfc29mdGMqLCBzdHJ1Y3QgYWhjX2RldmluZm8qKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9zZW1fdGltZW91dCh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9mcmVlemVfc2ltcShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3JlbGVhc2Vfc2ltcSh1X2xvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kZXZfdGltZWRfdW5mcmVlemUodV9sb25nIGFyZyk7CitzdGF0aWMgaW50ICBhaGNfbGludXhfcXVldWVfcmVjb3ZlcnlfY21kKFNjc2lfQ21uZCAqY21kLCBzY2JfZmxhZyBmbGFnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9pbml0aWFsaXplX3Njc2lfYnVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfc2l6ZV9uc2VnKHZvaWQpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3RocmVhZF9ydW5fY29tcGxldGVfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9zdGFydF9kdihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYyBpbnQgIGFoY19saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfa2lsbF9kdl90aHJlYWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kdl90YXJnZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCB0YXJnZXQpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCQkgICAgc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbyk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfZHZfaW5xKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkJICAgICB1X2ludCByZXF1ZXN0X2xlbmd0aCk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfZHZfdHVyKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3JlYmQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICAgc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X3dlYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkJICAgICBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfZHZfcmViKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kdl9zdShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKKwkJCSAgICBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZyk7CitzdGF0aWMgaW50IGFoY19saW51eF9mYWxsYmFjayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2R2X2NvbXBsZXRlKFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnKTsKK3N0YXRpYyB1X2ludCBhaGNfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pOworc3RhdGljIHVfaW50IGFoY19saW51eF91c2VyX2R2X3NldHRpbmcoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGFoY19saW51eF90YXJnZXQqCWFoY19saW51eF9hbGxvY190YXJnZXQoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJCQkgICAgICAgdV9pbnQsIHVfaW50KTsKK3N0YXRpYyB2b2lkCQkJYWhjX2xpbnV4X2ZyZWVfdGFyZ2V0KHN0cnVjdCBhaGNfc29mdGMqLAorCQkJCQkJICAgICAgc3RydWN0IGFoY19saW51eF90YXJnZXQqKTsKK3N0YXRpYyBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSoJYWhjX2xpbnV4X2FsbG9jX2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjKiwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCosCisJCQkJCQkgICAgICAgdV9pbnQpOworc3RhdGljIHZvaWQJCQlhaGNfbGludXhfZnJlZV9kZXZpY2Uoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJCQkgICAgICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSopOworc3RhdGljIHZvaWQgYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoc3RydWN0IGFoY19zb2Z0YyosCisJCQkJICAgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlKik7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKGNoYXIgKnApOworc3RhdGljIGFpY19vcHRpb25fY2FsbGJhY2tfdCBhaGNfbGludXhfc2V0dXBfdGFnX2luZm87CitzdGF0aWMgYWljX29wdGlvbl9jYWxsYmFja190IGFoY19saW51eF9zZXR1cF9kdjsKK3N0YXRpYyBpbnQgIGFpYzd4eHhfc2V0dXAoY2hhciAqcyk7CitzdGF0aWMgaW50ICBhaGNfbGludXhfbmV4dF91bml0KHZvaWQpOworc3RhdGljIHZvaWQgYWhjX3J1bnFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHN0cnVjdCBhaGNfY21kICphaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlKgorCQkgICAgIGFoY19saW51eF9nZXRfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgY2hhbm5lbCwKKwkJCQkJICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgaW50IGFsbG9jKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zY2hlZHVsZV9jb21wbGV0ZXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19saW51eF9jaGVja19kZXZpY2VfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkJICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KTsKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqCisJCSAgICAgYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGNfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhjX2xpbnV4X21hcF9zZWcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IsCisJCSAJCSAgICAgIHN0cnVjdCBhaGNfZG1hX3NlZyAqc2csCisJCQkJICAgICAgZG1hX2FkZHJfdCBhZGRyLCBidXNfc2l6ZV90IGxlbik7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc2NoZWR1bGVfY29tcGxldGVxKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfUlVOX0NNUExUX1FfVElNRVIpID09IDApIHsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSENfUlVOX0NNUExUX1FfVElNRVI7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzOworCQlhZGRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKKwl9Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIG91ciBsb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc2NoZWR1bGVfcnVucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdGFza2xldF9zY2hlZHVsZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5ydW5xX3Rhc2tsZXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19saW51eF9kZXZpY2UqCithaGNfbGludXhfZ2V0X2RldmljZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGNoYW5uZWwsIHVfaW50IHRhcmdldCwKKwkJICAgICB1X2ludCBsdW4sIGludCBhbGxvYykKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfaW50IHRhcmdldF9vZmZzZXQ7CisKKwl0YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0OworCWlmIChjaGFubmVsICE9IDApCisJCXRhcmdldF9vZmZzZXQgKz0gODsKKwl0YXJnID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW3RhcmdldF9vZmZzZXRdOworCWlmICh0YXJnID09IE5VTEwpIHsKKwkJaWYgKGFsbG9jICE9IDApIHsKKwkJCXRhcmcgPSBhaGNfbGludXhfYWxsb2NfdGFyZ2V0KGFoYywgY2hhbm5lbCwgdGFyZ2V0KTsKKwkJCWlmICh0YXJnID09IE5VTEwpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKwlkZXYgPSB0YXJnLT5kZXZpY2VzW2x1bl07CisJaWYgKGRldiA9PSBOVUxMICYmIGFsbG9jICE9IDApCisJCWRldiA9IGFoY19saW51eF9hbGxvY19kZXZpY2UoYWhjLCB0YXJnLCBsdW4pOworCXJldHVybiAoZGV2KTsKK30KKworI2RlZmluZSBBSENfTElOVVhfTUFYX1JFVFVSTkVEX0VSUk9SUyA0CitzdGF0aWMgc3RydWN0IGFoY19jbWQgKgorYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0CWFoY19jbWQgKmFjbWQ7CisJdV9sb25nCWRvbmVfZmxhZ3M7CisJaW50CXdpdGhfZXJyb3JzOworCisJd2l0aF9lcnJvcnMgPSAwOworCWFoY19kb25lX2xvY2soYWhjLCAmZG9uZV9mbGFncyk7CisJd2hpbGUgKChhY21kID0gVEFJTFFfRklSU1QoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxKSkgIT0gTlVMTCkgeworCQlTY3NpX0NtbmQgKmNtZDsKKworCQlpZiAod2l0aF9lcnJvcnMgPiBBSENfTElOVVhfTUFYX1JFVFVSTkVEX0VSUk9SUykgeworCQkJLyoKKwkJCSAqIExpbnV4IHVzZXMgc3RhY2sgcmVjdXJzaW9uIHRvIHJlcXVldWUKKwkJCSAqIGNvbW1hbmRzIHRoYXQgbmVlZCB0byBiZSByZXRyaWVkLiAgQXZvaWQKKwkJCSAqIGJsb3dpbmcgb3V0IHRoZSBzdGFjayBieSAic3Bvb24gZmVlZGluZyIKKwkJCSAqIGNvbW1hbmRzIHRoYXQgY29tcGxldGVkIHdpdGggZXJyb3IgYmFjaworCQkJICogdGhlIG9wZXJhdGluZyBzeXN0ZW0gaW4gY2FzZSB0aGV5IGFyZSBnb2luZworCQkJICogdG8gYmUgcmV0cmllZC4gImljayIKKwkJCSAqLworCQkJYWhjX3NjaGVkdWxlX2NvbXBsZXRlcShhaGMpOworCQkJYnJlYWs7CisJCX0KKwkJVEFJTFFfUkVNT1ZFKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcSwKKwkJCSAgICAgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKKwkJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpICE9IERJRF9PSworCQkgfHwgKGNtZC0+cmVzdWx0ICYgMHhGRikgIT0gU0NTSV9TVEFUVVNfT0spCisJCQl3aXRoX2Vycm9ycysrOworCisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJfQorCWFoY19kb25lX3VubG9jayhhaGMsICZkb25lX2ZsYWdzKTsKKwlyZXR1cm4gKGFjbWQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpCit7CisJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZKSAhPSAwCisJICYmIGRldi0+YWN0aXZlID09IDApIHsKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZOworCQlkZXYtPnFmcm96ZW4tLTsKKwl9CisKKwlpZiAoVEFJTFFfRklSU1QoJmRldi0+YnVzeXEpID09IE5VTEwKKwkgfHwgZGV2LT5vcGVuaW5ncyA9PSAwIHx8IGRldi0+cWZyb3plbiAhPSAwKQorCQlyZXR1cm47CisKKwlhaGNfbGludXhfcnVuX2RldmljZV9xdWV1ZShhaGMsIGRldik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqCithaGNfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwkKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUkVTT1VSQ0VfU0hPUlRBR0UpICE9IDAKKwkgfHwgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiAhPSAwCisJICAmJiBBSENfRFZfU0lNUV9GUk9aRU4oYWhjKSA9PSAwKSkKKwkJcmV0dXJuIChOVUxMKTsKKwlyZXR1cm4gKFRBSUxRX0ZJUlNUKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbGludXhfcnVuX2RldmljZV9xdWV1ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7CisKKwl3aGlsZSAoKGRldiA9IGFoY19saW51eF9uZXh0X2RldmljZV90b19ydW4oYWhjKSkgIT0gTlVMTCkgeworCQlUQUlMUV9SRU1PVkUoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOworCQlkZXYtPmZsYWdzICY9IH5BSENfREVWX09OX1JVTl9MSVNUOworCQlhaGNfbGludXhfY2hlY2tfZGV2aWNlX3F1ZXVlKGFoYywgZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCVNjc2lfQ21uZCAqY21kOworCisJY21kID0gc2NiLT5pb19jdHg7CisJYWhjX3N5bmNfc2dsaXN0KGFoYywgc2NiLCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwkJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJcGNpX3VubWFwX3NnKGFoYy0+ZGV2X3NvZnRjLCBzZywgY21kLT51c2Vfc2csCisJCQkgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKGFoYy0+ZGV2X3NvZnRjLAorCQkJCSBzY2ItPnBsYXRmb3JtX2RhdGEtPmJ1Zl9idXNhZGRyLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgc2NzaV90b19wY2lfZG1hX2RpcihjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfbGludXhfbWFwX3NlZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYiwKKwkJICBzdHJ1Y3QgYWhjX2RtYV9zZWcgKnNnLCBkbWFfYWRkcl90IGFkZHIsIGJ1c19zaXplX3QgbGVuKQoreworCWludAkgY29uc3VtZWQ7CisKKwlpZiAoKHNjYi0+c2dfY291bnQgKyAxKSA+IEFIQ19OU0VHKQorCQlwYW5pYygiVG9vIGZldyBzZWdzIGZvciBkbWEgbWFwcGluZy4gICIKKwkJICAgICAgIkluY3JlYXNlIEFIQ19OU0VHXG4iKTsKKworCWNvbnN1bWVkID0gMTsKKwlzZy0+YWRkciA9IGFoY19odG9sZTMyKGFkZHIgJiAweEZGRkZGRkZGKTsKKwlzY2ItPnBsYXRmb3JtX2RhdGEtPnhmZXJfbGVuICs9IGxlbjsKKworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiA0CisJICYmIChhaGMtPmZsYWdzICYgQUhDXzM5QklUX0FERFJFU1NJTkcpICE9IDApCisJCWxlbiB8PSAoYWRkciA+PiA4KSAmIEFIQ19TR19ISUdIX0FERFJfTUFTSzsKKworCXNnLT5sZW4gPSBhaGNfaHRvbGUzMihsZW4pOworCXJldHVybiAoY29uc3VtZWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqICBIb3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAkgICBhaGNfbGludXhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQJICAgYWhjX2xpbnV4X3F1ZXVlKFNjc2lfQ21uZCAqLCB2b2lkICgqKShTY3NpX0NtbmQgKikpOworc3RhdGljIGNvbnN0IGNoYXIgKmFoY19saW51eF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorc3RhdGljIGludAkgICBhaGNfbGludXhfc2xhdmVfYWxsb2MoU2NzaV9EZXZpY2UgKik7CitzdGF0aWMgaW50CSAgIGFoY19saW51eF9zbGF2ZV9jb25maWd1cmUoU2NzaV9EZXZpY2UgKik7CitzdGF0aWMgdm9pZAkgICBhaGNfbGludXhfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqKTsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIGludAkgICBhaGNfbGludXhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSosCisJCQkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UqLAorCQkJCSAgICAgICBzZWN0b3JfdCwgaW50W10pOworI2VuZGlmCisjZWxzZQorc3RhdGljIGludAkgICBhaGNfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIHZvaWQJICAgYWhjX2xpbnV4X3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorCQkJCQkJU2NzaV9EZXZpY2UgKnNjc2lfZGV2cyk7CisjaWYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2Jpb3NwYXJhbShEaXNrICosIGtkZXZfdCwgaW50W10pOworI2VuZGlmCisjZW5kaWYKK3N0YXRpYyBpbnQJICAgYWhjX2xpbnV4X2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50CSAgIGFoY19saW51eF9kZXZfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludAkgICBhaGNfbGludXhfYWJvcnQoU2NzaV9DbW5kICopOworCisvKgorICogQ2FsY3VsYXRlIGEgc2FmZSB2YWx1ZSBmb3IgQUhDX05TRUcgKGFzIGV4cHJlc3NlZCB0aHJvdWdoIGFoY19saW51eF9uc2VnKS4KKyAqCisgKiBJbiBwcmUtMi41LlguLi4KKyAqIFRoZSBtaWRsYXllciBhbGxvY2F0ZXMgYW4gUy9HIGFycmF5IGR5bmFtaWNhbGx5IHdoZW4gYSBjb21tYW5kIGlzIGlzc3VlZAorICogdXNpbmcgU0NTSSBtYWxsb2MuICBUaGlzIGFycmF5LCB3aGljaCBpcyBpbiBhbiBPUyBkZXBlbmRlbnQgZm9ybWF0IHRoYXQKKyAqIG11c3QgbGF0ZXIgYmUgY29waWVkIHRvIG91ciBwcml2YXRlIFMvRyBsaXN0LCBpcyBzaXplZCB0byBob3VzZSBqdXN0IHRoZQorICogbnVtYmVyIG9mIHNlZ21lbnRzIG5lZWRlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIuICBTaW5jZSB0aGUgY29kZSB0aGF0CisgKiBzaXplcyB0aGUgU0NTSSBtYWxsb2MgcG9vbCBkb2VzIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBmcmFnbWVudGF0aW9uCisgKiBvZiB0aGUgcG9vbCwgZXhlY3V0aW5nIHRyYW5zYWN0aW9ucyBudW1iZXJpbmcganVzdCBhIGZyYWN0aW9uIG9mIG91cgorICogY29uY3VycmVudCB0cmFuc2FjdGlvbiBsaW1pdCB3aXRoIGxpc3QgbGVuZ3RocyBhcHJvYWNoaW5nIEFIQ19OU0VHIHdpbGwKKyAqIHF1aWNrbHkgZGVwbGVhdCB0aGUgU0NTSSBtYWxsb2MgcG9vbCBvZiB1c2FibGUgc3BhY2UuICBVbmZvcnR1bmF0ZWx5LCB0aGUKKyAqIG1pZC1sYXllciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgdGhpcyBzY3NpIG1hbGxvYyBmYWlsdXJlcyBmb3IgdGhlIFMvRworICogYXJyYXkgYW5kIHRoZSByZXN1bHQgY2FuIGJlIGEgbG9ja3VwIG9mIHRoZSBJL08gc3Vic3lzdGVtLiAgV2UgdHJ5IHRvIHNpemUKKyAqIG91ciBTL0cgbGlzdCBzbyB0aGF0IGl0IHNhdGlzZmllcyBvdXIgZHJpdmVycyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyBpbgorICogYWRkaXRpb24gdG8gYXZvaWRpbmcgZnJhZ21lbnRhdGlvbiBvZiB0aGUgU0NTSSBtYWxsb2MgcG9vbC4KKyAqLworc3RhdGljIHZvaWQKK2FoY19saW51eF9zaXplX25zZWcodm9pZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwl1X2ludCBjdXJfc2l6ZTsKKwl1X2ludCBiZXN0X3NpemU7CisKKwkvKgorCSAqIFRoZSBTQ1NJIGFsbG9jYXRvciByb3VuZHMgdG8gdGhlIG5lYXJlc3QgNTEyIGJ5dGVzCisJICogYW4gY2Fubm90IGFsbG9jYXRlIGFjcm9zcyBhIHBhZ2UgYm91bmRhcnkuICBPdXIgYWxnb3JpdGhtCisJICogaXMgdG8gc3RhcnQgYXQgMUsgb2Ygc2NzaSBtYWxsb2Mgc3BhY2UgcGVyLWNvbW1hbmQgYW5kCisJICogbG9vcCB0aHJvdWdoIGFsbCBmYWN0b3JzIG9mIHRoZSBQQUdFX1NJWkUgYW5kIHBpY2sgdGhlIGJlc3QuCisJICovCisJYmVzdF9zaXplID0gMDsKKwlmb3IgKGN1cl9zaXplID0gMTAyNDsgY3VyX3NpemUgPD0gUEFHRV9TSVpFOyBjdXJfc2l6ZSAqPSAyKSB7CisJCXVfaW50IG5zZWc7CisKKwkJbnNlZyA9IGN1cl9zaXplIC8gc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJCWlmIChuc2VnIDwgQUhDX0xJTlVYX01JTl9OU0VHKQorCQkJY29udGludWU7CisKKwkJaWYgKGJlc3Rfc2l6ZSA9PSAwKSB7CisJCQliZXN0X3NpemUgPSBjdXJfc2l6ZTsKKwkJCWFoY19saW51eF9uc2VnID0gbnNlZzsKKwkJfSBlbHNlIHsKKwkJCXVfaW50IGJlc3RfcmVtOworCQkJdV9pbnQgY3VyX3JlbTsKKworCQkJLyoKKwkJCSAqIENvbXBhcmUgdGhlIHRyYWl0cyBvZiB0aGUgY3VycmVudCAiYmVzdF9zaXplIgorCQkJICogd2l0aCB0aGUgY3VycmVudCBzaXplIHRvIGRldGVybWluZSBpZiB0aGUKKwkJCSAqIGN1cnJlbnQgc2l6ZSBpcyBhIGJldHRlciBzaXplLgorCQkJICovCisJCQliZXN0X3JlbSA9IGJlc3Rfc2l6ZSAlIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOworCQkJY3VyX3JlbSA9IGN1cl9zaXplICUgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJCQlpZiAoY3VyX3JlbSA8IGJlc3RfcmVtKSB7CisJCQkJYmVzdF9zaXplID0gY3VyX3NpemU7CisJCQkJYWhjX2xpbnV4X25zZWcgPSBuc2VnOworCQkJfQorCQl9CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBUcnkgdG8gZGV0ZWN0IGFuIEFkYXB0ZWMgN1hYWCBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCit7CisJc3RydWN0CWFoY19zb2Z0YyAqYWhjOworCWludCAgICAgZm91bmQgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLyoKKwkgKiBJdCBpcyBhIGJ1ZyB0aGF0IHRoZSB1cHBlciBsYXllciB0YWtlcworCSAqIHRoaXMgbG9jayBqdXN0IHByaW9yIHRvIGNhbGxpbmcgdXMuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCisKKwkvKgorCSAqIFNhbml0eSBjaGVja2luZyBvZiBMaW51eCBTQ1NJIGRhdGEgc3RydWN0dXJlcyBzbworCSAqIHRoYXQgc29tZSBvZiBvdXIgaGFja3NeSF5IXkheSF5IYXNzdW1wdGlvbnMgYXJlbid0CisJICogdmlvbGF0ZWQuCisJICovCisJaWYgKG9mZnNldG9mKHN0cnVjdCBhaGNfY21kX2ludGVybmFsLCBlbmQpCisJICA+IG9mZnNldG9mKHN0cnVjdCBzY3NpX2NtbmQsIGhvc3Rfc2NyaWJibGUpKSB7CisJCXByaW50ZigiYWhjX2xpbnV4X2RldGVjdDogU0NTSSBkYXRhIHN0cnVjdHVyZXMgY2hhbmdlZC5cbiIpOworCQlwcmludGYoImFoY19saW51eF9kZXRlY3Q6IFVuYWJsZSB0byBhdHRhY2hcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlhaGNfbGludXhfc2l6ZV9uc2VnKCk7CisJLyoKKwkgKiBJZiB3ZSd2ZSBiZWVuIHBhc3NlZCBhbnkgcGFyYW1ldGVycywgcHJvY2VzcyB0aGVtIG5vdy4KKwkgKi8KKwlpZiAoYWljN3h4eCkKKwkJYWljN3h4eF9zZXR1cChhaWM3eHh4KTsKKworCXRlbXBsYXRlLT5wcm9jX25hbWUgPSAiYWljN3h4eCI7CisKKwkvKgorCSAqIEluaXRpYWxpemUgb3VyIHNvZnRjIGxpc3QgbG9jayBwcmlvciB0bworCSAqIHByb2JpbmcgZm9yIGFueSBhZGFwdGVycy4KKwkgKi8KKwlhaGNfbGlzdF9sb2NraW5pdCgpOworCisJZm91bmQgPSBhaGNfbGludXhfcGNpX2luaXQoKTsKKwlpZiAoIWFoY19saW51eF9laXNhX2luaXQoKSkKKwkJZm91bmQrKzsKKwkKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggdGhlIFNDU0kgbGF5ZXIgYWxsCisJICogY29udHJvbGxlcnMgd2UndmUgZm91bmQuCisJICovCisJVEFJTFFfRk9SRUFDSChhaGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisKKwkJaWYgKGFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgdGVtcGxhdGUpID09IDApCisJCQlmb3VuZCsrOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXNwaW5fbG9ja19pcnEoJmlvX3JlcXVlc3RfbG9jayk7CisjZW5kaWYKKwlhaWM3eHh4X2RldGVjdF9jb21wbGV0ZSsrOworCisJcmV0dXJuIChmb3VuZCk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKy8qCisgKiBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKKyAqIG1vZHVsZS4KKyAqLworaW50CithaGNfbGludXhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCkKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisJdV9sb25nIGw7CisKKwlhaGNfbGlzdF9sb2NrKCZsKTsKKwlpZiAoaG9zdCAhPSBOVUxMKSB7CisKKwkJLyoKKwkJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCisJCSAqIHRoZSBmcmVlIGRpcmVjdGx5LCBidXQgY2hlY2sgb3VyCisJCSAqIGxpc3QgZm9yIGV4dHJhIHNhbml0eS4KKwkJICovCisJCWFoYyA9IGFoY19maW5kX3NvZnRjKCooc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSk7CisJCWlmIChhaGMgIT0gTlVMTCkgeworCQkJdV9sb25nIHM7CisKKwkJCWFoY19sb2NrKGFoYywgJnMpOworCQkJYWhjX2ludHJfZW5hYmxlKGFoYywgRkFMU0UpOworCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCWFoY19mcmVlKGFoYyk7CisJCX0KKwl9CisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCithaGNfbGludXhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlcls1MTJdOworCWNoYXIJYWhjX2luZm9bMjU2XTsKKwljaGFyICAgKmJwOworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKworCWJwID0gJmJ1ZmZlclswXTsKKwlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KGJwLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJc3RyY3B5KGJwLCAiQWRhcHRlYyBBSUM3WFhYIEVJU0EvVkxCL1BDSSBTQ1NJIEhCQSBEUklWRVIsIFJldiAiKTsKKwlzdHJjYXQoYnAsIEFJQzdYWFhfRFJJVkVSX1ZFUlNJT04pOworCXN0cmNhdChicCwgIlxuIik7CisJc3RyY2F0KGJwLCAiICAgICAgICA8Iik7CisJc3RyY2F0KGJwLCBhaGMtPmRlc2NyaXB0aW9uKTsKKwlzdHJjYXQoYnAsICI+XG4iKTsKKwlzdHJjYXQoYnAsICIgICAgICAgICIpOworCWFoY19jb250cm9sbGVyX2luZm8oYWhjLCBhaGNfaW5mbyk7CisJc3RyY2F0KGJwLCBhaGNfaW5mbyk7CisJc3RyY2F0KGJwLCAiXG4iKTsKKworCXJldHVybiAoYnApOworfQorCisvKgorICogUXVldWUgYW4gU0NCIHRvIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfcXVldWUoU2NzaV9DbW5kICogY21kLCB2b2lkICgqc2NzaV9kb25lKSAoU2NzaV9DbW5kICopKQoreworCXN0cnVjdAkgYWhjX3NvZnRjICphaGM7CisJc3RydWN0CSBhaGNfbGludXhfZGV2aWNlICpkZXY7CisJdV9sb25nCSBmbGFnczsKKworCWFoYyA9ICooc3RydWN0IGFoY19zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKgorCSAqIFNhdmUgdGhlIGNhbGxiYWNrIG9uIGNvbXBsZXRpb24gZnVuY3Rpb24uCisJICovCisJY21kLT5zY3NpX2RvbmUgPSBzY3NpX2RvbmU7CisKKwlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoYywgJmZsYWdzKTsKKworCS8qCisJICogQ2xvc2UgdGhlIHJhY2Ugb2YgYSBjb21tYW5kIHRoYXQgd2FzIGluIHRoZSBwcm9jZXNzIG9mCisJICogYmVpbmcgcXVldWVkIHRvIHVzIGp1c3QgYXMgb3VyIHNpbXEgd2FzIGZyb3plbi4gIExldAorCSAqIERWIGNvbW1hbmRzIHRocm91Z2ggc28gbG9uZyBhcyB3ZSBhcmUgb25seSBmcm96ZW4gdG8KKwkgKiBwZXJmb3JtIERWLgorCSAqLworCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gIT0gMAorCSAmJiBBSENfRFZfQ01EKGNtZCkgPT0gMCkgeworCisJCWFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIENBTV9SRVFVRVVFX1JFUSk7CisJCWFoY19saW51eF9xdWV1ZV9jbWRfY29tcGxldGUoYWhjLCBjbWQpOworCQlhaGNfc2NoZWR1bGVfY29tcGxldGVxKGFoYyk7CisJCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZmbGFncyk7CisJCXJldHVybiAoMCk7CisJfQorCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICBjbWQtPmRldmljZS0+bHVuLCAvKmFsbG9jKi9UUlVFKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCwgQ0FNX1JFU1JDX1VOQVZBSUwpOworCQlhaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoYywgY21kKTsKKwkJYWhjX3NjaGVkdWxlX2NvbXBsZXRlcShhaGMpOworCQlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOworCQlwcmludGYoIiVzOiBhaWM3eHh4X2xpbnV4X3F1ZXVlIC0gVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSFcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJY21kLT5yZXN1bHQgPSBDQU1fUkVRX0lOUFJPRyA8PCAxNjsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmZGV2LT5idXN5cSwgKHN0cnVjdCBhaGNfY21kICopY21kLCBhY21kX2xpbmtzLnRxZSk7CisJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkgeworCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwgZGV2LCBsaW5rcyk7CisJCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWVzKGFoYyk7CisJfQorCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZmbGFncyk7CisJcmV0dXJuICgwKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK3N0YXRpYyBpbnQKK2FoY19saW51eF9zbGF2ZV9hbGxvYyhTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBBbGxvYyAlZFxuIiwgYWhjX25hbWUoYWhjKSwgZGV2aWNlLT5pZCk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZwlmbGFnczsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBDb25maWd1cmUgJWRcbiIsIGFoY19uYW1lKGFoYyksIGRldmljZS0+aWQpOworCWFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhjLCAmZmxhZ3MpOworCS8qCisJICogU2luY2UgTGludXggaGFzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UsIGNvbmZpZ3VyZQorCSAqIGl0IHNvIHdlIGRvbid0IGZyZWUgYW5kIGFsbG9jYXRlIHRoZSBkZXZpY2UKKwkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KKwkgKi8KKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7CisJCWRldi0+c2NzaV9kZXZpY2UgPSBkZXZpY2U7CisJCWFoY19saW51eF9kZXZpY2VfcXVldWVfZGVwdGgoYWhjLCBkZXYpOworCX0KKwlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF91bmxvY2soYWhjLCAmZmxhZ3MpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfc2xhdmVfZGVzdHJveShTY3NpX0RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZwlmbGFnczsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoIiVzOiBTbGF2ZSBEZXN0cm95ICVkXG4iLCBhaGNfbmFtZShhaGMpLCBkZXZpY2UtPmlkKTsKKwlhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKGFoYywgJmZsYWdzKTsKKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmljZS0+Y2hhbm5lbCwKKwkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkJICAgLyphbGxvYyovRkFMU0UpOworCS8qCisJICogRmlsdGVyIG91dCAic2lsbHkiIGRlbGV0aW9ucyBvZiByZWFsIGRldmljZXMgYnkgb25seQorCSAqIGRlbGV0aW5nIGRldmljZXMgdGhhdCBoYXZlIGhhZCBzbGF2ZV9jb25maWd1cmUoKQorCSAqIGNhbGxlZCBvbiB0aGVtLiAgQWxsIG90aGVyIGRldmljZXMgdGhhdCBoYXZlIG5vdAorCSAqIGJlZW4gY29uZmlndXJlZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZCBieQorCSAqIHRoZSByZWZjb3VudGluZyBwcm9jZXNzLgorCSAqLworCWlmIChkZXYgIT0gTlVMTAorCSAmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfU0xBVkVfQ09ORklHVVJFRCkgIT0gMCkgeworCQlkZXYtPmZsYWdzIHw9IEFIQ19ERVZfVU5DT05GSUdVUkVEOworCQlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpCisJCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCisJIAkgJiYgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1RJTUVSX0FDVElWRSkgPT0gMCkKKwkJCWFoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7CisJfQorCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZmbGFncyk7Cit9CisjZWxzZQorLyoKKyAqIFNldHMgdGhlIHF1ZXVlIGRlcHRoIGZvciBlYWNoIFNDU0kgZGV2aWNlIGhhbmdpbmcKKyAqIG9mZiB0aGUgaW5wdXQgaG9zdCBhZGFwdGVyLgorICovCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX0RldmljZSAqc2NzaV9kZXZzKQoreworCVNjc2lfRGV2aWNlICpkZXZpY2U7CisJU2NzaV9EZXZpY2UgKmxkZXY7CisJc3RydWN0CWFoY19zb2Z0YyAqYWhjOworCXVfbG9uZwlmbGFnczsKKworCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopaG9zdC0+aG9zdGRhdGEpOworCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKKwlmb3IgKGRldmljZSA9IHNjc2lfZGV2czsgZGV2aWNlICE9IE5VTEw7IGRldmljZSA9IGRldmljZS0+bmV4dCkgeworCisJCS8qCisJCSAqIFdhdGNoIG91dCBmb3IgZHVwbGljYXRlIGRldmljZXMuICBUaGlzIHdvcmtzIGFyb3VuZAorCQkgKiBzb21lIHF1aXJrcyBpbiBob3cgdGhlIFNDU0kgc2Nhbm5pbmcgY29kZSBkb2VzIGl0cworCQkgKiBkZXZpY2UgbWFuYWdlbWVudC4KKwkJICovCisJCWZvciAobGRldiA9IHNjc2lfZGV2czsgbGRldiAhPSBkZXZpY2U7IGxkZXYgPSBsZGV2LT5uZXh0KSB7CisJCQlpZiAobGRldi0+aG9zdCA9PSBkZXZpY2UtPmhvc3QKKwkJCSAmJiBsZGV2LT5jaGFubmVsID09IGRldmljZS0+Y2hhbm5lbAorCQkJICYmIGxkZXYtPmlkID09IGRldmljZS0+aWQKKwkJCSAmJiBsZGV2LT5sdW4gPT0gZGV2aWNlLT5sdW4pCisJCQkJYnJlYWs7CisJCX0KKwkJLyogU2tpcCBkdXBsaWNhdGUuICovCisJCWlmIChsZGV2ICE9IGRldmljZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZpY2UtPmhvc3QgPT0gaG9zdCkgeworCQkJc3RydWN0CSBhaGNfbGludXhfZGV2aWNlICpkZXY7CisKKwkJCS8qCisJCQkgKiBTaW5jZSBMaW51eCBoYXMgYXR0YWNoZWQgdG8gdGhlIGRldmljZSwgY29uZmlndXJlCisJCQkgKiBpdCBzbyB3ZSBkb24ndCBmcmVlIGFuZCBhbGxvY2F0ZSB0aGUgZGV2aWNlCisJCQkgKiBzdHJ1Y3R1cmUgb24gZXZlcnkgY29tbWFuZC4KKwkJCSAqLworCQkJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBkZXZpY2UtPmNoYW5uZWwsCisJCQkJCQkgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwKKwkJCQkJCSAgIC8qYWxsb2MqL1RSVUUpOworCQkJaWYgKGRldiAhPSBOVUxMKSB7CisJCQkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7CisJCQkJZGV2LT5zY3NpX2RldmljZSA9IGRldmljZTsKKwkJCQlhaGNfbGludXhfZGV2aWNlX3F1ZXVlX2RlcHRoKGFoYywgZGV2KTsKKwkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gZGV2LT5vcGVuaW5ncworCQkJCQkJICAgICsgZGV2LT5hY3RpdmU7CisJCQkJaWYgKChkZXYtPmZsYWdzICYgKEFIQ19ERVZfUV9CQVNJQworCQkJCQkJfCBBSENfREVWX1FfVEFHR0VEKSkgPT0gMCkgeworCQkJCQkvKgorCQkJCQkgKiBXZSBhbGxvdyB0aGUgT1MgdG8gcXVldWUgMiB1bnRhZ2dlZAorCQkJCQkgKiB0cmFuc2FjdGlvbnMgdG8gdXMgYXQgYW55IHRpbWUgZXZlbgorCQkJCQkgKiB0aG91Z2ggd2UgY2FuIG9ubHkgZXhlY3V0ZSB0aGVtCisJCQkJCSAqIHNlcmlhbGx5IG9uIHRoZSBjb250cm9sbGVyL2RldmljZS4KKwkJCQkJICogVGhpcyBzaG91bGQgcmVtb3ZlIHNvbWUgbGF0ZW5jeS4KKwkJCQkJICovCisJCQkJCWRldmljZS0+cXVldWVfZGVwdGggPSAyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2kzODZfXykKKy8qCisgKiBSZXR1cm4gdGhlIGRpc2sgZ2VvbWV0cnkgZm9yIHRoZSBnaXZlbiBTQ1NJIGRldmljZS4KKyAqLworc3RhdGljIGludAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2FoY19saW51eF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJdWludDhfdCAqYmg7CisjZWxzZQorYWhjX2xpbnV4X2Jpb3NwYXJhbShEaXNrICpkaXNrLCBrZGV2X3QgZGV2LCBpbnQgZ2VvbVtdKQoreworCXN0cnVjdAlzY3NpX2RldmljZSAqc2RldiA9IGRpc2stPmRldmljZTsKKwl1X2xvbmcJY2FwYWNpdHkgPSBkaXNrLT5jYXBhY2l0eTsKKwlzdHJ1Y3QJYnVmZmVyX2hlYWQgKmJoOworI2VuZGlmCisJaW50CSBoZWFkczsKKwlpbnQJIHNlY3RvcnM7CisJaW50CSBjeWxpbmRlcnM7CisJaW50CSByZXQ7CisJaW50CSBleHRlbmRlZDsKKwlzdHJ1Y3QJIGFoY19zb2Z0YyAqYWhjOworCXVfaW50CSBjaGFubmVsOworCisJYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CisJY2hhbm5lbCA9IHNkZXYtPmNoYW5uZWw7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJYmggPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOworI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwxNykKKwliaCA9IGJyZWFkKE1LREVWKE1BSk9SKGRldiksIE1JTk9SKGRldikgJiB+MHhmKSwgMCwgYmxvY2tfc2l6ZShkZXYpKTsKKyNlbHNlCisJYmggPSBicmVhZChNS0RFVihNQUpPUihkZXYpLCBNSU5PUihkZXYpICYgfjB4ZiksIDAsIDEwMjQpOworI2VuZGlmCisKKwlpZiAoYmgpIHsKKwkJcmV0ID0gc2NzaV9wYXJ0c2l6ZShiaCwgY2FwYWNpdHksCisJCQkJICAgICZnZW9tWzJdLCAmZ2VvbVswXSwgJmdlb21bMV0pOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJa2ZyZWUoYmgpOworI2Vsc2UKKwkJYnJlbHNlKGJoKTsKKyNlbmRpZgorCQlpZiAocmV0ICE9IC0xKQorCQkJcmV0dXJuIChyZXQpOworCX0KKwloZWFkcyA9IDY0OworCXNlY3RvcnMgPSAzMjsKKwljeWxpbmRlcnMgPSBhaWNfc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMsIHNlY3RvcnMpOworCisJaWYgKGFpYzd4eHhfZXh0ZW5kZWQgIT0gMCkKKwkJZXh0ZW5kZWQgPSAxOworCWVsc2UgaWYgKGNoYW5uZWwgPT0gMCkKKwkJZXh0ZW5kZWQgPSAoYWhjLT5mbGFncyAmIEFIQ19FWFRFTkRFRF9UUkFOU19BKSAhPSAwOworCWVsc2UKKwkJZXh0ZW5kZWQgPSAoYWhjLT5mbGFncyAmIEFIQ19FWFRFTkRFRF9UUkFOU19CKSAhPSAwOworCWlmIChleHRlbmRlZCAmJiBjeWxpbmRlcnMgPj0gMTAyNCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCQljeWxpbmRlcnMgPSBhaWNfc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMsIHNlY3RvcnMpOworCX0KKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IGN5bGluZGVyczsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKKy8qCisgKiBBYm9ydCB0aGUgY3VycmVudCBTQ1NJIGNvbW1hbmQocykuCisgKi8KK3N0YXRpYyBpbnQKK2FoY19saW51eF9hYm9ydChTY3NpX0NtbmQgKmNtZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoY21kLCBTQ0JfQUJPUlQpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGYoImFpYzd4eHhfYWJvcnQgcmV0dXJucyAweCV4XG4iLCBlcnJvcik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIHNlbmQgYSB0YXJnZXQgcmVzZXQgbWVzc2FnZSB0byB0aGUgZGV2aWNlIHRoYXQgdGltZWQgb3V0LgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfZGV2X3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYWhjX2xpbnV4X3F1ZXVlX3JlY292ZXJ5X2NtZChjbWQsIFNDQl9ERVZJQ0VfUkVTRVQpOworCWlmIChlcnJvciAhPSAwKQorCQlwcmludGYoImFpYzd4eHhfZGV2X3Jlc2V0IHJldHVybnMgMHgleFxuIiwgZXJyb3IpOworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogUmVzZXQgdGhlIFNDU0kgYnVzLgorICovCitzdGF0aWMgaW50CithaGNfbGludXhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqY21kKQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcgczsKKwlpbnQgICAgZm91bmQ7CisKKwlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWFoY19taWRsYXllcl9lbnRyeXBvaW50X2xvY2soYWhjLCAmcyk7CisJZm91bmQgPSBhaGNfcmVzZXRfY2hhbm5lbChhaGMsIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCSAgLyppbml0aWF0ZSByZXNldCovVFJVRSk7CisJYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOworCWFoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhhaGMsICZzKTsKKworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCIlczogU0NTSSBidXMgcmVzZXQgZGVsaXZlcmVkLiAiCisJCSAgICAgICAiJWQgU0NCcyBhYm9ydGVkLlxuIiwgYWhjX25hbWUoYWhjKSwgZm91bmQpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK1Njc2lfSG9zdF9UZW1wbGF0ZSBhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImFpYzd4eHgiLAorCS5wcm9jX2luZm8JCT0gYWhjX2xpbnV4X3Byb2NfaW5mbywKKwkuaW5mbwkJCT0gYWhjX2xpbnV4X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhaGNfbGludXhfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBhaGNfbGludXhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gYWhjX2xpbnV4X2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhaGNfbGludXhfYnVzX3Jlc2V0LAorI2lmIGRlZmluZWQoX19pMzg2X18pCisJLmJpb3NfcGFyYW0JCT0gYWhjX2xpbnV4X2Jpb3NwYXJhbSwKKyNlbmRpZgorCS5jYW5fcXVldWUJCT0gQUhDX01BWF9RVUVVRSwKKwkudGhpc19pZAkJPSAtMSwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNsYXZlX2FsbG9jCQk9IGFoY19saW51eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBhaGNfbGludXhfc2xhdmVfZGVzdHJveSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRhc2tsZXQgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbiAyLjQuWCBhbmQgYWJvdmUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBhIHRhc2tsZXQsCisgKiBzbyB3ZSBtdXN0IHJlLWFjcXVpcmUgb3VyIGxvY2sgcHJpb3IgdG8gZXhlY3V0aW5nIHRoaXMgY29kZS4KKyAqIEluIGFsbCBwcmlvciBrZXJuZWxzLCBhaGNfc2NoZWR1bGVfcnVucSgpIGNhbGxzIHRoaXMgcm91dGluZQorICogZGlyZWN0bHkgYW5kIGFoY19zY2hlZHVsZV9ydW5xKCkgaXMgY2FsbGVkIHdpdGggb3VyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2FoY19ydW5xX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhaGNfc29mdGMqIGFoYzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCXVfbG9uZyBmbGFnczsKKworCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopZGF0YTsKKwlhaGNfbG9jayhhaGMsICZmbGFncyk7CisJd2hpbGUgKChkZXYgPSBhaGNfbGludXhfbmV4dF9kZXZpY2VfdG9fcnVuKGFoYykpICE9IE5VTEwpIHsKKwkKKwkJVEFJTFFfUkVNT1ZFKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xLCBkZXYsIGxpbmtzKTsKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJYWhjX2xpbnV4X2NoZWNrX2RldmljZV9xdWV1ZShhaGMsIGRldik7CisJCS8qIFllaWxkIHRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKKwkJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOworCX0KKwlhaGNfdW5sb2NrKGFoYywgJmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQlVJTERfU0NTSUlEKGFoYywgY21kKQkJCQkJCSAgICBcCisJKCgoKGNtZCktPmRldmljZS0+aWQgPDwgVElEX1NISUZUKSAmIFRJRCkJCQkgICAgXAorCXwgKCgoY21kKS0+ZGV2aWNlLT5jaGFubmVsID09IDApID8gKGFoYyktPm91cl9pZCA6IChhaGMpLT5vdXJfaWRfYikgXAorCXwgKCgoY21kKS0+ZGV2aWNlLT5jaGFubmVsID09IDApID8gMCA6IFRXSU5fQ0hOTEIpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnVzIERNQSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CithaGNfZG1hX3RhZ19jcmVhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBidXNfZG1hX3RhZ190IHBhcmVudCwKKwkJICAgYnVzX3NpemVfdCBhbGlnbm1lbnQsIGJ1c19zaXplX3QgYm91bmRhcnksCisJCSAgIGRtYV9hZGRyX3QgbG93YWRkciwgZG1hX2FkZHJfdCBoaWdoYWRkciwKKwkJICAgYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVyLCB2b2lkICpmaWx0ZXJhcmcsCisJCSAgIGJ1c19zaXplX3QgbWF4c2l6ZSwgaW50IG5zZWdtZW50cywKKwkJICAgYnVzX3NpemVfdCBtYXhzZWdzeiwgaW50IGZsYWdzLCBidXNfZG1hX3RhZ190ICpyZXRfdGFnKQoreworCWJ1c19kbWFfdGFnX3QgZG1hdDsKKworCWRtYXQgPSBtYWxsb2Moc2l6ZW9mKCpkbWF0KSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAoZG1hdCA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkvKgorCSAqIExpbnV4IGlzIHZlcnkgc2ltcGxpc3RpYyBhYm91dCBETUEgbWVtb3J5LiAgRm9yIG5vdyBkb24ndAorCSAqIG1haW50YWluIGFsbCBzcGVjaWZpY2F0aW9uIGluZm9ybWF0aW9uLiAgT25jZSBMaW51eCBzdXBwbGllcworCSAqIGJldHRlciBmYWNpbGl0aWVzIGZvciBkb2luZyB0aGVzZSBvcGVyYXRpb25zLCBvciB0aGUKKwkgKiBuZWVkcyBvZiB0aGlzIHBhcnRpY3VsYXIgZHJpdmVyIGNoYW5nZSwgd2UgbWlnaHQgbmVlZCB0byBkbworCSAqIG1vcmUgaGVyZS4KKwkgKi8KKwlkbWF0LT5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CisJZG1hdC0+Ym91bmRhcnkgPSBib3VuZGFyeTsKKwlkbWF0LT5tYXhzaXplID0gbWF4c2l6ZTsKKwkqcmV0X3RhZyA9IGRtYXQ7CisJcmV0dXJuICgwKTsKK30KKwordm9pZAorYWhjX2RtYV90YWdfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCkKK3sKKwlmcmVlKGRtYXQsIE1fREVWQlVGKTsKK30KKworaW50CithaGNfZG1hbWVtX2FsbG9jKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYnVzX2RtYV90YWdfdCBkbWF0LCB2b2lkKiogdmFkZHIsCisJCSBpbnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlidXNfZG1hbWFwX3QgbWFwOworCisJbWFwID0gbWFsbG9jKHNpemVvZigqbWFwKSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKwkvKgorCSAqIEFsdGhvdWdoIHdlIGNhbiBkbWEgZGF0YSBhYm92ZSA0R0IsIG91cgorCSAqICJjb25zaXN0ZW50IiBtZW1vcnkgaXMgYmVsb3cgNEdCIGZvcgorCSAqIHNwYWNlIGVmZmljaWVuY3kgcmVhc29ucyAob25seSBuZWVkIGEgNGJ5dGUKKwkgKiBhZGRyZXNzKS4gIEZvciB0aGlzIHJlYXNvbiwgd2UgaGF2ZSB0byByZXNldAorCSAqIG91ciBkbWEgbWFzayB3aGVuIGRvaW5nIGFsbG9jYXRpb25zLgorCSAqLworCWlmIChhaGMtPmRldl9zb2Z0YyAhPSBOVUxMKQorCQlpZiAocGNpX3NldF9kbWFfbWFzayhhaGMtPmRldl9zb2Z0YywgMHhGRkZGRkZGRikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKwkJCWtmcmVlKG1hcCk7CisJCQlyZXR1cm4gKEVOT0RFVik7CisJCX0KKwkqdmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhaGMtPmRldl9zb2Z0YywKKwkJCQkgICAgICBkbWF0LT5tYXhzaXplLCAmbWFwLT5idXNfYWRkcik7CisJaWYgKGFoYy0+ZGV2X3NvZnRjICE9IE5VTEwpCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKGFoYy0+ZGV2X3NvZnRjLAorCQkJCSAgICAgYWhjLT5wbGF0Zm9ybV9kYXRhLT5od19kbWFfbWFzaykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKwkJCWtmcmVlKG1hcCk7CisJCQlyZXR1cm4gKEVOT0RFVik7CisJCX0KKwlpZiAoKnZhZGRyID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKwkqbWFwcCA9IG1hcDsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQKK2FoY19kbWFtZW1fZnJlZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCwKKwkJdm9pZCogdmFkZHIsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJcGNpX2ZyZWVfY29uc2lzdGVudChhaGMtPmRldl9zb2Z0YywgZG1hdC0+bWF4c2l6ZSwKKwkJCSAgICB2YWRkciwgbWFwLT5idXNfYWRkcik7Cit9CisKK2ludAorYWhjX2RtYW1hcF9sb2FkKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCQl2b2lkICpidWYsIGJ1c19zaXplX3QgYnVmbGVuLCBidXNfZG1hbWFwX2NhbGxiYWNrX3QgKmNiLAorCQl2b2lkICpjYl9hcmcsIGludCBmbGFncykKK3sKKwkvKgorCSAqIEFzc3VtZSBmb3Igbm93IHRoYXQgdGhpcyB3aWxsIG9ubHkgYmUgdXNlZCBkdXJpbmcKKwkgKiBpbml0aWFsaXphdGlvbiBhbmQgbm90IGZvciBwZXItdHJhbnNhY3Rpb24gYnVmZmVyIG1hcHBpbmcuCisJICovCisJYnVzX2RtYV9zZWdtZW50X3Qgc3RhY2tfc2c7CisKKwlzdGFja19zZy5kc19hZGRyID0gbWFwLT5idXNfYWRkcjsKKwlzdGFja19zZy5kc19sZW4gPSBkbWF0LT5tYXhzaXplOworCWNiKGNiX2FyZywgJnN0YWNrX3NnLCAvKm5zZWcqLzEsIC8qZXJyb3IqLzApOworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoY19kbWFtYXBfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwkvKgorCSAqIFRoZSBtYXAgbWF5IGlzIE5VTEwgaW4gb3VyIDwgMi4zLlggaW1wbGVtZW50YXRpb24uCisJICogTm93IGl0J3MgMi42LjUsIGJ1dCBqdXN0IGluIGNhc2UuLi4KKwkgKi8KKwlCVUdfT04obWFwID09IE5VTEwpOworCWZyZWUobWFwLCBNX0RFVkJVRik7Cit9CisKK2ludAorYWhjX2RtYW1hcF91bmxvYWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJLyogTm90aGluZyB0byBkbyAqLworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogUGxhdGZvcm0gRGVwZW5kZW50IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ29tcGFyZSAibGVmdCBoYW5kIiBzb2Z0YyB3aXRoICJyaWdodCBoYW5kIiBzb2Z0YywgcmV0dXJuaW5nOgorICogPCAwIC0gbGFoYyBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIHJhaGMKKyAqICAgMCAtIFNvZnRjcyBhcmUgZXF1YWwKKyAqID4gMCAtIGxhaGMgaGFzIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gcmFoYworICovCitpbnQKK2FoY19zb2Z0Y19jb21wKHN0cnVjdCBhaGNfc29mdGMgKmxhaGMsIHN0cnVjdCBhaGNfc29mdGMgKnJhaGMpCit7CisJaW50CXZhbHVlOworCWludAlydmFsdWU7CisJaW50CWx2YWx1ZTsKKworCS8qCisJICogVW5kZXIgTGludXgsIGNhcmRzIGFyZSBvcmRlcmVkIGFzIGZvbGxvd3M6CisJICoJMSkgVkxCL0VJU0EgQklPUyBlbmFibGVkIGRldmljZXMgc29ydGVkIGJ5IEJJT1MgYWRkcmVzcy4KKwkgKgkyKSBQQ0kgZGV2aWNlcyB3aXRoIEJJT1MgZW5hYmxlZCBzb3J0ZWQgYnkgYnVzL3Nsb3QvZnVuYy4KKwkgKgkzKSBBbGwgcmVtYWluaW5nIFZMQi9FSVNBIGRldmljZXMgc29ydGVkIGJ5IGlvcG9ydC4KKwkgKgk0KSBBbGwgcmVtYWluaW5nIFBDSSBkZXZpY2VzIHNvcnRlZCBieSBidXMvc2xvdC9mdW5jLgorCSAqLworCXZhbHVlID0gKGxhaGMtPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRCkKKwkgICAgICAtIChyYWhjLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpOworCWlmICh2YWx1ZSAhPSAwKQorCQkvKiBDb250cm9sbGVycyB3aXRoIEJJT1MgZW5hYmxlZCBoYXZlIGEgKmhpZ2hlciogcHJpb3JpdHkgKi8KKwkJcmV0dXJuICh2YWx1ZSk7CisKKwkvKgorCSAqIFNhbWUgQklPUyBzZXR0aW5nLCBub3cgc29ydCBiYXNlZCBvbiBidXMgdHlwZS4KKwkgKiBFSVNBIGFuZCBWTCBjb250cm9sbGVycyBzb3J0IHRvZ2V0aGVyLiAgRUlTQS9WTAorCSAqIGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gUENJLgorCSAqLworCXJ2YWx1ZSA9IChyYWhjLT5jaGlwICYgQUhDX0JVU19NQVNLKTsKKyAJaWYgKHJ2YWx1ZSA9PSBBSENfVkwpCisJCXJ2YWx1ZSA9IEFIQ19FSVNBOworCWx2YWx1ZSA9IChsYWhjLT5jaGlwICYgQUhDX0JVU19NQVNLKTsKKyAJaWYgKGx2YWx1ZSA9PSBBSENfVkwpCisJCWx2YWx1ZSA9IEFIQ19FSVNBOworCXZhbHVlID0gcnZhbHVlIC0gbHZhbHVlOworCWlmICh2YWx1ZSAhPSAwKQorCQlyZXR1cm4gKHZhbHVlKTsKKworCS8qIFN0aWxsIGVxdWFsLiAgU29ydCBieSBCSU9TIGFkZHJlc3MsIGlvcG9ydCwgb3IgYnVzL3Nsb3QvZnVuYy4gKi8KKwlzd2l0Y2ggKHJ2YWx1ZSkgeworI2lmZGVmIENPTkZJR19QQ0kKKwljYXNlIEFIQ19QQ0k6CisJeworCQljaGFyIHByaW1hcnlfY2hhbm5lbDsKKworCQlpZiAoYWljN3h4eF9yZXZlcnNlX3NjYW4gIT0gMCkKKwkJCXZhbHVlID0gYWhjX2dldF9wY2lfYnVzKGxhaGMtPmRldl9zb2Z0YykKKwkJCSAgICAgIC0gYWhjX2dldF9wY2lfYnVzKHJhaGMtPmRldl9zb2Z0Yyk7CisJCWVsc2UKKwkJCXZhbHVlID0gYWhjX2dldF9wY2lfYnVzKHJhaGMtPmRldl9zb2Z0YykKKwkJCSAgICAgIC0gYWhjX2dldF9wY2lfYnVzKGxhaGMtPmRldl9zb2Z0Yyk7CisJCWlmICh2YWx1ZSAhPSAwKQorCQkJYnJlYWs7CisJCWlmIChhaWM3eHh4X3JldmVyc2Vfc2NhbiAhPSAwKQorCQkJdmFsdWUgPSBhaGNfZ2V0X3BjaV9zbG90KGxhaGMtPmRldl9zb2Z0YykKKwkJCSAgICAgIC0gYWhjX2dldF9wY2lfc2xvdChyYWhjLT5kZXZfc29mdGMpOworCQllbHNlCisJCQl2YWx1ZSA9IGFoY19nZXRfcGNpX3Nsb3QocmFoYy0+ZGV2X3NvZnRjKQorCQkJICAgICAgLSBhaGNfZ2V0X3BjaV9zbG90KGxhaGMtPmRldl9zb2Z0Yyk7CisJCWlmICh2YWx1ZSAhPSAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIE9uIG11bHRpLWZ1bmN0aW9uIGRldmljZXMsIHRoZSB1c2VyIGNhbiBjaG9vc2UKKwkJICogdG8gaGF2ZSBmdW5jdGlvbiAxIHByb2JlZCBiZWZvcmUgZnVuY3Rpb24gMC4KKwkJICogR2l2ZSB3aGljaGV2ZXIgY2hhbm5lbCBpcyB0aGUgcHJpbWFyeSBjaGFubmVsCisJCSAqIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorCQkgKi8KKwkJcHJpbWFyeV9jaGFubmVsID0gKGxhaGMtPmZsYWdzICYgQUhDX1BSSU1BUllfQ0hBTk5FTCkgKyAnQSc7CisJCXZhbHVlID0gLTE7CisJCWlmIChsYWhjLT5jaGFubmVsID09IHByaW1hcnlfY2hhbm5lbCkKKwkJCXZhbHVlID0gMTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBBSENfRUlTQToKKwkJaWYgKChyYWhjLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpICE9IDApIHsKKwkJCXZhbHVlID0gcmFoYy0+cGxhdGZvcm1fZGF0YS0+Ymlvc19hZGRyZXNzCisJCQkgICAgICAtIGxhaGMtPnBsYXRmb3JtX2RhdGEtPmJpb3NfYWRkcmVzczsgCisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IHJhaGMtPmJzaC5pb3BvcnQKKwkJCSAgICAgIC0gbGFoYy0+YnNoLmlvcG9ydDsgCisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImFoY19zb2Z0Y19zb3J0OiBpbnZhbGlkIGJ1cyB0eXBlIik7CisJfQorCXJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3NldHVwX3RhZ19pbmZvX2dsb2JhbChjaGFyICpwKQoreworCWludCB0YWdzLCBpLCBqOworCisJdGFncyA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKSAmIDB4ZmY7CisJcHJpbnRmKCJTZXR0aW5nIEdsb2JhbCBUYWdzPSAlZFxuIiwgdGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VMRU1FTlRTKGFpYzd4eHhfdGFnX2luZm8pOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFIQ19OVU1fVEFSR0VUUzsgaisrKSB7CisJCQlhaWM3eHh4X3RhZ19pbmZvW2ldLnRhZ19jb21tYW5kc1tqXSA9IHRhZ3M7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfc2V0dXBfdGFnX2luZm8odV9sb25nIGFyZywgaW50IGluc3RhbmNlLCBpbnQgdGFyZywgaW50MzJfdCB2YWx1ZSkKK3sKKworCWlmICgoaW5zdGFuY2UgPj0gMCkgJiYgKHRhcmcgPj0gMCkKKwkgJiYgKGluc3RhbmNlIDwgTlVNX0VMRU1FTlRTKGFpYzd4eHhfdGFnX2luZm8pKQorCSAmJiAodGFyZyA8IEFIQ19OVU1fVEFSR0VUUykpIHsKKwkJYWljN3h4eF90YWdfaW5mb1tpbnN0YW5jZV0udGFnX2NvbW1hbmRzW3RhcmddID0gdmFsdWUgJiAweGZmOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoInRhZ19pbmZvWyVkOiVkXSA9ICVkXG4iLCBpbnN0YW5jZSwgdGFyZywgdmFsdWUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9zZXR1cF9kdih1X2xvbmcgYXJnLCBpbnQgaW5zdGFuY2UsIGludCB0YXJnLCBpbnQzMl90IHZhbHVlKQoreworCisJaWYgKChpbnN0YW5jZSA+PSAwKQorCSAmJiAoaW5zdGFuY2UgPCBOVU1fRUxFTUVOVFMoYWljN3h4eF9kdl9zZXR0aW5ncykpKSB7CisJCWFpYzd4eHhfZHZfc2V0dGluZ3NbaW5zdGFuY2VdID0gdmFsdWU7CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiZHZbJWRdID0gJWRcbiIsIGluc3RhbmNlLCB2YWx1ZSk7CisJfQorfQorCisvKgorICogSGFuZGxlIExpbnV4IGJvb3QgcGFyYW1ldGVycy4gVGhpcyByb3V0aW5lIGFsbG93cyBmb3IgYXNzaWduaW5nIGEgdmFsdWUKKyAqIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCisgKiBpZS4gYWljN3h4eD1zdHB3bGV2OjEsZXh0ZW5kZWQKKyAqLworc3RhdGljIGludAorYWljN3h4eF9zZXR1cChjaGFyICpzKQoreworCWludAlpLCBuOworCWNoYXIgICAqcDsKKwljaGFyICAgKmVuZDsKKworCXN0YXRpYyBzdHJ1Y3QgeworCQljb25zdCBjaGFyICpuYW1lOworCQl1aW50MzJfdCAqZmxhZzsKKwl9IG9wdGlvbnNbXSA9IHsKKwkJeyAiZXh0ZW5kZWQiLCAmYWljN3h4eF9leHRlbmRlZCB9LAorCQl7ICJub19yZXNldCIsICZhaWM3eHh4X25vX3Jlc2V0IH0sCisJCXsgInZlcmJvc2UiLCAmYWljN3h4eF92ZXJib3NlIH0sCisJCXsgImFsbG93X21lbWlvIiwgJmFpYzd4eHhfYWxsb3dfbWVtaW99LAorI2lmZGVmIEFIQ19ERUJVRworCQl7ICJkZWJ1ZyIsICZhaGNfZGVidWcgfSwKKyNlbmRpZgorCQl7ICJyZXZlcnNlX3NjYW4iLCAmYWljN3h4eF9yZXZlcnNlX3NjYW4gfSwKKwkJeyAibm9fcHJvYmUiLCAmYWljN3h4eF9wcm9iZV9laXNhX3ZsIH0sCisJCXsgInByb2JlX2Vpc2FfdmwiLCAmYWljN3h4eF9wcm9iZV9laXNhX3ZsIH0sCisJCXsgInBlcmlvZGljX290YWciLCAmYWljN3h4eF9wZXJpb2RpY19vdGFnIH0sCisJCXsgInBjaV9wYXJpdHkiLCAmYWljN3h4eF9wY2lfcGFyaXR5IH0sCisJCXsgInNlbHRpbWUiLCAmYWljN3h4eF9zZWx0aW1lIH0sCisJCXsgInRhZ19pbmZvIiwgTlVMTCB9LAorCQl7ICJnbG9iYWxfdGFnX2RlcHRoIiwgTlVMTCB9LAorCQl7ICJkdiIsIE5VTEwgfQorCX07CisKKwllbmQgPSBzdHJjaHIocywgJ1wwJyk7CisKKwkvKgorCSAqIFhYWCBpYTY0IGdjYyBpc24ndCBzbWFydCBlbm91Z2ggdG8ga25vdyB0aGF0IE5VTV9FTEVNRU5UUworCSAqIHdpbGwgbmV2ZXIgYmUgMCBpbiB0aGlzIGNhc2UuCisJICovCisJbiA9IDA7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJnMsICIsLiIpKSAhPSBOVUxMKSB7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTUVOVFMob3B0aW9ucyk7IGkrKykgeworCisJCQluID0gc3RybGVuKG9wdGlvbnNbaV0ubmFtZSk7CisJCQlpZiAoc3RybmNtcChvcHRpb25zW2ldLm5hbWUsIHAsIG4pID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gTlVNX0VMRU1FTlRTKG9wdGlvbnMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cm5jbXAocCwgImdsb2JhbF90YWdfZGVwdGgiLCBuKSA9PSAwKSB7CisJCQlhaGNfbGludXhfc2V0dXBfdGFnX2luZm9fZ2xvYmFsKHAgKyBuKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ0YWdfaW5mbyIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJ0YWdfaW5mbyIsIHAgKyBuLCBlbmQsCisJCQkgICAgMiwgYWhjX2xpbnV4X3NldHVwX3RhZ19pbmZvLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJkdiIsIG4pID09IDApIHsKKwkJCXMgPSBhaWNfcGFyc2VfYnJhY2Vfb3B0aW9uKCJkdiIsIHAgKyBuLCBlbmQsIDEsCisJCQkgICAgYWhjX2xpbnV4X3NldHVwX2R2LCAwKTsKKwkJfSBlbHNlIGlmIChwW25dID09ICc6JykgeworCQkJKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKHAsICJ2ZXJib3NlIiwgbikgPT0gMCkgeworCQkJKihvcHRpb25zW2ldLmZsYWcpID0gMTsKKwkJfSBlbHNlIHsKKwkJCSoob3B0aW9uc1tpXS5mbGFnKSBePSAweEZGRkZGRkZGOworCQl9CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJhaWM3eHh4PSIsIGFpYzd4eHhfc2V0dXApOworCit1aW50MzJfdCBhaWM3eHh4X3ZlcmJvc2U7CisKK2ludAorYWhjX2xpbnV4X3JlZ2lzdGVyX2hvc3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBTY3NpX0hvc3RfVGVtcGxhdGUgKnRlbXBsYXRlKQoreworCWNoYXIJIGJ1Zls4MF07CisJc3RydWN0CSBTY3NpX0hvc3QgKmhvc3Q7CisJY2hhcgkqbmV3X25hbWU7CisJdV9sb25nCSBzOworCXVfaW50CSB0YXJnX29mZnNldDsKKworCXRlbXBsYXRlLT5uYW1lID0gYWhjLT5kZXNjcmlwdGlvbjsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGFoY19zb2Z0YyAqKSk7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJKigoc3RydWN0IGFoY19zb2Z0YyAqKilob3N0LT5ob3N0ZGF0YSkgPSBhaGM7CisJYWhjX2xvY2soYWhjLCAmcyk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXNjc2lfYXNzaWduX2xvY2soaG9zdCwgJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKyNlbGlmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgIT0gMAorCWhvc3QtPmxvY2sgPSAmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2s7CisjZW5kaWYKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QgPSBob3N0OworCWhvc3QtPmNhbl9xdWV1ZSA9IEFIQ19NQVhfUVVFVUU7CisJaG9zdC0+Y21kX3Blcl9sdW4gPSAyOworCS8qIFhYWCBObyB3YXkgdG8gY29tbXVuaWNhdGUgdGhlIElEIGZvciBtdWx0aXBsZSBjaGFubmVscyAqLworCWhvc3QtPnRoaXNfaWQgPSBhaGMtPm91cl9pZDsKKwlob3N0LT5pcnEgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPmlycTsKKwlob3N0LT5tYXhfaWQgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSA/IDE2IDogODsKKwlob3N0LT5tYXhfbHVuID0gQUhDX05VTV9MVU5TOworCWhvc3QtPm1heF9jaGFubmVsID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgPyAxIDogMDsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBBSENfTlNFRzsKKwlhaGNfc2V0X3VuaXQoYWhjLCBhaGNfbGludXhfbmV4dF91bml0KCkpOworCXNwcmludGYoYnVmLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CisJbmV3X25hbWUgPSBtYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCBNX0RFVkJVRiwgTV9OT1dBSVQpOworCWlmIChuZXdfbmFtZSAhPSBOVUxMKSB7CisJCXN0cmNweShuZXdfbmFtZSwgYnVmKTsKKwkJYWhjX3NldF9uYW1lKGFoYywgbmV3X25hbWUpOworCX0KKwlob3N0LT51bmlxdWVfaWQgPSBhaGMtPnVuaXQ7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJc2NzaV9zZXRfcGNpX2RldmljZShob3N0LCBhaGMtPmRldl9zb2Z0Yyk7CisjZW5kaWYKKwlhaGNfbGludXhfaW5pdGlhbGl6ZV9zY3NpX2J1cyhhaGMpOworCWFoY191bmxvY2soYWhjLCAmcyk7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgPSBrZXJuZWxfdGhyZWFkKGFoY19saW51eF9kdl90aHJlYWQsIGFoYywgMCk7CisJYWhjX2xvY2soYWhjLCAmcyk7CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfcGlkIDwgMCkgeworCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERWIHRocmVhZCwgZXJyb3I9ICVkXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQpOworCQlyZXR1cm4gKC1haGMtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCk7CisJfQorCS8qCisJICogSW5pdGlhbGx5IGFsbG9jYXRlICphbGwqIG9mIG91ciBsaW51eCB0YXJnZXQgb2JqZWN0cworCSAqIHNvIHRoYXQgdGhlIERWIHRocmVhZCB3aWxsIHNjYW4gdGhlbSBhbGwgaW4gcGFyYWxsZWwKKwkgKiBqdXN0IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4gIEFueSBkZXZpY2UgdGhhdAorCSAqIGRvZXMgbm90IGV4aXN0IHdpbGwgaGF2ZSBpdHMgdGFyZ2V0IG9iamVjdCBkZXN0cm95ZWQKKwkgKiBieSB0aGUgc2VsZWN0aW9uIHRpbWVvdXQgaGFuZGxlci4gIEluIHRoZSBjYXNlIG9mIGEKKwkgKiBkZXZpY2UgdGhhdCBhcHBlYXJzIGFmdGVyIHRoZSBpbml0aWFsIERWIHNjYW4sIGFzeW5jCisJICogbmVnb3RpYXRpb24gd2lsbCBvY2N1ciBmb3IgdGhlIGZpcnN0IGNvbW1hbmQsIGFuZCBEVgorCSAqIHdpbGwgY29tZW5jZSBzaG91bGQgdGhhdCBmaXJzdCBjb21tYW5kIGJlIHN1Y2Nlc3NmdWwuCisJICovCisJZm9yICh0YXJnX29mZnNldCA9IDA7CisJICAgICB0YXJnX29mZnNldCA8IGhvc3QtPm1heF9pZCAqIChob3N0LT5tYXhfY2hhbm5lbCArIDEpOworCSAgICAgdGFyZ19vZmZzZXQrKykgeworCQl1X2ludCBjaGFubmVsOworCQl1X2ludCB0YXJnZXQ7CisKKwkJY2hhbm5lbCA9IDA7CisJCXRhcmdldCA9IHRhcmdfb2Zmc2V0OworCQlpZiAodGFyZ2V0ID4gNworCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQkJY2hhbm5lbCA9IDE7CisJCQl0YXJnZXQgJj0gMHg3OworCQl9CisJCS8qCisJCSAqIFNraXAgb3VyIG93biBJRC4gIFNvbWUgQ29tcGFxL0hQIHN0b3JhZ2UgZGV2aWNlcworCQkgKiBoYXZlIGVuY2xvc3VyZSBtYW5hZ2VtZW50IGRldmljZXMgdGhhdCByZXNwb25kIHRvCisJCSAqIHNpbmdsZSBiaXQgc2VsZWN0aW9uIChpLmUuIHNlbGVjdGluZyBvdXJzZWx2ZXMpLgorCQkgKiBJdCBpcyBleHBlY3RlZCB0aGF0IGVpdGhlciBhbiBleHRlcm5hbCBhcHBsaWNhdGlvbgorCQkgKiBvciBhIG1vZGlmaWVkIGtlcm5lbCB3aWxsIGJlIHVzZWQgdG8gcHJvYmUgdGhpcworCQkgKiBJRCBpZiBpdCBpcyBhcHByb3ByaWF0ZS4gIFRvIGFjY29tbW9kYXRlIHRoZXNlCisJCSAqIGluc3RhbGxhdGlvbnMsIGFoY19saW51eF9hbGxvY190YXJnZXQoKSB3aWxsIGFsbG9jYXRlCisJCSAqIGZvciBvdXIgSUQgaWYgYXNrZWQgdG8gZG8gc28uCisJCSAqLworCQlpZiAoKGNoYW5uZWwgPT0gMCAmJiB0YXJnZXQgPT0gYWhjLT5vdXJfaWQpCisJCSB8fCAoY2hhbm5lbCA9PSAxICYmIHRhcmdldCA9PSBhaGMtPm91cl9pZF9iKSkKKwkJCWNvbnRpbnVlOworCisJCWFoY19saW51eF9hbGxvY190YXJnZXQoYWhjLCBjaGFubmVsLCB0YXJnZXQpOworCX0KKwlhaGNfaW50cl9lbmFibGUoYWhjLCBUUlVFKTsKKwlhaGNfbGludXhfc3RhcnRfZHYoYWhjKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXNjc2lfYWRkX2hvc3QoaG9zdCwgKGFoYy0+ZGV2X3NvZnRjID8gJmFoYy0+ZGV2X3NvZnRjLT5kZXYgOiBOVUxMKSk7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKwordWludDY0X3QKK2FoY19saW51eF9nZXRfbWVtc2l6ZSh2b2lkKQoreworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJc2lfbWVtaW5mbygmc2kpOworCXJldHVybiAoKHVpbnQ2NF90KXNpLnRvdGFscmFtIDw8IFBBR0VfU0hJRlQpOworfQorCisvKgorICogRmluZCB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIHVuaXQgbnVtYmVyIHRvIHVzZQorICogZm9yIGEgbmV3IGRldmljZS4gIFdlIGRvbid0IGp1c3QgdXNlIGEgc3RhdGljCisgKiBjb3VudCB0byBoYW5kbGUgdGhlICJyZXBlYXRlZCBob3QtKHVuKXBsdWciCisgKiBzY2VuYXJpby4KKyAqLworc3RhdGljIGludAorYWhjX2xpbnV4X25leHRfdW5pdCh2b2lkKQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwlpbnQgdW5pdDsKKworCXVuaXQgPSAwOworcmV0cnk6CisJVEFJTFFfRk9SRUFDSChhaGMsICZhaGNfdGFpbHEsIGxpbmtzKSB7CisJCWlmIChhaGMtPnVuaXQgPT0gdW5pdCkgeworCQkJdW5pdCsrOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuaXQpOworfQorCisvKgorICogUGxhY2UgdGhlIFNDU0kgYnVzIGludG8gYSBrbm93biBzdGF0ZSBieSBlaXRoZXIgcmVzZXR0aW5nIGl0LAorICogb3IgZm9yY2luZyB0cmFuc2ZlciBuZWdvdGlhdGlvbnMgb24gdGhlIG5leHQgY29tbWFuZCB0byBhbnkKKyAqIHRhcmdldC4KKyAqLwordm9pZAorYWhjX2xpbnV4X2luaXRpYWxpemVfc2NzaV9idXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBpOworCWludCBudW10YXJnOworCisJaSA9IDA7CisJbnVtdGFyZyA9IDA7CisKKwlpZiAoYWljN3h4eF9ub19yZXNldCAhPSAwKQorCQlhaGMtPmZsYWdzICY9IH4oQUhDX1JFU0VUX0JVU19BfEFIQ19SRVNFVF9CVVNfQik7CisKKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfUkVTRVRfQlVTX0EpICE9IDApCisJCWFoY19yZXNldF9jaGFubmVsKGFoYywgJ0EnLCAvKmluaXRpYXRlX3Jlc2V0Ki9UUlVFKTsKKwllbHNlCisJCW51bXRhcmcgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSA/IDE2IDogODsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisKKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX1JFU0VUX0JVU19CKSAhPSAwKSB7CisJCQlhaGNfcmVzZXRfY2hhbm5lbChhaGMsICdCJywgLyppbml0aWF0ZV9yZXNldCovVFJVRSk7CisJCX0gZWxzZSB7CisJCQlpZiAobnVtdGFyZyA9PSAwKQorCQkJCWkgPSA4OworCQkJbnVtdGFyZyArPSA4OworCQl9CisJfQorCisJLyoKKwkgKiBGb3JjZSBuZWdvdGlhdGlvbiB0byBhc3luYyBmb3IgYWxsIHRhcmdldHMgdGhhdAorCSAqIHdpbGwgbm90IHNlZSBhbiBpbml0aWFsIGJ1cyByZXNldC4KKwkgKi8KKwlmb3IgKDsgaSA8IG51bXRhcmc7IGkrKykgeworCQlzdHJ1Y3QgYWhjX2RldmluZm8gZGV2aW5mbzsKKwkJc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQl1X2ludCBvdXJfaWQ7CisJCXVfaW50IHRhcmdldF9pZDsKKwkJY2hhciBjaGFubmVsOworCisJCWNoYW5uZWwgPSAnQSc7CisJCW91cl9pZCA9IGFoYy0+b3VyX2lkOworCQl0YXJnZXRfaWQgPSBpOworCQlpZiAoaSA+IDcgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQkJY2hhbm5lbCA9ICdCJzsKKwkJCW91cl9pZCA9IGFoYy0+b3VyX2lkX2I7CisJCQl0YXJnZXRfaWQgPSBpICUgODsKKwkJfQorCQl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBjaGFubmVsLCBvdXJfaWQsCisJCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCQlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBvdXJfaWQsIHRhcmdldF9pZCwKKwkJCQkgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgY2hhbm5lbCwgUk9MRV9JTklUSUFUT1IpOworCQlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgJmRldmluZm8sIHRzdGF0ZSwKKwkJCQkgICAgICAgdGluZm8sIEFIQ19ORUdfQUxXQVlTKTsKKwl9CisJLyogR2l2ZSB0aGUgYnVzIHNvbWUgdGltZSB0byByZWNvdmVyICovCisJaWYgKChhaGMtPmZsYWdzICYgKEFIQ19SRVNFVF9CVVNfQXxBSENfUkVTRVRfQlVTX0IpKSAhPSAwKSB7CisJCWFoY19saW51eF9mcmVlemVfc2ltcShhaGMpOworCQlpbml0X3RpbWVyKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5kYXRhID0gKHVfbG9uZylhaGM7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9CisJCSAgICBqaWZmaWVzICsgKEFJQzdYWFhfUkVTRVRfREVMQVkgKiBIWikvMTAwMDsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9CisJCSAgICBhaGNfbGludXhfcmVsZWFzZV9zaW1xOworCQlhZGRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCX0KK30KKworaW50CithaGNfcGxhdGZvcm1fYWxsb2Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB2b2lkICpwbGF0Zm9ybV9hcmcpCit7CisKKwlhaGMtPnBsYXRmb3JtX2RhdGEgPQorCSAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSksIE1fREVWQlVGLCBNX05PV0FJVCk7CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gKEVOT01FTSk7CisJbWVtc2V0KGFoYy0+cGxhdGZvcm1fZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSkpOworCVRBSUxRX0lOSVQoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxKTsKKwlUQUlMUV9JTklUKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmRldmljZV9ydW5xKTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IEFIQ19MSU5VWF9OT0lSUTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gMHhGRkZGRkZGRjsKKwlhaGNfbG9ja2luaXQoYWhjKTsKKwlhaGNfZG9uZV9sb2NraW5pdChhaGMpOworCWluaXRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+Y29tcGxldGVxX3RpbWVyKTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lci5kYXRhID0gKHVfbG9uZylhaGM7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIuZnVuY3Rpb24gPQorCSAgICAoYWhjX2xpbnV4X2NhbGxiYWNrX3QgKilhaGNfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCWluaXRfTVVURVhfTE9DS0VEKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfY21kX3NlbSk7CisJdGFza2xldF9pbml0KCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJ1bnFfdGFza2xldCwgYWhjX3J1bnFfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylhaGMpOworCWFoYy0+c2VsdGltZSA9IChhaWM3eHh4X3NlbHRpbWUgJiAweDMpIDw8IDQ7CisJYWhjLT5zZWx0aW1lX2IgPSAoYWljN3h4eF9zZWx0aW1lICYgMHgzKSA8PCA0OworCWlmIChhaWM3eHh4X3BjaV9wYXJpdHkgPT0gMCkKKwkJYWhjLT5mbGFncyB8PSBBSENfRElTQUJMRV9QQ0lfUEVSUjsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK2FoY19wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCWludCBpLCBqOworCisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7CisJCWRlbF90aW1lcl9zeW5jKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcV90aW1lcik7CisJCWFoY19saW51eF9raWxsX2R2X3RocmVhZChhaGMpOworCQl0YXNrbGV0X2tpbGwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cnVucV90YXNrbGV0KTsKKwkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJc2NzaV9yZW1vdmVfaG9zdChhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QpOworI2VuZGlmCisJCQlzY3NpX2hvc3RfcHV0KGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisJCX0KKworCQkvKiBkZXN0cm95IGFsbCBvZiB0aGUgZGV2aWNlIGFuZCB0YXJnZXQgb2JqZWN0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQUhDX05VTV9UQVJHRVRTOyBpKyspIHsKKwkJCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbaV07CisJCQlpZiAodGFyZyAhPSBOVUxMKSB7CisJCQkJLyogS2VlcCB0YXJnZXQgYXJvdW5kIHRocm91Z2ggdGhlIGxvb3AuICovCisJCQkJdGFyZy0+cmVmY291bnQrKzsKKwkJCQlmb3IgKGogPSAwOyBqIDwgQUhDX05VTV9MVU5TOyBqKyspIHsKKworCQkJCQlpZiAodGFyZy0+ZGV2aWNlc1tqXSA9PSBOVUxMKQorCQkJCQkJY29udGludWU7CisJCQkJCWRldiA9IHRhcmctPmRldmljZXNbal07CisJCQkJCWFoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7CisJCQkJfQorCQkJCS8qCisJCQkJICogRm9yY2libHkgZnJlZSB0aGUgdGFyZ2V0IG5vdyB0aGF0CisJCQkJICogYWxsIGRldmljZXMgYXJlIGdvbmUuCisJCQkJICovCisJCQkJYWhjX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoYywgdGFyZyk7CisgCQkJfQorIAkJfQorCisJCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSAhPSBBSENfTElOVVhfTk9JUlEpCisJCQlmcmVlX2lycShhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSwgYWhjKTsKKwkJaWYgKGFoYy0+dGFnID09IEJVU19TUEFDRV9QSU8KKwkJICYmIGFoYy0+YnNoLmlvcG9ydCAhPSAwKQorCQkJcmVsZWFzZV9yZWdpb24oYWhjLT5ic2guaW9wb3J0LCAyNTYpOworCQlpZiAoYWhjLT50YWcgPT0gQlVTX1NQQUNFX01FTUlPCisJCSAmJiBhaGMtPmJzaC5tYWRkciAhPSBOVUxMKSB7CisJCQlpb3VubWFwKGFoYy0+YnNoLm1hZGRyKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihhaGMtPnBsYXRmb3JtX2RhdGEtPm1lbV9idXNhZGRyLAorCQkJCQkgICAweDEwMDApOworCQl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCS8qCisJCSAqIEluIDIuNCB3ZSBkZXRhY2ggZnJvbSB0aGUgc2NzaSBtaWRsYXllciBiZWZvcmUgdGhlIFBDSQorCQkgKiBsYXllciBpbnZva2VzIG91ciByZW1vdmUgY2FsbGJhY2suICBObyBwZXItaW5zdGFuY2UKKwkJICogZGV0YWNoIGlzIHByb3ZpZGVkLCBzbyB3ZSBtdXN0IHJlYWNoIGluc2lkZSB0aGUgUENJCisJCSAqIHN1YnN5c3RlbSdzIGludGVybmFscyBhbmQgZGV0YWNoIG91ciBkcml2ZXIgbWFudWFsbHkuCisJCSAqLworCQlpZiAoYWhjLT5kZXZfc29mdGMgIT0gTlVMTCkKKwkJCWFoYy0+ZGV2X3NvZnRjLT5kcml2ZXIgPSBOVUxMOworI2VuZGlmCisJCWZyZWUoYWhjLT5wbGF0Zm9ybV9kYXRhLCBNX0RFVkJVRik7CisJfQorfQorCit2b2lkCithaGNfcGxhdGZvcm1fZnJlZXplX2RldnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJYWhjX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhjLCBTQ0JfR0VUX1RBUkdFVChhaGMsIHNjYiksCisJCQkJU0NCX0dFVF9DSEFOTkVMKGFoYywgc2NiKSwKKwkJCQlTQ0JfR0VUX0xVTihzY2IpLCBTQ0JfTElTVF9OVUxMLAorCQkJCVJPTEVfVU5LTk9XTiwgQ0FNX1JFUVVFVUVfUkVRKTsKK30KKwordm9pZAorYWhjX3BsYXRmb3JtX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQkgICAgICBhaGNfcXVldWVfYWxnIGFsZykKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCWludCB3YXNfcXVldWluZzsKKwlpbnQgbm93X3F1ZXVpbmc7CisKKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmluZm8tPmNoYW5uZWwgLSAnQScsCisJCQkJICAgZGV2aW5mby0+dGFyZ2V0LAorCQkJCSAgIGRldmluZm8tPmx1biwgLyphbGxvYyovRkFMU0UpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCXdhc19xdWV1aW5nID0gZGV2LT5mbGFncyAmIChBSENfREVWX1FfQkFTSUN8QUhDX0RFVl9RX1RBR0dFRCk7CisJc3dpdGNoIChhbGcpIHsKKwlkZWZhdWx0OgorCWNhc2UgQUhDX1FVRVVFX05PTkU6CisJCW5vd19xdWV1aW5nID0gMDsKKwkJYnJlYWs7IAorCWNhc2UgQUhDX1FVRVVFX0JBU0lDOgorCQlub3dfcXVldWluZyA9IEFIQ19ERVZfUV9CQVNJQzsKKwkJYnJlYWs7CisJY2FzZSBBSENfUVVFVUVfVEFHR0VEOgorCQlub3dfcXVldWluZyA9IEFIQ19ERVZfUV9UQUdHRUQ7CisJCWJyZWFrOworCX0KKwlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX0ZSRUVaRV9USUxfRU1QVFkpID09IDAKKwkgJiYgKHdhc19xdWV1aW5nICE9IG5vd19xdWV1aW5nKQorCSAmJiAoZGV2LT5hY3RpdmUgIT0gMCkpIHsKKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX0ZSRUVaRV9USUxfRU1QVFk7CisJCWRldi0+cWZyb3plbisrOworCX0KKworCWRldi0+ZmxhZ3MgJj0gfihBSENfREVWX1FfQkFTSUN8QUhDX0RFVl9RX1RBR0dFRHxBSENfREVWX1BFUklPRElDX09UQUcpOworCWlmIChub3dfcXVldWluZykgeworCQl1X2ludCB1c2VydGFnczsKKworCQl1c2VydGFncyA9IGFoY19saW51eF91c2VyX3RhZ2RlcHRoKGFoYywgZGV2aW5mbyk7CisJCWlmICghd2FzX3F1ZXVpbmcpIHsKKwkJCS8qCisJCQkgKiBTdGFydCBvdXQgYWdyZXNzaXZlbHkgYW5kIGFsbG93IG91cgorCQkJICogZHluYW1pYyBxdWV1ZSBkZXB0aCBhbGdvcml0aG0gdG8gdGFrZQorCQkJICogY2FyZSBvZiB0aGUgcmVzdC4KKwkJCSAqLworCQkJZGV2LT5tYXh0YWdzID0gdXNlcnRhZ3M7CisJCQlkZXYtPm9wZW5pbmdzID0gZGV2LT5tYXh0YWdzIC0gZGV2LT5hY3RpdmU7CisJCX0KKwkJaWYgKGRldi0+bWF4dGFncyA9PSAwKSB7CisJCQkvKgorCQkJICogUXVldWVpbmcgaXMgZGlzYWJsZWQgYnkgdGhlIHVzZXIuCisJCQkgKi8KKwkJCWRldi0+b3BlbmluZ3MgPSAxOworCQl9IGVsc2UgaWYgKGFsZyA9PSBBSENfUVVFVUVfVEFHR0VEKSB7CisJCQlkZXYtPmZsYWdzIHw9IEFIQ19ERVZfUV9UQUdHRUQ7CisJCQlpZiAoYWljN3h4eF9wZXJpb2RpY19vdGFnICE9IDApCisJCQkJZGV2LT5mbGFncyB8PSBBSENfREVWX1BFUklPRElDX09UQUc7CisJCX0gZWxzZQorCQkJZGV2LT5mbGFncyB8PSBBSENfREVWX1FfQkFTSUM7CisJfSBlbHNlIHsKKwkJLyogV2UgY2FuIG9ubHkgaGF2ZSBvbmUgb3BlbmluZy4gKi8KKwkJZGV2LT5tYXh0YWdzID0gMDsKKwkJZGV2LT5vcGVuaW5ncyA9ICAxIC0gZGV2LT5hY3RpdmU7CisJfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZiAoZGV2LT5zY3NpX2RldmljZSAhPSBOVUxMKSB7CisJCXN3aXRjaCAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX0JBU0lDfEFIQ19ERVZfUV9UQUdHRUQpKSkgeworCQljYXNlIEFIQ19ERVZfUV9CQVNJQzoKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldi0+c2NzaV9kZXZpY2UsCisJCQkJCQlNU0dfU0lNUExFX1RBU0ssCisJCQkJCQlkZXYtPm9wZW5pbmdzICsgZGV2LT5hY3RpdmUpOworCQkJYnJlYWs7CisJCWNhc2UgQUhDX0RFVl9RX1RBR0dFRDoKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldi0+c2NzaV9kZXZpY2UsCisJCQkJCQlNU0dfT1JERVJFRF9UQVNLLAorCQkJCQkJZGV2LT5vcGVuaW5ncyArIGRldi0+YWN0aXZlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIFdlIGFsbG93IHRoZSBPUyB0byBxdWV1ZSAyIHVudGFnZ2VkIHRyYW5zYWN0aW9ucyB0bworCQkJICogdXMgYXQgYW55IHRpbWUgZXZlbiB0aG91Z2ggd2UgY2FuIG9ubHkgZXhlY3V0ZSB0aGVtCisJCQkgKiBzZXJpYWxseSBvbiB0aGUgY29udHJvbGxlci9kZXZpY2UuICBUaGlzIHNob3VsZAorCQkJICogcmVtb3ZlIHNvbWUgbGF0ZW5jeS4KKwkJCSAqLworCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LT5zY3NpX2RldmljZSwKKwkJCQkJCS8qTk9OLVRBR0dFRCovMCwKKwkJCQkJCS8qcXVldWUgZGVwdGgqLzIpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKK30KKworaW50CithaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKKwkJCWludCBsdW4sIHVfaW50IHRhZywgcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlpbnQgY2hhbjsKKwlpbnQgbWF4Y2hhbjsKKwlpbnQgdGFyZzsKKwlpbnQgbWF4dGFyZzsKKwlpbnQgY2x1bjsKKwlpbnQgbWF4bHVuOworCWludCBjb3VudDsKKworCWlmICh0YWcgIT0gU0NCX0xJU1RfTlVMTCkKKwkJcmV0dXJuICgwKTsKKworCWNoYW4gPSAwOworCWlmIChjaGFubmVsICE9IEFMTF9DSEFOTkVMUykgeworCQljaGFuID0gY2hhbm5lbCAtICdBJzsKKwkJbWF4Y2hhbiA9IGNoYW4gKyAxOworCX0gZWxzZSB7CisJCW1heGNoYW4gPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSA/IDIgOiAxOworCX0KKwl0YXJnID0gMDsKKwlpZiAodGFyZ2V0ICE9IENBTV9UQVJHRVRfV0lMRENBUkQpIHsKKwkJdGFyZyA9IHRhcmdldDsKKwkJbWF4dGFyZyA9IHRhcmcgKyAxOworCX0gZWxzZSB7CisJCW1heHRhcmcgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSA/IDE2IDogODsKKwl9CisJY2x1biA9IDA7CisJaWYgKGx1biAhPSBDQU1fTFVOX1dJTERDQVJEKSB7CisJCWNsdW4gPSBsdW47CisJCW1heGx1biA9IGNsdW4gKyAxOworCX0gZWxzZSB7CisJCW1heGx1biA9IEFIQ19OVU1fTFVOUzsKKwl9CisKKwljb3VudCA9IDA7CisJZm9yICg7IGNoYW4gPCBtYXhjaGFuOyBjaGFuKyspIHsKKworCQlmb3IgKDsgdGFyZyA8IG1heHRhcmc7IHRhcmcrKykgeworCisJCQlmb3IgKDsgY2x1biA8IG1heGx1bjsgY2x1bisrKSB7CisJCQkJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwkJCQlzdHJ1Y3QgYWhjX2J1c3lxICpidXN5cTsKKwkJCQlzdHJ1Y3QgYWhjX2NtZCAqYWNtZDsKKworCQkJCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgY2hhbiwKKwkJCQkJCQkgICB0YXJnLCBjbHVuLAorCQkJCQkJCSAgIC8qYWxsb2MqL0ZBTFNFKTsKKwkJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJCWNvbnRpbnVlOworCisJCQkJYnVzeXEgPSAmZGV2LT5idXN5cTsKKwkJCQl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVChidXN5cSkpICE9IE5VTEwpIHsKKwkJCQkJU2NzaV9DbW5kICpjbWQ7CisKKwkJCQkJY21kID0gJmFjbWRfc2NzaV9jbWQoYWNtZCk7CisJCQkJCVRBSUxRX1JFTU9WRShidXN5cSwgYWNtZCwKKwkJCQkJCSAgICAgYWNtZF9saW5rcy50cWUpOworCQkJCQljb3VudCsrOworCQkJCQljbWQtPnJlc3VsdCA9IHN0YXR1cyA8PCAxNjsKKwkJCQkJYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGMsIGNtZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfdGhyZWFkX3J1bl9jb21wbGV0ZV9xdWV1ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9sb25nIGZsYWdzOworCisJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOworCWRlbF90aW1lcigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5jb21wbGV0ZXFfdGltZXIpOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19SVU5fQ01QTFRfUV9USU1FUjsKKwlhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYyk7CisJYWhjX3VubG9jayhhaGMsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfc3RhcnRfZHYoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCisJLyoKKwkgKiBGcmVlemUgdGhlIHNpbXEgYW5kIHNpZ25hbCBhaGNfbGludXhfcXVldWUgdG8gbm90IGxldCBhbnkKKwkgKiBtb3JlIGNvbW1hbmRzIHRocm91Z2guCisJICovCisJaWYgKChhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICYgQUhDX0RWX0FDVElWRSkgPT0gMCkgeworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpCisJCQlwcmludGYoIiVzOiBXYWtpbmcgRFYgdGhyZWFkXG4iLCBhaGNfbmFtZShhaGMpKTsKKyNlbmRpZgorCisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgfD0gQUhDX0RWX0FDVElWRTsKKwkJYWhjX2xpbnV4X2ZyZWV6ZV9zaW1xKGFoYyk7CisKKwkJLyogV2FrZSB1cCB0aGUgRFYga3RocmVhZCAqLworCQl1cCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9raWxsX2R2X3RocmVhZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9sb25nIHM7CisKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9waWQgIT0gMCkgeworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19EVl9TSFVURE9XTjsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJdXAoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKworCQkvKgorCQkgKiBVc2UgdGhlIGVoX3NlbSBhcyBhbiBpbmRpY2F0b3IgdGhhdCB0aGUKKwkJICogZHYgdGhyZWFkIGlzIGV4aXRpbmcuICBOb3RlIHRoYXQgdGhlIGR2CisJCSAqIHRocmVhZCBtdXN0IHN0aWxsIHJldHVybiBhZnRlciBwZXJmb3JtaW5nCisJCSAqIHRoZSB1cCBvbiBvdXIgc2VtYXBob3JlIGJlZm9yZSBpdCBoYXMKKwkJICogY29tcGxldGVseSBleGl0ZWQgdGhpcyBtb2R1bGUuICBVbmZvcnR1bmF0ZWx5LAorCQkgKiB0aGVyZSBzZWVtcyB0byBiZSBubyBlYXN5IHdheSB0byB3YWl0IGZvciB0aGUKKwkJICogZXhpdCBvZiBhIHRocmVhZCBmb3Igd2hpY2ggeW91IGFyZSBub3QgdGhlCisJCSAqIHBhcmVudCAoZHYgdGhyZWFkcyBhcmUgcGFyZW50ZWQgYnkgaW5pdCkuCisJCSAqIENyb3NzIHlvdXIgZmluZ2Vycy4uLgorCQkgKi8KKwkJZG93bigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCisJCS8qCisJCSAqIE1hcmsgdGhlIGR2IHRocmVhZCBhcyBhbHJlYWR5IGRlYWQuICBUaGlzCisJCSAqIGF2b2lkcyBhdHRlbXB0aW5nIHRvIGtpbGwgaXQgYSBzZWNvbmQgdGltZS4KKwkJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtdXN0IGtpbGwgdGhlCisJCSAqIERWIHRocmVhZCBiZWZvcmUgY2FsbGluZyBhaGNfZnJlZSgpIGluIHRoZQorCQkgKiBtb2R1bGUgc2h1dGRvd24gY2FzZSB0byBhdm9pZCBib2d1cyBsb2NraW5nCisJCSAqIGluIHRoZSBTQ1NJIG1pZC1sYXllciwgYnV0IHdlIGFoY19mcmVlKCkgaXMKKwkJICogY2FsbGVkIHdpdGhvdXQga2lsbGluZyB0aGUgRFYgdGhyZWFkIGluIHRoZQorCQkgKiBpbnN0YW5jZSBkZXRhY2ggY2FzZSwgc28gYWhjX3BsYXRmb3JtX2ZyZWUoKQorCQkgKiBjYWxscyB1cyBhZ2FpbiB0byB2ZXJpZnkgdGhhdCB0aGUgRFYgdGhyZWFkCisJCSAqIGlzIGRlYWQuCisJCSAqLworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3BpZCA9IDA7CisJfSBlbHNlIHsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2FoY19saW51eF9kdl90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QJYWhjX3NvZnRjICphaGM7CisJaW50CXRhcmdldDsKKwl1X2xvbmcJczsKKworCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopZGF0YTsKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikKKwkJcHJpbnRmKCJMYXVuY2hpbmcgRFYgVGhyZWFkXG4iKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDb21wbGV0ZSB0aHJlYWQgY3JlYXRpb24uCisJICovCisJbG9ja19rZXJuZWwoKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkvKgorCSAqIERvbid0IGNhcmUgYWJvdXQgYW55IHNpZ25hbHMuCisJICovCisJc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgMCk7CisKKwlkYWVtb25pemUoKTsKKwlzcHJpbnRmKGN1cnJlbnQtPmNvbW0sICJhaGNfZHZfJWQiLCBhaGMtPnVuaXQpOworI2Vsc2UKKwlkYWVtb25pemUoImFoY19kdl8lZCIsIGFoYy0+dW5pdCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRlJFRVpFOworI2VuZGlmCisJdW5sb2NrX2tlcm5lbCgpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogVXNlIGRvd25faW50ZXJydXB0aWJsZSgpIHJhdGhlciB0aGFuIGRvd24oKSB0bworCQkgKiBhdm9pZCBpbmNsdXNpb24gaW4gdGhlIGxvYWQgYXZlcmFnZS4KKwkJICovCisJCWRvd25faW50ZXJydXB0aWJsZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zZW0pOworCisJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBiZWVuIHNpZ25hbGVkIHRvIGV4aXQgKi8KKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCWlmICgoYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyAmIEFIQ19EVl9TSFVURE9XTikgIT0gMCkgeworCQkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJCWJyZWFrOworCQl9CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisKKyNpZmRlZiBBSENfREVCVUcKKwkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKQorCQkJcHJpbnRmKCIlczogQmVnaW5uaW5nIERvbWFpbiBWYWxpZGF0aW9uXG4iLAorCQkJICAgICAgIGFoY19uYW1lKGFoYykpOworI2VuZGlmCisKKwkJLyoKKwkJICogV2FpdCBmb3IgYW55IHBlbmRpbmcgY29tbWFuZHMgdG8gZHJhaW4gYmVmb3JlIHByb2NlZWRpbmcuCisJCSAqLworCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJd2hpbGUgKExJU1RfRklSU1QoJmFoYy0+cGVuZGluZ19zY2JzKSAhPSBOVUxMKSB7CisJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19EVl9XQUlUX1NJTVFfRU1QVFk7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJfQorCisJCS8qCisJCSAqIFdhaXQgZm9yIHRoZSBTSU1RIHRvIGJlIHJlbGVhc2VkIHNvIHRoYXQgRFYgaXMgdGhlCisJCSAqIG9ubHkgcmVhc29uIHRoZSBxdWV1ZSBpcyBmcm96ZW4uCisJCSAqLworCQl3aGlsZSAoQUhDX0RWX1NJTVFfRlJPWkVOKGFoYykgPT0gMCkgeworCQkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSENfRFZfV0FJVF9TSU1RX1JFTEVBU0U7CisJCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJCQlhaGNfbG9jayhhaGMsICZzKTsKKwkJfQorCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCisJCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgQUhDX05VTV9UQVJHRVRTOyB0YXJnZXQrKykKKwkJCWFoY19saW51eF9kdl90YXJnZXQoYWhjLCB0YXJnZXQpOworCisJCWFoY19sb2NrKGFoYywgJnMpOworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSENfRFZfQUNUSVZFOworCQlhaGNfdW5sb2NrKGFoYywgJnMpOworCisJCS8qCisJCSAqIFJlbGVhc2UgdGhlIFNJTVEgc28gdGhhdCBub3JtYWwgY29tbWFuZHMgYXJlCisJCSAqIGFsbG93ZWQgdG8gY29udGludWUgb24gdGhlIGJ1cy4KKwkJICovCisJCWFoY19saW51eF9yZWxlYXNlX3NpbXEoKHVfbG9uZylhaGMpOworCX0KKwl1cCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCXJldHVybiAoMCk7Cit9CisKKyNkZWZpbmUgQUhDX0xJTlVYX0RWX0lOUV9TSE9SVF9MRU4JMzYKKyNkZWZpbmUgQUhDX0xJTlVYX0RWX0lOUV9MRU4JCTI1NgorI2RlZmluZSBBSENfTElOVVhfRFZfVElNRU9VVAkJKEhaIC8gNCkKKworI2RlZmluZSBBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgbmV3c3RhdGUpIFwKKwlhaGNfc2V0X2R2X3N0YXRlKGFoYywgdGFyZywgbmV3c3RhdGUsIF9fTElORV9fKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3NldF9kdl9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkgYWhjX2R2X3N0YXRlIG5ld3N0YXRlLCB1X2ludCBsaW5lKQoreworCWFoY19kdl9zdGF0ZSBvbGRzdGF0ZTsKKworCW9sZHN0YXRlID0gdGFyZy0+ZHZfc3RhdGU7CisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKQorCQlwcmludGYoIiVzOiVkOiBHb2luZyBmcm9tIHN0YXRlICVkIHRvIHN0YXRlICVkXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgbGluZSwgb2xkc3RhdGUsIG5ld3N0YXRlKTsKKyNlbmRpZgorCisJaWYgKG9sZHN0YXRlID09IG5ld3N0YXRlKQorCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSsrOworCWVsc2UKKwkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCXRhcmctPmR2X3N0YXRlID0gbmV3c3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfdGFyZ2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGFyZ2V0X29mZnNldCkKK3sKKwlzdHJ1Y3QJIGFoY19kZXZpbmZvIGRldmluZm87CisJc3RydWN0CSBhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdAkgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0CSBzY3NpX2RldmljZSAqc2NzaV9kZXY7CisJc3RydWN0CSBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlOworCXVpbnQ4X3QgKmJ1ZmZlcjsKKwl1X2xvbmcJIHM7CisJdV9pbnQJIHRpbWVvdXQ7CisJaW50CSBlY2hvX3NpemU7CisKKwlzZW5zZSA9IE5VTEw7CisJYnVmZmVyID0gTlVMTDsKKwllY2hvX3NpemUgPSAwOworCWFoY19sb2NrKGFoYywgJnMpOworCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJaWYgKHRhcmcgPT0gTlVMTCB8fCAodGFyZy0+ZmxhZ3MgJiBBSENfRFZfUkVRVUlSRUQpID09IDApIHsKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKwkJcmV0dXJuOworCX0KKwlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJICAgIHRhcmctPmNoYW5uZWwgPT0gMCA/IGFoYy0+b3VyX2lkIDogYWhjLT5vdXJfaWRfYiwKKwkJCSAgICB0YXJnLT50YXJnZXQsIC8qbHVuKi8wLCB0YXJnLT5jaGFubmVsICsgJ0EnLAorCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CisJCXByaW50ZigiUGVyZm9ybWluZyBEVlxuIik7CisJfQorI2VuZGlmCisKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworCisJY21kID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlzY3NpX2RldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfZGV2aWNlKSwgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwlzY3NpX2Rldi0+aG9zdCA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdDsKKwlzY3NpX2Rldi0+aWQgPSBkZXZpbmZvLnRhcmdldDsKKwlzY3NpX2Rldi0+bHVuID0gZGV2aW5mby5sdW47CisJc2NzaV9kZXYtPmNoYW5uZWwgPSBkZXZpbmZvLmNoYW5uZWwgLSAnQSc7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zY3NpX2RldiA9IHNjc2lfZGV2OworCisJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCisJd2hpbGUgKHRhcmctPmR2X3N0YXRlICE9IEFIQ19EVl9TVEFURV9FWElUKSB7CisJCXRpbWVvdXQgPSBBSENfTElOVVhfRFZfVElNRU9VVDsKKwkJc3dpdGNoICh0YXJnLT5kdl9zdGF0ZSkgeworCQljYXNlIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkM6CisJCWNhc2UgQUhDX0RWX1NUQVRFX0lOUV9BU1lOQzoKKwkJY2FzZSBBSENfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWToKKwkJCS8qCisJCQkgKiBTZXQgdGhpbmdzIHRvIGFzeW5jIG5hcnJvdyB0byByZWR1Y2UgdGhlCisJCQkgKiBjaGFuY2UgdGhhdCB0aGUgSU5RIHdpbGwgZmFpbC4KKwkJCSAqLworCQkJYWhjX2xvY2soYWhjLCAmcyk7CisJCQlhaGNfc2V0X3N5bmNyYXRlKGFoYywgJmRldmluZm8sIE5VTEwsIDAsIDAsIDAsCisJCQkJCSBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwkJCWFoY19zZXRfd2lkdGgoYWhjLCAmZGV2aW5mbywgTVNHX0VYVF9XRFRSX0JVU184X0JJVCwKKwkJCQkgICAgICBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwkJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCQl0aW1lb3V0ID0gMTAgKiBIWjsKKwkJCXRhcmctPmZsYWdzICY9IH5BSENfSU5RX1ZBTElEOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBBSENfRFZfU1RBVEVfSU5RX1ZFUklGWToKKwkJeworCQkJdV9pbnQgaW5xX2xlbjsKKworCQkJaWYgKHRhcmctPmR2X3N0YXRlID09IEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpCisJCQkJaW5xX2xlbiA9IEFIQ19MSU5VWF9EVl9JTlFfU0hPUlRfTEVOOworCQkJZWxzZQorCQkJCWlucV9sZW4gPSB0YXJnLT5pbnFfZGF0YS0+YWRkaXRpb25hbF9sZW5ndGggKyA1OworCQkJYWhjX2xpbnV4X2R2X2lucShhaGMsIGNtZCwgJmRldmluZm8sIHRhcmcsIGlucV9sZW4pOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBSENfRFZfU1RBVEVfVFVSOgorCQljYXNlIEFIQ19EVl9TVEFURV9CVVNZOgorCQkJdGltZW91dCA9IDUgKiBIWjsKKwkJCWFoY19saW51eF9kdl90dXIoYWhjLCBjbWQsICZkZXZpbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIEFIQ19EVl9TVEFURV9SRUJEOgorCQkJYWhjX2xpbnV4X2R2X3JlYmQoYWhjLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEFIQ19EVl9TVEFURV9XRUI6CisJCQlhaGNfbGludXhfZHZfd2ViKGFoYywgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlIEFIQ19EVl9TVEFURV9SRUI6CisJCQlhaGNfbGludXhfZHZfcmViKGFoYywgY21kLCAmZGV2aW5mbywgdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlIEFIQ19EVl9TVEFURV9TVToKKwkJCWFoY19saW51eF9kdl9zdShhaGMsIGNtZCwgJmRldmluZm8sIHRhcmcpOworCQkJdGltZW91dCA9IDUwICogSFo7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CisJCQlwcmludGYoIlVua25vd24gRFYgc3RhdGUgJWRcbiIsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogUXVldWUgdGhlIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJCS8qIEFidXNlIGVoX3RpbWVvdXQgaW4gdGhlIHNjc2lfY21uZCBzdHJ1Y3QgZm9yIG91ciBwdXJwb3NlcyAqLworCQlpbml0X3RpbWVyKCZjbWQtPmVoX3RpbWVvdXQpOworI2lmZGVmIEFIQ19ERUJVRworCQlpZiAoKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX01FU1NBR0VTKSAhPSAwKQorCQkJLyoKKwkJCSAqIEFsbCBvZiB0aGUgcHJpbnRmcyBkdXJpbmcgbmVnb3RpYXRpb24KKwkJCSAqIHJlYWxseSBzbG93IGRvd24gdGhlIG5lZ290aWF0aW9uLgorCQkJICogQWRkIGEgYml0IG9mIHRpbWUganVzdCB0byBiZSBzYWZlLgorCQkJICovCisJCQl0aW1lb3V0ICs9IEhaOworI2VuZGlmCisJCXNjc2lfYWRkX3RpbWVyKGNtZCwgdGltZW91dCwgYWhjX2xpbnV4X2R2X3RpbWVvdXQpOworCQkvKgorCQkgKiBJbiAyLjUuWCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBjYWxscyBmcm9tIHRoZQorCQkgKiAibWlkbGF5ZXIiICh3aGljaCB3ZSBhcmUgZW11bGF0aW5nKSB3aWxsIGhhdmUgdGhlCisJCSAqIGFoYyBob3N0IGxvY2sgaGVsZC4gIEZvciBvdGhlciBrZXJuZWxzLCB0aGUKKwkJICogaW9fcmVxdWVzdF9sb2NrIG11c3QgYmUgaGVsZC4KKwkJICovCisjaWYgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyAhPSAwCisJCWFoY19sb2NrKGFoYywgJnMpOworI2Vsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvX3JlcXVlc3RfbG9jaywgcyk7CisjZW5kaWYKKwkJYWhjX2xpbnV4X3F1ZXVlKGNtZCwgYWhjX2xpbnV4X2R2X2NvbXBsZXRlKTsKKyNpZiBBSENfU0NTSV9IQVNfSE9TVF9MT0NLICE9IDAKKwkJYWhjX3VubG9jayhhaGMsICZzKTsKKyNlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgcyk7CisjZW5kaWYKKwkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgU0lNUSB0byBiZSByZWxlYXNlZCBzbyB0aGF0IERWIGlzIHRoZQorCQkgKiBvbmx5IHJlYXNvbiB0aGUgcXVldWUgaXMgZnJvemVuLgorCQkgKi8KKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCXdoaWxlIChBSENfRFZfU0lNUV9GUk9aRU4oYWhjKSA9PSAwKSB7CisJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzIHw9IEFIQ19EVl9XQUlUX1NJTVFfUkVMRUFTRTsKKwkJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCQlkb3duX2ludGVycnVwdGlibGUoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKwkJCWFoY19sb2NrKGFoYywgJnMpOworCQl9CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisKKwkJYWhjX2xpbnV4X2R2X3RyYW5zaXRpb24oYWhjLCBjbWQsICZkZXZpbmZvLCB0YXJnKTsKKwl9CisKK291dDoKKwlpZiAoKHRhcmctPmZsYWdzICYgQUhDX0lOUV9WQUxJRCkgIT0gMAorCSAmJiBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGRldmluZm8uY2hhbm5lbCAtICdBJywKKwkJCQkgZGV2aW5mby50YXJnZXQsIGRldmluZm8ubHVuLAorCQkJCSAvKmFsbG9jKi9GQUxTRSkgPT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGUgRFYgc3RhdGUgbWFjaGluZSBmYWlsZWQgdG8gY29uZmlndXJlIHRoaXMgZGV2aWNlLiAgCisJCSAqIFRoaXMgaXMgbm9ybWFsIGlmIERWIGlzIGRpc2FibGVkLiAgU2luY2Ugd2UgaGF2ZSBpbnF1aXJ5CisJCSAqIGRhdGEsIGZpbHRlciBpdCBhbmQgdXNlIHRoZSAib3B0aW1pc3RpYyIgbmVnb3RpYXRpb24KKwkJICogcGFyYW1ldGVycyBmb3VuZCBpbiB0aGUgaW5xdWlyeSBzdHJpbmcuCisJCSAqLworCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCAmZGV2aW5mbyk7CisJCWlmICgodGFyZy0+ZmxhZ3MgJiAoQUhDX0JBU0lDX0RWfEFIQ19FTkhBTkNFRF9EVikpICE9IDApIHsKKwkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgJmRldmluZm8pOworCQkJcHJpbnRmKCJEViBmYWlsZWQgdG8gY29uZmlndXJlIGRldmljZS4gICIKKwkJCSAgICAgICAiUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IGFnYWluc3QgIgorCQkJICAgICAgICJ0aGlzIGRyaXZlci5cbiIpOworCQl9CisJfQorCisJaWYgKGNtZCAhPSBOVUxMKQorCQlmcmVlKGNtZCwgTV9ERVZCVUYpOworCisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYgIT0gTlVMTCkgeworCQlmcmVlKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXYsIE1fREVWQlVGKTsKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5kdl9zY3NpX2RldiA9IE5VTEw7CisJfQorCisJYWhjX2xvY2soYWhjLCAmcyk7CisJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKSB7CisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyLCBNX0RFVkJVRik7CisJCXRhcmctPmR2X2J1ZmZlciA9IE5VTEw7CisJfQorCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpIHsKKwkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7CisJCXRhcmctPmR2X2J1ZmZlcjEgPSBOVUxMOworCX0KKwl0YXJnLT5mbGFncyAmPSB+QUhDX0RWX1JFUVVJUkVEOworCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwKQorCQlhaGNfbGludXhfZnJlZV90YXJnZXQoYWhjLCB0YXJnKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X3RyYW5zaXRpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQlzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sCisJCQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKwl1X2ludDMyX3Qgc3RhdHVzOworCisJc3RhdHVzID0gYWljX2Vycm9yX2FjdGlvbihjbWQsIHRhcmctPmlucV9kYXRhLAorCQkJCSAgYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCksCisJCQkJICBhaGNfY21kX2dldF9zY3NpX3N0YXR1cyhjbWQpKTsKKwkKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJFbnRlcmluZyBhaGNfbGludXhfZHZfdHJhbnNpdGlvbiwgc3RhdGU9ICVkLCAiCisJCSAgICAgICAic3RhdHVzPSAweCV4LCBjbWQtPnJlc3VsdD0gMHgleFxuIiwgdGFyZy0+ZHZfc3RhdGUsCisJCSAgICAgICBzdGF0dXMsIGNtZC0+cmVzdWx0KTsKKwl9CisjZW5kaWYKKworCXN3aXRjaCAodGFyZy0+ZHZfc3RhdGUpIHsKKwljYXNlIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkM6CisJY2FzZSBBSENfRFZfU1RBVEVfSU5RX0FTWU5DOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCXsKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSsxKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJaWYgKChzdGF0dXMgJiBTU19FUlJNQVNLKSA9PSBFQlVTWSkKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0JVU1kpOworCQkJaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDwgMTApCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQlkZWZhdWx0OgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9FWElUKTsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQkJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCQkJcHJpbnRmKCJGYWlsZWQgRFYgaW5xdWlyeSwgc2tpcHBpbmdcbiIpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEFIQ19EVl9TVEFURV9JTlFfQVNZTkNfVkVSSUZZOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCXsKKwkJCXVfaW50IHhwb3J0ZmxhZ3M7CisJCQl1X2ludCBzcGkzZGF0YTsKKworCQkJaWYgKG1lbWNtcCh0YXJnLT5pbnFfZGF0YSwgdGFyZy0+ZHZfYnVmZmVyLAorCQkJCSAgIEFIQ19MSU5VWF9EVl9JTlFfTEVOKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBJbnF1aXJ5IGRhdGEgbXVzdCBoYXZlIGNoYW5nZWQuCisJCQkJICogVHJ5IGZyb20gdGhlIHRvcCBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCSBBSENfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKzEpOworCQkJdGFyZy0+ZmxhZ3MgfD0gQUhDX0lOUV9WQUxJRDsKKwkJCWlmIChhaGNfbGludXhfdXNlcl9kdl9zZXR0aW5nKGFoYykgPT0gMCkKKwkJCQlicmVhazsKKworCQkJeHBvcnRmbGFncyA9IHRhcmctPmlucV9kYXRhLT5mbGFnczsKKwkJCWlmICgoeHBvcnRmbGFncyAmIChTSURfU3luY3xTSURfV0J1czE2KSkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJc3BpM2RhdGEgPSB0YXJnLT5pbnFfZGF0YS0+c3BpM2RhdGE7CisJCQlzd2l0Y2ggKHNwaTNkYXRhICYgU0lEX1NQSV9DTE9DS19EVF9TVCkgeworCQkJZGVmYXVsdDoKKwkJCWNhc2UgU0lEX1NQSV9DTE9DS19TVDoKKwkJCQkvKiBBc3N1bWUgb25seSBiYXNpYyBEViBpcyBzdXBwb3J0ZWQuICovCisJCQkJdGFyZy0+ZmxhZ3MgfD0gQUhDX0JBU0lDX0RWOworCQkJCWJyZWFrOworCQkJY2FzZSBTSURfU1BJX0NMT0NLX0RUOgorCQkJY2FzZSBTSURfU1BJX0NMT0NLX0RUX1NUOgorCQkJCXRhcmctPmZsYWdzIHw9IEFIQ19FTkhBTkNFRF9EVjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCisJCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKQorCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfQlVTWSk7CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPCAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkZhaWxlZCBEViBpbnF1aXJ5LCBza2lwcGluZ1xuIik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQUhDX0RWX1NUQVRFX0lOUV9WRVJJRlk6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJeworCisJCQlpZiAobWVtY21wKHRhcmctPmlucV9kYXRhLCB0YXJnLT5kdl9idWZmZXIsCisJCQkJICAgQUhDX0xJTlVYX0RWX0lOUV9MRU4pID09IDApIHsKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJaW50IGk7CisKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiSW5xdWlyeSBidWZmZXIgbWlzbWF0Y2g6Iik7CisJCQkJZm9yIChpID0gMDsgaSA8IEFIQ19MSU5VWF9EVl9JTlFfTEVOOyBpKyspIHsKKwkJCQkJaWYgKChpICYgMHhGKSA9PSAwKQorCQkJCQkJcHJpbnRmKCJcbiAgICAgICAgIik7CisJCQkJCXByaW50ZigiMHgleDoweDAleCAiLAorCQkJCQkgICAgICAgKCh1aW50OF90ICopdGFyZy0+aW5xX2RhdGEpW2ldLCAKKwkJCQkJICAgICAgIHRhcmctPmR2X2J1ZmZlcltpXSk7CisJCQkJfQorCQkJCXByaW50ZigiXG4iKTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoYWhjX2xpbnV4X2ZhbGxiYWNrKGFoYywgZGV2aW5mbykgIT0gMCkgeworCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCisJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgorCQkJICovCisJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTU19JTlFfUkVGUkVTSDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLAorCQkJCQkgQUhDX0RWX1NUQVRFX0lOUV9TSE9SVF9BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTU19UVVI6CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgeworCQkJCWlmIChhaGNfbGludXhfZmFsbGJhY2soYWhjLCBkZXZpbmZvKSAhPSAwKSB7CisJCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLAorCQkJCQkJCSBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIERvIG5vdCBjb3VudCAiZmFsbGluZyBiYWNrIgorCQkJCSAqIGFnYWluc3Qgb3VyIHJldHJpZXMuCisJCQkJICovCisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnkgPSAwOworCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NfRVJSTUFTSykgPT0gRUJVU1kpCisJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9CVVNZKTsKKwkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8IDEwKQorCQkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiRmFpbGVkIERWIGlucXVpcnksIHNraXBwaW5nXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9UVVI6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJCWlmICgodGFyZy0+ZmxhZ3MgJiBBSENfQkFTSUNfRFYpICE9IDApIHsKKwkJCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCBkZXZpbmZvKTsKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCSBBSENfRFZfU1RBVEVfSU5RX1ZFUklGWSk7CisJCQl9IGVsc2UgaWYgKCh0YXJnLT5mbGFncyAmIEFIQ19FTkhBTkNFRF9EVikgIT0gMCkgeworCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfUkVCRCk7CisJCQl9IGVsc2UgeworCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTU19SRVRSWToKKwkJY2FzZSBTU19UVVI6CisJCQlpZiAoKHN0YXR1cyAmIFNTX0VSUk1BU0spID09IEVCVVNZKSB7CisJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9CVVNZKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCB0YXJnLT5kdl9zdGF0ZSk7CisJCQlpZiAoYWhjX2NtZF9nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKGNtZCkKKwkJCSA9PSBDQU1fUkVRVUVVRV9SRVEpIHsKKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeS0tOworCQkJfSBlbHNlIGlmICgoc3RhdHVzICYgU1NRX0ZBTExCQUNLKSAhPSAwKSB7CisJCQkJaWYgKGFoY19saW51eF9mYWxsYmFjayhhaGMsIGRldmluZm8pICE9IDApIHsKKwkJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsCisJCQkJCQkJIEFIQ19EVl9TVEFURV9FWElUKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogRG8gbm90IGNvdW50ICJmYWxsaW5nIGJhY2siCisJCQkJICogYWdhaW5zdCBvdXIgcmV0cmllcy4KKwkJCQkgKi8KKwkJCQl0YXJnLT5kdl9zdGF0ZV9yZXRyeSA9IDA7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPj0gMTApIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQkJcHJpbnRmKCJEViBUVVIgcmV0aWVzIGV4aGF1c3RlZFxuIik7CisJCQkJfQorI2VuZGlmCisJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9FWElUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBTU1FfREVMQVkpCisJCQkJc3NsZWVwKDEpOworCisJCQlicmVhazsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfU1UpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9SRUJEOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCXsKKwkJCXVpbnQzMl90IGVjaG9fc2l6ZTsKKworCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9XRUIpOworCQkJZWNob19zaXplID0gc2NzaV8zYnRvdWwoJnRhcmctPmR2X2J1ZmZlclsxXSk7CisJCQllY2hvX3NpemUgJj0gMHgxRkZGOworI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkVjaG8gYnVmZmVyIHNpemU9ICVkXG4iLCBlY2hvX3NpemUpOworCQkJfQorI2VuZGlmCisJCQlpZiAoZWNob19zaXplID09IDApIHsKKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBHZW5lcmF0ZSB0aGUgYnVmZmVyIHBhdHRlcm4gKi8KKwkJCXRhcmctPmR2X2VjaG9fc2l6ZSA9IGVjaG9fc2l6ZTsKKwkJCWFoY19saW51eF9nZW5lcmF0ZV9kdl9wYXR0ZXJuKHRhcmcpOworCQkJLyoKKwkJCSAqIFNldHVwIGluaXRpYWwgbmVnb3RpYXRpb24gdmFsdWVzLgorCQkJICovCisJCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCBkZXZpbmZvKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKQorCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApCisJCQkJYnJlYWs7CisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiRFYgUkVCRCByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBTU19GQVRBTDoKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBTZXR1cCBpbml0aWFsIG5lZ290aWF0aW9uIHZhbHVlcworCQkJICogYW5kIHRyeSBsZXZlbCAxIERWLgorCQkJICovCisJCQlhaGNfbGludXhfZmlsdGVyX2lucXVpcnkoYWhjLCBkZXZpbmZvKTsKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfSU5RX1ZFUklGWSk7CisJCQl0YXJnLT5kdl9lY2hvX3NpemUgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9XRUI6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfUkVCKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX0lOUV9SRUZSRVNIOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsCisJCQkJCSBBSENfRFZfU1RBVEVfSU5RX1NIT1JUX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBTU1FfRkFMTEJBQ0spICE9IDApIHsKKwkJCQlpZiAoYWhjX2xpbnV4X2ZhbGxiYWNrKGFoYywgZGV2aW5mbykgIT0gMCkgeworCQkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCQkgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBEbyBub3QgY291bnQgImZhbGxpbmcgYmFjayIKKwkJCQkgKiBhZ2FpbnN0IG91ciByZXRyaWVzLgorCQkJCSAqLworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5ID0gMDsKKwkJCX0KKwkJCWlmICh0YXJnLT5kdl9zdGF0ZV9yZXRyeSA8PSAxMCkKKwkJCQlicmVhazsKKwkJCS8qIEZBTExUSFJPVUdIICovCisjaWZkZWYgQUhDX0RFQlVHCisJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQkJCXByaW50ZigiRFYgV0VCIHJldGllcyBleGhhdXN0ZWRcbiIpOworCQkJfQorI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9SRUI6CisJCXN3aXRjaCAoc3RhdHVzICYgU1NfTUFTSykgeworCQljYXNlIFNTX05PUDoKKwkJCWlmIChtZW1jbXAodGFyZy0+ZHZfYnVmZmVyLCB0YXJnLT5kdl9idWZmZXIxLAorCQkJCSAgIHRhcmctPmR2X2VjaG9fc2l6ZSkgIT0gMCkgeworCQkJCWlmIChhaGNfbGludXhfZmFsbGJhY2soYWhjLCBkZXZpbmZvKSAhPSAwKQorCQkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJCQkgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJCWVsc2UKKwkJCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsCisJCQkJCQkJIEFIQ19EVl9TVEFURV9XRUIpOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlpZiAodGFyZy0+ZHZfYnVmZmVyICE9IE5VTEwpIHsKKwkJCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCQkJCXRhcmctPmR2X2J1ZmZlciA9IE5VTEw7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfYnVmZmVyMSAhPSBOVUxMKSB7CisJCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIxLCBNX0RFVkJVRik7CisJCQkJdGFyZy0+ZHZfYnVmZmVyMSA9IE5VTEw7CisJCQl9CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfUkVUUlk6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgdGFyZy0+ZHZfc3RhdGUpOworCQkJaWYgKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpCisJCQkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQkJdGFyZy0+ZHZfc3RhdGVfcmV0cnktLTsKKwkJCX0gZWxzZSBpZiAoKHN0YXR1cyAmIFNTUV9GQUxMQkFDSykgIT0gMCkgeworCQkJCWlmIChhaGNfbGludXhfZmFsbGJhY2soYWhjLCBkZXZpbmZvKSAhPSAwKSB7CisJCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLAorCQkJCQkJCSBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX1dFQik7CisJCQl9CisJCQlpZiAodGFyZy0+ZHZfc3RhdGVfcmV0cnkgPD0gMTApIHsKKwkJCQlpZiAoKHN0YXR1cyAmIChTU1FfREVMQVlfUkFORE9NfFNTUV9ERUxBWSkpIT0gMCkKKwkJCQkJbXNsZWVwKGFoYy0+b3VyX2lkKjEwMDAvMTApOworCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIEFIQ19ERUJVRworCQkJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQlwcmludGYoIkRWIFJFQiByZXRpZXMgZXhoYXVzdGVkXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUhDX0RWX1NUQVRFX1NVOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywgQUhDX0RWX1NUQVRFX0VYSVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFIQ19EVl9TVEFURV9CVVNZOgorCQlzd2l0Y2ggKHN0YXR1cyAmIFNTX01BU0spIHsKKwkJY2FzZSBTU19OT1A6CisJCWNhc2UgU1NfSU5RX1JFRlJFU0g6CisJCQlBSENfU0VUX0RWX1NUQVRFKGFoYywgdGFyZywKKwkJCQkJIEFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMpOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVFVSOgorCQljYXNlIFNTX1JFVFJZOgorCQkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIHRhcmctPmR2X3N0YXRlKTsKKwkJCWlmIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoY21kKQorCQkJID09IENBTV9SRVFVRVVFX1JFUSkgeworCQkJCXRhcmctPmR2X3N0YXRlX3JldHJ5LS07CisJCQl9IGVsc2UgaWYgKHRhcmctPmR2X3N0YXRlX3JldHJ5IDwgNjApIHsKKwkJCQlpZiAoKHN0YXR1cyAmIFNTUV9ERUxBWSkgIT0gMCkKKwkJCQkJc3NsZWVwKDEpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCQlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJCQkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJCQkJcHJpbnRmKCJEViBCVVNZIHJldGllcyBleGhhdXN0ZWRcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFIQ19TRVRfRFZfU1RBVEUoYWhjLCB0YXJnLCBBSENfRFZfU1RBVEVfRVhJVCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiJXM6IEludmFsaWQgRFYgY29tcGxldGlvbiBzdGF0ZSAlZFxuIiwgYWhjX25hbWUoYWhjKSwKKwkJICAgICAgIHRhcmctPmR2X3N0YXRlKTsKKwkJQUhDX1NFVF9EVl9TVEFURShhaGMsIHRhcmcsIEFIQ19EVl9TVEFURV9FWElUKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X2ZpbGxfY21kKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgICAgICBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX2NtbmQpKTsKKwljbWQtPmRldmljZSA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2NzaV9kZXY7CisJY21kLT5zY3NpX2RvbmUgPSBhaGNfbGludXhfZHZfY29tcGxldGU7Cit9CisKKy8qCisgKiBTeW50aGVzaXplIGFuIGlucXVpcnkgY29tbWFuZC4gIE9uIHRoZSByZXR1cm4gdHJpcCwgaXQnbGwgYmUKKyAqIHNuaWZmZWQgYW5kIHRoZSBkZXZpY2UgdHJhbnNmZXIgc2V0dGluZ3Mgc2V0IGZvciB1cy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19saW51eF9kdl9pbnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCSBzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8sIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLAorCQkgdV9pbnQgcmVxdWVzdF9sZW5ndGgpCit7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIElOUVxuIik7CisJfQorI2VuZGlmCisJaWYgKHRhcmctPmlucV9kYXRhID09IE5VTEwpCisJCXRhcmctPmlucV9kYXRhID0gbWFsbG9jKEFIQ19MSU5VWF9EVl9JTlFfTEVOLAorCQkJCQlNX0RFVkJVRiwgTV9XQUlUT0spOworCWlmICh0YXJnLT5kdl9zdGF0ZSA+IEFIQ19EVl9TVEFURV9JTlFfQVNZTkMpIHsKKwkJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQorCQkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwkJdGFyZy0+ZHZfYnVmZmVyID0gbWFsbG9jKEFIQ19MSU5VWF9EVl9JTlFfTEVOLAorCQkJCQkgTV9ERVZCVUYsIE1fV0FJVE9LKTsKKwl9CisKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwljbWQtPmNtZF9sZW4gPSA2OworCWNtZC0+Y21uZFswXSA9IElOUVVJUlk7CisJY21kLT5jbW5kWzRdID0gcmVxdWVzdF9sZW5ndGg7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSByZXF1ZXN0X2xlbmd0aDsKKwlpZiAodGFyZy0+ZHZfc3RhdGUgPiBBSENfRFZfU1RBVEVfSU5RX0FTWU5DKQorCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyOworCWVsc2UKKwkJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IHRhcmctPmlucV9kYXRhOworCW1lbXNldChjbWQtPnJlcXVlc3RfYnVmZmVyLCAwLCBBSENfTElOVVhfRFZfSU5RX0xFTik7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfdHVyKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCXByaW50ZigiU2VuZGluZyBUVVJcbiIpOworCX0KKyNlbmRpZgorCS8qIERvIGEgVFVSIHRvIGNsZWFyIG91dCBhbnkgbm9uLWZhdGFsIHRyYW5zaXRpb25hbCBzdGF0ZSAqLworCWFoY19saW51eF9kdl9maWxsX2NtZChhaGMsIGNtZCwgZGV2aW5mbyk7CisJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9OT05FOworCWNtZC0+Y21kX2xlbiA9IDY7CisJY21kLT5jbW5kWzBdID0gVEVTVF9VTklUX1JFQURZOworfQorCisjZGVmaW5lIEFIQ19SRUJEX0xFTiA0CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfcmViZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywgc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpCit7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFJFQkRcbiIpOworCX0KKyNlbmRpZgorCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKKwkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwl0YXJnLT5kdl9idWZmZXIgPSBtYWxsb2MoQUhDX1JFQkRfTEVOLCBNX0RFVkJVRiwgTV9XQUlUT0spOworCWFoY19saW51eF9kdl9maWxsX2NtZChhaGMsIGNtZCwgZGV2aW5mbyk7CisJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9SRUFEOworCWNtZC0+Y21kX2xlbiA9IDEwOworCWNtZC0+Y21uZFswXSA9IFJFQURfQlVGRkVSOworCWNtZC0+Y21uZFsxXSA9IDB4MGI7CisJc2NzaV91bHRvM2IoQUhDX1JFQkRfTEVOLCAmY21kLT5jbW5kWzZdKTsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IEFIQ19SRUJEX0xFTjsKKwljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfd2ViKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQlwcmludGYoIlNlbmRpbmcgV0VCXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfV1JJVEU7CisJY21kLT5jbWRfbGVuID0gMTA7CisJY21kLT5jbW5kWzBdID0gV1JJVEVfQlVGRkVSOworCWNtZC0+Y21uZFsxXSA9IDB4MGE7CisJc2NzaV91bHRvM2IodGFyZy0+ZHZfZWNob19zaXplLCAmY21kLT5jbW5kWzZdKTsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHRhcmctPmR2X2VjaG9fc2l6ZTsKKwljbWQtPnVuZGVyZmxvdyA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSB0YXJnLT5kdl9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZHZfcmViKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsIGRldmluZm8pOworCQlwcmludGYoIlNlbmRpbmcgUkVCXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwljbWQtPmNtZF9sZW4gPSAxMDsKKwljbWQtPmNtbmRbMF0gPSBSRUFEX0JVRkZFUjsKKwljbWQtPmNtbmRbMV0gPSAweDBhOworCXNjc2lfdWx0bzNiKHRhcmctPmR2X2VjaG9fc2l6ZSwgJmNtZC0+Y21uZFs2XSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSB0YXJnLT5kdl9lY2hvX3NpemU7CisJY21kLT51bmRlcmZsb3cgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gdGFyZy0+ZHZfYnVmZmVyMTsKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9kdl9zdShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLAorCQlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZykKK3sKKwl1X2ludCBsZTsKKworCWxlID0gU0lEX0lTX1JFTU9WQUJMRSh0YXJnLT5pbnFfZGF0YSkgPyBTU1NfTE9FSiA6IDA7CisKKyNpZmRlZiBBSENfREVCVUcKKwlpZiAoYWhjX2RlYnVnICYgQUhDX1NIT1dfRFYpIHsKKwkJYWhjX3ByaW50X2RldmluZm8oYWhjLCBkZXZpbmZvKTsKKwkJcHJpbnRmKCJTZW5kaW5nIFNVXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbGludXhfZHZfZmlsbF9jbWQoYWhjLCBjbWQsIGRldmluZm8pOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfTk9ORTsKKwljbWQtPmNtZF9sZW4gPSA2OworCWNtZC0+Y21uZFswXSA9IFNUQVJUX1NUT1BfVU5JVDsKKwljbWQtPmNtbmRbNF0gPSBsZSB8IFNTU19TVEFSVDsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X2ZhbGxiYWNrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCXN0cnVjdAlhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqZ29hbDsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCXVfbG9uZwlzOworCXVfaW50CXdpZHRoOworCXVfaW50CXBlcmlvZDsKKwl1X2ludAlvZmZzZXQ7CisJdV9pbnQJcHByX29wdGlvbnM7CisJdV9pbnQJY3VyX3NwZWVkOworCXVfaW50CXdpZGVfc3BlZWQ7CisJdV9pbnQJbmFycm93X3NwZWVkOworCXVfaW50CWZhbGxiYWNrX3NwZWVkOworCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKSB7CisJCWFoY19wcmludF9kZXZpbmZvKGFoYywgZGV2aW5mbyk7CisJCXByaW50ZigiVHJ5aW5nIHRvIGZhbGxiYWNrXG4iKTsKKwl9CisjZW5kaWYKKwlhaGNfbG9jayhhaGMsICZzKTsKKwl0YXJnID0gYWhjLT5wbGF0Zm9ybV9kYXRhLT50YXJnZXRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGRldmluZm8tPmNoYW5uZWwsCisJCQkJICAgIGRldmluZm8tPm91cl9zY3NpaWQsCisJCQkJICAgIGRldmluZm8tPnRhcmdldCwgJnRzdGF0ZSk7CisJZ29hbCA9ICZ0aW5mby0+Z29hbDsKKwl3aWR0aCA9IGdvYWwtPndpZHRoOworCXBlcmlvZCA9IGdvYWwtPnBlcmlvZDsKKwlvZmZzZXQgPSBnb2FsLT5vZmZzZXQ7CisJcHByX29wdGlvbnMgPSBnb2FsLT5wcHJfb3B0aW9uczsKKwlpZiAob2Zmc2V0ID09IDApCisJCXBlcmlvZCA9IEFIQ19BU1lOQ19YRkVSX1BFUklPRDsKKwlpZiAodGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kID09IDApCisJCXRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9IE1BWChwZXJpb2QsIEFIQ19TWU5DUkFURV9VTFRSQTIpOworCWlmICh0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kID09IDApCisJCXRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QgPSBwZXJpb2Q7CisJaWYgKHRhcmctPmR2X21heF93aWR0aCA9PSAwKQorCQl0YXJnLT5kdl9tYXhfd2lkdGggPSB3aWR0aDsKKwlpZiAodGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zID09IDApCisJCXRhcmctPmR2X21heF9wcHJfb3B0aW9ucyA9IHBwcl9vcHRpb25zOworCWlmICh0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID09IDApCisJCXRhcmctPmR2X2xhc3RfcHByX29wdGlvbnMgPSBwcHJfb3B0aW9uczsKKworCWN1cl9zcGVlZCA9IGFpY19jYWxjX3NwZWVkKHdpZHRoLCBwZXJpb2QsIG9mZnNldCwgQUhDX1NZTkNSQVRFX01JTik7CisJd2lkZV9zcGVlZCA9IGFpY19jYWxjX3NwZWVkKE1TR19FWFRfV0RUUl9CVVNfMTZfQklULAorCQkJCQkgIHRhcmctPmR2X25leHRfd2lkZV9wZXJpb2QsCisJCQkJCSAgTUFYX09GRlNFVCwKKwkJCQkJICBBSENfU1lOQ1JBVEVfTUlOKTsKKwluYXJyb3dfc3BlZWQgPSBhaWNfY2FsY19zcGVlZChNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkJCQkgICAgdGFyZy0+ZHZfbmV4dF9uYXJyb3dfcGVyaW9kLAorCQkJCQkgICAgTUFYX09GRlNFVCwKKwkJCQkJICAgIEFIQ19TWU5DUkFURV9NSU4pOworCWZhbGxiYWNrX3NwZWVkID0gYWljX2NhbGNfc3BlZWQod2lkdGgsIHBlcmlvZCsxLCBvZmZzZXQsCisJCQkJCUFIQ19TWU5DUkFURV9NSU4pOworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlwcmludGYoImN1cl9zcGVlZD0gJWQsIHdpZGVfc3BlZWQ9ICVkLCBuYXJyb3dfc3BlZWQ9ICVkLCAiCisJCSAgICAgICAiZmFsbGJhY2tfc3BlZWQ9ICVkXG4iLCBjdXJfc3BlZWQsIHdpZGVfc3BlZWQsCisJCSAgICAgICBuYXJyb3dfc3BlZWQsIGZhbGxiYWNrX3NwZWVkKTsKKwl9CisjZW5kaWYKKworCWlmIChjdXJfc3BlZWQgPiAxNjAwMDApIHsKKwkJLyoKKwkJICogUGFjZWQvRFQvSVVfUkVRIG9ubHkgdHJhbnNmZXIgc3BlZWRzLiAgQWxsIHdlCisJCSAqIGNhbiBkbyBpcyBmYWxsYmFjayBpbiB0ZXJtcyBvZiBzeW5jcmF0ZS4KKwkJICovCisJCXBlcmlvZCsrOworCX0gZWxzZSBpZiAoY3VyX3NwZWVkID4gODAwMDApIHsKKwkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCQkJLyoKKwkJCSAqIFRyeSB3aXRob3V0IElVX1JFUSBhcyBpdCBtYXkgYmUgY29uZnVzaW5nCisJCQkgKiBhbiBleHBhbmRlci4KKwkJCSAqLworCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0lVX1JFUTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQYWNlZC9EVCBvbmx5IHRyYW5zZmVyIHNwZWVkcy4gIEFsbCB3ZQorCQkJICogY2FuIGRvIGlzIGZhbGxiYWNrIGluIHRlcm1zIG9mIHN5bmNyYXRlLgorCQkJICovCisJCQlwZXJpb2QrKzsKKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQl9CisJfSBlbHNlIGlmIChjdXJfc3BlZWQgPiAzMzAwKSB7CisKKwkJLyoKKwkJICogSW4gdGhpcyByYW5nZSB3ZSB0aGUgZm9sbG93aW5nCisJCSAqIG9wdGlvbnMgb3JkZXJlZCBmcm9tIGhpZ2hlc3QgdG8KKwkJICogbG93ZXN0IGRlc2lyZWFiaWxpdHk6CisJCSAqCisJCSAqIG8gV2lkZS9EVAorCQkgKiBvIFdpZGUvbm9uLURUCisJCSAqIG8gTmFycm93IGF0IGEgcG90ZW50YWxseSBoaWdoZXIgc3luYyByYXRlLgorCQkgKgorCQkgKiBBbGwgbW9kZXMgYXJlIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0IElVX1JFUQorCQkgKiBzZXQgc2luY2UgdXNpbmcgSVVzIG1heSBjb25mdXNlIGFuIGV4cGFuZGVyLgorCQkgKi8KKwkJaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0lVX1JFUSkgIT0gMCkgeworCisJCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfSVVfUkVROworCQl9IGVsc2UgaWYgKChwcHJfb3B0aW9ucyAmIE1TR19FWFRfUFBSX0RUX1JFUSkgIT0gMCkgeworCQkJLyoKKwkJCSAqIFRyeSBnb2luZyBub24tRFQuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zID0gdGFyZy0+ZHZfbWF4X3Bwcl9vcHRpb25zOworCQkJcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0RUX1JFUTsKKwkJfSBlbHNlIGlmICh0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zICE9IDApIHsKKwkJCS8qCisJCQkgKiBUcnkgd2l0aG91dCBRQVMgb3IgYW55IG90aGVyIFBQUiBvcHRpb25zLgorCQkJICogV2UgbWF5IG5lZWQgYSBub24tUFBSIG1lc3NhZ2UgdG8gd29yayB3aXRoCisJCQkgKiBhbiBleHBhbmRlci4gIFdlIGxvb2sgYXQgdGhlICJsYXN0IFBQUiBvcHRpb25zIgorCQkJICogc28gd2Ugd2lsbCBwZXJmb3JtIHRoaXMgZmFsbGJhY2sgZXZlbiBpZiB0aGUKKwkJCSAqIHRhcmdldCByZXNwb25kZWQgdG8gb3VyIFBQUiBuZWdvdGlhdGlvbiB3aXRoCisJCQkgKiBubyBvcHRpb24gYml0cyBzZXQuCisJCQkgKi8KKwkJCXBwcl9vcHRpb25zID0gMDsKKwkJfSBlbHNlIGlmICh3aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IG5hcnJvdyBzcGVlZCBpcyBncmVhdGVyIHRoYW4KKwkJCSAqIHRoZSBuZXh0IHdpZGUgc3BlZWQsIGZhbGxiYWNrIHRvIG5hcnJvdy4KKwkJCSAqIE90aGVyd2lzZSBmYWxsYmFjayB0byB0aGUgbmV4dCBEVC9XaWRlIHNldHRpbmcuCisJCQkgKiBUaGUgbmFycm93IGFzeW5jIHNwZWVkIHdpbGwgYWx3YXlzIGJlIHNtYWxsZXIKKwkJCSAqIHRoYW4gdGhlIHdpZGUgYXN5bmMgc3BlZWQsIHNvIGhhbmRsZSB0aGlzIGNhc2UKKwkJCSAqIHNwZWNpZmljYWxseS4KKwkJCSAqLworCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7CisJCQlpZiAobmFycm93X3NwZWVkID4gZmFsbGJhY2tfc3BlZWQKKwkJCSB8fCBwZXJpb2QgPj0gQUhDX0FTWU5DX1hGRVJfUEVSSU9EKSB7CisJCQkJdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9IHBlcmlvZCsxOworCQkJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwkJCQlwZXJpb2QgPSB0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2Q7CisJCQl9IGVsc2UgeworCQkJCXBlcmlvZCsrOworCQkJfQorCQl9IGVsc2UgaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDAKKwkJCSYmIHRhcmctPmR2X21heF93aWR0aCAhPSAwCisJCQkmJiB3aWRlX3NwZWVkID49IGZhbGxiYWNrX3NwZWVkCisJCQkmJiAodGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA8PSBBSENfQVNZTkNfWEZFUl9QRVJJT0QKKwkJCSB8fCBwZXJpb2QgPj0gQUhDX0FTWU5DX1hGRVJfUEVSSU9EKSkgeworCisJCQkvKgorCQkJICogV2UgYXJlIG5hcnJvdy4gIFRyeSBmYWxsaW5nIGJhY2sKKwkJCSAqIHRvIHRoZSBuZXh0IHdpZGUgc3BlZWQgd2l0aCAKKwkJCSAqIGFsbCBzdXBwb3J0ZWQgcHByIG9wdGlvbnMgc2V0LgorCQkJICovCisJCQl0YXJnLT5kdl9uZXh0X25hcnJvd19wZXJpb2QgPSBwZXJpb2QrMTsKKwkJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ7CisJCQlwZXJpb2QgPSB0YXJnLT5kdl9uZXh0X3dpZGVfcGVyaW9kOworCQkJcHByX29wdGlvbnMgPSB0YXJnLT5kdl9tYXhfcHByX29wdGlvbnM7CisJCX0gZWxzZSB7CisJCQkvKiBPbmx5IG5hcnJvdyBmYWxsYmFjayBpcyBhbGxvd2VkLiAqLworCQkJcGVyaW9kKys7CisJCQlwcHJfb3B0aW9ucyA9IHRhcmctPmR2X21heF9wcHJfb3B0aW9uczsKKwkJfQorCX0gZWxzZSB7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCXJldHVybiAoLTEpOworCX0KKwlvZmZzZXQgPSBNQVhfT0ZGU0VUOworCXN5bmNyYXRlID0gYWhjX2ZpbmRfc3luY3JhdGUoYWhjLCAmcGVyaW9kLCAmcHByX29wdGlvbnMsCisJCQkJICAgICBBSENfU1lOQ1JBVEVfRFQpOworCWFoY19zZXRfd2lkdGgoYWhjLCBkZXZpbmZvLCB3aWR0aCwgQUhDX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwlpZiAocGVyaW9kID09IDApIHsKKwkJcGVyaW9kID0gMDsKKwkJb2Zmc2V0ID0gMDsKKwkJcHByX29wdGlvbnMgPSAwOworCQlpZiAod2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVCkKKwkJCXRhcmctPmR2X25leHRfbmFycm93X3BlcmlvZCA9IEFIQ19BU1lOQ19YRkVSX1BFUklPRDsKKwkJZWxzZQorCQkJdGFyZy0+ZHZfbmV4dF93aWRlX3BlcmlvZCA9IEFIQ19BU1lOQ19YRkVSX1BFUklPRDsKKwl9CisJYWhjX3NldF9zeW5jcmF0ZShhaGMsIGRldmluZm8sIHN5bmNyYXRlLCBwZXJpb2QsIG9mZnNldCwKKwkJCSBwcHJfb3B0aW9ucywgQUhDX1RSQU5TX0dPQUwsIEZBTFNFKTsKKwl0YXJnLT5kdl9sYXN0X3Bwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CisJYWhjX3VubG9jayhhaGMsICZzKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJc2NiICpzY2I7CisJdV9sb25nCWZsYWdzOworCisJYWhjID0gKigoc3RydWN0IGFoY19zb2Z0YyAqKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpOworCWFoY19sb2NrKGFoYywgJmZsYWdzKTsKKworI2lmZGVmIEFIQ19ERUJVRworCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19EVikgeworCQlwcmludGYoIiVzOiBUaW1lb3V0IHdoaWxlIGRvaW5nIERWIGNvbW1hbmQgJXguXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5jbW5kWzBdKTsKKwkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCX0KKyNlbmRpZgorCQorCS8qCisJICogR3VhcmQgYWdhaW5zdCAiZG9uZSByYWNlIi4gIE5vIGFjdGlvbiBpcworCSAqIHJlcXVpcmVkIGlmIHdlIGp1c3QgY29tcGxldGVkLgorCSAqLworCWlmICgoc2NiID0gKHN0cnVjdCBzY2IgKiljbWQtPmhvc3Rfc2NyaWJibGUpID09IE5VTEwpIHsKKwkJYWhjX3VubG9jayhhaGMsICZmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIENvbW1hbmQgaGFzIG5vdCBjb21wbGV0ZWQuICBNYXJrIHRoaXMKKwkgKiBTQ0IgYXMgaGF2aW5nIGZhaWxpbmcgc3RhdHVzIHByaW9yIHRvCisJICogcmVzZXR0aW5nIHRoZSBidXMsIHNvIHdlIGdldCB0aGUgY29ycmVjdAorCSAqIGVycm9yIGNvZGUuCisJICovCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAhPSAwKQorCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9BVVRPU0VOU0VfRkFJTCk7CisJZWxzZQorCQlhaGNfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IsIENBTV9DTURfVElNRU9VVCk7CisJYWhjX3Jlc2V0X2NoYW5uZWwoYWhjLCBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywgLyppbml0aWF0ZSovVFJVRSk7CisKKwkvKgorCSAqIEFkZCBhIG1pbmltYWwgYnVzIHNldHRsZSBkZWxheSBmb3IgZGV2aWNlcyB0aGF0IGFyZSBzbG93IHRvCisJICogcmVzcG9uZCBhZnRlciBidXMgcmVzZXRzLgorCSAqLworCWFoY19saW51eF9mcmVlemVfc2ltcShhaGMpOworCWluaXRfdGltZXIoJmFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIpOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZGF0YSA9ICh1X2xvbmcpYWhjOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+cmVzZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDI7CisJYWhjLT5wbGF0Zm9ybV9kYXRhLT5yZXNldF90aW1lci5mdW5jdGlvbiA9CisJICAgIChhaGNfbGludXhfY2FsbGJhY2tfdCAqKWFoY19saW51eF9yZWxlYXNlX3NpbXE7CisJYWRkX3RpbWVyKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnJlc2V0X3RpbWVyKTsKKwlpZiAoYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGMpICE9IE5VTEwpCisJCWFoY19zY2hlZHVsZV9ydW5xKGFoYyk7CisJYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOworCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2R2X2NvbXBsZXRlKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisKKwlhaGMgPSAqKChzdHJ1Y3QgYWhjX3NvZnRjICoqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSk7CisKKwkvKiBEZWxldGUgdGhlIERWIHRpbWVyIGJlZm9yZSBpdCBnb2VzIG9mZiEgKi8KKwlzY3NpX2RlbGV0ZV90aW1lcihjbWQpOworCisjaWZkZWYgQUhDX0RFQlVHCisJaWYgKGFoY19kZWJ1ZyAmIEFIQ19TSE9XX0RWKQorCQlwcmludGYoIiVzOiVkOiVkOiBDb21tYW5kIGNvbXBsZXRlZCwgc3RhdHVzPSAweCV4XG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+cmVzdWx0KTsKKyNlbmRpZgorCisJLyogV2FrZSB1cCB0aGUgc3RhdGUgbWFjaGluZSAqLworCXVwKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X2NtZF9zZW0pOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2dlbmVyYXRlX2R2X3BhdHRlcm4oc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcpCit7CisJdWludDE2X3QgYjsKKwl1X2ludAkgaTsKKwl1X2ludAkgajsKKworCWlmICh0YXJnLT5kdl9idWZmZXIgIT0gTlVMTCkKKwkJZnJlZSh0YXJnLT5kdl9idWZmZXIsIE1fREVWQlVGKTsKKwl0YXJnLT5kdl9idWZmZXIgPSBtYWxsb2ModGFyZy0+ZHZfZWNob19zaXplLCBNX0RFVkJVRiwgTV9XQUlUT0spOworCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCXRhcmctPmR2X2J1ZmZlcjEgPSBtYWxsb2ModGFyZy0+ZHZfZWNob19zaXplLCBNX0RFVkJVRiwgTV9XQUlUT0spOworCisJaSA9IDA7CisJYiA9IDB4MDAwMTsKKwlmb3IgKGogPSAwIDsgaSA8IHRhcmctPmR2X2VjaG9fc2l6ZTsgaisrKSB7CisJCWlmIChqIDwgMzIpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHNlcXVlbnRpYWwgbnVtYmVycy4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSBqICYgMHhmZjsKKwkJfSBlbHNlIGlmIChqIDwgNDgpIHsKKwkJCS8qCisJCQkgKiAzMmJ5dGVzIG9mIHJlcGVhdGluZyAweDAwMDAsIDB4ZmZmZi4KKwkJCSAqLworCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAoaiAmIDB4MDIpID8gMHhmZiA6IDB4MDA7CisJCX0gZWxzZSBpZiAoaiA8IDY0KSB7CisJCQkvKgorCQkJICogMzJieXRlcyBvZiByZXBlYXRpbmcgMHg1NTU1LCAweGFhYWEuCisJCQkgKi8KKwkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gKGogJiAweDAyKSA/IDB4YWEgOiAweDU1OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlbWFpbmluZyBidWZmZXIgaXMgZmlsbGVkIHdpdGggYSByZXBlYXRpbmcKKwkJCSAqIHBhdHRlciBvZjoKKwkJCSAqCisJCQkgKgkgMHhmZmZmCisJCQkgKgl+MHgwMDAxIDw8IHNoaWZ0ZWQgb25jZSBpbiBlYWNoIGxvb3AuCisJCQkgKi8KKwkJCWlmIChqICYgMHgwMikgeworCQkJCWlmIChqICYgMHgwMSkgeworCQkJCQl0YXJnLT5kdl9idWZmZXJbaSsrXSA9IH4oYiA+PiA4KSAmIDB4ZmY7CisJCQkJCWIgPDw9IDE7CisJCQkJCWlmIChiID09IDB4MDAwMCkKKwkJCQkJCWIgPSAweDAwMDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGFyZy0+ZHZfYnVmZmVyW2krK10gPSAofmIgJiAweGZmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRhcmctPmR2X2J1ZmZlcltpKytdID0gMHhmZjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHVfaW50CithaGNfbGludXhfdXNlcl90YWdkZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbykKK3sKKwlzdGF0aWMgaW50IHdhcm5lZF91c2VyOworCXVfaW50IHRhZ3M7CisKKwl0YWdzID0gMDsKKwlpZiAoKGFoYy0+dXNlcl9kaXNjZW5hYmxlICYgZGV2aW5mby0+dGFyZ2V0X21hc2spICE9IDApIHsKKwkJaWYgKGFoYy0+dW5pdCA+PSBOVU1fRUxFTUVOVFMoYWljN3h4eF90YWdfaW5mbykpIHsKKwkJCWlmICh3YXJuZWRfdXNlciA9PSAwKSB7CisKKwkJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljN3h4eDogV0FSTklORzogSW5zdWZmaWNpZW50IHRhZ19pbmZvIGluc3RhbmNlc1xuIgorImFpYzd4eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljN3h4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljN3h4eF90YWdfaW5mbyBhcnJheSBpblxuIgorImFpYzd4eHg6IHRoZSBhaWM3eHh4X29zbS4uYyBzb3VyY2UgZmlsZS5cbiIpOworCQkJCXdhcm5lZF91c2VyKys7CisJCQl9CisJCQl0YWdzID0gQUhDX01BWF9RVUVVRTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXJfdGFnX2luZm9fdCAqdGFnX2luZm87CisKKwkJCXRhZ19pbmZvID0gJmFpYzd4eHhfdGFnX2luZm9bYWhjLT51bml0XTsKKwkJCXRhZ3MgPSB0YWdfaW5mby0+dGFnX2NvbW1hbmRzW2RldmluZm8tPnRhcmdldF9vZmZzZXRdOworCQkJaWYgKHRhZ3MgPiBBSENfTUFYX1FVRVVFKQorCQkJCXRhZ3MgPSBBSENfTUFYX1FVRVVFOworCQl9CisJfQorCXJldHVybiAodGFncyk7Cit9CisKK3N0YXRpYyB1X2ludAorYWhjX2xpbnV4X3VzZXJfZHZfc2V0dGluZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RhdGljIGludCB3YXJuZWRfdXNlcjsKKwlpbnQgZHY7CisKKwlpZiAoYWhjLT51bml0ID49IE5VTV9FTEVNRU5UUyhhaWM3eHh4X2R2X3NldHRpbmdzKSkgeworCQlpZiAod2FybmVkX3VzZXIgPT0gMCkgeworCisJCQlwcmludGYoS0VSTl9XQVJOSU5HCisiYWljN3h4eDogV0FSTklORzogSW5zdWZmaWNpZW50IGR2IHNldHRpbmdzIGluc3RhbmNlc1xuIgorImFpYzd4eHg6IGZvciBpbnN0YWxsZWQgY29udHJvbGxlcnMuIFVzaW5nIGRlZmF1bHRzXG4iCisiYWljN3h4eDogUGxlYXNlIHVwZGF0ZSB0aGUgYWljN3h4eF9kdl9zZXR0aW5ncyBhcnJheVxuIgorImFpYzd4eHg6IGluIHRoZSBhaWM3eHh4X29zbS5jIHNvdXJjZSBmaWxlLlxuIik7CisJCQl3YXJuZWRfdXNlcisrOworCQl9CisJCWR2ID0gLTE7CisJfSBlbHNlIHsKKworCQlkdiA9IGFpYzd4eHhfZHZfc2V0dGluZ3NbYWhjLT51bml0XTsKKwl9CisKKwlpZiAoZHYgPCAwKSB7CisJCXVfbG9uZyBzOworCisJCS8qCisJCSAqIEFwcGx5IHRoZSBkZWZhdWx0LgorCQkgKi8KKwkJLyoKKwkJICogWFhYIC0gRW5hYmxlIERWIG9uIG5vbi1VMTYwIGNvbnRyb2xsZXJzIG9uY2UgaXQKKwkJICogICAgICAgaGFzIGJlZW4gdGVzdGVkIHRoZXJlLgorCQkgKi8KKwkJYWhjX2xvY2soYWhjLCAmcyk7CisJCWR2ID0gKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpOworCQlpZiAoYWhjLT5zZWVwX2NvbmZpZyAhPSAwCisJCSAmJiBhaGMtPnNlZXBfY29uZmlnLT5zaWduYXR1cmUgPj0gQ0ZTSUdOQVRVUkUyKQorCQkJZHYgPSAoYWhjLT5zZWVwX2NvbmZpZy0+YWRhcHRlcl9jb250cm9sICYgQ0ZFTkFCTEVEVik7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJfQorCXJldHVybiAoZHYpOworfQorCisvKgorICogRGV0ZXJtaW5lcyB0aGUgcXVldWUgZGVwdGggZm9yIGEgZ2l2ZW4gZGV2aWNlLgorICovCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2RldmljZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CWFoY19kZXZpbmZvIGRldmluZm87CisJdV9pbnQJdGFnczsKKworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sCisJCQkgICAgZGV2LT50YXJnZXQtPmNoYW5uZWwgPT0gMAorCQkJICA/IGFoYy0+b3VyX2lkIDogYWhjLT5vdXJfaWRfYiwKKwkJCSAgICBkZXYtPnRhcmdldC0+dGFyZ2V0LCBkZXYtPmx1biwKKwkJCSAgICBkZXYtPnRhcmdldC0+Y2hhbm5lbCA9PSAwID8gJ0EnIDogJ0InLAorCQkJICAgIFJPTEVfSU5JVElBVE9SKTsKKwl0YWdzID0gYWhjX2xpbnV4X3VzZXJfdGFnZGVwdGgoYWhjLCAmZGV2aW5mbyk7CisJaWYgKHRhZ3MgIT0gMAorCSAmJiBkZXYtPnNjc2lfZGV2aWNlICE9IE5VTEwKKwkgJiYgZGV2LT5zY3NpX2RldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCAhPSAwKSB7CisKKwkJYWhjX3NldF90YWdzKGFoYywgJmRldmluZm8sIEFIQ19RVUVVRV9UQUdHRUQpOworCQlhaGNfcHJpbnRfZGV2aW5mbyhhaGMsICZkZXZpbmZvKTsKKwkJcHJpbnRmKCJUYWdnZWQgUXVldWluZyBlbmFibGVkLiAgRGVwdGggJWRcbiIsIHRhZ3MpOworCX0gZWxzZSB7CisJCWFoY19zZXRfdGFncyhhaGMsICZkZXZpbmZvLCBBSENfUVVFVUVfTk9ORSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KQoreworCXN0cnVjdAkgYWhjX2NtZCAqYWNtZDsKKwlzdHJ1Y3QJIHNjc2lfY21uZCAqY21kOworCXN0cnVjdAkgc2NiICpzY2I7CisJc3RydWN0CSBoYXJkd2FyZV9zY2IgKmhzY2I7CisJc3RydWN0CSBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJIGFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwl1aW50MTZfdCBtYXNrOworCisJaWYgKChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgIT0gMCkKKwkJcGFuaWMoInJ1bm5pbmcgZGV2aWNlIG9uIHJ1biBsaXN0Iik7CisKKwl3aGlsZSAoKGFjbWQgPSBUQUlMUV9GSVJTVCgmZGV2LT5idXN5cSkpICE9IE5VTEwKKwkgICAgJiYgZGV2LT5vcGVuaW5ncyA+IDAgJiYgZGV2LT5xZnJvemVuID09IDApIHsKKworCQkvKgorCQkgKiBTY2hlZHVsZSB1cyB0byBydW4gbGF0ZXIuICBUaGUgb25seSByZWFzb24gd2UgYXJlIG5vdAorCQkgKiBydW5uaW5nIGlzIGJlY2F1c2UgdGhlIHdob2xlIGNvbnRyb2xsZXIgUSBpcyBmcm96ZW4uCisJCSAqLworCQlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuICE9IDAKKwkgCSAmJiBBSENfRFZfU0lNUV9GUk9aRU4oYWhjKSA9PSAwKSB7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5kZXZpY2VfcnVucSwKKwkJCQkJICBkZXYsIGxpbmtzKTsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBHZXQgYW4gc2NiIHRvIHVzZS4KKwkJICovCisJCWlmICgoc2NiID0gYWhjX2dldF9zY2IoYWhjKSkgPT0gTlVMTCkgeworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsCisJCQkJCSBkZXYsIGxpbmtzKTsKKwkJCWRldi0+ZmxhZ3MgfD0gQUhDX0RFVl9PTl9SVU5fTElTVDsKKwkJCWFoYy0+ZmxhZ3MgfD0gQUhDX1JFU09VUkNFX1NIT1JUQUdFOworCQkJcmV0dXJuOworCQl9CisJCVRBSUxRX1JFTU9WRSgmZGV2LT5idXN5cSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQljbWQgPSAmYWNtZF9zY3NpX2NtZChhY21kKTsKKwkJc2NiLT5pb19jdHggPSBjbWQ7CisJCXNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2ID0gZGV2OworCQloc2NiID0gc2NiLT5oc2NiOworCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKXNjYjsKKworCQkvKgorCQkgKiBGaWxsIG91dCBiYXNpY3Mgb2YgdGhlIEhTQ0IuCisJCSAqLworCQloc2NiLT5jb250cm9sID0gMDsKKwkJaHNjYi0+c2NzaWlkID0gQlVJTERfU0NTSUlEKGFoYywgY21kKTsKKwkJaHNjYi0+bHVuID0gY21kLT5kZXZpY2UtPmx1bjsKKwkJbWFzayA9IFNDQl9HRVRfVEFSR0VUX01BU0soYWhjLCBzY2IpOworCQl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBTQ0JfR0VUX0NIQU5ORUwoYWhjLCBzY2IpLAorCQkJCQkgICAgU0NCX0dFVF9PVVJfSUQoc2NiKSwKKwkJCQkJICAgIFNDQl9HRVRfVEFSR0VUKGFoYywgc2NiKSwgJnRzdGF0ZSk7CisJCWhzY2ItPnNjc2lyYXRlID0gdGluZm8tPnNjc2lyYXRlOworCQloc2NiLT5zY3Npb2Zmc2V0ID0gdGluZm8tPmN1cnIub2Zmc2V0OworCQlpZiAoKHRzdGF0ZS0+dWx0cmFlbmIgJiBtYXNrKSAhPSAwKQorCQkJaHNjYi0+Y29udHJvbCB8PSBVTFRSQUVOQjsKKworCQlpZiAoKGFoYy0+dXNlcl9kaXNjZW5hYmxlICYgbWFzaykgIT0gMCkKKwkJCWhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKworCSAJaWYgKEFIQ19EVl9DTUQoY21kKSAhPSAwKQorCQkJc2NiLT5mbGFncyB8PSBTQ0JfU0lMRU5UOworCisJCWlmICgodHN0YXRlLT5hdXRvX25lZ290aWF0ZSAmIG1hc2spICE9IDApIHsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX0FVVE9fTkVHT1RJQVRFOworCQkJc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisJCX0KKworCQlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX1RBR0dFRHxBSENfREVWX1FfQkFTSUMpKSAhPSAwKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJaW50CW1zZ19ieXRlczsKKwkJCXVpbnQ4X3QgdGFnX21zZ3NbMl07CisKKwkJCW1zZ19ieXRlcyA9IHNjc2lfcG9wdWxhdGVfdGFnX21zZyhjbWQsIHRhZ19tc2dzKTsKKwkJCWlmIChtc2dfYnl0ZXMgJiYgdGFnX21zZ3NbMF0gIT0gTVNHX1NJTVBMRV9UQVNLKSB7CisJCQkJaHNjYi0+Y29udHJvbCB8PSB0YWdfbXNnc1swXTsKKwkJCQlpZiAodGFnX21zZ3NbMF0gPT0gTVNHX09SREVSRURfVEFTSykKKwkJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9PSBBSENfT1RBR19USFJFU0gKKwkJCSAmJiAoZGV2LT5mbGFncyAmIEFIQ19ERVZfUV9UQUdHRUQpICE9IDApIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19PUkRFUkVEX1RBU0s7CisJCQkJZGV2LT5jb21tYW5kc19zaW5jZV9pZGxlX29yX290YWcgPSAwOworCQkJfSBlbHNlIHsKKwkJCQloc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfVEFTSzsKKwkJCX0KKwkJfQorCisJCWhzY2ItPmNkYl9sZW4gPSBjbWQtPmNtZF9sZW47CisJCWlmIChoc2NiLT5jZGJfbGVuIDw9IDEyKSB7CisJCQltZW1jcHkoaHNjYi0+c2hhcmVkX2RhdGEuY2RiLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGhzY2ItPmNkYjMyLCBjbWQtPmNtbmQsIGhzY2ItPmNkYl9sZW4pOworCQkJc2NiLT5mbGFncyB8PSBTQ0JfQ0RCMzJfUFRSOworCQl9CisKKwkJc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbiA9IDA7CisJCWFoY19zZXRfcmVzaWR1YWwoc2NiLCAwKTsKKwkJYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzY2IsIDApOworCQlzY2ItPnNnX2NvdW50ID0gMDsKKwkJaWYgKGNtZC0+dXNlX3NnICE9IDApIHsKKwkJCXN0cnVjdAlhaGNfZG1hX3NlZyAqc2c7CisJCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmN1cl9zZWc7CisJCQlzdHJ1Y3QJc2NhdHRlcmxpc3QgKmVuZF9zZWc7CisJCQlpbnQJbnNlZzsKKworCQkJY3VyX3NlZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJbnNlZyA9IHBjaV9tYXBfc2coYWhjLT5kZXZfc29mdGMsIGN1cl9zZWcsIGNtZC0+dXNlX3NnLAorCQkJICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQkJZW5kX3NlZyA9IGN1cl9zZWcgKyBuc2VnOworCQkJLyogQ29weSB0aGUgc2VnbWVudHMgaW50byB0aGUgU0cgbGlzdC4gKi8KKwkJCXNnID0gc2NiLT5zZ19saXN0OworCQkJLyoKKwkJCSAqIFRoZSBzZ19jb3VudCBtYXkgYmUgbGFyZ2VyIHRoYW4gbnNlZyBpZgorCQkJICogYSB0cmFuc2ZlciBjcm9zc2VzIGEgMzJiaXQgcGFnZS4KKwkJCSAqLyAKKwkJCXdoaWxlIChjdXJfc2VnIDwgZW5kX3NlZykgeworCQkJCWRtYV9hZGRyX3QgYWRkcjsKKwkJCQlidXNfc2l6ZV90IGxlbjsKKwkJCQlpbnQgY29uc3VtZWQ7CisKKwkJCQlhZGRyID0gc2dfZG1hX2FkZHJlc3MoY3VyX3NlZyk7CisJCQkJbGVuID0gc2dfZG1hX2xlbihjdXJfc2VnKTsKKwkJCQljb25zdW1lZCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAorCQkJCQkJCSAgICAgc2csIGFkZHIsIGxlbik7CisJCQkJc2cgKz0gY29uc3VtZWQ7CisJCQkJc2NiLT5zZ19jb3VudCArPSBjb25zdW1lZDsKKwkJCQljdXJfc2VnKys7CisJCQl9CisJCQlzZy0tOworCQkJc2ctPmxlbiB8PSBhaGNfaHRvbGUzMihBSENfRE1BX0xBU1RfU0VHKTsKKworCQkJLyoKKwkJCSAqIFJlc2V0IHRoZSBzZyBsaXN0IHBvaW50ZXIuCisJCQkgKi8KKwkJCXNjYi0+aHNjYi0+c2dwdHIgPQorCQkJICAgIGFoY19odG9sZTMyKHNjYi0+c2dfbGlzdF9waHlzIHwgU0dfRlVMTF9SRVNJRCk7CisKKwkJCS8qCisJCQkgKiBDb3B5IHRoZSBmaXJzdCBTRyBpbnRvIHRoZSAiY3VycmVudCIKKwkJCSAqIGRhdGEgcG9pbnRlciBhcmVhLgorCQkJICovCisJCQlzY2ItPmhzY2ItPmRhdGFwdHIgPSBzY2ItPnNnX2xpc3QtPmFkZHI7CisJCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSBzY2ItPnNnX2xpc3QtPmxlbjsKKwkJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKSB7CisJCQlzdHJ1Y3QJIGFoY19kbWFfc2VnICpzZzsKKwkJCWRtYV9hZGRyX3QgYWRkcjsKKworCQkJc2cgPSBzY2ItPnNnX2xpc3Q7CisJCQlhZGRyID0gcGNpX21hcF9zaW5nbGUoYWhjLT5kZXZfc29mdGMsCisJCQkgICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCSAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCXNjYi0+cGxhdGZvcm1fZGF0YS0+YnVmX2J1c2FkZHIgPSBhZGRyOworCQkJc2NiLT5zZ19jb3VudCA9IGFoY19saW51eF9tYXBfc2VnKGFoYywgc2NiLAorCQkJCQkJCSAgc2csIGFkZHIsCisJCQkJCQkJICBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQlzZy0+bGVuIHw9IGFoY19odG9sZTMyKEFIQ19ETUFfTEFTVF9TRUcpOworCisJCQkvKgorCQkJICogUmVzZXQgdGhlIHNnIGxpc3QgcG9pbnRlci4KKwkJCSAqLworCQkJc2NiLT5oc2NiLT5zZ3B0ciA9CisJCQkgICAgYWhjX2h0b2xlMzIoc2NiLT5zZ19saXN0X3BoeXMgfCBTR19GVUxMX1JFU0lEKTsKKworCQkJLyoKKwkJCSAqIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlICJjdXJyZW50IgorCQkJICogZGF0YSBwb2ludGVyIGFyZWEuCisJCQkgKi8KKwkJCXNjYi0+aHNjYi0+ZGF0YXB0ciA9IHNnLT5hZGRyOworCQkJc2NiLT5oc2NiLT5kYXRhY250ID0gc2ctPmxlbjsKKwkJfSBlbHNlIHsKKwkJCXNjYi0+aHNjYi0+c2dwdHIgPSBhaGNfaHRvbGUzMihTR19MSVNUX05VTEwpOworCQkJc2NiLT5oc2NiLT5kYXRhcHRyID0gMDsKKwkJCXNjYi0+aHNjYi0+ZGF0YWNudCA9IDA7CisJCQlzY2ItPnNnX2NvdW50ID0gMDsKKwkJfQorCisJCWFoY19zeW5jX3NnbGlzdChhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFV1JJVEUpOworCQlMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnBlbmRpbmdfc2Nicywgc2NiLCBwZW5kaW5nX2xpbmtzKTsKKwkJZGV2LT5vcGVuaW5ncy0tOworCQlkZXYtPmFjdGl2ZSsrOworCQlkZXYtPmNvbW1hbmRzX2lzc3VlZCsrOworCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX1BFUklPRElDX09UQUcpICE9IDApCisJCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZysrOworCisJCS8qCisJCSAqIFdlIG9ubHkgYWxsb3cgb25lIHVudGFnZ2VkIHRyYW5zYWN0aW9uCisJCSAqIHBlciB0YXJnZXQgaW4gdGhlIGluaXRpYXRvciByb2xlIHVubGVzcworCQkgKiB3ZSBhcmUgc3RvcmluZyBhIGZ1bGwgYnVzeSB0YXJnZXQgKmx1bioKKwkJICogdGFibGUgaW4gU0NCIHNwYWNlLgorCQkgKi8KKwkJaWYgKChzY2ItPmhzY2ItPmNvbnRyb2wgJiAoVEFSR0VUX1NDQnxUQUdfRU5CKSkgPT0gMAorCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfU0NCX0JUVCkgPT0gMCkgeworCQkJc3RydWN0IHNjYl90YWlscSAqdW50YWdnZWRfcTsKKwkJCWludCB0YXJnZXRfb2Zmc2V0OworCisJCQl0YXJnZXRfb2Zmc2V0ID0gU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKTsKKwkJCXVudGFnZ2VkX3EgPSAmKGFoYy0+dW50YWdnZWRfcXVldWVzW3RhcmdldF9vZmZzZXRdKTsKKwkJCVRBSUxRX0lOU0VSVF9UQUlMKHVudGFnZ2VkX3EsIHNjYiwgbGlua3MudHFlKTsKKwkJCXNjYi0+ZmxhZ3MgfD0gU0NCX1VOVEFHR0VEUTsKKwkJCWlmIChUQUlMUV9GSVJTVCh1bnRhZ2dlZF9xKSAhPSBzY2IpCisJCQkJY29udGludWU7CisJCX0KKwkJc2NiLT5mbGFncyB8PSBTQ0JfQUNUSVZFOworCQlhaGNfcXVldWVfc2NiKGFoYywgc2NiKTsKKwl9Cit9CisKKy8qCisgKiBTQ1NJIGNvbnRyb2xsZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK2lycXJldHVybl90CithaGNfbGludXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcJZmxhZ3M7CisJaW50CW91cnM7CisKKwlhaGMgPSAoc3RydWN0IGFoY19zb2Z0YyAqKSBkZXZfaWQ7CisJYWhjX2xvY2soYWhjLCAmZmxhZ3MpOyAKKwlvdXJzID0gYWhjX2ludHIoYWhjKTsKKwlpZiAoYWhjX2xpbnV4X25leHRfZGV2aWNlX3RvX3J1bihhaGMpICE9IE5VTEwpCisJCWFoY19zY2hlZHVsZV9ydW5xKGFoYyk7CisJYWhjX2xpbnV4X3J1bl9jb21wbGV0ZV9xdWV1ZShhaGMpOworCWFoY191bmxvY2soYWhjLCAmZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOworfQorCit2b2lkCithaGNfcGxhdGZvcm1fZmx1c2h3b3JrKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCXdoaWxlIChhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYykgIT0gTlVMTCkKKwkJOworfQorCitzdGF0aWMgc3RydWN0IGFoY19saW51eF90YXJnZXQqCithaGNfbGludXhfYWxsb2NfdGFyZ2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgY2hhbm5lbCwgdV9pbnQgdGFyZ2V0KQoreworCXN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCXVfaW50IHRhcmdldF9vZmZzZXQ7CisKKwl0YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0OworCWlmIChjaGFubmVsICE9IDApCisJCXRhcmdldF9vZmZzZXQgKz0gODsKKworCXRhcmcgPSBtYWxsb2Moc2l6ZW9mKCp0YXJnKSwgTV9ERVZCVUcsIE1fTk9XQUlUKTsKKwlpZiAodGFyZyA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCW1lbXNldCh0YXJnLCAwLCBzaXplb2YoKnRhcmcpKTsKKwl0YXJnLT5jaGFubmVsID0gY2hhbm5lbDsKKwl0YXJnLT50YXJnZXQgPSB0YXJnZXQ7CisJdGFyZy0+YWhjID0gYWhjOworCXRhcmctPmZsYWdzID0gQUhDX0RWX1JFUVVJUkVEOworCWFoYy0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XSA9IHRhcmc7CisJcmV0dXJuICh0YXJnKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9mcmVlX3RhcmdldChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnKQoreworCXN0cnVjdCBhaGNfZGV2aW5mbyBkZXZpbmZvOworCXN0cnVjdCBhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QgYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXVfaW50IG91cl9pZDsKKwl1X2ludCB0YXJnZXRfb2Zmc2V0OworCWNoYXIgY2hhbm5lbDsKKworCS8qCisJICogRm9yY2UgYSBuZWdvdGlhdGlvbiB0byBhc3luYy9uYXJyb3cgb24gYW55CisJICogZnV0dXJlIGNvbW1hbmQgdG8gdGhpcyBkZXZpY2UgdW5sZXNzIGEgYnVzCisJICogcmVzZXQgb2NjdXJzIGJldHdlZW4gbm93IGFuZCB0aGF0IGNvbW1hbmQuCisJICovCisJY2hhbm5lbCA9ICdBJyArIHRhcmctPmNoYW5uZWw7CisJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJdGFyZ2V0X29mZnNldCA9IHRhcmctPnRhcmdldDsKKwlpZiAodGFyZy0+Y2hhbm5lbCAhPSAwKSB7CisJCXRhcmdldF9vZmZzZXQgKz0gODsKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWRfYjsKKwl9CisJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywgY2hhbm5lbCwgb3VyX2lkLAorCQkJCSAgICB0YXJnLT50YXJnZXQsICZ0c3RhdGUpOworCWFoY19jb21waWxlX2RldmluZm8oJmRldmluZm8sIG91cl9pZCwgdGFyZy0+dGFyZ2V0LCBDQU1fTFVOX1dJTERDQVJELAorCQkJICAgIGNoYW5uZWwsIFJPTEVfSU5JVElBVE9SKTsKKwlhaGNfc2V0X3N5bmNyYXRlKGFoYywgJmRldmluZm8sIE5VTEwsIDAsIDAsIDAsCisJCQkgQUhDX1RSQU5TX0dPQUwsIC8qcGF1c2VkKi9GQUxTRSk7CisJYWhjX3NldF93aWR0aChhaGMsICZkZXZpbmZvLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorCQkgICAgICBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGNfdXBkYXRlX25lZ19yZXF1ZXN0KGFoYywgJmRldmluZm8sIHRzdGF0ZSwgdGluZm8sIEFIQ19ORUdfQUxXQVlTKTsKKwlhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF0gPSBOVUxMOworCWlmICh0YXJnLT5pbnFfZGF0YSAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmlucV9kYXRhLCBNX0RFVkJVRik7CisJaWYgKHRhcmctPmR2X2J1ZmZlciAhPSBOVUxMKQorCQlmcmVlKHRhcmctPmR2X2J1ZmZlciwgTV9ERVZCVUYpOworCWlmICh0YXJnLT5kdl9idWZmZXIxICE9IE5VTEwpCisJCWZyZWUodGFyZy0+ZHZfYnVmZmVyMSwgTV9ERVZCVUYpOworCWZyZWUodGFyZywgTV9ERVZCVUYpOworfQorCitzdGF0aWMgc3RydWN0IGFoY19saW51eF9kZXZpY2UqCithaGNfbGludXhfYWxsb2NfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJIHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnLCB1X2ludCBsdW4pCit7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKworCWRldiA9IG1hbGxvYyhzaXplb2YoKmRldiksIE1fREVWQlVHLCBNX05PV0FJVCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJVEFJTFFfSU5JVCgmZGV2LT5idXN5cSk7CisJZGV2LT5mbGFncyA9IEFIQ19ERVZfVU5DT05GSUdVUkVEOworCWRldi0+bHVuID0gbHVuOworCWRldi0+dGFyZ2V0ID0gdGFyZzsKKworCS8qCisJICogV2Ugc3RhcnQgb3V0IGxpZmUgdXNpbmcgdW50YWdnZWQKKwkgKiB0cmFuc2FjdGlvbnMgb2Ygd2hpY2ggd2UgYWxsb3cgb25lLgorCSAqLworCWRldi0+b3BlbmluZ3MgPSAxOworCisJLyoKKwkgKiBTZXQgbWF4dGFncyB0byAwLiAgVGhpcyB3aWxsIGJlIGNoYW5nZWQgaWYgd2UKKwkgKiBsYXRlciBkZXRlcm1pbmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoCisJICogYSB0YWdnZWQgcXVldWluZyBjYXBhYmxlIGRldmljZS4KKwkgKi8KKwlkZXYtPm1heHRhZ3MgPSAwOworCQorCXRhcmctPnJlZmNvdW50Kys7CisJdGFyZy0+ZGV2aWNlc1tsdW5dID0gZGV2OworCXJldHVybiAoZGV2KTsKK30KKworc3RhdGljIHZvaWQKK19fYWhjX2xpbnV4X2ZyZWVfZGV2aWNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKworCXRhcmcgPSBkZXYtPnRhcmdldDsKKwl0YXJnLT5kZXZpY2VzW2Rldi0+bHVuXSA9IE5VTEw7CisJZnJlZShkZXYsIE1fREVWQlVGKTsKKwl0YXJnLT5yZWZjb3VudC0tOworCWlmICh0YXJnLT5yZWZjb3VudCA9PSAwCisJICYmICh0YXJnLT5mbGFncyAmIEFIQ19EVl9SRVFVSVJFRCkgPT0gMCkKKwkJYWhjX2xpbnV4X2ZyZWVfdGFyZ2V0KGFoYywgdGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZnJlZV9kZXZpY2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KQoreworCWRlbF90aW1lcl9zeW5jKCZkZXYtPnRpbWVyKTsKKwlfX2FoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7Cit9CisKK3ZvaWQKK2FoY19zZW5kX2FzeW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgY2hhciBjaGFubmVsLAorCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBBQ19UUkFOU0ZFUl9ORUc6CisJeworCQljaGFyCWJ1Zls4MF07CisJCXN0cnVjdAlhaGNfbGludXhfdGFyZ2V0ICp0YXJnOworCQlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwkJc3RydWN0CWFoY19pbml0aWF0b3JfdGluZm8gKnRpbmZvOworCQlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCQlpbnQJdGFyZ2V0X29mZnNldDsKKworCQlpbmZvLmJ1ZmZlciA9IGJ1ZjsKKwkJaW5mby5sZW5ndGggPSBzaXplb2YoYnVmKTsKKwkJaW5mby5vZmZzZXQgPSAwOworCQlpbmZvLnBvcyA9IDA7CisJCXRpbmZvID0gYWhjX2ZldGNoX3RyYW5zaW5mbyhhaGMsIGNoYW5uZWwsCisJCQkJCQljaGFubmVsID09ICdBJyA/IGFoYy0+b3VyX2lkCisJCQkJCQkJICAgICAgIDogYWhjLT5vdXJfaWRfYiwKKwkJCQkJCXRhcmdldCwgJnRzdGF0ZSk7CisKKwkJLyoKKwkJICogRG9uJ3QgYm90aGVyIHJlcG9ydGluZyByZXN1bHRzIHdoaWxlCisJCSAqIG5lZ290aWF0aW9ucyBhcmUgc3RpbGwgcGVuZGluZy4KKwkJICovCisJCWlmICh0aW5mby0+Y3Vyci5wZXJpb2QgIT0gdGluZm8tPmdvYWwucGVyaW9kCisJCSB8fCB0aW5mby0+Y3Vyci53aWR0aCAhPSB0aW5mby0+Z29hbC53aWR0aAorCQkgfHwgdGluZm8tPmN1cnIub2Zmc2V0ICE9IHRpbmZvLT5nb2FsLm9mZnNldAorCQkgfHwgdGluZm8tPmN1cnIucHByX29wdGlvbnMgIT0gdGluZm8tPmdvYWwucHByX29wdGlvbnMpCisJCQlpZiAoYm9vdHZlcmJvc2UgPT0gMCkKKwkJCQlicmVhazsKKworCQkvKgorCQkgKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHJlc3VsdHMgdGhhdAorCQkgKiBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGxhc3QgcmVwb3J0ZWQuCisJCSAqLworCQl0YXJnZXRfb2Zmc2V0ID0gdGFyZ2V0OworCQlpZiAoY2hhbm5lbCA9PSAnQicpCisJCQl0YXJnZXRfb2Zmc2V0ICs9IDg7CisJCXRhcmcgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnRhcmdldHNbdGFyZ2V0X29mZnNldF07CisJCWlmICh0YXJnID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKHRpbmZvLT5jdXJyLnBlcmlvZCA9PSB0YXJnLT5sYXN0X3RpbmZvLnBlcmlvZAorCQkgJiYgdGluZm8tPmN1cnIud2lkdGggPT0gdGFyZy0+bGFzdF90aW5mby53aWR0aAorCQkgJiYgdGluZm8tPmN1cnIub2Zmc2V0ID09IHRhcmctPmxhc3RfdGluZm8ub2Zmc2V0CisJCSAmJiB0aW5mby0+Y3Vyci5wcHJfb3B0aW9ucyA9PSB0YXJnLT5sYXN0X3RpbmZvLnBwcl9vcHRpb25zKQorCQkJaWYgKGJvb3R2ZXJib3NlID09IDApCisJCQkJYnJlYWs7CisKKwkJdGFyZy0+bGFzdF90aW5mby5wZXJpb2QgPSB0aW5mby0+Y3Vyci5wZXJpb2Q7CisJCXRhcmctPmxhc3RfdGluZm8ud2lkdGggPSB0aW5mby0+Y3Vyci53aWR0aDsKKwkJdGFyZy0+bGFzdF90aW5mby5vZmZzZXQgPSB0aW5mby0+Y3Vyci5vZmZzZXQ7CisJCXRhcmctPmxhc3RfdGluZm8ucHByX29wdGlvbnMgPSB0aW5mby0+Y3Vyci5wcHJfb3B0aW9uczsKKworCQlwcmludGYoIiglczolYzoiLCBhaGNfbmFtZShhaGMpLCBjaGFubmVsKTsKKwkJaWYgKHRhcmdldCA9PSBDQU1fVEFSR0VUX1dJTERDQVJEKQorCQkJcHJpbnRmKCIqKTogIik7CisJCWVsc2UKKwkJCXByaW50ZigiJWQpOiAiLCB0YXJnZXQpOworCQlhaGNfZm9ybWF0X3RyYW5zaW5mbygmaW5mbywgJnRpbmZvLT5jdXJyKTsKKwkJaWYgKGluZm8ucG9zIDwgaW5mby5sZW5ndGgpCisJCQkqaW5mby5idWZmZXIgPSAnXDAnOworCQllbHNlCisJCQlidWZbaW5mby5sZW5ndGggLSAxXSA9ICdcMCc7CisJCXByaW50ZigiJXMiLCBidWYpOworCQlicmVhazsKKwl9CisgICAgICAgIGNhc2UgQUNfU0VOVF9CRFI6CisJeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJV0FSTl9PTihsdW4gIT0gQ0FNX0xVTl9XSUxEQ0FSRCk7CisJCXNjc2lfcmVwb3J0X2RldmljZV9yZXNldChhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QsCisJCQkJCSBjaGFubmVsIC0gJ0EnLCB0YXJnZXQpOworI2Vsc2UKKwkJU2NzaV9EZXZpY2UgKnNjc2lfZGV2OworCisJCS8qCisJCSAqIEZpbmQgdGhlIFNDU0kgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisJCSAqIHJlcXVlc3QgYW5kIGluZGljYXRlIHRoYXQgYSBVQSBpcyBleHBlY3RlZC4KKwkJICovCisJCWZvciAoc2NzaV9kZXYgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPmhvc3QtPmhvc3RfcXVldWU7CisJCSAgICAgc2NzaV9kZXYgIT0gTlVMTDsgc2NzaV9kZXYgPSBzY3NpX2Rldi0+bmV4dCkgeworCQkJaWYgKGNoYW5uZWwgLSAnQScgPT0gc2NzaV9kZXYtPmNoYW5uZWwKKwkJCSAmJiB0YXJnZXQgPT0gc2NzaV9kZXYtPmlkCisJCQkgJiYgKGx1biA9PSBDQU1fTFVOX1dJTERDQVJECisJCQkgIHx8IGx1biA9PSBzY3NpX2Rldi0+bHVuKSkgeworCQkJCXNjc2lfZGV2LT53YXNfcmVzZXQgPSAxOworCQkJCXNjc2lfZGV2LT5leHBlY3RpbmdfY2NfdWEgPSAxOworCQkJfQorCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJfQorICAgICAgICBjYXNlIEFDX0JVU19SRVNFVDoKKwkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCAhPSBOVUxMKSB7CisJCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoYWhjLT5wbGF0Zm9ybV9kYXRhLT5ob3N0LAorCQkJCQkgICAgICBjaGFubmVsIC0gJ0EnKTsKKwkJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBhbmljKCJhaGNfc2VuZF9hc3luYzogVW5leHBlY3RlZCBhc3luYyBldmVudCIpOworICAgICAgICB9Cit9CisKKy8qCisgKiBDYWxscyB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZG9uZSBmdW5jdGlvbiBhbmQgZnJlZXMgdGhlIHNjYi4KKyAqLwordm9pZAorYWhjX2RvbmUoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJU2NzaV9DbW5kICpjbWQ7CisJc3RydWN0CSAgIGFoY19saW51eF9kZXZpY2UgKmRldjsKKworCUxJU1RfUkVNT1ZFKHNjYiwgcGVuZGluZ19saW5rcyk7CisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1VOVEFHR0VEUSkgIT0gMCkgeworCQlzdHJ1Y3Qgc2NiX3RhaWxxICp1bnRhZ2dlZF9xOworCQlpbnQgdGFyZ2V0X29mZnNldDsKKworCQl0YXJnZXRfb2Zmc2V0ID0gU0NCX0dFVF9UQVJHRVRfT0ZGU0VUKGFoYywgc2NiKTsKKwkJdW50YWdnZWRfcSA9ICYoYWhjLT51bnRhZ2dlZF9xdWV1ZXNbdGFyZ2V0X29mZnNldF0pOworCQlUQUlMUV9SRU1PVkUodW50YWdnZWRfcSwgc2NiLCBsaW5rcy50cWUpOworCQlhaGNfcnVuX3VudGFnZ2VkX3F1ZXVlKGFoYywgdW50YWdnZWRfcSk7CisJfQorCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIlNDQiAlZCBkb25lJ2QgdHdpY2VcbiIsIHNjYi0+aHNjYi0+dGFnKTsKKwkJYWhjX2R1bXBfY2FyZF9zdGF0ZShhaGMpOworCQlwYW5pYygiU3RvcHBpbmcgZm9yIHNhZmV0eSIpOworCX0KKwljbWQgPSBzY2ItPmlvX2N0eDsKKwlkZXYgPSBzY2ItPnBsYXRmb3JtX2RhdGEtPmRldjsKKwlkZXYtPmFjdGl2ZS0tOworCWRldi0+b3BlbmluZ3MrKzsKKwlpZiAoKGNtZC0+cmVzdWx0ICYgKENBTV9ERVZfUUZSWk4gPDwgMTYpKSAhPSAwKSB7CisJCWNtZC0+cmVzdWx0ICY9IH4oQ0FNX0RFVl9RRlJaTiA8PCAxNik7CisJCWRldi0+cWZyb3plbi0tOworCX0KKwlhaGNfbGludXhfdW5tYXBfc2NiKGFoYywgc2NiKTsKKworCS8qCisJICogR3VhcmQgYWdhaW5zdCBzdGFsZSBzZW5zZSBkYXRhLgorCSAqIFRoZSBMaW51eCBtaWQtbGF5ZXIgYXNzdW1lcyB0aGF0IHNlbnNlCisJICogd2FzIHJldHJpZXZlZCBhbnl0aW1lIHRoZSBmaXJzdCBieXRlIG9mCisJICogdGhlIHNlbnNlIGJ1ZmZlciBsb29rcyAic2FuZSIuCisJICovCisJY21kLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCWlmIChhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfSU5QUk9HKSB7CisJCXVpbnQzMl90IGFtb3VudF94ZmVycmVkOworCisJCWFtb3VudF94ZmVycmVkID0KKwkJICAgIGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHNjYikgLSBhaGNfZ2V0X3Jlc2lkdWFsKHNjYik7CisJCWlmICgoc2NiLT5mbGFncyAmIFNDQl9UUkFOU01JU1NJT05fRVJST1IpICE9IDApIHsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmICgoYWhjX2RlYnVnICYgQUhDX1NIT1dfTUlTQykgIT0gMCkgeworCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQlwcmludGYoIlNldCBDQU1fVU5DT1JfUEFSSVRZXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fVU5DT1JfUEFSSVRZKTsKKyNpZmRlZiBBSENfUkVQT1JUX1VOREVSRkxPV1MKKwkJLyoKKwkJICogVGhpcyBjb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgc29tZQorCQkgKiBjbGllbnRzIG9mIHRoZSBTQ1NJIHN5c3RlbSBkbyBub3QgcHJvcGVybHkKKwkJICogaW5pdGlhbGl6ZSB0aGUgdW5kZXJmbG93IHBhcmFtZXRlci4gIFRoaXMKKwkJICogcmVzdWx0cyBpbiBzcHVyaW91cyB0ZXJtaW5hdGlvbiBvZiBjb21tYW5kcworCQkgKiB0aGF0IGNvbXBsZXRlIGFzIGV4cGVjdGVkIChlLmcuIHVuZGVyZmxvdyBpcworCQkgKiBhbGxvd2VkIGFzIGNvbW1hbmQgY2FuIHJldHVybiB2YXJpYWJsZSBhbW91bnRzCisJCSAqIG9mIGRhdGEuCisJCSAqLworCQl9IGVsc2UgaWYgKGFtb3VudF94ZmVycmVkIDwgc2NiLT5pb19jdHgtPnVuZGVyZmxvdykgeworCQkJdV9pbnQgaTsKKworCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJcHJpbnRmKCJDREI6Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5pb19jdHgtPmNtZF9sZW47IGkrKykKKwkJCQlwcmludGYoIiAweCV4Iiwgc2NiLT5pb19jdHgtPmNtbmRbaV0pOworCQkJcHJpbnRmKCJcbiIpOworCQkJYWhjX3ByaW50X3BhdGgoYWhjLCBzY2IpOworCQkJcHJpbnRmKCJTYXcgdW5kZXJmbG93ICglbGQgb2YgJWxkIGJ5dGVzKS4gIgorCQkJICAgICAgICJUcmVhdGVkIGFzIGVycm9yXG4iLAorCQkJCWFoY19nZXRfcmVzaWR1YWwoc2NiKSwKKwkJCQlhaGNfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpKTsKKwkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX0RBVEFfUlVOX0VSUik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUV9DTVApOworCQl9CisJfSBlbHNlIGlmIChhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9TQ1NJX1NUQVRVU19FUlJPUikgeworCQlhaGNfbGludXhfaGFuZGxlX3Njc2lfc3RhdHVzKGFoYywgZGV2LCBzY2IpOworCX0gZWxzZSBpZiAoYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fU0VMX1RJTUVPVVQpIHsKKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX1VOQ09ORklHVVJFRDsKKwkJaWYgKEFIQ19EVl9DTUQoY21kKSA9PSBGQUxTRSkKKwkJCWRldi0+dGFyZ2V0LT5mbGFncyAmPSB+QUhDX0RWX1JFUVVJUkVEOworCX0KKwkvKgorCSAqIFN0YXJ0IERWIGZvciBkZXZpY2VzIHRoYXQgcmVxdWlyZSBpdCBhc3N1bWluZyB0aGUgZmlyc3QgY29tbWFuZAorCSAqIHNlbnQgZG9lcyBub3QgcmVzdWx0IGluIGEgc2VsZWN0aW9uIHRpbWVvdXQuCisJICovCisJaWYgKGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgIT0gQ0FNX1NFTF9USU1FT1VUCisJICYmIChkZXYtPnRhcmdldC0+ZmxhZ3MgJiBBSENfRFZfUkVRVUlSRUQpICE9IDApCisJCWFoY19saW51eF9zdGFydF9kdihhaGMpOworCisJaWYgKGRldi0+b3BlbmluZ3MgPT0gMQorCSAmJiBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzY2IpID09IENBTV9SRVFfQ01QCisJICYmIGFoY19nZXRfc2NzaV9zdGF0dXMoc2NiKSAhPSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMKQorCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50Kys7CisJLyoKKwkgKiBTb21lIGRldmljZXMgZGVhbCB3aXRoIHRlbXBvcmFyeSBpbnRlcm5hbCByZXNvdXJjZQorCSAqIHNob3J0YWdlcyBieSByZXR1cm5pbmcgcXVldWUgZnVsbC4gIFdoZW4gdGhlIHF1ZXVlCisJICogZnVsbCBvY2N1cnJzLCB3ZSB0aHJvdHRsZSBiYWNrLiAgU2xvd2x5IHRyeSB0byBnZXQKKwkgKiBiYWNrIHRvIG91ciBwcmV2aW91cyBxdWV1ZSBkZXB0aC4KKwkgKi8KKwlpZiAoKGRldi0+b3BlbmluZ3MgKyBkZXYtPmFjdGl2ZSkgPCBkZXYtPm1heHRhZ3MKKwkgJiYgZGV2LT50YWdfc3VjY2Vzc19jb3VudCA+IEFIQ19UQUdfU1VDQ0VTU19JTlRFUlZBTCkgeworCQlkZXYtPnRhZ19zdWNjZXNzX2NvdW50ID0gMDsKKwkJZGV2LT5vcGVuaW5ncysrOworCX0KKworCWlmIChkZXYtPmFjdGl2ZSA9PSAwKQorCQlkZXYtPmNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZyA9IDA7CisKKwlpZiAoVEFJTFFfRU1QVFkoJmRldi0+YnVzeXEpKSB7CisJCWlmICgoZGV2LT5mbGFncyAmIEFIQ19ERVZfVU5DT05GSUdVUkVEKSAhPSAwCisJCSAmJiBkZXYtPmFjdGl2ZSA9PSAwCisJIAkgJiYgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1RJTUVSX0FDVElWRSkgPT0gMCkKKwkJCWFoY19saW51eF9mcmVlX2RldmljZShhaGMsIGRldik7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIEFIQ19ERVZfT05fUlVOX0xJU1QpID09IDApIHsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZGV2aWNlX3J1bnEsIGRldiwgbGlua3MpOworCQlkZXYtPmZsYWdzIHw9IEFIQ19ERVZfT05fUlVOX0xJU1Q7CisJfQorCisJaWYgKChzY2ItPmZsYWdzICYgU0NCX1JFQ09WRVJZX1NDQikgIT0gMCkgeworCQlwcmludGYoIlJlY292ZXJ5IFNDQiBjb21wbGV0ZXNcbiIpOworCQlpZiAoYWhjX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiKSA9PSBDQU1fQkRSX1NFTlQKKwkJIHx8IGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYikgPT0gQ0FNX1JFUV9BQk9SVEVEKQorCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fQ01EX1RJTUVPVVQpOworCQlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfVVBfRUhfU0VNQVBIT1JFKSAhPSAwKSB7CisJCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmZsYWdzICY9IH5BSENfVVBfRUhfU0VNQVBIT1JFOworCQkJdXAoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZWhfc2VtKTsKKwkJfQorCX0KKworCWFoY19mcmVlX3NjYihhaGMsIHNjYik7CisJYWhjX2xpbnV4X3F1ZXVlX2NtZF9jb21wbGV0ZShhaGMsIGNtZCk7CisKKwlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfRFZfV0FJVF9TSU1RX0VNUFRZKSAhPSAwCisJICYmIExJU1RfRklSU1QoJmFoYy0+cGVuZGluZ19zY2JzKSA9PSBOVUxMKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19EVl9XQUlUX1NJTVFfRU1QVFk7CisJCXVwKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmR2X3NlbSk7CisJfQorCQkKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgICBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0CWFoY19kZXZpbmZvIGRldmluZm87CisKKwlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLAorCQkJICAgIGFoYy0+b3VyX2lkLAorCQkJICAgIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuLAorCQkJICAgIGRldi0+dGFyZ2V0LT5jaGFubmVsID09IDAgPyAnQScgOiAnQicsCisJCQkgICAgUk9MRV9JTklUSUFUT1IpOworCQorCS8qCisJICogV2UgZG9uJ3QgY3VycmVudGx5IHRydXN0IHRoZSBtaWQtbGF5ZXIgdG8KKwkgKiBwcm9wZXJseSBkZWFsIHdpdGggcXVldWUgZnVsbCBvciBidXN5LiAgU28sCisJICogd2hlbiBvbmUgb2NjdXJzLCB3ZSB0ZWxsIHRoZSBtaWQtbGF5ZXIgdG8KKwkgKiB1bmNvbmRpdGlvbmFsbHkgcmVxdWV1ZSB0aGUgY29tbWFuZCB0byB1cworCSAqIHNvIHRoYXQgd2UgY2FuIHJldHJ5IGl0IG91cnNlbHZlcy4gIFdlIGFsc28KKwkgKiBpbXBsZW1lbnQgb3VyIG93biB0aHJvdHRsaW5nIG1lY2hhbmlzbSBzbworCSAqIHdlIGRvbid0IGNsb2JiZXIgdGhlIGRldmljZSB3aXRoIHRvbyBtYW55CisJICogY29tbWFuZHMuCisJICovCisJc3dpdGNoIChhaGNfZ2V0X3Njc2lfc3RhdHVzKHNjYikpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIFNDU0lfU1RBVFVTX0NIRUNLX0NPTkQ6CisJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKKwl7CisJCVNjc2lfQ21uZCAqY21kOworCisJCS8qCisJCSAqIENvcHkgc2Vuc2UgaW5mb3JtYXRpb24gdG8gdGhlIE9TJ3MgY21kCisJCSAqIHN0cnVjdHVyZSBpZiBpdCBpcyBhdmFpbGFibGUuCisJCSAqLworCQljbWQgPSBzY2ItPmlvX2N0eDsKKwkJaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpIHsKKwkJCXVfaW50IHNlbnNlX3NpemU7CisKKwkJCXNlbnNlX3NpemUgPSBNSU4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCisJCQkJICAgICAgIC0gYWhjX2dldF9zZW5zZV9yZXNpZHVhbChzY2IpLAorCQkJCQkgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgYWhjX2dldF9zZW5zZV9idWYoYWhjLCBzY2IpLCBzZW5zZV9zaXplKTsKKwkJCWlmIChzZW5zZV9zaXplIDwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSkKKwkJCQltZW1zZXQoJmNtZC0+c2Vuc2VfYnVmZmVyW3NlbnNlX3NpemVdLCAwLAorCQkJCSAgICAgICBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpIC0gc2Vuc2Vfc2l6ZSk7CisJCQljbWQtPnJlc3VsdCB8PSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKKyNpZmRlZiBBSENfREVCVUcKKwkJCWlmIChhaGNfZGVidWcgJiBBSENfU0hPV19TRU5TRSkgeworCQkJCWludCBpOworCisJCQkJcHJpbnRmKCJDb3BpZWQgJWQgYnl0ZXMgb2Ygc2Vuc2UgZGF0YToiLAorCQkJCSAgICAgICBzZW5zZV9zaXplKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc2Vuc2Vfc2l6ZTsgaSsrKSB7CisJCQkJCWlmICgoaSAmIDB4RikgPT0gMCkKKwkJCQkJCXByaW50ZigiXG4iKTsKKwkJCQkJcHJpbnRmKCIweCV4ICIsIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKKwkJCQl9CisJCQkJcHJpbnRmKCJcbiIpOworCQkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKKwl7CisJCS8qCisJCSAqIEJ5IHRoZSB0aW1lIHRoZSBjb3JlIGRyaXZlciBoYXMgcmV0dXJuZWQgdGhpcworCQkgKiBjb21tYW5kLCBhbGwgb3RoZXIgY29tbWFuZHMgdGhhdCB3ZXJlIHF1ZXVlZAorCQkgKiB0byB1cyBidXQgbm90IHRoZSBkZXZpY2UgaGF2ZSBiZWVuIHJldHVybmVkLgorCQkgKiBUaGlzIGVuc3VyZXMgdGhhdCBkZXYtPmFjdGl2ZSBpcyBlcXVhbCB0bworCQkgKiB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIGFjdHVhbGx5IHF1ZXVlZCB0bworCQkgKiB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZGV2LT50YWdfc3VjY2Vzc19jb3VudCA9IDA7CisJCWlmIChkZXYtPmFjdGl2ZSAhPSAwKSB7CisJCQkvKgorCQkJICogRHJvcCBvdXIgb3BlbmluZyBjb3VudCB0byB0aGUgbnVtYmVyCisJCQkgKiBvZiBjb21tYW5kcyBjdXJyZW50bHkgb3V0c3RhbmRpbmcuCisJCQkgKi8KKwkJCWRldi0+b3BlbmluZ3MgPSAwOworLyoKKwkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCXByaW50ZigiRHJvcHBpbmcgdGFnIGNvdW50IHRvICVkXG4iLCBkZXYtPmFjdGl2ZSk7CisgKi8KKwkJCWlmIChkZXYtPmFjdGl2ZSA9PSBkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwpIHsKKworCQkJCWRldi0+bGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudCsrOworCQkJCS8qCisJCQkJICogSWYgd2UgcmVwZWF0ZWRseSBzZWUgYSBxdWV1ZSBmdWxsCisJCQkJICogYXQgdGhlIHNhbWUgcXVldWUgZGVwdGgsIHRoaXMKKwkJCQkgKiBkZXZpY2UgaGFzIGEgZml4ZWQgbnVtYmVyIG9mIHRhZworCQkJCSAqIHNsb3RzLiAgTG9jayBpbiB0aGlzIHRhZyBkZXB0aAorCQkJCSAqIHNvIHdlIHN0b3Agc2VlaW5nIHF1ZXVlIGZ1bGxzIGZyb20KKwkJCQkgKiB0aGlzIGRldmljZS4KKwkJCQkgKi8KKwkJCQlpZiAoZGV2LT5sYXN0X3F1ZXVlZnVsbF9zYW1lX2NvdW50CisJCQkJID09IEFIQ19MT0NLX1RBR1NfQ09VTlQpIHsKKwkJCQkJZGV2LT5tYXh0YWdzID0gZGV2LT5hY3RpdmU7CisJCQkJCWFoY19wcmludF9wYXRoKGFoYywgc2NiKTsKKwkJCQkJcHJpbnRmKCJMb2NraW5nIG1heCB0YWcgY291bnQgYXQgJWRcbiIsCisJCQkJCSAgICAgICBkZXYtPmFjdGl2ZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnRhZ3Nfb25fbGFzdF9xdWV1ZWZ1bGwgPSBkZXYtPmFjdGl2ZTsKKwkJCQlkZXYtPmxhc3RfcXVldWVmdWxsX3NhbWVfY291bnQgPSAwOworCQkJfQorCQkJYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOworCQkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX09LKTsKKwkJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsICZkZXZpbmZvLAorCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1FfQkFTSUMpCisJCQkJICAgPyBBSENfUVVFVUVfQkFTSUMgOiBBSENfUVVFVUVfVEFHR0VEKTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIERyb3AgZG93biB0byBhIHNpbmdsZSBvcGVuaW5nLCBhbmQgdHJlYXQgdGhpcworCQkgKiBhcyBpZiB0aGUgdGFyZ2V0IHJldHVybmVkIEJVU1kgU0NTSSBzdGF0dXMuCisJCSAqLworCQlkZXYtPm9wZW5pbmdzID0gMTsKKwkJYWhjX3NldF9zY3NpX3N0YXR1cyhzY2IsIFNDU0lfU1RBVFVTX0JVU1kpOworCQlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCAmZGV2aW5mbywKKwkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1FfQkFTSUMpCisJCQkgICA/IEFIQ19RVUVVRV9CQVNJQyA6IEFIQ19RVUVVRV9UQUdHRUQpOworCQkvKiBGQUxMVEhST1VHSCAqLworCX0KKwljYXNlIFNDU0lfU1RBVFVTX0JVU1k6CisJeworCQkvKgorCQkgKiBTZXQgYSBzaG9ydCB0aW1lciB0byBkZWZlciBzZW5kaW5nIGNvbW1hbmRzIGZvcgorCQkgKiBhIGJpdCBzaW5jZSBMaW51eCB3aWxsIG5vdCBkZWxheSBpbiB0aGlzIGNhc2UuCisJCSAqLworCQlpZiAoKGRldi0+ZmxhZ3MgJiBBSENfREVWX1RJTUVSX0FDVElWRSkgIT0gMCkgeworCQkJcHJpbnRmKCIlczolYzolZDogRGV2aWNlIFRpbWVyIHN0aWxsIGFjdGl2ZSBkdXJpbmcgIgorCQkJICAgICAgICJidXN5IHByb2Nlc3NpbmdcbiIsIGFoY19uYW1lKGFoYyksCisJCQkJZGV2LT50YXJnZXQtPmNoYW5uZWwsIGRldi0+dGFyZ2V0LT50YXJnZXQpOworCQkJYnJlYWs7CisJCX0KKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX1RJTUVSX0FDVElWRTsKKwkJZGV2LT5xZnJvemVuKys7CisJCWluaXRfdGltZXIoJmRldi0+dGltZXIpOworCQlkZXYtPnRpbWVyLmRhdGEgPSAodV9sb25nKWRldjsKKwkJZGV2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWi8yKTsKKwkJZGV2LT50aW1lci5mdW5jdGlvbiA9IGFoY19saW51eF9kZXZfdGltZWRfdW5mcmVlemU7CisJCWFkZF90aW1lcigmZGV2LT50aW1lcik7CisJCWJyZWFrOworCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgU2NzaV9DbW5kICpjbWQpCit7CisJLyoKKwkgKiBUeXBpY2FsbHksIHRoZSBjb21wbGV0ZSBxdWV1ZSBoYXMgdmVyeSBmZXcgZW50cmllcworCSAqIHF1ZXVlZCB0byBpdCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGVtcHRpZWQgYnkKKwkgKiBhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlLCBzbyBzb3J0aW5nIHRoZSBlbnRyaWVzCisJICogYnkgZ2VuZXJhdGlvbiBudW1iZXIgc2hvdWxkIGJlIGluZXhwZW5zaXZlLgorCSAqIFdlIHBlcmZvcm0gdGhlIHNvcnQgc28gdGhhdCBjb21tYW5kcyB0aGF0IGNvbXBsZXRlCisJICogd2l0aCBhbiBlcnJvciBhcmUgcmV0dW5lZCBpbiB0aGUgb3JkZXIgb3JpZ2lvbmFsbHkKKwkgKiBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIgc28gdGhhdCBhbnkgc3Vic2VxdWVudCByZXRyaWVzCisJICogYXJlIHBlcmZvcm1lZCBpbiBvcmRlci4gIFRoZSB1bmRlcmx5aW5nIGFoYyByb3V0aW5lcyBkbworCSAqIG5vdCBndWFyYW50ZWUgdGhlIG9yZGVyIHRoYXQgYWJvcnRlZCBjb21tYW5kcyB3aWxsIGJlCisJICogcmV0dXJuZWQgdG8gdXMuCisJICovCisJc3RydWN0IGFoY19jb21wbGV0ZXEgKmNvbXBsZXRlcTsKKwlzdHJ1Y3QgYWhjX2NtZCAqbGlzdF9jbWQ7CisJc3RydWN0IGFoY19jbWQgKmFjbWQ7CisKKwkvKgorCSAqIE1hcCBDQU0gZXJyb3IgY29kZXMgaW50byBMaW51eCBFcnJvciBjb2Rlcy4gIFdlCisJICogYXZvaWQgdGhlIGNvbnZlcnNpb24gc28gdGhhdCB0aGUgRFYgY29kZSBoYXMgdGhlCisJICogZnVsbCBlcnJvciBpbmZvcm1hdGlvbiBhdmFpbGFibGUgd2hlbiBtYWtpbmcKKwkgKiBzdGF0ZSBjaGFuZ2UgZGVjaXNpb25zLgorCSAqLworCWlmIChBSENfRFZfQ01EKGNtZCkgPT0gRkFMU0UpIHsKKwkJdV9pbnQgbmV3X3N0YXR1czsKKworCQlzd2l0Y2ggKGFoY19jbWRfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQpKSB7CisJCWNhc2UgQ0FNX1JFUV9JTlBST0c6CisJCWNhc2UgQ0FNX1JFUV9DTVA6CisJCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgorCQkJbmV3X3N0YXR1cyA9IERJRF9PSzsKKwkJCWJyZWFrOworCQljYXNlIENBTV9SRVFfQUJPUlRFRDoKKwkJCW5ld19zdGF0dXMgPSBESURfQUJPUlQ7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fQlVTWToKKwkJCW5ld19zdGF0dXMgPSBESURfQlVTX0JVU1k7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fUkVRX0lOVkFMSUQ6CisJCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKKwkJCW5ld19zdGF0dXMgPSBESURfQkFEX1RBUkdFVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9TRUxfVElNRU9VVDoKKwkJCW5ld19zdGF0dXMgPSBESURfTk9fQ09OTkVDVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKKwkJY2FzZSBDQU1fQkRSX1NFTlQ6CisJCQluZXdfc3RhdHVzID0gRElEX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX1VOQ09SX1BBUklUWToKKwkJCW5ld19zdGF0dXMgPSBESURfUEFSSVRZOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0NNRF9USU1FT1VUOgorCQkJbmV3X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJCWJyZWFrOworCQljYXNlIENBTV9VQV9BQk9SVDoKKwkJY2FzZSBDQU1fUkVRX0NNUF9FUlI6CisJCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgorCQljYXNlIENBTV9OT19IQkE6CisJCWNhc2UgQ0FNX0RBVEFfUlVOX0VSUjoKKwkJY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKKwkJY2FzZSBDQU1fU0VRVUVOQ0VfRkFJTDoKKwkJY2FzZSBDQU1fQ0NCX0xFTl9FUlI6CisJCWNhc2UgQ0FNX1BST1ZJREVfRkFJTDoKKwkJY2FzZSBDQU1fUkVRX1RFUk1JTzoKKwkJY2FzZSBDQU1fVU5SRUNfSEJBX0VSUk9SOgorCQljYXNlIENBTV9SRVFfVE9PX0JJRzoKKwkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fUkVRVUVVRV9SRVE6CisJCQkvKgorCQkJICogSWYgd2Ugd2FudCB0aGUgcmVxdWVzdCByZXF1ZXVlZCwgbWFrZSBzdXJlIHRoZXJlCisJCQkgKiBhcmUgc3VmZmljZW50IHJldHJpZXMuICBJbiB0aGUgb2xkIHNjc2kgZXJyb3IgY29kZSwKKwkJCSAqIHdlIHVzZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGEgcmVzdWx0IGNvZGUgdGhhdAorCQkJICogYnlwYXNzZWQgdGhlIHJldHJ5IGNvdW50LiAgTm93IHdlIG11c3QgdXNlIHRoaXMKKwkJCSAqIGhhY2suICBXZSBhbHNvICJmYWtlIiBhIGNoZWNrIGNvbmRpdGlvbiB3aXRoCisJCQkgKiBhIHNlbnNlIGNvZGUgb2YgQUJPUlRFRCBDT01NQU5ELiAgVGhpcyBzZWVtcyB0bworCQkJICogZXZva2UgYSByZXRyeSBldmVuIGlmIHRoaXMgY29tbWFuZCBpcyBiZWluZyBzZW50CisJCQkgKiB2aWEgdGhlIGVoIHRocmVhZC4gIEljayEgIEljayEgIEljayEKKwkJCSAqLworCQkJaWYgKGNtZC0+cmV0cmllcyA+IDApCisJCQkJY21kLT5yZXRyaWVzLS07CisJCQluZXdfc3RhdHVzID0gRElEX09LOworCQkJYWhjX2NtZF9zZXRfc2NzaV9zdGF0dXMoY21kLCBTQ1NJX1NUQVRVU19DSEVDS19DT05EKTsKKwkJCWNtZC0+cmVzdWx0IHw9IChEUklWRVJfU0VOU0UgPDwgMjQpOworCQkJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLAorCQkJICAgICAgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJY21kLT5zZW5zZV9idWZmZXJbMF0gPSBTU0RfRVJSQ09ERV9WQUxJRAorCQkJCQkgICAgIHwgU1NEX0NVUlJFTlRfRVJST1I7CisJCQljbWQtPnNlbnNlX2J1ZmZlclsyXSA9IFNTRF9LRVlfQUJPUlRFRF9DT01NQU5EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCW5ld19zdGF0dXMgPSBESURfRVJST1I7CisJCQlicmVhazsKKwkJfQorCisJCWFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhjbWQsIG5ld19zdGF0dXMpOworCX0KKworCWNvbXBsZXRlcSA9ICZhaGMtPnBsYXRmb3JtX2RhdGEtPmNvbXBsZXRlcTsKKwlsaXN0X2NtZCA9IFRBSUxRX0ZJUlNUKGNvbXBsZXRlcSk7CisJYWNtZCA9IChzdHJ1Y3QgYWhjX2NtZCAqKWNtZDsKKwl3aGlsZSAobGlzdF9jbWQgIT0gTlVMTAorCSAgICAmJiBhY21kX3Njc2lfY21kKGxpc3RfY21kKS5zZXJpYWxfbnVtYmVyCisJICAgICA8IGFjbWRfc2NzaV9jbWQoYWNtZCkuc2VyaWFsX251bWJlcikKKwkJbGlzdF9jbWQgPSBUQUlMUV9ORVhUKGxpc3RfY21kLCBhY21kX2xpbmtzLnRxZSk7CisJaWYgKGxpc3RfY21kICE9IE5VTEwpCisJCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdF9jbWQsIGFjbWQsIGFjbWRfbGlua3MudHFlKTsKKwllbHNlCisJCVRBSUxRX0lOU0VSVF9UQUlMKGNvbXBsZXRlcSwgYWNtZCwgYWNtZF9saW5rcy50cWUpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X2ZpbHRlcl9pbnF1aXJ5KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvKQoreworCXN0cnVjdAlzY3NpX2lucXVpcnlfZGF0YSAqc2lkOworCXN0cnVjdAlhaGNfaW5pdGlhdG9yX3RpbmZvICp0aW5mbzsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqdXNlcjsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqZ29hbDsKKwlzdHJ1Y3QJYWhjX3RyYW5zaW5mbyAqY3VycjsKKwlzdHJ1Y3QJYWhjX3Rtb2RlX3RzdGF0ZSAqdHN0YXRlOworCXN0cnVjdAlhaGNfc3luY3JhdGUgKnN5bmNyYXRlOworCXN0cnVjdAlhaGNfbGludXhfZGV2aWNlICpkZXY7CisJdV9pbnQJbWF4c3luYzsKKwl1X2ludAl3aWR0aDsKKwl1X2ludAlwZXJpb2Q7CisJdV9pbnQJb2Zmc2V0OworCXVfaW50CXBwcl9vcHRpb25zOworCXVfaW50CXRyYW5zX3ZlcnNpb247CisJdV9pbnQJcHJvdF92ZXJzaW9uOworCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhpcyBsdW4gYWN0dWFsbHkgZXhpc3RzLiAgSWYgc28sCisJICogaG9sZCBvbiB0byBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2Ugc3RydWN0dXJlLgorCSAqIElmIG5vdCwgbWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGRldmljZSBhbmQKKwkgKiBkb24ndCBib3RoZXIgcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGlzIGlucXVpcnkKKwkgKiBjb21tYW5kLgorCSAqLworCWRldiA9IGFoY19saW51eF9nZXRfZGV2aWNlKGFoYywgZGV2aW5mby0+Y2hhbm5lbCAtICdBJywKKwkJCQkgICBkZXZpbmZvLT50YXJnZXQsIGRldmluZm8tPmx1biwKKwkJCQkgICAvKmFsbG9jKi9UUlVFKTsKKworCXNpZCA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilkZXYtPnRhcmdldC0+aW5xX2RhdGE7CisJaWYgKFNJRF9RVUFMKHNpZCkgPT0gU0lEX1FVQUxfTFVfQ09OTkVDVEVEKSB7CisKKwkJZGV2LT5mbGFncyAmPSB+QUhDX0RFVl9VTkNPTkZJR1VSRUQ7CisJfSBlbHNlIHsKKwkJZGV2LT5mbGFncyB8PSBBSENfREVWX1VOQ09ORklHVVJFRDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXBkYXRlIG91ciBub3Rpb24gb2YgdGhpcyBkZXZpY2UncyB0cmFuc2ZlcgorCSAqIG5lZ290aWF0aW9uIGNhcGFiaWxpdGllcy4KKwkgKi8KKwl0aW5mbyA9IGFoY19mZXRjaF90cmFuc2luZm8oYWhjLCBkZXZpbmZvLT5jaGFubmVsLAorCQkJCSAgICBkZXZpbmZvLT5vdXJfc2NzaWlkLAorCQkJCSAgICBkZXZpbmZvLT50YXJnZXQsICZ0c3RhdGUpOworCXVzZXIgPSAmdGluZm8tPnVzZXI7CisJZ29hbCA9ICZ0aW5mby0+Z29hbDsKKwljdXJyID0gJnRpbmZvLT5jdXJyOworCXdpZHRoID0gdXNlci0+d2lkdGg7CisJcGVyaW9kID0gdXNlci0+cGVyaW9kOworCW9mZnNldCA9IHVzZXItPm9mZnNldDsKKwlwcHJfb3B0aW9ucyA9IHVzZXItPnBwcl9vcHRpb25zOworCXRyYW5zX3ZlcnNpb24gPSB1c2VyLT50cmFuc3BvcnRfdmVyc2lvbjsKKwlwcm90X3ZlcnNpb24gPSBNSU4odXNlci0+cHJvdG9jb2xfdmVyc2lvbiwgU0lEX0FOU0lfUkVWKHNpZCkpOworCisJLyoKKwkgKiBPbmx5IGF0dGVtcHQgU1BJMy80IG9uY2Ugd2UndmUgdmVyaWZpZWQgdGhhdAorCSAqIHRoZSBkZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQgU1BJMy80IGZlYXR1cmVzLgorCSAqLworCWlmIChwcm90X3ZlcnNpb24gPCBTQ1NJX1JFVl8yKQorCQl0cmFuc192ZXJzaW9uID0gU0lEX0FOU0lfUkVWKHNpZCk7CisJZWxzZQorCQl0cmFuc192ZXJzaW9uID0gU0NTSV9SRVZfMjsKKworCWlmICgoc2lkLT5mbGFncyAmIFNJRF9XQnVzMTYpID09IDApCisJCXdpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKwlpZiAoKHNpZC0+ZmxhZ3MgJiBTSURfU3luYykgPT0gMCkgeworCQlwZXJpb2QgPSAwOworCQlvZmZzZXQgPSAwOworCQlwcHJfb3B0aW9ucyA9IDA7CisJfQorCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfUUFTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSB+TVNHX0VYVF9QUFJfUUFTX1JFUTsKKwlpZiAoKHNpZC0+c3BpM2RhdGEgJiBTSURfU1BJX0NMT0NLX0RUKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSBNU0dfRVhUX1BQUl9RQVNfUkVROworCWlmICgoc2lkLT5zcGkzZGF0YSAmIFNJRF9TUElfSVVTKSA9PSAwKQorCQlwcHJfb3B0aW9ucyAmPSAoTVNHX0VYVF9QUFJfRFRfUkVRCisJCQkgICAgICB8IE1TR19FWFRfUFBSX1FBU19SRVEpOworCisJaWYgKHByb3RfdmVyc2lvbiA+IFNDU0lfUkVWXzIKKwkgJiYgcHByX29wdGlvbnMgIT0gMCkKKwkJdHJhbnNfdmVyc2lvbiA9IHVzZXItPnRyYW5zcG9ydF92ZXJzaW9uOworCisJYWhjX3ZhbGlkYXRlX3dpZHRoKGFoYywgLyp0aW5mbyBsaW1pdCovTlVMTCwgJndpZHRoLCBST0xFX1VOS05PV04pOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfRFQ7CisJZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApCisJCW1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkE7CisJZWxzZQorCQltYXhzeW5jID0gQUhDX1NZTkNSQVRFX0ZBU1Q7CisKKwlzeW5jcmF0ZSA9IGFoY19maW5kX3N5bmNyYXRlKGFoYywgJnBlcmlvZCwgJnBwcl9vcHRpb25zLCBtYXhzeW5jKTsKKwlhaGNfdmFsaWRhdGVfb2Zmc2V0KGFoYywgLyp0aW5mbyBsaW1pdCovTlVMTCwgc3luY3JhdGUsCisJCQkgICAgJm9mZnNldCwgd2lkdGgsIFJPTEVfVU5LTk9XTik7CisJaWYgKG9mZnNldCA9PSAwIHx8IHBlcmlvZCA9PSAwKSB7CisJCXBlcmlvZCA9IDA7CisJCW9mZnNldCA9IDA7CisJCXBwcl9vcHRpb25zID0gMDsKKwl9CisJLyogQXBwbHkgb3VyIGZpbHRlcmVkIHVzZXIgc2V0dGluZ3MuICovCisJY3Vyci0+dHJhbnNwb3J0X3ZlcnNpb24gPSB0cmFuc192ZXJzaW9uOworCWN1cnItPnByb3RvY29sX3ZlcnNpb24gPSBwcm90X3ZlcnNpb247CisJYWhjX3NldF93aWR0aChhaGMsIGRldmluZm8sIHdpZHRoLCBBSENfVFJBTlNfR09BTCwgLypwYXVzZWQqL0ZBTFNFKTsKKwlhaGNfc2V0X3N5bmNyYXRlKGFoYywgZGV2aW5mbywgc3luY3JhdGUsIHBlcmlvZCwKKwkJCSBvZmZzZXQsIHBwcl9vcHRpb25zLCBBSENfVFJBTlNfR09BTCwKKwkJCSAvKnBhdXNlZCovRkFMU0UpOworfQorCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3NlbV90aW1lb3V0KHVfbG9uZyBhcmcpCit7CisJc3RydWN0CWFoY19zb2Z0YyAqYWhjOworCXVfbG9uZwlzOworCisJYWhjID0gKHN0cnVjdCBhaGNfc29mdGMgKilhcmc7CisKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlpZiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfVVBfRUhfU0VNQVBIT1JFKSAhPSAwKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19VUF9FSF9TRU1BUEhPUkU7CisJCXVwKCZhaGMtPnBsYXRmb3JtX2RhdGEtPmVoX3NlbSk7CisJfQorCWFoY191bmxvY2soYWhjLCAmcyk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZnJlZXplX3NpbXEoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbisrOworCWlmIChhaGMtPnBsYXRmb3JtX2RhdGEtPnFmcm96ZW4gPT0gMSkgeworCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7CisKKwkJLyogWFhYIFdoYXQgYWJvdXQgVHdpbiBjaGFubmVscz8gKi8KKwkJYWhjX3BsYXRmb3JtX2Fib3J0X3NjYnMoYWhjLCBDQU1fVEFSR0VUX1dJTERDQVJELCBBTExfQ0hBTk5FTFMsCisJCQkJCUNBTV9MVU5fV0lMRENBUkQsIFNDQl9MSVNUX05VTEwsCisJCQkJCVJPTEVfSU5JVElBVE9SLCBDQU1fUkVRVUVVRV9SRVEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9yZWxlYXNlX3NpbXEodV9sb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisJdV9sb25nIHM7CisJaW50ICAgIHVuYmxvY2tfcmVxczsKKworCWFoYyA9IChzdHJ1Y3QgYWhjX3NvZnRjICopYXJnOworCisJdW5ibG9ja19yZXFzID0gMDsKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlpZiAoYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID4gMCkKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuLS07CisJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+cWZyb3plbiA9PSAwKQorCQl1bmJsb2NrX3JlcXMgPSAxOworCWlmIChBSENfRFZfU0lNUV9GUk9aRU4oYWhjKQorCSAmJiAoKGFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfRFZfV0FJVF9TSU1RX1JFTEVBU0UpICE9IDApKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJj0gfkFIQ19EVl9XQUlUX1NJTVFfUkVMRUFTRTsKKwkJdXAoJmFoYy0+cGxhdGZvcm1fZGF0YS0+ZHZfc2VtKTsKKwl9CisJYWhjX3NjaGVkdWxlX3J1bnEoYWhjKTsKKwlhaGNfdW5sb2NrKGFoYywgJnMpOworCS8qCisJICogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGhlcmUuICBUaGUgbWlkLWxheWVyCisJICogc2hvdWxkIGtlZXAgaXRzIG93biBmcmVlemUgY291bnQgYW5kIHVzZQorCSAqIGEgYm90dG9tIGhhbGYgaGFuZGxlciB0byBydW4gdGhlIHF1ZXVlcworCSAqIHNvIHdlIGNhbiB1bmJsb2NrIHdpdGggb3VyIG93biBsb2NrIGhlbGQuCisJICovCisJaWYgKHVuYmxvY2tfcmVxcykKKwkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdCk7Cit9CisKK3N0YXRpYyB2b2lkCithaGNfbGludXhfZGV2X3RpbWVkX3VuZnJlZXplKHVfbG9uZyBhcmcpCit7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWhjX3NvZnRjICphaGM7CisJdV9sb25nIHM7CisKKwlkZXYgPSAoc3RydWN0IGFoY19saW51eF9kZXZpY2UgKilhcmc7CisJYWhjID0gZGV2LT50YXJnZXQtPmFoYzsKKwlhaGNfbG9jayhhaGMsICZzKTsKKwlkZXYtPmZsYWdzICY9IH5BSENfREVWX1RJTUVSX0FDVElWRTsKKwlpZiAoZGV2LT5xZnJvemVuID4gMCkKKwkJZGV2LT5xZnJvemVuLS07CisJaWYgKGRldi0+cWZyb3plbiA9PSAwCisJICYmIChkZXYtPmZsYWdzICYgQUhDX0RFVl9PTl9SVU5fTElTVCkgPT0gMCkKKwkJYWhjX2xpbnV4X3J1bl9kZXZpY2VfcXVldWUoYWhjLCBkZXYpOworCWlmIChUQUlMUV9FTVBUWSgmZGV2LT5idXN5cSkKKwkgJiYgZGV2LT5hY3RpdmUgPT0gMCkKKwkJX19haGNfbGludXhfZnJlZV9kZXZpY2UoYWhjLCBkZXYpOworCWFoY191bmxvY2soYWhjLCAmcyk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19saW51eF9xdWV1ZV9yZWNvdmVyeV9jbWQoU2NzaV9DbW5kICpjbWQsIHNjYl9mbGFnIGZsYWcpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjOworCXN0cnVjdCBhaGNfY21kICphY21kOworCXN0cnVjdCBhaGNfY21kICpsaXN0X2FjbWQ7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2NiICpwZW5kaW5nX3NjYjsKKwl1X2xvbmcgczsKKwl1X2ludCAgc2F2ZWRfc2NicHRyOworCXVfaW50ICBhY3RpdmVfc2NiX2luZGV4OworCXVfaW50ICBsYXN0X3BoYXNlOworCXVfaW50ICBzYXZlZF9zY3NpaWQ7CisJdV9pbnQgIGNkYl9ieXRlOworCWludCAgICByZXR2YWw7CisJaW50ICAgIHdhc19wYXVzZWQ7CisJaW50ICAgIHBhdXNlZDsKKwlpbnQgICAgd2FpdDsKKwlpbnQgICAgZGlzY29ubmVjdGVkOworCisJcGVuZGluZ19zY2IgPSBOVUxMOworCXBhdXNlZCA9IEZBTFNFOworCXdhaXQgPSBGQUxTRTsKKwlhaGMgPSAqKHN0cnVjdCBhaGNfc29mdGMgKiopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWFjbWQgPSAoc3RydWN0IGFoY19jbWQgKiljbWQ7CisKKwlwcmludGYoIiVzOiVkOiVkOiVkOiBBdHRlbXB0aW5nIHRvIHF1ZXVlIGElcyBtZXNzYWdlXG4iLAorCSAgICAgICBhaGNfbmFtZShhaGMpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCSAgICAgICBmbGFnID09IFNDQl9BQk9SVCA/ICJuIEFCT1JUIiA6ICIgVEFSR0VUIFJFU0VUIik7CisKKwlwcmludGYoIkNEQjoiKTsKKwlmb3IgKGNkYl9ieXRlID0gMDsgY2RiX2J5dGUgPCBjbWQtPmNtZF9sZW47IGNkYl9ieXRlKyspCisJCXByaW50ZigiIDB4JXgiLCBjbWQtPmNtbmRbY2RiX2J5dGVdKTsKKwlwcmludGYoIlxuIik7CisKKwkvKgorCSAqIEluIGFsbCB2ZXJzaW9ucyBvZiBMaW51eCwgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZAorCSAqIGEgbWFqb3IgZmxhdyBpbiBob3cgdGhlIG1pZC1sYXllciBpcyBsb2NrZWQgZG93bgorCSAqIGlmIHdlIGFyZSB0byBzbGVlcCBzdWNjZXNzZnVsbHkgaW4gb3VyIGVycm9yIGhhbmRsZXIKKwkgKiB3aGlsZSBhbGxvd2luZyBvdXIgaW50ZXJydXB0IGhhbmRsZXIgdG8gcnVuLiAgU2luY2UKKwkgKiB0aGUgbWlkbGF5ZXIgYWNxdWlyZXMgZWl0aGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgb3IKKwkgKiBvdXIgbG9jayBwcmlvciB0byBjYWxsaW5nIHVzLCB3ZSBtdXN0IHVzZSB0aGUKKwkgKiBzcGluX3VubG9ja19pcnEoKSBtZXRob2QgZm9yIHVubG9ja2luZyBvdXIgbG9jay4KKwkgKiBUaGlzIHdpbGwgZm9yY2UgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIG9uIHRoZQorCSAqIGN1cnJlbnQgQ1BVLiAgU2luY2UgdGhlIEVIIHRocmVhZCBzaG91bGQgbm90IGhhdmUKKwkgKiBiZWVuIHJ1bm5pbmcgd2l0aCBDUFUgaW50ZXJydXB0cyBkaXNhYmxlZCBvdGhlciB0aGFuCisJICogYnkgYWNxdWlyaW5nIGVpdGhlciB0aGUgaW9fcmVxdWVzdF9sb2NrIG9yIG91ciBvd24KKwkgKiBsb2NrLCB0aGlzICpzaG91bGQqIGJlIHNhZmUuCisJICovCisJYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfbG9jayhhaGMsICZzKTsKKworCS8qCisJICogRmlyc3QgZGV0ZXJtaW5lIGlmIHdlIGN1cnJlbnRseSBvd24gdGhpcyBjb21tYW5kLgorCSAqIFN0YXJ0IGJ5IHNlYXJjaGluZyB0aGUgZGV2aWNlIHF1ZXVlLiAgSWYgbm90IGZvdW5kCisJICogdGhlcmUsIGNoZWNrIHRoZSBwZW5kaW5nX3NjYiBsaXN0LiAgSWYgbm90IGZvdW5kCisJICogYXQgYWxsLCBhbmQgdGhlIHN5c3RlbSB3YW50ZWQgdXMgdG8ganVzdCBhYm9ydCB0aGUKKwkgKiBjb21tYW5kLCByZXR1cm4gc3VjY2Vzcy4KKwkgKi8KKwlkZXYgPSBhaGNfbGludXhfZ2V0X2RldmljZShhaGMsIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgY21kLT5kZXZpY2UtPmx1biwgLyphbGxvYyovRkFMU0UpOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCS8qCisJCSAqIE5vIHRhcmdldCBkZXZpY2UgZm9yIHRoaXMgY29tbWFuZCBleGlzdHMsCisJCSAqIHNvIHdlIG11c3Qgbm90IHN0aWxsIG93biB0aGUgY29tbWFuZC4KKwkJICovCisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IElzIG5vdCBhbiBhY3RpdmUgZGV2aWNlXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR2YWwgPSBTVUNDRVNTOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlUQUlMUV9GT1JFQUNIKGxpc3RfYWNtZCwgJmRldi0+YnVzeXEsIGFjbWRfbGlua3MudHFlKSB7CisJCWlmIChsaXN0X2FjbWQgPT0gYWNtZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChsaXN0X2FjbWQgIT0gTlVMTCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGZvdW5kIG9uIGRldmljZSBxdWV1ZVxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKKwkJaWYgKGZsYWcgPT0gU0NCX0FCT1JUKSB7CisJCQlUQUlMUV9SRU1PVkUoJmRldi0+YnVzeXEsIGxpc3RfYWNtZCwgYWNtZF9saW5rcy50cWUpOworCQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlhaGNfbGludXhfcXVldWVfY21kX2NvbXBsZXRlKGFoYywgY21kKTsKKwkJCXJldHZhbCA9IFNVQ0NFU1M7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiAoQUhDX0RFVl9RX0JBU0lDfEFIQ19ERVZfUV9UQUdHRUQpKSA9PSAwCisJICYmIGFoY19zZWFyY2hfdW50YWdnZWRfcXVldWVzKGFoYywgY21kLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsICsgJ0EnLAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLAorCQkJCSAgICAgICBDQU1fUkVRX0FCT1JURUQsIFNFQVJDSF9DT01QTEVURSkgIT0gMCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGZvdW5kIG9uIHVudGFnZ2VkIHF1ZXVlXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlyZXR2YWwgPSBTVUNDRVNTOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBtYXRjaGluZyBjbWQgaW4gdGhlIHBlbmRpbmcgbGlzdC4KKwkgKi8KKwlMSVNUX0ZPUkVBQ0gocGVuZGluZ19zY2IsICZhaGMtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQlpZiAocGVuZGluZ19zY2ItPmlvX2N0eCA9PSBjbWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAocGVuZGluZ19zY2IgPT0gTlVMTCAmJiBmbGFnID09IFNDQl9ERVZJQ0VfUkVTRVQpIHsKKworCQkvKiBBbnkgU0NCIGZvciB0aGlzIGRldmljZSB3aWxsIGRvIGZvciBhIHRhcmdldCByZXNldCAqLworCQlMSVNUX0ZPUkVBQ0gocGVuZGluZ19zY2IsICZhaGMtPnBlbmRpbmdfc2NicywgcGVuZGluZ19saW5rcykgeworCQkgIAlpZiAoYWhjX21hdGNoX3NjYihhaGMsIHBlbmRpbmdfc2NiLCBjbWQtPmRldmljZS0+aWQsCisJCQkJCSAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJCSAgQ0FNX0xVTl9XSUxEQ0FSRCwKKwkJCQkJICBTQ0JfTElTVF9OVUxMLCBST0xFX0lOSVRJQVRPUikgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwZW5kaW5nX3NjYiA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENvbW1hbmQgbm90IGZvdW5kXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlpZiAoKHBlbmRpbmdfc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpICE9IDApIHsKKwkJLyoKKwkJICogV2UgY2FuJ3QgcXVldWUgdHdvIHJlY292ZXJ5IGFjdGlvbnMgdXNpbmcgdGhlIHNhbWUgU0NCCisJCSAqLworCQlyZXR2YWwgPSBGQUlMRUQ7CisJCWdvdG8gIGRvbmU7CisJfQorCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgY2FyZCBkb2Vzbid0IGRvIGFueXRoaW5nCisJICogYmVoaW5kIG91ciBiYWNrIGFuZCB0aGF0IHdlIGRpZG4ndCAianVzdCIgbWlzcworCSAqIGFuIGludGVycnVwdCB0aGF0IHdvdWxkIGFmZmVjdCB0aGlzIGNtZC4KKwkgKi8KKwl3YXNfcGF1c2VkID0gYWhjX2lzX3BhdXNlZChhaGMpOworCWFoY19wYXVzZV9hbmRfZmx1c2h3b3JrKGFoYyk7CisJcGF1c2VkID0gVFJVRTsKKworCWlmICgocGVuZGluZ19zY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgPT0gMCkgeworCQlwcmludGYoIiVzOiVkOiVkOiVkOiBDb21tYW5kIGFscmVhZHkgY29tcGxldGVkXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIG5vX2NtZDsKKwl9CisKKwlwcmludGYoIiVzOiBBdCB0aW1lIG9mIHJlY292ZXJ5LCBjYXJkIHdhcyAlc3BhdXNlZFxuIiwKKwkgICAgICAgYWhjX25hbWUoYWhjKSwgd2FzX3BhdXNlZCA/ICIiIDogIm5vdCAiKTsKKwlhaGNfZHVtcF9jYXJkX3N0YXRlKGFoYyk7CisKKwlkaXNjb25uZWN0ZWQgPSBUUlVFOworCWlmIChmbGFnID09IFNDQl9BQk9SVCkgeworCQlpZiAoYWhjX3NlYXJjaF9xaW5maWZvKGFoYywgY21kLT5kZXZpY2UtPmlkLAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICAgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkgICAgICAgcGVuZGluZ19zY2ItPmhzY2ItPnRhZywKKwkJCQkgICAgICAgUk9MRV9JTklUSUFUT1IsIENBTV9SRVFfQUJPUlRFRCwKKwkJCQkgICAgICAgU0VBUkNIX0NPTVBMRVRFKSA+IDApIHsKKwkJCXByaW50ZigiJXM6JWQ6JWQ6JWQ6IENtZCBhYm9ydGVkIGZyb20gUUlORklGT1xuIiwKKwkJCSAgICAgICBhaGNfbmFtZShhaGMpLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkJCQkJY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCXJldHZhbCA9IFNVQ0NFU1M7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9IGVsc2UgaWYgKGFoY19zZWFyY2hfcWluZmlmbyhhaGMsIGNtZC0+ZGV2aWNlLT5pZCwKKwkJCQkgICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgICBjbWQtPmRldmljZS0+bHVuLCBwZW5kaW5nX3NjYi0+aHNjYi0+dGFnLAorCQkJCSAgICAgIFJPTEVfSU5JVElBVE9SLCAvKnN0YXR1cyovMCwKKwkJCQkgICAgICBTRUFSQ0hfQ09VTlQpID4gMCkgeworCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKKwl9CisKKwlpZiAoZGlzY29ubmVjdGVkICYmIChhaGNfaW5iKGFoYywgU0VRX0ZMQUdTKSAmIE5PVF9JREVOVElGSUVEKSA9PSAwKSB7CisJCXN0cnVjdCBzY2IgKmJ1c19zY2I7CisKKwkJYnVzX3NjYiA9IGFoY19sb29rdXBfc2NiKGFoYywgYWhjX2luYihhaGMsIFNDQl9UQUcpKTsKKwkJaWYgKGJ1c19zY2IgPT0gcGVuZGluZ19zY2IpCisJCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKKwkJZWxzZSBpZiAoZmxhZyAhPSBTQ0JfQUJPUlQKKwkJICAgICAgJiYgYWhjX2luYihhaGMsIFNBVkVEX1NDU0lJRCkgPT0gcGVuZGluZ19zY2ItPmhzY2ItPnNjc2lpZAorCQkgICAgICAmJiBhaGNfaW5iKGFoYywgU0FWRURfTFVOKSA9PSBTQ0JfR0VUX0xVTihwZW5kaW5nX3NjYikpCisJCQlkaXNjb25uZWN0ZWQgPSBGQUxTRTsKKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHBlbmRpbmdfc2NiIGlzIHRoZSBzY2IgYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAqIHBhc3NlZCBpbiBjb21tYW5kLiAgVGhhdCBjb21tYW5kIGlzIGN1cnJlbnRseSBhY3RpdmUgb24gdGhlCisJICogYnVzLCBpcyBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlLCBvciB3ZSdyZSBob3BpbmcgdG8gZmluZAorCSAqIGEgY29tbWFuZCBmb3IgdGhlIHNhbWUgdGFyZ2V0IGFjdGl2ZSBvbiB0aGUgYnVzIHRvIGFidXNlIHRvCisJICogc2VuZCBhIEJEUi4gIFF1ZXVlIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGJhc2VkIG9uIHdoaWNoIG9mCisJICogdGhlc2Ugc3RhdGVzIHdlIGFyZSBpbi4KKwkgKi8KKwlsYXN0X3BoYXNlID0gYWhjX2luYihhaGMsIExBU1RQSEFTRSk7CisJc2F2ZWRfc2NicHRyID0gYWhjX2luYihhaGMsIFNDQlBUUik7CisJYWN0aXZlX3NjYl9pbmRleCA9IGFoY19pbmIoYWhjLCBTQ0JfVEFHKTsKKwlzYXZlZF9zY3NpaWQgPSBhaGNfaW5iKGFoYywgU0FWRURfU0NTSUlEKTsKKwlpZiAobGFzdF9waGFzZSAhPSBQX0JVU0ZSRUUKKwkgJiYgKHBlbmRpbmdfc2NiLT5oc2NiLT50YWcgPT0gYWN0aXZlX3NjYl9pbmRleAorCSAgfHwgKGZsYWcgPT0gU0NCX0RFVklDRV9SRVNFVAorCSAgICYmIFNDU0lJRF9UQVJHRVQoYWhjLCBzYXZlZF9zY3NpaWQpID09IGNtZC0+ZGV2aWNlLT5pZCkpKSB7CisKKwkJLyoKKwkJICogV2UncmUgYWN0aXZlIG9uIHRoZSBidXMsIHNvIGFzc2VydCBBVE4KKwkJICogYW5kIGhvcGUgdGhhdCB0aGUgdGFyZ2V0IHJlc3BvbmRzLgorCQkgKi8KKwkJcGVuZGluZ19zY2IgPSBhaGNfbG9va3VwX3NjYihhaGMsIGFjdGl2ZV9zY2JfaW5kZXgpOworCQlwZW5kaW5nX3NjYi0+ZmxhZ3MgfD0gU0NCX1JFQ09WRVJZX1NDQnxmbGFnOworCQlhaGNfb3V0YihhaGMsIE1TR19PVVQsIEhPU1RfTVNHKTsKKwkJYWhjX291dGIoYWhjLCBTQ1NJU0lHTywgbGFzdF9waGFzZXxBVE5PKTsKKwkJcHJpbnRmKCIlczolZDolZDolZDogRGV2aWNlIGlzIGFjdGl2ZSwgYXNzZXJ0aW5nIEFUTlxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKKwkJd2FpdCA9IFRSVUU7CisJfSBlbHNlIGlmIChkaXNjb25uZWN0ZWQpIHsKKworCQkvKgorCQkgKiBBY3R1YWxseSByZS1xdWV1ZSB0aGlzIFNDQiBpbiBhbiBhdHRlbXB0CisJCSAqIHRvIHNlbGVjdCB0aGUgZGV2aWNlIGJlZm9yZSBpdCByZWNvbm5lY3RzLgorCQkgKiBJbiBlaXRoZXIgY2FzZSAoc2VsZWN0aW9uIG9yIHJlc2VsZWN0aW9uKSwKKwkJICogd2Ugd2lsbCBub3cgaXNzdWUgdGhlIGFwcHJvcHJhdGUgbWVzc2FnZQorCQkgKiB0byB0aGUgdGltZWQtb3V0IGRldmljZS4KKwkJICoKKwkJICogU2V0IHRoZSBNS19NRVNTQUdFIGNvbnRyb2wgYml0IGluZGljYXRpbmcKKwkJICogdGhhdCB3ZSBkZXNpcmUgdG8gc2VuZCBhIG1lc3NhZ2UuICBXZQorCQkgKiBhbHNvIHNldCB0aGUgZGlzY29ubmVjdGVkIGZsYWcgc2luY2UKKwkJICogaW4gdGhlIHBhZ2luZyBjYXNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZQorCQkgKiB0aGF0IG91ciBTQ0IgY29udHJvbCBieXRlIG1hdGNoZXMgdGhlCisJCSAqIHZlcnNpb24gb24gdGhlIGNhcmQuICBXZSBkb24ndCB3YW50IHRoZQorCQkgKiBzZXF1ZW5jZXIgdG8gYWJvcnQgdGhlIGNvbW1hbmQgdGhpbmtpbmcKKwkJICogYW4gdW5zb2xpY2l0ZWQgcmVzZWxlY3Rpb24gb2NjdXJyZWQuCisJCSAqLworCQlwZW5kaW5nX3NjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFfERJU0NPTk5FQ1RFRDsKKwkJcGVuZGluZ19zY2ItPmZsYWdzIHw9IFNDQl9SRUNPVkVSWV9TQ0J8ZmxhZzsKKworCQkvKgorCQkgKiBSZW1vdmUgYW55IGNhY2hlZCBjb3B5IG9mIHRoaXMgU0NCIGluIHRoZQorCQkgKiBkaXNjb25uZWN0ZWQgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlCisJCSAqIHF1ZXVpbmcgb2Ygb3VyIGFib3J0IFNDQi4gIFdlIHVzZSB0aGUKKwkJICogc2FtZSBlbGVtZW50IGluIHRoZSBTQ0IsIFNDQl9ORVhULCBmb3IKKwkJICogYm90aCB0aGUgcWluZmlmbyBhbmQgdGhlIGRpc2Nvbm5lY3RlZCBsaXN0LgorCQkgKi8KKwkJYWhjX3NlYXJjaF9kaXNjX2xpc3QoYWhjLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCArICdBJywKKwkJCQkgICAgIGNtZC0+ZGV2aWNlLT5sdW4sIHBlbmRpbmdfc2NiLT5oc2NiLT50YWcsCisJCQkJICAgICAvKnN0b3Bfb25fZmlyc3QqL1RSVUUsCisJCQkJICAgICAvKnJlbW92ZSovVFJVRSwKKwkJCQkgICAgIC8qc2F2ZV9zdGF0ZSovRkFMU0UpOworCisJCS8qCisJCSAqIEluIHRoZSBub24tcGFnaW5nIGNhc2UsIHRoZSBzZXF1ZW5jZXIgd2lsbAorCQkgKiBuZXZlciByZS1yZWZlcmVuY2UgdGhlIGluLWNvcmUgU0NCLgorCQkgKiBUbyBtYWtlIHN1cmUgd2UgYXJlIG5vdGlmaWVkIGR1cmluZworCQkgKiByZXNsZWN0aW9uLCBzZXQgdGhlIE1LX01FU1NBR0UgZmxhZyBpbgorCQkgKiB0aGUgY2FyZCdzIGNvcHkgb2YgdGhlIFNDQi4KKwkJICovCisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgPT0gMCkgeworCQkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHBlbmRpbmdfc2NiLT5oc2NiLT50YWcpOworCQkJYWhjX291dGIoYWhjLCBTQ0JfQ09OVFJPTCwKKwkJCQkgYWhjX2luYihhaGMsIFNDQl9DT05UUk9MKXxNS19NRVNTQUdFKTsKKwkJfQorCisJCS8qCisJCSAqIENsZWFyIG91dCBhbnkgZW50cmllcyBpbiB0aGUgUUlORklGTyBmaXJzdAorCQkgKiBzbyB3ZSBhcmUgdGhlIG5leHQgU0NCIGZvciB0aGlzIHRhcmdldAorCQkgKiB0byBydW4uCisJCSAqLworCQlhaGNfc2VhcmNoX3FpbmZpZm8oYWhjLCBjbWQtPmRldmljZS0+aWQsCisJCQkJICAgY21kLT5kZXZpY2UtPmNoYW5uZWwgKyAnQScsCisJCQkJICAgY21kLT5kZXZpY2UtPmx1biwgU0NCX0xJU1RfTlVMTCwKKwkJCQkgICBST0xFX0lOSVRJQVRPUiwgQ0FNX1JFUVVFVUVfUkVRLAorCQkJCSAgIFNFQVJDSF9DT01QTEVURSk7CisJCWFoY19xaW5maWZvX3JlcXVldWVfdGFpbChhaGMsIHBlbmRpbmdfc2NiKTsKKwkJYWhjX291dGIoYWhjLCBTQ0JQVFIsIHNhdmVkX3NjYnB0cik7CisJCWFoY19wcmludF9wYXRoKGFoYywgcGVuZGluZ19zY2IpOworCQlwcmludGYoIkRldmljZSBpcyBkaXNjb25uZWN0ZWQsIHJlLXF1ZXVpbmcgU0NCXG4iKTsKKwkJd2FpdCA9IFRSVUU7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlczolZDolZDolZDogVW5hYmxlIHRvIGRlbGl2ZXIgbWVzc2FnZVxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuKTsKKwkJcmV0dmFsID0gRkFJTEVEOworCQlnb3RvIGRvbmU7CisJfQorCitub19jbWQ6CisJLyoKKwkgKiBPdXIgYXNzdW1wdGlvbiBpcyB0aGF0IGlmIHdlIGRvbid0IGhhdmUgdGhlIGNvbW1hbmQsIG5vCisJICogcmVjb3ZlcnkgYWN0aW9uIHdhcyByZXF1aXJlZCwgc28gd2UgcmV0dXJuIHN1Y2Nlc3MuICBBZ2FpbiwKKwkgKiB0aGUgc2VtYW50aWNzIG9mIHRoZSBtaWQtbGF5ZXIgcmVjb3ZlcnkgZW5naW5lIGFyZSBub3QKKwkgKiB3ZWxsIGRlZmluZWQsIHNvIHRoaXMgbWF5IGNoYW5nZSBpbiB0aW1lLgorCSAqLworCXJldHZhbCA9IFNVQ0NFU1M7Citkb25lOgorCWlmIChwYXVzZWQpCisJCWFoY191bnBhdXNlKGFoYyk7CisJaWYgKHdhaXQpIHsKKwkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJCWludCByZXQ7CisKKwkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5mbGFncyB8PSBBSENfVVBfRUhfU0VNQVBIT1JFOworCQlzcGluX3VubG9ja19pcnEoJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKwkJaW5pdF90aW1lcigmdGltZXIpOworCQl0aW1lci5kYXRhID0gKHVfbG9uZylhaGM7CisJCXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDUgKiBIWik7CisJCXRpbWVyLmZ1bmN0aW9uID0gYWhjX2xpbnV4X3NlbV90aW1lb3V0OworCQlhZGRfdGltZXIoJnRpbWVyKTsKKwkJcHJpbnRmKCJSZWNvdmVyeSBjb2RlIHNsZWVwaW5nXG4iKTsKKwkJZG93bigmYWhjLT5wbGF0Zm9ybV9kYXRhLT5laF9zZW0pOworCQlwcmludGYoIlJlY292ZXJ5IGNvZGUgYXdha2VcbiIpOworICAgICAgICAJcmV0ID0gZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcmludGYoIlRpbWVyIEV4cGlyZWRcbiIpOworCQkJcmV0dmFsID0gRkFJTEVEOworCQl9CisJCXNwaW5fbG9ja19pcnEoJmFoYy0+cGxhdGZvcm1fZGF0YS0+c3Bpbl9sb2NrKTsKKwl9CisJYWhjX3NjaGVkdWxlX3J1bnEoYWhjKTsKKwlhaGNfbGludXhfcnVuX2NvbXBsZXRlX3F1ZXVlKGFoYyk7CisJYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKGFoYywgJnMpOworCXJldHVybiAocmV0dmFsKTsKK30KKwordm9pZAorYWhjX3BsYXRmb3JtX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UgKmRldjsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgbWF4Y2hhbm5lbDsKKwlpbnQgdGFyZ2V0OworCWludCBtYXh0YXJnZXQ7CisJaW50IGx1bjsKKwlpbnQgaTsKKworCW1heGNoYW5uZWwgPSAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSA/IDEgOiAwOworCW1heHRhcmdldCA9IChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpID8gMTUgOiA3OworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gbWF4Y2hhbm5lbDsgY2hhbm5lbCsrKSB7CisKKwkJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPD1tYXh0YXJnZXQ7IHRhcmdldCsrKSB7CisKKwkJCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgeworCQkJCXN0cnVjdCBhaGNfY21kICphY21kOworCisJCQkJZGV2ID0gYWhjX2xpbnV4X2dldF9kZXZpY2UoYWhjLCBjaGFubmVsLCB0YXJnZXQsCisJCQkJCQkJICAgbHVuLCAvKmFsbG9jKi9GQUxTRSk7CisJCQkJaWYgKGRldiA9PSBOVUxMKQorCQkJCQljb250aW51ZTsKKworCQkJCXByaW50ZigiRGV2USglZDolZDolZCk6ICIsCisJCQkJICAgICAgIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKwkJCQlpID0gMDsKKwkJCQlUQUlMUV9GT1JFQUNIKGFjbWQsICZkZXYtPmJ1c3lxLAorCQkJCQkgICAgICBhY21kX2xpbmtzLnRxZSkgeworCQkJCQlpZiAoaSsrID4gQUhDX1NDQl9NQVgpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJpbnRmKCIlZCB3YWl0aW5nXG4iLCBpKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWhjX2xpbnV4X2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0CithaGNfbGludXhfaW5pdCh2b2lkKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpbnQgcmMgPSBhaGNfbGludXhfZGV0ZWN0KCZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJYWhjX2xpbnV4X2V4aXQoKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyNlbHNlCisJc2NzaV9yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsICZhaWM3eHh4X2RyaXZlcl90ZW1wbGF0ZSk7CisJaWYgKGFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlLnByZXNlbnQgPT0gMCkgeworCQlzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLAorCQkJCSAgICAgICAmYWljN3h4eF9kcml2ZXJfdGVtcGxhdGUpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKworCXJldHVybiAoMCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FoY19saW51eF9leGl0KHZvaWQpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjOworCisJLyoKKwkgKiBTaHV0ZG93biBEViB0aHJlYWRzIGJlZm9yZSBnb2luZyBpbnRvIHRoZSBTQ1NJIG1pZC1sYXllci4KKwkgKiBUaGlzIGF2b2lkcyBzaXR1YXRpb25zIHdoZXJlIHRoZSBtaWQtbGF5ZXIgbG9ja3MgdGhlIGVudGlyZQorCSAqIGtlcm5lbCBzbyB0aGF0IHdhaXRpbmcgZm9yIG91ciBEViB0aHJlYWRzIHRvIGV4aXQgbGVhZHMKKwkgKiB0byBkZWFkbG9jay4KKwkgKi8KKwlUQUlMUV9GT1JFQUNIKGFoYywgJmFoY190YWlscSwgbGlua3MpIHsKKworCQlhaGNfbGludXhfa2lsbF9kdl90aHJlYWQoYWhjKTsKKwl9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkvKgorCSAqIEluIDIuNCB3ZSBoYXZlIHRvIHVucmVnaXN0ZXIgZnJvbSB0aGUgUENJIGNvcmUgX2FmdGVyXworCSAqIHVucmVnaXN0ZXJpbmcgZnJvbSB0aGUgc2NzaSBtaWRsYXllciB0byBhdm9pZCBkYW5nbGluZworCSAqIHJlZmVyZW5jZXMuCisJICovCisJc2NzaV91bnJlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKKyNlbmRpZgorCWFoY19saW51eF9wY2lfZXhpdCgpOworCWFoY19saW51eF9laXNhX2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoYWhjX2xpbnV4X2luaXQpOworbW9kdWxlX2V4aXQoYWhjX2xpbnV4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzYmQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKQEAgLTAsMCArMSwxMTMwIEBACisvKgorICogQWRhcHRlYyBBSUM3eHh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBKb2huIEF5Y29jaworICogICBUaGUgVW5pdmVyc2l0eSBvZiBDYWxnYXJ5IERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oIzE1MSAkCisgKgorICovCisjaWZuZGVmIF9BSUM3WFhYX0xJTlVYX0hfCisjZGVmaW5lIF9BSUM3WFhYX0xJTlVYX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+IC8qIEZvciB0YXNrbGV0IHN1cHBvcnQuICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBDb3JlIFNDU0kgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUlDX0xJQl9QUkVGSVggYWhjCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKy8qIE5hbWUgc3BhY2UgY29uZmxpY3Qgd2l0aCBCU0QgcXVldWUgbWFjcm9zICovCisjaWZkZWYgTElTVF9IRUFECisjdW5kZWYgTElTVF9IRUFECisjZW5kaWYKKworI2luY2x1ZGUgImNhbS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAic2NzaV9tZXNzYWdlLmgiCisjaW5jbHVkZSAiYWljbGliLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWJ1Z2dpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfREVCVUdfRU5BQkxFCisjaWZkZWYgQ09ORklHX0FJQzdYWFhfREVCVUdfTUFTSworI2RlZmluZSBBSENfREVCVUcgMQorI2RlZmluZSBBSENfREVCVUdfT1BUUyBDT05GSUdfQUlDN1hYWF9ERUJVR19NQVNLCisjZWxzZQorLyoKKyAqIENvbXBpbGUgaW4gZGVidWdnaW5nIGNvZGUsIGJ1dCBkbyBub3QgZW5hYmxlIGFueSBwcmludGZzLgorICovCisjZGVmaW5lIEFIQ19ERUJVRyAxCisjZW5kaWYKKy8qIE5vIGRlYnVnZ2luZyBjb2RlLiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZvcndhcmQgRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYWhjX3NvZnRjOwordHlwZWRlZiBzdHJ1Y3QgcGNpX2RldiAqYWhjX2Rldl9zb2Z0Y190OwordHlwZWRlZiBTY3NpX0NtbmQgICAgICAqYWhjX2lvX2N0eF90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCeXRlIE9yZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBhaGNfaHRvYmUxNih4KQljcHVfdG9fYmUxNih4KQorI2RlZmluZSBhaGNfaHRvYmUzMih4KQljcHVfdG9fYmUzMih4KQorI2RlZmluZSBhaGNfaHRvYmU2NCh4KQljcHVfdG9fYmU2NCh4KQorI2RlZmluZSBhaGNfaHRvbGUxNih4KQljcHVfdG9fbGUxNih4KQorI2RlZmluZSBhaGNfaHRvbGUzMih4KQljcHVfdG9fbGUzMih4KQorI2RlZmluZSBhaGNfaHRvbGU2NCh4KQljcHVfdG9fbGU2NCh4KQorCisjZGVmaW5lIGFoY19iZTE2dG9oKHgpCWJlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19iZTMydG9oKHgpCWJlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19iZTY0dG9oKHgpCWJlNjRfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19sZTE2dG9oKHgpCWxlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19sZTMydG9oKHgpCWxlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGFoY19sZTY0dG9oKHgpCWxlNjRfdG9fY3B1KHgpCisKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorCisjaWZuZGVmIEJJR19FTkRJQU4KKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisjZW5kaWYKKworI2lmbmRlZiBCWVRFX09SREVSCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjZGVmaW5lIEJZVEVfT1JERVIgQklHX0VORElBTgorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisjZW5kaWYgLyogQllURV9PUkRFUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25maWd1cmF0aW9uIERhdGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHVfaW50IGFpYzd4eHhfbm9fcHJvYmU7CitleHRlcm4gdV9pbnQgYWljN3h4eF9hbGxvd19tZW1pbzsKK2V4dGVybiBpbnQgYWljN3h4eF9kZXRlY3RfY29tcGxldGU7CitleHRlcm4gU2NzaV9Ib3N0X1RlbXBsYXRlIGFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQnVzIFNwYWNlL0RNQSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHVpbnQzMl90IGJ1c19zaXplX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJQlVTX1NQQUNFX01FTUlPLAorCUJVU19TUEFDRV9QSU8KK30gYnVzX3NwYWNlX3RhZ190OworCit0eXBlZGVmIHVuaW9uIHsKKwl1X2xvbmcJCSAgaW9wb3J0OworCXZvbGF0aWxlIHVpbnQ4X3QgX19pb21lbSAqbWFkZHI7Cit9IGJ1c19zcGFjZV9oYW5kbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYnVzX2RtYV9zZWdtZW50Cit7CisJZG1hX2FkZHJfdAlkc19hZGRyOworCWJ1c19zaXplX3QJZHNfbGVuOworfSBidXNfZG1hX3NlZ21lbnRfdDsKKworc3RydWN0IGFoY19saW51eF9kbWFfdGFnCit7CisJYnVzX3NpemVfdAlhbGlnbm1lbnQ7CisJYnVzX3NpemVfdAlib3VuZGFyeTsKKwlidXNfc2l6ZV90CW1heHNpemU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYWhjX2xpbnV4X2RtYV90YWcqIGJ1c19kbWFfdGFnX3Q7CisKK3N0cnVjdCBhaGNfbGludXhfZG1hbWFwCit7CisJZG1hX2FkZHJfdAlidXNfYWRkcjsKK307Cit0eXBlZGVmIHN0cnVjdCBhaGNfbGludXhfZG1hbWFwKiBidXNfZG1hbWFwX3Q7CisKK3R5cGVkZWYgaW50IGJ1c19kbWFfZmlsdGVyX3Qodm9pZCosIGRtYV9hZGRyX3QpOwordHlwZWRlZiB2b2lkIGJ1c19kbWFtYXBfY2FsbGJhY2tfdCh2b2lkICosIGJ1c19kbWFfc2VnbWVudF90ICosIGludCwgaW50KTsKKworI2RlZmluZSBCVVNfRE1BX1dBSVRPSwkJMHgwCisjZGVmaW5lIEJVU19ETUFfTk9XQUlUCQkweDEKKyNkZWZpbmUgQlVTX0RNQV9BTExPQ05PVwkweDIKKyNkZWZpbmUgQlVTX0RNQV9MT0FEX1NFR1MJMHg0CS8qCisJCQkJCSAqIEFyZ3VtZW50IGlzIGFuIFMvRyBsaXN0IG5vdAorCQkJCQkgKiBhIHNpbmdsZSBidWZmZXIuCisJCQkJCSAqLworCisjZGVmaW5lIEJVU19TUEFDRV9NQVhBRERSCTB4RkZGRkZGRkYKKyNkZWZpbmUgQlVTX1NQQUNFX01BWEFERFJfMzJCSVQJMHhGRkZGRkZGRgorI2RlZmluZSBCVVNfU1BBQ0VfTUFYU0laRV8zMkJJVAkweEZGRkZGRkZGCisKK2ludAlhaGNfZG1hX3RhZ19jcmVhdGUoc3RydWN0IGFoY19zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qcGFyZW50Ki8sCisJCQkgICBidXNfc2l6ZV90IC8qYWxpZ25tZW50Ki8sIGJ1c19zaXplX3QgLypib3VuZGFyeSovLAorCQkJICAgZG1hX2FkZHJfdCAvKmxvd2FkZHIqLywgZG1hX2FkZHJfdCAvKmhpZ2hhZGRyKi8sCisJCQkgICBidXNfZG1hX2ZpbHRlcl90Ki8qZmlsdGVyKi8sIHZvaWQgKi8qZmlsdGVyYXJnKi8sCisJCQkgICBidXNfc2l6ZV90IC8qbWF4c2l6ZSovLCBpbnQgLypuc2VnbWVudHMqLywKKwkJCSAgIGJ1c19zaXplX3QgLyptYXhzZWdzeiovLCBpbnQgLypmbGFncyovLAorCQkJICAgYnVzX2RtYV90YWdfdCAqLypkbWFfdGFncCovKTsKKwordm9pZAlhaGNfZG1hX3RhZ19kZXN0cm95KHN0cnVjdCBhaGNfc29mdGMgKiwgYnVzX2RtYV90YWdfdCAvKnRhZyovKTsKKworaW50CWFoY19kbWFtZW1fYWxsb2Moc3RydWN0IGFoY19zb2Z0YyAqLCBidXNfZG1hX3RhZ190IC8qZG1hdCovLAorCQkJIHZvaWQqKiAvKnZhZGRyKi8sIGludCAvKmZsYWdzKi8sCisJCQkgYnVzX2RtYW1hcF90KiAvKm1hcHAqLyk7CisKK3ZvaWQJYWhjX2RtYW1lbV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKiwgYnVzX2RtYV90YWdfdCAvKmRtYXQqLywKKwkJCXZvaWQqIC8qdmFkZHIqLywgYnVzX2RtYW1hcF90IC8qbWFwKi8pOworCit2b2lkCWFoY19kbWFtYXBfZGVzdHJveShzdHJ1Y3QgYWhjX3NvZnRjICosIGJ1c19kbWFfdGFnX3QgLyp0YWcqLywKKwkJCSAgIGJ1c19kbWFtYXBfdCAvKm1hcCovKTsKKworaW50CWFoY19kbWFtYXBfbG9hZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGJ1c19kbWFfdGFnX3QgLypkbWF0Ki8sCisJCQlidXNfZG1hbWFwX3QgLyptYXAqLywgdm9pZCAqIC8qYnVmKi8sCisJCQlidXNfc2l6ZV90IC8qYnVmbGVuKi8sIGJ1c19kbWFtYXBfY2FsbGJhY2tfdCAqLAorCQkJdm9pZCAqLypjYWxsYmFja19hcmcqLywgaW50IC8qZmxhZ3MqLyk7CisKK2ludAlhaGNfZG1hbWFwX3VubG9hZChzdHJ1Y3QgYWhjX3NvZnRjICosIGJ1c19kbWFfdGFnX3QsIGJ1c19kbWFtYXBfdCk7CisKKy8qCisgKiBPcGVyYXRpb25zIHBlcmZvcm1lZCBieSBhaGNfZG1hbWFwX3N5bmMoKS4KKyAqLworI2RlZmluZSBCVVNfRE1BU1lOQ19QUkVSRUFECTB4MDEJLyogcHJlLXJlYWQgc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIEJVU19ETUFTWU5DX1BPU1RSRUFECTB4MDIJLyogcG9zdC1yZWFkIHN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBCVVNfRE1BU1lOQ19QUkVXUklURQkweDA0CS8qIHByZS13cml0ZSBzeW5jaHJvbml6YXRpb24gKi8KKyNkZWZpbmUgQlVTX0RNQVNZTkNfUE9TVFdSSVRFCTB4MDgJLyogcG9zdC13cml0ZSBzeW5jaHJvbml6YXRpb24gKi8KKworLyoKKyAqIFhYWAorICogYWhjX2RtYW1hcF9zeW5jIGlzIG9ubHkgdXNlZCBvbiBidWZmZXJzIGFsbG9jYXRlZCB3aXRoCisgKiB0aGUgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBBUEkuICBBbHRob3VnaCBJJ20gbm90IHN1cmUgaG93CisgKiB0aGlzIHdvcmtzIG9uIGFyY2hpdGVjdHVyZXMgd2l0aCBhIHdyaXRlIGJ1ZmZlciwgTGludXggZG9lcworICogbm90IGhhdmUgYW4gQVBJIHRvIHN5bmMgImNvaGVyZW50IiBtZW1vcnkuICBQZXJoYXBzIHdlIG5lZWQKKyAqIHRvIGRvIGFuIG1iKCk/CisgKi8KKyNkZWZpbmUgYWhjX2RtYW1hcF9zeW5jKGFoYywgZG1hX3RhZywgZG1hbWFwLCBvZmZzZXQsIGxlbiwgb3ApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBUaW1lciBEYXRhU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0IGFoY190aW1lcl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbmNsdWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQKKyNkZWZpbmUgQUlDX0RFQlVHX1JFR0lTVEVSUyAxCisjZWxzZQorI2RlZmluZSBBSUNfREVCVUdfUkVHSVNURVJTIDAKKyNlbmRpZgorI2luY2x1ZGUgImFpYzd4eHguaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRpbWVyIEZhY2lsaXRpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgYWhjX3RpbWVyX2luaXQgaW5pdF90aW1lcgorI2RlZmluZSBhaGNfdGltZXJfc3RvcCBkZWxfdGltZXJfc3luYwordHlwZWRlZiB2b2lkIGFoY19saW51eF9jYWxsYmFja190ICh1X2xvbmcpOyAgCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfdGltZXJfcmVzZXQoYWhjX3RpbWVyX3QgKnRpbWVyLCBpbnQgdXNlYywKKwkJCQkgICAgIGFoY19jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NjYl90aW1lcl9yZXNldChzdHJ1Y3Qgc2NiICpzY2IsIHVfaW50IHVzZWMpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3RpbWVyX3Jlc2V0KGFoY190aW1lcl90ICp0aW1lciwgaW50IHVzZWMsIGFoY19jYWxsYmFja190ICpmdW5jLCB2b2lkICphcmcpCit7CisJc3RydWN0IGFoY19zb2Z0YyAqYWhjOworCisJYWhjID0gKHN0cnVjdCBhaGNfc29mdGMgKilhcmc7CisJZGVsX3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZGF0YSA9ICh1X2xvbmcpYXJnOworCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArICh1c2VjICogSFopLzEwMDAwMDA7CisJdGltZXItPmZ1bmN0aW9uID0gKGFoY19saW51eF9jYWxsYmFja190KilmdW5jOworCWFkZF90aW1lcih0aW1lcik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfc2NiX3RpbWVyX3Jlc2V0KHN0cnVjdCBzY2IgKnNjYiwgdV9pbnQgdXNlYykKK3sKKwltb2RfdGltZXIoJnNjYi0+aW9fY3R4LT5laF90aW1lb3V0LCBqaWZmaWVzICsgKHVzZWMgKiBIWikvMTAwMDAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTTVAgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIHx8IGRlZmluZWQoU0NTSV9IQVNfSE9TVF9MT0NLKSkKKyNkZWZpbmUgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyAxCisjZWxzZQorI2RlZmluZSBBSENfU0NTSV9IQVNfSE9TVF9MT0NLIDAKKyNlbmRpZgorCisjZGVmaW5lIEFJQzdYWFhfRFJJVkVSX1ZFUlNJT04gIjYuMi4zNiIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRnJvbnQgRW5kIFF1ZXVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGNhc3QgdGhlIExpbnV4IHN0cnVjdCBzY3NpX2NtbmQgdG8gc29tZXRoaW5nCisgKiB0aGF0IGFsbG93cyB1cyB0byB1c2UgdGhlIHF1ZXVlIG1hY3Jvcy4gIFRoZSBsaW51eCBzdHJ1Y3R1cmUgaGFzCisgKiBwbGVudHkgb2Ygc3BhY2UgdG8gaG9sZCB0aGUgbGlua3MgZmllbGRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBxdWV1ZQorICogbWFjcm9zLCBidXQgdGhlIHF1ZXVlIG1hY29ycyByZXF1aXJlIHRoZW0gdG8gaGF2ZSB0aGUgY29ycmVjdCB0eXBlLgorICovCitzdHJ1Y3QgYWhjX2NtZF9pbnRlcm5hbCB7CisJLyogQXJlYSBvd25lZCBieSB0aGUgTGludXggc2NzaSBsYXllci4gKi8KKwl1aW50OF90CXByaXZhdGVbb2Zmc2V0b2Yoc3RydWN0IHNjc2lfY21uZCwgU0NwLlN0YXR1cyldOworCXVuaW9uIHsKKwkJU1RBSUxRX0VOVFJZKGFoY19jbWQpCXN0ZTsKKwkJTElTVF9FTlRSWShhaGNfY21kKQlsZTsKKwkJVEFJTFFfRU5UUlkoYWhjX2NtZCkJdHFlOworCX0gbGlua3M7CisJdWludDMyX3QJCQllbmQ7Cit9OworCitzdHJ1Y3QgYWhjX2NtZCB7CisJdW5pb24geworCQlzdHJ1Y3QgYWhjX2NtZF9pbnRlcm5hbAlpY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kCXNjc2lfY21kOworCX0gdW47Cit9OworCisjZGVmaW5lIGFjbWRfaWNtZChjbWQpICgoY21kKS0+dW4uaWNtZCkKKyNkZWZpbmUgYWNtZF9zY3NpX2NtZChjbWQpICgoY21kKS0+dW4uc2NzaV9jbWQpCisjZGVmaW5lIGFjbWRfbGlua3MgdW4uaWNtZC5saW5rcworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldmljZSBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEEgcGVyIHByb2JlZCBkZXZpY2Ugc3RydWN0dXJlIHVzZWQgdG8gZGVhbCB3aXRoIHNvbWUgZXJyb3IgcmVjb3ZlcnkKKyAqIHNjZW5hcmlvcyB0aGF0IHRoZSBMaW51eCBtaWQtbGF5ZXIgY29kZSBqdXN0IGRvZXNuJ3Qga25vdyBob3cgdG8KKyAqIGhhbmRsZS4gIFRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciBhIGRldmljZSBvbmx5IGJlY29tZXMgcGVyc2lzdGVudAorICogYWZ0ZXIgYSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGlucXVpcnkgY29tbWFuZCB0byB0aGUgdGFyZ2V0IHdoZW4KKyAqIHRoYXQgaW5xdWlyeSBkYXRhIGluZGljYXRlcyBhIGx1biBpcyBwcmVzZW50LgorICovCitUQUlMUV9IRUFEKGFoY19idXN5cSwgYWhjX2NtZCk7Cit0eXBlZGVmIGVudW0geworCUFIQ19ERVZfVU5DT05GSUdVUkVECSA9IDB4MDEsCisJQUhDX0RFVl9GUkVFWkVfVElMX0VNUFRZID0gMHgwMiwgLyogRnJlZXplIHF1ZXVlIHVudGlsIGFjdGl2ZSA9PSAwICovCisJQUhDX0RFVl9USU1FUl9BQ1RJVkUJID0gMHgwNCwgLyogT3VyIHRpbWVyIGlzIGFjdGl2ZSAqLworCUFIQ19ERVZfT05fUlVOX0xJU1QJID0gMHgwOCwgLyogUXVldWVkIHRvIGJlIHJ1biBsYXRlciAqLworCUFIQ19ERVZfUV9CQVNJQwkJID0gMHgxMCwgLyogQWxsb3cgYmFzaWMgZGV2aWNlIHF1ZXVpbmcgKi8KKwlBSENfREVWX1FfVEFHR0VECSA9IDB4MjAsIC8qIEFsbG93IGZ1bGwgU0NTSTIgY29tbWFuZCBxdWV1ZWluZyAqLworCUFIQ19ERVZfUEVSSU9ESUNfT1RBRwkgPSAweDQwLCAvKiBTZW5kIE9UQUcgdG8gcHJldmVudCBzdGFydmF0aW9uICovCisJQUhDX0RFVl9TTEFWRV9DT05GSUdVUkVEID0gMHg4MAkgLyogc2xhdmVfY29uZmlndXJlKCkgaGFzIGJlZW4gY2FsbGVkICovCit9IGFoY19saW51eF9kZXZfZmxhZ3M7CisKK3N0cnVjdCBhaGNfbGludXhfdGFyZ2V0Oworc3RydWN0IGFoY19saW51eF9kZXZpY2UgeworCVRBSUxRX0VOVFJZKGFoY19saW51eF9kZXZpY2UpIGxpbmtzOworCXN0cnVjdAkJYWhjX2J1c3lxIGJ1c3lxOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjdXJyZW50bHkKKwkgKiBxdWV1ZWQgdG8gdGhlIGRldmljZS4KKwkgKi8KKwlpbnQJCQlhY3RpdmU7CisKKwkvKgorCSAqIFRoZSBjdXJyZW50bHkgYWxsb3dlZCBudW1iZXIgb2YgCisJICogdHJhbnNhY3Rpb25zIHRoYXQgY2FuIGJlIHF1ZXVlZCB0bworCSAqIHRoZSBkZXZpY2UuICBNdXN0IGJlIHNpZ25lZCBmb3IKKwkgKiBjb252ZXJzaW9uIGZyb20gdGFnZ2VkIHRvIHVudGFnZ2VkCisJICogbW9kZSB3aGVyZSB0aGUgZGV2aWNlIG1heSBoYXZlIG1vcmUKKwkgKiB0aGFuIG9uZSBvdXRzdGFuZGluZyBhY3RpdmUgdHJhbnNhY3Rpb24uCisJICovCisJaW50CQkJb3BlbmluZ3M7CisKKwkvKgorCSAqIEEgcG9zaXRpdmUgY291bnQgaW5kaWNhdGVzIHRoYXQgdGhpcworCSAqIGRldmljZSdzIHF1ZXVlIGlzIGhhbHRlZC4KKwkgKi8KKwl1X2ludAkJCXFmcm96ZW47CisJCisJLyoKKwkgKiBDdW11bGF0aXZlIGNvbW1hbmQgY291bnRlci4KKwkgKi8KKwl1X2xvbmcJCQljb21tYW5kc19pc3N1ZWQ7CisKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgdGFnZ2VkIHRyYW5zYWN0aW9ucyB3aGVuCisJICogcnVubmluZyBhdCBvdXIgY3VycmVudCBvcGVuaW5nIGxldmVsCisJICogdGhhdCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ5CisJICogdGhpcyBkZXZpY2Ugc2luY2UgdGhlIGxhc3QgUVVFVUUgRlVMTC4KKwkgKi8KKwl1X2ludAkJCXRhZ19zdWNjZXNzX2NvdW50OworI2RlZmluZSBBSENfVEFHX1NVQ0NFU1NfSU5URVJWQUwgNTAKKworCWFoY19saW51eF9kZXZfZmxhZ3MJZmxhZ3M7CisKKwkvKgorCSAqIFBlciBkZXZpY2UgdGltZXIuCisJICovCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisKKwkvKgorCSAqIFRoZSBoaWdoIGxpbWl0IGZvciB0aGUgdGFncyB2YXJpYWJsZS4KKwkgKi8KKwl1X2ludAkJCW1heHRhZ3M7CisKKwkvKgorCSAqIFRoZSBjb21wdXRlZCBudW1iZXIgb2YgdGFncyBvdXRzdGFuZGluZworCSAqIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IFFVRVVFIEZVTEwgZXZlbnQuCisJICovCisJdV9pbnQJCQl0YWdzX29uX2xhc3RfcXVldWVmdWxsOworCisJLyoKKwkgKiBIb3cgbWFueSB0aW1lcyB3ZSBoYXZlIHNlZW4gYSBxdWV1ZSBmdWxsCisJICogd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgdGFncy4gIFRoaXMgaXMgdXNlZAorCSAqIHRvIHN0b3Agb3VyIGFkYXB0aXZlIHF1ZXVlIGRlcHRoIGFsZ29yaXRobQorCSAqIG9uIGRldmljZXMgd2l0aCBhIGZpeGVkIG51bWJlciBvZiB0YWdzLgorCSAqLworCXVfaW50CQkJbGFzdF9xdWV1ZWZ1bGxfc2FtZV9jb3VudDsKKyNkZWZpbmUgQUhDX0xPQ0tfVEFHU19DT1VOVCA1MAorCisJLyoKKwkgKiBIb3cgbWFueSB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIHF1ZXVlZAorCSAqIHdpdGhvdXQgdGhlIGRldmljZSBnb2luZyBpZGxlLiAgV2UgdXNlCisJICogdGhpcyBzdGF0aXN0aWMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gaXNzdWUKKwkgKiBhbiBvcmRlcmVkIHRhZyB0byBwcmV2ZW50IHRyYW5zYWN0aW9uCisJICogc3RhcnZhdGlvbi4gIFRoaXMgc3RhdGlzdGljIGlzIG9ubHkgdXBkYXRlZAorCSAqIGlmIHRoZSBBSENfREVWX1BFUklPRElDX09UQUcgZmxhZyBpcyBzZXQKKwkgKiBvbiB0aGlzIGRldmljZS4KKwkgKi8KKwl1X2ludAkJCWNvbW1hbmRzX3NpbmNlX2lkbGVfb3Jfb3RhZzsKKyNkZWZpbmUgQUhDX09UQUdfVEhSRVNICTUwMAorCisJaW50CQkJbHVuOworCVNjc2lfRGV2aWNlCSAgICAgICAqc2NzaV9kZXZpY2U7CisJc3RydWN0CQkJYWhjX2xpbnV4X3RhcmdldCAqdGFyZ2V0OworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlBSENfRFZfUkVRVUlSRUQJCSA9IDB4MDEsCisJQUhDX0lOUV9WQUxJRAkJID0gMHgwMiwKKwlBSENfQkFTSUNfRFYJCSA9IDB4MDQsCisJQUhDX0VOSEFOQ0VEX0RWCQkgPSAweDA4Cit9IGFoY19saW51eF90YXJnX2ZsYWdzOworCisvKiBEViBTdGF0ZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhDX0RWX1NUQVRFX0VYSVQgPSAwLAorCUFIQ19EVl9TVEFURV9JTlFfU0hPUlRfQVNZTkMsCisJQUhDX0RWX1NUQVRFX0lOUV9BU1lOQywKKwlBSENfRFZfU1RBVEVfSU5RX0FTWU5DX1ZFUklGWSwKKwlBSENfRFZfU1RBVEVfVFVSLAorCUFIQ19EVl9TVEFURV9SRUJELAorCUFIQ19EVl9TVEFURV9JTlFfVkVSSUZZLAorCUFIQ19EVl9TVEFURV9XRUIsCisJQUhDX0RWX1NUQVRFX1JFQiwKKwlBSENfRFZfU1RBVEVfU1UsCisJQUhDX0RWX1NUQVRFX0JVU1kKK30gYWhjX2R2X3N0YXRlOworCitzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCB7CisJc3RydWN0IGFoY19saW51eF9kZXZpY2UJICpkZXZpY2VzW0FIQ19OVU1fTFVOU107CisJaW50CQkJICBjaGFubmVsOworCWludAkJCSAgdGFyZ2V0OworCWludAkJCSAgcmVmY291bnQ7CisJc3RydWN0IGFoY190cmFuc2luZm8JICBsYXN0X3RpbmZvOworCXN0cnVjdCBhaGNfc29mdGMJICphaGM7CisJYWhjX2xpbnV4X3RhcmdfZmxhZ3MJICBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhOworCS8qCisJICogVGhlIG5leHQgImZhbGxiYWNrIiBwZXJpb2QgdG8gdXNlIGZvciBuYXJyb3cvd2lkZSB0cmFuc2ZlcnMuCisJICovCisJdWludDhfdAkJCSAgZHZfbmV4dF9uYXJyb3dfcGVyaW9kOworCXVpbnQ4X3QJCQkgIGR2X25leHRfd2lkZV9wZXJpb2Q7CisJdWludDhfdAkJCSAgZHZfbWF4X3dpZHRoOworCXVpbnQ4X3QJCQkgIGR2X21heF9wcHJfb3B0aW9uczsKKwl1aW50OF90CQkJICBkdl9sYXN0X3Bwcl9vcHRpb25zOworCXVfaW50CQkJICBkdl9lY2hvX3NpemU7CisJYWhjX2R2X3N0YXRlCQkgIGR2X3N0YXRlOworCXVfaW50CQkJICBkdl9zdGF0ZV9yZXRyeTsKKwljaGFyCQkJICpkdl9idWZmZXI7CisJY2hhcgkJCSAqZHZfYnVmZmVyMTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKiogRGVmaW5pdGlvbnMgUmVxdWlyZWQgYnkgdGhlIENvcmUgKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogTnVtYmVyIG9mIFNHIHNlZ21lbnRzIHdlIHJlcXVpcmUuICBTbyBsb25nIGFzIHRoZSBTL0cgc2VnbWVudHMgZm9yCisgKiBhIHBhcnRpY3VsYXIgdHJhbnNhY3Rpb24gYXJlIGFsbG9jYXRlZCBpbiBhIHBoeXNpY2FsbHkgY29udGlndW91cworICogbWFubmVyIGFuZCBhcmUgYWxsb2NhdGVkIGJlbG93IDRHQiwgdGhlIG51bWJlciBvZiBTL0cgc2VnbWVudHMgaXMKKyAqIHVucmVzdHJpY3RlZC4KKyAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorLyoKKyAqIFdlIGR5bmFtaWNhbGx5IGFkanVzdCB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHByZS0yLjUga2VybmVscyB0bworICogYXZvaWQgZnJhZ21lbnRhdGlvbiBpc3N1ZXMgaW4gdGhlIFNDU0kgbWlkLWxheWVyJ3MgcHJpdmF0ZSBtZW1vcnkKKyAqIGFsbG9jYXRvci4gIFNlZSBhaWM3eHh4X29zbS5jIGFoY19saW51eF9zaXplX25zZWcoKSBmb3IgZGV0YWlscy4KKyAqLworZXh0ZXJuIHVfaW50IGFoY19saW51eF9uc2VnOworI2RlZmluZQlBSENfTlNFRyBhaGNfbGludXhfbnNlZworI2RlZmluZQlBSENfTElOVVhfTUlOX05TRUcgNjQKKyNlbHNlCisjZGVmaW5lCUFIQ19OU0VHIDEyOAorI2VuZGlmCisKKy8qCisgKiBQZXItU0NCIE9TTSBzdG9yYWdlLgorICovCit0eXBlZGVmIGVudW0geworCUFIQ19VUF9FSF9TRU1BUEhPUkUgPSAweDEKK30gYWhjX2xpbnV4X3NjYl9mbGFnczsKKworc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZQkqZGV2OworCWRtYV9hZGRyX3QJCSBidWZfYnVzYWRkcjsKKwl1aW50MzJfdAkJIHhmZXJfbGVuOworCXVpbnQzMl90CQkgc2Vuc2VfcmVzaWQ7CS8qIEF1dG8tU2Vuc2UgcmVzaWR1YWwgKi8KKwlhaGNfbGludXhfc2NiX2ZsYWdzCSBmbGFnczsKK307CisKKy8qCisgKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgdXNlZCBmb3IgZWFjaCBob3N0IGFkYXB0ZXIuICBBbGwgbWVtYmVycyBhcmUKKyAqIGFsaWduZWQgb24gYSBib3VuZGFyeSA+PSB0aGUgc2l6ZSBvZiB0aGUgbWVtYmVyIHRvIGhvbm9yIHRoZQorICogYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBvZiB0aGUgdmFyaW91cyBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5CisgKiB0aGlzIGRyaXZlci4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBSENfRFZfV0FJVF9TSU1RX0VNUFRZCSA9IDB4MDEsCisJQUhDX0RWX1dBSVRfU0lNUV9SRUxFQVNFID0gMHgwMiwKKwlBSENfRFZfQUNUSVZFCQkgPSAweDA0LAorCUFIQ19EVl9TSFVURE9XTgkJID0gMHgwOCwKKwlBSENfUlVOX0NNUExUX1FfVElNRVIJID0gMHgxMAorfSBhaGNfbGludXhfc29mdGNfZmxhZ3M7CisKK1RBSUxRX0hFQUQoYWhjX2NvbXBsZXRlcSwgYWhjX2NtZCk7CisKK3N0cnVjdCBhaGNfcGxhdGZvcm1fZGF0YSB7CisJLyoKKwkgKiBGaWVsZHMgYWNjZXNzZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKwkgKi8KKwlzdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCAqdGFyZ2V0c1tBSENfTlVNX1RBUkdFVFNdOyAKKwlUQUlMUV9IRUFEKCwgYWhjX2xpbnV4X2RldmljZSkgZGV2aWNlX3J1bnE7CisJc3RydWN0IGFoY19jb21wbGV0ZXEJIGNvbXBsZXRlcTsKKworCXNwaW5sb2NrX3QJCSBzcGluX2xvY2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CSBydW5xX3Rhc2tsZXQ7CisJdV9pbnQJCQkgcWZyb3plbjsKKwlwaWRfdAkJCSBkdl9waWQ7CisJc3RydWN0IHRpbWVyX2xpc3QJIGNvbXBsZXRlcV90aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgcmVzZXRfdGltZXI7CisJc3RydWN0IHNlbWFwaG9yZQkgZWhfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUJIGR2X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlCSBkdl9jbWRfc2VtOwkvKiBYWFggVGhpcyBuZWVkcyB0byBiZSBpbgorCQkJCQkJICogdGhlIHRhcmdldCBzdHJ1Y3QKKwkJCQkJCSAqLworCXN0cnVjdCBzY3NpX2RldmljZQkqZHZfc2NzaV9kZXY7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICAgKmhvc3Q7CQkvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLworI2RlZmluZSBBSENfTElOVVhfTk9JUlEJKCh1aW50MzJfdCl+MCkKKwl1aW50MzJfdAkJIGlycTsJCS8qIElSUSBmb3IgdGhpcyBhZGFwdGVyICovCisJdWludDMyX3QJCSBiaW9zX2FkZHJlc3M7CisJdWludDMyX3QJCSBtZW1fYnVzYWRkcjsJLyogTWVtIEJhc2UgQWRkciAqLworCXVpbnQ2NF90CQkgaHdfZG1hX21hc2s7CisJYWhjX2xpbnV4X3NvZnRjX2ZsYWdzCSBmbGFnczsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBPUyBVdGlsaXR5IFdyYXBwZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIHByaW50ZiBwcmludGsKKyNkZWZpbmUgTV9OT1dBSVQgR0ZQX0FUT01JQworI2RlZmluZSBNX1dBSVRPSyAwCisjZGVmaW5lIG1hbGxvYyhzaXplLCB0eXBlLCBmbGFncykga21hbGxvYyhzaXplLCBmbGFncykKKyNkZWZpbmUgZnJlZShwdHIsIHR5cGUpIGtmcmVlKHB0cikKKworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2RlbGF5KGxvbmcpOworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19kZWxheShsb25nIHVzZWMpCit7CisJLyoKKwkgKiB1ZGVsYXkgb24gTGludXggY2FuIGhhdmUgcHJvYmxlbXMgZm9yCisJICogbXVsdGktbWlsbGlzZWNvbmQgd2FpdHMuICBXYWl0IGF0IG1vc3QKKwkgKiAxMDI0dXMgcGVyIGNhbGwuCisJICovCisJd2hpbGUgKHVzZWMgPiAwKSB7CisJCXVkZWxheSh1c2VjICUgMTAyNCk7CisJCXVzZWMgLT0gMTAyNDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExvdyBMZXZlbCBJL08gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB1aW50OF90IGFoY19pbmIoc3RydWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0KTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19vdXRiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX291dHNiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwKKwkJCSAgICAgICB1aW50OF90ICosIGludCBjb3VudCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfaW5zYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsCisJCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOworCitzdGF0aWMgX19pbmxpbmUgdWludDhfdAorYWhjX2luYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQpCit7CisJdWludDhfdCB4OworCisJaWYgKGFoYy0+dGFnID09IEJVU19TUEFDRV9NRU1JTykgeworCQl4ID0gcmVhZGIoYWhjLT5ic2gubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQl4ID0gaW5iKGFoYy0+YnNoLmlvcG9ydCArIHBvcnQpOworCX0KKwltYigpOworCXJldHVybiAoeCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfb3V0YihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsIHVpbnQ4X3QgdmFsKQoreworCWlmIChhaGMtPnRhZyA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJd3JpdGViKHZhbCwgYWhjLT5ic2gubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQlvdXRiKHZhbCwgYWhjLT5ic2guaW9wb3J0ICsgcG9ydCk7CisJfQorCW1iKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfb3V0c2Ioc3RydWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0LCB1aW50OF90ICphcnJheSwgaW50IGNvdW50KQoreworCWludCBpOworCisJLyoKKwkgKiBUaGVyZSBpcyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzIG9uIExpbnV4CisJICogYnV0IHdlIGRvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZyBzcGVlZCBjcml0aWNhbCBhbmQgdGhpcworCSAqIHNob3VsZCB3b3JrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlhaGNfb3V0YihhaGMsIHBvcnQsICphcnJheSsrKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19pbnNiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCAqYXJyYXksIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogVGhlcmUgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBvbiBMaW51eAorCSAqIGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgc3BlZWQgY3JpdGljYWwgYW5kIHRoaXMKKwkgKiBzaG91bGQgd29yay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJKmFycmF5KysgPSBhaGNfaW5iKGFoYywgcG9ydCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQJCWFoY19saW51eF9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJU2NzaV9Ib3N0X1RlbXBsYXRlICopOworCit1aW50NjRfdAlhaGNfbGludXhfZ2V0X21lbXNpemUodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJldHR5IFByaW50aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW5mb19zdHIgeworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgbGVuZ3RoOworCW9mZl90IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKwordm9pZAlhaGNfZm9ybWF0X3RyYW5zaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCisJCQkgICAgIHN0cnVjdCBhaGNfdHJhbnNpbmZvICp0aW5mbyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NraW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NrIHByb3RlY3RpbmcgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbG9ja2luaXQoc3RydWN0IGFoY19zb2Z0YyAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICosIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKKworLyogTG9jayBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBvZiB0aGUgYWJvdmUgbG9jayBpbiBtaWRsYXllciBlbnRyeSBwb2ludHMuICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX21pZGxheWVyX2VudHJ5cG9pbnRfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncyk7CisKKy8qIExvY2sgaGVsZCBkdXJpbmcgY29tbWFuZCBjb21wZWxldGlvbiB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19kb25lX2xvY2tpbml0KHN0cnVjdCBhaGNfc29mdGMgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfZG9uZV9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2RvbmVfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCisvKiBMb2NrIGhlbGQgZHVyaW5nIGFoY19saXN0IG1hbmlwdWxhdGlvbiBhbmQgYWhjIHNvZnRjIGZyZWVzICovCitleHRlcm4gc3BpbmxvY2tfdCBhaGNfbGlzdF9zcGlubG9jazsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19saXN0X2xvY2tpbml0KHZvaWQpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncyk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xvY2tpbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlzcGluX2xvY2tfaW5pdCgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xvY2soc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfdW5sb2NrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhjLT5wbGF0Zm9ybV9kYXRhLT5zcGluX2xvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbWlkbGF5ZXJfZW50cnlwb2ludF9sb2NrKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJLyoKKwkgKiBJbiAyLjUuWCBhbmQgc29tZSAyLjQuWCB2ZXJzaW9ucywgdGhlIG1pZGxheWVyIHRha2VzIG91cgorCSAqIGxvY2sganVzdCBiZWZvcmUgY2FsbGluZyB1cywgc28gd2UgYXZvaWQgbG9ja2luZyBhZ2Fpbi4KKwkgKiBGb3Igb3RoZXIga2VybmVsIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuCisJICoganVzdCBiZWZvcmUgb3VyIGVudHJ5IHBvaW50IGlzIGNhbGxlZC4gIEluIHRoaXMgY2FzZSwgd2UKKwkgKiB0cmFkZSB0aGUgaW9fcmVxdWVzdF9sb2NrIGZvciBvdXIgcGVyLXNvZnRjIGxvY2suCisJICovCisjaWYgQUhDX1NDU0lfSEFTX0hPU1RfTE9DSyA9PSAwCisJc3Bpbl91bmxvY2soJmlvX3JlcXVlc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19taWRsYXllcl9lbnRyeXBvaW50X3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fdW5sb2NrKCZhaGMtPnBsYXRmb3JtX2RhdGEtPnNwaW5fbG9jayk7CisJc3Bpbl9sb2NrKCZpb19yZXF1ZXN0X2xvY2spOworI2VuZGlmCit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfZG9uZV9sb2NraW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJLyoKKwkgKiBJbiAyLjUuWCwgb3VyIG93biBsb2NrIGlzIGhlbGQgZHVyaW5nIGNvbXBsZXRpb25zLgorCSAqIEluIHByZXZpb3VzIHZlcnNpb25zLCB0aGUgaW9fcmVxdWVzdF9sb2NrIGlzIHVzZWQuCisJICogSW4gZWl0aGVyIGNhc2UsIHdlIGNhbid0IGluaXRpYWxpemUgdGhpcyBsb2NrIGFnYWluLgorCSAqLworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2RvbmVfbG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fbG9ja19pcnFzYXZlKCZpb19yZXF1ZXN0X2xvY2ssICpmbGFncyk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19kb25lX3VubG9jayhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworI2lmIEFIQ19TQ1NJX0hBU19IT1NUX0xPQ0sgPT0gMAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3JlcXVlc3RfbG9jaywgKmZsYWdzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xpc3RfbG9ja2luaXQodm9pZCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmYWhjX2xpc3Rfc3BpbmxvY2spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX2xpc3RfbG9jayh1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWhjX2xpc3Rfc3BpbmxvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbGlzdF91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWhjX2xpc3Rfc3BpbmxvY2ssICpmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBEZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUENJTV94eHg6IG1hc2sgdG8gbG9jYXRlIHN1YmZpZWxkIGluIHJlZ2lzdGVyCisgKiBQQ0lSX3h4eDogY29uZmlnIHJlZ2lzdGVyIG9mZnNldAorICogUENJQ194eHg6IGRldmljZSBjbGFzcworICogUENJU194eHg6IGRldmljZSBzdWJjbGFzcworICogUENJUF94eHg6IGRldmljZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UKKyAqIFBDSVZfeHh4OiBQQ0kgdmVuZG9yIElEIChvbmx5IHJlcXVpcmVkIHRvIGZpeHVwIGFuY2llbnQgZGV2aWNlcykKKyAqIFBDSURfeHh4OiBkZXZpY2UgSUQKKyAqLworI2RlZmluZSBQQ0lSX0RFVlZFTkRPUgkJMHgwMAorI2RlZmluZSBQQ0lSX1ZFTkRPUgkJMHgwMAorI2RlZmluZSBQQ0lSX0RFVklDRQkJMHgwMgorI2RlZmluZSBQQ0lSX0NPTU1BTkQJCTB4MDQKKyNkZWZpbmUgUENJTV9DTURfUE9SVEVOCQkweDAwMDEKKyNkZWZpbmUgUENJTV9DTURfTUVNRU4JCTB4MDAwMgorI2RlZmluZSBQQ0lNX0NNRF9CVVNNQVNURVJFTgkweDAwMDQKKyNkZWZpbmUgUENJTV9DTURfTVdSSUNFTgkweDAwMTAKKyNkZWZpbmUgUENJTV9DTURfUEVSUkVTUEVOCTB4MDA0MAorI2RlZmluZQlQQ0lNX0NNRF9TRVJSRVNQRU4JMHgwMTAwCisjZGVmaW5lIFBDSVJfU1RBVFVTCQkweDA2CisjZGVmaW5lIFBDSVJfUkVWSUQJCTB4MDgKKyNkZWZpbmUgUENJUl9QUk9HSUYJCTB4MDkKKyNkZWZpbmUgUENJUl9TVUJDTEFTUwkJMHgwYQorI2RlZmluZSBQQ0lSX0NMQVNTCQkweDBiCisjZGVmaW5lIFBDSVJfQ0FDSEVMTlNaCQkweDBjCisjZGVmaW5lIFBDSVJfTEFUVElNRVIJCTB4MGQKKyNkZWZpbmUgUENJUl9IRUFERVJUWVBFCQkweDBlCisjZGVmaW5lIFBDSU1fTUZERVYJCTB4ODAKKyNkZWZpbmUgUENJUl9CSVNUCQkweDBmCisjZGVmaW5lIFBDSVJfQ0FQX1BUUgkJMHgzNAorCisvKiBjb25maWcgcmVnaXN0ZXJzIGZvciBoZWFkZXIgdHlwZSAwIGRldmljZXMgKi8KKyNkZWZpbmUgUENJUl9NQVBTCTB4MTAKKyNkZWZpbmUgUENJUl9TVUJWRU5EXzAJMHgyYworI2RlZmluZSBQQ0lSX1NVQkRFVl8wCTB4MmUKKworZXh0ZXJuIHN0cnVjdCBwY2lfZHJpdmVyIGFpYzd4eHhfcGNpX2RyaXZlcjsKKwordHlwZWRlZiBlbnVtCit7CisJQUhDX1BPV0VSX1NUQVRFX0QwLAorCUFIQ19QT1dFUl9TVEFURV9EMSwKKwlBSENfUE9XRVJfU1RBVEVfRDIsCisJQUhDX1BPV0VSX1NUQVRFX0QzCit9IGFoY19wb3dlcl9zdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkwvRUlTQSBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApIFwKKyAgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSkgXAorICAmJiAoIWRlZmluZWQoQ09ORklHX0VJU0EpKSkKKyNkZWZpbmUgQ09ORklHX0VJU0EKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VJU0EKK2V4dGVybiB1aW50MzJfdCBhaWM3eHh4X3Byb2JlX2Vpc2Ffdmw7CitpbnQJCQkgYWhjX2xpbnV4X2Vpc2FfaW5pdCh2b2lkKTsKK3ZvaWQJCQkgYWhjX2xpbnV4X2Vpc2FfZXhpdCh2b2lkKTsKK2ludAkJCSBhaWM3NzcwX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCQkgICAgICAgdV9pbnQgcG9ydCk7CitpbnQJCQkgYWljNzc3MF9tYXBfaW50KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgaXJxKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAlhaGNfbGludXhfZWlzYV9pbml0KHZvaWQpIHsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAlhaGNfbGludXhfZWlzYV9leGl0KHZvaWQpIHsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19QQ0kKK2ludAkJCSBhaGNfbGludXhfcGNpX2luaXQodm9pZCk7Cit2b2lkCQkJIGFoY19saW51eF9wY2lfZXhpdCh2b2lkKTsKK2ludAkJCSBhaGNfcGNpX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK2ludAkJCSBhaGNfcGNpX21hcF9pbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19wY2lfcmVhZF9jb25maWcoYWhjX2Rldl9zb2Z0Y190IHBjaSwKKwkJCQkJICAgICBpbnQgcmVnLCBpbnQgd2lkdGgpOworCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoY19wY2lfcmVhZF9jb25maWcoYWhjX2Rldl9zb2Z0Y190IHBjaSwgaW50IHJlZywgaW50IHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIDE6CisJeworCQl1aW50OF90IHJldHZhbDsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIHJlZywgJnJldHZhbCk7CisJCXJldHVybiAocmV0dmFsKTsKKwl9CisJY2FzZSAyOgorCXsKKwkJdWludDE2X3QgcmV0dmFsOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIHJlZywgJnJldHZhbCk7CisJCXJldHVybiAocmV0dmFsKTsKKwl9CisJY2FzZSA0OgorCXsKKwkJdWludDMyX3QgcmV0dmFsOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWRlZmF1bHQ6CisJCXBhbmljKCJhaGNfcGNpX3JlYWRfY29uZmlnOiBSZWFkIHNpemUgdG9vIGJpZyIpOworCQkvKiBOT1RSRUFDSEVEICovCisJCXJldHVybiAoMCk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGNfZGV2X3NvZnRjX3QgcGNpLAorCQkJCQkgIGludCByZWcsIHVpbnQzMl90IHZhbHVlLAorCQkJCQkgIGludCB3aWR0aCk7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGNfZGV2X3NvZnRjX3QgcGNpLCBpbnQgcmVnLCB1aW50MzJfdCB2YWx1ZSwgaW50IHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIDE6CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwljYXNlIDI6CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoImFoY19wY2lfd3JpdGVfY29uZmlnOiBXcml0ZSBzaXplIHRvbyBiaWciKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKworc3RhdGljIF9faW5saW5lIGludCBhaGNfZ2V0X3BjaV9mdW5jdGlvbihhaGNfZGV2X3NvZnRjX3QpOworc3RhdGljIF9faW5saW5lIGludAorYWhjX2dldF9wY2lfZnVuY3Rpb24oYWhjX2Rldl9zb2Z0Y190IHBjaSkKK3sKKwlyZXR1cm4gKFBDSV9GVU5DKHBjaS0+ZGV2Zm4pKTsKK30KKworc3RhdGljIF9faW5saW5lIGludCBhaGNfZ2V0X3BjaV9zbG90KGFoY19kZXZfc29mdGNfdCk7CitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfZ2V0X3BjaV9zbG90KGFoY19kZXZfc29mdGNfdCBwY2kpCit7CisJcmV0dXJuIChQQ0lfU0xPVChwY2ktPmRldmZuKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhjX2dldF9wY2lfYnVzKGFoY19kZXZfc29mdGNfdCk7CitzdGF0aWMgX19pbmxpbmUgaW50CithaGNfZ2V0X3BjaV9idXMoYWhjX2Rldl9zb2Z0Y190IHBjaSkKK3sKKwlyZXR1cm4gKHBjaS0+YnVzLT5udW1iZXIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGFoY19saW51eF9wY2lfaW5pdCh2b2lkKSB7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWhjX2xpbnV4X3BjaV9leGl0KHZvaWQpIHsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhzdHJ1Y3QgYWhjX3NvZnRjICopOworc3RhdGljIF9faW5saW5lIHZvaWQKK2FoY19mbHVzaF9kZXZpY2Vfd3JpdGVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwkvKiBYWFggSXMgdGhpcyBzdWZmaWNpZW50IGZvciBhbGwgYXJjaGl0ZWN0dXJlcz8/PyAqLworCWFoY19pbmIoYWhjLCBJTlRTVEFUKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvYyBGUyBTdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKK2ludAlhaGNfbGludXhfcHJvY19pbmZvKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50LCBpbnQpOworI2Vsc2UKK2ludAlhaGNfbGludXhfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLAorCQkJICAgIG9mZl90LCBpbnQsIGludCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEb21haW4gVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUhDX0RWX0NNRChjbWQpICgoY21kKS0+c2NzaV9kb25lID09IGFoY19saW51eF9kdl9jb21wbGV0ZSkKKyNkZWZpbmUgQUhDX0RWX1NJTVFfRlJPWkVOKGFoYykJCQkJCVwKKwkoKCgoYWhjKS0+cGxhdGZvcm1fZGF0YS0+ZmxhZ3MgJiBBSENfRFZfQUNUSVZFKSAhPSAwKQlcCisJICYmIChhaGMpLT5wbGF0Zm9ybV9kYXRhLT5xZnJvemVuID09IDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2FjdGlvbiBBY2Nlc3MgV3JhcHBlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19jbWRfc2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhTY3NpX0NtbmQgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqLCB1aW50MzJfdCk7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKiwgdWludDMyX3QpOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NiICosIHVpbnQzMl90KTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19nZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhjX2NtZF9nZXRfc2NzaV9zdGF0dXMoU2NzaV9DbW5kICpjbWQpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoY19nZXRfc2NzaV9zdGF0dXMoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zZXRfdHJhbnNhY3Rpb25fdGFnKHN0cnVjdCBzY2IgKiwgaW50LCB1X2ludCk7CitzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoY19nZXRfdHJhbnNmZXJfbGVuZ3RoKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgaW50IGFoY19nZXRfdHJhbnNmZXJfZGlyKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfc2V0X3Jlc2lkdWFsKHN0cnVjdCBzY2IgKiwgdV9sb25nKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19zZXRfc2Vuc2VfcmVzaWR1YWwoc3RydWN0IHNjYiAqc2NiLCB1X2xvbmcgcmVzaWQpOworc3RhdGljIF9faW5saW5lIHVfbG9uZyBhaGNfZ2V0X3Jlc2lkdWFsKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdV9sb25nIGFoY19nZXRfc2Vuc2VfcmVzaWR1YWwoc3RydWN0IHNjYiAqKTsKK3N0YXRpYyBfX2lubGluZSBpbnQgYWhjX3BlcmZvcm1fYXV0b3NlbnNlKHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhjX2dldF9zZW5zZV9idWZzaXplKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJICAgICAgIHN0cnVjdCBzY2IgKik7CitzdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbm90aWZ5X3hmZXJfc2V0dGluZ3NfY2hhbmdlKHN0cnVjdCBhaGNfc29mdGMgKiwKKwkJCQkJCSAgICAgc3RydWN0IGFoY19kZXZpbmZvICopOworc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3BsYXRmb3JtX3NjYl9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJICAgc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIGFoY19mcmVlemVfc2NiKHN0cnVjdCBzY2IgKnNjYik7CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfY21kX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQsIHVpbnQzMl90IHN0YXR1cykKK3sKKwljbWQtPnJlc3VsdCAmPSB+KENBTV9TVEFUVVNfTUFTSyA8PCAxNik7CisJY21kLT5yZXN1bHQgfD0gc3RhdHVzIDw8IDE2OworfQorCitzdGF0aWMgX19pbmxpbmUKK3ZvaWQgYWhjX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc3RydWN0IHNjYiAqc2NiLCB1aW50MzJfdCBzdGF0dXMpCit7CisJYWhjX2NtZF9zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYi0+aW9fY3R4LHN0YXR1cyk7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCwgdWludDMyX3Qgc3RhdHVzKQoreworCWNtZC0+cmVzdWx0ICY9IH4weEZGRkY7CisJY21kLT5yZXN1bHQgfD0gc3RhdHVzOworfQorCitzdGF0aWMgX19pbmxpbmUKK3ZvaWQgYWhjX3NldF9zY3NpX3N0YXR1cyhzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHN0YXR1cykKK3sKKwlhaGNfY21kX3NldF9zY3NpX3N0YXR1cyhzY2ItPmlvX2N0eCwgc3RhdHVzKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoU2NzaV9DbW5kICpjbWQpCit7CisJcmV0dXJuICgoY21kLT5yZXN1bHQgPj4gMTYpICYgQ0FNX1NUQVRVU19NQVNLKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfZ2V0X3RyYW5zYWN0aW9uX3N0YXR1cyhzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChhaGNfY21kX2dldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLT5pb19jdHgpKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfY21kX2dldF9zY3NpX3N0YXR1cyhTY3NpX0NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gKGNtZC0+cmVzdWx0ICYgMHhGRkZGKTsKK30KKworc3RhdGljIF9faW5saW5lCit1aW50MzJfdCBhaGNfZ2V0X3Njc2lfc3RhdHVzKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKGFoY19jbWRfZ2V0X3Njc2lfc3RhdHVzKHNjYi0+aW9fY3R4KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfc2V0X3RyYW5zYWN0aW9uX3RhZyhzdHJ1Y3Qgc2NiICpzY2IsIGludCBlbmFibGVkLCB1X2ludCB0eXBlKQoreworCS8qCisJICogTm90aGluZyB0byBkbyBmb3IgbGludXggYXMgdGhlIGluY29taW5nIHRyYW5zYWN0aW9uCisJICogaGFzIG5vIGNvbmNlcHQgb2YgdGFnL25vbiB0YWdnZWQsIGV0Yy4KKwkgKi8KK30KKworc3RhdGljIF9faW5saW5lCit1X2xvbmcgYWhjX2dldF90cmFuc2Zlcl9sZW5ndGgoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5wbGF0Zm9ybV9kYXRhLT54ZmVyX2xlbik7Cit9CisKK3N0YXRpYyBfX2lubGluZQoraW50IGFoY19nZXRfdHJhbnNmZXJfZGlyKHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNjYi0+aW9fY3R4LT5zY19kYXRhX2RpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBfX2lubGluZQordm9pZCBhaGNfc2V0X3Jlc2lkdWFsKHN0cnVjdCBzY2IgKnNjYiwgdV9sb25nIHJlc2lkKQoreworCXNjYi0+aW9fY3R4LT5yZXNpZCA9IHJlc2lkOworfQorCitzdGF0aWMgX19pbmxpbmUKK3ZvaWQgYWhjX3NldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IsIHVfbG9uZyByZXNpZCkKK3sKKwlzY2ItPnBsYXRmb3JtX2RhdGEtPnNlbnNlX3Jlc2lkID0gcmVzaWQ7Cit9CisKK3N0YXRpYyBfX2lubGluZQordV9sb25nIGFoY19nZXRfcmVzaWR1YWwoc3RydWN0IHNjYiAqc2NiKQoreworCXJldHVybiAoc2NiLT5pb19jdHgtPnJlc2lkKTsKK30KKworc3RhdGljIF9faW5saW5lCit1X2xvbmcgYWhjX2dldF9zZW5zZV9yZXNpZHVhbChzdHJ1Y3Qgc2NiICpzY2IpCit7CisJcmV0dXJuIChzY2ItPnBsYXRmb3JtX2RhdGEtPnNlbnNlX3Jlc2lkKTsKK30KKworc3RhdGljIF9faW5saW5lCitpbnQgYWhjX3BlcmZvcm1fYXV0b3NlbnNlKHN0cnVjdCBzY2IgKnNjYikKK3sKKwkvKgorCSAqIFdlIGFsd2F5cyBwZXJmb3JtIGF1dG9zZW5zZSBpbiBMaW51eC4KKwkgKiBPbiBvdGhlciBwbGF0Zm9ybXMgdGhpcyBpcyBzZXQgb24gYQorCSAqIHBlci10cmFuc2FjdGlvbiBiYXNpcy4KKwkgKi8KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdWludDMyX3QKK2FoY19nZXRfc2Vuc2VfYnVmc2l6ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfbm90aWZ5X3hmZXJfc2V0dGluZ3NfY2hhbmdlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQlzdHJ1Y3QgYWhjX2RldmluZm8gKmRldmluZm8pCit7CisJLyogTm90aGluZyB0byBkbyBoZXJlIGZvciBsaW51eCAqLworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhjX3BsYXRmb3JtX3NjYl9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCWFoYy0+ZmxhZ3MgJj0gfkFIQ19SRVNPVVJDRV9TSE9SVEFHRTsKK30KKworaW50CWFoY19wbGF0Zm9ybV9hbGxvYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHZvaWQgKnBsYXRmb3JtX2FyZyk7Cit2b2lkCWFoY19wbGF0Zm9ybV9mcmVlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Cit2b2lkCWFoY19wbGF0Zm9ybV9mcmVlemVfZGV2cShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYik7CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCithaGNfZnJlZXplX3NjYihzdHJ1Y3Qgc2NiICpzY2IpCit7CisJaWYgKChzY2ItPmlvX2N0eC0+cmVzdWx0ICYgKENBTV9ERVZfUUZSWk4gPDwgMTYpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2NiLT5pb19jdHgtPnJlc3VsdCB8PSBDQU1fREVWX1FGUlpOIDw8IDE2OworICAgICAgICAgICAgICAgIHNjYi0+cGxhdGZvcm1fZGF0YS0+ZGV2LT5xZnJvemVuKys7CisgICAgICAgIH0KK30KKwordm9pZAlhaGNfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBhaGNfcXVldWVfYWxnKTsKK2ludAlhaGNfcGxhdGZvcm1fYWJvcnRfc2NicyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCB0YXJnZXQsCisJCQkJY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJcm9sZV90IHJvbGUsIHVpbnQzMl90IHN0YXR1cyk7CitpcnFyZXR1cm5fdAorCWFoY19saW51eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwordm9pZAlhaGNfcGxhdGZvcm1fZmx1c2h3b3JrKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitpbnQJYWhjX3NvZnRjX2NvbXAoc3RydWN0IGFoY19zb2Z0YyAqLCBzdHJ1Y3QgYWhjX3NvZnRjICopOwordm9pZAlhaGNfZG9uZShzdHJ1Y3QgYWhjX3NvZnRjKiwgc3RydWN0IHNjYiopOwordm9pZAlhaGNfc2VuZF9hc3luYyhzdHJ1Y3QgYWhjX3NvZnRjICosIGNoYXIgY2hhbm5lbCwKKwkJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlLCB2b2lkICopOwordm9pZAlhaGNfcHJpbnRfcGF0aChzdHJ1Y3QgYWhjX3NvZnRjICosIHN0cnVjdCBzY2IgKik7Cit2b2lkCWFoY19wbGF0Zm9ybV9kdW1wX2NhcmRfc3RhdGUoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgQUhDX1BDSV9DT05GSUcgMQorI2Vsc2UKKyNkZWZpbmUgQUhDX1BDSV9DT05GSUcgMAorI2VuZGlmCisjZGVmaW5lIGJvb3R2ZXJib3NlIGFpYzd4eHhfdmVyYm9zZQorZXh0ZXJuIHVfaW50IGFpYzd4eHhfdmVyYm9zZTsKKyNlbmRpZiAvKiBfQUlDN1hYWF9MSU5VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY2NzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBMaW51eCBkcml2ZXIgYXR0YWNobWVudCBnbHVlIGZvciBQQ0kgYmFzZWQgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMjNDcgJAorICovCisKKyNpbmNsdWRlICJhaWM3eHh4X29zbS5oIgorI2luY2x1ZGUgImFpYzd4eHhfcGNpLmgiCisKK3N0YXRpYyBpbnQJYWhjX2xpbnV4X3BjaV9kZXZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIGludAlhaGNfbGludXhfcGNpX3Jlc2VydmVfaW9fcmVnaW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCXVfbG9uZyAqYmFzZSk7CitzdGF0aWMgaW50CWFoY19saW51eF9wY2lfcmVzZXJ2ZV9tZW1fcmVnaW9uKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkJCSB1X2xvbmcgKmJ1c19hZGRyLAorCQkJCQkJIHVpbnQ4X3QgX19pb21lbSAqKm1hZGRyKTsKK3N0YXRpYyB2b2lkCWFoY19saW51eF9wY2lfZGV2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKKy8qIERlZmluZSB0aGUgbWFjcm8gbG9jYWxseSBzaW5jZSBpdCdzIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGNsYXNzIG9mIGNoaXBzLgorKi8KKyNkZWZpbmUgSUQoeCkJSURfQyh4LCBQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJKQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWhjX2xpbnV4X3BjaV9pZF90YWJsZVtdID0geworCS8qIGFpYzc4NTAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMjkwMl8wNF8xMF8xNV8yMENfMzBDKSwKKwkvKiBhaWM3ODYwIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MzBDVSksCisJSUQoSURfQUhBXzE0ODBBICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMjk0MEFVXzAgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV8yOTQwQVVfQ04gJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV8yOTMwQ19WQVIgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCS8qIGFpYzc4NzAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMjk0MCksCisJSUQoSURfQUhBXzM5NDApLAorCUlEKElEX0FIQV8zOThYKSwKKwlJRChJRF9BSEFfMjk0NCksCisJSUQoSURfQUhBXzM5NDQpLAorCUlEKElEX0FIQV80OTQ0KSwKKwkvKiBhaWM3ODgwIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5NDBVICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMzk0MFUgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV8yOTQ0VSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQoSURfQUhBXzM5NDRVICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMzk4WFUgJiBJRF9ERVZfVkVORE9SX01BU0spLAorCUlEKElEX0FIQV80OTQ0VSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQoSURfQUhBXzI5MzBVICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMjk0MFVfUFJPICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSEFfMjk0MFVfQ04gJiBJRF9ERVZfVkVORE9SX01BU0spLAorCS8qIGFpYzc4OTAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMjkzMFUyKSwKKwlJRChJRF9BSEFfMjk0MFUyQiksCisJSUQoSURfQUhBXzI5NDBVMl9PRU0pLAorCUlEKElEX0FIQV8yOTQwVTIpLAorCUlEKElEX0FIQV8yOTUwVTJCKSwKKwlJRDE2KElEX0FJQzc4OTBfQVJPICYgSURfQUlDNzg5NV9BUk9fTUFTSyksCisJSUQoSURfQUFBXzEzMVUyKSwKKwkvKiBhaWM3ODkwIGJhc2VkIGNvbnRyb2xsZXJzICovCisJSUQoSURfQUhBXzI5MTYwKSwKKwlJRChJRF9BSEFfMjkxNjBfQ1BRKSwKKwlJRChJRF9BSEFfMjkxNjBOKSwKKwlJRChJRF9BSEFfMjkxNjBDKSwKKwlJRChJRF9BSEFfMjkxNjBCKSwKKwlJRChJRF9BSEFfMTkxNjBCKSwKKwlJRChJRF9BSUM3ODkyX0FSTyksCisJLyogYWljNzg5MiBiYXNlZCBjb250cm9sbGVycyAqLworCUlEKElEX0FIQV8yOTQwVV9EVUFMKSwKKwlJRChJRF9BSEFfMzk0MEFVKSwKKwlJRChJRF9BSEFfMzk0NEFVKSwKKwlJRChJRF9BSUM3ODk1X0FSTyksCisJSUQoSURfQUhBXzM5NTBVMkJfMCksCisJSUQoSURfQUhBXzM5NTBVMkJfMSksCisJSUQoSURfQUhBXzM5NTBVMkRfMCksCisJSUQoSURfQUhBXzM5NTBVMkRfMSksCisJSUQoSURfQUlDNzg5Nl9BUk8pLAorCS8qIGFpYzc4OTkgYmFzZWQgY29udHJvbGxlcnMgKi8KKwlJRChJRF9BSEFfMzk2MEQpLAorCUlEKElEX0FIQV8zOTYwRF9DUFEpLAorCUlEKElEX0FJQzc4OTlfQVJPKSwKKwkvKiBHZW5lcmljIGNoaXAgcHJvYmVzIGZvciBkZXZpY2VzIHdlIGRvbid0IGtub3cgZXhhY3RseS4gKi8KKwlJRChJRF9BSUM3ODUwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODU1ICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODU5ICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODYwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODcwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODgwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKyAJSUQxNihJRF9BSUM3ODkwICYgSURfOTAwNV9HRU5FUklDX01BU0spLAorIAlJRDE2KElEX0FJQzc4OTIgJiBJRF85MDA1X0dFTkVSSUNfTUFTSyksCisJSUQoSURfQUlDNzg5NSAmIElEX0RFVl9WRU5ET1JfTUFTSyksCisJSUQxNihJRF9BSUM3ODk2ICYgSURfOTAwNV9HRU5FUklDX01BU0spLAorCUlEMTYoSURfQUlDNzg5OSAmIElEXzkwMDVfR0VORVJJQ19NQVNLKSwKKwlJRChJRF9BSUM3ODEwICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwlJRChJRF9BSUM3ODE1ICYgSURfREVWX1ZFTkRPUl9NQVNLKSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFoY19saW51eF9wY2lfaWRfdGFibGUpOworCitzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3eHh4X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFpYzd4eHgiLAorCS5wcm9iZQkJPSBhaGNfbGludXhfcGNpX2Rldl9wcm9iZSwKKwkucmVtb3ZlCQk9IGFoY19saW51eF9wY2lfZGV2X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBhaGNfbGludXhfcGNpX2lkX3RhYmxlCit9OworCitzdGF0aWMgdm9pZAorYWhjX2xpbnV4X3BjaV9kZXZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhaGNfc29mdGMgKmFoYzsKKwl1X2xvbmcgbDsKKworCS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8ganVzdCBwZXJmb3JtCisJICogdGhlIGZyZWUgZGlyZWN0bHksIGJ1dCBjaGVjayBvdXIKKwkgKiBsaXN0IGZvciBleHRyYSBzYW5pdHkuCisJICovCisJYWhjX2xpc3RfbG9jaygmbCk7CisJYWhjID0gYWhjX2ZpbmRfc29mdGMoKHN0cnVjdCBhaGNfc29mdGMgKilwY2lfZ2V0X2RydmRhdGEocGRldikpOworCWlmIChhaGMgIT0gTlVMTCkgeworCQl1X2xvbmcgczsKKworCQlUQUlMUV9SRU1PVkUoJmFoY190YWlscSwgYWhjLCBsaW5rcyk7CisJCWFoY19saXN0X3VubG9jaygmbCk7CisJCWFoY19sb2NrKGFoYywgJnMpOworCQlhaGNfaW50cl9lbmFibGUoYWhjLCBGQUxTRSk7CisJCWFoY191bmxvY2soYWhjLCAmcyk7CisJCWFoY19mcmVlKGFoYyk7CisJfSBlbHNlCisJCWFoY19saXN0X3VubG9jaygmbCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19saW51eF9wY2lfZGV2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWNoYXIJCSBidWZbODBdOworCWNvbnN0IHVpbnQ2NF90CSBtYXNrXzM5Yml0ID0gMHg3RkZGRkZGRkZGVUxMOworCXN0cnVjdAkJIGFoY19zb2Z0YyAqYWhjOworCWFoY19kZXZfc29mdGNfdAkgcGNpOworCXN0cnVjdAkJIGFoY19wY2lfaWRlbnRpdHkgKmVudHJ5OworCWNoYXIJCSpuYW1lOworCWludAkJIGVycm9yOworCisJLyoKKwkgKiBTb21lIEJJT1NlbiByZXBvcnQgdGhlIHNhbWUgZGV2aWNlIG11bHRpcGxlIHRpbWVzLgorCSAqLworCVRBSUxRX0ZPUkVBQ0goYWhjLCAmYWhjX3RhaWxxLCBsaW5rcykgeworCQlzdHJ1Y3QgcGNpX2RldiAqcHJvYmVkX3BkZXY7CisKKwkJcHJvYmVkX3BkZXYgPSBhaGMtPmRldl9zb2Z0YzsKKwkJaWYgKHByb2JlZF9wZGV2LT5idXMtPm51bWJlciA9PSBwZGV2LT5idXMtPm51bWJlcgorCQkgJiYgcHJvYmVkX3BkZXYtPmRldmZuID09IHBkZXYtPmRldmZuKQorCQkJYnJlYWs7CisJfQorCWlmIChhaGMgIT0gTlVMTCkgeworCQkvKiBTa2lwIGR1cGxpY2F0ZS4gKi8KKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwlwY2kgPSBwZGV2OworCWVudHJ5ID0gYWhjX2ZpbmRfcGNpX2RldmljZShwY2kpOworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gKC1FTk9ERVYpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHNvZnRjIGZvciB0aGlzIGNhcmQgYW5kCisJICogc2V0IGl0IHVwIGZvciBhdHRhY2htZW50IGJ5IG91cgorCSAqIGNvbW1vbiBkZXRlY3Qgcm91dGluZS4KKwkgKi8KKwlzcHJpbnRmKGJ1ZiwgImFoY19wY2k6JWQ6JWQ6JWQiLAorCQlhaGNfZ2V0X3BjaV9idXMocGNpKSwKKwkJYWhjX2dldF9wY2lfc2xvdChwY2kpLAorCQlhaGNfZ2V0X3BjaV9mdW5jdGlvbihwY2kpKTsKKwluYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSwgTV9ERVZCVUYsIE1fTk9XQUlUKTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gKC1FTk9NRU0pOworCXN0cmNweShuYW1lLCBidWYpOworCWFoYyA9IGFoY19hbGxvYyhOVUxMLCBuYW1lKTsKKwlpZiAoYWhjID09IE5VTEwpCisJCXJldHVybiAoLUVOT01FTSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCWFoY19mcmVlKGFoYyk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQKKwkgJiYgYWhjX2xpbnV4X2dldF9tZW1zaXplKCkgPiAweDgwMDAwMDAwCisJICYmIHBjaV9zZXRfZG1hX21hc2socGRldiwgbWFza18zOWJpdCkgPT0gMCkgeworCQlhaGMtPmZsYWdzIHw9IEFIQ18zOUJJVF9BRERSRVNTSU5HOworCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gbWFza18zOWJpdDsKKwl9IGVsc2UgeworCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICAJcmV0dXJuICgtRU5PREVWKTsKKwkJfQorCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmh3X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CisJfQorCWFoYy0+ZGV2X3NvZnRjID0gcGNpOworCWVycm9yID0gYWhjX3BjaV9jb25maWcoYWhjLCBlbnRyeSk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJYWhjX2ZyZWUoYWhjKTsKKwkJcmV0dXJuICgtZXJyb3IpOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYWhjKTsKKwlpZiAoYWljN3h4eF9kZXRlY3RfY29tcGxldGUpIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJCWFoY19saW51eF9yZWdpc3Rlcl9ob3N0KGFoYywgJmFpYzd4eHhfZHJpdmVyX3RlbXBsYXRlKTsKKyNlbHNlCisJCXByaW50ZigiYWljN3h4eDogaWdub3JpbmcgUENJIGRldmljZSBmb3VuZCBhZnRlciAiCisJCSAgICAgICAiaW5pdGlhbGl6YXRpb25cbiIpOworCQlyZXR1cm4gKC1FTk9ERVYpOworI2VuZGlmCisJfQorCXJldHVybiAoMCk7Cit9CisKK2ludAorYWhjX2xpbnV4X3BjaV9pbml0KHZvaWQpCit7CisJLyogVHJhbnNsYXRlIGVycm9yIG9yIHplcm8gcmV0dXJuIGludG8gemVybyBvciBvbmUgKi8KKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhaWM3eHh4X3BjaV9kcml2ZXIpID8gMCA6IDE7Cit9CisKK3ZvaWQKK2FoY19saW51eF9wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWljN3h4eF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X3BjaV9yZXNlcnZlX2lvX3JlZ2lvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfbG9uZyAqYmFzZSkKK3sKKwlpZiAoYWljN3h4eF9hbGxvd19tZW1pbyA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwkqYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChhaGMtPmRldl9zb2Z0YywgMCk7CisJaWYgKCpiYXNlID09IDApCisJCXJldHVybiAoRU5PTUVNKTsKKwlpZiAocmVxdWVzdF9yZWdpb24oKmJhc2UsIDI1NiwgImFpYzd4eHgiKSA9PSAwKQorCQlyZXR1cm4gKEVOT01FTSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2xpbnV4X3BjaV9yZXNlcnZlX21lbV9yZWdpb24oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSB1X2xvbmcgKmJ1c19hZGRyLAorCQkJCSB1aW50OF90IF9faW9tZW0gKiptYWRkcikKK3sKKwl1X2xvbmcJc3RhcnQ7CisJaW50CWVycm9yOworCisJZXJyb3IgPSAwOworCXN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGFoYy0+ZGV2X3NvZnRjLCAxKTsKKwlpZiAoc3RhcnQgIT0gMCkgeworCQkqYnVzX2FkZHIgPSBzdGFydDsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwLCAiYWljN3h4eCIpID09IDApCisJCQllcnJvciA9IEVOT01FTTsKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCSptYWRkciA9IGlvcmVtYXBfbm9jYWNoZShzdGFydCwgMjU2KTsKKwkJCWlmICgqbWFkZHIgPT0gTlVMTCkgeworCQkJCWVycm9yID0gRU5PTUVNOworCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgMHgxMDAwKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQllcnJvciA9IEVOT01FTTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50CithaGNfcGNpX21hcF9yZWdpc3RlcnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXVpbnQzMl90IGNvbW1hbmQ7CisJdV9sb25nCSBiYXNlOworCXVpbnQ4X3QJX19pb21lbSAqbWFkZHI7CisJaW50CSBlcnJvcjsKKworCS8qCisJICogSWYgaXRzIGFsbG93ZWQsIHdlIHByZWZlciBtZW1vcnkgbWFwcGVkIGFjY2Vzcy4KKwkgKi8KKwljb21tYW5kID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCA0KTsKKwljb21tYW5kICY9IH4oUENJTV9DTURfUE9SVEVOfFBDSU1fQ01EX01FTUVOKTsKKwliYXNlID0gMDsKKwltYWRkciA9IE5VTEw7CisJZXJyb3IgPSBhaGNfbGludXhfcGNpX3Jlc2VydmVfbWVtX3JlZ2lvbihhaGMsICZiYXNlLCAmbWFkZHIpOworCWlmIChlcnJvciA9PSAwKSB7CisJCWFoYy0+cGxhdGZvcm1fZGF0YS0+bWVtX2J1c2FkZHIgPSBiYXNlOworCQlhaGMtPnRhZyA9IEJVU19TUEFDRV9NRU1JTzsKKwkJYWhjLT5ic2gubWFkZHIgPSBtYWRkcjsKKwkJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwKKwkJCQkgICAgIGNvbW1hbmQgfCBQQ0lNX0NNRF9NRU1FTiwgNCk7CisKKwkJLyoKKwkJICogRG8gYSBxdWljayB0ZXN0IHRvIHNlZSBpZiBtZW1vcnkgbWFwcGVkCisJCSAqIEkvTyBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuCisJCSAqLworCQlpZiAoYWhjX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhhaGMpICE9IDApIHsKKworCQkJcHJpbnRmKCJhaWM3eHh4OiBQQ0kgRGV2aWNlICVkOiVkOiVkICIKKwkJCSAgICAgICAiZmFpbGVkIG1lbW9yeSBtYXBwZWQgdGVzdC4gIFVzaW5nIFBJTy5cbiIsCisJCQkgICAgICAgYWhjX2dldF9wY2lfYnVzKGFoYy0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBhaGNfZ2V0X3BjaV9zbG90KGFoYy0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBhaGNfZ2V0X3BjaV9mdW5jdGlvbihhaGMtPmRldl9zb2Z0YykpOworCQkJaW91bm1hcChtYWRkcik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oYWhjLT5wbGF0Zm9ybV9kYXRhLT5tZW1fYnVzYWRkciwKKwkJCQkJICAgMHgxMDAwKTsKKwkJCWFoYy0+YnNoLm1hZGRyID0gTlVMTDsKKwkJCW1hZGRyID0gTlVMTDsKKwkJfSBlbHNlCisJCQljb21tYW5kIHw9IFBDSU1fQ01EX01FTUVOOworCX0gZWxzZSB7CisJCXByaW50ZigiYWljN3h4eDogUENJJWQ6JWQ6JWQgTUVNIHJlZ2lvbiAweCVseCAiCisJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtZW1vcnkgbWFwIGRldmljZS5cbiIsCisJCSAgICAgICBhaGNfZ2V0X3BjaV9idXMoYWhjLT5kZXZfc29mdGMpLAorCQkgICAgICAgYWhjX2dldF9wY2lfc2xvdChhaGMtPmRldl9zb2Z0YyksCisJCSAgICAgICBhaGNfZ2V0X3BjaV9mdW5jdGlvbihhaGMtPmRldl9zb2Z0YyksCisJCSAgICAgICBiYXNlKTsKKwl9CisKKwkvKgorCSAqIFdlIGFsd2F5cyBwcmVmZXIgbWVtb3J5IG1hcHBlZCBhY2Nlc3MuCisJICovCisJaWYgKG1hZGRyID09IE5VTEwpIHsKKworCQllcnJvciA9IGFoY19saW51eF9wY2lfcmVzZXJ2ZV9pb19yZWdpb24oYWhjLCAmYmFzZSk7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlhaGMtPnRhZyA9IEJVU19TUEFDRV9QSU87CisJCQlhaGMtPmJzaC5pb3BvcnQgPSBiYXNlOworCQkJY29tbWFuZCB8PSBQQ0lNX0NNRF9QT1JURU47CisJCX0gZWxzZSB7CisJCQlwcmludGYoImFpYzd4eHg6IFBDSSVkOiVkOiVkIElPIHJlZ2lvbiAweCVseFswLi4yNTVdICIKKwkJCSAgICAgICAidW5hdmFpbGFibGUuIENhbm5vdCBtYXAgZGV2aWNlLlxuIiwKKwkJCSAgICAgICBhaGNfZ2V0X3BjaV9idXMoYWhjLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QoYWhjLT5kZXZfc29mdGMpLAorCQkJICAgICAgIGFoY19nZXRfcGNpX2Z1bmN0aW9uKGFoYy0+ZGV2X3NvZnRjKSwKKwkJCSAgICAgICBiYXNlKTsKKwkJfQorCX0KKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCBjb21tYW5kLCA0KTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50CithaGNfcGNpX21hcF9pbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gcmVxdWVzdF9pcnEoYWhjLT5kZXZfc29mdGMtPmlycSwgYWhjX2xpbnV4X2lzciwKKwkJCSAgICBTQV9TSElSUSwgImFpYzd4eHgiLCBhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQlhaGMtPnBsYXRmb3JtX2RhdGEtPmlycSA9IGFoYy0+ZGV2X3NvZnRjLT5pcnE7CisJCisJcmV0dXJuICgtZXJyb3IpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRjYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpAQCAtMCwwICsxLDI0MDcgQEAKKy8qCisgKiBQcm9kdWN0IHNwZWNpZmljIHByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yOgorICogICAgICAzOTQwLCAyOTQwLCBhaWM3ODk1LCBhaWM3ODkwLCBhaWM3ODgwLAorICoJYWljNzg3MCwgYWljNzg2MCBhbmQgYWljNzg1MCBTQ1NJIGNvbnRyb2xsZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0LTIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4X3BjaS5jIzY5ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKKyNpbmNsdWRlICJhaWM3eHh4X2lubGluZS5oIgorI2luY2x1ZGUgImFpYzd4eHhfOTNjeDYuaCIKKyNlbHNlCisjaW5jbHVkZSA8ZGV2L2FpYzd4eHgvYWljN3h4eF9vc20uaD4KKyNpbmNsdWRlIDxkZXYvYWljN3h4eC9haWM3eHh4X2lubGluZS5oPgorI2luY2x1ZGUgPGRldi9haWM3eHh4L2FpYzd4eHhfOTNjeDYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYWljN3h4eF9wY2kuaCIKKworc3RhdGljIF9faW5saW5lIHVpbnQ2NF90CithaGNfY29tcG9zZV9pZCh1X2ludCBkZXZpY2UsIHVfaW50IHZlbmRvciwgdV9pbnQgc3ViZGV2aWNlLCB1X2ludCBzdWJ2ZW5kb3IpCit7CisJdWludDY0X3QgaWQ7CisKKwlpZCA9IHN1YnZlbmRvcgorCSAgIHwgKHN1YmRldmljZSA8PCAxNikKKwkgICB8ICgodWludDY0X3QpdmVuZG9yIDw8IDMyKQorCSAgIHwgKCh1aW50NjRfdClkZXZpY2UgPDwgNDgpOworCisJcmV0dXJuIChpZCk7Cit9CisKKyNkZWZpbmUgQUhDX1BDSV9JT0FERFIJUENJUl9NQVBTCS8qIEkvTyBBZGRyZXNzICovCisjZGVmaW5lIEFIQ19QQ0lfTUVNQUREUgkoUENJUl9NQVBTICsgNCkJLyogTWVtIEkvTyBBZGRyZXNzICovCisKKyNkZWZpbmUgREVWSURfOTAwNV9UWVBFKGlkKSAoKGlkKSAmIDB4RikKKyNkZWZpbmUJCURFVklEXzkwMDVfVFlQRV9IQkEJCTB4MAkvKiBTdGFuZGFyZCBDYXJkICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfQUFBCQkweDMJLyogUkFJRCBDYXJkICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfU0lTTAkJMHg1CS8qIENvbnRhaW5lciBST01CICovCisjZGVmaW5lCQlERVZJRF85MDA1X1RZUEVfTUIJCTB4RgkvKiBPbiBNb3RoZXJib2FyZCAqLworCisjZGVmaW5lIERFVklEXzkwMDVfTUFYUkFURShpZCkgKCgoaWQpICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUJCURFVklEXzkwMDVfTUFYUkFURV9VMTYwCQkweDAKKyNkZWZpbmUJCURFVklEXzkwMDVfTUFYUkFURV9VTFRSQTIJMHgxCisjZGVmaW5lCQlERVZJRF85MDA1X01BWFJBVEVfVUxUUkEJMHgyCisjZGVmaW5lCQlERVZJRF85MDA1X01BWFJBVEVfRkFTVAkJMHgzCisKKyNkZWZpbmUgREVWSURfOTAwNV9NRlVOQyhpZCkgKCgoaWQpICYgMHg0MCkgPj4gNikKKworI2RlZmluZSBERVZJRF85MDA1X0NMQVNTKGlkKSAoKChpZCkgJiAweEZGMDApID4+IDgpCisjZGVmaW5lCQlERVZJRF85MDA1X0NMQVNTX1NQSQkJMHgwCS8qIFBhcmFsbGVsIFNDU0kgKi8KKworI2RlZmluZSBTVUJJRF85MDA1X1RZUEUoaWQpICgoaWQpICYgMHhGKQorI2RlZmluZQkJU1VCSURfOTAwNV9UWVBFX01CCQkweEYJLyogT24gTW90aGVyYm9hcmQgKi8KKyNkZWZpbmUJCVNVQklEXzkwMDVfVFlQRV9DQVJECQkweDAJLyogU3RhbmRhcmQgQ2FyZCAqLworI2RlZmluZQkJU1VCSURfOTAwNV9UWVBFX0xDQ0FSRAkJMHgxCS8qIExvdyBDb3N0IENhcmQgKi8KKyNkZWZpbmUJCVNVQklEXzkwMDVfVFlQRV9SQUlECQkweDMJLyogQ29tYmluZWQgd2l0aCBSYWlkICovCisKKyNkZWZpbmUgU1VCSURfOTAwNV9UWVBFX0tOT1dOKGlkKQkJCVwKKwkgICgoKChpZCkgJiAweEYpID09IFNVQklEXzkwMDVfVFlQRV9NQikJCVwKKwl8fCAoKChpZCkgJiAweEYpID09IFNVQklEXzkwMDVfVFlQRV9DQVJEKQlcCisJfHwgKCgoaWQpICYgMHhGKSA9PSBTVUJJRF85MDA1X1RZUEVfTENDQVJEKQlcCisJfHwgKCgoaWQpICYgMHhGKSA9PSBTVUJJRF85MDA1X1RZUEVfUkFJRCkpCisKKyNkZWZpbmUgU1VCSURfOTAwNV9NQVhSQVRFKGlkKSAoKChpZCkgJiAweDMwKSA+PiA0KQorI2RlZmluZQkJU1VCSURfOTAwNV9NQVhSQVRFX1VMVFJBMgkweDAKKyNkZWZpbmUJCVNVQklEXzkwMDVfTUFYUkFURV9VTFRSQQkweDEKKyNkZWZpbmUJCVNVQklEXzkwMDVfTUFYUkFURV9VMTYwCQkweDIKKyNkZWZpbmUJCVNVQklEXzkwMDVfTUFYUkFURV9SRVNFUlZFRAkweDMKKworI2RlZmluZSBTVUJJRF85MDA1X1NFRVBUWVBFKGlkKQkJCQkJCVwKKwkoKFNVQklEXzkwMDVfVFlQRShpZCkgPT0gU1VCSURfOTAwNV9UWVBFX01CKQkJCVwKKwkgPyAoKGlkKSAmIDB4QzApID4+IDYJCQkJCQlcCisJIDogKChpZCkgJiAweDMwMCkgPj4gOCkKKyNkZWZpbmUJCVNVQklEXzkwMDVfU0VFUFRZUEVfTk9ORQkweDAKKyNkZWZpbmUJCVNVQklEXzkwMDVfU0VFUFRZUEVfMUsJCTB4MQorI2RlZmluZQkJU1VCSURfOTAwNV9TRUVQVFlQRV8yS180SwkweDIKKyNkZWZpbmUJCVNVQklEXzkwMDVfU0VFUFRZUEVfUkVTRVJWRUQJMHgzCisjZGVmaW5lIFNVQklEXzkwMDVfQVVUT1RFUk0oaWQpCQkJCQkJXAorCSgoU1VCSURfOTAwNV9UWVBFKGlkKSA9PSBTVUJJRF85MDA1X1RZUEVfTUIpCQkJXAorCSA/ICgoKGlkKSAmIDB4NDAwKSA+PiAxMCkgPT0gMAkJCQkJXAorCSA6ICgoKGlkKSAmIDB4NDApID4+IDYpID09IDApCisKKyNkZWZpbmUgU1VCSURfOTAwNV9OVU1DSEFOKGlkKQkJCQkJCVwKKwkoKFNVQklEXzkwMDVfVFlQRShpZCkgPT0gU1VCSURfOTAwNV9UWVBFX01CKQkJCVwKKwkgPyAoKGlkKSAmIDB4MzAwKSA+PiA4CQkJCQkJXAorCSA6ICgoaWQpICYgMHhDMDApID4+IDEwKQorCisjZGVmaW5lIFNVQklEXzkwMDVfTEVHQUNZQ09OTihpZCkJCQkJCVwKKwkoKFNVQklEXzkwMDVfVFlQRShpZCkgPT0gU1VCSURfOTAwNV9UWVBFX01CKQkJCVwKKwkgPyAwCQkJCQkJCQlcCisJIDogKChpZCkgJiAweDgwKSA+PiA3KQorCisjZGVmaW5lIFNVQklEXzkwMDVfTUZVTkNFTkIoaWQpCQkJCQkJXAorCSgoU1VCSURfOTAwNV9UWVBFKGlkKSA9PSBTVUJJRF85MDA1X1RZUEVfTUIpCQkJXAorCSA/ICgoaWQpICYgMHg4MDApID4+IDExCQkJCQkJXAorCSA6ICgoaWQpICYgMHgxMDAwKSA+PiAxMikKKy8qCisgKiBJbmZvcm1hdGlvbmFsIG9ubHkuIFNob3VsZCB1c2UgY2hpcCByZWdpc3RlciB0byBiZQorICogY2VydGFpbiwgYnV0IG1heSBiZSB1c2UgaW4gaWRlbnRpZmljYXRpb24gc3RyaW5ncy4KKyAqLworI2RlZmluZSBTVUJJRF85MDA1X0NBUkRfU0NTSVdJRFRIX01BU0sJMHgyMDAwCisjZGVmaW5lIFNVQklEXzkwMDVfQ0FSRF9QQ0lXSURUSF9NQVNLCTB4NDAwMAorI2RlZmluZSBTVUJJRF85MDA1X0NBUkRfU0VESUZGX01BU0sJMHg4MDAwCisKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FpYzc4NVhfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODYwX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYXBhMTQ4MF9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FpYzc4NzBfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haGEzOTRYX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhNDk0WF9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTM5OFhfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODgwX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMjk0MFByb19zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTM5NFhVX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMzk4WFVfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODkwX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzg5Ml9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FpYzc4OTVfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haWM3ODk2X3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWljNzg5OV9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTI5MTYwQ19zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX3JhaWRfc2V0dXA7CitzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haGEzOTRYWF9zZXR1cDsKK3N0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTQ5NFhYX3NldHVwOworc3RhdGljIGFoY19kZXZpY2Vfc2V0dXBfdCBhaGNfYWhhMzk4WFhfc2V0dXA7CisKK3N0cnVjdCBhaGNfcGNpX2lkZW50aXR5IGFoY19wY2lfaWRlbnRfdGFibGUgW10gPQoreworCS8qIGFpYzc4NTAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTAyXzA0XzEwXzE1XzIwQ18zMEMsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTAyLzA0LzEwLzE1LzIwQy8zMEMgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NVhfc2V0dXAKKwl9LAorCS8qIGFpYzc4NjAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTMwQ1UsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTMwQ1UgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NjBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzE0ODBBICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDE0ODBBIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19hcGExNDgwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTQwQVVfMCAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAyOTQwQSBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg2MF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjk0MEFVX0NOICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDI5NDBBL0NOIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODYwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTMwQ19WQVIgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMjkzMEMgVWx0cmEgU0NTSSBhZGFwdGVyIChWQVIpIiwKKwkJYWhjX2FpYzc4NjBfc2V0dXAKKwl9LAorCS8qIGFpYzc4NzAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTQwLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg3MF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzk0MCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NDAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FoYTM5NFhfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5OFgsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOThYIFNDU0kgUkFJRCBhZGFwdGVyIiwKKwkJYWhjX2FoYTM5OFhfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5NDQsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTQ0IFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODcwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTQ0LAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzk0NCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWhhMzk0WF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfNDk0NCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDQ5NDQgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FoYTQ5NFhfc2V0dXAKKwl9LAorCS8qIGFpYzc4ODAgYmFzZWQgY29udHJvbGxlcnMgKi8KKwl7CisJCUlEX0FIQV8yOTQwVSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAyOTQwIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODgwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTQwVSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAzOTQwIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haGEzOTRYVV9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjk0NFUgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMjk0NCBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg4MF9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzk0NFUgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMzk0NCBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWhhMzk0WFVfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5OFhVICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDM5OFggVWx0cmEgU0NTSSBSQUlEIGFkYXB0ZXIiLAorCQlhaGNfYWhhMzk4WFVfc2V0dXAKKwl9LAorCXsKKwkJLyoKKwkJICogWFhYIERvbid0IGtub3cgdGhlIHNsb3QgbnVtYmVycworCQkgKiBzbyB3ZSBjYW4ndCBpZGVudGlmeSBjaGFubmVscworCQkgKi8KKwkJSURfQUhBXzQ5NDRVICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDQ5NDQgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4ODBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5MzBVICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIDI5MzAgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4ODBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5NDBVX1BSTyAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyAyOTQwIFBybyBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWhhMjk0MFByb19zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjk0MFVfQ04gJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MC9DTiBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg4MF9zZXR1cAorCX0sCisJLyogSWdub3JlIGFsbCBTSVNMIChBQUMgb24gTUIpIGJhc2VkIGNvbnRyb2xsZXJzLiAqLworCXsKKwkJSURfOTAwNV9TSVNMX0lELAorCQlJRF85MDA1X1NJU0xfTUFTSywKKwkJTlVMTCwKKwkJTlVMTAorCX0sCisJLyogYWljNzg5MCBiYXNlZCBjb250cm9sbGVycyAqLworCXsKKwkJSURfQUhBXzI5MzBVMiwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5MzAgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTQwVTJCLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MEIgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTQwVTJfT0VNLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk0MCBVbHRyYTIgU0NTSSBhZGFwdGVyIChPRU0pIiwKKwkJYWhjX2FpYzc4OTBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5NDBVMiwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDI5NDAgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkwX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTUwVTJCLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjk1MCBVbHRyYTIgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5MF9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkwLzkxIFVsdHJhMiBTQ1NJIGFkYXB0ZXIgKEFSTykiLAorCQlhaGNfYWljNzg5MF9zZXR1cAorCX0sCisJeworCQlJRF9BQUFfMTMxVTIsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBBQUEtMTMxIFVsdHJhMiBSQUlEIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5MF9zZXR1cAorCX0sCisJLyogYWljNzg5MiBiYXNlZCBjb250cm9sbGVycyAqLworCXsKKwkJSURfQUhBXzI5MTYwLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkxNjAgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzI5MTYwX0NQUSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIChDb21wYXEgT0VNKSAyOTE2MCBVbHRyYTE2MCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Ml9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkxNjBOLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkxNjBOIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8yOTE2MEMsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTE2MEMgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FoYTI5MTYwQ19zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkxNjBCLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMjkxNjBCIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8xOTE2MEIsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAxOTE2MEIgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTJfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5Ml9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkyIFVsdHJhMTYwIFNDU0kgYWRhcHRlciAoQVJPKSIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwkvKiBhaWM3ODk1IGJhc2VkIGNvbnRyb2xsZXJzICovCQorCXsKKwkJSURfQUhBXzI5NDBVX0RVQUwsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTQwL0RVQUwgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTVfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5NDBBVSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NDBBIFVsdHJhIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk1X3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTQ0QVUsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOTQ0QSBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5NV9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODk1X0FSTywKKwkJSURfQUlDNzg5NV9BUk9fTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg5NSBVbHRyYSBTQ1NJIGFkYXB0ZXIgKEFSTykiLAorCQlhaGNfYWljNzg5NV9zZXR1cAorCX0sCisJLyogYWljNzg5Ni85NyBiYXNlZCBjb250cm9sbGVycyAqLwkKKwl7CisJCUlEX0FIQV8zOTUwVTJCXzAsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOTUwQiBVbHRyYTIgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTZfc2V0dXAKKwl9LAorCXsKKwkJSURfQUhBXzM5NTBVMkJfMSwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NTBCIFVsdHJhMiBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Nl9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMzk1MFUyRF8wLAorCQlJRF9BTExfTUFTSywKKwkJIkFkYXB0ZWMgMzk1MEQgVWx0cmEyIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk2X3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTUwVTJEXzEsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAzOTUwRCBVbHRyYTIgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTZfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5Nl9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk2Lzk3IFVsdHJhMiBTQ1NJIGFkYXB0ZXIgKEFSTykiLAorCQlhaGNfYWljNzg5Nl9zZXR1cAorCX0sCisJLyogYWljNzg5OSBiYXNlZCBjb250cm9sbGVycyAqLwkKKwl7CisJCUlEX0FIQV8zOTYwRCwKKwkJSURfQUxMX01BU0ssCisJCSJBZGFwdGVjIDM5NjBEIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk5X3NldHVwCisJfSwKKwl7CisJCUlEX0FIQV8zOTYwRF9DUFEsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAoQ29tcGFxIE9FTSkgMzk2MEQgVWx0cmExNjAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4OTlfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg5OV9BUk8sCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk5IFVsdHJhMTYwIFNDU0kgYWRhcHRlciAoQVJPKSIsCisJCWFoY19haWM3ODk5X3NldHVwCisJfSwKKwkvKiBHZW5lcmljIGNoaXAgcHJvYmVzIGZvciBkZXZpY2VzIHdlIGRvbid0IGtub3cgJ2V4YWN0bHknICovCisJeworCQlJRF9BSUM3ODUwICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIGFpYzc4NTAgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NVhfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg1NSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODU1IFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODVYX3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4NTkgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg1OSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg2MF9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODYwICYgSURfREVWX1ZFTkRPUl9NQVNLLAorCQlJRF9ERVZfVkVORE9SX01BU0ssCisJCSJBZGFwdGVjIGFpYzc4NjAgVWx0cmEgU0NTSSBhZGFwdGVyIiwKKwkJYWhjX2FpYzc4NjBfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzg3MCAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODcwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODcwX3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4ODAgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg4MCBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg4MF9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODkwICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkwLzkxIFVsdHJhMiBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5MF9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODkyICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODkyIFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODkyX3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4OTUgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzg5NSBVbHRyYSBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5NV9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODk2ICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk2Lzk3IFVsdHJhMiBTQ1NJIGFkYXB0ZXIiLAorCQlhaGNfYWljNzg5Nl9zZXR1cAorCX0sCisJeworCQlJRF9BSUM3ODk5ICYgSURfOTAwNV9HRU5FUklDX01BU0ssCisJCUlEXzkwMDVfR0VORVJJQ19NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODk5IFVsdHJhMTYwIFNDU0kgYWRhcHRlciIsCisJCWFoY19haWM3ODk5X3NldHVwCisJfSwKKwl7CisJCUlEX0FJQzc4MTAgJiBJRF9ERVZfVkVORE9SX01BU0ssCisJCUlEX0RFVl9WRU5ET1JfTUFTSywKKwkJIkFkYXB0ZWMgYWljNzgxMCBSQUlEIG1lbW9yeSBjb250cm9sbGVyIiwKKwkJYWhjX3JhaWRfc2V0dXAKKwl9LAorCXsKKwkJSURfQUlDNzgxNSAmIElEX0RFVl9WRU5ET1JfTUFTSywKKwkJSURfREVWX1ZFTkRPUl9NQVNLLAorCQkiQWRhcHRlYyBhaWM3ODE1IFJBSUQgbWVtb3J5IGNvbnRyb2xsZXIiLAorCQlhaGNfcmFpZF9zZXR1cAorCX0KK307CisKK2NvbnN0IHVfaW50IGFoY19udW1fcGNpX2RldnMgPSBOVU1fRUxFTUVOVFMoYWhjX3BjaV9pZGVudF90YWJsZSk7CisJCQorI2RlZmluZSBBSENfMzk0WF9TTE9UX0NIQU5ORUxfQQk0CisjZGVmaW5lIEFIQ18zOTRYX1NMT1RfQ0hBTk5FTF9CCTUKKworI2RlZmluZSBBSENfMzk4WF9TTE9UX0NIQU5ORUxfQQk0CisjZGVmaW5lIEFIQ18zOThYX1NMT1RfQ0hBTk5FTF9CCTgKKyNkZWZpbmUgQUhDXzM5OFhfU0xPVF9DSEFOTkVMX0MJMTIKKworI2RlZmluZSBBSENfNDk0WF9TTE9UX0NIQU5ORUxfQQk0CisjZGVmaW5lIEFIQ180OTRYX1NMT1RfQ0hBTk5FTF9CCTUKKyNkZWZpbmUgQUhDXzQ5NFhfU0xPVF9DSEFOTkVMX0MJNgorI2RlZmluZSBBSENfNDk0WF9TTE9UX0NIQU5ORUxfRAk3CisKKyNkZWZpbmUJREVWQ09ORklHCQkweDQwCisjZGVmaW5lCQlQQ0lFUlJHRU5ESVMJMHg4MDAwMDAwMHVsCisjZGVmaW5lCQlTQ0JTSVpFMzIJMHgwMDAxMDAwMHVsCS8qIGFpYzc4OVggb25seSAqLworI2RlZmluZQkJUkVYVFZBTElECTB4MDAwMDEwMDB1bAkvKiB1bHRyYSBjYXJkcyBvbmx5ICovCisjZGVmaW5lCQlNUE9SVE1PREUJMHgwMDAwMDQwMHVsCS8qIGFpYzc4NzArIG9ubHkgKi8KKyNkZWZpbmUJCVJBTVBTTQkJMHgwMDAwMDIwMHVsCS8qIGFpYzc4NzArIG9ubHkgKi8KKyNkZWZpbmUJCVZPTFNFTlNFCTB4MDAwMDAxMDB1bAorI2RlZmluZQkJUENJNjRCSVQJMHgwMDAwMDA4MHVsCS8qIDY0Qml0IFBDSSBidXMgKFVsdHJhMiBPbmx5KSovCisjZGVmaW5lCQlTQ0JSQU1TRUwJMHgwMDAwMDA4MHVsCisjZGVmaW5lCQlNUkRDRU4JCTB4MDAwMDAwNDB1bAorI2RlZmluZQkJRVhUU0NCVElNRQkweDAwMDAwMDIwdWwJLyogYWljNzg3MCBvbmx5ICovCisjZGVmaW5lCQlFWFRTQ0JQRU4JMHgwMDAwMDAxMHVsCS8qIGFpYzc4NzAgb25seSAqLworI2RlZmluZQkJQkVSUkVOCQkweDAwMDAwMDA4dWwKKyNkZWZpbmUJCURBQ0VOCQkweDAwMDAwMDA0dWwKKyNkZWZpbmUJCVNUUFdMRVZFTAkweDAwMDAwMDAydWwKKyNkZWZpbmUJCURJRkFDVE5FR0VOCTB4MDAwMDAwMDF1bAkvKiBhaWM3ODcwIG9ubHkgKi8KKworI2RlZmluZQlDU0laRV9MQVRUSU1FCQkweDBjCisjZGVmaW5lCQlDQUNIRVNJWkUJMHgwMDAwMDAzZnVsCS8qIG9ubHkgNSBiaXRzICovCisjZGVmaW5lCQlMQVRUSU1FCQkweDAwMDBmZjAwdWwKKworLyogUENJIFNUQVRVUyBkZWZpbml0aW9ucyAqLworI2RlZmluZQlEUEUJMHg4MAorI2RlZmluZSBTU0UJMHg0MAorI2RlZmluZQlSTUEJMHgyMAorI2RlZmluZQlSVEEJMHgxMAorI2RlZmluZSBTVEEJMHgwOAorI2RlZmluZSBEUFIJMHgwMQorCitzdGF0aWMgaW50IGFoY185MDA1X3N1YmRldmluZm9fdmFsaWQodWludDE2X3QgdmVuZG9yLCB1aW50MTZfdCBkZXZpY2UsCisJCQkJICAgICB1aW50MTZfdCBzdWJ2ZW5kb3IsIHVpbnQxNl90IHN1YmRldmljZSk7CitzdGF0aWMgaW50IGFoY19leHRfc2NicmFtX3ByZXNlbnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGFoY19zY2JyYW1fY29uZmlnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50IGVuYWJsZSwKKwkJCQkgIGludCBwY2hlY2ssIGludCBmYXN0LCBpbnQgbGFyZ2UpOworc3RhdGljIHZvaWQgYWhjX3Byb2JlX2V4dF9zY2JyYW0oc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2V4dHBvcnQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCAqc3hmcmN0bDEpOworc3RhdGljIHZvaWQgYWhjX3BhcnNlX3BjaV9lZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJCSBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV90ZXJtaW5hdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICBzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCwKKwkJCQkgIHVfaW50IGFkYXB0ZXJfY29udHJvbCwKKwkgCQkJICB1X2ludCAqc3hmcmN0bDEpOworCitzdGF0aWMgdm9pZCBhaGNfbmV3X3Rlcm1fZGV0ZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQlpbnQgKmVuYWJsZVNFQ19sb3csCisJCQkJaW50ICplbmFibGVTRUNfaGlnaCwKKwkJCQlpbnQgKmVuYWJsZVBSSV9sb3csCisJCQkJaW50ICplbmFibGVQUklfaGlnaCwKKwkJCQlpbnQgKmVlcHJvbV9wcmVzZW50KTsKK3N0YXRpYyB2b2lkIGFpYzc4N1hfY2FibGVfZGV0ZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50ICppbnRlcm5hbDUwX3ByZXNlbnQsCisJCQkJIGludCAqaW50ZXJuYWw2OF9wcmVzZW50LAorCQkJCSBpbnQgKmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJCQkgaW50ICplZXByb21fcHJlc2VudCk7CitzdGF0aWMgdm9pZCBhaWM3ODVYX2NhYmxlX2RldGVjdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCAqaW50ZXJuYWw1MF9wcmVzZW50LAorCQkJCSBpbnQgKmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJCQkgaW50ICplZXByb21fcHJlc2VudCk7CitzdGF0aWMgdm9pZCAgICB3cml0ZV9icmRjdGwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1aW50OF90IHZhbHVlKTsKK3N0YXRpYyB1aW50OF90IHJlYWRfYnJkY3RsKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgdm9pZCBhaGNfcGNpX2ludHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQgIGFoY19wY2lfY2hpcF9pbml0KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CitzdGF0aWMgaW50ICBhaGNfcGNpX3N1c3BlbmQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKK3N0YXRpYyBpbnQgIGFoY19wY2lfcmVzdW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CisKK3N0YXRpYyBpbnQKK2FoY185MDA1X3N1YmRldmluZm9fdmFsaWQodWludDE2X3QgZGV2aWNlLCB1aW50MTZfdCB2ZW5kb3IsCisJCQkgIHVpbnQxNl90IHN1YmRldmljZSwgdWludDE2X3Qgc3VidmVuZG9yKQoreworCWludCByZXN1bHQ7CisKKwkvKiBEZWZhdWx0IHRvIGludmFsaWQuICovCisJcmVzdWx0ID0gMDsKKwlpZiAodmVuZG9yID09IDB4OTAwNQorCSAmJiBzdWJ2ZW5kb3IgPT0gMHg5MDA1CisgICAgICAgICAmJiBzdWJkZXZpY2UgIT0gZGV2aWNlCisgICAgICAgICAmJiBTVUJJRF85MDA1X1RZUEVfS05PV04oc3ViZGV2aWNlKSAhPSAwKSB7CisKKwkJc3dpdGNoIChTVUJJRF85MDA1X1RZUEUoc3ViZGV2aWNlKSkgeworCQljYXNlIFNVQklEXzkwMDVfVFlQRV9NQjoKKwkJCWJyZWFrOworCQljYXNlIFNVQklEXzkwMDVfVFlQRV9DQVJEOgorCQljYXNlIFNVQklEXzkwMDVfVFlQRV9MQ0NBUkQ6CisJCQkvKgorCQkJICogQ3VycmVudGx5IG9ubHkgdHJ1c3QgQWRhcHRlYyBjYXJkcyB0bworCQkJICogZ2V0IHRoZSBzdWIgZGV2aWNlIGluZm8gY29ycmVjdC4KKwkJCSAqLworCQkJaWYgKERFVklEXzkwMDVfVFlQRShkZXZpY2UpID09IERFVklEXzkwMDVfVFlQRV9IQkEpCisJCQkJcmVzdWx0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNVQklEXzkwMDVfVFlQRV9SQUlEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKK3N0cnVjdCBhaGNfcGNpX2lkZW50aXR5ICoKK2FoY19maW5kX3BjaV9kZXZpY2UoYWhjX2Rldl9zb2Z0Y190IHBjaSkKK3sKKwl1aW50NjRfdCAgZnVsbF9pZDsKKwl1aW50MTZfdCAgZGV2aWNlOworCXVpbnQxNl90ICB2ZW5kb3I7CisJdWludDE2X3QgIHN1YmRldmljZTsKKwl1aW50MTZfdCAgc3VidmVuZG9yOworCXN0cnVjdAkgIGFoY19wY2lfaWRlbnRpdHkgKmVudHJ5OworCXVfaW50CSAgaTsKKworCXZlbmRvciA9IGFoY19wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX0RFVlZFTkRPUiwgLypieXRlcyovMik7CisJZGV2aWNlID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfREVWSUNFLCAvKmJ5dGVzKi8yKTsKKwlzdWJ2ZW5kb3IgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9TVUJWRU5EXzAsIC8qYnl0ZXMqLzIpOworCXN1YmRldmljZSA9IGFoY19wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX1NVQkRFVl8wLCAvKmJ5dGVzKi8yKTsKKwlmdWxsX2lkID0gYWhjX2NvbXBvc2VfaWQoZGV2aWNlLCB2ZW5kb3IsIHN1YmRldmljZSwgc3VidmVuZG9yKTsKKworCS8qCisJICogSWYgdGhlIHNlY29uZCBmdW5jdGlvbiBpcyBub3QgaG9va2VkIHVwLCBpZ25vcmUgaXQuCisJICogVW5mb3J0dW5hdGVseSwgbm90IGFsbCBNQiB2ZW5kb3JzIGltcGxlbWVudCB0aGUKKwkgKiBzdWJkZXZpY2UgSUQgYXMgcGVyIHRoZSBBZGFwdGVjIHNwZWMsIHNvIGRvIG91ciBiZXN0CisJICogdG8gc2FuaXR5IGNoZWNrIGl0IHByaW9yIHRvIGFjY2VwdGluZyB0aGUgc3ViZGV2aWNlCisJICogSUQgYXMgdmFsaWQuCisJICovCisJaWYgKGFoY19nZXRfcGNpX2Z1bmN0aW9uKHBjaSkgPiAwCisJICYmIGFoY185MDA1X3N1YmRldmluZm9fdmFsaWQodmVuZG9yLCBkZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlKQorCSAmJiBTVUJJRF85MDA1X01GVU5DRU5CKHN1YmRldmljZSkgPT0gMCkKKwkJcmV0dXJuIChOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBhaGNfbnVtX3BjaV9kZXZzOyBpKyspIHsKKwkJZW50cnkgPSAmYWhjX3BjaV9pZGVudF90YWJsZVtpXTsKKwkJaWYgKGVudHJ5LT5mdWxsX2lkID09IChmdWxsX2lkICYgZW50cnktPmlkX21hc2spKSB7CisJCQkvKiBIb25vciBleGNsdXNpb24gZW50cmllcy4gKi8KKwkJCWlmIChlbnRyeS0+bmFtZSA9PSBOVUxMKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlyZXR1cm4gKGVudHJ5KTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCitpbnQKK2FoY19wY2lfY29uZmlnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IGFoY19wY2lfaWRlbnRpdHkgKmVudHJ5KQoreworCXVfbG9uZwkgbDsKKwl1X2ludAkgY29tbWFuZDsKKwl1X2ludAkgb3VyX2lkOworCXVfaW50CSBzeGZyY3RsMTsKKwl1X2ludAkgc2NzaXNlcTsKKwl1X2ludAkgZHNjb21tYW5kMDsKKwl1aW50MzJfdCBkZXZjb25maWc7CisJaW50CSBlcnJvcjsKKwl1aW50OF90CSBzYmxrY3RsOworCisJb3VyX2lkID0gMDsKKwllcnJvciA9IGVudHJ5LT5zZXR1cChhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKwlhaGMtPmNoaXAgfD0gQUhDX1BDSTsKKwlhaGMtPmRlc2NyaXB0aW9uID0gZW50cnktPm5hbWU7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGFoYy0+ZGV2X3NvZnRjLCBBSENfUE9XRVJfU1RBVEVfRDApOworCisJZXJyb3IgPSBhaGNfcGNpX21hcF9yZWdpc3RlcnMoYWhjKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSBjb250aW51ZSBwcm9iaW5nIHRoZSBjYXJkLCBlbnN1cmUgdGhhdAorCSAqIGl0cyBpbnRlcnJ1cHRzIGFyZSAqZGlzYWJsZWQqLiAgV2UgZG9uJ3Qgd2FudAorCSAqIGEgbWlzc3RlcCB0byBoYW5nIHRoZSBtYWNoaW5lIGluIGFuIGludGVycnVwdAorCSAqIHN0b3JtLgorCSAqLworCWFoY19pbnRyX2VuYWJsZShhaGMsIEZBTFNFKTsKKworCWRldmNvbmZpZyA9IGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywgLypieXRlcyovNCk7CisKKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gc3VwcG9ydCBoaWdoIG1lbW9yeSwgZW5hYmxlIGR1YWwKKwkgKiBhZGRyZXNzIGN5Y2xlcy4gIFRoaXMgYml0IG11c3QgYmUgc2V0IHRvIGVuYWJsZQorCSAqIGhpZ2ggYWRkcmVzcyBiaXQgZ2VuZXJhdGlvbiBldmVuIGlmIHdlIGFyZSBvbiBhCisJICogNjRiaXQgYnVzIChQQ0k2NEJJVCBzZXQgaW4gZGV2Y29uZmlnKS4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgeworCisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiJXM6IEVuYWJsaW5nIDM5Qml0IEFkZHJlc3NpbmdcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CisJCWRldmNvbmZpZyB8PSBEQUNFTjsKKwl9CisJCisJLyogRW5zdXJlIHRoYXQgcGNpIGVycm9yIGdlbmVyYXRpb24sIGEgdGVzdCBmZWF0dXJlLCBpcyBkaXNhYmxlZC4gKi8KKwlkZXZjb25maWcgfD0gUENJRVJSR0VORElTOworCisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywgZGV2Y29uZmlnLCAvKmJ5dGVzKi80KTsKKworCS8qIEVuc3VyZSBidXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCAqLworCWNvbW1hbmQgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIC8qYnl0ZXMqLzIpOworCWNvbW1hbmQgfD0gUENJTV9DTURfQlVTTUFTVEVSRU47CisKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCBjb21tYW5kLCAvKmJ5dGVzKi8yKTsKKworCS8qIE9uIGFsbCBQQ0kgYWRhcHRlcnMsIHdlIGFsbG93IFNDQiBwYWdpbmcgKi8KKwlhaGMtPmZsYWdzIHw9IEFIQ19QQUdFU0NCUzsKKworCWVycm9yID0gYWhjX3NvZnRjX2luaXQoYWhjKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIERpc2FibGUgUENJIHBhcml0eSBlcnJvciBjaGVja2luZy4gIFVzZXJzIHR5cGljYWxseQorCSAqIGRvIHRoaXMgdG8gd29yayBhcm91bmQgYnJva2VuIFBDSSBjaGlwc2V0cyB0aGF0IGdldAorCSAqIHRoZSBwYXJpdHkgdGltaW5nIHdyb25nIGFuZCB0aHVzIGdlbmVyYXRlIGxvdHMgb2Ygc3B1cmlvdXMKKwkgKiBlcnJvcnMuICBUaGUgY2hpcCBvbmx5IGFsbG93cyB1cyB0byBkaXNhYmxlICphbGwqIHBhcml0eQorCSAqIGVycm9yIHJlcG9ydGluZyB3aGVuIGRvaW5nIHRoaXMsIHNvIENJTyBidXMsIHNjYiByYW0sIGFuZAorCSAqIHNjcmF0Y2ggcmFtIHBhcml0eSBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkIHRvby4KKwkgKi8KKwlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfRElTQUJMRV9QQ0lfUEVSUikgIT0gMCkKKwkJYWhjLT5zZXFjdGwgfD0gRkFJTERJUzsKKworCWFoYy0+YnVzX2ludHIgPSBhaGNfcGNpX2ludHI7CisJYWhjLT5idXNfY2hpcF9pbml0ID0gYWhjX3BjaV9jaGlwX2luaXQ7CisJYWhjLT5idXNfc3VzcGVuZCA9IGFoY19wY2lfc3VzcGVuZDsKKwlhaGMtPmJ1c19yZXN1bWUgPSBhaGNfcGNpX3Jlc3VtZTsKKworCS8qIFJlbWViZXIgaG93IHRoZSBjYXJkIHdhcyBzZXR1cCBpbiBjYXNlIHRoZXJlIGlzIG5vIFNFRVBST00gKi8KKwlpZiAoKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgUE9XUkROKSA9PSAwKSB7CisJCWFoY19wYXVzZShhaGMpOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQkJb3VyX2lkID0gYWhjX2luYihhaGMsIFNDU0lJRF9VTFRSQTIpICYgT0lEOworCQllbHNlCisJCQlvdXJfaWQgPSBhaGNfaW5iKGFoYywgU0NTSUlEKSAmIE9JRDsKKwkJc3hmcmN0bDEgPSBhaGNfaW5iKGFoYywgU1hGUkNUTDEpICYgU1RQV0VOOworCQlzY3Npc2VxID0gYWhjX2luYihhaGMsIFNDU0lTRVEpOworCX0gZWxzZSB7CisJCXN4ZnJjdGwxID0gU1RQV0VOOworCQlvdXJfaWQgPSA3OworCQlzY3Npc2VxID0gMDsKKwl9CisKKwllcnJvciA9IGFoY19yZXNldChhaGMsIC8qcmVpbml0Ki9GQUxTRSk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoRU5YSU8pOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX0RUKSAhPSAwKSB7CisJCXVfaW50IHNmdW5jdDsKKworCQkvKiBQZXJmb3JtIEFMVC1Nb2RlIFNldHVwICovCisJCXNmdW5jdCA9IGFoY19pbmIoYWhjLCBTRlVOQ1QpICYgfkFMVF9NT0RFOworCQlhaGNfb3V0YihhaGMsIFNGVU5DVCwgc2Z1bmN0IHwgQUxUX01PREUpOworCQlhaGNfb3V0YihhaGMsIE9QVElPTk1PREUsCisJCQkgT1BUSU9OTU9ERV9ERUZBVUxUU3xBVVRPQUNLRU58QlVTRlJFRVJFVnxFWFBQSEFTRURJUyk7CisJCWFoY19vdXRiKGFoYywgU0ZVTkNULCBzZnVuY3QpOworCisJCS8qIE5vcm1hbCBtb2RlIHNldHVwICovCisJCWFoY19vdXRiKGFoYywgQ1JDQ09OVFJPTDEsIENSQ1ZBTENIS0VOfENSQ0VORENIS0VOfENSQ1JFUUNIS0VOCisJCQkJCSAgfFRBUkdDUkNFTkRFTik7CisJfQorCisJZHNjb21tYW5kMCA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQwKTsKKwlkc2NvbW1hbmQwIHw9IE1QQVJDS0VOfENBQ0hFVEhFTjsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisKKwkJLyoKKwkJICogRFBBUkNLRU4gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBvbgorCQkgKiBzb21lIE1CcyBzbyBkb24ndCB1c2UgaXQuCisJCSAqLworCQlkc2NvbW1hbmQwICY9IH5EUEFSQ0tFTjsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBjaGlwcyB0aGF0IG11c3QgaGF2ZSBjYWNoZSBsaW5lCisJICogc3RyZWFtaW5nIChkaXMvZW4pYWJsZWQuCisJICovCisJaWYgKChhaGMtPmJ1Z3MgJiBBSENfQ0FDSEVUSEVOX0RJU19CVUcpICE9IDApCisJCWRzY29tbWFuZDAgfD0gQ0FDSEVUSEVOOworCisJaWYgKChhaGMtPmJ1Z3MgJiBBSENfQ0FDSEVUSEVOX0JVRykgIT0gMCkKKwkJZHNjb21tYW5kMCAmPSB+Q0FDSEVUSEVOOworCisJYWhjX291dGIoYWhjLCBEU0NPTU1BTkQwLCBkc2NvbW1hbmQwKTsKKworCWFoYy0+cGNpX2NhY2hlc2l6ZSA9CisJICAgIGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsIENTSVpFX0xBVFRJTUUsCisJCQkJLypieXRlcyovMSkgJiBDQUNIRVNJWkU7CisJYWhjLT5wY2lfY2FjaGVzaXplICo9IDQ7CisKKwlpZiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfMl8xX1JFVFJZX0JVRykgIT0gMAorCSAmJiBhaGMtPnBjaV9jYWNoZXNpemUgPT0gNCkgeworCisJCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLAorCQkJCSAgICAgMCwgLypieXRlcyovMSk7CisJCWFoYy0+cGNpX2NhY2hlc2l6ZSA9IDA7CisJfQorCisJLyoKKwkgKiBXZSBjYW5ub3QgcGVyZm9ybSBVTFRSQSBzcGVlZHMgd2l0aG91dCB0aGUgcHJlc2Vuc2UKKwkgKiBvZiB0aGUgZXh0ZXJuYWwgcHJlY2lzaW9uIHJlc2lzdG9yLgorCSAqLworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgeworCQl1aW50MzJfdCBkZXZjb25maWc7CisKKwkJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywKKwkJCQkJCURFVkNPTkZJRywgLypieXRlcyovNCk7CisJCWlmICgoZGV2Y29uZmlnICYgUkVYVFZBTElEKSA9PSAwKQorCQkJYWhjLT5mZWF0dXJlcyAmPSB+QUhDX1VMVFJBOworCX0KKworCS8qIFNlZSBpZiB3ZSBoYXZlIGEgU0VFUFJPTSBhbmQgcGVyZm9ybSBhdXRvLXRlcm0gKi8KKwljaGVja19leHRwb3J0KGFoYywgJnN4ZnJjdGwxKTsKKworCS8qCisJICogVGFrZSB0aGUgTEVEIG91dCBvZiBkaWFnbm9zdGljIG1vZGUKKwkgKi8KKwlzYmxrY3RsID0gYWhjX2luYihhaGMsIFNCTEtDVEwpOworCWFoY19vdXRiKGFoYywgU0JMS0NUTCwgKHNibGtjdGwgJiB+KERJQUdMRURFTnxESUFHTEVET04pKSk7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWFoY19vdXRiKGFoYywgREZGX1RIUlNILCBSRF9ERlRIUlNIX01BWHxXUl9ERlRIUlNIX01BWCk7CisJfSBlbHNlIHsKKwkJYWhjX291dGIoYWhjLCBEU1BDSVNUQVRVUywgREZUSFJTSF8xMDApOworCX0KKworCWlmIChhaGMtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSB7CisJCS8qCisJCSAqIFBDSSBBZGFwdGVyIGRlZmF1bHQgc2V0dXAKKwkJICogU2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgYWRhcHRlciBkb2VzIG5vdCBoYXZlCisJCSAqIGEgU0VFUFJPTS4KKwkJICovCisJCS8qIFNlZSBpZiBzb21lb25lIGVsc2Ugc2V0IHVzIHVwIGFscmVhZHkgKi8KKwkJaWYgKChhaGMtPmZsYWdzICYgQUhDX05PX0JJT1NfSU5JVCkgPT0gMAorCQkgJiYgc2NzaXNlcSAhPSAwKSB7CisJCQlwcmludGYoIiVzOiBVc2luZyBsZWZ0IG92ZXIgQklPUyBzZXR0aW5nc1xuIiwKKwkJCQlhaGNfbmFtZShhaGMpKTsKKwkJCWFoYy0+ZmxhZ3MgJj0gfkFIQ19VU0VERUZBVUxUUzsKKwkJCWFoYy0+ZmxhZ3MgfD0gQUhDX0JJT1NfRU5BQkxFRDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBBc3N1bWUgb25seSBvbmUgY29ubmVjdG9yIGFuZCBhbHdheXMgdHVybgorCQkJICogb24gdGVybWluYXRpb24uCisJCQkgKi8KKyAJCQlvdXJfaWQgPSAweDA3OworCQkJc3hmcmN0bDEgPSBTVFBXRU47CisJCX0KKwkJYWhjX291dGIoYWhjLCBTQ1NJQ09ORiwgb3VyX2lkfEVOU1BDSEt8UkVTRVRfU0NTSSk7CisKKwkJYWhjLT5vdXJfaWQgPSBvdXJfaWQ7CisJfQorCisJLyoKKwkgKiBUYWtlIGEgbG9vayB0byBzZWUgaWYgd2UgaGF2ZSBleHRlcm5hbCBTUkFNLgorCSAqIFdlIGN1cnJlbnRseSBkbyBub3QgYXR0ZW1wdCB0byB1c2UgU1JBTSB0aGF0IGlzCisJICogc2hhcmVkIGFtb25nIG11bHRpcGxlIGNvbnRyb2xsZXJzLgorCSAqLworCWFoY19wcm9iZV9leHRfc2NicmFtKGFoYyk7CisKKwkvKgorCSAqIFJlY29yZCBvdXIgdGVybWluYXRpb24gc2V0dGluZyBmb3IgdGhlCisJICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorCSAqLworCWlmICgoc3hmcmN0bDEgJiBTVFBXRU4pICE9IDApCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX1RFUk1fRU5CX0E7CisKKwkvKgorCSAqIFNhdmUgY2hpcCByZWdpc3RlciBjb25maWd1cmF0aW9uIGRhdGEgZm9yIGNoaXAgcmVzZXRzCisJICogdGhhdCBvY2N1ciBkdXJpbmcgcnVudGltZSBhbmQgcmVzdW1lIGV2ZW50cy4KKwkgKi8KKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZGV2Y29uZmlnID0KKwkgICAgYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuY29tbWFuZCA9CisJICAgIGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgLypieXRlcyovMSk7CisJYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmNzaXplX2xhdHRpbWUgPQorCSAgICBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLCAvKmJ5dGVzKi8xKTsKKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZHNjb21tYW5kMCA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQwKTsKKwlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZHNwY2lzdGF0dXMgPSBhaGNfaW5iKGFoYywgRFNQQ0lTVEFUVVMpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgIT0gMCkgeworCQl1X2ludCBzZnVuY3Q7CisKKwkJc2Z1bmN0ID0gYWhjX2luYihhaGMsIFNGVU5DVCkgJiB+QUxUX01PREU7CisJCWFoY19vdXRiKGFoYywgU0ZVTkNULCBzZnVuY3QgfCBBTFRfTU9ERSk7CisJCWFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5vcHRpb25tb2RlID0gYWhjX2luYihhaGMsIE9QVElPTk1PREUpOworCQlhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMudGFyZ2NyY2NudCA9IGFoY19pbncoYWhjLCBUQVJHQ1JDQ05UKTsKKwkJYWhjX291dGIoYWhjLCBTRlVOQ1QsIHNmdW5jdCk7CisJCWFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5jcmNjb250cm9sMSA9CisJCSAgICBhaGNfaW5iKGFoYywgQ1JDQ09OVFJPTDEpOworCX0KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTVVMVElfRlVOQykgIT0gMCkKKwkJYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLnNjYmJhZGRyID0gYWhjX2luYihhaGMsIFNDQkJBRERSKTsKKworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCWFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5kZmZfdGhyc2ggPSBhaGNfaW5iKGFoYywgREZGX1RIUlNIKTsKKworCS8qIENvcmUgaW5pdGlhbGl6YXRpb24gKi8KKwllcnJvciA9IGFoY19pbml0KGFoYyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBBbGxvdyBpbnRlcnJ1cHRzIG5vdyB0aGF0IHdlIGFyZSBjb21wbGV0ZWx5IHNldHVwLgorCSAqLworCWVycm9yID0gYWhjX3BjaV9tYXBfaW50KGFoYyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOworCisJYWhjX2xpc3RfbG9jaygmbCk7CisJLyoKKwkgKiBMaW5rIHRoaXMgc29mdGMgaW4gd2l0aCBhbGwgb3RoZXIgYWhjIGluc3RhbmNlcy4KKwkgKi8KKwlhaGNfc29mdGNfaW5zZXJ0KGFoYyk7CisJYWhjX2xpc3RfdW5sb2NrKCZsKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogVGVzdCBmb3IgdGhlIHByZXNlbnNlIG9mIGV4dGVybmFsIHNyYW0gaW4gYW4KKyAqICJ1bnNoYXJlZCIgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGludAorYWhjX2V4dF9zY2JyYW1fcHJlc2VudChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJdV9pbnQgY2hpcDsKKwlpbnQgcmFtcHM7CisJaW50IHNpbmdsZV91c2VyOworCXVpbnQzMl90IGRldmNvbmZpZzsKKworCWNoaXAgPSBhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0s7CisJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywKKwkJCQkJREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlzaW5nbGVfdXNlciA9IChkZXZjb25maWcgJiBNUE9SVE1PREUpICE9IDA7CisKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlyYW1wcyA9IChhaGNfaW5iKGFoYywgRFNDT01NQU5EMCkgJiBSQU1QUykgIT0gMDsKKwllbHNlIGlmIChjaGlwID09IEFIQ19BSUM3ODk1IHx8IGNoaXAgPT0gQUhDX0FJQzc4OTVDKQorCQkvKgorCQkgKiBFeHRlcm5hbCBTQ0JSQU0gYXJiaXRyYXRpb24gaXMgZmxha2V5CisJCSAqIG9uIHRoZXNlIGNoaXBzLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zCisJCSAqIHdlIGRvbid0IHVzZSB0aGUgZXh0cmEgU0NCIHJhbSBzcGFjZSBvbiB0aGUKKwkJICogMzk0MEFVVy4KKwkJICovCisJCXJhbXBzID0gMDsKKwllbHNlIGlmIChjaGlwID49IEFIQ19BSUM3ODcwKQorCQlyYW1wcyA9IChkZXZjb25maWcgJiBSQU1QU00pICE9IDA7CisJZWxzZQorCQlyYW1wcyA9IDA7CisKKwlpZiAocmFtcHMgJiYgc2luZ2xlX3VzZXIpCisJCXJldHVybiAoMSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEVuYWJsZSBleHRlcm5hbCBzY2JyYW0uCisgKi8KK3N0YXRpYyB2b2lkCithaGNfc2NicmFtX2NvbmZpZyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBlbmFibGUsIGludCBwY2hlY2ssCisJCSAgaW50IGZhc3QsIGludCBsYXJnZSkKK3sKKwl1aW50MzJfdCBkZXZjb25maWc7CisKKwlpZiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9GVU5DKSB7CisJCS8qCisJCSAqIFNldCB0aGUgU0NCIEJhc2UgYWRkciAoaGlnaGVzdCBhZGRyZXNzIGJpdCkKKwkJICogZGVwZW5kaW5nIG9uIHdoaWNoIGNoYW5uZWwgd2UgYXJlLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTQ0JCQUREUiwgYWhjX2dldF9wY2lfZnVuY3Rpb24oYWhjLT5kZXZfc29mdGMpKTsKKwl9CisKKwlhaGMtPmZsYWdzICY9IH5BSENfTFNDQlNfRU5BQkxFRDsKKwlpZiAobGFyZ2UpCisJCWFoYy0+ZmxhZ3MgfD0gQUhDX0xTQ0JTX0VOQUJMRUQ7CisJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCXVfaW50IGRzY29tbWFuZDA7CisKKwkJZHNjb21tYW5kMCA9IGFoY19pbmIoYWhjLCBEU0NPTU1BTkQwKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWRzY29tbWFuZDAgJj0gfklOVFNDQlJBTVNFTDsKKwkJZWxzZQorCQkJZHNjb21tYW5kMCB8PSBJTlRTQ0JSQU1TRUw7CisJCWlmIChsYXJnZSkKKwkJCWRzY29tbWFuZDAgJj0gflVTQ0JTSVpFMzI7CisJCWVsc2UKKwkJCWRzY29tbWFuZDAgfD0gVVNDQlNJWkUzMjsKKwkJYWhjX291dGIoYWhjLCBEU0NPTU1BTkQwLCBkc2NvbW1hbmQwKTsKKwl9IGVsc2UgeworCQlpZiAoZmFzdCkKKwkJCWRldmNvbmZpZyAmPSB+RVhUU0NCVElNRTsKKwkJZWxzZQorCQkJZGV2Y29uZmlnIHw9IEVYVFNDQlRJTUU7CisJCWlmIChlbmFibGUpCisJCQlkZXZjb25maWcgJj0gflNDQlJBTVNFTDsKKwkJZWxzZQorCQkJZGV2Y29uZmlnIHw9IFNDQlJBTVNFTDsKKwkJaWYgKGxhcmdlKQorCQkJZGV2Y29uZmlnICY9IH5TQ0JTSVpFMzI7CisJCWVsc2UKKwkJCWRldmNvbmZpZyB8PSBTQ0JTSVpFMzI7CisJfQorCWlmIChwY2hlY2spCisJCWRldmNvbmZpZyB8PSBFWFRTQ0JQRU47CisJZWxzZQorCQlkZXZjb25maWcgJj0gfkVYVFNDQlBFTjsKKworCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBERVZDT05GSUcsIGRldmNvbmZpZywgLypieXRlcyovNCk7Cit9CisKKy8qCisgKiBUYWtlIGEgbG9vayB0byBzZWUgaWYgd2UgaGF2ZSBleHRlcm5hbCBTUkFNLgorICogV2UgY3VycmVudGx5IGRvIG5vdCBhdHRlbXB0IHRvIHVzZSBTUkFNIHRoYXQgaXMKKyAqIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBjb250cm9sbGVycy4KKyAqLworc3RhdGljIHZvaWQKK2FoY19wcm9iZV9leHRfc2NicmFtKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgbnVtX3NjYnM7CisJaW50IHRlc3RfbnVtX3NjYnM7CisJaW50IGVuYWJsZTsKKwlpbnQgcGNoZWNrOworCWludCBmYXN0OworCWludCBsYXJnZTsKKworCWVuYWJsZSA9IEZBTFNFOworCXBjaGVjayA9IEZBTFNFOworCWZhc3QgPSBGQUxTRTsKKwlsYXJnZSA9IEZBTFNFOworCW51bV9zY2JzID0gMDsKKwkKKwlpZiAoYWhjX2V4dF9zY2JyYW1fcHJlc2VudChhaGMpID09IDApCisJCWdvdG8gZG9uZTsKKworCS8qCisJICogUHJvYmUgZm9yIHRoZSBiZXN0IHBhcmFtZXRlcnMgdG8gdXNlLgorCSAqLworCWFoY19zY2JyYW1fY29uZmlnKGFoYywgLyplbmFibGUqL1RSVUUsIHBjaGVjaywgZmFzdCwgbGFyZ2UpOworCW51bV9zY2JzID0gYWhjX3Byb2JlX3NjYnMoYWhjKTsKKwlpZiAobnVtX3NjYnMgPT0gMCkgeworCQkvKiBUaGUgU1JBTSB3YXNuJ3QgcmVhbGx5IHByZXNlbnQuICovCisJCWdvdG8gZG9uZTsKKwl9CisJZW5hYmxlID0gVFJVRTsKKworCS8qCisJICogQ2xlYXIgYW55IG91dHN0YW5kaW5nIHBhcml0eSBlcnJvcgorCSAqIGFuZCBlbnN1cmUgdGhhdCBwYXJpdHkgZXJyb3IgcmVwb3J0aW5nCisJICogaXMgZW5hYmxlZC4KKwkgKi8KKwlhaGNfb3V0YihhaGMsIFNFUUNUTCwgMCk7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CisKKwkvKiBOb3cgc2VlIGlmIHdlIGNhbiBkbyBwYXJpdHkgKi8KKwlhaGNfc2NicmFtX2NvbmZpZyhhaGMsIGVuYWJsZSwgLypwY2hlY2sqL1RSVUUsIGZhc3QsIGxhcmdlKTsKKwludW1fc2NicyA9IGFoY19wcm9iZV9zY2JzKGFoYyk7CisJaWYgKChhaGNfaW5iKGFoYywgSU5UU1RBVCkgJiBCUktBRFJJTlQpID09IDAKKwkgfHwgKGFoY19pbmIoYWhjLCBFUlJPUikgJiBNUEFSRVJSKSA9PSAwKQorCQlwY2hlY2sgPSBUUlVFOworCisJLyogQ2xlYXIgYW55IHJlc3VsdGluZyBwYXJpdHkgZXJyb3IgKi8KKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSQlJLQURSSU5UKTsKKworCS8qIE5vdyBzZWUgaWYgd2UgY2FuIGRvIGZhc3QgdGltaW5nICovCisJYWhjX3NjYnJhbV9jb25maWcoYWhjLCBlbmFibGUsIHBjaGVjaywgLypmYXN0Ki9UUlVFLCBsYXJnZSk7CisJdGVzdF9udW1fc2NicyA9IGFoY19wcm9iZV9zY2JzKGFoYyk7CisJaWYgKHRlc3RfbnVtX3NjYnMgPT0gbnVtX3NjYnMKKwkgJiYgKChhaGNfaW5iKGFoYywgSU5UU1RBVCkgJiBCUktBRFJJTlQpID09IDAKKwkgIHx8IChhaGNfaW5iKGFoYywgRVJST1IpICYgTVBBUkVSUikgPT0gMCkpCisJCWZhc3QgPSBUUlVFOworCisJLyoKKwkgKiBTZWUgaWYgd2UgY2FuIHVzZSBsYXJnZSBTQ0JzIGFuZCBzdGlsbCBtYWludGFpbgorCSAqIHRoZSBzYW1lIG92ZXJhbGwgY291bnQgb2YgU0NCcy4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTEFSR0VfU0NCUykgIT0gMCkgeworCQlhaGNfc2NicmFtX2NvbmZpZyhhaGMsIGVuYWJsZSwgcGNoZWNrLCBmYXN0LCAvKmxhcmdlKi9UUlVFKTsKKwkJdGVzdF9udW1fc2NicyA9IGFoY19wcm9iZV9zY2JzKGFoYyk7CisJCWlmICh0ZXN0X251bV9zY2JzID49IG51bV9zY2JzKSB7CisJCQlsYXJnZSA9IFRSVUU7CisJCQludW1fc2NicyA9IHRlc3RfbnVtX3NjYnM7CisJIAkJaWYgKG51bV9zY2JzID49IDY0KSB7CisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIGVub3VnaCBzcGFjZSB0byBtb3ZlIHRoZQorCQkJCSAqICJidXN5IHRhcmdldHMgdGFibGUiIGludG8gU0NCIHNwYWNlCisJCQkJICogYW5kIG1ha2UgaXQgcXVhbGlmeSBhbGwgdGhlIHdheSB0byB0aGUKKwkJCQkgKiBsdW4gbGV2ZWwuCisJCQkJICovCisJCQkJYWhjLT5mbGFncyB8PSBBSENfU0NCX0JUVDsKKwkJCX0KKwkJfQorCX0KK2RvbmU6CisJLyoKKwkgKiBEaXNhYmxlIHBhcml0eSBlcnJvciByZXBvcnRpbmcgdW50aWwgd2UKKwkgKiBjYW4gbG9hZCBpbnN0cnVjdGlvbiByYW0uCisJICovCisJYWhjX291dGIoYWhjLCBTRVFDVEwsIFBFUlJPUkRJU3xGQUlMRElTKTsKKwkvKiBDbGVhciBhbnkgbGF0Y2hlZCBwYXJpdHkgZXJyb3IgKi8KKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSQlJLQURSSU5UKTsKKwlpZiAoYm9vdHZlcmJvc2UgJiYgZW5hYmxlKSB7CisJCXByaW50ZigiJXM6IEV4dGVybmFsIFNSQU0sICVzIGFjY2VzcyVzLCAlZGJ5dGVzL1NDQlxuIiwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGZhc3QgPyAiZmFzdCIgOiAic2xvdyIsIAorCQkgICAgICAgcGNoZWNrID8gIiwgcGFyaXR5IGNoZWNraW5nIGVuYWJsZWQiIDogIiIsCisJCSAgICAgICBsYXJnZSA/IDY0IDogMzIpOworCX0KKwlhaGNfc2NicmFtX2NvbmZpZyhhaGMsIGVuYWJsZSwgcGNoZWNrLCBmYXN0LCBsYXJnZSk7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNvbWUgc2ltcGxlIHRlc3RzIHRoYXQgc2hvdWxkIGNhdGNoIHNpdHVhdGlvbnMgd2hlcmUKKyAqIG91ciByZWdpc3RlcnMgYXJlIGludmFsaWRseSBtYXBwZWQuCisgKi8KK2ludAorYWhjX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50CSBlcnJvcjsKKwl1X2ludAkgc3RhdHVzMTsKKwl1aW50MzJfdCBjbWQ7CisJdWludDhfdAkgaGNudHJsOworCisJZXJyb3IgPSBFSU87CisKKwkvKgorCSAqIEVuYWJsZSBQQ0kgZXJyb3IgaW50ZXJydXB0IHN0YXR1cywgYnV0IHN1cHByZXNzIE5NSXMKKwkgKiBnZW5lcmF0ZWQgYnkgU0VSUiByYWlzZWQgZHVlIHRvIHRhcmdldCBhYm9ydHMuCisJICovCisJY21kID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELCAvKmJ5dGVzKi8yKTsKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9DT01NQU5ELAorCQkJICAgICBjbWQgJiB+UENJTV9DTURfU0VSUkVTUEVOLCAvKmJ5dGVzKi8yKTsKKworCS8qCisJICogRmlyc3QgYSBzaW1wbGUgdGVzdCB0byBzZWUgaWYgYW55CisJICogcmVnaXN0ZXJzIGNhbiBiZSByZWFkLiAgUmVhZGluZworCSAqIEhDTlRSTCBoYXMgbm8gc2lkZSBlZmZlY3RzIGFuZCBoYXMKKwkgKiBhdCBsZWFzdCBvbmUgYml0IHRoYXQgaXMgZ3VhcmFudGVlZCB0bworCSAqIGJlIHplcm8gc28gaXQgaXMgYSBnb29kIHJlZ2lzdGVyIHRvCisJICogdXNlIGZvciB0aGlzIHRlc3QuCisJICovCisJaGNudHJsID0gYWhjX2luYihhaGMsIEhDTlRSTCk7CisJaWYgKGhjbnRybCA9PSAweEZGKQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSAqIE5leHQgY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdyaXRlIGNvbWJpbmluZworCSAqIG9yIHJlYWQgcHJlZmV0Y2hpbmcgY291bGQgYmUgaW5pdGlhdGVkIGJ5IHRoZQorCSAqIENQVSBvciBob3N0IGJyaWRnZS4gIE91ciBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorCSAqIGVpdGhlciwgc28gbG9vayBmb3IgZGF0YSBjb3JydXB0aW9uIGFuZC9vciBmbGFnZ2VkCisJICogUENJIGVycm9ycy4gIEZpcnN0IHBhdXNlIHdpdGhvdXQgY2F1c2luZyBhbm90aGVyCisJICogY2hpcCByZXNldC4KKwkgKi8KKwloY250cmwgJj0gfkNISVBSU1Q7CisJYWhjX291dGIoYWhjLCBIQ05UUkwsIGhjbnRybHxQQVVTRSk7CisJd2hpbGUgKGFoY19pc19wYXVzZWQoYWhjKSA9PSAwKQorCQk7CisKKwkvKiBDbGVhciBhbnkgUENJIGVycm9ycyB0aGF0IG9jY3VycmVkIGJlZm9yZSBvdXIgZHJpdmVyIGF0dGFjaGVkLiAqLworCXN0YXR1czEgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLAorCQkJCSAgICAgIFBDSVJfU1RBVFVTICsgMSwgLypieXRlcyovMSk7CisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfU1RBVFVTICsgMSwKKwkJCSAgICAgc3RhdHVzMSwgLypieXRlcyovMSk7CisJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUlBBUkVSUik7CisKKwlhaGNfb3V0YihhaGMsIFNFUUNUTCwgUEVSUk9SRElTKTsKKwlhaGNfb3V0YihhaGMsIFNDQlBUUiwgMCk7CisJYWhjX291dGwoYWhjLCBTQ0JfQkFTRSwgMHg1YWE1NTVhYSk7CisJaWYgKGFoY19pbmwoYWhjLCBTQ0JfQkFTRSkgIT0gMHg1YWE1NTVhYSkKKwkJZ290byBmYWlsOworCisJc3RhdHVzMSA9IGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsCisJCQkJICAgICAgUENJUl9TVEFUVVMgKyAxLCAvKmJ5dGVzKi8xKTsKKwlpZiAoKHN0YXR1czEgJiBTVEEpICE9IDApCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gMDsKKworZmFpbDoKKwkvKiBTaWxlbnRseSBjbGVhciBhbnkgbGF0Y2hlZCBlcnJvcnMuICovCisJc3RhdHVzMSA9IGFoY19wY2lfcmVhZF9jb25maWcoYWhjLT5kZXZfc29mdGMsCisJCQkJICAgICAgUENJUl9TVEFUVVMgKyAxLCAvKmJ5dGVzKi8xKTsKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9TVEFUVVMgKyAxLAorCQkJICAgICBzdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKwlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwlhaGNfb3V0YihhaGMsIFNFUUNUTCwgUEVSUk9SRElTfEZBSUxESVMpOworCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBQQ0lSX0NPTU1BTkQsIGNtZCwgLypieXRlcyovMik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgZXh0ZXJuYWwgcG9ydCBsb2dpYyBmb3IgYSBzZXJpYWwgZWVwcm9tCisgKiBhbmQgdGVybWluYXRpb24vY2FibGUgZGV0ZWN0aW9uIGNvbnRybHMuCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19leHRwb3J0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgKnN4ZnJjdGwxKQoreworCXN0cnVjdAlzZWVwcm9tX2Rlc2NyaXB0b3Igc2Q7CisJc3RydWN0CXNlZXByb21fY29uZmlnICpzYzsKKwlpbnQJaGF2ZV9zZWVwcm9tOworCWludAloYXZlX2F1dG90ZXJtOworCisJc2Quc2RfYWhjID0gYWhjOworCXNkLnNkX2NvbnRyb2xfb2Zmc2V0ID0gU0VFQ1RMOwkJCisJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNFRUNUTDsJCQorCXNkLnNkX2RhdGFvdXRfb2Zmc2V0ID0gU0VFQ1RMOwkJCisJc2MgPSBhaGMtPnNlZXBfY29uZmlnOworCisJLyoKKwkgKiBGb3Igc29tZSBtdWx0aS1jaGFubmVsIGRldmljZXMsIHRoZSBjNDYgaXMgc2ltcGx5IHRvbworCSAqIHNtYWxsIHRvIHdvcmsuICBGb3IgdGhlIG90aGVyIGNvbnRyb2xsZXIgdHlwZXMsIHdlIGNhbgorCSAqIGdldCBvdXIgaW5mb3JtYXRpb24gZnJvbSBlaXRoZXIgU0VFUFJPTSB0eXBlLiAgU2V0IHRoZQorCSAqIHR5cGUgdG8gc3RhcnQgb3VyIHByb2JlIHdpdGggYWNjb3JkaW5nbHkuCisJICovCisJaWYgKGFoYy0+ZmxhZ3MgJiBBSENfTEFSR0VfU0VFUFJPTSkKKwkJc2Quc2RfY2hpcCA9IEM1Nl82NjsKKwllbHNlCisJCXNkLnNkX2NoaXAgPSBDNDY7CisKKwlzZC5zZF9NUyA9IFNFRU1TOworCXNkLnNkX1JEWSA9IFNFRVJEWTsKKwlzZC5zZF9DUyA9IFNFRUNTOworCXNkLnNkX0NLID0gU0VFQ0s7CisJc2Quc2RfRE8gPSBTRUVETzsKKwlzZC5zZF9ESSA9IFNFRURJOworCisJaGF2ZV9zZWVwcm9tID0gYWhjX2FjcXVpcmVfc2VlcHJvbShhaGMsICZzZCk7CisJaWYgKGhhdmVfc2VlcHJvbSkgeworCisJCWlmIChib290dmVyYm9zZSkgCisJCQlwcmludGYoIiVzOiBSZWFkaW5nIFNFRVBST00uLi4iLCBhaGNfbmFtZShhaGMpKTsKKworCQlmb3IgKDs7KSB7CisJCQl1X2ludCBzdGFydF9hZGRyOworCisJCQlzdGFydF9hZGRyID0gMzIgKiAoYWhjLT5jaGFubmVsIC0gJ0EnKTsKKworCQkJaGF2ZV9zZWVwcm9tID0gYWhjX3JlYWRfc2VlcHJvbSgmc2QsICh1aW50MTZfdCAqKXNjLAorCQkJCQkJCXN0YXJ0X2FkZHIsCisJCQkJCQkJc2l6ZW9mKCpzYykvMik7CisKKwkJCWlmIChoYXZlX3NlZXByb20pCisJCQkJaGF2ZV9zZWVwcm9tID0gYWhjX3ZlcmlmeV9ja3N1bShzYyk7CisKKwkJCWlmIChoYXZlX3NlZXByb20gIT0gMCB8fCBzZC5zZF9jaGlwID09IEM1Nl82NikgeworCQkJCWlmIChib290dmVyYm9zZSkgeworCQkJCQlpZiAoaGF2ZV9zZWVwcm9tID09IDApCisJCQkJCQlwcmludGYgKCJjaGVja3N1bSBlcnJvclxuIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ZiAoImRvbmUuXG4iKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZC5zZF9jaGlwID0gQzU2XzY2OworCQl9CisJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKwl9CisKKwlpZiAoIWhhdmVfc2VlcHJvbSkgeworCQkvKgorCQkgKiBQdWxsIHNjcmF0Y2ggcmFtIHNldHRpbmdzIGFuZCB0cmVhdCB0aGVtIGFzCisJCSAqIGlmIHRoZXkgYXJlIHRoZSBjb250ZW50cyBvZiBhbiBzZWVwcm9tIGlmCisJCSAqIHRoZSAnQURQVCcgc2lnbmF0dXJlIGlzIGZvdW5kIGluIFNDQjIuCisJCSAqIFdlIG1hbnVhbGx5IGNvbXBvc2UgdGhlIGRhdGEgYXMgMTZiaXQgdmFsdWVzCisJCSAqIHRvIGF2b2lkIGVuZGlhbiBpc3N1ZXMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNDQlBUUiwgMik7CisJCWlmIChhaGNfaW5iKGFoYywgU0NCX0JBU0UpID09ICdBJworCQkgJiYgYWhjX2luYihhaGMsIFNDQl9CQVNFICsgMSkgPT0gJ0QnCisJCSAmJiBhaGNfaW5iKGFoYywgU0NCX0JBU0UgKyAyKSA9PSAnUCcKKwkJICYmIGFoY19pbmIoYWhjLCBTQ0JfQkFTRSArIDMpID09ICdUJykgeworCQkJdWludDE2X3QgKnNjX2RhdGE7CisJCQlpbnQJICBpOworCisJCQlzY19kYXRhID0gKHVpbnQxNl90ICopc2M7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgc2NfZGF0YSsrKSB7CisJCQkJaW50CWo7CisKKwkJCQlqID0gaSAqIDI7CisJCQkJKnNjX2RhdGEgPSBhaGNfaW5iKGFoYywgU1JBTV9CQVNFICsgaikKKwkJCQkJIHwgYWhjX2luYihhaGMsIFNSQU1fQkFTRSArIGogKyAxKSA8PCA4OworCQkJfQorCQkJaGF2ZV9zZWVwcm9tID0gYWhjX3ZlcmlmeV9ja3N1bShzYyk7CisJCQlpZiAoaGF2ZV9zZWVwcm9tKQorCQkJCWFoYy0+ZmxhZ3MgfD0gQUhDX1NDQl9DT05GSUdfVVNFRDsKKwkJfQorCQkvKgorCQkgKiBDbGVhciBhbnkgU0NCIHBhcml0eSBlcnJvcnMgaW4gY2FzZSB0aGlzIGRhdGEgYW5kCisJCSAqIGl0cyBhc3NvY2lhdGVkIHBhcml0eSB3YXMgbm90IGluaXRpYWxpemVkIGJ5IHRoZSBCSU9TCisJCSAqLworCQlhaGNfb3V0YihhaGMsIENMUklOVCwgQ0xSUEFSRVJSKTsKKwkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkJSS0FEUklOVCk7CisJfQorCisJaWYgKCFoYXZlX3NlZXByb20pIHsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCIlczogTm8gU0VFUFJPTSBhdmFpbGFibGUuXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJYWhjLT5mbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CisJCWZyZWUoYWhjLT5zZWVwX2NvbmZpZywgTV9ERVZCVUYpOworCQlhaGMtPnNlZXBfY29uZmlnID0gTlVMTDsKKwkJc2MgPSBOVUxMOworCX0gZWxzZSB7CisJCWFoY19wYXJzZV9wY2lfZWVwcm9tKGFoYywgc2MpOworCX0KKworCS8qCisJICogQ2FyZHMgdGhhdCBoYXZlIHRoZSBleHRlcm5hbCBsb2dpYyBuZWNlc3NhcnkgdG8gdGFsayB0bworCSAqIGEgU0VFUFJPTSwgYXJlIGFsbW9zdCBjZXJ0YWluIHRvIGhhdmUgdGhlIHJlbWFpbmluZyBsb2dpYworCSAqIG5lY2Vzc2FyeSBmb3IgYXV0by10ZXJtaW5hdGlvbiBjb250cm9sLiAgVGhpcyBhc3N1bXB0aW9uCisJICogaGFzbid0IGZhaWxlZCB5ZXQuLi4KKwkgKi8KKwloYXZlX2F1dG90ZXJtID0gaGF2ZV9zZWVwcm9tOworCisJLyoKKwkgKiBTb21lIGxvdy1jb3N0IGNoaXBzIGhhdmUgU0VFUFJPTSBhbmQgYXV0by10ZXJtIGNvbnRyb2wgYnVpbHQKKwkgKiBpbiwgaW5zdGVhZCBvZiB1c2luZyBhIEdBTC4gIFRoZXkgY2FuIHRlbGwgdXMgZGlyZWN0bHkKKwkgKiBpZiB0aGUgdGVybWluYXRpb24gbG9naWMgaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfU1BJT0NBUCkgIT0gMCkgeworCQlpZiAoKGFoY19pbmIoYWhjLCBTUElPQ0FQKSAmIFNTUElPQ1BTKSA9PSAwKQorCQkJaGF2ZV9hdXRvdGVybSA9IEZBTFNFOworCX0KKworCWlmIChoYXZlX2F1dG90ZXJtKSB7CisJCWFoYy0+ZmxhZ3MgfD0gQUhDX0hBU19URVJNX0xPR0lDOworCQlhaGNfYWNxdWlyZV9zZWVwcm9tKGFoYywgJnNkKTsKKwkJY29uZmlndXJlX3Rlcm1pbmF0aW9uKGFoYywgJnNkLCBzYy0+YWRhcHRlcl9jb250cm9sLCBzeGZyY3RsMSk7CisJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKwl9IGVsc2UgaWYgKGhhdmVfc2VlcHJvbSkgeworCQkqc3hmcmN0bDEgJj0gflNUUFdFTjsKKwkJaWYgKChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZTVEVSTSkgIT0gMCkKKwkJCSpzeGZyY3RsMSB8PSBTVFBXRU47CisJCWlmIChib290dmVyYm9zZSkKKwkJCXByaW50ZigiJXM6IExvdyBieXRlIHRlcm1pbmF0aW9uICVzYWJsZWRcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCSAgICAgICAoKnN4ZnJjdGwxICYgU1RQV0VOKSA/ICJlbiIgOiAiZGlzIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWhjX3BhcnNlX3BjaV9lZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKQoreworCS8qCisJICogUHV0IHRoZSBkYXRhIHdlJ3ZlIGNvbGxlY3RlZCBkb3duIGludG8gU1JBTQorCSAqIHdoZXJlIGFoY19pbml0IHdpbGwgZmluZCBpdC4KKwkgKi8KKwlpbnQJIGk7CisJaW50CSBtYXhfdGFyZyA9IHNjLT5tYXhfdGFyZ2V0cyAmIENGTUFYVEFSRzsKKwl1X2ludAkgc2NzaV9jb25mOworCXVpbnQxNl90IGRpc2NlbmFibGU7CisJdWludDE2X3QgdWx0cmFlbmI7CisKKwlkaXNjZW5hYmxlID0gMDsKKwl1bHRyYWVuYiA9IDA7CisJaWYgKChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKSAhPSAwKSB7CisJCS8qCisJCSAqIERldGVybWluZSBpZiB0aGlzIGFkYXB0ZXIgaGFzIGEgIm5ld3N0eWxlIgorCQkgKiBTRUVQUk9NIGZvcm1hdC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfdGFyZzsgaSsrKSB7CisJCQlpZiAoKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkgIT0gMCkgeworCQkJCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3Rhcmc7IGkrKykgeworCQl1X2ludCAgICAgc2NzaXJhdGU7CisJCXVpbnQxNl90IHRhcmdldF9tYXNrOworCisJCXRhcmdldF9tYXNrID0gMHgwMSA8PCBpOworCQlpZiAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGRElTQykKKwkJCWRpc2NlbmFibGUgfD0gdGFyZ2V0X21hc2s7CisJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19ORVdFRVBST01fRk1UKSAhPSAwKSB7CisJCQlpZiAoKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkgIT0gMCkKKwkJCQl1bHRyYWVuYiB8PSB0YXJnZXRfbWFzazsKKwkJfSBlbHNlIGlmICgoc2MtPmFkYXB0ZXJfY29udHJvbCAmIENGVUxUUkFFTikgIT0gMCkgeworCQkJdWx0cmFlbmIgfD0gdGFyZ2V0X21hc2s7CisJCX0KKwkJaWYgKChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKSA9PSAweDA0CisJCSAmJiAodWx0cmFlbmIgJiB0YXJnZXRfbWFzaykgIT0gMCkgeworCQkJLyogVHJlYXQgMTBNSHogYXMgYSBub24tdWx0cmEgc3BlZWQgKi8KKwkJCXNjLT5kZXZpY2VfZmxhZ3NbaV0gJj0gfkNGWEZFUjsKKwkJIAl1bHRyYWVuYiAmPSB+dGFyZ2V0X21hc2s7CisJCX0KKwkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQkJdV9pbnQgb2Zmc2V0OworCisJCQlpZiAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGU1lOQ0gpCisJCQkJb2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisJCQllbHNlIAorCQkJCW9mZnNldCA9IDA7CisJCQlhaGNfb3V0YihhaGMsIFRBUkdfT0ZGU0VUICsgaSwgb2Zmc2V0KTsKKworCQkJLyoKKwkJCSAqIFRoZSB1bHRyYSBlbmFibGUgYml0cyBjb250YWluIHRoZQorCQkJICogaGlnaCBiaXQgb2YgdGhlIHVsdHJhMiBzeW5jIHJhdGUKKwkJCSAqIGZpZWxkLgorCQkJICovCisJCQlzY3NpcmF0ZSA9IChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKQorCQkJCSB8ICgodWx0cmFlbmIgJiB0YXJnZXRfbWFzaykgPyAweDggOiAweDApOworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRldJREVCKQorCQkJCXNjc2lyYXRlIHw9IFdJREVYRkVSOworCQl9IGVsc2UgeworCQkJc2NzaXJhdGUgPSAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgPDwgNDsKKwkJCWlmIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZTWU5DSCkKKwkJCQlzY3NpcmF0ZSB8PSBTT0ZTOworCQkJaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRldJREVCKQorCQkJCXNjc2lyYXRlIHw9IFdJREVYRkVSOworCQl9CisJCWFoY19vdXRiKGFoYywgVEFSR19TQ1NJUkFURSArIGksIHNjc2lyYXRlKTsKKwl9CisJYWhjLT5vdXJfaWQgPSBzYy0+YnJ0aW1lX2lkICYgQ0ZTQ1NJSUQ7CisKKwlzY3NpX2NvbmYgPSAoYWhjLT5vdXJfaWQgJiAweDcpOworCWlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZTUEFSSVRZKQorCQlzY3NpX2NvbmYgfD0gRU5TUENISzsKKwlpZiAoc2MtPmFkYXB0ZXJfY29udHJvbCAmIENGUkVTRVRCKQorCQlzY3NpX2NvbmYgfD0gUkVTRVRfU0NTSTsKKworCWFoYy0+ZmxhZ3MgfD0gKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRkJPT1RDSEFOKSA+PiBDRkJPT1RDSEFOU0hJRlQ7CisKKwlpZiAoc2MtPmJpb3NfY29udHJvbCAmIENGRVhURU5EKQorCQlhaGMtPmZsYWdzIHw9IEFIQ19FWFRFTkRFRF9UUkFOU19BOworCisJaWYgKHNjLT5iaW9zX2NvbnRyb2wgJiBDRkJJT1NFTikKKwkJYWhjLT5mbGFncyB8PSBBSENfQklPU19FTkFCTEVEOworCWlmIChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBCisJICYmIChhaGMtPmZsYWdzICYgQUhDX05FV0VFUFJPTV9GTVQpID09IDApIHsKKwkJLyogU2hvdWxkIHdlIGVuYWJsZSBVbHRyYSBtb2RlPyAqLworCQlpZiAoIShzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKSkKKwkJCS8qIFRyZWF0IHVzIGFzIGEgbm9uLXVsdHJhIGNhcmQgKi8KKwkJCXVsdHJhZW5iID0gMDsKKwl9CisKKwlpZiAoc2MtPnNpZ25hdHVyZSA9PSBDRlNJR05BVFVSRQorCSB8fCBzYy0+c2lnbmF0dXJlID09IENGU0lHTkFUVVJFMikgeworCQl1aW50MzJfdCBkZXZjb25maWc7CisKKwkJLyogSG9ub3IgdGhlIFNUUFdMRVZFTCBzZXR0aW5ncyAqLworCQlkZXZjb25maWcgPSBhaGNfcGNpX3JlYWRfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLAorCQkJCQkJREVWQ09ORklHLCAvKmJ5dGVzKi80KTsKKwkJZGV2Y29uZmlnICY9IH5TVFBXTEVWRUw7CisJCWlmICgoc2MtPmJpb3NfY29udHJvbCAmIENGU1RQV0xFVkVMKSAhPSAwKQorCQkJZGV2Y29uZmlnIHw9IFNUUFdMRVZFTDsKKwkJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywKKwkJCQkgICAgIGRldmNvbmZpZywgLypieXRlcyovNCk7CisJfQorCS8qIFNldCBTQ1NJQ09ORiBpbmZvICovCisJYWhjX291dGIoYWhjLCBTQ1NJQ09ORiwgc2NzaV9jb25mKTsKKwlhaGNfb3V0YihhaGMsIERJU0NfRFNCLCB+KGRpc2NlbmFibGUgJiAweGZmKSk7CisJYWhjX291dGIoYWhjLCBESVNDX0RTQiArIDEsIH4oKGRpc2NlbmFibGUgPj4gOCkgJiAweGZmKSk7CisJYWhjX291dGIoYWhjLCBVTFRSQV9FTkIsIHVsdHJhZW5iICYgMHhmZik7CisJYWhjX291dGIoYWhjLCBVTFRSQV9FTkIgKyAxLCAodWx0cmFlbmIgPj4gOCkgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQKK2NvbmZpZ3VyZV90ZXJtaW5hdGlvbihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCSAgICAgIHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkLAorCQkgICAgICB1X2ludCBhZGFwdGVyX2NvbnRyb2wsCisJCSAgICAgIHVfaW50ICpzeGZyY3RsMSkKK3sKKwl1aW50OF90IGJyZGRhdDsKKwkKKwlicmRkYXQgPSAwOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHNldHRpbmdzIGluIHN4ZnJjdGwxIHRvIG1hdGNoIHRoZQorCSAqIHRlcm1pbmF0aW9uIHNldHRpbmdzIAorCSAqLworCSpzeGZyY3RsMSA9IDA7CisJCisJLyoKKwkgKiBTRUVDUyBtdXN0IGJlIG9uIGZvciB0aGUgR0FMUyB0byBsYXRjaAorCSAqIHRoZSBkYXRhIHByb3Blcmx5LiAgQmUgc3VyZSB0byBsZWF2ZSBNUworCSAqIG9uIG9yIHdlIHdpbGwgcmVsZWFzZSB0aGUgc2VlcHJvbS4KKwkgKi8KKwlTRUVQUk9NX09VVEIoc2QsIHNkLT5zZF9NUyB8IHNkLT5zZF9DUyk7CisJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSAhPSAwCisJIHx8IChhaGMtPmZlYXR1cmVzICYgQUhDX05FV19URVJNQ1RMKSAhPSAwKSB7CisJCWludCBpbnRlcm5hbDUwX3ByZXNlbnQ7CisJCWludCBpbnRlcm5hbDY4X3ByZXNlbnQ7CisJCWludCBleHRlcm5hbGNhYmxlX3ByZXNlbnQ7CisJCWludCBlZXByb21fcHJlc2VudDsKKwkJaW50IGVuYWJsZVNFQ19sb3c7CisJCWludCBlbmFibGVTRUNfaGlnaDsKKwkJaW50IGVuYWJsZVBSSV9sb3c7CisJCWludCBlbmFibGVQUklfaGlnaDsKKwkJaW50IHN1bTsKKworCQllbmFibGVTRUNfbG93ID0gMDsKKwkJZW5hYmxlU0VDX2hpZ2ggPSAwOworCQllbmFibGVQUklfbG93ID0gMDsKKwkJZW5hYmxlUFJJX2hpZ2ggPSAwOworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfTkVXX1RFUk1DVEwpICE9IDApIHsKKwkJCWFoY19uZXdfdGVybV9kZXRlY3QoYWhjLCAmZW5hYmxlU0VDX2xvdywKKwkJCQkJICAgICZlbmFibGVTRUNfaGlnaCwKKwkJCQkJICAgICZlbmFibGVQUklfbG93LAorCQkJCQkgICAgJmVuYWJsZVBSSV9oaWdoLAorCQkJCQkgICAgJmVlcHJvbV9wcmVzZW50KTsKKwkJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTRUFVVE9URVJNKSA9PSAwKSB7CisJCQkJaWYgKGJvb3R2ZXJib3NlKQorCQkJCQlwcmludGYoIiVzOiBNYW51YWwgU0UgVGVybWluYXRpb25cbiIsCisJCQkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJCQllbmFibGVTRUNfbG93ID0gKGFkYXB0ZXJfY29udHJvbCAmIENGU0VMT1dURVJNKTsKKwkJCQllbmFibGVTRUNfaGlnaCA9CisJCQkJICAgIChhZGFwdGVyX2NvbnRyb2wgJiBDRlNFSElHSFRFUk0pOworCQkJfQorCQkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSA9PSAwKSB7CisJCQkJaWYgKGJvb3R2ZXJib3NlKQorCQkJCQlwcmludGYoIiVzOiBNYW51YWwgTFZEIFRlcm1pbmF0aW9uXG4iLAorCQkJCQkgICAgICAgYWhjX25hbWUoYWhjKSk7CisJCQkJZW5hYmxlUFJJX2xvdyA9IChhZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKTsKKwkJCQllbmFibGVQUklfaGlnaCA9IChhZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSk7CisJCQl9CisJCQkvKiBNYWtlIHRoZSB0YWJsZSBjYWxjdWxhdGlvbnMgYmVsb3cgaGFwcHkgKi8KKwkJCWludGVybmFsNTBfcHJlc2VudCA9IDA7CisJCQlpbnRlcm5hbDY4X3ByZXNlbnQgPSAxOworCQkJZXh0ZXJuYWxjYWJsZV9wcmVzZW50ID0gMTsKKwkJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19TUElPQ0FQKSAhPSAwKSB7CisJCQlhaWM3ODVYX2NhYmxlX2RldGVjdChhaGMsICZpbnRlcm5hbDUwX3ByZXNlbnQsCisJCQkJCSAgICAgJmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJCQkJICAgICAmZWVwcm9tX3ByZXNlbnQpOworCQkJLyogQ2FuIG5ldmVyIHN1cHBvcnQgYSB3aWRlIGNvbm5lY3Rvci4gKi8KKwkJCWludGVybmFsNjhfcHJlc2VudCA9IDA7CisJCX0gZWxzZSB7CisJCQlhaWM3ODdYX2NhYmxlX2RldGVjdChhaGMsICZpbnRlcm5hbDUwX3ByZXNlbnQsCisJCQkJCSAgICAgJmludGVybmFsNjhfcHJlc2VudCwKKwkJCQkJICAgICAmZXh0ZXJuYWxjYWJsZV9wcmVzZW50LAorCQkJCQkgICAgICZlZXByb21fcHJlc2VudCk7CisJCX0KKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgPT0gMCkKKwkJCWludGVybmFsNjhfcHJlc2VudCA9IDA7CisKKwkJaWYgKGJvb3R2ZXJib3NlCisJCSAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJCXByaW50ZigiJXM6IGludGVybmFsIDUwIGNhYmxlICVzIHByZXNlbnQiLAorCQkJICAgICAgIGFoY19uYW1lKGFoYyksCisJCQkgICAgICAgaW50ZXJuYWw1MF9wcmVzZW50ID8gImlzIjoibm90Iik7CisKKwkJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKQorCQkJCXByaW50ZigiLCBpbnRlcm5hbCA2OCBjYWJsZSAlcyBwcmVzZW50IiwKKwkJCQkgICAgICAgaW50ZXJuYWw2OF9wcmVzZW50ID8gImlzIjoibm90Iik7CisJCQlwcmludGYoIlxuJXM6IGV4dGVybmFsIGNhYmxlICVzIHByZXNlbnRcbiIsCisJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCSAgICAgICBleHRlcm5hbGNhYmxlX3ByZXNlbnQgPyAiaXMiOiJub3QiKTsKKwkJfQorCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoIiVzOiBCSU9TIGVlcHJvbSAlcyBwcmVzZW50XG4iLAorCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGVlcHJvbV9wcmVzZW50ID8gImlzIiA6ICJub3QiKTsKKworCQlpZiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5UNTBfU1BFRURGTEVYKSAhPSAwKSB7CisJCQkvKgorCQkJICogVGhlIDUwIHBpbiBjb25uZWN0b3IgaXMgYSBzZXBhcmF0ZSBidXMsCisJCQkgKiBzbyBmb3JjZSBpdCB0byBhbHdheXMgYmUgdGVybWluYXRlZC4KKwkJCSAqIEluIHRoZSBmdXR1cmUsIHBlcmZvcm0gY3VycmVudCBzZW5zaW5nCisJCQkgKiB0byBkZXRlcm1pbmUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YKKwkJCSAqIGEgcHJvcGVybHkgdGVybWluYXRlZCBidXMuCisJCQkgKi8KKwkJCWludGVybmFsNTBfcHJlc2VudCA9IDA7CisJCX0KKworCQkvKgorCQkgKiBOb3cgc2V0IHRoZSB0ZXJtaW5hdGlvbiBiYXNlZCBvbiB3aGF0CisJCSAqIHdlIGZvdW5kLgorCQkgKiBGbGFzaCBFbmFibGUgPSBCUkREQVQ3CisJCSAqIFNlY29uZGFyeSBIaWdoIFRlcm0gRW5hYmxlID0gQlJEREFUNgorCQkgKiBTZWNvbmRhcnkgTG93IFRlcm0gRW5hYmxlID0gQlJEREFUNSAoNzg5MCkKKwkJICogUHJpbWFyeSBIaWdoIFRlcm0gRW5hYmxlID0gQlJEREFUNCAoNzg5MCkKKwkJICovCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDAKKwkJICYmIChpbnRlcm5hbDUwX3ByZXNlbnQgIT0gMCkKKwkJICYmIChpbnRlcm5hbDY4X3ByZXNlbnQgIT0gMCkKKwkJICYmIChleHRlcm5hbGNhYmxlX3ByZXNlbnQgIT0gMCkpIHsKKwkJCXByaW50ZigiJXM6IElsbGVnYWwgY2FibGUgY29uZmlndXJhdGlvbiEhLiAiCisJCQkgICAgICAgIk9ubHkgdHdvIGNvbm5lY3RvcnMgb24gdGhlICIKKwkJCSAgICAgICAiYWRhcHRlciBtYXkgYmUgdXNlZCBhdCBhICIKKwkJCSAgICAgICAidGltZSFcbiIsIGFoY19uYW1lKGFoYykpOworCisJCQkvKgorCQkJICogUHJldGVuZCB0aGVyZSBhcmUgbm8gY2FibGVzIGluIHRoZSBob3BlCisJCQkgKiB0aGF0IGhhdmluZyBhbGwgb2YgdGhlIHRlcm1pbmF0aW9uIG9uCisJCQkgKiBnaXZlcyB1cyBhIG1vcmUgc3RhYmxlIGJ1cy4KKwkJCSAqLworCQkgCWludGVybmFsNTBfcHJlc2VudCA9IDA7CisJCQlpbnRlcm5hbDY4X3ByZXNlbnQgPSAwOworCQkJZXh0ZXJuYWxjYWJsZV9wcmVzZW50ID0gMDsKKwkJfQorCisJCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwCisJCSAmJiAoKGV4dGVybmFsY2FibGVfcHJlc2VudCA9PSAwKQorCQkgIHx8IChpbnRlcm5hbDY4X3ByZXNlbnQgPT0gMCkKKwkJICB8fCAoZW5hYmxlU0VDX2hpZ2ggIT0gMCkpKSB7CisJCQlicmRkYXQgfD0gQlJEREFUNjsKKwkJCWlmIChib290dmVyYm9zZSkgeworCQkJCWlmICgoYWhjLT5mbGFncyAmIEFIQ19JTlQ1MF9TUEVFREZMRVgpICE9IDApCisJCQkJCXByaW50ZigiJXM6IDY4IHBpbiB0ZXJtaW5hdGlvbiAiCisJCQkJCSAgICAgICAiRW5hYmxlZFxuIiwgYWhjX25hbWUoYWhjKSk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiVzOiAlc0hpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAiCisJCQkJCSAgICAgICAiRW5hYmxlZFxuIiwgYWhjX25hbWUoYWhjKSwKKwkJCQkJICAgICAgIGVuYWJsZVNFQ19oaWdoID8gIlNlY29uZGFyeSAiCisJCQkJCQkJICAgICAgOiAiIik7CisJCQl9CisJCX0KKworCQlzdW0gPSBpbnRlcm5hbDUwX3ByZXNlbnQgKyBpbnRlcm5hbDY4X3ByZXNlbnQKKwkJICAgICsgZXh0ZXJuYWxjYWJsZV9wcmVzZW50OworCQlpZiAoc3VtIDwgMiB8fCAoZW5hYmxlU0VDX2xvdyAhPSAwKSkgeworCQkJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJCQlicmRkYXQgfD0gQlJEREFUNTsKKwkJCWVsc2UKKwkJCQkqc3hmcmN0bDEgfD0gU1RQV0VOOworCQkJaWYgKGJvb3R2ZXJib3NlKSB7CisJCQkJaWYgKChhaGMtPmZsYWdzICYgQUhDX0lOVDUwX1NQRUVERkxFWCkgIT0gMCkKKwkJCQkJcHJpbnRmKCIlczogNTAgcGluIHRlcm1pbmF0aW9uICIKKwkJCQkJICAgICAgICJFbmFibGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiJXM6ICVzTG93IGJ5dGUgdGVybWluYXRpb24gIgorCQkJCQkgICAgICAgIkVuYWJsZWRcbiIsIGFoY19uYW1lKGFoYyksCisJCQkJCSAgICAgICBlbmFibGVTRUNfbG93ID8gIlNlY29uZGFyeSAiCisJCQkJCQkJICAgICA6ICIiKTsKKwkJCX0KKwkJfQorCisJCWlmIChlbmFibGVQUklfbG93ICE9IDApIHsKKwkJCSpzeGZyY3RsMSB8PSBTVFBXRU47CisJCQlpZiAoYm9vdHZlcmJvc2UpCisJCQkJcHJpbnRmKCIlczogUHJpbWFyeSBMb3cgQnl0ZSB0ZXJtaW5hdGlvbiAiCisJCQkJICAgICAgICJFbmFibGVkXG4iLCBhaGNfbmFtZShhaGMpKTsKKwkJfQorCisJCS8qCisJCSAqIFNldHVwIFNUUFdFTiBiZWZvcmUgc2V0dGluZyB1cCB0aGUgcmVzdCBvZgorCQkgKiB0aGUgdGVybWluYXRpb24gcGVyIHRoZSB0ZWNoIG5vdGUgb24gdGhlIFUxNjAgY2FyZHMuCisJCSAqLworCQlhaGNfb3V0YihhaGMsIFNYRlJDVEwxLCAqc3hmcmN0bDEpOworCisJCWlmIChlbmFibGVQUklfaGlnaCAhPSAwKSB7CisJCQlicmRkYXQgfD0gQlJEREFUNDsKKwkJCWlmIChib290dmVyYm9zZSkKKwkJCQlwcmludGYoIiVzOiBQcmltYXJ5IEhpZ2ggQnl0ZSAiCisJCQkJICAgICAgICJ0ZXJtaW5hdGlvbiBFbmFibGVkXG4iLAorCQkJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwkJfQorCQkKKwkJd3JpdGVfYnJkY3RsKGFoYywgYnJkZGF0KTsKKworCX0gZWxzZSB7CisJCWlmICgoYWRhcHRlcl9jb250cm9sICYgQ0ZTVEVSTSkgIT0gMCkgeworCQkJKnN4ZnJjdGwxIHw9IFNUUFdFTjsKKworCQkJaWYgKGJvb3R2ZXJib3NlKQorCQkJCXByaW50ZigiJXM6ICVzTG93IGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKwkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCQkgICAgICAgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA/ICJQcmltYXJ5ICIKKwkJCQkJCQkJICAgIDogIiIpOworCQl9CisKKwkJaWYgKChhZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSkgIT0gMAorCQkgJiYgKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkgeworCQkJYnJkZGF0IHw9IEJSRERBVDY7CisJCQlpZiAoYm9vdHZlcmJvc2UpCisJCQkJcHJpbnRmKCIlczogJXNIaWdoIGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKwkJCQkgICAgICAgYWhjX25hbWUoYWhjKSwKKwkJCQkgICAgICAgKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorCQkJCSAgICAgPyAiU2Vjb25kYXJ5ICIgOiAiIik7CisJCX0KKworCQkvKgorCQkgKiBTZXR1cCBTVFBXRU4gYmVmb3JlIHNldHRpbmcgdXAgdGhlIHJlc3Qgb2YKKwkJICogdGhlIHRlcm1pbmF0aW9uIHBlciB0aGUgdGVjaCBub3RlIG9uIHRoZSBVMTYwIGNhcmRzLgorCQkgKi8KKwkJYWhjX291dGIoYWhjLCBTWEZSQ1RMMSwgKnN4ZnJjdGwxKTsKKworCQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkKKwkJCXdyaXRlX2JyZGN0bChhaGMsIGJyZGRhdCk7CisJfQorCVNFRVBST01fT1VUQihzZCwgc2QtPnNkX01TKTsgLyogQ2xlYXIgQ1MgKi8KK30KKworc3RhdGljIHZvaWQKK2FoY19uZXdfdGVybV9kZXRlY3Qoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgKmVuYWJsZVNFQ19sb3csCisJCSAgICBpbnQgKmVuYWJsZVNFQ19oaWdoLCBpbnQgKmVuYWJsZVBSSV9sb3csCisJCSAgICBpbnQgKmVuYWJsZVBSSV9oaWdoLCBpbnQgKmVlcHJvbV9wcmVzZW50KQoreworCXVpbnQ4X3QgYnJkY3RsOworCisJLyoKKwkgKiBCUkREQVQ3ID0gRWVwcm9tCisJICogQlJEREFUNiA9IEVuYWJsZSBTZWNvbmRhcnkgSGlnaCBCeXRlIHRlcm1pbmF0aW9uCisJICogQlJEREFUNSA9IEVuYWJsZSBTZWNvbmRhcnkgTG93IEJ5dGUgdGVybWluYXRpb24KKwkgKiBCUkREQVQ0ID0gRW5hYmxlIFByaW1hcnkgaGlnaCBieXRlIHRlcm1pbmF0aW9uCisJICogQlJEREFUMyA9IEVuYWJsZSBQcmltYXJ5IGxvdyBieXRlIHRlcm1pbmF0aW9uCisJICovCisJYnJkY3RsID0gcmVhZF9icmRjdGwoYWhjKTsKKwkqZWVwcm9tX3ByZXNlbnQgPSBicmRjdGwgJiBCUkREQVQ3OworCSplbmFibGVTRUNfaGlnaCA9IChicmRjdGwgJiBCUkREQVQ2KTsKKwkqZW5hYmxlU0VDX2xvdyA9IChicmRjdGwgJiBCUkREQVQ1KTsKKwkqZW5hYmxlUFJJX2hpZ2ggPSAoYnJkY3RsICYgQlJEREFUNCk7CisJKmVuYWJsZVBSSV9sb3cgPSAoYnJkY3RsICYgQlJEREFUMyk7Cit9CisKK3N0YXRpYyB2b2lkCithaWM3ODdYX2NhYmxlX2RldGVjdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCAqaW50ZXJuYWw1MF9wcmVzZW50LAorCQkgICAgIGludCAqaW50ZXJuYWw2OF9wcmVzZW50LCBpbnQgKmV4dGVybmFsY2FibGVfcHJlc2VudCwKKwkJICAgICBpbnQgKmVlcHJvbV9wcmVzZW50KQoreworCXVpbnQ4X3QgYnJkY3RsOworCisJLyoKKwkgKiBGaXJzdCByZWFkIHRoZSBzdGF0dXMgb2Ygb3VyIGNhYmxlcy4KKwkgKiBTZXQgdGhlIHJvbSBiYW5rIHRvIDAgc2luY2UgdGhlCisJICogYmFuayBzZXR0aW5nIHNlcnZlcyBhcyBhIG11bHRpcGxleG9yCisJICogZm9yIHRoZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMuCisJICogQlJEREFUNSBjb250cm9scyB0aGUgYmFuayBzd2l0Y2guCisJICovCisJd3JpdGVfYnJkY3RsKGFoYywgMCk7CisKKwkvKgorCSAqIE5vdyByZWFkIHRoZSBzdGF0ZSBvZiB0aGUgaW50ZXJuYWwKKwkgKiBjb25uZWN0b3JzLiAgQlJEREFUNiBpcyBJTlQ1MCBhbmQKKwkgKiBCUkREQVQ3IGlzIElOVDY4LgorCSAqLworCWJyZGN0bCA9IHJlYWRfYnJkY3RsKGFoYyk7CisJKmludGVybmFsNTBfcHJlc2VudCA9IChicmRjdGwgJiBCUkREQVQ2KSA/IDAgOiAxOworCSppbnRlcm5hbDY4X3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNykgPyAwIDogMTsKKworCS8qCisJICogU2V0IHRoZSByb20gYmFuayB0byAxIGFuZCBkZXRlcm1pbmUKKwkgKiB0aGUgb3RoZXIgc2lnbmFscy4KKwkgKi8KKwl3cml0ZV9icmRjdGwoYWhjLCBCUkREQVQ1KTsKKworCS8qCisJICogTm93IHJlYWQgdGhlIHN0YXRlIG9mIHRoZSBleHRlcm5hbAorCSAqIGNvbm5lY3RvcnMuICBCUkREQVQ2IGlzIEVYVDY4IGFuZAorCSAqIEJSRERBVDcgaXMgRVBST01QUy4KKwkgKi8KKwlicmRjdGwgPSByZWFkX2JyZGN0bChhaGMpOworCSpleHRlcm5hbGNhYmxlX3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNikgPyAwIDogMTsKKwkqZWVwcm9tX3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNykgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQKK2FpYzc4NVhfY2FibGVfZGV0ZWN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50ICppbnRlcm5hbDUwX3ByZXNlbnQsCisJCSAgICAgaW50ICpleHRlcm5hbGNhYmxlX3ByZXNlbnQsIGludCAqZWVwcm9tX3ByZXNlbnQpCit7CisJdWludDhfdCBicmRjdGw7CisJdWludDhfdCBzcGlvY2FwOworCisJc3Bpb2NhcCA9IGFoY19pbmIoYWhjLCBTUElPQ0FQKTsKKwlzcGlvY2FwICY9IH5TT0ZUQ01ERU47CisJc3Bpb2NhcCB8PSBFWFRfQlJEQ1RMOworCWFoY19vdXRiKGFoYywgU1BJT0NBUCwgc3Bpb2NhcCk7CisJYWhjX291dGIoYWhjLCBCUkRDVEwsIEJSRFJXfEJSRENTKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19kZWxheSg1MDApOworCWFoY19vdXRiKGFoYywgQlJEQ1RMLCAwKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWFoY19kZWxheSg1MDApOworCWJyZGN0bCA9IGFoY19pbmIoYWhjLCBCUkRDVEwpOworCSppbnRlcm5hbDUwX3ByZXNlbnQgPSAoYnJkY3RsICYgQlJEREFUNSkgPyAwIDogMTsKKwkqZXh0ZXJuYWxjYWJsZV9wcmVzZW50ID0gKGJyZGN0bCAmIEJSRERBVDYpID8gMCA6IDE7CisJKmVlcHJvbV9wcmVzZW50ID0gKGFoY19pbmIoYWhjLCBTUElPQ0FQKSAmIEVFUFJPTSkgPyAxIDogMDsKK30KKwkKK2ludAorYWhjX2FjcXVpcmVfc2VlcHJvbShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3IgKnNkKQoreworCWludCB3YWl0OworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1NQSU9DQVApICE9IDAKKwkgJiYgKGFoY19pbmIoYWhjLCBTUElPQ0FQKSAmIFNFRVBST00pID09IDApCisJCXJldHVybiAoMCk7CisKKwkvKgorCSAqIFJlcXVlc3QgYWNjZXNzIG9mIHRoZSBtZW1vcnkgcG9ydC4gIFdoZW4gYWNjZXNzIGlzCisJICogZ3JhbnRlZCwgU0VFUkRZIHdpbGwgZ28gaGlnaC4gIFdlIHVzZSBhIDEgc2Vjb25kCisJICogdGltZW91dCB3aGljaCBzaG91bGQgYmUgbmVhciAxIHNlY29uZCBtb3JlIHRoYW4KKwkgKiBpcyBuZWVkZWQuICBSZWFzb246IGFmdGVyIHRoZSBjaGlwIHJlc2V0LCB0aGVyZQorCSAqIHNob3VsZCBiZSBubyBjb250ZW50aW9uLgorCSAqLworCVNFRVBST01fT1VUQihzZCwgc2QtPnNkX01TKTsKKwl3YWl0ID0gMTAwMDsgIC8qIDEgc2Vjb25kIHRpbWVvdXQgaW4gbXNlYyAqLworCXdoaWxlICgtLXdhaXQgJiYgKChTRUVQUk9NX1NUQVRVU19JTkIoc2QpICYgc2QtPnNkX1JEWSkgPT0gMCkpIHsKKwkJYWhjX2RlbGF5KDEwMDApOyAgLyogZGVsYXkgMSBtc2VjICovCisJfQorCWlmICgoU0VFUFJPTV9TVEFUVVNfSU5CKHNkKSAmIHNkLT5zZF9SRFkpID09IDApIHsKKwkJU0VFUFJPTV9PVVRCKHNkLCAwKTsgCisJCXJldHVybiAoMCk7CisJfQorCXJldHVybigxKTsKK30KKwordm9pZAorYWhjX3JlbGVhc2Vfc2VlcHJvbShzdHJ1Y3Qgc2VlcHJvbV9kZXNjcmlwdG9yICpzZCkKK3sKKwkvKiBSZWxlYXNlIGFjY2VzcyB0byB0aGUgbWVtb3J5IHBvcnQgYW5kIHRoZSBzZXJpYWwgRUVQUk9NLiAqLworCVNFRVBST01fT1VUQihzZCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9icmRjdGwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1aW50OF90IHZhbHVlKQoreworCXVpbnQ4X3QgYnJkY3RsOworCisJaWYgKChhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3ODk1KSB7CisJCWJyZGN0bCA9IEJSRFNUQjsKKwkgCWlmIChhaGMtPmNoYW5uZWwgPT0gJ0InKQorCQkJYnJkY3RsIHw9IEJSRENTOworCX0gZWxzZSBpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWJyZGN0bCA9IDA7CisJfSBlbHNlIHsKKwkJYnJkY3RsID0gQlJEU1RCfEJSRENTOworCX0KKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWJyZGN0bCB8PSB2YWx1ZTsKKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisJCWJyZGN0bCB8PSBCUkRTVEJfVUxUUkEyOworCWVsc2UKKwkJYnJkY3RsICY9IH5CUkRTVEI7CisJYWhjX291dGIoYWhjLCBCUkRDVEwsIGJyZGN0bCk7CisJYWhjX2ZsdXNoX2RldmljZV93cml0ZXMoYWhjKTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKQorCQlicmRjdGwgPSAwOworCWVsc2UKKwkJYnJkY3RsICY9IH5CUkRDUzsKKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKK30KKworc3RhdGljIHVpbnQ4X3QKK3JlYWRfYnJkY3RsKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1aW50OF90IGJyZGN0bDsKKwl1aW50OF90IHZhbHVlOworCisJaWYgKChhaGMtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3ODk1KSB7CisJCWJyZGN0bCA9IEJSRFJXOworCSAJaWYgKGFoYy0+Y2hhbm5lbCA9PSAnQicpCisJCQlicmRjdGwgfD0gQlJEQ1M7CisJfSBlbHNlIGlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJYnJkY3RsID0gQlJEUldfVUxUUkEyOworCX0gZWxzZSB7CisJCWJyZGN0bCA9IEJSRFJXfEJSRENTOworCX0KKwlhaGNfb3V0YihhaGMsIEJSRENUTCwgYnJkY3RsKTsKKwlhaGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOworCXZhbHVlID0gYWhjX2luYihhaGMsIEJSRENUTCk7CisJYWhjX291dGIoYWhjLCBCUkRDVEwsIDApOworCXJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorYWhjX3BjaV9pbnRyKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1X2ludCBlcnJvcjsKKwl1X2ludCBzdGF0dXMxOworCisJZXJyb3IgPSBhaGNfaW5iKGFoYywgRVJST1IpOworCWlmICgoZXJyb3IgJiBQQ0lFUlJTVEFUKSA9PSAwKQorCQlyZXR1cm47CisKKwlzdGF0dXMxID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywKKwkJCQkgICAgICBQQ0lSX1NUQVRVUyArIDEsIC8qYnl0ZXMqLzEpOworCisJcHJpbnRmKCIlczogUENJIGVycm9yIEludGVycnVwdCBhdCBzZXFhZGRyID0gMHgleFxuIiwKKwkgICAgICBhaGNfbmFtZShhaGMpLAorCSAgICAgIGFoY19pbmIoYWhjLCBTRVFBRERSMCkgfCAoYWhjX2luYihhaGMsIFNFUUFERFIxKSA8PCA4KSk7CisKKwlpZiAoc3RhdHVzMSAmIERQRSkgeworCQlhaGMtPnBjaV90YXJnZXRfcGVycl9jb3VudCsrOworCQlwcmludGYoIiVzOiBEYXRhIFBhcml0eSBFcnJvciBEZXRlY3RlZCBkdXJpbmcgYWRkcmVzcyAiCisJCSAgICAgICAib3Igd3JpdGUgZGF0YSBwaGFzZVxuIiwgYWhjX25hbWUoYWhjKSk7CisJfQorCWlmIChzdGF0dXMxICYgU1NFKSB7CisJCXByaW50ZigiJXM6IFNpZ25hbCBTeXN0ZW0gRXJyb3IgRGV0ZWN0ZWRcbiIsIGFoY19uYW1lKGFoYykpOworCX0KKwlpZiAoc3RhdHVzMSAmIFJNQSkgeworCQlwcmludGYoIiVzOiBSZWNlaXZlZCBhIE1hc3RlciBBYm9ydFxuIiwgYWhjX25hbWUoYWhjKSk7CisJfQorCWlmIChzdGF0dXMxICYgUlRBKSB7CisJCXByaW50ZigiJXM6IFJlY2VpdmVkIGEgVGFyZ2V0IEFib3J0XG4iLCBhaGNfbmFtZShhaGMpKTsKKwl9CisJaWYgKHN0YXR1czEgJiBTVEEpIHsKKwkJcHJpbnRmKCIlczogU2lnbmFsZWQgYSBUYXJnZXQgQWJvcnRcbiIsIGFoY19uYW1lKGFoYykpOworCX0KKwlpZiAoc3RhdHVzMSAmIERQUikgeworCQlwcmludGYoIiVzOiBEYXRhIFBhcml0eSBFcnJvciBoYXMgYmVlbiByZXBvcnRlZCB2aWEgUEVSUiNcbiIsCisJCSAgICAgICBhaGNfbmFtZShhaGMpKTsKKwl9CisKKwkvKiBDbGVhciBsYXRjaGVkIGVycm9ycy4gKi8KKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhhaGMtPmRldl9zb2Z0YywgUENJUl9TVEFUVVMgKyAxLAorCQkJICAgICBzdGF0dXMxLCAvKmJ5dGVzKi8xKTsKKworCWlmICgoc3RhdHVzMSAmIChEUEV8U1NFfFJNQXxSVEF8U1RBfERQUikpID09IDApIHsKKwkJcHJpbnRmKCIlczogTGF0Y2hlZCBQQ0lFUlIgaW50ZXJydXB0IHdpdGggIgorCQkgICAgICAgIm5vIHN0YXR1cyBiaXRzIHNldFxuIiwgYWhjX25hbWUoYWhjKSk7IAorCX0gZWxzZSB7CisJCWFoY19vdXRiKGFoYywgQ0xSSU5ULCBDTFJQQVJFUlIpOworCX0KKworCWlmIChhaGMtPnBjaV90YXJnZXRfcGVycl9jb3VudCA+IEFIQ19QQ0lfVEFSR0VUX1BFUlJfVEhSRVNIKSB7CisJCXByaW50ZigKKyIlczogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklOR1xuIgorIiVzOiBUb28gbWFueSBQQ0kgcGFyaXR5IGVycm9ycyBvYnNlcnZlZCBhcyBhIHRhcmdldC5cbiIKKyIlczogU29tZSBkZXZpY2Ugb24gdGhpcyBidXMgaXMgZ2VuZXJhdGluZyBiYWQgcGFyaXR5LlxuIgorIiVzOiBUaGlzIGlzIGFuIGVycm9yICpvYnNlcnZlZCBieSosIG5vdCAqZ2VuZXJhdGVkIGJ5KiwgdGhpcyBjb250cm9sbGVyLlxuIgorIiVzOiBQQ0kgcGFyaXR5IGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRpc2FibGVkLlxuIgorIiVzOiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HXG4iLAorCQkgICAgICAgYWhjX25hbWUoYWhjKSwgYWhjX25hbWUoYWhjKSwgYWhjX25hbWUoYWhjKSwKKwkJICAgICAgIGFoY19uYW1lKGFoYyksIGFoY19uYW1lKGFoYyksIGFoY19uYW1lKGFoYykpOworCQlhaGMtPnNlcWN0bCB8PSBGQUlMRElTOworCQlhaGNfb3V0YihhaGMsIFNFUUNUTCwgYWhjLT5zZXFjdGwpOworCX0KKwlhaGNfdW5wYXVzZShhaGMpOworfQorCitzdGF0aWMgaW50CithaGNfcGNpX2NoaXBfaW5pdChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX291dGIoYWhjLCBEU0NPTU1BTkQwLCBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuZHNjb21tYW5kMCk7CisJYWhjX291dGIoYWhjLCBEU1BDSVNUQVRVUywgYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmRzcGNpc3RhdHVzKTsKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfRFQpICE9IDApIHsKKwkJdV9pbnQgc2Z1bmN0OworCisJCXNmdW5jdCA9IGFoY19pbmIoYWhjLCBTRlVOQ1QpICYgfkFMVF9NT0RFOworCQlhaGNfb3V0YihhaGMsIFNGVU5DVCwgc2Z1bmN0IHwgQUxUX01PREUpOworCQlhaGNfb3V0YihhaGMsIE9QVElPTk1PREUsIGFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5vcHRpb25tb2RlKTsKKwkJYWhjX291dHcoYWhjLCBUQVJHQ1JDQ05ULCBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMudGFyZ2NyY2NudCk7CisJCWFoY19vdXRiKGFoYywgU0ZVTkNULCBzZnVuY3QpOworCQlhaGNfb3V0YihhaGMsIENSQ0NPTlRST0wxLAorCQkJIGFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5jcmNjb250cm9sMSk7CisJfQorCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19NVUxUSV9GVU5DKSAhPSAwKQorCQlhaGNfb3V0YihhaGMsIFNDQkJBRERSLCBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuc2NiYmFkZHIpOworCisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKKwkJYWhjX291dGIoYWhjLCBERkZfVEhSU0gsIGFoYy0+YnVzX3NvZnRjLnBjaV9zb2Z0Yy5kZmZfdGhyc2gpOworCisJcmV0dXJuIChhaGNfY2hpcF9pbml0KGFoYykpOworfQorCitzdGF0aWMgaW50CithaGNfcGNpX3N1c3BlbmQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoYWhjX3N1c3BlbmQoYWhjKSk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19wY2lfcmVzdW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUoYWhjLT5kZXZfc29mdGMsIEFIQ19QT1dFUl9TVEFURV9EMCk7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBPUyBoYXMgcmVzdG9yZWQgb3VyIHJlZ2lzdGVyCisJICogbWFwcGluZ3MsIGV0Yy4gIEp1c3QgdXBkYXRlIHRoZSBjb25maWcgc3BhY2UgcmVnaXN0ZXJzCisJICogdGhhdCB0aGUgT1MgZG9lc24ndCBrbm93IGFib3V0IGFuZCByZWx5IG9uIG91ciBjaGlwCisJICogcmVzZXQgaGFuZGxlciB0byBoYW5kbGUgdGhlIHJlc3QuCisJICovCisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIERFVkNPTkZJRywgLypieXRlcyovNCwKKwkJCSAgICAgYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmRldmNvbmZpZyk7CisJYWhjX3BjaV93cml0ZV9jb25maWcoYWhjLT5kZXZfc29mdGMsIFBDSVJfQ09NTUFORCwgLypieXRlcyovMSwKKwkJCSAgICAgYWhjLT5idXNfc29mdGMucGNpX3NvZnRjLmNvbW1hbmQpOworCWFoY19wY2lfd3JpdGVfY29uZmlnKGFoYy0+ZGV2X3NvZnRjLCBDU0laRV9MQVRUSU1FLCAvKmJ5dGVzKi8xLAorCQkJICAgICBhaGMtPmJ1c19zb2Z0Yy5wY2lfc29mdGMuY3NpemVfbGF0dGltZSk7CisJaWYgKChhaGMtPmZsYWdzICYgQUhDX0hBU19URVJNX0xPR0lDKSAhPSAwKSB7CisJCXN0cnVjdAlzZWVwcm9tX2Rlc2NyaXB0b3Igc2Q7CisJCXVfaW50CXN4ZnJjdGwxOworCisJCXNkLnNkX2FoYyA9IGFoYzsKKwkJc2Quc2RfY29udHJvbF9vZmZzZXQgPSBTRUVDVEw7CQkKKwkJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNFRUNUTDsJCQorCQlzZC5zZF9kYXRhb3V0X29mZnNldCA9IFNFRUNUTDsJCQorCisJCWFoY19hY3F1aXJlX3NlZXByb20oYWhjLCAmc2QpOworCQljb25maWd1cmVfdGVybWluYXRpb24oYWhjLCAmc2QsCisJCQkJICAgICAgYWhjLT5zZWVwX2NvbmZpZy0+YWRhcHRlcl9jb250cm9sLAorCQkJCSAgICAgICZzeGZyY3RsMSk7CisJCWFoY19yZWxlYXNlX3NlZXByb20oJnNkKTsKKwl9CisJcmV0dXJuIChhaGNfcmVzdW1lKGFoYykpOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg1WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKwl1aW50OF90IHJldjsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg1MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4NTBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVR3xBSENfQ0FDSEVUSEVOX0JVR3xBSENfUENJX01XSV9CVUc7CisJcmV2ID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhwY2ksIFBDSVJfUkVWSUQsIC8qYnl0ZXMqLzEpOworCWlmIChyZXYgPj0gMSkKKwkJYWhjLT5idWdzIHw9IEFIQ19QQ0lfMl8xX1JFVFJZX0JVRzsKKwlhaGMtPmluc3RydWN0aW9uX3JhbV9zaXplID0gNTEyOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haWM3ODYwX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfZGV2X3NvZnRjX3QgcGNpOworCXVpbnQ4X3QgcmV2OworCisJcGNpID0gYWhjLT5kZXZfc29mdGM7CisJYWhjLT5jaGFubmVsID0gJ0EnOworCWFoYy0+Y2hpcCA9IEFIQ19BSUM3ODYwOworCWFoYy0+ZmVhdHVyZXMgPSBBSENfQUlDNzg2MF9GRTsKKwlhaGMtPmJ1Z3MgfD0gQUhDX1RNT0RFX1dJREVPRERfQlVHfEFIQ19DQUNIRVRIRU5fQlVHfEFIQ19QQ0lfTVdJX0JVRzsKKwlyZXYgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9SRVZJRCwgLypieXRlcyovMSk7CisJaWYgKHJldiA+PSAxKQorCQlhaGMtPmJ1Z3MgfD0gQUhDX1BDSV8yXzFfUkVUUllfQlVHOworCWFoYy0+aW5zdHJ1Y3Rpb25fcmFtX3NpemUgPSA1MTI7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FwYTE0ODBfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYWhjX2FpYzc4NjBfc2V0dXAoYWhjKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisJYWhjLT5mZWF0dXJlcyB8PSBBSENfUkVNT1ZBQkxFOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haWM3ODcwX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg3MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4NzBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVR3xBSENfQ0FDSEVUSEVOX0JVR3xBSENfUENJX01XSV9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDUxMjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMzk0WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg3MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGEzOTRYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMzk4WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg3MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGEzOThYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWhhNDk0WF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg3MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGE0OTRYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg4MF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKwl1aW50OF90IHJldjsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg4MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4ODBfRkU7CisJYWhjLT5idWdzIHw9IEFIQ19UTU9ERV9XSURFT0REX0JVRzsKKwlyZXYgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9SRVZJRCwgLypieXRlcyovMSk7CisJaWYgKHJldiA+PSAxKSB7CisJCWFoYy0+YnVncyB8PSBBSENfUENJXzJfMV9SRVRSWV9CVUc7CisJfSBlbHNlIHsKKwkJYWhjLT5idWdzIHw9IEFIQ19DQUNIRVRIRU5fQlVHfEFIQ19QQ0lfTVdJX0JVRzsKKwl9CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDUxMjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMjk0MFByb19zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisKKwlhaGMtPmZsYWdzIHw9IEFIQ19JTlQ1MF9TUEVFREZMRVg7CisJcmV0dXJuIChhaGNfYWljNzg4MF9zZXR1cChhaGMpKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTM5NFhVX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGFoY19haWM3ODgwX3NldHVwKGFoYyk7CisJaWYgKGVycm9yID09IDApCisJCWVycm9yID0gYWhjX2FoYTM5NFhYX3NldHVwKGFoYyk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19haGEzOThYVV9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg4MF9zZXR1cChhaGMpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJvciA9IGFoY19haGEzOThYWF9zZXR1cChhaGMpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg5MF9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKwl1aW50OF90IHJldjsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg5MDsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTBfRkU7CisJYWhjLT5mbGFncyB8PSBBSENfTkVXRUVQUk9NX0ZNVDsKKwlyZXYgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9SRVZJRCwgLypieXRlcyovMSk7CisJaWYgKHJldiA9PSAwKQorCQlhaGMtPmJ1Z3MgfD0gQUhDX0FVVE9GTFVTSF9CVUd8QUhDX0NBQ0hFVEhFTl9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDc2ODsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg5Ml9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisKKwlhaGMtPmNoYW5uZWwgPSAnQSc7CisJYWhjLT5jaGlwID0gQUhDX0FJQzc4OTI7CisJYWhjLT5mZWF0dXJlcyA9IEFIQ19BSUM3ODkyX0ZFOworCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJYWhjLT5idWdzIHw9IEFIQ19TQ0JDSEFOX1VQTE9BRF9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDEwMjQ7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc4OTVfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoY19kZXZfc29mdGNfdCBwY2k7CisJdWludDhfdCByZXY7CisKKwlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwlhaGMtPmNoYW5uZWwgPSBhaGNfZ2V0X3BjaV9mdW5jdGlvbihwY2kpID09IDEgPyAnQicgOiAnQSc7CisJLyoKKwkgKiBUaGUgJ0MnIHJldmlzaW9uIG9mIHRoZSBhaWM3ODk1IGhhcyBhIGZldyBhZGRpdGlvbmFsIGZlYXR1cmVzLgorCSAqLworCXJldiA9IGFoY19wY2lfcmVhZF9jb25maWcocGNpLCBQQ0lSX1JFVklELCAvKmJ5dGVzKi8xKTsKKwlpZiAocmV2ID49IDQpIHsKKwkJYWhjLT5jaGlwID0gQUhDX0FJQzc4OTVDOworCQlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTVDX0ZFOworCX0gZWxzZSAgeworCQl1X2ludCBjb21tYW5kOworCisJCWFoYy0+Y2hpcCA9IEFIQ19BSUM3ODk1OworCQlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTVfRkU7CisKKwkJLyoKKwkJICogVGhlIEJJT1MgZGlzYWJsZXMgdGhlIHVzZSBvZiBNV0kgdHJhbnNhY3Rpb25zCisJCSAqIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgdGhlIE1XSSBidWcgd29yayBhcm91bmQKKwkJICogd2UgaGF2ZS4gIERpc2FibGluZyBNV0kgcmVkdWNlcyBwZXJmb3JtYW5jZSwgc28KKwkJICogdHVybiBpdCBvbiBhZ2Fpbi4KKwkJICovCisJCWNvbW1hbmQgPSBhaGNfcGNpX3JlYWRfY29uZmlnKHBjaSwgUENJUl9DT01NQU5ELCAvKmJ5dGVzKi8xKTsKKwkJY29tbWFuZCB8PSBQQ0lNX0NNRF9NV1JJQ0VOOworCQlhaGNfcGNpX3dyaXRlX2NvbmZpZyhwY2ksIFBDSVJfQ09NTUFORCwgY29tbWFuZCwgLypieXRlcyovMSk7CisJCWFoYy0+YnVncyB8PSBBSENfUENJX01XSV9CVUc7CisJfQorCS8qCisJICogWFhYIERvZXMgQ0FDSEVUSEVOIHJlYWxseSBub3Qgd29yaz8/PyAgV2hhdCBhYm91dCBQQ0kgcmV0cnk/CisJICogb24gQyBsZXZlbCBjaGlwcy4gIE5lZWQgdG8gdGVzdCwgYnV0IGZvciBub3csIHBsYXkgaXQgc2FmZS4KKwkgKi8KKwlhaGMtPmJ1Z3MgfD0gQUhDX1RNT0RFX1dJREVPRERfQlVHfEFIQ19QQ0lfMl8xX1JFVFJZX0JVRworCQkgIHwgIEFIQ19DQUNIRVRIRU5fQlVHOworCisjaWYgMAorCXVpbnQzMl90IGRldmNvbmZpZzsKKworCS8qCisJICogQ2FjaGVzaXplIG11c3QgYWxzbyBiZSB6ZXJvIGR1ZSB0byBzdHJheSBEQUMKKwkgKiBwcm9ibGVtIHdoZW4gc2l0dGluZyBiZWhpbmQgc29tZSBicmlkZ2VzLgorCSAqLworCWFoY19wY2lfd3JpdGVfY29uZmlnKHBjaSwgQ1NJWkVfTEFUVElNRSwgMCwgLypieXRlcyovMSk7CisJZGV2Y29uZmlnID0gYWhjX3BjaV9yZWFkX2NvbmZpZyhwY2ksIERFVkNPTkZJRywgLypieXRlcyovMSk7CisJZGV2Y29uZmlnIHw9IE1SRENFTjsKKwlhaGNfcGNpX3dyaXRlX2NvbmZpZyhwY2ksIERFVkNPTkZJRywgZGV2Y29uZmlnLCAvKmJ5dGVzKi8xKTsKKyNlbmRpZgorCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDUxMjsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWljNzg5Nl9zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJYWhjX2Rldl9zb2Z0Y190IHBjaTsKKworCXBjaSA9IGFoYy0+ZGV2X3NvZnRjOworCWFoYy0+Y2hhbm5lbCA9IGFoY19nZXRfcGNpX2Z1bmN0aW9uKHBjaSkgPT0gMSA/ICdCJyA6ICdBJzsKKwlhaGMtPmNoaXAgPSBBSENfQUlDNzg5NjsKKwlhaGMtPmZlYXR1cmVzID0gQUhDX0FJQzc4OTZfRkU7CisJYWhjLT5mbGFncyB8PSBBSENfTkVXRUVQUk9NX0ZNVDsKKwlhaGMtPmJ1Z3MgfD0gQUhDX0NBQ0hFVEhFTl9ESVNfQlVHOworCWFoYy0+aW5zdHJ1Y3Rpb25fcmFtX3NpemUgPSA3Njg7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FpYzc4OTlfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoY19kZXZfc29mdGNfdCBwY2k7CisKKwlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwlhaGMtPmNoYW5uZWwgPSBhaGNfZ2V0X3BjaV9mdW5jdGlvbihwY2kpID09IDEgPyAnQicgOiAnQSc7CisJYWhjLT5jaGlwID0gQUhDX0FJQzc4OTk7CisJYWhjLT5mZWF0dXJlcyA9IEFIQ19BSUM3ODk5X0ZFOworCWFoYy0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisJYWhjLT5idWdzIHw9IEFIQ19TQ0JDSEFOX1VQTE9BRF9CVUc7CisJYWhjLT5pbnN0cnVjdGlvbl9yYW1fc2l6ZSA9IDEwMjQ7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTI5MTYwQ19zZXR1cChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBhaGNfYWljNzg5OV9zZXR1cChhaGMpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsKKwlhaGMtPmZlYXR1cmVzIHw9IEFIQ19SRU1PVkFCTEU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX3JhaWRfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXByaW50ZigiUkFJRCBmdW5jdGlvbmFsaXR5IHVuc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gKEVOWElPKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTM5NFhYX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfZGV2X3NvZnRjX3QgcGNpOworCisJcGNpID0gYWhjLT5kZXZfc29mdGM7CisJc3dpdGNoIChhaGNfZ2V0X3BjaV9zbG90KHBjaSkpIHsKKwljYXNlIEFIQ18zOTRYX1NMT1RfQ0hBTk5FTF9BOgorCQlhaGMtPmNoYW5uZWwgPSAnQSc7CisJCWJyZWFrOworCWNhc2UgQUhDXzM5NFhfU0xPVF9DSEFOTkVMX0I6CisJCWFoYy0+Y2hhbm5lbCA9ICdCJzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJhZGFwdGVyIGF0IHVuZXhwZWN0ZWQgc2xvdCAlZFxuIgorCQkgICAgICAgInVuYWJsZSB0byBtYXAgdG8gYSBjaGFubmVsXG4iLAorCQkgICAgICAgYWhjX2dldF9wY2lfc2xvdChwY2kpKTsKKwkJYWhjLT5jaGFubmVsID0gJ0EnOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CithaGNfYWhhMzk4WFhfc2V0dXAoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCWFoY19kZXZfc29mdGNfdCBwY2k7CisKKwlwY2kgPSBhaGMtPmRldl9zb2Z0YzsKKwlzd2l0Y2ggKGFoY19nZXRfcGNpX3Nsb3QocGNpKSkgeworCWNhc2UgQUhDXzM5OFhfU0xPVF9DSEFOTkVMX0E6CisJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwkJYnJlYWs7CisJY2FzZSBBSENfMzk4WF9TTE9UX0NIQU5ORUxfQjoKKwkJYWhjLT5jaGFubmVsID0gJ0InOworCQlicmVhazsKKwljYXNlIEFIQ18zOThYX1NMT1RfQ0hBTk5FTF9DOgorCQlhaGMtPmNoYW5uZWwgPSAnQyc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiYWRhcHRlciBhdCB1bmV4cGVjdGVkIHNsb3QgJWRcbiIKKwkJICAgICAgICJ1bmFibGUgdG8gbWFwIHRvIGEgY2hhbm5lbFxuIiwKKwkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QocGNpKSk7CisJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwkJYnJlYWs7CisJfQorCWFoYy0+ZmxhZ3MgfD0gQUhDX0xBUkdFX1NFRVBST007CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWhjX2FoYTQ5NFhYX3NldHVwKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlhaGNfZGV2X3NvZnRjX3QgcGNpOworCisJcGNpID0gYWhjLT5kZXZfc29mdGM7CisJc3dpdGNoIChhaGNfZ2V0X3BjaV9zbG90KHBjaSkpIHsKKwljYXNlIEFIQ180OTRYX1NMT1RfQ0hBTk5FTF9BOgorCQlhaGMtPmNoYW5uZWwgPSAnQSc7CisJCWJyZWFrOworCWNhc2UgQUhDXzQ5NFhfU0xPVF9DSEFOTkVMX0I6CisJCWFoYy0+Y2hhbm5lbCA9ICdCJzsKKwkJYnJlYWs7CisJY2FzZSBBSENfNDk0WF9TTE9UX0NIQU5ORUxfQzoKKwkJYWhjLT5jaGFubmVsID0gJ0MnOworCQlicmVhazsKKwljYXNlIEFIQ180OTRYX1NMT1RfQ0hBTk5FTF9EOgorCQlhaGMtPmNoYW5uZWwgPSAnRCc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiYWRhcHRlciBhdCB1bmV4cGVjdGVkIHNsb3QgJWRcbiIKKwkJICAgICAgICJ1bmFibGUgdG8gbWFwIHRvIGEgY2hhbm5lbFxuIiwKKwkJICAgICAgIGFoY19nZXRfcGNpX3Nsb3QocGNpKSk7CisJCWFoYy0+Y2hhbm5lbCA9ICdBJzsKKwl9CisJYWhjLT5mbGFncyB8PSBBSENfTEFSR0VfU0VFUFJPTTsKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyN2ZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBBZGFwdGVjIEFJQzd4eHggZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkJAorICoKKyAqLworI2lmbmRlZiBfQUlDN1hYWF9QQ0lfSF8KKyNkZWZpbmUgX0FJQzdYWFhfUENJX0hfCisKKyNkZWZpbmUgSURfQUxMX01BU0sJCQkweEZGRkZGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgSURfREVWX1ZFTkRPUl9NQVNLCQkweEZGRkZGRkZGMDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfOTAwNV9HRU5FUklDX01BU0sJCTB4RkZGMEZGRkYwMDAwMDAwMHVsbAorI2RlZmluZSBJRF85MDA1X1NJU0xfTUFTSwkJMHgwMDBGRkZGRjAwMDAwMDAwdWxsCisjZGVmaW5lIElEXzkwMDVfU0lTTF9JRAkJCTB4MDAwNTkwMDUwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSUM3ODUwCQkJMHg1MDc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV8yOTAyXzA0XzEwXzE1XzIwQ18zMEMJMHg1MDc4OTAwNDc4NTA5MDA0dWxsCisjZGVmaW5lIElEX0FJQzc4NTUJCQkweDU1Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUlDNzg1OQkJCTB4Mzg2MDkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMjkzMENVCQkJMHgzODYwOTAwNDM4Njk5MDA0dWxsCisjZGVmaW5lIElEX0FJQzc4NjAJCQkweDYwNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUlDNzg2MEMJCQkweDYwNzg5MDA0Nzg2MDkwMDR1bGwKKyNkZWZpbmUgSURfQUhBXzE0ODBBCQkJMHg2MDc1OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV8yOTQwQVVfMAkJCTB4NjE3ODkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MEFVXzEJCQkweDYxNzg5MDA0Nzg2MTkwMDR1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBBVV9DTgkJMHgyMTc4OTAwNDc4MjE5MDA0dWxsCisjZGVmaW5lIElEX0FIQV8yOTMwQ19WQVIJCTB4NjAzODkwMDQzODY4OTAwNHVsbAorCisjZGVmaW5lIElEX0FJQzc4NzAJCQkweDcwNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDAJCQkweDcxNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5NDAJCQkweDcyNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5OFgJCQkweDczNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDQJCQkweDc0Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5NDQJCQkweDc1Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzQ5NDQJCQkweDc2Nzg5MDA0MDAwMDAwMDB1bGwKKworI2RlZmluZSBJRF9BSUM3ODgwCQkJMHg4MDc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FJQzc4ODBfQgkJCTB4ODA3ODkwMDQ3ODgwOTAwNHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MFUJCQkweDgxNzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5NDBVCQkJMHg4Mjc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV8yOTQ0VQkJCTB4ODQ3ODkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMzk0NFUJCQkweDg1Nzg5MDA0MDAwMDAwMDB1bGwKKyNkZWZpbmUgSURfQUhBXzM5OFhVCQkJMHg4Mzc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FIQV80OTQ0VQkJCTB4ODY3ODkwMDQwMDAwMDAwMHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MFVCCQkJMHg4MTc4OTAwNDc4ODE5MDA0dWxsCisjZGVmaW5lIElEX0FIQV8yOTMwVQkJCTB4ODg3ODkwMDQ3ODg4OTAwNHVsbAorI2RlZmluZSBJRF9BSEFfMjk0MFVfUFJPCQkweDg3Nzg5MDA0Nzg4NzkwMDR1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBVX0NOCQkJMHgwMDc4OTAwNDc4MDA5MDA0dWxsCisKKyNkZWZpbmUgSURfQUlDNzg5NQkJCTB4Nzg5NTkwMDQ3ODk1OTAwNHVsbAorI2RlZmluZSBJRF9BSUM3ODk1X0FSTwkJCTB4Nzg5MDkwMDQ3ODkzOTAwNHVsbAorI2RlZmluZSBJRF9BSUM3ODk1X0FST19NQVNLCQkweEZGRjBGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBVX0RVQUwJCTB4Nzg5NTkwMDQ3ODkxOTAwNHVsbAorI2RlZmluZSBJRF9BSEFfMzk0MEFVCQkJMHg3ODk1OTAwNDc4OTI5MDA0dWxsCisjZGVmaW5lIElEX0FIQV8zOTQ0QVUJCQkweDc4OTU5MDA0Nzg5NDkwMDR1bGwKKworI2RlZmluZSBJRF9BSUM3ODkwCQkJMHgwMDFGOTAwNTAwMEY5MDA1dWxsCisjZGVmaW5lIElEX0FJQzc4OTBfQVJPCQkJMHgwMDEzOTAwNTAwMEY5MDA1dWxsCisjZGVmaW5lIElEX0FBQV8xMzFVMgkJCTB4MDAxMzkwMDUwMDAzOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjkzMFUyCQkJMHgwMDExOTAwNTAxODE5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTQwVTJCCQkJMHgwMDEwOTAwNUExMDA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTQwVTJfT0VNCQkweDAwMTA5MDA1MjE4MDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5NDBVMgkJCTB4MDAxMDkwMDVBMTgwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjk1MFUyQgkJCTB4MDAxMDkwMDVFMTAwOTAwNXVsbAorCisjZGVmaW5lIElEX0FJQzc4OTIJCQkweDAwOEY5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUlDNzg5Ml9BUk8JCQkweDAwODM5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MTYwCQkJMHgwMDgwOTAwNUUyQTA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTE2MF9DUFEJCTB4MDA4MDkwMDVFMkEwMEUxMXVsbAorI2RlZmluZSBJRF9BSEFfMjkxNjBOCQkJMHgwMDgwOTAwNTYyQTA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8yOTE2MEMJCQkweDAwODA5MDA1NjIyMDkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzI5MTYwQgkJCTB4MDA4MDkwMDVFMjIwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMTkxNjBCCQkJMHgwMDgxOTAwNTYyQTE5MDA1dWxsCisKKyNkZWZpbmUgSURfQUlDNzg5NgkJCTB4MDA1RjkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSUM3ODk2X0FSTwkJCTB4MDA1MzkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzk1MFUyQl8wCQkweDAwNTA5MDA1RkZGRjkwMDV1bGwKKyNkZWZpbmUgSURfQUhBXzM5NTBVMkJfMQkJMHgwMDUwOTAwNUY1MDA5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTUwVTJEXzAJCTB4MDA1MTkwMDVGRkZGOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzk1MFUyRF8xCQkweDAwNTE5MDA1QjUwMDkwMDV1bGwKKworI2RlZmluZSBJRF9BSUM3ODk5CQkJMHgwMENGOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FJQzc4OTlfQVJPCQkJMHgwMEMzOTAwNUZGRkY5MDA1dWxsCisjZGVmaW5lIElEX0FIQV8zOTYwRAkJCTB4MDBDMDkwMDVGNjIwOTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMzk2MERfQ1BRCQkweDAwQzA5MDA1RjYyMDBFMTF1bGwKKworI2RlZmluZSBJRF9BSUM3ODEwCQkJMHgxMDc4OTAwNDAwMDAwMDAwdWxsCisjZGVmaW5lIElEX0FJQzc4MTUJCQkweDc4MTU5MDA0MDAwMDAwMDB1bGwKKworI2VuZGlmIC8qIF9BSUM3WFhYX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU4MGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiBTdHJpbmcgaGFuZGxpbmcgY29kZSBjb3VydGVzeSBvZiBHZXJhcmQgUm91ZGllcidzIDxncm91ZGllckBjbHViLWludGVybmV0LmZyPgorICogc3ltIGRyaXZlci4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9saW51eC9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3Byb2MuYyMyOSAkCisgKi8KKyNpbmNsdWRlICJhaWM3eHh4X29zbS5oIgorI2luY2x1ZGUgImFpYzd4eHhfaW5saW5lLmgiCisjaW5jbHVkZSAiYWljN3h4eF85M2N4Ni5oIgorCitzdGF0aWMgdm9pZAljb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50CWNvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkCWFoY19kdW1wX3RhcmdldF9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCisJCQkJICAgICAgc3RydWN0IGluZm9fc3RyICppbmZvLAorCQkJCSAgICAgIHVfaW50IG91cl9pZCwgY2hhciBjaGFubmVsLAorCQkJCSAgICAgIHVfaW50IHRhcmdldF9pZCwgdV9pbnQgdGFyZ2V0X29mZnNldCk7CitzdGF0aWMgdm9pZAlhaGNfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLAorCQkJCSAgICAgIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXYpOworc3RhdGljIGludAlhaGNfcHJvY193cml0ZV9zZWVwcm9tKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgICAgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKworc3RhdGljIHZvaWQKK2NvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWlmIChpbmZvLT5wb3MgKyBsZW4gPiBpbmZvLT5vZmZzZXQgKyBpbmZvLT5sZW5ndGgpCisJCWxlbiA9IGluZm8tPm9mZnNldCArIGluZm8tPmxlbmd0aCAtIGluZm8tPnBvczsKKworCWlmIChpbmZvLT5wb3MgKyBsZW4gPCBpbmZvLT5vZmZzZXQpIHsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmZvLT5wb3MgPCBpbmZvLT5vZmZzZXQpIHsKKwkJb2ZmX3QgcGFydGlhbDsKKworCQlwYXJ0aWFsID0gaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zOworCQlkYXRhICs9IHBhcnRpYWw7CisJCWluZm8tPnBvcyArPSBwYXJ0aWFsOworCQlsZW4gIC09IHBhcnRpYWw7CisJfQorCisJaWYgKGxlbiA+IDApIHsKKwkJbWVtY3B5KGluZm8tPmJ1ZmZlciwgZGF0YSwgbGVuKTsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJaW5mby0+YnVmZmVyICs9IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZlsyNTZdOworCWludCBsZW47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gKGxlbik7Cit9CisKK3ZvaWQKK2FoY19mb3JtYXRfdHJhbnNpbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgc3RydWN0IGFoY190cmFuc2luZm8gKnRpbmZvKQoreworCXVfaW50IHNwZWVkOworCXVfaW50IGZyZXE7CisJdV9pbnQgbWI7CisKKyAgICAgICAgc3BlZWQgPSAzMzAwOworICAgICAgICBmcmVxID0gMDsKKwlpZiAodGluZm8tPm9mZnNldCAhPSAwKSB7CisJCWZyZXEgPSBhaWNfY2FsY19zeW5jc3JhdGUodGluZm8tPnBlcmlvZCk7CisJCXNwZWVkID0gZnJlcTsKKwl9CisJc3BlZWQgKj0gKDB4MDEgPDwgdGluZm8tPndpZHRoKTsKKyAgICAgICAgbWIgPSBzcGVlZCAvIDEwMDA7CisgICAgICAgIGlmIChtYiA+IDApCisJCWNvcHlfaW5mbyhpbmZvLCAiJWQuJTAzZE1CL3MgdHJhbnNmZXJzIiwgbWIsIHNwZWVkICUgMTAwMCk7CisgICAgICAgIGVsc2UKKwkJY29weV9pbmZvKGluZm8sICIlZEtCL3MgdHJhbnNmZXJzIiwgc3BlZWQpOworCisJaWYgKGZyZXEgIT0gMCkgeworCQljb3B5X2luZm8oaW5mbywgIiAoJWQuJTAzZE1IeiVzLCBvZmZzZXQgJWQiLAorCQkJIGZyZXEgLyAxMDAwLCBmcmVxICUgMTAwMCwKKwkJCSAodGluZm8tPnBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVRKSAhPSAwCisJCQkgPyAiIERUIiA6ICIiLCB0aW5mby0+b2Zmc2V0KTsKKwl9CisKKwlpZiAodGluZm8tPndpZHRoID4gMCkgeworCQlpZiAoZnJlcSAhPSAwKSB7CisJCQljb3B5X2luZm8oaW5mbywgIiwgIik7CisJCX0gZWxzZSB7CisJCQljb3B5X2luZm8oaW5mbywgIiAoIik7CisJCX0KKwkJY29weV9pbmZvKGluZm8sICIlZGJpdCkiLCA4ICogKDB4MDEgPDwgdGluZm8tPndpZHRoKSk7CisJfSBlbHNlIGlmIChmcmVxICE9IDApIHsKKwkJY29weV9pbmZvKGluZm8sICIpIik7CisJfQorCWNvcHlfaW5mbyhpbmZvLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2FoY19kdW1wX3RhcmdldF9zdGF0ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBpbmZvX3N0ciAqaW5mbywKKwkJICAgICAgdV9pbnQgb3VyX2lkLCBjaGFyIGNoYW5uZWwsIHVfaW50IHRhcmdldF9pZCwKKwkJICAgICAgdV9pbnQgdGFyZ2V0X29mZnNldCkKK3sKKwlzdHJ1Y3QJYWhjX2xpbnV4X3RhcmdldCAqdGFyZzsKKwlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CisJc3RydWN0CWFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKKwlpbnQJbHVuOworCisJdGluZm8gPSBhaGNfZmV0Y2hfdHJhbnNpbmZvKGFoYywgY2hhbm5lbCwgb3VyX2lkLAorCQkJCSAgICB0YXJnZXRfaWQsICZ0c3RhdGUpOworCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKQorCQljb3B5X2luZm8oaW5mbywgIkNoYW5uZWwgJWMgIiwgY2hhbm5lbCk7CisJY29weV9pbmZvKGluZm8sICJUYXJnZXQgJWQgTmVnb3RpYXRpb24gU2V0dGluZ3NcbiIsIHRhcmdldF9pZCk7CisJY29weV9pbmZvKGluZm8sICJcdFVzZXI6ICIpOworCWFoY19mb3JtYXRfdHJhbnNpbmZvKGluZm8sICZ0aW5mby0+dXNlcik7CisJdGFyZyA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+dGFyZ2V0c1t0YXJnZXRfb2Zmc2V0XTsKKwlpZiAodGFyZyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljb3B5X2luZm8oaW5mbywgIlx0R29hbDogIik7CisJYWhjX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5nb2FsKTsKKwljb3B5X2luZm8oaW5mbywgIlx0Q3VycjogIik7CisJYWhjX2Zvcm1hdF90cmFuc2luZm8oaW5mbywgJnRpbmZvLT5jdXJyKTsKKworCWZvciAobHVuID0gMDsgbHVuIDwgQUhDX05VTV9MVU5TOyBsdW4rKykgeworCQlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OworCisJCWRldiA9IHRhcmctPmRldmljZXNbbHVuXTsKKworCQlpZiAoZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlhaGNfZHVtcF9kZXZpY2Vfc3RhdGUoaW5mbywgZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithaGNfZHVtcF9kZXZpY2Vfc3RhdGUoc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2KQoreworCWNvcHlfaW5mbyhpbmZvLCAiXHRDaGFubmVsICVjIFRhcmdldCAlZCBMdW4gJWQgU2V0dGluZ3NcbiIsCisJCSAgZGV2LT50YXJnZXQtPmNoYW5uZWwgKyAnQScsIGRldi0+dGFyZ2V0LT50YXJnZXQsIGRldi0+bHVuKTsKKworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdENvbW1hbmRzIFF1ZXVlZCAlbGRcbiIsIGRldi0+Y29tbWFuZHNfaXNzdWVkKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kcyBBY3RpdmUgJWRcbiIsIGRldi0+YWN0aXZlKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRDb21tYW5kIE9wZW5pbmdzICVkXG4iLCBkZXYtPm9wZW5pbmdzKTsKKwljb3B5X2luZm8oaW5mbywgIlx0XHRNYXggVGFnZ2VkIE9wZW5pbmdzICVkXG4iLCBkZXYtPm1heHRhZ3MpOworCWNvcHlfaW5mbyhpbmZvLCAiXHRcdERldmljZSBRdWV1ZSBGcm96ZW4gQ291bnQgJWRcbiIsIGRldi0+cWZyb3plbik7Cit9CisKK3N0YXRpYyBpbnQKK2FoY19wcm9jX3dyaXRlX3NlZXByb20oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNlZXByb21fZGVzY3JpcHRvciBzZDsKKwlpbnQgaGF2ZV9zZWVwcm9tOworCXVfbG9uZyBzOworCWludCBwYXVzZWQ7CisJaW50IHdyaXR0ZW47CisKKwkvKiBEZWZhdWx0IHRvIGZhaWx1cmUuICovCisJd3JpdHRlbiA9IC1FSU5WQUw7CisJYWhjX2xvY2soYWhjLCAmcyk7CisJcGF1c2VkID0gYWhjX2lzX3BhdXNlZChhaGMpOworCWlmICghcGF1c2VkKQorCQlhaGNfcGF1c2UoYWhjKTsKKworCWlmIChsZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBzZWVwcm9tX2NvbmZpZykpIHsKKwkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBpbmNvcnJlY3QgYnVmZmVyIHNpemVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGF2ZV9zZWVwcm9tID0gYWhjX3ZlcmlmeV9ja3N1bSgoc3RydWN0IHNlZXByb21fY29uZmlnKilidWZmZXIpOworCWlmIChoYXZlX3NlZXByb20gPT0gMCkgeworCQlwcmludGYoImFoY19wcm9jX3dyaXRlX3NlZXByb206IGNrc3VtIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc2Quc2RfYWhjID0gYWhjOworI2lmIEFIQ19QQ0lfQ09ORklHID4gMAorCWlmICgoYWhjLT5jaGlwICYgQUhDX1BDSSkgIT0gMCkgeworCQlzZC5zZF9jb250cm9sX29mZnNldCA9IFNFRUNUTDsKKwkJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNFRUNUTDsKKwkJc2Quc2RfZGF0YW91dF9vZmZzZXQgPSBTRUVDVEw7CisJCWlmIChhaGMtPmZsYWdzICYgQUhDX0xBUkdFX1NFRVBST00pCisJCQlzZC5zZF9jaGlwID0gQzU2XzY2OworCQllbHNlCisJCQlzZC5zZF9jaGlwID0gQzQ2OworCQlzZC5zZF9NUyA9IFNFRU1TOworCQlzZC5zZF9SRFkgPSBTRUVSRFk7CisJCXNkLnNkX0NTID0gU0VFQ1M7CisJCXNkLnNkX0NLID0gU0VFQ0s7CisJCXNkLnNkX0RPID0gU0VFRE87CisJCXNkLnNkX0RJID0gU0VFREk7CisJCWhhdmVfc2VlcHJvbSA9IGFoY19hY3F1aXJlX3NlZXByb20oYWhjLCAmc2QpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKChhaGMtPmNoaXAgJiBBSENfVkwpICE9IDApIHsKKwkJc2Quc2RfY29udHJvbF9vZmZzZXQgPSBTRUVDVExfMjg0MDsKKwkJc2Quc2Rfc3RhdHVzX29mZnNldCA9IFNUQVRVU18yODQwOworCQlzZC5zZF9kYXRhb3V0X29mZnNldCA9IFNUQVRVU18yODQwOwkJCisJCXNkLnNkX2NoaXAgPSBDNDY7CisJCXNkLnNkX01TID0gMDsKKwkJc2Quc2RfUkRZID0gRUVQUk9NX1RGOworCQlzZC5zZF9DUyA9IENTXzI4NDA7CisJCXNkLnNkX0NLID0gQ0tfMjg0MDsKKwkJc2Quc2RfRE8gPSBET18yODQwOworCQlzZC5zZF9ESSA9IERJXzI4NDA7CisJCWhhdmVfc2VlcHJvbSA9IFRSVUU7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiB1bnN1cHBvcnRlZCBhZGFwdGVyIHR5cGVcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFoYXZlX3NlZXByb20pIHsKKwkJcHJpbnRmKCJhaGNfcHJvY193cml0ZV9zZWVwcm9tOiBObyBTZXJpYWwgRUVQUk9NXG4iKTsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCXVfaW50IHN0YXJ0X2FkZHI7CisKKwkJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkgeworCQkJYWhjLT5zZWVwX2NvbmZpZyA9IG1hbGxvYyhzaXplb2YoKmFoYy0+c2VlcF9jb25maWcpLAorCQkJCQkJICBNX0RFVkJVRiwgTV9OT1dBSVQpOworCQkJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkgeworCQkJCXByaW50ZigiYWljN3h4eDogVW5hYmxlIHRvIGFsbG9jYXRlIHNlcmlhbCAiCisJCQkJICAgICAgICJlZXByb20gYnVmZmVyLiAgV3JpdGUgZmFpbGluZ1xuIik7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXByaW50ZigiYWljN3h4eDogV3JpdGluZyBTZXJpYWwgRUVQUk9NXG4iKTsKKwkJc3RhcnRfYWRkciA9IDMyICogKGFoYy0+Y2hhbm5lbCAtICdBJyk7CisJCWFoY193cml0ZV9zZWVwcm9tKCZzZCwgKHVfaW50MTZfdCAqKWJ1ZmZlciwgc3RhcnRfYWRkciwKKwkJCQkgIHNpemVvZihzdHJ1Y3Qgc2VlcHJvbV9jb25maWcpLzIpOworCQlhaGNfcmVhZF9zZWVwcm9tKCZzZCwgKHVpbnQxNl90ICopYWhjLT5zZWVwX2NvbmZpZywKKwkJCQkgc3RhcnRfYWRkciwgc2l6ZW9mKHN0cnVjdCBzZWVwcm9tX2NvbmZpZykvMik7CisjaWYgQUhDX1BDSV9DT05GSUcgPiAwCisJCWlmICgoYWhjLT5jaGlwICYgQUhDX1ZMKSA9PSAwKQorCQkJYWhjX3JlbGVhc2Vfc2VlcHJvbSgmc2QpOworI2VuZGlmCisJCXdyaXR0ZW4gPSBsZW5ndGg7CisJfQorCitkb25lOgorCWlmICghcGF1c2VkKQorCQlhaGNfdW5wYXVzZShhaGMpOworCWFoY191bmxvY2soYWhjLCAmcyk7CisJcmV0dXJuICh3cml0dGVuKTsKK30KKworLyoKKyAqIFJldHVybiBpbmZvcm1hdGlvbiB0byBoYW5kbGUgL3Byb2Mgc3VwcG9ydCBmb3IgdGhlIGRyaXZlci4KKyAqLworaW50CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCithaGNfbGludXhfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgICBpbnQgbGVuZ3RoLCBpbnQgaG9zdG5vLCBpbnQgaW5vdXQpCisjZWxzZQorYWhjX2xpbnV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCisJCSAgICBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKKyNlbmRpZgoreworCXN0cnVjdAlhaGNfc29mdGMgKmFoYzsKKwlzdHJ1Y3QJaW5mb19zdHIgaW5mbzsKKwljaGFyCWFoY19pbmZvWzI1Nl07CisJdV9sb25nCXM7CisJdV9pbnQJbWF4X3Rhcmc7CisJdV9pbnQJaTsKKwlpbnQJcmV0dmFsOworCisJcmV0dmFsID0gLUVJTlZBTDsKKwlhaGNfbGlzdF9sb2NrKCZzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlUQUlMUV9GT1JFQUNIKGFoYywgJmFoY190YWlscSwgbGlua3MpIHsKKwkJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YS0+aG9zdC0+aG9zdF9ubyA9PSBob3N0bm8pCisJCQlicmVhazsKKwl9CisjZWxzZQorCWFoYyA9IGFoY19maW5kX3NvZnRjKCooc3RydWN0IGFoY19zb2Z0YyAqKilzaG9zdC0+aG9zdGRhdGEpOworI2VuZGlmCisKKwlpZiAoYWhjID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCSAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGU/ICovIAorCWlmIChpbm91dCA9PSBUUlVFKSB7CisJCXJldHZhbCA9IGFoY19wcm9jX3dyaXRlX3NlZXByb20oYWhjLCBidWZmZXIsIGxlbmd0aCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3RhcnQpCisJCSpzdGFydCA9IGJ1ZmZlcjsKKworCWluZm8uYnVmZmVyCT0gYnVmZmVyOworCWluZm8ubGVuZ3RoCT0gbGVuZ3RoOworCWluZm8ub2Zmc2V0CT0gb2Zmc2V0OworCWluZm8ucG9zCT0gMDsKKworCWNvcHlfaW5mbygmaW5mbywgIkFkYXB0ZWMgQUlDN3h4eCBkcml2ZXIgdmVyc2lvbjogJXNcbiIsCisJCSAgQUlDN1hYWF9EUklWRVJfVkVSU0lPTik7CisJY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsIGFoYy0+ZGVzY3JpcHRpb24pOworCWFoY19jb250cm9sbGVyX2luZm8oYWhjLCBhaGNfaW5mbyk7CisJY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsIGFoY19pbmZvKTsKKwljb3B5X2luZm8oJmluZm8sICJBbGxvY2F0ZWQgU0NCczogJWQsIFNHIExpc3QgTGVuZ3RoOiAlZFxuXG4iLAorCQkgIGFoYy0+c2NiX2RhdGEtPm51bXNjYnMsIEFIQ19OU0VHKTsKKworCisJaWYgKGFoYy0+c2VlcF9jb25maWcgPT0gTlVMTCkKKwkJY29weV9pbmZvKCZpbmZvLCAiTm8gU2VyaWFsIEVFUFJPTVxuIik7CisJZWxzZSB7CisJCWNvcHlfaW5mbygmaW5mbywgIlNlcmlhbCBFRVBST006XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZigqYWhjLT5zZWVwX2NvbmZpZykvMjsgaSsrKSB7CisJCQlpZiAoKChpICUgOCkgPT0gMCkgJiYgKGkgIT0gMCkpIHsKKwkJCQljb3B5X2luZm8oJmluZm8sICJcbiIpOworCQkJfQorCQkJY29weV9pbmZvKCZpbmZvLCAiMHglLjR4ICIsCisJCQkJICAoKHVpbnQxNl90KilhaGMtPnNlZXBfY29uZmlnKVtpXSk7CisJCX0KKwkJY29weV9pbmZvKCZpbmZvLCAiXG4iKTsKKwl9CisJY29weV9pbmZvKCZpbmZvLCAiXG4iKTsKKworCW1heF90YXJnID0gMTU7CisJaWYgKChhaGMtPmZlYXR1cmVzICYgKEFIQ19XSURFfEFIQ19UV0lOKSkgPT0gMCkKKwkJbWF4X3RhcmcgPSA3OworCisJZm9yIChpID0gMDsgaSA8PSBtYXhfdGFyZzsgaSsrKSB7CisJCXVfaW50IG91cl9pZDsKKwkJdV9pbnQgdGFyZ2V0X2lkOworCQljaGFyIGNoYW5uZWw7CisKKwkJY2hhbm5lbCA9ICdBJzsKKwkJb3VyX2lkID0gYWhjLT5vdXJfaWQ7CisJCXRhcmdldF9pZCA9IGk7CisJCWlmIChpID4gNyAmJiAoYWhjLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSAhPSAwKSB7CisJCQljaGFubmVsID0gJ0InOworCQkJb3VyX2lkID0gYWhjLT5vdXJfaWRfYjsKKwkJCXRhcmdldF9pZCA9IGkgJSA4OworCQl9CisKKwkJYWhjX2R1bXBfdGFyZ2V0X3N0YXRlKGFoYywgJmluZm8sIG91cl9pZCwKKwkJCQkgICAgICBjaGFubmVsLCB0YXJnZXRfaWQsIGkpOworCX0KKwlyZXR2YWwgPSBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0ID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7Citkb25lOgorCWFoY19saXN0X3VubG9jaygmcyk7CisJcmV0dXJuIChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWcuaF9zaGlwcGVkIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWcuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTM5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3JlZy5oX3NoaXBwZWQKQEAgLTAsMCArMSwxNzg3IEBACisvKgorICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKyAqCQkgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZSBmaWxlczoKKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHguc2VxIzU2ICQKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljN3h4eC5yZWcjMzkgJAorICovCit0eXBlZGVmIGludCAoYWhjX3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpOwordHlwZWRlZiBzdHJ1Y3QgYWhjX3JlZ19wYXJzZV9lbnRyeSB7CisJY2hhcgkqbmFtZTsKKwl1aW50OF90CSB2YWx1ZTsKKwl1aW50OF90CSBtYXNrOworfSBhaGNfcmVnX3BhcnNlX2VudHJ5X3Q7CisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzZXFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NzaXNlcV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSVNFUSIsIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N4ZnJjdGwwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N4ZnJjdGwwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMCIsIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N4ZnJjdGwxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N4ZnJjdGwxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMSIsIDB4MDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzaWdvX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lzaWdvX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHTyIsIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzaWdpX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lzaWdpX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJU0lHSSIsIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lyYXRlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lyYXRlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJUkFURSIsIDB4MDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lJRCIsIDB4MDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lkYXRsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lkYXRsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJREFUTCIsIDB4MDYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lkYXRoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lkYXRoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJREFUSCIsIDB4MDcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N0Y250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N0Y250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVENOVCIsIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX29wdGlvbm1vZGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfb3B0aW9ubW9kZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiT1BUSU9OTU9ERSIsIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3RhcmdjcmNjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfdGFyZ2NyY2NudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVEFSR0NSQ0NOVCIsIDB4MGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NscnNpbnQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2NscnNpbnQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMCIsIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0MF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDBfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMCIsIDB4MGIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NscnNpbnQxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2NscnNpbnQxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTFJTSU5UMSIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0MV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMSIsIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0Ml9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMiIsIDB4MGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NzdGF0M19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zc3RhdDNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNTVEFUMyIsIDB4MGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lpZF91bHRyYTJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NzaWlkX3VsdHJhMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSUlEX1VMVFJBMiIsIDB4MGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbW9kZTBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2ltb2RlMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMCIsIDB4MTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbW9kZTFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2ltb2RlMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0lNT0RFMSIsIDB4MTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lidXNsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lidXNsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQlVTTCIsIDB4MTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lidXNoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2lidXNoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQlVTSCIsIDB4MTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N4ZnJjdGwyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N4ZnJjdGwyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTWEZSQ1RMMiIsIDB4MTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NoYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zaGFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNIQUREUiIsIDB4MTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlbHRpbWVyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlbHRpbWVyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUxUSU1FUiIsIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlbGlkX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlbGlkX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUxJRCIsIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYW1jdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NhbWN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NBTUNUTCIsIDB4MWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3RhcmdpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY190YXJnaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlRBUkdJRCIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NwaW9jYXBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc3Bpb2NhcF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU1BJT0NBUCIsIDB4MWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2JyZGN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19icmRjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJSRENUTCIsIDB4MWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlZWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZWVjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFRUNUTCIsIDB4MWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NibGtjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2Jsa2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0JMS0NUTCIsIDB4MWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2J1c3lfdGFyZ2V0c19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19idXN5X3RhcmdldHNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1lfVEFSR0VUUyIsIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3VsdHJhX2VuYl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY191bHRyYV9lbmJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlVMVFJBX0VOQiIsIDB4MzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rpc2NfZHNiX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Rpc2NfZHNiX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESVNDX0RTQiIsIDB4MzIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NtZHNpemVfdGFibGVfdGFpbF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jbWRzaXplX3RhYmxlX3RhaWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNNRFNJWkVfVEFCTEVfVEFJTCIsIDB4MzQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX213aV9yZXNpZHVhbF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19td2lfcmVzaWR1YWxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk1XSV9SRVNJRFVBTCIsIDB4MzgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX25leHRfcXVldWVkX3NjYl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19uZXh0X3F1ZXVlZF9zY2JfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIk5FWFRfUVVFVUVEX1NDQiIsIDB4MzksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX21zZ19vdXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfbXNnX291dF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RtYXBhcmFtc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kbWFwYXJhbXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRNQVBBUkFNUyIsIDB4M2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcV9mbGFnc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZXFfZmxhZ3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUV9GTEFHUyIsIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NhdmVkX3Njc2lpZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zYXZlZF9zY3NpaWRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NhdmVkX2x1bl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zYXZlZF9sdW5fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2xhc3RwaGFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19sYXN0cGhhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkxBU1RQSEFTRSIsIDB4M2YsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3dhaXRpbmdfc2NiaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY193YWl0aW5nX3NjYmhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfU0NCSCIsIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rpc2Nvbm5lY3RlZF9zY2JoX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Rpc2Nvbm5lY3RlZF9zY2JoX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESVNDT05ORUNURURfU0NCSCIsIDB4NDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ZyZWVfc2NiaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19mcmVlX3NjYmhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZSRUVfU0NCSCIsIDB4NDIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NvbXBsZXRlX3NjYmhfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY29tcGxldGVfc2NiaF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCSCIsIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hzY2JfYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19oc2NiX2FkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhTQ0JfQUREUiIsIDB4NDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2hhcmVkX2RhdGFfYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBUkVEX0RBVEFfQUREUiIsIDB4NDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2tlcm5lbF9xaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfa2VybmVsX3FpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1FJTlBPUyIsIDB4NGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FpbnBvc19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19xaW5wb3NfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFJTlBPUyIsIDB4NGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvdXRwb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfcW91dHBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVFBPUyIsIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2tlcm5lbF90cWlucG9zX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2tlcm5lbF90cWlucG9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJLRVJORUxfVFFJTlBPUyIsIDB4NGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3RxaW5wb3NfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfdHFpbnBvc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FyZ18xX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FyZ18xX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMSIsIDB4NTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FyZ18yX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FyZ18yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2xhc3RfbXNnX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2xhc3RfbXNnX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJMQVNUX01TRyIsIDB4NTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NzaXNlcV90ZW1wbGF0ZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSVNFUV9URU1QTEFURSIsIDB4NTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hhXzI3NF9iaW9zZ2xvYmFsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2hhXzI3NF9iaW9zZ2xvYmFsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQV8yNzRfQklPU0dMT0JBTCIsIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcV9mbGFnczJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2VxX2ZsYWdzMl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0VRX0ZMQUdTMiIsIDB4NTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2ljb25mX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Njc2ljb25mX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQ09ORiIsIDB4NWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ludGRlZl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19pbnRkZWZfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIklOVERFRiIsIDB4NWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hvc3Rjb25mX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2hvc3Rjb25mX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIT1NUQ09ORiIsIDB4NWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hhXzI3NF9iaW9zY3RybF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19oYV8yNzRfYmlvc2N0cmxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhBXzI3NF9CSU9TQ1RSTCIsIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcWN0bF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZXFjdGxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUNUTCIsIDB4NjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcXJhbV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZXFyYW1fcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUVJBTSIsIDB4NjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcWFkZHIwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlcWFkZHIwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFBRERSMCIsIDB4NjIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlcWFkZHIxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlcWFkZHIxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFBRERSMSIsIDB4NjMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FjY3VtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FjY3VtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQ0NVTSIsIDB4NjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRFWCIsIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RpbmRleF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kaW5kZXhfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRFWCIsIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FsbG9uZXNfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfYWxsb25lc19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQUxMT05FUyIsIDB4NjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2FsbHplcm9zX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2FsbHplcm9zX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExaRVJPUyIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX25vbmVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfbm9uZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTk9ORSIsIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ZsYWdzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2ZsYWdzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGTEFHUyIsIDB4NmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRJUiIsIDB4NmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RpbmRpcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kaW5kaXJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRJUiIsIDB4NmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Z1bmN0aW9uMV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19mdW5jdGlvbjFfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkZVTkNUSU9OMSIsIDB4NmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N0YWNrX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N0YWNrX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFDSyIsIDB4NmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Rhcmdfb2Zmc2V0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3Rhcmdfb2Zmc2V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHX09GRlNFVCIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NyYW1fYmFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zcmFtX2Jhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNSQU1fQkFTRSIsIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2JjdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfYmN0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQkNUTCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RzY29tbWFuZDBfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZHNjb21tYW5kMF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNDT01NQU5EMCIsIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2J1c3RpbWVfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfYnVzdGltZV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQlVTVElNRSIsIDB4ODUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RzY29tbWFuZDFfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZHNjb21tYW5kMV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRFNDT01NQU5EMSIsIDB4ODUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2J1c3NwZF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19idXNzcGRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1NQRCIsIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hzX21haWxib3hfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaHNfbWFpbGJveF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSFNfTUFJTEJPWCIsIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RzcGNpc3RhdHVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2RzcGNpc3RhdHVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJEU1BDSVNUQVRVUyIsIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hjbnRybF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19oY250cmxfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhDTlRSTCIsIDB4ODcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2hhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2hjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSENOVCIsIDB4OGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYnB0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQlBUUiIsIDB4OTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2ludHN0YXRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaW50c3RhdF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSU5UU1RBVCIsIDB4OTEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NscmludF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jbHJpbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNMUklOVCIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Vycm9yX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Vycm9yX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJFUlJPUiIsIDB4OTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmY250cmxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZGZjbnRybF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZDTlRSTCIsIDB4OTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rmc3RhdHVzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Rmc3RhdHVzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERlNUQVRVUyIsIDB4OTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Rmd2FkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZGZ3YWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZXQUREUiIsIDB4OTUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmcmFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfZGZyYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZSQUREUiIsIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmZGF0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2RmZGF0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJERkRBVCIsIDB4OTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQkNOVCIsIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FpbmZpZm9fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfcWluZmlmb19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUlORklGTyIsIDB4OWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FpbmNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19xaW5jbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFJTkNOVCIsIDB4OWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvdXRmaWZvX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3FvdXRmaWZvX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGTyIsIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NyY2NvbnRyb2wxX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2NyY2NvbnRyb2wxX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDUkNDT05UUk9MMSIsIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvdXRjbnRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfcW91dGNudF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVENOVCIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Njc2lwaGFzZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY3NpcGhhc2VfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lQSEFTRSIsIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NmdW5jdF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZnVuY3RfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNGVU5DVCIsIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9iYXNlX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9iYXNlX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQkFTRSIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9jZGJfcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9jZGJfcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ0RCX1BUUiIsIDB4YTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9yZXNpZHVhbF9zZ3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JfcmVzaWR1YWxfc2dwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9SRVNJRFVBTF9TR1BUUiIsIDB4YTQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3NpX3N0YXR1c19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2Jfc2NzaV9zdGF0dXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJX1NUQVRVUyIsIDB4YTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YXJnZXRfcGhhc2VzX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl90YXJnZXRfcGhhc2VzX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX1BIQVNFUyIsIDB4YTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YXJnZXRfZGF0YV9kaXJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX3RhcmdldF9kYXRhX2Rpcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBUkdFVF9EQVRBX0RJUiIsIDB4YWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YXJnZXRfaXRhZ19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JfdGFyZ2V0X2l0YWdfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9UQVJHRVRfSVRBRyIsIDB4YWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9kYXRhcHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9kYXRhcHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQVBUUiIsIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9kYXRhY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9kYXRhY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQUNOVCIsIDB4YjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zZ3B0cl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2Jfc2dwdHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TR1BUUiIsIDB4YjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9jb250cm9sX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9jb250cm9sX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ09OVFJPTCIsIDB4YjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3NpaWRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX3Njc2lpZF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NDU0lJRCIsIDB4YjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9sdW5fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX2x1bl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0xVTiIsIDB4YmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl90YWdfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiX3RhZ19wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBRyIsIDB4YmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9jZGJfbGVuX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9jZGJfbGVuX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ0RCX0xFTiIsIDB4YmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3NpcmF0ZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2Jfc2NzaXJhdGVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJUkFURSIsIDB4YmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9zY3Npb2Zmc2V0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9zY3Npb2Zmc2V0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfU0NTSU9GRlNFVCIsIDB4YmUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl9uZXh0X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYl9uZXh0X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfTkVYVCIsIDB4YmYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl82NF9zcGFyZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zY2JfNjRfc3BhcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl82NF9TUEFSRSIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NlZWN0bF8yODQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NlZWN0bF8yODQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRUVDVExfMjg0MCIsIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3N0YXR1c18yODQwX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3N0YXR1c18yODQwX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVEFUVVNfMjg0MCIsIDB4YzEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYl82NF9idHRfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2NiXzY0X2J0dF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCXzY0X0JUVCIsIDB4ZDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NjaGFkZHJfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY2NoYWRkcl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NIQUREUiIsIDB4ZTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2NjaGNudF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jY2hjbnRfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDSENOVCIsIDB4ZTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2dyYW1fcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY2NzZ3JhbV9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR1JBTSIsIDB4ZTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2dhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2dhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQUREUiIsIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2djdGxfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfY2NzZ2N0bF9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTR0NUTCIsIDB4ZWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NicmFtX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NicmFtX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQlJBTSIsIDB4ZWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NiYWRkcl9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19jY3NjYmFkZHJfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCQUREUiIsIDB4ZWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NiY3RsX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NiY3RsX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNUTCIsIDB4ZWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NiY250X3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NiY250X3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNOVCIsIDB4ZWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NjYmJhZGRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3NjYmJhZGRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JCQUREUiIsIDB4ZjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2Njc2NicHRyX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX2Njc2NicHRyX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQlBUUiIsIDB4ZjEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2huc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfaG5zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiSE5TQ0JfUU9GRiIsIDB4ZjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Nuc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc25zY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU05TQ0JfUU9GRiIsIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3Nkc2NiX3FvZmZfcHJpbnQ7CisjZWxzZQorI2RlZmluZSBhaGNfc2RzY2JfcW9mZl9wcmludChyZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkgXAorICAgIGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0RTQ0JfUU9GRiIsIDB4ZjgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3FvZmZfY3Rsc3RhX3ByaW50OworI2Vsc2UKKyNkZWZpbmUgYWhjX3FvZmZfY3Rsc3RhX3ByaW50KHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSBcCisgICAgYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT0ZGX0NUTFNUQSIsIDB4ZmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX2RmZl90aHJzaF9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19kZmZfdGhyc2hfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGRl9USFJTSCIsIDB4ZmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NnX2NhY2hlX3NoYWRvd19wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZ19jYWNoZV9zaGFkb3dfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1NIQURPVyIsIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKyNpZiBBSUNfREVCVUdfUkVHSVNURVJTCithaGNfcmVnX3ByaW50X3QgYWhjX3NnX2NhY2hlX3ByZV9wcmludDsKKyNlbHNlCisjZGVmaW5lIGFoY19zZ19jYWNoZV9wcmVfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFwKKyAgICBhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNHX0NBQ0hFX1BSRSIsIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKQorI2VuZGlmCisKKworI2RlZmluZQlTQ1NJU0VRICAgICAgICAgCQkweDAwCisjZGVmaW5lCQlURU1PREUgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNDU0lSU1RPICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNYRlJDVEwwICAgICAgICAJCTB4MDEKKyNkZWZpbmUJCURGT04gICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJREZQRVhQICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlGQVNUMjAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUlNUQ05UICAgICAgICAJMHgxMAorI2RlZmluZQkJU1BJT0VOICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTQ0FNRU4gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUkNITiAgICAgICAgICAJMHgwMgorCisjZGVmaW5lCVNYRlJDVEwxICAgICAgICAJCTB4MDIKKyNkZWZpbmUJCVNUSU1FU0VMICAgICAgICAJMHgxOAorI2RlZmluZQkJQklUQlVDS0VUICAgICAgIAkweDgwCisjZGVmaW5lCQlTV1JBUEVOICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU1RJTUVSICAgICAgICAJMHgwNAorI2RlZmluZQkJQUNUTkVHRU4gICAgICAgIAkweDAyCisjZGVmaW5lCQlTVFBXRU4gICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJU0lHTyAgICAgICAgCQkweDAzCisjZGVmaW5lCQlDRE8gICAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCUlPTyAgICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHTyAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlBVE5PICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTE8gICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZTyAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS08gICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lTSUdJICAgICAgICAJCTB4MDMKKyNkZWZpbmUJCVBfREFUQUlOX0RUICAgICAJMHg2MAorI2RlZmluZQkJUF9EQVRBT1VUX0RUICAgIAkweDIwCisjZGVmaW5lCQlBVE5JICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTEkgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZSSAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFJICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS0kgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lSQVRFICAgICAgICAJCTB4MDQKKyNkZWZpbmUJCVNYRlIgICAgICAgICAgICAJMHg3MAorI2RlZmluZQkJU09GUyAgICAgICAgICAgIAkweDBmCisjZGVmaW5lCQlTWEZSX1VMVFJBMiAgICAgCTB4MGYKKyNkZWZpbmUJCVdJREVYRkVSICAgICAgICAJMHg4MAorI2RlZmluZQkJRU5BQkxFX0NSQyAgICAgIAkweDQwCisjZGVmaW5lCQlTSU5HTEVfRURHRSAgICAgCTB4MTAKKworI2RlZmluZQlTQ1NJSUQgICAgICAgICAgCQkweDA1CisjZGVmaW5lCVNDU0lPRkZTRVQgICAgICAJCTB4MDUKKyNkZWZpbmUJCVNPRlNfVUxUUkEyICAgICAJMHg3ZgorCisjZGVmaW5lCVNDU0lEQVRMICAgICAgICAJCTB4MDYKKworI2RlZmluZQlTQ1NJREFUSCAgICAgICAgCQkweDA3CisKKyNkZWZpbmUJU1RDTlQgICAgICAgICAgIAkJMHgwOAorCisjZGVmaW5lCU9QVElPTk1PREUgICAgICAJCTB4MDgKKyNkZWZpbmUJCU9QVElPTk1PREVfREVGQVVMVFMJMHgwMworI2RlZmluZQkJQVVUT1JBVEVFTiAgICAgIAkweDgwCisjZGVmaW5lCQlBVVRPQUNLRU4gICAgICAgCTB4NDAKKyNkZWZpbmUJCUFUTk1HTU5URU4gICAgICAJMHgyMAorI2RlZmluZQkJQlVTRlJFRVJFViAgICAgIAkweDEwCisjZGVmaW5lCQlFWFBQSEFTRURJUyAgICAgCTB4MDgKKyNkZWZpbmUJCVNDU0lEQVRMX0lNR0VOICAJMHgwNAorI2RlZmluZQkJQVVUT19NU0dPVVRfREUgIAkweDAyCisjZGVmaW5lCQlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorCisjZGVmaW5lCVRBUkdDUkNDTlQgICAgICAJCTB4MGEKKworI2RlZmluZQlDTFJTSU5UMCAgICAgICAgCQkweDBiCisjZGVmaW5lCQlDTFJTRUxETyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNMUlNFTERJICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSU0VMSU5HTyAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJJT0VSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNXUkFQICAgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU1BJT1JEWSAgICAgIAkweDAyCisKKyNkZWZpbmUJU1NUQVQwICAgICAgICAgIAkJMHgwYgorI2RlZmluZQkJVEFSR0VUICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRUxETyAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTERJICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU0VMSU5HTyAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTV1JBUCAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUlPRVJSICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJU0RPTkUgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlTUElPUkRZICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURNQURPTkUgICAgICAgICAJMHgwMQorCisjZGVmaW5lCUNMUlNJTlQxICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCUNMUlNFTFRJTUVPICAgICAJMHg4MAorI2RlZmluZQkJQ0xSQVROTyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlDTFJTQ1NJUlNUSSAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUkJVU0ZSRUUgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU0NTSVBFUlIgICAgIAkweDA0CisjZGVmaW5lCQlDTFJQSEFTRUNIRyAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUlJFUUlOSVQgICAgICAJMHgwMQorCisjZGVmaW5lCVNTVEFUMSAgICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCVNFTFRPICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJQVROVEFSRyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJUlNUSSAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVBIQVNFTUlTICAgICAgICAJMHgxMAorI2RlZmluZQkJQlVTRlJFRSAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTQ1NJUEVSUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVBIQVNFQ0hHICAgICAgICAJMHgwMgorI2RlZmluZQkJUkVRSU5JVCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1NUQVQyICAgICAgICAgIAkJMHgwZAorI2RlZmluZQkJU0ZDTlQgICAgICAgICAgIAkweDFmCisjZGVmaW5lCQlPVkVSUlVOICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNIVkFMSUQgICAgICAgICAJMHg0MAorI2RlZmluZQkJRVhQX0FDVElWRSAgICAgIAkweDEwCisjZGVmaW5lCQlDUkNWQUxFUlIgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNSQ0VOREVSUiAgICAgICAJMHgwNAorI2RlZmluZQkJQ1JDUkVRRVJSICAgICAgIAkweDAyCisjZGVmaW5lCQlEVUFMX0VER0VfRVJSICAgCTB4MDEKKworI2RlZmluZQlTU1RBVDMgICAgICAgICAgCQkweDBlCisjZGVmaW5lCQlTQ1NJQ05UICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJCVUyT0ZGQ05UICAgICAgICAJMHg3ZgorI2RlZmluZQkJT0ZGQ05UICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0NTSUlEX1VMVFJBMiAgIAkJMHgwZgorCisjZGVmaW5lCVNJTU9ERTAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUJCUVOU0VMRE8gICAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TRUxESSAgICAgICAgIAkweDIwCisjZGVmaW5lCQlFTlNFTElOR08gICAgICAgCTB4MTAKKyNkZWZpbmUJCUVOSU9FUlIgICAgICAgICAJMHgwOAorI2RlZmluZQkJRU5TV1JBUCAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTlNET05FICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOU1BJT1JEWSAgICAgICAJMHgwMgorI2RlZmluZQkJRU5ETUFET05FICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lNT0RFMSAgICAgICAgIAkJMHgxMQorI2RlZmluZQkJRU5TRUxUSU1PICAgICAgIAkweDgwCisjZGVmaW5lCQlFTkFUTlRBUkcgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU0NTSVJTVCAgICAgICAJMHgyMAorI2RlZmluZQkJRU5QSEFTRU1JUyAgICAgIAkweDEwCisjZGVmaW5lCQlFTkJVU0ZSRUUgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOU0NTSVBFUlIgICAgICAJMHgwNAorI2RlZmluZQkJRU5QSEFTRUNIRyAgICAgIAkweDAyCisjZGVmaW5lCQlFTlJFUUlOSVQgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJQlVTTCAgICAgICAgCQkweDEyCisKKyNkZWZpbmUJU0NTSUJVU0ggICAgICAgIAkJMHgxMworCisjZGVmaW5lCVNYRlJDVEwyICAgICAgICAJCTB4MTMKKyNkZWZpbmUJCUFTWU5DX1NFVFVQICAgICAJMHgwNworI2RlZmluZQkJQVVUT1JTVERJUyAgICAgIAkweDEwCisjZGVmaW5lCQlDTURETUFFTiAgICAgICAgCTB4MDgKKworI2RlZmluZQlTSEFERFIgICAgICAgICAgCQkweDE0CisKKyNkZWZpbmUJU0VMVElNRVIgICAgICAgIAkJMHgxOAorI2RlZmluZQlUQVJHSURJTiAgICAgICAgCQkweDE4CisjZGVmaW5lCQlTVEFHRTYgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNUQUdFNSAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU1RBR0U0ICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTVEFHRTMgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNUQUdFMiAgICAgICAgICAJMHgwMgorI2RlZmluZQkJU1RBR0UxICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0VMSUQgICAgICAgICAgIAkJMHgxOQorI2RlZmluZQkJU0VMSURfTUFTSyAgICAgIAkweGYwCisjZGVmaW5lCQlPTkVCSVQgICAgICAgICAgCTB4MDgKKworI2RlZmluZQlTQ0FNQ1RMICAgICAgICAgCQkweDFhCisjZGVmaW5lCQlTQ0FNTFZMICAgICAgICAgCTB4MDMKKyNkZWZpbmUJCUVOU0NBTVNFTE8gICAgICAJMHg4MAorI2RlZmluZQkJQ0xSU0NBTVNFTElEICAgIAkweDQwCisjZGVmaW5lCQlBTFRTVElNICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCURGTFRUSUQgICAgICAgICAJMHgxMAorCisjZGVmaW5lCVRBUkdJRCAgICAgICAgICAJCTB4MWIKKworI2RlZmluZQlTUElPQ0FQICAgICAgICAgCQkweDFiCisjZGVmaW5lCQlTT0ZUMSAgICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNPRlQwICAgICAgICAgICAJMHg0MAorI2RlZmluZQkJU09GVENNREVOICAgICAgIAkweDIwCisjZGVmaW5lCQlFWFRfQlJEQ1RMICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFRVBST00gICAgICAgICAJMHgwOAorI2RlZmluZQkJRUVQUk9NICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlST00gICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNTUElPQ1BTICAgICAgICAJMHgwMQorCisjZGVmaW5lCUJSRENUTCAgICAgICAgICAJCTB4MWQKKyNkZWZpbmUJCUJSRERBVDcgICAgICAgICAJMHg4MAorI2RlZmluZQkJQlJEREFUNiAgICAgICAgIAkweDQwCisjZGVmaW5lCQlCUkREQVQ1ICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUJSRERBVDQgICAgICAgICAJMHgxMAorI2RlZmluZQkJQlJEU1RCICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUkREQVQzICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUJSRENTICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlJEREFUMiAgICAgICAgIAkweDA0CisjZGVmaW5lCQlCUkRSVyAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUJSRFJXX1VMVFJBMiAgICAJMHgwMgorI2RlZmluZQkJQlJEQ1RMMSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlCUkRDVEwwICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUJSRFNUQl9VTFRSQTIgICAJMHgwMQorCisjZGVmaW5lCVNFRUNUTCAgICAgICAgICAJCTB4MWUKKyNkZWZpbmUJCUVYVEFSQkFDSyAgICAgICAJMHg4MAorI2RlZmluZQkJRVhUQVJCUkVRICAgICAgIAkweDQwCisjZGVmaW5lCQlTRUVNUyAgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNFRVJEWSAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU0VFQ1MgICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTRUVDSyAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFRURPICAgICAgICAgICAJMHgwMgorI2RlZmluZQkJU0VFREkgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0JMS0NUTCAgICAgICAgIAkJMHgxZgorI2RlZmluZQkJRElBR0xFREVOICAgICAgIAkweDgwCisjZGVmaW5lCQlESUFHTEVET04gICAgICAgCTB4NDAKKyNkZWZpbmUJCUFVVE9GTFVTSERJUyAgICAJMHgyMAorI2RlZmluZQkJRU5BQjQwICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTRUxCVVNCICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQUIyMCAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VMV0lERSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlYQ1ZSICAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNZX1RBUkdFVFMgICAgCQkweDIwCisjZGVmaW5lCVRBUkdfU0NTSVJBVEUgICAJCTB4MjAKKworI2RlZmluZQlVTFRSQV9FTkIgICAgICAgCQkweDMwCisjZGVmaW5lCUNNRFNJWkVfVEFCTEUgICAJCTB4MzAKKworI2RlZmluZQlESVNDX0RTQiAgICAgICAgCQkweDMyCisKKyNkZWZpbmUJQ01EU0laRV9UQUJMRV9UQUlMCQkweDM0CisKKyNkZWZpbmUJTVdJX1JFU0lEVUFMICAgIAkJMHgzOAorI2RlZmluZQlUQVJHX0lNTUVESUFURV9TQ0IJCTB4MzgKKworI2RlZmluZQlORVhUX1FVRVVFRF9TQ0IgCQkweDM5CisKKyNkZWZpbmUJTVNHX09VVCAgICAgICAgIAkJMHgzYQorCisjZGVmaW5lCURNQVBBUkFNUyAgICAgICAJCTB4M2IKKyNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAorI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNETUFFTiAgICAgICAgICAJMHgxMAorI2RlZmluZQkJU0RNQUVOQUNLICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE1BRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUhETUFFTkFDSyAgICAgICAJMHgwOAorI2RlZmluZQkJRElSRUNUSU9OICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRkxVU0ggICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9SRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUV9GTEFHUyAgICAgICAJCTB4M2MKKyNkZWZpbmUJCU5PVF9JREVOVElGSUVEICAJMHg4MAorI2RlZmluZQkJTk9fQ0RCX1NFTlQgICAgIAkweDQwCisjZGVmaW5lCQlUQVJHRVRfQ01EX0lTX1RBR0dFRAkweDQwCisjZGVmaW5lCQlEUEhBU0UgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVRBUkdfQ01EX1BFTkRJTkcJMHgxMAorI2RlZmluZQkJQ01EUEhBU0VfUEVORElORwkweDA4CisjZGVmaW5lCQlEUEhBU0VfUEVORElORyAgCTB4MDQKKyNkZWZpbmUJCVNQSEFTRV9QRU5ESU5HICAJMHgwMgorI2RlZmluZQkJTk9fRElTQ09OTkVDVCAgIAkweDAxCisKKyNkZWZpbmUJU0FWRURfU0NTSUlEICAgIAkJMHgzZAorCisjZGVmaW5lCVNBVkVEX0xVTiAgICAgICAJCTB4M2UKKworI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDNmCisjZGVmaW5lCQlQX01FU0dJTiAgICAgICAgCTB4ZTAKKyNkZWZpbmUJCVBIQVNFX01BU0sgICAgICAJMHhlMAorI2RlZmluZQkJUF9TVEFUVVMgICAgICAgIAkweGMwCisjZGVmaW5lCQlQX01FU0dPVVQgICAgICAgCTB4YTAKKyNkZWZpbmUJCVBfQ09NTUFORCAgICAgICAJMHg4MAorI2RlZmluZQkJUF9EQVRBSU4gICAgICAgIAkweDQwCisjZGVmaW5lCQlQX0JVU0ZSRUUgICAgICAgCTB4MDEKKyNkZWZpbmUJCVBfREFUQU9VVCAgICAgICAJMHgwMAorI2RlZmluZQkJQ0RJICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlJT0kgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1TR0kgICAgICAgICAgICAJMHgyMAorCisjZGVmaW5lCVdBSVRJTkdfU0NCSCAgICAJCTB4NDAKKworI2RlZmluZQlESVNDT05ORUNURURfU0NCSAkJMHg0MQorCisjZGVmaW5lCUZSRUVfU0NCSCAgICAgICAJCTB4NDIKKworI2RlZmluZQlDT01QTEVURV9TQ0JIICAgCQkweDQzCisKKyNkZWZpbmUJSFNDQl9BRERSICAgICAgIAkJMHg0NAorCisjZGVmaW5lCVNIQVJFRF9EQVRBX0FERFIJCTB4NDgKKworI2RlZmluZQlLRVJORUxfUUlOUE9TICAgCQkweDRjCisKKyNkZWZpbmUJUUlOUE9TICAgICAgICAgIAkJMHg0ZAorCisjZGVmaW5lCVFPVVRQT1MgICAgICAgICAJCTB4NGUKKworI2RlZmluZQlLRVJORUxfVFFJTlBPUyAgCQkweDRmCisKKyNkZWZpbmUJVFFJTlBPUyAgICAgICAgIAkJMHg1MAorCisjZGVmaW5lCUFSR18xICAgICAgICAgICAJCTB4NTEKKyNkZWZpbmUJUkVUVVJOXzEgICAgICAgIAkJMHg1MQorI2RlZmluZQkJU0VORF9NU0cgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRU5EX1NFTlNFICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTkRfUkVKICAgICAgICAJMHgyMAorI2RlZmluZQkJTVNHT1VUX1BIQVNFTUlTIAkweDEwCisjZGVmaW5lCQlFWElUX01TR19MT09QICAgCTB4MDgKKyNkZWZpbmUJCUNPTlRfTVNHX0xPT1AgICAJMHgwNAorI2RlZmluZQkJQ09OVF9UQVJHX1NFU1NJT04JMHgwMgorCisjZGVmaW5lCUFSR18yICAgICAgICAgICAJCTB4NTIKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHg1MgorCisjZGVmaW5lCUxBU1RfTVNHICAgICAgICAJCTB4NTMKKworI2RlZmluZQlTQ1NJU0VRX1RFTVBMQVRFCQkweDU0CisjZGVmaW5lCQlFTlNFTE8gICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU0VMSSAgICAgICAgICAJMHgyMAorI2RlZmluZQkJRU5SU0VMSSAgICAgICAgIAkweDEwCisjZGVmaW5lCQlFTkFVVE9BVE5PICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQVVUT0FUTkkgICAgICAJMHgwNAorI2RlZmluZQkJRU5BVVRPQVROUCAgICAgIAkweDAyCisKKyNkZWZpbmUJSEFfMjc0X0JJT1NHTE9CQUwJCTB4NTYKKyNkZWZpbmUJSU5JVElBVE9SX1RBRyAgIAkJMHg1NgorI2RlZmluZQkJSEFfMjc0X0VYVEVOREVEX1RSQU5TCTB4MDEKKworI2RlZmluZQlTRVFfRkxBR1MyICAgICAgCQkweDU3CisjZGVmaW5lCQlUQVJHRVRfTVNHX1BFTkRJTkcJMHgwMgorI2RlZmluZQkJU0NCX0RNQSAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0NTSUNPTkYgICAgICAgIAkJMHg1YQorI2RlZmluZQkJSFdTQ1NJSUQgICAgICAgIAkweDBmCisjZGVmaW5lCQlIU0NTSUlEICAgICAgICAgCTB4MDcKKyNkZWZpbmUJCVRFUk1fRU5CICAgICAgICAJMHg4MAorI2RlZmluZQkJUkVTRVRfU0NTSSAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNQQ0hLICAgICAgICAgCTB4MjAKKworI2RlZmluZQlJTlRERUYgICAgICAgICAgCQkweDVjCisjZGVmaW5lCQlWRUNUT1IgICAgICAgICAgCTB4MGYKKyNkZWZpbmUJCUVER0VfVFJJRyAgICAgICAJMHg4MAorCisjZGVmaW5lCUhPU1RDT05GICAgICAgICAJCTB4NWQKKworI2RlZmluZQlIQV8yNzRfQklPU0NUUkwgCQkweDVmCisjZGVmaW5lCQlCSU9TRElTQUJMRUQgICAgCTB4MzAKKyNkZWZpbmUJCUJJT1NNT0RFICAgICAgICAJMHgzMAorI2RlZmluZQkJQ0hBTk5FTF9CX1BSSU1BUlkJMHgwOAorCisjZGVmaW5lCVNFUUNUTCAgICAgICAgICAJCTB4NjAKKyNkZWZpbmUJCVBFUlJPUkRJUyAgICAgICAJMHg4MAorI2RlZmluZQkJUEFVU0VESVMgICAgICAgIAkweDQwCisjZGVmaW5lCQlGQUlMRElTICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUZBU1RNT0RFICAgICAgICAJMHgxMAorI2RlZmluZQkJQlJLQURSSU5URU4gICAgIAkweDA4CisjZGVmaW5lCQlTVEVQICAgICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVNFUVJFU0VUICAgICAgICAJMHgwMgorI2RlZmluZQkJTE9BRFJBTSAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0VRUkFNICAgICAgICAgIAkJMHg2MQorCisjZGVmaW5lCVNFUUFERFIwICAgICAgICAJCTB4NjIKKworI2RlZmluZQlTRVFBRERSMSAgICAgICAgCQkweDYzCisjZGVmaW5lCQlTRVFBRERSMV9NQVNLICAgCTB4MDEKKworI2RlZmluZQlBQ0NVTSAgICAgICAgICAgCQkweDY0CisKKyNkZWZpbmUJU0lOREVYICAgICAgICAgIAkJMHg2NQorCisjZGVmaW5lCURJTkRFWCAgICAgICAgICAJCTB4NjYKKworI2RlZmluZQlBTExPTkVTICAgICAgICAgCQkweDY5CisKKyNkZWZpbmUJQUxMWkVST1MgICAgICAgIAkJMHg2YQorCisjZGVmaW5lCU5PTkUgICAgICAgICAgICAJCTB4NmEKKworI2RlZmluZQlGTEFHUyAgICAgICAgICAgCQkweDZiCisjZGVmaW5lCQlaRVJPICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNBUlJZICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNJTkRJUiAgICAgICAgICAJCTB4NmMKKworI2RlZmluZQlESU5ESVIgICAgICAgICAgCQkweDZkCisKKyNkZWZpbmUJRlVOQ1RJT04xICAgICAgIAkJMHg2ZQorCisjZGVmaW5lCVNUQUNLICAgICAgICAgICAJCTB4NmYKKworI2RlZmluZQlUQVJHX09GRlNFVCAgICAgCQkweDcwCisKKyNkZWZpbmUJU1JBTV9CQVNFICAgICAgIAkJMHg3MAorCisjZGVmaW5lCUJDVEwgICAgICAgICAgICAJCTB4ODQKKyNkZWZpbmUJCUFDRSAgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJRU5BQkxFICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJRFNDT01NQU5EMCAgICAgIAkJMHg4NAorI2RlZmluZQkJQ0FDSEVUSEVOICAgICAgIAkweDgwCisjZGVmaW5lCQlEUEFSQ0tFTiAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1QQVJDS0VOICAgICAgICAJMHgyMAorI2RlZmluZQkJRVhUUkVRTENLICAgICAgIAkweDEwCisjZGVmaW5lCQlJTlRTQ0JSQU1TRUwgICAgCTB4MDgKKyNkZWZpbmUJCVJBTVBTICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJVVNDQlNJWkUzMiAgICAgIAkweDAyCisjZGVmaW5lCQlDSU9QQVJDS0VOICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNUSU1FICAgICAgICAgCQkweDg1CisjZGVmaW5lCQlCT0ZGICAgICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJCUJPTiAgICAgICAgICAgICAJMHgwZgorCisjZGVmaW5lCURTQ09NTUFORDEgICAgICAJCTB4ODUKKyNkZWZpbmUJCURTTEFUVCAgICAgICAgICAJMHhmYworI2RlZmluZQkJSEFERExEU0VMMSAgICAgIAkweDAyCisjZGVmaW5lCQlIQURETERTRUwwICAgICAgCTB4MDEKKworI2RlZmluZQlCVVNTUEQgICAgICAgICAgCQkweDg2CisjZGVmaW5lCQlERlRIUlNIICAgICAgICAgCTB4YzAKKyNkZWZpbmUJCURGVEhSU0hfNzUgICAgICAJMHg4MAorI2RlZmluZQkJU1RCT0ZGICAgICAgICAgIAkweDM4CisjZGVmaW5lCQlTVEJPTiAgICAgICAgICAgCTB4MDcKKworI2RlZmluZQlIU19NQUlMQk9YICAgICAgCQkweDg2CisjZGVmaW5lCQlIT1NUX01BSUxCT1ggICAgCTB4ZjAKKyNkZWZpbmUJCUhPU1RfVFFJTlBPUyAgICAJMHg4MAorI2RlZmluZQkJU0VRX01BSUxCT1ggICAgIAkweDBmCisKKyNkZWZpbmUJRFNQQ0lTVEFUVVMgICAgIAkJMHg4NgorI2RlZmluZQkJREZUSFJTSF8xMDAgICAgIAkweGMwCisKKyNkZWZpbmUJSENOVFJMICAgICAgICAgIAkJMHg4NworI2RlZmluZQkJUE9XUkROICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTV0lOVCAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUlSUU1TICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJUEFVU0UgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlJTlRFTiAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNISVBSU1QgICAgICAgICAJMHgwMQorI2RlZmluZQkJQ0hJUFJTVEFDSyAgICAgIAkweDAxCisKKyNkZWZpbmUJSEFERFIgICAgICAgICAgIAkJMHg4OAorCisjZGVmaW5lCUhDTlQgICAgICAgICAgICAJCTB4OGMKKworI2RlZmluZQlTQ0JQVFIgICAgICAgICAgCQkweDkwCisKKyNkZWZpbmUJSU5UU1RBVCAgICAgICAgIAkJMHg5MQorI2RlZmluZQkJU0VRSU5UX01BU0sgICAgIAkweGYxCisjZGVmaW5lCQlPVVRfT0ZfUkFOR0UgICAgCTB4ZTEKKyNkZWZpbmUJCU5PX0ZSRUVfU0NCICAgICAJMHhkMQorI2RlZmluZQkJU0NCX01JU01BVENIICAgIAkweGMxCisjZGVmaW5lCQlNSVNTRURfQlVTRlJFRSAgCTB4YjEKKyNkZWZpbmUJCU1LTVNHX0ZBSUxFRCAgICAJMHhhMQorI2RlZmluZQkJREFUQV9PVkVSUlVOICAgIAkweDkxCisjZGVmaW5lCQlQRVJSX0RFVEVDVEVEICAgCTB4ODEKKyNkZWZpbmUJCUJBRF9TVEFUVVMgICAgICAJMHg3MQorI2RlZmluZQkJSE9TVF9NU0dfTE9PUCAgIAkweDYxCisjZGVmaW5lCQlQREFUQV9SRUlOSVQgICAgCTB4NTEKKyNkZWZpbmUJCUlHTl9XSURFX1JFUyAgICAJMHg0MQorI2RlZmluZQkJTk9fTUFUQ0ggICAgICAgIAkweDMxCisjZGVmaW5lCQlQUk9UT19WSU9MQVRJT04gCTB4MjEKKyNkZWZpbmUJCVNFTkRfUkVKRUNUICAgICAJMHgxMQorI2RlZmluZQkJSU5UX1BFTkQgICAgICAgIAkweDBmCisjZGVmaW5lCQlCQURfUEhBU0UgICAgICAgCTB4MDEKKyNkZWZpbmUJCUJSS0FEUklOVCAgICAgICAJMHgwOAorI2RlZmluZQkJU0NTSUlOVCAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDTURDTVBMVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCVNFUUlOVCAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCUNMUklOVCAgICAgICAgICAJCTB4OTIKKyNkZWZpbmUJCUNMUlBBUkVSUiAgICAgICAJMHgxMAorI2RlZmluZQkJQ0xSQlJLQURSSU5UICAgIAkweDA4CisjZGVmaW5lCQlDTFJTQ1NJSU5UICAgICAgCTB4MDQKKyNkZWZpbmUJCUNMUkNNRElOVCAgICAgICAJMHgwMgorI2RlZmluZQkJQ0xSU0VRSU5UICAgICAgIAkweDAxCisKKyNkZWZpbmUJRVJST1IgICAgICAgICAgIAkJMHg5MgorI2RlZmluZQkJQ0lPUEFSRVJSICAgICAgIAkweDgwCisjZGVmaW5lCQlQQ0lFUlJTVEFUICAgICAgCTB4NDAKKyNkZWZpbmUJCU1QQVJFUlIgICAgICAgICAJMHgyMAorI2RlZmluZQkJRFBBUkVSUiAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTUVBBUkVSUiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUlMTE9QQ09ERSAgICAgICAJMHgwNAorI2RlZmluZQkJSUxMU0FERFIgICAgICAgIAkweDAyCisjZGVmaW5lCQlJTExIQUREUiAgICAgICAgCTB4MDEKKworI2RlZmluZQlERkNOVFJMICAgICAgICAgCQkweDkzCisKKyNkZWZpbmUJREZTVEFUVVMgICAgICAgIAkJMHg5NAorI2RlZmluZQkJUFJFTE9BRF9BVkFJTCAgIAkweDgwCisjZGVmaW5lCQlERkNBQ0hFVEggICAgICAgCTB4NDAKKyNkZWZpbmUJCUZJRk9RV0RFTVAgICAgICAJMHgyMAorI2RlZmluZQkJTVJFUVBFTkQgICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE9ORSAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCURGVEhSRVNIICAgICAgICAJMHgwNAorI2RlZmluZQkJRklGT0ZVTEwgICAgICAgIAkweDAyCisjZGVmaW5lCQlGSUZPRU1QICAgICAgICAgCTB4MDEKKworI2RlZmluZQlERldBRERSICAgICAgICAgCQkweDk1CisKKyNkZWZpbmUJREZSQUREUiAgICAgICAgIAkJMHg5NworCisjZGVmaW5lCURGREFUICAgICAgICAgICAJCTB4OTkKKworI2RlZmluZQlTQ0JDTlQgICAgICAgICAgCQkweDlhCisjZGVmaW5lCQlTQ0JDTlRfTUFTSyAgICAgCTB4MWYKKyNkZWZpbmUJCVNDQkFVVE8gICAgICAgICAJMHg4MAorCisjZGVmaW5lCVFJTkZJRk8gICAgICAgICAJCTB4OWIKKworI2RlZmluZQlRSU5DTlQgICAgICAgICAgCQkweDljCisKKyNkZWZpbmUJUU9VVEZJRk8gICAgICAgIAkJMHg5ZAorCisjZGVmaW5lCUNSQ0NPTlRST0wxICAgICAJCTB4OWQKKyNkZWZpbmUJCUNSQ09OU0VFTiAgICAgICAJMHg4MAorI2RlZmluZQkJQ1JDVkFMQ0hLRU4gICAgIAkweDQwCisjZGVmaW5lCQlDUkNFTkRDSEtFTiAgICAgCTB4MjAKKyNkZWZpbmUJCUNSQ1JFUUNIS0VOICAgICAJMHgxMAorI2RlZmluZQkJVEFSR0NSQ0VOREVOICAgIAkweDA4CisjZGVmaW5lCQlUQVJHQ1JDQ05URU4gICAgCTB4MDQKKworI2RlZmluZQlRT1VUQ05UICAgICAgICAgCQkweDllCisKKyNkZWZpbmUJU0NTSVBIQVNFICAgICAgIAkJMHg5ZQorI2RlZmluZQkJREFUQV9QSEFTRV9NQVNLIAkweDAzCisjZGVmaW5lCQlTVEFUVVNfUEhBU0UgICAgCTB4MjAKKyNkZWZpbmUJCUNPTU1BTkRfUEhBU0UgICAJMHgxMAorI2RlZmluZQkJTVNHX0lOX1BIQVNFICAgIAkweDA4CisjZGVmaW5lCQlNU0dfT1VUX1BIQVNFICAgCTB4MDQKKyNkZWZpbmUJCURBVEFfSU5fUEhBU0UgICAJMHgwMgorI2RlZmluZQkJREFUQV9PVVRfUEhBU0UgIAkweDAxCisKKyNkZWZpbmUJU0ZVTkNUICAgICAgICAgIAkJMHg5ZgorI2RlZmluZQkJQUxUX01PREUgICAgICAgIAkweDgwCisKKyNkZWZpbmUJU0NCX0JBU0UgICAgICAgIAkJMHhhMAorCisjZGVmaW5lCVNDQl9DREJfUFRSICAgICAJCTB4YTAKKyNkZWZpbmUJU0NCX1JFU0lEVUFMX0RBVEFDTlQJCTB4YTAKKyNkZWZpbmUJU0NCX0NEQl9TVE9SRSAgIAkJMHhhMAorCisjZGVmaW5lCVNDQl9SRVNJRFVBTF9TR1BUUgkJMHhhNAorCisjZGVmaW5lCVNDQl9TQ1NJX1NUQVRVUyAJCTB4YTgKKworI2RlZmluZQlTQ0JfVEFSR0VUX1BIQVNFUwkJMHhhOQorCisjZGVmaW5lCVNDQl9UQVJHRVRfREFUQV9ESVIJCTB4YWEKKworI2RlZmluZQlTQ0JfVEFSR0VUX0lUQUcgCQkweGFiCisKKyNkZWZpbmUJU0NCX0RBVEFQVFIgICAgIAkJMHhhYworCisjZGVmaW5lCVNDQl9EQVRBQ05UICAgICAJCTB4YjAKKyNkZWZpbmUJCVNHX0hJR0hfQUREUl9CSVRTCTB4N2YKKyNkZWZpbmUJCVNHX0xBU1RfU0VHICAgICAJMHg4MAorCisjZGVmaW5lCVNDQl9TR1BUUiAgICAgICAJCTB4YjQKKyNkZWZpbmUJCVNHX1JFU0lEX1ZBTElEICAJMHgwNAorI2RlZmluZQkJU0dfRlVMTF9SRVNJRCAgIAkweDAyCisjZGVmaW5lCQlTR19MSVNUX05VTEwgICAgCTB4MDEKKworI2RlZmluZQlTQ0JfQ09OVFJPTCAgICAgCQkweGI4CisjZGVmaW5lCQlTQ0JfVEFHX1RZUEUgICAgCTB4MDMKKyNkZWZpbmUJCVNUQVRVU19SQ1ZEICAgICAJMHg4MAorI2RlZmluZQkJVEFSR0VUX1NDQiAgICAgIAkweDgwCisjZGVmaW5lCQlESVNDRU5CICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVRBR19FTkIgICAgICAgICAJMHgyMAorI2RlZmluZQkJTUtfTUVTU0FHRSAgICAgIAkweDEwCisjZGVmaW5lCQlVTFRSQUVOQiAgICAgICAgCTB4MDgKKyNkZWZpbmUJCURJU0NPTk5FQ1RFRCAgICAJMHgwNAorCisjZGVmaW5lCVNDQl9TQ1NJSUQgICAgICAJCTB4YjkKKyNkZWZpbmUJCVRJRCAgICAgICAgICAgICAJMHhmMAorI2RlZmluZQkJVFdJTl9USUQgICAgICAgIAkweDcwCisjZGVmaW5lCQlPSUQgICAgICAgICAgICAgCTB4MGYKKyNkZWZpbmUJCVRXSU5fQ0hOTEIgICAgICAJMHg4MAorCisjZGVmaW5lCVNDQl9MVU4gICAgICAgICAJCTB4YmEKKyNkZWZpbmUJCUxJRCAgICAgICAgICAgICAJMHgzZgorI2RlZmluZQkJU0NCX1hGRVJMRU5fT0REIAkweDgwCisKKyNkZWZpbmUJU0NCX1RBRyAgICAgICAgIAkJMHhiYgorCisjZGVmaW5lCVNDQl9DREJfTEVOICAgICAJCTB4YmMKKworI2RlZmluZQlTQ0JfU0NTSVJBVEUgICAgCQkweGJkCisKKyNkZWZpbmUJU0NCX1NDU0lPRkZTRVQgIAkJMHhiZQorCisjZGVmaW5lCVNDQl9ORVhUICAgICAgICAJCTB4YmYKKworI2RlZmluZQlTQ0JfNjRfU1BBUkUgICAgCQkweGMwCisKKyNkZWZpbmUJU0VFQ1RMXzI4NDAgICAgIAkJMHhjMAorI2RlZmluZQkJQ1NfMjg0MCAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDS18yODQwICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURPXzI4NDAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNUQVRVU18yODQwICAgICAJCTB4YzEKKyNkZWZpbmUJCUJJT1NfU0VMICAgICAgICAJMHg2MAorI2RlZmluZQkJQURTRUwgICAgICAgICAgIAkweDFlCisjZGVmaW5lCQlFRVBST01fVEYgICAgICAgCTB4ODAKKyNkZWZpbmUJCURJXzI4NDAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDQl82NF9CVFQgICAgICAJCTB4ZDAKKworI2RlZmluZQlDQ0hBRERSICAgICAgICAgCQkweGUwCisKKyNkZWZpbmUJQ0NIQ05UICAgICAgICAgIAkJMHhlOAorCisjZGVmaW5lCUNDU0dSQU0gICAgICAgICAJCTB4ZTkKKworI2RlZmluZQlDQ1NHQUREUiAgICAgICAgCQkweGVhCisKKyNkZWZpbmUJQ0NTR0NUTCAgICAgICAgIAkJMHhlYgorI2RlZmluZQkJQ0NTR0RPTkUgICAgICAgIAkweDgwCisjZGVmaW5lCQlDQ1NHRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNHX0ZFVENIX05FRURFRCAJMHgwMgorI2RlZmluZQkJQ0NTR1JFU0VUICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NTQ0JSQU0gICAgICAgIAkJMHhlYworCisjZGVmaW5lCUNDU0NCQUREUiAgICAgICAJCTB4ZWQKKworI2RlZmluZQlDQ1NDQkNUTCAgICAgICAgCQkweGVlCisjZGVmaW5lCQlDQ1NDQkRPTkUgICAgICAgCTB4ODAKKyNkZWZpbmUJCUFSUkRPTkUgICAgICAgICAJMHg0MAorI2RlZmluZQkJQ0NBUlJFTiAgICAgICAgIAkweDEwCisjZGVmaW5lCQlDQ1NDQkVOICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUNDU0NCRElSICAgICAgICAJMHgwNAorI2RlZmluZQkJQ0NTQ0JSRVNFVCAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NTQ0JDTlQgICAgICAgIAkJMHhlZgorCisjZGVmaW5lCVNDQkJBRERSICAgICAgICAJCTB4ZjAKKworI2RlZmluZQlDQ1NDQlBUUiAgICAgICAgCQkweGYxCisKKyNkZWZpbmUJSE5TQ0JfUU9GRiAgICAgIAkJMHhmNAorCisjZGVmaW5lCVNOU0NCX1FPRkYgICAgICAJCTB4ZjYKKworI2RlZmluZQlTRFNDQl9RT0ZGICAgICAgCQkweGY4CisKKyNkZWZpbmUJUU9GRl9DVExTVEEgICAgIAkJMHhmYQorI2RlZmluZQkJU0NCX1FTSVpFICAgICAgIAkweDA3CisjZGVmaW5lCQlTQ0JfUVNJWkVfMjU2ICAgCTB4MDYKKyNkZWZpbmUJCVNDQl9BVkFJTCAgICAgICAJMHg0MAorI2RlZmluZQkJU05TQ0JfUk9MTE9WRVIgIAkweDIwCisjZGVmaW5lCQlTRFNDQl9ST0xMT1ZFUiAgCTB4MTAKKworI2RlZmluZQlERkZfVEhSU0ggICAgICAgCQkweGZiCisjZGVmaW5lCQlXUl9ERlRIUlNIICAgICAgCTB4NzAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUFYICAJMHg3MAorI2RlZmluZQkJV1JfREZUSFJTSF85MCAgIAkweDYwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzg1ICAgCTB4NTAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfNzUgICAJMHg0MAorI2RlZmluZQkJV1JfREZUSFJTSF82MyAgIAkweDMwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzUwICAgCTB4MjAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfMjUgICAJMHgxMAorI2RlZmluZQkJUkRfREZUSFJTSCAgICAgIAkweDA3CisjZGVmaW5lCQlSRF9ERlRIUlNIX01BWCAgCTB4MDcKKyNkZWZpbmUJCVJEX0RGVEhSU0hfOTAgICAJMHgwNgorI2RlZmluZQkJUkRfREZUSFJTSF84NSAgIAkweDA1CisjZGVmaW5lCQlSRF9ERlRIUlNIXzc1ICAgCTB4MDQKKyNkZWZpbmUJCVJEX0RGVEhSU0hfNjMgICAJMHgwMworI2RlZmluZQkJUkRfREZUSFJTSF81MCAgIAkweDAyCisjZGVmaW5lCQlSRF9ERlRIUlNIXzI1ICAgCTB4MDEKKyNkZWZpbmUJCVJEX0RGVEhSU0hfTUlOICAJMHgwMAorI2RlZmluZQkJV1JfREZUSFJTSF9NSU4gIAkweDAwCisKKyNkZWZpbmUJU0dfQ0FDSEVfU0hBRE9XIAkJMHhmYworI2RlZmluZQkJU0dfQUREUl9NQVNLICAgIAkweGY4CisjZGVmaW5lCQlMQVNUX1NFRyAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUxBU1RfU0VHX0RPTkUgICAJMHgwMQorCisjZGVmaW5lCVNHX0NBQ0hFX1BSRSAgICAJCTB4ZmMKKworCisjZGVmaW5lCU1BWF9PRkZTRVRfVUxUUkEyCTB4N2YKKyNkZWZpbmUJTUFYX09GRlNFVF8xNkJJVAkweDA4CisjZGVmaW5lCUJVU184X0JJVAkweDAwCisjZGVmaW5lCVRBUkdFVF9DTURfQ01QTFQJMHhmZQorI2RlZmluZQlTVEFUVVNfUVVFVUVfRlVMTAkweDI4CisjZGVmaW5lCVNUQVRVU19CVVNZCTB4MDgKKyNkZWZpbmUJTUFYX09GRlNFVF84QklUCTB4MGYKKyNkZWZpbmUJQlVTXzMyX0JJVAkweDAyCisjZGVmaW5lCUNDU0dBRERSX01BWAkweDgwCisjZGVmaW5lCVRJRF9TSElGVAkweDA0CisjZGVmaW5lCVNDQl9ET1dOTE9BRF9TSVpFXzY0CTB4MzAKKyNkZWZpbmUJSE9TVF9NQUlMQk9YX1NISUZUCTB4MDQKKyNkZWZpbmUJQ01EX0dST1VQX0NPREVfU0hJRlQJMHgwNQorI2RlZmluZQlDQ1NHUkFNX01BWFNFR1MJMHgxMAorI2RlZmluZQlTQ0JfTElTVF9OVUxMCTB4ZmYKKyNkZWZpbmUJU0dfU0laRU9GCTB4MDgKKyNkZWZpbmUJU0NCX0RPV05MT0FEX1NJWkUJMHgyMAorI2RlZmluZQlTRVFfTUFJTEJPWF9TSElGVAkweDAwCisjZGVmaW5lCVRBUkdFVF9EQVRBX0lOCTB4MDEKKyNkZWZpbmUJSE9TVF9NU0cJMHhmZgorI2RlZmluZQlNQVhfT0ZGU0VUCTB4N2YKKyNkZWZpbmUJQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lCVNDQl9VUExPQURfU0laRQkweDIwCisjZGVmaW5lCVNUQUNLX1NJWkUJMHgwNAorCisKKy8qIERvd25sb2FkZWQgQ29uc3RhbnQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJSU5WRVJURURfQ0FDSEVTSVpFX01BU0sJMHgwMworI2RlZmluZQlTR19QUkVGRVRDSF9BRERSX01BU0sJMHgwNgorI2RlZmluZQlTR19QUkVGRVRDSF9BTElHTl9NQVNLCTB4MDUKKyNkZWZpbmUJUU9VVEZJRk9fT0ZGU0VUCTB4MDAKKyNkZWZpbmUJU0dfUFJFRkVUQ0hfQ05UCTB4MDQKKyNkZWZpbmUJQ0FDSEVTSVpFX01BU0sJMHgwMgorI2RlZmluZQlRSU5GSUZPX09GRlNFVAkweDAxCisjZGVmaW5lCURPV05MT0FEX0NPTlNUX0NPVU5UCTB4MDcKKworCisvKiBFeHBvcnRlZCBMYWJlbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcmVnX3ByaW50LmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzcxMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9yZWdfcHJpbnQuY19zaGlwcGVkCkBAIC0wLDAgKzEsMTY4MSBAQAorLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1NiAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQKKyAqLworCisjaW5jbHVkZSAiYWljN3h4eF9vc20uaCIKKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0VRX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0NTSVJTVE8iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkVOQVVUT0FUTlAiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQVVUT0FUTkkiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkVOQVVUT0FUTk8iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkVOUlNFTEkiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0VMSSIsCQkweDIwLCAweDIwIH0sCisJeyAiRU5TRUxPIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJURU1PREUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zY3Npc2VxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJU0VRX3BhcnNlX3RhYmxlLCA4LCAiU0NTSVNFUSIsCisJICAgIDB4MDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJDSE4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDQU1FTiIsCQkweDA0LCAweDA0IH0sCisJeyAiU1BJT0VOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJDTFJTVENOVCIsCQkweDEwLCAweDEwIH0sCisJeyAiRkFTVDIwIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJERlBFWFAiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkRGT04iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zeGZyY3RsMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1hGUkNUTDBfcGFyc2VfdGFibGUsIDcsICJTWEZSQ1RMMCIsCisJICAgIDB4MDEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTVFBXRU4iLAkJMHgwMSwgMHgwMSB9LAorCXsgIkFDVE5FR0VOIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTlNUSU1FUiIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5TUENISyIsCQkweDIwLCAweDIwIH0sCisJeyAiU1dSQVBFTiIsCQkweDQwLCAweDQwIH0sCisJeyAiQklUQlVDS0VUIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJTVElNRVNFTCIsCQkweDE4LCAweDE4IH0KK307CisKK2ludAorYWhjX3N4ZnJjdGwxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTWEZSQ1RMMV9wYXJzZV90YWJsZSwgNywgIlNYRlJDVEwxIiwKKwkgICAgMHgwMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0lHT19wYXJzZV90YWJsZVtdID0geworCXsgIkFDS08iLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJFUU8iLAkJMHgwMiwgMHgwMiB9LAorCXsgIkJTWU8iLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNFTE8iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkFUTk8iLAkJMHgxMCwgMHgxMCB9LAorCXsgIk1TR08iLAkJMHgyMCwgMHgyMCB9LAorCXsgIklPTyIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0RPIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHgwMCB9LAorCXsgIlBfREFUQUlOIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJQX0NPTU1BTkQiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlBfTUVTR09VVCIsCQkweGEwLCAweGEwIH0sCisJeyAiUF9TVEFUVVMiLAkJMHhjMCwgMHhjMCB9LAorCXsgIlBIQVNFX01BU0siLAkJMHhlMCwgMHhlMCB9LAorCXsgIlBfTUVTR0lOIiwJCTB4ZTAsIDB4ZTAgfQorfTsKKworaW50CithaGNfc2NzaXNpZ29fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lTSUdPX3BhcnNlX3RhYmxlLCAxNSwgIlNDU0lTSUdPIiwKKwkgICAgMHgwMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJU0lHSV9wYXJzZV90YWJsZVtdID0geworCXsgIkFDS0kiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlJFUUkiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkJTWUkiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNFTEkiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkFUTkkiLAkJMHgxMCwgMHgxMCB9LAorCXsgIk1TR0kiLAkJMHgyMCwgMHgyMCB9LAorCXsgIklPSSIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0RJIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX0RBVEFPVVQiLAkJMHgwMCwgMHgwMCB9LAorCXsgIlBfREFUQU9VVF9EVCIsCTB4MjAsIDB4MjAgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweDQwIH0sCisJeyAiUF9EQVRBSU5fRFQiLAkweDYwLCAweDYwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhhMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4YzAgfSwKKwl7ICJQSEFTRV9NQVNLIiwJCTB4ZTAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhjX3Njc2lzaWdpX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJU0lHSV9wYXJzZV90YWJsZSwgMTcsICJTQ1NJU0lHSSIsCisJICAgIDB4MDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NTSVJBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTSU5HTEVfRURHRSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJFTkFCTEVfQ1JDIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJXSURFWEZFUiIsCQkweDgwLCAweDgwIH0sCisJeyAiU1hGUl9VTFRSQTIiLAkweDBmLCAweDBmIH0sCisJeyAiU09GUyIsCQkweDBmLCAweDBmIH0sCisJeyAiU1hGUiIsCQkweDcwLCAweDcwIH0KK307CisKK2ludAorYWhjX3Njc2lyYXRlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJUkFURV9wYXJzZV90YWJsZSwgNiwgIlNDU0lSQVRFIiwKKwkgICAgMHgwNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJUV0lOX0NITkxCIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJPSUQiLAkJMHgwZiwgMHgwZiB9LAorCXsgIlRXSU5fVElEIiwJCTB4NzAsIDB4NzAgfSwKKwl7ICJTT0ZTX1VMVFJBMiIsCTB4N2YsIDB4N2YgfSwKKwl7ICJUSUQiLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zY3NpaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lJRF9wYXJzZV90YWJsZSwgNSwgIlNDU0lJRCIsCisJICAgIDB4MDUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3Njc2lkYXRsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NTSURBVEwiLAorCSAgICAweDA2LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY3NpZGF0aF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lEQVRIIiwKKwkgICAgMHgwNywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc3RjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTVENOVCIsCisJICAgIDB4MDgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgT1BUSU9OTU9ERV9wYXJzZV90YWJsZVtdID0geworCXsgIkRJU19NU0dJTl9EVUFMRURHRSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJBVVRPX01TR09VVF9ERSIsCTB4MDIsIDB4MDIgfSwKKwl7ICJTQ1NJREFUTF9JTUdFTiIsCTB4MDQsIDB4MDQgfSwKKwl7ICJFWFBQSEFTRURJUyIsCTB4MDgsIDB4MDggfSwKKwl7ICJCVVNGUkVFUkVWIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJBVE5NR01OVEVOIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJBVVRPQUNLRU4iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkFVVE9SQVRFRU4iLAkJMHg4MCwgMHg4MCB9LAorCXsgIk9QVElPTk1PREVfREVGQVVMVFMiLDB4MDMsIDB4MDMgfQorfTsKKworaW50CithaGNfb3B0aW9ubW9kZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoT1BUSU9OTU9ERV9wYXJzZV90YWJsZSwgOSwgIk9QVElPTk1PREUiLAorCSAgICAweDA4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY190YXJnY3JjY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVEFSR0NSQ0NOVCIsCisJICAgIDB4MGEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQ0xSU0lOVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDTFJTV1JBUCIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0xSSU9FUlIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkNMUlNFTERJIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJDTFJTRUxETyIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhjX2NscnNpbnQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDTFJTSU5UMF9wYXJzZV90YWJsZSwgNiwgIkNMUlNJTlQwIiwKKwkgICAgMHgwYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTU1RBVDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJETUFET05FIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJTUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTRE9ORSIsCQkweDA0LCAweDA0IH0sCisJeyAiU1dSQVAiLAkJMHgwOCwgMHgwOCB9LAorCXsgIklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJTRUxJTkdPIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRUxESSIsCQkweDIwLCAweDIwIH0sCisJeyAiU0VMRE8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVCIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX3NzdGF0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1NUQVQwX3BhcnNlX3RhYmxlLCA5LCAiU1NUQVQwIiwKKwkgICAgMHgwYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBDTFJTSU5UMV9wYXJzZV90YWJsZVtdID0geworCXsgIkNMUlJFUUlOSVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUlBIQVNFQ0hHIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNMUlNDU0lQRVJSIiwJMHgwNCwgMHgwNCB9LAorCXsgIkNMUkJVU0ZSRUUiLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlNDU0lSU1RJIiwJMHgyMCwgMHgyMCB9LAorCXsgIkNMUkFUTk8iLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNMUlNFTFRJTUVPIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19jbHJzaW50MV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoQ0xSU0lOVDFfcGFyc2VfdGFibGUsIDcsICJDTFJTSU5UMSIsCisJICAgIDB4MGMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkVRSU5JVCIsCQkweDAxLCAweDAxIH0sCisJeyAiUEhBU0VDSEciLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNDU0lQRVJSIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJQSEFTRU1JUyIsCQkweDEwLCAweDEwIH0sCisJeyAiU0NTSVJTVEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkFUTlRBUkciLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNFTFRPIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc3N0YXQxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTU1RBVDFfcGFyc2VfdGFibGUsIDgsICJTU1RBVDEiLAorCSAgICAweDBjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNTVEFUMl9wYXJzZV90YWJsZVtdID0geworCXsgIkRVQUxfRURHRV9FUlIiLAkweDAxLCAweDAxIH0sCisJeyAiQ1JDUkVRRVJSIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJDUkNFTkRFUlIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNSQ1ZBTEVSUiIsCQkweDA4LCAweDA4IH0sCisJeyAiRVhQX0FDVElWRSIsCQkweDEwLCAweDEwIH0sCisJeyAiU0hWQUxJRCIsCQkweDQwLCAweDQwIH0sCisJeyAiT1ZFUlJVTiIsCQkweDgwLCAweDgwIH0sCisJeyAiU0ZDTlQiLAkJMHgxZiwgMHgxZiB9Cit9OworCitpbnQKK2FoY19zc3RhdDJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNTVEFUMl9wYXJzZV90YWJsZSwgOCwgIlNTVEFUMiIsCisJICAgIDB4MGQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1NUQVQzX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiT0ZGQ05UIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJVMk9GRkNOVCIsCQkweDdmLCAweDdmIH0sCisJeyAiU0NTSUNOVCIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhjX3NzdGF0M19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1NUQVQzX3BhcnNlX3RhYmxlLCAzLCAiU1NUQVQzIiwKKwkgICAgMHgwZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTQ1NJSURfVUxUUkEyX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiT0lEIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJUSUQiLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zY3NpaWRfdWx0cmEyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ1NJSURfVUxUUkEyX3BhcnNlX3RhYmxlLCAyLCAiU0NTSUlEX1VMVFJBMiIsCisJICAgIDB4MGYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMF9wYXJzZV90YWJsZVtdID0geworCXsgIkVORE1BRE9ORSIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5TUElPUkRZIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTlNET05FIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTlNXUkFQIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTklPRVJSIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlNFTElOR08iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkVOU0VMREkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOU0VMRE8iLAkJMHg0MCwgMHg0MCB9Cit9OworCitpbnQKK2FoY19zaW1vZGUwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTSU1PREUwX3BhcnNlX3RhYmxlLCA4LCAiU0lNT0RFMCIsCisJICAgIDB4MTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0lNT0RFMV9wYXJzZV90YWJsZVtdID0geworCXsgIkVOUkVRSU5JVCIsCQkweDAxLCAweDAxIH0sCisJeyAiRU5QSEFTRUNIRyIsCQkweDAyLCAweDAyIH0sCisJeyAiRU5TQ1NJUEVSUiIsCQkweDA0LCAweDA0IH0sCisJeyAiRU5CVVNGUkVFIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlBIQVNFTUlTIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNDU0lSU1QiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOQVROVEFSRyIsCQkweDQwLCAweDQwIH0sCisJeyAiRU5TRUxUSU1PIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc2ltb2RlMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0lNT0RFMV9wYXJzZV90YWJsZSwgOCwgIlNJTU9ERTEiLAorCSAgICAweDExLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY3NpYnVzbF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDU0lCVVNMIiwKKwkgICAgMHgxMiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NzaWJ1c2hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ1NJQlVTSCIsCisJICAgIDB4MTMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1hGUkNUTDJfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTURETUFFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiQVVUT1JTVERJUyIsCQkweDEwLCAweDEwIH0sCisJeyAiQVNZTkNfU0VUVVAiLAkweDA3LCAweDA3IH0KK307CisKK2ludAorYWhjX3N4ZnJjdGwyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTWEZSQ1RMMl9wYXJzZV90YWJsZSwgMywgIlNYRlJDVEwyIiwKKwkgICAgMHgxMywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0hBRERSIiwKKwkgICAgMHgxNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRUxUSU1FUl9wYXJzZV90YWJsZVtdID0geworCXsgIlNUQUdFMSIsCQkweDAxLCAweDAxIH0sCisJeyAiU1RBR0UyIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJTVEFHRTMiLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNUQUdFNCIsCQkweDA4LCAweDA4IH0sCisJeyAiU1RBR0U1IiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTVEFHRTYiLAkJMHgyMCwgMHgyMCB9Cit9OworCitpbnQKK2FoY19zZWx0aW1lcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VMVElNRVJfcGFyc2VfdGFibGUsIDYsICJTRUxUSU1FUiIsCisJICAgIDB4MTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VMSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJPTkVCSVQiLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNFTElEX01BU0siLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zZWxpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VMSURfcGFyc2VfdGFibGUsIDIsICJTRUxJRCIsCisJICAgIDB4MTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NBTUNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkRGTFRUSUQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIkFMVFNUSU0iLAkJMHgyMCwgMHgyMCB9LAorCXsgIkNMUlNDQU1TRUxJRCIsCTB4NDAsIDB4NDAgfSwKKwl7ICJFTlNDQU1TRUxPIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJTQ0FNTFZMIiwJCTB4MDMsIDB4MDMgfQorfTsKKworaW50CithaGNfc2NhbWN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0NBTUNUTF9wYXJzZV90YWJsZSwgNSwgIlNDQU1DVEwiLAorCSAgICAweDFhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY190YXJnaWRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHSUQiLAorCSAgICAweDFiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNQSU9DQVBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTU1BJT0NQUyIsCQkweDAxLCAweDAxIH0sCisJeyAiUk9NIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFRVBST00iLAkJMHgwNCwgMHgwNCB9LAorCXsgIlNFRVBST00iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkVYVF9CUkRDVEwiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNPRlRDTURFTiIsCQkweDIwLCAweDIwIH0sCisJeyAiU09GVDAiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlNPRlQxIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc3Bpb2NhcF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU1BJT0NBUF9wYXJzZV90YWJsZSwgOCwgIlNQSU9DQVAiLAorCSAgICAweDFiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IEJSRENUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkJSRENUTDAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkJSRFNUQl9VTFRSQTIiLAkweDAxLCAweDAxIH0sCisJeyAiQlJEQ1RMMSIsCQkweDAyLCAweDAyIH0sCisJeyAiQlJEUldfVUxUUkEyIiwJMHgwMiwgMHgwMiB9LAorCXsgIkJSRFJXIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCUkREQVQyIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJCUkRDUyIsCQkweDA4LCAweDA4IH0sCisJeyAiQlJEREFUMyIsCQkweDA4LCAweDA4IH0sCisJeyAiQlJEU1RCIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJCUkREQVQ0IiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJCUkREQVQ1IiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJCUkREQVQ2IiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJCUkREQVQ3IiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfYnJkY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihCUkRDVExfcGFyc2VfdGFibGUsIDEzLCAiQlJEQ1RMIiwKKwkgICAgMHgxZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRUVDVExfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTRUVESSIsCQkweDAxLCAweDAxIH0sCisJeyAiU0VFRE8iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNFRUNLIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTRUVDUyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0VFUkRZIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRUVNUyIsCQkweDIwLCAweDIwIH0sCisJeyAiRVhUQVJCUkVRIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJFWFRBUkJBQ0siLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zZWVjdGxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNFRUNUTF9wYXJzZV90YWJsZSwgOCwgIlNFRUNUTCIsCisJICAgIDB4MWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0JMS0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIlhDVlIiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlNFTFdJREUiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkVOQUIyMCIsCQkweDA0LCAweDA0IH0sCisJeyAiU0VMQlVTQiIsCQkweDA4LCAweDA4IH0sCisJeyAiRU5BQjQwIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJBVVRPRkxVU0hESVMiLAkweDIwLCAweDIwIH0sCisJeyAiRElBR0xFRE9OIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJESUFHTEVERU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zYmxrY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQkxLQ1RMX3BhcnNlX3RhYmxlLCA4LCAiU0JMS0NUTCIsCisJICAgIDB4MWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2J1c3lfdGFyZ2V0c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkJVU1lfVEFSR0VUUyIsCisJICAgIDB4MjAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3VsdHJhX2VuYl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlVMVFJBX0VOQiIsCisJICAgIDB4MzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Rpc2NfZHNiX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRElTQ19EU0IiLAorCSAgICAweDMyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jbWRzaXplX3RhYmxlX3RhaWxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDTURTSVpFX1RBQkxFX1RBSUwiLAorCSAgICAweDM0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19td2lfcmVzaWR1YWxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJNV0lfUkVTSURVQUwiLAorCSAgICAweDM4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19uZXh0X3F1ZXVlZF9zY2JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJORVhUX1FVRVVFRF9TQ0IiLAorCSAgICAweDM5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19tc2dfb3V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTVNHX09VVCIsCisJICAgIDB4M2EsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgRE1BUEFSQU1TX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRklGT1JFU0VUIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJGSUZPRkxVU0giLAkJMHgwMiwgMHgwMiB9LAorCXsgIkRJUkVDVElPTiIsCQkweDA0LCAweDA0IH0sCisJeyAiSERNQUVOIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJIRE1BRU5BQ0siLAkJMHgwOCwgMHgwOCB9LAorCXsgIlNETUFFTiIsCQkweDEwLCAweDEwIH0sCisJeyAiU0RNQUVOQUNLIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTQ1NJRU4iLAkJMHgyMCwgMHgyMCB9LAorCXsgIldJREVPREQiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlBSRUxPQURFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2RtYXBhcmFtc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoRE1BUEFSQU1TX3BhcnNlX3RhYmxlLCAxMCwgIkRNQVBBUkFNUyIsCisJICAgIDB4M2IsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTk9fRElTQ09OTkVDVCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJTUEhBU0VfUEVORElORyIsCTB4MDIsIDB4MDIgfSwKKwl7ICJEUEhBU0VfUEVORElORyIsCTB4MDQsIDB4MDQgfSwKKwl7ICJDTURQSEFTRV9QRU5ESU5HIiwJMHgwOCwgMHgwOCB9LAorCXsgIlRBUkdfQ01EX1BFTkRJTkciLAkweDEwLCAweDEwIH0sCisJeyAiRFBIQVNFIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJOT19DREJfU0VOVCIsCTB4NDAsIDB4NDAgfSwKKwl7ICJUQVJHRVRfQ01EX0lTX1RBR0dFRCIsMHg0MCwgMHg0MCB9LAorCXsgIk5PVF9JREVOVElGSUVEIiwJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zZXFfZmxhZ3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNFUV9GTEFHU19wYXJzZV90YWJsZSwgOSwgIlNFUV9GTEFHUyIsCisJICAgIDB4M2MsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NhdmVkX3Njc2lpZF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX1NDU0lJRCIsCisJICAgIDB4M2QsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NhdmVkX2x1bl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNBVkVEX0xVTiIsCisJICAgIDB4M2UsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgTEFTVFBIQVNFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTVNHSSIsCQkweDIwLCAweDIwIH0sCisJeyAiSU9JIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDREkiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlBfREFUQU9VVCIsCQkweDAwLCAweDAwIH0sCisJeyAiUF9CVVNGUkVFIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJQX0RBVEFJTiIsCQkweDQwLCAweDQwIH0sCisJeyAiUF9DT01NQU5EIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJQX01FU0dPVVQiLAkJMHhhMCwgMHhhMCB9LAorCXsgIlBfU1RBVFVTIiwJCTB4YzAsIDB4YzAgfSwKKwl7ICJQSEFTRV9NQVNLIiwJCTB4ZTAsIDB4ZTAgfSwKKwl7ICJQX01FU0dJTiIsCQkweGUwLCAweGUwIH0KK307CisKK2ludAorYWhjX2xhc3RwaGFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTEFTVFBIQVNFX3BhcnNlX3RhYmxlLCAxMSwgIkxBU1RQSEFTRSIsCisJICAgIDB4M2YsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3dhaXRpbmdfc2NiaF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIldBSVRJTkdfU0NCSCIsCisJICAgIDB4NDAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Rpc2Nvbm5lY3RlZF9zY2JoX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiRElTQ09OTkVDVEVEX1NDQkgiLAorCSAgICAweDQxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19mcmVlX3NjYmhfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGUkVFX1NDQkgiLAorCSAgICAweDQyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jb21wbGV0ZV9zY2JoX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ09NUExFVEVfU0NCSCIsCisJICAgIDB4NDMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2hzY2JfYWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhTQ0JfQUREUiIsCisJICAgIDB4NDQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NoYXJlZF9kYXRhX2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSEFSRURfREFUQV9BRERSIiwKKwkgICAgMHg0OCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfa2VybmVsX3FpbnBvc19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIktFUk5FTF9RSU5QT1MiLAorCSAgICAweDRjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19xaW5wb3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRSU5QT1MiLAorCSAgICAweDRkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19xb3V0cG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUU9VVFBPUyIsCisJICAgIDB4NGUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2tlcm5lbF90cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiS0VSTkVMX1RRSU5QT1MiLAorCSAgICAweDRmLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY190cWlucG9zX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiVFFJTlBPUyIsCisJICAgIDB4NTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQVJHXzFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDT05UX1RBUkdfU0VTU0lPTiIsCTB4MDIsIDB4MDIgfSwKKwl7ICJDT05UX01TR19MT09QIiwJMHgwNCwgMHgwNCB9LAorCXsgIkVYSVRfTVNHX0xPT1AiLAkweDA4LCAweDA4IH0sCisJeyAiTVNHT1VUX1BIQVNFTUlTIiwJMHgxMCwgMHgxMCB9LAorCXsgIlNFTkRfUkVKIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJTRU5EX1NFTlNFIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJTRU5EX01TRyIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2FyZ18xX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihBUkdfMV9wYXJzZV90YWJsZSwgNywgIkFSR18xIiwKKwkgICAgMHg1MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfYXJnXzJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBUkdfMiIsCisJICAgIDB4NTIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2xhc3RfbXNnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiTEFTVF9NU0ciLAorCSAgICAweDUzLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJFTkFVVE9BVE5QIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJFTkFVVE9BVE5JIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJFTkFVVE9BVE5PIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJFTlJTRUxJIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJFTlNFTEkiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkVOU0VMTyIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhjX3Njc2lzZXFfdGVtcGxhdGVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lTRVFfVEVNUExBVEVfcGFyc2VfdGFibGUsIDYsICJTQ1NJU0VRX1RFTVBMQVRFIiwKKwkgICAgMHg1NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBIQV8yNzRfQklPU0dMT0JBTF9wYXJzZV90YWJsZVtdID0geworCXsgIkhBXzI3NF9FWFRFTkRFRF9UUkFOUyIsMHgwMSwgMHgwMSB9Cit9OworCitpbnQKK2FoY19oYV8yNzRfYmlvc2dsb2JhbF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoSEFfMjc0X0JJT1NHTE9CQUxfcGFyc2VfdGFibGUsIDEsICJIQV8yNzRfQklPU0dMT0JBTCIsCisJICAgIDB4NTYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VRX0ZMQUdTMl9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQl9ETUEiLAkJMHgwMSwgMHgwMSB9LAorCXsgIlRBUkdFVF9NU0dfUEVORElORyIsCTB4MDIsIDB4MDIgfQorfTsKKworaW50CithaGNfc2VxX2ZsYWdzMl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VRX0ZMQUdTMl9wYXJzZV90YWJsZSwgMiwgIlNFUV9GTEFHUzIiLAorCSAgICAweDU3LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lDT05GX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiRU5TUENISyIsCQkweDIwLCAweDIwIH0sCisJeyAiUkVTRVRfU0NTSSIsCQkweDQwLCAweDQwIH0sCisJeyAiVEVSTV9FTkIiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkhTQ1NJSUQiLAkJMHgwNywgMHgwNyB9LAorCXsgIkhXU0NTSUlEIiwJCTB4MGYsIDB4MGYgfQorfTsKKworaW50CithaGNfc2NzaWNvbmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lDT05GX3BhcnNlX3RhYmxlLCA1LCAiU0NTSUNPTkYiLAorCSAgICAweDVhLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IElOVERFRl9wYXJzZV90YWJsZVtdID0geworCXsgIkVER0VfVFJJRyIsCQkweDgwLCAweDgwIH0sCisJeyAiVkVDVE9SIiwJCTB4MGYsIDB4MGYgfQorfTsKKworaW50CithaGNfaW50ZGVmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihJTlRERUZfcGFyc2VfdGFibGUsIDIsICJJTlRERUYiLAorCSAgICAweDVjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19ob3N0Y29uZl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhPU1RDT05GIiwKKwkgICAgMHg1ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBIQV8yNzRfQklPU0NUUkxfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDSEFOTkVMX0JfUFJJTUFSWSIsCTB4MDgsIDB4MDggfSwKKwl7ICJCSU9TTU9ERSIsCQkweDMwLCAweDMwIH0sCisJeyAiQklPU0RJU0FCTEVEIiwJMHgzMCwgMHgzMCB9Cit9OworCitpbnQKK2FoY19oYV8yNzRfYmlvc2N0cmxfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEhBXzI3NF9CSU9TQ1RSTF9wYXJzZV90YWJsZSwgMywgIkhBXzI3NF9CSU9TQ1RSTCIsCisJICAgIDB4NWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0VRQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTE9BRFJBTSIsCQkweDAxLCAweDAxIH0sCisJeyAiU0VRUkVTRVQiLAkJMHgwMiwgMHgwMiB9LAorCXsgIlNURVAiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkJSS0FEUklOVEVOIiwJMHgwOCwgMHgwOCB9LAorCXsgIkZBU1RNT0RFIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJGQUlMRElTIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJQQVVTRURJUyIsCQkweDQwLCAweDQwIH0sCisJeyAiUEVSUk9SRElTIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfc2VxY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTRVFDVExfcGFyc2VfdGFibGUsIDgsICJTRVFDVEwiLAorCSAgICAweDYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zZXFyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRVFSQU0iLAorCSAgICAweDYxLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zZXFhZGRyMF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNFUUFERFIwIiwKKwkgICAgMHg2MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRVFBRERSMV9wYXJzZV90YWJsZVtdID0geworCXsgIlNFUUFERFIxX01BU0siLAkweDAxLCAweDAxIH0KK307CisKK2ludAorYWhjX3NlcWFkZHIxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTRVFBRERSMV9wYXJzZV90YWJsZSwgMSwgIlNFUUFERFIxIiwKKwkgICAgMHg2MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfYWNjdW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBQ0NVTSIsCisJICAgIDB4NjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NpbmRleF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNJTkRFWCIsCisJICAgIDB4NjUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2RpbmRleF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRJTkRFWCIsCisJICAgIDB4NjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2FsbG9uZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExPTkVTIiwKKwkgICAgMHg2OSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfYWxsemVyb3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJBTExaRVJPUyIsCisJICAgIDB4NmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX25vbmVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJOT05FIiwKKwkgICAgMHg2YSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBGTEFHU19wYXJzZV90YWJsZVtdID0geworCXsgIkNBUlJZIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJaRVJPIiwJCTB4MDIsIDB4MDIgfQorfTsKKworaW50CithaGNfZmxhZ3NfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEZMQUdTX3BhcnNlX3RhYmxlLCAyLCAiRkxBR1MiLAorCSAgICAweDZiLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTSU5ESVIiLAorCSAgICAweDZjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19kaW5kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJESU5ESVIiLAorCSAgICAweDZkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19mdW5jdGlvbjFfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJGVU5DVElPTjEiLAorCSAgICAweDZlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zdGFja19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNUQUNLIiwKKwkgICAgMHg2ZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfdGFyZ19vZmZzZXRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJUQVJHX09GRlNFVCIsCisJICAgIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NyYW1fYmFzZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNSQU1fQkFTRSIsCisJICAgIDB4NzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQkNUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkVOQUJMRSIsCQkweDAxLCAweDAxIH0sCisJeyAiQUNFIiwJCTB4MDgsIDB4MDggfQorfTsKKworaW50CithaGNfYmN0bF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoQkNUTF9wYXJzZV90YWJsZSwgMiwgIkJDVEwiLAorCSAgICAweDg0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IERTQ09NTUFORDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDSU9QQVJDS0VOIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJVU0NCU0laRTMyIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJSQU1QUyIsCQkweDA0LCAweDA0IH0sCisJeyAiSU5UU0NCUkFNU0VMIiwJMHgwOCwgMHgwOCB9LAorCXsgIkVYVFJFUUxDSyIsCQkweDEwLCAweDEwIH0sCisJeyAiTVBBUkNLRU4iLAkJMHgyMCwgMHgyMCB9LAorCXsgIkRQQVJDS0VOIiwJCTB4NDAsIDB4NDAgfSwKKwl7ICJDQUNIRVRIRU4iLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19kc2NvbW1hbmQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihEU0NPTU1BTkQwX3BhcnNlX3RhYmxlLCA4LCAiRFNDT01NQU5EMCIsCisJICAgIDB4ODQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQlVTVElNRV9wYXJzZV90YWJsZVtdID0geworCXsgIkJPTiIsCQkweDBmLCAweDBmIH0sCisJeyAiQk9GRiIsCQkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhjX2J1c3RpbWVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEJVU1RJTUVfcGFyc2VfdGFibGUsIDIsICJCVVNUSU1FIiwKKwkgICAgMHg4NSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBEU0NPTU1BTkQxX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiSEFERExEU0VMMCIsCQkweDAxLCAweDAxIH0sCisJeyAiSEFERExEU0VMMSIsCQkweDAyLCAweDAyIH0sCisJeyAiRFNMQVRUIiwJCTB4ZmMsIDB4ZmMgfQorfTsKKworaW50CithaGNfZHNjb21tYW5kMV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoRFNDT01NQU5EMV9wYXJzZV90YWJsZSwgMywgIkRTQ09NTUFORDEiLAorCSAgICAweDg1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IEJVU1NQRF9wYXJzZV90YWJsZVtdID0geworCXsgIlNUQk9OIiwJCTB4MDcsIDB4MDcgfSwKKwl7ICJTVEJPRkYiLAkJMHgzOCwgMHgzOCB9LAorCXsgIkRGVEhSU0hfNzUiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkRGVEhSU0giLAkJMHhjMCwgMHhjMCB9LAorCXsgIkRGVEhSU0hfMTAwIiwJMHhjMCwgMHhjMCB9Cit9OworCitpbnQKK2FoY19idXNzcGRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEJVU1NQRF9wYXJzZV90YWJsZSwgNSwgIkJVU1NQRCIsCisJICAgIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgSFNfTUFJTEJPWF9wYXJzZV90YWJsZVtdID0geworCXsgIlNFUV9NQUlMQk9YIiwJMHgwZiwgMHgwZiB9LAorCXsgIkhPU1RfVFFJTlBPUyIsCTB4ODAsIDB4ODAgfSwKKwl7ICJIT1NUX01BSUxCT1giLAkweGYwLCAweGYwIH0KK307CisKK2ludAorYWhjX2hzX21haWxib3hfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEhTX01BSUxCT1hfcGFyc2VfdGFibGUsIDMsICJIU19NQUlMQk9YIiwKKwkgICAgMHg4NiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBEU1BDSVNUQVRVU19wYXJzZV90YWJsZVtdID0geworCXsgIkRGVEhSU0hfMTAwIiwJMHhjMCwgMHhjMCB9Cit9OworCitpbnQKK2FoY19kc3BjaXN0YXR1c19wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoRFNQQ0lTVEFUVVNfcGFyc2VfdGFibGUsIDEsICJEU1BDSVNUQVRVUyIsCisJICAgIDB4ODYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgSENOVFJMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0hJUFJTVCIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0hJUFJTVEFDSyIsCQkweDAxLCAweDAxIH0sCisJeyAiSU5URU4iLAkJMHgwMiwgMHgwMiB9LAorCXsgIlBBVVNFIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJJUlFNUyIsCQkweDA4LCAweDA4IH0sCisJeyAiU1dJTlQiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlBPV1JETiIsCQkweDQwLCAweDQwIH0KK307CisKK2ludAorYWhjX2hjbnRybF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoSENOVFJMX3BhcnNlX3RhYmxlLCA3LCAiSENOVFJMIiwKKwkgICAgMHg4NywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfaGFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQUREUiIsCisJICAgIDB4ODgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2hjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJIQ05UIiwKKwkgICAgMHg4YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NicHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCUFRSIiwKKwkgICAgMHg5MCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBJTlRTVEFUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiU0VRSU5UIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJDTURDTVBMVCIsCQkweDAyLCAweDAyIH0sCisJeyAiU0NTSUlOVCIsCQkweDA0LCAweDA0IH0sCisJeyAiQlJLQURSSU5UIiwJCTB4MDgsIDB4MDggfSwKKwl7ICJCQURfUEhBU0UiLAkJMHgwMSwgMHgwMSB9LAorCXsgIklOVF9QRU5EIiwJCTB4MGYsIDB4MGYgfSwKKwl7ICJTRU5EX1JFSkVDVCIsCTB4MTEsIDB4MTEgfSwKKwl7ICJQUk9UT19WSU9MQVRJT04iLAkweDIxLCAweDIxIH0sCisJeyAiTk9fTUFUQ0giLAkJMHgzMSwgMHgzMSB9LAorCXsgIklHTl9XSURFX1JFUyIsCTB4NDEsIDB4NDEgfSwKKwl7ICJQREFUQV9SRUlOSVQiLAkweDUxLCAweDUxIH0sCisJeyAiSE9TVF9NU0dfTE9PUCIsCTB4NjEsIDB4NjEgfSwKKwl7ICJCQURfU1RBVFVTIiwJCTB4NzEsIDB4NzEgfSwKKwl7ICJQRVJSX0RFVEVDVEVEIiwJMHg4MSwgMHg4MSB9LAorCXsgIkRBVEFfT1ZFUlJVTiIsCTB4OTEsIDB4OTEgfSwKKwl7ICJNS01TR19GQUlMRUQiLAkweGExLCAweGExIH0sCisJeyAiTUlTU0VEX0JVU0ZSRUUiLAkweGIxLCAweGIxIH0sCisJeyAiU0NCX01JU01BVENIIiwJMHhjMSwgMHhjMSB9LAorCXsgIk5PX0ZSRUVfU0NCIiwJMHhkMSwgMHhkMSB9LAorCXsgIk9VVF9PRl9SQU5HRSIsCTB4ZTEsIDB4ZTEgfSwKKwl7ICJTRVFJTlRfTUFTSyIsCTB4ZjEsIDB4ZjEgfQorfTsKKworaW50CithaGNfaW50c3RhdF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoSU5UU1RBVF9wYXJzZV90YWJsZSwgMjEsICJJTlRTVEFUIiwKKwkgICAgMHg5MSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBDTFJJTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJDTFJTRVFJTlQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNMUkNNRElOVCIsCQkweDAyLCAweDAyIH0sCisJeyAiQ0xSU0NTSUlOVCIsCQkweDA0LCAweDA0IH0sCisJeyAiQ0xSQlJLQURSSU5UIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNMUlBBUkVSUiIsCQkweDEwLCAweDEwIH0KK307CisKK2ludAorYWhjX2NscmludF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoQ0xSSU5UX3BhcnNlX3RhYmxlLCA1LCAiQ0xSSU5UIiwKKwkgICAgMHg5MiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBFUlJPUl9wYXJzZV90YWJsZVtdID0geworCXsgIklMTEhBRERSIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJJTExTQUREUiIsCQkweDAyLCAweDAyIH0sCisJeyAiSUxMT1BDT0RFIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJTUVBBUkVSUiIsCQkweDA4LCAweDA4IH0sCisJeyAiRFBBUkVSUiIsCQkweDEwLCAweDEwIH0sCisJeyAiTVBBUkVSUiIsCQkweDIwLCAweDIwIH0sCisJeyAiUENJRVJSU1RBVCIsCQkweDQwLCAweDQwIH0sCisJeyAiQ0lPUEFSRVJSIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfZXJyb3JfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKEVSUk9SX3BhcnNlX3RhYmxlLCA4LCAiRVJST1IiLAorCSAgICAweDkyLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IERGQ05UUkxfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJGSUZPUkVTRVQiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkZJRk9GTFVTSCIsCQkweDAyLCAweDAyIH0sCisJeyAiRElSRUNUSU9OIiwJCTB4MDQsIDB4MDQgfSwKKwl7ICJIRE1BRU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkhETUFFTkFDSyIsCQkweDA4LCAweDA4IH0sCisJeyAiU0RNQUVOIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJTRE1BRU5BQ0siLAkJMHgxMCwgMHgxMCB9LAorCXsgIlNDU0lFTiIsCQkweDIwLCAweDIwIH0sCisJeyAiV0lERU9ERCIsCQkweDQwLCAweDQwIH0sCisJeyAiUFJFTE9BREVOIiwJCTB4ODAsIDB4ODAgfQorfTsKKworaW50CithaGNfZGZjbnRybF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoREZDTlRSTF9wYXJzZV90YWJsZSwgMTAsICJERkNOVFJMIiwKKwkgICAgMHg5MywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBERlNUQVRVU19wYXJzZV90YWJsZVtdID0geworCXsgIkZJRk9FTVAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkZJRk9GVUxMIiwJCTB4MDIsIDB4MDIgfSwKKwl7ICJERlRIUkVTSCIsCQkweDA0LCAweDA0IH0sCisJeyAiSERPTkUiLAkJMHgwOCwgMHgwOCB9LAorCXsgIk1SRVFQRU5EIiwJCTB4MTAsIDB4MTAgfSwKKwl7ICJGSUZPUVdERU1QIiwJCTB4MjAsIDB4MjAgfSwKKwl7ICJERkNBQ0hFVEgiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlBSRUxPQURfQVZBSUwiLAkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2Rmc3RhdHVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihERlNUQVRVU19wYXJzZV90YWJsZSwgOCwgIkRGU1RBVFVTIiwKKwkgICAgMHg5NCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfZGZ3YWRkcl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkRGV0FERFIiLAorCSAgICAweDk1LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19kZnJhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZSQUREUiIsCisJICAgIDB4OTcsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2RmZGF0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiREZEQVQiLAorCSAgICAweDk5LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDQkNOVF9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQkFVVE8iLAkJMHg4MCwgMHg4MCB9LAorCXsgIlNDQkNOVF9NQVNLIiwJMHgxZiwgMHgxZiB9Cit9OworCitpbnQKK2FoY19zY2JjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQkNOVF9wYXJzZV90YWJsZSwgMiwgIlNDQkNOVCIsCisJICAgIDB4OWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3FpbmZpZm9fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRSU5GSUZPIiwKKwkgICAgMHg5YiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfcWluY250X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiUUlOQ05UIiwKKwkgICAgMHg5YywgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfcW91dGZpZm9fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJRT1VURklGTyIsCisJICAgIDB4OWQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQ1JDQ09OVFJPTDFfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJUQVJHQ1JDQ05URU4iLAkweDA0LCAweDA0IH0sCisJeyAiVEFSR0NSQ0VOREVOIiwJMHgwOCwgMHgwOCB9LAorCXsgIkNSQ1JFUUNIS0VOIiwJMHgxMCwgMHgxMCB9LAorCXsgIkNSQ0VORENIS0VOIiwJMHgyMCwgMHgyMCB9LAorCXsgIkNSQ1ZBTENIS0VOIiwJMHg0MCwgMHg0MCB9LAorCXsgIkNSQ09OU0VFTiIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2NyY2NvbnRyb2wxX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDUkNDT05UUk9MMV9wYXJzZV90YWJsZSwgNiwgIkNSQ0NPTlRST0wxIiwKKwkgICAgMHg5ZCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfcW91dGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlFPVVRDTlQiLAorCSAgICAweDllLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDU0lQSEFTRV9wYXJzZV90YWJsZVtdID0geworCXsgIkRBVEFfT1VUX1BIQVNFIiwJMHgwMSwgMHgwMSB9LAorCXsgIkRBVEFfSU5fUEhBU0UiLAkweDAyLCAweDAyIH0sCisJeyAiTVNHX09VVF9QSEFTRSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJNU0dfSU5fUEhBU0UiLAkweDA4LCAweDA4IH0sCisJeyAiQ09NTUFORF9QSEFTRSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJTVEFUVVNfUEhBU0UiLAkweDIwLCAweDIwIH0sCisJeyAiREFUQV9QSEFTRV9NQVNLIiwJMHgwMywgMHgwMyB9Cit9OworCitpbnQKK2FoY19zY3NpcGhhc2VfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDU0lQSEFTRV9wYXJzZV90YWJsZSwgNywgIlNDU0lQSEFTRSIsCisJICAgIDB4OWUsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0ZVTkNUX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQUxUX01PREUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19zZnVuY3RfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNGVU5DVF9wYXJzZV90YWJsZSwgMSwgIlNGVU5DVCIsCisJICAgIDB4OWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl9iYXNlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX0JBU0UiLAorCSAgICAweGEwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY2JfY2RiX3B0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9DREJfUFRSIiwKKwkgICAgMHhhMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3Jlc2lkdWFsX3NncHRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1JFU0lEVUFMX1NHUFRSIiwKKwkgICAgMHhhNCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3Njc2lfc3RhdHVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NDU0lfU1RBVFVTIiwKKwkgICAgMHhhOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3RhcmdldF9waGFzZXNfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX1BIQVNFUyIsCisJICAgIDB4YTksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl90YXJnZXRfZGF0YV9kaXJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFSR0VUX0RBVEFfRElSIiwKKwkgICAgMHhhYSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX3RhcmdldF9pdGFnX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1RBUkdFVF9JVEFHIiwKKwkgICAgMHhhYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX2RhdGFwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfREFUQVBUUiIsCisJICAgIDB4YWMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0RBVEFDTlRfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJTR19MQVNUX1NFRyIsCTB4ODAsIDB4ODAgfSwKKwl7ICJTR19ISUdIX0FERFJfQklUUyIsCTB4N2YsIDB4N2YgfQorfTsKKworaW50CithaGNfc2NiX2RhdGFjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQl9EQVRBQ05UX3BhcnNlX3RhYmxlLCAyLCAiU0NCX0RBVEFDTlQiLAorCSAgICAweGIwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9TR1BUUl9wYXJzZV90YWJsZVtdID0geworCXsgIlNHX0xJU1RfTlVMTCIsCTB4MDEsIDB4MDEgfSwKKwl7ICJTR19GVUxMX1JFU0lEIiwJMHgwMiwgMHgwMiB9LAorCXsgIlNHX1JFU0lEX1ZBTElEIiwJMHgwNCwgMHgwNCB9Cit9OworCitpbnQKK2FoY19zY2Jfc2dwdHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQl9TR1BUUl9wYXJzZV90YWJsZSwgMywgIlNDQl9TR1BUUiIsCisJICAgIDB4YjQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0NPTlRST0xfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJESVNDT05ORUNURUQiLAkweDA0LCAweDA0IH0sCisJeyAiVUxUUkFFTkIiLAkJMHgwOCwgMHgwOCB9LAorCXsgIk1LX01FU1NBR0UiLAkJMHgxMCwgMHgxMCB9LAorCXsgIlRBR19FTkIiLAkJMHgyMCwgMHgyMCB9LAorCXsgIkRJU0NFTkIiLAkJMHg0MCwgMHg0MCB9LAorCXsgIlRBUkdFVF9TQ0IiLAkJMHg4MCwgMHg4MCB9LAorCXsgIlNUQVRVU19SQ1ZEIiwJMHg4MCwgMHg4MCB9LAorCXsgIlNDQl9UQUdfVFlQRSIsCTB4MDMsIDB4MDMgfQorfTsKKworaW50CithaGNfc2NiX2NvbnRyb2xfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNDQl9DT05UUk9MX3BhcnNlX3RhYmxlLCA4LCAiU0NCX0NPTlRST0wiLAorCSAgICAweGI4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IFNDQl9TQ1NJSURfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJUV0lOX0NITkxCIiwJCTB4ODAsIDB4ODAgfSwKKwl7ICJPSUQiLAkJMHgwZiwgMHgwZiB9LAorCXsgIlRXSU5fVElEIiwJCTB4NzAsIDB4NzAgfSwKKwl7ICJUSUQiLAkJMHhmMCwgMHhmMCB9Cit9OworCitpbnQKK2FoY19zY2Jfc2NzaWlkX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ0JfU0NTSUlEX3BhcnNlX3RhYmxlLCA0LCAiU0NCX1NDU0lJRCIsCisJICAgIDB4YjksIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0NCX0xVTl9wYXJzZV90YWJsZVtdID0geworCXsgIlNDQl9YRkVSTEVOX09ERCIsCTB4ODAsIDB4ODAgfSwKKwl7ICJMSUQiLAkJMHgzZiwgMHgzZiB9Cit9OworCitpbnQKK2FoY19zY2JfbHVuX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTQ0JfTFVOX3BhcnNlX3RhYmxlLCAyLCAiU0NCX0xVTiIsCisJICAgIDB4YmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl90YWdfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfVEFHIiwKKwkgICAgMHhiYiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiX2NkYl9sZW5fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTQ0JfQ0RCX0xFTiIsCisJICAgIDB4YmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl9zY3NpcmF0ZV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9TQ1NJUkFURSIsCisJICAgIDB4YmQsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYl9zY3Npb2Zmc2V0X3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCX1NDU0lPRkZTRVQiLAorCSAgICAweGJlLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zY2JfbmV4dF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl9ORVhUIiwKKwkgICAgMHhiZiwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiXzY0X3NwYXJlX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCXzY0X1NQQVJFIiwKKwkgICAgMHhjMCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBTRUVDVExfMjg0MF9wYXJzZV90YWJsZVtdID0geworCXsgIkRPXzI4NDAiLAkJMHgwMSwgMHgwMSB9LAorCXsgIkNLXzI4NDAiLAkJMHgwMiwgMHgwMiB9LAorCXsgIkNTXzI4NDAiLAkJMHgwNCwgMHgwNCB9Cit9OworCitpbnQKK2FoY19zZWVjdGxfMjg0MF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoU0VFQ1RMXzI4NDBfcGFyc2VfdGFibGUsIDMsICJTRUVDVExfMjg0MCIsCisJICAgIDB4YzAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU1RBVFVTXzI4NDBfcGFyc2VfdGFibGVbXSA9IHsKKwl7ICJESV8yODQwIiwJCTB4MDEsIDB4MDEgfSwKKwl7ICJFRVBST01fVEYiLAkJMHg4MCwgMHg4MCB9LAorCXsgIkFEU0VMIiwJCTB4MWUsIDB4MWUgfSwKKwl7ICJCSU9TX1NFTCIsCQkweDYwLCAweDYwIH0KK307CisKK2ludAorYWhjX3N0YXR1c18yODQwX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihTVEFUVVNfMjg0MF9wYXJzZV90YWJsZSwgNCwgIlNUQVRVU18yODQwIiwKKwkgICAgMHhjMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfc2NiXzY0X2J0dF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIlNDQl82NF9CVFQiLAorCSAgICAweGQwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jY2hhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NIQUREUiIsCisJICAgIDB4ZTAsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2NjaGNudF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDSENOVCIsCisJICAgIDB4ZTgsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Njc2dyYW1fcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHUkFNIiwKKwkgICAgMHhlOSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfY2NzZ2FkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NHQUREUiIsCisJICAgIDB4ZWEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgQ0NTR0NUTF9wYXJzZV90YWJsZVtdID0geworCXsgIkNDU0dSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiU0dfRkVUQ0hfTkVFREVEIiwJMHgwMiwgMHgwMiB9LAorCXsgIkNDU0dFTiIsCQkweDA4LCAweDA4IH0sCisJeyAiQ0NTR0RPTkUiLAkJMHg4MCwgMHg4MCB9Cit9OworCitpbnQKK2FoY19jY3NnY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDQ1NHQ1RMX3BhcnNlX3RhYmxlLCA0LCAiQ0NTR0NUTCIsCisJICAgIDB4ZWIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX2Njc2NicmFtX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiQ0NTQ0JSQU0iLAorCSAgICAweGVjLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jY3NjYmFkZHJfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkFERFIiLAorCSAgICAweGVkLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitzdGF0aWMgYWhjX3JlZ19wYXJzZV9lbnRyeV90IENDU0NCQ1RMX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiQ0NTQ0JSRVNFVCIsCQkweDAxLCAweDAxIH0sCisJeyAiQ0NTQ0JESVIiLAkJMHgwNCwgMHgwNCB9LAorCXsgIkNDU0NCRU4iLAkJMHgwOCwgMHgwOCB9LAorCXsgIkNDQVJSRU4iLAkJMHgxMCwgMHgxMCB9LAorCXsgIkFSUkRPTkUiLAkJMHg0MCwgMHg0MCB9LAorCXsgIkNDU0NCRE9ORSIsCQkweDgwLCAweDgwIH0KK307CisKK2ludAorYWhjX2Njc2NiY3RsX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihDQ1NDQkNUTF9wYXJzZV90YWJsZSwgNiwgIkNDU0NCQ1RMIiwKKwkgICAgMHhlZSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfY2NzY2JjbnRfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJDQ1NDQkNOVCIsCisJICAgIDB4ZWYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3NjYmJhZGRyX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU0NCQkFERFIiLAorCSAgICAweGYwLCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19jY3NjYnB0cl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkNDU0NCUFRSIiwKKwkgICAgMHhmMSwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworaW50CithaGNfaG5zY2JfcW9mZl9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgIkhOU0NCX1FPRkYiLAorCSAgICAweGY0LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpOworfQorCitpbnQKK2FoY19zbnNjYl9xb2ZmX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcCkKK3sKKwlyZXR1cm4gKGFoY19wcmludF9yZWdpc3RlcihOVUxMLCAwLCAiU05TQ0JfUU9GRiIsCisJICAgIDB4ZjYsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK2ludAorYWhjX3Nkc2NiX3FvZmZfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKE5VTEwsIDAsICJTRFNDQl9RT0ZGIiwKKwkgICAgMHhmOCwgcmVndmFsdWUsIGN1cl9jb2wsIHdyYXApKTsKK30KKworc3RhdGljIGFoY19yZWdfcGFyc2VfZW50cnlfdCBRT0ZGX0NUTFNUQV9wYXJzZV90YWJsZVtdID0geworCXsgIlNEU0NCX1JPTExPVkVSIiwJMHgxMCwgMHgxMCB9LAorCXsgIlNOU0NCX1JPTExPVkVSIiwJMHgyMCwgMHgyMCB9LAorCXsgIlNDQl9BVkFJTCIsCQkweDQwLCAweDQwIH0sCisJeyAiU0NCX1FTSVpFXzI1NiIsCTB4MDYsIDB4MDYgfSwKKwl7ICJTQ0JfUVNJWkUiLAkJMHgwNywgMHgwNyB9Cit9OworCitpbnQKK2FoY19xb2ZmX2N0bHN0YV9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoUU9GRl9DVExTVEFfcGFyc2VfdGFibGUsIDUsICJRT0ZGX0NUTFNUQSIsCisJICAgIDB4ZmEsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgREZGX1RIUlNIX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiUkRfREZUSFJTSF9NSU4iLAkweDAwLCAweDAwIH0sCisJeyAiV1JfREZUSFJTSF9NSU4iLAkweDAwLCAweDAwIH0sCisJeyAiUkRfREZUSFJTSF8yNSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJSRF9ERlRIUlNIXzUwIiwJMHgwMiwgMHgwMiB9LAorCXsgIlJEX0RGVEhSU0hfNjMiLAkweDAzLCAweDAzIH0sCisJeyAiUkRfREZUSFJTSF83NSIsCTB4MDQsIDB4MDQgfSwKKwl7ICJSRF9ERlRIUlNIXzg1IiwJMHgwNSwgMHgwNSB9LAorCXsgIlJEX0RGVEhSU0hfOTAiLAkweDA2LCAweDA2IH0sCisJeyAiUkRfREZUSFJTSCIsCQkweDA3LCAweDA3IH0sCisJeyAiUkRfREZUSFJTSF9NQVgiLAkweDA3LCAweDA3IH0sCisJeyAiV1JfREZUSFJTSF8yNSIsCTB4MTAsIDB4MTAgfSwKKwl7ICJXUl9ERlRIUlNIXzUwIiwJMHgyMCwgMHgyMCB9LAorCXsgIldSX0RGVEhSU0hfNjMiLAkweDMwLCAweDMwIH0sCisJeyAiV1JfREZUSFJTSF83NSIsCTB4NDAsIDB4NDAgfSwKKwl7ICJXUl9ERlRIUlNIXzg1IiwJMHg1MCwgMHg1MCB9LAorCXsgIldSX0RGVEhSU0hfOTAiLAkweDYwLCAweDYwIH0sCisJeyAiV1JfREZUSFJTSCIsCQkweDcwLCAweDcwIH0sCisJeyAiV1JfREZUSFJTSF9NQVgiLAkweDcwLCAweDcwIH0KK307CisKK2ludAorYWhjX2RmZl90aHJzaF9wcmludCh1X2ludCByZWd2YWx1ZSwgdV9pbnQgKmN1cl9jb2wsIHVfaW50IHdyYXApCit7CisJcmV0dXJuIChhaGNfcHJpbnRfcmVnaXN0ZXIoREZGX1RIUlNIX3BhcnNlX3RhYmxlLCAxOCwgIkRGRl9USFJTSCIsCisJICAgIDB4ZmIsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0dfQ0FDSEVfU0hBRE9XX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTEFTVF9TRUdfRE9ORSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJMQVNUX1NFRyIsCQkweDAyLCAweDAyIH0sCisJeyAiU0dfQUREUl9NQVNLIiwJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoY19zZ19jYWNoZV9zaGFkb3dfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNHX0NBQ0hFX1NIQURPV19wYXJzZV90YWJsZSwgMywgIlNHX0NBQ0hFX1NIQURPVyIsCisJICAgIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKK3N0YXRpYyBhaGNfcmVnX3BhcnNlX2VudHJ5X3QgU0dfQ0FDSEVfUFJFX3BhcnNlX3RhYmxlW10gPSB7CisJeyAiTEFTVF9TRUdfRE9ORSIsCTB4MDEsIDB4MDEgfSwKKwl7ICJMQVNUX1NFRyIsCQkweDAyLCAweDAyIH0sCisJeyAiU0dfQUREUl9NQVNLIiwJMHhmOCwgMHhmOCB9Cit9OworCitpbnQKK2FoY19zZ19jYWNoZV9wcmVfcHJpbnQodV9pbnQgcmVndmFsdWUsIHVfaW50ICpjdXJfY29sLCB1X2ludCB3cmFwKQoreworCXJldHVybiAoYWhjX3ByaW50X3JlZ2lzdGVyKFNHX0NBQ0hFX1BSRV9wYXJzZV90YWJsZSwgMywgIlNHX0NBQ0hFX1BSRSIsCisJICAgIDB4ZmMsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfc2VxLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQxMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9zZXEuaF9zaGlwcGVkCkBAIC0wLDAgKzEsMTMwNyBAQAorLyoKKyAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2UgZmlsZXM6CisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWM3eHh4LnNlcSM1NiAkCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpYzd4eHgucmVnIzM5ICQKKyAqLworc3RhdGljIHVpbnQ4X3Qgc2VxcHJvZ1tdID0geworCTB4YjIsIDB4MDAsIDB4MDAsIDB4MDgsCisJMHhmNywgMHgxMSwgMHgyMiwgMHgwOCwKKwkweDAwLCAweDY1LCAweGVjLCAweDU5LAorCTB4ZjcsIDB4MDEsIDB4MDIsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKKwkweDQwLCAweDAwLCAweDQwLCAweDY4LAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHg0MCwgMHgwMCwgMHg0MCwgMHg2OCwKKwkweGZmLCAweDQwLCAweDNjLCAweDYwLAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHg2MCwgMHgwYiwgMHg0MiwgMHg2OCwKKwkweDQwLCAweGZhLCAweDEyLCAweDc4LAorCTB4MDEsIDB4NGQsIDB4YzgsIDB4MzAsCisJMHgwMCwgMHg0YywgMHgxMiwgMHg3MCwKKwkweDAxLCAweDM5LCAweGEyLCAweDMwLAorCTB4MDAsIDB4NmEsIDB4YzAsIDB4NWUsCisJMHgwMSwgMHg1MSwgMHgyMCwgMHgzMSwKKwkweDAxLCAweDU3LCAweGFlLCAweDAwLAorCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHg1MSwgMHgxMiwgMHg1ZSwKKwkweDAxLCAweDUxLCAweGM4LCAweDMwLAorCTB4MDAsIDB4MzksIDB4YzgsIDB4NjAsCisJMHgwMCwgMHhiYiwgMHgzMCwgMHg3MCwKKwkweGMxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDEsIDB4YmYsIDB4NzIsIDB4MzAsCisJMHgwMSwgMHg0MCwgMHg3ZSwgMHgzMSwKKwkweDAxLCAweDkwLCAweDgwLCAweDMwLAorCTB4MDEsIDB4ZjYsIDB4ZDQsIDB4MzAsCisJMHgwMSwgMHg0ZCwgMHg5YSwgMHgxOCwKKwkweGZlLCAweDU3LCAweGFlLCAweDA4LAorCTB4MDEsIDB4NDAsIDB4MjAsIDB4MzEsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg1OCwKKwkweDYwLCAweDBiLCAweDQwLCAweDc4LAorCTB4MDgsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHgwOCwgMHgxMSwgMHgyMiwgMHgwMCwKKwkweDYwLCAweDBiLCAweDAwLCAweDc4LAorCTB4NDAsIDB4MGIsIDB4ZmEsIDB4NjgsCisJMHg4MCwgMHgwYiwgMHhiNiwgMHg3OCwKKwkweDIwLCAweDZhLCAweDE2LCAweDAwLAorCTB4YTQsIDB4NmEsIDB4MDYsIDB4MDAsCisJMHgwOCwgMHg2YSwgMHg3OCwgMHgwMCwKKwkweDAxLCAweDUwLCAweGM4LCAweDMwLAorCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0OCwgMHg2YSwgMHhmYywgMHg1ZCwKKwkweDAxLCAweDZhLCAweGRjLCAweDAxLAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0OCwgMHg2YSwgMHhmYywgMHg1ZCwKKwkweDAxLCAweDZhLCAweDI2LCAweDAxLAorCTB4ZjAsIDB4MTksIDB4N2EsIDB4MDgsCisJMHgwZiwgMHgxOCwgMHhjOCwgMHgwOCwKKwkweDBmLCAweDBmLCAweGM4LCAweDA4LAorCTB4MGYsIDB4MDUsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHgzZCwgMHg3YSwgMHgwMCwKKwkweDA4LCAweDFmLCAweDZlLCAweDc4LAorCTB4ODAsIDB4M2QsIDB4N2EsIDB4MDAsCisJMHgwMSwgMHgzZCwgMHhkOCwgMHgzMSwKKwkweDAxLCAweDNkLCAweDMyLCAweDMxLAorCTB4MTAsIDB4MDMsIDB4NGUsIDB4NzksCisJMHgwMCwgMHg2NSwgMHhmMiwgMHg1OCwKKwkweDgwLCAweDY2LCAweGFlLCAweDc4LAorCTB4MDEsIDB4NjYsIDB4ZDgsIDB4MzEsCisJMHgwMSwgMHg2NiwgMHgzMiwgMHgzMSwKKwkweDNmLCAweDY2LCAweDdjLCAweDA4LAorCTB4NDAsIDB4NjYsIDB4ODIsIDB4NjgsCisJMHgwMSwgMHgzYywgMHg3OCwgMHgwMCwKKwkweDEwLCAweDAzLCAweDllLCAweDc4LAorCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCisJMHhlMCwgMHg2NiwgMHhjOCwgMHgxOCwKKwkweDAwLCAweDY1LCAweGFhLCAweDUwLAorCTB4ZGQsIDB4NjYsIDB4YzgsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg0OCwKKwkweDAxLCAweDY2LCAweGQ4LCAweDMxLAorCTB4MDEsIDB4NjYsIDB4MzIsIDB4MzEsCisJMHgxMCwgMHgwMywgMHg0ZSwgMHg3OSwKKwkweDAwLCAweDY1LCAweGYyLCAweDU4LAorCTB4MDEsIDB4NjYsIDB4ZDgsIDB4MzEsCisJMHgwMSwgMHg2NiwgMHgzMiwgMHgzMSwKKwkweDAxLCAweDY2LCAweGFjLCAweDMwLAorCTB4NDAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHhkOCwgMHgwMSwKKwkweGZmLCAweDZhLCAweDMyLCAweDAxLAorCTB4MTAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwMiwgMHg1NywgMHg0MCwgMHg2OSwKKwkweDEwLCAweDAzLCAweDNlLCAweDY5LAorCTB4MDAsIDB4NjUsIDB4MjAsIDB4NDEsCisJMHgwMiwgMHg1NywgMHhhZSwgMHgwMCwKKwkweDAwLCAweDY1LCAweDllLCAweDQwLAorCTB4NjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwOCwgMHg1MSwgMHgyMCwgMHg3MSwKKwkweDAyLCAweDBiLCAweGIyLCAweDc4LAorCTB4MDAsIDB4NjUsIDB4YWUsIDB4NDAsCisJMHgxYSwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweGYwLCAweDE5LCAweDdhLCAweDA4LAorCTB4MGYsIDB4MGYsIDB4YzgsIDB4MDgsCisJMHgwZiwgMHgwNSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDNkLCAweDdhLCAweDAwLAorCTB4MDgsIDB4MWYsIDB4YzQsIDB4NzgsCisJMHg4MCwgMHgzZCwgMHg3YSwgMHgwMCwKKwkweDIwLCAweDZhLCAweDE2LCAweDAwLAorCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCisJMHgwMCwgMHg2NSwgMHhiMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDEyLCAweDQwLAorCTB4MjAsIDB4MTEsIDB4ZDIsIDB4NjgsCisJMHgyMCwgMHg2YSwgMHgxOCwgMHgwMCwKKwkweDIwLCAweDExLCAweDIyLCAweDAwLAorCTB4ZjcsIDB4MWYsIDB4Y2EsIDB4MDgsCisJMHg4MCwgMHhiOSwgMHhkOCwgMHg3OCwKKwkweDA4LCAweDY1LCAweGNhLCAweDAwLAorCTB4MDEsIDB4NjUsIDB4M2UsIDB4MzAsCisJMHgwMSwgMHhiOSwgMHgxZSwgMHgzMCwKKwkweDdmLCAweGI5LCAweDBhLCAweDA4LAorCTB4MDEsIDB4YjksIDB4MGEsIDB4MzAsCisJMHgwMSwgMHg1NCwgMHhjYSwgMHgzMCwKKwkweDgwLCAweGI4LCAweGU2LCAweDc4LAorCTB4ODAsIDB4NjUsIDB4Y2EsIDB4MDAsCisJMHgwMSwgMHg2NSwgMHgwMCwgMHgzNCwKKwkweDAxLCAweDU0LCAweDAwLCAweDM0LAorCTB4MDgsIDB4YjgsIDB4ZWUsIDB4NzgsCisJMHgyMCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweGJkLCAweDA4LCAweDM0LAorCTB4MDEsIDB4YmQsIDB4MDgsIDB4MzQsCisJMHgwOCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDBiLCAweGY0LCAweDc4LAorCTB4ZjcsIDB4MDEsIDB4MDIsIDB4MDgsCisJMHgwMSwgMHgwNiwgMHhjYywgMHgzNCwKKwkweGIyLCAweDAwLCAweDAwLCAweDA4LAorCTB4MDEsIDB4NDAsIDB4MjAsIDB4MzEsCisJMHgwMSwgMHhiZiwgMHg4MCwgMHgzMCwKKwkweDAxLCAweGI5LCAweDdhLCAweDMwLAorCTB4M2YsIDB4YmEsIDB4N2MsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhlYSwgMHg1OCwKKwkweDgwLCAweDBiLCAweGM0LCAweDc5LAorCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJMHgwMSwgMHhhYiwgMHhhYywgMHgzMCwKKwkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4NDAsIDB4NmEsIDB4MTYsIDB4MDAsCisJMHg4MCwgMHgzZSwgMHg4NCwgMHg1ZCwKKwkweDIwLCAweGI4LCAweDE4LCAweDc5LAorCTB4MjAsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMCwgMHhhYiwgMHg4NCwgMHg1ZCwKKwkweDAxLCAweGE5LCAweDc4LCAweDMwLAorCTB4MTAsIDB4YjgsIDB4MjAsIDB4NzksCisJMHhlNCwgMHg2YSwgMHg2ZSwgMHg1ZCwKKwkweDAwLCAweDY1LCAweGFlLCAweDQwLAorCTB4MTAsIDB4MDMsIDB4M2MsIDB4NjksCisJMHgwOCwgMHgzYywgMHg1YSwgMHg2OSwKKwkweDA0LCAweDNjLCAweDkyLCAweDY5LAorCTB4MDIsIDB4M2MsIDB4OTgsIDB4NjksCisJMHgwMSwgMHgzYywgMHg0NCwgMHg3OSwKKwkweGZmLCAweDZhLCAweDcwLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4YTQsIDB4NTksCisJMHgwMCwgMHg2YSwgMHhjMCwgMHg1ZSwKKwkweGZmLCAweDM4LCAweDMwLCAweDcxLAorCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHgzOCwgMHgxMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGVhLCAweDU4LAorCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHgxOCwgMHg0MSwKKwkweGE0LCAweDZhLCAweDA2LCAweDAwLAorCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCisJMHhmZCwgMHg1NywgMHhhZSwgMHgwOCwKKwkweDAwLCAweDY1LCAweGFlLCAweDQwLAorCTB4ZTQsIDB4NmEsIDB4NmUsIDB4NWQsCisJMHgyMCwgMHgzYywgMHg0YSwgMHg3OSwKKwkweDAyLCAweDZhLCAweDg0LCAweDVkLAorCTB4MDQsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMSwgMHgwMywgMHg0YywgMHg2OSwKKwkweGY3LCAweDExLCAweDIyLCAweDA4LAorCTB4ZmYsIDB4NmEsIDB4MjQsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHgwNiwgMHgwOCwKKwkweDAxLCAweDZhLCAweDdlLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4YTQsIDB4NTksCisJMHgwMCwgMHg2NSwgMHgwNCwgMHg0MCwKKwkweDgwLCAweDg2LCAweGM4LCAweDA4LAorCTB4MDEsIDB4NGYsIDB4YzgsIDB4MzAsCisJMHgwMCwgMHg1MCwgMHg2YywgMHg2MSwKKwkweGM0LCAweDZhLCAweDZlLCAweDVkLAorCTB4NDAsIDB4M2MsIDB4NjgsIDB4NzksCisJMHgyOCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDRjLCAweDQxLAorCTB4MDgsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMCwgMHg2NSwgMHg0YywgMHg0MSwKKwkweDg0LCAweDZhLCAweDZlLCAweDVkLAorCTB4MDAsIDB4NjUsIDB4ZjIsIDB4NTgsCisJMHgwMSwgMHg2NiwgMHhjOCwgMHgzMCwKKwkweDAxLCAweDY0LCAweGQ4LCAweDMxLAorCTB4MDEsIDB4NjQsIDB4MzIsIDB4MzEsCisJMHg1YiwgMHg2NCwgMHhjOCwgMHgyOCwKKwkweDMwLCAweDY0LCAweGNhLCAweDE4LAorCTB4MDEsIDB4NmMsIDB4YzgsIDB4MzAsCisJMHhmZiwgMHg2NCwgMHg4ZSwgMHg3OSwKKwkweDA4LCAweDAxLCAweDAyLCAweDAwLAorCTB4MDIsIDB4MGIsIDB4ODAsIDB4NzksCisJMHgwMSwgMHg2NCwgMHg4NiwgMHg2MSwKKwkweGY3LCAweDAxLCAweDAyLCAweDA4LAorCTB4MDEsIDB4MDYsIDB4ZDgsIDB4MzEsCisJMHgwMSwgMHgwNiwgMHgzMiwgMHgzMSwKKwkweGZmLCAweDY0LCAweGM4LCAweDE4LAorCTB4ZmYsIDB4NjQsIDB4ODAsIDB4NjksCisJMHhmNywgMHgzYywgMHg3OCwgMHgwOCwKKwkweDAwLCAweDY1LCAweDIwLCAweDQxLAorCTB4NDAsIDB4YWEsIDB4N2UsIDB4MTAsCisJMHgwNCwgMHhhYSwgMHg2ZSwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDU2LCAweDQyLAorCTB4YzQsIDB4NmEsIDB4NmUsIDB4NWQsCisJMHhjMCwgMHg2YSwgMHg3ZSwgMHgwMCwKKwkweDAwLCAweGE4LCAweDg0LCAweDVkLAorCTB4ZTQsIDB4NmEsIDB4MDYsIDB4MDAsCisJMHgwMCwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDRjLCAweDQxLAorCTB4MTAsIDB4M2MsIDB4YTgsIDB4NjksCisJMHgwMCwgMHhiYiwgMHg4YSwgMHg0NCwKKwkweDE4LCAweDZhLCAweGRhLCAweDAxLAorCTB4MDEsIDB4NjksIDB4ZDgsIDB4MzEsCisJMHgxYywgMHg2YSwgMHhkMCwgMHgwMSwKKwkweDA5LCAweGVlLCAweGRjLCAweDAxLAorCTB4ODAsIDB4ZWUsIDB4YjAsIDB4NzksCisJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKKwkweDAxLCAweDkzLCAweDI2LCAweDAxLAorCTB4MDMsIDB4NmEsIDB4MmEsIDB4MDEsCisJMHgwMSwgMHg2OSwgMHgzMiwgMHgzMSwKKwkweDFjLCAweDZhLCAweGUwLCAweDVkLAorCTB4MGEsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDAxLCAweDUwLCAweGEwLCAweDE4LAorCTB4MDIsIDB4NmEsIDB4MjIsIDB4MDUsCisJMHgxYSwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDgwLCAweDZhLCAweDc0LCAweDAwLAorCTB4NDAsIDB4NmEsIDB4NzgsIDB4MDAsCisJMHg0MCwgMHg2YSwgMHgxNiwgMHgwMCwKKwkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4MDEsIDB4M2YsIDB4YzgsIDB4MzAsCisJMHhiZiwgMHg2NCwgMHg1NiwgMHg3YSwKKwkweDgwLCAweDY0LCAweDllLCAweDczLAorCTB4YTAsIDB4NjQsIDB4MDAsIDB4NzQsCisJMHhjMCwgMHg2NCwgMHhmNCwgMHg3MywKKwkweGUwLCAweDY0LCAweDMwLCAweDc0LAorCTB4MDEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweGY3LCAweDExLCAweDIyLCAweDA4LAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHhmZiwgMHg2YSwgMHgyNCwgMHgwOCwKKwkweGY3LCAweDAxLCAweDAyLCAweDA4LAorCTB4MDksIDB4MGMsIDB4ZTYsIDB4NzksCisJMHgwOCwgMHgwYywgMHgwNCwgMHg2OCwKKwkweGIxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4ZmYsIDB4NmEsIDB4MjYsIDB4MDksCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDZhLCAweDA4LCAweDMwLAorCTB4ZmYsIDB4NmEsIDB4MDgsIDB4MDgsCisJMHhkZiwgMHgwMSwgMHgwMiwgMHgwOCwKKwkweDAxLCAweDZhLCAweDdlLCAweDAwLAorCTB4YzAsIDB4NmEsIDB4NzgsIDB4MDQsCisJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKKwkweDA4LCAweGE0LCAweDQ4LCAweDE5LAorCTB4MDAsIDB4YTUsIDB4NGEsIDB4MjEsCisJMHgwMCwgMHhhNiwgMHg0YywgMHgyMSwKKwkweDAwLCAweGE3LCAweDRlLCAweDI1LAorCTB4MDgsIDB4ZWIsIDB4ZGMsIDB4N2UsCisJMHg4MCwgMHhlYiwgMHgwNiwgMHg3YSwKKwkweGZmLCAweDZhLCAweGQ2LCAweDA5LAorCTB4MDgsIDB4ZWIsIDB4MGEsIDB4NmEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwYywKKwkweDgwLCAweGEzLCAweGRjLCAweDZlLAorCTB4ODgsIDB4ZWIsIDB4MjAsIDB4NzIsCisJMHgwOCwgMHhlYiwgMHhkYywgMHg2ZSwKKwkweDA0LCAweGVhLCAweDI0LCAweGUyLAorCTB4MDgsIDB4ZWUsIDB4ZGMsIDB4NmUsCisJMHgwNCwgMHg2YSwgMHhkMCwgMHg4MSwKKwkweDA1LCAweGE0LCAweGMwLCAweDg5LAorCTB4MDMsIDB4YTUsIDB4YzIsIDB4MzEsCisJMHgwOSwgMHg2YSwgMHhkNiwgMHgwNSwKKwkweDAwLCAweDY1LCAweDA4LCAweDVhLAorCTB4MDYsIDB4YTQsIDB4ZDQsIDB4ODksCisJMHg4MCwgMHg5NCwgMHhkYywgMHg3ZSwKKwkweDA3LCAweGU5LCAweDEwLCAweDMxLAorCTB4MDEsIDB4ZTksIDB4NDYsIDB4MzEsCisJMHgwMCwgMHhhMywgMHhiYSwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGZhLCAweDU5LAorCTB4MDEsIDB4YTQsIDB4Y2EsIDB4MzAsCisJMHg4MCwgMHhhMywgMHgzNCwgMHg3YSwKKwkweDAyLCAweDY1LCAweGNhLCAweDAwLAorCTB4MDEsIDB4NjUsIDB4ZjgsIDB4MzEsCisJMHg4MCwgMHg5MywgMHgyNiwgMHgwMSwKKwkweGZmLCAweDZhLCAweGQ0LCAweDBjLAorCTB4MDEsIDB4OGMsIDB4YzgsIDB4MzAsCisJMHgwMCwgMHg4OCwgMHhjOCwgMHgxOCwKKwkweDAyLCAweDY0LCAweGM4LCAweDg4LAorCTB4ZmYsIDB4NjQsIDB4ZGMsIDB4N2UsCisJMHhmZiwgMHg4ZCwgMHg0YSwgMHg2YSwKKwkweGZmLCAweDhlLCAweDRhLCAweDZhLAorCTB4MDMsIDB4OGMsIDB4ZDQsIDB4OTgsCisJMHgwMCwgMHg2NSwgMHhkYywgMHg1NiwKKwkweDAxLCAweDY0LCAweDcwLCAweDMwLAorCTB4ZmYsIDB4NjQsIDB4YzgsIDB4MTAsCisJMHgwMSwgMHg2NCwgMHhjOCwgMHgxOCwKKwkweDAwLCAweDhjLCAweDE4LCAweDE5LAorCTB4ZmYsIDB4OGQsIDB4MWEsIDB4MjEsCisJMHhmZiwgMHg4ZSwgMHgxYywgMHgyNSwKKwkweGMwLCAweDNjLCAweDVhLCAweDdhLAorCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHhhOCwgMHg2YSwgMHg3NiwgMHgwMCwKKwkweDc5LCAweDZhLCAweDc2LCAweDAwLAorCTB4NDAsIDB4M2YsIDB4NjIsIDB4NmEsCisJMHgwNCwgMHgzYiwgMHg3NiwgMHgwMCwKKwkweDA0LCAweDZhLCAweGQ0LCAweDgxLAorCTB4MjAsIDB4M2MsIDB4NmEsIDB4N2EsCisJMHg1MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDgyLCAweDQyLAorCTB4MjAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwMCwgMHhiMywgMHhiYSwgMHg1ZSwKKwkweDA3LCAweGFjLCAweDEwLCAweDMxLAorCTB4MDUsIDB4YjMsIDB4NDYsIDB4MzEsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweGFjLCAweDZhLCAweGVlLCAweDVkLAorCTB4YTMsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhiMywgMHg2YSwgMHhmMiwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDNhLCAweDVhLAorCTB4ZmQsIDB4YTQsIDB4NDgsIDB4MDksCisJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKKwkweDAwLCAweDY1LCAweGU2LCAweDVkLAorCTB4MDEsIDB4YTQsIDB4OTQsIDB4N2EsCisJMHgwNCwgMHgzYiwgMHg3NiwgMHgwOCwKKwkweDAxLCAweDNiLCAweDI2LCAweDMxLAorCTB4ODAsIDB4MDIsIDB4MDQsIDB4MDAsCisJMHgxMCwgMHgwYywgMHg4YSwgMHg3YSwKKwkweDAzLCAweDllLCAweDhjLCAweDZhLAorCTB4N2YsIDB4MDIsIDB4MDQsIDB4MDgsCisJMHg5MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4MDEsIDB4YTQsIDB4Y2EsIDB4MzAsCisJMHg4MCwgMHhhMywgMHg5YSwgMHg3YSwKKwkweDAyLCAweDY1LCAweGNhLCAweDAwLAorCTB4MDEsIDB4NjUsIDB4ZjgsIDB4MzEsCisJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKKwkweDAwLCAweDY1LCAweDBlLCAweDVhLAorCTB4MDEsIDB4ZmMsIDB4YTgsIDB4NmEsCisJMHg4MCwgMHgwYiwgMHg5ZSwgMHg2YSwKKwkweDEwLCAweDBjLCAweDllLCAweDdhLAorCTB4MjAsIDB4OTMsIDB4OWUsIDB4NmEsCisJMHgwMiwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAyLCAweGZjLCAweGIyLCAweDdhLAorCTB4NDAsIDB4MGQsIDB4YzYsIDB4NmEsCisJMHgwMSwgMHhhNCwgMHg0OCwgMHgwMSwKKwkweDAwLCAweDY1LCAweGM2LCAweDQyLAorCTB4NDAsIDB4MGQsIDB4YjgsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHgwZSwgMHg1YSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQyLAorCTB4ODAsIDB4ZmMsIDB4YzIsIDB4N2EsCisJMHg4MCwgMHhhNCwgMHhjMiwgMHg2YSwKKwkweGZmLCAweGE1LCAweDRhLCAweDE5LAorCTB4ZmYsIDB4YTYsIDB4NGMsIDB4MjEsCisJMHhmZiwgMHhhNywgMHg0ZSwgMHgyMSwKKwkweGY4LCAweGZjLCAweDQ4LCAweDA5LAorCTB4N2YsIDB4YTMsIDB4NDYsIDB4MDksCisJMHgwNCwgMHgzYiwgMHhlMiwgMHg2YSwKKwkweDAyLCAweDkzLCAweDI2LCAweDAxLAorCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKKwkweDAxLCAweDk0LCAweGM4LCAweDdhLAorCTB4MDEsIDB4OTQsIDB4YzgsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhjOCwgMHg3YSwKKwkweDAxLCAweGE0LCAweGUwLCAweDdhLAorCTB4MDEsIDB4ZmMsIDB4ZDYsIDB4N2EsCisJMHgwMSwgMHg5NCwgMHhlMiwgMHg2YSwKKwkweDAxLCAweDk0LCAweGUyLCAweDZhLAorCTB4MDEsIDB4OTQsIDB4ZTIsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHg4MiwgMHg0MiwKKwkweDAxLCAweDk0LCAweGUwLCAweDdhLAorCTB4MTAsIDB4OTQsIDB4ZTIsIDB4NmEsCisJMHhkNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDI4LCAweDkzLCAweGU2LCAweDZhLAorCTB4MDEsIDB4ODUsIDB4MGEsIDB4MDEsCisJMHgwMiwgMHhmYywgMHhlZSwgMHg2YSwKKwkweDAxLCAweDE0LCAweDQ2LCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4MTAsIDB4MDksCisJMHhmZSwgMHg4NSwgMHgwYSwgMHgwOSwKKwkweGZmLCAweDM4LCAweGZjLCAweDZhLAorCTB4ODAsIDB4YTMsIDB4ZmMsIDB4N2EsCisJMHg4MCwgMHgwYiwgMHhmYSwgMHg3YSwKKwkweDA0LCAweDNiLCAweGZjLCAweDdhLAorCTB4YmYsIDB4M2IsIDB4NzYsIDB4MDgsCisJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKKwkweDAwLCAweDY1LCAweDBlLCAweDVhLAorCTB4MDEsIDB4MGIsIDB4MGEsIDB4NmIsCisJMHgxMCwgMHgwYywgMHhmZSwgMHg3YSwKKwkweDA0LCAweDkzLCAweDA4LCAweDZiLAorCTB4MDEsIDB4OTQsIDB4MDYsIDB4N2IsCisJMHgxMCwgMHg5NCwgMHgwOCwgMHg2YiwKKwkweGM3LCAweDkzLCAweDI2LCAweDA5LAorCTB4MDEsIDB4OTksIDB4ZDQsIDB4MzAsCisJMHgzOCwgMHg5MywgMHgwYywgMHg2YiwKKwkweGZmLCAweDA4LCAweDVhLCAweDZiLAorCTB4ZmYsIDB4MDksIDB4NWEsIDB4NmIsCisJMHhmZiwgMHgwYSwgMHg1YSwgMHg2YiwKKwkweGZmLCAweDM4LCAweDI4LCAweDdiLAorCTB4MDQsIDB4MTQsIDB4MTAsIDB4MzEsCisJMHgwMSwgMHgzOCwgMHgxOCwgMHgzMSwKKwkweDAyLCAweDZhLCAweDFhLCAweDMxLAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHgxNCwgMHg2YSwgMHhmNCwgMHg1ZCwKKwkweDAwLCAweDM4LCAweGUwLCAweDVkLAorCTB4ZmYsIDB4NmEsIDB4NzAsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHg1NCwgMHg0MywKKwkweDgwLCAweGEzLCAweDJlLCAweDdiLAorCTB4MDEsIDB4YTQsIDB4NDgsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg1YSwgMHg0MywKKwkweDA4LCAweGViLCAweDM0LCAweDdiLAorCTB4MDAsIDB4NjUsIDB4MGUsIDB4NWEsCisJMHgwOCwgMHhlYiwgMHgzMCwgMHg2YiwKKwkweDA3LCAweGU5LCAweDEwLCAweDMxLAorCTB4MDEsIDB4ZTksIDB4Y2EsIDB4MzAsCisJMHgwMSwgMHg2NSwgMHg0NiwgMHgzMSwKKwkweDAwLCAweDZhLCAweGJhLCAweDVlLAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhhNCwgMHg2YSwgMHhmNCwgMHg1ZCwKKwkweDA4LCAweDZhLCAweGUwLCAweDVkLAorCTB4MGQsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4OGEsIDB4NWUsCisJMHgwMSwgMHg5OSwgMHg0NiwgMHgzMSwKKwkweDAwLCAweGEzLCAweGJhLCAweDVlLAorCTB4MDEsIDB4ODgsIDB4MTAsIDB4MzEsCisJMHgwMCwgMHg2NSwgMHgzYSwgMHg1YSwKKwkweDAwLCAweDY1LCAweGZhLCAweDU5LAorCTB4MDMsIDB4OGMsIDB4MTAsIDB4MzAsCisJMHgwMCwgMHg2NSwgMHhlNiwgMHg1ZCwKKwkweDgwLCAweDBiLCAweDgyLCAweDZhLAorCTB4ODAsIDB4MGIsIDB4NjIsIDB4NmIsCisJMHgwMSwgMHgwYywgMHg1YywgMHg3YiwKKwkweDEwLCAweDBjLCAweDgyLCAweDdhLAorCTB4MDMsIDB4OWUsIDB4ODIsIDB4NmEsCisJMHgwMCwgMHg2NSwgMHgwNCwgMHg1YSwKKwkweDAwLCAweDZhLCAweGJhLCAweDVlLAorCTB4MDEsIDB4YTQsIDB4ODIsIDB4NmIsCisJMHhmZiwgMHgzOCwgMHg3OCwgMHg3YiwKKwkweDAxLCAweDM4LCAweGM4LCAweDMwLAorCTB4MDAsIDB4MDgsIDB4NDAsIDB4MTksCisJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDA5LCAweDQyLCAweDIxLAorCTB4MDAsIDB4MGEsIDB4NDQsIDB4MjEsCisJMHhmZiwgMHg2YSwgMHg3MCwgMHgwOCwKKwkweDAwLCAweDY1LCAweDdhLCAweDQzLAorCTB4MDMsIDB4MDgsIDB4NDAsIDB4MzEsCisJMHgwMywgMHgwOCwgMHg0MCwgMHgzMSwKKwkweDAxLCAweDA4LCAweDQwLCAweDMxLAorCTB4MDEsIDB4MDksIDB4NDIsIDB4MzEsCisJMHgwMSwgMHgwYSwgMHg0NCwgMHgzMSwKKwkweGZkLCAweGI0LCAweDY4LCAweDA5LAorCTB4MTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDA0LCAweDNjLCAweGNjLCAweDc5LAorCTB4ZmIsIDB4M2MsIDB4NzgsIDB4MDgsCisJMHgwNCwgMHg5MywgMHgyMCwgMHg3OSwKKwkweDAxLCAweDBjLCAweDhlLCAweDZiLAorCTB4ODAsIDB4YmEsIDB4MjAsIDB4NzksCisJMHg4MCwgMHgwNCwgMHgyMCwgMHg3OSwKKwkweGU0LCAweDZhLCAweDZlLCAweDVkLAorCTB4MjMsIDB4NmEsIDB4ODQsIDB4NWQsCisJMHgwMSwgMHg2YSwgMHg4NCwgMHg1ZCwKKwkweDAwLCAweDY1LCAweDIwLCAweDQxLAorCTB4MDAsIDB4NjUsIDB4Y2MsIDB4NDEsCisJMHg4MCwgMHgzYywgMHhhMiwgMHg3YiwKKwkweDIxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDEsIDB4YmMsIDB4MTgsIDB4MzEsCisJMHgwMiwgMHg2YSwgMHgxYSwgMHgzMSwKKwkweDAyLCAweDZhLCAweGY4LCAweDAxLAorCTB4MDEsIDB4YmMsIDB4MTAsIDB4MzAsCisJMHgwMiwgMHg2YSwgMHgxMiwgMHgzMCwKKwkweDAxLCAweGJjLCAweDEwLCAweDMwLAorCTB4ZmYsIDB4NmEsIDB4MTIsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHgxNCwgMHgwOCwKKwkweGYzLCAweGJjLCAweGQ0LCAweDE4LAorCTB4YTAsIDB4NmEsIDB4YzgsIDB4NTMsCisJMHgwNCwgMHhhMCwgMHgxMCwgMHgzMSwKKwkweGFjLCAweDZhLCAweDI2LCAweDAxLAorCTB4MDQsIDB4YTAsIDB4MTAsIDB4MzEsCisJMHgwMywgMHgwOCwgMHgxOCwgMHgzMSwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YTAsIDB4NmEsIDB4ZjQsIDB4NWQsCisJMHgwMCwgMHhiYywgMHhlMCwgMHg1ZCwKKwkweDNkLCAweDZhLCAweDI2LCAweDAxLAorCTB4MDAsIDB4NjUsIDB4ZTAsIDB4NDMsCisJMHhmZiwgMHg2YSwgMHgxMCwgMHgwOSwKKwkweGE0LCAweDZhLCAweDI2LCAweDAxLAorCTB4MGMsIDB4YTAsIDB4MzIsIDB4MzEsCisJMHgwNSwgMHg2YSwgMHgyNiwgMHgwMSwKKwkweDM1LCAweDZhLCAweDI2LCAweDAxLAorCTB4MGMsIDB4YTAsIDB4MzIsIDB4MzEsCisJMHgzNiwgMHg2YSwgMHgyNiwgMHgwMSwKKwkweDAyLCAweDkzLCAweDI2LCAweDAxLAorCTB4MzUsIDB4NmEsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg5YywgMHg1ZSwKKwkweDAwLCAweDY1LCAweDljLCAweDVlLAorCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHhiZiwgMHgzYywgMHg3OCwgMHgwOCwKKwkweDA0LCAweDBiLCAweGU2LCAweDZiLAorCTB4MTAsIDB4MGMsIDB4ZTIsIDB4N2IsCisJMHgwMSwgMHgwMywgMHhlNiwgMHg2YiwKKwkweDIwLCAweDkzLCAweGU4LCAweDZiLAorCTB4MDQsIDB4MGIsIDB4ZWUsIDB4NmIsCisJMHg0MCwgMHgzYywgMHg3OCwgMHgwMCwKKwkweGM3LCAweDkzLCAweDI2LCAweDA5LAorCTB4MzgsIDB4OTMsIDB4ZjAsIDB4NmIsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweDgwLCAweDNjLCAweDU2LCAweDZjLAorCTB4MDEsIDB4MDYsIDB4NTAsIDB4MzEsCisJMHg4MCwgMHhiOCwgMHg3MCwgMHgwMSwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4MTAsIDB4M2YsIDB4MDYsIDB4MDAsCisJMHgxMCwgMHg2YSwgMHgwNiwgMHgwMCwKKwkweDAxLCAweDNhLCAweGNhLCAweDMwLAorCTB4ODAsIDB4NjUsIDB4MWMsIDB4NjQsCisJMHgxMCwgMHhiOCwgMHg0MCwgMHg2YywKKwkweGMwLCAweDNlLCAweGNhLCAweDAwLAorCTB4NDAsIDB4YjgsIDB4MGMsIDB4NmMsCisJMHhiZiwgMHg2NSwgMHhjYSwgMHgwOCwKKwkweDIwLCAweGI4LCAweDIwLCAweDdjLAorCTB4MDEsIDB4NjUsIDB4MGMsIDB4MzAsCisJMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKKwkweGEwLCAweDNmLCAweDI4LCAweDY0LAorCTB4MjMsIDB4YjgsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhkOCwgMHg1ZCwKKwkweGEwLCAweDNmLCAweDI4LCAweDY0LAorCTB4MDAsIDB4YmIsIDB4MjAsIDB4NDQsCisJMHhmZiwgMHg2NSwgMHgyMCwgMHg2NCwKKwkweDAwLCAweDY1LCAweDQwLCAweDQ0LAorCTB4NDAsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHgwMSwgMHg2NSwgMHgwYywgMHgzMCwKKwkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4YTAsIDB4M2YsIDB4ZmMsIDB4NzMsCisJMHg0MCwgMHg2YSwgMHgxOCwgMHgwMCwKKwkweDAxLCAweDNhLCAweGE2LCAweDMwLAorCTB4MDgsIDB4NmEsIDB4NzQsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweDY0LCAweDZhLCAweDY4LCAweDVkLAorCTB4ODAsIDB4NjQsIDB4ZDgsIDB4NmMsCisJMHgwNCwgMHg2NCwgMHg5YSwgMHg3NCwKKwkweDAyLCAweDY0LCAweGFhLCAweDc0LAorCTB4MDAsIDB4NmEsIDB4NjAsIDB4NzQsCisJMHgwMywgMHg2NCwgMHhjOCwgMHg3NCwKKwkweDIzLCAweDY0LCAweDQ4LCAweDc0LAorCTB4MDgsIDB4NjQsIDB4NWMsIDB4NzQsCisJMHg2MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGQ4LCAweDVkLAorCTB4MDgsIDB4NTEsIDB4Y2UsIDB4NzEsCisJMHgwMCwgMHg2NSwgMHg0MCwgMHg0NCwKKwkweDgwLCAweDA0LCAweDVhLCAweDdjLAorCTB4NTEsIDB4NmEsIDB4NWUsIDB4NWQsCisJMHgwMSwgMHg1MSwgMHg1YSwgMHg2NCwKKwkweDAxLCAweGE0LCAweDUyLCAweDdjLAorCTB4ODAsIDB4YmEsIDB4NWMsIDB4NmMsCisJMHg0MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4MjEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg1YywgMHg0NCwKKwkweDA3LCAweDZhLCAweDU0LCAweDVkLAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHgwMCwgMHg2NSwgMHhjYywgMHg0MSwKKwkweDgwLCAweGI4LCAweDU2LCAweDdjLAorCTB4YzAsIDB4M2MsIDB4NmEsIDB4N2MsCisJMHg4MCwgMHgzYywgMHg1NiwgMHg2YywKKwkweGZmLCAweGE4LCAweDZhLCAweDZjLAorCTB4NDAsIDB4M2MsIDB4NTYsIDB4NmMsCisJMHgxMCwgMHhiOCwgMHg2ZSwgMHg3YywKKwkweGExLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDEsIDB4YjQsIDB4NzQsIDB4NmMsCisJMHgwMiwgMHhiNCwgMHg3NiwgMHg2YywKKwkweDAxLCAweGE0LCAweDc2LCAweDdjLAorCTB4ZmYsIDB4YTgsIDB4ODYsIDB4N2MsCisJMHgwNCwgMHhiNCwgMHg2OCwgMHgwMSwKKwkweDAxLCAweDZhLCAweDc2LCAweDAwLAorCTB4MDAsIDB4YmIsIDB4MTIsIDB4NWUsCisJMHhmZiwgMHhhOCwgMHg4NiwgMHg3YywKKwkweDcxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4NDAsIDB4NTEsIDB4ODYsIDB4NjQsCisJMHgwMCwgMHg2NSwgMHhiMiwgMHg1ZSwKKwkweDAwLCAweDY1LCAweGRlLCAweDQxLAorCTB4MDAsIDB4YmIsIDB4OGEsIDB4NWMsCisJMHgwMCwgMHg2NSwgMHhkZSwgMHg0MSwKKwkweDAwLCAweDY1LCAweGIyLCAweDVlLAorCTB4MDEsIDB4NjUsIDB4YTIsIDB4MzAsCisJMHgwMSwgMHhmOCwgMHhjOCwgMHgzMCwKKwkweDAxLCAweDRlLCAweGM4LCAweDMwLAorCTB4MDAsIDB4NmEsIDB4YjYsIDB4ZGQsCisJMHgwMCwgMHg1MSwgMHhjOCwgMHg1ZCwKKwkweDAxLCAweDRlLCAweDljLCAweDE4LAorCTB4MDIsIDB4NmEsIDB4MjIsIDB4MDUsCisJMHhjMCwgMHgzYywgMHg1NiwgMHg2YywKKwkweDA0LCAweGI4LCAweDcwLCAweDAxLAorCTB4MDAsIDB4NjUsIDB4ZDQsIDB4NWUsCisJMHgyMCwgMHhiOCwgMHhkZSwgMHg2OSwKKwkweDAxLCAweGJiLCAweGEyLCAweDMwLAorCTB4M2YsIDB4YmEsIDB4N2MsIDB4MDgsCisJMHgwMCwgMHhiOSwgMHhjZSwgMHg1YywKKwkweDAwLCAweDY1LCAweGRlLCAweDQxLAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHgyMCwgMHgzYywgMHhjYywgMHg3OSwKKwkweDIwLCAweDNjLCAweDVjLCAweDdjLAorCTB4MDEsIDB4YTQsIDB4YjgsIDB4N2MsCisJMHgwMSwgMHhiNCwgMHg2OCwgMHgwMSwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgwNCwgMHgxNCwgMHg1OCwgMHgzMSwKKwkweDAxLCAweDA2LCAweGQ0LCAweDMwLAorCTB4MDgsIDB4YTAsIDB4NjAsIDB4MzEsCisJMHhhYywgMHg2YSwgMHhjYywgMHgwMCwKKwkweDE0LCAweDZhLCAweGY0LCAweDVkLAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHhhMCwgMHg2YSwgMHhlYywgMHg1ZCwKKwkweDAwLCAweDY1LCAweGNjLCAweDQxLAorCTB4ZGYsIDB4M2MsIDB4NzgsIDB4MDgsCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDY1LCAweDVjLCAweDQ0LAorCTB4NGMsIDB4NjUsIDB4Y2MsIDB4MjgsCisJMHgwMSwgMHgzZSwgMHgyMCwgMHgzMSwKKwkweGQwLCAweDY2LCAweGNjLCAweDE4LAorCTB4MjAsIDB4NjYsIDB4Y2MsIDB4MTgsCisJMHgwMSwgMHg1MSwgMHhkYSwgMHgzNCwKKwkweDRjLCAweDNkLCAweGNhLCAweDI4LAorCTB4M2YsIDB4NjQsIDB4N2MsIDB4MDgsCisJMHhkMCwgMHg2NSwgMHhjYSwgMHgxOCwKKwkweDAxLCAweDNlLCAweDIwLCAweDMxLAorCTB4MzAsIDB4NjUsIDB4ZDQsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhlNiwgMHg0YywKKwkweGUxLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHgyMCwgMHg2NSwgMHhkNCwgMHgxOCwKKwkweDAwLCAweDY1LCAweGVlLCAweDU0LAorCTB4ZTEsIDB4NmEsIDB4MjIsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweDIwLCAweDY1LCAweGNhLCAweDE4LAorCTB4ZTAsIDB4NjUsIDB4ZDQsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhmOCwgMHg0YywKKwkweGUxLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHhkMCwgMHg2NSwgMHhkNCwgMHgxOCwKKwkweDAwLCAweDY1LCAweDAwLCAweDU1LAorCTB4ZTEsIDB4NmEsIDB4MjIsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweDAxLCAweDZjLCAweGEyLCAweDMwLAorCTB4ZmYsIDB4NTEsIDB4MTIsIDB4NzUsCisJMHgwMCwgMHg1MSwgMHg4ZSwgMHg1ZCwKKwkweDAxLCAweDUxLCAweDIwLCAweDMxLAorCTB4MDAsIDB4NjUsIDB4MzQsIDB4NDUsCisJMHgzZiwgMHhiYSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDNlLCAweDM0LCAweDc1LAorCTB4MDAsIDB4NjUsIDB4YjAsIDB4NWUsCisJMHg4MCwgMHgzYywgMHg3OCwgMHgwMCwKKwkweDAxLCAweDA2LCAweGQ0LCAweDMwLAorCTB4MDAsIDB4NjUsIDB4ZDgsIDB4NWQsCisJMHgwMSwgMHgzYywgMHg3OCwgMHgwMCwKKwkweGUwLCAweDNmLCAweDUwLCAweDY1LAorCTB4MDIsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgyMCwgMHgxMiwgMHg1MCwgMHg2NSwKKwkweDUxLCAweDZhLCAweDVlLCAweDVkLAorCTB4MDAsIDB4NTEsIDB4OGUsIDB4NWQsCisJMHg1MSwgMHg2YSwgMHg1ZSwgMHg1ZCwKKwkweDAxLCAweDUxLCAweDIwLCAweDMxLAorCTB4MDQsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwMSwgMHhiOSwgMHhjOCwgMHgzMCwKKwkweDAwLCAweDNkLCAweDRlLCAweDY1LAorCTB4MDgsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgzZiwgMHhiYSwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDNlLCAweDRlLCAweDY1LAorCTB4MTAsIDB4M2MsIDB4NzgsIDB4MDAsCisJMHgwNCwgMHhiOCwgMHg0ZSwgMHg3ZCwKKwkweGZiLCAweGI4LCAweDcwLCAweDA5LAorCTB4MjAsIDB4YjgsIDB4NDQsIDB4NmQsCisJMHgwMSwgMHg5MCwgMHhjOCwgMHgzMCwKKwkweGZmLCAweDZhLCAweGEyLCAweDAwLAorCTB4MDAsIDB4M2QsIDB4Y2UsIDB4NWMsCisJMHgwMSwgMHg2NCwgMHgyMCwgMHgzMSwKKwkweGZmLCAweDZhLCAweDc4LCAweDA4LAorCTB4MDAsIDB4NjUsIDB4ZWEsIDB4NTgsCisJMHgxMCwgMHhiOCwgMHg1YywgMHg3YywKKwkweGZmLCAweDZhLCAweDU0LCAweDVkLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgwMCwgMHg2NSwgMHhiMCwgMHg1ZSwKKwkweDMxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NWMsIDB4NDQsCisJMHgxMCwgMHgzZiwgMHgwNiwgMHgwMCwKKwkweDEwLCAweDZhLCAweDA2LCAweDAwLAorCTB4MDEsIDB4NjUsIDB4NzQsIDB4MzQsCisJMHg4MSwgMHg2YSwgMHhkOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDYwLCAweDQ1LAorCTB4MDEsIDB4MDYsIDB4ZDQsIDB4MzAsCisJMHgwMSwgMHgwYywgMHg2MCwgMHg3ZCwKKwkweDA0LCAweDBjLCAweDVhLCAweDZkLAorCTB4ZTAsIDB4MDMsIDB4N2UsIDB4MDgsCisJMHhlMCwgMHgzZiwgMHhjYywgMHg2MSwKKwkweDAxLCAweDY1LCAweGNjLCAweDMwLAorCTB4MDEsIDB4MTIsIDB4ZGEsIDB4MzQsCisJMHgwMSwgMHgwNiwgMHhkNCwgMHgzNCwKKwkweDAxLCAweDAzLCAweDZlLCAweDZkLAorCTB4NDAsIDB4MDMsIDB4Y2MsIDB4MDgsCisJMHgwMSwgMHg2NSwgMHgwNiwgMHgzMCwKKwkweDQwLCAweDY1LCAweGM4LCAweDA4LAorCTB4MDAsIDB4NjYsIDB4N2MsIDB4NzUsCisJMHg0MCwgMHg2NSwgMHg3YywgMHg3ZCwKKwkweDAwLCAweDY1LCAweDdjLCAweDVkLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweGZmLCAweDZhLCAweGQ0LCAweDA4LAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHgwOCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDBiLCAweDg2LCAweDdkLAorCTB4MDEsIDB4NjUsIDB4MGMsIDB4MzAsCisJMHgwMiwgMHgwYiwgMHg4YSwgMHg3ZCwKKwkweGY3LCAweDAxLCAweDAyLCAweDBjLAorCTB4MDEsIDB4NjUsIDB4YzgsIDB4MzAsCisJMHhmZiwgMHg0MSwgMHhhZSwgMHg3NSwKKwkweDAxLCAweDQxLCAweDIwLCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4YTQsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHg5ZSwgMHg0NSwKKwkweGZmLCAweGJmLCAweGFlLCAweDc1LAorCTB4MDEsIDB4OTAsIDB4YTQsIDB4MzAsCisJMHgwMSwgMHhiZiwgMHgyMCwgMHgzMSwKKwkweDAwLCAweGJiLCAweDk4LCAweDY1LAorCTB4ZmYsIDB4NTIsIDB4YWMsIDB4NzUsCisJMHgwMSwgMHhiZiwgMHhjYywgMHgzMCwKKwkweDAxLCAweDkwLCAweGNhLCAweDMwLAorCTB4MDEsIDB4NTIsIDB4MjAsIDB4MzEsCisJMHgwMSwgMHg2NiwgMHg3ZSwgMHgzMSwKKwkweDAxLCAweDY1LCAweDIwLCAweDM1LAorCTB4MDEsIDB4YmYsIDB4ODIsIDB4MzQsCisJMHgwMSwgMHg2NCwgMHhhMiwgMHgzMCwKKwkweDAwLCAweDZhLCAweGMwLCAweDVlLAorCTB4MGQsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHg1MSwgMHgxMiwgMHg0NiwKKwkweDAxLCAweDY1LCAweGE0LCAweDMwLAorCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0OCwgMHg2YSwgMHgwNiwgMHg1ZSwKKwkweDAxLCAweDZhLCAweGQwLCAweDAxLAorCTB4MDEsIDB4NmEsIDB4ZGMsIDB4MDUsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ4LCAweDZhLCAweDA2LCAweDVlLAorCTB4MDEsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHgwMSwgMHg2YSwgMHgyNiwgMHgwNSwKKwkweDAxLCAweDY1LCAweGQ4LCAweDMxLAorCTB4MDksIDB4ZWUsIDB4ZGMsIDB4MDEsCisJMHg4MCwgMHhlZSwgMHhjYywgMHg3ZCwKKwkweGZmLCAweDZhLCAweGRjLCAweDBkLAorCTB4MDEsIDB4NjUsIDB4MzIsIDB4MzEsCisJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGE4LCAweDQ2LAorCTB4ODEsIDB4NmEsIDB4ZDgsIDB4NWUsCisJMHgwMSwgMHgwYywgMHhkOCwgMHg3ZCwKKwkweDA0LCAweDBjLCAweGQ2LCAweDZkLAorCTB4ZTAsIDB4MDMsIDB4MDYsIDB4MDgsCisJMHhlMCwgMHgwMywgMHg3ZSwgMHgwYywKKwkweDAxLCAweDY1LCAweDE4LCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4MWEsIDB4MDksCisJMHhmZiwgMHg2YSwgMHgxYywgMHgwZCwKKwkweDAxLCAweDhjLCAweDEwLCAweDMwLAorCTB4MDEsIDB4OGQsIDB4MTIsIDB4MzAsCisJMHgwMSwgMHg4ZSwgMHgxNCwgMHgzNCwKKwkweDAxLCAweDZjLCAweGRhLCAweDMwLAorCTB4MDEsIDB4NmMsIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg2YywgMHhkYSwgMHgzMCwKKwkweDAxLCAweDZjLCAweGRhLCAweDMwLAorCTB4MDEsIDB4NmMsIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg2YywgMHhkYSwgMHgzMCwKKwkweDAxLCAweDZjLCAweGRhLCAweDMwLAorCTB4MDEsIDB4NmMsIDB4ZGEsIDB4MzQsCisJMHgzZCwgMHg2NCwgMHhhNCwgMHgyOCwKKwkweDU1LCAweDY0LCAweGM4LCAweDI4LAorCTB4MDAsIDB4NjUsIDB4MDYsIDB4NDYsCisJMHgyZSwgMHg2NCwgMHhhNCwgMHgyOCwKKwkweDY2LCAweDY0LCAweGM4LCAweDI4LAorCTB4MDAsIDB4NmMsIDB4ZGEsIDB4MTgsCisJMHgwMSwgMHg1MiwgMHhjOCwgMHgzMCwKKwkweDAwLCAweDZjLCAweGRhLCAweDIwLAorCTB4ZmYsIDB4NmEsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHg2YywgMHhkYSwgMHgyMCwKKwkweDAwLCAweDZjLCAweGRhLCAweDI0LAorCTB4MDEsIDB4NjUsIDB4YzgsIDB4MzAsCisJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ0LCAweDZhLCAweDAyLCAweDVlLAorCTB4MDEsIDB4OTAsIDB4ZTIsIDB4MzEsCisJMHgwNCwgMHgzYiwgMHgyNiwgMHg3ZSwKKwkweDMwLCAweDZhLCAweGQwLCAweDAxLAorCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCisJMHgxZCwgMHg2YSwgMHhkYywgMHgwMSwKKwkweGRjLCAweGVlLCAweDIyLCAweDY2LAorCTB4MDAsIDB4NjUsIDB4M2UsIDB4NDYsCisJMHgyMCwgMHg2YSwgMHhkMCwgMHgwMSwKKwkweDAxLCAweDZhLCAweGRjLCAweDAxLAorCTB4MjAsIDB4YTAsIDB4ZDgsIDB4MzEsCisJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKKwkweDgwLCAweGVlLCAweDJlLCAweDdlLAorCTB4MTEsIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg1MCwgMHhlZSwgMHgzMiwgMHg2NiwKKwkweDIwLCAweDZhLCAweGQwLCAweDAxLAorCTB4MDksIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg4OCwgMHhlZSwgMHgzOCwgMHg2NiwKKwkweDE5LCAweDZhLCAweGRjLCAweDAxLAorCTB4ZDgsIDB4ZWUsIDB4M2MsIDB4NjYsCisJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKKwkweDE4LCAweGVlLCAweDQwLCAweDZlLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ0LCAweDZhLCAweDAyLCAweDVlLAorCTB4MjAsIDB4NmEsIDB4ZTAsIDB4NWQsCisJMHgwMSwgMHgzYiwgMHgyNiwgMHgzMSwKKwkweDA0LCAweDNiLCAweDVhLCAweDZlLAorCTB4YTAsIDB4NmEsIDB4Y2EsIDB4MDAsCisJMHgyMCwgMHg2NSwgMHhjOCwgMHgxOCwKKwkweDAwLCAweDY1LCAweDk4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4NTIsIDB4NjYsCisJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGE4LCAweDQ2LAorCTB4YTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHhjOCwgMHgwOCwKKwkweDIwLCAweDk0LCAweDVlLCAweDZlLAorCTB4MTAsIDB4OTQsIDB4NjAsIDB4NmUsCisJMHgwOCwgMHg5NCwgMHg3YSwgMHg2ZSwKKwkweDA4LCAweDk0LCAweDdhLCAweDZlLAorCTB4MDgsIDB4OTQsIDB4N2EsIDB4NmUsCisJMHhmZiwgMHg4YywgMHhjOCwgMHgxMCwKKwkweGMxLCAweDY0LCAweGM4LCAweDE4LAorCTB4ZjgsIDB4NjQsIDB4YzgsIDB4MDgsCisJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKKwkweDAwLCAweDY2LCAweDZlLCAweDY2LAorCTB4YzAsIDB4NjYsIDB4YWEsIDB4NzYsCisJMHg2MCwgMHg2NiwgMHhjOCwgMHgxOCwKKwkweDNkLCAweDY0LCAweGM4LCAweDI4LAorCTB4MDAsIDB4NjUsIDB4NWUsIDB4NDYsCisJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDA4LCAweDkzLCAweDdjLCAweDZlLAorCTB4MDAsIDB4NjIsIDB4YzQsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHhhOCwgMHg1ZSwKKwkweDAwLCAweDY1LCAweDg4LCAweDVlLAorCTB4MDAsIDB4NjUsIDB4ODgsIDB4NWUsCisJMHgwMCwgMHg2NSwgMHg4OCwgMHg1ZSwKKwkweDAxLCAweDk5LCAweGRhLCAweDMwLAorCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKKwkweDAxLCAweDk5LCAweGRhLCAweDMwLAorCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzAsCisJMHgwMSwgMHg5OSwgMHhkYSwgMHgzMCwKKwkweDAxLCAweDk5LCAweGRhLCAweDMwLAorCTB4MDEsIDB4OTksIDB4ZGEsIDB4MzQsCisJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKKwkweDAxLCAweDZjLCAweDMyLCAweDMxLAorCTB4MDEsIDB4NmMsIDB4MzIsIDB4MzEsCisJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKKwkweDAxLCAweDZjLCAweDMyLCAweDMxLAorCTB4MDEsIDB4NmMsIDB4MzIsIDB4MzEsCisJMHgwMSwgMHg2YywgMHgzMiwgMHgzMSwKKwkweDAxLCAweDZjLCAweDMyLCAweDM1LAorCTB4MDgsIDB4OTQsIDB4YTgsIDB4N2UsCisJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDA4LCAweDkzLCAweGFjLCAweDZlLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHgwNCwgMHhiOCwgMHhkNCwgMHg2ZSwKKwkweDAxLCAweDQyLCAweDdlLCAweDMxLAorCTB4ZmYsIDB4NmEsIDB4NzYsIDB4MDEsCisJMHgwMSwgMHg5MCwgMHg4NCwgMHgzNCwKKwkweGZmLCAweDZhLCAweDc2LCAweDA1LAorCTB4MDEsIDB4ODUsIDB4MGEsIDB4MDEsCisJMHg3ZiwgMHg2NSwgMHgxMCwgMHgwOSwKKwkweGZlLCAweDg1LCAweDBhLCAweDBkLAorCTB4ZmYsIDB4NDIsIDB4ZDAsIDB4NjYsCisJMHhmZiwgMHg0MSwgMHhjOCwgMHg2NiwKKwkweGQxLCAweDZhLCAweGQ4LCAweDVlLAorCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCisJMHgwMSwgMHg0MSwgMHgyMCwgMHgzMSwKKwkweDAxLCAweGJmLCAweDgyLCAweDMwLAorCTB4MDEsIDB4NmEsIDB4NzYsIDB4MDAsCisJMHgwMCwgMHhiYiwgMHgxMiwgMHg0NiwKKwkweDAxLCAweDQyLCAweDIwLCAweDMxLAorCTB4MDEsIDB4YmYsIDB4ODQsIDB4MzQsCisJMHgwMSwgMHg0MSwgMHg3ZSwgMHgzMSwKKwkweDAxLCAweDkwLCAweDgyLCAweDM0LAorCTB4MDEsIDB4NjUsIDB4MjIsIDB4MzEsCisJMHhmZiwgMHg2YSwgMHhkNCwgMHgwOCwKKwkweGZmLCAweDZhLCAweGQ0LCAweDBjCit9OworCit0eXBlZGVmIGludCBhaGNfcGF0Y2hfZnVuY190IChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoMjNfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoMjNfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5idWdzICYgQUhDX1NDQkNIQU5fVVBMT0FEX0JVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDIyX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDIyX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pID09IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gyMV9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gyMV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpID09IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gyMF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gyMF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1dJREUpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxOV9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxOV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1NDQl9CVFQpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxOF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxOF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmJ1Z3MgJiBBSENfUENJXzJfMV9SRVRSWV9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxN19mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxN19mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1RNT0RFX1dJREVPRERfQlVHKSAhPSAwKTsKK30KKworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoMTZfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoMTZfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5idWdzICYgQUhDX0FVVE9GTFVTSF9CVUcpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxNV9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxNV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDE0X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDE0X2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+YnVncyAmIEFIQ19QQ0lfTVdJX0JVRykgIT0gMCAmJiBhaGMtPnBjaV9jYWNoZXNpemUgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDEzX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDEzX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmxhZ3MgJiBBSENfMzlCSVRfQUREUkVTU0lORykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDEyX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDEyX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfSFNfTUFJTEJPWCkgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDExX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDExX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxMF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gxMF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX01VTFRJX1RJRCkgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDlfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoOV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKTsKK30KKworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoOF9mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2g4X2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmxhZ3MgJiBBSENfSU5JVElBVE9SUk9MRSkgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDdfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoN19mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2g2X2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDZfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19EVCkgPT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDVfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoNV9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1NFUVVFTkNFUl9ERUJVRykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDRfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoNF9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKTsKK30KKworc3RhdGljIGFoY19wYXRjaF9mdW5jX3QgYWhjX3BhdGNoM19mdW5jOworCitzdGF0aWMgaW50CithaGNfcGF0Y2gzX2Z1bmMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXJldHVybiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCk7Cit9CisKK3N0YXRpYyBhaGNfcGF0Y2hfZnVuY190IGFoY19wYXRjaDJfZnVuYzsKKworc3RhdGljIGludAorYWhjX3BhdGNoMl9mdW5jKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlyZXR1cm4gKChhaGMtPmZlYXR1cmVzICYgQUhDX1RXSU4pICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gxX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDFfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApOworfQorCitzdGF0aWMgYWhjX3BhdGNoX2Z1bmNfdCBhaGNfcGF0Y2gwX2Z1bmM7CisKK3N0YXRpYyBpbnQKK2FoY19wYXRjaDBfZnVuYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCit7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHN0cnVjdCBwYXRjaCB7CisJYWhjX3BhdGNoX2Z1bmNfdAkJKnBhdGNoX2Z1bmM7CisJdWludDMyX3QJCSBiZWdpbgkJOjEwLAorCQkJCSBza2lwX2luc3RyCToxMCwKKwkJCQkgc2tpcF9wYXRjaAk6MTI7Cit9IHBhdGNoZXNbXSA9IHsKKwl7IGFoY19wYXRjaDFfZnVuYywgNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMl9mdW5jLCA2LCAyLCAxIH0sCisJeyBhaGNfcGF0Y2gyX2Z1bmMsIDksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDNfZnVuYywgMTEsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTIsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgMTUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgMjIsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDNfZnVuYywgMjcsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMjgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgMzcsIDU0LCAxOSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAzNywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MiwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NSwgMywgMSB9LAorCXsgYWhjX3BhdGNoMTBfZnVuYywgNDksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTAsIDIsIDMgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNTAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgNTMsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNTUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNjAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzEsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNzksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgOTEsIDksIDQgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgOTMsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgOTQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgOTYsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgMTA1LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDEwOSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAxMTAsIDIsIDMgfSwKKwl7IGFoY19wYXRjaDJfZnVuYywgMTEwLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDExMSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAxMTIsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTE2LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxMV9mdW5jLCAxMTcsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMTE5LCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDEyMCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAxMjEsIDQsIDEgfSwKKwl7IGFoY19wYXRjaDdfZnVuYywgMTMxLCA5NSwgMTEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgMTUxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDE2OCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTJfZnVuYywgMTczLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDE3NCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAxODUsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMTg2LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDE5NSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAxOTYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMjEyLCA2LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDIxOCwgNiwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAyMjYsIDIwLCAyIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDI0MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCAyNDgsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMjQ5LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gxMV9mdW5jLCAyNTAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgMjU4LCAyNywgMyB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCAyNzQsIDEwLCAyIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAyNzcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDI4NSwgMTQsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMzAxLCAxLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDMwMiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMDUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDMxMCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTEsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzEzLCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxNF9mdW5jLCAzMTcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE1X2Z1bmMsIDMxOSwgMiwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzMTksIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzIwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDMyNSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAzMjYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgMzMwLCA0NywgMTEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzM3LCAyLCA0IH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDMzNywgMSwgMSB9LAorCXsgYWhjX3BhdGNoOF9mdW5jLCAzMzgsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzM5LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNDAsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgMzU2LCA2LCAzIH0sCisJeyBhaGNfcGF0Y2gxNl9mdW5jLCAzNTYsIDUsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzYyLCA3LCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCAzNzIsIDUsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgMzc3LCA1MiwgMTcgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDM3NywgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCAzNzksIDIsIDIgfSwKKwl7IGFoY19wYXRjaDE3X2Z1bmMsIDM4MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCAzODMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE4X2Z1bmMsIDM5MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTRfZnVuYywgMzk1LCA5LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDM5NiwgMywgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCAzOTksIDMsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDA3LCA2LCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQxMywgOSwgMiB9LAorCXsgYWhjX3BhdGNoMTNfZnVuYywgNDEzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCA0MjIsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDE0X2Z1bmMsIDQyNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0MjYsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDI3LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDQyOCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoN19mdW5jLCA0MjksIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgNDMwLCAzLCAzIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDQzMSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0MzIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDMzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCA0MzQsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDEzX2Z1bmMsIDQzNCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTRfZnVuYywgNDM2LCA5LCA0IH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQzNiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0NDMsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDQ1LCA0LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ0NSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NDYsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNDUwLCAyLCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDQ1MiwgMTAsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDYyLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g4X2Z1bmMsIDQ2MywgMTE4LCAyMiB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA0NjUsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDY4LCA1LCAzIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDQ2OCwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0NzAsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDFfZnVuYywgNDc1LCAyLCAyIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ3NywgNiwgMyB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA0NzcsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDc5LCAzLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDQ4NSwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA0ODcsIDksIDcgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNDg3LCA1LCA2IH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA0ODcsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDg4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA0OTAsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNDkxLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDQ5MiwgNCwgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA0OTcsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTAwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g2X2Z1bmMsIDUxMCwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA1MTEsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDIwX2Z1bmMsIDU0OCwgNywgMSB9LAorCXsgYWhjX3BhdGNoM19mdW5jLCA1ODMsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTg0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gyMV9mdW5jLCA1ODcsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDhfZnVuYywgNTg5LCAxMDYsIDMzIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDU5MSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMV9mdW5jLCA1OTcsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNTk5LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxX2Z1bmMsIDYwMiwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MDMsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDlfZnVuYywgNjA0LCAzLCAzIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCA2MDUsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjA3LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2MTYsIDIsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjE4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA2MjIsIDEwLCAzIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDYyNCwgOCwgMSB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2MzIsIDksIDIgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjMzLCA4LCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY0MywgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2NDQsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDY0NSwgMSwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2NDYsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNjQ4LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY0OSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NTIsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjU0LCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY1NiwgMiwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA2NTgsIDIsIDEgfSwKKwl7IGFoY19wYXRjaDVfZnVuYywgNjYwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g1X2Z1bmMsIDY2MywgMSwgMSB9LAorCXsgYWhjX3BhdGNoNV9mdW5jLCA2NjYsIDEsIDEgfSwKKwl7IGFoY19wYXRjaDE5X2Z1bmMsIDY3MCwgMSwgMSB9LAorCXsgYWhjX3BhdGNoMTlfZnVuYywgNjczLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDY3OSwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNl9mdW5jLCA2ODIsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNjgzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDY5NSwgMTYsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgNzExLCAyMCwgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA3MzIsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzM2LCA0LCAxIH0sCisJeyBhaGNfcGF0Y2g5X2Z1bmMsIDc0MCwgNCwgMiB9LAorCXsgYWhjX3BhdGNoMF9mdW5jLCA3NDQsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDZfZnVuYywgNzUwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gyMl9mdW5jLCA3NTIsIDE0LCAxIH0sCisJeyBhaGNfcGF0Y2g3X2Z1bmMsIDc2NiwgMywgMSB9LAorCXsgYWhjX3BhdGNoOV9mdW5jLCA3NzgsIDI0LCA4IH0sCisJeyBhaGNfcGF0Y2gxOV9mdW5jLCA3ODIsIDEsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzgzLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxNV9mdW5jLCA3ODgsIDQsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzkyLCA3LCAzIH0sCisJeyBhaGNfcGF0Y2gyM19mdW5jLCA3OTIsIDUsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgNzk3LCAyLCAxIH0sCisJeyBhaGNfcGF0Y2gwX2Z1bmMsIDgwMiwgNDIsIDMgfSwKKwl7IGFoY19wYXRjaDE4X2Z1bmMsIDgxNCwgMTgsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODMyLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2g0X2Z1bmMsIDg1NiwgMSwgMSB9LAorCXsgYWhjX3BhdGNoNF9mdW5jLCA4NTcsIDMsIDIgfSwKKwl7IGFoY19wYXRjaDBfZnVuYywgODYwLCAxLCAxIH0sCisJeyBhaGNfcGF0Y2gxM19mdW5jLCA4NjEsIDMsIDEgfSwKKwl7IGFoY19wYXRjaDRfZnVuYywgODY0LCAxMiwgMSB9Cit9OworCitzdGF0aWMgc3RydWN0IGNzIHsKKwl1aW50MTZfdAliZWdpbjsKKwl1aW50MTZfdAllbmQ7Cit9IGNyaXRpY2FsX3NlY3Rpb25zW10gPSB7CisJeyAxMSwgMTggfSwKKwl7IDIxLCAzMCB9LAorCXsgNzExLCA3MjcgfSwKKwl7IDg1NywgODYwIH0sCisJeyA4NjQsIDg3MCB9LAorCXsgODcyLCA4NzQgfSwKKwl7IDg3NCwgODc2IH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgbnVtX2NyaXRpY2FsX3NlY3Rpb25zID0gc2l6ZW9mKGNyaXRpY2FsX3NlY3Rpb25zKQorCQkJCSAgICAgICAvIHNpemVvZigqY3JpdGljYWxfc2VjdGlvbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTFmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vTWFrZWZpbGUKQEAgLTAsMCArMSw3OCBAQAorUFJPRz0JYWljYXNtCisKKy5TVUZGSVhFUz0gLmwgLnkgLmMgLmgKKworQ1NSQ1M9CWFpY2FzbS5jIGFpY2FzbV9zeW1ib2wuYworWVNSQ1M9CWFpY2FzbV9ncmFtLnkgYWljYXNtX21hY3JvX2dyYW0ueQorTFNSQ1M9CWFpY2FzbV9zY2FuLmwgYWljYXNtX21hY3JvX3NjYW4ubAorCitHRU5IRFJTPQlhaWNkYi5oICQoWVNSQ1M6Lnk9LmgpCitHRU5TUkNTPQkkKFlTUkNTOi55PS5jKSAkKExTUkNTOi5sPS5jKQorCitTUkNTPQkke0NTUkNTfSAke0dFTlNSQ1N9CitMSUJTPQktbGRiCitjbGVhbi1maWxlczo9ICR7R0VOU1JDU30gJHtHRU5IRFJTfSAkKFlTUkNTOi55PS5vdXRwdXQpICQoUFJPRykKKyMgT3ZlcnJpZGUgZGVmYXVsdCBrZXJuZWwgQ0ZMQUdTLiAgVGhpcyBpcyBhIHVzZXJsYW5kIGFwcC4KK0FJQ0FTTV9DRkxBR1M6PSAtSS91c3IvaW5jbHVkZSAtSS4KK1lGTEFHUz0gLWQKKworTk9NQU49CW5vbWFuCisKK2lmbmVxICgkKEhPU1RDQyksKQorQUlDQVNNX0NDPSAkKEhPU1RDQykKK2Vsc2UKK0FJQ0FTTV9DQz0gJChDQykKK2VuZGlmCisKK2lmZGVmIERFQlVHCitDRkxBR1MrPSAtRERFQlVHIC1nCitZRkxBR1MrPSAtdCAtdgorTEZMQUdTPSAtZAorZW5kaWYKKworJChQUk9HKTogICR7R0VOSERSU30gJChTUkNTKQorCSQoQUlDQVNNX0NDKSAkKEFJQ0FTTV9DRkxBR1MpICQoU1JDUykgLW8gJChQUk9HKSAkKExJQlMpCisKK2FpY2RiLmg6CisJQGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjQvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiNC9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjMvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiMy9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjIvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiMi9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYjEvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiMS9kYl8xODUuaD4iID4gYWljZGIuaDsJXAorCSBlbGlmIFsgLWUgIi91c3IvaW5jbHVkZS9kYi9kYl8xODUuaCIgXTsgdGhlbgkJXAorCQllY2hvICIjaW5jbHVkZSA8ZGIvZGJfMTg1Lmg+IiA+IGFpY2RiLmg7CVwKKwkgZWxpZiBbIC1lICIvdXNyL2luY2x1ZGUvZGJfMTg1LmgiIF07IHRoZW4JCVwKKwkJZWNobyAiI2luY2x1ZGUgPGRiXzE4NS5oPiIgPiBhaWNkYi5oOwkJXAorCSBlbHNlCQkJCQkJCVwKKwkJZWNobyAiKioqIEluc3RhbGwgZGIgZGV2ZWxvcG1lbnQgbGlicmFyaWVzIjsJXAorCSBmaQorCitjbGVhbjoKKwlybSAtZiAkKGNsZWFuLWZpbGVzKQorCisjIENyZWF0ZSBhIGRlcGVuZGVuY3kgY2hhaW4gaW4gZ2VuZXJhdGVkIGZpbGVzCisjIHRvIGF2b2lkIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlIHNpbmdsZQorIyBydWxlIHRoYXQgYnVpbGRzIHRoZW0gYWxsLgorYWljYXNtX2dyYW0uYzogYWljYXNtX2dyYW0uaAorYWljYXNtX2dyYW0uYyBhaWNhc21fZ3JhbS5oOiBhaWNhc21fZ3JhbS55CisJJChZQUNDKSAkKFlGTEFHUykgLWIgJCg8Oi55PSkgJDwKKwltdiAkKDw6Lnk9KS50YWIuYyAkKDw6Lnk9LmMpCisJbXYgJCg8Oi55PSkudGFiLmggJCg8Oi55PS5oKQorCisjIENyZWF0ZSBhIGRlcGVuZGVuY3kgY2hhaW4gaW4gZ2VuZXJhdGVkIGZpbGVzCisjIHRvIGF2b2lkIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlIHNpbmdsZQorIyBydWxlIHRoYXQgYnVpbGRzIHRoZW0gYWxsLgorYWljYXNtX21hY3JvX2dyYW0uYzogYWljYXNtX21hY3JvX2dyYW0uaAorYWljYXNtX21hY3JvX2dyYW0uYyBhaWNhc21fbWFjcm9fZ3JhbS5oOiBhaWNhc21fbWFjcm9fZ3JhbS55CisJJChZQUNDKSAkKFlGTEFHUykgLWIgJCg8Oi55PSkgLXAgbW0gJDwKKwltdiAkKDw6Lnk9KS50YWIuYyAkKDw6Lnk9LmMpCisJbXYgJCg8Oi55PSkudGFiLmggJCg8Oi55PS5oKQorCithaWNhc21fc2Nhbi5jOiBhaWNhc21fc2Nhbi5sCisJJChMRVgpICQoTEZMQUdTKSAtbyRAICQ8CisKK2FpY2FzbV9tYWNyb19zY2FuLmM6IGFpY2FzbV9tYWNyb19zY2FuLmwKKwkkKExFWCkgJChMRkxBR1MpIC1QbW0gLW8kQCAkPApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDYzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtLmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiBBaWM3eHh4IFNDU0kgaG9zdCBhZGFwdGVyIGZpcm13YXJlIGFzc3NlbWJsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbS5jIzIyICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiBsaW51eAorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX2luc2Zvcm1hdC5oIgorCit0eXBlZGVmIHN0cnVjdCBwYXRjaCB7CisJU1RBSUxRX0VOVFJZKHBhdGNoKSBsaW5rczsKKwlpbnQJCXBhdGNoX2Z1bmM7CisJdV9pbnQJCWJlZ2luOworCXVfaW50CQlza2lwX2luc3RyOworCXVfaW50CQlza2lwX3BhdGNoOworfSBwYXRjaF90OworCitTVEFJTFFfSEVBRChwYXRjaF9saXN0LCBwYXRjaCkgcGF0Y2hlczsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCBiYWNrX3BhdGNoKHZvaWQpOworc3RhdGljIHZvaWQgb3V0cHV0X2NvZGUodm9pZCk7CitzdGF0aWMgdm9pZCBvdXRwdXRfbGlzdGluZyhjaGFyICppZmlsZW5hbWUpOworc3RhdGljIHZvaWQgZHVtcF9zY29wZShzY29wZV90ICpzY29wZSk7CitzdGF0aWMgdm9pZCBlbWl0X3BhdGNoKHNjb3BlX3QgKnNjb3BlLCBpbnQgcGF0Y2gpOworc3RhdGljIGludCBjaGVja19wYXRjaChwYXRjaF90ICoqc3RhcnRfcGF0Y2gsIGludCBzdGFydF9pbnN0ciwKKwkJICAgICAgIGludCAqc2tpcF9hZGRyLCBpbnQgKmZ1bmNfdmFscyk7CisKK3N0cnVjdCBwYXRoX2xpc3Qgc2VhcmNoX3BhdGg7CitpbnQgaW5jbHVkZXNfc2VhcmNoX2N1cmRpcjsKK2NoYXIgKmFwcG5hbWU7CitjaGFyICpzdG9ja19pbmNsdWRlX2ZpbGU7CitGSUxFICpvZmlsZTsKK2NoYXIgKm9maWxlbmFtZTsKK2NoYXIgKnJlZ2ZpbGVuYW1lOworRklMRSAqcmVnZmlsZTsKK2NoYXIgKmxpc3RmaWxlbmFtZTsKK0ZJTEUgKmxpc3RmaWxlOworY2hhciAqcmVnZGlhZ2ZpbGVuYW1lOworRklMRSAqcmVnZGlhZ2ZpbGU7CitpbnQgICBzcmNfbW9kZTsKK2ludCAgIGRzdF9tb2RlOworCitzdGF0aWMgU1RBSUxRX0hFQUQoLGluc3RydWN0aW9uKSBzZXFfcHJvZ3JhbTsKK3N0cnVjdCBjc190YWlscSBjc190YWlscTsKK3N0cnVjdCBzY29wZV9saXN0IHNjb3BlX3N0YWNrOworc3ltbGlzdF90IHBhdGNoX2Z1bmN0aW9uczsKKworI2lmIERFQlVHCitleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CitleHRlcm4gaW50IG1tX2ZsZXhfZGVidWc7CitleHRlcm4gaW50IHl5ZGVidWc7CitleHRlcm4gaW50IG1tZGVidWc7CisjZW5kaWYKK2V4dGVybiBGSUxFICp5eWluOworZXh0ZXJuIGludCB5eXBhcnNlKHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZDsKKwlpbnQgIGNoOworCWludCAgcmV0dmFsOworCWNoYXIgKmlucHV0ZmlsZW5hbWU7CisJc2NvcGVfdCAqc2VudGluYWw7CisKKwlTVEFJTFFfSU5JVCgmcGF0Y2hlcyk7CisJU0xJU1RfSU5JVCgmc2VhcmNoX3BhdGgpOworCVNUQUlMUV9JTklUKCZzZXFfcHJvZ3JhbSk7CisJVEFJTFFfSU5JVCgmY3NfdGFpbHEpOworCVNMSVNUX0lOSVQoJnNjb3BlX3N0YWNrKTsKKworCS8qIFNldCBTZW50aW5hbCBzY29wZSBub2RlICovCisJc2VudGluYWwgPSBzY29wZV9hbGxvYygpOworCXNlbnRpbmFsLT50eXBlID0gU0NPUEVfUk9PVDsKKwkKKwlpbmNsdWRlc19zZWFyY2hfY3VyZGlyID0gMTsKKwlhcHBuYW1lID0gKmFyZ3Y7CisJcmVnZmlsZSA9IE5VTEw7CisJbGlzdGZpbGUgPSBOVUxMOworI2lmIERFQlVHCisJeXlfZmxleF9kZWJ1ZyA9IDA7CisJbW1fZmxleF9kZWJ1ZyA9IDA7CisJeXlkZWJ1ZyA9IDA7CisJbW1kZWJ1ZyA9IDA7CisjZW5kaWYKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkOmk6bDpuOm86cDpyOkk6IikpICE9IC0xKSB7CisJCXN3aXRjaChjaCkgeworCQljYXNlICdkJzoKKyNpZiBERUJVRworCQkJaWYgKHN0cmNtcChvcHRhcmcsICJzIikgPT0gMCkgeworCQkJCXl5X2ZsZXhfZGVidWcgPSAxOworCQkJCW1tX2ZsZXhfZGVidWcgPSAxOworCQkJfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAicCIpID09IDApIHsKKwkJCQl5eWRlYnVnID0gMTsKKwkJCQltbWRlYnVnID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogLWQgUmVxdWlyZXMgZWl0aGVyIGFuICIKKwkJCQkJIidzJyBvciAncCcgYXJndW1lbnRcbiIsIGFwcG5hbWUpOworCQkJCXVzYWdlKCk7CisJCQl9CisjZWxzZQorCQkJc3RvcCgiLWQ6IEFzc2VtYmxlciBub3QgYnVpbHQgd2l0aCBkZWJ1Z2dpbmcgIgorCQkJICAgICAiaW5mb3JtYXRpb24iLCBFWF9TT0ZUV0FSRSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXN0b2NrX2luY2x1ZGVfZmlsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCS8qIENyZWF0ZSBhIHByb2dyYW0gbGlzdGluZyAqLworCQkJaWYgKChsaXN0ZmlsZSA9IGZvcGVuKG9wdGFyZywgInciKSkgPT0gTlVMTCkgeworCQkJCXBlcnJvcihvcHRhcmcpOworCQkJCXN0b3AoTlVMTCwgRVhfQ0FOVENSRUFUKTsKKwkJCX0KKwkJCWxpc3RmaWxlbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCS8qIERvbid0IGNvbXBsYWluIGFib3V0IHRoZSAtbm9zdGRpbmMgZGlyZWN0cml2ZSAqLworCQkJaWYgKHN0cmNtcChvcHRhcmcsICJvc3RkaW5jIikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBVbmtub3duIG9wdGlvbiAtJWMlc1xuIiwKKwkJCQkJYXBwbmFtZSwgY2gsIG9wdGFyZyk7CisJCQkJdXNhZ2UoKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlpZiAoKG9maWxlID0gZm9wZW4ob3B0YXJnLCAidyIpKSA9PSBOVUxMKSB7CisJCQkJcGVycm9yKG9wdGFyZyk7CisJCQkJc3RvcChOVUxMLCBFWF9DQU5UQ1JFQVQpOworCQkJfQorCQkJb2ZpbGVuYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJLyogQ3JlYXRlIFJlZ2lzdGVyIERpYWdub3N0aWMgInByaW50aW5nIiBGdW5jdGlvbnMgKi8KKwkJCWlmICgocmVnZGlhZ2ZpbGUgPSBmb3BlbihvcHRhcmcsICJ3IikpID09IE5VTEwpIHsKKwkJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCQlzdG9wKE5VTEwsIEVYX0NBTlRDUkVBVCk7CisJCQl9CisJCQlyZWdkaWFnZmlsZW5hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlpZiAoKHJlZ2ZpbGUgPSBmb3BlbihvcHRhcmcsICJ3IikpID09IE5VTEwpIHsKKwkJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCQlzdG9wKE5VTEwsIEVYX0NBTlRDUkVBVCk7CisJCQl9CisJCQlyZWdmaWxlbmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJeworCQkJcGF0aF9lbnRyeV90IGluY2x1ZGVfZGlyOworCisJCQlpZiAoc3RyY21wKG9wdGFyZywgIi0iKSA9PSAwKSB7CisJCQkJaWYgKGluY2x1ZGVzX3NlYXJjaF9jdXJkaXIgPT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBXYXJuaW5nIC0gJy1JLScgIgorCQkJCQkJCSJzcGVjaWZpZWQgbXVsdGlwbGUgIgorCQkJCQkJCSJ0aW1lc1xuIiwgYXBwbmFtZSk7CisJCQkJfQorCQkJCWluY2x1ZGVzX3NlYXJjaF9jdXJkaXIgPSAwOworCQkJCWZvciAoaW5jbHVkZV9kaXIgPSBTTElTVF9GSVJTVCgmc2VhcmNoX3BhdGgpOworCQkJCSAgICAgaW5jbHVkZV9kaXIgIT0gTlVMTDsKKwkJCQkgICAgIGluY2x1ZGVfZGlyID0gU0xJU1RfTkVYVChpbmNsdWRlX2RpciwKKwkJCQkJCQkgICAgICBsaW5rcykpCisJCQkJCS8qCisJCQkJCSAqIEFsbCBlbnRyaWVzIGJlZm9yZSBhICctSS0nIG9ubHkKKwkJCQkJICogYXBwbHkgdG8gaW5jbHVkZXMgc3BlY2lmaWVkIHdpdGgKKwkJCQkJICogcXVvdGVzIGluc3RlYWQgb2YgIjw+Ii4KKwkJCQkJICovCisJCQkJCWluY2x1ZGVfZGlyLT5xdW90ZWRfaW5jbHVkZXNfb25seSA9IDE7CisJCQl9IGVsc2UgeworCQkJCWluY2x1ZGVfZGlyID0KKwkJCQkgICAgKHBhdGhfZW50cnlfdCltYWxsb2Moc2l6ZW9mKCppbmNsdWRlX2RpcikpOworCQkJCWlmIChpbmNsdWRlX2RpciA9PSBOVUxMKSB7CisJCQkJCXBlcnJvcihvcHRhcmcpOworCQkJCQlzdG9wKE5VTEwsIEVYX09TRVJSKTsKKwkJCQl9CisJCQkJaW5jbHVkZV9kaXItPmRpcmVjdG9yeSA9IHN0cmR1cChvcHRhcmcpOworCQkJCWlmIChpbmNsdWRlX2Rpci0+ZGlyZWN0b3J5ID09IE5VTEwpIHsKKwkJCQkJcGVycm9yKG9wdGFyZyk7CisJCQkJCXN0b3AoTlVMTCwgRVhfT1NFUlIpOworCQkJCX0KKwkJCQlpbmNsdWRlX2Rpci0+cXVvdGVkX2luY2x1ZGVzX29ubHkgPSAwOworCQkJCVNMSVNUX0lOU0VSVF9IRUFEKCZzZWFyY2hfcGF0aCwgaW5jbHVkZV9kaXIsCisJCQkJCQkgIGxpbmtzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJz8nOgorCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmdjICE9IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogTm8gaW5wdXQgZmlsZSBzcGVjaWZpbGVkXG4iLCBhcHBuYW1lKTsKKwkJdXNhZ2UoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWlmIChyZWdkaWFnZmlsZSAhPSBOVUxMCisJICYmIChyZWdmaWxlID09IE5VTEwgfHwgc3RvY2tfaW5jbHVkZV9maWxlID09IE5VTEwpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIiVzOiBUaGUgLXAgb3B0aW9uIHJlcXVpcmVzIHRoZSAtciBhbmQgLWkgb3B0aW9ucy5cbiIsCisJCQlhcHBuYW1lKTsKKwkJdXNhZ2UoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlzeW10YWJsZV9vcGVuKCk7CisJaW5wdXRmaWxlbmFtZSA9ICphcmd2OworCWluY2x1ZGVfZmlsZSgqYXJndiwgU09VUkNFX0ZJTEUpOworCXJldHZhbCA9IHl5cGFyc2UoKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJaWYgKFNMSVNUX0ZJUlNUKCZzY29wZV9zdGFjaykgPT0gTlVMTAorCQkgfHwgU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKS0+dHlwZSAhPSBTQ09QRV9ST09UKSB7CisJCQlzdG9wKCJVbnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiIsIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisKKwkJLyogUHJvY2VzcyBvdXRtb3N0IHNjb3BlICovCisJCXByb2Nlc3Nfc2NvcGUoU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKSk7CisJCS8qCisJCSAqIERlY2VuZCB0aGUgdHJlZSBvZiBzY29wZXMgYW5kIGluc2VydC9lbWl0CisJCSAqIHBhdGNoZXMgYXMgYXBwcm9wcmlhdGUuICBXZSBwZXJmb3JtIGEgZGVwdGggZmlyc3QKKwkJICogdHJhbnZlcnNhbCwgcmVjdXJzaXZlbHkgaGFuZGxpbmcgZWFjaCBzY29wZS4KKwkJICovCisJCS8qIHN0YXJ0IGF0IHRoZSByb290IHNjb3BlICovCisJCWR1bXBfc2NvcGUoU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKSk7CisKKwkJLyogUGF0Y2ggdXAgZm9yd2FyZCBqdW1wIGFkZHJlc3NlcyAqLworCQliYWNrX3BhdGNoKCk7CisKKwkJaWYgKG9maWxlICE9IE5VTEwpCisJCQlvdXRwdXRfY29kZSgpOworCQlpZiAocmVnZmlsZSAhPSBOVUxMKQorCQkJc3ltdGFibGVfZHVtcChyZWdmaWxlLCByZWdkaWFnZmlsZSk7CisJCWlmIChsaXN0ZmlsZSAhPSBOVUxMKQorCQkJb3V0cHV0X2xpc3RpbmcoaW5wdXRmaWxlbmFtZSk7CisJfQorCisJc3RvcChOVUxMLCAwKTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKCkKK3sKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLAorInVzYWdlOiAlLTE2cyBbLW5vc3RkaW5jXSBbLUktXSBbLUkgZGlyZWN0b3J5XSBbLW8gb3V0cHV0X2ZpbGVdXG4iCisiCVstciByZWdpc3Rlcl9vdXRwdXRfZmlsZSBbLXAgcmVnaXN0ZXJfZGlhZ19maWxlIC1pIGluY2x1ZGVmaWxlXV1cbiIKKyIJWy1sIHByb2dyYW1fbGlzdF9maWxlXVxuIgorIglpbnB1dF9maWxlXG4iLCBhcHBuYW1lKTsKKwlleGl0KEVYX1VTQUdFKTsKK30KKworc3RhdGljIHZvaWQKK2JhY2tfcGF0Y2goKQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqY3VyX2luc3RyOworCisJZm9yIChjdXJfaW5zdHIgPSBTVEFJTFFfRklSU1QoJnNlcV9wcm9ncmFtKTsKKwkgICAgIGN1cl9pbnN0ciAhPSBOVUxMOworCSAgICAgY3VyX2luc3RyID0gU1RBSUxRX05FWFQoY3VyX2luc3RyLCBsaW5rcykpIHsKKwkJaWYgKGN1cl9pbnN0ci0+cGF0Y2hfbGFiZWwgIT0gTlVMTCkgeworCQkJc3RydWN0IGluc19mb3JtYXQzICpmM19pbnN0cjsKKwkJCXVfaW50IGFkZHJlc3M7CisKKwkJCWlmIChjdXJfaW5zdHItPnBhdGNoX2xhYmVsLT50eXBlICE9IExBQkVMKSB7CisJCQkJY2hhciBidWZbMjU1XTsKKworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJCSAiVW5kZWZpbmVkIGxhYmVsICVzIiwKKwkJCQkJIGN1cl9pbnN0ci0+cGF0Y2hfbGFiZWwtPm5hbWUpOworCQkJCXN0b3AoYnVmLCBFWF9EQVRBRVJSKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCQlmM19pbnN0ciA9ICZjdXJfaW5zdHItPmZvcm1hdC5mb3JtYXQzOworCQkJYWRkcmVzcyA9IGYzX2luc3RyLT5hZGRyZXNzOworCQkJYWRkcmVzcyArPSBjdXJfaW5zdHItPnBhdGNoX2xhYmVsLT5pbmZvLmxpbmZvLT5hZGRyZXNzOworCQkJZjNfaW5zdHItPmFkZHJlc3MgPSBhZGRyZXNzOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorb3V0cHV0X2NvZGUoKQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqY3VyX2luc3RyOworCXBhdGNoX3QgKmN1cl9wYXRjaDsKKwljcml0aWNhbF9zZWN0aW9uX3QgKmNzOworCXN5bWJvbF9ub2RlX3QgKmN1cl9ub2RlOworCWludCBpbnN0cmNvdW50OworCisJaW5zdHJjb3VudCA9IDA7CisJZnByaW50ZihvZmlsZSwKKyIvKlxuIgorIiAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkXG4iCisiICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOlxuIgorIiAqXG4iCisiJXMgKi9cbiIsIHZlcnNpb25zKTsKKworCWZwcmludGYob2ZpbGUsICJzdGF0aWMgdWludDhfdCBzZXFwcm9nW10gPSB7XG4iKTsKKwlmb3IgKGN1cl9pbnN0ciA9IFNUQUlMUV9GSVJTVCgmc2VxX3Byb2dyYW0pOworCSAgICAgY3VyX2luc3RyICE9IE5VTEw7CisJICAgICBjdXJfaW5zdHIgPSBTVEFJTFFfTkVYVChjdXJfaW5zdHIsIGxpbmtzKSkgeworCisJCWZwcmludGYob2ZpbGUsICIlc1x0MHglMDJ4LCAweCUwMngsIDB4JTAyeCwgMHglMDJ4IiwKKwkJCWN1cl9pbnN0ciA9PSBTVEFJTFFfRklSU1QoJnNlcV9wcm9ncmFtKSA/ICIiIDogIixcbiIsCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1swXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzFdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMl0sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1szXSk7CisjZWxzZQorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbM10sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1syXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzFdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMF0pOworI2VuZGlmCisJCWluc3RyY291bnQrKzsKKwl9CisJZnByaW50ZihvZmlsZSwgIlxufTtcblxuIik7CisKKwlpZiAocGF0Y2hfYXJnX2xpc3QgPT0gTlVMTCkKKwkJc3RvcCgiUGF0Y2ggYXJndW1lbnQgbGlzdCBub3QgZGVmaW5lZCIsCisJCSAgICAgRVhfREFUQUVSUik7CisKKwkvKgorCSAqICBPdXRwdXQgcGF0Y2ggaW5mb3JtYXRpb24uICBQYXRjaCBmdW5jdGlvbnMgZmlyc3QuCisJICovCisJZnByaW50ZihvZmlsZSwKKyJ0eXBlZGVmIGludCAlc3BhdGNoX2Z1bmNfdCAoJXMpO1xuIiwgcHJlZml4LCBwYXRjaF9hcmdfbGlzdCk7CisKKwlmb3IgKGN1cl9ub2RlID0gU0xJU1RfRklSU1QoJnBhdGNoX2Z1bmN0aW9ucyk7CisJICAgICBjdXJfbm9kZSAhPSBOVUxMOworCSAgICAgY3VyX25vZGUgPSBTTElTVF9ORVhUKGN1cl9ub2RlLGxpbmtzKSkgeworCQlmcHJpbnRmKG9maWxlLAorInN0YXRpYyAlc3BhdGNoX2Z1bmNfdCAlc3BhdGNoJWRfZnVuYztcbiIKKyJcbiIKKyJzdGF0aWMgaW50XG4iCisiJXNwYXRjaCVkX2Z1bmMoJXMpXG4iCisie1xuIgorIglyZXR1cm4gKCVzKTtcbiIKKyJ9XG5cbiIsCisJCQlwcmVmaXgsCisJCQlwcmVmaXgsCisJCQljdXJfbm9kZS0+c3ltYm9sLT5pbmZvLmNvbmRpbmZvLT5mdW5jX251bSwKKwkJCXByZWZpeCwKKwkJCWN1cl9ub2RlLT5zeW1ib2wtPmluZm8uY29uZGluZm8tPmZ1bmNfbnVtLAorCQkJcGF0Y2hfYXJnX2xpc3QsCisJCQljdXJfbm9kZS0+c3ltYm9sLT5uYW1lKTsKKwl9CisKKwlmcHJpbnRmKG9maWxlLAorInN0YXRpYyBzdHJ1Y3QgcGF0Y2gge1xuIgorIgklc3BhdGNoX2Z1bmNfdAkJKnBhdGNoX2Z1bmM7XG4iCisiCXVpbnQzMl90CQkgYmVnaW4JCToxMCxcbiIKKyIJCQkJIHNraXBfaW5zdHIJOjEwLFxuIgorIgkJCQkgc2tpcF9wYXRjaAk6MTI7XG4iCisifSBwYXRjaGVzW10gPSB7XG4iLCBwcmVmaXgpOworCisJZm9yIChjdXJfcGF0Y2ggPSBTVEFJTFFfRklSU1QoJnBhdGNoZXMpOworCSAgICAgY3VyX3BhdGNoICE9IE5VTEw7CisJICAgICBjdXJfcGF0Y2ggPSBTVEFJTFFfTkVYVChjdXJfcGF0Y2gsbGlua3MpKSB7CisJCWZwcmludGYob2ZpbGUsICIlc1x0eyAlc3BhdGNoJWRfZnVuYywgJWQsICVkLCAlZCB9IiwKKwkJCWN1cl9wYXRjaCA9PSBTVEFJTFFfRklSU1QoJnBhdGNoZXMpID8gIiIgOiAiLFxuIiwKKwkJCXByZWZpeCwKKwkJCWN1cl9wYXRjaC0+cGF0Y2hfZnVuYywgY3VyX3BhdGNoLT5iZWdpbiwKKwkJCWN1cl9wYXRjaC0+c2tpcF9pbnN0ciwgY3VyX3BhdGNoLT5za2lwX3BhdGNoKTsKKwl9CisKKwlmcHJpbnRmKG9maWxlLCAiXG59O1xuXG4iKTsKKworCWZwcmludGYob2ZpbGUsCisic3RhdGljIHN0cnVjdCBjcyB7XG4iCisiCXVpbnQxNl90CWJlZ2luO1xuIgorIgl1aW50MTZfdAllbmQ7XG4iCisifSBjcml0aWNhbF9zZWN0aW9uc1tdID0ge1xuIik7CisKKwlmb3IgKGNzID0gVEFJTFFfRklSU1QoJmNzX3RhaWxxKTsKKwkgICAgIGNzICE9IE5VTEw7CisJICAgICBjcyA9IFRBSUxRX05FWFQoY3MsIGxpbmtzKSkgeworCQlmcHJpbnRmKG9maWxlLCAiJXNcdHsgJWQsICVkIH0iLAorCQkJY3MgPT0gVEFJTFFfRklSU1QoJmNzX3RhaWxxKSA/ICIiIDogIixcbiIsCisJCQljcy0+YmVnaW5fYWRkciwgY3MtPmVuZF9hZGRyKTsKKwl9CisKKwlmcHJpbnRmKG9maWxlLCAiXG59O1xuXG4iKTsKKworCWZwcmludGYob2ZpbGUsCisic3RhdGljIGNvbnN0IGludCBudW1fY3JpdGljYWxfc2VjdGlvbnMgPSBzaXplb2YoY3JpdGljYWxfc2VjdGlvbnMpXG4iCisiCQkJCSAgICAgICAvIHNpemVvZigqY3JpdGljYWxfc2VjdGlvbnMpO1xuIik7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlZCBpbnN0cnVjdGlvbnMgdXNlZFxuIiwgYXBwbmFtZSwgaW5zdHJjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3Njb3BlKHNjb3BlX3QgKnNjb3BlKQoreworCXNjb3BlX3QgKmN1cl9zY29wZTsKKworCS8qCisJICogRW1pdCB0aGUgZmlyc3QgcGF0Y2ggZm9yIHRoaXMgc2NvcGUKKwkgKi8KKwllbWl0X3BhdGNoKHNjb3BlLCAwKTsKKworCS8qCisJICogRHVtcCBlYWNoIHNjb3BlIHdpdGhpbiB0aGlzIG9uZS4KKwkgKi8KKwljdXJfc2NvcGUgPSBUQUlMUV9GSVJTVCgmc2NvcGUtPmlubmVyX3Njb3BlKTsKKworCXdoaWxlIChjdXJfc2NvcGUgIT0gTlVMTCkgeworCisJCWR1bXBfc2NvcGUoY3VyX3Njb3BlKTsKKworCQljdXJfc2NvcGUgPSBUQUlMUV9ORVhUKGN1cl9zY29wZSwgc2NvcGVfbGlua3MpOworCX0KKworCS8qCisJICogRW1pdCB0aGUgc2Vjb25kLCBjbG9zaW5nLCBwYXRjaCBmb3IgdGhpcyBzY29wZQorCSAqLworCWVtaXRfcGF0Y2goc2NvcGUsIDEpOworfQorCit2b2lkCitlbWl0X3BhdGNoKHNjb3BlX3QgKnNjb3BlLCBpbnQgcGF0Y2gpCit7CisJcGF0Y2hfaW5mb190ICpwaW5mbzsKKwlwYXRjaF90ICpuZXdfcGF0Y2g7CisKKwlwaW5mbyA9ICZzY29wZS0+cGF0Y2hlc1twYXRjaF07CisKKwlpZiAocGluZm8tPnNraXBfaW5zdHIgPT0gMCkKKwkJLyogTm8tT3AgcGF0Y2ggKi8KKwkJcmV0dXJuOworCisJbmV3X3BhdGNoID0gKHBhdGNoX3QgKiltYWxsb2Moc2l6ZW9mKCpuZXdfcGF0Y2gpKTsKKworCWlmIChuZXdfcGF0Y2ggPT0gTlVMTCkKKwkJc3RvcCgiQ291bGQgbm90IG1hbGxvYyBwYXRjaCBzdHJ1Y3R1cmUiLCBFWF9PU0VSUik7CisKKwltZW1zZXQobmV3X3BhdGNoLCAwLCBzaXplb2YoKm5ld19wYXRjaCkpOworCisJaWYgKHBhdGNoID09IDApIHsKKwkJbmV3X3BhdGNoLT5wYXRjaF9mdW5jID0gc2NvcGUtPmZ1bmNfbnVtOworCQluZXdfcGF0Y2gtPmJlZ2luID0gc2NvcGUtPmJlZ2luX2FkZHI7CisJfSBlbHNlIHsKKwkJbmV3X3BhdGNoLT5wYXRjaF9mdW5jID0gMDsKKwkJbmV3X3BhdGNoLT5iZWdpbiA9IHNjb3BlLT5lbmRfYWRkcjsKKwl9CisJbmV3X3BhdGNoLT5za2lwX2luc3RyID0gcGluZm8tPnNraXBfaW5zdHI7CisJbmV3X3BhdGNoLT5za2lwX3BhdGNoID0gcGluZm8tPnNraXBfcGF0Y2g7CisJU1RBSUxRX0lOU0VSVF9UQUlMKCZwYXRjaGVzLCBuZXdfcGF0Y2gsIGxpbmtzKTsKK30KKwordm9pZAorb3V0cHV0X2xpc3RpbmcoY2hhciAqaWZpbGVuYW1lKQoreworCWNoYXIgYnVmWzEwMjRdOworCUZJTEUgKmlmaWxlOworCXN0cnVjdCBpbnN0cnVjdGlvbiAqY3VyX2luc3RyOworCXBhdGNoX3QgKmN1cl9wYXRjaDsKKwlzeW1ib2xfbm9kZV90ICpjdXJfZnVuYzsKKwlpbnQgKmZ1bmNfdmFsdWVzOworCWludCBpbnN0cmNvdW50OworCWludCBpbnN0cnB0cjsKKwlpbnQgbGluZTsKKwlpbnQgZnVuY19jb3VudDsKKwlpbnQgc2tpcF9hZGRyOworCisJaW5zdHJjb3VudCA9IDA7CisJaW5zdHJwdHIgPSAwOworCWxpbmUgPSAxOworCXNraXBfYWRkciA9IDA7CisJaWYgKChpZmlsZSA9IGZvcGVuKGlmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlwZXJyb3IoaWZpbGVuYW1lKTsKKwkJc3RvcChOVUxMLCBFWF9EQVRBRVJSKTsKKwl9CisKKwkvKgorCSAqIERldGVybWluZSB3aGljaCBvcHRpb25zIHRvIGFwcGx5IHRvIHRoaXMgbGlzdGluZy4KKwkgKi8KKwlmb3IgKGZ1bmNfY291bnQgPSAwLCBjdXJfZnVuYyA9IFNMSVNUX0ZJUlNUKCZwYXRjaF9mdW5jdGlvbnMpOworCSAgICBjdXJfZnVuYyAhPSBOVUxMOworCSAgICBjdXJfZnVuYyA9IFNMSVNUX05FWFQoY3VyX2Z1bmMsIGxpbmtzKSkKKwkJZnVuY19jb3VudCsrOworCisJZnVuY192YWx1ZXMgPSBOVUxMOworCWlmIChmdW5jX2NvdW50ICE9IDApIHsKKwkJZnVuY192YWx1ZXMgPSAoaW50ICopbWFsbG9jKGZ1bmNfY291bnQgKiBzaXplb2YoaW50KSk7CisKKwkJaWYgKGZ1bmNfdmFsdWVzID09IE5VTEwpCisJCQlzdG9wKCJDb3VsZCBub3QgbWFsbG9jIiwgRVhfT1NFUlIpOworCQkKKwkJZnVuY192YWx1ZXNbMF0gPSAwOyAvKiBGQUxTRSBmdW5jICovCisJCWZ1bmNfY291bnQtLTsKKworCQkvKgorCQkgKiBBc2sgdGhlIHVzZXIgdG8gZmlsbCBpbiB0aGUgcmV0dXJuIHZhbHVlcyBmb3IKKwkJICogdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9ucy4KKwkJICovCisJCQorCQkKKwkJZm9yIChjdXJfZnVuYyA9IFNMSVNUX0ZJUlNUKCZwYXRjaF9mdW5jdGlvbnMpOworCQkgICAgIGN1cl9mdW5jICE9IE5VTEwgJiYgU0xJU1RfTkVYVChjdXJfZnVuYywgbGlua3MpICE9IE5VTEw7CisJCSAgICAgY3VyX2Z1bmMgPSBTTElTVF9ORVhUKGN1cl9mdW5jLCBsaW5rcyksIGZ1bmNfY291bnQtLSkgeworCQkJaW50IGlucHV0OworCQkJCisJCQlmcHJpbnRmKHN0ZG91dCwgIlxuKCVzKVxuIiwgY3VyX2Z1bmMtPnN5bWJvbC0+bmFtZSk7CisJCQlmcHJpbnRmKHN0ZG91dCwKKwkJCQkiRW50ZXIgdGhlIHJldHVybiB2YWx1ZSBmb3IgIgorCQkJCSJ0aGlzIGV4cHJlc3Npb25bVC9GXToiKTsKKworCQkJd2hpbGUgKDEpIHsKKworCQkJCWlucHV0ID0gZ2V0Y2hhcigpOworCQkJCWlucHV0ID0gdG91cHBlcihpbnB1dCk7CisKKwkJCQlpZiAoaW5wdXQgPT0gJ1QnKSB7CisJCQkJCWZ1bmNfdmFsdWVzW2Z1bmNfY291bnRdID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChpbnB1dCA9PSAnRicpIHsKKwkJCQkJZnVuY192YWx1ZXNbZnVuY19jb3VudF0gPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXNhdHR5KGZpbGVubyhzdGRpbikpID09IDApCisJCQkJcHV0Y2hhcihpbnB1dCk7CisJCX0KKwkJZnByaW50ZihzdGRvdXQsICJcblRoYW5rcyFcbiIpOworCX0KKworCS8qIE5vdyBvdXRwdXQgdGhlIGxpc3RpbmcgKi8KKwljdXJfcGF0Y2ggPSBTVEFJTFFfRklSU1QoJnBhdGNoZXMpOworCWZvciAoY3VyX2luc3RyID0gU1RBSUxRX0ZJUlNUKCZzZXFfcHJvZ3JhbSk7CisJICAgICBjdXJfaW5zdHIgIT0gTlVMTDsKKwkgICAgIGN1cl9pbnN0ciA9IFNUQUlMUV9ORVhUKGN1cl9pbnN0ciwgbGlua3MpLCBpbnN0cmNvdW50KyspIHsKKworCQlpZiAoY2hlY2tfcGF0Y2goJmN1cl9wYXRjaCwgaW5zdHJjb3VudCwKKwkJCQkmc2tpcF9hZGRyLCBmdW5jX3ZhbHVlcykgPT0gMCkgeworCQkJLyogRG9uJ3QgY291bnQgdGhpcyBpbnN0cnVjdGlvbiBhcyBpdCBpcyBpbiBhIHBhdGNoCisJCQkgKiB0aGF0IHdhcyByZW1vdmVkLgorCQkJICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkJfQorCisJCXdoaWxlIChsaW5lIDwgY3VyX2luc3RyLT5zcmNsaW5lKSB7CisJCQlmZ2V0cyhidWYsIHNpemVvZihidWYpLCBpZmlsZSk7CisJCQkJZnByaW50ZihsaXN0ZmlsZSwgIlx0XHQlcyIsIGJ1Zik7CisJCQkJbGluZSsrOworCQl9CisJCWZwcmludGYobGlzdGZpbGUsICIlMDN4ICUwMnglMDJ4JTAyeCUwMngiLCBpbnN0cnB0ciwKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzBdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMV0sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1syXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzNdKTsKKyNlbHNlCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1szXSwKKwkJCWN1cl9pbnN0ci0+Zm9ybWF0LmJ5dGVzWzJdLAorCQkJY3VyX2luc3RyLT5mb3JtYXQuYnl0ZXNbMV0sCisJCQljdXJfaW5zdHItPmZvcm1hdC5ieXRlc1swXSk7CisjZW5kaWYKKwkJZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgaWZpbGUpOworCQlmcHJpbnRmKGxpc3RmaWxlLCAiXHQlcyIsIGJ1Zik7CisJCWxpbmUrKzsKKwkJaW5zdHJwdHIrKzsKKwl9CisJLyogRHVtcCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlICovCisJd2hpbGUoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgaWZpbGUpICE9IE5VTEwpCisJCWZwcmludGYobGlzdGZpbGUsICJcdFx0JXMiLCBidWYpOworCisJZmNsb3NlKGlmaWxlKTsKK30KKworc3RhdGljIGludAorY2hlY2tfcGF0Y2gocGF0Y2hfdCAqKnN0YXJ0X3BhdGNoLCBpbnQgc3RhcnRfaW5zdHIsCisJICAgIGludCAqc2tpcF9hZGRyLCBpbnQgKmZ1bmNfdmFscykKK3sKKwlwYXRjaF90ICpjdXJfcGF0Y2g7CisKKwljdXJfcGF0Y2ggPSAqc3RhcnRfcGF0Y2g7CisKKwl3aGlsZSAoY3VyX3BhdGNoICE9IE5VTEwgJiYgc3RhcnRfaW5zdHIgPT0gY3VyX3BhdGNoLT5iZWdpbikgeworCQlpZiAoZnVuY192YWxzW2N1cl9wYXRjaC0+cGF0Y2hfZnVuY10gPT0gMCkgeworCQkJaW50IHNraXA7CisKKwkJCS8qIFN0YXJ0IHJlamVjdGluZyBjb2RlICovCisJCQkqc2tpcF9hZGRyID0gc3RhcnRfaW5zdHIgKyBjdXJfcGF0Y2gtPnNraXBfaW5zdHI7CisJCQlmb3IgKHNraXAgPSBjdXJfcGF0Y2gtPnNraXBfcGF0Y2g7CisJCQkgICAgIHNraXAgPiAwICYmIGN1cl9wYXRjaCAhPSBOVUxMOworCQkJICAgICBza2lwLS0pCisJCQkJY3VyX3BhdGNoID0gU1RBSUxRX05FWFQoY3VyX3BhdGNoLCBsaW5rcyk7CisJCX0gZWxzZSB7CisJCQkvKiBBY2NlcHRlZCB0aGlzIHBhdGNoLiAgQWR2YW5jZSB0byB0aGUgbmV4dAorCQkJICogb25lIGFuZCB3YWl0IGZvciBvdXIgaW50cnVjdGlvbiBwb2ludGVyIHRvCisJCQkgKiBoaXQgdGhpcyBwb2ludC4KKwkJCSAqLworCQkJY3VyX3BhdGNoID0gU1RBSUxRX05FWFQoY3VyX3BhdGNoLCBsaW5rcyk7CisJCX0KKwl9CisKKwkqc3RhcnRfcGF0Y2ggPSBjdXJfcGF0Y2g7CisJaWYgKHN0YXJ0X2luc3RyIDwgKnNraXBfYWRkcikKKwkJLyogU3RpbGwgc2tpcHBpbmcgKi8KKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBQcmludCBvdXQgZXJyb3IgaW5mb3JtYXRpb24gaWYgYXBwcm9wcmlhdGUsIGFuZCBjbGVhbiB1cCBiZWZvcmUKKyAqIHRlcm1pbmF0aW5nIHRoZSBwcm9ncmFtLgorICovCit2b2lkCitzdG9wKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGVycl9jb2RlKQoreworCWlmIChzdHJpbmcgIT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBhcHBuYW1lKTsKKwkJaWYgKHl5ZmlsZW5hbWUgIT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJTdG9wcGVkIGF0IGZpbGUgJXMsIGxpbmUgJWQgLSAiLAorCQkJCXl5ZmlsZW5hbWUsIHl5bGluZW5vKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBzdHJpbmcpOworCX0KKworCWlmIChvZmlsZSAhPSBOVUxMKSB7CisJCWZjbG9zZShvZmlsZSk7CisJCWlmIChlcnJfY29kZSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZW1vdmluZyAlcyBkdWUgdG8gZXJyb3JcbiIsCisJCQkJYXBwbmFtZSwgb2ZpbGVuYW1lKTsKKwkJCXVubGluayhvZmlsZW5hbWUpOworCQl9CisJfQorCisJaWYgKHJlZ2ZpbGUgIT0gTlVMTCkgeworCQlmY2xvc2UocmVnZmlsZSk7CisJCWlmIChlcnJfY29kZSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZW1vdmluZyAlcyBkdWUgdG8gZXJyb3JcbiIsCisJCQkJYXBwbmFtZSwgcmVnZmlsZW5hbWUpOworCQkJdW5saW5rKHJlZ2ZpbGVuYW1lKTsKKwkJfQorCX0KKworCWlmIChsaXN0ZmlsZSAhPSBOVUxMKSB7CisJCWZjbG9zZShsaXN0ZmlsZSk7CisJCWlmIChlcnJfY29kZSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZW1vdmluZyAlcyBkdWUgdG8gZXJyb3JcbiIsCisJCQkJYXBwbmFtZSwgbGlzdGZpbGVuYW1lKTsKKwkJCXVubGluayhsaXN0ZmlsZW5hbWUpOworCQl9CisJfQorCisJc3ltbGlzdF9mcmVlKCZwYXRjaF9mdW5jdGlvbnMpOworCXN5bXRhYmxlX2Nsb3NlKCk7CisKKwlleGl0KGVycl9jb2RlKTsKK30KKworc3RydWN0IGluc3RydWN0aW9uICoKK3NlcV9hbGxvYygpCit7CisJc3RydWN0IGluc3RydWN0aW9uICpuZXdfaW5zdHI7CisKKwluZXdfaW5zdHIgPSAoc3RydWN0IGluc3RydWN0aW9uICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5zdHJ1Y3Rpb24pKTsKKwlpZiAobmV3X2luc3RyID09IE5VTEwpCisJCXN0b3AoIlVuYWJsZSB0byBtYWxsb2MgaW5zdHJ1Y3Rpb24gb2JqZWN0IiwgRVhfU09GVFdBUkUpOworCW1lbXNldChuZXdfaW5zdHIsIDAsIHNpemVvZigqbmV3X2luc3RyKSk7CisJU1RBSUxRX0lOU0VSVF9UQUlMKCZzZXFfcHJvZ3JhbSwgbmV3X2luc3RyLCBsaW5rcyk7CisJbmV3X2luc3RyLT5zcmNsaW5lID0geXlsaW5lbm87CisJcmV0dXJuIG5ld19pbnN0cjsKK30KKworY3JpdGljYWxfc2VjdGlvbl90ICoKK2NzX2FsbG9jKCkKK3sKKwljcml0aWNhbF9zZWN0aW9uX3QgKm5ld19jczsKKworCW5ld19jcz0gKGNyaXRpY2FsX3NlY3Rpb25fdCAqKW1hbGxvYyhzaXplb2YoY3JpdGljYWxfc2VjdGlvbl90KSk7CisJaWYgKG5ld19jcyA9PSBOVUxMKQorCQlzdG9wKCJVbmFibGUgdG8gbWFsbG9jIGNyaXRpY2FsX3NlY3Rpb24gb2JqZWN0IiwgRVhfU09GVFdBUkUpOworCW1lbXNldChuZXdfY3MsIDAsIHNpemVvZigqbmV3X2NzKSk7CisJCisJVEFJTFFfSU5TRVJUX1RBSUwoJmNzX3RhaWxxLCBuZXdfY3MsIGxpbmtzKTsKKwlyZXR1cm4gbmV3X2NzOworfQorCitzY29wZV90ICoKK3Njb3BlX2FsbG9jKCkKK3sKKwlzY29wZV90ICpuZXdfc2NvcGU7CisKKwluZXdfc2NvcGUgPSAoc2NvcGVfdCAqKW1hbGxvYyhzaXplb2Yoc2NvcGVfdCkpOworCWlmIChuZXdfc2NvcGUgPT0gTlVMTCkKKwkJc3RvcCgiVW5hYmxlIHRvIG1hbGxvYyBzY29wZSBvYmplY3QiLCBFWF9TT0ZUV0FSRSk7CisJbWVtc2V0KG5ld19zY29wZSwgMCwgc2l6ZW9mKCpuZXdfc2NvcGUpKTsKKwlUQUlMUV9JTklUKCZuZXdfc2NvcGUtPmlubmVyX3Njb3BlKTsKKwkKKwlpZiAoU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKSAhPSBOVUxMKSB7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZTTElTVF9GSVJTVCgmc2NvcGVfc3RhY2spLT5pbm5lcl9zY29wZSwKKwkJCQkgIG5ld19zY29wZSwgc2NvcGVfbGlua3MpOworCX0KKwkvKiBUaGlzIHBhdGNoIGlzIG5vdyB0aGUgY3VycmVudCBzY29wZSAqLworCVNMSVNUX0lOU0VSVF9IRUFEKCZzY29wZV9zdGFjaywgbmV3X3Njb3BlLCBzY29wZV9zdGFja19saW5rcyk7CisJcmV0dXJuIG5ld19zY29wZTsKK30KKwordm9pZAorcHJvY2Vzc19zY29wZShzY29wZV90ICpzY29wZSkKK3sKKwkvKgorCSAqIFdlIGFyZSAibGVhdmluZyIgdGhpcyBzY29wZS4gIFdlIHNob3VsZCBub3cgaGF2ZQorCSAqIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwcm9jZXNzIHRoZSBsaXN0cyBvZiBzY29wZXMKKwkgKiB3ZSBlbmNhcHN1bGF0ZS4KKwkgKi8KKwlzY29wZV90ICpjdXJfc2NvcGU7CisJdV9pbnQgc2tpcF9wYXRjaF9jb3VudDsKKwl1X2ludCBza2lwX2luc3RyX2NvdW50OworCisJY3VyX3Njb3BlID0gVEFJTFFfTEFTVCgmc2NvcGUtPmlubmVyX3Njb3BlLCBzY29wZV90YWlscSk7CisJc2tpcF9wYXRjaF9jb3VudCA9IDA7CisJc2tpcF9pbnN0cl9jb3VudCA9IDA7CisJd2hpbGUgKGN1cl9zY29wZSAhPSBOVUxMKSB7CisJCXVfaW50IHBhdGNoMF9wYXRjaF9za2lwOworCisJCXBhdGNoMF9wYXRjaF9za2lwID0gMDsKKwkJc3dpdGNoIChjdXJfc2NvcGUtPnR5cGUpIHsKKwkJY2FzZSBTQ09QRV9JRjoKKwkJY2FzZSBTQ09QRV9FTFNFX0lGOgorCQkJaWYgKHNraXBfaW5zdHJfY291bnQgIT0gMCkgeworCQkJCS8qIENyZWF0ZSBhIHRhaWwgcGF0Y2ggKi8KKwkJCQlwYXRjaDBfcGF0Y2hfc2tpcCsrOworCQkJCWN1cl9zY29wZS0+cGF0Y2hlc1sxXS5za2lwX3BhdGNoID0KKwkJCQkgICAgc2tpcF9wYXRjaF9jb3VudCArIDE7CisJCQkJY3VyX3Njb3BlLT5wYXRjaGVzWzFdLnNraXBfaW5zdHIgPQorCQkJCSAgICBza2lwX2luc3RyX2NvdW50OworCQkJfQorCisJCQkvKiBDb3VudCBIZWFkIHBhdGNoICovCisJCQlwYXRjaDBfcGF0Y2hfc2tpcCsrOworCisJCQkvKiBDb3VudCBhbnkgcGF0Y2hlcyBjb250YWluZWQgaW4gb3VyIGlubmVyIHNjb3BlICovCisJCQlwYXRjaDBfcGF0Y2hfc2tpcCArPSBjdXJfc2NvcGUtPmlubmVyX3Njb3BlX3BhdGNoZXM7CisKKwkJCWN1cl9zY29wZS0+cGF0Y2hlc1swXS5za2lwX3BhdGNoID0gcGF0Y2gwX3BhdGNoX3NraXA7CisJCQljdXJfc2NvcGUtPnBhdGNoZXNbMF0uc2tpcF9pbnN0ciA9CisJCQkgICAgY3VyX3Njb3BlLT5lbmRfYWRkciAtIGN1cl9zY29wZS0+YmVnaW5fYWRkcjsKKworCQkJc2tpcF9pbnN0cl9jb3VudCArPSBjdXJfc2NvcGUtPnBhdGNoZXNbMF0uc2tpcF9pbnN0cjsKKworCQkJc2tpcF9wYXRjaF9jb3VudCArPSBwYXRjaDBfcGF0Y2hfc2tpcDsKKwkJCWlmIChjdXJfc2NvcGUtPnR5cGUgPT0gU0NPUEVfSUYpIHsKKwkJCQlzY29wZS0+aW5uZXJfc2NvcGVfcGF0Y2hlcyArPSBza2lwX3BhdGNoX2NvdW50OworCQkJCXNraXBfcGF0Y2hfY291bnQgPSAwOworCQkJICAgICAgICBza2lwX2luc3RyX2NvdW50ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNDT1BFX0VMU0U6CisJCQkvKiBDb3VudCBhbnkgcGF0Y2hlcyBjb250YWluZWQgaW4gb3VyIGlubnRlciBzY29wZSAqLworCQkJc2tpcF9wYXRjaF9jb3VudCArPSBjdXJfc2NvcGUtPmlubmVyX3Njb3BlX3BhdGNoZXM7CisKKwkJCXNraXBfaW5zdHJfY291bnQgKz0gY3VyX3Njb3BlLT5lbmRfYWRkcgorCQkJCQkgIC0gY3VyX3Njb3BlLT5iZWdpbl9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgU0NPUEVfUk9PVDoKKwkJCXN0b3AoIlVuZXhwZWN0ZWQgc2NvcGUgdHlwZSBlbmNvdW50ZXJlZCIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCisJCWN1cl9zY29wZSA9IFRBSUxRX1BSRVYoY3VyX3Njb3BlLCBzY29wZV90YWlscSwgc2NvcGVfbGlua3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY3OGRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBBc3NlbWJsZXIgZm9yIHRoZSBzZXF1ZW5jZXIgcHJvZ3JhbSBkb3dubG9hZGVkIHRvIEFpYzd4eHggU0NTSSBob3N0IGFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc20uaCMxNCAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBwYXRoX2VudHJ5IHsKKwljaGFyCSpkaXJlY3Rvcnk7CisJaW50CXF1b3RlZF9pbmNsdWRlc19vbmx5OworCVNMSVNUX0VOVFJZKHBhdGhfZW50cnkpIGxpbmtzOworfSAqcGF0aF9lbnRyeV90OworCit0eXBlZGVmIGVudW0geyAgCisJUVVPVEVEX0lOQ0xVREUsCisJQlJBQ0tFVEVEX0lOQ0xVREUsCisJU09VUkNFX0ZJTEUKK30gaW5jbHVkZV90eXBlOworCitTTElTVF9IRUFEKHBhdGhfbGlzdCwgcGF0aF9lbnRyeSk7CisKK2V4dGVybiBzdHJ1Y3QgcGF0aF9saXN0IHNlYXJjaF9wYXRoOworZXh0ZXJuIHN0cnVjdCBjc190YWlscSBjc190YWlscTsKK2V4dGVybiBzdHJ1Y3Qgc2NvcGVfbGlzdCBzY29wZV9zdGFjazsKK2V4dGVybiBzdHJ1Y3Qgc3ltbGlzdCBwYXRjaF9mdW5jdGlvbnM7CitleHRlcm4gaW50IGluY2x1ZGVzX3NlYXJjaF9jdXJkaXI7CQkvKiBGYWxzZSBpZiB3ZSd2ZSBzZWVuIC1JLSAqLworZXh0ZXJuIGNoYXIgKmFwcG5hbWU7CitleHRlcm4gY2hhciAqc3RvY2tfaW5jbHVkZV9maWxlOworZXh0ZXJuIGludCB5eWxpbmVubzsKK2V4dGVybiBjaGFyICp5eWZpbGVuYW1lOworZXh0ZXJuIGNoYXIgKnByZWZpeDsKK2V4dGVybiBjaGFyICpwYXRjaF9hcmdfbGlzdDsKK2V4dGVybiBjaGFyICp2ZXJzaW9uczsKK2V4dGVybiBpbnQgICBzcmNfbW9kZTsKK2V4dGVybiBpbnQgICBkc3RfbW9kZTsKK3N0cnVjdCBzeW1ib2w7CisKK3ZvaWQgc3RvcChjb25zdCBjaGFyICplcnJzdHJpbmcsIGludCBlcnJfY29kZSk7Cit2b2lkIGluY2x1ZGVfZmlsZShjaGFyICpmaWxlX25hbWUsIGluY2x1ZGVfdHlwZSB0eXBlKTsKK3ZvaWQgZXhwYW5kX21hY3JvKHN0cnVjdCBzeW1ib2wgKm1hY3JvX3N5bWJvbCk7CitzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKnNlcV9hbGxvYyh2b2lkKTsKK3N0cnVjdCBjcml0aWNhbF9zZWN0aW9uICpjc19hbGxvYyh2b2lkKTsKK3N0cnVjdCBzY29wZSAqc2NvcGVfYWxsb2Modm9pZCk7Cit2b2lkIHByb2Nlc3Nfc2NvcGUoc3RydWN0IHNjb3BlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9ncmFtLnkgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNhc20vYWljYXNtX2dyYW0ueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2UwNDZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9ncmFtLnkKQEAgLTAsMCArMSwxOTQ1IEBACisleworLyoKKyAqIFBhcnNlciBmb3IgdGhlIEFpYzd4eHggU0NTSSBIb3N0IGFkYXB0ZXIgc2VxdWVuY2VyIGFzc2VtYmxlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9ncmFtLnkjMjkgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlICIuLi9xdWV1ZS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYWljYXNtLmgiCisjaW5jbHVkZSAiYWljYXNtX3N5bWJvbC5oIgorI2luY2x1ZGUgImFpY2FzbV9pbnNmb3JtYXQuaCIKKworaW50IHl5bGluZW5vOworY2hhciAqeXlmaWxlbmFtZTsKK2NoYXIgc3RvY2tfcHJlZml4W10gPSAiYWljXyI7CitjaGFyICpwcmVmaXggPSBzdG9ja19wcmVmaXg7CitjaGFyICpwYXRjaF9hcmdfbGlzdDsKK2NoYXIgKnZlcnNpb25zOworc3RhdGljIGNoYXIgZXJyYnVmWzI1NV07CitzdGF0aWMgY2hhciByZWdleF9wYXR0ZXJuWzI1NV07CitzdGF0aWMgc3ltYm9sX3QgKmN1cl9zeW1ib2w7CitzdGF0aWMgc3ltYm9sX3QgKmZpZWxkX3N5bWJvbDsKK3N0YXRpYyBzeW1ib2xfdCAqc2NiX29yX3NyYW1fc3ltYm9sOworc3RhdGljIHN5bXR5cGUgY3VyX3N5bXR5cGU7CitzdGF0aWMgc3ltYm9sX3JlZl90IGFjY3VtdWxhdG9yOworc3RhdGljIHN5bWJvbF9yZWZfdCBtb2RlX3B0cjsKK3N0YXRpYyBzeW1ib2xfcmVmX3QgYWxsb25lczsKK3N0YXRpYyBzeW1ib2xfcmVmX3QgYWxsemVyb3M7CitzdGF0aWMgc3ltYm9sX3JlZl90IG5vbmU7CitzdGF0aWMgc3ltYm9sX3JlZl90IHNpbmRleDsKK3N0YXRpYyBpbnQgaW5zdHJ1Y3Rpb25fcHRyOworc3RhdGljIGludCBudW1fc3JhbXM7CitzdGF0aWMgaW50IHNyYW1fb3Jfc2NiX29mZnNldDsKK3N0YXRpYyBpbnQgZG93bmxvYWRfY29uc3RhbnRfY291bnQ7CitzdGF0aWMgaW50IGluX2NyaXRpY2FsX3NlY3Rpb247CitzdGF0aWMgdV9pbnQgZW51bV9pbmNyZW1lbnQ7CitzdGF0aWMgdV9pbnQgZW51bV9uZXh0X3ZhbHVlOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpZWxkKGludCBmaWVsZF90eXBlLCBzeW1ib2xfdCAqc3ltLCBpbnQgbWFzayk7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3N5bWJvbChzeW1ib2xfdCAqc3ltYm9sKTsKK3N0YXRpYyB2b2lkIGFkZF9tYWNyb19hcmcoY29uc3QgY2hhciAqYXJndGV4dCwgaW50IHBvc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGFkZF9tYWNyb19ib2R5KGNvbnN0IGNoYXIgKmJvZHl0ZXh0KTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcmVnaXN0ZXIoc3ltYm9sX3QgKipwX3N5bWJvbCk7CitzdGF0aWMgdm9pZCBmb3JtYXRfMV9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsCisJCQkgICBleHByZXNzaW9uX3QgKmltbWVkLCBzeW1ib2xfcmVmX3QgKnNyYywgaW50IHJldCk7CitzdGF0aWMgdm9pZCBmb3JtYXRfMl9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsCisJCQkgICBleHByZXNzaW9uX3QgKnBsYWNlcywgc3ltYm9sX3JlZl90ICpzcmMsIGludCByZXQpOworc3RhdGljIHZvaWQgZm9ybWF0XzNfaW5zdHIoaW50IG9wY29kZSwgc3ltYm9sX3JlZl90ICpzcmMsCisJCQkgICBleHByZXNzaW9uX3QgKmltbWVkLCBzeW1ib2xfcmVmX3QgKmFkZHJlc3MpOworc3RhdGljIHZvaWQgdGVzdF9yZWFkYWJsZV9zeW1ib2woc3ltYm9sX3QgKnN5bWJvbCk7CitzdGF0aWMgdm9pZCB0ZXN0X3dyaXRhYmxlX3N5bWJvbChzeW1ib2xfdCAqc3ltYm9sKTsKK3N0YXRpYyB2b2lkIHR5cGVfY2hlY2soc3ltYm9sX3QgKnN5bWJvbCwgZXhwcmVzc2lvbl90ICpleHByZXNzaW9uLCBpbnQgYW5kX29wKTsKK3N0YXRpYyB2b2lkIG1ha2VfZXhwcmVzc2lvbihleHByZXNzaW9uX3QgKmltbWVkLCBpbnQgdmFsdWUpOworc3RhdGljIHZvaWQgYWRkX2NvbmRpdGlvbmFsKHN5bWJvbF90ICpzeW1ib2wpOworc3RhdGljIHZvaWQgYWRkX3ZlcnNpb24oY29uc3QgY2hhciAqdmVyc3RyaW5nKTsKK3N0YXRpYyBpbnQgIGlzX2Rvd25sb2FkX2NvbnN0KGV4cHJlc3Npb25fdCAqaW1tZWQpOworCisjZGVmaW5lIFNSQU1fU1lNTkFNRSAiU1JBTV9CQVNFIgorI2RlZmluZSBTQ0JfU1lNTkFNRSAiU0NCX0JBU0UiCislfQorCisldW5pb24geworCXVfaW50CQl2YWx1ZTsKKwljaGFyCQkqc3RyOworCXN5bWJvbF90CSpzeW07CisJc3ltYm9sX3JlZl90CXN5bV9yZWY7CisJZXhwcmVzc2lvbl90CWV4cHJlc3Npb247Cit9CisKKyV0b2tlbiBUX1JFR0lTVEVSCisKKyV0b2tlbiA8dmFsdWU+IFRfQ09OU1QKKworJXRva2VuIFRfRVhQT1JUCisKKyV0b2tlbiBUX0RPV05MT0FECisKKyV0b2tlbiBUX1NDQgorCisldG9rZW4gVF9TUkFNCisKKyV0b2tlbiBUX0FMSUFTCisKKyV0b2tlbiBUX1NJWkUKKworJXRva2VuIFRfRVhQUl9MU0hJRlQKKworJXRva2VuIFRfRVhQUl9SU0hJRlQKKworJXRva2VuIDx2YWx1ZT4gVF9BRERSRVNTCisKKyV0b2tlbiBUX0FDQ0VTU19NT0RFCisKKyV0b2tlbiBUX01PREVTCisKKyV0b2tlbiBUX0RFRklORQorCisldG9rZW4gVF9TRVRfU1JDX01PREUKKworJXRva2VuIFRfU0VUX0RTVF9NT0RFCisKKyV0b2tlbiA8dmFsdWU+IFRfTU9ERQorCisldG9rZW4gVF9CRUdJTl9DUworCisldG9rZW4gVF9FTkRfQ1MKKworJXRva2VuIFRfRklFTEQKKworJXRva2VuIFRfRU5VTQorCisldG9rZW4gVF9NQVNLCisKKyV0b2tlbiA8dmFsdWU+IFRfTlVNQkVSCisKKyV0b2tlbiA8c3RyPiBUX1BBVEggVF9TVFJJTkcgVF9BUkcgVF9NQUNST0JPRFkKKworJXRva2VuIDxzeW0+IFRfQ0VYUFIKKworJXRva2VuIFRfRU9GIFRfSU5DTFVERSBUX1ZFUlNJT04gVF9QUkVGSVggVF9QQVRDSF9BUkdfTElTVAorCisldG9rZW4gPHZhbHVlPiBUX1NIUiBUX1NITCBUX1JPUiBUX1JPTAorCisldG9rZW4gPHZhbHVlPiBUX01WSSBUX01PViBUX0NMUiBUX0JNT1YKKworJXRva2VuIDx2YWx1ZT4gVF9KTVAgVF9KQyBUX0pOQyBUX0pFIFRfSk5FIFRfSk5aIFRfSlogVF9DQUxMCisKKyV0b2tlbiA8dmFsdWU+IFRfQUREIFRfQURDCisKKyV0b2tlbiA8dmFsdWU+IFRfSU5DIFRfREVDCisKKyV0b2tlbiA8dmFsdWU+IFRfU1RDIFRfQ0xDCisKKyV0b2tlbiA8dmFsdWU+IFRfQ01QIFRfTk9UIFRfWE9SCisKKyV0b2tlbiA8dmFsdWU+IFRfVEVTVCBUX0FORAorCisldG9rZW4gPHZhbHVlPiBUX09SCisKKyV0b2tlbiBUX1JFVAorCisldG9rZW4gVF9OT1AKKworJXRva2VuIFRfQUNDVU0gVF9BTExPTkVTIFRfQUxMWkVST1MgVF9OT05FIFRfU0lOREVYIFRfTU9ERV9QVFIKKworJXRva2VuIFRfQQorCisldG9rZW4gPHN5bT4gVF9TWU1CT0wKKworJXRva2VuIFRfTkwKKworJXRva2VuIFRfSUYgVF9FTFNFIFRfRUxTRV9JRiBUX0VORElGCisKKyV0eXBlIDxzeW1fcmVmPiByZWdfc3ltYm9sIGFkZHJlc3MgZGVzdGluYXRpb24gc291cmNlIG9wdF9zb3VyY2UKKworJXR5cGUgPGV4cHJlc3Npb24+IGV4cHJlc3Npb24gaW1tZWRpYXRlIGltbWVkaWF0ZV9vcl9hCisKKyV0eXBlIDx2YWx1ZT4gZXhwb3J0IHJldCBmMV9vcGNvZGUgZjJfb3Bjb2RlIGptcF9qY19qbmNfY2FsbCBqel9qbnogamVfam5lCisKKyV0eXBlIDx2YWx1ZT4gbW9kZV92YWx1ZSBtb2RlX2xpc3QgbWFjcm9fYXJnbGlzdAorCislbGVmdCAnfCcKKyVsZWZ0ICcmJworJWxlZnQgVF9FWFBSX0xTSElGVCBUX0VYUFJfUlNISUZUCislbGVmdCAnKycgJy0nCislbGVmdCAnKicgJy8nCislcmlnaHQgJ34nCislbm9uYXNzb2MgVU1JTlVTCislJQorCitwcm9ncmFtOgorCWluY2x1ZGUKK3wJcHJvZ3JhbSBpbmNsdWRlCit8CXByZWZpeAorfAlwcm9ncmFtIHByZWZpeAorfAlwYXRjaF9hcmdfbGlzdAorfAlwcm9ncmFtIHBhdGNoX2FyZ19saXN0Cit8CXZlcnNpb24KK3wJcHJvZ3JhbSB2ZXJzaW9uCit8CXJlZ2lzdGVyCit8CXByb2dyYW0gcmVnaXN0ZXIKK3wJY29uc3RhbnQKK3wJcHJvZ3JhbSBjb25zdGFudAorfAltYWNyb2RlZm4KK3wJcHJvZ3JhbSBtYWNyb2RlZm4KK3wJc2NyYXRjaF9yYW0KK3wJcHJvZ3JhbSBzY3JhdGNoX3JhbQorfAlzY2IKK3wJcHJvZ3JhbSBzY2IKK3wJbGFiZWwKK3wJcHJvZ3JhbSBsYWJlbAorfAlzZXRfc3JjX21vZGUKK3wJcHJvZ3JhbSBzZXRfc3JjX21vZGUKK3wJc2V0X2RzdF9tb2RlCit8CXByb2dyYW0gc2V0X2RzdF9tb2RlCit8CWNyaXRpY2FsX3NlY3Rpb25fc3RhcnQKK3wJcHJvZ3JhbSBjcml0aWNhbF9zZWN0aW9uX3N0YXJ0Cit8CWNyaXRpY2FsX3NlY3Rpb25fZW5kCit8CXByb2dyYW0gY3JpdGljYWxfc2VjdGlvbl9lbmQKK3wJY29uZGl0aW9uYWwKK3wJcHJvZ3JhbSBjb25kaXRpb25hbAorfAljb2RlCit8CXByb2dyYW0gY29kZQorOworCitpbmNsdWRlOgorCVRfSU5DTFVERSAnPCcgVF9QQVRIICc+JworCXsKKwkJaW5jbHVkZV9maWxlKCQzLCBCUkFDS0VURURfSU5DTFVERSk7CisJfQorfAlUX0lOQ0xVREUgJyInIFRfUEFUSCAnIicKKwl7CisJCWluY2x1ZGVfZmlsZSgkMywgUVVPVEVEX0lOQ0xVREUpOworCX0KKzsKKworcHJlZml4OgorCVRfUFJFRklYICc9JyBUX1NUUklORworCXsKKwkJaWYgKHByZWZpeCAhPSBzdG9ja19wcmVmaXgpCisJCQlzdG9wKCJQcmVmaXggbXVsdGlwbHkgZGVmaW5lZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQlwcmVmaXggPSBzdHJkdXAoJDMpOworCQlpZiAocHJlZml4ID09IE5VTEwpCisJCQlzdG9wKCJVbmFibGUgdG8gcmVjb3JkIHByZWZpeCIsIEVYX1NPRlRXQVJFKTsKKwl9Cis7CisKK3BhdGNoX2FyZ19saXN0OgorCVRfUEFUQ0hfQVJHX0xJU1QgJz0nIFRfU1RSSU5HCisJeworCQlpZiAocGF0Y2hfYXJnX2xpc3QgIT0gTlVMTCkKKwkJCXN0b3AoIlBhdGNoIGFyZ3VtZW50IGxpc3QgbXVsdGlwbHkgZGVmaW5lZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQlwYXRjaF9hcmdfbGlzdCA9IHN0cmR1cCgkMyk7CisJCWlmIChwYXRjaF9hcmdfbGlzdCA9PSBOVUxMKQorCQkJc3RvcCgiVW5hYmxlIHRvIHJlY29yZCBwYXRjaCBhcmcgbGlzdCIsIEVYX1NPRlRXQVJFKTsKKwl9Cis7CisKK3ZlcnNpb246CisJVF9WRVJTSU9OICc9JyBUX1NUUklORworCXsgYWRkX3ZlcnNpb24oJDMpOyB9Cis7CisKK3JlZ2lzdGVyOgorCVRfUkVHSVNURVIgeyBjdXJfc3ltdHlwZSA9IFJFR0lTVEVSOyB9IHJlZ19kZWZpbml0aW9uCis7CisKK3JlZ19kZWZpbml0aW9uOgorCVRfU1lNQk9MICd7JworCQl7CisJCQlpZiAoJDEtPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQkJCXN0b3AoIlJlZ2lzdGVyIG11bHRpcGx5IGRlZmluZWQiLCBFWF9EQVRBRVJSKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCQljdXJfc3ltYm9sID0gJDE7IAorCQkJY3VyX3N5bWJvbC0+dHlwZSA9IGN1cl9zeW10eXBlOworCQkJaW5pdGlhbGl6ZV9zeW1ib2woY3VyX3N5bWJvbCk7CisJCX0KKwkJcmVnX2F0dHJpYnV0ZV9saXN0CisJJ30nCisJCXsgICAgICAgICAgICAgICAgICAgIAorCQkJLyoKKwkJCSAqIERlZmF1bHQgdG8gYWxsb3dpbmcgZXZlcnl0aGluZyBpbiBmb3IgcmVnaXN0ZXJzCisJCQkgKiB3aXRoIG5vIGJpdCBvciBtYXNrIGRlZmluaXRpb25zLgorCQkJICovCisJCQlpZiAoY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+dmFsaWRfYml0bWFzayA9PSAwKQorCQkJCWN1cl9zeW1ib2wtPmluZm8ucmluZm8tPnZhbGlkX2JpdG1hc2sgPSAweEZGOworCisJCQlpZiAoY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZSA9PSAwKQorCQkJCWN1cl9zeW1ib2wtPmluZm8ucmluZm8tPnNpemUgPSAxOworCisJCQkvKgorCQkJICogVGhpcyBtaWdodCBiZSB1c2VmdWwgZm9yIHJlZ2lzdGVycyB0b28uCisJCQkgKi8KKwkJCWlmIChjdXJfc3ltYm9sLT50eXBlICE9IFJFR0lTVEVSKSB7CisJCQkJaWYgKGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MgPT0gMCkKKwkJCQkJY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzcyA9CisJCQkJCSAgICBzcmFtX29yX3NjYl9vZmZzZXQ7CisJCQkJc3JhbV9vcl9zY2Jfb2Zmc2V0ICs9CisJCQkJICAgIGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPnNpemU7CisJCQl9CisJCQljdXJfc3ltYm9sID0gTlVMTDsKKwkJfQorOworCityZWdfYXR0cmlidXRlX2xpc3Q6CisJcmVnX2F0dHJpYnV0ZQorfAlyZWdfYXR0cmlidXRlX2xpc3QgcmVnX2F0dHJpYnV0ZQorOworCityZWdfYXR0cmlidXRlOgkJCisJcmVnX2FkZHJlc3MKK3wJc2l6ZQorfAlhY2Nlc3NfbW9kZQorfAltb2RlcworfAlmaWVsZF9kZWZuCit8CWVudW1fZGVmbgorfAltYXNrX2RlZm4KK3wJYWxpYXMKK3wJYWNjdW11bGF0b3IKK3wJbW9kZV9wb2ludGVyCit8CWFsbG9uZXMKK3wJYWxsemVyb3MKK3wJbm9uZQorfAlzaW5kZXgKKzsKKworcmVnX2FkZHJlc3M6CisJVF9BRERSRVNTIFRfTlVNQkVSCisJeworCQljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzID0gJDI7CisJfQorOworCitzaXplOgorCVRfU0laRSBUX05VTUJFUgorCXsKKwkJY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZSA9ICQyOworCQlpZiAoc2NiX29yX3NyYW1fc3ltYm9sICE9IE5VTEwpIHsKKwkJCXVfaW50IG1heF9hZGRyOworCQkJdV9pbnQgc3ltX21heF9hZGRyOworCisJCQltYXhfYWRkciA9IHNjYl9vcl9zcmFtX3N5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzcworCQkJCSArIHNjYl9vcl9zcmFtX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZTsKKwkJCXN5bV9tYXhfYWRkciA9IGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MKKwkJCQkgICAgICsgY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+c2l6ZTsKKworCQkJaWYgKHN5bV9tYXhfYWRkciA+IG1heF9hZGRyKQorCQkJCXN0b3AoIlNDQiBvciBTUkFNIHNwYWNlIGV4aGF1c3RlZCIsIEVYX0RBVEFFUlIpOworCQl9CisJfQorOworCithY2Nlc3NfbW9kZToKKwlUX0FDQ0VTU19NT0RFIFRfTU9ERQorCXsKKwkJY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+bW9kZSA9ICQyOworCX0KKzsKKworbW9kZXM6CisJVF9NT0RFUyBtb2RlX2xpc3QKKwl7CisJCWN1cl9zeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzID0gJDI7CisJfQorOworCittb2RlX2xpc3Q6CisJbW9kZV92YWx1ZQorCXsKKwkJJCQgPSAkMTsKKwl9Cit8CW1vZGVfbGlzdCAnLCcgbW9kZV92YWx1ZQorCXsKKwkJJCQgPSAkMSB8ICQzOworCX0KKzsKKworbW9kZV92YWx1ZToKKwlUX05VTUJFUgorCXsKKwkJaWYgKCQxID4gNCkgeworCQkJc3RvcCgiVmFsaWQgcmVnaXN0ZXIgbW9kZXMgcmFuZ2UgYmV0d2VlbiAwIGFuZCA0LiIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisKKwkJJCQgPSAoMHgxIDw8ICQxKTsKKwl9Cit8CVRfU1lNQk9MCisJeworCQlzeW1ib2xfdCAqc3ltYm9sOworCisJCXN5bWJvbCA9ICQxOworCQlpZiAoc3ltYm9sLT50eXBlICE9IENPTlNUKSB7CisJCQlzdG9wKCJPbmx5IFwiY29uc3RcIiBzeW1ib2xzIGFsbG93ZWQgaW4gIgorCQkJICAgICAibW9kZSBkZWZpbml0aW9ucy4iLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlpZiAoc3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSA+IDQpIHsKKwkJCXN0b3AoIlZhbGlkIHJlZ2lzdGVyIG1vZGVzIHJhbmdlIGJldHdlZW4gMCBhbmQgNC4iLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkkJCA9ICgweDEgPDwgc3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSk7CisJfQorOworCitmaWVsZF9kZWZuOgorCVRfRklFTEQKKwkJeworCQkJZmllbGRfc3ltYm9sID0gTlVMTDsKKwkJCWVudW1fbmV4dF92YWx1ZSA9IDA7CisJCQllbnVtX2luY3JlbWVudCA9IDE7CisJCX0KKwkneycgZW51bV9lbnRyeV9saXN0ICd9JworfAlUX0ZJRUxEIFRfU1lNQk9MIGV4cHJlc3Npb24KKwkJeworCQkJcHJvY2Vzc19maWVsZChGSUVMRCwgJDIsICQzLnZhbHVlKTsKKwkJCWZpZWxkX3N5bWJvbCA9ICQyOworCQkJZW51bV9uZXh0X3ZhbHVlID0gMDsKKwkJCWVudW1faW5jcmVtZW50ID0gMHgwMSA8PCAoZmZzKCQzLnZhbHVlKSAtIDEpOworCQl9CisJJ3snIGVudW1fZW50cnlfbGlzdCAnfScKK3wJVF9GSUVMRCBUX1NZTUJPTCBleHByZXNzaW9uCisJeworCQlwcm9jZXNzX2ZpZWxkKEZJRUxELCAkMiwgJDMudmFsdWUpOworCX0KKzsKKworZW51bV9kZWZuOgorCVRfRU5VTQorCQl7CisJCQlmaWVsZF9zeW1ib2wgPSBOVUxMOworCQkJZW51bV9uZXh0X3ZhbHVlID0gMDsKKwkJCWVudW1faW5jcmVtZW50ID0gMTsKKwkJfQorCSd7JyBlbnVtX2VudHJ5X2xpc3QgJ30nCit8CVRfRU5VTSBUX1NZTUJPTCBleHByZXNzaW9uCisJCXsKKwkJCXByb2Nlc3NfZmllbGQoRU5VTSwgJDIsICQzLnZhbHVlKTsKKwkJCWZpZWxkX3N5bWJvbCA9ICQyOworCQkJZW51bV9uZXh0X3ZhbHVlID0gMDsKKwkJCWVudW1faW5jcmVtZW50ID0gMHgwMSA8PCAoZmZzKCQzLnZhbHVlKSAtIDEpOworCQl9CisJJ3snIGVudW1fZW50cnlfbGlzdCAnfScKKzsKKworZW51bV9lbnRyeV9saXN0OgorCWVudW1fZW50cnkKK3wJZW51bV9lbnRyeV9saXN0ICcsJyBlbnVtX2VudHJ5Cis7CisKK2VudW1fZW50cnk6CisJVF9TWU1CT0wKKwl7CisJCXByb2Nlc3NfZmllbGQoRU5VTV9FTlRSWSwgJDEsIGVudW1fbmV4dF92YWx1ZSk7CisJCWVudW1fbmV4dF92YWx1ZSArPSBlbnVtX2luY3JlbWVudDsKKwl9Cit8CVRfU1lNQk9MIGV4cHJlc3Npb24KKwl7CisJCXByb2Nlc3NfZmllbGQoRU5VTV9FTlRSWSwgJDEsICQyLnZhbHVlKTsKKwkJZW51bV9uZXh0X3ZhbHVlID0gJDIudmFsdWUgKyBlbnVtX2luY3JlbWVudDsKKwl9Cis7CisKK21hc2tfZGVmbjoKKwlUX01BU0sgVF9TWU1CT0wgZXhwcmVzc2lvbgorCXsKKwkJcHJvY2Vzc19maWVsZChNQVNLLCAkMiwgJDMudmFsdWUpOworCX0KKzsKKworYWxpYXM6CisJVF9BTElBUwlUX1NZTUJPTAorCXsKKwkJaWYgKCQyLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCXN0b3AoIlJlLWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMiLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkkMi0+dHlwZSA9IEFMSUFTOworCQlpbml0aWFsaXplX3N5bWJvbCgkMik7CisJCSQyLT5pbmZvLmFpbmZvLT5wYXJlbnQgPSBjdXJfc3ltYm9sOworCX0KKzsKKworYWNjdW11bGF0b3I6CisJVF9BQ0NVTQorCXsKKwkJaWYgKGFjY3VtdWxhdG9yLnN5bWJvbCAhPSBOVUxMKSB7CisJCQlzdG9wKCJPbmx5IG9uZSBhY2N1bXVsYXRvciBkZWZpbml0aW9uIGFsbG93ZWQiLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlhY2N1bXVsYXRvci5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworbW9kZV9wb2ludGVyOgorCVRfTU9ERV9QVFIKKwl7CisJCWlmIChtb2RlX3B0ci5zeW1ib2wgIT0gTlVMTCkgeworCQkJc3RvcCgiT25seSBvbmUgbW9kZSBwb2ludGVyIGRlZmluaXRpb24gYWxsb3dlZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW1vZGVfcHRyLnN5bWJvbCA9IGN1cl9zeW1ib2w7CisJfQorOworCithbGxvbmVzOgorCVRfQUxMT05FUworCXsKKwkJaWYgKGFsbG9uZXMuc3ltYm9sICE9IE5VTEwpIHsKKwkJCXN0b3AoIk9ubHkgb25lIGRlZmluaXRpb24gb2YgYWxsb25lcyBhbGxvd2VkIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJYWxsb25lcy5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworYWxsemVyb3M6CisJVF9BTExaRVJPUworCXsKKwkJaWYgKGFsbHplcm9zLnN5bWJvbCAhPSBOVUxMKSB7CisJCQlzdG9wKCJPbmx5IG9uZSBkZWZpbml0aW9uIG9mIGFsbHplcm9zIGFsbG93ZWQiLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlhbGx6ZXJvcy5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworbm9uZToKKwlUX05PTkUKKwl7CisJCWlmIChub25lLnN5bWJvbCAhPSBOVUxMKSB7CisJCQlzdG9wKCJPbmx5IG9uZSBkZWZpbml0aW9uIG9mIG5vbmUgYWxsb3dlZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW5vbmUuc3ltYm9sID0gY3VyX3N5bWJvbDsKKwl9Cis7CisKK3NpbmRleDoKKwlUX1NJTkRFWAorCXsKKwkJaWYgKHNpbmRleC5zeW1ib2wgIT0gTlVMTCkgeworCQkJc3RvcCgiT25seSBvbmUgZGVmaW5pdGlvbiBvZiBzaW5kZXggYWxsb3dlZCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCXNpbmRleC5zeW1ib2wgPSBjdXJfc3ltYm9sOworCX0KKzsKKworZXhwcmVzc2lvbjoKKwlleHByZXNzaW9uICd8JyBleHByZXNzaW9uCisJeworCQkgJCQudmFsdWUgPSAkMS52YWx1ZSB8ICQzLnZhbHVlOworCQkgc3ltbGlzdF9tZXJnZSgmJCQucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMS5yZWZlcmVuY2VkX3N5bXMsCisJCQkgICAgICAgJiQzLnJlZmVyZW5jZWRfc3ltcyk7CisJfQorfAlleHByZXNzaW9uICcmJyBleHByZXNzaW9uCisJeworCQkkJC52YWx1ZSA9ICQxLnZhbHVlICYgJDMudmFsdWU7CisJCXN5bWxpc3RfbWVyZ2UoJiQkLnJlZmVyZW5jZWRfc3ltcywKKwkJCSAgICAgICAmJDEucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMy5yZWZlcmVuY2VkX3N5bXMpOworCX0KK3wJZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbgorCXsKKwkJJCQudmFsdWUgPSAkMS52YWx1ZSArICQzLnZhbHVlOworCQlzeW1saXN0X21lcmdlKCYkJC5yZWZlcmVuY2VkX3N5bXMsCisJCQkgICAgICAgJiQxLnJlZmVyZW5jZWRfc3ltcywKKwkJCSAgICAgICAmJDMucmVmZXJlbmNlZF9zeW1zKTsKKwl9Cit8CWV4cHJlc3Npb24gJy0nIGV4cHJlc3Npb24KKwl7CisJCSQkLnZhbHVlID0gJDEudmFsdWUgLSAkMy52YWx1ZTsKKwkJc3ltbGlzdF9tZXJnZSgmKCQkLnJlZmVyZW5jZWRfc3ltcyksCisJCQkgICAgICAgJigkMS5yZWZlcmVuY2VkX3N5bXMpLAorCQkJICAgICAgICYoJDMucmVmZXJlbmNlZF9zeW1zKSk7CisJfQorfAlleHByZXNzaW9uICcqJyBleHByZXNzaW9uCisJeworCQkkJC52YWx1ZSA9ICQxLnZhbHVlICogJDMudmFsdWU7CisJCXN5bWxpc3RfbWVyZ2UoJigkJC5yZWZlcmVuY2VkX3N5bXMpLAorCQkJICAgICAgICYoJDEucmVmZXJlbmNlZF9zeW1zKSwKKwkJCSAgICAgICAmKCQzLnJlZmVyZW5jZWRfc3ltcykpOworCX0KK3wJZXhwcmVzc2lvbiAnLycgZXhwcmVzc2lvbgorCXsKKwkJJCQudmFsdWUgPSAkMS52YWx1ZSAvICQzLnZhbHVlOworCQlzeW1saXN0X21lcmdlKCYoJCQucmVmZXJlbmNlZF9zeW1zKSwKKwkJCSAgICAgICAmKCQxLnJlZmVyZW5jZWRfc3ltcyksCisJCQkgICAgICAgJigkMy5yZWZlcmVuY2VkX3N5bXMpKTsKKwl9Cit8IAlleHByZXNzaW9uIFRfRVhQUl9MU0hJRlQgZXhwcmVzc2lvbgorCXsKKwkJJCQudmFsdWUgPSAkMS52YWx1ZSA8PCAkMy52YWx1ZTsKKwkJc3ltbGlzdF9tZXJnZSgmJCQucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMS5yZWZlcmVuY2VkX3N5bXMsCisJCQkgICAgICAgJiQzLnJlZmVyZW5jZWRfc3ltcyk7CisJfQorfCAJZXhwcmVzc2lvbiBUX0VYUFJfUlNISUZUIGV4cHJlc3Npb24KKwl7CisJCSQkLnZhbHVlID0gJDEudmFsdWUgPj4gJDMudmFsdWU7CisJCXN5bWxpc3RfbWVyZ2UoJiQkLnJlZmVyZW5jZWRfc3ltcywKKwkJCSAgICAgICAmJDEucmVmZXJlbmNlZF9zeW1zLAorCQkJICAgICAgICYkMy5yZWZlcmVuY2VkX3N5bXMpOworCX0KK3wJJygnIGV4cHJlc3Npb24gJyknCisJeworCQkkJCA9ICQyOworCX0KK3wJJ34nIGV4cHJlc3Npb24KKwl7CisJCSQkID0gJDI7CisJCSQkLnZhbHVlID0gKH4kJC52YWx1ZSkgJiAweEZGOworCX0KK3wJJy0nIGV4cHJlc3Npb24gJXByZWMgVU1JTlVTCisJeworCQkkJCA9ICQyOworCQkkJC52YWx1ZSA9IC0kJC52YWx1ZTsKKwl9Cit8CVRfTlVNQkVSCisJeworCQkkJC52YWx1ZSA9ICQxOworCQlTTElTVF9JTklUKCYkJC5yZWZlcmVuY2VkX3N5bXMpOworCX0KK3wJVF9TWU1CT0wKKwl7CisJCXN5bWJvbF90ICpzeW1ib2w7CisKKwkJc3ltYm9sID0gJDE7CisJCXN3aXRjaCAoc3ltYm9sLT50eXBlKSB7CisJCWNhc2UgQUxJQVM6CisJCQlzeW1ib2wgPSAkMS0+aW5mby5haW5mby0+cGFyZW50OworCQljYXNlIFJFR0lTVEVSOgorCQljYXNlIFNDQkxPQzoKKwkJY2FzZSBTUkFNTE9DOgorCQkJJCQudmFsdWUgPSBzeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3M7CisJCQlicmVhazsKKwkJY2FzZSBNQVNLOgorCQljYXNlIEZJRUxEOgorCQljYXNlIEVOVU06CisJCWNhc2UgRU5VTV9FTlRSWToKKwkJCSQkLnZhbHVlID0gc3ltYm9sLT5pbmZvLmZpbmZvLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIERPV05MT0FEX0NPTlNUOgorCQljYXNlIENPTlNUOgorCQkJJCQudmFsdWUgPSBzeW1ib2wtPmluZm8uY2luZm8tPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVU5JTklUSUFMSVpFRDoKKwkJZGVmYXVsdDoKKwkJeworCQkJc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwKKwkJCQkgIlVuZGVmaW5lZCBzeW1ib2wgJXMgcmVmZXJlbmNlZCIsCisJCQkJIHN5bWJvbC0+bmFtZSk7CisJCQlzdG9wKGVycmJ1ZiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCQlicmVhazsKKwkJfQorCQl9CisJCVNMSVNUX0lOSVQoJiQkLnJlZmVyZW5jZWRfc3ltcyk7CisJCXN5bWxpc3RfYWRkKCYkJC5yZWZlcmVuY2VkX3N5bXMsIHN5bWJvbCwgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJfQorOworCitjb25zdGFudDoKKwlUX0NPTlNUIFRfU1lNQk9MIGV4cHJlc3Npb24gCisJeworCQlpZiAoJDItPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQkJc3RvcCgiUmUtZGVmaW5pdGlvbiBvZiBzeW1ib2wgYXMgYSBjb25zdGFudCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCSQyLT50eXBlID0gQ09OU1Q7CisJCWluaXRpYWxpemVfc3ltYm9sKCQyKTsKKwkJJDItPmluZm8uY2luZm8tPnZhbHVlID0gJDMudmFsdWU7CisJfQorfAlUX0NPTlNUIFRfU1lNQk9MIFRfRE9XTkxPQUQKKwl7CisJCWlmICgkMSkgeworCQkJc3RvcCgiSW52YWxpZCBkb3dubG9hZGVkIGNvbnN0YW50IGRlY2xhcmF0aW9uIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJaWYgKCQyLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCXN0b3AoIlJlLWRlZmluaXRpb24gb2Ygc3ltYm9sIGFzIGEgZG93bmxvYWRlZCBjb25zdGFudCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCSQyLT50eXBlID0gRE9XTkxPQURfQ09OU1Q7CisJCWluaXRpYWxpemVfc3ltYm9sKCQyKTsKKwkJJDItPmluZm8uY2luZm8tPnZhbHVlID0gZG93bmxvYWRfY29uc3RhbnRfY291bnQrKzsKKwl9Cis7CisKK21hY3JvZGVmbl9wcm9sb2d1ZToKKwlUX0RFRklORSBUX1NZTUJPTAorCXsKKwkJaWYgKCQyLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCXN0b3AoIlJlLWRlZmluaXRpb24gb2Ygc3ltYm9sIGFzIGEgbWFjcm8iLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQljdXJfc3ltYm9sID0gJDI7CisJCWN1cl9zeW1ib2wtPnR5cGUgPSBNQUNSTzsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woY3VyX3N5bWJvbCk7CisJfQorOworCittYWNyb2RlZm46CisJbWFjcm9kZWZuX3Byb2xvZ3VlIFRfTUFDUk9CT0RZCisJeworCQlhZGRfbWFjcm9fYm9keSgkMik7CisJfQorfAltYWNyb2RlZm5fcHJvbG9ndWUgJygnIG1hY3JvX2FyZ2xpc3QgJyknIFRfTUFDUk9CT0RZCisJeworCQlhZGRfbWFjcm9fYm9keSgkNSk7CisJCWN1cl9zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5uYXJnID0gJDM7CisJfQorOworCittYWNyb19hcmdsaXN0OgorCXsKKwkJLyogTWFjcm9zIGNhbiB0YWtlIG5vIGFyZ3VtZW50cyAqLworCQkkJCA9IDA7CisJfQorfAlUX0FSRworCXsKKwkJJCQgPSAxOworCQlhZGRfbWFjcm9fYXJnKCQxLCAwKTsKKwl9Cit8CW1hY3JvX2FyZ2xpc3QgJywnIFRfQVJHCisJeworCQlpZiAoJDEgPT0gMCkgeworCQkJc3RvcCgiQ29tbWEgd2l0aG91dCBwcmVjZWVkaW5nIGFyZ3VtZW50IGluIGFyZyBsaXN0IiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJCQgPSAkMSArIDE7CisJCWFkZF9tYWNyb19hcmcoJDMsICQxKTsKKwl9Cis7CisKK3NjcmF0Y2hfcmFtOgorCVRfU1JBTSAneycKKwkJeworCQkJc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIiVzJWQiLCBTUkFNX1NZTU5BTUUsCisJCQkJIG51bV9zcmFtcyk7CisJCQljdXJfc3ltYm9sID0gc3ltdGFibGVfZ2V0KFNSQU1fU1lNTkFNRSk7CisJCQljdXJfc3ltdHlwZSA9IFNSQU1MT0M7CisJCQljdXJfc3ltYm9sLT50eXBlID0gU1JBTUxPQzsKKwkJCWluaXRpYWxpemVfc3ltYm9sKGN1cl9zeW1ib2wpOworCQl9CisJCXJlZ19hZGRyZXNzCisJCXsKKwkJCXNyYW1fb3Jfc2NiX29mZnNldCA9IGN1cl9zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3M7CisJCX0KKwkJc2l6ZQorCQl7CisJCQlzY2Jfb3Jfc3JhbV9zeW1ib2wgPSBjdXJfc3ltYm9sOworCQl9CisJCXNjYl9vcl9zcmFtX2F0dHJpYnV0ZXMKKwknfScKKwkJeworCQkJY3VyX3N5bWJvbCA9IE5VTEw7CisJCQlzY2Jfb3Jfc3JhbV9zeW1ib2wgPSBOVUxMOworCQl9Cis7CisKK3NjYjoKKwlUX1NDQiAneycKKwkJeworCQkJY3VyX3N5bWJvbCA9IHN5bXRhYmxlX2dldChTQ0JfU1lNTkFNRSk7CisJCQljdXJfc3ltdHlwZSA9IFNDQkxPQzsKKwkJCWlmIChjdXJfc3ltYm9sLT50eXBlICE9IFVOSU5JVElBTElaRUQpIHsKKwkJCQlzdG9wKCJPbmx5IG9uZSBTUkFNIGRlZmluaXRpb24gYWxsb3dlZCIsCisJCQkJICAgICBFWF9TT0ZUV0FSRSk7CisJCQkJLyogTk9UUkVBQ0hFRCAqLworCQkJfQorCQkJY3VyX3N5bWJvbC0+dHlwZSA9IFNDQkxPQzsKKwkJCWluaXRpYWxpemVfc3ltYm9sKGN1cl9zeW1ib2wpOworCQkJLyogNjQgYnl0ZXMgb2YgU0NCIHNwYWNlICovCisJCQljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT5zaXplID0gNjQ7CisJCX0KKwkJcmVnX2FkZHJlc3MKKwkJeworCQkJc3JhbV9vcl9zY2Jfb2Zmc2V0ID0gY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzczsKKwkJfQorCQlzaXplCisJCXsKKwkJCXNjYl9vcl9zcmFtX3N5bWJvbCA9IGN1cl9zeW1ib2w7CisJCX0KKwkJc2NiX29yX3NyYW1fYXR0cmlidXRlcworCSd9JworCQl7CisJCQljdXJfc3ltYm9sID0gTlVMTDsKKwkJCXNjYl9vcl9zcmFtX3N5bWJvbCA9IE5VTEw7CisJCX0KKzsKKworc2NiX29yX3NyYW1fYXR0cmlidXRlczoKKwkvKiBOVUxMIGRlZmluaXRpb24gaXMgb2theSAqLworfAltb2RlcworfAlzY2Jfb3Jfc3JhbV9yZWdfbGlzdAorfAltb2RlcyBzY2Jfb3Jfc3JhbV9yZWdfbGlzdAorOworCitzY2Jfb3Jfc3JhbV9yZWdfbGlzdDoKKwlyZWdfZGVmaW5pdGlvbgorfAlzY2Jfb3Jfc3JhbV9yZWdfbGlzdCByZWdfZGVmaW5pdGlvbgorOworCityZWdfc3ltYm9sOgorCVRfU1lNQk9MCisJeworCQlwcm9jZXNzX3JlZ2lzdGVyKCYkMSk7CisJCSQkLnN5bWJvbCA9ICQxOworCQkkJC5vZmZzZXQgPSAwOworCX0KK3wJVF9TWU1CT0wgJ1snIFRfU1lNQk9MICddJworCXsKKwkJcHJvY2Vzc19yZWdpc3RlcigmJDEpOworCQlpZiAoJDMtPnR5cGUgIT0gQ09OU1QpIHsKKwkJCXN0b3AoInJlZ2lzdGVyIG9mZnNldCBtdXN0IGJlIGEgY29uc3RhbnQiLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQlpZiAoKCQzLT5pbmZvLmNpbmZvLT52YWx1ZSArIDEpID4gJDEtPmluZm8ucmluZm8tPnNpemUpIHsKKwkJCXN0b3AoIkFjY2Vzc2luZyBvZmZzZXQgYmV5b25kIHJhbmdlIG9mIHJlZ2lzdGVyIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJCQuc3ltYm9sID0gJDE7CisJCSQkLm9mZnNldCA9ICQzLT5pbmZvLmNpbmZvLT52YWx1ZTsKKwl9Cit8CVRfU1lNQk9MICdbJyBUX05VTUJFUiAnXScKKwl7CisJCXByb2Nlc3NfcmVnaXN0ZXIoJiQxKTsKKwkJaWYgKCgkMyArIDEpID4gJDEtPmluZm8ucmluZm8tPnNpemUpIHsKKwkJCXN0b3AoIkFjY2Vzc2luZyBvZmZzZXQgYmV5b25kIHJhbmdlIG9mIHJlZ2lzdGVyIiwKKwkJCSAgICAgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJCQuc3ltYm9sID0gJDE7CisJCSQkLm9mZnNldCA9ICQzOworCX0KK3wJVF9BCisJeworCQlpZiAoYWNjdW11bGF0b3Iuc3ltYm9sID09IE5VTEwpIHsKKwkJCXN0b3AoIk5vIGFjY3VtdWxhdG9yIGhhcyBiZWVuIGRlZmluZWQiLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQkkJC5zeW1ib2wgPSBhY2N1bXVsYXRvci5zeW1ib2w7CisJCSQkLm9mZnNldCA9IDA7CisJfQorOworCitkZXN0aW5hdGlvbjoKKwlyZWdfc3ltYm9sCisJeworCQl0ZXN0X3dyaXRhYmxlX3N5bWJvbCgkMS5zeW1ib2wpOworCQkkJCA9ICQxOworCX0KKzsKKworaW1tZWRpYXRlOgorCWV4cHJlc3Npb24KKwl7ICQkID0gJDE7IH0KKzsKKworaW1tZWRpYXRlX29yX2E6CisJZXhwcmVzc2lvbgorCXsKKwkJaWYgKCQxLnZhbHVlID09IDAgJiYgaXNfZG93bmxvYWRfY29uc3QoJiQxKSA9PSAwKSB7CisJCQlzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLAorCQkJCSAiXG5FeHByZXNzaW9uIGV2YWx1YXRlcyB0byAwIGFuZCB0aHVzICIKKwkJCQkgInJlZmVyZW5jZXMgdGhlIGFjY3VtdWxhdG9yLlxuICIKKwkJCQkgIklmIHRoaXMgaXMgdGhlIGRlc2lyZWQgZWZmZWN0LCB1c2UgJ0EnICIKKwkJCQkgImluc3RlYWQuXG4iKTsKKwkJCXN0b3AoZXJyYnVmLCBFWF9EQVRBRVJSKTsKKwkJfQorCQkkJCA9ICQxOworCX0KK3wJVF9BCisJeworCQlTTElTVF9JTklUKCYkJC5yZWZlcmVuY2VkX3N5bXMpOworCQlzeW1saXN0X2FkZCgmJCQucmVmZXJlbmNlZF9zeW1zLCBhY2N1bXVsYXRvci5zeW1ib2wsCisJCQkgICAgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJCSQkLnZhbHVlID0gMDsKKwl9Cis7CisKK3NvdXJjZToKKwlyZWdfc3ltYm9sCisJeworCQl0ZXN0X3JlYWRhYmxlX3N5bWJvbCgkMS5zeW1ib2wpOworCQkkJCA9ICQxOworCX0KKzsKKworb3B0X3NvdXJjZToKKwl7CisJCSQkLnN5bWJvbCA9IE5VTEw7CisJCSQkLm9mZnNldCA9IDA7CisJfQorfAknLCcgc291cmNlCisJeyAkJCA9ICQyOyB9Cis7CisKK3JldDoKKwl7ICQkID0gMDsgfQorfAlUX1JFVAorCXsgJCQgPSAxOyB9Cis7CisKK3NldF9zcmNfbW9kZToKKwlUX1NFVF9TUkNfTU9ERSBUX05VTUJFUiAnOycKKwl7CisJCXNyY19tb2RlID0gJDI7CisJfQorOworCitzZXRfZHN0X21vZGU6CisJVF9TRVRfRFNUX01PREUgVF9OVU1CRVIgJzsnCisJeworCQlkc3RfbW9kZSA9ICQyOworCX0KKzsKKworY3JpdGljYWxfc2VjdGlvbl9zdGFydDoKKwlUX0JFR0lOX0NTICc7JworCXsKKwkJY3JpdGljYWxfc2VjdGlvbl90ICpjczsKKworCQlpZiAoaW5fY3JpdGljYWxfc2VjdGlvbiAhPSBGQUxTRSkgeworCQkJc3RvcCgiQ3JpdGljYWwgU2VjdGlvbiB3aXRoaW4gQ3JpdGljYWwgU2VjdGlvbiIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNzID0gY3NfYWxsb2MoKTsKKwkJY3MtPmJlZ2luX2FkZHIgPSBpbnN0cnVjdGlvbl9wdHI7CisJCWluX2NyaXRpY2FsX3NlY3Rpb24gPSBUUlVFOworCX0KKzsKKworY3JpdGljYWxfc2VjdGlvbl9lbmQ6CisJVF9FTkRfQ1MgJzsnCisJeworCQljcml0aWNhbF9zZWN0aW9uX3QgKmNzOworCisJCWlmIChpbl9jcml0aWNhbF9zZWN0aW9uID09IEZBTFNFKSB7CisJCQlzdG9wKCJVbmJhbGxhbmNlZCAnZW5kX2NzJyIsIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNzID0gVEFJTFFfTEFTVCgmY3NfdGFpbHEsIGNzX3RhaWxxKTsKKwkJY3MtPmVuZF9hZGRyID0gaW5zdHJ1Y3Rpb25fcHRyOworCQlpbl9jcml0aWNhbF9zZWN0aW9uID0gRkFMU0U7CisJfQorOworCitleHBvcnQ6CisJeyAkJCA9IDA7IH0KK3wJVF9FWFBPUlQKKwl7ICQkID0gMTsgfQorOworCitsYWJlbDoKKwlleHBvcnQgVF9TWU1CT0wgJzonCisJeworCQlpZiAoJDItPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQkJc3RvcCgiUHJvZ3JhbSBsYWJlbCBtdWx0aXBseSBkZWZpbmVkIiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJJDItPnR5cGUgPSBMQUJFTDsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woJDIpOworCQkkMi0+aW5mby5saW5mby0+YWRkcmVzcyA9IGluc3RydWN0aW9uX3B0cjsKKwkJJDItPmluZm8ubGluZm8tPmV4cG9ydGVkID0gJDE7CisJfQorOworCithZGRyZXNzOgorCVRfU1lNQk9MCisJeworCQkkJC5zeW1ib2wgPSAkMTsKKwkJJCQub2Zmc2V0ID0gMDsKKwl9Cit8CVRfU1lNQk9MICcrJyBUX05VTUJFUgorCXsKKwkJJCQuc3ltYm9sID0gJDE7CisJCSQkLm9mZnNldCA9ICQzOworCX0KK3wJVF9TWU1CT0wgJy0nIFRfTlVNQkVSCisJeworCQkkJC5zeW1ib2wgPSAkMTsKKwkJJCQub2Zmc2V0ID0gLSQzOworCX0KK3wJJy4nCisJeworCQkkJC5zeW1ib2wgPSBOVUxMOworCQkkJC5vZmZzZXQgPSAwOworCX0KK3wJJy4nICcrJyBUX05VTUJFUgorCXsKKwkJJCQuc3ltYm9sID0gTlVMTDsKKwkJJCQub2Zmc2V0ID0gJDM7CisJfQorfAknLicgJy0nIFRfTlVNQkVSCisJeworCQkkJC5zeW1ib2wgPSBOVUxMOworCQkkJC5vZmZzZXQgPSAtJDM7CisJfQorOworCitjb25kaXRpb25hbDoKKwlUX0lGIFRfQ0VYUFIgJ3snCisJeworCQlzY29wZV90ICpuZXdfc2NvcGU7CisKKwkJYWRkX2NvbmRpdGlvbmFsKCQyKTsKKwkJbmV3X3Njb3BlID0gc2NvcGVfYWxsb2MoKTsKKwkJbmV3X3Njb3BlLT50eXBlID0gU0NPUEVfSUY7CisJCW5ld19zY29wZS0+YmVnaW5fYWRkciA9IGluc3RydWN0aW9uX3B0cjsKKwkJbmV3X3Njb3BlLT5mdW5jX251bSA9ICQyLT5pbmZvLmNvbmRpbmZvLT5mdW5jX251bTsKKwl9Cit8CVRfRUxTRSBUX0lGIFRfQ0VYUFIgJ3snCisJeworCQlzY29wZV90ICpuZXdfc2NvcGU7CisJCXNjb3BlX3QgKnNjb3BlX2NvbnRleHQ7CisJCXNjb3BlX3QgKmxhc3Rfc2NvcGU7CisKKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzIHNjb3BlIGlzIGVpdGhlciBhbgorCQkgKiBpZiBvciBhbmQgZWxzZSBpZi4KKwkJICovCisJCXNjb3BlX2NvbnRleHQgPSBTTElTVF9GSVJTVCgmc2NvcGVfc3RhY2spOworCQlsYXN0X3Njb3BlID0gVEFJTFFfTEFTVCgmc2NvcGVfY29udGV4dC0+aW5uZXJfc2NvcGUsCisJCQkJCXNjb3BlX3RhaWxxKTsKKwkJaWYgKGxhc3Rfc2NvcGUgPT0gTlVMTAorCQkgfHwgbGFzdF9zY29wZS0+dHlwZSA9PSBUX0VMU0UpIHsKKworCQkJc3RvcCgiJ2Vsc2UgaWYnIHdpdGhvdXQgbGVhZGluZyAnaWYnIiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJYWRkX2NvbmRpdGlvbmFsKCQzKTsKKwkJbmV3X3Njb3BlID0gc2NvcGVfYWxsb2MoKTsKKwkJbmV3X3Njb3BlLT50eXBlID0gU0NPUEVfRUxTRV9JRjsKKwkJbmV3X3Njb3BlLT5iZWdpbl9hZGRyID0gaW5zdHJ1Y3Rpb25fcHRyOworCQluZXdfc2NvcGUtPmZ1bmNfbnVtID0gJDMtPmluZm8uY29uZGluZm8tPmZ1bmNfbnVtOworCX0KK3wJVF9FTFNFICd7JworCXsKKwkJc2NvcGVfdCAqbmV3X3Njb3BlOworCQlzY29wZV90ICpzY29wZV9jb250ZXh0OworCQlzY29wZV90ICpsYXN0X3Njb3BlOworCisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cyBzY29wZSBpcyBlaXRoZXIgYW4KKwkJICogaWYgb3IgYW5kIGVsc2UgaWYuCisJCSAqLworCQlzY29wZV9jb250ZXh0ID0gU0xJU1RfRklSU1QoJnNjb3BlX3N0YWNrKTsKKwkJbGFzdF9zY29wZSA9IFRBSUxRX0xBU1QoJnNjb3BlX2NvbnRleHQtPmlubmVyX3Njb3BlLAorCQkJCQlzY29wZV90YWlscSk7CisJCWlmIChsYXN0X3Njb3BlID09IE5VTEwKKwkJIHx8IGxhc3Rfc2NvcGUtPnR5cGUgPT0gU0NPUEVfRUxTRSkgeworCisJCQlzdG9wKCInZWxzZScgd2l0aG91dCBsZWFkaW5nICdpZiciLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQluZXdfc2NvcGUgPSBzY29wZV9hbGxvYygpOworCQluZXdfc2NvcGUtPnR5cGUgPSBTQ09QRV9FTFNFOworCQluZXdfc2NvcGUtPmJlZ2luX2FkZHIgPSBpbnN0cnVjdGlvbl9wdHI7CisJfQorOworCitjb25kaXRpb25hbDoKKwknfScKKwl7CisJCXNjb3BlX3QgKnNjb3BlX2NvbnRleHQ7CisKKwkJc2NvcGVfY29udGV4dCA9IFNMSVNUX0ZJUlNUKCZzY29wZV9zdGFjayk7CisJCWlmIChzY29wZV9jb250ZXh0LT50eXBlID09IFNDT1BFX1JPT1QpIHsKKwkJCXN0b3AoIlVuZXhwZWN0ZWQgJ30nIGVuY291bnRlcmVkIiwgRVhfREFUQUVSUik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKworCQlzY29wZV9jb250ZXh0LT5lbmRfYWRkciA9IGluc3RydWN0aW9uX3B0cjsKKworCQkvKiBQb3AgdGhlIHNjb3BlICovCisJCVNMSVNUX1JFTU9WRV9IRUFEKCZzY29wZV9zdGFjaywgc2NvcGVfc3RhY2tfbGlua3MpOworCisJCXByb2Nlc3Nfc2NvcGUoc2NvcGVfY29udGV4dCk7CisKKwkJaWYgKFNMSVNUX0ZJUlNUKCZzY29wZV9zdGFjaykgPT0gTlVMTCkgeworCQkJc3RvcCgiVW5leHBlY3RlZCAnfScgZW5jb3VudGVyZWQiLCBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKzsKKworZjFfb3Bjb2RlOgorCVRfQU5EIHsgJCQgPSBBSUNfT1BfQU5EOyB9Cit8CVRfWE9SIHsgJCQgPSBBSUNfT1BfWE9SOyB9Cit8CVRfQUREIHsgJCQgPSBBSUNfT1BfQUREOyB9Cit8CVRfQURDIHsgJCQgPSBBSUNfT1BfQURDOyB9Cis7CisKK2NvZGU6CisJZjFfb3Bjb2RlIGRlc3RpbmF0aW9uICcsJyBpbW1lZGlhdGVfb3JfYSBvcHRfc291cmNlIHJldCAnOycKKwl7CisJCWZvcm1hdF8xX2luc3RyKCQxLCAmJDIsICYkNCwgJiQ1LCAkNik7CisJfQorOworCitjb2RlOgorCVRfT1IgcmVnX3N5bWJvbCAnLCcgaW1tZWRpYXRlX29yX2Egb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfT1IsICYkMiwgJiQ0LCAmJDUsICQ2KTsKKwl9Cis7CisKK2NvZGU6CisJVF9JTkMgZGVzdGluYXRpb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgMSk7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9BREQsICYkMiwgJmltbWVkLCAmJDMsICQ0KTsKKwl9Cis7CisKK2NvZGU6CisJVF9ERUMgZGVzdGluYXRpb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgLTEpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQURELCAmJDIsICZpbW1lZCwgJiQzLCAkNCk7CisJfQorOworCitjb2RlOgorCVRfQ0xDIHJldCAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAtMSk7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9BREQsICZub25lLCAmaW1tZWQsICZhbGx6ZXJvcywgJDIpOworCX0KK3wJVF9DTEMgVF9NVkkgZGVzdGluYXRpb24gJywnIGltbWVkaWF0ZV9vcl9hIHJldCAnOycKKwl7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9BREQsICYkMywgJiQ1LCAmYWxsemVyb3MsICQ2KTsKKwl9Cis7CisKK2NvZGU6CisJVF9TVEMgcmV0ICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDEpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQURELCAmbm9uZSwgJmltbWVkLCAmYWxsb25lcywgJDIpOworCX0KK3wJVF9TVEMgZGVzdGluYXRpb24gcmV0ICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDEpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQURELCAmJDIsICZpbW1lZCwgJmFsbG9uZXMsICQzKTsKKwl9Cis7CisKK2NvZGU6CisJVF9CTU9WIGRlc3RpbmF0aW9uICcsJyBzb3VyY2UgJywnIGltbWVkaWF0ZSByZXQgJzsnCisJeworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQk1PViwgJiQyLCAmJDYsICYkNCwgJDcpOworCX0KKzsKKworY29kZToKKwlUX01PViBkZXN0aW5hdGlvbiAnLCcgc291cmNlIHJldCAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAxKTsKKwkJZm9ybWF0XzFfaW5zdHIoQUlDX09QX0JNT1YsICYkMiwgJmltbWVkLCAmJDQsICQ1KTsKKwl9Cis7CisKK2NvZGU6CisJVF9NVkkgZGVzdGluYXRpb24gJywnIGltbWVkaWF0ZSByZXQgJzsnCisJeworCQlpZiAoJDQudmFsdWUgPT0gMAorCQkgJiYgaXNfZG93bmxvYWRfY29uc3QoJiQ0KSA9PSAwKSB7CisJCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJCS8qCisJCQkgKiBBbGxvdyBtb3ZlIGltbWVkaWF0ZXMgb2YgMCBzbyB0aGF0IG1hY3JvcywKKwkJCSAqIHRoYXQgY2FuJ3Qga25vdyB0aGUgaW1tZWRpYXRlJ3MgdmFsdWUgYW5kCisJCQkgKiBvdGhlcndpc2UgY29tcGVuc2F0ZSwgc3RpbGwgd29yay4KKwkJCSAqLworCQkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgMSk7CisJCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQk1PViwgJiQyLCAmaW1tZWQsICZhbGx6ZXJvcywgJDUpOworCQl9IGVsc2UgeworCQkJZm9ybWF0XzFfaW5zdHIoQUlDX09QX09SLCAmJDIsICYkNCwgJmFsbHplcm9zLCAkNSk7CisJCX0KKwl9Cis7CisKK2NvZGU6CisJVF9OT1QgZGVzdGluYXRpb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlleHByZXNzaW9uX3QgaW1tZWQ7CisKKwkJbWFrZV9leHByZXNzaW9uKCZpbW1lZCwgMHhmZik7CisJCWZvcm1hdF8xX2luc3RyKEFJQ19PUF9YT1IsICYkMiwgJmltbWVkLCAmJDMsICQ0KTsKKwl9Cis7CisKK2NvZGU6CisJVF9DTFIgZGVzdGluYXRpb24gcmV0ICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDB4ZmYpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQU5ELCAmJDIsICZpbW1lZCwgJmFsbHplcm9zLCAkMyk7CisJfQorOworCitjb2RlOgorCVRfTk9QIHJldCAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAweGZmKTsKKwkJZm9ybWF0XzFfaW5zdHIoQUlDX09QX0FORCwgJm5vbmUsICZpbW1lZCwgJmFsbHplcm9zLCAkMik7CisJfQorOworCitjb2RlOgorCVRfUkVUICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDB4ZmYpOworCQlmb3JtYXRfMV9pbnN0cihBSUNfT1BfQU5ELCAmbm9uZSwgJmltbWVkLCAmYWxsemVyb3MsIFRSVUUpOworCX0KKzsKKworCS8qCisJICogVGhpcyBncmFtbWVyIGRpZmZlcnMgZnJvbSB0aGUgb25lIGluIHRoZSBhaWM3eHh4CisJICogcmVmZXJlbmNlIG1hbnVhbCBzaW5jZSB0aGUgZ3JhbW1lciBsaXN0ZWQgdGhlcmUgaXMKKwkgKiBhbWJpZ3VvdXMgYW5kIGNhdXNlcyBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4KKwkgKiBJdCBhbHNvIHNlZW1zIG1vcmUgbG9naWNhbCBhcyB0aGUgImltbWVkaWF0ZSIKKwkgKiBhcmd1bWVudCBpcyBsaXN0ZWQgYXMgdGhlIHNlY29uZCBhcmcgbGlrZSB0aGUKKwkgKiBvdGhlciBmb3JtYXRzLgorCSAqLworCitmMl9vcGNvZGU6CisJVF9TSEwgeyAkJCA9IEFJQ19PUF9TSEw7IH0KK3wJVF9TSFIgeyAkJCA9IEFJQ19PUF9TSFI7IH0KK3wJVF9ST0wgeyAkJCA9IEFJQ19PUF9ST0w7IH0KK3wJVF9ST1IgeyAkJCA9IEFJQ19PUF9ST1I7IH0KKzsKKworY29kZToKKwlmMl9vcGNvZGUgZGVzdGluYXRpb24gJywnIGV4cHJlc3Npb24gb3B0X3NvdXJjZSByZXQgJzsnCisJeworCQlmb3JtYXRfMl9pbnN0cigkMSwgJiQyLCAmJDQsICYkNSwgJDYpOworCX0KKzsKKworam1wX2pjX2puY19jYWxsOgorCVRfSk1QCXsgJCQgPSBBSUNfT1BfSk1QOyB9Cit8CVRfSkMJeyAkJCA9IEFJQ19PUF9KQzsgfQorfAlUX0pOQwl7ICQkID0gQUlDX09QX0pOQzsgfQorfAlUX0NBTEwJeyAkJCA9IEFJQ19PUF9DQUxMOyB9Cis7CisKK2p6X2puejoKKwlUX0paCXsgJCQgPSBBSUNfT1BfSlo7IH0KK3wJVF9KTloJeyAkJCA9IEFJQ19PUF9KTlo7IH0KKzsKKworamVfam5lOgorCVRfSkUJeyAkJCA9IEFJQ19PUF9KRTsgfQorfAlUX0pORQl7ICQkID0gQUlDX09QX0pORTsgfQorOworCitjb2RlOgorCWptcF9qY19qbmNfY2FsbCBhZGRyZXNzICc7JworCXsKKwkJZXhwcmVzc2lvbl90IGltbWVkOworCisJCW1ha2VfZXhwcmVzc2lvbigmaW1tZWQsIDApOworCQlmb3JtYXRfM19pbnN0cigkMSwgJnNpbmRleCwgJmltbWVkLCAmJDIpOworCX0KKzsKKworY29kZToKKwlUX09SIHJlZ19zeW1ib2wgJywnIGltbWVkaWF0ZSBqbXBfamNfam5jX2NhbGwgYWRkcmVzcyAnOycKKwl7CisJCWZvcm1hdF8zX2luc3RyKCQ1LCAmJDIsICYkNCwgJiQ2KTsKKwl9Cis7CisKK2NvZGU6CisJVF9URVNUIHNvdXJjZSAnLCcgaW1tZWRpYXRlX29yX2Eganpfam56IGFkZHJlc3MgJzsnCisJeworCQlmb3JtYXRfM19pbnN0cigkNSwgJiQyLCAmJDQsICYkNik7CisJfQorOworCitjb2RlOgorCVRfQ01QIHNvdXJjZSAnLCcgaW1tZWRpYXRlX29yX2EgamVfam5lIGFkZHJlc3MgJzsnCisJeworCQlmb3JtYXRfM19pbnN0cigkNSwgJiQyLCAmJDQsICYkNik7CisJfQorOworCitjb2RlOgorCVRfTU9WIHNvdXJjZSBqbXBfamNfam5jX2NhbGwgYWRkcmVzcyAnOycKKwl7CisJCWV4cHJlc3Npb25fdCBpbW1lZDsKKworCQltYWtlX2V4cHJlc3Npb24oJmltbWVkLCAwKTsKKwkJZm9ybWF0XzNfaW5zdHIoJDMsICYkMiwgJmltbWVkLCAmJDQpOworCX0KKzsKKworY29kZToKKwlUX01WSSBpbW1lZGlhdGUgam1wX2pjX2puY19jYWxsIGFkZHJlc3MgJzsnCisJeworCQlmb3JtYXRfM19pbnN0cigkMywgJmFsbHplcm9zLCAmJDIsICYkNCk7CisJfQorOworCislJQorCitzdGF0aWMgdm9pZAorcHJvY2Vzc19maWVsZChpbnQgZmllbGRfdHlwZSwgc3ltYm9sX3QgKnN5bSwgaW50IHZhbHVlKQoreworCS8qCisJICogQWRkIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHRvIGl0cworCSAqIHN5bWJvbCBsaXN0LCBpZiBpdCBhbHJlYWR5IGV4aXN0cywKKwkgKiB3YXJuIGlmIHdlIGFyZSBzZXR0aW5nIGl0IHRvIGEKKwkgKiBkaWZmZXJlbnQgdmFsdWUsIG9yIGluIHRoZSBiaXQgdG8KKwkgKiB0aGUgImFsbG93ZWQgYml0cyIgb2YgdGhpcyByZWdpc3Rlci4KKwkgKi8KKwlpZiAoc3ltLT50eXBlID09IFVOSU5JVElBTElaRUQpIHsKKwkJc3ltLT50eXBlID0gZmllbGRfdHlwZTsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woc3ltKTsKKwkJc3ltLT5pbmZvLmZpbmZvLT52YWx1ZSA9IHZhbHVlOworCQlpZiAoZmllbGRfdHlwZSAhPSBFTlVNX0VOVFJZKSB7CisJCQlpZiAoZmllbGRfdHlwZSAhPSBNQVNLICYmIHZhbHVlID09IDApIHsKKwkJCQlzdG9wKCJFbXB0eSBGaWVsZCwgb3IgRW51bSIsIEVYX0RBVEFFUlIpOworCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCX0KKwkJCXN5bS0+aW5mby5maW5mby0+dmFsdWUgPSB2YWx1ZTsKKwkJCXN5bS0+aW5mby5maW5mby0+bWFzayA9IHZhbHVlOworCQl9IGVsc2UgaWYgKGZpZWxkX3N5bWJvbCAhPSBOVUxMKSB7CisJCQlzeW0tPmluZm8uZmluZm8tPm1hc2sgPSBmaWVsZF9zeW1ib2wtPmluZm8uZmluZm8tPnZhbHVlOworCQl9IGVsc2UgeworCQkJc3ltLT5pbmZvLmZpbmZvLT5tYXNrID0gMHhGRjsKKwkJfQorCX0gZWxzZSBpZiAoc3ltLT50eXBlICE9IGZpZWxkX3R5cGUpIHsKKwkJc3RvcCgiRmllbGQgZGVmaW5pdGlvbiBtaXJyb3JzIGEgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZSAiCisJCSAgICAgIiBuYW1lLCBidXQgYSBkaWZmZXJlbnQgdHlwZSIsIEVYX0RBVEFFUlIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfSBlbHNlIGlmICh2YWx1ZSAhPSBzeW0tPmluZm8uZmluZm8tPnZhbHVlKSB7CisJCXN0b3AoIkZpZWxkIHJlZGVmaW5lZCB3aXRoIGEgY29uZmxpY3RpbmcgdmFsdWUiLCBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwkvKiBGYWlsIGlmIHRoaXMgc3ltYm9sIGlzIGFscmVhZHkgbGlzdGVkICovCisJaWYgKHN5bWxpc3Rfc2VhcmNoKCYoc3ltLT5pbmZvLmZpbmZvLT5zeW1yZWZzKSwKKwkJCSAgIGN1cl9zeW1ib2wtPm5hbWUpICE9IE5VTEwpIHsKKwkJc3RvcCgiRmllbGQgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcyBmb3IgcmVnaXN0ZXIiLCBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlzeW1saXN0X2FkZCgmKHN5bS0+aW5mby5maW5mby0+c3ltcmVmcyksIGN1cl9zeW1ib2wsCisJCSAgICBTWU1MSVNUX0lOU0VSVF9IRUFEKTsKKwljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT52YWxpZF9iaXRtYXNrIHw9IHN5bS0+aW5mby5maW5mby0+bWFzazsKKwljdXJfc3ltYm9sLT5pbmZvLnJpbmZvLT50eXBlY2hlY2tfbWFza3MgPSBUUlVFOworCXN5bWxpc3RfYWRkKCYoY3VyX3N5bWJvbC0+aW5mby5yaW5mby0+ZmllbGRzKSwgc3ltLCBTWU1MSVNUX1NPUlQpOworfQorCitzdGF0aWMgdm9pZAoraW5pdGlhbGl6ZV9zeW1ib2woc3ltYm9sX3QgKnN5bWJvbCkKK3sKKwlzd2l0Y2ggKHN5bWJvbC0+dHlwZSkgeworCWNhc2UgVU5JTklUSUFMSVpFRDoKKwkJc3RvcCgiQ2FsbCB0byBpbml0aWFsaXplX3N5bWJvbCB3aXRoIHR5cGUgZmllbGQgdW5zZXQiLAorCQkgICAgIEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCQlicmVhazsKKwljYXNlIFJFR0lTVEVSOgorCWNhc2UgU1JBTUxPQzoKKwljYXNlIFNDQkxPQzoKKwkJc3ltYm9sLT5pbmZvLnJpbmZvID0KKwkJICAgIChzdHJ1Y3QgcmVnX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWdfaW5mbykpOworCQlpZiAoc3ltYm9sLT5pbmZvLnJpbmZvID09IE5VTEwpIHsKKwkJCXN0b3AoIkNhbid0IGNyZWF0ZSByZWdpc3RlciBpbmZvIiwgRVhfU09GVFdBUkUpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW1lbXNldChzeW1ib2wtPmluZm8ucmluZm8sIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJlZ19pbmZvKSk7CisJCVNMSVNUX0lOSVQoJihzeW1ib2wtPmluZm8ucmluZm8tPmZpZWxkcykpOworCQkvKgorCQkgKiBEZWZhdWx0IHRvIGFsbG93aW5nIGFjY2VzcyBpbiBhbGwgcmVnaXN0ZXIgbW9kZXMKKwkJICogb3IgdG8gdGhlIG1vZGUgc3BlY2lmaWVkIGJ5IHRoZSBTQ0Igb3IgU1JBTSBzcGFjZQorCQkgKiB3ZSBhcmUgaW4uCisJCSAqLworCQlpZiAoc2NiX29yX3NyYW1fc3ltYm9sICE9IE5VTEwpCisJCQlzeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzID0KKwkJCSAgICBzY2Jfb3Jfc3JhbV9zeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzOworCQllbHNlCisJCQlzeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzID0gfjA7CisJCWJyZWFrOworCWNhc2UgQUxJQVM6CisJCXN5bWJvbC0+aW5mby5haW5mbyA9CisJCSAgICAoc3RydWN0IGFsaWFzX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlhc19pbmZvKSk7CisJCWlmIChzeW1ib2wtPmluZm8uYWluZm8gPT0gTlVMTCkgeworCQkJc3RvcCgiQ2FuJ3QgY3JlYXRlIGFsaWFzIGluZm8iLCBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJbWVtc2V0KHN5bWJvbC0+aW5mby5haW5mbywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYWxpYXNfaW5mbykpOworCQlicmVhazsKKwljYXNlIE1BU0s6CisJY2FzZSBGSUVMRDoKKwljYXNlIEVOVU06CisJY2FzZSBFTlVNX0VOVFJZOgorCQlzeW1ib2wtPmluZm8uZmluZm8gPQorCQkgICAgKHN0cnVjdCBmaWVsZF9pbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmllbGRfaW5mbykpOworCQlpZiAoc3ltYm9sLT5pbmZvLmZpbmZvID09IE5VTEwpIHsKKwkJCXN0b3AoIkNhbid0IGNyZWF0ZSBmaWVsZCBpbmZvIiwgRVhfU09GVFdBUkUpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCW1lbXNldChzeW1ib2wtPmluZm8uZmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZmllbGRfaW5mbykpOworCQlTTElTVF9JTklUKCYoc3ltYm9sLT5pbmZvLmZpbmZvLT5zeW1yZWZzKSk7CisJCWJyZWFrOworCWNhc2UgQ09OU1Q6CisJY2FzZSBET1dOTE9BRF9DT05TVDoKKwkJc3ltYm9sLT5pbmZvLmNpbmZvID0KKwkJICAgIChzdHJ1Y3QgY29uc3RfaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbnN0X2luZm8pKTsKKwkJaWYgKHN5bWJvbC0+aW5mby5jaW5mbyA9PSBOVUxMKSB7CisJCQlzdG9wKCJDYW4ndCBjcmVhdGUgYWxpYXMgaW5mbyIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltZW1zZXQoc3ltYm9sLT5pbmZvLmNpbmZvLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb25zdF9pbmZvKSk7CisJCWJyZWFrOworCWNhc2UgTEFCRUw6CisJCXN5bWJvbC0+aW5mby5saW5mbyA9CisJCSAgICAoc3RydWN0IGxhYmVsX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBsYWJlbF9pbmZvKSk7CisJCWlmIChzeW1ib2wtPmluZm8ubGluZm8gPT0gTlVMTCkgeworCQkJc3RvcCgiQ2FuJ3QgY3JlYXRlIGxhYmVsIGluZm8iLCBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJbWVtc2V0KHN5bWJvbC0+aW5mby5saW5mbywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbGFiZWxfaW5mbykpOworCQlicmVhazsKKwljYXNlIENPTkRJVElPTkFMOgorCQlzeW1ib2wtPmluZm8uY29uZGluZm8gPQorCQkgICAgKHN0cnVjdCBjb25kX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25kX2luZm8pKTsKKwkJaWYgKHN5bWJvbC0+aW5mby5jb25kaW5mbyA9PSBOVUxMKSB7CisJCQlzdG9wKCJDYW4ndCBjcmVhdGUgY29uZGl0aW9uYWwgaW5mbyIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltZW1zZXQoc3ltYm9sLT5pbmZvLmNvbmRpbmZvLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb25kX2luZm8pKTsKKwkJYnJlYWs7CisJY2FzZSBNQUNSTzoKKwkJc3ltYm9sLT5pbmZvLm1hY3JvaW5mbyA9IAorCQkgICAgKHN0cnVjdCBtYWNyb19pbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWFjcm9faW5mbykpOworCQlpZiAoc3ltYm9sLT5pbmZvLm1hY3JvaW5mbyA9PSBOVUxMKSB7CisJCQlzdG9wKCJDYW4ndCBjcmVhdGUgbWFjcm8gaW5mbyIsIEVYX1NPRlRXQVJFKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltZW1zZXQoc3ltYm9sLT5pbmZvLm1hY3JvaW5mbywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWFjcm9faW5mbykpOworCQlTVEFJTFFfSU5JVCgmc3ltYm9sLT5pbmZvLm1hY3JvaW5mby0+YXJncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0b3AoIkNhbGwgdG8gaW5pdGlhbGl6ZV9zeW1ib2wgd2l0aCBpbnZhbGlkIHN5bWJvbCB0eXBlIiwKKwkJICAgICBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWRkX21hY3JvX2FyZyhjb25zdCBjaGFyICphcmd0ZXh0LCBpbnQgYXJnbnVtKQoreworCXN0cnVjdCBtYWNyb19hcmcgKm1hcmc7CisJaW50IGk7CisJaW50IHJldHZhbDsKKwkJCisKKwlpZiAoY3VyX3N5bWJvbCA9PSBOVUxMIHx8IGN1cl9zeW1ib2wtPnR5cGUgIT0gTUFDUk8pIHsKKwkJc3RvcCgiSW52YWxpZCBjdXJyZW50IHN5bWJvbCBmb3IgYWRkaW5nIG1hY3JvIGFyZyIsCisJCSAgICAgRVhfU09GVFdBUkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJbWFyZyA9IChzdHJ1Y3QgbWFjcm9fYXJnICopbWFsbG9jKHNpemVvZigqbWFyZykpOworCWlmIChtYXJnID09IE5VTEwpIHsKKwkJc3RvcCgiQ2FuJ3QgY3JlYXRlIG1hY3JvX2FyZyBzdHJ1Y3R1cmUiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJbWFyZy0+cmVwbGFjZW1lbnRfdGV4dCA9IE5VTEw7CisJcmV0dmFsID0gc25wcmludGYocmVnZXhfcGF0dGVybiwgc2l6ZW9mKHJlZ2V4X3BhdHRlcm4pLAorCQkJICAiW14tL0EtWmEtejAtOV9dKCVzKShbXi0vQS1aYS16MC05X118JCkiLAorCQkJICBhcmd0ZXh0KTsKKwlpZiAocmV0dmFsID49IHNpemVvZihyZWdleF9wYXR0ZXJuKSkgeworCQlzdG9wKCJSZWdleCB0ZXh0IGJ1ZmZlciB0b28gc21hbGwgZm9yIGFyZyIsCisJCSAgICAgRVhfU09GVFdBUkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCXJldHZhbCA9IHJlZ2NvbXAoJm1hcmctPmFyZ19yZWdleCwgcmVnZXhfcGF0dGVybiwgUkVHX0VYVEVOREVEKTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJc3RvcCgiUmVnZXggY29tcGlsYXRpb24gZmFpbGVkIiwgRVhfU09GVFdBUkUpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCVNUQUlMUV9JTlNFUlRfVEFJTCgmY3VyX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPmFyZ3MsIG1hcmcsIGxpbmtzKTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9tYWNyb19ib2R5KGNvbnN0IGNoYXIgKmJvZHl0ZXh0KQoreworCWlmIChjdXJfc3ltYm9sID09IE5VTEwgfHwgY3VyX3N5bWJvbC0+dHlwZSAhPSBNQUNSTykgeworCQlzdG9wKCJJbnZhbGlkIGN1cnJlbnQgc3ltYm9sIGZvciBhZGRpbmcgbWFjcm8gYXJnIiwKKwkJICAgICBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJY3VyX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPmJvZHkgPSBzdHJkdXAoYm9keXRleHQpOworCWlmIChjdXJfc3ltYm9sLT5pbmZvLm1hY3JvaW5mby0+Ym9keSA9PSBOVUxMKSB7CisJCXN0b3AoIkNhbid0IGR1cGxpY2F0ZSBtYWNybyBib2R5IHRleHQiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX3JlZ2lzdGVyKHN5bWJvbF90ICoqcF9zeW1ib2wpCit7CisJc3ltYm9sX3QgKnN5bWJvbCA9ICpwX3N5bWJvbDsKKworCWlmIChzeW1ib2wtPnR5cGUgPT0gVU5JTklUSUFMSVpFRCkgeworCQlzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVW5kZWZpbmVkIHJlZ2lzdGVyICVzIiwKKwkJCSBzeW1ib2wtPm5hbWUpOworCQlzdG9wKGVycmJ1ZiwgRVhfREFUQUVSUik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9IGVsc2UgaWYgKHN5bWJvbC0+dHlwZSA9PSBBTElBUykgeworCQkqcF9zeW1ib2wgPSBzeW1ib2wtPmluZm8uYWluZm8tPnBhcmVudDsKKwl9IGVsc2UgaWYgKChzeW1ib2wtPnR5cGUgIT0gUkVHSVNURVIpCisJCSYmIChzeW1ib2wtPnR5cGUgIT0gU0NCTE9DKQorCQkmJiAoc3ltYm9sLT50eXBlICE9IFNSQU1MT0MpKSB7CisJCXNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksCisJCQkgIlNwZWNpZmllZCBzeW1ib2wgJXMgaXMgbm90IGEgcmVnaXN0ZXIiLAorCQkJIHN5bWJvbC0+bmFtZSk7CisJCXN0b3AoZXJyYnVmLCBFWF9EQVRBRVJSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfMV9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsIGV4cHJlc3Npb25fdCAqaW1tZWQsCisJICAgICAgIHN5bWJvbF9yZWZfdCAqc3JjLCBpbnQgcmV0KQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zdHI7CisJc3RydWN0IGluc19mb3JtYXQxICpmMV9pbnN0cjsKKworCWlmIChzcmMtPnN5bWJvbCA9PSBOVUxMKQorCQlzcmMgPSBkZXN0OworCisJLyogVGVzdCByZWdpc3RlciBwZXJtaXNzaW9ucyAqLworCXRlc3Rfd3JpdGFibGVfc3ltYm9sKGRlc3QtPnN5bWJvbCk7CisJdGVzdF9yZWFkYWJsZV9zeW1ib2woc3JjLT5zeW1ib2wpOworCisJLyogRW5zdXJlIHRoYXQgaW1tZWRpYXRlIG1ha2VzIHNlbnNlIGZvciB0aGlzIGRlc3RpbmF0aW9uICovCisJdHlwZV9jaGVjayhkZXN0LT5zeW1ib2wsIGltbWVkLCBvcGNvZGUpOworCisJLyogQWxsb2NhdGUgc2VxdWVuY2VyIHNwYWNlIGZvciB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGZpbGwgaXQgb3V0ICovCisJaW5zdHIgPSBzZXFfYWxsb2MoKTsKKwlmMV9pbnN0ciA9ICZpbnN0ci0+Zm9ybWF0LmZvcm1hdDE7CisJZjFfaW5zdHItPnJldCA9IHJldCA/IDEgOiAwOworCWYxX2luc3RyLT5vcGNvZGUgPSBvcGNvZGU7CisJZjFfaW5zdHItPmRlc3RpbmF0aW9uID0gZGVzdC0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzCisJCQkgICAgICArIGRlc3QtPm9mZnNldDsKKwlmMV9pbnN0ci0+c291cmNlID0gc3JjLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MKKwkJCSArIHNyYy0+b2Zmc2V0OworCWYxX2luc3RyLT5pbW1lZGlhdGUgPSBpbW1lZC0+dmFsdWU7CisKKwlpZiAoaXNfZG93bmxvYWRfY29uc3QoaW1tZWQpKQorCQlmMV9pbnN0ci0+cGFyaXR5ID0gMTsKKwllbHNlIGlmIChkZXN0LT5zeW1ib2wgPT0gbW9kZV9wdHIuc3ltYm9sKSB7CisJCXVfaW50IHNyY192YWx1ZTsKKwkJdV9pbnQgZHN0X3ZhbHVlOworCisJCS8qCisJCSAqIEF0dGVtcHQgdG8gdXBkYXRlIG1vZGUgaW5mb3JtYXRpb24gaWYKKwkJICogd2UgYXJlIG9wZXJhdGluZyBvbiB0aGUgbW9kZSByZWdpc3Rlci4KKwkJICovCisJCWlmIChzcmMtPnN5bWJvbCA9PSBhbGxvbmVzLnN5bWJvbCkKKwkJCXNyY192YWx1ZSA9IDB4RkY7CisJCWVsc2UgaWYgKHNyYy0+c3ltYm9sID09IGFsbHplcm9zLnN5bWJvbCkKKwkJCXNyY192YWx1ZSA9IDA7CisJCWVsc2UgaWYgKHNyYy0+c3ltYm9sID09IG1vZGVfcHRyLnN5bWJvbCkKKwkJCXNyY192YWx1ZSA9IChkc3RfbW9kZSA8PCA0KSB8IHNyY19tb2RlOworCQllbHNlCisJCQlnb3RvIGNhbnRfdXBkYXRlOworCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgQUlDX09QX0FORDoKKwkJCWRzdF92YWx1ZSA9IHNyY192YWx1ZSAmIGltbWVkLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEFJQ19PUF9YT1I6CisJCQlkc3RfdmFsdWUgPSBzcmNfdmFsdWUgXiBpbW1lZC0+dmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBBSUNfT1BfQUREOgorCQkJZHN0X3ZhbHVlID0gKHNyY192YWx1ZSArIGltbWVkLT52YWx1ZSkgJiAweEZGOworCQkJYnJlYWs7CisJCWNhc2UgQUlDX09QX09SOgorCQkJZHN0X3ZhbHVlID0gc3JjX3ZhbHVlIHwgaW1tZWQtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgQUlDX09QX0JNT1Y6CisJCQlkc3RfdmFsdWUgPSBzcmNfdmFsdWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gY2FudF91cGRhdGU7CisJCX0KKwkJc3JjX21vZGUgPSBkc3RfdmFsdWUgJiAweEY7CisJCWRzdF9tb2RlID0gKGRzdF92YWx1ZSA+PiA0KSAmIDB4RjsKKwl9CisKK2NhbnRfdXBkYXRlOgorCXN5bWxpc3RfZnJlZSgmaW1tZWQtPnJlZmVyZW5jZWRfc3ltcyk7CisJaW5zdHJ1Y3Rpb25fcHRyKys7Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfMl9pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKmRlc3QsIGV4cHJlc3Npb25fdCAqcGxhY2VzLAorCSAgICAgICBzeW1ib2xfcmVmX3QgKnNyYywgaW50IHJldCkKK3sKKwlzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc3RyOworCXN0cnVjdCBpbnNfZm9ybWF0MiAqZjJfaW5zdHI7CisJdWludDhfdCBzaGlmdF9jb250cm9sOworCisJaWYgKHNyYy0+c3ltYm9sID09IE5VTEwpCisJCXNyYyA9IGRlc3Q7CisKKwkvKiBUZXN0IHJlZ2lzdGVyIHBlcm1pc3Npb25zICovCisJdGVzdF93cml0YWJsZV9zeW1ib2woZGVzdC0+c3ltYm9sKTsKKwl0ZXN0X3JlYWRhYmxlX3N5bWJvbChzcmMtPnN5bWJvbCk7CisKKwkvKiBBbGxvY2F0ZSBzZXF1ZW5jZXIgc3BhY2UgZm9yIHRoZSBpbnN0cnVjdGlvbiBhbmQgZmlsbCBpdCBvdXQgKi8KKwlpbnN0ciA9IHNlcV9hbGxvYygpOworCWYyX2luc3RyID0gJmluc3RyLT5mb3JtYXQuZm9ybWF0MjsKKwlmMl9pbnN0ci0+cmV0ID0gcmV0ID8gMSA6IDA7CisJZjJfaW5zdHItPm9wY29kZSA9IEFJQ19PUF9ST0w7CisJZjJfaW5zdHItPmRlc3RpbmF0aW9uID0gZGVzdC0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzCisJCQkgICAgICArIGRlc3QtPm9mZnNldDsKKwlmMl9pbnN0ci0+c291cmNlID0gc3JjLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MKKwkJCSArIHNyYy0+b2Zmc2V0OworCWlmIChwbGFjZXMtPnZhbHVlID4gOCB8fCBwbGFjZXMtPnZhbHVlIDw9IDApIHsKKwkJc3RvcCgiaWxsZWdhbCBzaGlmdCB2YWx1ZSIsIEVYX0RBVEFFUlIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBSUNfT1BfU0hMOgorCQlpZiAocGxhY2VzLT52YWx1ZSA9PSA4KQorCQkJc2hpZnRfY29udHJvbCA9IDB4ZjA7CisJCWVsc2UKKwkJCXNoaWZ0X2NvbnRyb2wgPSAocGxhY2VzLT52YWx1ZSA8PCA0KSB8IHBsYWNlcy0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgQUlDX09QX1NIUjoKKwkJaWYgKHBsYWNlcy0+dmFsdWUgPT0gOCkgeworCQkJc2hpZnRfY29udHJvbCA9IDB4Zjg7CisJCX0gZWxzZSB7CisJCQlzaGlmdF9jb250cm9sID0gKHBsYWNlcy0+dmFsdWUgPDwgNCkKKwkJCQkgICAgICB8ICg4IC0gcGxhY2VzLT52YWx1ZSkKKwkJCQkgICAgICB8IDB4MDg7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBSUNfT1BfUk9MOgorCQlzaGlmdF9jb250cm9sID0gcGxhY2VzLT52YWx1ZSAmIDB4NzsKKwkJYnJlYWs7CisJY2FzZSBBSUNfT1BfUk9SOgorCQlzaGlmdF9jb250cm9sID0gKDggLSBwbGFjZXMtPnZhbHVlKSB8IDB4MDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNoaWZ0X2NvbnRyb2wgPSAwOyAvKiBRdWlldCBDb21waWxlciAqLworCQlzdG9wKCJJbnZhbGlkIHNoaWZ0IG9wZXJhdGlvbiBzcGVjaWZpZWQiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwkJYnJlYWs7CisJfTsKKwlmMl9pbnN0ci0+c2hpZnRfY29udHJvbCA9IHNoaWZ0X2NvbnRyb2w7CisJc3ltbGlzdF9mcmVlKCZwbGFjZXMtPnJlZmVyZW5jZWRfc3ltcyk7CisJaW5zdHJ1Y3Rpb25fcHRyKys7Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfM19pbnN0cihpbnQgb3Bjb2RlLCBzeW1ib2xfcmVmX3QgKnNyYywKKwkgICAgICAgZXhwcmVzc2lvbl90ICppbW1lZCwgc3ltYm9sX3JlZl90ICphZGRyZXNzKQoreworCXN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zdHI7CisJc3RydWN0IGluc19mb3JtYXQzICpmM19pbnN0cjsKKwlpbnQgYWRkcjsKKworCS8qIFRlc3QgcmVnaXN0ZXIgcGVybWlzc2lvbnMgKi8KKwl0ZXN0X3JlYWRhYmxlX3N5bWJvbChzcmMtPnN5bWJvbCk7CisKKwkvKiBFbnN1cmUgdGhhdCBpbW1lZGlhdGUgbWFrZXMgc2Vuc2UgZm9yIHRoaXMgc291cmNlICovCisJdHlwZV9jaGVjayhzcmMtPnN5bWJvbCwgaW1tZWQsIG9wY29kZSk7CisKKwkvKiBBbGxvY2F0ZSBzZXF1ZW5jZXIgc3BhY2UgZm9yIHRoZSBpbnN0cnVjdGlvbiBhbmQgZmlsbCBpdCBvdXQgKi8KKwlpbnN0ciA9IHNlcV9hbGxvYygpOworCWYzX2luc3RyID0gJmluc3RyLT5mb3JtYXQuZm9ybWF0MzsKKwlpZiAoYWRkcmVzcy0+c3ltYm9sID09IE5VTEwpIHsKKwkJLyogJ2RvdCcgcmVmZXJyZW5jZS4gIFVzZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyICovCisJCWFkZHIgPSBpbnN0cnVjdGlvbl9wdHIgKyBhZGRyZXNzLT5vZmZzZXQ7CisJfSBlbHNlIGlmIChhZGRyZXNzLT5zeW1ib2wtPnR5cGUgPT0gVU5JTklUSUFMSVpFRCkgeworCQkvKiBmb3J3YXJkIHJlZmVyZW5jZSAqLworCQlhZGRyID0gYWRkcmVzcy0+b2Zmc2V0OworCQlpbnN0ci0+cGF0Y2hfbGFiZWwgPSBhZGRyZXNzLT5zeW1ib2w7CisJfSBlbHNlCisJCWFkZHIgPSBhZGRyZXNzLT5zeW1ib2wtPmluZm8ubGluZm8tPmFkZHJlc3MgKyBhZGRyZXNzLT5vZmZzZXQ7CisJZjNfaW5zdHItPm9wY29kZSA9IG9wY29kZTsKKwlmM19pbnN0ci0+YWRkcmVzcyA9IGFkZHI7CisJZjNfaW5zdHItPnNvdXJjZSA9IHNyYy0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzCisJCQkgKyBzcmMtPm9mZnNldDsKKwlmM19pbnN0ci0+aW1tZWRpYXRlID0gaW1tZWQtPnZhbHVlOworCisJaWYgKGlzX2Rvd25sb2FkX2NvbnN0KGltbWVkKSkKKwkJZjNfaW5zdHItPnBhcml0eSA9IDE7CisKKwlzeW1saXN0X2ZyZWUoJmltbWVkLT5yZWZlcmVuY2VkX3N5bXMpOworCWluc3RydWN0aW9uX3B0cisrOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkYWJsZV9zeW1ib2woc3ltYm9sX3QgKnN5bWJvbCkKK3sKKwkKKwlpZiAoKHN5bWJvbC0+aW5mby5yaW5mby0+bW9kZXMgJiAoMHgxIDw8IHNyY19tb2RlKSkgPT0gMCkgeworCQlzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLAorCQkJIlJlZ2lzdGVyICVzIHVuYXZhaWxhYmxlIGluIHNvdXJjZSByZWcgbW9kZSAlZCIsCisJCQlzeW1ib2wtPm5hbWUsIHNyY19tb2RlKTsKKwkJc3RvcChlcnJidWYsIEVYX0RBVEFFUlIpOworCX0KKworCWlmIChzeW1ib2wtPmluZm8ucmluZm8tPm1vZGUgPT0gV08pIHsKKwkJc3RvcCgiV3JpdGUgT25seSByZWdpc3RlciBzcGVjaWZpZWQgYXMgc291cmNlIiwKKwkJICAgICBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfd3JpdGFibGVfc3ltYm9sKHN5bWJvbF90ICpzeW1ib2wpCit7CisJCisJaWYgKChzeW1ib2wtPmluZm8ucmluZm8tPm1vZGVzICYgKDB4MSA8PCBkc3RfbW9kZSkpID09IDApIHsKKwkJc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwKKwkJCSJSZWdpc3RlciAlcyB1bmF2YWlsYWJsZSBpbiBkZXN0aW5hdGlvbiByZWcgbW9kZSAlZCIsCisJCQlzeW1ib2wtPm5hbWUsIGRzdF9tb2RlKTsKKwkJc3RvcChlcnJidWYsIEVYX0RBVEFFUlIpOworCX0KKworCWlmIChzeW1ib2wtPmluZm8ucmluZm8tPm1vZGUgPT0gUk8pIHsKKwkJc3RvcCgiUmVhZCBPbmx5IHJlZ2lzdGVyIHNwZWNpZmllZCBhcyBkZXN0aW5hdGlvbiIsCisJCSAgICAgRVhfREFUQUVSUik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit0eXBlX2NoZWNrKHN5bWJvbF90ICpzeW1ib2wsIGV4cHJlc3Npb25fdCAqZXhwcmVzc2lvbiwgaW50IG9wY29kZSkKK3sKKwlzeW1ib2xfbm9kZV90ICpub2RlOworCWludCBhbmRfb3A7CisKKwlhbmRfb3AgPSBGQUxTRTsKKwlpZiAob3Bjb2RlID09IEFJQ19PUF9BTkQgfHwgb3Bjb2RlID09IEFJQ19PUF9KTlogfHwgQUlDX09QX0paKQorCQlhbmRfb3AgPSBUUlVFOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmVuJ3QgYXR0ZW1wdGluZyB0byB3cml0ZSBzb21ldGhpbmcKKwkgKiB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuICBJZiB0aGlzIGlzIGFuIGFuZCBvcGVyYXRpb24sCisJICogdGhpcyBpcyBhIG1hc2ssIHNvICJ1bmRlZmluZWQiIGJpdHMgYXJlIG9rYXkuCisJICovCisJaWYgKGFuZF9vcCA9PSBGQUxTRQorCSAmJiAoZXhwcmVzc2lvbi0+dmFsdWUgJiB+c3ltYm9sLT5pbmZvLnJpbmZvLT52YWxpZF9iaXRtYXNrKSAhPSAwKSB7CisJCXNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksCisJCQkgIkludmFsaWQgYml0KHMpIDB4JXggaW4gaW1tZWRpYXRlIHdyaXR0ZW4gdG8gJXMiLAorCQkJIGV4cHJlc3Npb24tPnZhbHVlICYgfnN5bWJvbC0+aW5mby5yaW5mby0+dmFsaWRfYml0bWFzaywKKwkJCSBzeW1ib2wtPm5hbWUpOworCQlzdG9wKGVycmJ1ZiwgRVhfREFUQUVSUik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwkvKgorCSAqIE5vdyBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIHN5bWJvbHMgcmVmZXJlbmNlZCBieSB0aGUKKwkgKiBleHByZXNzaW9uIGFyZSBkZWZpbmVkIGZvciB0aGlzIHJlZ2lzdGVyLgorCSAqLworCWlmIChzeW1ib2wtPmluZm8ucmluZm8tPnR5cGVjaGVja19tYXNrcyAhPSBGQUxTRSkgeworCQlmb3Iobm9kZSA9IGV4cHJlc3Npb24tPnJlZmVyZW5jZWRfc3ltcy5zbGhfZmlyc3Q7CisJCSAgICBub2RlICE9IE5VTEw7CisJCSAgICBub2RlID0gbm9kZS0+bGlua3Muc2xlX25leHQpIHsKKwkJCWlmICgobm9kZS0+c3ltYm9sLT50eXBlID09IE1BU0sKKwkJCSAgfHwgbm9kZS0+c3ltYm9sLT50eXBlID09IEZJRUxECisJCQkgIHx8IG5vZGUtPnN5bWJvbC0+dHlwZSA9PSBFTlVNCisJCQkgIHx8IG5vZGUtPnN5bWJvbC0+dHlwZSA9PSBFTlVNX0VOVFJZKQorCQkJICYmIHN5bWxpc3Rfc2VhcmNoKCZub2RlLT5zeW1ib2wtPmluZm8uZmluZm8tPnN5bXJlZnMsCisJCQkJCSAgIHN5bWJvbC0+bmFtZSkgPT0gTlVMTCkgeworCQkJCXNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksCisJCQkJCSAiSW52YWxpZCBmaWVsZCBvciBtYXNrICVzICIKKwkJCQkJICJmb3IgcmVnaXN0ZXIgJXMiLAorCQkJCQkgbm9kZS0+c3ltYm9sLT5uYW1lLCBzeW1ib2wtPm5hbWUpOworCQkJCXN0b3AoZXJyYnVmLCBFWF9EQVRBRVJSKTsKKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCittYWtlX2V4cHJlc3Npb24oZXhwcmVzc2lvbl90ICppbW1lZCwgaW50IHZhbHVlKQoreworCVNMSVNUX0lOSVQoJmltbWVkLT5yZWZlcmVuY2VkX3N5bXMpOworCWltbWVkLT52YWx1ZSA9IHZhbHVlICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK2FkZF9jb25kaXRpb25hbChzeW1ib2xfdCAqc3ltYm9sKQoreworCXN0YXRpYyBpbnQgbnVtZnVuY3M7CisKKwlpZiAobnVtZnVuY3MgPT0gMCkgeworCQkvKiBhZGQgYSBzcGVjaWFsIGNvbmRpdGlvbmFsLCAiMCIgKi8KKwkJc3ltYm9sX3QgKmZhbHNlX2Z1bmM7CisKKwkJZmFsc2VfZnVuYyA9IHN5bXRhYmxlX2dldCgiMCIpOworCQlpZiAoZmFsc2VfZnVuYy0+dHlwZSAhPSBVTklOSVRJQUxJWkVEKSB7CisJCQlzdG9wKCJDb25kaXRpb25hbCBleHByZXNzaW9uICcwJyAiCisJCQkgICAgICJjb25mbGljdHMgd2l0aCBhIHN5bWJvbCIsIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWZhbHNlX2Z1bmMtPnR5cGUgPSBDT05ESVRJT05BTDsKKwkJaW5pdGlhbGl6ZV9zeW1ib2woZmFsc2VfZnVuYyk7CisJCWZhbHNlX2Z1bmMtPmluZm8uY29uZGluZm8tPmZ1bmNfbnVtID0gbnVtZnVuY3MrKzsKKwkJc3ltbGlzdF9hZGQoJnBhdGNoX2Z1bmN0aW9ucywgZmFsc2VfZnVuYywgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJfQorCisJLyogVGhpcyBjb25kaXRpb24gaGFzIG9jY3VycmVkIGJlZm9yZSAqLworCWlmIChzeW1ib2wtPnR5cGUgPT0gQ09ORElUSU9OQUwpCisJCXJldHVybjsKKworCWlmIChzeW1ib2wtPnR5cGUgIT0gVU5JTklUSUFMSVpFRCkgeworCQlzdG9wKCJDb25kaXRpb25hbCBleHByZXNzaW9uIGNvbmZsaWN0cyB3aXRoIGEgc3ltYm9sIiwKKwkJICAgICBFWF9EQVRBRVJSKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCXN5bWJvbC0+dHlwZSA9IENPTkRJVElPTkFMOworCWluaXRpYWxpemVfc3ltYm9sKHN5bWJvbCk7CisJc3ltYm9sLT5pbmZvLmNvbmRpbmZvLT5mdW5jX251bSA9IG51bWZ1bmNzKys7CisJc3ltbGlzdF9hZGQoJnBhdGNoX2Z1bmN0aW9ucywgc3ltYm9sLCBTWU1MSVNUX0lOU0VSVF9IRUFEKTsKK30KKworc3RhdGljIHZvaWQKK2FkZF92ZXJzaW9uKGNvbnN0IGNoYXIgKnZlcnN0cmluZykKK3sKKwljb25zdCBjaGFyIHByZWZpeFtdID0gIiAqICI7CisJaW50IG5ld2xlbjsKKwlpbnQgb2xkbGVuOworCisJbmV3bGVuID0gc3RybGVuKHZlcnN0cmluZykgKyBzdHJsZW4ocHJlZml4KTsKKwlvbGRsZW4gPSAwOworCWlmICh2ZXJzaW9ucyAhPSBOVUxMKQorCQlvbGRsZW4gPSBzdHJsZW4odmVyc2lvbnMpOworCXZlcnNpb25zID0gcmVhbGxvYyh2ZXJzaW9ucywgbmV3bGVuICsgb2xkbGVuICsgMik7CisJaWYgKHZlcnNpb25zID09IE5VTEwpCisJCXN0b3AoIkNhbid0IGFsbG9jYXRlIHZlcnNpb24gc3RyaW5nIiwgRVhfU09GVFdBUkUpOworCXN0cmNweSgmdmVyc2lvbnNbb2xkbGVuXSwgcHJlZml4KTsKKwlzdHJjcHkoJnZlcnNpb25zW29sZGxlbiArIHN0cmxlbihwcmVmaXgpXSwgdmVyc3RyaW5nKTsKKwl2ZXJzaW9uc1tuZXdsZW4gKyBvbGRsZW5dID0gJ1xuJzsKKwl2ZXJzaW9uc1tuZXdsZW4gKyBvbGRsZW4gKyAxXSA9ICdcMCc7Cit9CisKK3ZvaWQKK3l5ZXJyb3IoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN0b3Aoc3RyaW5nLCBFWF9EQVRBRVJSKTsKK30KKworc3RhdGljIGludAoraXNfZG93bmxvYWRfY29uc3QoZXhwcmVzc2lvbl90ICppbW1lZCkKK3sKKwlpZiAoKGltbWVkLT5yZWZlcmVuY2VkX3N5bXMuc2xoX2ZpcnN0ICE9IE5VTEwpCisJICYmIChpbW1lZC0+cmVmZXJlbmNlZF9zeW1zLnNsaF9maXJzdC0+c3ltYm9sLT50eXBlID09IERPV05MT0FEX0NPTlNUKSkKKwkJcmV0dXJuIChUUlVFKTsKKworCXJldHVybiAoRkFMU0UpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MGYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21faW5zZm9ybWF0LmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBJbnN0cnVjdGlvbiBmb3JtYXRzIGZvciB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZG93bmxvYWRlZCB0bworICogQWljN3h4eCBTQ1NJIGhvc3QgYWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDIwMDAgSnVzdGluIFQuIEdpYmJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9pbnNmb3JtYXQuaCMxMSAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworc3RydWN0IGluc19mb3JtYXQxIHsKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKwl1aW50MzJfdAlpbW1lZGlhdGUJOiA4LAorCQkJc291cmNlCQk6IDksCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlyZXQJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcGFyaXR5CQk6IDE7CisjZWxzZQorCXVpbnQzMl90CXBhcml0eQkJOiAxLAorCQkJb3Bjb2RlCQk6IDQsCisJCQlyZXQJCTogMSwKKwkJCWRlc3RpbmF0aW9uCTogOSwKKwkJCXNvdXJjZQkJOiA5LAorCQkJaW1tZWRpYXRlCTogODsKKyNlbmRpZgorfTsKKworc3RydWN0IGluc19mb3JtYXQyIHsKKyNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKwl1aW50MzJfdAlzaGlmdF9jb250cm9sCTogOCwKKwkJCXNvdXJjZQkJOiA5LAorCQkJZGVzdGluYXRpb24JOiA5LAorCQkJcmV0CQk6IDEsCisJCQlvcGNvZGUJCTogNCwKKwkJCXBhcml0eQkJOiAxOworI2Vsc2UKKwl1aW50MzJfdAlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcmV0CQk6IDEsCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlzb3VyY2UJCTogOSwKKwkJCXNoaWZ0X2NvbnRyb2wJOiA4OworI2VuZGlmCit9OworCitzdHJ1Y3QgaW5zX2Zvcm1hdDMgeworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorCXVpbnQzMl90CWltbWVkaWF0ZQk6IDgsCisJCQlzb3VyY2UJCTogOSwKKwkJCWFkZHJlc3MJCTogMTAsCisJCQlvcGNvZGUJCTogNCwKKwkJCXBhcml0eQkJOiAxOworI2Vsc2UKKwl1aW50MzJfdAlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJYWRkcmVzcwkJOiAxMCwKKwkJCXNvdXJjZQkJOiA5LAorCQkJaW1tZWRpYXRlCTogODsKKyNlbmRpZgorfTsKKwordW5pb24gaW5zX2Zvcm1hdHMgeworCQlzdHJ1Y3QgaW5zX2Zvcm1hdDEgZm9ybWF0MTsKKwkJc3RydWN0IGluc19mb3JtYXQyIGZvcm1hdDI7CisJCXN0cnVjdCBpbnNfZm9ybWF0MyBmb3JtYXQzOworCQl1aW50OF90CQkgICBieXRlc1s0XTsKKwkJdWludDMyX3QJICAgaW50ZWdlcjsKK307CitzdHJ1Y3QgaW5zdHJ1Y3Rpb24geworCXVuaW9uCWluc19mb3JtYXRzIGZvcm1hdDsKKwl1X2ludAlzcmNsaW5lOworCXN0cnVjdCBzeW1ib2wgKnBhdGNoX2xhYmVsOworCVNUQUlMUV9FTlRSWShpbnN0cnVjdGlvbikgbGlua3M7Cit9OworCisjZGVmaW5lCUFJQ19PUF9PUgkweDAKKyNkZWZpbmUJQUlDX09QX0FORAkweDEKKyNkZWZpbmUgQUlDX09QX1hPUgkweDIKKyNkZWZpbmUJQUlDX09QX0FERAkweDMKKyNkZWZpbmUJQUlDX09QX0FEQwkweDQKKyNkZWZpbmUJQUlDX09QX1JPTAkweDUKKyNkZWZpbmUJQUlDX09QX0JNT1YJMHg2CisKKyNkZWZpbmUJQUlDX09QX0pNUAkweDgKKyNkZWZpbmUgQUlDX09QX0pDCTB4OQorI2RlZmluZSBBSUNfT1BfSk5DCTB4YQorI2RlZmluZSBBSUNfT1BfQ0FMTAkweGIKKyNkZWZpbmUJQUlDX09QX0pORQkweGMKKyNkZWZpbmUJQUlDX09QX0pOWgkweGQKKyNkZWZpbmUJQUlDX09QX0pFCTB4ZQorI2RlZmluZQlBSUNfT1BfSloJMHhmCisKKy8qIFBzZXVkbyBPcHMgKi8KKyNkZWZpbmUJQUlDX09QX1NITAkweDEwCisjZGVmaW5lCUFJQ19PUF9TSFIJMHgyMAorI2RlZmluZQlBSUNfT1BfUk9SCTB4MzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fZ3JhbS55IGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9tYWNyb19ncmFtLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5Zjc2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fZ3JhbS55CkBAIC0wLDAgKzEsMTY0IEBACisleworLyoKKyAqIFN1Yi1wYXJzZXIgZm9yIG1hY3JvIGludm9jYXRpb24gaW4gdGhlIEFpYzd4eHggU0NTSQorICogSG9zdCBhZGFwdGVyIHNlcXVlbmNlciBhc3NlbWJsZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEFkYXB0ZWMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICoKKyAqICRJZDogLy9kZXBvdC9haWM3eHh4L2FpYzd4eHgvYWljYXNtL2FpY2FzbV9tYWNyb19ncmFtLnkjNSAkCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzZXhpdHMuaD4KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX2luc2Zvcm1hdC5oIgorCitzdGF0aWMgc3ltYm9sX3QgKm1hY3JvX3N5bWJvbDsKKworc3RhdGljIHZvaWQgYWRkX21hY3JvX2FyZyhjb25zdCBjaGFyICphcmd0ZXh0LCBpbnQgcG9zaXRpb24pOworCislfQorCisldW5pb24geworCWludAkJdmFsdWU7CisJY2hhcgkJKnN0cjsKKwlzeW1ib2xfdAkqc3ltOworfQorCisKKyV0b2tlbiA8c3RyPiBUX0FSRworCisldG9rZW4gPHN5bT4gVF9TWU1CT0wKKworJXR5cGUgPHZhbHVlPiBtYWNyb19hcmdsaXN0CisKKyUlCisKK21hY3JvY2FsbDoKKwlUX1NZTUJPTCAnKCcKKwl7CisJCW1hY3JvX3N5bWJvbCA9ICQxOworCX0KKwltYWNyb19hcmdsaXN0ICcpJworCXsKKwkJaWYgKG1hY3JvX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPm5hcmcgIT0gJDQpIHsKKwkJCXByaW50ZigiTmFyZyA9PSAlZCIsIG1hY3JvX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPm5hcmcpOworCQkJc3RvcCgiVG9vIGZldyBhcmd1bWVudHMgZm9yIG1hY3JvIGludm9jYXRpb24iLAorCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCQltYWNyb19zeW1ib2wgPSBOVUxMOworCQlZWUFDQ0VQVDsKKwl9Cis7CisKK21hY3JvX2FyZ2xpc3Q6CisJeworCQkvKiBNYWNyb3MgY2FuIHRha2UgMCBhcmd1bWVudHMgKi8KKwkJJCQgPSAwOworCX0KK3wJVF9BUkcKKwl7CisJCSQkID0gMTsKKwkJYWRkX21hY3JvX2FyZygkMSwgMSk7CisJfQorfAltYWNyb19hcmdsaXN0ICcsJyBUX0FSRworCXsKKwkJaWYgKCQxID09IDApIHsKKwkJCXN0b3AoIkNvbW1hIHdpdGhvdXQgcHJlY2VlZGluZyBhcmd1bWVudCBpbiBhcmcgbGlzdCIsCisJCQkgICAgIEVYX0RBVEFFUlIpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCSQkID0gJDEgKyAxOworCQlhZGRfbWFjcm9fYXJnKCQzLCAkJCk7CisJfQorOworCislJQorCitzdGF0aWMgdm9pZAorYWRkX21hY3JvX2FyZyhjb25zdCBjaGFyICphcmd0ZXh0LCBpbnQgYXJnbnVtKQoreworCXN0cnVjdCBtYWNyb19hcmcgKm1hcmc7CisJaW50IGk7CisKKwlpZiAobWFjcm9fc3ltYm9sID09IE5VTEwgfHwgbWFjcm9fc3ltYm9sLT50eXBlICE9IE1BQ1JPKSB7CisJCXN0b3AoIkludmFsaWQgY3VycmVudCBzeW1ib2wgZm9yIGFkZGluZyBtYWNybyBhcmciLAorCQkgICAgIEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwkvKgorCSAqIE1hY3JvIEludm9jYXRpb24uICBGaW5kIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudCBhbmQgZmlsbAorCSAqIGluIHRoZSByZXBsYWNlIG1lbnQgdGV4dCBmb3IgdGhpcyBjYWxsLgorCSAqLworCWkgPSAwOworCVNUQUlMUV9GT1JFQUNIKG1hcmcsICZtYWNyb19zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5hcmdzLCBsaW5rcykgeworCQlpKys7CisJCWlmIChpID09IGFyZ251bSkKKwkJCWJyZWFrOworCX0KKwlpZiAobWFyZyA9PSBOVUxMKSB7CisJCXN0b3AoIlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgbWFjcm8gaW52b2NhdGlvbiIsIEVYX0RBVEFFUlIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCW1hcmctPnJlcGxhY2VtZW50X3RleHQgPSBzdHJkdXAoYXJndGV4dCk7CisJaWYgKG1hcmctPnJlcGxhY2VtZW50X3RleHQgPT0gTlVMTCkgeworCQlzdG9wKCJVbmFibGUgdG8gcmVwbGljYXRlIHJlcGxhY2VtZW50IHRleHQiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9Cit9CisKK3ZvaWQKK21tZXJyb3IoY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN0b3Aoc3RyaW5nLCBFWF9EQVRBRVJSKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fc2Nhbi5sIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9tYWNyb19zY2FuLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2ZTcwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fbWFjcm9fc2Nhbi5sCkBAIC0wLDAgKzEsMTU2IEBACisleworLyoKKyAqIFN1Yi1MZXhpY2FsIEFuYWx5emVyIGZvciBtYWNybyBpbnZva2F0aW9uIGluIAorICogdGhlIEFpYzd4eHggU0NTSSBIb3N0IGFkYXB0ZXIgc2VxdWVuY2VyIGFzc2VtYmxlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvYWljN3h4eC9haWNhc20vYWljYXNtX21hY3JvX3NjYW4ubCM4ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX21hY3JvX2dyYW0uaCIKKworI2RlZmluZSBNQVhfU1RSX0NPTlNUIDQwOTYKK3N0YXRpYyBjaGFyIHN0cmluZ19idWZbTUFYX1NUUl9DT05TVF07CitzdGF0aWMgY2hhciAqc3RyaW5nX2J1Zl9wdHI7CitzdGF0aWMgaW50ICBwYXJyZW5fY291bnQ7CitzdGF0aWMgY2hhciBidWZbMjU1XTsKKyV9CisKK1dPUkQJCVtBLVphLXpfXVstQS1aYS16XzAtOV0qCitTUEFDRQkJWyBcdF0rCitNQ0FSRwkJW14oKSwgXHRdKworCisleCBBUkdMSVNUCisKKyUlCitcbgkJCXsKKwkJCQkrK3l5bGluZW5vOworCQkJfQorXHIJCQk7Cis8QVJHTElTVD57U1BBQ0V9CTsKKzxBUkdMSVNUPlwoCQl7CisJCQkJcGFycmVuX2NvdW50Kys7CisJCQkJaWYgKHBhcnJlbl9jb3VudCA9PSAxKSB7CisJCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQkJcmV0dXJuICgnKCcpOworCQkJCX0KKwkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9ICcoJzsKKwkJCX0KKzxBUkdMSVNUPlwpCQl7CisJCQkJaWYgKHBhcnJlbl9jb3VudCA9PSAxKSB7CisJCQkJCWlmIChzdHJpbmdfYnVmX3B0ciAhPSBzdHJpbmdfYnVmKSB7CisJCQkJCQkvKgorCQkJCQkJICogUmV0dXJuIGFuIGFyZ3VtZW50IGFuZAorCQkJCQkJICogcmVzY2FuIHRoaXMgcGFycmVuIHNvIHdlCisJCQkJCQkgKiBjYW4gcmV0dXJuIGl0IGFzIHdlbGwuCisJCQkJCQkgKi8KKwkJCQkJCSpzdHJpbmdfYnVmX3B0ciA9ICdcMCc7CisJCQkJCQltbWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQkJCXVucHV0KCcpJyk7CisJCQkJCQlyZXR1cm4gVF9BUkc7CisJCQkJCX0KKwkJCQkJQkVHSU4gSU5JVElBTDsKKwkJCQkJcmV0dXJuICgnKScpOworCQkJCX0KKwkJCQlwYXJyZW5fY291bnQtLTsKKwkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9ICcpJzsKKwkJCX0KKzxBUkdMSVNUPntNQ0FSR30JeworCQkJCWNoYXIgKnlwdHI7CisKKwkJCQl5cHRyID0gbW10ZXh0OworCQkJCXdoaWxlICgqeXB0cikKKwkJCQkJKnN0cmluZ19idWZfcHRyKysgPSAqeXB0cisrOworCQkJfQorPEFSR0xJU1Q+XCwJCXsKKwkJCQlpZiAoc3RyaW5nX2J1Zl9wdHIgIT0gc3RyaW5nX2J1ZikgeworCQkJCQkvKgorCQkJCQkgKiBSZXR1cm4gYW4gYXJndW1lbnQgYW5kCisJCQkJCSAqIHJlc2NhbiB0aGlzIGNvbW1hIHNvIHdlCisJCQkJCSAqIGNhbiByZXR1cm4gaXQgYXMgd2VsbC4KKwkJCQkJICovCisJCQkJCSpzdHJpbmdfYnVmX3B0ciA9ICdcMCc7CisJCQkJCW1tbHZhbC5zdHIgPSBzdHJpbmdfYnVmOworCQkJCQlzdHJpbmdfYnVmX3B0ciA9IHN0cmluZ19idWY7CisJCQkJCXVucHV0KCcsJyk7CisJCQkJCXJldHVybiBUX0FSRzsKKwkJCQl9CisJCQkJcmV0dXJuICcsJzsKKwkJCX0KK3tXT1JEfVsoXQkJeworCQkJCS8qIE1heSBiZSBhIHN5bWJvbCBvciBhIG1hY3JvIGludm9jYXRpb24uICovCisJCQkJbW1sdmFsLnN5bSA9IHN5bXRhYmxlX2dldChtbXRleHQpOworCQkJCWlmIChtbWx2YWwuc3ltLT50eXBlICE9IE1BQ1JPKSB7CisJCQkJCXN0b3AoIkV4cGVjdGluZyBNYWNybyBOYW1lIiwKKwkJCQkJICAgICBFWF9EQVRBRVJSKTsKKwkJCQl9CisJCQkJdW5wdXQoJygnKTsKKwkJCQlwYXJyZW5fY291bnQgPSAwOworCQkJCUJFR0lOIEFSR0xJU1Q7CisJCQkJcmV0dXJuIFRfU1lNQk9MOworCQkJfQorLgkJCXsgCisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkludmFsaWQgY2hhcmFjdGVyICIKKwkJCQkJICInJWMnIiwgbW10ZXh0WzBdKTsKKwkJCQlzdG9wKGJ1ZiwgRVhfREFUQUVSUik7CisJCQl9CislJQorCitpbnQKK21td3JhcCgpCit7CisJc3RvcCgiRU9GIGVuY291bnRlcmVkIGluIG1hY3JvIGNhbGwiLCBFWF9EQVRBRVJSKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc2Nhbi5sIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9zY2FuLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc2Nhbi5sCkBAIC0wLDAgKzEsNjA3IEBACisleworLyoKKyAqIExleGljYWwgQW5hbHl6ZXIgZm9yIHRoZSBBaWM3eHh4IFNDU0kgSG9zdCBhZGFwdGVyIHNlcXVlbmNlciBhc3NlbWJsZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAyMDAwIEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc21fc2Nhbi5sIzE5ICQKKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNleGl0cy5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgIi4uL3F1ZXVlLmgiCisjZWxzZQorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhaWNhc20uaCIKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtX2dyYW0uaCIKKworLyogVGhpcyBpcyB1c2VkIGZvciBtYWNybyBib2R5IGNhcHR1cmUgdG9vLCBzbyBlcnIgb24gdGhlIGxhcmdlIHNpemUuICovCisjZGVmaW5lIE1BWF9TVFJfQ09OU1QgNDA5Ngorc3RhdGljIGNoYXIgc3RyaW5nX2J1ZltNQVhfU1RSX0NPTlNUXTsKK3N0YXRpYyBjaGFyICpzdHJpbmdfYnVmX3B0cjsKK3N0YXRpYyBpbnQgIHBhcnJlbl9jb3VudDsKK3N0YXRpYyBpbnQgIHF1b3RlX2NvdW50Oworc3RhdGljIGNoYXIgYnVmWzI1NV07CislfQorCitQQVRICQkoWy9dKlstQS1aYS16MC05Xy5dKSsKK1dPUkQJCVtBLVphLXpfXVstQS1aYS16XzAtOV0qCitTUEFDRQkJWyBcdF0rCitNQ0FSRwkJW14oKSwgXHRdKworTUJPRFkJCSgoXFxbXlxuXSkqW15cblxcXSopKworCisleCBDT01NRU5UCisleCBDRVhQUgorJXggSU5DTFVERQorJXggU1RSSU5HCisleCBNQUNST0RFRgorJXggTUFDUk9BUkdMSVNUCisleCBNQUNST0NBTExBUkdTCisleCBNQUNST0JPRFkKKworJSUKK1xuCQkJeyArK3l5bGluZW5vOyB9CitccgkJCTsKKyIvKiIJCQl7IEJFR0lOIENPTU1FTlQ7ICAvKiBFbnRlciBjb21tZW50IGVhdGluZyBzdGF0ZSAqLyB9Cis8Q09NTUVOVD4iLyoiCQl7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZyEgQ29tbWVudCB3aXRoaW4gY29tbWVudC4iKTsgfQorPENPTU1FTlQ+XG4JCXsgKyt5eWxpbmVubzsgfQorPENPTU1FTlQ+W14qL1xuXSoJOworPENPTU1FTlQ+IioiK1teKi9cbl0qCTsKKzxDT01NRU5UPiIvIitbXiovXG5dKgk7Cis8Q09NTUVOVD4iKiIrIi8iCXsgQkVHSU4gSU5JVElBTDsgfQoraWZbIFx0XSpcKAkJeworCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQlwYXJyZW5fY291bnQgPSAxOworCQkJCUJFR0lOIENFWFBSOworCQkJCXJldHVybiBUX0lGOworCQkJfQorPENFWFBSPlwoCQl7CSpzdHJpbmdfYnVmX3B0cisrID0gJygnOyBwYXJyZW5fY291bnQrKzsgfQorPENFWFBSPlwpCQl7CisJCQkJcGFycmVuX2NvdW50LS07CisJCQkJaWYgKHBhcnJlbl9jb3VudCA9PSAwKSB7CisJCQkJCS8qIEFsbCBkb25lICovCisJCQkJCUJFR0lOIElOSVRJQUw7CisJCQkJCSpzdHJpbmdfYnVmX3B0ciA9ICdcMCc7CisJCQkJCXl5bHZhbC5zeW0gPSBzeW10YWJsZV9nZXQoc3RyaW5nX2J1Zik7CisJCQkJCXJldHVybiBUX0NFWFBSOworCQkJCX0gZWxzZSB7CisJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gJyknOworCQkJCX0KKwkJCX0KKzxDRVhQUj5cbgkJeyArK3l5bGluZW5vOyB9Cis8Q0VYUFI+XHIJCTsKKzxDRVhQUj5bXigpXG5dKwl7CisJCQkJY2hhciAqeXB0cjsKKworCQkJCXlwdHIgPSB5eXRleHQ7CisJCQkJd2hpbGUgKCp5cHRyICE9ICdcMCcpIHsKKwkJCQkJLyogUmVtb3ZlIGR1cGxpY2F0ZSBzcGFjZXMgKi8KKwkJCQkJaWYgKCp5cHRyID09ICdcdCcpCisJCQkJCQkqeXB0ciA9ICcgJzsKKwkJCQkJaWYgKCp5cHRyID09ICcgJworCQkJCQkgJiYgc3RyaW5nX2J1Zl9wdHIgIT0gc3RyaW5nX2J1ZgorCQkJCQkgJiYgc3RyaW5nX2J1Zl9wdHJbLTFdID09ICcgJykKKwkJCQkJCXlwdHIrKzsKKwkJCQkJZWxzZSAKKwkJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gKnlwdHIrKzsKKwkJCQl9CisJCQl9CisKK1ZFUlNJT04JCQl7IHJldHVybiBUX1ZFUlNJT047IH0KK1BSRUZJWAkJCXsgcmV0dXJuIFRfUFJFRklYOyB9CitQQVRDSF9BUkdfTElTVAkJeyByZXR1cm4gVF9QQVRDSF9BUkdfTElTVDsgfQorXCIJCQl7CisJCQkJc3RyaW5nX2J1Zl9wdHIgPSBzdHJpbmdfYnVmOworCQkJCUJFR0lOIFNUUklORzsKKwkJCX0KKzxTVFJJTkc+W14iXSsJCXsKKwkJCQljaGFyICp5cHRyOworCisJCQkJeXB0ciA9IHl5dGV4dDsKKwkJCQl3aGlsZSAoKnlwdHIpCisJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gKnlwdHIrKzsKKwkJCX0KKzxTVFJJTkc+XCIJCXsKKwkJCQkvKiBBbGwgZG9uZSAqLworCQkJCUJFR0lOIElOSVRJQUw7CisJCQkJKnN0cmluZ19idWZfcHRyID0gJ1wwJzsKKwkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQlyZXR1cm4gVF9TVFJJTkc7CisJCQl9Cit7U1BBQ0V9CQkJIDsKKworCS8qIFJlZ2lzdGVyL1NDQi9TUkFNIGRlZmluaXRpb24ga2V5d29yZHMgKi8KK2V4cG9ydAkJCXsgcmV0dXJuIFRfRVhQT1JUOyB9CityZWdpc3RlcgkJeyByZXR1cm4gVF9SRUdJU1RFUjsgfQorY29uc3QJCQl7IHl5bHZhbC52YWx1ZSA9IEZBTFNFOyByZXR1cm4gVF9DT05TVDsgfQorZG93bmxvYWQJCXsgcmV0dXJuIFRfRE9XTkxPQUQ7IH0KK2FkZHJlc3MJCQl7IHJldHVybiBUX0FERFJFU1M7IH0KK2FjY2Vzc19tb2RlCQl7IHJldHVybiBUX0FDQ0VTU19NT0RFOyB9Cittb2RlcwkJCXsgcmV0dXJuIFRfTU9ERVM7IH0KK1JXfFJPfFdPCQl7CisJCQkJIGlmIChzdHJjbXAoeXl0ZXh0LCAiUlciKSA9PSAwKQorCQkJCQl5eWx2YWwudmFsdWUgPSBSVzsKKwkJCQkgZWxzZSBpZiAoc3RyY21wKHl5dGV4dCwgIlJPIikgPT0gMCkKKwkJCQkJeXlsdmFsLnZhbHVlID0gUk87CisJCQkJIGVsc2UKKwkJCQkJeXlsdmFsLnZhbHVlID0gV087CisJCQkJIHJldHVybiBUX01PREU7CisJCQl9CitCRUdJTl9DUklUSUNBTAkJeyByZXR1cm4gVF9CRUdJTl9DUzsgfQorRU5EX0NSSVRJQ0FMCQl7IHJldHVybiBUX0VORF9DUzsgfQorU0VUX1NSQ19NT0RFCQl7IHJldHVybiBUX1NFVF9TUkNfTU9ERTsgfQorU0VUX0RTVF9NT0RFCQl7IHJldHVybiBUX1NFVF9EU1RfTU9ERTsgfQorZmllbGQJCQl7IHJldHVybiBUX0ZJRUxEOyB9CitlbnVtCQkJeyByZXR1cm4gVF9FTlVNOyB9CittYXNrCQkJeyByZXR1cm4gVF9NQVNLOyB9CithbGlhcwkJCXsgcmV0dXJuIFRfQUxJQVM7IH0KK3NpemUJCQl7IHJldHVybiBUX1NJWkU7IH0KK3NjYgkJCXsgcmV0dXJuIFRfU0NCOyB9CitzY3JhdGNoX3JhbQkJeyByZXR1cm4gVF9TUkFNOyB9CithY2N1bXVsYXRvcgkJeyByZXR1cm4gVF9BQ0NVTTsgfQorbW9kZV9wb2ludGVyCQl7IHJldHVybiBUX01PREVfUFRSOyB9CithbGxvbmVzCQkJeyByZXR1cm4gVF9BTExPTkVTOyB9CithbGx6ZXJvcwkJeyByZXR1cm4gVF9BTExaRVJPUzsgfQorbm9uZQkJCXsgcmV0dXJuIFRfTk9ORTsgfQorc2luZGV4CQkJeyByZXR1cm4gVF9TSU5ERVg7IH0KK0EJCQl7IHJldHVybiBUX0E7IH0KKworCS8qIE9wY29kZXMgKi8KK3NobAkJCXsgcmV0dXJuIFRfU0hMOyB9CitzaHIJCQl7IHJldHVybiBUX1NIUjsgfQorcm9yCQkJeyByZXR1cm4gVF9ST1I7IH0KK3JvbAkJCXsgcmV0dXJuIFRfUk9MOyB9CittdmkJCQl7IHJldHVybiBUX01WSTsgfQorbW92CQkJeyByZXR1cm4gVF9NT1Y7IH0KK2NscgkJCXsgcmV0dXJuIFRfQ0xSOyB9CitqbXAJCQl7IHJldHVybiBUX0pNUDsgfQoramMJCQl7IHJldHVybiBUX0pDOwl9CitqbmMJCQl7IHJldHVybiBUX0pOQzsJfQoramUJCQl7IHJldHVybiBUX0pFOwl9CitqbmUJCQl7IHJldHVybiBUX0pORTsJfQoranoJCQl7IHJldHVybiBUX0paOwl9CitqbnoJCQl7IHJldHVybiBUX0pOWjsJfQorY2FsbAkJCXsgcmV0dXJuIFRfQ0FMTDsgfQorYWRkCQkJeyByZXR1cm4gVF9BREQ7IH0KK2FkYwkJCXsgcmV0dXJuIFRfQURDOyB9CitibW92CQkJeyByZXR1cm4gVF9CTU9WOyB9CitpbmMJCQl7IHJldHVybiBUX0lOQzsgfQorZGVjCQkJeyByZXR1cm4gVF9ERUM7IH0KK3N0YwkJCXsgcmV0dXJuIFRfU1RDOwl9CitjbGMJCQl7IHJldHVybiBUX0NMQzsgfQorY21wCQkJeyByZXR1cm4gVF9DTVA7CX0KK25vdAkJCXsgcmV0dXJuIFRfTk9UOwl9Cit4b3IJCQl7IHJldHVybiBUX1hPUjsJfQordGVzdAkJCXsgcmV0dXJuIFRfVEVTVDt9CithbmQJCQl7IHJldHVybiBUX0FORDsJfQorb3IJCQl7IHJldHVybiBUX09SOwl9CityZXQJCQl7IHJldHVybiBUX1JFVDsgfQorbm9wCQkJeyByZXR1cm4gVF9OT1A7IH0KK2Vsc2UJCQl7IHJldHVybiBUX0VMU0U7IH0KKworCS8qIEFsbG93ZWQgU3ltYm9scyAqLworXDxcPAkJCXsgcmV0dXJuIFRfRVhQUl9MU0hJRlQ7IH0KK1w+XD4JCQl7IHJldHVybiBUX0VYUFJfUlNISUZUOyB9CitbLSssOigpfnwmLiJ7fTs8PltcXS8qIT1dIHsgcmV0dXJuIHl5dGV4dFswXTsgfQorCisJLyogTnVtYmVyIHByb2Nlc3NpbmcgKi8KKzBbMC03XSoJCQl7CisJCQkJeXlsdmFsLnZhbHVlID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgOCk7CisJCQkJcmV0dXJuIFRfTlVNQkVSOworCQkJfQorCiswW3hYXVswLTlhLWZBLUZdKwl7CisJCQkJeXlsdmFsLnZhbHVlID0gc3RydG91bCh5eXRleHQgKyAyLCBOVUxMLCAxNik7CisJCQkJcmV0dXJuIFRfTlVNQkVSOworCQkJfQorCitbMS05XVswLTldKgkJeworCQkJCXl5bHZhbC52YWx1ZSA9IHN0cnRvbCh5eXRleHQsIE5VTEwsIDEwKTsKKwkJCQlyZXR1cm4gVF9OVU1CRVI7CisJCQl9CisJLyogSW5jbHVkZSBGaWxlcyAqLworI2luY2x1ZGV7U1BBQ0V9CQl7CisJCQkJQkVHSU4gSU5DTFVERTsKKwkJCQlxdW90ZV9jb3VudCA9IDA7CisJCQkJcmV0dXJuIFRfSU5DTFVERTsKKwkJCX0KKzxJTkNMVURFPls8XQkJeyByZXR1cm4geXl0ZXh0WzBdOyB9Cis8SU5DTFVERT5bPl0JCXsgQkVHSU4gSU5JVElBTDsgcmV0dXJuIHl5dGV4dFswXTsgfQorPElOQ0xVREU+W1wiXQkJeworCQkJCWlmIChxdW90ZV9jb3VudCAhPSAwKQorCQkJCQlCRUdJTiBJTklUSUFMOworCQkJCXF1b3RlX2NvdW50Kys7CisJCQkJcmV0dXJuIHl5dGV4dFswXTsKKwkJCX0KKzxJTkNMVURFPntQQVRIfQkJeworCQkJCWNoYXIgKnlwdHI7CisKKwkJCQl5cHRyID0geXl0ZXh0OworCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQl3aGlsZSAoKnlwdHIpCisJCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gKnlwdHIrKzsKKwkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkqc3RyaW5nX2J1Zl9wdHIgPSAnXDAnOworCQkJCXJldHVybiBUX1BBVEg7CisJCQl9Cis8SU5DTFVERT4uCQl7IHN0b3AoIkludmFsaWQgaW5jbHVkZSBsaW5lIiwgRVhfREFUQUVSUik7IH0KKyNkZWZpbmV7U1BBQ0V9CQl7CisJCQkJQkVHSU4gTUFDUk9ERUY7CisJCQkJcmV0dXJuIFRfREVGSU5FOworCQkJfQorPE1BQ1JPREVGPntXT1JEfXtTUEFDRX0JeyAKKwkJCQljaGFyICp5cHRyOworCisJCQkJLyogU3RyaXAgc3BhY2UgYW5kIHJldHVybiBhcyBhIG5vcm1hbCBzeW1ib2wgKi8KKwkJCQl5cHRyID0geXl0ZXh0OworCQkJCXdoaWxlICgqeXB0ciAhPSAnICcgJiYgKnlwdHIgIT0gJ1x0JykKKwkJCQkJeXB0cisrOworCQkJCSp5cHRyID0gJ1wwJzsKKwkJCQl5eWx2YWwuc3ltID0gc3ltdGFibGVfZ2V0KHl5dGV4dCk7CisJCQkJc3RyaW5nX2J1Zl9wdHIgPSBzdHJpbmdfYnVmOworCQkJCUJFR0lOIE1BQ1JPQk9EWTsKKwkJCQlyZXR1cm4gVF9TWU1CT0w7CisJCQl9Cis8TUFDUk9ERUY+e1dPUkR9XCgJeworCQkJCS8qCisJCQkJICogV2Ugc3RvcmUgdGhlIHN5bWJvbCB3aXRoIGl0cyBvcGVuaW5nCisJCQkJICogcGFycmVuIHNvIHdlIGNhbiBkaWZmZXJlbnRpYXRlIG1hY3JvcworCQkJCSAqIHRoYXQgdGFrZSBhcmdzIGZyb20gbWFjcm9zIHdpdGggdGhlCisJCQkJICogc2FtZSBuYW1lIHRoYXQgZG8gbm90IHRha2UgYXJncyBhcworCQkJCSAqIGlzIGFsbG93ZWQgaW4gQy4KKwkJCQkgKi8KKwkJCQlCRUdJTiBNQUNST0FSR0xJU1Q7CisJCQkJeXlsdmFsLnN5bSA9IHN5bXRhYmxlX2dldCh5eXRleHQpOworCQkJCXVucHV0KCcoJyk7CisJCQkJcmV0dXJuIFRfU1lNQk9MOworCQkJfQorPE1BQ1JPQVJHTElTVD57V09SRH0JeworCQkJCXl5bHZhbC5zdHIgPSB5eXRleHQ7CisJCQkJcmV0dXJuIFRfQVJHOworCQkJfQorPE1BQ1JPQVJHTElTVD57U1BBQ0V9ICAgOworPE1BQ1JPQVJHTElTVD5bKCxdCXsKKwkJCQlyZXR1cm4geXl0ZXh0WzBdOworCQkJfQorPE1BQ1JPQVJHTElTVD5bKV0JeworCQkJCXN0cmluZ19idWZfcHRyID0gc3RyaW5nX2J1ZjsKKwkJCQlCRUdJTiBNQUNST0JPRFk7CisJCQkJcmV0dXJuICcpJzsKKwkJCX0KKzxNQUNST0FSR0xJU1Q+LgkJeworCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnZhbGlkIGNoYXJhY3RlciAiCisJCQkJCSAiJyVjJyBpbiBtYWNybyBhcmd1bWVudCBsaXN0IiwKKwkJCQkJIHl5dGV4dFswXSk7CisJCQkJc3RvcChidWYsIEVYX0RBVEFFUlIpOworCQkJfQorPE1BQ1JPQ0FMTEFSR1M+e1NQQUNFfSAgOworPE1BQ1JPQ0FMTEFSR1M+XCgJeworCQkJCXBhcnJlbl9jb3VudCsrOworCQkJCWlmIChwYXJyZW5fY291bnQgPT0gMSkKKwkJCQkJcmV0dXJuICgnKCcpOworCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gJygnOworCQkJfQorPE1BQ1JPQ0FMTEFSR1M+XCkJeworCQkJCXBhcnJlbl9jb3VudC0tOworCQkJCWlmIChwYXJyZW5fY291bnQgPT0gMCkgeworCQkJCQlCRUdJTiBJTklUSUFMOworCQkJCQlyZXR1cm4gKCcpJyk7CisJCQkJfQorCQkJCSpzdHJpbmdfYnVmX3B0cisrID0gJyknOworCQkJfQorPE1BQ1JPQ0FMTEFSR1M+e01DQVJHfQl7CisJCQkJY2hhciAqeXB0cjsKKworCQkJCXlwdHIgPSB5eXRleHQ7CisJCQkJd2hpbGUgKCp5cHRyKQorCQkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9ICp5cHRyKys7CisJCQl9Cis8TUFDUk9DQUxMQVJHUz5cLAl7CisJCQkJaWYgKHN0cmluZ19idWZfcHRyICE9IHN0cmluZ19idWYpIHsKKwkJCQkJLyoKKwkJCQkJICogUmV0dXJuIGFuIGFyZ3VtZW50IGFuZAorCQkJCQkgKiByZXNjYW4gdGhpcyBjb21tYSBzbyB3ZQorCQkJCQkgKiBjYW4gcmV0dXJuIGl0IGFzIHdlbGwuCisJCQkJCSAqLworCQkJCQkqc3RyaW5nX2J1Zl9wdHIgPSAnXDAnOworCQkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkJc3RyaW5nX2J1Zl9wdHIgPSBzdHJpbmdfYnVmOworCQkJCQl1bnB1dCgnLCcpOworCQkJCQlyZXR1cm4gVF9BUkc7CisJCQkJfQorCQkJCXJldHVybiAnLCc7CisJCQl9Cis8TUFDUk9CT0RZPlxcXG4JCXsKKwkJCQkvKiBFYXQgZXNjYXBlZCBuZXdsaW5lcy4gKi8KKwkJCQkrK3l5bGluZW5vOworCQkJfQorPE1BQ1JPQk9EWT5ccgkJOworPE1BQ1JPQk9EWT5cbgkJeworCQkJCS8qIE1hY3JvcyBlbmQgb24gdGhlIGZpcnN0IHVuZXNjYXBlZCBuZXdsaW5lLiAqLworCQkJCUJFR0lOIElOSVRJQUw7CisJCQkJKnN0cmluZ19idWZfcHRyID0gJ1wwJzsKKwkJCQl5eWx2YWwuc3RyID0gc3RyaW5nX2J1ZjsKKwkJCQkrK3l5bGluZW5vOworCQkJCXJldHVybiBUX01BQ1JPQk9EWTsKKwkJCX0KKzxNQUNST0JPRFk+e01CT0RZfQl7CisJCQkJY2hhciAqeXB0cjsKKwkJCQljaGFyIGM7CisKKwkJCQl5cHRyID0geXl0ZXh0OworCQkJCXdoaWxlIChjID0gKnlwdHIrKykgeworCQkJCQkvKgorCQkJCQkgKiBTdHJpcCBjYXJyaWFnZSByZXR1cm5zLgorCQkJCQkgKi8KKwkJCQkJaWYgKGMgPT0gJ1xyJykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkqc3RyaW5nX2J1Zl9wdHIrKyA9IGM7CisJCQkJfQorCQkJfQore1dPUkR9XCgJCXsKKwkJCQljaGFyICp5cHRyOworCQkJCWNoYXIgKnljb3B5OworCisJCQkJLyogTWF5IGJlIGEgc3ltYm9sIG9yIGEgbWFjcm8gaW52b2NhdGlvbi4gKi8KKwkJCQl5eWx2YWwuc3ltID0gc3ltdGFibGVfZ2V0KHl5dGV4dCk7CisJCQkJaWYgKHl5bHZhbC5zeW0tPnR5cGUgPT0gTUFDUk8pIHsKKwkJCQkJWVlfQlVGRkVSX1NUQVRFIG9sZF9zdGF0ZTsKKwkJCQkJWVlfQlVGRkVSX1NUQVRFIHRlbXBfc3RhdGU7CisKKwkJCQkJeWNvcHkgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCQkJeXB0ciA9IHljb3B5ICsgeXlsZW5nOworCQkJCQl3aGlsZSAoeXB0ciA+IHljb3B5KQorCQkJCQkJdW5wdXQoKi0teXB0cik7CisJCQkJCW9sZF9zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCQkJCQl0ZW1wX3N0YXRlID0KKwkJCQkJICAgIHl5X2NyZWF0ZV9idWZmZXIoc3RkaW4sCisJCQkJCQkJICAgICBZWV9CVUZfU0laRSk7CisJCQkJCXl5X3N3aXRjaF90b19idWZmZXIodGVtcF9zdGF0ZSk7CisJCQkJCW1tX3N3aXRjaF90b19idWZmZXIob2xkX3N0YXRlKTsKKwkJCQkJbW1wYXJzZSgpOworCQkJCQltbV9zd2l0Y2hfdG9fYnVmZmVyKHRlbXBfc3RhdGUpOworCQkJCQl5eV9zd2l0Y2hfdG9fYnVmZmVyKG9sZF9zdGF0ZSk7CisJCQkJCW1tX2RlbGV0ZV9idWZmZXIodGVtcF9zdGF0ZSk7CisJCQkJCWV4cGFuZF9tYWNybyh5eWx2YWwuc3ltKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoeXlsdmFsLnN5bS0+dHlwZSA9PSBVTklOSVRJQUxJWkVEKSB7CisJCQkJCQkvKiBUcnkgd2l0aG91dCB0aGUgJygnICovCisJCQkJCQlzeW1ib2xfZGVsZXRlKHl5bHZhbC5zeW0pOworCQkJCQkJeXl0ZXh0W3l5bGVuZy0xXSA9ICdcMCc7CisJCQkJCQl5eWx2YWwuc3ltID0KKwkJCQkJCSAgICBzeW10YWJsZV9nZXQoeXl0ZXh0KTsKKwkJCQkJfQorCQkJCQl1bnB1dCgnKCcpOworCQkJCQlyZXR1cm4gVF9TWU1CT0w7CisJCQkJfQorCQkJfQore1dPUkR9CQkJeworCQkJCXl5bHZhbC5zeW0gPSBzeW10YWJsZV9nZXQoeXl0ZXh0KTsKKwkJCQlpZiAoeXlsdmFsLnN5bS0+dHlwZSA9PSBNQUNSTykgeworCQkJCQlleHBhbmRfbWFjcm8oeXlsdmFsLnN5bSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIFRfU1lNQk9MOworCQkJCX0KKwkJCX0KKy4JCQl7IAorCQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJJbnZhbGlkIGNoYXJhY3RlciAiCisJCQkJCSAiJyVjJyIsIHl5dGV4dFswXSk7CisJCQkJc3RvcChidWYsIEVYX0RBVEFFUlIpOworCQkJfQorJSUKKwordHlwZWRlZiBzdHJ1Y3QgaW5jbHVkZSB7CisgICAgICAgIFlZX0JVRkZFUl9TVEFURSAgYnVmZmVyOworICAgICAgICBpbnQgICAgICAgICAgICAgIGxpbmVubzsKKyAgICAgICAgY2hhciAgICAgICAgICAgICpmaWxlbmFtZTsKKwlTTElTVF9FTlRSWShpbmNsdWRlKSBsaW5rczsKK31pbmNsdWRlX3Q7CisKK1NMSVNUX0hFQUQoLCBpbmNsdWRlKSBpbmNsdWRlX3N0YWNrOworCit2b2lkCitpbmNsdWRlX2ZpbGUoY2hhciAqZmlsZV9uYW1lLCBpbmNsdWRlX3R5cGUgdHlwZSkKK3sKKwlGSUxFICpuZXdmaWxlOworCWluY2x1ZGVfdCAqaW5jbHVkZTsKKworCW5ld2ZpbGUgPSBOVUxMOworCS8qIFRyeSB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3QgKi8KKwlpZiAoaW5jbHVkZXNfc2VhcmNoX2N1cmRpciAhPSAwIHx8IHR5cGUgPT0gU09VUkNFX0ZJTEUpCisJCW5ld2ZpbGUgPSBmb3BlbihmaWxlX25hbWUsICJyIik7CisKKwlpZiAobmV3ZmlsZSA9PSBOVUxMICYmIHR5cGUgIT0gU09VUkNFX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICBwYXRoX2VudHJ5X3QgaW5jbHVkZV9kaXI7CisgICAgICAgICAgICAgICAgZm9yIChpbmNsdWRlX2RpciA9IHNlYXJjaF9wYXRoLnNsaF9maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlyICE9IE5VTEw7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXIgPSBpbmNsdWRlX2Rpci0+bGlua3Muc2xlX25leHQpIHsKKwkJCWNoYXIgZnVsbG5hbWVbUEFUSF9NQVhdOworCisJCQlpZiAoKGluY2x1ZGVfZGlyLT5xdW90ZWRfaW5jbHVkZXNfb25seSA9PSBUUlVFKQorCQkJICYmICh0eXBlICE9IFFVT1RFRF9JTkNMVURFKSkKKwkJCQljb250aW51ZTsKKworCQkJc25wcmludGYoZnVsbG5hbWUsIHNpemVvZihmdWxsbmFtZSksCisJCQkJICIlcy8lcyIsIGluY2x1ZGVfZGlyLT5kaXJlY3RvcnksIGZpbGVfbmFtZSk7CisKKwkJCWlmICgobmV3ZmlsZSA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpKSAhPSBOVUxMKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJaWYgKG5ld2ZpbGUgPT0gTlVMTCkgeworCQlwZXJyb3IoZmlsZV9uYW1lKTsKKwkJc3RvcCgiVW5hYmxlIHRvIG9wZW4gaW5wdXQgZmlsZSIsIEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWlmICh0eXBlICE9IFNPVVJDRV9GSUxFKSB7CisJCWluY2x1ZGUgPSAoaW5jbHVkZV90ICopbWFsbG9jKHNpemVvZihpbmNsdWRlX3QpKTsKKwkJaWYgKGluY2x1ZGUgPT0gTlVMTCkgeworCQkJc3RvcCgiVW5hYmxlIHRvIGFsbG9jYXRlIGluY2x1ZGUgc3RhY2sgZW50cnkiLAorCQkJICAgICBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJaW5jbHVkZS0+YnVmZmVyID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisJCWluY2x1ZGUtPmxpbmVubyA9IHl5bGluZW5vOworCQlpbmNsdWRlLT5maWxlbmFtZSA9IHl5ZmlsZW5hbWU7CisJCVNMSVNUX0lOU0VSVF9IRUFEKCZpbmNsdWRlX3N0YWNrLCBpbmNsdWRlLCBsaW5rcyk7CisJfQorCXl5X3N3aXRjaF90b19idWZmZXIoeXlfY3JlYXRlX2J1ZmZlcihuZXdmaWxlLCBZWV9CVUZfU0laRSkpOworCXl5bGluZW5vID0gMTsKKwl5eWZpbGVuYW1lID0gc3RyZHVwKGZpbGVfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG5leHRfc3Vic3RpdHV0aW9uKHN0cnVjdCBzeW1ib2wgKm1hY19zeW1ib2wsIGNvbnN0IGNoYXIgKmJvZHlfcG9zLAorCQkJICAgICAgY29uc3QgY2hhciAqKm5leHRfbWF0Y2gsCisJCQkgICAgICBzdHJ1Y3QgbWFjcm9fYXJnICoqbWF0Y2hfbWFyZywgcmVnbWF0Y2hfdCAqbWF0Y2gpOworCit2b2lkCitleHBhbmRfbWFjcm8oc3RydWN0IHN5bWJvbCAqbWFjcm9fc3ltYm9sKQoreworCXN0cnVjdCBtYWNyb19hcmcgKm1hcmc7CisJc3RydWN0IG1hY3JvX2FyZyAqbWF0Y2hfbWFyZzsKKwljb25zdCBjaGFyICpib2R5X2hlYWQ7CisJY29uc3QgY2hhciAqYm9keV9wb3M7CisJY29uc3QgY2hhciAqbmV4dF9tYXRjaDsKKworCS8qCisJICogRHVlIHRvIHRoZSBuYXR1cmUgb2YgdW5wdXQsIHdlIG11c3Qgd29yaworCSAqIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBtYWNybyBib2R5IHBlcmZvcm1pbmcKKwkgKiBhbnkgZXhwYW5zaW9ucy4KKwkgKi8KKwlib2R5X2hlYWQgPSBtYWNyb19zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5ib2R5OworCWJvZHlfcG9zID0gYm9keV9oZWFkICsgc3RybGVuKGJvZHlfaGVhZCk7CisJd2hpbGUgKGJvZHlfcG9zID4gYm9keV9oZWFkKSB7CisJCXJlZ21hdGNoX3QgbWF0Y2g7CisKKwkJbmV4dF9tYXRjaCA9IGJvZHlfaGVhZDsKKwkJbWF0Y2hfbWFyZyA9IE5VTEw7CisJCW5leHRfc3Vic3RpdHV0aW9uKG1hY3JvX3N5bWJvbCwgYm9keV9wb3MsICZuZXh0X21hdGNoLAorCQkJCSAgJm1hdGNoX21hcmcsICZtYXRjaCk7CisKKwkJLyogUHV0IGJhY2sgZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgcmVwbGFjZW1lbnQuICovCisJCXdoaWxlIChib2R5X3BvcyA+IG5leHRfbWF0Y2gpCisJCQl1bnB1dCgqLS1ib2R5X3Bvcyk7CisKKwkJLyogUGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQuICovCisJCWlmIChtYXRjaF9tYXJnICE9IE5VTEwpIHsKKwkJCWNvbnN0IGNoYXIgKnN0cnA7CisKKwkJCW5leHRfbWF0Y2ggPSBtYXRjaF9tYXJnLT5yZXBsYWNlbWVudF90ZXh0OworCQkJc3RycCA9IG5leHRfbWF0Y2ggKyBzdHJsZW4obmV4dF9tYXRjaCk7CisJCQl3aGlsZSAoc3RycCA+IG5leHRfbWF0Y2gpCisJCQkJdW5wdXQoKi0tc3RycCk7CisKKwkJCS8qIFNraXAgcGFzdCB0aGUgdW5leHBhbmRlZCBtYWNybyBhcmcuICovCisJCQlib2R5X3BvcyAtPSBtYXRjaC5ybV9lbyAtIG1hdGNoLnJtX3NvOworCQl9CisJfQorCisJLyogQ2xlYW51cCByZXBsYWNlbWVudCB0ZXh0LiAqLworCVNUQUlMUV9GT1JFQUNIKG1hcmcsICZtYWNyb19zeW1ib2wtPmluZm8ubWFjcm9pbmZvLT5hcmdzLCBsaW5rcykgeworCQlmcmVlKG1hcmctPnJlcGxhY2VtZW50X3RleHQpOworCX0KK30KKworLyoKKyAqIEZpbmQgdGhlIG5leHQgc3Vic3RpdHV0aW9uIGluIHRoZSBtYWNybyB3b3JraW5nIGJhY2t3YXJkcyBmcm9tCisgKiBib2R5X3BvcyB1bnRpbCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWNybyBidWZmZXIuICBuZXh0X21hdGNoCisgKiBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFjcm8gYnVmZmVyIHByaW9yCisgKiB0byBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQKK25leHRfc3Vic3RpdHV0aW9uKHN0cnVjdCBzeW1ib2wgKm1hY19zeW1ib2wsIGNvbnN0IGNoYXIgKmJvZHlfcG9zLAorCQkgIGNvbnN0IGNoYXIgKipuZXh0X21hdGNoLCBzdHJ1Y3QgbWFjcm9fYXJnICoqbWF0Y2hfbWFyZywKKwkJICByZWdtYXRjaF90ICptYXRjaCkKK3sKKwlyZWdtYXRjaF90CSAgbWF0Y2hlc1syXTsKKwlzdHJ1Y3QgbWFjcm9fYXJnICptYXJnOworCWNvbnN0IGNoYXIJICpzZWFyY2hfcG9zOworCWludAkJICByZXR2YWw7CisKKwlkbyB7CisJCXNlYXJjaF9wb3MgPSAqbmV4dF9tYXRjaDsKKworCQlTVEFJTFFfRk9SRUFDSChtYXJnLCAmbWFjX3N5bWJvbC0+aW5mby5tYWNyb2luZm8tPmFyZ3MsIGxpbmtzKSB7CisKKwkJCXJldHZhbCA9IHJlZ2V4ZWMoJm1hcmctPmFyZ19yZWdleCwgc2VhcmNoX3BvcywgMiwKKwkJCQkJIG1hdGNoZXMsIDApOworCQkJaWYgKHJldHZhbCA9PSAwCisJCQkgJiYgKG1hdGNoZXNbMV0ucm1fZW8gKyBzZWFyY2hfcG9zKSA8PSBib2R5X3BvcworCQkJICYmIChtYXRjaGVzWzFdLnJtX2VvICsgc2VhcmNoX3BvcykgPiAqbmV4dF9tYXRjaCkgeworCQkJCSptYXRjaCA9IG1hdGNoZXNbMV07CisJCQkJKm5leHRfbWF0Y2ggPSBtYXRjaC0+cm1fZW8gKyBzZWFyY2hfcG9zOworCQkJCSptYXRjaF9tYXJnID0gbWFyZzsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKHNlYXJjaF9wb3MgIT0gKm5leHRfbWF0Y2gpOworfQorCitpbnQKK3l5d3JhcCgpCit7CisJaW5jbHVkZV90ICppbmNsdWRlOworCisJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CisJKHZvaWQpZmNsb3NlKHl5aW4pOworCWlmICh5eWZpbGVuYW1lICE9IE5VTEwpCisJCWZyZWUoeXlmaWxlbmFtZSk7CisJeXlmaWxlbmFtZSA9IE5VTEw7CisJaW5jbHVkZSA9IGluY2x1ZGVfc3RhY2suc2xoX2ZpcnN0OworCWlmIChpbmNsdWRlICE9IE5VTEwpIHsKKwkJeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsdWRlLT5idWZmZXIpOworCQl5eWxpbmVubyA9IGluY2x1ZGUtPmxpbmVubzsKKwkJeXlmaWxlbmFtZSA9IGluY2x1ZGUtPmZpbGVuYW1lOworCQlTTElTVF9SRU1PVkVfSEVBRCgmaW5jbHVkZV9zdGFjaywgbGlua3MpOworCQlmcmVlKGluY2x1ZGUpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9zeW1ib2wuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNDQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmMKQEAgLTAsMCArMSw2NzcgQEAKKy8qCisgKiBBaWM3eHh4IFNDU0kgaG9zdCBhZGFwdGVyIGZpcm13YXJlIGFzc3NlbWJsZXIgc3ltYm9sIHRhYmxlIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmMjMjQgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFpY2RiLmgiCisjZWxzZQorI2luY2x1ZGUgPGRiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2V4aXRzLmg+CisKKyNpbmNsdWRlICJhaWNhc21fc3ltYm9sLmgiCisjaW5jbHVkZSAiYWljYXNtLmgiCisKK3N0YXRpYyBEQiAqc3ltdGFibGU7CisKK3N5bWJvbF90ICoKK3N5bWJvbF9jcmVhdGUoY2hhciAqbmFtZSkKK3sKKwlzeW1ib2xfdCAqbmV3X3N5bWJvbDsKKworCW5ld19zeW1ib2wgPSAoc3ltYm9sX3QgKiltYWxsb2Moc2l6ZW9mKHN5bWJvbF90KSk7CisJaWYgKG5ld19zeW1ib2wgPT0gTlVMTCkgeworCQlwZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbmV3IHN5bWJvbCIpOworCQlleGl0KEVYX1NPRlRXQVJFKTsKKwl9CisJbWVtc2V0KG5ld19zeW1ib2wsIDAsIHNpemVvZigqbmV3X3N5bWJvbCkpOworCW5ld19zeW1ib2wtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJaWYgKG5ld19zeW1ib2wtPm5hbWUgPT0gTlVMTCkKKwkJIHN0b3AoIlVuYWJsZSB0byBzdHJkdXAgc3ltYm9sIG5hbWUiLCBFWF9TT0ZUV0FSRSk7CisJbmV3X3N5bWJvbC0+dHlwZSA9IFVOSU5JVElBTElaRUQ7CisJcmV0dXJuIChuZXdfc3ltYm9sKTsKK30KKwordm9pZAorc3ltYm9sX2RlbGV0ZShzeW1ib2xfdCAqc3ltYm9sKQoreworCWlmIChzeW10YWJsZSAhPSBOVUxMKSB7CisJCURCVAkga2V5OworCisJCWtleS5kYXRhID0gc3ltYm9sLT5uYW1lOworCQlrZXkuc2l6ZSA9IHN0cmxlbihzeW1ib2wtPm5hbWUpOworCQlzeW10YWJsZS0+ZGVsKHN5bXRhYmxlLCAma2V5LCAvKmZsYWdzKi8wKTsKKwl9CisJc3dpdGNoKHN5bWJvbC0+dHlwZSkgeworCWNhc2UgU0NCTE9DOgorCWNhc2UgU1JBTUxPQzoKKwljYXNlIFJFR0lTVEVSOgorCQlpZiAoc3ltYm9sLT5pbmZvLnJpbmZvICE9IE5VTEwpCisJCQlmcmVlKHN5bWJvbC0+aW5mby5yaW5mbyk7CisJCWJyZWFrOworCWNhc2UgQUxJQVM6CisJCWlmIChzeW1ib2wtPmluZm8uYWluZm8gIT0gTlVMTCkKKwkJCWZyZWUoc3ltYm9sLT5pbmZvLmFpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBNQVNLOgorCWNhc2UgRklFTEQ6CisJY2FzZSBFTlVNOgorCWNhc2UgRU5VTV9FTlRSWToKKwkJaWYgKHN5bWJvbC0+aW5mby5maW5mbyAhPSBOVUxMKSB7CisJCQlzeW1saXN0X2ZyZWUoJnN5bWJvbC0+aW5mby5maW5mby0+c3ltcmVmcyk7CisJCQlmcmVlKHN5bWJvbC0+aW5mby5maW5mbyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBET1dOTE9BRF9DT05TVDoKKwljYXNlIENPTlNUOgorCQlpZiAoc3ltYm9sLT5pbmZvLmNpbmZvICE9IE5VTEwpCisJCQlmcmVlKHN5bWJvbC0+aW5mby5jaW5mbyk7CisJCWJyZWFrOworCWNhc2UgTEFCRUw6CisJCWlmIChzeW1ib2wtPmluZm8ubGluZm8gIT0gTlVMTCkKKwkJCWZyZWUoc3ltYm9sLT5pbmZvLmxpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBVTklOSVRJQUxJWkVEOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlmcmVlKHN5bWJvbC0+bmFtZSk7CisJZnJlZShzeW1ib2wpOworfQorCit2b2lkCitzeW10YWJsZV9vcGVuKCkKK3sKKwlzeW10YWJsZSA9IGRib3BlbigvKmZpbGVuYW1lKi9OVUxMLAorCQkJICBPX0NSRUFUIHwgT19OT05CTE9DSyB8IE9fUkRXUiwgLyptb2RlKi8wLCBEQl9IQVNILAorCQkJICAvKm9wZW5pbmZvKi9OVUxMKTsKKworCWlmIChzeW10YWJsZSA9PSBOVUxMKSB7CisJCXBlcnJvcigiU3ltYm9sIHRhYmxlIGNyZWF0aW9uIGZhaWxlZCIpOworCQlleGl0KEVYX1NPRlRXQVJFKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKwordm9pZAorc3ltdGFibGVfY2xvc2UoKQoreworCWlmIChzeW10YWJsZSAhPSBOVUxMKSB7CisJCURCVAkga2V5OworCQlEQlQJIGRhdGE7CisKKwkJd2hpbGUgKHN5bXRhYmxlLT5zZXEoc3ltdGFibGUsICZrZXksICZkYXRhLCBSX0ZJUlNUKSA9PSAwKSB7CisJCQlzeW1ib2xfdCAqc3RvcmVkX3B0cjsKKworCQkJbWVtY3B5KCZzdG9yZWRfcHRyLCBkYXRhLmRhdGEsIHNpemVvZihzdG9yZWRfcHRyKSk7CisJCQlzeW1ib2xfZGVsZXRlKHN0b3JlZF9wdHIpOworCQl9CisJCXN5bXRhYmxlLT5jbG9zZShzeW10YWJsZSk7CisJfQorfQorCisvKgorICogVGhlIHNlbWFudGljcyBvZiBnZXQgaXMgdG8gcmV0dXJuIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGVudHJ5CisgKiBpZiBhIGxvb2t1cCBmYWlscy4KKyAqLworc3ltYm9sX3QgKgorc3ltdGFibGVfZ2V0KGNoYXIgKm5hbWUpCit7CisJc3ltYm9sX3QgKnN0b3JlZF9wdHI7CisJREJUCSAga2V5OworCURCVAkgIGRhdGE7CisJaW50CSAgcmV0dmFsOworCisJa2V5LmRhdGEgPSAodm9pZCAqKW5hbWU7CisJa2V5LnNpemUgPSBzdHJsZW4obmFtZSk7CisKKwlpZiAoKHJldHZhbCA9IHN5bXRhYmxlLT5nZXQoc3ltdGFibGUsICZrZXksICZkYXRhLCAvKmZsYWdzKi8wKSkgIT0gMCkgeworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQlwZXJyb3IoIlN5bWJvbCB0YWJsZSBnZXQgb3BlcmF0aW9uIGZhaWxlZCIpOworCQkJZXhpdChFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0gZWxzZSBpZiAocmV0dmFsID09IDEpIHsKKwkJCS8qIFN5bWJvbCB3YXNuJ3QgZm91bmQsIHNvIGNyZWF0ZSBhIG5ldyBvbmUgKi8KKwkJCXN5bWJvbF90ICpuZXdfc3ltYm9sOworCisJCQluZXdfc3ltYm9sID0gc3ltYm9sX2NyZWF0ZShuYW1lKTsKKwkJCWRhdGEuZGF0YSA9ICZuZXdfc3ltYm9sOworCQkJZGF0YS5zaXplID0gc2l6ZW9mKG5ld19zeW1ib2wpOworCQkJaWYgKHN5bXRhYmxlLT5wdXQoc3ltdGFibGUsICZrZXksICZkYXRhLAorCQkJCQkgIC8qZmxhZ3MqLzApICE9MCkgeworCQkJCXBlcnJvcigiU3ltdGFibGUgcHV0IGZhaWxlZCIpOworCQkJCWV4aXQoRVhfU09GVFdBUkUpOworCQkJfQorCQkJcmV0dXJuIChuZXdfc3ltYm9sKTsKKwkJfSBlbHNlIHsKKwkJCXBlcnJvcigiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBkYiBnZXQgcm91dGluZSIpOworCQkJZXhpdChFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisJbWVtY3B5KCZzdG9yZWRfcHRyLCBkYXRhLmRhdGEsIHNpemVvZihzdG9yZWRfcHRyKSk7CisJcmV0dXJuIChzdG9yZWRfcHRyKTsKK30KKworc3ltYm9sX25vZGVfdCAqCitzeW1saXN0X3NlYXJjaChzeW1saXN0X3QgKnN5bWxpc3QsIGNoYXIgKnN5bW5hbWUpCit7CisJc3ltYm9sX25vZGVfdCAqY3Vybm9kZTsKKworCWN1cm5vZGUgPSBTTElTVF9GSVJTVChzeW1saXN0KTsKKwl3aGlsZShjdXJub2RlICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChzeW1uYW1lLCBjdXJub2RlLT5zeW1ib2wtPm5hbWUpID09IDApCisJCQlicmVhazsKKwkJY3Vybm9kZSA9IFNMSVNUX05FWFQoY3Vybm9kZSwgbGlua3MpOworCX0KKwlyZXR1cm4gKGN1cm5vZGUpOworfQorCit2b2lkCitzeW1saXN0X2FkZChzeW1saXN0X3QgKnN5bWxpc3QsIHN5bWJvbF90ICpzeW1ib2wsIGludCBob3cpCit7CisJc3ltYm9sX25vZGVfdCAqbmV3bm9kZTsKKworCW5ld25vZGUgPSAoc3ltYm9sX25vZGVfdCAqKW1hbGxvYyhzaXplb2Yoc3ltYm9sX25vZGVfdCkpOworCWlmIChuZXdub2RlID09IE5VTEwpIHsKKwkJc3RvcCgic3ltbGlzdF9hZGQ6IFVuYWJsZSB0byBtYWxsb2Mgc3ltYm9sX25vZGUiLCBFWF9TT0ZUV0FSRSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJbmV3bm9kZS0+c3ltYm9sID0gc3ltYm9sOworCWlmIChob3cgPT0gU1lNTElTVF9TT1JUKSB7CisJCXN5bWJvbF9ub2RlX3QgKmN1cm5vZGU7CisJCWludCBmaWVsZDsKKworCQlmaWVsZCA9IEZBTFNFOworCQlzd2l0Y2goc3ltYm9sLT50eXBlKSB7CisJCWNhc2UgUkVHSVNURVI6CisJCWNhc2UgU0NCTE9DOgorCQljYXNlIFNSQU1MT0M6CisJCQlicmVhazsKKwkJY2FzZSBGSUVMRDoKKwkJY2FzZSBNQVNLOgorCQljYXNlIEVOVU06CisJCWNhc2UgRU5VTV9FTlRSWToKKwkJCWZpZWxkID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RvcCgic3ltbGlzdF9hZGQ6IEludmFsaWQgc3ltYm9sIHR5cGUgZm9yIHNvcnRpbmciLAorCQkJICAgICBFWF9TT0ZUV0FSRSk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKworCQljdXJub2RlID0gU0xJU1RfRklSU1Qoc3ltbGlzdCk7CisJCWlmIChjdXJub2RlID09IE5VTEwKKwkJIHx8IChmaWVsZAorCQkgICYmIChjdXJub2RlLT5zeW1ib2wtPnR5cGUgPiBuZXdub2RlLT5zeW1ib2wtPnR5cGUKKwkJICAgfHwgKGN1cm5vZGUtPnN5bWJvbC0+dHlwZSA9PSBuZXdub2RlLT5zeW1ib2wtPnR5cGUKKwkJICAgICYmIChjdXJub2RlLT5zeW1ib2wtPmluZm8uZmluZm8tPnZhbHVlID4KKwkJCW5ld25vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+dmFsdWUpKSkpCisJCSB8fCAoIWZpZWxkICYmIChjdXJub2RlLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MgPgorCQkgICAgICAgICAgICAgICBuZXdub2RlLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MpKSkgeworCQkJU0xJU1RfSU5TRVJUX0hFQUQoc3ltbGlzdCwgbmV3bm9kZSwgbGlua3MpOworCQkJcmV0dXJuOworCQl9CisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChTTElTVF9ORVhUKGN1cm5vZGUsIGxpbmtzKSA9PSBOVUxMKSB7CisJCQkJU0xJU1RfSU5TRVJUX0FGVEVSKGN1cm5vZGUsIG5ld25vZGUsCisJCQkJCQkgICBsaW5rcyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXN5bWJvbF90ICpjdXJzeW1ib2w7CisKKwkJCQljdXJzeW1ib2wgPSBTTElTVF9ORVhUKGN1cm5vZGUsIGxpbmtzKS0+c3ltYm9sOworCQkJCWlmICgoZmllbGQKKwkJICAJCSAgJiYgKGN1cnN5bWJvbC0+dHlwZSA+IHN5bWJvbC0+dHlwZQorCQkJCSAgIHx8IChjdXJzeW1ib2wtPnR5cGUgPT0gc3ltYm9sLT50eXBlCisJCQkJICAgICYmIChjdXJzeW1ib2wtPmluZm8uZmluZm8tPnZhbHVlID4KKwkJCQkJc3ltYm9sLT5pbmZvLmZpbmZvLT52YWx1ZSkpKSkKKwkJCQkgfHwgKCFmaWVsZAorCQkJCSAgICYmIChjdXJzeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MgPgorCQkJCSAgICAgICBzeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MpKSkgeworCQkJCQlTTElTVF9JTlNFUlRfQUZURVIoY3Vybm9kZSwgbmV3bm9kZSwKKwkJCQkJCQkgICBsaW5rcyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWN1cm5vZGUgPSBTTElTVF9ORVhUKGN1cm5vZGUsIGxpbmtzKTsKKwkJfQorCX0gZWxzZSB7CisJCVNMSVNUX0lOU0VSVF9IRUFEKHN5bWxpc3QsIG5ld25vZGUsIGxpbmtzKTsKKwl9Cit9CisKK3ZvaWQKK3N5bWxpc3RfZnJlZShzeW1saXN0X3QgKnN5bWxpc3QpCit7CisJc3ltYm9sX25vZGVfdCAqbm9kZTEsICpub2RlMjsKKworCW5vZGUxID0gU0xJU1RfRklSU1Qoc3ltbGlzdCk7CisJd2hpbGUgKG5vZGUxICE9IE5VTEwpIHsKKwkJbm9kZTIgPSBTTElTVF9ORVhUKG5vZGUxLCBsaW5rcyk7CisJCWZyZWUobm9kZTEpOworCQlub2RlMSA9IG5vZGUyOworCX0KKwlTTElTVF9JTklUKHN5bWxpc3QpOworfQorCit2b2lkCitzeW1saXN0X21lcmdlKHN5bWxpc3RfdCAqc3ltbGlzdF9kZXN0LCBzeW1saXN0X3QgKnN5bWxpc3Rfc3JjMSwKKwkgICAgICBzeW1saXN0X3QgKnN5bWxpc3Rfc3JjMikKK3sKKwlzeW1ib2xfbm9kZV90ICpub2RlOworCisJKnN5bWxpc3RfZGVzdCA9ICpzeW1saXN0X3NyYzE7CisJd2hpbGUoKG5vZGUgPSBTTElTVF9GSVJTVChzeW1saXN0X3NyYzIpKSAhPSBOVUxMKSB7CisJCVNMSVNUX1JFTU9WRV9IRUFEKHN5bWxpc3Rfc3JjMiwgbGlua3MpOworCQlTTElTVF9JTlNFUlRfSEVBRChzeW1saXN0X2Rlc3QsIG5vZGUsIGxpbmtzKTsKKwl9CisKKwkvKiBUaGVzZSBhcmUgbm93IGVtcHR5ICovCisJU0xJU1RfSU5JVChzeW1saXN0X3NyYzEpOworCVNMSVNUX0lOSVQoc3ltbGlzdF9zcmMyKTsKK30KKwordm9pZAorYWljX3ByaW50X2ZpbGVfcHJvbG9ndWUoRklMRSAqb2ZpbGUpCit7CisKKwlpZiAob2ZpbGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZnByaW50ZihvZmlsZSwKKyIvKlxuIgorIiAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkXG4iCisiICoJCSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOlxuIgorIiAqXG4iCisiJXMgKi9cbiIsCisJCXZlcnNpb25zKTsKK30KKwordm9pZAorYWljX3ByaW50X2luY2x1ZGUoRklMRSAqZGZpbGUsIGNoYXIgKmluY2x1ZGVfZmlsZSkKK3sKKworCWlmIChkZmlsZSA9PSBOVUxMKQorCQlyZXR1cm47CisJZnByaW50ZihkZmlsZSwgIlxuI2luY2x1ZGUgXCIlc1wiXG5cbiIsIGluY2x1ZGVfZmlsZSk7Cit9CisKK3ZvaWQKK2FpY19wcmludF9yZWdfZHVtcF90eXBlcyhGSUxFICpvZmlsZSkKK3sKKwlpZiAob2ZpbGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCQkKKwlmcHJpbnRmKG9maWxlLAorInR5cGVkZWYgaW50ICglc3JlZ19wcmludF90KSh1X2ludCwgdV9pbnQgKiwgdV9pbnQpO1xuIgorInR5cGVkZWYgc3RydWN0ICVzcmVnX3BhcnNlX2VudHJ5IHtcbiIKKyIJY2hhcgkqbmFtZTtcbiIKKyIJdWludDhfdAkgdmFsdWU7XG4iCisiCXVpbnQ4X3QJIG1hc2s7XG4iCisifSAlc3JlZ19wYXJzZV9lbnRyeV90O1xuIgorIlxuIiwKKwkJcHJlZml4LCBwcmVmaXgsIHByZWZpeCk7Cit9CisKK3N0YXRpYyB2b2lkCithaWNfcHJpbnRfcmVnX2R1bXBfc3RhcnQoRklMRSAqZGZpbGUsIHN5bWJvbF9ub2RlX3QgKnJlZ25vZGUpCit7CisJaWYgKGRmaWxlID09IE5VTEwpCisJCXJldHVybjsKKworCWZwcmludGYoZGZpbGUsCisic3RhdGljICVzcmVnX3BhcnNlX2VudHJ5X3QgJXNfcGFyc2VfdGFibGVbXSA9IHtcbiIsCisJCXByZWZpeCwKKwkJcmVnbm9kZS0+c3ltYm9sLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2FpY19wcmludF9yZWdfZHVtcF9lbmQoRklMRSAqb2ZpbGUsIEZJTEUgKmRmaWxlLAorCQkgICAgICAgc3ltYm9sX25vZGVfdCAqcmVnbm9kZSwgdV9pbnQgbnVtX2VudHJpZXMpCit7CisJY2hhciAqbG93ZXJfbmFtZTsKKwljaGFyICpsZXR0ZXI7CisKKwlsb3dlcl9uYW1lID0gc3RyZHVwKHJlZ25vZGUtPnN5bWJvbC0+bmFtZSk7CisJaWYgKGxvd2VyX25hbWUgPT0gTlVMTCkKKwkJIHN0b3AoIlVuYWJsZSB0byBzdHJkdXAgc3ltYm9sIG5hbWUiLCBFWF9TT0ZUV0FSRSk7CisJCisJZm9yIChsZXR0ZXIgPSBsb3dlcl9uYW1lOyAqbGV0dGVyICE9ICdcMCc7IGxldHRlcisrKQorCQkqbGV0dGVyID0gdG9sb3dlcigqbGV0dGVyKTsKKworCWlmIChkZmlsZSAhPSBOVUxMKSB7CisJCWlmIChudW1fZW50cmllcyAhPSAwKQorCQkJZnByaW50ZihkZmlsZSwKKyJcbiIKKyJ9O1xuIgorIlxuIik7CisKKwkJZnByaW50ZihkZmlsZSwKKyJpbnRcbiIKKyIlcyVzX3ByaW50KHVfaW50IHJlZ3ZhbHVlLCB1X2ludCAqY3VyX2NvbCwgdV9pbnQgd3JhcClcbiIKKyJ7XG4iCisiCXJldHVybiAoJXNwcmludF9yZWdpc3RlciglcyVzLCAlZCwgXCIlc1wiLFxuIgorIgkgICAgMHglMDJ4LCByZWd2YWx1ZSwgY3VyX2NvbCwgd3JhcCkpO1xuIgorIn1cbiIKKyJcbiIsCisJCQlwcmVmaXgsCisJCQlsb3dlcl9uYW1lLAorCQkJcHJlZml4LAorCQkJbnVtX2VudHJpZXMgIT0gMCA/IHJlZ25vZGUtPnN5bWJvbC0+bmFtZSA6ICJOVUxMIiwKKwkJCW51bV9lbnRyaWVzICE9IDAgPyAiX3BhcnNlX3RhYmxlIiA6ICIiLAorCQkJbnVtX2VudHJpZXMsCisJCQlyZWdub2RlLT5zeW1ib2wtPm5hbWUsCisJCQlyZWdub2RlLT5zeW1ib2wtPmluZm8ucmluZm8tPmFkZHJlc3MpOworCX0KKworCWZwcmludGYob2ZpbGUsCisiI2lmIEFJQ19ERUJVR19SRUdJU1RFUlNcbiIKKyIlc3JlZ19wcmludF90ICVzJXNfcHJpbnQ7XG4iCisiI2Vsc2VcbiIKKyIjZGVmaW5lICVzJXNfcHJpbnQocmVndmFsdWUsIGN1cl9jb2wsIHdyYXApIFxcXG4iCisiICAgICVzcHJpbnRfcmVnaXN0ZXIoTlVMTCwgMCwgXCIlc1wiLCAweCUwMngsIHJlZ3ZhbHVlLCBjdXJfY29sLCB3cmFwKVxuIgorIiNlbmRpZlxuIgorIlxuIiwKKwkJcHJlZml4LAorCQlwcmVmaXgsCisJCWxvd2VyX25hbWUsCisJCXByZWZpeCwKKwkJbG93ZXJfbmFtZSwKKwkJcHJlZml4LAorCQlyZWdub2RlLT5zeW1ib2wtPm5hbWUsCisJCXJlZ25vZGUtPnN5bWJvbC0+aW5mby5yaW5mby0+YWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkCithaWNfcHJpbnRfcmVnX2R1bXBfZW50cnkoRklMRSAqZGZpbGUsIHN5bWJvbF9ub2RlX3QgKmN1cm5vZGUpCit7CisJaW50IG51bV90YWJzOworCisJaWYgKGRmaWxlID09IE5VTEwpCisJCXJldHVybjsKKworCWZwcmludGYoZGZpbGUsCisiCXsgXCIlc1wiLCIsCisJCWN1cm5vZGUtPnN5bWJvbC0+bmFtZSk7CisKKwludW1fdGFicyA9IDMgLSAoc3RybGVuKGN1cm5vZGUtPnN5bWJvbC0+bmFtZSkgKyA1KSAvIDg7CisKKwl3aGlsZSAobnVtX3RhYnMtLSA+IDApCisJCWZwdXRjKCdcdCcsIGRmaWxlKTsKKwlmcHJpbnRmKGRmaWxlLCAiMHglMDJ4LCAweCUwMnggfSIsCisJCWN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+dmFsdWUsCisJCWN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+bWFzayk7Cit9CisKK3ZvaWQKK3N5bXRhYmxlX2R1bXAoRklMRSAqb2ZpbGUsIEZJTEUgKmRmaWxlKQoreworCS8qCisJICogU29ydCB0aGUgcmVnaXN0ZXJzIGJ5IGFkZHJlc3Mgd2l0aCBhIHNpbXBsZSBpbnNlcnRpb24gc29ydC4KKwkgKiBQdXQgYml0bWFza3MgbmV4dCB0byB0aGUgZmlyc3QgcmVnaXN0ZXIgdGhhdCBkZWZpbmVzIHRoZW0uCisJICogUHV0IGNvbnN0YW50cyBhdCB0aGUgZW5kLgorCSAqLworCXN5bWxpc3RfdAkgcmVnaXN0ZXJzOworCXN5bWxpc3RfdAkgbWFza3M7CisJc3ltbGlzdF90CSBjb25zdGFudHM7CisJc3ltbGlzdF90CSBkb3dubG9hZF9jb25zdGFudHM7CisJc3ltbGlzdF90CSBhbGlhc2VzOworCXN5bWxpc3RfdAkgZXhwb3J0ZWRfbGFiZWxzOworCXN5bWJvbF9ub2RlX3QJKmN1cm5vZGU7CisJc3ltYm9sX25vZGVfdAkqcmVnbm9kZTsKKwlEQlQJCSBrZXk7CisJREJUCQkgZGF0YTsKKwlpbnQJCSBmbGFnOworCXVfaW50CQkgaTsKKworCWlmIChzeW10YWJsZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlTTElTVF9JTklUKCZyZWdpc3RlcnMpOworCVNMSVNUX0lOSVQoJm1hc2tzKTsKKwlTTElTVF9JTklUKCZjb25zdGFudHMpOworCVNMSVNUX0lOSVQoJmRvd25sb2FkX2NvbnN0YW50cyk7CisJU0xJU1RfSU5JVCgmYWxpYXNlcyk7CisJU0xJU1RfSU5JVCgmZXhwb3J0ZWRfbGFiZWxzKTsKKwlmbGFnID0gUl9GSVJTVDsKKwl3aGlsZSAoc3ltdGFibGUtPnNlcShzeW10YWJsZSwgJmtleSwgJmRhdGEsIGZsYWcpID09IDApIHsKKwkJc3ltYm9sX3QgKmN1cnN5bTsKKworCQltZW1jcHkoJmN1cnN5bSwgZGF0YS5kYXRhLCBzaXplb2YoY3Vyc3ltKSk7CisJCXN3aXRjaChjdXJzeW0tPnR5cGUpIHsKKwkJY2FzZSBSRUdJU1RFUjoKKwkJY2FzZSBTQ0JMT0M6CisJCWNhc2UgU1JBTUxPQzoKKwkJCXN5bWxpc3RfYWRkKCZyZWdpc3RlcnMsIGN1cnN5bSwgU1lNTElTVF9TT1JUKTsKKwkJCWJyZWFrOworCQljYXNlIE1BU0s6CisJCWNhc2UgRklFTEQ6CisJCWNhc2UgRU5VTToKKwkJY2FzZSBFTlVNX0VOVFJZOgorCQkJc3ltbGlzdF9hZGQoJm1hc2tzLCBjdXJzeW0sIFNZTUxJU1RfU09SVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT05TVDoKKwkJCXN5bWxpc3RfYWRkKCZjb25zdGFudHMsIGN1cnN5bSwKKwkJCQkgICAgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJCQlicmVhazsKKwkJY2FzZSBET1dOTE9BRF9DT05TVDoKKwkJCXN5bWxpc3RfYWRkKCZkb3dubG9hZF9jb25zdGFudHMsIGN1cnN5bSwKKwkJCQkgICAgU1lNTElTVF9JTlNFUlRfSEVBRCk7CisJCQlicmVhazsKKwkJY2FzZSBBTElBUzoKKwkJCXN5bWxpc3RfYWRkKCZhbGlhc2VzLCBjdXJzeW0sCisJCQkJICAgIFNZTUxJU1RfSU5TRVJUX0hFQUQpOworCQkJYnJlYWs7CisJCWNhc2UgTEFCRUw6CisJCQlpZiAoY3Vyc3ltLT5pbmZvLmxpbmZvLT5leHBvcnRlZCA9PSAwKQorCQkJCWJyZWFrOworCQkJc3ltbGlzdF9hZGQoJmV4cG9ydGVkX2xhYmVscywgY3Vyc3ltLAorCQkJCSAgICBTWU1MSVNUX0lOU0VSVF9IRUFEKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJZmxhZyA9IFJfTkVYVDsKKwl9CisKKwkvKiBSZWdpc3RlciBkaWFub3N0aWMgZnVuY3Rpb25zL2RlY2xhcmF0aW9ucyBmaXJzdC4gKi8KKwlhaWNfcHJpbnRfZmlsZV9wcm9sb2d1ZShvZmlsZSk7CisJYWljX3ByaW50X3JlZ19kdW1wX3R5cGVzKG9maWxlKTsKKwlhaWNfcHJpbnRfZmlsZV9wcm9sb2d1ZShkZmlsZSk7CisJYWljX3ByaW50X2luY2x1ZGUoZGZpbGUsIHN0b2NrX2luY2x1ZGVfZmlsZSk7CisJU0xJU1RfRk9SRUFDSChjdXJub2RlLCAmcmVnaXN0ZXJzLCBsaW5rcykgeworCisJCXN3aXRjaChjdXJub2RlLT5zeW1ib2wtPnR5cGUpIHsKKwkJY2FzZSBSRUdJU1RFUjoKKwkJY2FzZSBTQ0JMT0M6CisJCWNhc2UgU1JBTUxPQzoKKwkJeworCQkJc3ltbGlzdF90CSpmaWVsZHM7CisJCQlzeW1ib2xfbm9kZV90CSpmaWVsZG5vZGU7CisJCQlpbnQJCSBudW1fZW50cmllczsKKworCQkJbnVtX2VudHJpZXMgPSAwOworCQkJZmllbGRzID0gJmN1cm5vZGUtPnN5bWJvbC0+aW5mby5yaW5mby0+ZmllbGRzOworCQkJU0xJU1RfRk9SRUFDSChmaWVsZG5vZGUsIGZpZWxkcywgbGlua3MpIHsKKwkJCQlpZiAobnVtX2VudHJpZXMgPT0gMCkKKwkJCQkJYWljX3ByaW50X3JlZ19kdW1wX3N0YXJ0KGRmaWxlLAorCQkJCQkJCQkgY3Vybm9kZSk7CisJCQkJZWxzZSBpZiAoZGZpbGUgIT0gTlVMTCkKKwkJCQkJZnB1dHMoIixcbiIsIGRmaWxlKTsKKwkJCQludW1fZW50cmllcysrOworCQkJCWFpY19wcmludF9yZWdfZHVtcF9lbnRyeShkZmlsZSwgZmllbGRub2RlKTsKKwkJCX0KKwkJCWFpY19wcmludF9yZWdfZHVtcF9lbmQob2ZpbGUsIGRmaWxlLAorCQkJCQkgICAgICAgY3Vybm9kZSwgbnVtX2VudHJpZXMpOworCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEZvbGQgaW4gdGhlIG1hc2tzIGFuZCBiaXRzICovCisJd2hpbGUgKFNMSVNUX0ZJUlNUKCZtYXNrcykgIT0gTlVMTCkgeworCQljaGFyICpyZWduYW1lOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmbWFza3MpOworCQlTTElTVF9SRU1PVkVfSEVBRCgmbWFza3MsIGxpbmtzKTsKKworCQlyZWdub2RlID0gU0xJU1RfRklSU1QoJmN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+c3ltcmVmcyk7CisJCXJlZ25hbWUgPSByZWdub2RlLT5zeW1ib2wtPm5hbWU7CisJCXJlZ25vZGUgPSBzeW1saXN0X3NlYXJjaCgmcmVnaXN0ZXJzLCByZWduYW1lKTsKKwkJU0xJU1RfSU5TRVJUX0FGVEVSKHJlZ25vZGUsIGN1cm5vZGUsIGxpbmtzKTsKKwl9CisKKwkvKiBBZGQgdGhlIGFsaWFzZXMgKi8KKwl3aGlsZSAoU0xJU1RfRklSU1QoJmFsaWFzZXMpICE9IE5VTEwpIHsKKwkJY2hhciAqcmVnbmFtZTsKKworCQljdXJub2RlID0gU0xJU1RfRklSU1QoJmFsaWFzZXMpOworCQlTTElTVF9SRU1PVkVfSEVBRCgmYWxpYXNlcywgbGlua3MpOworCisJCXJlZ25hbWUgPSBjdXJub2RlLT5zeW1ib2wtPmluZm8uYWluZm8tPnBhcmVudC0+bmFtZTsKKwkJcmVnbm9kZSA9IHN5bWxpc3Rfc2VhcmNoKCZyZWdpc3RlcnMsIHJlZ25hbWUpOworCQlTTElTVF9JTlNFUlRfQUZURVIocmVnbm9kZSwgY3Vybm9kZSwgbGlua3MpOworCX0KKworCS8qIE91dHB1dCBnZW5lcmF0ZWQgI2RlZmluZXMuICovCisJd2hpbGUgKFNMSVNUX0ZJUlNUKCZyZWdpc3RlcnMpICE9IE5VTEwpIHsKKwkJc3ltYm9sX25vZGVfdCAqY3Vybm9kZTsKKwkJdV9pbnQgdmFsdWU7CisJCWNoYXIgKnRhYl9zdHI7CisJCWNoYXIgKnRhYl9zdHIyOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmcmVnaXN0ZXJzKTsKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoJnJlZ2lzdGVycywgbGlua3MpOworCQlzd2l0Y2goY3Vybm9kZS0+c3ltYm9sLT50eXBlKSB7CisJCWNhc2UgUkVHSVNURVI6CisJCWNhc2UgU0NCTE9DOgorCQljYXNlIFNSQU1MT0M6CisJCQlmcHJpbnRmKG9maWxlLCAiXG4iKTsKKwkJCXZhbHVlID0gY3Vybm9kZS0+c3ltYm9sLT5pbmZvLnJpbmZvLT5hZGRyZXNzOworCQkJdGFiX3N0ciA9ICJcdCI7CisJCQl0YWJfc3RyMiA9ICJcdFx0IjsKKwkJCWJyZWFrOworCQljYXNlIEFMSUFTOgorCQl7CisJCQlzeW1ib2xfdCAqcGFyZW50OworCisJCQlwYXJlbnQgPSBjdXJub2RlLT5zeW1ib2wtPmluZm8uYWluZm8tPnBhcmVudDsKKwkJCXZhbHVlID0gcGFyZW50LT5pbmZvLnJpbmZvLT5hZGRyZXNzOworCQkJdGFiX3N0ciA9ICJcdCI7CisJCQl0YWJfc3RyMiA9ICJcdFx0IjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTUFTSzoKKwkJY2FzZSBGSUVMRDoKKwkJY2FzZSBFTlVNOgorCQljYXNlIEVOVU1fRU5UUlk6CisJCQl2YWx1ZSA9IGN1cm5vZGUtPnN5bWJvbC0+aW5mby5maW5mby0+dmFsdWU7CisJCQl0YWJfc3RyID0gIlx0XHQiOworCQkJdGFiX3N0cjIgPSAiXHQiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2YWx1ZSA9IDA7IC8qIFF1aWV0IGNvbXBpbGVyICovCisJCQl0YWJfc3RyID0gTlVMTDsKKwkJCXRhYl9zdHIyID0gTlVMTDsKKwkJCXN0b3AoInN5bXRhYmxlX2R1bXA6IEludmFsaWQgc3ltYm9sIHR5cGUgIgorCQkJICAgICAiZW5jb3VudGVyZWQiLCBFWF9TT0ZUV0FSRSk7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKG9maWxlLCAiI2RlZmluZSVzJS0xNnMlczB4JTAyeFxuIiwKKwkJCXRhYl9zdHIsIGN1cm5vZGUtPnN5bWJvbC0+bmFtZSwgdGFiX3N0cjIsCisJCQl2YWx1ZSk7CisJCWZyZWUoY3Vybm9kZSk7CisJfQorCWZwcmludGYob2ZpbGUsICJcblxuIik7CisKKwl3aGlsZSAoU0xJU1RfRklSU1QoJmNvbnN0YW50cykgIT0gTlVMTCkgeworCQlzeW1ib2xfbm9kZV90ICpjdXJub2RlOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmY29uc3RhbnRzKTsKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoJmNvbnN0YW50cywgbGlua3MpOworCQlmcHJpbnRmKG9maWxlLCAiI2RlZmluZVx0JS04c1x0MHglMDJ4XG4iLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5uYW1lLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSk7CisJCWZyZWUoY3Vybm9kZSk7CisJfQorCisJCisJZnByaW50ZihvZmlsZSwgIlxuXG4vKiBEb3dubG9hZGVkIENvbnN0YW50IERlZmluaXRpb25zICovXG4iKTsKKworCWZvciAoaSA9IDA7IFNMSVNUX0ZJUlNUKCZkb3dubG9hZF9jb25zdGFudHMpICE9IE5VTEw7IGkrKykgeworCQlzeW1ib2xfbm9kZV90ICpjdXJub2RlOworCisJCWN1cm5vZGUgPSBTTElTVF9GSVJTVCgmZG93bmxvYWRfY29uc3RhbnRzKTsKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoJmRvd25sb2FkX2NvbnN0YW50cywgbGlua3MpOworCQlmcHJpbnRmKG9maWxlLCAiI2RlZmluZVx0JS04c1x0MHglMDJ4XG4iLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5uYW1lLAorCQkJY3Vybm9kZS0+c3ltYm9sLT5pbmZvLmNpbmZvLT52YWx1ZSk7CisJCWZyZWUoY3Vybm9kZSk7CisJfQorCWZwcmludGYob2ZpbGUsICIjZGVmaW5lXHRET1dOTE9BRF9DT05TVF9DT1VOVFx0MHglMDJ4XG4iLCBpKTsKKworCWZwcmludGYob2ZpbGUsICJcblxuLyogRXhwb3J0ZWQgTGFiZWxzICovXG4iKTsKKworCXdoaWxlIChTTElTVF9GSVJTVCgmZXhwb3J0ZWRfbGFiZWxzKSAhPSBOVUxMKSB7CisJCXN5bWJvbF9ub2RlX3QgKmN1cm5vZGU7CisKKwkJY3Vybm9kZSA9IFNMSVNUX0ZJUlNUKCZleHBvcnRlZF9sYWJlbHMpOworCQlTTElTVF9SRU1PVkVfSEVBRCgmZXhwb3J0ZWRfbGFiZWxzLCBsaW5rcyk7CisJCWZwcmludGYob2ZpbGUsICIjZGVmaW5lXHRMQUJFTF8lLThzXHQweCUwMnhcbiIsCisJCQljdXJub2RlLT5zeW1ib2wtPm5hbWUsCisJCQljdXJub2RlLT5zeW1ib2wtPmluZm8ubGluZm8tPmFkZHJlc3MpOworCQlmcmVlKGN1cm5vZGUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljYXNtL2FpY2FzbV9zeW1ib2wuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMjJlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBBaWM3eHh4IFNDU0kgaG9zdCBhZGFwdGVyIGZpcm13YXJlIGFzc3NlbWJsZXIgc3ltYm9sIHRhYmxlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqCisgKiAkSWQ6IC8vZGVwb3QvYWljN3h4eC9haWM3eHh4L2FpY2FzbS9haWNhc21fc3ltYm9sLmgjMTcgJAorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlICIuLi9xdWV1ZS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworCVVOSU5JVElBTElaRUQsCisJUkVHSVNURVIsCisJQUxJQVMsCisJU0NCTE9DLAorCVNSQU1MT0MsCisJRU5VTV9FTlRSWSwKKwlGSUVMRCwKKwlNQVNLLAorCUVOVU0sCisJQ09OU1QsCisJRE9XTkxPQURfQ09OU1QsCisJTEFCRUwsCisJQ09ORElUSU9OQUwsCisJTUFDUk8KK30gc3ltdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlSTyA9IDB4MDEsCisJV08gPSAweDAyLAorCVJXID0gMHgwMworfWFtb2RlX3Q7CisKK3R5cGVkZWYgU0xJU1RfSEVBRChzeW1saXN0LCBzeW1ib2xfbm9kZSkgc3ltbGlzdF90OworCitzdHJ1Y3QgcmVnX2luZm8geworCXVfaW50CSAgYWRkcmVzczsKKwlpbnQJICBzaXplOworCWFtb2RlX3QJICBtb2RlOworCXN5bWxpc3RfdCBmaWVsZHM7CisJdWludDhfdAkgIHZhbGlkX2JpdG1hc2s7CisJdWludDhfdAkgIG1vZGVzOworCWludAkgIHR5cGVjaGVja19tYXNrczsKK307CisKK3N0cnVjdCBmaWVsZF9pbmZvIHsKKwlzeW1saXN0X3Qgc3ltcmVmczsKKwl1aW50OF90CSAgdmFsdWU7CisJdWludDhfdAkgIG1hc2s7Cit9OworCitzdHJ1Y3QgY29uc3RfaW5mbyB7CisJdV9pbnQJdmFsdWU7CisJaW50CWRlZmluZTsKK307CisKK3N0cnVjdCBhbGlhc19pbmZvIHsKKwlzdHJ1Y3Qgc3ltYm9sICpwYXJlbnQ7Cit9OworCitzdHJ1Y3QgbGFiZWxfaW5mbyB7CisJaW50CWFkZHJlc3M7CisJaW50CWV4cG9ydGVkOworfTsKKworc3RydWN0IGNvbmRfaW5mbyB7CisJaW50CWZ1bmNfbnVtOworfTsKKworc3RydWN0IG1hY3JvX2FyZyB7CisJU1RBSUxRX0VOVFJZKG1hY3JvX2FyZykJbGlua3M7CisJcmVnZXhfdAlhcmdfcmVnZXg7CisJY2hhciAgICpyZXBsYWNlbWVudF90ZXh0OworfTsKK1NUQUlMUV9IRUFEKG1hY3JvX2FyZ19saXN0LCBtYWNyb19hcmcpIGFyZ3M7CisKK3N0cnVjdCBtYWNyb19pbmZvIHsKKwlzdHJ1Y3QgbWFjcm9fYXJnX2xpc3QgYXJnczsKKwlpbnQgICBuYXJnOworCWNvbnN0IGNoYXIqIGJvZHk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBleHByZXNzaW9uX2luZm8geworICAgICAgICBzeW1saXN0X3QgICAgICAgcmVmZXJlbmNlZF9zeW1zOworICAgICAgICBpbnQgICAgICAgICAgICAgdmFsdWU7Cit9IGV4cHJlc3Npb25fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sIHsKKwljaGFyCSpuYW1lOworCXN5bXR5cGUJdHlwZTsKKwl1bmlvbgl7CisJCXN0cnVjdCByZWdfaW5mbwkgICpyaW5mbzsKKwkJc3RydWN0IGZpZWxkX2luZm8gKmZpbmZvOworCQlzdHJ1Y3QgY29uc3RfaW5mbyAqY2luZm87CisJCXN0cnVjdCBhbGlhc19pbmZvICphaW5mbzsKKwkJc3RydWN0IGxhYmVsX2luZm8gKmxpbmZvOworCQlzdHJ1Y3QgY29uZF9pbmZvICAqY29uZGluZm87CisJCXN0cnVjdCBtYWNyb19pbmZvICptYWNyb2luZm87CisJfWluZm87Cit9IHN5bWJvbF90OworCit0eXBlZGVmIHN0cnVjdCBzeW1ib2xfcmVmIHsKKwlzeW1ib2xfdCAqc3ltYm9sOworCWludAkgb2Zmc2V0OworfSBzeW1ib2xfcmVmX3Q7CisKK3R5cGVkZWYgc3RydWN0IHN5bWJvbF9ub2RlIHsKKwlTTElTVF9FTlRSWShzeW1ib2xfbm9kZSkgbGlua3M7CisJc3ltYm9sX3QgKnN5bWJvbDsKK30gc3ltYm9sX25vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY3JpdGljYWxfc2VjdGlvbiB7CisJVEFJTFFfRU5UUlkoY3JpdGljYWxfc2VjdGlvbikgbGlua3M7CisJaW50IGJlZ2luX2FkZHI7CisJaW50IGVuZF9hZGRyOworfSBjcml0aWNhbF9zZWN0aW9uX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJU0NPUEVfUk9PVCwKKwlTQ09QRV9JRiwKKwlTQ09QRV9FTFNFX0lGLAorCVNDT1BFX0VMU0UKK30gc2NvcGVfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgcGF0Y2hfaW5mbyB7CisJaW50IHNraXBfcGF0Y2g7CisJaW50IHNraXBfaW5zdHI7Cit9IHBhdGNoX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2NvcGUgeworCVNMSVNUX0VOVFJZKHNjb3BlKSBzY29wZV9zdGFja19saW5rczsKKwlUQUlMUV9FTlRSWShzY29wZSkgc2NvcGVfbGlua3M7CisJVEFJTFFfSEVBRCgsIHNjb3BlKSBpbm5lcl9zY29wZTsKKwlzY29wZV90eXBlIHR5cGU7CisJaW50IGlubmVyX3Njb3BlX3BhdGNoZXM7CisJaW50IGJlZ2luX2FkZHI7CisgICAgICAgIGludCBlbmRfYWRkcjsKKwlwYXRjaF9pbmZvX3QgcGF0Y2hlc1syXTsKKwlpbnQgZnVuY19udW07Cit9IHNjb3BlX3Q7CisKK1RBSUxRX0hFQUQoY3NfdGFpbHEsIGNyaXRpY2FsX3NlY3Rpb24pOworU0xJU1RfSEVBRChzY29wZV9saXN0LCBzY29wZSk7CitUQUlMUV9IRUFEKHNjb3BlX3RhaWxxLCBzY29wZSk7CisKK3ZvaWQJc3ltYm9sX2RlbGV0ZShzeW1ib2xfdCAqc3ltYm9sKTsKKwordm9pZAlzeW10YWJsZV9vcGVuKHZvaWQpOworCit2b2lkCXN5bXRhYmxlX2Nsb3NlKHZvaWQpOworCitzeW1ib2xfdCAqCisJc3ltdGFibGVfZ2V0KGNoYXIgKm5hbWUpOworCitzeW1ib2xfbm9kZV90ICoKKwlzeW1saXN0X3NlYXJjaChzeW1saXN0X3QgKnN5bWxpc3QsIGNoYXIgKnN5bW5hbWUpOworCit2b2lkCisJc3ltbGlzdF9hZGQoc3ltbGlzdF90ICpzeW1saXN0LCBzeW1ib2xfdCAqc3ltYm9sLCBpbnQgaG93KTsKKyNkZWZpbmUgU1lNTElTVF9JTlNFUlRfSEVBRAkweDAwCisjZGVmaW5lIFNZTUxJU1RfU09SVAkJMHgwMQorCit2b2lkCXN5bWxpc3RfZnJlZShzeW1saXN0X3QgKnN5bWxpc3QpOworCit2b2lkCXN5bWxpc3RfbWVyZ2Uoc3ltbGlzdF90ICpzeW1saXN0X2Rlc3QsIHN5bWxpc3RfdCAqc3ltbGlzdF9zcmMxLAorCQkgICAgICBzeW1saXN0X3QgKnN5bWxpc3Rfc3JjMik7Cit2b2lkCXN5bXRhYmxlX2R1bXAoRklMRSAqb2ZpbGUsIEZJTEUgKmRmaWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZmQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpY2xpYi5jCkBAIC0wLDAgKzEsMTQxMiBAQAorLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBhbGwgU0NTSSBkZXZpY2UgdHlwZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAxOTk5IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBLZW5uZXRoIEQuIE1lcnJ5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Q6IHNyYy9zeXMvY2FtL3Njc2kvc2NzaV9hbGwuYyx2IDEuMzggMjAwMi8wOS8yMyAwNDo1NjozNSBtamFjb2IgRXhwICQKKyAqICRJZCQKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKy8qIENvcmUgU0NTSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFpY2xpYi5oIgorI2luY2x1ZGUgImNhbS5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmIC8qIEZBTFNFICovCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgICAxCisjZW5kaWYgLyogVFJVRSAqLworI2lmbmRlZiBFUkVTVEFSVAorI2RlZmluZSBFUkVTVEFSVCAgICAgICAgLTEgICAgICAgICAgICAgIC8qIHJlc3RhcnQgc3lzY2FsbCAqLworI2VuZGlmCisjaWZuZGVmIEVKVVNUUkVUVVJOCisjZGVmaW5lIEVKVVNUUkVUVVJOICAgICAtMiAgICAgICAgICAgICAgLyogZG9uJ3QgbW9kaWZ5IHJlZ3MsIGp1c3QgcmV0dXJuICovCisjZW5kaWYKKworc3RhdGljIGludAlhc2NlbnRyeWNvbXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpOworc3RhdGljIGludAlzZW5zZWVudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcik7CitzdGF0aWMgdm9pZAlmZXRjaHRhYmxlZW50cmllcyhpbnQgc2Vuc2Vfa2V5LCBpbnQgYXNjLCBpbnQgYXNjcSwKKwkJCQkgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqLAorCQkJCSAgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKiopOworc3RhdGljIHZvaWQgKglzY3NpYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwKKwkJCSAgICBzaXplX3Qgc2l6ZSwKKwkJCSAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Cit0eXBlZGVmIGludCAoY2FtX3F1aXJrbWF0Y2hfdCkoY2FkZHJfdCwgY2FkZHJfdCk7CitzdGF0aWMgaW50CWNhbV9zdHJtYXRjaChjb25zdCB1X2ludDhfdCAqc3RyLCBjb25zdCB1X2ludDhfdCAqcGF0dGVybiwKKwkJCSAgICAgaW50IHN0cl9sZW4pOworc3RhdGljIGNhZGRyX3QJY2FtX3F1aXJrbWF0Y2goY2FkZHJfdCB0YXJnZXQsIGNhZGRyX3QgcXVpcmtfdGFibGUsCisJCQkgICAgICAgaW50IG51bV9lbnRyaWVzLCBpbnQgZW50cnlfc2l6ZSwKKwkJCSAgICAgICBjYW1fcXVpcmttYXRjaF90ICpjb21wX2Z1bmMpOworCisjZGVmaW5lIFNDU0lfTk9fU0VOU0VfU1RSSU5HUyAxCisjaWYgIWRlZmluZWQoU0NTSV9OT19TRU5TRV9TVFJJTkdTKQorI2RlZmluZSBTU1QoYXNjLCBhc2NxLCBhY3Rpb24sIGRlc2MpIFwKKwlhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYworI2Vsc2UgCitzdGF0aWMgY29uc3QgY2hhciBlbXB0eV9zdHJpbmdbXSA9ICIiOworCisjZGVmaW5lIFNTVChhc2MsIGFzY3EsIGFjdGlvbiwgZGVzYykgXAorCWFzYywgYXNjcSwgYWN0aW9uLCBlbXB0eV9zdHJpbmcKKyNlbmRpZiAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgc2Vuc2Vfa2V5X3RhYmxlW10gPSAKK3sKKwl7IFNTRF9LRVlfTk9fU0VOU0UsIFNTX05PUCwgIk5PIFNFTlNFIiB9LAorCXsgU1NEX0tFWV9SRUNPVkVSRURfRVJST1IsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsICJSRUNPVkVSRUQgRVJST1IiIH0sCisJeworCSAgU1NEX0tFWV9OT1RfUkVBRFksIFNTX1RVUnxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZLAorCSAgIk5PVCBSRUFEWSIKKwl9LAorCXsgU1NEX0tFWV9NRURJVU1fRVJST1IsIFNTX1JERUYsICJNRURJVU0gRVJST1IiIH0sCisJeyBTU0RfS0VZX0hBUkRXQVJFX0VSUk9SLCBTU19SREVGLCAiSEFSRFdBUkUgRkFJTFVSRSIgfSwKKwl7IFNTRF9LRVlfSUxMRUdBTF9SRVFVRVNULCBTU19GQVRBTHxFSU5WQUwsICJJTExFR0FMIFJFUVVFU1QiIH0sCisJeyBTU0RfS0VZX1VOSVRfQVRURU5USU9OLCBTU19GQVRBTHxFTlhJTywgIlVOSVQgQVRURU5USU9OIiB9LAorCXsgU1NEX0tFWV9EQVRBX1BST1RFQ1QsIFNTX0ZBVEFMfEVBQ0NFUywgIkRBVEEgUFJPVEVDVCIgfSwKKwl7IFNTRF9LRVlfQkxBTktfQ0hFQ0ssIFNTX0ZBVEFMfEVOT1NQQywgIkJMQU5LIENIRUNLIiB9LAorCXsgU1NEX0tFWV9WZW5kb3JfU3BlY2lmaWMsIFNTX0ZBVEFMfEVJTywgIlZlbmRvciBTcGVjaWZpYyIgfSwKKwl7IFNTRF9LRVlfQ09QWV9BQk9SVEVELCBTU19GQVRBTHxFSU8sICJDT1BZIEFCT1JURUQiIH0sCisJeyBTU0RfS0VZX0FCT1JURURfQ09NTUFORCwgU1NfUkRFRiwgIkFCT1JURUQgQ09NTUFORCIgfSwKKwl7IFNTRF9LRVlfRVFVQUwsIFNTX05PUCwgIkVRVUFMIiB9LAorCXsgU1NEX0tFWV9WT0xVTUVfT1ZFUkZMT1csIFNTX0ZBVEFMfEVJTywgIlZPTFVNRSBPVkVSRkxPVyIgfSwKKwl7IFNTRF9LRVlfTUlTQ09NUEFSRSwgU1NfTk9QLCAiTUlTQ09NUEFSRSIgfSwKKwl7IFNTRF9LRVlfUkVTRVJWRUQsIFNTX0ZBVEFMfEVJTywgIlJFU0VSVkVEIiB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IHNlbnNlX2tleV90YWJsZV9zaXplID0KKyAgICBzaXplb2Yoc2Vuc2Vfa2V5X3RhYmxlKS9zaXplb2Yoc2Vuc2Vfa2V5X3RhYmxlWzBdKTsKKworc3RhdGljIHN0cnVjdCBhc2NfdGFibGVfZW50cnkgcXVhbnR1bV9maXJlYmFsbF9lbnRyaWVzW10gPSB7CisJe1NTVCgweDA0LCAweDBiLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLCAKKwkgICAgICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY21kLiByZXF1aXJlZCIpfQorfTsKKworc3RhdGljIHN0cnVjdCBhc2NfdGFibGVfZW50cnkgc29ueV9tb19lbnRyaWVzW10gPSB7CisJe1NTVCgweDA0LCAweDAwLCBTU19TVEFSVHxTU1FfREVDUkVNRU5UX0NPVU5UfEVOWElPLAorCSAgICAgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGNhdXNlIG5vdCByZXBvcnRhYmxlIil9Cit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgc2Vuc2VfcXVpcmtfdGFibGVbXSA9IHsKKwl7CisJCS8qCisJCSAqIFRoZSBRdWFudHVtIEZpcmViYWxsIFNUIGFuZCBTRSBsaWtlIHRvIHJldHVybiAweDA0IDB4MGIgd2hlbgorCQkgKiB0aGV5IHJlYWxseSBzaG91bGQgcmV0dXJuIDB4MDQgMHgwMi4gIDB4MDQsMHgwYiBpc24ndAorCQkgKiBkZWZpbmVkIGluIGFueSBTQ1NJIHNwZWMsIGFuZCBpdCBpc24ndCBtZW50aW9uZWQgaW4gdGhlCisJCSAqIGhhcmR3YXJlIG1hbnVhbCBmb3IgdGhlc2UgZHJpdmVzLgorCQkgKi8KKwkJe1RfRElSRUNULCBTSVBfTUVESUFfRklYRUQsICJRVUFOVFVNIiwgIkZJUkVCQUxMIFMqIiwgIioifSwKKwkJLypudW1fc2Vuc2Vfa2V5cyovMCwKKwkJc2l6ZW9mKHF1YW50dW1fZmlyZWJhbGxfZW50cmllcykvc2l6ZW9mKHN0cnVjdCBhc2NfdGFibGVfZW50cnkpLAorCQkvKnNlbnNlIGtleSBlbnRyaWVzKi9OVUxMLAorCQlxdWFudHVtX2ZpcmViYWxsX2VudHJpZXMKKwl9LAorCXsKKwkJLyoKKwkJICogVGhpcyBTb255IE1PIGRyaXZlIGxpa2VzIHRvIHJldHVybiAweDA0LCAweDAwIHdoZW4gaXQKKwkJICogaXNuJ3Qgc3B1biB1cC4KKwkJICovCisJCXtUX0RJUkVDVCwgU0lQX01FRElBX1JFTU9WQUJMRSwgIlNPTlkiLCAiU01PLSoiLCAiKiJ9LAorCQkvKm51bV9zZW5zZV9rZXlzKi8wLAorCQlzaXplb2Yoc29ueV9tb19lbnRyaWVzKS9zaXplb2Yoc3RydWN0IGFzY190YWJsZV9lbnRyeSksCisJCS8qc2Vuc2Uga2V5IGVudHJpZXMqL05VTEwsCisJCXNvbnlfbW9fZW50cmllcworCX0KK307CisKK3N0YXRpYyBjb25zdCBpbnQgc2Vuc2VfcXVpcmtfdGFibGVfc2l6ZSA9CisgICAgc2l6ZW9mKHNlbnNlX3F1aXJrX3RhYmxlKS9zaXplb2Yoc2Vuc2VfcXVpcmtfdGFibGVbMF0pOworCitzdGF0aWMgc3RydWN0IGFzY190YWJsZV9lbnRyeSBhc2NfdGFibGVbXSA9IHsKKy8qCisgKiBGcm9tIEZpbGU6IEFTQy1OVU0uVFhUCisgKiBTQ1NJIEFTQy9BU0NRIEFzc2lnbm1lbnRzCisgKiBOdW1lcmljIFNvcnRlZCBMaXN0aW5nCisgKiBhcyBvZiAgNS8xMi85NworICoKKyAqIEQgLSBESVJFQ1QgQUNDRVNTIERFVklDRSAoU0JDKSAgICAgICAgICAgICAgICAgICAgIGRldmljZSBjb2x1bW4ga2V5CisgKiAuVCAtIFNFUVVFTlRJQUwgQUNDRVNTIERFVklDRSAoU1NDKSAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIC4gTCAtIFBSSU5URVIgREVWSUNFIChTU0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmsgPSByZXNlcnZlZAorICogLiAgUCAtIFBST0NFU1NPUiBERVZJQ0UgKFNQQykgICAgICAgICAgICAgICAgICAgICBub3QgYmxhbmsgPSBhbGxvd2VkCisgKiAuICAuVyAtIFdSSVRFIE9OQ0UgUkVBRCBNVUxUSVBMRSBERVZJQ0UgKFNCQykKKyAqIC4gIC4gUiAtIENEIERFVklDRSAoTU1DKQorICogLiAgLiAgUyAtIFNDQU5ORVIgREVWSUNFIChTR0MpCisgKiAuICAuICAuTyAtIE9QVElDQUwgTUVNT1JZIERFVklDRSAoU0JDKQorICogLiAgLiAgLiBNIC0gTUVESUEgQ0hBTkdFUiBERVZJQ0UgKFNNQykKKyAqIC4gIC4gIC4gIEMgLSBDT01NVU5JQ0FUSU9OIERFVklDRSAoU1NDKQorICogLiAgLiAgLiAgLkEgLSBTVE9SQUdFIEFSUkFZIERFVklDRSAoU0NDKQorICogLiAgLiAgLiAgLiBFIC0gRU5DTE9TVVJFIFNFUlZJQ0VTIERFVklDRSAoU0VTKQorICogRFRMUFdSU09NQ0FFICAgICAgICBBU0MgICBBU0NRICBBY3Rpb24gIERlc2NyaXB0aW9uCisgKiAtLS0tLS0tLS0tLS0gICAgICAgIC0tLS0gIC0tLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDAwLCBTU19OT1AsCisJCQkiTm8gYWRkaXRpb25hbCBzZW5zZSBpbmZvcm1hdGlvbiIpIH0sCisvKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDEsIFNTX1JERUYsCisJCQkiRmlsZW1hcmsgZGV0ZWN0ZWQiKSB9LAorLyogIFQgICAgUyAgICAgICove1NTVCgweDAwLCAweDAyLCBTU19SREVGLAorCQkJIkVuZC1vZi1wYXJ0aXRpb24vbWVkaXVtIGRldGVjdGVkIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMCwgMHgwMywgU1NfUkRFRiwKKwkJCSJTZXRtYXJrIGRldGVjdGVkIikgfSwKKy8qICBUICAgIFMgICAgICAqL3tTU1QoMHgwMCwgMHgwNCwgU1NfUkRFRiwKKwkJCSJCZWdpbm5pbmctb2YtcGFydGl0aW9uL21lZGl1bSBkZXRlY3RlZCIpIH0sCisvKiAgVCAgICBTICAgICAgKi97U1NUKDB4MDAsIDB4MDUsIFNTX1JERUYsCisJCQkiRW5kLW9mLWRhdGEgZGV0ZWN0ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDAwLCAweDA2LCBTU19SREVGLAorCQkJIkkvTyBwcm9jZXNzIHRlcm1pbmF0ZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDExLCBTU19GQVRBTHxFQlVTWSwKKwkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTIsIFNTX05PUCwKKwkJCSJBdWRpbyBwbGF5IG9wZXJhdGlvbiBwYXVzZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDEzLCBTU19OT1AsCisJCQkiQXVkaW8gcGxheSBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MDAsIDB4MTQsIFNTX1JERUYsCisJCQkiQXVkaW8gcGxheSBvcGVyYXRpb24gc3RvcHBlZCBkdWUgdG8gZXJyb3IiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDAwLCAweDE1LCBTU19OT1AsCisJCQkiTm8gY3VycmVudCBhdWRpbyBzdGF0dXMgdG8gcmV0dXJuIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwMCwgMHgxNiwgU1NfRkFUQUx8RUJVU1ksCisJCQkiT3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKKy8qIERUTCBXUlNPTSBBRSAqL3tTU1QoMHgwMCwgMHgxNywgU1NfUkRFRiwKKwkJCSJDbGVhbmluZyByZXF1ZXN0ZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDAxLCAweDAwLCBTU19SREVGLAorCQkJIk5vIGluZGV4L3NlY3RvciBzaWduYWwiKSB9LAorLyogRCAgIFdSIE9NICAgICove1NTVCgweDAyLCAweDAwLCBTU19SREVGLAorCQkJIk5vIHNlZWsgY29tcGxldGUiKSB9LAorLyogRFRMIFcgU08gICAgICove1NTVCgweDAzLCAweDAwLCBTU19SREVGLAorCQkJIlBlcmlwaGVyYWwgZGV2aWNlIHdyaXRlIGZhdWx0IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMywgMHgwMSwgU1NfUkRFRiwKKwkJCSJObyB3cml0ZSBjdXJyZW50IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgwMywgMHgwMiwgU1NfUkRFRiwKKwkJCSJFeGNlc3NpdmUgd3JpdGUgZXJyb3JzIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMCwKKwkJCVNTX1RVUnxTU1FfREVMQVl8U1NRX01BTll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxFSU8sCisJCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgY2F1c2Ugbm90IHJlcG9ydGFibGUiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDA0LCAweDAxLAorCQkJU1NfVFVSfFNTUV9ERUxBWXxTU1FfTUFOWXxTU1FfREVDUkVNRU5UX0NPVU5UfEVCVVNZLAorCQkJIkxvZ2ljYWwgdW5pdCBpcyBpbiBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5IikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwMiwgU1NfU1RBUlR8U1NRX0RFQ1JFTUVOVF9DT1VOVHxFTlhJTywKKwkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBpbml0aWFsaXppbmcgY21kLiByZXF1aXJlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MDQsIDB4MDMsIFNTX0ZBVEFMfEVOWElPLAorCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQiKX0sCisvKiBEVEwgICAgTyAgICAgKi97U1NUKDB4MDQsIDB4MDQsIFNTX0ZBVEFMfEVCVVNZLAorCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIGZvcm1hdCBpbiBwcm9ncmVzcyIpIH0sCisvKiBEVCAgVyAgT01DQSAgKi97U1NUKDB4MDQsIDB4MDUsIFNTX0ZBVEFMfEVCVVNZLAorCQkJIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIHJlYnVpbGQgaW4gcHJvZ3Jlc3MiKSB9LAorLyogRFQgIFcgIE9NQ0EgICove1NTVCgweDA0LCAweDA2LCBTU19GQVRBTHxFQlVTWSwKKwkJCSJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCByZWNhbGN1bGF0aW9uIGluIHByb2dyZXNzIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgwNCwgMHgwNywgU1NfRkFUQUx8RUJVU1ksCisJCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgb3BlcmF0aW9uIGluIHByb2dyZXNzIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwNCwgMHgwOCwgU1NfRkFUQUx8RUJVU1ksCisJCQkiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbG9uZyB3cml0ZSBpbiBwcm9ncmVzcyIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDUsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGRvZXMgbm90IHJlc3BvbmQgdG8gc2VsZWN0aW9uIikgfSwKKy8qIEQgICBXUiBPTSAgICAqL3tTU1QoMHgwNiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJObyByZWZlcmVuY2UgcG9zaXRpb24gZm91bmQiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDA3LCAweDAwLCBTU19SREVGLAorCQkJIk11bHRpcGxlIHBlcmlwaGVyYWwgZGV2aWNlcyBzZWxlY3RlZCIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gZmFpbHVyZSIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MDgsIDB4MDEsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gdGltZS1vdXQiKSB9LAorLyogRFRMIFdSU09NQ0FFICove1NTVCgweDA4LCAweDAyLCBTU19SREVGLAorCQkJIkxvZ2ljYWwgdW5pdCBjb21tdW5pY2F0aW9uIHBhcml0eSBlcnJvciIpIH0sCisvKiBEVCAgIFIgT00gICAgKi97U1NUKDB4MDgsIDB4MDMsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGNvbW11bmljYXRpb24gY3JjIGVycm9yICh1bHRyYS1kbWEvMzIpIil9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDA5LCAweDAwLCBTU19SREVGLAorCQkJIlRyYWNrIGZvbGxvd2luZyBlcnJvciIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDEsIFNTX1JERUYsCisJCQkiVHJhY2tpbmcgc2Vydm8gZmFpbHVyZSIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDIsIFNTX1JERUYsCisJCQkiRm9jdXMgc2Vydm8gZmFpbHVyZSIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MDksIDB4MDMsIFNTX1JERUYsCisJCQkiU3BpbmRsZSBzZXJ2byBmYWlsdXJlIikgfSwKKy8qIERUICBXUiBPICAgICAqL3tTU1QoMHgwOSwgMHgwNCwgU1NfUkRFRiwKKwkJCSJIZWFkIHNlbGVjdCBmYXVsdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEEsIDB4MDAsIFNTX0ZBVEFMfEVOT1NQQywKKwkJCSJFcnJvciBsb2cgb3ZlcmZsb3ciKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDBCLCAweDAwLCBTU19SREVGLAorCQkJIldhcm5pbmciKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDBCLCAweDAxLCBTU19SREVGLAorCQkJIlNwZWNpZmllZCB0ZW1wZXJhdHVyZSBleGNlZWRlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MEIsIDB4MDIsIFNTX1JERUYsCisJCQkiRW5jbG9zdXJlIGRlZ3JhZGVkIikgfSwKKy8qICBUICAgUlMgICAgICAqL3tTU1QoMHgwQywgMHgwMCwgU1NfUkRFRiwKKwkJCSJXcml0ZSBlcnJvciIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiV3JpdGUgZXJyb3IgLSByZWNvdmVyZWQgd2l0aCBhdXRvIHJlYWxsb2NhdGlvbiIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDIsIFNTX1JERUYsCisJCQkiV3JpdGUgZXJyb3IgLSBhdXRvIHJlYWxsb2NhdGlvbiBmYWlsZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDBDLCAweDAzLCBTU19SREVGLAorCQkJIldyaXRlIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCisvKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDQsIFNTX1JERUYsCisJCQkiQ29tcHJlc3Npb24gY2hlY2sgbWlzY29tcGFyZSBlcnJvciIpIH0sCisvKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MEMsIDB4MDUsIFNTX1JERUYsCisJCQkiRGF0YSBleHBhbnNpb24gb2NjdXJyZWQgZHVyaW5nIGNvbXByZXNzaW9uIikgfSwKKy8qIERUICBXICBPICAgICAqL3tTU1QoMHgwQywgMHgwNiwgU1NfUkRFRiwKKwkJCSJCbG9jayBub3QgY29tcHJlc3NpYmxlIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHgwQywgMHgwNywgU1NfUkRFRiwKKwkJCSJXcml0ZSBlcnJvciAtIHJlY292ZXJ5IG5lZWRlZCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MEMsIDB4MDgsIFNTX1JERUYsCisJCQkiV3JpdGUgZXJyb3IgLSByZWNvdmVyeSBmYWlsZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDA5LCBTU19SREVGLAorCQkJIldyaXRlIGVycm9yIC0gbG9zcyBvZiBzdHJlYW1pbmciKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDBDLCAweDBBLCBTU19SREVGLAorCQkJIldyaXRlIGVycm9yIC0gcGFkZGluZyBibG9ja3MgYWRkZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDEwLCAweDAwLCBTU19SREVGLAorCQkJIklEIENSQyBvciBFQ0MgZXJyb3IiKSB9LAorLyogRFQgIFdSU08gICAgICove1NTVCgweDExLCAweDAwLCBTU19SREVGLAorCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IiKSB9LAorLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAxLCBTU19SREVGLAorCQkJIlJlYWQgcmV0cmllcyBleGhhdXN0ZWQiKSB9LAorLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAyLCBTU19SREVGLAorCQkJIkVycm9yIHRvbyBsb25nIHRvIGNvcnJlY3QiKSB9LAorLyogRFQgIFcgU08gICAgICove1NTVCgweDExLCAweDAzLCBTU19SREVGLAorCQkJIk11bHRpcGxlIHJlYWQgZXJyb3JzIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwNCwgU1NfUkRFRiwKKwkJCSJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gYXV0byByZWFsbG9jYXRlIGZhaWxlZCIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MTEsIDB4MDUsIFNTX1JERUYsCisJCQkiTC1FQyB1bmNvcnJlY3RhYmxlIGVycm9yIikgfSwKKy8qICAgICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwNiwgU1NfUkRFRiwKKwkJCSJDSVJDIHVucmVjb3ZlcmVkIGVycm9yIikgfSwKKy8qICAgICBXICBPICAgICAqL3tTU1QoMHgxMSwgMHgwNywgU1NfUkRFRiwKKwkJCSJEYXRhIHJlLXN5bmNocm9uaXphdGlvbiBlcnJvciIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTEsIDB4MDgsIFNTX1JERUYsCisJCQkiSW5jb21wbGV0ZSBibG9jayByZWFkIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgxMSwgMHgwOSwgU1NfUkRFRiwKKwkJCSJObyBnYXAgZm91bmQiKSB9LAorLyogRFQgICAgIE8gICAgICove1NTVCgweDExLCAweDBBLCBTU19SREVGLAorCQkJIk1pc2NvcnJlY3RlZCBlcnJvciIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTEsIDB4MEIsIFNTX1JERUYsCisJCQkiVW5yZWNvdmVyZWQgcmVhZCBlcnJvciAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDExLCAweDBDLCBTU19SREVGLAorCQkJIlVucmVjb3ZlcmVkIHJlYWQgZXJyb3IgLSByZWNvbW1lbmQgcmV3cml0ZSB0aGUgZGF0YSIpfSwKKy8qIERUICBXUiBPICAgICAqL3tTU1QoMHgxMSwgMHgwRCwgU1NfUkRFRiwKKwkJCSJEZS1jb21wcmVzc2lvbiBDUkMgZXJyb3IiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDExLCAweDBFLCBTU19SREVGLAorCQkJIkNhbm5vdCBkZWNvbXByZXNzIHVzaW5nIGRlY2xhcmVkIGFsZ29yaXRobSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MEYsIFNTX1JERUYsCisJCQkiRXJyb3IgcmVhZGluZyBVUEMvRUFOIG51bWJlciIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MTAsIFNTX1JERUYsCisJCQkiRXJyb3IgcmVhZGluZyBJU1JDIG51bWJlciIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTEsIDB4MTEsIFNTX1JERUYsCisJCQkiUmVhZCBlcnJvciAtIGxvc3Mgb2Ygc3RyZWFtaW5nIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxMiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBpZCBmaWVsZCIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTMsIDB4MDAsIFNTX1JERUYsCisJCQkiQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCBmb3IgZGF0YSBmaWVsZCIpIH0sCisvKiBEVEwgV1JTTyAgICAgKi97U1NUKDB4MTQsIDB4MDAsIFNTX1JERUYsCisJCQkiUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTQsIDB4MDEsIFNTX1JERUYsCisJCQkiUmVjb3JkIG5vdCBmb3VuZCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDIsIFNTX1JERUYsCisJCQkiRmlsZW1hcmsgb3Igc2V0bWFyayBub3QgZm91bmQiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDE0LCAweDAzLCBTU19SREVGLAorCQkJIkVuZC1vZi1kYXRhIG5vdCBmb3VuZCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MTQsIDB4MDQsIFNTX1JERUYsCisJCQkiQmxvY2sgc2VxdWVuY2UgZXJyb3IiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDE0LCAweDA1LCBTU19SREVGLAorCQkJIlJlY29yZCBub3QgZm91bmQgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50IikgfSwKKy8qIERUICBXICBPICAgICAqL3tTU1QoMHgxNCwgMHgwNiwgU1NfUkRFRiwKKwkJCSJSZWNvcmQgbm90IGZvdW5kIC0gZGF0YSBhdXRvLXJlYWxsb2NhdGVkIikgfSwKKy8qIERUTCBXUlNPTSAgICAqL3tTU1QoMHgxNSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSYW5kb20gcG9zaXRpb25pbmcgZXJyb3IiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDE1LCAweDAxLCBTU19SREVGLAorCQkJIk1lY2hhbmljYWwgcG9zaXRpb25pbmcgZXJyb3IiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDE1LCAweDAyLCBTU19SREVGLAorCQkJIlBvc2l0aW9uaW5nIGVycm9yIGRldGVjdGVkIGJ5IHJlYWQgb2YgbWVkaXVtIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJEYXRhIHN5bmNocm9uaXphdGlvbiBtYXJrIGVycm9yIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNiwgMHgwMSwgU1NfUkRFRiwKKwkJCSJEYXRhIHN5bmMgZXJyb3IgLSBkYXRhIHJld3JpdHRlbiIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDIsIFNTX1JERUYsCisJCQkiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDE2LCAweDAzLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIkRhdGEgc3luYyBlcnJvciAtIGRhdGEgYXV0by1yZWFsbG9jYXRlZCIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTYsIDB4MDQsIFNTX1JERUYsCisJCQkiRGF0YSBzeW5jIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpIH0sCisvKiBEVCAgV1JTTyAgICAgKi97U1NUKDB4MTcsIDB4MDAsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBubyBlcnJvciBjb3JyZWN0aW9uIGFwcGxpZWQiKSB9LAorLyogRFQgIFdSU08gICAgICove1NTVCgweDE3LCAweDAxLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggcmV0cmllcyIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDIsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBwb3NpdGl2ZSBoZWFkIG9mZnNldCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDMsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBuZWdhdGl2ZSBoZWFkIG9mZnNldCIpIH0sCisvKiAgICAgV1IgTyAgICAgKi97U1NUKDB4MTcsIDB4MDQsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCByZXRyaWVzIGFuZC9vciBDSVJDIGFwcGxpZWQiKSB9LAorLyogRCAgIFdSIE8gICAgICove1NTVCgweDE3LCAweDA1LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHVzaW5nIHByZXZpb3VzIHNlY3RvciBpZCIpIH0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MTcsIDB4MDYsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDE3LCAweDA3LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCIpfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwOCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIHJlY29tbWVuZCByZXdyaXRlIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxNywgMHgwOSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSB3aXRob3V0IEVDQyAtIGRhdGEgcmV3cml0dGVuIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxOCwgMHgwMCwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSB3aXRoIGVycm9yIGNvcnJlY3Rpb24gYXBwbGllZCIpIH0sCisvKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDEsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBlcnJvciBjb3JyLiAmIHJldHJpZXMgYXBwbGllZCIpIH0sCisvKiBEICAgV1IgTyAgICAgKi97U1NUKDB4MTgsIDB4MDIsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDE4LCAweDAzLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggQ0lSQyIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MTgsIDB4MDQsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGRhdGEgd2l0aCBMLUVDIikgfSwKKy8qIEQgICBXUiBPICAgICAqL3tTU1QoMHgxOCwgMHgwNSwgU1NfTk9QfFNTUV9QUklOVF9TRU5TRSwKKwkJCSJSZWNvdmVyZWQgZGF0YSAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQiKSB9LAorLyogRCAgIFdSIE8gICAgICove1NTVCgweDE4LCAweDA2LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIC0gcmVjb21tZW5kIHJld3JpdGUiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDE4LCAweDA3LCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlJlY292ZXJlZCBkYXRhIHdpdGggRUNDIC0gZGF0YSByZXdyaXR0ZW4iKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAwLCBTU19SREVGLAorCQkJIkRlZmVjdCBsaXN0IGVycm9yIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxOSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJEZWZlY3QgbGlzdCBub3QgYXZhaWxhYmxlIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxOSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJEZWZlY3QgbGlzdCBlcnJvciBpbiBwcmltYXJ5IGxpc3QiKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDE5LCAweDAzLCBTU19SREVGLAorCQkJIkRlZmVjdCBsaXN0IGVycm9yIGluIGdyb3duIGxpc3QiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDFBLCAweDAwLCBTU19SREVGLAorCQkJIlBhcmFtZXRlciBsaXN0IGxlbmd0aCBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MUIsIDB4MDAsIFNTX1JERUYsCisJCQkiU3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBlcnJvciIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUMsIDB4MDAsIFNTX1JERUYsCisJCQkiRGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHgxQywgMHgwMSwgU1NfUkRFRiwKKwkJCSJQcmltYXJ5IGRlZmVjdCBsaXN0IG5vdCBmb3VuZCIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4MUMsIDB4MDIsIFNTX1JERUYsCisJCQkiR3Jvd24gZGVmZWN0IGxpc3Qgbm90IGZvdW5kIikgfSwKKy8qIEQgICBXICBPICAgICAqL3tTU1QoMHgxRCwgMHgwMCwgU1NfRkFUQUwsCisJCQkiTWlzY29tcGFyZSBkdXJpbmcgdmVyaWZ5IG9wZXJhdGlvbiIgKX0sCisvKiBEICAgVyAgTyAgICAgKi97U1NUKDB4MUUsIDB4MDAsIFNTX05PUHxTU1FfUFJJTlRfU0VOU0UsCisJCQkiUmVjb3ZlcmVkIGlkIHdpdGggZWNjIGNvcnJlY3Rpb24iKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDFGLCAweDAwLCBTU19SREVGLAorCQkJIlBhcnRpYWwgZGVmZWN0IGxpc3QgdHJhbnNmZXIiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDIwLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgyMSwgMHgwMCwgU1NfRkFUQUx8RUlOVkFMLAorCQkJIkxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UiICl9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDIxLCAweDAxLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSW52YWxpZCBlbGVtZW50IGFkZHJlc3MiKSB9LAorLyogRCAgICAgICAgICAgICove1NTVCgweDIyLCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSWxsZWdhbCBmdW5jdGlvbiIpIH0sIC8qIERlcHJlY2F0ZWQuIFVzZSAyMCAwMCwgMjQgMDAsIG9yIDI2IDAwIGluc3RlYWQgKi8KKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNCwgMHgwMCwgU1NfRkFUQUx8RUlOVkFMLAorCQkJIkludmFsaWQgZmllbGQgaW4gQ0RCIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNSwgMHgwMCwgU1NfRkFUQUx8RU5YSU8sCisJCQkiTG9naWNhbCB1bml0IG5vdCBzdXBwb3J0ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI2LCAweDAwLCBTU19GQVRBTHxFSU5WQUwsCisJCQkiSW52YWxpZCBmaWVsZCBpbiBwYXJhbWV0ZXIgbGlzdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDEsIFNTX0ZBVEFMfEVJTlZBTCwKKwkJCSJQYXJhbWV0ZXIgbm90IHN1cHBvcnRlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDIsIFNTX0ZBVEFMfEVJTlZBTCwKKwkJCSJQYXJhbWV0ZXIgdmFsdWUgaW52YWxpZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjYsIDB4MDMsIFNTX0ZBVEFMfEVJTlZBTCwKKwkJCSJUaHJlc2hvbGQgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyNiwgMHgwNCwgU1NfRkFUQUx8RUlOVkFMLAorCQkJIkludmFsaWQgcmVsZWFzZSBvZiBhY3RpdmUgcGVyc2lzdGVudCByZXNlcnZhdGlvbiIpIH0sCisvKiBEVCAgVyAgTyAgICAgKi97U1NUKDB4MjcsIDB4MDAsIFNTX0ZBVEFMfEVBQ0NFUywKKwkJCSJXcml0ZSBwcm90ZWN0ZWQiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDI3LCAweDAxLCBTU19GQVRBTHxFQUNDRVMsCisJCQkiSGFyZHdhcmUgd3JpdGUgcHJvdGVjdGVkIikgfSwKKy8qIERUICBXICBPICAgICAqL3tTU1QoMHgyNywgMHgwMiwgU1NfRkFUQUx8RUFDQ0VTLAorCQkJIkxvZ2ljYWwgdW5pdCBzb2Z0d2FyZSB3cml0ZSBwcm90ZWN0ZWQiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDI3LCAweDAzLCBTU19GQVRBTHxFQUNDRVMsCisJCQkiQXNzb2NpYXRlZCB3cml0ZSBwcm90ZWN0IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgyNywgMHgwNCwgU1NfRkFUQUx8RUFDQ0VTLAorCQkJIlBlcnNpc3RlbnQgd3JpdGUgcHJvdGVjdCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4MjcsIDB4MDUsIFNTX0ZBVEFMfEVBQ0NFUywKKwkJCSJQZXJtYW5lbnQgd3JpdGUgcHJvdGVjdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjgsIDB4MDAsIFNTX1JERUYsCisJCQkiTm90IHJlYWR5IHRvIHJlYWR5IGNoYW5nZSwgbWVkaXVtIG1heSBoYXZlIGNoYW5nZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI4LCAweDAxLCBTU19GQVRBTHxFTlhJTywKKwkJCSJJbXBvcnQgb3IgZXhwb3J0IGVsZW1lbnQgYWNjZXNzZWQiKSB9LAorLyoKKyAqIFhYWCBKR2liYnMgLSBBbGwgb2YgdGhlc2Ugc2hvdWxkIHVzZSB0aGUgc2FtZSBlcnJubywgYnV0IEkgZG9uJ3QgdGhpbmsKKyAqIEVOWElPIGlzIHRoZSBjb3JyZWN0IGNob2ljZS4gIFNob3VsZCB3ZSBib3Jyb3cgZnJvbSB0aGUgbmV0d29ya2luZworICogZXJybm9zPyAgRUNPTk5SRVNFVCBhbnlvbmU/CisgKi8KKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJQb3dlciBvbiwgcmVzZXQsIG9yIGJ1cyBkZXZpY2UgcmVzZXQgb2NjdXJyZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDI5LCAweDAxLCBTU19SREVGLAorCQkJIlBvd2VyIG9uIG9jY3VycmVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJTY3NpIGJ1cyByZXNldCBvY2N1cnJlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDMsIFNTX1JERUYsCisJCQkiQnVzIGRldmljZSByZXNldCBmdW5jdGlvbiBvY2N1cnJlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MjksIDB4MDQsIFNTX1JERUYsCisJCQkiRGV2aWNlIGludGVybmFsIHJlc2V0IikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNSwgU1NfUkRFRiwKKwkJCSJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gc2luZ2xlLWVuZGVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyOSwgMHgwNiwgU1NfUkRFRiwKKwkJCSJUcmFuc2NlaXZlciBtb2RlIGNoYW5nZWQgdG8gTFZEIikgfSwKKy8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJQYXJhbWV0ZXJzIGNoYW5nZWQiKSB9LAorLyogRFRMIFdSU09NQ0FFICove1NTVCgweDJBLCAweDAxLCBTU19SREVGLAorCQkJIk1vZGUgcGFyYW1ldGVycyBjaGFuZ2VkIikgfSwKKy8qIERUTCBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJMb2cgcGFyYW1ldGVycyBjaGFuZ2VkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyQSwgMHgwMywgU1NfUkRFRiwKKwkJCSJSZXNlcnZhdGlvbnMgcHJlZW1wdGVkIikgfSwKKy8qIERUTFBXUlNPIEMgICAqL3tTU1QoMHgyQiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDb3B5IGNhbm5vdCBleGVjdXRlIHNpbmNlIGhvc3QgY2Fubm90IGRpc2Nvbm5lY3QiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDJDLCAweDAwLCBTU19SREVGLAorCQkJIkNvbW1hbmQgc2VxdWVuY2UgZXJyb3IiKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDJDLCAweDAxLCBTU19SREVGLAorCQkJIlRvbyBtYW55IHdpbmRvd3Mgc3BlY2lmaWVkIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHgyQywgMHgwMiwgU1NfUkRFRiwKKwkJCSJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHdpbmRvd3Mgc3BlY2lmaWVkIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHgyQywgMHgwMywgU1NfUkRFRiwKKwkJCSJDdXJyZW50IHByb2dyYW0gYXJlYSBpcyBub3QgZW1wdHkiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDJDLCAweDA0LCBTU19SREVGLAorCQkJIkN1cnJlbnQgcHJvZ3JhbSBhcmVhIGlzIGVtcHR5IikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgyRCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJPdmVyd3JpdGUgZXJyb3Igb24gdXBkYXRlIGluIHBsYWNlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgyRiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDb21tYW5kcyBjbGVhcmVkIGJ5IGFub3RoZXIgaW5pdGlhdG9yIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzMCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJJbmNvbXBhdGlibGUgbWVkaXVtIGluc3RhbGxlZCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDEsIFNTX1JERUYsCisJCQkiQ2Fubm90IHJlYWQgbWVkaXVtIC0gdW5rbm93biBmb3JtYXQiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDMwLCAweDAyLCBTU19SREVGLAorCQkJIkNhbm5vdCByZWFkIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiKSB9LAorLyogRFQgICAgICAgICAgICove1NTVCgweDMwLCAweDAzLCBTU19SREVGLAorCQkJIkNsZWFuaW5nIGNhcnRyaWRnZSBpbnN0YWxsZWQiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDMwLCAweDA0LCBTU19SREVGLAorCQkJIkNhbm5vdCB3cml0ZSBtZWRpdW0gLSB1bmtub3duIGZvcm1hdCIpIH0sCisvKiBEVCAgV1IgTyAgICAgKi97U1NUKDB4MzAsIDB4MDUsIFNTX1JERUYsCisJCQkiQ2Fubm90IHdyaXRlIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDMwLCAweDA2LCBTU19SREVGLAorCQkJIkNhbm5vdCBmb3JtYXQgbWVkaXVtIC0gaW5jb21wYXRpYmxlIG1lZGl1bSIpIH0sCisvKiBEVEwgV1JTT00gQUUgKi97U1NUKDB4MzAsIDB4MDcsIFNTX1JERUYsCisJCQkiQ2xlYW5pbmcgZmFpbHVyZSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MzAsIDB4MDgsIFNTX1JERUYsCisJCQkiQ2Fubm90IHdyaXRlIC0gYXBwbGljYXRpb24gY29kZSBtaXNtYXRjaCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4MzAsIDB4MDksIFNTX1JERUYsCisJCQkiQ3VycmVudCBzZXNzaW9uIG5vdCBmaXhhdGVkIGZvciBhcHBlbmQiKSB9LAorLyogRFQgIFdSIE8gICAgICove1NTVCgweDMxLCAweDAwLCBTU19SREVGLAorCQkJIk1lZGl1bSBmb3JtYXQgY29ycnVwdGVkIikgfSwKKy8qIEQgTCAgUiBPICAgICAqL3tTU1QoMHgzMSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJGb3JtYXQgY29tbWFuZCBmYWlsZWQiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDMyLCAweDAwLCBTU19SREVGLAorCQkJIk5vIGRlZmVjdCBzcGFyZSBsb2NhdGlvbiBhdmFpbGFibGUiKSB9LAorLyogRCAgIFcgIE8gICAgICove1NTVCgweDMyLCAweDAxLCBTU19SREVGLAorCQkJIkRlZmVjdCBsaXN0IHVwZGF0ZSBmYWlsdXJlIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgzMywgMHgwMCwgU1NfUkRFRiwKKwkJCSJUYXBlIGxlbmd0aCBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzQsIDB4MDAsIFNTX1JERUYsCisJCQkiRW5jbG9zdXJlIGZhaWx1cmUiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAwLCBTU19SREVGLAorCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyBmYWlsdXJlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzNSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJVbnN1cHBvcnRlZCBlbmNsb3N1cmUgZnVuY3Rpb24iKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDAyLCBTU19SREVGLAorCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyB1bmF2YWlsYWJsZSIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4MzUsIDB4MDMsIFNTX1JERUYsCisJCQkiRW5jbG9zdXJlIHNlcnZpY2VzIHRyYW5zZmVyIGZhaWx1cmUiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDM1LCAweDA0LCBTU19SREVGLAorCQkJIkVuY2xvc3VyZSBzZXJ2aWNlcyB0cmFuc2ZlciByZWZ1c2VkIikgfSwKKy8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzNiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSaWJib24sIGluaywgb3IgdG9uZXIgZmFpbHVyZSIpIH0sCisvKiBEVEwgV1JTT01DQUUgKi97U1NUKDB4MzcsIDB4MDAsIFNTX1JERUYsCisJCQkiUm91bmRlZCBwYXJhbWV0ZXIiKSB9LAorLyogRFRMIFdSU09NQ0FFICove1NTVCgweDM5LCAweDAwLCBTU19SREVGLAorCQkJIlNhdmluZyBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDNBLCAweDAwLCBTU19OT1AsCisJCQkiTWVkaXVtIG5vdCBwcmVzZW50IikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMSwgU1NfTk9QLAorCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgY2xvc2VkIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQSwgMHgwMSwgU1NfTk9QLAorCQkJIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgb3BlbiIpIH0sCisvKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4MDMsIFNTX05PUCwKKwkJCSJNZWRpdW0gbm90IHByZXNlbnQgLSBMb2FkYWJsZSIpIH0sCisvKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4MDQsIFNTX05PUCwKKwkJCSJNZWRpdW0gbm90IHByZXNlbnQgLSBtZWRpdW0gYXV4aWxpYXJ5ICIKKwkJCSJtZW1vcnkgYWNjZXNzaWJsZSIpIH0sCisvKiBEVCAgV1IgT00gICAgKi97U1NUKDB4M0EsIDB4RkYsIFNTX05PUCwgTlVMTCkgfSwvKiBSYW5nZSAweDA1LT4weEZGICovCisvKiAgVEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDAsIFNTX1JERUYsCisJCQkiU2VxdWVudGlhbCBwb3NpdGlvbmluZyBlcnJvciIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDEsIFNTX1JERUYsCisJCQkiVGFwZSBwb3NpdGlvbiBlcnJvciBhdCBiZWdpbm5pbmctb2YtbWVkaXVtIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwMiwgU1NfUkRFRiwKKwkJCSJUYXBlIHBvc2l0aW9uIGVycm9yIGF0IGVuZC1vZi1tZWRpdW0iKSB9LAorLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDAzLCBTU19SREVGLAorCQkJIlRhcGUgb3IgZWxlY3Ryb25pYyB2ZXJ0aWNhbCBmb3JtcyB1bml0IG5vdCByZWFkeSIpIH0sCisvKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDQsIFNTX1JERUYsCisJCQkiU2xldyBmYWlsdXJlIikgfSwKKy8qICAgTCAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwNSwgU1NfUkRFRiwKKwkJCSJQYXBlciBqYW0iKSB9LAorLyogICBMICAgICAgICAgICove1NTVCgweDNCLCAweDA2LCBTU19SREVGLAorCQkJIkZhaWxlZCB0byBzZW5zZSB0b3Atb2YtZm9ybSIpIH0sCisvKiAgIEwgICAgICAgICAgKi97U1NUKDB4M0IsIDB4MDcsIFNTX1JERUYsCisJCQkiRmFpbGVkIHRvIHNlbnNlIGJvdHRvbS1vZi1mb3JtIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHgzQiwgMHgwOCwgU1NfUkRFRiwKKwkJCSJSZXBvc2l0aW9uIGVycm9yIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHgzQiwgMHgwOSwgU1NfUkRFRiwKKwkJCSJSZWFkIHBhc3QgZW5kIG9mIG1lZGl1bSIpIH0sCisvKiAgICAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEEsIFNTX1JERUYsCisJCQkiUmVhZCBwYXN0IGJlZ2lubmluZyBvZiBtZWRpdW0iKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDNCLCAweDBCLCBTU19SREVGLAorCQkJIlBvc2l0aW9uIHBhc3QgZW5kIG9mIG1lZGl1bSIpIH0sCisvKiAgVCAgICBTICAgICAgKi97U1NUKDB4M0IsIDB4MEMsIFNTX1JERUYsCisJCQkiUG9zaXRpb24gcGFzdCBiZWdpbm5pbmcgb2YgbWVkaXVtIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgwRCwgU1NfRkFUQUx8RU5PU1BDLAorCQkJIk1lZGl1bSBkZXN0aW5hdGlvbiBlbGVtZW50IGZ1bGwiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDBFLCBTU19SREVGLAorCQkJIk1lZGl1bSBzb3VyY2UgZWxlbWVudCBlbXB0eSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4M0IsIDB4MEYsIFNTX1JERUYsCisJCQkiRW5kIG9mIG1lZGl1bSByZWFjaGVkIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgxMSwgU1NfUkRFRiwKKwkJCSJNZWRpdW0gbWFnYXppbmUgbm90IGFjY2Vzc2libGUiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDEyLCBTU19SREVGLAorCQkJIk1lZGl1bSBtYWdhemluZSByZW1vdmVkIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHgzQiwgMHgxMywgU1NfUkRFRiwKKwkJCSJNZWRpdW0gbWFnYXppbmUgaW5zZXJ0ZWQiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDE0LCBTU19SREVGLAorCQkJIk1lZGl1bSBtYWdhemluZSBsb2NrZWQiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDNCLCAweDE1LCBTU19SREVGLAorCQkJIk1lZGl1bSBtYWdhemluZSB1bmxvY2tlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0QsIDB4MDAsIFNTX1JERUYsCisJCQkiSW52YWxpZCBiaXRzIGluIGlkZW50aWZ5IG1lc3NhZ2UiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAwLCBTU19SREVGLAorCQkJIkxvZ2ljYWwgdW5pdCBoYXMgbm90IHNlbGYtY29uZmlndXJlZCB5ZXQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNFLCAweDAxLCBTU19SREVGLAorCQkJIkxvZ2ljYWwgdW5pdCBmYWlsdXJlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRSwgMHgwMiwgU1NfUkRFRiwKKwkJCSJUaW1lb3V0IG9uIGxvZ2ljYWwgdW5pdCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDAsIFNTX1JERUYsCisJCQkiVGFyZ2V0IG9wZXJhdGluZyBjb25kaXRpb25zIGhhdmUgY2hhbmdlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MDEsIFNTX1JERUYsCisJCQkiTWljcm9jb2RlIGhhcyBiZWVuIGNoYW5nZWQiKSB9LAorLyogRFRMUFdSU09NQyAgICove1NTVCgweDNGLCAweDAyLCBTU19SREVGLAorCQkJIkNoYW5nZWQgb3BlcmF0aW5nIGRlZmluaXRpb24iKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDNGLCAweDAzLCBTU19JTlFfUkVGUkVTSHxTU1FfREVDUkVNRU5UX0NPVU5ULAorCQkJIklucXVpcnkgZGF0YSBoYXMgY2hhbmdlZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDQsIFNTX1JERUYsCisJCQkiQ29tcG9uZW50IGRldmljZSBhdHRhY2hlZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDUsIFNTX1JERUYsCisJCQkiRGV2aWNlIGlkZW50aWZpZXIgY2hhbmdlZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MDYsIFNTX1JERUYsCisJCQkiUmVkdW5kYW5jeSBncm91cCBjcmVhdGVkIG9yIG1vZGlmaWVkIikgfSwKKy8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwNywgU1NfUkRFRiwKKwkJCSJSZWR1bmRhbmN5IGdyb3VwIGRlbGV0ZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA4LCBTU19SREVGLAorCQkJIlNwYXJlIGNyZWF0ZWQgb3IgbW9kaWZpZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDA5LCBTU19SREVGLAorCQkJIlNwYXJlIGRlbGV0ZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBBLCBTU19SREVGLAorCQkJIlZvbHVtZSBzZXQgY3JlYXRlZCBvciBtb2RpZmllZCIpIH0sCisvKiBEVCAgV1IgT01DQUUgKi97U1NUKDB4M0YsIDB4MEIsIFNTX1JERUYsCisJCQkiVm9sdW1lIHNldCBkZWxldGVkIikgfSwKKy8qIERUICBXUiBPTUNBRSAqL3tTU1QoMHgzRiwgMHgwQywgU1NfUkRFRiwKKwkJCSJWb2x1bWUgc2V0IGRlYXNzaWduZWQiKSB9LAorLyogRFQgIFdSIE9NQ0FFICove1NTVCgweDNGLCAweDBELCBTU19SREVGLAorCQkJIlZvbHVtZSBzZXQgcmVhc3NpZ25lZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4M0YsIDB4MEUsIFNTX1JERUYsCisJCQkiUmVwb3J0ZWQgbHVucyBkYXRhIGhhcyBjaGFuZ2VkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHgzRiwgMHgwRiwgU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVAorCQkJCSB8IFNTUV9ERUxBWV9SQU5ET018RUJVU1ksCisJCQkiRWNobyBidWZmZXIgb3ZlcndyaXR0ZW4iKSB9LAorLyogRFQgIFdSIE9NICAgQiove1NTVCgweDNGLCAweDBGLCBTU19SREVGLCAiTWVkaXVtIExvYWRhYmxlIikgfSwKKy8qIERUICBXUiBPTSAgIEIqL3tTU1QoMHgzRiwgMHgwRiwgU1NfUkRFRiwKKwkJCSJNZWRpdW0gYXV4aWxpYXJ5IG1lbW9yeSBhY2Nlc3NpYmxlIikgfSwKKy8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSYW0gZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLworLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQwLCAweDgwLCBTU19SREVGLAorCQkJIkRpYWdub3N0aWMgZmFpbHVyZTogQVNDUSA9IENvbXBvbmVudCBJRCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDAsIDB4RkYsIFNTX1JERUZ8U1NRX1JBTkdFLAorCQkJTlVMTCkgfSwvKiBSYW5nZSAweDgwLT4weEZGICovCisvKiBEICAgICAgICAgICAgKi97U1NUKDB4NDEsIDB4MDAsIFNTX1JERUYsCisJCQkiRGF0YSBwYXRoIGZhaWx1cmUiKSB9LCAvKiBkZXByZWNhdGVkIC0gdXNlIDQwIE5OIGluc3RlYWQgKi8KKy8qIEQgICAgICAgICAgICAqL3tTU1QoMHg0MiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJQb3dlci1vbiBvciBzZWxmLXRlc3QgZmFpbHVyZSIpIH0sIC8qIGRlcHJlY2F0ZWQgLSB1c2UgNDAgTk4gaW5zdGVhZCAqLworLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQzLCAweDAwLCBTU19SREVGLAorCQkJIk1lc3NhZ2UgZXJyb3IiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ0LCAweDAwLCBTU19SREVGLAorCQkJIkludGVybmFsIHRhcmdldCBmYWlsdXJlIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJTZWxlY3Qgb3IgcmVzZWxlY3QgZmFpbHVyZSIpIH0sCisvKiBEVExQV1JTT01DICAgKi97U1NUKDB4NDYsIDB4MDAsIFNTX1JERUYsCisJCQkiVW5zdWNjZXNzZnVsIHNvZnQgcmVzZXQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAwLCBTU19SREVGfFNTUV9GQUxMQkFDSywKKwkJCSJTQ1NJIHBhcml0eSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NDcsIDB4MDEsIFNTX1JERUZ8U1NRX0ZBTExCQUNLLAorCQkJIkRhdGEgUGhhc2UgQ1JDIGVycm9yIGRldGVjdGVkIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwMiwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCisJCQkiU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIFNUIGRhdGEgcGhhc2UiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDAzLCBTU19SREVGfFNTUV9GQUxMQkFDSywKKwkJCSJJbmZvcm1hdGlvbiBVbml0IGl1Q1JDIGVycm9yIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0NywgMHgwNCwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCisJCQkiQXN5bmNocm9ub3VzIGluZm9ybWF0aW9uIHByb3RlY3Rpb24gZXJyb3IgZGV0ZWN0ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ3LCAweDA1LCBTU19SREVGfFNTUV9GQUxMQkFDSywKKwkJCSJQcm90b2NvbCBzZXJ2ZXIgQ1JDIGVycm9yIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0OCwgMHgwMCwgU1NfUkRFRnxTU1FfRkFMTEJBQ0ssCisJCQkiSW5pdGlhdG9yIGRldGVjdGVkIGVycm9yIG1lc3NhZ2UgcmVjZWl2ZWQiKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDQ5LCAweDAwLCBTU19SREVGLAorCQkJIkludmFsaWQgbWVzc2FnZSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEEsIDB4MDAsIFNTX1JERUYsCisJCQkiQ29tbWFuZCBwaGFzZSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEIsIDB4MDAsIFNTX1JERUYsCisJCQkiRGF0YSBwaGFzZSBlcnJvciIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NEMsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9naWNhbCB1bml0IGZhaWxlZCBzZWxmLWNvbmZpZ3VyYXRpb24iKSB9LAorLyogRFRMUFdSU09NQ0FFICove1NTVCgweDRELCAweDAwLCBTU19SREVGLAorCQkJIlRhZ2dlZCBvdmVybGFwcGVkIGNvbW1hbmRzOiBBU0NRID0gUXVldWUgdGFnIElEIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0RCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCisJCQlOVUxMKX0sIC8qIFJhbmdlIDB4MDAtPjB4RkYgKi8KKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg0RSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJPdmVybGFwcGVkIGNvbW1hbmRzIGF0dGVtcHRlZCIpIH0sCisvKiAgVCAgICAgICAgICAgKi97U1NUKDB4NTAsIDB4MDAsIFNTX1JERUYsCisJCQkiV3JpdGUgYXBwZW5kIGVycm9yIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MCwgMHgwMSwgU1NfUkRFRiwKKwkJCSJXcml0ZSBhcHBlbmQgcG9zaXRpb24gZXJyb3IiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDUwLCAweDAyLCBTU19SREVGLAorCQkJIlBvc2l0aW9uIGVycm9yIHJlbGF0ZWQgdG8gdGltaW5nIikgfSwKKy8qICBUICAgICBPICAgICAqL3tTU1QoMHg1MSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJFcmFzZSBmYWlsdXJlIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDYXJ0cmlkZ2UgZmF1bHQiKSB9LAorLyogRFRMIFdSU09NICAgICove1NTVCgweDUzLCAweDAwLCBTU19SREVGLAorCQkJIk1lZGlhIGxvYWQgb3IgZWplY3QgZmFpbGVkIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg1MywgMHgwMSwgU1NfUkRFRiwKKwkJCSJVbmxvYWQgdGFwZSBmYWlsdXJlIikgfSwKKy8qIERUICBXUiBPTSAgICAqL3tTU1QoMHg1MywgMHgwMiwgU1NfUkRFRiwKKwkJCSJNZWRpdW0gcmVtb3ZhbCBwcmV2ZW50ZWQiKSB9LAorLyogICAgUCAgICAgICAgICove1NTVCgweDU0LCAweDAwLCBTU19SREVGLAorCQkJIlNjc2kgdG8gaG9zdCBzeXN0ZW0gaW50ZXJmYWNlIGZhaWx1cmUiKSB9LAorLyogICAgUCAgICAgICAgICove1NTVCgweDU1LCAweDAwLCBTU19SREVGLAorCQkJIlN5c3RlbSByZXNvdXJjZSBmYWlsdXJlIikgfSwKKy8qIEQgICAgICBPICAgICAqL3tTU1QoMHg1NSwgMHgwMSwgU1NfRkFUQUx8RU5PU1BDLAorCQkJIlN5c3RlbSBidWZmZXIgZnVsbCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NTcsIDB4MDAsIFNTX1JERUYsCisJCQkiVW5hYmxlIHRvIHJlY292ZXIgdGFibGUtb2YtY29udGVudHMiKSB9LAorLyogICAgICAgIE8gICAgICove1NTVCgweDU4LCAweDAwLCBTU19SREVGLAorCQkJIkdlbmVyYXRpb24gZG9lcyBub3QgZXhpc3QiKSB9LAorLyogICAgICAgIE8gICAgICove1NTVCgweDU5LCAweDAwLCBTU19SREVGLAorCQkJIlVwZGF0ZWQgYmxvY2sgcmVhZCIpIH0sCisvKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUEsIDB4MDAsIFNTX1JERUYsCisJCQkiT3BlcmF0b3IgcmVxdWVzdCBvciBzdGF0ZSBjaGFuZ2UgaW5wdXQiKSB9LAorLyogRFQgIFdSIE9NICAgICove1NTVCgweDVBLCAweDAxLCBTU19SREVGLAorCQkJIk9wZXJhdG9yIG1lZGl1bSByZW1vdmFsIHJlcXVlc3QiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDVBLCAweDAyLCBTU19SREVGLAorCQkJIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHByb3RlY3QiKSB9LAorLyogRFQgIFcgIE8gICAgICove1NTVCgweDVBLCAweDAzLCBTU19SREVGLAorCQkJIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHBlcm1pdCIpIH0sCisvKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDAsIFNTX1JERUYsCisJCQkiTG9nIGV4Y2VwdGlvbiIpIH0sCisvKiBEVExQV1JTT00gICAgKi97U1NUKDB4NUIsIDB4MDEsIFNTX1JERUYsCisJCQkiVGhyZXNob2xkIGNvbmRpdGlvbiBtZXQiKSB9LAorLyogRFRMUFdSU09NICAgICove1NTVCgweDVCLCAweDAyLCBTU19SREVGLAorCQkJIkxvZyBjb3VudGVyIGF0IG1heGltdW0iKSB9LAorLyogRFRMUFdSU09NICAgICove1NTVCgweDVCLCAweDAzLCBTU19SREVGLAorCQkJIkxvZyBsaXN0IGNvZGVzIGV4aGF1c3RlZCIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDAsIFNTX1JERUYsCisJCQkiUlBMIHN0YXR1cyBjaGFuZ2UiKSB9LAorLyogRCAgICAgIE8gICAgICove1NTVCgweDVDLCAweDAxLCBTU19OT1B8U1NRX1BSSU5UX1NFTlNFLAorCQkJIlNwaW5kbGVzIHN5bmNocm9uaXplZCIpIH0sCisvKiBEICAgICAgTyAgICAgKi97U1NUKDB4NUMsIDB4MDIsIFNTX1JERUYsCisJCQkiU3BpbmRsZXMgbm90IHN5bmNocm9uaXplZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NUQsIDB4MDAsIFNTX1JERUYsCisJCQkiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCIpIH0sCisvKiBEVExQV1JTT01DQUUgKi97U1NUKDB4NUQsIDB4RkYsIFNTX1JERUYsCisJCQkiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCAoZmFsc2UpIikgfSwKKy8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJMb3cgcG93ZXIgY29uZGl0aW9uIG9uIikgfSwKKy8qIERUTFBXUlNPIENBICAqL3tTU1QoMHg1RSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJJZGxlIGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgdGltZXIiKSB9LAorLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDAyLCBTU19SREVGLAorCQkJIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSB0aW1lciIpIH0sCisvKiBEVExQV1JTTyBDQSAgKi97U1NUKDB4NUUsIDB4MDMsIFNTX1JERUYsCisJCQkiSWRsZSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IGNvbW1hbmQiKSB9LAorLyogRFRMUFdSU08gQ0EgICove1NTVCgweDVFLCAweDA0LCBTU19SREVGLAorCQkJIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSBjb21tYW5kIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJMYW1wIGZhaWx1cmUiKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDYxLCAweDAwLCBTU19SREVGLAorCQkJIlZpZGVvIGFjcXVpc2l0aW9uIGVycm9yIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MSwgMHgwMSwgU1NfUkRFRiwKKwkJCSJVbmFibGUgdG8gYWNxdWlyZSB2aWRlbyIpIH0sCisvKiAgICAgICBTICAgICAgKi97U1NUKDB4NjEsIDB4MDIsIFNTX1JERUYsCisJCQkiT3V0IG9mIGZvY3VzIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2MiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJTY2FuIGhlYWQgcG9zaXRpb25pbmcgZXJyb3IiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDYzLCAweDAwLCBTU19SREVGLAorCQkJIkVuZCBvZiB1c2VyIGFyZWEgZW5jb3VudGVyZWQgb24gdGhpcyB0cmFjayIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjMsIDB4MDEsIFNTX0ZBVEFMfEVOT1NQQywKKwkJCSJQYWNrZXQgZG9lcyBub3QgZml0IGluIGF2YWlsYWJsZSBzcGFjZSIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NjQsIDB4MDAsIFNTX1JERUYsCisJCQkiSWxsZWdhbCBtb2RlIGZvciB0aGlzIHRyYWNrIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg2NCwgMHgwMSwgU1NfUkRFRiwKKwkJCSJJbnZhbGlkIHBhY2tldCBzaXplIikgfSwKKy8qIERUTFBXUlNPTUNBRSAqL3tTU1QoMHg2NSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJWb2x0YWdlIGZhdWx0IikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMCwgU1NfUkRFRiwKKwkJCSJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGNvdmVyIHVwIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMSwgU1NfUkRFRiwKKwkJCSJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGxpZnQgdXAiKSB9LAorLyogICAgICAgUyAgICAgICove1NTVCgweDY2LCAweDAyLCBTU19SREVGLAorCQkJIkRvY3VtZW50IGphbSBpbiBhdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIikgfSwKKy8qICAgICAgIFMgICAgICAqL3tTU1QoMHg2NiwgMHgwMywgU1NfUkRFRiwKKwkJCSJEb2N1bWVudCBtaXNzIGZlZWQgYXV0b21hdGljIGluIGRvY3VtZW50IGZlZWRlciIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDAsIFNTX1JERUYsCisJCQkiQ29uZmlndXJhdGlvbiBmYWlsdXJlIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwMSwgU1NfUkRFRiwKKwkJCSJDb25maWd1cmF0aW9uIG9mIGluY2FwYWJsZSBsb2dpY2FsIHVuaXRzIGZhaWxlZCIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDIsIFNTX1JERUYsCisJCQkiQWRkIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDY3LCAweDAzLCBTU19SREVGLAorCQkJIk1vZGlmaWNhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNCwgU1NfUkRFRiwKKwkJCSJFeGNoYW5nZSBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNSwgU1NfUkRFRiwKKwkJCSJSZW1vdmUgb2YgbG9naWNhbCB1bml0IGZhaWxlZCIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjcsIDB4MDYsIFNTX1JERUYsCisJCQkiQXR0YWNobWVudCBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2NywgMHgwNywgU1NfUkRFRiwKKwkJCSJDcmVhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2OCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJMb2dpY2FsIHVuaXQgbm90IGNvbmZpZ3VyZWQiKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDY5LCAweDAwLCBTU19SREVGLAorCQkJIkRhdGEgbG9zcyBvbiBsb2dpY2FsIHVuaXQiKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDY5LCAweDAxLCBTU19SREVGLAorCQkJIk11bHRpcGxlIGxvZ2ljYWwgdW5pdCBmYWlsdXJlcyIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NjksIDB4MDIsIFNTX1JERUYsCisJCQkiUGFyaXR5L2RhdGEgbWlzbWF0Y2giKSB9LAorLyogICAgICAgICAgIEEgICove1NTVCgweDZBLCAweDAwLCBTU19SREVGLAorCQkJIkluZm9ybWF0aW9uYWwsIHJlZmVyIHRvIGxvZyIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkIsIDB4MDAsIFNTX1JERUYsCisJCQkiU3RhdGUgY2hhbmdlIGhhcyBvY2N1cnJlZCIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkIsIDB4MDEsIFNTX1JERUYsCisJCQkiUmVkdW5kYW5jeSBsZXZlbCBnb3QgYmV0dGVyIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2QiwgMHgwMiwgU1NfUkRFRiwKKwkJCSJSZWR1bmRhbmN5IGxldmVsIGdvdCB3b3JzZSIpIH0sCisvKiAgICAgICAgICAgQSAgKi97U1NUKDB4NkMsIDB4MDAsIFNTX1JERUYsCisJCQkiUmVidWlsZCBmYWlsdXJlIG9jY3VycmVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2RCwgMHgwMCwgU1NfUkRFRiwKKwkJCSJSZWNhbGN1bGF0ZSBmYWlsdXJlIG9jY3VycmVkIikgfSwKKy8qICAgICAgICAgICBBICAqL3tTU1QoMHg2RSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJDb21tYW5kIHRvIGxvZ2ljYWwgdW5pdCBmYWlsZWQiKSB9LAorLyogIFQgICAgICAgICAgICove1NTVCgweDcwLCAweDAwLCBTU19SREVGLAorCQkJIkRlY29tcHJlc3Npb24gZXhjZXB0aW9uIHNob3J0OiBBU0NRID0gQWxnb3JpdGhtIElEIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MCwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCisJCQlOVUxMKSB9LCAvKiBSYW5nZSAweDAwIC0+IDB4RkYgKi8KKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MSwgMHgwMCwgU1NfUkRFRiwKKwkJCSJEZWNvbXByZXNzaW9uIGV4Y2VwdGlvbiBsb25nOiBBU0NRID0gQWxnb3JpdGhtIElEIikgfSwKKy8qICBUICAgICAgICAgICAqL3tTU1QoMHg3MSwgMHhGRiwgU1NfUkRFRnxTU1FfUkFOR0UsCisJCQlOVUxMKSB9LCAvKiBSYW5nZSAweDAwIC0+IDB4RkYgKi8JCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDAsIFNTX1JERUYsCisJCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDEsIFNTX1JERUYsCisJCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciB3cml0aW5nIGxlYWQtaW4iKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDcyLCAweDAyLCBTU19SREVGLAorCQkJIlNlc3Npb24gZml4YXRpb24gZXJyb3Igd3JpdGluZyBsZWFkLW91dCIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDMsIFNTX1JERUYsCisJCQkiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciAtIGluY29tcGxldGUgdHJhY2sgaW4gc2Vzc2lvbiIpIH0sCisvKiAgICAgIFIgICAgICAgKi97U1NUKDB4NzIsIDB4MDQsIFNTX1JERUYsCisJCQkiRW1wdHkgb3IgcGFydGlhbGx5IHdyaXR0ZW4gcmVzZXJ2ZWQgdHJhY2siKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAwLCBTU19SREVGLAorCQkJIkNEIGNvbnRyb2wgZXJyb3IiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAxLCBTU19SREVGLAorCQkJIlBvd2VyIGNhbGlicmF0aW9uIGFyZWEgYWxtb3N0IGZ1bGwiKSB9LAorLyogICAgICBSICAgICAgICove1NTVCgweDczLCAweDAyLCBTU19GQVRBTHxFTk9TUEMsCisJCQkiUG93ZXIgY2FsaWJyYXRpb24gYXJlYSBpcyBmdWxsIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwMywgU1NfUkRFRiwKKwkJCSJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGVycm9yIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwNCwgU1NfUkRFRiwKKwkJCSJQcm9ncmFtIG1lbW9yeSBhcmVhIHVwZGF0ZSBmYWlsdXJlIikgfSwKKy8qICAgICAgUiAgICAgICAqL3tTU1QoMHg3MywgMHgwNSwgU1NfUkRFRiwKKwkJCSJwcm9ncmFtIG1lbW9yeSBhcmVhIGlzIGZ1bGwiKSB9Cit9OworCitzdGF0aWMgY29uc3QgaW50IGFzY190YWJsZV9zaXplID0gc2l6ZW9mKGFzY190YWJsZSkvc2l6ZW9mKGFzY190YWJsZVswXSk7CisKK3N0cnVjdCBhc2Nfa2V5Cit7CisJaW50IGFzYzsKKwlpbnQgYXNjcTsKK307CisKK3N0YXRpYyBpbnQKK2FzY2VudHJ5Y29tcChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKm1lbWJlcikKK3sKKwlpbnQgYXNjOworCWludCBhc2NxOworCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKnRhYmxlX2VudHJ5OworCisJYXNjID0gKChjb25zdCBzdHJ1Y3QgYXNjX2tleSAqKWtleSktPmFzYzsKKwlhc2NxID0gKChjb25zdCBzdHJ1Y3QgYXNjX2tleSAqKWtleSktPmFzY3E7CisJdGFibGVfZW50cnkgPSAoY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqKW1lbWJlcjsKKworCWlmIChhc2MgPj0gdGFibGVfZW50cnktPmFzYykgeworCisJCWlmIChhc2MgPiB0YWJsZV9lbnRyeS0+YXNjKQorCQkJcmV0dXJuICgxKTsKKworCQlpZiAoYXNjcSA8PSB0YWJsZV9lbnRyeS0+YXNjcSkgeworCQkJLyogQ2hlY2sgZm9yIHJhbmdlcyAqLworCQkJaWYgKGFzY3EgPT0gdGFibGVfZW50cnktPmFzY3EKKwkJIAkgfHwgKCh0YWJsZV9lbnRyeS0+YWN0aW9uICYgU1NRX1JBTkdFKSAhPSAwCisJCSAgCSAgICYmIGFzY3EgPj0gKHRhYmxlX2VudHJ5IC0gMSktPmFzY3EpKQorCQkJCXJldHVybiAoMCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorc2Vuc2VlbnRyeWNvbXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICptZW1iZXIpCit7CisJaW50IHNlbnNlX2tleTsKKwljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICp0YWJsZV9lbnRyeTsKKworCXNlbnNlX2tleSA9ICooKGNvbnN0IGludCAqKWtleSk7CisJdGFibGVfZW50cnkgPSAoY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKW1lbWJlcjsKKworCWlmIChzZW5zZV9rZXkgPj0gdGFibGVfZW50cnktPnNlbnNlX2tleSkgeworCQlpZiAoc2Vuc2Vfa2V5ID09IHRhYmxlX2VudHJ5LT5zZW5zZV9rZXkpCisJCQlyZXR1cm4gKDApOworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIHZvaWQKK2ZldGNodGFibGVlbnRyaWVzKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAorCQkgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsCisJCSAgY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqKnNlbnNlX2VudHJ5LAorCQkgIGNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKiphc2NfZW50cnkpCit7CisJdm9pZCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IGFzY190YWJsZV9lbnRyeSAqYXNjX3RhYmxlc1syXTsKKwljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV90YWJsZXNbMl07CisJc3RydWN0IGFzY19rZXkgYXNjX2FzY3E7CisJc2l6ZV90IGFzY190YWJsZXNfc2l6ZVsyXTsKKwlzaXplX3Qgc2Vuc2VfdGFibGVzX3NpemVbMl07CisJaW50IG51bV9hc2NfdGFibGVzOworCWludCBudW1fc2Vuc2VfdGFibGVzOworCWludCBpOworCisJLyogRGVmYXVsdCB0byBmYWlsdXJlICovCisJKnNlbnNlX2VudHJ5ID0gTlVMTDsKKwkqYXNjX2VudHJ5ID0gTlVMTDsKKwltYXRjaCA9IE5VTEw7CisJaWYgKGlucV9kYXRhICE9IE5VTEwpCisJCW1hdGNoID0gY2FtX3F1aXJrbWF0Y2goKHZvaWQgKilpbnFfZGF0YSwKKwkJCQkgICAgICAgKHZvaWQgKilzZW5zZV9xdWlya190YWJsZSwKKwkJCQkgICAgICAgc2Vuc2VfcXVpcmtfdGFibGVfc2l6ZSwKKwkJCQkgICAgICAgc2l6ZW9mKCpzZW5zZV9xdWlya190YWJsZSksCisJCQkJICAgICAgIGFpY19pbnF1aXJ5X21hdGNoKTsKKworCWlmIChtYXRjaCAhPSBOVUxMKSB7CisJCXN0cnVjdCBzY3NpX3NlbnNlX3F1aXJrX2VudHJ5ICpxdWlyazsKKworCQlxdWlyayA9IChzdHJ1Y3Qgc2NzaV9zZW5zZV9xdWlya19lbnRyeSAqKW1hdGNoOworCQlhc2NfdGFibGVzWzBdID0gcXVpcmstPmFzY19pbmZvOworCQlhc2NfdGFibGVzX3NpemVbMF0gPSBxdWlyay0+bnVtX2FzY3M7CisJCWFzY190YWJsZXNbMV0gPSBhc2NfdGFibGU7CisJCWFzY190YWJsZXNfc2l6ZVsxXSA9IGFzY190YWJsZV9zaXplOworCQludW1fYXNjX3RhYmxlcyA9IDI7CisJCXNlbnNlX3RhYmxlc1swXSA9IHF1aXJrLT5zZW5zZV9rZXlfaW5mbzsKKwkJc2Vuc2VfdGFibGVzX3NpemVbMF0gPSBxdWlyay0+bnVtX3NlbnNlX2tleXM7CisJCXNlbnNlX3RhYmxlc1sxXSA9IHNlbnNlX2tleV90YWJsZTsKKwkJc2Vuc2VfdGFibGVzX3NpemVbMV0gPSBzZW5zZV9rZXlfdGFibGVfc2l6ZTsKKwkJbnVtX3NlbnNlX3RhYmxlcyA9IDI7CisJfSBlbHNlIHsKKwkJYXNjX3RhYmxlc1swXSA9IGFzY190YWJsZTsKKwkJYXNjX3RhYmxlc19zaXplWzBdID0gYXNjX3RhYmxlX3NpemU7CisJCW51bV9hc2NfdGFibGVzID0gMTsKKwkJc2Vuc2VfdGFibGVzWzBdID0gc2Vuc2Vfa2V5X3RhYmxlOworCQlzZW5zZV90YWJsZXNfc2l6ZVswXSA9IHNlbnNlX2tleV90YWJsZV9zaXplOworCQludW1fc2Vuc2VfdGFibGVzID0gMTsKKwl9CisKKwlhc2NfYXNjcS5hc2MgPSBhc2M7CisJYXNjX2FzY3EuYXNjcSA9IGFzY3E7CisJZm9yIChpID0gMDsgaSA8IG51bV9hc2NfdGFibGVzOyBpKyspIHsKKwkJdm9pZCAqZm91bmRfZW50cnk7CisKKwkJZm91bmRfZW50cnkgPSBzY3NpYnNlYXJjaCgmYXNjX2FzY3EsIGFzY190YWJsZXNbaV0sCisJCQkJCSAgYXNjX3RhYmxlc19zaXplW2ldLAorCQkJCQkgIHNpemVvZigqKmFzY190YWJsZXMpLAorCQkJCQkgIGFzY2VudHJ5Y29tcCk7CisKKwkJaWYgKGZvdW5kX2VudHJ5KSB7CisJCQkqYXNjX2VudHJ5ID0gKHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKilmb3VuZF9lbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9zZW5zZV90YWJsZXM7IGkrKykgeworCQl2b2lkICpmb3VuZF9lbnRyeTsKKworCQlmb3VuZF9lbnRyeSA9IHNjc2lic2VhcmNoKCZzZW5zZV9rZXksIHNlbnNlX3RhYmxlc1tpXSwKKwkJCQkJICBzZW5zZV90YWJsZXNfc2l6ZVtpXSwKKwkJCQkJICBzaXplb2YoKipzZW5zZV90YWJsZXMpLAorCQkJCQkgIHNlbnNlZW50cnljb21wKTsKKworCQlpZiAoZm91bmRfZW50cnkpIHsKKwkJCSpzZW5zZV9lbnRyeSA9CisJCQkgICAgKHN0cnVjdCBzZW5zZV9rZXlfdGFibGVfZW50cnkgKilmb3VuZF9lbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCAqCitzY3NpYnNlYXJjaChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJCSBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwljb25zdCB2b2lkICplbnRyeTsKKwl1X2ludCBsOworCXVfaW50IHU7CisJdV9pbnQgbTsKKworCWwgPSAtMTsKKwl1ID0gbm1lbWI7CisJd2hpbGUgKGwgKyAxICE9IHUpIHsKKwkJbSA9IChsICsgdSkgLyAyOworCQllbnRyeSA9IGJhc2UgKyBtICogc2l6ZTsKKwkJaWYgKGNvbXBhcihrZXksIGVudHJ5KSA+IDApCisJCQlsID0gbTsKKwkJZWxzZQorCQkJdSA9IG07CisJfQorCisJZW50cnkgPSBiYXNlICsgdSAqIHNpemU7CisJaWYgKHUgPT0gbm1lbWIKKwkgfHwgY29tcGFyKGtleSwgZW50cnkpICE9IDApCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKCh2b2lkICopZW50cnkpOworfQorCisvKgorICogQ29tcGFyZSBzdHJpbmcgd2l0aCBwYXR0ZXJuLCByZXR1cm5pbmcgMCBvbiBtYXRjaC4KKyAqIFNob3J0IHBhdHRlcm4gbWF0Y2hlcyB0cmFpbGluZyBibGFua3MgaW4gbmFtZSwKKyAqIHdpbGRjYXJkICcqJyBpbiBwYXR0ZXJuIG1hdGNoZXMgcmVzdCBvZiBuYW1lLAorICogd2lsZGNhcmQgJz8nIG1hdGNoZXMgYSBzaW5nbGUgbm9uLXNwYWNlIGNoYXJhY3Rlci4KKyAqLworc3RhdGljIGludAorY2FtX3N0cm1hdGNoKGNvbnN0IHVpbnQ4X3QgKnN0ciwgY29uc3QgdWludDhfdCAqcGF0dGVybiwgaW50IHN0cl9sZW4pCit7CisKKwl3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyYmIHN0cl9sZW4gPiAwKSB7ICAKKworCQlpZiAoKnBhdHRlcm4gPT0gJyonKSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmICgoKnBhdHRlcm4gIT0gKnN0cikKKwkJICYmICgqcGF0dGVybiAhPSAnPycgfHwgKnN0ciA9PSAnICcpKSB7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCXBhdHRlcm4rKzsKKwkJc3RyKys7CisJCXN0cl9sZW4tLTsKKwl9CisJd2hpbGUgKHN0cl9sZW4gPiAwICYmICpzdHIrKyA9PSAnICcpCisJCXN0cl9sZW4tLTsKKworCXJldHVybiAoc3RyX2xlbik7Cit9CisKK3N0YXRpYyBjYWRkcl90CitjYW1fcXVpcmttYXRjaChjYWRkcl90IHRhcmdldCwgY2FkZHJfdCBxdWlya190YWJsZSwgaW50IG51bV9lbnRyaWVzLAorCSAgICAgICBpbnQgZW50cnlfc2l6ZSwgY2FtX3F1aXJrbWF0Y2hfdCAqY29tcF9mdW5jKQoreworCWZvciAoOyBudW1fZW50cmllcyA+IDA7IG51bV9lbnRyaWVzLS0sIHF1aXJrX3RhYmxlICs9IGVudHJ5X3NpemUpIHsKKwkJaWYgKCgqY29tcF9mdW5jKSh0YXJnZXQsIHF1aXJrX3RhYmxlKSA9PSAwKQorCQkJcmV0dXJuIChxdWlya190YWJsZSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3ZvaWQKK2FpY19zZW5zZV9kZXNjKGludCBzZW5zZV9rZXksIGludCBhc2MsIGludCBhc2NxLAorCSAgICAgICBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhLAorCSAgICAgICBjb25zdCBjaGFyICoqc2Vuc2Vfa2V5X2Rlc2MsIGNvbnN0IGNoYXIgKiphc2NfZGVzYykKK3sKKwljb25zdCBzdHJ1Y3QgYXNjX3RhYmxlX2VudHJ5ICphc2NfZW50cnk7CisJY29uc3Qgc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSAqc2Vuc2VfZW50cnk7CisKKwlmZXRjaHRhYmxlZW50cmllcyhzZW5zZV9rZXksIGFzYywgYXNjcSwKKwkJCSAgaW5xX2RhdGEsCisJCQkgICZzZW5zZV9lbnRyeSwKKwkJCSAgJmFzY19lbnRyeSk7CisKKwkqc2Vuc2Vfa2V5X2Rlc2MgPSBzZW5zZV9lbnRyeS0+ZGVzYzsKKworCWlmIChhc2NfZW50cnkgIT0gTlVMTCkKKwkJKmFzY19kZXNjID0gYXNjX2VudHJ5LT5kZXNjOworCWVsc2UgaWYgKGFzYyA+PSAweDgwICYmIGFzYyA8PSAweGZmKQorCQkqYXNjX2Rlc2MgPSAiVmVuZG9yIFNwZWNpZmljIEFTQyI7CisJZWxzZSBpZiAoYXNjcSA+PSAweDgwICYmIGFzY3EgPD0gMHhmZikKKwkJKmFzY19kZXNjID0gIlZlbmRvciBTcGVjaWZpYyBBU0NRIjsKKwllbHNlCisJCSphc2NfZGVzYyA9ICJSZXNlcnZlZCBBU0MvQVNDUSBwYWlyIjsKK30KKworLyoKKyAqIEdpdmVuIHNlbnNlIGFuZCBkZXZpY2UgdHlwZSBpbmZvcm1hdGlvbiwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKiBJZiB3ZSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWMgZXJyb3IgYXMgaWRlbnRpZmllZCBieSB0aGUgQVNDL0FTQ1EKKyAqIHBhaXIsIGZhbGwgYmFjayBvbiB0aGUgbW9yZSBnZW5lcmljIGFjdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSBzZW5zZSBrZXkuCisgKi8KK2FpY19zZW5zZV9hY3Rpb24KK2FpY19zZW5zZV9lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqc2Vuc2VfZGF0YSwKKwkJICAgICAgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSAqaW5xX2RhdGEsIHVpbnQzMl90IHNlbnNlX2ZsYWdzKQoreworCWNvbnN0IHN0cnVjdCBhc2NfdGFibGVfZW50cnkgKmFzY19lbnRyeTsKKwljb25zdCBzdHJ1Y3Qgc2Vuc2Vfa2V5X3RhYmxlX2VudHJ5ICpzZW5zZV9lbnRyeTsKKwlpbnQgZXJyb3JfY29kZSwgc2Vuc2Vfa2V5LCBhc2MsIGFzY3E7CisJYWljX3NlbnNlX2FjdGlvbiBhY3Rpb247CisKKwlzY3NpX2V4dHJhY3Rfc2Vuc2Uoc2Vuc2VfZGF0YSwgJmVycm9yX2NvZGUsICZzZW5zZV9rZXksICZhc2MsICZhc2NxKTsKKworCWlmIChlcnJvcl9jb2RlID09IFNTRF9ERUZFUlJFRF9FUlJPUikgeworCQkvKgorCQkgKiBYWFggZHVmYXVsdEBGcmVlQlNELm9yZworCQkgKiBUaGlzIGVycm9yIGRvZXNuJ3QgcmVsYXRlIHRvIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQKKwkJICogd2l0aCB0aGlzIHJlcXVlc3Qgc2Vuc2UuICBBIGRlZmVycmVkIGVycm9yIGlzIGFuIGVycm9yCisJCSAqIGZvciBhIGNvbW1hbmQgdGhhdCBoYXMgYWxyZWFkeSByZXR1cm5lZCBHT09EIHN0YXR1cworCQkgKiAoc2VlIFNDU0kyIDguMi4xNC4yKS4KKwkJICoKKwkJICogQnkgbXkgcmVhZGluZyBvZiB0aGF0IHNlY3Rpb24sIGl0IGxvb2tzIGxpa2UgdGhlIGN1cnJlbnQKKwkJICogY29tbWFuZCBoYXMgYmVlbiBjYW5jZWxsZWQsIHdlIHNob3VsZCBub3cgY2xlYW4gdGhpbmdzIHVwCisJCSAqIChob3BlZnVsbHkgcmVjb3ZlcmluZyBhbnkgbG9zdCBkYXRhKSBhbmQgdGhlbiByZXRyeSB0aGUKKwkJICogY3VycmVudCBjb21tYW5kLiAgVGhlcmUgYXJlIHR3byBlYXN5IGNob2ljZXMsIGJvdGggd3Jvbmc6CisJCSAqCisJCSAqIDEuIERyb3AgdGhyb3VnaCAobGlrZSB3ZSBoYWQgYmVlbiBkb2luZyksIHRodXMgdHJlYXRpbmcKKwkJICogICAgdGhpcyBhcyBpZiB0aGUgZXJyb3Igd2VyZSBmb3IgdGhlIGN1cnJlbnQgY29tbWFuZCBhbmQKKwkJICogICAgcmV0dXJuIGFuZCBzdG9wIHRoZSBjdXJyZW50IGNvbW1hbmQuCisJCSAqIAorCQkgKiAyLiBJc3N1ZSBhIHJldHJ5IChsaWtlIEkgbWFkZSBpdCBkbykgdGh1cyBob3BlZnVsbHkKKwkJICogICAgcmVjb3ZlcmluZyB0aGUgY3VycmVudCB0cmFuc2ZlciwgYW5kIGlnbm9yaW5nIHRoZQorCQkgKiAgICBmYWN0IHRoYXQgd2UndmUgZHJvcHBlZCBhIGNvbW1hbmQuCisJCSAqCisJCSAqIFRoZXNlIHNob3VsZCBwcm9iYWJseSBiZSBoYW5kbGVkIGluIGEgZGV2aWNlIHNwZWNpZmljCisJCSAqIHNlbnNlIGhhbmRsZXIgb3IgcHVudGVkIGJhY2sgdXAgdG8gYSB1c2VyIG1vZGUgZGFlbW9uCisJCSAqLworCQlhY3Rpb24gPSBTU19SRVRSWXxTU1FfREVDUkVNRU5UX0NPVU5UfFNTUV9QUklOVF9TRU5TRTsKKwl9IGVsc2UgeworCQlmZXRjaHRhYmxlZW50cmllcyhzZW5zZV9rZXksIGFzYywgYXNjcSwKKwkJCQkgIGlucV9kYXRhLAorCQkJCSAgJnNlbnNlX2VudHJ5LAorCQkJCSAgJmFzY19lbnRyeSk7CisKKwkJLyoKKwkJICogT3ZlcnJpZGUgdGhlICdObyBhZGRpdGlvbmFsIFNlbnNlJyBlbnRyeSAoMCwwKQorCQkgKiB3aXRoIHRoZSBlcnJvciBhY3Rpb24gb2YgdGhlIHNlbnNlIGtleS4KKwkJICovCisJCWlmIChhc2NfZW50cnkgIT0gTlVMTAorCQkgJiYgKGFzYyAhPSAwIHx8IGFzY3EgIT0gMCkpCisJCQlhY3Rpb24gPSBhc2NfZW50cnktPmFjdGlvbjsKKwkJZWxzZQorCQkJYWN0aW9uID0gc2Vuc2VfZW50cnktPmFjdGlvbjsKKworCQlpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfUkVDT1ZFUkVEX0VSUk9SKSB7CisJCQkvKgorCQkJICogVGhlIGFjdGlvbiBzdWNjZWVkZWQgYnV0IHRoZSBkZXZpY2Ugd2FudHMKKwkJCSAqIHRoZSB1c2VyIHRvIGtub3cgdGhhdCBzb21lIHJlY292ZXJ5IGFjdGlvbgorCQkJICogd2FzIHJlcXVpcmVkLgorCQkJICovCisJCQlhY3Rpb24gJj0gfihTU19NQVNLfFNTUV9NQVNLfFNTX0VSUk1BU0spOworCQkJYWN0aW9uIHw9IFNTX05PUHxTU1FfUFJJTlRfU0VOU0U7CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfSUxMRUdBTF9SRVFVRVNUKSB7CisJCQlpZiAoKHNlbnNlX2ZsYWdzICYgU0ZfUVVJRVRfSVIpICE9IDApCisJCQkJYWN0aW9uICY9IH5TU1FfUFJJTlRfU0VOU0U7CisJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IFNTRF9LRVlfVU5JVF9BVFRFTlRJT04pIHsKKwkJCWlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9SRVRSWV9VQSkgIT0gMAorCQkJICYmIChhY3Rpb24gJiBTU19NQVNLKSA9PSBTU19GQUlMKSB7CisJCQkJYWN0aW9uICY9IH4oU1NfTUFTS3xTU1FfTUFTSyk7CisJCQkJYWN0aW9uIHw9IFNTX1JFVFJZfFNTUV9ERUNSRU1FTlRfQ09VTlR8CisJCQkJCSAgU1NRX1BSSU5UX1NFTlNFOworCQkJfQorCQl9CisJfQorCisJaWYgKChzZW5zZV9mbGFncyAmIFNGX1BSSU5UX0FMV0FZUykgIT0gMCkKKwkJYWN0aW9uIHw9IFNTUV9QUklOVF9TRU5TRTsKKwllbHNlIGlmICgoc2Vuc2VfZmxhZ3MgJiBTRl9OT19QUklOVCkgIT0gMCkKKwkJYWN0aW9uICY9IH5TU1FfUFJJTlRfU0VOU0U7CisKKwlyZXR1cm4gKGFjdGlvbik7Cit9CisKKy8qICAgICAgCisgKiBUcnkgbWFrZSBhcyBnb29kIGEgbWF0Y2ggYXMgcG9zc2libGUgd2l0aAorICogYXZhaWxhYmxlIHN1YiBkcml2ZXJzCisgKi8KK2ludAorYWljX2lucXVpcnlfbWF0Y2goY2FkZHJfdCBpbnFidWZmZXIsIGNhZGRyX3QgdGFibGVfZW50cnkpCit7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuICplbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucTsKKyAKKwllbnRyeSA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4gKil0YWJsZV9lbnRyeTsKKwlpbnEgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICopaW5xYnVmZmVyOworCisJaWYgKCgoU0lEX1RZUEUoaW5xKSA9PSBlbnRyeS0+dHlwZSkKKwkgIHx8IChlbnRyeS0+dHlwZSA9PSBUX0FOWSkpCisJICYmIChTSURfSVNfUkVNT1ZBQkxFKGlucSkgPyBlbnRyeS0+bWVkaWFfdHlwZSAmIFNJUF9NRURJQV9SRU1PVkFCTEUKKwkJCQkgICA6IGVudHJ5LT5tZWRpYV90eXBlICYgU0lQX01FRElBX0ZJWEVEKQorCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+dmVuZG9yLCBlbnRyeS0+dmVuZG9yLCBzaXplb2YoaW5xLT52ZW5kb3IpKSA9PSAwKQorCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+cHJvZHVjdCwgZW50cnktPnByb2R1Y3QsCisJCQkgIHNpemVvZihpbnEtPnByb2R1Y3QpKSA9PSAwKQorCSAmJiAoY2FtX3N0cm1hdGNoKGlucS0+cmV2aXNpb24sIGVudHJ5LT5yZXZpc2lvbiwKKwkJCSAgc2l6ZW9mKGlucS0+cmV2aXNpb24pKSA9PSAwKSkgeworCQlyZXR1cm4gKDApOworCX0KKyAgICAgICAgcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBUYWJsZSBvZiBzeW5jcmF0ZXMgdGhhdCBkb24ndCBmb2xsb3cgdGhlICJkaXZpc2libGUgYnkgNCIKKyAqIHJ1bGUuIFRoaXMgdGFibGUgd2lsbCBiZSBleHBhbmRlZCBpbiBmdXR1cmUgU0NTSSBzcGVjcy4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJdV9pbnQgcGVyaW9kX2ZhY3RvcjsKKwl1X2ludCBwZXJpb2Q7CS8qIGluIDEwMHRocyBvZiBucyAqLworfSBzY3NpX3N5bmNyYXRlc1tdID0geworCXsgMHgwOCwgNjI1IH0sCS8qIEZBU1QtMTYwICovCisJeyAweDA5LCAxMjUwIH0sCS8qIEZBU1QtODAgKi8KKwl7IDB4MGEsIDI1MDAgfSwJLyogRkFTVC00MCA0ME1IeiAqLworCXsgMHgwYiwgMzAzMCB9LAkvKiBGQVNULTQwIDMzTUh6ICovCisJeyAweDBjLCA1MDAwIH0JLyogRkFTVC0yMCAqLworfTsKKworLyoKKyAqIFJldHVybiB0aGUgZnJlcXVlbmN5IGluIGtIeiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorICogc3luYyBwZXJpb2QgZmFjdG9yLgorICovCit1X2ludAorYWljX2NhbGNfc3luY3NyYXRlKHVfaW50IHBlcmlvZF9mYWN0b3IpCit7CisJaW50IGk7CisJaW50IG51bV9zeW5jcmF0ZXM7CisKKwludW1fc3luY3JhdGVzID0gc2l6ZW9mKHNjc2lfc3luY3JhdGVzKSAvIHNpemVvZihzY3NpX3N5bmNyYXRlc1swXSk7CisJLyogU2VlIGlmIHRoZSBwZXJpb2QgaXMgaW4gdGhlICJleGNlcHRpb24iIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IG51bV9zeW5jcmF0ZXM7IGkrKykgeworCisJCWlmIChwZXJpb2RfZmFjdG9yID09IHNjc2lfc3luY3JhdGVzW2ldLnBlcmlvZF9mYWN0b3IpIHsKKwkJCS8qIFBlcmlvZCBpbiBrSHogKi8KKwkJCXJldHVybiAoMTAwMDAwMDAwIC8gc2NzaV9zeW5jcmF0ZXNbaV0ucGVyaW9kKTsKKwkJfQorCX0KKworCS8qCisJICogV2Fzbid0IGluIHRoZSB0YWJsZSwgc28gdXNlIHRoZSBzdGFuZGFyZAorCSAqIDQgdGltZXMgY29udmVyc2lvbi4KKwkgKi8KKwlyZXR1cm4gKDEwMDAwMDAwIC8gKHBlcmlvZF9mYWN0b3IgKiA0ICogMTApKTsKK30KKworLyoKKyAqIFJldHVybiBzcGVlZCBpbiBLQi9zLgorICovCit1X2ludAorYWljX2NhbGNfc3BlZWQodV9pbnQgd2lkdGgsIHVfaW50IHBlcmlvZCwgdV9pbnQgb2Zmc2V0LCB1X2ludCBtaW5fcmF0ZSkKK3sKKwl1X2ludCBmcmVxOworCisJaWYgKG9mZnNldCAhPSAwICYmIHBlcmlvZCA8IG1pbl9yYXRlKQorCQlmcmVxICA9IGFpY19jYWxjX3N5bmNzcmF0ZShwZXJpb2QpOworCWVsc2UKKwkJLyogUm91Z2hseSAzLjNNQi9zIGZvciBhc3luYyAqLworCQlmcmVxICA9IDMzMDA7CisJZnJlcSA8PD0gd2lkdGg7CisJcmV0dXJuIChmcmVxKTsKK30KKwordWludDMyX3QKK2FpY19lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucV9kYXRhLAorCQkgY2FtX3N0YXR1cyBzdGF0dXMsIHVfaW50IHNjc2lfc3RhdHVzKQoreworCWFpY19zZW5zZV9hY3Rpb24gIGVycl9hY3Rpb247CisJaW50CQkgIHNlbnNlOworCisJc2Vuc2UgID0gKGNtZC0+cmVzdWx0ID4+IDI0KSA9PSBEUklWRVJfU0VOU0U7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgQ0FNX1JFUV9DTVA6CisJCWVycl9hY3Rpb24gPSBTU19OT1A7CisJCWJyZWFrOworCWNhc2UgQ0FNX0FVVE9TRU5TRV9GQUlMOgorCWNhc2UgQ0FNX1NDU0lfU1RBVFVTX0VSUk9SOgorCisJCXN3aXRjaCAoc2NzaV9zdGF0dXMpIHsKKwkJY2FzZSBTQ1NJX1NUQVRVU19PSzoKKwkJY2FzZSBTQ1NJX1NUQVRVU19DT05EX01FVDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19JTlRFUk1FRDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19JTlRFUk1FRF9DT05EX01FVDoKKwkJCWVycl9hY3Rpb24gPSBTU19OT1A7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJX1NUQVRVU19DTURfVEVSTUlOQVRFRDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19DSEVDS19DT05EOgorCQkJaWYgKHNlbnNlICE9IDApIHsKKwkJCQlzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZTsKKworCQkJCXNlbnNlID0gKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKikKKwkJCQkgICAgJmNtZC0+c2Vuc2VfYnVmZmVyOworCQkJCWVycl9hY3Rpb24gPQorCQkJCSAgICBhaWNfc2Vuc2VfZXJyb3JfYWN0aW9uKHNlbnNlLCBpbnFfZGF0YSwgMCk7CisKKwkJCX0gZWxzZSB7CisJCQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZfFNTUV9GQUxMQkFDSworCQkJCQkgICB8IFNTUV9ERUNSRU1FTlRfQ09VTlR8RUlPOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0NTSV9TVEFUVVNfUVVFVUVfRlVMTDoKKwkJY2FzZSBTQ1NJX1NUQVRVU19CVVNZOgorCQkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZfFNTUV9ERUxBWXxTU1FfTUFOWQorCQkJCSAgIHwgU1NRX0RFQ1JFTUVOVF9DT1VOVHxFQlVTWTsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lfU1RBVFVTX1JFU0VSVl9DT05GTElDVDoKKwkJZGVmYXVsdDoKKwkJCWVycl9hY3Rpb24gPSBTU19GQUlMfEVCVVNZOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQU1fQ01EX1RJTUVPVVQ6CisJY2FzZSBDQU1fUkVRX0NNUF9FUlI6CisJY2FzZSBDQU1fVU5FWFBfQlVTRlJFRToKKwljYXNlIENBTV9VTkNPUl9QQVJJVFk6CisJY2FzZSBDQU1fREFUQV9SVU5fRVJSOgorCQllcnJfYWN0aW9uID0gU1NfUkVUUll8U1NRX0ZBTExCQUNLfEVJTzsKKwkJYnJlYWs7CisJY2FzZSBDQU1fVUFfQUJPUlQ6CisJY2FzZSBDQU1fVUFfVEVSTUlPOgorCWNhc2UgQ0FNX01TR19SRUpFQ1RfUkVDOgorCWNhc2UgQ0FNX1NFTF9USU1FT1VUOgorCQllcnJfYWN0aW9uID0gU1NfRkFJTHxFSU87CisJCWJyZWFrOworCWNhc2UgQ0FNX1JFUV9JTlZBTElEOgorCWNhc2UgQ0FNX1BBVEhfSU5WQUxJRDoKKwljYXNlIENBTV9ERVZfTk9UX1RIRVJFOgorCWNhc2UgQ0FNX05PX0hCQToKKwljYXNlIENBTV9QUk9WSURFX0ZBSUw6CisJY2FzZSBDQU1fUkVRX1RPT19CSUc6CQkKKwljYXNlIENBTV9SRVNSQ19VTkFWQUlMOgorCWNhc2UgQ0FNX0JVU1k6CisJZGVmYXVsdDoKKwkJLyogcGFuaWM/PyAgVGhlc2Ugc2hvdWxkIG5ldmVyIG9jY3VyIGluIG91ciBhcHBsaWNhdGlvbi4gKi8KKwkJZXJyX2FjdGlvbiA9IFNTX0ZBSUx8RUlPOworCQlicmVhazsKKwljYXNlIENBTV9TQ1NJX0JVU19SRVNFVDoKKwljYXNlIENBTV9CRFJfU0VOVDoJCQorCWNhc2UgQ0FNX1JFUVVFVUVfUkVROgorCQkvKiBVbmNvbmRpdGlvbmFsIHJlcXVldWUgKi8KKwkJZXJyX2FjdGlvbiA9IFNTX1JFVFJZOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKGVycl9hY3Rpb24pOworfQorCitjaGFyICoKK2FpY19wYXJzZV9icmFjZV9vcHRpb24oY2hhciAqb3B0X25hbWUsIGNoYXIgKm9wdF9hcmcsIGNoYXIgKmVuZCwgaW50IGRlcHRoLAorCQkgICAgICAgYWljX29wdGlvbl9jYWxsYmFja190ICpjYWxsYmFjaywgdV9sb25nIGNhbGxiYWNrX2FyZykKK3sKKwljaGFyCSp0b2tfZW5kOworCWNoYXIJKnRva19lbmQyOworCWludCAgICAgIGk7CisJaW50ICAgICAgaW5zdGFuY2U7CisJaW50CSB0YXJnOworCWludAkgZG9uZTsKKwljaGFyCSB0b2tfbGlzdFtdID0geycuJywgJywnLCAneycsICd9JywgJ1wwJ307CisKKwkvKiBBbGwgb3B0aW9ucyB1c2UgYSAnOicgbmFtZS9hcmcgc2VwYXJhdG9yICovCisJaWYgKCpvcHRfYXJnICE9ICc6JykKKwkJcmV0dXJuIChvcHRfYXJnKTsKKwlvcHRfYXJnKys7CisJaW5zdGFuY2UgPSAtMTsKKwl0YXJnID0gLTE7CisJZG9uZSA9IEZBTFNFOworCS8qCisJICogUmVzdG9yZSBzZXBhcmF0b3IgdGhhdCBtYXkgYmUgaW4KKwkgKiB0aGUgbWlkZGxlIG9mIG91ciBvcHRpb24gYXJndW1lbnQuCisJICovCisJdG9rX2VuZCA9IHN0cmNocihvcHRfYXJnLCAnXDAnKTsKKwlpZiAodG9rX2VuZCA8IGVuZCkKKwkJKnRva19lbmQgPSAnLCc7CisJd2hpbGUgKCFkb25lKSB7CisJCXN3aXRjaCAoKm9wdF9hcmcpIHsKKwkJY2FzZSAneyc6CisJCQlpZiAoaW5zdGFuY2UgPT0gLTEpIHsKKwkJCQlpbnN0YW5jZSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZXB0aCA+IDEpIHsKKwkJCQkJaWYgKHRhcmcgPT0gLTEpCisJCQkJCQl0YXJnID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIk1hbGZvcm1lZCBPcHRpb24gJXNcbiIsCisJCQkJCSAgICAgICBvcHRfbmFtZSk7CisJCQkJCWRvbmUgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICd9JzoKKwkJCWlmICh0YXJnICE9IC0xKQorCQkJCXRhcmcgPSAtMTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlICE9IC0xKQorCQkJCWluc3RhbmNlID0gLTE7CisJCQlvcHRfYXJnKys7CisJCQlicmVhazsKKwkJY2FzZSAnLCc6CisJCWNhc2UgJy4nOgorCQkJaWYgKGluc3RhbmNlID09IC0xKQorCQkJCWRvbmUgPSBUUlVFOworCQkJZWxzZSBpZiAodGFyZyA+PSAwKQorCQkJCXRhcmcrKzsKKwkJCWVsc2UgaWYgKGluc3RhbmNlID49IDApCisJCQkJaW5zdGFuY2UrKzsKKwkJCW9wdF9hcmcrKzsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlkb25lID0gVFJVRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG9rX2VuZCA9IGVuZDsKKwkJCWZvciAoaSA9IDA7IHRva19saXN0W2ldOyBpKyspIHsKKwkJCQl0b2tfZW5kMiA9IHN0cmNocihvcHRfYXJnLCB0b2tfbGlzdFtpXSk7CisJCQkJaWYgKCh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkpCisJCQkJCXRva19lbmQgPSB0b2tfZW5kMjsKKwkJCX0KKwkJCWNhbGxiYWNrKGNhbGxiYWNrX2FyZywgaW5zdGFuY2UsIHRhcmcsCisJCQkJIHNpbXBsZV9zdHJ0b2wob3B0X2FyZywgTlVMTCwgMCkpOworCQkJb3B0X2FyZyA9IHRva19lbmQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKG9wdF9hcmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWNsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU2Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljbGliLmgKQEAgLTAsMCArMSwxMDg1IEBACisvKgorICogTGFyZ2VseSB3cml0dGVuIGJ5IEp1bGlhbiBFbGlzY2hlciAoanVsaWFuQHRmcy5jb20pCisgKiBmb3IgVFJXIEZpbmFuY2lhbCBTeXN0ZW1zLgorICoKKyAqIFRSVyBGaW5hbmNpYWwgU3lzdGVtcywgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZWlyIGFncmVlbWVudCB3aXRoIENhcm5lZ2llCisgKiBNZWxsb24gVW5pdmVyc2l0eSwgbWFrZXMgdGhpcyBzb2Z0d2FyZSBhdmFpbGFibGUgdG8gQ01VIHRvIGRpc3RyaWJ1dGUKKyAqIG9yIHVzZSBpbiBhbnkgbWFubmVyIHRoYXQgdGhleSBzZWUgZml0IGFzIGxvbmcgYXMgdGhpcyBtZXNzYWdlIGlzIGtlcHQgd2l0aAorICogdGhlIHNvZnR3YXJlLiBGb3IgdGhpcyByZWFzb24gVEZTIGFsc28gZ3JhbnRzIGFueSBvdGhlciBwZXJzb25zIG9yCisgKiBvcmdhbmlzYXRpb25zIHBlcm1pc3Npb24gdG8gdXNlIG9yIG1vZGlmeSB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFRGUyBzdXBwbGllcyB0aGlzIHNvZnR3YXJlIHRvIGJlIHB1YmxpY2x5IHJlZGlzdHJpYnV0ZWQKKyAqIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgVEZTIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIGNvcnJlY3QKKyAqIGZ1bmN0aW9uaW5nIG9mIHRoaXMgc29mdHdhcmUgaW4gYW55IGNpcmN1bXN0YW5jZXMuCisgKgorICogUG9ydGVkIHRvIHJ1biB1bmRlciAzODZCU0QgYnkgSnVsaWFuIEVsaXNjaGVyIChqdWxpYW5AdGZzLmNvbSkgU2VwdCAxOTkyCisgKgorICogJEZyZWVCU0Q6IHNyYy9zeXMvY2FtL3Njc2kvc2NzaV9hbGwuaCx2IDEuMjEgMjAwMi8xMC8wOCAxNzoxMjo0NCBrZW4gRXhwICQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQWRhcHRlYyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICogJElkJAorICovCisKKyNpZm5kZWYJX0FJQ0xJQl9ICisjZGVmaW5lIF9BSUNMSUJfSAorCisvKgorICogTGludXggSW50ZXJydXB0IFN1cHBvcnQuCisgKi8KKyNpZm5kZWYgSVJRX1JFVFZBTAordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworI2RlZmluZQlJUlFfUkVUVkFMKHgpCisjZW5kaWYKKworLyoKKyAqIFNDU0kgY29tbWFuZCBmb3JtYXQKKyAqLworCisvKgorICogRGVmaW5lIGRvbWUgYml0cyB0aGF0IGFyZSBpbiBBTEwgKG9yIGEgbG90IG9mKSBzY3NpIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgU0NTSV9DVExfTElOSwkJMHgwMQorI2RlZmluZSBTQ1NJX0NUTF9GTEFHCQkweDAyCisjZGVmaW5lIFNDU0lfQ1RMX1ZFTkRPUgkJMHhDMAorI2RlZmluZQlTQ1NJX0NNRF9MVU4JCTB4QTAJLyogdGhlc2UgdHdvIHNob3VsZCBub3QgYmUgbmVlZGVkICovCisjZGVmaW5lCVNDU0lfQ01EX0xVTl9TSElGVAk1CS8qIExVTiBpbiB0aGUgY21kIGlzIG5vIGxvbmdlciBTQ1NJICovCisKKyNkZWZpbmUgU0NTSV9NQVhfQ0RCTEVOCQkxNgkvKiAKKwkJCQkJICogMTYgYnl0ZSBjb21tYW5kcyBhcmUgaW4gdGhlIAorCQkJCQkgKiBTQ1NJLTMgc3BlYyAKKwkJCQkJICovCisvKiA2Ynl0ZSBDREJzIHNwZWNpYWwgY2FzZSAwIGxlbmd0aCB0byBiZSAyNTYgKi8KKyNkZWZpbmUgU0NTSV9DREI2X0xFTihsZW4pCSgobGVuKSA9PSAwID8gMjU2IDogbGVuKQorCisvKgorICogVGhpcyB0eXBlIGRlZmluZXMgYWN0aW9ucyB0byBiZSB0YWtlbiB3aGVuIGEgcGFydGljdWxhciBzZW5zZSBjb2RlIGlzCisgKiByZWNlaXZlZC4gIFJpZ2h0IG5vdywgdGhlc2UgZmxhZ3MgYXJlIG9ubHkgZGVmaW5lZCB0byB0YWtlIHVwIDE2IGJpdHMsCisgKiBidXQgY2FuIGJlIGV4cGFuZGVkIGluIHRoZSBmdXR1cmUgaWYgbmVjZXNzYXJ5LgorICovCit0eXBlZGVmIGVudW0geworCVNTX05PUAkJPSAweDAwMDAwMCwgLyogRG8gbm90aGluZyAqLworCVNTX1JFVFJZCT0gMHgwMTAwMDAsIC8qIFJldHJ5IHRoZSBjb21tYW5kICovCisJU1NfRkFJTAkJPSAweDAyMDAwMCwgLyogQmFpbCBvdXQgKi8KKwlTU19TVEFSVAk9IDB4MDMwMDAwLCAvKiBTZW5kIGEgU3RhcnQgVW5pdCBjb21tYW5kIHRvIHRoZSBkZXZpY2UsCisJCQkJICAgICAqIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCisJCQkJICAgICAqLworCVNTX1RVUgkJPSAweDA0MDAwMCwgLyogU2VuZCBhIFRlc3QgVW5pdCBSZWFkeSBjb21tYW5kIHRvIHRoZQorCQkJCSAgICAgKiBkZXZpY2UsIHRoZW4gcmV0cnkgdGhlIG9yaWdpbmFsIGNvbW1hbmQuCisJCQkJICAgICAqLworCVNTX1JFUVNFTlNFCT0gMHgwNTAwMDAsIC8qIFNlbmQgYSBSZXF1ZXN0U2Vuc2UgY29tbWFuZCB0byB0aGUKKwkJCQkgICAgICogZGV2aWNlLCB0aGVuIHJldHJ5IHRoZSBvcmlnaW5hbCBjb21tYW5kLgorCQkJCSAgICAgKi8KKwlTU19JTlFfUkVGUkVTSAk9IDB4MDYwMDAwLAorCVNTX01BU0sJCT0gMHhmZjAwMDAKK30gYWljX3NlbnNlX2FjdGlvbjsKKwordHlwZWRlZiBlbnVtIHsKKwlTU1FfTk9ORQkJPSAweDAwMDAsCisJU1NRX0RFQ1JFTUVOVF9DT1VOVAk9IDB4MDEwMCwgIC8qIERlY3JlbWVudCB0aGUgcmV0cnkgY291bnQgKi8KKwlTU1FfTUFOWQkJPSAweDAyMDAsICAvKiBzZW5kIGxvdHMgb2YgcmVjb3ZlcnkgY29tbWFuZHMgKi8KKwlTU1FfUkFOR0UJCT0gMHgwNDAwLCAgLyoKKwkJCQkJICAgICogVGhpcyB0YWJsZSBlbnRyeSByZXByZXNlbnRzIHRoZQorCQkJCQkgICAgKiBlbmQgb2YgYSByYW5nZSBvZiBBU0NRcyB0aGF0CisJCQkJCSAgICAqIGhhdmUgaWRlbnRpY2FsIGVycm9yIGFjdGlvbnMKKwkJCQkJICAgICogYW5kIHRleHQuCisJCQkJCSAgICAqLworCVNTUV9QUklOVF9TRU5TRQkJPSAweDA4MDAsCisJU1NRX0RFTEFZCQk9IDB4MTAwMCwgIC8qIERlbGF5IGJlZm9yZSByZXRyeS4gKi8KKwlTU1FfREVMQVlfUkFORE9NCT0gMHgyMDAwLCAgLyogUmFuZG9taXplZCBkZWxheSBiZWZvcmUgcmV0cnkuICovCisJU1NRX0ZBTExCQUNLCQk9IDB4NDAwMCwgIC8qIERvIGEgc3BlZWQgZmFsbGJhY2sgdG8gcmVjb3ZlciAqLworCVNTUV9NQVNLCQk9IDB4ZmYwMAorfSBhaWNfc2Vuc2VfYWN0aW9uX3F1YWxpZmllcjsKKworLyogTWFzayBmb3IgZXJyb3Igc3RhdHVzIHZhbHVlcyAqLworI2RlZmluZSBTU19FUlJNQVNLCTB4ZmYKKworLyogVGhlIGRlZmF1bHQsIHJldHlhYmxlLCBlcnJvciBhY3Rpb24gKi8KKyNkZWZpbmUgU1NfUkRFRgkJU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxTU1FfUFJJTlRfU0VOU0V8RUlPCisKKy8qIFRoZSByZXR5YWJsZSwgZXJyb3IgYWN0aW9uLCB3aXRoIHRhYmxlIHNwZWNpZmllZCBlcnJvciBjb2RlICovCisjZGVmaW5lIFNTX1JFVAkJU1NfUkVUUll8U1NRX0RFQ1JFTUVOVF9DT1VOVHxTU1FfUFJJTlRfU0VOU0UKKworLyogRmF0YWwgZXJyb3IgYWN0aW9uLCB3aXRoIHRhYmxlIHNwZWNpZmllZCBlcnJvciBjb2RlICovCisjZGVmaW5lIFNTX0ZBVEFMCVNTX0ZBSUx8U1NRX1BSSU5UX1NFTlNFCisKK3N0cnVjdCBzY3NpX2dlbmVyaWMKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGVzWzExXTsKK307CisKK3N0cnVjdCBzY3NpX3JlcXVlc3Rfc2Vuc2UKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3Rlc3RfdW5pdF9yZWFkeQoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCB1bnVzZWRbM107CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfc2VuZF9kaWFnCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsKKyNkZWZpbmUJU1NEX1VPTAkJMHgwMQorI2RlZmluZQlTU0RfRE9MCQkweDAyCisjZGVmaW5lCVNTRF9TRUxGVEVTVAkweDA0CisjZGVmaW5lCVNTRF9QRgkJMHgxMAorCXVpbnQ4X3QgdW51c2VkWzFdOworCXVpbnQ4X3QgcGFyYW1sZW5bMl07CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfc2Vuc2UKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnkKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworI2RlZmluZQlTSV9FVlBEIDB4MDEKKwl1aW50OF90IHBhZ2VfY29kZTsKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfc2Vuc2VfNgoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisjZGVmaW5lCVNNU19EQkQJCQkJMHgwOAorCXVpbnQ4X3QgcGFnZTsKKyNkZWZpbmUJU01TX1BBR0VfQ09ERSAJCQkweDNGCisjZGVmaW5lIFNNU19WRU5ET1JfU1BFQ0lGSUNfUEFHRQkweDAwCisjZGVmaW5lIFNNU19ESVNDT05ORUNUX1JFQ09OTkVDVF9QQUdFCTB4MDIKKyNkZWZpbmUgU01TX1BFUklQSEVSQUxfREVWSUNFX1BBR0UJMHgwOQorI2RlZmluZSBTTVNfQ09OVFJPTF9NT0RFX1BBR0UJCTB4MEEKKyNkZWZpbmUgU01TX0FMTF9QQUdFU19QQUdFCQkweDNGCisjZGVmaW5lCVNNU19QQUdFX0NUUkxfTUFTSwkJMHhDMAorI2RlZmluZQlTTVNfUEFHRV9DVFJMX0NVUlJFTlQgCQkweDAwCisjZGVmaW5lCVNNU19QQUdFX0NUUkxfQ0hBTkdFQUJMRSAJMHg0MAorI2RlZmluZQlTTVNfUEFHRV9DVFJMX0RFRkFVTFQgCQkweDgwCisjZGVmaW5lCVNNU19QQUdFX0NUUkxfU0FWRUQgCQkweEMwCisJdWludDhfdCB1bnVzZWQ7CisJdWludDhfdCBsZW5ndGg7CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9zZW5zZV8xMAoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CQkvKiBzYW1lIGJpdHMgYXMgc21hbGwgdmVyc2lvbiAqLworCXVpbnQ4X3QgcGFnZTsgCQkvKiBzYW1lIGJpdHMgYXMgc21hbGwgdmVyc2lvbiAqLworCXVpbnQ4X3QgdW51c2VkWzRdOworCXVpbnQ4X3QgbGVuZ3RoWzJdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfc2VsZWN0XzYKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworI2RlZmluZQlTTVNfU1AJMHgwMQorI2RlZmluZQlTTVNfUEYJMHgxMAorCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX21vZGVfc2VsZWN0XzEwCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsJCS8qIHNhbWUgYml0cyBhcyBzbWFsbCB2ZXJzaW9uICovCisJdWludDhfdCB1bnVzZWRbNV07CisJdWludDhfdCBsZW5ndGhbMl07CisJdWludDhfdCBjb250cm9sOworfTsKKworLyoKKyAqIFdoZW4gc2VuZGluZyBhIG1vZGUgc2VsZWN0IHRvIGEgdGFwZSBkcml2ZSwgdGhlIG1lZGl1bSB0eXBlIG11c3QgYmUgMC4KKyAqLworc3RydWN0IHNjc2lfbW9kZV9oZHJfNgoreworCXVpbnQ4X3QgZGF0YWxlbjsKKwl1aW50OF90IG1lZGl1bV90eXBlOworCXVpbnQ4X3QgZGV2X3NwZWNpZmljOworCXVpbnQ4X3QgYmxvY2tfZGVzY3JfbGVuOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9oZHJfMTAKK3sKKwl1aW50OF90IGRhdGFsZW5bMl07CisJdWludDhfdCBtZWRpdW1fdHlwZTsKKwl1aW50OF90IGRldl9zcGVjaWZpYzsKKwl1aW50OF90IHJlc2VydmVkWzJdOworCXVpbnQ4X3QgYmxvY2tfZGVzY3JfbGVuWzJdOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9ibG9ja19kZXNjcgoreworCXVpbnQ4X3QgZGVuc2l0eV9jb2RlOworCXVpbnQ4X3QgbnVtX2Jsb2Nrc1szXTsKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgYmxvY2tfbGVuWzNdOworfTsKKworc3RydWN0IHNjc2lfbG9nX3NlbnNlCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsKKyNkZWZpbmUJU0xTX1NQCQkJCTB4MDEKKyNkZWZpbmUJU0xTX1BQQwkJCQkweDAyCisJdWludDhfdCBwYWdlOworI2RlZmluZQlTTFNfUEFHRV9DT0RFIAkJCTB4M0YKKyNkZWZpbmUJU0xTX0FMTF9QQUdFU19QQUdFCQkweDAwCisjZGVmaW5lCVNMU19PVkVSUlVOX1BBR0UJCTB4MDEKKyNkZWZpbmUJU0xTX0VSUk9SX1dSSVRFX1BBR0UJCTB4MDIKKyNkZWZpbmUJU0xTX0VSUk9SX1JFQURfUEFHRQkJMHgwMworI2RlZmluZQlTTFNfRVJST1JfUkVBRFJFVkVSU0VfUEFHRQkweDA0CisjZGVmaW5lCVNMU19FUlJPUl9WRVJJRllfUEFHRQkJMHgwNQorI2RlZmluZQlTTFNfRVJST1JfTk9OTUVESVVNX1BBR0UJMHgwNgorI2RlZmluZQlTTFNfRVJST1JfTEFTVE5fUEFHRQkJMHgwNworI2RlZmluZQlTTFNfUEFHRV9DVFJMX01BU0sJCTB4QzAKKyNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9USFJFU0hPTEQJCTB4MDAKKyNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9DVU1VTEFUSVZFCTB4NDAKKyNkZWZpbmUJU0xTX1BBR0VfQ1RSTF9USFJFU0hfREVGQVVMVAkweDgwCisjZGVmaW5lCVNMU19QQUdFX0NUUkxfQ1VNVUxfREVGQVVMVAkweEMwCisJdWludDhfdCByZXNlcnZlZFsyXTsKKwl1aW50OF90IHBhcmFtcHRyWzJdOworCXVpbnQ4X3QgbGVuZ3RoWzJdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX2xvZ19zZWxlY3QKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworLyoJU0xTX1NQCQkJCTB4MDEgKi8KKyNkZWZpbmUJU0xTX1BDUgkJCQkweDAyCisJdWludDhfdCBwYWdlOworLyoJU0xTX1BBR0VfQ1RSTF9NQVNLCQkweEMwICovCisvKglTTFNfUEFHRV9DVFJMX1RIUkVTSE9MRAkJMHgwMCAqLworLyoJU0xTX1BBR0VfQ1RSTF9DVU1VTEFUSVZFCTB4NDAgKi8KKy8qCVNMU19QQUdFX0NUUkxfVEhSRVNIX0RFRkFVTFQJMHg4MCAqLworLyoJU0xTX1BBR0VfQ1RSTF9DVU1VTF9ERUZBVUxUCTB4QzAgKi8KKwl1aW50OF90IHJlc2VydmVkWzRdOworCXVpbnQ4X3QgbGVuZ3RoWzJdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX2xvZ19oZWFkZXIKK3sKKwl1aW50OF90IHBhZ2U7CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGRhdGFsZW5bMl07Cit9OworCitzdHJ1Y3Qgc2NzaV9sb2dfcGFyYW1faGVhZGVyIHsKKwl1aW50OF90IHBhcmFtX2NvZGVbMl07CisJdWludDhfdCBwYXJhbV9jb250cm9sOworI2RlZmluZQlTTFBfTFAJCQkJMHgwMQorI2RlZmluZQlTTFBfTEJJTgkJCTB4MDIKKyNkZWZpbmUJU0xQX1RNQ19NQVNLCQkJMHgwQworI2RlZmluZQlTTFBfVE1DX0FMV0FZUwkJCTB4MDAKKyNkZWZpbmUJU0xQX1RNQ19FUVVBTAkJCTB4MDQKKyNkZWZpbmUJU0xQX1RNQ19OT1RFUVVBTAkJMHgwOAorI2RlZmluZQlTTFBfVE1DX0dSRUFURVIJCQkweDBDCisjZGVmaW5lCVNMUF9FVEMJCQkJMHgxMAorI2RlZmluZQlTTFBfVFNECQkJCTB4MjAKKyNkZWZpbmUJU0xQX0RTCQkJCTB4NDAKKyNkZWZpbmUJU0xQX0RVCQkJCTB4ODAKKwl1aW50OF90IHBhcmFtX2xlbjsKK307CisKK3N0cnVjdCBzY3NpX2NvbnRyb2xfcGFnZSB7CisJdWludDhfdCBwYWdlX2NvZGU7CisJdWludDhfdCBwYWdlX2xlbmd0aDsKKwl1aW50OF90IHJsZWM7CisjZGVmaW5lIFNDQl9STEVDCQkJMHgwMQkvKlJlcG9ydCBMb2cgRXhjZXB0aW9uIENvbmQqLworCXVpbnQ4X3QgcXVldWVfZmxhZ3M7CisjZGVmaW5lIFNDUF9RVUVVRV9BTEdfTUFTSwkJMHhGMAorI2RlZmluZSBTQ1BfUVVFVUVfQUxHX1JFU1RSSUNURUQJMHgwMAorI2RlZmluZSBTQ1BfUVVFVUVfQUxHX1VOUkVTVFJJQ1RFRAkweDEwCisjZGVmaW5lIFNDUF9RVUVVRV9FUlIJCQkweDAyCS8qUXVldWVkIEkvTyBhYm9ydGVkIGZvciBDQUNzKi8KKyNkZWZpbmUgU0NQX1FVRVVFX0RRVUUJCQkweDAxCS8qUXVldWVkIEkvTyBkaXNhYmxlZCovCisJdWludDhfdCBlY2FfYW5kX2FlbjsKKyNkZWZpbmUgU0NQX0VFQ0EJCQkweDgwCS8qRW5hYmxlIEV4dGVuZGVkIENBKi8KKyNkZWZpbmUgU0NQX1JBRU5QCQkJMHgwNAkvKlJlYWR5IEFFTiBQZXJtaXNzaW9uKi8KKyNkZWZpbmUgU0NQX1VBQUVOUAkJCTB4MDIJLypVQSBBRU4gUGVybWlzc2lvbiovCisjZGVmaW5lIFNDUF9FQUVOUAkJCTB4MDEJLypFcnJvciBBRU4gUGVybWlzc2lvbiovCisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGFlbl9ob2xkb2ZmX3BlcmlvZFsyXTsKK307CisKK3N0cnVjdCBzY3NpX3Jlc2VydmUKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3JlbGVhc2UKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3ByZXZlbnQKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgaG93OworCXVpbnQ4X3QgY29udHJvbDsKK307CisjZGVmaW5lCVBSX1BSRVZFTlQgMHgwMQorI2RlZmluZSBQUl9BTExPVyAgIDB4MDAKKworc3RydWN0IHNjc2lfc3luY19jYWNoZQoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCBiZWdpbl9sYmFbNF07CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGxiX2NvdW50WzJdOworCXVpbnQ4X3QgY29udHJvbDsJCit9OworCisKK3N0cnVjdCBzY3NpX2NoYW5nZWRlZgoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCB1bnVzZWQxOworCXVpbnQ4X3QgaG93OworCXVpbnQ4X3QgdW51c2VkWzRdOworCXVpbnQ4X3QgZGF0YWxlbjsKKwl1aW50OF90IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV9yZWFkX2J1ZmZlcgoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisjZGVmaW5lCVJXQl9NT0RFCQkweDA3CisjZGVmaW5lCVJXQl9NT0RFX0hEUl9EQVRBCTB4MDAKKyNkZWZpbmUJUldCX01PREVfREFUQQkJMHgwMgorI2RlZmluZQlSV0JfTU9ERV9ET1dOTE9BRAkweDA0CisjZGVmaW5lCVJXQl9NT0RFX0RPV05MT0FEX1NBVkUJMHgwNQorICAgICAgICB1aW50OF90IGJ1ZmZlcl9pZDsKKyAgICAgICAgdWludDhfdCBvZmZzZXRbM107CisgICAgICAgIHVpbnQ4X3QgbGVuZ3RoWzNdOworICAgICAgICB1aW50OF90IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV93cml0ZV9idWZmZXIKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworCXVpbnQ4X3QgYnVmZmVyX2lkOworCXVpbnQ4X3Qgb2Zmc2V0WzNdOworCXVpbnQ4X3QgbGVuZ3RoWzNdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3J3XzYKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGFkZHJbM107CisvKiBvbmx5IDUgYml0cyBhcmUgdmFsaWQgaW4gdGhlIE1TQiBhZGRyZXNzIGJ5dGUgKi8KKyNkZWZpbmUJU1JXX1RPUEFERFIJMHgxRgorCXVpbnQ4X3QgbGVuZ3RoOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3J3XzEwCit7CisJdWludDhfdCBvcGNvZGU7CisjZGVmaW5lCVNSVzEwX1JFTEFERFIJMHgwMQorI2RlZmluZSBTUlcxMF9GVUEJMHgwOAorI2RlZmluZQlTUlcxMF9EUE8JMHgxMAorCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCBhZGRyWzRdOworCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJdWludDhfdCBsZW5ndGhbMl07CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfcndfMTIKK3sKKwl1aW50OF90IG9wY29kZTsKKyNkZWZpbmUJU1JXMTJfUkVMQUREUgkweDAxCisjZGVmaW5lIFNSVzEyX0ZVQQkweDA4CisjZGVmaW5lCVNSVzEyX0RQTwkweDEwCisJdWludDhfdCBieXRlMjsKKwl1aW50OF90IGFkZHJbNF07CisJdWludDhfdCBsZW5ndGhbNF07CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50OF90IGNvbnRyb2w7Cit9OworCitzdHJ1Y3Qgc2NzaV9zdGFydF9zdG9wX3VuaXQKK3sKKwl1aW50OF90IG9wY29kZTsKKwl1aW50OF90IGJ5dGUyOworI2RlZmluZQlTU1NfSU1NRUQJCTB4MDEKKwl1aW50OF90IHJlc2VydmVkWzJdOworCXVpbnQ4X3QgaG93OworI2RlZmluZQlTU1NfU1RBUlQJCTB4MDEKKyNkZWZpbmUJU1NTX0xPRUoJCTB4MDIKKwl1aW50OF90IGNvbnRyb2w7Cit9OworCisjZGVmaW5lIFNDX1NDU0lfMSAweDAxCisjZGVmaW5lIFNDX1NDU0lfMiAweDAzCisKKy8qCisgKiBPcGNvZGVzCisgKi8KKworI2RlZmluZQlURVNUX1VOSVRfUkVBRFkJCTB4MDAKKyNkZWZpbmUgUkVRVUVTVF9TRU5TRQkJMHgwMworI2RlZmluZQlSRUFEXzYJCQkweDA4CisjZGVmaW5lIFdSSVRFXzYJCQkweDBhCisjZGVmaW5lIElOUVVJUlkJCQkweDEyCisjZGVmaW5lIE1PREVfU0VMRUNUXzYJCTB4MTUKKyNkZWZpbmUgTU9ERV9TRU5TRV82CQkweDFhCisjZGVmaW5lIFNUQVJUX1NUT1BfVU5JVAkJMHgxYgorI2RlZmluZSBTVEFSVF9TVE9QCQkweDFiCisjZGVmaW5lIFJFU0VSVkUgICAgICAJCTB4MTYKKyNkZWZpbmUgUkVMRUFTRSAgICAgIAkJMHgxNworI2RlZmluZQlSRUNFSVZFX0RJQUdOT1NUSUMJMHgxYworI2RlZmluZQlTRU5EX0RJQUdOT1NUSUMJCTB4MWQKKyNkZWZpbmUgUFJFVkVOVF9BTExPVwkJMHgxZQorI2RlZmluZQlSRUFEX0NBUEFDSVRZCQkweDI1CisjZGVmaW5lCVJFQURfMTAJCQkweDI4CisjZGVmaW5lIFdSSVRFXzEwCQkweDJhCisjZGVmaW5lIFBPU0lUSU9OX1RPX0VMRU1FTlQJMHgyYgorI2RlZmluZQlTWU5DSFJPTklaRV9DQUNIRQkweDM1CisjZGVmaW5lCVdSSVRFX0JVRkZFUiAgICAgICAgICAgIDB4M2IKKyNkZWZpbmUJUkVBRF9CVUZGRVIgICAgICAgICAgICAgMHgzYworI2RlZmluZQlDSEFOR0VfREVGSU5JVElPTgkweDQwCisjZGVmaW5lCUxPR19TRUxFQ1QJCTB4NGMKKyNkZWZpbmUJTE9HX1NFTlNFCQkweDRkCisjaWZkZWYgWFhYQ0FNCisjZGVmaW5lCU1PREVfU0VOU0VfMTAJCTB4NUEKKyNlbmRpZgorI2RlZmluZQlNT0RFX1NFTEVDVF8xMAkJMHg1NQorI2RlZmluZSBNT1ZFX01FRElVTSAgICAgCTB4YTUKKyNkZWZpbmUgUkVBRF8xMgkJCTB4YTgKKyNkZWZpbmUgV1JJVEVfMTIJCTB4YWEKKyNkZWZpbmUgUkVBRF9FTEVNRU5UX1NUQVRVUwkweGI4CisKKworLyoKKyAqIERldmljZSBUeXBlcworICovCisjZGVmaW5lIFRfRElSRUNUCTB4MDAKKyNkZWZpbmUgVF9TRVFVRU5USUFMCTB4MDEKKyNkZWZpbmUgVF9QUklOVEVSCTB4MDIKKyNkZWZpbmUgVF9QUk9DRVNTT1IJMHgwMworI2RlZmluZSBUX1dPUk0JCTB4MDQKKyNkZWZpbmUgVF9DRFJPTQkJMHgwNQorI2RlZmluZSBUX1NDQU5ORVIgCTB4MDYKKyNkZWZpbmUgVF9PUFRJQ0FMIAkweDA3CisjZGVmaW5lIFRfQ0hBTkdFUgkweDA4CisjZGVmaW5lIFRfQ09NTQkJMHgwOQorI2RlZmluZSBUX0FTQzAJCTB4MGEKKyNkZWZpbmUgVF9BU0MxCQkweDBiCisjZGVmaW5lCVRfU1RPUkFSUkFZCTB4MGMKKyNkZWZpbmUJVF9FTkNMT1NVUkUJMHgwZAorI2RlZmluZQlUX1JCQwkJMHgwZQorI2RlZmluZQlUX09DUlcJCTB4MGYKKyNkZWZpbmUgVF9OT0RFVklDRQkweDFGCisjZGVmaW5lCVRfQU5ZCQkweEZGCS8qIFVzZWQgaW4gUXVpcmsgdGFibGUgbWF0Y2hlcyAqLworCisjZGVmaW5lIFRfUkVNT1YJCTEKKyNkZWZpbmUJVF9GSVhFRAkJMAorCisvKgorICogVGhpcyBsZW5ndGggaXMgdGhlIGluaXRpYWwgaW5xdWlyeSBsZW5ndGggdXNlZCBieSB0aGUgcHJvYmUgY29kZSwgYXMgICAgCisgKiB3ZWxsIGFzIHRoZSBsZWdudGggbmVjZXNzYXJ5IGZvciBhaWNfcHJpbnRfaW5xdWlyeSgpIHRvIGZ1bmN0aW9uIAorICogY29ycmVjdGx5LiAgSWYgZWl0aGVyIHVzZSByZXF1aXJlcyBhIGRpZmZlcmVudCBsZW5ndGggaW4gdGhlIGZ1dHVyZSwgCisgKiB0aGUgdHdvIHZhbHVlcyBzaG91bGQgYmUgZGUtY291cGxlZC4KKyAqLworI2RlZmluZQlTSE9SVF9JTlFVSVJZX0xFTkdUSAkzNgorCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEKK3sKKwl1aW50OF90IGRldmljZTsKKyNkZWZpbmUJU0lEX1RZUEUoaW5xX2RhdGEpICgoaW5xX2RhdGEpLT5kZXZpY2UgJiAweDFmKQorI2RlZmluZQlTSURfUVVBTChpbnFfZGF0YSkgKCgoaW5xX2RhdGEpLT5kZXZpY2UgJiAweEUwKSA+PiA1KQorI2RlZmluZQlTSURfUVVBTF9MVV9DT05ORUNURUQJMHgwMAkvKgorCQkJCQkgKiBUaGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgZGV2aWNlCisJCQkJCSAqIHR5cGUgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0bworCQkJCQkgKiBsb2dpY2FsIHVuaXQuICBJZiB0aGUgdGFyZ2V0IGNhbm5vdAorCQkJCQkgKiBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBwaHlzaWNhbAorCQkJCQkgKiBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZCwgaXQKKwkJCQkJICogc2hhbGwgYWxzbyB1c2UgdGhpcyBwZXJpcGhlcmFsCisJCQkJCSAqIHF1YWxpZmllciB3aGVuIHJldHVybmluZyB0aGUgSU5RVUlSWQorCQkJCQkgKiBkYXRhLiAgVGhpcyBwZXJpcGhlcmFsIHF1YWxpZmllcgorCQkJCQkgKiBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGRldmljZSBpcworCQkJCQkgKiByZWFkeSBmb3IgYWNjZXNzIGJ5IHRoZSBpbml0aWF0b3IuCisJCQkJCSAqLworI2RlZmluZQlTSURfUVVBTF9MVV9PRkZMSU5FCTB4MDEJLyoKKwkJCQkJICogVGhlIHRhcmdldCBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcKKwkJCQkJICogdGhlIHNwZWNpZmllZCBwZXJpcGhlcmFsIGRldmljZSB0eXBlCisJCQkJCSAqIG9uIHRoaXMgbG9naWNhbCB1bml0OyBob3dldmVyLCB0aGUKKwkJCQkJICogcGh5c2ljYWwgZGV2aWNlIGlzIG5vdCBjdXJyZW50bHkKKwkJCQkJICogY29ubmVjdGVkIHRvIHRoaXMgbG9naWNhbCB1bml0LgorCQkJCQkgKi8KKyNkZWZpbmUgU0lEX1FVQUxfUlNWRAkJMHgwMgorI2RlZmluZQlTSURfUVVBTF9CQURfTFUJCTB4MDMJLyoKKwkJCQkJICogVGhlIHRhcmdldCBpcyBub3QgY2FwYWJsZSBvZgorCQkJCQkgKiBzdXBwb3J0aW5nIGEgcGh5c2ljYWwgZGV2aWNlIG9uCisJCQkJCSAqIHRoaXMgbG9naWNhbCB1bml0LiBGb3IgdGhpcworCQkJCQkgKiBwZXJpcGhlcmFsIHF1YWxpZmllciB0aGUgcGVyaXBoZXJhbAorCQkJCQkgKiBkZXZpY2UgdHlwZSBzaGFsbCBiZSBzZXQgdG8gMUZoIHRvCisJCQkJCSAqIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzCisJCQkJCSAqIHZlcnNpb25zIG9mIFNDU0kuIEFsbCBvdGhlcgorCQkJCQkgKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlIHZhbHVlcyBhcmUKKwkJCQkJICogcmVzZXJ2ZWQgZm9yIHRoaXMgcGVyaXBoZXJhbAorCQkJCQkgKiBxdWFsaWZpZXIuCisJCQkJCSAqLworI2RlZmluZQlTSURfUVVBTF9JU19WRU5ET1JfVU5JUVVFKGlucV9kYXRhKSAoKFNJRF9RVUFMKGlucV9kYXRhKSAmIDB4MDgpICE9IDApCisJdWludDhfdCBkZXZfcXVhbDI7CisjZGVmaW5lCVNJRF9RVUFMMgkweDdGCisjZGVmaW5lCVNJRF9JU19SRU1PVkFCTEUoaW5xX2RhdGEpICgoKGlucV9kYXRhKS0+ZGV2X3F1YWwyICYgMHg4MCkgIT0gMCkKKwl1aW50OF90IHZlcnNpb247CisjZGVmaW5lIFNJRF9BTlNJX1JFVihpbnFfZGF0YSkgKChpbnFfZGF0YSktPnZlcnNpb24gJiAweDA3KQorI2RlZmluZQkJU0NTSV9SRVZfMAkJMAorI2RlZmluZQkJU0NTSV9SRVZfQ0NTCQkxCisjZGVmaW5lCQlTQ1NJX1JFVl8yCQkyCisjZGVmaW5lCQlTQ1NJX1JFVl9TUEMJCTMKKyNkZWZpbmUJCVNDU0lfUkVWX1NQQzIJCTQKKworI2RlZmluZSBTSURfRUNNQQkweDM4CisjZGVmaW5lIFNJRF9JU08JCTB4QzAKKwl1aW50OF90IHJlc3BvbnNlX2Zvcm1hdDsKKyNkZWZpbmUgU0lEX0FFTkMJMHg4MAorI2RlZmluZSBTSURfVHJtSU9QCTB4NDAKKwl1aW50OF90IGFkZGl0aW9uYWxfbGVuZ3RoOworCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07CisJdWludDhfdCBmbGFnczsKKyNkZWZpbmUJU0lEX1NmdFJlCTB4MDEKKyNkZWZpbmUJU0lEX0NtZFF1ZQkweDAyCisjZGVmaW5lCVNJRF9MaW5rZWQJMHgwOAorI2RlZmluZQlTSURfU3luYwkweDEwCisjZGVmaW5lCVNJRF9XQnVzMTYJMHgyMAorI2RlZmluZQlTSURfV0J1czMyCTB4NDAKKyNkZWZpbmUJU0lEX1JlbEFkcgkweDgwCisjZGVmaW5lIFNJRF9WRU5ET1JfU0laRSAgIDgKKwljaGFyCSB2ZW5kb3JbU0lEX1ZFTkRPUl9TSVpFXTsKKyNkZWZpbmUgU0lEX1BST0RVQ1RfU0laRSAgMTYKKwljaGFyCSBwcm9kdWN0W1NJRF9QUk9EVUNUX1NJWkVdOworI2RlZmluZSBTSURfUkVWSVNJT05fU0laRSA0CisJY2hhcgkgcmV2aXNpb25bU0lEX1JFVklTSU9OX1NJWkVdOworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgd2VyZSB0YWtlbiBmcm9tIFNDU0kgUHJpbWFyeSBDb21tYW5kcyAtIDIKKwkgKiAoU1BDLTIpIFJldmlzaW9uIDE0LCBEYXRlZCAxMSBOb3ZlbWJlciAxOTk5CisJICovCisjZGVmaW5lCVNJRF9WRU5ET1JfU1BFQ0lGSUNfMF9TSVpFCTIwCisJdWludDhfdCB2ZW5kb3Jfc3BlY2lmaWMwW1NJRF9WRU5ET1JfU1BFQ0lGSUNfMF9TSVpFXTsKKwkvKgorCSAqIEFuIGV4dGVuc2lvbiBvZiBTQ1NJIFBhcmFsbGVsIFNwZWNpZmljIFZhbHVlcworCSAqLworI2RlZmluZQlTSURfU1BJX0lVUwkJMHgwMQorI2RlZmluZQlTSURfU1BJX1FBUwkJMHgwMgorI2RlZmluZQlTSURfU1BJX0NMT0NLX1NUCTB4MDAKKyNkZWZpbmUJU0lEX1NQSV9DTE9DS19EVAkweDA0CisjZGVmaW5lCVNJRF9TUElfQ0xPQ0tfRFRfU1QJMHgwQworI2RlZmluZQlTSURfU1BJX01BU0sJCTB4MEYKKwl1aW50OF90IHNwaTNkYXRhOworCXVpbnQ4X3QgcmVzZXJ2ZWQyOworCS8qCisJICogVmVyc2lvbiBEZXNjcmlwdG9ycywgc3RvcmVkIDIgYnl0ZSB2YWx1ZXMuCisJICovCisJdWludDhfdCB2ZXJzaW9uMVsyXTsKKwl1aW50OF90IHZlcnNpb24yWzJdOworCXVpbnQ4X3QgdmVyc2lvbjNbMl07CisJdWludDhfdCB2ZXJzaW9uNFsyXTsKKwl1aW50OF90IHZlcnNpb241WzJdOworCXVpbnQ4X3QgdmVyc2lvbjZbMl07CisJdWludDhfdCB2ZXJzaW9uN1syXTsKKwl1aW50OF90IHZlcnNpb244WzJdOworCisJdWludDhfdCByZXNlcnZlZDNbMjJdOworCisjZGVmaW5lCVNJRF9WRU5ET1JfU1BFQ0lGSUNfMV9TSVpFCTE2MAorCXVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljMVtTSURfVkVORE9SX1NQRUNJRklDXzFfU0laRV07Cit9OworCitzdHJ1Y3Qgc2NzaV92cGRfdW5pdF9zZXJpYWxfbnVtYmVyCit7CisJdWludDhfdCBkZXZpY2U7CisJdWludDhfdCBwYWdlX2NvZGU7CisjZGVmaW5lIFNWUERfVU5JVF9TRVJJQUxfTlVNQkVSCTB4ODAKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgbGVuZ3RoOyAvKiBzZXJpYWwgbnVtYmVyIGxlbmd0aCAqLworI2RlZmluZSBTVlBEX1NFUklBTF9OVU1fU0laRSAyNTEKKwl1aW50OF90IHNlcmlhbF9udW1bU1ZQRF9TRVJJQUxfTlVNX1NJWkVdOworfTsKKworc3RydWN0IHNjc2lfcmVhZF9jYXBhY2l0eQoreworCXVpbnQ4X3Qgb3Bjb2RlOworCXVpbnQ4X3QgYnl0ZTI7CisJdWludDhfdCBhZGRyWzRdOworCXVpbnQ4X3QgdW51c2VkWzNdOworCXVpbnQ4X3QgY29udHJvbDsKK307CisKK3N0cnVjdCBzY3NpX3JlYWRfY2FwYWNpdHlfZGF0YQoreworCXVpbnQ4X3QgYWRkcls0XTsKKwl1aW50OF90IGxlbmd0aFs0XTsKK307CisKK3N0cnVjdCBzY3NpX3JlcG9ydF9sdW5zCit7CisJdWludDhfdCBvcGNvZGU7CisJdWludDhfdCBieXRlMjsKKwl1aW50OF90IHVudXNlZFszXTsKKwl1aW50OF90IGFkZHJbNF07CisJdWludDhfdCBjb250cm9sOworfTsKKworc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YSB7CisJdWludDhfdCBsZW5ndGhbNF07CS8qIGxlbmd0aCBvZiBMVU4gaW52ZW50b3J5LCBpbiBieXRlcyAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRbNF07CS8qIHVudXNlZCAqLworCS8qCisJICogTFVOIGludmVudG9yeS0gd2Ugb25seSBzdXBwb3J0IHRoZSB0eXBlIHplcm8gZm9ybSBmb3Igbm93LgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQ4X3QgbHVuZGF0YVs4XTsKKwl9IGx1bnNbMV07Cit9OworI2RlZmluZQlSUExfTFVOREFUQV9BVFlQX01BU0sJMHhjMAkvKiBNQlogZm9yIHR5cGUgMCBsdW4gKi8KKyNkZWZpbmUJUlBMX0xVTkRBVEFfVDBMVU4JMQkvKiBAIGx1bmRhdGFbMV0gKi8KKworCitzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhCit7CisJdWludDhfdCBlcnJvcl9jb2RlOworI2RlZmluZQlTU0RfRVJSQ09ERQkJCTB4N0YKKyNkZWZpbmUJCVNTRF9DVVJSRU5UX0VSUk9SCTB4NzAKKyNkZWZpbmUJCVNTRF9ERUZFUlJFRF9FUlJPUgkweDcxCisjZGVmaW5lCVNTRF9FUlJDT0RFX1ZBTElECTB4ODAJCisJdWludDhfdCBzZWdtZW50OworCXVpbnQ4X3QgZmxhZ3M7CisjZGVmaW5lCVNTRF9LRVkJCQkJMHgwRgorI2RlZmluZQkJU1NEX0tFWV9OT19TRU5TRQkweDAwCisjZGVmaW5lCQlTU0RfS0VZX1JFQ09WRVJFRF9FUlJPUgkweDAxCisjZGVmaW5lCQlTU0RfS0VZX05PVF9SRUFEWQkweDAyCisjZGVmaW5lCQlTU0RfS0VZX01FRElVTV9FUlJPUgkweDAzCisjZGVmaW5lCQlTU0RfS0VZX0hBUkRXQVJFX0VSUk9SCTB4MDQKKyNkZWZpbmUJCVNTRF9LRVlfSUxMRUdBTF9SRVFVRVNUCTB4MDUKKyNkZWZpbmUJCVNTRF9LRVlfVU5JVF9BVFRFTlRJT04JMHgwNgorI2RlZmluZQkJU1NEX0tFWV9EQVRBX1BST1RFQ1QJMHgwNworI2RlZmluZQkJU1NEX0tFWV9CTEFOS19DSEVDSwkweDA4CisjZGVmaW5lCQlTU0RfS0VZX1ZlbmRvcl9TcGVjaWZpYwkweDA5CisjZGVmaW5lCQlTU0RfS0VZX0NPUFlfQUJPUlRFRAkweDBhCisjZGVmaW5lCQlTU0RfS0VZX0FCT1JURURfQ09NTUFORAkweDBiCQkKKyNkZWZpbmUJCVNTRF9LRVlfRVFVQUwJCTB4MGMKKyNkZWZpbmUJCVNTRF9LRVlfVk9MVU1FX09WRVJGTE9XCTB4MGQKKyNkZWZpbmUJCVNTRF9LRVlfTUlTQ09NUEFSRQkweDBlCisjZGVmaW5lCQlTU0RfS0VZX1JFU0VSVkVECTB4MGYJCQkKKyNkZWZpbmUJU1NEX0lMSQkJMHgyMAorI2RlZmluZQlTU0RfRU9NCQkweDQwCisjZGVmaW5lCVNTRF9GSUxFTUFSSwkweDgwCisJdWludDhfdCBpbmZvWzRdOworCXVpbnQ4X3QgZXh0cmFfbGVuOworCXVpbnQ4X3QgY21kX3NwZWNfaW5mb1s0XTsKKwl1aW50OF90IGFkZF9zZW5zZV9jb2RlOworCXVpbnQ4X3QgYWRkX3NlbnNlX2NvZGVfcXVhbDsKKwl1aW50OF90IGZydTsKKwl1aW50OF90IHNlbnNlX2tleV9zcGVjWzNdOworI2RlZmluZQlTU0RfU0NTX1ZBTElECQkweDgwCisjZGVmaW5lIFNTRF9GSUVMRFBUUl9DTUQJMHg0MAorI2RlZmluZSBTU0RfQklUUFRSX1ZBTElECTB4MDgKKyNkZWZpbmUgU1NEX0JJVFBUUl9WQUxVRQkweDA3CisjZGVmaW5lIFNTRF9NSU5fU0laRSAxOAorCXVpbnQ4X3QgZXh0cmFfYnl0ZXNbMTRdOworI2RlZmluZSBTU0RfRlVMTF9TSVpFIHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQorfTsKKworc3RydWN0IHNjc2lfbW9kZV9oZWFkZXJfNgoreworCXVpbnQ4X3QgZGF0YV9sZW5ndGg7CS8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCisJdWludDhfdCBtZWRpdW1fdHlwZTsKKwl1aW50OF90IGRldl9zcGVjOworCXVpbnQ4X3QgYmxrX2Rlc2NfbGVuOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9oZWFkZXJfMTAKK3sKKwl1aW50OF90IGRhdGFfbGVuZ3RoWzJdOy8qIFNlbnNlIGRhdGEgbGVuZ3RoICovCisJdWludDhfdCBtZWRpdW1fdHlwZTsKKwl1aW50OF90IGRldl9zcGVjOworCXVpbnQ4X3QgdW51c2VkWzJdOworCXVpbnQ4X3QgYmxrX2Rlc2NfbGVuWzJdOworfTsKKworc3RydWN0IHNjc2lfbW9kZV9wYWdlX2hlYWRlcgoreworCXVpbnQ4X3QgcGFnZV9jb2RlOworCXVpbnQ4X3QgcGFnZV9sZW5ndGg7Cit9OworCitzdHJ1Y3Qgc2NzaV9tb2RlX2Jsa19kZXNjCit7CisJdWludDhfdCBkZW5zaXR5OworCXVpbnQ4X3QgbmJsb2Nrc1szXTsKKwl1aW50OF90IHJlc2VydmVkOworCXVpbnQ4X3QgYmxrbGVuWzNdOworfTsKKworI2RlZmluZQlTQ1NJX0RFRkFVTFRfREVOU0lUWQkweDAwCS8qIHVzZSAnZGVmYXVsdCcgZGVuc2l0eSAqLworI2RlZmluZQlTQ1NJX1NBTUVfREVOU0lUWQkweDdmCS8qIHVzZSAnc2FtZScgZGVuc2l0eS0gPj0gU0NTSS0yIG9ubHkgKi8KKworCisvKgorICogU3RhdHVzIEJ5dGUKKyAqLworI2RlZmluZQlTQ1NJX1NUQVRVU19PSwkJCTB4MDAKKyNkZWZpbmUJU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORAkJMHgwMgorI2RlZmluZQlTQ1NJX1NUQVRVU19DT05EX01FVAkJMHgwNAorI2RlZmluZQlTQ1NJX1NUQVRVU19CVVNZCQkweDA4CisjZGVmaW5lIFNDU0lfU1RBVFVTX0lOVEVSTUVECQkweDEwCisjZGVmaW5lIFNDU0lfU1RBVFVTX0lOVEVSTUVEX0NPTkRfTUVUCTB4MTQKKyNkZWZpbmUgU0NTSV9TVEFUVVNfUkVTRVJWX0NPTkZMSUNUCTB4MTgKKyNkZWZpbmUgU0NTSV9TVEFUVVNfQ01EX1RFUk1JTkFURUQJMHgyMgkvKiBPYnNvbGV0ZSBpbiBTQU0tMiAqLworI2RlZmluZSBTQ1NJX1NUQVRVU19RVUVVRV9GVUxMCQkweDI4CisjZGVmaW5lIFNDU0lfU1RBVFVTX0FDQV9BQ1RJVkUJCTB4MzAKKyNkZWZpbmUgU0NTSV9TVEFUVVNfVEFTS19BQk9SVEVECTB4NDAKKworc3RydWN0IHNjc2lfaW5xdWlyeV9wYXR0ZXJuIHsKKwl1aW50OF90ICAgdHlwZTsKKwl1aW50OF90ICAgbWVkaWFfdHlwZTsKKyNkZWZpbmUJU0lQX01FRElBX1JFTU9WQUJMRQkweDAxCisjZGVmaW5lCVNJUF9NRURJQV9GSVhFRAkJMHgwMgorCWNvbnN0IGNoYXIgKnZlbmRvcjsKKwljb25zdCBjaGFyICpwcm9kdWN0OworCWNvbnN0IGNoYXIgKnJldmlzaW9uOworfTsgCisKK3N0cnVjdCBzY3NpX3N0YXRpY19pbnF1aXJ5X3BhdHRlcm4geworCXVpbnQ4X3QgICB0eXBlOworCXVpbnQ4X3QgICBtZWRpYV90eXBlOworCWNoYXIgICAgICAgdmVuZG9yW1NJRF9WRU5ET1JfU0laRSsxXTsKKwljaGFyICAgICAgIHByb2R1Y3RbU0lEX1BST0RVQ1RfU0laRSsxXTsKKwljaGFyICAgICAgIHJldmlzaW9uW1NJRF9SRVZJU0lPTl9TSVpFKzFdOworfTsKKworc3RydWN0IHNjc2lfc2Vuc2VfcXVpcmtfZW50cnkgeworCXN0cnVjdCBzY3NpX2lucXVpcnlfcGF0dGVybglpbnFfcGF0OworCWludAkJCQludW1fc2Vuc2Vfa2V5czsKKwlpbnQJCQkJbnVtX2FzY3M7CisJc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeQkqc2Vuc2Vfa2V5X2luZm87CisJc3RydWN0IGFzY190YWJsZV9lbnRyeQkJKmFzY19pbmZvOworfTsKKworc3RydWN0IHNlbnNlX2tleV90YWJsZV9lbnRyeSB7CisJdWludDhfdCAgICBzZW5zZV9rZXk7CisJdWludDMyX3QgICBhY3Rpb247CisJY29uc3QgY2hhciAqZGVzYzsKK307CisKK3N0cnVjdCBhc2NfdGFibGVfZW50cnkgeworCXVpbnQ4X3QgICAgYXNjOworCXVpbnQ4X3QgICAgYXNjcTsKKwl1aW50MzJfdCAgIGFjdGlvbjsKKwljb25zdCBjaGFyICpkZXNjOworfTsKKworc3RydWN0IG9wX3RhYmxlX2VudHJ5IHsKKwl1aW50OF90ICAgIG9wY29kZTsKKwl1aW50MTZfdCAgIG9wbWFzazsKKwljb25zdCBjaGFyICAqZGVzYzsKK307CisKK3N0cnVjdCBzY3NpX29wX3F1aXJrX2VudHJ5IHsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3BhdHRlcm4JaW5xX3BhdDsKKwlpbnQJCQkJbnVtX29wczsKKwlzdHJ1Y3Qgb3BfdGFibGVfZW50cnkJCSpvcF90YWJsZTsKK307CisKK3R5cGVkZWYgZW51bSB7CisJU1NTX0ZMQUdfTk9ORQkJPSAweDAwLAorCVNTU19GTEFHX1BSSU5UX0NPTU1BTkQJPSAweDAxCit9IHNjc2lfc2Vuc2Vfc3RyaW5nX2ZsYWdzOworCitleHRlcm4gY29uc3QgY2hhciAqc2NzaV9zZW5zZV9rZXlfdGV4dFtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBMYXJnZSBEaXNrIEhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorc3RhdGljIF9faW5saW5lIGludCBhaWNfc2VjdG9yX2Rpdih1X2xvbmcgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpOworCitzdGF0aWMgX19pbmxpbmUgaW50CithaWNfc2VjdG9yX2Rpdih1X2xvbmcgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpCit7CisJcmV0dXJuIChjYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpKTsKK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmUgaW50IGFpY19zZWN0b3JfZGl2KHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaGVhZHMsIGludCBzZWN0b3JzKTsKKworc3RhdGljIF9faW5saW5lIGludAorYWljX3NlY3Rvcl9kaXYoc2VjdG9yX3QgY2FwYWNpdHksIGludCBoZWFkcywgaW50IHNlY3RvcnMpCit7CisJLyogdWdseSwgdWdseSBzZWN0b3JfZGl2IGNhbGxpbmcgY29udmVudGlvbi4uICovCisJc2VjdG9yX2RpdihjYXBhY2l0eSwgKGhlYWRzICogc2VjdG9ycykpOworCXJldHVybiAoaW50KWNhcGFjaXR5OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1vZHVsZSBMaWJyYXJ5IEhhY2sgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2hhdCB3ZSdkIGxpa2UgdG8gZG8gaXMgaGF2ZSBhIHNpbmdsZSAic2NzaSBsaWJyYXJ5IiBtb2R1bGUgdGhhdCBib3RoIHRoZQorICogYWljN3h4eCBhbmQgYWljNzl4eCBkcml2ZXJzIGNvdWxkIGxvYWQgYW5kIGRlcGVuZCBvbi4gIEEgY3Vyc29yeSBleGFtaW5hdGlvbgorICogb2YgaW1wbGVtZW50aW5nIG1vZHVsZSBkZXBlbmRlbmNpZXMgaW4gTGludXggKGhhbmRsaW5nIHRoZSBpbnN0YWxsIGFuZAorICogaW5pdHJkIGNhc2VzKSBkb2VzIG5vdCBsb29rIHByb21pc3NpbmcuICBGb3Igbm93LCB3ZSBqdXN0IGR1cGxpY2F0ZSB0aGlzCisgKiBjb2RlIGluIGJvdGggZHJpdmVycyB1c2luZyBhIHNpbXBsZSBzeW1ib2wgcmVuYW1pbmcgc2NoZW1lIHRoYXQgaGlkZXMgdGhpcworICogaGFjayBmcm9tIHRoZSBkcml2ZXJzLgorICovCisjZGVmaW5lIEFJQ19MSUJfRU5UUllfQ09OQ0FUKHgsIHByZWZpeCkJcHJlZml4ICMjIHgKKyNkZWZpbmUJQUlDX0xJQl9FTlRSWV9FWFBBTkQoeCwgcHJlZml4KSBBSUNfTElCX0VOVFJZX0NPTkNBVCh4LCBwcmVmaXgpCisjZGVmaW5lIEFJQ19MSUJfRU5UUlkoeCkJCUFJQ19MSUJfRU5UUllfRVhQQU5EKHgsIEFJQ19MSUJfUFJFRklYKQorCisjZGVmaW5lCWFpY19zZW5zZV9kZXNjCQkJQUlDX0xJQl9FTlRSWShfc2Vuc2VfZGVzYykKKyNkZWZpbmUJYWljX3NlbnNlX2Vycm9yX2FjdGlvbgkJQUlDX0xJQl9FTlRSWShfc2Vuc2VfZXJyb3JfYWN0aW9uKQorI2RlZmluZQlhaWNfZXJyb3JfYWN0aW9uCQlBSUNfTElCX0VOVFJZKF9lcnJvcl9hY3Rpb24pCisjZGVmaW5lCWFpY19vcF9kZXNjCQkJQUlDX0xJQl9FTlRSWShfb3BfZGVzYykKKyNkZWZpbmUJYWljX2NkYl9zdHJpbmcJCQlBSUNfTElCX0VOVFJZKF9jZGJfc3RyaW5nKQorI2RlZmluZSBhaWNfcHJpbnRfaW5xdWlyeQkJQUlDX0xJQl9FTlRSWShfcHJpbnRfaW5xdWlyeSkKKyNkZWZpbmUgYWljX2NhbGNfc3luY3NyYXRlCQlBSUNfTElCX0VOVFJZKF9jYWxjX3N5bmNyYXRlKQorI2RlZmluZQlhaWNfY2FsY19zeW5jcGFyYW0JCUFJQ19MSUJfRU5UUlkoX2NhbGNfc3luY3BhcmFtKQorI2RlZmluZQlhaWNfY2FsY19zcGVlZAkJCUFJQ19MSUJfRU5UUlkoX2NhbGNfc3BlZWQpCisjZGVmaW5lCWFpY19pbnF1aXJ5X21hdGNoCQlBSUNfTElCX0VOVFJZKF9pbnF1aXJ5X21hdGNoKQorI2RlZmluZQlhaWNfc3RhdGljX2lucXVpcnlfbWF0Y2gJQUlDX0xJQl9FTlRSWShfc3RhdGljX2lucXVpcnlfbWF0Y2gpCisjZGVmaW5lCWFpY19wYXJzZV9icmFjZV9vcHRpb24JCUFJQ19MSUJfRU5UUlkoX3BhcnNlX2JyYWNlX29wdGlvbikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAkJCWFpY19zZW5zZV9kZXNjKGludCAvKnNlbnNlX2tleSovLCBpbnQgLyphc2MqLywKKwkJCQkgICAgICAgaW50IC8qYXNjcSovLCBzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEqLAorCQkJCSAgICAgICBjb25zdCBjaGFyKiogLypzZW5zZV9rZXlfZGVzYyovLAorCQkJCSAgICAgICBjb25zdCBjaGFyKiogLyphc2NfZGVzYyovKTsKK2FpY19zZW5zZV9hY3Rpb24JYWljX3NlbnNlX2Vycm9yX2FjdGlvbihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKiwKKwkJCQkJICAgICAgIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSosCisJCQkJCSAgICAgICB1aW50MzJfdCAvKnNlbnNlX2ZsYWdzKi8pOwordWludDMyX3QJCWFpY19lcnJvcl9hY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqLAorCQkJCQkgc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICosCisJCQkJCSBjYW1fc3RhdHVzLCB1X2ludCk7CisKKyNkZWZpbmUJU0ZfUkVUUllfVUEJMHgwMQorI2RlZmluZSBTRl9OT19QUklOVAkweDAyCisjZGVmaW5lIFNGX1FVSUVUX0lSCTB4MDQJLyogQmUgcXVpZXQgYWJvdXQgSWxsZWdhbCBSZXF1ZXN0IHJlcG9uc2VzICovCisjZGVmaW5lIFNGX1BSSU5UX0FMV0FZUwkweDA4CisKKworY29uc3QgY2hhciAqCWFpY19vcF9kZXNjKHVpbnQxNl90IC8qb3Bjb2RlKi8sIHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YSopOworY2hhciAqCQlhaWNfY2RiX3N0cmluZyh1aW50OF90KiAvKmNkYl9wdHIqLywgY2hhciogLypjZGJfc3RyaW5nKi8sCisJCQkgICAgICAgc2l6ZV90IC8qbGVuKi8pOwordm9pZAkJYWljX3ByaW50X2lucXVpcnkoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhKik7CisKK3VfaW50CQlhaWNfY2FsY19zeW5jc3JhdGUodV9pbnQgLypwZXJpb2RfZmFjdG9yKi8pOwordV9pbnQJCWFpY19jYWxjX3N5bmNwYXJhbSh1X2ludCAvKnBlcmlvZCovKTsKK3VfaW50CQlhaWNfY2FsY19zcGVlZCh1X2ludCB3aWR0aCwgdV9pbnQgcGVyaW9kLCB1X2ludCBvZmZzZXQsCisJCQkgICAgICAgdV9pbnQgbWluX3JhdGUpOworCQoraW50CQlhaWNfaW5xdWlyeV9tYXRjaChjYWRkcl90IC8qaW5xYnVmZmVyKi8sCisJCQkJICBjYWRkcl90IC8qdGFibGVfZW50cnkqLyk7CitpbnQJCWFpY19zdGF0aWNfaW5xdWlyeV9tYXRjaChjYWRkcl90IC8qaW5xYnVmZmVyKi8sCisJCQkJCSBjYWRkcl90IC8qdGFibGVfZW50cnkqLyk7CisKK3R5cGVkZWYgdm9pZCBhaWNfb3B0aW9uX2NhbGxiYWNrX3QodV9sb25nLCBpbnQsIGludCwgaW50MzJfdCk7CitjaGFyICoJCWFpY19wYXJzZV9icmFjZV9vcHRpb24oY2hhciAqb3B0X25hbWUsIGNoYXIgKm9wdF9hcmcsCisJCQkJICAgICAgIGNoYXIgKmVuZCwgaW50IGRlcHRoLAorCQkJCSAgICAgICBhaWNfb3B0aW9uX2NhbGxiYWNrX3QgKiwgdV9sb25nKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQJIHNjc2lfZXh0cmFjdF9zZW5zZShzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICpzZW5zZSwKKwkJCQkJICAgIGludCAqZXJyb3JfY29kZSwgaW50ICpzZW5zZV9rZXksCisJCQkJCSAgICBpbnQgKmFzYywgaW50ICphc2NxKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX3VsdG8yYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX3VsdG8zYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkCSBzY3NpX3VsdG80Yih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKTsKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdCBzY3NpXzJidG91bCh1aW50OF90ICpieXRlcyk7CitzdGF0aWMgX19pbmxpbmUgdWludDMyX3Qgc2NzaV8zYnRvdWwodWludDhfdCAqYnl0ZXMpOworc3RhdGljIF9faW5saW5lIGludDMyX3QJIHNjc2lfM2J0b2wodWludDhfdCAqYnl0ZXMpOworc3RhdGljIF9faW5saW5lIHVpbnQzMl90IHNjc2lfNGJ0b3VsKHVpbnQ4X3QgKmJ5dGVzKTsKKworc3RhdGljIF9faW5saW5lIHZvaWQgc2NzaV9leHRyYWN0X3NlbnNlKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKnNlbnNlLAorCQkJCSAgICAgICBpbnQgKmVycm9yX2NvZGUsIGludCAqc2Vuc2Vfa2V5LAorCQkJCSAgICAgICBpbnQgKmFzYywgaW50ICphc2NxKQoreworCSplcnJvcl9jb2RlID0gc2Vuc2UtPmVycm9yX2NvZGUgJiBTU0RfRVJSQ09ERTsKKwkqc2Vuc2Vfa2V5ID0gc2Vuc2UtPmZsYWdzICYgU1NEX0tFWTsKKwkqYXNjID0gKHNlbnNlLT5leHRyYV9sZW4gPj0gNSkgPyBzZW5zZS0+YWRkX3NlbnNlX2NvZGUgOiAwOworCSphc2NxID0gKHNlbnNlLT5leHRyYV9sZW4gPj0gNikgPyBzZW5zZS0+YWRkX3NlbnNlX2NvZGVfcXVhbCA6IDA7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzY3NpX3VsdG8yYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKQoreworCisJYnl0ZXNbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlieXRlc1sxXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzY3NpX3VsdG8zYih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKQoreworCisJYnl0ZXNbMF0gPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJYnl0ZXNbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlieXRlc1syXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzY3NpX3VsdG80Yih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ5dGVzKQoreworCisJYnl0ZXNbMF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisJYnl0ZXNbMV0gPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJYnl0ZXNbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKKwlieXRlc1szXSA9IHZhbCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1aW50MzJfdAorc2NzaV8yYnRvdWwodWludDhfdCAqYnl0ZXMpCit7CisJdWludDMyX3QgcnY7CisKKwlydiA9IChieXRlc1swXSA8PCA4KSB8CisJICAgICBieXRlc1sxXTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CitzY3NpXzNidG91bCh1aW50OF90ICpieXRlcykKK3sKKwl1aW50MzJfdCBydjsKKworCXJ2ID0gKGJ5dGVzWzBdIDw8IDE2KSB8CisJICAgICAoYnl0ZXNbMV0gPDwgOCkgfAorCSAgICAgYnl0ZXNbMl07CisJcmV0dXJuIChydik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQzMl90IAorc2NzaV8zYnRvbCh1aW50OF90ICpieXRlcykKK3sKKwl1aW50MzJfdCByYyA9IHNjc2lfM2J0b3VsKGJ5dGVzKTsKKyAKKwlpZiAocmMgJiAweDAwODAwMDAwKQorCQlyYyB8PSAweGZmMDAwMDAwOworCisJcmV0dXJuIChpbnQzMl90KSByYzsKK30KKworc3RhdGljIF9faW5saW5lIHVpbnQzMl90CitzY3NpXzRidG91bCh1aW50OF90ICpieXRlcykKK3sKKwl1aW50MzJfdCBydjsKKworCXJ2ID0gKGJ5dGVzWzBdIDw8IDI0KSB8CisJICAgICAoYnl0ZXNbMV0gPDwgMTYpIHwKKwkgICAgIChieXRlc1syXSA8PCA4KSB8CisJICAgICBieXRlc1szXTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyogTWFjcm9zIGZvciBnZW5lcmF0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgUENJIElEIHRhYmxlcy4gKi8KKworI2RlZmluZSBHRVRJRCh2LCBzKSAodW5zaWduZWQpKCgodikgPj4gKHMpKSAmIDB4RkZGRiA/OiBQQ0lfQU5ZX0lEKQorCisjZGVmaW5lIElEX0MoeCwgYykJCQkJCQlcCit7CQkJCQkJCQlcCisJR0VUSUQoeCwzMiksIEdFVElEKHgsNDgpLCBHRVRJRCh4LDApLCBHRVRJRCh4LDE2KSwJXAorCShjKSA8PCA4LCAweEZGRkYwMCwgMAkJCQkJXAorfQorCisjZGVmaW5lIElEMkMoeCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlJRF9DKHgsIFBDSV9DTEFTU19TVE9SQUdFX1NDU0kpLCBcCisJSURfQyh4LCBQQ0lfQ0xBU1NfU1RPUkFHRV9SQUlEKQorCisjZGVmaW5lIElESVJPQyh4KSAgKCh4KSB8IH5JRF9BTExfSVJPQ19NQVNLKQorCisvKiBHZW5lcmF0ZSBJRHMgZm9yIGFsbCAxNiBwb3NzaWJpbGl0ZXMuCisgKiBUaGUgYXJndW1lbnQgaGFzIGFscmVhZHkgbWFza2VkIG91dAorICogdGhlIDQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZGV2aWNlIGlkLgorICogKGUuZy4sIG1hc2s6IElEXzkwMDVfR0VORVJJQ19NQVNLKS4KKyAqLworI2RlZmluZSBJRDE2KHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJSUQoeCksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUlEKCh4KSB8IDB4MDAwMTAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMDIwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDAzMDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwNDAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMDUwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDA2MDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwNzAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMDgwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDA5MDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwQTAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMEIwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDBDMDAwMDAwMDAwMDAwdWxsKSwgXAorCUlEKCh4KSB8IDB4MDAwRDAwMDAwMDAwMDAwMHVsbCksIFwKKwlJRCgoeCkgfCAweDAwMEUwMDAwMDAwMDAwMDB1bGwpLCBcCisJSUQoKHgpIHwgMHgwMDBGMDAwMDAwMDAwMDAwdWxsKQorCisjZW5kaWYgLypfQUlDTElCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2NhbS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvY2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwYmEwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2NhbS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlIENBTSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEp1c3RpbiBULiBHaWJicy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBBZGFwdGVjIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJElkOiAvL2RlcG90L2FpYzd4eHgvbGludXgvZHJpdmVycy9zY3NpL2FpYzd4eHgvY2FtLmgjMTUgJAorICovCisKKyNpZm5kZWYgX0FJQzdYWFhfQ0FNX0gKKyNkZWZpbmUgX0FJQzdYWFhfQ0FNX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZQlDQU1fQlVTX1dJTERDQVJEICgodV9pbnQpfjApCisjZGVmaW5lCUNBTV9UQVJHRVRfV0lMRENBUkQgKCh1X2ludCl+MCkKKyNkZWZpbmUJQ0FNX0xVTl9XSUxEQ0FSRCAoKHVfaW50KX4wKQorCisvKiBDQU0gU3RhdHVzIGZpZWxkIHZhbHVlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlDQU1fUkVRX0lOUFJPRywJCS8qIENDQiByZXF1ZXN0IGlzIGluIHByb2dyZXNzICovCisJQ0FNX1JFUV9DTVAsCQkvKiBDQ0IgcmVxdWVzdCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciAqLworCUNBTV9SRVFfQUJPUlRFRCwJLyogQ0NCIHJlcXVlc3QgYWJvcnRlZCBieSB0aGUgaG9zdCAqLworCUNBTV9VQV9BQk9SVCwJCS8qIFVuYWJsZSB0byBhYm9ydCBDQ0IgcmVxdWVzdCAqLworCUNBTV9SRVFfQ01QX0VSUiwJLyogQ0NCIHJlcXVlc3QgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgKi8KKwlDQU1fQlVTWSwJCS8qIENBTSBzdWJzeXRlbSBpcyBidXN5ICovCisJQ0FNX1JFUV9JTlZBTElELAkvKiBDQ0IgcmVxdWVzdCB3YXMgaW52YWxpZCAqLworCUNBTV9QQVRIX0lOVkFMSUQsCS8qIFN1cHBsaWVkIFBhdGggSUQgaXMgaW52YWxpZCAqLworCUNBTV9TRUxfVElNRU9VVCwJLyogVGFyZ2V0IFNlbGVjdGlvbiBUaW1lb3V0ICovCisJQ0FNX0NNRF9USU1FT1VULAkvKiBDb21tYW5kIHRpbWVvdXQgKi8KKwlDQU1fU0NTSV9TVEFUVVNfRVJST1IsCS8qIFNDU0kgZXJyb3IsIGxvb2sgYXQgZXJyb3IgY29kZSBpbiBDQ0IgKi8KKwlDQU1fU0NTSV9CVVNfUkVTRVQsCS8qIFNDU0kgQnVzIFJlc2V0IFNlbnQvUmVjZWl2ZWQgKi8KKwlDQU1fVU5DT1JfUEFSSVRZLAkvKiBVbmNvcnJlY3RhYmxlIHBhcml0eSBlcnJvciBvY2N1cnJlZCAqLworCUNBTV9BVVRPU0VOU0VfRkFJTCwJLyogQXV0b3NlbnNlOiByZXF1ZXN0IHNlbnNlIGNtZCBmYWlsICovCisJQ0FNX05PX0hCQSwJCS8qIE5vIEhCQSBEZXRlY3RlZCBFcnJvciAqLworCUNBTV9EQVRBX1JVTl9FUlIsCS8qIERhdGEgT3ZlcnJ1biBlcnJvciAqLworCUNBTV9VTkVYUF9CVVNGUkVFLAkvKiBVbmV4cGVjdGVkIEJ1cyBGcmVlICovCisJQ0FNX1NFUVVFTkNFX0ZBSUwsCS8qIFByb3RvY29sIFZpb2xhdGlvbiAqLworCUNBTV9DQ0JfTEVOX0VSUiwJLyogQ0NCIGxlbmd0aCBzdXBwbGllZCBpcyBpbmFkZXF1YXRlICovCisJQ0FNX1BST1ZJREVfRkFJTCwJLyogVW5hYmxlIHRvIHByb3ZpZGUgcmVxdWVzdGVkIGNhcGFiaWxpdHkgKi8KKwlDQU1fQkRSX1NFTlQsCQkvKiBBIFNDU0kgQkRSIG1zZyB3YXMgc2VudCB0byB0YXJnZXQgKi8KKwlDQU1fUkVRX1RFUk1JTywJCS8qIENDQiByZXF1ZXN0IHRlcm1pbmF0ZWQgYnkgdGhlIGhvc3QgKi8KKwlDQU1fVU5SRUNfSEJBX0VSUk9SLAkvKiBVbnJlY292ZXJhYmxlIEhvc3QgQnVzIEFkYXB0ZXIgRXJyb3IgKi8KKwlDQU1fUkVRX1RPT19CSUcsCS8qIFRoZSByZXF1ZXN0IHdhcyB0b28gbGFyZ2UgZm9yIHRoaXMgaG9zdCAqLworCUNBTV9VQV9URVJNSU8sCQkvKiBVbmFibGUgdG8gdGVybWluYXRlIEkvTyBDQ0IgcmVxdWVzdCAqLworCUNBTV9NU0dfUkVKRUNUX1JFQywJLyogTWVzc2FnZSBSZWplY3QgUmVjZWl2ZWQgKi8KKwlDQU1fREVWX05PVF9USEVSRSwJLyogU0NTSSBEZXZpY2UgTm90IEluc3RhbGxlZC90aGVyZSAqLworCUNBTV9SRVNSQ19VTkFWQUlMLAkvKiBSZXNvdXJjZSBVbmF2YWlsYWJsZSAqLworCS8qCisJICogVGhpcyByZXF1ZXN0IHNob3VsZCBiZSByZXF1ZXVlZCB0byBwcmVzZXJ2ZQorCSAqIHRyYW5zYWN0aW9uIG9yZGVyaW5nLiAgVGhpcyB0eXBpY2FsbHkgb2NjdXJzCisJICogd2hlbiB0aGUgU0lNIHJlY29nbml6ZXMgYW4gZXJyb3IgdGhhdCBzaG91bGQKKwkgKiBmcmVlemUgdGhlIHF1ZXVlIGFuZCBtdXN0IHBsYWNlIGFkZGl0aW9uYWwKKwkgKiByZXF1ZXN0cyBmb3IgdGhlIHRhcmdldCBhdCB0aGUgc2ltIGxldmVsCisJICogYmFjayBpbnRvIHRoZSBYUFQgcXVldWUuCisJICovCisJQ0FNX1JFUVVFVUVfUkVRLAorCUNBTV9ERVZfUUZSWk4JCT0gMHg0MCwKKworCUNBTV9TVEFUVVNfTUFTSwkJPSAweDNGCit9IGNhbV9zdGF0dXM7CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGFzeW5jaHJvbm91cyBjYWxsYmFjayBDQ0IgZmllbGRzLgorICovCit0eXBlZGVmIGVudW0geworCUFDX0dFVERFVl9DSEFOR0VECT0gMHg4MDAsLyogR2V0ZGV2IGluZm8gbWlnaHQgaGF2ZSBjaGFuZ2VkICovCisJQUNfSU5RX0NIQU5HRUQJCT0gMHg0MDAsLyogSW5xdWlyeSBpbmZvIG1pZ2h0IGhhdmUgY2hhbmdlZCAqLworCUFDX1RSQU5TRkVSX05FRwkJPSAweDIwMCwvKiBOZXcgdHJhbnNmZXIgc2V0dGluZ3MgaW4gZWZmZWN0ICovCisJQUNfTE9TVF9ERVZJQ0UJCT0gMHgxMDAsLyogQSBkZXZpY2Ugd2VudCBhd2F5ICovCisJQUNfRk9VTkRfREVWSUNFCQk9IDB4MDgwLC8qIEEgbmV3IGRldmljZSB3YXMgZm91bmQgKi8KKwlBQ19QQVRIX0RFUkVHSVNURVJFRAk9IDB4MDQwLC8qIEEgcGF0aCBoYXMgZGUtcmVnaXN0ZXJlZCAqLworCUFDX1BBVEhfUkVHSVNURVJFRAk9IDB4MDIwLC8qIEEgbmV3IHBhdGggaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLworCUFDX1NFTlRfQkRSCQk9IDB4MDEwLC8qIEEgQkRSIG1lc3NhZ2Ugd2FzIHNlbnQgdG8gdGFyZ2V0ICovCisJQUNfU0NTSV9BRU4JCT0gMHgwMDgsLyogQSBTQ1NJIEFFTiBoYXMgYmVlbiByZWNlaXZlZCAqLworCUFDX1VOU09MX1JFU0VMCQk9IDB4MDAyLC8qIFVuc29saWNpdGVkIHJlc2VsZWN0aW9uIG9jY3VycmVkICovCisJQUNfQlVTX1JFU0VUCQk9IDB4MDAxIC8qIEEgU0NTSSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KK30gYWNfY29kZTsKKwordHlwZWRlZiBlbnVtIHsKKwlDQU1fRElSX0lOCQk9IFNDU0lfREFUQV9SRUFELAorCUNBTV9ESVJfT1VUCQk9IFNDU0lfREFUQV9XUklURSwKKwlDQU1fRElSX05PTkUJCT0gU0NTSV9EQVRBX05PTkUKK30gY2NiX2ZsYWdzOworCisjZW5kaWYgLyogX0FJQzdYWFhfQ0FNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L3F1ZXVlLmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGY4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9xdWV1ZS5oCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylxdWV1ZS5oCTguNSAoQmVya2VsZXkpIDgvMjAvOTQKKyAqICRGcmVlQlNEOiBzcmMvc3lzL3N5cy9xdWV1ZS5oLHYgMS4zOCAyMDAwLzA1LzI2IDAyOjA2OjU2IGpha2UgRXhwICQKKyAqLworCisjaWZuZGVmIF9TWVNfUVVFVUVfSF8KKyNkZWZpbmUJX1NZU19RVUVVRV9IXworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZml2ZSB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBzaW5nbHktbGlua2VkIHRhaWwgcXVldWVzLCBsaXN0cywgdGFpbCBxdWV1ZXMsIGFuZCBjaXJjdWxhciBxdWV1ZXMuCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlIGVsZW1lbnRzCisgKiBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24gb3ZlcmhlYWQgYXQKKyAqIHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcgZWxlbWVudHMgY2FuIGJlCisgKiBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0CisgKiBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtIGVmZmljaWVuY3kuIEEgc2luZ2x5LWxpbmtlZCBsaXN0IG1heQorICogb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLiAgU2luZ2x5LWxpbmtlZCBsaXN0cyBhcmUgaWRlYWwKKyAqIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZSBkYXRhc2V0cyBhbmQgZmV3IG9yIG5vIHJlbW92YWxzIG9yIGZvcgorICogaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUKKyAqIHNpbmdseSBsaW5rZWQgZm9yIG1pbmltdW0gc3BhY2UgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uIG92ZXJoZWFkIGF0IHRoZQorICogZXhwZW5zZSBvZiBPKG4pIHJlbW92YWwgZm9yIGFyYml0cmFyeSBlbGVtZW50cy4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZAorICogdG8gdGhlIGxpc3QgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZQorICogZW5kIG9mIHRoZSBsaXN0LiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIHRhaWwgcXVldWUKKyAqIHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0IG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4KKyAqIEEgc2luZ2x5LWxpbmtlZCB0YWlsIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKiBTaW5nbHktbGlua2VkIHRhaWwgcXVldWVzIGFyZSBpZGVhbCBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UgZGF0YXNldHMKKyAqIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yIGltcGxlbWVudGluZyBhIEZJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHRhaWwgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvcgorICogYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBsaXN0LiBBIHRhaWwgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICoKKyAqIEEgY2lyY2xlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IgYWZ0ZXIKKyAqIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICogQSBjaXJjbGUgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLCBidXQgaGFzIGEgbW9yZQorICogY29tcGxleCBlbmQgb2YgbGlzdCBkZXRlY3Rpb24uCisgKgorICogRm9yIGRldGFpbHMgb24gdGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MsIHNlZSB0aGUgcXVldWUoMykgbWFudWFsIHBhZ2UuCisgKgorICoKKyAqCQkJU0xJU1QJTElTVAlTVEFJTFEJVEFJTFEJQ0lSQ0xFUQorICogX0hFQUQJCSsJKwkrCSsJKworICogX0hFQURfSU5JVElBTElaRVIJKwkrCSsJKwkrCisgKiBfRU5UUlkJCSsJKwkrCSsJKworICogX0lOSVQJCSsJKwkrCSsJKworICogX0VNUFRZCQkrCSsJKwkrCSsKKyAqIF9GSVJTVAkJKwkrCSsJKwkrCisgKiBfTkVYVAkJKwkrCSsJKwkrCisgKiBfUFJFVgkJLQktCS0JKwkrCisgKiBfTEFTVAkJLQktCSsJKwkrCisgKiBfRk9SRUFDSAkJKwkrCSsJKwkrCisgKiBfRk9SRUFDSF9SRVZFUlNFCS0JLQktCSsJKworICogX0lOU0VSVF9IRUFECQkrCSsJKwkrCSsKKyAqIF9JTlNFUlRfQkVGT1JFCS0JKwktCSsJKworICogX0lOU0VSVF9BRlRFUgkrCSsJKwkrCSsKKyAqIF9JTlNFUlRfVEFJTAkJLQktCSsJKwkrCisgKiBfUkVNT1ZFX0hFQUQJCSsJLQkrCS0JLQorICogX1JFTU9WRQkJKwkrCSsJKwkrCisgKgorICovCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVNMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnNsaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZQlTTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKyAKKyNkZWZpbmUJU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorIAorLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfRU1QVFkoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0ID09IE5VTEwpCisKKyNkZWZpbmUJU0xJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0KQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IgKCh2YXIpID0gU0xJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKTsJCQkJCQkJXAorCSAgICAodmFyKSA9IFNMSVNUX05FWFQoKHZhciksIGZpZWxkKSkKKworI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJU0xJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9ORVhUKChzbGlzdGVsbSksIGZpZWxkKTsJXAorCVNMSVNUX05FWFQoKHNsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJCVwKKwlTTElTVF9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworI2RlZmluZQlTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoU0xJU1RfRklSU1QoKGhlYWQpKSA9PSAoZWxtKSkgewkJCQlcCisJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJXAorCQl3aGlsZSAoU0xJU1RfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkJCVwKKwkJCWN1cmVsbSA9IFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCk7CQlcCisJCVNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCkgPQkJCQlcCisJCSAgICBTTElTVF9ORVhUKFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCksIGZpZWxkKTsJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCVNMSVNUX0ZJUlNUKChoZWFkKSkgPSBTTElTVF9ORVhUKFNMSVNUX0ZJUlNUKChoZWFkKSksIGZpZWxkKTsJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgVGFpbCBxdWV1ZSBkZWNsYXJhdGlvbnMuCisgKi8KKyNkZWZpbmUJU1RBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnN0cWhfZmlyc3Q7LyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnN0cWhfbGFzdDsvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJU1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3RxaF9maXJzdCB9CisKKyNkZWZpbmUJU1RBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3RxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCit9CisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0ID09IE5VTEwpCisKKyNkZWZpbmUJU1RBSUxRX0ZJUlNUKGhlYWQpCSgoaGVhZCktPnN0cWhfZmlyc3QpCisKKyNkZWZpbmUJU1RBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvcigodmFyKSA9IFNUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgKHZhcik7CQkJCQkJCVwKKwkgICAodmFyKSA9IFNUQUlMUV9ORVhUKCh2YXIpLCBmaWVsZCkpCisKKyNkZWZpbmUJU1RBSUxRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwlTVEFJTFFfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIHRxZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKChTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gU1RBSUxRX05FWFQoKHRxZWxtKSwgZmllbGQpKSA9PSBOVUxMKVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlTVEFJTFFfTkVYVCgodHFlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKFNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBTVEFJTFFfRklSU1QoKGhlYWQpKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCVNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJU1RBSUxRX0xBU1QoKGhlYWQpKSA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfTEFTVChoZWFkKQkoKihoZWFkKS0+c3RxaF9sYXN0KQorCisjZGVmaW5lCVNUQUlMUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc3RxZV9uZXh0KQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoU1RBSUxRX0ZJUlNUKChoZWFkKSkgPT0gKGVsbSkpIHsJCQkJXAorCQlTVEFJTFFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSBTVEFJTFFfRklSU1QoKGhlYWQpKTsJCVwKKwkJd2hpbGUgKFNUQUlMUV9ORVhUKGN1cmVsbSwgZmllbGQpICE9IChlbG0pKQkJXAorCQkJY3VyZWxtID0gU1RBSUxRX05FWFQoY3VyZWxtLCBmaWVsZCk7CQlcCisJCWlmICgoU1RBSUxRX05FWFQoY3VyZWxtLCBmaWVsZCkgPQkJCVwKKwkJICAgICBTVEFJTFFfTkVYVChTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKSwgZmllbGQpKSA9PSBOVUxMKVwKKwkJCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9ORVhUKChjdXJlbG0pLCBmaWVsZCk7XAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKFNUQUlMUV9GSVJTVCgoaGVhZCkpID0JCQkJCVwKKwkgICAgIFNUQUlMUV9ORVhUKFNUQUlMUV9GSVJTVCgoaGVhZCkpLCBmaWVsZCkpID09IE5VTEwpCQlcCisJCShoZWFkKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9GSVJTVCgoaGVhZCkpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfUkVNT1ZFX0hFQURfVU5USUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKFNUQUlMUV9GSVJTVCgoaGVhZCkpID0gU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfRklSU1QoKGhlYWQpKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCUxJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisKKyNkZWZpbmUJTElTVF9FTVBUWShoZWFkKQkoKGhlYWQpLT5saF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lCUxJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+bGhfZmlyc3QpCisKKyNkZWZpbmUJTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yICgodmFyKSA9IExJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKTsJCQkJCQkJXAorCSAgICAodmFyKSA9IExJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCUxJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCUxJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0FGVEVSKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IExJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKSkgIT0gTlVMTClcCisJCUxJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKS0+ZmllbGQubGVfcHJldiA9CQlcCisJCSAgICAmTElTVF9ORVhUKChlbG0pLCBmaWVsZCk7CQkJCVwKKwlMSVNUX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJkxJU1RfTkVYVCgobGlzdGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmTElTVF9ORVhUKChlbG0pLCBmaWVsZCk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IExJU1RfRklSU1QoKGhlYWQpKSkgIT0gTlVMTCkJXAorCQlMSVNUX0ZJUlNUKChoZWFkKSktPmZpZWxkLmxlX3ByZXYgPSAmTElTVF9ORVhUKChlbG0pLCBmaWVsZCk7XAorCUxJU1RfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJkxJU1RfRklSU1QoKGhlYWQpKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCUxJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKyNkZWZpbmUJTElTVF9SRU1PVkUoZWxtLCBmaWVsZCkgZG8gewkJCQkJXAorCWlmIChMSVNUX05FWFQoKGVsbSksIGZpZWxkKSAhPSBOVUxMKQkJCQlcCisJCUxJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0gCQlcCisJCSAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJXAorCSooZWxtKS0+ZmllbGQubGVfcHJldiA9IExJU1RfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVRBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lCVRBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqdHFlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCit9CisKKy8qCisgKiBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGhlYWRuYW1lLCBmaWVsZCkJCVwKKwlmb3IgKCh2YXIpID0gVEFJTFFfTEFTVCgoaGVhZCksIGhlYWRuYW1lKTsJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfUFJFVigodmFyKSwgaGVhZG5hbWUsIGZpZWxkKSkKKworI2RlZmluZQlUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJVEFJTFFfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IFRBSUxRX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkpICE9IE5VTEwpXAorCQlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCktPmZpZWxkLnRxZV9wcmV2ID0gCQlcCisJCSAgICAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlUQUlMUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgobGlzdGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gVEFJTFFfRklSU1QoKGhlYWQpKSkgIT0gTlVMTCkJXAorCQlUQUlMUV9GSVJTVCgoaGVhZCkpLT5maWVsZC50cWVfcHJldiA9CQkJXAorCQkgICAgJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQlcCisJVEFJTFFfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICZUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQpLT50cWhfbGFzdDsJCQlcCisJKihoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpCQkJCQlcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpCisKKyNkZWZpbmUJVEFJTFFfTkVYVChlbG0sIGZpZWxkKSAoKGVsbSktPmZpZWxkLnRxZV9uZXh0KQorCisjZGVmaW5lCVRBSUxRX1BSRVYoZWxtLCBoZWFkbmFtZSwgZmllbGQpCQkJCVwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKQorCisjZGVmaW5lCVRBSUxRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSkgIT0gTlVMTCkJCQkJXAorCQlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCktPmZpZWxkLnRxZV9wcmV2ID0gCQlcCisJCSAgICAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKihlbG0pLT5maWVsZC50cWVfcHJldiA9IFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBkZWNsYXJhdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmNxaF9maXJzdDsJCS8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2xhc3Q7CQkvKiBsYXN0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZQlDSVJDTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7ICh2b2lkICopJihoZWFkKSwgKHZvaWQgKikmKGhlYWQpIH0KKworI2RlZmluZQlDSVJDTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX25leHQ7CQkvKiBuZXh0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX3ByZXY7CQkvKiBwcmV2aW91cyBlbGVtZW50ICovCQlcCit9CisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5jcWhfZmlyc3QgPT0gKHZvaWQgKikoaGVhZCkpCisKKyNkZWZpbmUJQ0lSQ0xFUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5jcWhfZmlyc3QpCisKKyNkZWZpbmUJQ0lSQ0xFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gQ0lSQ0xFUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpICE9ICh2b2lkICopKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IENJUkNMRVFfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCUNJUkNMRVFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcikgPSBDSVJDTEVRX0xBU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAhPSAodm9pZCAqKShoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBDSVJDTEVRX1BSRVYoKHZhciksIGZpZWxkKSkKKworI2RlZmluZQlDSVJDTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwlDSVJDTEVRX0ZJUlNUKChoZWFkKSkgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCUNJUkNMRVFfTEFTVCgoaGVhZCkpID0gKHZvaWQgKikoaGVhZCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCUNJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpID0gQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpOwlcCisJQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCkgPSAobGlzdGVsbSk7CQkJCVwKKwlpZiAoQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID09ICh2b2lkICopKGhlYWQpKQkJXAorCQlDSVJDTEVRX0xBU1QoKGhlYWQpKSA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlDSVJDTEVRX1BSRVYoQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpLCBmaWVsZCkgPSAoZWxtKTtcCisJQ0lSQ0xFUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlDSVJDTEVRX05FWFQoKGVsbSksIGZpZWxkKSA9IChsaXN0ZWxtKTsJCQkJXAorCUNJUkNMRVFfUFJFVigoZWxtKSwgZmllbGQpID0gQ0lSQ0xFUV9QUkVWKChsaXN0ZWxtKSwgZmllbGQpOwlcCisJaWYgKENJUkNMRVFfUFJFVigobGlzdGVsbSksIGZpZWxkKSA9PSAodm9pZCAqKShoZWFkKSkJCVwKKwkJQ0lSQ0xFUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCUNJUkNMRVFfTkVYVChDSVJDTEVRX1BSRVYoKGxpc3RlbG0pLCBmaWVsZCksIGZpZWxkKSA9IChlbG0pO1wKKwlDSVJDTEVRX1BSRVYoKGxpc3RlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJQ0lSQ0xFUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBDSVJDTEVRX0ZJUlNUKChoZWFkKSk7CQlcCisJQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCkgPSAodm9pZCAqKShoZWFkKTsJCQlcCisJaWYgKENJUkNMRVFfTEFTVCgoaGVhZCkpID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJQ0lSQ0xFUV9MQVNUKChoZWFkKSkgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJQ0lSQ0xFUV9QUkVWKENJUkNMRVFfRklSU1QoKGhlYWQpKSwgZmllbGQpID0gKGVsbSk7CVwKKwlDSVJDTEVRX0ZJUlNUKChoZWFkKSkgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCUNJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpID0gKHZvaWQgKikoaGVhZCk7CQkJXAorCUNJUkNMRVFfUFJFVigoZWxtKSwgZmllbGQpID0gQ0lSQ0xFUV9MQVNUKChoZWFkKSk7CQlcCisJaWYgKENJUkNMRVFfRklSU1QoKGhlYWQpKSA9PSAodm9pZCAqKShoZWFkKSkJCQlcCisJCUNJUkNMRVFfRklSU1QoKGhlYWQpKSA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlDSVJDTEVRX05FWFQoQ0lSQ0xFUV9MQVNUKChoZWFkKSksIGZpZWxkKSA9IChlbG0pOwlcCisJQ0lSQ0xFUV9MQVNUKChoZWFkKSkgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJQ0lSQ0xFUV9MQVNUKGhlYWQpCSgoaGVhZCktPmNxaF9sYXN0KQorCisjZGVmaW5lCUNJUkNMRVFfTkVYVChlbG0sZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX25leHQpCisKKyNkZWZpbmUJQ0lSQ0xFUV9QUkVWKGVsbSxmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfcHJldikKKworI2RlZmluZQlDSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoQ0lSQ0xFUV9ORVhUKChlbG0pLCBmaWVsZCkgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCUNJUkNMRVFfTEFTVCgoaGVhZCkpID0gQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCk7CVwKKwllbHNlCQkJCQkJCQlcCisJCUNJUkNMRVFfUFJFVihDSVJDTEVRX05FWFQoKGVsbSksIGZpZWxkKSwgZmllbGQpID0JXAorCQkgICAgQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCk7CQkJCVwKKwlpZiAoQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCkgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCUNJUkNMRVFfRklSU1QoKGhlYWQpKSA9IENJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpOwlcCisJZWxzZQkJCQkJCQkJXAorCQlDSVJDTEVRX05FWFQoQ0lSQ0xFUV9QUkVWKChlbG0pLCBmaWVsZCksIGZpZWxkKSA9CVwKKwkJICAgIENJUkNMRVFfTkVYVCgoZWxtKSwgZmllbGQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZW5kaWYgLyogIV9TWVNfUVVFVUVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L3Njc2lfaXUuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L3Njc2lfaXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFmZDNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvc2NzaV9pdS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCisgKi8KKyNpZm5kZWYJX1NDU0lfU0NTSV9JVV9ICisjZGVmaW5lIF9TQ1NJX1NDU0lfSVVfSCAxCisKK3N0cnVjdCBzY3NpX3N0YXR1c19pdV9oZWFkZXIKK3sKKwl1X2ludDhfdCByZXNlcnZlZFsyXTsKKwl1X2ludDhfdCBmbGFnczsKKyNkZWZpbmUJU0lVX1NOU1ZBTElEIDB4MgorI2RlZmluZQlTSVVfUlNQVkFMSUQgMHgxCisJdV9pbnQ4X3Qgc3RhdHVzOworCXVfaW50OF90IHNlbnNlX2xlbmd0aFs0XTsKKwl1X2ludDhfdCBwa3RfZmFpbHVyZXNfbGVuZ3RoWzRdOworCXVfaW50OF90IHBrdF9mYWlsdXJlc1sxXTsKK307CisKKyNkZWZpbmUgU0lVX1BLVEZBSUxfT0ZGU0VUKHNpdSkgMTIKKyNkZWZpbmUgU0lVX1BLVEZBSUxfQ09ERShzaXUpIChzY3NpXzRidG91bCgoc2l1KS0+cGt0X2ZhaWx1cmVzKSAmIDB4RkYpCisjZGVmaW5lCQlTSVVfUEZDX05PTkUJCQkwCisjZGVmaW5lCQlTSVVfUEZDX0NJVV9GSUVMRFNfSU5WQUxJRAkyCisjZGVmaW5lCQlTSVVfUEZDX1RNRl9OT1RfU1VQUE9SVEVECTQKKyNkZWZpbmUJCVNJVV9QRkNfVE1GX0ZBSUxFRAkJNQorI2RlZmluZQkJU0lVX1BGQ19JTlZBTElEX1RZUEVfQ09ERQk2CisjZGVmaW5lCQlTSVVfUEZDX0lMTEVHQUxfUkVRVUVTVAkJNworI2RlZmluZSBTSVVfU0VOU0VfT0ZGU0VUKHNpdSkJCQkJXAorICAgICgxMiArICgoKHNpdSktPmZsYWdzICYgU0lVX1JTUFZBTElEKQkJXAorCT8gc2NzaV80YnRvdWwoKHNpdSktPnBrdF9mYWlsdXJlc19sZW5ndGgpCVwKKwk6IDApKQorCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9OT05FCQkweDAwCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLCQkweDAxCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9BQk9SVF9UQVNLX1NFVAkweDAyCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9DTEVBUl9UQVNLX1NFVAkweDA0CisjZGVmaW5lCVNJVV9UQVNLTUdNVF9MVU5fUkVTRVQJCTB4MDgKKyNkZWZpbmUJU0lVX1RBU0tNR01UX1RBUkdFVF9SRVNFVAkweDIwCisjZGVmaW5lCVNJVV9UQVNLTUdNVF9DTEVBUl9BQ0EJCTB4NDAKKyNlbmRpZiAvKl9TQ1NJX1NDU0lfSVVfSCovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9zY3NpX21lc3NhZ2UuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L3Njc2lfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODExZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9zY3NpX21lc3NhZ2UuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICogJEZyZWVCU0Q6IHNyYy9zeXMvY2FtL3Njc2kvc2NzaV9tZXNzYWdlLmgsdiAxLjIgMjAwMC8wNS8wMSAyMDoyMToyOSBwZXRlciBFeHAgJAorICovCisKKy8qIE1lc3NhZ2VzICgxIGJ5dGUpICovCQkgICAgIC8qIEkvVCAoTSlhbmRhdG9yeSBvciAoTylwdGlvbmFsICovCisjZGVmaW5lIE1TR19DTURDT01QTEVURQkJMHgwMCAvKiBNL00gKi8KKyNkZWZpbmUgTVNHX1RBU0tfQ09NUExFVEUJMHgwMCAvKiBNL00gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfRVhURU5ERUQJCTB4MDEgLyogTy9PICovCisjZGVmaW5lIE1TR19TQVZFREFUQVBPSU5URVIJMHgwMiAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX1JFU1RPUkVQT0lOVEVSUwkweDAzIC8qIE8vTyAqLworI2RlZmluZSBNU0dfRElTQ09OTkVDVAkJMHgwNCAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0lOSVRJQVRPUl9ERVRfRVJSCTB4MDUgLyogTS9NICovCisjZGVmaW5lIE1TR19BQk9SVAkJMHgwNiAvKiBPL00gKi8KKyNkZWZpbmUgTVNHX0FCT1JUX1RBU0tfU0VUCTB4MDYgLyogTy9NICovIC8qIFNQSTMgVGVybWlub2xvZ3kgKi8KKyNkZWZpbmUgTVNHX01FU1NBR0VfUkVKRUNUCTB4MDcgLyogTS9NICovCisjZGVmaW5lIE1TR19OT09QCQkweDA4IC8qIE0vTSAqLworI2RlZmluZSBNU0dfUEFSSVRZX0VSUk9SCTB4MDkgLyogTS9NICovCisjZGVmaW5lIE1TR19MSU5LX0NNRF9DT01QTEVURQkweDBhIC8qIE8vTyAqLworI2RlZmluZSBNU0dfTElOS19DTURfQ09NUExFVEVGCTB4MGIgLyogTy9PICovCisjZGVmaW5lIE1TR19CVVNfREVWX1JFU0VUCTB4MGMgLyogTy9NICovCisjZGVmaW5lIE1TR19UQVJHRVRfUkVTRVQJMHgwYyAvKiBPL00gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfQUJPUlRfVEFHCQkweDBkIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQUJPUlRfVEFTSwkJMHgwZCAvKiBPL08gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfQ0xFQVJfUVVFVUUJCTB4MGUgLyogTy9PICovCisjZGVmaW5lIE1TR19DTEVBUl9UQVNLX1NFVAkweDBlIC8qIE8vTyAqLyAvKiBTUEkzIFRlcm1pbm9sb2d5ICovCisjZGVmaW5lIE1TR19JTklUX1JFQ09WRVJZCTB4MGYgLyogTy9PICovIC8qIERlcHJlY2F0ZWQgaW4gU1BJMyAqLworI2RlZmluZSBNU0dfUkVMX1JFQ09WRVJZCTB4MTAgLyogTy9PICovIC8qIERlcHJlY2F0ZWQgaW4gU1BJMyAqLworI2RlZmluZSBNU0dfVEVSTV9JT19QUk9DCTB4MTEgLyogTy9PICovIC8qIERlcHJlY2F0ZWQgaW4gU1BJMyAqLworI2RlZmluZSBNU0dfQ0xFQVJfQUNBCQkweDE2IC8qIE8vTyAqLyAvKiBTUEkzICovCisjZGVmaW5lIE1TR19MT0dJQ0FMX1VOSVRfUkVTRVQJMHgxNyAvKiBPL08gKi8gLyogU1BJMyAqLworI2RlZmluZSBNU0dfUUFTX1JFUVVFU1QJCTB4NTUgLyogTy9PICovIC8qIFNQSTMgKi8KKworLyogTWVzc2FnZXMgKDIgYnl0ZSkgKi8KKyNkZWZpbmUgTVNHX1NJTVBMRV9RX1RBRwkweDIwIC8qIE8vTyAqLworI2RlZmluZSBNU0dfU0lNUExFX1RBU0sJCTB4MjAgLyogTy9PICovIC8qIFNQSTMgVGVybWlub2xvZ3kgKi8KKyNkZWZpbmUgTVNHX0hFQURfT0ZfUV9UQUcJMHgyMSAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0hFQURfT0ZfUVVFVUVfVEFTSwkweDIxIC8qIE8vTyAqLyAvKiBTUEkzIFRlcm1pbm9sb2d5ICovCisjZGVmaW5lIE1TR19PUkRFUkVEX1FfVEFHCTB4MjIgLyogTy9PICovCisjZGVmaW5lIE1TR19PUkRFUkVEX1RBU0sJMHgyMiAvKiBPL08gKi8gLyogU1BJMyBUZXJtaW5vbG9neSAqLworI2RlZmluZSBNU0dfSUdOX1dJREVfUkVTSURVRQkweDIzIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQUNBX1RBU0sJCTB4MjQgLyogMC8wICovIC8qIFNQSTMgKi8KKworLyogSWRlbnRpZnkgbWVzc2FnZSAqLwkJICAgICAvKiBNL00gKi8JCisjZGVmaW5lIE1TR19JREVOVElGWUZMQUcJMHg4MCAKKyNkZWZpbmUgTVNHX0lERU5USUZZX0RJU0NGTEFHCTB4NDAgCisjZGVmaW5lIE1TR19JREVOVElGWShsdW4sIGRpc2MpCSgoKGRpc2MpID8gMHhjMCA6IE1TR19JREVOVElGWUZMQUcpIHwgKGx1bikpCisjZGVmaW5lIE1TR19JU0lERU5USUZZKG0pCSgobSkgJiBNU0dfSURFTlRJRllGTEFHKQorI2RlZmluZSBNU0dfSURFTlRJRllfTFVOTUFTSwkweDNGIAorCisvKiBFeHRlbmRlZCBtZXNzYWdlcyAob3Bjb2RlIGFuZCBsZW5ndGgpICovCisjZGVmaW5lIE1TR19FWFRfU0RUUgkJMHgwMQorI2RlZmluZSBNU0dfRVhUX1NEVFJfTEVOCTB4MDMKKworI2RlZmluZSBNU0dfRVhUX1dEVFIJCTB4MDMKKyNkZWZpbmUgTVNHX0VYVF9XRFRSX0xFTgkweDAyCisjZGVmaW5lIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQJMHgwMAorI2RlZmluZSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lIE1TR19FWFRfV0RUUl9CVVNfMzJfQklUCTB4MDIgLyogRGVwcmVjYXRlZCBpbiBTUEkzICovCisKKyNkZWZpbmUgTVNHX0VYVF9QUFIJCTB4MDQgLyogU1BJMyAqLworI2RlZmluZSBNU0dfRVhUX1BQUl9MRU4JCTB4MDYKKyNkZWZpbmUJTVNHX0VYVF9QUFJfUENPTVBfRU4JMHg4MAorI2RlZmluZQlNU0dfRVhUX1BQUl9SVEkJCTB4NDAKKyNkZWZpbmUJTVNHX0VYVF9QUFJfUkRfU1RSTQkweDIwCisjZGVmaW5lCU1TR19FWFRfUFBSX1dSX0ZMT1cJMHgxMAorI2RlZmluZQlNU0dfRVhUX1BQUl9IT0xEX01DUwkweDA4CisjZGVmaW5lCU1TR19FWFRfUFBSX1FBU19SRVEJMHgwNAorI2RlZmluZQlNU0dfRVhUX1BQUl9EVF9SRVEJMHgwMgorI2RlZmluZSBNU0dfRVhUX1BQUl9JVV9SRVEJMHgwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmU3YmIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkLmMKQEAgLTAsMCArMSwxMTE3OCBAQAorLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFkYXB0ZWMgQUlDN3h4eCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgSm9obiBBeWNvY2sKKyAqICAgVGhlIFVuaXZlcnNpdHkgb2YgQ2FsZ2FyeSBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTb3VyY2VzIGluY2x1ZGUgdGhlIEFkYXB0ZWMgMTc0MCBkcml2ZXIgKGFoYTE3NDAuYyksIHRoZSBVbHRyYXN0b3IgMjRGCisgKiBkcml2ZXIgKHVsdHJhc3Rvci5jKSwgdmFyaW91cyBMaW51eCBrZXJuZWwgc291cmNlLCB0aGUgQWRhcHRlYyBFSVNBCisgKiBjb25maWcgZmlsZSAoIWFkcDc3NzEuY2ZnKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDBBIFNlcmllcyBVc2VyJ3MgR3VpZGUsCisgKiB0aGUgTGludXggS2VybmVsIEhhY2tlcidzIEd1aWRlLCBXcml0aW5nIGEgU0NTSSBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCwKKyAqIHRoZSBBZGFwdGVjIDE1NDIgZHJpdmVyIChhaGExNTQyLmMpLCB0aGUgQWRhcHRlYyBFSVNBIG92ZXJsYXkgZmlsZQorICogKGFkcDc3NzAub3ZsKSwgdGhlIEFkYXB0ZWMgQUhBLTI3NDAgU2VyaWVzIFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLAorICogdGhlIEFkYXB0ZWMgQUlDLTc3NzAgRGF0YSBCb29rLCB0aGUgQU5TSSBTQ1NJIHNwZWNpZmljYXRpb24sIHRoZQorICogQU5TSSBTQ1NJLTIgc3BlY2lmaWNhdGlvbiAoZHJhZnQgMTBjKSwgLi4uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgTW9kaWZpY2F0aW9ucyBieSBEYW5pZWwgTS4gRWlzY2hlbiAoZGVpc2NoZW5AaXdvcmtzLkludGVyV29ya3Mub3JnKToKKyAqCisgKiAgU3Vic3RhbnRpYWxseSBtb2RpZmllZCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHdpZGUgYW5kIHR3aW4gYnVzCisgKiAgYWRhcHRlcnMsIERNQWluZyBvZiBTQ0JzLCB0YWdnZWQgcXVldWVpbmcsIElSUSBzaGFyaW5nLCBidWcgZml4ZXMsCisgKiAgU0NCIHBhZ2luZywgYW5kIG90aGVyIHJld29yayBvZiB0aGUgY29kZS4KKyAqCisgKiAgUGFydHMgb2YgdGhpcyBkcml2ZXIgd2VyZSBhbHNvIGJhc2VkIG9uIHRoZSBGcmVlQlNEIGRyaXZlciBieQorICogIEp1c3RpbiBULiBHaWJicy4gIEhpcyBjb3B5cmlnaHQgZm9sbG93czoKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBKdXN0aW4gR2liYnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBXaGVyZSB0aGlzIFNvZnR3YXJlIGlzIGNvbWJpbmVkIHdpdGggc29mdHdhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYW5kIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHdvdWxkIHJlcXVpcmUgdGhlIAorICogY29tYmluZWQgd29yayB0byBhbHNvIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMLCB0aGUgdGVybXMKKyAqIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IGluIGFkZGl0aW9uIHRvIHRob3NlIG9mIHRoZQorICogR1BMIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgdGhhdAorICogY29uZmxpY3Qgd2l0aCwgb3IgYXJlIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5LCB0aGUgR1BMLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogICAgICAkSWQ6IGFpYzd4eHguYyx2IDEuMTE5IDE5OTcvMDYvMjcgMTk6Mzk6MTggZ2liYnMgRXhwICQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoYW5rcyBhbHNvIGdvIHRvIChpbiBhbHBoYWJldGljYWwgb3JkZXIpIHRoZSBmb2xsb3dpbmc6CisgKgorICogICAgUm9yeSBCb2x0ICAgICAtIFNlcXVlbmNlciBidWcgZml4ZXMKKyAqICAgIEpheSBFc3RhYnJvb2sgLSBJbml0aWFsIERFQyBBbHBoYSBzdXBwb3J0CisgKiAgICBEb3VnIExlZGZvcmQgIC0gTXVjaCBuZWVkZWQgYWJvcnQvcmVzZXQgYnVnIGZpeGVzCisgKiAgICBLYWkgTWFraXNhcmEgIC0gRE1BaW5nIG9mIFNDQnMKKyAqCisgKiAgQSBCb290IHRpbWUgb3B0aW9uIHdhcyBhbHNvIGFkZGVkIGZvciBub3QgcmVzZXR0aW5nIHRoZSBzY3NpIGJ1cy4KKyAqCisgKiAgICBGb3JtOiAgYWljN3h4eD1leHRlbmRlZAorICogICAgICAgICAgIGFpYzd4eHg9bm9fcmVzZXQKKyAqICAgICAgICAgICBhaWM3eHh4PXVsdHJhCisgKiAgICAgICAgICAgYWljN3h4eD1pcnFfdHJpZ2dlcjpbMCwxXSAgIyAwIGVkZ2UsIDEgbGV2ZWwKKyAqICAgICAgICAgICBhaWM3eHh4PXZlcmJvc2UKKyAqCisgKiAgRGFuaWVsIE0uIEVpc2NoZW4sIGRlaXNjaGVuQGl3b3Jrcy5JbnRlcldvcmtzLm9yZywgMS8yMy85NworICoKKyAqICAkSWQ6IGFpYzd4eHguYyx2IDQuMSAxOTk3LzA2LzEyIDA4OjIzOjQyIGRlYW5nIEV4cCAkCisgKi1NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVydGhlciBkcml2ZXIgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IERvdWcgTGVkZm9yZCA8ZGxlZGZvcmRAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBEb3VnIExlZGZvcmQKKyAqCisgKiBUaGVzZSBjaGFuZ2VzIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNpbmcgdGVybXMgYXMgdGhlIEZyZWVCU0QKKyAqIGRyaXZlciB3cml0dGVuIGJ5IEp1c3RpbiBHaWJicy4gIFBsZWFzZSBzZWUgaGlzIENvcHlyaWdodCBub3RpY2UgYWJvdmUKKyAqIGZvciB0aGUgZXhhY3QgdGVybXMgYW5kIGNvbmRpdGlvbnMgY292ZXJpbmcgbXkgY2hhbmdlcyBhcyB3ZWxsIGFzIHRoZQorICogd2FycmFudHkgc3RhdGVtZW50LgorICoKKyAqIE1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgYWljN3h4eC5jLHYgNC4xIGRyaXZlciBmcm9tIERhbiBFaXNjaGVuIGluY2x1ZGUKKyAqIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG86CisgKgorICogIDE6IEltcG9ydCBvZiB0aGUgbGF0ZXN0IEZyZWVCU0Qgc2VxdWVuY2VyIGNvZGUgZm9yIHRoaXMgZHJpdmVyCisgKiAgMjogTW9kaWZpY2F0aW9uIG9mIGtlcm5lbCBjb2RlIHRvIGFjY29tbW9kYXRlIGRpZmZlcmVudCBzZXF1ZW5jZXIgc2VtYW50aWNzCisgKiAgMzogRXh0ZW5zaXZlIGNoYW5nZXMgdGhyb3VnaG91dCBrZXJuZWwgcG9ydGlvbiBvZiBkcml2ZXIgdG8gaW1wcm92ZQorICogICAgIGFib3J0L3Jlc2V0IHByb2Nlc3NpbmcgYW5kIGVycm9yIGhhbm5kbGluZworICogIDQ6IE90aGVyIHdvcmsgY29udHJpYnV0ZWQgYnkgdmFyaW91cyBwZW9wbGUgb24gdGhlIEludGVybmV0CisgKiAgNTogQ2hhbmdlcyB0byBwcmludGsgaW5mb3JtYXRpb24gYW5kIHZlcmJvc2l0eSBzZWxlY3Rpb24gY29kZQorICogIDY6IEdlbmVyYWwgcmVsaWFiaWxpdHkgcmVsYXRlZCBjaGFuZ2VzLCBlc3BlY2lhbGx5IGluIElSUSBtYW5hZ2VtZW50CisgKiAgNzogTW9kaWZpY2F0aW9ucyB0byB0aGUgZGVmYXVsdCBwcm9iZS9hdHRhY2ggb3JkZXIgZm9yIHN1cHBvcnRlZCBjYXJkcworICogIDg6IFNNUCBmcmllbmRsaW5lc3MgaGFzIGJlZW4gaW1wcm92ZWQKKyAqCisgKiBPdmVyYWxsLCB0aGlzIGRyaXZlciByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgZGVwYXJ0dXJlIGZyb20gdGhlIG9mZmljaWFsCisgKiBhaWM3eHh4IGRyaXZlciByZWxlYXNlZCBieSBEYW4gRWlzY2hlbiBpbiB0d28gd2F5cy4gIEZpcnN0LCBpbiB0aGUgY29kZQorICogaXRzZWxmLiAgQSBkaWZmIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgaXMgbm93IGEgc2V2ZXJhbAorICogdGhvdXNhbmQgbGluZSBkaWZmLiAgU2Vjb25kLCBpbiBhcHByb2FjaCB0byBzb2x2aW5nIHRoZSBzYW1lIHByb2JsZW0uICBUaGUKKyAqIHByb2JsZW0gaXMgaW1wb3J0aW5nIHRoZSBGcmVlQlNEIGFpYzd4eHggZHJpdmVyIGNvZGUgdG8gbGludXggY2FuIGJlIGEKKyAqIGRpZmZpY3VsdCBhbmQgdGltZSBjb25zdW1pbmcgcHJvY2VzcywgdGhhdCBhbHNvIGNhbiBiZSBlcnJvciBwcm9uZS4gIERhbgorICogRWlzY2hlbidzIG9mZmljaWFsIGRyaXZlciB1c2VzIHRoZSBhcHByb2FjaCB0aGF0IHRoZSBsaW51eCBhbmQgRnJlZUJTRAorICogZHJpdmVycyBzaG91bGQgYmUgYXMgaWRlbnRpY2FsIGFzIHBvc3NpYmxlLiAgVG8gdGhhdCBlbmQsIGhpcyBuZXh0IHZlcnNpb24KKyAqIG9mIHRoaXMgZHJpdmVyIHdpbGwgYmUgdXNpbmcgYSBtaWQtbGF5ZXIgY29kZSBsaWJyYXJ5IHRoYXQgaGUgaXMgZGV2ZWxvcGluZworICogdG8gbW9kZXJhdGUgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiB0aGUgbGludXggbWlkLWxldmVsIFNDU0kgY29kZSBhbmQgdGhlCisgKiBsb3cgbGV2ZWwgRnJlZUJTRCBkcml2ZXIuICBIZSBpbnRlbmRzIHRvIGJlIGFibGUgdG8gZXNzZW50aWFsbHkgZHJvcCB0aGUKKyAqIEZyZWVCU0QgZHJpdmVyIGludG8gdGhlIGxpbnV4IGtlcm5lbCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgdHdlYWtzIHRvIHNvbWUKKyAqIGluY2x1ZGUgZmlsZXMgYW5kIHRoZSBsaWtlIGFuZCBnZXQgdGhpbmdzIHdvcmtpbmcsIG1ha2luZyBmb3IgZmFzdCBlYXN5CisgKiBpbXBvcnRzIG9mIHRoZSBGcmVlQlNEIGNvZGUgaW50byBsaW51eC4KKyAqCisgKiBJIGRpc2FncmVlIHdpdGggRGFuJ3MgYXBwcm9hY2guICBOb3QgdGhhdCBJIGRvbid0IHRoaW5rIGhpcyB3YXkgb2YgZG9pbmcKKyAqIHRoaW5ncyB3b3VsZCBiZSBuaWNlLCBlYXN5IHRvIG1haW50YWluLCBhbmQgY3JlYXRlIGEgbW9yZSB1bmlmb3JtIGRyaXZlcgorICogYmV0d2VlbiBGcmVlQlNEIGFuZCBMaW51eC4gIEkgaGF2ZSBubyBvYmplY3Rpb24gdG8gdGhvc2UgaXNzdWVzLiAgTXkKKyAqIGRpc2FncmVlbWVudCBpcyBvbiB0aGUgbmVlZGVkIGZ1bmN0aW9uYWxpdHkuICBUaGVyZSBzaW1wbHkgYXJlIGNlcnRhaW4KKyAqIHRoaW5ncyB0aGF0IGFyZSBkb25lIGRpZmZlcmVudGx5IGluIEZyZWVCU0QgdGhhbiBsaW51eCB0aGF0IHdpbGwgY2F1c2UKKyAqIHByb2JsZW1zIGZvciB0aGlzIGRyaXZlciByZWdhcmRsZXNzIG9mIGFueSBtaWRkbGUgd2FyZSBEYW4gaW1wbGVtZW50cy4KKyAqIFRoZSBiaWdnZXN0IGV4YW1wbGUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IGlzIGludGVycnVwdCBzZW1hbnRpY3MuICBMaW51eAorICogZG9lc24ndCBwcm92aWRlIHRoZSBzYW1lIHByb3RlY3Rpb24gdGVjaG5pcXVlcyBhcyBGcmVlQlNEIGRvZXMsIG5vciBjYW4KKyAqIHRoZXkgYmUgZWFzaWx5IGltcGxlbWVudGVkIGluIGFueSBtaWRkbGUgd2FyZSBjb2RlIHNpbmNlIHRoZXkgd291bGQgdHJ1bHkKKyAqIGJlbG9uZyBpbiB0aGUga2VybmVsIHByb3BlciBhbmQgd291bGQgZWZmZWN0IGFsbCBkcml2ZXJzLiAgRm9yIHRoZSB0aW1lCisgKiBiZWluZywgSSBzZWUgaXNzdWVzIHN1Y2ggYXMgdGhlc2UgYXMgbWFqb3Igc3R1bWJsaW5nIGJsb2NrcyB0byB0aGUgCisgKiByZWxpYWJpbGl0eSBvZiBjb2RlIGJhc2VkIHVwb24gc3VjaCBtaWRkbGUgd2FyZS4gIFRoZXJlZm9yZSwgSSBjaG9vc2UgdG8KKyAqIHVzZSBhIGRpZmZlcmVudCBhcHByb2FjaCB0byBpbXBvcnRpbmcgdGhlIEZyZWVCU0QgY29kZSB0aGF0IGRvZXNuJ3QKKyAqIGludm9sdmUgYW55IG1pZGRsZSB3YXJlIHR5cGUgY29kZS4gIE15IGFwcHJvYWNoIGlzIHRvIGltcG9ydCB0aGUgc2VxdWVuY2VyCisgKiBjb2RlIGZyb20gRnJlZUJTRCB3aG9sZXNhbGUuICBUaGVuLCB0byBvbmx5IG1ha2UgY2hhbmdlcyBpbiB0aGUga2VybmVsCisgKiBwb3J0aW9uIG9mIHRoZSBkcml2ZXIgYXMgdGhleSBhcmUgbmVlZGVkIGZvciB0aGUgbmV3IHNlcXVlbmNlciBzZW1hbnRpY3MuCisgKiBJbiB0aGlzIHdheSwgdGhlIHBvcnRpb24gb2YgdGhlIGRyaXZlciB0aGF0IHNwZWFrcyB0byB0aGUgcmVzdCBvZiB0aGUKKyAqIGxpbnV4IGtlcm5lbCBpcyBmYWlybHkgc3RhdGljIGFuZCBjYW4gYmUgY2hhbmdlZC9tb2RpZmllZCB0byBzb2x2ZQorICogYW55IHByb2JsZW1zIG9uZSBtaWdodCBlbmNvdW50ZXIgd2l0aG91dCBjb25jZXJuIGZvciB0aGUgRnJlZUJTRCBkcml2ZXIuCisgKgorICogTm90ZTogSWYgdGltZSBhbmQgZXhwZXJpZW5jZSBzaG91bGQgcHJvdmUgbWUgd3JvbmcgdGhhdCB0aGUgbWlkZGxlIHdhcmUKKyAqIGNvZGUgRGFuIHdyaXRlcyBpcyByZWxpYWJsZSBpbiBpdHMgb3BlcmF0aW9uLCB0aGVuIEknbGwgcmV0cmFjdCBteSBhYm92ZQorICogc3RhdGVtZW50cy4gIEJ1dCwgZm9yIHRob3NlIHRoYXQgZG9uJ3Qga25vdywgSSdtIGZyb20gTWlzc291cmkgKGluIHRoZSBVUykKKyAqIGFuZCBvdXIgc3RhdGUgbW90dG8gaXMgIlRoZSBTaG93LU1lIFN0YXRlIi4gIFdlbGwsIGJlZm9yZSBJIHdpbGwgcHV0CisgKiBmYWl0aCBpbnRvIGl0LCB5b3UnbGwgaGF2ZSB0byBzaG93IG1lIHRoYXQgaXQgd29ya3MgOikKKyAqCisgKl9NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBuZXh0IHRocmVlIGRlZmluZXMgYXJlIHVzZXIgY29uZmlndXJhYmxlLiAgVGhlc2Ugc2hvdWxkIGJlIHRoZSBvbmx5CisgKiBkZWZpbmVzIGEgdXNlciBtaWdodCBuZWVkIHRvIGdldCBpbiBoZXJlIGFuZCBjaGFuZ2UuICBUaGVyZSBhcmUgb3RoZXIKKyAqIGRlZmluZXMgYnVyaWVkIGRlZXBlciBpbiB0aGUgY29kZSwgYnV0IHRob3NlIHJlYWxseSBzaG91bGRuJ3QgbmVlZCB0b3VjaGVkCisgKiB1bmRlciBub3JtYWwgY29uZGl0aW9ucy4KKyAqLworCisvKgorICogQUlDN1hYWF9TVFJJQ1RfUENJX1NFVFVQCisgKiAgIFNob3VsZCB3ZSBhc3N1bWUgdGhlIFBDSSBjb25maWcgb3B0aW9ucyBvbiBvdXIgY29udHJvbGxlcnMgYXJlIHNldCB3aXRoCisgKiAgIHNhbmUgYW5kIHByb3BlciB2YWx1ZXMsIG9yIHNob3VsZCB3ZSBiZSBhbmFsIGFib3V0IG91ciBQQ0kgY29uZmlnCisgKiAgIHJlZ2lzdGVycyBhbmQgZm9yY2UgdGhlbSB0byB3aGF0IHdlIHdhbnQ/ICBUaGUgbWFpbiBhZHZhbnRhZ2UgdG8KKyAqICAgZGVmaW5pbmcgdGhpcyBvcHRpb24gaXMgb24gbm9uLUludGVsIGhhcmR3YXJlIHdoZXJlIHRoZSBCSU9TIG1heSBub3QKKyAqICAgaGF2ZSBiZWVuIHJ1biB0byBzZXQgdGhpbmdzIHVwLCBvciBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlIEJJT1NsZXNzCisgKiAgIEFkYXB0ZWMgY29udHJvbGxlcnMsIHN1Y2ggYXMgYSAyOTEwLCB0aGF0IGRvbid0IGdldCBzZXQgdXAgYnkgdGhlCisgKiAgIEJJT1MuICBIb3dldmVyLCBrZWVwIGluIG1pbmQgdGhhdCB3ZSByZWFsbHkgZG8gc2V0IHRoZSBtb3N0IGltcG9ydGFudAorICogICBpdGVtcyBpbiB0aGUgZHJpdmVyIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLCB0aGlzIG9ubHkgY29udHJvbHMgc29tZQorICogICBvZiB0aGUgbW9yZSBlc290ZXJpYyBQQ0kgb3B0aW9ucyBvbiB0aGVzZSBjYXJkcy4gIEluIHRoYXQgc2Vuc2UsIEkKKyAqICAgd291bGQgZGVmYXVsdCB0byBsZWF2aW5nIHRoaXMgb2ZmLiAgSG93ZXZlciwgaWYgcGVvcGxlIHdpc2ggdG8gdHJ5CisgKiAgIHRoaW5ncyBib3RoIHdheXMsIHRoYXQgd291bGQgYWxzbyBoZWxwIG1lIHRvIGtub3cgaWYgdGhlcmUgYXJlIHNvbWUKKyAqICAgbWFjaGluZXMgd2hlcmUgaXQgd29ya3Mgb25lIHdheSBidXQgbm90IGFub3RoZXIuCisgKgorICogICAtLSBKdWx5IDcsIDE3OjA5CisgKiAgICAgT0suLi5JIG5lZWQgdGhpcyBvbiBteSBtYWNoaW5lIGZvciB0ZXN0aW5nLCBzbyB0aGUgZGVmYXVsdCBpcyB0bworICogICAgIGxlYXZlIGl0IGRlZmluZWQuCisgKgorICogICAtLSBKdWx5IDcsIDE4OjQ5CisgKiAgICAgSSBuZWVkZWQgaXQgZm9yIHRlc3RpbmcsIGJ1dCBpdCBkaWRuJ3QgbWFrZSBhbnkgZGlmZmVyZW5jZSwgc28gYmFjaworICogICAgIG9mZiBzaGUgZ29lcy4KKyAqCisgKiAgIC0tIEp1bHkgMTYsIDIzOjA0CisgKiAgICAgSSB0dXJuZWQgaXQgYmFjayBvbiB0byB0cnkgYW5kIGNvbXBlbnNhdGUgZm9yIHRoZSAyLjEueCBQQ0kgY29kZQorICogICAgIHdoaWNoIG5vIGxvbmdlciByZWxpZXMgc29sZWx5IG9uIHRoZSBCSU9TIGFuZCBub3cgdHJpZXMgdG8gc2V0CisgKiAgICAgdGhpbmdzIGl0c2VsZi4KKyAqLworCisjZGVmaW5lIEFJQzdYWFhfU1RSSUNUX1BDSV9TRVRVUAorCisvKgorICogQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICogICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgbG90IG9mIGV4dHJhIHByaW50aygpO3MgaW4gdGhlIGNvZGUsIHN1cnJvdW5kZWQKKyAqICAgYnkgaWYgKGFpYzd4eHhfdmVyYm9zZSAuLi4pIHN0YXRlbWVudHMuICBFeGVjdXRpbmcgYWxsIG9mIHRob3NlIGlmCisgKiAgIHN0YXRlbWVudHMgYW5kIHRoZSBleHRyYSBjaGVja3MgY2FuIGdldCB0byB3aGVyZSBpdCBhY3R1YWxseSBkb2VzIGhhdmUKKyAqICAgYW4gaW1wYWN0IG9uIENQVSB1c2FnZSBhbmQgc3VjaCwgYXMgd2VsbCBhcyBjb2RlIHNpemUuICBEaXNhYmxpbmcgdGhpcworICogICBkZWZpbmUgd2lsbCBrZWVwIHNvbWUgb2YgdGhvc2UgZnJvbSBiZWNvbWluZyBwYXJ0IG9mIHRoZSBjb2RlLgorICoKKyAqICAgTk9URTogIEN1cnJlbnRseSwgdGhpcyBvcHRpb24gaGFzIG5vIHJlYWwgZWZmZWN0LCBJIHdpbGwgYmUgYWRkaW5nIHRoZQorICogICB2YXJpb3VzICNpZmRlZidzIGluIHRoZSBjb2RlIGxhdGVyIHdoZW4gSSd2ZSBkZWNpZGVkIGEgc2VjdGlvbiBpcworICogICBjb21wbGV0ZSBhbmQgbm8gbG9uZ2VyIG5lZWRzIGRlYnVnZ2luZy4gIE9LLi4uYSBsb3Qgb2YgdGhpbmdzIGFyZSBub3cKKyAqICAgc3Vycm91bmRlZCBieSB0aGlzIGRlZmluZSwgc28gdHVybmluZyB0aGlzIG9mZiBkb2VzIGhhdmUgYW4gaW1wYWN0LgorICovCisgCisvKgorICogI2RlZmluZSBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJhaWM3eHh4X29sZC9haWM3eHh4LmgiCisKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9zZXF1ZW5jZXIuaCIKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9zY3NpX21lc3NhZ2UuaCIKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9haWM3eHh4X3JlZy5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gICAgICAgIC8qIGZvciBrbWFsbG9jKCkgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAgICAgICAgLyogZm9yIENPTkZJR19QQ0kgKi8KKworI2RlZmluZSBBSUM3WFhYX0NfVkVSU0lPTiAgIjUuMi42IgorCisjZGVmaW5lIEFMTF9UQVJHRVRTIC0xCisjZGVmaW5lIEFMTF9DSEFOTkVMUyAtMQorI2RlZmluZSBBTExfTFVOUyAtMQorI2RlZmluZSBNQVhfVEFSR0VUUyAgMTYKKyNkZWZpbmUgTUFYX0xVTlMgICAgIDgKKyNpZm5kZWYgVFJVRQorIyAgZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjICBkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjICBkZWZpbmUgTU1BUElPCisjZW5kaWYKKworLyoKKyAqIFlvdSBjYW4gdHJ5IHJhaXNpbmcgbWUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBvciBsb3dlcmluZyBtZSBpZiB5b3UgaGF2ZQorICogZmxha3kgZGV2aWNlcyB0aGF0IGdvIG9mZiB0aGUgc2NzaSBidXMgd2hlbiBoaXQgd2l0aCB0b28gbWFueSB0YWdnZWQKKyAqIGNvbW1hbmRzIChsaWtlIHNvbWUgSUJNIFNDU0ktMyBMVkQgZHJpdmVzKS4KKyAqLworI2RlZmluZSBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRSAzMgorCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBjaGFyIHRhZ19jb21tYW5kc1sxNl07ICAgLyogQWxsb3cgZm9yIHdpZGUvdHdpbiBhZGFwdGVycy4gKi8KK30gYWRhcHRlcl90YWdfaW5mb190OworCisvKgorICogTWFrZSBhIGRlZmluZSB0aGF0IHdpbGwgdGVsbCB0aGUgZHJpdmVyIG5vdCB0byB0aGUgZGVmYXVsdCB0YWcgZGVwdGgKKyAqIGV2ZXJ5d2hlcmUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9UQUdfQ09NTUFORFMgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworLyoKKyAqIE1vZGlmeSB0aGlzIGFzIHlvdSBzZWUgZml0IGZvciB5b3VyIHN5c3RlbS4gIEJ5IHNldHRpbmcgdGFnX2NvbW1hbmRzCisgKiB0byAwLCB0aGUgZHJpdmVyIHdpbGwgdXNlIGl0J3Mgb3duIGFsZ29yaXRobSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgKiBudW1iZXIgb2YgY29tbWFuZHMgdG8gdXNlIChzZWUgYWJvdmUpLiAgV2hlbiAyNTUsIHRoZSBkcml2ZXIgd2lsbAorICogbm90IGVuYWJsZSB0YWdnZWQgcXVldWVpbmcgZm9yIHRoYXQgcGFydGljdWxhciBkZXZpY2UuICBXaGVuIHBvc2l0aXZlCisgKiAoPiAwKSBhbmQgKDwgMjU1KSB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBhcmUgdXNlZCBmb3IgdGhlIHF1ZXVlX2RlcHRoLgorICogTm90ZSB0aGF0IHRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbiBlbnRyeSBpcyAyNTQsIGJ1dCB5b3UncmUgaW5zYW5lIGlmCisgKiB5b3UgdHJ5IHRvIHVzZSB0aGF0IG1hbnkgY29tbWFuZHMgb24gb25lIGRldmljZS4KKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmaXJzdCBsaW5lIHdpbGwgZGlzYWJsZSB0YWdnZWQgcXVldWVpbmcgZm9yIGFsbAorICogdGhlIGRldmljZXMgb24gdGhlIGZpcnN0IHByb2JlZCBhaWM3eHh4IGFkYXB0ZXIuCisgKgorICogVGhlIHNlY29uZCBsaW5lIGVuYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIHdpdGggNCBjb21tYW5kcy9MVU4gZm9yIElEcworICogKDEsIDItMTEsIDEzLTE1KSwgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciBJRCAxMiwgYW5kIHRlbGxzIHRoZQorICogZHJpdmVyIHRvIHVzZSBpdHMgb3duIGFsZ29yaXRobSBmb3IgSUQgMS4KKyAqCisgKiBUaGUgdGhpcmQgbGluZSBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgbGluZS4KKyAqCisgKiBUaGUgZm91cnRoIGxpbmUgZGlzYWJsZXMgdGFnZ2VkIHF1ZXVlaW5nIGZvciBkZXZpY2VzIDAgYW5kIDMuICBJdAorICogZW5hYmxlcyB0YWdnZWQgcXVldWVpbmcgZm9yIHRoZSBvdGhlciBJRHMsIHdpdGggMTYgY29tbWFuZHMvTFVOCisgKiBmb3IgSURzIDEgYW5kIDQsIDEyNyBjb21tYW5kcy9MVU4gZm9yIElEIDgsIGFuZCA0IGNvbW1hbmRzL0xVTiBmb3IKKyAqIElEcyAyLCA1LTcsIGFuZCA5LTE1LgorICovCisKKy8qCisgKiBOT1RFOiBUaGUgYmVsb3cgc3RydWN0dXJlIGlzIGZvciByZWZlcmVuY2Ugb25seSwgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUKKyAqICAgICAgIHRvIG1vZGlmeSBpbiBvcmRlciB0byBjaGFuZ2UgdGhpbmdzIGlzIGZvdW5kIGFmdGVyIHRoaXMgZmFrZSBvbmUuCisgKgorYWRhcHRlcl90YWdfaW5mb190IGFpYzd4eHhfdGFnX2luZm9bXSA9Cit7CisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHt7NCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMjU1LCA0LCA0LCA0fX0sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHt7MjU1LCAxNiwgNCwgMjU1LCAxNiwgNCwgNCwgNCwgMTI3LCA0LCA0LCA0LCA0LCA0LCA0LCA0fX0KK307CisqLworCitzdGF0aWMgYWRhcHRlcl90YWdfaW5mb190IGFpYzd4eHhfdGFnX2luZm9bXSA9Cit7CisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30sCisgIHtERUZBVUxUX1RBR19DT01NQU5EU30KK307CisKKworLyoKKyAqIERlZmluZSBhbiBhcnJheSBvZiBib2FyZCBuYW1lcyB0aGF0IGNhbiBiZSBpbmRleGVkIGJ5IGFoYV90eXBlLgorICogRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGlzIHdoZW4gY2hhbmdpbmcgdGhlIHR5cGVzIQorICovCitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRfbmFtZXNbXSA9IHsKKyAgIkFJQy03eHh4IFVua25vd24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUlDX05PTkUgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4MTAgSGFyZHdhcmUgUkFJRCBDb250cm9sbGVyIiwgICAgICAgICAgLyogQUlDXzc4MTAgKi8KKyAgIkFkYXB0ZWMgQUlDLTc3NzAgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc3NzAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI3NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc3NzEgKi8KKyAgIkFkYXB0ZWMgQUhBLTI4NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzI4NHggKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NTAgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NTAgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NTUgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NTUgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NjAgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4NjAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDBBIFVsdHJhIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4NjEgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4NzAgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzEgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzIgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5OFggU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzMgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDQgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgICAgICAgLyogQUlDXzc4NzQgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4ODAgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NFggVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODEgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NFggVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODIgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5OFggVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODMgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDQgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4ODQgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NDBVVyBQcm8gVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgLyogQUlDXzc4ODcgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTUgVWx0cmEgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgICAgLyogQUlDXzc4OTUgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTAvMSBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgLyogQUlDXzc4OTAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5M1ggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTAgKi8KKyAgIkFkYXB0ZWMgQUhBLTI5NFggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTAgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTYvNyBVbHRyYTIgU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgICAgLyogQUlDXzc4OTYgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NFggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTcgKi8KKyAgIkFkYXB0ZWMgQUhBLTM5NVggVWx0cmEyIFNDU0kgaG9zdCBhZGFwdGVyIiwgICAgICAgICAgLyogQUlDXzc4OTcgKi8KKyAgIkFkYXB0ZWMgUENNQ0lBIFNDU0kgY29udHJvbGxlciIsICAgICAgICAgICAgICAgICAgICAgLyogY2FyZCBidXMgc3R1ZmYgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTIgVWx0cmEgMTYwL20gU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgLyogQUlDXzc4OTIgKi8KKyAgIkFkYXB0ZWMgQUlDLTc4OTkgVWx0cmEgMTYwL20gU0NTSSBob3N0IGFkYXB0ZXIiLCAgICAgLyogQUlDXzc4OTkgKi8KK307CisKKy8qCisgKiBUaGVyZSBzaG91bGQgYmUgYSBzcGVjaWZpYyByZXR1cm4gdmFsdWUgZm9yIHRoaXMgaW4gc2NzaS5oLCBidXQKKyAqIGl0IHNlZW1zIHRoYXQgbW9zdCBkcml2ZXJzIGlnbm9yZSBpdC4KKyAqLworI2RlZmluZSBESURfVU5ERVJGTE9XICAgRElEX0VSUk9SCisKKy8qCisgKiAgV2hhdCB3ZSB3YW50IHRvIGRvIGlzIGhhdmUgdGhlIGhpZ2hlciBsZXZlbCBzY3NpIGRyaXZlciByZXF1ZXVlCisgKiAgdGhlIGNvbW1hbmQgdG8gdXMuIFRoZXJlIGlzIG5vIHNwZWNpZmljIGRyaXZlciBzdGF0dXMgZm9yIHRoaXMKKyAqICBjb25kaXRpb24sIGJ1dCB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZHJpdmVyIHdpbGwgcmVxdWV1ZSB0aGUKKyAqICBjb21tYW5kIG9uIGEgRElEX0JVU19CVVNZIGVycm9yLgorICoKKyAqICBVcG9uIGZ1cnRoZXIgaW5zcGVjdGlvbiBhbmQgdGVzdGluZywgaXQgc2VlbXMgdGhhdCBESURfQlVTX0JVU1kKKyAqICB3aWxsICphbHdheXMqIHJldHJ5IHRoZSBjb21tYW5kLiAgV2UgY2FuIGdldCBpbnRvIGFuIGluZmluaXRlIGxvb3AKKyAqICBpZiB0aGlzIGhhcHBlbnMgd2hlbiB3ZSByZWFsbHkgd2FudCBzb21lIHNvcnQgb2YgY291bnRlciB0aGF0CisgKiAgd2lsbCBhdXRvbWF0aWNhbGx5IGFib3J0L3Jlc2V0IHRoZSBjb21tYW5kIGFmdGVyIHNvIG1hbnkgcmV0cmllcy4KKyAqICBVc2luZyBESURfRVJST1Igd2lsbCBkbyBqdXN0IHRoYXQuICAoTWFkZSBieSBhIHN1Z2dlc3Rpb24gYnkKKyAqICBEb3VnIExlZGZvcmQgOC8xLzk2KQorICovCisjZGVmaW5lIERJRF9SRVRSWV9DT01NQU5EIERJRF9FUlJPUgorCisjZGVmaW5lIEhTQ1NJSUQgICAgICAgIDB4MDcKKyNkZWZpbmUgU0NTSV9SRVNFVCAgICAgMHgwNDAKKworLyoKKyAqIEVJU0EvVkwtYnVzIHN0dWZmCisgKi8KKyNkZWZpbmUgTUlOU0xPVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BWFNMT1QgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgU0xPVEJBU0UoeCkgICAgICAgICgoeCkgPDwgMTIpCisjZGVmaW5lIEJBU0VfVE9fU0xPVCh4KSAoKHgpID4+IDEyKQorCisvKgorICogU3RhbmRhcmQgRUlTQSBIb3N0IElEIHJlZ3MgIChPZmZzZXQgZnJvbSBzbG90IGJhc2UpCisgKi8KKyNkZWZpbmUgQUhDX0hJRDAgICAgICAgICAgICAgIDB4ODAgICAvKiAwLDE6IG1zYiBvZiBJRDIsIDItNzogSUQxICAgICAgKi8KKyNkZWZpbmUgQUhDX0hJRDEgICAgICAgICAgICAgIDB4ODEgICAvKiAwLTQ6IElEMywgNS03OiBMU0IgSUQyICAgICAgICAgKi8KKyNkZWZpbmUgQUhDX0hJRDIgICAgICAgICAgICAgIDB4ODIgICAvKiBwcm9kdWN0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUhDX0hJRDMgICAgICAgICAgICAgIDB4ODMgICAvKiBmaXJtd2FyZSByZXZpc2lvbiAgICAgICAgICAgICAgKi8KKworLyoKKyAqIEFJQy03NzcwIEkvTyByYW5nZSB0byByZXNlcnZlIGZvciBhIGNhcmQKKyAqLworI2RlZmluZSBNSU5SRUcgICAgICAgICAgICAgICAgMHhDMDAKKyNkZWZpbmUgTUFYUkVHICAgICAgICAgICAgICAgIDB4Q0ZGCisKKyNkZWZpbmUgSU5UREVGICAgICAgICAgICAgICAgIDB4NUMgICAgICAvKiBJbnRlcnJ1cHQgRGVmaW5pdGlvbiBSZWdpc3RlciAqLworCisvKgorICogQUlDLTc4WDAgUENJIHJlZ2lzdGVycworICovCisjZGVmaW5lICAgICAgICBDTEFTU19QUk9HSUZfUkVWSUQgICAgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICAgICAgICAgREVWUkVWSUQgICAgICAgIDB4MDAwMDAwRkZ1bAorI2RlZmluZSAgICAgICAgICAgICAgICBQUk9HSU5GQyAgICAgICAgMHgwMDAwRkYwMHVsCisjZGVmaW5lICAgICAgICAgICAgICAgIFNVQkNMQVNTICAgICAgICAweDAwRkYwMDAwdWwKKyNkZWZpbmUgICAgICAgICAgICAgICAgQkFTRUNMQVNTICAgICAgICAweEZGMDAwMDAwdWwKKworI2RlZmluZSAgICAgICAgQ1NJWkVfTEFUVElNRSAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lICAgICAgICAgICAgICAgIENBQ0hFU0laRSAgICAgICAgMHgwMDAwMDAzRnVsICAgICAgICAvKiBvbmx5IDUgYml0cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBMQVRUSU1FICAgICAgICAgICAgICAgIDB4MDAwMEZGMDB1bAorCisjZGVmaW5lICAgICAgICBERVZDT05GSUcgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSAgICAgICAgICAgICAgICBTQ0JTSVpFMzIgICAgICAgIDB4MDAwMTAwMDB1bCAgICAgICAgLyogYWljNzg5WCBvbmx5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIE1QT1JUTU9ERSAgICAgICAgMHgwMDAwMDQwMHVsICAgICAgICAvKiBhaWM3ODcwIG9ubHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgUkFNUFNNICAgICAgICAgICAweDAwMDAwMjAwdWwgICAgICAgIC8qIGFpYzc4NzAgb25seSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBSQU1QU01fVUxUUkEyICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgICAgICAgICAgICAgICAgVk9MU0VOU0UgICAgICAgICAweDAwMDAwMTAwdWwKKyNkZWZpbmUgICAgICAgICAgICAgICAgU0NCUkFNU0VMICAgICAgICAweDAwMDAwMDgwdWwKKyNkZWZpbmUgICAgICAgICAgICAgICAgU0NCUkFNU0VMX1VMVFJBMiAweDAwMDAwMDA4CisjZGVmaW5lICAgICAgICAgICAgICAgIE1SRENFTiAgICAgICAgICAgMHgwMDAwMDA0MHVsCisjZGVmaW5lICAgICAgICAgICAgICAgIEVYVFNDQlRJTUUgICAgICAgMHgwMDAwMDAyMHVsICAgICAgICAvKiBhaWM3ODcwIG9ubHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVhUU0NCUEVOICAgICAgICAweDAwMDAwMDEwdWwgICAgICAgIC8qIGFpYzc4NzAgb25seSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBCRVJSRU4gICAgICAgICAgIDB4MDAwMDAwMDh1bAorI2RlZmluZSAgICAgICAgICAgICAgICBEQUNFTiAgICAgICAgICAgIDB4MDAwMDAwMDR1bAorI2RlZmluZSAgICAgICAgICAgICAgICBTVFBXTEVWRUwgICAgICAgIDB4MDAwMDAwMDJ1bAorI2RlZmluZSAgICAgICAgICAgICAgICBESUZBQ1RORUdFTiAgICAgIDB4MDAwMDAwMDF1bCAgICAgICAgLyogYWljNzg3MCBvbmx5ICovCisKKyNkZWZpbmUgICAgICAgIFNDQU1DVEwgICAgICAgICAgICAgICAgICAweDFhICAgICAgICAgICAgICAgIC8qIFVsdHJhMiBvbmx5ICAqLworI2RlZmluZSAgICAgICAgQ0NTQ0JCQUREUiAgICAgICAgICAgICAgIDB4ZjAgICAgICAgICAgICAgICAgLyogYWljNzg5NS82LzcgICovCisKKy8qCisgKiBEZWZpbmUgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBTRUVQUk9NcyBvbiBhaWM3eHh4IGFkYXB0ZXJzCisgKiBhbmQgbWFrZSBpdCBhbHNvIHJlcHJlc2VudCB0aGUgYWRkcmVzcyBzaXplIHVzZWQgaW4gYWNjZXNzaW5nCisgKiBpdHMgcmVnaXN0ZXJzLiAgVGhlIDkzQzQ2IGNoaXBzIGhhdmUgMTAyNCBiaXRzIG9yZ2FuaXplZCBpbnRvCisgKiA2NCAxNi1iaXQgd29yZHMsIHdoaWxlIHRoZSA5M0M1NiBjaGlwcyBoYXZlIDIwNDggYml0cyBvcmdhbml6ZWQKKyAqIGludG8gMTI4IDE2LWJpdCB3b3Jkcy4gIFRoZSBDNDYgY2hpcHMgdXNlIDYgYml0cyB0byBhZGRyZXNzCisgKiBlYWNoIHdvcmQsIHdoaWxlIHRoZSBDNTYgYW5kIEM2NiAoNDA5NiBiaXRzKSB1c2UgOCBiaXRzIHRvCisgKiBhZGRyZXNzIGVhY2ggd29yZC4KKyAqLwordHlwZWRlZiBlbnVtIHtDNDYgPSA2LCBDNTZfNjYgPSA4fSBzZWVwcm9tX2NoaXBfdHlwZTsKKworLyoKKyAqCisgKiBEZWZpbmUgdGhlIGZvcm1hdCBvZiB0aGUgU0VFUFJPTSByZWdpc3RlcnMgKDE2IGJpdHMpLgorICoKKyAqLworc3RydWN0IHNlZXByb21fY29uZmlnIHsKKworLyoKKyAqIFNDU0kgSUQgQ29uZmlndXJhdGlvbiBGbGFncworICovCisjZGVmaW5lIENGWEZFUiAgICAgICAgICAgICAgICAweDAwMDcgICAgICAvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lIENGU1lOQ0ggICAgICAgICAgICAgICAweDAwMDggICAgICAvKiBlbmFibGUgc3luY2hyb25vdXMgdHJhbnNmZXIgKi8KKyNkZWZpbmUgQ0ZESVNDICAgICAgICAgICAgICAgIDB4MDAxMCAgICAgIC8qIGVuYWJsZSBkaXNjb25uZWN0aW9uICovCisjZGVmaW5lIENGV0lERUIgICAgICAgICAgICAgICAweDAwMjAgICAgICAvKiB3aWRlIGJ1cyBkZXZpY2UgKHdpZGUgY2FyZCkgKi8KKyNkZWZpbmUgQ0ZTWU5DSElTVUxUUkEgICAgICAgIDB4MDA0MCAgICAgIC8qIENGU1lOQyBpcyBhbiB1bHRyYSBvZmZzZXQgKi8KKyNkZWZpbmUgQ0ZORVdVTFRSQUZPUk1BVCAgICAgIDB4MDA4MCAgICAgIC8qIFVzZSB0aGUgVWx0cmEyIFNFRVBST00gZm9ybWF0ICovCisjZGVmaW5lIENGU1RBUlQgICAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBzZW5kIHN0YXJ0IHVuaXQgU0NTSSBjb21tYW5kICovCisjZGVmaW5lIENGSU5DQklPUyAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBpbmNsdWRlIGluIEJJT1Mgc2NhbiAqLworI2RlZmluZSBDRlJORk9VTkQgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogcmVwb3J0IGV2ZW4gaWYgbm90IGZvdW5kICovCisjZGVmaW5lIENGTVVMVElMVU4gICAgICAgICAgICAweDA4MDAgICAgICAvKiBwcm9iZSBtdWx0IGx1bnMgaW4gQklPUyBzY2FuICovCisjZGVmaW5lIENGV0JDQUNIRVlFUyAgICAgICAgICAweDQwMDAgICAgICAvKiBFbmFibGUgVy1CZWhpbmQgQ2FjaGUgb24gZHJpdmUgKi8KKyNkZWZpbmUgQ0ZXQkNBQ0hFTkMgICAgICAgICAgIDB4YzAwMCAgICAgIC8qIERvbid0IGNoYW5nZSBXLUJlaGluZCBDYWNoZSAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4MzAwMCAqLworICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfZmxhZ3NbMTZdOyAgICAgICAgLyogd29yZHMgMC0xNSAqLworCisvKgorICogQklPUyBDb250cm9sIEJpdHMKKyAqLworI2RlZmluZSBDRlNVUFJFTSAgICAgICAgMHgwMDAxICAvKiBzdXBwb3J0IGFsbCByZW1vdmFibGUgZHJpdmVzICovCisjZGVmaW5lIENGU1VQUkVNQiAgICAgICAweDAwMDIgIC8qIHN1cHBvcnQgcmVtb3ZhYmxlIGRyaXZlcyBmb3IgYm9vdCBvbmx5ICovCisjZGVmaW5lIENGQklPU0VOICAgICAgICAweDAwMDQgIC8qIEJJT1MgZW5hYmxlZCAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4MDAwOCAqLworI2RlZmluZSBDRlNNMkRSViAgICAgICAgMHgwMDEwICAvKiBzdXBwb3J0IG1vcmUgdGhhbiB0d28gZHJpdmVzICovCisjZGVmaW5lIENGMjg0WEVYVEVORCAgICAweDAwMjAgIC8qIGV4dGVuZGVkIHRyYW5zbGF0aW9uICgyODR4IGNhcmRzKSAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4MDA0MCAqLworI2RlZmluZSBDRkVYVEVORCAgICAgICAgMHgwMDgwICAvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiBlbmFibGVkICovCisvKiBVTlVTRUQgICAgICAgICAgICAgICAgMHhGRjAwICovCisgIHVuc2lnbmVkIHNob3J0IGJpb3NfY29udHJvbDsgIC8qIHdvcmQgMTYgKi8KKworLyoKKyAqIEhvc3QgQWRhcHRlciBDb250cm9sIEJpdHMKKyAqLworI2RlZmluZSBDRkFVVE9URVJNICAgICAgMHgwMDAxICAvKiBQZXJmb3JtIEF1dG8gdGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ0ZVTFRSQUVOICAgICAgIDB4MDAwMiAgLyogVWx0cmEgU0NTSSBzcGVlZCBlbmFibGUgKFVsdHJhIGNhcmRzKSAqLworI2RlZmluZSBDRjI4NFhTRUxUTyAgICAgMHgwMDAzICAvKiBTZWxlY3Rpb24gdGltZW91dCAoMjg0eCBjYXJkcykgKi8KKyNkZWZpbmUgQ0YyODRYRklGTyAgICAgIDB4MDAwQyAgLyogRklGTyBUaHJlc2hvbGQgKDI4NHggY2FyZHMpICovCisjZGVmaW5lIENGU1RFUk0gICAgICAgICAweDAwMDQgIC8qIFNDU0kgbG93IGJ5dGUgdGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ0ZXU1RFUk0gICAgICAgIDB4MDAwOCAgLyogU0NTSSBoaWdoIGJ5dGUgdGVybWluYXRpb24gKHdpZGUgY2FyZCkgKi8KKyNkZWZpbmUgQ0ZTUEFSSVRZICAgICAgIDB4MDAxMCAgLyogU0NTSSBwYXJpdHkgKi8KKyNkZWZpbmUgQ0YyODRYU1RFUk0gICAgIDB4MDAyMCAgLyogU0NTSSBsb3cgYnl0ZSB0ZXJtaW5hdGlvbiAoMjg0eCBjYXJkcykgKi8KKyNkZWZpbmUgQ0ZSRVNFVEIgICAgICAgIDB4MDA0MCAgLyogcmVzZXQgU0NTSSBidXMgYXQgYm9vdCAqLworI2RlZmluZSBDRkJQUklNQVJZICAgICAgMHgwMTAwICAvKiBDaGFubmVsIEIgcHJpbWFyeSBvbiA3ODk1IGNoaXBzZXRzICovCisjZGVmaW5lIENGU0VBVVRPVEVSTSAgICAweDA0MDAgIC8qIGFpYzc4OTAgUGVyZm9ybSBTRSBBdXRvIFRlcm0gKi8KKyNkZWZpbmUgQ0ZMVkRTVEVSTSAgICAgIDB4MDgwMCAgLyogYWljNzg5MCBMVkQgVGVybWluYXRpb24gKi8KKy8qIFVOVVNFRCAgICAgICAgICAgICAgICAweEYyODAgKi8KKyAgdW5zaWduZWQgc2hvcnQgYWRhcHRlcl9jb250cm9sOyAgICAgICAgLyogd29yZCAxNyAqLworCisvKgorICogQnVzIFJlbGVhc2UsIEhvc3QgQWRhcHRlciBJRAorICovCisjZGVmaW5lIENGU0NTSUlEICAgICAgICAweDAwMEYgICAgICAgICAgICAgICAgLyogaG9zdCBhZGFwdGVyIFNDU0kgSUQgKi8KKy8qIFVOVVNFRCAgICAgICAgICAgICAgICAweDAwRjAgKi8KKyNkZWZpbmUgQ0ZCUlRJTUUgICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgICAvKiBidXMgcmVsZWFzZSB0aW1lICovCisgIHVuc2lnbmVkIHNob3J0IGJydGltZV9pZDsgICAgICAgICAgICAgICAgLyogd29yZCAxOCAqLworCisvKgorICogTWF4aW11bSB0YXJnZXRzCisgKi8KKyNkZWZpbmUgQ0ZNQVhUQVJHICAgICAgICAweDAwRkYgICAgICAgIC8qIG1heGltdW0gdGFyZ2V0cyAqLworLyogVU5VU0VEICAgICAgICAgICAgICAgIDB4RkYwMCAqLworICB1bnNpZ25lZCBzaG9ydCBtYXhfdGFyZ2V0czsgICAgICAgICAgICAgICAgLyogd29yZCAxOSAqLworCisgIHVuc2lnbmVkIHNob3J0IHJlc18xWzExXTsgICAgICAgICAgICAgICAgLyogd29yZHMgMjAtMzAgKi8KKyAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW07ICAgICAgICAgICAgICAgIC8qIHdvcmQgMzEgKi8KK307CisKKyNkZWZpbmUgU0VMQlVTX01BU0sgICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSAgICAgICAgIFNFTE5BUlJPVyAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIFNFTEJVU0IgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTSU5HTEVfQlVTICAgICAgICAgICAgICAgIDB4MDAKKworI2RlZmluZSBTQ0JfVEFSR0VUKHNjYikgICAgICAgICBcCisgICAgICAgKCgoc2NiKS0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuICYgVElEKSA+PiA0KQorI2RlZmluZSBTQ0JfTFVOKHNjYikgICAgICAgICAgICBcCisgICAgICAgKChzY2IpLT5oc2NiLT50YXJnZXRfY2hhbm5lbF9sdW4gJiBMSUQpCisjZGVmaW5lIFNDQl9JU19TQ1NJQlVTX0Ioc2NiKSAgIFwKKyAgICAgICAoKChzY2IpLT5oc2NiLT50YXJnZXRfY2hhbm5lbF9sdW4gJiBTRUxCVVNCKSAhPSAwKQorCisvKgorICogSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhIGRhdGEgdHJhbnNmZXIgcGhhc2UsIHJ1biB0aGUgY29tbWFuZAorICogdG8gY29tcGxldGlvbiAtIGl0J3MgZWFzaWVyIHRoYXQgd2F5IC0gbWFraW5nIGEgbm90ZSBvZiB0aGUgZXJyb3IKKyAqIGNvbmRpdGlvbiBpbiB0aGlzIGxvY2F0aW9uLiBUaGlzIHRoZW4gd2lsbCBtb2RpZnkgYSBESURfT0sgc3RhdHVzCisgKiBpbnRvIGFuIGFwcHJvcHJpYXRlIGVycm9yIGZvciB0aGUgaGlnaGVyLWxldmVsIFNDU0kgY29kZS4KKyAqLworI2RlZmluZSBhaWM3eHh4X2Vycm9yKGNtZCkgICAgICAgICgoY21kKS0+U0NwLlN0YXR1cykKKworLyoKKyAqIEtlZXAgdHJhY2sgb2YgdGhlIHRhcmdldHMgcmV0dXJuZWQgc3RhdHVzLgorICovCisjZGVmaW5lIGFpYzd4eHhfc3RhdHVzKGNtZCkgICAgICAgICgoY21kKS0+U0NwLnNlbnRfY29tbWFuZCkKKworLyoKKyAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgU0NTSSBjb21tYW5kcyBzY2Igd2l0aGluIHRoZSBzY2IgYXJyYXkuCisgKi8KKyNkZWZpbmUgYWljN3h4eF9wb3NpdGlvbihjbWQpICAgICAgICAoKGNtZCktPlNDcC5oYXZlX2RhdGFfaW4pCisKKy8qCisgKiBUaGUgc3RvcmVkIERNQSBtYXBwaW5nIGZvciBzaW5nbGUtYnVmZmVyIGRhdGEgdHJhbnNmZXJzLgorICovCisjZGVmaW5lIGFpYzd4eHhfbWFwcGluZyhjbWQpCSAgICAgKChjbWQpLT5TQ3AucGhhc2UpCisKKy8qCisgKiBHZXQgb3V0IHByaXZhdGUgZGF0YSBhcmVhIGZyb20gYSBzY3NpIGNtZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgQUlDX0RFVihjbWQpCSgoc3RydWN0IGFpY19kZXZfZGF0YSAqKShjbWQpLT5kZXZpY2UtPmhvc3RkYXRhKQorCisvKgorICogU28gd2UgY2FuIGtlZXAgdHJhY2sgb2Ygb3VyIGhvc3Qgc3RydWN0cworICovCitzdGF0aWMgc3RydWN0IGFpYzd4eHhfaG9zdCAqZmlyc3RfYWljN3h4eCA9IE5VTEw7CisKKy8qCisgKiBBcyBvZiBMaW51eCAyLjEsIHRoZSBtaWQtbGV2ZWwgU0NTSSBjb2RlIHVzZXMgdmlydHVhbCBhZGRyZXNzZXMKKyAqIGluIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0cy4gIFdlIG5lZWQgdG8gY29udmVydCB0aGUgdmlydHVhbAorICogYWRkcmVzc2VzIHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqLworc3RydWN0IGh3X3NjYXR0ZXJsaXN0IHsKKyAgdW5zaWduZWQgaW50IGFkZHJlc3M7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgU0cgc2VnbWVudHMgdGhlc2UgY2FyZHMgY2FuIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgICAgICAgIEFJQzdYWFhfTUFYX1NHIDEyOAorCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIFNDQnMgd2UgY291bGQgaGF2ZSBmb3IgQU5ZIHR5cGUKKyAqIG9mIGNhcmQuIERPTidUIEZPUkdFVCBUTyBDSEFOR0UgVEhFIFNDQiBNQVNLIElOIFRIRQorICogU0VRVUVOQ0VSIENPREUgSUYgVEhJUyBJUyBNT0RJRklFRCEKKyAqLworI2RlZmluZSBBSUM3WFhYX01BWFNDQiAgICAgICAgMjU1CisKKworc3RydWN0IGFpYzd4eHhfaHdzY2IgeworLyogLS0tLS0tLS0tLS0tICAgIEJlZ2luIGhhcmR3YXJlIHN1cHBvcnRlZCBmaWVsZHMgICAgLS0tLS0tLS0tLS0tLS0tLSAqLworLyogMCovICB1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisvKiAxKi8gIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X2NoYW5uZWxfbHVuOyAgICAgICAvKiA0LzEvMyBiaXRzICovCisvKiAyKi8gIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X3N0YXR1czsKKy8qIDMqLyAgdW5zaWduZWQgY2hhciBTR19zZWdtZW50X2NvdW50OworLyogNCovICB1bnNpZ25lZCBpbnQgIFNHX2xpc3RfcG9pbnRlcjsKKy8qIDgqLyAgdW5zaWduZWQgY2hhciByZXNpZHVhbF9TR19zZWdtZW50X2NvdW50OworLyogOSovICB1bnNpZ25lZCBjaGFyIHJlc2lkdWFsX2RhdGFfY291bnRbM107CisvKjEyKi8gIHVuc2lnbmVkIGludCAgZGF0YV9wb2ludGVyOworLyoxNiovICB1bnNpZ25lZCBpbnQgIGRhdGFfY291bnQ7CisvKjIwKi8gIHVuc2lnbmVkIGludCAgU0NTSV9jbWRfcG9pbnRlcjsKKy8qMjQqLyAgdW5zaWduZWQgY2hhciBTQ1NJX2NtZF9sZW5ndGg7CisvKjI1Ki8gIHVuc2lnbmVkIGNoYXIgdGFnOyAgICAgICAgICAvKiBJbmRleCBpbnRvIG91ciBrZXJuZWwgU0NCIGFycmF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQWxzbyB1c2VkIGFzIHRoZSB0YWcgZm9yIHRhZ2dlZCBJL08KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ0JfUElPX1RSQU5TRkVSX1NJWkUgIDI2ICAgLyogYW1vdW50IHdlIG5lZWQgdG8gdXBsb2FkL2Rvd25sb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2aWEgUElPIHRvIGluaXRpYWxpemUgYSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoyNiovICB1bnNpZ25lZCBjaGFyIG5leHQ7ICAgICAgICAgLyogVXNlZCB0byB0aHJlYWQgU0NCcyBhd2FpdGluZyBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBkb3duIGluIHRoZSBzZXF1ZW5jZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qMjcqLyAgdW5zaWduZWQgY2hhciBwcmV2OworLyoyOCovICB1bnNpZ25lZCBpbnQgcGFkOyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVudXNlZCBieSB0aGUga2VybmVsLCBidXQgd2UgcmVxdWlyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBhZGRpbmcgc28gdGhhdCB0aGUgYXJyYXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhcmR3YXJlIFNDQnMgaXMgYWxpZ25lZCBvbiAzMiBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBib3VuZGFyaWVzIHNvIHRoZSBzZXF1ZW5jZXIgY2FuIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgICAgIFNDQl9GUkVFICAgICAgICAgICAgICAgID0gMHgwMDAwLAorICAgICAgICBTQ0JfRFRSX1NDQiAgICAgICAgICAgICA9IDB4MDAwMSwKKyAgICAgICAgU0NCX1dBSVRJTkdRICAgICAgICAgICAgPSAweDAwMDIsCisgICAgICAgIFNDQl9BQ1RJVkUgICAgICAgICAgICAgID0gMHgwMDA0LAorICAgICAgICBTQ0JfU0VOU0UgICAgICAgICAgICAgICA9IDB4MDAwOCwKKyAgICAgICAgU0NCX0FCT1JUICAgICAgICAgICAgICAgPSAweDAwMTAsCisgICAgICAgIFNDQl9ERVZJQ0VfUkVTRVQgICAgICAgID0gMHgwMDIwLAorICAgICAgICBTQ0JfUkVTRVQgICAgICAgICAgICAgICA9IDB4MDA0MCwKKyAgICAgICAgU0NCX1JFQ09WRVJZX1NDQiAgICAgICAgPSAweDAwODAsCisgICAgICAgIFNDQl9NU0dPVVRfUFBSICAgICAgICAgID0gMHgwMTAwLAorICAgICAgICBTQ0JfTVNHT1VUX1NFTlQgICAgICAgICA9IDB4MDIwMCwKKyAgICAgICAgU0NCX01TR09VVF9TRFRSICAgICAgICAgPSAweDA0MDAsCisgICAgICAgIFNDQl9NU0dPVVRfV0RUUiAgICAgICAgID0gMHgwODAwLAorICAgICAgICBTQ0JfTVNHT1VUX0JJVFMgICAgICAgICA9IFNDQl9NU0dPVVRfUFBSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0JfTVNHT1VUX1NFTlQgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0JfTVNHT1VUX1NEVFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQl9NU0dPVVRfV0RUUiwKKyAgICAgICAgU0NCX1FVRVVFRF9BQk9SVCAgICAgICAgPSAweDEwMDAsCisgICAgICAgIFNDQl9RVUVVRURfRk9SX0RPTkUgICAgID0gMHgyMDAwLAorICAgICAgICBTQ0JfV0FTX0JVU1kgICAgICAgICAgICA9IDB4NDAwMCwKKwlTQ0JfUVVFVUVfRlVMTAkJPSAweDgwMDAKK30gc2NiX2ZsYWdfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICAgICAgQUhDX0ZOT05FICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgIEFIQ19QQUdFU0NCUyAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICAgICAgICBBSENfQ0hBTk5FTF9CX1BSSU1BUlkgICAgID0gMHgwMDAwMDAwMiwKKyAgICAgICAgQUhDX1VTRURFRkFVTFRTICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgICAgICAgIEFIQ19JTkRJUkVDVF9QQUdJTkcgICAgICAgPSAweDAwMDAwMDA4LAorICAgICAgICBBSENfQ0hOTEIgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKyAgICAgICAgQUhDX0NITkxDICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNDAsCisgICAgICAgIEFIQ19FWFRFTkRfVFJBTlNfQSAgICAgICAgPSAweDAwMDAwMTAwLAorICAgICAgICBBSENfRVhURU5EX1RSQU5TX0IgICAgICAgID0gMHgwMDAwMDIwMCwKKyAgICAgICAgQUhDX1RFUk1fRU5CX0EgICAgICAgICAgICA9IDB4MDAwMDA0MDAsCisgICAgICAgIEFIQ19URVJNX0VOQl9TRV9MT1cgICAgICAgPSAweDAwMDAwNDAwLAorICAgICAgICBBSENfVEVSTV9FTkJfQiAgICAgICAgICAgID0gMHgwMDAwMDgwMCwKKyAgICAgICAgQUhDX1RFUk1fRU5CX1NFX0hJR0ggICAgICA9IDB4MDAwMDA4MDAsCisgICAgICAgIEFIQ19IQU5ETElOR19SRVFJTklUUyAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBBSENfVEFSR0VUTU9ERSAgICAgICAgICAgID0gMHgwMDAwMjAwMCwKKyAgICAgICAgQUhDX05FV0VFUFJPTV9GTVQgICAgICAgICA9IDB4MDAwMDQwMDAsCisgLyoKKyAgKiAgSGVyZSBlbmRzIHRoZSBGcmVlQlNEIGRlZmluZWQgZmxhZ3MgYW5kIGhlcmUgYmVnaW5zIHRoZSBsaW51eCBkZWZpbmVkCisgICogIGZsYWdzLiAgTk9URTogSSBkaWQgbm90IHByZXNlcnZlIHRoZSBvbGQgZmxhZyBuYW1lIGR1cmluZyB0aGlzIGNoYW5nZQorICAqICBzcGVjaWZpY2FsbHkgdG8gZm9yY2UgbWUgdG8gZXZhbHVhdGUgd2hhdCBmbGFncyB3ZXJlIGJlaW5nIHVzZWQgcHJvcGVybHkKKyAgKiAgYW5kIHdoYXQgZmxhZ3Mgd2VyZW4ndC4gIFRoaXMgd2F5LCBJIGNvdWxkIGNsZWFuIHVwIHRoZSBmbGFnIHVzYWdlIG9uCisgICogIGEgdXNlIGJ5IHVzZSBiYXNpcy4gIERvdWcgTGVkZm9yZAorICAqLworICAgICAgICBBSENfTU9USEVSQk9BUkQgICAgICAgICAgID0gMHgwMDAyMDAwMCwKKyAgICAgICAgQUhDX05PX1NUUFdFTiAgICAgICAgICAgICA9IDB4MDAwNDAwMDAsCisgICAgICAgIEFIQ19SRVNFVF9ERUxBWSAgICAgICAgICAgPSAweDAwMDgwMDAwLAorICAgICAgICBBSENfQV9TQ0FOTkVEICAgICAgICAgICAgID0gMHgwMDEwMDAwMCwKKyAgICAgICAgQUhDX0JfU0NBTk5FRCAgICAgICAgICAgICA9IDB4MDAyMDAwMDAsCisgICAgICAgIEFIQ19NVUxUSV9DSEFOTkVMICAgICAgICAgPSAweDAwNDAwMDAwLAorICAgICAgICBBSENfQklPU19FTkFCTEVEICAgICAgICAgID0gMHgwMDgwMDAwMCwKKyAgICAgICAgQUhDX1NFRVBST01fRk9VTkQgICAgICAgICA9IDB4MDEwMDAwMDAsCisgICAgICAgIEFIQ19URVJNX0VOQl9MVkQgICAgICAgICAgPSAweDAyMDAwMDAwLAorICAgICAgICBBSENfQUJPUlRfUEVORElORyAgICAgICAgID0gMHgwNDAwMDAwMCwKKyAgICAgICAgQUhDX1JFU0VUX1BFTkRJTkcgICAgICAgICA9IDB4MDgwMDAwMDAsCisjZGVmaW5lIEFIQ19JTl9JU1JfQklUICAgICAgICAgICAgICAyOAorICAgICAgICBBSENfSU5fSVNSICAgICAgICAgICAgICAgID0gMHgxMDAwMDAwMCwKKyAgICAgICAgQUhDX0lOX0FCT1JUICAgICAgICAgICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgIEFIQ19JTl9SRVNFVCAgICAgICAgICAgICAgPSAweDQwMDAwMDAwLAorICAgICAgICBBSENfRVhURVJOQUxfU1JBTSAgICAgICAgID0gMHg4MDAwMDAwMAorfSBhaGNfZmxhZ190eXBlOworCit0eXBlZGVmIGVudW0geworICBBSENfTk9ORSAgICAgICAgICAgICA9IDB4MDAwMCwKKyAgQUhDX0NISVBJRF9NQVNLICAgICAgPSAweDAwZmYsCisgIEFIQ19BSUM3NzcwICAgICAgICAgID0gMHgwMDAxLAorICBBSENfQUlDNzg1MCAgICAgICAgICA9IDB4MDAwMiwKKyAgQUhDX0FJQzc4NjAgICAgICAgICAgPSAweDAwMDMsCisgIEFIQ19BSUM3ODcwICAgICAgICAgID0gMHgwMDA0LAorICBBSENfQUlDNzg4MCAgICAgICAgICA9IDB4MDAwNSwKKyAgQUhDX0FJQzc4OTAgICAgICAgICAgPSAweDAwMDYsCisgIEFIQ19BSUM3ODk1ICAgICAgICAgID0gMHgwMDA3LAorICBBSENfQUlDNzg5NiAgICAgICAgICA9IDB4MDAwOCwKKyAgQUhDX0FJQzc4OTIgICAgICAgICAgPSAweDAwMDksCisgIEFIQ19BSUM3ODk5ICAgICAgICAgID0gMHgwMDBhLAorICBBSENfVkwgICAgICAgICAgICAgICA9IDB4MDEwMCwKKyAgQUhDX0VJU0EgICAgICAgICAgICAgPSAweDAyMDAsCisgIEFIQ19QQ0kgICAgICAgICAgICAgID0gMHgwNDAwLAorfSBhaGNfY2hpcDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQUhDX0ZFTk9ORSAgICAgICAgICAgPSAweDAwMDAsCisgIEFIQ19VTFRSQSAgICAgICAgICAgID0gMHgwMDAxLAorICBBSENfVUxUUkEyICAgICAgICAgICA9IDB4MDAwMiwKKyAgQUhDX1dJREUgICAgICAgICAgICAgPSAweDAwMDQsCisgIEFIQ19UV0lOICAgICAgICAgICAgID0gMHgwMDA4LAorICBBSENfTU9SRV9TUkFNICAgICAgICA9IDB4MDAxMCwKKyAgQUhDX0NNRF9DSEFOICAgICAgICAgPSAweDAwMjAsCisgIEFIQ19RVUVVRV9SRUdTICAgICAgID0gMHgwMDQwLAorICBBSENfU0dfUFJFTE9BRCAgICAgICA9IDB4MDA4MCwKKyAgQUhDX1NQSU9DQVAgICAgICAgICAgPSAweDAxMDAsCisgIEFIQ19VTFRSQTMgICAgICAgICAgID0gMHgwMjAwLAorICBBSENfTkVXX0FVVE9URVJNICAgICA9IDB4MDQwMCwKKyAgQUhDX0FJQzc3NzBfRkUgICAgICAgPSBBSENfRkVOT05FLAorICBBSENfQUlDNzg1MF9GRSAgICAgICA9IEFIQ19TUElPQ0FQLAorICBBSENfQUlDNzg2MF9GRSAgICAgICA9IEFIQ19VTFRSQXxBSENfU1BJT0NBUCwKKyAgQUhDX0FJQzc4NzBfRkUgICAgICAgPSBBSENfRkVOT05FLAorICBBSENfQUlDNzg4MF9GRSAgICAgICA9IEFIQ19VTFRSQSwKKyAgQUhDX0FJQzc4OTBfRkUgICAgICAgPSBBSENfTU9SRV9TUkFNfEFIQ19DTURfQ0hBTnxBSENfVUxUUkEyfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19RVUVVRV9SRUdTfEFIQ19TR19QUkVMT0FEfEFIQ19ORVdfQVVUT1RFUk0sCisgIEFIQ19BSUM3ODk1X0ZFICAgICAgID0gQUhDX01PUkVfU1JBTXxBSENfQ01EX0NIQU58QUhDX1VMVFJBLAorICBBSENfQUlDNzg5Nl9GRSAgICAgICA9IEFIQ19BSUM3ODkwX0ZFLAorICBBSENfQUlDNzg5Ml9GRSAgICAgICA9IEFIQ19BSUM3ODkwX0ZFfEFIQ19VTFRSQTMsCisgIEFIQ19BSUM3ODk5X0ZFICAgICAgID0gQUhDX0FJQzc4OTBfRkV8QUhDX1VMVFJBMywKK30gYWhjX2ZlYXR1cmU7CisKKyNkZWZpbmUgU0NCX0RNQV9BRERSKHNjYiwgYWRkcikgKCh1bnNpZ25lZCBsb25nKShhZGRyKSArIChzY2IpLT5zY2JfZG1hLT5kbWFfb2Zmc2V0KQorCitzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hIHsKKwl1bnNpZ25lZCBsb25nCSAgICAgICBkbWFfb2Zmc2V0OyAgICAvKiBDb3JyZWN0aW9uIHlvdSBoYXZlIHRvIGFkZAorCQkJCQkgICAgICAgKiB0byB2aXJ0dWFsIGFkZHJlc3MgdG8gZ2V0CisJCQkJCSAgICAgICAqIGRtYSBoYW5kbGUgaW4gdGhpcyByZWdpb24gKi8KKwlkbWFfYWRkcl90CSAgICAgICBkbWFfYWRkcmVzczsgICAvKiBETUEgaGFuZGxlIG9mIHRoZSBzdGFydCwKKwkJCQkJICAgICAgICogZm9yIHVubWFwICovCisJdW5zaWduZWQgaW50CSAgICAgICBkbWFfbGVuOwkgICAgICAvKiBETUEgbGVuZ3RoICovCit9OworCit0eXBlZGVmIGVudW0geworICBBSENfQlVHX05PTkUgICAgICAgICAgICA9IDB4MDAwMCwKKyAgQUhDX0JVR19UTU9ERV9XSURFT0REICAgPSAweDAwMDEsCisgIEFIQ19CVUdfQVVUT0ZMVVNIICAgICAgID0gMHgwMDAyLAorICBBSENfQlVHX0NBQ0hFVEhFTiAgICAgICA9IDB4MDAwNCwKKyAgQUhDX0JVR19DQUNIRVRIRU5fRElTICAgPSAweDAwMDgsCisgIEFIQ19CVUdfUENJXzJfMV9SRVRSWSAgID0gMHgwMDEwLAorICBBSENfQlVHX1BDSV9NV0kgICAgICAgICA9IDB4MDAyMCwKKyAgQUhDX0JVR19TQ0JDSEFOX1VQTE9BRCAgPSAweDAwNDAsCit9IGFoY19idWdzOworCitzdHJ1Y3QgYWljN3h4eF9zY2IgeworICAgICAgICBzdHJ1Y3QgYWljN3h4eF9od3NjYiAgKmhzY2I7ICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgaGFyZHdhcmUgc2NiICovCisgICAgICAgIFNjc2lfQ21uZCAgICAgICAgICAgICAqY21kOyAgICAgICAgICAgICAgLyogU2NzaV9DbW5kIGZvciB0aGlzIHNjYiAqLworICAgICAgICBzdHJ1Y3QgYWljN3h4eF9zY2IgICAgKnFfbmV4dDsgICAgICAgIC8qIG5leHQgc2NiIGluIHF1ZXVlICovCisgICAgICAgIHZvbGF0aWxlIHNjYl9mbGFnX3R5cGUgZmxhZ3M7ICAgICAgICAgLyogY3VycmVudCBzdGF0ZSBvZiBzY2IgKi8KKyAgICAgICAgc3RydWN0IGh3X3NjYXR0ZXJsaXN0ICpzZ19saXN0OyAgICAgICAvKiBTRyBsaXN0IGluIGFkYXB0ZXIgZm9ybWF0ICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgdGFnX2FjdGlvbjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICBzZ19jb3VudDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAqc2Vuc2VfY21kOyAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIDYgY2hhcmFjdGVycyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZW5zZSBjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIJICAgICAgICpjbW5kOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIHNnX2xlbmd0aDsgLyogV2UgaW5pdCB0aGlzIGR1cmluZyBidWlsZHNjYiBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZG9uJ3QgaGF2ZSB0byBjYWxjdWxhdGUgYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGR1cmluZyB1bmRlcmZsb3cvb3ZlcmZsb3cvc3RhdCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICprbWFsbG9jX3B0cjsKKwlzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hICpzY2JfZG1hOworfTsKKworLyoKKyAqIERlZmluZSBhIGxpbmtlZCBsaXN0IG9mIFNDQnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpoZWFkOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnRhaWw7Cit9IHNjYl9xdWV1ZV90eXBlOworCitzdGF0aWMgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBlcnJubzsKKyAgY29uc3QgY2hhciAqZXJybWVzZzsKK30gaGFyZF9lcnJvcltdID0geworICB7IElMTEhBRERSLCAgIklsbGVnYWwgSG9zdCBBY2Nlc3MiIH0sCisgIHsgSUxMU0FERFIsICAiSWxsZWdhbCBTZXF1ZW5jZXIgQWRkcmVzcyByZWZlcmVuY2VkIiB9LAorICB7IElMTE9QQ09ERSwgIklsbGVnYWwgT3Bjb2RlIGluIHNlcXVlbmNlciBwcm9ncmFtIiB9LAorICB7IFNRUEFSRVJSLCAgIlNlcXVlbmNlciBSYW0gUGFyaXR5IEVycm9yIiB9LAorICB7IERQQVJFUlIsICAgIkRhdGEtUGF0aCBSYW0gUGFyaXR5IEVycm9yIiB9LAorICB7IE1QQVJFUlIsICAgIlNjcmF0Y2ggUmFtL1NDQiBBcnJheSBSYW0gUGFyaXR5IEVycm9yIiB9LAorICB7IFBDSUVSUlNUQVQsIlBDSSBFcnJvciBkZXRlY3RlZCIgfSwKKyAgeyBDSU9QQVJFUlIsICJDSU9CVVMgUGFyaXR5IEVycm9yIiB9Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhcgorZ2VuZXJpY19zZW5zZVtdID0geyBSRVFVRVNUX1NFTlNFLCAwLCAwLCAwLCAyNTUsIDAgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzY2JfcXVldWVfdHlwZSBmcmVlX3NjYnM7ICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTQ0JzIGFzc2lnbmVkIHRvIGZyZWUgc2xvdCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXJkIChubyBwYWdpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdHJ1Y3QgYWljN3h4eF9zY2IgICAqc2NiX2FycmF5W0FJQzdYWFhfTUFYU0NCXTsKKyAgc3RydWN0IGFpYzd4eHhfaHdzY2IgKmhzY2JzOworICB1bnNpZ25lZCBjaGFyICBudW1zY2JzOyAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBzY2JzICovCisgIHVuc2lnbmVkIGNoYXIgIG1heGhzY2JzOyAgICAgICAgIC8qIGhhcmR3YXJlIHNjYnMgKi8KKyAgdW5zaWduZWQgY2hhciAgbWF4c2NiczsgICAgICAgICAgLyogbWF4IHNjYnMgaW5jbHVkaW5nIHBhZ2VhYmxlIHNjYnMgKi8KKyAgZG1hX2FkZHJfdAkgaHNjYnNfZG1hOwkgICAvKiBETUEgaGFuZGxlIHRvIGhzY2JzICovCisgIHVuc2lnbmVkIGludCAgIGhzY2JzX2RtYV9sZW47ICAgIC8qIGxlbmd0aCBvZiB0aGUgYWJvdmUgRE1BIGFyZWEgKi8KKyAgdm9pZCAgICAgICAgICAqaHNjYl9rbWFsbG9jX3B0cjsKK30gc2NiX2RhdGFfdHlwZTsKKworc3RydWN0IHRhcmdldF9jbWQgeworICB1bnNpZ25lZCBjaGFyIG1lc2dfYnl0ZXNbNF07CisgIHVuc2lnbmVkIGNoYXIgY29tbWFuZFsyOF07Cit9OworCisjZGVmaW5lIEFIQ19UUkFOU19DVVIgICAgMHgwMDAxCisjZGVmaW5lIEFIQ19UUkFOU19BQ1RJVkUgMHgwMDAyCisjZGVmaW5lIEFIQ19UUkFOU19HT0FMICAgMHgwMDA0CisjZGVmaW5lIEFIQ19UUkFOU19VU0VSICAgMHgwMDA4CisjZGVmaW5lIEFIQ19UUkFOU19RVUlURSAgMHgwMDEwCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgd2lkdGg7CisgIHVuc2lnbmVkIGNoYXIgcGVyaW9kOworICB1bnNpZ25lZCBjaGFyIG9mZnNldDsKKyAgdW5zaWduZWQgY2hhciBvcHRpb25zOworfSB0cmFuc2luZm9fdHlwZTsKKworc3RydWN0IGFpY19kZXZfZGF0YSB7CisgIHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICBkZWxheWVkX3NjYnM7CisgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICB0ZW1wX3FfZGVwdGg7CisgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICBtYXhfcV9kZXB0aDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFjdGl2ZV9jbWRzOworICAvKgorICAgKiBTdGF0aXN0aWNzIEtlcHQ6CisgICAqCisgICAqIFRvdGFsIFhmZXJzIChjb3VudCBmb3IgZWFjaCBjb21tYW5kIHRoYXQgaGFzIGEgZGF0YSB4ZmVyKSwKKyAgICogYnJva2VuIGRvd24gYnkgcmVhZHMgJiYgd3JpdGVzLgorICAgKgorICAgKiBGdXJ0aGVyIHNvcnRlZCBpbnRvIGEgZmV3IGJpbnMgZm9yIGtlZXBpbmcgdGFicyBvbiBob3cgbWFueSBjb21tYW5kcworICAgKiB3ZSBnZXQgb2YgdmFyaW91cyBzaXplcy4KKyAgICoKKyAgICovCisgIGxvbmcgd190b3RhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHdyaXRlcyAqLworICBsb25nIHJfdG90YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCByZWFkcyAqLworICBsb25nIGJhcnJpZXJfdG90YWw7CQkJIC8qIHRvdGFsIG51bSBvZiBSRVFfQkFSUklFUiBjb21tYW5kcyAqLworICBsb25nIG9yZGVyZWRfdG90YWw7CQkJIC8qIEhvdyBtYW55IFJFUV9CQVJSSUVSIGNvbW1hbmRzIHdlCisJCQkJCSAgICB1c2VkIG9yZGVyZWQgdGFncyB0byBzYXRpc2Z5ICovCisgIGxvbmcgd19iaW5zWzZdOyAgICAgICAgICAgICAgICAgICAgICAgLyogYmlubmVkIHdyaXRlICovCisgIGxvbmcgcl9iaW5zWzZdOyAgICAgICAgICAgICAgICAgICAgICAgLyogYmlubmVkIHJlYWRzICovCisgIHRyYW5zaW5mb190eXBlCWN1cjsKKyAgdHJhbnNpbmZvX3R5cGUJZ29hbDsKKyNkZWZpbmUgIEJVU19ERVZJQ0VfUkVTRVRfUEVORElORyAgICAgICAweDAxCisjZGVmaW5lICBERVZJQ0VfUkVTRVRfREVMQVkgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgREVWSUNFX1BSSU5UX0RUUiAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgIERFVklDRV9XQVNfQlVTWSAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lICBERVZJQ0VfRFRSX1NDQU5ORUQJCTB4MTAKKyNkZWZpbmUgIERFVklDRV9TQ1NJXzMJCQkweDIwCisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBmbGFnczsKKyAgdW5zaWduZWQgbmVlZHBwcjoxOworICB1bnNpZ25lZCBuZWVkcHByX2NvcHk6MTsKKyAgdW5zaWduZWQgbmVlZHNkdHI6MTsKKyAgdW5zaWduZWQgbmVlZHNkdHJfY29weToxOworICB1bnNpZ25lZCBuZWVkd2R0cjoxOworICB1bnNpZ25lZCBuZWVkd2R0cl9jb3B5OjE7CisgIHVuc2lnbmVkIGR0cl9wZW5kaW5nOjE7CisgIHN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHI7CisgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qCisgKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgdXNlZCBmb3IgZWFjaCBob3N0IGFkYXB0ZXIuICBOb3RlLCBpbiBvcmRlciB0byBhdm9pZAorICogcHJvYmxlbXMgd2l0aCBhcmNoaXRlY3R1cmVzIEkgY2FuJ3QgdGVzdCBvbiAoYmVjYXVzZSBJIGRvbid0IGhhdmUgb25lLAorICogc3VjaCBhcyB0aGUgQWxwaGEgYmFzZWQgc3lzdGVtcykgd2hpY2ggaGFwcGVuIHRvIGdpdmUgZmF1bHRzIGZvcgorICogbm9uLWFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLCBjYXJlIHdhcyB0YWtlbiB0byBhbGlnbiB0aGlzIHN0cnVjdHVyZQorICogaW4gYSB3YXkgdGhhdCBnYXVyYW50ZWVkIGFsbCBhY2Nlc3NlcyBsYXJnZXIgdGhhbiA4IGJpdHMgd2VyZSBhbGlnbmVkCisgKiBvbiB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICBJdCdzIGFsc28gb3JnYW5pemVkIHRvIHRyeSBhbmQgYmUgbW9yZQorICogY2FjaGUgbGluZSBlZmZpY2llbnQuICBCZSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgdGhpcyBsZXN0IHlvdSBtaWdodCBodXJ0CisgKiBvdmVyYWxsIHBlcmZvcm1hbmNlIGFuZCBicmluZyBkb3duIHRoZSB3cmF0aCBvZiB0aGUgbWFzc2VzLgorICovCitzdHJ1Y3QgYWljN3h4eF9ob3N0IHsKKyAgLyoKKyAgICogIFRoaXMgaXMgdGhlIGZpcnN0IDY0IGJ5dGVzIGluIHRoZSBob3N0IHN0cnVjdAorICAgKi8KKworICAvKgorICAgKiBXZSBhcmUgZ3JvdXBpbmcgdGhpbmdzIGhlcmUuLi4uZmlyc3QsIGl0ZW1zIHRoYXQgZ2V0IGVpdGhlciByZWFkIG9yCisgICAqIHdyaXR0ZW4gd2l0aCBuZWFybHkgZXZlcnkgaW50ZXJydXB0CisgICAqLworICB2b2xhdGlsZSBsb25nICAgICAgICAgICAgZmxhZ3M7CisgIGFoY19mZWF0dXJlICAgICAgICAgICAgICBmZWF0dXJlczsgICAgICAgICAvKiBjaGlwIGZlYXR1cmVzICovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBiYXNlOyAgICAgICAgICAgICAvKiBjYXJkIGJhc2UgYWRkcmVzcyAqLworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICBfX2lvbWVtICptYWRkcjsgICAgICAgICAgICAvKiBtZW1vcnkgbWFwcGVkIGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGlzcl9jb3VudDsgICAgICAgIC8qIEludGVycnVwdCBjb3VudCAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgc3B1cmlvdXNfaW50OworICBzY2JfZGF0YV90eXBlICAgICAgICAgICAqc2NiX2RhdGE7CisgIHN0cnVjdCBhaWM3eHh4X2NtZF9xdWV1ZSB7CisgICAgU2NzaV9DbW5kICpoZWFkOworICAgIFNjc2lfQ21uZCAqdGFpbDsKKyAgfSBjb21wbGV0ZXE7CisKKyAgLyoKKyAgICogVGhpbmdzIHJlYWQvd3JpdHRlbiBvbiBuZWFybHkgZXZlcnkgZW50cnkgaW50byBhaWM3eHh4X3F1ZXVlKCkKKyAgICovCisgIHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICB3YWl0aW5nX3NjYnM7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICB1bnBhdXNlOyAgICAgICAgICAvKiB1bnBhdXNlIHZhbHVlIGZvciBIQ05UUkwgKi8KKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIHBhdXNlOyAgICAgICAgICAgIC8qIHBhdXNlIHZhbHVlIGZvciBIQ05UUkwgKi8KKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHFvdXRmaWZvbmV4dDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIGFjdGl2ZXNjYnM7ICAgICAgIC8qIGFjdGl2ZSBzY2JzICovCisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICBtYXhfYWN0aXZlc2NiczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgIHFpbmZpZm9uZXh0OworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqdW50YWdnZWRfc2NiczsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKnFvdXRmaWZvOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqcWluZmlmbzsKKworICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgZGV2X2xhc3RfcXVldWVfZnVsbFtNQVhfVEFSR0VUU107CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBkZXZfbGFzdF9xdWV1ZV9mdWxsX2NvdW50W01BWF9UQVJHRVRTXTsKKyAgdW5zaWduZWQgc2hvcnQJICAgdWx0cmFlbmI7ICAgICAgICAgLyogR2V0cyBkb3dubG9hZGVkIHRvIGNhcmQgYXMgYQorCQkJCQkJYml0bWFwICovCisgIHVuc2lnbmVkIHNob3J0CSAgIGRpc2NlbmFibGU7ICAgICAgIC8qIEdldHMgZG93bmxvYWRlZCB0byBjYXJkIGFzIGEKKwkJCQkJCWJpdG1hcCAqLworICB0cmFuc2luZm9fdHlwZSAgICAgICAgICAgdXNlcltNQVhfVEFSR0VUU107CisKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIG1zZ19idWZbMTNdOyAgICAgIC8qIFRoZSBtZXNzYWdlIGZvciB0aGUgdGFyZ2V0ICovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBtc2dfdHlwZTsKKyNkZWZpbmUgTVNHX1RZUEVfTk9ORSAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHT1VUICAweDAxCisjZGVmaW5lIE1TR19UWVBFX0lOSVRJQVRPUl9NU0dJTiAgIDB4MDIKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIG1zZ19sZW47ICAgICAgICAgIC8qIExlbmd0aCBvZiBtZXNzYWdlICovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBtc2dfaW5kZXg7ICAgICAgICAvKiBJbmRleCBpbnRvIG1zZ19idWYgYXJyYXkgKi8KKworCisgIC8qCisgICAqIFdlIHB1dCB0aGUgbGVzcyBmcmVxdWVudGx5IHVzZWQgaG9zdCBzdHJ1Y3R1cmUgaXRlbXMgYWZ0ZXIgdGhlIG1vcmUKKyAgICogZnJlcXVlbnRseSB1c2VkIGl0ZW1zIHRvIHRyeSBhbmQgZWFzZSB0aGUgYnVyZGVuIG9uIHRoZSBjYWNoZSBzdWJzeXN0ZW0uCisgICAqIFRoZXNlIGVudHJpZXMgYXJlIG5vdCAqY29tbW9ubHkqIGFjY2Vzc2VkLCB3aGVyZWFzIHRoZSBwcmVjZWRpbmcgZW50cmllcworICAgKiBhcmUgYWNjZXNzZWQgdmVyeSBvZnRlbi4KKyAgICovCisKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIGlycTsgICAgICAgICAgICAgIC8qIElSUSBmb3IgdGhpcyBhZGFwdGVyICovCisgIGludCAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTsgICAgICAgICAvKiBhaWM3eHh4IGluc3RhbmNlIG51bWJlciAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgc2NzaV9pZDsgICAgICAgICAgLyogaG9zdCBhZGFwdGVyIFNDU0kgSUQgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgICAgIHNjc2lfaWRfYjsgICAgICAgIC8qIGNoYW5uZWwgQiBmb3IgdHdpbiBhZGFwdGVycyAqLworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgYmlvc19hZGRyZXNzOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgYm9hcmRfbmFtZV9pbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgIGJpb3NfY29udHJvbDsgICAgIC8qIGJpb3MgY29udHJvbCAtIFNFRVBST00gKi8KKyAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgIGFkYXB0ZXJfY29udHJvbDsgIC8qIGFkYXB0ZXIgY29udHJvbCAtIFNFRVBST00gKi8KKyAgc3RydWN0IHBjaV9kZXYJICAqcGRldjsKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICAgIHBjaV9idXM7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBwY2lfZGV2aWNlX2ZuOworICBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgICAgc2M7CisgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICBzY190eXBlOworICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgc2Nfc2l6ZTsKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAgICAgKm5leHQ7ICAgICAgICAgICAgIC8qIGFsbG93IGZvciBtdWx0aXBsZSBJUlFzICovCisgIHN0cnVjdCBTY3NpX0hvc3QgICAgICAgICpob3N0OyAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHNjc2kgaG9zdCAqLworICBzdHJ1Y3QgbGlzdF9oZWFkCSAgIGFpY19kZXZzOwkgICAgIC8qIGFsbCBhaWNfZGV2IHN0cnVjdHMgb24gaG9zdCAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgaG9zdF9ubzsgICAgICAgICAgLyogU0NTSSBob3N0IG51bWJlciAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgbWJhc2U7ICAgICAgICAgICAgLyogSS9PIG1lbW9yeSBhZGRyZXNzICovCisgIGFoY19jaGlwICAgICAgICAgICAgICAgICBjaGlwOyAgICAgICAgICAgICAvKiBjaGlwIHR5cGUgKi8KKyAgYWhjX2J1Z3MgICAgICAgICAgICAgICAgIGJ1Z3M7CisgIGRtYV9hZGRyX3QJCSAgIGZpZm9fZG1hOwkgICAgIC8qIERNQSBoYW5kbGUgZm9yIGZpZm8gYXJyYXlzICovCisKK307CisKKy8qCisgKiBWYWxpZCBTQ1NJUkFURSB2YWx1ZXMuIChwLiAzLTE3KQorICogUHJvdmlkZXMgYSBtYXBwaW5nIG9mIHRyYW5zZmVyIHBlcmlvZHMgaW4gbnMvNCB0byB0aGUgcHJvcGVyIHZhbHVlIHRvCisgKiBzdGljayBpbiB0aGUgU0NTSVJBVEUgcmVnIHRvIHVzZSB0aGF0IHRyYW5zZmVyIHJhdGUuCisgKi8KKyNkZWZpbmUgQUhDX1NZTkNSQVRFX1VMVFJBMyAwCisjZGVmaW5lIEFIQ19TWU5DUkFURV9VTFRSQTIgMQorI2RlZmluZSBBSENfU1lOQ1JBVEVfVUxUUkEgIDMKKyNkZWZpbmUgQUhDX1NZTkNSQVRFX0ZBU1QgICA2CisjZGVmaW5lIEFIQ19TWU5DUkFURV9DUkMgMHg0MAorI2RlZmluZSBBSENfU1lOQ1JBVEVfU0UgIDB4MTAKK3N0YXRpYyBzdHJ1Y3QgYWljN3h4eF9zeW5jcmF0ZSB7CisgIC8qIFJhdGVzIGluIFVsdHJhIG1vZGUgaGF2ZSBiaXQgOCBvZiBzeGZyIHNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVTFRSQV9TWEZSIDB4MTAwCisgIGludCBzeGZyX3VsdHJhMjsKKyAgaW50IHN4ZnI7CisgIHVuc2lnbmVkIGNoYXIgcGVyaW9kOworICBjb25zdCBjaGFyICpyYXRlWzJdOworfSBhaWM3eHh4X3N5bmNyYXRlc1tdID0geworICB7IDB4NDIsICAweDAwMCwgICA5LCAgeyI4MC4wIiwgIjE2MC4wIn0gfSwKKyAgeyAweDEzLCAgMHgwMDAsICAxMCwgIHsiNDAuMCIsICI4MC4wIn0gfSwKKyAgeyAweDE0LCAgMHgwMDAsICAxMSwgIHsiMzMuMCIsICI2Ni42In0gfSwKKyAgeyAweDE1LCAgMHgxMDAsICAxMiwgIHsiMjAuMCIsICI0MC4wIn0gfSwKKyAgeyAweDE2LCAgMHgxMTAsICAxNSwgIHsiMTYuMCIsICIzMi4wIn0gfSwKKyAgeyAweDE3LCAgMHgxMjAsICAxOCwgIHsiMTMuNCIsICIyNi44In0gfSwKKyAgeyAweDE4LCAgMHgwMDAsICAyNSwgIHsiMTAuMCIsICIyMC4wIn0gfSwKKyAgeyAweDE5LCAgMHgwMTAsICAzMSwgIHsiOC4wIiwgICIxNi4wIn0gfSwKKyAgeyAweDFhLCAgMHgwMjAsICAzNywgIHsiNi42NyIsICIxMy4zIn0gfSwKKyAgeyAweDFiLCAgMHgwMzAsICA0MywgIHsiNS43IiwgICIxMS40In0gfSwKKyAgeyAweDEwLCAgMHgwNDAsICA1MCwgIHsiNS4wIiwgICIxMC4wIn0gfSwKKyAgeyAweDAwLCAgMHgwNTAsICA1NiwgIHsiNC40IiwgICI4LjgiIH0gfSwKKyAgeyAweDAwLCAgMHgwNjAsICA2MiwgIHsiNC4wIiwgICI4LjAiIH0gfSwKKyAgeyAweDAwLCAgMHgwNzAsICA2OCwgIHsiMy42IiwgICI3LjIiIH0gfSwKKyAgeyAweDAwLCAgMHgwMDAsICAwLCAgIHtOVUxMLCBOVUxMfSAgIH0sCit9OworCisjZGVmaW5lIENUTF9PRl9TQ0Ioc2NiKSAoKChzY2ItPmhzY2IpLT50YXJnZXRfY2hhbm5lbF9sdW4gPj4gMykgJiAweDEpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoc2NiLT5oc2NiKS0+dGFyZ2V0X2NoYW5uZWxfbHVuID4+IDQpICYgMHhmKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChzY2ItPmhzY2IpLT50YXJnZXRfY2hhbm5lbF9sdW4gJiAweDA3KQorCisjZGVmaW5lIENUTF9PRl9DTUQoY21kKSAoKGNtZC0+ZGV2aWNlLT5jaGFubmVsKSAmIDB4MDEpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChjbWQtPmRldmljZS0+aWQpICYgMHgwZiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY21kLT5kZXZpY2UtPmx1bikgJiAweDA3KQorCisjZGVmaW5lIFRBUkdFVF9JTkRFWChjbWQpICAoKGNtZCktPmRldmljZS0+aWQgfCAoKGNtZCktPmRldmljZS0+Y2hhbm5lbCA8PCAzKSkKKworLyoKKyAqIEEgbmljZSBsaXR0bGUgZGVmaW5lIHRvIG1ha2UgZG9pbmcgb3VyIHByaW50a3MgYSBsaXR0bGUgZWFzaWVyCisgKi8KKworI2RlZmluZSBXQVJOX0xFQUQgS0VSTl9XQVJOSU5HICIoc2NzaSVkOiVkOiVkOiVkKSAiCisjZGVmaW5lIElORk9fTEVBRCBLRVJOX0lORk8gIihzY3NpJWQ6JWQ6JWQ6JWQpICIKKworLyoKKyAqIFhYWCAtIHRoZXNlIG9wdGlvbnMgYXBwbHkgdW5pbGF0ZXJhbGx5IHRvIF9hbGxfIDI3NHgvMjg0eC8yOTR4CisgKiAgICAgICBjYXJkcyBpbiB0aGUgc3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQuICBFeGNlcHRpb25zIHRvIHRoaXMKKyAqICAgICAgIHJ1bGUgYXJlIG5vdGVkIGluIHRoZSBjb21tZW50cy4KKyAqLworCisvKgorICogVXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQgcXVldWUgZGVwdGggd2hlbiBzZXR0aW5nIHRhZ2dlZCBxdWV1ZWluZyBvbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWM3eHh4X2RlZmF1bHRfcXVldWVfZGVwdGggPSBBSUM3WFhYX0NNRFNfUEVSX0RFVklDRTsKKworLyoKKyAqIFNraXAgdGhlIHNjc2kgYnVzIHJlc2V0LiAgTm9uIDAgbWFrZSB1cyBza2lwIHRoZSByZXNldCBhdCBzdGFydHVwLiAgVGhpcworICogaGFzIG5vIGVmZmVjdCBvbiBhbnkgbGF0ZXIgcmVzZXRzIHRoYXQgbWlnaHQgb2NjdXIgZHVlIHRvIHRoaW5ncyBsaWtlCisgKiBTQ1NJIGJ1cyB0aW1lb3V0cy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWM3eHh4X25vX3Jlc2V0ID0gMDsKKy8qCisgKiBDZXJ0YWluIFBDSSBtb3RoZXJib2FyZHMgd2lsbCBzY2FuIFBDSSBkZXZpY2VzIGZyb20gaGlnaGVzdCB0byBsb3dlc3QsCisgKiBvdGhlcnMgc2NhbiBmcm9tIGxvd2VzdCB0byBoaWdoZXN0LCBhbmQgdGhleSB0ZW5kIHRvIGRvIGFsbCBraW5kcyBvZgorICogc3RyYW5nZSB0aGluZ3Mgd2hlbiB0aGV5IGNvbWUgaW50byBjb250YWN0IHdpdGggUENJIGJyaWRnZSBjaGlwcy4gIFRoZQorICogbmV0IHJlc3VsdCBvZiBhbGwgdGhpcyBpcyB0aGF0IHRoZSBQQ0kgY2FyZCB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgdG8gYm9vdAorICogdGhlIG1hY2hpbmUgaXMgdmVyeSBoYXJkIHRvIGRldGVjdC4gIE1vc3QgbW90aGVyYm9hcmRzIGdvIGZyb20gbG93ZXN0CisgKiBQQ0kgc2xvdCBudW1iZXIgdG8gaGlnaGVzdCwgYW5kIHRoZSBmaXJzdCBTQ1NJIGNvbnRyb2xsZXIgZm91bmQgaXMgdGhlCisgKiBvbmUgeW91IGJvb3QgZnJvbS4gIFRoZSBvbmx5IGV4Y2VwdGlvbnMgdG8gdGhpcyBhcmUgd2hlbiBhIGNvbnRyb2xsZXIKKyAqIGhhcyBpdHMgQklPUyBkaXNhYmxlZC4gIFNvLCB3ZSBieSBkZWZhdWx0IHNvcnQgYWxsIG9mIG91ciBTQ1NJIGNvbnRyb2xsZXJzCisgKiBmcm9tIGxvd2VzdCBQQ0kgc2xvdCBudW1iZXIgdG8gaGlnaGVzdCBQQ0kgc2xvdCBudW1iZXIuICBXZSBhbHNvIGZvcmNlCisgKiBhbGwgY29udHJvbGxlcnMgd2l0aCB0aGVpciBCSU9TIGRpc2FibGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGlzCisgKiB3b3JrcyBvbiAqYWxtb3N0KiBhbGwgY29tcHV0ZXJzLiAgV2hlcmUgaXQgZG9lc24ndCB3b3JrLCB3ZSBoYXZlIHRoaXMKKyAqIG9wdGlvbi4gIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gbm9uLTAgd2lsbCByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc29ydAorICogdG8gaGlnaGVzdCBmaXJzdCwgdGhlbiBsb3dlc3QsIGJ1dCB3aWxsIHN0aWxsIGxlYXZlIGNhcmRzIHdpdGggdGhlaXIgQklPUworICogZGlzYWJsZWQgYXQgdGhlIHZlcnkgZW5kLiAgVGhhdCBzaG91bGQgZml4IGV2ZXJ5b25lIHVwIHVubGVzcyB0aGVyZSBhcmUKKyAqIHJlYWxseSBzdHJhbmdlIGNpcnVtc3RhbmNlcy4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3JldmVyc2Vfc2NhbiA9IDA7CisvKgorICogU2hvdWxkIHdlIGZvcmNlIEVYVEVOREVEIHRyYW5zbGF0aW9uIG9uIGEgY29udHJvbGxlci4KKyAqICAgICAwID09IFVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgU0VFUFJPTSBvciBkZWZhdWx0IHRvIG9mZgorICogICAgIDEgPT0gVXNlIHdoYXRldmVyIGlzIGluIHRoZSBTRUVQUk9NIG9yIGRlZmF1bHQgdG8gb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWM3eHh4X2V4dGVuZGVkID0gMDsKKy8qCisgKiBUaGUgSVJRIHRyaWdnZXIgbWV0aG9kIHVzZWQgb24gRUlTQSBjb250cm9sbGVycy4gRG9lcyBub3QgZWZmZWN0IFBDSSBjYXJkcy4KKyAqICAgLTEgPSBVc2UgZGV0ZWN0ZWQgc2V0dGluZ3MuCisgKiAgICAwID0gRm9yY2UgRWRnZSB0cmlnZ2VyZWQgbW9kZS4KKyAqICAgIDEgPSBGb3JjZSBMZXZlbCB0cmlnZ2VyZWQgbW9kZS4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X2lycV90cmlnZ2VyID0gLTE7CisvKgorICogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSB0ZXJtaW5hdGlvbiBzZXR0aW5ncyBvbiBhIGNvbnRyb2xsZXIuCisgKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCB1bmRlciBub3JtYWwgY29uZGl0aW9ucy4gIEhvd2V2ZXIsIGluIHRoZSBjYXNlCisgKiB0aGF0IGEgY29udHJvbGxlciBkb2VzIG5vdCBoYXZlIGEgcmVhZGFibGUgU0VFUFJPTSAoc28gdGhhdCB3ZSBjYW4ndAorICogcmVhZCB0aGUgU0VFUFJPTSBzZXR0aW5ncyBkaXJlY3RseSkgYW5kIHRoYXQgYSBjb250cm9sbGVyIGhhcyBhIGJ1Z2dlcmVkCisgKiB2ZXJzaW9uIG9mIHRoZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIAorICogY29ycmVjdCB0ZXJtaW5hdGlvbi4gIEl0IGlzIHByZWZlcmFibGUgdG8gdXNlIHRoZSBtYW51YWwgdGVybWluYXRpb24KKyAqIHNldHRpbmdzIGluIHRoZSBCSU9TIGlmIHBvc3NpYmxlLCBidXQgc29tZSBtb3RoZXJib2FyZCBjb250cm9sbGVycyBzdG9yZQorICogdGhvc2Ugc2V0dGluZ3MgaW4gYSBmb3JtYXQgd2UgY2FuJ3QgcmVhZC4gIEluIG90aGVyIGNhc2VzLCBhdXRvIHRlcm0KKyAqIHNob3VsZCBhbHNvIHdvcmssIGJ1dCB0aGUgY2hpcHNldCB3YXMgcHV0IHRvZ2V0aGVyIHdpdGggbm8gYXV0byB0ZXJtCisgKiBsb2dpYyAoY29tbW9uIG9uIG1vdGhlcmJvYXJkIGNvbnRyb2xsZXJzKS4gIEluIHRob3NlIGNhc2VzLCB3ZSBoYXZlCisgKiAzMiBiaXRzIGhlcmUgdG8gd29yayB3aXRoLiAgVGhhdCdzIGdvb2QgZm9yIDggY29udHJvbGxlcnMvY2hhbm5lbHMuICBUaGUKKyAqIGJpdHMgYXJlIG9yZ2FuaXplZCBhcyA0IGJpdHMgcGVyIGNoYW5uZWwsIHdpdGggc2NzaTAgZ2V0dGluZyB0aGUgbG93ZXN0CisgKiA0IGJpdHMgaW4gdGhlIGludC4gIEEgMSBpbiBhIGJpdCBwb3NpdGlvbiBpbmRpY2F0ZXMgdGhlIHRlcm1pbmF0aW9uIHNldHRpbmcKKyAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhhdCBiaXQgc2hvdWxkIGJlIGVuYWJsZWQsIGEgMCBpcyBkaXNhYmxlZC4KKyAqIEl0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKgorICogICAgMHgwZiA9ICAxMTExLVNpbmdsZSBFbmRlZCBMb3cgQnl0ZSBUZXJtaW5hdGlvbiBvbi9vZmYKKyAqICAgICAgICAgICAgfHxcLVNpbmdsZSBFbmRlZCBIaWdoIEJ5dGUgVGVybWluYXRpb24gb24vb2ZmCisgKiAgICAgICAgICAgIHxcLUxWRCBMb3cgQnl0ZSBUZXJtaW5hdGlvbiBvbi9vZmYKKyAqICAgICAgICAgICAgXC1MVkQgSGlnaCBCeXRlIFRlcm1pbmF0aW9uIG9uL29mZgorICoKKyAqIEZvciBub24tVWx0cmEyIGNvbnRyb2xsZXJzLCB0aGUgdXBwZXIgMiBiaXRzIGFyZSBub3QgaW1wb3J0YW50LiAgU28sIHRvCisgKiBlbmFibGUgYm90aCBoaWdoIGJ5dGUgYW5kIGxvdyBieXRlIHRlcm1pbmF0aW9uIG9uIHNjc2kwLCBJIHdvdWxkIG5lZWQgdG8KKyAqIG1ha2Ugc3VyZSB0aGF0IHRoZSBvdmVycmlkZV90ZXJtIHZhcmlhYmxlIHdhcyBzZXQgdG8gMHgwMyAoYml0cyAwMDExKS4KKyAqIFRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB0ZXJtaW5hdGlvbiBpcyBlbmFibGVkIG9uIGFuIFVsdHJhMiBjb250cm9sbGVyIGF0CisgKiBzY3NpMiBhbmQgb25seSBoaWdoIGJ5dGUgdGVybWluYXRpb24gb24gc2NzaTEgYW5kIGhpZ2ggYW5kIGxvdyBieXRlCisgKiB0ZXJtaW5hdGlvbiBvbiBzY3NpMCwgSSB3b3VsZCBzZXQgb3ZlcnJpZGVfdGVybT0weGYyMyAoYml0cyAxMTExIDAwMTAgMDAxMSkKKyAqCisgKiBGb3IgdGhlIG1vc3QgcGFydCwgdXNlcnMgc2hvdWxkIG5ldmVyIGhhdmUgdG8gdXNlIHRoaXMsIHRoYXQncyB3aHkgSQorICogbGVmdCBpdCBmYWlybHkgY3J5cHRpYyBpbnN0ZWFkIG9mIGVhc3kgdG8gdW5kZXJzdGFuZC4gIElmIHlvdSBuZWVkIGl0LAorICogbW9zdCBsaWtlbHkgc29tZW9uZSB3aWxsIGJlIHRlbGxpbmcgeW91IHdoYXQgeW91cidzIG5lZWRzIHRvIGJlIHNldCB0by4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X292ZXJyaWRlX3Rlcm0gPSAtMTsKKy8qCisgKiBDZXJ0YWluIG1vdGhlcmJvYXJkIGNoaXBzZXQgY29udHJvbGxlcnMgdGVuZCB0byBzY3JldworICogdXAgdGhlIHBvbGFyaXR5IG9mIHRoZSB0ZXJtIGVuYWJsZSBvdXRwdXQgcGluLiAgVXNlIHRoaXMgdmFyaWFibGUKKyAqIHRvIGZvcmNlIHRoZSBjb3JyZWN0IHBvbGFyaXR5IGZvciB5b3VyIHN5c3RlbS4gIFRoaXMgaXMgYSBiaXRmaWVsZCB2YXJpYWJsZQorICogc2ltaWxhciB0byB0aGUgcHJldmlvdXMgb25lLCBidXQgdGhpcyBvbmUgaGFzIG9uZSBiaXQgcGVyIGNoYW5uZWwgaW5zdGVhZAorICogb2YgZm91ci4KKyAqICAgIDAgPSBGb3JjZSB0aGUgc2V0dGluZyB0byBhY3RpdmUgbG93LgorICogICAgMSA9IEZvcmNlIHNldHRpbmcgdG8gYWN0aXZlIGhpZ2guCisgKiBNb3N0IEFkYXB0ZWMgY2FyZHMgYXJlIGFjdGl2ZSBoaWdoLCBzZXZlcmFsIG1vdGhlcmJvYXJkcyBhcmUgYWN0aXZlIGxvdy4KKyAqIFRvIGZvcmNlIGEgMjk0MCBjYXJkIGF0IFNDU0kgMCB0byBhY3RpdmUgaGlnaCBhbmQgYSBtb3RoZXJib2FyZCA3ODk1CisgKiBjb250cm9sbGVyIGF0IHNjc2kxIGFuZCBzY3NpMiB0byBhY3RpdmUgbG93LCBhbmQgYSAyOTEwIGNhcmQgYXQgc2NzaTMKKyAqIHRvIGFjdGl2ZSBoaWdoLCB5b3Ugd291bGQgbmVlZCB0byBzZXQgc3Rwd2xldj0weDkgKGJpdHMgMTAwMSkuCisgKgorICogUGVvcGxlIHNob3VsZG4ndCBuZWVkIHRvIHVzZSB0aGlzLCBidXQgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgbG90cyBvZgorICogU0NTSSB0aW1lb3V0IHByb2JsZW1zLCB0aGlzIG1heSBoZWxwLiAgVGhlcmUgaXMgb25lIHN1cmUgd2F5IHRvIHRlc3Qgd2hhdAorICogdGhpcyBvcHRpb24gbmVlZHMgdG8gYmUuICBVc2luZyBhIGJvb3QgZmxvcHB5IHRvIGJvb3QgdGhlIHN5c3RlbSwgY29uZmlndXJlCisgKiB5b3VyIHN5c3RlbSB0byBlbmFibGUgYWxsIFNDU0kgdGVybWluYXRpb24gKGluIHRoZSBBZGFwdGVjIFNDU0kgQklPUykgYW5kCisgKiBpZiBuZWVkZWQgdGhlbiBhbHNvIHBhc3MgYSB2YWx1ZSB0byBvdmVycmlkZV90ZXJtIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICogZHJpdmVyIGlzIGVuYWJsaW5nIFNDU0kgdGVybWluYXRpb24sIHRoZW4gc2V0IHRoaXMgdmFyaWFibGUgdG8gZWl0aGVyIDAKKyAqIG9yIDEuICBXaGVuIHRoZSBkcml2ZXIgYm9vdHMsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgKk5PKiBTQ1NJIGNhYmxlcworICogY29ubmVjdGVkIHRvIHlvdXIgY29udHJvbGxlci4gIElmIGl0IGZpbmRzIGFuZCBpbml0cyB0aGUgY29udHJvbGxlcgorICogd2l0aG91dCBwcm9ibGVtLCB0aGVuIHRoZSBzZXR0aW5nIHlvdSBwYXNzZWQgdG8gc3Rwd2xldiB3YXMgY29ycmVjdC4gIElmCisgKiB0aGUgZHJpdmVyIGdvZXMgaW50byBhIHJlc2V0IGxvb3AgYW5kIGhhbmdzIHRoZSBzeXN0ZW0sIHRoZW4geW91IG5lZWQgdGhlCisgKiBvdGhlciBzZXR0aW5nIGZvciB0aGlzIHZhcmlhYmxlLiAgSWYgbmVpdGhlciBzZXR0aW5nIGxldHMgdGhlIG1hY2hpbmUKKyAqIGJvb3QgdGhlbiB5b3UgaGF2ZSBkZWZpbml0ZSB0ZXJtaW5hdGlvbiBwcm9ibGVtcyB0aGF0IG1heSBub3QgYmUgZml4YWJsZS4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3N0cHdsZXYgPSAtMTsKKy8qCisgKiBTZXQgdGhpcyB0byBub24tMCBpbiBvcmRlciB0byBmb3JjZSB0aGUgZHJpdmVyIHRvIHBhbmljIHRoZSBrZXJuZWwKKyAqIGFuZCBwcmludCBvdXQgZGVidWdnaW5nIGluZm8gb24gYSBTQ1NJIGFib3J0IG9yIHJlc2V0IGN5Y2xlLgorICovCitzdGF0aWMgaW50IGFpYzd4eHhfcGFuaWNfb25fYWJvcnQgPSAwOworLyoKKyAqIFBDSSBidXMgcGFyaXR5IGNoZWNraW5nIG9mIHRoZSBBZGFwdGVjIGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBzb21ld2hhdAorICogZHViaW91cyBhdCBiZXN0LiAgVG8gbXkga25vd2xlZGdlLCB0aGlzIG9wdGlvbiBoYXMgbmV2ZXIgYWN0dWFsbHkKKyAqIHNvbHZlZCBhIFBDSSBwYXJpdHkgcHJvYmxlbSwgYnV0IG9uIGNlcnRhaW4gbWFjaGluZXMgd2l0aCBicm9rZW4gUENJCisgKiBjaGlwc2V0IGNvbmZpZ3VyYXRpb25zLCBpdCBjYW4gZ2VuZXJhdGUgdG9ucyBvZiBmYWxzZSBlcnJvciBtZXNzYWdlcy4KKyAqIEl0J3MgaW5jbHVkZWQgaW4gdGhlIGRyaXZlciBmb3IgY29tcGxldGVuZXNzLgorICogICAwID0gU2h1dCBvZmYgUENJIHBhcml0eSBjaGVjaworICogIC0xID0gTm9ybWFsIHBvbGFyaXR5IHBjaSBwYXJpdHkgY2hlY2tpbmcKKyAqICAgMSA9IHJldmVyc2UgcG9sYXJpdHkgcGNpIHBhcml0eSBjaGVja2luZworICoKKyAqIE5PVEU6IHlvdSBjYW4ndCBhY3R1YWxseSBwYXNzIC0xIG9uIHRoZSBsaWxvIHByb21wdC4gIFNvLCB0byBzZXQgdGhpcworICogdmFyaWFibGUgdG8gLTEgeW91IHdvdWxkIGFjdHVhbGx5IHdhbnQgdG8gc2ltcGx5IHBhc3MgdGhlIHZhcmlhYmxlCisgKiBuYW1lIHdpdGhvdXQgYSBudW1iZXIuICBUaGF0IHdpbGwgaW52ZXJ0IHRoZSAwIHdoaWNoIHdpbGwgcmVzdWx0IGluCisgKiAtMS4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3BjaV9wYXJpdHkgPSAwOworLyoKKyAqIFNldCB0aGlzIHRvIGFueSBub24tMCB2YWx1ZSB0byBjYXVzZSB1cyB0byBkdW1wIHRoZSBjb250ZW50cyBvZiBhbGwKKyAqIHRoZSBjYXJkJ3MgcmVnaXN0ZXJzIGluIGEgaGV4IGR1bXAgZm9ybWF0IHRhaWxvcmVkIHRvIGVhY2ggbW9kZWwgb2YKKyAqIGNvbnRyb2xsZXIuCisgKiAKKyAqIE5PVEU6IFRIRSBDT05UUk9MTEVSIElTIExFRlQgSU4gQU4gVU5VU0VBQkxFIFNUQVRFIEJZIFRISVMgT1BUSU9OLgorICogICAgICAgWU9VIENBTk5PVCBCT09UIFVQIFdJVEggVEhJUyBPUFRJT04sIElUIElTIEZPUiBERUJVR0dJTkcgUFVSUE9TRVMKKyAqICAgICAgIE9OTFkKKyAqLworc3RhdGljIGludCBhaWM3eHh4X2R1bXBfY2FyZCA9IDA7CisvKgorICogU2V0IHRoaXMgdG8gYSBub24tMCB2YWx1ZSB0byBtYWtlIHVzIGR1bXAgb3V0IHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24KKyAqIHJlZ2lzdGVycyBvbiB0aGUgY2FyZCBhZnRlciBjb21wbGV0aW5nIHRoZSBzZXF1ZW5jZXIgZG93bmxvYWQuICBUaGlzCisgKiBhbGxvd3MgdGhlIGFjdHVhbCBzZXF1ZW5jZXIgZG93bmxvYWQgdG8gYmUgdmVyaWZpZWQuICBJdCBpcyBwb3NzaWJsZQorICogdG8gdXNlIHRoaXMgb3B0aW9uIGFuZCBzdGlsbCBib290IHVwIGFuZCBydW4geW91ciBzeXN0ZW0uICBUaGlzIGlzCisgKiBvbmx5IGludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKi8KK3N0YXRpYyBpbnQgYWljN3h4eF9kdW1wX3NlcXVlbmNlciA9IDA7CisvKgorICogQ2VydGFpbiBuZXdlciBtb3RoZXJib2FyZHMgaGF2ZSBwdXQgbmV3IFBDSSBiYXNlZCBkZXZpY2VzIGludG8gdGhlCisgKiBJTyBzcGFjZXMgdGhhdCB1c2VkIHRvIHR5cGljYWxseSBiZSBvY2N1cGllZCBieSBWTEIgb3IgRUlTQSBjYXJkcy4KKyAqIFRoaXMgb3ZlcmxhcCBjYW4gY2F1c2UgdGhlc2UgbmV3ZXIgbW90aGVyYm9hcmRzIHRvIGxvY2sgdXAgd2hlbiBzY2FubmVkCisgKiBmb3Igb2xkZXIgRUlTQSBhbmQgVkxCIGRldmljZXMuICBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIG5vbi0wIHdpbGwKKyAqIGNhdXNlIHRoZSBkcml2ZXIgdG8gc2tpcCBzY2FubmluZyBmb3IgYW55IFZMQiBvciBFSVNBIGNvbnRyb2xsZXJzIGFuZAorICogb25seSBzdXBwb3J0IHRoZSBQQ0kgY29udHJvbGxlcnMuICBOT1RFOiB0aGlzIG1lYW5zIHRoYXQgaWYgdGhlIGtlcm5lbAorICogb3MgY29tcGlsZWQgd2l0aCBQQ0kgc3VwcG9ydCBkaXNhYmxlZCwgdGhlbiBzZXR0aW5nIHRoaXMgdG8gbm9uLTAKKyAqIHdvdWxkIHJlc3VsdCBpbiBuZXZlciBmaW5kaW5nIGFueSBkZXZpY2VzIDopCisgKi8KK3N0YXRpYyBpbnQgYWljN3h4eF9ub19wcm9iZSA9IDA7CisvKgorICogT24gc29tZSBtYWNoaW5lcywgZW5hYmxpbmcgdGhlIGV4dGVybmFsIFNDQiBSQU0gaXNuJ3QgcmVsaWFibGUgeWV0LiAgSQorICogaGF2ZW4ndCBoYWQgdGltZSB0byBtYWtlIHRlc3QgcGF0Y2hlcyBmb3IgdGhpbmdzIGxpa2UgY2hhbmdpbmcgdGhlCisgKiB0aW1pbmcgbW9kZSBvbiB0aGF0IGV4dGVybmFsIFJBTSBlaXRoZXIuICBTb21lIG9mIHRob3NlIGNoYW5nZXMgbWF5CisgKiBmaXggdGhlIHByb2JsZW0uICBVbnRpbCB0aGVuIHRob3VnaCwgd2UgZGVmYXVsdCB0byBleHRlcm5hbCBTQ0IgUkFNCisgKiBvZmYgYW5kIGdpdmUgYSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIGVuYWJsZSBpdC4KKyAqLworc3RhdGljIGludCBhaWM3eHh4X3NjYnJhbSA9IDA7CisvKgorICogU28gdGhhdCB3ZSBjYW4gc2V0IGhvdyBsb25nIGVhY2ggZGV2aWNlIGlzIGdpdmVuIGFzIGEgc2VsZWN0aW9uIHRpbWVvdXQuCisgKiBUaGUgdGFibGUgb2YgdmFsdWVzIGdvZXMgbGlrZSB0aGlzOgorICogICAwIC0gMjU2bXMKKyAqICAgMSAtIDEyOG1zCisgKiAgIDIgLSA2NG1zCisgKiAgIDMgLSAzMm1zCisgKiBXZSBkZWZhdWx0IHRvIDY0bXMgYmVjYXVzZSBpdCdzIGZhc3QuICBTb21lIG9sZCBTQ1NJLUkgZGV2aWNlcyBuZWVkIGEKKyAqIGxvbmdlciB0aW1lLiAgVGhlIGZpbmFsIHZhbHVlIGhhcyB0byBiZSBsZWZ0IHNoaWZ0ZWQgYnkgMywgaGVuY2UgMHgxMAorICogaXMgdGhlIGZpbmFsIHZhbHVlLgorICovCitzdGF0aWMgaW50IGFpYzd4eHhfc2VsdGltZSA9IDB4MTA7CisvKgorICogU28gdGhhdCBpbnNtb2QgY2FuIGZpbmQgdGhlIHZhcmlhYmxlIGFuZCBtYWtlIGl0IHBvaW50IHRvIHNvbWV0aGluZworICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqIGFpYzd4eHggPSBOVUxMOworbW9kdWxlX3BhcmFtKGFpYzd4eHgsIGNoYXJwLCAwKTsKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0VfTk9STUFMICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFZFUkJPU0VfTkVHT1RJQVRJT04gICAgMHgwMDAxCisjZGVmaW5lIFZFUkJPU0VfU0VRSU5UICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFZFUkJPU0VfU0NTSUlOVCAgICAgICAgMHgwMDA0CisjZGVmaW5lIFZFUkJPU0VfUFJPQkUgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFZFUkJPU0VfUFJPQkUyICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFZFUkJPU0VfTkVHT1RJQVRJT04yICAgMHgwMDIwCisjZGVmaW5lIFZFUkJPU0VfTUlOT1JfRVJST1IgICAgMHgwMDQwCisjZGVmaW5lIFZFUkJPU0VfVFJBQ0lORyAgICAgICAgMHgwMDgwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlQgICAgICAgICAgMHgwZjAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfTUlEICAgICAgMHgwMTAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfRklORCAgICAgMHgwMjAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfUFJPQ0VTUyAgMHgwNDAwCisjZGVmaW5lIFZFUkJPU0VfQUJPUlRfUkVUVVJOICAgMHgwODAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVQgICAgICAgICAgMHhmMDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfTUlEICAgICAgMHgxMDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfRklORCAgICAgMHgyMDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUyAgMHg0MDAwCisjZGVmaW5lIFZFUkJPU0VfUkVTRVRfUkVUVVJOICAgMHg4MDAwCitzdGF0aWMgaW50IGFpYzd4eHhfdmVyYm9zZSA9IFZFUkJPU0VfTk9STUFMIHwgVkVSQk9TRV9ORUdPVElBVElPTiB8CisgICAgICAgICAgIFZFUkJPU0VfUFJPQkU7ICAgICAgICAgICAgICAgICAgICAgLyogdmVyYm9zZSBtZXNzYWdlcyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV2UncmUgZ29pbmcgdG8gc3RhcnQgcHV0dGluZyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgc28gdGhhdCBvcmRlciBvZgorICogZnVuY3Rpb25zIGlzIG5vIGxvbmdlciBpbXBvcnRhbnQuICBBcyBuZWVkZWQsIHRoZXkgYXJlIGFkZGVkIGhlcmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBhaWM3eHh4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3NldF9zeW5jcmF0ZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCAKKwkJc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlLCBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwKKwkJdW5zaWduZWQgaW50IHBlcmlvZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciBvcHRpb25zLAorCQl1bnNpZ25lZCBpbnQgdHlwZSwgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2Rldik7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3NldF93aWR0aChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwKKwkJaW50IGx1biwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2Rldik7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3BhbmljX2Fib3J0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIFNjc2lfQ21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIGFpYzd4eHhfcHJpbnRfY2FyZChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKK3N0YXRpYyB2b2lkIGFpYzd4eHhfcHJpbnRfc2NyYXRjaF9yYW0oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CitzdGF0aWMgdm9pZCBhaWM3eHh4X3ByaW50X3NlcXVlbmNlcihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgZG93bmxvYWRlZCk7CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworc3RhdGljIHZvaWQgYWljN3h4eF9jaGVja19zY2JzKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGNoYXIgKmJ1ZmZlcik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdyB1c2VkLiAgVGhleSBoYXBwZW4gdG8gYmUgd3JhcHBlZCBpbiB1c2VsZXNzCisgKiBpbmIvb3V0YiBwb3J0IHJlYWQvd3JpdGVzIGFyb3VuZCB0aGUgcmVhbCByZWFkcyBhbmQgd3JpdGVzIGJlY2F1c2UgaXQKKyAqIHNlZW1zIHRoYXQgY2VydGFpbiB2ZXJ5IGZhc3QgQ1BVcyBoYXZlIGEgcHJvYmxlbSBkZWFsaW5nIHdpdGggdXMgd2hlbgorICogZ29pbmcgYXQgZnVsbCBzcGVlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK2FpY19pbmIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgbG9uZyBwb3J0KQoreworI2lmZGVmIE1NQVBJTworICB1bnNpZ25lZCBjaGFyIHg7CisgIGlmKHAtPm1hZGRyKQorICB7CisgICAgeCA9IHJlYWRiKHAtPm1hZGRyICsgcG9ydCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgeCA9IGluYihwLT5iYXNlICsgcG9ydCk7CisgIH0KKyAgcmV0dXJuKHgpOworI2Vsc2UKKyAgcmV0dXJuKGluYihwLT5iYXNlICsgcG9ydCkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWljX291dGIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciB2YWwsIGxvbmcgcG9ydCkKK3sKKyNpZmRlZiBNTUFQSU8KKyAgaWYocC0+bWFkZHIpCisgIHsKKyAgICB3cml0ZWIodmFsLCBwLT5tYWRkciArIHBvcnQpOworICAgIG1iKCk7IC8qIGxvY2tlZCBvcGVyYXRpb24gaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisgICAgcmVhZGIocC0+bWFkZHIgKyBIQ05UUkwpOyAvKiBkdW1teSByZWFkIHRvIGZsdXNoIHRoZSBQQ0kgd3JpdGUgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXRiKHZhbCwgcC0+YmFzZSArIHBvcnQpOworICAgIG1iKCk7IC8qIGxvY2tlZCBvcGVyYXRpb24gaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisgIH0KKyNlbHNlCisgIG91dGIodmFsLCBwLT5iYXNlICsgcG9ydCk7CisgIG1iKCk7IC8qIGxvY2tlZCBvcGVyYXRpb24gaW4gb3JkZXIgdG8gZm9yY2UgQ1BVIG9yZGVyaW5nICovCisjZW5kaWYKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NldHVwCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEhhbmRsZSBMaW51eCBib290IHBhcmFtZXRlcnMuIFRoaXMgcm91dGluZSBhbGxvd3MgZm9yIGFzc2lnbmluZyBhIHZhbHVlCisgKiAgIHRvIGEgcGFyYW1ldGVyIHdpdGggYSAnOicgYmV0d2VlbiB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdmFsdWUuCisgKiAgIGllLiBhaWM3eHh4PXVucGF1c2U6MHgwQSxleHRlbmRlZAorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NldHVwKGNoYXIgKnMpCit7CisgIGludCAgIGksIG47CisgIGNoYXIgKnA7CisgIGNoYXIgKmVuZDsKKworICBzdGF0aWMgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVuc2lnbmVkIGludCAqZmxhZzsKKyAgfSBvcHRpb25zW10gPSB7CisgICAgeyAiZXh0ZW5kZWQiLCAgICAmYWljN3h4eF9leHRlbmRlZCB9LAorICAgIHsgIm5vX3Jlc2V0IiwgICAgJmFpYzd4eHhfbm9fcmVzZXQgfSwKKyAgICB7ICJpcnFfdHJpZ2dlciIsICZhaWM3eHh4X2lycV90cmlnZ2VyIH0sCisgICAgeyAidmVyYm9zZSIsICAgICAmYWljN3h4eF92ZXJib3NlIH0sCisgICAgeyAicmV2ZXJzZV9zY2FuIiwmYWljN3h4eF9yZXZlcnNlX3NjYW4gfSwKKyAgICB7ICJvdmVycmlkZV90ZXJtIiwgJmFpYzd4eHhfb3ZlcnJpZGVfdGVybSB9LAorICAgIHsgInN0cHdsZXYiLCAmYWljN3h4eF9zdHB3bGV2IH0sCisgICAgeyAibm9fcHJvYmUiLCAmYWljN3h4eF9ub19wcm9iZSB9LAorICAgIHsgInBhbmljX29uX2Fib3J0IiwgJmFpYzd4eHhfcGFuaWNfb25fYWJvcnQgfSwKKyAgICB7ICJwY2lfcGFyaXR5IiwgJmFpYzd4eHhfcGNpX3Bhcml0eSB9LAorICAgIHsgImR1bXBfY2FyZCIsICZhaWM3eHh4X2R1bXBfY2FyZCB9LAorICAgIHsgImR1bXBfc2VxdWVuY2VyIiwgJmFpYzd4eHhfZHVtcF9zZXF1ZW5jZXIgfSwKKyAgICB7ICJkZWZhdWx0X3F1ZXVlX2RlcHRoIiwgJmFpYzd4eHhfZGVmYXVsdF9xdWV1ZV9kZXB0aCB9LAorICAgIHsgInNjYnJhbSIsICZhaWM3eHh4X3NjYnJhbSB9LAorICAgIHsgInNlbHRpbWUiLCAmYWljN3h4eF9zZWx0aW1lIH0sCisgICAgeyAidGFnX2luZm8iLCAgICBOVUxMIH0KKyAgfTsKKworICBlbmQgPSBzdHJjaHIocywgJ1wwJyk7CisKKyAgd2hpbGUgKChwID0gc3Ryc2VwKCZzLCAiLC4iKSkgIT0gTlVMTCkKKyAgeworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wdGlvbnMpOyBpKyspCisgICAgeworICAgICAgbiA9IHN0cmxlbihvcHRpb25zW2ldLm5hbWUpOworICAgICAgaWYgKCFzdHJuY21wKG9wdGlvbnNbaV0ubmFtZSwgcCwgbikpCisgICAgICB7CisgICAgICAgIGlmICghc3RybmNtcChwLCAidGFnX2luZm8iLCBuKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChwW25dID09ICc6JykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyICpiYXNlOworICAgICAgICAgICAgY2hhciAqdG9rLCAqdG9rX2VuZCwgKnRva19lbmQyOworICAgICAgICAgICAgY2hhciB0b2tfbGlzdFtdID0geyAnLicsICcsJywgJ3snLCAnfScsICdcMCcgfTsKKyAgICAgICAgICAgIGludCBpLCBpbnN0YW5jZSA9IC0xLCBkZXZpY2UgPSAtMTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZG9uZSA9IEZBTFNFOworCisgICAgICAgICAgICBiYXNlID0gcDsKKyAgICAgICAgICAgIHRvayA9IGJhc2UgKyBuICsgMTsgIC8qIEZvcndhcmQgdXMganVzdCBwYXN0IHRoZSAnOicgKi8KKyAgICAgICAgICAgIHRva19lbmQgPSBzdHJjaHIodG9rLCAnXDAnKTsKKyAgICAgICAgICAgIGlmICh0b2tfZW5kIDwgZW5kKQorICAgICAgICAgICAgICAqdG9rX2VuZCA9ICcsJzsKKyAgICAgICAgICAgIHdoaWxlKCFkb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzd2l0Y2goKnRvaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IDA7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXZpY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGRldmljZSA9IDA7CisgICAgICAgICAgICAgICAgICB0b2srKzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gLTE7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0YW5jZSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICAgIHRvaysrOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGV2aWNlID49IDApCisgICAgICAgICAgICAgICAgICAgIGRldmljZSsrOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5zdGFuY2UgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UrKzsKKyAgICAgICAgICAgICAgICAgIGlmICggKGRldmljZSA+PSBNQVhfVEFSR0VUUykgfHwgCisgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZSA+PSBBUlJBWV9TSVpFKGFpYzd4eHhfdGFnX2luZm8pKSApCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgdG9rKys7CisgICAgICAgICAgICAgICAgICBpZiAoIWRvbmUpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UgPSB0b2s7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIHRva19lbmQgPSBzdHJjaHIodG9rLCAnXDAnKTsKKyAgICAgICAgICAgICAgICAgIGZvcihpPTA7IHRva19saXN0W2ldOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva19lbmQyID0gc3RyY2hyKHRvaywgdG9rX2xpc3RbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoICh0b2tfZW5kMikgJiYgKHRva19lbmQyIDwgdG9rX2VuZCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgdG9rX2VuZCA9IHRva19lbmQyOworICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYgKCAoaW5zdGFuY2UgPj0gMCkgJiYgKGRldmljZSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2UgPCBBUlJBWV9TSVpFKGFpYzd4eHhfdGFnX2luZm8pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlIDwgTUFYX1RBUkdFVFMpICkKKyAgICAgICAgICAgICAgICAgICAgYWljN3h4eF90YWdfaW5mb1tpbnN0YW5jZV0udGFnX2NvbW1hbmRzW2RldmljZV0gPQorICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9zdHJ0b3VsKHRvaywgTlVMTCwgMCkgJiAweGZmOworICAgICAgICAgICAgICAgICAgdG9rID0gdG9rX2VuZDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSgocCAhPSBiYXNlKSAmJiAocCAhPSBOVUxMKSkKKyAgICAgICAgICAgICAgcCA9IHN0cnNlcCgmcywgIiwuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBbbl0gPT0gJzonKQorICAgICAgICB7CisgICAgICAgICAgKihvcHRpb25zW2ldLmZsYWcpID0gc2ltcGxlX3N0cnRvdWwocCArIG4gKyAxLCBOVUxMLCAwKTsKKyAgICAgICAgICBpZighc3RybmNtcChwLCAic2VsdGltZSIsIG4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICoob3B0aW9uc1tpXS5mbGFnKSA9ICgqKG9wdGlvbnNbaV0uZmxhZykgJSA0KSA8PCAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RybmNtcChwLCAidmVyYm9zZSIsIG4pKQorICAgICAgICB7CisgICAgICAgICAgKihvcHRpb25zW2ldLmZsYWcpID0gMHhmZjI5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICoob3B0aW9uc1tpXS5mbGFnKSA9IH4oKihvcHRpb25zW2ldLmZsYWcpKTsKKyAgICAgICAgICBpZighc3RybmNtcChwLCAic2VsdGltZSIsIG4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICoob3B0aW9uc1tpXS5mbGFnKSA9ICgqKG9wdGlvbnNbaV0uZmxhZykgJSA0KSA8PCAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWljN3h4eD0iLCBhaWM3eHh4X3NldHVwKTsKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBwYXVzZV9zZXF1ZW5jZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUGF1c2UgdGhlIHNlcXVlbmNlciBhbmQgd2FpdCBmb3IgaXQgdG8gYWN0dWFsbHkgc3RvcCAtIHRoaXMKKyAqICAgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBzZXF1ZW5jZXIgY2FuIGRpc2FibGUgcGF1c2luZyBmb3IgY3JpdGljYWwKKyAqICAgc2VjdGlvbnMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwYXVzZV9zZXF1ZW5jZXIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgYWljX291dGIocCwgcC0+cGF1c2UsIEhDTlRSTCk7CisgIHdoaWxlICgoYWljX2luYihwLCBIQ05UUkwpICYgUEFVU0UpID09IDApCisgIHsKKyAgICA7CisgIH0KKyAgaWYocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICB7CisgICAgYWljX2luYihwLCBDQ1NDQkNUTCk7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICB1bnBhdXNlX3NlcXVlbmNlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBVbnBhdXNlIHRoZSBzZXF1ZW5jZXIuIFVucmVtYXJrYWJsZSwgeWV0IGRvbmUgb2Z0ZW4gZW5vdWdoIHRvCisgKiAgIHdhcnJhbnQgYW4gZWFzeSB3YXkgdG8gZG8gaXQuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit1bnBhdXNlX3NlcXVlbmNlcihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgdW5wYXVzZV9hbHdheXMpCit7CisgIGlmICh1bnBhdXNlX2Fsd2F5cyB8fAorICAgICAgKCAhKGFpY19pbmIocCwgSU5UU1RBVCkgJiAoU0NTSUlOVCB8IFNFUUlOVCB8IEJSS0FEUklOVCkpICYmCisgICAgICAgICEocC0+ZmxhZ3MgJiBBSENfSEFORExJTkdfUkVRSU5JVFMpICkgKQorICB7CisgICAgYWljX291dGIocCwgcC0+dW5wYXVzZSwgSENOVFJMKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIHJlc3RhcnRfc2VxdWVuY2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlc3RhcnQgdGhlIHNlcXVlbmNlciBwcm9ncmFtIGZyb20gYWRkcmVzcyB6ZXJvLiAgVGhpcyBhc3N1bWVzCisgKiAgIHRoYXQgdGhlIHNlcXVlbmNlciBpcyBhbHJlYWR5IHBhdXNlZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3Jlc3RhcnRfc2VxdWVuY2VyKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIGFpY19vdXRiKHAsIDAsIFNFUUFERFIwKTsKKyAgYWljX291dGIocCwgMCwgU0VRQUREUjEpOworICBhaWNfb3V0YihwLCBGQVNUTU9ERSwgU0VRQ1RMKTsKK30KKworLyoKKyAqIFdlIGluY2x1ZGUgdGhlIGFpYzd4eHhfc2VxLmMgZmlsZSBoZXJlIHNvIHRoYXQgdGhlIG90aGVyIGRlZmluZXMgaGF2ZQorICogYWxyZWFkeSBiZWVuIG1hZGUsIGFuZCBzbyB0aGF0IGl0IGNvbWVzIGJlZm9yZSB0aGUgY29kZSB0aGF0IGFjdHVhbGx5CisgKiBkb3dubG9hZHMgdGhlIGluc3RydWN0aW9ucyAoc2luY2Ugd2UgZG9uJ3QgdHlwaWNhbGx5IHVzZSBmdW5jdGlvbgorICogcHJvdG90eXBlLCBvdXIgY29kZSBoYXMgdG8gYmUgb3JkZXJlZCB0aGF0IHdheSwgaXQncyBhIGxlZnQtb3ZlciBmcm9tCisgKiB0aGUgb3JpZ2luYWwgZHJpdmVyIGRheXMuLi4uLkkgc2hvdWxkIGZpeCBpdCBzb21lIHRpbWUgREwpLgorICovCisjaW5jbHVkZSAiYWljN3h4eF9vbGQvYWljN3h4eF9zZXEuYyIKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2NoZWNrX3BhdGNoCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFNlZSBpZiB0aGUgbmV4dCBwYXRjaCB0byBkb3dubG9hZCBzaG91bGQgYmUgZG93bmxvYWRlZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9jaGVja19wYXRjaChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLAorICBzdHJ1Y3Qgc2VxdWVuY2VyX3BhdGNoICoqc3RhcnRfcGF0Y2gsIGludCBzdGFydF9pbnN0ciwgaW50ICpza2lwX2FkZHIpCit7CisgIHN0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggKmN1cl9wYXRjaDsKKyAgc3RydWN0IHNlcXVlbmNlcl9wYXRjaCAqbGFzdF9wYXRjaDsKKyAgaW50IG51bV9wYXRjaGVzOworCisgIG51bV9wYXRjaGVzID0gc2l6ZW9mKHNlcXVlbmNlcl9wYXRjaGVzKS9zaXplb2Yoc3RydWN0IHNlcXVlbmNlcl9wYXRjaCk7CisgIGxhc3RfcGF0Y2ggPSAmc2VxdWVuY2VyX3BhdGNoZXNbbnVtX3BhdGNoZXNdOworICBjdXJfcGF0Y2ggPSAqc3RhcnRfcGF0Y2g7CisKKyAgd2hpbGUgKChjdXJfcGF0Y2ggPCBsYXN0X3BhdGNoKSAmJiAoc3RhcnRfaW5zdHIgPT0gY3VyX3BhdGNoLT5iZWdpbikpCisgIHsKKyAgICBpZiAoY3VyX3BhdGNoLT5wYXRjaF9mdW5jKHApID09IDApCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFN0YXJ0IHJlamVjdGluZyBjb2RlLgorICAgICAgICovCisgICAgICAqc2tpcF9hZGRyID0gc3RhcnRfaW5zdHIgKyBjdXJfcGF0Y2gtPnNraXBfaW5zdHI7CisgICAgICBjdXJfcGF0Y2ggKz0gY3VyX3BhdGNoLT5za2lwX3BhdGNoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEZvdW5kIGFuIE9LIHBhdGNoLiAgQWR2YW5jZSB0aGUgcGF0Y2ggcG9pbnRlciB0byB0aGUgbmV4dCBwYXRjaAorICAgICAgICogYW5kIHdhaXQgZm9yIG91ciBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIGdldCBoZXJlLgorICAgICAgICovCisgICAgICBjdXJfcGF0Y2grKzsKKyAgICB9CisgIH0KKworICAqc3RhcnRfcGF0Y2ggPSBjdXJfcGF0Y2g7CisgIGlmIChzdGFydF9pbnN0ciA8ICpza2lwX2FkZHIpCisgICAgLyoKKyAgICAgKiBTdGlsbCBza2lwcGluZworICAgICAqLworICAgIHJldHVybiAoMCk7CisgIHJldHVybigxKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZG93bmxvYWRfaW5zdHIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRmluZCB0aGUgbmV4dCBwYXRjaCB0byBkb3dubG9hZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfZG93bmxvYWRfaW5zdHIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50IGluc3RycHRyLAorICB1bnNpZ25lZCBjaGFyICpkY29uc3RzKQoreworICB1bmlvbiBpbnNfZm9ybWF0cyBpbnN0cjsKKyAgc3RydWN0IGluc19mb3JtYXQxICpmbXQxX2luczsKKyAgc3RydWN0IGluc19mb3JtYXQzICpmbXQzX2luczsKKyAgdW5zaWduZWQgY2hhciBvcGNvZGU7CisKKyAgaW5zdHIgPSAqKHVuaW9uIGluc19mb3JtYXRzKikgJnNlcXByb2dbaW5zdHJwdHIgKiA0XTsKKworICBpbnN0ci5pbnRlZ2VyID0gbGUzMl90b19jcHUoaW5zdHIuaW50ZWdlcik7CisgIAorICBmbXQxX2lucyA9ICZpbnN0ci5mb3JtYXQxOworICBmbXQzX2lucyA9IE5VTEw7CisKKyAgLyogUHVsbCB0aGUgb3Bjb2RlICovCisgIG9wY29kZSA9IGluc3RyLmZvcm1hdDEub3Bjb2RlOworICBzd2l0Y2ggKG9wY29kZSkKKyAgeworICAgIGNhc2UgQUlDX09QX0pNUDoKKyAgICBjYXNlIEFJQ19PUF9KQzoKKyAgICBjYXNlIEFJQ19PUF9KTkM6CisgICAgY2FzZSBBSUNfT1BfQ0FMTDoKKyAgICBjYXNlIEFJQ19PUF9KTkU6CisgICAgY2FzZSBBSUNfT1BfSk5aOgorICAgIGNhc2UgQUlDX09QX0pFOgorICAgIGNhc2UgQUlDX09QX0paOgorICAgIHsKKyAgICAgIHN0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggKmN1cl9wYXRjaDsKKyAgICAgIGludCBhZGRyZXNzX29mZnNldDsKKyAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzOworICAgICAgaW50IHNraXBfYWRkcjsKKyAgICAgIGludCBpOworCisgICAgICBmbXQzX2lucyA9ICZpbnN0ci5mb3JtYXQzOworICAgICAgYWRkcmVzc19vZmZzZXQgPSAwOworICAgICAgYWRkcmVzcyA9IGZtdDNfaW5zLT5hZGRyZXNzOworICAgICAgY3VyX3BhdGNoID0gc2VxdWVuY2VyX3BhdGNoZXM7CisgICAgICBza2lwX2FkZHIgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzczspCisgICAgICB7CisgICAgICAgIGFpYzd4eHhfY2hlY2tfcGF0Y2gocCwgJmN1cl9wYXRjaCwgaSwgJnNraXBfYWRkcik7CisgICAgICAgIGlmIChza2lwX2FkZHIgPiBpKQorICAgICAgICB7CisgICAgICAgICAgaW50IGVuZF9hZGRyOworCisgICAgICAgICAgZW5kX2FkZHIgPSBtaW5fdChpbnQsIGFkZHJlc3MsIHNraXBfYWRkcik7CisgICAgICAgICAgYWRkcmVzc19vZmZzZXQgKz0gZW5kX2FkZHIgLSBpOworICAgICAgICAgIGkgPSBza2lwX2FkZHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBhZGRyZXNzIC09IGFkZHJlc3Nfb2Zmc2V0OworICAgICAgZm10M19pbnMtPmFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgLyogRmFsbCBUaHJvdWdoIHRvIHRoZSBuZXh0IGNvZGUgc2VjdGlvbiAqLworICAgIH0KKyAgICBjYXNlIEFJQ19PUF9PUjoKKyAgICBjYXNlIEFJQ19PUF9BTkQ6CisgICAgY2FzZSBBSUNfT1BfWE9SOgorICAgIGNhc2UgQUlDX09QX0FERDoKKyAgICBjYXNlIEFJQ19PUF9BREM6CisgICAgY2FzZSBBSUNfT1BfQk1PVjoKKyAgICAgIGlmIChmbXQxX2lucy0+cGFyaXR5ICE9IDApCisgICAgICB7CisgICAgICAgIGZtdDFfaW5zLT5pbW1lZGlhdGUgPSBkY29uc3RzW2ZtdDFfaW5zLT5pbW1lZGlhdGVdOworICAgICAgfQorICAgICAgZm10MV9pbnMtPnBhcml0eSA9IDA7CisgICAgICAvKiBGYWxsIFRocm91Z2ggdG8gdGhlIG5leHQgY29kZSBzZWN0aW9uICovCisgICAgY2FzZSBBSUNfT1BfUk9MOgorICAgICAgaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApCisgICAgICB7CisgICAgICAgIGludCBpLCBjb3VudDsKKworICAgICAgICAvKiBDYWxjdWxhdGUgb2RkIHBhcml0eSBmb3IgdGhlIGluc3RydWN0aW9uICovCisgICAgICAgIGZvciAoIGk9MCwgY291bnQ9MDsgaSA8IDMxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgICAgICAgIG1hc2sgPSAweDAxIDw8IGk7CisgICAgICAgICAgaWYgKChpbnN0ci5pbnRlZ2VyICYgbWFzaykgIT0gMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoY291bnQgJiAweDAxKSkKKyAgICAgICAgICBpbnN0ci5mb3JtYXQxLnBhcml0eSA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChmbXQzX2lucyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaW5zdHIuaW50ZWdlciA9ICBmbXQzX2lucy0+aW1tZWRpYXRlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdDNfaW5zLT5zb3VyY2UgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm10M19pbnMtPmFkZHJlc3MgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdDNfaW5zLT5vcGNvZGUgPDwgMjUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGluc3RyLmludGVnZXIgPSAgZm10MV9pbnMtPmltbWVkaWF0ZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmbXQxX2lucy0+c291cmNlIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZtdDFfaW5zLT5kZXN0aW5hdGlvbiA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm10MV9pbnMtPnJldCA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm10MV9pbnMtPm9wY29kZSA8PCAyNSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFpY19vdXRiKHAsIChpbnN0ci5pbnRlZ2VyICYgMHhmZiksIFNFUVJBTSk7CisgICAgICBhaWNfb3V0YihwLCAoKGluc3RyLmludGVnZXIgPj4gOCkgJiAweGZmKSwgU0VRUkFNKTsKKyAgICAgIGFpY19vdXRiKHAsICgoaW5zdHIuaW50ZWdlciA+PiAxNikgJiAweGZmKSwgU0VRUkFNKTsKKyAgICAgIGFpY19vdXRiKHAsICgoaW5zdHIuaW50ZWdlciA+PiAyNCkgJiAweGZmKSwgU0VRUkFNKTsKKyAgICAgIHVkZWxheSgxMCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwYW5pYygiYWljN3h4eDogVW5rbm93biBvcGNvZGUgZW5jb3VudGVyZWQgaW4gc2VxdWVuY2VyIHByb2dyYW0uIik7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9sb2Fkc2VxCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIExvYWQgdGhlIHNlcXVlbmNlciBjb2RlIGludG8gdGhlIGNvbnRyb2xsZXIgbWVtb3J5LgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9sb2Fkc2VxKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIHN0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggKmN1cl9wYXRjaDsKKyAgaW50IGk7CisgIGludCBkb3dubG9hZGVkOworICBpbnQgc2tpcF9hZGRyOworICB1bnNpZ25lZCBjaGFyIGRvd25sb2FkX2NvbnN0c1s0XSA9IHswLCAwLCAwLCAwfTsKKworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRSkKKyAgeworICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIERvd25sb2FkaW5nIHNlcXVlbmNlciBjb2RlLi4uIiwgcC0+aG9zdF9ubyk7CisgIH0KKyNpZiAwCisgIGRvd25sb2FkX2NvbnN0c1tUTU9ERV9OVU1DTURTXSA9IHAtPm51bV90YXJnZXRjbWRzOworI2VuZGlmCisgIGRvd25sb2FkX2NvbnN0c1tUTU9ERV9OVU1DTURTXSA9IDA7CisgIGN1cl9wYXRjaCA9ICZzZXF1ZW5jZXJfcGF0Y2hlc1swXTsKKyAgZG93bmxvYWRlZCA9IDA7CisgIHNraXBfYWRkciA9IDA7CisKKyAgYWljX291dGIocCwgUEVSUk9SRElTfExPQURSQU18RkFJTERJU3xGQVNUTU9ERSwgU0VRQ1RMKTsKKyAgYWljX291dGIocCwgMCwgU0VRQUREUjApOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzZXFwcm9nKSAvIDQ7ICBpKyspCisgIHsKKyAgICBpZiAoYWljN3h4eF9jaGVja19wYXRjaChwLCAmY3VyX3BhdGNoLCBpLCAmc2tpcF9hZGRyKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIFNraXAgdGhpcyBpbnN0cnVjdGlvbiBmb3IgdGhpcyBjb25maWd1cmF0aW9uLiAqLworICAgICAgY29udGludWU7CisgICAgfQorICAgIGFpYzd4eHhfZG93bmxvYWRfaW5zdHIocCwgaSwgJmRvd25sb2FkX2NvbnN0c1swXSk7CisgICAgZG93bmxvYWRlZCsrOworICB9CisKKyAgYWljX291dGIocCwgMCwgU0VRQUREUjApOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMSk7CisgIGFpY19vdXRiKHAsIEZBU1RNT0RFIHwgRkFJTERJUywgU0VRQ1RMKTsKKyAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgVFJVRSk7CisgIG1kZWxheSgxKTsKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworICBhaWNfb3V0YihwLCBGQVNUTU9ERSwgU0VRQ1RMKTsKKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUpCisgIHsKKyAgICBwcmludGsoIiAlZCBpbnN0cnVjdGlvbnMgZG93bmxvYWRlZFxuIiwgZG93bmxvYWRlZCk7CisgIH0KKyAgaWYgKGFpYzd4eHhfZHVtcF9zZXF1ZW5jZXIpCisgICAgYWljN3h4eF9wcmludF9zZXF1ZW5jZXIocCwgZG93bmxvYWRlZCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcmludF9zZXF1ZW5jZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZXF1ZW5jZXIgbWVtb3J5IHRvIHRoZSBzY3JlZW4uCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3ByaW50X3NlcXVlbmNlcihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgZG93bmxvYWRlZCkKK3sKKyAgaW50IGksIGssIHRlbXA7CisgIAorICBhaWNfb3V0YihwLCBQRVJST1JESVN8TE9BRFJBTXxGQUlMRElTfEZBU1RNT0RFLCBTRVFDVEwpOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMCk7CisgIGFpY19vdXRiKHAsIDAsIFNFUUFERFIxKTsKKworICBrID0gMDsKKyAgZm9yIChpPTA7IGkgPCBkb3dubG9hZGVkOyBpKyspCisgIHsKKyAgICBpZiAoIGsgPT0gMCApCisgICAgICBwcmludGsoIiUwM3g6ICIsIGkpOworICAgIHRlbXAgPSBhaWNfaW5iKHAsIFNFUVJBTSk7CisgICAgdGVtcCB8PSAoYWljX2luYihwLCBTRVFSQU0pIDw8IDgpOworICAgIHRlbXAgfD0gKGFpY19pbmIocCwgU0VRUkFNKSA8PCAxNik7CisgICAgdGVtcCB8PSAoYWljX2luYihwLCBTRVFSQU0pIDw8IDI0KTsKKyAgICBwcmludGsoIiUwOHgiLCB0ZW1wKTsKKyAgICBpZiAoICsrayA9PSA4ICkKKyAgICB7CisgICAgICBwcmludGsoIlxuIik7CisgICAgICBrID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRrKCIgIik7CisgIH0KKyAgYWljX291dGIocCwgMCwgU0VRQUREUjApOworICBhaWNfb3V0YihwLCAwLCBTRVFBRERSMSk7CisgIGFpY19vdXRiKHAsIEZBU1RNT0RFIHwgRkFJTERJUywgU0VRQ1RMKTsKKyAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgVFJVRSk7CisgIG1kZWxheSgxKTsKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworICBhaWNfb3V0YihwLCBGQVNUTU9ERSwgU0VRQ1RMKTsKKyAgcHJpbnRrKCJcbiIpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaW5mbworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZHJpdmVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgY2hhciAqCithaWM3eHh4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqZG9vaCkKK3sKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CisgIGNoYXIgKmJwOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworCisgIGJwID0gJmJ1ZmZlclswXTsKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopZG9vaC0+aG9zdGRhdGE7CisgIG1lbXNldChicCwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICBzdHJjcHkoYnAsICJBZGFwdGVjIEFIQTI3NHgvMjg0eC8yOTR4IChFSVNBL1ZMQi9QQ0ktRmFzdCBTQ1NJKSAiKTsKKyAgc3RyY2F0KGJwLCBBSUM3WFhYX0NfVkVSU0lPTik7CisgIHN0cmNhdChicCwgIi8iKTsKKyAgc3RyY2F0KGJwLCBBSUM3WFhYX0hfVkVSU0lPTik7CisgIHN0cmNhdChicCwgIlxuIik7CisgIHN0cmNhdChicCwgIiAgICAgICA8Iik7CisgIHN0cmNhdChicCwgYm9hcmRfbmFtZXNbcC0+Ym9hcmRfbmFtZV9pbmRleF0pOworICBzdHJjYXQoYnAsICI+Iik7CisKKyAgcmV0dXJuKGJwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2ZpbmRfc3luY3JhdGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgTG9vayB1cCB0aGUgdmFsaWQgcGVyaW9kIHRvIFNDU0lSQVRFIGNvbnZlcnNpb24gaW4gb3VyIHRhYmxlCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgYWljN3h4eF9zeW5jcmF0ZSAqCithaWM3eHh4X2ZpbmRfc3luY3JhdGUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgaW50ICpwZXJpb2QsCisgIHVuc2lnbmVkIGludCBtYXhzeW5jLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zKQoreworICBzdHJ1Y3QgYWljN3h4eF9zeW5jcmF0ZSAqc3luY3JhdGU7CisgIGludCBkb25lID0gRkFMU0U7CisKKyAgc3dpdGNoKCpvcHRpb25zKQorICB7CisgICAgY2FzZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfQ1JDOgorICAgIGNhc2UgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTOgorICAgICAgaWYoIShwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpKQorICAgICAgeworICAgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICAgIG1heHN5bmMgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1heHN5bmMsIEFIQ19TWU5DUkFURV9VTFRSQTIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfQ1JDX1FVSUNLOgorICAgIGNhc2UgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTX1FVSUNLOgorICAgICAgaWYoIShwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpKQorICAgICAgeworICAgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICAgIG1heHN5bmMgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1heHN5bmMsIEFIQ19TWU5DUkFURV9VTFRSQTIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB3ZSBkb24ndCBzdXBwb3J0IHRoZSBRdWljayBBcmJpdHJhdGlvbiB2YXJpYW50cyBvZiBkdWFsIGVkZ2UKKyAgICAgICAgICogY2xvY2tpbmcuICBBcyBpdCB0dXJucyBvdXQsIHdlIHdhbnQgdG8gc2VuZCBiYWNrIHRoZQorICAgICAgICAgKiBzYW1lIGJhc2ljIG9wdGlvbiwgYnV0IHdpdGhvdXQgdGhlIFFBIGF0dHJpYnV0ZS4KKyAgICAgICAgICogV2Uga25vdyB0aGF0IHdlIGFyZSByZXNwb25kaW5nIGJlY2F1c2Ugd2Ugd291bGQgbmV2ZXIgc2V0CisgICAgICAgICAqIHRoZXNlIG9wdGlvbnMgb3Vyc2VsZiwgd2Ugd291bGQgb25seSByZXNwb25kIHRvIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2goKm9wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkNfUVVJQ0s6CisgICAgICAgICAgICAqb3B0aW9ucyA9IE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIE1TR19FWFRfUFBSX09QVElPTl9EVF9VTklUU19RVUlDSzoKKyAgICAgICAgICAgICpvcHRpb25zID0gTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICBtYXhzeW5jID0gbWF4X3QodW5zaWduZWQgaW50LCBtYXhzeW5jLCBBSENfU1lOQ1JBVEVfVUxUUkEyKTsKKyAgICAgIGJyZWFrOworICB9CisgIHN5bmNyYXRlID0gJmFpYzd4eHhfc3luY3JhdGVzW21heHN5bmNdOworICB3aGlsZSAoIChzeW5jcmF0ZS0+cmF0ZVswXSAhPSBOVUxMKSAmJgorICAgICAgICAgKCEocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSB8fCBzeW5jcmF0ZS0+c3hmcl91bHRyYTIpICkKKyAgeworICAgIGlmICgqcGVyaW9kIDw9IHN5bmNyYXRlLT5wZXJpb2QpIAorICAgIHsKKyAgICAgIHN3aXRjaCgqb3B0aW9ucykKKyAgICAgIHsKKyAgICAgICAgY2FzZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfQ1JDOgorICAgICAgICBjYXNlIE1TR19FWFRfUFBSX09QVElPTl9EVF9VTklUUzoKKyAgICAgICAgICBpZighKHN5bmNyYXRlLT5zeGZyX3VsdHJhMiAmIEFIQ19TWU5DUkFURV9DUkMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG9vcHMsIHdlIHdlbnQgdG9vIGxvdyBmb3IgdGhlIENSQy9EdWFsRWRnZSBzaWduYWxsaW5nLCBzbworICAgICAgICAgICAgICogY2xlYXIgdGhlIG9wdGlvbnMgYnl0ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqb3B0aW9ucyA9IDA7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2UnbGwgYmUgc2VuZGluZyBhIHJlcGx5IHRvIHRoaXMgcGFja2V0IHRvIHNldCB0aGUgb3B0aW9ucworICAgICAgICAgICAgICogcHJvcGVybHksIHNvIHVuaWxhdGVyYWxseSBzZXQgdGhlIHBlcmlvZCBhcyB3ZWxsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAqcGVyaW9kID0gc3luY3JhdGUtPnBlcmlvZDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgICAgaWYoc3luY3JhdGUgPT0gJmFpYzd4eHhfc3luY3JhdGVzW21heHN5bmNdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAqcGVyaW9kID0gc3luY3JhdGUtPnBlcmlvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYoIShzeW5jcmF0ZS0+c3hmcl91bHRyYTIgJiBBSENfU1lOQ1JBVEVfQ1JDKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgIGlmKHN5bmNyYXRlID09ICZhaWM3eHh4X3N5bmNyYXRlc1ttYXhzeW5jXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKnBlcmlvZCA9IHN5bmNyYXRlLT5wZXJpb2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYoZG9uZSkKKyAgICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHN5bmNyYXRlKys7CisgIH0KKyAgaWYgKCAoKnBlcmlvZCA9PSAwKSB8fCAoc3luY3JhdGUtPnJhdGVbMF0gPT0gTlVMTCkgfHwKKyAgICAgICAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgJiYgKHN5bmNyYXRlLT5zeGZyX3VsdHJhMiA9PSAwKSkgKQorICB7CisgICAgLyoKKyAgICAgKiBVc2UgYXN5bmMgdHJhbnNmZXJzIGZvciB0aGlzIHRhcmdldAorICAgICAqLworICAgICpvcHRpb25zID0gMDsKKyAgICAqcGVyaW9kID0gMjU1OworICAgIHN5bmNyYXRlID0gTlVMTDsKKyAgfQorICByZXR1cm4gKHN5bmNyYXRlKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZmluZF9wZXJpb2QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgTG9vayB1cCB0aGUgdmFsaWQgU0NTSVJBVEUgdG8gcGVyaW9kIGNvbnZlcnNpb24gaW4gb3VyIHRhYmxlCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2FpYzd4eHhfZmluZF9wZXJpb2Qoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgaW50IHNjc2lyYXRlLAorICB1bnNpZ25lZCBpbnQgbWF4c3luYykKK3sKKyAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlOworCisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBzY3NpcmF0ZSAmPSBTWEZSX1VMVFJBMjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzY3NpcmF0ZSAmPSBTWEZSOworICB9CisKKyAgc3luY3JhdGUgPSAmYWljN3h4eF9zeW5jcmF0ZXNbbWF4c3luY107CisgIHdoaWxlIChzeW5jcmF0ZS0+cmF0ZVswXSAhPSBOVUxMKQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICB7CisgICAgICBpZiAoc3luY3JhdGUtPnN4ZnJfdWx0cmEyID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZSBpZiAoc2NzaXJhdGUgPT0gc3luY3JhdGUtPnN4ZnJfdWx0cmEyKQorICAgICAgICByZXR1cm4gKHN5bmNyYXRlLT5wZXJpb2QpOworICAgICAgZWxzZSBpZiAoc2NzaXJhdGUgPT0gKHN5bmNyYXRlLT5zeGZyX3VsdHJhMiAmIH5BSENfU1lOQ1JBVEVfQ1JDKSkKKyAgICAgICAgcmV0dXJuIChzeW5jcmF0ZS0+cGVyaW9kKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2NzaXJhdGUgPT0gKHN5bmNyYXRlLT5zeGZyICYgflVMVFJBX1NYRlIpKQorICAgIHsKKyAgICAgIHJldHVybiAoc3luY3JhdGUtPnBlcmlvZCk7CisgICAgfQorICAgIHN5bmNyYXRlKys7CisgIH0KKyAgcmV0dXJuICgwKTsgLyogYXN5bmMgKi8KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3ZhbGlkYXRlX29mZnNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgYSB2YWxpZCBvZmZzZXQgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjYXJkIGluIHVzZSBhbmQgdHJhbnNmZXIKKyAqICAgc2V0dGluZ3MgaW4gdXNlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF92YWxpZGF0ZV9vZmZzZXQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwKKyAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlLCB1bnNpZ25lZCBpbnQgKm9mZnNldCwgaW50IHdpZGUpCit7CisgIHVuc2lnbmVkIGludCBtYXhvZmZzZXQ7CisKKyAgLyogTGltaXQgb2Zmc2V0IHRvIHdoYXQgdGhlIGNhcmQgKGFuZCBkZXZpY2UpIGNhbiBkbyAqLworICBpZiAoc3luY3JhdGUgPT0gTlVMTCkKKyAgeworICAgIG1heG9mZnNldCA9IDA7CisgIH0KKyAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICB7CisgICAgbWF4b2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKHdpZGUpCisgICAgICBtYXhvZmZzZXQgPSBNQVhfT0ZGU0VUXzE2QklUOworICAgIGVsc2UKKyAgICAgIG1heG9mZnNldCA9IE1BWF9PRkZTRVRfOEJJVDsKKyAgfQorICAqb2Zmc2V0ID0gbWluKCpvZmZzZXQsIG1heG9mZnNldCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zZXRfc3luY3JhdGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU2V0IHRoZSBhY3R1YWwgc3luY3JhdGUgZG93biBpbiB0aGUgY2FyZCBhbmQgaW4gb3VyIGhvc3Qgc3RydWN0cworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9zZXRfc3luY3JhdGUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlLAorICAgIGludCB0YXJnZXQsIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgIHVuc2lnbmVkIGNoYXIgb3B0aW9ucywgdW5zaWduZWQgaW50IHR5cGUsIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXYpCit7CisgIHVuc2lnbmVkIGNoYXIgdGluZGV4OworICB1bnNpZ25lZCBzaG9ydCB0YXJnZXRfbWFzazsKKyAgdW5zaWduZWQgY2hhciBsdW4sIG9sZF9vcHRpb25zOworICB1bnNpZ25lZCBpbnQgb2xkX3BlcmlvZCwgb2xkX29mZnNldDsKKworICB0aW5kZXggPSB0YXJnZXQgfCAoY2hhbm5lbCA8PCAzKTsKKyAgdGFyZ2V0X21hc2sgPSAweDAxIDw8IHRpbmRleDsKKyAgbHVuID0gYWljX2luYihwLCBTQ0JfVENMKSAmIDB4MDc7CisKKyAgaWYgKHN5bmNyYXRlID09IE5VTEwpCisgIHsKKyAgICBwZXJpb2QgPSAwOworICAgIG9mZnNldCA9IDA7CisgIH0KKworICBvbGRfcGVyaW9kID0gYWljX2Rldi0+Y3VyLnBlcmlvZDsKKyAgb2xkX29mZnNldCA9IGFpY19kZXYtPmN1ci5vZmZzZXQ7CisgIG9sZF9vcHRpb25zID0gYWljX2Rldi0+Y3VyLm9wdGlvbnM7CisKKyAgCisgIGlmICh0eXBlICYgQUhDX1RSQU5TX0NVUikKKyAgeworICAgIHVuc2lnbmVkIGludCBzY3NpcmF0ZTsKKworICAgIHNjc2lyYXRlID0gYWljX2luYihwLCBUQVJHX1NDU0lSQVRFICsgdGluZGV4KTsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIHNjc2lyYXRlICY9IH5TWEZSX1VMVFJBMjsKKyAgICAgIGlmIChzeW5jcmF0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBzd2l0Y2gob3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX1VOSVRTOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG1hc2sgb2ZmIHRoZSBDUkMgYml0IGluIHRoZSB4ZmVyIHNldHRpbmdzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNjc2lyYXRlIHw9IChzeW5jcmF0ZS0+c3hmcl91bHRyYTIgJiB+QUhDX1NZTkNSQVRFX0NSQyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2NzaXJhdGUgfD0gc3luY3JhdGUtPnN4ZnJfdWx0cmEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0eXBlICYgQUhDX1RSQU5TX0FDVElWRSkKKyAgICAgIHsKKyAgICAgICAgYWljX291dGIocCwgb2Zmc2V0LCBTQ1NJT0ZGU0VUKTsKKyAgICAgIH0KKyAgICAgIGFpY19vdXRiKHAsIG9mZnNldCwgVEFSR19PRkZTRVQgKyB0aW5kZXgpOworICAgIH0KKyAgICBlbHNlIC8qIE5vdCBhbiBVbHRyYTIgY29udHJvbGxlciAqLworICAgIHsKKyAgICAgIHNjc2lyYXRlICY9IH4oU1hGUnxTT0ZTKTsKKyAgICAgIHAtPnVsdHJhZW5iICY9IH50YXJnZXRfbWFzazsKKyAgICAgIGlmIChzeW5jcmF0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBpZiAoc3luY3JhdGUtPnN4ZnIgJiBVTFRSQV9TWEZSKQorICAgICAgICB7CisgICAgICAgICAgcC0+dWx0cmFlbmIgfD0gdGFyZ2V0X21hc2s7CisgICAgICAgIH0KKyAgICAgICAgc2NzaXJhdGUgfD0gKHN5bmNyYXRlLT5zeGZyICYgU1hGUik7CisgICAgICAgIHNjc2lyYXRlIHw9IChvZmZzZXQgJiBTT0ZTKTsKKyAgICAgIH0KKyAgICAgIGlmICh0eXBlICYgQUhDX1RSQU5TX0FDVElWRSkKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzeGZyY3RsMDsKKworICAgICAgICBzeGZyY3RsMCA9IGFpY19pbmIocCwgU1hGUkNUTDApOworICAgICAgICBzeGZyY3RsMCAmPSB+RkFTVDIwOworICAgICAgICBpZiAocC0+dWx0cmFlbmIgJiB0YXJnZXRfbWFzaykKKyAgICAgICAgICBzeGZyY3RsMCB8PSBGQVNUMjA7CisgICAgICAgIGFpY19vdXRiKHAsIHN4ZnJjdGwwLCBTWEZSQ1RMMCk7CisgICAgICB9CisgICAgICBhaWNfb3V0YihwLCBwLT51bHRyYWVuYiAmIDB4ZmYsIFVMVFJBX0VOQik7CisgICAgICBhaWNfb3V0YihwLCAocC0+dWx0cmFlbmIgPj4gOCkgJiAweGZmLCBVTFRSQV9FTkIgKyAxICk7CisgICAgfQorICAgIGlmICh0eXBlICYgQUhDX1RSQU5TX0FDVElWRSkKKyAgICB7CisgICAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgU0NTSVJBVEUpOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgVEFSR19TQ1NJUkFURSArIHRpbmRleCk7CisgICAgYWljX2Rldi0+Y3VyLnBlcmlvZCA9IHBlcmlvZDsKKyAgICBhaWNfZGV2LT5jdXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGFpY19kZXYtPmN1ci5vcHRpb25zID0gb3B0aW9uczsKKyAgICBpZiAoICEodHlwZSAmIEFIQ19UUkFOU19RVUlURSkgJiYKKyAgICAgICAgIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OKSAmJgorICAgICAgICAgKGFpY19kZXYtPmZsYWdzICYgREVWSUNFX1BSSU5UX0RUUikgKQorICAgIHsKKyAgICAgIGlmIChvZmZzZXQpCisgICAgICB7CisgICAgICAgIGludCByYXRlX21vZCA9IChzY3NpcmF0ZSAmIFdJREVYRkVSKSA/IDEgOiAwOworICAgICAgCisgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlN5bmNocm9ub3VzIGF0ICVzIE1ieXRlL3NlYywgIgorICAgICAgICAgICAgICAgIm9mZnNldCAlZC5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuLAorICAgICAgICAgICAgICAgc3luY3JhdGUtPnJhdGVbcmF0ZV9tb2RdLCBvZmZzZXQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGsoSU5GT19MRUFEICJVc2luZyBhc3luY2hyb25vdXMgdHJhbnNmZXJzLlxuIiwKKyAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgIH0KKyAgICAgIGFpY19kZXYtPmZsYWdzICY9IH5ERVZJQ0VfUFJJTlRfRFRSOworICAgIH0KKyAgfQorCisgIGlmICh0eXBlICYgQUhDX1RSQU5TX0dPQUwpCisgIHsKKyAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IHBlcmlvZDsKKyAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IG9mZnNldDsKKyAgICBhaWNfZGV2LT5nb2FsLm9wdGlvbnMgPSBvcHRpb25zOworICB9CisKKyAgaWYgKHR5cGUgJiBBSENfVFJBTlNfVVNFUikKKyAgeworICAgIHAtPnVzZXJbdGluZGV4XS5wZXJpb2QgPSBwZXJpb2Q7CisgICAgcC0+dXNlclt0aW5kZXhdLm9mZnNldCA9IG9mZnNldDsKKyAgICBwLT51c2VyW3RpbmRleF0ub3B0aW9ucyA9IG9wdGlvbnM7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NldF93aWR0aAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgdGhlIGFjdHVhbCB3aWR0aCBkb3duIGluIHRoZSBjYXJkIGFuZCBpbiBvdXIgaG9zdCBzdHJ1Y3RzCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3NldF93aWR0aChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwgaW50IGx1biwKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCB0eXBlLCBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2KQoreworICB1bnNpZ25lZCBjaGFyIHRpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQgdGFyZ2V0X21hc2s7CisgIHVuc2lnbmVkIGludCBvbGRfd2lkdGg7CisKKyAgdGluZGV4ID0gdGFyZ2V0IHwgKGNoYW5uZWwgPDwgMyk7CisgIHRhcmdldF9tYXNrID0gMSA8PCB0aW5kZXg7CisgIAorICBvbGRfd2lkdGggPSBhaWNfZGV2LT5jdXIud2lkdGg7CisKKyAgaWYgKHR5cGUgJiBBSENfVFJBTlNfQ1VSKSAKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2NzaXJhdGU7CisKKyAgICBzY3NpcmF0ZSA9IGFpY19pbmIocCwgVEFSR19TQ1NJUkFURSArIHRpbmRleCk7CisKKyAgICBzY3NpcmF0ZSAmPSB+V0lERVhGRVI7CisgICAgaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorICAgICAgc2NzaXJhdGUgfD0gV0lERVhGRVI7CisKKyAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgVEFSR19TQ1NJUkFURSArIHRpbmRleCk7CisKKyAgICBpZiAodHlwZSAmIEFIQ19UUkFOU19BQ1RJVkUpCisgICAgICBhaWNfb3V0YihwLCBzY3NpcmF0ZSwgU0NTSVJBVEUpOworCisgICAgYWljX2Rldi0+Y3VyLndpZHRoID0gd2lkdGg7CisKKyAgICBpZiAoICEodHlwZSAmIEFIQ19UUkFOU19RVUlURSkgJiYKKyAgICAgICAgICAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpICYmIAorICAgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9QUklOVF9EVFIpICkKKyAgICB7CisgICAgICBwcmludGsoSU5GT19MRUFEICJVc2luZyAlcyB0cmFuc2ZlcnNcbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwKKyAgICAgICAgbHVuLCAoc2NzaXJhdGUgJiBXSURFWEZFUikgPyAiV2lkZSgxNmJpdCkiIDogIk5hcnJvdyg4Yml0KSIgKTsKKyAgICB9CisgIH0KKworICBpZiAodHlwZSAmIEFIQ19UUkFOU19HT0FMKQorICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSB3aWR0aDsKKyAgaWYgKHR5cGUgJiBBSENfVFJBTlNfVVNFUikKKyAgICBwLT51c2VyW3RpbmRleF0ud2lkdGggPSB3aWR0aDsKKworICBpZiAoYWljX2Rldi0+Z29hbC5vZmZzZXQpCisgIHsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgfQorICAgIGVsc2UgaWYgKHdpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorICAgIHsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF8xNkJJVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOworICAgIH0KKyAgfQorfQorICAgICAgCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIHNjYnFfaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTQ0IgcXVldWUgaW5pdGlhbGl6YXRpb24uCisgKgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2NicV9pbml0KHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSkKK3sKKyAgcXVldWUtPmhlYWQgPSBOVUxMOworICBxdWV1ZS0+dGFpbCA9IE5VTEw7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgc2NicV9pbnNlcnRfaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBBZGQgYW4gU0NCIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICoKKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitzY2JxX2luc2VydF9oZWFkKHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHNjYi0+cV9uZXh0ID0gcXVldWUtPmhlYWQ7CisgIHF1ZXVlLT5oZWFkID0gc2NiOworICBpZiAocXVldWUtPnRhaWwgPT0gTlVMTCkgICAgICAgLyogSWYgbGlzdCB3YXMgZW1wdHksIHVwZGF0ZSB0YWlsLiAqLworICAgIHF1ZXVlLT50YWlsID0gcXVldWUtPmhlYWQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgc2NicV9yZW1vdmVfaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZW1vdmUgYW4gU0NCIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhaWM3eHh4X3NjYiAqCitzY2JxX3JlbW92ZV9oZWFkKHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSkKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICogc2NicDsKKworICBzY2JwID0gcXVldWUtPmhlYWQ7CisgIGlmIChxdWV1ZS0+aGVhZCAhPSBOVUxMKQorICAgIHF1ZXVlLT5oZWFkID0gcXVldWUtPmhlYWQtPnFfbmV4dDsKKyAgaWYgKHF1ZXVlLT5oZWFkID09IE5VTEwpICAgICAgIC8qIElmIGxpc3QgaXMgbm93IGVtcHR5LCB1cGRhdGUgdGFpbC4gKi8KKyAgICBxdWV1ZS0+dGFpbCA9IE5VTEw7CisgIHJldHVybihzY2JwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBzY2JxX3JlbW92ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZW1vdmVzIGFuIFNDQiBmcm9tIHRoZSBsaXN0LgorICoKKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitzY2JxX3JlbW92ZSh2b2xhdGlsZSBzY2JfcXVldWVfdHlwZSAqcXVldWUsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICBpZiAocXVldWUtPmhlYWQgPT0gc2NiKQorICB7CisgICAgLyogQXQgYmVnaW5uaW5nIG9mIHF1ZXVlLCByZW1vdmUgZnJvbSBoZWFkLiAqLworICAgIHNjYnFfcmVtb3ZlX2hlYWQocXVldWUpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0cnVjdCBhaWM3eHh4X3NjYiAqY3Vyc2NiID0gcXVldWUtPmhlYWQ7CisKKyAgICAvKgorICAgICAqIFNlYXJjaCB1bnRpbCB0aGUgbmV4dCBzY2IgaXMgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvciwgb3IKKyAgICAgKiB3ZSBydW4gb3V0IG9mIHF1ZXVlLgorICAgICAqLworICAgIHdoaWxlICgoY3Vyc2NiICE9IE5VTEwpICYmIChjdXJzY2ItPnFfbmV4dCAhPSBzY2IpKQorICAgIHsKKyAgICAgIGN1cnNjYiA9IGN1cnNjYi0+cV9uZXh0OworICAgIH0KKyAgICBpZiAoY3Vyc2NiICE9IE5VTEwpCisgICAgeworICAgICAgLyogRm91bmQgaXQuICovCisgICAgICBjdXJzY2ItPnFfbmV4dCA9IHNjYi0+cV9uZXh0OworICAgICAgaWYgKHNjYi0+cV9uZXh0ID09IE5VTEwpCisgICAgICB7CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgdGFpbCB3aGVuIHJlbW92aW5nIHRoZSB0YWlsLiAqLworICAgICAgICBxdWV1ZS0+dGFpbCA9IGN1cnNjYjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBzY2JxX2luc2VydF90YWlsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEFkZCBhbiBTQ0IgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NjYnFfaW5zZXJ0X3RhaWwodm9sYXRpbGUgc2NiX3F1ZXVlX3R5cGUgKnF1ZXVlLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYikKK3sKKyAgc2NiLT5xX25leHQgPSBOVUxMOworICBpZiAocXVldWUtPnRhaWwgIT0gTlVMTCkgICAgICAgLyogQWRkIHRoZSBzY2IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gKi8KKyAgICBxdWV1ZS0+dGFpbC0+cV9uZXh0ID0gc2NiOworICBxdWV1ZS0+dGFpbCA9IHNjYjsgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSB0YWlsLiAqLworICBpZiAocXVldWUtPmhlYWQgPT0gTlVMTCkgICAgICAgLyogSWYgbGlzdCB3YXMgZW1wdHksIHVwZGF0ZSBoZWFkLiAqLworICAgIHF1ZXVlLT5oZWFkID0gcXVldWUtPnRhaWw7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9tYXRjaF9zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ2hlY2tzIHRvIHNlZSBpZiBhbiBzY2IgbWF0Y2hlcyB0aGUgdGFyZ2V0L2NoYW5uZWwgYXMgc3BlY2lmaWVkLgorICogICBJZiB0YXJnZXQgaXMgQUxMX1RBUkdFVFMgKC0xKSwgdGhlbiB3ZSdyZSBsb29raW5nIGZvciBhbnkgZGV2aWNlCisgKiAgIG9uIHRoZSBzcGVjaWZpZWQgY2hhbm5lbDsgdGhpcyBoYXBwZW5zIHdoZW4gYSBjaGFubmVsIGlzIGdvaW5nCisgKiAgIHRvIGJlIHJlc2V0IGFuZCBhbGwgZGV2aWNlcyBvbiB0aGF0IGNoYW5uZWwgbXVzdCBiZSBhYm9ydGVkLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X21hdGNoX3NjYihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYiwKKyAgICBpbnQgdGFyZ2V0LCBpbnQgY2hhbm5lbCwgaW50IGx1biwgdW5zaWduZWQgY2hhciB0YWcpCit7CisgIGludCB0YXJnID0gKHNjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuID4+IDQpICYgMHgwRjsKKyAgaW50IGNoYW4gPSAoc2NiLT5oc2NiLT50YXJnZXRfY2hhbm5lbF9sdW4gPj4gMykgJiAweDAxOworICBpbnQgc2x1biA9IHNjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuICYgMHgwNzsKKyAgaW50IG1hdGNoOworCisgIG1hdGNoID0gKChjaGFuID09IGNoYW5uZWwpIHx8IChjaGFubmVsID09IEFMTF9DSEFOTkVMUykpOworICBpZiAobWF0Y2ggIT0gMCkKKyAgICBtYXRjaCA9ICgodGFyZyA9PSB0YXJnZXQpIHx8ICh0YXJnZXQgPT0gQUxMX1RBUkdFVFMpKTsKKyAgaWYgKG1hdGNoICE9IDApCisgICAgbWF0Y2ggPSAoKGx1biA9PSBzbHVuKSB8fCAobHVuID09IEFMTF9MVU5TKSk7CisgIGlmIChtYXRjaCAhPSAwKQorICAgIG1hdGNoID0gKCh0YWcgPT0gc2NiLT5oc2NiLT50YWcpIHx8ICh0YWcgPT0gU0NCX0xJU1RfTlVMTCkpOworCisgIHJldHVybiAobWF0Y2gpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfYWRkX2N1cnNjYl90b19mcmVlX2xpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWRkcyB0aGUgY3VycmVudCBzY2IgKGluIFNDQlBUUikgdG8gdGhlIGxpc3Qgb2YgZnJlZSBTQ0JzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICAvKgorICAgKiBJbnZhbGlkYXRlIHRoZSB0YWcgc28gdGhhdCBhaWM3eHh4X2ZpbmRfc2NiIGRvZXNuJ3QgdGhpbmsKKyAgICogaXQncyBhY3RpdmUKKyAgICovCisgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFNDQl9UQUcpOworICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisKKyAgYWljX291dGIocCwgYWljX2luYihwLCBGUkVFX1NDQkgpLCBTQ0JfTkVYVCk7CisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NCUFRSKSwgRlJFRV9TQ0JIKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3JlbV9zY2JfZnJvbV9kaXNjX2xpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmVtb3ZlcyB0aGUgY3VycmVudCBTQ0IgZnJvbSB0aGUgZGlzY29ubmVjdGVkIGxpc3QgYW5kIGFkZHMgaXQKKyAqICAgdG8gdGhlIGZyZWUgbGlzdC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FpYzd4eHhfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHNjYnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHByZXYpCit7CisgIHVuc2lnbmVkIGNoYXIgbmV4dDsKKworICBhaWNfb3V0YihwLCBzY2JwdHIsIFNDQlBUUik7CisgIG5leHQgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKworICBpZiAocHJldiAhPSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgYWljX291dGIocCwgcHJldiwgU0NCUFRSKTsKKyAgICBhaWNfb3V0YihwLCBuZXh0LCBTQ0JfTkVYVCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYWljX291dGIocCwgbmV4dCwgRElTQ09OTkVDVEVEX1NDQkgpOworICB9CisKKyAgcmV0dXJuIG5leHQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9idXN5X3RhcmdldAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgdGhlIHNwZWNpZmllZCB0YXJnZXQgYnVzeS4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCithaWM3eHh4X2J1c3lfdGFyZ2V0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICBwLT51bnRhZ2dlZF9zY2JzW3NjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuXSA9IHNjYi0+aHNjYi0+dGFnOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaW5kZXhfYnVzeV90YXJnZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGJ1c3kgdGFyZ2V0LCBhbmQgb3B0aW9uYWxseSBzZXRzIHRoZQorICogICB0YXJnZXQgaW5hY3RpdmUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgorYWljN3h4eF9pbmRleF9idXN5X3RhcmdldChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHRjbCwKKyAgICBpbnQgdW5idXN5KQoreworICB1bnNpZ25lZCBjaGFyIGJ1c3lfc2NiaWQ7CisKKyAgYnVzeV9zY2JpZCA9IHAtPnVudGFnZ2VkX3NjYnNbdGNsXTsKKyAgaWYgKHVuYnVzeSkKKyAgeworICAgIHAtPnVudGFnZ2VkX3NjYnNbdGNsXSA9IFNDQl9MSVNUX05VTEw7CisgIH0KKyAgcmV0dXJuIChidXN5X3NjYmlkKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2ZpbmRfc2NiCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIExvb2sgdGhyb3VnaCB0aGUgU0NCIGFycmF5IG9mIHRoZSBjYXJkIGFuZCBhdHRlbXB0IHRvIGZpbmQgdGhlCisgKiAgIGhhcmR3YXJlIFNDQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYXNzZWQgaW4gU0NCLiAgUmV0dXJuCisgKiAgIFNDQl9MSVNUX05VTEwgaWYgdW5zdWNjZXNzZnVsLiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUKKyAqICAgY2FyZCBpcyBhbHJlYWR5IHBhdXNlZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FpYzd4eHhfZmluZF9zY2Ioc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHVuc2lnbmVkIGNoYXIgc2F2ZWRfc2NicHRyOworICB1bnNpZ25lZCBjaGFyIGN1cmluZGV4OworCisgIHNhdmVkX3NjYnB0ciA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgY3VyaW5kZXggPSAwOworICBmb3IgKGN1cmluZGV4ID0gMDsgY3VyaW5kZXggPCBwLT5zY2JfZGF0YS0+bWF4aHNjYnM7IGN1cmluZGV4KyspCisgIHsKKyAgICBhaWNfb3V0YihwLCBjdXJpbmRleCwgU0NCUFRSKTsKKyAgICBpZiAoYWljX2luYihwLCBTQ0JfVEFHKSA9PSBzY2ItPmhzY2ItPnRhZykKKyAgICB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgYWljX291dGIocCwgc2F2ZWRfc2NicHRyLCBTQ0JQVFIpOworICBpZiAoY3VyaW5kZXggPj0gcC0+c2NiX2RhdGEtPm1heGhzY2JzKQorICB7CisgICAgY3VyaW5kZXggPSBTQ0JfTElTVF9OVUxMOworICB9CisKKyAgcmV0dXJuIChjdXJpbmRleCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9hbGxvY2F0ZV9zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgR2V0IGFuIFNDQiBmcm9tIHRoZSBmcmVlIGxpc3Qgb3IgYnkgYWxsb2NhdGluZyBhIG5ldyBvbmUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfYWxsb2NhdGVfc2NiKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAgICpzY2JwID0gTlVMTDsKKyAgaW50IHNjYl9zaXplID0gKHNpemVvZiAoc3RydWN0IGh3X3NjYXR0ZXJsaXN0KSAqIEFJQzdYWFhfTUFYX1NHKSArIDEyICsgNjsKKyAgaW50IGk7CisgIGludCBzdGVwID0gUEFHRV9TSVpFIC8gMTAyNDsKKyAgdW5zaWduZWQgbG9uZyBzY2JfY291bnQgPSAwOworICBzdHJ1Y3QgaHdfc2NhdHRlcmxpc3QgKmhzZ3A7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiX2FwOworICBzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hICpzY2JfZG1hOworICB1bnNpZ25lZCBjaGFyICpidWZzOworCisgIGlmIChwLT5zY2JfZGF0YS0+bnVtc2NicyA8IHAtPnNjYl9kYXRhLT5tYXhzY2JzKQorICB7CisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIG9wdGltYWwgbnVtYmVyIG9mIFNDQnMgdG8gYWxsb2NhdGUuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGZvcm11bGEgd29ya3MgYmVjYXVzZSB0aGUgc2l6ZW9mKHNnX2FycmF5KSBpcyBhbHdheXMKKyAgICAgKiAxMDI0LiAgVGhlcmVmb3JlLCBzY2Jfc2l6ZSAqIGkgd291bGQgYWx3YXlzIGJlID4gUEFHRV9TSVpFICoKKyAgICAgKiAoaS9zdGVwKS4gIFRoZSAoaS0xKSBhbGxvd3MgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBlcXVhdGlvbgorICAgICAqIHRvIGdyb3cgaW50byB0aGUgcmlnaHQgaGFuZCBzaWRlIHRvIGEgcG9pbnQgb2YgbmVhciBwZXJmZWN0CisgICAgICogZWZmaWNpZW5jeSBzaW5jZSBzY2Jfc2l6ZSAqIChpIC0xKSBpcyBncm93aW5nIHNsaWdodGx5IGZhc3RlcgorICAgICAqIHRoYW4gdGhlIHJpZ2h0IGhhbmQgc2lkZS4gIElmIHRoZSBudW1iZXIgb2YgU0cgYXJyYXkgZWxlbWVudHMKKyAgICAgKiBpcyBjaGFuZ2VkLCB0aGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgbmVhciBzbyBlZmZpY2llbnQgYW55IG1vcmUuCisgICAgICoKKyAgICAgKiBTaW5jZSB0aGUgRE1BJ2FibGUgYnVmZmVycyBhcmUgbm93IGFsbG9jYXRlZCBpbiBhIHNlcGFyYXRlCisgICAgICogY2h1bmsgdGhpcyBhbGdvcml0aG0gaGFzIGJlZW4gbW9kaWZpZWQgdG8gbWF0Y2guICBUaGUgJzEyJworICAgICAqIGFuZCAnNicgZmFjdG9ycyBpbiBzY2Jfc2l6ZSBhcmUgZm9yIHRoZSBETUEnYWJsZSBjb21tYW5kIGJ5dGUKKyAgICAgKiBhbmQgc2Vuc2VidWZmZXJzIHJlc3BlY3RpdmVseS4gIC1EYXZlTQorICAgICAqLworICAgIGZvciAoIGk9c3RlcDs7IGkgKj0gMiApCisgICAgeworICAgICAgaWYgKCAoc2NiX3NpemUgKiAoaS0xKSkgPj0gKCAoUEFHRV9TSVpFICogKGkvc3RlcCkpIC0gNjQgKSApCisgICAgICB7CisgICAgICAgIGkgLz0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHNjYl9jb3VudCA9IG1pbiggKGktMSksIHAtPnNjYl9kYXRhLT5tYXhzY2JzIC0gcC0+c2NiX2RhdGEtPm51bXNjYnMpOworICAgIHNjYl9hcCA9IChzdHJ1Y3QgYWljN3h4eF9zY2IgKilrbWFsbG9jKHNpemVvZiAoc3RydWN0IGFpYzd4eHhfc2NiKSAqIHNjYl9jb3VudAorCQkJCQkgICArIHNpemVvZihzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hKSwgR0ZQX0FUT01JQyk7CisgICAgaWYgKHNjYl9hcCA9PSBOVUxMKQorICAgICAgcmV0dXJuKDApOworICAgIHNjYl9kbWEgPSAoc3RydWN0IGFpYzd4eHhfc2NiX2RtYSAqKSZzY2JfYXBbc2NiX2NvdW50XTsKKyAgICBoc2dwID0gKHN0cnVjdCBod19zY2F0dGVybGlzdCAqKQorICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocC0+cGRldiwgc2NiX3NpemUgKiBzY2JfY291bnQsCisJCQkgICAmc2NiX2RtYS0+ZG1hX2FkZHJlc3MpOworICAgIGlmIChoc2dwID09IE5VTEwpCisgICAgeworICAgICAga2ZyZWUoc2NiX2FwKTsKKyAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgYnVmcyA9ICh1bnNpZ25lZCBjaGFyICopJmhzZ3Bbc2NiX2NvdW50ICogQUlDN1hYWF9NQVhfU0ddOworI2lmZGVmIEFJQzdYWFhfVkVSQk9TRV9ERUJVR0dJTkcKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgIHsKKyAgICAgIGlmIChwLT5zY2JfZGF0YS0+bnVtc2NicyA9PSAwKQorCXByaW50ayhJTkZPX0xFQUQgIkFsbG9jYXRpbmcgaW5pdGlhbCAlbGQgU0NCIHN0cnVjdHVyZXMuXG4iLAorCSAgcC0+aG9zdF9ubywgLTEsIC0xLCAtMSwgc2NiX2NvdW50KTsKKyAgICAgIGVsc2UKKwlwcmludGsoSU5GT19MRUFEICJBbGxvY2F0aW5nICVsZCBhZGRpdGlvbmFsIFNDQiBzdHJ1Y3R1cmVzLlxuIiwKKwkgIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEsIHNjYl9jb3VudCk7CisgICAgfQorI2VuZGlmCisgICAgbWVtc2V0KHNjYl9hcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgYWljN3h4eF9zY2IpICogc2NiX2NvdW50KTsKKyAgICBzY2JfZG1hLT5kbWFfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc2NiX2RtYS0+ZG1hX2FkZHJlc3MKKwkJCSAgLSAodW5zaWduZWQgbG9uZyloc2dwOworICAgIHNjYl9kbWEtPmRtYV9sZW4gPSBzY2Jfc2l6ZSAqIHNjYl9jb3VudDsKKyAgICBmb3IgKGk9MDsgaSA8IHNjYl9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHNjYnAgPSAmc2NiX2FwW2ldOworICAgICAgc2NicC0+aHNjYiA9ICZwLT5zY2JfZGF0YS0+aHNjYnNbcC0+c2NiX2RhdGEtPm51bXNjYnNdOworICAgICAgc2NicC0+c2dfbGlzdCA9ICZoc2dwW2kgKiBBSUM3WFhYX01BWF9TR107CisgICAgICBzY2JwLT5zZW5zZV9jbWQgPSBidWZzOworICAgICAgc2NicC0+Y21uZCA9IGJ1ZnMgKyA2OworICAgICAgYnVmcyArPSAxMiArIDY7CisgICAgICBzY2JwLT5zY2JfZG1hID0gc2NiX2RtYTsKKyAgICAgIG1lbXNldChzY2JwLT5oc2NiLCAwLCBzaXplb2Yoc3RydWN0IGFpYzd4eHhfaHdzY2IpKTsKKyAgICAgIHNjYnAtPmhzY2ItPnRhZyA9IHAtPnNjYl9kYXRhLT5udW1zY2JzOworICAgICAgLyoKKyAgICAgICAqIFBsYWNlIGluIHRoZSBzY2IgYXJyYXk7IG5ldmVyIGlzIHJlbW92ZWQKKyAgICAgICAqLworICAgICAgcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtwLT5zY2JfZGF0YS0+bnVtc2NicysrXSA9IHNjYnA7CisgICAgICBzY2JxX2luc2VydF90YWlsKCZwLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBzY2JwKTsKKyAgICB9CisgICAgc2NicC0+a21hbGxvY19wdHIgPSBzY2JfYXA7CisgIH0KKyAgcmV0dXJuKHNjYl9jb3VudCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9xdWV1ZV9jbWRfY29tcGxldGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRHVlIHRvIHJhY2UgY29uZGl0aW9ucyBwcmVzZW50IGluIHRoZSBTQ1NJIHN1YnN5c3RlbSwgaXQgaXMgZWFzaWVyCisgKiAgIHRvIHF1ZXVlIGNvbXBsZXRlZCBjb21tYW5kcywgdGhlbiBjYWxsIHNjc2lfZG9uZSgpIG9uIHRoZW0gd2hlbgorICogICB3ZSdyZSBmaW5pc2hlZC4gIFRoaXMgZnVuY3Rpb24gcXVldWVzIHRoZSBjb21wbGV0ZWQgY29tbWFuZHMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3F1ZXVlX2NtZF9jb21wbGV0ZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBTY3NpX0NtbmQgKmNtZCkKK3sKKyAgYWljN3h4eF9wb3NpdGlvbihjbWQpID0gU0NCX0xJU1RfTlVMTDsKKyAgY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKilwLT5jb21wbGV0ZXEuaGVhZDsKKyAgcC0+Y29tcGxldGVxLmhlYWQgPSBjbWQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9kb25lX2NtZHNfY29tcGxldGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUHJvY2VzcyB0aGUgY29tcGxldGVkIGNvbW1hbmQgcXVldWUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2RvbmVfY21kc19jb21wbGV0ZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICBTY3NpX0NtbmQgKmNtZDsKKyAgCisgIHdoaWxlIChwLT5jb21wbGV0ZXEuaGVhZCAhPSBOVUxMKQorICB7CisgICAgY21kID0gcC0+Y29tcGxldGVxLmhlYWQ7CisgICAgcC0+Y29tcGxldGVxLmhlYWQgPSAoU2NzaV9DbW5kICopY21kLT5ob3N0X3NjcmliYmxlOworICAgIGNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgY21kLT5zY3NpX2RvbmUoY21kKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZnJlZV9zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRnJlZSB0aGUgc2NiIGFuZCBpbnNlcnQgaW50byB0aGUgZnJlZSBzY2IgbGlzdC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfZnJlZV9zY2Ioc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisKKyAgc2NiLT5mbGFncyA9IFNDQl9GUkVFOworICBzY2ItPmNtZCA9IE5VTEw7CisgIHNjYi0+c2dfY291bnQgPSAwOworICBzY2ItPnNnX2xlbmd0aCA9IDA7CisgIHNjYi0+dGFnX2FjdGlvbiA9IDA7CisgIHNjYi0+aHNjYi0+Y29udHJvbCA9IDA7CisgIHNjYi0+aHNjYi0+dGFyZ2V0X3N0YXR1cyA9IDA7CisgIHNjYi0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuID0gU0NCX0xJU1RfTlVMTDsKKworICBzY2JxX2luc2VydF9oZWFkKCZwLT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBzY2IpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZG9uZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDYWxscyB0aGUgaGlnaGVyIGxldmVsIHNjc2kgZG9uZSBmdW5jdGlvbiBhbmQgZnJlZXMgdGhlIHNjYi4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfZG9uZShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYikKK3sKKyAgU2NzaV9DbW5kICpjbWQgPSBzY2ItPmNtZDsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKyAgaW50IHRpbmRleCA9IFRBUkdFVF9JTkRFWChjbWQpOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYnA7CisgIHVuc2lnbmVkIGNoYXIgcXVldWVfZGVwdGg7CisKKyAgaWYgKGNtZC0+dXNlX3NnID4gMSkKKyAgeworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKyAgICBzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworICAgIHBjaV91bm1hcF9zZyhwLT5wZGV2LCBzZywgY21kLT51c2Vfc2csIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworICB9CisgIGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKQorICAgIHBjaV91bm1hcF9zaW5nbGUocC0+cGRldiwgYWljN3h4eF9tYXBwaW5nKGNtZCksCisJCSAgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisgICAgICAgICAgICAgICAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKyAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpCisgIHsKKyAgICBwY2lfdW5tYXBfc2luZ2xlKHAtPnBkZXYsCisgICAgICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbMF0uYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgfQorICBpZiAoc2NiLT5mbGFncyAmIFNDQl9SRUNPVkVSWV9TQ0IpCisgIHsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0FCT1JUX1BFTkRJTkc7CisgIH0KKyAgaWYgKHNjYi0+ZmxhZ3MgJiAoU0NCX1JFU0VUfFNDQl9BQk9SVCkpCisgIHsKKyAgICBjbWQtPnJlc3VsdCB8PSAoRElEX1JFU0VUIDw8IDE2KTsKKyAgfQorCisgIGlmICgoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfQklUUykgIT0gMCkKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IG1hc2s7CisgICAgaW50IG1lc3NhZ2VfZXJyb3IgPSBGQUxTRTsKKworICAgIG1hc2sgPSAweDAxIDw8IHRpbmRleDsKKyAKKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB3ZSBnZXQgYW4gaW52YWxpZCBtZXNzYWdlIG9yIGEgbWVzc2FnZSBlcnJvcgorICAgICAqIGFmdGVyIGZhaWxpbmcgdG8gbmVnb3RpYXRlIGEgd2lkZSBvciBzeW5jIHRyYW5zZmVyIG1lc3NhZ2UuCisgICAgICovCisgICAgaWYgKChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSAmJiAKKyAgICAgICAgICAoKHNjYi0+Y21kLT5zZW5zZV9idWZmZXJbMTJdID09IDB4NDMpIHx8ICAvKiBJTlZBTElEX01FU1NBR0UgKi8KKyAgICAgICAgICAoc2NiLT5jbWQtPnNlbnNlX2J1ZmZlclsxMl0gPT0gMHg0OSkpKSAvKiBNRVNTQUdFX0VSUk9SICAqLworICAgIHsKKyAgICAgIG1lc3NhZ2VfZXJyb3IgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9XRFRSKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlX2Vycm9yKQorICAgICAgeworICAgICAgICBpZiAoIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikgJiYKKyAgICAgICAgICAgICAoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfUFJJTlRfRFRSKSApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJEZXZpY2UgZmFpbGVkIHRvIGNvbXBsZXRlIFdpZGUgTmVnb3RpYXRpb24gIgorICAgICAgICAgICAgInByb2Nlc3NpbmcgYW5kXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgInJldHVybmVkIGEgc2Vuc2UgZXJyb3IgY29kZSBmb3IgaW52YWxpZCBtZXNzYWdlLCAiCisgICAgICAgICAgICAiZGlzYWJsaW5nIGZ1dHVyZVxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJXaWRlIG5lZ290aWF0aW9uIHRvIHRoaXMgZGV2aWNlLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgIH0KKyAgICAgICAgYWljX2Rldi0+bmVlZHdkdHIgPSBhaWNfZGV2LT5uZWVkd2R0cl9jb3B5ID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1NEVFIpCisgICAgeworICAgICAgaWYgKG1lc3NhZ2VfZXJyb3IpCisgICAgICB7CisgICAgICAgIGlmICggKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKSAmJgorICAgICAgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9QUklOVF9EVFIpICkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBmYWlsZWQgdG8gY29tcGxldGUgU3luYyBOZWdvdGlhdGlvbiAiCisgICAgICAgICAgICAicHJvY2Vzc2luZyBhbmRcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAicmV0dXJuZWQgYSBzZW5zZSBlcnJvciBjb2RlIGZvciBpbnZhbGlkIG1lc3NhZ2UsICIKKyAgICAgICAgICAgICJkaXNhYmxpbmcgZnV0dXJlXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlN5bmMgbmVnb3RpYXRpb24gdG8gdGhpcyBkZXZpY2UuXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICBhaWNfZGV2LT5mbGFncyAmPSB+REVWSUNFX1BSSU5UX0RUUjsKKyAgICAgICAgfQorICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfUFBSKQorICAgIHsKKyAgICAgIGlmKG1lc3NhZ2VfZXJyb3IpCisgICAgICB7CisgICAgICAgIGlmICggKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKSAmJgorICAgICAgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9QUklOVF9EVFIpICkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBmYWlsZWQgdG8gY29tcGxldGUgUGFyYWxsZWwgUHJvdG9jb2wgIgorICAgICAgICAgICAgIlJlcXVlc3QgcHJvY2Vzc2luZyBhbmRcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAicmV0dXJuZWQgYSBzZW5zZSBlcnJvciBjb2RlIGZvciBpbnZhbGlkIG1lc3NhZ2UsICIKKyAgICAgICAgICAgICJkaXNhYmxpbmcgZnV0dXJlXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlBhcmFsbGVsIFByb3RvY29sIFJlcXVlc3QgbmVnb3RpYXRpb24gdG8gdGhpcyAiCisgICAgICAgICAgICAiZGV2aWNlLlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBEaXNhYmxlIFBQUiBuZWdvdGlhdGlvbiBhbmQgcmV2ZXJ0IGJhY2sgdG8gV0RUUiBhbmQgU0RUUiBzZXR1cAorICAgICAgICAgKi8KKyAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDA7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDE7CisgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcXVldWVfZGVwdGggPSBhaWNfZGV2LT50ZW1wX3FfZGVwdGg7CisgIGlmIChxdWV1ZV9kZXB0aCA+PSBhaWNfZGV2LT5hY3RpdmVfY21kcykKKyAgeworICAgIHNjYnAgPSBzY2JxX3JlbW92ZV9oZWFkKCZhaWNfZGV2LT5kZWxheWVkX3NjYnMpOworICAgIGlmIChzY2JwKQorICAgIHsKKyAgICAgIGlmIChxdWV1ZV9kZXB0aCA9PSAxKQorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHaXZlIGV4dHJhIHByZWZlcmVuY2UgdG8gdW50YWdnZWQgZGV2aWNlcywgc3VjaCBhcyBDRC1SIGRldmljZXMKKyAgICAgICAgICogVGhpcyBtYWtlcyBpdCBtb3JlIGxpa2VseSB0aGF0IGEgZHJpdmUgKndvbid0KiBzdHVmZiB1cCB3aGlsZQorICAgICAgICAgKiB3YWl0aW5nIG9uIGRhdGEgYXQgYSBjcml0aWNhbCB0aW1lLCBzdWNoIGFzIENELVIgd3JpdGluZyBhbmQKKyAgICAgICAgICogYXVkaW8gQ0QgcmlwcGluZyBvcGVyYXRpb25zLiAgU2hvdWxkIGFsc28gYmVuZWZpdCB0YXBlIGRyaXZlcy4KKyAgICAgICAgICovCisgICAgICAgIHNjYnFfaW5zZXJ0X2hlYWQoJnAtPndhaXRpbmdfc2Nicywgc2NicCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNjYnFfaW5zZXJ0X3RhaWwoJnAtPndhaXRpbmdfc2Nicywgc2NicCk7CisgICAgICB9CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiTW92aW5nIFNDQiBmcm9tIGRlbGF5ZWQgdG8gd2FpdGluZyBxdWV1ZS5cbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYnApKTsKKyNlbmRpZgorICAgICAgaWYgKHF1ZXVlX2RlcHRoID4gYWljX2Rldi0+YWN0aXZlX2NtZHMpCisgICAgICB7CisgICAgICAgIHNjYnAgPSBzY2JxX3JlbW92ZV9oZWFkKCZhaWNfZGV2LT5kZWxheWVkX3NjYnMpOworICAgICAgICBpZiAoc2NicCkKKyAgICAgICAgICBzY2JxX2luc2VydF90YWlsKCZwLT53YWl0aW5nX3NjYnMsIHNjYnApOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIShzY2ItPnRhZ19hY3Rpb24pKQorICB7CisgICAgYWljN3h4eF9pbmRleF9idXN5X3RhcmdldChwLCBzY2ItPmhzY2ItPnRhcmdldF9jaGFubmVsX2x1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuYnVzeSAqLyBUUlVFKTsKKyAgICBpZiAoY21kLT5kZXZpY2UtPnNpbXBsZV90YWdzKQorICAgIHsKKyAgICAgIGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9IGFpY19kZXYtPm1heF9xX2RlcHRoOworICAgIH0KKyAgfQorICBpZihzY2ItPmZsYWdzICYgU0NCX0RUUl9TQ0IpCisgIHsKKyAgICBhaWNfZGV2LT5kdHJfcGVuZGluZyA9IDA7CisgIH0KKyAgYWljX2Rldi0+YWN0aXZlX2NtZHMtLTsKKyAgcC0+YWN0aXZlc2Nicy0tOworCisgIGlmICgoc2NiLT5zZ19sZW5ndGggPj0gNTEyKSAmJiAoKChjbWQtPnJlc3VsdCA+PiAxNikgJiAweGYpID09IERJRF9PSykpCisgIHsKKyAgICBsb25nICpwdHI7CisgICAgaW50IHgsIGk7CisKKworICAgIGlmIChycV9kYXRhX2RpcihjbWQtPnJlcXVlc3QpID09IFdSSVRFKQorICAgIHsKKyAgICAgIGFpY19kZXYtPndfdG90YWwrKzsKKyAgICAgIHB0ciA9IGFpY19kZXYtPndfYmluczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFpY19kZXYtPnJfdG90YWwrKzsKKyAgICAgIHB0ciA9IGFpY19kZXYtPnJfYmluczsKKyAgICB9CisgICAgaWYoY21kLT5kZXZpY2UtPnNpbXBsZV90YWdzICYmIGNtZC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfSEFSREJBUlJJRVIpCisgICAgeworICAgICAgYWljX2Rldi0+YmFycmllcl90b3RhbCsrOworICAgICAgaWYoc2NiLT50YWdfYWN0aW9uID09IE1TR19PUkRFUkVEX1FfVEFHKQorICAgICAgICBhaWNfZGV2LT5vcmRlcmVkX3RvdGFsKys7CisgICAgfQorICAgIHggPSBzY2ItPnNnX2xlbmd0aDsKKyAgICB4ID4+PSAxMDsKKyAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICB7CisgICAgICB4ID4+PSAyOworICAgICAgaWYoIXgpIHsKKyAgICAgICAgcHRyW2ldKys7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKGkgPT0gNiAmJiB4KQorICAgICAgcHRyWzVdKys7CisgIH0KKyAgYWljN3h4eF9mcmVlX3NjYihwLCBzY2IpOworICBhaWM3eHh4X3F1ZXVlX2NtZF9jb21wbGV0ZShwLCBjbWQpOworCit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDYWxscyB0aGUgYWljN3h4eF9kb25lKCkgZm9yIHRoZSBTY3NpX0NtbmQgb2YgZWFjaCBzY2IgaW4gdGhlCisgKiAgIGFib3J0ZWQgbGlzdCwgYW5kIGFkZHMgZWFjaCBzY2IgdG8gdGhlIGZyZWUgbGlzdC4gIElmIGNvbXBsZXRlCisgKiAgIGlzIFRSVUUsIHdlIGFsc28gcHJvY2VzcyB0aGUgY29tbWFuZHMgY29tcGxldGUgbGlzdC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcnVuX2RvbmVfcXVldWUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgLypjb21wbGV0ZSovIGludCBjb21wbGV0ZSkKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2I7CisgIGludCBpLCBmb3VuZCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgIHsKKyAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldOworICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX1FVRVVFRF9GT1JfRE9ORSkKKyAgICB7CisgICAgICBpZiAoc2NiLT5mbGFncyAmIFNDQl9RVUVVRV9GVUxMKQorICAgICAgeworCXNjYi0+Y21kLT5yZXN1bHQgPSBRVUVVRV9GVUxMIDw8IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJBYm9ydGluZyBzY2IgJWRcbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIHNjYi0+aHNjYi0+dGFnKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgYW55IHJlc2lkdWFsIGluZm9ybWF0aW9uIHNpbmNlIHRoZSBub3JtYWwgYWljN3h4eF9kb25lKCkgcGF0aAorICAgICAgICAgKiBkb2Vzbid0IHRvdWNoIHRoZSByZXNpZHVhbHMuCisgICAgICAgICAqLworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX1NHX3NlZ21lbnRfY291bnQgPSAwOworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMF0gPSAwOworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMV0gPSAwOworICAgICAgICBzY2ItPmhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMl0gPSAwOworICAgICAgfQorICAgICAgZm91bmQrKzsKKyAgICAgIGFpYzd4eHhfZG9uZShwLCBzY2IpOworICAgIH0KKyAgfQorICBpZiAoYWljN3h4eF92ZXJib3NlICYgKFZFUkJPU0VfQUJPUlRfUkVUVVJOIHwgVkVSQk9TRV9SRVNFVF9SRVRVUk4pKQorICB7CisgICAgcHJpbnRrKElORk9fTEVBRCAiJWQgY29tbWFuZHMgZm91bmQgYW5kIHF1ZXVlZCBmb3IgIgorICAgICAgICAiY29tcGxldGlvbi5cbiIsIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEsIGZvdW5kKTsKKyAgfQorICBpZiAoY29tcGxldGUpCisgIHsKKyAgICBhaWM3eHh4X2RvbmVfY21kc19jb21wbGV0ZShwKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfYWJvcnRfd2FpdGluZ19zY2IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgTWFuaXB1bGF0ZSB0aGUgd2FpdGluZyBmb3Igc2VsZWN0aW9uIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqICAgc2NiIHRoYXQgZm9sbG93cyB0aGUgb25lIHRoYXQgd2UgcmVtb3ZlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYWljN3h4eF9hYm9ydF93YWl0aW5nX3NjYihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYiwKKyAgICB1bnNpZ25lZCBjaGFyIHNjYnBvcywgdW5zaWduZWQgY2hhciBwcmV2KQoreworICB1bnNpZ25lZCBjaGFyIGN1cnNjYiwgbmV4dDsKKworICAvKgorICAgKiBTZWxlY3QgdGhlIFNDQiB3ZSB3YW50IHRvIGFib3J0IGFuZCBwdWxsIHRoZSBuZXh0IHBvaW50ZXIgb3V0IG9mIGl0LgorICAgKi8KKyAgY3Vyc2NiID0gYWljX2luYihwLCBTQ0JQVFIpOworICBhaWNfb3V0YihwLCBzY2Jwb3MsIFNDQlBUUik7CisgIG5leHQgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKworICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworCisgIC8qCisgICAqIFVwZGF0ZSB0aGUgd2FpdGluZyBsaXN0CisgICAqLworICBpZiAocHJldiA9PSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgLyoKKyAgICAgKiBGaXJzdCBpbiB0aGUgbGlzdAorICAgICAqLworICAgIGFpY19vdXRiKHAsIG5leHQsIFdBSVRJTkdfU0NCSCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyoKKyAgICAgKiBTZWxlY3QgdGhlIHNjYiB0aGF0IHBvaW50ZWQgdG8gdXMgYW5kIHVwZGF0ZSBpdHMgbmV4dCBwb2ludGVyLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIHByZXYsIFNDQlBUUik7CisgICAgYWljX291dGIocCwgbmV4dCwgU0NCX05FWFQpOworICB9CisgIC8qCisgICAqIFBvaW50IHVzIGJhY2sgYXQgdGhlIG9yaWdpbmFsIHNjYiBwb3NpdGlvbiBhbmQgaW5mb3JtIHRoZSBTQ1NJCisgICAqIHN5c3RlbSB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGFib3J0ZWQuCisgICAqLworICBhaWNfb3V0YihwLCBjdXJzY2IsIFNDQlBUUik7CisgIHJldHVybiAobmV4dCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zZWFyY2hfcWluZmlmbworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZWFyY2ggdGhlIHF1ZXVlLWluIEZJRk8gZm9yIG1hdGNoaW5nIFNDQnMgYW5kIGNvbmRpdGlvbmFsbHkKKyAqICAgcmVxdWV1ZS4gIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGluZyBTQ0JzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NlYXJjaF9xaW5maWZvKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGludCB0YXJnZXQsIGludCBjaGFubmVsLAorICAgIGludCBsdW4sIHVuc2lnbmVkIGNoYXIgdGFnLCBpbnQgZmxhZ3MsIGludCByZXF1ZXVlLAorICAgIHZvbGF0aWxlIHNjYl9xdWV1ZV90eXBlICpxdWV1ZSkKK3sKKyAgaW50ICAgICAgZm91bmQ7CisgIHVuc2lnbmVkIGNoYXIgcWlucG9zLCBxaW50YWlsOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYnA7CisKKyAgZm91bmQgPSAwOworICBxaW5wb3MgPSBhaWNfaW5iKHAsIFFJTlBPUyk7CisgIHFpbnRhaWwgPSBwLT5xaW5maWZvbmV4dDsKKworICBwLT5xaW5maWZvbmV4dCA9IHFpbnBvczsKKworICB3aGlsZSAocWlucG9zICE9IHFpbnRhaWwpCisgIHsKKyAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtwLT5xaW5maWZvW3FpbnBvcysrXV07CisgICAgaWYgKGFpYzd4eHhfbWF0Y2hfc2NiKHAsIHNjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcpKQorICAgIHsKKyAgICAgICAvKgorICAgICAgICAqIFdlIGZvdW5kIGFuIHNjYiB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQuCisgICAgICAgICovCisgICAgICAgaWYgKHJlcXVldWUgJiYgKHF1ZXVlICE9IE5VTEwpKQorICAgICAgIHsKKyAgICAgICAgIGlmIChzY2JwLT5mbGFncyAmIFNDQl9XQUlUSU5HUSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgc2NicV9yZW1vdmUocXVldWUsIHNjYnApOworICAgICAgICAgICBzY2JxX3JlbW92ZSgmcC0+d2FpdGluZ19zY2JzLCBzY2JwKTsKKyAgICAgICAgICAgc2NicV9yZW1vdmUoJkFJQ19ERVYoc2NicC0+Y21kKS0+ZGVsYXllZF9zY2JzLCBzY2JwKTsKKyAgICAgICAgICAgQUlDX0RFVihzY2JwLT5jbWQpLT5hY3RpdmVfY21kcysrOworICAgICAgICAgICBwLT5hY3RpdmVzY2JzKys7CisgICAgICAgICB9CisgICAgICAgICBzY2JxX2luc2VydF90YWlsKHF1ZXVlLCBzY2JwKTsKKyAgICAgICAgIEFJQ19ERVYoc2NicC0+Y21kKS0+YWN0aXZlX2NtZHMtLTsKKyAgICAgICAgIHAtPmFjdGl2ZXNjYnMtLTsKKyAgICAgICAgIHNjYnAtPmZsYWdzIHw9IFNDQl9XQUlUSU5HUTsKKyAgICAgICAgIGlmICggIShzY2JwLT50YWdfYWN0aW9uICYgVEFHX0VOQikgKQorICAgICAgICAgeworICAgICAgICAgICBhaWM3eHh4X2luZGV4X2J1c3lfdGFyZ2V0KHAsIHNjYnAtPmhzY2ItPnRhcmdldF9jaGFubmVsX2x1biwKKyAgICAgICAgICAgICBUUlVFKTsKKyAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAocmVxdWV1ZSkKKyAgICAgICB7CisgICAgICAgICBwLT5xaW5maWZvW3AtPnFpbmZpZm9uZXh0KytdID0gc2NicC0+aHNjYi0+dGFnOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcmVzZXJ2ZSBhbnkgU0NCX1JFQ09WRVJZX1NDQiBmbGFncyBvbiB0aGlzIHNjYiB0aGVuIHNldCB0aGUKKyAgICAgICAgICogZmxhZ3Mgd2Ugd2VyZSBjYWxsZWQgd2l0aCwgcHJlc3VtZWFibHkgc28gYWljN3h4eF9ydW5fZG9uZV9xdWV1ZQorICAgICAgICAgKiBjYW4gZmluZCB0aGlzIHNjYgorICAgICAgICAgKi8KKyAgICAgICAgIHNjYnAtPmZsYWdzID0gZmxhZ3MgfCAoc2NicC0+ZmxhZ3MgJiBTQ0JfUkVDT1ZFUllfU0NCKTsKKyAgICAgICAgIGlmIChhaWM3eHh4X2luZGV4X2J1c3lfdGFyZ2V0KHAsIHNjYnAtPmhzY2ItPnRhcmdldF9jaGFubmVsX2x1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSA9PSBzY2JwLT5oc2NiLT50YWcpCisgICAgICAgICB7CisgICAgICAgICAgIGFpYzd4eHhfaW5kZXhfYnVzeV90YXJnZXQocCwgc2NicC0+aHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuLAorICAgICAgICAgICAgIFRSVUUpOworICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBmb3VuZCsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYnAtPmhzY2ItPnRhZzsKKyAgICB9CisgIH0KKyAgLyoKKyAgICogTm93IHRoYXQgd2UndmUgZG9uZSB0aGUgd29yaywgY2xlYXIgb3V0IGFueSBsZWZ0IG92ZXIgY29tbWFuZHMgaW4gdGhlCisgICAqIHFpbmZpZm8gYW5kIHVwZGF0ZSB0aGUgS0VSTkVMX1FJTlBPUyBkb3duIG9uIHRoZSBjYXJkLgorICAgKgorICAgKiAgTk9URTogVGhpcyByb3V0aW5lIGV4cGVjdCB0aGUgc2VxdWVuY2VyIHRvIGFscmVhZHkgYmUgcGF1c2VkIHdoZW4KKyAgICogICAgICAgIGl0IGlzIHJ1bi4uLi5tYWtlIHN1cmUgaXQncyB0aGF0IHdheSEKKyAgICovCisgIHFpbnBvcyA9IHAtPnFpbmZpZm9uZXh0OworICB3aGlsZShxaW5wb3MgIT0gcWludGFpbCkKKyAgeworICAgIHAtPnFpbmZpZm9bcWlucG9zKytdID0gU0NCX0xJU1RfTlVMTDsKKyAgfQorICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykKKyAgICBhaWNfb3V0YihwLCBwLT5xaW5maWZvbmV4dCwgSE5TQ0JfUU9GRik7CisgIGVsc2UKKyAgICBhaWNfb3V0YihwLCBwLT5xaW5maWZvbmV4dCwgS0VSTkVMX1FJTlBPUyk7CisKKyAgcmV0dXJuIChmb3VuZCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zY2Jfb25fcW91dGZpZm8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSXMgdGhlIHNjYiB0aGF0IHdhcyBwYXNzZWQgdG8gdXMgY3VycmVudGx5IG9uIHRoZSBxb3V0Zmlmbz8KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9zY2Jfb25fcW91dGZpZm8oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIGludCBpPTA7CisKKyAgd2hpbGUocC0+cW91dGZpZm9bKHAtPnFvdXRmaWZvbmV4dCArIGkpICYgMHhmZiBdICE9IFNDQl9MSVNUX05VTEwpCisgIHsKKyAgICBpZihwLT5xb3V0Zmlmb1socC0+cW91dGZpZm9uZXh0ICsgaSkgJiAweGZmIF0gPT0gc2NiLT5oc2NiLT50YWcpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBlbHNlCisgICAgICBpKys7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9yZXNldF9kZXZpY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gdGFyZ2V0L2NoYW5uZWwgaGFzIGJlZW4gcmVzZXQuICBBYm9ydAorICogICBhbGwgYWN0aXZlIGFuZCBxdWV1ZWQgc2NicyBmb3IgdGhhdCB0YXJnZXQvY2hhbm5lbC4gIFRoaXMgZnVuY3Rpb24KKyAqICAgbmVlZCBub3Qgd29ycnkgYWJvdXQgbGlua2VkIG5leHQgcG9pbnRlcnMgYmVjYXVzZSBpZiB3YXMgYSBNU0dfQUJPUlRfVEFHCisgKiAgIHRoZW4gd2UgaGFkIGEgdGFnZ2VkIGNvbW1hbmQgKG5vIGxpbmtlZCBuZXh0KSwgaWYgaXQgd2FzIE1TR19BQk9SVCBvcgorICogICBNU0dfQlVTX0RFVl9SRVNFVCB0aGVuIHRoZSBkZXZpY2Ugd29uJ3Qga25vdyBhYm91dCBhbnkgY29tbWFuZHMgYW55IG1vcmUKKyAqICAgYW5kIG5vIGJ1c3kgY29tbWFuZHMgd2lsbCBleGlzdCwgYW5kIGlmIGl0IHdhcyBhIGJ1cyByZXNldCwgdGhlbiBub3RoaW5nCisgKiAgIGtub3dzIGFib3V0IGFueSBsaW5rZWQgbmV4dCBjb21tYW5kcyBhbnkgbW9yZS4gIEluIGFsbCBjYXNlcywgd2UgZG9uJ3QKKyAqICAgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgbGlua2VkIG5leHQgb3IgYnVzeSBzY2IsIHdlIGp1c3QgbmVlZCB0byBjbGVhcgorICogICB0aGVtLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9yZXNldF9kZXZpY2Uoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50IHRhcmdldCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbHVuLCB1bnNpZ25lZCBjaGFyIHRhZykKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2JwLCAqcHJldl9zY2JwOworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkOworICB1bnNpZ25lZCBjaGFyIGFjdGl2ZV9zY2IsIHRjbCwgc2NiX3RhZzsKKyAgaW50IGkgPSAwLCBpbml0X2xpc3RzID0gRkFMU0U7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXY7CisKKyAgLyoKKyAgICogUmVzdG9yZSB0aGlzIHdoZW4gd2UncmUgZG9uZQorICAgKi8KKyAgYWN0aXZlX3NjYiA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgc2NiX3RhZyA9IGFpY19pbmIocCwgU0NCX1RBRyk7CisKKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIChWRVJCT1NFX1JFU0VUX1BST0NFU1MgfCBWRVJCT1NFX0FCT1JUX1BST0NFU1MpKQorICB7CisgICAgcHJpbnRrKElORk9fTEVBRCAiUmVzZXQgZGV2aWNlLCBoYXJkd2FyZV9zY2IgJWQsXG4iLAorICAgICAgICAgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sIGFjdGl2ZV9zY2IpOworICAgIHByaW50ayhJTkZPX0xFQUQgIkN1cnJlbnQgc2NiICVkLCBTRVFBRERSIDB4JXgsIExBU1RQSEFTRSAiCisgICAgICAgICAgICIweCV4XG4iLAorICAgICAgICAgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sIHNjYl90YWcsCisgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgIGFpY19pbmIocCwgTEFTVFBIQVNFKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU0dfQ0FDSEVQVFIgMHgleCwgU0dfQ09VTlQgJWQsIFNDU0lTSUdJIDB4JXhcbiIsCisgICAgICAgICBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwKKyAgICAgICAgIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID8gIGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpIDogMCwKKyAgICAgICAgIGFpY19pbmIocCwgU0dfQ09VTlQpLCBhaWNfaW5iKHAsIFNDU0lTSUdJKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU1NUQVQwIDB4JXgsIFNTVEFUMSAweCV4LCBTU1RBVDIgMHgleFxuIiwKKyAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuLCBhaWNfaW5iKHAsIFNTVEFUMCksCisgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMSksIGFpY19pbmIocCwgU1NUQVQyKSk7CisgIH0KKworICAvKgorICAgKiBEZWFsIHdpdGggdGhlIGJ1c3kgdGFyZ2V0IGFuZCBsaW5rZWQgbmV4dCBpc3N1ZXMuCisgICAqLworICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGFpY19kZXYsICZwLT5haWNfZGV2cywgbGlzdCkKKyAgeworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9SRVNFVF9QUk9DRVNTIHwgVkVSQk9TRV9BQk9SVF9QUk9DRVNTKSkKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgInByb2Nlc3NpbmcgYWljX2RldiAlcFxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LAorCQkgICAgbHVuLCBhaWNfZGV2KTsKKyAgICBzZCA9IGFpY19kZXYtPlNEcHRyOworCisgICAgaWYoKHRhcmdldCAhPSBBTExfVEFSR0VUUyAmJiB0YXJnZXQgIT0gc2QtPmlkKSB8fAorICAgICAgIChjaGFubmVsICE9IEFMTF9DSEFOTkVMUyAmJiBjaGFubmVsICE9IHNkLT5jaGFubmVsKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiQ2xlYW5pbmcgdXAgc3RhdHVzIGluZm9ybWF0aW9uICIKKyAgICAgICAgICAiYW5kIGRlbGF5ZWRfc2Nicy5cbiIsIHAtPmhvc3Rfbm8sIHNkLT5jaGFubmVsLCBzZC0+aWQsIHNkLT5sdW4pOworICAgIGFpY19kZXYtPmZsYWdzICY9IH5CVVNfREVWSUNFX1JFU0VUX1BFTkRJTkc7CisgICAgaWYgKCB0YWcgPT0gU0NCX0xJU1RfTlVMTCApCisgICAgeworICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAwOworICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weTsKKyAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weTsKKyAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weTsKKyAgICAgIGFpY19kZXYtPmZsYWdzID0gREVWSUNFX1BSSU5UX0RUUjsKKyAgICAgIGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9IGFpY19kZXYtPm1heF9xX2RlcHRoOworICAgIH0KKyAgICB0Y2wgPSAoc2QtPmlkIDw8IDQpIHwgKHNkLT5jaGFubmVsIDw8IDMpIHwgc2QtPmx1bjsKKyAgICBpZiAoIChhaWM3eHh4X2luZGV4X2J1c3lfdGFyZ2V0KHAsIHRjbCwgRkFMU0UpID09IHRhZykgfHwKKyAgICAgICAgICh0YWcgPT0gU0NCX0xJU1RfTlVMTCkgKQorICAgICAgYWljN3h4eF9pbmRleF9idXN5X3RhcmdldChwLCB0Y2wsIC8qIHVuYnVzeSAqLyBUUlVFKTsKKyAgICBwcmV2X3NjYnAgPSBOVUxMOyAKKyAgICBzY2JwID0gYWljX2Rldi0+ZGVsYXllZF9zY2JzLmhlYWQ7CisgICAgd2hpbGUgKHNjYnAgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmV2X3NjYnAgPSBzY2JwOworICAgICAgc2NicCA9IHNjYnAtPnFfbmV4dDsKKyAgICAgIGlmIChhaWM3eHh4X21hdGNoX3NjYihwLCBwcmV2X3NjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcpKQorICAgICAgeworICAgICAgICBzY2JxX3JlbW92ZSgmYWljX2Rldi0+ZGVsYXllZF9zY2JzLCBwcmV2X3NjYnApOworICAgICAgICBpZiAocHJldl9zY2JwLT5mbGFncyAmIFNDQl9XQUlUSU5HUSkKKyAgICAgICAgeworICAgICAgICAgIGFpY19kZXYtPmFjdGl2ZV9jbWRzKys7CisgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICB9CisgICAgICAgIHByZXZfc2NicC0+ZmxhZ3MgJj0gfihTQ0JfQUNUSVZFIHwgU0NCX1dBSVRJTkdRKTsKKyAgICAgICAgcHJldl9zY2JwLT5mbGFncyB8PSBTQ0JfUkVTRVQgfCBTQ0JfUVVFVUVEX0ZPUl9ET05FOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICBwcmludGsoSU5GT19MRUFEICJDbGVhbmluZyBRSU5GSUZPLlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4gKTsKKyAgYWljN3h4eF9zZWFyY2hfcWluZmlmbyhwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnLAorICAgICAgU0NCX1JFU0VUIHwgU0NCX1FVRVVFRF9GT1JfRE9ORSwgLyogcmVxdWV1ZSAqLyBGQUxTRSwgTlVMTCk7CisKKy8qCisgKiAgU2VhcmNoIHRoZSB3YWl0aW5nX3NjYnMgcXVldWUgZm9yIG1hdGNoZXMsIHRoaXMgY2F0Y2hlcyBhbnkgU0NCX1FVRVVFRAorICogIEFCT1JUL1JFU0VUIGNvbW1hbmRzLgorICovCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9BQk9SVF9QUk9DRVNTIHwgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKSkKKyAgICBwcmludGsoSU5GT19MRUFEICJDbGVhbmluZyB3YWl0aW5nX3NjYnMuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLAorICAgICAgdGFyZ2V0LCBsdW4gKTsKKyAgeworICAgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NicCwgKnByZXZfc2NicDsKKworICAgIHByZXZfc2NicCA9IE5VTEw7IAorICAgIHNjYnAgPSBwLT53YWl0aW5nX3NjYnMuaGVhZDsKKyAgICB3aGlsZSAoc2NicCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByZXZfc2NicCA9IHNjYnA7CisgICAgICBzY2JwID0gc2NicC0+cV9uZXh0OworICAgICAgaWYgKGFpYzd4eHhfbWF0Y2hfc2NiKHAsIHByZXZfc2NicCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZykpCisgICAgICB7CisgICAgICAgIHNjYnFfcmVtb3ZlKCZwLT53YWl0aW5nX3NjYnMsIHByZXZfc2NicCk7CisgICAgICAgIGlmIChwcmV2X3NjYnAtPmZsYWdzICYgU0NCX1dBSVRJTkdRKQorICAgICAgICB7CisgICAgICAgICAgQUlDX0RFVihwcmV2X3NjYnAtPmNtZCktPmFjdGl2ZV9jbWRzKys7CisgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICB9CisgICAgICAgIHByZXZfc2NicC0+ZmxhZ3MgJj0gfihTQ0JfQUNUSVZFIHwgU0NCX1dBSVRJTkdRKTsKKyAgICAgICAgcHJldl9zY2JwLT5mbGFncyB8PSBTQ0JfUkVTRVQgfCBTQ0JfUVVFVUVEX0ZPUl9ET05FOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyoKKyAgICogU2VhcmNoIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiBsaXN0LgorICAgKi8KKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIChWRVJCT1NFX0FCT1JUX1BST0NFU1MgfCBWRVJCT1NFX1JFU0VUX1BST0NFU1MpKQorICAgIHByaW50ayhJTkZPX0xFQUQgIkNsZWFuaW5nIHdhaXRpbmcgZm9yIHNlbGVjdGlvbiAiCisgICAgICAibGlzdC5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldiwgc2NiX2luZGV4OworCisgICAgbmV4dCA9IGFpY19pbmIocCwgV0FJVElOR19TQ0JIKTsgIC8qIFN0YXJ0IGF0IGhlYWQgb2YgbGlzdC4gKi8KKyAgICBwcmV2ID0gU0NCX0xJU1RfTlVMTDsKKyAgICB3aGlsZSAobmV4dCAhPSBTQ0JfTElTVF9OVUxMKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIG5leHQsIFNDQlBUUik7CisgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgaWYgKHNjYl9pbmRleCA+PSBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICAgIHsKKyAgICAgICAvKgorICAgICAgICAqIE5vIGFpYzd4eHhfdmVyYm9zZSBjaGVjayBoZXJlLi4uLi53ZSB3YW50IHRvIHNlZSB0aGlzIHNpbmNlIGl0CisgICAgICAgICogbWVhbnMgZWl0aGVyIHRoZSBrZXJuZWwgZHJpdmVyIG9yIHRoZSBzZXF1ZW5jZXIgc2NyZXdlZCB0aGluZ3MgdXAKKyAgICAgICAgKi8KKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiV2FpdGluZyBMaXN0IGluY29uc2lzdGVuY3k7IFNDQiBpbmRleD0lZCwgIgorICAgICAgICAgICJudW1zY2JzPSVkXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwgc2NiX2luZGV4LAorICAgICAgICAgIHAtPnNjYl9kYXRhLT5udW1zY2JzKTsKKyAgICAgICAgbmV4dCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JfaW5kZXhdOworICAgICAgICBpZiAoYWljN3h4eF9tYXRjaF9zY2IocCwgc2NicCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZykpCisgICAgICAgIHsKKyAgICAgICAgICBuZXh0ID0gYWljN3h4eF9hYm9ydF93YWl0aW5nX3NjYihwLCBzY2JwLCBuZXh0LCBwcmV2KTsKKyAgICAgICAgICBpZiAoc2NicC0+ZmxhZ3MgJiBTQ0JfV0FJVElOR1EpCisgICAgICAgICAgeworICAgICAgICAgICAgQUlDX0RFVihzY2JwLT5jbWQpLT5hY3RpdmVfY21kcysrOworICAgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICAgIH0KKyAgICAgICAgICBzY2JwLT5mbGFncyAmPSB+KFNDQl9BQ1RJVkUgfCBTQ0JfV0FJVElOR1EpOworICAgICAgICAgIHNjYnAtPmZsYWdzIHw9IFNDQl9SRVNFVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgICAgICAgaWYgKHByZXYgPT0gU0NCX0xJU1RfTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBpcyBlaXRoZXIgdGhlIGZpcnN0IHNjYiBvbiB0aGUgd2FpdGluZyBsaXN0LCBvciB3ZQorICAgICAgICAgICAgICogaGF2ZSBhbHJlYWR5IHlhbmtlZCB0aGUgZmlyc3QgYW5kIGhhdmVuJ3QgbGVmdCBhbnkgYmVoaW5kLgorICAgICAgICAgICAgICogRWl0aGVyIHdheSwgd2UgbmVlZCB0byB0dXJuIG9mZiB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlIGlmCisgICAgICAgICAgICAgKiBpdCBpc24ndCBhbHJlYWR5IG9mZi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIH5FTlNFTE8sIFNDU0lTRVEpOworICAgICAgICAgICAgYWljX291dGIocCwgQ0xSU0VMVElNRU8sIENMUlNJTlQxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgICAgbmV4dCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogR28gdGhyb3VnaCBkaXNjb25uZWN0ZWQgbGlzdCBhbmQgcmVtb3ZlIGFueSBlbnRyaWVzIHdlIGhhdmUgcXVldWVkCisgICAqIGZvciBjb21wbGV0aW9uLCB6ZXJvaW5nIHRoZWlyIGNvbnRyb2wgYnl0ZSB0b28uCisgICAqLworICBpZiAoYWljN3h4eF92ZXJib3NlICYgKFZFUkJPU0VfQUJPUlRfUFJPQ0VTUyB8IFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykpCisgICAgcHJpbnRrKElORk9fTEVBRCAiQ2xlYW5pbmcgZGlzY29ubmVjdGVkIHNjYnMgIgorICAgICAgImxpc3QuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1bik7CisgIGlmIChwLT5mbGFncyAmIEFIQ19QQUdFU0NCUykKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgbmV4dCwgcHJldiwgc2NiX2luZGV4OworCisgICAgbmV4dCA9IGFpY19pbmIocCwgRElTQ09OTkVDVEVEX1NDQkgpOworICAgIHByZXYgPSBTQ0JfTElTVF9OVUxMOworICAgIHdoaWxlIChuZXh0ICE9IFNDQl9MSVNUX05VTEwpCisgICAgeworICAgICAgYWljX291dGIocCwgbmV4dCwgU0NCUFRSKTsKKyAgICAgIHNjYl9pbmRleCA9IGFpY19pbmIocCwgU0NCX1RBRyk7CisgICAgICBpZiAoc2NiX2luZGV4ID4gcC0+c2NiX2RhdGEtPm51bXNjYnMpCisgICAgICB7CisgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIkRpc2Nvbm5lY3RlZCBMaXN0IGluY29uc2lzdGVuY3k7IFNDQiBpbmRleD0lZCwgIgorICAgICAgICAgICJudW1zY2JzPSVkXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwgc2NiX2luZGV4LAorICAgICAgICAgIHAtPnNjYl9kYXRhLT5udW1zY2JzKTsKKyAgICAgICAgbmV4dCA9IGFpYzd4eHhfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChwLCBuZXh0LCBwcmV2KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2NicCA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKyAgICAgICAgaWYgKGFpYzd4eHhfbWF0Y2hfc2NiKHAsIHNjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCB0YWcpKQorICAgICAgICB7CisgICAgICAgICAgbmV4dCA9IGFpYzd4eHhfcmVtX3NjYl9mcm9tX2Rpc2NfbGlzdChwLCBuZXh0LCBwcmV2KTsKKyAgICAgICAgICBpZiAoc2NicC0+ZmxhZ3MgJiBTQ0JfV0FJVElOR1EpCisgICAgICAgICAgeworICAgICAgICAgICAgQUlDX0RFVihzY2JwLT5jbWQpLT5hY3RpdmVfY21kcysrOworICAgICAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICAgIH0KKyAgICAgICAgICBzY2JwLT5mbGFncyAmPSB+KFNDQl9BQ1RJVkUgfCBTQ0JfV0FJVElOR1EpOworICAgICAgICAgIHNjYnAtPmZsYWdzIHw9IFNDQl9SRVNFVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgICAgICAgc2NicC0+aHNjYi0+Y29udHJvbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgICAgbmV4dCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogV2FsayB0aGUgZnJlZSBsaXN0IG1ha2luZyBzdXJlIG5vIGVudHJpZXMgb24gdGhlIGZyZWUgbGlzdCBoYXZlCisgICAqIGEgdmFsaWQgU0NCX1RBRyB2YWx1ZSBvciBTQ0JfQ09OVFJPTCBieXRlLgorICAgKi8KKyAgaWYgKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKQorICB7CisgICAgdW5zaWduZWQgY2hhciBuZXh0OworCisgICAgbmV4dCA9IGFpY19pbmIocCwgRlJFRV9TQ0JIKTsKKyAgICB3aGlsZSAobmV4dCAhPSBTQ0JfTElTVF9OVUxMKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIG5leHQsIFNDQlBUUik7CisgICAgICBpZiAoYWljX2luYihwLCBTQ0JfVEFHKSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICJGcmVlIGxpc3QgaW5jb25zaXN0ZW5jeSEuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLAorICAgICAgICAgIHRhcmdldCwgbHVuKTsKKyAgICAgICAgaW5pdF9saXN0cyA9IFRSVUU7CisgICAgICAgIG5leHQgPSBTQ0JfTElTVF9OVUxMOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfVEFHKTsKKyAgICAgICAgYWljX291dGIocCwgMCwgU0NCX0NPTlRST0wpOworICAgICAgICBuZXh0ID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogR28gdGhyb3VnaCB0aGUgaGFyZHdhcmUgU0NCIGFycmF5IGxvb2tpbmcgZm9yIGNvbW1hbmRzIHRoYXQKKyAgICogd2VyZSBhY3RpdmUgYnV0IG5vdCBvbiBhbnkgbGlzdC4KKyAgICovCisgIGlmIChpbml0X2xpc3RzKQorICB7CisgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgRlJFRV9TQ0JIKTsKKyAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBXQUlUSU5HX1NDQkgpOworICAgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKKyAgfQorICBmb3IgKGkgPSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMgLSAxOyBpID49IDA7IGktLSkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2NiaWQ7CisKKyAgICBhaWNfb3V0YihwLCBpLCBTQ0JQVFIpOworICAgIGlmIChpbml0X2xpc3RzKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFNDQl9UQUcpOworICAgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX05FWFQpOworICAgICAgYWljX291dGIocCwgMCwgU0NCX0NPTlRST0wpOworICAgICAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNjYmlkID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKyAgICAgIGlmIChzY2JpZCA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgeworICAgICAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JpZF07CisgICAgICAgIGlmIChhaWM3eHh4X21hdGNoX3NjYihwLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgdGFnKSkKKyAgICAgICAgeworICAgICAgICAgIGFpY19vdXRiKHAsIDAsIFNDQl9DT05UUk9MKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfVEFHKTsKKyAgICAgICAgICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogR28gdGhyb3VnaCB0aGUgZW50aXJlIFNDQiBhcnJheSBub3cgYW5kIGxvb2sgZm9yIGNvbW1hbmRzIGZvcgorICAgKiBmb3IgdGhpcyB0YXJnZXQgdGhhdCBhcmUgc3RpbGxhY3RpdmUuICBUaGVzZSBhcmUgb3RoZXIgKG1vc3QgbGlrZWx5CisgICAqIHRhZ2dlZCkgY29tbWFuZHMgdGhhdCB3ZXJlIGRpc2Nvbm5lY3RlZCB3aGVuIHRoZSByZXNldCBvY2N1cnJlZC4KKyAgICogQW55IGNvbW1hbmRzIHdlIGZpbmQgaGVyZSB3ZSBrbm93IHRoaXMgYWJvdXQsIGl0IHdhc24ndCBvbiBhbnkgcXVldWUsCisgICAqIGl0IHdhc24ndCBpbiB0aGUgcWluZmlmbywgaXQgd2Fzbid0IGluIHRoZSBkaXNjb25uZWN0ZWQgb3Igd2FpdGluZworICAgKiBsaXN0cywgc28gaXQgcmVhbGx5IG11c3QgaGF2ZSBiZWVuIGEgcGFnZWQgb3V0IFNDQi4gIEluIHRoYXQgY2FzZSwKKyAgICogd2Ugc2hvdWxkbid0IG5lZWQgdG8gYm90aGVyIHdpdGggdXBkYXRpbmcgYW55IGNvdW50ZXJzLCBqdXN0IG1hcmsKKyAgICogdGhlIGNvcnJlY3QgZmxhZ3MgYW5kIGdvIG9uLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgIHsKKyAgICBzY2JwID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtpXTsKKyAgICBpZiAoKHNjYnAtPmZsYWdzICYgU0NCX0FDVElWRSkgJiYKKyAgICAgICAgYWljN3h4eF9tYXRjaF9zY2IocCwgc2NicCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIHRhZykgJiYKKyAgICAgICAgIWFpYzd4eHhfc2NiX29uX3FvdXRmaWZvKHAsIHNjYnApKQorICAgIHsKKyAgICAgIGlmIChzY2JwLT5mbGFncyAmIFNDQl9XQUlUSU5HUSkKKyAgICAgIHsKKyAgICAgICAgc2NicV9yZW1vdmUoJnAtPndhaXRpbmdfc2Nicywgc2NicCk7CisgICAgICAgIHNjYnFfcmVtb3ZlKCZBSUNfREVWKHNjYnAtPmNtZCktPmRlbGF5ZWRfc2Nicywgc2NicCk7CisgICAgICAgIEFJQ19ERVYoc2NicC0+Y21kKS0+YWN0aXZlX2NtZHMrKzsKKyAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgfQorICAgICAgc2NicC0+ZmxhZ3MgfD0gU0NCX1JFU0VUIHwgU0NCX1FVRVVFRF9GT1JfRE9ORTsKKyAgICAgIHNjYnAtPmZsYWdzICY9IH4oU0NCX0FDVElWRSB8IFNDQl9XQUlUSU5HUSk7CisgICAgfQorICB9CisKKyAgYWljX291dGIocCwgYWN0aXZlX3NjYiwgU0NCUFRSKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY2xlYXJfaW50c3RhdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDbGVhcnMgdGhlIGludGVycnVwdCBzdGF0dXMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2NsZWFyX2ludHN0YXQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgLyogQ2xlYXIgYW55IGludGVycnVwdCBjb25kaXRpb25zIHRoaXMgbWF5IGhhdmUgY2F1c2VkLiAqLworICBhaWNfb3V0YihwLCBDTFJTRUxETyB8IENMUlNFTERJIHwgQ0xSU0VMSU5HTywgQ0xSU0lOVDApOworICBhaWNfb3V0YihwLCBDTFJTRUxUSU1FTyB8IENMUkFUTk8gfCBDTFJTQ1NJUlNUSSB8IENMUkJVU0ZSRUUgfCBDTFJTQ1NJUEVSUiB8CisgICAgICAgQ0xSUEhBU0VDSEcgfCBDTFJSRVFJTklULCBDTFJTSU5UMSk7CisgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQgfCBDTFJTRVFJTlQgfCBDTFJCUktBRFJJTlQgfCBDTFJQQVJFUlIsIENMUklOVCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9yZXNldF9jdXJyZW50X2J1cworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZXNldCB0aGUgY3VycmVudCBTQ1NJIGJ1cy4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcmVzZXRfY3VycmVudF9idXMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKworICAvKiBEaXNhYmxlIHJlc2V0IGludGVycnVwdHMuICovCisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+RU5TQ1NJUlNULCBTSU1PREUxKTsKKworICAvKiBUdXJuIG9mZiB0aGUgYnVzJyBjdXJyZW50IG9wZXJhdGlvbnMsIGFmdGVyIGFsbCwgd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAqIHZhbGlkIGNvbW1hbmRzIGxlZnQgdG8gY2F1c2UgYSBSU0VMSSBhbmQgU0VMTyBvbmNlIHdlJ3ZlIHRvc3NlZCB0aGUKKyAgICogYnVzIGF3YXkgd2l0aCB0aGlzIHJlc2V0LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHNodXQgZG93biB0aGUgc2VxdWVuY2VyCisgICAqIHVudGlsIHRoZSBidXMgaXMgcmVzdGFydGVkIGFzIG9wcG9zc2VkIHRvIHNhdmluZyB0aGUgY3VycmVudCBzZXR0aW5ncworICAgKiBhbmQgcmVzdG9yaW5nIHRoZW0gKHdoaWNoIG1ha2VzIG5vIHNlbnNlIHRvIG1lKS4gKi8KKworICAvKiBUdXJuIG9uIHRoZSBidXMgcmVzZXQuICovCisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNFUSkgfCBTQ1NJUlNUTywgU0NTSVNFUSk7CisgIHdoaWxlICggKGFpY19pbmIocCwgU0NTSVNFUSkgJiBTQ1NJUlNUTykgPT0gMCkKKyAgICBtZGVsYXkoNSk7CisKKyAgLyoKKyAgICogU29tZSBvZiB0aGUgbmV3IFVsdHJhMiBjaGlwc2V0cyBuZWVkIGEgbG9uZ2VyIGRlbGF5IGFmdGVyIGEgY2hpcAorICAgKiByZXNldCB0aGFuIGp1c3QgdGhlIGluaXQgc2V0dXAgY3JlYXRlcywgc28gd2UgaGF2ZSB0byBkZWxheSBoZXJlCisgICAqIGJlZm9yZSB3ZSBnbyBpbnRvIGEgcmVzZXQgaW4gb3JkZXIgdG8gbWFrZSB0aGUgY2hpcHMgaGFwcHkuCisgICAqLworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIG1kZWxheSgyNTApOworICBlbHNlCisgICAgbWRlbGF5KDUwKTsKKworICAvKiBUdXJuIG9mZiB0aGUgYnVzIHJlc2V0LiAqLworICBhaWNfb3V0YihwLCAwLCBTQ1NJU0VRKTsKKyAgbWRlbGF5KDEwKTsKKworICBhaWM3eHh4X2NsZWFyX2ludHN0YXQocCk7CisgIC8qIFJlLWVuYWJsZSByZXNldCBpbnRlcnJ1cHRzLiAqLworICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNJTU9ERTEpIHwgRU5TQ1NJUlNULCBTSU1PREUxKTsKKworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZXNldCB0aGUgY2hhbm5lbC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcmVzZXRfY2hhbm5lbChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgY2hhbm5lbCwgaW50IGluaXRpYXRlX3Jlc2V0KQoreworICB1bnNpZ25lZCBsb25nIG9mZnNldF9taW4sIG9mZnNldF9tYXg7CisgIHVuc2lnbmVkIGNoYXIgc2Jsa2N0bDsKKyAgaW50IGN1cl9jaGFubmVsOworCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUX1BST0NFU1MpCisgICAgcHJpbnRrKElORk9fTEVBRCAiUmVzZXQgY2hhbm5lbCBjYWxsZWQsICVzIGluaXRpYXRlIHJlc2V0LlxuIiwKKyAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIC0xLCAtMSwgKGluaXRpYXRlX3Jlc2V0PT1UUlVFKSA/ICJ3aWxsIiA6ICJ3b24ndCIgKTsKKworCisgIGlmIChjaGFubmVsID09IDEpCisgIHsKKyAgICBvZmZzZXRfbWluID0gODsKKyAgICBvZmZzZXRfbWF4ID0gMTY7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgICAgeworICAgICAgLyogQ2hhbm5lbCBBICovCisgICAgICBvZmZzZXRfbWluID0gMDsKKyAgICAgIG9mZnNldF9tYXggPSA4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb2Zmc2V0X21pbiA9IDA7CisgICAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkKKyAgICAgIHsKKyAgICAgICAgb2Zmc2V0X21heCA9IDE2OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBvZmZzZXRfbWF4ID0gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB3aGlsZSAob2Zmc2V0X21pbiA8IG9mZnNldF9tYXgpCisgIHsKKyAgICAvKgorICAgICAqIFJldmVydCB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIHVudGlsIHdlIHJlbmVnb3RpYXRlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIDAsIFRBUkdfU0NTSVJBVEUgKyBvZmZzZXRfbWluKTsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIGFpY19vdXRiKHAsIDAsIFRBUkdfT0ZGU0VUICsgb2Zmc2V0X21pbik7CisgICAgfQorICAgIG9mZnNldF9taW4rKzsKKyAgfQorCisgIC8qCisgICAqIFJlc2V0IHRoZSBidXMgYW5kIHVucGF1c2UvcmVzdGFydCB0aGUgY29udHJvbGxlcgorICAgKi8KKyAgc2Jsa2N0bCA9IGFpY19pbmIocCwgU0JMS0NUTCk7CisgIGlmICggKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3NzcwICkKKyAgICBjdXJfY2hhbm5lbCA9IChzYmxrY3RsICYgU0VMQlVTQikgPj4gMzsKKyAgZWxzZQorICAgIGN1cl9jaGFubmVsID0gMDsKKyAgaWYgKCAoY3VyX2NoYW5uZWwgIT0gY2hhbm5lbCkgJiYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pICkKKyAgeworICAgIC8qCisgICAgICogQ2FzZSAxOiBDb21tYW5kIGZvciBhbm90aGVyIGJ1cyBpcyBhY3RpdmUKKyAgICAgKi8KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiU3RlYWx0aGlseSByZXNldHRpbmcgaWRsZSBjaGFubmVsLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgY2hhbm5lbCwgLTEsIC0xKTsKKyAgICAvKgorICAgICAqIFN0ZWFsdGhpbHkgcmVzZXQgdGhlIG90aGVyIGJ1cyB3aXRob3V0IHVwc2V0dGluZyB0aGUgY3VycmVudCBidXMuCisgICAgICovCisgICAgYWljX291dGIocCwgc2Jsa2N0bCBeIFNFTEJVU0IsIFNCTEtDVEwpOworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+RU5CVVNGUkVFLCBTSU1PREUxKTsKKyAgICBpZiAoaW5pdGlhdGVfcmVzZXQpCisgICAgeworICAgICAgYWljN3h4eF9yZXNldF9jdXJyZW50X2J1cyhwKTsKKyAgICB9CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSwgU0NTSVNFUSk7CisgICAgYWljN3h4eF9jbGVhcl9pbnRzdGF0KHApOworICAgIGFpY19vdXRiKHAsIHNibGtjdGwsIFNCTEtDVEwpOworICB9CisgIGVsc2UKKyAgeworICAgIC8qCisgICAgICogQ2FzZSAyOiBBIGNvbW1hbmQgZnJvbSB0aGlzIGJ1cyBpcyBhY3RpdmUgb3Igd2UncmUgaWRsZS4KKyAgICAgKi8KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiUmVzZXR0aW5nIGN1cnJlbnRseSBhY3RpdmUgY2hhbm5lbC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgIGNoYW5uZWwsIC0xLCAtMSk7CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH4oRU5CVVNGUkVFfEVOUkVRSU5JVCksCisgICAgICBTSU1PREUxKTsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgIHAtPm1zZ190eXBlID0gTVNHX1RZUEVfTk9ORTsKKyAgICBwLT5tc2dfbGVuID0gMDsKKyAgICBpZiAoaW5pdGlhdGVfcmVzZXQpCisgICAgeworICAgICAgYWljN3h4eF9yZXNldF9jdXJyZW50X2J1cyhwKTsKKyAgICB9CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSwgU0NTSVNFUSk7CisgICAgYWljN3h4eF9jbGVhcl9pbnRzdGF0KHApOworICB9CisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUX1JFVFVSTikKKyAgICBwcmludGsoSU5GT19MRUFEICJDaGFubmVsIHJlc2V0XG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCAtMSwgLTEpOworICAvKgorICAgKiBDbGVhbiB1cCBhbGwgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbnMKKyAgICogb24gdGhpcyBidXMuCisgICAqLworICBhaWM3eHh4X3Jlc2V0X2RldmljZShwLCBBTExfVEFSR0VUUywgY2hhbm5lbCwgQUxMX0xVTlMsIFNDQl9MSVNUX05VTEwpOworCisgIGlmICggIShwLT5mZWF0dXJlcyAmIEFIQ19UV0lOKSApCisgIHsKKyAgICByZXN0YXJ0X3NlcXVlbmNlcihwKTsKKyAgfQorCisgIHJldHVybjsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3J1bl93YWl0aW5nX3F1ZXVlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTY2FuIHRoZSBhd2FpdGluZ19zY2JzIHF1ZXVlIGRvd25sb2FkaW5nIGFuZCBzdGFydGluZyBhcyBtYW55CisgKiAgIHNjYnMgYXMgd2UgY2FuLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9ydW5fd2FpdGluZ19xdWV1ZXMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2I7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXY7CisgIGludCBzZW50OworCisKKyAgaWYgKHAtPndhaXRpbmdfc2Nicy5oZWFkID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHNlbnQgPSAwOworCisgIC8qCisgICAqIEZpcnN0IGhhbmRsZSBTQ0JzIHRoYXQgYXJlIHdhaXRpbmcgYnV0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHNsb3QuCisgICAqLworICB3aGlsZSAoKHNjYiA9IHNjYnFfcmVtb3ZlX2hlYWQoJnAtPndhaXRpbmdfc2NicykpICE9IE5VTEwpCisgIHsKKyAgICBhaWNfZGV2ID0gc2NiLT5jbWQtPmRldmljZS0+aG9zdGRhdGE7CisgICAgaWYgKCAhc2NiLT50YWdfYWN0aW9uICkKKyAgICB7CisgICAgICBhaWNfZGV2LT50ZW1wX3FfZGVwdGggPSAxOworICAgIH0KKyAgICBpZiAoIGFpY19kZXYtPmFjdGl2ZV9jbWRzID49IGFpY19kZXYtPnRlbXBfcV9kZXB0aCkKKyAgICB7CisgICAgICBzY2JxX2luc2VydF90YWlsKCZhaWNfZGV2LT5kZWxheWVkX3NjYnMsIHNjYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9XQUlUSU5HUTsKKyAgICAgICAgYWljX2Rldi0+YWN0aXZlX2NtZHMrKzsKKyAgICAgICAgcC0+YWN0aXZlc2NicysrOworICAgICAgICBpZiAoICEoc2NiLT50YWdfYWN0aW9uKSApCisgICAgICAgIHsKKyAgICAgICAgICBhaWM3eHh4X2J1c3lfdGFyZ2V0KHAsIHNjYik7CisgICAgICAgIH0KKyAgICAgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworICAgICAgICBzZW50Kys7CisgICAgfQorICB9CisgIGlmIChzZW50KQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpCisgICAgICBhaWNfb3V0YihwLCBwLT5xaW5maWZvbmV4dCwgSE5TQ0JfUU9GRik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgICAgIGFpY19vdXRiKHAsIHAtPnFpbmZpZm9uZXh0LCBLRVJORUxfUUlOUE9TKTsKKyAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICB9CisgICAgaWYgKHAtPmFjdGl2ZXNjYnMgPiBwLT5tYXhfYWN0aXZlc2NicykKKyAgICAgIHAtPm1heF9hY3RpdmVzY2JzID0gcC0+YWN0aXZlc2NiczsKKyAgfQorfQorCisjaWZkZWYgQ09ORklHX1BDSQorCisjZGVmaW5lICBEUEUgMHg4MAorI2RlZmluZSAgU1NFIDB4NDAKKyNkZWZpbmUgIFJNQSAweDIwCisjZGVmaW5lICBSVEEgMHgxMAorI2RlZmluZSAgU1RBIDB4MDgKKyNkZWZpbmUgIERQUiAweDAxCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wY2lfaW50cgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDaGVjayB0aGUgc2NzaSBjYXJkIGZvciBQQ0kgZXJyb3JzIGFuZCBjbGVhciB0aGUgaW50ZXJydXB0CisgKgorICogICBOT1RFOiBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGZ1bmN0aW9uIGFuZCBhIDI5NDAgY2FyZCBlbmNvdW50ZXJzCisgKiAgICAgICAgIGEgUENJIGVycm9yIGNvbmRpdGlvbiwgdGhlIG1hY2hpbmUgd2lsbCBlbmQgdXAgbG9ja2VkIGFzIHRoZQorICogICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlciBnZXRzIHNsYW1tZWQgd2l0aCBub24tc3RvcCBQQ0kgZXJyb3IgaW50ZXJydXB0cworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9wY2lfaW50cihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICB1bnNpZ25lZCBjaGFyIHN0YXR1czE7CisKKyAgcGNpX3JlYWRfY29uZmlnX2J5dGUocC0+cGRldiwgUENJX1NUQVRVUyArIDEsICZzdGF0dXMxKTsKKworICBpZiAoIChzdGF0dXMxICYgRFBFKSAmJiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikgKQorICAgIHByaW50ayhXQVJOX0xFQUQgIkRhdGEgUGFyaXR5IEVycm9yIGR1cmluZyBQQ0kgYWRkcmVzcyBvciBQQ0kgd3JpdGUiCisgICAgICAicGhhc2UuXG4iLCBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgaWYgKCAoc3RhdHVzMSAmIFNTRSkgJiYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTUlOT1JfRVJST1IpICkKKyAgICBwcmludGsoV0FSTl9MRUFEICJTaWduYWwgU3lzdGVtIEVycm9yIERldGVjdGVkXG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBSTUEpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiUmVjZWl2ZWQgYSBQQ0kgTWFzdGVyIEFib3J0XG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBSVEEpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiUmVjZWl2ZWQgYSBQQ0kgVGFyZ2V0IEFib3J0XG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBTVEEpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiU2lnbmFsZWQgYSBQQ0kgVGFyZ2V0IEFib3J0XG4iLCBwLT5ob3N0X25vLAorICAgICAgLTEsIC0xLCAtMSk7CisgIGlmICggKHN0YXR1czEgJiBEUFIpICYmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX01JTk9SX0VSUk9SKSApCisgICAgcHJpbnRrKFdBUk5fTEVBRCAiRGF0YSBQYXJpdHkgRXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdmlhIFBDSSBwaW4gIgorICAgICAgIlBFUlIjXG4iLCBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgCisgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwLT5wZGV2LCBQQ0lfU1RBVFVTICsgMSwgc3RhdHVzMSk7CisgIGlmIChzdGF0dXMxICYgKERQUnxSTUF8UlRBKSkKKyAgICBhaWNfb3V0YihwLCAgQ0xSUEFSRVJSLCBDTFJJTlQpOworCisgIGlmICggKGFpYzd4eHhfcGFuaWNfb25fYWJvcnQpICYmIChwLT5zcHVyaW91c19pbnQgPiA1MDApICkKKyAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIE5VTEwpOworCit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY29uc3RydWN0X3BwcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBCdWlsZCB1cCBhIFBhcmFsbGVsIFByb3RvY29sIFJlcXVlc3QgbWVzc2FnZSBmb3IgdXNlIHdpdGggU0NTSS0zCisgKiAgIGRldmljZXMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2NvbnN0cnVjdF9wcHIoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVEVOREVEOworICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19FWFRfUFBSX0xFTjsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfRVhUX1BQUjsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBBSUNfREVWKHNjYi0+Y21kKS0+Z29hbC5wZXJpb2Q7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gMDsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBBSUNfREVWKHNjYi0+Y21kKS0+Z29hbC5vZmZzZXQ7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gQUlDX0RFVihzY2ItPmNtZCktPmdvYWwud2lkdGg7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gQUlDX0RFVihzY2ItPmNtZCktPmdvYWwub3B0aW9uczsKKyAgcC0+bXNnX2xlbiArPSA4OworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY29uc3RydWN0X3NkdHIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ29uc3R1Y3RzIGEgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBtZXNzYWdlIGluIHRoZSBtZXNzYWdlCisgKiAgIGJ1ZmZlciBvbiB0aGUgc2VxdWVuY2VyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9jb25zdHJ1Y3Rfc2R0cihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHBlcmlvZCwKKyAgICAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQpCit7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVEVOREVEOworICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19FWFRfU0RUUl9MRU47CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVF9TRFRSOworICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IHBlcmlvZDsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBvZmZzZXQ7CisgIHAtPm1zZ19sZW4gKz0gNTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2NvbnN0cnVjdF93ZHRyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIENvbnN0dWN0cyBhIHdpZGUgZGF0YSB0cmFuc2ZlciBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGJ1ZmZlcgorICogICBvbiB0aGUgc2VxdWVuY2VyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9jb25zdHJ1Y3Rfd2R0cihzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIGJ1c193aWR0aCkKK3sKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfRVhURU5ERUQ7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gTVNHX0VYVF9XRFRSX0xFTjsKKyAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfRVhUX1dEVFI7CisgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gYnVzX3dpZHRoOworICBwLT5tc2dfbGVuICs9IDQ7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9jYWxjX3Jlc2lkdWFsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIENhbGN1bGF0ZSB0aGUgcmVzaWR1YWwgZGF0YSBub3QgeWV0IHRyYW5zZmVycmVkLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9jYWxjdWxhdGVfcmVzaWR1YWwgKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICBzdHJ1Y3QgYWljN3h4eF9od3NjYiAqaHNjYjsKKyAgU2NzaV9DbW5kICpjbWQ7CisgIGludCBhY3R1YWwsIGk7CisKKyAgY21kID0gc2NiLT5jbWQ7CisgIGhzY2IgPSBzY2ItPmhzY2I7CisKKyAgLyoKKyAgICogIERvbid0IGRlc3Ryb3kgdmFsaWQgcmVzaWR1YWwgaW5mb3JtYXRpb24gd2l0aAorICAgKiAgcmVzaWR1YWwgY29taW5nIGZyb20gYSBjaGVjayBzZW5zZSBvcGVyYXRpb24uCisgICAqLworICBpZiAoKChzY2ItPmhzY2ItPmNvbnRyb2wgJiBESVNDT05ORUNURUQpID09IDApICYmCisgICAgICAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkgPT0gMCkKKyAgeworICAgIC8qCisgICAgICogIFdlIGhhZCBhbiB1bmRlcmZsb3cuIEF0IHRoaXMgdGltZSwgdGhlcmUncyBvbmx5CisgICAgICogIG9uZSBvdGhlciBkcml2ZXIgdGhhdCBib3RoZXJzIHRvIGNoZWNrIGZvciB0aGlzLAorICAgICAqICBhbmQgY21kLT51bmRlcmZsb3cgc2VlbXMgdG8gYmUgc2V0IHJhdGhlciBoYWxmLQorICAgICAqICBoZWFydGVkbHkgaW4gdGhlIGhpZ2hlci1sZXZlbCBTQ1NJIGNvZGUuCisgICAgICovCisgICAgYWN0dWFsID0gc2NiLT5zZ19sZW5ndGg7CisgICAgZm9yIChpPTE7IGkgPCBoc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50OyBpKyspCisgICAgeworICAgICAgYWN0dWFsIC09IHNjYi0+c2dfbGlzdFtzY2ItPnNnX2NvdW50IC0gaV0ubGVuZ3RoOworICAgIH0KKyAgICBhY3R1YWwgLT0gKGhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMl0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgKGhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMV0gPDwgIDgpIHwKKyAgICAgICAgICAgICAgaHNjYi0+cmVzaWR1YWxfZGF0YV9jb3VudFswXTsKKworICAgIGlmIChhY3R1YWwgPCBjbWQtPnVuZGVyZmxvdykKKyAgICB7CisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiVW5kZXJmbG93IC0gV2FudGVkICV1LCAlcyAldSwgcmVzaWR1YWwgU0cgIgorICAgICAgICAgICJjb3VudCAlZC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgY21kLT51bmRlcmZsb3csCisgICAgICAgICAgKHJxX2RhdGFfZGlyKGNtZC0+cmVxdWVzdCkgPT0gV1JJVEUpID8gIndyb3RlIiA6ICJyZWFkIiwgYWN0dWFsLAorICAgICAgICAgIGhzY2ItPnJlc2lkdWFsX1NHX3NlZ21lbnRfY291bnQpOworICAgICAgICBwcmludGsoSU5GT19MRUFEICJzdGF0dXMgMHgleC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgICBoc2NiLT50YXJnZXRfc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIC8qCisgICAgICAgKiBJbiAyLjQsIG9ubHkgc2VuZCBiYWNrIHRoZSByZXNpZHVhbCBpbmZvcm1hdGlvbiwgZG9uJ3QgZmxhZyB0aGlzCisgICAgICAgKiBhcyBhbiBlcnJvci4gIEJlZm9yZSAyLjQgd2UgaGFkIHRvIGZsYWcgdGhpcyBhcyBhbiBlcnJvciBiZWNhdXNlCisgICAgICAgKiB0aGUgbWlkIGxheWVyIGRpZG4ndCBjaGVjayByZXNpZHVhbCBkYXRhIGNvdW50cyB0byBzZWUgaWYgdGhlCisgICAgICAgKiBjb21tYW5kIG5lZWRzIHJldHJpZWQuCisgICAgICAgKi8KKyAgICAgIGNtZC0+cmVzaWQgPSBzY2ItPnNnX2xlbmd0aCAtIGFjdHVhbDsKKyAgICAgIGFpYzd4eHhfc3RhdHVzKGNtZCkgPSBoc2NiLT50YXJnZXRfc3RhdHVzOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIENsZWFuIG91dCB0aGUgcmVzaWR1YWwgaW5mb3JtYXRpb24gaW4gdGhlIFNDQiBmb3IgdGhlCisgICAqIG5leHQgY29uc3VtZXIuCisgICAqLworICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzJdID0gMDsKKyAgaHNjYi0+cmVzaWR1YWxfZGF0YV9jb3VudFsxXSA9IDA7CisgIGhzY2ItPnJlc2lkdWFsX2RhdGFfY291bnRbMF0gPSAwOworICBoc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50ID0gMDsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2hhbmRsZV9kZXZpY2VfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIHNlcXVlbmNlciBpbnRlcnJ1cHRzIChTRVFJTlQpLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9oYW5kbGVfZGV2aWNlX3Jlc2V0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIGludCB0YXJnZXQsIGludCBjaGFubmVsKQoreworICB1bnNpZ25lZCBjaGFyIHRpbmRleCA9IHRhcmdldDsKKworICB0aW5kZXggfD0gKChjaGFubmVsICYgMHgwMSkgPDwgMyk7CisKKyAgLyoKKyAgICogR28gYmFjayB0byBhc3luYy9uYXJyb3cgdHJhbnNmZXJzIGFuZCByZW5lZ290aWF0ZS4KKyAgICovCisgIGFpY19vdXRiKHAsIDAsIFRBUkdfU0NTSVJBVEUgKyB0aW5kZXgpOworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIGFpY19vdXRiKHAsIDAsIFRBUkdfT0ZGU0VUICsgdGluZGV4KTsKKyAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywgU0NCX0xJU1RfTlVMTCk7CisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUX1BST0NFU1MpCisgICAgcHJpbnRrKElORk9fTEVBRCAiQnVzIERldmljZSBSZXNldCBkZWxpdmVyZWQuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLAorICAgICAgdGFyZ2V0LCAtMSk7CisgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgLypjb21wbGV0ZSovIFRSVUUpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaGFuZGxlX3NlcWludAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBJbnRlcnJ1cHQgaGFuZGxlciBmb3Igc2VxdWVuY2VyIGludGVycnVwdHMgKFNFUUlOVCkuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2hhbmRsZV9zZXFpbnQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciBpbnRzdGF0KQoreworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYjsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKyAgdW5zaWduZWQgc2hvcnQgdGFyZ2V0X21hc2s7CisgIHVuc2lnbmVkIGNoYXIgdGFyZ2V0LCBsdW4sIHRpbmRleDsKKyAgdW5zaWduZWQgY2hhciBxdWV1ZV9mbGFnID0gRkFMU0U7CisgIGNoYXIgY2hhbm5lbDsKKyAgaW50IHJlc3VsdDsKKworICB0YXJnZXQgPSAoKGFpY19pbmIocCwgU0FWRURfVENMKSA+PiA0KSAmIDB4MGYpOworICBpZiAoIChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKSA9PSBBSENfQUlDNzc3MCApCisgICAgY2hhbm5lbCA9IChhaWNfaW5iKHAsIFNCTEtDVEwpICYgU0VMQlVTQikgPj4gMzsKKyAgZWxzZQorICAgIGNoYW5uZWwgPSAwOworICB0aW5kZXggPSB0YXJnZXQgKyAoY2hhbm5lbCA8PCAzKTsKKyAgbHVuID0gYWljX2luYihwLCBTQVZFRF9UQ0wpICYgMHgwNzsKKyAgdGFyZ2V0X21hc2sgPSAoMHgwMSA8PCB0aW5kZXgpOworCisgIC8qCisgICAqIEdvIGFoZWFkIGFuZCBjbGVhciB0aGUgU0VRSU5UIG5vdywgdGhhdCBhdm9pZHMgYW55IGludGVycnVwdCByYWNlCisgICAqIGNvbmRpdGlvbnMgbGF0ZXIgb24gaW4gY2FzZSB3ZSBlbmFibGUgc29tZSBvdGhlciBpbnRlcnJ1cHQuCisgICAqLworICBhaWNfb3V0YihwLCBDTFJTRVFJTlQsIENMUklOVCk7CisgIHN3aXRjaCAoaW50c3RhdCAmIFNFUUlOVF9NQVNLKQorICB7CisgICAgY2FzZSBOT19NQVRDSDoKKyAgICAgIHsKKyAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIChFTlNFTEl8RU5SU0VMSXxFTkFVVE9BVE5QKSwKKyAgICAgICAgICAgICAgICAgU0NTSVNFUSk7CisgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIk5vIGFjdGl2ZSBTQ0IgZm9yIHJlY29ubmVjdGluZyB0YXJnZXQgLSBJc3N1aW5nICIKKyAgICAgICAgICAgICAgICJCVVMgREVWSUNFIFJFU0VULlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOworICAgICAgICBwcmludGsoV0FSTl9MRUFEICIgICAgICBTQVZFRF9UQ0w9MHgleCwgQVJHXzE9MHgleCwgU0VRQUREUj0weCV4XG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sCisgICAgICAgICAgICAgICBhaWNfaW5iKHAsIFNBVkVEX1RDTCksIGFpY19pbmIocCwgQVJHXzEpLAorICAgICAgICAgICAgICAgKGFpY19pbmIocCwgU0VRQUREUjEpIDw8IDgpIHwgYWljX2luYihwLCBTRVFBRERSMCkpOworICAgICAgICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICAgICAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNFTkRfUkVKRUNUOgorICAgICAgeworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZWplY3RpbmcgdW5rbm93biBtZXNzYWdlICgweCV4KSByZWNlaXZlZCBmcm9tICIKKyAgICAgICAgICAgICJ0YXJnZXQsIFNFUV9GTEFHUz0weCV4XG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwKKyAgICAgICAgICAgIGFpY19pbmIocCwgQUNDVU0pLCBhaWNfaW5iKHAsIFNFUV9GTEFHUykpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5PX0lERU5UOgorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgcmVjb25uZWN0aW5nIHRhcmdldCBlaXRoZXIgZGlkIG5vdCBzZW5kIGFuIGlkZW50aWZ5CisgICAgICAgICAqIG1lc3NhZ2UsIG9yIGRpZCwgYnV0IHdlIGRpZG4ndCBmaW5kIGFuIFNDQiB0byBtYXRjaCBhbmQKKyAgICAgICAgICogYmVmb3JlIGl0IGNvdWxkIHJlc3BvbmQgdG8gb3VyIEFUTi9hYm9ydCwgaXQgaGl0IGEgZGF0YXBoYXNlLgorICAgICAgICAgKiBUaGUgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIGJsb3cgaXQgYXdheSB3aXRoIGEgYnVzCisgICAgICAgICAqIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIChWRVJCT1NFX1NFUUlOVCB8IFZFUkJPU0VfUkVTRVRfTUlEKSkKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJUYXJnZXQgZGlkIG5vdCBzZW5kIGFuIElERU5USUZZIG1lc3NhZ2U7ICIKKyAgICAgICAgICAgICJMQVNUUEhBU0UgMHgleCwgU0FWRURfVENMIDB4JXhcbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwKKyAgICAgICAgICAgIGx1biwgYWljX2luYihwLCBMQVNUUEhBU0UpLCBhaWNfaW5iKHAsIFNBVkVEX1RDTCkpOworCisgICAgICAgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbChwLCBjaGFubmVsLCAvKmluaXRpYXRlIHJlc2V0Ki8gVFJVRSk7CisgICAgICAgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgVFJVRSk7CisKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCQURfUEhBU0U6CisgICAgICBpZiAoYWljX2luYihwLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkKKyAgICAgIHsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfU0VRSU5UKQorICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIk1pc3NlZCBidXNmcmVlLlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwKKyAgICAgICAgICAgIHRhcmdldCwgbHVuKTsKKyAgICAgICAgcmVzdGFydF9zZXF1ZW5jZXIocCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJVbmtub3duIHNjc2kgYnVzIHBoYXNlLCBjb250aW51aW5nXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVYVEVOREVEX01TRzoKKyAgICAgIHsKKyAgICAgICAgcC0+bXNnX3R5cGUgPSBNU0dfVFlQRV9JTklUSUFUT1JfTVNHSU47CisgICAgICAgIHAtPm1zZ19sZW4gPSAwOworICAgICAgICBwLT5tc2dfaW5kZXggPSAwOworCisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkVuYWJsaW5nIFJFUUlOSVRzIGZvciBNU0dfSU5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyNlbmRpZgorCisgICAgICAgLyogICAgICAKKyAgICAgICAgKiBUbyBhY3R1YWxseSByZWNlaXZlIHRoZSBtZXNzYWdlLCBzaW1wbHkgdHVybiBvbgorICAgICAgICAqIFJFUUlOSVQgaW50ZXJydXB0cyBhbmQgbGV0IG91ciBpbnRlcnJ1cHQgaGFuZGxlcgorICAgICAgICAqIGRvIHRoZSByZXN0IChSRVFJTklUIHNob3VsZCBhbHJlYWR5IGJlIHRydWUpLgorICAgICAgICAqLworICAgICAgICBwLT5mbGFncyB8PSBBSENfSEFORExJTkdfUkVRSU5JVFM7CisgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgfCBFTlJFUUlOSVQsIFNJTU9ERTEpOworCisgICAgICAgLyoKKyAgICAgICAgKiBXZSBkb24ndCB3YW50IHRoZSBzZXF1ZW5jZXIgdW5wYXVzZWQgeWV0IHNvIHdlIHJldHVybiBlYXJseQorICAgICAgICAqLworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICBjYXNlIFJFSkVDVF9NU0c6CisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFdoYXQgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGlmIHdlIGhhZCBhbiBvdXRzdGFuZGluZyBTRFRSCisgICAgICAgICAqIG9yIFdEVFIgbWVzc2FnZSBmb3IgdGhpcyB0YXJnZXQuIElmIHdlIGRpZCwgdGhpcyBpcyBhCisgICAgICAgICAqIHNpZ25hbCB0aGF0IHRoZSB0YXJnZXQgaXMgcmVmdXNpbmcgbmVnb3RpYXRpb24uCisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIHNjYl9pbmRleDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBsYXN0X21zZzsKKworICAgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisJYWljX2RldiA9IEFJQ19ERVYoc2NiLT5jbWQpOworICAgICAgICBsYXN0X21zZyA9IGFpY19pbmIocCwgTEFTVF9NU0cpOworCisgICAgICAgIGlmICggKGxhc3RfbXNnID09IE1TR19JREVOVElGWUZMQUcpICYmCisgICAgICAgICAgICAgKHNjYi0+dGFnX2FjdGlvbikgJiYKKyAgICAgICAgICAgICEoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfQklUUykgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNjYi0+dGFnX2FjdGlvbiA9PSBNU0dfT1JERVJFRF9RX1RBRykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogT0suLi50aGUgZGV2aWNlIHNlZW1zIGFibGUgdG8gYWNjZXB0IHRhZ2dlZCBjb21tYW5kcywgYnV0CisgICAgICAgICAgICAgKiBub3Qgb3JkZXJlZCB0YWcgY29tbWFuZHMsIG9ubHkgc2ltcGxlIHRhZyBjb21tYW5kcy4gIFNvLCB3ZQorICAgICAgICAgICAgICogZGlzYWJsZSBvcmRlcmVkIHRhZyBjb21tYW5kcyBhbmQgZ28gb24gd2l0aCBsaWZlIGp1c3QgbGlrZQorICAgICAgICAgICAgICogbm9ybWFsLgorICAgICAgICAgICAgICovCisJICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNjYi0+Y21kLT5kZXZpY2UsIE1TR19TSU1QTEVfVEFHLAorCQkJICAgIHNjYi0+Y21kLT5kZXZpY2UtPnF1ZXVlX2RlcHRoKTsKKyAgICAgICAgICAgIHNjYi0+dGFnX2FjdGlvbiA9IE1TR19TSU1QTEVfUV9UQUc7CisgICAgICAgICAgICBzY2ItPmhzY2ItPmNvbnRyb2wgJj0gflNDQl9UQUdfVFlQRTsKKyAgICAgICAgICAgIHNjYi0+aHNjYi0+Y29udHJvbCB8PSBNU0dfU0lNUExFX1FfVEFHOworICAgICAgICAgICAgYWljX291dGIocCwgc2NiLT5oc2NiLT5jb250cm9sLCBTQ0JfQ09OVFJPTCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogT0suLndlIHNldCB0aGUgdGFnIHR5cGUgdG8gc2ltcGxlIHRhZyBjb21tYW5kLCBub3cgd2UgcmUtYXNzZXJ0CisgICAgICAgICAgICAgKiBBVE5PIGFuZCBob3BlIHRoaXMgd2lsbCB0YWtlIHVzIGludG8gdGhlIGlkZW50aWZ5IHBoYXNlIGFnYWluCisgICAgICAgICAgICAgKiBzbyB3ZSBjYW4gcmVzZW5kIHRoZSB0YWcgdHlwZSBhbmQgaW5mbyB0byB0aGUgZGV2aWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhaWNfb3V0YihwLCBNU0dfSURFTlRJRllGTEFHLCBNU0dfT1VUKTsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNJR0kpIHwgQVROTywgU0NTSVNJR08pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChzY2ItPnRhZ19hY3Rpb24gPT0gTVNHX1NJTVBMRV9RX1RBRykKKyAgICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGk7CisgICAgICAgICAgICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYnA7CisgICAgICAgICAgICBpbnQgb2xkX3ZlcmJvc2U7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSG1tbW0uLi4udGhlIGRldmljZSBpcyBmbGFraW5nIG91dCBvbiB0YWdnZWQgY29tbWFuZHMuCisgICAgICAgICAgICAgKi8KKwkgICAgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2NiLT5jbWQtPmRldmljZSwgMCAvKiB1bnRhZ2dlZCAqLywKKwkJCSAgICBwLT5ob3N0LT5jbWRfcGVyX2x1bik7CisgICAgICAgICAgICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9IDE7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2Ugc2V0IHRoaXMgY29tbWFuZCB1cCBhcyBhIGJ1cyBkZXZpY2UgcmVzZXQuICBIb3dldmVyLCB3ZSBoYXZlCisgICAgICAgICAgICAgKiB0byBjbGVhciB0aGUgdGFnIHR5cGUgYXMgaXQncyBjYXVzaW5nIHVzIHByb2JsZW1zLiAgV2Ugc2hvdWxkbnQKKyAgICAgICAgICAgICAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYW55IG90aGVyIGNvbW1hbmRzIGJlaW5nIGFjdGl2ZSwgc2luY2UgaWYKKyAgICAgICAgICAgICAqIHRoZSBkZXZpY2UgaXMgcmVmdXNpbmcgdGFnZ2VkIGNvbW1hbmRzLCB0aGlzIHNob3VsZCBiZSB0aGUKKyAgICAgICAgICAgICAqIGZpcnN0IHRhZ2dlZCBjb21tYW5kIHNlbnQgdG8gdGhlIGRldmljZSwgaG93ZXZlciwgd2UgZG8gaGF2ZQorICAgICAgICAgICAgICogdG8gd29ycnkgYWJvdXQgYW55IG90aGVyIHRhZ2dlZCBjb21tYW5kcyB0aGF0IG1heSBhbHJlYWR5IGJlCisgICAgICAgICAgICAgKiBpbiB0aGUgcWluZmlmby4gIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzLCBpcyB0byBpc3N1ZSBhIEJEUiwKKyAgICAgICAgICAgICAqIHNlbmQgYWxsIHRoZSBjb21tYW5kcyBiYWNrIHRvIHRoZSBtaWQgbGV2ZWwgY29kZSwgdGhlbiBsZXQgdGhlbQorICAgICAgICAgICAgICogY29tZSBiYWNrIGFuZCBnZXQgcmVidWlsdCBhcyB1bnRhZ2dlZCBjb21tYW5kcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2NiLT50YWdfYWN0aW9uID0gMDsKKyAgICAgICAgICAgIHNjYi0+aHNjYi0+Y29udHJvbCAmPSB+KFRBR19FTkIgfCBTQ0JfVEFHX1RZUEUpOworICAgICAgICAgICAgYWljX291dGIocCwgIHNjYi0+aHNjYi0+Y29udHJvbCwgU0NCX0NPTlRST0wpOworCisgICAgICAgICAgICBvbGRfdmVyYm9zZSA9IGFpYzd4eHhfdmVyYm9zZTsKKyAgICAgICAgICAgIGFpYzd4eHhfdmVyYm9zZSAmPSB+KFZFUkJPU0VfUkVTRVR8VkVSQk9TRV9BQk9SVCk7CisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNjYnAgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldOworICAgICAgICAgICAgICBpZiAoKHNjYnAtPmZsYWdzICYgU0NCX0FDVElWRSkgJiYgKHNjYnAgIT0gc2NiKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhaWM3eHh4X21hdGNoX3NjYihwLCBzY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBUUlVFKTsKKyAgICAgICAgICAgIGFpYzd4eHhfdmVyYm9zZSA9IG9sZF92ZXJib3NlOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGZvciBsb29wIHRvIHNldCB0aGUgYnVzeSBpbmRleCBzaW5jZQorICAgICAgICAgICAgICogYWljN3h4eF9yZXNldF9kZXZpY2Ugd2lsbCBjbGVhciB0aGUgYnVzeSBpbmRleCBkdXJpbmcgaXRzCisgICAgICAgICAgICAgKiBvcGVyYXRpb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFpYzd4eHhfYnVzeV90YXJnZXQocCwgc2NiKTsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBpcyByZWZ1c2luZyB0YWdnZWQgY29tbWFuZHMsIHVzaW5nICIKKyAgICAgICAgICAgICAgInVudGFnZ2VkIEkvTy5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIE1TR19JREVOVElGWUZMQUcsIE1TR19PVVQpOworICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0lHSSkgfCBBVE5PLCBTQ1NJU0lHTyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1BQUikKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogQXMgcGVyIHRoZSBkcmFmdCBzcGVjcywgYW55IGRldmljZSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYW55IG9mCisgICAgICAgICAgICogdGhlIG9wdGlvbiB2YWx1ZXMgb3RoZXIgdGhhbiAwIGFyZSBub3QgYWxsb3dlZCB0byByZWplY3QgdGhlCisgICAgICAgICAgICogUFBSIG1lc3NhZ2UuICBJbnN0ZWFkLCB0aGV5IG11c3QgbmVnb3RpYXRlIG91dCB3aGF0IHRoZXkgZG8KKyAgICAgICAgICAgKiBzdXBwb3J0IGluc3RlYWQgb2YgcmVqZWN0aW5nIG91ciBvZmZlcmluZyBvciBlbHNlIHRoZXkgY2F1c2UKKyAgICAgICAgICAgKiBhIHBhcml0eSBlcnJvciBkdXJpbmcgbXNnX291dCBwaGFzZSB0byBzaWduYWwgdGhhdCB0aGV5IGRvbid0CisgICAgICAgICAgICogbGlrZSBvdXIgc2V0dGluZ3MuCisgICAgICAgICAgICovCisgICAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDA7CisgICAgICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisgICAgICAgICAgICAoQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19RVUlURSksIGFpY19kZXYpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIE5VTEwsIHRhcmdldCwgY2hhbm5lbCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVJ8QUhDX1RSQU5TX1FVSVRFLAorCQkJICAgICAgIGFpY19kZXYpOworICAgICAgICAgIGFpY19kZXYtPmdvYWwub3B0aW9ucyA9IGFpY19kZXYtPmR0cl9wZW5kaW5nID0gMDsKKyAgICAgICAgICBzY2ItPmZsYWdzICY9IH5TQ0JfTVNHT1VUX0JJVFM7CisgICAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiRGV2aWNlIGlzIHJlamVjdGluZyBQUFIgbWVzc2FnZXMsIGZhbGxpbmcgIgorICAgICAgICAgICAgICAiYmFjay5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCBhaWNfZGV2LT5nb2FsLndpZHRoICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAxOworICAgICAgICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1dEVFI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICggYWljX2Rldi0+Z29hbC5vZmZzZXQgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDE7CisgICAgICAgICAgICBpZiggIWFpY19kZXYtPmR0cl9wZW5kaW5nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9NU0dPVVRfU0RUUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCBhaWNfZGV2LT5kdHJfcGVuZGluZyApCisgICAgICAgICAgeworICAgICAgICAgICAgYWljX291dGIocCwgSE9TVF9NU0csIE1TR19PVVQpOworICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0lHSSkgfCBBVE5PLCBTQ1NJU0lHTyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1dEVFIpCisgICAgICAgIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIG5vdGUgOGJpdCB4ZmVycyBhbmQgY2xlYXIgZmxhZworICAgICAgICAgICAqLworICAgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDA7CisgICAgICAgICAgc2NiLT5mbGFncyAmPSB+U0NCX01TR09VVF9CSVRTOworICAgICAgICAgIGFpYzd4eHhfc2V0X3dpZHRoKHAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCBNU0dfRVhUX1dEVFJfQlVTXzhfQklULAorICAgICAgICAgICAgKEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0dPQUx8QUhDX1RSQU5TX0NVUiksIGFpY19kZXYpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIE5VTEwsIHRhcmdldCwgY2hhbm5lbCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVJ8QUhDX1RSQU5TX1FVSVRFLAorCQkJICAgICAgIGFpY19kZXYpOworICAgICAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBpcyByZWplY3RpbmcgV0RUUiBtZXNzYWdlcywgdXNpbmcgIgorICAgICAgICAgICAgICAibmFycm93IHRyYW5zZmVycy5cbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljX2Rldi0+bmVlZHNkdHIgPSBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1NEVFIpCisgICAgICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBub3RlIGFzeW5jaCB4ZmVycyBhbmQgY2xlYXIgZmxhZworICAgICAgICAgICovCisgICAgICAgICAgYWljX2Rldi0+bmVlZHNkdHIgPSBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5ID0gMDsKKyAgICAgICAgICBzY2ItPmZsYWdzICY9IH5TQ0JfTVNHT1VUX0JJVFM7CisgICAgICAgICAgYWljN3h4eF9zZXRfc3luY3JhdGUocCwgTlVMTCwgdGFyZ2V0LCBjaGFubmVsLCAwLCAwLCAwLAorICAgICAgICAgICAgKEFIQ19UUkFOU19DVVJ8QUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfR09BTCksIGFpY19kZXYpOworICAgICAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkRldmljZSBpcyByZWplY3RpbmcgU0RUUiBtZXNzYWdlcywgdXNpbmcgIgorICAgICAgICAgICAgICAiYXN5bmMgdHJhbnNmZXJzLlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUmVjZWl2ZWQgTUVTU0FHRV9SRUpFQ1QgZm9yIHVua25vd24gY2F1c2UuICAiCisgICAgICAgICAgICAiSWdub3JpbmcuXG4iLCBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1bik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCQURfU1RBVFVTOgorICAgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNjYl9pbmRleDsKKyAgICAgICAgc3RydWN0IGFpYzd4eHhfaHdzY2IgKmhzY2I7CisgICAgICAgIFNjc2lfQ21uZCAqY21kOworCisgICAgICAgIC8qIFRoZSBzZXF1ZW5jZXIgd2lsbCBub3RpZnkgdXMgd2hlbiBhIGNvbW1hbmQgaGFzIGFuIGVycm9yIHRoYXQKKyAgICAgICAgICogd291bGQgYmUgb2YgaW50ZXJlc3QgdG8gdGhlIGtlcm5lbC4gIFRoaXMgYWxsb3dzIHVzIHRvIGxlYXZlCisgICAgICAgICAqIHRoZSBzZXF1ZW5jZXIgcnVubmluZyBpbiB0aGUgY29tbW9uIGNhc2Ugb2YgY29tbWFuZCBjb21wbGV0ZXMKKyAgICAgICAgICogd2l0aG91dCBlcnJvci4gIFRoZSBzZXF1ZW5jZXIgd2lsbCBoYXZlIERNQSdkIHRoZSBTQ0IgYmFjaworICAgICAgICAgKiB1cCB0byB1cywgc28gd2UgY2FuIHJlZmVyZW5jZSB0aGUgZHJpdmVycyBTQ0IgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIFNldCB0aGUgZGVmYXVsdCByZXR1cm4gdmFsdWUgdG8gMCBpbmRpY2F0aW5nIG5vdCB0byBzZW5kCisgICAgICAgICAqIHNlbnNlLiAgVGhlIHNlbnNlIGNvZGUgd2lsbCBjaGFuZ2UgdGhpcyBpZiBuZWVkZWQgYW5kIHRoaXMKKyAgICAgICAgICogcmVkdWNlcyBjb2RlIGR1cGxpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYWljX291dGIocCwgMCwgUkVUVVJOXzEpOworICAgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICBpZiAoc2NiX2luZGV4ID4gcC0+c2NiX2RhdGEtPm51bXNjYnMpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoV0FSTl9MRUFEICJJbnZhbGlkIFNDQiBkdXJpbmcgU0VRSU5UIDB4JTAyeCwgU0NCX1RBRyAlZC5cbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCBjaGFubmVsLCB0YXJnZXQsIGx1biwgaW50c3RhdCwgc2NiX2luZGV4KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisgICAgICAgIGhzY2IgPSBzY2ItPmhzY2I7CisKKyAgICAgICAgaWYgKCEoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpIHx8IChzY2ItPmNtZCA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIkludmFsaWQgU0NCIGR1cmluZyBTRVFJTlQgMHgleCwgc2NiICVkLCBmbGFncyAweCV4LCIKKyAgICAgICAgICAgICIgY21kIDB4JWx4LlxuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCwgdGFyZ2V0LCBsdW4sIGludHN0YXQsCisgICAgICAgICAgICBzY2JfaW5kZXgsIHNjYi0+ZmxhZ3MsICh1bnNpZ25lZCBsb25nKSBzY2ItPmNtZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY21kID0gc2NiLT5jbWQ7CisJICBhaWNfZGV2ID0gQUlDX0RFVihzY2ItPmNtZCk7CisgICAgICAgICAgaHNjYi0+dGFyZ2V0X3N0YXR1cyA9IGFpY19pbmIocCwgU0NCX1RBUkdFVF9TVEFUVVMpOworICAgICAgICAgIGFpYzd4eHhfc3RhdHVzKGNtZCkgPSBoc2NiLT50YXJnZXRfc3RhdHVzOworCisgICAgICAgICAgY21kLT5yZXN1bHQgPSBoc2NiLT50YXJnZXRfc3RhdHVzOworCisgICAgICAgICAgc3dpdGNoIChzdGF0dXNfYnl0ZShoc2NiLT50YXJnZXRfc3RhdHVzKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEdPT0Q6CisgICAgICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJJbnRlcnJ1cHRlZCBmb3Igc3RhdHVzIG9mIEdPT0Q/Pz9cbiIsCisgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDT01NQU5EX1RFUk1JTkFURUQ6CisgICAgICAgICAgICBjYXNlIENIRUNLX0NPTkRJVElPTjoKKyAgICAgICAgICAgICAgaWYgKCAhKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2VuZCBhIHNlbnNlIGNvbW1hbmQgdG8gdGhlIHJlcXVlc3RpbmcgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAqIFhYWCAtIHJldmlzaXQgdGhpcyBhbmQgZ2V0IHJpZCBvZiB0aGUgbWVtY29weXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbWVtY3B5KHNjYi0+c2Vuc2VfY21kLCAmZ2VuZXJpY19zZW5zZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdlbmVyaWNfc2Vuc2UpKTsKKworICAgICAgICAgICAgICAgIHNjYi0+c2Vuc2VfY21kWzFdID0gKGNtZC0+ZGV2aWNlLT5sdW4gPDwgNSk7CisgICAgICAgICAgICAgICAgc2NiLT5zZW5zZV9jbWRbNF0gPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCisgICAgICAgICAgICAgICAgc2NiLT5zZ19saXN0WzBdLmxlbmd0aCA9IAorICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCXNjYi0+c2dfbGlzdFswXS5hZGRyZXNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHAtPnBkZXYsIGNtZC0+c2Vuc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBYWFggLSBXZSBzaG91bGQgYWxsb3cgZGlzY29ubmVjdGlvbiwgYnV0IGNhbid0IGFzIGl0CisgICAgICAgICAgICAgICAgICogbWlnaHQgYWxsb3cgb3ZlcmxhcHBlZCB0YWdnZWQgY29tbWFuZHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogaHNjYi0+Y29udHJvbCAmPSBESVNDRU5COyAqLworICAgICAgICAgICAgICAgIGhzY2ItPmNvbnRyb2wgPSAwOworICAgICAgICAgICAgICAgIGhzY2ItPnRhcmdldF9zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIGhzY2ItPlNHX2xpc3RfcG9pbnRlciA9IAorCQkgIGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsIHNjYi0+c2dfbGlzdCkpOworICAgICAgICAgICAgICAgIGhzY2ItPlNDU0lfY21kX3BvaW50ZXIgPSAKKyAgICAgICAgICAgICAgICAgIGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsIHNjYi0+c2Vuc2VfY21kKSk7CisgICAgICAgICAgICAgICAgaHNjYi0+ZGF0YV9jb3VudCA9IHNjYi0+c2dfbGlzdFswXS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaHNjYi0+ZGF0YV9wb2ludGVyID0gc2NiLT5zZ19saXN0WzBdLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgaHNjYi0+U0NTSV9jbWRfbGVuZ3RoID0gQ09NTUFORF9TSVpFKHNjYi0+c2Vuc2VfY21kWzBdKTsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzBdID0gMDsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzFdID0gMDsKKyAgICAgICAgICAgICAgICBoc2NiLT5yZXNpZHVhbF9kYXRhX2NvdW50WzJdID0gMDsKKworICAgICAgICAgICAgICAgIHNjYi0+c2dfY291bnQgPSBoc2NiLT5TR19zZWdtZW50X2NvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBzY2ItPnNnX2xlbmd0aCA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgc2NiLT50YWdfYWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9TRU5TRTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEVuc3VyZSB0aGUgdGFyZ2V0IGlzIGJ1c3kgc2luY2UgdGhpcyB3aWxsIGJlIGFuCisgICAgICAgICAgICAgICAgICogYW4gdW50YWdnZWQgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICAgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9CSVRTKQorICAgICAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZXF1ZXN0aW5nIFNFTlNFIHdpdGggJXNcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9TRFRSKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0RUUiIgOiAiV0RUUiIpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZXF1ZXN0aW5nIFNFTlNFLCBubyBNU0dcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGFpYzd4eHhfYnVzeV90YXJnZXQocCwgc2NiKTsKKyAgICAgICAgICAgICAgICBhaWNfb3V0YihwLCBTRU5EX1NFTlNFLCBSRVRVUk5fMSk7CisgICAgICAgICAgICAgICAgYWljN3h4eF9lcnJvcihjbWQpID0gRElEX09LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9ICAvKiBmaXJzdCB0aW1lIHNlbnNlLCBubyBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiQ0hFQ0tfQ09ORElUSU9OIG9uIFJFUVVFU1RfU0VOU0UsIHJldHVybmluZyAiCisgICAgICAgICAgICAgICAgICAgICAiYW4gZXJyb3IuXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICBhaWM3eHh4X2Vycm9yKGNtZCkgPSBESURfRVJST1I7CisgICAgICAgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9TRU5TRTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUVVFVUVfRlVMTDoKKyAgICAgICAgICAgICAgcXVldWVfZmxhZyA9IFRSVUU7ICAgIC8qIE1hcmsgdGhhdCB0aGlzIGlzIGEgUVVFVUVfRlVMTCBhbmQgKi8KKyAgICAgICAgICAgIGNhc2UgQlVTWTogICAgICAgICAgICAgIC8qIGRyb3AgdGhyb3VnaCB0byBoZXJlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0cnVjdCBhaWM3eHh4X3NjYiAqbmV4dF9zY2JwLCAqcHJldl9zY2JwOworICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFjdGl2ZV9oc2NiLCBuZXh0X2hzY2IsIHByZXZfaHNjYiwgc2NiX2luZGV4OworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBXZSBoYXZlIHRvIGxvb2sgdGhyZWUgcGxhY2VzIGZvciBxdWV1ZWQgY29tbWFuZHM6CisgICAgICAgICAgICAgICAqICAxOiBwLT53YWl0aW5nX3NjYnMgcXVldWUKKyAgICAgICAgICAgICAgICogIDI6IFFJTkZJRk8KKyAgICAgICAgICAgICAgICogIDM6IFdBSVRJTkdfU0NCUyBsaXN0IG9uIGNhcmQgKGZvciBjb21tYW5kcyB0aGF0IGFyZSBzdGFydGVkCisgICAgICAgICAgICAgICAqICAgICBidXQgaGF2ZW4ndCB5ZXQgbWFkZSBpdCB0byB0aGUgZGV2aWNlKQorCSAgICAgICAqCisJICAgICAgICogT2Ygc3BlY2lhbCBub3RlIGhlcmUgaXMgdGhhdCBjb21tYW5kcyBvbiAyIG9yIDMgYWJvdmUgd2lsbAorCSAgICAgICAqIGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCBhcyBhY3RpdmUsIHdoaWxlIGNvbW1hbmRzIG9uIDEgd2lsbAorCSAgICAgICAqIG5vdC4gIFRoZSBhaWM3eHh4X2RvbmUoKSBmdW5jdGlvbiB3aWxsIHdhbnQgdG8gdW5tYXJrIHRoZW0KKwkgICAgICAgKiBmcm9tIGFjdGl2ZSwgc28gYW55IGNvbW1hbmRzIHdlIHB1bGwgb2ZmIG9mIDEgbmVlZCB0bworCSAgICAgICAqIHVwIHRoZSBhY3RpdmUgY291bnQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBuZXh0X3NjYnAgPSBwLT53YWl0aW5nX3NjYnMuaGVhZDsKKyAgICAgICAgICAgICAgd2hpbGUgKCBuZXh0X3NjYnAgIT0gTlVMTCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X3NjYnAgPSBuZXh0X3NjYnA7CisgICAgICAgICAgICAgICAgbmV4dF9zY2JwID0gbmV4dF9zY2JwLT5xX25leHQ7CisgICAgICAgICAgICAgICAgaWYgKCBhaWM3eHh4X21hdGNoX3NjYihwLCBwcmV2X3NjYnAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLAorICAgICAgICAgICAgICAgICAgICAgU0NCX0xJU1RfTlVMTCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNjYnFfcmVtb3ZlKCZwLT53YWl0aW5nX3NjYnMsIHByZXZfc2NicCk7CisJCSAgc2NiLT5mbGFncyA9IFNDQl9RVUVVRURfRk9SX0RPTkUgfCBTQ0JfUVVFVUVfRlVMTDsKKwkJICBwLT5hY3RpdmVzY2JzKys7CisJCSAgYWljX2Rldi0+YWN0aXZlX2NtZHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWljN3h4eF9zZWFyY2hfcWluZmlmbyhwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKyAgICAgICAgICAgICAgICBTQ0JfTElTVF9OVUxMLCBTQ0JfUVVFVUVEX0ZPUl9ET05FIHwgU0NCX1FVRVVFX0ZVTEwsCisJICAgICAgIAlGQUxTRSwgTlVMTCk7CisgICAgICAgICAgICAgIG5leHRfc2NicCA9IE5VTEw7CisgICAgICAgICAgICAgIGFjdGl2ZV9oc2NiID0gYWljX2luYihwLCBTQ0JQVFIpOworICAgICAgICAgICAgICBwcmV2X2hzY2IgPSBuZXh0X2hzY2IgPSBzY2JfaW5kZXggPSBTQ0JfTElTVF9OVUxMOworICAgICAgICAgICAgICBuZXh0X2hzY2IgPSBhaWNfaW5iKHAsIFdBSVRJTkdfU0NCSCk7CisgICAgICAgICAgICAgIHdoaWxlIChuZXh0X2hzY2IgIT0gU0NCX0xJU1RfTlVMTCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpY19vdXRiKHAsIG5leHRfaHNjYiwgU0NCUFRSKTsKKyAgICAgICAgICAgICAgICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICAgICAgICAgIGlmIChzY2JfaW5kZXggPCBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBuZXh0X3NjYnAgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisgICAgICAgICAgICAgICAgICBpZiAoYWljN3h4eF9tYXRjaF9zY2IocCwgbmV4dF9zY2JwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0JfTElTVF9OVUxMKSApCisgICAgICAgICAgICAgICAgICB7CisJCSAgICBuZXh0X3NjYnAtPmZsYWdzID0gU0NCX1FVRVVFRF9GT1JfRE9ORSB8IFNDQl9RVUVVRV9GVUxMOworICAgICAgICAgICAgICAgICAgICBuZXh0X2hzY2IgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgICAgICAgICAgICAgICAgICAgYWljX291dGIocCwgMCwgU0NCX0NPTlRST0wpOworICAgICAgICAgICAgICAgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfaHNjYiA9PSBTQ0JfTElTVF9OVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgLyogV2Ugd2VyZSBmaXJzdCBvbiB0aGUgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBraWxsIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKiBoYXJkd2FyZS4gIExldCB0aGUgc2VxdWVuY2VyCisgICAgICAgICAgICAgICAgICAgICAgICogcmUtaW5pdCB0aGUgaGFyZHdhcmUgaXRzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIH5FTlNFTE8sIFNDU0lTRVEpOworICAgICAgICAgICAgICAgICAgICAgIGFpY19vdXRiKHAsIENMUlNFTFRJTUVPLCBDTFJTSU5UMSk7CisgICAgICAgICAgICAgICAgICAgICAgYWljX291dGIocCwgbmV4dF9oc2NiLCBXQUlUSU5HX1NDQkgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGFpY19vdXRiKHAsIHByZXZfaHNjYiwgU0NCUFRSKTsKKyAgICAgICAgICAgICAgICAgICAgICBhaWNfb3V0YihwLCBuZXh0X2hzY2IsIFNDQl9ORVhUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X2hzY2IgPSBuZXh0X2hzY2I7CisgICAgICAgICAgICAgICAgICAgIG5leHRfaHNjYiA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogc2NiX2luZGV4ID49IHAtPnNjYl9kYXRhLT5udW1zY2JzICovCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWljX291dGIocCwgYWN0aXZlX2hzY2IsIFNDQlBUUik7CisJICAgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICAgICAgICAgIGlmKCAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikgfHwKKyAgICAgICAgICAgICAgICAgIChhaWM3eHh4X3ZlcmJvc2UgPiAweGZmZmYpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9mbGFnKQorICAgICAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUXVldWUgZnVsbCByZWNlaXZlZDsgcXVldWUgZGVwdGggJWQsICIKKyAgICAgICAgICAgICAgICAgICAgImFjdGl2ZSAlZFxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5tYXhfcV9kZXB0aCwgYWljX2Rldi0+YWN0aXZlX2NtZHMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlRhcmdldCBidXN5XG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgaWYgKHF1ZXVlX2ZsYWcpCisgICAgICAgICAgICAgIHsKKwkJaW50IGRpZmY7CisJCXJlc3VsdCA9IHNjc2lfdHJhY2tfcXVldWVfZnVsbChjbWQtPmRldmljZSwKKwkJCSAgICAgICAJYWljX2Rldi0+YWN0aXZlX2NtZHMpOworCQlpZiAoIHJlc3VsdCA8IDAgKQorCQl7CisgICAgICAgICAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlRhZ2dlZCBDb21tYW5kIFF1ZXVlaW5nIGRpc2FibGVkLlxuIiwKKwkJCXAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisJCSAgZGlmZiA9IGFpY19kZXYtPm1heF9xX2RlcHRoIC0gcC0+aG9zdC0+Y21kX3Blcl9sdW47CisJCSAgYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gMTsKKwkJICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IDE7CisJCX0KKwkJZWxzZSBpZiAoIHJlc3VsdCA+IDAgKQorCQl7CisgICAgICAgICAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlF1ZXVlIGRlcHRoIHJlZHVjZWQgdG8gJWRcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpLCByZXN1bHQpOworCQkgIGRpZmYgPSBhaWNfZGV2LT5tYXhfcV9kZXB0aCAtIHJlc3VsdDsKKwkJICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IHJlc3VsdDsKKwkJICAvKiB0ZW1wX3FfZGVwdGggY291bGQgaGF2ZSBiZWVuIGRyb3BwZWQgdG8gMSBmb3IgYW4gdW50YWdnZWQKKwkJICAgKiBjb21tYW5kIHRoYXQgbWlnaHQgYmUgY29taW5nIHVwICovCisJCSAgaWYoYWljX2Rldi0+dGVtcF9xX2RlcHRoID4gcmVzdWx0KQorCQkgICAgYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gcmVzdWx0OworCQl9CisJCS8qIFdlIHNob3VsZCBmcmVlIHVwIHRoZSBubyB1bnVzZWQgU0NCIGVudHJpZXMuICBCdXQsIHRoYXQncworCQkgKiBhIGRpZmZpY3VsdCB0aGluZyB0byBkbyBiZWNhdXNlIHdlIHVzZSBhIGRpcmVjdCBpbmRleGVkCisJCSAqIGFycmF5LCBzbyB3ZSBjYW4ndCBqdXN0IHRha2UgYW55IGVudHJpZXMgYW5kIGZyZWUgdGhlbSwKKwkJICogd2UgKmhhdmUqIHRvIGZyZWUgdGhlIG9uZXMgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXksIGFuZAorCQkgKiB0aGV5IHZlcnkgd2VsbCBjb3VsZCBiZSBpbiB1c2UgcmlnaHQgbm93LCB3aGljaCBtZWFucworCQkgKiBpbiBvcmRlciB0byBkbyB0aGlzIHJpZ2h0LCB3ZSBoYXZlIHRvIGFkZCBhIGRlbGF5ZWQKKwkJICogZnJlZWluZyBtZWNoYW5pc20gdGllZCBpbnRvIHRoZSBzY2JfZnJlZSgpIGNvZGUgYXJlYS4KKwkJICogV2UnbGwgYWRkIHRoYXQgbGF0ZXIuCisJCSAqLworCSAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1NFUUlOVCkKKyAgICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJVbmV4cGVjdGVkIHRhcmdldCBzdGF0dXMgMHgleC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIHNjYi0+aHNjYi0+dGFyZ2V0X3N0YXR1cyk7CisgICAgICAgICAgICAgIGlmICghYWljN3h4eF9lcnJvcihjbWQpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljN3h4eF9lcnJvcihjbWQpID0gRElEX1JFVFJZX0NPTU1BTkQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSAgLyogZW5kIHN3aXRjaCAqLworICAgICAgICB9ICAvKiBlbmQgZWxzZSBvZiAqLworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFXQUlUSU5HX01TRzoKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXgsIG1zZ19vdXQ7CisKKyAgICAgICAgc2NiX2luZGV4ID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKyAgICAgICAgbXNnX291dCA9IGFpY19pbmIocCwgTVNHX09VVCk7CisgICAgICAgIHNjYiA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKwlhaWNfZGV2ID0gQUlDX0RFVihzY2ItPmNtZCk7CisgICAgICAgIHAtPm1zZ19pbmRleCA9IHAtPm1zZ19sZW4gPSAwOworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIFNDQiBoYWQgYSBNS19NRVNTQUdFIHNldCBpbiBpdHMgY29udHJvbCBieXRlIGluZm9ybWluZworICAgICAgICAgKiB0aGUgc2VxdWVuY2VyIHRoYXQgd2Ugd2FudGVkIHRvIHNlbmQgYSBzcGVjaWFsIG1lc3NhZ2UgdG8KKyAgICAgICAgICogdGhpcyB0YXJnZXQuCisgICAgICAgICAqLworCisgICAgICAgIGlmICggIShzY2ItPmZsYWdzICYgU0NCX0RFVklDRV9SRVNFVCkgJiYKKyAgICAgICAgICAgICAgKG1zZ19vdXQgPT0gTVNHX0lERU5USUZZRkxBRykgJiYKKyAgICAgICAgICAgICAgKHNjYi0+aHNjYi0+Y29udHJvbCAmIFRBR19FTkIpICkKKyAgICAgICAgeworICAgICAgICAgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gc2NiLT50YWdfYWN0aW9uOworICAgICAgICAgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4KytdID0gc2NiLT5oc2NiLT50YWc7CisgICAgICAgICAgcC0+bXNnX2xlbiArPSAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfREVWSUNFX1JFU0VUKQorICAgICAgICB7CisgICAgICAgICAgcC0+bXNnX2J1ZltwLT5tc2dfaW5kZXgrK10gPSBNU0dfQlVTX0RFVl9SRVNFVDsKKyAgICAgICAgICBwLT5tc2dfbGVuKys7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkJ1cyBkZXZpY2UgcmVzZXQgbWFpbGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX0FCT1JUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNjYi0+dGFnX2FjdGlvbikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19BQk9SVF9UQUc7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSA9IE1TR19BQk9SVDsKKyAgICAgICAgICB9CisgICAgICAgICAgcC0+bXNnX2xlbisrOworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX0FCT1JUX1BST0NFU1MpCisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJBYm9ydCBtZXNzYWdlIG1haWxlZC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfUFBSKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlNlbmRpbmcgUFBSICglZC8lZC8lZC8lZCkgbWVzc2FnZS5cbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwucGVyaW9kLAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGgsCisgICAgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljN3h4eF9jb25zdHJ1Y3RfcHByKHAsIHNjYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2NiLT5mbGFncyAmIFNDQl9NU0dPVVRfV0RUUikKKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJTZW5kaW5nIFdEVFIgbWVzc2FnZS5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljN3h4eF9jb25zdHJ1Y3Rfd2R0cihwLCBhaWNfZGV2LT5nb2FsLndpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX01TR09VVF9TRFRSKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9zeW5jLCBwZXJpb2Q7CisgICAgICAgICAgdW5zaWduZWQgY2hhciBvcHRpb25zID0gMDsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIE5vdyB0aGF0IHRoZSBkZXZpY2UgaXMgc2VsZWN0ZWQsIHVzZSB0aGUgYml0cyBpbiBTQkxLQ1RMIGFuZAorICAgICAgICAgICAqIFNTVEFUMiB0byBkZXRlcm1pbmUgdGhlIG1heCBzeW5jIHJhdGUgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYWljX2luYihwLCBTQkxLQ1RMKSAmIEVOQUI0MCkgJiYKKyAgICAgICAgICAgICAgICAhKGFpY19pbmIocCwgU1NUQVQyKSAmIEVYUF9BQ1RJVkUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWF4X3N5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkEyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtYXhfc3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgICAgICAgICAgeworICAgICAgICAgICAgbWF4X3N5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBtYXhfc3luYyA9IEFIQ19TWU5DUkFURV9GQVNUOworICAgICAgICAgIH0KKyAgICAgICAgICBwZXJpb2QgPSBhaWNfZGV2LT5nb2FsLnBlcmlvZDsKKyAgICAgICAgICBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJnBlcmlvZCwgbWF4X3N5bmMsICZvcHRpb25zKTsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU2VuZGluZyBTRFRSICVkLyVkIG1lc3NhZ2UuXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgICAgICAgIENUTF9PRl9TQ0Ioc2NiKSwgcGVyaW9kLAorICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljN3h4eF9jb25zdHJ1Y3Rfc2R0cihwLCBwZXJpb2QsIGFpY19kZXYtPmdvYWwub2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgcGFuaWMoImFpYzd4eHg6IEFXQUlUSU5HX01TRyBmb3IgYW4gU0NCIHRoYXQgZG9lcyAiCisgICAgICAgICAgICAgICAgIm5vdCBoYXZlIGEgd2FpdGluZyBtZXNzYWdlLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogV2UndmUgc2V0IGV2ZXJ5dGhpbmcgdXAgdG8gc2VuZCBvdXIgbWVzc2FnZSwgbm93IHRvIGFjdHVhbGx5IGRvCisgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gZW5hYmxlIHJlcWluaXQgaW50ZXJydXB0cyBhbmQgbGV0IHRoZSBpbnRlcnJ1cHQKKyAgICAgICAgICogaGFuZGxlciBkbyB0aGUgcmVzdC4gIFdlIGRvbid0IHdhbnQgdG8gdW5wYXVzZSB0aGUgc2VxdWVuY2VyIHlldAorICAgICAgICAgKiB0aG91Z2ggc28gd2UnbGwgcmV0dXJuIGVhcmx5LiAgV2UgYWxzbyBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAqIHdlIGNsZWFyIHRoZSBTRVFJTlQgKkJFRk9SRSogd2Ugc2V0IHRoZSBSRVFJTklUIGhhbmRsZXIgYWN0aXZlCisgICAgICAgICAqIG9yIGVsc2UgaXQncyBwb3NzaWJsZSBvbiBWTEIgY2FyZHMgdG8gbG9zZSB0aGUgZmlyc3QgUkVRSU5JVAorICAgICAgICAgKiBpbnRlcnJ1cHQuICBFZGdlIHRyaWdnZXJlZCBFSVNBIGNhcmRzIGNvdWxkIGFsc28gbG9zZSB0aGlzCisgICAgICAgICAqIGludGVycnVwdCwgYWx0aG91Z2ggUENJIGFuZCBsZXZlbCB0cmlnZ2VyZWQgY2FyZHMgc2hvdWxkIG5vdAorICAgICAgICAgKiBoYXZlIHRoaXMgcHJvYmxlbSBzaW5jZSB0aGV5IGNvbnRpbnVhbGx5IGludGVycnVwdCB0aGUga2VybmVsCisgICAgICAgICAqIHVudGlsIHdlIHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1NFTlQ7CisgICAgICAgIHAtPm1zZ19pbmRleCA9IDA7CisgICAgICAgIHAtPm1zZ190eXBlID0gTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDsKKyAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNJTU9ERTEpIHwgRU5SRVFJTklULCBTSU1PREUxKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERBVEFfT1ZFUlJVTjoKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICAgICAgICB1bnNpZ25lZCBjaGFyIGxhc3RwaGFzZSA9IGFpY19pbmIocCwgTEFTVFBIQVNFKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAgICAgc2NiID0gKHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFhYWCAtIFdoYXQgZG8gd2UgcmVhbGx5IHdhbnQgdG8gZG8gb24gYW4gb3ZlcnJ1bj8gIFRoZQorICAgICAgICAgKiAgICAgICBtaWQtbGV2ZWwgU0NTSSBjb2RlIHNob3VsZCBoYW5kbGUgdGhpcywgYnV0IGZvciBub3csCisgICAgICAgICAqICAgICAgIHdlJ2xsIGp1c3QgaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcmV0cmllZC4KKyAgICAgICAgICogICAgSWYgd2UgcmV0cmlldmVkIHNlbnNlIGluZm8gb24gdGhpcyB0YXJnZXQsIHRoZW4gdGhlIAorICAgICAgICAgKiAgICBiYXNlIFNFTlNFIGluZm8gc2hvdWxkIGhhdmUgYmVlbiBzYXZlZCBwcmlvciB0byB0aGUKKyAgICAgICAgICogICAgb3ZlcnJ1biBlcnJvci4gIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuIERJRF9PSyBhbmQgbGV0CisgICAgICAgICAqICAgIHRoZSBtaWQgbGV2ZWwgY29kZSBwaWNrIHVwIG9uIHRoZSBzZW5zZSBpbmZvLiAgT3RoZXJ3aXNlCisgICAgICAgICAqICAgIHdlIHJldHVybiBESURfRVJST1Igc28gdGhlIGNvbW1hbmQgd2lsbCBnZXQgcmV0cmllZC4KKyAgICAgICAgICovCisgICAgICAgIGlmICggIShzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoV0FSTl9MRUFEICJEYXRhIG92ZXJydW4gZGV0ZWN0ZWQgaW4gJXMgcGhhc2UsIHRhZyAlZDtcbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIAorICAgICAgICAgICAgKGxhc3RwaGFzZSA9PSBQX0RBVEFJTikgPyAiRGF0YS1JbiIgOiAiRGF0YS1PdXQiLCBzY2ItPmhzY2ItPnRhZyk7CisgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICAlcyBzZWVuIERhdGEgUGhhc2UuIExlbmd0aD0lZCwgTnVtU0dzPSVkLlxuIiwKKyAgICAgICAgICAgIChhaWNfaW5iKHAsIFNFUV9GTEFHUykgJiBEUEhBU0UpID8gIkhhdmUiIDogIkhhdmVuJ3QiLAorICAgICAgICAgICAgc2NiLT5zZ19sZW5ndGgsIHNjYi0+c2dfY291bnQpOworICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiAgUmF3IFNDU0kgQ29tbWFuZDogMHgiKTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2NiLT5oc2NiLT5TQ1NJX2NtZF9sZW5ndGg7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIiUwMnggIiwgc2NiLT5jbWQtPmNtbmRbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgc2dbJWRdIC0gQWRkciAweCV4IDogTGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgICBpLCAKKyAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W2ldLmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbaV0ubGVuZ3RoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBhaWM3eHh4X2Vycm9yKHNjYi0+Y21kKSA9IERJRF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiRGF0YSBPdmVycnVuIGR1cmluZyBTRU5EX1NFTlNFIG9wZXJhdGlvbi5cbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdJREVfUkVTSURVRToKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciByZXNpZF9zZ2NudCwgaW5kZXg7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2NiX2luZGV4ID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGN1cl9hZGRyLCByZXNpZF9kY250OworICAgICAgICB1bnNpZ25lZCBpbnQgbmF0aXZlX2FkZHIsIG5hdGl2ZV9sZW5ndGgsIHNnX2FkZHI7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmKHNjYl9pbmRleCA+IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiaW52YWxpZCBzY2JfaW5kZXggZHVyaW5nIFdJREVfUkVTSURVRS5cbiIsCisgICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIFhYWDogQWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2IgPSBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W3NjYl9pbmRleF07CisgICAgICAgIGlmKCEoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpIHx8IChzY2ItPmNtZCA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhXQVJOX0xFQUQgImludmFsaWQgc2NiIGR1cmluZyBXSURFX1JFU0lEVUUgZmxhZ3M6MHgleCAiCisgICAgICAgICAgICAgICAgICJzY2ItPmNtZDoweCVseFxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLAorICAgICAgICAgICAgICAgICBzY2ItPmZsYWdzLCAodW5zaWduZWQgbG9uZylzY2ItPmNtZCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9NSU5PUl9FUlJPUikKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJHb3QgV0lERV9SRVNJRFVFIG1lc3NhZ2UsIHBhdGNoaW5nIHVwIGRhdGEgIgorICAgICAgICAgICAgICAgICAicG9pbnRlci5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgaGF2ZSBhIHZhbGlkIHNjYiB0byB1c2Ugb24gdGhpcyBXSURFX1JFU0lEVUUgbWVzc2FnZSwgc28KKyAgICAgICAgICogd2UgbmVlZCB0byB3YWxrIHRoZSBzZyBsaXN0IGxvb2tpbmcgZm9yIHRoaXMgcGFydGljdWxhciBzZworICAgICAgICAgKiBzZWdtZW50LCB0aGVuIHNlZSBpZiB3ZSBoYXBwZW4gdG8gYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCisgICAgICAgICAqIHRoZSBzZWdtZW50LiAgSWYgd2UgYXJlLCB0aGVuIHdlIGhhdmUgdG8gYmFjayB0aGluZ3MgdXAgdG8KKyAgICAgICAgICogdGhlIHByZXZpb3VzIHNlZ21lbnQuICBJZiBub3QsIHRoZW4gd2Ugc2ltcGx5IG5lZWQgdG8gcmVtb3ZlCisgICAgICAgICAqIG9uZSBieXRlIGZyb20gdGhpcyBzZWdtZW50cyBhZGRyZXNzIGFuZCBhZGQgb25lIHRvIHRoZSBieXRlCisgICAgICAgICAqIGNvdW50LgorICAgICAgICAgKi8KKyAgICAgICAgY3VyX2FkZHIgPSBhaWNfaW5iKHAsIFNIQUREUikgfCAoYWljX2luYihwLCBTSEFERFIgKyAxKSA8PCA4KSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0hBRERSICsgMikgPDwgMTYpIHwgKGFpY19pbmIocCwgU0hBRERSICsgMykgPDwgMjQpOworICAgICAgICBzZ19hZGRyID0gYWljX2luYihwLCBTR19DT1VOVCArIDEpIHwgKGFpY19pbmIocCwgU0dfQ09VTlQgKyAyKSA8PCA4KSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0dfQ09VTlQgKyAzKSA8PCAxNikgfCAoYWljX2luYihwLCBTR19DT1VOVCArIDQpIDw8IDI0KTsKKyAgICAgICAgcmVzaWRfc2djbnQgPSBhaWNfaW5iKHAsIFNDQl9SRVNJRF9TR0NOVCk7CisgICAgICAgIHJlc2lkX2RjbnQgPSBhaWNfaW5iKHAsIFNDQl9SRVNJRF9EQ05UKSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0NCX1JFU0lEX0RDTlQgKyAxKSA8PCA4KSB8CisgICAgICAgICAgKGFpY19pbmIocCwgU0NCX1JFU0lEX0RDTlQgKyAyKSA8PCAxNik7CisgICAgICAgIGluZGV4ID0gc2NiLT5zZ19jb3VudCAtICgocmVzaWRfc2djbnQpID8gcmVzaWRfc2djbnQgOiAxKTsKKyAgICAgICAgbmF0aXZlX2FkZHIgPSBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbaW5kZXhdLmFkZHJlc3MpOworICAgICAgICBuYXRpdmVfbGVuZ3RoID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W2luZGV4XS5sZW5ndGgpOworICAgICAgICAvKgorICAgICAgICAgKiBJZiByZXNpZF9kY250ID09IG5hdGl2ZV9sZW5ndGgsIHRoZW4gd2UganVzdCBsb2FkZWQgdGhpcyBTRworICAgICAgICAgKiBzZWdtZW50IGFuZCB3ZSBuZWVkIHRvIGJhY2sgaXQgdXAgb25lLi4uCisgICAgICAgICAqLworICAgICAgICBpZihyZXNpZF9kY250ID09IG5hdGl2ZV9sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICBpZihpbmRleCA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPb3BzLCB0aGlzIGlzbid0IHJpZ2h0LCB3ZSBjYW4ndCBiYWNrIHVwIHRvIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAqIGJlZ2lubmluZy4gIFRoaXMgbXVzdCBiZSBhIGJvZ3VzIG1lc3NhZ2UsIGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc2lkX2RjbnQgPSAxOworICAgICAgICAgIHJlc2lkX3NnY250ICs9IDE7CisgICAgICAgICAgbmF0aXZlX2FkZHIgPSBsZTMyX3RvX2NwdShzY2ItPnNnX2xpc3RbaW5kZXggLSAxXS5hZGRyZXNzKTsKKyAgICAgICAgICBuYXRpdmVfbGVuZ3RoID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W2luZGV4IC0gMV0ubGVuZ3RoKTsKKyAgICAgICAgICBjdXJfYWRkciA9IG5hdGl2ZV9hZGRyICsgKG5hdGl2ZV9sZW5ndGggLSAxKTsKKyAgICAgICAgICBzZ19hZGRyIC09IHNpemVvZihzdHJ1Y3QgaHdfc2NhdHRlcmxpc3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogcmVzaWRfZGNudCAhPSBuYXRpdmVfbGVuZ3RoLCBzbyB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIFNHCisgICAgICAgICAgICogZWxlbWVudC4gIEJhY2sgaXQgdXAgb25lIGJ5dGUgYW5kIGxlYXZlIHRoZSByZXN0IGFsb25lLgorICAgICAgICAgICAqLworICAgICAgICAgIHJlc2lkX2RjbnQgKz0gMTsKKyAgICAgICAgICBjdXJfYWRkciAtPSAxOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBPdXRwdXQgdGhlIG5ldyBhZGRyZXNzZXMgYW5kIGNvdW50cyB0byB0aGUgcmlnaHQgcGxhY2VzIG9uIHRoZQorICAgICAgICAgKiBjYXJkLgorICAgICAgICAgKi8KKyAgICAgICAgYWljX291dGIocCwgcmVzaWRfc2djbnQsIFNHX0NPVU5UKTsKKyAgICAgICAgYWljX291dGIocCwgcmVzaWRfc2djbnQsIFNDQl9SRVNJRF9TR0NOVCk7CisgICAgICAgIGFpY19vdXRiKHAsIHNnX2FkZHIgJiAweGZmLCBTR19DT1VOVCArIDEpOworICAgICAgICBhaWNfb3V0YihwLCAoc2dfYWRkciA+PiA4KSAmIDB4ZmYsIFNHX0NPVU5UICsgMik7CisgICAgICAgIGFpY19vdXRiKHAsIChzZ19hZGRyID4+IDE2KSAmIDB4ZmYsIFNHX0NPVU5UICsgMyk7CisgICAgICAgIGFpY19vdXRiKHAsIChzZ19hZGRyID4+IDI0KSAmIDB4ZmYsIFNHX0NPVU5UICsgNCk7CisgICAgICAgIGFpY19vdXRiKHAsIHJlc2lkX2RjbnQgJiAweGZmLCBTQ0JfUkVTSURfRENOVCk7CisgICAgICAgIGFpY19vdXRiKHAsIChyZXNpZF9kY250ID4+IDgpICYgMHhmZiwgU0NCX1JFU0lEX0RDTlQgKyAxKTsKKyAgICAgICAgYWljX291dGIocCwgKHJlc2lkX2RjbnQgPj4gMTYpICYgMHhmZiwgU0NCX1JFU0lEX0RDTlQgKyAyKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgc2VxdWVuY2VyIGFjdHVhbGx5IHdhbnRzIHRvIGZpbmQgdGhlIG5ldyBhZGRyZXNzCisgICAgICAgICAqIGluIHRoZSBTSEFERFIgcmVnaXN0ZXIgc2V0LiAgT24gdGhlIFVsdHJhMiBhbmQgbGF0ZXIgY29udHJvbGxlcnMKKyAgICAgICAgICogdGhpcyByZWdpc3RlciBzZXQgaXMgcmVhZG9ubHkuICBJbiBvcmRlciB0byBnZXQgdGhlIHJpZ2h0IG51bWJlcgorICAgICAgICAgKiBpbnRvIHRoZSByZWdpc3RlciwgeW91IGFjdHVhbGx5IGhhdmUgdG8gZW50ZXIgaXQgaW4gSEFERFIgYW5kIHRoZW4KKyAgICAgICAgICogdXNlIHRoZSBQUkVMT0FERU4gYml0IG9mIERGQ05UUkwgdG8gZHJvcCBpdCB0aHJvdWdoIGZyb20gdGhlCisgICAgICAgICAqIEhBRERSIHJlZ2lzdGVyIHRvIHRoZSBTSEFERFIgcmVnaXN0ZXIuICBPbiBub24tVWx0cmEyIGNvbnRyb2xsZXJzLAorICAgICAgICAgKiB3ZSBzaW1wbHkgd3JpdGUgaXQgZGlyZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgICB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBXZSBtaWdodCBhcyB3ZWxsIGJlIGFjY3VyYXRlIGFuZCBkcm9wIGJvdGggdGhlIHJlc2lkX2RjbnQgYW5kCisgICAgICAgICAgICogY3VyX2FkZHIgaW50byBIQ05UIGFuZCBIQUREUiBhbmQgaGF2ZSBib3RoIG9mIHRoZW0gZHJvcAorICAgICAgICAgICAqIHRocm91Z2ggdG8gdGhlIHNoYWRvdyBsYXllciB0b2dldGhlci4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWNfb3V0YihwLCByZXNpZF9kY250ICYgMHhmZiwgSENOVCk7CisgICAgICAgICAgYWljX291dGIocCwgKHJlc2lkX2RjbnQgPj4gOCkgJiAweGZmLCBIQ05UICsgMSk7CisgICAgICAgICAgYWljX291dGIocCwgKHJlc2lkX2RjbnQgPj4gMTYpICYgMHhmZiwgSENOVCArIDIpOworICAgICAgICAgIGFpY19vdXRiKHAsIGN1cl9hZGRyICYgMHhmZiwgSEFERFIpOworICAgICAgICAgIGFpY19vdXRiKHAsIChjdXJfYWRkciA+PiA4KSAmIDB4ZmYsIEhBRERSICsgMSk7CisgICAgICAgICAgYWljX291dGIocCwgKGN1cl9hZGRyID4+IDE2KSAmIDB4ZmYsIEhBRERSICsgMik7CisgICAgICAgICAgYWljX291dGIocCwgKGN1cl9hZGRyID4+IDI0KSAmIDB4ZmYsIEhBRERSICsgMyk7CisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBETUFQQVJBTVMpIHwgUFJFTE9BREVOLCBERkNOVFJMKTsKKyAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBETUFQQVJBTVMpICYgfihTQ1NJRU58SERNQUVOKSwgREZDTlRSTCk7CisgICAgICAgICAgaT0wOworICAgICAgICAgIHdoaWxlKCgoYWljX2luYihwLCBERkNOVFJMKSAmIChTQ1NJRU58SERNQUVOKSkgIT0gMCkgJiYgKGkrKyA8IDEwMDApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYWljX291dGIocCwgY3VyX2FkZHIgJiAweGZmLCBTSEFERFIpOworICAgICAgICAgIGFpY19vdXRiKHAsIChjdXJfYWRkciA+PiA4KSAmIDB4ZmYsIFNIQUREUiArIDEpOworICAgICAgICAgIGFpY19vdXRiKHAsIChjdXJfYWRkciA+PiAxNikgJiAweGZmLCBTSEFERFIgKyAyKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCAoY3VyX2FkZHIgPj4gMjQpICYgMHhmZiwgU0hBRERSICsgMyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTRVFfU0dfRklYVVA6CisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXgsIHRtcDsKKyAgICAgIGludCBzZ19hZGRyLCBzZ19sZW5ndGg7CisKKyAgICAgIHNjYl9pbmRleCA9IGFpY19pbmIocCwgU0NCX1RBRyk7CisKKyAgICAgIGlmKHNjYl9pbmRleCA+IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICJpbnZhbGlkIHNjYl9pbmRleCBkdXJpbmcgU0VRX1NHX0ZJWFVQLlxuIiwKKyAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xKTsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NTSVNJR0kgMHgleCwgU0VRQUREUiAweCV4LCBTU1RBVDAgMHgleCwgU1NUQVQxICIKKyAgICAgICAgICAgIjB4JXhcbiIsIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEsCisgICAgICAgICAgIGFpY19pbmIocCwgU0NTSVNJR0kpLAorICAgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgICAgYWljX2luYihwLCBTU1RBVDApLCBhaWNfaW5iKHAsIFNTVEFUMSkpOworICAgICAgICBwcmludGsoSU5GT19MRUFEICJTR19DQUNIRVBUUiAweCV4LCBTU1RBVDIgMHgleCwgU1RDTlQgMHgleFxuIiwKKyAgICAgICAgICAgcC0+aG9zdF9ubywgLTEsIC0xLCAtMSwgYWljX2luYihwLCBTR19DQUNIRVBUUiksCisgICAgICAgICAgIGFpY19pbmIocCwgU1NUQVQyKSwgYWljX2luYihwLCBTVENOVCArIDIpIDw8IDE2IHwKKyAgICAgICAgICAgYWljX2luYihwLCBTVENOVCArIDEpIDw8IDggfCBhaWNfaW5iKHAsIFNUQ05UKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFhYWDogQWRkIGVycm9yIGhhbmRsaW5nIGhlcmUKKyAgICAgICAgICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2NiID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JfaW5kZXhdOworICAgICAgaWYoIShzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgfHwgKHNjYi0+Y21kID09IE5VTEwpKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICJpbnZhbGlkIHNjYiBkdXJpbmcgU0VRX1NHX0ZJWFVQIGZsYWdzOjB4JXggIgorICAgICAgICAgICAgICAgInNjYi0+Y21kOjB4JXBcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgICAgICAgIHNjYi0+ZmxhZ3MsIHNjYi0+Y21kKTsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NTSVNJR0kgMHgleCwgU0VRQUREUiAweCV4LCBTU1RBVDAgMHgleCwgU1NUQVQxICIKKyAgICAgICAgICAgIjB4JXhcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgICAgYWljX2luYihwLCBTQ1NJU0lHSSksCisgICAgICAgICAgIGFpY19pbmIocCwgU0VRQUREUjApIHwgKGFpY19pbmIocCwgU0VRQUREUjEpIDw8IDgpLAorICAgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMCksIGFpY19pbmIocCwgU1NUQVQxKSk7CisgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlNHX0NBQ0hFUFRSIDB4JXgsIFNTVEFUMiAweCV4LCBTVENOVCAweCV4XG4iLAorICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpLAorICAgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMiksIGFpY19pbmIocCwgU1RDTlQgKyAyKSA8PCAxNiB8CisgICAgICAgICAgIGFpY19pbmIocCwgU1RDTlQgKyAxKSA8PCA4IHwgYWljX2luYihwLCBTVENOVCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTUlOT1JfRVJST1IpCisgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkZpeGluZyB1cCBTRyBhZGRyZXNzIGZvciBzZXF1ZW5jZXIuXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAgICAgICAgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIC8qCisgICAgICAgKiBBZHZhbmNlIHRoZSBTRyBwb2ludGVyIHRvIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3QKKyAgICAgICAqLworICAgICAgdG1wID0gYWljX2luYihwLCBTR19ORVhUKTsKKyAgICAgIHRtcCArPSBTR19TSVpFT0Y7CisgICAgICBhaWNfb3V0YihwLCB0bXAsIFNHX05FWFQpOworICAgICAgaWYoIHRtcCA8IFNHX1NJWkVPRiApCisgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0dfTkVYVCArIDEpICsgMSwgU0dfTkVYVCArIDEpOworICAgICAgdG1wID0gYWljX2luYihwLCBTR19DT1VOVCkgLSAxOworICAgICAgYWljX291dGIocCwgdG1wLCBTR19DT1VOVCk7CisgICAgICBzZ19hZGRyID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W3NjYi0+c2dfY291bnQgLSB0bXBdLmFkZHJlc3MpOworICAgICAgc2dfbGVuZ3RoID0gbGUzMl90b19jcHUoc2NiLT5zZ19saXN0W3NjYi0+c2dfY291bnQgLSB0bXBdLmxlbmd0aCk7CisgICAgICAvKgorICAgICAgICogTm93IHN0dWZmIHRoZSBlbGVtZW50IHdlIGp1c3QgYWR2YW5jZWQgcGFzdCBkb3duIG9udG8gdGhlCisgICAgICAgKiBjYXJkIHNvIGl0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIHJlc2lkdWFsIGFyZWEuCisgICAgICAgKi8KKyAgICAgIGFpY19vdXRiKHAsIHNnX2FkZHIgJiAweGZmLCBIQUREUik7CisgICAgICBhaWNfb3V0YihwLCAoc2dfYWRkciA+PiA4KSAmIDB4ZmYsIEhBRERSICsgMSk7CisgICAgICBhaWNfb3V0YihwLCAoc2dfYWRkciA+PiAxNikgJiAweGZmLCBIQUREUiArIDIpOworICAgICAgYWljX291dGIocCwgKHNnX2FkZHIgPj4gMjQpICYgMHhmZiwgSEFERFIgKyAzKTsKKyAgICAgIGFpY19vdXRiKHAsIHNnX2xlbmd0aCAmIDB4ZmYsIEhDTlQpOworICAgICAgYWljX291dGIocCwgKHNnX2xlbmd0aCA+PiA4KSAmIDB4ZmYsIEhDTlQgKyAxKTsKKyAgICAgIGFpY19vdXRiKHAsIChzZ19sZW5ndGggPj4gMTYpICYgMHhmZiwgSENOVCArIDIpOworICAgICAgYWljX291dGIocCwgKHRtcCA8PCAyKSB8ICgodG1wID09IDEpID8gTEFTVF9TRUcgOiAwKSwgU0dfQ0FDSEVQVFIpOworICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBETUFQQVJBTVMpLCBERkNOVFJMKTsKKyAgICAgIHdoaWxlKGFpY19pbmIocCwgU1NUQVQwKSAmIFNET05FKSB1ZGVsYXkoMSk7CisgICAgICB3aGlsZShhaWNfaW5iKHAsIERGQ05UUkwpICYgKEhETUFFTnxTQ1NJRU4pKSBhaWNfb3V0YihwLCAwLCBERkNOVFJMKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyNpZmRlZiBBSUM3WFhYX05PVF9ZRVQgCisgICAgY2FzZSBUUkFDRVBPSU5UMjoKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiVHJhY2Vwb2ludCAjMiByZWFjaGVkLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgIGNoYW5uZWwsIHRhcmdldCwgbHVuKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgLyogWFhYIEZpbGwgdGhlc2UgaW4gbGF0ZXIgKi8KKyAgICBjYXNlIE1TR19CVUZGRVJfQlVTWToKKyAgICAgIHByaW50aygiYWljN3h4eDogTWVzc2FnZSBidWZmZXIgYnVzeS5cbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNU0dJTl9QSEFTRU1JUzoKKyAgICAgIHByaW50aygiYWljN3h4eDogTWVzc2FnZS1pbiBwaGFzZW1pcy5cbiIpOworICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIC8qIHVua25vd24gKi8KKyAgICAgIHByaW50ayhXQVJOX0xFQUQgIlVua25vd24gU0VRSU5ULCBJTlRTVEFUIDB4JXgsIFNDU0lTSUdJIDB4JXguXG4iLAorICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgbHVuLCBpbnRzdGF0LAorICAgICAgICAgICAgIGFpY19pbmIocCwgU0NTSVNJR0kpKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyoKKyAgICogQ2xlYXIgdGhlIHNlcXVlbmNlciBpbnRlcnJ1cHQgYW5kIHVucGF1c2UgdGhlIHNlcXVlbmNlci4KKyAgICovCisgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIC8qIHVucGF1c2UgYWx3YXlzICovIFRSVUUpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcGFyc2VfbXNnCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFBhcnNlcyBpbmNvbWluZyBtZXNzYWdlcyBpbnRvIGFjdGlvbnMgb24gYmVoYWxmIG9mCisgKiAgIGFpYzd4eHhfaGFuZGxlX3JlcWluaXQKKyAqX0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9wYXJzZV9tc2coc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIGludCByZWplY3QsIHJlcGx5LCBkb25lOworICB1bnNpZ25lZCBjaGFyIHRhcmdldF9zY3NpcmF0ZSwgdGluZGV4OworICB1bnNpZ25lZCBzaG9ydCB0YXJnZXRfbWFzazsKKyAgdW5zaWduZWQgY2hhciB0YXJnZXQsIGNoYW5uZWwsIGx1bjsKKyAgdW5zaWduZWQgY2hhciBidXNfd2lkdGgsIG5ld19idXNfd2lkdGg7CisgIHVuc2lnbmVkIGNoYXIgdHJhbnNfb3B0aW9ucywgbmV3X3RyYW5zX29wdGlvbnM7CisgIHVuc2lnbmVkIGludCBwZXJpb2QsIG5ld19wZXJpb2QsIG9mZnNldCwgbmV3X29mZnNldCwgbWF4c3luYzsKKyAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNyYXRlOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIHRhcmdldCA9IHNjYi0+Y21kLT5kZXZpY2UtPmlkOworICBjaGFubmVsID0gc2NiLT5jbWQtPmRldmljZS0+Y2hhbm5lbDsKKyAgbHVuID0gc2NiLT5jbWQtPmRldmljZS0+bHVuOworICByZXBseSA9IHJlamVjdCA9IGRvbmUgPSBGQUxTRTsKKyAgdGluZGV4ID0gVEFSR0VUX0lOREVYKHNjYi0+Y21kKTsKKyAgYWljX2RldiA9IEFJQ19ERVYoc2NiLT5jbWQpOworICB0YXJnZXRfc2NzaXJhdGUgPSBhaWNfaW5iKHAsIFRBUkdfU0NTSVJBVEUgKyB0aW5kZXgpOworICB0YXJnZXRfbWFzayA9ICgweDAxIDw8IHRpbmRleCk7CisKKyAgLyoKKyAgICogUGFyc2UgYXMgbXVjaCBvZiB0aGUgbWVzc2FnZSBhcyBpcyBhdmFpbGFibGUsCisgICAqIHJlamVjdGluZyBpdCBpZiB3ZSBkb24ndCBzdXBwb3J0IGl0LiAgV2hlbgorICAgKiB0aGUgZW50aXJlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGFuZCBoYXMgYmVlbgorICAgKiBoYW5kbGVkLCByZXR1cm4gVFJVRSBpbmRpY2F0aW5nIHRoYXQgd2UgaGF2ZQorICAgKiBwYXJzZWQgYW4gZW50aXJlIG1lc3NhZ2UuCisgICAqLworCisgIGlmIChwLT5tc2dfYnVmWzBdICE9IE1TR19FWFRFTkRFRCkKKyAgeworICAgIHJlamVjdCA9IFRSVUU7CisgIH0KKworICAvKgorICAgKiBFdmVuIGlmIHdlIGFyZSBhbiBVbHRyYTMgY2FyZCwgZG9uJ3QgYWxsb3cgVWx0cmEzIHN5bmMgcmF0ZXMgd2hlbgorICAgKiB1c2luZyB0aGUgU0RUUiBtZXNzYWdlcy4gIFdlIG5lZWQgdGhlIFBQUiBtZXNzYWdlcyB0byBlbmFibGUgdGhlCisgICAqIGhpZ2hlciBzcGVlZHMgdGhhdCBpbmNsdWRlIHRoaW5ncyBsaWtlIER1YWwgRWRnZSBjbG9ja2luZy4KKyAgICovCisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBpZiAoIChhaWNfaW5iKHAsIFNCTEtDVEwpICYgRU5BQjQwKSAmJgorICAgICAgICAgIShhaWNfaW5iKHAsIFNTVEFUMikgJiBFWFBfQUNUSVZFKSApCisgICAgeworICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMykKKyAgICAgICAgbWF4c3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTM7CisgICAgICBlbHNlCisgICAgICAgIG1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkEyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbWF4c3luYyA9IEFIQ19TWU5DUkFURV9VTFRSQTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgIHsKKyAgICBtYXhzeW5jID0gQUhDX1NZTkNSQVRFX1VMVFJBOworICB9CisgIGVsc2UKKyAgeworICAgIG1heHN5bmMgPSBBSENfU1lOQ1JBVEVfRkFTVDsKKyAgfQorCisgIC8qCisgICAqIEp1c3QgYWNjZXB0IHRoZSBsZW5ndGggYnl0ZSBvdXRyaWdodCBhbmQgcGVyZm9ybQorICAgKiBtb3JlIGNoZWNraW5nIG9uY2Ugd2Uga25vdyB0aGUgbWVzc2FnZSB0eXBlLgorICAgKi8KKworICBpZiAoICFyZWplY3QgJiYgKHAtPm1zZ19sZW4gPiAyKSApCisgIHsKKyAgICBzd2l0Y2gocC0+bXNnX2J1ZlsyXSkKKyAgICB7CisgICAgICBjYXNlIE1TR19FWFRfU0RUUjoKKyAgICAgIHsKKyAgICAgICAgCisgICAgICAgIGlmIChwLT5tc2dfYnVmWzFdICE9IE1TR19FWFRfU0RUUl9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPCAoTVNHX0VYVF9TRFRSX0xFTiArIDIpKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwZXJpb2QgPSBuZXdfcGVyaW9kID0gcC0+bXNnX2J1ZlszXTsKKyAgICAgICAgb2Zmc2V0ID0gbmV3X29mZnNldCA9IHAtPm1zZ19idWZbNF07CisgICAgICAgIHRyYW5zX29wdGlvbnMgPSBuZXdfdHJhbnNfb3B0aW9ucyA9IDA7CisgICAgICAgIGJ1c193aWR0aCA9IG5ld19idXNfd2lkdGggPSB0YXJnZXRfc2NzaXJhdGUgJiBXSURFWEZFUjsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBvdXIgY3VycmVudCBtYXggc3luY3JhdGUgaXMgaW4gdGhlIFVsdHJhMyByYW5nZSwgYnVtcCBpdCBiYWNrCisgICAgICAgICAqIGRvd24gdG8gVWx0cmEyIHNpbmNlIHdlIGNhbid0IG5lZ290aWF0ZSBEVCB0cmFuc2ZlcnMgdXNpbmcgU0RUUgorICAgICAgICAgKi8KKyAgICAgICAgaWYobWF4c3luYyA9PSBBSENfU1lOQ1JBVEVfVUxUUkEzKQorICAgICAgICAgIG1heHN5bmMgPSBBSENfU1lOQ1JBVEVfVUxUUkEyOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdlIG1pZ2h0IGhhdmUgYSBkZXZpY2UgdGhhdCBpcyBzdGFydGluZyBuZWdvdGlhdGlvbiB3aXRoIHVzCisgICAgICAgICAqIGJlZm9yZSB3ZSBjYW4gc3RhcnQgdXAgbmVnb3RpYXRpb24gd2l0aCBpdC4uLi5iZSBwcmVwYXJlZCB0bworICAgICAgICAgKiBoYXZlIGEgZGV2aWNlIGFzayBmb3IgYSBoaWdoZXIgc3BlZWQgdGhlbiB3ZSB3YW50IHRvIGdpdmUgaXQKKyAgICAgICAgICogaW4gdGhhdCBjYXNlCisgICAgICAgICAqLworICAgICAgICBpZiAoIChzY2ItPmZsYWdzICYgKFNDQl9NU0dPVVRfU0VOVHxTQ0JfTVNHT1VUX1NEVFIpKSAhPQorICAgICAgICAgICAgIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9TRFRSKSApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIShhaWNfZGV2LT5mbGFncyAmIERFVklDRV9EVFJfU0NBTk5FRCkpCisgICAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdlIHNob3VsZG4ndCBnZXQgaGVyZSB1bmxlc3MgdGhpcyBpcyBhIG5hcnJvdyBkcml2ZSwgd2lkZQorICAgICAgICAgICAgICogZGV2aWNlcyBzaG91bGQgdHJpZ2dlciB0aGlzIHNhbWUgc2VjdGlvbiBvZiBjb2RlIGluIHRoZSBXRFRSCisgICAgICAgICAgICAgKiBoYW5kbGVyIGZpcnN0IGluc3RlYWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUOworICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgICAgICAgIGlmKHAtPnVzZXJbdGluZGV4XS5vZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAxOworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IG1heF90KHVuc2lnbmVkIGNoYXIsIDEwLHAtPnVzZXJbdGluZGV4XS5wZXJpb2QpOworICAgICAgICAgICAgICBpZihwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfVUxUUkEyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAwOworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IDI1NTsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWljX2Rldi0+ZmxhZ3MgfD0gREVWSUNFX0RUUl9TQ0FOTkVEIHwgREVWSUNFX1BSSU5UX0RUUjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYWljX2Rldi0+bmVlZHNkdHJfY29weSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcHJlZW1wdGl2ZSBtZXNzYWdlIGZyb20gdGhlIHRhcmdldCwgd2UndmUgYWxyZWFkeQorICAgICAgICAgICAgICogc2Nhbm5lZCB0aGlzIHRhcmdldCBhbmQgc2V0IG91ciBvcHRpb25zIGZvciBpdCwgYW5kIHdlCisgICAgICAgICAgICAgKiBkb24ndCBuZWVkIGEgU0RUUiB3aXRoIHRoaXMgdGFyZ2V0IChmb3Igd2hhdGV2ZXIgcmVhc29uKSwKKyAgICAgICAgICAgICAqIHNvIHJlamVjdCB0aGlzIGluY29taW5nIFNEVFIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVqZWN0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRoZSBkZXZpY2UgaXMgc2VuZGluZyB0aGlzIG1lc3NhZ2UgZmlyc3QgYW5kIHdlIGhhdmUgdG8gcmVwbHkgKi8KKyAgICAgICAgICByZXBseSA9IFRSVUU7CisgICAgICAgICAgCisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlJlY2VpdmVkIHByZS1lbXB0aXZlIFNEVFIgbWVzc2FnZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAidGFyZ2V0LlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBWYWxpZGF0ZSB0aGUgdmFsdWVzIHRoZSBkZXZpY2UgcGFzc2VkIHRvIHVzIGFnYWluc3Qgb3VyIFNFRVBST00KKyAgICAgICAgICAgKiBzZXR0aW5ncy4gIFdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyBpZiB3ZSBhcmVuJ3QgcmVwbHlpbmcgc2luY2UKKyAgICAgICAgICAgKiB0aGUgZGV2aWNlIGlzbid0IGFsbG93ZWQgdG8gc2VuZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRoZSBvbmVzCisgICAgICAgICAgICogd2UgZmlyc3Qgc2VudCB0byBpdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBuZXdfcGVyaW9kID0gbWF4X3QodW5zaWduZWQgaW50LCBwZXJpb2QsIGFpY19kZXYtPmdvYWwucGVyaW9kKTsKKyAgICAgICAgICBuZXdfb2Zmc2V0ID0gbWluX3QodW5zaWduZWQgaW50LCBvZmZzZXQsIGFpY19kZXYtPmdvYWwub2Zmc2V0KTsKKyAgICAgICAgfQorIAorICAgICAgICAvKgorICAgICAgICAgKiBVc2Ugb3VyIG5ld19wZXJpb2QsIG5ld19vZmZzZXQsIGJ1c193aWR0aCwgYW5kIGNhcmQgb3B0aW9ucworICAgICAgICAgKiB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBzeW5jcmF0ZSBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgc3luY3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJm5ld19wZXJpb2QsIG1heHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc19vcHRpb25zKTsKKyAgICAgICAgYWljN3h4eF92YWxpZGF0ZV9vZmZzZXQocCwgc3luY3JhdGUsICZuZXdfb2Zmc2V0LCBidXNfd2lkdGgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIERpZCB3ZSBkcm9wIHRvIGFzeW5jPyAgSWYgc28sIHNlbmQgYSByZXBseSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICAgICAgICogb3Igbm90IHdlIGluaXRpYXRlZCB0aGlzIG5lZ290aWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChuZXdfb2Zmc2V0ID09IDApICYmIChuZXdfb2Zmc2V0ICE9IG9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5ID0gMDsKKyAgICAgICAgICByZXBseSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIERpZCB3ZSBzdGFydCB0aGlzLCBpZiBub3QsIG9yIGlmIHdlIHdlbnQgdG9vIGxvdyBhbmQgaGFkIHRvCisgICAgICAgICAqIGdvIGFzeW5jLCB0aGVuIHNlbmQgYW4gU0RUUiBiYWNrIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgICovCisgICAgICAgIGlmKHJlcGx5KQorICAgICAgICB7CisgICAgICAgICAgLyogd2hlbiBzZW5kaW5nIGEgcmVwbHksIG1ha2Ugc3VyZSB0aGF0IHRoZSBnb2FsIHNldHRpbmdzIGFyZQorICAgICAgICAgICAqIHVwZGF0ZWQgYWxvbmcgd2l0aCBjdXJyZW50IGFuZCBhY3RpdmUgc2luY2UgdGhlIGNvZGUgdGhhdAorICAgICAgICAgICAqIHdpbGwgYWN0dWFsbHkgYnVpbGQgdGhlIG1lc3NhZ2UgZm9yIHRoZSBzZXF1ZW5jZXIgdXNlcyB0aGUKKyAgICAgICAgICAgKiBnb2FsIHNldHRpbmdzIGFzIGl0cyBndWlkZWxpbmVzLgorICAgICAgICAgICAqLworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIHN5bmNyYXRlLCB0YXJnZXQsIGNoYW5uZWwsIG5ld19wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29mZnNldCwgdHJhbnNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfR09BTHxBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVIsCisJCQkgICAgICAgYWljX2Rldik7CisgICAgICAgICAgc2NiLT5mbGFncyAmPSB+U0NCX01TR09VVF9CSVRTOworICAgICAgICAgIHNjYi0+ZmxhZ3MgfD0gU0NCX01TR09VVF9TRFRSOworICAgICAgICAgIGFpY19vdXRiKHAsIEhPU1RfTVNHLCBNU0dfT1VUKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTSUdPKSB8IEFUTk8sIFNDU0lTSUdPKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhaWM3eHh4X3NldF9zeW5jcmF0ZShwLCBzeW5jcmF0ZSwgdGFyZ2V0LCBjaGFubmVsLCBuZXdfcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vZmZzZXQsIHRyYW5zX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLCBhaWNfZGV2KTsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBNU0dfRVhUX1dEVFI6CisgICAgICB7CisgICAgICAgICAgCisgICAgICAgIGlmIChwLT5tc2dfYnVmWzFdICE9IE1TR19FWFRfV0RUUl9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPCAoTVNHX0VYVF9XRFRSX0xFTiArIDIpKQorICAgICAgICB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidXNfd2lkdGggPSBuZXdfYnVzX3dpZHRoID0gcC0+bXNnX2J1ZlszXTsKKworICAgICAgICBpZiAoIChzY2ItPmZsYWdzICYgKFNDQl9NU0dPVVRfU0VOVHxTQ0JfTVNHT1VUX1dEVFIpKSA9PQorICAgICAgICAgICAgIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9XRFRSKSApCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2goYnVzX3dpZHRoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlamVjdCA9IFRSVUU7CisgICAgICAgICAgICAgIGlmICggKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKSAmJgorICAgICAgICAgICAgICAgICAgICgoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfUFJJTlRfRFRSKSB8fAorICAgICAgICAgICAgICAgICAgICAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKSkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUmVxdWVzdGluZyAlZCBiaXQgdHJhbnNmZXJzLCByZWplY3RpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLCA4ICogKDB4MDEgPDwgYnVzX3dpZHRoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogV2UgZmFsbCB0aHJvdWdoIG9uIHB1cnBvc2UgKi8KKyAgICAgICAgICAgIGNhc2UgTVNHX0VYVF9XRFRSX0JVU184X0JJVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC53aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgJj0gfnRhcmdldF9tYXNrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IDA7CisgICAgICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgdGFyZ2V0LCBjaGFubmVsLCBsdW4sIG5ld19idXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLCBhaWNfZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoICEoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfRFRSX1NDQU5ORUQpICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAqIFdlbGwsIHdlIG5vdyBrbm93IHRoZSBXRFRSIGFuZCBTWU5DIGNhcHMgb2YgdGhpcyBkZXZpY2Ugc2luY2UKKyAgICAgICAgICAgICAqIGl0IGNvbnRhY3RlZCB1cyBmaXJzdCwgbWFyayBpdCBhcyBzdWNoIGFuZCBjb3B5IHRoZSB1c2VyIHN0dWZmCisgICAgICAgICAgICAgKiBvdmVyIHRvIHRoZSBnb2FsIHN0dWZmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiggKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpICYmIHAtPnVzZXJbdGluZGV4XS53aWR0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDsKKyAgICAgICAgICAgICAgYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEZXZpY2VzIHRoYXQgc3VwcG9ydCBEVCB0cmFuc2ZlcnMgZG9uJ3Qgc3RhcnQgV0RUUiByZXF1ZXN0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9wdGlvbnMgPSAwOworCisgICAgICAgICAgICBpZihwLT51c2VyW3RpbmRleF0ub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0cl9jb3B5ID0gMTsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5wZXJpb2QgPSBtYXhfdCh1bnNpZ25lZCBjaGFyLCAxMCwgcC0+dXNlclt0aW5kZXhdLnBlcmlvZCk7CisgICAgICAgICAgICAgIGlmKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiggYWljX2Rldi0+Z29hbC53aWR0aCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfMTZCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSBNQVhfT0ZGU0VUXzhCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAwOworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IDI1NTsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBhaWNfZGV2LT5mbGFncyB8PSBERVZJQ0VfRFRSX1NDQU5ORUQgfCBERVZJQ0VfUFJJTlRfRFRSOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhaWNfZGV2LT5uZWVkd2R0cl9jb3B5ID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgYSBwcmVlbXB0aXZlIG1lc3NhZ2UgZnJvbSB0aGUgdGFyZ2V0LCB3ZSd2ZSBhbHJlYWR5CisgICAgICAgICAgICAgKiBzY2FubmVkIHRoaXMgdGFyZ2V0IGFuZCBzZXQgb3VyIG9wdGlvbnMgZm9yIGl0LCBhbmQgd2UKKyAgICAgICAgICAgICAqIGRvbid0IG5lZWQgYSBXRFRSIHdpdGggdGhpcyB0YXJnZXQgKGZvciB3aGF0ZXZlciByZWFzb24pLAorICAgICAgICAgICAgICogc28gcmVqZWN0IHRoaXMgaW5jb21pbmcgV0RUUgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogVGhlIGRldmljZSBpcyBzZW5kaW5nIHRoaXMgbWVzc2FnZSBmaXJzdCBhbmQgd2UgaGF2ZSB0byByZXBseSAqLworICAgICAgICAgIHJlcGx5ID0gVFJVRTsKKworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZWNlaXZlZCBwcmUtZW1wdGl2ZSBXRFRSIG1lc3NhZ2UgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgInRhcmdldC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaChidXNfd2lkdGgpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCAocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkgJiYKKyAgICAgICAgICAgICAgICAgICAoYWljX2Rldi0+Z29hbC53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3X2J1c193aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIEZhbGwgdGhyb3VnaCBpZiB3ZSBhcmVuJ3QgYSB3aWRlIGNhcmQgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAwOworICAgICAgICAgICAgICBuZXdfYnVzX3dpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9NU0dPVVRfQklUUzsKKyAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9NU0dPVVRfV0RUUjsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IDA7CisgICAgICAgICAgaWYoYWljX2Rldi0+ZHRyX3BlbmRpbmcgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiB0aGVyZSBpcyBubyBvdGhlciBjb21tYW5kIHdpdGggU0NCX0RUUl9TQ0IgYWxyZWFkeSBzZXQgdGhhdCB3aWxsCisgICAgICAgICAgICAgKiB0cmlnZ2VyIHRoZSByZWxlYXNlIG9mIHRoZSBkdHJfcGVuZGluZyBiaXQuICBCb3RoIHNldCB0aGUgYml0CisgICAgICAgICAgICAgKiBhbmQgc2V0IHNjYi0+ZmxhZ3MgfD0gU0NCX0RUUl9TQ0IKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgICAgICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfRFRSX1NDQjsKKyAgICAgICAgICB9CisgICAgICAgICAgYWljX291dGIocCwgSE9TVF9NU0csIE1TR19PVVQpOworICAgICAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNJR08pIHwgQVROTywgU0NTSVNJR08pOworICAgICAgICAgIC8qIHdoZW4gc2VuZGluZyBhIHJlcGx5LCBtYWtlIHN1cmUgdGhhdCB0aGUgZ29hbCBzZXR0aW5ncyBhcmUKKyAgICAgICAgICAgKiB1cGRhdGVkIGFsb25nIHdpdGggY3VycmVudCBhbmQgYWN0aXZlIHNpbmNlIHRoZSBjb2RlIHRoYXQKKyAgICAgICAgICAgKiB3aWxsIGFjdHVhbGx5IGJ1aWxkIHRoZSBtZXNzYWdlIGZvciB0aGUgc2VxdWVuY2VyIHVzZXMgdGhlCisgICAgICAgICAgICogZ29hbCBzZXR0aW5ncyBhcyBpdHMgZ3VpZGVsaW5lcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWM3eHh4X3NldF93aWR0aChwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgbmV3X2J1c193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0dPQUx8QUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLAorCQkJICBhaWNfZGV2KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogQnkgdmlydHVlIG9mIHRoZSBTQ1NJIHNwZWMsIGEgV0RUUiBtZXNzYWdlIG5lZ2F0ZXMgYW55IGV4aXN0aW5nCisgICAgICAgICAqIFNEVFIgbmVnb3RpYXRpb25zLiAgU28sIGV2ZW4gaWYgbmVlZHNkdHIgaXNuJ3QgbWFya2VkIGZvciB0aGlzCisgICAgICAgICAqIGRldmljZSwgd2Ugc3RpbGwgaGF2ZSB0byBkbyBhIG5ldyBTRFRSIG1lc3NhZ2UgaWYgdGhlIGRldmljZQorICAgICAgICAgKiBzdXBwb3J0cyBTRFRSIGF0IGFsbC4gIFRoZXJlZm9yZSwgd2UgY2hlY2sgbmVlZHNkdHJfY29weSBpbnN0ZWFkCisgICAgICAgICAqIG9mIG5lZWRzdHIuCisgICAgICAgICAqLworICAgICAgICBhaWM3eHh4X3NldF9zeW5jcmF0ZShwLCBOVUxMLCB0YXJnZXQsIGNoYW5uZWwsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0NVUnxBSENfVFJBTlNfUVVJVEUsCisJCQkgICAgIGFpY19kZXYpOworICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHk7CisgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgTVNHX0VYVF9QUFI6CisgICAgICB7CisgICAgICAgIAorICAgICAgICBpZiAocC0+bXNnX2J1ZlsxXSAhPSBNU0dfRVhUX1BQUl9MRU4pCisgICAgICAgIHsKKyAgICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPCAoTVNHX0VYVF9QUFJfTEVOICsgMikpCisgICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBlcmlvZCA9IG5ld19wZXJpb2QgPSBwLT5tc2dfYnVmWzNdOworICAgICAgICBvZmZzZXQgPSBuZXdfb2Zmc2V0ID0gcC0+bXNnX2J1Zls1XTsKKyAgICAgICAgYnVzX3dpZHRoID0gbmV3X2J1c193aWR0aCA9IHAtPm1zZ19idWZbNl07CisgICAgICAgIHRyYW5zX29wdGlvbnMgPSBuZXdfdHJhbnNfb3B0aW9ucyA9IHAtPm1zZ19idWZbN10gJiAweGY7CisKKyAgICAgICAgaWYoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJQYXJzaW5nIFBQUiBtZXNzYWdlICglZC8lZC8lZC8lZClcbiIsCisgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgcGVyaW9kLCBvZmZzZXQsIGJ1c193aWR0aCwKKyAgICAgICAgICAgICAgICAgdHJhbnNfb3B0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXZSBtaWdodCBoYXZlIGEgZGV2aWNlIHRoYXQgaXMgc3RhcnRpbmcgbmVnb3RpYXRpb24gd2l0aCB1cworICAgICAgICAgKiBiZWZvcmUgd2UgY2FuIHN0YXJ0IHVwIG5lZ290aWF0aW9uIHdpdGggaXQuLi4uYmUgcHJlcGFyZWQgdG8KKyAgICAgICAgICogaGF2ZSBhIGRldmljZSBhc2sgZm9yIGEgaGlnaGVyIHNwZWVkIHRoZW4gd2Ugd2FudCB0byBnaXZlIGl0CisgICAgICAgICAqIGluIHRoYXQgY2FzZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCAoc2NiLT5mbGFncyAmIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9QUFIpKSAhPQorICAgICAgICAgICAgIChTQ0JfTVNHT1VUX1NFTlR8U0NCX01TR09VVF9QUFIpICkKKyAgICAgICAgeyAKKyAgICAgICAgICAvKiBIYXZlIHdlIHNjYW5uZWQgdGhlIGRldmljZSB5ZXQ/ICovCisgICAgICAgICAgaWYgKCEoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfRFRSX1NDQU5ORUQpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBkZXZpY2UgaXMgZWxlY3RpbmcgdG8gdXNlIFBQUiBtZXNzYWdlcywgc28gd2Ugd2lsbCB0b28gdW50aWwKKyAgICAgICAgICAgICAqIHdlIGtub3cgYmV0dGVyICovCisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkcHByID0gYWljX2Rldi0+bmVlZHBwcl9jb3B5ID0gMTsKKyAgICAgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDA7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAwOworICAgICAgICAgIAorICAgICAgICAgICAgLyogV2Uga25vdyB0aGUgZGV2aWNlIGlzIFNDU0ktMyBjb21wbGlhbnQgZHVlIHRvIFBQUiAqLworICAgICAgICAgICAgYWljX2Rldi0+ZmxhZ3MgfD0gREVWSUNFX1NDU0lfMzsKKyAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBOb3Qgb25seSBpcyB0aGUgZGV2aWNlIHN0YXJ0aW5nIHRoaXMgdXAsIGJ1dCBpdCBhbHNvIGhhc24ndAorICAgICAgICAgICAgICogYmVlbiBzY2FubmVkIHlldCwgc28gdGhpcyB3b3VsZCBsaWtlbHkgYmUgb3VyIFRVUiBvciBvdXIKKyAgICAgICAgICAgICAqIElOUVVJUlkgY29tbWFuZCBhdCBzY2FuIHRpbWUsIHNvIHdlIG5lZWQgdG8gdXNlIHRoZQorICAgICAgICAgICAgICogc2V0dGluZ3MgZnJvbSB0aGUgU0VFUFJPTSBpZiB0aGV5IGV4aXN0ZWQuICBPZiBjb3Vyc2UsIGV2ZW4KKyAgICAgICAgICAgICAqIGlmIHdlIGRpZG4ndCBmaW5kIGEgU0VFUFJPTSwgd2Ugc3R1ZmZlZCBkZWZhdWx0IHZhbHVlcyBpbnRvCisgICAgICAgICAgICAgKiB0aGUgdXNlciBzZXR0aW5ncyBhbnl3YXksIHNvIHVzZSB0aG9zZSBpbiBhbGwgY2FzZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBwLT51c2VyW3RpbmRleF0ud2lkdGg7CisgICAgICAgICAgICBpZihwLT51c2VyW3RpbmRleF0ub2Zmc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IHAtPnVzZXJbdGluZGV4XS5wZXJpb2Q7CisgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub3B0aW9ucyA9IHAtPnVzZXJbdGluZGV4XS5vcHRpb25zOworICAgICAgICAgICAgICBpZihwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfVUxUUkEyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYoIGFpY19kZXYtPmdvYWwud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKGJ1c193aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzE2X0JJVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgcC0+ZmVhdHVyZXMgJiBBSENfV0lERSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfMTZCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vZmZzZXQgPSBNQVhfT0ZGU0VUXzhCSVQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5wZXJpb2QgPSAyNTU7CisgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFpY19kZXYtPmZsYWdzIHw9IERFVklDRV9EVFJfU0NBTk5FRCB8IERFVklDRV9QUklOVF9EVFI7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGFpY19kZXYtPm5lZWRwcHJfY29weSA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcHJlZW1wdGl2ZSBtZXNzYWdlIGZyb20gdGhlIHRhcmdldCwgd2UndmUgYWxyZWFkeQorICAgICAgICAgICAgICogc2Nhbm5lZCB0aGlzIHRhcmdldCBhbmQgc2V0IG91ciBvcHRpb25zIGZvciBpdCwgYW5kIHdlCisgICAgICAgICAgICAgKiBkb24ndCBuZWVkIGEgUFBSIHdpdGggdGhpcyB0YXJnZXQgKGZvciB3aGF0ZXZlciByZWFzb24pLAorICAgICAgICAgICAgICogc28gcmVqZWN0IHRoaXMgaW5jb21pbmcgUFBSCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlamVjdCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBUaGUgZGV2aWNlIGlzIHNlbmRpbmcgdGhpcyBtZXNzYWdlIGZpcnN0IGFuZCB3ZSBoYXZlIHRvIHJlcGx5ICovCisgICAgICAgICAgcmVwbHkgPSBUUlVFOworICAgICAgICAgIAorICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX05FR09USUFUSU9OMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZWNlaXZlZCBwcmUtZW1wdGl2ZSBQUFIgbWVzc2FnZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAidGFyZ2V0LlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChidXNfd2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIE1TR19FWFRfV0RUUl9CVVNfMTZfQklUOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKGFpY19kZXYtPmdvYWwud2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpICYmCisJCQkgICAgcC0+ZmVhdHVyZXMgJiBBSENfV0lERSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpICYmCisgICAgICAgICAgICAgICAgICgoYWljX2Rldi0+ZmxhZ3MgJiBERVZJQ0VfUFJJTlRfRFRSKSB8fAorICAgICAgICAgICAgICAgICAgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmVwbHkgPSBUUlVFOworICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJSZXF1ZXN0aW5nICVkIGJpdCB0cmFuc2ZlcnMsIHJlamVjdGluZy5cbiIsCisgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpLCA4ICogKDB4MDEgPDwgYnVzX3dpZHRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSAvKiBXZSBmYWxsIHRocm91Z2ggb24gcHVycG9zZSAqLworICAgICAgICAgIGNhc2UgTVNHX0VYVF9XRFRSX0JVU184X0JJVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBpZiB3ZSBhcmVuJ3Qgd2lkZSwgd2UgYWxzbyBjYW4ndCBiZQorICAgICAgICAgICAgICogRHVhbCBFZGdlIHNvIGNsZWFyIHRoZSBvcHRpb25zIGJ5dGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV3X3RyYW5zX29wdGlvbnMgPSAwOworICAgICAgICAgICAgbmV3X2J1c193aWR0aCA9IE1TR19FWFRfV0RUUl9CVVNfOF9CSVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihyZXBseSkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdoZW4gc2VuZGluZyBhIHJlcGx5LCBtYWtlIHN1cmUgdGhhdCB0aGUgZ29hbCBzZXR0aW5ncyBhcmUKKyAgICAgICAgICAgKiB1cGRhdGVkIGFsb25nIHdpdGggY3VycmVudCBhbmQgYWN0aXZlIHNpbmNlIHRoZSBjb2RlIHRoYXQKKyAgICAgICAgICAgKiB3aWxsIGFjdHVhbGx5IGJ1aWxkIHRoZSBtZXNzYWdlIGZvciB0aGUgc2VxdWVuY2VyIHVzZXMgdGhlCisgICAgICAgICAgICogZ29hbCBzZXR0aW5ncyBhcyBpdHMgZ3VpZGVsaW5lcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWM3eHh4X3NldF93aWR0aChwLCB0YXJnZXQsIGNoYW5uZWwsIGx1biwgbmV3X2J1c193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfR09BTHxBSENfVFJBTlNfQUNUSVZFfEFIQ19UUkFOU19DVVIsCisJCQkgICAgYWljX2Rldik7CisgICAgICAgICAgc3luY3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJm5ld19wZXJpb2QsIG1heHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld190cmFuc19vcHRpb25zKTsKKyAgICAgICAgICBhaWM3eHh4X3ZhbGlkYXRlX29mZnNldChwLCBzeW5jcmF0ZSwgJm5ld19vZmZzZXQsIG5ld19idXNfd2lkdGgpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIHN5bmNyYXRlLCB0YXJnZXQsIGNoYW5uZWwsIG5ld19wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29mZnNldCwgbmV3X3RyYW5zX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0dPQUx8QUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLAorCQkJICAgICAgIGFpY19kZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFpYzd4eHhfc2V0X3dpZHRoKHAsIHRhcmdldCwgY2hhbm5lbCwgbHVuLCBuZXdfYnVzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19UUkFOU19BQ1RJVkV8QUhDX1RSQU5TX0NVUiwgYWljX2Rldik7CisgICAgICAgICAgc3luY3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJm5ld19wZXJpb2QsIG1heHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld190cmFuc19vcHRpb25zKTsKKyAgICAgICAgICBhaWM3eHh4X3ZhbGlkYXRlX29mZnNldChwLCBzeW5jcmF0ZSwgJm5ld19vZmZzZXQsIG5ld19idXNfd2lkdGgpOworICAgICAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIHN5bmNyYXRlLCB0YXJnZXQsIGNoYW5uZWwsIG5ld19wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29mZnNldCwgbmV3X3RyYW5zX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSLCBhaWNfZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFzIGl0IHR1cm5zIG91dCwgaWYgd2UgZG9uJ3QgKmhhdmUqIHRvIGhhdmUgUFBSIG1lc3NhZ2VzLCB0aGVuCisgICAgICAgICAqIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgbm90IHRvIHVzZSB0aGVtIHNpbmNlIHRoYXQgbWFrZXMgc29tZQorICAgICAgICAgKiBleHRlcm5hbCBkcml2ZSBjaGFzc2lzIHdvcmsgKHRob3NlIGNoYXNzaXMgY2FuJ3QgcGFyc2UgUFBSCisgICAgICAgICAqIG1lc3NhZ2VzIGFuZCB0aGV5IG1hbmdsZSB0aGUgU0NTSSBidXMgdW50aWwgeW91IHNlbmQgYSBXRFRSCisgICAgICAgICAqIGFuZCBTRFRSIHRoYXQgdGhleSBjYW4gdW5kZXJzdGFuZCkuCisgICAgICAgICAqLworICAgICAgICBpZihuZXdfdHJhbnNfb3B0aW9ucyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDA7CisgICAgICAgICAgaWYobmV3X29mZnNldCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobmV3X2J1c193aWR0aCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKChuZXdfb2Zmc2V0ID09IDApICYmIChvZmZzZXQgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIE9vcHMsIHRoZSBzeW5jcmF0ZSB3ZW50IHRvIGxvdyBmb3IgdGhpcyBjYXJkIGFuZCB3ZSBmZWxsIG9mZgorICAgICAgICAgICAqIHRvIGFzeW5jIChzaG91bGQgbmV2ZXIgaGFwcGVuIHdpdGggYSBkZXZpY2UgdGhhdCB1c2VzIFBQUgorICAgICAgICAgICAqIG1lc3NhZ2VzLCBidXQgaGF2ZSB0byBiZSBjb21wbGV0ZSkKKyAgICAgICAgICAgKi8KKyAgICAgICAgICByZXBseSA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZihyZXBseSkKKyAgICAgICAgeworICAgICAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9NU0dPVVRfQklUUzsKKyAgICAgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9NU0dPVVRfUFBSOworICAgICAgICAgIGFpY19vdXRiKHAsIEhPU1RfTVNHLCBNU0dfT1VUKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTSUdPKSB8IEFUTk8sIFNDU0lTSUdPKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBhaWNfZGV2LT5uZWVkcHByID0gMDsKKyAgICAgICAgfQorICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICByZWplY3QgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IC8qIGVuZCBvZiBzd2l0Y2gocC0+bXNnX3R5cGUpICovCisgIH0gLyogZW5kIG9mIGlmICghcmVqZWN0ICYmIChwLT5tc2dfbGVuID4gMikpICovCisKKyAgaWYgKCFyZXBseSAmJiByZWplY3QpCisgIHsKKyAgICBhaWNfb3V0YihwLCBNU0dfTUVTU0FHRV9SRUpFQ1QsIE1TR19PVVQpOworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNJR08pIHwgQVROTywgU0NTSVNJR08pOworICAgIGRvbmUgPSBUUlVFOworICB9CisgIHJldHVybihkb25lKTsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaGFuZGxlX3JlcWluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIFJFUUlOSVQgaW50ZXJydXB0cyAodXNlZCB0byB0cmFuc2ZlciBtZXNzYWdlcyB0bworICogICAgYW5kIGZyb20gZGV2aWNlcykuCisgKl9GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2hhbmRsZV9yZXFpbml0KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiKQoreworICB1bnNpZ25lZCBjaGFyIGxhc3RieXRlOworICB1bnNpZ25lZCBjaGFyIHBoYXNlbWlzOworICBpbnQgZG9uZSA9IEZBTFNFOworCisgIHN3aXRjaChwLT5tc2dfdHlwZSkKKyAgeworICAgIGNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR09VVDoKKyAgICAgIHsKKyAgICAgICAgaWYgKHAtPm1zZ19sZW4gPT0gMCkKKyAgICAgICAgICBwYW5pYygiYWljN3h4eDogUkVRSU5JVCB3aXRoIG5vIGFjdGl2ZSBtZXNzYWdlIVxuIik7CisKKyAgICAgICAgbGFzdGJ5dGUgPSAocC0+bXNnX2luZGV4ID09IChwLT5tc2dfbGVuIC0gMSkpOworICAgICAgICBwaGFzZW1pcyA9ICggYWljX2luYihwLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLKSAhPSBQX01FU0dPVVQ7CisKKyAgICAgICAgaWYgKGxhc3RieXRlIHx8IHBoYXNlbWlzKQorICAgICAgICB7CisgICAgICAgICAgLyogVGltZSB0byBlbmQgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICBwLT5tc2dfbGVuID0gMDsKKyAgICAgICAgICBwLT5tc2dfdHlwZSA9IE1TR19UWVBFX05PTkU7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBOT1RFLVRPLU1ZU0VMRjogSWYgeW91IGNsZWFyIHRoZSBSRVFJTklUIGFmdGVyIHlvdQorICAgICAgICAgICAqIGRpc2FibGUgUkVRSU5JVHMsIHRoZW4gY2FzZXMgb2YgUkVKRUNUX01TRyBzdG9wIHdvcmtpbmcKKyAgICAgICAgICAgKiBhbmQgaGFuZyB0aGUgYnVzCisgICAgICAgICAgICovCisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH5FTlJFUUlOSVQsIFNJTU9ERTEpOworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgICAgICAgcC0+ZmxhZ3MgJj0gfkFIQ19IQU5ETElOR19SRVFJTklUUzsKKworICAgICAgICAgIGlmIChwaGFzZW1pcyA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4XSwgU0lOREVYKTsKKyAgICAgICAgICAgIGFpY19vdXRiKHAsIDAsIFJFVFVSTl8xKTsKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJDb21wbGV0ZWQgc2VuZGluZyBvZiBSRVFJTklUIG1lc3NhZ2UuXG4iLAorICAgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgYWljX291dGIocCwgTVNHT1VUX1BIQVNFTUlTLCBSRVRVUk5fMSk7CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUEhBU0VNSVMgd2hpbGUgc2VuZGluZyBSRVFJTklUIG1lc3NhZ2UuXG4iLAorICAgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIFByZXNlbnQgdGhlIGJ5dGUgb24gdGhlIGJ1cyAoY2xlYXJpbmcgUkVRSU5JVCkgYnV0IGRvbid0CisgICAgICAgICAgICogdW5wYXVzZSB0aGUgc2VxdWVuY2VyLgorICAgICAgICAgICAqLworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlJFUUlOSVQsIENMUlNJTlQxKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgICAgICAgIGFpY19vdXRiKHAsICBwLT5tc2dfYnVmW3AtPm1zZ19pbmRleCsrXSwgU0NTSURBVEwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTVNHX1RZUEVfSU5JVElBVE9SX01TR0lOOgorICAgICAgeworICAgICAgICBwaGFzZW1pcyA9ICggYWljX2luYihwLCBTQ1NJU0lHSSkgJiBQSEFTRV9NQVNLICkgIT0gUF9NRVNHSU47CisKKyAgICAgICAgaWYgKHBoYXNlbWlzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwLT5tc2dfbGVuKys7CisgICAgICAgICAgLyogUHVsbCB0aGUgYnl0ZSBpbiB3aXRob3V0IGFja2luZyBpdCAqLworICAgICAgICAgIHAtPm1zZ19idWZbcC0+bXNnX2luZGV4XSA9IGFpY19pbmIocCwgU0NTSUJVU0wpOworICAgICAgICAgIGRvbmUgPSBhaWM3eHh4X3BhcnNlX21zZyhwLCBzY2IpOworICAgICAgICAgIC8qIEFjayB0aGUgYnl0ZSAqLworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlJFUUlOSVQsIENMUlNJTlQxKTsKKyAgICAgICAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgICAgICAgIGFpY19pbmIocCwgU0NTSURBVEwpOworICAgICAgICAgIHAtPm1zZ19pbmRleCsrOworICAgICAgICB9CisgICAgICAgIGlmIChwaGFzZW1pcyB8fCBkb25lKQorICAgICAgICB7CisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgPiAweGZmZmYpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHBoYXNlbWlzKQorICAgICAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJQSEFTRU1JUyB3aGlsZSByZWNlaXZpbmcgUkVRSU5JVCBtZXNzYWdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIkNvbXBsZXRlZCByZWNlaXB0IG9mIFJFUUlOSVQgbWVzc2FnZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIC8qIFRpbWUgdG8gZW5kIG91ciBtZXNzYWdlIHNlc3Npb24gKi8KKyAgICAgICAgICBwLT5tc2dfbGVuID0gMDsKKyAgICAgICAgICBwLT5tc2dfdHlwZSA9IE1TR19UWVBFX05PTkU7CisgICAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH5FTlJFUUlOSVQsIFNJTU9ERTEpOworICAgICAgICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgICAgICAgcC0+ZmxhZ3MgJj0gfkFIQ19IQU5ETElOR19SRVFJTklUUzsKKyAgICAgICAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgeworICAgICAgICBwYW5pYygiYWljN3h4eDogVW5rbm93biBSRVFJTklUIG1lc3NhZ2UgdHlwZS5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgfSAvKiBFbmQgb2Ygc3dpdGNoKHAtPm1zZ190eXBlKSAqLworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfaGFuZGxlX3Njc2lpbnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIFNDU0kgaW50ZXJydXB0cyAoU0NTSUlOVCkuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2hhbmRsZV9zY3NpaW50KHN0cnVjdCBhaWM3eHh4X2hvc3QgKnAsIHVuc2lnbmVkIGNoYXIgaW50c3RhdCkKK3sKKyAgdW5zaWduZWQgY2hhciBzY2JfaW5kZXg7CisgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgKnNjYjsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKworICBzY2JfaW5kZXggPSBhaWNfaW5iKHAsIFNDQl9UQUcpOworICBzdGF0dXMgPSBhaWNfaW5iKHAsIFNTVEFUMSk7CisKKyAgaWYgKHNjYl9pbmRleCA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICB7CisgICAgc2NiID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtzY2JfaW5kZXhdOworICAgIGlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisgICAgeworICAgICAgc2NiID0gTlVMTDsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgc2NiID0gTlVMTDsKKyAgfQorCisKKyAgaWYgKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkKKyAgeworICAgIGludCBjaGFubmVsOworCisgICAgaWYgKCAocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzAgKQorICAgICAgY2hhbm5lbCA9IChhaWNfaW5iKHAsIFNCTEtDVEwpICYgU0VMQlVTQikgPj4gMzsKKyAgICBlbHNlCisgICAgICBjaGFubmVsID0gMDsKKworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1JFU0VUKQorICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiU29tZW9uZSBlbHNlIHJlc2V0IHRoZSBjaGFubmVsISFcbiIsCisgICAgICAgICAgIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIC0xLCAtMSk7CisgICAgaWYgKGFpYzd4eHhfcGFuaWNfb25fYWJvcnQpCisgICAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIE5VTEwpOworICAgIC8qCisgICAgICogR28gdGhyb3VnaCBhbmQgYWJvcnQgYWxsIGNvbW1hbmRzIGZvciB0aGUgY2hhbm5lbCwgYnV0IGRvIG5vdAorICAgICAqIHJlc2V0IHRoZSBjaGFubmVsIGFnYWluLgorICAgICAqLworICAgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbChwLCBjaGFubmVsLCAvKiBJbml0aWF0ZSBSZXNldCAqLyBGQUxTRSk7CisgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBUUlVFKTsKKyAgICBzY2IgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKCAoKHN0YXR1cyAmIEJVU0ZSRUUpICE9IDApICYmICgoc3RhdHVzICYgU0VMVE8pID09IDApICkKKyAgeworICAgIC8qCisgICAgICogRmlyc3QgbG9vayBhdCB3aGF0IHBoYXNlIHdlIHdlcmUgbGFzdCBpbi4gIElmIGl0J3MgbWVzc2FnZS1vdXQsCisgICAgICogY2hhbmNlcyBhcmUgcHJldHR5IGdvb2QgdGhhdCB0aGUgYnVzIGZyZWUgd2FzIGluIHJlc3BvbnNlIHRvCisgICAgICogb25lIG9mIG91ciBhYm9ydCByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGxhc3RwaGFzZSA9IGFpY19pbmIocCwgTEFTVFBIQVNFKTsKKyAgICB1bnNpZ25lZCBjaGFyIHNhdmVkX3RjbCA9IGFpY19pbmIocCwgU0FWRURfVENMKTsKKyAgICB1bnNpZ25lZCBjaGFyIHRhcmdldCA9IChzYXZlZF90Y2wgPj4gNCkgJiAweDBGOworICAgIGludCBjaGFubmVsOworICAgIGludCBwcmludGVycm9yID0gVFJVRTsKKworICAgIGlmICggKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3NzcwICkKKyAgICAgIGNoYW5uZWwgPSAoYWljX2luYihwLCBTQkxLQ1RMKSAmIFNFTEJVU0IpID4+IDM7CisgICAgZWxzZQorICAgICAgY2hhbm5lbCA9IDA7CisKKyAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTRVEpICYgKEVOU0VMSXxFTlJTRUxJfEVOQVVUT0FUTlApLAorICAgICAgICAgICAgIFNDU0lTRVEpOworICAgIGlmIChsYXN0cGhhc2UgPT0gUF9NRVNHT1VUKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgbWVzc2FnZTsKKworICAgICAgbWVzc2FnZSA9IGFpY19pbmIocCwgU0lOREVYKTsKKworICAgICAgaWYgKChtZXNzYWdlID09IE1TR19BQk9SVCkgfHwgKG1lc3NhZ2UgPT0gTVNHX0FCT1JUX1RBRykpCisgICAgICB7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX0FCT1JUX1BST0NFU1MpCisgICAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NCICVkIGFib3J0IGRlbGl2ZXJlZC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIHNjYi0+aHNjYi0+dGFnKTsKKyAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywKKyAgICAgICAgICAgICAgICAobWVzc2FnZSA9PSBNU0dfQUJPUlQpID8gU0NCX0xJU1RfTlVMTCA6IHNjYi0+aHNjYi0+dGFnICk7CisgICAgICAgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgVFJVRSk7CisgICAgICAgIHNjYiA9IE5VTEw7CisgICAgICAgIHByaW50ZXJyb3IgPSAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAobWVzc2FnZSA9PSBNU0dfQlVTX0RFVl9SRVNFVCkKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF9oYW5kbGVfZGV2aWNlX3Jlc2V0KHAsIHRhcmdldCwgY2hhbm5lbCk7CisgICAgICAgIHNjYiA9IE5VTEw7CisgICAgICAgIHByaW50ZXJyb3IgPSAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIChzY2IgIT0gTlVMTCkgJiYgKHNjYi0+ZmxhZ3MgJiBTQ0JfRFRSX1NDQikgKSAKKyAgICB7CisgICAgICAvKgorICAgICAgICogSG1tbS4uLmVycm9yIGR1cmluZyBhIG5lZ290aWF0aW9uIGNvbW1hbmQuICBFaXRoZXIgd2UgaGF2ZSBhCisgICAgICAgKiBib3JrZW4gYnVzLCBvciB0aGUgZGV2aWNlIGRvZXNuJ3QgbGlrZSBvdXIgbmVnb3RpYXRpb24gbWVzc2FnZS4KKyAgICAgICAqIFNpbmNlIHdlIGNoZWNrIHRoZSBJTlFVSVJZIGRhdGEgb2YgYSBkZXZpY2UgYmVmb3JlIHNlbmRpbmcgaXQKKyAgICAgICAqIG5lZ290aWF0aW9uIG1lc3NhZ2VzLCBhc3N1bWUgdGhlIGJ1cyBpcyBib3JrZW4gZm9yIHdoYXRldmVyCisgICAgICAgKiByZWFzb24uICBDb21wbGV0ZSB0aGUgY29tbWFuZC4KKyAgICAgICAqLworICAgICAgcHJpbnRlcnJvciA9IDA7CisgICAgICBhaWM3eHh4X3Jlc2V0X2RldmljZShwLCB0YXJnZXQsIGNoYW5uZWwsIEFMTF9MVU5TLCBzY2ItPmhzY2ItPnRhZyk7CisgICAgICBhaWM3eHh4X3J1bl9kb25lX3F1ZXVlKHAsIFRSVUUpOworICAgICAgc2NiID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHByaW50ZXJyb3IgIT0gMCkKKyAgICB7CisgICAgICBpZiAoc2NiICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdGFnOworCisgICAgICAgIGlmICgoc2NiLT5oc2NiLT5jb250cm9sICYgVEFHX0VOQikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHRhZyA9IHNjYi0+aHNjYi0+dGFnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRhZyA9IFNDQl9MSVNUX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywgdGFnKTsKKyAgICAgICAgYWljN3h4eF9ydW5fZG9uZV9xdWV1ZShwLCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF9yZXNldF9kZXZpY2UocCwgdGFyZ2V0LCBjaGFubmVsLCBBTExfTFVOUywgU0NCX0xJU1RfTlVMTCk7CisgICAgICAgIGFpYzd4eHhfcnVuX2RvbmVfcXVldWUocCwgVFJVRSk7CisgICAgICB9CisgICAgICBwcmludGsoSU5GT19MRUFEICJVbmV4cGVjdGVkIGJ1c2ZyZWUsIExBU1RQSEFTRSA9IDB4JXgsICIKKyAgICAgICAgICAgICAiU0VRQUREUiA9IDB4JXhcbiIsIHAtPmhvc3Rfbm8sIGNoYW5uZWwsIHRhcmdldCwgLTEsIGxhc3RwaGFzZSwKKyAgICAgICAgICAgICAoYWljX2luYihwLCBTRVFBRERSMSkgPDwgOCkgfCBhaWNfaW5iKHAsIFNFUUFERFIwKSk7CisgICAgICBzY2IgPSBOVUxMOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBNU0dfTk9PUCwgTVNHX09VVCk7CisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTSU1PREUxKSAmIH4oRU5CVVNGUkVFfEVOUkVRSU5JVCksCisgICAgICBTSU1PREUxKTsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgIGFpY19vdXRiKHAsIENMUkJVU0ZSRUUsIENMUlNJTlQxKTsKKyAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgIHJlc3RhcnRfc2VxdWVuY2VyKHApOworICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIFRSVUUpOworICB9CisgIGVsc2UgaWYgKChzdGF0dXMgJiBTRUxUTykgIT0gMCkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc2NicHRyOworICAgIHVuc2lnbmVkIGNoYXIgbmV4dHNjYjsKKyAgICBTY3NpX0NtbmQgKmNtZDsKKworICAgIHNjYnB0ciA9IGFpY19pbmIocCwgV0FJVElOR19TQ0JIKTsKKyAgICBpZiAoc2NicHRyID4gcC0+c2NiX2RhdGEtPm1heGhzY2JzKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBJJ20gc3RpbGwgdHJ5aW5nIHRvIHRyYWNrIGRvd24gZXhhY3RseSBob3cgdGhpcyBoYXBwZW5zLCBidXQgdW50aWwKKyAgICAgICAqIEkgZmluZCBpdCwgdGhpcyBjb2RlIHdpbGwgbWFrZSBzdXJlIHdlIGFyZW4ndCBwYXNzaW5nIGJvZ3VzIHZhbHVlcworICAgICAgICogaW50byB0aGUgU0NCUFRSIHJlZ2lzdGVyLCBldmVuIGlmIHRoYXQgcmVnaXN0ZXIgd2lsbCBqdXN0IHdyYXAKKyAgICAgICAqIHRoaW5ncyBhcm91bmQsIHdlIHN0aWxsIGRvbid0IGxpa2UgaGF2aW5nIG91dCBvZiByYW5nZSB2YXJpYWJsZXMuCisgICAgICAgKgorICAgICAgICogTk9URTogRG9uJ3QgY2hlY2sgdGhlIGFpYzd4eHhfdmVyYm9zZSB2YXJpYWJsZSwgSSB3YW50IHRoaXMgbWVzc2FnZQorICAgICAgICogdG8gYWx3YXlzIGJlIGRpc3BsYXllZC4KKyAgICAgICAqLworICAgICAgcHJpbnRrKElORk9fTEVBRCAiSW52YWxpZCBXQUlUSU5HX1NDQkggdmFsdWUgJWQsIGltcHJvdmlzaW5nLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzY2JwdHIpOworICAgICAgaWYgKHAtPnNjYl9kYXRhLT5tYXhoc2NicyA+IDQpCisgICAgICAgIHNjYnB0ciAmPSAocC0+c2NiX2RhdGEtPm1heGhzY2JzIC0gMSk7CisgICAgICBlbHNlCisgICAgICAgIHNjYnB0ciAmPSAweDAzOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBzY2JwdHIsIFNDQlBUUik7CisgICAgc2NiX2luZGV4ID0gYWljX2luYihwLCBTQ0JfVEFHKTsKKworICAgIHNjYiA9IE5VTEw7CisgICAgaWYgKHNjYl9pbmRleCA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICAgIHsKKyAgICAgIHNjYiA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKyAgICAgIGlmICgoc2NiLT5mbGFncyAmIFNDQl9BQ1RJVkUpID09IDApCisgICAgICB7CisgICAgICAgIHNjYiA9IE5VTEw7CisgICAgICB9CisgICAgfQorICAgIGlmIChzY2IgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJSZWZlcmVuY2VkIFNDQiAlZCBub3QgdmFsaWQgZHVyaW5nIFNFTFRPLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzY2JfaW5kZXgpOworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICAgICAgICBTQ1NJU0VRID0gMHgleCBTRVFBRERSID0gMHgleCBTU1RBVDAgPSAweCV4ICIKKyAgICAgICAgICAgICAiU1NUQVQxID0gMHgleFxuIiwgYWljX2luYihwLCBTQ1NJU0VRKSwKKyAgICAgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMCksIGFpY19pbmIocCwgU1NUQVQxKSk7CisgICAgICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICAgICAgYWljN3h4eF9wYW5pY19hYm9ydChwLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNtZCA9IHNjYi0+Y21kOworICAgICAgY21kLT5yZXN1bHQgPSAoRElEX1RJTUVfT1VUIDw8IDE2KTsKKworICAgICAgLyoKKyAgICAgICAqIENsZWFyIG91dCB0aGlzIGhhcmR3YXJlIFNDQgorICAgICAgICovCisgICAgICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisKKyAgICAgIC8qCisgICAgICAgKiBDbGVhciBvdXQgYSBmZXcgdmFsdWVzIGluIHRoZSBjYXJkIHRoYXQgYXJlIGluIGFuIHVuZGV0ZXJtaW5lZAorICAgICAgICogc3RhdGUuCisgICAgICAgKi8KKyAgICAgIGFpY19vdXRiKHAsIE1TR19OT09QLCBNU0dfT1VUKTsKKworICAgICAgLyoKKyAgICAgICAqIFNoaWZ0IHRoZSB3YWl0aW5nIGZvciBzZWxlY3Rpb24gcXVldWUgZm9yd2FyZAorICAgICAgICovCisgICAgICBuZXh0c2NiID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisgICAgICBhaWNfb3V0YihwLCBuZXh0c2NiLCBXQUlUSU5HX1NDQkgpOworCisgICAgICAvKgorICAgICAgICogUHV0IHRoaXMgU0NCIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4KKyAgICAgICAqLworICAgICAgYWljN3h4eF9hZGRfY3Vyc2NiX3RvX2ZyZWVfbGlzdChwKTsKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKQorICAgICAgICBwcmludGsoSU5GT19MRUFEICJTZWxlY3Rpb24gVGltZW91dC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisjZW5kaWYKKyAgICAgIGlmIChzY2ItPmZsYWdzICYgU0NCX1FVRVVFRF9BQk9SVCkKKyAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2Uga25vdyB0aGF0IHRoaXMgcGFydGljdWxhciBTQ0IgaGFkIHRvIGJlIHRoZSBxdWV1ZWQgYWJvcnQgc2luY2UKKyAgICAgICAgICogdGhlIGRpc2Nvbm5lY3RlZCBTQ0Igd291bGQgaGF2ZSBnb3R0ZW4gYSByZWNvbm5lY3QgaW5zdGVhZC4KKyAgICAgICAgICogV2hhdCB3ZSBuZWVkIHRvIGRvIHRoZW4gaXMgdG8gbGV0IHRoZSBjb21tYW5kIHRpbWVvdXQgYWdhaW4gc28KKyAgICAgICAgICogd2UgZ2V0IGEgcmVzZXQgc2luY2UgdGhpcyBhYm9ydCBqdXN0IGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIGNtZC0+cmVzdWx0ID0gMDsKKyAgICAgICAgc2NiID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBLZWVwIHRoZSBzZXF1ZW5jZXIgZnJvbSB0cnlpbmcgdG8gcmVzdGFydCBhbnkgc2VsZWN0aW9ucworICAgICAqLworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0NTSVNFUSkgJiB+RU5TRUxPLCBTQ1NJU0VRKTsKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB0aGUgZGF0YSBiaXRzIG9uIHRoZSBidXMgYXJlIHJlbGVhc2VkCisgICAgICogRG9uJ3QgZG8gdGhpcyBvbiA3NzcwIGNoaXBzZXRzLCBpdCBtYWtlcyB0aGVtIGdpdmUgdXMKKyAgICAgKiBhIEJSS0FERFJJTlQgYW5kIGtpbGxzIHRoZSBjYXJkLgorICAgICAqLworICAgIGlmKCAocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kgKQorICAgICAgYWljX291dGIocCwgMCwgU0NTSUJVU0wpOworCisgICAgLyoKKyAgICAgKiBEZWxheSBmb3IgdGhlIHNlbGVjdGlvbiB0aW1lb3V0IGRlbGF5IHBlcmlvZCB0aGVuIHN0b3AgdGhlIHNlbGVjdGlvbgorICAgICAqLworICAgIHVkZWxheSgzMDEpOworICAgIGFpY19vdXRiKHAsIENMUlNFTElOR08sIENMUlNJTlQwKTsKKyAgICAvKgorICAgICAqIENsZWFyIG91dCBhbGwgdGhlIGludGVycnVwdCBzdGF0dXMgYml0cworICAgICAqLworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+KEVOUkVRSU5JVHxFTkJVU0ZSRUUpLCBTSU1PREUxKTsKKyAgICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICAgIGFpY19vdXRiKHAsIENMUlNFTFRJTUVPIHwgQ0xSQlVTRlJFRSwgQ0xSU0lOVDEpOworICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgLyoKKyAgICAgKiBSZXN0YXJ0aW5nIHRoZSBzZXF1ZW5jZXIgd2lsbCBzdG9wIHRoZSBzZWxlY3Rpb24gYW5kIG1ha2Ugc3VyZSBkZXZpY2VzCisgICAgICogYXJlIGFsbG93ZWQgdG8gcmVzZWxlY3QgaW4uCisgICAgICovCisgICAgcmVzdGFydF9zZXF1ZW5jZXIocCk7CisgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgVFJVRSk7CisgIH0KKyAgZWxzZSBpZiAoc2NiID09IE5VTEwpCisgIHsKKyAgICBwcmludGsoV0FSTl9MRUFEICJhaWM3eHh4X2lzciAtIHJlZmVyZW5jZWQgc2NiIG5vdCB2YWxpZCAiCisgICAgICAgICAgICJkdXJpbmcgc2NzaWludCAweCV4IHNjYiglZClcbiIKKyAgICAgICAgICAgIiAgICAgIFNJTU9ERTAgMHgleCwgU0lNT0RFMSAweCV4LCBTU1RBVDAgMHgleCwgU0VRQUREUiAweCV4XG4iLAorICAgICAgICAgICBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzdGF0dXMsIHNjYl9pbmRleCwgYWljX2luYihwLCBTSU1PREUwKSwKKyAgICAgICAgICAgYWljX2luYihwLCBTSU1PREUxKSwgYWljX2luYihwLCBTU1RBVDApLAorICAgICAgICAgICAoYWljX2luYihwLCBTRVFBRERSMSkgPDwgOCkgfCBhaWNfaW5iKHAsIFNFUUFERFIwKSk7CisgICAgLyoKKyAgICAgKiBUdXJuIG9mZiB0aGUgaW50ZXJydXB0IGFuZCBzZXQgc3RhdHVzIHRvIHplcm8sIHNvIHRoYXQgaXQKKyAgICAgKiBmYWxscyB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBTQ1NJSU5UIGNvZGUuCisgICAgICovCisgICAgYWljX291dGIocCwgc3RhdHVzLCBDTFJTSU5UMSk7CisgICAgYWljX291dGIocCwgQ0xSU0NTSUlOVCwgQ0xSSU5UKTsKKyAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCAvKiB1bnBhdXNlIGFsd2F5cyAqLyBUUlVFKTsKKyAgICBzY2IgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHN0YXR1cyAmIFNDU0lQRVJSKQorICB7CisgICAgLyoKKyAgICAgKiBEZXRlcm1pbmUgdGhlIGJ1cyBwaGFzZSBhbmQgcXVldWUgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBjaGFyICAqcGhhc2U7CisgICAgU2NzaV9DbW5kICpjbWQ7CisgICAgdW5zaWduZWQgY2hhciBtZXNnX291dCA9IE1TR19OT09QOworICAgIHVuc2lnbmVkIGNoYXIgbGFzdHBoYXNlID0gYWljX2luYihwLCBMQVNUUEhBU0UpOworICAgIHVuc2lnbmVkIGNoYXIgc3N0YXQyID0gYWljX2luYihwLCBTU1RBVDIpOworCisgICAgY21kID0gc2NiLT5jbWQ7CisgICAgc3dpdGNoIChsYXN0cGhhc2UpCisgICAgeworICAgICAgY2FzZSBQX0RBVEFPVVQ6CisgICAgICAgIHBoYXNlID0gIkRhdGEtT3V0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfREFUQUlOOgorICAgICAgICBwaGFzZSA9ICJEYXRhLUluIjsKKyAgICAgICAgbWVzZ19vdXQgPSBNU0dfSU5JVElBVE9SX0RFVF9FUlI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX0NPTU1BTkQ6CisgICAgICAgIHBoYXNlID0gIkNvbW1hbmQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9NRVNHT1VUOgorICAgICAgICBwaGFzZSA9ICJNZXNzYWdlLU91dCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX1NUQVRVUzoKKyAgICAgICAgcGhhc2UgPSAiU3RhdHVzIjsKKyAgICAgICAgbWVzZ19vdXQgPSBNU0dfSU5JVElBVE9SX0RFVF9FUlI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX01FU0dJTjoKKyAgICAgICAgcGhhc2UgPSAiTWVzc2FnZS1JbiI7CisgICAgICAgIG1lc2dfb3V0ID0gTVNHX1BBUklUWV9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwaGFzZSA9ICJ1bmtub3duIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBIHBhcml0eSBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIGEgZGF0YQorICAgICAqIHRyYW5zZmVyIHBoYXNlLiBGbGFnIGl0IGFuZCBjb250aW51ZS4KKyAgICAgKi8KKyAgICBpZiggKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMykgJiYgCisgICAgICAgIChhaWNfaW5iKHAsIFNDU0lSQVRFKSAmIEFIQ19TWU5DUkFURV9DUkMpICYmCisgICAgICAgIChsYXN0cGhhc2UgPT0gUF9EQVRBSU4pICkKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJDUkMgZXJyb3IgZHVyaW5nICVzIHBoYXNlLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIHBoYXNlKTsKKyAgICAgIGlmKHNzdGF0MiAmIENSQ1ZBTEVSUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiICBDUkMgZXJyb3IgaW4gaW50ZXJtZWRpYXRlIENSQyBwYWNrZXQuXG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICAgIGlmKHNzdGF0MiAmIENSQ0VOREVSUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiICBDUkMgZXJyb3IgaW4gZW5kaW5nIENSQyBwYWNrZXQuXG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICAgIGlmKHNzdGF0MiAmIENSQ1JFUUVSUikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKFdBUk5fTEVBRCAiICBUYXJnZXQgaW5jb3JyZWN0bHkgcmVxdWVzdGVkIGEgQ1JDIHBhY2tldC5cbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYikpOworICAgICAgfQorICAgICAgaWYoc3N0YXQyICYgRFVBTF9FREdFX0VSUk9SKQorICAgICAgeworICAgICAgICBwcmludGsoV0FSTl9MRUFEICIgIER1YWwgRWRnZSB0cmFuc21pc3Npb24gZXJyb3IuXG4iLAorICAgICAgICAgICAgICAgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggKGxhc3RwaGFzZSA9PSBQX01FU0dPVVQpICYmCisgICAgICAgICAgICAgKHNjYi0+ZmxhZ3MgJiBTQ0JfTVNHT1VUX1BQUikgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBBcyBwZXIgdGhlIGRyYWZ0IHNwZWNzLCBhbnkgZGV2aWNlIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhbnkgb2YKKyAgICAgICAqIHRoZSBvcHRpb24gdmFsdWVzIG90aGVyIHRoYW4gMCBhcmUgbm90IGFsbG93ZWQgdG8gcmVqZWN0IHRoZQorICAgICAgICogUFBSIG1lc3NhZ2UuICBJbnN0ZWFkLCB0aGV5IG11c3QgbmVnb3RpYXRlIG91dCB3aGF0IHRoZXkgZG8KKyAgICAgICAqIHN1cHBvcnQgaW5zdGVhZCBvZiByZWplY3Rpbmcgb3VyIG9mZmVyaW5nIG9yIGVsc2UgdGhleSBjYXVzZQorICAgICAgICogYSBwYXJpdHkgZXJyb3IgZHVyaW5nIG1zZ19vdXQgcGhhc2UgdG8gc2lnbmFsIHRoYXQgdGhleSBkb24ndAorICAgICAgICogbGlrZSBvdXIgc2V0dGluZ3MuCisgICAgICAgKi8KKyAgICAgIGFpY19kZXYgPSBBSUNfREVWKHNjYi0+Y21kKTsKKyAgICAgIGFpY19kZXYtPm5lZWRwcHIgPSBhaWNfZGV2LT5uZWVkcHByX2NvcHkgPSAwOworICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgc2NiLT5jbWQtPmRldmljZS0+aWQsIHNjYi0+Y21kLT5kZXZpY2UtPmNoYW5uZWwsIHNjYi0+Y21kLT5kZXZpY2UtPmx1biwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAoQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19RVUlURSksCisJCQlhaWNfZGV2KTsKKyAgICAgIGFpYzd4eHhfc2V0X3N5bmNyYXRlKHAsIE5VTEwsIHNjYi0+Y21kLT5kZXZpY2UtPmlkLCBzY2ItPmNtZC0+ZGV2aWNlLT5jaGFubmVsLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQUhDX1RSQU5TX0FDVElWRXxBSENfVFJBTlNfQ1VSfEFIQ19UUkFOU19RVUlURSwKKwkJCSAgIGFpY19kZXYpOworICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgIHNjYi0+ZmxhZ3MgJj0gflNDQl9NU0dPVVRfQklUUzsKKyAgICAgIGlmKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgeworICAgICAgICBwcmludGsoSU5GT19MRUFEICJwYXJpdHkgZXJyb3IgZHVyaW5nIFBQUiBtZXNzYWdlLCByZXZlcnRpbmcgIgorICAgICAgICAgICAgICAgInRvIFdEVFIvU0RUUlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIH0KKyAgICAgIGlmICggYWljX2Rldi0+Z29hbC53aWR0aCApCisgICAgICB7CisgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDE7CisgICAgICB9CisgICAgICBpZiAoIGFpY19kZXYtPmdvYWwub2Zmc2V0ICkKKyAgICAgIHsKKyAgICAgICAgaWYoIGFpY19kZXYtPmdvYWwucGVyaW9kIDw9IDkgKQorICAgICAgICB7CisgICAgICAgICAgYWljX2Rldi0+Z29hbC5wZXJpb2QgPSAxMDsKKyAgICAgICAgfQorICAgICAgICBhaWNfZGV2LT5uZWVkc2R0ciA9IGFpY19kZXYtPm5lZWRzZHRyX2NvcHkgPSAxOworICAgICAgfQorICAgICAgc2NiID0gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdlJ3ZlIHNldCB0aGUgaGFyZHdhcmUgdG8gYXNzZXJ0IEFUTiBpZiB3ZSBnZXQgYSBwYXJpdHkKKyAgICAgKiBlcnJvciBvbiAiaW4iIHBoYXNlcywgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgc3R1ZmYgdGhlCisgICAgICogbWVzc2FnZSBidWZmZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZS4gICJJbiIgcGhhc2VzCisgICAgICogaGF2ZSBzZXQgbWVzZ19vdXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gTVNHX05PUC4KKyAgICAgKi8KKyAgICBpZiAobWVzZ19vdXQgIT0gTVNHX05PT1ApCisgICAgeworICAgICAgYWljX291dGIocCwgbWVzZ19vdXQsIE1TR19PVVQpOworICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0lHSSkgfCBBVE5PLCBTQ1NJU0lHTyk7CisgICAgICBzY2IgPSBOVUxMOworICAgIH0KKyAgICBhaWNfb3V0YihwLCBDTFJTQ1NJUEVSUiwgQ0xSU0lOVDEpOworICAgIGFpY19vdXRiKHAsIENMUlNDU0lJTlQsIENMUklOVCk7CisgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgLyogdW5wYXVzZV9hbHdheXMgKi8gVFJVRSk7CisgIH0KKyAgZWxzZSBpZiAoIChzdGF0dXMgJiBSRVFJTklUKSAmJgorICAgICAgICAgICAgKHAtPmZsYWdzICYgQUhDX0hBTkRMSU5HX1JFUUlOSVRTKSApCisgIHsKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgIkhhbmRsaW5nIFJFUUlOSVQsIFNTVEFUMT0weCV4LlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICBDVExfT0ZfU0NCKHNjYiksIGFpY19pbmIocCwgU1NUQVQxKSk7CisjZW5kaWYKKyAgICBhaWM3eHh4X2hhbmRsZV9yZXFpbml0KHAsIHNjYik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UKKyAgeworICAgIC8qCisgICAgICogV2UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24uIFR1cm4gb2ZmIHRoZQorICAgICAqIGludGVycnVwdCBzb3VyY2UgYW5kIHRyeSB0byBjb250aW51ZS4KKyAgICAgKi8KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9TQ1NJSU5UKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiVW5rbm93biBTQ1NJSU5UIHN0YXR1cywgU1NUQVQxKDB4JXgpLlxuIiwKKyAgICAgICAgcC0+aG9zdF9ubywgLTEsIC0xLCAtMSwgc3RhdHVzKTsKKyAgICBhaWNfb3V0YihwLCBzdGF0dXMsIENMUlNJTlQxKTsKKyAgICBhaWNfb3V0YihwLCBDTFJTQ1NJSU5ULCBDTFJJTlQpOworICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIC8qIHVucGF1c2UgYWx3YXlzICovIFRSVUUpOworICAgIHNjYiA9IE5VTEw7CisgIH0KKyAgaWYgKHNjYiAhPSBOVUxMKQorICB7CisgICAgYWljN3h4eF9kb25lKHAsIHNjYik7CisgIH0KK30KKworI2lmZGVmIEFJQzdYWFhfVkVSQk9TRV9ERUJVR0dJTkcKK3N0YXRpYyB2b2lkCithaWM3eHh4X2NoZWNrX3NjYnMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgY2hhciAqYnVmZmVyKQoreworICB1bnNpZ25lZCBjaGFyIHNhdmVkX3NjYnB0ciwgZnJlZV9zY2JoLCBkaXNfc2NiaCwgd2FpdF9zY2JoLCB0ZW1wOworICBpbnQgaSwgYm9ndXMsIGxvc3Q7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjYl9zdGF0dXNbQUlDN1hYWF9NQVhTQ0JdOworCisjZGVmaW5lIFNDQl9OT19MSVNUIDAKKyNkZWZpbmUgU0NCX0ZSRUVfTElTVCAxCisjZGVmaW5lIFNDQl9XQUlUSU5HX0xJU1QgMgorI2RlZmluZSBTQ0JfRElTQ09OTkVDVEVEX0xJU1QgNAorI2RlZmluZSBTQ0JfQ1VSUkVOVExZX0FDVElWRSA4CisKKyAgLyoKKyAgICogTm90ZSwgdGhlc2UgY2hlY2tzIHdpbGwgZmFpbCBvbiBhIHJlZ3VsYXIgYmFzaXMgb25jZSB0aGUgbWFjaGluZSBtb3ZlcworICAgKiBiZXlvbmQgdGhlIGJ1cyBzY2FuIHBoYXNlLiAgVGhlIHByb2JsZW0gaXMgcmFjZSBjb25kaXRpb25zIGNvbmNlcm5pbmcKKyAgICogdGhlIHNjYnMgYW5kIHdoZXJlIHRoZXkgYXJlIGxpbmtlZCBpbi4gIFdoZW4geW91IGhhdmUgMzAgb3Igc28gY29tbWFuZHMKKyAgICogb3V0c3RhbmRpbmcgb24gdGhlIGJ1cywgYW5kIHJ1biB0aGlzIHR3aWNlIHdpdGggZXZlcnkgaW50ZXJydXB0LCB0aGUKKyAgICogY2hhbmNlcyBnZXQgcHJldHR5IGdvb2QgdGhhdCB5b3UnbGwgY2F0Y2ggdGhlIHNlcXVlbmNlciB3aXRoIGFuIFNDQgorICAgKiBvbmx5IHBhcnRpYWxseSBsaW5rZWQgaW4uICBUaGVyZWZvcmUsIG9uY2Ugd2UgcGFzcyB0aGUgc2NhbiBwaGFzZQorICAgKiBvZiB0aGUgYnVzLCB3ZSByZWFsbHkgc2hvdWxkIGRpc2FibGUgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIGJvZ3VzID0gRkFMU0U7CisgIG1lbXNldCgmc2NiX3N0YXR1c1swXSwgMCwgc2l6ZW9mKHNjYl9zdGF0dXMpKTsKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworICBzYXZlZF9zY2JwdHIgPSBhaWNfaW5iKHAsIFNDQlBUUik7CisgIGlmIChzYXZlZF9zY2JwdHIgPj0gcC0+c2NiX2RhdGEtPm1heGhzY2JzKQorICB7CisgICAgcHJpbnRrKCJCb2d1cyBTQ0JQVFIgJWRcbiIsIHNhdmVkX3NjYnB0cik7CisgICAgYm9ndXMgPSBUUlVFOworICB9CisgIHNjYl9zdGF0dXNbc2F2ZWRfc2NicHRyXSA9IFNDQl9DVVJSRU5UTFlfQUNUSVZFOworICBmcmVlX3NjYmggPSBhaWNfaW5iKHAsIEZSRUVfU0NCSCk7CisgIGlmICggKGZyZWVfc2NiaCAhPSBTQ0JfTElTVF9OVUxMKSAmJgorICAgICAgIChmcmVlX3NjYmggPj0gcC0+c2NiX2RhdGEtPm1heGhzY2JzKSApCisgIHsKKyAgICBwcmludGsoIkJvZ3VzIEZSRUVfU0NCSCAlZFxuIiwgZnJlZV9zY2JoKTsKKyAgICBib2d1cyA9IFRSVUU7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVtcCA9IGZyZWVfc2NiaDsKKyAgICB3aGlsZSggKHRlbXAgIT0gU0NCX0xJU1RfTlVMTCkgJiYgKHRlbXAgPCBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpICkKKyAgICB7CisgICAgICBpZihzY2Jfc3RhdHVzW3RlbXBdICYgMHgwNykKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJIU0NCICVkIG9uIG11bHRpcGxlIGxpc3RzLCBzdGF0dXMgMHglMDJ4IiwgdGVtcCwKKyAgICAgICAgICAgICAgIHNjYl9zdGF0dXNbdGVtcF0gfCBTQ0JfRlJFRV9MSVNUKTsKKyAgICAgICAgYm9ndXMgPSBUUlVFOworICAgICAgfQorICAgICAgc2NiX3N0YXR1c1t0ZW1wXSB8PSBTQ0JfRlJFRV9MSVNUOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0NCUFRSKTsKKyAgICAgIHRlbXAgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgICB9CisgIH0KKworICBkaXNfc2NiaCA9IGFpY19pbmIocCwgRElTQ09OTkVDVEVEX1NDQkgpOworICBpZiAoIChkaXNfc2NiaCAhPSBTQ0JfTElTVF9OVUxMKSAmJgorICAgICAgIChkaXNfc2NiaCA+PSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpICkKKyAgeworICAgIHByaW50aygiQm9ndXMgRElTQ09OTkVDVEVEX1NDQkggJWRcbiIsIGRpc19zY2JoKTsKKyAgICBib2d1cyA9IFRSVUU7CisgIH0KKyAgZWxzZQorICB7CisgICAgdGVtcCA9IGRpc19zY2JoOworICAgIHdoaWxlKCAodGVtcCAhPSBTQ0JfTElTVF9OVUxMKSAmJiAodGVtcCA8IHAtPnNjYl9kYXRhLT5tYXhoc2NicykgKQorICAgIHsKKyAgICAgIGlmKHNjYl9zdGF0dXNbdGVtcF0gJiAweDA3KQorICAgICAgeworICAgICAgICBwcmludGsoIkhTQ0IgJWQgb24gbXVsdGlwbGUgbGlzdHMsIHN0YXR1cyAweCUwMngiLCB0ZW1wLAorICAgICAgICAgICAgICAgc2NiX3N0YXR1c1t0ZW1wXSB8IFNDQl9ESVNDT05ORUNURURfTElTVCk7CisgICAgICAgIGJvZ3VzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHNjYl9zdGF0dXNbdGVtcF0gfD0gU0NCX0RJU0NPTk5FQ1RFRF9MSVNUOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0NCUFRSKTsKKyAgICAgIHRlbXAgPSBhaWNfaW5iKHAsIFNDQl9ORVhUKTsKKyAgICB9CisgIH0KKyAgCisgIHdhaXRfc2NiaCA9IGFpY19pbmIocCwgV0FJVElOR19TQ0JIKTsKKyAgaWYgKCAod2FpdF9zY2JoICE9IFNDQl9MSVNUX05VTEwpICYmCisgICAgICAgKHdhaXRfc2NiaCA+PSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpICkKKyAgeworICAgIHByaW50aygiQm9ndXMgV0FJVElOR19TQ0JIICVkXG4iLCB3YWl0X3NjYmgpOworICAgIGJvZ3VzID0gVFJVRTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0ZW1wID0gd2FpdF9zY2JoOworICAgIHdoaWxlKCAodGVtcCAhPSBTQ0JfTElTVF9OVUxMKSAmJiAodGVtcCA8IHAtPnNjYl9kYXRhLT5tYXhoc2NicykgKQorICAgIHsKKyAgICAgIGlmKHNjYl9zdGF0dXNbdGVtcF0gJiAweDA3KQorICAgICAgeworICAgICAgICBwcmludGsoIkhTQ0IgJWQgb24gbXVsdGlwbGUgbGlzdHMsIHN0YXR1cyAweCUwMngiLCB0ZW1wLAorICAgICAgICAgICAgICAgc2NiX3N0YXR1c1t0ZW1wXSB8IFNDQl9XQUlUSU5HX0xJU1QpOworICAgICAgICBib2d1cyA9IFRSVUU7CisgICAgICB9CisgICAgICBzY2Jfc3RhdHVzW3RlbXBdIHw9IFNDQl9XQUlUSU5HX0xJU1Q7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTQ0JQVFIpOworICAgICAgdGVtcCA9IGFpY19pbmIocCwgU0NCX05FWFQpOworICAgIH0KKyAgfQorCisgIGxvc3Q9MDsKKyAgZm9yKGk9MDsgaSA8IHAtPnNjYl9kYXRhLT5tYXhoc2NiczsgaSsrKQorICB7CisgICAgYWljX291dGIocCwgaSwgU0NCUFRSKTsKKyAgICB0ZW1wID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisgICAgaWYgKCAoKHRlbXAgIT0gU0NCX0xJU1RfTlVMTCkgJiYKKyAgICAgICAgICAodGVtcCA+PSBwLT5zY2JfZGF0YS0+bWF4aHNjYnMpKSApCisgICAgeworICAgICAgcHJpbnRrKCJIU0NCICVkIGJhZCwgU0NCX05FWFQgaW52YWxpZCglZCkuXG4iLCBpLCB0ZW1wKTsKKyAgICAgIGJvZ3VzID0gVFJVRTsKKyAgICB9CisgICAgaWYgKCB0ZW1wID09IGkgKQorICAgIHsKKyAgICAgIHByaW50aygiSFNDQiAlZCBiYWQsIFNDQl9ORVhUIHBvaW50cyB0byBzZWxmLlxuIiwgaSk7CisgICAgICBib2d1cyA9IFRSVUU7CisgICAgfQorICAgIGlmIChzY2Jfc3RhdHVzW2ldID09IDApCisgICAgICBsb3N0Kys7CisgICAgaWYgKGxvc3QgPiAxKQorICAgIHsKKyAgICAgIHByaW50aygiVG9vIG1hbnkgbG9zdCBzY2JzLlxuIik7CisgICAgICBib2d1cz1UUlVFOworICAgIH0KKyAgfQorICBhaWNfb3V0YihwLCBzYXZlZF9zY2JwdHIsIFNDQlBUUik7CisgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgaWYgKGJvZ3VzKQorICB7CisgICAgcHJpbnRrKCJCb2d1cyBwYXJhbWV0ZXJzIGZvdW5kIGluIGNhcmQgU0NCIGFycmF5IHN0cnVjdHVyZXMuXG4iKTsKKyAgICBwcmludGsoIiVzXG4iLCBidWZmZXIpOworICAgIGFpYzd4eHhfcGFuaWNfYWJvcnQocCwgTlVMTCk7CisgIH0KKyAgcmV0dXJuOworfQorI2VuZGlmCisKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2hhbmRsZV9jb21tYW5kX2NvbXBsZXRpb25faW50cgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfaGFuZGxlX2NvbW1hbmRfY29tcGxldGlvbl9pbnRyKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiID0gTlVMTDsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKyAgU2NzaV9DbW5kICpjbWQ7CisgIHVuc2lnbmVkIGNoYXIgc2NiX2luZGV4LCB0aW5kZXg7CisKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgIGlmKCAocC0+aXNyX2NvdW50IDwgMTYpICYmIChhaWM3eHh4X3ZlcmJvc2UgPiAweGZmZmYpICkKKyAgICBwcmludGsoSU5GT19MRUFEICJDb21tYW5kIENvbXBsZXRlIEludC5cbiIsIHAtPmhvc3Rfbm8sIC0xLCAtMSwgLTEpOworI2VuZGlmCisgICAgCisgIC8qCisgICAqIFJlYWQgdGhlIElOVFNUQVQgbG9jYXRpb24gYWZ0ZXIgY2xlYXJpbmcgdGhlIENNRElOVCBiaXQuICBUaGlzIGZvcmNlcworICAgKiBhbnkgcG9zdGVkIFBDSSB3cml0ZXMgdG8gZmx1c2ggdG8gbWVtb3J5LiAgR2VyYXJkIFJvdWRpZXIgc3VnZ2VzdGVkCisgICAqIHRoaXMgZml4IHRvIHRoZSBwb3NzaWJsZSByYWNlIG9mIGNsZWFyaW5nIHRoZSBDTURJTlQgYml0IGJ1dCBub3QKKyAgICogaGF2aW5nIGFsbCBjb21tYW5kIGJ5dGVzIGZsdXNoZWQgb250byB0aGUgcW91dGZpZm8uCisgICAqLworICBhaWNfb3V0YihwLCBDTFJDTURJTlQsIENMUklOVCk7CisgIGFpY19pbmIocCwgSU5UU1RBVCk7CisgIC8qCisgICAqIFRoZSBzZXF1ZW5jZXIgd2lsbCBjb250aW51ZSBydW5uaW5nIHdoZW4gaXQKKyAgICogaXNzdWVzIHRoaXMgaW50ZXJydXB0LiBUaGVyZSBtYXkgYmUgPjEgY29tbWFuZHMKKyAgICogZmluaXNoZWQsIHNvIGxvb3AgdW50aWwgd2UndmUgcHJvY2Vzc2VkIHRoZW0gYWxsLgorICAgKi8KKworICB3aGlsZSAocC0+cW91dGZpZm9bcC0+cW91dGZpZm9uZXh0XSAhPSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgc2NiX2luZGV4ID0gcC0+cW91dGZpZm9bcC0+cW91dGZpZm9uZXh0XTsKKyAgICBwLT5xb3V0Zmlmb1twLT5xb3V0Zmlmb25leHQrK10gPSBTQ0JfTElTVF9OVUxMOworICAgIGlmICggc2NiX2luZGV4ID49IHAtPnNjYl9kYXRhLT5udW1zY2JzICkKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJDTURDTVBMVCB3aXRoIGludmFsaWQgU0NCIGluZGV4ICVkXG4iLCBwLT5ob3N0X25vLAorICAgICAgICAtMSwgLTEsIC0xLCBzY2JfaW5kZXgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHNjYiA9IHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbc2NiX2luZGV4XTsKKyAgICBpZiAoIShzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkgfHwgKHNjYi0+Y21kID09IE5VTEwpKQorICAgIHsKKyAgICAgIHByaW50ayhXQVJOX0xFQUQgIkNNRENNUExUIHdpdGhvdXQgY29tbWFuZCBmb3IgU0NCICVkLCBTQ0IgZmxhZ3MgIgorICAgICAgICAiMHgleCwgY21kIDB4JWx4XG4iLCBwLT5ob3N0X25vLCAtMSwgLTEsIC0xLCBzY2JfaW5kZXgsIHNjYi0+ZmxhZ3MsCisgICAgICAgICh1bnNpZ25lZCBsb25nKSBzY2ItPmNtZCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdGluZGV4ID0gVEFSR0VUX0lOREVYKHNjYi0+Y21kKTsKKyAgICBhaWNfZGV2ID0gQUlDX0RFVihzY2ItPmNtZCk7CisgICAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfUVVFVUVEX0FCT1JUKQorICAgIHsKKyAgICAgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgICAgIGlmICggKChhaWNfaW5iKHAsIExBU1RQSEFTRSkgJiBQSEFTRV9NQVNLKSAhPSBQX0JVU0ZSRUUpICYmCisgICAgICAgICAgIChhaWNfaW5iKHAsIFNDQl9UQUcpID09IHNjYi0+aHNjYi0+dGFnKSApCisgICAgICB7CisgICAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBhaWM3eHh4X3Jlc2V0X2RldmljZShwLCBzY2ItPmNtZC0+ZGV2aWNlLT5pZCwgc2NiLT5jbWQtPmRldmljZS0+Y2hhbm5lbCwKKyAgICAgICAgc2NiLT5jbWQtPmRldmljZS0+bHVuLCBzY2ItPmhzY2ItPnRhZyk7CisgICAgICBzY2ItPmZsYWdzICY9IH4oU0NCX1FVRVVFRF9GT1JfRE9ORSB8IFNDQl9SRVNFVCB8IFNDQl9BQk9SVCB8CisgICAgICAgIFNDQl9RVUVVRURfQUJPUlQpOworICAgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworICAgIH0KKyAgICBlbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX0FCT1JUKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBXZSBzdGFydGVkIHRvIGFib3J0IHRoaXMsIGJ1dCBpdCBjb21wbGV0ZWQgb24gdXMsIGxldCBpdAorICAgICAgICogdGhyb3VnaCBhcyBzdWNjZXNzZnVsCisgICAgICAgKi8KKyAgICAgIHNjYi0+ZmxhZ3MgJj0gfihTQ0JfQUJPUlR8U0NCX1JFU0VUKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2NiLT5mbGFncyAmIFNDQl9TRU5TRSkKKyAgICB7CisgICAgICBjaGFyICpidWZmZXIgPSAmc2NiLT5jbWQtPnNlbnNlX2J1ZmZlclswXTsKKworICAgICAgaWYgKGJ1ZmZlclsxMl0gPT0gMHg0NyB8fCBidWZmZXJbMTJdID09IDB4NTQpCisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNpZ25hbCB0aGF0IHdlIG5lZWQgdG8gcmUtbmVnb3RpYXRlIHRoaW5ncy4KKyAgICAgICAgICovCisgICAgICAgIGFpY19kZXYtPm5lZWRwcHIgPSBhaWNfZGV2LT5uZWVkcHByX2NvcHk7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weTsKKyAgICAgICAgYWljX2Rldi0+bmVlZHdkdHIgPSBhaWNfZGV2LT5uZWVkd2R0cl9jb3B5OworICAgICAgfQorICAgIH0KKyAgICBjbWQgPSBzY2ItPmNtZDsKKyAgICBpZiAoc2NiLT5oc2NiLT5yZXNpZHVhbF9TR19zZWdtZW50X2NvdW50ICE9IDApCisgICAgeworICAgICAgYWljN3h4eF9jYWxjdWxhdGVfcmVzaWR1YWwocCwgc2NiKTsKKyAgICB9CisgICAgY21kLT5yZXN1bHQgfD0gKGFpYzd4eHhfZXJyb3IoY21kKSA8PCAxNik7CisgICAgYWljN3h4eF9kb25lKHAsIHNjYik7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2lzcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTQ1NJIGNvbnRyb2xsZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICB1bnNpZ25lZCBjaGFyIGludHN0YXQ7CisKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopZGV2X2lkOworCisgIC8qCisgICAqIEp1c3QgYSBmZXcgc2FuaXR5IGNoZWNrcy4gIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYW4gaW50IHBlbmRpbmcuCisgICAqIEFsc28sIGlmIFBDSSwgdGhlbiB3ZSBhcmUgZ29pbmcgdG8gY2hlY2sgZm9yIGEgUENJIGJ1cyBlcnJvciBzdGF0dXMKKyAgICogc2hvdWxkIHdlIGdldCB0b28gbWFueSBzcHVyaW91cyBpbnRlcnJ1cHRzLgorICAgKi8KKyAgaWYgKCEoKGludHN0YXQgPSBhaWNfaW5iKHAsIElOVFNUQVQpKSAmIElOVF9QRU5EKSkKKyAgeworI2lmZGVmIENPTkZJR19QQ0kKKyAgICBpZiAoIChwLT5jaGlwICYgQUhDX1BDSSkgJiYgKHAtPnNwdXJpb3VzX2ludCA+IDUwMCkgJiYKKyAgICAgICAgIShwLT5mbGFncyAmIEFIQ19IQU5ETElOR19SRVFJTklUUykgKQorICAgIHsKKyAgICAgIGlmICggYWljX2luYihwLCBFUlJPUikgJiBQQ0lFUlJTVEFUICkKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF9wY2lfaW50cihwKTsKKyAgICAgIH0KKyAgICAgIHAtPnNwdXJpb3VzX2ludCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKCAhKHAtPmZsYWdzICYgQUhDX0hBTkRMSU5HX1JFUUlOSVRTKSApCisgICAgeworICAgICAgcC0+c3B1cmlvdXNfaW50Kys7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuOworICB9CisKKyAgcC0+c3B1cmlvdXNfaW50ID0gMDsKKworICAvKgorICAgKiBLZWVwIHRyYWNrIG9mIGludGVycnVwdHMgZm9yIC9wcm9jL3Njc2kKKyAgICovCisgIHAtPmlzcl9jb3VudCsrOworCisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICBpZiAoIChwLT5pc3JfY291bnQgPCAxNikgJiYgKGFpYzd4eHhfdmVyYm9zZSA+IDB4ZmZmZikgJiYKKyAgICAgICAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkgJiYgKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSApCisgICAgYWljN3h4eF9jaGVja19zY2JzKHAsICJCb2d1cyBzZXR0aW5ncyBhdCBzdGFydCBvZiBpbnRlcnJ1cHQuIik7CisjZW5kaWYKKworICAvKgorICAgKiBIYW5kbGUgYWxsIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAtIGVzcGVjaWFsbHkgZm9yIFNDU0kKKyAgICogaW50ZXJydXB0cywgd2Ugd29uJ3QgZ2V0IGEgc2Vjb25kIGNoYW5jZSBhdCB0aGVtLgorICAgKi8KKyAgaWYgKGludHN0YXQgJiBDTURDTVBMVCkKKyAgeworICAgIGFpYzd4eHhfaGFuZGxlX2NvbW1hbmRfY29tcGxldGlvbl9pbnRyKHApOworICB9CisKKyAgaWYgKGludHN0YXQgJiBCUktBRFJJTlQpCisgIHsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIGVycm5vID0gYWljX2luYihwLCBFUlJPUik7CisKKyAgICBwcmludGsoS0VSTl9FUlIgIihzY3NpJWQpIEJSS0FEUklOVCBlcnJvcigweCV4KTpcbiIsIHAtPmhvc3Rfbm8sIGVycm5vKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoYXJkX2Vycm9yKTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChlcnJubyAmIGhhcmRfZXJyb3JbaV0uZXJybm8pCisgICAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiICAlc1xuIiwgaGFyZF9lcnJvcltpXS5lcnJtZXNnKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRrKEtFUk5fRVJSICIoc2NzaSVkKSAgIFNFUUFERFI9MHgleFxuIiwgcC0+aG9zdF9ubywKKyAgICAgICgoKGFpY19pbmIocCwgU0VRQUREUjEpIDw8IDgpICYgMHgxMDApIHwgYWljX2luYihwLCBTRVFBRERSMCkpKTsKKyAgICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICAgIGFpYzd4eHhfcGFuaWNfYWJvcnQocCwgTlVMTCk7CisjaWZkZWYgQ09ORklHX1BDSQorICAgIGlmIChlcnJubyAmIFBDSUVSUlNUQVQpCisgICAgICBhaWM3eHh4X3BjaV9pbnRyKHApOworI2VuZGlmCisgICAgaWYgKGVycm5vICYgKFNRUEFSRVJSIHwgSUxMT1BDT0RFIHwgSUxMU0FERFIpKQorICAgIHsKKyAgICAgIHBhbmljKCJhaWM3eHh4OiB1bnJlY292ZXJhYmxlIEJSS0FEUklOVC5cbiIpOworICAgIH0KKyAgICBpZiAoZXJybm8gJiBJTExIQUREUikKKyAgICB7CisgICAgICBwcmludGsoS0VSTl9FUlIgIihzY3NpJWQpIEJVRyEgRHJpdmVyIGFjY2Vzc2VkIGNoaXAgd2l0aG91dCBmaXJzdCAiCisgICAgICAgICAgICAgInBhdXNpbmcgY29udHJvbGxlciFcbiIsIHAtPmhvc3Rfbm8pOworICAgIH0KKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgICAgaWYgKGVycm5vICYgRFBBUkVSUikKKyAgICB7CisgICAgICBpZiAoYWljX2luYihwLCBETUFQQVJBTVMpICYgRElSRUNUSU9OKQorICAgICAgICBwcmludGsoIihzY3NpJWQpIHdoaWxlIERNQWluZyBTQ0IgZnJvbSBob3N0IHRvIGNhcmQuXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIoc2NzaSVkKSB3aGlsZSBETUFpbmcgU0NCIGZyb20gY2FyZCB0byBob3N0LlxuIiwgcC0+aG9zdF9ubyk7CisgICAgfQorI2VuZGlmCisgICAgYWljX291dGIocCwgQ0xSUEFSRVJSIHwgQ0xSQlJLQURSSU5ULCBDTFJJTlQpOworICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgfQorCisgIGlmIChpbnRzdGF0ICYgU0VRSU5UKQorICB7CisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBDQ1NDQkNUTCByZWdpc3RlciB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgVWx0cmEyIGNhcmRzCisgICAgICovCisgICAgaWYocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgIHsKKyAgICAgIGFpY19pbmIocCwgQ0NTQ0JDVEwpOworICAgIH0KKyAgICBhaWM3eHh4X2hhbmRsZV9zZXFpbnQocCwgaW50c3RhdCk7CisgIH0KKworICBpZiAoaW50c3RhdCAmIFNDU0lJTlQpCisgIHsKKyAgICBhaWM3eHh4X2hhbmRsZV9zY3NpaW50KHAsIGludHN0YXQpOworICB9CisKKyNpZmRlZiBBSUM3WFhYX1ZFUkJPU0VfREVCVUdHSU5HCisgIGlmICggKHAtPmlzcl9jb3VudCA8IDE2KSAmJiAoYWljN3h4eF92ZXJib3NlID4gMHhmZmZmKSAmJgorICAgICAgIChhaWM3eHh4X3BhbmljX29uX2Fib3J0KSAmJiAocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICkKKyAgICBhaWM3eHh4X2NoZWNrX3NjYnMocCwgIkJvZ3VzIHNldHRpbmdzIGF0IGVuZCBvZiBpbnRlcnJ1cHQuIik7CisjZW5kaWYKKworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGRvX2FpYzd4eHhfaXNyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgaXMgYSBncm9zcyBoYWNrIHRvIHNvbHZlIGEgcHJvYmxlbSBpbiBsaW51eCBrZXJuZWxzIDIuMS44NSBhbmQKKyAqICAgYWJvdmUuICBQbGVhc2UsIGNoaWxkcmVuLCBkbyBub3QgdHJ5IHRoaXMgYXQgaG9tZSwgYW5kIGlmIHlvdSBldmVyIHNlZQorICogICBhbnl0aGluZyBsaWtlIGl0LCBwbGVhc2UgaW5mb3JtIHRoZSBHcm9zcyBIYWNrIFBvbGljZSBpbW1lZGlhdGVseQorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2RvX2FpYzd4eHhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICAKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopZGV2X2lkOworICBpZighcCkKKyAgICByZXR1cm4gSVJRX05PTkU7CisgIHNwaW5fbG9ja19pcnFzYXZlKHAtPmhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKyAgcC0+ZmxhZ3MgfD0gQUhDX0lOX0lTUjsKKyAgZG8KKyAgeworICAgIGFpYzd4eHhfaXNyKGlycSwgZGV2X2lkLCByZWdzKTsKKyAgfSB3aGlsZSAoIChhaWNfaW5iKHAsIElOVFNUQVQpICYgSU5UX1BFTkQpICk7CisgIGFpYzd4eHhfZG9uZV9jbWRzX2NvbXBsZXRlKHApOworICBhaWM3eHh4X3J1bl93YWl0aW5nX3F1ZXVlcyhwKTsKKyAgcC0+ZmxhZ3MgJj0gfkFIQ19JTl9JU1I7CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUocC0+aG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCisgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2luaXRfdHJhbnNpbmZvCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFNldCB1cCB0aGUgaW5pdGlhbCBhaWNfZGV2IHZhbHVlcyBmcm9tIHRoZSBCSU9TIHNldHRpbmdzIGFuZCBmcm9tCisgKiAgIElOUVVJUlkgcmVzdWx0cworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9pbml0X3RyYW5zaW5mbyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2KQoreworICBTY3NpX0RldmljZSAqc2RwbnQgPSBhaWNfZGV2LT5TRHB0cjsKKyAgdW5zaWduZWQgY2hhciB0aW5kZXg7CisKKyAgdGluZGV4ID0gc2RwbnQtPmlkIHwgKHNkcG50LT5jaGFubmVsIDw8IDMpOworICBpZiAoIShhaWNfZGV2LT5mbGFncyAmIERFVklDRV9EVFJfU0NBTk5FRCkpCisgIHsKKyAgICBhaWNfZGV2LT5mbGFncyB8PSBERVZJQ0VfRFRSX1NDQU5ORUQ7CisKKyAgICBpZiAoIHNkcG50LT53ZHRyICYmIChwLT5mZWF0dXJlcyAmIEFIQ19XSURFKSApCisgICAgeworICAgICAgYWljX2Rldi0+bmVlZHdkdHIgPSBhaWNfZGV2LT5uZWVkd2R0cl9jb3B5ID0gMTsKKyAgICAgIGFpY19kZXYtPmdvYWwud2lkdGggPSBwLT51c2VyW3RpbmRleF0ud2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhaWNfZGV2LT5uZWVkd2R0ciA9IGFpY19kZXYtPm5lZWR3ZHRyX2NvcHkgPSAwOworICAgICAgcGF1c2Vfc2VxdWVuY2VyKHApOworICAgICAgYWljN3h4eF9zZXRfd2lkdGgocCwgc2RwbnQtPmlkLCBzZHBudC0+Y2hhbm5lbCwgc2RwbnQtPmx1biwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1TR19FWFRfV0RUUl9CVVNfOF9CSVQsIChBSENfVFJBTlNfQUNUSVZFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSENfVFJBTlNfR09BTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1RSQU5TX0NVUiksIGFpY19kZXYgKTsKKyAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICB9CisgICAgaWYgKCBzZHBudC0+c2R0ciAmJiBwLT51c2VyW3RpbmRleF0ub2Zmc2V0ICkKKyAgICB7CisgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IHAtPnVzZXJbdGluZGV4XS5wZXJpb2Q7CisgICAgICBhaWNfZGV2LT5nb2FsLm9wdGlvbnMgPSBwLT51c2VyW3RpbmRleF0ub3B0aW9uczsKKyAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICBlbHNlIGlmIChhaWNfZGV2LT5nb2FsLndpZHRoID09IE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKQorICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCA9IE1BWF9PRkZTRVRfMTZCSVQ7CisgICAgICBlbHNlCisgICAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gTUFYX09GRlNFVF84QklUOworICAgICAgaWYgKCBzZHBudC0+cHByICYmIHAtPnVzZXJbdGluZGV4XS5wZXJpb2QgPD0gOSAmJgorICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS5vcHRpb25zICkKKyAgICAgIHsKKyAgICAgICAgYWljX2Rldi0+bmVlZHBwciA9IGFpY19kZXYtPm5lZWRwcHJfY29weSA9IDE7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDA7CisgICAgICAgIGFpY19kZXYtPm5lZWR3ZHRyID0gYWljX2Rldi0+bmVlZHdkdHJfY29weSA9IDA7CisgICAgICAgIGFpY19kZXYtPmZsYWdzIHw9IERFVklDRV9TQ1NJXzM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDE7CisgICAgICAgIGFpY19kZXYtPmdvYWwucGVyaW9kID0gbWF4X3QodW5zaWduZWQgY2hhciwgMTAsIGFpY19kZXYtPmdvYWwucGVyaW9kKTsKKyAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFpY19kZXYtPm5lZWRzZHRyID0gYWljX2Rldi0+bmVlZHNkdHJfY29weSA9IDA7CisgICAgICBhaWNfZGV2LT5nb2FsLnBlcmlvZCA9IDI1NTsKKyAgICAgIGFpY19kZXYtPmdvYWwub2Zmc2V0ID0gMDsKKyAgICAgIGFpY19kZXYtPmdvYWwub3B0aW9ucyA9IDA7CisgICAgfQorICAgIGFpY19kZXYtPmZsYWdzIHw9IERFVklDRV9QUklOVF9EVFI7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NsYXZlX2FsbG9jCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFNldCB1cCB0aGUgaW5pdGlhbCBhaWNfZGV2IHN0cnVjdCBwb2ludGVycworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NsYXZlX2FsbG9jKFNjc2lfRGV2aWNlICpTRHB0cikKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopU0RwdHItPmhvc3QtPmhvc3RkYXRhOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIGFpY19kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWljX2Rldl9kYXRhKSwgR0ZQX0FUT01JQyB8IEdGUF9LRVJORUwpOworICBpZighYWljX2RldikKKyAgICByZXR1cm4gMTsKKyAgLyoKKyAgICogQ2hlY2sgdG8gc2VlIGlmIGNoYW5uZWwgd2FzIHNjYW5uZWQuCisgICAqLworICAKKyAgaWYgKCEocC0+ZmxhZ3MgJiBBSENfQV9TQ0FOTkVEKSAmJiAoU0RwdHItPmNoYW5uZWwgPT0gMCkpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICBwcmludGsoSU5GT19MRUFEICJTY2FubmluZyBjaGFubmVsIGZvciBkZXZpY2VzLlxuIiwKKyAgICAgICAgcC0+aG9zdF9ubywgMCwgLTEsIC0xKTsKKyAgICBwLT5mbGFncyB8PSBBSENfQV9TQ0FOTkVEOworICB9CisgIGVsc2UKKyAgeworICAgIGlmICghKHAtPmZsYWdzICYgQUhDX0JfU0NBTk5FRCkgJiYgKFNEcHRyLT5jaGFubmVsID09IDEpKQorICAgIHsKKyAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU2Nhbm5pbmcgY2hhbm5lbCBmb3IgZGV2aWNlcy5cbiIsCisgICAgICAgICAgcC0+aG9zdF9ubywgMSwgLTEsIC0xKTsKKyAgICAgIHAtPmZsYWdzIHw9IEFIQ19CX1NDQU5ORUQ7CisgICAgfQorICB9CisKKyAgbWVtc2V0KGFpY19kZXYsIDAsIHNpemVvZihzdHJ1Y3QgYWljX2Rldl9kYXRhKSk7CisgIFNEcHRyLT5ob3N0ZGF0YSA9IGFpY19kZXY7CisgIGFpY19kZXYtPlNEcHRyID0gU0RwdHI7CisgIGFpY19kZXYtPm1heF9xX2RlcHRoID0gMTsKKyAgYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gMTsKKyAgc2NicV9pbml0KCZhaWNfZGV2LT5kZWxheWVkX3NjYnMpOworICBJTklUX0xJU1RfSEVBRCgmYWljX2Rldi0+bGlzdCk7CisgIGxpc3RfYWRkX3RhaWwoJmFpY19kZXYtPmxpc3QsICZwLT5haWNfZGV2cyk7CisgIHJldHVybiAwOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfZGV2aWNlX3F1ZXVlX2RlcHRoCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIERldGVybWluZXMgdGhlIHF1ZXVlIGRlcHRoIGZvciBhIGdpdmVuIGRldmljZS4gIFRoZXJlIGFyZSB0d28gd2F5cworICogICBhIHF1ZXVlIGRlcHRoIGNhbiBiZSBvYnRhaW5lZCBmb3IgYSB0YWdnZWQgcXVldWVpbmcgZGV2aWNlLiAgT25lCisgKiAgIHdheSBpcyB0aGUgZGVmYXVsdCBxdWV1ZSBkZXB0aCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIKKyAqICAgYWljN3h4eF9kZWZhdWx0X3F1ZXVlX2RlcHRoLiAgVGhlIG90aGVyIGlzIGJ5IHRoZSBhaWM3eHh4X3RhZ19pbmZvCisgKiAgIGFycmF5LgorICoKKyAqICAgSWYgdGFnZ2VkIHF1ZXVlaW5nIGlzbid0IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlLCB0aGVuIHdlIHNldCB0aGUKKyAqICAgZGVwdGggdG8gcC0+aG9zdC0+aG9zdHQtPmNtZF9wZXJfbHVuIGZvciBpbnRlcm5hbCBkcml2ZXIgcXVldWVpbmcuCisgKiAgIGFzIHRoZSBkZWZhdWx0IHF1ZXVlIGRlcHRoLiAgT3RoZXJ3aXNlLCB3ZSB1c2UgZWl0aGVyIDQgb3IgOCBhcyB0aGUKKyAqICAgZGVmYXVsdCBxdWV1ZSBkZXB0aCAoZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgaGFyZHdhcmUgU0NCcykuCisgKiAgIFRoZSBvdGhlciB3YXkgd2UgZGV0ZXJtaW5lIHF1ZXVlIGRlcHRoIGlzIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUKKyAqICAgYWljN3h4eF90YWdfaW5mbyBhcnJheSB3aGljaCBpcyBlbmFibGVkIGJ5IGRlZmluaW5nCisgKiAgIEFJQzdYWFhfVEFHR0VEX1FVRVVFSU5HX0JZX0RFVklDRS4gIFRoaXMgYXJyYXkgY2FuIGJlIGluaXRpYWxpemVkCisgKiAgIHdpdGggcXVldWUgZGVwdGhzIGZvciBpbmRpdmlkdWFsIGRldmljZXMuICBJdCBhbHNvIGFsbG93cyB0YWdnZWQKKyAqICAgcXVldWVpbmcgdG8gYmUgW2VufGRpc11hYmxlZCBmb3IgYSBzcGVjaWZpYyBhZGFwdGVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9kZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgU2NzaV9EZXZpY2UgKmRldmljZSkKK3sKKyAgaW50IHRhZ19lbmFibGVkID0gRkFMU0U7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXYgPSBkZXZpY2UtPmhvc3RkYXRhOworICB1bnNpZ25lZCBjaGFyIHRpbmRleDsKKworICB0aW5kZXggPSBkZXZpY2UtPmlkIHwgKGRldmljZS0+Y2hhbm5lbCA8PCAzKTsKKworICBpZiAoZGV2aWNlLT5zaW1wbGVfdGFncykKKyAgICByZXR1cm47IC8vIFdlJ3ZlIGFscmVhZHkgZW5hYmxlZCB0aGlzIGRldmljZQorCisgIGlmIChkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisgIHsKKyAgICB0YWdfZW5hYmxlZCA9IFRSVUU7CisKKyAgICBpZiAoIShwLT5kaXNjZW5hYmxlICYgKDEgPDwgdGluZGV4KSkpCisgICAgeworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgICAgICBwcmludGsoSU5GT19MRUFEICJEaXNjb25uZWN0aW9uIGRpc2FibGVkLCB1bmFibGUgdG8gIgorICAgICAgICAgICAgICJlbmFibGUgdGFnZ2VkIHF1ZXVlaW5nLlxuIiwKKyAgICAgICAgICAgICBwLT5ob3N0X25vLCBkZXZpY2UtPmNoYW5uZWwsIGRldmljZS0+aWQsIGRldmljZS0+bHVuKTsKKyAgICAgIHRhZ19lbmFibGVkID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocC0+aW5zdGFuY2UgPj0gQVJSQVlfU0laRShhaWM3eHh4X3RhZ19pbmZvKSkKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGludCBwcmludF93YXJuaW5nID0gVFJVRTsKKyAgICAgICAgaWYocHJpbnRfd2FybmluZykKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImFpYzd4eHg6IFdBUk5JTkcsIGluc3VmZmljaWVudCB0YWdfaW5mbyBpbnN0YW5jZXMgZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnN0YWxsZWQgY29udHJvbGxlcnMuXG4iKTsKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiBQbGVhc2UgdXBkYXRlIHRoZSBhaWM3eHh4X3RhZ19pbmZvIGFycmF5IGluIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGUgYWljN3h4eC5jIHNvdXJjZSBmaWxlLlxuIik7CisgICAgICAgICAgcHJpbnRfd2FybmluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGFpY19kZXYtPm1heF9xX2RlcHRoID0gYWljX2Rldi0+dGVtcF9xX2RlcHRoID0KKwkJYWljN3h4eF9kZWZhdWx0X3F1ZXVlX2RlcHRoOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCisgICAgICAgIGlmIChhaWM3eHh4X3RhZ19pbmZvW3AtPmluc3RhbmNlXS50YWdfY29tbWFuZHNbdGluZGV4XSA9PSAyNTUpCisgICAgICAgIHsKKyAgICAgICAgICB0YWdfZW5hYmxlZCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFpYzd4eHhfdGFnX2luZm9bcC0+aW5zdGFuY2VdLnRhZ19jb21tYW5kc1t0aW5kZXhdID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBhaWNfZGV2LT5tYXhfcV9kZXB0aCA9IGFpY19kZXYtPnRlbXBfcV9kZXB0aCA9CisJCSAgYWljN3h4eF9kZWZhdWx0X3F1ZXVlX2RlcHRoOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFpY19kZXYtPm1heF9xX2RlcHRoID0gYWljX2Rldi0+dGVtcF9xX2RlcHRoID0gCisgICAgICAgICAgICBhaWM3eHh4X3RhZ19pbmZvW3AtPmluc3RhbmNlXS50YWdfY29tbWFuZHNbdGluZGV4XTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAodGFnX2VuYWJsZWQpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9ORUdPVElBVElPTjIpCisgICAgeworICAgICAgICAgIHByaW50ayhJTkZPX0xFQUQgIlRhZ2dlZCBxdWV1aW5nIGVuYWJsZWQsIHF1ZXVlIGRlcHRoICVkLlxuIiwKKyAgICAgICAgICAgIHAtPmhvc3Rfbm8sIGRldmljZS0+Y2hhbm5lbCwgZGV2aWNlLT5pZCwKKyAgICAgICAgICAgIGRldmljZS0+bHVuLCBhaWNfZGV2LT5tYXhfcV9kZXB0aCk7CisgICAgfQorICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLCBhaWNfZGV2LT5tYXhfcV9kZXB0aCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfTkVHT1RJQVRJT04yKQorICAgIHsKKyAgICAgICAgICBwcmludGsoSU5GT19MRUFEICJUYWdnZWQgcXVldWluZyBkaXNhYmxlZCwgcXVldWUgZGVwdGggJWQuXG4iLAorICAgICAgICAgICAgcC0+aG9zdF9ubywgZGV2aWNlLT5jaGFubmVsLCBkZXZpY2UtPmlkLAorICAgICAgICAgICAgZGV2aWNlLT5sdW4sIGRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4pOworICAgIH0KKyAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIDAsIGRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4pOworICB9CisgIHJldHVybjsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3NsYXZlX2Rlc3Ryb3kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgcHJlcGFyZSBmb3IgdGhpcyBkZXZpY2UgdG8gZ28gYXdheQorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9zbGF2ZV9kZXN0cm95KFNjc2lfRGV2aWNlICpTRHB0cikKK3sKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKKworICBsaXN0X2RlbCgmYWljX2Rldi0+bGlzdCk7CisgIFNEcHRyLT5ob3N0ZGF0YSA9IE5VTEw7CisgIGtmcmVlKGFpY19kZXYpOworICByZXR1cm47Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zbGF2ZV9jb25maWd1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ29uZmlndXJlIHRoZSBkZXZpY2Ugd2UgYXJlIGF0dGFjaGluZyB0byB0aGUgY29udHJvbGxlci4gIFRoaXMgaXMKKyAqICAgd2hlcmUgd2UgZ2V0IHRvIGRvIHRoaW5ncyBsaWtlIHNjYW4gdGhlIElOUVVJUlkgZGF0YSwgc2V0IHF1ZXVlCisgKiAgIGRlcHRocywgYWxsb2NhdGUgY29tbWFuZCBzdHJ1Y3RzLCBldGMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICpTRHB0cikKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIFNEcHRyLT5ob3N0LT5ob3N0ZGF0YTsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKyAgaW50IHNjYm51bTsKKworICBhaWNfZGV2ID0gKHN0cnVjdCBhaWNfZGV2X2RhdGEgKilTRHB0ci0+aG9zdGRhdGE7CisKKyAgYWljN3h4eF9pbml0X3RyYW5zaW5mbyhwLCBhaWNfZGV2KTsKKyAgYWljN3h4eF9kZXZpY2VfcXVldWVfZGVwdGgocCwgU0RwdHIpOworICBpZihsaXN0X2VtcHR5KCZhaWNfZGV2LT5saXN0KSkKKyAgICBsaXN0X2FkZF90YWlsKCZhaWNfZGV2LT5saXN0LCAmcC0+YWljX2RldnMpOworCisgIHNjYm51bSA9IDA7CisgIGxpc3RfZm9yX2VhY2hfZW50cnkoYWljX2RldiwgJnAtPmFpY19kZXZzLCBsaXN0KSB7CisgICAgc2NibnVtICs9IGFpY19kZXYtPm1heF9xX2RlcHRoOworICB9CisgIHdoaWxlIChzY2JudW0gPiBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgeworICAgIC8qCisgICAgICogUHJlLWFsbG9jYXRlIHRoZSBuZWVkZWQgU0NCcyB0byBnZXQgYXJvdW5kIHRoZSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcKKyAgICAgKiB0byBhbGxvY2F0ZSBzb21lIHdoZW4gbWVtb3J5IGlzIG1vcmUgb3IgbGVzcyBleGhhdXN0ZWQgYW5kIHdlIG5lZWQKKyAgICAgKiB0aGUgU0NCIGluIG9yZGVyIHRvIHBlcmZvcm0gYSBzd2FwIG9wZXJhdGlvbiAocG9zc2libGUgZGVhZGxvY2spCisgICAgICovCisgICAgaWYgKCBhaWM3eHh4X2FsbG9jYXRlX3NjYihwKSA9PSAwICkKKyAgICAgIGJyZWFrOworICB9CisKKworICByZXR1cm4oMCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcm9iZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBQcm9iaW5nIGZvciBFSVNBIGJvYXJkczogaXQgbG9va3MgbGlrZSB0aGUgZmlyc3QgdHdvIGJ5dGVzCisgKiAgIGFyZSBhIG1hbnVmYWN0dXJlciBjb2RlIC0gdGhyZWUgY2hhcmFjdGVycywgZml2ZSBiaXRzIGVhY2g6CisgKgorICogICAgICAgICAgICAgICBCWVRFIDAgICBCWVRFIDEgICBCWVRFIDIgICBCWVRFIDMKKyAqICAgICAgICAgICAgICA/MTExMTEyMiAyMjIzMzMzMyBQUFBQUFBQUCBSUlJSUlJSUgorICoKKyAqICAgVGhlIGNoYXJhY3RlcnMgYXJlIGJhc2VsaW5lZCBvZmYgQVNDSUkgJ0AnLCBzbyBhZGQgdGhhdCB2YWx1ZQorICogICB0byBlYWNoIHRvIGdldCB0aGUgcmVhbCBBU0NJSSBjb2RlIGZvciBpdC4gVGhlIG5leHQgdHdvIGJ5dGVzCisgKiAgIGFwcGVhciB0byBiZSBhIHByb2R1Y3QgYW5kIHJldmlzaW9uIG51bWJlciwgcHJvYmFibHkgdmVuZG9yLQorICogICBzcGVjaWZpYy4gVGhpcyBpcyB3aGF0IGlzIGJlaW5nIHNlYXJjaGVkIGZvciBhdCBlYWNoIHBvcnQsCisgKiAgIGFuZCB3aGF0IHNob3VsZCBwcm9iYWJseSBjb3JyZXNwb25kIHRvIHRoZSBJRD0gZmllbGQgaW4gdGhlCisgKiAgIEVDVSdzIC5jZmcgZmlsZSBmb3IgdGhlIGNhcmQgLSBpZiB5b3VyIGNhcmQgaXMgbm90IGRldGVjdGVkLAorICogICBtYWtlIHN1cmUgeW91ciBzaWduYXR1cmUgaXMgbGlzdGVkIGluIHRoZSBhcnJheS4KKyAqCisgKiAgIFRoZSBmb3VydGggYnl0ZSdzIGxvd2VzdCBiaXQgc2VlbXMgdG8gYmUgYW4gZW5hYmxlZC9kaXNhYmxlZAorICogICBmbGFnIChyZXN0IG9mIHRoZSBiaXRzIGFyZSByZXNlcnZlZD8pLgorICoKKyAqIE5PVEU6ICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIG9uIEludGVsIGFuZCBBbHBoYSBwbGF0Zm9ybXMsCisgKiAgIHRoZSBvdGhlciBwbGF0Zm9ybXMgd2Ugc3VwcG9ydCBkb24ndCBoYXZlIEVJU0EvVkxCIGJ1c3Nlcy4gIFNvLAorICogICB3ZSAjaWZkZWYgdGhpcyBlbnRpcmUgZnVuY3Rpb24gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQKKyAqICAgYW4gdW51c2VkIGZ1bmN0aW9uLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FscGhhX18pCitzdGF0aWMgaW50CithaWM3eHh4X3Byb2JlKGludCBzbG90LCBpbnQgYmFzZSwgYWhjX2ZsYWdfdHlwZSAqZmxhZ3MpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKworICBzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgbjsKKyAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtzaXplb2YoYnVmKV07CisgICAgYWhjX2NoaXAgdHlwZTsKKyAgICBpbnQgYmlvc19kaXNhYmxlZDsKKyAgfSBBSUM3eHh4W10gPSB7CisgICAgeyA0LCB7IDB4MDQsIDB4OTAsIDB4NzcsIDB4NzAgfSwKKyAgICAgIEFIQ19BSUM3NzcwfEFIQ19FSVNBLCBGQUxTRSB9LCAgLyogbWIgNzc3MCAgKi8KKyAgICB7IDQsIHsgMHgwNCwgMHg5MCwgMHg3NywgMHg3MSB9LAorICAgICAgQUhDX0FJQzc3NzB8QUhDX0VJU0EsIEZBTFNFIH0sIC8qIGhvc3QgYWRhcHRlciAyNzR4ICovCisgICAgeyA0LCB7IDB4MDQsIDB4OTAsIDB4NzcsIDB4NTYgfSwKKyAgICAgIEFIQ19BSUM3NzcwfEFIQ19WTCwgRkFMU0UgfSwgLyogMjg0eCBCSU9TIGVuYWJsZWQgKi8KKyAgICB7IDQsIHsgMHgwNCwgMHg5MCwgMHg3NywgMHg1NyB9LAorICAgICAgQUhDX0FJQzc3NzB8QUhDX1ZMLCBUUlVFIH0gICAvKiAyODR4IEJJT1MgZGlzYWJsZWQgKi8KKyAgfTsKKworICAvKgorICAgKiBUaGUgVkwtYnVzIGNhcmRzIG5lZWQgdG8gYmUgcHJpbWVkIGJ5CisgICAqIHdyaXRpbmcgYmVmb3JlIGEgc2lnbmF0dXJlIGNoZWNrLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihidWYpOyBpKyspCisgIHsKKyAgICBvdXRiKDB4ODAgKyBpLCBiYXNlKTsKKyAgICBidWZbaV0gPSBpbmIoYmFzZSArIGkpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUlDN3h4eCk7IGkrKykKKyAgeworICAgIC8qCisgICAgICogU2lnbmF0dXJlIG1hdGNoIG9uIGVuYWJsZWQgY2FyZD8KKyAgICAgKi8KKyAgICBpZiAoIW1lbWNtcChidWYsIEFJQzd4eHhbaV0uc2lnbmF0dXJlLCBBSUM3eHh4W2ldLm4pKQorICAgIHsKKyAgICAgIGlmIChpbmIoYmFzZSArIDQpICYgMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKEFJQzd4eHhbaV0uYmlvc19kaXNhYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICpmbGFncyB8PSBBSENfVVNFREVGQVVMVFM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgKmZsYWdzIHw9IEFIQ19CSU9TX0VOQUJMRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChpKTsKKyAgICAgIH0KKworICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8QWRhcHRlYyA3NzcwIFNDU0kgSG9zdCBBZGFwdGVyPiAiCisgICAgICAgICAgICAgImRpc2FibGVkIGF0IHNsb3QgJWQsIGlnbm9yZWQuXG4iLCBzbG90KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKC0xKTsKK30KKyNlbmRpZiAvKiAoX19pMzg2X18pIHx8IChfX2FscGhhX18pICovCisKKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICByZWFkXzI4NDBfc2VlcHJvbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBSZWFkcyB0aGUgMjg0MCBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBhbmQgMCBpZgorICogICBub3Qgc3VjY2Vzc2Z1bC4KKyAqCisgKiAgIFNlZSByZWFkX3NlZXByb20gKGZvciB0aGUgMjk0MCkgZm9yIHRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIDkzQzQ2CisgKiAgIGNoaXAuCisgKgorICogICBUaGUgMjg0MCBpbnRlcmZhY2UgdG8gdGhlIDkzQzQ2IHNlcmlhbCBFRVBST00gaXMgdGhyb3VnaCB0aGUKKyAqICAgU1RBVFVTXzI4NDAgYW5kIFNFRUNUTF8yODQwIHJlZ2lzdGVycy4gIFRoZSBDU18yODQwLCBDS18yODQwLCBhbmQKKyAqICAgRE9fMjg0MCBiaXRzIG9mIHRoZSBTRUVDVExfMjg0MCByZWdpc3RlciBhcmUgY29ubmVjdGVkIHRvIHRoZSBjaGlwCisgKiAgIHNlbGVjdCwgY2xvY2ssIGFuZCBkYXRhIG91dCBsaW5lcyByZXNwZWN0aXZlbHkgb2YgdGhlIHNlcmlhbCBFRVBST00uCisgKiAgIFRoZSBESV8yODQwIGJpdCBvZiB0aGUgU1RBVFVTXzI4NDAgaXMgY29ubmVjdGVkIHRvIHRoZSBkYXRhIGluIGxpbmUKKyAqICAgb2YgdGhlIHNlcmlhbCBFRVBST00uICBUaGUgRUVQUk9NX1RGIGJpdCBvZiBTVEFUVVNfMjg0MCByZWdpc3RlciBpcworICogICB1c2VmdWwgaW4gdGhhdCBpdCBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgcmVhZCBmcm9tIHRoZQorICogICBTRUVDVExfMjg0MCByZWdpc3RlciB0aGUgdGltaW5nIGZsYWcgaXMgY2xlYXJlZCBhbmQgZ29lcyBoaWdoIDgwMCBuc2VjCisgKiAgIGxhdGVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CityZWFkXzI4NHhfc2VlcHJvbShzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKQoreworICBpbnQgaSA9IDAsIGsgPSAwOworICB1bnNpZ25lZCBjaGFyIHRlbXA7CisgIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtID0gMDsKKyAgdW5zaWduZWQgc2hvcnQgKnNlZXByb20gPSAodW5zaWduZWQgc2hvcnQgKikgc2M7CisgIHN0cnVjdCBzZWVwcm9tX2NtZCB7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBiaXRzWzNdOworICB9OworICBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9yZWFkID0gezMsIHsxLCAxLCAwfX07CisKKyNkZWZpbmUgQ0xPQ0tfUFVMU0UocCkgXAorICB3aGlsZSAoKGFpY19pbmIocCwgU1RBVFVTXzI4NDApICYgRUVQUk9NX1RGKSA9PSAwKSAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDsgIC8qIERvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpIGFpY19pbmIocCwgU0VFQ1RMXzI4NDApOworCisgIC8qCisgICAqIFJlYWQgdGhlIGZpcnN0IDMyIHJlZ2lzdGVycyBvZiB0aGUgc2VlcHJvbS4gIEZvciB0aGUgMjg0MCwKKyAgICogdGhlIDkzQzQ2IFNFRVBST00gaXMgYSAxMDI0LWJpdCBkZXZpY2Ugd2l0aCA2NCAxNi1iaXQgcmVnaXN0ZXJzCisgICAqIGJ1dCBvbmx5IHRoZSBmaXJzdCAzMiBhcmUgdXNlZCBieSBBZGFwdGVjIEJJT1MuICBUaGUgbG9vcAorICAgKiB3aWxsIHJhbmdlIGZyb20gMCB0byAzMS4KKyAgICovCisgIGZvciAoayA9IDA7IGsgPCAoc2l6ZW9mKCpzYykgLyAyKTsgaysrKQorICB7CisgICAgLyoKKyAgICAgKiBTZW5kIGNoaXAgc2VsZWN0IGZvciBvbmUgY2xvY2sgY3ljbGUuCisgICAgICovCisgICAgYWljX291dGIocCwgQ0tfMjg0MCB8IENTXzI4NDAsIFNFRUNUTF8yODQwKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKworICAgIC8qCisgICAgICogTm93IHdlJ3JlIHJlYWR5IHRvIHNlbmQgdGhlIHJlYWQgY29tbWFuZCBmb2xsb3dlZCBieSB0aGUKKyAgICAgKiBhZGRyZXNzIG9mIHRoZSAxNi1iaXQgcmVnaXN0ZXIgd2Ugd2FudCB0byByZWFkLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzZWVwcm9tX3JlYWQubGVuOyBpKyspCisgICAgeworICAgICAgdGVtcCA9IENTXzI4NDAgfCBzZWVwcm9tX3JlYWQuYml0c1tpXTsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTF8yODQwKTsKKyAgICAgIENMT0NLX1BVTFNFKHApOworICAgICAgdGVtcCA9IHRlbXAgXiBDS18yODQwOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0VFQ1RMXzI4NDApOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgfQorICAgIC8qCisgICAgICogU2VuZCB0aGUgNiBiaXQgYWRkcmVzcyAoTVNCIGZpcnN0LCBMU0IgbGFzdCkuCisgICAgICovCisgICAgZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgdGVtcCA9IGs7CisgICAgICB0ZW1wID0gKHRlbXAgPj4gaSkgJiAxOyAgLyogTWFzayBvdXQgYWxsIGJ1dCBsb3dlciBiaXQuICovCisgICAgICB0ZW1wID0gQ1NfMjg0MCB8IHRlbXA7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVExfMjg0MCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICAgIHRlbXAgPSB0ZW1wIF4gQ0tfMjg0MDsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTF8yODQwKTsKKyAgICAgIENMT0NLX1BVTFNFKHApOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IHJlYWQgdGhlIDE2IGJpdCByZWdpc3Rlci4gIEFuIGluaXRpYWwgMCBwcmVjZWRlcyB0aGUKKyAgICAgKiByZWdpc3RlciBjb250ZW50cyB3aGljaCBiZWdpbnMgd2l0aCBiaXQgMTUgKE1TQikgYW5kIGVuZHMKKyAgICAgKiB3aXRoIGJpdCAwIChMU0IpLiAgVGhlIGluaXRpYWwgMCB3aWxsIGJlIHNoaWZ0ZWQgb2ZmIHRoZQorICAgICAqIHRvcCBvZiBvdXIgd29yZCBhcyB3ZSBsZXQgdGhlIGxvb3AgcnVuIGZyb20gMCB0byAxNi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IDE2OyBpKyspCisgICAgeworICAgICAgdGVtcCA9IENTXzI4NDA7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVExfMjg0MCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICAgIHRlbXAgPSB0ZW1wIF4gQ0tfMjg0MDsKKyAgICAgIHNlZXByb21ba10gPSAoc2VlcHJvbVtrXSA8PCAxKSB8IChhaWNfaW5iKHAsIFNUQVRVU18yODQwKSAmIERJXzI4NDApOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0VFQ1RMXzI4NDApOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgfQorICAgIC8qCisgICAgICogVGhlIHNlcmlhbCBFRVBST00gaGFzIGEgY2hlY2tzdW0gaW4gdGhlIGxhc3Qgd29yZC4gIEtlZXAgYQorICAgICAqIHJ1bm5pbmcgY2hlY2tzdW0gZm9yIGFsbCB3b3JkcyByZWFkIGV4Y2VwdCBmb3IgdGhlIGxhc3QKKyAgICAgKiB3b3JkLiAgV2UnbGwgdmVyaWZ5IHRoZSBjaGVja3N1bSBhZnRlciBhbGwgd29yZHMgaGF2ZSBiZWVuCisgICAgICogcmVhZC4KKyAgICAgKi8KKyAgICBpZiAoayA8IChzaXplb2YoKnNjKSAvIDIpIC0gMSkKKyAgICB7CisgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtICsgc2VlcHJvbVtrXTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc2V0IHRoZSBjaGlwIHNlbGVjdCBmb3IgdGhlIG5leHQgY29tbWFuZCBjeWNsZS4KKyAgICAgKi8KKyAgICBhaWNfb3V0YihwLCAwLCBTRUVDVExfMjg0MCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYWljX291dGIocCwgQ0tfMjg0MCwgU0VFQ1RMXzI4NDApOworICAgIENMT0NLX1BVTFNFKHApOworICAgIGFpY19vdXRiKHAsIDAsIFNFRUNUTF8yODQwKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgfQorCisjaWYgMAorICBwcmludGsoIkNvbXB1dGVkIGNoZWNrc3VtIDB4JXgsIGNoZWNrc3VtIHJlYWQgMHgleFxuIiwgY2hlY2tzdW0sIHNjLT5jaGVja3N1bSk7CisgIHByaW50aygiU2VyaWFsIEVFUFJPTToiKTsKKyAgZm9yIChrID0gMDsgayA8IChzaXplb2YoKnNjKSAvIDIpOyBrKyspCisgIHsKKyAgICBpZiAoKChrICUgOCkgPT0gMCkgJiYgKGsgIT0gMCkpCisgICAgeworICAgICAgcHJpbnRrKCJcbiAgICAgICAgICAgICAgIik7CisgICAgfQorICAgIHByaW50aygiIDB4JXgiLCBzZWVwcm9tW2tdKTsKKyAgfQorICBwcmludGsoIlxuIik7CisjZW5kaWYKKworICBpZiAoY2hlY2tzdW0gIT0gc2MtPmNoZWNrc3VtKQorICB7CisgICAgcHJpbnRrKCJhaWM3eHh4OiBTRUVQUk9NIGNoZWNrc3VtIGVycm9yLCBpZ25vcmluZyBTRUVQUk9NIHNldHRpbmdzLlxuIik7CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIHJldHVybiAoMSk7CisjdW5kZWYgQ0xPQ0tfUFVMU0UKK30KKworI2RlZmluZSBDTE9DS19QVUxTRShwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsaW1pdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcGF1c2Vfc2VxdWVuY2VyKHApOyAgLyogVGhpcyBpcyBqdXN0IHRvIGdlbmVyYXRlIHNvbWUgUENJICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhZmZpYyBzbyB0aGUgUENJIHJlYWQgaXMgZmx1c2hlZCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQgc2hvdWxkbid0IGJlIG5lZWRlZCwgYnV0IHNvbWUgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpcHNldHMgZG8gaW5kZWVkIGFwcGVhciB0byBuZWVkICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29tZXRoaW5nIHRvIGZvcmNlIFBDSSByZWFkcyB0byBnZXQgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmx1c2hlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdWRlbGF5KDEpOyAgICAgICAgICAgLyogRG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKCgoYWljX2luYihwLCBTRUVDVEwpICYgU0VFUkRZKSA9PSAwKSAmJiAoKytsaW1pdCA8IDEwMDApKTsgXAorICB9IHdoaWxlKDApCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWNxdWlyZV9zZWVwcm9tCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEFjcXVpcmVzIGFjY2VzcyB0byB0aGUgbWVtb3J5IHBvcnQgb24gUENJIGNvbnRyb2xsZXJzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithY3F1aXJlX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKworICAvKgorICAgKiBSZXF1ZXN0IGFjY2VzcyBvZiB0aGUgbWVtb3J5IHBvcnQuICBXaGVuIGFjY2VzcyBpcworICAgKiBncmFudGVkLCBTRUVSRFkgd2lsbCBnbyBoaWdoLiAgV2UgdXNlIGEgMSBzZWNvbmQKKyAgICogdGltZW91dCB3aGljaCBzaG91bGQgYmUgbmVhciAxIHNlY29uZCBtb3JlIHRoYW4KKyAgICogaXMgbmVlZGVkLiAgUmVhc29uOiBhZnRlciB0aGUgNzg3MCBjaGlwIHJlc2V0LCB0aGVyZQorICAgKiBzaG91bGQgYmUgbm8gY29udGVudGlvbi4KKyAgICovCisgIGFpY19vdXRiKHAsIFNFRU1TLCBTRUVDVEwpOworICBDTE9DS19QVUxTRShwKTsKKyAgaWYgKChhaWNfaW5iKHAsIFNFRUNUTCkgJiBTRUVSRFkpID09IDApCisgIHsKKyAgICBhaWNfb3V0YihwLCAwLCBTRUVDVEwpOworICAgIHJldHVybiAoMCk7CisgIH0KKyAgcmV0dXJuICgxKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICByZWxlYXNlX3NlZXByb20KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmVsZWFzZXMgYWNjZXNzIHRvIHRoZSBtZW1vcnkgcG9ydCBvbiBQQ0kgY29udHJvbGxlcnMuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCityZWxlYXNlX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoZSBTRUVQUk9NIGlzIHJlYWR5IGJlZm9yZSB3ZSByZWxlYXNlIGl0LgorICAgKi8KKyAgQ0xPQ0tfUFVMU0UocCk7CisgIGFpY19vdXRiKHAsIDAsIFNFRUNUTCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgcmVhZF9zZWVwcm9tCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlYWRzIHRoZSBzZXJpYWwgRUVQUk9NIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBhbmQgMCBpZgorICogICBub3Qgc3VjY2Vzc2Z1bC4KKyAqCisgKiAgIFRoZSBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIDkzQzQ2LzU2LzY2IGNoaXBzIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAgICAgICAgICBTdGFydCAgT1AKKyAqICAgICBGdW5jdGlvbiAgIEJpdCAgQ29kZSAgQWRkcmVzcyAgICBEYXRhICAgICBEZXNjcmlwdGlvbgorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBSRUFEICAgICAgICAxICAgIDEwICAgQTUgLSBBMCAgICAgICAgICAgICBSZWFkcyBkYXRhIHN0b3JlZCBpbiBtZW1vcnksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgc3BlY2lmaWVkIGFkZHJlc3MKKyAqICAgICBFV0VOICAgICAgICAxICAgIDAwICAgMTFYWFhYICAgICAgICAgICAgICBXcml0ZSBlbmFibGUgbXVzdCBwcmVjZWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIHByb2dyYW1taW5nIG1vZGVzCisgKiAgICAgRVJBU0UgICAgICAgMSAgICAxMSAgIEE1IC0gQTAgICAgICAgICAgICAgRXJhc2UgcmVnaXN0ZXIgQTVBNEEzQTJBMUEwCisgKiAgICAgV1JJVEUgICAgICAgMSAgICAwMSAgIEE1IC0gQTAgICBEMTUgLSBEMCAgV3JpdGVzIHJlZ2lzdGVyCisgKiAgICAgRVJBTCAgICAgICAgMSAgICAwMCAgIDEwWFhYWCAgICAgICAgICAgICAgRXJhc2UgYWxsIHJlZ2lzdGVycworICogICAgIFdSQUwgICAgICAgIDEgICAgMDAgICAwMVhYWFggICAgRDE1IC0gRDAgIFdyaXRlcyB0byBhbGwgcmVnaXN0ZXJzCisgKiAgICAgRVdEUyAgICAgICAgMSAgICAwMCAgIDAwWFhYWCAgICAgICAgICAgICAgRGlzYWJsZXMgYWxsIHByb2dyYW1taW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zCisgKiAgICAgKk5vdGU6IEEgdmFsdWUgb2YgWCBmb3IgYWRkcmVzcyBpcyBhIGRvbid0IGNhcmUgY29uZGl0aW9uLgorICogICAgICpOb3RlOiBUaGUgOTNDNTYgYW5kIDkzQzY2IGhhdmUgOCBhZGRyZXNzIGJpdHMuCisgKiAKKyAqCisgKiAgIFRoZSA5M0M0NiBoYXMgYSBmb3VyIHdpcmUgaW50ZXJmYWNlOiBjbG9jaywgY2hpcCBzZWxlY3QsIGRhdGEgaW4sIGFuZAorICogICBkYXRhIG91dC4gIEluIG9yZGVyIHRvIHBlcmZvcm0gb25lIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMsIHlvdSBuZWVkCisgKiAgIHRvIGVuYWJsZSB0aGUgY2hpcCBzZWxlY3QgZm9yIGEgY2xvY2sgcGVyaW9kICh0eXBpY2FsbHkgYSBtaW5pbXVtIG9mCisgKiAgIDEgdXNlYywgd2l0aCB0aGUgY2xvY2sgaGlnaCBhbmQgbG93IGEgbWluaW11bSBvZiA3NTAgYW5kIDI1MCBuc2VjCisgKiAgIHJlc3BlY3RpdmVseS4gIFdoaWxlIHRoZSBjaGlwIHNlbGVjdCByZW1haW5zIGhpZ2gsIHlvdSBjYW4gY2xvY2sgaW4KKyAqICAgdGhlIGluc3RydWN0aW9ucyAoYWJvdmUpIHN0YXJ0aW5nIHdpdGggdGhlIHN0YXJ0IGJpdCwgZm9sbG93ZWQgYnkgdGhlCisgKiAgIE9QIGNvZGUsIEFkZHJlc3MsIGFuZCBEYXRhIChpZiBuZWVkZWQpLiAgRm9yIHRoZSBSRUFEIGluc3RydWN0aW9uLCB0aGUKKyAqICAgcmVxdWVzdGVkIDE2LWJpdCByZWdpc3RlciBjb250ZW50cyBpcyByZWFkIGZyb20gdGhlIGRhdGEgb3V0IGxpbmUgYnV0CisgKiAgIGlzIHByZWNlZGVkIGJ5IGFuIGluaXRpYWwgemVybyAobGVhZGluZyAwLCBmb2xsb3dlZCBieSAxNi1iaXRzLCBNU0IKKyAqICAgZmlyc3QpLiAgVGhlIGNsb2NrIGN5Y2xpbmcgZnJvbSBsb3cgdG8gaGlnaCBpbml0aWF0ZXMgdGhlIG5leHQgZGF0YQorICogICBiaXQgdG8gYmUgc2VudCBmcm9tIHRoZSBjaGlwLgorICoKKyAqICAgVGhlIDc4eHggaW50ZXJmYWNlIHRvIHRoZSA5M0M0NiBzZXJpYWwgRUVQUk9NIGlzIHRocm91Z2ggdGhlIFNFRUNUTAorICogICByZWdpc3Rlci4gIEFmdGVyIHN1Y2Nlc3NmdWwgYXJiaXRyYXRpb24gZm9yIHRoZSBtZW1vcnkgcG9ydCwgdGhlCisgKiAgIFNFRUNTIGJpdCBvZiB0aGUgU0VFQ1RMIHJlZ2lzdGVyIGlzIGNvbm5lY3RlZCB0byB0aGUgY2hpcCBzZWxlY3QuCisgKiAgIFRoZSBTRUVDSywgU0VFRE8sIGFuZCBTRUVESSBhcmUgY29ubmVjdGVkIHRvIHRoZSBjbG9jaywgZGF0YSBvdXQsCisgKiAgIGFuZCBkYXRhIGluIGxpbmVzIHJlc3BlY3RpdmVseS4gIFRoZSBTRUVSRFkgYml0IG9mIFNFRUNUTCBpcyB1c2VmdWwKKyAqICAgaW4gdGhhdCBpdCBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgd3JpdGUgdG8gdGhlIFNFRUNUTAorICogICByZWdpc3RlciwgdGhlIFNFRVJEWSBnb2VzIGhpZ2ggODAwIG5zZWMgbGF0ZXIuICBUaGUgb25lIGV4Y2VwdGlvbgorICogICB0byB0aGlzIGlzIHdoZW4gd2UgZmlyc3QgcmVxdWVzdCBhY2Nlc3MgdG8gdGhlIG1lbW9yeSBwb3J0LiAgVGhlCisgKiAgIFNFRVJEWSBnb2VzIGhpZ2ggdG8gc2lnbmlmeSB0aGF0IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIGFuZCwgZm9yCisgKiAgIHRoaXMgY2FzZSwgaGFzIG5vIGltcGxpZWQgdGltaW5nLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CityZWFkX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50IG9mZnNldCwgCisgICAgdW5zaWduZWQgc2hvcnQgKnNjYXJyYXksIHVuc2lnbmVkIGludCBsZW4sIHNlZXByb21fY2hpcF90eXBlIGNoaXApCit7CisgIGludCBpID0gMCwgazsKKyAgdW5zaWduZWQgY2hhciB0ZW1wOworICB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSA9IDA7CisgIHN0cnVjdCBzZWVwcm9tX2NtZCB7CisgICAgdW5zaWduZWQgY2hhciBsZW47CisgICAgdW5zaWduZWQgY2hhciBiaXRzWzNdOworICB9OworICBzdHJ1Y3Qgc2VlcHJvbV9jbWQgc2VlcHJvbV9yZWFkID0gezMsIHsxLCAxLCAwfX07CisKKyAgLyoKKyAgICogUmVxdWVzdCBhY2Nlc3Mgb2YgdGhlIG1lbW9yeSBwb3J0LgorICAgKi8KKyAgaWYgKGFjcXVpcmVfc2VlcHJvbShwKSA9PSAwKQorICB7CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIC8qCisgICAqIFJlYWQgJ2xlbicgcmVnaXN0ZXJzIG9mIHRoZSBzZWVwcm9tLiAgRm9yIHRoZSA3ODcwLCB0aGUgOTNDNDYKKyAgICogU0VFUFJPTSBpcyBhIDEwMjQtYml0IGRldmljZSB3aXRoIDY0IDE2LWJpdCByZWdpc3RlcnMgYnV0IG9ubHkKKyAgICogdGhlIGZpcnN0IDMyIGFyZSB1c2VkIGJ5IEFkYXB0ZWMgQklPUy4gIFNvbWUgYWRhcHRlcnMgdXNlIHRoZQorICAgKiA5M0M1NiBTRUVQUk9NIHdoaWNoIGlzIGEgMjA0OC1iaXQgZGV2aWNlLiAgVGhlIGxvb3Agd2lsbCByYW5nZQorICAgKiBmcm9tIDAgdG8gJ2xlbicgLSAxLgorICAgKi8KKyAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrKQorICB7CisgICAgLyoKKyAgICAgKiBTZW5kIGNoaXAgc2VsZWN0IGZvciBvbmUgY2xvY2sgY3ljbGUuCisgICAgICovCisgICAgYWljX291dGIocCwgU0VFTVMgfCBTRUVDSyB8IFNFRUNTLCBTRUVDVEwpOworICAgIENMT0NLX1BVTFNFKHApOworCisgICAgLyoKKyAgICAgKiBOb3cgd2UncmUgcmVhZHkgdG8gc2VuZCB0aGUgcmVhZCBjb21tYW5kIGZvbGxvd2VkIGJ5IHRoZQorICAgICAqIGFkZHJlc3Mgb2YgdGhlIDE2LWJpdCByZWdpc3RlciB3ZSB3YW50IHRvIHJlYWQuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlZXByb21fcmVhZC5sZW47IGkrKykKKyAgICB7CisgICAgICB0ZW1wID0gU0VFTVMgfCBTRUVDUyB8IChzZWVwcm9tX3JlYWQuYml0c1tpXSA8PCAxKTsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICAgIHRlbXAgPSB0ZW1wIF4gU0VFQ0s7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVEwpOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgfQorICAgIC8qCisgICAgICogU2VuZCB0aGUgNiBvciA4IGJpdCBhZGRyZXNzIChNU0IgZmlyc3QsIExTQiBsYXN0KS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAoKGludCkgY2hpcCAtIDEpOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICB0ZW1wID0gayArIG9mZnNldDsKKyAgICAgIHRlbXAgPSAodGVtcCA+PiBpKSAmIDE7ICAvKiBNYXNrIG91dCBhbGwgYnV0IGxvd2VyIGJpdC4gKi8KKyAgICAgIHRlbXAgPSBTRUVNUyB8IFNFRUNTIHwgKHRlbXAgPDwgMSk7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVEwpOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgICB0ZW1wID0gdGVtcCBeIFNFRUNLOworICAgICAgYWljX291dGIocCwgdGVtcCwgU0VFQ1RMKTsKKyAgICAgIENMT0NLX1BVTFNFKHApOworICAgIH0KKworICAgIC8qCisgICAgICogTm93IHJlYWQgdGhlIDE2IGJpdCByZWdpc3Rlci4gIEFuIGluaXRpYWwgMCBwcmVjZWRlcyB0aGUKKyAgICAgKiByZWdpc3RlciBjb250ZW50cyB3aGljaCBiZWdpbnMgd2l0aCBiaXQgMTUgKE1TQikgYW5kIGVuZHMKKyAgICAgKiB3aXRoIGJpdCAwIChMU0IpLiAgVGhlIGluaXRpYWwgMCB3aWxsIGJlIHNoaWZ0ZWQgb2ZmIHRoZQorICAgICAqIHRvcCBvZiBvdXIgd29yZCBhcyB3ZSBsZXQgdGhlIGxvb3AgcnVuIGZyb20gMCB0byAxNi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IDE2OyBpKyspCisgICAgeworICAgICAgdGVtcCA9IFNFRU1TIHwgU0VFQ1M7CisgICAgICBhaWNfb3V0YihwLCB0ZW1wLCBTRUVDVEwpOworICAgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgICB0ZW1wID0gdGVtcCBeIFNFRUNLOworICAgICAgc2NhcnJheVtrXSA9IChzY2FycmF5W2tdIDw8IDEpIHwgKGFpY19pbmIocCwgU0VFQ1RMKSAmIFNFRURJKTsKKyAgICAgIGFpY19vdXRiKHAsIHRlbXAsIFNFRUNUTCk7CisgICAgICBDTE9DS19QVUxTRShwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBzZXJpYWwgRUVQUk9NIHNob3VsZCBoYXZlIGEgY2hlY2tzdW0gaW4gdGhlIGxhc3Qgd29yZC4KKyAgICAgKiBLZWVwIGEgcnVubmluZyBjaGVja3N1bSBmb3IgYWxsIHdvcmRzIHJlYWQgZXhjZXB0IGZvciB0aGUKKyAgICAgKiBsYXN0IHdvcmQuICBXZSdsbCB2ZXJpZnkgdGhlIGNoZWNrc3VtIGFmdGVyIGFsbCB3b3JkcyBoYXZlCisgICAgICogYmVlbiByZWFkLgorICAgICAqLworICAgIGlmIChrIDwgKGxlbiAtIDEpKQorICAgIHsKKyAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBzY2FycmF5W2tdOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIGNoaXAgc2VsZWN0IGZvciB0aGUgbmV4dCBjb21tYW5kIGN5Y2xlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIFNFRU1TLCBTRUVDVEwpOworICAgIENMT0NLX1BVTFNFKHApOworICAgIGFpY19vdXRiKHAsIFNFRU1TIHwgU0VFQ0ssIFNFRUNUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYWljX291dGIocCwgU0VFTVMsIFNFRUNUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgIH0KKworICAvKgorICAgKiBSZWxlYXNlIGFjY2VzcyB0byB0aGUgbWVtb3J5IHBvcnQgYW5kIHRoZSBzZXJpYWwgRUVQUk9NLgorICAgKi8KKyAgcmVsZWFzZV9zZWVwcm9tKHApOworCisjaWYgMAorICBwcmludGsoIkNvbXB1dGVkIGNoZWNrc3VtIDB4JXgsIGNoZWNrc3VtIHJlYWQgMHgleFxuIiwKKyAgICAgICAgIGNoZWNrc3VtLCBzY2FycmF5W2xlbiAtIDFdKTsKKyAgcHJpbnRrKCJTZXJpYWwgRUVQUk9NOiIpOworICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyspCisgIHsKKyAgICBpZiAoKChrICUgOCkgPT0gMCkgJiYgKGsgIT0gMCkpCisgICAgeworICAgICAgcHJpbnRrKCJcbiAgICAgICAgICAgICAgIik7CisgICAgfQorICAgIHByaW50aygiIDB4JXgiLCBzY2FycmF5W2tdKTsKKyAgfQorICBwcmludGsoIlxuIik7CisjZW5kaWYKKyAgaWYgKCAoY2hlY2tzdW0gIT0gc2NhcnJheVtsZW4gLSAxXSkgfHwgKGNoZWNrc3VtID09IDApICkKKyAgeworICAgIHJldHVybiAoMCk7CisgIH0KKworICByZXR1cm4gKDEpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIHJlYWRfYnJkY3RsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlYWRzIHRoZSBCUkRDVEwgcmVnaXN0ZXIuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyCityZWFkX2JyZGN0bChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworICB1bnNpZ25lZCBjaGFyIGJyZGN0bCwgdmFsdWU7CisKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoZSBTRUVQUk9NIGlzIHJlYWR5IGJlZm9yZSB3ZSBhY2Nlc3MgaXQKKyAgICovCisgIENMT0NLX1BVTFNFKHApOworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICB7CisgICAgYnJkY3RsID0gQlJEUldfVUxUUkEyOworICAgIGFpY19vdXRiKHAsIGJyZGN0bCwgQlJEQ1RMKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgICB2YWx1ZSA9IGFpY19pbmIocCwgQlJEQ1RMKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgICByZXR1cm4odmFsdWUpOworICB9CisgIGJyZGN0bCA9IEJSRFJXOworICBpZiAoICEoKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID09IEFIQ19BSUM3ODk1KSB8fAorICAgICAgICAocC0+ZmxhZ3MgJiBBSENfQ0hOTEIpICkKKyAgeworICAgIGJyZGN0bCB8PSBCUkRDUzsKKyAgfQorICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgIENMT0NLX1BVTFNFKHApOworICB2YWx1ZSA9IGFpY19pbmIocCwgQlJEQ1RMKTsKKyAgQ0xPQ0tfUFVMU0UocCk7CisgIGFpY19vdXRiKHAsIDAsIEJSRENUTCk7CisgIENMT0NLX1BVTFNFKHApOworICByZXR1cm4gKHZhbHVlKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICB3cml0ZV9icmRjdGwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgV3JpdGVzIGEgdmFsdWUgdG8gdGhlIEJSRENUTCByZWdpc3Rlci4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dyaXRlX2JyZGN0bChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICB1bnNpZ25lZCBjaGFyIGJyZGN0bDsKKworICAvKgorICAgKiBNYWtlIHN1cmUgdGhlIFNFRVBST00gaXMgcmVhZHkgYmVmb3JlIHdlIGFjY2VzcyBpdAorICAgKi8KKyAgQ0xPQ0tfUFVMU0UocCk7CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBicmRjdGwgPSB2YWx1ZTsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYnJkY3RsIHw9IEJSRFNUQl9VTFRSQTI7CisgICAgYWljX291dGIocCwgYnJkY3RsLCBCUkRDVEwpOworICAgIENMT0NLX1BVTFNFKHApOworICAgIGJyZGN0bCAmPSB+QlJEU1RCX1VMVFJBMjsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgcmVhZF9icmRjdGwocCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgYnJkY3RsID0gQlJEU1RCOworICAgIGlmICggISgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpIHx8CisgICAgICAgICAgKHAtPmZsYWdzICYgQUhDX0NITkxCKSApCisgICAgeworICAgICAgYnJkY3RsIHw9IEJSRENTOworICAgIH0KKyAgICBicmRjdGwgPSBCUkRTVEIgfCBCUkRDUzsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYnJkY3RsIHw9IHZhbHVlOworICAgIGFpY19vdXRiKHAsIGJyZGN0bCwgQlJEQ1RMKTsKKyAgICBDTE9DS19QVUxTRShwKTsKKyAgICBicmRjdGwgJj0gfkJSRFNUQjsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgICAgYnJkY3RsICY9IH5CUkRDUzsKKyAgICBhaWNfb3V0YihwLCBicmRjdGwsIEJSRENUTCk7CisgICAgQ0xPQ0tfUFVMU0UocCk7CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3ODV4X2NhYmxlX2RldGVjdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlY3QgdGhlIGNhYmxlcyB0aGF0IGFyZSBwcmVzZW50IG9uIGFpYzc4NXggY2xhc3MgY29udHJvbGxlciBjaGlwcworICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljNzg1eF9jYWJsZV9kZXRlY3Qoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgaW50ICppbnRfNTAsCisgICAgaW50ICpleHRfcHJlc2VudCwgaW50ICplZXByb20pCit7CisgIHVuc2lnbmVkIGNoYXIgYnJkY3RsOworCisgIGFpY19vdXRiKHAsIEJSRFJXIHwgQlJEQ1MsIEJSRENUTCk7CisgIENMT0NLX1BVTFNFKHApOworICBhaWNfb3V0YihwLCAwLCBCUkRDVEwpOworICBDTE9DS19QVUxTRShwKTsKKyAgYnJkY3RsID0gYWljX2luYihwLCBCUkRDVEwpOworICBDTE9DS19QVUxTRShwKTsKKyAgKmludF81MCA9ICEoYnJkY3RsICYgQlJEREFUNSk7CisgICpleHRfcHJlc2VudCA9ICEoYnJkY3RsICYgQlJEREFUNik7CisgICplZXByb20gPSAoYWljX2luYihwLCBTUElPQ0FQKSAmIEVFUFJPTSk7Cit9CisKKyN1bmRlZiBDTE9DS19QVUxTRQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzI5NDBfdXdwcm9fY2FibGVfZGV0ZWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiAgIERldGVjdCB0aGUgY2FibGVzIHRoYXQgYXJlIHByZXNlbnQgb24gdGhlIDI5NDAtVVdQcm8gY2FyZHMKKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIFNFRVBST00gd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBhY3F1aXJlZAorICogICAgICAgcHJpb3IgdG8gaW52b2NhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljMjk0MF91d3Byb193aWRlX2NhYmxlX2RldGVjdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgKmludF82OCwKKyAgICBpbnQgKmV4dF82OCwgaW50ICplZXByb20pCit7CisgIHVuc2lnbmVkIGNoYXIgYnJkY3RsOworCisgIC8qCisgICAqIEZpcnN0IHJlYWQgdGhlIHN0YXR1cyBvZiBvdXIgY2FibGVzLiAgU2V0IHRoZSByb20gYmFuayB0bworICAgKiAwIHNpbmNlIHRoZSBiYW5rIHNldHRpbmcgc2VydmVzIGFzIGEgbXVsdGlwbGV4b3IgZm9yIHRoZQorICAgKiBjYWJsZSBkZXRlY3Rpb24gbG9naWMuICBCUkREQVQ1IGNvbnRyb2xzIHRoZSBiYW5rIHN3aXRjaC4KKyAgICovCisgIHdyaXRlX2JyZGN0bChwLCAwKTsKKworICAvKgorICAgKiBOb3cgd2UgcmVhZCB0aGUgc3RhdGUgb2YgdGhlIGludGVybmFsIDY4IGNvbm5lY3Rvci4gIEJSRERBVDYKKyAgICogaXMgZG9uJ3QgY2FyZSwgQlJEREFUNyBpcyBpbnRlcm5hbCA2OC4gIFRoZSBjYWJsZSBpcworICAgKiBwcmVzZW50IGlmIHRoZSBiaXQgaXMgMAorICAgKi8KKyAgYnJkY3RsID0gcmVhZF9icmRjdGwocCk7CisgICppbnRfNjggPSAhKGJyZGN0bCAmIEJSRERBVDcpOworCisgIC8qCisgICAqIFNldCB0aGUgYmFuayBiaXQgaW4gYnJkY3RsIGFuZCB0aGVuIHJlYWQgdGhlIGV4dGVybmFsIGNhYmxlIHN0YXRlCisgICAqIGFuZCB0aGUgRUVQUk9NIHN0YXR1cworICAgKi8KKyAgd3JpdGVfYnJkY3RsKHAsIEJSRERBVDUpOworICBicmRjdGwgPSByZWFkX2JyZGN0bChwKTsKKworICAqZXh0XzY4ID0gIShicmRjdGwgJiBCUkREQVQ2KTsKKyAgKmVlcHJvbSA9ICEoYnJkY3RsICYgQlJEREFUNyk7CisKKyAgLyoKKyAgICogV2UncmUgZG9uZSwgdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCByZWxlYXNlIHRoZSBTRUVQUk9NIGZvciB1cworICAgKi8KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3ODd4X2NhYmxlX2RldGVjdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlY3QgdGhlIGNhYmxlcyB0aGF0IGFyZSBwcmVzZW50IG9uIGFpYzc4N3ggY2xhc3MgY29udHJvbGxlciBjaGlwcworICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgU0VFUFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGFjcXVpcmVkCisgKiAgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3ODd4X2NhYmxlX2RldGVjdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgKmludF81MCwgaW50ICppbnRfNjgsCisgICAgaW50ICpleHRfcHJlc2VudCwgaW50ICplZXByb20pCit7CisgIHVuc2lnbmVkIGNoYXIgYnJkY3RsOworCisgIC8qCisgICAqIEZpcnN0IHJlYWQgdGhlIHN0YXR1cyBvZiBvdXIgY2FibGVzLiAgU2V0IHRoZSByb20gYmFuayB0bworICAgKiAwIHNpbmNlIHRoZSBiYW5rIHNldHRpbmcgc2VydmVzIGFzIGEgbXVsdGlwbGV4b3IgZm9yIHRoZQorICAgKiBjYWJsZSBkZXRlY3Rpb24gbG9naWMuICBCUkREQVQ1IGNvbnRyb2xzIHRoZSBiYW5rIHN3aXRjaC4KKyAgICovCisgIHdyaXRlX2JyZGN0bChwLCAwKTsKKworICAvKgorICAgKiBOb3cgd2UgcmVhZCB0aGUgc3RhdGUgb2YgdGhlIHR3byBpbnRlcm5hbCBjb25uZWN0b3JzLiAgQlJEREFUNgorICAgKiBpcyBpbnRlcm5hbCA1MCwgQlJEREFUNyBpcyBpbnRlcm5hbCA2OC4gIEZvciBlYWNoLCB0aGUgY2FibGUgaXMKKyAgICogcHJlc2VudCBpZiB0aGUgYml0IGlzIDAKKyAgICovCisgIGJyZGN0bCA9IHJlYWRfYnJkY3RsKHApOworICAqaW50XzUwID0gIShicmRjdGwgJiBCUkREQVQ2KTsKKyAgKmludF82OCA9ICEoYnJkY3RsICYgQlJEREFUNyk7CisKKyAgLyoKKyAgICogU2V0IHRoZSBiYW5rIGJpdCBpbiBicmRjdGwgYW5kIHRoZW4gcmVhZCB0aGUgZXh0ZXJuYWwgY2FibGUgc3RhdGUKKyAgICogYW5kIHRoZSBFRVBST00gc3RhdHVzCisgICAqLworICB3cml0ZV9icmRjdGwocCwgQlJEREFUNSk7CisgIGJyZGN0bCA9IHJlYWRfYnJkY3RsKHApOworCisgICpleHRfcHJlc2VudCA9ICEoYnJkY3RsICYgQlJEREFUNik7CisgICplZXByb20gPSAhKGJyZGN0bCAmIEJSRERBVDcpOworCisgIC8qCisgICAqIFdlJ3JlIGRvbmUsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSB0aGUgU0VFUFJPTSBmb3IgdXMKKyAgICovCit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljNzg3eF91bHRyYTJfdGVybV9kZXRlY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRGV0ZWN0IHRoZSB0ZXJtaW5hdGlvbiBzZXR0aW5ncyBwcmVzZW50IG9uIHVsdHJhMiBjbGFzcyBjb250cm9sbGVycworICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgU0VFUFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGFjcXVpcmVkCisgKiAgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X3VsdHJhMl90ZXJtX2RldGVjdChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBpbnQgKmVuYWJsZVNFX2xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlU0VfaGlnaCwgaW50ICplbmFibGVMVkRfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVMVkRfaGlnaCwgaW50ICplcHJvbV9wcmVzZW50KQoreworICB1bnNpZ25lZCBjaGFyIGJyZGN0bDsKKworICBicmRjdGwgPSByZWFkX2JyZGN0bChwKTsKKworICAqZXByb21fcHJlc2VudCAgPSAoYnJkY3RsICYgQlJEREFUNyk7CisgICplbmFibGVTRV9oaWdoICA9IChicmRjdGwgJiBCUkREQVQ2KTsKKyAgKmVuYWJsZVNFX2xvdyAgID0gKGJyZGN0bCAmIEJSRERBVDUpOworICAqZW5hYmxlTFZEX2hpZ2ggPSAoYnJkY3RsICYgQlJEREFUNCk7CisgICplbmFibGVMVkRfbG93ICA9IChicmRjdGwgJiBCUkREQVQzKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBjb25maWd1cmVfdGVybWluYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ29uZmlndXJlcyB0aGUgdGVybWluYXRpb24gc2V0dGluZ3Mgb24gUENJIGFkYXB0ZXJzIHRoYXQgaGF2ZQorICogICBTRUVQUk9NcyBhdmFpbGFibGUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjb25maWd1cmVfdGVybWluYXRpb24oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgaW50IGludGVybmFsNTBfcHJlc2VudCA9IDA7CisgIGludCBpbnRlcm5hbDY4X3ByZXNlbnQgPSAwOworICBpbnQgZXh0ZXJuYWxfcHJlc2VudCA9IDA7CisgIGludCBlcHJvbV9wcmVzZW50ID0gMDsKKyAgaW50IGVuYWJsZVNFX2xvdyA9IDA7CisgIGludCBlbmFibGVTRV9oaWdoID0gMDsKKyAgaW50IGVuYWJsZUxWRF9sb3cgPSAwOworICBpbnQgZW5hYmxlTFZEX2hpZ2ggPSAwOworICB1bnNpZ25lZCBjaGFyIGJyZGRhdCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgbWF4X3RhcmdldCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgc3hmcmN0bDEgPSBhaWNfaW5iKHAsIFNYRlJDVEwxKTsKKworICBpZiAoYWNxdWlyZV9zZWVwcm9tKHApKQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgKEFIQ19XSURFfEFIQ19UV0lOKSkKKyAgICAgIG1heF90YXJnZXQgPSAxNjsKKyAgICBlbHNlCisgICAgICBtYXhfdGFyZ2V0ID0gODsKKyAgICBhaWNfb3V0YihwLCBTRUVNUyB8IFNFRUNTLCBTRUVDVEwpOworICAgIHN4ZnJjdGwxICY9IH5TVFBXRU47CisgICAgLyoKKyAgICAgKiBUaGUgdGVybWluYXRpb24vY2FibGUgZGV0ZWN0aW9uIGxvZ2ljIGlzIHNwbGl0IGludG8gdGhyZWUgZGlzdGluY3QKKyAgICAgKiBncm91cHMuICBVbHRyYTIgYW5kIGxhdGVyIGNvbnRyb2xsZXJzLCAyOTQwVVctUHJvIGNvbnRyb2xsZXJzLCBhbmQKKyAgICAgKiBvbGRlciA3ODUwLCA3ODYwLCA3ODcwLCA3ODgwLCBhbmQgNzg5NSBjb250cm9sbGVycy4gIEVhY2ggaGFzIGl0cworICAgICAqIG93biB1bmlxdWUgd2F5IG9mIGRldGVjdGluZyB0aGVpciBjYWJsZXMgYW5kIHdyaXRpbmcgdGhlIHJlc3VsdHMKKyAgICAgKiBiYWNrIHRvIHRoZSBjYXJkLgorICAgICAqLworICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEFzIGxvbmcgYXMgdXNlciBoYXNuJ3Qgb3ZlcnJpZGRlbiB0ZXJtIHNldHRpbmdzLCBhbHdheXMgY2hlY2sgdGhlCisgICAgICAgKiBjYWJsZSBkZXRlY3Rpb24gbG9naWMKKyAgICAgICAqLworICAgICAgaWYgKGFpYzd4eHhfb3ZlcnJpZGVfdGVybSA9PSAtMSkKKyAgICAgIHsKKyAgICAgICAgYWljN3h4eF91bHRyYTJfdGVybV9kZXRlY3QocCwgJmVuYWJsZVNFX2xvdywgJmVuYWJsZVNFX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVMVkRfbG93LCAmZW5hYmxlTFZEX2hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcHJvbV9wcmVzZW50KTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIElmIHRoZSB1c2VyIGlzIG92ZXJyaWRpbmcgc2V0dGluZ3MsIHRoZW4gdGhleSBoYXZlIGJlZW4gcHJlc2VydmVkCisgICAgICAgKiB0byBoZXJlIGFzIGZha2UgYWRhcHRlcl9jb250cm9sIGVudHJpZXMuICBQYXJzZSB0aGVtIGFuZCBhbGxvdworICAgICAgICogdGhlbSB0byBvdmVycmlkZSB0aGUgZGV0ZWN0ZWQgc2V0dGluZ3MgKGlmIHdlIGV2ZW4gZGlkIGRldGVjdGlvbikuCisgICAgICAgKi8KKyAgICAgIGlmICghKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGU0VBVVRPVEVSTSkpCisgICAgICB7CisgICAgICAgIGVuYWJsZVNFX2xvdyA9IChwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKTsKKyAgICAgICAgZW5hYmxlU0VfaGlnaCA9IChwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRldTVEVSTSk7CisgICAgICB9CisgICAgICBpZiAoIShwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNKSkKKyAgICAgIHsKKyAgICAgICAgZW5hYmxlTFZEX2xvdyA9IGVuYWJsZUxWRF9oaWdoID0gKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGTFZEU1RFUk0pOworICAgICAgfQorCisgICAgICAvKgorICAgICAgICogTm93IHRha2UgdGhvc2Ugc2V0dGluZ3MgdGhhdCB3ZSBoYXZlIGFuZCB0cmFuc2xhdGUgdGhlbSBpbnRvIHRoZQorICAgICAgICogdmFsdWVzIHRoYXQgbXVzdCBiZSB3cml0dGVuIGludG8gdGhlIHJlZ2lzdGVycy4KKyAgICAgICAqCisgICAgICAgKiBGbGFzaCBFbmFibGUgPSBCUkREQVQ3CisgICAgICAgKiBTZWNvbmRhcnkgSGlnaCBUZXJtIEVuYWJsZSA9IEJSRERBVDYKKyAgICAgICAqIFNlY29uZGFyeSBMb3cgVGVybSBFbmFibGUgPSBCUkREQVQ1CisgICAgICAgKiBMVkQvUHJpbWFyeSBIaWdoIFRlcm0gRW5hYmxlID0gQlJEREFUNAorICAgICAgICogTFZEL1ByaW1hcnkgTG93IFRlcm0gRW5hYmxlID0gU1RQV0VOIGJpdCBpbiBTWEZSQ1RMMQorICAgICAgICovCisgICAgICBpZiAoZW5hYmxlTFZEX2xvdyAhPSAwKQorICAgICAgeworICAgICAgICBzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICAgIHAtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9MVkQ7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBMVkQvUHJpbWFyeSBMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAiCisgICAgICAgICAgICAgICAgICJFbmFibGVkXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKyAgICAgICAgICAKKyAgICAgIGlmIChlbmFibGVMVkRfaGlnaCAhPSAwKQorICAgICAgeworICAgICAgICBicmRkYXQgfD0gQlJEREFUNDsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIExWRC9QcmltYXJ5IEhpZ2ggYnl0ZSB0ZXJtaW5hdGlvbiAiCisgICAgICAgICAgICAgICAgICJFbmFibGVkXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKworICAgICAgaWYgKGVuYWJsZVNFX2xvdyAhPSAwKQorICAgICAgeworICAgICAgICBicmRkYXQgfD0gQlJEREFUNTsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIFNlY29uZGFyeSBMb3cgYnl0ZSB0ZXJtaW5hdGlvbiAiCisgICAgICAgICAgICAgICAgICJFbmFibGVkXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKworICAgICAgaWYgKGVuYWJsZVNFX2hpZ2ggIT0gMCkKKyAgICAgIHsKKyAgICAgICAgYnJkZGF0IHw9IEJSRERBVDY7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBTZWNvbmRhcnkgSGlnaCBieXRlIHRlcm1pbmF0aW9uICIKKyAgICAgICAgICAgICAgICAgIkVuYWJsZWRcbiIsIHAtPmhvc3Rfbm8pOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19ORVdfQVVUT1RFUk0pCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFRoZSA1MCBwaW4gY29ubmVjdG9yIHRlcm1pbmF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgU1RQV0VOIGluIHRoZQorICAgICAgICogU1hGUkNUTDEgcmVnaXN0ZXIuICBTaW5jZSB0aGUgQWRhcHRlYyBkb2NzIHR5cGljYWxseSBzYXkgdGhlCisgICAgICAgKiBjb250cm9sbGVyIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluIHRoZSBtaWRkbGUgb2YgYSBjYWJsZSBhbmQKKyAgICAgICAqIHRoaXMgaXMgdGhlIG9ubHkgY29ubmVjdGlvbiBvbiB0aGF0IHN0dWIgb2YgdGhlIGJ1cywgdGhlcmUgaXMKKyAgICAgICAqIG5vIG5lZWQgdG8gZXZlbiBjaGVjayBmb3IgbmFycm93IHRlcm1pbmF0aW9uLCBpdCdzIHNpbXBseQorICAgICAgICogYWx3YXlzIG9uLgorICAgICAgICovCisgICAgICBzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIE5hcnJvdyBjaGFubmVsIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKworICAgICAgaWYgKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGQVVUT1RFUk0pCisgICAgICB7CisgICAgICAgIGFpYzI5NDBfdXdwcm9fd2lkZV9jYWJsZV9kZXRlY3QocCwgJmludGVybmFsNjhfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZXJuYWxfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXByb21fcHJlc2VudCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIENhYmxlcyBwcmVzZW50IChJbnQtNTAgJXMsIEludC02OCAlcywgIgorICAgICAgICAgICAgICAgIkV4dC02OCAlcylcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAiRG9uJ3QgQ2FyZSIsCisgICAgICAgICAgICAgICBpbnRlcm5hbDY4X3ByZXNlbnQgPyAiWUVTIiA6ICJOTyIsCisgICAgICAgICAgICAgICBleHRlcm5hbF9wcmVzZW50ID8gIllFUyIgOiAiTk8iKTsKKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIEVFUFJPTSAlcyBwcmVzZW50LlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgIGVwcm9tX3ByZXNlbnQgPyAiaXMiIDogImlzIG5vdCIpOworICAgICAgICBpZiAoaW50ZXJuYWw2OF9wcmVzZW50ICYmIGV4dGVybmFsX3ByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICBicmRkYXQgPSAwOworICAgICAgICAgIHAtPmZsYWdzICY9IH5BSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBXaWRlIGNoYW5uZWwgdGVybWluYXRpb24gRGlzYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYnJkZGF0ID0gQlJEREFUNjsKKyAgICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBXaWRlIGNoYW5uZWwgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdGVybWluYXRpb24gb2YgdGhlIFdpZGUgY2hhbm5lbCBpcyBkb25lIG1vcmUgbGlrZSBub3JtYWwKKyAgICAgICAgICogdGhvdWdoLCBhbmQgdGhlIHNldHRpbmcgb2YgdGhpcyB0ZXJtaW5hdGlvbiBpcyBkb25lIGJ5IHdyaXRpbmcKKyAgICAgICAgICogZWl0aGVyIGEgMCBvciAxIHRvIEJSRERBVDYgb2YgdGhlIEJSRERBVCByZWdpc3RlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGV1NURVJNKQorICAgICAgICB7CisgICAgICAgICAgYnJkZGF0ID0gQlJEREFUNjsKKyAgICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBXaWRlIGNoYW5uZWwgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBicmRkYXQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocC0+YWRhcHRlcl9jb250cm9sICYgQ0ZBVVRPVEVSTSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHAtPmZsYWdzICYgQUhDX01PVEhFUkJPQVJEKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgV2FybmluZyAtIGRldGVjdGVkIGF1dG8tdGVybWluYXRpb25cbiIsCisgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIFBsZWFzZSB2ZXJpZnkgZHJpdmVyIGRldGVjdGVkIHNldHRpbmdzICIKKyAgICAgICAgICAgICJhcmUgY29ycmVjdC5cbiIsIHAtPmhvc3Rfbm8pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIElmIG5vdCwgdGhlbiBwbGVhc2UgcHJvcGVybHkgc2V0IHRoZSAiCisgICAgICAgICAgICAiZGV2aWNlIHRlcm1pbmF0aW9uXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBpbiB0aGUgQWRhcHRlYyBTQ1NJIEJJT1MgYnkgaGl0dGluZyAiCisgICAgICAgICAgICAiQ1RSTC1BIHdoZW4gcHJvbXB0ZWRcbiIsIHAtPmhvc3Rfbm8pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIGR1cmluZyBtYWNoaW5lIGJvb3R1cC5cbiIsIHAtPmhvc3Rfbm8pOworICAgICAgICB9CisgICAgICAgIC8qIENvbmZpZ3VyZSBhdXRvIHRlcm1pbmF0aW9uLiAqLworCisgICAgICAgIGlmICggKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID49IEFIQ19BSUM3ODcwICkKKyAgICAgICAgeworICAgICAgICAgIGFpYzc4N3hfY2FibGVfZGV0ZWN0KHAsICZpbnRlcm5hbDUwX3ByZXNlbnQsICZpbnRlcm5hbDY4X3ByZXNlbnQsCisgICAgICAgICAgICAmZXh0ZXJuYWxfcHJlc2VudCwgJmVwcm9tX3ByZXNlbnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFpYzc4NXhfY2FibGVfZGV0ZWN0KHAsICZpbnRlcm5hbDUwX3ByZXNlbnQsICZleHRlcm5hbF9wcmVzZW50LAorICAgICAgICAgICAgJmVwcm9tX3ByZXNlbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1heF90YXJnZXQgPD0gOCkKKyAgICAgICAgICBpbnRlcm5hbDY4X3ByZXNlbnQgPSAwOworCisgICAgICAgIGlmIChtYXhfdGFyZ2V0ID4gOCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIENhYmxlcyBwcmVzZW50IChJbnQtNTAgJXMsIEludC02OCAlcywgIgorICAgICAgICAgICAgICAgICAiRXh0LTY4ICVzKVxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgICAgaW50ZXJuYWw1MF9wcmVzZW50ID8gIllFUyIgOiAiTk8iLAorICAgICAgICAgICAgICAgICBpbnRlcm5hbDY4X3ByZXNlbnQgPyAiWUVTIiA6ICJOTyIsCisgICAgICAgICAgICAgICAgIGV4dGVybmFsX3ByZXNlbnQgPyAiWUVTIiA6ICJOTyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIENhYmxlcyBwcmVzZW50IChJbnQtNTAgJXMsIEV4dC01MCAlcylcbiIsCisgICAgICAgICAgICAgICAgIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICAgICAgIGludGVybmFsNTBfcHJlc2VudCA/ICJZRVMiIDogIk5PIiwKKyAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfcHJlc2VudCA/ICJZRVMiIDogIk5PIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIEVFUFJPTSAlcyBwcmVzZW50LlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICAgIGVwcm9tX3ByZXNlbnQgPyAiaXMiIDogImlzIG5vdCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE5vdyBzZXQgdGhlIHRlcm1pbmF0aW9uIGJhc2VkIG9uIHdoYXQgd2UgZm91bmQuICBCUkREQVQ2CisgICAgICAgICAqIGNvbnRyb2xzIHdpZGUgdGVybWluYXRpb24gZW5hYmxlLgorICAgICAgICAgKiBGbGFzaCBFbmFibGUgPSBCUkREQVQ3CisgICAgICAgICAqIFNFIEhpZ2ggVGVybSBFbmFibGUgPSBCUkREQVQ2CisgICAgICAgICAqLworICAgICAgICBpZiAoaW50ZXJuYWw1MF9wcmVzZW50ICYmIGludGVybmFsNjhfcHJlc2VudCAmJiBleHRlcm5hbF9wcmVzZW50KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgSWxsZWdhbCBjYWJsZSBjb25maWd1cmF0aW9uISEgIE9ubHkgdHdvXG4iLAorICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBjb25uZWN0b3JzIG9uIHRoZSBTQ1NJIGNvbnRyb2xsZXIgbWF5IGJlICIKKyAgICAgICAgICAgICAgICAgImluIHVzZSBhdCBhIHRpbWUhXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIEZvcmNlIHRlcm1pbmF0aW9uIChsb3cgYW5kIGhpZ2ggYnl0ZSkgb24uICBUaGlzIGlzIHNhZmVyIHRoYW4KKyAgICAgICAgICAgKiBsZWF2aW5nIGl0IGNvbXBsZXRlbHkgb2ZmLCBlc3BlY2lhbGx5IHNpbmNlIHRoaXMgbWVzc2FnZSBjb21lcworICAgICAgICAgICAqIG1vc3Qgb2Z0ZW4gZnJvbSBtb3RoZXJib2FyZCBjb250cm9sbGVycyB0aGF0IGRvbid0IGV2ZW4gaGF2ZSAzCisgICAgICAgICAgICogY29ubmVjdG9ycywgYnV0IGluc3RlYWQgYXJlIGZhaWxpbmcgdGhlIGNhYmxlIGRldGVjdGlvbi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpbnRlcm5hbDUwX3ByZXNlbnQgPSBleHRlcm5hbF9wcmVzZW50ID0gMDsKKyAgICAgICAgICBlbmFibGVTRV9oaWdoID0gZW5hYmxlU0VfbG93ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobWF4X3RhcmdldCA+IDgpICYmCisgICAgICAgICAgICAoKGV4dGVybmFsX3ByZXNlbnQgPT0gMCkgfHwgKGludGVybmFsNjhfcHJlc2VudCA9PSAwKSkgKQorICAgICAgICB7CisgICAgICAgICAgYnJkZGF0IHw9IEJSRERBVDY7CisgICAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX1RFUk1fRU5CX1NFX0hJR0g7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgU0UgSGlnaCBieXRlIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICgoaW50ZXJuYWw1MF9wcmVzZW50ID8gMSA6IDApICsKKyAgICAgICAgICAgICAgKGludGVybmFsNjhfcHJlc2VudCA/IDEgOiAwKSArCisgICAgICAgICAgICAgIChleHRlcm5hbF9wcmVzZW50ICAgPyAxIDogMCkpIDw9IDEgKQorICAgICAgICB7CisgICAgICAgICAgc3hmcmN0bDEgfD0gU1RQV0VOOworICAgICAgICAgIHAtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9TRV9MT1c7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgU0UgTG93IGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAvKiBwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRkFVVE9URVJNICovCisgICAgICB7CisgICAgICAgIGlmIChwLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKQorICAgICAgICB7CisgICAgICAgICAgc3hmcmN0bDEgfD0gU1RQV0VOOworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIFNFIExvdyBieXRlIHRlcm1pbmF0aW9uIEVuYWJsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgcC0+aG9zdF9ubyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocC0+YWRhcHRlcl9jb250cm9sICYgQ0ZXU1RFUk0pCisgICAgICAgIHsKKyAgICAgICAgICBicmRkYXQgfD0gQlJEREFUNjsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBTRSBIaWdoIGJ5dGUgdGVybWluYXRpb24gRW5hYmxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBwLT5ob3N0X25vKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFpY19vdXRiKHAsIHN4ZnJjdGwxLCBTWEZSQ1RMMSk7CisgICAgd3JpdGVfYnJkY3RsKHAsIGJyZGRhdCk7CisgICAgcmVsZWFzZV9zZWVwcm9tKHApOworICB9Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgZGV0ZWN0X21heHNjYgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlY3RzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBTQ0JzIGZvciB0aGUgY29udHJvbGxlciBhbmQgcmV0dXJucworICogICB0aGUgY291bnQgYW5kIGEgbWFzayBpbiBwIChwLT5tYXhzY2JzLCBwLT5xY250bWFzaykuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitkZXRlY3RfbWF4c2NiKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIGludCBpOworCisgIC8qCisgICAqIEl0J3MgcG9zc2libGUgdGhhdCB3ZSd2ZSBhbHJlYWR5IGRvbmUgdGhpcyBmb3IgbXVsdGljaGFubmVsCisgICAqIGFkYXB0ZXJzLgorICAgKi8KKyAgaWYgKHAtPnNjYl9kYXRhLT5tYXhoc2NicyA9PSAwKQorICB7CisgICAgLyoKKyAgICAgKiBXZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBTQ0Igc2V0dGluZ3MgeWV0LiAgV2FsayB0aGUgU0NCcyB0bworICAgICAqIGRldGVybWluY2UgaG93IG1hbnkgdGhlcmUgYXJlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIDAsIEZSRUVfU0NCSCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQUlDN1hYWF9NQVhTQ0I7IGkrKykKKyAgICB7CisgICAgICBhaWNfb3V0YihwLCBpLCBTQ0JQVFIpOworICAgICAgYWljX291dGIocCwgaSwgU0NCX0NPTlRST0wpOworICAgICAgaWYgKGFpY19pbmIocCwgU0NCX0NPTlRST0wpICE9IGkpCisgICAgICAgIGJyZWFrOworICAgICAgYWljX291dGIocCwgMCwgU0NCUFRSKTsKKyAgICAgIGlmIChhaWNfaW5iKHAsIFNDQl9DT05UUk9MKSAhPSAwKQorICAgICAgICBicmVhazsKKworICAgICAgYWljX291dGIocCwgaSwgU0NCUFRSKTsKKyAgICAgIGFpY19vdXRiKHAsIDAsIFNDQl9DT05UUk9MKTsgICAvKiBDbGVhciB0aGUgY29udHJvbCBieXRlLiAqLworICAgICAgYWljX291dGIocCwgaSArIDEsIFNDQl9ORVhUKTsgIC8qIFNldCB0aGUgbmV4dCBwb2ludGVyLiAqLworICAgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX1RBRyk7ICAvKiBNYWtlIHRoZSB0YWcgaW52YWxpZC4gKi8KKyAgICAgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFNDQl9CVVNZVEFSR0VUUyk7ICAvKiBubyBidXN5IHVudGFnZ2VkICovCisgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfQlVTWVRBUkdFVFMrMSk7LyogdGFyZ2V0cyBhY3RpdmUgeWV0ICovCisgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfQlVTWVRBUkdFVFMrMik7CisgICAgICBhaWNfb3V0YihwLCBTQ0JfTElTVF9OVUxMLCBTQ0JfQlVTWVRBUkdFVFMrMyk7CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHRoZSBsYXN0IFNDQiB0ZXJtaW5hdGVzIHRoZSBmcmVlIGxpc3QuICovCisgICAgYWljX291dGIocCwgaSAtIDEsIFNDQlBUUik7CisgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX05FWFQpOworCisgICAgLyogRW5zdXJlIHdlIGNsZWFyIHRoZSBmaXJzdCAoMCkgU0NCcyBjb250cm9sIGJ5dGUuICovCisgICAgYWljX291dGIocCwgMCwgU0NCUFRSKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisKKyAgICBwLT5zY2JfZGF0YS0+bWF4aHNjYnMgPSBpOworICAgIC8qCisgICAgICogVXNlIGRpcmVjdCBpbmRleGluZyBpbnN0ZWFkIGZvciBzcGVlZAorICAgICAqLworICAgIGlmICggaSA9PSBBSUM3WFhYX01BWFNDQiApCisgICAgICBwLT5mbGFncyAmPSB+QUhDX1BBR0VTQ0JTOworICB9CisKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3JlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFJlZ2lzdGVyIGEgQWRhcHRlYyBhaWM3eHh4IGNoaXAgU0NTSSBjb250cm9sbGVyIHdpdGggdGhlIGtlcm5lbC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorYWljN3h4eF9yZWdpc3RlcihTY3NpX0hvc3RfVGVtcGxhdGUgKnRlbXBsYXRlLCBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLAorICBpbnQgcmVzZXRfZGVsYXkpCit7CisgIGludCBpLCByZXN1bHQ7CisgIGludCBtYXhfdGFyZ2V0czsKKyAgaW50IGZvdW5kID0gMTsKKyAgdW5zaWduZWQgY2hhciB0ZXJtLCBzY3NpX2NvbmY7CisgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisKKyAgaG9zdCA9IHAtPmhvc3Q7CisKKyAgcC0+c2NiX2RhdGEtPm1heHNjYnMgPSBBSUM3WFhYX01BWFNDQjsKKyAgaG9zdC0+Y2FuX3F1ZXVlID0gQUlDN1hYWF9NQVhTQ0I7CisgIGhvc3QtPmNtZF9wZXJfbHVuID0gMzsKKyAgaG9zdC0+c2dfdGFibGVzaXplID0gQUlDN1hYWF9NQVhfU0c7CisgIGhvc3QtPnRoaXNfaWQgPSBwLT5zY3NpX2lkOworICBob3N0LT5pb19wb3J0ID0gcC0+YmFzZTsKKyAgaG9zdC0+bl9pb19wb3J0ID0gMHhGRjsKKyAgaG9zdC0+YmFzZSA9IHAtPm1iYXNlOworICBob3N0LT5pcnEgPSBwLT5pcnE7CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19XSURFKQorICB7CisgICAgaG9zdC0+bWF4X2lkID0gMTY7CisgIH0KKyAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgIHsKKyAgICBob3N0LT5tYXhfY2hhbm5lbCA9IDE7CisgIH0KKworICBwLT5ob3N0ID0gaG9zdDsKKyAgcC0+aG9zdF9ubyA9IGhvc3QtPmhvc3Rfbm87CisgIGhvc3QtPnVuaXF1ZV9pZCA9IHAtPmluc3RhbmNlOworICBwLT5pc3JfY291bnQgPSAwOworICBwLT5uZXh0ID0gTlVMTDsKKyAgcC0+Y29tcGxldGVxLmhlYWQgPSBOVUxMOworICBwLT5jb21wbGV0ZXEudGFpbCA9IE5VTEw7CisgIHNjYnFfaW5pdCgmcC0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7CisgIHNjYnFfaW5pdCgmcC0+d2FpdGluZ19zY2JzKTsKKyAgSU5JVF9MSVNUX0hFQUQoJnAtPmFpY19kZXZzKTsKKworICAvKgorICAgKiBXZSBjdXJyZW50bHkgaGF2ZSBubyBjb21tYW5kcyBvZiBhbnkgdHlwZQorICAgKi8KKyAgcC0+cWluZmlmb25leHQgPSAwOworICBwLT5xb3V0Zmlmb25leHQgPSAwOworCisgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIDwlcz4gZm91bmQgYXQgIiwgcC0+aG9zdF9ubywKKyAgICBib2FyZF9uYW1lc1twLT5ib2FyZF9uYW1lX2luZGV4XSk7CisgIHN3aXRjaChwLT5jaGlwKQorICB7CisgICAgY2FzZSAoQUhDX0FJQzc3NzB8QUhDX0VJU0EpOgorICAgICAgcHJpbnRrKCJFSVNBIHNsb3QgJWRcbiIsIHAtPnBjaV9kZXZpY2VfZm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAoQUhDX0FJQzc3NzB8QUhDX1ZMKToKKyAgICAgIHByaW50aygiVkxCIHNsb3QgJWRcbiIsIHAtPnBjaV9kZXZpY2VfZm4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50aygiUENJICVkLyVkLyVkXG4iLCBwLT5wY2lfYnVzLCBQQ0lfU0xPVChwLT5wY2lfZGV2aWNlX2ZuKSwKKyAgICAgICAgUENJX0ZVTkMocC0+cGNpX2RldmljZV9mbikpOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgIHsKKyAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBUd2luIENoYW5uZWwsIEEgU0NTSSBJRCAlZCwgQiBTQ1NJIElEICVkLCAiLAorICAgICAgICAgICBwLT5ob3N0X25vLCBwLT5zY3NpX2lkLCBwLT5zY3NpX2lkX2IpOworICB9CisgIGVsc2UKKyAgeworICAgIGNoYXIgKmNoYW5uZWw7CisKKyAgICBjaGFubmVsID0gIiI7CisKKyAgICBpZiAoKHAtPmZsYWdzICYgQUhDX01VTFRJX0NIQU5ORUwpICE9IDApCisgICAgeworICAgICAgY2hhbm5lbCA9ICIgQSI7CisKKyAgICAgIGlmICggKHAtPmZsYWdzICYgKEFIQ19DSE5MQnxBSENfQ0hOTEMpKSAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgY2hhbm5lbCA9IChwLT5mbGFncyAmIEFIQ19DSE5MQikgPyAiIEIiIDogIiBDIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgV2lkZSAiLCBwLT5ob3N0X25vKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIE5hcnJvdyAiLCBwLT5ob3N0X25vKTsKKyAgICB9CisgICAgcHJpbnRrKCJDaGFubmVsJXMsIFNDU0kgSUQ9JWQsICIsIGNoYW5uZWwsIHAtPnNjc2lfaWQpOworICB9CisgIGFpY19vdXRiKHAsIDAsIFNFUV9GTEFHUyk7CisKKyAgZGV0ZWN0X21heHNjYihwKTsKKworICBwcmludGsoIiVkLyVkIFNDQnNcbiIsIHAtPnNjYl9kYXRhLT5tYXhoc2NicywgcC0+c2NiX2RhdGEtPm1heHNjYnMpOworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgIHsKKyAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBCSU9TICVzYWJsZWQsIElPIFBvcnQgMHglbHgsIElSUSAlZFxuIiwKKyAgICAgIHAtPmhvc3Rfbm8sIChwLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpID8gImVuIiA6ICJkaXMiLAorICAgICAgcC0+YmFzZSwgcC0+aXJxKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBJTyBNZW1vcnkgYXQgMHglbHgsIE1NQVAgTWVtb3J5IGF0ICVwXG4iLAorICAgICAgcC0+aG9zdF9ubywgcC0+bWJhc2UsIHAtPm1hZGRyKTsKKyAgfQorCisjaWZkZWYgQ09ORklHX1BDSQorICAvKgorICAgKiBOb3cgdGhhdCB3ZSBrbm93IG91ciBpbnN0YW5jZSBudW1iZXIsIHdlIGNhbiBzZXQgdGhlIGZsYWdzIHdlIG5lZWQgdG8KKyAgICogZm9yY2UgdGVybWluYXRpb24gaWYgbmVlZCBiZS4KKyAgICovCisgIGlmIChhaWM3eHh4X3N0cHdsZXYgIT0gLTEpCisgIHsKKyAgICAvKgorICAgICAqIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyB0byBQQ0kgY29udHJvbGxlcnMuCisgICAgICovCisgICAgaWYgKCAocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBkZXZjb25maWc7CisKKyAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHAtPnBkZXYsIERFVkNPTkZJRywgJmRldmNvbmZpZyk7CisgICAgICBpZiAoIChhaWM3eHh4X3N0cHdsZXYgPj4gcC0+aW5zdGFuY2UpICYgMHgwMSApCisgICAgICB7CisgICAgICAgIGRldmNvbmZpZyB8PSBTVFBXTEVWRUw7CisgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICAgICAgICBwcmludGsoIihzY3NpJWQpIEZvcmNlIHNldHRpbmcgU1RQV0xFVkVMIGJpdFxuIiwgcC0+aG9zdF9ubyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRldmNvbmZpZyAmPSB+U1RQV0xFVkVMOworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgcHJpbnRrKCIoc2NzaSVkKSBGb3JjZSBjbGVhcmluZyBTVFBXTEVWRUwgYml0XG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIH0KKyAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwLT5wZGV2LCBERVZDT05GSUcsIGRldmNvbmZpZyk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvKgorICAgKiBUaGF0IHRvb2sgY2FyZSBvZiBkZXZjb25maWcgYW5kIHN0cHdsZXYsIG5vdyBmb3IgdGhlIGFjdHVhbCB0ZXJtaW5hdGlvbgorICAgKiBzZXR0aW5ncy4KKyAgICovCisgIGlmIChhaWM3eHh4X292ZXJyaWRlX3Rlcm0gIT0gLTEpCisgIHsKKyAgICAvKgorICAgICAqIEFnYWluLCB0aGlzIG9ubHkgYXBwbGllcyB0byBQQ0kgY29udHJvbGxlcnMuICBXZSBkb24ndCBoYXZlIHByb2JsZW1zCisgICAgICogd2l0aCB0aGUgdGVybWluYXRpb24gb24gMjc0eCBjb250cm9sbGVycyB0byB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UuCisgICAgICovCisgICAgaWYgKCAocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB0ZXJtX292ZXJyaWRlOworCisgICAgICB0ZXJtX292ZXJyaWRlID0gKCAoYWljN3h4eF9vdmVycmlkZV90ZXJtID4+IChwLT5pbnN0YW5jZSAqIDQpKSAmIDB4MGYpOworICAgICAgcC0+YWRhcHRlcl9jb250cm9sICY9IAorICAgICAgICB+KENGU1RFUk18Q0ZXU1RFUk18Q0ZMVkRTVEVSTXxDRkFVVE9URVJNfENGU0VBVVRPVEVSTSk7CisgICAgICBpZiAoIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICYmICh0ZXJtX292ZXJyaWRlICYgMHgwYykgKQorICAgICAgeworICAgICAgICBwLT5hZGFwdGVyX2NvbnRyb2wgfD0gQ0ZMVkRTVEVSTTsKKyAgICAgIH0KKyAgICAgIGlmICh0ZXJtX292ZXJyaWRlICYgMHgwMikKKyAgICAgIHsKKyAgICAgICAgcC0+YWRhcHRlcl9jb250cm9sIHw9IENGV1NURVJNOworICAgICAgfQorICAgICAgaWYgKHRlcm1fb3ZlcnJpZGUgJiAweDAxKQorICAgICAgeworICAgICAgICBwLT5hZGFwdGVyX2NvbnRyb2wgfD0gQ0ZTVEVSTTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIChwLT5mbGFncyAmIEFIQ19TRUVQUk9NX0ZPVU5EKSB8fCAoYWljN3h4eF9vdmVycmlkZV90ZXJtICE9IC0xKSApCisgIHsKKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfU1BJT0NBUCkKKyAgICB7CisgICAgICBpZiAoIGFpY19pbmIocCwgU1BJT0NBUCkgJiBTU1BJT0NQUyApCisgICAgICAvKgorICAgICAgICogVXBkYXRlIHRoZSBzZXR0aW5ncyBpbiBzeGZyY3RsMSB0byBtYXRjaCB0aGUgdGVybWluYXRpb24KKyAgICAgICAqIHNldHRpbmdzLgorICAgICAgICovCisgICAgICAgIGNvbmZpZ3VyZV90ZXJtaW5hdGlvbihwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spID49IEFIQ19BSUM3ODcwKQorICAgIHsKKyAgICAgIGNvbmZpZ3VyZV90ZXJtaW5hdGlvbihwKTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBTZXQgdGhlIFNDU0kgSWQsIFNYRlJDVEwwLCBTWEZSQ1RMMSwgYW5kIFNJTU9ERTEsIGZvciBib3RoIGNoYW5uZWxzCisgICAqLworICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikKKyAgeworICAgIC8qIFNlbGVjdCBjaGFubmVsIEIgKi8KKyAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNCTEtDVEwpIHwgU0VMQlVTQiwgU0JMS0NUTCk7CisKKyAgICBpZiAoKHAtPmZsYWdzICYgQUhDX1NFRVBST01fRk9VTkQpIHx8IChhaWM3eHh4X292ZXJyaWRlX3Rlcm0gIT0gLTEpKQorICAgICAgdGVybSA9IChhaWNfaW5iKHAsIFNYRlJDVEwxKSAmIFNUUFdFTik7CisgICAgZWxzZQorICAgICAgdGVybSA9ICgocC0+ZmxhZ3MgJiBBSENfVEVSTV9FTkJfQikgPyBTVFBXRU4gOiAwKTsKKworICAgIGFpY19vdXRiKHAsIHAtPnNjc2lfaWRfYiwgU0NTSUlEKTsKKyAgICBzY3NpX2NvbmYgPSBhaWNfaW5iKHAsIFNDU0lDT05GICsgMSk7CisgICAgYWljX291dGIocCwgREZPTiB8IFNQSU9FTiwgU1hGUkNUTDApOworICAgIGFpY19vdXRiKHAsIChzY3NpX2NvbmYgJiBFTlNQQ0hLKSB8IGFpYzd4eHhfc2VsdGltZSB8IHRlcm0gfCAKKyAgICAgICAgIEVOU1RJTUVSIHwgQUNUTkVHRU4sIFNYRlJDVEwxKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTSU1PREUwKTsKKyAgICBhaWNfb3V0YihwLCBFTlNFTFRJTU8gfCBFTlNDU0lSU1QgfCBFTlNDU0lQRVJSLCBTSU1PREUxKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTQ1NJUkFURSk7CisKKyAgICAvKiBTZWxlY3QgY2hhbm5lbCBBICovCisgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQkxLQ1RMKSAmIH5TRUxCVVNCLCBTQkxLQ1RMKTsKKyAgfQorCisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgIHsKKyAgICBhaWNfb3V0YihwLCBwLT5zY3NpX2lkLCBTQ1NJSURfVUxUUkEyKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBhaWNfb3V0YihwLCBwLT5zY3NpX2lkLCBTQ1NJSUQpOworICB9CisgIGlmICgocC0+ZmxhZ3MgJiBBSENfU0VFUFJPTV9GT1VORCkgfHwgKGFpYzd4eHhfb3ZlcnJpZGVfdGVybSAhPSAtMSkpCisgICAgdGVybSA9IChhaWNfaW5iKHAsIFNYRlJDVEwxKSAmIFNUUFdFTik7CisgIGVsc2UKKyAgICB0ZXJtID0gKChwLT5mbGFncyAmIChBSENfVEVSTV9FTkJfQXxBSENfVEVSTV9FTkJfTFZEKSkgPyBTVFBXRU4gOiAwKTsKKyAgc2NzaV9jb25mID0gYWljX2luYihwLCBTQ1NJQ09ORik7CisgIGFpY19vdXRiKHAsIERGT04gfCBTUElPRU4sIFNYRlJDVEwwKTsKKyAgYWljX291dGIocCwgKHNjc2lfY29uZiAmIEVOU1BDSEspIHwgYWljN3h4eF9zZWx0aW1lIHwgdGVybSB8IAorICAgICAgIEVOU1RJTUVSIHwgQUNUTkVHRU4sIFNYRlJDVEwxKTsKKyAgYWljX291dGIocCwgMCwgU0lNT0RFMCk7CisgIC8qCisgICAqIElmIHdlIGFyZSBhIGNhcmRidXMgYWRhcHRlciB0aGVuIGRvbid0IGVuYWJsZSBTQ1NJIHJlc2V0IGRldGVjdGlvbi4KKyAgICogV2Ugc2hvdWxkbid0IGxpa2VseSBiZSBzaGFyaW5nIFNDU0kgYnVzc2VzIHdpdGggc29tZW9uZSBlbHNlLCBhbmQKKyAgICogaWYgd2UgZG9uJ3QgaGF2ZSBhIGNhYmxlIGN1cnJlbnRseSBwbHVnZ2VkIGludG8gdGhlIGNvbnRyb2xsZXIgdGhlbgorICAgKiB3ZSB3b24ndCBoYXZlIGEgcG93ZXIgc291cmNlIGZvciB0aGUgU0NTSSB0ZXJtaW5hdGlvbiwgd2hpY2ggbWVhbnMKKyAgICogd2UnbGwgc2VlIGluZmluaXRlIGluY29taW5nIGJ1cyByZXNldHMuCisgICAqLworICBpZihwLT5mbGFncyAmIEFIQ19OT19TVFBXRU4pCisgICAgYWljX291dGIocCwgRU5TRUxUSU1PIHwgRU5TQ1NJUEVSUiwgU0lNT0RFMSk7CisgIGVsc2UKKyAgICBhaWNfb3V0YihwLCBFTlNFTFRJTU8gfCBFTlNDU0lSU1QgfCBFTlNDU0lQRVJSLCBTSU1PREUxKTsKKyAgYWljX291dGIocCwgMCwgU0NTSVJBVEUpOworICBpZiAoIHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICBhaWNfb3V0YihwLCAwLCBTQ1NJT0ZGU0VUKTsKKworICAvKgorICAgKiBMb29rIGF0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IGJvYXJkIGluaXRpYWxpemF0aW9uIG9yIHRoZSBib2FyZAorICAgKiBCSU9TIGhhcyBsZWZ0IHVzLiBJbiB0aGUgbG93ZXIgZm91ciBiaXRzIG9mIGVhY2ggdGFyZ2V0J3MKKyAgICogc2NyYXRjaCBzcGFjZSBhbnkgdmFsdWUgb3RoZXIgdGhhbiAwIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZAorICAgKiBpbml0aWF0ZSBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuIElmIGl0J3MgemVybywgdGhlIHVzZXIgb3IgdGhlCisgICAqIEJJT1MgaGFzIGRlY2lkZWQgdG8gZGlzYWJsZSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiB0byB0aGF0CisgICAqIHRhcmdldCBzbyB3ZSBkb24ndCBhY3RpdmF0ZSB0aGUgbmVlZHNkdHIgZmxhZy4KKyAgICovCisgIGlmICgocC0+ZmVhdHVyZXMgJiAoQUhDX1RXSU58QUhDX1dJREUpKSA9PSAwKQorICB7CisgICAgbWF4X3RhcmdldHMgPSA4OworICB9CisgIGVsc2UKKyAgeworICAgIG1heF90YXJnZXRzID0gMTY7CisgIH0KKworICBpZiAoIShhaWM3eHh4X25vX3Jlc2V0KSkKKyAgeworICAgIC8qCisgICAgICogSWYgd2UgcmVzZXQgdGhlIGJ1cywgdGhlbiBjbGVhciB0aGUgdHJhbnNmZXIgc2V0dGluZ3MsIGVsc2UgbGVhdmUKKyAgICAgKiB0aGVtIGJlLgorICAgICAqLworICAgIGFpY19vdXRiKHAsIDAsIFVMVFJBX0VOQik7CisgICAgYWljX291dGIocCwgMCwgVUxUUkFfRU5CICsgMSk7CisgICAgcC0+dWx0cmFlbmIgPSAwOworICB9CisKKyAgLyoKKyAgICogQWxsb2NhdGUgZW5vdWdoIGhhcmR3YXJlIHNjYnMgdG8gaGFuZGxlIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgKiBjb25jdXJyZW50IHRyYW5zYWN0aW9ucyB3ZSBjYW4gaGF2ZS4gIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICogdGhlIGFsbG9jYXRlZCBtZW1vcnkgaXMgY29udGlndW91cyBtZW1vcnkuICBUaGUgTGludXgga21hbGxvYworICAgKiByb3V0aW5lIHNob3VsZCBvbmx5IGFsbG9jYXRlIGNvbnRpZ3VvdXMgbWVtb3J5LCBidXQgbm90ZSB0aGF0CisgICAqIHRoaXMgY291bGQgYmUgYSBwcm9ibGVtIGlmIGttYWxsb2MoKSBpcyBjaGFuZ2VkLgorICAgKi8KKyAgeworICAgIHNpemVfdCBhcnJheV9zaXplOworICAgIHVuc2lnbmVkIGludCBoc2NiX3BoeXNhZGRyOworCisgICAgYXJyYXlfc2l6ZSA9IHAtPnNjYl9kYXRhLT5tYXhzY2JzICogc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2h3c2NiKTsKKyAgICBpZiAocC0+c2NiX2RhdGEtPmhzY2JzID09IE5VTEwpCisgICAgeworICAgICAgLyogcGNpX2FsbG9jX2NvbnNpc3RlbnQgZW5mb3JjZXMgdGhlIGFsaWdubWVudCBhbHJlYWR5IGFuZAorICAgICAgICogY2xlYXJzIHRoZSBhcmVhIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIHAtPnNjYl9kYXRhLT5oc2NicyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHAtPnBkZXYsIGFycmF5X3NpemUsCisJCQkJCQkmcC0+c2NiX2RhdGEtPmhzY2JzX2RtYSk7CisgICAgICAvKiBXZSBoYXZlIHRvIHVzZSBwY2lfZnJlZV9jb25zaXN0ZW50LCBub3Qga2ZyZWUgKi8KKyAgICAgIHAtPnNjYl9kYXRhLT5oc2NiX2ttYWxsb2NfcHRyID0gTlVMTDsKKyAgICAgIHAtPnNjYl9kYXRhLT5oc2Nic19kbWFfbGVuID0gYXJyYXlfc2l6ZTsKKyAgICB9CisgICAgaWYgKHAtPnNjYl9kYXRhLT5oc2NicyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50aygiKHNjc2klZCkgVW5hYmxlIHRvIGFsbG9jYXRlIGhhcmR3YXJlIFNDQiBhcnJheTsgIgorICAgICAgICAgICAgICJmYWlsaW5nIGRldGVjdGlvbi5cbiIsIHAtPmhvc3Rfbm8pOworICAgICAgYWljX291dGIocCwgMCwgU0lNT0RFMSk7CisgICAgICBwLT5pcnEgPSAwOworICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGhzY2JfcGh5c2FkZHIgPSBwLT5zY2JfZGF0YS0+aHNjYnNfZG1hOworICAgIGFpY19vdXRiKHAsIGhzY2JfcGh5c2FkZHIgJiAweEZGLCBIU0NCX0FERFIpOworICAgIGFpY19vdXRiKHAsIChoc2NiX3BoeXNhZGRyID4+IDgpICYgMHhGRiwgSFNDQl9BRERSICsgMSk7CisgICAgYWljX291dGIocCwgKGhzY2JfcGh5c2FkZHIgPj4gMTYpICYgMHhGRiwgSFNDQl9BRERSICsgMik7CisgICAgYWljX291dGIocCwgKGhzY2JfcGh5c2FkZHIgPj4gMjQpICYgMHhGRiwgSFNDQl9BRERSICsgMyk7CisKKyAgICAvKiBTZXQgdXAgdGhlIGZpZm8gYXJlYXMgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIHAtPnVudGFnZ2VkX3NjYnMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwLT5wZGV2LCAzKjI1NiwgJnAtPmZpZm9fZG1hKTsKKyAgICBpZiAocC0+dW50YWdnZWRfc2NicyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50aygiKHNjc2klZCkgVW5hYmxlIHRvIGFsbG9jYXRlIGhhcmR3YXJlIEZJRk8gYXJyYXlzOyAiCisgICAgICAgICAgICAgImZhaWxpbmcgZGV0ZWN0aW9uLlxuIiwgcC0+aG9zdF9ubyk7CisgICAgICBwLT5pcnEgPSAwOworICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIHAtPnFvdXRmaWZvID0gcC0+dW50YWdnZWRfc2NicyArIDI1NjsKKyAgICBwLT5xaW5maWZvID0gcC0+cW91dGZpZm8gKyAyNTY7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgIHAtPnVudGFnZ2VkX3NjYnNbaV0gPSBTQ0JfTElTVF9OVUxMOworICAgICAgcC0+cWluZmlmb1tpXSA9IFNDQl9MSVNUX05VTEw7CisgICAgICBwLT5xb3V0Zmlmb1tpXSA9IFNDQl9MSVNUX05VTEw7CisgICAgfQorCisgICAgaHNjYl9waHlzYWRkciA9IHAtPmZpZm9fZG1hOworICAgIGFpY19vdXRiKHAsIGhzY2JfcGh5c2FkZHIgJiAweEZGLCBTQ0JJRF9BRERSKTsKKyAgICBhaWNfb3V0YihwLCAoaHNjYl9waHlzYWRkciA+PiA4KSAmIDB4RkYsIFNDQklEX0FERFIgKyAxKTsKKyAgICBhaWNfb3V0YihwLCAoaHNjYl9waHlzYWRkciA+PiAxNikgJiAweEZGLCBTQ0JJRF9BRERSICsgMik7CisgICAgYWljX291dGIocCwgKGhzY2JfcGh5c2FkZHIgPj4gMjQpICYgMHhGRiwgU0NCSURfQUREUiArIDMpOworICB9CisKKyAgLyogVGhlIFEtRklGT3Mgd2UganVzdCBzZXQgdXAgYXJlIGFsbCBlbXB0eSAqLworICBhaWNfb3V0YihwLCAwLCBRSU5QT1MpOworICBhaWNfb3V0YihwLCAwLCBLRVJORUxfUUlOUE9TKTsKKyAgYWljX291dGIocCwgMCwgUU9VVFBPUyk7CisKKyAgaWYocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykKKyAgeworICAgIGFpY19vdXRiKHAsIFNDQl9RU0laRV8yNTYsIFFPRkZfQ1RMU1RBKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTRFNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTTlNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBITlNDQl9RT0ZGKTsKKyAgfQorCisgIC8qCisgICAqIFdlIGRvbid0IGhhdmUgYW55IHdhaXRpbmcgc2VsZWN0aW9ucyBvciBkaXNjb25uZWN0ZWQgU0NCcy4KKyAgICovCisgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFdBSVRJTkdfU0NCSCk7CisgIGFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIERJU0NPTk5FQ1RFRF9TQ0JIKTsKKworICAvKgorICAgKiBNZXNzYWdlIG91dCBidWZmZXIgc3RhcnRzIGVtcHR5CisgICAqLworICBhaWNfb3V0YihwLCBNU0dfTk9PUCwgTVNHX09VVCk7CisgIGFpY19vdXRiKHAsIE1TR19OT09QLCBMQVNUX01TRyk7CisKKyAgLyoKKyAgICogU2V0IGFsbCB0aGUgb3RoZXIgYXN1bmRyeSBpdGVtcyB0aGF0IGhhdmVuJ3QgYmVlbiBzZXQgeWV0LgorICAgKiBUaGlzIGluY2x1ZGVzIGp1c3QgZHVtcGluZyBpbml0IHZhbHVlcyB0byBhIGxvdCBvZiByZWdpc3RlcnMgc2ltcGx5CisgICAqIHRvIG1ha2Ugc3VyZSB0aGV5J3ZlIGJlZW4gdG91Y2hlZCBhbmQgYXJlIHJlYWR5IGZvciB1c2UgcGFyaXR5IHdpc2UKKyAgICogc3BlYWtpbmcuCisgICAqLworICBhaWNfb3V0YihwLCAwLCBUTU9ERV9DTURBRERSKTsKKyAgYWljX291dGIocCwgMCwgVE1PREVfQ01EQUREUiArIDEpOworICBhaWNfb3V0YihwLCAwLCBUTU9ERV9DTURBRERSICsgMik7CisgIGFpY19vdXRiKHAsIDAsIFRNT0RFX0NNREFERFIgKyAzKTsKKyAgYWljX291dGIocCwgMCwgVE1PREVfQ01EQUREUl9ORVhUKTsKKworICAvKgorICAgKiBMaW5rIHVzIGludG8gdGhlIGxpc3Qgb2YgdmFsaWQgaG9zdHMKKyAgICovCisgIHAtPm5leHQgPSBmaXJzdF9haWM3eHh4OworICBmaXJzdF9haWM3eHh4ID0gcDsKKworICAvKgorICAgKiBBbGxvY2F0ZSB0aGUgZmlyc3Qgc2V0IG9mIHNjYnMgZm9yIHRoaXMgY29udHJvbGxlci4gIFRoaXMgaXMgdG8gc3RyZWFtLQorICAgKiBsaW5lIGNvZGUgZWxzZXdoZXJlIGluIHRoZSBkcml2ZXIuICBJZiB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlCisgICAqIG9mIHNjYnMgaW4gY2VydGFpbiBjb2RlIHNlY3Rpb25zLCBpdCBzbG93cyB0aGluZ3MgZG93bi4gIEhvd2V2ZXIsIGFzCisgICAqIHNvb24gYXMgd2UgcmVnaXN0ZXIgdGhlIElSUSBmb3IgdGhpcyBjYXJkLCB3ZSBjb3VsZCBnZXQgYW4gaW50ZXJydXB0IHRoYXQKKyAgICogaW5jbHVkZXMgcG9zc2libHkgdGhlIFNDU0lfUlNUSSBpbnRlcnJ1cHQuICBJZiB3ZSBjYXRjaCB0aGF0IGludGVycnVwdAorICAgKiB0aGVuIHdlIGFyZSBsaWtlbHkgdG8gc2VnZmF1bHQgaWYgd2UgZG9uJ3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2h1bmsgb2YKKyAgICogU0NCcyBhbGxvY2F0ZWQgb3IgYWRkIGNoZWNrcyBhbGwgdGhyb3VnaCB0aGUgcmVzZXQgY29kZSB0byBtYWtlIHN1cmUKKyAgICogdGhhdCB0aGUgU0NCcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHdoaWNoIGlzIGFuIGludmFsaWQgcnVubmluZyBjb25kaXRpb24KKyAgICogYW5kIHRoZXJlZm9yZSBJIHRoaW5rIGl0J3MgcHJlZmVyYWJsZSB0byBzaW1wbHkgcHJlLWFsbG9jYXRlIHRoZSBmaXJzdAorICAgKiBjaHVuayBvZiBTQ0JzLgorICAgKi8KKyAgYWljN3h4eF9hbGxvY2F0ZV9zY2IocCk7CisKKyAgLyoKKyAgICogTG9hZCB0aGUgc2VxdWVuY2VyIHByb2dyYW0sIHRoZW4gcmUtZW5hYmxlIHRoZSBib2FyZCAtCisgICAqIHJlc2V0dGluZyB0aGUgQUlDLTc3NzAgZGlzYWJsZXMgaXQsIGxlYXZpbmcgdGhlIGxpZ2h0cworICAgKiBvbiB3aXRoIG5vYm9keSBob21lLgorICAgKi8KKyAgYWljN3h4eF9sb2Fkc2VxKHApOworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGUgQVVUT0ZMVVNIRElTIGJpdCBpcyAqbm90KiBzZXQgaW4gdGhlIFNCTEtDVEwgcmVnaXN0ZXIKKyAgICovCisgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0JMS0NUTCkgJiB+QVVUT0ZMVVNIRElTLCBTQkxLQ1RMKTsKKworICBpZiAoIChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKSA9PSBBSENfQUlDNzc3MCApCisgIHsKKyAgICBhaWNfb3V0YihwLCBFTkFCTEUsIEJDVEwpOyAgLyogRW5hYmxlIHRoZSBib2FyZHMgQlVTIGRyaXZlcnMuICovCisgIH0KKworICBpZiAoICEoYWljN3h4eF9ub19yZXNldCkgKQorICB7CisgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pCisgICAgeworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoc2NzaSVkKSBSZXNldHRpbmcgY2hhbm5lbCBCXG4iLCBwLT5ob3N0X25vKTsKKyAgICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgU0JMS0NUTCkgfCBTRUxCVVNCLCBTQkxLQ1RMKTsKKyAgICAgIGFpYzd4eHhfcmVzZXRfY3VycmVudF9idXMocCk7CisgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNCTEtDVEwpICYgflNFTEJVU0IsIFNCTEtDVEwpOworICAgIH0KKyAgICAvKiBSZXNldCBTQ1NJIGJ1cyBBLiAqLworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgICB7ICAvKiBJbiBjYXNlIHdlIGFyZSBhIDM5NDAsIDM5ODUsIG9yIDc4OTUsIHByaW50IHRoZSByaWdodCBjaGFubmVsICovCisgICAgICBjaGFyICpjaGFubmVsID0gIiI7CisgICAgICBpZiAocC0+ZmxhZ3MgJiBBSENfTVVMVElfQ0hBTk5FTCkKKyAgICAgIHsKKyAgICAgICAgY2hhbm5lbCA9ICIgQSI7CisgICAgICAgIGlmIChwLT5mbGFncyAmIChBSENfQ0hOTEJ8QUhDX0NITkxDKSkKKyAgICAgICAgICBjaGFubmVsID0gKHAtPmZsYWdzICYgQUhDX0NITkxCKSA/ICIgQiIgOiAiIEMiOworICAgICAgfQorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgUmVzZXR0aW5nIGNoYW5uZWwlc1xuIiwgcC0+aG9zdF9ubywgY2hhbm5lbCk7CisgICAgfQorICAgIAorICAgIGFpYzd4eHhfcmVzZXRfY3VycmVudF9idXMocCk7CisKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoIXJlc2V0X2RlbGF5KQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIihzY3NpJWQpIE5vdCByZXNldHRpbmcgU0NTSSBidXMuICBOb3RlOiBEb24ndCB1c2UgIgorICAgICAgICAgICAgICJ0aGUgbm9fcmVzZXRcbiIsIHAtPmhvc3Rfbm8pOworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKHNjc2klZCkgb3B0aW9uIHVubGVzcyB5b3UgaGF2ZSBhIHZlcmlmaWFibGUgbmVlZCAiCisgICAgICAgICAgICAgImZvciBpdC5cbiIsIHAtPmhvc3Rfbm8pOworICAgIH0KKyAgfQorICAKKyAgLyoKKyAgICogUmVnaXN0ZXIgSVJRIHdpdGggdGhlIGtlcm5lbC4gIE9ubHkgYWxsb3cgc2hhcmluZyBJUlFzIHdpdGgKKyAgICogUENJIGRldmljZXMuCisgICAqLworICBpZiAoIShwLT5jaGlwICYgQUhDX1BDSSkpCisgIHsKKyAgICByZXN1bHQgPSAocmVxdWVzdF9pcnEocC0+aXJxLCBkb19haWM3eHh4X2lzciwgMCwgImFpYzd4eHgiLCBwKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVzdWx0ID0gKHJlcXVlc3RfaXJxKHAtPmlycSwgZG9fYWljN3h4eF9pc3IsIFNBX1NISVJRLAorICAgICAgICAgICAgICAiYWljN3h4eCIsIHApKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICB7CisgICAgICByZXN1bHQgPSAocmVxdWVzdF9pcnEocC0+aXJxLCBkb19haWM3eHh4X2lzciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisgICAgICAgICAgICAgICJhaWM3eHh4IiwgcCkpOworICAgIH0KKyAgfQorICBpZiAocmVzdWx0IDwgMCkKKyAgeworICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIihzY3NpJWQpIENvdWxkbid0IHJlZ2lzdGVyIElSUSAlZCwgaWdub3JpbmcgIgorICAgICAgICAgICAiY29udHJvbGxlci5cbiIsIHAtPmhvc3Rfbm8sIHAtPmlycSk7CisgICAgYWljX291dGIocCwgMCwgU0lNT0RFMSk7CisgICAgcC0+aXJxID0gMDsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgaWYoYWljX2luYihwLCBJTlRTVEFUKSAmIElOVF9QRU5EKQorICAgIHByaW50ayhJTkZPX0xFQUQgInNwdXJpb3VzIGludGVycnVwdCBkdXJpbmcgY29uZmlndXJhdGlvbiwgY2xlYXJlZC5cbiIsCisgICAgICBwLT5ob3N0X25vLCAtMSwgLTEgLCAtMSk7CisgIGFpYzd4eHhfY2xlYXJfaW50c3RhdChwKTsKKworICB1bnBhdXNlX3NlcXVlbmNlcihwLCAvKiB1bnBhdXNlX2Fsd2F5cyAqLyBUUlVFKTsKKworICByZXR1cm4gKGZvdW5kKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2NoaXBfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUGVyZm9ybSBhIGNoaXAgcmVzZXQgb24gdGhlIGFpYzd4eHggU0NTSSBjb250cm9sbGVyLiAgVGhlIGNvbnRyb2xsZXIKKyAqICAgaXMgcGF1c2VkIHVwb24gcmV0dXJuLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X2NoaXBfcmVzZXQoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgdW5zaWduZWQgY2hhciBzYmxrY3RsOworICBpbnQgd2FpdDsKKworICAvKgorICAgKiBGb3Igc29tZSAyNzR4IGJvYXJkcywgd2UgbXVzdCBjbGVhciB0aGUgQ0hJUFJTVCBiaXQgYW5kIHBhdXNlCisgICAqIHRoZSBzZXF1ZW5jZXIuIEZvciBzb21lIHJlYXNvbiwgdGhpcyBtYWtlcyB0aGUgZHJpdmVyIHdvcmsuCisgICAqLworICBhaWNfb3V0YihwLCBQQVVTRSB8IENISVBSU1QsIEhDTlRSTCk7CisKKyAgLyoKKyAgICogSW4gdGhlIGZ1dHVyZSwgd2UgbWF5IGNhbGwgdGhpcyBmdW5jdGlvbiBhcyBhIGxhc3QgcmVzb3J0IGZvcgorICAgKiBlcnJvciBoYW5kbGluZy4gIExldCdzIGJlIG5pY2UgYW5kIG5vdCBkbyBhbnkgdW5uZWNlc3NhcnkgZGVsYXlzLgorICAgKi8KKyAgd2FpdCA9IDEwMDA7ICAvKiAxIG1zZWMgKDEwMDAgKiAxIG1zZWMpICovCisgIHdoaWxlICgtLXdhaXQgJiYgIShhaWNfaW5iKHAsIEhDTlRSTCkgJiBDSElQUlNUQUNLKSkKKyAgeworICAgIHVkZWxheSgxKTsgIC8qIDEgdXNlYyAqLworICB9CisKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworCisgIHNibGtjdGwgPSBhaWNfaW5iKHAsIFNCTEtDVEwpICYgKFNFTEJVU0J8U0VMV0lERSk7CisgIGlmIChwLT5jaGlwICYgQUhDX1BDSSkKKyAgICBzYmxrY3RsICY9IH5TRUxCVVNCOworICBzd2l0Y2goIHNibGtjdGwgKQorICB7CisgICAgY2FzZSAwOiAgLyogbm9ybWFsIG5hcnJvdyBjYXJkICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAvKiBXaWRlIGNhcmQgKi8KKyAgICAgIHAtPmZlYXR1cmVzIHw9IEFIQ19XSURFOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgLyogVHdpbiBjYXJkICovCisgICAgICBwLT5mZWF0dXJlcyB8PSBBSENfVFdJTjsKKyAgICAgIHAtPmZsYWdzIHw9IEFIQ19NVUxUSV9DSEFOTkVMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogLyogaG1tbS4uLndlIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzICovCisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3eHh4OiBVbnN1cHBvcnRlZCBhZGFwdGVyIHR5cGUgJWQsIGlnbm9yaW5nLlxuIiwKKyAgICAgICAgYWljX2luYihwLCBTQkxLQ1RMKSAmIDB4MGEpOworICAgICAgcmV0dXJuKC0xKTsKKyAgfQorICByZXR1cm4oMCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9hbGxvYworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGhvc3Qgc3RydWN0dXJlLiAgUmV0dXJucyBOVUxMIHVwb24gZXJyb3IKKyAqICAgYW5kIGEgcG9pbnRlciB0byBhIGFpYzd4eHhfaG9zdCBzdHJ1Y3QgdXBvbiBzdWNjZXNzLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGFpYzd4eHhfaG9zdCAqCithaWM3eHh4X2FsbG9jKFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0LCBzdHJ1Y3QgYWljN3h4eF9ob3N0ICp0ZW1wKQoreworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwID0gTlVMTDsKKyAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworICAvKgorICAgKiBBbGxvY2F0ZSBhIHN0b3JhZ2UgYXJlYSBieSByZWdpc3RlcmluZyB1cyB3aXRoIHRoZSBtaWQtbGV2ZWwKKyAgICogU0NTSSBsYXllci4KKyAgICovCisgIGhvc3QgPSBzY3NpX3JlZ2lzdGVyKHNodCwgc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2hvc3QpKTsKKworICBpZiAoaG9zdCAhPSBOVUxMKQorICB7CisgICAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIGhvc3QtPmhvc3RkYXRhOworICAgIG1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IGFpYzd4eHhfaG9zdCkpOworICAgICpwID0gKnRlbXA7CisgICAgcC0+aG9zdCA9IGhvc3Q7CisKKyAgICBwLT5zY2JfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHNjYl9kYXRhX3R5cGUpLCBHRlBfQVRPTUlDKTsKKyAgICBpZiAocC0+c2NiX2RhdGEgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZW1zZXQocC0+c2NiX2RhdGEsIDAsIHNpemVvZihzY2JfZGF0YV90eXBlKSk7CisgICAgICBzY2JxX2luaXQgKCZwLT5zY2JfZGF0YS0+ZnJlZV9zY2JzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBGb3Igc29tZSByZWFzb24gd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5LiAgRnJlZSB0aGUKKyAgICAgICAqIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBhaWM3eHh4X2hvc3Qgc3RydWN0LCBhbmQgcmV0dXJuIE5VTEwuCisgICAgICAgKi8KKyAgICAgIHJlbGVhc2VfcmVnaW9uKHAtPmJhc2UsIE1BWFJFRyAtIE1JTlJFRyk7CisgICAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisgICAgICByZXR1cm4oTlVMTCk7CisgICAgfQorICAgIHAtPmhvc3Rfbm8gPSBob3N0LT5ob3N0X25vOworICB9CisgIHNjc2lfc2V0X2RldmljZShob3N0LCAmcC0+cGRldi0+ZGV2KTsKKyAgcmV0dXJuIChwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2ZyZWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRnJlZXMgYW5kIHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbmNlIG9mCisgKiAgIHRoZSBkcml2ZXIgKHN0cnVjdCBhaWM3eHh4X2hvc3QgKikuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCithaWM3eHh4X2ZyZWUoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgaW50IGk7CisKKyAgLyoKKyAgICogRnJlZSB0aGUgYWxsb2NhdGVkIGhhcmR3YXJlIFNDQiBzcGFjZS4KKyAgICovCisgIGlmIChwLT5zY2JfZGF0YSAhPSBOVUxMKQorICB7CisgICAgc3RydWN0IGFpYzd4eHhfc2NiX2RtYSAqc2NiX2RtYSA9IE5VTEw7CisgICAgaWYgKHAtPnNjYl9kYXRhLT5oc2NicyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocC0+cGRldiwgcC0+c2NiX2RhdGEtPmhzY2JzX2RtYV9sZW4sCisJCQkgIHAtPnNjYl9kYXRhLT5oc2NicywgcC0+c2NiX2RhdGEtPmhzY2JzX2RtYSk7CisgICAgICBwLT5zY2JfZGF0YS0+aHNjYnMgPSBwLT5zY2JfZGF0YS0+aHNjYl9rbWFsbG9jX3B0ciA9IE5VTEw7CisgICAgfQorICAgIC8qCisgICAgICogRnJlZSB0aGUgZHJpdmVyIFNDQnMuICBUaGVzZSB3ZXJlIGFsbG9jYXRlZCBvbiBhbiBhcy1uZWVkCisgICAgICogYmFzaXMuICBXZSBhbGxvY2F0ZWQgdGhlc2UgaW4gZ3JvdXBzIGRlcGVuZGluZyBvbiBob3cgbWFueQorICAgICAqIHdlIGNvdWxkIGZpdCBpbnRvIGEgZ2l2ZW4gYW1vdW50IG9mIFJBTS4gIFRoZSB0YWlsIFNDQiBmb3IKKyAgICAgKiB0aGVzZSBhbGxvY2F0aW9ucyBoYXMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2VkIGFyZWEuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzOyBpKyspCisgICAgeworICAgICAgaWYgKHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbaV0tPnNjYl9kbWEgIT0gc2NiX2RtYSkKKyAgICAgIHsKKwlzY2JfZG1hID0gcC0+c2NiX2RhdGEtPnNjYl9hcnJheVtpXS0+c2NiX2RtYTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHAtPnBkZXYsIHNjYl9kbWEtPmRtYV9sZW4sCisJCQkgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpc2NiX2RtYS0+ZG1hX2FkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjYl9kbWEtPmRtYV9vZmZzZXQpLAorCQkJICAgIHNjYl9kbWEtPmRtYV9hZGRyZXNzKTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldLT5rbWFsbG9jX3B0ciAhPSBOVUxMKQorICAgICAgICBrZnJlZShwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldLT5rbWFsbG9jX3B0cik7CisgICAgICBwLT5zY2JfZGF0YS0+c2NiX2FycmF5W2ldID0gTlVMTDsKKyAgICB9CisgIAorICAgIC8qCisgICAgICogRnJlZSB0aGUgU0NCIGRhdGEgYXJlYS4KKyAgICAgKi8KKyAgICBrZnJlZShwLT5zY2JfZGF0YSk7CisgIH0KKworICBwY2lfZnJlZV9jb25zaXN0ZW50KHAtPnBkZXYsIDMqMjU2LCAodm9pZCAqKXAtPnVudGFnZ2VkX3NjYnMsIHAtPmZpZm9fZG1hKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2xvYWRfc2VlcHJvbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBMb2FkIHRoZSBzZWVwcm9tIGFuZCBjb25maWd1cmUgYWRhcHRlciBhbmQgdGFyZ2V0IHNldHRpbmdzLgorICogICBSZXR1cm5zIDEgaWYgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgYW5kIDAgb3RoZXJ3aXNlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9sb2FkX3NlZXByb20oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgdW5zaWduZWQgY2hhciAqc3hmcmN0bDEpCit7CisgIGludCBoYXZlX3NlZXByb20gPSAwOworICBpbnQgaSwgbWF4X3RhcmdldHMsIG1hc2s7CisgIHVuc2lnbmVkIGNoYXIgc2NzaXJhdGUsIHNjc2lfY29uZjsKKyAgdW5zaWduZWQgc2hvcnQgc2NhcnJheVsxMjhdOworICBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjID0gKHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqKSBzY2FycmF5OworCisgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX1BST0JFMikKKyAgeworICAgIHByaW50ayhLRVJOX0lORk8gImFpYzd4eHg6IExvYWRpbmcgc2VyaWFsIEVFUFJPTS4uLiIpOworICB9CisgIHN3aXRjaCAocC0+Y2hpcCkKKyAgeworICAgIGNhc2UgKEFIQ19BSUM3NzcwfEFIQ19FSVNBKTogIC8qIE5vbmUgb2YgdGhlc2UgYWRhcHRlcnMgaGF2ZSBzZWVwcm9tcy4gKi8KKyAgICAgIGlmIChhaWNfaW5iKHAsIFNDU0lDT05GKSAmIFRFUk1fRU5CKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfQTsKKyAgICAgIGlmICggKHAtPmZlYXR1cmVzICYgQUhDX1RXSU4pICYmIChhaWNfaW5iKHAsIFNDU0lDT05GICsgMSkgJiBURVJNX0VOQikgKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfQjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAoQUhDX0FJQzc3NzB8QUhDX1ZMKToKKyAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfMjg0eF9zZWVwcm9tKHAsIChzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKikgc2NhcnJheSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBoYXZlX3NlZXByb20gPSByZWFkX3NlZXByb20ocCwgKHAtPmZsYWdzICYgKEFIQ19DSE5MQnxBSENfQ0hOTEMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FycmF5LCBwLT5zY19zaXplLCBwLT5zY190eXBlKTsKKyAgICAgIGlmICghaGF2ZV9zZWVwcm9tKQorICAgICAgeworICAgICAgICBpZihwLT5zY190eXBlID09IEM0NikKKyAgICAgICAgICBoYXZlX3NlZXByb20gPSByZWFkX3NlZXByb20ocCwgKHAtPmZsYWdzICYgKEFIQ19DSE5MQnxBSENfQ0hOTEMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhcnJheSwgcC0+c2Nfc2l6ZSwgQzU2XzY2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfc2VlcHJvbShwLCAocC0+ZmxhZ3MgJiAoQUhDX0NITkxCfEFIQ19DSE5MQykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FycmF5LCBwLT5zY19zaXplLCBDNDYpOworICAgICAgfQorICAgICAgaWYgKCFoYXZlX3NlZXByb20pCisgICAgICB7CisgICAgICAgIHAtPnNjX3NpemUgPSAxMjg7CisgICAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfc2VlcHJvbShwLCA0KihwLT5mbGFncyAmIChBSENfQ0hOTEJ8QUhDX0NITkxDKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FycmF5LCBwLT5zY19zaXplLCBwLT5zY190eXBlKTsKKyAgICAgICAgaWYgKCFoYXZlX3NlZXByb20pCisgICAgICAgIHsKKyAgICAgICAgICBpZihwLT5zY190eXBlID09IEM0NikKKyAgICAgICAgICAgIGhhdmVfc2VlcHJvbSA9IHJlYWRfc2VlcHJvbShwLCA0KihwLT5mbGFncyAmIChBSENfQ0hOTEJ8QUhDX0NITkxDKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhcnJheSwgcC0+c2Nfc2l6ZSwgQzU2XzY2KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBoYXZlX3NlZXByb20gPSByZWFkX3NlZXByb20ocCwgNCoocC0+ZmxhZ3MgJiAoQUhDX0NITkxCfEFIQ19DSE5MQykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYXJyYXksIHAtPnNjX3NpemUsIEM0Nik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFoYXZlX3NlZXByb20pCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKCJcbmFpYzd4eHg6IE5vIFNFRVBST00gYXZhaWxhYmxlLlxuIik7CisgICAgfQorICAgIHAtPmZsYWdzIHw9IEFIQ19ORVdFRVBST01fRk1UOworICAgIGlmIChhaWNfaW5iKHAsIFNDU0lTRVEpID09IDApCisgICAgeworICAgICAgcC0+ZmxhZ3MgfD0gQUhDX1VTRURFRkFVTFRTOworICAgICAgcC0+ZmxhZ3MgJj0gfkFIQ19CSU9TX0VOQUJMRUQ7CisgICAgICBwLT5zY3NpX2lkID0gcC0+c2NzaV9pZF9iID0gNzsKKyAgICAgICpzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICB7CisgICAgICAgIHByaW50aygiYWljN3h4eDogVXNpbmcgZGVmYXVsdCB2YWx1ZXMuXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKCJhaWM3eHh4OiBVc2luZyBsZWZ0b3ZlciBCSU9TIHZhbHVlcy5cbiIpOworICAgIH0KKyAgICBpZiAoICgocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spID09IEFIQ19QQ0kpICYmICgqc3hmcmN0bDEgJiBTVFBXRU4pICkKKyAgICB7CisgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfTE9XIHwgQUhDX1RFUk1fRU5CX1NFX0hJR0g7CisgICAgICBzYy0+YWRhcHRlcl9jb250cm9sICY9IH5DRkFVVE9URVJNOworICAgICAgc2MtPmFkYXB0ZXJfY29udHJvbCB8PSBDRlNURVJNIHwgQ0ZXU1RFUk0gfCBDRkxWRFNURVJNOworICAgIH0KKyAgICBpZiAoYWljN3h4eF9leHRlbmRlZCkKKyAgICAgIHAtPmZsYWdzIHw9IChBSENfRVhURU5EX1RSQU5TX0EgfCBBSENfRVhURU5EX1RSQU5TX0IpOworICAgIGVsc2UKKyAgICAgIHAtPmZsYWdzICY9IH4oQUhDX0VYVEVORF9UUkFOU19BIHwgQUhDX0VYVEVORF9UUkFOU19CKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKCJkb25lXG4iKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdGUgdGhpbmdzIGluIG91ciBmbGFncworICAgICAqLworICAgIHAtPmZsYWdzIHw9IEFIQ19TRUVQUk9NX0ZPVU5EOworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmdzIGluIHN4ZnJjdGwxIHRvIG1hdGNoIHRoZSB0ZXJtaW5hdGlvbiBzZXR0aW5ncy4KKyAgICAgKi8KKyAgICAqc3hmcmN0bDEgPSAwOworCisgICAgLyoKKyAgICAgKiBHZXQgb3VyIFNDU0kgSUQgZnJvbSB0aGUgU0VFUFJPTSBzZXR0aW5nLi4uCisgICAgICovCisgICAgcC0+c2NzaV9pZCA9IChzYy0+YnJ0aW1lX2lkICYgQ0ZTQ1NJSUQpOworCisgICAgLyoKKyAgICAgKiBGaXJzdCBwcm9jZXNzIHRoZSBzZXR0aW5ncyB0aGF0IGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgVkxCCisgICAgICogYW5kIFBDSSBhZGFwdGVyIHNlZXByb21zLgorICAgICAqLworICAgIGlmICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc3NzApCisgICAgeworICAgICAgLyogVkxCIGFkYXB0ZXIgc2VlcHJvbXMgKi8KKyAgICAgIGlmIChzYy0+Ymlvc19jb250cm9sICYgQ0YyODRYRVhURU5EKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfRVhURU5EX1RSQU5TX0E7CisKKyAgICAgIGlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0YyODRYU1RFUk0pCisgICAgICB7CisgICAgICAgICpzeGZyY3RsMSB8PSBTVFBXRU47CisgICAgICAgIHAtPmZsYWdzIHw9IEFIQ19URVJNX0VOQl9TRV9MT1cgfCBBSENfVEVSTV9FTkJfU0VfSElHSDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFBDSSBhZGFwdGVyIHNlZXByb21zICovCisgICAgICBpZiAoc2MtPmJpb3NfY29udHJvbCAmIENGRVhURU5EKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfRVhURU5EX1RSQU5TX0E7CisgICAgICBpZiAoc2MtPmJpb3NfY29udHJvbCAmIENGQklPU0VOKQorICAgICAgICBwLT5mbGFncyB8PSBBSENfQklPU19FTkFCTEVEOworICAgICAgZWxzZQorICAgICAgICBwLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsKKworICAgICAgaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNURVJNKQorICAgICAgeworICAgICAgICAqc3hmcmN0bDEgfD0gU1RQV0VOOworICAgICAgICBwLT5mbGFncyB8PSBBSENfVEVSTV9FTkJfU0VfTE9XIHwgQUhDX1RFUk1fRU5CX1NFX0hJR0g7CisgICAgICB9CisgICAgfQorICAgIG1lbWNweSgmcC0+c2MsIHNjLCBzaXplb2Yoc3RydWN0IHNlZXByb21fY29uZmlnKSk7CisgIH0KKworICBwLT5kaXNjZW5hYmxlID0gMDsKKworICAvKgorICAgKiBMaW1pdCB0byAxNiB0YXJnZXRzIGp1c3QgaW4gY2FzZS4gIFRoZSAyODQyIGZvciBvbmUgaXMga25vd24gdG8KKyAgICogYmxvdyB0aGUgbWF4X3RhcmdldHMgc2V0dGluZywgZnV0dXJlIGNhcmRzIG1pZ2h0IGFsc28uCisgICAqLworICBtYXhfdGFyZ2V0cyA9ICgocC0+ZmVhdHVyZXMgJiAoQUhDX1RXSU4gfCBBSENfV0lERSkpID8gMTYgOiA4KTsKKworICBpZiAoaGF2ZV9zZWVwcm9tKQorICB7CisgICAgZm9yIChpID0gMDsgaSA8IG1heF90YXJnZXRzOyBpKyspCisgICAgeworICAgICAgaWYoICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpICYmCisgICAgICAgICAgIShzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKSAmJgorICAgICAgICAgICAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGU1lOQ0hJU1VMVFJBKSkgfHwKKyAgICAgICAgICAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGTkVXVUxUUkFGT1JNQVQpICkKKyAgICAgIHsKKyAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX05FV0VFUFJPTV9GTVQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBtYXhfdGFyZ2V0czsgaSsrKQorICB7CisgICAgbWFzayA9ICgweDAxIDw8IGkpOworICAgIGlmICghaGF2ZV9zZWVwcm9tKQorICAgIHsKKyAgICAgIGlmIChhaWNfaW5iKHAsIFNDU0lTRVEpICE9IDApCisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE9LLi4udGhlIEJJT1Mgc2V0IHRoaW5ncyB1cCBhbmQgbGVmdCBiZWhpbmQgdGhlIHNldHRpbmdzIHdlIG5lZWQuCisgICAgICAgICAqIEp1c3QgbWFrZSBvdXIgc2MtPmRldmljZV9mbGFnc1tpXSBlbnRyeSBtYXRjaCB3aGF0IHRoZSBjYXJkIGhhcworICAgICAgICAgKiBzZXQgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICAgKi8KKwlwLT5kaXNjZW5hYmxlID0KKwkgIH4oYWljX2luYihwLCBESVNDX0RTQikgfCAoYWljX2luYihwLCBESVNDX0RTQiArIDEpIDw8IDgpICk7CisgICAgICAgIHAtPnVsdHJhZW5iID0KKyAgICAgICAgICAoYWljX2luYihwLCBVTFRSQV9FTkIpIHwgKGFpY19pbmIocCwgVUxUUkFfRU5CICsgMSkgPDwgOCkgKTsKKwlzYy0+ZGV2aWNlX2ZsYWdzW2ldID0gKHAtPmRpc2NlbmFibGUgJiBtYXNrKSA/IENGRElTQyA6IDA7CisgICAgICAgIGlmIChhaWNfaW5iKHAsIFRBUkdfU0NTSVJBVEUgKyBpKSAmIFdJREVYRkVSKQorICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gQ0ZXSURFQjsKKyAgICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWNfaW5iKHAsIFRBUkdfT0ZGU0VUICsgaSkpCisgICAgICAgICAgeworICAgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRlNZTkNIOworICAgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSAoYWljX2luYihwLCBUQVJHX1NDU0lSQVRFICsgaSkgJiAweDA3KTsKKyAgICAgICAgICAgIGlmICggKGFpY19pbmIocCwgVEFSR19TQ1NJUkFURSArIGkpICYgMHgxOCkgPT0gMHgxOCApCisgICAgICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gQ0ZTWU5DSElTVUxUUkE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWNfaW5iKHAsIFRBUkdfU0NTSVJBVEUgKyBpKSAmIH5XSURFWEZFUikKKyAgICAgICAgICB7CisgICAgICAgICAgICBzYy0+ZGV2aWNlX2ZsYWdzW2ldIHw9IENGU1lOQ0g7CisgICAgICAgICAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgICAgICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gKChwLT51bHRyYWVuYiAmIG1hc2spID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTWU5DSElTVUxUUkEgOiAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXNzdW1lIHRoZSBCSU9TIGhhcyBOT1QgYmVlbiBydW4gb24gdGhpcyBjYXJkIGFuZCBub3RoaW5nIGJldHdlZW4KKyAgICAgICAgICogdGhlIGNhcmQgYW5kIHRoZSBkZXZpY2VzIGlzIGNvbmZpZ3VyZWQgeWV0LgorICAgICAgICAgKi8KKyAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSA9IENGRElTQzsKKyAgICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpCisgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRldJREVCOworICAgICAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEzKQorICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gMjsKKyAgICAgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gMzsKKyAgICAgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEpCisgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRlNZTkNISVNVTFRSQTsKKyAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSB8PSBDRlNZTkNIOworICAgICAgICBhaWNfb3V0YihwLCAwLCBUQVJHX1NDU0lSQVRFICsgaSk7CisgICAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgYWljX291dGIocCwgMCwgVEFSR19PRkZTRVQgKyBpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRkRJU0MpCisgICAgeworICAgICAgcC0+ZGlzY2VuYWJsZSB8PSBtYXNrOworICAgIH0KKyAgICBpZiAocC0+ZmxhZ3MgJiBBSENfTkVXRUVQUk9NX0ZNVCkKKyAgICB7CisgICAgICBpZiAoICEocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSApCisgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEkga25vdyBvZiB0d28gZGlmZmVyZW50IFVsdHJhIEJJT1NlcyB0aGF0IGRvIHRoaXMgZGlmZmVyZW50bHkuCisgICAgICAgICAqIE9uZSBvbiB0aGUgR2lnYWJ5dGUgNkJYVSBtYiB0aGF0IHdhbnRzIGZsYWdzW2ldICYgQ0ZYRkVSIHRvCisgICAgICAgICAqIGJlID09IHRvIDB4MDMgYW5kIFNZTkNISVNVTFRSQSB0byBiZSB0cnVlIHRvIG1lYW4gNDBNQnl0ZS9zCisgICAgICAgICAqIHdoaWxlIG9uIHRoZSBJQk0gTmV0ZmluaXR5IDUwMDAgdGhleSB3YW50IHRoZSBzYW1lIHRoaW5nCisgICAgICAgICAqIHRvIGJlIHNvbWV0aGluZyBlbHNlLCB3aGlsZSBmbGFnc1tpXSAmIENGWEZFUiA9PSAweDAzIGFuZAorICAgICAgICAgKiBTWU5DSElTVUxUUkEgZmFsc2Ugc2hvdWxkIGJlIDQwTUJ5dGUvcy4gIFNvLCB3ZSBzZXQgYm90aCB0bworICAgICAgICAgKiA0ME1CeXRlL3MgYW5kIHRoZSBsb3dlciBzcGVlZHMgYmUgZGFtbmVkLiAgUGVvcGxlIHdpbGwgaGF2ZQorICAgICAgICAgKiB0byBzZWxlY3QgYXJvdW5kIHRoZSBjb252ZXJzZWx5IG1hcHBlZCBsb3dlciBzcGVlZHMgaW4gb3JkZXIKKyAgICAgICAgICogdG8gc2VsZWN0IGxvd2VyIHNwZWVkcyBvbiB0aGVzZSBib2FyZHMuCisgICAgICAgICAqLworICAgICAgICBpZiAoIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZORVdVTFRSQUZPUk1BVCkgJiYKKyAgICAgICAgICAgICgoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgPT0gMHgwMykgKQorICAgICAgICB7CisgICAgICAgICAgc2MtPmRldmljZV9mbGFnc1tpXSAmPSB+Q0ZYRkVSOworICAgICAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gfD0gQ0ZTWU5DSElTVUxUUkE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkKKyAgICAgICAgeworICAgICAgICAgIHAtPnVsdHJhZW5iIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCAhKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRk5FV1VMVFJBRk9STUFUKSAmJgorICAgICAgICAgICAgICAgICAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAmJgorCQkgKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNISVNVTFRSQSkgKQorICAgICAgeworICAgICAgICBwLT51bHRyYWVuYiB8PSBtYXNrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzYy0+YWRhcHRlcl9jb250cm9sICYgQ0ZVTFRSQUVOKQorICAgIHsKKyAgICAgIHAtPnVsdHJhZW5iIHw9IG1hc2s7CisgICAgfQorICAgIGlmICggKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlNZTkNIKSA9PSAwKQorICAgIHsKKyAgICAgIHNjLT5kZXZpY2VfZmxhZ3NbaV0gJj0gfkNGWEZFUjsKKyAgICAgIHAtPnVsdHJhZW5iICY9IH5tYXNrOworICAgICAgcC0+dXNlcltpXS5vZmZzZXQgPSAwOworICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSAwOworICAgICAgcC0+dXNlcltpXS5vcHRpb25zID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpCisgICAgICB7CisgICAgICAgIHAtPnVzZXJbaV0ub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICAgIGlmKCAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgPCAweDAzICkKKyAgICAgICAgeworICAgICAgICAgIHNjc2lyYXRlID0gKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlhGRVIpOworICAgICAgICAgIHAtPnVzZXJbaV0ub3B0aW9ucyA9IE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc2NzaXJhdGUgPSAoc2MtPmRldmljZV9mbGFnc1tpXSAmIENGWEZFUikgfAorICAgICAgICAgICAgICAgICAgICAgKChwLT51bHRyYWVuYiAmIG1hc2spID8gMHgxOCA6IDB4MTApOworICAgICAgICAgIHAtPnVzZXJbaV0ub3B0aW9ucyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSBhaWM3eHh4X2ZpbmRfcGVyaW9kKHAsIHNjc2lyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1NZTkNSQVRFX1VMVFJBMyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICB7CisgICAgICAgIHAtPnVzZXJbaV0ub2Zmc2V0ID0gTUFYX09GRlNFVF9VTFRSQTI7CisgICAgICAgIHNjc2lyYXRlID0gKHNjLT5kZXZpY2VfZmxhZ3NbaV0gJiBDRlhGRVIpIHwKKyAgICAgICAgICAgICAgICAgICAoKHAtPnVsdHJhZW5iICYgbWFzaykgPyAweDE4IDogMHgxMCk7CisgICAgICAgIHAtPnVzZXJbaV0ub3B0aW9ucyA9IDA7CisgICAgICAgIHAtPnVzZXJbaV0ucGVyaW9kID0gYWljN3h4eF9maW5kX3BlcmlvZChwLCBzY3NpcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19TWU5DUkFURV9VTFRSQTIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzY3NpcmF0ZSA9IChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZYRkVSKSA8PCA0OworICAgICAgICBwLT51c2VyW2ldLm9wdGlvbnMgPSAwOworICAgICAgICBwLT51c2VyW2ldLm9mZnNldCA9IE1BWF9PRkZTRVRfOEJJVDsKKyAgICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBKQorICAgICAgICB7CisgICAgICAgICAgc2hvcnQgdWx0cmFlbmI7CisgICAgICAgICAgdWx0cmFlbmIgPSBhaWNfaW5iKHAsIFVMVFJBX0VOQikgfAorICAgICAgICAgICAgKGFpY19pbmIocCwgVUxUUkFfRU5CICsgMSkgPDwgOCk7CisgICAgICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSBhaWM3eHh4X2ZpbmRfcGVyaW9kKHAsIHNjc2lyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAtPnVsdHJhZW5iICYgbWFzaykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhDX1NZTkNSQVRFX1VMVFJBIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIQ19TWU5DUkFURV9GQVNUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcC0+dXNlcltpXS5wZXJpb2QgPSBhaWM3eHh4X2ZpbmRfcGVyaW9kKHAsIHNjc2lyYXRlLAorCQkJICAJCSAgQUhDX1NZTkNSQVRFX0ZBU1QpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIChzYy0+ZGV2aWNlX2ZsYWdzW2ldICYgQ0ZXSURFQikgJiYgKHAtPmZlYXR1cmVzICYgQUhDX1dJREUpICkKKyAgICB7CisgICAgICBwLT51c2VyW2ldLndpZHRoID0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwLT51c2VyW2ldLndpZHRoID0gTVNHX0VYVF9XRFRSX0JVU184X0JJVDsKKyAgICB9CisgIH0KKyAgYWljX291dGIocCwgfihwLT5kaXNjZW5hYmxlICYgMHhGRiksIERJU0NfRFNCKTsKKyAgYWljX291dGIocCwgfigocC0+ZGlzY2VuYWJsZSA+PiA4KSAmIDB4RkYpLCBESVNDX0RTQiArIDEpOworCisgIC8qCisgICAqIFdlIHNldCB0aGUgcC0+dWx0cmFlbmIgZnJvbSB0aGUgU0VFUFJPTSB0byBiZWdpbiB3aXRoLCBidXQgbm93IHdlIG1ha2UKKyAgICogaXQgbWF0Y2ggd2hhdCBpcyBhbHJlYWR5IGRvd24gaW4gdGhlIGNhcmQuICBJZiB3ZSBhcmUgZG9pbmcgYSByZXNldAorICAgKiBvbiB0aGUgY2FyZCB0aGVuIHRoaXMgd2lsbCBnZXQgcHV0IGJhY2sgdG8gYSBkZWZhdWx0IHN0YXRlIGFueXdheS4KKyAgICogVGhpcyBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gcHJlLWVtcHRpdmVseSBuZWdvdGlhdGUgd2hlbiB1c2luZyB0aGUKKyAgICogbm9fcmVzZXQgb3B0aW9uLgorICAgKi8KKyAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBKQorICAgIHAtPnVsdHJhZW5iID0gYWljX2luYihwLCBVTFRSQV9FTkIpIHwgKGFpY19pbmIocCwgVUxUUkFfRU5CICsgMSkgPDwgOCk7CisKKyAgCisgIHNjc2lfY29uZiA9IChwLT5zY3NpX2lkICYgSFNDU0lJRCk7CisKKyAgaWYoaGF2ZV9zZWVwcm9tKQorICB7CisgICAgcC0+YWRhcHRlcl9jb250cm9sID0gc2MtPmFkYXB0ZXJfY29udHJvbDsKKyAgICBwLT5iaW9zX2NvbnRyb2wgPSBzYy0+Ymlvc19jb250cm9sOworCisgICAgc3dpdGNoIChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKQorICAgIHsKKyAgICAgIGNhc2UgQUhDX0FJQzc4OTU6CisgICAgICBjYXNlIEFIQ19BSUM3ODk2OgorICAgICAgY2FzZSBBSENfQUlDNzg5OToKKyAgICAgICAgaWYgKHAtPmFkYXB0ZXJfY29udHJvbCAmIENGQlBSSU1BUlkpCisgICAgICAgICAgcC0+ZmxhZ3MgfD0gQUhDX0NIQU5ORUxfQl9QUklNQVJZOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHNjLT5hZGFwdGVyX2NvbnRyb2wgJiBDRlNQQVJJVFkpCisgICAgICBzY3NpX2NvbmYgfD0gRU5TUENISzsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzY3NpX2NvbmYgfD0gRU5TUENISyB8IFJFU0VUX1NDU0k7CisgIH0KKworICAvKgorICAgKiBPbmx5IHNldCB0aGUgU0NTSUNPTkYgYW5kIFNDU0lDT05GICsgMSByZWdpc3RlcnMgaWYgd2UgYXJlIGEgUENJIGNhcmQuCisgICAqIFRoZSAyODQyIGFuZCAyNzQyIGNhcmRzIGFscmVhZHkgaGF2ZSB0aGVzZSByZWdpc3RlcnMgc2V0IGFuZCB3ZSBkb24ndAorICAgKiB3YW50IHRvIG11Y2sgd2l0aCB0aGVtIHNpbmNlIHdlIGRvbid0IHNldCBhbGwgdGhlIGJpdHMgdGhleSBkby4KKyAgICovCisgIGlmICggKHAtPmNoaXAgJiB+QUhDX0NISVBJRF9NQVNLKSA9PSBBSENfUENJICkKKyAgeworICAgIC8qIFNldCB0aGUgaG9zdCBJRCAqLworICAgIGFpY19vdXRiKHAsIHNjc2lfY29uZiwgU0NTSUNPTkYpOworICAgIC8qIEluIGNhc2Ugd2UgYXJlIGEgd2lkZSBjYXJkICovCisgICAgYWljX291dGIocCwgcC0+c2NzaV9pZCwgU0NTSUNPTkYgKyAxKTsKKyAgfQorfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfY29uZmlndXJlX2J1Z3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGFrZSB0aGUgY2FyZCBwYXNzZWQgaW4gYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgYnVnIGZsYWdzIGJhc2VkIHVwb24KKyAqICAgdGhlIGNhcmQgbW9kZWwuICBBbHNvIG1ha2UgYW55IGNoYW5nZXMgbmVlZGVkIHRvIGRldmljZSByZWdpc3RlcnMgb3IKKyAqICAgUENJIHJlZ2lzdGVycyB3aGlsZSB3ZSBhcmUgaGVyZS4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfY29uZmlndXJlX2J1Z3Moc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgdW5zaWduZWQgc2hvcnQgdG1wX3dvcmQ7CisgCisgIHN3aXRjaChwLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKQorICB7CisgICAgY2FzZSBBSENfQUlDNzg2MDoKKyAgICAgIHAtPmJ1Z3MgfD0gQUhDX0JVR19QQ0lfMl8xX1JFVFJZOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBBSENfQUlDNzg1MDoKKyAgICBjYXNlIEFIQ19BSUM3ODcwOgorICAgICAgcC0+YnVncyB8PSBBSENfQlVHX1RNT0RFX1dJREVPREQgfCBBSENfQlVHX0NBQ0hFVEhFTiB8IEFIQ19CVUdfUENJX01XSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4ODA6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfVE1PREVfV0lERU9ERCB8IEFIQ19CVUdfUENJXzJfMV9SRVRSWSB8CisgICAgICAgICAgICAgICAgIEFIQ19CVUdfQ0FDSEVUSEVOIHwgQUhDX0JVR19QQ0lfTVdJOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBSENfQUlDNzg5MDoKKyAgICAgIHAtPmJ1Z3MgfD0gQUhDX0JVR19BVVRPRkxVU0ggfCBBSENfQlVHX0NBQ0hFVEhFTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4OTI6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfU0NCQ0hBTl9VUExPQUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFIQ19BSUM3ODk1OgorICAgICAgcC0+YnVncyB8PSBBSENfQlVHX1RNT0RFX1dJREVPREQgfCBBSENfQlVHX1BDSV8yXzFfUkVUUlkgfAorICAgICAgICAgICAgICAgICBBSENfQlVHX0NBQ0hFVEhFTiB8IEFIQ19CVUdfUENJX01XSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfQ0FDSEVUSEVOX0RJUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0FJQzc4OTk6CisgICAgICBwLT5idWdzIHw9IEFIQ19CVUdfU0NCQ0hBTl9VUExPQUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgYnJlYWs7CisgIH0KKworICAvKgorICAgKiBOb3cgaGFuZGxlIHRoZSBidWdzIHRoYXQgcmVxdWlyZSBQQ0kgcmVnaXN0ZXIgb3IgY2FyZCByZWdpc3RlciB0d2Vha3MKKyAgICovCisgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHAtPnBkZXYsIFBDSV9DT01NQU5ELCAmdG1wX3dvcmQpOworICBpZihwLT5idWdzICYgQUhDX0JVR19QQ0lfTVdJKQorICB7CisgICAgdG1wX3dvcmQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisgIH0KKyAgZWxzZQorICB7CisgICAgdG1wX3dvcmQgfD0gUENJX0NPTU1BTkRfSU5WQUxJREFURTsKKyAgfQorICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocC0+cGRldiwgUENJX0NPTU1BTkQsIHRtcF93b3JkKTsKKworICBpZihwLT5idWdzICYgQUhDX0JVR19DQUNIRVRIRU4pCisgIHsKKyAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIERTQ09NTUFORDApICYgfkNBQ0hFVEhFTiwgRFNDT01NQU5EMCk7CisgIH0KKyAgZWxzZSBpZiAocC0+YnVncyAmIEFIQ19CVUdfQ0FDSEVUSEVOX0RJUykKKyAgeworICAgIGFpY19vdXRiKHAsIGFpY19pbmIocCwgRFNDT01NQU5EMCkgfCBDQUNIRVRIRU4sIERTQ09NTUFORDApOworICB9CisKKyAgcmV0dXJuOworfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9kZXRlY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVHJ5IHRvIGRldGVjdCBhbmQgcmVnaXN0ZXIgYW4gQWRhcHRlYyA3NzcwIG9yIDc4NzAgU0NTSSBjb250cm9sbGVyLgorICoKKyAqIFhYWCAtIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBjYWxsZWQgYWljN3h4eF9wcm9iZSgpLiAgQSBzZXF1ZW5jZSBvZgorICogICAgICAgcHJvYmUoKSwgYXR0YWNoKCkvZGV0YWNoKCksIGFuZCBpbml0KCkgbWFrZXMgbW9yZSBzZW5zZSB0aGFuCisgKiAgICAgICBvbmUgZG8taXQtYWxsIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gKGFuZCBpZikgdGhlCisgKiAgICAgICBtaWQtbGV2ZWwgU0NTSSBjb2RlIGlzIG92ZXJoYXVsZWQuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGVtcGxhdGUpCit7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKnRlbXBfcCA9IE5VTEw7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKmN1cnJlbnRfcCA9IE5VTEw7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKmxpc3RfcCA9IE5VTEw7CisgIGludCBmb3VuZCA9IDA7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FscGhhX18pCisgIGFoY19mbGFnX3R5cGUgZmxhZ3MgPSAwOworICBpbnQgdHlwZTsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyIHN4ZnJjdGwxOworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKQorICB1bnNpZ25lZCBjaGFyIGhjbnRybCwgaG9zdGNvbmY7CisgIHVuc2lnbmVkIGludCBzbG90LCBiYXNlOworI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKKyAgLyoKKyAgICogSWYgd2UgYXJlIGNhbGxlZCBhcyBhIG1vZHVsZSwgdGhlIGFpYzd4eHggcG9pbnRlciBtYXkgbm90IGJlIG51bGwKKyAgICogYW5kIGl0IHdvdWxkIHBvaW50IHRvIG91ciBib290dXAgc3RyaW5nLCBqdXN0IGxpa2Ugb24gdGhlIGxpbG8KKyAgICogY29tbWFuZCBsaW5lLiAgSUYgbm90IE5VTEwsIHRoZW4gcHJvY2VzcyB0aGlzIGNvbmZpZyBzdHJpbmcgd2l0aAorICAgKiBhaWM3eHh4X3NldHVwCisgICAqLworICBpZihhaWM3eHh4KQorICAgIGFpYzd4eHhfc2V0dXAoYWljN3h4eCk7CisjZW5kaWYKKworICB0ZW1wbGF0ZS0+cHJvY19uYW1lID0gImFpYzd4eHgiOworICB0ZW1wbGF0ZS0+c2dfdGFibGVzaXplID0gQUlDN1hYWF9NQVhfU0c7CisKKworI2lmZGVmIENPTkZJR19QQ0kKKyAgLyoKKyAgICogUENJLWJ1cyBwcm9iZS4KKyAgICovCisgIHsKKyAgICBzdGF0aWMgc3RydWN0CisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgICAgICB2ZW5kb3JfaWQ7CisgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIGRldmljZV9pZDsKKyAgICAgIGFoY19jaGlwICAgICAgICAgICAgY2hpcDsKKyAgICAgIGFoY19mbGFnX3R5cGUgICAgICAgZmxhZ3M7CisgICAgICBhaGNfZmVhdHVyZSAgICAgICAgIGZlYXR1cmVzOworICAgICAgaW50ICAgICAgICAgICAgICAgICBib2FyZF9uYW1lX2luZGV4OworICAgICAgdW5zaWduZWQgc2hvcnQgICAgICBzZWVwcm9tX3NpemU7CisgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHNlZXByb21fdHlwZTsKKyAgICB9IGNvbnN0IGFpY19wZGV2c1tdID0geworICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4MTAsIEFIQ19OT05FLAorICAgICAgIEFIQ19GTk9ORSwgQUhDX0ZFTk9ORSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NTAsIEFIQ19BSUM3ODUwLAorICAgICAgIEFIQ19QQUdFU0NCUywgQUhDX0FJQzc4NTBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgIDUsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NTUsIEFIQ19BSUM3ODUwLAorICAgICAgIEFIQ19QQUdFU0NCUywgQUhDX0FJQzc4NTBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgIDYsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4MjEsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg2MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18zODYwLCBBSENfQUlDNzg2MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4NjBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfMzg2MDIsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg2MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ18zODYwMiwgQUhDX0FJQzc4NjAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODYwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NjAsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NT1RIRVJCT0FSRCwKKyAgICAgICBBSENfQUlDNzg2MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODYxLCBBSENfQUlDNzg2MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4NjBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MCwgQUhDX0FJQzc4NzAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NT1RIRVJCT0FSRCwKKyAgICAgICBBSENfQUlDNzg3MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODcxLCBBSENfQUlDNzg3MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg3MF9GRSwgICAgIDEwLAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODcyLCBBSENfQUlDNzg3MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVEIHwgQUhDX01VTFRJX0NIQU5ORUwsCisgICAgICAgQUhDX0FJQzc4NzBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwKKyAgICAgICAzMiwgQzU2XzY2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg3MywgQUhDX0FJQzc4NzAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODcwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4NzQsIEFIQ19BSUM3ODcwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19CSU9TX0VOQUJMRUQsIEFIQ19BSUM3ODcwX0ZFLCAgICAgMTMsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODAsIEFIQ19BSUM3ODgwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19CSU9TX0VOQUJMRUQgfCBBSENfTU9USEVSQk9BUkQsCisgICAgICAgQUhDX0FJQzc4ODBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MSwgQUhDX0FJQzc4ODAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCwgQUhDX0FJQzc4ODBfRkUsICAgICAxNSwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfNzg4MiwgQUhDX0FJQzc4ODAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODgwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQywgUENJX0RFVklDRV9JRF9BREFQVEVDXzc4ODMsIEFIQ19BSUM3ODgwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19CSU9TX0VOQUJMRUQgfCBBSENfTVVMVElfQ0hBTk5FTCwKKyAgICAgICBBSENfQUlDNzg4MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LAorICAgICAgIDMyLCBDNTZfNjYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg0LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg1LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg2LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg3LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSB8IEFIQ19ORVdfQVVUT1RFUk0sIDE5LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODg4LCBBSENfQUlDNzg4MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfQklPU19FTkFCTEVELCBBSENfQUlDNzg4MF9GRSwgICAgIDE4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMsIFBDSV9ERVZJQ0VfSURfQURBUFRFQ183ODk1LCBBSENfQUlDNzg5NSwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQgfCBBSENfTVVMVElfQ0hBTk5FTCwKKyAgICAgICBBSENfQUlDNzg5NV9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLAorICAgICAgIDMyLCBDNTZfNjYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTAsIEFIQ19BSUM3ODkwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg5MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTBCLCBBSENfQUlDNzg5MCwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4OTBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl8yOTMwVTIsIEFIQ19BSUM3ODkwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg5MF9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyLAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzI5NDBVMiwgQUhDX0FJQzc4OTAsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODkwX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5NiwgQUhDX0FJQzc4OTYsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVEIHwgQUhDX01VTFRJX0NIQU5ORUwsCisgICAgICAgQUhDX0FJQzc4OTZfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwKKyAgICAgICAzMiwgQzU2XzY2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl8zOTQwVTIsIEFIQ19BSUM3ODk2LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk2X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUsCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfMzk1MFUyRCwgQUhDX0FJQzc4OTYsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVEIHwgQUhDX01VTFRJX0NIQU5ORUwsCisgICAgICAgQUhDX0FJQzc4OTZfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKKyAgICAgICAzMiwgQzU2XzY2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDLCBQQ0lfREVWSUNFX0lEX0FEQVBURUNfMTQ4MEEsIEFIQ19BSUM3ODYwLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19OT19TVFBXRU4sCisgICAgICAgQUhDX0FJQzc4NjBfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyQSwgQUhDX0FJQzc4OTIsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODkyX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5MkIsIEFIQ19BSUM3ODkyLAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCwKKyAgICAgICBBSENfQUlDNzg5Ml9GRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAorICAgICAgIDMyLCBDNDYgfSwKKyAgICAgIHtQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyXzc4OTJELCBBSENfQUlDNzg5MiwKKyAgICAgICBBSENfUEFHRVNDQlMgfCBBSENfTkVXRUVQUk9NX0ZNVCB8IEFIQ19CSU9TX0VOQUJMRUQsCisgICAgICAgQUhDX0FJQzc4OTJfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKKyAgICAgICAzMiwgQzQ2IH0sCisgICAgICB7UENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl83ODkyUCwgQUhDX0FJQzc4OTIsCisgICAgICAgQUhDX1BBR0VTQ0JTIHwgQUhDX05FV0VFUFJPTV9GTVQgfCBBSENfQklPU19FTkFCTEVELAorICAgICAgIEFIQ19BSUM3ODkyX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCisgICAgICAgMzIsIEM0NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OUEsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OUIsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OUQsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgICAge1BDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfNzg5OVAsIEFIQ19BSUM3ODk5LAorICAgICAgIEFIQ19QQUdFU0NCUyB8IEFIQ19ORVdFRVBST01fRk1UIHwgQUhDX0JJT1NfRU5BQkxFRCB8IEFIQ19NVUxUSV9DSEFOTkVMLAorICAgICAgIEFIQ19BSUM3ODk5X0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCisgICAgICAgMzIsIEM1Nl82NiB9LAorICAgIH07CisKKyAgICB1bnNpZ25lZCBzaG9ydCBjb21tYW5kOworICAgIHVuc2lnbmVkIGludCAgZGV2Y29uZmlnLCBpLCBvbGR2ZXJib3NlOworICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpY19wZGV2cyk7IGkrKykKKyAgICB7CisgICAgICBwZGV2ID0gTlVMTDsKKyAgICAgIHdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShhaWNfcGRldnNbaV0udmVuZG9yX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpY19wZGV2c1tpXS5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQljb250aW51ZTsKKyAgICAgICAgaWYgKCBpID09IDAgKSAvKiBXZSBmb3VuZCBvbmUsIGJ1dCBpdCdzIHRoZSA3ODEwIFJBSUQgY29udC4gKi8KKyAgICAgICAgeworICAgICAgICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiAoVkVSQk9TRV9QUk9CRXxWRVJCT1NFX1BST0JFMikpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogVGhlIDc4MTAgUkFJRCBjb250cm9sbGVyIGlzIG5vdCAiCisgICAgICAgICAgICAgICJzdXBwb3J0ZWQgYnlcbiIpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgdGhpcyBkcml2ZXIsIHdlIGFyZSBpZ25vcmluZyBpdC5cbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKHRlbXBfcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2hvc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0FUT01JQykpICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgbWVtc2V0KHRlbXBfcCwgMCwgc2l6ZW9mKHN0cnVjdCBhaWM3eHh4X2hvc3QpKTsKKyAgICAgICAgICB0ZW1wX3AtPmNoaXAgPSBhaWNfcGRldnNbaV0uY2hpcCB8IEFIQ19QQ0k7CisgICAgICAgICAgdGVtcF9wLT5mbGFncyA9IGFpY19wZGV2c1tpXS5mbGFnczsKKyAgICAgICAgICB0ZW1wX3AtPmZlYXR1cmVzID0gYWljX3BkZXZzW2ldLmZlYXR1cmVzOworICAgICAgICAgIHRlbXBfcC0+Ym9hcmRfbmFtZV9pbmRleCA9IGFpY19wZGV2c1tpXS5ib2FyZF9uYW1lX2luZGV4OworICAgICAgICAgIHRlbXBfcC0+c2Nfc2l6ZSA9IGFpY19wZGV2c1tpXS5zZWVwcm9tX3NpemU7CisgICAgICAgICAgdGVtcF9wLT5zY190eXBlID0gYWljX3BkZXZzW2ldLnNlZXByb21fdHlwZTsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogUmVhZCBzdW5kcnkgaW5mb3JtYXRpb24gZnJvbSBQQ0kgQklPUy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB0ZW1wX3AtPmlycSA9IHBkZXYtPmlycTsKKyAgICAgICAgICB0ZW1wX3AtPnBkZXYgPSBwZGV2OworICAgICAgICAgIHRlbXBfcC0+cGNpX2J1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworICAgICAgICAgIHRlbXBfcC0+cGNpX2RldmljZV9mbiA9IHBkZXYtPmRldmZuOworICAgICAgICAgIHRlbXBfcC0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyAgICAgICAgICB0ZW1wX3AtPm1iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworICAgICAgICAgIGN1cnJlbnRfcCA9IGxpc3RfcDsKKwkgIHdoaWxlKGN1cnJlbnRfcCAmJiB0ZW1wX3ApCisJICB7CisJICAgIGlmICggKChjdXJyZW50X3AtPnBjaV9idXMgPT0gdGVtcF9wLT5wY2lfYnVzKSAmJgorCSAgICAgICAgICAoY3VycmVudF9wLT5wY2lfZGV2aWNlX2ZuID09IHRlbXBfcC0+cGNpX2RldmljZV9mbikpIHx8CisgICAgICAgICAgICAgICAgICh0ZW1wX3AtPmJhc2UgJiYgKGN1cnJlbnRfcC0+YmFzZSA9PSB0ZW1wX3AtPmJhc2UpKSB8fAorICAgICAgICAgICAgICAgICAodGVtcF9wLT5tYmFzZSAmJiAoY3VycmVudF9wLT5tYmFzZSA9PSB0ZW1wX3AtPm1iYXNlKSkgKQorCSAgICB7CisgICAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSBQQ0kgZW50cnksIHNraXAgaXQgKi8KKwkgICAgICBrZnJlZSh0ZW1wX3ApOworCSAgICAgIHRlbXBfcCA9IE5VTEw7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKwkgIH0KKyAgICAgICAgICBpZihwY2lfcmVxdWVzdF9yZWdpb25zKHRlbXBfcC0+cGRldiwgImFpYzd4eHgiKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IDwlcz4gYXQgUENJICVkLyVkLyVkXG4iLCAKKyAgICAgICAgICAgICAgYm9hcmRfbmFtZXNbYWljX3BkZXZzW2ldLmJvYXJkX25hbWVfaW5kZXhdLAorICAgICAgICAgICAgICB0ZW1wX3AtPnBjaV9idXMsCisgICAgICAgICAgICAgIFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbiksCisgICAgICAgICAgICAgIFBDSV9GVU5DKHRlbXBfcC0+cGNpX2RldmljZV9mbikpOworICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiBJL08gcG9ydHMgYWxyZWFkeSBpbiB1c2UsIGlnbm9yaW5nLlxuIik7CisgICAgICAgICAgICBrZnJlZSh0ZW1wX3ApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IFBDSSAlZC8lZFxuIiwgCisgICAgICAgICAgICAgIGJvYXJkX25hbWVzW2FpY19wZGV2c1tpXS5ib2FyZF9uYW1lX2luZGV4XSwKKyAgICAgICAgICAgICAgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorICAgICAgICAgICAgICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiYWljN3h4eDogSW5pdGlhbCBQQ0lfQ09NTUFORCB2YWx1ZSB3YXMgMHgleFxuIiwKKyAgICAgICAgICAgICAgKGludCljb21tYW5kKTsKKyAgICAgICAgICB9CisjaWZkZWYgQUlDN1hYWF9TVFJJQ1RfUENJX1NFVFVQCisgICAgICAgICAgY29tbWFuZCB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfUEFSSVRZIHwKKyAgICAgICAgICAgIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPOworI2Vsc2UKKyAgICAgICAgICBjb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPOworI2VuZGlmCisgICAgICAgICAgY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfSU5WQUxJREFURTsKKyAgICAgICAgICBpZiAoYWljN3h4eF9wY2lfcGFyaXR5ID09IDApCisgICAgICAgICAgICBjb21tYW5kICY9IH4oUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWSk7CisgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjb21tYW5kKTsKKyNpZmRlZiBBSUM3WFhYX1NUUklDVF9QQ0lfU0VUVVAKKyAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiBJbml0aWFsIERFVkNPTkZJRyB2YWx1ZSB3YXMgMHgleFxuIiwgZGV2Y29uZmlnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGV2Y29uZmlnIHw9IDB4ODAwMDAwNDA7CisgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBERVZDT05GSUcsIGRldmNvbmZpZyk7CisjZW5kaWYgLyogQUlDN1hYWF9TVFJJQ1RfUENJX1NFVFVQICovCisKKyAgICAgICAgICB0ZW1wX3AtPnVucGF1c2UgPSBJTlRFTjsKKyAgICAgICAgICB0ZW1wX3AtPnBhdXNlID0gdGVtcF9wLT51bnBhdXNlIHwgUEFVU0U7CisgICAgICAgICAgaWYgKCAoKHRlbXBfcC0+YmFzZSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICh0ZW1wX3AtPm1iYXNlID09IDApKSB8fAorICAgICAgICAgICAgICAgKHRlbXBfcC0+aXJxID09IDApICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IDwlcz4gYXQgUENJICVkLyVkLyVkXG4iLCAKKyAgICAgICAgICAgICAgYm9hcmRfbmFtZXNbYWljX3BkZXZzW2ldLmJvYXJkX25hbWVfaW5kZXhdLAorICAgICAgICAgICAgICB0ZW1wX3AtPnBjaV9idXMsCisgICAgICAgICAgICAgIFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbiksCisgICAgICAgICAgICAgIFBDSV9GVU5DKHRlbXBfcC0+cGNpX2RldmljZV9mbikpOworICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiBDb250cm9sbGVyIGRpc2FibGVkIGJ5IEJJT1MsIGlnbm9yaW5nLlxuIik7CisgICAgICAgICAgICBnb3RvIHNraXBfcGNpX2NvbnRyb2xsZXI7CisgICAgICAgICAgfQorCisjaWZkZWYgTU1BUElPCisgICAgICAgICAgaWYgKCAhKHRlbXBfcC0+YmFzZSkgfHwgISh0ZW1wX3AtPmZsYWdzICYgQUhDX01VTFRJX0NIQU5ORUwpIHx8CisgICAgICAgICAgICAgICAoKHRlbXBfcC0+Y2hpcCAhPSAoQUhDX0FJQzc4NzAgfCBBSENfUENJKSkgJiYKKyAgICAgICAgICAgICAgICAodGVtcF9wLT5jaGlwICE9IChBSENfQUlDNzg4MCB8IEFIQ19QQ0kpKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBfcC0+bWFkZHIgPSBpb3JlbWFwX25vY2FjaGUodGVtcF9wLT5tYmFzZSwgMjU2KTsKKyAgICAgICAgICAgIGlmKHRlbXBfcC0+bWFkZHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIFdlIG5lZWQgdG8gY2hlY2sgdGhlIEkvTyB3aXRoIHRoZSBNTUFQZWQgYWRkcmVzcy4gIFNvbWUgbWFjaGluZXMKKyAgICAgICAgICAgICAgICogc2ltcGx5IGZhaWwgdG8gd29yayB3aXRoIE1NQVBlZCBJL08gYW5kIGNlcnRhaW4gY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZihhaWNfaW5iKHRlbXBfcCwgSENOVFJMKSA9PSAweGZmKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBPSy4uLi4ud2UgZmFpbGVkIG91ciB0ZXN0Li4uLmdvIGJhY2sgdG8gcHJvZ3JhbW1lZCBJL08KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiA8JXM+IGF0IFBDSSAlZC8lZC8lZFxuIiwgCisgICAgICAgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICB0ZW1wX3AtPnBjaV9idXMsCisgICAgICAgICAgICAgICAgICBQQ0lfU0xPVCh0ZW1wX3AtPnBjaV9kZXZpY2VfZm4pLAorICAgICAgICAgICAgICAgICAgUENJX0ZVTkModGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogTU1BUGVkIEkvTyBmYWlsZWQsIHJldmVydGluZyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1lZCBJL08uXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKHRlbXBfcC0+bWFkZHIpOworICAgICAgICAgICAgICAgIHRlbXBfcC0+bWFkZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmKHRlbXBfcC0+YmFzZSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50aygiYWljN3h4eDogPCVzPiBhdCBQQ0kgJWQvJWQvJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+cGNpX2J1cywKKyAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSwKKyAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkModGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSk7CisgICAgICAgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IENvbnRyb2xsZXIgZGlzYWJsZWQgYnkgQklPUywgaWdub3JpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9wY2lfY29udHJvbGxlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgSEFWRSB0byBtYWtlIHN1cmUgdGhlIGZpcnN0IHBhdXNlX3NlcXVlbmNlcigpIGFuZCBhbGwgb3RoZXIKKyAgICAgICAgICAgKiBzdWJzZXF1ZW50IEkvTyB0aGF0IGlzbid0IFBDSSBjb25maWcgc3BhY2UgSS9PIHRha2VzIHBsYWNlCisgICAgICAgICAgICogYWZ0ZXIgdGhlIE1NQVBlZCBJL08gcmVnaW9uIGlzIGNvbmZpZ3VyZWQgYW5kIHRlc3RlZC4gIFRoZQorICAgICAgICAgICAqIHByb2JsZW0gaXMgdGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIHRoYXQgZG9lc24ndCBzdXBwb3J0CisgICAgICAgICAgICogcHJvZ3JhbW1lZCBJL08gYXQgYWxsLCBzbyB3ZSBoYXZlIHRvIGhhdmUgdGhlIE1NQVAgSS9PIHNldCB1cAorICAgICAgICAgICAqIGZvciB0aGlzIHBhdXNlIHRvIGV2ZW4gd29yayBvbiB0aG9zZSBtYWNoaW5lcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBwYXVzZV9zZXF1ZW5jZXIodGVtcF9wKTsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogQ2xlYXIgb3V0IGFueSBwZW5kaW5nIFBDSSBlcnJvciBzdGF0dXMgbWVzc2FnZXMuICBBbHNvIHNldAorICAgICAgICAgICAqIHZlcmJvc2UgdG8gMCBzbyB0aGF0IHdlIGRvbid0IGVtaXQgc3RyYW5nZSBQQ0kgZXJyb3IgbWVzc2FnZXMKKyAgICAgICAgICAgKiB3aGlsZSBjbGVhbmluZyBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzIGJpdHMuCisgICAgICAgICAgICovCisgICAgICAgICAgb2xkdmVyYm9zZSA9IGFpYzd4eHhfdmVyYm9zZTsKKyAgICAgICAgICBhaWM3eHh4X3ZlcmJvc2UgPSAwOworICAgICAgICAgIGFpYzd4eHhfcGNpX2ludHIodGVtcF9wKTsKKyAgICAgICAgICBhaWM3eHh4X3ZlcmJvc2UgPSBvbGR2ZXJib3NlOworCisgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAwOworCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBSZW1lbWJlciBob3cgdGhlIGNhcmQgd2FzIHNldHVwIGluIGNhc2UgdGhlcmUgaXMgbm8gc2VlcHJvbS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAodGVtcF9wLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpCisgICAgICAgICAgICB0ZW1wX3AtPnNjc2lfaWQgPSBhaWNfaW5iKHRlbXBfcCwgU0NTSUlEX1VMVFJBMikgJiBPSUQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVtcF9wLT5zY3NpX2lkID0gYWljX2luYih0ZW1wX3AsIFNDU0lJRCkgJiBPSUQ7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBHZXQgY3VycmVudCB0ZXJtaW5hdGlvbiBzZXR0aW5nCisgICAgICAgICAgICovCisgICAgICAgICAgc3hmcmN0bDEgPSBhaWNfaW5iKHRlbXBfcCwgU1hGUkNUTDEpOworCisgICAgICAgICAgaWYgKGFpYzd4eHhfY2hpcF9yZXNldCh0ZW1wX3ApID09IC0xKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wY2lfY29udHJvbGxlcjsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBWZXJ5IHF1aWNrbHkgcHV0IHRoZSB0ZXJtIHNldHRpbmcgYmFjayBpbnRvIHRoZSByZWdpc3RlciBzaW5jZQorICAgICAgICAgICAqIHRoZSBjaGlwIHJlc2V0IG1heSBjYXVzZSBvZGQgdGhpbmdzIHRvIGhhcHBlbi4gIFRoaXMgaXMgdG8ga2VlcAorICAgICAgICAgICAqIExWRCBidXNzZXMgd2l0aCBsb3RzIG9mIGRyaXZlcyBmcm9tIGRyYWluaW5nIHRoZSBwb3dlciBvdXQgb2YKKyAgICAgICAgICAgKiB0aGUgZGlmZnNlbnNlIGxpbmUgYmVmb3JlIHdlIGdldCBhcm91bmQgdG8gcnVubmluZyB0aGUKKyAgICAgICAgICAgKiBjb25maWd1cmVfdGVybWluYXRpb24oKSBmdW5jdGlvbi4gIEFsc28gcmVzdG9yZSB0aGUgU1RQV0xFVkVMCisgICAgICAgICAgICogYml0IG9mIERFVkNPTkZJRworICAgICAgICAgICAqLworICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgc3hmcmN0bDEsIFNYRlJDVEwxKTsKKyAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRlbXBfcC0+cGRldiwgREVWQ09ORklHLCBkZXZjb25maWcpOworICAgICAgICAgIHN4ZnJjdGwxICY9IFNUUFdFTjsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIENITkw/IGFzc2lnbm1lbnRzIGJlZm9yZSBsb2FkaW5nIHRoZSBTRUVQUk9NCisgICAgICAgICAgICogVGhlIDM5NDAgYW5kIDM5ODUgY2FyZHMgKG9yaWdpbmFsIHN0dWZmLCBub3QgYW55IG9mIHRoZSBsYXRlcgorICAgICAgICAgICAqIHN0dWZmKSBhcmUgNzg3MCBhbmQgNzg4MCBjbGFzcyBjaGlwcy4gIFRoZSBVbHRyYTIgc3R1ZmYgZmFsbHMKKyAgICAgICAgICAgKiB1bmRlciA3ODk2IGFuZCA3ODk3LiAgVGhlIDc4OTUgaXMgaW4gYSBjbGFzcyBieSBpdHNlbGYgOikKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2ggKHRlbXBfcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODcwOiAvKiAzODQwIC8gMzk4NSAqLworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg4MDogLyogMzg0MCBVVyAvIDM5ODUgVVcgKi8KKyAgICAgICAgICAgICAgaWYodGVtcF9wLT5mbGFncyAmIEFIQ19NVUxUSV9DSEFOTkVMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19DSE5MQjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NITkxCOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NITkxDOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NTogLyogNzg5NSAqLworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NjogLyogNzg5Ni83ICovCisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODk5OiAvKiA3ODk5ICovCisgICAgICAgICAgICAgIGlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NITkxCOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIFRoZSA3ODk1IGlzIHRoZSBvbmx5IGNoaXBzZXQgdGhhdCBzZXRzIHRoZSBTQ0JTSVpFMzIgcGFyYW0KKyAgICAgICAgICAgICAgICogaW4gdGhlIERFVkNPTkZJRyByZWdpc3Rlci4gIFRoZSBVbHRyYTIgY2hpcHNldHMgdXNlCisgICAgICAgICAgICAgICAqIHRoZSBEU0NPTU1BTkQwIHJlZ2lzdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoKHRlbXBfcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICAgICAgICBkZXZjb25maWcgfD0gU0NCU0laRTMyOworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCBkZXZjb25maWcpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMb2FkaW5nIG9mIHRoZSBTRUVQUk9NIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgd2UndmUgc2V0IHRoZSBmbGFncworICAgICAgICAgICAqIHRvIGluZGljYXRlIHBvc3NpYmxlIENITkxCIGFuZCBDSE5MQyBhc3NpZ21lbnRzLiAgT3RoZXJ3aXNlLAorICAgICAgICAgICAqIG9uIDM5NHggYW5kIDM5OHggY2FyZHMgd2UnbGwgZW5kIHVwIHJlYWRpbmcgdGhlIHdyb25nIHNldHRpbmdzCisgICAgICAgICAgICogZm9yIGNoYW5uZWxzIEIgYW5kIEMKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2ggKHRlbXBfcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODkyOgorICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5OToKKyAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCAwLCBTQ0FNQ1RMKTsKKyAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICogU3dpdGNoIHRvIHRoZSBhbHQgbW9kZSBvZiB0aGUgY2hpcC4uLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCBhaWNfaW5iKHRlbXBfcCwgU0ZVTkNUKSB8IEFMVF9NT0RFLCBTRlVOQ1QpOworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBTZXQgb3VyIG9wdGlvbnMuLi50aGUgbGFzdCB0d28gaXRlbXMgc2V0IG91ciBDUkMgYWZ0ZXIgeCBieXRlCisJICAgICAgICogY291bnQgaW4gdGFyZ2V0IG1vZGUuLi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgQVVUT19NU0dPVVRfREUgfCBESVNfTVNHSU5fRFVBTEVER0UsIE9QVElPTk1PREUpOworCSAgICAgIGFpY19vdXRiKHRlbXBfcCwgMHgwMCwgMHgwYik7CisJICAgICAgYWljX291dGIodGVtcF9wLCAweDEwLCAweDBhKTsKKyAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICogc3dpdGNoIGJhY2sgdG8gbm9ybWFsIG1vZGUuLi4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgYWljX2luYih0ZW1wX3AsIFNGVU5DVCkgJiB+QUxUX01PREUsIFNGVU5DVCk7CisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgQ1JDVkFMQ0hLRU4gfCBDUkNFTkRDSEtFTiB8IENSQ1JFUUNIS0VOIHwKKwkJCSAgICAgICBUQVJHQ1JDRU5ERU4gfCBUQVJHQ1JDQ05URU4sCisgICAgICAgICAgICAgICAgICAgICAgIENSQ0NPTlRST0wxKTsKKyAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCAoKGFpY19pbmIodGVtcF9wLCBEU0NPTU1BTkQwKSB8IFVTQ0JTSVpFMzIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBUkNLRU4gfCBDSU9QQVJDS0VOIHwgQ0FDSEVUSEVOKSAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5EUEFSQ0tFTiksIERTQ09NTUFORDApOworICAgICAgICAgICAgICBhaWM3eHh4X2xvYWRfc2VlcHJvbSh0ZW1wX3AsICZzeGZyY3RsMSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5MDoKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgMCwgU0NBTUNUTCk7CisgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgKGFpY19pbmIodGVtcF9wLCBEU0NPTU1BTkQwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFVEhFTiB8IE1QQVJDS0VOIHwgVVNDQlNJWkUzMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJT1BBUkNLRU4pICYgfkRQQVJDS0VOLCBEU0NPTU1BTkQwKTsKKyAgICAgICAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4NTA6CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODYwOgorICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBTZXQgdGhlIERTQ09NTUFORDAgcmVnaXN0ZXIgb24gdGhlc2UgY2FyZHMgZGlmZmVyZW50IGZyb20KKyAgICAgICAgICAgICAgICogb24gdGhlIDc4OXggY2FyZHMuICBBbHNvLCByZWFkIHRoZSBTRUVQUk9NIGFzIHdlbGwuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIChhaWNfaW5iKHRlbXBfcCwgRFNDT01NQU5EMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRVRIRU4gfCBNUEFSQ0tFTikgJiB+RFBBUkNLRU4sCisgICAgICAgICAgICAgICAgICAgICAgIERTQ09NTUFORDApOworICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4ODA6CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIENoZWNrIHRoZSByZXYgb2YgdGhlIGNoaXBzZXQgYmVmb3JlIHdlIGNoYW5nZSBEU0NPTU1BTkQwCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICAgICAgaWYgKChkZXZjb25maWcgJiAweGZmKSA+PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWljX291dGIodGVtcF9wLCAoYWljX2luYih0ZW1wX3AsIERTQ09NTUFORDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRVRIRU4gfCBNUEFSQ0tFTikgJiB+RFBBUkNLRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRFNDT01NQU5EMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgCisKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIGFuZCB0aGVuIHdlIG5lZWQgYW5vdGhlciBzd2l0Y2ggYmFzZWQgb24gdGhlIHR5cGUgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgKiBtYWtlIHN1cmUgdGhlIGNoYW5uZWwgQiBwcmltYXJ5IGZsYWcgaXMgc2V0IHByb3Blcmx5IG9uIDc4OTUKKyAgICAgICAgICAgKiBjb250cm9sbGVycy4uLi5BcnJyZ2dnZ2hoaCEhISAgV2UgYWxzbyBoYXZlIHRvIGNhdGNoIHRoZSBmYWN0CisgICAgICAgICAgICogdGhhdCB3aGVuIHlvdSBkaXNhYmxlIHRoZSBCSU9TIG9uIHRoZSA3ODk1IG9uIHRoZSBJbnRlbCBESzQ0MExYCisgICAgICAgICAgICogbW90aGVyYm9hcmQsIGFuZCBwb3NzaWJseSBvdGhlcnMsIGl0IG9ubHkgc2V0cyB0aGUgQklPUyBkaXNhYmxlZAorICAgICAgICAgICAqIGJpdCBvbiB0aGUgQSBjaGFubmVsLi4uSSB0aGluayBJJ20gc3RhcnRpbmcgdG8gbGVhbiB0b3dhcmRzCisgICAgICAgICAgICogZ29pbmcgcG9zdGFsLi4uLgorICAgICAgICAgICAqLworICAgICAgICAgIHN3aXRjaCh0ZW1wX3AtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NToKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODk5OgorICAgICAgICAgICAgICBjdXJyZW50X3AgPSBsaXN0X3A7CisgICAgICAgICAgICAgIHdoaWxlKGN1cnJlbnRfcCAhPSBOVUxMKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAoY3VycmVudF9wLT5wY2lfYnVzID09IHRlbXBfcC0+cGNpX2J1cykgJiYKKyAgICAgICAgICAgICAgICAgICAgIChQQ0lfU0xPVChjdXJyZW50X3AtPnBjaV9kZXZpY2VfZm4pID09CisgICAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICggUENJX0ZVTkMoY3VycmVudF9wLT5wY2lfZGV2aWNlX2ZuKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9wLT5mbGFncyB8PSAKKyAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9wLT5mbGFncyAmIEFIQ19DSEFOTkVMX0JfUFJJTUFSWSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgJj0gfihBSENfQklPU19FTkFCTEVEfEFIQ19VU0VERUZBVUxUUyk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0KKyAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9wLT5mbGFncyAmIChBSENfQklPU19FTkFCTEVEfEFIQ19VU0VERUZBVUxUUykpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3AtPmZsYWdzIHw9CisgICAgICAgICAgICAgICAgICAgICAgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfQ0hBTk5FTF9CX1BSSU1BUlkpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3AtPmZsYWdzICY9IH4oQUhDX0JJT1NfRU5BQkxFRHxBSENfVVNFREVGQVVMVFMpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3AtPmZsYWdzIHw9CisgICAgICAgICAgICAgICAgICAgICAgKHRlbXBfcC0+ZmxhZ3MgJiAoQUhDX0JJT1NfRU5BQkxFRHxBSENfVVNFREVGQVVMVFMpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBXZSBvbmx5IHN1cHBvcnQgZXh0ZXJuYWwgU0NCIFJBTSBvbiB0aGUgNzg5NS82LzcgY2hpcHNldHMuCisgICAgICAgICAgICogV2UgY291bGQgc3VwcG9ydCBpdCBvbiB0aGUgNzg5MC8xIGVhc3kgZW5vdWdoLCBidXQgSSBkb24ndAorICAgICAgICAgICAqIGtub3cgb2YgYW55IDc4OTAvMSBiYXNlZCBjYXJkcyB0aGF0IGhhdmUgaXQuICBJIGRvIGtub3cKKyAgICAgICAgICAgKiBvZiA3ODk1LzYvNyBjYXJkcyB0aGF0IGhhdmUgaXQgYW5kIHRoZXkgd29yayBwcm9wZXJseS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2godGVtcF9wLT5jaGlwICYgQUhDX0NISVBJRF9NQVNLKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBSENfQUlDNzg5NToKKyAgICAgICAgICAgIGNhc2UgQUhDX0FJQzc4OTY6CisgICAgICAgICAgICBjYXNlIEFIQ19BSUM3ODk5OgorICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgREVWQ09ORklHLCAmZGV2Y29uZmlnKTsKKyAgICAgICAgICAgICAgaWYgKHRlbXBfcC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAoYWljX2luYih0ZW1wX3AsIERTQ09NTUFORDApICYgUkFNUFNNX1VMVFJBMikgJiYKKyAgICAgICAgICAgICAgICAgICAgIChhaWM3eHh4X3NjYnJhbSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpY19pbmIodGVtcF9wLCBEU0NPTU1BTkQwKSAmIH5TQ0JSQU1TRUxfVUxUUkEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDT01NQU5EMCk7CisgICAgICAgICAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19FWFRFUk5BTF9TUkFNOworICAgICAgICAgICAgICAgICAgZGV2Y29uZmlnIHw9IEVYVFNDQlBFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWljX2luYih0ZW1wX3AsIERTQ09NTUFORDApICYgUkFNUFNNX1VMVFJBMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiA8JXM+IGF0IFBDSSAlZC8lZC8lZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIGJvYXJkX25hbWVzW2FpY19wZGV2c1tpXS5ib2FyZF9uYW1lX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9wLT5wY2lfYnVzLAorICAgICAgICAgICAgICAgICAgICBQQ0lfU0xPVCh0ZW1wX3AtPnBjaV9kZXZpY2VfZm4pLAorICAgICAgICAgICAgICAgICAgICBQQ0lfRlVOQyh0ZW1wX3AtPnBjaV9kZXZpY2VfZm4pKTsKKyAgICAgICAgICAgICAgICAgIHByaW50aygiYWljN3h4eDogZXh0ZXJuYWwgU0NCIFJBTSBkZXRlY3RlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgbm90IGVuYWJsZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRldmNvbmZpZyAmIFJBTVBTTSkgJiYgKGFpYzd4eHhfc2NicmFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBkZXZjb25maWcgJj0gflNDQlJBTVNFTDsKKyAgICAgICAgICAgICAgICAgIGRldmNvbmZpZyB8PSBFWFRTQ0JQRU47CisgICAgICAgICAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19FWFRFUk5BTF9TUkFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXZjb25maWcgJiBSQU1QU00pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogPCVzPiBhdCBQQ0kgJWQvJWQvJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgIHRlbXBfcC0+cGNpX2J1cywKKyAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSwKKyAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkModGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSk7CisgICAgICAgICAgICAgICAgICBwcmludGsoImFpYzd4eHg6IGV4dGVybmFsIFNDQiBSQU0gZGV0ZWN0ZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vdCBlbmFibGVkXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBERVZDT05GSUcsIGRldmNvbmZpZyk7CisgICAgICAgICAgICAgIGlmICggKHRlbXBfcC0+ZmxhZ3MgJiBBSENfRVhURVJOQUxfU1JBTSkgJiYKKyAgICAgICAgICAgICAgICAgICAodGVtcF9wLT5mbGFncyAmIEFIQ19DSE5MQikgKQorICAgICAgICAgICAgICAgIGFpY19vdXRiKHRlbXBfcCwgMSwgQ0NTQ0JCQUREUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qCisgICAgICAgICAgICogVGFrZSB0aGUgTEVEIG91dCBvZiBkaWFnbm9zdGljIG1vZGUKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIAorICAgICAgICAgICAgKGFpY19pbmIodGVtcF9wLCBTQkxLQ1RMKSAmIH4oRElBR0xFREVOIHwgRElBR0xFRE9OKSksCisgICAgICAgICAgICBTQkxLQ1RMKTsKKworICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UgZG9uJ3Qga25vdyB3aGVyZSB0aGlzIGlzIHNldCBpbiB0aGUgU0VFUFJPTSBvciBieSB0aGUKKyAgICAgICAgICAgKiBCSU9TLCBzbyB3ZSBkZWZhdWx0IHRvIDEwMCUuICBPbiBVbHRyYTIgY29udHJvbGxlcnMsIHVzZSA3NSUKKyAgICAgICAgICAgKiBpbnN0ZWFkLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICh0ZW1wX3AtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIFJEX0RGVEhSU0hfTUFYIHwgV1JfREZUSFJTSF9NQVgsIERGRl9USFJTSCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBhaWNfb3V0Yih0ZW1wX3AsIERGVEhSU0hfMTAwLCBEU1BDSVNUQVRVUyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBDYWxsIG91ciBmdW5jdGlvbiB0byBmaXh1cCBhbnkgYnVncyB0aGF0IGV4aXN0IG9uIHRoaXMgY2hpcHNldC4KKyAgICAgICAgICAgKiBUaGlzIG1heSBtdWNrIHdpdGggUENJIHNldHRpbmdzIGFuZCBvdGhlciBkZXZpY2Ugc2V0dGluZ3MsIHNvCisgICAgICAgICAgICogbWFrZSBzdXJlIGl0J3MgYWZ0ZXIgYWxsIHRoZSBvdGhlciBQQ0kgYW5kIGRldmljZSByZWdpc3RlcgorICAgICAgICAgICAqIHR3ZWFrcyBzbyBpdCBjYW4gYmFjayBvdXQgYmFkIHNldHRpbmdzIG9uIHNwZWNpZmljIGJyb2tlbiBjYXJkcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBhaWM3eHh4X2NvbmZpZ3VyZV9idWdzKHRlbXBfcCk7CisKKyAgICAgICAgICBpZiAoIGxpc3RfcCA9PSBOVUxMICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBsaXN0X3AgPSBjdXJyZW50X3AgPSB0ZW1wX3A7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50X3AgPSBsaXN0X3A7CisgICAgICAgICAgICB3aGlsZShjdXJyZW50X3AtPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgY3VycmVudF9wLT5uZXh0ID0gdGVtcF9wOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZW1wX3AtPm5leHQgPSBOVUxMOworICAgICAgICAgIGZvdW5kKys7CisJICBjb250aW51ZTsKK3NraXBfcGNpX2NvbnRyb2xsZXI6CisjaWZkZWYgQ09ORklHX1BDSQorCSAgcGNpX3JlbGVhc2VfcmVnaW9ucyh0ZW1wX3AtPnBkZXYpOworI2VuZGlmCisJICBrZnJlZSh0ZW1wX3ApOworICAgICAgICB9ICAvKiBGb3VuZCBhbiBBZGFwdGVjIFBDSSBkZXZpY2UuICovCisgICAgICAgIGVsc2UgLyogV2VsbCwgd2UgZm91bmQgb25lLCBidXQgd2UgY291bGRuJ3QgZ2V0IGFueSBtZW1vcnkgKi8KKyAgICAgICAgeworICAgICAgICAgIHByaW50aygiYWljN3h4eDogRm91bmQgPCVzPlxuIiwgCisgICAgICAgICAgICBib2FyZF9uYW1lc1thaWNfcGRldnNbaV0uYm9hcmRfbmFtZV9pbmRleF0pOworICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImFpYzd4eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LCAiCisgICAgICAgICAgICAic2tpcHBpbmcuXG4iKTsKKyAgICAgICAgfQorICAgICAgfSAvKiB3aGlsZShwZGV2PS4uLi4pICovCisgICAgfSAvKiBmb3IgUENJX0RFVklDRVMgKi8KKyAgfQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKQorICAvKgorICAgKiBFSVNBL1ZMLWJ1cyBjYXJkIHNpZ25hdHVyZSBwcm9iZS4KKyAgICovCisgIHNsb3QgPSBNSU5TTE9UOworICB3aGlsZSAoIChzbG90IDw9IE1BWFNMT1QpICYmCisgICAgICAgICAhKGFpYzd4eHhfbm9fcHJvYmUpICkKKyAgeworICAgIGJhc2UgPSBTTE9UQkFTRShzbG90KSArIE1JTlJFRzsKKworICAgIGlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgTUFYUkVHIC0gTUlOUkVHLCAiYWljN3h4eCIpKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBTb21lIG90aGVyIGRyaXZlciBoYXMgc3Rha2VkIGEKKyAgICAgICAqIGNsYWltIHRvIHRoaXMgaS9vIHJlZ2lvbiBhbHJlYWR5LgorICAgICAgICovCisgICAgICBzbG90Kys7CisgICAgICBjb250aW51ZTsgLyogYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3IgbG9vcCAqLworICAgIH0KKyAgICBmbGFncyA9IDA7CisgICAgdHlwZSA9IGFpYzd4eHhfcHJvYmUoc2xvdCwgYmFzZSArIEFIQ19ISUQwLCAmZmxhZ3MpOworICAgIGlmICh0eXBlID09IC0xKQorICAgIHsKKyAgICAgIHJlbGVhc2VfcmVnaW9uKGJhc2UsIE1BWFJFRyAtIE1JTlJFRyk7CisgICAgICBzbG90Kys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdGVtcF9wID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFpYzd4eHhfaG9zdCksIEdGUF9BVE9NSUMpOworICAgIGlmICh0ZW1wX3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhaWM3eHh4OiBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIHNwYWNlLlxuIik7CisgICAgICByZWxlYXNlX3JlZ2lvbihiYXNlLCBNQVhSRUcgLSBNSU5SRUcpOworICAgICAgc2xvdCsrOworICAgICAgY29udGludWU7IC8qIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgd2hpbGUgbG9vcCAqLworICAgIH0KKworICAgIC8qCisgICAgICogUGF1c2UgdGhlIGNhcmQgcHJlc2VydmluZyB0aGUgSVJRIHR5cGUuICBBbGxvdyB0aGUgb3BlcmF0b3IKKyAgICAgKiB0byBvdmVycmlkZSB0aGUgSVJRIHRyaWdnZXIuCisgICAgICovCisgICAgaWYgKGFpYzd4eHhfaXJxX3RyaWdnZXIgPT0gMSkKKyAgICAgIGhjbnRybCA9IElSUU1TOyAgLyogTGV2ZWwgKi8KKyAgICBlbHNlIGlmIChhaWM3eHh4X2lycV90cmlnZ2VyID09IDApCisgICAgICBoY250cmwgPSAwOyAgLyogRWRnZSAqLworICAgIGVsc2UKKyAgICAgIGhjbnRybCA9IGluYihiYXNlICsgSENOVFJMKSAmIElSUU1TOyAgLyogRGVmYXVsdCAqLworICAgIG1lbXNldCh0ZW1wX3AsIDAsIHNpemVvZihzdHJ1Y3QgYWljN3h4eF9ob3N0KSk7CisgICAgdGVtcF9wLT51bnBhdXNlID0gaGNudHJsIHwgSU5URU47CisgICAgdGVtcF9wLT5wYXVzZSA9IGhjbnRybCB8IFBBVVNFIHwgSU5URU47CisgICAgdGVtcF9wLT5iYXNlID0gYmFzZTsKKyAgICB0ZW1wX3AtPm1iYXNlID0gMDsKKyAgICB0ZW1wX3AtPm1hZGRyID0gTlVMTDsKKyAgICB0ZW1wX3AtPnBjaV9idXMgPSAwOworICAgIHRlbXBfcC0+cGNpX2RldmljZV9mbiA9IHNsb3Q7CisgICAgYWljX291dGIodGVtcF9wLCBoY250cmwgfCBQQVVTRSwgSENOVFJMKTsKKyAgICB3aGlsZSggKGFpY19pbmIodGVtcF9wLCBIQ05UUkwpICYgUEFVU0UpID09IDAgKSA7CisgICAgaWYgKGFpYzd4eHhfY2hpcF9yZXNldCh0ZW1wX3ApID09IC0xKQorICAgICAgdGVtcF9wLT5pcnEgPSAwOworICAgIGVsc2UKKyAgICAgIHRlbXBfcC0+aXJxID0gYWljX2luYih0ZW1wX3AsIElOVERFRikgJiAweDBGOworICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX1BBR0VTQ0JTOworCisgICAgc3dpdGNoICh0ZW1wX3AtPmlycSkKKyAgICB7CisgICAgICBjYXNlIDk6CisgICAgICBjYXNlIDEwOgorICAgICAgY2FzZSAxMToKKyAgICAgIGNhc2UgMTI6CisgICAgICBjYXNlIDE0OgorICAgICAgY2FzZSAxNToKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFpYzd4eHg6IEhvc3QgYWRhcHRlciB1c2VzIHVuc3VwcG9ydGVkIElSUSAiCisgICAgICAgICAgImxldmVsICVkLCBpZ25vcmluZy5cbiIsIHRlbXBfcC0+aXJxKTsKKyAgICAgICAga2ZyZWUodGVtcF9wKTsKKyAgICAgICAgcmVsZWFzZV9yZWdpb24oYmFzZSwgTUFYUkVHIC0gTUlOUkVHKTsKKyAgICAgICAgc2xvdCsrOworICAgICAgICBjb250aW51ZTsgLyogYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3aGlsZSBsb29wICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSBhcmUgY29tbWl0ZWQgbm93LCBldmVyeXRoaW5nIGhhcyBiZWVuIGNoZWNrZWQgYW5kIHRoaXMgY2FyZAorICAgICAqIGhhcyBiZWVuIGZvdW5kLCBub3cgd2UganVzdCBzZXQgaXQgdXAKKyAgICAgKi8KKworICAgIC8qCisgICAgICogSW5zZXJ0IG91ciBuZXcgc3RydWN0IGludG8gdGhlIGxpc3QgYXQgdGhlIGVuZAorICAgICAqLworICAgIGlmIChsaXN0X3AgPT0gTlVMTCkKKyAgICB7CisgICAgICBsaXN0X3AgPSBjdXJyZW50X3AgPSB0ZW1wX3A7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBjdXJyZW50X3AgPSBsaXN0X3A7CisgICAgICB3aGlsZSAoY3VycmVudF9wLT5uZXh0ICE9IE5VTEwpCisgICAgICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKyAgICAgIGN1cnJlbnRfcC0+bmV4dCA9IHRlbXBfcDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgY2FzZSAwOgorICAgICAgICB0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXggPSAyOworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IEVJU0EgJWRcbiIsCisgICAgICAgICAgICAgICBib2FyZF9uYW1lc1syXSwgc2xvdCk7CisgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICBjYXNlIDE6CisgICAgICB7CisgICAgICAgIHRlbXBfcC0+Y2hpcCA9IEFIQ19BSUM3NzcwIHwgQUhDX0VJU0E7CisgICAgICAgIHRlbXBfcC0+ZmVhdHVyZXMgfD0gQUhDX0FJQzc3NzBfRkU7CisgICAgICAgIHRlbXBfcC0+Ymlvc19jb250cm9sID0gYWljX2luYih0ZW1wX3AsIEhBXzI3NF9CSU9TQ1RSTCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBwcmltYXJ5IGNoYW5uZWwgaW5mb3JtYXRpb24uICBSaWdodCBub3cgd2UgZG9uJ3QKKyAgICAgICAgICogZG8gYW55dGhpbmcgd2l0aCB0aGlzLCBidXQgc29tZWRheSB3ZSB3aWxsIGJlIGFibGUgdG8gaW5mb3JtCisgICAgICAgICAqIHRoZSBtaWQtbGV2ZWwgU0NTSSBjb2RlIHdoaWNoIGNoYW5uZWwgaXMgcHJpbWFyeS4KKyAgICAgICAgICovCisgICAgICAgIGlmICh0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHRlbXBfcC0+Ym9hcmRfbmFtZV9pbmRleCA9IDM7CisgICAgICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUFJPQkUyKQorICAgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IEVJU0EgJWRcbiIsCisgICAgICAgICAgICAgICAgIGJvYXJkX25hbWVzWzNdLCBzbG90KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcF9wLT5iaW9zX2NvbnRyb2wgJiBDSEFOTkVMX0JfUFJJTUFSWSkKKyAgICAgICAgeworICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgfD0gQUhDX0NIQU5ORUxfQl9QUklNQVJZOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0ZW1wX3AtPmJpb3NfY29udHJvbCAmIEJJT1NNT0RFKSA9PSBCSU9TRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wX3AtPmZsYWdzICY9IH5BSENfQklPU19FTkFCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRlbXBfcC0+ZmxhZ3MgJj0gfkFIQ19VU0VERUZBVUxUUzsKKyAgICAgICAgICB0ZW1wX3AtPmZsYWdzIHw9IEFIQ19CSU9TX0VOQUJMRUQ7CisgICAgICAgICAgaWYgKCAodGVtcF9wLT5iaW9zX2NvbnRyb2wgJiAweDIwKSA9PSAwICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB0ZW1wX3AtPmJpb3NfYWRkcmVzcyA9IDB4Y2MwMDA7CisgICAgICAgICAgICB0ZW1wX3AtPmJpb3NfYWRkcmVzcyArPSAoMHg0MDAwICogKHRlbXBfcC0+Ymlvc19jb250cm9sICYgMHgwNykpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGQwMDAwOworICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgKz0gKDB4ODAwMCAqICh0ZW1wX3AtPmJpb3NfY29udHJvbCAmIDB4MDYpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgPSBhaWNfaW5iKHRlbXBfcCwgU0NTSUNPTkYpIDw8IDg7CisgICAgICAgIHRlbXBfcC0+YWRhcHRlcl9jb250cm9sIHw9IGFpY19pbmIodGVtcF9wLCBTQ1NJQ09ORiArIDEpOworICAgICAgICBpZiAodGVtcF9wLT5mZWF0dXJlcyAmIEFIQ19XSURFKQorICAgICAgICB7CisgICAgICAgICAgdGVtcF9wLT5zY3NpX2lkID0gdGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgJiBIV1NDU0lJRDsKKyAgICAgICAgICB0ZW1wX3AtPnNjc2lfaWRfYiA9IHRlbXBfcC0+c2NzaV9pZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB0ZW1wX3AtPnNjc2lfaWQgPSAodGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgPj4gOCkgJiBIU0NTSUlEOworICAgICAgICAgIHRlbXBfcC0+c2NzaV9pZF9iID0gdGVtcF9wLT5hZGFwdGVyX2NvbnRyb2wgJiBIU0NTSUlEOworICAgICAgICB9CisgICAgICAgIGFpYzd4eHhfbG9hZF9zZWVwcm9tKHRlbXBfcCwgJnN4ZnJjdGwxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgdGVtcF9wLT5jaGlwID0gQUhDX0FJQzc3NzAgfCBBSENfVkw7CisgICAgICAgIHRlbXBfcC0+ZmVhdHVyZXMgfD0gQUhDX0FJQzc3NzBfRkU7CisgICAgICAgIGlmICh0eXBlID09IDIpCisgICAgICAgICAgdGVtcF9wLT5mbGFncyB8PSBBSENfQklPU19FTkFCTEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgdGVtcF9wLT5mbGFncyAmPSB+QUhDX0JJT1NfRU5BQkxFRDsKKyAgICAgICAgaWYgKGFpY19pbmIodGVtcF9wLCBTQ1NJQ09ORikgJiBURVJNX0VOQikKKyAgICAgICAgICBzeGZyY3RsMSA9IFNUUFdFTjsKKyAgICAgICAgYWljN3h4eF9sb2FkX3NlZXByb20odGVtcF9wLCAmc3hmcmN0bDEpOworICAgICAgICB0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXggPSA0OworICAgICAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgICAgICAgcHJpbnRrKCJhaWM3eHh4OiA8JXM+IGF0IFZMQiAlZFxuIiwKKyAgICAgICAgICAgICAgIGJvYXJkX25hbWVzWzJdLCBzbG90KTsKKyAgICAgICAgc3dpdGNoKCBhaWNfaW5iKHRlbXBfcCwgU1RBVFVTXzI4NDApICYgQklPU19TRUwgKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGUwMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDIwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGM4MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDQwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGQwMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDYwOgorICAgICAgICAgICAgdGVtcF9wLT5iaW9zX2FkZHJlc3MgPSAweGQ4MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOyAvKiBjYW4ndCBnZXQgaGVyZSAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OiAgLyogV29uJ3QgZ2V0IGhlcmUuICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9QUk9CRTIpCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiYWljN3h4eDogQklPUyAlc2FibGVkLCBJTyBQb3J0IDB4JWx4LCBJUlEgJWQgKCVzKVxuIiwKKyAgICAgICAgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfVVNFREVGQVVMVFMpID8gImRpcyIgOiAiZW4iLCB0ZW1wX3AtPmJhc2UsCisgICAgICAgIHRlbXBfcC0+aXJxLAorICAgICAgICAodGVtcF9wLT5wYXVzZSAmIElSUU1TKSA/ICJsZXZlbCBzZW5zaXRpdmUiIDogImVkZ2UgdHJpZ2dlcmVkIik7CisgICAgICBwcmludGsoS0VSTl9JTkZPICJhaWM3eHh4OiBFeHRlbmRlZCB0cmFuc2xhdGlvbiAlc2FibGVkLlxuIiwKKyAgICAgICAgICAgICAodGVtcF9wLT5mbGFncyAmIEFIQ19FWFRFTkRfVFJBTlNfQSkgPyAiZW4iIDogImRpcyIpOworICAgIH0KKworICAgIC8qCisgICAgICogQWxsIHRoZSA3NzcwIGJhc2VkIGNoaXBzZXRzIGhhdmUgdGhpcyBidWcKKyAgICAgKi8KKyAgICB0ZW1wX3AtPmJ1Z3MgfD0gQUhDX0JVR19UTU9ERV9XSURFT0REOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIEZJRk8gdGhyZXNob2xkIGFuZCB0aGUgYnVzIG9mZiB0aW1lLgorICAgICAqLworICAgIGhvc3Rjb25mID0gYWljX2luYih0ZW1wX3AsIEhPU1RDT05GKTsKKyAgICBhaWNfb3V0Yih0ZW1wX3AsIGhvc3Rjb25mICYgREZUSFJTSCwgQlVTU1BEKTsKKyAgICBhaWNfb3V0Yih0ZW1wX3AsIChob3N0Y29uZiA8PCAyKSAmIEJPRkYsIEJVU1RJTUUpOworICAgIHNsb3QrKzsKKyAgICBmb3VuZCsrOworICB9CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgKi8KKworICAvKgorICAgKiBOb3csIHdlIHJlLW9yZGVyIHRoZSBwcm9iZWQgZGV2aWNlcyBieSBCSU9TIGFkZHJlc3MgYW5kIEJVUyBjbGFzcy4KKyAgICogSW4gZ2VuZXJhbCwgd2UgZm9sbG93IHRoaXMgYWxnb3JpdGhtIHRvIG1ha2UgdGhlIGFkYXB0ZXJzIHNob3cgdXAKKyAgICogaW4gdGhlIHNhbWUgb3JkZXIgdW5kZXIgbGludXggdGhhdCB0aGUgY29tcHV0ZXIgZmluZHMgdGhlbS4KKyAgICogIDE6IEFsbCBWTEIvRUlTQSBjYXJkcyB3aXRoIEJJT1NfRU5BQkxFRCBmaXJzdCwgYWNjb3JkaW5nIHRvIEJJT1MKKyAgICogICAgIGFkZHJlc3MsIGdvaW5nIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QuCisgICAqICAyOiBBbGwgUENJIGNvbnRyb2xsZXJzIHdpdGggQklPU19FTkFCTEVEIG5leHQsIGFjY29yZGluZyB0byBCSU9TCisgICAqICAgICBhZGRyZXNzLCBnb2luZyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0LgorICAgKiAgMzogUmVtYWluaW5nIFZMQi9FSVNBIGNvbnRyb2xsZXJzIGdvaW5nIGluIHNsb3Qgb3JkZXIuCisgICAqICA0OiBSZW1haW5pbmcgUENJIGNvbnRyb2xsZXJzLCBnb2luZyBpbiBQQ0kgZGV2aWNlIG9yZGVyIChyZXZlcnNhYmxlKQorICAgKi8KKworICB7CisgICAgc3RydWN0IGFpYzd4eHhfaG9zdCAqc29ydF9saXN0WzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgICAgc3RydWN0IGFpYzd4eHhfaG9zdCAqdmxiLCAqcGNpOworICAgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKnByZXZfcDsKKyAgICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICAgIHVuc2lnbmVkIGNoYXIgbGVmdDsKKworICAgIHByZXZfcCA9IHZsYiA9IHBjaSA9IE5VTEw7CisKKyAgICB0ZW1wX3AgPSBsaXN0X3A7CisgICAgd2hpbGUgKHRlbXBfcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN3aXRjaCh0ZW1wX3AtPmNoaXAgJiB+QUhDX0NISVBJRF9NQVNLKQorICAgICAgeworICAgICAgICBjYXNlIEFIQ19FSVNBOgorICAgICAgICBjYXNlIEFIQ19WTDoKKyAgICAgICAgeworICAgICAgICAgIHAgPSB0ZW1wX3A7CisgICAgICAgICAgaWYgKHAtPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRCkKKyAgICAgICAgICAgIHZsYiA9IHNvcnRfbGlzdFswXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB2bGIgPSBzb3J0X2xpc3RbMl07CisKKyAgICAgICAgICBpZiAodmxiID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgdmxiID0gdGVtcF9wOworICAgICAgICAgICAgdGVtcF9wID0gdGVtcF9wLT5uZXh0OworICAgICAgICAgICAgdmxiLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRfcCA9IHZsYjsKKyAgICAgICAgICAgIHByZXZfcCA9IE5VTEw7CisgICAgICAgICAgICB3aGlsZSAoIChjdXJyZW50X3AgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfcC0+Ymlvc19hZGRyZXNzIDwgdGVtcF9wLT5iaW9zX2FkZHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmV2X3AgPSBjdXJyZW50X3A7CisgICAgICAgICAgICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcmV2X3AgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJldl9wLT5uZXh0ID0gdGVtcF9wOworICAgICAgICAgICAgICB0ZW1wX3AgPSB0ZW1wX3AtPm5leHQ7CisgICAgICAgICAgICAgIHByZXZfcC0+bmV4dC0+bmV4dCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdmxiID0gdGVtcF9wOworICAgICAgICAgICAgICB0ZW1wX3AgPSB0ZW1wX3AtPm5leHQ7CisgICAgICAgICAgICAgIHZsYi0+bmV4dCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaWYgKHAtPmZsYWdzICYgQUhDX0JJT1NfRU5BQkxFRCkKKyAgICAgICAgICAgIHNvcnRfbGlzdFswXSA9IHZsYjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzb3J0X2xpc3RbMl0gPSB2bGI7CisgICAgICAgICAgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogIC8qIEFsbCBQQ0kgY29udHJvbGxlcnMgZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgKi8KKyAgICAgICAgeworCisgICAgICAgICAgcCA9IHRlbXBfcDsKKyAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEKSAKKyAgICAgICAgICAgIHBjaSA9IHNvcnRfbGlzdFsxXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwY2kgPSBzb3J0X2xpc3RbM107CisKKyAgICAgICAgICBpZiAocGNpID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgcGNpID0gdGVtcF9wOworICAgICAgICAgICAgdGVtcF9wID0gdGVtcF9wLT5uZXh0OworICAgICAgICAgICAgcGNpLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRfcCA9IHBjaTsKKyAgICAgICAgICAgIHByZXZfcCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoIWFpYzd4eHhfcmV2ZXJzZV9zY2FuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB3aGlsZSAoIChjdXJyZW50X3AgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoIChQQ0lfU0xPVChjdXJyZW50X3AtPnBjaV9kZXZpY2VfZm4pIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3AtPnBjaV9idXMgPDwgOCkpIDwgCisgICAgICAgICAgICAgICAgICAgICAgICAoUENJX1NMT1QodGVtcF9wLT5wY2lfZGV2aWNlX2ZuKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAodGVtcF9wLT5wY2lfYnVzIDw8IDgpKSApICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXZfcCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3AgPSBjdXJyZW50X3AtPm5leHQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2hpbGUgKCAoY3VycmVudF9wICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgICAgKCAoUENJX1NMT1QoY3VycmVudF9wLT5wY2lfZGV2aWNlX2ZuKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF9wLT5wY2lfYnVzIDw8IDgpKSA+IAorICAgICAgICAgICAgICAgICAgICAgICAgKFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbikgfAorICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBfcC0+cGNpX2J1cyA8PCA4KSkgKSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X3AgPSBjdXJyZW50X3A7CisgICAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXJlIHdlIGRlYWxpbmcgd2l0aCBhIDc4OTUvNi83Lzkgd2hlcmUgd2UgbmVlZCB0byBzb3J0IHRoZQorICAgICAgICAgICAgICogY2hhbm5lbHMgYXMgd2VsbCwgaWYgc28sIHRoZSBiaW9zX2FkZHJlc3MgdmFsdWVzIHNob3VsZAorICAgICAgICAgICAgICogYmUgdGhlIHNhbWUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCAoY3VycmVudF9wKSAmJiAodGVtcF9wLT5mbGFncyAmIEFIQ19NVUxUSV9DSEFOTkVMKSAmJgorICAgICAgICAgICAgICAgICAodGVtcF9wLT5wY2lfYnVzID09IGN1cnJlbnRfcC0+cGNpX2J1cykgJiYKKyAgICAgICAgICAgICAgICAgKFBDSV9TTE9UKHRlbXBfcC0+cGNpX2RldmljZV9mbikgPT0KKyAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKGN1cnJlbnRfcC0+cGNpX2RldmljZV9mbikpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfQ0hOTEIpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICEodGVtcF9wLT5mbGFncyAmIEFIQ19DSEFOTkVMX0JfUFJJTUFSWSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByZXZfcCA9IGN1cnJlbnRfcDsKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcCA9IGN1cnJlbnRfcC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBfcC0+ZmxhZ3MgJiBBSENfQ0hBTk5FTF9CX1BSSU1BUlkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJldl9wID0gY3VycmVudF9wOworICAgICAgICAgICAgICAgICAgY3VycmVudF9wID0gY3VycmVudF9wLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByZXZfcCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmV2X3AtPm5leHQgPSB0ZW1wX3A7CisgICAgICAgICAgICAgIHRlbXBfcCA9IHRlbXBfcC0+bmV4dDsKKyAgICAgICAgICAgICAgcHJldl9wLT5uZXh0LT5uZXh0ID0gY3VycmVudF9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwY2kgPSB0ZW1wX3A7CisgICAgICAgICAgICAgIHRlbXBfcCA9IHRlbXBfcC0+bmV4dDsKKyAgICAgICAgICAgICAgcGNpLT5uZXh0ID0gY3VycmVudF9wOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwLT5mbGFncyAmIEFIQ19CSU9TX0VOQUJMRUQpCisgICAgICAgICAgICBzb3J0X2xpc3RbMV0gPSBwY2k7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc29ydF9saXN0WzNdID0gcGNpOworCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gIC8qIEVuZCBvZiBzd2l0Y2godGVtcF9wLT50eXBlKSAqLworICAgIH0gLyogRW5kIG9mIHdoaWxlICh0ZW1wX3AgIT0gTlVMTCkgKi8KKyAgICAvKgorICAgICAqIEF0IHRoaXMgcG9pbnQsIHRoZSBjYXJkcyBoYXZlIGJlZW4gYnJva2VuIGludG8gNCBzb3J0ZWQgbGlzdHMsIG5vdworICAgICAqIHdlIHJ1biB0aHJvdWdoIHRoZSBsaXN0cyBpbiBvcmRlciBhbmQgcmVnaXN0ZXIgZWFjaCBjb250cm9sbGVyCisgICAgICovCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIGxlZnQgPSBmb3VuZDsKKyAgICAgIGZvciAoaT0wOyBpPEFSUkFZX1NJWkUoc29ydF9saXN0KTsgaSsrKQorICAgICAgeworICAgICAgICB0ZW1wX3AgPSBzb3J0X2xpc3RbaV07CisgICAgICAgIHdoaWxlKHRlbXBfcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgdGVtcGxhdGUtPm5hbWUgPSBib2FyZF9uYW1lc1t0ZW1wX3AtPmJvYXJkX25hbWVfaW5kZXhdOworICAgICAgICAgIHAgPSBhaWM3eHh4X2FsbG9jKHRlbXBsYXRlLCB0ZW1wX3ApOworICAgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgcC0+aW5zdGFuY2UgPSBmb3VuZCAtIGxlZnQ7CisgICAgICAgICAgICBpZiAoYWljN3h4eF9yZWdpc3Rlcih0ZW1wbGF0ZSwgcCwgKC0tbGVmdCkpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvdW5kLS07CisgICAgICAgICAgICAgIGFpYzd4eHhfcmVsZWFzZShwLT5ob3N0KTsKKyAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHAtPmhvc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYWljN3h4eF9kdW1wX2NhcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgICAgICAgICAgICAgYWljN3h4eF9wcmludF9jYXJkKHApOworICAgICAgICAgICAgICBhaWM3eHh4X3ByaW50X3NjcmF0Y2hfcmFtKHApOworICAgICAgICAgICAgICB1bnBhdXNlX3NlcXVlbmNlcihwLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY3VycmVudF9wID0gdGVtcF9wOworICAgICAgICAgIHRlbXBfcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopdGVtcF9wLT5uZXh0OworICAgICAgICAgIGtmcmVlKGN1cnJlbnRfcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIChmb3VuZCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9idWlsZHNjYgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBCdWlsZCBhIFNDQi4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfYnVpbGRzY2Ioc3RydWN0IGFpYzd4eHhfaG9zdCAqcCwgU2NzaV9DbW5kICpjbWQsCisgICAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2IpCit7CisgIHVuc2lnbmVkIHNob3J0IG1hc2s7CisgIHN0cnVjdCBhaWM3eHh4X2h3c2NiICpoc2NiOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcHRyID0gY21kLT5kZXZpY2U7CisgIHVuc2lnbmVkIGNoYXIgdGluZGV4ID0gVEFSR0VUX0lOREVYKGNtZCk7CisgIHN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CisKKyAgbWFzayA9ICgweDAxIDw8IHRpbmRleCk7CisgIGhzY2IgPSBzY2ItPmhzY2I7CisKKyAgLyoKKyAgICogU2V0dXAgdGhlIGNvbnRyb2wgYnl0ZSBpZiB3ZSBuZWVkIG5lZ290aWF0aW9uIGFuZCBoYXZlIG5vdAorICAgKiBhbHJlYWR5IHJlcXVlc3RlZCBpdC4KKyAgICovCisgIGhzY2ItPmNvbnRyb2wgPSAwOworICBzY2ItPnRhZ19hY3Rpb24gPSAwOworCisgIGlmIChwLT5kaXNjZW5hYmxlICYgbWFzaykKKyAgeworICAgIGhzY2ItPmNvbnRyb2wgfD0gRElTQ0VOQjsKKyAgICAvKiBXZSBhbHdheXMgZm9yY2UgVEVTVF9VTklUX1JFQURZIHRvIHVudGFnZ2VkICovCisgICAgaWYgKGNtZC0+Y21uZFswXSAhPSBURVNUX1VOSVRfUkVBRFkgJiYgc2RwdHItPnNpbXBsZV90YWdzKQorICAgIHsKKyAgICAgIGlmIChyZXEtPmZsYWdzICYgUkVRX0hBUkRCQVJSSUVSKQorICAgICAgeworCWlmKHNkcHRyLT5vcmRlcmVkX3RhZ3MpCisJeworICAgICAgICAgIGhzY2ItPmNvbnRyb2wgfD0gTVNHX09SREVSRURfUV9UQUc7CisgICAgICAgICAgc2NiLT50YWdfYWN0aW9uID0gTVNHX09SREVSRURfUV9UQUc7CisJfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoc2NiLT5jb250cm9sIHw9IE1TR19TSU1QTEVfUV9UQUc7CisgICAgICAgIHNjYi0+dGFnX2FjdGlvbiA9IE1TR19TSU1QTEVfUV9UQUc7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICggIShhaWNfZGV2LT5kdHJfcGVuZGluZykgJiYKKyAgICAgICAgKGFpY19kZXYtPm5lZWRwcHIgfHwgYWljX2Rldi0+bmVlZHdkdHIgfHwgYWljX2Rldi0+bmVlZHNkdHIpICYmCisgICAgICAgIChhaWNfZGV2LT5mbGFncyAmIERFVklDRV9EVFJfU0NBTk5FRCkgKQorICB7CisgICAgYWljX2Rldi0+ZHRyX3BlbmRpbmcgPSAxOworICAgIHNjYi0+dGFnX2FjdGlvbiA9IDA7CisgICAgaHNjYi0+Y29udHJvbCAmPSBESVNDRU5COworICAgIGhzY2ItPmNvbnRyb2wgfD0gTUtfTUVTU0FHRTsKKyAgICBpZihhaWNfZGV2LT5uZWVkcHByKQorICAgIHsKKyAgICAgIHNjYi0+ZmxhZ3MgfD0gU0NCX01TR09VVF9QUFI7CisgICAgfQorICAgIGVsc2UgaWYoYWljX2Rldi0+bmVlZHdkdHIpCisgICAgeworICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1dEVFI7CisgICAgfQorICAgIGVsc2UgaWYoYWljX2Rldi0+bmVlZHNkdHIpCisgICAgeworICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfTVNHT1VUX1NEVFI7CisgICAgfQorICAgIHNjYi0+ZmxhZ3MgfD0gU0NCX0RUUl9TQ0I7CisgIH0KKyAgaHNjYi0+dGFyZ2V0X2NoYW5uZWxfbHVuID0gKChjbWQtPmRldmljZS0+aWQgPDwgNCkgJiAweEYwKSB8CisgICAgICAgICgoY21kLT5kZXZpY2UtPmNoYW5uZWwgJiAweDAxKSA8PCAzKSB8IChjbWQtPmRldmljZS0+bHVuICYgMHgwNyk7CisKKyAgLyoKKyAgICogVGhlIGludGVycHJldGF0aW9uIG9mIHJlcXVlc3RfYnVmZmVyIGFuZCByZXF1ZXN0X2J1ZmZsZW4KKyAgICogY2hhbmdlcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdXNlX3NnIGlzIHplcm87IGEKKyAgICogbm9uLXplcm8gdXNlX3NnIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQorICAgKiBzY2F0dGVyLWdhdGhlciBhcnJheS4KKyAgICovCisKKyAgLyoKKyAgICogWFhYIC0gdGhpcyByZWxpZXMgb24gdGhlIGhvc3QgZGF0YSBiZWluZyBzdG9yZWQgaW4gYQorICAgKiAgICAgICBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgICovCisgIGhzY2ItPlNDU0lfY21kX2xlbmd0aCA9IGNtZC0+Y21kX2xlbjsKKyAgbWVtY3B5KHNjYi0+Y21uZCwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworICBoc2NiLT5TQ1NJX2NtZF9wb2ludGVyID0gY3B1X3RvX2xlMzIoU0NCX0RNQV9BRERSKHNjYiwgc2NiLT5jbW5kKSk7CisKKyAgaWYgKGNtZC0+dXNlX3NnKQorICB7CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsgIC8qIE11c3QgYmUgbWlkLWxldmVsIFNDU0kgY29kZSBzY2F0dGVybGlzdCAqLworCisgICAgLyoKKyAgICAgKiBXZSBtdXN0IGJ1aWxkIGFuIFNHIGxpc3QgaW4gYWRhcHRlciBmb3JtYXQsIGFzIHRoZSBrZXJuZWwncyBTRyBsaXN0CisgICAgICogY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgYmVjYXVzZSBvZiBkYXRhIGZpZWxkIHNpemUgKF9fYWxwaGFfXykKKyAgICAgKiBkaWZmZXJlbmNlcyBhbmQgdGhlIGtlcm5lbCBTRyBsaXN0IHVzZXMgdmlydHVhbCBhZGRyZXNzZXMgd2hlcmUKKyAgICAgKiB3ZSBuZWVkIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBpbnQgaSwgdXNlX3NnOworCisgICAgc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKyAgICBzY2ItPnNnX2xlbmd0aCA9IDA7CisgICAgdXNlX3NnID0gcGNpX21hcF9zZyhwLT5wZGV2LCBzZywgY21kLT51c2Vfc2csIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworICAgIC8qCisgICAgICogQ29weSB0aGUgc2VnbWVudHMgaW50byB0aGUgU0cgYXJyYXkuICBOT1RFISEhIC0gV2UgdXNlZCB0bworICAgICAqIGhhdmUgdGhlIGZpcnN0IGVudHJ5IGJvdGggaW4gdGhlIGRhdGFfcG9pbnRlciBhcmVhIGFuZCB0aGUgZmlyc3QKKyAgICAgKiBTRyBlbGVtZW50LiAgVGhhdCBoYXMgY2hhbmdlZCBzb21ld2hhdC4gIFdlIHN0aWxsIGhhdmUgdGhlIGZpcnN0CisgICAgICogZW50cnkgaW4gYm90aCBwbGFjZXMsIGJ1dCBub3cgd2UgZG93bmxvYWQgdGhlIGFkZHJlc3Mgb2YKKyAgICAgKiBzY2ItPnNnX2xpc3RbMV0gaW5zdGVhZCBvZiAwIHRvIHRoZSBzZyBwb2ludGVyIGluIHRoZSBoc2NiLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCB1c2Vfc2c7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gc2dfZG1hX2xlbihzZytpKTsKKyAgICAgIHNjYi0+c2dfbGlzdFtpXS5hZGRyZXNzID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2craSkpOworICAgICAgc2NiLT5zZ19saXN0W2ldLmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbik7CisgICAgICBzY2ItPnNnX2xlbmd0aCArPSBsZW47CisgICAgfQorICAgIC8qIENvcHkgdGhlIGZpcnN0IFNHIGludG8gdGhlIGRhdGEgcG9pbnRlciBhcmVhLiAqLworICAgIGhzY2ItPmRhdGFfcG9pbnRlciA9IHNjYi0+c2dfbGlzdFswXS5hZGRyZXNzOworICAgIGhzY2ItPmRhdGFfY291bnQgPSBzY2ItPnNnX2xpc3RbMF0ubGVuZ3RoOworICAgIHNjYi0+c2dfY291bnQgPSBpOworICAgIGhzY2ItPlNHX3NlZ21lbnRfY291bnQgPSBpOworICAgIGhzY2ItPlNHX2xpc3RfcG9pbnRlciA9IGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsICZzY2ItPnNnX2xpc3RbMV0pKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwLT5wZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoY21kLT5zY19kYXRhX2RpcmVjdGlvbikpOworICAgICAgYWljN3h4eF9tYXBwaW5nKGNtZCkgPSBhZGRyZXNzOworICAgICAgc2NiLT5zZ19saXN0WzBdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihhZGRyZXNzKTsKKyAgICAgIHNjYi0+c2dfbGlzdFswXS5sZW5ndGggPSBjcHVfdG9fbGUzMihjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisgICAgICBzY2ItPnNnX2NvdW50ID0gMTsKKyAgICAgIHNjYi0+c2dfbGVuZ3RoID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICBoc2NiLT5TR19zZWdtZW50X2NvdW50ID0gMTsKKyAgICAgIGhzY2ItPlNHX2xpc3RfcG9pbnRlciA9IGNwdV90b19sZTMyKFNDQl9ETUFfQUREUihzY2IsICZzY2ItPnNnX2xpc3RbMF0pKTsKKyAgICAgIGhzY2ItPmRhdGFfY291bnQgPSBzY2ItPnNnX2xpc3RbMF0ubGVuZ3RoOworICAgICAgaHNjYi0+ZGF0YV9wb2ludGVyID0gc2NiLT5zZ19saXN0WzBdLmFkZHJlc3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzY2ItPnNnX2NvdW50ID0gMDsKKyAgICAgIHNjYi0+c2dfbGVuZ3RoID0gMDsKKyAgICAgIGhzY2ItPlNHX3NlZ21lbnRfY291bnQgPSAwOworICAgICAgaHNjYi0+U0dfbGlzdF9wb2ludGVyID0gMDsKKyAgICAgIGhzY2ItPmRhdGFfY291bnQgPSAwOworICAgICAgaHNjYi0+ZGF0YV9wb2ludGVyID0gMDsKKyAgICB9CisgIH0KK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X3F1ZXVlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFF1ZXVlIGEgU0NCIHRvIHRoZSBjb250cm9sbGVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3F1ZXVlKFNjc2lfQ21uZCAqY21kLCB2b2lkICgqZm4pKFNjc2lfQ21uZCAqKSkKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcDsKKyAgc3RydWN0IGFpYzd4eHhfc2NiICpzY2I7CisgIHN0cnVjdCBhaWNfZGV2X2RhdGEgKmFpY19kZXY7CisKKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworICBhaWNfZGV2ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOyAgCisjaWZkZWYgQUlDN1hYWF9WRVJCT1NFX0RFQlVHR0lORworICBpZiAoYWljX2Rldi0+YWN0aXZlX2NtZHMgPiBhaWNfZGV2LT5tYXhfcV9kZXB0aCkKKyAgeworICAgIHByaW50ayhXQVJOX0xFQUQgIkNvbW1hbmRzIHF1ZXVlZCBleGNlZWRzIHF1ZXVlICIKKyAgICAgICAgICAgImRlcHRoLCBhY3RpdmU9JWRcbiIsCisgICAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9DTUQoY21kKSwgCisgICAgICAgICAgIGFpY19kZXYtPmFjdGl2ZV9jbWRzKTsKKyAgfQorI2VuZGlmCisKKyAgc2NiID0gc2NicV9yZW1vdmVfaGVhZCgmcC0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7CisgIGlmIChzY2IgPT0gTlVMTCkKKyAgeworICAgIGFpYzd4eHhfYWxsb2NhdGVfc2NiKHApOworICAgIHNjYiA9IHNjYnFfcmVtb3ZlX2hlYWQoJnAtPnNjYl9kYXRhLT5mcmVlX3NjYnMpOworICAgIGlmKHNjYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ayhXQVJOX0xFQUQgIkNvdWxkbid0IGdldCBhIGZyZWUgU0NCLlxuIiwgcC0+aG9zdF9ubywKKyAgICAgICAgICAgICBDVExfT0ZfQ01EKGNtZCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHNjYi0+Y21kID0gY21kOworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGUgU2NzaV9DbW5kIHBvaW50ZXIgaXMgc2F2ZWQsIHRoZSBzdHJ1Y3QgaXQgcG9pbnRzIHRvCisgICAqIGlzIHNldCB1cCBwcm9wZXJseSwgYW5kIHRoZSBwYXJpdHkgZXJyb3IgZmxhZyBpcyByZXNldCwgdGhlbiBzZW5kCisgICAqIHRoZSBTQ0IgdG8gdGhlIHNlcXVlbmNlciBhbmQgd2F0Y2ggdGhlIGZ1biBiZWdpbi4KKyAgICovCisgIGFpYzd4eHhfcG9zaXRpb24oY21kKSA9IHNjYi0+aHNjYi0+dGFnOworICBjbWQtPnNjc2lfZG9uZSA9IGZuOworICBjbWQtPnJlc3VsdCA9IERJRF9PSzsKKyAgbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKyAgYWljN3h4eF9lcnJvcihjbWQpID0gRElEX09LOworICBhaWM3eHh4X3N0YXR1cyhjbWQpID0gMDsKKyAgY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAvKgorICAgKiBDb25zdHJ1Y3QgdGhlIFNDQiBiZWZvcmVoYW5kLCBzbyB0aGUgc2VxdWVuY2VyIGlzCisgICAqIHBhdXNlZCBhIG1pbmltYWwgYW1vdW50IG9mIHRpbWUuCisgICAqLworICBhaWM3eHh4X2J1aWxkc2NiKHAsIGNtZCwgc2NiKTsKKworICBzY2ItPmZsYWdzIHw9IFNDQl9BQ1RJVkUgfCBTQ0JfV0FJVElOR1E7CisKKyAgc2NicV9pbnNlcnRfdGFpbCgmcC0+d2FpdGluZ19zY2JzLCBzY2IpOworICBhaWM3eHh4X3J1bl93YWl0aW5nX3F1ZXVlcyhwKTsKKyAgcmV0dXJuICgwKTsKK30KKworLyorRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOgorICogICBhaWM3eHh4X2J1c19kZXZpY2VfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWJvcnQgb3IgcmVzZXQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLiAgSWYgdGhlIHNjYiBoYXMgbm90CisgKiAgIHByZXZpb3VzbHkgYmVlbiBhYm9ydGVkLCB0aGVuIHdlIGF0dGVtcHQgdG8gc2VuZCBhIEJVU19ERVZJQ0VfUkVTRVQKKyAqICAgbWVzc2FnZSB0byB0aGUgdGFyZ2V0LiAgSWYgdGhlIHNjYiBoYXMgcHJldmlvdXNseSBiZWVuIHVuc3VjY2Vzc2Z1bGx5CisgKiAgIGFib3J0ZWQsIHRoZW4gd2Ugd2lsbCByZXNldCB0aGUgY2hhbm5lbCBhbmQgaGF2ZSBhbGwgZGV2aWNlcyByZW5lZ290aWF0ZS4KKyAqICAgUmV0dXJucyBhbiBlbnVtZXJhdGVkIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X2J1c19kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgICpwOworICBzdHJ1Y3QgYWljN3h4eF9zY2IgICAqc2NiOworICBzdHJ1Y3QgYWljN3h4eF9od3NjYiAqaHNjYjsKKyAgaW50IGNoYW5uZWw7CisgIHVuc2lnbmVkIGNoYXIgc2F2ZWRfc2NicHRyLCBsYXN0cGhhc2U7CisgIHVuc2lnbmVkIGNoYXIgaHNjYl9pbmRleDsKKyAgaW50IGRpc2Nvbm5lY3RlZDsKKyAgc3RydWN0IGFpY19kZXZfZGF0YSAqYWljX2RldjsKKworICBpZihjbWQgPT0gTlVMTCkKKyAgeworICAgIHByaW50ayhLRVJOX0VSUiAiYWljN3h4eF9idXNfZGV2aWNlX3Jlc2V0OiBjYWxsZWQgd2l0aCBOVUxMIGNtZCFcbiIpOworICAgIHJldHVybiBGQUlMRUQ7CisgIH0KKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworICBhaWNfZGV2ID0gQUlDX0RFVihjbWQpOworICBpZihhaWM3eHh4X3Bvc2l0aW9uKGNtZCkgPCBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICBzY2IgPSAocC0+c2NiX2RhdGEtPnNjYl9hcnJheVthaWM3eHh4X3Bvc2l0aW9uKGNtZCldKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUlMRUQ7CisKKyAgaHNjYiA9IHNjYi0+aHNjYjsKKworICBhaWM3eHh4X2lzcihwLT5pcnEsICh2b2lkICopcCwgTlVMTCk7CisgIGFpYzd4eHhfZG9uZV9jbWRzX2NvbXBsZXRlKHApOworICAvKiBJZiB0aGUgY29tbWFuZCB3YXMgYWxyZWFkeSBjb21wbGV0ZSBvciBqdXN0IGNvbXBsZXRlZCwgdGhlbiB3ZSBkaWRuJ3QKKyAgICogZG8gYSByZXNldCwgcmV0dXJuIEZBSUxFRCAqLworICBpZighKHNjYi0+ZmxhZ3MgJiBTQ0JfQUNUSVZFKSkKKyAgICByZXR1cm4gRkFJTEVEOworCisgIHBhdXNlX3NlcXVlbmNlcihwKTsKKyAgbGFzdHBoYXNlID0gYWljX2luYihwLCBMQVNUUEhBU0UpOworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9SRVNFVF9QUk9DRVNTKQorICB7CisgICAgcHJpbnRrKElORk9fTEVBRCAiQnVzIERldmljZSByZXNldCwgc2NiIGZsYWdzIDB4JXgsICIsCisgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIHNjYi0+ZmxhZ3MpOworICAgIHN3aXRjaCAobGFzdHBoYXNlKQorICAgIHsKKyAgICAgIGNhc2UgUF9EQVRBT1VUOgorICAgICAgICBwcmludGsoIkRhdGEtT3V0IHBoYXNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfREFUQUlOOgorICAgICAgICBwcmludGsoIkRhdGEtSW4gcGhhc2VcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9DT01NQU5EOgorICAgICAgICBwcmludGsoIkNvbW1hbmQgcGhhc2VcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUF9NRVNHT1VUOgorICAgICAgICBwcmludGsoIk1lc3NhZ2UtT3V0IHBoYXNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBfU1RBVFVTOgorICAgICAgICBwcmludGsoIlN0YXR1cyBwaGFzZVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQX01FU0dJTjoKKyAgICAgICAgcHJpbnRrKCJNZXNzYWdlLUluIHBoYXNlXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgLyoKKyAgICAgICAqIFdlJ3JlIG5vdCBpbiBhIHZhbGlkIHBoYXNlLCBzbyBhc3N1bWUgd2UncmUgaWRsZS4KKyAgICAgICAqLworICAgICAgICBwcmludGsoIndoaWxlIGlkbGUsIExBU1RQSEFTRSA9IDB4JXhcbiIsIGxhc3RwaGFzZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmludGsoSU5GT19MRUFEICJTQ1NJU0lHSSAweCV4LCBTRVFBRERSIDB4JXgsIFNTVEFUMCAweCV4LCBTU1RBVDEgIgorICAgICAgICAgIjB4JXhcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwKKyAgICAgICAgIGFpY19pbmIocCwgU0NTSVNJR0kpLAorICAgICAgICAgYWljX2luYihwLCBTRVFBRERSMCkgfCAoYWljX2luYihwLCBTRVFBRERSMSkgPDwgOCksCisgICAgICAgICBhaWNfaW5iKHAsIFNTVEFUMCksIGFpY19pbmIocCwgU1NUQVQxKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU0dfQ0FDSEVQVFIgMHgleCwgU1NUQVQyIDB4JXgsIFNUQ05UIDB4JXhcbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICBDVExfT0ZfU0NCKHNjYiksCisgICAgICAgICAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA/IGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpIDogMCwKKyAgICAgICAgIGFpY19pbmIocCwgU1NUQVQyKSwKKyAgICAgICAgIGFpY19pbmIocCwgU1RDTlQgKyAyKSA8PCAxNiB8IGFpY19pbmIocCwgU1RDTlQgKyAxKSA8PCA4IHwKKyAgICAgICAgIGFpY19pbmIocCwgU1RDTlQpKTsKKyAgfQorCisgIGNoYW5uZWwgPSBjbWQtPmRldmljZS0+Y2hhbm5lbDsKKworICAgIC8qCisgICAgICogU2VuZCBhIERldmljZSBSZXNldCBNZXNzYWdlOgorICAgICAqIFRoZSB0YXJnZXQgdGhhdCBpcyBob2xkaW5nIHVwIHRoZSBidXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcworICAgICAqIHRoZSBvbmUgdGhhdCB0cmlnZ2VyZWQgdGhpcyB0aW1lb3V0IChkaWZmZXJlbnQgY29tbWFuZHMgaGF2ZQorICAgICAqIGRpZmZlcmVudCB0aW1lb3V0IGxlbmd0aHMpLiAgT3VyIHN0cmF0ZWd5IGhlcmUgaXMgdG8gcXVldWUgYW4KKyAgICAgKiBhYm9ydCBtZXNzYWdlIHRvIHRoZSB0aW1lZCBvdXQgdGFyZ2V0IGlmIGl0IGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHdlIGhhdmUgYW4gYWN0aXZlIHRhcmdldCB3ZSBzdHVmZiB0aGUgbWVzc2FnZSBidWZmZXIKKyAgICAgKiB3aXRoIGFuIGFib3J0IG1lc3NhZ2UgYW5kIGFzc2VydCBBVE4gaW4gdGhlIGhvcGVzIHRoYXQgdGhlIHRhcmdldAorICAgICAqIHdpbGwgbGV0IGdvIG9mIHRoZSBidXMgYW5kIGdvIHRvIHRoZSBtZXNnb3V0IHBoYXNlLiAgSWYgdGhpcworICAgICAqIGZhaWxzLCB3ZSdsbCBnZXQgYW5vdGhlciB0aW1lb3V0IGEgZmV3IHNlY29uZHMgbGF0ZXIgd2hpY2ggd2lsbAorICAgICAqIGF0dGVtcHQgYSBidXMgcmVzZXQuCisgICAgICovCisgIHNhdmVkX3NjYnB0ciA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgZGlzY29ubmVjdGVkID0gRkFMU0U7CisKKyAgaWYgKGxhc3RwaGFzZSAhPSBQX0JVU0ZSRUUpCisgIHsKKyAgICBpZiAoYWljX2luYihwLCBTQ0JfVEFHKSA+PSBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICB7CisgICAgICBwcmludGsoV0FSTl9MRUFEICJJbnZhbGlkIFNDQiBJRCAlZCBpcyBhY3RpdmUsICIKKyAgICAgICAgICAgICAiU0NCIGZsYWdzID0gMHgleC5cbiIsIHAtPmhvc3Rfbm8sCisgICAgICAgICAgICBDVExfT0ZfQ01EKGNtZCksIHNjYi0+aHNjYi0+dGFnLCBzY2ItPmZsYWdzKTsKKyAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUlMRUQ7CisgICAgfQorICAgIGlmIChzY2ItPmhzY2ItPnRhZyA9PSBhaWNfaW5iKHAsIFNDQl9UQUcpKQorICAgIHsgCisgICAgICBpZiAoIChsYXN0cGhhc2UgPT0gUF9NRVNHT1VUKSB8fCAobGFzdHBoYXNlID09IFBfTUVTR0lOKSApCisgICAgICB7CisgICAgICAgIHByaW50ayhXQVJOX0xFQUQgIkRldmljZSByZXNldCwgTWVzc2FnZSBidWZmZXIgIgorICAgICAgICAgICAgICAgICJpbiB1c2VcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICAgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKwlyZXR1cm4gRkFJTEVEOworICAgICAgfQorCQorICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiRGV2aWNlIHJlc2V0IG1lc3NhZ2UgaW4gIgorICAgICAgICAgICAgICAibWVzc2FnZSBidWZmZXJcbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgICBzY2ItPmZsYWdzIHw9IFNDQl9SRVNFVCB8IFNDQl9ERVZJQ0VfUkVTRVQ7CisgICAgICBhaWM3eHh4X2Vycm9yKGNtZCkgPSBESURfUkVTRVQ7CisgICAgICBhaWNfZGV2LT5mbGFncyB8PSBCVVNfREVWSUNFX1JFU0VUX1BFTkRJTkc7CisgICAgICAvKiBTZW5kIHRoZSBhYm9ydCBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgU0NCLiAqLworICAgICAgYWljX291dGIocCwgSE9TVF9NU0csIE1TR19PVVQpOworICAgICAgYWljX291dGIocCwgbGFzdHBoYXNlIHwgQVROTywgU0NTSVNJR08pOworICAgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworICAgICAgc3Bpbl91bmxvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgICAgICBzc2xlZXAoMSk7CisgICAgICBzcGluX2xvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgICAgICBpZihhaWNfZGV2LT5mbGFncyAmIEJVU19ERVZJQ0VfUkVTRVRfUEVORElORykKKyAgICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgfQorICB9IC8qIGlmIChsYXN0X3BoYXNlICE9IFBfQlVTRlJFRSkuLi4uLmluZGljYXRlcyB3ZSBhcmUgaWRsZSBhbmQgY2FuIHdvcmsgKi8KKyAgLyoKKyAgICogU2ltcGx5IHNldCB0aGUgTUtfTUVTU0FHRSBmbGFnIGFuZCB0aGUgU0VRSU5UIGhhbmRsZXIgd2lsbCBkbworICAgKiB0aGUgcmVzdCBvbiBhIHJlY29ubmVjdC9jb25uZWN0LgorICAgKi8KKyAgc2NiLT5oc2NiLT5jb250cm9sIHw9IE1LX01FU1NBR0U7CisgIHNjYi0+ZmxhZ3MgfD0gU0NCX1JFU0VUIHwgU0NCX0RFVklDRV9SRVNFVDsKKyAgYWljX2Rldi0+ZmxhZ3MgfD0gQlVTX0RFVklDRV9SRVNFVF9QRU5ESU5HOworICAvKgorICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGNvbW1hbmQgaXMgb24gdGhlIHFpbmZpZm8uICBJZiBpdCBpcywgdGhlbiB3ZSB3aWxsCisgICAqIG5vdCBuZWVkIHRvIHF1ZXVlIHRoZSBjb21tYW5kIGFnYWluIHNpbmNlIHRoZSBjYXJkIHNob3VsZCBzdGFydCBpdCBzb29uCisgICAqLworICBpZiAoYWljN3h4eF9zZWFyY2hfcWluZmlmbyhwLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBoc2NiLT50YWcsCisJCQkgIDAsIFRSVUUsIE5VTEwpID09IDApCisgIHsKKyAgICBkaXNjb25uZWN0ZWQgPSBUUlVFOworICAgIGlmICgoaHNjYl9pbmRleCA9IGFpYzd4eHhfZmluZF9zY2IocCwgc2NiKSkgIT0gU0NCX0xJU1RfTlVMTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHNjYl9jb250cm9sOworCisgICAgICBhaWNfb3V0YihwLCBoc2NiX2luZGV4LCBTQ0JQVFIpOworICAgICAgc2NiX2NvbnRyb2wgPSBhaWNfaW5iKHAsIFNDQl9DT05UUk9MKTsKKyAgICAgIC8qCisgICAgICAgKiBJZiB0aGUgRElTQ09OTkVDVEVEIGJpdCBpcyBub3Qgc2V0IGluIFNDQl9DT05UUk9MLCB0aGVuIHdlIGFyZQorICAgICAgICogYWN0dWFsbHkgb24gdGhlIHdhaXRpbmcgbGlzdCwgbm90IGRpc2Nvbm5lY3RlZCwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRvIHJlcXVldWUgdGhlIGNvbW1hbmQuCisgICAgICAgKi8KKyAgICAgIGRpc2Nvbm5lY3RlZCA9IChzY2JfY29udHJvbCAmIERJU0NPTk5FQ1RFRCk7CisgICAgICBhaWNfb3V0YihwLCBzY2JfY29udHJvbCB8IE1LX01FU1NBR0UsIFNDQl9DT05UUk9MKTsKKyAgICB9CisgICAgaWYgKGRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICAvKgorICAgICAgICogQWN0dWFsbHkgcmVxdWV1ZSB0aGlzIFNDQiBpbiBjYXNlIHdlIGNhbiBzZWxlY3QgdGhlCisgICAgICAgKiBkZXZpY2UgYmVmb3JlIGl0IHJlY29ubmVjdHMuICBUaGlzIGNhbiByZXN1bHQgaW4gdGhlIGNvbW1hbmQKKyAgICAgICAqIGJlaW5nIG9uIHRoZSBxaW5maWZvIHR3aWNlLCBidXQgd2UgZG9uJ3QgY2FyZSBiZWNhdXNlIGl0IHdpbGwKKyAgICAgICAqIGFsbCBnZXQgY2xlYW5lZCB1cCBpZi93aGVuIHRoZSByZXNldCB0YWtlcyBwbGFjZS4KKyAgICAgICAqLworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfUkVTRVRfUFJPQ0VTUykKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiUXVldWVpbmcgZGV2aWNlIHJlc2V0IGNvbW1hbmQuXG4iLCBwLT5ob3N0X25vLAorCQkgICAgICBDVExfT0ZfU0NCKHNjYikpOworICAgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworICAgICAgaWYgKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpCisgICAgICAgIGFpY19vdXRiKHAsIHAtPnFpbmZpZm9uZXh0LCBITlNDQl9RT0ZGKTsKKyAgICAgIGVsc2UKKyAgICAgICAgYWljX291dGIocCwgcC0+cWluZmlmb25leHQsIEtFUk5FTF9RSU5QT1MpOworICAgICAgc2NiLT5mbGFncyB8PSBTQ0JfUVVFVUVEX0FCT1JUOworICAgIH0KKyAgfQorICBhaWNfb3V0YihwLCBzYXZlZF9zY2JwdHIsIFNDQlBUUik7CisgIHVucGF1c2Vfc2VxdWVuY2VyKHAsIEZBTFNFKTsKKyAgc3Bpbl91bmxvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgIG1zbGVlcCgxMDAwLzQpOworICBzcGluX2xvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgIGlmKGFpY19kZXYtPmZsYWdzICYgQlVTX0RFVklDRV9SRVNFVF9QRU5ESU5HKQorICAgIHJldHVybiBGQUlMRUQ7CisgIGVsc2UKKyAgICByZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcGFuaWNfYWJvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWJvcnQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9wYW5pY19hYm9ydChzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwLCBTY3NpX0NtbmQgKmNtZCkKK3sKKworICBwcmludGsoImFpYzd4eHggZHJpdmVyIHZlcnNpb24gJXNcbiIsIEFJQzdYWFhfQ19WRVJTSU9OKTsKKyAgcHJpbnRrKCJDb250cm9sbGVyIHR5cGU6XG4gICAgJXNcbiIsIGJvYXJkX25hbWVzW3AtPmJvYXJkX25hbWVfaW5kZXhdKTsKKyAgcHJpbnRrKCJwLT5mbGFncz0weCVseCwgcC0+Y2hpcD0weCV4LCBwLT5mZWF0dXJlcz0weCV4LCAiCisgICAgICAgICAic2VxdWVuY2VyICVzIHBhdXNlZFxuIiwKKyAgICAgcC0+ZmxhZ3MsIHAtPmNoaXAsIHAtPmZlYXR1cmVzLAorICAgIChhaWNfaW5iKHAsIEhDTlRSTCkgJiBQQVVTRSkgPyAiaXMiIDogImlzbid0IiApOworICBwYXVzZV9zZXF1ZW5jZXIocCk7CisgIGRpc2FibGVfaXJxKHAtPmlycSk7CisgIGFpYzd4eHhfcHJpbnRfY2FyZChwKTsKKyAgYWljN3h4eF9wcmludF9zY3JhdGNoX3JhbShwKTsKKyAgc3Bpbl91bmxvY2tfaXJxKHAtPmhvc3QtPmhvc3RfbG9jayk7CisgIGZvcig7OykgYmFycmllcigpOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfYWJvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQWJvcnQgdGhlIGN1cnJlbnQgU0NTSSBjb21tYW5kKHMpLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X2Fib3J0KFNjc2lfQ21uZCAqY21kKQoreworICBzdHJ1Y3QgYWljN3h4eF9zY2IgICpzY2IgPSBOVUxMOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICBpbnQgICAgZm91bmQ9MCwgZGlzY29ubmVjdGVkOworICB1bnNpZ25lZCBjaGFyIHNhdmVkX2hzY2JwdHIsIGhzY2JwdHIsIHNjYl9jb250cm9sOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIGlmKGNtZCA9PSBOVUxMKQorICB7CisgICAgcHJpbnRrKEtFUk5fRVJSICJhaWM3eHh4X2Fib3J0OiBjYWxsZWQgd2l0aCBOVUxMIGNtZCFcbiIpOworICAgIHJldHVybiBGQUlMRUQ7CisgIH0KKyAgcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworICBhaWNfZGV2ID0gQUlDX0RFVihjbWQpOworICBpZihhaWM3eHh4X3Bvc2l0aW9uKGNtZCkgPCBwLT5zY2JfZGF0YS0+bnVtc2NicykKKyAgICBzY2IgPSAocC0+c2NiX2RhdGEtPnNjYl9hcnJheVthaWM3eHh4X3Bvc2l0aW9uKGNtZCldKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUlMRUQ7CisKKyAgYWljN3h4eF9pc3IocC0+aXJxLCAodm9pZCAqKXAsIE5VTEwpOworICBhaWM3eHh4X2RvbmVfY21kc19jb21wbGV0ZShwKTsKKyAgLyogSWYgdGhlIGNvbW1hbmQgd2FzIGFscmVhZHkgY29tcGxldGUgb3IganVzdCBjb21wbGV0ZWQsIHRoZW4gd2UgZGlkbid0CisgICAqIGRvIGEgcmVzZXQsIHJldHVybiBGQUlMRUQgKi8KKyAgaWYoIShzY2ItPmZsYWdzICYgU0NCX0FDVElWRSkpCisgICAgcmV0dXJuIEZBSUxFRDsKKworICBwYXVzZV9zZXF1ZW5jZXIocCk7CisKKyAgLyoKKyAgICogSSBhZGRlZCBhIG5ldyBjb25maWcgb3B0aW9uIHRvIHRoZSBkcml2ZXI6ICJwYW5pY19vbl9hYm9ydCIgdGhhdCB3aWxsCisgICAqIGNhdXNlIHRoZSBkcml2ZXIgdG8gcGFuaWMgYW5kIHRoZSBtYWNoaW5lIHRvIHN0b3Agb24gdGhlIGZpcnN0IGFib3J0CisgICAqIG9yIHJlc2V0IGNhbGwgaW50byB0aGUgZHJpdmVyLiAgQXQgdGhhdCBwb2ludCwgaXQgcHJpbnRzIG91dCBhIGxvdCBvZgorICAgKiB1c2VmdWwgaW5mb3JtYXRpb24gZm9yIG1lIHdoaWNoIEkgY2FuIHRoZW4gdXNlIHRvIHRyeSBhbmQgZGVidWcgdGhlCisgICAqIHByb2JsZW0uICBTaW1wbHkgZW5hYmxlIHRoZSBib290IHRpbWUgcHJvbXB0IGluIG9yZGVyIHRvIGFjdGl2YXRlIHRoaXMKKyAgICogY29kZS4KKyAgICovCisgIGlmIChhaWM3eHh4X3BhbmljX29uX2Fib3J0KQorICAgIGFpYzd4eHhfcGFuaWNfYWJvcnQocCwgY21kKTsKKworICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9BQk9SVCkKKyAgeworICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0aW5nIHNjYiAlZCwgZmxhZ3MgMHgleCwgU0VRQUREUiAweCV4LCBMQVNUUEhBU0UgIgorICAgICAgICAgICAiMHgleFxuIiwKKyAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgc2NiLT5oc2NiLT50YWcsIHNjYi0+ZmxhZ3MsCisgICAgICAgICBhaWNfaW5iKHAsIFNFUUFERFIwKSB8IChhaWNfaW5iKHAsIFNFUUFERFIxKSA8PCA4KSwKKyAgICAgICAgIGFpY19pbmIocCwgTEFTVFBIQVNFKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU0dfQ0FDSEVQVFIgMHgleCwgU0dfQ09VTlQgJWQsIFNDU0lTSUdJIDB4JXhcbiIsCisgICAgICAgICBwLT5ob3N0X25vLCBDVExfT0ZfU0NCKHNjYiksIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID8KKyAgICAgICAgIGFpY19pbmIocCwgU0dfQ0FDSEVQVFIpIDogMCwgYWljX2luYihwLCBTR19DT1VOVCksCisgICAgICAgICBhaWNfaW5iKHAsIFNDU0lTSUdJKSk7CisgICAgcHJpbnRrKElORk9fTEVBRCAiU1NUQVQwIDB4JXgsIFNTVEFUMSAweCV4LCBTU1RBVDIgMHgleFxuIiwKKyAgICAgICAgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSwgYWljX2luYihwLCBTU1RBVDApLAorICAgICAgICAgYWljX2luYihwLCBTU1RBVDEpLCBhaWNfaW5iKHAsIFNTVEFUMikpOworICB9CisKKyAgaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfV0FJVElOR1EpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9BQk9SVF9QUk9DRVNTKSAKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgIlNDQiBmb3VuZCBvbiB3YWl0aW5nIGxpc3QgYW5kICIKKyAgICAgICAgICAiYWJvcnRlZC5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgc2NicV9yZW1vdmUoJnAtPndhaXRpbmdfc2Nicywgc2NiKTsKKyAgICBzY2JxX3JlbW92ZSgmYWljX2Rldi0+ZGVsYXllZF9zY2JzLCBzY2IpOworICAgIGFpY19kZXYtPmFjdGl2ZV9jbWRzKys7CisgICAgcC0+YWN0aXZlc2NicysrOworICAgIHNjYi0+ZmxhZ3MgJj0gfihTQ0JfV0FJVElOR1EgfCBTQ0JfQUNUSVZFKTsKKyAgICBzY2ItPmZsYWdzIHw9IFNDQl9BQk9SVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgZ290byBzdWNjZXNzOworICB9CisKKy8qCisgKiAgV2UganVzdCBjaGVja2VkIHRoZSB3YWl0aW5nX3EsIG5vdyBmb3IgdGhlIFFJTkZJRk8KKyAqLworICBpZiAoICgoZm91bmQgPSBhaWM3eHh4X3NlYXJjaF9xaW5maWZvKHAsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICBjbWQtPmRldmljZS0+bHVuLCBzY2ItPmhzY2ItPnRhZywgU0NCX0FCT1JUIHwgU0NCX1FVRVVFRF9GT1JfRE9ORSwKKyAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBOVUxMKSkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUFJPQ0VTUykpCisgIHsKKyAgICBwcmludGsoSU5GT19MRUFEICJTQ0IgZm91bmQgaW4gUUlORklGTyBhbmQgYWJvcnRlZC5cbiIsIHAtPmhvc3Rfbm8sCisJCSAgICBDVExfT0ZfU0NCKHNjYikpOworICAgIGdvdG8gc3VjY2VzczsKKyAgfQorCisvKgorICogIFFJTkZJRk8sIHdhaXRpbmdxLCBjb21wbGV0ZXEgZG9uZS4gIE5leHQsIGNoZWNrIFdBSVRJTkdfU0NCIGxpc3QgaW4gY2FyZAorICovCisKKyAgc2F2ZWRfaHNjYnB0ciA9IGFpY19pbmIocCwgU0NCUFRSKTsKKyAgaWYgKChoc2NicHRyID0gYWljN3h4eF9maW5kX3NjYihwLCBzY2IpKSAhPSBTQ0JfTElTVF9OVUxMKQorICB7CisgICAgYWljX291dGIocCwgaHNjYnB0ciwgU0NCUFRSKTsKKyAgICBzY2JfY29udHJvbCA9IGFpY19pbmIocCwgU0NCX0NPTlRST0wpOworICAgIGRpc2Nvbm5lY3RlZCA9IHNjYl9jb250cm9sICYgRElTQ09OTkVDVEVEOworICAgIC8qCisgICAgICogSWYgdGhlIERJU0NPTk5FQ1RFRCBiaXQgaXMgbm90IHNldCBpbiBTQ0JfQ09OVFJPTCwgdGhlbiB3ZSBhcmUKKyAgICAgKiBlaXRoZXIgY3VycmVudGx5IGFjdGl2ZSBvciBvbiB0aGUgd2FpdGluZyBsaXN0LgorICAgICAqLworICAgIGlmKCFkaXNjb25uZWN0ZWQgJiYgYWljX2luYihwLCBMQVNUUEhBU0UpID09IFBfQlVTRlJFRSkgeworICAgICAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUFJPQ0VTUykKKyAgICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NCIGZvdW5kIG9uIGhhcmR3YXJlIHdhaXRpbmciCisgICAgICAgICAgIiBsaXN0IGFuZCBhYm9ydGVkLlxuIiwgcC0+aG9zdF9ubywgQ1RMX09GX1NDQihzY2IpKTsKKyAgICAgIC8qIElmIHdlIGFyZSB0aGUgb25seSB3YWl0aW5nIGNvbW1hbmQsIHN0b3AgdGhlIHNlbGVjdGlvbiBlbmdpbmUgKi8KKyAgICAgIGlmIChhaWNfaW5iKHAsIFdBSVRJTkdfU0NCSCkgPT0gaHNjYnB0ciAmJiBhaWNfaW5iKHAsIFNDQl9ORVhUKSA9PQorCQkJU0NCX0xJU1RfTlVMTCkKKyAgICAgIHsKKyAgICAgICAgYWljX291dGIocCwgYWljX2luYihwLCBTQ1NJU0VRKSAmIH5FTlNFTE8sIFNDU0lTRVEpOworICAgICAgICBhaWNfb3V0YihwLCBDTFJTRUxUSU1FTywgQ0xSU0lOVDEpOworCWFpY19vdXRiKHAsIFNDQl9MSVNUX05VTEwsIFdBSVRJTkdfU0NCSCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBwcmV2LCBuZXh0OworCXByZXYgPSBTQ0JfTElTVF9OVUxMOworCW5leHQgPSBhaWNfaW5iKHAsIFdBSVRJTkdfU0NCSCk7CisJd2hpbGUobmV4dCAhPSBTQ0JfTElTVF9OVUxMKQorCXsKKwkgIGFpY19vdXRiKHAsIG5leHQsIFNDQlBUUik7CisJICBpZiAobmV4dCA9PSBoc2NicHRyKQorCSAgeworCSAgICBuZXh0ID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisJICAgIGlmIChwcmV2ICE9IFNDQl9MSVNUX05VTEwpCisJICAgIHsKKwkgICAgICBhaWNfb3V0YihwLCBwcmV2LCBTQ0JQVFIpOworCSAgICAgIGFpY19vdXRiKHAsIG5leHQsIFNDQl9ORVhUKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgICAgYWljX291dGIocCwgbmV4dCwgV0FJVElOR19TQ0JIKTsKKwkgICAgYWljX291dGIocCwgaHNjYnB0ciwgU0NCUFRSKTsKKwkgICAgbmV4dCA9IFNDQl9MSVNUX05VTEw7CisJICB9CisJICBlbHNlCisJICB7CisJICAgIHByZXYgPSBuZXh0OworCSAgICBuZXh0ID0gYWljX2luYihwLCBTQ0JfTkVYVCk7CisJICB9CisJfQorICAgICAgfQorICAgICAgYWljX291dGIocCwgU0NCX0xJU1RfTlVMTCwgU0NCX1RBRyk7CisgICAgICBhaWNfb3V0YihwLCAwLCBTQ0JfQ09OVFJPTCk7CisgICAgICBhaWM3eHh4X2FkZF9jdXJzY2JfdG9fZnJlZV9saXN0KHApOworICAgICAgc2NiLT5mbGFncyA9IFNDQl9BQk9SVCB8IFNDQl9RVUVVRURfRk9SX0RPTkU7CisgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfQorICAgIGVsc2UgaWYgKCFkaXNjb25uZWN0ZWQpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFdlIGFyZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb21tYW5kCisgICAgICAgKi8KKyAgICAgIGlmKChhaWNfaW5iKHAsIExBU1RQSEFTRSkgPT0gUF9NRVNHSU4pIHx8CisJIChhaWNfaW5iKHAsIExBU1RQSEFTRSkgPT0gUF9NRVNHT1VUKSkKKyAgICAgIHsKKwkvKgorCSAqIE1lc3NhZ2UgYnVmZmVyIGJ1c3ksIHVuYWJsZSB0byBhYm9ydAorCSAqLworCXByaW50ayhJTkZPX0xFQUQgIm1lc3NhZ2UgYnVmZmVyIGJ1c3ksIHVuYWJsZSB0byBhYm9ydC5cbiIsCisJCQkgIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisJdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworCXJldHVybiBGQUlMRUQ7CisgICAgICB9CisgICAgICAvKiBGYWxsdGhyb3VnaCB0byBiZWxvdywgc2V0IEFUTk8gYWZ0ZXIgd2Ugc2V0IFNDQl9DT05UUk9MICovCisgICAgfSAKKyAgICBhaWNfb3V0YihwLCAgc2NiX2NvbnRyb2wgfCBNS19NRVNTQUdFLCBTQ0JfQ09OVFJPTCk7CisgICAgaWYoIWRpc2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICBhaWNfb3V0YihwLCBIT1NUX01TRywgTVNHX09VVCk7CisgICAgICBhaWNfb3V0YihwLCBhaWNfaW5iKHAsIFNDU0lTSUdJKSB8IEFUTk8sIFNDU0lTSUdPKTsKKyAgICB9CisgICAgYWljX291dGIocCwgc2F2ZWRfaHNjYnB0ciwgU0NCUFRSKTsKKyAgfSAKKyAgZWxzZQorICB7CisgICAgLyoKKyAgICAgKiBUaGUgc2NiIGlzbid0IGluIHRoZSBjYXJkIGF0IGFsbCBhbmQgaXQgaXMgYWN0aXZlIGFuZCBpdCBpc24ndCBpbgorICAgICAqIGFueSBvZiB0aGUgcXVldWVzLCBzbyBpdCBtdXN0IGJlIGRpc2Nvbm5lY3RlZCBhbmQgcGFnZWQgb3V0LiAgRmFsbAorICAgICAqIHRocm91Z2ggdG8gdGhlIGNvZGUgYmVsb3cuCisgICAgICovCisgICAgZGlzY29ubmVjdGVkID0gMTsKKyAgfQorICAgICAgICAKKyAgcC0+ZmxhZ3MgfD0gQUhDX0FCT1JUX1BFTkRJTkc7CisgIHNjYi0+ZmxhZ3MgfD0gU0NCX1FVRVVFRF9BQk9SVCB8IFNDQl9BQk9SVCB8IFNDQl9SRUNPVkVSWV9TQ0I7CisgIHNjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOworICBpZihkaXNjb25uZWN0ZWQpCisgIHsKKyAgICBpZiAoYWljN3h4eF92ZXJib3NlICYgVkVSQk9TRV9BQk9SVF9QUk9DRVNTKQorICAgICAgcHJpbnRrKElORk9fTEVBRCAiU0NCIGRpc2Nvbm5lY3RlZC4gIFF1ZXVlaW5nIEFib3J0IgorICAgICAgICAiIFNDQi5cbiIsIHAtPmhvc3Rfbm8sIENUTF9PRl9TQ0Ioc2NiKSk7CisgICAgcC0+cWluZmlmb1twLT5xaW5maWZvbmV4dCsrXSA9IHNjYi0+aHNjYi0+dGFnOworICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKQorICAgICAgYWljX291dGIocCwgcC0+cWluZmlmb25leHQsIEhOU0NCX1FPRkYpOworICAgIGVsc2UKKyAgICAgIGFpY19vdXRiKHAsIHAtPnFpbmZpZm9uZXh0LCBLRVJORUxfUUlOUE9TKTsKKyAgfQorICB1bnBhdXNlX3NlcXVlbmNlcihwLCBGQUxTRSk7CisgIHNwaW5fdW5sb2NrX2lycShwLT5ob3N0LT5ob3N0X2xvY2spOworICBtc2xlZXAoMTAwMC80KTsKKyAgc3Bpbl9sb2NrX2lycShwLT5ob3N0LT5ob3N0X2xvY2spOworICBpZiAocC0+ZmxhZ3MgJiBBSENfQUJPUlRfUEVORElORykKKyAgeworICAgIGlmIChhaWM3eHh4X3ZlcmJvc2UgJiBWRVJCT1NFX0FCT1JUX1JFVFVSTikKKyAgICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0IG5ldmVyIGRlbGl2ZXJlZCwgcmV0dXJuaW5nIEZBSUxFRFxuIiwgcC0+aG9zdF9ubywKKwkJICAgIENUTF9PRl9DTUQoY21kKSk7CisgICAgcC0+ZmxhZ3MgJj0gfkFIQ19BQk9SVF9QRU5ESU5HOworICAgIHJldHVybiBGQUlMRUQ7CisgIH0KKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUkVUVVJOKQorICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0IHN1Y2Nlc3NmdWwuXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfQ01EKGNtZCkpOworICByZXR1cm4gU1VDQ0VTUzsKKworc3VjY2VzczoKKyAgaWYgKGFpYzd4eHhfdmVyYm9zZSAmIFZFUkJPU0VfQUJPUlRfUkVUVVJOKQorICAgIHByaW50ayhJTkZPX0xFQUQgIkFib3J0IHN1Y2Nlc3NmdWwuXG4iLCBwLT5ob3N0X25vLCBDVExfT0ZfQ01EKGNtZCkpOworICBhaWM3eHh4X3J1bl9kb25lX3F1ZXVlKHAsIFRSVUUpOworICB1bnBhdXNlX3NlcXVlbmNlcihwLCBGQUxTRSk7CisgIHJldHVybiBTVUNDRVNTOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmVzZXR0aW5nIHRoZSBidXMgYWx3YXlzIHN1Y2NlZWRzIC0gaXMgaGFzIHRvLCBvdGhlcndpc2UgdGhlCisgKiAgIGtlcm5lbCB3aWxsIHBhbmljISBUcnkgYSBzdXJnaWNhbCB0ZWNobmlxdWUgLSBzZW5kaW5nIGEgQlVTCisgKiAgIERFVklDRSBSRVNFVCBtZXNzYWdlIC0gb24gdGhlIG9mZmVuZGluZyB0YXJnZXQgYmVmb3JlIHB1bGxpbmcKKyAqICAgdGhlIFNDU0kgYnVzIHJlc2V0IGxpbmUuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisgIHN0cnVjdCBhaWM3eHh4X3NjYiAqc2NiOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworCisgIHAgPSAoc3RydWN0IGFpYzd4eHhfaG9zdCAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisgIGFpY19kZXYgPSBBSUNfREVWKGNtZCk7CisgIGlmKGFpYzd4eHhfcG9zaXRpb24oY21kKSA8IHAtPnNjYl9kYXRhLT5udW1zY2JzKQorICB7CisgICAgc2NiID0gKHAtPnNjYl9kYXRhLT5zY2JfYXJyYXlbYWljN3h4eF9wb3NpdGlvbihjbWQpXSk7CisgICAgaWYgKHNjYi0+Y21kICE9IGNtZCkKKyAgICAgIHNjYiA9IE5VTEw7CisgIH0KKyAgZWxzZQorICB7CisgICAgc2NiID0gTlVMTDsKKyAgfQorCisgIC8qCisgICAqIEkgYWRkZWQgYSBuZXcgY29uZmlnIG9wdGlvbiB0byB0aGUgZHJpdmVyOiAicGFuaWNfb25fYWJvcnQiIHRoYXQgd2lsbAorICAgKiBjYXVzZSB0aGUgZHJpdmVyIHRvIHBhbmljIGFuZCB0aGUgbWFjaGluZSB0byBzdG9wIG9uIHRoZSBmaXJzdCBhYm9ydAorICAgKiBvciByZXNldCBjYWxsIGludG8gdGhlIGRyaXZlci4gIEF0IHRoYXQgcG9pbnQsIGl0IHByaW50cyBvdXQgYSBsb3Qgb2YKKyAgICogdXNlZnVsIGluZm9ybWF0aW9uIGZvciBtZSB3aGljaCBJIGNhbiB0aGVuIHVzZSB0byB0cnkgYW5kIGRlYnVnIHRoZQorICAgKiBwcm9ibGVtLiAgU2ltcGx5IGVuYWJsZSB0aGUgYm9vdCB0aW1lIHByb21wdCBpbiBvcmRlciB0byBhY3RpdmF0ZSB0aGlzCisgICAqIGNvZGUuCisgICAqLworICBpZiAoYWljN3h4eF9wYW5pY19vbl9hYm9ydCkKKyAgICBhaWM3eHh4X3BhbmljX2Fib3J0KHAsIGNtZCk7CisKKyAgcGF1c2Vfc2VxdWVuY2VyKHApOworCisgIHdoaWxlKChhaWNfaW5iKHAsIElOVFNUQVQpICYgSU5UX1BFTkQpICYmICEocC0+ZmxhZ3MgJiBBSENfSU5fSVNSKSkKKyAgeworICAgIGFpYzd4eHhfaXNyKHAtPmlycSwgcCwgKHZvaWQgKilOVUxMICk7CisgICAgcGF1c2Vfc2VxdWVuY2VyKHApOworICB9CisgIGFpYzd4eHhfZG9uZV9jbWRzX2NvbXBsZXRlKHApOworCisgIGlmKHNjYiAmJiAoc2NiLT5jbWQgPT0gTlVMTCkpCisgIHsKKyAgICAvKgorICAgICAqIFdlIGp1c3QgY29tcGxldGVkIHRoZSBjb21tYW5kIHdoZW4gd2UgcmFuIHRoZSBpc3Igc3R1ZmYsIHNvIHdlIG5vCisgICAgICogbG9uZ2VyIGhhdmUgaXQuCisgICAgICovCisgICAgdW5wYXVzZV9zZXF1ZW5jZXIocCwgRkFMU0UpOworICAgIHJldHVybiBTVUNDRVNTOworICB9CisgICAgCisvKgorICogIEJ5IHRoaXMgcG9pbnQsIHdlIHdhbnQgdG8gYWxyZWFkeSBrbm93IHdoYXQgd2UgYXJlIGdvaW5nIHRvIGRvIGFuZAorICogIG9ubHkgaGF2ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW1wbGVtZW50IG91ciBjb3Vyc2Ugb2YgYWN0aW9uLgorICovCisgIGFpYzd4eHhfcmVzZXRfY2hhbm5lbChwLCBjbWQtPmRldmljZS0+Y2hhbm5lbCwgVFJVRSk7CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19UV0lOKQorICB7CisgICAgYWljN3h4eF9yZXNldF9jaGFubmVsKHAsIGNtZC0+ZGV2aWNlLT5jaGFubmVsIF4gMHgwMSwgVFJVRSk7CisgICAgcmVzdGFydF9zZXF1ZW5jZXIocCk7CisgIH0KKyAgYWljX291dGIocCwgIGFpY19pbmIocCwgU0lNT0RFMSkgJiB+KEVOUkVRSU5JVHxFTkJVU0ZSRUUpLCBTSU1PREUxKTsKKyAgYWljN3h4eF9jbGVhcl9pbnRzdGF0KHApOworICBwLT5mbGFncyAmPSB+QUhDX0hBTkRMSU5HX1JFUUlOSVRTOworICBwLT5tc2dfdHlwZSA9IE1TR19UWVBFX05PTkU7CisgIHAtPm1zZ19pbmRleCA9IDA7CisgIHAtPm1zZ19sZW4gPSAwOworICBhaWM3eHh4X3J1bl9kb25lX3F1ZXVlKHAsIFRSVUUpOworICB1bnBhdXNlX3NlcXVlbmNlcihwLCBGQUxTRSk7CisgIHNwaW5fdW5sb2NrX2lycShwLT5ob3N0LT5ob3N0X2xvY2spOworICBzc2xlZXAoMik7CisgIHNwaW5fbG9ja19pcnEocC0+aG9zdC0+aG9zdF9sb2NrKTsKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9iaW9zcGFyYW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmV0dXJuIHRoZSBkaXNrIGdlb21ldHJ5IGZvciB0aGUgZ2l2ZW4gU0NTSSBkZXZpY2UuCisgKgorICogTm90ZToKKyAqICAgVGhpcyBmdW5jdGlvbiBpcyBicm9rZW4gZm9yIHRvZGF5J3MgcmVhbGx5IGxhcmdlIGRyaXZlcyBhbmQgbmVlZHMKKyAqICAgZml4ZWQuCisgKi1GKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2FpYzd4eHhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisgIHNlY3Rvcl90IGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisgIGludCByZXQ7CisgIHN0cnVjdCBhaWM3eHh4X2hvc3QgKnA7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworICBwID0gKHN0cnVjdCBhaWM3eHh4X2hvc3QgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisgIGJ1ZiA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7CisKKyAgaWYgKCBidWYgKQorICB7CisgICAgcmV0ID0gc2NzaV9wYXJ0c2l6ZShidWYsIGNhcGFjaXR5LCAmZ2VvbVsyXSwgJmdlb21bMF0sICZnZW9tWzFdKTsKKyAgICBrZnJlZShidWYpOworICAgIGlmICggcmV0ICE9IC0xICkKKyAgICAgIHJldHVybihyZXQpOworICB9CisgIAorICBoZWFkcyA9IDY0OworICBzZWN0b3JzID0gMzI7CisgIGN5bGluZGVycyA9IGNhcGFjaXR5ID4+IDExOworCisgIGlmICgocC0+ZmxhZ3MgJiBBSENfRVhURU5EX1RSQU5TX0EpICYmIChjeWxpbmRlcnMgPiAxMDI0KSkKKyAgeworICAgIGhlYWRzID0gMjU1OworICAgIHNlY3RvcnMgPSA2MzsKKyAgICBjeWxpbmRlcnMgPSBjYXBhY2l0eSA+PiAxNDsKKyAgICBpZihjYXBhY2l0eSA+ICg2NTUzNSAqIGhlYWRzICogc2VjdG9ycykpCisgICAgICBjeWxpbmRlcnMgPSA2NTUzNTsKKyAgICBlbHNlCisgICAgICBjeWxpbmRlcnMgPSAoKHVuc2lnbmVkIGludCljYXBhY2l0eSkgLyAodW5zaWduZWQgaW50KShoZWFkcyAqIHNlY3RvcnMpOworICB9CisKKyAgZ2VvbVswXSA9IChpbnQpaGVhZHM7CisgIGdlb21bMV0gPSAoaW50KXNlY3RvcnM7CisgIGdlb21bMl0gPSAoaW50KWN5bGluZGVyczsKKworICByZXR1cm4gKDApOworfQorCisvKitGKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246CisgKiAgIGFpYzd4eHhfcmVsZWFzZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBGcmVlIHRoZSBwYXNzZWQgaW4gU2NzaV9Ib3N0IG1lbW9yeSBzdHJ1Y3R1cmVzIHByaW9yIHRvIHVubG9hZGluZyB0aGUKKyAqICAgbW9kdWxlLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKyAgc3RydWN0IGFpYzd4eHhfaG9zdCAqcCA9IChzdHJ1Y3QgYWljN3h4eF9ob3N0ICopIGhvc3QtPmhvc3RkYXRhOworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpuZXh0LCAqcHJldjsKKworICBpZihwLT5pcnEpCisgICAgZnJlZV9pcnEocC0+aXJxLCBwKTsKKyNpZmRlZiBNTUFQSU8KKyAgaWYocC0+bWFkZHIpCisgIHsKKyAgICBpb3VubWFwKHAtPm1hZGRyKTsKKyAgfQorI2VuZGlmIC8qIE1NQVBJTyAqLworICBpZighcC0+cGRldikKKyAgICByZWxlYXNlX3JlZ2lvbihwLT5iYXNlLCBNQVhSRUcgLSBNSU5SRUcpOworI2lmZGVmIENPTkZJR19QQ0kKKyAgZWxzZQorICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocC0+cGRldik7CisjZW5kaWYKKyAgcHJldiA9IE5VTEw7CisgIG5leHQgPSBmaXJzdF9haWM3eHh4OworICB3aGlsZShuZXh0ICE9IE5VTEwpCisgIHsKKyAgICBpZihuZXh0ID09IHApCisgICAgeworICAgICAgaWYocHJldiA9PSBOVUxMKQorICAgICAgICBmaXJzdF9haWM3eHh4ID0gbmV4dC0+bmV4dDsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJldi0+bmV4dCA9IG5leHQtPm5leHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmV2ID0gbmV4dDsKKyAgICB9CisgICAgbmV4dCA9IG5leHQtPm5leHQ7CisgIH0KKyAgYWljN3h4eF9mcmVlKHApOworICByZXR1cm4oMCk7Cit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcmludF9jYXJkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFByaW50IG91dCBhbGwgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBjYXJkCisgKgorICogICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgc2FmZSBmb3IgdXNlIG9uIHRoZSBWTEIgYW5kIEVJU0EKKyAqICAgY29udHJvbGxlcnMsIHNvIGl0IGlzbid0IHVzZWQgb24gdGhvc2UgY29udHJvbGxlcnMgYXQgYWxsLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYWljN3h4eF9wcmludF9jYXJkKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisgIGludCBpLCBqLCBrLCBjaGlwOworICBzdGF0aWMgc3RydWN0IHJlZ2lzdGVyX3JhbmdlcyB7CisgICAgaW50IG51bV9yYW5nZXM7CisgICAgaW50IHJhbmdlX3ZhbFszMl07CisgIH0gY2FyZHNfZHNbXSA9IHsKKyAgICB7IDAsIHswLH0gfSwgLyogbm9uZSAqLworICAgIHsxMCwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MTksIDB4MWYsIDB4MWYsIDB4NjAsIDB4NjAsIC8qNzc3MSovCisgICAgICAgICAgMHg2MiwgMHg2NiwgMHg4MCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YiwgMHg5Zn0gfSwKKyAgICB7IDksIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDFmLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAvKjc4NTAqLworICAgICAgICAgIDB4ODAsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWZ9IH0sCisgICAgeyA5LCB7MHgwMCwgMHgwNSwgMHgwOCwgMHgxMSwgMHgxOCwgMHgxZiwgMHg2MCwgMHg2MCwgMHg2MiwgMHg2NiwgLyo3ODYwKi8KKyAgICAgICAgICAweDgwLCAweDhlLCAweDkwLCAweDk1LCAweDk3LCAweDk3LCAweDlhLCAweDlmfSB9LAorICAgIHsxMCwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MTksIDB4MWMsIDB4MWYsIDB4NjAsIDB4NjAsIC8qNzg3MCovCisgICAgICAgICAgMHg2MiwgMHg2NiwgMHg4MCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YSwgMHg5Zn0gfSwKKyAgICB7MTAsIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDFhLCAweDFjLCAweDFmLCAweDYwLCAweDYwLCAvKjc4ODAqLworICAgICAgICAgIDB4NjIsIDB4NjYsIDB4ODAsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWZ9IH0sCisgICAgezE2LCB7MHgwMCwgMHgwNSwgMHgwOCwgMHgxMSwgMHgxOCwgMHgxZiwgMHg2MCwgMHg2MCwgMHg2MiwgMHg2NiwgLyo3ODkwKi8KKyAgICAgICAgICAweDg0LCAweDhlLCAweDkwLCAweDk1LCAweDk3LCAweDk3LCAweDlhLCAweDlhLCAweDlmLCAweDlmLAorICAgICAgICAgIDB4ZTAsIDB4ZjEsIDB4ZjQsIDB4ZjQsIDB4ZjYsIDB4ZjYsIDB4ZjgsIDB4ZjgsIDB4ZmEsIDB4ZmMsCisgICAgICAgICAgMHhmZSwgMHhmZn0gfSwKKyAgICB7MTIsIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDE5LCAweDFiLCAweDFmLCAweDYwLCAweDYwLCAvKjc4OTUqLworICAgICAgICAgIDB4NjIsIDB4NjYsIDB4ODAsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWEsCisgICAgICAgICAgMHg5ZiwgMHg5ZiwgMHhlMCwgMHhmMX0gfSwKKyAgICB7MTYsIHsweDAwLCAweDA1LCAweDA4LCAweDExLCAweDE4LCAweDFmLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAvKjc4OTYqLworICAgICAgICAgIDB4ODQsIDB4OGUsIDB4OTAsIDB4OTUsIDB4OTcsIDB4OTcsIDB4OWEsIDB4OWEsIDB4OWYsIDB4OWYsCisgICAgICAgICAgMHhlMCwgMHhmMSwgMHhmNCwgMHhmNCwgMHhmNiwgMHhmNiwgMHhmOCwgMHhmOCwgMHhmYSwgMHhmYywKKyAgICAgICAgICAweGZlLCAweGZmfSB9LAorICAgIHsxMiwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MWYsIDB4NjAsIDB4NjAsIDB4NjIsIDB4NjYsIC8qNzg5MiovCisgICAgICAgICAgMHg4NCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YSwgMHg5YSwgMHg5YywgMHg5ZiwKKyAgICAgICAgICAweGUwLCAweGYxLCAweGY0LCAweGZjfSB9LAorICAgIHsxMiwgezB4MDAsIDB4MDUsIDB4MDgsIDB4MTEsIDB4MTgsIDB4MWYsIDB4NjAsIDB4NjAsIDB4NjIsIDB4NjYsIC8qNzg5OSovCisgICAgICAgICAgMHg4NCwgMHg4ZSwgMHg5MCwgMHg5NSwgMHg5NywgMHg5NywgMHg5YSwgMHg5YSwgMHg5YywgMHg5ZiwKKyAgICAgICAgICAweGUwLCAweGYxLCAweGY0LCAweGZjfSB9LAorICB9OworICBjaGlwID0gcC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSzsKKyAgcHJpbnRrKCIlcyBhdCAiLAorICAgICAgICAgYm9hcmRfbmFtZXNbcC0+Ym9hcmRfbmFtZV9pbmRleF0pOworICBzd2l0Y2gocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spCisgIHsKKyAgICBjYXNlIEFIQ19WTDoKKyAgICAgIHByaW50aygiVkxCIFNsb3QgJWQuXG4iLCBwLT5wY2lfZGV2aWNlX2ZuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUhDX0VJU0E6CisgICAgICBwcmludGsoIkVJU0EgU2xvdCAlZC5cbiIsIHAtPnBjaV9kZXZpY2VfZm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBSENfUENJOgorICAgIGRlZmF1bHQ6CisgICAgICBwcmludGsoIlBDSSAlZC8lZC8lZC5cbiIsIHAtPnBjaV9idXMsIFBDSV9TTE9UKHAtPnBjaV9kZXZpY2VfZm4pLAorICAgICAgICAgICAgIFBDSV9GVU5DKHAtPnBjaV9kZXZpY2VfZm4pKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyoKKyAgICogdGhlIHJlZ2lzdGVycyBvbiB0aGUgY2FyZC4uLi4KKyAgICovCisgIHByaW50aygiQ2FyZCBEdW1wOlxuIik7CisgIGsgPSAwOworICBmb3IoaT0wOyBpPGNhcmRzX2RzW2NoaXBdLm51bV9yYW5nZXM7IGkrKykKKyAgeworICAgIGZvcihqICA9IGNhcmRzX2RzW2NoaXBdLnJhbmdlX3ZhbFsgaSAqIDIgXTsKKyAgICAgICAgaiA8PSBjYXJkc19kc1tjaGlwXS5yYW5nZV92YWxbIGkgKiAyICsgMSBdIDsKKyAgICAgICAgaisrKQorICAgIHsKKyAgICAgIHByaW50aygiJTAyeDolMDJ4ICIsIGosIGFpY19pbmIocCwgaikpOworICAgICAgaWYoKytrID09IDEzKQorICAgICAgeworICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIGs9MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoayAhPSAwKQorICAgIHByaW50aygiXG4iKTsKKworICAvKgorICAgKiBJZiB0aGlzIHdhcyBhbiBVbHRyYTIgY29udHJvbGxlciwgdGhlbiB3ZSBqdXN0IGhvc2VkIHRoZSBjYXJkIGluIHRlcm1zCisgICAqIG9mIHRoZSBRVUVVRSBSRUdTLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhdCBpbml0IHRpbWUgb3IgYnkKKyAgICogdGhlIHBhbmljX2Fib3J0IGZ1bmN0aW9uLCBzbyBpdCdzIHNhZmUgdG8gYXNzdW1lIGEgZ2VuZXJpYyBpbml0IHRpbWUKKyAgICogc2V0dGluZyBoZXJlCisgICAqLworCisgIGlmKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpCisgIHsKKyAgICBhaWNfb3V0YihwLCAwLCBTRFNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBTTlNDQl9RT0ZGKTsKKyAgICBhaWNfb3V0YihwLCAwLCBITlNDQl9RT0ZGKTsKKyAgfQorCit9CisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcmludF9zY3JhdGNoX3JhbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBQcmludCBvdXQgdGhlIHNjcmF0Y2ggUkFNIHZhbHVlcyBvbiB0aGUgY2FyZC4KKyAqLUYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2FpYzd4eHhfcHJpbnRfc2NyYXRjaF9yYW0oc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKyAgaW50IGksIGs7CisKKyAgayA9IDA7CisgIHByaW50aygiU2NyYXRjaCBSQU06XG4iKTsKKyAgZm9yKGkgPSBTUkFNX0JBU0U7IGkgPCBTRVFDVEw7IGkrKykKKyAgeworICAgIHByaW50aygiJTAyeDolMDJ4ICIsIGksIGFpY19pbmIocCwgaSkpOworICAgIGlmKCsrayA9PSAxMykKKyAgICB7CisgICAgICBwcmludGsoIlxuIik7CisgICAgICBrPTA7CisgICAgfQorICB9CisgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19NT1JFX1NSQU0pCisgIHsKKyAgICBmb3IoaSA9IFRBUkdfT0ZGU0VUOyBpIDwgMHg4MDsgaSsrKQorICAgIHsKKyAgICAgIHByaW50aygiJTAyeDolMDJ4ICIsIGksIGFpY19pbmIocCwgaSkpOworICAgICAgaWYoKytrID09IDEzKQorICAgICAgeworICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIGs9MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpbnRrKCJcbiIpOworfQorCisKKyNpbmNsdWRlICJhaWM3eHh4X29sZC9haWM3eHh4X3Byb2MuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oQUlDN1hYWF9IX1ZFUlNJT04pOworCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX2luZm8JCT0gYWljN3h4eF9wcm9jX2luZm8sCisJLmRldGVjdAkJCT0gYWljN3h4eF9kZXRlY3QsCisJLnJlbGVhc2UJCT0gYWljN3h4eF9yZWxlYXNlLAorCS5pbmZvCQkJPSBhaWM3eHh4X2luZm8sCQorCS5xdWV1ZWNvbW1hbmQJCT0gYWljN3h4eF9xdWV1ZSwKKwkuc2xhdmVfYWxsb2MJCT0gYWljN3h4eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gYWljN3h4eF9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYWljN3h4eF9zbGF2ZV9kZXN0cm95LAorCS5iaW9zX3BhcmFtCQk9IGFpYzd4eHhfYmlvc3BhcmFtLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gYWljN3h4eF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBhaWM3eHh4X2J1c19kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGFpYzd4eHhfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAyNTUsCisJLnRoaXNfaWQJCT0gLTEsCisJLm1heF9zZWN0b3JzCQk9IDIwNDgsCisJLmNtZF9wZXJfbHVuCQk9IDMsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgYWxtb3N0IGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogMgorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTIKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDIKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtMgorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogMgorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE2YzgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguaApAQCAtMCwwICsxLDI4IEBACisvKitNKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRhcHRlYyBBSUM3eHh4IGRldmljZSBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBKb2huIEF5Y29jaworICogICBUaGUgVW5pdmVyc2l0eSBvZiBDYWxnYXJ5IERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKiAkSWQ6IGFpYzd4eHguaCx2IDMuMiAxOTk2LzA3LzIzIDAzOjM3OjI2IGRlYW5nIEV4cCAkCisgKi1NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX2FpYzd4eHhfaAorI2RlZmluZSBfYWljN3h4eF9oCisKKyNkZWZpbmUgQUlDN1hYWF9IX1ZFUlNJT04gICI1LjIuMCIKKworI2VuZGlmIC8qIF9haWM3eHh4X2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4LnJlZyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4LnJlZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdiNGJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHgucmVnCkBAIC0wLDAgKzEsMTQwMSBAQAorLyoKKyAqIEFpYzd4eHggcmVnaXN0ZXIgYW5kIHNjcmF0Y2ggcmFtIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NC0xOTk4IEp1c3RpbiBHaWJicy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBXaGVyZSB0aGlzIFNvZnR3YXJlIGlzIGNvbWJpbmVkIHdpdGggc29mdHdhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYW5kIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHdvdWxkIHJlcXVpcmUgdGhlIAorICogY29tYmluZWQgd29yayB0byBhbHNvIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMLCB0aGUgdGVybXMKKyAqIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IGluIGFkZGl0aW9uIHRvIHRob3NlIG9mIHRoZQorICogR1BMIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgdGhhdAorICogY29uZmxpY3Qgd2l0aCwgb3IgYXJlIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5LCB0aGUgR1BMLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJJElkOiBhaWM3eHh4LnJlZyx2IDEuNCAxOTk3LzA2LzI3IDE5OjM4OjM5IGdpYmJzIEV4cCAkCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGFpYzd4eHhfYXNtIHV0aWxpdHkgZm9yIHVzZSBpbiBhc3NlbWJsaW5nCisgKiBmaXJtd2FyZSBmb3IgdGhlIGFpYzd4eHggZmFtaWx5IG9mIFNDU0kgaG9zdCBhZGFwdGVycyBhcyB3ZWxsIGFzIHRvIGdlbmVyYXRlCisgKiBhIEMgaGVhZGVyIGZpbGUgZm9yIHVzZSBpbiB0aGUga2VybmVsIHBvcnRpb24gb2YgdGhlIEFpYzd4eHggZHJpdmVyLgorICoKKyAqIEFsbCBwYWdlIG51bWJlcnMgcmVmZXIgdG8gdGhlIEFkYXB0ZWMgQUlDLTc3NzAgRGF0YSBCb29rIGF2YWlsYWJsZSBmcm9tCisgKiBBZGFwdGVjJ3MgVGVjaG5pY2FsIERvY3VtZW50cyBEZXBhcnRtZW50IDEtODAwLTkzNC0yNzY2CisgKi8KKworLyoKKyAqIFNDU0kgU2VxdWVuY2UgQ29udHJvbCAocC4gMy0xMSkuCisgKiBFYWNoIGJpdCwgd2hlbiBzZXQgc3RhcnRzIGEgc3BlY2lmaWMgU0NTSSBzZXF1ZW5jZSBvbiB0aGUgYnVzCisgKi8KK3JlZ2lzdGVyIFNDU0lTRVEgeworCWFkZHJlc3MJCQkweDAwMAorCWFjY2Vzc19tb2RlIFJXCisJYml0CVRFTU9ERQkJMHg4MAorCWJpdAlFTlNFTE8JCTB4NDAKKwliaXQJRU5TRUxJCQkweDIwCisJYml0CUVOUlNFTEkJCTB4MTAKKwliaXQJRU5BVVRPQVROTwkweDA4CisJYml0CUVOQVVUT0FUTkkJMHgwNAorCWJpdAlFTkFVVE9BVE5QCTB4MDIKKwliaXQJU0NTSVJTVE8JMHgwMQorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDAgUmVnaXN0ZXIgKHBwLiAzLTEzKS4KKyAqIENvbnRyb2xzIHRoZSBTQ1NJIG1vZHVsZSBkYXRhIHBhdGguCisgKi8KK3JlZ2lzdGVyIFNYRlJDVEwwIHsKKwlhZGRyZXNzCQkJMHgwMDEKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlERk9OCQkweDgwCisJYml0CURGUEVYUAkJMHg0MAorCWJpdAlGQVNUMjAJCTB4MjAKKwliaXQJQ0xSU1RDTlQJMHgxMAorCWJpdAlTUElPRU4JCTB4MDgKKwliaXQJU0NBTUVOCQkweDA0CisJYml0CUNMUkNITgkJMHgwMgorfQorCisvKgorICogU0NTSSBUcmFuc2ZlciBDb250cm9sIDEgUmVnaXN0ZXIgKHBwLiAzLTE0LDE1KS4KKyAqIENvbnRyb2xzIHRoZSBTQ1NJIG1vZHVsZSBkYXRhIHBhdGguCisgKi8KK3JlZ2lzdGVyIFNYRlJDVEwxIHsKKwlhZGRyZXNzCQkJMHgwMDIKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlCSVRCVUNLRVQJMHg4MAorCWJpdAlTV1JBUEVOCQkweDQwCisJYml0CUVOU1BDSEsJCTB4MjAKKwltYXNrCVNUSU1FU0VMCTB4MTgKKwliaXQJRU5TVElNRVIJMHgwNAorCWJpdAlBQ1RORUdFTgkweDAyCisJYml0CVNUUFdFTgkJMHgwMQkvKiBQb3dlcmVkIFRlcm1pbmF0aW9uICovCit9CisKKy8qCisgKiBTQ1NJIENvbnRyb2wgU2lnbmFsIFJlYWQgUmVnaXN0ZXIgKHAuIDMtMTUpLgorICogUmVhZHMgdGhlIGFjdHVhbCBzdGF0ZSBvZiB0aGUgU0NTSSBidXMgcGlucworICovCityZWdpc3RlciBTQ1NJU0lHSSB7CisJYWRkcmVzcwkJCTB4MDAzCisJYWNjZXNzX21vZGUgUk8KKwliaXQJQ0RJCQkweDgwCisJYml0CUlPSQkJMHg0MAorCWJpdAlNU0dJCQkweDIwCisJYml0CUFUTkkJCTB4MTAKKwliaXQJU0VMSQkJMHgwOAorCWJpdAlCU1lJCQkweDA0CisJYml0CVJFUUkJCTB4MDIKKwliaXQJQUNLSQkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyBpbiBTQ1NJU0lHSQorICovCisJbWFzawlQSEFTRV9NQVNLCUNESXxJT0l8TVNHSQorCW1hc2sJUF9EQVRBT1VUCTB4MDAKKwltYXNrCVBfREFUQUlOCUlPSQorCW1hc2sJUF9DT01NQU5ECUNESQorCW1hc2sJUF9NRVNHT1VUCUNESXxNU0dJCisJbWFzawlQX1NUQVRVUwlDREl8SU9JCisJbWFzawlQX01FU0dJTglDREl8SU9JfE1TR0kKK30KKworLyoKKyAqIFNDU0kgQ29udHJvbCBTaWduYWwgV3JpdGUgUmVnaXN0ZXIgKHAuIDMtMTYpLgorICogV3JpdGluZyB0byB0aGlzIHJlZ2lzdGVyIG1vZGlmaWVzIHRoZSBjb250cm9sIHNpZ25hbHMgb24gdGhlIGJ1cy4gIE9ubHkKKyAqIHRob3NlIHNpZ25hbHMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBtb2RlIChJbml0aWF0b3IvVGFyZ2V0KSBhcmUKKyAqIGFzc2VydGVkLgorICovCityZWdpc3RlciBTQ1NJU0lHTyB7CisJYWRkcmVzcwkJCTB4MDAzCisJYWNjZXNzX21vZGUgV08KKwliaXQJQ0RPCQkweDgwCisJYml0CUlPTwkJMHg0MAorCWJpdAlNU0dPCQkweDIwCisJYml0CUFUTk8JCTB4MTAKKwliaXQJU0VMTwkJMHgwOAorCWJpdAlCU1lPCQkweDA0CisJYml0CVJFUU8JCTB4MDIKKwliaXQJQUNLTwkJMHgwMQorLyoKKyAqIFBvc3NpYmxlIHBoYXNlcyB0byB3cml0ZSBpbnRvIFNDU0lTSUcwCisgKi8KKwltYXNrCVBIQVNFX01BU0sJQ0RJfElPSXxNU0dJCisJbWFzawlQX0RBVEFPVVQJMHgwMAorCW1hc2sJUF9EQVRBSU4JSU9JCisJbWFzawlQX0NPTU1BTkQJQ0RJCisJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwltYXNrCVBfU1RBVFVTCUNESXxJT0kKKwltYXNrCVBfTUVTR0lOCUNESXxJT0l8TVNHSQorfQorCisvKiAKKyAqIFNDU0kgUmF0ZSBDb250cm9sIChwLiAzLTE3KS4KKyAqIENvbnRlbnRzIG9mIHRoaXMgcmVnaXN0ZXIgZGV0ZXJtaW5lIHRoZSBTeW5jaHJvbm91cyBTQ1NJIGRhdGEgdHJhbnNmZXIKKyAqIHJhdGUgYW5kIHRoZSBtYXhpbXVtIHN5bmNocm9ub3VzIFJlcS9BY2sgb2Zmc2V0LiAgQW4gb2Zmc2V0IG9mIDAgaW4gdGhlCisgKiBTT0ZTICgzOjApIGJpdHMgZGlzYWJsZXMgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMuICBBbnkgb2Zmc2V0IHZhbHVlCisgKiBncmVhdGVyIHRoYW4gMCBlbmFibGVzIHN5bmNocm9ub3VzIHRyYW5zZmVycy4KKyAqLworcmVnaXN0ZXIgU0NTSVJBVEUgeworCWFkZHJlc3MJCQkweDAwNAorCWFjY2Vzc19tb2RlIFJXCisJYml0CVdJREVYRkVSCTB4ODAJCS8qIFdpZGUgdHJhbnNmZXIgY29udHJvbCAqLworCW1hc2sJU1hGUgkJMHg3MAkJLyogU3luYyB0cmFuc2ZlciByYXRlICovCisJbWFzawlTWEZSX1VMVFJBMgkweDdmCQkvKiBTeW5jIHRyYW5zZmVyIHJhdGUgKi8KKwltYXNrCVNPRlMJCTB4MGYJCS8qIFN5bmMgb2Zmc2V0ICovCit9CisKKy8qCisgKiBTQ1NJIElEIChwLiAzLTE4KS4KKyAqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgYm9hcmQgYW5kIHRoZSBjdXJyZW50IHRhcmdldCBvbiB0aGUKKyAqIHNlbGVjdGVkIGNoYW5uZWwuCisgKi8KK3JlZ2lzdGVyIFNDU0lJRAl7CisJYWRkcmVzcwkJCTB4MDA1CisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVRJRAkJMHhmMAkJLyogVGFyZ2V0IElEIG1hc2sgKi8KKwltYXNrCU9JRAkJMHgwZgkJLyogT3VyIElEIG1hc2sgKi8KKwkvKgorCSAqIFNDU0kgTWF4aW11bSBPZmZzZXQgKHAuIDQtNjEgYWljNzg5MC85MSBEYXRhIEJvb2spCisJICogVGhlIGFpYzc4OTAvOTEgYWxsb3cgYW4gb2Zmc2V0IG9mIHVwIHRvIDEyNyB0cmFuc2ZlcnMgaW4gYm90aCB3aWRlCisJICogYW5kIG5hcnJvdyBtb2RlLgorCSAqLworCWFsaWFzCVNDU0lPRkZTRVQKKwltYXNrCVNPRlNfVUxUUkEyCTB4N2YJCS8qIFN5bmMgb2Zmc2V0IFUyIGNoaXBzICovCit9CisKKy8qCisgKiBTQ1NJIExhdGNoZWQgRGF0YSAocC4gMy0xOSkuCisgKiBSZWFkL1dyaXRlIGxhdGNoZXMgdXNlZCB0byB0cmFuc2ZlciBkYXRhIG9uIHRoZSBTQ1NJIGJ1cyBkdXJpbmcKKyAqIEF1dG9tYXRpYyBvciBNYW51YWwgUElPIG1vZGUuICBTQ1NJREFUSCBjYW4gYmUgdXNlZCBmb3IgdGhlCisgKiB1cHBlciBieXRlIG9mIGEgMTZiaXQgd2lkZSBhc3luY2hyb25vdXNlIGRhdGEgcGhhc2UgdHJhbnNmZXIuCisgKi8KK3JlZ2lzdGVyIFNDU0lEQVRMIHsKKwlhZGRyZXNzCQkJMHgwMDYKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTQ1NJREFUSCB7CisJYWRkcmVzcwkJCTB4MDA3CisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDU0kgVHJhbnNmZXIgQ291bnQgKHBwLiAzLTE5LDIwKQorICogVGhlc2UgcmVnaXN0ZXJzIGNvdW50IGRvd24gdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZAorICogYWNyb3NzIHRoZSBTQ1NJIGJ1cy4gIFRoZSBjb3VudGVyIGlzIGRlY3JlbWVudGVkIG9ubHkgb25jZQorICogdGhlIGRhdGEgaGFzIGJlZW4gc2FmZWx5IHRyYW5zZmVycmVkLiAgU0RPTkUgaW4gU1NUQVQwIGlzCisgKiBzZXQgd2hlbiBTVENOVCBnb2VzIHRvIDAKKyAqLyAKK3JlZ2lzdGVyIFNUQ05UIHsKKwlhZGRyZXNzCQkJMHgwMDgKKwlzaXplCTMKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogT3B0aW9uIE1vZGUgUmVnaXN0ZXIgKEFsdGVybmF0ZSBNb2RlKSAocC4gNS0xOTgpCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gc2V0IGNlcnRhaW4gb3B0aW9ucyBvbiBVbHRyYTMgYmFzZWQgY2hpcHMuCisgKiBUaGUgY2hpcCBtdXN0IGJlIGluIGFsdGVybmF0ZSBtb2RlIChiaXQgQUxUX01PREUgaW4gU0ZVTkNUIG11c3QgYmUgc2V0KQorICovCityZWdpc3RlciBPUFRJT05NT0RFIHsKKwlhZGRyZXNzCQkJMHgwMDgKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlBVVRPUkFURUVOCTB4ODAKKwliaXQJQVVUT0FDS0VOCTB4NDAKKwliaXQJQVROTUdNTlRFTgkweDIwCisJYml0CUJVU0ZSRUVSRVYJMHgxMAorCWJpdAlFWFBQSEFTRURJUwkweDA4CisJYml0CVNDU0lEQVRMX0lNR0VOCTB4MDQKKwliaXQJQVVUT19NU0dPVVRfREUJMHgwMgorCWJpdAlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorfQorCisKKy8qCisgKiBDbGVhciBTQ1NJIEludGVycnVwdCAwIChwLiAzLTIwKQorICogV3JpdGluZyBhIDEgdG8gYSBiaXQgY2xlYXJzIHRoZSBhc3NvY2lhdGVkIFNDU0kgSW50ZXJydXB0IGluIFNTVEFUMC4KKyAqLworcmVnaXN0ZXIgQ0xSU0lOVDAgeworCWFkZHJlc3MJCQkweDAwYgorCWFjY2Vzc19tb2RlIFdPCisJYml0CUNMUlNFTERPCTB4NDAKKwliaXQJQ0xSU0VMREkJMHgyMAorCWJpdAlDTFJTRUxJTkdPCTB4MTAKKwliaXQJQ0xSU1dSQVAJMHgwOAorCWJpdAlDTFJTUElPUkRZCTB4MDIKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDAgKHAuIDMtMjEpCisgKiBDb250YWlucyBvbmUgc2V0IG9mIFNDU0kgSW50ZXJydXB0IGNvZGVzCisgKiBUaGVzZSBhcmUgbW9zdCBsaWtlbHkgb2YgaW50ZXJlc3QgdG8gdGhlIHNlcXVlbmNlcgorICovCityZWdpc3RlciBTU1RBVDAJeworCWFkZHJlc3MJCQkweDAwYgorCWFjY2Vzc19tb2RlIFJPCisJYml0CVRBUkdFVAkJMHg4MAkvKiBCb2FyZCBhY3RpbmcgYXMgdGFyZ2V0ICovCisJYml0CVNFTERPCQkweDQwCS8qIFNlbGVjdGlvbiBEb25lICovCisJYml0CVNFTERJCQkweDIwCS8qIEJvYXJkIGhhcyBiZWVuIHNlbGVjdGVkICovCisJYml0CVNFTElOR08JCTB4MTAJLyogU2VsZWN0aW9uIEluIFByb2dyZXNzICovCisJYml0CVNXUkFQCQkweDA4CS8qIDI0Yml0IGNvdW50ZXIgd3JhcCAqLworCWJpdAlJT0VSUgkJMHgwOAkvKiBMVkQgVHJhbmNlaXZlciBtb2RlIGNoYW5nZWQgKi8KKwliaXQJU0RPTkUJCTB4MDQJLyogU1RDTlQgPSAweDAwMDAwMCAqLworCWJpdAlTUElPUkRZCQkweDAyCS8qIFNDU0kgUElPIFJlYWR5ICovCisJYml0CURNQURPTkUJCTB4MDEJLyogRE1BIHRyYW5zZmVyIGNvbXBsZXRlZCAqLworfQorCisvKgorICogQ2xlYXIgU0NTSSBJbnRlcnJ1cHQgMSAocC4gMy0yMykKKyAqIFdyaXRpbmcgYSAxIHRvIGEgYml0IGNsZWFycyB0aGUgYXNzb2NpYXRlZCBTQ1NJIEludGVycnVwdCBpbiBTU1RBVDEuCisgKi8KK3JlZ2lzdGVyIENMUlNJTlQxIHsKKwlhZGRyZXNzCQkJMHgwMGMKKwlhY2Nlc3NfbW9kZSBXTworCWJpdAlDTFJTRUxUSU1FTwkweDgwCisJYml0CUNMUkFUTk8JCTB4NDAKKwliaXQJQ0xSU0NTSVJTVEkJMHgyMAorCWJpdAlDTFJCVVNGUkVFCTB4MDgKKwliaXQJQ0xSU0NTSVBFUlIJMHgwNAorCWJpdAlDTFJQSEFTRUNIRwkweDAyCisJYml0CUNMUlJFUUlOSVQJMHgwMQorfQorCisvKgorICogU0NTSSBTdGF0dXMgMSAocC4gMy0yNCkKKyAqLworcmVnaXN0ZXIgU1NUQVQxCXsKKwlhZGRyZXNzCQkJMHgwMGMKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlTRUxUTwkJMHg4MAorCWJpdAlBVE5UQVJHIAkweDQwCisJYml0CVNDU0lSU1RJCTB4MjAKKwliaXQJUEhBU0VNSVMJMHgxMAorCWJpdAlCVVNGUkVFCQkweDA4CisJYml0CVNDU0lQRVJSCTB4MDQKKwliaXQJUEhBU0VDSEcJMHgwMgorCWJpdAlSRVFJTklUCQkweDAxCit9CisKKy8qCisgKiBTQ1NJIFN0YXR1cyAyIChwcC4gMy0yNSwyNikKKyAqLworcmVnaXN0ZXIgU1NUQVQyIHsKKwlhZGRyZXNzCQkJMHgwMGQKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlPVkVSUlVOCQkweDgwCisJYml0CVNIVkFMSUQJCTB4NDAKKwliaXQJV0lERV9SRVMJMHgyMAorCWJpdAlFWFBfQUNUSVZFCTB4MTAJLyogU0NTSSBFeHBhbmRlciBBY3RpdmUgKi8KKwliaXQJQ1JDVkFMRVJSCTB4MDgJLyogQ1JDIFZhbHVlIEVycm9yICovCisJYml0CUNSQ0VOREVSUgkweDA0CS8qIENSQyBFbmQgRXJyb3IgKi8KKwliaXQJQ1JDUkVRRVJSCTB4MDIJLyogQ1JDIFJFUSBFcnJvciAqLworCWJpdAlEVUFMX0VER0VfRVJST1IJMHgwMQkvKiBJbnZhbGlkIHBpbnMgZm9yIER1YWwgRWRnZSBwaGFzZSAqLworCW1hc2sJU0ZDTlQJCTB4MWYKK30KKworLyoKKyAqIFNDU0kgU3RhdHVzIDMgKHAuIDMtMjYpCisgKi8KK3JlZ2lzdGVyIFNTVEFUMyB7CisJYWRkcmVzcwkJCTB4MDBlCisJYWNjZXNzX21vZGUgUk8KKwltYXNrCVNDU0lDTlQJCTB4ZjAKKwltYXNrCU9GRkNOVAkJMHgwZgorfQorCisvKgorICogU0NTSSBJRCBmb3IgdGhlIGFpYzc4OTAvOTEgY2hpcHMKKyAqLworcmVnaXN0ZXIgU0NTSUlEX1VMVFJBMiB7CisJYWRkcmVzcwkJCTB4MDBmCisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVRJRAkJMHhmMAkJLyogVGFyZ2V0IElEIG1hc2sgKi8KKwltYXNrCU9JRAkJMHgwZgkJLyogT3VyIElEIG1hc2sgKi8KK30KKworLyoKKyAqIFNDU0kgSW50ZXJydXB0IE1vZGUgMSAocC4gMy0yOCkKKyAqIFNldHRpbmcgYW55IGJpdCB3aWxsIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICogaW4gU0lNT0RFMCB0byBpbnRlcnJ1cHQgdmlhIHRoZSBJUlEgcGluLgorICovCityZWdpc3RlciBTSU1PREUwIHsKKwlhZGRyZXNzCQkJMHgwMTAKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlFTlNFTERPCQkweDQwCisJYml0CUVOU0VMREkJCTB4MjAKKwliaXQJRU5TRUxJTkdPCTB4MTAKKwliaXQJRU5TV1JBUAkJMHgwOAorCWJpdAlFTklPRVJSCQkweDA4CS8qIExWRCBUcmFuY2VpdmVyIG1vZGUgY2hhbmdlcyAqLworCWJpdAlFTlNET05FCQkweDA0CisJYml0CUVOU1BJT1JEWQkweDAyCisJYml0CUVORE1BRE9ORQkweDAxCit9CisKKy8qCisgKiBTQ1NJIEludGVycnVwdCBNb2RlIDEgKHBwLiAzLTI4LDI5KQorICogU2V0dGluZyBhbnkgYml0IHdpbGwgZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiBpbiBTSU1PREUxIHRvIGludGVycnVwdCB2aWEgdGhlIElSUSBwaW4uCisgKi8KK3JlZ2lzdGVyIFNJTU9ERTEgeworCWFkZHJlc3MJCQkweDAxMQorCWFjY2Vzc19tb2RlIFJXCisJYml0CUVOU0VMVElNTwkweDgwCisJYml0CUVOQVROVEFSRwkweDQwCisJYml0CUVOU0NTSVJTVAkweDIwCisJYml0CUVOUEhBU0VNSVMJMHgxMAorCWJpdAlFTkJVU0ZSRUUJMHgwOAorCWJpdAlFTlNDU0lQRVJSCTB4MDQKKwliaXQJRU5QSEFTRUNIRwkweDAyCisJYml0CUVOUkVRSU5JVAkweDAxCit9CisKKy8qCisgKiBTQ1NJIERhdGEgQnVzIChIaWdoKSAocC4gMy0yOSkKKyAqIFRoaXMgcmVnaXN0ZXIgcmVhZHMgZGF0YSBvbiB0aGUgU0NTSSBEYXRhIGJ1cyBkaXJlY3RseS4KKyAqLworcmVnaXN0ZXIgU0NTSUJVU0wgeworCWFkZHJlc3MJCQkweDAxMgorCWFjY2Vzc19tb2RlIFJPCit9CisKK3JlZ2lzdGVyIFNDU0lCVVNIIHsKKwlhZGRyZXNzCQkJMHgwMTMKKwlhY2Nlc3NfbW9kZSBSTworfQorCisvKgorICogU0NTSS9Ib3N0IEFkZHJlc3MgKHAuIDMtMzApCisgKiBUaGVzZSByZWdpc3RlcnMgaG9sZCB0aGUgaG9zdCBhZGRyZXNzIGZvciB0aGUgYnl0ZSBhYm91dCB0byBiZQorICogdHJhbnNmZXJyZWQgb24gdGhlIFNDU0kgYnVzLiAgVGhleSBhcmUgY291bnRlZCB1cCBpbiB0aGUgc2FtZQorICogbWFubmVyIGFzIFNUQ05UIGlzIGNvdW50ZWQgZG93bi4gIFNIQUREUiBzaG91bGQgYWx3YXlzIGJlIHVzZWQKKyAqIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBieXRlIHRyYW5zZmVycmVkIHNpbmNlIEhBRERSCisgKiBjYW4gYmUgc2tld2VkIGJ5IHdyaXRlIGFoZWFkLgorICovCityZWdpc3RlciBTSEFERFIgeworCWFkZHJlc3MJCQkweDAxNAorCXNpemUJNAorCWFjY2Vzc19tb2RlIFJPCit9CisKKy8qCisgKiBTZWxlY3Rpb24gVGltZW91dCBUaW1lciAocC4gMy0zMCkKKyAqLworcmVnaXN0ZXIgU0VMVElNRVIgeworCWFkZHJlc3MJCQkweDAxOAorCWFjY2Vzc19tb2RlIFJXCisJYml0CVNUQUdFNgkJMHgyMAorCWJpdAlTVEFHRTUJCTB4MTAKKwliaXQJU1RBR0U0CQkweDA4CisJYml0CVNUQUdFMwkJMHgwNAorCWJpdAlTVEFHRTIJCTB4MDIKKwliaXQJU1RBR0UxCQkweDAxCit9CisKKy8qCisgKiBTZWxlY3Rpb24vUmVzZWxlY3Rpb24gSUQgKHAuIDMtMzEpCisgKiBVcHBlciBmb3VyIGJpdHMgYXJlIHRoZSBkZXZpY2UgaWQuICBUaGUgT05FQklUIGlzIHNldCB3aGVuIHRoZSByZS9zZWxlY3RpbmcKKyAqIGRldmljZSBkaWQgbm90IHNldCBpdHMgb3duIElELgorICovCityZWdpc3RlciBTRUxJRCB7CisJYWRkcmVzcwkJCTB4MDE5CisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFTElEX01BU0sJMHhmMAorCWJpdAlPTkVCSVQJCTB4MDgKK30KKworLyoKKyAqIFNlcmlhbCBQb3J0IEkvTyBDYWJhYmlsaXR5IHJlZ2lzdGVyIChwLiA0LTk1IGFpYzc4NjAgRGF0YSBCb29rKQorICogSW5kaWNhdGVzIGlmIGV4dGVybmFsIGxvZ2ljIGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjaGlwIHRvCisgKiBwZXJmb3JtIHRoZSB0YXNrcyBvZiBhY2Nlc3NpbmcgYSBzZXJpYWwgZWVwcm9tLCB0ZXN0aW5nIHRlcm1pbmF0aW9uCisgKiBzdHJlbmd0aCwgYW5kIHBlcmZvcm1pbmcgY2FibGUgZGV0ZWN0aW9uLiAgT24gdGhlIGFpYzc4NjAsIG1vc3Qgb2YKKyAqIHRoZXNlIGZlYXR1cmVzIGFyZSBoYW5kbGVkIG9uIGNoaXAsIGJ1dCBvbiB0aGUgYWljNzg1NSBhbiBhdHRhY2hlZAorICogYWljMzgwMCBkb2VzIHRoZSBncnVudCB3b3JrLgorICovCityZWdpc3RlciBTUElPQ0FQIHsKKwlhZGRyZXNzCQkJMHgwMWIKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlTT0ZUMQkJMHg4MAorCWJpdAlTT0ZUMAkJMHg0MAorCWJpdAlTT0ZUQ01ERU4JMHgyMAkKKwliaXQJSEFTX0JSRENUTAkweDEwCS8qIEV4dGVybmFsIEJvYXJkIGNvbnRyb2wgKi8KKwliaXQJU0VFUFJPTQkJMHgwOAkvKiBFeHRlcm5hbCBzZXJpYWwgZWVwcm9tIGxvZ2ljICovCisJYml0CUVFUFJPTQkJMHgwNAkvKiBXcml0YWJsZSBleHRlcm5hbCBCSU9TIFJPTSAqLworCWJpdAlST00JCTB4MDIJLyogTG9naWMgZm9yIGFjY2Vzc2luZyBleHRlcm5hbCBST00gKi8KKwliaXQJU1NQSU9DUFMJMHgwMQkvKiBUZXJtaW5hdGlvbiBhbmQgY2FibGUgZGV0ZWN0aW9uICovCit9CisKKy8qCisgKiBTQ1NJIEJsb2NrIENvbnRyb2wgKHAuIDMtMzIpCisgKiBDb250cm9scyBCdXMgdHlwZSBhbmQgY2hhbm5lbCBzZWxlY3Rpb24uICBJbiBhIHR3aW4gY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBhZGRyZXNzZXMgMHgwMC0weDFlIGFyZSBnYXRlZCB0byB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBiYXNlZCBvbiB0aGlzCisgKiByZWdpc3Rlci4gIFNFTFdJREUgYWxsb3dzIGZvciB0aGUgY29leGlzdGVuY2Ugb2YgOGJpdCBhbmQgMTZiaXQgZGV2aWNlcworICogb24gYSB3aWRlIGJ1cy4KKyAqLworcmVnaXN0ZXIgU0JMS0NUTCB7CisJYWRkcmVzcwkJCTB4MDFmCisJYWNjZXNzX21vZGUgUlcKKwliaXQJRElBR0xFREVOCTB4ODAJLyogQWljNzhYMCBvbmx5ICovCisJYml0CURJQUdMRURPTgkweDQwCS8qIEFpYzc4WDAgb25seSAqLworCWJpdAlBVVRPRkxVU0hESVMJMHgyMAorCWJpdAlTRUxCVVNCCQkweDA4CisJYml0CUVOQUI0MAkJMHgwOAkvKiBMVkQgdHJhbnNjZWl2ZXIgYWN0aXZlICovCisJYml0CUVOQUIyMAkJMHgwNAkvKiBTRS9IVkQgdHJhbnNjZWl2ZXIgYWN0aXZlICovCisJYml0CVNFTFdJREUJCTB4MDIKKwliaXQJWENWUgkJMHgwMQkvKiBFeHRlcm5hbCB0cmFuc2NlaXZlciBhY3RpdmUgKi8KK30KKworLyoKKyAqIFNlcXVlbmNlciBDb250cm9sIChwLiAzLTMzKQorICogRXJyb3IgZGV0ZWN0aW9uIG1vZGUgYW5kIHNwZWVkIGNvbmZpZ3VyYXRpb24KKyAqLworcmVnaXN0ZXIgU0VRQ1RMIHsKKwlhZGRyZXNzCQkJMHgwNjAKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlQRVJST1JESVMJMHg4MAorCWJpdAlQQVVTRURJUwkweDQwCisJYml0CUZBSUxESVMJCTB4MjAKKwliaXQJRkFTVE1PREUJMHgxMAorCWJpdAlCUktBRFJJTlRFTgkweDA4CisJYml0CVNURVAJCTB4MDQKKwliaXQJU0VRUkVTRVQJMHgwMgorCWJpdAlMT0FEUkFNCQkweDAxCit9CisKKy8qCisgKiBTZXF1ZW5jZXIgUkFNIERhdGEgKHAuIDMtMzQpCisgKiBTaW5nbGUgYnl0ZSB3aW5kb3cgaW50byB0aGUgU2NyYXRjaCBSYW0gYXJlYSBzdGFydGluZyBhdCB0aGUgYWRkcmVzcworICogc3BlY2lmaWVkIGJ5IFNFUUFERFIwIGFuZCBTRVFBRERSMS4gIFRvIHdyaXRlIGEgZnVsbCB3b3JkLCBzaW1wbHkgd3JpdGUKKyAqIGZvdXIgYnl0ZXMgaW4gc3VjY2Vzc2lvbi4gIFRoZSBTRVFBRERScyB3aWxsIGluY3JlbWVudCBhZnRlciB0aGUgbW9zdAorICogc2lnbmlmaWNhbnQgYnl0ZSBpcyB3cml0dGVuCisgKi8KK3JlZ2lzdGVyIFNFUVJBTSB7CisJYWRkcmVzcwkJCTB4MDYxCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNlcXVlbmNlciBBZGRyZXNzIFJlZ2lzdGVycyAocC4gMy0zNSkKKyAqIE9ubHkgdGhlIGZpcnN0IGJpdCBvZiBTRVFBRERSMSBob2xkcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCisgKi8KK3JlZ2lzdGVyIFNFUUFERFIwIHsKKwlhZGRyZXNzCQkJMHgwNjIKKwlhY2Nlc3NfbW9kZSBSVworfQorCityZWdpc3RlciBTRVFBRERSMSB7CisJYWRkcmVzcwkJCTB4MDYzCisJYWNjZXNzX21vZGUgUlcKKwltYXNrCVNFUUFERFIxX01BU0sJMHgwMQorfQorCisvKgorICogQWNjdW11bGF0b3IKKyAqIFdlIGNoZWF0IGJ5IHBhc3NpbmcgYXJndW1lbnRzIGluIHRoZSBBY2N1bXVsYXRvciB1cCB0byB0aGUga2VybmVsIGRyaXZlcgorICovCityZWdpc3RlciBBQ0NVTSB7CisJYWRkcmVzcwkJCTB4MDY0CisJYWNjZXNzX21vZGUgUlcKKwlhY2N1bXVsYXRvcgorfQorCityZWdpc3RlciBTSU5ERVgJeworCWFkZHJlc3MJCQkweDA2NQorCWFjY2Vzc19tb2RlIFJXCisJc2luZGV4Cit9CisKK3JlZ2lzdGVyIERJTkRFWCB7CisJYWRkcmVzcwkJCTB4MDY2CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgQUxMT05FUyB7CisJYWRkcmVzcwkJCTB4MDY5CisJYWNjZXNzX21vZGUgUk8KKwlhbGxvbmVzCit9CisKK3JlZ2lzdGVyIEFMTFpFUk9TIHsKKwlhZGRyZXNzCQkJMHgwNmEKKwlhY2Nlc3NfbW9kZSBSTworCWFsbHplcm9zCit9CisKK3JlZ2lzdGVyIE5PTkUgeworCWFkZHJlc3MJCQkweDA2YQorCWFjY2Vzc19tb2RlIFdPCisJbm9uZQorfQorCityZWdpc3RlciBGTEFHUyB7CisJYWRkcmVzcwkJCTB4MDZiCisJYWNjZXNzX21vZGUgUk8KKwliaXQJWkVSTwkJMHgwMgorCWJpdAlDQVJSWQkJMHgwMQorfQorCityZWdpc3RlciBTSU5ESVIJeworCWFkZHJlc3MJCQkweDA2YworCWFjY2Vzc19tb2RlIFJPCit9CisKK3JlZ2lzdGVyIERJTkRJUgkgeworCWFkZHJlc3MJCQkweDA2ZAorCWFjY2Vzc19tb2RlIFdPCit9CisKK3JlZ2lzdGVyIEZVTkNUSU9OMSB7CisJYWRkcmVzcwkJCTB4MDZlCisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgU1RBQ0sgeworCWFkZHJlc3MJCQkweDA2ZgorCWFjY2Vzc19tb2RlIFJPCit9CisKKy8qCisgKiBCb2FyZCBDb250cm9sIChwLiAzLTQzKQorICovCityZWdpc3RlciBCQ1RMIHsKKwlhZGRyZXNzCQkJMHgwODQKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlBQ0UJCTB4MDgKKwliaXQJRU5BQkxFCQkweDAxCit9CisKK3JlZ2lzdGVyIERTQ09NTUFORDAgeworCWFkZHJlc3MJCQkweDA4NAorCWFjY2Vzc19tb2RlIFJXCisJYml0CUNBQ0hFVEhFTgkweDgwCisJYml0CURQQVJDS0VOCTB4NDAKKwliaXQJTVBBUkNLRU4JMHgyMAorCWJpdAlFWFRSRVFMQ0sJMHgxMAorCWJpdAlJTlRTQ0JSQU1TRUwJMHgwOAorCWJpdAlSQU1QUwkJMHgwNAorCWJpdAlVU0NCU0laRTMyCTB4MDIKKwliaXQJQ0lPUEFSQ0tFTgkweDAxCit9CisKKy8qCisgKiBPbiB0aGUgYWljNzhYMCBjaGlwcywgQm9hcmQgQ29udHJvbCBpcyByZXBsYWNlZCBieSB0aGUgRFNDb21tYW5kCisgKiByZWdpc3RlciAocC4gNC02NCkKKyAqLworcmVnaXN0ZXIgRFNDT01NQU5EIHsKKwlhZGRyZXNzCQkJMHgwODQKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlDQUNIRVRIRU4JMHg4MAkvKiBDYWNoZSBUaHJlc2hvbGQgZW5hYmxlICovCisJYml0CURQQVJDS0VOCTB4NDAJLyogRGF0YSBQYXJpdHkgQ2hlY2sgRW5hYmxlICovCisJYml0CU1QQVJDS0VOCTB4MjAJLyogTWVtb3J5IFBhcml0eSBDaGVjayBFbmFibGUgKi8KKwliaXQJRVhUUkVRTENLCTB4MTAJLyogRXh0ZXJuYWwgUmVxdWVzdCBMb2NrICovCit9CisKKy8qCisgKiBCdXMgT24vT2ZmIFRpbWUgKHAuIDMtNDQpCisgKi8KK3JlZ2lzdGVyIEJVU1RJTUUgeworCWFkZHJlc3MJCQkweDA4NQorCWFjY2Vzc19tb2RlIFJXCisJbWFzawlCT0ZGCQkweGYwCisJbWFzawlCT04JCTB4MGYKK30KKworLyoKKyAqIEJ1cyBTcGVlZCAocC4gMy00NSkKKyAqLworcmVnaXN0ZXIgQlVTU1BEIHsKKwlhZGRyZXNzCQkJMHgwODYKKwlhY2Nlc3NfbW9kZSBSVworCW1hc2sJREZUSFJTSAkJMHhjMAorCW1hc2sJU1RCT0ZGCQkweDM4CisJbWFzawlTVEJPTgkJMHgwNworCW1hc2sJREZUSFJTSF8xMDAJMHhjMAorfQorCisvKgorICogSG9zdCBDb250cm9sIChwLiAzLTQ3KSBSL1cKKyAqIE92ZXJhbGwgaG9zdCBjb250cm9sIG9mIHRoZSBkZXZpY2UuCisgKi8KK3JlZ2lzdGVyIEhDTlRSTCB7CisJYWRkcmVzcwkJCTB4MDg3CisJYWNjZXNzX21vZGUgUlcKKwliaXQJUE9XUkROCQkweDQwCisJYml0CVNXSU5UCQkweDEwCisJYml0CUlSUU1TCQkweDA4CisJYml0CVBBVVNFCQkweDA0CisJYml0CUlOVEVOCQkweDAyCisJYml0CUNISVBSU1QJCTB4MDEKKwliaXQJQ0hJUFJTVEFDSwkweDAxCit9CisKKy8qCisgKiBIb3N0IEFkZHJlc3MgKHAuIDMtNDgpCisgKiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIGFib3V0CisgKiB0byBiZSB0cmFuc2ZlcnJlZCBhY3Jvc3MgdGhlIGhvc3QgYnVzLgorICovCityZWdpc3RlciBIQUREUiB7CisJYWRkcmVzcwkJCTB4MDg4CisJc2l6ZQk0CisJYWNjZXNzX21vZGUgUlcKK30KKworcmVnaXN0ZXIgSENOVCB7CisJYWRkcmVzcwkJCTB4MDhjCisJc2l6ZQkzCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDQiBQb2ludGVyIChwLiAzLTQ5KQorICogR2F0ZSBvbmUgb2YgdGhlIGZvdXIgU0NCcyBpbnRvIHRoZSBTQ0JBUlJBWSB3aW5kb3cuCisgKi8KK3JlZ2lzdGVyIFNDQlBUUiB7CisJYWRkcmVzcwkJCTB4MDkwCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIEludGVycnVwdCBTdGF0dXMgKHAuIDMtNTApCisgKiBTdGF0dXMgZm9yIHN5c3RlbSBpbnRlcnJ1cHRzCisgKi8KK3JlZ2lzdGVyIElOVFNUQVQgeworCWFkZHJlc3MJCQkweDA5MQorCWFjY2Vzc19tb2RlIFJXCisJYml0CUJSS0FEUklOVCAweDA4CisJYml0CVNDU0lJTlQJICAweDA0CisJYml0CUNNRENNUExUICAweDAyCisJYml0CVNFUUlOVCAgICAweDAxCisJbWFzawlCQURfUEhBU0UJU0VRSU5UCQkvKiB1bmtub3duIHNjc2kgYnVzIHBoYXNlICovCisJbWFzawlTRU5EX1JFSkVDVAkweDEwfFNFUUlOVAkvKiBzZW5kaW5nIGEgbWVzc2FnZSByZWplY3QgKi8KKwltYXNrCU5PX0lERU5UCTB4MjB8U0VRSU5UCS8qIG5vIElERU5USUZZIGFmdGVyIHJlY29ubmVjdCovCisJbWFzawlOT19NQVRDSAkweDMwfFNFUUlOVAkvKiBubyBjbWQgbWF0Y2ggZm9yIHJlY29ubmVjdCAqLworCW1hc2sJRVhURU5ERURfTVNHCTB4NDB8U0VRSU5UCS8qIEV4dGVuZGVkIG1lc3NhZ2UgcmVjZWl2ZWQgKi8KKwltYXNrCVdJREVfUkVTSURVRQkweDUwfFNFUUlOVAkvKiBuZWVkIGtlcm5lbCB0byBiYWNrIHVwICovCisJCQkJCQkvKiB0aGUgU0cgYXJyYXkgZm9yIHVzICovCisJbWFzawlSRUpFQ1RfTVNHCTB4NjB8U0VRSU5UCS8qIFJlamVjdCBtZXNzYWdlIHJlY2VpdmVkICovCisJbWFzawlCQURfU1RBVFVTCTB4NzB8U0VRSU5UCS8qIEJhZCBzdGF0dXMgZnJvbSB0YXJnZXQgKi8KKwltYXNrCVJFU0lEVUFMCTB4ODB8U0VRSU5UCS8qIFJlc2lkdWFsIGJ5dGUgY291bnQgIT0gMCAqLworCW1hc2sJQVdBSVRJTkdfTVNHCTB4YTB8U0VRSU5UCS8qCisJCQkJCQkgKiBLZXJuZWwgcmVxdWVzdGVkIHRvIHNwZWNpZnkKKwkJCQkJCSAqIGEgbWVzc2FnZSB0byB0aGlzIHRhcmdldAorCQkJCQkJICogKGNvbW1hbmQgd2FzIG51bGwpLCBzbyB0ZWxsCisJCQkJCQkgKiBpdCB0aGF0IGl0IGNhbiBmaWxsIHRoZQorCQkJCQkJICogbWVzc2FnZSBidWZmZXIuCisJCQkJCQkgKi8KKwltYXNrCVNFUV9TR19GSVhVUAkweGIwfFNFUUlOVAkvKiBuZWVkIGhlbHAgd2l0aCBmaXhpbmcgdXAKKwkJCQkJCSAqIHRoZSBzZyBhcnJheSBwb2ludGVyIGFmdGVyCisJCQkJCQkgKiBhIHBoYXNlbWlzIHdpdGggbm8gdmFsaWQKKwkJCQkJCSAqIHNnIGVsZW1lbnRzIGluIHRoZSBzaGFkb3cKKwkJCQkJCSAqIHBpcGVsaW5lLgorCQkJCQkJICovCisJbWFzawlUUkFDRVBPSU5UMgkweGMwfFNFUUlOVAorCW1hc2sJTVNHSU5fUEhBU0VNSVMJMHhkMHxTRVFJTlQJLyoKKwkJCQkJCSAqIFRhcmdldCBjaGFuZ2VkIHBoYXNlIG9uIHVzCisJCQkJCQkgKiB3aGVuIHdlIHdlcmUgZXhwZWN0aW5nCisJCQkJCQkgKiBhbm90aGVyIG1zZ2luIGJ5dGUuCisJCQkJCQkgKi8KKwltYXNrCURBVEFfT1ZFUlJVTgkweGUwfFNFUUlOVAkvKgorCQkJCQkJICogVGFyZ2V0IGF0dGVtcHRlZCB0byB3cml0ZQorCQkJCQkJICogYmV5b25kIHRoZSBib3VuZHMgb2YgaXRzCisJCQkJCQkgKiBjb21tYW5kLgorCQkJCQkJICovCisKKwltYXNrCVNFUUlOVF9NQVNLCTB4ZjB8U0VRSU5UCS8qIFNFUUlOVCBTdGF0dXMgQ29kZXMgKi8KKwltYXNrCUlOVF9QRU5EICAoQlJLQURSSU5UfFNFUUlOVHxTQ1NJSU5UfENNRENNUExUKQorfQorCisvKgorICogSGFyZCBFcnJvciAocC4gMy01MykKKyAqIFJlcG9ydGluZyBvZiBjYXRhc3Ryb3BoaWMgZXJyb3JzLiAgWW91IHVzdWFsbHkgY2Fubm90IHJlY292ZXIgZnJvbQorICogdGhlc2Ugd2l0aG91dCBhIGZ1bGwgYm9hcmQgcmVzZXQuCisgKi8KK3JlZ2lzdGVyIEVSUk9SIHsKKwlhZGRyZXNzCQkJMHgwOTIKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlDSU9QQVJFUlIJMHg4MAkvKiBVbHRyYTIgb25seSAqLworCWJpdAlQQ0lFUlJTVEFUCTB4NDAJLyogUENJIG9ubHkgKi8KKwliaXQJTVBBUkVSUgkJMHgyMAkvKiBQQ0kgb25seSAqLworCWJpdAlEUEFSRVJSCQkweDEwCS8qIFBDSSBvbmx5ICovCisJYml0CVNRUEFSRVJSCTB4MDgKKwliaXQJSUxMT1BDT0RFCTB4MDQKKwliaXQJSUxMU0FERFIJMHgwMgorCWJpdAlEU0NUTU9VVAkweDAyCS8qIFVsdHJhMyBvbmx5ICovCisJYml0CUlMTEhBRERSCTB4MDEKK30KKworLyoKKyAqIENsZWFyIEludGVycnVwdCBTdGF0dXMgKHAuIDMtNTIpCisgKi8KK3JlZ2lzdGVyIENMUklOVCB7CisJYWRkcmVzcwkJCTB4MDkyCisJYWNjZXNzX21vZGUgV08KKwliaXQJQ0xSUEFSRVJSCTB4MTAJLyogUENJIG9ubHkgKi8KKwliaXQJQ0xSQlJLQURSSU5UCTB4MDgKKwliaXQJQ0xSU0NTSUlOVCAgICAgIDB4MDQKKwliaXQJQ0xSQ01ESU5UIAkweDAyCisJYml0CUNMUlNFUUlOVCAJMHgwMQorfQorCityZWdpc3RlciBERkNOVFJMIHsKKwlhZGRyZXNzCQkJMHgwOTMKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlQUkVMT0FERU4JMHg4MAkvKiBhaWM3ODkwIG9ubHkgKi8KKwliaXQJV0lERU9ERAkJMHg0MAorCWJpdAlTQ1NJRU4JCTB4MjAKKwliaXQJU0RNQUVOCQkweDEwCisJYml0CVNETUFFTkFDSwkweDEwCisJYml0CUhETUFFTgkJMHgwOAorCWJpdAlIRE1BRU5BQ0sJMHgwOAorCWJpdAlESVJFQ1RJT04JMHgwNAorCWJpdAlGSUZPRkxVU0gJMHgwMgorCWJpdAlGSUZPUkVTRVQJMHgwMQorfQorCityZWdpc3RlciBERlNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDk0CisJYWNjZXNzX21vZGUgUk8KKwliaXQJUFJFTE9BRF9BVkFJTAkweDgwCisJYml0CURXT1JERU1QCTB4MjAKKwliaXQJTVJFUVBFTkQJMHgxMAorCWJpdAlIRE9ORQkJMHgwOAorCWJpdAlERlRIUkVTSAkweDA0CisJYml0CUZJRk9GVUxMCTB4MDIKKwliaXQJRklGT0VNUAkJMHgwMQorfQorCityZWdpc3RlciBERkRBVCB7CisJYWRkcmVzcwkJCTB4MDk5CisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFNDQiBBdXRvIEluY3JlbWVudCAocC4gMy01OSkKKyAqIEJ5dGUgb2Zmc2V0IGludG8gdGhlIFNDQiBBcnJheSBhbmQgYW4gb3B0aW9uYWwgYml0IHRvIGFsbG93IGF1dG8KKyAqIGluY3JlbWVudGluZyBvZiB0aGUgYWRkcmVzcyBkdXJpbmcgZG93bmxvYWQgYW5kIHVwbG9hZCBvcGVyYXRpb25zCisgKi8KK3JlZ2lzdGVyIFNDQkNOVCB7CisJYWRkcmVzcwkJCTB4MDlhCisJYWNjZXNzX21vZGUgUlcKKwliaXQJU0NCQVVUTwkJMHg4MAorCW1hc2sJU0NCQ05UX01BU0sJMHgxZgorfQorCisvKgorICogUXVldWUgSW4gRklGTyAocC4gMy02MCkKKyAqIElucHV0IHF1ZXVlIGZvciBxdWV1ZWQgU0NCcyAoY29tbWFuZHMgdGhhdCB0aGUgc2VxZW5jZXIgaGFzIHlldCB0byBzdGFydCkKKyAqLworcmVnaXN0ZXIgUUlORklGTyB7CisJYWRkcmVzcwkJCTB4MDliCisJYWNjZXNzX21vZGUgUlcKK30KKworLyoKKyAqIFF1ZXVlIEluIENvdW50IChwLiAzLTYwKQorICogTnVtYmVyIG9mIHF1ZXVlZCBTQ0JzCisgKi8KK3JlZ2lzdGVyIFFJTkNOVAl7CisJYWRkcmVzcwkJCTB4MDljCisJYWNjZXNzX21vZGUgUk8KK30KKworLyoKKyAqIFNDU0lEQVRMIElNQUdFIFJlZ2lzdGVyIChwLiA1LTEwNCkKKyAqIFdyaXRlIHRvIHRoaXMgcmVnaXN0ZXIgYWxzbyBnbyB0byBTQ1NJREFUTCBidXQgdGhpcyByZWdpc3RlciB3aWxsIHByZXNlcnZlCisgKiB0aGUgZGF0YSBmb3IgbGF0ZXIgcmVhZGluZyBhcyBsb25nIGFzIHRoZSBTQ1NJREFUTF9JTUdFTiBiaXQgaW4gdGhlCisgKiBPUFRJT05NT0RFIHJlZ2lzdGVyIGlzIHNldC4KKyAqLworcmVnaXN0ZXIgU0NTSURBVExfSU1HIHsKKwlhZGRyZXNzCQkJMHgwOWMKKwlhY2Nlc3NfbW9kZSBSVworfQorCisvKgorICogUXVldWUgT3V0IEZJRk8gKHAuIDMtNjEpCisgKiBRdWV1ZSBvZiBTQ0JzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgYW5kIGF3YWl0IHRoZSBob3N0CisgKi8KK3JlZ2lzdGVyIFFPVVRGSUZPIHsKKwlhZGRyZXNzCQkJMHgwOWQKKwlhY2Nlc3NfbW9kZSBXTworfQorCisvKgorICogQ1JDIENvbnRyb2wgMSBSZWdpc3RlciAocC4gNS0xMDUpCisgKiBDb250cm9sIGJpdHMgZm9yIHRoZSBVbHRyYSAxNjAvbSBDUkMgZmFjaWxpdGllcworICovCityZWdpc3RlciBDUkNDT05UUk9MMSB7CisJYWRkcmVzcwkJCTB4MDlkCisJYWNjZXNzX21vZGUgUlcKKwliaXQJQ1JDT05TRUVOCTB4ODAgLyogQ1JDIE9OIFNpbmdsZSBFZGdlIEVOYWJsZSAqLworCWJpdAlDUkNWQUxDSEtFTgkweDQwIC8qIENSQyBWYWx1ZSBDaGVjayBFbmFibGUgKi8KKwliaXQJQ1JDRU5EQ0hLRU4JMHgyMCAvKiBDUkMgRW5kIENoZWNrIEVuYWJsZSAqLworCWJpdAlDUkNSRVFDSEtFTgkweDEwCisJYml0CVRBUkdDUkNFTkRFTgkweDA4IC8qIEVuYWJsZSBFbmQgQ1JDIHRyYW5zZmVyIHdoZW4gdGFyZ2V0ICovCisJYml0CVRBUkdDUkNDTlRFTgkweDA0IC8qIEVuYWJsZSBDUkMgdHJhbnNmZXIgd2hlbiB0YXJnZXQgKi8KK30KKworLyoKKyAqIFF1ZXVlIE91dCBDb3VudCAocC4gMy02MSkKKyAqIE51bWJlciBvZiBxdWV1ZWQgU0NCcyBpbiB0aGUgT3V0IEZJRk8KKyAqLworcmVnaXN0ZXIgUU9VVENOVCB7CisJYWRkcmVzcwkJCTB4MDllCisJYWNjZXNzX21vZGUgUk8KK30KKworLyoKKyAqIFNDU0kgUGhhc2UgUmVnaXN0ZXIgKHAuIDUtMTA2KQorICogQ3VycmVudCBidXMgcGhhc2UKKyAqLworcmVnaXN0ZXIgU0NTSVBIQVNFIHsKKwlhZGRyZXNzCQkJMHgwOWUKKwlhY2Nlc3NfbW9kZSBSTworCWJpdAlTUF9TVEFUVVMJCTB4MjAKKwliaXQJU1BfQ09NTUFORAkJMHgxMAorCWJpdAlTUF9NU0dfSU4JCTB4MDgKKwliaXQJU1BfTVNHX09VVAkJMHgwNAorCWJpdAlTUF9EQVRBX0lOCQkweDAyCisJYml0CVNQX0RBVEFfT1VUCTB4MDEKK30KKworLyoKKyAqIFNwZWNpYWwgRnVuY3Rpb24KKyAqLworcmVnaXN0ZXIgU0ZVTkNUIHsKKwlhZGRyZXNzCQkJMHgwOWYKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlBTFRfTU9ERQkweDgwCit9CisKKy8qCisgKiBTQ0IgRGVmaW5pdGlvbiAocC4gNS00KQorICovCitzY2IgeworCWFkZHJlc3MJCQkweDBhMAorCVNDQl9DT05UUk9MIHsKKwkJc2l6ZQkxCisJCWJpdAlNS19NRVNTQUdFICAgICAgMHg4MAorCQliaXQJRElTQ0VOQiAgICAgICAgIDB4NDAKKwkJYml0CVRBR19FTkIJCTB4MjAKKwkJYml0CURJU0NPTk5FQ1RFRAkweDA0CisJCW1hc2sJU0NCX1RBR19UWVBFCTB4MDMKKwl9CisJU0NCX1RDTCB7CisJCXNpemUJMQorCQliaXQJU0VMQlVTQgkJMHgwOAorCQltYXNrCVRJRAkJMHhmMAorCQltYXNrCUxJRAkJMHgwNworCX0KKwlTQ0JfVEFSR0VUX1NUQVRVUyB7CisJCXNpemUJMQorCX0KKwlTQ0JfU0dDT1VOVCB7CisJCXNpemUJMQorCX0KKwlTQ0JfU0dQVFIgeworCQlzaXplCTQKKwl9CisJU0NCX1JFU0lEX1NHQ05UIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9SRVNJRF9EQ05UCXsKKwkJc2l6ZQkzCisJfQorCVNDQl9EQVRBUFRSIHsKKwkJc2l6ZQk0CisJfQorCVNDQl9EQVRBQ05UIHsKKwkJLyoKKwkJICogUmVhbGx5IG9ubHkgMyBieXRlcywgYnV0IHBhZGRlZCB0byBtYWtlCisJCSAqIHRoZSBrZXJuZWwncyBqb2IgZWFzaWVyLgorCQkgKi8KKwkJc2l6ZQk0CisJfQorCVNDQl9DTURQVFIgeworCQlzaXplCTQKKwl9CisJU0NCX0NNRExFTiB7CisJCXNpemUJMQorCX0KKwlTQ0JfVEFHIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9ORVhUIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9QUkVWIHsKKwkJc2l6ZQkxCisJfQorCVNDQl9CVVNZVEFSR0VUUyB7CisJCXNpemUJNAorCX0KK30KKworY29uc3QJU0dfU0laRU9GCTB4MDgJCS8qIHNpemVvZihzdHJ1Y3QgYWhjX2RtYSkgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFIQS0yODQwLW9ubHkgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworcmVnaXN0ZXIgU0VFQ1RMXzI4NDAgeworCWFkZHJlc3MJCQkweDBjMAorCWFjY2Vzc19tb2RlIFJXCisJYml0CUNTXzI4NDAJCTB4MDQKKwliaXQJQ0tfMjg0MAkJMHgwMgorCWJpdAlET18yODQwCQkweDAxCit9CisKK3JlZ2lzdGVyIFNUQVRVU18yODQwIHsKKwlhZGRyZXNzCQkJMHgwYzEKKwlhY2Nlc3NfbW9kZSBSVworCWJpdAlFRVBST01fVEYJMHg4MAorCW1hc2sJQklPU19TRUwJMHg2MAorCW1hc2sJQURTRUwJCTB4MWUKKwliaXQJRElfMjg0MAkJMHgwMQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUlDLTc4NzAtb25seSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCityZWdpc3RlciBEU1BDSVNUQVRVUyB7CisJYWRkcmVzcwkJCTB4MDg2CisJbWFzawlERlRIUlNIXzEwMAkweGMwCit9CisKK3JlZ2lzdGVyIENDSEFERFIgeworCWFkZHJlc3MJCQkweDBFMAorCXNpemUgOAorfQorCityZWdpc3RlciBDQ0hDTlQgeworCWFkZHJlc3MJCQkweDBFOAorfQorCityZWdpc3RlciBDQ1NHUkFNIHsKKwlhZGRyZXNzCQkJMHgwRTkKK30KKworcmVnaXN0ZXIgQ0NTR0FERFIgeworCWFkZHJlc3MJCQkweDBFQQorfQorCityZWdpc3RlciBDQ1NHQ1RMIHsKKwlhZGRyZXNzCQkJMHgwRUIKKwliaXQJQ0NTR0RPTkUJMHg4MAorCWJpdAlDQ1NHRU4JCTB4MDgKKwliaXQJRkxBRwkJMHgwMgorCWJpdAlDQ1NHUkVTRVQJMHgwMQorfQorCityZWdpc3RlciBDQ1NDQkNOVCB7CisJYWRkcmVzcwkJCTB4RUYKK30KKworcmVnaXN0ZXIgQ0NTQ0JDVEwgeworCWFkZHJlc3MJCQkweDBFRQorCWJpdAlDQ1NDQkRPTkUJMHg4MAorCWJpdAlBUlJET05FCQkweDQwCS8qIFNDQiBBcnJheSBwcmVmZXRjaCBkb25lICovCisJYml0CUNDQVJSRU4JCTB4MTAKKwliaXQJQ0NTQ0JFTgkJMHgwOAorCWJpdAlDQ1NDQkRJUgkweDA0CisJYml0CUNDU0NCUkVTRVQJMHgwMQorfQorCityZWdpc3RlciBDQ1NDQkFERFIgeworCWFkZHJlc3MJCQkweDBFRAorfQorCityZWdpc3RlciBDQ1NDQlJBTSB7CisJYWRkcmVzcwkJCTB4RUMKK30KKworcmVnaXN0ZXIgQ0NTQ0JQVFIgeworCWFkZHJlc3MJCQkweDBGMQorfQorCityZWdpc3RlciBITlNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwRjQKK30KKworcmVnaXN0ZXIgSEVTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MEY1Cit9CisKK3JlZ2lzdGVyIFNOU0NCX1FPRkYgeworCWFkZHJlc3MJCQkweDBGNgorfQorCityZWdpc3RlciBTRVNDQl9RT0ZGIHsKKwlhZGRyZXNzCQkJMHgwRjcKK30KKworcmVnaXN0ZXIgU0RTQ0JfUU9GRiB7CisJYWRkcmVzcwkJCTB4MEY4Cit9CisKK3JlZ2lzdGVyIFFPRkZfQ1RMU1RBIHsKKwlhZGRyZXNzCQkJMHgwRkEKKwliaXQJRVNUQUJMSVNIX1NDQl9BVkFJTAkweDgwCisJYml0CVNDQl9BVkFJTAkweDQwCisJYml0CVNOU0NCX1JPTExPVkVSCTB4MjAKKwliaXQJU0RTQ0JfUk9MTE9WRVIJMHgxMAorCWJpdAlTRVNDQl9ST0xMT1ZFUgkweDA4CisJbWFzawlTQ0JfUVNJWkUJMHgwNworCW1hc2sJU0NCX1FTSVpFXzI1NgkweDA2Cit9CisKK3JlZ2lzdGVyIERGRl9USFJTSCB7CisJYWRkcmVzcwkJCTB4MEZCCisJbWFzawlXUl9ERlRIUlNICTB4NzAKKwltYXNrCVJEX0RGVEhSU0gJMHgwNworCW1hc2sJUkRfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJUkRfREZUSFJTSF8yNQkweDAxCisJbWFzawlSRF9ERlRIUlNIXzUwCTB4MDIKKwltYXNrCVJEX0RGVEhSU0hfNjMJMHgwMworCW1hc2sJUkRfREZUSFJTSF83NQkweDA0CisJbWFzawlSRF9ERlRIUlNIXzg1CTB4MDUKKwltYXNrCVJEX0RGVEhSU0hfOTAJMHgwNgorCW1hc2sJUkRfREZUSFJTSF9NQVgJMHgwNworCW1hc2sJV1JfREZUSFJTSF9NSU4JMHgwMAorCW1hc2sJV1JfREZUSFJTSF8yNQkweDEwCisJbWFzawlXUl9ERlRIUlNIXzUwCTB4MjAKKwltYXNrCVdSX0RGVEhSU0hfNjMJMHgzMAorCW1hc2sJV1JfREZUSFJTSF83NQkweDQwCisJbWFzawlXUl9ERlRIUlNIXzg1CTB4NTAKKwltYXNrCVdSX0RGVEhSU0hfOTAJMHg2MAorCW1hc2sJV1JfREZUSFJTSF9NQVgJMHg3MAorfQorCityZWdpc3RlciBTR19DQUNIRVBUUiB7CisJYWNjZXNzX21vZGUgUlcKKwlhZGRyZXNzCQkJMHgwZmMKKwltYXNrCVNHX1VTRVJfREFUQQkweGZjCisJYml0CUxBU1RfU0VHCTB4MDIKKwliaXQJTEFTVF9TRUdfRE9ORQkweDAxCit9CisKK3JlZ2lzdGVyIEJSRENUTAl7CisJYWRkcmVzcwkJCTB4MDFkCisJYml0CUJSRERBVDcJCTB4ODAKKwliaXQJQlJEREFUNgkJMHg0MAorCWJpdAlCUkREQVQ1CQkweDIwCisJYml0CUJSRFNUQgkJMHgxMAorCWJpdAlCUkRDUwkJMHgwOAorCWJpdAlCUkRSVwkJMHgwNAorCWJpdAlCUkRDVEwxCQkweDAyCisJYml0CUJSRENUTDAJCTB4MDEKKwkvKiA3ODkwIERlZmluaXRpb25zICovCisJYml0CUJSRERBVDQJCTB4MTAKKwliaXQJQlJEREFUMwkJMHgwOAorCWJpdAlCUkREQVQyCQkweDA0CisJYml0CUJSRFJXX1VMVFJBMgkweDAyCisJYml0CUJSRFNUQl9VTFRSQTIJMHgwMQorfQorCisvKgorICogU2VyaWFsIEVFUFJPTSBDb250cm9sIChwLiA0LTkyIGluIDc4NzAgRGF0YWJvb2spCisgKiBDb250cm9scyB0aGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBhbiBleHRlcm5hbCBzZXJpYWwgMS1iaXQKKyAqIEVFUFJPTSBEZXZpY2UuICBJbiBvcmRlciB0byBhY2Nlc3MgdGhlIHNlcmlhbCBFRVBST00sIHlvdSBtdXN0CisgKiBmaXJzdCBzZXQgdGhlIFNFRU1TIGJpdCB0aGF0IGdlbmVyYXRlcyBhIHJlcXVlc3QgdG8gdGhlIG1lbW9yeQorICogcG9ydCBmb3IgYWNjZXNzIHRvIHRoZSBzZXJpYWwgRUVQUk9NIGRldmljZS4gIFdoZW4gdGhlIG1lbW9yeQorICogcG9ydCBpcyBub3QgYnVzeSBzZXJ2aWNpbmcgYW5vdGhlciByZXF1ZXN0LCBpdCByZWNvbmZpZ3VyZXMKKyAqIHRvIGFsbG93IGFjY2VzcyB0byB0aGUgc2VyaWFsIEVFUFJPTS4gIFdoZW4gdGhpcyBoYXBwZW5zLCBTRUVSRFkKKyAqIGdldHMgc2V0IGhpZ2ggdG8gdmVyaWZ5IHRoYXQgdGhlIG1lbW9yeSBwb3J0IGFjY2VzcyBoYXMgYmVlbgorICogZ3JhbnRlZC4gIAorICoKKyAqIEFmdGVyIHN1Y2Nlc3NmdWwgYXJiaXRyYXRpb24gZm9yIHRoZSBtZW1vcnkgcG9ydCwgdGhlIFNFRUNTIGJpdCBvZiAKKyAqIHRoZSBTRUVDVEwgcmVnaXN0ZXIgaXMgY29ubmVjdGVkIHRvIHRoZSBjaGlwIHNlbGVjdC4gIFRoZSBTRUVDSywgCisgKiBTRUVETywgYW5kIFNFRURJIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNsb2NrLCBkYXRhIG91dCwgYW5kIGRhdGEgaW4gCisgKiBsaW5lcyByZXNwZWN0aXZlbHkuICBUaGUgU0VFUkRZIGJpdCBvZiBTRUVDVEwgaXMgdXNlZnVsIGluIHRoYXQgaXQgCisgKiBnaXZlcyB1cyBhbiA4MDAgbnNlYyB0aW1lci4gIEFmdGVyIGEgd3JpdGUgdG8gdGhlIFNFRUNUTCByZWdpc3RlciwgCisgKiB0aGUgU0VFUkRZIGdvZXMgaGlnaCA4MDAgbnNlYyBsYXRlci4gIFRoZSBvbmUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgCisgKiB3aGVuIHdlIGZpcnN0IHJlcXVlc3QgYWNjZXNzIHRvIHRoZSBtZW1vcnkgcG9ydC4gIFRoZSBTRUVSRFkgZ29lcyAKKyAqIGhpZ2ggdG8gc2lnbmlmeSB0aGF0IGFjY2VzcyBoYXMgYmVlbiBncmFudGVkIGFuZCwgZm9yIHRoaXMgY2FzZSwgaGFzIAorICogbm8gaW1wbGllZCB0aW1pbmcuCisgKgorICogU2VlIDkzY3g2LmMgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBwcm90b2NvbCBuZWNlc3NhcnkgdG8gCisgKiByZWFkIHRoZSBzZXJpYWwgRUVQUk9NLgorICovCityZWdpc3RlciBTRUVDVEwgeworCWFkZHJlc3MJCQkweDAxZQorCWJpdAlFWFRBUkJBQ0sJMHg4MAorCWJpdAlFWFRBUkJSRVEJMHg0MAorCWJpdAlTRUVNUwkJMHgyMAorCWJpdAlTRUVSRFkJCTB4MTAKKwliaXQJU0VFQ1MJCTB4MDgKKwliaXQJU0VFQ0sJCTB4MDQKKwliaXQJU0VFRE8JCTB4MDIKKwliaXQJU0VFREkJCTB4MDEKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2NyYXRjaCBSQU0gT2Zmc2V0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGVzZSBvZmZzZXRzIGFyZSBlaXRoZXIgdG8gdmFsdWVzIHRoYXQgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBib2FyZCdzCisgKiBCSU9TIG9yIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHNlcXVlbmNlciBjb2RlLgorICoKKyAqIFRoZSBob3N0IGFkYXB0ZXIgY2FyZCAoYXQgbGVhc3QgdGhlIEJJT1MpIHVzZXMgMjAtMmYgZm9yIFNDU0kKKyAqIGRldmljZSBpbmZvcm1hdGlvbiwgMzItMzMgYW5kIDVhLTVmIGFzIHdlbGwuIEFzIGl0IHR1cm5zIG91dCwgdGhlCisgKiBCSU9TIHRyYXNoZXMgMjAtMmYsIHdyaXRpbmcgdGhlIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIHJlc3VsdHMKKyAqIG9uIHRvcCBvZiB0aGUgQklPUyB2YWx1ZXMsIHNvIHdlIHJlLXVzZSB0aG9zZSBmb3Igb3VyIHBlci10YXJnZXQKKyAqIHNjcmF0Y2hzcGFjZSAoYWN0dWFsbHkgYSB2YWx1ZSB0aGF0IGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkgaW50bworICogU0NTSVJBVEUpLiAgVGhlIGtlcm5lbCBkcml2ZXIgd2lsbCBlbmFibGUgc3luY2hyb25vdXMgbmVnb3RpYXRpb24KKyAqIGZvciBhbGwgdGFyZ2V0cyB0aGF0IGhhdmUgYSB2YWx1ZSBvdGhlciB0aGFuIDAgaW4gdGhlIGxvd2VyIGZvdXIKKyAqIGJpdHMgb2YgdGhlIHRhcmdldCBzY3JhdGNoIHNwYWNlLiAgVGhpcyBzaG91bGQgd29yayByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIHRoZSBiaW9zIGhhcyBiZWVuIGluc3RhbGxlZC4KKyAqLworCitzY3JhdGNoX3JhbSB7CisJYWRkcmVzcwkJCTB4MDIwCisKKwkvKgorCSAqIDEgYnl0ZSBwZXIgdGFyZ2V0IHN0YXJ0aW5nIGF0IHRoaXMgYWRkcmVzcyBmb3IgY29uZmlndXJhdGlvbiB2YWx1ZXMKKwkgKi8KKwlUQVJHX1NDU0lSQVRFIHsKKwkJc2l6ZQkJMTYKKwl9CisJLyoKKwkgKiBCaXQgdmVjdG9yIG9mIHRhcmdldHMgdGhhdCBoYXZlIFVMVFJBIGVuYWJsZWQuCisJICovCisJVUxUUkFfRU5CIHsKKwkJc2l6ZQkJMgorCX0KKwkvKgorCSAqIEJpdCB2ZWN0b3Igb2YgdGFyZ2V0cyB0aGF0IGhhdmUgZGlzY29ubmVjdGlvbiBkaXNhYmxlZC4KKwkgKi8KKwlESVNDX0RTQiB7CisJCXNpemUJCTIKKwl9CisJLyoKKwkgKiBTaW5nbGUgYnl0ZSBidWZmZXIgdXNlZCB0byBkZXNpZ25hdGUgdGhlIHR5cGUgb3IgbWVzc2FnZQorCSAqIHRvIHNlbmQgdG8gYSB0YXJnZXQuCisJICovCisJTVNHX09VVCB7CisJCXNpemUJCTEKKwl9CisJLyogUGFyYW1ldGVycyBmb3IgRE1BIExvZ2ljICovCisJRE1BUEFSQU1TIHsKKwkJc2l6ZQkJMQorCQliaXQJUFJFTE9BREVOCTB4ODAKKwkJYml0CVdJREVPREQJCTB4NDAKKwkJYml0CVNDU0lFTgkJMHgyMAorCQliaXQJU0RNQUVOCQkweDEwCisJCWJpdAlTRE1BRU5BQ0sJMHgxMAorCQliaXQJSERNQUVOCQkweDA4CisJCWJpdAlIRE1BRU5BQ0sJMHgwOAorCQliaXQJRElSRUNUSU9OCTB4MDQKKwkJYml0CUZJRk9GTFVTSAkweDAyCisJCWJpdAlGSUZPUkVTRVQJMHgwMQorCX0KKwlTRVFfRkxBR1MgeworCQlzaXplCQkxCisJCWJpdAlJREVOVElGWV9TRUVOCTB4ODAKKwkJYml0CVNDQlBUUl9WQUxJRAkweDIwCisJCWJpdAlEUEhBU0UJCTB4MTAKKwkJYml0CUFNVEFSR0VUCTB4MDgKKwkJYml0CVdJREVfQlVTCTB4MDIKKwkJYml0CVRXSU5fQlVTCTB4MDEKKwl9CisJLyoKKwkgKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlCisJICogdGFyZ2V0L2NoYW5uZWwvbHVuIG9mIGEKKwkgKiByZWNvbm5lY3RpbmcgdGFyZ2V0CisJICovCisJU0FWRURfVENMIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBXb3JraW5nIHZhbHVlIG9mIHRoZSBudW1iZXIgb2YgU0cgc2VnbWVudHMgbGVmdCAqLworCVNHX0NPVU5UIHsKKwkJc2l6ZQkJMQorCX0KKwkvKiBXb3JraW5nIHZhbHVlIG9mIFNHIHBvaW50ZXIgKi8KKwlTR19ORVhUCXsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIFRoZSBsYXN0IGJ1cyBwaGFzZSBhcyBzZWVuIGJ5IHRoZSBzZXF1ZW5jZXIuIAorCSAqLworCUxBU1RQSEFTRSB7CisJCXNpemUJCTEKKwkJYml0CUNESQkJMHg4MAorCQliaXQJSU9JCQkweDQwCisJCWJpdAlNU0dJCQkweDIwCisJCW1hc2sJUEhBU0VfTUFTSwlDREl8SU9JfE1TR0kKKwkJbWFzawlQX0RBVEFPVVQJMHgwMAorCQltYXNrCVBfREFUQUlOCUlPSQorCQltYXNrCVBfQ09NTUFORAlDREkKKwkJbWFzawlQX01FU0dPVVQJQ0RJfE1TR0kKKwkJbWFzawlQX1NUQVRVUwlDREl8SU9JCisJCW1hc2sJUF9NRVNHSU4JQ0RJfElPSXxNU0dJCisJCW1hc2sJUF9CVVNGUkVFCTB4MDEKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyBhd2FpdGluZworCSAqIHNlbGVjdGlvbgorCSAqLworCVdBSVRJTkdfU0NCSCB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyB0aGF0IGFyZQorCSAqIGRpc2Nvbm5lY3RlZC4gIFVzZWQgZm9yIFNDQgorCSAqIHBhZ2luZy4KKwkgKi8KKwlESVNDT05ORUNURURfU0NCSCB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBoZWFkIG9mIGxpc3Qgb2YgU0NCcyB0aGF0IGFyZQorCSAqIG5vdCBpbiB1c2UuICBVc2VkIGZvciBTQ0IgcGFnaW5nLgorCSAqLworCUZSRUVfU0NCSCB7CisJCXNpemUJCTEKKwl9CisJLyoKKwkgKiBBZGRyZXNzIG9mIHRoZSBoYXJkd2FyZSBzY2IgYXJyYXkgaW4gdGhlIGhvc3QuCisJICovCisJSFNDQl9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIEFkZHJlc3Mgb2YgdGhlIDI1NiBieXRlIGFycmF5IHN0b3JpbmcgdGhlIFNDQklEIG9mIG91dHN0YW5kaW5nCisJICogdW50YWdnZWQgU0NCcyBpbmRleGVkIGJ5IFRDTC4KKwkgKi8KKwlTQ0JJRF9BRERSIHsKKwkJc2l6ZQkJNAorCX0KKwkvKgorCSAqIEFkZHJlc3Mgb2YgdGhlIGFycmF5IG9mIGNvbW1hbmQgZGVzY3JpcHRvcnMgdXNlZCB0byBzdG9yZQorCSAqIGluZm9ybWF0aW9uIGFib3V0IGluY29taW5nIHNlbGVjdGlvbnMuCisJICovCisJVE1PREVfQ01EQUREUiB7CisJCXNpemUJCTQKKwl9CisJS0VSTkVMX1FJTlBPUyB7CisJCXNpemUJCTEKKwl9CisJUUlOUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwlRT1VUUE9TIHsKKwkJc2l6ZQkJMQorCX0KKwkvKgorCSAqIE9mZnNldCBpbnRvIHRoZSBjb21tYW5kIGRlc2NyaXB0b3IgYXJyYXkgZm9yIHRoZSBuZXh0CisJICogYXZhaWxhYmxlIGRlc2NpcHRvciB0byB1c2UuCisJICovCisJVE1PREVfQ01EQUREUl9ORVhUIHsKKwkJc2l6ZQkJMQorCX0KKwlBUkdfMSB7CisJCXNpemUJCTEKKwkJbWFzawlTRU5EX01TRwkweDgwCisJCW1hc2sJU0VORF9TRU5TRQkweDQwCisJCW1hc2sJU0VORF9SRUoJMHgyMAorCQltYXNrCU1TR09VVF9QSEFTRU1JUwkweDEwCisJCWFsaWFzCVJFVFVSTl8xCisJfQorCUFSR18yIHsKKwkJc2l6ZQkJMQorCQlhbGlhcwlSRVRVUk5fMgorCX0KKworCS8qCisJICogU25hcHNob3Qgb2YgTVNHX09VVCB0YWtlbiBhZnRlciBlYWNoIG1lc3NhZ2UgaXMgc2VudC4KKwkgKi8KKwlMQVNUX01TRyB7CisJCXNpemUJCTEKKwl9CisKKwkvKgorCSAqIE51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIGZpbGxlZCB0aGUgQ0NTR1JBTSB3aXRoIHByZWZldGNoZWQKKwkgKiBTRyBlbGVtZW50cy4KKwkgKi8KKwlQUkVGRVRDSF9DTlQgeworCQlzaXplCQkxCisJfQorCisKKwkvKgorCSAqIFRoZXNlIGFyZSByZXNlcnZlZCByZWdpc3RlcnMgaW4gdGhlIGNhcmQncyBzY3JhdGNoIHJhbS4gIFNvbWUgb2YKKwkgKiB0aGUgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEFIQTI3NDIgdGVjaG5pY2FsIHJlZmVyZW5jZSBtYW51YWwKKwkgKiBhbmQgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBCSU9TIGF0IGJvb3QgdGltZS4KKwkgKi8KKwlTQ1NJQ09ORiB7CisJCWFkZHJlc3MJCTB4MDVhCisJCXNpemUJCTEKKwkJYml0CVRFUk1fRU5CCTB4ODAKKwkJYml0CVJFU0VUX1NDU0kJMHg0MAorCQltYXNrCUhTQ1NJSUQJCTB4MDcJLyogb3VyIFNDU0kgSUQgKi8KKwkJbWFzawlIV1NDU0lJRAkweDBmCS8qIG91ciBTQ1NJIElEIGlmIFdpZGUgQnVzICovCisJfQorCUhPU1RDT05GIHsKKwkJYWRkcmVzcwkJMHgwNWQKKwkJc2l6ZQkJMQorCX0KKwlIQV8yNzRfQklPU0NUUkwJeworCQlhZGRyZXNzCQkweDA1ZgorCQlzaXplCQkxCisJCW1hc2sJQklPU01PREUJCTB4MzAKKwkJbWFzawlCSU9TRElTQUJMRUQJCTB4MzAJCisJCWJpdAlDSEFOTkVMX0JfUFJJTUFSWQkweDA4CisJfQorCS8qCisJICogUGVyIHRhcmdldCBTQ1NJIG9mZnNldCB2YWx1ZXMgZm9yIFVsdHJhMiBjb250cm9sbGVycy4KKwkgKi8KKwlUQVJHX09GRlNFVCB7CisJCWFkZHJlc3MJCTB4MDcwCisJCXNpemUJCTE2CisJfQorfQorCitjb25zdCBTQ0JfTElTVF9OVUxMCTB4ZmYKKworY29uc3QgQ0NTR0FERFJfTUFYCTB4ODAKK2NvbnN0IENDU0dSQU1fTUFYU0VHUwkxNgorCisvKiBPZmZzZXRzIGludG8gdGhlIFNDQklEIGFycmF5IHdoZXJlIGRpZmZlcmVudCBkYXRhIGlzIHN0b3JlZCAqLworY29uc3QgVU5UQUdHRURTQ0JfT0ZGU0VUCTAKK2NvbnN0IFFPVVRGSUZPX09GRlNFVAkJMQorY29uc3QgUUlORklGT19PRkZTRVQJCTIKKworLyogV0RUUiBNZXNzYWdlIHZhbHVlcyAqLworY29uc3QgQlVTXzhfQklUCQkJMHgwMAorY29uc3QgQlVTXzE2X0JJVAkJMHgwMQorY29uc3QgQlVTXzMyX0JJVAkJMHgwMgorCisvKiBPZmZzZXQgbWF4aW11bXMgKi8KK2NvbnN0IE1BWF9PRkZTRVRfOEJJVAkJMHgwZgorY29uc3QgTUFYX09GRlNFVF8xNkJJVAkJMHgwOAorY29uc3QgTUFYX09GRlNFVF9VTFRSQTIJCTB4N2YKK2NvbnN0IEhPU1RfTVNHCQkJMHhmZgorCisvKiBUYXJnZXQgbW9kZSBjb21tYW5kIHByb2Nlc3NpbmcgY29uc3RhbnRzICovCitjb25zdCBDTURfR1JPVVBfQ09ERV9TSElGVAkweDA1Citjb25zdCBDTURfR1JPVVAwX0JZVEVfREVMVEEJLTQKK2NvbnN0IENNRF9HUk9VUDJfQllURV9ERUxUQQktNgorY29uc3QgQ01EX0dST1VQNF9CWVRFX0RFTFRBCTQKK2NvbnN0IENNRF9HUk9VUDVfQllURV9ERUxUQQkxMQorCisvKgorICogRG93bmxvYWRlZCAoa2VybmVsIGluc2VydGVkKSBjb25zdGFudHMKKyAqLworCisvKgorICogTnVtYmVyIG9mIGNvbW1hbmQgZGVzY3JpcHRvcnMgaW4gdGhlIGNvbW1hbmQgZGVzY3JpcHRvciBhcnJheS4KKyAqLworY29uc3QgVE1PREVfTlVNQ01EUwlkb3dubG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmM0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eC5zZXEKQEAgLTAsMCArMSwxNTM5IEBACisvKgorICogQWRhcHRlYyAyNzR4LzI4NHgvMjk0eCBkZXZpY2UgZHJpdmVyIGZpcm13YXJlIGZvciBMaW51eCBhbmQgRnJlZUJTRC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OSBKdXN0aW4gR2liYnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogV2hlcmUgdGhpcyBTb2Z0d2FyZSBpcyBjb21iaW5lZCB3aXRoIHNvZnR3YXJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKgkkSWQ6IGFpYzd4eHguc2VxLHYgMS43NyAxOTk4LzA2LzI4IDAyOjU4OjU3IGdpYmJzIEV4cCAkCisgKi8KKworI2luY2x1ZGUgImFpYzd4eHgucmVnIgorI2luY2x1ZGUgInNjc2lfbWVzc2FnZS5oIgorCisvKgorICogQSBmZXcgd29yZHMgb24gdGhlIHdhaXRpbmcgU0NCIGxpc3Q6CisgKiBBZnRlciBzdGFydGluZyB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlLCB3ZSBjaGVjayBmb3IgcmVjb25uZWN0aW5nIHRhcmdldHMKKyAqIGFzIHdlbGwgYXMgZm9yIG91ciBzZWxlY3Rpb24gdG8gY29tcGxldGUganVzdCBpbiBjYXNlIHRoZSByZXNlbGVjdGlvbiB3aW5zCisgKiBidXMgYXJiaXRyYXRpb24uICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YgdGhlCisgKiBTQ0IgdGhhdCB3ZSd2ZSBhbHJlYWR5IHB1bGxlZCBmcm9tIHRoZSBRSU5GSUZPIGFuZCBzdGFydGVkIHRoZSBzZWxlY3Rpb24KKyAqIG9uIGp1c3QgaW4gY2FzZSB0aGUgcmVzZWxlY3Rpb24gd2lucyBzbyB0aGF0IHdlIGNhbiByZXRyeSB0aGUgc2VsZWN0aW9uIGF0CisgKiBhIGxhdGVyIHRpbWUuICBUaGlzIHByb2JsZW0gY2Fubm90IGJlIHJlc29sdmVkIGJ5IGhvbGRpbmcgYSBzaW5nbGUgZW50cnkKKyAqIGluIHNjcmF0Y2ggcmFtIHNpbmNlIGEgcmVjb25uZWN0aW5nIHRhcmdldCBjYW4gcmVxdWVzdCBzZW5zZSBhbmQgdGhpcyB3aWxsCisgKiBjcmVhdGUgeWV0IGFub3RoZXIgU0NCIHdhaXRpbmcgZm9yIHNlbGVjdGlvbi4gIFRoZSBzb2x1dGlvbiB1c2VkIGhlcmUgaXMgdG8gCisgKiB1c2UgYnl0ZSAyNyBvZiB0aGUgU0NCIGFzIGEgcHNldWRvLW5leHQgcG9pbnRlciBhbmQgdG8gdGhyZWFkIGEgbGlzdAorICogb2YgU0NCcyB0aGF0IGFyZSBhd2FpdGluZyBzZWxlY3Rpb24uICBTaW5jZSAwLTB4ZmUgYXJlIHZhbGlkIFNDQiBpbmRleGVzLCAKKyAqIFNDQl9MSVNUX05VTEwgaXMgMHhmZiB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuICBBbiBlbnRyeSBpcyBhbHNvIGFkZGVkIHRvCisgKiB0aGlzIGxpc3QgZXZlcnl0aW1lIGEgcmVxdWVzdCBzZW5zZSBvY2N1cnMgb3IgYWZ0ZXIgY29tcGxldGluZyBhIG5vbi10YWdnZWQKKyAqIGNvbW1hbmQgZm9yIHdoaWNoIGEgc2Vjb25kIFNDQiBoYXMgYmVlbiBxdWV1ZWQuICBUaGUgc2VxdWVuY2VyIHdpbGwKKyAqIGF1dG9tYXRpY2FsbHkgY29uc3VtZSB0aGUgZW50cmllcy4KKyAqLworCityZXNldDoKKwljbHIJU0NTSVNJR087CQkvKiBEZS1hc3NlcnQgQlNZICovCisJYW5kCVNYRlJDVEwxLCB+QklUQlVDS0VUOworCS8qIEFsd2F5cyBhbGxvdyByZXNlbGVjdGlvbiAqLworCW12aQlTQ1NJU0VRLCBFTlJTRUxJfEVOQVVUT0FUTlA7CisKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCS8qIEVuc3VyZSB0aGF0IG5vIERNQSBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcyAqLworCQljbHIJQ0NTR0NUTDsKKwkJY2xyCUNDU0NCQ1RMOworCX0KKworCWNhbGwJY2xlYXJfdGFyZ2V0X3N0YXRlOworcG9sbF9mb3Jfd29yazoKKwlhbmQJU1hGUkNUTDAsIH5TUElPRU47CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSA9PSAwKSB7CisJCW1vdglBLCBRSU5QT1M7CisJfQorcG9sbF9mb3Jfd29ya19sb29wOgorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgPT0gMCkgeworCQlhbmQJU0VRQ1RMLCB+UEFVU0VESVM7CisJfQorCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxESQlqbnogc2VsZWN0aW9uOworCXRlc3QJU0NTSVNFUSwgRU5TRUxPCWpueiBwb2xsX2Zvcl93b3JrOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQkvKgorCQkgKiBUd2luIGNoYW5uZWwgZGV2aWNlcyBjYW5ub3QgaGFuZGxlIHRoaW5ncyBsaWtlIFNFTFRPCisJCSAqIGludGVycnVwdHMgb24gdGhlICJiYWNrZ3JvdW5kIiBjaGFubmVsLiAgU28sIGlmIHdlCisJCSAqIGFyZSBzZWxlY3RpbmcsIGtlZXAgcG9sbGluZyB0aGUgY3VycmVudCBjaGFubmVsIHV0aWwKKwkJICogZWl0aGVyIGEgc2VsZWN0aW9uIG9yIHJlc2VsZWN0aW9uIG9jY3Vycy4KKwkJICovCisJCXhvcglTQkxLQ1RMLFNFTEJVU0I7CS8qIFRvZ2dsZSB0byB0aGUgb3RoZXIgYnVzICovCisJCXRlc3QJU1NUQVQwLCBTRUxET3xTRUxESQlqbnogc2VsZWN0aW9uOworCQl0ZXN0CVNDU0lTRVEsIEVOU0VMTwlqbnogcG9sbF9mb3Jfd29yazsKKwkJeG9yCVNCTEtDVEwsU0VMQlVTQjsJLyogVG9nZ2xlIGJhY2sgKi8KKwl9CisJY21wCVdBSVRJTkdfU0NCSCxTQ0JfTElTVF9OVUxMIGpuZSBzdGFydF93YWl0aW5nOwordGVzdF9xdWV1ZToKKwkvKiBIYXMgdGhlIGRyaXZlciBwb3N0ZWQgYW55IHdvcmsgZm9yIHVzPyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgIT0gMCkgeworCQl0ZXN0CVFPRkZfQ1RMU1RBLCBTQ0JfQVZBSUwganogcG9sbF9mb3Jfd29ya19sb29wOworCQltb3YJTk9ORSwgU05TQ0JfUU9GRjsKKwkJaW5jCVFJTlBPUzsKKwl9IGVsc2UgeworCQlvcglTRVFDVEwsIFBBVVNFRElTOworCQljbXAJS0VSTkVMX1FJTlBPUywgQSBqZSBwb2xsX2Zvcl93b3JrX2xvb3A7CisJCWluYwlRSU5QT1M7CisJCWFuZAlTRVFDVEwsIH5QQVVTRURJUzsKKwl9CisKKy8qCisgKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBxdWV1ZWQgU0NCIG5vdyBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgCisgKiBTQ0JzIGluIHRoZSBsaXN0IG9mIFNDQnMgYXdhaXRpbmcgc2VsZWN0aW9uLiAgSWYgd2UgaGF2ZQorICogYW55IFNDQnMgYXZhaWxhYmxlIGZvciB1c2UsIHB1bGwgdGhlIHRhZyBmcm9tIHRoZSBRSU5GSUZPCisgKiBhbmQgZ2V0IHRvIHdvcmsgb24gaXQuCisgKi8KKwlpZiAoKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCW1vdglBTExaRVJPUwljYWxsCWdldF9mcmVlX29yX2Rpc2Nfc2NiOworCX0KKworZGVxdWV1ZV9zY2I6CisJYWRkCUEsIC0xLCBRSU5QT1M7CisJbXZpCVFJTkZJRk9fT0ZGU0VUIGNhbGwgZmV0Y2hfYnl0ZTsKKworCWlmICgocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpID09IDApIHsKKwkJLyogSW4gdGhlIG5vbi1wYWdpbmcgY2FzZSwgdGhlIFNDQklEID09IGhhcmR3YXJlIFNDQiBpbmRleCAqLworCQltb3YJU0NCUFRSLCBSRVRVUk5fMjsKKwl9CitkbWFfcXVldWVkX3NjYjoKKy8qCisgKiBETUEgdGhlIFNDQiBmcm9tIGhvc3QgcmFtIGludG8gdGhlIGN1cnJlbnQgU0NCIGxvY2F0aW9uLgorICovCisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CVJFVFVSTl8yCSBjYWxsIGRtYV9zY2I7CisKKy8qCisgKiBQcmVzZXQgdGhlIHJlc2lkdWFsIGZpZWxkcyBpbiBjYXNlIHdlIG5ldmVyIGdvIHRocm91Z2ggYSBkYXRhIHBoYXNlLgorICogVGhpcyBpc24ndCBkb25lIGJ5IHRoZSBob3N0IHNvIHdlIGNhbiBhdm9pZCBhIERNQSB0byBjbGVhciB0aGVzZQorICogZmllbGRzIGZvciB0aGUgbm9ybWFsIGNhc2Ugb2YgSS9PIHRoYXQgY29tcGxldGVzIHdpdGhvdXQgdW5kZXJydW4KKyAqIG9yIG92ZXJydW4gY29uZGl0aW9ucy4KKyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJYm1vdiAgICBTQ0JfUkVTSURfRENOVCwgU0NCX0RBVEFDTlQsIDM7CisJfSBlbHNlIHsKKwkJbW92ICAgICBTQ0JfUkVTSURfRENOVFswXSxTQ0JfREFUQUNOVFswXTsKKwkJbW92ICAgICBTQ0JfUkVTSURfRENOVFsxXSxTQ0JfREFUQUNOVFsxXTsKKwkJbW92ICAgICBTQ0JfUkVTSURfRENOVFsyXSxTQ0JfREFUQUNOVFsyXTsKKwl9CisJbW92ICAgICBTQ0JfUkVTSURfU0dDTlQsIFNDQl9TR0NPVU5UOworCitzdGFydF9zY2I6CisJLyoKKwkgKiBQbGFjZSB1cyBvbiB0aGUgd2FpdGluZyBsaXN0IGluIGNhc2Ugb3VyIHNlbGVjdGlvbgorCSAqIGRvZXNuJ3Qgd2luIGR1cmluZyBidXMgYXJiaXRyYXRpb24uCisJICovCisJbW92CVNDQl9ORVhULFdBSVRJTkdfU0NCSDsKKwltb3YJV0FJVElOR19TQ0JILCBTQ0JQVFI7CitzdGFydF93YWl0aW5nOgorCS8qCisJICogUHVsbCB0aGUgZmlyc3QgZW50cnkgb2ZmIG9mIHRoZSB3YWl0aW5nIFNDQiBsaXN0LgorCSAqLworCW1vdglTQ0JQVFIsIFdBSVRJTkdfU0NCSDsKKwljYWxsCXN0YXJ0X3NlbGVjdGlvbjsKKwlqbXAJcG9sbF9mb3Jfd29yazsKKworc3RhcnRfc2VsZWN0aW9uOgorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQlhbmQJU0lOREVYLH5TRUxCVVNCLFNCTEtDVEw7LyogQ2xlYXIgY2hhbm5lbCBzZWxlY3QgYml0ICovCisJCWFuZAlBLFNFTEJVU0IsU0NCX1RDTDsJLyogR2V0IG5ldyBjaGFubmVsIGJpdCAqLworCQlvcglTSU5ERVgsQTsKKwkJbW92CVNCTEtDVEwsU0lOREVYOwkJLyogc2VsZWN0IGNoYW5uZWwgKi8KKwl9Citpbml0aWFsaXplX3Njc2lpZDoKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlhbmQJQSwgVElELCBTQ0JfVENMOwkvKiBHZXQgdGFyZ2V0IElEICovCisJCWFuZAlTQ1NJSURfVUxUUkEyLCBPSUQ7CS8qIENsZWFyIG9sZCB0YXJnZXQgKi8KKwkJb3IJU0NTSUlEX1VMVFJBMiwgQTsKKwl9IGVsc2UgeworCQlhbmQJQSwgVElELCBTQ0JfVENMOwkvKiBHZXQgdGFyZ2V0IElEICovCisJCWFuZAlTQ1NJSUQsIE9JRDsJCS8qIENsZWFyIG9sZCB0YXJnZXQgKi8KKwkJb3IJU0NTSUlELCBBOworCX0KKwltb3YJU0NTSURBVEwsIEFMTFpFUk9TOwkJLyogY2xlYXIgb3V0IHRoZSBsYXRjaGVkICovCisJCQkJCQkvKiBkYXRhIHJlZ2lzdGVyLCB0aGlzICovCisJCQkJCQkvKiBmaXhlcyBhIGJ1ZyBvbiBzb21lICovCisJCQkJCQkvKiBjb250cm9sbGVycyB3aGVyZSB0aGUgKi8KKwkJCQkJCS8qIGxhc3QgYnl0ZSB3cml0dGVuIHRvICovCisJCQkJCQkvKiB0aGlzIHJlZ2lzdGVyIGNhbiBsZWFrICovCisJCQkJCQkvKiBvbnRvIHRoZSBkYXRhIGJ1cyBhdCAqLworCQkJCQkJLyogYmFkIHRpbWVzLCBzdWNoIGFzIGR1cmluZyAqLworCQkJCQkJLyogc2VsZWN0aW9uIHRpbWVvdXRzICovCisJbXZpCVNDU0lTRVEsIEVOU0VMT3xFTkFVVE9BVE5PfEVOUlNFTEl8RU5BVVRPQVROUCByZXQ7CisKKy8qCisgKiBJbml0aWFsaXplIFVsdHJhIG1vZGUgc2V0dGluZyBhbmQgY2xlYXIgdGhlIFNDU0kgY2hhbm5lbC4KKyAqIFNJTkRFWCBzaG91bGQgY29udGFpbiBhbnkgYWRkaXRpb25hbCBiaXQncyB0aGUgY2xpZW50IHdhbnRzCisgKiBzZXQgaW4gU1hGUkNUTDAuCisgKi8KK2luaXRpYWxpemVfY2hhbm5lbDoKKwlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOLCBTSU5ERVg7CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCkgewordWx0cmE6CisJCW12aQlTSU5ERVgsIFVMVFJBX0VOQisxOworCQl0ZXN0CVNBVkVEX1RDTCwgMHg4MAkJam56IHVsdHJhXzI7IC8qIFRhcmdldCBJRCA+IDcgKi8KKwkJZGVjCVNJTkRFWDsKK3VsdHJhXzI6CisJCW1vdiAgICAgRlVOQ1RJT04xLFNBVkVEX1RDTDsKKwkJbW92ICAgICBBLEZVTkNUSU9OMTsKKwkJdGVzdAlTSU5ESVIsIEEJanogbmR4X2R0cjsKKwkJb3IJU1hGUkNUTDAsIEZBU1QyMDsKKwl9IAorLyoKKyAqIEluaXRpYWxpemUgU0NTSVJBVEUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yIHRoaXMgdGFyZ2V0LgorICogVGhlIFNDU0lSQVRFIHNldHRpbmdzIGZvciBlYWNoIHRhcmdldCBhcmUgc3RvcmVkIGluIGFuIGFycmF5CisgKiBiYXNlZCBhdCBUQVJHX1NDU0lSQVRFLgorICovCituZHhfZHRyOgorCXNocglBLDQsU0FWRURfVENMOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCkgeworCQl0ZXN0CVNCTEtDVEwsU0VMQlVTQglqeiBuZHhfZHRyXzI7CisJCW9yCVNBVkVEX1RDTCwgU0VMQlVTQjsgCisJCW9yCUEsMHgwODsJCQkvKiBDaGFubmVsIEIgZW50cmllcyBhZGQgOCAqLworbmR4X2R0cl8yOgorCX0KKworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWFkZAlTSU5ERVgsIFRBUkdfT0ZGU0VULCBBOworCQltb3YJU0NTSU9GRlNFVCwgU0lORElSOworCX0KKworCWFkZAlTSU5ERVgsVEFSR19TQ1NJUkFURSxBOworCW1vdglTQ1NJUkFURSxTSU5ESVIgcmV0OworCisKK3NlbGVjdGlvbjoKKwl0ZXN0CVNTVEFUMCxTRUxETwlqbnogc2VsZWN0X291dDsKKy8qCisgKiBSZXNlbGVjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQgYnkgYSB0YXJnZXQuIE1ha2UgYSBub3RlIHRoYXQgd2UndmUgYmVlbgorICogcmVzZWxlY3RlZCwgYnV0IGhhdmVuJ3Qgc2VlbiBhbiBJREVOVElGWSBtZXNzYWdlIGZyb20gdGhlIHRhcmdldCB5ZXQuCisgKi8KK2luaXRpYXRvcl9yZXNlbGVjdDoKKwltdmkJQ0xSU0lOVDAsIENMUlNFTERJOworCS8qIFhYWCB0ZXN0IGZvciBhbmQgaGFuZGxlIE9ORSBCSVQgY29uZGl0aW9uICovCisJYW5kCVNBVkVEX1RDTCwgU0VMSURfTUFTSywgU0VMSUQ7CisJbXZpCUNMUlNJTlQxLENMUkJVU0ZSRUU7CisJb3IJU0lNT0RFMSwgRU5CVVNGUkVFOwkJLyoKKwkJCQkJCSAqIFdlIGFyZW4ndCBleHBlY3RpbmcgYQorCQkJCQkJICogYnVzIGZyZWUsIHNvIGludGVycnVwdAorCQkJCQkJICogdGhlIGtlcm5lbCBkcml2ZXIgaWYgaXQKKwkJCQkJCSAqIGhhcHBlbnMuCisJCQkJCQkgKi8KKwltdmkJU1BJT0VOIGNhbGwJaW5pdGlhbGl6ZV9jaGFubmVsOworCW12aQlNU0dfT1VULCBNU0dfTk9PUDsJCS8qIE5vIG1lc3NhZ2UgdG8gc2VuZCAqLworCWptcAlJVGxvb3A7CisKKy8qCisgKiBBZnRlciB0aGUgc2VsZWN0aW9uLCByZW1vdmUgdGhpcyBTQ0IgZnJvbSB0aGUgIndhaXRpbmcgU0NCIgorICogbGlzdC4gIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc2ltcGx5IG1vdmluZyBvdXIgIm5leHQiIHBvaW50ZXIgaW50bworICogV0FJVElOR19TQ0JILiAgT3VyIG5leHQgcG9pbnRlciB3aWxsIGJlIHNldCB0byBudWxsIHRoZSBuZXh0IHRpbWUgdGhpcworICogU0NCIGlzIHVzZWQsIHNvIGRvbid0IGJvdGhlciB3aXRoIGl0IG5vdy4KKyAqLworc2VsZWN0X291dDoKKwkvKiBUdXJuIG9mZiB0aGUgc2VsZWN0aW9uIGhhcmR3YXJlICovCisJbXZpCVNDU0lTRVEsIEVOUlNFTEl8RU5BVVRPQVROUDsJLyoKKwkJCQkJCSAqIEFUTiBvbiBwYXJpdHkgZXJyb3JzCisJCQkJCQkgKiBmb3IgImluIiBwaGFzZXMKKwkJCQkJCSAqLworCW12aQlDTFJTSU5UMCwgQ0xSU0VMRE87CisJbW92CVNDQlBUUiwgV0FJVElOR19TQ0JIOworCW1vdglXQUlUSU5HX1NDQkgsU0NCX05FWFQ7CisJbW92CVNBVkVEX1RDTCwgU0NCX1RDTDsKKwltdmkJQ0xSU0lOVDEsQ0xSQlVTRlJFRTsKKwlvcglTSU1PREUxLCBFTkJVU0ZSRUU7CQkvKgorCQkJCQkJICogV2UgYXJlbid0IGV4cGVjdGluZyBhCisJCQkJCQkgKiBidXMgZnJlZSwgc28gaW50ZXJydXB0CisJCQkJCQkgKiB0aGUga2VybmVsIGRyaXZlciBpZiBpdAorCQkJCQkJICogaGFwcGVucy4KKwkJCQkJCSAqLworCW12aQlTUElPRU4gY2FsbAlpbml0aWFsaXplX2NoYW5uZWw7CisvKgorICogQXMgc29vbiBhcyB3ZSBnZXQgYSBzdWNjZXNzZnVsIHNlbGVjdGlvbiwgdGhlIHRhcmdldCBzaG91bGQgZ28KKyAqIGludG8gdGhlIG1lc3NhZ2Ugb3V0IHBoYXNlIHNpbmNlIHdlIGhhdmUgQVROIGFzc2VydGVkLgorICovCisJbXZpCU1TR19PVVQsIE1TR19JREVOVElGWUZMQUc7CisJb3IJU0VRX0ZMQUdTLCBJREVOVElGWV9TRUVOOworCisvKgorICogTWFpbiBsb29wIGZvciBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMuICBXYWl0IGZvciB0aGUgdGFyZ2V0CisgKiB0byBhc3NlcnQgUkVRIGJlZm9yZSBjaGVja2luZyBNU0csIEMvRCBhbmQgSS9PIGZvciB0aGUgYnVzIHBoYXNlLgorICovCitJVGxvb3A6CisJY2FsbAlwaGFzZV9sb2NrOworCisJbW92CUEsIExBU1RQSEFTRTsKKworCXRlc3QJQSwgflBfREFUQUlOCWp6IHBfZGF0YTsKKwljbXAJQSxQX0NPTU1BTkQJamUgcF9jb21tYW5kOworCWNtcAlBLFBfTUVTR09VVAlqZSBwX21lc2dvdXQ7CisJY21wCUEsUF9TVEFUVVMJamUgcF9zdGF0dXM7CisJY21wCUEsUF9NRVNHSU4JamUgcF9tZXNnaW47CisKKwltdmkJSU5UU1RBVCxCQURfUEhBU0U7CS8qIHVua25vd24gcGhhc2UgLSBzaWduYWwgZHJpdmVyICovCisJam1wCUlUbG9vcDsJCQkvKiBUcnkgcmVhZGluZyB0aGUgYnVzIGFnYWluLiAqLworCithd2FpdF9idXNmcmVlOgorCWFuZAlTSU1PREUxLCB+RU5CVVNGUkVFOworCWNhbGwJY2xlYXJfdGFyZ2V0X3N0YXRlOworCW1vdglOT05FLCBTQ1NJREFUTDsJCS8qIEFjayB0aGUgbGFzdCBieXRlICovCisJYW5kCVNYRlJDVEwwLCB+U1BJT0VOOworCXRlc3QJU1NUQVQxLFJFUUlOSVR8QlVTRlJFRQlqeiAuOworCXRlc3QJU1NUQVQxLCBCVVNGUkVFIGpueiBwb2xsX2Zvcl93b3JrOworCW12aQlJTlRTVEFULCBCQURfUEhBU0U7CisJCitjbGVhcl90YXJnZXRfc3RhdGU6CisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGRyaXZlciBtYXkgcmVzZXQgdXMKKwkgKiBhdCBhbnkgdGltZSwgZXZlbiBpbiB0aGUgbWlkZGxlIG9mIGEgRE1BLCBzbworCSAqIGNsZWFyIERGQ05UUkwgdG9vLgorCSAqLworCWNscglERkNOVFJMOworCisJLyoKKwkgKiBXZSBkb24ndCBrbm93IHRoZSB0YXJnZXQgd2Ugd2lsbCBjb25uZWN0IHRvLAorCSAqIHNvIGRlZmF1bHQgdG8gbmFycm93IHRyYW5zZmVycyB0byBhdm9pZAorCSAqIHBhcml0eSBwcm9ibGVtcy4KKwkgKi8KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92ICAgIFNDU0lSQVRFLCBBTExaRVJPUywgMjsKKwl9IGVsc2UgeworCQljbHIgICAgIFNDU0lSQVRFOworCQlhbmQgICAgIFNYRlJDVEwwLCB+KEZBU1QyMCk7CisJfQorCW12aQlMQVNUUEhBU0UsIFBfQlVTRlJFRTsKKwkvKiBjbGVhciB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MgKi8KKwljbHIJU0VRX0ZMQUdTIHJldDsKKworCitkYXRhX3BoYXNlX3JlaW5pdDoKKy8qCisgKiBJZiB3ZSByZS1lbnRlciB0aGUgZGF0YSBwaGFzZSBhZnRlciBnb2luZyB0aHJvdWdoIGFub3RoZXIgcGhhc2UsIHRoZQorICogU1RDTlQgbWF5IGhhdmUgYmVlbiBjbGVhcmVkLCBzbyByZXN0b3JlIGl0IGZyb20gdGhlIHJlc2lkdWFsIGZpZWxkLgorICogT24gVWx0cmEyLCB3ZSBoYXZlIHRvIHB1dCBpdCBpbnRvIHRoZSBIQ05UIGZpZWxkIGJlY2F1c2Ugd2UgaGF2ZSB0bworICogZHJvcCB0aGUgZGF0YSBkb3duIGludG8gdGhlIHNoYWRvdyBsYXllciB2aWEgdGhlIHByZWxvYWQgYWJpbGl0eS4KKyAqLworIAlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92CUhBRERSLCBTSEFERFIsIDQ7CisJCWJtb3YgICAgSENOVCwgU0NCX1JFU0lEX0RDTlQsIDM7CisJfQorCWlmICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpIHsKKwkJYm1vdiAgICBTVENOVCwgU0NCX1JFU0lEX0RDTlQsIDM7CisJfQorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pID09IDApIHsKKwkJbXZpCURJTkRFWCwgU1RDTlQ7CisJCW12aQlTQ0JfUkVTSURfRENOVAljYWxsIGJjb3B5XzM7CisJfQorCWptcAlkYXRhX3BoYXNlX2xvb3A7CitwX2RhdGE6CisgCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCW12aQlETUFQQVJBTVMsIFBSRUxPQURFTnxTQ1NJRU58SERNQUVOOworCX0gZWxzZSB7CisJCW12aQlETUFQQVJBTVMsIFdJREVPRER8U0NTSUVOfFNETUFFTnxIRE1BRU58RklGT1JFU0VUOworCX0KKwl0ZXN0CUxBU1RQSEFTRSwgSU9JIGpueiAuICsgMjsKKwlvcglETUFQQVJBTVMsIERJUkVDVElPTjsKKwljYWxsCWFzc2VydDsJCS8qCisJCQkJICogRW5zdXJlIGVudGVyaW5nIGEgZGF0YQorCQkJCSAqIHBoYXNlIGlzIG9rYXkgLSBzZWVuIGlkZW50aWZ5LCBldGMuCisJCQkJICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQltdmkJQ0NTR0FERFIsIENDU0dBRERSX01BWDsKKwl9CisKKwl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFCWpueiBkYXRhX3BoYXNlX3JlaW5pdDsKKwlvcglTRVFfRkxBR1MsIERQSEFTRTsJLyogd2UndmUgc2VlbiBhIGRhdGEgcGhhc2UgKi8KKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIERNQSBhZGRyZXNzIGFuZCBjb3VudGVyIGZyb20gdGhlIFNDQi4KKwkgKiBBbHNvIHNldCBTR19DT1VOVCBhbmQgU0dfTkVYVCBpbiBtZW1vcnkgc2luY2Ugd2UgY2Fubm90CisJICogbW9kaWZ5IHRoZSB2YWx1ZXMgaW4gdGhlIFNDQiBpdHNlbGYgdW50aWwgd2Ugc2VlIGEKKwkgKiBzYXZlIGRhdGEgcG9pbnRlcnMgbWVzc2FnZS4KKwkgKi8KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWJtb3YJSEFERFIsIFNDQl9EQVRBUFRSLCA3OworCQlibW92ICAgIFNHX0NPVU5ULCBTQ0JfU0dDT1VOVCwgNTsKKwkJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJCWJtb3YgICAgU1RDTlQsIEhDTlQsIDM7CisJCX0KKwl9IGVsc2UgeworCQltdmkJRElOREVYLCBIQUREUjsKKwkJbXZpCVNDQl9EQVRBUFRSCWNhbGwgYmNvcHlfNzsKKwkJY2FsbAlzZXRfc3RjbnRfZnJvbV9oY250OworCQltdmkJRElOREVYLCBTR19DT1VOVDsKKwkJbXZpCVNDQl9TR0NPVU5UCWNhbGwgYmNvcHlfNTsKKwl9CitkYXRhX3BoYXNlX2xvb3A6CisJLyogR3VhcmQgYWdhaW5zdCBvdmVycnVucyAqLworCXRlc3QJU0dfQ09VTlQsIDB4ZmYgam56IGRhdGFfcGhhc2VfaW5ib3VuZHM7CisvKgorICogVHVybiBvbiAnQml0IEJ1Y2tldCcgbW9kZSwgc2V0IHRoZSB0cmFuc2ZlciBjb3VudCB0bworICogMTZtZWcgYW5kIGxldCB0aGUgdGFyZ2V0IHJ1biB1bnRpbCBpdCBjaGFuZ2VzIHBoYXNlLgorICogV2hlbiB0aGUgdHJhbnNmZXIgY29tcGxldGVzLCBub3RpZnkgdGhlIGhvc3QgdGhhdCB3ZQorICogaGFkIGFuIG92ZXJydW4uCisgKi8KKwlvcglTWEZSQ1RMMSxCSVRCVUNLRVQ7CisJYW5kCURNQVBBUkFNUywgfihIRE1BRU58U0RNQUVOKTsKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkgeworCQlibW92CUhDTlQsIEFMTE9ORVMsIDM7CisJfQorCWlmICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpIHsKKwkJYm1vdglTVENOVCwgQUxMT05FUywgMzsKKwl9CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgPT0gMCkgeworCQltdmkJU1RDTlRbMF0sIDB4RkY7CisJCW12aQlTVENOVFsxXSwgMHhGRjsKKwkJbXZpCVNUQ05UWzJdLCAweEZGOworCX0KKworZGF0YV9waGFzZV9pbmJvdW5kczoKKy8qIElmIHdlIGFyZSB0aGUgbGFzdCBTRyBibG9jaywgdGVsbCB0aGUgaGFyZHdhcmUuICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJc2hsCUEsIDIsIFNHX0NPVU5UOworCQljbXAJU0dfQ09VTlQsMHgwMSBqbmUgZGF0YV9waGFzZV93aWRlb2RkOworCQlvcglBLCBMQVNUX1NFRzsKKwl9IGVsc2UgeworCQljbXAJU0dfQ09VTlQsMHgwMSBqbmUgZGF0YV9waGFzZV93aWRlb2RkOworCQlhbmQJRE1BUEFSQU1TLCB+V0lERU9ERDsKKwl9CitkYXRhX3BoYXNlX3dpZGVvZGQ6CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsJCisJCW1vdglTR19DQUNIRVBUUiwgQTsKKwkJbW92CURGQ05UUkwsIERNQVBBUkFNUzsgLyogc3RhcnQgdGhlIG9wZXJhdGlvbiAqLworCQl0ZXN0CVNYRlJDVEwxLCBCSVRCVUNLRVQgam56IGRhdGFfcGhhc2Vfb3ZlcnJ1bjsKK3UyX3ByZWxvYWRfd2FpdDoKKwkJdGVzdAlTU1RBVDEsIFBIQVNFTUlTIGpueiB1Ml9waGFzZW1pczsKKwkJdGVzdAlERlNUQVRVUywgUFJFTE9BRF9BVkFJTCBqeiB1Ml9wcmVsb2FkX3dhaXQ7CisJfSBlbHNlIHsKKwkJbW92CURNQVBBUkFNUyAgY2FsbCBkbWE7CitkYXRhX3BoYXNlX2RtYV9kb25lOgorLyogR28gdGVsbCB0aGUgaG9zdCBhYm91dCBhbnkgb3ZlcnJ1bnMgKi8KKwkJdGVzdAlTWEZSQ1RMMSxCSVRCVUNLRVQgam56IGRhdGFfcGhhc2Vfb3ZlcnJ1bjsKKworLyogRXhpdCBpZiB3ZSBoYWQgYW4gdW5kZXJydW4uICBkbWEgY2xlYXJzIFNJTkRFWCBpbiB0aGlzIGNhc2UuICovCisJCXRlc3QJU0lOREVYLDB4ZmYJanogZGF0YV9waGFzZV9maW5pc2g7CisJfQorLyoKKyAqIEFkdmFuY2UgdGhlIHNjYXR0ZXItZ2F0aGVyIHBvaW50ZXJzIAorICovCitzZ19hZHZhbmNlOgorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWNtcAlTR19DT1VOVCwgMHgwMQlqZSB1Ml9kYXRhX3BoYXNlX2ZpbmlzaDsKKwl9IGVsc2UgeworCQlkZWMJU0dfQ09VTlQ7CisJCXRlc3QJU0dfQ09VTlQsIDB4ZmYJanogZGF0YV9waGFzZV9maW5pc2g7CisJfQorCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCisJCS8qCisJCSAqIERvIHdlIGhhdmUgYW55IHByZWZldGNoIGxlZnQ/Pz8KKwkJICovCisJCWNtcAlDQ1NHQUREUiwgQ0NTR0FERFJfTUFYIGpuZSBwcmVmZXRjaF9hdmFpbDsKKworCQkvKgorCQkgKiBGZXRjaCBNSU4oQ0NTR0FERFJfTUFYLCAoU0dfQ09VTlQgKiA4KSkgYnl0ZXMuCisJCSAqLworCQlhZGQJQSwgLShDQ1NHUkFNX01BWFNFR1MgKyAxKSwgU0dfQ09VTlQ7CisJCW12aQlBLCBDQ1NHQUREUl9NQVg7CisJCWpjCS4gKyAyOworCQlzaGwJQSwgMywgU0dfQ09VTlQ7CisJCW1vdglDQ0hDTlQsIEE7CisJCWJtb3YJQ0NIQUREUiwgU0dfTkVYVCwgNDsKKwkJbXZpCUNDU0dDVEwsIENDU0dFTnxDQ1NHUkVTRVQ7CisJCXRlc3QJQ0NTR0NUTCwgQ0NTR0RPTkUganogLjsKKwkJYW5kCUNDU0dDVEwsIH5DQ1NHRU47CisJCXRlc3QJQ0NTR0NUTCwgQ0NTR0VOIGpueiAuOworCQltdmkJQ0NTR0NUTCwgQ0NTR1JFU0VUOworcHJlZmV0Y2hfYXZhaWw6CisJCWJtb3YgCUhBRERSLCBDQ1NHUkFNLCA4OworCQlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPT0gMCkgeworCQkJYm1vdiAgICBTVENOVCwgSENOVCwgMzsKKwkJfSBlbHNlIHsKKwkJCWRlYwlTR19DT1VOVDsKKwkJfQorCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0dfTkVYVAljYWxsIGJjb3B5XzQ7CisKKwkJbXZpCUhDTlRbMF0sU0dfU0laRU9GOworCQljbHIJSENOVFsxXTsKKwkJY2xyCUhDTlRbMl07CisKKwkJb3IJREZDTlRSTCwgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisKKwkJY2FsbAlkbWFfZmluaXNoOworCisvKgorICogQ29weSBkYXRhIGZyb20gRklGTyBpbnRvIFNDQiBkYXRhIHBvaW50ZXIgYW5kIGRhdGEgY291bnQuCisgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgU0cgc2VnbWVudHMgYXJlIG9mIHRoZSBmb3JtOgorICogc3RydWN0IGFoY19kbWFfc2VnIHsKKyAqCXVfaW50MzJfdAlhZGRyOwlmb3VyIGJ5dGVzLCBsaXR0bGUtZW5kaWFuIG9yZGVyCisgKgl1X2ludDMyX3QJbGVuOwlmb3VyIGJ5dGVzLCBsaXR0bGUgZW5kaWFuIG9yZGVyCisgKiB9OworICovCisgCQltdmkJRElOREVYLCBIQUREUjsKKwkJY2FsbAlkZmRhdF9pbl83OworCQljYWxsCXNldF9zdGNudF9mcm9tX2hjbnQ7CisJfQorLyogQWR2YW5jZSB0aGUgU0cgcG9pbnRlciAqLworCWNscglBOwkJLyogYWRkIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcikgKi8KKwlhZGQJU0dfTkVYVFswXSxTR19TSVpFT0Y7CisJYWRjCVNHX05FWFRbMV0sQTsKKworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCWptcAlkYXRhX3BoYXNlX2xvb3A7CisJfSBlbHNlIHsKKwkJdGVzdCAgICBTU1RBVDEsIFJFUUlOSVQganogLjsKKwkJdGVzdAlTU1RBVDEsUEhBU0VNSVMJanogZGF0YV9waGFzZV9sb29wOworCX0KKworCisvKgorICogV2UndmUgbG9hZGVkIGFsbCBvZiBvdXIgc2VnbWVudHMgaW50byB0aGUgcHJlbG9hZCBsYXllci4gIE5vdywgd2Ugc2ltcGx5CisgKiBoYXZlIHRvIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBvciBmb3IgdXMgdG8gZ2V0IGEgcGhhc2VtaXMuICBBbmQsIHNpbmNlCisgKiB3ZSdsbCBnZXQgYSBwaGFzZW1pcyBpZiB3ZSBkbyBmaW5pc2gsIGFsbCB3ZSByZWFsbHkgbmVlZCB0byBkbyBpcyB3YWl0CisgKiBmb3IgYSBwaGFzZW1pcyB0aGVuIGNoZWNrIGlmIHdlIGRpZCBhY3R1YWxseSBjb21wbGV0ZSBhbGwgdGhlIHNlZ21lbnRzLgorICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKK3UyX2RhdGFfcGhhc2VfZmluaXNoOgorCQl0ZXN0CVNTVEFUMSwgUEhBU0VNSVMgam56IHUyX3BoYXNlbWlzOworCQl0ZXN0CVNHX0NBQ0hFUFRSLCBMQVNUX1NFR19ET05FIGp6IHUyX2RhdGFfcGhhc2VfZmluaXNoOworCQljbHIJU0dfQ09VTlQ7CisJCXRlc3QJU1NUQVQxLCBSRVFJTklUCWp6IC47CisJCXRlc3QJU1NUQVQxLCBQSEFTRU1JUyBqeiBkYXRhX3BoYXNlX2xvb3A7Cit1Ml9waGFzZW1pczoKKwkJY2FsbAl1bHRyYTJfZG1hZmluaXNoOworCQl0ZXN0CVNHX0NBQ0hFUFRSLCBMQVNUX1NFR19ET05FIGpueiBkYXRhX3BoYXNlX2ZpbmlzaDsKKwkJdGVzdAlTU1RBVDIsIFNIVkFMSUQgam56IHUyX2ZpeHVwX3Jlc2lkdWFsOworCQltdmkJSU5UU1RBVCwgU0VRX1NHX0ZJWFVQOworCQlqbXAJZGF0YV9waGFzZV9maW5pc2g7Cit1Ml9maXh1cF9yZXNpZHVhbDoKKwkJc2hyCUFSR18xLCAyLCBTR19DQUNIRVBUUjsKK3UyX3BoYXNlbWlzX2xvb3A6CisJCWFuZAlBLCAweDNmLCBTR19DT1VOVDsKKwkJY21wCUFSR18xLCBBIGplIGRhdGFfcGhhc2VfZmluaXNoOworLyoKKyAqIFN1YnRyYWN0IFNHX1NJWkVPRiBmcm9tIHRoZSBTR19ORVhUIHBvaW50ZXIgYW5kIGFkZCAxIHRvIHRoZSBTR19DT1VOVAorICovCisgCQljbHIJQTsKKwkJYWRkCVNHX05FWFRbMF0sIC1TR19TSVpFT0Y7CisJCWFkYwlTR19ORVhUWzFdLCAweGZmOworCQlpbmMJU0dfQ09VTlQ7CisJCWptcAl1Ml9waGFzZW1pc19sb29wOworCX0KKworZGF0YV9waGFzZV9maW5pc2g6CisvKgorICogQWZ0ZXIgYSBETUEgZmluaXNoZXMsIHNhdmUgdGhlIFNHIGFuZCBTVENOVCByZXNpZHVhbHMgYmFjayBpbnRvIHRoZSBTQ0IKKyAqIFdlIHVzZSBTVENOVCBpbnN0ZWFkIG9mIEhDTlQsIHNpbmNlIGl0J3MgYSByZWZsZWN0aW9uIG9mIGhvdyBtYW55IGJ5dGVzIAorICogd2VyZSB0cmFuc2ZlcnJlZCBvbiB0aGUgU0NTSSAoYXMgb3Bwb3NlZCB0byB0aGUgaG9zdCkgYnVzLgorICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQlibW92ICAgIFNDQl9SRVNJRF9EQ05ULCBTVENOVCwgMzsKKwkJbW92CVNDQl9SRVNJRF9TR0NOVCwgU0dfQ09VTlQ7CisJCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisJCQlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOOworCQl9CisJfSBlbHNlIHsKKwkJbW92CVNDQl9SRVNJRF9EQ05UWzBdLFNUQ05UWzBdOworCQltb3YJU0NCX1JFU0lEX0RDTlRbMV0sU1RDTlRbMV07CisJCW1vdglTQ0JfUkVTSURfRENOVFsyXSxTVENOVFsyXTsKKwkJbW92CVNDQl9SRVNJRF9TR0NOVCwgU0dfQ09VTlQ7CisJfQorCisJam1wCUlUbG9vcDsKKworZGF0YV9waGFzZV9vdmVycnVuOgorLyoKKyAqIFR1cm4gb2ZmIEJJVEJVQ0tFVCBtb2RlIGFuZCBub3RpZnkgdGhlIGhvc3QKKyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7CisvKgorICogV2FpdCBmb3IgdGhlIHRhcmdldCB0byBxdWl0IHRyYW5zZmVycmluZyBkYXRhIG9uIHRoZSBTQ1NJIGJ1cworICovCisgCQl0ZXN0CVNTVEFUMSwgUEhBU0VNSVMganogLjsKKwkJY2FsbAl1bHRyYTJfZG1hZmluaXNoOworCX0KKwlhbmQJU1hGUkNUTDEsIH5CSVRCVUNLRVQ7CisJbXZpCUlOVFNUQVQsREFUQV9PVkVSUlVOOworCWptcAlJVGxvb3A7CisKKworCisKKy8qCisgKiBBY3R1YWxseSB0dXJuIG9mZiB0aGUgRE1BIGhhcmR3YXJlLCBzYXZlIG91ciBjdXJyZW50IHBvc2l0aW9uIGludG8gdGhlCisgKiBwcm9wZXIgcmVzaWR1YWwgdmFyaWFibGVzLCB3YWl0IGZvciB0aGUgbmV4dCBSRVEgc2lnbmFsLCB0aGVuIGp1bXAgdG8KKyAqIHRoZSBJVGxvb3AuICBKdW1waW5nIHRvIHRoZSBJVGxvb3AgZW5zdXJlcyB0aGF0IGlmIHdlIGhhcHBlbiB0byBnZXQKKyAqIGJyb3VnaHQgaW50byB0aGUgZGF0YSBwaGFzZSBhZ2FpbiAob3IgYXJlIHN0aWxsIGluIGl0IGFmdGVyIG91ciBsYXN0CisgKiBzZWdtZW50KSB0aGF0IHdlIHdpbGwgcHJvcGVybHkgc2lnbmFsIGFuIG92ZXJydW4gdG8gdGhlIGtlcm5lbC4KKyAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSAhPSAwKSB7Cit1bHRyYTJfZG1hZmluaXNoOgorCQl0ZXN0CURGQ05UUkwsIERJUkVDVElPTiBqbnogdWx0cmEyX2RtYWhhbHQ7CisJCWFuZAlERkNOVFJMLCB+U0NTSUVOOworCQl0ZXN0CURGQ05UUkwsIFNDU0lFTiBqbnogLjsKKwkJaWYgKChwLT5idWdzICYgQUhDX0JVR19BVVRPRkxVU0gpICE9IDApIHsKKwkJCW9yCURGQ05UUkwsIEZJRk9GTFVTSDsKKwkJfQordWx0cmEyX2RtYWZpZm9mbHVzaDoKKwkJaWYgKChwLT5idWdzICYgQUhDX0JVR19BVVRPRkxVU0gpICE9IDApIHsKKwkJCS8qCisJCQkgKiBoYXJkd2FyZSBidWcgYWxlcnQhICBUaGlzIG5lZWRsZXNzIHNldCBvZiBqdW1wcworCQkJICogd29ya3MgYXJvdW5kIGEgZ2xpdGNoIGluIHRoZSBzaWxpY29uLiAgV2hlbiB0aGUKKwkJCSAqIFBDSSBETUEgZmlmbyBnb2VzIGVtcHR5LCBidXQgdGhlcmUgaXMgc3RpbGwgU0NTSQorCQkJICogZGF0YSB0byBiZSBmbHVzaGVkIGludG8gdGhlIFBDSSBETUEgZmlmbyAoYW5kIGZyb20KKwkJCSAqIHRoZXJlIG9uIGludG8gbWFpbiBtZW1vcnkpLCB0aGUgRklGT0VNUCBiaXQgd2lsbAorCQkJICogY29tZSBvbiBiZXR3ZWVuIHRoZSB0aW1lIHdoZW4gdGhlIFBDSSBETUEgYnVmZmVyCisJCQkgKiB3ZW50IGVtcHR5IGFuZCB0aGUgbmV4dCBiaXQgb2YgZGF0YSBpcyBjb3BpZWQgZnJvbQorCQkJICogdGhlIFNDU0kgZmlmbyBpbnRvIHRoZSBQQ0kgZmlmby4gIEl0IHNob3VsZCBvbmx5CisJCQkgKiBjb21lIG9uIHdoZW4gYm90aCBGSUZPcyAobWVhbmluZyB0aGUgZW50aXJlIEZJRk8KKwkJCSAqIGNoYWluKSBhcmUgZW10cHkuICBTaW5jZSBpdCBjYW4gdGFrZSB1cCB0byA0IGN5Y2xlcworCQkJICogZm9yIG5ldyBkYXRhIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBTQ1NJIGZpZm8gaW50bworCQkJICogdGhlIFBDSSBmaWZvLCB0ZXN0aW5nIGZvciBGSUZPRU1QIHN0YXR1cyBmb3IgNAorCQkJICogZXh0cmEgdGltZXMgZ2l2ZXMgdGhlIG5lZWRlZCB0aW1lIGZvciBhbnkKKwkJCSAqIHJlbWFpbmluZyBTQ1NJIGZpZm8gZGF0YSB0byBiZSBwdXQgaW4gdGhlIFBDSSBmaWZvCisJCQkgKiBiZWZvcmUgd2UgZGVjbGFyZSBpdCAqdHJ1bHkqIGVtcHR5LgorCQkJICovCisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCQl0ZXN0CURGU1RBVFVTLCBGSUZPRU1QIGp6IHVsdHJhMl9kbWFmaWZvZmx1c2g7CisJCX0KKwkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqeiB1bHRyYTJfZG1hZmlmb2ZsdXNoOworCQl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogLjsKK3VsdHJhMl9kbWFoYWx0OgorCQlhbmQgICAgIERGQ05UUkwsIH4oSERNQUVOfFNDU0lFTik7CisJCXRlc3QJREZDTlRSTCwgKEhETUFFTnxTQ1NJRU4pIGpueiAuOworCQlyZXQ7CisJfQorCisvKgorICogQ29tbWFuZCBwaGFzZS4gIFNldCB1cCB0aGUgRE1BIHJlZ2lzdGVycyBhbmQgbGV0ICdlciByaXAuCisgKi8KK3BfY29tbWFuZDoKKwljYWxsCWFzc2VydDsKKworLyoKKyAqIExvYWQgSEFERFIgYW5kIEhDTlQuCisgKi8KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWJtb3YJSEFERFIsIFNDQl9DTURQVFIsIDU7CisJCWJtb3YJSENOVFsxXSwgQUxMWkVST1MsIDI7CisJCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCQlibW92CVNUQ05ULCBIQ05ULCAzOworCQl9CisJfSBlbHNlIHsKKwkJbXZpCURJTkRFWCwgSEFERFI7CisJCW12aQlTQ0JfQ01EUFRSCWNhbGwgYmNvcHlfNTsKKwkJY2xyCUhDTlRbMV07CisJCWNscglIQ05UWzJdOworCQljYWxsCXNldF9zdGNudF9mcm9tX2hjbnQ7CisJfQorCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApIHsKKwkJbXZpCShTQ1NJRU58U0RNQUVOfEhETUFFTnxESVJFQ1RJT058RklGT1JFU0VUKSBjYWxsIGRtYTsKKwl9IGVsc2UgeworCQltdmkJREZDTlRSTCwgKFBSRUxPQURFTnxTQ1NJRU58SERNQUVOfERJUkVDVElPTik7CisJCXRlc3QJU1NUQVQwLCBTRE9ORSBqbnogLjsKK3BfY29tbWFuZF9kbWFfbG9vcDoKKwkJdGVzdAlTU1RBVDAsIFNET05FIGpueiBwX2NvbW1hbmRfdWx0cmEyX2RtYV9kb25lOworCQl0ZXN0CVNTVEFUMSxQSEFTRU1JUwlqeiBwX2NvbW1hbmRfZG1hX2xvb3A7CS8qIGllLiB1bmRlcnJ1biAqLworcF9jb21tYW5kX3VsdHJhMl9kbWFfZG9uZToKKwkJdGVzdAlTQ1NJU0lHSSwgUkVRSQlqeiBwX2NvbW1hbmRfdWx0cmEyX3NodXRkb3duOworCQl0ZXN0CVNTVEFUMSwgKFBIQVNFTUlTfFJFUUlOSVQpCWp6IHBfY29tbWFuZF91bHRyYTJfZG1hX2RvbmU7CitwX2NvbW1hbmRfdWx0cmEyX3NodXRkb3duOgorCQlhbmQgICAgIERGQ05UUkwsIH4oSERNQUVOfFNDU0lFTik7CisJCXRlc3QJREZDTlRSTCwgKEhETUFFTnxTQ1NJRU4pIGpueiAuOworCQlvcglTWEZSQ1RMMCwgQ0xSU1RDTlR8Q0xSQ0hOOworCX0KKwlqbXAJSVRsb29wOworCisvKgorICogU3RhdHVzIHBoYXNlLiAgV2FpdCBmb3IgdGhlIGRhdGEgYnl0ZSB0byBhcHBlYXIsIHRoZW4gcmVhZCBpdAorICogYW5kIHN0b3JlIGl0IGludG8gdGhlIFNDQi4KKyAqLworcF9zdGF0dXM6CisJY2FsbAlhc3NlcnQ7CisKKwltb3YJU0NCX1RBUkdFVF9TVEFUVVMsIFNDU0lEQVRMOworCWptcAlJVGxvb3A7CisKKy8qCisgKiBNZXNzYWdlIG91dCBwaGFzZS4gIElmIE1TR19PVVQgaXMgMHg4MCwgYnVpbGQgSSBmdWxsIGluZGVudGlmeSBtZXNzYWdlCisgKiBzZXF1ZW5jZSBhbmQgc2VuZCBpdCB0byB0aGUgdGFyZ2V0LiAgSW4gYWRkaXRpb24sIGlmIHRoZSBNS19NRVNTQUdFIGJpdAorICogaXMgc2V0IGluIHRoZSBTQ0JfQ09OVFJPTCBieXRlLCBpbnRlcnJ1cHQgdGhlIGhvc3QgYW5kIGFsbG93IGl0IHRvIHNlbmQKKyAqIGl0J3Mgb3duIG1lc3NhZ2UuCisgKiAKKyAqIElmIE1TR19PVVQgaXMgPT0gSE9TVF9NU0csIGFsc28gaW50ZXJydXB0IHRoZSBob3N0IGFuZCB0YWtlIGEgbWVzc2FnZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBhbGxvdyB0aGUgaHNvdCB0byBzZW5kIG1lc3NhZ2VzIG91dHNpZGUgb2YgYW4gaWRlbnRpZnkKKyAqIHNlcXVlbmNlIHdoaWxlIHByb3RlY3RpbmcgdGhlIHNlcWVuY2VyIGZyb20gdGVzdGluZyB0aGUgTUtfTUVTU0FHRSBiaXQKKyAqIG9uIGFuIFNDQiB0aGF0IG1pZ2h0IG5vdCBiZSBmb3IgdGhlIGN1cnJlbnQgbmV4dXMuIChGb3IgZXhhbXBsZSwgYQorICogQkRSIG1lc3NhZ2UgaW4gcmVzcG9uY2UgdG8gYSBiYWQgcmVzZWxlY3Rpb24gd291bGQgbGVhdmUgdXMgcG9pbnRlZCB0bworICogYW4gU0NCIHRoYXQgZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGN1cnJlbnQgdGFyZ2V0KS4KKyAqIE90aGVyd2lzZSwgdHJlYXQgTVNHX09VVCBhcyBhIDEgYnl0ZSBtZXNzYWdlIHRvIHNlbmQgKGFib3J0LCBhYm9ydCB0YWcsCisgKiBidXMgZGV2aWNlIHJlc2V0KS4KKyAqCisgKiBXaGVuIHRoZXJlIGFyZSBubyBtZXNzYWdlcyB0byBzZW5kLCBNU0dfT1VUIHNob3VsZCBiZSBzZXQgdG8gTVNHX05PT1AsCisgKiBpbiBjYXNlIHRoZSB0YXJnZXQgZGVjaWRlcyB0byBwdXQgdXMgaW4gdGhpcyBwaGFzZSBmb3Igc29tZSBzdHJhbmdlCisgKiByZWFzb24uCisgKi8KK3BfbWVzZ291dF9yZXRyeToKKwlvciAgICAgIFNDU0lTSUdPLEFUTk8sTEFTVFBIQVNFOy8qIHR1cm4gb24gQVROIGZvciB0aGUgcmV0cnkgKi8KK3BfbWVzZ291dDoKKwltb3YJU0lOREVYLCBNU0dfT1VUOworCWNtcAlTSU5ERVgsIE1TR19JREVOVElGWUZMQUcgam5lIHBfbWVzZ291dF9mcm9tX2hvc3Q7CitwX21lc2dvdXRfaWRlbnRpZnk6CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19XSURFKSAhPSAwKSB7CisJCWFuZAlTSU5ERVgsMHhmLFNDQl9UQ0w7CS8qIGx1biAqLworCX0gZWxzZSB7CisJCWFuZAlTSU5ERVgsMHg3LFNDQl9UQ0w7CS8qIGx1biAqLworCX0KKwlhbmQJQSxESVNDRU5CLFNDQl9DT05UUk9MOwkvKiBtYXNrIG9mZiBkaXNjb25uZWN0IHByaXZsZWRnZSAqLworCW9yCVNJTkRFWCxBOwkJLyogb3IgaW4gZGlzY29ubmVjdCBwcml2bGVkZ2UgKi8KKwlvcglTSU5ERVgsTVNHX0lERU5USUZZRkxBRzsKK3BfbWVzZ291dF9ta19tZXNzYWdlOgorCXRlc3QJU0NCX0NPTlRST0wsTUtfTUVTU0FHRSAganogcF9tZXNnb3V0X3RhZzsKKwltb3YJU0NTSURBVEwsIFNJTkRFWDsJLyogU2VuZCB0aGUgbGFzdCBieXRlICovCisJam1wCXBfbWVzZ291dF9mcm9tX2hvc3QgKyAxOy8qIFNraXAgSE9TVF9NU0cgdGVzdCAqLworLyoKKyAqIFNlbmQgYSB0YWcgbWVzc2FnZSBpZiBUQUdfRU5CIGlzIHNldCBpbiB0aGUgU0NCIGNvbnRyb2wgYmxvY2suCisgKiBVc2UgU0NCX1RBRyAodGhlIHBvc2l0aW9uIGluIHRoZSBrZXJuZWwncyBTQ0IgYXJyYXkpIGFzIHRoZSB0YWcgdmFsdWUuCisgKi8KK3BfbWVzZ291dF90YWc6CisJdGVzdAlTQ0JfQ09OVFJPTCxUQUdfRU5CIGp6ICBwX21lc2dvdXRfb25lYnl0ZTsKKwltb3YJU0NTSURBVEwsIFNJTkRFWDsJLyogU2VuZCB0aGUgaWRlbnRpZnkgbWVzc2FnZSAqLworCWNhbGwJcGhhc2VfbG9jazsKKwljbXAJTEFTVFBIQVNFLCBQX01FU0dPVVQJam5lIHBfbWVzZ291dF9kb25lOworCWFuZAlTQ1NJREFUTCxUQUdfRU5CfFNDQl9UQUdfVFlQRSxTQ0JfQ09OVFJPTDsKKwljYWxsCXBoYXNlX2xvY2s7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHT1VUCWpuZSBwX21lc2dvdXRfZG9uZTsKKwltb3YJU0NCX1RBRwlqbXAgcF9tZXNnb3V0X29uZWJ5dGU7CisvKgorICogSW50ZXJydXB0IHRoZSBkcml2ZXIsIGFuZCBhbGxvdyBpdCB0byBzZW5kIGEgbWVzc2FnZQorICogaWYgaXQgYXNrcy4KKyAqLworcF9tZXNnb3V0X2Zyb21faG9zdDoKKwljbXAJU0lOREVYLCBIT1NUX01TRwlqbmUgcF9tZXNnb3V0X29uZWJ5dGU7CisJbXZpICAgICBJTlRTVEFULEFXQUlUSU5HX01TRzsKKwlub3A7CisJLyoKKwkgKiBEaWQgdGhlIGhvc3QgZGV0ZWN0IGEgcGhhc2UgY2hhbmdlPworCSAqLworCWNtcAlSRVRVUk5fMSwgTVNHT1VUX1BIQVNFTUlTIGplIHBfbWVzZ291dF9kb25lOworCitwX21lc2dvdXRfb25lYnl0ZToKKwltdmkJQ0xSU0lOVDEsIENMUkFUTk87CisJbW92CVNDU0lEQVRMLCBTSU5ERVg7CisKKy8qCisgKiBJZiB0aGUgbmV4dCBidXMgcGhhc2UgYWZ0ZXIgQVROIGRyb3BzIGlzIGEgbWVzc2FnZSBvdXQsIGl0IG1lYW5zCisgKiB0aGF0IHRoZSB0YXJnZXQgaXMgcmVxdWVzdGluZyB0aGF0IHRoZSBsYXN0IG1lc3NhZ2UocykgYmUgcmVzZW50LgorICovCisJY2FsbAlwaGFzZV9sb2NrOworCWNtcCAgICAgTEFTVFBIQVNFLCBQX01FU0dPVVQgICAgamUgcF9tZXNnb3V0X3JldHJ5OworCitwX21lc2dvdXRfZG9uZToKKwltdmkJQ0xSU0lOVDEsQ0xSQVROTzsJLyogQmUgc3VyZSB0byB0dXJuIEFUTk8gb2ZmICovCisJbW92CUxBU1RfTVNHLCBNU0dfT1VUOworCWNtcAlNU0dfT1VULCBNU0dfSURFTlRJRllGTEFHIGpuZSAuICsgMjsKKwlhbmQJU0NCX0NPTlRST0wsIH5NS19NRVNTQUdFOworCW12aQlNU0dfT1VULCBNU0dfTk9PUDsJLyogTm8gbWVzc2FnZSBsZWZ0ICovCisJam1wCUlUbG9vcDsKKworLyoKKyAqIE1lc3NhZ2UgaW4gcGhhc2UuICBCeXRlcyBhcmUgcmVhZCB1c2luZyBBdXRvbWF0aWMgUElPIG1vZGUuCisgKi8KK3BfbWVzZ2luOgorCW12aQlBQ0NVTQkJY2FsbCBpbmJfZmlyc3Q7CS8qIHJlYWQgdGhlIDFzdCBtZXNzYWdlIGJ5dGUgKi8KKworCXRlc3QJQSxNU0dfSURFTlRJRllGTEFHCWpueiBtZXNnaW5faWRlbnRpZnk7CisJY21wCUEsTVNHX0RJU0NPTk5FQ1QJamUgbWVzZ2luX2Rpc2Nvbm5lY3Q7CisJY21wCUEsTVNHX1NBVkVEQVRBUE9JTlRFUglqZSBtZXNnaW5fc2RwdHJzOworCWNtcAlBTExaRVJPUyxBCQlqZSBtZXNnaW5fY29tcGxldGU7CisJY21wCUEsTVNHX1JFU1RPUkVQT0lOVEVSUwlqZSBtZXNnaW5fcmRwdHJzOworCWNtcAlBLE1TR19FWFRFTkRFRAkJamUgbWVzZ2luX2V4dGVuZGVkOworCWNtcAlBLE1TR19NRVNTQUdFX1JFSkVDVAlqZSBtZXNnaW5fcmVqZWN0OworCWNtcAlBLE1TR19OT09QCQlqZSBtZXNnaW5fZG9uZTsKKwljbXAJQSxNU0dfSUdOX1dJREVfUkVTSURVRQlqZSBtZXNnaW5fd2lkZV9yZXNpZHVlOworCityZWpfbWVzZ2luOgorLyoKKyAqIFdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgbWVzc2FnZSBpbiBpcywgc28gd2UgaXNzdWUgYSBtZXNzYWdlIHJlamVjdAorICogYW5kIGhvcGUgZm9yIHRoZSBiZXN0LiAgSW4gYW55IGNhc2UsIHJlamVjdGlvbiBzaG91bGQgYmUgYSByYXJlCisgKiBvY2N1cnJlbmNlIC0gc2lnbmFsIHRoZSBkcml2ZXIgd2hlbiBpdCBoYXBwZW5zLgorICovCisJbXZpCUlOVFNUQVQsU0VORF9SRUpFQ1Q7CQkvKiBsZXQgZHJpdmVyIGtub3cgKi8KKworCW12aQlNU0dfTUVTU0FHRV9SRUpFQ1QJY2FsbCBta19tZXNnOworCittZXNnaW5fZG9uZToKKwltb3YJTk9ORSxTQ1NJREFUTDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisJam1wCUlUbG9vcDsKKworCittZXNnaW5fY29tcGxldGU6CisvKgorICogV2UgZ290IGEgImNvbW1hbmQgY29tcGxldGUiIG1lc3NhZ2UsIHNvIHB1dCB0aGUgU0NCX1RBRyBpbnRvIHRoZSBRT1VURklGTywKKyAqIGFuZCB0cmlnZ2VyIGEgY29tcGxldGlvbiBpbnRlcnJ1cHQuICBCZWZvcmUgZG9pbmcgc28sIGNoZWNrIHRvIHNlZSBpZiB0aGVyZQorICogaXMgYSByZXNpZHVhbCBvciB0aGUgc3RhdHVzIGJ5dGUgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gU1RBVFVTX0dPT0QgKDApLgorICogSW4gZWl0aGVyIG9mIHRoZXNlIGNvbmRpdGlvbnMsIHdlIHVwbG9hZCB0aGUgU0NCIGJhY2sgdG8gdGhlIGhvc3Qgc28gaXQgY2FuCisgKiBwcm9jZXNzIHRoaXMgaW5mb3JtYXRpb24uICBJbiB0aGUgY2FzZSBvZiBhIG5vbiB6ZXJvIHN0YXR1cyBieXRlLCB3ZSAKKyAqIGFkZGl0aW9uYWxseSBpbnRlcnJ1cHQgdGhlIGtlcm5lbCBkcml2ZXIgc3luY2hyb25vdXNseSwgYWxsb3dpbmcgaXQgdG8KKyAqIGRlY2lkZSBpZiBzZW5zZSBzaG91bGQgYmUgcmV0cmlldmVkLiAgSWYgdGhlIGtlcm5lbCBkcml2ZXIgd2lzaGVzIHRvIHJlcXVlc3QKKyAqIHNlbnNlLCBpdCB3aWxsIGZpbGwgdGhlIGtlcm5lbCBTQ0Igd2l0aCBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCBhbmQgc2V0CisgKiBSRVRVUk5fMSB0byBTRU5EX1NFTlNFLiAgSWYgUkVUVVJOXzEgaXMgc2V0IHRvIFNFTkRfU0VOU0Ugd2UgcmVkb3dubG9hZAorICogdGhlIFNDQiwgYW5kIHByb2Nlc3MgaXQgYXMgdGhlIG5leHQgY29tbWFuZCBieSBhZGRpbmcgaXQgdG8gdGhlIHdhaXRpbmcgbGlzdC4KKyAqIElmIHRoZSBrZXJuZWwgZHJpdmVyIGRvZXMgbm90IHdpc2ggdG8gcmVxdWVzdCBzZW5zZSwgaXQgbmVlZCBvbmx5IGNsZWFyCisgKiBSRVRVUk5fMSwgYW5kIHRoZSBjb21tYW5kIGlzIGFsbG93ZWQgdG8gY29tcGxldGUgbm9ybWFsbHkuICBXZSBkb24ndCBib3RoZXIKKyAqIHRvIHBvc3QgdG8gdGhlIFFPVVRGSUZPIGluIHRoZSBlcnJvciBjYXNlcyBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIGV4dHJhCisgKiB3b3JrIGluIHRoZSBrZXJuZWwgZHJpdmVyIHRvIGVuc3VyZSB0aGF0IHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCBiZWZvcmUgdGhlCisgKiBjb21tYW5kIGNvbXBsZXRlIGNvZGUgdHJpZWQgcHJvY2Vzc2luZyBpdC4KKyAqLworCisvKgorICogRmlyc3QgY2hlY2sgZm9yIHJlc2lkdWFscworICovCisJdGVzdAlTQ0JfUkVTSURfU0dDTlQsMHhmZglqbnogdXBsb2FkX3NjYjsKKwl0ZXN0CVNDQl9UQVJHRVRfU1RBVFVTLDB4ZmYJanogY29tcGxldGU7CS8qIEdvb2QgU3RhdHVzPyAqLwordXBsb2FkX3NjYjoKKwltdmkJRE1BUEFSQU1TLCBGSUZPUkVTRVQ7CisJbW92CVNDQl9UQUcJCWNhbGwgZG1hX3NjYjsKK2NoZWNrX3N0YXR1czoKKwl0ZXN0CVNDQl9UQVJHRVRfU1RBVFVTLDB4ZmYJanogY29tcGxldGU7CS8qIEp1c3QgYSByZXNpZHVhbD8gKi8KKwltdmkJSU5UU1RBVCxCQURfU1RBVFVTOwkJCS8qIGxldCBkcml2ZXIga25vdyAqLworCW5vcDsKKwljbXAJUkVUVVJOXzEsIFNFTkRfU0VOU0UJam5lIGNvbXBsZXRlOworCS8qIFRoaXMgU0NCIGJlY29tZXMgdGhlIG5leHQgdG8gZXhlY3V0ZSBhcyBpdCB3aWxsIHJldHJpZXZlIHNlbnNlICovCisJbXZpCURNQVBBUkFNUywgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJbW92CVNDQl9UQUcJCWNhbGwgZG1hX3NjYjsKK2FkZF90b193YWl0aW5nX2xpc3Q6CisJbW92CVNDQl9ORVhULFdBSVRJTkdfU0NCSDsKKwltb3YJV0FJVElOR19TQ0JILCBTQ0JQVFI7CisJLyoKKwkgKiBQcmVwYXJlIG91ciBzZWxlY3Rpb24gaGFyZHdhcmUgYmVmb3JlIHRoZSBidXNmcmVlIHNvIHdlIGhhdmUgYQorCSAqIGhpZ2ggcHJvYmFiaWxpdHkgb2Ygd2lubmluZyBhcmJpdHJhdGlvbi4KKwkgKi8KKwljYWxsCXN0YXJ0X3NlbGVjdGlvbjsKKwlqbXAJYXdhaXRfYnVzZnJlZTsKKworY29tcGxldGU6CisJLyogSWYgd2UgYXJlIHVudGFnZ2VkLCBjbGVhciBvdXIgYWRkcmVzcyB1cCBpbiBob3N0IHJhbSAqLworCXRlc3QJU0NCX0NPTlRST0wsIFRBR19FTkIgam56IGNvbXBsZXRlX3Bvc3Q7CisJbW92CUEsIFNBVkVEX1RDTDsKKwltdmkJVU5UQUdHRURTQ0JfT0ZGU0VUIGNhbGwgcG9zdF9ieXRlX3NldHVwOworCW12aQlTQ0JfTElTVF9OVUxMIGNhbGwgcG9zdF9ieXRlOworCitjb21wbGV0ZV9wb3N0OgorCS8qIFBvc3QgdGhlIFNDQiBhbmQgaXNzdWUgYW4gaW50ZXJydXB0ICovCisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKSB7CisJCW1vdglBLCBTRFNDQl9RT0ZGOworCX0gZWxzZSB7CisJCW1vdglBLCBRT1VUUE9TOworCX0KKwltdmkJUU9VVEZJRk9fT0ZGU0VUIGNhbGwgcG9zdF9ieXRlX3NldHVwOworCW1vdglTQ0JfVEFHIGNhbGwgcG9zdF9ieXRlOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfUVVFVUVfUkVHUykgPT0gMCkgeworCQlpbmMgCVFPVVRQT1M7CisJfQorCW12aQlJTlRTVEFULENNRENNUExUOworCithZGRfdG9fZnJlZV9saXN0OgorCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7CisJam1wCWF3YWl0X2J1c2ZyZWU7CisKKy8qCisgKiBJcyBpdCBhbiBleHRlbmRlZCBtZXNzYWdlPyAgQ29weSB0aGUgbWVzc2FnZSB0byBvdXIgbWVzc2FnZSBidWZmZXIgYW5kCisgKiBub3RpZnkgdGhlIGhvc3QuICBUaGUgaG9zdCB3aWxsIHRlbGwgdXMgd2hldGhlciB0byByZWplY3QgdGhpcyBtZXNzYWdlLAorICogcmVzcG9uZCB0byBpdCB3aXRoIHRoZSBtZXNzYWdlIHRoYXQgdGhlIGhvc3QgcGxhY2VkIGluIG91ciBtZXNzYWdlIGJ1ZmZlciwKKyAqIG9yIHNpbXBseSB0byBkbyBub3RoaW5nLgorICovCittZXNnaW5fZXh0ZW5kZWQ6CisJbXZpCUlOVFNUQVQsRVhURU5ERURfTVNHOwkJLyogbGV0IGRyaXZlciBrbm93ICovCisJam1wCUlUbG9vcDsKKworLyoKKyAqIElzIGl0IGEgZGlzY29ubmVjdCBtZXNzYWdlPyAgU2V0IGEgZmxhZyBpbiB0aGUgU0NCIHRvIHJlbWluZCB1cworICogYW5kIGF3YWl0IHRoZSBidXMgZ29pbmcgZnJlZS4KKyAqLworbWVzZ2luX2Rpc2Nvbm5lY3Q6CisJb3IJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEOworCWNhbGwJYWRkX3NjYl90b19kaXNjX2xpc3Q7CisJam1wCWF3YWl0X2J1c2ZyZWU7CisKKy8qCisgKiBTYXZlIGRhdGEgcG9pbnRlcnMgbWVzc2FnZToKKyAqIENvcHlpbmcgUkFNIHZhbHVlcyBiYWNrIHRvIFNDQiwgZm9yIFNhdmUgRGF0YSBQb2ludGVycyBtZXNzYWdlLCBidXQKKyAqIG9ubHkgaWYgd2UndmUgYWN0dWFsbHkgYmVlbiBpbnRvIGEgZGF0YSBwaGFzZSB0byBjaGFuZ2UgdGhlbS4gIFRoaXMKKyAqIHByb3RlY3RzIGFnYWluc3QgYm9ndXMgZGF0YSBpbiBzY3JhdGNoIHJhbSBhbmQgdGhlIHJlc2lkdWFsIGNvdW50cworICogc2luY2UgdGhleSBhcmUgb25seSBpbml0aWFsaXplZCB3aGVuIHdlIGdvIGludG8gZGF0YV9pbiBvciBkYXRhX291dC4KKyAqLworbWVzZ2luX3NkcHRyczoKKwl0ZXN0CVNFUV9GTEFHUywgRFBIQVNFCWp6IG1lc2dpbl9kb25lOworCS8qCisJICogVGhlIFNDQiBTR1BUUiBiZWNvbWVzIHRoZSBuZXh0IG9uZSB3ZSdsbCBkb3dubG9hZCwKKwkgKiBhbmQgdGhlIFNDQiBEQVRBUFRSIGJlY29tZXMgdGhlIGN1cnJlbnQgU0hBRERSLgorCSAqIFVzZSB0aGUgcmVzaWR1YWwgbnVtYmVyIHNpbmNlIFNUQ05UIGlzIGNvcnJ1cHRlZCBieQorCSAqIGFueSBtZXNzYWdlIHRyYW5zZmVyLgorCSAqLworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJYm1vdiAgICBTQ0JfU0dDT1VOVCwgU0dfQ09VTlQsIDU7CisJCWJtb3YgICAgU0NCX0RBVEFQVFIsIFNIQUREUiwgNDsKKwkJYm1vdiAgICBTQ0JfREFUQUNOVCwgU0NCX1JFU0lEX0RDTlQsIDM7CisJfSBlbHNlIHsKKwkJbXZpCURJTkRFWCwgU0NCX1NHQ09VTlQ7CisJCW12aQlTR19DT1VOVAljYWxsIGJjb3B5XzU7CisJCW12aQlESU5ERVgsIFNDQl9EQVRBUFRSOworCQltdmkJU0hBRERSCQljYWxsIGJjb3B5XzQ7CisJCW12aQlTQ0JfUkVTSURfRENOVAljYWxsCWJjb3B5XzM7CisJfQorCWptcAltZXNnaW5fZG9uZTsKKworLyoKKyAqIFJlc3RvcmUgcG9pbnRlcnMgbWVzc2FnZT8gIERhdGEgcG9pbnRlcnMgYXJlIHJlY29waWVkIGZyb20gdGhlCisgKiBTQ0IgYW55dGltZSB3ZSBlbnRlciBhIGRhdGEgcGhhc2UgZm9yIHRoZSBmaXJzdCB0aW1lLCBzbyBhbGwKKyAqIHdlIG5lZWQgdG8gZG8gaXMgY2xlYXIgdGhlIERQSEFTRSBmbGFnIGFuZCBsZXQgdGhlIGRhdGEgcGhhc2UKKyAqIGNvZGUgZG8gdGhlIHJlc3QuCisgKi8KK21lc2dpbl9yZHB0cnM6CisJYW5kCVNFUV9GTEFHUywgfkRQSEFTRTsJCS8qCisJCQkJCQkgKiBXZSdsbCByZWxvYWQgdGhlbQorCQkJCQkJICogdGhlIG5leHQgdGltZSB0aHJvdWdoCisJCQkJCQkgKiB0aGUgZGF0YXBoYXNlLgorCQkJCQkJICovCisJam1wCW1lc2dpbl9kb25lOworCisvKgorICogSWRlbnRpZnkgbWVzc2FnZT8gIEZvciBhIHJlY29ubmVjdGluZyB0YXJnZXQsIHRoaXMgdGVsbHMgdXMgdGhlIGx1bgorICogdGhhdCB0aGUgcmVjb25uZWN0aW9uIGlzIGZvciAtIGZpbmQgdGhlIGNvcnJlY3QgU0NCIGFuZCBzd2l0Y2ggdG8gaXQsCisgKiBjbGVhcmluZyB0aGUgImRpc2Nvbm5lY3RlZCIgYml0IHNvIHdlIGRvbid0ICJmaW5kIiBpdCBieSBhY2NpZGVudCBsYXRlci4KKyAqLworbWVzZ2luX2lkZW50aWZ5OgorCQorCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCkgeworCQlhbmQJQSwweDBmOwkJLyogbHVuIGluIGxvd2VyIGZvdXIgYml0cyAqLworCX0gZWxzZSB7CisJCWFuZAlBLDB4MDc7CQkvKiBsdW4gaW4gbG93ZXIgdGhyZWUgYml0cyAqLworCX0KKwlvciAgICAgIFNBVkVEX1RDTCxBOwkJLyogU0FWRURfVENMIHNob3VsZCBiZSBjb21wbGV0ZSBub3cgKi8KKworCW12aSAgICAgQVJHXzIsIFNDQl9MSVNUX05VTEw7ICAgLyogU0NCSUQgb2YgcHJldiBTQ0IgaW4gZGlzYyBMaXN0ICovCisJY2FsbAlnZXRfdW50YWdnZWRfU0NCSUQ7CisJY21wCUFSR18xLCBTQ0JfTElTVF9OVUxMCWplIHNub29wX3RhZzsKKwlpZiAoKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSAhPSAwKSB7CisJCXRlc3QJU0VRX0ZMQUdTLCBTQ0JQVFJfVkFMSUQJanogdXNlX3JldHJpZXZlU0NCOworCX0KKwkvKgorCSAqIElmIHRoZSBTQ0Igd2FzIGZvdW5kIGluIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCAoYXMgaXMKKwkgKiBhbHdheXMgdGhlIGNhc2UgaW4gbm9uLXBhZ2luZyBzY2VuYXJpb3MpLCBTQ0JQVFIgaXMgYWxyZWFkeQorCSAqIHNldCB0byB0aGUgY29ycmVjdCBTQ0IuICBTbywgc2ltcGx5IHNldHVwIHRoZSBTQ0IgYW5kIGdldAorCSAqIG9uIHdpdGggdGhpbmdzLgorCSAqLworCW1vdglTQ0JQVFIJY2FsbCByZW1fc2NiX2Zyb21fZGlzY19saXN0OworCWptcAlzZXR1cF9TQ0I7CisvKgorICogSGVyZSB3ZSAic25vb3AiIHRoZSBidXMgbG9va2luZyBmb3IgYSBTSU1QTEUgUVVFVUUgVEFHIG1lc3NhZ2UuCisgKiBJZiB3ZSBnZXQgb25lLCB3ZSB1c2UgdGhlIHRhZyByZXR1cm5lZCB0byBmaW5kIHRoZSBwcm9wZXIKKyAqIFNDQi4gIFdpdGggU0NCIHBhZ2luZywgdGhpcyByZXF1aXJlcyB1c2luZyBzZWFyY2ggZm9yIGJvdGggdGFnZ2VkCisgKiBhbmQgbm9uLXRhZ2dlZCB0cmFuc2FjdGlvbnMgc2luY2UgdGhlIFNDQiBtYXkgZXhpc3QgaW4gYW55IHNsb3QuCisgKiBJZiB3ZSdyZSBub3QgdXNpbmcgU0NCIHBhZ2luZywgd2UgY2FuIHVzZSB0aGUgdGFnIGFzIHRoZSBkaXJlY3QKKyAqIGluZGV4IHRvIHRoZSBTQ0IuCisgKi8KK3Nub29wX3RhZzoKKwltb3YJTk9ORSxTQ1NJREFUTDsJCS8qIEFDSyBJZGVudGlmeSBNU0cgKi8KK3Nub29wX3RhZ19sb29wOgorCWNhbGwJcGhhc2VfbG9jazsKKwljbXAJTEFTVFBIQVNFLCBQX01FU0dJTglqbmUgbm90X2ZvdW5kOworCWNtcAlTQ1NJQlVTTCxNU0dfU0lNUExFX1FfVEFHIGpuZSBub3RfZm91bmQ7CitnZXRfdGFnOgorCW12aQlBUkdfMQljYWxsIGluYl9uZXh0OwkvKiB0YWcgdmFsdWUgKi8KKwordXNlX3JldHJpZXZlU0NCOgorCWNhbGwJcmV0cmlldmVTQ0I7CitzZXR1cF9TQ0I6CisJbW92CUEsIFNBVkVEX1RDTDsKKwljbXAJU0NCX1RDTCwgQQlqbmUgbm90X2ZvdW5kX2NsZWFudXBfc2NiOworCXRlc3QJU0NCX0NPTlRST0wsRElTQ09OTkVDVEVEIGp6IG5vdF9mb3VuZF9jbGVhbnVwX3NjYjsKKwlhbmQJU0NCX0NPTlRST0wsfkRJU0NPTk5FQ1RFRDsKKwlvcglTRVFfRkxBR1MsSURFTlRJRllfU0VFTjsJICAvKiBtYWtlIG5vdGUgb2YgSURFTlRJRlkgKi8KKwkvKiBTZWUgaWYgdGhlIGhvc3Qgd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdXBvbiByZWNvbm5lY3Rpb24gKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBNS19NRVNTQUdFIGp6IG1lc2dpbl9kb25lOworCWFuZAlTQ0JfQ09OVFJPTCwgfk1LX01FU1NBR0U7CisJbXZpCUhPU1RfTVNHCWNhbGwgbWtfbWVzZzsKKwlqbXAJbWVzZ2luX2RvbmU7CisKK25vdF9mb3VuZF9jbGVhbnVwX3NjYjoKKwl0ZXN0CVNDQl9DT05UUk9MLCBESVNDT05ORUNURUQganogLiArIDM7CisJY2FsbAlhZGRfc2NiX3RvX2Rpc2NfbGlzdDsKKwlqbXAJbm90X2ZvdW5kOworCWNhbGwJYWRkX3NjYl90b19mcmVlX2xpc3Q7Citub3RfZm91bmQ6CisJbXZpCUlOVFNUQVQsIE5PX01BVENIOworCW12aQlNU0dfQlVTX0RFVl9SRVNFVAljYWxsIG1rX21lc2c7CisJam1wCW1lc2dpbl9kb25lOworCisvKgorICogTWVzc2FnZSByZWplY3Q/ICBMZXQgdGhlIGtlcm5lbCBkcml2ZXIgaGFuZGxlIHRoaXMuICBJZiB3ZSBoYXZlIGFuIAorICogb3V0c3RhbmRpbmcgV0RUUiBvciBTRFRSIG5lZ290aWF0aW9uLCBhc3N1bWUgdGhhdCBpdCdzIGEgcmVzcG9uc2UgZnJvbSAKKyAqIHRoZSB0YXJnZXQgc2VsZWN0aW5nIDhiaXQgb3IgYXN5bmNocm9ub3VzIHRyYW5zZmVyLCBvdGhlcndpc2UganVzdCBpZ25vcmUgCisgKiBpdCBzaW5jZSB3ZSBoYXZlIG5vIGNsdWUgd2hhdCBpdCBwZXJ0YWlucyB0by4KKyAqLworbWVzZ2luX3JlamVjdDoKKwltdmkJSU5UU1RBVCwgUkVKRUNUX01TRzsKKwlqbXAJbWVzZ2luX2RvbmU7CisKKy8qCisgKiBXaWRlIFJlc2lkdWUuICBXZSBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlcywgYnV0IHBhc3Mgb2YgdGhlIG9uZSBoYXJkIGNhc2UKKyAqIHRvIHRoZSBrZXJuZWwgKHdoZW4gdGhlIHJlc2lkdWUgYnl0ZSBoYXBwZW5lZCB0byBjYXVzZSB1cyB0byBhZHZhbmNlIG91cgorICogc2cgZWxlbWVudCBhcnJheSwgc28gd2Uga25vdyBoYXZlIHRvIGJhY2sgdGhhdCBhZHZhbmNlIG91dCkuCisgKi8KK21lc2dpbl93aWRlX3Jlc2lkdWU6CisJbXZpCUFSR18xCWNhbGwgaW5iX25leHQ7IC8qIEFDSyB0aGUgd2lkZV9yZXNpZHVlIGFuZCBnZXQgKi8KKwkJCQkgICAgICAgLyogdGhlIHNpemUgYnl0ZSAqLworLyoKKyAqIEluIG9yZGVyIGZvciB0aGlzIHRvIGJlIHJlbGlhYmxlLCB3ZSBoYXZlIHRvIGRvIGFsbCBzb3J0cyBvZiBob3JyaWJsZQorICogbWFnaWMgaW4gdGVybXMgb2YgcmVzZXR0aW5nIHRoZSBkYXRhZmlmbyBhbmQgcmVsb2FkaW5nIHRoZSBzaGFkb3cgbGF5ZXIKKyAqIHdpdGggdGhlIGNvcnJlY3QgbmV3IHZhbHVlcyAoc28gdGhhdCBhIHN1YnNlcXVlbnQgc2F2ZSBkYXRhIHBvaW50ZXJzCisgKiBtZXNzYWdlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nKS4gIFdlIGxldCB0aGUga2VybmVsIGRvIHRoYXQgd29yay4KKyAqLworIAltdmkJSU5UU1RBVCwgV0lERV9SRVNJRFVFOworCWptcAltZXNnaW5fZG9uZTsKKwkKKy8qCisgKiBbIEFERCBNT1JFIE1FU1NBR0UgSEFORExJTkcgSEVSRSBdCisgKi8KKworLyoKKyAqIExvY2tpbmcgdGhlIGRyaXZlciBvdXQsIGJ1aWxkIGEgb25lLWJ5dGUgbWVzc2FnZSBwYXNzZWQgaW4gU0lOREVYCisgKiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgbWVzc2FnZSBhbHJlYWR5LiAgU0lOREVYIGlzIHJldHVybmVkIGludGFjdC4KKyAqLworbWtfbWVzZzoKKwlvcglTQ1NJU0lHTyxBVE5PLExBU1RQSEFTRTsvKiB0dXJuIG9uIEFUTk8gKi8KKwltb3YJTVNHX09VVCxTSU5ERVggcmV0OworCisvKgorICogRnVuY3Rpb25zIHRvIHJlYWQgZGF0YSBpbiBBdXRvbWF0aWMgUElPIG1vZGUuCisgKgorICogQWNjb3JkaW5nIHRvIEFkYXB0ZWMncyBkb2N1bWVudGF0aW9uLCBhbiBBQ0sgaXMgbm90IHNlbnQgb24gaW5wdXQgZnJvbQorICogdGhlIHRhcmdldCB1bnRpbCBTQ1NJREFUTCBpcyByZWFkIGZyb20uICBTbyB3ZSB3YWl0IHVudGlsIFNDU0lEQVRMIGlzCisgKiBsYXRjaGVkICh0aGUgdXN1YWwgd2F5KSwgdGhlbiByZWFkIHRoZSBkYXRhIGJ5dGUgZGlyZWN0bHkgb2ZmIHRoZSBidXMKKyAqIHVzaW5nIFNDU0lCVVNMLiAgV2hlbiB3ZSBoYXZlIHB1bGxlZCB0aGUgQVROIGxpbmUsIG9yIHdlIGp1c3Qgd2FudCB0bworICogYWNrbm93bGVkZ2UgdGhlIGJ5dGUsIHRoZW4gd2UgZG8gYSBkdW1teSByZWFkIGZyb20gU0NJU0RBVEwuICBUaGUgU0NTSQorICogc3BlYyBndWFyYW50ZWVzIHRoYXQgdGhlIHRhcmdldCB3aWxsIGhvbGQgdGhlIGRhdGEgYnl0ZSBvbiB0aGUgYnVzIHVudGlsCisgKiB3ZSBzZW5kIG91ciBBQ0suCisgKgorICogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHRoZXNlIGFyZSBjYWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNlcXVlbmNlLAorICogYW5kIHRoYXQgUkVRIGlzIGFscmVhZHkgc2V0IHdoZW4gaW5iX2ZpcnN0IGlzIGNhbGxlZC4gIGluYl97Zmlyc3QsbmV4dH0KKyAqIHVzZSB0aGUgc2FtZSBjYWxsaW5nIGNvbnZlbnRpb24gYXMgaW5iLgorICovCisKK2luYl9uZXh0OgorCW1vdglOT05FLFNDU0lEQVRMOwkJLypkdW1teSByZWFkIGZyb20gbGF0Y2ggdG8gQUNLKi8KK2luYl9uZXh0X3dhaXQ6CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhcml0eSBlcnJvciwgd2FpdCBmb3IgdGhlIGtlcm5lbCB0bworCSAqIHNlZSB0aGUgaW50ZXJydXB0IGFuZCBwcmVwYXJlIG91ciBtZXNzYWdlIHJlc3BvbnNlCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJdGVzdAlTU1RBVDEsIFJFUUlOSVQJanogaW5iX25leHRfd2FpdDsKKwl0ZXN0CVNTVEFUMSwgU0NTSVBFUlIgam56IC47CisJYW5kCUxBU1RQSEFTRSwgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJY21wCUxBU1RQSEFTRSwgUF9NRVNHSU4gam5lIG1lc2dpbl9waGFzZW1pczsKK2luYl9maXJzdDoKKwltb3YJRElOREVYLFNJTkRFWDsKKwltb3YJRElORElSLFNDU0lCVVNMCXJldDsJCS8qcmVhZCBieXRlIGRpcmVjdGx5IGZyb20gYnVzKi8KK2luYl9sYXN0OgorCW1vdglOT05FLFNDU0lEQVRMIHJldDsJCS8qZHVtbXkgcmVhZCBmcm9tIGxhdGNoIHRvIEFDSyovCisKKwkKK21lc2dpbl9waGFzZW1pczoKKy8qCisgKiBXZSBleHBlY3RlZCB0byByZWNlaXZlIGFub3RoZXIgYnl0ZSwgYnV0IHRoZSB0YXJnZXQgY2hhbmdlZCBwaGFzZQorICovCisJbXZpCUlOVFNUQVQsIE1TR0lOX1BIQVNFTUlTOworCWptcAlJVGxvb3A7CisKKy8qCisgKiBETUEgZGF0YSB0cmFuc2Zlci4gIEhBRERSIGFuZCBIQ05UIG11c3QgYmUgbG9hZGVkIGZpcnN0LCBhbmQKKyAqIFNJTkRFWCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWUgdG8gbG9hZCBERkNOVFJMIHdpdGggLSAweDNkIGZvcgorICogaG9zdC0+c2NzaSwgb3IgMHgzOSBmb3Igc2NzaS0+aG9zdC4gIFRoZSBTQ1NJIGNoYW5uZWwgaXMgY2xlYXJlZAorICogZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCitpZiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgPT0gMCkgeworZG1hOgorCW1vdglERkNOVFJMLFNJTkRFWDsKK2RtYV9sb29wOgorCXRlc3QJU1NUQVQwLERNQURPTkUJam56IGRtYV9kbWFkb25lOworCXRlc3QJU1NUQVQxLFBIQVNFTUlTCWp6IGRtYV9sb29wOwkvKiBpZS4gdW5kZXJydW4gKi8KK2RtYV9waGFzZW1pczoKKwl0ZXN0CVNTVEFUMCxTRE9ORQlqbnogZG1hX2NoZWNrZmlmbzsKKwltb3YJU0lOREVYLEFMTFpFUk9TOwkJLyogTm90aWZ5IGNhbGxlciBvZiBwaGFzZW1pc3MgKi8KKworLyoKKyAqIFdlIHdpbGwgYmUgImRvbmUiIERNQWluZyB3aGVuIHRoZSB0cmFuc2ZlciBjb3VudCBnb2VzIHRvIHplcm8sIG9yCisgKiB0aGUgdGFyZ2V0IGNoYW5nZXMgdGhlIHBoYXNlIChpbiBsaWdodCBvZiB0aGlzLCBpdCBtYWtlcyBzZW5zZSB0aGF0CisgKiB0aGUgRE1BIGNpcmN1aXRyeSBkb2Vzbid0IEFDSyB3aGVuIFBIQVNFTUlTIGlzIGFjdGl2ZSkuICBJZiB3ZSBhcmUKKyAqIGRvaW5nIGEgU0NTSS0+SG9zdCB0cmFuc2ZlciwgdGhlIGRhdGEgRklGTyBzaG91bGQgYmUgZmx1c2hlZCBhdXRvLQorICogbWFnaWNhbGx5IG9uIFNUQ05UPTAgb3IgYSBwaGFzZSBjaGFuZ2UsIHNvIGp1c3Qgd2FpdCBmb3IgRklGTyBlbXB0eQorICogc3RhdHVzLgorICovCitkbWFfY2hlY2tmaWZvOgorCXRlc3QJREZDTlRSTCxESVJFQ1RJT04Jam56IGRtYV9maWZvZW1wdHk7CitkbWFfZmlmb2ZsdXNoOgorCXRlc3QJREZTVEFUVVMsRklGT0VNUAlqeiBkbWFfZmlmb2ZsdXNoOworCitkbWFfZmlmb2VtcHR5OgorCS8qIERvbid0IGNsb2JiZXIgYW4gaW5wcm9ncmVzcyBob3N0IGRhdGEgdHJhbnNmZXIgKi8KKwl0ZXN0CURGU1RBVFVTLCBNUkVRUEVORAlqbnogZG1hX2ZpZm9lbXB0eTsKKy8qCisgKiBOb3cgc2h1dCB0aGUgRE1BIGVuYWJsZXMgb2ZmIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgRE1BIGVuYWJsZXMgYXJlIAorICogYWN0dWFsbHkgb2ZmIGZpcnN0IGxlc3Qgd2UgZ2V0IGFuIElMTFNBRERSLgorICovCitkbWFfZG1hZG9uZToKKwljbXAJTEFTVFBIQVNFLCBQX0NPTU1BTkQJamUgZG1hX2F3YWl0X25yZXE7CisJdGVzdAlTQ1NJUkFURSwgMHgwZglqbnogZG1hX3NodXRkb3duOworZG1hX2F3YWl0X25yZXE6CisJdGVzdAlTQ1NJU0lHSSwgUkVRSQlqeiBkbWFfc2h1dGRvd247CisJdGVzdAlTU1RBVDEsIChQSEFTRU1JU3xSRVFJTklUKQlqeiBkbWFfYXdhaXRfbnJlcTsKK2RtYV9zaHV0ZG93bjoKKwlhbmQJREZDTlRSTCwgfihTQ1NJRU58U0RNQUVOfEhETUFFTik7CitkbWFfaGFsdDoKKwkvKgorCSAqIFNvbWUgcmV2aXNpb25zIG9mIHRoZSBhaWM3ODgwIGhhdmUgYSBwcm9ibGVtIHdoZXJlLCBpZiB0aGUKKwkgKiBkYXRhIGZpZm8gaXMgZnVsbCwgYnV0IHRoZSBQQ0kgaW5wdXQgbGF0Y2ggaXMgbm90IGVtcHR5LCAKKwkgKiBIRE1BRU4gY2Fubm90IGJlIGNsZWFyZWQuICBUaGUgZml4IHVzZWQgaGVyZSBpcyB0byBhdHRlbXB0CisJICogdG8gZHJhaW4gdGhlIGRhdGEgZmlmbyB1bnRpbCB0aGVyZSBpcyBzcGFjZSBmb3IgdGhlIGlucHV0CisJICogbGF0Y2ggdG8gZHJhaW4gYW5kIEhETUFFTiBkZS1hc3NlcnRzLgorCSAqLworCWlmICgocC0+YnVncyAmIEFIQ19CVUdfUENJXzJfMV9SRVRSWSkgIT0gMCkgeworCQltb3YJTk9ORSwgREZEQVQ7CisJfQorCXRlc3QJREZDTlRSTCwgKFNDU0lFTnxTRE1BRU58SERNQUVOKSBqbnogZG1hX2hhbHQ7Cit9CityZXR1cm46CisJcmV0OworCisvKgorICogQXNzZXJ0IHRoYXQgaWYgd2UndmUgYmVlbiByZXNlbGVjdGVkLCB0aGVuIHdlJ3ZlIHNlZW4gYW4gSURFTlRJRlkKKyAqIG1lc3NhZ2UuCisgKi8KK2Fzc2VydDoKKwl0ZXN0CVNFUV9GTEFHUyxJREVOVElGWV9TRUVOCWpueiByZXR1cm47CS8qIHNlZW4gSURFTlRJRlk/ICovCisKKwltdmkJSU5UU1RBVCxOT19JREVOVCAJcmV0OwkvKiBubyAtIHRlbGwgdGhlIGtlcm5lbCAqLworCisvKgorICogTG9jYXRlIGEgZGlzY29ubmVjdGVkIFNDQiBlaXRoZXIgYnkgU0FWRURfVENMIChBUkdfMSBpcyBTQ0JfTElTVF9OVUxMKQorICogb3IgYnkgdGhlIFNDQklEIEFSR18xLiAgVGhlIHNlYXJjaCBiZWdpbnMgYXQgdGhlIFNDQiBpbmRleCBwYXNzZWQgaW4KKyAqIHZpYSBTSU5ERVggd2hpY2ggaXMgYW4gU0NCIHRoYXQgbXVzdCBiZSBvbiB0aGUgZGlzY29ubmVjdGVkIGxpc3QuICBJZgorICogdGhlIFNDQiBjYW5ub3QgYmUgZm91bmQsIFNJTkRFWCB3aWxsIGJlIFNDQl9MSVNUX05VTEwsIG90aGVyd2lzZSwgU0NCUFRSCisgKiBpcyBzZXQgdG8gdGhlIHByb3BlciBTQ0IuCisgKi8KK2ZpbmRTQ0I6CisJbW92CVNDQlBUUixTSU5ERVg7CQkJLyogSW5pdGlhbGl6ZSBTQ0JQVFIgKi8KKwljbXAJQVJHXzEsIFNDQl9MSVNUX05VTEwJam5lIGZpbmRTQ0JfYnlfU0NCSUQ7CisJbW92CUEsIFNBVkVEX1RDTDsKKwltdmkJU0NCX1RDTAlqbXAgZmluZFNDQl9sb29wOwkvKiAmU0NCX1RDTCAtPiBTSU5ERVggKi8KK2ZpbmRTQ0JfYnlfU0NCSUQ6CisJbW92CUEsIEFSR18xOwkJCS8qIFRhZyBwYXNzZWQgaW4gQVJHXzEgKi8KKwltdmkJU0NCX1RBRwlqbXAgZmluZFNDQl9sb29wOwkvKiAmU0NCX1RBRyAtPiBTSU5ERVggKi8KK2ZpbmRTQ0JfbmV4dDoKKwltb3YgICAgIEFSR18yLCBTQ0JQVFI7CisJY21wCVNDQl9ORVhULCBTQ0JfTElTVF9OVUxMIGplIG5vdEZvdW5kOworCW1vdglTQ0JQVFIsU0NCX05FWFQ7CisJZGVjCVNJTkRFWDsJCS8qIExhc3QgY29tcGFyaXNvbiBtb3ZlZCB1cyB0b28gZmFyICovCitmaW5kU0NCX2xvb3A6CisJY21wCVNJTkRJUiwgQQlqbmUgZmluZFNDQl9uZXh0OworCW1vdglTSU5ERVgsIFNDQlBUUiAJcmV0Oworbm90Rm91bmQ6CisJbXZpCVNJTkRFWCwgU0NCX0xJU1RfTlVMTAlyZXQ7CisKKy8qCisgKiBSZXRyaWV2ZSBhbiBTQ0IgYnkgU0NCSUQgZmlyc3Qgc2VhcmNoaW5nIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBmYWxsaW5nCisgKiBiYWNrIHRvIERNQSdpbmcgdGhlIFNDQiBkb3duIGZyb20gdGhlIGhvc3QuICBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0CisgKiBBUkdfMSBpcyB0aGUgU0NCSUQgb2YgaW50ZXJyZXN0IGFuZCB0aGF0IFNJTkRFWCBpcyB0aGUgcG9zaXRpb24gaW4gdGhlCisgKiBkaXNjb25uZWN0ZWQgbGlzdCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZiBTSU5ERVggaXMgU0NCX0xJU1RfTlVMTCwKKyAqIHdlIGdvIGRpcmVjdGx5IHRvIHRoZSBob3N0IGZvciB0aGUgU0NCLgorICovCityZXRyaWV2ZVNDQjoKKwl0ZXN0CVNFUV9GTEFHUywgU0NCUFRSX1ZBTElECWp6IHJldHJpZXZlX2Zyb21faG9zdDsKKwltb3YJU0NCUFRSCWNhbGwgZmluZFNDQjsJLyogQ29udGludWUgdGhlIHNlYXJjaCAqLworCWNtcAlTSU5ERVgsIFNDQl9MSVNUX05VTEwJamUgcmV0cmlldmVfZnJvbV9ob3N0OworCisvKgorICogVGhpcyByb3V0aW5lIGV4cGVjdHMgU0lOREVYIHRvIGNvbnRhaW4gdGhlIGluZGV4IG9mIHRoZSBTQ0IgdG8gYmUKKyAqIHJlbW92ZWQsIFNDQlBUUiB0byBiZSBwb2ludGluZyB0byB0aGF0IFNDQiwgYW5kIEFSR18yIHRvIGJlIHRoZQorICogU0NCSUQgb2YgdGhlIFNDQiBqdXN0IHByZXZpb3VzIHRvIHRoaXMgb25lIGluIHRoZSBsaXN0IG9yIFNDQl9MSVNUX05VTEwKKyAqIGlmIGl0IGlzIGF0IHRoZSBoZWFkLgorICovCityZW1fc2NiX2Zyb21fZGlzY19saXN0OgorLyogUmVtb3ZlIHRoaXMgU0NCIGZyb20gdGhlIGRpc2Nvbm5lY3Rpb24gbGlzdCAqLworCWNtcCAgICAgQVJHXzIsIFNDQl9MSVNUX05VTEwgICAgamUgckhlYWQ7CisJbW92CURJTkRFWCwgU0NCX05FWFQ7CisJbW92CVNDQlBUUiwgQVJHXzI7CisJbW92CVNDQl9ORVhULCBESU5ERVg7CisJbW92CVNDQlBUUiwgU0lOREVYIHJldDsKK3JIZWFkOgorCW1vdglESVNDT05ORUNURURfU0NCSCxTQ0JfTkVYVCByZXQ7CisKK3JldHJpZXZlX2Zyb21faG9zdDoKKy8qCisgKiBXZSBkaWRuJ3QgZmluZCBpdC4gIFB1bGwgYW4gU0NCIGFuZCBETUEgZG93biB0aGUgb25lIHdlIHdhbnQuCisgKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgaW4gdGhlIG5vbi1wYWdpbmcgY2FzZS4KKyAqLworCW1vdglBTExaRVJPUwljYWxsCWdldF9mcmVlX29yX2Rpc2Nfc2NiOworCW12aQlETUFQQVJBTVMsIEhETUFFTnxESVJFQ1RJT058RklGT1JFU0VUOworCS8qIEp1bXAgaW5zdGVhZCBvZiBjYWxsIGFzIHdlIHdhbnQgdG8gcmV0dXJuIGFueXdheSAqLworCW1vdglBUkdfMQlqbXAgZG1hX3NjYjsKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgdGFyZ2V0IGlzIHVzaW5nIHRhZ2dlZCBvciBub24tdGFnZ2VkIHRyYW5zYWN0aW9ucworICogYnkgZmlyc3QgbG9va2luZyBmb3IgYSBtYXRjaGluZyB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgVENMIGFuZCBpZgorICogdGhhdCBmYWlscywgbG9va2luZyB1cCB0aGlzIGRldmljZSBpbiB0aGUgaG9zdCdzIHVudGFnZ2VkIFNDQiBhcnJheS4KKyAqIFRoZSBUQ0wgdG8gc2VhcmNoIGZvciBpcyBhc3N1bWVkIHRvIGJlIGluIFNBVkVEX1RDTC4gIFRoZSB2YWx1ZSBpcworICogcmV0dXJuZWQgaW4gQVJHXzEgKFNDQl9MSVNUX05VTEwgZm9yIHRhZ2dlZCwgU0NCSUQgZm9yIG5vbi10YWdnZWQpLgorICogVGhlIFNDQlBUUl9WQUxJRCBiaXQgaXMgc2V0IGluIFNFUV9GTEFHUyBpZiB3ZSBmb3VuZCB0aGUgaW5mb3JtYXRpb24KKyAqIGluIGFuIFNDQiBpbnN0ZWFkIG9mIGhhdmluZyB0byBnbyB0byB0aGUgaG9zdC4KKyAqLworZ2V0X3VudGFnZ2VkX1NDQklEOgorCWNtcAlESVNDT05ORUNURURfU0NCSCwgU0NCX0xJU1RfTlVMTCBqZSBnZXRfU0NCSURfZnJvbV9ob3N0OworCW12aQlBUkdfMSwgU0NCX0xJU1RfTlVMTDsKKwltb3YJRElTQ09OTkVDVEVEX1NDQkggY2FsbCBmaW5kU0NCOworCWNtcAlTSU5ERVgsIFNDQl9MSVNUX05VTEwJamUgZ2V0X1NDQklEX2Zyb21faG9zdDsKKwlvcglTRVFfRkxBR1MsIFNDQlBUUl9WQUxJRDsvKiBXYXMgaW4gZGlzY29ubmVjdGVkIGxpc3QgKi8KKwl0ZXN0CVNDQl9DT05UUk9MLCBUQUdfRU5CCWpueiAuICsgMjsKKwltb3YJQVJHXzEsIFNDQl9UQUcJcmV0OworCW12aQlBUkdfMSwgU0NCX0xJU1RfTlVMTCByZXQ7CisKKy8qCisgKiBGZXRjaCBhIGJ5dGUgZnJvbSBob3N0IG1lbW9yeSBnaXZlbiBhbiBpbmRleCBvZiAoQSArICgyNTYgKiBTSU5ERVgpKQorICogYW5kIGEgYmFzZSBhZGRyZXNzIG9mIFNDQklEX0FERFIuICBUaGUgYnl0ZSBpcyByZXR1cm5lZCBpbiBSRVRVUk5fMi4KKyAqLworZmV0Y2hfYnl0ZToKKwltb3YJQVJHXzIsIFNJTkRFWDsKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCW12aQlESU5ERVgsIENDSEFERFI7CisJCW12aQlTQ0JJRF9BRERSIGNhbGwgc2V0XzFieXRlX2FkZHI7CisJCW12aQlDQ0hDTlQsIDE7CisJCW12aQlDQ1NHQ1RMLCBDQ1NHRU58Q0NTR1JFU0VUOworCQl0ZXN0CUNDU0dDVEwsIENDU0dET05FIGp6IC47CisJCW12aQlDQ1NHQ1RMLCBDQ1NHUkVTRVQ7CisJCWJtb3YJUkVUVVJOXzIsIENDU0dSQU0sIDEgcmV0OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0NCSURfQUREUiBjYWxsIHNldF8xYnl0ZV9hZGRyOworCQltdmkJSENOVFswXSwgMTsKKwkJY2xyCUhDTlRbMV07CisJCWNscglIQ05UWzJdOworCQltdmkJREZDTlRSTCwgSERNQUVOfERJUkVDVElPTnxGSUZPUkVTRVQ7CisJCWNhbGwJZG1hX2ZpbmlzaDsKKwkJbW92CVJFVFVSTl8yLCBERkRBVCByZXQ7CisJfQorCisvKgorICogUHJlcGFyZSB0aGUgaGFyZHdhcmUgdG8gcG9zdCBhIGJ5dGUgdG8gaG9zdCBtZW1vcnkgZ2l2ZW4gYW4KKyAqIGluZGV4IG9mIChBICsgKDI1NiAqIFNJTkRFWCkpIGFuZCBhIGJhc2UgYWRkcmVzcyBvZiBTQ0JJRF9BRERSLgorICovCitwb3N0X2J5dGVfc2V0dXA6CisJbW92CUFSR18yLCBTSU5ERVg7CisJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCkgeworCQltdmkJRElOREVYLCBDQ0hBRERSOworCQltdmkJU0NCSURfQUREUiBjYWxsCXNldF8xYnl0ZV9hZGRyOworCQltdmkJQ0NIQ05ULCAxOworCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQgcmV0OworCX0gZWxzZSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJU0NCSURfQUREUiBjYWxsCXNldF8xYnl0ZV9hZGRyOworCQltdmkJSENOVFswXSwgMTsKKwkJY2xyCUhDTlRbMV07CisJCWNscglIQ05UWzJdOworCQltdmkJREZDTlRSTCwgRklGT1JFU0VUIHJldDsKKwl9CisKK3Bvc3RfYnl0ZToKKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSAhPSAwKSB7CisJCWJtb3YJQ0NTQ0JSQU0sIFNJTkRFWCwgMTsKKwkJb3IJQ0NTQ0JDVEwsIENDU0NCRU58Q0NTQ0JSRVNFVDsKKwkJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JET05FIGp6IC47CisJCWNscglDQ1NDQkNUTCByZXQ7CisJfSBlbHNlIHsKKwkJbW92CURGREFULCBTSU5ERVg7CisJCW9yCURGQ05UUkwsIEhETUFFTnxGSUZPRkxVU0g7CisJCWptcAlkbWFfZmluaXNoOworCX0KKworZ2V0X1NDQklEX2Zyb21faG9zdDoKKwltb3YJQSwgU0FWRURfVENMOworCW12aQlVTlRBR0dFRFNDQl9PRkZTRVQgY2FsbCBmZXRjaF9ieXRlOworCW1vdglSRVRVUk5fMSwgIFJFVFVSTl8yIHJldDsKKworcGhhc2VfbG9jazogICAgIAorCXRlc3QJU1NUQVQxLCBSRVFJTklUIGp6IHBoYXNlX2xvY2s7CisJdGVzdAlTU1RBVDEsIFNDU0lQRVJSIGpueiBwaGFzZV9sb2NrOworCWFuZAlTQ1NJU0lHTywgUEhBU0VfTUFTSywgU0NTSVNJR0k7CisJYW5kCUxBU1RQSEFTRSwgUEhBU0VfTUFTSywgU0NTSVNJR0kgcmV0OworCitpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKSB7CitzZXRfc3RjbnRfZnJvbV9oY250OgorCW1vdglTVENOVFswXSwgSENOVFswXTsKKwltb3YJU1RDTlRbMV0sIEhDTlRbMV07CisJbW92CVNUQ05UWzJdLCBIQ05UWzJdIHJldDsKKworYmNvcHlfNzoKKwltb3YJRElORElSLCBTSU5ESVI7CisJbW92CURJTkRJUiwgU0lORElSOworYmNvcHlfNToKKwltb3YJRElORElSLCBTSU5ESVI7CitiY29weV80OgorCW1vdglESU5ESVIsIFNJTkRJUjsKK2Jjb3B5XzM6CisJbW92CURJTkRJUiwgU0lORElSOworCW1vdglESU5ESVIsIFNJTkRJUjsKKwltb3YJRElORElSLCBTSU5ESVIgcmV0OworfQorCisvKgorICogU2V0dXAgYWRkciBhc3N1bWluZyB0aGF0IEEgaXMgYW4gaW5kZXggaW50bworICogYW4gYXJyYXkgb2YgMzJieXRlIG9iamVjdHMsIFNJTkRFWCBjb250YWlucworICogdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGF0IGFycmF5LCBhbmQgRElOREVYCisgKiBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgorICogdG8gc3RvcmUgdGhlIGluZGV4ZWQgYWRkcmVzcy4KKyAqLworc2V0XzMyYnl0ZV9hZGRyOgorCXNocglBUkdfMiwgMywgQTsKKwlzaGwJQSwgNTsKKy8qCisgKiBTZXR1cCBhZGRyIGFzc3VtaW5nIHRoYXQgQSArIChBUkdfMSAqIDI1NikgaXMgYW4KKyAqIGluZGV4IGludG8gYW4gYXJyYXkgb2YgMWJ5dGUgb2JqZWN0cywgU0lOREVYIGNvbnRhaW5zCisgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoYXQgYXJyYXksIGFuZCBESU5ERVggY29udGFpbnMKKyAqIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21wdXRlZAorICogYWRkcmVzcy4KKyAqLworc2V0XzFieXRlX2FkZHI6CisJYWRkCURJTkRJUiwgQSwgU0lORElSOworCW1vdglBLCBBUkdfMjsKKwlhZGMJRElORElSLCBBLCBTSU5ESVI7CisJY2xyCUE7CisJYWRjCURJTkRJUiwgQSwgU0lORElSOworCWFkYwlESU5ESVIsIEEsIFNJTkRJUiByZXQ7CisKKy8qCisgKiBFaXRoZXIgcG9zdCBvciBmZXRjaCBhbmQgU0NCIGZyb20gaG9zdCBtZW1vcnkgYmFzZWQgb24gdGhlCisgKiBESVJFQ1RJT04gYml0IGluIERNQVBBUkFNUy4gVGhlIGhvc3QgU0NCIGluZGV4IGlzIGluIFNJTkRFWC4KKyAqLworZG1hX3NjYjoKKwltb3YJQSwgU0lOREVYOworCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pICE9IDApIHsKKwkJbXZpCURJTkRFWCwgQ0NIQUREUjsKKwkJbXZpCUhTQ0JfQUREUiBjYWxsIHNldF8zMmJ5dGVfYWRkcjsKKwkJbW92CUNDU0NCUFRSLCBTQ0JQVFI7CisJCW12aQlDQ0hDTlQsIDMyOworCQl0ZXN0CURNQVBBUkFNUywgRElSRUNUSU9OIGp6IGRtYV9zY2JfdG9ob3N0OworCQltdmkJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JFTnxDQ1NDQkRJUnxDQ1NDQlJFU0VUOworCQljbXAJQ0NTQ0JDVEwsIENDU0NCRE9ORXxBUlJET05FfENDQVJSRU58Q0NTQ0JFTnxDQ1NDQkRJUiBqbmUgLjsKKwkJam1wCWRtYV9zY2JfZmluaXNoOworZG1hX3NjYl90b2hvc3Q6CisJCWlmICgocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKSA9PSAwKSB7CisJCQltdmkJQ0NTQ0JDVEwsIENDU0NCUkVTRVQ7CisJCQlibW92CUNDU0NCUkFNLCBTQ0JfQ09OVFJPTCwgMzI7CisJCQlvcglDQ1NDQkNUTCwgQ0NTQ0JFTnxDQ1NDQlJFU0VUOworCQkJdGVzdAlDQ1NDQkNUTCwgQ0NTQ0JET05FIGp6IC47CisJCX0KKwkJaWYgKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpICE9IDApIHsKKwkJCWlmICgocC0+YnVncyAmIEFIQ19CVUdfU0NCQ0hBTl9VUExPQUQpICE9IDApIHsKKwkJCQltdmkgICAgIENDU0NCQ1RMLCBDQ0FSUkVOfENDU0NCUkVTRVQ7CisJCQkJY21wICAgICBDQ1NDQkNUTCwgQVJSRE9ORXxDQ0FSUkVOIGpuZSAuOworICAgICAgICAgICAgICAgICAgICAgICAgCW12aSAgICAgQ0NIQ05ULCAzMjsKKwkJCQltdmkgICAgIENDU0NCQ1RMLCBDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQkJY21wICAgICBDQ1NDQkNUTCwgQ0NTQ0JET05FfENDU0NCRU4gam5lIC47CisJCQl9IGVsc2UgeworCQkJCW12aQlDQ1NDQkNUTCwgQ0NBUlJFTnxDQ1NDQkVOfENDU0NCUkVTRVQ7CisJCQkJY21wCUNDU0NCQ1RMLCBDQ1NDQkRPTkV8QVJSRE9ORXxDQ0FSUkVOfENDU0NCRU4gam5lIC47CisJCQl9CisJCX0KK2RtYV9zY2JfZmluaXNoOgorCQljbHIJQ0NTQ0JDVEw7CisJCXRlc3QJQ0NTQ0JDVEwsIENDQVJSRU58Q0NTQ0JFTiBqbnogLjsKKwkJcmV0OworCX0KKwlpZiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKSB7CisJCW12aQlESU5ERVgsIEhBRERSOworCQltdmkJSFNDQl9BRERSIGNhbGwgc2V0XzMyYnl0ZV9hZGRyOworCQltdmkJSENOVFswXSwgMzI7CisJCWNscglIQ05UWzFdOworCQljbHIJSENOVFsyXTsKKwkJbW92CURGQ05UUkwsIERNQVBBUkFNUzsKKwkJdGVzdAlETUFQQVJBTVMsIERJUkVDVElPTglqbnogZG1hX3NjYl9mcm9taG9zdDsKKwkJLyogRmlsbCBpdCB3aXRoIHRoZSBTQ0IgZGF0YSAqLworY29weV9zY2JfdG9maWZvOgorCQltdmkJU0lOREVYLCBTQ0JfQ09OVFJPTDsKKwkJYWRkCUEsIDMyLCBTSU5ERVg7Citjb3B5X3NjYl90b2ZpZm9fbG9vcDoKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJbW92CURGREFULFNJTkRJUjsKKwkJY21wCVNJTkRFWCwgQSBqbmUgY29weV9zY2JfdG9maWZvX2xvb3A7CisJCW9yCURGQ05UUkwsIEhETUFFTnxGSUZPRkxVU0g7CisJCWptcAlkbWFfZmluaXNoOworZG1hX3NjYl9mcm9taG9zdDoKKwkJbXZpCURJTkRFWCwgU0NCX0NPTlRST0w7CisJCWlmICgocC0+YnVncyAmIEFIQ19CVUdfUENJXzJfMV9SRVRSWSkgIT0gMCkgeworCQkJLyoKKwkJCSAqIFNldCB0aGUgQSB0byAtMjQuICBJdCBpdCBoaXRzIDAsIHRoZW4gd2UgbGV0CisJCQkgKiBvdXIgY29kZSBmYWxsIHRocm91Z2ggdG8gZGZkYXRfaW5fOCB0byBjb21wbGV0ZQorCQkJICogdGhlIGxhc3Qgb2YgdGhlIGNvcHkuCisJCQkgKgorCQkJICogQWxzbywgdGhpbmdzIGhhcHBlbiA4IGJ5dGVzIGF0IGEgdGltZSBpbiB0aGlzCisJCQkgKiBjYXNlLCBzbyB3ZSBtYXkgbmVlZCB0byBkcmFpbiB0aGUgZmlmbyBhdCBtb3N0CisJCQkgKiAzIHRpbWVzIHRvIGtlZXAgdGhpbmdzIGZsb3dpbmcKKwkJCSAqLworCQkJbXZpCUEsIC0yNDsKK2RtYV9zY2JfaGFuZ19maWZvOgorCQkJLyogV2FpdCBmb3IgdGhlIGZpcnN0IGJpdCBvZiBkYXRhIHRvIGhpdCB0aGUgZmlmbyAqLworCQkJdGVzdAlERlNUQVRVUywgRklGT0VNUCBqbnogLjsKK2RtYV9zY2JfaGFuZ193YWl0OgorCQkJLyogT0ssIG5vdyB0aGV5J3ZlIHN0YXJ0ZWQgdG8gdHJhbnNmZXIgaW50byB0aGUgZmlmbywKKwkJCSAqIHNvIHdhaXQgZm9yIHRoZW0gdG8gc3RvcCB0cnlpbmcgdG8gdHJhbnNmZXIgYW55CisJCQkgKiBtb3JlIGRhdGEuCisJCQkgKi8KKwkJCXRlc3QJREZTVEFUVVMsIE1SRVFQRU5EIGpueiAuOworCQkJLyoKKwkJCSAqIE9LLCB0aGV5IHN0YXJ0ZWQsIHRoZW4gdGhleSBzdG9wcGVkLCBub3cgc2VlIGlmIHRoZXkKKwkJCSAqIG1hbmFnZWQgdG8gY29tcGxldGUgdGhlIGpvYiBiZWZvcmUgc3RvcHBpbmcuICBUcnkKKwkJCSAqIGl0IG11bHRpcGxlIHRpbWVzIHRvIGdpdmUgdGhlIGNoaXAgYSBmZXcgY3ljbGVzIHRvCisJCQkgKiBzZXQgdGhlIGZsYWcgaWYgaXQgZGlkIGNvbXBsZXRlLgorCQkJICovCisJCQl0ZXN0CURGU1RBVFVTLCBIRE9ORSBqbnogZG1hX3NjYl9oYW5nX2RtYV9kb25lOworCQkJdGVzdAlERlNUQVRVUywgSERPTkUgam56IGRtYV9zY2JfaGFuZ19kbWFfZG9uZTsKKwkJCXRlc3QJREZTVEFUVVMsIEhET05FIGpueiBkbWFfc2NiX2hhbmdfZG1hX2RvbmU7CisJCQkvKgorCQkJICogVG9vIGJhZCwgdGhlIGNoaXAgZGlkbid0IGNvbXBsZXRlIHRoZSBETUEsIGJ1dCB0aGVyZQorCQkJICogYXJlbid0IGFueSBtb3JlIG1lbW9yeSByZXF1ZXN0cyBwZW5kaW5nLCBzbyB0aGF0CisJCQkgKiBtZWFucyBpdCBzdG9wcGVkIHBhcnQgd2F5IHRocm91Z2ggYW5kIGh1bmcuICBUaGF0J3MKKwkJCSAqIG91ciBidWcsIHNvIG5vdyB3ZSBkcmFpbiB3aGF0IGRhdGEgdGhlcmUgaXMgaW4gdGhlCisJCQkgKiBmaWZvIGluIG9yZGVyIHRvIGdldCB0aGluZ3MgZ29pbmcgYWdhaW4uCisJCQkgKi8KK2RtYV9zY2JfaGFuZ19lbXB0eV9maWZvOgorCQkJY2FsbAlkZmRhdF9pbl84OworCQkJYWRkCUEsIDg7CisJCQlhZGQJU0lOREVYLCBBLCBIQ05UOworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBhbm90aGVyIDggYnl0ZXMgb2YgZGF0YSB3YWl0aW5nIGluIHRoZQorCQkJICogZmlmbywgdGhlbiB0aGUgY2FycnkgYml0IHdpbGwgYmUgc2V0IGFzIGEgcmVzdWx0CisJCQkgKiBvZiB0aGUgYWJvdmUgYWRkIGNvbW1hbmQgKHVubGVzcyBBIGlzIG5vbi1uZWdhdGl2ZSwKKwkJCSAqIGluIHdoaWNoIGNhc2UgdGhlIGNhcnJ5IGJpdCB3b24ndCBiZSBzZXQpLgorCQkJICovCisJCQlqYwlkbWFfc2NiX2hhbmdfZW1wdHlfZmlmbzsKKwkJCS8qCisJCQkgKiBXZSd2ZSBlbXB0aWVkIHRoZSBmaWZvIG5vdywgYnV0IHdlIHdvdWxkbid0IGhhdmUgZ290CisJCQkgKiBoZXJlIGlmIHRoZSBtZW1vcnkgdHJhbnNmZXIgaGFkbid0IHN0b3BwZWQgcGFydCB3YXkKKwkJCSAqIHRocm91Z2gsIHNvIGdvIGJhY2sgdXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkJCSAqIGxvb3AgYW5kIHN0YXJ0IG92ZXIuICBXaGVuIGl0IHN1Y2NlZWRzIGluIGdldHRpbmcKKwkJCSAqIGFsbCB0aGUgZGF0YSBkb3duLCBIRE9ORSB3aWxsIGJlIHNldCBhbmQgd2UnbGwKKwkJCSAqIGp1bXAgdG8gdGhlIGNvZGUganVzdCBiZWxvdyBoZXJlLgorCQkJICovCisJCQlqbXAJZG1hX3NjYl9oYW5nX2ZpZm87CitkbWFfc2NiX2hhbmdfZG1hX2RvbmU6CisJCQlhbmQJREZDTlRSTCwgfkhETUFFTjsKKwkJCXRlc3QJREZDTlRSTCwgSERNQUVOIGpueiAuOworCQkJY2FsbAlkZmRhdF9pbl84OworCQkJYWRkCUEsIDg7CisJCQljbXAJQSwgOCBqbmUgLiAtIDI7CisJCQlyZXQ7CisJCX0gZWxzZSB7CisJCQljYWxsCWRtYV9maW5pc2g7CisJCQljYWxsCWRmZGF0X2luXzg7CisJCQljYWxsCWRmZGF0X2luXzg7CisJCQljYWxsCWRmZGF0X2luXzg7CisJCX0KK2RmZGF0X2luXzg6CisJCW1vdglESU5ESVIsREZEQVQ7CitkZmRhdF9pbl83OgorCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUOworCQltb3YJRElORElSLERGREFUIHJldDsKKwl9CisKKworLyoKKyAqIFdhaXQgZm9yIERNQSBmcm9tIGhvc3QgbWVtb3J5IHRvIGRhdGEgRklGTyB0byBjb21wbGV0ZSwgdGhlbiBkaXNhYmxlCisgKiBETUEgYW5kIHdhaXQgZm9yIGl0IHRvIGFja25vd2xlZGdlIHRoYXQgaXQncyBvZmYuCisgKi8KK2lmICgocC0+ZmVhdHVyZXMgJiBBSENfQ01EX0NIQU4pID09IDApIHsKK2RtYV9maW5pc2g6CisJdGVzdAlERlNUQVRVUyxIRE9ORQlqeiBkbWFfZmluaXNoOworCS8qIFR1cm4gb2ZmIERNQSAqLworCWFuZAlERkNOVFJMLCB+SERNQUVOOworCXRlc3QJREZDTlRSTCwgSERNQUVOIGpueiAuOworCXJldDsKK30KKworYWRkX3NjYl90b19mcmVlX2xpc3Q6CisJaWYgKChwLT5mbGFncyAmIEFIQ19QQUdFU0NCUykgIT0gMCkgeworCQltb3YJU0NCX05FWFQsIEZSRUVfU0NCSDsKKwkJbW92CUZSRUVfU0NCSCwgU0NCUFRSOworCX0KKwltdmkJU0NCX1RBRywgU0NCX0xJU1RfTlVMTCByZXQ7CisKK2lmICgocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApIHsKK2dldF9mcmVlX29yX2Rpc2Nfc2NiOgorCWNtcAlGUkVFX1NDQkgsIFNDQl9MSVNUX05VTEwgam5lIGRlcXVldWVfZnJlZV9zY2I7CisJY21wCURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTElTVF9OVUxMIGpuZSBkZXF1ZXVlX2Rpc2Nfc2NiOworcmV0dXJuX2Vycm9yOgorCW12aQlTSU5ERVgsIFNDQl9MSVNUX05VTEwJcmV0OworZGVxdWV1ZV9kaXNjX3NjYjoKKwltb3YJU0NCUFRSLCBESVNDT05ORUNURURfU0NCSDsKK2RtYV91cF9zY2I6CisJbXZpCURNQVBBUkFNUywgRklGT1JFU0VUOworCW1vdglTQ0JfVEFHCQljYWxsIGRtYV9zY2I7Cit1bmxpbmtfZGlzY19zY2I6CisJbW92CURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JfTkVYVCByZXQ7CitkZXF1ZXVlX2ZyZWVfc2NiOgorCW1vdglTQ0JQVFIsIEZSRUVfU0NCSDsKKwltb3YJRlJFRV9TQ0JILCBTQ0JfTkVYVCByZXQ7Cit9CisKK2FkZF9zY2JfdG9fZGlzY19saXN0OgorLyoKKyAqIExpbmsgdGhpcyBTQ0IgaW50byB0aGUgRElTQ09OTkVDVEVEIGxpc3QuICBUaGlzIGxpc3QgaG9sZHMgdGhlCisgKiBjYW5kaWRhdGVzIGZvciBwYWdpbmcgb3V0IGFuIFNDQiBpZiBvbmUgaXMgbmVlZGVkIGZvciBhIG5ldyBjb21tYW5kLgorICogTW9kaWZ5aW5nIHRoZSBkaXNjb25uZWN0ZWQgbGlzdCBpcyBhIGNyaXRpY2FsKHBhdXNlIGRpc3NhYmxlZCkgc2VjdGlvbi4KKyAqLworCW1vdglTQ0JfTkVYVCwgRElTQ09OTkVDVEVEX1NDQkg7CisJbW92CURJU0NPTk5FQ1RFRF9TQ0JILCBTQ0JQVFIgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjMzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eF9wcm9jLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qK00qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGFwdGVjIEFJQzd4eHggZGV2aWNlIGRyaXZlciBwcm9jIHN1cHBvcnQgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBEZWFuIFcuIEdlaG5lcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBvIE1vZGlmaWVkIGZyb20gdGhlIEVBVEEtRE1BIC9wcm9jIHN1cHBvcnQuCisgKiAgbyBBZGRpdGlvbmFsIHN1cHBvcnQgZm9yIGRldmljZSBibG9jayBzdGF0aXN0aWNzIHByb3ZpZGVkIGJ5CisgKiAgICBNYXR0aGV3IEphY29iLgorICogIG8gQ29ycmVjdGlvbiBvZiBvdmVyZmxvdyBieSBIZWlueiBNYXVlbHNoYWdlbgorICogIG8gQWRpdHRpb25hbCBjb3JyZWN0aW9ucyBieSBEb3VnIExlZGZvcmQKKyAqCisgKiAgRGVhbiBXLiBHZWhuZXJ0LCBkZWFuZ0B0ZWxlcG9ydC5jb20sIDA1LzAxLzk2CisgKgorICogICRJZDogYWljN3h4eF9wcm9jLmMsdiA0LjEgMTk5Ny8wNi85NyAwODoyMzo0MiBkZWFuZyBFeHAgJAorICotTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZQlCTFMJKCZhaWM3eHh4X2J1ZmZlcltzaXplXSkKKyNkZWZpbmUgSERSQiBcCisiICAgICAgICAgICAgICAgMCAtIDRLICAgNCAtIDE2SyAgIDE2IC0gNjRLICA2NCAtIDI1NksgIDI1NksgLSAxTSAgICAgICAgMU0rIgorCisjaWZkZWYgUFJPQ19ERUJVRworZXh0ZXJuIGludCB2c3ByaW50ZihjaGFyICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKK3N0YXRpYyB2b2lkCitwcm9jX2RlYnVnKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICBjaGFyIGJ1ZlsyNTZdOworCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICB2c3ByaW50ZihidWYsIGZtdCwgYXApOworICBwcmludGsoYnVmKTsKKyAgdmFfZW5kKGFwKTsKK30KKyNlbHNlIC8qIFBST0NfREVCVUcgKi8KKyMgIGRlZmluZSBwcm9jX2RlYnVnKGZtdCwgYXJncy4uLikKKyNlbmRpZiAvKiBQUk9DX0RFQlVHICovCisKK3N0YXRpYyBpbnQgYWljN3h4eF9idWZmZXJfc2l6ZSA9IDA7CitzdGF0aWMgY2hhciAqYWljN3h4eF9idWZmZXIgPSBOVUxMOworCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9zZXRfaW5mbworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXQgcGFyYW1ldGVycyBmb3IgdGhlIGRyaXZlciBmcm9tIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CithaWM3eHh4X3NldF9pbmZvKGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwgc3RydWN0IFNjc2lfSG9zdCAqSEJBcHRyKQoreworICBwcm9jX2RlYnVnKCJhaWM3eHh4X3NldF9pbmZvKCk6ICVzXG4iLCBidWZmZXIpOworICByZXR1cm4gKC1FTk9TWVMpOyAgLyogQ3VycmVudGx5IHRoaXMgaXMgYSBuby1vcCAqLworfQorCisKKy8qK0YqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjoKKyAqICAgYWljN3h4eF9wcm9jX2luZm8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUmV0dXJuIGluZm9ybWF0aW9uIHRvIGhhbmRsZSAvcHJvYyBzdXBwb3J0IGZvciB0aGUgZHJpdmVyLgorICotRioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2FpYzd4eHhfcHJvY19pbmZvICggc3RydWN0IFNjc2lfSG9zdCAqSEJBcHRyLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgaW50IGlub3V0KQoreworICBzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwOworICBzdHJ1Y3QgYWljX2Rldl9kYXRhICphaWNfZGV2OworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcHRyOworICBpbnQgICAgc2l6ZSA9IDA7CisgIHVuc2lnbmVkIGNoYXIgaTsKKyAgdW5zaWduZWQgY2hhciB0aW5kZXg7CisKKyAgZm9yKHA9Zmlyc3RfYWljN3h4eDsgcCAmJiBwLT5ob3N0ICE9IEhCQXB0cjsgcD1wLT5uZXh0KQorICAgIDsKKworICBpZiAoIXApCisgIHsKKyAgICBzaXplICs9IHNwcmludGYoYnVmZmVyLCAiQ2FuJ3QgZmluZCBhZGFwdGVyIGZvciBob3N0IG51bWJlciAlZFxuIiwgSEJBcHRyLT5ob3N0X25vKTsKKyAgICBpZiAoc2l6ZSA+IGxlbmd0aCkKKyAgICB7CisgICAgICByZXR1cm4gKHNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIChsZW5ndGgpOworICAgIH0KKyAgfQorCisgIGlmIChpbm91dCA9PSBUUlVFKSAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGU/ICovIAorICB7CisgICAgcmV0dXJuIChhaWM3eHh4X3NldF9pbmZvKGJ1ZmZlciwgbGVuZ3RoLCBIQkFwdHIpKTsKKyAgfQorCisgIHAgPSAoc3RydWN0IGFpYzd4eHhfaG9zdCAqKSBIQkFwdHItPmhvc3RkYXRhOworCisgIC8qCisgICAqIEl0IHRha2VzIHJvdWdobHkgMUsgb2Ygc3BhY2UgdG8gaG9sZCBhbGwgcmVsZXZhbnQgY2FyZCBpbmZvLCBub3QKKyAgICogY291bnRpbmcgYW55IHByb2Mgc3RhdHMsIHNvIHdlIHN0YXJ0IG91dCB3aXRoIGEgMS41ayBidWZmZXIgc2l6ZSBhbmQKKyAgICogaWYgcHJvY19zdGF0cyBpcyBkZWZpbmVkLCB0aGVuIHdlIHN3ZWVwIHRoZSBzdGF0cyBzdHJ1Y3R1cmUgdG8gc2VlCisgICAqIGhvdyBtYW55IGRyaXZlcyB3ZSB3aWxsIGJlIHByaW50aW5nIG91dCBmb3IgYW5kIGFkZCAzODQgYnl0ZXMgcGVyCisgICAqIGRldmljZSB3aXRoIGFjdGl2ZSBzdGF0cy4KKyAgICoKKyAgICogSG1tbW0uLi50aGF0IDEuNWsgc2VlbXMgdG8ga2VlcCBncm93aW5nIGFzIGl0ZW1zIGdldCBhZGRlZCBzbyB0aGV5CisgICAqIGNhbiBiZSBlYXNpbHkgdmlld2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBTbywgd2UgYnVtcGVkIHRoYXQKKyAgICogMS41ayB0byA0ayBzbyB3ZSBjYW4gcXVpdCBoYXZpbmcgdG8gYnVtcCBpdCBhbGwgdGhlIHRpbWUuCisgICAqLworCisgIHNpemUgPSA0MDk2OworICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGFpY19kZXYsICZwLT5haWNfZGV2cywgbGlzdCkKKyAgICBzaXplICs9IDUxMjsKKyAgaWYgKGFpYzd4eHhfYnVmZmVyX3NpemUgIT0gc2l6ZSkKKyAgeworICAgIGlmIChhaWM3eHh4X2J1ZmZlciAhPSBOVUxMKSAKKyAgICB7CisgICAgICBrZnJlZShhaWM3eHh4X2J1ZmZlcik7CisgICAgICBhaWM3eHh4X2J1ZmZlcl9zaXplID0gMDsKKyAgICB9CisgICAgYWljN3h4eF9idWZmZXIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworICB9CisgIGlmIChhaWM3eHh4X2J1ZmZlciA9PSBOVUxMKQorICB7CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyLCAiQUlDN3h4eCAtIGttYWxsb2MgZXJyb3IgYXQgbGluZSAlZFxuIiwKKyAgICAgICAgX19MSU5FX18pOworICAgIHJldHVybiBzaXplOworICB9CisgIGFpYzd4eHhfYnVmZmVyX3NpemUgPSBzaXplOworCisgIHNpemUgPSAwOworICBzaXplICs9IHNwcmludGYoQkxTLCAiQWRhcHRlYyBBSUM3eHh4IGRyaXZlciB2ZXJzaW9uOiAiKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiVzLyIsIEFJQzdYWFhfQ19WRVJTSU9OKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiVzIiwgQUlDN1hYWF9IX1ZFUlNJT04pOworICBzaXplICs9IHNwcmludGYoQkxTLCAiXG4iKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIkFkYXB0ZXIgQ29uZmlndXJhdGlvbjpcbiIpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICBTQ1NJIEFkYXB0ZXI6ICVzXG4iLAorICAgICAgYm9hcmRfbmFtZXNbcC0+Ym9hcmRfbmFtZV9pbmRleF0pOworICBpZiAocC0+ZmxhZ3MgJiBBSENfVFdJTikKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW4gQ2hhbm5lbCBDb250cm9sbGVyICIpOworICBlbHNlCisgIHsKKyAgICBjaGFyICpjaGFubmVsID0gIiI7CisgICAgY2hhciAqdWx0cmEgPSAiIjsKKyAgICBjaGFyICp3aWRlID0gIk5hcnJvdyAiOworICAgIGlmIChwLT5mbGFncyAmIEFIQ19NVUxUSV9DSEFOTkVMKQorICAgIHsKKyAgICAgIGNoYW5uZWwgPSAiIENoYW5uZWwgQSI7CisgICAgICBpZiAocC0+ZmxhZ3MgJiAoQUhDX0NITkxCfEFIQ19DSE5MQykpCisgICAgICAgIGNoYW5uZWwgPSAocC0+ZmxhZ3MgJiBBSENfQ0hOTEIpID8gIiBDaGFubmVsIEIiIDogIiBDaGFubmVsIEMiOworICAgIH0KKyAgICBpZiAocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkKKyAgICAgIHdpZGUgPSAiV2lkZSAiOworICAgIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTMpCisgICAgeworICAgICAgc3dpdGNoKHAtPmNoaXAgJiBBSENfQ0hJUElEX01BU0spCisgICAgICB7CisgICAgICAgIGNhc2UgQUhDX0FJQzc4OTI6CisgICAgICAgIGNhc2UgQUhDX0FJQzc4OTk6CisgICAgICAgICAgdWx0cmEgPSAiVWx0cmEtMTYwL20gTFZEL1NFICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdWx0cmEgPSAiVWx0cmEtMyBMVkQvU0UgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocC0+ZmVhdHVyZXMgJiBBSENfVUxUUkEyKQorICAgICAgdWx0cmEgPSAiVWx0cmEtMiBMVkQvU0UgIjsKKyAgICBlbHNlIGlmIChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkKKyAgICAgIHVsdHJhID0gIlVsdHJhICI7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICVzJXNDb250cm9sbGVyJXMgIiwKKyAgICAgIHVsdHJhLCB3aWRlLCBjaGFubmVsKTsKKyAgfQorICBzd2l0Y2gocC0+Y2hpcCAmIH5BSENfQ0hJUElEX01BU0spCisgIHsKKyAgICBjYXNlIEFIQ19WTDoKKyAgICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICJhdCBWTEIgc2xvdCAlZFxuIiwgcC0+cGNpX2RldmljZV9mbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFIQ19FSVNBOgorICAgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgImF0IEVJU0Egc2xvdCAlZFxuIiwgcC0+cGNpX2RldmljZV9mbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgImF0IFBDSSAlZC8lZC8lZFxuIiwgcC0+cGNpX2J1cywKKyAgICAgICAgUENJX1NMT1QocC0+cGNpX2RldmljZV9mbiksIFBDSV9GVU5DKHAtPnBjaV9kZXZpY2VfZm4pKTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmKCAhKHAtPm1hZGRyKSApCisgIHsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgIFByb2dyYW1tZWQgSS9PIEJhc2U6ICVseFxuIiwgcC0+YmFzZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICBQQ0kgTU1BUGVkIEkvTyBCYXNlOiAweCVseFxuIiwgcC0+bWJhc2UpOworICB9CisgIGlmKCAocC0+Y2hpcCAmIChBSENfVkwgfCBBSENfRUlTQSkpICkKKyAgeworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgQklPUyBNZW1vcnkgQWRkcmVzczogMHglMDh4XG4iLCBwLT5iaW9zX2FkZHJlc3MpOworICB9CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgQWRhcHRlciBTRUVQUk9NIENvbmZpZzogJXNcbiIsCisgICAgICAgICAgKHAtPmZsYWdzICYgQUhDX1NFRVBST01fRk9VTkQpID8gIlNFRVBST00gZm91bmQgYW5kIHVzZWQuIiA6CisgICAgICAgICAoKHAtPmZsYWdzICYgQUhDX1VTRURFRkFVTFRTKSA/ICJTRUVQUk9NIG5vdCBmb3VuZCwgdXNpbmcgZGVmYXVsdHMuIiA6CisgICAgICAgICAgICJTRUVQUk9NIG5vdCBmb3VuZCwgdXNpbmcgbGVmdG92ZXIgQklPUyB2YWx1ZXMuIikgKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgIEFkYXB0ZWMgU0NTSSBCSU9TOiAlc1xuIiwKKyAgICAgICAgICAocC0+ZmxhZ3MgJiBBSENfQklPU19FTkFCTEVEKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgICAgICAgICAgICAgICBJUlE6ICVkXG4iLCBIQkFwdHItPmlycSk7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICAgICAgICAgICAgICAgU0NCczogQWN0aXZlICVkLCBNYXggQWN0aXZlICVkLFxuIiwKKyAgICAgICAgICAgIHAtPmFjdGl2ZXNjYnMsIHAtPm1heF9hY3RpdmVzY2JzKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0ZWQgJWQsIEhXICVkLCAiCisgICAgICAgICAgICAiUGFnZSAlZFxuIiwgcC0+c2NiX2RhdGEtPm51bXNjYnMsIHAtPnNjYl9kYXRhLT5tYXhoc2NicywKKyAgICAgICAgICAgIHAtPnNjYl9kYXRhLT5tYXhzY2JzKTsKKyAgaWYgKHAtPmZsYWdzICYgQUhDX0VYVEVSTkFMX1NSQU0pCisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBFeHRlcm5hbCBTQ0IgU1JBTVxuIik7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICAgICAgICAgSW50ZXJydXB0czogJWxkIiwgcC0+aXNyX2NvdW50KTsKKyAgaWYgKHAtPmNoaXAgJiBBSENfRUlTQSkKKyAgeworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgJXNcbiIsCisgICAgICAgIChwLT5wYXVzZSAmIElSUU1TKSA/ICIoTGV2ZWwgU2Vuc2l0aXZlKSIgOiAiKEVkZ2UgVHJpZ2dlcmVkKSIpOworICB9CisgIGVsc2UKKyAgeworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICJcbiIpOworICB9CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICBCSU9TIENvbnRyb2wgV29yZDogMHglMDR4XG4iLAorICAgICAgICAgICAgcC0+Ymlvc19jb250cm9sKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgIEFkYXB0ZXIgQ29udHJvbCBXb3JkOiAweCUwNHhcbiIsCisgICAgICAgICAgICBwLT5hZGFwdGVyX2NvbnRyb2wpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgRXh0ZW5kZWQgVHJhbnNsYXRpb246ICVzYWJsZWRcbiIsCisgICAgICAocC0+ZmxhZ3MgJiBBSENfRVhURU5EX1RSQU5TX0EpID8gIkVuIiA6ICJEaXMiKTsKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIkRpc2Nvbm5lY3QgRW5hYmxlIEZsYWdzOiAweCUwNHhcbiIsIHAtPmRpc2NlbmFibGUpOworICBpZiAocC0+ZmVhdHVyZXMgJiAoQUhDX1VMVFJBIHwgQUhDX1VMVFJBMikpCisgIHsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICBVbHRyYSBFbmFibGUgRmxhZ3M6IDB4JTA0eFxuIiwgcC0+dWx0cmFlbmIpOworICB9CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICJEZWZhdWx0IFRhZyBRdWV1ZSBEZXB0aDogJWRcbiIsIGFpYzd4eHhfZGVmYXVsdF9xdWV1ZV9kZXB0aCk7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgVGFnZ2VkIFF1ZXVlIEJ5IERldmljZSBhcnJheSBmb3IgYWljN3h4eCBob3N0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlICVkOlxuIiwgcC0+aW5zdGFuY2UpOworICBzaXplICs9IHNwcmludGYoQkxTLCAiICAgICAgeyIpOworICBmb3IoaT0wOyBpIDwgKE1BWF9UQVJHRVRTIC0gMSk7IGkrKykKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiJWQsIixhaWM3eHh4X3RhZ19pbmZvW3AtPmluc3RhbmNlXS50YWdfY29tbWFuZHNbaV0pOworICBzaXplICs9IHNwcmludGYoQkxTLCAiJWR9XG4iLGFpYzd4eHhfdGFnX2luZm9bcC0+aW5zdGFuY2VdLnRhZ19jb21tYW5kc1tpXSk7CisKKyAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisgIHNpemUgKz0gc3ByaW50ZihCTFMsICJTdGF0aXN0aWNzOlxuXG4iKTsKKyAgbGlzdF9mb3JfZWFjaF9lbnRyeShhaWNfZGV2LCAmcC0+YWljX2RldnMsIGxpc3QpCisgIHsKKyAgICBzZHB0ciA9IGFpY19kZXYtPlNEcHRyOworICAgIHRpbmRleCA9IHNkcHRyLT5jaGFubmVsIDw8IDMgfCBzZHB0ci0+aWQ7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIihzY3NpJWQ6JWQ6JWQ6JWQpXG4iLAorICAgICAgICBwLT5ob3N0X25vLCBzZHB0ci0+Y2hhbm5lbCwgc2RwdHItPmlkLCBzZHB0ci0+bHVuKTsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICBEZXZpY2UgdXNpbmcgJXMvJXMiLAorICAgICAgICAgIChhaWNfZGV2LT5jdXIud2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQpID8KKyAgICAgICAgICAiV2lkZSIgOiAiTmFycm93IiwKKyAgICAgICAgICAoYWljX2Rldi0+Y3VyLm9mZnNldCAhPSAwKSA/CisgICAgICAgICAgIlN5bmMgdHJhbnNmZXJzIGF0ICIgOiAiQXN5bmMgdHJhbnNmZXJzLlxuIiApOworICAgIGlmIChhaWNfZGV2LT5jdXIub2Zmc2V0ICE9IDApCisgICAgeworICAgICAgc3RydWN0IGFpYzd4eHhfc3luY3JhdGUgKnN5bmNfcmF0ZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3B0aW9ucyA9IGFpY19kZXYtPmN1ci5vcHRpb25zOworICAgICAgaW50IHBlcmlvZCA9IGFpY19kZXYtPmN1ci5wZXJpb2Q7CisgICAgICBpbnQgcmF0ZSA9IChhaWNfZGV2LT5jdXIud2lkdGggPT0KKyAgICAgICAgICAgICAgICAgIE1TR19FWFRfV0RUUl9CVVNfMTZfQklUKSA/IDEgOiAwOworCisgICAgICBzeW5jX3JhdGUgPSBhaWM3eHh4X2ZpbmRfc3luY3JhdGUocCwgJnBlcmlvZCwgMCwgJm9wdGlvbnMpOworICAgICAgaWYgKHN5bmNfcmF0ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiJXMgTUJ5dGUvc2VjLCBvZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX3JhdGUtPnJhdGVbcmF0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIub2Zmc2V0ICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIzLjMgTUJ5dGUvc2VjLCBvZmZzZXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIub2Zmc2V0ICk7CisgICAgICB9CisgICAgfQorICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIgIFRyYW5zaW5mbyBzZXR0aW5nczogIik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgImN1cnJlbnQoJWQvJWQvJWQvJWQpLCAiLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIucGVyaW9kLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5jdXIud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmN1ci5vcHRpb25zKTsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAiZ29hbCglZC8lZC8lZC8lZCksICIsCisgICAgICAgICAgICAgICAgICAgIGFpY19kZXYtPmdvYWwucGVyaW9kLAorICAgICAgICAgICAgICAgICAgICBhaWNfZGV2LT5nb2FsLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWljX2Rldi0+Z29hbC5vcHRpb25zKTsKKyAgICBzaXplICs9IHNwcmludGYoQkxTLCAidXNlciglZC8lZC8lZC8lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS5wZXJpb2QsCisgICAgICAgICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHAtPnVzZXJbdGluZGV4XS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgcC0+dXNlclt0aW5kZXhdLm9wdGlvbnMpOworICAgIGlmKHNkcHRyLT5zaW1wbGVfdGFncykKKyAgICB7CisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICBUYWdnZWQgQ29tbWFuZCBRdWV1ZWluZyBFbmFibGVkLCBPcmRlcmVkIFRhZ3MgJXMsIERlcHRoICVkLyVkXG4iLCBzZHB0ci0+b3JkZXJlZF90YWdzID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwgc2RwdHItPnF1ZXVlX2RlcHRoLCBhaWNfZGV2LT5tYXhfcV9kZXB0aCk7CisgICAgfQorICAgIGlmKGFpY19kZXYtPmJhcnJpZXJfdG90YWwpCisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICBUb3RhbCB0cmFuc2ZlcnMgJWxkOlxuICAgICglbGQvJWxkLyVsZC8lbGQgcmVhZHMvd3JpdGVzL1JFUV9CQVJSSUVSL09yZGVyZWQgVGFncylcbiIsCisgICAgICAgIGFpY19kZXYtPnJfdG90YWwrYWljX2Rldi0+d190b3RhbCwgYWljX2Rldi0+cl90b3RhbCwgYWljX2Rldi0+d190b3RhbCwKKyAgICAgICAgYWljX2Rldi0+YmFycmllcl90b3RhbCwgYWljX2Rldi0+b3JkZXJlZF90b3RhbCk7CisgICAgZWxzZQorICAgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgVG90YWwgdHJhbnNmZXJzICVsZDpcbiAgICAoJWxkLyVsZCByZWFkcy93cml0ZXMpXG4iLAorICAgICAgICBhaWNfZGV2LT5yX3RvdGFsK2FpY19kZXYtPndfdG90YWwsIGFpY19kZXYtPnJfdG90YWwsIGFpY19kZXYtPndfdG90YWwpOworICAgIHNpemUgKz0gc3ByaW50ZihCTFMsICIlc1xuIiwgSERSQik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgIFJlYWRzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpY19kZXYtPnJfYmlucyk7IGkrKykKKyAgICB7CisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICUxMGxkIiwgYWljX2Rldi0+cl9iaW5zW2ldKTsKKyAgICB9CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgV3JpdGVzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpY19kZXYtPndfYmlucyk7IGkrKykKKyAgICB7CisgICAgICBzaXplICs9IHNwcmludGYoQkxTLCAiICUxMGxkIiwgYWljX2Rldi0+d19iaW5zW2ldKTsKKyAgICB9CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisgICAgc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuXG4iKTsKKyAgfQorICBpZiAoc2l6ZSA+PSBhaWM3eHh4X2J1ZmZlcl9zaXplKQorICB7CisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWljN3h4eDogT3ZlcmZsb3cgaW4gYWljN3h4eF9wcm9jLmNcbiIpOworICB9CisKKyAgaWYgKG9mZnNldCA+IHNpemUgLSAxKQorICB7CisgICAga2ZyZWUoYWljN3h4eF9idWZmZXIpOworICAgIGFpYzd4eHhfYnVmZmVyID0gTlVMTDsKKyAgICBhaWM3eHh4X2J1ZmZlcl9zaXplID0gbGVuZ3RoID0gMDsKKyAgICAqc3RhcnQgPSBOVUxMOworICB9CisgIGVsc2UKKyAgeworICAgICpzdGFydCA9IGJ1ZmZlcjsKKyAgICBsZW5ndGggPSBtaW5fdChpbnQsIGxlbmd0aCwgc2l6ZSAtIG9mZnNldCk7CisgICAgbWVtY3B5KGJ1ZmZlciwgJmFpYzd4eHhfYnVmZmVyW29mZnNldF0sIGxlbmd0aCk7CisgIH0KKworICByZXR1cm4gKGxlbmd0aCk7Cit9CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiAyCisgKiBjLWJyYWNlLWltYWdpbmFyeS1vZmZzZXQ6IDAKKyAqIGMtYnJhY2Utb2Zmc2V0OiAtMgorICogYy1hcmdkZWNsLWluZGVudDogMgorICogYy1sYWJlbC1vZmZzZXQ6IC0yCisgKiBjLWNvbnRpbnVlZC1zdGF0ZW1lbnQtb2Zmc2V0OiAyCisgKiBjLWNvbnRpbnVlZC1icmFjZS1vZmZzZXQ6IDAKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4X3JlZy5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmMjMzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4X3JlZy5oCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICAqIERPIE5PVCBFRElUIC0gVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLgorICAqLworCisjZGVmaW5lCVNDU0lTRVEgICAgICAgICAJCTB4MDAKKyNkZWZpbmUJCVRFTU9ERSAgICAgICAgICAJMHg4MAorI2RlZmluZQkJRU5TRUxPICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNFTEkgICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOUlNFTEkgICAgICAgICAJMHgxMAorI2RlZmluZQkJRU5BVVRPQVROTyAgICAgIAkweDA4CisjZGVmaW5lCQlFTkFVVE9BVE5JICAgICAgCTB4MDQKKyNkZWZpbmUJCUVOQVVUT0FUTlAgICAgICAJMHgwMgorI2RlZmluZQkJU0NTSVJTVE8gICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1hGUkNUTDAgICAgICAgIAkJMHgwMQorI2RlZmluZQkJREZPTiAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlERlBFWFAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUZBU1QyMCAgICAgICAgICAJMHgyMAorI2RlZmluZQkJQ0xSU1RDTlQgICAgICAgIAkweDEwCisjZGVmaW5lCQlTUElPRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNDQU1FTiAgICAgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ0hOICAgICAgICAgIAkweDAyCisKKyNkZWZpbmUJU1hGUkNUTDEgICAgICAgIAkJMHgwMgorI2RlZmluZQkJQklUQlVDS0VUICAgICAgIAkweDgwCisjZGVmaW5lCQlTV1JBUEVOICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUVOU1BDSEsgICAgICAgICAJMHgyMAorI2RlZmluZQkJU1RJTUVTRUwgICAgICAgIAkweDE4CisjZGVmaW5lCQlFTlNUSU1FUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUFDVE5FR0VOICAgICAgICAJMHgwMgorI2RlZmluZQkJU1RQV0VOICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0NTSVNJR08gICAgICAgIAkJMHgwMworI2RlZmluZQkJQ0RPICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlJT08gICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCU1TR08gICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJQVROTyAgICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTRUxPICAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUJTWU8gICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJUkVRTyAgICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlBQ0tPICAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQ1NJU0lHSSAgICAgICAgCQkweDAzCisjZGVmaW5lCQlBVE5JICAgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNFTEkgICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlNZSSAgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlSRVFJICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUFDS0kgICAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lSQVRFICAgICAgICAJCTB4MDQKKyNkZWZpbmUJCVdJREVYRkVSICAgICAgICAJMHg4MAorI2RlZmluZQkJU1hGUl9VTFRSQTIgICAgIAkweDdmCisjZGVmaW5lCQlTWEZSICAgICAgICAgICAgCTB4NzAKKyNkZWZpbmUJCVNPRlMgICAgICAgICAgICAJMHgwZgorCisjZGVmaW5lCVNDU0lJRCAgICAgICAgICAJCTB4MDUKKyNkZWZpbmUJU0NTSU9GRlNFVCAgICAgIAkJMHgwNQorI2RlZmluZQkJU09GU19VTFRSQTIgICAgIAkweDdmCisKKyNkZWZpbmUJU0NTSURBVEwgICAgICAgIAkJMHgwNgorCisjZGVmaW5lCVNDU0lEQVRIICAgICAgICAJCTB4MDcKKworI2RlZmluZQlTVENOVCAgICAgICAgICAgCQkweDA4CisKKyNkZWZpbmUJT1BUSU9OTU9ERSAgICAgIAkJMHgwOAorI2RlZmluZQkJQVVUT1JBVEVFTiAgICAgIAkweDgwCisjZGVmaW5lCQlBVVRPQUNLRU4gICAgICAgCTB4NDAKKyNkZWZpbmUJCUFUTk1HTU5URU4gICAgICAJMHgyMAorI2RlZmluZQkJQlVTRlJFRVJFViAgICAgIAkweDEwCisjZGVmaW5lCQlFWFBQSEFTRURJUyAgICAgCTB4MDgKKyNkZWZpbmUJCVNDU0lEQVRMX0lNR0VOICAJMHgwNAorI2RlZmluZQkJQVVUT19NU0dPVVRfREUgIAkweDAyCisjZGVmaW5lCQlESVNfTVNHSU5fRFVBTEVER0UJMHgwMQorCisjZGVmaW5lCUNMUlNJTlQwICAgICAgICAJCTB4MGIKKyNkZWZpbmUJCUNMUlNFTERPICAgICAgICAJMHg0MAorI2RlZmluZQkJQ0xSU0VMREkgICAgICAgIAkweDIwCisjZGVmaW5lCQlDTFJTRUxJTkdPICAgICAgCTB4MTAKKyNkZWZpbmUJCUNMUlNXUkFQICAgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU1BJT1JEWSAgICAgIAkweDAyCisKKyNkZWZpbmUJU1NUQVQwICAgICAgICAgIAkJMHgwYgorI2RlZmluZQkJVEFSR0VUICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTRUxETyAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFTERJICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU0VMSU5HTyAgICAgICAgIAkweDEwCisjZGVmaW5lCQlJT0VSUiAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNXUkFQICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJU0RPTkUgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlTUElPUkRZICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCURNQURPTkUgICAgICAgICAJMHgwMQorCisjZGVmaW5lCUNMUlNJTlQxICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCUNMUlNFTFRJTUVPICAgICAJMHg4MAorI2RlZmluZQkJQ0xSQVROTyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlDTFJTQ1NJUlNUSSAgICAgCTB4MjAKKyNkZWZpbmUJCUNMUkJVU0ZSRUUgICAgICAJMHgwOAorI2RlZmluZQkJQ0xSU0NTSVBFUlIgICAgIAkweDA0CisjZGVmaW5lCQlDTFJQSEFTRUNIRyAgICAgCTB4MDIKKyNkZWZpbmUJCUNMUlJFUUlOSVQgICAgICAJMHgwMQorCisjZGVmaW5lCVNTVEFUMSAgICAgICAgICAJCTB4MGMKKyNkZWZpbmUJCVNFTFRPICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJQVROVEFSRyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJUlNUSSAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVBIQVNFTUlTICAgICAgICAJMHgxMAorI2RlZmluZQkJQlVTRlJFRSAgICAgICAgIAkweDA4CisjZGVmaW5lCQlTQ1NJUEVSUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVBIQVNFQ0hHICAgICAgICAJMHgwMgorI2RlZmluZQkJUkVRSU5JVCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1NUQVQyICAgICAgICAgIAkJMHgwZAorI2RlZmluZQkJT1ZFUlJVTiAgICAgICAgIAkweDgwCisjZGVmaW5lCQlTSFZBTElEICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVdJREVfUkVTICAgICAgICAJMHgyMAorI2RlZmluZQkJU0ZDTlQgICAgICAgICAgIAkweDFmCisjZGVmaW5lCQlFWFBfQUNUSVZFICAgICAgCTB4MTAKKyNkZWZpbmUJCUNSQ1ZBTEVSUiAgICAgICAJMHgwOAorI2RlZmluZQkJQ1JDRU5ERVJSICAgICAgIAkweDA0CisjZGVmaW5lCQlDUkNSRVFFUlIgICAgICAgCTB4MDIKKyNkZWZpbmUJCURVQUxfRURHRV9FUlJPUiAJMHgwMQorCisjZGVmaW5lCVNTVEFUMyAgICAgICAgICAJCTB4MGUKKyNkZWZpbmUJCVNDU0lDTlQgICAgICAgICAJMHhmMAorI2RlZmluZQkJT0ZGQ05UICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0NTSUlEX1VMVFJBMiAgIAkJMHgwZgorI2RlZmluZQkJT0lEICAgICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJU0lNT0RFMCAgICAgICAgIAkJMHgxMAorI2RlZmluZQkJRU5TRUxETyAgICAgICAgIAkweDQwCisjZGVmaW5lCQlFTlNFTERJICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVOU0VMSU5HTyAgICAgICAJMHgxMAorI2RlZmluZQkJRU5JT0VSUiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFTlNXUkFQICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOU0RPTkUgICAgICAgICAJMHgwNAorI2RlZmluZQkJRU5TUElPUkRZICAgICAgIAkweDAyCisjZGVmaW5lCQlFTkRNQURPTkUgICAgICAgCTB4MDEKKworI2RlZmluZQlTSU1PREUxICAgICAgICAgCQkweDExCisjZGVmaW5lCQlFTlNFTFRJTU8gICAgICAgCTB4ODAKKyNkZWZpbmUJCUVOQVROVEFSRyAgICAgICAJMHg0MAorI2RlZmluZQkJRU5TQ1NJUlNUICAgICAgIAkweDIwCisjZGVmaW5lCQlFTlBIQVNFTUlTICAgICAgCTB4MTAKKyNkZWZpbmUJCUVOQlVTRlJFRSAgICAgICAJMHgwOAorI2RlZmluZQkJRU5TQ1NJUEVSUiAgICAgIAkweDA0CisjZGVmaW5lCQlFTlBIQVNFQ0hHICAgICAgCTB4MDIKKyNkZWZpbmUJCUVOUkVRSU5JVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNDU0lCVVNMICAgICAgICAJCTB4MTIKKworI2RlZmluZQlTQ1NJQlVTSCAgICAgICAgCQkweDEzCisKKyNkZWZpbmUJU0hBRERSICAgICAgICAgIAkJMHgxNAorCisjZGVmaW5lCVNFTFRJTUVSICAgICAgICAJCTB4MTgKKyNkZWZpbmUJCVNUQUdFNiAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU1RBR0U1ICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTVEFHRTQgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNUQUdFMyAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU1RBR0UyICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlTVEFHRTEgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTRUxJRCAgICAgICAgICAgCQkweDE5CisjZGVmaW5lCQlTRUxJRF9NQVNLICAgICAgCTB4ZjAKKyNkZWZpbmUJCU9ORUJJVCAgICAgICAgICAJMHgwOAorCisjZGVmaW5lCVNQSU9DQVAgICAgICAgICAJCTB4MWIKKyNkZWZpbmUJCVNPRlQxICAgICAgICAgICAJMHg4MAorI2RlZmluZQkJU09GVDAgICAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTT0ZUQ01ERU4gICAgICAgCTB4MjAKKyNkZWZpbmUJCUhBU19CUkRDVEwgICAgICAJMHgxMAorI2RlZmluZQkJU0VFUFJPTSAgICAgICAgIAkweDA4CisjZGVmaW5lCQlFRVBST00gICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCVJPTSAgICAgICAgICAgICAJMHgwMgorI2RlZmluZQkJU1NQSU9DUFMgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQlJEQ1RMICAgICAgICAgIAkJMHgxZAorI2RlZmluZQkJQlJEREFUNyAgICAgICAgIAkweDgwCisjZGVmaW5lCQlCUkREQVQ2ICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUJSRERBVDUgICAgICAgICAJMHgyMAorI2RlZmluZQkJQlJEREFUNCAgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUkRTVEIgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUJSRENTICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJQlJEREFUMyAgICAgICAgIAkweDA4CisjZGVmaW5lCQlCUkREQVQyICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUJSRFJXICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJQlJEUldfVUxUUkEyICAgIAkweDAyCisjZGVmaW5lCQlCUkRDVEwxICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUJSRFNUQl9VTFRSQTIgICAJMHgwMQorI2RlZmluZQkJQlJEQ1RMMCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0VFQ1RMICAgICAgICAgIAkJMHgxZQorI2RlZmluZQkJRVhUQVJCQUNLICAgICAgIAkweDgwCisjZGVmaW5lCQlFWFRBUkJSRVEgICAgICAgCTB4NDAKKyNkZWZpbmUJCVNFRU1TICAgICAgICAgICAJMHgyMAorI2RlZmluZQkJU0VFUkRZICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlTRUVDUyAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVNFRUNLICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VFRE8gICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlTRUVESSAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQkxLQ1RMICAgICAgICAgCQkweDFmCisjZGVmaW5lCQlESUFHTEVERU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCURJQUdMRURPTiAgICAgICAJMHg0MAorI2RlZmluZQkJQVVUT0ZMVVNIRElTICAgIAkweDIwCisjZGVmaW5lCQlFTkFCNDAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQUIyMCAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VMV0lERSAgICAgICAgIAkweDAyCisjZGVmaW5lCQlYQ1ZSICAgICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTUkFNX0JBU0UgICAgICAgCQkweDIwCisKKyNkZWZpbmUJVEFSR19TQ1NJUkFURSAgIAkJMHgyMAorCisjZGVmaW5lCVVMVFJBX0VOQiAgICAgICAJCTB4MzAKKworI2RlZmluZQlESVNDX0RTQiAgICAgICAgCQkweDMyCisKKyNkZWZpbmUJTVNHX09VVCAgICAgICAgIAkJMHgzNAorCisjZGVmaW5lCURNQVBBUkFNUyAgICAgICAJCTB4MzUKKyNkZWZpbmUJCVBSRUxPQURFTiAgICAgICAJMHg4MAorI2RlZmluZQkJV0lERU9ERCAgICAgICAgIAkweDQwCisjZGVmaW5lCQlTQ1NJRU4gICAgICAgICAgCTB4MjAKKyNkZWZpbmUJCVNETUFFTkFDSyAgICAgICAJMHgxMAorI2RlZmluZQkJU0RNQUVOICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlIRE1BRU4gICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUhETUFFTkFDSyAgICAgICAJMHgwOAorI2RlZmluZQkJRElSRUNUSU9OICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRkxVU0ggICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9SRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCVNFUV9GTEFHUyAgICAgICAJCTB4MzYKKyNkZWZpbmUJCUlERU5USUZZX1NFRU4gICAJMHg4MAorI2RlZmluZQkJU0NCUFRSX1ZBTElEICAgIAkweDIwCisjZGVmaW5lCQlEUEhBU0UgICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUFNVEFSR0VUICAgICAgICAJMHgwOAorI2RlZmluZQkJV0lERV9CVVMgICAgICAgIAkweDAyCisjZGVmaW5lCQlUV0lOX0JVUyAgICAgICAgCTB4MDEKKworI2RlZmluZQlTQVZFRF9UQ0wgICAgICAgCQkweDM3CisKKyNkZWZpbmUJU0dfQ09VTlQgICAgICAgIAkJMHgzOAorCisjZGVmaW5lCVNHX05FWFQgICAgICAgICAJCTB4MzkKKworI2RlZmluZQlMQVNUUEhBU0UgICAgICAgCQkweDNkCisjZGVmaW5lCQlQX01FU0dJTiAgICAgICAgCTB4ZTAKKyNkZWZpbmUJCVBIQVNFX01BU0sgICAgICAJMHhlMAorI2RlZmluZQkJUF9TVEFUVVMgICAgICAgIAkweGMwCisjZGVmaW5lCQlQX01FU0dPVVQgICAgICAgCTB4YTAKKyNkZWZpbmUJCVBfQ09NTUFORCAgICAgICAJMHg4MAorI2RlZmluZQkJQ0RJICAgICAgICAgICAgIAkweDgwCisjZGVmaW5lCQlJT0kgICAgICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCVBfREFUQUlOICAgICAgICAJMHg0MAorI2RlZmluZQkJTVNHSSAgICAgICAgICAgIAkweDIwCisjZGVmaW5lCQlQX0JVU0ZSRUUgICAgICAgCTB4MDEKKyNkZWZpbmUJCVBfREFUQU9VVCAgICAgICAJMHgwMAorCisjZGVmaW5lCVdBSVRJTkdfU0NCSCAgICAJCTB4M2UKKworI2RlZmluZQlESVNDT05ORUNURURfU0NCSAkJMHgzZgorCisjZGVmaW5lCUZSRUVfU0NCSCAgICAgICAJCTB4NDAKKworI2RlZmluZQlIU0NCX0FERFIgICAgICAgCQkweDQxCisKKyNkZWZpbmUJU0NCSURfQUREUiAgICAgIAkJMHg0NQorCisjZGVmaW5lCVRNT0RFX0NNREFERFIgICAJCTB4NDkKKworI2RlZmluZQlLRVJORUxfUUlOUE9TICAgCQkweDRkCisKKyNkZWZpbmUJUUlOUE9TICAgICAgICAgIAkJMHg0ZQorCisjZGVmaW5lCVFPVVRQT1MgICAgICAgICAJCTB4NGYKKworI2RlZmluZQlUTU9ERV9DTURBRERSX05FWFQJCTB4NTAKKworI2RlZmluZQlBUkdfMSAgICAgICAgICAgCQkweDUxCisjZGVmaW5lCVJFVFVSTl8xICAgICAgICAJCTB4NTEKKyNkZWZpbmUJCVNFTkRfTVNHICAgICAgICAJMHg4MAorI2RlZmluZQkJU0VORF9TRU5TRSAgICAgIAkweDQwCisjZGVmaW5lCQlTRU5EX1JFSiAgICAgICAgCTB4MjAKKyNkZWZpbmUJCU1TR09VVF9QSEFTRU1JUyAJMHgxMAorCisjZGVmaW5lCUFSR18yICAgICAgICAgICAJCTB4NTIKKyNkZWZpbmUJUkVUVVJOXzIgICAgICAgIAkJMHg1MgorCisjZGVmaW5lCUxBU1RfTVNHICAgICAgICAJCTB4NTMKKworI2RlZmluZQlQUkVGRVRDSF9DTlQgICAgCQkweDU0CisKKyNkZWZpbmUJU0NTSUNPTkYgICAgICAgIAkJMHg1YQorI2RlZmluZQkJVEVSTV9FTkIgICAgICAgIAkweDgwCisjZGVmaW5lCQlSRVNFVF9TQ1NJICAgICAgCTB4NDAKKyNkZWZpbmUJCUhXU0NTSUlEICAgICAgICAJMHgwZgorI2RlZmluZQkJSFNDU0lJRCAgICAgICAgIAkweDA3CisKKyNkZWZpbmUJSE9TVENPTkYgICAgICAgIAkJMHg1ZAorCisjZGVmaW5lCUhBXzI3NF9CSU9TQ1RSTCAJCTB4NWYKKyNkZWZpbmUJCUJJT1NNT0RFICAgICAgICAJMHgzMAorI2RlZmluZQkJQklPU0RJU0FCTEVEICAgIAkweDMwCisjZGVmaW5lCQlDSEFOTkVMX0JfUFJJTUFSWQkweDA4CisKKyNkZWZpbmUJU0VRQ1RMICAgICAgICAgIAkJMHg2MAorI2RlZmluZQkJUEVSUk9SRElTICAgICAgIAkweDgwCisjZGVmaW5lCQlQQVVTRURJUyAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUZBSUxESVMgICAgICAgICAJMHgyMAorI2RlZmluZQkJRkFTVE1PREUgICAgICAgIAkweDEwCisjZGVmaW5lCQlCUktBRFJJTlRFTiAgICAgCTB4MDgKKyNkZWZpbmUJCVNURVAgICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJU0VRUkVTRVQgICAgICAgIAkweDAyCisjZGVmaW5lCQlMT0FEUkFNICAgICAgICAgCTB4MDEKKworI2RlZmluZQlTRVFSQU0gICAgICAgICAgCQkweDYxCisKKyNkZWZpbmUJU0VRQUREUjAgICAgICAgIAkJMHg2MgorCisjZGVmaW5lCVNFUUFERFIxICAgICAgICAJCTB4NjMKKyNkZWZpbmUJCVNFUUFERFIxX01BU0sgICAJMHgwMQorCisjZGVmaW5lCUFDQ1VNICAgICAgICAgICAJCTB4NjQKKworI2RlZmluZQlTSU5ERVggICAgICAgICAgCQkweDY1CisKKyNkZWZpbmUJRElOREVYICAgICAgICAgIAkJMHg2NgorCisjZGVmaW5lCUFMTE9ORVMgICAgICAgICAJCTB4NjkKKworI2RlZmluZQlBTExaRVJPUyAgICAgICAgCQkweDZhCisKKyNkZWZpbmUJTk9ORSAgICAgICAgICAgIAkJMHg2YQorCisjZGVmaW5lCUZMQUdTICAgICAgICAgICAJCTB4NmIKKyNkZWZpbmUJCVpFUk8gICAgICAgICAgICAJMHgwMgorI2RlZmluZQkJQ0FSUlkgICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU0lORElSICAgICAgICAgIAkJMHg2YworCisjZGVmaW5lCURJTkRJUiAgICAgICAgICAJCTB4NmQKKworI2RlZmluZQlGVU5DVElPTjEgICAgICAgCQkweDZlCisKKyNkZWZpbmUJU1RBQ0sgICAgICAgICAgIAkJMHg2ZgorCisjZGVmaW5lCVRBUkdfT0ZGU0VUICAgICAJCTB4NzAKKworI2RlZmluZQlCQ1RMICAgICAgICAgICAgCQkweDg0CisjZGVmaW5lCQlBQ0UgICAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCUVOQUJMRSAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCURTQ09NTUFORDAgICAgICAJCTB4ODQKKyNkZWZpbmUJCUlOVFNDQlJBTVNFTCAgICAJMHgwOAorI2RlZmluZQkJUkFNUFMgICAgICAgICAgIAkweDA0CisjZGVmaW5lCQlVU0NCU0laRTMyICAgICAgCTB4MDIKKyNkZWZpbmUJCUNJT1BBUkNLRU4gICAgICAJMHgwMQorCisjZGVmaW5lCURTQ09NTUFORCAgICAgICAJCTB4ODQKKyNkZWZpbmUJCUNBQ0hFVEhFTiAgICAgICAJMHg4MAorI2RlZmluZQkJRFBBUkNLRU4gICAgICAgIAkweDQwCisjZGVmaW5lCQlNUEFSQ0tFTiAgICAgICAgCTB4MjAKKyNkZWZpbmUJCUVYVFJFUUxDSyAgICAgICAJMHgxMAorCisjZGVmaW5lCUJVU1RJTUUgICAgICAgICAJCTB4ODUKKyNkZWZpbmUJCUJPRkYgICAgICAgICAgICAJMHhmMAorI2RlZmluZQkJQk9OICAgICAgICAgICAgIAkweDBmCisKKyNkZWZpbmUJQlVTU1BEICAgICAgICAgIAkJMHg4NgorI2RlZmluZQkJREZUSFJTSCAgICAgICAgIAkweGMwCisjZGVmaW5lCQlTVEJPRkYgICAgICAgICAgCTB4MzgKKyNkZWZpbmUJCVNUQk9OICAgICAgICAgICAJMHgwNworCisjZGVmaW5lCURTUENJU1RBVFVTICAgICAJCTB4ODYKKyNkZWZpbmUJCURGVEhSU0hfMTAwICAgICAJMHhjMAorCisjZGVmaW5lCUhDTlRSTCAgICAgICAgICAJCTB4ODcKKyNkZWZpbmUJCVBPV1JETiAgICAgICAgICAJMHg0MAorI2RlZmluZQkJU1dJTlQgICAgICAgICAgIAkweDEwCisjZGVmaW5lCQlJUlFNUyAgICAgICAgICAgCTB4MDgKKyNkZWZpbmUJCVBBVVNFICAgICAgICAgICAJMHgwNAorI2RlZmluZQkJSU5URU4gICAgICAgICAgIAkweDAyCisjZGVmaW5lCQlDSElQUlNUICAgICAgICAgCTB4MDEKKyNkZWZpbmUJCUNISVBSU1RBQ0sgICAgICAJMHgwMQorCisjZGVmaW5lCUhBRERSICAgICAgICAgICAJCTB4ODgKKworI2RlZmluZQlIQ05UICAgICAgICAgICAgCQkweDhjCisKKyNkZWZpbmUJU0NCUFRSICAgICAgICAgIAkJMHg5MAorCisjZGVmaW5lCUlOVFNUQVQgICAgICAgICAJCTB4OTEKKyNkZWZpbmUJCVNFUUlOVF9NQVNLICAgICAJMHhmMQorI2RlZmluZQkJREFUQV9PVkVSUlVOICAgIAkweGUxCisjZGVmaW5lCQlNU0dJTl9QSEFTRU1JUyAgCTB4ZDEKKyNkZWZpbmUJCVRSQUNFUE9JTlQyICAgICAJMHhjMQorI2RlZmluZQkJU0VRX1NHX0ZJWFVQICAgIAkweGIxCisjZGVmaW5lCQlBV0FJVElOR19NU0cgICAgCTB4YTEKKyNkZWZpbmUJCVJFU0lEVUFMICAgICAgICAJMHg4MQorI2RlZmluZQkJQkFEX1NUQVRVUyAgICAgIAkweDcxCisjZGVmaW5lCQlSRUpFQ1RfTVNHICAgICAgCTB4NjEKKyNkZWZpbmUJCVdJREVfUkVTSURVRSAgICAJMHg1MQorI2RlZmluZQkJRVhURU5ERURfTVNHICAgIAkweDQxCisjZGVmaW5lCQlOT19NQVRDSCAgICAgICAgCTB4MzEKKyNkZWZpbmUJCU5PX0lERU5UICAgICAgICAJMHgyMQorI2RlZmluZQkJU0VORF9SRUpFQ1QgICAgIAkweDExCisjZGVmaW5lCQlJTlRfUEVORCAgICAgICAgCTB4MGYKKyNkZWZpbmUJCUJSS0FEUklOVCAgICAgICAJMHgwOAorI2RlZmluZQkJU0NTSUlOVCAgICAgICAgIAkweDA0CisjZGVmaW5lCQlDTURDTVBMVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUJBRF9QSEFTRSAgICAgICAJMHgwMQorI2RlZmluZQkJU0VRSU5UICAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0xSSU5UICAgICAgICAgIAkJMHg5MgorI2RlZmluZQkJQ0xSUEFSRVJSICAgICAgIAkweDEwCisjZGVmaW5lCQlDTFJCUktBRFJJTlQgICAgCTB4MDgKKyNkZWZpbmUJCUNMUlNDU0lJTlQgICAgICAJMHgwNAorI2RlZmluZQkJQ0xSQ01ESU5UICAgICAgIAkweDAyCisjZGVmaW5lCQlDTFJTRVFJTlQgICAgICAgCTB4MDEKKworI2RlZmluZQlFUlJPUiAgICAgICAgICAgCQkweDkyCisjZGVmaW5lCQlDSU9QQVJFUlIgICAgICAgCTB4ODAKKyNkZWZpbmUJCVBDSUVSUlNUQVQgICAgICAJMHg0MAorI2RlZmluZQkJTVBBUkVSUiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlEUEFSRVJSICAgICAgICAgCTB4MTAKKyNkZWZpbmUJCVNRUEFSRVJSICAgICAgICAJMHgwOAorI2RlZmluZQkJSUxMT1BDT0RFICAgICAgIAkweDA0CisjZGVmaW5lCQlEU0NUTU9VVCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUlMTFNBRERSICAgICAgICAJMHgwMgorI2RlZmluZQkJSUxMSEFERFIgICAgICAgIAkweDAxCisKKyNkZWZpbmUJREZDTlRSTCAgICAgICAgIAkJMHg5MworCisjZGVmaW5lCURGU1RBVFVTICAgICAgICAJCTB4OTQKKyNkZWZpbmUJCVBSRUxPQURfQVZBSUwgICAJMHg4MAorI2RlZmluZQkJRFdPUkRFTVAgICAgICAgIAkweDIwCisjZGVmaW5lCQlNUkVRUEVORCAgICAgICAgCTB4MTAKKyNkZWZpbmUJCUhET05FICAgICAgICAgICAJMHgwOAorI2RlZmluZQkJREZUSFJFU0ggICAgICAgIAkweDA0CisjZGVmaW5lCQlGSUZPRlVMTCAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUZJRk9FTVAgICAgICAgICAJMHgwMQorCisjZGVmaW5lCURGREFUICAgICAgICAgICAJCTB4OTkKKworI2RlZmluZQlTQ0JDTlQgICAgICAgICAgCQkweDlhCisjZGVmaW5lCQlTQ0JBVVRPICAgICAgICAgCTB4ODAKKyNkZWZpbmUJCVNDQkNOVF9NQVNLICAgICAJMHgxZgorCisjZGVmaW5lCVFJTkZJRk8gICAgICAgICAJCTB4OWIKKworI2RlZmluZQlRSU5DTlQgICAgICAgICAgCQkweDljCisKKyNkZWZpbmUJU0NTSURBVExfSU1HICAgIAkJMHg5YworCisjZGVmaW5lCVFPVVRGSUZPICAgICAgICAJCTB4OWQKKworI2RlZmluZQlDUkNDT05UUk9MMSAgICAgCQkweDlkCisjZGVmaW5lCQlDUkNPTlNFRU4gICAgICAgCTB4ODAKKyNkZWZpbmUJCUNSQ1ZBTENIS0VOICAgICAJMHg0MAorI2RlZmluZQkJQ1JDRU5EQ0hLRU4gICAgIAkweDIwCisjZGVmaW5lCQlDUkNSRVFDSEtFTiAgICAgCTB4MTAKKyNkZWZpbmUJCVRBUkdDUkNFTkRFTiAgICAJMHgwOAorI2RlZmluZQkJVEFSR0NSQ0NOVEVOICAgIAkweDA0CisKKyNkZWZpbmUJU0NTSVBIQVNFICAgICAgIAkJMHg5ZQorI2RlZmluZQkJU1BfU1RBVFVTICAgICAgIAkweDIwCisjZGVmaW5lCQlTUF9DT01NQU5EICAgICAgCTB4MTAKKyNkZWZpbmUJCVNQX01TR19JTiAgICAgICAJMHgwOAorI2RlZmluZQkJU1BfTVNHX09VVCAgICAgIAkweDA0CisjZGVmaW5lCQlTUF9EQVRBX0lOICAgICAgCTB4MDIKKyNkZWZpbmUJCVNQX0RBVEFfT1VUICAgICAJMHgwMQorCisjZGVmaW5lCVFPVVRDTlQgICAgICAgICAJCTB4OWUKKworI2RlZmluZQlTRlVOQ1QgICAgICAgICAgCQkweDlmCisjZGVmaW5lCQlBTFRfTU9ERSAgICAgICAgCTB4ODAKKworI2RlZmluZQlTQ0JfQ09OVFJPTCAgICAgCQkweGEwCisjZGVmaW5lCQlNS19NRVNTQUdFICAgICAgCTB4ODAKKyNkZWZpbmUJCURJU0NFTkIgICAgICAgICAJMHg0MAorI2RlZmluZQkJVEFHX0VOQiAgICAgICAgIAkweDIwCisjZGVmaW5lCQlESVNDT05ORUNURUQgICAgCTB4MDQKKyNkZWZpbmUJCVNDQl9UQUdfVFlQRSAgICAJMHgwMworCisjZGVmaW5lCVNDQl9CQVNFICAgICAgICAJCTB4YTAKKworI2RlZmluZQlTQ0JfVENMICAgICAgICAgCQkweGExCisjZGVmaW5lCQlUSUQgICAgICAgICAgICAgCTB4ZjAKKyNkZWZpbmUJCVNFTEJVU0IgICAgICAgICAJMHgwOAorI2RlZmluZQkJTElEICAgICAgICAgICAgIAkweDA3CisKKyNkZWZpbmUJU0NCX1RBUkdFVF9TVEFUVVMJCTB4YTIKKworI2RlZmluZQlTQ0JfU0dDT1VOVCAgICAgCQkweGEzCisKKyNkZWZpbmUJU0NCX1NHUFRSICAgICAgIAkJMHhhNAorCisjZGVmaW5lCVNDQl9SRVNJRF9TR0NOVCAJCTB4YTgKKworI2RlZmluZQlTQ0JfUkVTSURfRENOVCAgCQkweGE5CisKKyNkZWZpbmUJU0NCX0RBVEFQVFIgICAgIAkJMHhhYworCisjZGVmaW5lCVNDQl9EQVRBQ05UICAgICAJCTB4YjAKKworI2RlZmluZQlTQ0JfQ01EUFRSICAgICAgCQkweGI0CisKKyNkZWZpbmUJU0NCX0NNRExFTiAgICAgIAkJMHhiOAorCisjZGVmaW5lCVNDQl9UQUcgICAgICAgICAJCTB4YjkKKworI2RlZmluZQlTQ0JfTkVYVCAgICAgICAgCQkweGJhCisKKyNkZWZpbmUJU0NCX1BSRVYgICAgICAgIAkJMHhiYgorCisjZGVmaW5lCVNDQl9CVVNZVEFSR0VUUyAJCTB4YmMKKworI2RlZmluZQlTRUVDVExfMjg0MCAgICAgCQkweGMwCisjZGVmaW5lCQlDU18yODQwICAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNLXzI4NDAgICAgICAgICAJMHgwMgorI2RlZmluZQkJRE9fMjg0MCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJU1RBVFVTXzI4NDAgICAgIAkJMHhjMQorI2RlZmluZQkJRUVQUk9NX1RGICAgICAgIAkweDgwCisjZGVmaW5lCQlCSU9TX1NFTCAgICAgICAgCTB4NjAKKyNkZWZpbmUJCUFEU0VMICAgICAgICAgICAJMHgxZQorI2RlZmluZQkJRElfMjg0MCAgICAgICAgIAkweDAxCisKKyNkZWZpbmUJQ0NIQUREUiAgICAgICAgIAkJMHhlMAorCisjZGVmaW5lCUNDSENOVCAgICAgICAgICAJCTB4ZTgKKworI2RlZmluZQlDQ1NHUkFNICAgICAgICAgCQkweGU5CisKKyNkZWZpbmUJQ0NTR0FERFIgICAgICAgIAkJMHhlYQorCisjZGVmaW5lCUNDU0dDVEwgICAgICAgICAJCTB4ZWIKKyNkZWZpbmUJCUNDU0dET05FICAgICAgICAJMHg4MAorI2RlZmluZQkJQ0NTR0VOICAgICAgICAgIAkweDA4CisjZGVmaW5lCQlGTEFHICAgICAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUNDU0dSRVNFVCAgICAgICAJMHgwMQorCisjZGVmaW5lCUNDU0NCUkFNICAgICAgICAJCTB4ZWMKKworI2RlZmluZQlDQ1NDQkFERFIgICAgICAgCQkweGVkCisKKyNkZWZpbmUJQ0NTQ0JDVEwgICAgICAgIAkJMHhlZQorI2RlZmluZQkJQ0NTQ0JET05FICAgICAgIAkweDgwCisjZGVmaW5lCQlBUlJET05FICAgICAgICAgCTB4NDAKKyNkZWZpbmUJCUNDQVJSRU4gICAgICAgICAJMHgxMAorI2RlZmluZQkJQ0NTQ0JFTiAgICAgICAgIAkweDA4CisjZGVmaW5lCQlDQ1NDQkRJUiAgICAgICAgCTB4MDQKKyNkZWZpbmUJCUNDU0NCUkVTRVQgICAgICAJMHgwMQorCisjZGVmaW5lCUNDU0NCQ05UICAgICAgICAJCTB4ZWYKKworI2RlZmluZQlDQ1NDQlBUUiAgICAgICAgCQkweGYxCisKKyNkZWZpbmUJSE5TQ0JfUU9GRiAgICAgIAkJMHhmNAorCisjZGVmaW5lCUhFU0NCX1FPRkYgICAgICAJCTB4ZjUKKworI2RlZmluZQlTTlNDQl9RT0ZGICAgICAgCQkweGY2CisKKyNkZWZpbmUJU0VTQ0JfUU9GRiAgICAgIAkJMHhmNworCisjZGVmaW5lCVNEU0NCX1FPRkYgICAgICAJCTB4ZjgKKworI2RlZmluZQlRT0ZGX0NUTFNUQSAgICAgCQkweGZhCisjZGVmaW5lCQlFU1RBQkxJU0hfU0NCX0FWQUlMCTB4ODAKKyNkZWZpbmUJCVNDQl9BVkFJTCAgICAgICAJMHg0MAorI2RlZmluZQkJU05TQ0JfUk9MTE9WRVIgIAkweDIwCisjZGVmaW5lCQlTRFNDQl9ST0xMT1ZFUiAgCTB4MTAKKyNkZWZpbmUJCVNFU0NCX1JPTExPVkVSICAJMHgwOAorI2RlZmluZQkJU0NCX1FTSVpFICAgICAgIAkweDA3CisjZGVmaW5lCQlTQ0JfUVNJWkVfMjU2ICAgCTB4MDYKKworI2RlZmluZQlERkZfVEhSU0ggICAgICAgCQkweGZiCisjZGVmaW5lCQlXUl9ERlRIUlNIICAgICAgCTB4NzAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUFYICAJMHg3MAorI2RlZmluZQkJV1JfREZUSFJTSF85MCAgIAkweDYwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzg1ICAgCTB4NTAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfNzUgICAJMHg0MAorI2RlZmluZQkJV1JfREZUSFJTSF82MyAgIAkweDMwCisjZGVmaW5lCQlXUl9ERlRIUlNIXzUwICAgCTB4MjAKKyNkZWZpbmUJCVdSX0RGVEhSU0hfMjUgICAJMHgxMAorI2RlZmluZQkJUkRfREZUSFJTSF9NQVggIAkweDA3CisjZGVmaW5lCQlSRF9ERlRIUlNIICAgICAgCTB4MDcKKyNkZWZpbmUJCVJEX0RGVEhSU0hfOTAgICAJMHgwNgorI2RlZmluZQkJUkRfREZUSFJTSF84NSAgIAkweDA1CisjZGVmaW5lCQlSRF9ERlRIUlNIXzc1ICAgCTB4MDQKKyNkZWZpbmUJCVJEX0RGVEhSU0hfNjMgICAJMHgwMworI2RlZmluZQkJUkRfREZUSFJTSF81MCAgIAkweDAyCisjZGVmaW5lCQlSRF9ERlRIUlNIXzI1ICAgCTB4MDEKKyNkZWZpbmUJCVdSX0RGVEhSU0hfTUlOICAJMHgwMAorI2RlZmluZQkJUkRfREZUSFJTSF9NSU4gIAkweDAwCisKKyNkZWZpbmUJU0dfQ0FDSEVQVFIgICAgIAkJMHhmYworI2RlZmluZQkJU0dfVVNFUl9EQVRBICAgIAkweGZjCisjZGVmaW5lCQlMQVNUX1NFRyAgICAgICAgCTB4MDIKKyNkZWZpbmUJCUxBU1RfU0VHX0RPTkUgICAJMHgwMQorCisKKyNkZWZpbmUJQ01EX0dST1VQMl9CWVRFX0RFTFRBCTB4ZmEKKyNkZWZpbmUJTUFYX09GRlNFVF84QklUCTB4MGYKKyNkZWZpbmUJQlVTXzE2X0JJVAkweDAxCisjZGVmaW5lCVFJTkZJRk9fT0ZGU0VUCTB4MDIKKyNkZWZpbmUJQ01EX0dST1VQNV9CWVRFX0RFTFRBCTB4MGIKKyNkZWZpbmUJQ01EX0dST1VQX0NPREVfU0hJRlQJMHgwNQorI2RlZmluZQlNQVhfT0ZGU0VUX1VMVFJBMgkweDdmCisjZGVmaW5lCU1BWF9PRkZTRVRfMTZCSVQJMHgwOAorI2RlZmluZQlCVVNfOF9CSVQJMHgwMAorI2RlZmluZQlRT1VURklGT19PRkZTRVQJMHgwMQorI2RlZmluZQlVTlRBR0dFRFNDQl9PRkZTRVQJMHgwMAorI2RlZmluZQlDQ1NHUkFNX01BWFNFR1MJMHgxMAorI2RlZmluZQlTQ0JfTElTVF9OVUxMCTB4ZmYKKyNkZWZpbmUJU0dfU0laRU9GCTB4MDgKKyNkZWZpbmUJQ01EX0dST1VQNF9CWVRFX0RFTFRBCTB4MDQKKyNkZWZpbmUJQ01EX0dST1VQMF9CWVRFX0RFTFRBCTB4ZmMKKyNkZWZpbmUJSE9TVF9NU0cJMHhmZgorI2RlZmluZQlCVVNfMzJfQklUCTB4MDIKKyNkZWZpbmUJQ0NTR0FERFJfTUFYCTB4ODAKKworCisvKiBEb3dubG9hZGVkIENvbnN0YW50IERlZmluaXRpb25zICovCisjZGVmaW5lCVRNT0RFX05VTUNNRFMJMHgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfc2VxLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eF9zZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWJjMTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHhfc2VxLmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgICogRE8gTk9UIEVESVQgLSBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZXFwcm9nW10gPSB7CisJMHhmZiwgMHg2YSwgMHgwNiwgMHgwOCwKKwkweDdmLCAweDAyLCAweDA0LCAweDA4LAorCTB4MTIsIDB4NmEsIDB4MDAsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHhkNiwgMHgwOSwKKwkweGZmLCAweDZhLCAweGRjLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4NTgsCisJMHhmNywgMHgwMSwgMHgwMiwgMHgwOCwKKwkweGZmLCAweDRlLCAweGM4LCAweDA4LAorCTB4YmYsIDB4NjAsIDB4YzAsIDB4MDgsCisJMHg2MCwgMHgwYiwgMHg4NiwgMHg2OCwKKwkweDQwLCAweDAwLCAweDBjLCAweDY4LAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHg2MCwgMHgwYiwgMHg4NiwgMHg2OCwKKwkweDQwLCAweDAwLCAweDBjLCAweDY4LAorCTB4MDgsIDB4MWYsIDB4M2UsIDB4MTAsCisJMHhmZiwgMHgzZSwgMHg0OCwgMHg2MCwKKwkweDQwLCAweGZhLCAweDEwLCAweDc4LAorCTB4ZmYsIDB4ZjYsIDB4ZDQsIDB4MDgsCisJMHgwMSwgMHg0ZSwgMHg5YywgMHgxOCwKKwkweDQwLCAweDYwLCAweGMwLCAweDAwLAorCTB4MDAsIDB4NGQsIDB4MTAsIDB4NzAsCisJMHgwMSwgMHg0ZSwgMHg5YywgMHgxOCwKKwkweGJmLCAweDYwLCAweGMwLCAweDA4LAorCTB4MDAsIDB4NmEsIDB4ODYsIDB4NWMsCisJMHhmZiwgMHg0ZSwgMHhjOCwgMHgxOCwKKwkweDAyLCAweDZhLCAweDcwLCAweDViLAorCTB4ZmYsIDB4NTIsIDB4MjAsIDB4MDksCisJMHgwZCwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDAwLCAweDUyLCAweGU2LCAweDViLAorCTB4MDMsIDB4YjAsIDB4NTIsIDB4MzEsCisJMHhmZiwgMHhiMCwgMHg1MiwgMHgwOSwKKwkweGZmLCAweGIxLCAweDU0LCAweDA5LAorCTB4ZmYsIDB4YjIsIDB4NTYsIDB4MDksCisJMHhmZiwgMHhhMywgMHg1MCwgMHgwOSwKKwkweGZmLCAweDNlLCAweDc0LCAweDA5LAorCTB4ZmYsIDB4OTAsIDB4N2MsIDB4MDgsCisJMHhmZiwgMHgzZSwgMHgyMCwgMHgwOSwKKwkweDAwLCAweDY1LCAweDRlLCAweDU4LAorCTB4MDAsIDB4NjUsIDB4MGMsIDB4NDAsCisJMHhmNywgMHgxZiwgMHhjYSwgMHgwOCwKKwkweDA4LCAweGExLCAweGM4LCAweDA4LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4MDAsCisJMHhmZiwgMHg2NSwgMHgzZSwgMHgwOCwKKwkweGYwLCAweGExLCAweGM4LCAweDA4LAorCTB4MGYsIDB4MGYsIDB4MWUsIDB4MDgsCisJMHgwMCwgMHgwZiwgMHgxZSwgMHgwMCwKKwkweGYwLCAweGExLCAweGM4LCAweDA4LAorCTB4MGYsIDB4MDUsIDB4MGEsIDB4MDgsCisJMHgwMCwgMHgwNSwgMHgwYSwgMHgwMCwKKwkweGZmLCAweDZhLCAweDBjLCAweDA4LAorCTB4NWEsIDB4NmEsIDB4MDAsIDB4MDQsCisJMHgxMiwgMHg2NSwgMHgwMiwgMHgwMCwKKwkweDMxLCAweDZhLCAweGNhLCAweDAwLAorCTB4ODAsIDB4MzcsIDB4NmUsIDB4NjgsCisJMHhmZiwgMHg2NSwgMHhjYSwgMHgxOCwKKwkweGZmLCAweDM3LCAweGRjLCAweDA4LAorCTB4ZmYsIDB4NmUsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHg2YywgMHg3NiwgMHg3OCwKKwkweDIwLCAweDAxLCAweDAyLCAweDAwLAorCTB4NGMsIDB4MzcsIDB4YzgsIDB4MjgsCisJMHgwOCwgMHgxZiwgMHg3ZSwgMHg3OCwKKwkweDA4LCAweDM3LCAweDZlLCAweDAwLAorCTB4MDgsIDB4NjQsIDB4YzgsIDB4MDAsCisJMHg3MCwgMHg2NCwgMHhjYSwgMHgxOCwKKwkweGZmLCAweDZjLCAweDBhLCAweDA4LAorCTB4MjAsIDB4NjQsIDB4Y2EsIDB4MTgsCisJMHhmZiwgMHg2YywgMHgwOCwgMHgwYywKKwkweDQwLCAweDBiLCAweDk2LCAweDY4LAorCTB4MjAsIDB4NmEsIDB4MTYsIDB4MDAsCisJMHhmMCwgMHgxOSwgMHg2ZSwgMHgwOCwKKwkweDA4LCAweDZhLCAweDE4LCAweDAwLAorCTB4MDgsIDB4MTEsIDB4MjIsIDB4MDAsCisJMHgwOCwgMHg2YSwgMHg2NiwgMHg1OCwKKwkweDA4LCAweDZhLCAweDY4LCAweDAwLAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NDAsCisJMHgxMiwgMHg2YSwgMHgwMCwgMHgwMCwKKwkweDQwLCAweDZhLCAweDE2LCAweDAwLAorCTB4ZmYsIDB4M2UsIDB4MjAsIDB4MDksCisJMHhmZiwgMHhiYSwgMHg3YywgMHgwOCwKKwkweGZmLCAweGExLCAweDZlLCAweDA4LAorCTB4MDgsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHgwOCwgMHgxMSwgMHgyMiwgMHgwMCwKKwkweDA4LCAweDZhLCAweDY2LCAweDU4LAorCTB4ODAsIDB4NmEsIDB4NjgsIDB4MDAsCisJMHg4MCwgMHgzNiwgMHg2YywgMHgwMCwKKwkweDAwLCAweDY1LCAweGJhLCAweDViLAorCTB4ZmYsIDB4M2QsIDB4YzgsIDB4MDgsCisJMHhiZiwgMHg2NCwgMHhlMiwgMHg3OCwKKwkweDgwLCAweDY0LCAweGM4LCAweDcxLAorCTB4YTAsIDB4NjQsIDB4ZjgsIDB4NzEsCisJMHhjMCwgMHg2NCwgMHhmMCwgMHg3MSwKKwkweGUwLCAweDY0LCAweDM4LCAweDcyLAorCTB4MDEsIDB4NmEsIDB4MjIsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg0MCwKKwkweGY3LCAweDExLCAweDIyLCAweDA4LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4NTgsCisJMHhmZiwgMHgwNiwgMHhkNCwgMHgwOCwKKwkweGY3LCAweDAxLCAweDAyLCAweDA4LAorCTB4MDksIDB4MGMsIDB4YzQsIDB4NzgsCisJMHgwOCwgMHgwYywgMHgwYywgMHg2OCwKKwkweDAxLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4MjYsIDB4MDksCisJMHgwMiwgMHg2YSwgMHgwOCwgMHgzMCwKKwkweGZmLCAweDZhLCAweDA4LCAweDA4LAorCTB4ZGYsIDB4MDEsIDB4MDIsIDB4MDgsCisJMHgwMSwgMHg2YSwgMHg3YSwgMHgwMCwKKwkweGZmLCAweDZhLCAweDZjLCAweDBjLAorCTB4MDQsIDB4MTQsIDB4MTAsIDB4MzEsCisJMHgwMywgMHhhOSwgMHgxOCwgMHgzMSwKKwkweDAzLCAweGE5LCAweDEwLCAweDMwLAorCTB4MDgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhhOSwgMHg2YSwgMHhkMCwgMHg1YiwKKwkweDAwLCAweDY1LCAweDAyLCAweDQxLAorCTB4YTgsIDB4NmEsIDB4NmEsIDB4MDAsCisJMHg3OSwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDQwLCAweDNkLCAweGVhLCAweDY4LAorCTB4MDQsIDB4MzUsIDB4NmEsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHgyYSwgMHg1YiwKKwkweDgwLCAweDZhLCAweGQ0LCAweDAxLAorCTB4MTAsIDB4MzYsIDB4ZDYsIDB4NjgsCisJMHgxMCwgMHgzNiwgMHg2YywgMHgwMCwKKwkweDA3LCAweGFjLCAweDEwLCAweDMxLAorCTB4MDUsIDB4YTMsIDB4NzAsIDB4MzAsCisJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YWMsIDB4NmEsIDB4YzgsIDB4NWIsCisJMHgwMCwgMHg2NSwgMHhjMiwgMHg1YiwKKwkweDM4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YTMsIDB4NmEsIDB4Y2MsIDB4NWIsCisJMHhmZiwgMHgzOCwgMHgxMiwgMHg2OSwKKwkweDgwLCAweDAyLCAweDA0LCAweDAwLAorCTB4ZTcsIDB4MzUsIDB4NmEsIDB4MDgsCisJMHgwMywgMHg2OSwgMHgxOCwgMHgzMSwKKwkweDAzLCAweDY5LCAweDEwLCAweDMwLAorCTB4ZmYsIDB4NmEsIDB4MTAsIDB4MDAsCisJMHhmZiwgMHg2YSwgMHgxMiwgMHgwMCwKKwkweGZmLCAweDZhLCAweDE0LCAweDAwLAorCTB4MjIsIDB4MzgsIDB4YzgsIDB4MjgsCisJMHgwMSwgMHgzOCwgMHgxYywgMHg2MSwKKwkweDAyLCAweDY0LCAweGM4LCAweDAwLAorCTB4MDEsIDB4MzgsIDB4MWMsIDB4NjEsCisJMHhiZiwgMHgzNSwgMHg2YSwgMHgwOCwKKwkweGZmLCAweDY0LCAweGY4LCAweDA5LAorCTB4ZmYsIDB4MzUsIDB4MjYsIDB4MDksCisJMHg4MCwgMHgwMiwgMHhhNCwgMHg2OSwKKwkweDEwLCAweDBjLCAweDdhLCAweDY5LAorCTB4ODAsIDB4OTQsIDB4MjIsIDB4NzksCisJMHgwMCwgMHgzNSwgMHgwYSwgMHg1YiwKKwkweDgwLCAweDAyLCAweGE0LCAweDY5LAorCTB4ZmYsIDB4NjUsIDB4OTQsIDB4NzksCisJMHgwMSwgMHgzOCwgMHg3MCwgMHg3MSwKKwkweGZmLCAweDM4LCAweDcwLCAweDE4LAorCTB4ZmYsIDB4MzgsIDB4OTQsIDB4NzksCisJMHg4MCwgMHhlYSwgMHg0YSwgMHg2MSwKKwkweGVmLCAweDM4LCAweGM4LCAweDE4LAorCTB4ODAsIDB4NmEsIDB4YzgsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHgzYywgMHg0OSwKKwkweDMzLCAweDM4LCAweGM4LCAweDI4LAorCTB4ZmYsIDB4NjQsIDB4ZDAsIDB4MDksCisJMHgwNCwgMHgzOSwgMHhjMCwgMHgzMSwKKwkweDA5LCAweDZhLCAweGQ2LCAweDAxLAorCTB4ODAsIDB4ZWIsIDB4NDIsIDB4NzksCisJMHhmNywgMHhlYiwgMHhkNiwgMHgwOSwKKwkweDA4LCAweGViLCAweDQ2LCAweDY5LAorCTB4MDEsIDB4NmEsIDB4ZDYsIDB4MDEsCisJMHgwOCwgMHhlOSwgMHgxMCwgMHgzMSwKKwkweDAzLCAweDhjLCAweDEwLCAweDMwLAorCTB4ZmYsIDB4MzgsIDB4NzAsIDB4MTgsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDM5LCAweDZhLCAweGNlLCAweDViLAorCTB4MDgsIDB4NmEsIDB4MTgsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHgxYSwgMHgwOSwKKwkweGZmLCAweDZhLCAweDFjLCAweDA5LAorCTB4MGQsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg3OCwgMHg1YywKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4MDAsIDB4NjUsIDB4NmEsIDB4NWMsCisJMHgwMCwgMHg2NSwgMHhjMiwgMHg1YiwKKwkweGZmLCAweDZhLCAweGM4LCAweDA4LAorCTB4MDgsIDB4MzksIDB4NzIsIDB4MTgsCisJMHgwMCwgMHgzYSwgMHg3NCwgMHgyMCwKKwkweDAwLCAweDY1LCAweDAyLCAweDQxLAorCTB4MDEsIDB4MGMsIDB4NmMsIDB4NzksCisJMHgxMCwgMHgwYywgMHgwMiwgMHg3OSwKKwkweDEwLCAweDBjLCAweDdhLCAweDY5LAorCTB4MDEsIDB4ZmMsIDB4NzAsIDB4NzksCisJMHhmZiwgMHg2YSwgMHg3MCwgMHgwOCwKKwkweDAxLCAweDBjLCAweDc2LCAweDc5LAorCTB4MTAsIDB4MGMsIDB4MDIsIDB4NzksCisJMHgwMCwgMHg2NSwgMHhhZSwgMHg1OSwKKwkweDAxLCAweGZjLCAweDk0LCAweDY5LAorCTB4NDAsIDB4MGQsIDB4ODQsIDB4NjksCisJMHhiMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDk0LCAweDQxLAorCTB4MmUsIDB4ZmMsIDB4YTIsIDB4MjgsCisJMHgzZiwgMHgzOCwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDUxLCAweDk0LCAweDcxLAorCTB4ZmYsIDB4NmEsIDB4YzgsIDB4MDgsCisJMHhmOCwgMHgzOSwgMHg3MiwgMHgxOCwKKwkweGZmLCAweDNhLCAweDc0LCAweDIwLAorCTB4MDEsIDB4MzgsIDB4NzAsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHg4NiwgMHg0MSwKKwkweDAzLCAweDA4LCAweDUyLCAweDMxLAorCTB4ZmYsIDB4MzgsIDB4NTAsIDB4MDksCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweGZmLCAweDA4LCAweDUyLCAweDA5LAorCTB4ZmYsIDB4MDksIDB4NTQsIDB4MDksCisJMHhmZiwgMHgwYSwgMHg1NiwgMHgwOSwKKwkweGZmLCAweDM4LCAweDUwLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4YWEsIDB4NDAsCisJMHgxMCwgMHgwYywgMHhhNCwgMHg3OSwKKwkweDAwLCAweDY1LCAweGFlLCAweDU5LAorCTB4N2YsIDB4MDIsIDB4MDQsIDB4MDgsCisJMHhlMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MDQsIDB4OTMsIDB4YzIsIDB4NjksCisJMHhkZiwgMHg5MywgMHgyNiwgMHgwOSwKKwkweDIwLCAweDkzLCAweGIyLCAweDY5LAorCTB4MDIsIDB4OTMsIDB4MjYsIDB4MDEsCisJMHgwMSwgMHg5NCwgMHhiNiwgMHg3OSwKKwkweDAxLCAweDk0LCAweGI2LCAweDc5LAorCTB4MDEsIDB4OTQsIDB4YjYsIDB4NzksCisJMHgwMSwgMHg5NCwgMHhiNiwgMHg3OSwKKwkweDAxLCAweDk0LCAweGI2LCAweDc5LAorCTB4MTAsIDB4OTQsIDB4YzAsIDB4NjksCisJMHhkNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDI4LCAweDkzLCAweGM0LCAweDY5LAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHgwMCwgMHg2NSwgMHgyYSwgMHg1YiwKKwkweDA1LCAweGI0LCAweDEwLCAweDMxLAorCTB4MDIsIDB4NmEsIDB4MWEsIDB4MzEsCisJMHgwMywgMHg4YywgMHgxMCwgMHgzMCwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4YjQsIDB4NmEsIDB4Y2MsIDB4NWIsCisJMHhmZiwgMHg2YSwgMHgxYSwgMHgwOSwKKwkweGZmLCAweDZhLCAweDFjLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4YzIsIDB4NWIsCisJMHgzZCwgMHg2YSwgMHgwYSwgMHg1YiwKKwkweGFjLCAweDZhLCAweDI2LCAweDAxLAorCTB4MDQsIDB4MGIsIDB4ZGUsIDB4NjksCisJMHgwNCwgMHgwYiwgMHhlNCwgMHg2OSwKKwkweDEwLCAweDBjLCAweGUwLCAweDc5LAorCTB4MDIsIDB4MDMsIDB4ZTgsIDB4NzksCisJMHgxMSwgMHgwYywgMHhlNCwgMHg3OSwKKwkweGQ3LCAweDkzLCAweDI2LCAweDA5LAorCTB4MjgsIDB4OTMsIDB4ZWEsIDB4NjksCisJMHgxMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MDAsIDB4NjUsIDB4MmEsIDB4NWIsCisJMHhmZiwgMHgwNiwgMHg0NCwgMHgwOSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MTAsIDB4M2QsIDB4MDYsIDB4MDAsCisJMHhmZiwgMHgzNCwgMHhjYSwgMHgwOCwKKwkweDgwLCAweDY1LCAweDFjLCAweDYyLAorCTB4MGYsIDB4YTEsIDB4Y2EsIDB4MDgsCisJMHgwNywgMHhhMSwgMHhjYSwgMHgwOCwKKwkweDQwLCAweGEwLCAweGM4LCAweDA4LAorCTB4MDAsIDB4NjUsIDB4Y2EsIDB4MDAsCisJMHg4MCwgMHg2NSwgMHhjYSwgMHgwMCwKKwkweDgwLCAweGEwLCAweDBjLCAweDdhLAorCTB4ZmYsIDB4NjUsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHgxZSwgMHg0MiwKKwkweDIwLCAweGEwLCAweDI0LCAweDdhLAorCTB4ZmYsIDB4NjUsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGEwLCAweDNkLCAweDJjLCAweDYyLAorCTB4MjMsIDB4YTAsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGEwLCAweDNkLCAweDJjLCAweDYyLAorCTB4MDAsIDB4YjksIDB4MjQsIDB4NDIsCisJMHhmZiwgMHg2NSwgMHgyNCwgMHg2MiwKKwkweGExLCAweDZhLCAweDIyLCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MDgsCisJMHgxMCwgMHg1MSwgMHgyYywgMHg3MiwKKwkweDQwLCAweDZhLCAweDE4LCAweDAwLAorCTB4ZmYsIDB4NjUsIDB4MGMsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGEwLCAweDNkLCAweGY2LCAweDcxLAorCTB4NDAsIDB4NmEsIDB4MTgsIDB4MDAsCisJMHhmZiwgMHgzNCwgMHhhNiwgMHgwOCwKKwkweDgwLCAweDM0LCAweDM0LCAweDYyLAorCTB4N2YsIDB4YTAsIDB4NDAsIDB4MDksCisJMHgwOCwgMHg2YSwgMHg2OCwgMHgwMCwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4NjQsIDB4NmEsIDB4MDAsIDB4NWIsCisJMHg4MCwgMHg2NCwgMHhhYSwgMHg2YSwKKwkweDA0LCAweDY0LCAweDhjLCAweDcyLAorCTB4MDIsIDB4NjQsIDB4OTIsIDB4NzIsCisJMHgwMCwgMHg2YSwgMHg1NCwgMHg3MiwKKwkweDAzLCAweDY0LCAweGE2LCAweDcyLAorCTB4MDEsIDB4NjQsIDB4ODgsIDB4NzIsCisJMHgwNywgMHg2NCwgMHhlOCwgMHg3MiwKKwkweDA4LCAweDY0LCAweDUwLCAweDcyLAorCTB4MjMsIDB4NjQsIDB4ZWMsIDB4NzIsCisJMHgxMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDA3LCAweDZhLCAweGYyLCAweDVhLAorCTB4ZmYsIDB4MDYsIDB4ZDQsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhhYSwgMHg0MCwKKwkweGZmLCAweGE4LCAweDU4LCAweDZhLAorCTB4ZmYsIDB4YTIsIDB4NzAsIDB4N2EsCisJMHgwMSwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDAwLCAweGI5LCAweGU2LCAweDViLAorCTB4ZmYsIDB4YTIsIDB4NzAsIDB4N2EsCisJMHg3MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweGZmLCAweDZhLCAweGQ0LCAweDA4LAorCTB4NDAsIDB4NTEsIDB4NzAsIDB4NjIsCisJMHgwZCwgMHg2YSwgMHg2YSwgMHgwMCwKKwkweDAwLCAweGI5LCAweGU2LCAweDViLAorCTB4ZmYsIDB4M2UsIDB4NzQsIDB4MDksCisJMHhmZiwgMHg5MCwgMHg3YywgMHgwOCwKKwkweDAwLCAweDY1LCAweDRlLCAweDU4LAorCTB4MDAsIDB4NjUsIDB4YmMsIDB4NDAsCisJMHgyMCwgMHhhMCwgMHg3OCwgMHg2YSwKKwkweGZmLCAweDM3LCAweGM4LCAweDA4LAorCTB4MDAsIDB4NmEsIDB4OTAsIDB4NWIsCisJMHhmZiwgMHg2YSwgMHhhNiwgMHg1YiwKKwkweGZmLCAweGY4LCAweGM4LCAweDA4LAorCTB4ZmYsIDB4NGYsIDB4YzgsIDB4MDgsCisJMHgwMSwgMHg2YSwgMHg5MCwgMHg1YiwKKwkweDAwLCAweGI5LCAweGE2LCAweDViLAorCTB4MDEsIDB4NGYsIDB4OWUsIDB4MTgsCisJMHgwMiwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDgwLCAweDVjLAorCTB4MDAsIDB4NjUsIDB4YmMsIDB4NDAsCisJMHg0MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4MDQsIDB4YTAsIDB4NDAsIDB4MDEsCisJMHgwMCwgMHg2NSwgMHg5OCwgMHg1YywKKwkweDAwLCAweDY1LCAweGJjLCAweDQwLAorCTB4MTAsIDB4MzYsIDB4NTAsIDB4N2EsCisJMHgwNSwgMHgzOCwgMHg0NiwgMHgzMSwKKwkweDA0LCAweDE0LCAweDU4LCAweDMxLAorCTB4MDMsIDB4YTksIDB4NjAsIDB4MzEsCisJMHhhMywgMHg2YSwgMHhjYywgMHgwMCwKKwkweDM4LCAweDZhLCAweGNjLCAweDViLAorCTB4YWMsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHgxNCwgMHg2YSwgMHhjZSwgMHg1YiwKKwkweGE5LCAweDZhLCAweGQwLCAweDViLAorCTB4MDAsIDB4NjUsIDB4NTAsIDB4NDIsCisJMHhlZiwgMHgzNiwgMHg2YywgMHgwOCwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4MGYsIDB4NjQsIDB4YzgsIDB4MDgsCisJMHgwNywgMHg2NCwgMHhjOCwgMHgwOCwKKwkweDAwLCAweDM3LCAweDZlLCAweDAwLAorCTB4ZmYsIDB4NmEsIDB4YTQsIDB4MDAsCisJMHgwMCwgMHg2NSwgMHg2MCwgMHg1YiwKKwkweGZmLCAweDUxLCAweGJjLCAweDcyLAorCTB4MjAsIDB4MzYsIDB4YzYsIDB4N2EsCisJMHgwMCwgMHg5MCwgMHg0ZSwgMHg1YiwKKwkweDAwLCAweDY1LCAweGM4LCAweDQyLAorCTB4ZmYsIDB4MDYsIDB4ZDQsIDB4MDgsCisJMHgwMCwgMHg2NSwgMHhiYSwgMHg1YiwKKwkweGUwLCAweDNkLCAweGUyLCAweDYyLAorCTB4MjAsIDB4MTIsIDB4ZTIsIDB4NjIsCisJMHg1MSwgMHg2YSwgMHhmNiwgMHg1YSwKKwkweDAwLCAweDY1LCAweDQ4LCAweDViLAorCTB4ZmYsIDB4MzcsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHhhMSwgMHhkYSwgMHg2MiwKKwkweDA0LCAweGEwLCAweGRhLCAweDdhLAorCTB4ZmIsIDB4YTAsIDB4NDAsIDB4MDksCisJMHg4MCwgMHgzNiwgMHg2YywgMHgwMCwKKwkweDgwLCAweGEwLCAweDUwLCAweDdhLAorCTB4N2YsIDB4YTAsIDB4NDAsIDB4MDksCisJMHhmZiwgMHg2YSwgMHhmMiwgMHg1YSwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4MDQsIDB4YTAsIDB4ZTAsIDB4N2EsCisJMHgwMCwgMHg2NSwgMHg5OCwgMHg1YywKKwkweDAwLCAweDY1LCAweGUyLCAweDQyLAorCTB4MDAsIDB4NjUsIDB4ODAsIDB4NWMsCisJMHgzMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDBjLCAweDZhLCAweGYyLCAweDVhLAorCTB4MDAsIDB4NjUsIDB4NTAsIDB4NDIsCisJMHg2MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4NTEsIDB4NmEsIDB4ZjYsIDB4NWEsCisJMHg1MSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDUwLCAweDQyLAorCTB4MTAsIDB4M2QsIDB4MDYsIDB4MDAsCisJMHhmZiwgMHg2NSwgMHg2OCwgMHgwYywKKwkweGZmLCAweDA2LCAweGQ0LCAweDA4LAorCTB4MDEsIDB4MGMsIDB4ZjgsIDB4N2EsCisJMHgwNCwgMHgwYywgMHhmYSwgMHg2YSwKKwkweGUwLCAweDAzLCAweDdhLCAweDA4LAorCTB4ZTAsIDB4M2QsIDB4MDYsIDB4NjMsCisJMHhmZiwgMHg2NSwgMHhjYywgMHgwOCwKKwkweGZmLCAweDEyLCAweGRhLCAweDBjLAorCTB4ZmYsIDB4MDYsIDB4ZDQsIDB4MGMsCisJMHhkMSwgMHg2YSwgMHgyMiwgMHgwMSwKKwkweDAwLCAweDY1LCAweGFhLCAweDQwLAorCTB4ZmYsIDB4NjUsIDB4MjYsIDB4MDksCisJMHgwMSwgMHgwYiwgMHgxYSwgMHg2YiwKKwkweDEwLCAweDBjLCAweDBjLCAweDdiLAorCTB4MDQsIDB4MGIsIDB4MTQsIDB4NmIsCisJMHhmZiwgMHg2YSwgMHhjYSwgMHgwOCwKKwkweDA0LCAweDkzLCAweDE4LCAweDZiLAorCTB4MDEsIDB4OTQsIDB4MTYsIDB4N2IsCisJMHgxMCwgMHg5NCwgMHgxOCwgMHg2YiwKKwkweDgwLCAweDNkLCAweDFlLCAweDczLAorCTB4MGYsIDB4MDQsIDB4MjIsIDB4NmIsCisJMHgwMiwgMHgwMywgMHgyMiwgMHg3YiwKKwkweDExLCAweDBjLCAweDFlLCAweDdiLAorCTB4YzcsIDB4OTMsIDB4MjYsIDB4MDksCisJMHhmZiwgMHg5OSwgMHhkNCwgMHgwOCwKKwkweDM4LCAweDkzLCAweDI0LCAweDZiLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHg4MCwgMHgzNiwgMHgyOCwgMHg2YiwKKwkweDIxLCAweDZhLCAweDIyLCAweDA1LAorCTB4ZmYsIDB4NjUsIDB4MjAsIDB4MDksCisJMHhmZiwgMHg1MSwgMHgzNiwgMHg2MywKKwkweGZmLCAweDM3LCAweGM4LCAweDA4LAorCTB4YTEsIDB4NmEsIDB4NDIsIDB4NDMsCisJMHhmZiwgMHg1MSwgMHhjOCwgMHgwOCwKKwkweGI5LCAweDZhLCAweDQyLCAweDQzLAorCTB4ZmYsIDB4OTAsIDB4YTQsIDB4MDgsCisJMHhmZiwgMHhiYSwgMHg0NiwgMHg3MywKKwkweGZmLCAweGJhLCAweDIwLCAweDA5LAorCTB4ZmYsIDB4NjUsIDB4Y2EsIDB4MTgsCisJMHgwMCwgMHg2YywgMHgzYSwgMHg2MywKKwkweGZmLCAweDkwLCAweGNhLCAweDBjLAorCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCisJMHgyMCwgMHgzNiwgMHg1YSwgMHg3YiwKKwkweDAwLCAweDkwLCAweDJlLCAweDViLAorCTB4ZmYsIDB4NjUsIDB4NWEsIDB4NzMsCisJMHhmZiwgMHg1MiwgMHg1OCwgMHg3MywKKwkweGZmLCAweGJhLCAweGNjLCAweDA4LAorCTB4ZmYsIDB4NTIsIDB4MjAsIDB4MDksCisJMHhmZiwgMHg2NiwgMHg3NCwgMHgwOSwKKwkweGZmLCAweDY1LCAweDIwLCAweDBkLAorCTB4ZmYsIDB4YmEsIDB4N2UsIDB4MGMsCisJMHgwMCwgMHg2YSwgMHg4NiwgMHg1YywKKwkweDBkLCAweDZhLCAweDZhLCAweDAwLAorCTB4MDAsIDB4NTEsIDB4ZTYsIDB4NDMsCisJMHhmZiwgMHgzZiwgMHhiNCwgMHg3MywKKwkweGZmLCAweDZhLCAweGEyLCAweDAwLAorCTB4MDAsIDB4M2YsIDB4MmUsIDB4NWIsCisJMHhmZiwgMHg2NSwgMHhiNCwgMHg3MywKKwkweDIwLCAweDM2LCAweDZjLCAweDAwLAorCTB4MjAsIDB4YTAsIDB4NmUsIDB4NmIsCisJMHhmZiwgMHhiOSwgMHhhMiwgMHgwYywKKwkweGZmLCAweDZhLCAweGEyLCAweDA0LAorCTB4ZmYsIDB4NjUsIDB4YTQsIDB4MDgsCisJMHhlMCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQ1LCAweDZhLCAweGRhLCAweDViLAorCTB4MDEsIDB4NmEsIDB4ZDAsIDB4MDEsCisJMHgwOSwgMHg2YSwgMHhkNiwgMHgwMSwKKwkweDgwLCAweGViLCAweDdhLCAweDdiLAorCTB4MDEsIDB4NmEsIDB4ZDYsIDB4MDEsCisJMHgwMSwgMHhlOSwgMHhhNCwgMHgzNCwKKwkweDg4LCAweDZhLCAweGNjLCAweDAwLAorCTB4NDUsIDB4NmEsIDB4ZGEsIDB4NWIsCisJMHgwMSwgMHg2YSwgMHgxOCwgMHgwMSwKKwkweGZmLCAweDZhLCAweDFhLCAweDA5LAorCTB4ZmYsIDB4NmEsIDB4MWMsIDB4MDksCisJMHgwZCwgMHg2YSwgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDc4LCAweDVjLAorCTB4ZmYsIDB4OTksIDB4YTQsIDB4MGMsCisJMHhmZiwgMHg2NSwgMHhhNCwgMHgwOCwKKwkweGUwLCAweDZhLCAweGNjLCAweDAwLAorCTB4NDUsIDB4NmEsIDB4ZGEsIDB4NWIsCisJMHgwMSwgMHg2YSwgMHhkMCwgMHgwMSwKKwkweDAxLCAweDZhLCAweGRjLCAweDA1LAorCTB4ODgsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0NSwgMHg2YSwgMHhkYSwgMHg1YiwKKwkweDAxLCAweDZhLCAweDE4LCAweDAxLAorCTB4ZmYsIDB4NmEsIDB4MWEsIDB4MDksCisJMHhmZiwgMHg2YSwgMHgxYywgMHgwOSwKKwkweDAxLCAweDZhLCAweDI2LCAweDA1LAorCTB4MDEsIDB4NjUsIDB4ZDgsIDB4MzEsCisJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKKwkweDgwLCAweGVlLCAweGFhLCAweDdiLAorCTB4ZmYsIDB4NmEsIDB4ZGMsIDB4MGQsCisJMHhmZiwgMHg2NSwgMHgzMiwgMHgwOSwKKwkweDBhLCAweDkzLCAweDI2LCAweDAxLAorCTB4MDAsIDB4NjUsIDB4NzgsIDB4NDQsCisJMHhmZiwgMHgzNywgMHhjOCwgMHgwOCwKKwkweDAwLCAweDZhLCAweDcwLCAweDViLAorCTB4ZmYsIDB4NTIsIDB4YTIsIDB4MGMsCisJMHgwMSwgMHgwYywgMHhiYSwgMHg3YiwKKwkweDA0LCAweDBjLCAweGJhLCAweDZiLAorCTB4ZTAsIDB4MDMsIDB4MDYsIDB4MDgsCisJMHhlMCwgMHgwMywgMHg3YSwgMHgwYywKKwkweGZmLCAweDhjLCAweDEwLCAweDA4LAorCTB4ZmYsIDB4OGQsIDB4MTIsIDB4MDgsCisJMHhmZiwgMHg4ZSwgMHgxNCwgMHgwYywKKwkweGZmLCAweDZjLCAweGRhLCAweDA4LAorCTB4ZmYsIDB4NmMsIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg2YywgMHhkYSwgMHgwOCwKKwkweGZmLCAweDZjLCAweGRhLCAweDA4LAorCTB4ZmYsIDB4NmMsIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg2YywgMHhkYSwgMHgwOCwKKwkweGZmLCAweDZjLCAweGRhLCAweDBjLAorCTB4M2QsIDB4NjQsIDB4YTQsIDB4MjgsCisJMHg1NSwgMHg2NCwgMHhjOCwgMHgyOCwKKwkweDAwLCAweDZjLCAweGRhLCAweDE4LAorCTB4ZmYsIDB4NTIsIDB4YzgsIDB4MDgsCisJMHgwMCwgMHg2YywgMHhkYSwgMHgyMCwKKwkweGZmLCAweDZhLCAweGM4LCAweDA4LAorCTB4MDAsIDB4NmMsIDB4ZGEsIDB4MjAsCisJMHgwMCwgMHg2YywgMHhkYSwgMHgyNCwKKwkweGZmLCAweDY1LCAweGM4LCAweDA4LAorCTB4ZTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHg0MSwgMHg2YSwgMHhkNiwgMHg1YiwKKwkweGZmLCAweDkwLCAweGUyLCAweDA5LAorCTB4MjAsIDB4NmEsIDB4ZDAsIDB4MDEsCisJMHgwNCwgMHgzNSwgMHhmOCwgMHg3YiwKKwkweDFkLCAweDZhLCAweGRjLCAweDAxLAorCTB4ZGMsIDB4ZWUsIDB4ZjQsIDB4NjMsCisJMHgwMCwgMHg2NSwgMHgwZSwgMHg0NCwKKwkweDAxLCAweDZhLCAweGRjLCAweDAxLAorCTB4MjAsIDB4YTAsIDB4ZDgsIDB4MzEsCisJMHgwOSwgMHhlZSwgMHhkYywgMHgwMSwKKwkweDgwLCAweGVlLCAweGZlLCAweDdiLAorCTB4MTEsIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg1MCwgMHhlZSwgMHgwMiwgMHg2NCwKKwkweDIwLCAweDZhLCAweGQwLCAweDAxLAorCTB4MDksIDB4NmEsIDB4ZGMsIDB4MDEsCisJMHg4OCwgMHhlZSwgMHgwOCwgMHg2NCwKKwkweDE5LCAweDZhLCAweGRjLCAweDAxLAorCTB4ZDgsIDB4ZWUsIDB4MGMsIDB4NjQsCisJMHhmZiwgMHg2YSwgMHhkYywgMHgwOSwKKwkweDE4LCAweGVlLCAweDEwLCAweDZjLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHg4OCwgMHg2YSwgMHhjYywgMHgwMCwKKwkweDQxLCAweDZhLCAweGQ2LCAweDViLAorCTB4MjAsIDB4NmEsIDB4MTgsIDB4MDEsCisJMHhmZiwgMHg2YSwgMHgxYSwgMHgwOSwKKwkweGZmLCAweDZhLCAweDFjLCAweDA5LAorCTB4ZmYsIDB4MzUsIDB4MjYsIDB4MDksCisJMHgwNCwgMHgzNSwgMHgzYywgMHg2YywKKwkweGEwLCAweDZhLCAweGNhLCAweDAwLAorCTB4MjAsIDB4NjUsIDB4YzgsIDB4MTgsCisJMHhmZiwgMHg2YywgMHgzMiwgMHgwOSwKKwkweGZmLCAweDZjLCAweDMyLCAweDA5LAorCTB4ZmYsIDB4NmMsIDB4MzIsIDB4MDksCisJMHhmZiwgMHg2YywgMHgzMiwgMHgwOSwKKwkweGZmLCAweDZjLCAweDMyLCAweDA5LAorCTB4ZmYsIDB4NmMsIDB4MzIsIDB4MDksCisJMHhmZiwgMHg2YywgMHgzMiwgMHgwOSwKKwkweGZmLCAweDZjLCAweDMyLCAweDA5LAorCTB4MDAsIDB4NjUsIDB4MjYsIDB4NjQsCisJMHgwYSwgMHg5MywgMHgyNiwgMHgwMSwKKwkweDAwLCAweDY1LCAweDc4LCAweDQ0LAorCTB4YTAsIDB4NmEsIDB4Y2MsIDB4MDAsCisJMHhlOCwgMHg2YSwgMHhjOCwgMHgwMCwKKwkweDAxLCAweDk0LCAweDQwLCAweDZjLAorCTB4MTAsIDB4OTQsIDB4NDIsIDB4NmMsCisJMHgwOCwgMHg5NCwgMHg1NCwgMHg2YywKKwkweDA4LCAweDk0LCAweDU0LCAweDZjLAorCTB4MDgsIDB4OTQsIDB4NTQsIDB4NmMsCisJMHgwMCwgMHg2NSwgMHg2OCwgMHg1YywKKwkweDA4LCAweDY0LCAweGM4LCAweDE4LAorCTB4MDAsIDB4OGMsIDB4Y2EsIDB4MTgsCisJMHgwMCwgMHg2NSwgMHg0YSwgMHg0YywKKwkweDAwLCAweDY1LCAweDQwLCAweDQ0LAorCTB4ZjcsIDB4OTMsIDB4MjYsIDB4MDksCisJMHgwOCwgMHg5MywgMHg1NiwgMHg2YywKKwkweDAwLCAweDY1LCAweDY4LCAweDVjLAorCTB4MDgsIDB4NjQsIDB4YzgsIDB4MTgsCisJMHgwOCwgMHg2NCwgMHg1OCwgMHg2NCwKKwkweGZmLCAweDZhLCAweGQ0LCAweDBjLAorCTB4MDAsIDB4NjUsIDB4NzgsIDB4NWMsCisJMHgwMCwgMHg2NSwgMHg2OCwgMHg1YywKKwkweDAwLCAweDY1LCAweDY4LCAweDVjLAorCTB4MDAsIDB4NjUsIDB4NjgsIDB4NWMsCisJMHhmZiwgMHg5OSwgMHhkYSwgMHgwOCwKKwkweGZmLCAweDk5LCAweGRhLCAweDA4LAorCTB4ZmYsIDB4OTksIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg5OSwgMHhkYSwgMHgwOCwKKwkweGZmLCAweDk5LCAweGRhLCAweDA4LAorCTB4ZmYsIDB4OTksIDB4ZGEsIDB4MDgsCisJMHhmZiwgMHg5OSwgMHhkYSwgMHgwOCwKKwkweGZmLCAweDk5LCAweGRhLCAweDBjLAorCTB4MDgsIDB4OTQsIDB4NzgsIDB4N2MsCisJMHhmNywgMHg5MywgMHgyNiwgMHgwOSwKKwkweDA4LCAweDkzLCAweDdjLCAweDZjLAorCTB4ZmYsIDB4NmEsIDB4ZDQsIDB4MGMsCisJMHhmZiwgMHg0MCwgMHg3NCwgMHgwOSwKKwkweGZmLCAweDkwLCAweDgwLCAweDA4LAorCTB4ZmYsIDB4NmEsIDB4NzIsIDB4MDUsCisJMHhmZiwgMHg0MCwgMHg5NCwgMHg2NCwKKwkweGZmLCAweDNmLCAweDhjLCAweDY0LAorCTB4ZmYsIDB4NmEsIDB4Y2EsIDB4MDQsCisJMHhmZiwgMHgzZiwgMHgyMCwgMHgwOSwKKwkweDAxLCAweDZhLCAweDZhLCAweDAwLAorCTB4MDAsIDB4YjksIDB4ZTYsIDB4NWIsCisJMHhmZiwgMHhiYSwgMHg3ZSwgMHgwYywKKwkweGZmLCAweDQwLCAweDIwLCAweDA5LAorCTB4ZmYsIDB4YmEsIDB4ODAsIDB4MGMsCisJMHhmZiwgMHgzZiwgMHg3NCwgMHgwOSwKKwkweGZmLCAweDkwLCAweDdlLCAweDBjLAorfTsKKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoMTVfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDE1X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5idWdzICYgQUhDX0JVR19TQ0JDSEFOX1VQTE9BRCkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDE0X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxNF9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+YnVncyAmIEFIQ19CVUdfUENJXzJfMV9SRVRSWSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDEzX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxM19mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+ZmVhdHVyZXMgJiBBSENfV0lERSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDEyX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxMl9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+YnVncyAmIEFIQ19CVUdfQVVUT0ZMVVNIKSAhPSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoMTFfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDExX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQTIpID09IDApOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2gxMF9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoMTBfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZlYXR1cmVzICYgQUhDX0NNRF9DSEFOKSA9PSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoOV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoOV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+Y2hpcCAmIEFIQ19DSElQSURfTUFTSykgPT0gQUhDX0FJQzc4OTUpOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2g4X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2g4X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19VTFRSQSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDdfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDdfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDZfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDZfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZsYWdzICYgQUhDX1BBR0VTQ0JTKSA9PSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoNV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoNV9mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+ZmxhZ3MgJiBBSENfUEFHRVNDQlMpICE9IDApOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2g0X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2g0X2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19RVUVVRV9SRUdTKSAhPSAwKTsKK30KKworc3RhdGljIGludCBhaWM3eHh4X3BhdGNoM19mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApOworCitzdGF0aWMgaW50CithaWM3eHh4X3BhdGNoM19mdW5jKHN0cnVjdCBhaWM3eHh4X2hvc3QgKnApCit7CisJcmV0dXJuICgocC0+ZmVhdHVyZXMgJiBBSENfVFdJTikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDJfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDJfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoKHAtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpID09IDApOworfQorCitzdGF0aWMgaW50IGFpYzd4eHhfcGF0Y2gxX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCk7CisKK3N0YXRpYyBpbnQKK2FpYzd4eHhfcGF0Y2gxX2Z1bmMoc3RydWN0IGFpYzd4eHhfaG9zdCAqcCkKK3sKKwlyZXR1cm4gKChwLT5mZWF0dXJlcyAmIEFIQ19DTURfQ0hBTikgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWljN3h4eF9wYXRjaDBfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKTsKKworc3RhdGljIGludAorYWljN3h4eF9wYXRjaDBfZnVuYyhzdHJ1Y3QgYWljN3h4eF9ob3N0ICpwKQoreworCXJldHVybiAoMCk7Cit9CisKK3N0cnVjdCBzZXF1ZW5jZXJfcGF0Y2ggeworCWludAkJKCpwYXRjaF9mdW5jKShzdHJ1Y3QgYWljN3h4eF9ob3N0ICopOworCXVuc2lnbmVkIGludAliZWdpbgkgICA6MTAsCisJCQlza2lwX2luc3RyIDoxMCwKKwkJCXNraXBfcGF0Y2ggOjEyOworfSBzZXF1ZW5jZXJfcGF0Y2hlc1tdID0geworCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgMywgMiwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDJfZnVuYywgNywgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDJfZnVuYywgOCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDNfZnVuYywgMTEsIDQsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g0X2Z1bmMsIDE2LCAzLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxOSwgNCwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDVfZnVuYywgMjMsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g2X2Z1bmMsIDI2LCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCAyOSwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMzAsIDMsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gzX2Z1bmMsIDM5LCA0LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCA0MywgMywgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgNDYsIDMsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g4X2Z1bmMsIDUyLCA3LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoM19mdW5jLCA2MCwgMywgMSB9LAorCXsgYWljN3h4eF9wYXRjaDdfZnVuYywgNjMsIDIsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDEwMiwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMTAzLCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAxMDcsIDIsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g5X2Z1bmMsIDEwOSwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDEwX2Z1bmMsIDExMCwgMiwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDdfZnVuYywgMTEzLCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxMTQsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDExOCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgMTIxLCAzLCAzIH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMTIzLCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxMjQsIDUsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDEzMiwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDlfZnVuYywgMTMzLCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTBfZnVuYywgMTM0LCAzLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAxMzcsIDMsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDE0MCwgMiwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDdfZnVuYywgMTQyLCA1LCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxNDcsIDMsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDE1MCwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMTUxLCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCAxNTMsIDE1LCA0IH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMTY2LCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAxNjcsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDE2OCwgMTAsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDE4MSwgMSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMTgyLCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAxODQsIDE4LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCAyMDIsIDMsIDMgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDIwNCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMjA1LCA0LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoN19mdW5jLCAyMTAsIDIsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDIxNSwgMTMsIDMgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxMl9mdW5jLCAyMTgsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxMl9mdW5jLCAyMTksIDQsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDIyOSwgMywgMyB9LAorCXsgYWljN3h4eF9wYXRjaDExX2Z1bmMsIDIzMSwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgMjMyLCA1LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMjM3LCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAyMzgsIDksIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxM19mdW5jLCAyNTQsIDEsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDI1NSwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDRfZnVuYywgMzE2LCAxLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAzMTcsIDEsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gyX2Z1bmMsIDMyMCwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgMzMwLCAzLCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCAzMzMsIDUsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxM19mdW5jLCAzNDEsIDEsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDM0MiwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDVfZnVuYywgMzQ3LCAxLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTFfZnVuYywgMzg5LCAxNSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDE0X2Z1bmMsIDQwMiwgMSwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDFfZnVuYywgNDQxLCA3LCAyIH0sCisJeyBhaWM3eHh4X3BhdGNoMF9mdW5jLCA0NDgsIDgsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDQ1NywgNCwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgNDYxLCA2LCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMV9mdW5jLCA0NjcsIDQsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDQ3MSwgMywgMSB9LAorCXsgYWljN3h4eF9wYXRjaDEwX2Z1bmMsIDQ4MSwgMTAsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxX2Z1bmMsIDUwMCwgMjIsIDUgfSwKKwl7IGFpYzd4eHhfcGF0Y2gxMV9mdW5jLCA1MDgsIDQsIDEgfSwKKwl7IGFpYzd4eHhfcGF0Y2g3X2Z1bmMsIDUxMiwgNywgMyB9LAorCXsgYWljN3h4eF9wYXRjaDE1X2Z1bmMsIDUxMiwgNSwgMiB9LAorCXsgYWljN3h4eF9wYXRjaDBfZnVuYywgNTE3LCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoMTBfZnVuYywgNTIyLCA1MCwgMyB9LAorCXsgYWljN3h4eF9wYXRjaDE0X2Z1bmMsIDU0MywgMTcsIDIgfSwKKwl7IGFpYzd4eHhfcGF0Y2gwX2Z1bmMsIDU2MCwgNCwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDEwX2Z1bmMsIDU3MiwgNCwgMSB9LAorCXsgYWljN3h4eF9wYXRjaDVfZnVuYywgNTc2LCAyLCAxIH0sCisJeyBhaWM3eHh4X3BhdGNoNV9mdW5jLCA1NzksIDksIDEgfSwKKworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9zY3NpX21lc3NhZ2UuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9zY3NpX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzlmODljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL3Njc2lfbWVzc2FnZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIE1lc3NhZ2VzICgxIGJ5dGUpICovCQkgICAgIC8qIEkvVCAoTSlhbmRhdG9yeSBvciAoTylwdGlvbmFsICovCisjZGVmaW5lIE1TR19DTURDT01QTEVURQkJMHgwMCAvKiBNL00gKi8KKyNkZWZpbmUgTVNHX0VYVEVOREVECQkweDAxIC8qIE8vTyAqLworI2RlZmluZSBNU0dfU0FWRURBVEFQT0lOVEVSCTB4MDIgLyogTy9PICovCisjZGVmaW5lIE1TR19SRVNUT1JFUE9JTlRFUlMJMHgwMyAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0RJU0NPTk5FQ1QJCTB4MDQgLyogTy9PICovCisjZGVmaW5lIE1TR19JTklUSUFUT1JfREVUX0VSUgkweDA1IC8qIE0vTSAqLworI2RlZmluZSBNU0dfQUJPUlQJCTB4MDYgLyogTy9NICovCisjZGVmaW5lIE1TR19NRVNTQUdFX1JFSkVDVAkweDA3IC8qIE0vTSAqLworI2RlZmluZSBNU0dfTk9PUAkJMHgwOCAvKiBNL00gKi8KKyNkZWZpbmUgTVNHX1BBUklUWV9FUlJPUgkweDA5IC8qIE0vTSAqLworI2RlZmluZSBNU0dfTElOS19DTURfQ09NUExFVEUJMHgwYSAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX0xJTktfQ01EX0NPTVBMRVRFRgkweDBiIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQlVTX0RFVl9SRVNFVAkweDBjIC8qIE8vTSAqLworI2RlZmluZSBNU0dfQUJPUlRfVEFHCQkweDBkIC8qIE8vTyAqLworI2RlZmluZSBNU0dfQ0xFQVJfUVVFVUUJCTB4MGUgLyogTy9PICovCisjZGVmaW5lIE1TR19JTklUX1JFQ09WRVJZCTB4MGYgLyogTy9PICovCisjZGVmaW5lIE1TR19SRUxfUkVDT1ZFUlkJMHgxMCAvKiBPL08gKi8KKyNkZWZpbmUgTVNHX1RFUk1fSU9fUFJPQwkweDExIC8qIE8vTyAqLworCisvKiBNZXNzYWdlcyAoMiBieXRlKSAqLworI2RlZmluZSBNU0dfU0lNUExFX1FfVEFHCTB4MjAgLyogTy9PICovCisjZGVmaW5lIE1TR19IRUFEX09GX1FfVEFHCTB4MjEgLyogTy9PICovCisjZGVmaW5lIE1TR19PUkRFUkVEX1FfVEFHCTB4MjIgLyogTy9PICovCisjZGVmaW5lIE1TR19JR05fV0lERV9SRVNJRFVFCTB4MjMgLyogTy9PICovCisKKy8qIElkZW50aWZ5IG1lc3NhZ2UgKi8JCSAgICAgLyogTS9NICovCQorI2RlZmluZSBNU0dfSURFTlRJRllGTEFHCTB4ODAgCisjZGVmaW5lIE1TR19JREVOVElGWV9ESVNDRkxBRwkweDQwIAorI2RlZmluZSBNU0dfSURFTlRJRlkobHVuLCBkaXNjKQkoKChkaXNjKSA/IDB4YzAgOiBNU0dfSURFTlRJRllGTEFHKSB8IChsdW4pKQorI2RlZmluZSBNU0dfSVNJREVOVElGWShtKQkoKG0pICYgTVNHX0lERU5USUZZRkxBRykKKworLyogRXh0ZW5kZWQgbWVzc2FnZXMgKG9wY29kZSBhbmQgbGVuZ3RoKSAqLworI2RlZmluZSBNU0dfRVhUX1NEVFIJCTB4MDEKKyNkZWZpbmUgTVNHX0VYVF9TRFRSX0xFTgkweDAzCisKKyNkZWZpbmUgTVNHX0VYVF9XRFRSCQkweDAzCisjZGVmaW5lIE1TR19FWFRfV0RUUl9MRU4JMHgwMgorI2RlZmluZSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUCTB4MDAKKyNkZWZpbmUgTVNHX0VYVF9XRFRSX0JVU18xNl9CSVQJMHgwMQorI2RlZmluZSBNU0dfRVhUX1dEVFJfQlVTXzMyX0JJVAkweDAyCisKKyNkZWZpbmUgTVNHX0VYVF9QUFIgICAgIDB4MDQKKyNkZWZpbmUgTVNHX0VYVF9QUFJfTEVOCTB4MDYKKyNkZWZpbmUgTVNHX0VYVF9QUFJfT1BUSU9OX1NUIDB4MDAKKyNkZWZpbmUgTVNHX0VYVF9QUFJfT1BUSU9OX0RUX0NSQyAweDAyCisjZGVmaW5lIE1TR19FWFRfUFBSX09QVElPTl9EVF9VTklUUyAweDAzCisjZGVmaW5lIE1TR19FWFRfUFBSX09QVElPTl9EVF9DUkNfUVVJQ0sgMHgwNAorI2RlZmluZSBNU0dfRVhUX1BQUl9PUFRJT05fRFRfVU5JVFNfUVVJQ0sgMHgwNQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL3NlcXVlbmNlci5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL3NlcXVlbmNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjY4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvc2VxdWVuY2VyLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBJbnN0cnVjdGlvbiBmb3JtYXRzIGZvciB0aGUgc2VxdWVuY2VyIHByb2dyYW0gZG93bmxvYWRlZCB0bworICogQWljN3h4eCBTQ1NJIGhvc3QgYWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTggSnVzdGluIFQuIEdpYmJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFdoZXJlIHRoaXMgU29mdHdhcmUgaXMgY29tYmluZWQgd2l0aCBzb2Z0d2FyZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAgICAgICRJZDogc2VxdWVuY2VyLmgsdiAxLjMgMTk5Ny8wOS8yNyAxOTozNzozMSBnaWJicyBFeHAgJAorICovCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKK3N0cnVjdCBpbnNfZm9ybWF0MSB7CisJdW5zaWduZWQgaW50CisJCQlpbW1lZGlhdGUJOiA4LAorCQkJc291cmNlCQk6IDksCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlyZXQJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcGFyaXR5CQk6IDE7Cit9OworCitzdHJ1Y3QgaW5zX2Zvcm1hdDIgeworCXVuc2lnbmVkIGludAorCQkJc2hpZnRfY29udHJvbAk6IDgsCisJCQlzb3VyY2UJCTogOSwKKwkJCWRlc3RpbmF0aW9uCTogOSwKKwkJCXJldAkJOiAxLAorCQkJb3Bjb2RlCQk6IDQsCisJCQlwYXJpdHkJCTogMTsKK307CisKK3N0cnVjdCBpbnNfZm9ybWF0MyB7CisJdW5zaWduZWQgaW50CisJCQlpbW1lZGlhdGUJOiA4LAorCQkJc291cmNlCQk6IDksCisJCQlhZGRyZXNzCQk6IDEwLAorCQkJb3Bjb2RlCQk6IDQsCisJCQlwYXJpdHkJCTogMTsKK307CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKK3N0cnVjdCBpbnNfZm9ybWF0MSB7CisJdW5zaWduZWQgaW50CisJCQlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJcmV0CQk6IDEsCisJCQlkZXN0aW5hdGlvbgk6IDksCisJCQlzb3VyY2UJCTogOSwKKwkJCWltbWVkaWF0ZQk6IDg7Cit9OworCitzdHJ1Y3QgaW5zX2Zvcm1hdDIgeworCXVuc2lnbmVkIGludAorCQkJcGFyaXR5CQk6IDEsCisJCQlvcGNvZGUJCTogNCwKKwkJCXJldAkJOiAxLAorCQkJZGVzdGluYXRpb24JOiA5LAorCQkJc291cmNlCQk6IDksCisJCQlzaGlmdF9jb250cm9sCTogODsKK307CisKK3N0cnVjdCBpbnNfZm9ybWF0MyB7CisJdW5zaWduZWQgaW50CisJCQlwYXJpdHkJCTogMSwKKwkJCW9wY29kZQkJOiA0LAorCQkJYWRkcmVzcwkJOiAxMCwKKwkJCXNvdXJjZQkJOiA5LAorCQkJaW1tZWRpYXRlCTogODsKK307CisjZW5kaWYKKwordW5pb24gaW5zX2Zvcm1hdHMgeworCQlzdHJ1Y3QgaW5zX2Zvcm1hdDEgZm9ybWF0MTsKKwkJc3RydWN0IGluc19mb3JtYXQyIGZvcm1hdDI7CisJCXN0cnVjdCBpbnNfZm9ybWF0MyBmb3JtYXQzOworCQl1bnNpZ25lZCBjaGFyCSAgIGJ5dGVzWzRdOworCQl1bnNpZ25lZCBpbnQJICAgaW50ZWdlcjsKK307CitzdHJ1Y3QgaW5zdHJ1Y3Rpb24geworCXVuaW9uCWluc19mb3JtYXRzIGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQJc3JjbGluZTsKKwlzdHJ1Y3Qgc3ltYm9sICpwYXRjaF9sYWJlbDsKKyAgc3RydWN0IHsKKyAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKnN0cWVfbmV4dDsKKyAgfSBsaW5rczsKK307CisKKyNkZWZpbmUJQUlDX09QX09SCTB4MAorI2RlZmluZQlBSUNfT1BfQU5ECTB4MQorI2RlZmluZSBBSUNfT1BfWE9SCTB4MgorI2RlZmluZQlBSUNfT1BfQURECTB4MworI2RlZmluZQlBSUNfT1BfQURDCTB4NAorI2RlZmluZQlBSUNfT1BfUk9MCTB4NQorI2RlZmluZQlBSUNfT1BfQk1PVgkweDYKKworI2RlZmluZQlBSUNfT1BfSk1QCTB4OAorI2RlZmluZSBBSUNfT1BfSkMJMHg5CisjZGVmaW5lIEFJQ19PUF9KTkMJMHhhCisjZGVmaW5lIEFJQ19PUF9DQUxMCTB4YgorI2RlZmluZQlBSUNfT1BfSk5FCTB4YworI2RlZmluZQlBSUNfT1BfSk5aCTB4ZAorI2RlZmluZQlBSUNfT1BfSkUJMHhlCisjZGVmaW5lCUFJQ19PUF9KWgkweGYKKworLyogUHNldWRvIE9wcyAqLworI2RlZmluZQlBSUNfT1BfU0hMCTB4MTAKKyNkZWZpbmUJQUlDX09QX1NIUgkweDIwCisjZGVmaW5lCUFJQ19PUF9ST1IJMHgzMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmMgYi9kcml2ZXJzL3Njc2kvYW1pZ2E3eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjEzNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIE5DUjUzYzcxMCBiYXNlZCBBbWlnYSBTQ1NJIENvbnRyb2xsZXJzIGZvciBMaW51eC4KKyAqCQlBbWlnYSBNYWNyb1N5c3RlbVVTIFdhcnBFbmdpbmUgU0NTSSBjb250cm9sbGVyLgorICoJCUFtaWdhIFRlY2hub2xvZ2llcyBBNDAwMFQgU0NTSSBjb250cm9sbGVyLgorICoJCUFtaWdhIFRlY2hub2xvZ2llcy9ES0IgQTQwOTEgU0NTSSBjb250cm9sbGVyLgorICoKKyAqIFdyaXR0ZW4gMTk5NyBieSBBbGFuIEhvdXJpaGFuZSA8YWxhbmhAZmFpcmxpdGUuZGVtb24uY28udWs+CisgKiBwbHVzIG1vZGlmaWNhdGlvbnMgb2YgdGhlIDUzYzd4eC5jIGRyaXZlciB0byBzdXBwb3J0IHRoZSBBbWlnYS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiNTNjN3h4LmgiCisjaW5jbHVkZSAiYW1pZ2E3eHguaCIKKworCitzdGF0aWMgaW50IGFtaWdhN3h4X3JlZ2lzdGVyX29uZShTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQsCisJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKyAgICBsb25nIGxvbmcgb3B0aW9uczsKKyAgICBpbnQgY2xvY2s7CisKKyAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyZXNzLCAweDEwMDAsICJuY3I1M2M3MTAiKSkKKwlyZXR1cm4gMDsKKworICAgIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl6X2lvcmVtYXAoYWRkcmVzcywgMHgxMDAwKTsKKyAgICBvcHRpb25zID0gT1BUSU9OX01FTU9SWV9NQVBQRUQgfCBPUFRJT05fREVCVUdfVEVTVDEgfCBPUFRJT05fSU5URkxZIHwKKwkgICAgICBPUFRJT05fU1lOQ0hST05PVVMgfCBPUFRJT05fQUxXQVlTX1NZTkNIUk9OT1VTIHwKKwkgICAgICBPUFRJT05fRElTQ09OTkVDVDsKKyAgICBjbG9jayA9IDUwMDAwMDAwOwkvKiA1MCBNSHogU0NTSSBDbG9jayAqLworICAgIG5jcjUzYzd4eF9pbml0KHRwbnQsIDAsIDcxMCwgYWRkcmVzcywgMCwgSVJRX0FNSUdBX1BPUlRTLCBETUFfTk9ORSwKKwkJICAgb3B0aW9ucywgY2xvY2spOworICAgIHJldHVybiAxOworfQorCisKKyNpZmRlZiBDT05GSUdfWk9SUk8KKworc3RhdGljIHN0cnVjdCB7CisgICAgem9ycm9faWQgaWQ7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgaW50IGFic29sdXRlOwkvKiBvZmZzZXQgaXMgYWJzb2x1dGUgYWRkcmVzcyAqLworfSBhbWlnYTd4eF90YWJsZVtdID0geworICAgIHsgLmlkID0gWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfNjAzRV9QTFVTLCAub2Zmc2V0ID0gMHhmNDAwMDAsCisgICAgICAuYWJzb2x1dGUgPSAxIH0sCisgICAgeyAuaWQgPSBaT1JST19QUk9EX01BQ1JPU1lTVEVNU19XQVJQX0VOR0lORV80MHh4LCAub2Zmc2V0ID0gMHg0MDAwMCB9LAorICAgIHsgLmlkID0gWk9SUk9fUFJPRF9DQk1fQTQwOTFfMSwgLm9mZnNldCA9IDB4ODAwMDAwIH0sCisgICAgeyAuaWQgPSBaT1JST19QUk9EX0NCTV9BNDA5MV8yLCAub2Zmc2V0ID0gMHg4MDAwMDAgfSwKKyAgICB7IC5pZCA9IFpPUlJPX1BST0RfR1ZQX0dGT1JDRV8wNDBfMDYwLCAub2Zmc2V0ID0gMHg0MDAwMCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbWlnYTd4eF96b3Jyb19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIGludCBudW0gPSAwLCBpOworICAgIHN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKworICAgIHdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkpIHsKKwlmb3IgKGkgPSAwOyBhbWlnYTd4eF90YWJsZVtpXS5pZDsgaSsrKQorCSAgICBpZiAoei0+aWQgPT0gYW1pZ2E3eHhfdGFibGVbaV0uaWQpCisJCWJyZWFrOworCWlmICghYW1pZ2E3eHhfdGFibGVbaV0uaWQpCisJICAgIGNvbnRpbnVlOworCWlmIChhbWlnYTd4eF90YWJsZVtpXS5hYnNvbHV0ZSkKKwkgICAgYWRkcmVzcyA9IGFtaWdhN3h4X3RhYmxlW2ldLm9mZnNldDsKKwllbHNlCisJICAgIGFkZHJlc3MgPSB6LT5yZXNvdXJjZS5zdGFydCArIGFtaWdhN3h4X3RhYmxlW2ldLm9mZnNldDsKKwludW0gKz0gYW1pZ2E3eHhfcmVnaXN0ZXJfb25lKHRwbnQsIGFkZHJlc3MpOworICAgIH0KKyAgICByZXR1cm4gbnVtOworfQorCisjZW5kaWYgLyogQ09ORklHX1pPUlJPICovCisKKworaW50IF9faW5pdCBhbWlnYTd4eF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhbGxlZCA9IDA7CisgICAgaW50IG51bSA9IDA7CisKKyAgICBpZiAoY2FsbGVkIHx8ICFNQUNIX0lTX0FNSUdBKQorCXJldHVybiAwOworCisgICAgdHBudC0+cHJvY19uYW1lID0gIkFtaWdhN3h4IjsKKworICAgIGlmIChBTUlHQUhXX1BSRVNFTlQoQTQwMDBfU0NTSSkpCisJbnVtICs9IGFtaWdhN3h4X3JlZ2lzdGVyX29uZSh0cG50LCAweGRkMDA0MCk7CisKKyNpZmRlZiBDT05GSUdfWk9SUk8KKyAgICBudW0gKz0gYW1pZ2E3eHhfem9ycm9fZGV0ZWN0KHRwbnQpOworI2VuZGlmCisKKyAgICBjYWxsZWQgPSAxOworICAgIHJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQgYW1pZ2E3eHhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9ICJBbWlnYSBOQ1I1M2M3MTAgU0NTSSIsCisJLmRldGVjdAkJCT0gYW1pZ2E3eHhfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGFtaWdhN3h4X3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBOQ1I1M2M3eHhfcXVldWVfY29tbWFuZCwKKwkuYWJvcnQJCQk9IE5DUjUzYzd4eF9hYm9ydCwKKwkucmVzZXQJCQk9IE5DUjUzYzd4eF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDI0LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSA2MywKKwkuY21kX3Blcl9sdW4JCT0gMywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmggYi9kcml2ZXJzL3Njc2kvYW1pZ2E3eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M1NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FtaWdhN3h4LmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBBTUlHQTdYWF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYW1pZ2E3eHhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2NvbnN0IGNoYXIgKk5DUjUzYzd4MF9pbmZvKHZvaWQpOworaW50IE5DUjUzYzd4eF9xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCBOQ1I1M2M3eHhfYWJvcnQoU2NzaV9DbW5kICopOworaW50IE5DUjUzYzd4MF9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworaW50IE5DUjUzYzd4eF9yZXNldChTY3NpX0NtbmQgKiwgdW5zaWduZWQgaW50KTsKK3ZvaWQgTkNSNTNjN3gwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDMKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMjQKKyNlbmRpZgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNlbmRpZiAvKiBBTUlHQTdYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvYXJtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiMzI4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vS2NvbmZpZwpAQCAtMCwwICsxLDg5IEBACisjCisjIFNDU0kgZHJpdmVyIGNvbmZpZ3VyYXRpb24gZm9yIEFjb3JuCisjCitjb25maWcgU0NTSV9BQ09STlNDU0lfMworCXRyaXN0YXRlICJBY29ybiBTQ1NJIGNhcmQgKGFrYTMwKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBY29ybiBTQ1NJIGNhcmQgKGFrYTMwKS4gSWYgeW91IGhhdmUgYW4KKwkgIEFjb3JuIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSwgc2F5IFkuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ1NJX0FDT1JOU0NTSV9UQUdHRURfUVVFVUUKKwlib29sICJTdXBwb3J0IFNDU0kgMiBUYWdnZWQgcXVldWVpbmciCisJZGVwZW5kcyBvbiBTQ1NJX0FDT1JOU0NTSV8zCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGFnZ2VkIHF1ZXVpbmcgc3VwcG9ydCBvbiB0aGUgQWNvcm4gU0NTSSBjYXJkLgorCisJICBUaGlzIGlzIGEgZmVhdHVyZSBvZiBTQ1NJLTIgd2hpY2ggaW1wcm92ZXMgcGVyZm9ybWFuY2U6IHRoZSBob3N0CisJICBhZGFwdGVyIGNhbiBzZW5kIHNldmVyYWwgU0NTSSBjb21tYW5kcyB0byBhIGRldmljZSdzIHF1ZXVlIGV2ZW4gaWYKKwkgIHByZXZpb3VzIGNvbW1hbmRzIGhhdmVuJ3QgZmluaXNoZWQgeWV0LiBTb21lIFNDU0kgZGV2aWNlcyBkb24ndAorCSAgaW1wbGVtZW50IHRoaXMgcHJvcGVybHksIHNvIHRoZSBzYWZlIGFuc3dlciBpcyBOLgorCitjb25maWcgU0NTSV9BQ09STlNDU0lfU1lOQworCWJvb2wgIlN1cHBvcnQgU0NTSSAyIFN5bmNocm9ub3VzIFRyYW5zZmVycyIKKwlkZXBlbmRzIG9uIFNDU0lfQUNPUk5TQ1NJXzMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzeW5jaHJvbm91cyB0cmFuc2ZlciBuZWdvdGlhdGlvbiB3aXRoIGFsbAorCSAgdGFyZ2V0cyBvbiB0aGUgQWNvcm4gU0NTSSBjYXJkLgorCisJICBJbiBnZW5lcmFsLCB0aGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlOyBob3dldmVyIHNvbWUgU0NTSSBkZXZpY2VzCisJICBkb24ndCBpbXBsZW1lbnQgaXQgcHJvcGVybHksIHNvIHRoZSBzYWZlIGFuc3dlciBpcyBOLgorCitjb25maWcgU0NTSV9BUlhFU0NTSQorCXRyaXN0YXRlICJBUlhFIFNDU0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQUNPUk4gJiYgU0NTSQorCWhlbHAKKwkgIEFyb3VuZCAxOTkxLCBBcnhlIFN5c3RlbXMgTGltaXRlZCByZWxlYXNlZCBhIGhpZ2ggZGVuc2l0eSBmbG9wcHkKKwkgIGRpc2MgaW50ZXJmYWNlIGZvciB0aGUgQWNvcm4gQXJjaGltZWRlcyByYW5nZSwgdG8gYWxsb3cgdGhlIHVzZSBvZgorCSAgSEQgZGlzY3MgZnJvbSB0aGUgdGhlbiBuZXcgQTUwMDAgb24gZWFybGllciBtb2RlbHMuIFRoaXMgaW50ZXJmYWNlCisJICB3YXMgZWl0aGVyIHNvbGQgb24gaXRzIG93biBvciB3aXRoIGFuIGludGVncmFsIFNDU0kgY29udHJvbGxlci4KKwkgIFRlY2huaWNhbCBkZXRhaWxzIG9uIHRoaXMgTkNSNTNjOTQtYmFzZWQgZGV2aWNlIGFyZSBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LmNyeXRvbi5kZW1vbi5jby51ay9hY29ybmJpdHMvc2NzaV9hcnhlLmh0bWw+CisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgdGhlIFNDU0kgY29udHJvbGxlci4KKworY29uZmlnIFNDU0lfQ1VNQU5BXzIKKwl0cmlzdGF0ZSAiQ3VtYW5hU0NTSSBJSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDdW1hbmEgU0NTSSBJSSBjYXJkLiBJZiB5b3UgaGF2ZSBhbgorCSAgQWNvcm4gc3lzdGVtIHdpdGggb25lIG9mIHRoZXNlLCBzYXkgWS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfRUVTT1hTQ1NJCisJdHJpc3RhdGUgIkVFU09YIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEVFU09YIFNDU0kgY2FyZC4gSWYgeW91IGhhdmUgYW4gQWNvcm4KKwkgIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSwgc2F5IFksIG90aGVyd2lzZSBzYXkgTi4KKworY29uZmlnIFNDU0lfUE9XRVJURUNTQ1NJCisJdHJpc3RhdGUgIlBvd2VyVGVjIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIFNDU0kKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBvd2VydGVjIFNDU0kgY2FyZCBvbiBBY29ybiBzeXN0ZW1zLiBJZgorCSAgeW91IGhhdmUgb25lIG9mIHRoZXNlLCBzYXkgWS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAiVGhlIGZvbGxvd2luZyBkcml2ZXJzIGFyZSBub3QgZnVsbHkgc3VwcG9ydGVkIgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBFWFBFUklNRU5UQUwKKworY29uZmlnIFNDU0lfQ1VNQU5BXzEKKwl0cmlzdGF0ZSAiQ3VtYW5hU0NTSSBJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBUkNIX0FDT1JOICYmIEVYUEVSSU1FTlRBTCAmJiBTQ1NJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDdW1hbmEgU0NTSSBJIGNhcmQuIElmIHlvdSBoYXZlIGFuCisJICBBY29ybiBzeXN0ZW0gd2l0aCBvbmUgb2YgdGhlc2UsIHNheSBZLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NTSV9FQ09TQ1NJCisJdHJpc3RhdGUgIkVjb1Njc2kgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFSQ0hfQUNPUk4gJiYgRVhQRVJJTUVOVEFMICYmIChBUkNIX0FSQyB8fCBBUkNIX0E1SykgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRWNvU0NTSSBjYXJkIC0tIGEgc21hbGwgY2FyZCB0aGF0IHNpdHMKKwkgIGluIHRoZSBFY29uZXQgc29ja2V0LiBJZiB5b3UgaGF2ZSBhbiBBY29ybiBzeXN0ZW0gd2l0aCBvbmUgb2YgdGhlc2UsCisJICBzYXkgWS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNDU0lfT0FLMQorCXRyaXN0YXRlICJPYWsgU0NTSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVJDSF9BQ09STiAmJiBFWFBFUklNRU5UQUwgJiYgU0NTSQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgT2FrIFNDU0kgY2FyZC4gSWYgeW91IGhhdmUgYW4gQWNvcm4KKwkgIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSwgc2F5IFkuIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvYXJtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGRyaXZlcnMvc2NzaS9hcm0KKyMKKworYWNvcm5zY3NpX21vZC1vYmpzCTo9IGFjb3Juc2NzaS5vIGFjb3Juc2NzaS1pby5vCisKK29iai0kKENPTkZJR19TQ1NJX0FDT1JOU0NTSV8zKQkrPSBhY29ybnNjc2lfbW9kLm8gcXVldWUubyBtc2dxdWV1ZS5vCitvYmotJChDT05GSUdfU0NTSV9BUlhFU0NTSSkJKz0gYXJ4ZXNjc2kubyBmYXMyMTYubyBxdWV1ZS5vIG1zZ3F1ZXVlLm8KK29iai0kKENPTkZJR19TQ1NJX0NVTUFOQV8xKQkrPSBjdW1hbmFfMS5vCitvYmotJChDT05GSUdfU0NTSV9DVU1BTkFfMikJKz0gY3VtYW5hXzIubyBmYXMyMTYubyBxdWV1ZS5vIG1zZ3F1ZXVlLm8KK29iai0kKENPTkZJR19TQ1NJX0VDT1NDU0kpCSs9IGVjb3Njc2kubworb2JqLSQoQ09ORklHX1NDU0lfT0FLMSkJCSs9IG9hay5vCitvYmotJChDT05GSUdfU0NTSV9QT1dFUlRFQ1NDU0kpCSs9IHBvd2VydGVjLm8gZmFzMjE2Lm8gcXVldWUubyBtc2dxdWV1ZS5vCitvYmotJChDT05GSUdfU0NTSV9FRVNPWFNDU0kpCSs9IGVlc294Lm8gZmFzMjE2Lm8gcXVldWUubyBtc2dxdWV1ZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS1pby5TIGIvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2ktaW8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ2N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2ktaW8uUwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvYWNvcm5zY3NpLWlvLlM6IEFjb3JuIFNDU0kgY2FyZCBJTworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNpZiAoSU9fQkFTRSA9PSAoUENJT19CQVNFICYgMHhmZjAwMDAwMCkpCisjZGVmaW5lIEFERFIob2ZmLHJlZykJCQkJCQlcCisJCXRzdAlvZmYsICQweDgwMDAwMDAwCQkJO1wKKwkJbW92CXJlZywgJElPX0JBU0UJCQkJO1wKKwkJb3JyZXEJcmVnLCByZWcsICQoUENJT19CQVNFICYgMHgwMGZmMDAwMCkKKyNlbHNlCisjZGVmaW5lIEFERFIob2ZmLHJlZykJCQkJCQlcCisJCXRzdAlvZmYsICQweDgwMDAwMDAwCQkJO1wKKwkJbW92bmUJcmVnLCAkSU9fQkFTRQkJCQk7XAorCQltb3ZlcQlyZWcsICQoUENJT19CQVNFICYgMHhmZjAwMDAwMCkJCTtcCisJCW9ycmVxCXJlZywgcmVnLCAkKFBDSU9fQkFTRSAmIDB4MDBmZjAwMDApCisjZW5kaWYKKworQCBQdXJwb3NlOiB0cmFuc2ZlciBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgYWNvcm4gc2NzaSBjYXJkIHRvIG1lbW9yeQorQCBQcm90byAgOiB2b2lkIGFjb3Juc2NzaV9pbih1bnNpZ25lZCBpbnQgYWRkcl9zdGFydCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorQCBSZXR1cm5zOiBub3RoaW5nCisKKwkJLmFsaWduCitFTlRSWShfX2Fjb3Juc2NzaV9pbikKKwkJc3RtZmQJc3AhLCB7cjQgLSByNywgbHJ9CisJCWJpYwlyMCwgcjAsICMzCisJCW1vdglsciwgIzB4ZmYKKwkJb3JyCWxyLCBsciwgIzB4ZmYwMAorYWNvcm5zY3NpX2luMTZscDoKKwkJc3VicwlyMiwgcjIsICMxNgorCQlibWkJYWNvcm5zY3NpX2luOAorCQlsZG1pYQlyMCEsIHtyMywgcjQsIHI1LCByNn0KKwkJYW5kCXIzLCByMywgbHIKKwkJb3JyCXIzLCByMywgcjQsIGxzbCAjMTYKKwkJYW5kIAlyNCwgcjUsIGxyCisJCW9ycglyNCwgcjQsIHI2LCBsc2wgIzE2CisJCWxkbWlhCXIwISwge3I1LCByNiwgcjcsIGlwfQorCQlhbmQJcjUsIHI1LCBscgorCQlvcnIJcjUsIHI1LCByNiwgbHNsICMxNgorCQlhbmQJcjYsIHI3LCBscgorCQlvcnIJcjYsIHI2LCBpcCwgbHNsICMxNgorCQlzdG1pYQlyMSEsIHtyMyAtIHI2fQorCQlibmUJYWNvcm5zY3NpX2luMTZscAorCQlMT0FEUkVHUyhmZCwgc3AhLCB7cjQgLSByNywgcGN9KQorCithY29ybnNjc2lfaW44OglhZGRzCXIyLCByMiwgIzgKKwkJYm1pCWFjb3Juc2NzaV9pbjQKKwkJbGRtaWEJcjAhLCB7cjMsIHI0LCByNSwgcjZ9CisJCWFuZAlyMywgcjMsIGxyCisJCW9ycglyMywgcjMsIHI0LCBsc2wgIzE2CisJCWFuZAlyNCwgcjUsIGxyCisJCW9ycglyNCwgcjQsIHI2LCBsc2wgIzE2CisJCXN0bWlhCXIxISwge3IzIC0gcjR9CisJCUxPQURSRUdTKGVxZmQsIHNwISwge3I0IC0gcjcsIHBjfSkKKwkJc3ViCXIyLCByMiwgIzgKKworYWNvcm5zY3NpX2luNDoJYWRkcwlyMiwgcjIsICM0CisJCWJtaQlhY29ybnNjc2lfaW4yCisJCWxkbWlhCXIwISwge3IzLCByNH0KKwkJYW5kCXIzLCByMywgbHIKKwkJb3JyCXIzLCByMywgcjQsIGxzbCAjMTYKKwkJc3RyCXIzLCBbcjFdLCAjNAorCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCAtIHI3LCBwY30pCisJCXN1YglyMiwgcjIsICM0CisKK2Fjb3Juc2NzaV9pbjI6CWFkZHMJcjIsIHIyLCAjMgorCQlsZHIJcjMsIFtyMF0sICM0CisJCWFuZAlyMywgcjMsIGxyCisJCXN0cmIJcjMsIFtyMV0sICMxCisJCW1vdglyMywgcjMsIGxzciAjOAorCQlzdHJwbGIJcjMsIFtyMV0sICMxCisJCUxPQURSRUdTKGZkLCBzcCEsIHtyNCAtIHI3LCBwY30pCisKK0AgUHVycG9zZTogdHJhbnNmZXIgYSBibG9jayBvZiBkYXRhIGZyb20gbWVtb3J5IHRvIHRoZSBhY29ybiBzY3NpIGNhcmQKK0AgUHJvdG8gIDogdm9pZCBhY29ybnNjc2lfaW4odW5zaWduZWQgaW50IGFkZHJfc3RhcnQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK0AgUmV0dXJuczogbm90aGluZworCitFTlRSWShfX2Fjb3Juc2NzaV9vdXQpCisJCXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQorCQliaWMJcjAsIHIwLCAjMworYWNvcm5zY3NpX291dDE2bHA6CisJCXN1YnMJcjIsIHIyLCAjMTYKKwkJYm1pCWFjb3Juc2NzaV9vdXQ4CisJCWxkbWlhCXIxISwge3I0LCByNiwgaXAsIGxyfQorCQltb3YJcjMsIHI0LCBsc2wgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc3IgIzE2CisJCW1vdglyNCwgcjQsIGxzciAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJbW92CXI1LCByNiwgbHNsICMxNgorCQlvcnIJcjUsIHI1LCByNSwgbHNyICMxNgorCQltb3YJcjYsIHI2LCBsc3IgIzE2CisJCW9ycglyNiwgcjYsIHI2LCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNCwgcjUsIHI2fQorCQltb3YJcjMsIGlwLCBsc2wgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc3IgIzE2CisJCW1vdglyNCwgaXAsIGxzciAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJbW92CWlwLCBsciwgbHNsICMxNgorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICMxNgorCQltb3YJbHIsIGxyLCBsc3IgIzE2CisJCW9ycglsciwgbHIsIGxyLCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNCwgaXAsIGxyfQorCQlibmUJYWNvcm5zY3NpX291dDE2bHAKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjYsIHBjfSkKKworYWNvcm5zY3NpX291dDg6CWFkZHMJcjIsIHIyLCAjOAorCQlibWkJYWNvcm5zY3NpX291dDQKKwkJbGRtaWEJcjEhLCB7cjQsIHI2fQorCQltb3YJcjMsIHI0LCBsc2wgIzE2CisJCW9ycglyMywgcjMsIHIzLCBsc3IgIzE2CisJCW1vdglyNCwgcjQsIGxzciAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJbW92CXI1LCByNiwgbHNsICMxNgorCQlvcnIJcjUsIHI1LCByNSwgbHNyICMxNgorCQltb3YJcjYsIHI2LCBsc3IgIzE2CisJCW9ycglyNiwgcjYsIHI2LCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNCwgcjUsIHI2fQorCQlMT0FEUkVHUyhlcWZkLCBzcCEsIHtyNCAtIHI2LCBwY30pCisKKwkJc3ViCXIyLCByMiwgIzgKK2Fjb3Juc2NzaV9vdXQ0OglhZGRzCXIyLCByMiwgIzQKKwkJYm1pCWFjb3Juc2NzaV9vdXQyCisJCWxkcglyNCwgW3IxXSwgIzQKKwkJbW92CXIzLCByNCwgbHNsICMxNgorCQlvcnIJcjMsIHIzLCByMywgbHNyICMxNgorCQltb3YJcjQsIHI0LCBsc3IgIzE2CisJCW9ycglyNCwgcjQsIHI0LCBsc2wgIzE2CisJCXN0bWlhCXIwISwge3IzLCByNH0KKwkJTE9BRFJFR1MoZXFmZCwgc3AhLCB7cjQgLSByNiwgcGN9KQorCisJCXN1YglyMiwgcjIsICM0CithY29ybnNjc2lfb3V0MjoJYWRkcwlyMiwgcjIsICMyCisJCWxkcglyMywgW3IxXSwgIzIKKwkJc3RyYglyMywgW3IwXSwgIzEKKwkJbW92CXIzLCByMywgbHNyICM4CisJCXN0cnBsYglyMywgW3IwXSwgIzEKKwkJTE9BRFJFR1MoZmQsIHNwISwge3I0IC0gcjYsIHBjfSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkZDBiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKQEAgLTAsMCArMSwzMTMwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vc2NzaS9hY29ybnNjc2kuYworICoKKyAqICBBY29ybiBTQ1NJIDMgZHJpdmVyCisgKiAgQnkgUi5NLktpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBYmFuZG9uZWQgdXNpbmcgdGhlIFNlbGVjdCBhbmQgVHJhbnNmZXIgY29tbWFuZCBzaW5jZSB0aGVyZSB3ZXJlCisgKiBzb21lIG5hc3R5IHJhY2VzIGJldHdlZW4gb3VyIHNvZnR3YXJlIGFuZCB0aGUgdGFyZ2V0IGRldmljZXMgdGhhdAorICogd2VyZSBub3QgZWFzeSB0byBzb2x2ZSwgYW5kIHRoZSBkZXZpY2UgZXJyYXRhIGhhZCBhIGxvdCBvZiBlbnRyaWVzCisgKiBmb3IgdGhpcyBjb21tYW5kLCBzb21lIG9mIHRoZW0gcXVpdGUgbmFzdHkuLi4KKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAgMjYtU2VwLTE5OTcJUk1LCVJlLWppZ2dlZCB0byB1c2UgdGhlIHF1ZXVlIG1vZHVsZS4KKyAqCQkJUmUtY29kZWQgc3RhdGUgbWFjaGluZSB0byBiZSBiYXNlZCBvbiBkcml2ZXIKKyAqCQkJc3RhdGUgbm90IHNjc2kgc3RhdGUuICBTaG91bGQgYmUgZWFzaWVyIHRvIGRlYnVnLgorICoJCQlBZGRlZCBhY29ybnNjc2lfcmVsZWFzZSB0byBjbGVhbiB1cCBwcm9wZXJseS4KKyAqCQkJVXBkYXRlZCBwcm9jL3Njc2kgcmVwb3J0aW5nLgorICogIDA1LU9jdC0xOTk3CVJNSwlJbXBsZW1lbnRlZCB3cml0aW5nIHRvIFNDU0kgZGV2aWNlcy4KKyAqICAwNi1PY3QtMTk5NwlSTUsJQ29ycmVjdGVkIHNtYWxsIChub24tc2VyaW91cykgYnVnIHdpdGggdGhlIGNvbm5lY3QvCisgKgkJCXJlY29ubmVjdCByYWNlIGNvbmRpdGlvbiBjYXVzaW5nIGEgd2FybmluZyBtZXNzYWdlLgorICogIDEyLU9jdC0xOTk3CVJNSwlBZGRlZCBjYXRjaCBmb3IgcmUtZW50ZXJpbmcgaW50ZXJydXB0IHJvdXRpbmUuCisgKiAgMTUtT2N0LTE5OTcJUk1LCUltcHJvdmVkIGhhbmRsaW5nIG9mIGNvbW1hbmRzLgorICogIDI3LUp1bi0xOTk4CVJNSwlDaGFuZ2VkIGFzbS9kZWxheS5oIHRvIGxpbnV4L2RlbGF5LmguCisgKiAgMTMtRGVjLTE5OTgJUk1LCUJldHRlciBhYm9ydCBjb2RlIGFuZCBjb21tYW5kIGhhbmRsaW5nLiAgRXh0cmEgc3RhdGUKKyAqCQkJdHJhbnNpdGlvbnMgYWRkZWQgdG8gYWxsb3cgZG9kZ3kgZGV2aWNlcyB0byB3b3JrLgorICovCisjZGVmaW5lIERFQlVHX05PX1dSSVRFCTEKKyNkZWZpbmUgREVCVUdfUVVFVUVTCTIKKyNkZWZpbmUgREVCVUdfRE1BCTQKKyNkZWZpbmUgREVCVUdfQUJPUlQJOAorI2RlZmluZSBERUJVR19ESVNDT04JMTYKKyNkZWZpbmUgREVCVUdfQ09OTkVDVAkzMgorI2RlZmluZSBERUJVR19QSEFTRVMJNjQKKyNkZWZpbmUgREVCVUdfV1JJVEUJMTI4CisjZGVmaW5lIERFQlVHX0xJTksJMjU2CisjZGVmaW5lIERFQlVHX01FU1NBR0VTCTUxMgorI2RlZmluZSBERUJVR19SRVNFVAkxMDI0CisjZGVmaW5lIERFQlVHX0FMTAkoREVCVUdfUkVTRVR8REVCVUdfTUVTU0FHRVN8REVCVUdfTElOS3xERUJVR19XUklURXxcCisJCQkgREVCVUdfUEhBU0VTfERFQlVHX0NPTk5FQ1R8REVCVUdfRElTQ09OfERFQlVHX0FCT1JUfFwKKwkJCSBERUJVR19ETUF8REVCVUdfUVVFVUVTKQorCisvKiBEUklWRVIgQ09ORklHVVJBVElPTgorICoKKyAqIFNDU0ktSUkgVGFnZ2VkIHF1ZXVlIHN1cHBvcnQuCisgKgorICogSSBkb24ndCBoYXZlIGFueSBTQ1NJIGRldmljZXMgdGhhdCBzdXBwb3J0IGl0LCBzbyBpdCBpcyB0b3RhbGx5IHVudGVzdGVkCisgKiAoZXhjZXB0IHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggYW55IG5vbi10YWdnaW5nCisgKiBkZXZpY2VzKS4gIEl0IGlzIG5vdCBmdWxseSBpbXBsZW1lbnRlZCBlaXRoZXIgLSB3aGF0IGhhcHBlbnMgd2hlbiBhCisgKiB0YWdnaW5nIGRldmljZSByZWNvbm5lY3RzPz8/CisgKgorICogWW91IGNhbiB0ZWxsIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgc3VwcG9ydHMgdGFnZ2VkIHF1ZXVlaW5nIG15CisgKiBjYXRpbmcgKGVnKSAvcHJvYy9zY3NpL2Fjb3Juc2NzaS8wIGFuZCBzZWUgaWYgdGhlIFNDU0kgcmV2aXNpb24gaXMgcmVwb3J0ZWQKKyAqIGFzICcyIFRBRycuCisgKgorICogQWxzbyBub3RlIHRoYXQgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRSBpcyBub3JtYWxseSBzZXQgaW4gdGhlIGNvbmZpZworICogc2NyaXB0cywgYnV0IGRpc2FibGVkIGhlcmUuICBPbmNlIGRlYnVnZ2VkLCByZW1vdmUgdGhlICN1bmRlZiwgb3RoZXJ3aXNlIHRvIGRlYnVnLAorICogY29tbWVudCBvdXQgdGhlIHVuZGVmLgorICovCisjdW5kZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorLyoKKyAqIFNDU0ktSUkgTGlua2VkIGNvbW1hbmQgc3VwcG9ydC4KKyAqCisgKiBUaGUgaGlnaGVyIGxldmVsIGNvZGUgZG9lc24ndCBzdXBwb3J0IGxpbmtlZCBjb21tYW5kcyB5ZXQsIGFuZCBzbyB0aGUgb3B0aW9uCisgKiBpcyB1bmRlZidkIGhlcmUuCisgKi8KKyN1bmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfTElOSworLyoKKyAqIFNDU0ktSUkgU3luY2hyb25vdXMgdHJhbnNmZXIgc3VwcG9ydC4KKyAqCisgKiBUcmllZCBhbmQgdGVzdGVkLi4uCisgKgorICogU0RUUl9TSVpFCSAgLSBtYXhpbXVtIG51bWJlciBvZiB1bi1hY2tub3dsZWRnZWQgYnl0ZXMgKDAgPSBvZmYsIDEyID0gbWF4KQorICogU0RUUl9QRVJJT0QJICAtIHBlcmlvZCBvZiBSRVEgc2lnbmFsIChtaW49MTI1LCBtYXg9MTAyMCkKKyAqIERFRkFVTFRfUEVSSU9EIC0gZGVmYXVsdCBSRVEgcGVyaW9kLgorICovCisjZGVmaW5lIFNEVFJfU0laRQkxMgorI2RlZmluZSBTRFRSX1BFUklPRAkxMjUKKyNkZWZpbmUgREVGQVVMVF9QRVJJT0QJNTAwCisKKy8qCisgKiBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBERUJVRwkgIC0gYml0IG1hc2sgZnJvbSBsaXN0IGFib3ZlCisgKiBERUJVR19UQVJHRVQgICAtIGlzIGRlZmluZWQgdG8gdGhlIHRhcmdldCBudW1iZXIgaWYgeW91IHdhbnQgdG8gZGVidWcKKyAqCQkgICAgYSBzcGVjaWZpYyB0YXJnZXQuIFtvbmx5IHJlY29uL3dyaXRlL2RtYV0uCisgKi8KKyNkZWZpbmUgREVCVUcgKERFQlVHX1JFU0VUfERFQlVHX1dSSVRFfERFQlVHX05PX1dSSVRFKQorLyogb25seSBhbGxvdyB3cml0aW5nIHRvIFNDU0kgZGV2aWNlIDAgKi8KKyNkZWZpbmUgTk9fV1JJVEUgMHhGRQorLyojZGVmaW5lIERFQlVHX1RBUkdFVCAyKi8KKy8qCisgKiBTZWxlY3QgdGltZW91dCB0aW1lIChpbiAxMG1zIHVuaXRzKQorICoKKyAqIFRoaXMgaXMgdGhlIHRpbWVvdXQgdXNlZCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBzZWxlY3Rpb24gYW5kIHRoZSBXRDMzQzkzCisgKiBjaGlwIGRlY2lkaW5nIHRoYXQgdGhlIGRldmljZSBpc24ndCByZXNwb25kaW5nLgorICovCisjZGVmaW5lIFRJTUVPVVRfVElNRSAxMAorLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIGhhdmUgdmVyYm9zZSBleHBsYWluYXRpb24gb2YgU0NTSQorICogc3RhdHVzL21lc3NhZ2VzLgorICovCisjdW5kZWYgQ09ORklHX0FDT1JOU0NTSV9DT05TVEFOVFMKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uIGJvYXJkIERNQUMgW2Rvbid0IHJlbW92ZSB0aGlzIG9wdGlvbl0KKyAqIElmIG5vdCBzZXQsIHRoZW4gdXNlIFBJTyBtb2RlIChub3QgY3VycmVudGx5IHN1cHBvcnRlZCkuCisgKi8KKyNkZWZpbmUgVVNFX0RNQUMKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZmRlZiBERUJVR19UQVJHRVQKKyNkZWZpbmUgREJHKGNtZCx4eHguLi4pIFwKKyAgaWYgKGNtZC0+ZGV2aWNlLT5pZCA9PSBERUJVR19UQVJHRVQpIHsgXAorICAgIHh4eDsgXAorICB9CisjZWxzZQorI2RlZmluZSBEQkcoY21kLHh4eC4uLikgeHh4CisjZW5kaWYKKworI2lmbmRlZiBTVFJJTkdJRlkKKyNkZWZpbmUgU1RSSU5HSUZZKHgpICN4CisjZW5kaWYKKyNkZWZpbmUgU1RSeCh4KSBTVFJJTkdJRlkoeCkKKyNkZWZpbmUgTk9fV1JJVEVfU1RSIFNUUngoTk9fV1JJVEUpCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFjb3Juc2NzaS5oIgorI2luY2x1ZGUgIm1zZ3F1ZXVlLmgiCisjaW5jbHVkZSAic2NzaS5oIgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNkZWZpbmUgVkVSX01BSk9SIDIKKyNkZWZpbmUgVkVSX01JTk9SIDAKKyNkZWZpbmUgVkVSX1BBVENIIDYKKworI2lmbmRlZiBBQk9SVF9UQUcKKyNkZWZpbmUgQUJPUlRfVEFHIDB4ZAorI2Vsc2UKKyNlcnJvciAiWWlwcGVlISAgQUJPUlQgVEFHIGlzIG5vdyBkZWZpbmVkISAgUmVtb3ZlIHRoaXMgZXJyb3IhIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfTElOSworI2Vycm9yIFNDU0kyIExJTktlZCBjb21tYW5kcyBub3Qgc3VwcG9ydGVkICh5ZXQpIQorI2VuZGlmCisKKyNpZmRlZiBVU0VfRE1BQworLyoKKyAqIERNQUMgc2V0dXAgcGFyYW1ldGVycworICovIAorI2RlZmluZSBJTklUX0RFVkNPTjAJKERFVkNPTjBfUlFMfERFVkNPTjBfRVhXfERFVkNPTjBfQ01QKQorI2RlZmluZSBJTklUX0RFVkNPTjEJKERFVkNPTjFfQkhMRCkKKyNkZWZpbmUgRE1BQ19SRUFECShNT0RFQ09OX1JFQUQpCisjZGVmaW5lIERNQUNfV1JJVEUJKE1PREVDT05fV1JJVEUpCisjZGVmaW5lIElOSVRfU0JJQ0RNQQkoQ1RSTF9ETUFCVVJTVCkKKworI2RlZmluZSBzY3NpX3hmZXJyZWQJaGF2ZV9kYXRhX2luCisKKy8qCisgKiBTaXplIG9mIG9uLWJvYXJkIERNQSBidWZmZXIKKyAqLworI2RlZmluZSBETUFDX0JVRkZFUl9TSVpFCTY1NTM2CisjZW5kaWYKKworI2RlZmluZSBTVEFUVVNfQlVGRkVSX1RPX1BSSU5UCTI0CisKK3Vuc2lnbmVkIGludCBzZHRyX3BlcmlvZCA9IFNEVFJfUEVSSU9EOwordW5zaWduZWQgaW50IHNkdHJfc2l6ZSAgID0gU0RUUl9TSVpFOworCitzdGF0aWMgdm9pZCBhY29ybnNjc2lfZG9uZShBU19Ib3N0ICpob3N0LCBTY3NpX0NtbmQgKipTQ3BudHAsIHVuc2lnbmVkIGludCByZXN1bHQpOworc3RhdGljIGludCBhY29ybnNjc2lfcmVjb25uZWN0X2ZpbmlzaChBU19Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGFjb3Juc2NzaV9kbWFfY2xlYW51cChBU19Ib3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGFjb3Juc2NzaV9hYm9ydGNtZChBU19Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyIHRhZyk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWlzY2VsbGFuZW91cworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2JpY19hcm1fd3JpdGUodW5zaWduZWQgaW50IGlvX3BvcnQsIGludCByZWcsIGludCB2YWx1ZSkKK3sKKyAgICBfX3Jhd193cml0ZWIocmVnLCBpb19wb3J0KTsKKyAgICBfX3Jhd193cml0ZWIodmFsdWUsIGlvX3BvcnQgKyA0KTsKK30KKworI2RlZmluZSBzYmljX2FybV93cml0ZW5leHQoaW8sdmFsKSBcCisJX19yYXdfd3JpdGViKCh2YWwpLCAoaW8pICsgNCkKKworc3RhdGljIGlubGluZQoraW50IHNiaWNfYXJtX3JlYWQodW5zaWduZWQgaW50IGlvX3BvcnQsIGludCByZWcpCit7CisgICAgaWYocmVnID09IFNCSUNfQVNSKQorCSAgIHJldHVybiBfX3Jhd19yZWFkbChpb19wb3J0KSAmIDI1NTsKKyAgICBfX3Jhd193cml0ZWIocmVnLCBpb19wb3J0KTsKKyAgICByZXR1cm4gX19yYXdfcmVhZGwoaW9fcG9ydCArIDQpICYgMjU1OworfQorCisjZGVmaW5lIHNiaWNfYXJtX3JlYWRuZXh0KGlvKSBcCisJX19yYXdfcmVhZGIoKGlvKSArIDQpCisKKyNpZmRlZiBVU0VfRE1BQworI2RlZmluZSBkbWFjX3JlYWQoaW9fcG9ydCxyZWcpIFwKKwlpbmIoKGlvX3BvcnQpICsgKHJlZykpCisKKyNkZWZpbmUgZG1hY193cml0ZShpb19wb3J0LHJlZyx2YWx1ZSkgXAorCSh7IG91dGIoKHZhbHVlKSwgKGlvX3BvcnQpICsgKHJlZykpOyB9KQorCisjZGVmaW5lIGRtYWNfY2xlYXJpbnRyKGlvX3BvcnQpIFwKKwkoeyBvdXRiKDAsIChpb19wb3J0KSk7IH0pCisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGludCBkbWFjX2FkZHJlc3ModW5zaWduZWQgaW50IGlvX3BvcnQpCit7CisgICAgcmV0dXJuIGRtYWNfcmVhZChpb19wb3J0LCBETUFDX1RYQURSSEkpIDw8IDE2IHwKKwkgICBkbWFjX3JlYWQoaW9fcG9ydCwgRE1BQ19UWEFEUk1EKSA8PCA4IHwKKwkgICBkbWFjX3JlYWQoaW9fcG9ydCwgRE1BQ19UWEFEUkxPKTsKK30KKworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kdW1wZG1hKEFTX0hvc3QgKmhvc3QsIGNoYXIgKndoZXJlKQoreworCXVuc2lnbmVkIGludCBtb2RlLCBhZGRyLCBsZW47CisKKwltb2RlID0gZG1hY19yZWFkKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX01PREVDT04pOworCWFkZHIgPSBkbWFjX2FkZHJlc3MoaG9zdC0+ZG1hLmlvX3BvcnQpOworCWxlbiAgPSBkbWFjX3JlYWQoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhDTlRISSkgPDwgOCB8CisJICAgICAgIGRtYWNfcmVhZChob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19UWENOVExPKTsKKworCXByaW50aygic2NzaSVkOiAlczogRE1BQyAlMDJ4IEAlMDZ4KyUwNHggbXNrICUwMngsICIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIHdoZXJlLAorCQltb2RlLCBhZGRyLCAobGVuICsgMSkgJiAweGZmZmYsCisJCWRtYWNfcmVhZChob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19NQVNLUkVHKSk7CisKKwlwcmludGsoIkRNQSBAJTA2eCwgIiwgaG9zdC0+ZG1hLnN0YXJ0X2FkZHIpOworCXByaW50aygiQkggQCVwICslMDR4LCAiLCBob3N0LT5zY3NpLlNDcC5wdHIsCisJCWhvc3QtPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCXByaW50aygiRFQgQCslMDR4IFNUIEArJTA0eCIsIGhvc3QtPmRtYS50cmFuc2ZlcnJlZCwKKwkJaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkKTsKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljCit1bnNpZ25lZCBsb25nIGFjb3Juc2NzaV9zYmljX3hmY291bnQoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKworICAgIGxlbmd0aCA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1RSQU5TQ05USCkgPDwgMTY7CisgICAgbGVuZ3RoIHw9IHNiaWNfYXJtX3JlYWRuZXh0KGhvc3QtPnNjc2kuaW9fcG9ydCkgPDwgODsKKyAgICBsZW5ndGggfD0gc2JpY19hcm1fcmVhZG5leHQoaG9zdC0+c2NzaS5pb19wb3J0KTsKKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQKK2Fjb3Juc2NzaV9zYmljX3dhaXQoQVNfSG9zdCAqaG9zdCwgaW50IHN0YXRfbWFzaywgaW50IHN0YXQsIGludCB0aW1lb3V0LCBjaGFyICptc2cpCit7CisJaW50IGFzcjsKKworCWRvIHsKKwkJYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKworCQlpZiAoKGFzciAmIHN0YXRfbWFzaykgPT0gc3RhdCkKKwkJCXJldHVybiAwOworCisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJcHJpbnRrKCJzY3NpJWQ6IHRpbWVvdXQgd2hpbGUgJXNcbiIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIG1zZyk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYworaW50IGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKEFTX0hvc3QgKmhvc3QsIGludCBjb21tYW5kKQoreworICAgIGlmIChhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9DSVAsIDAsIDEwMDAsICJpc3N1aW5nIGNvbW1hbmQiKSkKKwlyZXR1cm4gLTE7CisKKyAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQ01ORCwgY29tbWFuZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2Fjb3Juc2NzaV9jc2RlbGF5KHVuc2lnbmVkIGludCBjcykKK3sKKyAgICB1bnNpZ25lZCBsb25nIHRhcmdldF9qaWZmaWVzLCBmbGFnczsKKworICAgIHRhcmdldF9qaWZmaWVzID0gamlmZmllcyArIDEgKyBjcyAqIEhaIC8gMTAwOworCisgICAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisgICAgbG9jYWxfaXJxX2VuYWJsZSgpOworCisgICAgd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRhcmdldF9qaWZmaWVzKSkgYmFycmllcigpOworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX3Jlc2V0Y2FyZChBU19Ib3N0ICpob3N0KQoreworICAgIHVuc2lnbmVkIGludCBpLCB0aW1lb3V0OworCisgICAgLyogYXNzZXJ0IHJlc2V0IGxpbmUgKi8KKyAgICBob3N0LT5jYXJkLnBhZ2VfcmVnID0gMHg4MDsKKyAgICBvdXRiKGhvc3QtPmNhcmQucGFnZV9yZWcsIGhvc3QtPmNhcmQuaW9fcGFnZSk7CisKKyAgICAvKiB3YWl0IDMgY3MuICBTQ1NJIHN0YW5kYXJkIHNheXMgMjVtcy4gKi8KKyAgICBhY29ybnNjc2lfY3NkZWxheSgzKTsKKworICAgIGhvc3QtPmNhcmQucGFnZV9yZWcgPSAwOworICAgIG91dGIoaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKKworICAgIC8qCisgICAgICogU2hvdWxkIGdldCBhIHJlc2V0IGZyb20gdGhlIGNhcmQKKyAgICAgKi8KKyAgICB0aW1lb3V0ID0gMTAwMDsKKyAgICBkbyB7CisJaWYgKGluYihob3N0LT5jYXJkLmlvX2ludHIpICYgOCkKKwkgICAgYnJlYWs7CisJdWRlbGF5KDEpOworICAgIH0gd2hpbGUgKC0tdGltZW91dCk7CisKKyAgICBpZiAodGltZW91dCA9PSAwKQorCXByaW50aygic2NzaSVkOiB0aW1lb3V0IHdoaWxlIHJlc2V0dGluZyBjYXJkXG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vKTsKKworICAgIHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0FTUik7CisgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKworICAgIC8qIHNldHVwIHNiaWMgLSBXRDMzQzkzQSAqLworICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19PV05JRCwgT1dOSURfRUFGIHwgaG9zdC0+aG9zdC0+dGhpc19pZCk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0NNTkQsIENNTkRfUkVTRVQpOworCisgICAgLyoKKyAgICAgKiBDb21tYW5kIHNob3VsZCBjYXVzZSBhIHJlc2V0IGludGVycnVwdAorICAgICAqLworICAgIHRpbWVvdXQgPSAxMDAwOworICAgIGRvIHsKKwlpZiAoaW5iKGhvc3QtPmNhcmQuaW9faW50cikgJiA4KQorCSAgICBicmVhazsKKwl1ZGVsYXkoMSk7CisgICAgfSB3aGlsZSAoLS10aW1lb3V0KTsKKworICAgIGlmICh0aW1lb3V0ID09IDApCisJcHJpbnRrKCJzY3NpJWQ6IHRpbWVvdXQgd2hpbGUgcmVzZXR0aW5nIGNhcmRcbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKyAgICBpZiAoc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKSAhPSAweDAxKQorCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogV0QzM0M5M0EgZGlkbid0IGdpdmUgZW5oYW5jZWQgcmVzZXQgaW50ZXJydXB0XG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vKTsKKworICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19DVFJMLCBJTklUX1NCSUNETUEgfCBDVFJMX0lESSk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1RJTUVPVVQsIFRJTUVPVVRfVElNRSk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NZTkNIVFJBTlNGRVIsIFNZTkNIVFJBTlNGRVJfMkRCQSk7CisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NPVVJDRUlELCBTT1VSQ0VJRF9FUiB8IFNPVVJDRUlEX0RTUCk7CisKKyAgICBob3N0LT5jYXJkLnBhZ2VfcmVnID0gMHg0MDsKKyAgICBvdXRiKGhvc3QtPmNhcmQucGFnZV9yZWcsIGhvc3QtPmNhcmQuaW9fcGFnZSk7CisKKyAgICAvKiBzZXR1cCBkbWFjIC0gdVBDNzEwNzEgKi8KKyAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX0lOSVQsIDApOworI2lmZGVmIFVTRV9ETUFDCisgICAgZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19JTklULCBJTklUXzhCSVQpOworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfQ0hBTk5FTCwgQ0hBTk5FTF8wKTsKKyAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX0RFVkNPTjAsIElOSVRfREVWQ09OMCk7CisgICAgZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19ERVZDT04xLCBJTklUX0RFVkNPTjEpOworI2VuZGlmCisKKyAgICBob3N0LT5TQ3BudCA9IE5VTEw7CisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7CisgICAgaG9zdC0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisKKyAgICBtZW1zZXQoaG9zdC0+YnVzeWx1bnMsIDAsIHNpemVvZihob3N0LT5idXN5bHVucykpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCWhvc3QtPmRldmljZVtpXS5zeW5jX3N0YXRlID0gU1lOQ19ORUdPQ0lBVEU7CisJaG9zdC0+ZGV2aWNlW2ldLmRpc2Nvbm5lY3Rfb2sgPSAxOworICAgIH0KKworICAgIC8qIHdhaXQgMjUgY3MuICBTQ1NJIHN0YW5kYXJkIHNheXMgMjUwbXMuICovCisgICAgYWNvcm5zY3NpX2NzZGVsYXkoMjUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXRpbGl0eSByb3V0aW5lcyAoZWcuIGRlYnVnKQorICovCisjaWZkZWYgQ09ORklHX0FDT1JOU0NTSV9DT05TVEFOVFMKK3N0YXRpYyBjaGFyICphY29ybnNjc2lfaW50ZXJydXB0dHlwZVtdID0geworICAicnN0IiwgICJzdWMiLCAgInAvYSIsICAiMyIsCisgICJ0ZXJtIiwgIjUiLAkgICI2IiwJICAiNyIsCisgICJzZXJ2IiwgIjkiLAkgICJhIiwJICAiYiIsCisgICJjIiwJICAiZCIsCSAgImUiLAkgICJmIgorfTsKKworc3RhdGljIHNpZ25lZCBjaGFyIGFjb3Juc2NzaV9tYXBbXSA9IHsKKyAgMCwgIDEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgIDIsIC0xLCAtMSwgIC0xLCAtMSwgIDMsIC0xLCAgIDQsCTUsICA2LAk3LCAgIDgsICA5LCAxMCwgMTEsCisgMTIsIDEzLCAxNCwgLTEsICAtMSwgLTEsIC0xLCAtMSwgICA0LAk1LCAgNiwJNywgICA4LCAgOSwgMTAsIDExLAorIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLAorIDE1LCAxNiwgMTcsIDE4LCAgMTksIC0xLCAtMSwgMjAsICAgNCwJNSwgIDYsCTcsICAgOCwgIDksIDEwLCAxMSwKKyAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwKKyAyMSwgMjIsIC0xLCAtMSwgIC0xLCAyMywgLTEsIC0xLCAgIDQsCTUsICA2LAk3LCAgIDgsICA5LCAxMCwgMTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEsCisgLTEsIC0xLCAtMSwgLTEsICAtMSwgLTEsIC0xLCAtMSwgIC0xLCAtMSwgLTEsIC0xLCAgLTEsIC0xLCAtMSwgLTEKK307ICAgICAgCisKK3N0YXRpYyBjaGFyICphY29ybnNjc2lfaW50ZXJydXB0Y29kZVtdID0geworICAgIC8qIDAgKi8KKyAgICAicmVzZXQgLSBub3JtYWwgbW9kZSIsCS8qIDAwICovCisgICAgInJlc2V0IC0gYWR2YW5jZWQgbW9kZSIsCS8qIDAxICovCisKKyAgICAvKiAyICovCisgICAgInNlbCIsCQkJLyogMTEgKi8KKyAgICAic2VsK3hmZXIiLCAJCS8qIDE2ICovCisgICAgImRhdGEtb3V0IiwgCQkvKiAxOCAqLworICAgICJkYXRhLWluIiwJCQkvKiAxOSAqLworICAgICJjbWQiLAkJCS8qIDFBICovCisgICAgInN0YXQiLAkJCS8qIDFCICovCisgICAgIj8/LW91dCIsCQkJLyogMUMgKi8KKyAgICAiPz8taW4iLAkJCS8qIDFEICovCisgICAgIm1zZy1vdXQiLAkJCS8qIDFFICovCisgICAgIm1zZy1pbiIsCQkJLyogMUYgKi8KKworICAgIC8qIDEyICovCisgICAgIi9BQ0sgYXNzZXJ0ZWQiLAkJLyogMjAgKi8KKyAgICAic2F2ZS1kYXRhLXB0ciIsCQkvKiAyMSAqLworICAgICJ7cmV9c2VsIiwJCQkvKiAyMiAqLworCisgICAgLyogMTUgKi8KKyAgICAiaW52IGNtZCIsCQkJLyogNDAgKi8KKyAgICAidW5leHBlY3RlZCBkaXNjb25uZWN0IiwJLyogNDEgKi8KKyAgICAic2VsIHRpbWVvdXQiLAkJLyogNDIgKi8KKyAgICAiUCBlcnIiLAkJCS8qIDQzICovCisgICAgIlAgZXJyK0FUTiIsCQkvKiA0NCAqLworICAgICJiYWQgc3RhdHVzIGJ5dGUiLAkJLyogNDcgKi8KKworICAgIC8qIDIxICovCisgICAgInJlc2VsLCBubyBpZCIsCQkvKiA4MCAqLworICAgICJyZXNlbCIsCQkJLyogODEgKi8KKyAgICAiZGlzY29uIiwJCQkvKiA4NSAqLworfTsKKworc3RhdGljCit2b2lkIHByaW50X3Njc2lfc3RhdHVzKHVuc2lnbmVkIGludCBzc3IpCit7CisgICAgaWYgKGFjb3Juc2NzaV9tYXBbc3NyXSAhPSAtMSkKKwlwcmludGsoIiVzOiVzIiwKKwkJYWNvcm5zY3NpX2ludGVycnVwdHR5cGVbKHNzciA+PiA0KV0sCisJCWFjb3Juc2NzaV9pbnRlcnJ1cHRjb2RlW2Fjb3Juc2NzaV9tYXBbc3NyXV0pOworICAgIGVsc2UKKwlwcmludGsoIiVYOiVYIiwgc3NyID4+IDQsIHNzciAmIDB4MGYpOyAgICAKK30gICAgCisjZW5kaWYKKworc3RhdGljCit2b2lkIHByaW50X3NiaWNfc3RhdHVzKGludCBhc3IsIGludCBzc3IsIGludCBjbWRwaGFzZSkKK3sKKyNpZmRlZiBDT05GSUdfQUNPUk5TQ1NJX0NPTlNUQU5UUworICAgIHByaW50aygic2JpYzogJWMlYyVjJWMlYyVjICIsCisJICAgIGFzciAmIEFTUl9JTlQgPyAnSScgOiAnaScsCisJICAgIGFzciAmIEFTUl9MQ0kgPyAnTCcgOiAnbCcsCisJICAgIGFzciAmIEFTUl9CU1kgPyAnQicgOiAnYicsCisJICAgIGFzciAmIEFTUl9DSVAgPyAnQycgOiAnYycsCisJICAgIGFzciAmIEFTUl9QRSAgPyAnUCcgOiAncCcsCisJICAgIGFzciAmIEFTUl9EQlIgPyAnRCcgOiAnZCcpOworICAgIHByaW50aygic2NzaTogIik7CisgICAgcHJpbnRfc2NzaV9zdGF0dXMoc3NyKTsKKyAgICBwcmludGsoIiBwaCAlMDJYXG4iLCBjbWRwaGFzZSk7CisjZWxzZQorICAgIHByaW50aygic2JpYzogJTAyWCBzY3NpOiAlWDolWCBwaDogJTAyWFxuIiwKKwkgICAgYXNyLCAoc3NyICYgMHhmMCk+PjQsIHNzciAmIDB4MGYsIGNtZHBoYXNlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYWNvcm5zY3NpX2R1bXBsb2dsaW5lKEFTX0hvc3QgKmhvc3QsIGludCB0YXJnZXQsIGludCBsaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwlzaWduZWQgaW50IHB0cjsKKworCXB0ciA9IGhvc3QtPnN0YXR1c19wdHJbdGFyZ2V0XSAtIFNUQVRVU19CVUZGRVJfVE9fUFJJTlQ7CisJaWYgKHB0ciA8IDApCisJCXB0ciArPSBTVEFUVVNfQlVGRkVSX1NJWkU7CisKKwlwcmludGsoIiVjOiAlM3M6IiwgdGFyZ2V0ID09IDggPyAnSCcgOiAnMCcgKyB0YXJnZXQsCisJCWxpbmUgPT0gMCA/ICJwaCIgOiBsaW5lID09IDEgPyAic3NyIiA6ICJpbnQiKTsKKworCXByZXYgPSBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLndoZW47CisKKwlmb3IgKDsgcHRyICE9IGhvc3QtPnN0YXR1c19wdHJbdGFyZ2V0XTsgcHRyID0gKHB0ciArIDEpICYgKFNUQVRVU19CVUZGRVJfU0laRSAtIDEpKSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZV9kaWZmOworCisJCWlmICghaG9zdC0+c3RhdHVzW3RhcmdldF1bcHRyXS53aGVuKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChsaW5lKSB7CisJCWNhc2UgMDoKKwkJCXByaW50aygiJWMlMDJYIiwgaG9zdC0+c3RhdHVzW3RhcmdldF1bcHRyXS5pcnEgPyAnLScgOiAnICcsCisJCQkJCSBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLnBoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCXByaW50aygiICUwMlgiLCBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLnNzcik7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQl0aW1lX2RpZmYgPSBob3N0LT5zdGF0dXNbdGFyZ2V0XVtwdHJdLndoZW4gLSBwcmV2OworCQkJcHJldiA9IGhvc3QtPnN0YXR1c1t0YXJnZXRdW3B0cl0ud2hlbjsKKwkJCWlmICh0aW1lX2RpZmYgPT0gMCkKKwkJCQlwcmludGsoIj09XiIpOworCQkJZWxzZSBpZiAodGltZV9kaWZmID49IDEwMCkKKwkJCQlwcmludGsoIiAgICIpOworCQkJZWxzZQorCQkJCXByaW50aygiICUwMmxkIiwgdGltZV9kaWZmKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2R1bXBsb2coQVNfSG9zdCAqaG9zdCwgaW50IHRhcmdldCkKK3sKKyAgICBkbyB7CisJYWNvcm5zY3NpX2R1bXBsb2dsaW5lKGhvc3QsIHRhcmdldCwgMCk7CisJYWNvcm5zY3NpX2R1bXBsb2dsaW5lKGhvc3QsIHRhcmdldCwgMSk7CisJYWNvcm5zY3NpX2R1bXBsb2dsaW5lKGhvc3QsIHRhcmdldCwgMik7CisKKwlpZiAodGFyZ2V0ID09IDgpCisJICAgIGJyZWFrOworCisJdGFyZ2V0ID0gODsKKyAgICB9IHdoaWxlICgxKTsKK30KKworc3RhdGljCitjaGFyIGFjb3Juc2NzaV90YXJnZXQoQVNfSG9zdCAqaG9zdCkKK3sKKwlpZiAoaG9zdC0+U0NwbnQpCisJCXJldHVybiAnMCcgKyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZDsKKwlyZXR1cm4gJ0gnOworfQorCisvKgorICogUHJvdG90eXBlOiBjbWR0eXBlX3QgYWNvcm5zY3NpX2NtZHR5cGUoaW50IGNvbW1hbmQpCisgKiBQdXJwb3NlICA6IGRpZmZlcmVudGlhdGUgUkVBRCBmcm9tIFdSSVRFIGZyb20gb3RoZXIgY29tbWFuZHMKKyAqIFBhcmFtcyAgIDogY29tbWFuZCAtIGNvbW1hbmQgdG8gaW50ZXJwcmV0CisgKiBSZXR1cm5zICA6IENNRF9SRUFECS0gY29tbWFuZCByZWFkcyBkYXRhLAorICoJICAgICAgQ01EX1dSSVRFIC0gY29tbWFuZCB3cml0ZXMgZGF0YSwKKyAqCSAgICAgIENNRF9NSVNDCS0gZXZlcnl0aGluZyBlbHNlCisgKi8KK3N0YXRpYyBpbmxpbmUKK2NtZHR5cGVfdCBhY29ybnNjc2lfY21kdHlwZShpbnQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIFdSSVRFXzY6ICBjYXNlIFdSSVRFXzEwOiAgY2FzZSBXUklURV8xMjoKKwlyZXR1cm4gQ01EX1dSSVRFOworICAgIGNhc2UgUkVBRF82OiAgIGNhc2UgUkVBRF8xMDogICBjYXNlIFJFQURfMTI6CisJcmV0dXJuIENNRF9SRUFEOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIENNRF9NSVNDOworICAgIH0KK30KKworLyoKKyAqIFByb3RvdHlwZTogaW50IGFjb3Juc2NzaV9kYXRhZGlyZWN0aW9uKGludCBjb21tYW5kKQorICogUHVycG9zZSAgOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gY29tbWFuZHMgdGhhdCBoYXZlIGEgREFUQSBJTiBwaGFzZQorICoJICAgICAgYW5kIGEgREFUQSBPVVQgcGhhc2UKKyAqIFBhcmFtcyAgIDogY29tbWFuZCAtIGNvbW1hbmQgdG8gaW50ZXJwcmV0CisgKiBSZXR1cm5zICA6IERBVEFESVJfT1VUIC0gZGF0YSBvdXQgcGhhc2UgZXhwZWN0ZWQKKyAqCSAgICAgIERBVEFESVJfSU4gIC0gZGF0YSBpbiBwaGFzZSBleHBlY3RlZAorICovCitzdGF0aWMKK2RhdGFkaXJfdCBhY29ybnNjc2lfZGF0YWRpcmVjdGlvbihpbnQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIENIQU5HRV9ERUZJTklUSU9OOgljYXNlIENPTVBBUkU6CQljYXNlIENPUFk6CisgICAgY2FzZSBDT1BZX1ZFUklGWToJCWNhc2UgTE9HX1NFTEVDVDoJY2FzZSBNT0RFX1NFTEVDVDoKKyAgICBjYXNlIE1PREVfU0VMRUNUXzEwOgljYXNlIFNFTkRfRElBR05PU1RJQzoJY2FzZSBXUklURV9CVUZGRVI6CisgICAgY2FzZSBGT1JNQVRfVU5JVDoJCWNhc2UgUkVBU1NJR05fQkxPQ0tTOgljYXNlIFJFU0VSVkU6CisgICAgY2FzZSBTRUFSQ0hfRVFVQUw6CQljYXNlIFNFQVJDSF9ISUdIOgljYXNlIFNFQVJDSF9MT1c6CisgICAgY2FzZSBXUklURV82OgkJY2FzZSBXUklURV8xMDoJCWNhc2UgV1JJVEVfVkVSSUZZOgorICAgIGNhc2UgVVBEQVRFX0JMT0NLOgkJY2FzZSBXUklURV9MT05HOgljYXNlIFdSSVRFX1NBTUU6CisgICAgY2FzZSBTRUFSQ0hfSElHSF8xMjoJY2FzZSBTRUFSQ0hfRVFVQUxfMTI6CWNhc2UgU0VBUkNIX0xPV18xMjoKKyAgICBjYXNlIFdSSVRFXzEyOgkJY2FzZSBXUklURV9WRVJJRllfMTI6CWNhc2UgU0VUX1dJTkRPVzoKKyAgICBjYXNlIE1FRElVTV9TQ0FOOgkJY2FzZSBTRU5EX1ZPTFVNRV9UQUc6CWNhc2UgMHhlYToKKwlyZXR1cm4gREFUQURJUl9PVVQ7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gREFUQURJUl9JTjsKKyAgICB9Cit9CisKKy8qCisgKiBQdXJwb3NlICA6IHByb3ZpZGUgdmFsdWVzIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgd2l0aCAzM0M5My4KKyAqIENvcHlyaWdodDogQ29weXJpZ2h0IChjKSAxOTk2IEpvaG4gU2hpZmZsZXR0LCBHZW9Mb2cgQ29uc3VsdGluZworICoJTW9kaWZpZWQgYnkgUnVzc2VsbCBLaW5nIGZvciA4TUh6IFdEMzNDOTNBCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3luY194ZmVyX3RibCB7CisgICAgdW5zaWduZWQgaW50IHBlcmlvZF9uczsKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ192YWx1ZTsKK30gc3luY194ZmVyX3RhYmxlW10gPSB7CisgICAgewkxLCAweDIwIH0sICAgIHsgMjQ5LCAweDIwIH0sCXsgMzc0LCAweDMwIH0sCisgICAgeyA0OTksIDB4NDAgfSwgICAgeyA2MjQsIDB4NTAgfSwJeyA3NDksIDB4NjAgfSwKKyAgICB7IDg3NCwgMHg3MCB9LCAgICB7IDk5OSwgMHgwMCB9LAl7ICAgMCwJICAwIH0KK307CisKKy8qCisgKiBQcm90b3R5cGU6IGludCBhY29ybnNjc2lfZ2V0cGVyaW9kKHVuc2lnbmVkIGNoYXIgc3luY3hmZXIpCisgKiBQdXJwb3NlICA6IHBlcmlvZCBmb3IgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIHNldHRpbmcKKyAqIFBhcmFtcyAgIDogc3luY3hmZXIgU1lOQ1hGRVIgcmVnaXN0ZXIgdmFsdWUKKyAqIFJldHVybnMgIDogcGVyaW9kIGluIG5zLgorICovCitzdGF0aWMKK2ludCBhY29ybnNjc2lfZ2V0cGVyaW9kKHVuc2lnbmVkIGNoYXIgc3luY3hmZXIpCit7CisgICAgaW50IGk7CisKKyAgICBzeW5jeGZlciAmPSAweGYwOworICAgIGlmIChzeW5jeGZlciA9PSAweDEwKQorCXN5bmN4ZmVyID0gMDsKKworICAgIGZvciAoaSA9IDE7IHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnM7IGkrKykKKwlpZiAoc3luY3hmZXIgPT0gc3luY194ZmVyX3RhYmxlW2ldLnJlZ192YWx1ZSkKKwkgICAgcmV0dXJuIHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnM7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm90b3R5cGU6IGludCByb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKKyAqIFB1cnBvc2UgIDogcmV0dXJuIGluZGV4IGludG8gYWJvdmUgdGFibGUgZm9yIGEgcmVxdWlyZWQgUkVRIHBlcmlvZAorICogUGFyYW1zICAgOiBwZXJpb2QgLSB0aW1lIChucykgZm9yIFJFUQorICogUmV0dXJucyAgOiB0YWJsZSBpbmRleAorICogQ29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCByb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDE7IHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnM7IGkrKykgeworCWlmICgocGVyaW9kIDw9IHN5bmNfeGZlcl90YWJsZVtpXS5wZXJpb2RfbnMpICYmCisJICAgIChwZXJpb2QgPiBzeW5jX3hmZXJfdGFibGVbaSAtIDFdLnBlcmlvZF9ucykpCisJICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gNzsKK30KKworLyoKKyAqIFByb3RvdHlwZTogdW5zaWduZWQgY2hhciBjYWxjX3N5bmNfeGZlcih1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQorICogUHVycG9zZSAgOiBjYWxjdWxhdGUgdmFsdWUgZm9yIDMzYzkzcyBTWU5DIHJlZ2lzdGVyCisgKiBQYXJhbXMgICA6IHBlcmlvZCAtIHRpbWUgKG5zKSBmb3IgUkVRCisgKgkgICAgICBvZmZzZXQgLSBvZmZzZXQgaW4gYnl0ZXMgYmV0d2VlbiBSRVEvQUNLCisgKiBSZXR1cm5zICA6IHZhbHVlIGZvciBTWU5DIHJlZ2lzdGVyCisgKiBDb3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMTk5NiBKb2huIFNoaWZmbGV0dCwgR2VvTG9nIENvbnN1bHRpbmcKKyAqLworc3RhdGljCit1bnNpZ25lZCBjaGFyIGNhbGNfc3luY194ZmVyKHVuc2lnbmVkIGludCBwZXJpb2QsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisgICAgcmV0dXJuIHN5bmNfeGZlcl90YWJsZVtyb3VuZF9wZXJpb2QocGVyaW9kKV0ucmVnX3ZhbHVlIHwKKwkJKChvZmZzZXQgPCBTRFRSX1NJWkUpID8gb2Zmc2V0IDogU0RUUl9TSVpFKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21tYW5kIGZ1bmN0aW9ucworICovCisvKgorICogRnVuY3Rpb246IGFjb3Juc2NzaV9raWNrKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDoga2ljayBuZXh0IGNvbW1hbmQgdG8gaW50ZXJmYWNlCisgKiBQYXJhbXMgIDogaG9zdCAtIGhvc3QgdG8gc2VuZCBjb21tYW5kIHRvCisgKiBSZXR1cm5zIDogSU5UUl9JRExFIGlmIGlkbGUsIG90aGVyd2lzZSBJTlRSX1BST0NFU1NJTkcKKyAqIE5vdGVzICAgOiBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgZGlzYWJsZWQhCisgKi8KK3N0YXRpYworaW50cl9yZXRfdCBhY29ybnNjc2lfa2ljayhBU19Ib3N0ICpob3N0KQoreworICAgIGludCBmcm9tX3F1ZXVlID0gMDsKKyAgICBTY3NpX0NtbmQgKlNDcG50OworCisgICAgLyogZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGEgY29tbWFuZCBpcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkICovCisgICAgU0NwbnQgPSBob3N0LT5vcmlnU0NwbnQ7CisgICAgaG9zdC0+b3JpZ1NDcG50ID0gTlVMTDsKKworICAgIC8qIHJldHJpZXZlIG5leHQgY29tbWFuZCAqLworICAgIGlmICghU0NwbnQpIHsKKwlTQ3BudCA9IHF1ZXVlX3JlbW92ZV9leGNsdWRlKCZob3N0LT5xdWV1ZXMuaXNzdWUsIGhvc3QtPmJ1c3lsdW5zKTsKKwlpZiAoIVNDcG50KQorCSAgICByZXR1cm4gSU5UUl9JRExFOworCisJZnJvbV9xdWV1ZSA9IDE7CisgICAgfQorCisgICAgaWYgKGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaG9zdC0+U0NwbnQpIHsKKwlxdWV1ZV9hZGRfY21kX3RhaWwoJmhvc3QtPnF1ZXVlcy5kaXNjb25uZWN0ZWQsIGhvc3QtPlNDcG50KTsKKwlob3N0LT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMDsKKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisJREJHKGhvc3QtPlNDcG50LCBwcmludGsoInNjc2klZC4lYzogbW92ZWQgY29tbWFuZCB0byBkaXNjb25uZWN0ZWQgcXVldWVcbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpKTsKKyNlbmRpZgorCWhvc3QtPlNDcG50ID0gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHdlIGhhdmUgYW4gaW50ZXJydXB0IHBlbmRpbmcsIHRoZW4gd2UgbWF5IGhhdmUgYmVlbiByZXNlbGVjdGVkLgorICAgICAqIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXJzCisgICAgICovCisgICAgaWYgKCEoc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKSAmIChBU1JfSU5UfEFTUl9CU1l8QVNSX0NJUCkpKSB7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RFU1RJRCwgU0NwbnQtPmRldmljZS0+aWQpOworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19DTU5ELCBDTU5EX1NFTFdJVEhBVE4pOworICAgIH0KKworICAgIC8qCisgICAgICogY2xhaW0gaG9zdCBidXN5IC0gYWxsIG9mIHRoZXNlIG11c3QgaGFwcGVuIGF0b21pY2FsbHkgd3J0CisgICAgICogb3VyIGludGVycnVwdCByb3V0aW5lLiAgRmFpbHVyZSBtZWFucyBjb21tYW5kIGxvc3MuCisgICAgICovCisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0NPTk5FQ1RJTkc7CisgICAgaG9zdC0+U0NwbnQgPSBTQ3BudDsKKyAgICBob3N0LT5zY3NpLlNDcCA9IFNDcG50LT5TQ3A7CisgICAgaG9zdC0+ZG1hLnhmZXJfc2V0dXAgPSAwOworICAgIGhvc3QtPmRtYS54ZmVyX3JlcXVpcmVkID0gMDsKKyAgICBob3N0LT5kbWEueGZlcl9kb25lID0gMDsKKworI2lmIChERUJVRyAmIChERUJVR19BQk9SVHxERUJVR19DT05ORUNUKSkKKyAgICBEQkcoU0NwbnQscHJpbnRrKCJzY3NpJWQuJWM6IHN0YXJ0aW5nIGNtZCAlMDJYXG4iLAorCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkgICAgU0NwbnQtPmNtbmRbMF0pKTsKKyNlbmRpZgorCisgICAgaWYgKGZyb21fcXVldWUpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfVEFHR0VEX1FVRVVFCisJLyoKKwkgKiB0YWdnZWQgcXVldWVpbmcgLSBhbGxvY2F0ZSBhIG5ldyB0YWcgdG8gdGhpcyBjb21tYW5kCisJICovCisJaWYgKFNDcG50LT5kZXZpY2UtPnNpbXBsZV90YWdzKSB7CisJICAgIFNDcG50LT5kZXZpY2UtPmN1cnJlbnRfdGFnICs9IDE7CisJICAgIGlmIChTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZyA9PSAwKQorCQlTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZyA9IDE7CisJICAgIFNDcG50LT50YWcgPSBTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZzsKKwl9IGVsc2UKKyNlbmRpZgorCSAgICBzZXRfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCisJaG9zdC0+c3RhdHMucmVtb3ZlcyArPSAxOworCisJc3dpdGNoIChhY29ybnNjc2lfY21kdHlwZShTQ3BudC0+Y21uZFswXSkpIHsKKwljYXNlIENNRF9XUklURToKKwkgICAgaG9zdC0+c3RhdHMud3JpdGVzICs9IDE7CisJICAgIGJyZWFrOworCWNhc2UgQ01EX1JFQUQ6CisJICAgIGhvc3QtPnN0YXRzLnJlYWRzICs9IDE7CisJICAgIGJyZWFrOworCWNhc2UgQ01EX01JU0M6CisJICAgIGhvc3QtPnN0YXRzLm1pc2NzICs9IDE7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworfSAgICAKKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIGFjb3Juc2NzaV9kb25lKEFTX0hvc3QgKmhvc3QsIFNjc2lfQ21uZCAqKlNDcG50cCwgdW5zaWduZWQgaW50IHJlc3VsdCkKKyAqIFB1cnBvc2UgOiBjb21wbGV0ZSBwcm9jZXNzaW5nIGZvciBjb21tYW5kCisgKiBQYXJhbXMgIDogaG9zdCAgIC0gaW50ZXJmYWNlIHRoYXQgY29tcGxldGVkCisgKgkgICAgIHJlc3VsdCAtIGRyaXZlciBieXRlIG9mIHJlc3VsdAorICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2RvbmUoQVNfSG9zdCAqaG9zdCwgU2NzaV9DbW5kICoqU0NwbnRwLCB1bnNpZ25lZCBpbnQgcmVzdWx0KQoreworICAgIFNjc2lfQ21uZCAqU0NwbnQgPSAqU0NwbnRwOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU09VUkNFSUQsIFNPVVJDRUlEX0VSIHwgU09VUkNFSURfRFNQKTsKKworICAgIGhvc3QtPnN0YXRzLmZpbnMgKz0gMTsKKworICAgIGlmIChTQ3BudCkgeworCSpTQ3BudHAgPSBOVUxMOworCisJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCisJU0NwbnQtPnJlc3VsdCA9IHJlc3VsdCA8PCAxNiB8IGhvc3QtPnNjc2kuU0NwLk1lc3NhZ2UgPDwgOCB8IGhvc3QtPnNjc2kuU0NwLlN0YXR1czsKKworCS8qCisJICogSW4gdGhlb3J5LCB0aGlzIHNob3VsZCBub3QgaGFwcGVuLiAgSW4gcHJhY3RpY2UsIGl0IHNlZW1zIHRvLgorCSAqIE9ubHkgdHJpZ2dlciBhbiBlcnJvciBpZiB0aGUgZGV2aWNlIGF0dGVtcHRzIHRvIHJlcG9ydCBhbGwgaGFwcHkKKwkgKiBidXQgd2l0aCB1bnRyYW5zZmVycmVkIGJ1ZmZlcnMuLi4gIElmIHdlIGRvbid0IGRvIHNvbWV0aGluZywgdGhlbgorCSAqIGRhdGEgbG9zcyB3aWxsIG9jY3VyLiAgU2hvdWxkIHdlIGNoZWNrIFNDcG50LT51bmRlcmZsb3cgaGVyZT8KKwkgKiBJdCBkb2Vzbid0IGFwcGVhciB0byBiZSBzZXQgdG8gc29tZXRoaW5nIG1lYW5pbmdmdWwgYnkgdGhlIGhpZ2hlcgorCSAqIGxldmVscyBhbGwgdGhlIHRpbWUuCisJICovCisJaWYgKHJlc3VsdCA9PSBESURfT0spIHsKKwkJaW50IHhmZXJfd2FybiA9IDA7CisKKwkJaWYgKFNDcG50LT51bmRlcmZsb3cgPT0gMCkgeworCQkJaWYgKGhvc3QtPnNjc2kuU0NwLnB0ciAmJgorCQkJICAgIGFjb3Juc2NzaV9jbWR0eXBlKFNDcG50LT5jbW5kWzBdKSAhPSBDTURfTUlTQykKKwkJCQl4ZmVyX3dhcm4gPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA8IFNDcG50LT51bmRlcmZsb3cgfHwKKwkJCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgIT0gaG9zdC0+ZG1hLnRyYW5zZmVycmVkKQorCQkJCXhmZXJfd2FybiA9IDE7CisJCX0KKworCQkvKiBBTlNJIHN0YW5kYXJkIHNheXM6IChTQ1NJLTIgUmV2IDEwYyBTZWN0IDUuNi42KQorCQkgKiAgVGFyZ2V0cyB3aGljaCBicmVhayBkYXRhIHRyYW5zZmVycyBpbnRvIG11bHRpcGxlCisJCSAqICBjb25uZWN0aW9ucyBzaGFsbCBlbmQgZWFjaCBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKwkJICogIChleGNlcHQgcG9zc2libHkgdGhlIGxhc3QpIHdpdGggYSBTQVZFIERBVEEKKwkJICogIFBPSU5URVIgLSBESVNDT05ORUNUIG1lc3NhZ2Ugc2VxdWVuY2UuCisJCSAqCisJCSAqIFRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGVuc3VyZSB0aGF0IGEgdHJhbnNmZXIgaGFzCisJCSAqIGNvbXBsZXRlZC4gIElmIHdlIHJlYWNoIHRoZSBlbmQgb2YgYSB0cmFuc2ZlciBkdXJpbmcKKwkJICogdGhlIGNvbW1hbmQsIHRoZW4gd2UgY2FuIG9ubHkgaGF2ZSBmaW5pc2hlZCB0aGUgdHJhbnNmZXIuCisJCSAqIHRoZXJlZm9yZSwgaWYgd2Ugc2VlbSB0byBoYXZlIHNvbWUgZGF0YSByZW1haW5pbmcsIHRoaXMKKwkJICogaXMgbm90IGEgcHJvYmxlbS4KKwkJICovCisJCWlmIChob3N0LT5kbWEueGZlcl9kb25lKQorCQkJeGZlcl93YXJuID0gMDsKKworCQlpZiAoeGZlcl93YXJuKSB7CisJCSAgICBzd2l0Y2ggKHN0YXR1c19ieXRlKFNDcG50LT5yZXN1bHQpKSB7CisJCSAgICBjYXNlIENIRUNLX0NPTkRJVElPTjoKKwkJICAgIGNhc2UgQ09NTUFORF9URVJNSU5BVEVEOgorCQkgICAgY2FzZSBCVVNZOgorCQkgICAgY2FzZSBRVUVVRV9GVUxMOgorCQkgICAgY2FzZSBSRVNFUlZBVElPTl9DT05GTElDVDoKKwkJCWJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuSDogaW5jb21wbGV0ZSBkYXRhIHRyYW5zZmVyIGRldGVjdGVkOiByZXN1bHQ9JTA4WCBjb21tYW5kPSIsCisJCQkJaG9zdC0+aG9zdC0+aG9zdF9ubywgU0NwbnQtPnJlc3VsdCk7CisJCQlwcmludF9jb21tYW5kKFNDcG50LT5jbW5kKTsKKwkJCWFjb3Juc2NzaV9kdW1wZG1hKGhvc3QsICJkb25lIik7CisJCSAJYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgU0NwbnQtPmRldmljZS0+aWQpOworCQkJU0NwbnQtPnJlc3VsdCAmPSAweGZmZmY7CisJCQlTQ3BudC0+cmVzdWx0IHw9IERJRF9FUlJPUiA8PCAxNjsKKwkJICAgIH0KKwkJfQorCX0KKworCWlmICghU0NwbnQtPnNjc2lfZG9uZSkKKwkgICAgcGFuaWMoInNjc2klZC5IOiBudWxsIHNjc2lfZG9uZSBmdW5jdGlvbiBpbiBhY29ybnNjc2lfZG9uZSIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCisJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisgICAgfSBlbHNlCisJcHJpbnRrKCJzY3NpJWQ6IG51bGwgY29tbWFuZCBpbiBhY29ybnNjc2lfZG9uZSIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRE1BIHJvdXRpbmVzCisgKi8KKy8qCisgKiBQdXJwb3NlICA6IHVwZGF0ZSBTQ1NJIERhdGEgUG9pbnRlcgorICogTm90ZXMgICAgOiB0aGlzIHdpbGwgb25seSBiZSBvbmUgU0cgZW50cnkgb3IgbGVzcworICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2RhdGFfdXBkYXRlcHRyKEFTX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIFNDcC0+cHRyICs9IGxlbmd0aDsKKyAgICBTQ3AtPnRoaXNfcmVzaWR1YWwgLT0gbGVuZ3RoOworCisgICAgaWYgKFNDcC0+dGhpc19yZXNpZHVhbCA9PSAwICYmIG5leHRfU0NwKFNDcCkgPT0gMCkKKwlob3N0LT5kbWEueGZlcl9kb25lID0gMTsKK30KKworLyoKKyAqIFByb3RvdHlwZTogdm9pZCBhY29ybnNjc2lfZGF0YV9yZWFkKEFTX0hvc3QgKmhvc3QsIGNoYXIgKnB0ciwKKyAqCQkJCXVuc2lnbmVkIGludCBzdGFydF9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQorICogUHVycG9zZSAgOiByZWFkIGRhdGEgZnJvbSBETUEgUkFNCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IHRvIHRyYW5zZmVyIGZyb20KKyAqCSAgICAgIHB0ciAgLSBEUkFNIGFkZHJlc3MKKyAqCSAgICAgIHN0YXJ0X2FkZHIgLSBob3N0IG1lbSBhZGRyZXNzCisgKgkgICAgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqIE5vdGVzICAgIDogdGhpcyB3aWxsIG9ubHkgYmUgb25lIFNHIGVudHJ5IG9yIGxlc3MKKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kYXRhX3JlYWQoQVNfSG9zdCAqaG9zdCwgY2hhciAqcHRyLAorCQkJCSB1bnNpZ25lZCBpbnQgc3RhcnRfYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBleHRlcm4gdm9pZCBfX2Fjb3Juc2NzaV9pbihpbnQgcG9ydCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKKyAgICB1bnNpZ25lZCBpbnQgcGFnZSwgb2Zmc2V0LCBsZW4gPSBsZW5ndGg7CisKKyAgICBwYWdlID0gKHN0YXJ0X2FkZHIgPj4gMTIpOworICAgIG9mZnNldCA9IHN0YXJ0X2FkZHIgJiAoKDEgPDwgMTIpIC0gMSk7CisKKyAgICBvdXRiKChwYWdlICYgMHgzZikgfCBob3N0LT5jYXJkLnBhZ2VfcmVnLCBob3N0LT5jYXJkLmlvX3BhZ2UpOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKwl1bnNpZ25lZCBpbnQgdGhpc19sZW47CisKKwlpZiAobGVuICsgb2Zmc2V0ID4gKDEgPDwgMTIpKQorCSAgICB0aGlzX2xlbiA9ICgxIDw8IDEyKSAtIG9mZnNldDsKKwllbHNlCisJICAgIHRoaXNfbGVuID0gbGVuOworCisJX19hY29ybnNjc2lfaW4oaG9zdC0+Y2FyZC5pb19yYW0gKyAob2Zmc2V0IDw8IDEpLCBwdHIsIHRoaXNfbGVuKTsKKworCW9mZnNldCArPSB0aGlzX2xlbjsKKwlwdHIgKz0gdGhpc19sZW47CisJbGVuIC09IHRoaXNfbGVuOworCisJaWYgKG9mZnNldCA9PSAoMSA8PCAxMikpIHsKKwkgICAgb2Zmc2V0ID0gMDsKKwkgICAgcGFnZSArKzsKKwkgICAgb3V0YigocGFnZSAmIDB4M2YpIHwgaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKKwl9CisgICAgfQorICAgIG91dGIoaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKK30KKworLyoKKyAqIFByb3RvdHlwZTogdm9pZCBhY29ybnNjc2lfZGF0YV93cml0ZShBU19Ib3N0ICpob3N0LCBjaGFyICpwdHIsCisgKgkJCQl1bnNpZ25lZCBpbnQgc3RhcnRfYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCkKKyAqIFB1cnBvc2UgIDogd3JpdGUgZGF0YSB0byBETUEgUkFNCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IHRvIHRyYW5zZmVyIGZyb20KKyAqCSAgICAgIHB0ciAgLSBEUkFNIGFkZHJlc3MKKyAqCSAgICAgIHN0YXJ0X2FkZHIgLSBob3N0IG1lbSBhZGRyZXNzCisgKgkgICAgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKKyAqIE5vdGVzICAgIDogdGhpcyB3aWxsIG9ubHkgYmUgb25lIFNHIGVudHJ5IG9yIGxlc3MKKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kYXRhX3dyaXRlKEFTX0hvc3QgKmhvc3QsIGNoYXIgKnB0ciwKKwkJCQkgdW5zaWduZWQgaW50IHN0YXJ0X2FkZHIsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgZXh0ZXJuIHZvaWQgX19hY29ybnNjc2lfb3V0KGludCBwb3J0LCBjaGFyICpidWYsIGludCBsZW4pOworICAgIHVuc2lnbmVkIGludCBwYWdlLCBvZmZzZXQsIGxlbiA9IGxlbmd0aDsKKworICAgIHBhZ2UgPSAoc3RhcnRfYWRkciA+PiAxMik7CisgICAgb2Zmc2V0ID0gc3RhcnRfYWRkciAmICgoMSA8PCAxMikgLSAxKTsKKworICAgIG91dGIoKHBhZ2UgJiAweDNmKSB8IGhvc3QtPmNhcmQucGFnZV9yZWcsIGhvc3QtPmNhcmQuaW9fcGFnZSk7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworCXVuc2lnbmVkIGludCB0aGlzX2xlbjsKKworCWlmIChsZW4gKyBvZmZzZXQgPiAoMSA8PCAxMikpCisJICAgIHRoaXNfbGVuID0gKDEgPDwgMTIpIC0gb2Zmc2V0OworCWVsc2UKKwkgICAgdGhpc19sZW4gPSBsZW47CisKKwlfX2Fjb3Juc2NzaV9vdXQoaG9zdC0+Y2FyZC5pb19yYW0gKyAob2Zmc2V0IDw8IDEpLCBwdHIsIHRoaXNfbGVuKTsKKworCW9mZnNldCArPSB0aGlzX2xlbjsKKwlwdHIgKz0gdGhpc19sZW47CisJbGVuIC09IHRoaXNfbGVuOworCisJaWYgKG9mZnNldCA9PSAoMSA8PCAxMikpIHsKKwkgICAgb2Zmc2V0ID0gMDsKKwkgICAgcGFnZSArKzsKKwkgICAgb3V0YigocGFnZSAmIDB4M2YpIHwgaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKKwl9CisgICAgfQorICAgIG91dGIoaG9zdC0+Y2FyZC5wYWdlX3JlZywgaG9zdC0+Y2FyZC5pb19wYWdlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE9uLWJvYXJkIERNQSByb3V0aW5lcworICovCisjaWZkZWYgVVNFX0RNQUMKKy8qCisgKiBQcm90b3R5cGU6IHZvaWQgYWNvcm5zY3NpX2RtYXN0b3AoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgIDogc3RvcCBhbGwgRE1BCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IG9uIHdoaWNoIHRvIHN0b3AgRE1BCisgKiBOb3RlcyAgICA6IFRoaXMgaXMgY2FsbGVkIHdoZW4gbGVhdmluZyBEQVRBIElOL09VVCBwaGFzZSwKKyAqCSAgICAgIG9yIHdoZW4gaW50ZXJmYWNlIGlzIFJFU0VUCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgYWNvcm5zY3NpX2RtYV9zdG9wKEFTX0hvc3QgKmhvc3QpCit7CisgICAgZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19NQVNLUkVHLCBNQVNLX09OKTsKKyAgICBkbWFjX2NsZWFyaW50cihob3N0LT5kbWEuaW9faW50cl9jbGVhcik7CisKKyNpZiAoREVCVUcgJiBERUJVR19ETUEpCisgICAgREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAic3RvcCIpKTsKKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX2RtYV9zZXR1cChBU19Ib3N0ICpob3N0LCBkbWFkaXJfdCBkaXJlY3Rpb24pCisgKiBQdXJwb3NlIDogc2V0dXAgRE1BIGNvbnRyb2xsZXIgZm9yIGRhdGEgdHJhbnNmZXIKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBzZXR1cAorICoJICAgICBkaXJlY3Rpb24gLSBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbgorICogTm90ZXMgICA6IFRoaXMgaXMgY2FsbGVkIHdoZW4gZW50ZXJpbmcgREFUQSBJL08gcGhhc2UsIG5vdAorICoJICAgICB3aGlsZSB3ZSdyZSBpbiBhIERBVEEgSS9PIHBoYXNlCisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfZG1hX3NldHVwKEFTX0hvc3QgKmhvc3QsIGRtYWRpcl90IGRpcmVjdGlvbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYWRkcmVzcywgbGVuZ3RoLCBtb2RlOworCisgICAgaG9zdC0+ZG1hLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PTik7CisKKyAgICBpZiAoZGlyZWN0aW9uID09IERNQV9PVVQpIHsKKyNpZiAoREVCVUcgJiBERUJVR19OT19XUklURSkKKwlpZiAoTk9fV1JJVEUgJiAoMSA8PCBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCkpIHsKKwkgICAgcHJpbnRrKEtFUk5fQ1JJVCAic2NzaSVkLiVjOiBJIGNhbid0IGhhbmRsZSBETUFfT1VUIVxuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCisJbW9kZSA9IERNQUNfV1JJVEU7CisgICAgfSBlbHNlCisJbW9kZSA9IERNQUNfUkVBRDsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgc29tZSBidWZmZXIgc3BhY2UsIGxpbWl0ZWQgdG8gaGFsZiB0aGUgYnVmZmVyIHNpemUKKyAgICAgKi8KKyAgICBsZW5ndGggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGhvc3QtPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwsIERNQUNfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICBpZiAobGVuZ3RoKSB7CisJaG9zdC0+ZG1hLnN0YXJ0X2FkZHIgPSBhZGRyZXNzID0gaG9zdC0+ZG1hLmZyZWVfYWRkcjsKKwlob3N0LT5kbWEuZnJlZV9hZGRyID0gKGhvc3QtPmRtYS5mcmVlX2FkZHIgKyBsZW5ndGgpICYKKwkJCQkoRE1BQ19CVUZGRVJfU0laRSAtIDEpOworCisJLyoKKwkgKiBUcmFuc2ZlciBkYXRhIHRvIERNQSBtZW1vcnkKKwkgKi8KKwlpZiAoZGlyZWN0aW9uID09IERNQV9PVVQpCisJICAgIGFjb3Juc2NzaV9kYXRhX3dyaXRlKGhvc3QsIGhvc3QtPnNjc2kuU0NwLnB0ciwgaG9zdC0+ZG1hLnN0YXJ0X2FkZHIsCisJCQkJbGVuZ3RoKTsKKworCWxlbmd0aCAtPSAxOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhDTlRMTywgbGVuZ3RoKTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05USEksIGxlbmd0aCA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTE8sIGFkZHJlc3MpOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhBRFJNRCwgYWRkcmVzcyA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIDApOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTU9ERUNPTiwgbW9kZSk7CisJZG1hY193cml0ZShob3N0LT5kbWEuaW9fcG9ydCwgRE1BQ19NQVNLUkVHLCBNQVNLX09GRik7CisKKyNpZiAoREVCVUcgJiBERUJVR19ETUEpCisJREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAic3RydCIpKTsKKyNlbmRpZgorCWhvc3QtPmRtYS54ZmVyX3NldHVwID0gMTsKKyAgICB9Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfZG1hX2NsZWFudXAoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBlbnN1cmUgdGhhdCBhbGwgRE1BIHRyYW5zZmVycyBhcmUgdXAtdG8tZGF0ZSAmIGhvc3QtPnNjc2kuU0NwIGlzIGNvcnJlY3QKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBmaW5pc2gKKyAqIE5vdGVzICAgOiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgY29tbWFuZCBpczoKKyAqCQl0ZXJtaW5hdGluZywgUkVTVE9SRV9QT0lOVEVSUywgU0FWRV9QT0lOVEVSUywgRElTQ09ORUNUCisgKgkgICA6IFRoaXMgbXVzdCBub3QgcmV0dXJuIHVudGlsIGFsbCB0cmFuc2ZlcnMgYXJlIGNvbXBsZXRlZC4KKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kbWFfY2xlYW51cChBU19Ib3N0ICpob3N0KQoreworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PTik7CisgICAgZG1hY19jbGVhcmludHIoaG9zdC0+ZG1hLmlvX2ludHJfY2xlYXIpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgYSBwZW5kaW5nIHRyYW5zZmVyCisgICAgICovCisgICAgaWYgKGhvc3QtPmRtYS54ZmVyX3JlcXVpcmVkKSB7CisJaG9zdC0+ZG1hLnhmZXJfcmVxdWlyZWQgPSAwOworCWlmIChob3N0LT5kbWEuZGlyZWN0aW9uID09IERNQV9JTikKKwkgICAgYWNvcm5zY3NpX2RhdGFfcmVhZChob3N0LCBob3N0LT5kbWEueGZlcl9wdHIsCisJCQkJIGhvc3QtPmRtYS54ZmVyX3N0YXJ0LCBob3N0LT5kbWEueGZlcl9sZW5ndGgpOworICAgIH0KKworICAgIC8qCisgICAgICogSGFzIGEgdHJhbnNmZXIgYmVlbiBzZXR1cD8KKyAgICAgKi8KKyAgICBpZiAoaG9zdC0+ZG1hLnhmZXJfc2V0dXApIHsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJyZWQ7CisKKwlob3N0LT5kbWEueGZlcl9zZXR1cCA9IDA7CisKKyNpZiAoREVCVUcgJiBERUJVR19ETUEpCisJREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAiY3VwaSIpKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gRE1BLgorCSAqLworCXRyYW5zZmVycmVkID0gZG1hY19hZGRyZXNzKGhvc3QtPmRtYS5pb19wb3J0KSAtIGhvc3QtPmRtYS5zdGFydF9hZGRyOworCWhvc3QtPmRtYS50cmFuc2ZlcnJlZCArPSB0cmFuc2ZlcnJlZDsKKworCWlmIChob3N0LT5kbWEuZGlyZWN0aW9uID09IERNQV9JTikKKwkgICAgYWNvcm5zY3NpX2RhdGFfcmVhZChob3N0LCBob3N0LT5zY3NpLlNDcC5wdHIsCisJCQkJIGhvc3QtPmRtYS5zdGFydF9hZGRyLCB0cmFuc2ZlcnJlZCk7CisKKwkvKgorCSAqIFVwZGF0ZSBTQ1NJIHBvaW50ZXJzCisJICovCisJYWNvcm5zY3NpX2RhdGFfdXBkYXRlcHRyKGhvc3QsICZob3N0LT5zY3NpLlNDcCwgdHJhbnNmZXJyZWQpOworI2lmIChERUJVRyAmIERFQlVHX0RNQSkKKwlEQkcoaG9zdC0+U0NwbnQsIGFjb3Juc2NzaV9kdW1wZG1hKGhvc3QsICJjdXBvIikpOworI2VuZGlmCisgICAgfQorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX2RtYWNpbnRyKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBETUFDIGRldmljZQorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIHByb2Nlc3MKKyAqIE5vdGVzICAgOiBJZiByZWFkaW5nLCB3ZSBzY2hlZHVsZSB0aGUgcmVhZCB0byBtYWluIG1lbW9yeSAmCisgKgkgICAgIGFsbG93IHRoZSB0cmFuc2ZlciB0byBjb250aW51ZS4KKyAqCSAgIDogSWYgd3JpdGluZywgd2UgZmlsbCB0aGUgb25ib2FyZCBETUEgbWVtb3J5IGZyb20gbWFpbgorICoJICAgICBtZW1vcnkuCisgKgkgICA6IENhbGxlZCB3aGVuZXZlciBETUFDIGZpbmlzaGVkIGl0J3MgY3VycmVudCB0cmFuc2Zlci4KKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9kbWFfaW50cihBU19Ib3N0ICpob3N0KQoreworICAgIHVuc2lnbmVkIGludCBhZGRyZXNzLCBsZW5ndGgsIHRyYW5zZmVycmVkOworCisjaWYgKERFQlVHICYgREVCVUdfRE1BKQorICAgIERCRyhob3N0LT5TQ3BudCwgYWNvcm5zY3NpX2R1bXBkbWEoaG9zdCwgImludGkiKSk7CisjZW5kaWYKKworICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PTik7CisgICAgZG1hY19jbGVhcmludHIoaG9zdC0+ZG1hLmlvX2ludHJfY2xlYXIpOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYW1vdW50IHRyYW5zZmVycmVkIHZpYSBETUEKKyAgICAgKi8KKyAgICB0cmFuc2ZlcnJlZCA9IGRtYWNfYWRkcmVzcyhob3N0LT5kbWEuaW9fcG9ydCkgLSBob3N0LT5kbWEuc3RhcnRfYWRkcjsKKyAgICBob3N0LT5kbWEudHJhbnNmZXJyZWQgKz0gdHJhbnNmZXJyZWQ7CisKKyAgICAvKgorICAgICAqIFNjaGVkdWxlIERNQSB0cmFuc2ZlciBvZmYgYm9hcmQKKyAgICAgKi8KKyAgICBpZiAoaG9zdC0+ZG1hLmRpcmVjdGlvbiA9PSBETUFfSU4pIHsKKwlob3N0LT5kbWEueGZlcl9zdGFydCA9IGhvc3QtPmRtYS5zdGFydF9hZGRyOworCWhvc3QtPmRtYS54ZmVyX2xlbmd0aCA9IHRyYW5zZmVycmVkOworCWhvc3QtPmRtYS54ZmVyX3B0ciA9IGhvc3QtPnNjc2kuU0NwLnB0cjsKKwlob3N0LT5kbWEueGZlcl9yZXF1aXJlZCA9IDE7CisgICAgfQorCisgICAgYWNvcm5zY3NpX2RhdGFfdXBkYXRlcHRyKGhvc3QsICZob3N0LT5zY3NpLlNDcCwgdHJhbnNmZXJyZWQpOworCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlciBzcGFjZSwgbGltaXRlZCB0byBoYWxmIHRoZSBvbi1ib2FyZCBSQU0gc2l6ZQorICAgICAqLworICAgIGxlbmd0aCA9IG1pbl90KHVuc2lnbmVkIGludCwgaG9zdC0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCwgRE1BQ19CVUZGRVJfU0laRSAvIDIpOworICAgIGlmIChsZW5ndGgpIHsKKwlob3N0LT5kbWEuc3RhcnRfYWRkciA9IGFkZHJlc3MgPSBob3N0LT5kbWEuZnJlZV9hZGRyOworCWhvc3QtPmRtYS5mcmVlX2FkZHIgPSAoaG9zdC0+ZG1hLmZyZWVfYWRkciArIGxlbmd0aCkgJgorCQkJCShETUFDX0JVRkZFUl9TSVpFIC0gMSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIGRhdGEgdG8gRE1BIG1lbW9yeQorCSAqLworCWlmIChob3N0LT5kbWEuZGlyZWN0aW9uID09IERNQV9PVVQpCisJICAgIGFjb3Juc2NzaV9kYXRhX3dyaXRlKGhvc3QsIGhvc3QtPnNjc2kuU0NwLnB0ciwgaG9zdC0+ZG1hLnN0YXJ0X2FkZHIsCisJCQkJbGVuZ3RoKTsKKworCWxlbmd0aCAtPSAxOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhDTlRMTywgbGVuZ3RoKTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05USEksIGxlbmd0aCA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTE8sIGFkZHJlc3MpOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhBRFJNRCwgYWRkcmVzcyA+PiA4KTsKKwlkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIDApOworCWRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfTUFTS1JFRywgTUFTS19PRkYpOworCisjaWYgKERFQlVHICYgREVCVUdfRE1BKQorCURCRyhob3N0LT5TQ3BudCwgYWNvcm5zY3NpX2R1bXBkbWEoaG9zdCwgImludG8iKSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworCWhvc3QtPmRtYS54ZmVyX3NldHVwID0gMDsKKyNpZiAwCisJLyoKKwkgKiBJZiB0aGUgaW50ZXJmYWNlIHN0aWxsIHdhbnRzIG1vcmUsIHRoZW4gdGhpcyBpcyBhbiBlcnJvci4KKwkgKiBXZSBnaXZlIGl0IGFub3RoZXIgYnl0ZSwgYnV0IHdlIGFsc28gYXR0ZW1wdCB0byByYWlzZSBhbgorCSAqIGF0dGVudGlvbiBjb25kaXRpb24uICBXZSBjb250aW51ZSBnaXZpbmcgb25lIGJ5dGUgdW50aWwKKwkgKiB0aGUgZGV2aWNlIHJlY29nbmlzZXMgdGhlIGF0dGVudGlvbi4KKwkgKi8KKwlpZiAoZG1hY19yZWFkKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1NUQVRVUykgJiBTVEFUVVNfUlEwKSB7CisJICAgIGFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05UTE8sIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQ05USEksIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTE8sIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTUQsIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIDApOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX01BU0tSRUcsIE1BU0tfT0ZGKTsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfZG1hX3hmZXIoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiB0cmFuc2ZlciBkYXRhIGJldHdlZW4gQWNvcm5TQ1NJIGFuZCBtZW1vcnkKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBwcm9jZXNzCisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfZG1hX3hmZXIoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICBob3N0LT5kbWEueGZlcl9yZXF1aXJlZCA9IDA7CisKKyAgICBpZiAoaG9zdC0+ZG1hLmRpcmVjdGlvbiA9PSBETUFfSU4pCisJYWNvcm5zY3NpX2RhdGFfcmVhZChob3N0LCBob3N0LT5kbWEueGZlcl9wdHIsCisJCQkJaG9zdC0+ZG1hLnhmZXJfc3RhcnQsIGhvc3QtPmRtYS54ZmVyX2xlbmd0aCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfZG1hX2FkanVzdChBU19Ib3N0ICpob3N0KQorICogUHVycG9zZSA6IGFkanVzdCBETUEgcG9pbnRlcnMgJiBjb3VudCBmb3IgYnl0ZXMgdHJhbnNmZXJyZWQgdG8KKyAqCSAgICAgU0JJQyBidXQgbm90IFNDU0kgYnVzLgorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIGFkanVzdCBETUEgY291bnQgZm9yCisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfZG1hX2FkanVzdChBU19Ib3N0ICpob3N0KQoreworICAgIGlmIChob3N0LT5kbWEueGZlcl9zZXR1cCkgeworCXNpZ25lZCBsb25nIHRyYW5zZmVycmVkOworI2lmIChERUJVRyAmIChERUJVR19ETUF8REVCVUdfV1JJVEUpKQorCURCRyhob3N0LT5TQ3BudCwgYWNvcm5zY3NpX2R1bXBkbWEoaG9zdCwgImFkamkiKSk7CisjZW5kaWYKKwkvKgorCSAqIENhbGN1bGF0ZSBjb3JyZWN0IERNQSBhZGRyZXNzIC0gRE1BIGlzIGFoZWFkIG9mIFNDU0kgYnVzIHdoaWxlCisJICogd3JpdGluZy4KKwkgKiAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgKiAgYWN0dWFsbHkgdHJhbnNmZXJyZWQgdG8vZnJvbSB0aGUgU0NTSSBidXMuCisJICogIGhvc3QtPmRtYS50cmFuc2ZlcnJlZCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisJICogIG92ZXIgRE1BIHNpbmNlIGhvc3QtPmRtYS5zdGFydF9hZGRyIHdhcyBsYXN0IHNldC4KKwkgKgorCSAqIHJlYWxfZG1hX2FkZHIgPSBob3N0LT5kbWEuc3RhcnRfYWRkciArIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZAorCSAqCQkgICAtIGhvc3QtPmRtYS50cmFuc2ZlcnJlZAorCSAqLworCXRyYW5zZmVycmVkID0gaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkIC0gaG9zdC0+ZG1hLnRyYW5zZmVycmVkOworCWlmICh0cmFuc2ZlcnJlZCA8IDApCisJICAgIHByaW50aygic2NzaSVkLiVjOiBBY2shIERNQSB3cml0ZSBjb3JyZWN0aW9uICVsZCA8IDAhXG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgdHJhbnNmZXJyZWQpOworCWVsc2UgaWYgKHRyYW5zZmVycmVkID09IDApCisJICAgIGhvc3QtPmRtYS54ZmVyX3NldHVwID0gMDsKKwllbHNlIHsKKwkgICAgdHJhbnNmZXJyZWQgKz0gaG9zdC0+ZG1hLnN0YXJ0X2FkZHI7CisJICAgIGRtYWNfd3JpdGUoaG9zdC0+ZG1hLmlvX3BvcnQsIERNQUNfVFhBRFJMTywgdHJhbnNmZXJyZWQpOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSTUQsIHRyYW5zZmVycmVkID4+IDgpOworCSAgICBkbWFjX3dyaXRlKGhvc3QtPmRtYS5pb19wb3J0LCBETUFDX1RYQURSSEksIHRyYW5zZmVycmVkID4+IDE2KTsKKyNpZiAoREVCVUcgJiAoREVCVUdfRE1BfERFQlVHX1dSSVRFKSkKKwkgICAgREJHKGhvc3QtPlNDcG50LCBhY29ybnNjc2lfZHVtcGRtYShob3N0LCAiYWRqbyIpKTsKKyNlbmRpZgorCX0KKyAgICB9Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERhdGEgSS9PCisgKi8KK3N0YXRpYyBpbnQKK2Fjb3Juc2NzaV93cml0ZV9waW8oQVNfSG9zdCAqaG9zdCwgY2hhciAqYnl0ZXMsIGludCAqcHRyLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgbWF4X3RpbWVvdXQpCit7CisJdW5zaWduZWQgaW50IGFzciwgdGltZW91dCA9IG1heF90aW1lb3V0OworCWludCBteV9wdHIgPSAqcHRyOworCisJd2hpbGUgKG15X3B0ciA8IGxlbikgeworCQlhc3IgPSBzYmljX2FybV9yZWFkKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19BU1IpOworCisJCWlmIChhc3IgJiBBU1JfREJSKSB7CisJCQl0aW1lb3V0ID0gbWF4X3RpbWVvdXQ7CisKKwkJCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19EQVRBLCBieXRlc1tteV9wdHIrK10pOworCQl9IGVsc2UgaWYgKGFzciAmIEFTUl9JTlQpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoLS10aW1lb3V0ID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCSpwdHIgPSBteV9wdHI7CisKKwlyZXR1cm4gKHRpbWVvdXQgPT0gMCkgPyAtMSA6IDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfc2VuZGNvbW1hbmQoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBzZW5kIGEgY29tbWFuZCB0byBhIHRhcmdldAorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0YXJnZXQKKyAqLworc3RhdGljIHZvaWQKK2Fjb3Juc2NzaV9zZW5kY29tbWFuZChBU19Ib3N0ICpob3N0KQoreworICAgIFNjc2lfQ21uZCAqU0NwbnQgPSBob3N0LT5TQ3BudDsKKworICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19UUkFOU0NOVEgsIDApOworICAgIHNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIDApOworICAgIHNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIFNDcG50LT5jbWRfbGVuIC0gaG9zdC0+c2NzaS5TQ3Auc2VudF9jb21tYW5kKTsKKworICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfWEZFUklORk8pOworCisgICAgaWYgKGFjb3Juc2NzaV93cml0ZV9waW8oaG9zdCwgU0NwbnQtPmNtbmQsCisJKGludCAqKSZob3N0LT5zY3NpLlNDcC5zZW50X2NvbW1hbmQsIFNDcG50LT5jbWRfbGVuLCAxMDAwMDAwKSkKKwlwcmludGsoInNjc2klZDogdGltZW91dCB3aGlsZSBzZW5kaW5nIGNvbW1hbmRcbiIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0NPTU1BTkQ7Cit9CisKK3N0YXRpYwordm9pZCBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbWVzc2FnZV9sZW5ndGggPSBtc2dxdWV1ZV9tc2dsZW5ndGgoJmhvc3QtPnNjc2kubXNncyk7CisgICAgdW5zaWduZWQgaW50IG1zZ25yOworICAgIHN0cnVjdCBtZXNzYWdlICptc2c7CisKKyNpZiAoREVCVUcgJiBERUJVR19NRVNTQUdFUykKKyAgICBwcmludGsoInNjc2klZC4lYzogc2VuZGluZyBtZXNzYWdlICIsCisJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKG1lc3NhZ2VfbGVuZ3RoKSB7CisgICAgY2FzZSAwOgorCWFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfWEZFUklORk8gfCBDTU5EX1NCVCk7CisKKwlhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9EQlIsIEFTUl9EQlIsIDEwMDAsICJzZW5kaW5nIG1lc3NhZ2UgMSIpOworCisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RBVEEsIE5PUCk7CisKKwlob3N0LT5zY3NpLmxhc3RfbWVzc2FnZSA9IE5PUDsKKyNpZiAoREVCVUcgJiBERUJVR19NRVNTQUdFUykKKwlwcmludGsoIk5PUCIpOworI2VuZGlmCisJYnJlYWs7CisKKyAgICBjYXNlIDE6CisJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9YRkVSSU5GTyB8IENNTkRfU0JUKTsKKwltc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmhvc3QtPnNjc2kubXNncywgMCk7CisKKwlhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9EQlIsIEFTUl9EQlIsIDEwMDAsICJzZW5kaW5nIG1lc3NhZ2UgMiIpOworCisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RBVEEsIG1zZy0+bXNnWzBdKTsKKworCWhvc3QtPnNjc2kubGFzdF9tZXNzYWdlID0gbXNnLT5tc2dbMF07CisjaWYgKERFQlVHICYgREVCVUdfTUVTU0FHRVMpCisJcHJpbnRfbXNnKG1zZy0+bXNnKTsKKyNlbmRpZgorCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwkvKgorCSAqIEFOU0kgc3RhbmRhcmQgc2F5czogKFNDU0ktMiBSZXYgMTBjIFNlY3QgNS42LjE0KQorCSAqICdXaGVuIGEgdGFyZ2V0IHNlbmRzIHRoaXMgKE1FU1NBR0VfUkVKRUNUKSBtZXNzYWdlLCBpdAorCSAqICBzaGFsbCBjaGFuZ2UgdG8gTUVTU0FHRSBJTiBwaGFzZSBhbmQgc2VuZCB0aGlzIG1lc3NhZ2UKKwkgKiAgcHJpb3IgdG8gcmVxdWVzdGluZyBhZGRpdGlvbmFsIG1lc3NhZ2UgYnl0ZXMgZnJvbSB0aGUKKwkgKiAgaW5pdGlhdG9yLiAgVGhpcyBwcm92aWRlcyBhbiBpbnRlcmxvY2sgc28gdGhhdCB0aGUKKwkgKiAgaW5pdGlhdG9yIGNhbiBkZXRlcm1pbmUgd2hpY2ggbWVzc2FnZSBieXRlIGlzIHJlamVjdGVkLgorCSAqLworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19UUkFOU0NOVEgsIDApOworCXNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIDApOworCXNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIG1lc3NhZ2VfbGVuZ3RoKTsKKwlhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX1hGRVJJTkZPKTsKKworCW1zZ25yID0gMDsKKwl3aGlsZSAoKG1zZyA9IG1zZ3F1ZXVlX2dldG1zZygmaG9zdC0+c2NzaS5tc2dzLCBtc2ducisrKSkgIT0gTlVMTCkgeworCSAgICB1bnNpZ25lZCBpbnQgaTsKKyNpZiAoREVCVUcgJiBERUJVR19NRVNTQUdFUykKKwkgICAgcHJpbnRfbXNnKG1zZyk7CisjZW5kaWYKKwkgICAgaSA9IDA7CisJICAgIGlmIChhY29ybnNjc2lfd3JpdGVfcGlvKGhvc3QsIG1zZy0+bXNnLCAmaSwgbXNnLT5sZW5ndGgsIDEwMDAwMDApKQorCQlwcmludGsoInNjc2klZDogdGltZW91dCB3aGlsZSBzZW5kaW5nIG1lc3NhZ2VcbiIsIGhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisJICAgIGhvc3QtPnNjc2kubGFzdF9tZXNzYWdlID0gbXNnLT5tc2dbMF07CisJICAgIGlmIChtc2ctPm1zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKQorCQlob3N0LT5zY3NpLmxhc3RfbWVzc2FnZSB8PSBtc2ctPm1zZ1syXSA8PCA4OworCisJICAgIGlmIChpICE9IG1zZy0+bGVuZ3RoKQorCQlicmVhazsKKwl9CisJYnJlYWs7CisgICAgfQorI2lmIChERUJVRyAmIERFQlVHX01FU1NBR0VTKQorICAgIHByaW50aygiXG4iKTsKKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX3JlYWRzdGF0dXNieXRlKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogUmVhZCBzdGF0dXMgYnl0ZSBmcm9tIGNvbm5lY3RlZCB0YXJnZXQKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCBjb25uZWN0ZWQgdG8gdGFyZ2V0CisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICBhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX1hGRVJJTkZPfENNTkRfU0JUKTsKKyAgICBhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9EQlIsIEFTUl9EQlIsIDEwMDAsICJyZWFkaW5nIHN0YXR1cyBieXRlIik7CisgICAgaG9zdC0+c2NzaS5TQ3AuU3RhdHVzID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfREFUQSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdW5zaWduZWQgY2hhciBhY29ybnNjc2lfcmVhZG1lc3NhZ2VieXRlKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogUmVhZCBvbmUgbWVzc2FnZSBieXRlIGZyb20gY29ubmVjdGVkIHRhcmdldAorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IGNvbm5lY3RlZCB0byB0YXJnZXQKKyAqLworc3RhdGljCit1bnNpZ25lZCBjaGFyIGFjb3Juc2NzaV9yZWFkbWVzc2FnZWJ5dGUoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2U7CisKKyAgICBhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX1hGRVJJTkZPIHwgQ01ORF9TQlQpOworCisgICAgYWNvcm5zY3NpX3NiaWNfd2FpdChob3N0LCBBU1JfREJSLCBBU1JfREJSLCAxMDAwLCAiZm9yIG1lc3NhZ2UgYnl0ZSIpOworCisgICAgbWVzc2FnZSA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0RBVEEpOworCisgICAgLyogd2FpdCBmb3IgTVNHSU4tWEZFUi1QQVVTRUQgKi8KKyAgICBhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9JTlQsIEFTUl9JTlQsIDEwMDAsICJmb3IgaW50ZXJydXB0IGFmdGVyIG1lc3NhZ2UgYnl0ZSIpOworCisgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKworICAgIHJldHVybiBtZXNzYWdlOworfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgYWNvcm5zY3NpX21lc3NhZ2UoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBSZWFkIGNvbXBsZXRlIG1lc3NhZ2UgZnJvbSBjb25uZWN0ZWQgdGFyZ2V0ICYgYWN0aW9uIG1lc3NhZ2UKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCBjb25uZWN0ZWQgdG8gdGFyZ2V0CisgKi8KK3N0YXRpYwordm9pZCBhY29ybnNjc2lfbWVzc2FnZShBU19Ib3N0ICpob3N0KQoreworICAgIHVuc2lnbmVkIGNoYXIgbWVzc2FnZVsxNl07CisgICAgdW5zaWduZWQgaW50IG1zZ2lkeCA9IDAsIG1zZ2xlbiA9IDE7CisKKyAgICBkbyB7CisJbWVzc2FnZVttc2dpZHhdID0gYWNvcm5zY3NpX3JlYWRtZXNzYWdlYnl0ZShob3N0KTsKKworCXN3aXRjaCAobXNnaWR4KSB7CisJY2FzZSAwOgorCSAgICBpZiAobWVzc2FnZVswXSA9PSBFWFRFTkRFRF9NRVNTQUdFIHx8CisJCShtZXNzYWdlWzBdID49IDB4MjAgJiYgbWVzc2FnZVswXSA8PSAweDJmKSkKKwkJbXNnbGVuID0gMjsKKwkgICAgYnJlYWs7CisKKwljYXNlIDE6CisJICAgIGlmIChtZXNzYWdlWzBdID09IEVYVEVOREVEX01FU1NBR0UpCisJCW1zZ2xlbiArPSBtZXNzYWdlW21zZ2lkeF07CisJICAgIGJyZWFrOworCX0KKwltc2dpZHggKz0gMTsKKwlpZiAobXNnaWR4IDwgbXNnbGVuKSB7CisJICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfTkVHQVRFQUNLKTsKKworCSAgICAvKiB3YWl0IGZvciBuZXh0IG1zZy1pbiAqLworCSAgICBhY29ybnNjc2lfc2JpY193YWl0KGhvc3QsIEFTUl9JTlQsIEFTUl9JTlQsIDEwMDAsICJmb3IgaW50ZXJydXB0IGFmdGVyIG5lZ2F0ZSBhY2siKTsKKwkgICAgc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKwl9CisgICAgfSB3aGlsZSAobXNnaWR4IDwgbXNnbGVuKTsKKworI2lmIChERUJVRyAmIERFQlVHX01FU1NBR0VTKQorICAgIHByaW50aygic2NzaSVkLiVjOiBtZXNzYWdlIGluOiAiLAorCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKTsKKyAgICBwcmludF9tc2cobWVzc2FnZSk7CisgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICBpZiAoaG9zdC0+c2NzaS5waGFzZSA9PSBQSEFTRV9SRUNPTk5FQ1RFRCkgeworCS8qCisJICogQU5TSSBzdGFuZGFyZCBzYXlzOiAoU2VjdGlvbiBTQ1NJLTIgUmV2LiAxMGMgU2VjdCA1LjYuMTcpCisJICogJ1doZW5ldmVyIGEgdGFyZ2V0IHJlY29ubmVjdHMgdG8gYW4gaW5pdGlhdG9yIHRvIGNvbnRpbnVlCisJICogIGEgdGFnZ2VkIEkvTyBwcm9jZXNzLCB0aGUgU0lNUExFIFFVRVVFIFRBRyBtZXNzYWdlIHNoYWxsCisJICogIGJlIHNlbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBJREVOVElGWSBtZXNzYWdlLi4uJworCSAqLworCWlmIChtZXNzYWdlWzBdID09IFNJTVBMRV9RVUVVRV9UQUcpCisJICAgIGhvc3QtPnNjc2kucmVjb25uZWN0ZWQudGFnID0gbWVzc2FnZVsxXTsKKwlpZiAoYWNvcm5zY3NpX3JlY29ubmVjdF9maW5pc2goaG9zdCkpCisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9NU0dJTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1lc3NhZ2VbMF0pIHsKKyAgICBjYXNlIEFCT1JUOgorICAgIGNhc2UgQUJPUlRfVEFHOgorICAgIGNhc2UgQ09NTUFORF9DT01QTEVURToKKwlpZiAoaG9zdC0+c2NzaS5waGFzZSAhPSBQSEFTRV9TVEFUVVNJTikgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogY29tbWFuZCBjb21wbGV0ZSBmb2xsb3dpbmcgbm9uLXN0YXR1cyBpbiBwaGFzZT9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQtPmRldmljZS0+aWQpOworCX0KKwlob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfRE9ORTsKKwlob3N0LT5zY3NpLlNDcC5NZXNzYWdlID0gbWVzc2FnZVswXTsKKwlicmVhazsKKworICAgIGNhc2UgU0FWRV9QT0lOVEVSUzoKKwkvKgorCSAqIEFOU0kgc3RhbmRhcmQgc2F5czogKFNlY3Rpb24gU0NTSS0yIFJldi4gMTBjIFNlY3QgNS42LjIwKQorCSAqICdUaGUgU0FWRSBEQVRBIFBPSU5URVIgbWVzc2FnZSBpcyBzZW50IGZyb20gYSB0YXJnZXQgdG8KKwkgKiAgZGlyZWN0IHRoZSBpbml0aWF0b3IgdG8gY29weSB0aGUgYWN0aXZlIGRhdGEgcG9pbnRlciB0bworCSAqICB0aGUgc2F2ZWQgZGF0YSBwb2ludGVyIGZvciB0aGUgY3VycmVudCBJL08gcHJvY2Vzcy4KKwkgKi8KKwlhY29ybnNjc2lfZG1hX2NsZWFudXAoaG9zdCk7CisJaG9zdC0+U0NwbnQtPlNDcCA9IGhvc3QtPnNjc2kuU0NwOworCWhvc3QtPlNDcG50LT5TQ3Auc2VudF9jb21tYW5kID0gMDsKKwlob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU47CisJYnJlYWs7CisKKyAgICBjYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJLyoKKwkgKiBBTlNJIHN0YW5kYXJkIHNheXM6IChTZWN0aW9uIFNDU0ktMiBSZXYuIDEwYyBTZWN0IDUuNi4xOSkKKwkgKiAnVGhlIFJFU1RPUkUgUE9JTlRFUlMgbWVzc2FnZSBpcyBzZW50IGZyb20gYSB0YXJnZXQgdG8KKwkgKiAgZGlyZWN0IHRoZSBpbml0aWF0b3IgdG8gY29weSB0aGUgbW9zdCByZWNlbnRseSBzYXZlZAorCSAqICBjb21tYW5kLCBkYXRhLCBhbmQgc3RhdHVzIHBvaW50ZXJzIGZvciB0aGUgSS9PIHByb2Nlc3MKKwkgKiAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWN0aXZlIHBvaW50ZXJzLiAgVGhlIGNvbW1hbmQgYW5kCisJICogIHN0YXR1cyBwb2ludGVycyBzaGFsbCBiZSByZXN0b3JlZCB0byB0aGUgYmVnaW5uaW5nIG9mCisJICogIHRoZSBwcmVzZW50IGNvbW1hbmQgYW5kIHN0YXR1cyBhcmVhcy4nCisJICovCisJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCWhvc3QtPnNjc2kuU0NwID0gaG9zdC0+U0NwbnQtPlNDcDsKKwlob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU47CisJYnJlYWs7CisKKyAgICBjYXNlIERJU0NPTk5FQ1Q6CisJLyoKKwkgKiBBTlNJIHN0YW5kYXJkIHNheXM6IChTZWN0aW9uIFNDU0ktMiBSZXYuIDEwYyBTZWN0IDYuNC4yKQorCSAqICdPbiB0aG9zZSBvY2Nhc2lvbnMgd2hlbiBhbiBlcnJvciBvciBleGNlcHRpb24gY29uZGl0aW9uIG9jY3VycworCSAqICBhbmQgdGhlIHRhcmdldCBlbGVjdHMgdG8gcmVwZWF0IHRoZSBpbmZvcm1hdGlvbiB0cmFuc2ZlciwgdGhlCisJICogIHRhcmdldCBtYXkgcmVwZWF0IHRoZSB0cmFuc2ZlciBlaXRoZXIgaXNzdWluZyBhIFJFU1RPUkUgUE9JTlRFUlMKKwkgKiAgbWVzc2FnZSBvciBieSBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaXNzdWluZyBhIFNBVkUgUE9JTlRFUlMKKwkgKiAgbWVzc2FnZS4gIFdoZW4gcmVjb25uZWN0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIG1vc3QgcmVjZW50CisJICogIHNhdmVkIHBvaW50ZXIgdmFsdWVzIGFyZSByZXN0b3JlZC4nCisJICovCisJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCWhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9ESVNDT05ORUNUOworCWJyZWFrOworCisgICAgY2FzZSBNRVNTQUdFX1JFSkVDVDoKKyNpZiAwIC8qIHRoaXMgaXNuJ3QgbmVlZGVkIGFueSBtb3JlICovCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIG5lZ29jaWF0aW5nIHN5bmMgdHJhbnNmZXIsIHdlIGRvbid0IHlldCBrbm93IGlmCisJICogdGhpcyBSRUpFQ1QgaXMgZm9yIHRoZSBzeW5jIHRyYW5zZmVyIG9yIGZvciB0aGUgdGFnZ2VkIHF1ZXVlL3dpZGUKKwkgKiB0cmFuc2Zlci4gIFJlLWluaXRpYXRlIHN5bmMgdHJhbnNmZXIgbmVnb2NpYXRpb24gbm93LCBhbmQgaWYKKwkgKiB3ZSBnb3QgYSBSRUpFQ1QgaW4gcmVzcG9uc2UgdG8gU0RUUiwgdGhlbiBpdCdsbCBiZSBzZXQgdG8gRE9ORS4KKwkgKi8KKwlpZiAoaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID09IFNZTkNfU0VOVF9SRVFVRVNUKQorCSAgICBob3N0LT5kZXZpY2VbaG9zdC0+U0NwbnQtPmRldmljZS0+aWRdLnN5bmNfc3RhdGUgPSBTWU5DX05FR09DSUFURTsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFueSBtZXNzYWdlcyB3YWl0aW5nIHRvIGdvIG91dCwgdGhlbiBhc3NlcnQgQVROIG5vdworCSAqLworCWlmIChtc2dxdWV1ZV9tc2dsZW5ndGgoJmhvc3QtPnNjc2kubXNncykpCisJICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfQVNTRVJUQVROKTsKKworCXN3aXRjaCAoaG9zdC0+c2NzaS5sYXN0X21lc3NhZ2UpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfVEFHR0VEX1FVRVVFCisJY2FzZSBIRUFEX09GX1FVRVVFX1RBRzoKKwljYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCWNhc2UgU0lNUExFX1FVRVVFX1RBRzoKKwkgICAgLyoKKwkgICAgICogQU5TSSBzdGFuZGFyZCBzYXlzOiAoU2VjdGlvbiBTQ1NJLTIgUmV2LiAxMGMgU2VjdCA1LjYuMTcpCisJICAgICAqICBJZiBhIHRhcmdldCBkb2VzIG5vdCBpbXBsZW1lbnQgdGFnZ2VkIHF1ZXVpbmcgYW5kIGEgcXVldWUgdGFnCisJICAgICAqICBtZXNzYWdlIGlzIHJlY2VpdmVkLCBpdCBzaGFsbCByZXNwb25kIHdpdGggYSBNRVNTQUdFIFJFSkVDVAorCSAgICAgKiAgbWVzc2FnZSBhbmQgYWNjZXB0IHRoZSBJL08gcHJvY2VzcyBhcyBpZiBpdCB3ZXJlIHVudGFnZ2VkLgorCSAgICAgKi8KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQuJWM6IGRpc2FibGluZyB0YWdnZWQgcXVldWVpbmdcbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKTsKKwkgICAgaG9zdC0+U0NwbnQtPmRldmljZS0+c2ltcGxlX3RhZ3MgPSAwOworCSAgICBzZXRfYml0KGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkICogOCArIGhvc3QtPlNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCSAgICBicmVhazsKKyNlbmRpZgorCWNhc2UgRVhURU5ERURfTUVTU0FHRSB8IChFWFRFTkRFRF9TRFRSIDw8IDgpOgorCSAgICAvKgorCSAgICAgKiBUYXJnZXQgY2FuJ3QgaGFuZGxlIHN5bmNocm9ub3VzIHRyYW5zZmVycworCSAgICAgKi8KKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQuJWM6IFVzaW5nIGFzeW5jaHJvbm91cyB0cmFuc2ZlclxuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworCSAgICBob3N0LT5kZXZpY2VbaG9zdC0+U0NwbnQtPmRldmljZS0+aWRdLnN5bmNfeGZlciA9IFNZTkNIVFJBTlNGRVJfMkRCQTsKKwkgICAgaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID0gU1lOQ19BU1lOQ0hST05PVVM7CisJICAgIHNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19TWU5DSFRSQU5TRkVSLCBob3N0LT5kZXZpY2VbaG9zdC0+U0NwbnQtPmRldmljZS0+aWRdLnN5bmNfeGZlcik7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBRVUVVRV9GVUxMOgorCS8qIFRPRE86IHRhcmdldCBxdWV1ZSBpcyBmdWxsICovCisJYnJlYWs7CisKKyAgICBjYXNlIFNJTVBMRV9RVUVVRV9UQUc6CisJLyogdGFnIHF1ZXVlIHJlY29ubmVjdC4uLiBtZXNzYWdlWzFdID0gcXVldWUgdGFnLiAgUHJpbnQgc29tZXRoaW5nIHRvIGluZGljYXRlIHNvbWV0aGluZyBoYXBwZW5lZCEgKi8KKwlwcmludGsoInNjc2klZC4lYzogcmVjb25uZWN0IHF1ZXVlIHRhZyAlMDJYXG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLAorCQltZXNzYWdlWzFdKTsKKwlicmVhazsKKworICAgIGNhc2UgRVhURU5ERURfTUVTU0FHRToKKwlzd2l0Y2ggKG1lc3NhZ2VbMl0pIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfU1lOQworCWNhc2UgRVhURU5ERURfU0RUUjoKKwkgICAgaWYgKGhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9PSBTWU5DX1NFTlRfUkVRVUVTVCkgeworCQkvKgorCQkgKiBXZSByZXF1ZXN0ZWQgc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgVGhpcyBpc24ndCBxdWl0ZSByaWdodC4uLgorCQkgKiBXZSBjYW4gb25seSBzYXkgaWYgdGhpcyBzdWNjZWVkZWQgaWYgd2UgcHJvY2VlZCBvbiB0byBleGVjdXRlIHRoZQorCQkgKiBjb21tYW5kIGZyb20gdGhpcyBtZXNzYWdlLiAgSWYgd2UgZ2V0IGEgTUVTU0FHRSBQQVJJVFkgRVJST1IsCisJCSAqIGFuZCB0aGUgdGFyZ2V0IHJldHJpZXMgZmFpbCwgdGhlbiB3ZSBmYWxsYmFjayB0byBhc3luY2hyb25vdXMgbW9kZQorCQkgKi8KKwkJaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID0gU1lOQ19DT01QTEVURUQ7CisJCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkLiVjOiBVc2luZyBzeW5jaHJvbm91cyB0cmFuc2Zlciwgb2Zmc2V0ICVkLCAlZCBuc1xuIiwKKwkJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksCisJCQltZXNzYWdlWzRdLCBtZXNzYWdlWzNdICogNCk7CisJCWhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY194ZmVyID0KKwkJCWNhbGNfc3luY194ZmVyKG1lc3NhZ2VbM10gKiA0LCBtZXNzYWdlWzRdKTsKKwkgICAgfSBlbHNlIHsKKwkJdW5zaWduZWQgY2hhciBwZXJpb2QsIGxlbmd0aDsKKwkJLyoKKwkJICogVGFyZ2V0IHJlcXVlc3RlZCBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuICBUaGUgYWdyZWVtZW50IGlzIG9ubHkKKwkJICogdG8gYmUgaW4gb3BlcmF0aW9uIEFGVEVSIHRoZSB0YXJnZXQgbGVhdmVzIG1lc3NhZ2Ugb3V0IHBoYXNlLgorCQkgKi8KKwkJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCQlwZXJpb2QgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1lc3NhZ2VbM10sIHNkdHJfcGVyaW9kIC8gNCk7CisJCWxlbmd0aCA9IG1pbl90KHVuc2lnbmVkIGludCwgbWVzc2FnZVs0XSwgc2R0cl9zaXplKTsKKwkJbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDUsIEVYVEVOREVEX01FU1NBR0UsIDMsCisJCQkJIEVYVEVOREVEX1NEVFIsIHBlcmlvZCwgbGVuZ3RoKTsKKwkJaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3hmZXIgPQorCQkJY2FsY19zeW5jX3hmZXIocGVyaW9kICogNCwgbGVuZ3RoKTsKKwkgICAgfQorCSAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1lOQ0hUUkFOU0ZFUiwgaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3hmZXIpOworCSAgICBicmVhazsKKyNlbHNlCisJICAgIC8qIFdlIGRvIG5vdCBhY2NlcHQgc3luY2hyb25vdXMgdHJhbnNmZXJzLiAgUmVzcG9uZCB3aXRoIGEKKwkgICAgICogTUVTU0FHRV9SRUpFQ1QuCisJICAgICAqLworI2VuZGlmCisKKwljYXNlIEVYVEVOREVEX1dEVFI6CisJICAgIC8qIFRoZSBXRDMzQzkzQSBpcyBvbmx5IDgtYml0LiAgV2UgcmVzcG9uZCB3aXRoIGEgTUVTU0FHRV9SRUpFQ1QKKwkgICAgICogdG8gYSB3aWRlIGRhdGEgdHJhbnNmZXIgcmVxdWVzdC4KKwkgICAgICovCisJZGVmYXVsdDoKKwkgICAgYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCSAgICBtc2dxdWV1ZV9mbHVzaCgmaG9zdC0+c2NzaS5tc2dzKTsKKwkgICAgbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDEsIE1FU1NBR0VfUkVKRUNUKTsKKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX0xJTksKKyAgICBjYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisgICAgY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgbGlua2VkIGNvbW1hbmRzIHlldAorCSAqLworCWlmICgwKSB7CisjaWYgKERFQlVHICYgREVCVUdfTElOSykKKwkgICAgcHJpbnRrKCJzY3NpJWQuJWM6IGx1biAlZCB0YWcgJWQgbGlua2VkIGNvbW1hbmQgY29tcGxldGVcbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBob3N0LT5TQ3BudC0+dGFnKTsKKyNlbmRpZgorCSAgICAvKgorCSAgICAgKiBBIGxpbmtlZCBjb21tYW5kIHNob3VsZCBvbmx5IHRlcm1pbmF0ZSB3aXRoIG9uZSBvZiB0aGVzZSBtZXNzYWdlcworCSAgICAgKiBpZiB0aGVyZSBhcmUgbW9yZSBsaW5rZWQgY29tbWFuZHMgYXZhaWxhYmxlLgorCSAgICAgKi8KKwkgICAgaWYgKCFob3N0LT5TQ3BudC0+bmV4dF9saW5rKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZC4lYzogbHVuICVkIHRhZyAlZCBsaW5rZWQgY29tbWFuZCBjb21wbGV0ZSwgYnV0IG5vIG5leHRfbGlua1xuIiwKKwkJCWluc3RhbmNlLT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBob3N0LT5TQ3BudC0+dGFnKTsKKwkJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCQltc2dxdWV1ZV9hZGRtc2coJmhvc3QtPnNjc2kubXNncywgMSwgQUJPUlQpOworCSAgICB9IGVsc2UgeworCQlTY3NpX0NtbmQgKlNDcG50ID0gaG9zdC0+U0NwbnQ7CisKKwkJYWNvcm5zY3NpX2RtYV9jbGVhbnVwKGhvc3QpOworCisJCWhvc3QtPlNDcG50ID0gaG9zdC0+U0NwbnQtPm5leHRfbGluazsKKwkJaG9zdC0+U0NwbnQtPnRhZyA9IFNDcG50LT50YWc7CisJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgfCBob3N0LT5zY3NpLlNDcC5NZXNzYWdlIDw8IDggfCBob3N0LT5TY3NpLlNDcC5TdGF0dXM7CisJCVNDcG50LT5kb25lKFNDcG50KTsKKworCQkvKiBpbml0aWFsaXNlIGhvc3QtPlNDcG50LT5TQ3AgKi8KKwkgICAgfQorCSAgICBicmVhazsKKwl9CisjZW5kaWYKKworICAgIGRlZmF1bHQ6IC8qIHJlamVjdCBtZXNzYWdlICovCisJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IHVucmVjb2duaXNlZCBtZXNzYWdlICUwMlgsIHJlamVjdGluZ1xuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwKKwkJbWVzc2FnZVswXSk7CisJYWNvcm5zY3NpX3NiaWNfaXNzdWVjbWQoaG9zdCwgQ01ORF9BU1NFUlRBVE4pOworCW1zZ3F1ZXVlX2ZsdXNoKCZob3N0LT5zY3NpLm1zZ3MpOworCW1zZ3F1ZXVlX2FkZG1zZygmaG9zdC0+c2NzaS5tc2dzLCAxLCBNRVNTQUdFX1JFSkVDVCk7CisJaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX01TR0lOOworCWJyZWFrOworICAgIH0KKyAgICBhY29ybnNjc2lfc2JpY19pc3N1ZWNtZChob3N0LCBDTU5EX05FR0FURUFDSyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogaW50IGFjb3Juc2NzaV9idWlsZG1lc3NhZ2VzKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogYnVpbGQgdGhlIGNvbm5lY3Rpb24gbWVzc2FnZXMgZm9yIGEgaG9zdAorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIGFkZCBtZXNzYWdlcyB0bworICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2J1aWxkbWVzc2FnZXMoQVNfSG9zdCAqaG9zdCkKK3sKKyNpZiAwCisgICAgLyogZG9lcyB0aGUgZGV2aWNlIG5lZWQgcmVzZXR0aW5nPyAqLworICAgIGlmIChjbWRfcmVzZXQpIHsKKwltc2dxdWV1ZV9hZGRtc2coJmhvc3QtPnNjc2kubXNncywgMSwgQlVTX0RFVklDRV9SRVNFVCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDEsCisJCSAgICAgSURFTlRJRlkoaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5kaXNjb25uZWN0X29rLAorCQkJICAgICBob3N0LT5TQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKworI2lmIDAKKyAgICAvKiBkb2VzIHRoZSBkZXZpY2UgbmVlZCB0aGUgY3VycmVudCBjb21tYW5kIGFib3J0ZWQgKi8KKyAgICBpZiAoY21kX2Fib3J0ZWQpIHsKKwlhY29ybnNjc2lfYWJvcnRjbWQoaG9zdC0+U0NwbnQtPnRhZyk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorICAgIGlmIChob3N0LT5TQ3BudC0+dGFnKSB7CisJdW5zaWduZWQgaW50IHRhZ190eXBlOworCisJaWYgKGhvc3QtPlNDcG50LT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgfHwKKwkgICAgaG9zdC0+U0NwbnQtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZIHx8CisJICAgIGhvc3QtPlNDcG50LT5jbW5kWzBdID09IElOUVVJUlkpCisJICAgIHRhZ190eXBlID0gSEVBRF9PRl9RVUVVRV9UQUc7CisJZWxzZQorCSAgICB0YWdfdHlwZSA9IFNJTVBMRV9RVUVVRV9UQUc7CisJbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDIsIHRhZ190eXBlLCBob3N0LT5TQ3BudC0+dGFnKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQ1NJX0FDT1JOU0NTSV9TWU5DCisgICAgaWYgKGhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9PSBTWU5DX05FR09DSUFURSkgeworCWhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9IFNZTkNfU0VOVF9SRVFVRVNUOworCW1zZ3F1ZXVlX2FkZG1zZygmaG9zdC0+c2NzaS5tc2dzLCA1LAorCQkJIEVYVEVOREVEX01FU1NBR0UsIDMsIEVYVEVOREVEX1NEVFIsCisJCQkgc2R0cl9wZXJpb2QgLyA0LCBzZHRyX3NpemUpOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb246IGludCBhY29ybnNjc2lfc3RhcnR0cmFuc2ZlcihBU19Ib3N0ICpob3N0KQorICogUHVycG9zZSA6IHRyYW5zZmVyIGRhdGEgdG8vZnJvbSBjb25uZWN0ZWQgdGFyZ2V0CisgKiBQYXJhbXMgIDogaG9zdCAtIGhvc3QgdG8gd2hpY2ggdGFyZ2V0IGlzIGNvbm5lY3RlZAorICogUmV0dXJucyA6IDAgaWYgZmFpbHVyZQorICovCitzdGF0aWMKK2ludCBhY29ybnNjc2lfc3RhcnR0cmFuc2ZlcihBU19Ib3N0ICpob3N0KQoreworICAgIGludCByZXNpZHVhbDsKKworICAgIGlmICghaG9zdC0+c2NzaS5TQ3AucHRyIC8qJiYgaG9zdC0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCovKSB7CisJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IG51bGwgYnVmZmVyIHBhc3NlZCB0byBhY29ybnNjc2lfc3RhcnR0cmFuc2ZlclxuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcmVzaWR1YWwgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0gaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkOworCisgICAgc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NZTkNIVFJBTlNGRVIsIGhvc3QtPmRldmljZVtob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZF0uc3luY194ZmVyKTsKKyAgICBzYmljX2FybV93cml0ZW5leHQoaG9zdC0+c2NzaS5pb19wb3J0LCByZXNpZHVhbCA+PiAxNik7CisgICAgc2JpY19hcm1fd3JpdGVuZXh0KGhvc3QtPnNjc2kuaW9fcG9ydCwgcmVzaWR1YWwgPj4gOCk7CisgICAgc2JpY19hcm1fd3JpdGVuZXh0KGhvc3QtPnNjc2kuaW9fcG9ydCwgcmVzaWR1YWwpOworICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfWEZFUklORk8pOworICAgIHJldHVybiAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29ubmVjdGlvbiAmIERpc2Nvbm5lY3Rpb24KKyAqLworLyoKKyAqIEZ1bmN0aW9uIDogYWNvcm5zY3NpX3JlY29ubmVjdChBU19Ib3N0ICpob3N0KQorICogUHVycG9zZSAgOiByZWNvbm5lY3QgYSBwcmV2aW91c2x5IGRpc2Nvbm5lY3RlZCBjb21tYW5kCisgKiBQYXJhbXMgICA6IGhvc3QgLSBob3N0IHNwZWNpZmljIGRhdGEKKyAqIFJlbWFya3MgIDogU0NTSSBzcGVjIHNheXM6CisgKgkJJ1RoZSBzZXQgb2YgYWN0aXZlIHBvaW50ZXJzIGlzIHJlc3RvcmVkIGZyb20gdGhlIHNldAorICoJCSBvZiBzYXZlZCBwb2ludGVycyB1cG9uIHJlY29ubmVjdGlvbiBvZiB0aGUgSS9PIHByb2Nlc3MnCisgKi8KK3N0YXRpYworaW50IGFjb3Juc2NzaV9yZWNvbm5lY3QoQVNfSG9zdCAqaG9zdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0LCBsdW4sIG9rID0gMDsKKworICAgIHRhcmdldCA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NPVVJDRUlEKTsKKworICAgIGlmICghKHRhcmdldCAmIDgpKQorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiBpbnZhbGlkIHNvdXJjZSBpZCBhZnRlciByZXNlbGVjdGlvbiAiCisJCSItIGRldmljZSBmYXVsdD9cbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCisgICAgdGFyZ2V0ICY9IDc7CisKKyAgICBpZiAoaG9zdC0+U0NwbnQgJiYgIWhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUpIHsKKwlwcmludGsoS0VSTl9FUlIgInNjc2klZC4lZDogcmVjb25uZWN0ZWQgd2hpbGUgY29tbWFuZCBpbiAiCisJCSJwcm9ncmVzcyB0byB0YXJnZXQgJWQ/XG4iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCB0YXJnZXQsIGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkKTsKKwlob3N0LT5TQ3BudCA9IE5VTEw7CisgICAgfQorCisgICAgbHVuID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfREFUQSkgJiA3OworCisgICAgaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YXJnZXQgPSB0YXJnZXQ7CisgICAgaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC5sdW4gPSBsdW47CisgICAgaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YWcgPSAwOworCisgICAgaWYgKGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaG9zdC0+U0NwbnQgJiYKKwlob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA9PSB0YXJnZXQgJiYgaG9zdC0+U0NwbnQtPmRldmljZS0+bHVuID09IGx1bikKKwlvayA9IDE7CisKKyAgICBpZiAoIW9rICYmIHF1ZXVlX3Byb2JldGd0bHVuKCZob3N0LT5xdWV1ZXMuZGlzY29ubmVjdGVkLCB0YXJnZXQsIGx1bikpCisJb2sgPSAxOworCisgICAgQUREX1NUQVRVUyh0YXJnZXQsIDB4ODEsIGhvc3QtPnNjc2kucGhhc2UsIDApOworCisgICAgaWYgKG9rKSB7CisJaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX1JFQ09OTkVDVEVEOworICAgIH0gZWxzZSB7CisJLyogdGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yayAqLworCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiByZXNlbGVjdGVkIHdpdGggbm8gY29tbWFuZCAiCisJCSJ0byByZWNvbm5lY3Qgd2l0aFxuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgJzAnICsgdGFyZ2V0KTsKKwlhY29ybnNjc2lfZHVtcGxvZyhob3N0LCB0YXJnZXQpOworCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCAwKTsKKwlpZiAoaG9zdC0+U0NwbnQpIHsKKwkgICAgcXVldWVfYWRkX2NtZF90YWlsKCZob3N0LT5xdWV1ZXMuZGlzY29ubmVjdGVkLCBob3N0LT5TQ3BudCk7CisJICAgIGhvc3QtPlNDcG50ID0gTlVMTDsKKwl9CisgICAgfQorICAgIGFjb3Juc2NzaV9zYmljX2lzc3VlY21kKGhvc3QsIENNTkRfTkVHQVRFQUNLKTsKKyAgICByZXR1cm4gIW9rOworfQorCisvKgorICogRnVuY3Rpb246IGludCBhY29ybnNjc2lfcmVjb25lY3RfZmluaXNoKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogZmluaXNoIHJlY29ubmVjdGluZyBhIGNvbW1hbmQKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBjb21wbGV0ZQorICogUmV0dXJucyA6IDAgaWYgZmFpbGVkCisgKi8KK3N0YXRpYworaW50IGFjb3Juc2NzaV9yZWNvbm5lY3RfZmluaXNoKEFTX0hvc3QgKmhvc3QpCit7CisgICAgaWYgKGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaG9zdC0+U0NwbnQpIHsKKwlob3N0LT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMDsKKwlpZiAoaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgID09IGhvc3QtPnNjc2kucmVjb25uZWN0ZWQudGFyZ2V0ICYmCisJICAgIGhvc3QtPlNDcG50LT5kZXZpY2UtPmx1biA9PSBob3N0LT5zY3NpLnJlY29ubmVjdGVkLmx1biAmJgorCSAgICBob3N0LT5TQ3BudC0+dGFnICAgICAgICAgPT0gaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YWcpIHsKKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisJICAgIERCRyhob3N0LT5TQ3BudCwgcHJpbnRrKCJzY3NpJWQuJWM6IHJlY29ubmVjdGVkIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJICAgIHF1ZXVlX2FkZF9jbWRfdGFpbCgmaG9zdC0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgaG9zdC0+U0NwbnQpOworI2lmIChERUJVRyAmIChERUJVR19RVUVVRVN8REVCVUdfRElTQ09OKSkKKwkgICAgREJHKGhvc3QtPlNDcG50LCBwcmludGsoInNjc2klZC4lYzogaGFkIHRvIG1vdmUgY29tbWFuZCAiCisJCSAgICAidG8gZGlzY29ubmVjdGVkIHF1ZXVlXG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSkpOworI2VuZGlmCisJICAgIGhvc3QtPlNDcG50ID0gTlVMTDsKKwl9CisgICAgfQorICAgIGlmICghaG9zdC0+U0NwbnQpIHsKKwlob3N0LT5TQ3BudCA9IHF1ZXVlX3JlbW92ZV90Z3RsdW50YWcoJmhvc3QtPnF1ZXVlcy5kaXNjb25uZWN0ZWQsCisJCQkJaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YXJnZXQsCisJCQkJaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC5sdW4sCisJCQkJaG9zdC0+c2NzaS5yZWNvbm5lY3RlZC50YWcpOworI2lmIChERUJVRyAmIChERUJVR19RVUVVRVN8REVCVUdfRElTQ09OKSkKKwlEQkcoaG9zdC0+U0NwbnQsIHByaW50aygic2NzaSVkLiVjOiBoYWQgdG8gZ2V0IGNvbW1hbmQiLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoIWhvc3QtPlNDcG50KQorCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5zY3NpLnJlY29ubmVjdGVkLnRhZyk7CisgICAgZWxzZSB7CisJLyoKKwkgKiBSZXN0b3JlIGRhdGEgcG9pbnRlciBmcm9tIFNBVkVEIHBvaW50ZXJzLgorCSAqLworCWhvc3QtPnNjc2kuU0NwID0gaG9zdC0+U0NwbnQtPlNDcDsKKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisJcHJpbnRrKCIsIGRhdGEgcG9pbnRlcnM6IFslcCwgJVhdIiwKKwkJaG9zdC0+c2NzaS5TQ3AucHRyLCBob3N0LT5zY3NpLlNDcC50aGlzX3Jlc2lkdWFsKTsKKyNlbmRpZgorICAgIH0KKyNpZiAoREVCVUcgJiAoREVCVUdfUVVFVUVTfERFQlVHX0RJU0NPTikpCisgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICBob3N0LT5kbWEudHJhbnNmZXJyZWQgPSBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQ7CisKKyAgICByZXR1cm4gaG9zdC0+U0NwbnQgIT0gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIGFjb3Juc2NzaV9kaXNjb25uZWN0X3VuZXhwZWN0ZWQoQVNfSG9zdCAqaG9zdCkKKyAqIFB1cnBvc2UgOiBoYW5kbGUgYW4gdW5leHBlY3RlZCBkaXNjb25uZWN0CisgKiBQYXJhbXMgIDogaG9zdCAtIGhvc3Qgb24gd2hpY2ggZGlzY29ubmVjdCBvY2N1cnJlZAorICovCitzdGF0aWMKK3ZvaWQgYWNvcm5zY3NpX2Rpc2Nvbm5lY3RfdW5leHBlY3RlZChBU19Ib3N0ICpob3N0KQoreworICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RcbiIsCisJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIDgpOworI2VuZGlmCisKKyAgICBhY29ybnNjc2lfZG9uZShob3N0LCAmaG9zdC0+U0NwbnQsIERJRF9FUlJPUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBhY29ybnNjc2lfYWJvcnRjbWQoQVNfaG9zdCAqaG9zdCwgdW5zaWduZWQgY2hhciB0YWcpCisgKiBQdXJwb3NlIDogYWJvcnQgYSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB3aXRoIGNvbm5lY3RlZCBjb21tYW5kIHRvIGFib3J0CisgKgkgICAgIHRhZyAgLSB0YWcgdG8gYWJvcnQKKyAqLworc3RhdGljCit2b2lkIGFjb3Juc2NzaV9hYm9ydGNtZChBU19Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyIHRhZykKK3sKKyAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfQUJPUlRFRDsKKyAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQ01ORCwgQ01ORF9BU1NFUlRBVE4pOworCisgICAgbXNncXVldWVfZmx1c2goJmhvc3QtPnNjc2kubXNncyk7CisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorICAgIGlmICh0YWcpCisJbXNncXVldWVfYWRkbXNnKCZob3N0LT5zY3NpLm1zZ3MsIDIsIEFCT1JUX1RBRywgdGFnKTsKKyAgICBlbHNlCisjZW5kaWYKKwltc2dxdWV1ZV9hZGRtc2coJmhvc3QtPnNjc2kubXNncywgMSwgQUJPUlQpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEludGVycnVwdCByb3V0aW5lcy4KKyAqLworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgYWNvcm5zY3NpX3NiaWNpbnRyKEFTX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBTQ1NJIGRldmljZQorICogUGFyYW1zICA6IGhvc3QgLSBob3N0IHRvIHByb2Nlc3MKKyAqIFJldHVybnMgOiBJTlRSX1BST0NFU1MgaWYgZXhwZWN0aW5nIGFub3RoZXIgU0JJQyBpbnRlcnJ1cHQKKyAqCSAgICAgSU5UUl9JRExFIGlmIG5vIGludGVycnVwdAorICoJICAgICBJTlRSX05FWFRfQ09NTUFORCBpZiB3ZSBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIGNvbW1hbmQKKyAqLworc3RhdGljCitpbnRyX3JldF90IGFjb3Juc2NzaV9zYmljaW50cihBU19Ib3N0ICpob3N0LCBpbnQgaW5faXJxKQoreworICAgIHVuc2lnbmVkIGludCBhc3IsIHNzcjsKKworICAgIGFzciA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0FTUik7CisgICAgaWYgKCEoYXNyICYgQVNSX0lOVCkpCisJcmV0dXJuIElOVFJfSURMRTsKKworICAgIHNzciA9IHNiaWNfYXJtX3JlYWQoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NTUik7CisKKyNpZiAoREVCVUcgJiBERUJVR19QSEFTRVMpCisgICAgcHJpbnRfc2JpY19zdGF0dXMoYXNyLCBzc3IsIGhvc3QtPnNjc2kucGhhc2UpOworI2VuZGlmCisKKyAgICBBRERfU1RBVFVTKDgsIHNzciwgaG9zdC0+c2NzaS5waGFzZSwgaW5faXJxKTsKKworICAgIGlmIChob3N0LT5TQ3BudCAmJiAhaG9zdC0+c2NzaS5kaXNjb25uZWN0YWJsZSkKKwlBRERfU1RBVFVTKGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkLCBzc3IsIGhvc3QtPnNjc2kucGhhc2UsIGluX2lycSk7CisKKyAgICBzd2l0Y2ggKHNzcikgeworICAgIGNhc2UgMHgwMDoJCQkJLyogcmVzZXQgc3RhdGUgLSBub3QgYWR2YW5jZWQJCQkqLworCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiByZXNldCBpbiBzdGFuZGFyZCBtb2RlIGJ1dCB3YW50ZWQgYWR2YW5jZWQgbW9kZS5cbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8pOworCS8qIHNldHVwIHNiaWMgLSBXRDMzQzkzQSAqLworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19PV05JRCwgT1dOSURfRUFGIHwgaG9zdC0+aG9zdC0+dGhpc19pZCk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX0NNTkQsIENNTkRfUkVTRVQpOworCXJldHVybiBJTlRSX0lETEU7CisKKyAgICBjYXNlIDB4MDE6CQkJCS8qIHJlc2V0IHN0YXRlIC0gYWR2YW5jZWQJCQkqLworCXNiaWNfYXJtX3dyaXRlKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19DVFJMLCBJTklUX1NCSUNETUEgfCBDVFJMX0lESSk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1RJTUVPVVQsIFRJTUVPVVRfVElNRSk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NZTkNIVFJBTlNGRVIsIFNZTkNIVFJBTlNGRVJfMkRCQSk7CisJc2JpY19hcm1fd3JpdGUoaG9zdC0+c2NzaS5pb19wb3J0LCBTQklDX1NPVVJDRUlELCBTT1VSQ0VJRF9FUiB8IFNPVVJDRUlEX0RTUCk7CisJbXNncXVldWVfZmx1c2goJmhvc3QtPnNjc2kubXNncyk7CisJcmV0dXJuIElOVFJfSURMRTsKKworICAgIGNhc2UgMHg0MToJCQkJLyogdW5leHBlY3RlZCBkaXNjb25uZWN0IGFib3J0ZWQgY29tbWFuZAkqLworCWFjb3Juc2NzaV9kaXNjb25uZWN0X3VuZXhwZWN0ZWQoaG9zdCk7CisJcmV0dXJuIElOVFJfTkVYVF9DT01NQU5EOworICAgIH0KKworICAgIHN3aXRjaCAoaG9zdC0+c2NzaS5waGFzZSkgeworICAgIGNhc2UgUEhBU0VfQ09OTkVDVElORzoJCS8qIFNUQVRFOiBjb21tYW5kIHJlbW92ZWQgZnJvbSBpc3N1ZSBxdWV1ZQkqLworCXN3aXRjaCAoc3NyKSB7CisJY2FzZSAweDExOgkJCS8qIC0+IFBIQVNFX0NPTk5FQ1RFRAkJCQkqLworCSAgICAvKiBCVVMgRlJFRSAtPiBTRUxFQ1RJT04gKi8KKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0NPTk5FQ1RFRDsKKwkgICAgbXNncXVldWVfZmx1c2goJmhvc3QtPnNjc2kubXNncyk7CisJICAgIGhvc3QtPmRtYS50cmFuc2ZlcnJlZCA9IGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZDsKKwkgICAgLyogMzNDOTMgZ2l2ZXMgbmV4dCBpbnRlcnJ1cHQgaW5kaWNhdGluZyBidXMgcGhhc2UgKi8KKwkgICAgYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKwkgICAgaWYgKCEoYXNyICYgQVNSX0lOVCkpCisJCWJyZWFrOworCSAgICBzc3IgPSBzYmljX2FybV9yZWFkKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19TU1IpOworCSAgICBBRERfU1RBVFVTKDgsIHNzciwgaG9zdC0+c2NzaS5waGFzZSwgMSk7CisJICAgIEFERF9TVEFUVVMoaG9zdC0+U0NwbnQtPmRldmljZS0+aWQsIHNzciwgaG9zdC0+c2NzaS5waGFzZSwgMSk7CisJICAgIGdvdG8gY29ubmVjdGVkOworCSAgICAKKwljYXNlIDB4NDI6CQkJLyogc2VsZWN0IHRpbWVkIG91dAkJCQkqLworCQkJCQkvKiAtPiBQSEFTRV9JRExFCQkJCSovCisJICAgIGFjb3Juc2NzaV9kb25lKGhvc3QsICZob3N0LT5TQ3BudCwgRElEX05PX0NPTk5FQ1QpOworCSAgICByZXR1cm4gSU5UUl9ORVhUX0NPTU1BTkQ7CisKKwljYXNlIDB4ODE6CQkJLyogLT4gUEhBU0VfUkVDT05ORUNURUQgb3IgUEhBU0VfQUJPUlRFRAkqLworCSAgICAvKiBCVVMgRlJFRSAtPiBSRVNFTEVDVElPTiAqLworCSAgICBob3N0LT5vcmlnU0NwbnQgPSBob3N0LT5TQ3BudDsKKwkgICAgaG9zdC0+U0NwbnQgPSBOVUxMOworCSAgICBtc2dxdWV1ZV9mbHVzaCgmaG9zdC0+c2NzaS5tc2dzKTsKKwkgICAgYWNvcm5zY3NpX3JlY29ubmVjdChob3N0KTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfQ09OTkVDVElORywgU1NSICUwMlg/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCSAgICBhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBjb25uZWN0ZWQ6CisgICAgY2FzZSBQSEFTRV9DT05ORUNURUQ6CQkvKiBTVEFURTogZGV2aWNlIHNlbGVjdGVkIG9rCQkJKi8KKwlzd2l0Y2ggKHNzcikgeworI2lmZGVmIE5PTlNUQU5EQVJECisJY2FzZSAweDhhOgkJCS8qIC0+IFBIQVNFX0NPTU1BTkQsIFBIQVNFX0NPTU1BTkRQQVVTRUQJKi8KKwkgICAgLyogU0VMRUNUSU9OIC0+IENPTU1BTkQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRjb21tYW5kKGhvc3QpOworCSAgICBicmVhazsKKworCWNhc2UgMHg4YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVMJCQkJKi8KKwkgICAgLyogU0VMRUNUSU9OIC0+IFNUQVRVUyAqLworCSAgICBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoaG9zdCk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVNJTjsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCWNhc2UgMHg4ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogU0VMRUNUSU9OIC0+TUVTU0FHRSBPVVQgKi8KKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVDsKKwkgICAgYWNvcm5zY3NpX2J1aWxkbWVzc2FnZXMoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwkvKiB0aGVzZSBzaG91bGQgbm90IGhhcHBlbiAqLworCWNhc2UgMHg4NToJCQkvKiB0YXJnZXQgZGlzY29ubmVjdGVkCQkJCSovCisJICAgIGFjb3Juc2NzaV9kb25lKGhvc3QsICZob3N0LT5TQ3BudCwgRElEX0VSUk9SKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfQ09OTkVDVEVELCBTU1IgJTAyWD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJICAgIGFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfTVNHT1VUOgkJCS8qIFNUQVRFOiBjb25uZWN0ZWQgJiBzZW50IElERU5USUZZIG1lc3NhZ2UJKi8KKwkvKgorCSAqIFNDU0kgc3RhbmRhcmQgc2F5cyB0aGF0IE1FU1NBR0UgT1VUIHBoYXNlcyBjYW4gYmUgZm9sbG93ZWQgYnkgYQorCSAqIERBVEEgcGhhc2UsIFNUQVRVUyBwaGFzZSwgTUVTU0FHRSBJTiBwaGFzZSBvciBDT01NQU5EIHBoYXNlCisJICovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4OGE6CQkJLyogLT4gUEhBU0VfQ09NTUFORCwgUEhBU0VfQ09NTUFORFBBVVNFRAkqLworCWNhc2UgMHgxYToJCQkvKiAtPiBQSEFTRV9DT01NQU5ELCBQSEFTRV9DT01NQU5EUEFVU0VECSovCisJICAgIC8qIE1FU1NBR0UgT1VUIC0+IENPTU1BTkQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRjb21tYW5kKGhvc3QpOworCSAgICBicmVhazsKKworCWNhc2UgMHg4YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVMJCQkJKi8KKwljYXNlIDB4MWI6CQkJLyogLT4gUEhBU0VfU1RBVFVTCQkJCSovCisJICAgIC8qIE1FU1NBR0UgT1VUIC0+IFNUQVRVUyAqLworCSAgICBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoaG9zdCk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVNJTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4OGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJICAgIC8qIE1FU1NBR0VfT1VUKE1FU1NBR0VfSU4pIC0+TUVTU0FHRSBPVVQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRtZXNzYWdlKGhvc3QpOworCSAgICBicmVhazsKKworCWNhc2UgMHg0ZjoJCQkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRElTQ09OTkVDVAkJKi8KKwljYXNlIDB4MWY6CQkJLyogLT4gUEhBU0VfTVNHSU4sIFBIQVNFX0RJU0NPTk5FQ1QJCSovCisJICAgIC8qIE1FU1NBR0UgT1VUIC0+IE1FU1NBR0UgSU4gKi8KKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX01TR09VVCwgU1NSICUwMlg/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworCisgICAgY2FzZSBQSEFTRV9DT01NQU5EOiAJCS8qIFNUQVRFOiBjb25uZWN0ZWQgJiBjb21tYW5kIHNlbnQJCSovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4MTg6CQkJLyogLT4gUEhBU0VfREFUQU9VVAkJCQkqLworCSAgICAvKiBDT01NQU5EIC0+IERBVEEgT1VUICovCisJICAgIGlmIChob3N0LT5zY3NpLlNDcC5zZW50X2NvbW1hbmQgIT0gaG9zdC0+U0NwbnQtPmNtZF9sZW4pCisJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zZXR1cChob3N0LCBETUFfT1VUKTsKKwkgICAgaWYgKCFhY29ybnNjc2lfc3RhcnR0cmFuc2Zlcihob3N0KSkKKwkJYWNvcm5zY3NpX2Fib3J0Y21kKGhvc3QsIGhvc3QtPlNDcG50LT50YWcpOworCSAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfREFUQU9VVDsKKwkgICAgcmV0dXJuIElOVFJfSURMRTsKKworCWNhc2UgMHgxOToJCQkvKiAtPiBQSEFTRV9EQVRBSU4JCQkJKi8KKwkgICAgLyogQ09NTUFORCAtPiBEQVRBIElOICovCisJICAgIGlmIChob3N0LT5zY3NpLlNDcC5zZW50X2NvbW1hbmQgIT0gaG9zdC0+U0NwbnQtPmNtZF9sZW4pCisJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zZXR1cChob3N0LCBETUFfSU4pOworCSAgICBpZiAoIWFjb3Juc2NzaV9zdGFydHRyYW5zZmVyKGhvc3QpKQorCQlhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9EQVRBSU47CisJICAgIHJldHVybiBJTlRSX0lETEU7CisKKwljYXNlIDB4MWI6CQkJLyogLT4gUEhBU0VfU1RBVFVTCQkJCSovCisJICAgIC8qIENPTU1BTkQgLT4gU1RBVFVTICovCisJICAgIGFjb3Juc2NzaV9yZWFkc3RhdHVzYnl0ZShob3N0KTsKKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX1NUQVRVU0lOOworCSAgICBicmVhazsKKworCWNhc2UgMHgxZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogQ09NTUFORCAtPiBNRVNTQUdFIE9VVCAqLworCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDFmOgkJCS8qIC0+IFBIQVNFX01TR0lOLCBQSEFTRV9ESVNDT05ORUNUCQkqLworCSAgICAvKiBDT01NQU5EIC0+IE1FU1NBR0UgSU4gKi8KKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0NPTU1BTkQsIFNTUiAlMDJYP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfRElTQ09OTkVDVDoJCS8qIFNUQVRFOiBjb25uZWN0ZWQsIHJlY2VpdmVkIERJU0NPTk5FQ1QgbXNnCSovCisJaWYgKHNzciA9PSAweDg1KSB7CQkvKiAtPiBQSEFTRV9JRExFCQkJCSovCisJICAgIGhvc3QtPnNjc2kuZGlzY29ubmVjdGFibGUgPSAxOworCSAgICBob3N0LT5zY3NpLnJlY29ubmVjdGVkLnRhZyA9IDA7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCSAgICBob3N0LT5zdGF0cy5kaXNjb25uZWN0cyArPSAxOworCX0gZWxzZSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9ESVNDT05ORUNULCBTU1IgJTAyWCBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3Q/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9ORVhUX0NPTU1BTkQ7CisKKyAgICBjYXNlIFBIQVNFX0lETEU6CQkJLyogU1RBVEU6IGRpc2Nvbm5lY3RlZAkJCQkqLworCWlmIChzc3IgPT0gMHg4MSkJCS8qIC0+IFBIQVNFX1JFQ09OTkVDVEVEIG9yIFBIQVNFX0FCT1JURUQJKi8KKwkgICAgYWNvcm5zY3NpX3JlY29ubmVjdChob3N0KTsKKwllbHNlIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0lETEUsIFNTUiAlMDJYIHdoaWxlIGlkbGU/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworCisgICAgY2FzZSBQSEFTRV9SRUNPTk5FQ1RFRDoJCS8qIFNUQVRFOiBkZXZpY2UgcmVjb25uZWN0ZWQgdG8gaW5pdGlhdG9yCSovCisJLyoKKwkgKiBDb21tYW5kIHJlY29ubmVjdGVkIC0gaWYgTUVTR0lOLCBnZXQgbWVzc2FnZSAtIGl0IG1heSBiZQorCSAqIHRoZSB0YWcuICBJZiBub3QsIGdldCBjb21tYW5kIG91dCBvZiBkaXNjb25uZWN0ZWQgcXVldWUKKwkgKi8KKwkvKgorCSAqIElmIHdlIHJlY29ubmVjdGVkIGFuZCB3ZSdyZSBub3QgaW4gTUVTU0FHRSBJTiBwaGFzZSBhZnRlciBJREVOVElGWSwKKwkgKiByZWNvbm5lY3QgSV9UX0wgY29tbWFuZAorCSAqLworCWlmIChzc3IgIT0gMHg4ZiAmJiAhYWNvcm5zY3NpX3JlY29ubmVjdF9maW5pc2goaG9zdCkpCisJICAgIHJldHVybiBJTlRSX0lETEU7CisJQUREX1NUQVRVUyhob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCwgc3NyLCBob3N0LT5zY3NpLnBoYXNlLCBpbl9pcnEpOworCXN3aXRjaCAoc3NyKSB7CisJY2FzZSAweDg4OgkJCS8qIGRhdGEgb3V0IHBoYXNlCQkJCSovCisJCQkJCS8qIC0+IFBIQVNFX0RBVEFPVVQJCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBEQVRBIE9VVCAqLworCSAgICBhY29ybnNjc2lfZG1hX3NldHVwKGhvc3QsIERNQV9PVVQpOworCSAgICBpZiAoIWFjb3Juc2NzaV9zdGFydHRyYW5zZmVyKGhvc3QpKQorCQlhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9EQVRBT1VUOworCSAgICByZXR1cm4gSU5UUl9JRExFOworCisJY2FzZSAweDg5OgkJCS8qIGRhdGEgaW4gcGhhc2UJCQkJKi8KKwkJCQkJLyogLT4gUEhBU0VfREFUQUlOCQkJCSovCisJICAgIC8qIE1FU1NBR0UgSU4gLT4gREFUQSBJTiAqLworCSAgICBhY29ybnNjc2lfZG1hX3NldHVwKGhvc3QsIERNQV9JTik7CisJICAgIGlmICghYWNvcm5zY3NpX3N0YXJ0dHJhbnNmZXIoaG9zdCkpCisJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgaG9zdC0+c2NzaS5waGFzZSA9IFBIQVNFX0RBVEFJTjsKKwkgICAgcmV0dXJuIElOVFJfSURMRTsKKworCWNhc2UgMHg4YToJCQkvKiBjb21tYW5kIG91dAkJCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBDT01NQU5EICovCisJICAgIGFjb3Juc2NzaV9zZW5kY29tbWFuZChob3N0KTsvKiAtPiBQSEFTRV9DT01NQU5ELCBQSEFTRV9DT01NQU5EUEFVU0VECSovCisJICAgIGJyZWFrOworCisJY2FzZSAweDhiOgkJCS8qIHN0YXR1cyBpbgkJCQkJKi8KKwkJCQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBTVEFUVVMgKi8KKwkgICAgYWNvcm5zY3NpX3JlYWRzdGF0dXNieXRlKGhvc3QpOworCSAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfU1RBVFVTSU47CisJICAgIGJyZWFrOworCisJY2FzZSAweDhlOgkJCS8qIG1lc3NhZ2Ugb3V0CQkJCQkqLworCQkJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogTUVTU0FHRSBJTiAtPiBNRVNTQUdFIE9VVCAqLworCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDhmOgkJCS8qIG1lc3NhZ2UgaW4JCQkJCSovCisJICAgIGFjb3Juc2NzaV9tZXNzYWdlKGhvc3QpOwkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRElTQ09OTkVDVAkJKi8KKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfUkVDT05ORUNURUQsIFNTUiAlMDJYIGFmdGVyIHJlY29ubmVjdD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBjYXNlIFBIQVNFX0RBVEFJTjoJCQkvKiBTVEFURTogdHJhbnNmZXJyZWQgZGF0YSBpbgkJCSovCisJLyoKKwkgKiBUaGlzIGlzIHNpbXBsZSAtIGlmIHdlIGRpc2Nvbm5lY3QgdGhlbiB0aGUgRE1BIGFkZHJlc3MgJiBjb3VudCBpcworCSAqIGNvcnJlY3QuCisJICovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4MTk6CQkJLyogLT4gUEhBU0VfREFUQUlOCQkJCSovCisJY2FzZSAweDg5OgkJCS8qIC0+IFBIQVNFX0RBVEFJTgkJCQkqLworCSAgICBhY29ybnNjc2lfYWJvcnRjbWQoaG9zdCwgaG9zdC0+U0NwbnQtPnRhZyk7CisJICAgIHJldHVybiBJTlRSX0lETEU7CisKKwljYXNlIDB4MWI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwljYXNlIDB4NGI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwljYXNlIDB4OGI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KKwkgICAgLyogREFUQSBJTiAtPiBTVEFUVVMgKi8KKwkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtCisJCQkJCSAgYWNvcm5zY3NpX3NiaWNfeGZjb3VudChob3N0KTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOworCSAgICBhY29ybnNjc2lfcmVhZHN0YXR1c2J5dGUoaG9zdCk7CisJICAgIGhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVNJTjsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJY2FzZSAweDRlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCWNhc2UgMHg4ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwkgICAgLyogREFUQSBJTiAtPiBNRVNTQUdFIE9VVCAqLworCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0KKwkJCQkJICBhY29ybnNjc2lfc2JpY194ZmNvdW50KGhvc3QpOworCSAgICBhY29ybnNjc2lfZG1hX3N0b3AoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4NGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4OGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwkgICAgLyogREFUQSBJTiAtPiBNRVNTQUdFIElOICovCisJICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IGhvc3QtPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLQorCQkJCQkgIGFjb3Juc2NzaV9zYmljX3hmY291bnQoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9kbWFfc3RvcChob3N0KTsKKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CS8qIC0+IFBIQVNFX01TR0lOLCBQSEFTRV9ESVNDT05ORUNUCQkqLworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9EQVRBSU4sIFNTUiAlMDJYP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfREFUQU9VVDogCQkvKiBTVEFURTogdHJhbnNmZXJyZWQgZGF0YSBvdXQJCQkqLworCS8qCisJICogVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIC0gaWYgd2UgZGlzY29ubmVjdCwgdGhlIERNQSBjb3VsZCBiZSAxMgorCSAqIGJ5dGVzIGFoZWFkIG9mIHVzLiAgV2UgbmVlZCB0byBjb3JyZWN0IHRoaXMuCisJICovCisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4MTg6CQkJLyogLT4gUEhBU0VfREFUQU9VVAkJCQkqLworCWNhc2UgMHg4ODoJCQkvKiAtPiBQSEFTRV9EQVRBT1VUCQkJCSovCisJICAgIGFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkgICAgcmV0dXJuIElOVFJfSURMRTsKKworCWNhc2UgMHgxYjoJCQkvKiAtPiBQSEFTRV9TVEFUVVNJTgkJCQkqLworCWNhc2UgMHg0YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVNJTgkJCQkqLworCWNhc2UgMHg4YjoJCQkvKiAtPiBQSEFTRV9TVEFUVVNJTgkJCQkqLworCSAgICAvKiBEQVRBIE9VVCAtPiBTVEFUVVMgKi8KKwkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtCisJCQkJCSAgYWNvcm5zY3NpX3NiaWNfeGZjb3VudChob3N0KTsKKwkgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOworCSAgICBhY29ybnNjc2lfZG1hX2FkanVzdChob3N0KTsKKwkgICAgYWNvcm5zY3NpX3JlYWRzdGF0dXNieXRlKGhvc3QpOworCSAgICBob3N0LT5zY3NpLnBoYXNlID0gUEhBU0VfU1RBVFVTSU47CisJICAgIGJyZWFrOworCisJY2FzZSAweDFlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCWNhc2UgMHg0ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwljYXNlIDB4OGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJICAgIC8qIERBVEEgT1VUIC0+IE1FU1NBR0UgT1VUICovCisJICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IGhvc3QtPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLQorCQkJCQkgIGFjb3Juc2NzaV9zYmljX3hmY291bnQoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9kbWFfc3RvcChob3N0KTsKKwkgICAgYWNvcm5zY3NpX2RtYV9hZGp1c3QoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4NGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwljYXNlIDB4OGY6CQkJLyogbWVzc2FnZSBpbgkJCQkJKi8KKwkgICAgLyogREFUQSBPVVQgLT4gTUVTU0FHRSBJTiAqLworCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0KKwkJCQkJICBhY29ybnNjc2lfc2JpY194ZmNvdW50KGhvc3QpOworCSAgICBhY29ybnNjc2lfZG1hX3N0b3AoaG9zdCk7CisJICAgIGFjb3Juc2NzaV9kbWFfYWRqdXN0KGhvc3QpOworCSAgICBhY29ybnNjc2lfbWVzc2FnZShob3N0KTsJLyogLT4gUEhBU0VfTVNHSU4sIFBIQVNFX0RJU0NPTk5FQ1QJCSovCisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0RBVEFPVVQsIFNTUiAlMDJYP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfU1RBVFVTSU46CQkvKiBTVEFURTogc3RhdHVzIGluIGNvbXBsZXRlCQkJKi8KKwlzd2l0Y2ggKHNzcikgeworCWNhc2UgMHgxZjoJCQkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRE9ORSwgUEhBU0VfRElTQ09OTkVDVCAqLworCWNhc2UgMHg4ZjoJCQkvKiAtPiBQSEFTRV9NU0dJTiwgUEhBU0VfRE9ORSwgUEhBU0VfRElTQ09OTkVDVCAqLworCSAgICAvKiBTVEFUVVMgLT4gTUVTU0FHRSBJTiAqLworCSAgICBhY29ybnNjc2lfbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJY2FzZSAweDhlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCSAgICAvKiBTVEFUVVMgLT4gTUVTU0FHRSBPVVQgKi8KKwkgICAgYWNvcm5zY3NpX3NlbmRtZXNzYWdlKGhvc3QpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9TVEFUVVNJTiwgU1NSICUwMlggaW5zdGVhZCBvZiBNRVNTQUdFX0lOP1xuIiwKKwkJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCksIHNzcik7CisJICAgIGFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIGhvc3QtPlNDcG50ID8gaG9zdC0+U0NwbnQtPmRldmljZS0+aWQgOiA4KTsKKwl9CisJcmV0dXJuIElOVFJfUFJPQ0VTU0lORzsKKworICAgIGNhc2UgUEhBU0VfTVNHSU46CQkJLyogU1RBVEU6IG1lc3NhZ2UgaW4JCQkJKi8KKwlzd2l0Y2ggKHNzcikgeworCWNhc2UgMHgxZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KKwljYXNlIDB4NGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCisJY2FzZSAweDhlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLworCSAgICAvKiBNRVNTQUdFIElOIC0+IE1FU1NBR0UgT1VUICovCisJICAgIGFjb3Juc2NzaV9zZW5kbWVzc2FnZShob3N0KTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4MWY6CQkJLyogLT4gUEhBU0VfTVNHSU4sIFBIQVNFX0RPTkUsIFBIQVNFX0RJU0NPTk5FQ1QgKi8KKwljYXNlIDB4MmY6CisJY2FzZSAweDRmOgorCWNhc2UgMHg4ZjoKKwkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDg1OgorCSAgICBwcmludGsoInNjc2klZC4lYzogc3RyYW5nZSBtZXNzYWdlIGluIGRpc2Nvbm5lY3Rpb25cbiIsCisJCWhvc3QtPmhvc3QtPmhvc3Rfbm8sIGFjb3Juc2NzaV90YXJnZXQoaG9zdCkpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJICAgIGFjb3Juc2NzaV9kb25lKGhvc3QsICZob3N0LT5TQ3BudCwgRElEX0VSUk9SKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZC4lYzogUEhBU0VfTVNHSU4sIFNTUiAlMDJYIGFmdGVyIG1lc3NhZ2UgaW4/XG4iLAorCQkgICAgaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwkgICAgYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgaG9zdC0+U0NwbnQgPyBob3N0LT5TQ3BudC0+ZGV2aWNlLT5pZCA6IDgpOworCX0KKwlyZXR1cm4gSU5UUl9QUk9DRVNTSU5HOworCisgICAgY2FzZSBQSEFTRV9ET05FOgkJCS8qIFNUQVRFOiByZWNlaXZlZCBzdGF0dXMgJiBtZXNzYWdlCQkqLworCXN3aXRjaCAoc3NyKSB7CisJY2FzZSAweDg1OgkJCS8qIC0+IFBIQVNFX0lETEUJCQkJKi8KKwkgICAgYWNvcm5zY3NpX2RvbmUoaG9zdCwgJmhvc3QtPlNDcG50LCBESURfT0spOworCSAgICByZXR1cm4gSU5UUl9ORVhUX0NPTU1BTkQ7CisKKwljYXNlIDB4MWU6CisJY2FzZSAweDhlOgorCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IFBIQVNFX0RPTkUsIFNTUiAlMDJYIGluc3RlYWQgb2YgZGlzY29ubmVjdD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBjYXNlIFBIQVNFX0FCT1JURUQ6CisJc3dpdGNoIChzc3IpIHsKKwljYXNlIDB4ODU6CisJICAgIGlmIChob3N0LT5TQ3BudCkKKwkJYWNvcm5zY3NpX2RvbmUoaG9zdCwgJmhvc3QtPlNDcG50LCBESURfQUJPUlQpOworCSAgICBlbHNlIHsKKwkJY2xlYXJfYml0KGhvc3QtPnNjc2kucmVjb25uZWN0ZWQudGFyZ2V0ICogOCArIGhvc3QtPnNjc2kucmVjb25uZWN0ZWQubHVuLAorCQkJICBob3N0LT5idXN5bHVucyk7CisJCWhvc3QtPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCSAgICB9CisJICAgIHJldHVybiBJTlRSX05FWFRfQ09NTUFORDsKKworCWNhc2UgMHgxZToKKwljYXNlIDB4MmU6CisJY2FzZSAweDRlOgorCWNhc2UgMHg4ZToKKwkgICAgYWNvcm5zY3NpX3NlbmRtZXNzYWdlKGhvc3QpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBQSEFTRV9BQk9SVEVELCBTU1IgJTAyWD9cbiIsCisJCSAgICBob3N0LT5ob3N0LT5ob3N0X25vLCBhY29ybnNjc2lfdGFyZ2V0KGhvc3QpLCBzc3IpOworCSAgICBhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisJfQorCXJldHVybiBJTlRSX1BST0NFU1NJTkc7CisKKyAgICBkZWZhdWx0OgorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiB1bmtub3duIGRyaXZlciBwaGFzZSAlZFxuIiwKKwkJaG9zdC0+aG9zdC0+aG9zdF9ubywgYWNvcm5zY3NpX3RhcmdldChob3N0KSwgc3NyKTsKKwlhY29ybnNjc2lfZHVtcGxvZyhob3N0LCBob3N0LT5TQ3BudCA/IGhvc3QtPlNDcG50LT5kZXZpY2UtPmlkIDogOCk7CisgICAgfQorICAgIHJldHVybiBJTlRSX1BST0NFU1NJTkc7Cit9CisKKy8qCisgKiBQcm90b3R5cGU6IHZvaWQgYWNvcm5zY3NpX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyAqIFB1cnBvc2UgIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBBY29ybiBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogaXJxICAgIC0gaW50ZXJydXB0IG51bWJlcgorICoJICAgICAgZGV2X2lkIC0gZGV2aWNlIHNwZWNpZmljIGRhdGEgKEFTX0hvc3Qgc3RydWN0dXJlKQorICoJICAgICAgcmVncyAgIC0gcHJvY2Vzc29yIHJlZ2lzdGVycyB3aGVuIGludGVycnVwdCBvY2N1cnJlZAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2Fjb3Juc2NzaV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgQVNfSG9zdCAqaG9zdCA9IChBU19Ib3N0ICopZGV2X2lkOworICAgIGludHJfcmV0X3QgcmV0OworICAgIGludCBpb3N0YXR1czsKKyAgICBpbnQgaW5faXJxID0gMDsKKworICAgIGRvIHsKKwlyZXQgPSBJTlRSX0lETEU7CisKKwlpb3N0YXR1cyA9IGluYihob3N0LT5jYXJkLmlvX2ludHIpOworCisJaWYgKGlvc3RhdHVzICYgMikgeworCSAgICBhY29ybnNjc2lfZG1hX2ludHIoaG9zdCk7CisJICAgIGlvc3RhdHVzID0gaW5iKGhvc3QtPmNhcmQuaW9faW50cik7CisJfQorCisJaWYgKGlvc3RhdHVzICYgOCkKKwkgICAgcmV0ID0gYWNvcm5zY3NpX3NiaWNpbnRyKGhvc3QsIGluX2lycSk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSB0cmFuc2ZlciBwZW5kaW5nLCBzdGFydCBpdC4KKwkgKiBPbmx5IHN0YXJ0IGl0IGlmIHRoZSBpbnRlcmZhY2UgaGFzIGFscmVhZHkgc3RhcnRlZCB0cmFuc2ZlcnJpbmcKKwkgKiBpdCdzIGRhdGEKKwkgKi8KKwlpZiAoaG9zdC0+ZG1hLnhmZXJfcmVxdWlyZWQpCisJICAgIGFjb3Juc2NzaV9kbWFfeGZlcihob3N0KTsKKworCWlmIChyZXQgPT0gSU5UUl9ORVhUX0NPTU1BTkQpCisJICAgIHJldCA9IGFjb3Juc2NzaV9raWNrKGhvc3QpOworCisJaW5faXJxID0gMTsKKyAgICB9IHdoaWxlIChyZXQgIT0gSU5UUl9JRExFKTsKKworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEludGVyZmFjZXMgYmV0d2VlbiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgcmVzdCBvZiBzY3NpIGNvZGUKKyAqLworCisvKgorICogRnVuY3Rpb24gOiBhY29ybnNjc2lfcXVldWVjbWQoU2NzaV9DbW5kICpjbWQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCisgKiBQdXJwb3NlICA6IHF1ZXVlcyBhIFNDU0kgY29tbWFuZAorICogUGFyYW1zICAgOiBjbWQgIC0gU0NTSSBjb21tYW5kCisgKgkgICAgICBkb25lIC0gZnVuY3Rpb24gY2FsbGVkIG9uIGNvbXBsZXRpb24sIHdpdGggcG9pbnRlciB0byBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIFJldHVybnMgIDogMCwgb3IgPCAwIG9uIGVycm9yLgorICovCitpbnQgYWNvcm5zY3NpX3F1ZXVlY21kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisgICAgQVNfSG9zdCAqaG9zdCA9IChBU19Ib3N0ICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKyAgICBpZiAoIWRvbmUpIHsKKwkvKiB0aGVyZSBzaG91bGQgYmUgc29tZSB3YXkgb2YgcmVqZWN0aW5nIGVycm9ycyBsaWtlIHRoaXMgd2l0aG91dCBwYW5pY2luZy4uLiAqLworCXBhbmljKCJzY3NpJWQ6IHF1ZXVlY29tbWFuZCBjYWxsZWQgd2l0aCBOVUxMIGRvbmUgZnVuY3Rpb24gW2NtZD0lcF0iLAorCQlob3N0LT5ob3N0LT5ob3N0X25vLCBTQ3BudCk7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisjaWYgKERFQlVHICYgREVCVUdfTk9fV1JJVEUpCisgICAgaWYgKGFjb3Juc2NzaV9jbWR0eXBlKFNDcG50LT5jbW5kWzBdKSA9PSBDTURfV1JJVEUgJiYgKE5PX1dSSVRFICYgKDEgPDwgU0NwbnQtPmRldmljZS0+aWQpKSkgeworCXByaW50ayhLRVJOX0NSSVQgInNjc2klZC4lYzogV1JJVEUgYXR0ZW1wdGVkIHdpdGggTk9fV1JJVEUgZmxhZyBzZXRcbiIsCisJICAgIGhvc3QtPmhvc3QtPmhvc3Rfbm8sICcwJyArIFNDcG50LT5kZXZpY2UtPmlkKTsKKwlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJZG9uZShTQ3BudCk7CisJcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisKKyAgICBTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKyAgICBTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgU0NwbnQtPnJlc3VsdCA9IDA7CisgICAgU0NwbnQtPnRhZyA9IDA7CisgICAgU0NwbnQtPlNDcC5waGFzZSA9IChpbnQpYWNvcm5zY3NpX2RhdGFkaXJlY3Rpb24oU0NwbnQtPmNtbmRbMF0pOworICAgIFNDcG50LT5TQ3Auc2VudF9jb21tYW5kID0gMDsKKyAgICBTQ3BudC0+U0NwLnNjc2lfeGZlcnJlZCA9IDA7CisKKyAgICBpbml0X1NDcChTQ3BudCk7CisKKyAgICBob3N0LT5zdGF0cy5xdWV1ZXMgKz0gMTsKKworICAgIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFxdWV1ZV9hZGRfY21kX29yZGVyZWQoJmhvc3QtPnF1ZXVlcy5pc3N1ZSwgU0NwbnQpKSB7CisJICAgIFNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJICAgIGRvbmUoU0NwbnQpOworCSAgICByZXR1cm4gMDsKKwl9CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChob3N0LT5zY3NpLnBoYXNlID09IFBIQVNFX0lETEUpCisJICAgIGFjb3Juc2NzaV9raWNrKGhvc3QpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm90b3R5cGU6IHZvaWQgYWNvcm5zY3NpX3JlcG9ydHN0YXR1cyhTY3NpX0NtbmQgKipTQ3BudHAxLCBTY3NpX0NtbmQgKipTQ3BudHAyLCBpbnQgcmVzdWx0KQorICogUHVycG9zZSAgOiBwYXNzIGEgcmVzdWx0IHRvICpTQ3BudHAxLCBhbmQgY2hlY2sgaWYgKlNDcG50cDEgPSAqU0NwbnRwMgorICogUGFyYW1zICAgOiBTQ3BudHAxIC0gcG9pbnRlciB0byBjb21tYW5kIHRvIHJldHVybgorICoJICAgICAgU0NwbnRwMiAtIHBvaW50ZXIgdG8gY29tbWFuZCB0byBjaGVjaworICoJICAgICAgcmVzdWx0ICAtIHJlc3VsdCB0byBwYXNzIGJhY2sgdG8gbWlkLWxldmVsIGRvbmUgZnVuY3Rpb24KKyAqIFJldHVybnMgIDogKlNDcG50cDIgPSBOVUxMIGlmICpTQ3BudHAxIGlzIHRoZSBzYW1lIGNvbW1hbmQgc3RydWN0dXJlIGFzICpTQ3BudHAyLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIGFjb3Juc2NzaV9yZXBvcnRzdGF0dXMoU2NzaV9DbW5kICoqU0NwbnRwMSwgU2NzaV9DbW5kICoqU0NwbnRwMiwgaW50IHJlc3VsdCkKK3sKKyAgICBTY3NpX0NtbmQgKlNDcG50ID0gKlNDcG50cDE7CisKKyAgICBpZiAoU0NwbnQpIHsKKwkqU0NwbnRwMSA9IE5VTEw7CisKKwlTQ3BudC0+cmVzdWx0ID0gcmVzdWx0OworCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOworICAgIH0KKworICAgIGlmIChTQ3BudCA9PSAqU0NwbnRwMikKKwkqU0NwbnRwMiA9IE5VTEw7Cit9CisKK2VudW0gcmVzX2Fib3J0IHsgcmVzX25vdF9ydW5uaW5nLCByZXNfc3VjY2VzcywgcmVzX3N1Y2Nlc3NfY2xlYXIsIHJlc19zbm9vemUgfTsKKworLyoKKyAqIFByb3RvdHlwZTogZW51bSByZXMgYWNvcm5zY3NpX2RvX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlICA6IGFib3J0IGEgY29tbWFuZCBvbiB0aGlzIGhvc3QKKyAqIFBhcmFtcyAgIDogU0NwbnQgLSBjb21tYW5kIHRvIGFib3J0CisgKiBSZXR1cm5zICA6IG91ciBhYm9ydCBzdGF0dXMKKyAqLworc3RhdGljIGVudW0gcmVzX2Fib3J0CithY29ybnNjc2lfZG9fYWJvcnQoQVNfSG9zdCAqaG9zdCwgU2NzaV9DbW5kICpTQ3BudCkKK3sKKwllbnVtIHJlc19hYm9ydCByZXMgPSByZXNfbm90X3J1bm5pbmc7CisKKwlpZiAocXVldWVfcmVtb3ZlX2NtZCgmaG9zdC0+cXVldWVzLmlzc3VlLCBTQ3BudCkpIHsKKwkJLyoKKwkJICogVGhlIGNvbW1hbmQgd2FzIG9uIHRoZSBpc3N1ZSBxdWV1ZSwgYW5kIGhhcyBub3QgYmVlbgorCQkgKiBpc3N1ZWQgeWV0LiAgV2UgY2FuIHJlbW92ZSB0aGUgY29tbWFuZCBmcm9tIHRoZSBxdWV1ZSwKKwkJICogYW5kIGFja25vd2xlZGdlIHRoZSBhYm9ydC4gIE5laXRoZXIgdGhlIGRldmljZXMgbm9yIHRoZQorCQkgKiBpbnRlcmZhY2Uga25vdyBhYm91dCB0aGUgY29tbWFuZC4KKwkJICovCisvLyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcHJpbnRrKCJvbiBpc3N1ZSBxdWV1ZSAiKTsKKy8vI2VuZGlmCisJCXJlcyA9IHJlc19zdWNjZXNzOworCX0gZWxzZSBpZiAocXVldWVfcmVtb3ZlX2NtZCgmaG9zdC0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgU0NwbnQpKSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdhcyBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgU2ltcGx5CisJCSAqIGFja25vd2xlZGdlIHRoZSBhYm9ydCBjb25kaXRpb24sIGFuZCB3aGVuIHRoZSB0YXJnZXQKKwkJICogcmVjb25uZWN0cywgd2Ugd2lsbCBnaXZlIGl0IGFuIEFCT1JUIG1lc3NhZ2UuICBUaGUKKwkJICogdGFyZ2V0IHNob3VsZCB0aGVuIGRpc2Nvbm5lY3QsIGFuZCB3ZSB3aWxsIGNsZWFyCisJCSAqIHRoZSBidXN5bHVuIGJpdC4KKwkJICovCisvLyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcHJpbnRrKCJvbiBkaXNjb25uZWN0ZWQgcXVldWUgIik7CisvLyNlbmRpZgorCQlyZXMgPSByZXNfc3VjY2VzczsKKwl9IGVsc2UgaWYgKGhvc3QtPlNDcG50ID09IFNDcG50KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoImV4ZWN1dGluZyAiKTsKKy8vI2VuZGlmCisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzd2l0Y2ggKGhvc3QtPnNjc2kucGhhc2UpIHsKKwkJLyoKKwkJICogSWYgdGhlIGludGVyZmFjZSBpcyBpZGxlLCBhbmQgdGhlIGNvbW1hbmQgaXMgJ2Rpc2Nvbm5lY3RhYmxlJywKKwkJICogdGhlbiBpdCBpcyB0aGUgc2FtZSBhcyBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgV2Ugc2ltcGx5CisJCSAqIHJlbW92ZSBhbGwgdHJhY2VzIG9mIHRoZSBjb21tYW5kLiAgV2hlbiB0aGUgdGFyZ2V0IHJlY29ubmVjdHMsCisJCSAqIHdlIHdpbGwgZ2l2ZSBpdCBhbiBBQk9SVCBtZXNzYWdlIHNpbmNlIHRoZSBjb21tYW5kIGNvdWxkIG5vdAorCQkgKiBiZSBmb3VuZC4gIFdoZW4gdGhlIHRhcmdldCBmaW5hbGx5IGRpc2Nvbm5lY3RzLCB3ZSB3aWxsIGNsZWFyCisJCSAqIHRoZSBidXN5bHVuIGJpdC4KKwkJICovCisJCWNhc2UgUEhBU0VfSURMRToKKwkJCWlmIChob3N0LT5zY3NpLmRpc2Nvbm5lY3RhYmxlKSB7CisJCQkJaG9zdC0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJCQkJaG9zdC0+U0NwbnQgPSBOVUxMOworCQkJCXJlcyA9IHJlc19zdWNjZXNzOworCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogSWYgdGhlIGNvbW1hbmQgaGFzIGNvbm5lY3RlZCBhbmQgZG9uZSBub3RoaW5nIGZ1cnRoZXIsCisJCSAqIHNpbXBseSBmb3JjZSBhIGRpc2Nvbm5lY3QuICBXZSBhbHNvIG5lZWQgdG8gY2xlYXIgdGhlCisJCSAqIGJ1c3lsdW4gYml0LgorCQkgKi8KKwkJY2FzZSBQSEFTRV9DT05ORUNURUQ6CisJCQlzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQ01ORCwgQ01ORF9ESVNDT05ORUNUKTsKKwkJCWhvc3QtPlNDcG50ID0gTlVMTDsKKwkJCXJlcyA9IHJlc19zdWNjZXNzX2NsZWFyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFjb3Juc2NzaV9hYm9ydGNtZChob3N0LCBob3N0LT5TQ3BudC0+dGFnKTsKKwkJCXJlcyA9IHJlc19zbm9vemU7CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZSBpZiAoaG9zdC0+b3JpZ1NDcG50ID09IFNDcG50KSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgbmV4dCwgYnV0IGEgY29tbWFuZAorCQkgKiBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIGludGVyZmFjZS4gIFRoaXMgaXMgc2ltaWxhciB0bworCQkgKiBiZWluZyBvbiB0aGUgaXNzdWUgcXVldWUsIGV4Y2VwdCB0aGUgYnVzeWx1biBiaXQgaGFzCisJCSAqIGJlZW4gc2V0LgorCQkgKi8KKwkJaG9zdC0+b3JpZ1NDcG50ID0gTlVMTDsKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoIndhaXRpbmcgZm9yIGV4ZWN1dGlvbiAiKTsKKy8vI2VuZGlmCisJCXJlcyA9IHJlc19zdWNjZXNzX2NsZWFyOworCX0gZWxzZQorCQlwcmludGsoInVua25vd24gIik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogUHJvdG90eXBlOiBpbnQgYWNvcm5zY3NpX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlICA6IGFib3J0IGEgY29tbWFuZCBvbiB0aGlzIGhvc3QKKyAqIFBhcmFtcyAgIDogU0NwbnQgLSBjb21tYW5kIHRvIGFib3J0CisgKiBSZXR1cm5zICA6IG9uZSBvZiBTQ1NJX0FCT1JUXyBtYWNyb3MKKyAqLworaW50IGFjb3Juc2NzaV9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCUFTX0hvc3QgKmhvc3QgPSAoQVNfSG9zdCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgcmVzdWx0OworCisJaG9zdC0+c3RhdHMuYWJvcnRzICs9IDE7CisKKyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwl7CisJCWludCBhc3IsIHNzcjsKKwkJYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKwkJc3NyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1NSKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhY29ybnNjc2lfYWJvcnQ6ICIpOworCQlwcmludF9zYmljX3N0YXR1cyhhc3IsIHNzciwgaG9zdC0+c2NzaS5waGFzZSk7CisJCWFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIFNDcG50LT5kZXZpY2UtPmlkKTsKKwl9CisjZW5kaWYKKworCXByaW50aygic2NzaSVkOiAiLCBob3N0LT5ob3N0LT5ob3N0X25vKTsKKworCXN3aXRjaCAoYWNvcm5zY3NpX2RvX2Fib3J0KGhvc3QsIFNDcG50KSkgeworCS8qCisJICogV2UgbWFuYWdlZCB0byBmaW5kIHRoZSBjb21tYW5kIGFuZCBjbGVhcmVkIGl0IG91dC4KKwkgKiBXZSBkbyBub3QgZXhwZWN0IHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGluZyBvbiB0aGUKKwkgKiB0YXJnZXQsIGJ1dCB3ZSBoYXZlIHNldCB0aGUgYnVzeWx1biBiaXQuCisJICovCisJY2FzZSByZXNfc3VjY2Vzc19jbGVhcjoKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoImNsZWFyICIpOworLy8jZW5kaWYKKwkJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaG9zdC0+YnVzeWx1bnMpOworCisJLyoKKwkgKiBXZSBmb3VuZCB0aGUgY29tbWFuZCwgYW5kIGNsZWFyZWQgaXQgb3V0LiAgRWl0aGVyCisJICogdGhlIGNvbW1hbmQgaXMgc3RpbGwga25vd24gdG8gYmUgZXhlY3V0aW5nIG9uIHRoZQorCSAqIHRhcmdldCwgb3IgdGhlIGJ1c3lsdW4gYml0IGlzIG5vdCBzZXQuCisJICovCisJY2FzZSByZXNfc3VjY2VzczoKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoInN1Y2Nlc3NcbiIpOworLy8jZW5kaWYKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisJCXJlc3VsdCA9IFNDU0lfQUJPUlRfU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFdlIGRpZCBmaW5kIHRoZSBjb21tYW5kLCBidXQgdW5mb3J0dW5hdGVseSB3ZSBjb3VsZG4ndAorCSAqIHVuaG9vayBpdCBmcm9tIG91cnNlbHZlcy4gIFdhaXQgc29tZSBtb3JlLCBhbmQgaWYgaXQKKwkgKiBzdGlsbCBkb2Vzbid0IGNvbXBsZXRlLCByZXNldCB0aGUgaW50ZXJmYWNlLgorCSAqLworCWNhc2UgcmVzX3Nub296ZToKKy8vI2lmIChERUJVRyAmIERFQlVHX0FCT1JUKQorCQlwcmludGsoInNub296ZVxuIik7CisvLyNlbmRpZgorCQlyZXN1bHQgPSBTQ1NJX0FCT1JUX1NOT09aRTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZSBmb3VuZCAoZWl0aGVyIGJlY2F1c2UgaXQgY29tcGxldGVkLAorCSAqIG9yIGl0IGdvdCBkcm9wcGVkLgorCSAqLworCWRlZmF1bHQ6CisJY2FzZSByZXNfbm90X3J1bm5pbmc6CisJCWFjb3Juc2NzaV9kdW1wbG9nKGhvc3QsIFNDcG50LT5kZXZpY2UtPmlkKTsKKyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcmVzdWx0ID0gU0NTSV9BQk9SVF9TTk9PWkU7CisjZWxzZQorCQlyZXN1bHQgPSBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworI2VuZGlmCisvLyNpZiAoREVCVUcgJiBERUJVR19BQk9SVCkKKwkJcHJpbnRrKCJub3QgcnVubmluZ1xuIik7CisvLyNlbmRpZgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogUHJvdG90eXBlOiBpbnQgYWNvcm5zY3NpX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXNldF9mbGFncykKKyAqIFB1cnBvc2UgIDogcmVzZXQgYSBjb21tYW5kIG9uIHRoaXMgaG9zdC9yZXNldCB0aGlzIGhvc3QKKyAqIFBhcmFtcyAgIDogU0NwbnQgIC0gY29tbWFuZCBjYXVzaW5nIHJlc2V0CisgKgkgICAgICByZXN1bHQgLSB3aGF0IHR5cGUgb2YgcmVzZXQgdG8gcGVyZm9ybQorICogUmV0dXJucyAgOiBvbmUgb2YgU0NTSV9SRVNFVF8gbWFjcm9zCisgKi8KK2ludCBhY29ybnNjc2lfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IHJlc2V0X2ZsYWdzKQoreworICAgIEFTX0hvc3QgKmhvc3QgPSAoQVNfSG9zdCAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworICAgIFNjc2lfQ21uZCAqU0NwdHI7CisgICAgCisgICAgaG9zdC0+c3RhdHMucmVzZXRzICs9IDE7CisKKyNpZiAoREVCVUcgJiBERUJVR19SRVNFVCkKKyAgICB7CisJaW50IGFzciwgc3NyOworCisJYXNyID0gc2JpY19hcm1fcmVhZChob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfQVNSKTsKKwlzc3IgPSBzYmljX2FybV9yZWFkKGhvc3QtPnNjc2kuaW9fcG9ydCwgU0JJQ19TU1IpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNvcm5zY3NpX3Jlc2V0OiAiKTsKKwlwcmludF9zYmljX3N0YXR1cyhhc3IsIHNzciwgaG9zdC0+c2NzaS5waGFzZSk7CisJYWNvcm5zY3NpX2R1bXBsb2coaG9zdCwgU0NwbnQtPmRldmljZS0+aWQpOworICAgIH0KKyNlbmRpZgorCisgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOworCisgICAgU0NwdHIgPSBob3N0LT5TQ3BudDsKKworICAgIC8qCisgICAgICogZG8gaGFyZCByZXNldC4gIFRoaXMgcmVzZXRzIGFsbCBkZXZpY2VzIG9uIHRoaXMgaG9zdCwgYW5kIHNvIHdlCisgICAgICogbXVzdCBzZXQgdGhlIHJlc2V0IHN0YXR1cyBvbiBhbGwgY29tbWFuZHMuCisgICAgICovCisgICAgYWNvcm5zY3NpX3Jlc2V0Y2FyZChob3N0KTsKKworICAgIC8qCisgICAgICogcmVwb3J0IHJlc2V0IG9uIGNvbW1hbmRzIGN1cnJlbnQgY29ubmVjdGVkL2Rpc2Nvbm5lY3RlZAorICAgICAqLworICAgIGFjb3Juc2NzaV9yZXBvcnRzdGF0dXMoJmhvc3QtPlNDcG50LCAmU0NwdHIsIERJRF9SRVNFVCk7CisKKyAgICB3aGlsZSAoKFNDcHRyID0gcXVldWVfcmVtb3ZlKCZob3N0LT5xdWV1ZXMuZGlzY29ubmVjdGVkKSkgIT0gTlVMTCkKKwlhY29ybnNjc2lfcmVwb3J0c3RhdHVzKCZTQ3B0ciwgJlNDcG50LCBESURfUkVTRVQpOworCisgICAgaWYgKFNDcG50KSB7CisJU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwlTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKKyAgICB9CisKKyAgICByZXR1cm4gU0NTSV9SRVNFVF9CVVNfUkVTRVQgfCBTQ1NJX1JFU0VUX0hPU1RfUkVTRVQgfCBTQ1NJX1JFU0VUX1NVQ0NFU1M7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogaW5pdGlhbGlzYXRpb24gJiBtaXNjZWxsYW5lb3VzIHN1cHBvcnQKKyAqLworCisvKgorICogRnVuY3Rpb246IGNoYXIgKmFjb3Juc2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCisgKiBQdXJwb3NlIDogcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBpbnRlcmZhY2UKKyAqIFBhcmFtcyAgOiBob3N0IC0gaG9zdCB0byBnaXZlIGluZm9ybWF0aW9uIG9uCisgKiBSZXR1cm5zIDogYSBjb25zdGFudCBzdHJpbmcKKyAqLworY29uc3QKK2NoYXIgKmFjb3Juc2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisgICAgc3RhdGljIGNoYXIgc3RyaW5nWzEwMF0sICpwOworCisgICAgcCA9IHN0cmluZzsKKyAgICAKKyAgICBwICs9IHNwcmludGYoc3RyaW5nLCAiJXMgYXQgcG9ydCAlMDhsWCBpcnEgJWQgdiVkLiVkLiVkIgorI2lmZGVmIENPTkZJR19TQ1NJX0FDT1JOU0NTSV9TWU5DCisgICAgIiBTWU5DIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1RBR0dFRF9RVUVVRQorICAgICIgVEFHIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX0xJTksKKyAgICAiIExJTksiCisjZW5kaWYKKyNpZiAoREVCVUcgJiBERUJVR19OT19XUklURSkKKyAgICAiIE5PV1JJVEUgKCJOT19XUklURV9TVFIiKSIKKyNlbmRpZgorCQksIGhvc3QtPmhvc3R0LT5uYW1lLCBob3N0LT5pb19wb3J0LCBob3N0LT5pcnEsCisJCVZFUl9NQUpPUiwgVkVSX01JTk9SLCBWRVJfUEFUQ0gpOworICAgIHJldHVybiBzdHJpbmc7Cit9CisKK2ludCBhY29ybnNjc2lfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworICAgIGludCBwb3MsIGJlZ2luID0gMCwgZGV2aWR4OworICAgIFNjc2lfRGV2aWNlICpzY2Q7CisgICAgQVNfSG9zdCAqaG9zdDsKKyAgICBjaGFyICpwID0gYnVmZmVyOworCisgICAgaWYgKGlub3V0ID09IDEpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBob3N0ICA9IChBU19Ib3N0ICopaW5zdGFuY2UtPmhvc3RkYXRhOworICAgIAorICAgIHAgKz0gc3ByaW50ZihwLCAiQWNvcm5TQ1NJIGRyaXZlciB2JWQuJWQuJWQiCisjaWZkZWYgQ09ORklHX1NDU0lfQUNPUk5TQ1NJX1NZTkMKKyAgICAiIFNZTkMiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfVEFHR0VEX1FVRVVFCisgICAgIiBUQUciCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NTSV9BQ09STlNDU0lfTElOSworICAgICIgTElOSyIKKyNlbmRpZgorI2lmIChERUJVRyAmIERFQlVHX05PX1dSSVRFKQorICAgICIgTk9XUklURSAoIk5PX1dSSVRFX1NUUiIpIgorI2VuZGlmCisJCSJcblxuIiwgVkVSX01BSk9SLCBWRVJfTUlOT1IsIFZFUl9QQVRDSCk7CisKKyAgICBwICs9IHNwcmludGYocCwJIlNCSUM6IFdEMzNDOTNBICBBZGRyZXNzOiAlMDhYICBJUlEgOiAlZFxuIiwKKwkJCWhvc3QtPnNjc2kuaW9fcG9ydCwgaG9zdC0+c2NzaS5pcnEpOworI2lmZGVmIFVTRV9ETUFDCisgICAgcCArPSBzcHJpbnRmKHAsCSJETUFDOiB1UEM3MTA3MSAgQWRkcmVzczogJTA4WCAgSVJRIDogJWRcblxuIiwKKwkJCWhvc3QtPmRtYS5pb19wb3J0LCBob3N0LT5zY3NpLmlycSk7CisjZW5kaWYKKworICAgIHAgKz0gc3ByaW50ZihwLAkiU3RhdGlzdGljczpcbiIKKwkJCSJRdWV1ZWQgY29tbWFuZHM6ICUtMTB1ICAgIElzc3VlZCBjb21tYW5kczogJS0xMHVcbiIKKwkJCSJEb25lIGNvbW1hbmRzICA6ICUtMTB1ICAgIFJlYWRzICAgICAgICAgIDogJS0xMHVcbiIKKwkJCSJXcml0ZXMgICAgICAgICA6ICUtMTB1ICAgIE90aGVycyAgICAgICAgIDogJS0xMHVcbiIKKwkJCSJEaXNjb25uZWN0cyAgICA6ICUtMTB1ICAgIEFib3J0cyAgICAgICAgIDogJS0xMHVcbiIKKwkJCSJSZXNldHMgICAgICAgICA6ICUtMTB1XG5cbkxhc3QgcGhhc2VzOiIsCisJCQlob3N0LT5zdGF0cy5xdWV1ZXMsCQlob3N0LT5zdGF0cy5yZW1vdmVzLAorCQkJaG9zdC0+c3RhdHMuZmlucywJCWhvc3QtPnN0YXRzLnJlYWRzLAorCQkJaG9zdC0+c3RhdHMud3JpdGVzLAkJaG9zdC0+c3RhdHMubWlzY3MsCisJCQlob3N0LT5zdGF0cy5kaXNjb25uZWN0cywJaG9zdC0+c3RhdHMuYWJvcnRzLAorCQkJaG9zdC0+c3RhdHMucmVzZXRzKTsKKworICAgIGZvciAoZGV2aWR4ID0gMDsgZGV2aWR4IDwgOTsgZGV2aWR4ICsrKSB7CisJdW5zaWduZWQgaW50IHN0YXRwdHIsIHByZXY7CisKKwlwICs9IHNwcmludGYocCwgIlxuJWM6IiwgZGV2aWR4ID09IDggPyAnSCcgOiAoJzAnICsgZGV2aWR4KSk7CisJc3RhdHB0ciA9IGhvc3QtPnN0YXR1c19wdHJbZGV2aWR4XSAtIDEwOworCisJaWYgKChzaWduZWQgaW50KXN0YXRwdHIgPCAwKQorCSAgICBzdGF0cHRyICs9IFNUQVRVU19CVUZGRVJfU0laRTsKKworCXByZXYgPSBob3N0LT5zdGF0dXNbZGV2aWR4XVtzdGF0cHRyXS53aGVuOworCisJZm9yICg7IHN0YXRwdHIgIT0gaG9zdC0+c3RhdHVzX3B0cltkZXZpZHhdOyBzdGF0cHRyID0gKHN0YXRwdHIgKyAxKSAmIChTVEFUVVNfQlVGRkVSX1NJWkUgLSAxKSkgeworCSAgICBpZiAoaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbikgeworCQlwICs9IHNwcmludGYocCwgIiVjJTAyWDolMDJYKyUybGQiLAorCQkJaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0uaXJxID8gJy0nIDogJyAnLAorCQkJaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ucGgsCisJCQlob3N0LT5zdGF0dXNbZGV2aWR4XVtzdGF0cHRyXS5zc3IsCisJCQkoaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbiAtIHByZXYpIDwgMTAwID8KKwkJCQkoaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbiAtIHByZXYpIDogOTkpOworCQlwcmV2ID0gaG9zdC0+c3RhdHVzW2RldmlkeF1bc3RhdHB0cl0ud2hlbjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwICs9IHNwcmludGYocCwgIlxuQXR0YWNoZWQgZGV2aWNlczpcbiIpOworCisgICAgc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNjZCwgaW5zdGFuY2UpIHsKKwlwICs9IHNwcmludGYocCwgIkRldmljZS9MdW4gVGFnZ2VkUSAgICAgIFN5bmNcbiIpOworCXAgKz0gc3ByaW50ZihwLCAiICAgICAlZC8lZCAgICIsIHNjZC0+aWQsIHNjZC0+bHVuKTsKKwlpZiAoc2NkLT50YWdnZWRfc3VwcG9ydGVkKQorCQlwICs9IHNwcmludGYocCwgIiUzc2FibGVkKCUzZCkgIiwKKwkJCSAgICAgc2NkLT5zaW1wbGVfdGFncyA/ICJlbiIgOiAiZGlzIiwKKwkJCSAgICAgc2NkLT5jdXJyZW50X3RhZyk7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgInVuc3VwcG9ydGVkICAiKTsKKworCWlmIChob3N0LT5kZXZpY2Vbc2NkLT5pZF0uc3luY194ZmVyICYgMTUpCisJCXAgKz0gc3ByaW50ZihwLCAib2Zmc2V0ICVkLCAlZCBuc1xuIiwKKwkJCSAgICAgaG9zdC0+ZGV2aWNlW3NjZC0+aWRdLnN5bmNfeGZlciAmIDE1LAorCQkJICAgICBhY29ybnNjc2lfZ2V0cGVyaW9kKGhvc3QtPmRldmljZVtzY2QtPmlkXS5zeW5jX3hmZXIpKTsKKwllbHNlCisJCXAgKz0gc3ByaW50ZihwLCAiYXN5bmNcbiIpOworCisJcG9zID0gcCAtIGJ1ZmZlcjsKKwlpZiAocG9zICsgYmVnaW4gPCBvZmZzZXQpIHsKKwkgICAgYmVnaW4gKz0gcG9zOworCSAgICBwID0gYnVmZmVyOworCX0KKwlwb3MgPSBwIC0gYnVmZmVyOworCWlmIChwb3MgKyBiZWdpbiA+IG9mZnNldCArIGxlbmd0aCkgeworCSAgICBzY3NpX2RldmljZV9wdXQoc2NkKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHBvcyA9IHAgLSBidWZmZXI7CisKKyAgICAqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOworICAgIHBvcyAtPSBvZmZzZXQgLSBiZWdpbjsKKworICAgIGlmIChwb3MgPiBsZW5ndGgpCisJcG9zID0gbGVuZ3RoOworCisgICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBhY29ybnNjc2lfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJPSBhY29ybnNjc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQWNvcm5TQ1NJIiwKKwkuaW5mbwkJCT0gYWNvcm5zY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhY29ybnNjc2lfcXVldWVjbWQsCisjd2FybmluZyBmaXhtZQorCS5hYm9ydAkJCT0gYWNvcm5zY3NpX2Fib3J0LAorCS5yZXNldAkJCT0gYWNvcm5zY3NpX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gMTYsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudW5jaGVja2VkX2lzYV9kbWEJPSAwLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSAiYWNvcm5zY3NpIiwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CithY29ybnNjc2lfcHJvYmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgY29uc3Qgc3RydWN0IGVjYXJkX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCUFTX0hvc3QgKmFzaG9zdDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmFjb3Juc2NzaV90ZW1wbGF0ZSwgc2l6ZW9mKEFTX0hvc3QpKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0OworCisJYXNob3N0ID0gKEFTX0hvc3QgKilob3N0LT5ob3N0ZGF0YTsKKworCWhvc3QtPmlvX3BvcnQgPSBlY2FyZF9hZGRyZXNzKGVjLCBFQ0FSRF9NRU1DLCAwKTsKKwlob3N0LT5pcnEgPSBlYy0+aXJxOworCisJYXNob3N0LT5ob3N0CQk9IGhvc3Q7CisJYXNob3N0LT5zY3NpLmlvX3BvcnQJPSBpb2FkZHIoaG9zdC0+aW9fcG9ydCArIDB4ODAwKTsKKwlhc2hvc3QtPnNjc2kuaXJxCT0gaG9zdC0+aXJxOworCWFzaG9zdC0+Y2FyZC5pb19pbnRyCT0gUE9EX1NQQUNFKGhvc3QtPmlvX3BvcnQpICsgMHg4MDA7CisJYXNob3N0LT5jYXJkLmlvX3BhZ2UJPSBQT0RfU1BBQ0UoaG9zdC0+aW9fcG9ydCkgKyAweGMwMDsKKwlhc2hvc3QtPmNhcmQuaW9fcmFtCT0gaW9hZGRyKGhvc3QtPmlvX3BvcnQpOworCWFzaG9zdC0+ZG1hLmlvX3BvcnQJPSBob3N0LT5pb19wb3J0ICsgMHhjMDA7CisJYXNob3N0LT5kbWEuaW9faW50cl9jbGVhciA9IFBPRF9TUEFDRShob3N0LT5pb19wb3J0KSArIDB4ODAwOworCisJZWMtPmlycWFkZHIJPSAoY2hhciAqKWlvYWRkcihhc2hvc3QtPmNhcmQuaW9faW50cik7CisJZWMtPmlycW1hc2sJPSAweDBhOworCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9yZWdpb24oaG9zdC0+aW9fcG9ydCArIDB4ODAwLCAyLCAiYWNvcm5zY3NpKHNiaWMpIikpCisJCWdvdG8gZXJyXzE7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhc2hvc3QtPmNhcmQuaW9faW50ciwgMSwgImFjb3Juc2NzaShpbnRyKSIpKQorCQlnb3RvIGVycl8yOworCWlmICghcmVxdWVzdF9yZWdpb24oYXNob3N0LT5jYXJkLmlvX3BhZ2UsIDEsICJhY29ybnNjc2kocGFnZSkiKSkKKwkJZ290byBlcnJfMzsKKyNpZmRlZiBVU0VfRE1BQworCWlmICghcmVxdWVzdF9yZWdpb24oYXNob3N0LT5kbWEuaW9fcG9ydCwgMjU2LCAiYWNvcm5zY3NpKGRtYWMpIikpCisJCWdvdG8gZXJyXzQ7CisjZW5kaWYKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDIwNDgsICJhY29ybnNjc2kocmFtKSIpKQorCQlnb3RvIGVycl81OworCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBhY29ybnNjc2lfaW50ciwgU0FfSU5URVJSVVBULCAiYWNvcm5zY3NpIiwgYXNob3N0KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0NSSVQgInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAorCQkJaG9zdC0+aG9zdF9ubywgYXNob3N0LT5zY3NpLmlycSwgcmV0KTsKKwkJZ290byBlcnJfNjsKKwl9CisKKwltZW1zZXQoJmFzaG9zdC0+c3RhdHMsIDAsIHNpemVvZiAoYXNob3N0LT5zdGF0cykpOworCXF1ZXVlX2luaXRpYWxpc2UoJmFzaG9zdC0+cXVldWVzLmlzc3VlKTsKKwlxdWV1ZV9pbml0aWFsaXNlKCZhc2hvc3QtPnF1ZXVlcy5kaXNjb25uZWN0ZWQpOworCW1zZ3F1ZXVlX2luaXRpYWxpc2UoJmFzaG9zdC0+c2NzaS5tc2dzKTsKKworCWFjb3Juc2NzaV9yZXNldGNhcmQoYXNob3N0KTsKKworCXJldCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJmVjLT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyXzc7CisKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwlnb3RvIG91dDsKKworIGVycl83OgorCWZyZWVfaXJxKGhvc3QtPmlycSwgYXNob3N0KTsKKyBlcnJfNjoKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAyMDQ4KTsKKyBlcnJfNToKKyNpZmRlZiBVU0VfRE1BQworCXJlbGVhc2VfcmVnaW9uKGFzaG9zdC0+ZG1hLmlvX3BvcnQsIDI1Nik7CisjZW5kaWYKKyBlcnJfNDoKKwlyZWxlYXNlX3JlZ2lvbihhc2hvc3QtPmNhcmQuaW9fcGFnZSwgMSk7CisgZXJyXzM6CisJcmVsZWFzZV9yZWdpb24oYXNob3N0LT5jYXJkLmlvX2ludHIsIDEpOyAgICAKKyBlcnJfMjoKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0ICsgMHg4MDAsIDIpOworIGVycl8xOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhY29ybnNjc2lfcmVtb3ZlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKwlBU19Ib3N0ICphc2hvc3QgPSAoQVNfSG9zdCAqKWhvc3QtPmhvc3RkYXRhOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIE5VTEwpOworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwkvKgorCSAqIFB1dCBjYXJkIGludG8gUkVTRVQgc3RhdGUKKwkgKi8KKwlvdXRiKDB4ODAsIGFzaG9zdC0+Y2FyZC5pb19wYWdlKTsKKworCWZyZWVfaXJxKGhvc3QtPmlycSwgYXNob3N0KTsKKworCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQgKyAweDgwMCwgMik7CisJcmVsZWFzZV9yZWdpb24oYXNob3N0LT5jYXJkLmlvX2ludHIsIDEpOworCXJlbGVhc2VfcmVnaW9uKGFzaG9zdC0+Y2FyZC5pb19wYWdlLCAxKTsKKwlyZWxlYXNlX3JlZ2lvbihhc2hvc3QtPmRtYS5pb19wb3J0LCAyNTYpOworCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDIwNDgpOworCisJbXNncXVldWVfZnJlZSgmYXNob3N0LT5zY3NpLm1zZ3MpOworCXF1ZXVlX2ZyZWUoJmFzaG9zdC0+cXVldWVzLmRpc2Nvbm5lY3RlZCk7CisJcXVldWVfZnJlZSgmYXNob3N0LT5xdWV1ZXMuaXNzdWUpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgYWNvcm5zY3NpX2NpZHNbXSA9IHsKKwl7IE1BTlVfQUNPUk4sIFBST0RfQUNPUk5fU0NTSSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfZHJpdmVyIGFjb3Juc2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFjb3Juc2NzaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFjb3Juc2NzaV9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFjb3Juc2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJhY29ybnNjc2kiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY29ybnNjc2lfaW5pdCh2b2lkKQoreworCXJldHVybiBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoJmFjb3Juc2NzaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNvcm5zY3NpX2V4aXQodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZhY29ybnNjc2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWNvcm5zY3NpX2luaXQpOworbW9kdWxlX2V4aXQoYWNvcm5zY3NpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWNvcm5TQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuaCBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ODFmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmgKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL2Fjb3Juc2NzaS5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBY29ybiBTQ1NJIGRyaXZlcgorICovCisjaWZuZGVmIEFDT1JOU0NTSV9ICisjZGVmaW5lIEFDT1JOU0NTSV9ICisKKy8qIFNCSUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNCSUNfT1dOSUQJCTAKKyNkZWZpbmUgT1dOSURfRlMxCQkoMTw8NykKKyNkZWZpbmUgT1dOSURfRlMyCQkoMTw8NikKKyNkZWZpbmUgT1dOSURfRUhQCQkoMTw8NCkKKyNkZWZpbmUgT1dOSURfRUFGCQkoMTw8MykKKworI2RlZmluZSBTQklDX0NUUkwJCTEKKyNkZWZpbmUgQ1RSTF9ETUFNT0RFCQkoMTw8NykKKyNkZWZpbmUgQ1RSTF9ETUFEQkFNT0RFCQkoMTw8NikKKyNkZWZpbmUgQ1RSTF9ETUFCVVJTVAkJKDE8PDUpCisjZGVmaW5lIENUUkxfRE1BUE9MTEVECQkwCisjZGVmaW5lIENUUkxfSEhQCQkoMTw8NCkKKyNkZWZpbmUgQ1RSTF9FREkJCSgxPDwzKQorI2RlZmluZSBDVFJMX0lESQkJKDE8PDIpCisjZGVmaW5lIENUUkxfSEEJCQkoMTw8MSkKKyNkZWZpbmUgQ1RSTF9IU1AJCSgxPDwwKQorCisjZGVmaW5lIFNCSUNfVElNRU9VVAkJMgorI2RlZmluZSBTQklDX1RPVFNFQ1RTCQkzCisjZGVmaW5lIFNCSUNfVE9USEVBRFMJCTQKKyNkZWZpbmUgU0JJQ19UT1RDWUxICQk1CisjZGVmaW5lIFNCSUNfVE9UQ1lMTAkJNgorI2RlZmluZSBTQklDX0xPR0FERFJICQk3CisjZGVmaW5lIFNCSUNfTE9HQUREUk0yCQk4CisjZGVmaW5lIFNCSUNfTE9HQUREUk0xCQk5CisjZGVmaW5lIFNCSUNfTE9HQUREUkwJCTEwCisjZGVmaW5lIFNCSUNfU0VDVE9STlVNCQkxMQorI2RlZmluZSBTQklDX0hFQUROVU0JCTEyCisjZGVmaW5lIFNCSUNfQ1lMSAkJMTMKKyNkZWZpbmUgU0JJQ19DWUxMCQkxNAorI2RlZmluZSBTQklDX1RBUkdFVExVTgkJMTUKKyNkZWZpbmUgVEFSR0VUTFVOX1RMVgkJKDE8PDcpCisjZGVmaW5lIFRBUkdFVExVTl9ET0sJCSgxPDw2KQorCisjZGVmaW5lIFNCSUNfQ01ORFBIQVNFCQkxNgorI2RlZmluZSBTQklDX1NZTkNIVFJBTlNGRVIJMTcKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjAJMHgwMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMQkweDAxCisjZGVmaW5lIFNZTkNIVFJBTlNGRVJfT0YyCTB4MDIKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjMJMHgwMworI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GNAkweDA0CisjZGVmaW5lIFNZTkNIVFJBTlNGRVJfT0Y1CTB4MDUKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjYJMHgwNgorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GNwkweDA3CisjZGVmaW5lIFNZTkNIVFJBTlNGRVJfT0Y4CTB4MDgKKyNkZWZpbmUgU1lOQ0hUUkFOU0ZFUl9PRjkJMHgwOQorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMTAJMHgwQQorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMTEJMHgwQgorI2RlZmluZSBTWU5DSFRSQU5TRkVSX09GMTIJMHgwQworI2RlZmluZSBTWU5DSFRSQU5TRkVSXzhEQkEJMHgwMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzJEQkEJMHgyMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzNEQkEJMHgzMAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzREQkEJMHg0MAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzVEQkEJMHg1MAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzZEQkEJMHg2MAorI2RlZmluZSBTWU5DSFRSQU5TRkVSXzdEQkEJMHg3MAorCisjZGVmaW5lIFNCSUNfVFJBTlNDTlRICQkxOAorI2RlZmluZSBTQklDX1RSQU5TQ05UTQkJMTkKKyNkZWZpbmUgU0JJQ19UUkFOU0NOVEwJCTIwCisjZGVmaW5lIFNCSUNfREVTVElECQkyMQorI2RlZmluZSBERVNUSURfU0NDCQkoMTw8NykKKyNkZWZpbmUgREVTVElEX0RQRAkJKDE8PDYpCisKKyNkZWZpbmUgU0JJQ19TT1VSQ0VJRAkJMjIKKyNkZWZpbmUgU09VUkNFSURfRVIJCSgxPDw3KQorI2RlZmluZSBTT1VSQ0VJRF9FUwkJKDE8PDYpCisjZGVmaW5lIFNPVVJDRUlEX0RTUAkJKDE8PDUpCisjZGVmaW5lIFNPVVJDRUlEX1NJVgkJKDE8PDQpCisKKyNkZWZpbmUgU0JJQ19TU1IJCTIzCisjZGVmaW5lIFNCSUNfQ01ORAkJMjQKKyNkZWZpbmUgQ01ORF9SRVNFVAkJMHgwMAorI2RlZmluZSBDTU5EX0FCT1JUCQkweDAxCisjZGVmaW5lIENNTkRfQVNTRVJUQVROCQkweDAyCisjZGVmaW5lIENNTkRfTkVHQVRFQUNLCQkweDAzCisjZGVmaW5lIENNTkRfRElTQ09OTkVDVAkJMHgwNAorI2RlZmluZSBDTU5EX1JFU0VMRUNUCQkweDA1CisjZGVmaW5lIENNTkRfU0VMV0lUSEFUTgkJMHgwNgorI2RlZmluZSBDTU5EX1NFTEVDVAkJMHgwNworI2RlZmluZSBDTU5EX1NFTEVDVEFUTlRSQU5TRkVSCTB4MDgKKyNkZWZpbmUgQ01ORF9TRUxFQ1RUUkFOU0ZFUgkweDA5CisjZGVmaW5lIENNTkRfUkVTRUxFQ1RSWERBVEEJMHgwQQorI2RlZmluZSBDTU5EX1JFU0VMRUNUVFhEQVRBCTB4MEIKKyNkZWZpbmUgQ01ORF9XQUlURk9SU0VMUkVDVgkweDBDCisjZGVmaW5lIENNTkRfU0VORFNUQVRDTUQJMHgwRAorI2RlZmluZSBDTU5EX1NFTkRESVNDT05ORUNUCTB4MEUKKyNkZWZpbmUgQ01ORF9TRVRJREkJCTB4MEYKKyNkZWZpbmUgQ01ORF9SRUNFSVZFQ01ECQkweDEwCisjZGVmaW5lIENNTkRfUkVDRUlWRURUQQkJMHgxMQorI2RlZmluZSBDTU5EX1JFQ0VJVkVNU0cJCTB4MTIKKyNkZWZpbmUgQ01ORF9SRUNFSVZFVVNQCQkweDEzCisjZGVmaW5lIENNTkRfU0VORENNRAkJMHgxNAorI2RlZmluZSBDTU5EX1NFTkREQVRBCQkweDE1CisjZGVmaW5lIENNTkRfU0VORE1TRwkJMHgxNgorI2RlZmluZSBDTU5EX1NFTkRVU1AJCTB4MTcKKyNkZWZpbmUgQ01ORF9UUkFOU0xBVEVBRERSCTB4MTgKKyNkZWZpbmUgQ01ORF9YRkVSSU5GTwkJMHgyMAorI2RlZmluZSBDTU5EX1NCVAkJKDE8PDcpCisKKyNkZWZpbmUgU0JJQ19EQVRBCQkyNQorI2RlZmluZSBTQklDX0FTUgkJMjYKKyNkZWZpbmUgQVNSX0lOVAkJCSgxPDw3KQorI2RlZmluZSBBU1JfTENJCQkJKDE8PDYpCisjZGVmaW5lIEFTUl9CU1kJCQkoMTw8NSkKKyNkZWZpbmUgQVNSX0NJUAkJCSgxPDw0KQorI2RlZmluZSBBU1JfUEUJCQkoMTw8MSkKKyNkZWZpbmUgQVNSX0RCUgkJCSgxPDwwKQorCisvKiBETUFDIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFDX0lOSVQJCTB4MDAKKyNkZWZpbmUgSU5JVF84QklUCQkoMSkKKworI2RlZmluZSBETUFDX0NIQU5ORUwJCTB4ODAKKyNkZWZpbmUgQ0hBTk5FTF8wCQkweDAwCisjZGVmaW5lIENIQU5ORUxfMQkJMHgwMQorI2RlZmluZSBDSEFOTkVMXzIJCTB4MDIKKyNkZWZpbmUgQ0hBTk5FTF8zCQkweDAzCisKKyNkZWZpbmUgRE1BQ19UWENOVExPCQkweDAxCisjZGVmaW5lIERNQUNfVFhDTlRISQkJMHg4MQorI2RlZmluZSBETUFDX1RYQURSTE8JCTB4MDIKKyNkZWZpbmUgRE1BQ19UWEFEUk1ECQkweDgyCisjZGVmaW5lIERNQUNfVFhBRFJISQkJMHgwMworCisjZGVmaW5lIERNQUNfREVWQ09OMAkJMHgwNAorI2RlZmluZSBERVZDT04wX0FLTAkJKDE8PDcpCisjZGVmaW5lIERFVkNPTjBfUlFMCQkoMTw8NikKKyNkZWZpbmUgREVWQ09OMF9FWFcJCSgxPDw1KQorI2RlZmluZSBERVZDT04wX1JPVAkJKDE8PDQpCisjZGVmaW5lIERFVkNPTjBfQ01QCQkoMTw8MykKKyNkZWZpbmUgREVWQ09OMF9ERE1BCQkoMTw8MikKKyNkZWZpbmUgREVWQ09OMF9BSExECQkoMTw8MSkKKyNkZWZpbmUgREVWQ09OMF9NVE0JCSgxPDwwKQorCisjZGVmaW5lIERNQUNfREVWQ09OMQkJMHg4NAorI2RlZmluZSBERVZDT04xX1dFVgkJKDE8PDEpCisjZGVmaW5lIERFVkNPTjFfQkhMRAkJKDE8PDApCisKKyNkZWZpbmUgRE1BQ19NT0RFQ09OCQkweDA1CisjZGVmaW5lIE1PREVDT05fV09FRAkJMHgwMQorI2RlZmluZSBNT0RFQ09OX1ZFUklGWQkJMHgwMAorI2RlZmluZSBNT0RFQ09OX1JFQUQJCTB4MDQKKyNkZWZpbmUgTU9ERUNPTl9XUklURQkJMHgwOAorI2RlZmluZSBNT0RFQ09OX0FVVE9JTklUCTB4MTAKKyNkZWZpbmUgTU9ERUNPTl9BRERSRElSCQkweDIwCisjZGVmaW5lIE1PREVDT05fREVNQU5ECQkweDAwCisjZGVmaW5lIE1PREVDT05fU0lOR0xFCQkweDQwCisjZGVmaW5lIE1PREVDT05fQkxPQ0sJCTB4ODAKKyNkZWZpbmUgTU9ERUNPTl9DQVNDQURFCQkweEMwCisKKyNkZWZpbmUgRE1BQ19TVEFUVVMJCTB4ODUKKyNkZWZpbmUgU1RBVFVTX1RDMAkJKDE8PDApCisjZGVmaW5lIFNUQVRVU19SUTAJCSgxPDw0KQorCisjZGVmaW5lIERNQUNfVEVNUExPCQkweDA2CisjZGVmaW5lIERNQUNfVEVNUEhJCQkweDg2CisjZGVmaW5lIERNQUNfUkVRUkVHCQkweDA3CisjZGVmaW5lIERNQUNfTUFTS1JFRwkJMHg4NworI2RlZmluZSBNQVNLUkVHX00wCQkweDAxCisjZGVmaW5lIE1BU0tSRUdfTTEJCTB4MDIKKyNkZWZpbmUgTUFTS1JFR19NMgkJMHgwNAorI2RlZmluZSBNQVNLUkVHX00zCQkweDA4CisKKy8qIG1pc2NlbGxhbmVvdXMgaW50ZXJuYWwgdmFyaWFibGVzICovCisKKyNkZWZpbmUgUE9EX1NQQUNFKHgpCSgoeCkgKyAweGQwMDAwKQorI2RlZmluZSBNQVNLX09OCQkoTUFTS1JFR19NM3xNQVNLUkVHX00yfE1BU0tSRUdfTTF8TUFTS1JFR19NMCkKKyNkZWZpbmUgTUFTS19PRkYJKE1BU0tSRUdfTTN8TUFTS1JFR19NMnxNQVNLUkVHX00xKQorCisvKgorICogU0NTSSBkcml2ZXIgcGhhc2VzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgUEhBU0VfSURMRSwJCQkJCS8qIHdlJ3JlIG5vdCBwbGFubmluZyBvbiBkb2luZyBhbnl0aGluZwkgKi8KKyAgICBQSEFTRV9DT05ORUNUSU5HLAkJCQkvKiBjb25uZWN0aW5nIHRvIGEgdGFyZ2V0CQkgKi8KKyAgICBQSEFTRV9DT05ORUNURUQsCQkJCS8qIGNvbm5lY3RlZCB0byBhIHRhcmdldAkJICovCisgICAgUEhBU0VfTVNHT1VULAkJCQkvKiBtZXNzYWdlIG91dCB0byBkZXZpY2UJCSAqLworICAgIFBIQVNFX1JFQ09OTkVDVEVELAkJCQkvKiByZWNvbm5lY3RlZAkJCQkgKi8KKyAgICBQSEFTRV9DT01NQU5EUEFVU0VELAkJCS8qIGNvbW1hbmQgcGFydGx5IHNlbnQJCQkgKi8KKyAgICBQSEFTRV9DT01NQU5ELAkJCQkvKiBjb21tYW5kIGFsbCBzZW50CQkJICovCisgICAgUEhBU0VfREFUQU9VVCwJCQkJLyogZGF0YSBvdXQgdG8gZGV2aWNlCQkJICovCisgICAgUEhBU0VfREFUQUlOLAkJCQkvKiBkYXRhIGluIGZyb20gZGV2aWNlCQkJICovCisgICAgUEhBU0VfU1RBVFVTSU4sCQkJCS8qIHN0YXR1cyBpbiBmcm9tIGRldmljZQkJICovCisgICAgUEhBU0VfTVNHSU4sCQkJCS8qIG1lc3NhZ2UgaW4gZnJvbSBkZXZpY2UJCSAqLworICAgIFBIQVNFX0RPTkUsCQkJCQkvKiBmaW5pc2hlZAkJCQkgKi8KKyAgICBQSEFTRV9BQk9SVEVELAkJCQkvKiBhYm9ydGVkCQkJCSAqLworICAgIFBIQVNFX0RJU0NPTk5FQ1QsCQkJCS8qIGRpc2Nvbm5lY3RpbmcJCQkgKi8KK30gcGhhc2VfdDsKKworLyoKKyAqIEFmdGVyIGludGVycnVwdCwgd2hhdCB0byBkbyBub3cKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBJTlRSX0lETEUsCQkJCQkvKiBub3QgZXhwZWN0aW5nIGFub3RoZXIgSVJRCQkgKi8KKyAgICBJTlRSX05FWFRfQ09NTUFORCwJCQkJLyogc3RhcnQgbmV4dCBjb21tYW5kCQkJICovCisgICAgSU5UUl9QUk9DRVNTSU5HLAkJCQkvKiBpbnRlcnJ1cHQgcm91dGluZSBzdGlsbCBwcm9jZXNzaW5nCSAqLworfSBpbnRyX3JldF90OworCisvKgorICogRE1BIGRpcmVjdGlvbgorICovCit0eXBlZGVmIGVudW0geworICAgIERNQV9PVVQsCQkJCQkvKiBETUEgZnJvbSBtZW1vcnkgdG8gY2hpcAkJKi8KKyAgICBETUFfSU4JCQkJCS8qIERNQSBmcm9tIGNoaXAgdG8gbWVtb3J5CQkqLworfSBkbWFkaXJfdDsKKworLyoKKyAqIFN5bmNocm9ub3VzIHRyYW5zZmVyIHN0YXRlCisgKi8KK3R5cGVkZWYgZW51bSB7CQkJCQkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBzdGF0ZQkJKi8KKyAgICBTWU5DX0FTWU5DSFJPTk9VUywJCQkJLyogZG9uJ3QgbmVnb2NpYXRlIHN5bmNocm9ub3VzIHRyYW5zZmVycyovCisgICAgU1lOQ19ORUdPQ0lBVEUsCQkJCS8qIHN0YXJ0IG5lZ29jaWF0aW9uCQkJKi8KKyAgICBTWU5DX1NFTlRfUkVRVUVTVCwJCQkJLyogc2VudCBTRFRSIG1lc3NhZ2UJCQkqLworICAgIFNZTkNfQ09NUExFVEVELAkJCQkvKiByZWNlaXZlZCBTRFRSIHJlcGx5CQkJKi8KK30gc3luY3hmZXJfdDsKKworLyoKKyAqIENvbW1hbmQgdHlwZQorICovCit0eXBlZGVmIGVudW0gewkJCQkJLyogY29tbWFuZCB0eXBlCQkJCSovCisgICAgQ01EX1JFQUQsCQkJCQkvKiBSRUFEXzYsIFJFQURfMTAsIFJFQURfMTIJCSovCisgICAgQ01EX1dSSVRFLAkJCQkJLyogV1JJVEVfNiwgV1JJVEVfMTAsIFdSSVRFXzEyCQkqLworICAgIENNRF9NSVNDLAkJCQkJLyogT3RoZXJzCQkJCSovCit9IGNtZHR5cGVfdDsKKworLyoKKyAqIERhdGEgcGhhc2UgZGlyZWN0aW9uCisgKi8KK3R5cGVkZWYgZW51bSB7CQkJCQkvKiBEYXRhIGRpcmVjdGlvbgkJCSovCisgICAgREFUQURJUl9JTiwJCQkJCS8qIERhdGEgaW4gcGhhc2UgZXhwZWN0ZWQJCSovCisgICAgREFUQURJUl9PVVQJCQkJCS8qIERhdGEgb3V0IHBoYXNlIGV4cGVjdGVkCQkqLworfSBkYXRhZGlyX3Q7CisKKyNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgIm1zZ3F1ZXVlLmgiCisKKyNkZWZpbmUgU1RBVFVTX0JVRkZFUl9TSVpFCTMyCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGR1bXAgdGhlIHByZXZpb3VzIHN0YXRlcyBvZiB0aGUgU0JJQworICovCitzdHJ1Y3Qgc3RhdHVzX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nCXdoZW47CisJdW5zaWduZWQgY2hhcglzc3I7CisJdW5zaWduZWQgY2hhcglwaDsKKwl1bnNpZ25lZCBjaGFyCWlycTsKKwl1bnNpZ25lZCBjaGFyCXVudXNlZDsKK307CisKKyNkZWZpbmUgQUREX1NUQVRVUyhfcSxfc3NyLF9waCxfaXJxKSBcCisoewkJCQkJCQkJCVwKKwlob3N0LT5zdGF0dXNbKF9xKV1baG9zdC0+c3RhdHVzX3B0clsoX3EpXV0ud2hlbiA9IGppZmZpZXM7CVwKKwlob3N0LT5zdGF0dXNbKF9xKV1baG9zdC0+c3RhdHVzX3B0clsoX3EpXV0uc3NyICA9IChfc3NyKTsJXAorCWhvc3QtPnN0YXR1c1soX3EpXVtob3N0LT5zdGF0dXNfcHRyWyhfcSldXS5waCAgID0gKF9waCk7CVwKKwlob3N0LT5zdGF0dXNbKF9xKV1baG9zdC0+c3RhdHVzX3B0clsoX3EpXV0uaXJxICA9IChfaXJxKTsJXAorCWhvc3QtPnN0YXR1c19wdHJbKF9xKV0gPSAoaG9zdC0+c3RhdHVzX3B0clsoX3EpXSArIDEpICYgKFNUQVRVU19CVUZGRVJfU0laRSAtIDEpOyBcCit9KQorCisvKgorICogQWNvcm5TQ1NJIGhvc3Qgc3BlY2lmaWMgZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBhY29ybnNjc2lfaG9zdGRhdGEgeworICAgIC8qIG1pc2NlbGxhbmVvdXMgKi8KKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OwkJCS8qIGhvc3QJCQkJCSovCisgICAgU2NzaV9DbW5kCQkqU0NwbnQ7CQkJLyogY3VycmVudGx5IHByb2Nlc3NpbmcgY29tbWFuZAkJKi8KKyAgICBTY3NpX0NtbmQJCSpvcmlnU0NwbnQ7CQkvKiBvcmlnaW5hbCBjb25uZWN0aW5nIGNvbW1hbmQJCSovCisKKyAgICAvKiBkcml2ZXIgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgeworCXVuc2lnbmVkIGludAlpb19wb3J0OwkJLyogYmFzZSBhZGRyZXNzIG9mIFdEMzNDOTMJCSovCisJdW5zaWduZWQgaW50CWlycTsJCQkvKiBpbnRlcnJ1cHQJCQkJKi8KKwlwaGFzZV90CQlwaGFzZTsJCQkvKiBjdXJyZW50IHBoYXNlCQkJKi8KKworCXN0cnVjdCB7CisJICAgIHVuc2lnbmVkIGNoYXIJdGFyZ2V0OwkJLyogcmVjb25uZWN0ZWQgdGFyZ2V0CQkJKi8KKwkgICAgdW5zaWduZWQgY2hhcglsdW47CQkvKiByZWNvbm5lY3RlZCBsdW4JCQkqLworCSAgICB1bnNpZ25lZCBjaGFyCXRhZzsJCS8qIHJlY29ubmVjdGVkIHRhZwkJCSovCisJfSByZWNvbm5lY3RlZDsKKworCVNjc2lfUG9pbnRlcglTQ3A7CQkJLyogY3VycmVudCBjb21tYW5kcyBkYXRhIHBvaW50ZXIJKi8KKworCU1zZ1F1ZXVlX3QJbXNnczsKKworCXVuc2lnbmVkIHNob3J0CWxhc3RfbWVzc2FnZTsJCS8qIGxhc3QgbWVzc2FnZSB0byBiZSBzZW50CQkqLworCXVuc2lnbmVkIGNoYXIJZGlzY29ubmVjdGFibGU6MTsJLyogdGhpcyBjb21tYW5kIGNhbiBiZSBkaXNjb25uZWN0ZWQJKi8KKyAgICB9IHNjc2k7CisKKyAgICAvKiBzdGF0aXN0aWNzIGluZm9ybWF0aW9uICovCisgICAgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJcXVldWVzOworCXVuc2lnbmVkIGludAlyZW1vdmVzOworCXVuc2lnbmVkIGludAlmaW5zOworCXVuc2lnbmVkIGludAlyZWFkczsKKwl1bnNpZ25lZCBpbnQJd3JpdGVzOworCXVuc2lnbmVkIGludAltaXNjczsKKwl1bnNpZ25lZCBpbnQJZGlzY29ubmVjdHM7CisJdW5zaWduZWQgaW50CWFib3J0czsKKwl1bnNpZ25lZCBpbnQJcmVzZXRzOworICAgIH0gc3RhdHM7CisKKyAgICAvKiBxdWV1ZSBoYW5kbGluZyAqLworICAgIHN0cnVjdCB7CisJUXVldWVfdAkJaXNzdWU7CQkJLyogaXNzdWUgcXVldWUJCQkJKi8KKwlRdWV1ZV90CQlkaXNjb25uZWN0ZWQ7CQkvKiBkaXNjb25uZWN0ZWQgY29tbWFuZCBxdWV1ZQkJKi8KKyAgICB9IHF1ZXVlczsKKworICAgIC8qIHBlci1kZXZpY2UgaW5mbyAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhcglzeW5jX3hmZXI7CQkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciAoU0JJQyB2YWx1ZSkJKi8KKwlzeW5jeGZlcl90CXN5bmNfc3RhdGU7CQkvKiBzeW5jIHhmZXIgbmVnb2NpYXRpb24gc3RhdGUJCSovCisJdW5zaWduZWQgY2hhcglkaXNjb25uZWN0X29rOjE7CS8qIGRldmljZSBjYW4gZGlzY29ubmVjdAkJKi8KKyAgICB9IGRldmljZVs4XTsKKyAgICB1bnNpZ25lZCBsb25nCWJ1c3lsdW5zWzY0IC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsvKiBhcnJheSBvZiBiaXRzIGluZGljYXRpbmcgTFVOcyBidXN5CSovCisKKyAgICAvKiBETUEgaW5mbyAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgaW50CWlvX3BvcnQ7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgRE1BIGNvbnRyb2xsZXIJKi8KKwl1bnNpZ25lZCBpbnQJaW9faW50cl9jbGVhcjsJCS8qIGFkZHJlc3Mgb2YgRE1BIGludGVycnVwdCBjbGVhcgkqLworCXVuc2lnbmVkIGludAlmcmVlX2FkZHI7CQkvKiBuZXh0IGZyZWUgYWRkcmVzcwkJCSovCisJdW5zaWduZWQgaW50CXN0YXJ0X2FkZHI7CQkvKiBzdGFydCBhZGRyZXNzIG9mIGN1cnJlbnQgdHJhbnNmZXIJKi8KKwlkbWFkaXJfdAlkaXJlY3Rpb247CQkvKiBkbWEgZGlyZWN0aW9uCQkJKi8KKwl1bnNpZ25lZCBpbnQJdHJhbnNmZXJyZWQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQJCSovCisJdW5zaWduZWQgaW50CXhmZXJfc3RhcnQ7CQkvKiBzY2hlZHVsZWQgRE1BIHRyYW5zZmVyIHN0YXJ0CQkqLworCXVuc2lnbmVkIGludAl4ZmVyX2xlbmd0aDsJCS8qIHNjaGVkdWxlZCBETUEgdHJhbnNmZXIgbGVuZ3RoCSovCisJY2hhcgkJKnhmZXJfcHRyOwkJLyogcG9pbnRlciB0byBhcmVhCQkJKi8KKwl1bnNpZ25lZCBjaGFyCXhmZXJfcmVxdWlyZWQ6MTsJLyogc2V0IGlmIHdlIG5lZWQgdG8gdHJhbnNmZXIgc29tZXRoaW5nCSovCisJdW5zaWduZWQgY2hhcgl4ZmVyX3NldHVwOjE7CQkvKiBzZXQgaWYgRE1BIGlzIHNldHVwCQkJKi8KKwl1bnNpZ25lZCBjaGFyCXhmZXJfZG9uZToxOwkJLyogc2V0IGlmIERNQSByZWFjaGVkIGVuZCBvZiBCSCBsaXN0CSovCisgICAgfSBkbWE7CisKKyAgICAvKiBjYXJkIGluZm8gKi8KKyAgICBzdHJ1Y3QgeworCXVuc2lnbmVkIGludAlpb19pbnRyOwkJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycnVwdCBpZCByZWcJKi8KKwl1bnNpZ25lZCBpbnQJaW9fcGFnZTsJCS8qIGJhc2UgYWRkcmVzcyBvZiBwYWdlIHJlZwkJKi8KKwl1bnNpZ25lZCBpbnQJaW9fcmFtOwkJCS8qIGJhc2UgYWRkcmVzcyBvZiBSQU0gYWNjZXNzCQkqLworCXVuc2lnbmVkIGNoYXIJcGFnZV9yZWc7CQkvKiBjdXJyZW50IHNldHRpbmcgb2YgcGFnZSByZWcJCSovCisgICAgfSBjYXJkOworCisgICAgdW5zaWduZWQgY2hhciBzdGF0dXNfcHRyWzldOworICAgIHN0cnVjdCBzdGF0dXNfZW50cnkgc3RhdHVzWzldW1NUQVRVU19CVUZGRVJfU0laRV07Cit9IEFTX0hvc3Q7CisKKyNlbmRpZiAvKiBBQ09STlNDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hcnhlc2NzaS5jIGIvZHJpdmVycy9zY3NpL2FybS9hcnhlc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODExZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL2FyeGVzY3NpLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9kcml2ZXJzL3Njc2kvYXJ4ZXNjc2kuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIFJ1c3NlbGwgS2luZywgU3RlZmFuIEhhbnNrZQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGV4cGVyaW1lbnRhdGlvbi4gIEhlbmNlLCBpdCBtYXkgaGF2ZSBtYWRlCisgKiBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcGFydGljdWxhciBjYXJkIHRoYXQgSSBoYXZlIGF2YWlsYWJsZSwgYW5kCisgKiBtYXkgbm90IGJlIHJlbGlhYmxlIQorICoKKyAqIENoYW5nZWxvZzoKKyAqICAzMC0wOC0xOTk3CVJNSwkwLjAuMAlDcmVhdGVkLCBSRUFET05MWSB2ZXJzaW9uIGFzIGN1bWFuYV8yLmMKKyAqICAyMi0wMS0xOTk4CVJNSwkwLjAuMQlVcGRhdGVkIHRvIDIuMS44MAorICogIDE1LTA0LTE5OTgJUk1LCTAuMC4xCU9ubHkgZG8gUElPIGlmIEZBUzIxNiB3aWxsIGFsbG93IGl0LgorICogIDExLTA2LTE5OTggCVNICTAuMC4yICAgQ2hhbmdlZCB0byBzdXBwb3J0IEFSWEUgMTYtYml0IFNDU0kgY2FyZAorICoJCQkJZW5hYmxlZCB3cml0aW5nCisgKiAgMDEtMDEtMjAwMAlTSAkwLjEuMCAgIEFkZGVkICpyZWFsKiBwc2V1ZG8gZG1hIHdyaXRpbmcKKyAqCQkJCShhcnhlc2NzaV9wc2V1ZG9fZG1hX3dyaXRlKQorICogIDAyLTA0LTIwMDAJUk1LCTAuMS4xCVVwZGF0ZWQgZm9yIG5ldyBlcnJvciBoYW5kbGluZyBjb2RlLgorICogIDIyLTEwLTIwMDAgIFNICQlVcGRhdGVkIGZvciBuZXcgcmVnaXN0ZXJpbmcgc2NoZW1lLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImZhczIxNi5oIgorCitzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyB7CisJRkFTMjE2X0luZm8JCWluZm87CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkCSplYzsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworfTsKKworI2RlZmluZSBETUFEQVRBX09GRlNFVAkoMHgyMDApCisKKyNkZWZpbmUgRE1BU1RBVF9PRkZTRVQJKDB4NjAwKQorI2RlZmluZSBETUFTVEFUX0RSUQkoMSA8PCAwKQorCisjZGVmaW5lIENTVEFUVVNfSVJRCSgxIDw8IDApCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4xMCAoMjMvMDEvMjAwMyAyLjUuNTcpIgorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9kbWFfc2V0dXAoaG9zdCwgU0NwbnQsIGRpcmVjdGlvbiwgbWluX3R5cGUpCisgKiBQdXJwb3NlIDogaW5pdGlhbGlzZXMgRE1BL1BJTworICogUGFyYW1zICA6IGhvc3QgICAgICAtIGhvc3QKKyAqCSAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICBkaXJlY3Rpb24gLSBETUEgb24gdG8vb2ZmIG9mIGNhcmQKKyAqCSAgICAgbWluX3R5cGUgIC0gbWluaW11bSBETUEgc3VwcG9ydCB0aGF0IHdlIG11c3QgaGF2ZSBmb3IgdGhpcyB0cmFuc2ZlcgorICogUmV0dXJucyA6IDAgaWYgd2Ugc2hvdWxkIG5vdCBzZXQgQ01EX1dJVEhETUEgZm9yIHRyYW5zZmVyIGluZm8gY29tbWFuZAorICovCitzdGF0aWMgZmFzZG1hdHlwZV90Cithcnhlc2NzaV9kbWFfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsCisJCSAgICAgICBmYXNkbWFkaXJfdCBkaXJlY3Rpb24sIGZhc2RtYXR5cGVfdCBtaW5fdHlwZSkKK3sKKwkvKgorCSAqIFdlIGRvbid0IGRvIHJlYWwgRE1BCisJICovCisJcmV0dXJuIGZhc2RtYV9wc2V1ZG87Cit9CisKK3N0YXRpYyB2b2lkIGFyeGVzY3NpX3BzZXVkb19kbWFfd3JpdGUodW5zaWduZWQgY2hhciAqYWRkciwgdm9pZCBfX2lvbWVtICpiYXNlKQoreworICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorICAgICAgICIgICAgICAgICAgICAgICBzdG1kYiAgIHNwISwge3IwLXIxMn1cbiIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByMywgJTBcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByMSwgJTFcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgYWRkICAgICByMiwgcjEsICM1MTJcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByNCwgIzI1NlxuIgorICAgICAgICIubG9vcF8xOiAgICAgICBsZG1pYSAgIHIzISwge3I2LCByOCwgcjEwLCByMTJ9XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIG1vdiAgICAgcjUsIHI2LCBsc2wgIzE2XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIG1vdiAgICAgcjcsIHI4LCBsc2wgIzE2XG4iCisgICAgICAgIi5sb29wXzI6ICAgICAgIGxkcmIgICAgcjAsIFtyMSwgIzE1MzZdXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIHRzdCAgICAgcjAsICMxXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIGJlcSAgICAgLmxvb3BfMlxuIgorICAgICAgICIgICAgICAgICAgICAgICBzdG1pYSAgIHIyLCB7cjUtcjh9XG5cdCIKKyAgICAgICAiICAgICAgICAgICAgICAgbW92ICAgICByOSwgcjEwLCBsc2wgIzE2XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIG1vdiAgICAgcjExLCByMTIsIGxzbCAjMTZcbiIKKyAgICAgICAiLmxvb3BfMzogICAgICAgbGRyYiAgICByMCwgW3IxLCAjMTUzNl1cbiIKKyAgICAgICAiICAgICAgICAgICAgICAgdHN0ICAgICByMCwgIzFcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgYmVxICAgICAubG9vcF8zXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIHN0bWlhICAgcjIsIHtyOS1yMTJ9XG4iCisgICAgICAgIiAgICAgICAgICAgICAgIHN1YnMgICAgcjQsIHI0LCAjMTZcbiIKKyAgICAgICAiICAgICAgICAgICAgICAgYm5lICAgICAubG9vcF8xXG4iCisgICAgICAgIiAgICAgICAgICAgICAgIGxkbWlhICAgc3AhLCB7cjAtcjEyfVxuIgorICAgICAgIDoKKyAgICAgICA6ICJyIiAoYWRkciksICJyIiAoYmFzZSkpOworfQorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9kbWFfcHNldWRvKGhvc3QsIFNDcG50LCBkaXJlY3Rpb24sIHRyYW5zZmVyKQorICogUHVycG9zZSA6IGhhbmRsZXMgcHNldWRvIERNQQorICogUGFyYW1zICA6IGhvc3QgICAgICAtIGhvc3QKKyAqCSAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICBkaXJlY3Rpb24gLSBETUEgb24gdG8vb2ZmIG9mIGNhcmQKKyAqCSAgICAgdHJhbnNmZXIgIC0gbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgd2UgZXhwZWN0IHRvIHRyYW5zZmVyCisgKi8KK3N0YXRpYyB2b2lkCithcnhlc2NzaV9kbWFfcHNldWRvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLAorCQkgICAgZmFzZG1hZGlyX3QgZGlyZWN0aW9uLCBpbnQgdHJhbnNmZXIpCit7CisJc3RydWN0IGFyeGVzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGFyeGVzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBlcnJvciA9IDA7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gaW5mby0+aW5mby5zY3NpLmlvX2Jhc2U7CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKworCWxlbmd0aCA9IFNDcC0+dGhpc19yZXNpZHVhbDsKKwlhZGRyID0gU0NwLT5wdHI7CisKKwlpZiAoZGlyZWN0aW9uID09IERNQV9PVVQpIHsKKwkJdW5zaWduZWQgaW50IHdvcmQ7CisJCXdoaWxlIChsZW5ndGggPiAyNTYpIHsKKwkJCWlmIChyZWFkYihiYXNlICsgMHg4MCkgJiBTVEFUX0lOVCkgeworCQkJCWVycm9yID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFyeGVzY3NpX3BzZXVkb19kbWFfd3JpdGUoYWRkciwgYmFzZSk7CisJCQlhZGRyICs9IDI1NjsKKwkJCWxlbmd0aCAtPSAyNTY7CisJCX0KKworCQlpZiAoIWVycm9yKQorCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJCQlpZiAocmVhZGIoYmFzZSArIDB4ODApICYgU1RBVF9JTlQpCisJCQkJCWJyZWFrOworCSAKKwkJCQlpZiAoIShyZWFkYihiYXNlICsgRE1BU1RBVF9PRkZTRVQpICYgRE1BU1RBVF9EUlEpKQorCQkJCQljb250aW51ZTsKKworCQkJCXdvcmQgPSAqYWRkciB8ICooYWRkciArIDEpIDw8IDg7CisKKwkJCQl3cml0ZXcod29yZCwgYmFzZSArIERNQURBVEFfT0ZGU0VUKTsKKwkJCQlpZiAobGVuZ3RoID4gMSkgeworCQkJCQlhZGRyICs9IDI7CisJCQkJCWxlbmd0aCAtPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCWFkZHIgKz0gMTsKKwkJCQkJbGVuZ3RoIC09IDE7CisJCQkJfQorCQkJfQorCX0KKwllbHNlIHsKKwkJaWYgKHRyYW5zZmVyICYmICh0cmFuc2ZlciAmIDI1NSkpIHsKKwkJCXdoaWxlIChsZW5ndGggPj0gMjU2KSB7CisJCQkJaWYgKHJlYWRiKGJhc2UgKyAweDgwKSAmIFNUQVRfSU5UKSB7CisJCQkJCWVycm9yID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCSAgICAKKwkJCQlpZiAoIShyZWFkYihiYXNlICsgRE1BU1RBVF9PRkZTRVQpICYgRE1BU1RBVF9EUlEpKQorCQkJCQljb250aW51ZTsKKworCQkJCXJlYWRzdyhiYXNlICsgRE1BREFUQV9PRkZTRVQsIGFkZHIsIDI1NiA+PiAxKTsKKwkJCQlhZGRyICs9IDI1NjsKKwkJCQlsZW5ndGggLT0gMjU2OworCQkJfQorCQl9CisKKwkJaWYgKCEoZXJyb3IpKQorCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisKKwkJCQlpZiAocmVhZGIoYmFzZSArIDB4ODApICYgU1RBVF9JTlQpCisJCQkJCWJyZWFrOworCisJCQkJaWYgKCEocmVhZGIoYmFzZSArIERNQVNUQVRfT0ZGU0VUKSAmIERNQVNUQVRfRFJRKSkKKwkJCQkJY29udGludWU7CisKKwkJCQl3b3JkID0gcmVhZHcoYmFzZSArIERNQURBVEFfT0ZGU0VUKTsKKwkJCQkqYWRkcisrID0gd29yZDsKKwkJCQlpZiAoLS1sZW5ndGggPiAwKSB7CisJCQkJCSphZGRyKysgPSB3b3JkID4+IDg7CisJCQkJCWxlbmd0aCAtLTsKKwkJCQl9CisJCQl9CisJfQorfQorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9kbWFfc3RvcChob3N0LCBTQ3BudCkKKyAqIFB1cnBvc2UgOiBzdG9wcyBETUEvUElPCisgKiBQYXJhbXMgIDogaG9zdCAgLSBob3N0CisgKgkgICAgIFNDcG50IC0gY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBhcnhlc2NzaV9kbWFfc3RvcChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX1BvaW50ZXIgKlNDcCkKK3sKKwkvKgorCSAqIG5vIERNQSB0byBzdG9wCisJICovCit9CisKKy8qCisgKiBGdW5jdGlvbjogY29uc3QgY2hhciAqYXJ4ZXNjc2lfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCkKKyAqIFB1cnBvc2UgOiByZXR1cm5zIGEgZGVzY3JpcHRpdmUgc3RyaW5nIGFib3V0IHRoaXMgaW50ZXJmYWNlLAorICogUGFyYW1zICA6IGhvc3QgLSBkcml2ZXIgaG9zdCBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm8gZm9yLgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gYSBzdGF0aWMgYnVmZmVyIGNvbnRhaW5pbmcgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFyeGVzY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXN0YXRpYyBjaGFyIHN0cmluZ1sxNTBdOworCisJc3ByaW50ZihzdHJpbmcsICIlcyAoJXMpIGluIHNsb3QgJWQgdiVzIiwKKwkJaG9zdC0+aG9zdHQtPm5hbWUsIGluZm8tPmluZm8uc2NzaS50eXBlLCBpbmZvLT5lYy0+c2xvdF9ubywKKwkJVkVSU0lPTik7CisKKwlyZXR1cm4gc3RyaW5nOworfQorCisvKgorICogRnVuY3Rpb246IGludCBhcnhlc2NzaV9wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKyAqCQkJCQkgaW50IGxlbmd0aCwgaW50IGhvc3Rfbm8sIGludCBpbm91dCkKKyAqIFB1cnBvc2UgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgdGhlIC9wcm9jIGZpbGVzeXN0ZW0uCisgKiBQYXJhbXMgIDogYnVmZmVyIC0gYSBidWZmZXIgdG8gd3JpdGUgaW5mb3JtYXRpb24gdG8KKyAqCSAgICAgc3RhcnQgIC0gYSBwb2ludGVyIGludG8gdGhpcyBidWZmZXIgc2V0IGJ5IHRoaXMgcm91dGluZSB0byB0aGUgc3RhcnQKKyAqCQkgICAgICBvZiB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24uCisgKgkgICAgIG9mZnNldCAtIG9mZnNldCBpbnRvIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSByZWFkIHVwdG8uCisgKgkgICAgIGxlbmd0aCAtIGxlbmd0aCBvZiBidWZmZXIKKyAqCSAgICAgaG9zdF9ubyAtIGhvc3QgbnVtYmVyIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IKKyAqCSAgICAgaW5vdXQgIC0gMCBmb3IgcmVhZGluZywgMSBmb3Igd3JpdGluZy4KKyAqIFJldHVybnMgOiBsZW5ndGggb2YgZGF0YSB3cml0dGVuIHRvIGJ1ZmZlci4KKyAqLworc3RhdGljIGludAorYXJ4ZXNjc2lfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsCisJCSAgIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqaW5mbzsKKwljaGFyICpwID0gYnVmZmVyOworCWludCBwb3M7CisKKwlpbmZvID0gKHN0cnVjdCBhcnhlc2NzaV9pbmZvICopaG9zdC0+aG9zdGRhdGE7CisJaWYgKGlub3V0ID09IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcCArPSBzcHJpbnRmKHAsICJBUlhFIDE2LWJpdCBTQ1NJIGRyaXZlciB2JXNcbiIsIFZFUlNJT04pOworCXAgKz0gZmFzMjE2X3ByaW50X2hvc3QoJmluZm8tPmluZm8sIHApOworCXAgKz0gZmFzMjE2X3ByaW50X3N0YXRzKCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IGZhczIxNl9wcmludF9kZXZpY2VzKCZpbmZvLT5pbmZvLCBwKTsKKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlwb3MgPSBwIC0gYnVmZmVyIC0gb2Zmc2V0OworCWlmIChwb3MgPiBsZW5ndGgpCisJCXBvcyA9IGxlbmd0aDsKKworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgYXJ4ZXNjc2lfdGVtcGxhdGUgPSB7CisJLnByb2NfaW5mbwkJCT0gYXJ4ZXNjc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJCT0gIkFSWEUgU0NTSSBjYXJkIiwKKwkuaW5mbwkJCQk9IGFyeGVzY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJCT0gZmFzMjE2X25vcXVldWVfY29tbWFuZCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9ob3N0X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IGZhczIxNl9laF9kZXZpY2VfcmVzZXQsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2Fib3J0LAorCS5jYW5fcXVldWUJCQk9IDAsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQkJPSAiYXJ4ZXNjc2kiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2FyeGVzY3NpX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXJ4ZXNjc2lfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIHJlc2Jhc2UsIHJlc2xlbjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldDsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlc2Jhc2UgPSBlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX01FTUMpOworCXJlc2xlbiA9IGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX01FTUMpOworCWJhc2UgPSBpb3JlbWFwKHJlc2Jhc2UsIHJlc2xlbik7CisJaWYgKCFiYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlZ2lvbjsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZhcnhlc2NzaV90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhcnhlc2NzaV9pbmZvKSk7CisJaWYgKCFob3N0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCWluZm8gPSAoc3RydWN0IGFyeGVzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlpbmZvLT5lYyA9IGVjOworCWluZm8tPmJhc2UgPSBiYXNlOworCisJaW5mby0+aW5mby5zY3NpLmlvX2Jhc2UJCT0gYmFzZSArIDB4MjAwMDsKKwlpbmZvLT5pbmZvLnNjc2kuaXJxCQk9IE5PX0lSUTsKKwlpbmZvLT5pbmZvLnNjc2kuZG1hCQk9IE5PX0RNQTsKKwlpbmZvLT5pbmZvLnNjc2kuaW9fc2hpZnQJPSA1OworCWluZm8tPmluZm8uaWZjZmcuY2xvY2tyYXRlCT0gMjQ7IC8qIE1IeiAqLworCWluZm8tPmluZm8uaWZjZmcuc2VsZWN0X3RpbWVvdXQgPSAyNTU7CisJaW5mby0+aW5mby5pZmNmZy5hc3luY3BlcmlvZAk9IDIwMDsgLyogbnMgKi8KKwlpbmZvLT5pbmZvLmlmY2ZnLnN5bmNfbWF4X2RlcHRoCT0gMDsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNudGwzCQk9IENOVEwzX0ZBU1RTQ1NJIHwgQ05UTDNfRkFTVENMSzsKKwlpbmZvLT5pbmZvLmlmY2ZnLmRpc2Nvbm5lY3Rfb2sJPSAwOworCWluZm8tPmluZm8uaWZjZmcud2lkZV9tYXhfc2l6ZQk9IDA7CisJaW5mby0+aW5mby5pZmNmZy5jYXBhYmlsaXRpZXMJPSBGQVNDQVBfUFNFVURPRE1BOworCWluZm8tPmluZm8uZG1hLnNldHVwCQk9IGFyeGVzY3NpX2RtYV9zZXR1cDsKKwlpbmZvLT5pbmZvLmRtYS5wc2V1ZG8JCT0gYXJ4ZXNjc2lfZG1hX3BzZXVkbzsKKwlpbmZvLT5pbmZvLmRtYS5zdG9wCQk9IGFyeGVzY3NpX2RtYV9zdG9wOworCQkKKwllYy0+aXJxYWRkciA9IGJhc2U7CisJZWMtPmlycW1hc2sgPSBDU1RBVFVTX0lSUTsKKworCXJldCA9IGZhczIxNl9pbml0KGhvc3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisKKwlyZXQgPSBmYXMyMTZfYWRkKGhvc3QsICZlYy0+ZGV2KTsKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCisJZmFzMjE2X3JlbGVhc2UoaG9zdCk7Cisgb3V0X3VucmVnaXN0ZXI6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKyBvdXRfdW5tYXA6CisJaW91bm1hcChiYXNlKTsKKyBvdXRfcmVnaW9uOgorCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFyeGVzY3NpX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGFyeGVzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGFyeGVzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJaW91bm1hcChpbmZvLT5iYXNlKTsKKworCWZhczIxNl9yZWxlYXNlKGhvc3QpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVjYXJkX2lkIGFyeGVzY3NpX2NpZHNbXSA9IHsKKwl7IE1BTlVfQVJYRSwgUFJPRF9BUlhFX1NDU0kgfSwKKwl7IDB4ZmZmZiwgMHhmZmZmIH0sCit9OworCitzdGF0aWMgc3RydWN0IGVjYXJkX2RyaXZlciBhcnhlc2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFyeGVzY3NpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXJ4ZXNjc2lfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhcnhlc2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJhcnhlc2NzaSIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYXJ4ZV9zY3NpX2RyaXZlcih2b2lkKQoreworCXJldHVybiBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoJmFyeGVzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FyeGVfc2NzaV9kcml2ZXIodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZhcnhlc2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2FyeGVfc2NzaV9kcml2ZXIpOworbW9kdWxlX2V4aXQoZXhpdF9hcnhlX3Njc2lfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU3RlZmFuIEhhbnNrZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUlhFU0NTSSBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzI3MWJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2FybS9jdW1hbmFfMS5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogR2VuZXJpYyBHZW5lcmljIE5DUjUzODAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTUtMjAwMiwgUnVzc2VsbCBLaW5nCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNkZWZpbmUgQVVUT1NFTlNFCisjZGVmaW5lIFBTRVVET19ETUEKKworI2RlZmluZSBDVU1BTkFTQ1NJX1BVQkxJQ19SRUxFQVNFIDEKKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcwlpbnQgcG9ydCwgY3RybAorI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKQkJc3RydWN0IFNjc2lfSG9zdCAqX2luc3RhbmNlCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpCQlfaW5zdGFuY2UgPSBpbnN0YW5jZQorI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJY3VtYW5hc2NzaV9yZWFkKF9pbnN0YW5jZSwgcmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpCWN1bWFuYXNjc2lfd3JpdGUoX2luc3RhbmNlLCByZWcsIHZhbHVlKQorI2RlZmluZSBOQ1I1MzgwX2ludHIJCQljdW1hbmFzY3NpX2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kCQljdW1hbmFzY3NpX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8JCWN1bWFuYXNjc2lfcHJvY19pbmZvCisKKyNkZWZpbmUgQk9BUkRfTk9STUFMCTAKKyNkZWZpbmUgQk9BUkRfTkNSNTNDNDAwCTEKKworI2luY2x1ZGUgIi4uL05DUjUzODAuaCIKKwordm9pZCBjdW1hbmFzY3NpX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworfQorCitjb25zdCBjaGFyICpjdW1hbmFzY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc3BudCkKK3sKKwlyZXR1cm4gIiI7Cit9CisKKyNpZmRlZiBOT1RfRUZGSUNJRU5UCisjZGVmaW5lIENUUkwocCx2KSAgICAgb3V0YigqY3RybCA9ICh2KSwgKHApIC0gNTc3KQorI2RlZmluZSBTVEFUKHApICAgICAgIGluYigocCkrMSkKKyNkZWZpbmUgSU4ocCkgICAgICAgICBpbmIoKHApKQorI2RlZmluZSBPVVQodixwKSAgICAgIG91dGIoKHYpLCAocCkpCisjZWxzZQorI2RlZmluZSBDVFJMKHAsdikJKHBbLTIzMDhdID0gKCpjdHJsID0gKHYpKSkKKyNkZWZpbmUgU1RBVChwKQkJKHBbNF0pCisjZGVmaW5lIElOKHApCQkoKihwKSkKKyNkZWZpbmUgSU4yKHApCQkoKHVuc2lnbmVkIHNob3J0KSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikocCkpKQorI2RlZmluZSBPVVQodixwKQkoKihwKSA9ICh2KSkKKyNkZWZpbmUgT1VUMih2LHApCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKHApKSA9ICh2KSkKKyNlbmRpZgorI2RlZmluZSBMKHYpCQkoKCh2KTw8MTYpfCgodikgJiAweDAwMDBmZmZmKSkKKyNkZWZpbmUgSCh2KQkJKCgodik+PjE2KXwoKHYpICYgMHhmZmZmMDAwMCkpCisKK3N0YXRpYyBpbmxpbmUgaW50CitOQ1I1MzgwX3B3cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGxlbikKK3sKKyAgaW50ICpjdHJsID0gJigoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsOworICBpbnQgb2xkY3RybCA9ICpjdHJsOworICB1bnNpZ25lZCBsb25nICpsYWRkcjsKKyNpZmRlZiBOT1RfRUZGSUNJRU5UCisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKyAgaW50IGRtYV9pbyA9IGlvYmFzZSAmIH4oMHgzQzAwMDA+PjIpOworI2Vsc2UKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaW9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilpb2FkZHIoaW5zdGFuY2UtPmlvX3BvcnQpOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpkbWFfaW8gPSAodW5zaWduZWQgY2hhciAqKSgoaW50KWlvYmFzZSAmIH4weDNDMDAwMCk7CisjZW5kaWYKKworICBpZighbGVuKSByZXR1cm4gMDsKKworICBDVFJMKGlvYmFzZSwgMHgwMik7CisgIGxhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOworICB3aGlsZShsZW4gPj0gMzIpCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHVuc2lnbmVkIGxvbmcgdjsKKyAgICBzdGF0dXMgPSBTVEFUKGlvYmFzZSk7CisgICAgaWYoc3RhdHVzICYgMHg4MCkKKyAgICAgIGdvdG8gZW5kOworICAgIGlmKCEoc3RhdHVzICYgMHg0MCkpCisgICAgICBjb250aW51ZTsKKyAgICB2PSpsYWRkcisrOyBPVVQyKEwodiksZG1hX2lvKTsgT1VUMihIKHYpLGRtYV9pbyk7CisgICAgdj0qbGFkZHIrKzsgT1VUMihMKHYpLGRtYV9pbyk7IE9VVDIoSCh2KSxkbWFfaW8pOworICAgIHY9KmxhZGRyKys7IE9VVDIoTCh2KSxkbWFfaW8pOyBPVVQyKEgodiksZG1hX2lvKTsKKyAgICB2PSpsYWRkcisrOyBPVVQyKEwodiksZG1hX2lvKTsgT1VUMihIKHYpLGRtYV9pbyk7CisgICAgdj0qbGFkZHIrKzsgT1VUMihMKHYpLGRtYV9pbyk7IE9VVDIoSCh2KSxkbWFfaW8pOworICAgIHY9KmxhZGRyKys7IE9VVDIoTCh2KSxkbWFfaW8pOyBPVVQyKEgodiksZG1hX2lvKTsKKyAgICB2PSpsYWRkcisrOyBPVVQyKEwodiksZG1hX2lvKTsgT1VUMihIKHYpLGRtYV9pbyk7CisgICAgdj0qbGFkZHIrKzsgT1VUMihMKHYpLGRtYV9pbyk7IE9VVDIoSCh2KSxkbWFfaW8pOworICAgIGxlbiAtPSAzMjsKKyAgICBpZihsZW4gPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgYWRkciA9ICh1bnNpZ25lZCBjaGFyICopbGFkZHI7CisgIENUUkwoaW9iYXNlLCAweDEyKTsKKyAgd2hpbGUobGVuID4gMCkKKyAgeworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gU1RBVChpb2Jhc2UpOworICAgIGlmKHN0YXR1cyAmIDB4ODApCisgICAgICBnb3RvIGVuZDsKKyAgICBpZihzdGF0dXMgJiAweDQwKQorICAgIHsKKyAgICAgIE9VVCgqYWRkcisrLCBkbWFfaW8pOworICAgICAgaWYoLS1sZW4gPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RhdHVzID0gU1RBVChpb2Jhc2UpOworICAgIGlmKHN0YXR1cyAmIDB4ODApCisgICAgICBnb3RvIGVuZDsKKyAgICBpZihzdGF0dXMgJiAweDQwKQorICAgIHsKKyAgICAgIE9VVCgqYWRkcisrLCBkbWFfaW8pOworICAgICAgaWYoLS1sZW4gPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CitlbmQ6CisgIENUUkwoaW9iYXNlLCBvbGRjdHJsfDB4NDApOworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW5saW5lIGludAorTkNSNTM4MF9wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGxlbikKK3sKKyAgaW50ICpjdHJsID0gJigoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsOworICBpbnQgb2xkY3RybCA9ICpjdHJsOworICB1bnNpZ25lZCBsb25nICpsYWRkcjsKKyNpZmRlZiBOT1RfRUZGSUNJRU5UCisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKyAgaW50IGRtYV9pbyA9IGlvYmFzZSAmIH4oMHgzQzAwMDA+PjIpOworI2Vsc2UKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaW9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilpb2FkZHIoaW5zdGFuY2UtPmlvX3BvcnQpOworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpkbWFfaW8gPSAodW5zaWduZWQgY2hhciAqKSgoaW50KWlvYmFzZSAmIH4weDNDMDAwMCk7CisjZW5kaWYKKworICBpZighbGVuKSByZXR1cm4gMDsKKworICBDVFJMKGlvYmFzZSwgMHgwMCk7CisgIGxhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOworICB3aGlsZShsZW4gPj0gMzIpCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IFNUQVQoaW9iYXNlKTsKKyAgICBpZihzdGF0dXMgJiAweDgwKQorICAgICAgZ290byBlbmQ7CisgICAgaWYoIShzdGF0dXMgJiAweDQwKSkKKyAgICAgIGNvbnRpbnVlOworICAgICpsYWRkcisrID0gSU4yKGRtYV9pbyl8KElOMihkbWFfaW8pPDwxNik7CisgICAgKmxhZGRyKysgPSBJTjIoZG1hX2lvKXwoSU4yKGRtYV9pbyk8PDE2KTsKKyAgICAqbGFkZHIrKyA9IElOMihkbWFfaW8pfChJTjIoZG1hX2lvKTw8MTYpOworICAgICpsYWRkcisrID0gSU4yKGRtYV9pbyl8KElOMihkbWFfaW8pPDwxNik7CisgICAgKmxhZGRyKysgPSBJTjIoZG1hX2lvKXwoSU4yKGRtYV9pbyk8PDE2KTsKKyAgICAqbGFkZHIrKyA9IElOMihkbWFfaW8pfChJTjIoZG1hX2lvKTw8MTYpOworICAgICpsYWRkcisrID0gSU4yKGRtYV9pbyl8KElOMihkbWFfaW8pPDwxNik7CisgICAgKmxhZGRyKysgPSBJTjIoZG1hX2lvKXwoSU4yKGRtYV9pbyk8PDE2KTsKKyAgICBsZW4gLT0gMzI7CisgICAgaWYobGVuID09IDApCisgICAgICBicmVhazsKKyAgfQorCisgIGFkZHIgPSAodW5zaWduZWQgY2hhciAqKWxhZGRyOworICBDVFJMKGlvYmFzZSwgMHgxMCk7CisgIHdoaWxlKGxlbiA+IDApCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IFNUQVQoaW9iYXNlKTsKKyAgICBpZihzdGF0dXMgJiAweDgwKQorICAgICAgZ290byBlbmQ7CisgICAgaWYoc3RhdHVzICYgMHg0MCkKKyAgICB7CisgICAgICAqYWRkcisrID0gSU4oZG1hX2lvKTsKKyAgICAgIGlmKC0tbGVuID09IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0YXR1cyA9IFNUQVQoaW9iYXNlKTsKKyAgICBpZihzdGF0dXMgJiAweDgwKQorICAgICAgZ290byBlbmQ7CisgICAgaWYoc3RhdHVzICYgMHg0MCkKKyAgICB7CisgICAgICAqYWRkcisrID0gSU4oZG1hX2lvKTsKKyAgICAgIGlmKC0tbGVuID09IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorZW5kOgorICBDVFJMKGlvYmFzZSwgb2xkY3RybHwweDQwKTsKKyAgcmV0dXJuIGxlbjsKK30KKworI3VuZGVmIFNUQVQKKyN1bmRlZiBDVFJMCisjdW5kZWYgSU4KKyN1bmRlZiBPVVQKKworI2RlZmluZSBDVFJMKHAsdikgb3V0YigqY3RybCA9ICh2KSwgKHApIC0gNTc3KQorCitzdGF0aWMgY2hhciBjdW1hbmFzY3NpX3JlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IGlvYmFzZSA9IGluc3RhbmNlLT5pb19wb3J0OworCWludCBpOworCWludCAqY3RybCA9ICYoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+Y3RybDsKKworCUNUUkwoaW9iYXNlLCAwKTsKKwlpID0gaW5iKGlvYmFzZSArIDY0ICsgcmVnKTsKKwlDVFJMKGlvYmFzZSwgMHg0MCk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgY3VtYW5hc2NzaV93cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHJlZywgaW50IHZhbHVlKQoreworCWludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKwlpbnQgKmN0cmwgPSAmKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmN0cmw7CisKKwlDVFJMKGlvYmFzZSwgMCk7CisJb3V0Yih2YWx1ZSwgaW9iYXNlICsgNjQgKyByZWcpOworCUNUUkwoaW9iYXNlLCAweDQwKTsKK30KKworI3VuZGVmIENUUkwKKworI2luY2x1ZGUgIi4uL05DUjUzODAuYyIKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBjdW1hbmFzY3NpX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiQ3VtYW5hIDE2LWJpdCBTQ1NJIiwKKwkuaW5mbwkJCT0gY3VtYW5hc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gY3VtYW5hc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gTkNSNTM4MF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IE5DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBOQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAxNiwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAyLAorCS51bmNoZWNrZWRfaXNhX2RtYQk9IDAsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9ICJDdW1hbmFTQ1NJLTEiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2N1bWFuYXNjc2kxX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmN1bWFuYXNjc2lfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmICghaG9zdCkKKwkJZ290byBvdXQ7CisKKyAgICAgICAgaG9zdC0+aW9fcG9ydCA9IGVjYXJkX2FkZHJlc3MoZWMsIEVDQVJEX0lPQywgRUNBUkRfU0xPVykgKyAweDgwMDsKKwlob3N0LT5pcnEgPSBlYy0+aXJxOworCisJTkNSNTM4MF9pbml0KGhvc3QsIDApOworCisJaG9zdC0+bl9pb19wb3J0ID0gMjU1OworCWlmICghKHJlcXVlc3RfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIGhvc3QtPm5faW9fcG9ydCwgIkN1bWFuYVNDU0ktMSIpKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisgICAgICAgICgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilob3N0LT5ob3N0ZGF0YSktPmN0cmwgPSAwOworICAgICAgICBvdXRiKDB4MDAsIGhvc3QtPmlvX3BvcnQgLSA1NzcpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBjdW1hbmFzY3NpX2ludHIsIFNBX0lOVEVSUlVQVCwKKwkJCSAgIkN1bWFuYVNDU0ktMSIsIGhvc3QpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlOiAlZFxuIiwKKwkJICAgIGhvc3QtPmhvc3Rfbm8sIGhvc3QtPmlycSwgcmV0KTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlwcmludGsoInNjc2klZDogYXQgcG9ydCAweCUwOGx4IGlycSAlZCIsCisJCWhvc3QtPmhvc3Rfbm8sIGhvc3QtPmlvX3BvcnQsIGhvc3QtPmlycSk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJCWhvc3QtPmNhbl9xdWV1ZSwgaG9zdC0+Y21kX3Blcl9sdW4sIENVTUFOQVNDU0lfUFVCTElDX1JFTEVBU0UpOworCXByaW50aygiXG5zY3NpJWQ6IiwgaG9zdC0+aG9zdF9ubyk7CisJTkNSNTM4MF9wcmludF9vcHRpb25zKGhvc3QpOworCXByaW50aygiXG4iKTsKKworCXJldCA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJmVjLT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJZ290byBvdXQ7CisKKyBvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKKyBvdXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworIG91dF9mcmVlOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjdW1hbmFzY3NpMV9yZW1vdmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIE5VTEwpOworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKwlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCU5DUjUzODBfZXhpdChob3N0KTsKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgY3VtYW5hc2NzaTFfY2lkc1tdID0geworCXsgTUFOVV9DVU1BTkEsIFBST0RfQ1VNQU5BX1NDU0lfMSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgY3VtYW5hc2NzaTFfZHJpdmVyID0geworCS5wcm9iZQkJPSBjdW1hbmFzY3NpMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGN1bWFuYXNjc2kxX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gY3VtYW5hc2NzaTFfY2lkcywKKwkuZHJ2ID0geworCQkubmFtZQkJPSAiY3VtYW5hc2NzaTEiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjdW1hbmFzY3NpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWNhcmRfcmVnaXN0ZXJfZHJpdmVyKCZjdW1hbmFzY3NpMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3VtYW5hc2NzaV9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmY3VtYW5hc2NzaTFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3VtYW5hc2NzaV9pbml0KTsKK21vZHVsZV9leGl0KGN1bWFuYXNjc2lfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ3VtYW5hIFNDU0ktMSBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMgYi9kcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmMDY0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vY3VtYW5hXzIuYwpAQCAtMCwwICsxLDU1NiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvY3VtYW5hXzIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDMwLTA4LTE5OTcJUk1LCTAuMC4wCUNyZWF0ZWQsIFJFQURPTkxZIHZlcnNpb24uCisgKiAgIDIyLTAxLTE5OTgJUk1LCTAuMC4xCVVwZGF0ZWQgdG8gMi4xLjgwLgorICogICAxNS0wNC0xOTk4CVJNSwkwLjAuMQlPbmx5IGRvIFBJTyBpZiBGQVMyMTYgd2lsbCBhbGxvdyBpdC4KKyAqICAgMDItMDUtMTk5OAlSTUsJMC4wLjIJVXBkYXRlZCAmIGFkZGVkIERNQSBzdXBwb3J0LgorICogICAyNy0wNi0xOTk4CVJNSwkJQ2hhbmdlZCBhc20vZGVsYXkuaCB0byBsaW51eC9kZWxheS5oCisgKiAgIDE4LTA4LTE5OTgJUk1LCTAuMC4zCUZpeGVkIHN5bmNocm9ub3VzIHRyYW5zZmVyIGRlcHRoLgorICogICAwMi0wNC0yMDAwCVJNSwkwLjAuNAlVcGRhdGVkIGZvciBuZXcgZXJyb3IgaGFuZGxpbmcgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlICIuLi9zY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJmYXMyMTYuaCIKKyNpbmNsdWRlICJzY3NpLmgiCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2RlZmluZSBDVU1BTkFTQ1NJMl9TVEFUVVMJCSgweDAwMDApCisjZGVmaW5lIFNUQVRVU19JTlQJCQkoMSA8PCAwKQorI2RlZmluZSBTVEFUVVNfRFJRCQkJKDEgPDwgMSkKKyNkZWZpbmUgU1RBVFVTX0xBVENIRUQJCQkoMSA8PCAzKQorCisjZGVmaW5lIENVTUFOQVNDU0kyX0FMQVRDSAkJKDB4MDAxNCkKKyNkZWZpbmUgQUxBVENIX0VOQV9JTlQJCQkoMykKKyNkZWZpbmUgQUxBVENIX0RJU19JTlQJCQkoMikKKyNkZWZpbmUgQUxBVENIX0VOQV9URVJNCQkJKDUpCisjZGVmaW5lIEFMQVRDSF9ESVNfVEVSTQkJCSg0KQorI2RlZmluZSBBTEFUQ0hfRU5BX0JJVDMyCQkoMTEpCisjZGVmaW5lIEFMQVRDSF9ESVNfQklUMzIJCSgxMCkKKyNkZWZpbmUgQUxBVENIX0VOQV9ETUEJCQkoMTMpCisjZGVmaW5lIEFMQVRDSF9ESVNfRE1BCQkJKDEyKQorI2RlZmluZSBBTEFUQ0hfRE1BX09VVAkJCSgxNSkKKyNkZWZpbmUgQUxBVENIX0RNQV9JTgkJCSgxNCkKKworI2RlZmluZSBDVU1BTkFTQ1NJMl9QU0VVRE9ETUEJCSgweDAyMDApCisKKyNkZWZpbmUgQ1VNQU5BU0NTSTJfRkFTMjE2X09GRlNFVAkoMHgwMzAwKQorI2RlZmluZSBDVU1BTkFTQ1NJMl9GQVMyMTZfU0hJRlQJMgorCisvKgorICogVmVyc2lvbgorICovCisjZGVmaW5lIFZFUlNJT04gIjEuMDAgKDEzLzExLzIwMDIgMi41LjQ3KSIKKworLyoKKyAqIFVzZSB0ZXJtPTAsMSwwLDAsMCB0byB0dXJuIHRlcm1pbmF0b3JzIG9uL29mZgorICovCitzdGF0aWMgaW50IHRlcm1bTUFYX0VDQVJEU10gPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfTsKKworI2RlZmluZSBOUl9TRwkyNTYKKworc3RydWN0IGN1bWFuYXNjc2kyX2luZm8geworCUZBUzIxNl9JbmZvCQlpbmZvOworCXN0cnVjdCBleHBhbnNpb25fY2FyZAkqZWM7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl1bnNpZ25lZCBpbnQJCXRlcm1zOwkJLyogVGVybWluYXRvciBzdGF0ZQkqLworCXN0cnVjdCBzY2F0dGVybGlzdAlzZ1tOUl9TR107CS8qIFNjYXR0ZXIgRE1BIGxpc3QJKi8KK307CisKKyNkZWZpbmUgQ1NUQVRVU19JUlEJKDEgPDwgMCkKKyNkZWZpbmUgQ1NUQVRVU19EUlEJKDEgPDwgMSkKKworLyogUHJvdG90eXBlOiB2b2lkIGN1bWFuYXNjc2lfMl9pcnFlbmFibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBFbmFibGUgaW50ZXJydXB0cyBvbiBDdW1hbmEgU0NTSSAyIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitjdW1hbmFzY3NpXzJfaXJxZW5hYmxlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqaW5mbyA9IGVjLT5pcnFfZGF0YTsKKwl3cml0ZWIoQUxBVENIX0VOQV9JTlQsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworfQorCisvKiBQcm90b3R5cGU6IHZvaWQgY3VtYW5hc2NzaV8yX2lycWRpc2FibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBEaXNhYmxlIGludGVycnVwdHMgb24gQ3VtYW5hIFNDU0kgMiBjYXJkCisgKiBQYXJhbXMgICA6IGVjICAgIC0gZXhwYW5zaW9uIGNhcmQgc3RydWN0dXJlCisgKiAgICAgICAgICA6IGlycW5yIC0gaW50ZXJydXB0IG51bWJlcgorICovCitzdGF0aWMgdm9pZAorY3VtYW5hc2NzaV8yX2lycWRpc2FibGUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICppbmZvID0gZWMtPmlycV9kYXRhOworCXdyaXRlYihBTEFUQ0hfRElTX0lOVCwgaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX0FMQVRDSCk7Cit9CisKK3N0YXRpYyBjb25zdCBleHBhbnNpb25jYXJkX29wc190IGN1bWFuYXNjc2lfMl9vcHMgPSB7CisJLmlycWVuYWJsZQk9IGN1bWFuYXNjc2lfMl9pcnFlbmFibGUsCisJLmlycWRpc2FibGUJPSBjdW1hbmFzY3NpXzJfaXJxZGlzYWJsZSwKK307CisKKy8qIFByb3RvdHlwZTogdm9pZCBjdW1hbmFzY3NpXzJfdGVybWluYXRvcl9jdGwoaG9zdCwgb25fb2ZmKQorICogUHVycG9zZSAgOiBUdXJuIHRoZSBDdW1hbmEgU0NTSSAyIHRlcm1pbmF0b3JzIG9uIG9yIG9mZgorICogUGFyYW1zICAgOiBob3N0ICAgLSBjYXJkIHRvIHR1cm4gb24vb2ZmCisgKiAgICAgICAgICA6IG9uX29mZiAtICEwIHRvIHR1cm4gb24sIDAgdG8gdHVybiBvZmYKKyAqLworc3RhdGljIHZvaWQKK2N1bWFuYXNjc2lfMl90ZXJtaW5hdG9yX2N0bChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgb25fb2ZmKQoreworCXN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICppbmZvID0gKHN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICopaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAob25fb2ZmKSB7CisJCWluZm8tPnRlcm1zID0gMTsKKwkJd3JpdGViKEFMQVRDSF9FTkFfVEVSTSwgaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX0FMQVRDSCk7CisJfSBlbHNlIHsKKwkJaW5mby0+dGVybXMgPSAwOworCQl3cml0ZWIoQUxBVENIX0RJU19URVJNLCBpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfQUxBVENIKTsKKwl9Cit9CisKKy8qIFByb3RvdHlwZTogdm9pZCBjdW1hbmFzY3NpXzJfaW50cihpcnEsICpkZXZfaWQsICpyZWdzKQorICogUHVycG9zZSAgOiBoYW5kbGUgaW50ZXJydXB0cyBmcm9tIEN1bWFuYSBTQ1NJIDIgY2FyZAorICogUGFyYW1zICAgOiBpcnEgICAgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKgkgICAgICBkZXZfaWQgLSB1c2VyLWRlZmluZWQgKFNjc2lfSG9zdCBzdHJ1Y3R1cmUpCisgKgkgICAgICByZWdzICAgLSBwcm9jZXNzb3IgcmVnaXN0ZXJzIGF0IGludGVycnVwdAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2N1bWFuYXNjc2lfMl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSBkZXZfaWQ7CisKKwlyZXR1cm4gZmFzMjE2X2ludHIoJmluZm8tPmluZm8pOworfQorCisvKiBQcm90b3R5cGU6IGZhc2RtYXR5cGVfdCBjdW1hbmFzY3NpXzJfZG1hX3NldHVwKGhvc3QsIFNDcG50LCBkaXJlY3Rpb24sIG1pbl90eXBlKQorICogUHVycG9zZSAgOiBpbml0aWFsaXNlcyBETUEvUElPCisgKiBQYXJhbXMgICA6IGhvc3QgICAgICAtIGhvc3QKKyAqCSAgICAgIFNDcG50ICAgICAtIGNvbW1hbmQKKyAqCSAgICAgIGRpcmVjdGlvbiAtIERNQSBvbiB0by9vZmYgb2YgY2FyZAorICoJICAgICAgbWluX3R5cGUgIC0gbWluaW11bSBETUEgc3VwcG9ydCB0aGF0IHdlIG11c3QgaGF2ZSBmb3IgdGhpcyB0cmFuc2ZlcgorICogUmV0dXJucyAgOiB0eXBlIG9mIHRyYW5zZmVyIHRvIGJlIHBlcmZvcm1lZAorICovCitzdGF0aWMgZmFzZG1hdHlwZV90CitjdW1hbmFzY3NpXzJfZG1hX3NldHVwKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLAorCQkgICAgICAgZmFzZG1hZGlyX3QgZGlyZWN0aW9uLCBmYXNkbWF0eXBlX3QgbWluX3R5cGUpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzY3NpX2dldF9kZXZpY2UoaG9zdCk7CisJaW50IGRtYWNoID0gaW5mby0+aW5mby5zY3NpLmRtYTsKKworCXdyaXRlYihBTEFUQ0hfRElTX0RNQSwgaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX0FMQVRDSCk7CisKKwlpZiAoZG1hY2ggIT0gTk9fRE1BICYmCisJICAgIChtaW5fdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwgfHwgU0NwLT50aGlzX3Jlc2lkdWFsID49IDUxMikpIHsKKwkJaW50IGJ1ZnMsIG1hcF9kaXIsIGRtYV9kaXIsIGFsYXRjaF9kaXI7CisKKwkJYnVmcyA9IGNvcHlfU0NwX3RvX3NnKCZpbmZvLT5zZ1swXSwgU0NwLCBOUl9TRyk7CisKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQkJbWFwX2RpciA9IERNQV9UT19ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfV1JJVEUsCisJCQlhbGF0Y2hfZGlyID0gQUxBVENIX0RNQV9PVVQ7CisJCWVsc2UKKwkJCW1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfUkVBRCwKKwkJCWFsYXRjaF9kaXIgPSBBTEFUQ0hfRE1BX0lOOworCisJCWRtYV9tYXBfc2coZGV2LCBpbmZvLT5zZywgYnVmcyArIDEsIG1hcF9kaXIpOworCisJCWRpc2FibGVfZG1hKGRtYWNoKTsKKwkJc2V0X2RtYV9zZyhkbWFjaCwgaW5mby0+c2csIGJ1ZnMgKyAxKTsKKwkJd3JpdGViKGFsYXRjaF9kaXIsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworCQlzZXRfZG1hX21vZGUoZG1hY2gsIGRtYV9kaXIpOworCQllbmFibGVfZG1hKGRtYWNoKTsKKwkJd3JpdGViKEFMQVRDSF9FTkFfRE1BLCBpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfQUxBVENIKTsKKwkJd3JpdGViKEFMQVRDSF9ESVNfQklUMzIsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworCQlyZXR1cm4gZmFzZG1hX3JlYWxfYWxsOworCX0KKworCS8qCisJICogSWYgd2UncmUgbm90IGRvaW5nIERNQSwKKwkgKiAgd2UnbGwgZG8gcHNldWRvIERNQQorCSAqLworCXJldHVybiBmYXNkbWFfcGlvOworfQorCisvKgorICogUHJvdG90eXBlOiB2b2lkIGN1bWFuYXNjc2lfMl9kbWFfcHNldWRvKGhvc3QsIFNDcG50LCBkaXJlY3Rpb24sIHRyYW5zZmVyKQorICogUHVycG9zZSAgOiBoYW5kbGVzIHBzZXVkbyBETUEKKyAqIFBhcmFtcyAgIDogaG9zdCAgICAgIC0gaG9zdAorICoJICAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICAgZGlyZWN0aW9uIC0gRE1BIG9uIHRvL29mZiBvZiBjYXJkCisgKgkgICAgICB0cmFuc2ZlciAgLSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyB3ZSBleHBlY3QgdG8gdHJhbnNmZXIKKyAqLworc3RhdGljIHZvaWQKK2N1bWFuYXNjc2lfMl9kbWFfcHNldWRvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwLAorCQkJZmFzZG1hZGlyX3QgZGlyZWN0aW9uLCBpbnQgdHJhbnNmZXIpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisKKwlsZW5ndGggPSBTQ3AtPnRoaXNfcmVzaWR1YWw7CisJYWRkciA9IFNDcC0+cHRyOworCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorI2lmIDAKKwkJd2hpbGUgKGxlbmd0aCA+IDEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgd29yZDsKKwkJCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkYihpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfU1RBVFVTKTsKKworCQkJaWYgKHN0YXR1cyAmIFNUQVRVU19JTlQpCisJCQkJZ290byBlbmQ7CisKKwkJCWlmICghKHN0YXR1cyAmIFNUQVRVU19EUlEpKQorCQkJCWNvbnRpbnVlOworCisJCQl3b3JkID0gKmFkZHIgfCAqKGFkZHIgKyAxKSA8PCA4OworCQkJd3JpdGV3KHdvcmQsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9QU0VVRE9ETUEpOworCQkJYWRkciArPSAyOworCQkJbGVuZ3RoIC09IDI7CisJCX0KKyNlbHNlCisJCXByaW50ayAoIlBTRVVET19PVVQ/Pz9cbiIpOworI2VuZGlmCisJZWxzZSB7CisJCWlmICh0cmFuc2ZlciAmJiAodHJhbnNmZXIgJiAyNTUpKSB7CisJCQl3aGlsZSAobGVuZ3RoID49IDI1NikgeworCQkJCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkYihpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfU1RBVFVTKTsKKworCQkJCWlmIChzdGF0dXMgJiBTVEFUVVNfSU5UKQorCQkJCQlyZXR1cm47CisJICAgIAorCQkJCWlmICghKHN0YXR1cyAmIFNUQVRVU19EUlEpKQorCQkJCQljb250aW51ZTsKKworCQkJCXJlYWRzdyhpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfUFNFVURPRE1BLAorCQkJCSAgICAgICBhZGRyLCAyNTYgPj4gMSk7CisJCQkJYWRkciArPSAyNTY7CisJCQkJbGVuZ3RoIC09IDI1NjsKKwkJCX0KKwkJfQorCisJCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisJCQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gcmVhZGIoaW5mby0+YmFzZSArIENVTUFOQVNDU0kyX1NUQVRVUyk7CisKKwkJCWlmIChzdGF0dXMgJiBTVEFUVVNfSU5UKQorCQkJCXJldHVybjsKKworCQkJaWYgKCEoc3RhdHVzICYgU1RBVFVTX0RSUSkpCisJCQkJY29udGludWU7CisKKwkJCXdvcmQgPSByZWFkdyhpbmZvLT5iYXNlICsgQ1VNQU5BU0NTSTJfUFNFVURPRE1BKTsKKwkJCSphZGRyKysgPSB3b3JkOworCQkJaWYgKC0tbGVuZ3RoID4gMCkgeworCQkJCSphZGRyKysgPSB3b3JkID4+IDg7CisJCQkJbGVuZ3RoIC0tOworCQkJfQorCQl9CisJfQorfQorCisvKiBQcm90b3R5cGU6IGludCBjdW1hbmFzY3NpXzJfZG1hX3N0b3AoaG9zdCwgU0NwbnQpCisgKiBQdXJwb3NlICA6IHN0b3BzIERNQS9QSU8KKyAqIFBhcmFtcyAgIDogaG9zdCAgLSBob3N0CisgKgkgICAgICBTQ3BudCAtIGNvbW1hbmQKKyAqLworc3RhdGljIHZvaWQKK2N1bWFuYXNjc2lfMl9kbWFfc3RvcChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX1BvaW50ZXIgKlNDcCkKK3sKKwlzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkgeworCQl3cml0ZWIoQUxBVENIX0RJU19ETUEsIGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9BTEFUQ0gpOworCQlkaXNhYmxlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwl9Cit9CisKKy8qIFByb3RvdHlwZTogY29uc3QgY2hhciAqY3VtYW5hc2NzaV8yX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QpCisgKiBQdXJwb3NlICA6IHJldHVybnMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgYWJvdXQgdGhpcyBpbnRlcmZhY2UsCisgKiBQYXJhbXMgICA6IGhvc3QgLSBkcml2ZXIgaG9zdCBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm8gZm9yLgorICogUmV0dXJucyAgOiBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciBjb250YWluaW5nIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCisgKi8KK2NvbnN0IGNoYXIgKmN1bWFuYXNjc2lfMl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlzdGF0aWMgY2hhciBzdHJpbmdbMTUwXTsKKworCXNwcmludGYoc3RyaW5nLCAiJXMgKCVzKSBpbiBzbG90ICVkIHYlcyB0ZXJtaW5hdG9ycyBvJXMiLAorCQlob3N0LT5ob3N0dC0+bmFtZSwgaW5mby0+aW5mby5zY3NpLnR5cGUsIGluZm8tPmVjLT5zbG90X25vLAorCQlWRVJTSU9OLCBpbmZvLT50ZXJtcyA/ICJuIiA6ICJmZiIpOworCisJcmV0dXJuIHN0cmluZzsKK30KKworLyogUHJvdG90eXBlOiBpbnQgY3VtYW5hc2NzaV8yX3NldF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorICogUHVycG9zZSAgOiBTZXQgYSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb24KKyAqIFBhcmFtcyAgIDogaG9zdCAgIC0gaG9zdCB0byBzZXR1cAorICogICAgICAgICAgOiBidWZmZXIgLSBidWZmZXIgY29udGFpbmluZyBzdHJpbmcgZGVzY3JpYmluZyBvcGVyYXRpb24KKyAqICAgICAgICAgIDogbGVuZ3RoIC0gbGVuZ3RoIG9mIHN0cmluZworICogUmV0dXJucyAgOiAtRUlOVkFMLCBvciAwCisgKi8KK3N0YXRpYyBpbnQKK2N1bWFuYXNjc2lfMl9zZXRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0ID0gbGVuZ3RoOworCisJaWYgKGxlbmd0aCA+PSAxMSAmJiBzdHJjbXAoYnVmZmVyLCAiQ1VNQU5BU0NTSTIiKSA9PSAwKSB7CisJCWJ1ZmZlciArPSAxMTsKKwkJbGVuZ3RoIC09IDExOworCisJCWlmIChsZW5ndGggPj0gNSAmJiBzdHJuY21wKGJ1ZmZlciwgInRlcm09IiwgNSkgPT0gMCkgeworCQkJaWYgKGJ1ZmZlcls1XSA9PSAnMScpCisJCQkJY3VtYW5hc2NzaV8yX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIDEpOworCQkJZWxzZSBpZiAoYnVmZmVyWzVdID09ICcwJykKKwkJCQljdW1hbmFzY3NpXzJfdGVybWluYXRvcl9jdGwoaG9zdCwgMCk7CisJCQllbHNlCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworLyogUHJvdG90eXBlOiBpbnQgY3VtYW5hc2NzaV8yX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorICoJCQkJCSBpbnQgbGVuZ3RoLCBpbnQgaG9zdF9ubywgaW50IGlub3V0KQorICogUHVycG9zZSAgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICogUGFyYW1zICAgOiBidWZmZXIgLSBhIGJ1ZmZlciB0byB3cml0ZSBpbmZvcm1hdGlvbiB0bworICoJICAgICAgc3RhcnQgIC0gYSBwb2ludGVyIGludG8gdGhpcyBidWZmZXIgc2V0IGJ5IHRoaXMgcm91dGluZSB0byB0aGUgc3RhcnQKKyAqCQkgICAgICAgb2YgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLgorICoJICAgICAgb2Zmc2V0IC0gb2Zmc2V0IGludG8gaW5mb3JtYXRpb24gdGhhdCB3ZSBoYXZlIHJlYWQgdXB0by4KKyAqCSAgICAgIGxlbmd0aCAtIGxlbmd0aCBvZiBidWZmZXIKKyAqCSAgICAgIGhvc3Rfbm8gLSBob3N0IG51bWJlciB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yCisgKgkgICAgICBpbm91dCAgLSAwIGZvciByZWFkaW5nLCAxIGZvciB3cml0aW5nLgorICogUmV0dXJucyAgOiBsZW5ndGggb2YgZGF0YSB3cml0dGVuIHRvIGJ1ZmZlci4KKyAqLworaW50IGN1bWFuYXNjc2lfMl9wcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCXN0cnVjdCBjdW1hbmFzY3NpMl9pbmZvICppbmZvOworCWNoYXIgKnAgPSBidWZmZXI7CisJaW50IHBvczsKKworCWlmIChpbm91dCA9PSAxKQorCQlyZXR1cm4gY3VtYW5hc2NzaV8yX3NldF9wcm9jX2luZm8oaG9zdCwgYnVmZmVyLCBsZW5ndGgpOworCisJaW5mbyA9IChzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJcCArPSBzcHJpbnRmKHAsICJDdW1hbmEgU0NTSSBJSSBkcml2ZXIgdiVzXG4iLCBWRVJTSU9OKTsKKwlwICs9IGZhczIxNl9wcmludF9ob3N0KCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IHNwcmludGYocCwgIlRlcm0gICAgOiBvJXNcbiIsCisJCQlpbmZvLT50ZXJtcyA/ICJuIiA6ICJmZiIpOworCisJcCArPSBmYXMyMTZfcHJpbnRfc3RhdHMoJmluZm8tPmluZm8sIHApOworCXAgKz0gZmFzMjE2X3ByaW50X2RldmljZXMoJmluZm8tPmluZm8sIHApOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCXBvcyA9IHAgLSBidWZmZXIgLSBvZmZzZXQ7CisJaWYgKHBvcyA+IGxlbmd0aCkKKwkJcG9zID0gbGVuZ3RoOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBjdW1hbmFzY3NpMl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJCT0gY3VtYW5hc2NzaV8yX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJDdW1hbmEgU0NTSSBJSSIsCisJLmluZm8JCQkJPSBjdW1hbmFzY3NpXzJfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBmYXMyMTZfcXVldWVfY29tbWFuZCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9ob3N0X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IGZhczIxNl9laF9kZXZpY2VfcmVzZXQsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2Fib3J0LAorCS5jYW5fcXVldWUJCQk9IDEsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IERJU0FCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQkJPSAiY3VtYW5hc2NzaTIiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2N1bWFuYXNjc2kyX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIHJlc2Jhc2UsIHJlc2xlbjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldDsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlc2Jhc2UgPSBlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX01FTUMpOworCXJlc2xlbiA9IGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX01FTUMpOworCWJhc2UgPSBpb3JlbWFwKHJlc2Jhc2UsIHJlc2xlbik7CisJaWYgKCFiYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlZ2lvbjsKKwl9CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZjdW1hbmFzY3NpMl90ZW1wbGF0ZSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8pKTsKKwlpZiAoIWhvc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGhvc3QpOworCisJaW5mbyA9IChzdHJ1Y3QgY3VtYW5hc2NzaTJfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWluZm8tPmVjCT0gZWM7CisJaW5mby0+YmFzZQk9IGJhc2U7CisKKwljdW1hbmFzY3NpXzJfdGVybWluYXRvcl9jdGwoaG9zdCwgdGVybVtlYy0+c2xvdF9ub10pOworCisJaW5mby0+aW5mby5zY3NpLmlvX2Jhc2UJCT0gYmFzZSArIENVTUFOQVNDU0kyX0ZBUzIxNl9PRkZTRVQ7CisJaW5mby0+aW5mby5zY3NpLmlvX3NoaWZ0CT0gQ1VNQU5BU0NTSTJfRkFTMjE2X1NISUZUOworCWluZm8tPmluZm8uc2NzaS5pcnEJCT0gZWMtPmlycTsKKwlpbmZvLT5pbmZvLnNjc2kuZG1hCQk9IGVjLT5kbWE7CisJaW5mby0+aW5mby5pZmNmZy5jbG9ja3JhdGUJPSA0MDsgLyogTUh6ICovCisJaW5mby0+aW5mby5pZmNmZy5zZWxlY3RfdGltZW91dAk9IDI1NTsKKwlpbmZvLT5pbmZvLmlmY2ZnLmFzeW5jcGVyaW9kCT0gMjAwOyAvKiBucyAqLworCWluZm8tPmluZm8uaWZjZmcuc3luY19tYXhfZGVwdGgJPSA3OworCWluZm8tPmluZm8uaWZjZmcuY250bDMJCT0gQ05UTDNfQlM4IHwgQ05UTDNfRkFTVFNDU0kgfCBDTlRMM19GQVNUQ0xLOworCWluZm8tPmluZm8uaWZjZmcuZGlzY29ubmVjdF9vawk9IDE7CisJaW5mby0+aW5mby5pZmNmZy53aWRlX21heF9zaXplCT0gMDsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNhcGFiaWxpdGllcwk9IEZBU0NBUF9QU0VVRE9ETUE7CisJaW5mby0+aW5mby5kbWEuc2V0dXAJCT0gY3VtYW5hc2NzaV8yX2RtYV9zZXR1cDsKKwlpbmZvLT5pbmZvLmRtYS5wc2V1ZG8JCT0gY3VtYW5hc2NzaV8yX2RtYV9wc2V1ZG87CisJaW5mby0+aW5mby5kbWEuc3RvcAkJPSBjdW1hbmFzY3NpXzJfZG1hX3N0b3A7CisKKwllYy0+aXJxYWRkcgk9IGluZm8tPmJhc2UgKyBDVU1BTkFTQ1NJMl9TVEFUVVM7CisJZWMtPmlycW1hc2sJPSBTVEFUVVNfSU5UOworCWVjLT5pcnFfZGF0YQk9IGluZm87CisJZWMtPm9wcwkJPSAmY3VtYW5hc2NzaV8yX29wczsKKworCXJldCA9IGZhczIxNl9pbml0KGhvc3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXQgPSByZXF1ZXN0X2lycShlYy0+aXJxLCBjdW1hbmFzY3NpXzJfaW50ciwKKwkJCSAgU0FfSU5URVJSVVBULCAiY3VtYW5hc2NzaTIiLCBpbmZvKTsKKwlpZiAocmV0KSB7CisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBlYy0+aXJxLCByZXQpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkgeworCQlpZiAocmVxdWVzdF9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSwgImN1bWFuYXNjc2kyIikpIHsKKwkJCXByaW50aygic2NzaSVkOiBETUElZCBub3QgZnJlZSwgdXNpbmcgUElPXG4iLAorCQkJICAgICAgIGhvc3QtPmhvc3Rfbm8sIGluZm8tPmluZm8uc2NzaS5kbWEpOworCQkJaW5mby0+aW5mby5zY3NpLmRtYSA9IE5PX0RNQTsKKwkJfSBlbHNlIHsKKwkJCXNldF9kbWFfc3BlZWQoaW5mby0+aW5mby5zY3NpLmRtYSwgMTgwKTsKKwkJCWluZm8tPmluZm8uaWZjZmcuY2FwYWJpbGl0aWVzIHw9IEZBU0NBUF9ETUE7CisJCX0KKwl9CisKKwlyZXQgPSBmYXMyMTZfYWRkKGhvc3QsICZlYy0+ZGV2KTsKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBob3N0KTsKKworIG91dF9yZWxlYXNlOgorCWZhczIxNl9yZWxlYXNlKGhvc3QpOworCisgb3V0X2ZyZWU6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworIG91dF91bm1hcDoKKwlpb3VubWFwKGJhc2UpOworCisgb3V0X3JlZ2lvbjoKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGN1bWFuYXNjc2kyX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKmluZm8gPSAoc3RydWN0IGN1bWFuYXNjc2kyX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBpbmZvKTsKKworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBjdW1hbmFzY3NpMl9jaWRzW10gPSB7CisJeyBNQU5VX0NVTUFOQSwgUFJPRF9DVU1BTkFfU0NTSV8yIH0sCisJeyAweGZmZmYsIDB4ZmZmZiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgY3VtYW5hc2NzaTJfZHJpdmVyID0geworCS5wcm9iZQkJPSBjdW1hbmFzY3NpMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGN1bWFuYXNjc2kyX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gY3VtYW5hc2NzaTJfY2lkcywKKwkuZHJ2ID0geworCQkubmFtZQkJPSAiY3VtYW5hc2NzaTIiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjdW1hbmFzY3NpMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmY3VtYW5hc2NzaTJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGN1bWFuYXNjc2kyX2V4aXQodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZjdW1hbmFzY3NpMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjdW1hbmFzY3NpMl9pbml0KTsKK21vZHVsZV9leGl0KGN1bWFuYXNjc2kyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3VtYW5hIFNDU0ktMiBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfUEFSTSh0ZXJtLCAiMS04aSIpOworTU9EVUxFX1BBUk1fREVTQyh0ZXJtLCAiU0NTSSBidXMgdGVybWluYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vZWNvc2NzaS5jIGIvZHJpdmVycy9zY3NpL2FybS9lY29zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNjQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZWNvc2NzaS5jCkBAIC0wLDAgKzEsMjM5IEBACisjZGVmaW5lIEFVVE9TRU5TRQorLyogI2RlZmluZSBQU0VVRE9fRE1BICovCisKKy8qCisgKiBFY29TQ1NJIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSwgUnVzc2VsbCBLaW5nCisgKgorICogQUxQSEEgUkVMRUFTRSAxLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiLi4vc2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMJaW50IHBvcnQsIGN0cmwKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkJCXN0cnVjdCBTY3NpX0hvc3QgKl9pbnN0YW5jZQorI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKQkJX2luc3RhbmNlID0gaW5zdGFuY2UKKworI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJZWNvc2NzaV9yZWFkKF9pbnN0YW5jZSwgcmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpCWVjb3Njc2lfd3JpdGUoX2luc3RhbmNlLCByZWcsIHZhbHVlKQorCisjZGVmaW5lIE5DUjUzODBfaW50cgkJCWVjb3Njc2lfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQJCWVjb3Njc2lfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbwkJZWNvc2NzaV9wcm9jX2luZm8KKworI2luY2x1ZGUgIi4uL05DUjUzODAuaCIKKworI2RlZmluZSBFQ09TQ1NJX1BVQkxJQ19SRUxFQVNFIDEKKworc3RhdGljIGNoYXIgZWNvc2NzaV9yZWFkKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcmVnKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CisgIG91dGIocmVnIHwgOCwgaW9iYXNlKTsKKyAgcmV0dXJuIGluYihpb2Jhc2UgKyAxKTsKK30KKworc3RhdGljIHZvaWQgZWNvc2NzaV93cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHJlZywgaW50IHZhbHVlKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CisgIG91dGIocmVnIHwgOCwgaW9iYXNlKTsKKyAgb3V0Yih2YWx1ZSwgaW9iYXNlICsgMSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGVjb3Njc2lfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCisgKgorICogUHVycG9zZSA6IExJTE8gY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKgorICogSW5wdXRzIDogc3RyIC0gdW51c2VkLCBpbnRzIC0gYXJyYXkgb2YgaW50ZWdlciBwYXJhbWV0ZXJzIHdpdGggaW50c1swXQorICoJZXF1YWwgdG8gdGhlIG51bWJlciBvZiBpbnRzLgorICoKKyAqLworCit2b2lkIGVjb3Njc2lfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7Cit9CisKK2NvbnN0IGNoYXIgKiBlY29zY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNwbnQpCit7CisJcmV0dXJuICIiOworfQorCisjaWYgMAorI2RlZmluZSBTVEFUKHApIGludyhwICsgMTQ0KQorCitzdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3B3cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICBpbnQgbGVuKQoreworICBpbnQgaW9iYXNlID0gaG9zdC0+aW9fcG9ydDsKK3ByaW50aygid3JpdGluZyAlcCBsZW4gJWRcbiIsYWRkciwgbGVuKTsKKyAgaWYoIWxlbikgcmV0dXJuIC0xOworCisgIHdoaWxlKDEpCisgIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHdoaWxlKCgoc3RhdHVzID0gU1RBVChpb2Jhc2UpKSAmIDB4MTAwKT09MCk7CisgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICBpbnQgbGVuKQoreworICBpbnQgaW9iYXNlID0gaG9zdC0+aW9fcG9ydDsKKyAgaW50IGlvYmFzZTI9IGhvc3QtPmlvX3BvcnQgKyAweDEwMDsKKyAgdW5zaWduZWQgY2hhciAqc3RhcnQgPSBhZGRyOworICBpbnQgczsKK3ByaW50aygicmVhZGluZyAlcCBsZW4gJWRcbiIsYWRkciwgbGVuKTsKKyAgb3V0YihpbmIoaW9iYXNlICsgMTI4KSwgaW9iYXNlICsgMTM1KTsKKyAgd2hpbGUobGVuID4gMCkKKyAgeworICAgIGludCBzdGF0dXMsYixpLCB0aW1lb3V0OworICAgIHRpbWVvdXQgPSAweDA3RkZGRkZGOworICAgIHdoaWxlKCgoc3RhdHVzID0gU1RBVChpb2Jhc2UpKSAmIDB4MTAwKT09MCkKKyAgICB7CisgICAgICB0aW1lb3V0LS07CisgICAgICBpZihzdGF0dXMgJiAweDIwMCB8fCAhdGltZW91dCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJzdGF0dXMgPSAlcFxuIixzdGF0dXMpOworICAgICAgICBvdXRiKDAsIGlvYmFzZSArIDEzNSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBpZihsZW4gPj0gMTI4KQorICAgIHsKKyAgICAgIGZvcihpPTA7IGk8NjQ7IGkrKykKKyAgICAgIHsKKyAgICAgICAgYiA9IGludyhpb2Jhc2UgKyAxMzYpOworICAgICAgICAqYWRkcisrID0gYjsKKyAgICAgICAgKmFkZHIrKyA9IGI+Pjg7CisgICAgICB9CisgICAgICBsZW4gLT0gMTI4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYiA9IGludyhpb2Jhc2UgKyAxMzYpOworICAgICAgKmFkZHIgKysgPSBiOworICAgICAgbGVuIC09IDE7CisgICAgICBpZihsZW4pCisgICAgICAgICphZGRyICsrID0gYj4+ODsKKyAgICAgIGxlbiAtPSAxOworICAgIH0KKyAgfQorICBvdXRiKDAsIGlvYmFzZSArIDEzNSk7CisgIHByaW50aygiZmlyc3QgYnl0ZXMgPSAlMDJYICUwMlggJTAyWCAlMjBYICUwMlggJTAyWCAlMDJYXG4iLCpzdGFydCwgc3RhcnRbMV0sIHN0YXJ0WzJdLCBzdGFydFszXSwgc3RhcnRbNF0sIHN0YXJ0WzVdLCBzdGFydFs2XSk7CisgIHJldHVybiAxOworfQorI2VuZGlmCisjdW5kZWYgU1RBVAorCisjZGVmaW5lIEJPQVJEX05PUk1BTAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisKKyNpbmNsdWRlICIuLi9OQ1I1MzgwLmMiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZWNvc2NzaV90ZW1wbGF0ZSA9ICB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiU2VyaWFsIFBvcnQgRWNvU0NTSSBOQ1I1MzgwIiwKKwkucHJvY19uYW1lCT0gImVjb3Njc2kiLAorCS5pbmZvCQk9IGVjb3Njc2lfaW5mbywKKwkucXVldWVjb21tYW5kCT0gZWNvc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gTkNSNTM4MF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IE5DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBOQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQk9IDE2LAorCS50aGlzX2lkCT0gNywKKwkuc2dfdGFibGVzaXplCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgk9IDIsCisJLnVzZV9jbHVzdGVyaW5nCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworc3RhdGljIGludCBfX2luaXQgZWNvc2NzaV9pbml0KHZvaWQpCit7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIDA7CisKKwlob3N0LT5pb19wb3J0ID0gMHg4MGNlODAwMDsKKwlob3N0LT5uX2lvX3BvcnQgPSAxNDQ7CisJaG9zdC0+aXJxID0gSVJRX05PTkU7CisKKwlpZiAoIShyZXF1ZXN0X3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJlY29zY3NpIikpICkKKwkJZ290byB1bnJlZ2lzdGVyX3Njc2k7CisKKwllY29zY3NpX3dyaXRlKGhvc3QsIE1PREVfUkVHLCAweDIwKTsJCS8qIElzIGl0IHJlYWxseSBTQ1NJPyAqLworCWlmIChlY29zY3NpX3JlYWQoaG9zdCwgTU9ERV9SRUcpICE9IDB4MjApIC8qIFdyaXRlIHRvIGEgcmVnLiAgICAqLworCQlnb3RvIHJlbGVhc2VfcmVnOworCisJZWNvc2NzaV93cml0ZShob3N0LCBNT0RFX1JFRywgMHgwMCApOwkJLyogaXQgYmFjay4JICAgICAgKi8KKwlpZiAoZWNvc2NzaV9yZWFkKGhvc3QsIE1PREVfUkVHKSAhPSAweDAwKQorCQlnb3RvIHJlbGVhc2VfcmVnOworCisJTkNSNTM4MF9pbml0KGhvc3QsIDApOworCisJcHJpbnRrKCJzY3NpJWQ6IGF0IHBvcnQgMHglMDhseCBpcnFzIGRpc2FibGVkIiwgaG9zdC0+aG9zdF9ubywgaG9zdC0+aW9fcG9ydCk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJCWhvc3QtPmNhbl9xdWV1ZSwgaG9zdC0+Y21kX3Blcl9sdW4sIEVDT1NDU0lfUFVCTElDX1JFTEVBU0UpOworCXByaW50aygiXG5zY3NpJWQ6IiwgaG9zdC0+aG9zdF9ubyk7CisJTkNSNTM4MF9wcmludF9vcHRpb25zKGhvc3QpOworCXByaW50aygiXG4iKTsKKworCXNjc2lfYWRkX2hvc3QoaG9zdCwgTlVMTCk7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCXJldHVybiAwOworCityZWxlYXNlX3JlZzoKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOwordW5yZWdpc3Rlcl9zY3NpOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlY29zY3NpX2V4aXQodm9pZCkKK3sKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCisJaWYgKHNocG50LT5pcnEgIT0gSVJRX05PTkUpCisJCWZyZWVfaXJxKHNocG50LT5pcnEsIE5VTEwpOworCU5DUjUzODBfZXhpdChob3N0KTsKKwlpZiAoc2hwbnQtPmlvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBzaHBudC0+bl9pb19wb3J0KTsKKworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGVjb3Njc2lfaW5pdCk7Cittb2R1bGVfZXhpdChlY29zY3NpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiRWNvbmV0LVNDU0kgZHJpdmVyIGZvciBBY29ybiBtYWNoaW5lcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL2Vlc294LmMgYi9kcml2ZXJzL3Njc2kvYXJtL2Vlc294LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiN2U1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZWVzb3guYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvZWVzb3guYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBleHBlcmltZW50YXRpb24uICBIZW5jZSwgaXQgbWF5IGhhdmUgbWFkZQorICogIGFzc3VtcHRpb25zIGFib3V0IHRoZSBwYXJ0aWN1bGFyIGNhcmQgdGhhdCBJIGhhdmUgYXZhaWxhYmxlLCBhbmQKKyAqICBtYXkgbm90IGJlIHJlbGlhYmxlIQorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDAxLTEwLTE5OTcJUk1LCQlDcmVhdGVkLCBSRUFET05MWSB2ZXJzaW9uCisgKiAgIDE1LTAyLTE5OTgJUk1LCQlSRUFEL1dSSVRFIHZlcnNpb24KKyAqCQkJCWFkZGVkIERNQSBzdXBwb3J0IGFuZCBoYXJkd2FyZSBkZWZpbml0aW9ucworICogICAxNC0wMy0xOTk4CVJNSwkJVXBkYXRlZCBETUEgc3VwcG9ydAorICoJCQkJQWRkZWQgdGVybWluYXRvciBjb250cm9sCisgKiAgIDE1LTA0LTE5OTgJUk1LCQlPbmx5IGRvIFBJTyBpZiBGQVMyMTYgd2lsbCBhbGxvdyBpdC4KKyAqICAgMjctMDYtMTk5OAlSTUsJCUNoYW5nZWQgYXNtL2RlbGF5LmggdG8gbGludXgvZGVsYXkuaAorICogICAwMi0wNC0yMDAwCVJNSwkwLjAuMwlGaXhlZCBOT19JUlEvTk9fRE1BIHByb2JsZW0sIHVwZGF0ZWQgZm9yIG5ldworICoJCQkJZXJyb3IgaGFuZGxpbmcgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlICIuLi9zY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJmYXMyMTYuaCIKKyNpbmNsdWRlICJzY3NpLmgiCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2RlZmluZSBFRVNPWF9GQVMyMTZfT0ZGU0VUCTB4MzAwMAorI2RlZmluZSBFRVNPWF9GQVMyMTZfU0hJRlQJNQorCisjZGVmaW5lIEVFU09YX0RNQVNUQVQJCTB4MjgwMAorI2RlZmluZSBFRVNPWF9TVEFUX0lOVFIJCTB4MDEKKyNkZWZpbmUgRUVTT1hfU1RBVF9ETUEJCTB4MDIKKworI2RlZmluZSBFRVNPWF9DT05UUk9MCQkweDI4MDAKKyNkZWZpbmUgRUVTT1hfSU5UUl9FTkFCTEUJMHgwNAorI2RlZmluZSBFRVNPWF9URVJNX0VOQUJMRQkweDAyCisjZGVmaW5lIEVFU09YX1JFU0VUCQkweDAxCisKKyNkZWZpbmUgRUVTT1hfRE1BREFUQQkJMHgzODAwCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4xMCAoMTcvMDEvMjAwMyAyLjUuNTkpIgorCisvKgorICogVXNlIHRlcm09MCwxLDAsMCwwIHRvIHR1cm4gdGVybWluYXRvcnMgb24vb2ZmCisgKi8KK3N0YXRpYyBpbnQgdGVybVtNQVhfRUNBUkRTXSA9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9OworCisjZGVmaW5lIE5SX1NHCTI1NgorCitzdHJ1Y3QgZWVzb3hzY3NpX2luZm8geworCUZBUzIxNl9JbmZvCQlpbmZvOworCXN0cnVjdCBleHBhbnNpb25fY2FyZAkqZWM7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl2b2lkIF9faW9tZW0JCSpjdGxfcG9ydDsKKwl1bnNpZ25lZCBpbnQJCWNvbnRyb2w7CisJc3RydWN0IHNjYXR0ZXJsaXN0CXNnW05SX1NHXTsJLyogU2NhdHRlciBETUEgbGlzdAkqLworfTsKKworLyogUHJvdG90eXBlOiB2b2lkIGVlc294c2NzaV9pcnFlbmFibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBFbmFibGUgaW50ZXJydXB0cyBvbiBFRVNPWCBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfaXJxZW5hYmxlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGVlc294c2NzaV9pbmZvICopZWMtPmlycV9kYXRhOworCisJaW5mby0+Y29udHJvbCB8PSBFRVNPWF9JTlRSX0VOQUJMRTsKKworCXdyaXRlYihpbmZvLT5jb250cm9sLCBpbmZvLT5jdGxfcG9ydCk7Cit9CisKKy8qIFByb3RvdHlwZTogdm9pZCBlZXNveHNjc2lfaXJxZGlzYWJsZShlYywgaXJxbnIpCisgKiBQdXJwb3NlICA6IERpc2FibGUgaW50ZXJydXB0cyBvbiBFRVNPWCBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfaXJxZGlzYWJsZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBpbnQgaXJxbnIpCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWVjLT5pcnFfZGF0YTsKKworCWluZm8tPmNvbnRyb2wgJj0gfkVFU09YX0lOVFJfRU5BQkxFOworCisJd3JpdGViKGluZm8tPmNvbnRyb2wsIGluZm8tPmN0bF9wb3J0KTsKK30KKworc3RhdGljIGNvbnN0IGV4cGFuc2lvbmNhcmRfb3BzX3QgZWVzb3hzY3NpX29wcyA9IHsKKwkuaXJxZW5hYmxlCT0gZWVzb3hzY3NpX2lycWVuYWJsZSwKKwkuaXJxZGlzYWJsZQk9IGVlc294c2NzaV9pcnFkaXNhYmxlLAorfTsKKworLyogUHJvdG90eXBlOiB2b2lkIGVlc294c2NzaV90ZXJtaW5hdG9yX2N0bCgqaG9zdCwgb25fb2ZmKQorICogUHVycG9zZSAgOiBUdXJuIHRoZSBFRVNPWCBTQ1NJIHRlcm1pbmF0b3JzIG9uIG9yIG9mZgorICogUGFyYW1zICAgOiBob3N0ICAgLSBjYXJkIHRvIHR1cm4gb24vb2ZmCisgKiAgICAgICAgICA6IG9uX29mZiAtICEwIHRvIHR1cm4gb24sIDAgdG8gdHVybiBvZmYKKyAqLworc3RhdGljIHZvaWQKK2Vlc294c2NzaV90ZXJtaW5hdG9yX2N0bChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBpbnQgb25fb2ZmKQoreworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKG9uX29mZikKKwkJaW5mby0+Y29udHJvbCB8PSBFRVNPWF9URVJNX0VOQUJMRTsKKwllbHNlCisJCWluZm8tPmNvbnRyb2wgJj0gfkVFU09YX1RFUk1fRU5BQkxFOworCisJd3JpdGViKGluZm8tPmNvbnRyb2wsIGluZm8tPmN0bF9wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKiBQcm90b3R5cGU6IHZvaWQgZWVzb3hzY3NpX2ludHIoaXJxLCAqZGV2X2lkLCAqcmVncykKKyAqIFB1cnBvc2UgIDogaGFuZGxlIGludGVycnVwdHMgZnJvbSBFRVNPWCBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogaXJxICAgIC0gaW50ZXJydXB0IG51bWJlcgorICoJICAgICAgZGV2X2lkIC0gdXNlci1kZWZpbmVkIChTY3NpX0hvc3Qgc3RydWN0dXJlKQorICoJICAgICAgcmVncyAgIC0gcHJvY2Vzc29yIHJlZ2lzdGVycyBhdCBpbnRlcnJ1cHQKKyAqLworc3RhdGljIGlycXJldHVybl90CitlZXNveHNjc2lfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IGRldl9pZDsKKworCXJldHVybiBmYXMyMTZfaW50cigmaW5mby0+aW5mbyk7Cit9CisKKy8qIFByb3RvdHlwZTogZmFzZG1hdHlwZV90IGVlc294c2NzaV9kbWFfc2V0dXAoaG9zdCwgU0NwbnQsIGRpcmVjdGlvbiwgbWluX3R5cGUpCisgKiBQdXJwb3NlICA6IGluaXRpYWxpc2VzIERNQS9QSU8KKyAqIFBhcmFtcyAgIDogaG9zdCAgICAgIC0gaG9zdAorICoJICAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICAgZGlyZWN0aW9uIC0gRE1BIG9uIHRvL29mZiBvZiBjYXJkCisgKgkgICAgICBtaW5fdHlwZSAgLSBtaW5pbXVtIERNQSBzdXBwb3J0IHRoYXQgd2UgbXVzdCBoYXZlIGZvciB0aGlzIHRyYW5zZmVyCisgKiBSZXR1cm5zICA6IHR5cGUgb2YgdHJhbnNmZXIgdG8gYmUgcGVyZm9ybWVkCisgKi8KK3N0YXRpYyBmYXNkbWF0eXBlX3QKK2Vlc294c2NzaV9kbWFfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsCisJCSAgICAgICBmYXNkbWFkaXJfdCBkaXJlY3Rpb24sIGZhc2RtYXR5cGVfdCBtaW5fdHlwZSkKK3sKKwlzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKmluZm8gPSAoc3RydWN0IGVlc294c2NzaV9pbmZvICopaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2NzaV9nZXRfZGV2aWNlKGhvc3QpOworCWludCBkbWFjaCA9IGluZm8tPmluZm8uc2NzaS5kbWE7CisKKwlpZiAoZG1hY2ggIT0gTk9fRE1BICYmCisJICAgIChtaW5fdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwgfHwgU0NwLT50aGlzX3Jlc2lkdWFsID49IDUxMikpIHsKKwkJaW50IGJ1ZnMsIG1hcF9kaXIsIGRtYV9kaXI7CisKKwkJYnVmcyA9IGNvcHlfU0NwX3RvX3NnKCZpbmZvLT5zZ1swXSwgU0NwLCBOUl9TRyk7CisKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQkJbWFwX2RpciA9IERNQV9UT19ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfV1JJVEU7CisJCWVsc2UKKwkJCW1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfUkVBRDsKKworCQlkbWFfbWFwX3NnKGRldiwgaW5mby0+c2csIGJ1ZnMgKyAxLCBtYXBfZGlyKTsKKworCQlkaXNhYmxlX2RtYShkbWFjaCk7CisJCXNldF9kbWFfc2coZG1hY2gsIGluZm8tPnNnLCBidWZzICsgMSk7CisJCXNldF9kbWFfbW9kZShkbWFjaCwgZG1hX2Rpcik7CisJCWVuYWJsZV9kbWEoZG1hY2gpOworCQlyZXR1cm4gZmFzZG1hX3JlYWxfYWxsOworCX0KKwkvKgorCSAqIFdlIGRvbid0IGRvIERNQSwgd2Ugb25seSBkbyBzbG93IFBJTworCSAqCisJICogU29tZSBkYXksIHdlIHdpbGwgZG8gUHNldWRvIERNQQorCSAqLworCXJldHVybiBmYXNkbWFfcHNldWRvOworfQorCitzdGF0aWMgdm9pZCBlZXNveHNjc2lfYnVmZmVyX2luKHZvaWQgKmJ1ZiwgaW50IGxlbmd0aCwgdm9pZCBfX2lvbWVtICpiYXNlKQoreworCWNvbnN0IHZvaWQgX19pb21lbSAqcmVnX2ZhcyA9IGJhc2UgKyBFRVNPWF9GQVMyMTZfT0ZGU0VUOworCWNvbnN0IHZvaWQgX19pb21lbSAqcmVnX2RtYXN0YXQgPSBiYXNlICsgRUVTT1hfRE1BU1RBVDsKKwljb25zdCB2b2lkIF9faW9tZW0gKnJlZ19kbWFkYXRhID0gYmFzZSArIEVFU09YX0RNQURBVEE7CisJY29uc3QgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmZmZmOworCisJZG8geworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJCS8qCisJCSAqIEludGVycnVwdCByZXF1ZXN0PworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2ZhcyArIChSRUdfU1RBVCA8PCBFRVNPWF9GQVMyMTZfU0hJRlQpKTsKKwkJaWYgKHN0YXR1cyAmIFNUQVRfSU5UKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRE1BIHJlcXVlc3QgYWN0aXZlPworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2RtYXN0YXQpOworCQlpZiAoIShzdGF0dXMgJiBFRVNPWF9TVEFUX0RNQSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIGluIEZJRk8KKwkJICovCisJCXN0YXR1cyA9IHJlYWRiKHJlZ19mYXMgKyAoUkVHX0NGSVMgPDwgRUVTT1hfRkFTMjE2X1NISUZUKSkgJiBDRklTX0NGOworCQlpZiAoc3RhdHVzID4gMTYpCisJCQlzdGF0dXMgPSAxNjsKKwkJaWYgKHN0YXR1cyA+IGxlbmd0aCkKKwkJCXN0YXR1cyA9IGxlbmd0aDsKKworCQkvKgorCQkgKiBBbGlnbiBidWZmZXIuCisJCSAqLworCQlpZiAoKCh1MzIpYnVmKSAmIDIgJiYgc3RhdHVzID49IDIpIHsKKwkJCSoodTE2ICopYnVmID0gcmVhZGwocmVnX2RtYWRhdGEpOworCQkJYnVmICs9IDI7CisJCQlzdGF0dXMgLT0gMjsKKwkJCWxlbmd0aCAtPSAyOworCQl9CisKKwkJaWYgKHN0YXR1cyA+PSA4KSB7CisJCQl1bnNpZ25lZCBsb25nIGwxLCBsMjsKKworCQkJbDEgPSByZWFkbChyZWdfZG1hZGF0YSkgJiBtYXNrOworCQkJbDEgfD0gcmVhZGwocmVnX2RtYWRhdGEpIDw8IDE2OworCQkJbDIgPSByZWFkbChyZWdfZG1hZGF0YSkgJiBtYXNrOworCQkJbDIgfD0gcmVhZGwocmVnX2RtYWRhdGEpIDw8IDE2OworCQkJKih1MzIgKilidWYgPSBsMTsKKwkJCWJ1ZiArPSA0OworCQkJKih1MzIgKilidWYgPSBsMjsKKwkJCWJ1ZiArPSA0OworCQkJbGVuZ3RoIC09IDg7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdGF0dXMgPj0gNCkgeworCQkJdW5zaWduZWQgbG9uZyBsMTsKKworCQkJbDEgPSByZWFkbChyZWdfZG1hZGF0YSkgJiBtYXNrOworCQkJbDEgfD0gcmVhZGwocmVnX2RtYWRhdGEpIDw8IDE2OworCisJCQkqKHUzMiAqKWJ1ZiA9IGwxOworCQkJYnVmICs9IDQ7CisJCQlsZW5ndGggLT0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0YXR1cyA+PSAyKSB7CisJCQkqKHUxNiAqKWJ1ZiA9IHJlYWRsKHJlZ19kbWFkYXRhKTsKKwkJCWJ1ZiArPSAyOworCQkJbGVuZ3RoIC09IDI7CisJCX0KKwl9IHdoaWxlIChsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBlZXNveHNjc2lfYnVmZmVyX291dCh2b2lkICpidWYsIGludCBsZW5ndGgsIHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwljb25zdCB2b2lkIF9faW9tZW0gKnJlZ19mYXMgPSBiYXNlICsgRUVTT1hfRkFTMjE2X09GRlNFVDsKKwljb25zdCB2b2lkIF9faW9tZW0gKnJlZ19kbWFzdGF0ID0gYmFzZSArIEVFU09YX0RNQVNUQVQ7CisJY29uc3Qgdm9pZCBfX2lvbWVtICpyZWdfZG1hZGF0YSA9IGJhc2UgKyBFRVNPWF9ETUFEQVRBOworCisJZG8geworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJCS8qCisJCSAqIEludGVycnVwdCByZXF1ZXN0PworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2ZhcyArIChSRUdfU1RBVCA8PCBFRVNPWF9GQVMyMTZfU0hJRlQpKTsKKwkJaWYgKHN0YXR1cyAmIFNUQVRfSU5UKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRE1BIHJlcXVlc3QgYWN0aXZlPworCQkgKi8KKwkJc3RhdHVzID0gcmVhZGIocmVnX2RtYXN0YXQpOworCQlpZiAoIShzdGF0dXMgJiBFRVNPWF9TVEFUX0RNQSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIGluIEZJRk8KKwkJICovCisJCXN0YXR1cyA9IHJlYWRiKHJlZ19mYXMgKyAoUkVHX0NGSVMgPDwgRUVTT1hfRkFTMjE2X1NISUZUKSkgJiBDRklTX0NGOworCQlpZiAoc3RhdHVzID4gMTYpCisJCQlzdGF0dXMgPSAxNjsKKwkJc3RhdHVzID0gMTYgLSBzdGF0dXM7CisJCWlmIChzdGF0dXMgPiBsZW5ndGgpCisJCQlzdGF0dXMgPSBsZW5ndGg7CisJCXN0YXR1cyAmPSB+MTsKKworCQkvKgorCQkgKiBBbGlnbiBidWZmZXIuCisJCSAqLworCQlpZiAoKCh1MzIpYnVmKSAmIDIgJiYgc3RhdHVzID49IDIpIHsKKwkJCXdyaXRlbCgqKHUxNiAqKWJ1ZiA8PCAxNiwgcmVnX2RtYWRhdGEpOworCQkJYnVmICs9IDI7CisJCQlzdGF0dXMgLT0gMjsKKwkJCWxlbmd0aCAtPSAyOworCQl9CisKKwkJaWYgKHN0YXR1cyA+PSA4KSB7CisJCQl1bnNpZ25lZCBsb25nIGwxLCBsMjsKKworCQkJbDEgPSAqKHUzMiAqKWJ1ZjsKKwkJCWJ1ZiArPSA0OworCQkJbDIgPSAqKHUzMiAqKWJ1ZjsKKwkJCWJ1ZiArPSA0OworCisJCQl3cml0ZWwobDEgPDwgMTYsIHJlZ19kbWFkYXRhKTsKKwkJCXdyaXRlbChsMSwgcmVnX2RtYWRhdGEpOworCQkJd3JpdGVsKGwyIDw8IDE2LCByZWdfZG1hZGF0YSk7CisJCQl3cml0ZWwobDIsIHJlZ19kbWFkYXRhKTsKKwkJCWxlbmd0aCAtPSA4OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhdHVzID49IDQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbDE7CisKKwkJCWwxID0gKih1MzIgKilidWY7CisJCQlidWYgKz0gNDsKKworCQkJd3JpdGVsKGwxIDw8IDE2LCByZWdfZG1hZGF0YSk7CisJCQl3cml0ZWwobDEsIHJlZ19kbWFkYXRhKTsKKwkJCWxlbmd0aCAtPSA0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhdHVzID49IDIpIHsKKwkJCXdyaXRlbCgqKHUxNiAqKWJ1ZiA8PCAxNiwgcmVnX2RtYWRhdGEpOworCQkJYnVmICs9IDI7CisJCQlsZW5ndGggLT0gMjsKKwkJfQorCX0gd2hpbGUgKGxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfZG1hX3BzZXVkbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX1BvaW50ZXIgKlNDcCwKKwkJICAgICBmYXNkbWFkaXJfdCBkaXIsIGludCB0cmFuc2Zlcl9zaXplKQoreworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoZGlyID09IERNQV9JTikgeworCQllZXNveHNjc2lfYnVmZmVyX2luKFNDcC0+cHRyLCBTQ3AtPnRoaXNfcmVzaWR1YWwsIGluZm8tPmJhc2UpOworCX0gZWxzZSB7CisJCWVlc294c2NzaV9idWZmZXJfb3V0KFNDcC0+cHRyLCBTQ3AtPnRoaXNfcmVzaWR1YWwsIGluZm8tPmJhc2UpOworCX0KK30KKworLyogUHJvdG90eXBlOiBpbnQgZWVzb3hzY3NpX2RtYV9zdG9wKGhvc3QsIFNDcG50KQorICogUHVycG9zZSAgOiBzdG9wcyBETUEvUElPCisgKiBQYXJhbXMgICA6IGhvc3QgIC0gaG9zdAorICoJICAgICAgU0NwbnQgLSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitlZXNveHNjc2lfZG1hX3N0b3Aoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3ApCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkKKwkJZGlzYWJsZV9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSk7Cit9CisKKy8qIFByb3RvdHlwZTogY29uc3QgY2hhciAqZWVzb3hzY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIGhvc3QpCisgKiBQdXJwb3NlICA6IHJldHVybnMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgYWJvdXQgdGhpcyBpbnRlcmZhY2UsCisgKiBQYXJhbXMgICA6IGhvc3QgLSBkcml2ZXIgaG9zdCBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm8gZm9yLgorICogUmV0dXJucyAgOiBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciBjb250YWluaW5nIG51bGwgdGVybWluYXRlZCBzdHJpbmcuCisgKi8KK2NvbnN0IGNoYXIgKmVlc294c2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXN0YXRpYyBjaGFyIHN0cmluZ1sxNTBdOworCisJc3ByaW50ZihzdHJpbmcsICIlcyAoJXMpIGluIHNsb3QgJWQgdiVzIHRlcm1pbmF0b3JzIG8lcyIsCisJCWhvc3QtPmhvc3R0LT5uYW1lLCBpbmZvLT5pbmZvLnNjc2kudHlwZSwgaW5mby0+ZWMtPnNsb3Rfbm8sCisJCVZFUlNJT04sIGluZm8tPmNvbnRyb2wgJiBFRVNPWF9URVJNX0VOQUJMRSA/ICJuIiA6ICJmZiIpOworCisJcmV0dXJuIHN0cmluZzsKK30KKworLyogUHJvdG90eXBlOiBpbnQgZWVzb3hzY3NpX3NldF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorICogUHVycG9zZSAgOiBTZXQgYSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb24KKyAqIFBhcmFtcyAgIDogaG9zdCAgIC0gaG9zdCB0byBzZXR1cAorICogICAgICAgICAgOiBidWZmZXIgLSBidWZmZXIgY29udGFpbmluZyBzdHJpbmcgZGVzY3JpYmluZyBvcGVyYXRpb24KKyAqICAgICAgICAgIDogbGVuZ3RoIC0gbGVuZ3RoIG9mIHN0cmluZworICogUmV0dXJucyAgOiAtRUlOVkFMLCBvciAwCisgKi8KK3N0YXRpYyBpbnQKK2Vlc294c2NzaV9zZXRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0ID0gbGVuZ3RoOworCisJaWYgKGxlbmd0aCA+PSA5ICYmIHN0cm5jbXAoYnVmZmVyLCAiRUVTT1hTQ1NJIiwgOSkgPT0gMCkgeworCQlidWZmZXIgKz0gOTsKKwkJbGVuZ3RoIC09IDk7CisKKwkJaWYgKGxlbmd0aCA+PSA1ICYmIHN0cm5jbXAoYnVmZmVyLCAidGVybT0iLCA1KSA9PSAwKSB7CisJCQlpZiAoYnVmZmVyWzVdID09ICcxJykKKwkJCQllZXNveHNjc2lfdGVybWluYXRvcl9jdGwoaG9zdCwgMSk7CisJCQllbHNlIGlmIChidWZmZXJbNV0gPT0gJzAnKQorCQkJCWVlc294c2NzaV90ZXJtaW5hdG9yX2N0bChob3N0LCAwKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlCisJCXJldCA9IC1FSU5WQUw7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBQcm90b3R5cGU6IGludCBlZXNveHNjc2lfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisgKgkJCQkgICAgICBpbnQgbGVuZ3RoLCBpbnQgaG9zdF9ubywgaW50IGlub3V0KQorICogUHVycG9zZSAgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICogUGFyYW1zICAgOiBidWZmZXIgLSBhIGJ1ZmZlciB0byB3cml0ZSBpbmZvcm1hdGlvbiB0bworICoJICAgICAgc3RhcnQgIC0gYSBwb2ludGVyIGludG8gdGhpcyBidWZmZXIgc2V0IGJ5IHRoaXMgcm91dGluZSB0byB0aGUgc3RhcnQKKyAqCQkgICAgICAgb2YgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLgorICoJICAgICAgb2Zmc2V0IC0gb2Zmc2V0IGludG8gaW5mb3JtYXRpb24gdGhhdCB3ZSBoYXZlIHJlYWQgdXB0by4KKyAqCSAgICAgIGxlbmd0aCAtIGxlbmd0aCBvZiBidWZmZXIKKyAqCSAgICAgIGhvc3Rfbm8gLSBob3N0IG51bWJlciB0byByZXR1cm4gaW5mb3JtYXRpb24gZm9yCisgKgkgICAgICBpbm91dCAgLSAwIGZvciByZWFkaW5nLCAxIGZvciB3cml0aW5nLgorICogUmV0dXJucyAgOiBsZW5ndGggb2YgZGF0YSB3cml0dGVuIHRvIGJ1ZmZlci4KKyAqLworaW50IGVlc294c2NzaV9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvOworCWNoYXIgKnAgPSBidWZmZXI7CisJaW50IHBvczsKKworCWlmIChpbm91dCA9PSAxKQorCQlyZXR1cm4gZWVzb3hzY3NpX3NldF9wcm9jX2luZm8oaG9zdCwgYnVmZmVyLCBsZW5ndGgpOworCisJaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCXAgKz0gc3ByaW50ZihwLCAiRUVTT1ggU0NTSSBkcml2ZXIgdiVzXG4iLCBWRVJTSU9OKTsKKwlwICs9IGZhczIxNl9wcmludF9ob3N0KCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IHNwcmludGYocCwgIlRlcm0gICAgOiBvJXNcbiIsCisJCQlpbmZvLT5jb250cm9sICYgRUVTT1hfVEVSTV9FTkFCTEUgPyAibiIgOiAiZmYiKTsKKworCXAgKz0gZmFzMjE2X3ByaW50X3N0YXRzKCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IGZhczIxNl9wcmludF9kZXZpY2VzKCZpbmZvLT5pbmZvLCBwKTsKKworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKwlwb3MgPSBwIC0gYnVmZmVyIC0gb2Zmc2V0OworCWlmIChwb3MgPiBsZW5ndGgpCisJCXBvcyA9IGxlbmd0aDsKKworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVlc294c2NzaV9zaG93X3Rlcm0oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZm8tPmNvbnRyb2wgJiBFRVNPWF9URVJNX0VOQUJMRSA/IDEgOiAwKTsKK30KKworc3RhdGljIHNzaXplX3QgZWVzb3hzY3NpX3N0b3JlX3Rlcm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IGVlc294c2NzaV9pbmZvICppbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGVuID4gMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGJ1ZlswXSAhPSAnMCcpIHsKKwkJCWluZm8tPmNvbnRyb2wgfD0gRUVTT1hfVEVSTV9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5jb250cm9sICY9IH5FRVNPWF9URVJNX0VOQUJMRTsKKwkJfQorCQl3cml0ZWIoaW5mby0+Y29udHJvbCwgaW5mby0+Y3RsX3BvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihidXNfdGVybSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGVlc294c2NzaV9zaG93X3Rlcm0sIGVlc294c2NzaV9zdG9yZV90ZXJtKTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBlZXNveF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJCT0gZWVzb3hzY3NpX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJFRVNPWCBTQ1NJIiwKKwkuaW5mbwkJCQk9IGVlc294c2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IGZhczIxNl9xdWV1ZV9jb21tYW5kLAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2hvc3RfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gZmFzMjE2X2VoX2RldmljZV9yZXNldCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYWJvcnQsCisJLmNhbl9xdWV1ZQkJCT0gMSwKKwkudGhpc19pZAkJCT0gNywKKwkuc2dfdGFibGVzaXplCQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCQk9ICJlZXNveCIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZWVzb3hzY3NpX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKmluZm87CisJdW5zaWduZWQgbG9uZyByZXNiYXNlLCByZXNsZW47CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByZXQ7CisKKwlyZXQgPSBlY2FyZF9yZXF1ZXN0X3Jlc291cmNlcyhlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXNiYXNlID0gZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwlyZXNsZW4gPSBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwliYXNlID0gaW9yZW1hcChyZXNiYXNlLCByZXNsZW4pOworCWlmICghYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZWVzb3hfdGVtcGxhdGUsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBlZXNveHNjc2lfaW5mbykpOworCWlmICghaG9zdCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgaG9zdCk7CisKKwlpbmZvID0gKHN0cnVjdCBlZXNveHNjc2lfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWluZm8tPmVjCT0gZWM7CisJaW5mby0+YmFzZQk9IGJhc2U7CisJaW5mby0+Y3RsX3BvcnQJPSBiYXNlICsgRUVTT1hfQ09OVFJPTDsKKwlpbmZvLT5jb250cm9sCT0gdGVybVtlYy0+c2xvdF9ub10gPyBFRVNPWF9URVJNX0VOQUJMRSA6IDA7CisJd3JpdGViKGluZm8tPmNvbnRyb2wsIGluZm8tPmN0bF9wb3J0KTsKKworCWluZm8tPmluZm8uc2NzaS5pb19iYXNlCQk9IGJhc2UgKyBFRVNPWF9GQVMyMTZfT0ZGU0VUOworCWluZm8tPmluZm8uc2NzaS5pb19zaGlmdAk9IEVFU09YX0ZBUzIxNl9TSElGVDsKKwlpbmZvLT5pbmZvLnNjc2kuaXJxCQk9IGVjLT5pcnE7CisJaW5mby0+aW5mby5zY3NpLmRtYQkJPSBlYy0+ZG1hOworCWluZm8tPmluZm8uaWZjZmcuY2xvY2tyYXRlCT0gNDA7IC8qIE1IeiAqLworCWluZm8tPmluZm8uaWZjZmcuc2VsZWN0X3RpbWVvdXQJPSAyNTU7CisJaW5mby0+aW5mby5pZmNmZy5hc3luY3BlcmlvZAk9IDIwMDsgLyogbnMgKi8KKwlpbmZvLT5pbmZvLmlmY2ZnLnN5bmNfbWF4X2RlcHRoCT0gNzsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNudGwzCQk9IENOVEwzX0ZBU1RTQ1NJIHwgQ05UTDNfRkFTVENMSzsKKwlpbmZvLT5pbmZvLmlmY2ZnLmRpc2Nvbm5lY3Rfb2sJPSAxOworCWluZm8tPmluZm8uaWZjZmcud2lkZV9tYXhfc2l6ZQk9IDA7CisJaW5mby0+aW5mby5pZmNmZy5jYXBhYmlsaXRpZXMJPSBGQVNDQVBfUFNFVURPRE1BOworCWluZm8tPmluZm8uZG1hLnNldHVwCQk9IGVlc294c2NzaV9kbWFfc2V0dXA7CisJaW5mby0+aW5mby5kbWEucHNldWRvCQk9IGVlc294c2NzaV9kbWFfcHNldWRvOworCWluZm8tPmluZm8uZG1hLnN0b3AJCT0gZWVzb3hzY3NpX2RtYV9zdG9wOworCisJZWMtPmlycWFkZHIJPSBiYXNlICsgRUVTT1hfRE1BU1RBVDsKKwllYy0+aXJxbWFzawk9IEVFU09YX1NUQVRfSU5UUjsKKwllYy0+aXJxX2RhdGEJPSBpbmZvOworCWVjLT5vcHMJCT0gJmVlc294c2NzaV9vcHM7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmVjLT5kZXYsICZkZXZfYXR0cl9idXNfdGVybSk7CisKKwlyZXQgPSBmYXMyMTZfaW5pdChob3N0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZWMtPmlycSwgZWVzb3hzY3NpX2ludHIsIDAsICJlZXNveHNjc2kiLCBpbmZvKTsKKwlpZiAocmV0KSB7CisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZTogJWRcbiIsCisJCSAgICAgICBob3N0LT5ob3N0X25vLCBlYy0+aXJxLCByZXQpOworCQlnb3RvIG91dF9yZW1vdmU7CisJfQorCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKSB7CisJCWlmIChyZXF1ZXN0X2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hLCAiZWVzb3giKSkgeworCQkJcHJpbnRrKCJzY3NpJWQ6IERNQSVkIG5vdCBmcmVlLCBETUEgZGlzYWJsZWRcbiIsCisJCQkgICAgICAgaG9zdC0+aG9zdF9ubywgaW5mby0+aW5mby5zY3NpLmRtYSk7CisJCQlpbmZvLT5pbmZvLnNjc2kuZG1hID0gTk9fRE1BOworCQl9IGVsc2UgeworCQkJc2V0X2RtYV9zcGVlZChpbmZvLT5pbmZvLnNjc2kuZG1hLCAxODApOworCQkJaW5mby0+aW5mby5pZmNmZy5jYXBhYmlsaXRpZXMgfD0gRkFTQ0FQX0RNQTsKKwkJCWluZm8tPmluZm8uaWZjZmcuY250bDMgfD0gQ05UTDNfQlM4OworCQl9CisJfQorCisJcmV0ID0gZmFzMjE2X2FkZChob3N0LCAmZWMtPmRldik7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkKKwkJZnJlZV9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSk7CisJZnJlZV9pcnEoZWMtPmlycSwgaG9zdCk7CisKKyBvdXRfcmVtb3ZlOgorCWZhczIxNl9yZW1vdmUoaG9zdCk7CisKKyBvdXRfZnJlZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmVjLT5kZXYsICZkZXZfYXR0cl9idXNfdGVybSk7CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworIG91dF91bm1hcDoKKwlpb3VubWFwKGJhc2UpOworCisgb3V0X3JlZ2lvbjoKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVlc294c2NzaV9yZW1vdmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCXN0cnVjdCBlZXNveHNjc2lfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWVzb3hzY3NpX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBpbmZvKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmZWMtPmRldiwgJmRldl9hdHRyX2J1c190ZXJtKTsKKworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBlZXNveHNjc2lfY2lkc1tdID0geworCXsgTUFOVV9FRVNPWCwgUFJPRF9FRVNPWF9TQ1NJMiB9LAorCXsgMHhmZmZmLCAweGZmZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfZHJpdmVyIGVlc294c2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGVlc294c2NzaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVlc294c2NzaV9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGVlc294c2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJlZXNveHNjc2kiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlZXNveF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmZWVzb3hzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZXNveF9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmZWVzb3hzY3NpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGVlc294X2luaXQpOworbW9kdWxlX2V4aXQoZWVzb3hfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFRVNPWCAnRmFzdCcgU0NTSSBkcml2ZXIgZm9yIEFjb3JuIG1hY2hpbmVzIik7CitNT0RVTEVfUEFSTSh0ZXJtLCAiMS04aSIpOworTU9EVUxFX1BBUk1fREVTQyh0ZXJtLCAiU0NTSSBidXMgdGVybWluYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vZmFzMjE2LmMgYi9kcml2ZXJzL3Njc2kvYXJtL2ZhczIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTFlODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL2ZhczIxNi5jCkBAIC0wLDAgKzEsMzA0MyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvZmFzMjE2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBCYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBxbG9naWNmYXMuYyBieSBUb20gWmVydWNoYSwgTWljaGFlbCBHcmlmZml0aCwgYW5kCisgKiBvdGhlciBzb3VyY2VzLCBpbmNsdWRpbmc6CisgKiAgIHRoZSBBTUQgQW01M0NGOTQgZGF0YSBzaGVldAorICogICB0aGUgQU1EIEFtNTNDOTQgZGF0YSBzaGVldAorICoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIGRyaXZlci4gIFRvIHVzZSBpdCwgaGF2ZSBhIGxvb2sgYXQgY3VtYW5hXzIuYy4gIFlvdQorICogc2hvdWxkIGRlZmluZSB5b3VyIG93biBzdHJ1Y3R1cmUgdGhhdCBvdmVybGF5cyBGQVMyMTZfSW5mbywgZWc6CisgKiBzdHJ1Y3QgbXlfaG9zdF9kYXRhIHsKKyAqICAgIEZBUzIxNl9JbmZvIGluZm87CisgKiAgICAuLi4gbXkgaG9zdCBzcGVjaWZpYyBkYXRhIC4uLgorICogfTsKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAgMzAtMDgtMTk5NwlSTUsJQ3JlYXRlZAorICogIDE0LTA5LTE5OTcJUk1LCVN0YXJ0ZWQgZGlzY29ubmVjdCBzdXBwb3J0CisgKiAgMDgtMDItMTk5OAlSTUsJQ29ycmVjdGVkIHJlYWwgRE1BIHN1cHBvcnQKKyAqICAxNS0wMi0xOTk4CVJNSwlTdGFydGVkIHN5bmMgeGZlciBzdXBwb3J0CisgKiAgMDYtMDQtMTk5OAlSTUsJVGlnaHRlbmVkIGNvbmRpdGlvbnMgZm9yIHByaW50aW5nIGluY29tcGxldGUKKyAqCQkJdHJhbnNmZXJzCisgKiAgMDItMDUtMTk5OAlSTUsJQWRkZWQgZXh0cmEgY2hlY2tzIGluIGZhczIxNl9yZXNldAorICogIDI0LTA1LTE5OTgJUk1LCUZpeGVkIHN5bmNocm9ub3VzIHRyYW5zZmVycyB3aXRoIHBlcmlvZCA+PSAyMDBucworICogIDI3LTA2LTE5OTgJUk1LCUNoYW5nZWQgYXNtL2RlbGF5LmggdG8gbGludXgvZGVsYXkuaAorICogIDI2LTA4LTE5OTgJUk1LCUltcHJvdmVkIG1lc3NhZ2Ugc3VwcG9ydCB3cnQgTUVTU0FHRV9SRUpFQ1QKKyAqICAwMi0wNC0yMDAwCVJNSwlDb252ZXJ0ZWQgdG8gdXNlIHRoZSBuZXcgZXJyb3IgaGFuZGxpbmcsIGFuZAorICoJCQlhdXRvbWF0aWNhbGx5IHJlcXVlc3Qgc2Vuc2UgZGF0YSB1cG9uIGNoZWNrCisgKgkJCWNvbmRpdGlvbiBzdGF0dXMgZnJvbSB0YXJnZXRzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorCisjaW5jbHVkZSAiLi4vc2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiZmFzMjE2LmgiCisjaW5jbHVkZSAic2NzaS5oIgorCisvKiBOT1RFOiBTQ1NJMiBTeW5jaHJvbm91cyB0cmFuc2ZlcnMgKnJlcXVpcmUqIERNQSBhY2NvcmRpbmcgdG8KKyAqICB0aGUgZGF0YSBzaGVldC4gIFRoaXMgcmVzdHJpY3Rpb24gaXMgY3JhenksIGVzcGVjaWFsbHkgd2hlbgorICogIHlvdSBvbmx5IHdhbnQgdG8gc2VuZCAxNiBieXRlcyEgIFdoYXQgd2VyZSB0aGUgZ3V5cyB3aG8KKyAqICBkZXNpZ25lZCB0aGlzIGNoaXAgb24gYXQgdGhhdCB0aW1lPyAgRGlkIHRoZXkgcmVhZCB0aGUgU0NTSTIKKyAqICBzcGVjIGF0IGFsbD8gIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIHRha2VuIGZyb20gdGhlIFNDU0kyCisgKiAgc3RhbmRhcmQgKHMycjEwKSBjb25jZXJuaW5nIHRoaXM6CisgKgorICogPiBJTVBMRU1FTlRPUlMgTk9URVM6CisgKiA+ICAgKDEpICBSZS1uZWdvdGlhdGlvbiBhdCBldmVyeSBzZWxlY3Rpb24gaXMgbm90IHJlY29tbWVuZGVkLCBzaW5jZSBhCisgKiA+ICAgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IGlzIGxpa2VseS4KKyAqCisgKiA+ICBUaGUgaW1wbGllZCBzeW5jaHJvbm91cyBhZ3JlZW1lbnQgc2hhbGwgcmVtYWluIGluIGVmZmVjdCB1bnRpbCBhIEJVUyBERVZJQ0UKKyAqID4gIFJFU0VUIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIHVudGlsIGEgaGFyZCByZXNldCBjb25kaXRpb24gb2NjdXJzLCBvciB1bnRpbCBvbmUKKyAqID4gIG9mIHRoZSB0d28gU0NTSSBkZXZpY2VzIGVsZWN0cyB0byBtb2RpZnkgdGhlIGFncmVlbWVudC4gIFRoZSBkZWZhdWx0IGRhdGEKKyAqID4gIHRyYW5zZmVyIG1vZGUgaXMgYXN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgbW9kZS4gIFRoZSBkZWZhdWx0IGRhdGEgdHJhbnNmZXIKKyAqID4gIG1vZGUgaXMgZW50ZXJlZCBhdCBwb3dlciBvbiwgYWZ0ZXIgYSBCVVMgREVWSUNFIFJFU0VUIG1lc3NhZ2UsIG9yIGFmdGVyIGEgaGFyZAorICogPiAgcmVzZXQgY29uZGl0aW9uLgorICoKKyAqICBJbiB0b3RhbCwgdGhpcyBtZWFucyB0aGF0IG9uY2UgeW91IGhhdmUgZWxlY3RlZCB0byB1c2Ugc3luY2hyb25vdXMKKyAqICB0cmFuc2ZlcnMsIHlvdSBtdXN0IGFsd2F5cyB1c2UgRE1BLgorICoKKyAqICBJIHdhcyB0aGlua2luZyB0aGF0IHRoaXMgd2FzIGEgZ29vZCBjaGlwIHVudGlsIEkgZm91bmQgdGhpcyByZXN0cmljdGlvbiA7KAorICovCisjZGVmaW5lIFNDU0kyX1NZTkMKKyN1bmRlZiAgU0NTSTJfVEFHCisKKyN1bmRlZiBERUJVR19DT05ORUNUCisjdW5kZWYgREVCVUdfTUVTU0FHRVMKKworI3VuZGVmIENIRUNLX1NUUlVDVFVSRQorCisjZGVmaW5lIExPR19DT05ORUNUCQkoMSA8PCAwKQorI2RlZmluZSBMT0dfQlVTU0VSVklDRQkJKDEgPDwgMSkKKyNkZWZpbmUgTE9HX0ZVTkNUSU9ORE9ORQkoMSA8PCAyKQorI2RlZmluZSBMT0dfTUVTU0FHRVMJCSgxIDw8IDMpCisjZGVmaW5lIExPR19CVUZGRVIJCSgxIDw8IDQpCisjZGVmaW5lIExPR19FUlJPUgkJKDEgPDwgOCkKKworc3RhdGljIGludCBsZXZlbF9tYXNrID0gTE9HX0VSUk9SOworCittb2R1bGVfcGFyYW0obGV2ZWxfbWFzaywgaW50LCAwNjQ0KTsKKworc3RhdGljIGludCBfX2luaXQgZmFzMjE2X2xvZ19zZXR1cChjaGFyICpzdHIpCit7CisJY2hhciAqczsKKworCWxldmVsX21hc2sgPSAwOworCisJd2hpbGUgKChzID0gc3Ryc2VwKCZzdHIsICIsIikpICE9IE5VTEwpIHsKKwkJc3dpdGNoIChzWzBdKSB7CisJCWNhc2UgJ2EnOgorCQkJaWYgKHN0cmNtcChzLCAiYWxsIikgPT0gMCkKKwkJCQlsZXZlbF9tYXNrIHw9IC0xOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJaWYgKHN0cm5jbXAocywgImJ1cyIsIDMpID09IDApCisJCQkJbGV2ZWxfbWFzayB8PSBMT0dfQlVTU0VSVklDRTsKKwkJCWlmIChzdHJuY21wKHMsICJidWYiLCAzKSA9PSAwKQorCQkJCWxldmVsX21hc2sgfD0gTE9HX0JVRkZFUjsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWxldmVsX21hc2sgfD0gTE9HX0NPTk5FQ1Q7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlsZXZlbF9tYXNrIHw9IExPR19FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWxldmVsX21hc2sgfD0gTE9HX01FU1NBR0VTOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJaWYgKHN0cmNtcChzLCAibm9uZSIpID09IDApCisJCQkJbGV2ZWxfbWFzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlsZXZlbF9tYXNrIHw9IExPR19GVU5DVElPTkRPTkU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZmFzMjE2X2xvZ2dpbmc9IiwgZmFzMjE2X2xvZ19zZXR1cCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBmYXMyMTZfcmVhZGIoRkFTMjE2X0luZm8gKmluZm8sIHVuc2lnbmVkIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IG9mZiA9IHJlZyA8PCBpbmZvLT5zY3NpLmlvX3NoaWZ0OworCXJldHVybiByZWFkYihpbmZvLT5zY3NpLmlvX2Jhc2UgKyBvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmFzMjE2X3dyaXRlYihGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgb2ZmID0gcmVnIDw8IGluZm8tPnNjc2kuaW9fc2hpZnQ7CisJd3JpdGViKHZhbCwgaW5mby0+c2NzaS5pb19iYXNlICsgb2ZmKTsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X2R1bXBzdGF0ZShGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIGlzLCBzdGF0LCBpbnN0OworCisJaXMgICA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfSVMpOworCXN0YXQgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX1NUQVQpOworCWluc3QgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lOU1QpOworCQorCXByaW50aygiRkFTMjE2OiBDVENMPSUwMlggQ1RDTT0lMDJYIENNRD0lMDJYIFNUQVQ9JTAyWCIKKwkgICAgICAgIiBJTlNUPSUwMlggSVM9JTAyWCBDRklTPSUwMlgiLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ0wpLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ00pLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NNRCksICBzdGF0LCBpbnN0LCBpcywKKwkJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DRklTKSk7CisJcHJpbnRrKCIgQ05UTDE9JTAyWCBDTlRMMj0lMDJYIENOVEwzPSUwMlggQ1RDSD0lMDJYXG4iLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NOVEwxKSwKKwkJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DTlRMMiksCisJCWZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ05UTDMpLAorCQlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ0gpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfU0NwKFNjc2lfUG9pbnRlciAqU0NwLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKK3sKKwlwcmludGsoIiVzcHRyICVwIHRoaXNfcmVzaWR1YWwgMHgleCBidWZmZXIgJXAgYnVmZmVyc19yZXNpZHVhbCAweCV4JXMiLAorCQlwcmVmaXgsIFNDcC0+cHRyLCBTQ3AtPnRoaXNfcmVzaWR1YWwsIFNDcC0+YnVmZmVyLAorCQlTQ3AtPmJ1ZmZlcnNfcmVzaWR1YWwsIHN1ZmZpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGZhczIxNl9kdW1waW5mbyhGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlzdGF0aWMgaW50IHVzZWQgPSAwOworCWludCBpOworCisJaWYgKHVzZWQrKykKKwkJcmV0dXJuOworCisJcHJpbnRrKCJGQVMyMTZfSW5mbz1cbiIpOworCXByaW50aygiICB7IG1hZ2ljX3N0YXJ0PSVsWCBob3N0PSVwIFNDcG50PSVwIG9yaWdTQ3BudD0lcFxuIiwKKwkJaW5mby0+bWFnaWNfc3RhcnQsIGluZm8tPmhvc3QsIGluZm8tPlNDcG50LAorCQlpbmZvLT5vcmlnU0NwbnQpOworCXByaW50aygiICAgIHNjc2k9eyBpb19zaGlmdD0lWCBpcnE9JVggY2ZnPXsgJVggJVggJVggJVggfVxuIiwKKwkJaW5mby0+c2NzaS5pb19zaGlmdCwgaW5mby0+c2NzaS5pcnEsCisJCWluZm8tPnNjc2kuY2ZnWzBdLCBpbmZvLT5zY3NpLmNmZ1sxXSwgaW5mby0+c2NzaS5jZmdbMl0sCisJCWluZm8tPnNjc2kuY2ZnWzNdKTsKKwlwcmludGsoIiAgICAgICAgICAgdHlwZT0lcCBwaGFzZT0lWFxuIiwKKwkJaW5mby0+c2NzaS50eXBlLCBpbmZvLT5zY3NpLnBoYXNlKTsKKwlwcmludF9TQ3AoJmluZm8tPnNjc2kuU0NwLCAiICAgICAgICAgICBTQ3A9eyAiLCAiIH1cbiIpOworCXByaW50aygiICAgICAgbXNncyBhc3luY19zdHA9JVggZGlzY29ubmVjdGFibGU9JWQgYWJvcnRpbmc9JWQgfVxuIiwKKwkJaW5mby0+c2NzaS5hc3luY19zdHAsCisJCWluZm8tPnNjc2kuZGlzY29ubmVjdGFibGUsIGluZm8tPnNjc2kuYWJvcnRpbmcpOworCXByaW50aygiICAgIHN0YXRzPXsgcXVldWVzPSVYIHJlbW92ZXM9JVggZmlucz0lWCByZWFkcz0lWCB3cml0ZXM9JVggbWlzY3M9JVhcbiIKKwkgICAgICAgIiAgICAgICAgICAgIGRpc2Nvbm5lY3RzPSVYIGFib3J0cz0lWCBidXNfcmVzZXRzPSVYIGhvc3RfcmVzZXRzPSVYfVxuIiwKKwkJaW5mby0+c3RhdHMucXVldWVzLCBpbmZvLT5zdGF0cy5yZW1vdmVzLCBpbmZvLT5zdGF0cy5maW5zLAorCQlpbmZvLT5zdGF0cy5yZWFkcywgaW5mby0+c3RhdHMud3JpdGVzLCBpbmZvLT5zdGF0cy5taXNjcywKKwkJaW5mby0+c3RhdHMuZGlzY29ubmVjdHMsIGluZm8tPnN0YXRzLmFib3J0cywgaW5mby0+c3RhdHMuYnVzX3Jlc2V0cywKKwkJaW5mby0+c3RhdHMuaG9zdF9yZXNldHMpOworCXByaW50aygiICAgIGlmY2ZnPXsgY2xvY2tyYXRlPSVYIHNlbGVjdF90aW1lb3V0PSVYIGFzeW5jcGVyaW9kPSVYIHN5bmNfbWF4X2RlcHRoPSVYIH1cbiIsCisJCWluZm8tPmlmY2ZnLmNsb2NrcmF0ZSwgaW5mby0+aWZjZmcuc2VsZWN0X3RpbWVvdXQsCisJCWluZm8tPmlmY2ZnLmFzeW5jcGVyaW9kLCBpbmZvLT5pZmNmZy5zeW5jX21heF9kZXB0aCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwcmludGsoIiAgICBidXN5bHVuc1slZF09JTA4bHggZGV2WyVkXT17IGRpc2Nvbm5lY3Rfb2s9JWQgc3RwPSVYIHNvZj0lWCBzeW5jX3N0YXRlPSVYIH1cbiIsCisJCQlpLCBpbmZvLT5idXN5bHVuc1tpXSwgaSwKKwkJCWluZm8tPmRldmljZVtpXS5kaXNjb25uZWN0X29rLCBpbmZvLT5kZXZpY2VbaV0uc3RwLAorCQkJaW5mby0+ZGV2aWNlW2ldLnNvZiwgaW5mby0+ZGV2aWNlW2ldLnN5bmNfc3RhdGUpOworCX0KKwlwcmludGsoIiAgICBkbWE9eyB0cmFuc2Zlcl90eXBlPSVYIHNldHVwPSVwIHBzZXVkbz0lcCBzdG9wPSVwIH1cbiIsCisJCWluZm8tPmRtYS50cmFuc2Zlcl90eXBlLCBpbmZvLT5kbWEuc2V0dXAsCisJCWluZm8tPmRtYS5wc2V1ZG8sIGluZm8tPmRtYS5zdG9wKTsKKwlwcmludGsoIiAgICBpbnRlcm5hbF9kb25lPSVYIG1hZ2ljX2VuZD0lbFggfVxuIiwKKwkJaW5mby0+aW50ZXJuYWxfZG9uZSwgaW5mby0+bWFnaWNfZW5kKTsKK30KKworI2lmZGVmIENIRUNLX1NUUlVDVFVSRQorc3RhdGljIHZvaWQgX19mYXMyMTZfY2hlY2ttYWdpYyhGQVMyMTZfSW5mbyAqaW5mbywgY29uc3QgY2hhciAqZnVuYykKK3sKKwlpbnQgY29ycnVwdGlvbiA9IDA7CisJaWYgKGluZm8tPm1hZ2ljX3N0YXJ0ICE9IE1BR0lDKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkZBUzIxNiBFcnJvcjogbWFnaWMgYXQgc3RhcnQgY29ycnVwdGVkXG4iKTsKKwkJY29ycnVwdGlvbisrOworCX0KKwlpZiAoaW5mby0+bWFnaWNfZW5kICE9IE1BR0lDKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkZBUzIxNiBFcnJvcjogbWFnaWMgYXQgZW5kIGNvcnJ1cHRlZFxuIik7CisJCWNvcnJ1cHRpb24rKzsKKwl9CisJaWYgKGNvcnJ1cHRpb24pIHsKKwkJZmFzMjE2X2R1bXBpbmZvKGluZm8pOworCQlwYW5pYygic2NzaSBtZW1vcnkgc3BhY2UgY29ycnVwdGVkIGluICVzIiwgZnVuYyk7CisJfQorfQorI2RlZmluZSBmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKSBfX2ZhczIxNl9jaGVja21hZ2ljKChpbmZvKSwgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgZmFzMjE2X2NoZWNrbWFnaWMoaW5mbykKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqZmFzMjE2X2J1c19waGFzZShpbnQgc3RhdCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcGhhc2VzW10gPSB7CisJCSJEQVRBIE9VVCIsICJEQVRBIElOIiwKKwkJIkNPTU1BTkQiLCAiU1RBVFVTIiwKKwkJIk1JU0MgT1VUIiwgIk1JU0MgSU4iLAorCQkiTUVTRyBPVVQiLCAiTUVTRyBJTiIKKwl9OworCisJcmV0dXJuIHBoYXNlc1tzdGF0ICYgU1RBVF9CVVNNQVNLXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZhczIxNl9kcnZfcGhhc2UoRkFTMjE2X0luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnBoYXNlc1tdID0geworCQlbUEhBU0VfSURMRV0JCT0gImlkbGUiLAorCQlbUEhBU0VfU0VMRUNUSU9OXQk9ICJzZWxlY3Rpb24iLAorCQlbUEhBU0VfQ09NTUFORF0JCT0gImNvbW1hbmQiLAorCQlbUEhBU0VfREFUQU9VVF0JCT0gImRhdGEgb3V0IiwKKwkJW1BIQVNFX0RBVEFJTl0JCT0gImRhdGEgaW4iLAorCQlbUEhBU0VfTVNHSU5dCQk9ICJtZXNzYWdlIGluIiwKKwkJW1BIQVNFX01TR0lOX0RJU0NPTk5FQ1RdPSAiZGlzY29ubmVjdCIsCisJCVtQSEFTRV9NU0dPVVRfRVhQRUNUXQk9ICJleHBlY3QgbWVzc2FnZSBvdXQiLAorCQlbUEhBU0VfTVNHT1VUXQkJPSAibWVzc2FnZSBvdXQiLAorCQlbUEhBU0VfU1RBVFVTXQkJPSAic3RhdHVzIiwKKwkJW1BIQVNFX0RPTkVdCQk9ICJkb25lIiwKKwl9OworCisJaWYgKGluZm8tPnNjc2kucGhhc2UgPCBBUlJBWV9TSVpFKHBoYXNlcykgJiYKKwkgICAgcGhhc2VzW2luZm8tPnNjc2kucGhhc2VdKQorCQlyZXR1cm4gcGhhc2VzW2luZm8tPnNjc2kucGhhc2VdOworCXJldHVybiAiPz8/IjsKK30KKworc3RhdGljIGNoYXIgZmFzMjE2X3RhcmdldChGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+U0NwbnQpCisJCXJldHVybiAnMCcgKyBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZDsKKwllbHNlCisJCXJldHVybiAnSCc7Cit9CisKK3N0YXRpYyB2b2lkCitmYXMyMTZfZG9fbG9nKEZBUzIxNl9JbmZvICppbmZvLCBjaGFyIHRhcmdldCwgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwlwcmludGsoInNjc2klZC4lYzogJXMiLCBpbmZvLT5ob3N0LT5ob3N0X25vLCB0YXJnZXQsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitmYXMyMTZfbG9nX2NvbW1hbmQoRkFTMjE2X0luZm8gKmluZm8sIGludCBsZXZlbCwgU2NzaV9DbW5kICpTQ3BudCwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJaWYgKGxldmVsICE9IDAgJiYgIShsZXZlbCAmIGxldmVsX21hc2spKQorCQlyZXR1cm47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWZhczIxNl9kb19sb2coaW5mbywgJzAnICsgU0NwbnQtPmRldmljZS0+aWQsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcHJpbnRrKCIgQ0RCOiAiKTsKKwlwcmludF9jb21tYW5kKFNDcG50LT5jbW5kKTsKK30KKworc3RhdGljIHZvaWQKK2ZhczIxNl9sb2dfdGFyZ2V0KEZBUzIxNl9JbmZvICppbmZvLCBpbnQgbGV2ZWwsIGludCB0YXJnZXQsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCWlmIChsZXZlbCAhPSAwICYmICEobGV2ZWwgJiBsZXZlbF9tYXNrKSkKKwkJcmV0dXJuOworCisJaWYgKHRhcmdldCA8IDApCisJCXRhcmdldCA9ICdIJzsKKwllbHNlCisJCXRhcmdldCArPSAnMCc7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWZhczIxNl9kb19sb2coaW5mbywgdGFyZ2V0LCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X2xvZyhGQVMyMTZfSW5mbyAqaW5mbywgaW50IGxldmVsLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAobGV2ZWwgIT0gMCAmJiAhKGxldmVsICYgbGV2ZWxfbWFzaykpCisJCXJldHVybjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJZmFzMjE2X2RvX2xvZyhpbmZvLCBmYXMyMTZfdGFyZ2V0KGluZm8pLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50aygiXG4iKTsKK30KKworI2RlZmluZSBQSF9TSVpFCTMyCisKK3N0YXRpYyBzdHJ1Y3QgeyBpbnQgc3RhdCwgc3NyLCBpc3IsIHBoOyB9IHBoX2xpc3RbUEhfU0laRV07CitzdGF0aWMgaW50IHBoX3B0cjsKKworc3RhdGljIHZvaWQgYWRkX2RlYnVnX2xpc3QoaW50IHN0YXQsIGludCBzc3IsIGludCBpc3IsIGludCBwaCkKK3sKKwlwaF9saXN0W3BoX3B0cl0uc3RhdCA9IHN0YXQ7CisJcGhfbGlzdFtwaF9wdHJdLnNzciA9IHNzcjsKKwlwaF9saXN0W3BoX3B0cl0uaXNyID0gaXNyOworCXBoX2xpc3RbcGhfcHRyXS5waCA9IHBoOworCisJcGhfcHRyID0gKHBoX3B0ciArIDEpICYgKFBIX1NJWkUtMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeyBpbnQgY29tbWFuZDsgdm9pZCAqZnJvbTsgfSBjbWRfbGlzdFs4XTsKK3N0YXRpYyBpbnQgY21kX3B0cjsKKworc3RhdGljIHZvaWQgZmFzMjE2X2NtZChGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNvbW1hbmQpCit7CisJY21kX2xpc3RbY21kX3B0cl0uY29tbWFuZCA9IGNvbW1hbmQ7CisJY21kX2xpc3RbY21kX3B0cl0uZnJvbSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKworCWNtZF9wdHIgPSAoY21kX3B0ciArIDEpICYgNzsKKworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NNRCwgY29tbWFuZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RlYnVnX2xpc3Qodm9pZCkKK3sKKwlpbnQgaTsKKworCWkgPSBwaF9wdHI7CisKKwlwcmludGsoS0VSTl9FUlIgIlNDU0kgSVJRIHRyYWlsXG4iKTsKKwlkbyB7CisJCXByaW50aygiICUwMng6JTAyeDolMDJ4OiUxeCIsCisJCQlwaF9saXN0W2ldLnN0YXQsIHBoX2xpc3RbaV0uc3NyLAorCQkJcGhfbGlzdFtpXS5pc3IsIHBoX2xpc3RbaV0ucGgpOworCQlpID0gKGkgKyAxKSAmIChQSF9TSVpFIC0gMSk7CisJCWlmICgoKGkgXiBwaF9wdHIpICYgNykgPT0gMCkKKwkJCXByaW50aygiXG4iKTsKKwl9IHdoaWxlIChpICE9IHBoX3B0cik7CisJaWYgKChpIF4gcGhfcHRyKSAmIDcpCisJCXByaW50aygiXG4iKTsKKworCWkgPSBjbWRfcHRyOworCXByaW50ayhLRVJOX0VSUiAiRkFTMjE2IGNvbW1hbmRzOiAiKTsKKwlkbyB7CisJCXByaW50aygiJTAyeDolcCAiLCBjbWRfbGlzdFtpXS5jb21tYW5kLCBjbWRfbGlzdFtpXS5mcm9tKTsKKwkJaSA9IChpICsgMSkgJiA3OworCX0gd2hpbGUgKGkgIT0gY21kX3B0cik7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfZG9uZShGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHJlc3VsdCk7CisKKy8qKgorICogZmFzMjE2X2dldF9sYXN0X21zZyAtIHJldHJpdmUgbGFzdCBtZXNzYWdlIGZyb20gdGhlIGxpc3QKKyAqIEBpbmZvOiBpbnRlcmZhY2UgdG8gc2VhcmNoCisgKiBAcG9zOiBjdXJyZW50IGZpZm8gcG9zaXRpb24KKyAqCisgKiBSZXRyaWV2ZSBhIGxhc3QgbWVzc2FnZSBmcm9tIHRoZSBsaXN0LCB1c2luZyBwb3NpdGlvbiBpbiBmaWZvLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0CitmYXMyMTZfZ2V0X2xhc3RfbXNnKEZBUzIxNl9JbmZvICppbmZvLCBpbnQgcG9zKQoreworCXVuc2lnbmVkIHNob3J0IHBhY2tlZF9tc2cgPSBOT1A7CisJc3RydWN0IG1lc3NhZ2UgKm1zZzsKKwlpbnQgbXNnbnIgPSAwOworCisJd2hpbGUgKChtc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgbXNnbnIrKykpICE9IE5VTEwpIHsKKwkJaWYgKHBvcyA+PSBtc2ctPmZpZm8pCisJCQlicmVhazsKKwl9CisKKwlpZiAobXNnKSB7CisJCWlmIChtc2ctPm1zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKQorCQkJcGFja2VkX21zZyA9IEVYVEVOREVEX01FU1NBR0UgfCBtc2ctPm1zZ1syXSA8PCA4OworCQllbHNlCisJCQlwYWNrZWRfbXNnID0gbXNnLT5tc2dbMF07CisJfQorCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfTUVTU0FHRVMsCisJCSJNZXNzYWdlOiAlMDR4IGZvdW5kIGF0IHBvc2l0aW9uICUwMnhcbiIsIHBhY2tlZF9tc2csIHBvcyk7CisKKwlyZXR1cm4gcGFja2VkX21zZzsKK30KKworLyoqCisgKiBmYXMyMTZfc3luY3BlcmlvZCAtIGNhbGN1bGF0ZSBTVFAgcmVnaXN0ZXIgdmFsdWUKKyAqIEBpbmZvOiBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIGludGVyZmFjZSBjb25uZWN0ZWQgdG8gZGV2aWNlCisgKiBAbnM6IHBlcmlvZCBpbiBucyAoYmV0d2VlbiBzdWJzZXF1ZW50IGJ5dGVzKQorICoKKyAqIENhbGN1bGF0ZSB2YWx1ZSB0byBiZSBsb2FkZWQgaW50byB0aGUgU1RQIHJlZ2lzdGVyIGZvciBhIGdpdmVuIHBlcmlvZAorICogaW4gbnMuIFJldHVybnMgYSB2YWx1ZSBzdWl0YWJsZSBmb3IgUkVHX1NUUC4KKyAqLworc3RhdGljIGludCBmYXMyMTZfc3luY3BlcmlvZChGQVMyMTZfSW5mbyAqaW5mbywgaW50IG5zKQoreworCWludCB2YWx1ZSA9IChpbmZvLT5pZmNmZy5jbG9ja3JhdGUgKiBucykgLyAxMDAwOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlpZiAodmFsdWUgPCA0KQorCQl2YWx1ZSA9IDQ7CisJZWxzZSBpZiAodmFsdWUgPiAzNSkKKwkJdmFsdWUgPSAzNTsKKworCXJldHVybiB2YWx1ZSAmIDMxOworfQorCisvKioKKyAqIGZhczIxNl9zZXRfc3luYyAtIHNldHVwIEZBUzIxNiBjaGlwIGZvciBzcGVjaWZpZWQgdHJhbnNmZXIgcGVyaW9kLgorICogQGluZm86IHN0YXRlIHN0cnVjdHVyZSBmb3IgaW50ZXJmYWNlIGNvbm5lY3RlZCB0byBkZXZpY2UKKyAqIEB0YXJnZXQ6IHRhcmdldAorICoKKyAqIENvcnJlY3RseSBzZXR1cCBGQVMyMTYgY2hpcCBmb3Igc3BlY2lmaWVkIHRyYW5zZmVyIHBlcmlvZC4KKyAqIE5vdGVzICAgOiB3ZSBuZWVkIHRvIHN3aXRjaCB0aGUgY2hpcCBvdXQgb2YgRkFTVFNDU0kgbW9kZSBpZiB3ZSBoYXZlCisgKiAgICAgICAgICAgYSB0cmFuc2ZlciBwZXJpb2QgPj0gMjAwbnMgLSBvdGhlcndpc2UgdGhlIGNoaXAgd2lsbCB2aW9sYXRlCisgKiAgICAgICAgICAgdGhlIFNDU0kgdGltaW5ncy4KKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3NldF9zeW5jKEZBUzIxNl9JbmZvICppbmZvLCBpbnQgdGFyZ2V0KQoreworCXVuc2lnbmVkIGludCBjbnRsMzsKKworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NPRiwgaW5mby0+ZGV2aWNlW3RhcmdldF0uc29mKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TVFAsIGluZm8tPmRldmljZVt0YXJnZXRdLnN0cCk7CisKKwljbnRsMyA9IGluZm8tPnNjc2kuY2ZnWzJdOworCWlmIChpbmZvLT5kZXZpY2VbdGFyZ2V0XS5wZXJpb2QgPj0gKDIwMCAvIDQpKQorCQljbnRsMyA9IGNudGwzICYgfkNOVEwzX0ZBU1RTQ1NJOworCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIGNudGwzKTsKK30KKworLyogU3luY2hyb25vdXMgdHJhbnNmZXIgc3VwcG9ydAorICoKKyAqIE5vdGU6IFRoZSBTQ1NJIElJIHIxMCBzcGVjIHNheXMgKDUuNi4xMik6CisgKgorICogICgyKSAgRHVlIHRvIGhpc3RvcmljYWwgcHJvYmxlbXMgd2l0aCBlYXJseSBob3N0IGFkYXB0ZXJzIHRoYXQgY291bGQKKyAqICBub3QgYWNjZXB0IGFuIFNEVFIgbWVzc2FnZSwgc29tZSB0YXJnZXRzIG1heSBub3QgaW5pdGlhdGUgc3luY2hyb25vdXMKKyAqICBuZWdvdGlhdGlvbiBhZnRlciBhIHBvd2VyIGN5Y2xlIGFzIHJlcXVpcmVkIGJ5IHRoaXMgc3RhbmRhcmQuICBIb3N0CisgKiAgYWRhcHRlcnMgdGhhdCBzdXBwb3J0IHN5bmNocm9ub3VzIG1vZGUgbWF5IGF2b2lkIHRoZSBlbnN1aW5nIGZhaWx1cmUKKyAqICBtb2RlcyB3aGVuIHRoZSB0YXJnZXQgaXMgaW5kZXBlbmRlbnRseSBwb3dlciBjeWNsZWQgYnkgaW5pdGlhdGluZyBhCisgKiAgc3luY2hyb25vdXMgbmVnb3RpYXRpb24gb24gZWFjaCBSRVFVRVNUIFNFTlNFIGFuZCBJTlFVSVJZIGNvbW1hbmQuCisgKiAgVGhpcyBhcHByb2FjaCBpbmNyZWFzZXMgdGhlIFNDU0kgYnVzIG92ZXJoZWFkIGFuZCBpcyBub3QgcmVjb21tZW5kZWQKKyAqICBmb3IgbmV3IGltcGxlbWVudGF0aW9ucy4gIFRoZSBjb3JyZWN0IG1ldGhvZCBpcyB0byByZXNwb25kIHRvIGFuCisgKiAgU0RUUiBtZXNzYWdlIHdpdGggYSBNRVNTQUdFIFJFSkVDVCBtZXNzYWdlIGlmIHRoZSBlaXRoZXIgdGhlCisgKiAgaW5pdGlhdG9yIG9yIHRhcmdldCBkZXZpY2VzIGRvZXMgbm90IHN1cHBvcnQgc3luY2hyb25vdXMgdHJhbnNmZXJzCisgKiAgb3IgZG9lcyBub3Qgd2FudCB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycyBhdCB0aGUgdGltZS4KKyAqICBVc2luZyB0aGUgY29ycmVjdCBtZXRob2QgYXNzdXJlcyBjb21wYXRpYmlsaXR5IHdpdGggd2lkZSBkYXRhCisgKiAgdHJhbnNmZXJzIGFuZCBmdXR1cmUgZW5oYW5jZW1lbnRzLgorICoKKyAqIFdlIHdpbGwgYWx3YXlzIGluaXRpYXRlIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24gcmVxdWVzdCBvbgorICogZXZlcnkgSU5RVUlSWSBvciBSRVFVRVNUIFNFTlNFIG1lc3NhZ2UsIHVubGVzcyB0aGUgdGFyZ2V0IGl0c2VsZiBoYXMKKyAqIGF0IHNvbWUgcG9pbnQgcGVyZm9ybWVkIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24gcmVxdWVzdCwgb3IKKyAqIHdlIGhhdmUgc3luY2hyb25vdXMgdHJhbnNmZXJzIGRpc2FibGVkIGZvciB0aGlzIGRldmljZS4KKyAqLworCisvKioKKyAqIGZhczIxNl9oYW5kbGVzeW5jIC0gSGFuZGxlIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbWVzc2FnZQorICogQGluZm86IHN0YXRlIHN0cnVjdHVyZSBmb3IgaW50ZXJmYWNlCisgKiBAbXNnOiBtZXNzYWdlIGZyb20gdGFyZ2V0CisgKgorICogSGFuZGxlIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgbWVzc2FnZSBmcm9tIHRoZSB0YXJnZXQKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X2hhbmRsZXN5bmMoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKm1zZykKK3sKKwlzdHJ1Y3QgZmFzMjE2X2RldmljZSAqZGV2ID0gJmluZm8tPmRldmljZVtpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZF07CisJZW51bSB7IHN5bmMsIGFzeW5jLCBub25lLCByZWplY3QgfSByZXMgPSBub25lOworCisjaWZkZWYgU0NTSTJfU1lOQworCXN3aXRjaCAobXNnWzBdKSB7CisJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJLyogU3luY2hyb25vdXMgdHJhbnNmZXIgcmVxdWVzdCBmYWlsZWQuCisJCSAqIE5vdGU6IFNDU0kgSUkgcjEwOgorCQkgKgorCQkgKiAgU0NTSSBkZXZpY2VzIHRoYXQgYXJlIGNhcGFibGUgb2Ygc3luY2hyb25vdXMKKwkJICogIGRhdGEgdHJhbnNmZXJzIHNoYWxsIG5vdCByZXNwb25kIHRvIGFuIFNEVFIKKwkJICogIG1lc3NhZ2Ugd2l0aCBhIE1FU1NBR0UgUkVKRUNUIG1lc3NhZ2UuCisJCSAqCisJCSAqIEhlbmNlLCBpZiB3ZSBnZXQgdGhpcyBjb25kaXRpb24sIHdlIGRpc2FibGUKKwkJICogbmVnb3RpYXRpb24gZm9yIHRoaXMgZGV2aWNlLgorCQkgKi8KKwkJaWYgKGRldi0+c3luY19zdGF0ZSA9PSBuZWdfaW5wcm9ncmVzcykgeworCQkJZGV2LT5zeW5jX3N0YXRlID0gbmVnX2ludmFsaWQ7CisJCQlyZXMgPSBhc3luYzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKwkJc3dpdGNoIChkZXYtPnN5bmNfc3RhdGUpIHsKKwkJLyogV2UgZG9uJ3QgYWNjZXB0IHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlcXVlc3RzLgorCQkgKiBSZXNwb25kIHdpdGggYSBNRVNTQUdFX1JFSkVDVCB0byBwcmV2ZW50IGEKKwkJICogc3luY2hyb25vdXMgdHJhbnNmZXIgYWdyZWVtZW50IGZyb20gYmVpbmcgcmVhY2hlZC4KKwkJICovCisJCWNhc2UgbmVnX2ludmFsaWQ6CisJCQlyZXMgPSByZWplY3Q7CisJCQlicmVhazsKKworCQkvKiBXZSB3ZXJlIG5vdCBuZWdvdGlhdGluZyBhIHN5bmNocm9ub3VzIHRyYW5zZmVyLAorCQkgKiBidXQgdGhlIGRldmljZSBzZW50IHVzIGEgbmVnb3RpYXRpb24gcmVxdWVzdC4KKwkJICogSG9ub3VyIHRoZSByZXF1ZXN0IGJ5IHNlbmRpbmcgYmFjayBhIFNEVFIKKwkJICogbWVzc2FnZSBjb250YWluaW5nIG91ciBjYXBhYmlsaXR5LCBsaW1pdGVkIGJ5CisJCSAqIHRoZSB0YXJnZXRzIGNhcGFiaWxpdHkuCisJCSAqLworCQlkZWZhdWx0OgorCQkJZmFzMjE2X2NtZChpbmZvLCBDTURfU0VUQVROKTsKKwkJCWlmIChtc2dbNF0gPiBpbmZvLT5pZmNmZy5zeW5jX21heF9kZXB0aCkKKwkJCQltc2dbNF0gPSBpbmZvLT5pZmNmZy5zeW5jX21heF9kZXB0aDsKKwkJCWlmIChtc2dbM10gPCAxMDAwIC8gaW5mby0+aWZjZmcuY2xvY2tyYXRlKQorCQkJCW1zZ1szXSA9IDEwMDAgLyBpbmZvLT5pZmNmZy5jbG9ja3JhdGU7CisKKwkJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQkJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDUsCisJCQkJCUVYVEVOREVEX01FU1NBR0UsIDMsIEVYVEVOREVEX1NEVFIsCisJCQkJCW1zZ1szXSwgbXNnWzRdKTsKKwkJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9NU0dPVVRfRVhQRUNUOworCisJCQkvKiBUaGlzIGlzIHdyb25nLiAgVGhlIGFncmVlbWVudCBpcyBub3QgaW4gZWZmZWN0CisJCQkgKiB1bnRpbCB0aGlzIG1lc3NhZ2UgaXMgYWNjZXB0ZWQgYnkgdGhlIGRldmljZQorCQkJICovCisJCQlkZXYtPnN5bmNfc3RhdGUgPSBuZWdfdGFyZ2NvbXBsZXRlOworCQkJcmVzID0gc3luYzsKKwkJCWJyZWFrOworCisJCS8qIFdlIGluaXRpYXRlZCB0aGUgc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24sCisJCSAqIGFuZCBoYXZlIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhIHJlc3BvbnNlIGZyb20gdGhlCisJCSAqIHRhcmdldC4gIFRoZSBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnQgaGFzIGJlZW4KKwkJICogcmVhY2hlZC4gIE5vdGU6IGlmIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYXJlIG91dCBvZiBvdXIKKwkJICogYm91bmRzLCB3ZSBtdXN0IHJlamVjdCB0aGUgbWVzc2FnZS4KKwkJICovCisJCWNhc2UgbmVnX2lucHJvZ3Jlc3M6CisJCQlyZXMgPSByZWplY3Q7CisJCQlpZiAobXNnWzRdIDw9IGluZm8tPmlmY2ZnLnN5bmNfbWF4X2RlcHRoICYmCisJCQkgICAgbXNnWzNdID49IDEwMDAgLyBpbmZvLT5pZmNmZy5jbG9ja3JhdGUpIHsKKwkJCQlkZXYtPnN5bmNfc3RhdGUgPSBuZWdfY29tcGxldGU7CisJCQkJcmVzID0gc3luYzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorI2Vsc2UKKwlyZXMgPSByZWplY3Q7CisjZW5kaWYKKworCXN3aXRjaCAocmVzKSB7CisJY2FzZSBzeW5jOgorCQlkZXYtPnBlcmlvZCA9IG1zZ1szXTsKKwkJZGV2LT5zb2YgICAgPSBtc2dbNF07CisJCWRldi0+c3RwICAgID0gZmFzMjE2X3N5bmNwZXJpb2QoaW5mbywgbXNnWzNdICogNCk7CisJCWZhczIxNl9zZXRfc3luYyhpbmZvLCBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZCk7CisJCWJyZWFrOworCisJY2FzZSByZWplY3Q6CisJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgTUVTU0FHRV9SRUpFQ1QpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKKworCWNhc2UgYXN5bmM6CisJCWRldi0+cGVyaW9kID0gaW5mby0+aWZjZmcuYXN5bmNwZXJpb2QgLyA0OworCQlkZXYtPnNvZiAgICA9IDA7CisJCWRldi0+c3RwICAgID0gaW5mby0+c2NzaS5hc3luY19zdHA7CisJCWZhczIxNl9zZXRfc3luYyhpbmZvLCBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZCk7CisJCWJyZWFrOworCisJY2FzZSBub25lOgorCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogZmFzMjE2X3VwZGF0ZXB0cnMgLSB1cGRhdGUgZGF0YSBwb2ludGVycyBhZnRlciB0cmFuc2ZlciBzdXNwZW5kZWQvcGF1c2VkCisgKiBAaW5mbzogaW50ZXJmYWNlJ3MgbG9jYWwgcG9pbnRlciB0byB1cGRhdGUKKyAqIEBieXRlc190cmFuc2ZlcnJlZDogbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisgKgorICogVXBkYXRlIGRhdGEgcG9pbnRlcnMgYWZ0ZXIgdHJhbnNmZXIgc3VzcGVuZGVkL3BhdXNlZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfdXBkYXRlcHRycyhGQVMyMTZfSW5mbyAqaW5mbywgaW50IGJ5dGVzX3RyYW5zZmVycmVkKQoreworCVNjc2lfUG9pbnRlciAqU0NwID0gJmluZm8tPnNjc2kuU0NwOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlCVUdfT04oYnl0ZXNfdHJhbnNmZXJyZWQgPCAwKTsKKworCWluZm8tPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLT0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisKKwl3aGlsZSAoYnl0ZXNfdHJhbnNmZXJyZWQgIT0gMCkgeworCQlpZiAoU0NwLT50aGlzX3Jlc2lkdWFsID4gYnl0ZXNfdHJhbnNmZXJyZWQpCisJCQlicmVhazsKKwkJLyoKKwkJICogV2UgaGF2ZSB1c2VkIHVwIHRoaXMgYnVmZmVyLiAgTW92ZSBvbiB0byB0aGUKKwkJICogbmV4dCBidWZmZXIuCisJCSAqLworCQlieXRlc190cmFuc2ZlcnJlZCAtPSBTQ3AtPnRoaXNfcmVzaWR1YWw7CisJCWlmICghbmV4dF9TQ3AoU0NwKSAmJiBieXRlc190cmFuc2ZlcnJlZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkLiVjOiBvdXQgb2YgYnVmZmVyc1xuIiwKKwkJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBpbmZvLT5TQ3BudC0+ZGV2aWNlLT5pZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlTQ3AtPnRoaXNfcmVzaWR1YWwgLT0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisJaWYgKFNDcC0+dGhpc19yZXNpZHVhbCkKKwkJU0NwLT5wdHIgKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisJZWxzZQorCQlTQ3AtPnB0ciA9IE5VTEw7Cit9CisKKy8qKgorICogZmFzMjE2X3BpbyAtIHRyYW5zZmVyIGRhdGEgb2ZmIG9mL29uIHRvIGNhcmQgdXNpbmcgcHJvZ3JhbW1lZCBJTworICogQGluZm86IGludGVyZmFjZSB0byB0cmFuc2ZlciBkYXRhIHRvL2Zyb20KKyAqIEBkaXJlY3Rpb246IGRpcmVjdGlvbiB0byB0cmFuc2ZlciBkYXRhIChETUFfT1VUL0RNQV9JTikKKyAqCisgKiBUcmFuc2ZlciBkYXRhIG9mZiBvZi9vbiB0byBjYXJkIHVzaW5nIHByb2dyYW1tZWQgSU8uCisgKiBOb3RlczogdGhpcyBpcyBpbmNyZWRpYmx5IHNsb3cuCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9waW8oRkFTMjE2X0luZm8gKmluZm8sIGZhc2RtYWRpcl90IGRpcmVjdGlvbikKK3sKKwlTY3NpX1BvaW50ZXIgKlNDcCA9ICZpbmZvLT5zY3NpLlNDcDsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19GRiwgZ2V0X25leHRfU0NwX2J5dGUoU0NwKSk7CisJZWxzZQorCQlwdXRfbmV4dF9TQ3BfYnl0ZShTQ3AsIGZhczIxNl9yZWFkYihpbmZvLCBSRUdfRkYpKTsKKworCWlmIChTQ3AtPnRoaXNfcmVzaWR1YWwgPT0gMCkKKwkJbmV4dF9TQ3AoU0NwKTsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X3NldF9zdGMoRkFTMjE2X0luZm8gKmluZm8sIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RDTCwgbGVuZ3RoKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TVENNLCBsZW5ndGggPj4gOCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RDSCwgbGVuZ3RoID4+IDE2KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmYXMyMTZfZ2V0X2N0YyhGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DVENMKSArCisJICAgICAgIChmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NUQ00pIDw8IDgpICsKKwkgICAgICAgKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ1RDSCkgPDwgMTYpOworfQorCisvKioKKyAqIGZhczIxNl9jbGVhbnVwdHJhbnNmZXIgLSBjbGVhbiB1cCBhZnRlciBhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCisgKiBAaW5mbzogaW50ZXJmYWNlIHRvIGNsZWFuIHVwCisgKgorICogVXBkYXRlIHRoZSBkYXRhIHBvaW50ZXJzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkCisgKiBvbiB0aGUgU0NTSSBidXMuCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9jbGVhbnVwdHJhbnNmZXIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyB0b3RhbCwgcmVzaWR1YWwsIGZpZm87CisJZmFzZG1hdHlwZV90IGRtYXR5cGUgPSBpbmZvLT5kbWEudHJhbnNmZXJfdHlwZTsKKworCWluZm8tPmRtYS50cmFuc2Zlcl90eXBlID0gZmFzZG1hX25vbmU7CisKKwkvKgorCSAqIFBJTyB0cmFuc2ZlcnMgZG8gbm90IG5lZWQgdG8gYmUgY2xlYW5lZCB1cC4KKwkgKi8KKwlpZiAoZG1hdHlwZSA9PSBmYXNkbWFfcGlvIHx8IGRtYXR5cGUgPT0gZmFzZG1hX25vbmUpCisJCXJldHVybjsKKworCWlmIChkbWF0eXBlID09IGZhc2RtYV9yZWFsX2FsbCkKKwkJdG90YWwgPSBpbmZvLT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCWVsc2UKKwkJdG90YWwgPSBpbmZvLT5zY3NpLlNDcC50aGlzX3Jlc2lkdWFsOworCisJcmVzaWR1YWwgPSBmYXMyMTZfZ2V0X2N0YyhpbmZvKTsKKworCWZpZm8gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRjsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgImNsZWFuaW5nIHVwIGZyb20gcHJldmlvdXMgIgorCQkgICAidHJhbnNmZXI6IGxlbmd0aCAweCUwNngsIHJlc2lkdWFsIDB4JXgsIGZpZm8gJWQiLAorCQkgICB0b3RhbCwgcmVzaWR1YWwsIGZpZm8pOworCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIHBlcmZvcm1pbmcgRGF0YS1PdXQsIHRoZSB0cmFuc2ZlciBjb3VudGVyCisJICogY291bnRzIGRvd24gZWFjaCB0aW1lIGEgYnl0ZSBpcyB0cmFuc2ZlcnJlZCBieSB0aGUKKwkgKiBob3N0IHRvIHRoZSBGSUZPLiAgVGhpcyBtZWFucyB3ZSBtdXN0IGluY2x1ZGUgdGhlCisJICogYnl0ZXMgbGVmdCBpbiB0aGUgRklGTyBmcm9tIHRoZSB0cmFuc2ZlciBjb3VudGVyLgorCSAqLworCWlmIChpbmZvLT5zY3NpLnBoYXNlID09IFBIQVNFX0RBVEFPVVQpCisJCXJlc2lkdWFsICs9IGZpZm87CisKKwlmYXMyMTZfdXBkYXRlcHRycyhpbmZvLCB0b3RhbCAtIHJlc2lkdWFsKTsKK30KKworLyoqCisgKiBmYXMyMTZfdHJhbnNmZXIgLSBQZXJmb3JtIGEgRE1BL1BJTyB0cmFuc2ZlciBvZmYgb2Yvb24gdG8gY2FyZAorICogQGluZm86IGludGVyZmFjZSBmcm9tIHdoaWNoIGRldmljZSBkaXNjb25uZWN0ZWQgZnJvbQorICoKKyAqIFN0YXJ0IGEgRE1BL1BJTyB0cmFuc2ZlciBvZmYgb2Yvb24gdG8gY2FyZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfdHJhbnNmZXIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJZmFzZG1hZGlyX3QgZGlyZWN0aW9uOworCWZhc2RtYXR5cGVfdCBkbWF0eXBlOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQlVGRkVSLAorCQkgICAic3RhcnR0cmFuc2ZlcjogYnVmZmVyICVwIGxlbmd0aCAweCUwNnggcmVxbGVuIDB4JTA2eCIsCisJCSAgIGluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCwKKwkJICAgaW5mby0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwlpZiAoIWluZm8tPnNjc2kuU0NwLnB0cikgeworCQlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgIm51bGwgYnVmZmVyIHBhc3NlZCB0byAiCisJCQkgICAiZmFzMjE2X3N0YXJ0dHJhbnNmZXIiKTsKKwkJcHJpbnRfU0NwKCZpbmZvLT5zY3NpLlNDcCwgIlNDcDogIiwgIlxuIik7CisJCXByaW50X1NDcCgmaW5mby0+U0NwbnQtPlNDcCwgIkNtbmQgU0NwOiAiLCAiXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhIHN5bmNocm9ub3VzIHRyYW5zZmVyIGFncmVlbWVudCBpbiBlZmZlY3QsIHdlIG11c3QKKwkgKiB1c2UgRE1BIG1vZGUuICBJZiB3ZSBhcmUgdXNpbmcgYXN5bmNocm9ub3VzIHRyYW5zZmVycywgd2UgbWF5CisJICogdXNlIERNQSBtb2RlIG9yIFBJTyBtb2RlLgorCSAqLworCWlmIChpbmZvLT5kZXZpY2VbaW5mby0+U0NwbnQtPmRldmljZS0+aWRdLnNvZikKKwkJZG1hdHlwZSA9IGZhc2RtYV9yZWFsX2FsbDsKKwllbHNlCisJCWRtYXR5cGUgPSBmYXNkbWFfcGlvOworCisJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfREFUQU9VVCkKKwkJZGlyZWN0aW9uID0gRE1BX09VVDsKKwllbHNlCisJCWRpcmVjdGlvbiA9IERNQV9JTjsKKworCWlmIChpbmZvLT5kbWEuc2V0dXApCisJCWRtYXR5cGUgPSBpbmZvLT5kbWEuc2V0dXAoaW5mby0+aG9zdCwgJmluZm8tPnNjc2kuU0NwLAorCQkJCQkgIGRpcmVjdGlvbiwgZG1hdHlwZSk7CisJaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPSBkbWF0eXBlOworCisJaWYgKGRtYXR5cGUgPT0gZmFzZG1hX3JlYWxfYWxsKQorCQlmYXMyMTZfc2V0X3N0YyhpbmZvLCBpbmZvLT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwllbHNlCisJCWZhczIxNl9zZXRfc3RjKGluZm8sIGluZm8tPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCisJc3dpdGNoIChkbWF0eXBlKSB7CisJY2FzZSBmYXNkbWFfcGlvOgorCQlmYXMyMTZfbG9nKGluZm8sIExPR19CVUZGRVIsICJQSU8gdHJhbnNmZXIiKTsKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU09GLCAwKTsKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RQLCBpbmZvLT5zY3NpLmFzeW5jX3N0cCk7CisJCWZhczIxNl9jbWQoaW5mbywgQ01EX1RSQU5TRkVSSU5GTyk7CisJCWZhczIxNl9waW8oaW5mbywgZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGZhc2RtYV9wc2V1ZG86CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgInBzZXVkbyB0cmFuc2ZlciIpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8gfCBDTURfV0lUSERNQSk7CisJCWluZm8tPmRtYS5wc2V1ZG8oaW5mby0+aG9zdCwgJmluZm8tPnNjc2kuU0NwLAorCQkJCSBkaXJlY3Rpb24sIGluZm8tPlNDcG50LT50cmFuc2ZlcnNpemUpOworCQlicmVhazsKKworCWNhc2UgZmFzZG1hX3JlYWxfYmxvY2s6CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgImJsb2NrIGRtYSB0cmFuc2ZlciIpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8gfCBDTURfV0lUSERNQSk7CisJCWJyZWFrOworCisJY2FzZSBmYXNkbWFfcmVhbF9hbGw6CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0JVRkZFUiwgInRvdGFsIGRtYSB0cmFuc2ZlciIpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8gfCBDTURfV0lUSERNQSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQlVGRkVSIHwgTE9HX0VSUk9SLAorCQkJICAgImludmFsaWQgRkFTMjE2IERNQSB0eXBlIik7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBmYXMyMTZfc3RvcHRyYW5zZmVyIC0gU3RvcCBhIERNQSB0cmFuc2ZlciBvbnRvIC8gb2ZmIG9mIHRoZSBjYXJkCisgKiBAaW5mbzogaW50ZXJmYWNlIGZyb20gd2hpY2ggZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tCisgKgorICogQ2FsbGVkIHdoZW4gd2Ugc3dpdGNoIGF3YXkgZnJvbSBEQVRBIElOIG9yIERBVEEgT1VUIHBoYXNlcy4KKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3N0b3B0cmFuc2ZlcihGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCWlmIChpbmZvLT5kbWEudHJhbnNmZXJfdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwgfHwKKwkgICAgaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPT0gZmFzZG1hX3JlYWxfYmxvY2spCisJCWluZm8tPmRtYS5zdG9wKGluZm8tPmhvc3QsICZpbmZvLT5zY3NpLlNDcCk7CisKKwlmYXMyMTZfY2xlYW51cHRyYW5zZmVyKGluZm8pOworCisJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfREFUQUlOKSB7CisJCXVuc2lnbmVkIGludCBmaWZvOworCisJCS8qCisJCSAqIElmIHdlIHdlcmUgcGVyZm9ybWluZyBEYXRhLUluLCB0aGVuIHRoZSBGSUZPIGNvdW50ZXIKKwkJICogY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBub3QgdHJhbnNmZXJyZWQgdmlhIERNQQorCQkgKiBmcm9tIHRoZSBvbi1ib2FyZCBGSUZPLiAgUmVhZCB0aGVtIG1hbnVhbGx5LgorCQkgKi8KKwkJZmlmbyA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ0ZJUykgJiBDRklTX0NGOworCQl3aGlsZSAoZmlmbyAmJiBpbmZvLT5zY3NpLlNDcC5wdHIpIHsKKwkJCSppbmZvLT5zY3NpLlNDcC5wdHIgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKwkJCWZhczIxNl91cGRhdGVwdHJzKGluZm8sIDEpOworCQkJZmlmby0tOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWZ0ZXIgYSBEYXRhLU91dCBwaGFzZSwgdGhlcmUgbWF5IGJlIHVuc2VudAorCQkgKiBieXRlcyBsZWZ0IGluIHRoZSBGSUZPLiAgRmx1c2ggdGhlbSBvdXQuCisJCSAqLworCQlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworCX0KK30KKworc3RhdGljIHZvaWQgZmFzMjE2X2Fib3J0dHJhbnNmZXIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlpZiAoaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPT0gZmFzZG1hX3JlYWxfYWxsIHx8CisJICAgIGluZm8tPmRtYS50cmFuc2Zlcl90eXBlID09IGZhc2RtYV9yZWFsX2Jsb2NrKQorCQlpbmZvLT5kbWEuc3RvcChpbmZvLT5ob3N0LCAmaW5mby0+c2NzaS5TQ3ApOworCisJaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPSBmYXNkbWFfbm9uZTsKKwlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfa2ljayhGQVMyMTZfSW5mbyAqaW5mbyk7CisKKy8qKgorICogZmFzMjE2X2Rpc2Nvbm5lY3RlZF9pbnRyIC0gaGFuZGxlIGRldmljZSBkaXNjb25uZWN0aW9uCisgKiBAaW5mbzogaW50ZXJmYWNlIGZyb20gd2hpY2ggZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tCisgKgorICogSGFuZGxlIGRldmljZSBkaXNjb25uZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9kaXNjb25uZWN0X2ludHIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwgImRpc2Nvbm5lY3QgcGhhc2U9JTAyeCIsCisJCSAgIGluZm8tPnNjc2kucGhhc2UpOworCisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisKKwlzd2l0Y2ggKGluZm8tPnNjc2kucGhhc2UpIHsKKwljYXNlIFBIQVNFX1NFTEVDVElPTjoJCQkvKiB3aGlsZSBzZWxlY3RpbmcgLSBubyB0YXJnZXQJCSovCisJY2FzZSBQSEFTRV9TRUxTVEVQUzoKKwkJZmFzMjE2X2RvbmUoaW5mbywgRElEX05PX0NPTk5FQ1QpOworCQlicmVhazsKKworCWNhc2UgUEhBU0VfTVNHSU5fRElTQ09OTkVDVDoJCS8qIG1lc3NhZ2UgaW4gLSBkaXNjb25uZWN0aW5nCQkqLworCQlpbmZvLT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7CisJCWluZm8tPnN0YXRzLmRpc2Nvbm5lY3RzICs9IDE7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJCWZhczIxNl9raWNrKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIQVNFX0RPTkU6CQkJLyogYXQgZW5kIG9mIGNvbW1hbmQgLSBjb21wbGV0ZQkJKi8KKwkJZmFzMjE2X2RvbmUoaW5mbywgRElEX09LKTsKKwkJYnJlYWs7CisKKwljYXNlIFBIQVNFX01TR09VVDoJCQkvKiBtZXNzYWdlIG91dCAtIHBvc3NpYmxlIEFCT1JUIG1lc3NhZ2UJKi8KKwkJaWYgKGZhczIxNl9nZXRfbGFzdF9tc2coaW5mbywgaW5mby0+c2NzaS5tc2dpbl9maWZvKSA9PSBBQk9SVCkgeworCQkJaW5mby0+c2NzaS5hYm9ydGluZyA9IDA7CisJCQlmYXMyMTZfZG9uZShpbmZvLCBESURfQUJPUlQpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CQkJCS8qIGh1aD8JCQkJCSovCisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiB1bmV4cGVjdGVkIGRpc2Nvbm5lY3QgaW4gcGhhc2UgJXNcbiIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pLCBmYXMyMTZfZHJ2X3BoYXNlKGluZm8pKTsKKwkJcHJpbnRfZGVidWdfbGlzdCgpOworCQlmYXMyMTZfc3RvcHRyYW5zZmVyKGluZm8pOworCQlmYXMyMTZfZG9uZShpbmZvLCBESURfRVJST1IpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogZmFzMjE2X3Jlc2VsZWN0ZWRfaW50ciAtIHN0YXJ0IHJlY29ubmVjdGlvbiBvZiBhIGRldmljZQorICogQGluZm86IGludGVyZmFjZSB3aGljaCB3YXMgcmVzZWxlY3RlZAorICoKKyAqIFN0YXJ0IHJlY29ubmVjdGlvbiBvZiBhIGRldmljZQorICovCitzdGF0aWMgdm9pZAorZmFzMjE2X3Jlc2VsZWN0ZWRfaW50cihGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgY2ZpcywgaTsKKwl1bnNpZ25lZCBjaGFyIG1zZ1s0XTsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldCwgbHVuLCB0YWc7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCVdBUk5fT04oaW5mby0+c2NzaS5waGFzZSA9PSBQSEFTRV9TRUxFQ1RJT04gfHwKKwkJaW5mby0+c2NzaS5waGFzZSA9PSBQSEFTRV9TRUxTVEVQUyk7CisKKwljZmlzID0gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DRklTKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJyZWNvbm5lY3QgcGhhc2U9JTAyeCBjZmlzPSUwMngiLAorCQkgICBpbmZvLT5zY3NpLnBoYXNlLCBjZmlzKTsKKworCWNmaXMgJj0gQ0ZJU19DRjsKKworCWlmIChjZmlzIDwgMiB8fCBjZmlzID4gNCkgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2klZC5IOiBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIGFmdGVyIHJlc2VsZWN0XG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubyk7CisJCWdvdG8gYmFkX21lc3NhZ2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNmaXM7IGkrKykKKwkJbXNnW2ldID0gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19GRik7CisKKwlpZiAoIShtc2dbMF0gJiAoMSA8PCBpbmZvLT5ob3N0LT50aGlzX2lkKSkgfHwKKwkgICAgIShtc2dbMV0gJiAweDgwKSkKKwkJZ290byBpbml0aWF0b3JfZXJyb3I7CisKKwl0YXJnZXQgPSBtc2dbMF0gJiB+KDEgPDwgaW5mby0+aG9zdC0+dGhpc19pZCk7CisJdGFyZ2V0ID0gZmZzKHRhcmdldCkgLSAxOworCWx1biA9IG1zZ1sxXSAmIDc7CisJdGFnID0gMDsKKworCWlmIChjZmlzID49IDMpIHsKKwkJaWYgKG1zZ1syXSAhPSBTSU1QTEVfUVVFVUVfVEFHKQorCQkJZ290byBpbml0aWF0b3JfZXJyb3I7CisKKwkJdGFnID0gbXNnWzNdOworCX0KKworCS8qIHNldCB1cCBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzICovCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU0RJRCwgdGFyZ2V0KTsKKwlmYXMyMTZfc2V0X3N5bmMoaW5mbywgdGFyZ2V0KTsKKwltc2dxdWV1ZV9mbHVzaCgmaW5mby0+c2NzaS5tc2dzKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJSZWNvbm5lY3RlZDogdGFyZ2V0ICUxeCBsdW4gJTF4IHRhZyAlMDJ4IiwKKwkJICAgdGFyZ2V0LCBsdW4sIHRhZyk7CisKKwlpZiAoaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSAmJiBpbmZvLT5TQ3BudCkgeworCQlpbmZvLT5zY3NpLmRpc2Nvbm5lY3RhYmxlID0gMDsKKwkJaWYgKGluZm8tPlNDcG50LT5kZXZpY2UtPmlkICA9PSB0YXJnZXQgJiYKKwkJICAgIGluZm8tPlNDcG50LT5kZXZpY2UtPmx1biA9PSBsdW4gJiYKKwkJICAgIGluZm8tPlNDcG50LT50YWcgICAgICAgICA9PSB0YWcpIHsKKwkJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJyZWNvbm5lY3RlZCBwcmV2aW91c2x5IGV4ZWN1dGluZyBjb21tYW5kIik7CisJCX0gZWxzZSB7CisJCQlxdWV1ZV9hZGRfY21kX3RhaWwoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQsIGluZm8tPlNDcG50KTsKKwkJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJoYWQgdG8gbW92ZSBjb21tYW5kIHRvIGRpc2Nvbm5lY3RlZCBxdWV1ZSIpOworCQkJaW5mby0+U0NwbnQgPSBOVUxMOworCQl9CisJfQorCWlmICghaW5mby0+U0NwbnQpIHsKKwkJaW5mby0+U0NwbnQgPSBxdWV1ZV9yZW1vdmVfdGd0bHVudGFnKCZpbmZvLT5xdWV1ZXMuZGlzY29ubmVjdGVkLAorCQkJCQl0YXJnZXQsIGx1biwgdGFnKTsKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwgImhhZCB0byBnZXQgY29tbWFuZCIpOworCX0KKworCWlmIChpbmZvLT5TQ3BudCkgeworCQkvKgorCQkgKiBSZXN0b3JlIGRhdGEgcG9pbnRlciBmcm9tIFNBVkVEIGRhdGEgcG9pbnRlcgorCQkgKi8KKwkJaW5mby0+c2NzaS5TQ3AgPSBpbmZvLT5TQ3BudC0+U0NwOworCisJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QsICJkYXRhIHBvaW50ZXJzOiBbJXAsICVYXSIsCisJCQlpbmZvLT5zY3NpLlNDcC5wdHIsIGluZm8tPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU47CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3VyIGNvbW1hbmQgc3RydWN0dXJlIG5vdCBmb3VuZCAtIGFib3J0IHRoZQorCQkgKiBjb21tYW5kIG9uIHRoZSB0YXJnZXQuICBTaW5jZSB3ZSBoYXZlIG5vCisJCSAqIHJlY29yZCBvZiB0aGlzIGNvbW1hbmQsIHdlIGNhbid0IHNlbmQKKwkJICogYW4gSU5JVElBVE9SIERFVEVDVEVEIEVSUk9SIG1lc3NhZ2UuCisJCSAqLworCQlmYXMyMTZfY21kKGluZm8sIENNRF9TRVRBVE4pOworCisjaWYgMAorCQlpZiAodGFnKQorCQkJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDIsIEFCT1JUX1RBRywgdGFnKTsKKwkJZWxzZQorI2VuZGlmCisJCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgQUJPUlQpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKKwkJaW5mby0+c2NzaS5hYm9ydGluZyA9IDE7CisJfQorCisJZmFzMjE2X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworCXJldHVybjsKKworIGluaXRpYXRvcl9lcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgInNjc2klZC5IOiBlcnJvciBkdXJpbmcgcmVzZWxlY3Rpb246IGJ5dGVzIiwKKwkJaW5mby0+aG9zdC0+aG9zdF9ubyk7CisJZm9yIChpID0gMDsgaSA8IGNmaXM7IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIG1zZ1tpXSk7CisJcHJpbnRrKCJcbiIpOworIGJhZF9tZXNzYWdlOgorCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDEsIElOSVRJQVRPUl9FUlJPUik7CisJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVF9FWFBFQ1Q7CisJZmFzMjE2X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfcGFyc2VfbWVzc2FnZShGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgY2hhciAqbWVzc2FnZSwgaW50IG1zZ2xlbikKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAobWVzc2FnZVswXSkgeworCWNhc2UgQ09NTUFORF9DT01QTEVURToKKwkJaWYgKG1zZ2xlbiAhPSAxKQorCQkJZ290byB1bnJlY29nbmlzZWQ7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6IGNvbW1hbmQgY29tcGxldGUgd2l0aCBubyAiCisJCQkic3RhdHVzIGluIE1FU1NBR0VfSU4/XG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgZmFzMjE2X3RhcmdldChpbmZvKSk7CisJCWJyZWFrOworCisJY2FzZSBTQVZFX1BPSU5URVJTOgorCQlpZiAobXNnbGVuICE9IDEpCisJCQlnb3RvIHVucmVjb2duaXNlZDsKKworCQkvKgorCQkgKiBTYXZlIGN1cnJlbnQgZGF0YSBwb2ludGVyIHRvIFNBVkVEIGRhdGEgcG9pbnRlcgorCQkgKiBTQ1NJIElJIHN0YW5kYXJkIHNheXMgdGhhdCB3ZSBtdXN0IG5vdCBhY2tub3dsZWRnZQorCQkgKiB0aGlzIHVudGlsIHdlIGhhdmUgcmVhbGx5IHNhdmVkIHBvaW50ZXJzLgorCQkgKiBOT1RFOiB3ZSBETyBOT1Qgc2F2ZSB0aGUgY29tbWFuZCBub3Igc3RhdHVzIHBvaW50ZXJzCisJCSAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBTQ1NJIElJIHN0YW5kYXJkLiAgVGhlc2UgYWx3YXlzCisJCSAqIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGVpciByZXNwZWN0aXZlIGFyZWFzLgorCQkgKi8KKwkJaW5mby0+U0NwbnQtPlNDcCA9IGluZm8tPnNjc2kuU0NwOworCQlpbmZvLT5TQ3BudC0+U0NwLnNlbnRfY29tbWFuZCA9IDA7CisJCWZhczIxNl9sb2coaW5mbywgTE9HX0NPTk5FQ1QgfCBMT0dfTUVTU0FHRVMgfCBMT0dfQlVGRkVSLAorCQkJInNhdmUgZGF0YSBwb2ludGVyczogWyVwLCAlWF0iLAorCQkJaW5mby0+c2NzaS5TQ3AucHRyLCBpbmZvLT5zY3NpLlNDcC50aGlzX3Jlc2lkdWFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCWlmIChtc2dsZW4gIT0gMSkKKwkJCWdvdG8gdW5yZWNvZ25pc2VkOworCisJCS8qCisJCSAqIFJlc3RvcmUgY3VycmVudCBkYXRhIHBvaW50ZXIgZnJvbSBTQVZFRCBkYXRhIHBvaW50ZXIKKwkJICovCisJCWluZm8tPnNjc2kuU0NwID0gaW5mby0+U0NwbnQtPlNDcDsKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCB8IExPR19NRVNTQUdFUyB8IExPR19CVUZGRVIsCisJCQkicmVzdG9yZSBkYXRhIHBvaW50ZXJzOiBbJXAsIDB4JXhdIiwKKwkJCWluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCk7CisJCWJyZWFrOworCisJY2FzZSBESVNDT05ORUNUOgorCQlpZiAobXNnbGVuICE9IDEpCisJCQlnb3RvIHVucmVjb2duaXNlZDsKKworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHSU5fRElTQ09OTkVDVDsKKwkJYnJlYWs7CisKKwljYXNlIE1FU1NBR0VfUkVKRUNUOgorCQlpZiAobXNnbGVuICE9IDEpCisJCQlnb3RvIHVucmVjb2duaXNlZDsKKworCQlzd2l0Y2ggKGZhczIxNl9nZXRfbGFzdF9tc2coaW5mbywgaW5mby0+c2NzaS5tc2dpbl9maWZvKSkgeworCQljYXNlIEVYVEVOREVEX01FU1NBR0UgfCBFWFRFTkRFRF9TRFRSIDw8IDg6CisJCQlmYXMyMTZfaGFuZGxlc3luYyhpbmZvLCBtZXNzYWdlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlmYXMyMTZfbG9nKGluZm8sIDAsICJyZWplY3QsIGxhc3QgbWVzc2FnZSAweCUwNHgiLAorCQkJCWZhczIxNl9nZXRfbGFzdF9tc2coaW5mbywgaW5mby0+c2NzaS5tc2dpbl9maWZvKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5PUDoKKwkJYnJlYWs7CisKKwljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCWlmIChtc2dsZW4gPCAzKQorCQkJZ290byB1bnJlY29nbmlzZWQ7CisKKwkJc3dpdGNoIChtZXNzYWdlWzJdKSB7CisJCWNhc2UgRVhURU5ERURfU0RUUjoJLyogU3luYyB0cmFuc2ZlciBuZWdvdGlhdGlvbiByZXF1ZXN0L3JlcGx5ICovCisJCQlmYXMyMTZfaGFuZGxlc3luYyhpbmZvLCBtZXNzYWdlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlnb3RvIHVucmVjb2duaXNlZDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdvdG8gdW5yZWNvZ25pc2VkOworCX0KKwlyZXR1cm47CisKK3VucmVjb2duaXNlZDoKKwlmYXMyMTZfbG9nKGluZm8sIDAsICJ1bnJlY29nbmlzZWQgbWVzc2FnZSwgcmVqZWN0aW5nIik7CisJcHJpbnRrKCJzY3NpJWQuJWM6IG1lc3NhZ2Ugd2FzIiwgaW5mby0+aG9zdC0+aG9zdF9ubywgZmFzMjE2X3RhcmdldChpbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IG1zZ2xlbjsgaSsrKQorCQlwcmludGsoIiVzJTAyWCIsIGkgJiAzMSA/ICIgIiA6ICJcbiAgIiwgbWVzc2FnZVtpXSk7CisJcHJpbnRrKCJcbiIpOworCisJLyoKKwkgKiBTb21ldGhpbmcgc3RyYW5nZSBzZWVtcyB0byBiZSBoYXBwZW5pbmcgaGVyZSAtCisJICogSSBjYW4ndCB1c2UgU0VUQVROIHNpbmNlIHRoZSBjaGlwIGdpdmVzIG1lIGFuCisJICogaW52YWxpZCBjb21tYW5kIGludGVycnVwdCB3aGVuIEkgZG8uICBXZWlyZC4KKwkgKi8KK2ZhczIxNl9jbWQoaW5mbywgQ01EX05PUCk7CitmYXMyMTZfZHVtcHN0YXRlKGluZm8pOworCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDEsIE1FU1NBR0VfUkVKRUNUKTsKKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKK2ZhczIxNl9kdW1wc3RhdGUoaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgZmFzMjE2X3dhaXRfY21kKEZBUzIxNl9JbmZvICppbmZvLCBpbnQgY21kKQoreworCWludCB0b3V0OworCWludCBzdGF0OworCisJZmFzMjE2X2NtZChpbmZvLCBjbWQpOworCisJZm9yICh0b3V0ID0gMTAwMDsgdG91dDsgdG91dCAtPSAxKSB7CisJCXN0YXQgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX1NUQVQpOworCQlpZiAoc3RhdCAmIChTVEFUX0lOVHxTVEFUX1BBUklUWUVSUk9SKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQgZmFzMjE2X2dldF9tc2dfYnl0ZShGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdCA9IGZhczIxNl93YWl0X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworCisJaWYgKChzdGF0ICYgU1RBVF9JTlQpID09IDApCisJCWdvdG8gdGltZWRvdXQ7CisKKwlpZiAoKHN0YXQgJiBTVEFUX0JVU01BU0spICE9IFNUQVRfTUVTR0lOKQorCQlnb3RvIHVuZXhwZWN0ZWRfcGhhc2VfY2hhbmdlOworCisJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19JTlNUKTsKKworCXN0YXQgPSBmYXMyMTZfd2FpdF9jbWQoaW5mbywgQ01EX1RSQU5TRkVSSU5GTyk7CisKKwlpZiAoKHN0YXQgJiBTVEFUX0lOVCkgPT0gMCkKKwkJZ290byB0aW1lZG91dDsKKworCWlmIChzdGF0ICYgU1RBVF9QQVJJVFlFUlJPUikKKwkJZ290byBwYXJpdHlfZXJyb3I7CisKKwlpZiAoKHN0YXQgJiBTVEFUX0JVU01BU0spICE9IFNUQVRfTUVTR0lOKQorCQlnb3RvIHVuZXhwZWN0ZWRfcGhhc2VfY2hhbmdlOworCisJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19JTlNUKTsKKworCXJldHVybiBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKwordGltZWRvdXQ6CisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRVJST1IsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSBieXRlIik7CisJcmV0dXJuIC0xOworCit1bmV4cGVjdGVkX3BoYXNlX2NoYW5nZToKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgInVuZXhwZWN0ZWQgcGhhc2UgY2hhbmdlOiBzdGF0dXMgPSAlMDJ4Iiwgc3RhdCk7CisJcmV0dXJuIC0yOworCitwYXJpdHlfZXJyb3I6CisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRVJST1IsICJwYXJpdHkgZXJyb3IgZHVyaW5nIG1lc3NhZ2UgaW4gcGhhc2UiKTsKKwlyZXR1cm4gLTM7Cit9CisKKy8qKgorICogZmFzMjE2X21lc3NhZ2UgLSBoYW5kbGUgYSBmdW5jdGlvbiBkb25lIGludGVycnVwdCBmcm9tIEZBUzIxNiBjaGlwCisgKiBAaW5mbzogaW50ZXJmYWNlIHdoaWNoIGNhdXNlZCBmdW5jdGlvbiBkb25lIGludGVycnVwdAorICoKKyAqIEhhbmRsZSBhIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0IGZyb20gRkFTMjE2IGNoaXAKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X21lc3NhZ2UoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciAqbWVzc2FnZSA9IGluZm8tPnNjc2kubWVzc2FnZTsKKwl1bnNpZ25lZCBpbnQgbXNnbGVuID0gMTsKKwlpbnQgbXNnYnl0ZSA9IDA7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCW1lc3NhZ2VbMF0gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKworCWlmIChtZXNzYWdlWzBdID09IEVYVEVOREVEX01FU1NBR0UpIHsKKwkJbXNnYnl0ZSA9IGZhczIxNl9nZXRfbXNnX2J5dGUoaW5mbyk7CisKKwkJaWYgKG1zZ2J5dGUgPj0gMCkgeworCQkJbWVzc2FnZVsxXSA9IG1zZ2J5dGU7CisKKwkJCWZvciAobXNnbGVuID0gMjsgbXNnbGVuIDwgbWVzc2FnZVsxXSArIDI7IG1zZ2xlbisrKSB7CisJCQkJbXNnYnl0ZSA9IGZhczIxNl9nZXRfbXNnX2J5dGUoaW5mbyk7CisKKwkJCQlpZiAobXNnYnl0ZSA+PSAwKQorCQkJCQltZXNzYWdlW21zZ2xlbl0gPSBtc2dieXRlOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobXNnYnl0ZSA9PSAtMykKKwkJZ290byBwYXJpdHlfZXJyb3I7CisKKyNpZmRlZiBERUJVR19NRVNTQUdFUworCXsKKwkJaW50IGk7CisKKwkJcHJpbnRrKCJzY3NpJWQuJWM6IG1lc3NhZ2UgaW46ICIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pKTsKKwkJZm9yIChpID0gMDsgaSA8IG1zZ2xlbjsgaSsrKQorCQkJcHJpbnRrKCIlMDJYICIsIG1lc3NhZ2VbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwlmYXMyMTZfcGFyc2VfbWVzc2FnZShpbmZvLCBtZXNzYWdlLCBtc2dsZW4pOworCWZhczIxNl9jbWQoaW5mbywgQ01EX01TR0FDQ0VQVEVEKTsKKwlyZXR1cm47CisKK3Bhcml0eV9lcnJvcjoKKwlmYXMyMTZfY21kKGluZm8sIENNRF9TRVRBVE4pOworCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCW1zZ3F1ZXVlX2FkZG1zZygmaW5mby0+c2NzaS5tc2dzLCAxLCBNU0dfUEFSSVRZX0VSUk9SKTsKKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfTVNHT1VUX0VYUEVDVDsKKwlmYXMyMTZfY21kKGluZm8sIENNRF9NU0dBQ0NFUFRFRCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGZhczIxNl9zZW5kX2NvbW1hbmQgLSBzZW5kIGNvbW1hbmQgYWZ0ZXIgYWxsIG1lc3NhZ2UgYnl0ZXMgaGF2ZSBiZWVuIHNlbnQKKyAqIEBpbmZvOiBpbnRlcmZhY2Ugd2hpY2ggY2F1c2VkIGJ1cyBzZXJ2aWNlCisgKgorICogU2VuZCBhIGNvbW1hbmQgdG8gYSB0YXJnZXQgYWZ0ZXIgYWxsIG1lc3NhZ2UgYnl0ZXMgaGF2ZSBiZWVuIHNlbnQKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3NlbmRfY29tbWFuZChGQVMyMTZfSW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2NtZChpbmZvLCBDTURfTk9QfENNRF9XSVRIRE1BKTsKKwlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworCisJLyogbG9hZCBjb21tYW5kICovCisJZm9yIChpID0gaW5mby0+c2NzaS5TQ3Auc2VudF9jb21tYW5kOyBpIDwgaW5mby0+U0NwbnQtPmNtZF9sZW47IGkrKykKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfRkYsIGluZm8tPlNDcG50LT5jbW5kW2ldKTsKKworCWZhczIxNl9jbWQoaW5mbywgQ01EX1RSQU5TRkVSSU5GTyk7CisKKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfQ09NTUFORDsKK30KKworLyoqCisgKiBmYXMyMTZfc2VuZF9tZXNzYWdlb3V0IC0gaGFuZGxlIGJ1cyBzZXJ2aWNlIHRvIHNlbmQgYSBtZXNzYWdlCisgKiBAaW5mbzogaW50ZXJmYWNlIHdoaWNoIGNhdXNlZCBidXMgc2VydmljZQorICoKKyAqIEhhbmRsZSBidXMgc2VydmljZSB0byBzZW5kIGEgbWVzc2FnZS4KKyAqIE5vdGU6IFdlIGRvIG5vdCBhbGxvdyB0aGUgZGV2aWNlIHRvIGNoYW5nZSB0aGUgZGF0YSBkaXJlY3Rpb24hCisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9zZW5kX21lc3NhZ2VvdXQoRkFTMjE2X0luZm8gKmluZm8sIGludCBzdGFydCkKK3sKKwl1bnNpZ25lZCBpbnQgdG90X21zZ2xlbiA9IG1zZ3F1ZXVlX21zZ2xlbmd0aCgmaW5mby0+c2NzaS5tc2dzKTsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2NtZChpbmZvLCBDTURfRkxVU0hGSUZPKTsKKworCWlmICh0b3RfbXNnbGVuKSB7CisJCXN0cnVjdCBtZXNzYWdlICptc2c7CisJCWludCBtc2duciA9IDA7CisKKwkJd2hpbGUgKChtc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgbXNnbnIrKykpICE9IE5VTEwpIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSBzdGFydDsgaSA8IG1zZy0+bGVuZ3RoOyBpKyspCisJCQkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfRkYsIG1zZy0+bXNnW2ldKTsKKworCQkJbXNnLT5maWZvID0gdG90X21zZ2xlbiAtIChmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRik7CisJCQlzdGFydCA9IDA7CisJCX0KKwl9IGVsc2UKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfRkYsIE5PUCk7CisKKwlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8pOworCisJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVDsKK30KKworLyoqCisgKiBmYXMyMTZfYnVzc2VydmljZV9pbnRyIC0gaGFuZGxlIGJ1cyBzZXJ2aWNlIGludGVycnVwdCBmcm9tIEZBUzIxNiBjaGlwCisgKiBAaW5mbzogaW50ZXJmYWNlIHdoaWNoIGNhdXNlZCBidXMgc2VydmljZSBpbnRlcnJ1cHQKKyAqIEBzdGF0OiBTdGF0dXMgcmVnaXN0ZXIgY29udGVudHMKKyAqIEBpczogU0NTSSBTdGF0dXMgcmVnaXN0ZXIgY29udGVudHMKKyAqCisgKiBIYW5kbGUgYSBidXMgc2VydmljZSBpbnRlcnJ1cHQgZnJvbSBGQVMyMTYgY2hpcAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfYnVzc2VydmljZV9pbnRyKEZBUzIxNl9JbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgc3RhdCwgdW5zaWduZWQgaW50IGlzKQoreworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQlVTU0VSVklDRSwKKwkJICAgImJ1cyBzZXJ2aWNlOiBzdGF0PSUwMnggaXM9JTAyeCBwaGFzZT0lMDJ4IiwKKwkJICAgc3RhdCwgaXMsIGluZm8tPnNjc2kucGhhc2UpOworCisJc3dpdGNoIChpbmZvLT5zY3NpLnBoYXNlKSB7CisJY2FzZSBQSEFTRV9TRUxFQ1RJT046CisJCWlmICgoaXMgJiBJU19CSVRTKSAhPSBJU19NU0dCWVRFU0VOVCkKKwkJCWdvdG8gYmFkX2lzOworCQlicmVhazsKKworCWNhc2UgUEhBU0VfU0VMU1RFUFM6CisJCXN3aXRjaCAoaXMgJiBJU19CSVRTKSB7CisJCWNhc2UgSVNfU0VMQVJCOgorCQljYXNlIElTX01TR0JZVEVTRU5UOgorCQkJZ290byBiYWRfaXM7CisKKwkJY2FzZSBJU19OT1RDT01NQU5EOgorCQljYXNlIElTX0VBUkxZUEhBU0U6CisJCQlpZiAoKHN0YXQgJiBTVEFUX0JVU01BU0spID09IFNUQVRfTUVTR0lOKQorCQkJCWJyZWFrOworCQkJZ290byBiYWRfaXM7CisKKwkJY2FzZSBJU19DT01QTEVURToKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlmYXMyMTZfY21kKGluZm8sIENNRF9OT1ApOworCisjZGVmaW5lIFNUQVRFKHN0LHBoKSAoKHBoKSA8PCAzIHwgKHN0KSkKKwkvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgbGVnYWwgU0NTSSBzdGF0ZSB0cmFuc2l0aW9ucywKKwkgKiBhcyBkZXNjcmliZWQgYnkgdGhlIFNDU0kgSUkgc3BlYy4KKwkgKi8KKwlzd2l0Y2ggKFNUQVRFKHN0YXQgJiBTVEFUX0JVU01BU0ssIGluZm8tPnNjc2kucGhhc2UpKSB7CisJY2FzZSBTVEFURShTVEFUX0RBVEFJTiwgUEhBU0VfU0VMU1RFUFMpOi8qIFNlbCB3LyBzdGVwcyAtPiBEYXRhIEluICAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfREFUQUlOLCBQSEFTRV9NU0dPVVQpOiAgLyogTWVzc2FnZSBPdXQgIC0+IERhdGEgSW4gICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9EQVRBSU4sIFBIQVNFX0NPTU1BTkQpOiAvKiBDb21tYW5kICAgICAgLT4gRGF0YSBJbiAgICAgICovCisJY2FzZSBTVEFURShTVEFUX0RBVEFJTiwgUEhBU0VfTVNHSU4pOiAgIC8qIE1lc3NhZ2UgSW4gICAtPiBEYXRhIEluICAgICAgKi8KKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0RBVEFJTjsKKwkJZmFzMjE2X3RyYW5zZmVyKGluZm8pOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRFKFNUQVRfREFUQUlOLCBQSEFTRV9EQVRBSU4pOiAgLyogRGF0YSBJbiAgICAgIC0+IERhdGEgSW4gICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9EQVRBT1VULCBQSEFTRV9EQVRBT1VUKTovKiBEYXRhIE91dCAgICAgLT4gRGF0YSBPdXQgICAgICovCisJCWZhczIxNl9jbGVhbnVwdHJhbnNmZXIoaW5mbyk7CisJCWZhczIxNl90cmFuc2ZlcihpbmZvKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFURShTVEFUX0RBVEFPVVQsIFBIQVNFX1NFTFNURVBTKTovKiBTZWwgdy8gc3RlcHMtPiBEYXRhIE91dCAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfREFUQU9VVCwgUEhBU0VfTVNHT1VUKTogLyogTWVzc2FnZSBPdXQgIC0+IERhdGEgT3V0ICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9EQVRBT1VULCBQSEFTRV9DT01NQU5EKTovKiBDb21tYW5kICAgICAgLT4gRGF0YSBPdXQgICAgICovCisJY2FzZSBTVEFURShTVEFUX0RBVEFPVVQsIFBIQVNFX01TR0lOKTogIC8qIE1lc3NhZ2UgSW4gICAtPiBEYXRhIE91dCAgICAgKi8KKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfRkxVU0hGSUZPKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0RBVEFPVVQ7CisJCWZhczIxNl90cmFuc2ZlcihpbmZvKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFURShTVEFUX1NUQVRVUywgUEhBU0VfREFUQU9VVCk6IC8qIERhdGEgT3V0ICAgICAtPiBTdGF0dXMgICAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfU1RBVFVTLCBQSEFTRV9EQVRBSU4pOiAgLyogRGF0YSBJbiAgICAgIC0+IFN0YXR1cyAgICAgICAqLworCQlmYXMyMTZfc3RvcHRyYW5zZmVyKGluZm8pOworCWNhc2UgU1RBVEUoU1RBVF9TVEFUVVMsIFBIQVNFX1NFTFNURVBTKTovKiBTZWwgdy8gc3RlcHMgLT4gU3RhdHVzICAgICAgICovCisJY2FzZSBTVEFURShTVEFUX1NUQVRVUywgUEhBU0VfTVNHT1VUKTogIC8qIE1lc3NhZ2UgT3V0ICAtPiBTdGF0dXMgICAgICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfU1RBVFVTLCBQSEFTRV9DT01NQU5EKTogLyogQ29tbWFuZCAgICAgIC0+IFN0YXR1cyAgICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9TVEFUVVMsIFBIQVNFX01TR0lOKTogICAvKiBNZXNzYWdlIEluICAgLT4gU3RhdHVzICAgICAgICovCisJCWZhczIxNl9jbWQoaW5mbywgQ01EX0lOSVRDTURDT01QTEVURSk7CisJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9TVEFUVVM7CisJCXJldHVybjsKKworCWNhc2UgU1RBVEUoU1RBVF9NRVNHSU4sIFBIQVNFX0RBVEFPVVQpOiAvKiBEYXRhIE91dCAgICAgLT4gTWVzc2FnZSBJbiAgICovCisJY2FzZSBTVEFURShTVEFUX01FU0dJTiwgUEhBU0VfREFUQUlOKTogIC8qIERhdGEgSW4gICAgICAtPiBNZXNzYWdlIEluICAgKi8KKwkJZmFzMjE2X3N0b3B0cmFuc2ZlcihpbmZvKTsKKwljYXNlIFNUQVRFKFNUQVRfTUVTR0lOLCBQSEFTRV9DT01NQU5EKToJLyogQ29tbWFuZAktPiBNZXNzYWdlIEluCSovCisJY2FzZSBTVEFURShTVEFUX01FU0dJTiwgUEhBU0VfU0VMU1RFUFMpOi8qIFNlbCB3LyBzdGVwcyAtPiBNZXNzYWdlIEluICAgKi8KKwljYXNlIFNUQVRFKFNUQVRfTUVTR0lOLCBQSEFTRV9NU0dPVVQpOiAgLyogTWVzc2FnZSBPdXQgIC0+IE1lc3NhZ2UgSW4gICAqLworCQlpbmZvLT5zY3NpLm1zZ2luX2ZpZm8gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRjsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfRkxVU0hGSUZPKTsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfVFJBTlNGRVJJTkZPKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR0lOOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRFKFNUQVRfTUVTR0lOLCBQSEFTRV9NU0dJTik6CisJCWluZm8tPnNjc2kubXNnaW5fZmlmbyA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ0ZJUykgJiBDRklTX0NGOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8pOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRFKFNUQVRfQ09NTUFORCwgUEhBU0VfTVNHT1VUKTogLyogTWVzc2FnZSBPdXQgIC0+IENvbW1hbmQgICAgICAqLworCWNhc2UgU1RBVEUoU1RBVF9DT01NQU5ELCBQSEFTRV9NU0dJTik6ICAvKiBNZXNzYWdlIEluICAgLT4gQ29tbWFuZCAgICAgICovCisJCWZhczIxNl9zZW5kX2NvbW1hbmQoaW5mbyk7CisJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9DT01NQU5EOworCQlyZXR1cm47CisKKworCS8qCisJICogU2VsZWN0aW9uICAgIC0+IE1lc3NhZ2UgT3V0CisJICovCisJY2FzZSBTVEFURShTVEFUX01FU0dPVVQsIFBIQVNFX1NFTEVDVElPTik6CisJCWZhczIxNl9zZW5kX21lc3NhZ2VvdXQoaW5mbywgMSk7CisJCXJldHVybjsKKworCS8qCisJICogTWVzc2FnZSBPdXQgIC0+IE1lc3NhZ2UgT3V0CisJICovCisJY2FzZSBTVEFURShTVEFUX01FU0dPVVQsIFBIQVNFX1NFTFNURVBTKToKKwljYXNlIFNUQVRFKFNUQVRfTUVTR09VVCwgUEhBU0VfTVNHT1VUKToKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGFub3RoZXIgbWVzc2FnZSBvdXQgcGhhc2UsIHRoaXMgdXN1YWxseQorCQkgKiBtZWFucyBzb21lIHBhcml0eSBlcnJvciBvY2N1cnJlZC4gIFJlc2VuZCBjb21wbGV0ZQorCQkgKiBzZXQgb2YgbWVzc2FnZXMuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgYnl0ZSB0bworCQkgKiBzZW5kLCB3ZSBuZWVkIHRvIGFzc2VydCBBVE4gYWdhaW4uCisJCSAqLworCQlpZiAoaW5mby0+ZGV2aWNlW2luZm8tPlNDcG50LT5kZXZpY2UtPmlkXS5wYXJpdHlfY2hlY2spIHsKKwkJCS8qCisJCQkgKiBXZSB3ZXJlIHRlc3RpbmcuLi4gZ29vZCwgdGhlIGRldmljZQorCQkJICogc3VwcG9ydHMgcGFyaXR5IGNoZWNraW5nLgorCQkJICovCisJCQlpbmZvLT5kZXZpY2VbaW5mby0+U0NwbnQtPmRldmljZS0+aWRdLnBhcml0eV9jaGVjayA9IDA7CisJCQlpbmZvLT5kZXZpY2VbaW5mby0+U0NwbnQtPmRldmljZS0+aWRdLnBhcml0eV9lbmFibGVkID0gMTsKKwkJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSk7CisJCX0KKworCQlpZiAobXNncXVldWVfbXNnbGVuZ3RoKCZpbmZvLT5zY3NpLm1zZ3MpID4gMSkKKwkJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJCS8qRkFMTFRIUk9VR0gqLworCisJLyoKKwkgKiBBbnkgICAgICAgICAgLT4gTWVzc2FnZSBPdXQKKwkgKi8KKwljYXNlIFNUQVRFKFNUQVRfTUVTR09VVCwgUEhBU0VfTVNHT1VUX0VYUEVDVCk6CisJCWZhczIxNl9zZW5kX21lc3NhZ2VvdXQoaW5mbywgMCk7CisJCXJldHVybjsKKworCS8qIEVycm9yIHJlY292ZXJ5IHJ1bGVzLgorCSAqICAgVGhlc2UgZWl0aGVyIGF0dGVtcHQgdG8gYWJvcnQgb3IgcmV0cnkgdGhlIG9wZXJhdGlvbi4KKwkgKiBUT0RPOiB3ZSBuZWVkIG1vcmUgb2YgdGhlc2UKKwkgKi8KKwljYXNlIFNUQVRFKFNUQVRfQ09NTUFORCwgUEhBU0VfQ09NTUFORCk6LyogQ29tbWFuZCAgICAgIC0+IENvbW1hbmQgICAgICAqLworCQkvKiBlcnJvciAtIHdlJ3ZlIHNlbnQgb3V0IGFsbCB0aGUgY29tbWFuZCBieXRlcworCQkgKiB3ZSBoYXZlLgorCQkgKiBOT1RFOiB3ZSBuZWVkIFNBVkUgREFUQSBQT0lOVEVSUy9SRVNUT1JFIERBVEEgUE9JTlRFUlMKKwkJICogdG8gaW5jbHVkZSB0aGUgY29tbWFuZCBieXRlcyBzZW50IGZvciB0aGlzIHRvIHdvcmsKKwkJICogY29ycmVjdGx5LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQuJWM6ICIKKwkJCSJ0YXJnZXQgdHJ5aW5nIHRvIHJlY2VpdmUgbW9yZSBjb21tYW5kIGJ5dGVzXG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgZmFzMjE2X3RhcmdldChpbmZvKSk7CisJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFVEFUTik7CisJCWZhczIxNl9zZXRfc3RjKGluZm8sIDE1KTsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfUEFEQllURVMgfCBDTURfV0lUSERNQSk7CisJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgSU5JVElBVE9SX0VSUk9SKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVF9FWFBFQ1Q7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5mby0+c2NzaS5waGFzZSA9PSBQSEFTRV9NU0dJTl9ESVNDT05ORUNUKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBkaXNjb25uZWN0IG1lc3NhZ2UgcmVjZWl2ZWQsIGJ1dCBidXMgc2VydmljZSAlcz9cbiIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pLAorCQkJZmFzMjE2X2J1c19waGFzZShzdGF0KSk7CisJCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9TRVRBVE4pOworCQltc2dxdWV1ZV9hZGRtc2coJmluZm8tPnNjc2kubXNncywgMSwgSU5JVElBVE9SX0VSUk9SKTsKKwkJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX01TR09VVF9FWFBFQ1Q7CisJCWluZm8tPnNjc2kuYWJvcnRpbmcgPSAxOworCQlmYXMyMTZfY21kKGluZm8sIENNRF9UUkFOU0ZFUklORk8pOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBidXMgcGhhc2UgJXMgYWZ0ZXIgJXM/XG4iLAorCQlpbmZvLT5ob3N0LT5ob3N0X25vLCBmYXMyMTZfdGFyZ2V0KGluZm8pLAorCQlmYXMyMTZfYnVzX3BoYXNlKHN0YXQpLAorCQlmYXMyMTZfZHJ2X3BoYXNlKGluZm8pKTsKKwlwcmludF9kZWJ1Z19saXN0KCk7CisJcmV0dXJuOworCitiYWRfaXM6CisJZmFzMjE2X2xvZyhpbmZvLCAwLCAiYnVzIHNlcnZpY2UgYXQgc3RlcCAlZD8iLCBpcyAmIElTX0JJVFMpOworCWZhczIxNl9kdW1wc3RhdGUoaW5mbyk7CisJcHJpbnRfZGVidWdfbGlzdCgpOworCisJZmFzMjE2X2RvbmUoaW5mbywgRElEX0VSUk9SKTsKK30KKworLyoqCisgKiBmYXMyMTZfZnVuY2RvbmVfaW50ciAtIGhhbmRsZSBhIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0IGZyb20gRkFTMjE2IGNoaXAKKyAqIEBpbmZvOiBpbnRlcmZhY2Ugd2hpY2ggY2F1c2VkIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0CisgKiBAc3RhdDogU3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzCisgKiBAaXM6IFNDU0kgU3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzCisgKgorICogSGFuZGxlIGEgZnVuY3Rpb24gZG9uZSBpbnRlcnJ1cHQgZnJvbSBGQVMyMTYgY2hpcAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfZnVuY2RvbmVfaW50cihGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHN0YXQsIHVuc2lnbmVkIGludCBpcykKK3sKKwl1bnNpZ25lZCBpbnQgZmlmb19sZW4gPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0NGSVMpICYgQ0ZJU19DRjsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRlVOQ1RJT05ET05FLAorCQkgICAiZnVuY3Rpb24gZG9uZTogc3RhdD0lMDJ4IGlzPSUwMnggcGhhc2U9JTAyeCIsCisJCSAgIHN0YXQsIGlzLCBpbmZvLT5zY3NpLnBoYXNlKTsKKworCXN3aXRjaCAoaW5mby0+c2NzaS5waGFzZSkgeworCWNhc2UgUEhBU0VfU1RBVFVTOgkJCS8qIHN0YXR1cyBwaGFzZSAtIHJlYWQgc3RhdHVzIGFuZCBtc2cJKi8KKwkJaWYgKGZpZm9fbGVuICE9IDIpIHsKKwkJCWZhczIxNl9sb2coaW5mbywgMCwgIm9kZCBudW1iZXIgb2YgYnl0ZXMgaW4gRklGTzogJWQiLCBmaWZvX2xlbik7CisJCX0KKwkJLyoKKwkJICogUmVhZCBzdGF0dXMgdGhlbiBtZXNzYWdlIGJ5dGUuCisJCSAqLworCQlpbmZvLT5zY3NpLlNDcC5TdGF0dXMgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0ZGKTsKKwkJaW5mby0+c2NzaS5TQ3AuTWVzc2FnZSA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfRkYpOworCQlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfRE9ORTsKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfTVNHQUNDRVBURUQpOworCQlicmVhazsKKworCWNhc2UgUEhBU0VfSURMRToKKwljYXNlIFBIQVNFX1NFTEVDVElPTjoKKwljYXNlIFBIQVNFX1NFTFNURVBTOgorCQlicmVhazsKKworCWNhc2UgUEhBU0VfTVNHSU46CQkJLyogbWVzc2FnZSBpbiBwaGFzZQkJCSovCisJCWlmICgoc3RhdCAmIFNUQVRfQlVTTUFTSykgPT0gU1RBVF9NRVNHSU4pIHsKKwkJCWluZm8tPnNjc2kubXNnaW5fZmlmbyA9IGZpZm9fbGVuOworCQkJZmFzMjE2X21lc3NhZ2UoaW5mbyk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJZmFzMjE2X2xvZyhpbmZvLCAwLCAiaW50ZXJuYWwgcGhhc2UgJXMgZm9yIGZ1bmN0aW9uIGRvbmU/IgorCQkJIiAgV2hhdCBkbyBJIGRvIHdpdGggdGhpcz8iLAorCQkJZmFzMjE2X3RhcmdldChpbmZvKSwgZmFzMjE2X2Rydl9waGFzZShpbmZvKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfYnVzX3Jlc2V0KEZBUzIxNl9JbmZvICppbmZvKQoreworCW5lZ190IHN5bmNfc3RhdGU7CisJaW50IGk7CisKKwltc2dxdWV1ZV9mbHVzaCgmaW5mby0+c2NzaS5tc2dzKTsKKworCXN5bmNfc3RhdGUgPSBuZWdfaW52YWxpZDsKKworI2lmZGVmIFNDU0kyX1NZTkMKKwlpZiAoaW5mby0+aWZjZmcuY2FwYWJpbGl0aWVzICYgKEZBU0NBUF9ETUF8RkFTQ0FQX1BTRVVET0RNQSkpCisJCXN5bmNfc3RhdGUgPSBuZWdfd2FpdDsKKyNlbmRpZgorCisJaW5mby0+c2NzaS5waGFzZSA9IFBIQVNFX0lETEU7CisJaW5mby0+U0NwbnQgPSBOVUxMOyAvKiBidWchICovCisJbWVtc2V0KCZpbmZvLT5zY3NpLlNDcCwgMCwgc2l6ZW9mKGluZm8tPnNjc2kuU0NwKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWluZm8tPmRldmljZVtpXS5kaXNjb25uZWN0X29rCT0gaW5mby0+aWZjZmcuZGlzY29ubmVjdF9vazsKKwkJaW5mby0+ZGV2aWNlW2ldLnN5bmNfc3RhdGUJPSBzeW5jX3N0YXRlOworCQlpbmZvLT5kZXZpY2VbaV0ucGVyaW9kCQk9IGluZm8tPmlmY2ZnLmFzeW5jcGVyaW9kIC8gNDsKKwkJaW5mby0+ZGV2aWNlW2ldLnN0cAkJPSBpbmZvLT5zY3NpLmFzeW5jX3N0cDsKKwkJaW5mby0+ZGV2aWNlW2ldLnNvZgkJPSAwOworCQlpbmZvLT5kZXZpY2VbaV0ud2lkZV94ZmVyCT0gMDsKKwl9CisKKwlpbmZvLT5yc3RfYnVzX3N0YXR1cyA9IDE7CisJd2FrZV91cCgmaW5mby0+ZWhfd2FpdCk7Cit9CisKKy8qKgorICogZmFzMjE2X2ludHIgLSBoYW5kbGUgaW50ZXJydXB0cyB0byBwcm9ncmVzcyBhIGNvbW1hbmQKKyAqIEBpbmZvOiBpbnRlcmZhY2UgdG8gc2VydmljZQorICoKKyAqIEhhbmRsZSBpbnRlcnJ1cHRzIGZyb20gdGhlIGludGVyZmFjZSB0byBwcm9ncmVzcyBhIGNvbW1hbmQKKyAqLworaXJxcmV0dXJuX3QgZmFzMjE2X2ludHIoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgY2hhciBpbnN0LCBpcywgc3RhdDsKKwlpbnQgaGFuZGxlZCA9IElSUV9OT05FOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlzdGF0ID0gZmFzMjE2X3JlYWRiKGluZm8sIFJFR19TVEFUKTsKKwlpcyA9IGZhczIxNl9yZWFkYihpbmZvLCBSRUdfSVMpOworCWluc3QgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lOU1QpOworCisJYWRkX2RlYnVnX2xpc3Qoc3RhdCwgaXMsIGluc3QsIGluZm8tPnNjc2kucGhhc2UpOworCisJaWYgKHN0YXQgJiBTVEFUX0lOVCkgeworCQlpZiAoaW5zdCAmIElOU1RfQlVTUkVTRVQpIHsKKwkJCWZhczIxNl9sb2coaW5mbywgMCwgImJ1cyByZXNldCBkZXRlY3RlZCIpOworCQkJZmFzMjE2X2J1c19yZXNldChpbmZvKTsKKwkJCXNjc2lfcmVwb3J0X2J1c19yZXNldChpbmZvLT5ob3N0LCAwKTsKKwkJfSBlbHNlIGlmIChpbnN0ICYgSU5TVF9JTExFR0FMQ01EKSB7CisJCQlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgImlsbGVnYWwgY29tbWFuZCBnaXZlblxuIik7CisJCQlmYXMyMTZfZHVtcHN0YXRlKGluZm8pOworCQkJcHJpbnRfZGVidWdfbGlzdCgpOworCQl9IGVsc2UgaWYgKGluc3QgJiBJTlNUX0RJU0NPTk5FQ1QpCisJCQlmYXMyMTZfZGlzY29ubmVjdF9pbnRyKGluZm8pOworCQllbHNlIGlmIChpbnN0ICYgSU5TVF9SRVNFTEVDVEVEKQkvKiByZXNlbGVjdGVkCQkJKi8KKwkJCWZhczIxNl9yZXNlbGVjdGVkX2ludHIoaW5mbyk7CisJCWVsc2UgaWYgKGluc3QgJiBJTlNUX0JVU1NFUlZJQ0UpCS8qIGJ1cyBzZXJ2aWNlIHJlcXVlc3QJCSovCisJCQlmYXMyMTZfYnVzc2VydmljZV9pbnRyKGluZm8sIHN0YXQsIGlzKTsKKwkJZWxzZSBpZiAoaW5zdCAmIElOU1RfRlVOQ0RPTkUpCQkvKiBmdW5jdGlvbiBkb25lCQkqLworCQkJZmFzMjE2X2Z1bmNkb25lX2ludHIoaW5mbywgc3RhdCwgaXMpOworCQllbHNlCisJCSAgICAJZmFzMjE2X2xvZyhpbmZvLCAwLCAidW5rbm93biBpbnRlcnJ1cHQgcmVjZWl2ZWQ6IgorCQkJCSIgcGhhc2UgJXMgaW5zdCAlMDJYIGlzICUwMlggc3RhdCAlMDJYIiwKKwkJCQlmYXMyMTZfZHJ2X3BoYXNlKGluZm8pLCBpbnN0LCBpcywgc3RhdCk7CisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZmFzMjE2X3N0YXJ0X2NvbW1hbmQoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQpCit7CisJaW50IHRvdF9tc2dsZW47CisKKwkvKiBmb2xsb3dpbmcgd2hhdCB0aGUgRVNQIGRyaXZlciBzYXlzICovCisJZmFzMjE2X3NldF9zdGMoaW5mbywgMCk7CisJZmFzMjE2X2NtZChpbmZvLCBDTURfTk9QIHwgQ01EX1dJVEhETUEpOworCisJLyogZmx1c2ggRklGTyAqLworCWZhczIxNl9jbWQoaW5mbywgQ01EX0ZMVVNIRklGTyk7CisKKwkvKiBsb2FkIGJ1cy1pZCBhbmQgdGltZW91dCAqLworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NESUQsIEJVU0lEKFNDcG50LT5kZXZpY2UtPmlkKSk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfU1RJTSwgaW5mby0+aWZjZmcuc2VsZWN0X3RpbWVvdXQpOworCisJLyogc3luY2hyb25vdXMgdHJhbnNmZXJzICovCisJZmFzMjE2X3NldF9zeW5jKGluZm8sIFNDcG50LT5kZXZpY2UtPmlkKTsKKworCXRvdF9tc2dsZW4gPSBtc2dxdWV1ZV9tc2dsZW5ndGgoJmluZm8tPnNjc2kubXNncyk7CisKKyNpZmRlZiBERUJVR19NRVNTQUdFUworCXsKKwkJc3RydWN0IG1lc3NhZ2UgKm1zZzsKKwkJaW50IG1zZ25yID0gMCwgaTsKKworCQlwcmludGsoInNjc2klZC4lYzogbWVzc2FnZSBvdXQ6ICIsCisJCQlpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCk7CisJCXdoaWxlICgobXNnID0gbXNncXVldWVfZ2V0bXNnKCZpbmZvLT5zY3NpLm1zZ3MsIG1zZ25yKyspKSAhPSBOVUxMKSB7CisJCQlwcmludGsoInsgIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbXNnLT5sZW5ndGg7IGkrKykKKwkJCQlwcmludGsoIiUwMnggIiwgbXNnLT5tc2dbaV0pOworCQkJcHJpbnRrKCJ9ICIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKworCWlmICh0b3RfbXNnbGVuID09IDEgfHwgdG90X21zZ2xlbiA9PSAzKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYW4gZWFzeSBtZXNzYWdlIGxlbmd0aCB0byBzZW5kLi4uCisJCSAqLworCQlzdHJ1Y3QgbWVzc2FnZSAqbXNnOworCQlpbnQgbXNnbnIgPSAwLCBpOworCisJCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9TRUxTVEVQUzsKKworCQkvKiBsb2FkIG1lc3NhZ2UgYnl0ZXMgKi8KKwkJd2hpbGUgKChtc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgbXNnbnIrKykpICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBtc2ctPmxlbmd0aDsgaSsrKQorCQkJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0ZGLCBtc2ctPm1zZ1tpXSk7CisJCQltc2ctPmZpZm8gPSB0b3RfbXNnbGVuIC0gKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ0ZJUykgJiBDRklTX0NGKTsKKwkJfQorCisJCS8qIGxvYWQgY29tbWFuZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0ZGLCBTQ3BudC0+Y21uZFtpXSk7CisKKwkJaWYgKHRvdF9tc2dsZW4gPT0gMSkKKwkJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFTEVDVEFUTik7CisJCWVsc2UKKwkJCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFTEVDVEFUTjMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYW4gdW51c3VhbCBudW1iZXIgb2YgbWVzc2FnZSBieXRlcyB0byBzZW5kLgorCQkgKiAgTG9hZCBmaXJzdCBieXRlIGludG8gZmlmbywgYW5kIGlzc3VlIFNFTEVDVCB3aXRoIEFUTiBhbmQKKwkJICogIHN0b3Agc3RlcHMuCisJCSAqLworCQlzdHJ1Y3QgbWVzc2FnZSAqbXNnID0gbXNncXVldWVfZ2V0bXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDApOworCisJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0ZGLCBtc2ctPm1zZ1swXSk7CisJCW1zZy0+ZmlmbyA9IDE7CisKKwkJZmFzMjE2X2NtZChpbmZvLCBDTURfU0VMRUNUQVROU1RPUCk7CisJfQorfQorCisvKgorICogRGVjaWRlIHdoZXRoZXIgd2UgbmVlZCB0byBwZXJmb3JtIGEgcGFyaXR5IHRlc3Qgb24gdGhpcyBkZXZpY2UuCisgKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGZvcmNlIHBhcml0eSBlcnJvciBjb25kaXRpb25zIGR1cmluZyBpbml0aWFsCisgKiBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZSAobWVzc2FnZSBvdXQpIGZvciB0ZXN0IHB1cnBvc2VzLgorICovCitzdGF0aWMgaW50IHBhcml0eV90ZXN0KEZBUzIxNl9JbmZvICppbmZvLCBpbnQgdGFyZ2V0KQoreworI2lmIDAKKwlpZiAodGFyZ2V0ID09IDMpIHsKKwkJaW5mby0+ZGV2aWNlW3RhcmdldF0ucGFyaXR5X2NoZWNrID0gMDsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIGluZm8tPmRldmljZVt0YXJnZXRdLnBhcml0eV9jaGVjazsKK30KKworc3RhdGljIHZvaWQgZmFzMjE2X3N0YXJ0X2NvbW1hbmQoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQpCit7CisJaW50IGRpc2Nvbm5lY3Rfb2s7CisKKwkvKgorCSAqIGNsYWltIGhvc3QgYnVzeQorCSAqLworCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9TRUxFQ1RJT047CisJaW5mby0+c2NzaS5TQ3AgPSBTQ3BudC0+U0NwOworCWluZm8tPlNDcG50ID0gU0NwbnQ7CisJaW5mby0+ZG1hLnRyYW5zZmVyX3R5cGUgPSBmYXNkbWFfbm9uZTsKKworCWlmIChwYXJpdHlfdGVzdChpbmZvLCBTQ3BudC0+ZGV2aWNlLT5pZCkpCisJCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSB8IENOVEwxX1BURSk7CisJZWxzZQorCQlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMSwgaW5mby0+c2NzaS5jZmdbMF0pOworCisJLyoKKwkgKiBEb24ndCBhbGxvdyByZXF1ZXN0IHNlbnNlIGNvbW1hbmRzIHRvIGRpc2Nvbm5lY3QuCisJICovCisJZGlzY29ubmVjdF9vayA9IFNDcG50LT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgJiYKKwkJCWluZm8tPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF0uZGlzY29ubmVjdF9vazsKKworCS8qCisJICogYnVpbGQgb3V0Z29pbmcgbWVzc2FnZSBieXRlcworCSAqLworCW1zZ3F1ZXVlX2ZsdXNoKCZpbmZvLT5zY3NpLm1zZ3MpOworCW1zZ3F1ZXVlX2FkZG1zZygmaW5mby0+c2NzaS5tc2dzLCAxLCBJREVOVElGWShkaXNjb25uZWN0X29rLCBTQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKworCS8qCisJICogYWRkIHRhZyBtZXNzYWdlIGlmIHJlcXVpcmVkCisJICovCisJaWYgKFNDcG50LT50YWcpCisJCW1zZ3F1ZXVlX2FkZG1zZygmaW5mby0+c2NzaS5tc2dzLCAyLCBTSU1QTEVfUVVFVUVfVEFHLCBTQ3BudC0+dGFnKTsKKworCWRvIHsKKyNpZmRlZiBTQ1NJMl9TWU5DCisJCWlmICgoaW5mby0+ZGV2aWNlW1NDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID09IG5lZ193YWl0IHx8CisJCSAgICAgaW5mby0+ZGV2aWNlW1NDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3N0YXRlID09IG5lZ19jb21wbGV0ZSkgJiYKKwkJICAgIChTQ3BudC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFIHx8CisJCSAgICAgU0NwbnQtPmNtbmRbMF0gPT0gSU5RVUlSWSkpIHsKKwkJCWluZm8tPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF0uc3luY19zdGF0ZSA9IG5lZ19pbnByb2dyZXNzOworCQkJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDUsCisJCQkJCUVYVEVOREVEX01FU1NBR0UsIDMsIEVYVEVOREVEX1NEVFIsCisJCQkJCTEwMDAgLyBpbmZvLT5pZmNmZy5jbG9ja3JhdGUsCisJCQkJCWluZm8tPmlmY2ZnLnN5bmNfbWF4X2RlcHRoKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwl9IHdoaWxlICgwKTsKKworCV9fZmFzMjE2X3N0YXJ0X2NvbW1hbmQoaW5mbywgU0NwbnQpOworfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfYWxsb2NhdGVfdGFnKEZBUzIxNl9JbmZvICppbmZvLCBTY3NpX0NtbmQgKlNDcG50KQoreworI2lmZGVmIFNDU0kyX1RBRworCS8qCisJICogdGFnZ2VkIHF1ZXVpbmcgLSBhbGxvY2F0ZSBhIG5ldyB0YWcgdG8gdGhpcyBjb21tYW5kCisJICovCisJaWYgKFNDcG50LT5kZXZpY2UtPnNpbXBsZV90YWdzICYmIFNDcG50LT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgJiYKKwkgICAgU0NwbnQtPmNtbmRbMF0gIT0gSU5RVUlSWSkgeworCSAgICBTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZyArPSAxOworCQlpZiAoU0NwbnQtPmRldmljZS0+Y3VycmVudF90YWcgPT0gMCkKKwkJICAgIFNDcG50LT5kZXZpY2UtPmN1cnJlbnRfdGFnID0gMTsKKwkJCVNDcG50LT50YWcgPSBTQ3BudC0+ZGV2aWNlLT5jdXJyZW50X3RhZzsKKwl9IGVsc2UKKyNlbmRpZgorCQlzZXRfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaW5mby0+YnVzeWx1bnMpOworCisJaW5mby0+c3RhdHMucmVtb3ZlcyArPSAxOworCXN3aXRjaCAoU0NwbnQtPmNtbmRbMF0pIHsKKwljYXNlIFdSSVRFXzY6CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFdSSVRFXzEyOgorCQlpbmZvLT5zdGF0cy53cml0ZXMgKz0gMTsKKwkJYnJlYWs7CisJY2FzZSBSRUFEXzY6CisJY2FzZSBSRUFEXzEwOgorCWNhc2UgUkVBRF8xMjoKKwkJaW5mby0+c3RhdHMucmVhZHMgKz0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5mby0+c3RhdHMubWlzY3MgKz0gMTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBmYXMyMTZfZG9fYnVzX2RldmljZV9yZXNldChGQVMyMTZfSW5mbyAqaW5mbywgU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3QgbWVzc2FnZSAqbXNnOworCisJLyoKKwkgKiBjbGFpbSBob3N0IGJ1c3kKKwkgKi8KKwlpbmZvLT5zY3NpLnBoYXNlID0gUEhBU0VfU0VMRUNUSU9OOworCWluZm8tPnNjc2kuU0NwID0gU0NwbnQtPlNDcDsKKwlpbmZvLT5TQ3BudCA9IFNDcG50OworCWluZm8tPmRtYS50cmFuc2Zlcl90eXBlID0gZmFzZG1hX25vbmU7CisKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgInNlbmRpbmcgYnVzIGRldmljZSByZXNldCIpOworCisJbXNncXVldWVfZmx1c2goJmluZm8tPnNjc2kubXNncyk7CisJbXNncXVldWVfYWRkbXNnKCZpbmZvLT5zY3NpLm1zZ3MsIDEsIEJVU19ERVZJQ0VfUkVTRVQpOworCisJLyogZm9sbG93aW5nIHdoYXQgdGhlIEVTUCBkcml2ZXIgc2F5cyAqLworCWZhczIxNl9zZXRfc3RjKGluZm8sIDApOworCWZhczIxNl9jbWQoaW5mbywgQ01EX05PUCB8IENNRF9XSVRIRE1BKTsKKworCS8qIGZsdXNoIEZJRk8gKi8KKwlmYXMyMTZfY21kKGluZm8sIENNRF9GTFVTSEZJRk8pOworCisJLyogbG9hZCBidXMtaWQgYW5kIHRpbWVvdXQgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TRElELCBCVVNJRChTQ3BudC0+ZGV2aWNlLT5pZCkpOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NUSU0sIGluZm8tPmlmY2ZnLnNlbGVjdF90aW1lb3V0KTsKKworCS8qIHN5bmNocm9ub3VzIHRyYW5zZmVycyAqLworCWZhczIxNl9zZXRfc3luYyhpbmZvLCBTQ3BudC0+ZGV2aWNlLT5pZCk7CisKKwltc2cgPSBtc2dxdWV1ZV9nZXRtc2coJmluZm8tPnNjc2kubXNncywgMCk7CisKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19GRiwgQlVTX0RFVklDRV9SRVNFVCk7CisJbXNnLT5maWZvID0gMTsKKworCWZhczIxNl9jbWQoaW5mbywgQ01EX1NFTEVDVEFUTlNUT1ApOworfQorCisvKioKKyAqIGZhczIxNl9raWNrIC0ga2ljayBhIGNvbW1hbmQgdG8gdGhlIGludGVyZmFjZQorICogQGluZm86IG91ciBob3N0IGludGVyZmFjZSB0byBraWNrCisgKgorICogS2ljayBhIGNvbW1hbmQgdG8gdGhlIGludGVyZmFjZSwgaW50ZXJmYWNlIHNob3VsZCBiZSBpZGxlLgorICogTm90ZXM6IEludGVycnVwdHMgYXJlIGFsd2F5cyBkaXNhYmxlZCEKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X2tpY2soRkFTMjE2X0luZm8gKmluZm8pCit7CisJU2NzaV9DbW5kICpTQ3BudCA9IE5VTEw7CisjZGVmaW5lIFRZUEVfT1RIRVIJMAorI2RlZmluZSBUWVBFX1JFU0VUCTEKKyNkZWZpbmUgVFlQRV9RVUVVRQkyCisJaW50IHdoZXJlX2Zyb20gPSBUWVBFX09USEVSOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwkvKgorCSAqIE9idGFpbiB0aGUgbmV4dCBjb21tYW5kIHRvIHByb2Nlc3MuCisJICovCisJZG8geworCQlpZiAoaW5mby0+cnN0U0NwbnQpIHsKKwkJCVNDcG50ID0gaW5mby0+cnN0U0NwbnQ7CisJCQkvKiBkb24ndCByZW1vdmUgaXQgKi8KKwkJCXdoZXJlX2Zyb20gPSBUWVBFX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW5mby0+cmVxU0NwbnQpIHsKKwkJCVNDcG50ID0gaW5mby0+cmVxU0NwbnQ7CisJCQlpbmZvLT5yZXFTQ3BudCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpbmZvLT5vcmlnU0NwbnQpIHsKKwkJCVNDcG50ID0gaW5mby0+b3JpZ1NDcG50OworCQkJaW5mby0+b3JpZ1NDcG50ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmV0cmlldmUgbmV4dCBjb21tYW5kICovCisJCWlmICghU0NwbnQpIHsKKwkJCVNDcG50ID0gcXVldWVfcmVtb3ZlX2V4Y2x1ZGUoJmluZm8tPnF1ZXVlcy5pc3N1ZSwKKwkJCQkJCSAgICAgaW5mby0+YnVzeWx1bnMpOworCQkJd2hlcmVfZnJvbSA9IFRZUEVfUVVFVUU7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDApOworCisJaWYgKCFTQ3BudCkgeworCQkvKgorCQkgKiBubyBjb21tYW5kIHBlbmRpbmcsIHNvIGVuYWJsZSByZXNlbGVjdGlvbi4KKwkJICovCisJCWZhczIxNl9jbWQoaW5mbywgQ01EX0VOQUJMRVNFTCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlJ3JlIGdvaW5nIHRvIHN0YXJ0IGEgY29tbWFuZCwgc28gZGlzYWJsZSByZXNlbGVjdGlvbgorCSAqLworCWZhczIxNl9jbWQoaW5mbywgQ01EX0RJU0FCTEVTRUwpOworCisJaWYgKGluZm8tPnNjc2kuZGlzY29ubmVjdGFibGUgJiYgaW5mby0+U0NwbnQpIHsKKwkJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwKKwkJCSJtb3ZlZCBjb21tYW5kIGZvciAlZCB0byBkaXNjb25uZWN0ZWQgcXVldWUiLAorCQkJaW5mby0+U0NwbnQtPmRldmljZS0+aWQpOworCQlxdWV1ZV9hZGRfY21kX3RhaWwoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQsIGluZm8tPlNDcG50KTsKKwkJaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJCWluZm8tPlNDcG50ID0gTlVMTDsKKwl9CisKKwlmYXMyMTZfbG9nX2NvbW1hbmQoaW5mbywgTE9HX0NPTk5FQ1QgfCBMT0dfTUVTU0FHRVMsIFNDcG50LAorCQkJICAgInN0YXJ0aW5nIik7CisKKwlzd2l0Y2ggKHdoZXJlX2Zyb20pIHsKKwljYXNlIFRZUEVfUVVFVUU6CisJCWZhczIxNl9hbGxvY2F0ZV90YWcoaW5mbywgU0NwbnQpOworCWNhc2UgVFlQRV9PVEhFUjoKKwkJZmFzMjE2X3N0YXJ0X2NvbW1hbmQoaW5mbywgU0NwbnQpOworCQlicmVhazsKKwljYXNlIFRZUEVfUkVTRVQ6CisJCWZhczIxNl9kb19idXNfZGV2aWNlX3Jlc2V0KGluZm8sIFNDcG50KTsKKwkJYnJlYWs7CisJfQorCisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfQ09OTkVDVCwgInNlbGVjdDogZGF0YSBwb2ludGVycyBbJXAsICVYXSIsCisJCWluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCk7CisKKwkvKgorCSAqIHNob3VsZCBub3cgZ2V0IGVpdGhlciBESVNDT05ORUNUIG9yCisJICogKEZVTkNUSU9OIERPTkUgd2l0aCBCVVMgU0VSVklDRSkgaW50ZXJydXB0CisJICovCit9CisKKy8qCisgKiBDbGVhbiB1cCBmcm9tIGlzc3VpbmcgYSBCVVMgREVWSUNFIFJFU0VUIG1lc3NhZ2UgdG8gYSBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkCitmYXMyMTZfZGV2aWNlcmVzZXRfZG9uZShGQVMyMTZfSW5mbyAqaW5mbywgU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IHJlc3VsdCkKK3sKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgImZhczIxNiBkZXZpY2UgcmVzZXQgY29tcGxldGUiKTsKKworCWluZm8tPnJzdFNDcG50ID0gTlVMTDsKKwlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IDE7CisJd2FrZV91cCgmaW5mby0+ZWhfd2FpdCk7Cit9CisKKy8qKgorICogZmFzMjE2X3JxX3Nuc19kb25lIC0gRmluaXNoIHByb2Nlc3NpbmcgYXV0b21hdGljIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZAorICogQGluZm86IGludGVyZmFjZSB0aGF0IGNvbXBsZXRlZAorICogQFNDcG50OiBjb21tYW5kIHRoYXQgY29tcGxldGVkCisgKiBAcmVzdWx0OiBkcml2ZXIgYnl0ZSBvZiByZXN1bHQKKyAqCisgKiBGaW5pc2ggcHJvY2Vzc2luZyBhdXRvbWF0aWMgcmVxdWVzdCBzZW5zZSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitmYXMyMTZfcnFfc25zX2RvbmUoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXN1bHQpCit7CisJZmFzMjE2X2xvZ190YXJnZXQoaW5mbywgTE9HX0NPTk5FQ1QsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkgICAicmVxdWVzdCBzZW5zZSBjb21wbGV0ZSwgcmVzdWx0PTB4JTA0eCUwMnglMDJ4IiwKKwkJICAgcmVzdWx0LCBTQ3BudC0+U0NwLk1lc3NhZ2UsIFNDcG50LT5TQ3AuU3RhdHVzKTsKKworCWlmIChyZXN1bHQgIT0gRElEX09LIHx8IFNDcG50LT5TQ3AuU3RhdHVzICE9IEdPT0QpCisJCS8qCisJCSAqIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QKKwkJICogaGF2ZSB2YWxpZCBkYXRhIGluIHRoZSBzZW5zZSBidWZmZXIgdGhhdCBjb3VsZAorCQkgKiBjb25mdXNlIHRoZSBoaWdoZXIgbGV2ZWxzLgorCQkgKi8KKwkJbWVtc2V0KFNDcG50LT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihTQ3BudC0+c2Vuc2VfYnVmZmVyKSk7CisvL3ByaW50aygic2NzaSVkLiVjOiBzZW5zZSBidWZmZXI6ICIsIGluZm8tPmhvc3QtPmhvc3Rfbm8sICcwJyArIFNDcG50LT5kZXZpY2UtPmlkKTsKKy8veyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHByaW50aygiJTAyeCAiLCBTQ3BudC0+c2Vuc2VfYnVmZmVyW2ldKTsgcHJpbnRrKCJcbiIpOyB9CisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgZG9uJ3Qgc2V0IFNDcG50LT5yZXN1bHQsIHNpbmNlIHRoYXQgc2hvdWxkCisJICogcmVmbGVjdCB0aGUgc3RhdHVzIG9mIHRoZSBjb21tYW5kIHRoYXQgd2Ugd2VyZSBhc2tlZCBieQorCSAqIHRoZSB1cHBlciBsYXllcnMgdG8gcHJvY2Vzcy4gIFRoaXMgd291bGQgaGF2ZSBiZWVuIHNldAorCSAqIGNvcnJlY3RseSBieSBmYXMyMTZfc3RkX2RvbmUuCisJICovCisJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7Cit9CisKKy8qKgorICogZmFzMjE2X3N0ZF9kb25lIC0gZmluaXNoIHByb2Nlc3Npbmcgb2Ygc3RhbmRhcmQgY29tbWFuZAorICogQGluZm86IGludGVyZmFjZSB0aGF0IGNvbXBsZXRlZAorICogQFNDcG50OiBjb21tYW5kIHRoYXQgY29tcGxldGVkCisgKiBAcmVzdWx0OiBkcml2ZXIgYnl0ZSBvZiByZXN1bHQKKyAqCisgKiBGaW5pc2ggcHJvY2Vzc2luZyBvZiBzdGFuZGFyZCBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitmYXMyMTZfc3RkX2RvbmUoRkFTMjE2X0luZm8gKmluZm8sIFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXN1bHQpCit7CisJaW5mby0+c3RhdHMuZmlucyArPSAxOworCisJU0NwbnQtPnJlc3VsdCA9IHJlc3VsdCA8PCAxNiB8IGluZm8tPnNjc2kuU0NwLk1lc3NhZ2UgPDwgOCB8CisJCQlpbmZvLT5zY3NpLlNDcC5TdGF0dXM7CisKKwlmYXMyMTZfbG9nX2NvbW1hbmQoaW5mbywgTE9HX0NPTk5FQ1QsIFNDcG50LAorCQkiY29tbWFuZCBjb21wbGV0ZSwgcmVzdWx0PTB4JTA4eCIsIFNDcG50LT5yZXN1bHQpOworCisJLyoKKwkgKiBJZiB0aGUgZHJpdmVyIGRldGVjdGVkIGFuIGVycm9yLCB3ZSdyZSBhbGwgZG9uZS4KKwkgKi8KKwlpZiAoaG9zdF9ieXRlKFNDcG50LT5yZXN1bHQpICE9IERJRF9PSyB8fAorCSAgICBtc2dfYnl0ZShTQ3BudC0+cmVzdWx0KSAhPSBDT01NQU5EX0NPTVBMRVRFKQorCQlnb3RvIGRvbmU7CisKKwkvKgorCSAqIElmIHRoZSBjb21tYW5kIHJldHVybmVkIENIRUNLX0NPTkRJVElPTiBvciBDT01NQU5EX1RFUk1JTkFURUQKKwkgKiBzdGF0dXMsIHJlcXVlc3QgdGhlIHNlbnNlIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChzdGF0dXNfYnl0ZShTQ3BudC0+cmVzdWx0KSA9PSBDSEVDS19DT05ESVRJT04gfHwKKwkgICAgc3RhdHVzX2J5dGUoU0NwbnQtPnJlc3VsdCkgPT0gQ09NTUFORF9URVJNSU5BVEVEKQorCQlnb3RvIHJlcXVlc3Rfc2Vuc2U7CisKKwkvKgorCSAqIElmIHRoZSBjb21tYW5kIGRpZCBub3QgY29tcGxldGUgd2l0aCBHT09EIHN0YXR1cywKKwkgKiB3ZSBhcmUgYWxsIGRvbmUgaGVyZS4KKwkgKi8KKwlpZiAoc3RhdHVzX2J5dGUoU0NwbnQtPnJlc3VsdCkgIT0gR09PRCkKKwkJZ290byBkb25lOworCisJLyoKKwkgKiBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYSBjb21tYW5kLiAgTWFrZSBzdXJlIHRoYXQKKwkgKiB3ZSBkbyBub3QgaGF2ZSBhbnkgYnVmZmVycyBsZWZ0IHRvIHRyYW5zZmVyLiAgVGhlIHdvcmxkCisJICogaXMgbm90IHBlcmZlY3QsIGFuZCB3ZSBzZWVtIHRvIG9jY2FzaW9uYWxseSBoaXQgdGhpcy4KKwkgKiBJdCBjYW4gYmUgaW5kaWNhdGl2ZSBvZiBhIGJ1Z2d5IGRyaXZlciwgdGFyZ2V0IG9yIHRoZSB1cHBlcgorCSAqIGxldmVscyBvZiB0aGUgU0NTSSBjb2RlLgorCSAqLworCWlmIChpbmZvLT5zY3NpLlNDcC5wdHIpIHsKKwkJc3dpdGNoIChTQ3BudC0+Y21uZFswXSkgeworCQljYXNlIElOUVVJUlk6CisJCWNhc2UgU1RBUlRfU1RPUDoKKwkJY2FzZSBNT0RFX1NFTlNFOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkLiVjOiBpbmNvbXBsZXRlIGRhdGEgdHJhbnNmZXIgIgorCQkJCSJkZXRlY3RlZDogcmVzPSUwOFggcHRyPSVwIGxlbj0lWCBDREI6ICIsCisJCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgJzAnICsgU0NwbnQtPmRldmljZS0+aWQsCisJCQkJU0NwbnQtPnJlc3VsdCwgaW5mby0+c2NzaS5TQ3AucHRyLAorCQkJCWluZm8tPnNjc2kuU0NwLnRoaXNfcmVzaWR1YWwpOworCQkJcHJpbnRfY29tbWFuZChTQ3BudC0+Y21uZCk7CisJCQlTQ3BudC0+cmVzdWx0ICY9IH4oMjU1IDw8IDE2KTsKKwkJCVNDcG50LT5yZXN1bHQgfD0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCQlnb3RvIHJlcXVlc3Rfc2Vuc2U7CisJCX0KKwl9CisKK2RvbmU6CisJaWYgKFNDcG50LT5zY3NpX2RvbmUpIHsKKwkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisJCXJldHVybjsKKwl9CisKKwlwYW5pYygic2NzaSVkLkg6IG51bGwgc2NzaV9kb25lIGZ1bmN0aW9uIGluIGZhczIxNl9kb25lIiwKKwkJaW5mby0+aG9zdC0+aG9zdF9ubyk7CisKKworcmVxdWVzdF9zZW5zZToKKwlpZiAoU0NwbnQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkKKwkJZ290byBkb25lOworCisJZmFzMjE2X2xvZ190YXJnZXQoaW5mbywgTE9HX0NPTk5FQ1QsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkJICAicmVxdWVzdGluZyBzZW5zZSIpOworCW1lbXNldChTQ3BudC0+Y21uZCwgMCwgc2l6ZW9mIChTQ3BudC0+Y21uZCkpOworCVNDcG50LT5jbW5kWzBdID0gUkVRVUVTVF9TRU5TRTsKKwlTQ3BudC0+Y21uZFsxXSA9IFNDcG50LT5kZXZpY2UtPmx1biA8PCA1OworCVNDcG50LT5jbW5kWzRdID0gc2l6ZW9mKFNDcG50LT5zZW5zZV9idWZmZXIpOworCVNDcG50LT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKFNDcG50LT5jbW5kWzBdKTsKKwlTQ3BudC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwlTQ3BudC0+U0NwLnB0ciA9IChjaGFyICopU0NwbnQtPnNlbnNlX2J1ZmZlcjsKKwlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBzaXplb2YoU0NwbnQtPnNlbnNlX2J1ZmZlcik7CisJU0NwbnQtPlNDcC5NZXNzYWdlID0gMDsKKwlTQ3BudC0+U0NwLlN0YXR1cyA9IDA7CisJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihTQ3BudC0+c2Vuc2VfYnVmZmVyKTsKKwlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfUkVBRDsKKwlTQ3BudC0+dXNlX3NnID0gMDsKKwlTQ3BudC0+dGFnID0gMDsKKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopZmFzMjE2X3JxX3Nuc19kb25lOworCisJLyoKKwkgKiBQbGFjZSB0aGlzIGNvbW1hbmQgaW50byB0aGUgaGlnaCBwcmlvcml0eSAicmVxdWVzdAorCSAqIHNlbnNlIiBzbG90LiAgVGhpcyB3aWxsIGJlIHRoZSB2ZXJ5IG5leHQgY29tbWFuZAorCSAqIGV4ZWN1dGVkLCB1bmxlc3MgYSB0YXJnZXQgY29ubmVjdHMgdG8gdXMuCisJICovCisJaWYgKGluZm8tPnJlcVNDcG50KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQuJWM6IGxvb3NpbmcgcmVxdWVzdCBjb21tYW5kXG4iLAorCQkJaW5mby0+aG9zdC0+aG9zdF9ubywgJzAnICsgU0NwbnQtPmRldmljZS0+aWQpOworCWluZm8tPnJlcVNDcG50ID0gU0NwbnQ7Cit9CisKKy8qKgorICogZmFzMjE2X2RvbmUgLSBjb21wbGV0ZSBwcm9jZXNzaW5nIGZvciBjdXJyZW50IGNvbW1hbmQKKyAqIEBpbmZvOiBpbnRlcmZhY2UgdGhhdCBjb21wbGV0ZWQKKyAqIEByZXN1bHQ6IGRyaXZlciBieXRlIG9mIHJlc3VsdAorICoKKyAqIENvbXBsZXRlIHByb2Nlc3NpbmcgZm9yIGN1cnJlbnQgY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfZG9uZShGQVMyMTZfSW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHJlc3VsdCkKK3sKKwl2b2lkICgqZm4pKEZBUzIxNl9JbmZvICosIFNjc2lfQ21uZCAqLCB1bnNpZ25lZCBpbnQpOworCVNjc2lfQ21uZCAqU0NwbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJaWYgKCFpbmZvLT5TQ3BudCkKKwkJZ290byBub19jb21tYW5kOworCisJU0NwbnQgPSBpbmZvLT5TQ3BudDsKKwlpbmZvLT5TQ3BudCA9IE5VTEw7CisgICAgCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCisJaWYgKGluZm8tPnNjc2kuYWJvcnRpbmcpIHsKKwkJZmFzMjE2X2xvZyhpbmZvLCAwLCAidW5jYXVnaHQgYWJvcnQgLSByZXR1cm5pbmcgRElEX0FCT1JUIik7CisJCXJlc3VsdCA9IERJRF9BQk9SVDsKKwkJaW5mby0+c2NzaS5hYm9ydGluZyA9IDA7CisJfQorCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhlIGNvbXBsZXRpb24gLSBpZiB3ZSBoYXZlIHplcm8gYnl0ZXMgbGVmdAorCSAqIHRvIHRyYW5zZmVyLCB3ZSBzaG91bGQgbm90IGhhdmUgYSB2YWxpZCBwb2ludGVyLgorCSAqLworCWlmIChpbmZvLT5zY3NpLlNDcC5wdHIgJiYgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCA9PSAwKSB7CisJCXByaW50aygic2NzaSVkLiVjOiB6ZXJvIGJ5dGVzIGxlZnQgdG8gdHJhbnNmZXIsIGJ1dCAiCisJCSAgICAgICAiYnVmZmVyIHBvaW50ZXIgc3RpbGwgdmFsaWQ6IHB0cj0lcCBsZW49JTA4eCBDREI6ICIsCisJCSAgICAgICBpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIGluZm8tPnNjc2kuU0NwLnB0ciwgaW5mby0+c2NzaS5TQ3AudGhpc19yZXNpZHVhbCk7CisJCWluZm8tPnNjc2kuU0NwLnB0ciA9IE5VTEw7CisJCXByaW50X2NvbW1hbmQoU0NwbnQtPmNtbmQpOworCX0KKworCS8qCisJICogQ2xlYXIgZG93biB0aGlzIGNvbW1hbmQgYXMgY29tcGxldGVkLiAgSWYgd2UgbmVlZCB0byByZXF1ZXN0CisJICogdGhlIHNlbnNlIGluZm9ybWF0aW9uLCBmYXMyMTZfa2ljayB3aWxsIHJlLWFzc2VydCB0aGUgYnVzeQorCSAqIHN0YXR1cy4KKwkgKi8KKwlpbmZvLT5kZXZpY2VbU0NwbnQtPmRldmljZS0+aWRdLnBhcml0eV9jaGVjayA9IDA7CisJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaW5mby0+YnVzeWx1bnMpOworCisJZm4gPSAodm9pZCAoKikoRkFTMjE2X0luZm8gKiwgU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCkpU0NwbnQtPmhvc3Rfc2NyaWJibGU7CisJZm4oaW5mbywgU0NwbnQsIHJlc3VsdCk7CisKKwlpZiAoaW5mby0+c2NzaS5pcnEgIT0gTk9fSVJRKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJCWZhczIxNl9raWNrKGluZm8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuOworCitub19jb21tYW5kOgorCXBhbmljKCJzY3NpJWQuSDogbnVsbCBjb21tYW5kIGluIGZhczIxNl9kb25lIiwKKwkJaW5mby0+aG9zdC0+aG9zdF9ubyk7Cit9CisKKy8qKgorICogZmFzMjE2X3F1ZXVlX2NvbW1hbmQgLSBxdWV1ZSBhIGNvbW1hbmQgZm9yIGFkYXB0ZXIgdG8gcHJvY2Vzcy4KKyAqIEBTQ3BudDogQ29tbWFuZCB0byBxdWV1ZQorICogQGRvbmU6IGRvbmUgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGNvbW1hbmQgaXMgY29tcGxldGUKKyAqCisgKiBRdWV1ZSBhIGNvbW1hbmQgZm9yIGFkYXB0ZXIgdG8gcHJvY2Vzcy4KKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqIE5vdGVzOiBpb19yZXF1ZXN0X2xvY2sgaXMgaGVsZCwgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisgKi8KK2ludCBmYXMyMTZfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IHJlc3VsdDsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJZmFzMjE2X2xvZ19jb21tYW5kKGluZm8sIExPR19DT05ORUNULCBTQ3BudCwKKwkJCSAgICJyZWNlaXZlZCBjb21tYW5kICglcCkiLCBTQ3BudCk7CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopZmFzMjE2X3N0ZF9kb25lOworCVNDcG50LT5yZXN1bHQgPSAwOworCisJaW5pdF9TQ3AoU0NwbnQpOworCisJaW5mby0+c3RhdHMucXVldWVzICs9IDE7CisJU0NwbnQtPnRhZyA9IDA7CisKKwlzcGluX2xvY2soJmluZm8tPmhvc3RfbG9jayk7CisKKwkvKgorCSAqIEFkZCBjb21tYW5kIGludG8gZXhlY3V0ZSBxdWV1ZSBhbmQgbGV0IGl0IGNvbXBsZXRlIHVuZGVyCisJICogd2hhdGV2ZXIgc2NoZW1lIHdlJ3JlIHVzaW5nLgorCSAqLworCXJlc3VsdCA9ICFxdWV1ZV9hZGRfY21kX29yZGVyZWQoJmluZm8tPnF1ZXVlcy5pc3N1ZSwgU0NwbnQpOworCisJLyoKKwkgKiBJZiB3ZSBzdWNjZXNzZnVsbHkgYWRkZWQgdGhlIGNvbW1hbmQsCisJICoga2ljayB0aGUgaW50ZXJmYWNlIHRvIGdldCBpdCBtb3ZpbmcuCisJICovCisJaWYgKHJlc3VsdCA9PSAwICYmIGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJZmFzMjE2X2tpY2soaW5mbyk7CisJc3Bpbl91bmxvY2soJmluZm8tPmhvc3RfbG9jayk7CisKKwlmYXMyMTZfbG9nX3RhcmdldChpbmZvLCBMT0dfQ09OTkVDVCwgLTEsICJxdWV1ZSAlcyIsCisJCXJlc3VsdCA/ICJmYWlsdXJlIiA6ICJzdWNjZXNzIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGZhczIxNl9pbnRlcm5hbF9kb25lIC0gdHJpZ2dlciByZXN0YXJ0IG9mIGEgd2FpdGluZyB0aHJlYWQgaW4gZmFzMjE2X25vcXVldWVfY29tbWFuZAorICogQFNDcG50OiBDb21tYW5kIHRvIHdha2UKKyAqCisgKiBUcmlnZ2VyIHJlc3RhcnQgb2YgYSB3YWl0aW5nIHRocmVhZCBpbiBmYXMyMTZfY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBmYXMyMTZfaW50ZXJuYWxfZG9uZShTY3NpX0NtbmQgKlNDcG50KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCWluZm8tPmludGVybmFsX2RvbmUgPSAxOworfQorCisvKioKKyAqIGZhczIxNl9ub3F1ZXVlX2NvbW1hbmQgLSBwcm9jZXNzIGEgY29tbWFuZCBmb3IgdGhlIGFkYXB0ZXIuCisgKiBAU0NwbnQ6IENvbW1hbmQgdG8gcXVldWUKKyAqCisgKiBRdWV1ZSBhIGNvbW1hbmQgZm9yIGFkYXB0ZXIgdG8gcHJvY2Vzcy4KKyAqIFJldHVybnM6IHNjc2kgcmVzdWx0IGNvZGUuCisgKiBOb3RlczogaW9fcmVxdWVzdF9sb2NrIGlzIGhlbGQsIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorICovCitpbnQgZmFzMjE2X25vcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlmYXMyMTZfY2hlY2ttYWdpYyhpbmZvKTsKKworCS8qCisJICogV2Ugc2hvdWxkIG9ubHkgYmUgdXNpbmcgdGhpcyBpZiB3ZSBkb24ndCBoYXZlIGFuIGludGVycnVwdC4KKwkgKiBQcm92aWRlIHNvbWUgImluY2VudGl2ZSIgdG8gdXNlIHRoZSBxdWV1ZWluZyBjb2RlLgorCSAqLworCUJVR19PTihpbmZvLT5zY3NpLmlycSAhPSBOT19JUlEpOworCisJaW5mby0+aW50ZXJuYWxfZG9uZSA9IDA7CisJZmFzMjE2X3F1ZXVlX2NvbW1hbmQoU0NwbnQsIGZhczIxNl9pbnRlcm5hbF9kb25lKTsKKworCS8qCisJICogVGhpcyB3YXN0ZXMgdGltZSwgc2luY2Ugd2UgY2FuJ3QgcmV0dXJuIHVudGlsIHRoZSBjb21tYW5kIGlzCisJICogY29tcGxldGUuIFdlIGNhbid0IHNsZWVwIGVpdGhlciBzaW5jZSB3ZSBtYXkgZ2V0IHJlLWVudGVyZWQhCisJICogSG93ZXZlciwgd2UgbXVzdCByZS1lbmFibGUgaW50ZXJydXB0cywgb3IgZWxzZSB3ZSdsbCBiZQorCSAqIHdhaXRpbmcgZm9yZXZlci4KKwkgKi8KKwlzcGluX3VubG9ja19pcnEoaW5mby0+aG9zdC0+aG9zdF9sb2NrKTsKKworCXdoaWxlICghaW5mby0+aW50ZXJuYWxfZG9uZSkgeworCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFuIElSUSwgdGhlbiB3ZSBtdXN0IHBvbGwgdGhlIGNhcmQgZm9yCisJCSAqIGl0J3MgaW50ZXJydXB0LCBhbmQgdXNlIHRoYXQgdG8gY2FsbCB0aGlzIGRyaXZlcidzCisJCSAqIGludGVycnVwdCByb3V0aW5lLiAgVGhhdCB3YXksIHdlIGtlZXAgdGhlIGNvbW1hbmQKKwkJICogcHJvZ3Jlc3NpbmcuICBNYXliZSB3ZSBjYW4gYWRkIHNvbWUgaW50ZWxpZ2VuY2UgaGVyZQorCQkgKiBhbmQgZ28gdG8gc2xlZXAgaWYgd2Uga25vdyB0aGF0IHRoZSBkZXZpY2UgaXMgZ29pbmcKKwkJICogdG8gYmUgc29tZSB0aW1lIChlZywgZGlzY29ubmVjdGVkKS4KKwkJICovCisJCWlmIChmYXMyMTZfcmVhZGIoaW5mbywgUkVHX1NUQVQpICYgU1RBVF9JTlQpIHsKKwkJCXNwaW5fbG9ja19pcnEoaW5mby0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJCWZhczIxNl9pbnRyKGluZm8pOworCQkJc3Bpbl91bmxvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisKKwlkb25lKFNDcG50KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRXJyb3IgaGFuZGxlciB0aW1lb3V0IGZ1bmN0aW9uLiAgSW5kaWNhdGUgdGhhdCB3ZSB0aW1lZCBvdXQsCisgKiBhbmQgd2FrZSB1cCBhbnkgZXJyb3IgaGFuZGxlciBwcm9jZXNzIHNvIGl0IGNhbiBjb250aW51ZS4KKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X2VoX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlGQVMyMTZfSW5mbyAqaW5mbyA9IChGQVMyMTZfSW5mbyAqKWRhdGE7CisKKwlmYXMyMTZfbG9nKGluZm8sIExPR19FUlJPUiwgImVycm9yIGhhbmRsaW5nIHRpbWVkIG91dFxuIik7CisKKwlkZWxfdGltZXIoJmluZm8tPmVoX3RpbWVyKTsKKworCWlmIChpbmZvLT5yc3RfYnVzX3N0YXR1cyA9PSAwKQorCQlpbmZvLT5yc3RfYnVzX3N0YXR1cyA9IC0xOworCWlmIChpbmZvLT5yc3RfZGV2X3N0YXR1cyA9PSAwKQorCQlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IC0xOworCisJd2FrZV91cCgmaW5mby0+ZWhfd2FpdCk7Cit9CisKK2VudW0gcmVzX2ZpbmQgeworCXJlc19mYWlsZWQsCQkvKiBub3QgZm91bmQJCQkqLworCXJlc19zdWNjZXNzLAkJLyogY29tbWFuZCBvbiBpc3N1ZSBxdWV1ZQkqLworCXJlc19od19hYm9ydAkJLyogY29tbWFuZCBvbiBkaXNjb25uZWN0ZWQgZGV2CSovCit9OworCisvKioKKyAqIGZhczIxNl9kb19hYm9ydCAtIGRlY2lkZSBob3cgdG8gYWJvcnQgYSBjb21tYW5kCisgKiBAU0NwbnQ6IGNvbW1hbmQgdG8gYWJvcnQKKyAqCisgKiBEZWNpZGUgaG93IHRvIGFib3J0IGEgY29tbWFuZC4KKyAqIFJldHVybnM6IGFib3J0IHN0YXR1cworICovCitzdGF0aWMgZW51bSByZXNfZmluZCBmYXMyMTZfZmluZF9jb21tYW5kKEZBUzIxNl9JbmZvICppbmZvLCBTY3NpX0NtbmQgKlNDcG50KQoreworCWVudW0gcmVzX2ZpbmQgcmVzID0gcmVzX2ZhaWxlZDsKKworCWlmIChxdWV1ZV9yZW1vdmVfY21kKCZpbmZvLT5xdWV1ZXMuaXNzdWUsIFNDcG50KSkgeworCQkvKgorCQkgKiBUaGUgY29tbWFuZCB3YXMgb24gdGhlIGlzc3VlIHF1ZXVlLCBhbmQgaGFzIG5vdCBiZWVuCisJCSAqIGlzc3VlZCB5ZXQuICBXZSBjYW4gcmVtb3ZlIHRoZSBjb21tYW5kIGZyb20gdGhlIHF1ZXVlLAorCQkgKiBhbmQgYWNrbm93bGVkZ2UgdGhlIGFib3J0LiAgTmVpdGhlciB0aGUgZGV2aWNlIG5vciB0aGUKKwkJICogaW50ZXJmYWNlIGtub3cgYWJvdXQgdGhlIGNvbW1hbmQuCisJCSAqLworCQlwcmludGsoIm9uIGlzc3VlIHF1ZXVlICIpOworCisJCXJlcyA9IHJlc19zdWNjZXNzOworCX0gZWxzZSBpZiAocXVldWVfcmVtb3ZlX2NtZCgmaW5mby0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgU0NwbnQpKSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdhcyBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgV2UgbXVzdAorCQkgKiByZWNvbm5lY3Qgd2l0aCB0aGUgZGV2aWNlIGlmIHBvc3NpYmxlLCBhbmQgc2VuZCBpdAorCQkgKiBhbiBhYm9ydCBtZXNzYWdlLgorCQkgKi8KKwkJcHJpbnRrKCJvbiBkaXNjb25uZWN0ZWQgcXVldWUgIik7CisKKwkJcmVzID0gcmVzX2h3X2Fib3J0OworCX0gZWxzZSBpZiAoaW5mby0+U0NwbnQgPT0gU0NwbnQpIHsKKwkJcHJpbnRrKCJleGVjdXRpbmcgIik7CisKKwkJc3dpdGNoIChpbmZvLT5zY3NpLnBoYXNlKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbnRlcmZhY2UgaXMgaWRsZSwgYW5kIHRoZSBjb21tYW5kIGlzICdkaXNjb25uZWN0YWJsZScsCisJCSAqIHRoZW4gaXQgaXMgdGhlIHNhbWUgYXMgb24gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKwkJICovCisJCWNhc2UgUEhBU0VfSURMRToKKwkJCWlmIChpbmZvLT5zY3NpLmRpc2Nvbm5lY3RhYmxlKSB7CisJCQkJaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJCQkJaW5mby0+U0NwbnQgPSBOVUxMOworCQkJCXJlcyA9IHJlc19od19hYm9ydDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaW5mby0+b3JpZ1NDcG50ID09IFNDcG50KSB7CisJCS8qCisJCSAqIFRoZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgbmV4dCwgYnV0IGEgY29tbWFuZAorCQkgKiBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIGludGVyZmFjZS4gIFRoaXMgaXMgc2ltaWxhciB0bworCQkgKiBiZWluZyBvbiB0aGUgaXNzdWUgcXVldWUsIGV4Y2VwdCB0aGUgYnVzeWx1biBiaXQgaGFzCisJCSAqIGJlZW4gc2V0LgorCQkgKi8KKwkJaW5mby0+b3JpZ1NDcG50ID0gTlVMTDsKKwkJY2xlYXJfYml0KFNDcG50LT5kZXZpY2UtPmlkICogOCArIFNDcG50LT5kZXZpY2UtPmx1biwgaW5mby0+YnVzeWx1bnMpOworCQlwcmludGsoIndhaXRpbmcgZm9yIGV4ZWN1dGlvbiAiKTsKKwkJcmVzID0gcmVzX3N1Y2Nlc3M7CisJfSBlbHNlCisJCXByaW50aygidW5rbm93biAiKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogZmFzMjE2X2VoX2Fib3J0IC0gYWJvcnQgdGhpcyBjb21tYW5kCisgKiBAU0NwbnQ6IGNvbW1hbmQgdG8gYWJvcnQKKyAqCisgKiBBYm9ydCB0aGlzIGNvbW1hbmQuCisgKiBSZXR1cm5zOiBGQUlMRUQgaWYgdW5hYmxlIHRvIGFib3J0CisgKiBOb3RlczogaW9fcmVxdWVzdF9sb2NrIGlzIHRha2VuLCBhbmQgaXJxcyBhcmUgZGlzYWJsZWQKKyAqLworaW50IGZhczIxNl9laF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IHJlc3VsdCA9IEZBSUxFRDsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCisJaW5mby0+c3RhdHMuYWJvcnRzICs9IDE7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IGFib3J0IGNvbW1hbmQgIiwgaW5mby0+aG9zdC0+aG9zdF9ubyk7CisJcHJpbnRfY29tbWFuZChTQ3BudC0+ZGF0YV9jbW5kKTsKKworCXByaW50X2RlYnVnX2xpc3QoKTsKKwlmYXMyMTZfZHVtcHN0YXRlKGluZm8pOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBhYm9ydCAlcCAiLCBpbmZvLT5ob3N0LT5ob3N0X25vLCBTQ3BudCk7CisKKwlzd2l0Y2ggKGZhczIxNl9maW5kX2NvbW1hbmQoaW5mbywgU0NwbnQpKSB7CisJLyoKKwkgKiBXZSBmb3VuZCB0aGUgY29tbWFuZCwgYW5kIGNsZWFyZWQgaXQgb3V0LiAgRWl0aGVyCisJICogdGhlIGNvbW1hbmQgaXMgc3RpbGwga25vd24gdG8gYmUgZXhlY3V0aW5nIG9uIHRoZQorCSAqIHRhcmdldCwgb3IgdGhlIGJ1c3lsdW4gYml0IGlzIG5vdCBzZXQuCisJICovCisJY2FzZSByZXNfc3VjY2VzczoKKwkJcHJpbnRrKCJzdWNjZXNzXG4iKTsKKwkJcmVzdWx0ID0gU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcmVjb25uZWN0IHRvIHRoZSB0YXJnZXQgYW5kIHNlbmQgaXQgYW4KKwkgKiBBQk9SVCBvciBBQk9SVF9UQUcgbWVzc2FnZS4gIFdlIGNhbiBvbmx5IGRvIHRoaXMKKwkgKiBpZiB0aGUgYnVzIGlzIGZyZWUuCisJICovCisJY2FzZSByZXNfaHdfYWJvcnQ6CisJCQorCisJLyoKKwkgKiBXZSBhcmUgdW5hYmxlIHRvIGFib3J0IHRoZSBjb21tYW5kIGZvciBzb21lIHJlYXNvbi4KKwkgKi8KKwlkZWZhdWx0OgorCWNhc2UgcmVzX2ZhaWxlZDoKKwkJcHJpbnRrKCJmYWlsZWRcbiIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGZhczIxNl9laF9kZXZpY2VfcmVzZXQgLSBSZXNldCB0aGUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQKKyAqIEBTQ3BudDogY29tbWFuZCBzcGVjaWZpbmcgZGV2aWNlIHRvIHJlc2V0CisgKgorICogUmVzZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kLgorICogUmV0dXJuczogRkFJTEVEIGlmIHVuYWJsZSB0byByZXNldC4KKyAqIE5vdGVzOiBXZSB3b24ndCBiZSByZS1lbnRlcmVkLCBzbyB3ZSdsbCBvbmx5IGhhdmUgb25lIGRldmljZQorICogcmVzZXQgb24gdGhlIGdvIGF0IG9uZSB0aW1lLgorICovCitpbnQgZmFzMjE2X2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgcmVzID0gRkFJTEVELCB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0VSUk9SLCAiZGV2aWNlIHJlc2V0IGZvciB0YXJnZXQgJWQiLCB0YXJnZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZG8geworCQkvKgorCQkgKiBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGRldmljZSwgYW5kCisJCSAqIGl0IGlzIHRoZSBkZXZpY2Ugd2Ugd2FudCB0byByZXNldCwgdGhlcmUgaXMKKwkJICogbm90aGluZyB3ZSBjYW4gZG8gaGVyZS4gIENoYW5jZXMgYXJlIGl0IGlzIHN0dWNrLAorCQkgKiBhbmQgd2UgbmVlZCBhIGJ1cyByZXNldC4KKwkJICovCisJCWlmIChpbmZvLT5TQ3BudCAmJiAhaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSAmJgorCQkgICAgaW5mby0+U0NwbnQtPmRldmljZS0+aWQgPT0gU0NwbnQtPmRldmljZS0+aWQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBXZSdyZSBnb2luZyB0byBiZSByZXNldHRpbmcgdGhpcyBkZXZpY2UuICBSZW1vdmUKKwkJICogYWxsIHBlbmRpbmcgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyLiAgQnkgZG9pbmcKKwkJICogc28sIHdlIGd1YXJhbnRlZSB0aGF0IHdlIHdvbid0IHRvdWNoIHRoZSBjb21tYW5kCisJCSAqIHN0cnVjdHVyZXMgZXhjZXB0IHRvIHByb2Nlc3MgdGhlIHJlc2V0IHJlcXVlc3QuCisJCSAqLworCQlxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldCgmaW5mby0+cXVldWVzLmlzc3VlLCB0YXJnZXQpOworCQlxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldCgmaW5mby0+cXVldWVzLmRpc2Nvbm5lY3RlZCwgdGFyZ2V0KTsKKwkJaWYgKGluZm8tPm9yaWdTQ3BudCAmJiBpbmZvLT5vcmlnU0NwbnQtPmRldmljZS0+aWQgPT0gdGFyZ2V0KQorCQkJaW5mby0+b3JpZ1NDcG50ID0gTlVMTDsKKwkJaWYgKGluZm8tPnJlcVNDcG50ICYmIGluZm8tPnJlcVNDcG50LT5kZXZpY2UtPmlkID09IHRhcmdldCkKKwkJCWluZm8tPnJlcVNDcG50ID0gTlVMTDsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNsZWFyX2JpdCh0YXJnZXQgKiA4ICsgaSwgaW5mby0+YnVzeWx1bnMpOworCisJCS8qCisJCSAqIEhpamFjayB0aGlzIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUgdG8gc2VuZAorCQkgKiBhIGJ1cyBkZXZpY2UgcmVzZXQgbWVzc2FnZSB0byB0aGlzIGRldmljZS4KKwkJICovCisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKilmYXMyMTZfZGV2aWNlcmVzZXRfZG9uZTsKKworCQlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IDA7CisJCWluZm8tPnJzdFNDcG50ID0gU0NwbnQ7CisKKwkJaWYgKGluZm8tPnNjc2kucGhhc2UgPT0gUEhBU0VfSURMRSkKKwkJCWZhczIxNl9raWNrKGluZm8pOworCisJCW1vZF90aW1lcigmaW5mby0+ZWhfdGltZXIsIDMwICogSFopOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4KKwkJICovCisJCXdhaXRfZXZlbnQoaW5mby0+ZWhfd2FpdCwgaW5mby0+cnN0X2Rldl9zdGF0dXMpOworCisJCWRlbF90aW1lcl9zeW5jKCZpbmZvLT5laF90aW1lcik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+cnN0U0NwbnQgPSBOVUxMOworCisJCWlmIChpbmZvLT5yc3RfZGV2X3N0YXR1cyA9PSAxKQorCQkJcmVzID0gU1VDQ0VTUzsKKwl9IHdoaWxlICgwKTsKKworCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0VSUk9SLCAiZGV2aWNlIHJlc2V0IGNvbXBsZXRlOiAlc1xuIiwKKwkJICAgcmVzID09IFNVQ0NFU1MgPyAic3VjY2VzcyIgOiAiZmFpbGVkIik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIGZhczIxNl9laF9idXNfcmVzZXQgLSBSZXNldCB0aGUgYnVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZAorICogQFNDcG50OiBjb21tYW5kIHNwZWNpZmluZyBidXMgdG8gcmVzZXQKKyAqCisgKiBSZXNldCB0aGUgYnVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZC4KKyAqIFJldHVybnM6IEZBSUxFRCBpZiB1bmFibGUgdG8gcmVzZXQuCisgKiBOb3RlczogRnVydGhlciBjb21tYW5kcyBhcmUgYmxvY2tlZC4KKyAqLworaW50IGZhczIxNl9laF9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlGQVMyMTZfSW5mbyAqaW5mbyA9IChGQVMyMTZfSW5mbyAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJU2NzaV9EZXZpY2UgKlNEcG50OworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisJZmFzMjE2X2xvZyhpbmZvLCBMT0dfRVJST1IsICJyZXNldHRpbmcgYnVzIik7CisKKwlpbmZvLT5zdGF0cy5idXNfcmVzZXRzICs9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFN0b3AgYWxsIGFjdGl2aXR5IG9uIHRoaXMgaW50ZXJmYWNlLgorCSAqLworCWZhczIxNl9hYm9ydHRyYW5zZmVyKGluZm8pOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwzLCBpbmZvLT5zY3NpLmNmZ1syXSk7CisKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMuCisJICovCisJd2hpbGUgKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfU1RBVCkgJiBTVEFUX0lOVCkKKwkJZmFzMjE2X3JlYWRiKGluZm8sIFJFR19JTlNUKTsKKworCWluZm8tPnJzdF9idXNfc3RhdHVzID0gMDsKKworCS8qCisJICogRm9yIGVhY2ggYXR0YWNoZWQgaGFyZC1yZXNldCBkZXZpY2UsIGNsZWFyIG91dAorCSAqIGFsbCBjb21tYW5kIHN0cnVjdHVyZXMuICBMZWF2ZSB0aGUgcnVubmluZworCSAqIGNvbW1hbmQgaW4gcGxhY2UuCisJICovCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKFNEcG50LCBpbmZvLT5ob3N0KSB7CisJCWludCBpOworCisJCWlmIChTRHBudC0+c29mdF9yZXNldCkKKwkJCWNvbnRpbnVlOworCisJCXF1ZXVlX3JlbW92ZV9hbGxfdGFyZ2V0KCZpbmZvLT5xdWV1ZXMuaXNzdWUsIFNEcG50LT5pZCk7CisJCXF1ZXVlX3JlbW92ZV9hbGxfdGFyZ2V0KCZpbmZvLT5xdWV1ZXMuZGlzY29ubmVjdGVkLCBTRHBudC0+aWQpOworCQlpZiAoaW5mby0+b3JpZ1NDcG50ICYmIGluZm8tPm9yaWdTQ3BudC0+ZGV2aWNlLT5pZCA9PSBTRHBudC0+aWQpCisJCQlpbmZvLT5vcmlnU0NwbnQgPSBOVUxMOworCQlpZiAoaW5mby0+cmVxU0NwbnQgJiYgaW5mby0+cmVxU0NwbnQtPmRldmljZS0+aWQgPT0gU0RwbnQtPmlkKQorCQkJaW5mby0+cmVxU0NwbnQgPSBOVUxMOworCQlpbmZvLT5TQ3BudCA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNsZWFyX2JpdChTRHBudC0+aWQgKiA4ICsgaSwgaW5mby0+YnVzeWx1bnMpOworCX0KKworCWluZm8tPnNjc2kucGhhc2UgPSBQSEFTRV9JRExFOworCisJLyoKKwkgKiBSZXNldCB0aGUgU0NTSSBidXMuICBEZXZpY2UgY2xlYW51cCBoYXBwZW5zIGluCisJICogdGhlIGludGVycnVwdCBoYW5kbGVyLgorCSAqLworCWZhczIxNl9jbWQoaW5mbywgQ01EX1JFU0VUU0NTSSk7CisKKwltb2RfdGltZXIoJmluZm8tPmVoX3RpbWVyLCBqaWZmaWVzICsgSFopOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBXYWl0IG9uZSBzZWNvbmQgZm9yIHRoZSBpbnRlcnJ1cHQuCisJICovCisJd2FpdF9ldmVudChpbmZvLT5laF93YWl0LCBpbmZvLT5yc3RfYnVzX3N0YXR1cyk7CisJZGVsX3RpbWVyX3N5bmMoJmluZm8tPmVoX3RpbWVyKTsKKworCWZhczIxNl9sb2coaW5mbywgTE9HX0VSUk9SLCAiYnVzIHJlc2V0IGNvbXBsZXRlOiAlc1xuIiwKKwkJICAgaW5mby0+cnN0X2J1c19zdGF0dXMgPT0gMSA/ICJzdWNjZXNzIiA6ICJmYWlsZWQiKTsKKworCXJldHVybiBpbmZvLT5yc3RfYnVzX3N0YXR1cyA9PSAxID8gU1VDQ0VTUyA6IEZBSUxFRDsKK30KKworLyoqCisgKiBmYXMyMTZfaW5pdF9jaGlwIC0gSW5pdGlhbGlzZSBGQVMyMTYgc3RhdGUgYWZ0ZXIgcmVzZXQKKyAqIEBpbmZvOiBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIGludGVyZmFjZQorICoKKyAqIEluaXRpYWxpc2UgRkFTMjE2IHN0YXRlIGFmdGVyIHJlc2V0CisgKi8KK3N0YXRpYyB2b2lkIGZhczIxNl9pbml0X2NoaXAoRkFTMjE2X0luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGNsb2NrID0gKChpbmZvLT5pZmNmZy5jbG9ja3JhdGUgLSAxKSAvIDUgKyAxKSAmIDc7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ0xLRiwgY2xvY2spOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDIsIGluZm8tPnNjc2kuY2ZnWzFdKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMywgaW5mby0+c2NzaS5jZmdbMl0pOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NUSU0sIGluZm8tPmlmY2ZnLnNlbGVjdF90aW1lb3V0KTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19TT0YsIDApOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX1NUUCwgaW5mby0+c2NzaS5hc3luY19zdHApOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSk7Cit9CisKKy8qKgorICogZmFzMjE2X2VoX2hvc3RfcmVzZXQgLSBSZXNldCB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kCisgKiBAU0NwbnQ6IGNvbW1hbmQgc3BlY2lmaW5nIGhvc3QgdG8gcmVzZXQKKyAqCisgKiBSZXNldCB0aGUgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kLgorICogUmV0dXJuczogRkFJTEVEIGlmIHVuYWJsZSB0byByZXNldC4KKyAqIE5vdGVzOiBpb19yZXF1ZXN0X2xvY2sgaXMgdGFrZW4sIGFuZCBpcnFzIGFyZSBkaXNhYmxlZAorICovCitpbnQgZmFzMjE2X2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlGQVMyMTZfSW5mbyAqaW5mbyA9IChGQVMyMTZfSW5mbyAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlwcmludGsoInNjc2klZC4lYzogJXM6IHJlc2V0dGluZyBob3N0XG4iLAorCQlpbmZvLT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogUmVzZXQgdGhlIFNDU0kgY2hpcC4KKwkgKi8KKwlmYXMyMTZfY21kKGluZm8sIENNRF9SRVNFVENISVApOworCisJLyoKKwkgKiBVZ2x5IHVnbHkgdWdseSEKKwkgKiBXZSBuZWVkIHRvIHJlbGVhc2UgdGhlIGhvc3RfbG9jayBhbmQgZW5hYmxlCisJICogSVJRcyBpZiB3ZSBzbGVlcCwgYnV0IHdlIG11c3QgcmVsb2NrIGFuZCBkaXNhYmxlCisJICogSVJRcyBhZnRlciB0aGUgc2xlZXAuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisJbXNsZWVwKDUwICogMTAwMC8xMDApOworCXNwaW5fbG9ja19pcnEoaW5mby0+aG9zdC0+aG9zdF9sb2NrKTsKKworCS8qCisJICogUmVsZWFzZSB0aGUgU0NTSSByZXNldC4KKwkgKi8KKwlmYXMyMTZfY21kKGluZm8sIENNRF9OT1ApOworCisJZmFzMjE2X2luaXRfY2hpcChpbmZvKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisjZGVmaW5lIFRZUEVfVU5LTk9XTgkwCisjZGVmaW5lIFRZUEVfTkNSNTNDOTAJMQorI2RlZmluZSBUWVBFX05DUjUzQzkwQQkyCisjZGVmaW5lIFRZUEVfTkNSNTNDOXgJMworI2RlZmluZSBUWVBFX0FtNTNDRjk0CTQKKyNkZWZpbmUgVFlQRV9FbUZBUzIxNgk1CisjZGVmaW5lIFRZUEVfUUxGQVMyMTYJNgorCitzdGF0aWMgY2hhciAqY2hpcF90eXBlc1tdID0geworCSJ1bmtub3duIiwKKwkiTlMgTkNSNTNDOTAiLAorCSJOUyBOQ1I1M0M5MEEiLAorCSJOUyBOQ1I1M0M5eCIsCisJIkFNRCBBbTUzQ0Y5NCIsCisJIkVtdWxleCBGQVMyMTYiLAorCSJRTG9naWMgRkFTMjE2IgorfTsKKworc3RhdGljIGludCBmYXMyMTZfZGV0ZWN0X3R5cGUoRkFTMjE2X0luZm8gKmluZm8pCit7CisJaW50IGZhbWlseSwgcmV2OworCisJLyoKKwkgKiBSZXNldCB0aGUgY2hpcC4KKwkgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9SRVNFVENISVApOworCXVkZWxheSg1MCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ01ELCBDTURfTk9QKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIGNvbnRyb2wgcmVnIDIgaXMgcHJlc2VudC4KKwkgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMywgMCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDIsIENOVEwyX1MyRkUpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgdW5hYmxlIHRvIHJlYWQgYmFjayBjb250cm9sIHJlZyAyCisJICogY29ycmVjdGx5LCBpdCBpcyBub3QgcHJlc2VudCwgYW5kIHdlIGhhdmUgYQorCSAqIE5DUjUzQzkwLgorCSAqLworCWlmICgoZmFzMjE2X3JlYWRiKGluZm8sIFJFR19DTlRMMikgJiAofjB4ZTApKSAhPSBDTlRMMl9TMkZFKQorCQlyZXR1cm4gVFlQRV9OQ1I1M0M5MDsKKworCS8qCisJICogTm93LCBjaGVjayBjb250cm9sIHJlZ2lzdGVyIDMKKwkgKi8KKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMiwgMCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIDApOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwzLCA1KTsKKworCS8qCisJICogSWYgd2UgYXJlIHVuYWJsZSB0byByZWFkIHRoZSByZWdpc3RlciBiYWNrCisJICogY29ycmVjdGx5LCB3ZSBoYXZlIGEgTkNSNTNDOTBBCisJICovCisJaWYgKGZhczIxNl9yZWFkYihpbmZvLCBSRUdfQ05UTDMpICE9IDUpCisJCXJldHVybiBUWVBFX05DUjUzQzkwQTsKKworCS8qCisJICogTm93IHJlYWQgdGhlIElEIGZyb20gdGhlIGNoaXAuCisJICovCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIDApOworCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDMsIENOVEwzX0FESURDSEspOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwzLCAwKTsKKworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NNRCwgQ01EX1JFU0VUQ0hJUCk7CisJdWRlbGF5KDUwKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9XSVRIRE1BIHwgQ01EX05PUCk7CisKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTlRMMiwgQ05UTDJfRU5GKTsKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9SRVNFVENISVApOworCXVkZWxheSg1MCk7CisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ01ELCBDTURfTk9QKTsKKworCXJldiAgICAgPSBmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lEKTsKKwlmYW1pbHkgID0gcmV2ID4+IDM7CisJcmV2ICAgICY9IDc7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgMHgwMToKKwkJaWYgKHJldiA9PSA0KQorCQkJcmV0dXJuIFRZUEVfQW01M0NGOTQ7CisJCWJyZWFrOworCisJY2FzZSAweDAyOgorCQlzd2l0Y2ggKHJldikgeworCQljYXNlIDI6CisJCQlyZXR1cm4gVFlQRV9FbUZBUzIxNjsKKwkJY2FzZSAzOgorCQkJcmV0dXJuIFRZUEVfUUxGQVMyMTY7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcHJpbnRrKCJmYW1pbHkgJXggcmV2ICV4XG4iLCBmYW1pbHksIHJldik7CisJcmV0dXJuIFRZUEVfTkNSNTNDOXg7Cit9CisKKy8qKgorICogZmFzMjE2X3Jlc2V0X3N0YXRlIC0gSW5pdGlhbGlzZSBkcml2ZXIgaW50ZXJuYWwgc3RhdGUKKyAqIEBpbmZvOiBzdGF0ZSB0byBpbml0aWFsaXNlCisgKgorICogSW5pdGlhbGlzZSBkcml2ZXIgaW50ZXJuYWwgc3RhdGUKKyAqLworc3RhdGljIHZvaWQgZmFzMjE2X3Jlc2V0X3N0YXRlKEZBUzIxNl9JbmZvICppbmZvKQoreworCWludCBpOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlmYXMyMTZfYnVzX3Jlc2V0KGluZm8pOworCisJLyoKKwkgKiBDbGVhciBvdXQgYWxsIHN0YWxlIGluZm8gaW4gb3VyIHN0YXRlIHN0cnVjdHVyZQorCSAqLworCW1lbXNldChpbmZvLT5idXN5bHVucywgMCwgc2l6ZW9mKGluZm8tPmJ1c3lsdW5zKSk7CisJaW5mby0+c2NzaS5kaXNjb25uZWN0YWJsZSA9IDA7CisJaW5mby0+c2NzaS5hYm9ydGluZyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWluZm8tPmRldmljZVtpXS5wYXJpdHlfZW5hYmxlZAk9IDA7CisJCWluZm8tPmRldmljZVtpXS5wYXJpdHlfY2hlY2sJPSAxOworCX0KKworCS8qCisJICogRHJhaW4gYWxsIGNvbW1hbmRzIG9uIGRpc2Nvbm5lY3RlZCBxdWV1ZQorCSAqLworCXdoaWxlIChxdWV1ZV9yZW1vdmUoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQpICE9IE5VTEwpOworCisJLyoKKwkgKiBSZW1vdmUgZXhlY3V0aW5nIGNvbW1hbmRzLgorCSAqLworCWluZm8tPlNDcG50ICAgICA9IE5VTEw7CisJaW5mby0+cmVxU0NwbnQgID0gTlVMTDsKKwlpbmZvLT5yc3RTQ3BudCAgPSBOVUxMOworCWluZm8tPm9yaWdTQ3BudCA9IE5VTEw7Cit9CisKKy8qKgorICogZmFzMjE2X2luaXQgLSBpbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgc3RydWN0dXJlcy4KKyAqIEBob3N0OiBhIGRyaXZlci1zcGVjaWZpYyBmaWxsZWQtb3V0IHN0cnVjdHVyZQorICoKKyAqIEluaXRpYWxpc2UgRkFTL05DUi9BTUQgU0NTSSBzdHJ1Y3R1cmVzLgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzCisgKi8KK2ludCBmYXMyMTZfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopaG9zdC0+aG9zdGRhdGE7CisKKwlpbmZvLT5tYWdpY19zdGFydCAgICA9IE1BR0lDOworCWluZm8tPm1hZ2ljX2VuZCAgICAgID0gTUFHSUM7CisJaW5mby0+aG9zdCAgICAgICAgICAgPSBob3N0OworCWluZm8tPnNjc2kuY2ZnWzBdICAgID0gaG9zdC0+dGhpc19pZCB8IENOVEwxX1BFUkU7CisJaW5mby0+c2NzaS5jZmdbMV0gICAgPSBDTlRMMl9FTkYgfCBDTlRMMl9TMkZFOworCWluZm8tPnNjc2kuY2ZnWzJdICAgID0gaW5mby0+aWZjZmcuY250bDMgfAorCQkJICAgICAgIENOVEwzX0FESURDSEsgfCBDTlRMM19RVEFHIHwgQ05UTDNfRzJDQiB8IENOVEwzX0xCVE07CisJaW5mby0+c2NzaS5hc3luY19zdHAgPSBmYXMyMTZfc3luY3BlcmlvZChpbmZvLCBpbmZvLT5pZmNmZy5hc3luY3BlcmlvZCk7CisKKwlpbmZvLT5yc3RfZGV2X3N0YXR1cyA9IC0xOworCWluZm8tPnJzdF9idXNfc3RhdHVzID0gLTE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZWhfd2FpdCk7CisJaW5pdF90aW1lcigmaW5mby0+ZWhfdGltZXIpOworCWluZm8tPmVoX3RpbWVyLmRhdGEgID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwlpbmZvLT5laF90aW1lci5mdW5jdGlvbiA9IGZhczIxNl9laF90aW1lcjsKKwkKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+aG9zdF9sb2NrKTsKKworCW1lbXNldCgmaW5mby0+c3RhdHMsIDAsIHNpemVvZihpbmZvLT5zdGF0cykpOworCisJbXNncXVldWVfaW5pdGlhbGlzZSgmaW5mby0+c2NzaS5tc2dzKTsKKworCWlmICghcXVldWVfaW5pdGlhbGlzZSgmaW5mby0+cXVldWVzLmlzc3VlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXF1ZXVlX2luaXRpYWxpc2UoJmluZm8tPnF1ZXVlcy5kaXNjb25uZWN0ZWQpKSB7CisJCXF1ZXVlX2ZyZWUoJmluZm8tPnF1ZXVlcy5pc3N1ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZhczIxNl9hZGQgLSBpbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgaWMuCisgKiBAaG9zdDogYSBkcml2ZXItc3BlY2lmaWMgZmlsbGVkLW91dCBzdHJ1Y3R1cmUKKyAqIEBkZXY6IHBhcmVudCBkZXZpY2UKKyAqCisgKiBJbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgaWMuCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGZhczIxNl9hZGQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopaG9zdC0+aG9zdGRhdGE7CisJaW50IHR5cGUsIHJldDsKKworCWlmIChpbmZvLT5pZmNmZy5jbG9ja3JhdGUgPD0gMTAgfHwgaW5mby0+aWZjZmcuY2xvY2tyYXRlID4gNDApIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiZmFzMjE2OiBpbnZhbGlkIGNsb2NrIHJhdGUgJXUgTUh6XG4iLAorCQkJaW5mby0+aWZjZmcuY2xvY2tyYXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmFzMjE2X3Jlc2V0X3N0YXRlKGluZm8pOworCXR5cGUgPSBmYXMyMTZfZGV0ZWN0X3R5cGUoaW5mbyk7CisJaW5mby0+c2NzaS50eXBlID0gY2hpcF90eXBlc1t0eXBlXTsKKworCXVkZWxheSgzMDApOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRoZSBjaGlwIGNvcnJlY3RseS4KKwkgKi8KKwlmYXMyMTZfaW5pdF9jaGlwKGluZm8pOworCisJLyoKKwkgKiBSZXNldCB0aGUgU0NTSSBidXMuICBXZSBkb24ndCB3YW50IHRvIHNlZQorCSAqIHRoZSByZXN1bHRpbmcgcmVzZXQgaW50ZXJydXB0LCBzbyBtYXNrIGl0CisJICogb3V0LgorCSAqLworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NOVEwxLCBpbmZvLT5zY3NpLmNmZ1swXSB8IENOVEwxX0RJU1IpOworCWZhczIxNl93cml0ZWIoaW5mbywgUkVHX0NNRCwgQ01EX1JFU0VUU0NTSSk7CisKKwkvKgorCSAqIHNjc2kgc3RhbmRhcmQgc2F5cyB3YWl0IDI1MG1zCisJICovCisJc3Bpbl91bmxvY2tfaXJxKGluZm8tPmhvc3QtPmhvc3RfbG9jayk7CisJbXNsZWVwKDEwMCoxMDAwLzEwMCk7CisJc3Bpbl9sb2NrX2lycShpbmZvLT5ob3N0LT5ob3N0X2xvY2spOworCisJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ05UTDEsIGluZm8tPnNjc2kuY2ZnWzBdKTsKKwlmYXMyMTZfcmVhZGIoaW5mbywgUkVHX0lOU1QpOworCisJZmFzMjE2X2NoZWNrbWFnaWMoaW5mbyk7CisKKwlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsIGRldik7CisJaWYgKHJldCkKKwkJZmFzMjE2X3dyaXRlYihpbmZvLCBSRUdfQ01ELCBDTURfUkVTRVRDSElQKTsKKwllbHNlCisJCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBmYXMyMTZfcmVtb3ZlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJRkFTMjE2X0luZm8gKmluZm8gPSAoRkFTMjE2X0luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWZhczIxNl9jaGVja21hZ2ljKGluZm8pOworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwlmYXMyMTZfd3JpdGViKGluZm8sIFJFR19DTUQsIENNRF9SRVNFVENISVApOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKKy8qKgorICogZmFzMjE2X3JlbGVhc2UgLSByZWxlYXNlIGFsbCByZXNvdXJjZXMgZm9yIEZBUy9OQ1IvQU1EIFNDU0kgaWMuCisgKiBAaG9zdDogYSBkcml2ZXItc3BlY2lmaWMgZmlsbGVkLW91dCBzdHJ1Y3R1cmUKKyAqCisgKiByZWxlYXNlIGFsbCByZXNvdXJjZXMgYW5kIHB1dCBldmVyeXRoaW5nIHRvIGJlZCBmb3IgRkFTL05DUi9BTUQgU0NTSSBpYy4KKyAqLwordm9pZCBmYXMyMTZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCUZBUzIxNl9JbmZvICppbmZvID0gKEZBUzIxNl9JbmZvICopaG9zdC0+aG9zdGRhdGE7CisKKwlxdWV1ZV9mcmVlKCZpbmZvLT5xdWV1ZXMuZGlzY29ubmVjdGVkKTsKKwlxdWV1ZV9mcmVlKCZpbmZvLT5xdWV1ZXMuaXNzdWUpOworfQorCitpbnQgZmFzMjE2X3ByaW50X2hvc3QoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsCisJCQkiXG4iCisJCQkiQ2hpcCAgICA6ICVzXG4iCisJCQkiIEFkZHJlc3M6IDB4JXBcbiIKKwkJCSIgSVJRICAgIDogJWRcbiIKKwkJCSIgRE1BICAgIDogJWRcbiIsCisJCQlpbmZvLT5zY3NpLnR5cGUsIGluZm8tPnNjc2kuaW9fYmFzZSwKKwkJCWluZm8tPnNjc2kuaXJxLCBpbmZvLT5zY3NpLmRtYSk7Cit9CisKK2ludCBmYXMyMTZfcHJpbnRfc3RhdHMoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICpwID0gYnVmZmVyOworCisJcCArPSBzcHJpbnRmKHAsICJcbiIKKwkJCSJDb21tYW5kIFN0YXRpc3RpY3M6XG4iCisJCQkiIFF1ZXVlZCAgICAgOiAldVxuIgorCQkJIiBJc3N1ZWQgICAgIDogJXVcbiIKKwkJCSIgQ29tcGxldGVkICA6ICV1XG4iCisJCQkiIFJlYWRzICAgICAgOiAldVxuIgorCQkJIiBXcml0ZXMgICAgIDogJXVcbiIKKwkJCSIgT3RoZXJzICAgICA6ICV1XG4iCisJCQkiIERpc2Nvbm5lY3RzOiAldVxuIgorCQkJIiBBYm9ydHMgICAgIDogJXVcbiIKKwkJCSIgQnVzIHJlc2V0cyA6ICV1XG4iCisJCQkiIEhvc3QgcmVzZXRzOiAldVxuIiwKKwkJCWluZm8tPnN0YXRzLnF1ZXVlcywJIGluZm8tPnN0YXRzLnJlbW92ZXMsCisJCQlpbmZvLT5zdGF0cy5maW5zLAkgaW5mby0+c3RhdHMucmVhZHMsCisJCQlpbmZvLT5zdGF0cy53cml0ZXMsCSBpbmZvLT5zdGF0cy5taXNjcywKKwkJCWluZm8tPnN0YXRzLmRpc2Nvbm5lY3RzLCBpbmZvLT5zdGF0cy5hYm9ydHMsCisJCQlpbmZvLT5zdGF0cy5idXNfcmVzZXRzLAkgaW5mby0+c3RhdHMuaG9zdF9yZXNldHMpOworCisJcmV0dXJuIHAgLSBidWZmZXI7Cit9CisKK2ludCBmYXMyMTZfcHJpbnRfZGV2aWNlcyhGQVMyMTZfSW5mbyAqaW5mbywgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBmYXMyMTZfZGV2aWNlICpkZXY7CisJU2NzaV9EZXZpY2UgKnNjZDsKKwljaGFyICpwID0gYnVmZmVyOworCisJcCArPSBzcHJpbnRmKHAsICJEZXZpY2UvTHVuIFRhZ2dlZFEgICAgICAgUGFyaXR5ICAgU3luY1xuIik7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2NkLCBpbmZvLT5ob3N0KSB7CisJCWRldiA9ICZpbmZvLT5kZXZpY2Vbc2NkLT5pZF07CisJCXAgKz0gc3ByaW50ZihwLCAiICAgICAlZC8lZCAgICIsIHNjZC0+aWQsIHNjZC0+bHVuKTsKKwkJaWYgKHNjZC0+dGFnZ2VkX3N1cHBvcnRlZCkKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTNzYWJsZWQoJTNkKSAiLAorCQkJCSAgICAgc2NkLT5zaW1wbGVfdGFncyA/ICJlbiIgOiAiZGlzIiwKKwkJCQkgICAgIHNjZC0+Y3VycmVudF90YWcpOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgInVuc3VwcG9ydGVkICAgIik7CisKKwkJcCArPSBzcHJpbnRmKHAsICIlM3NhYmxlZCAiLCBkZXYtPnBhcml0eV9lbmFibGVkID8gImVuIiA6ICJkaXMiKTsKKworCQlpZiAoZGV2LT5zb2YpCisJCQlwICs9IHNwcmludGYocCwgIm9mZnNldCAlZCwgJWQgbnNcbiIsCisJCQkJICAgICBkZXYtPnNvZiwgZGV2LT5wZXJpb2QgKiA0KTsKKwkJZWxzZQorCQkJcCArPSBzcHJpbnRmKHAsICJhc3luY1xuIik7CisJfQorCisJcmV0dXJuIHAgLSBidWZmZXI7Cit9CisKK0VYUE9SVF9TWU1CT0woZmFzMjE2X2luaXQpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfYWRkKTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X3F1ZXVlX2NvbW1hbmQpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfbm9xdWV1ZV9jb21tYW5kKTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X2ludHIpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfcmVtb3ZlKTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfZWhfYWJvcnQpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfZWhfZGV2aWNlX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X2VoX2J1c19yZXNldCk7CitFWFBPUlRfU1lNQk9MKGZhczIxNl9laF9ob3N0X3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woZmFzMjE2X3ByaW50X2hvc3QpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfcHJpbnRfc3RhdHMpOworRVhQT1JUX1NZTUJPTChmYXMyMTZfcHJpbnRfZGV2aWNlcyk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIEZBUzIxNi9OQ1I1M0M5eCBkcml2ZXIgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9mYXMyMTYuaCBiL2RyaXZlcnMvc2NzaS9hcm0vZmFzMjE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhMmExMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vZmFzMjE2LmgKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL2ZhczIxNi5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEZBUzIxNiBnZW5lcmljIGRyaXZlcgorICovCisjaWZuZGVmIEZBUzIxNl9ICisjZGVmaW5lIEZBUzIxNl9ICisKKyNpZm5kZWYgTk9fSVJRCisjZGVmaW5lIE5PX0lSUSAyNTUKKyNlbmRpZgorCisjaW5jbHVkZSAicXVldWUuaCIKKyNpbmNsdWRlICJtc2dxdWV1ZS5oIgorCisvKiBGQVMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworLyogdHJhbnNmZXIgY291bnQgbG93ICovCisjZGVmaW5lIFJFR19DVENMCQkoMCkKKyNkZWZpbmUgUkVHX1NUQ0wJCSgwKQorCisvKiB0cmFuc2ZlciBjb3VudCBtZWRpdW0gKi8KKyNkZWZpbmUgUkVHX0NUQ00JCSgxKQorI2RlZmluZSBSRUdfU1RDTQkJKDEpCisKKy8qIGZpZm8gZGF0YSAqLworI2RlZmluZSBSRUdfRkYJCQkoMikKKworLyogY29tbWFuZCAqLworI2RlZmluZSBSRUdfQ01ECQkJKDMpCisjZGVmaW5lIENNRF9OT1AJCQkweDAwCisjZGVmaW5lIENNRF9GTFVTSEZJRk8JCTB4MDEKKyNkZWZpbmUgQ01EX1JFU0VUQ0hJUAkJMHgwMgorI2RlZmluZSBDTURfUkVTRVRTQ1NJCQkweDAzCisKKyNkZWZpbmUgQ01EX1RSQU5TRkVSSU5GTwkweDEwCisjZGVmaW5lIENNRF9JTklUQ01EQ09NUExFVEUJMHgxMQorI2RlZmluZSBDTURfTVNHQUNDRVBURUQJCTB4MTIKKyNkZWZpbmUgQ01EX1BBREJZVEVTCQkweDE4CisjZGVmaW5lIENNRF9TRVRBVE4JCTB4MWEKKyNkZWZpbmUgQ01EX1JTRVRBVE4JCTB4MWIKKworI2RlZmluZSBDTURfU0VMRUNUV09BVE4JCTB4NDEKKyNkZWZpbmUgQ01EX1NFTEVDVEFUTgkJMHg0MgorI2RlZmluZSBDTURfU0VMRUNUQVROU1RPUAkweDQzCisjZGVmaW5lIENNRF9FTkFCTEVTRUwJCTB4NDQKKyNkZWZpbmUgQ01EX0RJU0FCTEVTRUwJCTB4NDUKKyNkZWZpbmUgQ01EX1NFTEVDVEFUTjMJCTB4NDYKKyNkZWZpbmUgQ01EX1JFU0VMMwkJMHg0NworCisjZGVmaW5lIENNRF9XSVRIRE1BCQkweDgwCisKKy8qIHN0YXR1cyByZWdpc3RlciAocmVhZCkgKi8KKyNkZWZpbmUgUkVHX1NUQVQJCSg0KQorI2RlZmluZSBTVEFUX0lPCQkJKDEgPDwgMCkJCQkvKiBJTyBwaGFzZQkJKi8KKyNkZWZpbmUgU1RBVF9DRAkJCSgxIDw8IDEpCQkJLyogQ0QgcGhhc2UJCSovCisjZGVmaW5lIFNUQVRfTVNHCQkoMSA8PCAyKQkJCS8qIE1TRyBwaGFzZQkJKi8KKyNkZWZpbmUgU1RBVF9UUkFOU0ZFUkRPTkUJKDEgPDwgMykJCQkvKiBUcmFuc2ZlciBjb21wbGV0ZWQJKi8KKyNkZWZpbmUgU1RBVF9UUkFOU0ZFUkNOVFoJKDEgPDwgNCkJCQkvKiBUcmFuc2ZlciBjb3VudGVyIGlzIHplcm8gKi8KKyNkZWZpbmUgU1RBVF9QQVJJVFlFUlJPUgkoMSA8PCA1KQkJCS8qIFBhcml0eSBlcnJvcgkJKi8KKyNkZWZpbmUgU1RBVF9SRUFMQkFECQkoMSA8PCA2KQkJCS8qIFNvbWV0aGluZyBiYWQJKi8KKyNkZWZpbmUgU1RBVF9JTlQJCSgxIDw8IDcpCQkJLyogSW50ZXJydXB0CQkqLworCisjZGVmaW5lIFNUQVRfQlVTTUFTSwkJKFNUQVRfTVNHfFNUQVRfQ0R8U1RBVF9JTykKKyNkZWZpbmUgU1RBVF9EQVRBT1VUCQkoMCkJCQkJLyogRGF0YSBvdXQJCSovCisjZGVmaW5lIFNUQVRfREFUQUlOCQkoU1RBVF9JTykJCQkvKiBEYXRhIGluCQkqLworI2RlZmluZSBTVEFUX0NPTU1BTkQJCShTVEFUX0NEKQkJCS8qIENvbW1hbmQgb3V0CQkqLworI2RlZmluZSBTVEFUX1NUQVRVUwkJKFNUQVRfQ0R8U1RBVF9JTykJCS8qIFN0YXR1cyBJbgkJKi8KKyNkZWZpbmUgU1RBVF9NRVNHT1VUCQkoU1RBVF9NU0d8U1RBVF9DRCkJCS8qIE1lc3NhZ2Ugb3V0CQkqLworI2RlZmluZSBTVEFUX01FU0dJTgkJKFNUQVRfTVNHfFNUQVRfQ0R8U1RBVF9JTykJLyogTWVzc2FnZSBJbgkJKi8KKworLyogYnVzIElEIGZvciBzZWxlY3QgLyByZXNlbGVjdCAqLworI2RlZmluZSBSRUdfU0RJRAkJKDQpCisjZGVmaW5lIEJVU0lEKHRhcmdldCkJCSgodGFyZ2V0KSAmIDcpCisKKy8qIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKHJlYWQpICovCisjZGVmaW5lIFJFR19JTlNUCQkoNSkKKyNkZWZpbmUgSU5TVF9TRUxXT0FUTgkJKDEgPDwgMCkJCQkvKiBTZWxlY3Qgdy9vIEFUTgkqLworI2RlZmluZSBJTlNUX1NFTEFUTgkJKDEgPDwgMSkJCQkvKiBTZWxlY3Qgdy9BVE4JCSovCisjZGVmaW5lIElOU1RfUkVTRUxFQ1RFRAkJKDEgPDwgMikJCQkvKiBSZXNlbGVjdGVkCQkqLworI2RlZmluZSBJTlNUX0ZVTkNET05FCQkoMSA8PCAzKQkJCS8qIEZ1bmN0aW9uIGRvbmUJKi8KKyNkZWZpbmUgSU5TVF9CVVNTRVJWSUNFCQkoMSA8PCA0KQkJCS8qIEJ1cyBzZXJ2aWNlCQkqLworI2RlZmluZSBJTlNUX0RJU0NPTk5FQ1QJCSgxIDw8IDUpCQkJLyogRGlzY29ubmVjdAkJKi8KKyNkZWZpbmUgSU5TVF9JTExFR0FMQ01ECQkoMSA8PCA2KQkJCS8qIElsbGVnYWwgY29tbWFuZAkqLworI2RlZmluZSBJTlNUX0JVU1JFU0VUCQkoMSA8PCA3KQkJCS8qIFNDU0kgQnVzIHJlc2V0CSovCisKKy8qIFRpbWVvdXQgcmVnaXN0ZXIgKHdyaXRlKSAqLworI2RlZmluZSBSRUdfU1RJTQkJKDUpCisKKy8qIFNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgKHJlYWQpICovCisjZGVmaW5lIFJFR19JUwkJCSg2KQorI2RlZmluZSBJU19CSVRTCQkJMHgwNworI2RlZmluZSBJU19TRUxBUkIJCTB4MDAJCQkJLyogU2VsZWN0ICYgQXJiIG9rCSovCisjZGVmaW5lIElTX01TR0JZVEVTRU5UCQkweDAxCQkJCS8qIE9uZSBieXRlIG1lc3NhZ2Ugc2VudCovCisjZGVmaW5lIElTX05PVENPTU1BTkQJCTB4MDIJCQkJLyogTm90IGluIGNvbW1hbmQgc3RhdGUJKi8KKyNkZWZpbmUgSVNfRUFSTFlQSEFTRQkJMHgwMwkJCQkvKiBFYXJseSBwaGFzZSBjaGFuZ2UJKi8KKyNkZWZpbmUgSVNfQ09NUExFVEUJCTB4MDQJCQkJLyogQ29tbWFuZCBvawkJKi8KKyNkZWZpbmUgSVNfU09GCQkJMHgwOAkJCQkvKiBTeW5jIG9mZiBmbGFnCSovCisKKy8qIFRyYW5zZmVyIHBlcmlvZCBzdGVwICh3cml0ZSkgKi8KKyNkZWZpbmUgUkVHX1NUUAkJCSg2KQorCisvKiBTeW5jaHJvbm91cyBPZmZzZXQgKHdyaXRlKSAqLworI2RlZmluZSBSRUdfU09GCQkJKDcpCisKKy8qIEZpZm8gc3RhdGUgcmVnaXN0ZXIgKHJlYWQpICovCisjZGVmaW5lIFJFR19DRklTCQkoNykKKyNkZWZpbmUgQ0ZJU19DRgkJCTB4MWYJCQkJLyogTnVtIGJ5dGVzIGluIEZJRk8JKi8KKyNkZWZpbmUgQ0ZJU19JUwkJCTB4ZTAJCQkJLyogU3RlcAkJCSovCisKKy8qIGNvbmZpZyByZWdpc3RlciAxICovCisjZGVmaW5lIFJFR19DTlRMMQkJKDgpCisjZGVmaW5lIENOVEwxX0NJRAkJKDcgPDwgMCkJCQkvKiBDaGlwIElECQkJKi8KKyNkZWZpbmUgQ05UTDFfU1RFCQkoMSA8PCAzKQkJCS8qIFNlbGYgdGVzdCBlbmFibGUJCSovCisjZGVmaW5lIENOVEwxX1BFUkUJCSgxIDw8IDQpCQkJLyogUGFyaXR5IGVuYWJsZSByZXBvcnRpbmcgZW4uCSovCisjZGVmaW5lIENOVEwxX1BURQkJKDEgPDwgNSkJCQkvKiBQYXJpdHkgdGVzdCBlbmFibGUJCSovCisjZGVmaW5lIENOVEwxX0RJU1IJCSgxIDw8IDYpCQkJLyogRGlzYWJsZSBJcnEgb24gU0NTSSByZXNldAkqLworI2RlZmluZSBDTlRMMV9FVE0JCSgxIDw8IDcpCQkJLyogRXh0ZW5kZWQgVGltaW5nIE1vZGUJCSovCisKKy8qIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yIChyZWFkKSAqLworI2RlZmluZSBSRUdfQ0xLRgkJKDkpCisjZGVmaW5lIENMS0ZfRjM3TUhaCQkweDAwCQkJCS8qIDM1LjAxIC0gNDAgTUh6CQkqLworI2RlZmluZSBDTEtGX0YxME1IWgkJMHgwMgkJCQkvKiAxMCBNSHoJCQkqLworI2RlZmluZSBDTEtGX0YxMk1IWgkJMHgwMwkJCQkvKiAxMC4wMSAtIDE1IE1IegkJKi8KKyNkZWZpbmUgQ0xLRl9GMTdNSFoJCTB4MDQJCQkJLyogMTUuMDEgLSAyMCBNSHoJCSovCisjZGVmaW5lIENMS0ZfRjIyTUhaCQkweDA1CQkJCS8qIDIwLjAxIC0gMjUgTUh6CQkqLworI2RlZmluZSBDTEtGX0YyN01IWgkJMHgwNgkJCQkvKiAyNS4wMSAtIDMwIE1IegkJKi8KKyNkZWZpbmUgQ0xLRl9GMzJNSFoJCTB4MDcJCQkJLyogMzAuMDEgLSAzNSBNSHoJCSovCisKKy8qIENoaXAgdGVzdCByZWdpc3RlciAod3JpdGUpICovCisjZGVmaW5lIFJFR19GVE0JCQkoMTApCisjZGVmaW5lIFRFU1RfRlRNCQkweDAxCQkJCS8qIEZvcmNlIHRhcmdldCBtb2RlCQkqLworI2RlZmluZSBURVNUX0ZJTQkJMHgwMgkJCQkvKiBGb3JjZSBpbml0aWF0b3IgbW9kZQkJKi8KKyNkZWZpbmUgVEVTVF9GSEkJCTB4MDQJCQkJLyogRm9yY2UgaGlnaCBpbXBlZGFuY2UgbW9kZQkqLworCisvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIFJFR19DTlRMMgkJKDExKQorI2RlZmluZSBDTlRMMl9QR0RQCQkoMSA8PCAwKQkJCS8qIFBhc3MgVGgvR2VuZXJhdGUgRGF0YSBQYXJpdHkJKi8KKyNkZWZpbmUgQ05UTDJfUEdSUAkJKDEgPDwgMSkJCQkvKiBQYXNzIFRoL0dlbmVyYXRlIFJlZyBQYXJpdHkJKi8KKyNkZWZpbmUgQ05UTDJfQUNEUEUJCSgxIDw8IDIpCQkJLyogQWJvcnQgb24gQ21kL0RhdGEgUGFyaXR5IEVycgkqLworI2RlZmluZSBDTlRMMl9TMkZFCQkoMSA8PCAzKQkJCS8qIFNDU0kyIEZlYXR1cmVzIEVuYWJsZQkqLworI2RlZmluZSBDTlRMMl9UU0RSCQkoMSA8PCA0KQkJCS8qIFRyaXN0YXRlIERSRVEJCSovCisjZGVmaW5lIENOVEwyX1NCTwkJKDEgPDwgNSkJCQkvKiBTZWxlY3QgQnl0ZSBPcmRlcgkJKi8KKyNkZWZpbmUgQ05UTDJfRU5GCQkoMSA8PCA2KQkJCS8qIEVuYWJsZSBmZWF0dXJlcwkJKi8KKyNkZWZpbmUgQ05UTDJfREFFCQkoMSA8PCA3KQkJCS8qIERhdGEgQWxpZ25tZW50IEVuYWJsZQkqLworCisvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDMgKHJlYWQvd3JpdGUpICovCisjZGVmaW5lIFJFR19DTlRMMwkJKDEyKQorI2RlZmluZSBDTlRMM19CUzgJCSgxIDw8IDApCQkJLyogQnVyc3Qgc2l6ZSA4CQkJKi8KKyNkZWZpbmUgQ05UTDNfTURNCQkoMSA8PCAxKQkJCS8qIE1vZGlmeSBETUEgbW9kZQkJKi8KKyNkZWZpbmUgQ05UTDNfTEJUTQkJKDEgPDwgMikJCQkvKiBMYXN0IEJ5dGUgVHJhbnNmZXIgbW9kZQkqLworI2RlZmluZSBDTlRMM19GQVNUQ0xLCQkoMSA8PCAzKQkJCS8qIEZhc3QgU0NTSSBjbG9ja2luZwkJKi8KKyNkZWZpbmUgQ05UTDNfRkFTVFNDU0kJCSgxIDw8IDQpCQkJLyogRmFzdCBTQ1NJCQkJKi8KKyNkZWZpbmUgQ05UTDNfRzJDQgkJKDEgPDwgNSkJCQkvKiBHcm91cDIgU0NTSSBzdXBwb3J0CQkqLworI2RlZmluZSBDTlRMM19RVEFHCQkoMSA8PCA2KQkJCS8qIEVuYWJsZSAzIGJ5dGUgbXNncwkJKi8KKyNkZWZpbmUgQ05UTDNfQURJRENISwkJKDEgPDwgNykJCQkvKiBBZGRpdGlvbmFsIElEIGNoZWNrCQkqLworCisvKiBIaWdoIHRyYW5zZmVyIGNvdW50IChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBSRUdfQ1RDSAkJKDE0KQorI2RlZmluZSBSRUdfU1RDSAkJKDE0KQorCisvKiBJRCByZWdpc3RlciAocmVhZCBvbmx5KSAqLworI2RlZmluZSBSRUdfSUQJCQkoMTQpCisKKy8qIERhdGEgYWxpZ25tZW50ICovCisjZGVmaW5lIFJFR19EQUwJCQkoMTUpCisKK3R5cGVkZWYgZW51bSB7CisJUEhBU0VfSURMRSwJCQkJCS8qIHdlJ3JlIG5vdCBwbGFubmluZyBvbiBkb2luZyBhbnl0aGluZwkqLworCVBIQVNFX1NFTEVDVElPTiwJCQkJLyogc2VsZWN0aW5nIGEgZGV2aWNlCQkJKi8KKwlQSEFTRV9TRUxTVEVQUywJCQkJCS8qIHNlbGVjdGlvbiB3aXRoIGNvbW1hbmQgc3RlcHMJCSovCisJUEhBU0VfQ09NTUFORCwJCQkJCS8qIGNvbW1hbmQgc2VudAkJCQkqLworCVBIQVNFX01FU1NBR0VTRU5ULAkJCQkvKiBzZWxlY3RlZCwgYW5kIHdlJ3JlIHNlbmRpbmcgY21kCSovCisJUEhBU0VfREFUQU9VVCwJCQkJCS8qIGRhdGEgb3V0IHRvIGRldmljZQkJCSovCisJUEhBU0VfREFUQUlOLAkJCQkJLyogZGF0YSBpbiBmcm9tIGRldmljZQkJCSovCisJUEhBU0VfTVNHSU4sCQkJCQkvKiBtZXNzYWdlIGluIGZyb20gZGV2aWNlCQkqLworCVBIQVNFX01TR0lOX0RJU0NPTk5FQ1QsCQkJCS8qIGRpc2Nvbm5lY3RpbmcgZnJvbSBidXMJCSovCisJUEhBU0VfTVNHT1VULAkJCQkJLyogYWZ0ZXIgbWVzc2FnZSBvdXQgcGhhc2UJCSovCisJUEhBU0VfTVNHT1VUX0VYUEVDVCwJCQkJLyogZXhwZWN0aW5nIG1lc3NhZ2Ugb3V0CQkqLworCVBIQVNFX1NUQVRVUywJCQkJCS8qIHN0YXR1cyBmcm9tIGRldmljZQkJCSovCisJUEhBU0VfRE9ORQkJCQkJLyogQ29tbWFuZCBjb21wbGV0ZQkJCSovCit9IHBoYXNlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJRE1BX09VVCwJCQkJCS8qIERNQSBmcm9tIG1lbW9yeSB0byBjaGlwCQkqLworCURNQV9JTgkJCQkJCS8qIERNQSBmcm9tIGNoaXAgdG8gbWVtb3J5CQkqLworfSBmYXNkbWFkaXJfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlmYXNkbWFfbm9uZSwJCQkJCS8qIE5vIGRtYQkJCQkqLworCWZhc2RtYV9waW8sCQkJCQkvKiBQSU8gbW9kZQkJCQkqLworCWZhc2RtYV9wc2V1ZG8sCQkJCQkvKiBQc2V1ZG8gRE1BCQkJCSovCisJZmFzZG1hX3JlYWxfYmxvY2ssCQkJCS8qIFJlYWwgRE1BLCBvbiBibG9jayBieSBibG9jayBiYXNpcwkqLworCWZhc2RtYV9yZWFsX2FsbAkJCQkJLyogUmVhbCBETUEsIG9uIHJlcXVlc3QgYnkgcmVxdWVzdAkqLworfSBmYXNkbWF0eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJbmVnX3dhaXQsCQkJCQkvKiBOZWdvY2lhdGUgd2l0aCBkZXZpY2UJCSovCisJbmVnX2lucHJvZ3Jlc3MsCQkJCQkvKiBOZWdvY2lhdGlvbiBzZW50CQkJKi8KKwluZWdfY29tcGxldGUsCQkJCQkvKiBOZWdvY2lhdGlvbiBjb21wbGV0ZQkJCSovCisJbmVnX3Rhcmdjb21wbGV0ZSwJCQkJLyogVGFyZ2V0IGNvbXBsZXRlZCBuZWdvY2lhdGlvbgkJKi8KKwluZWdfaW52YWxpZAkJCQkJLyogTmVnb2NpYXRpb24gbm90IHN1cHBvcnRlZAkJKi8KK30gbmVnX3Q7CisKKyNkZWZpbmUgTUFHSUMJMHg0NDEyOTZiZFVMCisjZGVmaW5lIE5SX01TR1MJOAorCisjZGVmaW5lIEZBU0NBUF9ETUEJCSgxIDw8IDApCisjZGVmaW5lIEZBU0NBUF9QU0VVRE9ETUEJKDEgPDwgMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJCW1hZ2ljX3N0YXJ0OworCXNwaW5sb2NrX3QJCWhvc3RfbG9jazsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OwkJCS8qIGhvc3QJCQkJCSovCisJU2NzaV9DbW5kCQkqU0NwbnQ7CQkJLyogY3VycmVudGx5IHByb2Nlc3NpbmcgY29tbWFuZAkJKi8KKwlTY3NpX0NtbmQJCSpvcmlnU0NwbnQ7CQkvKiBvcmlnaW5hbCBjb25uZWN0aW5nIGNvbW1hbmQJCSovCisJU2NzaV9DbW5kCQkqcmVxU0NwbnQ7CQkvKiByZXF1ZXN0IHNlbnNlIGNvbW1hbmQJCSovCisJU2NzaV9DbW5kCQkqcnN0U0NwbnQ7CQkvKiByZXNldCBjb21tYW5kCQkJKi8KKwlTY3NpX0NtbmQJCSpwZW5kaW5nX1NDcG50WzhdOwkvKiBwZXItZGV2aWNlIHBlbmRpbmcgY29tbWFuZHMJCSovCisJaW50CQkJbmV4dF9wZW5kaW5nOwkJLyogbmV4dCBwZW5kaW5nIGRldmljZQkJCSovCisKKwkvKgorCSAqIEVycm9yIHJlY292ZXJ5CisJICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJZWhfd2FpdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAllaF90aW1lcjsKKwl1bnNpZ25lZCBpbnQJCXJzdF9kZXZfc3RhdHVzOworCXVuc2lnbmVkIGludAkJcnN0X2J1c19zdGF0dXM7CisKKwkvKiBkcml2ZXIgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQlwaGFzZV90CQlwaGFzZTsJCQkvKiBjdXJyZW50IHBoYXNlCQkJKi8KKwkJdm9pZCBfX2lvbWVtCSppb19iYXNlOwkJLyogaW9tZW0gYmFzZSBvZiBGQVMyMTYJCQkqLworCQl1bnNpZ25lZCBpbnQJaW9fc2hpZnQ7CQkvKiBzaGlmdCB0byBhZGp1c3QgcmVnIG9mZnNldHMgYnkJKi8KKwkJdW5zaWduZWQgY2hhcgljZmdbNF07CQkJLyogY29uZmlndXJhdGlvbiByZWdpc3RlcnMJCSovCisJCWNvbnN0IGNoYXIJKnR5cGU7CQkJLyogY2hpcCB0eXBlCQkJCSovCisJCXVuc2lnbmVkIGludAlpcnE7CQkJLyogaW50ZXJydXB0CQkJCSovCisJCWludAkJZG1hOwkJCS8qIGRtYSBjaGFubmVsCQkJCSovCisKKwkJU2NzaV9Qb2ludGVyCVNDcDsJCQkvKiBjdXJyZW50IGNvbW1hbmRzIGRhdGEgcG9pbnRlcgkqLworCisJCU1zZ1F1ZXVlX3QJbXNnczsJCQkvKiBtZXNzYWdlIHF1ZXVlIGZvciBjb25uZWN0ZWQgZGV2aWNlCSovCisKKwkJdW5zaWduZWQgaW50CWFzeW5jX3N0cDsJCS8qIEFzeW5jIHRyYW5zZmVyIFNUUCB2YWx1ZQkJKi8KKwkJdW5zaWduZWQgY2hhcgltc2dpbl9maWZvOwkJLyogYnl0ZXMgaW4gZmlmbyBhdCB0aW1lIG9mIG1lc3NhZ2UgaW4JKi8KKwkJdW5zaWduZWQgY2hhcgltZXNzYWdlWzI1Nl07CQkvKiBsYXN0IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBkZXZpY2UJKi8KKworCQl1bnNpZ25lZCBjaGFyCWRpc2Nvbm5lY3RhYmxlOjE7CS8qIHRoaXMgY29tbWFuZCBjYW4gYmUgZGlzY29ubmVjdGVkCSovCisJCXVuc2lnbmVkIGNoYXIJYWJvcnRpbmc6MTsJCS8qIGFib3J0aW5nIGNvbW1hbmQJCQkqLworCX0gc2NzaTsKKworCS8qIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJcXVldWVzOworCQl1bnNpZ25lZCBpbnQJcmVtb3ZlczsKKwkJdW5zaWduZWQgaW50CWZpbnM7CisJCXVuc2lnbmVkIGludAlyZWFkczsKKwkJdW5zaWduZWQgaW50CXdyaXRlczsKKwkJdW5zaWduZWQgaW50CW1pc2NzOworCQl1bnNpZ25lZCBpbnQJZGlzY29ubmVjdHM7CisJCXVuc2lnbmVkIGludAlhYm9ydHM7CisJCXVuc2lnbmVkIGludAlidXNfcmVzZXRzOworCQl1bnNpZ25lZCBpbnQJaG9zdF9yZXNldHM7CisJfSBzdGF0czsKKworCS8qIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyCWNsb2NrcmF0ZTsJCS8qIGNsb2NrIHJhdGUgb2YgRkFTIGRldmljZSAoTUh6KQkqLworCQl1bnNpZ25lZCBjaGFyCXNlbGVjdF90aW1lb3V0OwkJLyogdGltZW91dCAoUjUpCQkJCSovCisJCXVuc2lnbmVkIGNoYXIJc3luY19tYXhfZGVwdGg7CQkvKiBTeW5jaHJvbm91cyB4ZmVyIG1heCBmaWZvIGRlcHRoCSovCisJCXVuc2lnbmVkIGNoYXIJd2lkZV9tYXhfc2l6ZTsJCS8qIE1heGltdW0gd2lkZSB0cmFuc2ZlciBzaXplCQkqLworCQl1bnNpZ25lZCBjaGFyCWNudGwzOwkJCS8qIENvbnRyb2wgUmVnIDMJCQkqLworCQl1bnNpZ25lZCBpbnQJYXN5bmNwZXJpb2Q7CQkvKiBBc3luYyB0cmFuc2ZlciBwZXJpb2QgKG5zKQkJKi8KKwkJdW5zaWduZWQgaW50CWNhcGFiaWxpdGllczsJCS8qIGRyaXZlciBjYXBhYmlsaXRpZXMJCQkqLworCQl1bnNpZ25lZCBpbnQJZGlzY29ubmVjdF9vazoxOwkvKiBEaXNjb25uZWN0cyBhbGxvd2VkPwkJCSovCisJfSBpZmNmZzsKKworCS8qIHF1ZXVlIGhhbmRsaW5nICovCisJc3RydWN0IHsKKwkgICAgCVF1ZXVlX3QJCWlzc3VlOwkJCS8qIGlzc3VlIHF1ZXVlCQkJCSovCisgICAgCQlRdWV1ZV90CQlkaXNjb25uZWN0ZWQ7CQkvKiBkaXNjb25uZWN0ZWQgY29tbWFuZCBxdWV1ZQkJKi8KKwl9IHF1ZXVlczsKKworCS8qIHBlci1kZXZpY2UgaW5mbyAqLworCXN0cnVjdCBmYXMyMTZfZGV2aWNlIHsKKwkJdW5zaWduZWQgY2hhcglkaXNjb25uZWN0X29rOjE7CS8qIGRldmljZSBjYW4gZGlzY29ubmVjdAkJKi8KKwkJdW5zaWduZWQgY2hhcglwYXJpdHlfZW5hYmxlZDoxOwkvKiBwYXJpdHkgY2hlY2tpbmcgZW5hYmxlZAkJKi8KKwkJdW5zaWduZWQgY2hhcglwYXJpdHlfY2hlY2s6MTsJCS8qIG5lZWQgdG8gY2hlY2sgcGFyaXR5IGNoZWNraW5nCSovCisJCXVuc2lnbmVkIGNoYXIJcGVyaW9kOwkJCS8qIHN5bmMgeGZlciBwZXJpb2QgaW4gKCo0bnMpCQkqLworCQl1bnNpZ25lZCBjaGFyCXN0cDsJCQkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciBwZXJpb2QJCSovCisJCXVuc2lnbmVkIGNoYXIJc29mOwkJCS8qIHN5bmNocm9ub3VzIG9mZnNldCByZWdpc3RlcgkJKi8KKwkJdW5zaWduZWQgY2hhcgl3aWRlX3hmZXI7CQkvKiBjdXJyZW50bHkgbmVnb2NpYXRlZCB3aWRlIHRyYW5zZmVyCSovCisJCW5lZ190CQlzeW5jX3N0YXRlOwkJLyogc3luY2hyb25vdXMgdHJhbnNmZXIgbW9kZQkJKi8KKwkJbmVnX3QJCXdpZGVfc3RhdGU7CQkvKiB3aWRlIHRyYW5zZmVyIG1vZGUJCQkqLworCX0gZGV2aWNlWzhdOworCXVuc2lnbmVkIGxvbmcJYnVzeWx1bnNbNjQvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsvKiBhcnJheSBvZiBiaXRzIGluZGljYXRpbmcgTFVOcyBidXN5CSovCisKKwkvKiBkbWEgKi8KKwlzdHJ1Y3QgeworCQlmYXNkbWF0eXBlX3QJdHJhbnNmZXJfdHlwZTsJCS8qIGN1cnJlbnQgdHlwZSBvZiBETUEgdHJhbnNmZXIJCSovCisJCWZhc2RtYXR5cGVfdAkoKnNldHVwKSAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsIGZhc2RtYWRpcl90IGRpcmVjdGlvbiwgZmFzZG1hdHlwZV90IG1pbl9kbWEpOworCQl2b2lkCQkoKnBzZXVkbykoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsIGZhc2RtYWRpcl90IGRpcmVjdGlvbiwgaW50IHRyYW5zZmVyKTsKKwkJdm9pZAkJKCpzdG9wKSAgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIFNjc2lfUG9pbnRlciAqU0NwKTsKKwl9IGRtYTsKKworCS8qIG1pc2NlbGxhbmVvdXMgKi8KKwlpbnQJCQlpbnRlcm5hbF9kb25lOwkJLyogZmxhZyB0byBpbmRpY2F0ZSByZXF1ZXN0IGRvbmUgKi8KKwl1bnNpZ25lZCBsb25nCQltYWdpY19lbmQ7Cit9IEZBUzIxNl9JbmZvOworCisvKiBGdW5jdGlvbjogaW50IGZhczIxNl9pbml0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqIFB1cnBvc2UgOiBpbml0aWFsaXNlIEZBUy9OQ1IvQU1EIFNDU0kgc3RydWN0dXJlcy4KKyAqIFBhcmFtcyAgOiBpbnN0YW5jZSAtIGEgZHJpdmVyLXNwZWNpZmljIGZpbGxlZC1vdXQgc3RydWN0dXJlCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfYWRkIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgc3RydWN0IGRldmljZSAqZGV2KQorICogUHVycG9zZSA6IGluaXRpYWxpc2UgRkFTL05DUi9BTUQgU0NTSSBpYy4KKyAqIFBhcmFtcyAgOiBpbnN0YW5jZSAtIGEgZHJpdmVyLXNwZWNpZmljIGZpbGxlZC1vdXQgc3RydWN0dXJlCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2FkZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qIEZ1bmN0aW9uOiBpbnQgZmFzMjE2X3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCisgKiBQdXJwb3NlIDogcXVldWUgYSBjb21tYW5kIGZvciBhZGFwdGVyIHRvIHByb2Nlc3MuCisgKiBQYXJhbXMgIDogU0NwbnQgLSBDb21tYW5kIHRvIHF1ZXVlCisgKgkgICAgIGRvbmUgIC0gZG9uZSBmdW5jdGlvbiB0byBjYWxsIG9uY2UgY29tbWFuZCBpcyBjb21wbGV0ZQorICogUmV0dXJucyA6IDAgLSBzdWNjZXNzLCBlbHNlIGVycm9yCisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfbm9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQorICogUHVycG9zZSA6IHF1ZXVlIGEgY29tbWFuZCBmb3IgYWRhcHRlciB0byBwcm9jZXNzLCBhbmQgcHJvY2VzcyBpdCB0byBjb21wbGV0aW9uLgorICogUGFyYW1zICA6IFNDcG50IC0gQ29tbWFuZCB0byBxdWV1ZQorICoJICAgICBkb25lICAtIGRvbmUgZnVuY3Rpb24gdG8gY2FsbCBvbmNlIGNvbW1hbmQgaXMgY29tcGxldGUKKyAqIFJldHVybnMgOiAwIC0gc3VjY2VzcywgZWxzZSBlcnJvcgorICovCitleHRlcm4gaW50IGZhczIxNl9ub3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKKworLyogRnVuY3Rpb246IGlycXJldHVybl90IGZhczIxNl9pbnRyIChGQVMyMTZfSW5mbyAqaW5mbykKKyAqIFB1cnBvc2UgOiBoYW5kbGUgaW50ZXJydXB0cyBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gcHJvZ3Jlc3MgYSBjb21tYW5kCisgKiBQYXJhbXMgIDogaW5mbyAtIGludGVyZmFjZSB0byBzZXJ2aWNlCisgKi8KK2V4dGVybiBpcnFyZXR1cm5fdCBmYXMyMTZfaW50ciAoRkFTMjE2X0luZm8gKmluZm8pOworCitleHRlcm4gdm9pZCBmYXMyMTZfcmVtb3ZlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisKKy8qIEZ1bmN0aW9uOiB2b2lkIGZhczIxNl9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqIFB1cnBvc2UgOiByZWxlYXNlIGFsbCByZXNvdXJjZXMgYW5kIHB1dCBldmVyeXRoaW5nIHRvIGJlZCBmb3IgRkFTL05DUi9BTUQgU0NTSSBpYy4KKyAqIFBhcmFtcyAgOiBpbnN0YW5jZSAtIGEgZHJpdmVyLXNwZWNpZmljIGZpbGxlZC1vdXQgc3RydWN0dXJlCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiB2b2lkIGZhczIxNl9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisKK2V4dGVybiBpbnQgZmFzMjE2X3ByaW50X2hvc3QoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcik7CitleHRlcm4gaW50IGZhczIxNl9wcmludF9zdGF0cyhGQVMyMTZfSW5mbyAqaW5mbywgY2hhciAqYnVmZmVyKTsKK2V4dGVybiBpbnQgZmFzMjE2X3ByaW50X2RldmljZXMoRkFTMjE2X0luZm8gKmluZm8sIGNoYXIgKmJ1ZmZlcik7CisKKy8qIEZ1bmN0aW9uOiBpbnQgZmFzMjE2X2VoX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogYWJvcnQgdGhpcyBjb21tYW5kCisgKiBQYXJhbXMgIDogU0NwbnQgLSBjb21tYW5kIHRvIGFib3J0CisgKiBSZXR1cm5zIDogRkFJTEVEIGlmIHVuYWJsZSB0byBhYm9ydAorICovCitleHRlcm4gaW50IGZhczIxNl9laF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogUmVzZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kCisgKiBQYXJhbXMgIDogU0NwbnQgLSBjb21tYW5kIHNwZWNpZmluZyBkZXZpY2UgdG8gcmVzZXQKKyAqIFJldHVybnMgOiBGQUlMRUQgaWYgdW5hYmxlIHRvIHJlc2V0CisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfZWhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogUmVzZXQgdGhlIGNvbXBsZXRlIGJ1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kCisgKiBQYXJhbXMgIDogU0NwbnQgLSBjb21tYW5kIHNwZWNpZmluZyBidXMgdG8gcmVzZXQKKyAqIFJldHVybnMgOiBGQUlMRUQgaWYgdW5hYmxlIHRvIHJlc2V0CisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2VoX2J1c19yZXNldChTY3NpX0NtbmQgKlNDcG50KTsKKworLyogRnVuY3Rpb246IGludCBmYXMyMTZfZWhfaG9zdF9yZXNldChTY3NpX0NtbmQgKlNDcG50KQorICogUHVycG9zZSA6IFJlc2V0IHRoZSBob3N0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbW1hbmQKKyAqIFBhcmFtcyAgOiBTQ3BudCAtIGNvbW1hbmQgc3BlY2lmaW5nIGhvc3QgdG8gcmVzZXQKKyAqIFJldHVybnMgOiBGQUlMRUQgaWYgdW5hYmxlIHRvIHJlc2V0CisgKi8KK2V4dGVybiBpbnQgZmFzMjE2X2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCk7CisKKyNlbmRpZiAvKiBGQVMyMTZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5jIGIvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTVjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL21zZ3F1ZXVlLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL21zZ3F1ZXVlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgbWVzc2FnZSBxdWV1ZSBoYW5kbGluZworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAibXNncXVldWUuaCIKKworLyoKKyAqIEZ1bmN0aW9uOiBzdHJ1Y3QgbXNncXVldWVfZW50cnkgKm1xZV9hbGxvYyhNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IEFsbG9jYXRlIGEgbWVzc2FnZSBxdWV1ZSBlbnRyeQorICogUGFyYW1zICA6IG1zZ3EgLSBtZXNzYWdlIHF1ZXVlIHRvIGNsYWltIGVudHJ5IGZvcgorICogUmV0dXJucyA6IG1lc3NhZ2UgcXVldWUgZW50cnkgb3IgTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBtc2dxdWV1ZV9lbnRyeSAqbXFlX2FsbG9jKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcTsKKworCWlmICgobXEgPSBtc2dxLT5mcmVlKSAhPSBOVUxMKQorCQltc2dxLT5mcmVlID0gbXEtPm5leHQ7CisKKwlyZXR1cm4gbXE7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogdm9pZCBtcWVfZnJlZShNc2dRdWV1ZV90ICptc2dxLCBzdHJ1Y3QgbXNncXVldWVfZW50cnkgKm1xKQorICogUHVycG9zZSA6IGZyZWUgYSBtZXNzYWdlIHF1ZXVlIGVudHJ5CisgKiBQYXJhbXMgIDogbXNncSAtIG1lc3NhZ2UgcXVldWUgdG8gZnJlZSBlbnRyeSBmcm9tCisgKgkgICAgIG1xICAgLSBtZXNzYWdlIHF1ZXVlIGVudHJ5IHRvIGZyZWUKKyAqLworc3RhdGljIHZvaWQgbXFlX2ZyZWUoTXNnUXVldWVfdCAqbXNncSwgc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcSkKK3sKKwlpZiAobXEpIHsKKwkJbXEtPm5leHQgPSBtc2dxLT5mcmVlOworCQltc2dxLT5mcmVlID0gbXE7CisJfQorfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfaW5pdGlhbGlzZShNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IGluaXRpYWxpc2UgYSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAtIHF1ZXVlIHRvIGluaXRpYWxpc2UKKyAqLwordm9pZCBtc2dxdWV1ZV9pbml0aWFsaXNlKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJaW50IGk7CisKKwltc2dxLT5xZSA9IE5VTEw7CisJbXNncS0+ZnJlZSA9ICZtc2dxLT5lbnRyaWVzWzBdOworCisJZm9yIChpID0gMDsgaSA8IE5SX01FU1NBR0VTOyBpKyspCisJCW1zZ3EtPmVudHJpZXNbaV0ubmV4dCA9ICZtc2dxLT5lbnRyaWVzW2kgKyAxXTsKKworCW1zZ3EtPmVudHJpZXNbTlJfTUVTU0FHRVMgLSAxXS5uZXh0ID0gTlVMTDsKK30KKworCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfZnJlZShNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IGZyZWUgYSBxdWV1ZQorICogUGFyYW1zICA6IG1zZ3EgLSBxdWV1ZSB0byBmcmVlCisgKi8KK3ZvaWQgbXNncXVldWVfZnJlZShNc2dRdWV1ZV90ICptc2dxKQoreworfQorCisvKgorICogRnVuY3Rpb246IGludCBtc2dxdWV1ZV9tc2dsZW5ndGgoTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiBhbGwgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxIC0gcXVldWUgdG8gZXhhbWluZQorICogUmV0dXJucyA6IG51bWJlciBvZiBieXRlcyBvZiBtZXNzYWdlcyBpbiBxdWV1ZQorICovCitpbnQgbXNncXVldWVfbXNnbGVuZ3RoKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcSA9IG1zZ3EtPnFlOworCWludCBsZW5ndGggPSAwOworCisJZm9yIChtcSA9IG1zZ3EtPnFlOyBtcTsgbXEgPSBtcS0+bmV4dCkKKwkJbGVuZ3RoICs9IG1xLT5tc2cubGVuZ3RoOworCisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBzdHJ1Y3QgbWVzc2FnZSAqbXNncXVldWVfZ2V0bXNnKE1zZ1F1ZXVlX3QgKm1zZ3EsIGludCBtc2dubykKKyAqIFB1cnBvc2UgOiByZXR1cm4gYSBtZXNzYWdlCisgKiBQYXJhbXMgIDogbXNncSAgIC0gcXVldWUgdG8gb2J0YWluIG1lc3NhZ2UgZnJvbQorICoJICAgOiBtc2dubyAgLSBtZXNzYWdlIG51bWJlcgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gbWVzc2FnZSBzdHJpbmcsIG9yIE5VTEwKKyAqLworc3RydWN0IG1lc3NhZ2UgKm1zZ3F1ZXVlX2dldG1zZyhNc2dRdWV1ZV90ICptc2dxLCBpbnQgbXNnbm8pCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcTsKKworCWZvciAobXEgPSBtc2dxLT5xZTsgbXEgJiYgbXNnbm87IG1xID0gbXEtPm5leHQsIG1zZ25vLS0pOworCisJcmV0dXJuIG1xID8gJm1xLT5tc2cgOiBOVUxMOworfQorCisvKgorICogRnVuY3Rpb246IGludCBtc2dxdWV1ZV9hZGRtc2coTXNnUXVldWVfdCAqbXNncSwgaW50IGxlbmd0aCwgLi4uKQorICogUHVycG9zZSA6IGFkZCBhIG1lc3NhZ2Ugb250byBhIG1lc3NhZ2UgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxICAgLSBxdWV1ZSB0byBhZGQgbWVzc2FnZSBvbgorICoJICAgICBsZW5ndGggLSBsZW5ndGggb2YgbWVzc2FnZQorICoJICAgICAuLi4gICAgLSBtZXNzYWdlIGJ5dGVzCisgKiBSZXR1cm5zIDogIT0gMCBpZiBzdWNjZXNzZnVsCisgKi8KK2ludCBtc2dxdWV1ZV9hZGRtc2coTXNnUXVldWVfdCAqbXNncSwgaW50IGxlbmd0aCwgLi4uKQoreworCXN0cnVjdCBtc2dxdWV1ZV9lbnRyeSAqbXEgPSBtcWVfYWxsb2MobXNncSk7CisJdmFfbGlzdCBhcDsKKworCWlmIChtcSkgeworCQlzdHJ1Y3QgbXNncXVldWVfZW50cnkgKiptcXA7CisJCWludCBpOworCisJCXZhX3N0YXJ0KGFwLCBsZW5ndGgpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCQltcS0+bXNnLm1zZ1tpXSA9IHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KTsKKwkJdmFfZW5kKGFwKTsKKworCQltcS0+bXNnLmxlbmd0aCA9IGxlbmd0aDsKKwkJbXEtPm1zZy5maWZvID0gMDsKKwkJbXEtPm5leHQgPSBOVUxMOworCisJCW1xcCA9ICZtc2dxLT5xZTsKKwkJd2hpbGUgKCptcXApCisJCQltcXAgPSAmKCptcXApLT5uZXh0OworCisJCSptcXAgPSBtcTsKKwl9CisKKwlyZXR1cm4gbXEgIT0gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIG1zZ3F1ZXVlX2ZsdXNoKE1zZ1F1ZXVlX3QgKm1zZ3EpCisgKiBQdXJwb3NlIDogZmx1c2ggYWxsIG1lc3NhZ2VzIGZyb20gbWVzc2FnZSBxdWV1ZQorICogUGFyYW1zICA6IG1zZ3EgLSBxdWV1ZSB0byBmbHVzaAorICovCit2b2lkIG1zZ3F1ZXVlX2ZsdXNoKE1zZ1F1ZXVlX3QgKm1zZ3EpCit7CisJc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICptcSwgKm1xbmV4dDsKKworCWZvciAobXEgPSBtc2dxLT5xZTsgbXE7IG1xID0gbXFuZXh0KSB7CisJCW1xbmV4dCA9IG1xLT5uZXh0OworCQltcWVfZnJlZShtc2dxLCBtcSk7CisJfQorCW1zZ3EtPnFlID0gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTChtc2dxdWV1ZV9pbml0aWFsaXNlKTsKK0VYUE9SVF9TWU1CT0wobXNncXVldWVfZnJlZSk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX21zZ2xlbmd0aCk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX2dldG1zZyk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX2FkZG1zZyk7CitFWFBPUlRfU1lNQk9MKG1zZ3F1ZXVlX2ZsdXNoKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgbWVzc2FnZSBxdWV1ZSBoYW5kbGluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5oIGIvZHJpdmVycy9zY3NpL2FybS9tc2dxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzczMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL21zZ3F1ZXVlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvbXNncXVldWUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgbWVzc2FnZSBxdWV1ZSBoYW5kbGluZworICovCisjaWZuZGVmIE1TR1FVRVVFX0gKKyNkZWZpbmUgTVNHUVVFVUVfSAorCitzdHJ1Y3QgbWVzc2FnZSB7CisgICAgY2hhciBtc2dbOF07CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgZmlmbzsKK307CisKK3N0cnVjdCBtc2dxdWV1ZV9lbnRyeSB7CisgICAgc3RydWN0IG1lc3NhZ2UgbXNnOworICAgIHN0cnVjdCBtc2dxdWV1ZV9lbnRyeSAqbmV4dDsKK307CisKKyNkZWZpbmUgTlJfTUVTU0FHRVMgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IG1zZ3F1ZXVlX2VudHJ5ICpxZTsKKyAgICBzdHJ1Y3QgbXNncXVldWVfZW50cnkgKmZyZWU7CisgICAgc3RydWN0IG1zZ3F1ZXVlX2VudHJ5IGVudHJpZXNbTlJfTUVTU0FHRVNdOworfSBNc2dRdWV1ZV90OworCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfaW5pdGlhbGlzZShNc2dRdWV1ZV90ICptc2dxKQorICogUHVycG9zZSA6IGluaXRpYWxpc2UgYSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAtIHF1ZXVlIHRvIGluaXRpYWxpc2UKKyAqLworZXh0ZXJuIHZvaWQgbXNncXVldWVfaW5pdGlhbGlzZShNc2dRdWV1ZV90ICptc2dxKTsKKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIG1zZ3F1ZXVlX2ZyZWUoTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBmcmVlIGEgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxIC0gcXVldWUgdG8gZnJlZQorICovCitleHRlcm4gdm9pZCBtc2dxdWV1ZV9mcmVlKE1zZ1F1ZXVlX3QgKm1zZ3EpOworCisvKgorICogRnVuY3Rpb246IGludCBtc2dxdWV1ZV9tc2dsZW5ndGgoTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiBhbGwgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUKKyAqIFBhcmFtcyAgOiBtc2dxIC0gcXVldWUgdG8gZXhhbWluZQorICogUmV0dXJucyA6IG51bWJlciBvZiBieXRlcyBvZiBtZXNzYWdlcyBpbiBxdWV1ZQorICovCitleHRlcm4gaW50IG1zZ3F1ZXVlX21zZ2xlbmd0aChNc2dRdWV1ZV90ICptc2dxKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBzdHJ1Y3QgbWVzc2FnZSAqbXNncXVldWVfZ2V0bXNnKE1zZ1F1ZXVlX3QgKm1zZ3EsIGludCBtc2dubykKKyAqIFB1cnBvc2UgOiByZXR1cm4gYSBtZXNzYWdlICYgaXRzIGxlbmd0aAorICogUGFyYW1zICA6IG1zZ3EgICAtIHF1ZXVlIHRvIG9idGFpbiBtZXNzYWdlIGZyb20KKyAqICAgICAgICAgOiBtc2dubyAgLSBtZXNzYWdlIG51bWJlcgorICogUmV0dXJucyA6IHBvaW50ZXIgdG8gbWVzc2FnZSBzdHJpbmcsIG9yIE5VTEwKKyAqLworZXh0ZXJuIHN0cnVjdCBtZXNzYWdlICptc2dxdWV1ZV9nZXRtc2coTXNnUXVldWVfdCAqbXNncSwgaW50IG1zZ25vKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgbXNncXVldWVfYWRkbXNnKE1zZ1F1ZXVlX3QgKm1zZ3EsIGludCBsZW5ndGgsIC4uLikKKyAqIFB1cnBvc2UgOiBhZGQgYSBtZXNzYWdlIG9udG8gYSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAgIC0gcXVldWUgdG8gYWRkIG1lc3NhZ2Ugb24KKyAqCSAgICAgbGVuZ3RoIC0gbGVuZ3RoIG9mIG1lc3NhZ2UKKyAqCSAgICAgLi4uICAgIC0gbWVzc2FnZSBieXRlcworICogUmV0dXJucyA6ICE9IDAgaWYgc3VjY2Vzc2Z1bAorICovCitleHRlcm4gaW50IG1zZ3F1ZXVlX2FkZG1zZyhNc2dRdWV1ZV90ICptc2dxLCBpbnQgbGVuZ3RoLCAuLi4pOworCisvKgorICogRnVuY3Rpb246IHZvaWQgbXNncXVldWVfZmx1c2goTXNnUXVldWVfdCAqbXNncSkKKyAqIFB1cnBvc2UgOiBmbHVzaCBhbGwgbWVzc2FnZXMgZnJvbSBtZXNzYWdlIHF1ZXVlCisgKiBQYXJhbXMgIDogbXNncSAtIHF1ZXVlIHRvIGZsdXNoCisgKi8KK2V4dGVybiB2b2lkIG1zZ3F1ZXVlX2ZsdXNoKE1zZ1F1ZXVlX3QgKm1zZ3EpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vb2FrLmMgYi9kcml2ZXJzL3Njc2kvYXJtL29hay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjU1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL29hay5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogT2FrIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NS0yMDAyLCBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjZGVmaW5lIEFVVE9TRU5TRQorLyojZGVmaW5lIFBTRVVET19ETUEqLworCisjZGVmaW5lIE9BS1NDU0lfUFVCTElDX1JFTEVBU0UgMQorCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpCQlvYWtzY3NpX3JlYWQoX2luc3RhbmNlLCByZWcpCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkJb2Frc2NzaV93cml0ZShfaW5zdGFuY2UsIHJlZywgdmFsdWUpCisjZGVmaW5lIE5DUjUzODBfaW50cgkJCW9ha3Njc2lfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQJCW9ha3Njc2lfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbwkJb2Frc2NzaV9wcm9jX2luZm8KKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcwlpbnQgcG9ydCwgY3RybAorI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKQkJc3RydWN0IFNjc2lfSG9zdCAqX2luc3RhbmNlCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpCQlfaW5zdGFuY2UgPSBpbnN0YW5jZQorCisjZGVmaW5lIEJPQVJEX05PUk1BTAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisKKyNpbmNsdWRlICIuLi9OQ1I1MzgwLmgiCisKKyN1bmRlZiBTVEFSVF9ETUFfSU5JVElBVE9SX1JFQ0VJVkVfUkVHCisjZGVmaW5lIFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcgKDcgKyAxMjgpCisKK2NvbnN0IGNoYXIgKiBvYWtzY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNwbnQpCit7CisJcmV0dXJuICIiOworfQorCisjZGVmaW5lIFNUQVQocCkgICBpbncocCArIDE0NCkKK2V4dGVybiB2b2lkIGluc3diKGludCBmcm9tLCB2b2lkICp0bywgaW50IGxlbik7CisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHdyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICBpbnQgbGVuKQoreworICBpbnQgaW9iYXNlID0gaW5zdGFuY2UtPmlvX3BvcnQ7CitwcmludGsoIndyaXRpbmcgJXAgbGVuICVkXG4iLGFkZHIsIGxlbik7CisgIGlmKCFsZW4pIHJldHVybiAtMTsKKworICB3aGlsZSgxKQorICB7CisgICAgaW50IHN0YXR1czsKKyAgICB3aGlsZSgoKHN0YXR1cyA9IFNUQVQoaW9iYXNlKSkgJiAweDEwMCk9PTApOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHJlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCisgICAgICAgICAgICAgIGludCBsZW4pCit7CisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKK3ByaW50aygicmVhZGluZyAlcCBsZW4gJWRcbiIsIGFkZHIsIGxlbik7CisgIHdoaWxlKGxlbiA+IDApCisgIHsKKyAgICBpbnQgc3RhdHVzLCB0aW1lb3V0OworICAgIHVuc2lnbmVkIGxvbmcgYjsKKyAgICAKKyAgICB0aW1lb3V0ID0gMHgwMUZGRkZGRjsKKyAgICAKKyAgICB3aGlsZSgoKHN0YXR1cyA9IFNUQVQoaW9iYXNlKSkgJiAweDEwMCk9PTApCisgICAgeworICAgICAgdGltZW91dC0tOworICAgICAgaWYoc3RhdHVzICYgMHgyMDAgfHwgIXRpbWVvdXQpCisgICAgICB7CisgICAgICAgIHByaW50aygic3RhdHVzID0gJTA4WFxuIixzdGF0dXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYobGVuID49IDEyOCkKKyAgICB7CisgICAgICBpbnN3Yihpb2Jhc2UgKyAxMzYsIGFkZHIsIDEyOCk7CisgICAgICBhZGRyICs9IDEyODsKKyAgICAgIGxlbiAtPSAxMjg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBiID0gKHVuc2lnbmVkIGxvbmcpIGludyhpb2Jhc2UgKyAxMzYpOworICAgICAgKmFkZHIgKysgPSBiOworICAgICAgbGVuIC09IDE7CisgICAgICBpZihsZW4pCisgICAgICAgICphZGRyICsrID0gYj4+ODsKKyAgICAgIGxlbiAtPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworI2RlZmluZSBvYWtzY3NpX3JlYWQoaW5zdGFuY2UscmVnKQkoaW5iKChpbnN0YW5jZSktPmlvX3BvcnQgKyAocmVnKSkpCisjZGVmaW5lIG9ha3Njc2lfd3JpdGUoaW5zdGFuY2UscmVnLHZhbCkJKG91dGIoKHZhbCksIChpbnN0YW5jZSktPmlvX3BvcnQgKyAocmVnKSkpCisKKyN1bmRlZiBTVEFUCisKKyNpbmNsdWRlICIuLi9OQ1I1MzgwLmMiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgb2Frc2NzaV90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19pbmZvCQk9IG9ha3Njc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiT2FrIDE2LWJpdCBTQ1NJIiwKKwkuaW5mbwkJCT0gb2Frc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gb2Frc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gTkNSNTM4MF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IE5DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IE5DUjUzODBfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBOQ1I1MzgwX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSAxNiwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAyLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSAib2Frc2NzaSIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorb2Frc2NzaV9wcm9iZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZvYWtzY3NpX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0OworCisJaG9zdC0+aW9fcG9ydCA9IGVjYXJkX2FkZHJlc3MoZWMsIEVDQVJEX01FTUMsIDApOworCWhvc3QtPmlycSA9IElSUV9OT05FOworCWhvc3QtPm5faW9fcG9ydCA9IDI1NTsKKworCXJldCA9IC1FQlVTWTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJPYWsgU0NTSSIpKQorCQlnb3RvIHVucmVnOworCisJTkNSNTM4MF9pbml0KGhvc3QsIDApOworCisJcHJpbnRrKCJzY3NpJWQ6IGF0IHBvcnQgMHglMDhseCBpcnFzIGRpc2FibGVkIiwKKwkJaG9zdC0+aG9zdF9ubywgaG9zdC0+aW9fcG9ydCk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLAorCQlob3N0LT5jYW5fcXVldWUsIGhvc3QtPmNtZF9wZXJfbHVuLCBPQUtTQ1NJX1BVQkxJQ19SRUxFQVNFKTsKKwlwcmludGsoIlxuc2NzaSVkOiIsIGhvc3QtPmhvc3Rfbm8pOworCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhob3N0KTsKKwlwcmludGsoIlxuIik7CisKKwlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZlYy0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yZWxlYXNlOworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJZ290byBvdXQ7CisKKyBvdXRfcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworIHVucmVnOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBvYWtzY3NpX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgTlVMTCk7CisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKworCU5DUjUzODBfZXhpdChob3N0KTsKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgb2Frc2NzaV9jaWRzW10gPSB7CisJeyBNQU5VX09BSywgUFJPRF9PQUtfU0NTSSB9LAorCXsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgb2Frc2NzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9ha3Njc2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvYWtzY3NpX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gb2Frc2NzaV9jaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCQk9ICJvYWtzY3NpIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2Frc2NzaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmb2Frc2NzaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb2Frc2NzaV9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmb2Frc2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvYWtzY3NpX2luaXQpOworbW9kdWxlX2V4aXQob2Frc2NzaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9hayBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3Bvd2VydGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmMjNiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcG93ZXJ0ZWMuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvcG93ZXJ0ZWMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImZhczIxNi5oIgorI2luY2x1ZGUgInNjc2kuaCIKKworI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjZGVmaW5lIFBPV0VSVEVDX0ZBUzIxNl9PRkZTRVQJMHgzMDAwCisjZGVmaW5lIFBPV0VSVEVDX0ZBUzIxNl9TSElGVAk2CisKKyNkZWZpbmUgUE9XRVJURUNfSU5UUl9TVEFUVVMJMHgyMDAwCisjZGVmaW5lIFBPV0VSVEVDX0lOVFJfQklUCTB4ODAKKworI2RlZmluZSBQT1dFUlRFQ19SRVNFVF9DT05UUk9MCTB4MTAxOAorI2RlZmluZSBQT1dFUlRFQ19SRVNFVF9CSVQJMQorCisjZGVmaW5lIFBPV0VSVEVDX1RFUk1fQ09OVFJPTAkweDIwMTgKKyNkZWZpbmUgUE9XRVJURUNfVEVSTV9FTkFCTEUJMQorCisjZGVmaW5lIFBPV0VSVEVDX0lOVFJfQ09OVFJPTAkweDEwMWMKKyNkZWZpbmUgUE9XRVJURUNfSU5UUl9FTkFCTEUJMQorI2RlZmluZSBQT1dFUlRFQ19JTlRSX0RJU0FCTEUJMAorCisjZGVmaW5lIFZFUlNJT04JIjEuMTAgKDE5LzAxLzIwMDMgMi41LjU5KSIKKworLyoKKyAqIFVzZSB0ZXJtPTAsMSwwLDAsMCB0byB0dXJuIHRlcm1pbmF0b3JzIG9uL29mZi4KKyAqIE9uZSBlbnRyeSBwZXIgc2xvdC4KKyAqLworc3RhdGljIGludCB0ZXJtW01BWF9FQ0FSRFNdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH07CisKKyNkZWZpbmUgTlJfU0cJMjU2CisKK3N0cnVjdCBwb3dlcnRlY19pbmZvIHsKKwlGQVMyMTZfSW5mbwkJaW5mbzsKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQJKmVjOworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdW5zaWduZWQgaW50CQl0ZXJtX2N0bDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJc2dbTlJfU0ddOworfTsKKworLyogUHJvdG90eXBlOiB2b2lkIHBvd2VydGVjc2NzaV9pcnFlbmFibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBFbmFibGUgaW50ZXJydXB0cyBvbiBQb3dlcnRlYyBTQ1NJIGNhcmQKKyAqIFBhcmFtcyAgIDogZWMgICAgLSBleHBhbnNpb24gY2FyZCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgIDogaXJxbnIgLSBpbnRlcnJ1cHQgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCitwb3dlcnRlY3Njc2lfaXJxZW5hYmxlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGludCBpcnFucikKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IGVjLT5pcnFfZGF0YTsKKwl3cml0ZWIoUE9XRVJURUNfSU5UUl9FTkFCTEUsIGluZm8tPmJhc2UgKyBQT1dFUlRFQ19JTlRSX0NPTlRST0wpOworfQorCisvKiBQcm90b3R5cGU6IHZvaWQgcG93ZXJ0ZWNzY3NpX2lycWRpc2FibGUoZWMsIGlycW5yKQorICogUHVycG9zZSAgOiBEaXNhYmxlIGludGVycnVwdHMgb24gUG93ZXJ0ZWMgU0NTSSBjYXJkCisgKiBQYXJhbXMgICA6IGVjICAgIC0gZXhwYW5zaW9uIGNhcmQgc3RydWN0dXJlCisgKiAgICAgICAgICA6IGlycW5yIC0gaW50ZXJydXB0IG51bWJlcgorICovCitzdGF0aWMgdm9pZAorcG93ZXJ0ZWNzY3NpX2lycWRpc2FibGUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBwb3dlcnRlY19pbmZvICppbmZvID0gZWMtPmlycV9kYXRhOworCXdyaXRlYihQT1dFUlRFQ19JTlRSX0RJU0FCTEUsIGluZm8tPmJhc2UgKyBQT1dFUlRFQ19JTlRSX0NPTlRST0wpOworfQorCitzdGF0aWMgY29uc3QgZXhwYW5zaW9uY2FyZF9vcHNfdCBwb3dlcnRlY3Njc2lfb3BzID0geworCS5pcnFlbmFibGUJPSBwb3dlcnRlY3Njc2lfaXJxZW5hYmxlLAorCS5pcnFkaXNhYmxlCT0gcG93ZXJ0ZWNzY3NpX2lycWRpc2FibGUsCit9OworCisvKiBQcm90b3R5cGU6IHZvaWQgcG93ZXJ0ZWNzY3NpX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIG9uX29mZikKKyAqIFB1cnBvc2UgIDogVHVybiB0aGUgUG93ZXJ0ZWMgU0NTSSB0ZXJtaW5hdG9ycyBvbiBvciBvZmYKKyAqIFBhcmFtcyAgIDogaG9zdCAgIC0gY2FyZCB0byB0dXJuIG9uL29mZgorICogICAgICAgICAgOiBvbl9vZmYgLSAhMCB0byB0dXJuIG9uLCAwIHRvIHR1cm4gb2ZmCisgKi8KK3N0YXRpYyB2b2lkCitwb3dlcnRlY3Njc2lfdGVybWluYXRvcl9jdGwoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IG9uX29mZikKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJaW5mby0+dGVybV9jdGwgPSBvbl9vZmYgPyBQT1dFUlRFQ19URVJNX0VOQUJMRSA6IDA7CisJd3JpdGViKGluZm8tPnRlcm1fY3RsLCBpbmZvLT5iYXNlICsgUE9XRVJURUNfVEVSTV9DT05UUk9MKTsKK30KKworLyogUHJvdG90eXBlOiB2b2lkIHBvd2VydGVjc2NzaV9pbnRyKGlycSwgKmRldl9pZCwgKnJlZ3MpCisgKiBQdXJwb3NlICA6IGhhbmRsZSBpbnRlcnJ1cHRzIGZyb20gUG93ZXJ0ZWMgU0NTSSBjYXJkCisgKiBQYXJhbXMgICA6IGlycSAgICAtIGludGVycnVwdCBudW1iZXIKKyAqCSAgICAgIGRldl9pZCAtIHVzZXItZGVmaW5lZCAoU2NzaV9Ib3N0IHN0cnVjdHVyZSkKKyAqCSAgICAgIHJlZ3MgICAtIHByb2Nlc3NvciByZWdpc3RlcnMgYXQgaW50ZXJydXB0CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcG93ZXJ0ZWNzY3NpX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IGRldl9pZDsKKworCXJldHVybiBmYXMyMTZfaW50cigmaW5mby0+aW5mbyk7Cit9CisKKy8qIFByb3RvdHlwZTogZmFzZG1hdHlwZV90IHBvd2VydGVjc2NzaV9kbWFfc2V0dXAoaG9zdCwgU0NwbnQsIGRpcmVjdGlvbiwgbWluX3R5cGUpCisgKiBQdXJwb3NlICA6IGluaXRpYWxpc2VzIERNQS9QSU8KKyAqIFBhcmFtcyAgIDogaG9zdCAgICAgIC0gaG9zdAorICoJICAgICAgU0NwbnQgICAgIC0gY29tbWFuZAorICoJICAgICAgZGlyZWN0aW9uIC0gRE1BIG9uIHRvL29mZiBvZiBjYXJkCisgKgkgICAgICBtaW5fdHlwZSAgLSBtaW5pbXVtIERNQSBzdXBwb3J0IHRoYXQgd2UgbXVzdCBoYXZlIGZvciB0aGlzIHRyYW5zZmVyCisgKiBSZXR1cm5zICA6IHR5cGUgb2YgdHJhbnNmZXIgdG8gYmUgcGVyZm9ybWVkCisgKi8KK3N0YXRpYyBmYXNkbWF0eXBlX3QKK3Bvd2VydGVjc2NzaV9kbWFfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3AsCisJCSAgICAgICBmYXNkbWFkaXJfdCBkaXJlY3Rpb24sIGZhc2RtYXR5cGVfdCBtaW5fdHlwZSkKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNjc2lfZ2V0X2RldmljZShob3N0KTsKKwlpbnQgZG1hY2ggPSBpbmZvLT5pbmZvLnNjc2kuZG1hOworCisJaWYgKGluZm8tPmluZm8uaWZjZmcuY2FwYWJpbGl0aWVzICYgRkFTQ0FQX0RNQSAmJgorCSAgICBtaW5fdHlwZSA9PSBmYXNkbWFfcmVhbF9hbGwpIHsKKwkJaW50IGJ1ZnMsIG1hcF9kaXIsIGRtYV9kaXI7CisKKwkJYnVmcyA9IGNvcHlfU0NwX3RvX3NnKCZpbmZvLT5zZ1swXSwgU0NwLCBOUl9TRyk7CisKKwkJaWYgKGRpcmVjdGlvbiA9PSBETUFfT1VUKQorCQkJbWFwX2RpciA9IERNQV9UT19ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfV1JJVEU7CisJCWVsc2UKKwkJCW1hcF9kaXIgPSBETUFfRlJPTV9ERVZJQ0UsCisJCQlkbWFfZGlyID0gRE1BX01PREVfUkVBRDsKKworCQlkbWFfbWFwX3NnKGRldiwgaW5mby0+c2csIGJ1ZnMgKyAxLCBtYXBfZGlyKTsKKworCQlkaXNhYmxlX2RtYShkbWFjaCk7CisJCXNldF9kbWFfc2coZG1hY2gsIGluZm8tPnNnLCBidWZzICsgMSk7CisJCXNldF9kbWFfbW9kZShkbWFjaCwgZG1hX2Rpcik7CisJCWVuYWJsZV9kbWEoZG1hY2gpOworCQlyZXR1cm4gZmFzZG1hX3JlYWxfYWxsOworCX0KKworCS8qCisJICogSWYgd2UncmUgbm90IGRvaW5nIERNQSwKKwkgKiAgd2UnbGwgZG8gc2xvdyBQSU8KKwkgKi8KKwlyZXR1cm4gZmFzZG1hX3BpbzsKK30KKworLyogUHJvdG90eXBlOiBpbnQgcG93ZXJ0ZWNzY3NpX2RtYV9zdG9wKGhvc3QsIFNDcG50KQorICogUHVycG9zZSAgOiBzdG9wcyBETUEvUElPCisgKiBQYXJhbXMgICA6IGhvc3QgIC0gaG9zdAorICoJICAgICAgU0NwbnQgLSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkCitwb3dlcnRlY3Njc2lfZG1hX3N0b3Aoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgU2NzaV9Qb2ludGVyICpTQ3ApCit7CisJc3RydWN0IHBvd2VydGVjX2luZm8gKmluZm8gPSAoc3RydWN0IHBvd2VydGVjX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoaW5mby0+aW5mby5zY3NpLmRtYSAhPSBOT19ETUEpCisJCWRpc2FibGVfZG1hKGluZm8tPmluZm8uc2NzaS5kbWEpOworfQorCisvKiBQcm90b3R5cGU6IGNvbnN0IGNoYXIgKnBvd2VydGVjc2NzaV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiBob3N0KQorICogUHVycG9zZSAgOiByZXR1cm5zIGEgZGVzY3JpcHRpdmUgc3RyaW5nIGFib3V0IHRoaXMgaW50ZXJmYWNlLAorICogUGFyYW1zICAgOiBob3N0IC0gZHJpdmVyIGhvc3Qgc3RydWN0dXJlIHRvIHJldHVybiBpbmZvIGZvci4KKyAqIFJldHVybnMgIDogcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgY29udGFpbmluZyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorICovCitjb25zdCBjaGFyICpwb3dlcnRlY3Njc2lfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBwb3dlcnRlY19pbmZvICppbmZvID0gKHN0cnVjdCBwb3dlcnRlY19pbmZvICopaG9zdC0+aG9zdGRhdGE7CisJc3RhdGljIGNoYXIgc3RyaW5nWzE1MF07CisKKwlzcHJpbnRmKHN0cmluZywgIiVzICglcykgaW4gc2xvdCAlZCB2JXMgdGVybWluYXRvcnMgbyVzIiwKKwkJaG9zdC0+aG9zdHQtPm5hbWUsIGluZm8tPmluZm8uc2NzaS50eXBlLCBpbmZvLT5lYy0+c2xvdF9ubywKKwkJVkVSU0lPTiwgaW5mby0+dGVybV9jdGwgPyAibiIgOiAiZmYiKTsKKworCXJldHVybiBzdHJpbmc7Cit9CisKKy8qIFByb3RvdHlwZTogaW50IHBvd2VydGVjc2NzaV9zZXRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKKyAqIFB1cnBvc2UgIDogU2V0IGEgZHJpdmVyIHNwZWNpZmljIGZ1bmN0aW9uCisgKiBQYXJhbXMgICA6IGhvc3QgICAtIGhvc3QgdG8gc2V0dXAKKyAqICAgICAgICAgIDogYnVmZmVyIC0gYnVmZmVyIGNvbnRhaW5pbmcgc3RyaW5nIGRlc2NyaWJpbmcgb3BlcmF0aW9uCisgKiAgICAgICAgICA6IGxlbmd0aCAtIGxlbmd0aCBvZiBzdHJpbmcKKyAqIFJldHVybnMgIDogLUVJTlZBTCwgb3IgMAorICovCitzdGF0aWMgaW50Citwb3dlcnRlY3Njc2lfc2V0X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJaW50IHJldCA9IGxlbmd0aDsKKworCWlmIChsZW5ndGggPj0gMTIgJiYgc3RybmNtcChidWZmZXIsICJQT1dFUlRFQ1NDU0kiLCAxMikgPT0gMCkgeworCQlidWZmZXIgKz0gMTI7CisJCWxlbmd0aCAtPSAxMjsKKworCQlpZiAobGVuZ3RoID49IDUgJiYgc3RybmNtcChidWZmZXIsICJ0ZXJtPSIsIDUpID09IDApIHsKKwkJCWlmIChidWZmZXJbNV0gPT0gJzEnKQorCQkJCXBvd2VydGVjc2NzaV90ZXJtaW5hdG9yX2N0bChob3N0LCAxKTsKKwkJCWVsc2UgaWYgKGJ1ZmZlcls1XSA9PSAnMCcpCisJCQkJcG93ZXJ0ZWNzY3NpX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIDApOworCQkJZWxzZQorCQkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFByb3RvdHlwZTogaW50IHBvd2VydGVjc2NzaV9wcm9jX2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKyAqCQkJCQlpbnQgbGVuZ3RoLCBpbnQgaG9zdF9ubywgaW50IGlub3V0KQorICogUHVycG9zZSAgOiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciB0byBhIHVzZXIgcHJvY2VzcyBhY2Nlc3NpbmcKKyAqCSAgICAgIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICogUGFyYW1zICAgOiBidWZmZXIgIC0gYSBidWZmZXIgdG8gd3JpdGUgaW5mb3JtYXRpb24gdG8KKyAqCSAgICAgIHN0YXJ0ICAgLSBhIHBvaW50ZXIgaW50byB0aGlzIGJ1ZmZlciBzZXQgYnkgdGhpcyByb3V0aW5lIHRvIHRoZSBzdGFydAorICoJCSAgICAgICAgb2YgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLgorICoJICAgICAgb2Zmc2V0ICAtIG9mZnNldCBpbnRvIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSByZWFkIHVwdG8uCisgKgkgICAgICBsZW5ndGggIC0gbGVuZ3RoIG9mIGJ1ZmZlcgorICoJICAgICAgaW5vdXQgICAtIDAgZm9yIHJlYWRpbmcsIDEgZm9yIHdyaXRpbmcuCisgKiBSZXR1cm5zICA6IGxlbmd0aCBvZiBkYXRhIHdyaXR0ZW4gdG8gYnVmZmVyLgorICovCitpbnQgcG93ZXJ0ZWNzY3NpX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbzsKKwljaGFyICpwID0gYnVmZmVyOworCWludCBwb3M7CisKKwlpZiAoaW5vdXQgPT0gMSkKKwkJcmV0dXJuIHBvd2VydGVjc2NzaV9zZXRfcHJvY19pbmZvKGhvc3QsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCWluZm8gPSAoc3RydWN0IHBvd2VydGVjX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCXAgKz0gc3ByaW50ZihwLCAiUG93ZXJUZWMgU0NTSSBkcml2ZXIgdiVzXG4iLCBWRVJTSU9OKTsKKwlwICs9IGZhczIxNl9wcmludF9ob3N0KCZpbmZvLT5pbmZvLCBwKTsKKwlwICs9IHNwcmludGYocCwgIlRlcm0gICAgOiBvJXNcbiIsCisJCQlpbmZvLT50ZXJtX2N0bCA/ICJuIiA6ICJmZiIpOworCisJcCArPSBmYXMyMTZfcHJpbnRfc3RhdHMoJmluZm8tPmluZm8sIHApOworCXAgKz0gZmFzMjE2X3ByaW50X2RldmljZXMoJmluZm8tPmluZm8sIHApOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCXBvcyA9IHAgLSBidWZmZXIgLSBvZmZzZXQ7CisJaWYgKHBvcyA+IGxlbmd0aCkKKwkJcG9zID0gbGVuZ3RoOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXJ0ZWNzY3NpX3Nob3dfdGVybShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGRldik7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKwlzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZm8tPnRlcm1fY3RsID8gMSA6IDApOworfQorCitzdGF0aWMgc3NpemVfdAorcG93ZXJ0ZWNzY3NpX3N0b3JlX3Rlcm0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwlpZiAobGVuID4gMSkKKwkJcG93ZXJ0ZWNzY3NpX3Rlcm1pbmF0b3JfY3RsKGhvc3QsIGJ1ZlswXSAhPSAnMCcpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGJ1c190ZXJtLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgcG93ZXJ0ZWNzY3NpX3Nob3dfdGVybSwgcG93ZXJ0ZWNzY3NpX3N0b3JlX3Rlcm0pOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHBvd2VydGVjc2NzaV90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfaW5mbwkJCT0gcG93ZXJ0ZWNzY3NpX3Byb2NfaW5mbywKKwkubmFtZQkJCQk9ICJQb3dlclRlYyBTQ1NJIiwKKwkuaW5mbwkJCQk9IHBvd2VydGVjc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IGZhczIxNl9xdWV1ZV9jb21tYW5kLAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gZmFzMjE2X2VoX2hvc3RfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGZhczIxNl9laF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gZmFzMjE2X2VoX2RldmljZV9yZXNldCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBmYXMyMTZfZWhfYWJvcnQsCisKKwkuY2FuX3F1ZXVlCQkJPSA4LAorCS50aGlzX2lkCQkJPSA3LAorCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCQk9IDIsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQkJPSAicG93ZXJ0ZWMiLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3Bvd2VydGVjc2NzaV9wcm9iZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHBvd2VydGVjX2luZm8gKmluZm87CisJdW5zaWduZWQgbG9uZyByZXNiYXNlLCByZXNsZW47CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByZXQ7CisKKwlyZXQgPSBlY2FyZF9yZXF1ZXN0X3Jlc291cmNlcyhlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXNiYXNlID0gZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwlyZXNsZW4gPSBlY2FyZF9yZXNvdXJjZV9sZW4oZWMsIEVDQVJEX1JFU19JT0NGQVNUKTsKKwliYXNlID0gaW9yZW1hcChyZXNiYXNlLCByZXNsZW4pOworCWlmICghYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcG93ZXJ0ZWNzY3NpX3RlbXBsYXRlLAorCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHBvd2VydGVjX2luZm8pKTsKKwlpZiAoIWhvc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGhvc3QpOworCisJaW5mbyA9IChzdHJ1Y3QgcG93ZXJ0ZWNfaW5mbyAqKWhvc3QtPmhvc3RkYXRhOworCWluZm8tPmJhc2UgPSBiYXNlOworCXBvd2VydGVjc2NzaV90ZXJtaW5hdG9yX2N0bChob3N0LCB0ZXJtW2VjLT5zbG90X25vXSk7CisKKwlpbmZvLT5pbmZvLnNjc2kuaW9fYmFzZQkJPSBiYXNlICsgUE9XRVJURUNfRkFTMjE2X09GRlNFVDsKKwlpbmZvLT5pbmZvLnNjc2kuaW9fc2hpZnQJPSBQT1dFUlRFQ19GQVMyMTZfU0hJRlQ7CisJaW5mby0+aW5mby5zY3NpLmlycQkJPSBlYy0+aXJxOworCWluZm8tPmluZm8uc2NzaS5kbWEJCT0gZWMtPmRtYTsKKwlpbmZvLT5pbmZvLmlmY2ZnLmNsb2NrcmF0ZQk9IDQwOyAvKiBNSHogKi8KKwlpbmZvLT5pbmZvLmlmY2ZnLnNlbGVjdF90aW1lb3V0CT0gMjU1OworCWluZm8tPmluZm8uaWZjZmcuYXN5bmNwZXJpb2QJPSAyMDA7IC8qIG5zICovCisJaW5mby0+aW5mby5pZmNmZy5zeW5jX21heF9kZXB0aAk9IDc7CisJaW5mby0+aW5mby5pZmNmZy5jbnRsMwkJPSBDTlRMM19CUzggfCBDTlRMM19GQVNUU0NTSSB8IENOVEwzX0ZBU1RDTEs7CisJaW5mby0+aW5mby5pZmNmZy5kaXNjb25uZWN0X29rCT0gMTsKKwlpbmZvLT5pbmZvLmlmY2ZnLndpZGVfbWF4X3NpemUJPSAwOworCWluZm8tPmluZm8uaWZjZmcuY2FwYWJpbGl0aWVzCT0gMDsKKwlpbmZvLT5pbmZvLmRtYS5zZXR1cAkJPSBwb3dlcnRlY3Njc2lfZG1hX3NldHVwOworCWluZm8tPmluZm8uZG1hLnBzZXVkbwkJPSBOVUxMOworCWluZm8tPmluZm8uZG1hLnN0b3AJCT0gcG93ZXJ0ZWNzY3NpX2RtYV9zdG9wOworCisJZWMtPmlycWFkZHIJPSBiYXNlICsgUE9XRVJURUNfSU5UUl9TVEFUVVM7CisJZWMtPmlycW1hc2sJPSBQT1dFUlRFQ19JTlRSX0JJVDsKKwllYy0+aXJxX2RhdGEJPSBpbmZvOworCWVjLT5vcHMJCT0gJnBvd2VydGVjc2NzaV9vcHM7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmVjLT5kZXYsICZkZXZfYXR0cl9idXNfdGVybSk7CisKKwlyZXQgPSBmYXMyMTZfaW5pdChob3N0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZWMtPmlycSwgcG93ZXJ0ZWNzY3NpX2ludHIsCisJCQkgIFNBX0lOVEVSUlVQVCwgInBvd2VydGVjIiwgaW5mbyk7CisJaWYgKHJldCkgeworCQlwcmludGsoInNjc2klZDogSVJRJWQgbm90IGZyZWU6ICVkXG4iLAorCQkgICAgICAgaG9zdC0+aG9zdF9ubywgZWMtPmlycSwgcmV0KTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlpZiAoaW5mby0+aW5mby5zY3NpLmRtYSAhPSBOT19ETUEpIHsKKwkJaWYgKHJlcXVlc3RfZG1hKGluZm8tPmluZm8uc2NzaS5kbWEsICJwb3dlcnRlYyIpKSB7CisJCQlwcmludGsoInNjc2klZDogRE1BJWQgbm90IGZyZWUsIHVzaW5nIFBJT1xuIiwKKwkJCSAgICAgICBob3N0LT5ob3N0X25vLCBpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwkJCWluZm8tPmluZm8uc2NzaS5kbWEgPSBOT19ETUE7CisJCX0gZWxzZSB7CisJCQlzZXRfZG1hX3NwZWVkKGluZm8tPmluZm8uc2NzaS5kbWEsIDE4MCk7CisJCQlpbmZvLT5pbmZvLmlmY2ZnLmNhcGFiaWxpdGllcyB8PSBGQVNDQVBfRE1BOworCQl9CisJfQorCisJcmV0ID0gZmFzMjE2X2FkZChob3N0LCAmZWMtPmRldik7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChpbmZvLT5pbmZvLnNjc2kuZG1hICE9IE5PX0RNQSkKKwkJZnJlZV9kbWEoaW5mby0+aW5mby5zY3NpLmRtYSk7CisJZnJlZV9pcnEoZWMtPmlycSwgaG9zdCk7CisKKyBvdXRfcmVsZWFzZToKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKworIG91dF9mcmVlOgorCWRldmljZV9yZW1vdmVfZmlsZSgmZWMtPmRldiwgJmRldl9hdHRyX2J1c190ZXJtKTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCisgb3V0X3VubWFwOgorCWlvdW5tYXAoYmFzZSk7CisKKyBvdXRfcmVnaW9uOgorCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcG93ZXJ0ZWNzY3NpX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisJc3RydWN0IHBvd2VydGVjX2luZm8gKmluZm8gPSAoc3RydWN0IHBvd2VydGVjX2luZm8gKilob3N0LT5ob3N0ZGF0YTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKwlmYXMyMTZfcmVtb3ZlKGhvc3QpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZlYy0+ZGV2LCAmZGV2X2F0dHJfYnVzX3Rlcm0pOworCisJaWYgKGluZm8tPmluZm8uc2NzaS5kbWEgIT0gTk9fRE1BKQorCQlmcmVlX2RtYShpbmZvLT5pbmZvLnNjc2kuZG1hKTsKKwlmcmVlX2lycShlYy0+aXJxLCBpbmZvKTsKKworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisKKwlmYXMyMTZfcmVsZWFzZShob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBwb3dlcnRlY3Njc2lfY2lkc1tdID0geworCXsgTUFOVV9BTFNZU1RFTVMsIFBST0RfQUxTWVNfU0NTSUFUQVBJIH0sCisJeyAweGZmZmYsIDB4ZmZmZiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgcG93ZXJ0ZWNzY3NpX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcG93ZXJ0ZWNzY3NpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocG93ZXJ0ZWNzY3NpX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gcG93ZXJ0ZWNzY3NpX2NpZHMsCisJLmRydiA9IHsKKwkJLm5hbWUJCT0gInBvd2VydGVjc2NzaSIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBvd2VydGVjc2NzaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmcG93ZXJ0ZWNzY3NpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwb3dlcnRlY3Njc2lfZXhpdCh2b2lkKQoreworCWVjYXJkX3JlbW92ZV9kcml2ZXIoJnBvd2VydGVjc2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwb3dlcnRlY3Njc2lfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcnRlY3Njc2lfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlcnRlYyBTQ1NJIGRyaXZlciIpOworTU9EVUxFX1BBUk0odGVybSwgIjEtOGkiKTsKK01PRFVMRV9QQVJNX0RFU0ModGVybSwgIlNDU0kgYnVzIHRlcm1pbmF0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMgYi9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkMTU5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvcXVldWUuYzogcXVldWUgaGFuZGxpbmcgcHJpbWl0aXZlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDE1LVNlcC0xOTk3IFJNSwlDcmVhdGVkLgorICogICAxMS1PY3QtMTk5NyBSTUsJQ29ycmVjdGVkIHByb2JsZW0gd2l0aCBxdWV1ZV9yZW1vdmVfZXhjbHVkZQorICoJCQlub3QgdXBkYXRpbmcgaW50ZXJuYWwgbGlua2VkIGxpc3QgcHJvcGVybHkKKyAqCQkJKHdhcyBjYXVzaW5nIGNvbW1hbmRzIHRvIGdvIG1pc3NpbmcpLgorICogICAzMC1BdWctMjAwMCBSTUsJVXNlIExpbnV4IGxpc3QgaGFuZGxpbmcgYW5kIHNwaW5sb2NrcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgIi4uL3Njc2kuaCIKKworI2RlZmluZSBERUJVRworCit0eXBlZGVmIHN0cnVjdCBxdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCAgIGxpc3Q7CisJU2NzaV9DbW5kCSAgICpTQ3BudDsKKyNpZmRlZiBERUJVRworCXVuc2lnbmVkIGxvbmcJICAgbWFnaWM7CisjZW5kaWYKK30gUUVfdDsKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFFVRVVFX01BR0lDX0ZSRUUJMHhmN2UxYzlhMworI2RlZmluZSBRVUVVRV9NQUdJQ19VU0VECTB4ZjdlMWNjMzMKKworI2RlZmluZSBTRVRfTUFHSUMocSxtKQkoKHEpLT5tYWdpYyA9IChtKSkKKyNkZWZpbmUgQkFEX01BR0lDKHEsbSkJKChxKS0+bWFnaWMgIT0gKG0pKQorI2Vsc2UKKyNkZWZpbmUgU0VUX01BR0lDKHEsbSkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBCQURfTUFHSUMocSxtKQkoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAicXVldWUuaCIKKworI2RlZmluZSBOUl9RRQkzMgorCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfaW5pdGlhbGlzZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogaW5pdGlhbGlzZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBpbml0aWFsaXNlCisgKi8KK2ludCBxdWV1ZV9pbml0aWFsaXNlIChRdWV1ZV90ICpxdWV1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbnF1ZXVlcyA9IE5SX1FFOworCVFFX3QgKnE7CisKKwlzcGluX2xvY2tfaW5pdCgmcXVldWUtPnF1ZXVlX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+aGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5mcmVlKTsKKworCS8qCisJICogSWYgbGlmZSB3YXMgZWFzaWVyLCB0aGVuIFNDcG50IHdvdWxkIGhhdmUgYQorCSAqIGhvc3QtYXZhaWxhYmxlIGxpc3QgaGVhZCwgYW5kIHdlIHdvdWxkbid0CisJICogbmVlZCB0byBrZWVwIGZyZWUgbGlzdHMgb3IgYWxsb2NhdGUgdGhpcworCSAqIG1lbW9yeS4KKwkgKi8KKwlxdWV1ZS0+YWxsb2MgPSBxID0ga21hbGxvYyhzaXplb2YoUUVfdCkgKiBucXVldWVzLCBHRlBfS0VSTkVMKTsKKwlpZiAocSkgeworCQlmb3IgKDsgbnF1ZXVlczsgcSsrLCBucXVldWVzLS0pIHsKKwkJCVNFVF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19GUkVFKTsKKwkJCXEtPlNDcG50ID0gTlVMTDsKKwkJCWxpc3RfYWRkKCZxLT5saXN0LCAmcXVldWUtPmZyZWUpOworCQl9CisJfQorCisJcmV0dXJuIHF1ZXVlLT5hbGxvYyAhPSBOVUxMOworfQorCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfZnJlZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogZnJlZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBmcmVlCisgKi8KK3ZvaWQgcXVldWVfZnJlZSAoUXVldWVfdCAqcXVldWUpCit7CisJaWYgKCFsaXN0X2VtcHR5KCZxdWV1ZS0+aGVhZCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImZyZWVpbmcgbm9uLWVtcHR5IHF1ZXVlICVwXG4iLCBxdWV1ZSk7CisJaWYgKHF1ZXVlLT5hbGxvYykKKwkJa2ZyZWUocXVldWUtPmFsbG9jKTsKK30KKyAgICAgCisKKy8qCisgKiBGdW5jdGlvbjogaW50IHF1ZXVlX2FkZF9jbWQoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQsIGludCBoZWFkKQorICogUHVycG9zZSA6IEFkZCBhIG5ldyBjb21tYW5kIG9udG8gYSBxdWV1ZSwgYWRkaW5nIFJFUVVFU1RfU0VOU0UgdG8gaGVhZC4KKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIGRlc3RpbmF0aW9uIHF1ZXVlCisgKgkgICAgIFNDcG50IC0gY29tbWFuZCB0byBhZGQKKyAqCSAgICAgaGVhZCAgLSBhZGQgY29tbWFuZCB0byBoZWFkIG9mIHF1ZXVlCisgKiBSZXR1cm5zIDogMCBvbiBlcnJvciwgITAgb24gc3VjY2VzcworICovCitpbnQgX19xdWV1ZV9hZGQoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQsIGludCBoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlRRV90ICpxOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5mcmVlKSkKKwkJZ290byBlbXB0eTsKKworCWwgPSBxdWV1ZS0+ZnJlZS5uZXh0OworCWxpc3RfZGVsKGwpOworCisJcSA9IGxpc3RfZW50cnkobCwgUUVfdCwgbGlzdCk7CisJaWYgKEJBRF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19GUkVFKSkKKwkJQlVHKCk7CisKKwlTRVRfTUFHSUMocSwgUVVFVUVfTUFHSUNfVVNFRCk7CisJcS0+U0NwbnQgPSBTQ3BudDsKKworCWlmIChoZWFkKQorCQlsaXN0X2FkZChsLCAmcXVldWUtPmhlYWQpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbChsLCAmcXVldWUtPmhlYWQpOworCisJcmV0ID0gMTsKK2VtcHR5OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIFNjc2lfQ21uZCAqX19xdWV1ZV9yZW1vdmUoUXVldWVfdCAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKmVudCkKK3sKKwlRRV90ICpxOworCisJLyoKKwkgKiBNb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSAidXNlZCIgbGlzdCBvbnRvIHRoZSAiZnJlZSIgbGlzdAorCSAqLworCWxpc3RfZGVsKGVudCk7CisJcSA9IGxpc3RfZW50cnkoZW50LCBRRV90LCBsaXN0KTsKKwlpZiAoQkFEX01BR0lDKHEsIFFVRVVFX01BR0lDX1VTRUQpKQorCQlCVUcoKTsKKworCVNFVF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19GUkVFKTsKKwlsaXN0X2FkZChlbnQsICZxdWV1ZS0+ZnJlZSk7CisKKwlyZXR1cm4gcS0+U0NwbnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfZXhjbHVkZSAocXVldWUsIGV4Y2x1ZGUpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgU0NTSSBjb21tYW5kIGZyb20gYSBxdWV1ZQorICogUGFyYW1zICA6IHF1ZXVlICAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKgkgICAgIGV4Y2x1ZGUgLSBiaXQgYXJyYXkgb2YgdGFyZ2V0Jmx1biB3aGljaCBpcyBidXN5CisgKiBSZXR1cm5zIDogU2NzaV9DbW5kIGlmIHN1Y2Nlc3NmdWwgKGFuZCBhIHJlZmVyZW5jZSksIG9yIE5VTEwgaWYgbm8gY29tbWFuZCBhdmFpbGFibGUKKyAqLworU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfZXhjbHVkZShRdWV1ZV90ICpxdWV1ZSwgdW5zaWduZWQgbG9uZyAqZXhjbHVkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJU2NzaV9DbW5kICpTQ3BudCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZxdWV1ZS0+aGVhZCkgeworCQlRRV90ICpxID0gbGlzdF9lbnRyeShsLCBRRV90LCBsaXN0KTsKKwkJaWYgKCF0ZXN0X2JpdChxLT5TQ3BudC0+ZGV2aWNlLT5pZCAqIDggKyBxLT5TQ3BudC0+ZGV2aWNlLT5sdW4sIGV4Y2x1ZGUpKSB7CisJCQlTQ3BudCA9IF9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBsKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gU0NwbnQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmUgKHF1ZXVlKQorICogUHVycG9zZSA6IHJlbW92ZXMgZmlyc3QgU0NTSSBjb21tYW5kIGZyb20gYSBxdWV1ZQorICogUGFyYW1zICA6IHF1ZXVlICAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKiBSZXR1cm5zIDogU2NzaV9DbW5kIGlmIHN1Y2Nlc3NmdWwgKGFuZCBhIHJlZmVyZW5jZSksIG9yIE5VTEwgaWYgbm8gY29tbWFuZCBhdmFpbGFibGUKKyAqLworU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmUoUXVldWVfdCAqcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlTY3NpX0NtbmQgKlNDcG50ID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmcXVldWUtPmhlYWQpKQorCQlTQ3BudCA9IF9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBxdWV1ZS0+aGVhZC5uZXh0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIFNDcG50OworfQorCisvKgorICogRnVuY3Rpb246IFNjc2lfQ21uZCAqcXVldWVfcmVtb3ZlX3RndGx1bnRhZyAocXVldWUsIHRhcmdldCwgbHVuLCB0YWcpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgU0NTSSBjb21tYW5kIGZyb20gdGhlIHF1ZXVlIGZvciBhIHNwZWNpZmllZCB0YXJnZXQvbHVuL3RhZworICogUGFyYW1zICA6IHF1ZXVlICAtIHF1ZXVlIHRvIHJlbW92ZSBjb21tYW5kIGZyb20KKyAqCSAgICAgdGFyZ2V0IC0gdGFyZ2V0IHRoYXQgd2Ugd2FudAorICoJICAgICBsdW4gICAgLSBsdW4gb24gZGV2aWNlCisgKgkgICAgIHRhZyAgICAtIHRhZyBvbiBkZXZpY2UKKyAqIFJldHVybnMgOiBTY3NpX0NtbmQgaWYgc3VjY2Vzc2Z1bCwgb3IgTlVMTCBpZiBubyBjb21tYW5kIHNhdGlzZmllcyByZXF1aXJlbWVudHMKKyAqLworU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfdGd0bHVudGFnIChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCwgaW50IGx1biwgaW50IHRhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJU2NzaV9DbW5kICpTQ3BudCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZxdWV1ZS0+aGVhZCkgeworCQlRRV90ICpxID0gbGlzdF9lbnRyeShsLCBRRV90LCBsaXN0KTsKKwkJaWYgKHEtPlNDcG50LT5kZXZpY2UtPmlkID09IHRhcmdldCAmJiBxLT5TQ3BudC0+ZGV2aWNlLT5sdW4gPT0gbHVuICYmCisJCSAgICBxLT5TQ3BudC0+dGFnID09IHRhZykgeworCQkJU0NwbnQgPSBfX3F1ZXVlX3JlbW92ZShxdWV1ZSwgbCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIFNDcG50OworfQorCisvKgorICogRnVuY3Rpb246IHF1ZXVlX3JlbW92ZV9hbGxfdGFyZ2V0KHF1ZXVlLCB0YXJnZXQpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGFsbCBTQ1NJIGNvbW1hbmRzIGZyb20gdGhlIHF1ZXVlIGZvciBhIHNwZWNpZmllZCB0YXJnZXQKKyAqIFBhcmFtcyAgOiBxdWV1ZSAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKiAgICAgICAgICAgdGFyZ2V0IC0gdGFyZ2V0IGRldmljZSBpZAorICogUmV0dXJucyA6IG5vdGhpbmcKKyAqLwordm9pZCBxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZxdWV1ZS0+aGVhZCkgeworCQlRRV90ICpxID0gbGlzdF9lbnRyeShsLCBRRV90LCBsaXN0KTsKKwkJaWYgKHEtPlNDcG50LT5kZXZpY2UtPmlkID09IHRhcmdldCkKKwkJCV9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgcXVldWVfcHJvYmV0Z3RsdW4gKHF1ZXVlLCB0YXJnZXQsIGx1bikKKyAqIFB1cnBvc2UgOiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbW1hbmQgaW4gdGhlIHF1ZXVlIGZvciB0aGUgc3BlY2lmaWVkCisgKgkgICAgIHRhcmdldC9sdW4uCisgKiBQYXJhbXMgIDogcXVldWUgIC0gcXVldWUgdG8gbG9vayBpbgorICoJICAgICB0YXJnZXQgLSB0YXJnZXQgd2Ugd2FudCB0byBwcm9iZQorICoJICAgICBsdW4gICAgLSBsdW4gb24gdGFyZ2V0CisgKiBSZXR1cm5zIDogMCBpZiBub3QgZm91bmQsICE9IDAgaWYgZm91bmQKKyAqLworaW50IHF1ZXVlX3Byb2JldGd0bHVuIChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gobCwgJnF1ZXVlLT5oZWFkKSB7CisJCVFFX3QgKnEgPSBsaXN0X2VudHJ5KGwsIFFFX3QsIGxpc3QpOworCQlpZiAocS0+U0NwbnQtPmRldmljZS0+aWQgPT0gdGFyZ2V0ICYmIHEtPlNDcG50LT5kZXZpY2UtPmx1biA9PSBsdW4pIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogaW50IHF1ZXVlX3JlbW92ZV9jbWQoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgc3BlY2lmaWMgY29tbWFuZCBmcm9tIHRoZSBxdWV1ZXMKKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIHF1ZXVlIHRvIGxvb2sgaW4KKyAqCSAgICAgU0NwbnQgLSBjb21tYW5kIHRvIGZpbmQKKyAqIFJldHVybnMgOiAwIGlmIG5vdCBmb3VuZAorICovCitpbnQgcXVldWVfcmVtb3ZlX2NtZChRdWV1ZV90ICpxdWV1ZSwgU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gobCwgJnF1ZXVlLT5oZWFkKSB7CisJCVFFX3QgKnEgPSBsaXN0X2VudHJ5KGwsIFFFX3QsIGxpc3QpOworCQlpZiAocS0+U0NwbnQgPT0gU0NwbnQpIHsKKwkJCV9fcXVldWVfcmVtb3ZlKHF1ZXVlLCBsKTsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK0VYUE9SVF9TWU1CT0wocXVldWVfaW5pdGlhbGlzZSk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX2ZyZWUpOworRVhQT1JUX1NZTUJPTChfX3F1ZXVlX2FkZCk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3JlbW92ZSk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3JlbW92ZV9leGNsdWRlKTsKK0VYUE9SVF9TWU1CT0wocXVldWVfcmVtb3ZlX3RndGx1bnRhZyk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3JlbW92ZV9jbWQpOworRVhQT1JUX1NZTUJPTChxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldCk7CitFWFBPUlRfU1lNQk9MKHF1ZXVlX3Byb2JldGd0bHVuKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgY29tbWFuZCBxdWV1ZWluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9xdWV1ZS5oIGIvZHJpdmVycy9zY3NpL2FybS9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWRlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9zY3NpL3F1ZXVlLmg6IHF1ZXVlIGhhbmRsaW5nCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIFFVRVVFX0gKKyNkZWZpbmUgUVVFVUVfSAorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZTsKKwlzcGlubG9ja190IHF1ZXVlX2xvY2s7CisJdm9pZCAqYWxsb2M7CQkJLyogc3RhcnQgb2YgYWxsb2NhdGVkIG1lbSAqLworfSBRdWV1ZV90OworCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfaW5pdGlhbGlzZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogaW5pdGlhbGlzZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBpbml0aWFsaXNlCisgKi8KK2V4dGVybiBpbnQgcXVldWVfaW5pdGlhbGlzZSAoUXVldWVfdCAqcXVldWUpOworCisvKgorICogRnVuY3Rpb246IHZvaWQgcXVldWVfZnJlZSAoUXVldWVfdCAqcXVldWUpCisgKiBQdXJwb3NlIDogZnJlZSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgLSBxdWV1ZSB0byBmcmVlCisgKi8KK2V4dGVybiB2b2lkIHF1ZXVlX2ZyZWUgKFF1ZXVlX3QgKnF1ZXVlKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBTY3NpX0NtbmQgKnF1ZXVlX3JlbW92ZSAocXVldWUpCisgKiBQdXJwb3NlIDogcmVtb3ZlcyBmaXJzdCBTQ1NJIGNvbW1hbmQgZnJvbSBhIHF1ZXVlCisgKiBQYXJhbXMgIDogcXVldWUgICAtIHF1ZXVlIHRvIHJlbW92ZSBjb21tYW5kIGZyb20KKyAqIFJldHVybnMgOiBTY3NpX0NtbmQgaWYgc3VjY2Vzc2Z1bCAoYW5kIGEgcmVmZXJlbmNlKSwgb3IgTlVMTCBpZiBubyBjb21tYW5kIGF2YWlsYWJsZQorICovCitleHRlcm4gU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmUgKFF1ZXVlX3QgKnF1ZXVlKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBTY3NpX0NtbmQgKnF1ZXVlX3JlbW92ZV9leGNsdWRlX3JlZiAocXVldWUsIGV4Y2x1ZGUpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgU0NTSSBjb21tYW5kIGZyb20gYSBxdWV1ZQorICogUGFyYW1zICA6IHF1ZXVlICAgLSBxdWV1ZSB0byByZW1vdmUgY29tbWFuZCBmcm9tCisgKgkgICAgIGV4Y2x1ZGUgLSBhcnJheSBvZiBidXN5IExVTnMKKyAqIFJldHVybnMgOiBTY3NpX0NtbmQgaWYgc3VjY2Vzc2Z1bCAoYW5kIGEgcmVmZXJlbmNlKSwgb3IgTlVMTCBpZiBubyBjb21tYW5kIGF2YWlsYWJsZQorICovCitleHRlcm4gU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfZXhjbHVkZSAoUXVldWVfdCAqcXVldWUsIHVuc2lnbmVkIGxvbmcgKmV4Y2x1ZGUpOworCisjZGVmaW5lIHF1ZXVlX2FkZF9jbWRfb3JkZXJlZChxdWV1ZSxTQ3BudCkgXAorCV9fcXVldWVfYWRkKHF1ZXVlLFNDcG50LChTQ3BudCktPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkKKyNkZWZpbmUgcXVldWVfYWRkX2NtZF90YWlsKHF1ZXVlLFNDcG50KSBcCisJX19xdWV1ZV9hZGQocXVldWUsU0NwbnQsMCkKKy8qCisgKiBGdW5jdGlvbjogaW50IF9fcXVldWVfYWRkKFF1ZXVlX3QgKnF1ZXVlLCBTY3NpX0NtbmQgKlNDcG50LCBpbnQgaGVhZCkKKyAqIFB1cnBvc2UgOiBBZGQgYSBuZXcgY29tbWFuZCBvbnRvIGEgcXVldWUKKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIGRlc3RpbmF0aW9uIHF1ZXVlCisgKgkgICAgIFNDcG50IC0gY29tbWFuZCB0byBhZGQKKyAqCSAgICAgaGVhZCAgLSBhZGQgY29tbWFuZCB0byBoZWFkIG9mIHF1ZXVlCisgKiBSZXR1cm5zIDogMCBvbiBlcnJvciwgITAgb24gc3VjY2VzcworICovCitleHRlcm4gaW50IF9fcXVldWVfYWRkKFF1ZXVlX3QgKnF1ZXVlLCBTY3NpX0NtbmQgKlNDcG50LCBpbnQgaGVhZCk7CisKKy8qCisgKiBGdW5jdGlvbjogU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfdGd0bHVudGFnIChxdWV1ZSwgdGFyZ2V0LCBsdW4sIHRhZykKKyAqIFB1cnBvc2UgOiByZW1vdmUgYSBTQ1NJIGNvbW1hbmQgZnJvbSB0aGUgcXVldWUgZm9yIGEgc3BlY2lmaWVkIHRhcmdldC9sdW4vdGFnCisgKiBQYXJhbXMgIDogcXVldWUgIC0gcXVldWUgdG8gcmVtb3ZlIGNvbW1hbmQgZnJvbQorICoJICAgICB0YXJnZXQgLSB0YXJnZXQgdGhhdCB3ZSB3YW50CisgKgkgICAgIGx1biAgICAtIGx1biBvbiBkZXZpY2UKKyAqCSAgICAgdGFnICAgIC0gdGFnIG9uIGRldmljZQorICogUmV0dXJucyA6IFNjc2lfQ21uZCBpZiBzdWNjZXNzZnVsLCBvciBOVUxMIGlmIG5vIGNvbW1hbmQgc2F0aXNmaWVzIHJlcXVpcmVtZW50cworICovCitleHRlcm4gU2NzaV9DbW5kICpxdWV1ZV9yZW1vdmVfdGd0bHVudGFnIChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCwgaW50IGx1biwgaW50IHRhZyk7CisKKy8qCisgKiBGdW5jdGlvbjogcXVldWVfcmVtb3ZlX2FsbF90YXJnZXQocXVldWUsIHRhcmdldCkKKyAqIFB1cnBvc2UgOiByZW1vdmUgYWxsIFNDU0kgY29tbWFuZHMgZnJvbSB0aGUgcXVldWUgZm9yIGEgc3BlY2lmaWVkIHRhcmdldAorICogUGFyYW1zICA6IHF1ZXVlICAtIHF1ZXVlIHRvIHJlbW92ZSBjb21tYW5kIGZyb20KKyAqICAgICAgICAgICB0YXJnZXQgLSB0YXJnZXQgZGV2aWNlIGlkCisgKiBSZXR1cm5zIDogbm90aGluZworICovCitleHRlcm4gdm9pZCBxdWV1ZV9yZW1vdmVfYWxsX3RhcmdldChRdWV1ZV90ICpxdWV1ZSwgaW50IHRhcmdldCk7CisKKy8qCisgKiBGdW5jdGlvbjogaW50IHF1ZXVlX3Byb2JldGd0bHVuIChxdWV1ZSwgdGFyZ2V0LCBsdW4pCisgKiBQdXJwb3NlIDogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBjb21tYW5kIGluIHRoZSBxdWV1ZSBmb3IgdGhlIHNwZWNpZmllZAorICoJICAgICB0YXJnZXQvbHVuLgorICogUGFyYW1zICA6IHF1ZXVlICAtIHF1ZXVlIHRvIGxvb2sgaW4KKyAqCSAgICAgdGFyZ2V0IC0gdGFyZ2V0IHdlIHdhbnQgdG8gcHJvYmUKKyAqCSAgICAgbHVuICAgIC0gbHVuIG9uIHRhcmdldAorICogUmV0dXJucyA6IDAgaWYgbm90IGZvdW5kLCAhPSAwIGlmIGZvdW5kCisgKi8KK2V4dGVybiBpbnQgcXVldWVfcHJvYmV0Z3RsdW4gKFF1ZXVlX3QgKnF1ZXVlLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBpbnQgcXVldWVfcmVtb3ZlX2NtZCAoUXVldWVfdCAqcXVldWUsIFNjc2lfQ21uZCAqU0NwbnQpCisgKiBQdXJwb3NlIDogcmVtb3ZlIGEgc3BlY2lmaWMgY29tbWFuZCBmcm9tIHRoZSBxdWV1ZXMKKyAqIFBhcmFtcyAgOiBxdWV1ZSAtIHF1ZXVlIHRvIGxvb2sgaW4KKyAqCSAgICAgU0NwbnQgLSBjb21tYW5kIHRvIGZpbmQKKyAqIFJldHVybnMgOiAwIGlmIG5vdCBmb3VuZAorICovCitpbnQgcXVldWVfcmVtb3ZlX2NtZChRdWV1ZV90ICpxdWV1ZSwgU2NzaV9DbW5kICpTQ3BudCk7CisKKyNlbmRpZiAvKiBRVUVVRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9hcm0vc2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWIzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXJtL3Njc2kuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL3Njc2kvc2NzaS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb21tb25seSB1c2VkIHNjc2kgZHJpdmVyIGZ1bmN0aW9ucy4KKyAqLworCisjZGVmaW5lIEJFTFRfQU5EX0JSQUNFUworCisvKgorICogVGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgaGFuZGxpbmcuICBUaGlzIGNvbnRhaW5zIGFsbAorICogdGhlIHl1Y2t5IHN0dWZmIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQgcHJvcGVybHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfU0NwX3RvX3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIFNjc2lfUG9pbnRlciAqU0NwLCBpbnQgbWF4KQoreworCWludCBidWZzID0gU0NwLT5idWZmZXJzX3Jlc2lkdWFsOworCisJQlVHX09OKGJ1ZnMgKyAxID4gbWF4KTsKKworCXNnLT5wYWdlICAgPSB2aXJ0X3RvX3BhZ2UoU0NwLT5wdHIpOworCXNnLT5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShTQ3AtPnB0cik7CisJc2ctPmxlbmd0aCA9IFNDcC0+dGhpc19yZXNpZHVhbDsKKworCWlmIChidWZzKQorCQltZW1jcHkoc2cgKyAxLCBTQ3AtPmJ1ZmZlciArIDEsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqIGJ1ZnMpOworCXJldHVybiBidWZzICsgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV4dF9TQ3AoU2NzaV9Qb2ludGVyICpTQ3ApCit7CisJaW50IHJldCA9IFNDcC0+YnVmZmVyc19yZXNpZHVhbDsKKwlpZiAocmV0KSB7CisJCVNDcC0+YnVmZmVyKys7CisJCVNDcC0+YnVmZmVyc19yZXNpZHVhbC0tOworCQlTQ3AtPnB0ciA9IChjaGFyICopCisJCQkgKHBhZ2VfYWRkcmVzcyhTQ3AtPmJ1ZmZlci0+cGFnZSkgKworCQkJICBTQ3AtPmJ1ZmZlci0+b2Zmc2V0KTsKKwkJU0NwLT50aGlzX3Jlc2lkdWFsID0gU0NwLT5idWZmZXItPmxlbmd0aDsKKwl9IGVsc2UgeworCQlTQ3AtPnB0ciA9IE5VTEw7CisJCVNDcC0+dGhpc19yZXNpZHVhbCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBnZXRfbmV4dF9TQ3BfYnl0ZShTY3NpX1BvaW50ZXIgKlNDcCkKK3sKKwljaGFyIGMgPSAqU0NwLT5wdHI7CisKKwlTQ3AtPnB0ciArPSAxOworCVNDcC0+dGhpc19yZXNpZHVhbCAtPSAxOworCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbmV4dF9TQ3BfYnl0ZShTY3NpX1BvaW50ZXIgKlNDcCwgdW5zaWduZWQgY2hhciBjKQoreworCSpTQ3AtPnB0ciA9IGM7CisJU0NwLT5wdHIgKz0gMTsKKwlTQ3AtPnRoaXNfcmVzaWR1YWwgLT0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfU0NwKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbWVtc2V0KCZTQ3BudC0+U0NwLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfcG9pbnRlcikpOworCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCQlpbnQgYnVmOworCisJCVNDcG50LT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+YnVmZmVyOworCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBTQ3BudC0+dXNlX3NnIC0gMTsKKwkJU0NwbnQtPlNDcC5wdHIgPSAoY2hhciAqKQorCQkJIChwYWdlX2FkZHJlc3MoU0NwbnQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJCSAgU0NwbnQtPlNDcC5idWZmZXItPm9mZnNldCk7CisJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCA9IFNDcG50LT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisKKyNpZmRlZiBCRUxUX0FORF9CUkFDRVMKKwkJLyoKKwkJICogQ2FsY3VsYXRlIGNvcnJlY3QgYnVmZmVyIGxlbmd0aC4gIFNvbWUgY29tbWFuZHMKKwkJICogY29tZSBpbiB3aXRoIHRoZSB3cm9uZyByZXF1ZXN0X2J1ZmZsZW4uCisJCSAqLworCQlmb3IgKGJ1ZiA9IDA7IGJ1ZiA8PSBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7IGJ1ZisrKQorCQkJbGVuICs9IFNDcG50LT5TQ3AuYnVmZmVyW2J1Zl0ubGVuZ3RoOworCisJCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuICE9IGxlbikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZC4lYzogYmFkIHJlcXVlc3QgYnVmZmVyICIKKwkJCSAgICAgICAibGVuZ3RoICVkLCBzaG91bGQgYmUgJWxkXG4iLCBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAorCQkJICAgICAgICcwJyArIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBsZW4pOworCQlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gbGVuOworI2VuZGlmCisJfSBlbHNlIHsKKwkJU0NwbnQtPlNDcC5wdHIgPSAodW5zaWduZWQgY2hhciAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSB1cHBlciBTQ1NJIGxheWVycyBwYXNzIGEgYnVmZmVyLCBidXQgemVybyBsZW5ndGgsCisJICogd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIGJ1ZmZlciBwb2ludGVyLgorCSAqLworCWlmIChTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPT0gMCAmJiBTQ3BudC0+U0NwLnB0cikgeworI2lmIDAgLy9kZWYgQkVMVF9BTkRfQlJBQ0VTCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZC4lYzogemVybyBsZW5ndGggYnVmZmVyIHBhc3NlZCBmb3IgIgorCQkgICAgICAgImNvbW1hbmQgIiwgU0NwbnQtPmhvc3QtPmhvc3Rfbm8sICcwJyArIFNDcG50LT50YXJnZXQpOworCQlwcmludF9jb21tYW5kKFNDcG50LT5jbW5kKTsKKyNlbmRpZgorCQlTQ3BudC0+U0NwLnB0ciA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMgYi9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE5NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisKKyAgICBhdGFfcGlpeC5jIC0gSW50ZWwgUEFUQS9TQVRBIGNvbnRyb2xsZXJzCisKKyAgICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICAgIAkJICAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisJCSAgICBvbiBlbWFpbHMuCisKKworCUNvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCBJbmMKKwlDb3B5cmlnaHQgMjAwMy0yMDA0IEplZmYgR2FyemlrCisKKworCUNvcHlyaWdodCBoZWFkZXIgZnJvbSBwaWl4LmM6CisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBBbmRyemVqIEtyenlzenRvZm93aWN6LCBBdXRob3IgYW5kIE1haW50YWluZXIKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCBBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorCisgICAgTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJImF0YV9waWl4IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMyIKKworZW51bSB7CisJUElJWF9JT0NGRwkJPSAweDU0LCAvKiBJREUgSS9PIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlJQ0g1X1BNUgkJPSAweDkwLCAvKiBwb3J0IG1hcHBpbmcgcmVnaXN0ZXIgKi8KKwlJQ0g1X1BDUwkJPSAweDkyLAkvKiBwb3J0IGNvbnRyb2wgYW5kIHN0YXR1cyAqLworCisJUElJWF9GTEFHX0FIQ0kJCT0gKDEgPDwgMjgpLCAvKiBBSENJIHBvc3NpYmxlICovCisJUElJWF9GTEFHX0NIRUNLSU5UUgk9ICgxIDw8IDI5KSwgLyogbWFrZSBzdXJlIFBDSSBJTlR4IGVuYWJsZWQgKi8KKwlQSUlYX0ZMQUdfQ09NQklORUQJPSAoMSA8PCAzMCksIC8qIGNvbWJpbmVkIG1vZGUgcG9zc2libGUgKi8KKworCS8qIGNvbWJpbmVkIG1vZGUuICBpZiBzZXQsIFBBVEEgaXMgY2hhbm5lbCAwLgorCSAqIGlmIGNsZWFyLCBQQVRBIGlzIGNoYW5uZWwgMS4KKwkgKi8KKwlQSUlYX0NPTUJfUEFUQV9QMAk9ICgxIDw8IDEpLAorCVBJSVhfQ09NQgkJPSAoMSA8PCAyKSwgLyogY29tYmluZWQgbW9kZSBlbmFibGVkPyAqLworCisJUElJWF9QT1JUX1BSRVNFTlQJPSAoMSA8PCAwKSwKKwlQSUlYX1BPUlRfRU5BQkxFRAk9ICgxIDw8IDQpLAorCisJUElJWF84MENfUFJJCQk9ICgxIDw8IDUpIHwgKDEgPDwgNCksCisJUElJWF84MENfU0VDCQk9ICgxIDw8IDcpIHwgKDEgPDwgNiksCisKKwlpY2g1X3BhdGEJCT0gMCwKKwlpY2g1X3NhdGEJCT0gMSwKKwlwaWl4NF9wYXRhCQk9IDIsCisJaWNoNl9zYXRhCQk9IDMsCisJaWNoNl9zYXRhX3JtCQk9IDQsCisJaWNoN19zYXRhCQk9IDUsCit9OworCitzdGF0aWMgaW50IHBpaXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKKworc3RhdGljIHZvaWQgcGlpeF9wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBpaXhfc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9tb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CitzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5fbW9kdWxlX2luaXQgPSAxOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGlpeF9wY2lfdGJsW10gPSB7CisjaWZkZWYgQVRBX0VOQUJMRV9QQVRBCisJeyAweDgwODYsIDB4NzExMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgcGlpeDRfcGF0YSB9LAorCXsgMHg4MDg2LCAweDI0ZGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfcGF0YSB9LAorCXsgMHg4MDg2LCAweDI1YTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfcGF0YSB9LAorI2VuZGlmCisKKwkvKiBOT1RFOiBUaGUgZm9sbG93aW5nIFBDSSBpZHMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUKKwkgKiBsaXN0IGluIGRyaXZlcnMvcGNpL3F1aXJrcy5jLgorCSAqLworCisJeyAweDgwODYsIDB4MjRkMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjRkZiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjVhMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjViMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCisJeyAweDgwODYsIDB4MjY1MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhIH0sCisJeyAweDgwODYsIDB4MjY1MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhX3JtIH0sCisJeyAweDgwODYsIDB4MjY1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhX3JtIH0sCisJeyAweDgwODYsIDB4MjdjMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoN19zYXRhIH0sCisJeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoN19zYXRhIH0sCisKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwaWl4X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBwaWl4X3BjaV90YmwsCisJLnByb2JlCQkJPSBwaWl4X2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgcGlpeF9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGlpeF9wYXRhX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnNldF9waW9tb2RlCQk9IHBpaXhfc2V0X3Bpb21vZGUsCisJLnNldF9kbWFtb2RlCQk9IHBpaXhfc2V0X2RtYW1vZGUsCisKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKworCS5waHlfcmVzZXQJCT0gcGlpeF9wYXRhX3BoeV9yZXNldCwKKworCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCisJLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKworCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKworCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBwaWl4X3NhdGFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKworCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCisJLnBoeV9yZXNldAkJPSBwaWl4X3NhdGFfcGh5X3Jlc2V0LAorCisJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LAorCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpaXhfcG9ydF9pbmZvW10gPSB7CisJLyogaWNoNV9wYXRhICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKyNpZiAwCisJCS5td2RtYV9tYXNrCT0gMHgwNiwgLyogbXdkbWExLTIgKi8KKyNlbHNlCisJCS5td2RtYV9tYXNrCT0gMHgwMCwgLyogbXdkbWEgYnJva2VuICovCisjZW5kaWYKKwkJLnVkbWFfbWFzawk9IDB4M2YsIC8qIHVkbWEwLTUgKi8KKwkJLnBvcnRfb3BzCT0gJnBpaXhfcGF0YV9vcHMsCisJfSwKKworCS8qIGljaDVfc2F0YSAqLworCXsKKwkJLnNodAkJPSAmcGlpeF9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NSU1QgfAorCQkJCSAgUElJWF9GTEFHX0NPTUJJTkVEIHwgUElJWF9GTEFHX0NIRUNLSU5UUiwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KKwkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCisJfSwKKworCS8qIHBpaXg0X3BhdGEgKi8KKwl7CisJCS5zaHQJCT0gJnBpaXhfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKyNpZiAwCisJCS5td2RtYV9tYXNrCT0gMHgwNiwgLyogbXdkbWExLTIgKi8KKyNlbHNlCisJCS5td2RtYV9tYXNrCT0gMHgwMCwgLyogbXdkbWEgYnJva2VuICovCisjZW5kaWYKKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BX01BU0tfNDBDLAorCQkucG9ydF9vcHMJPSAmcGlpeF9wYXRhX29wcywKKwl9LAorCisJLyogaWNoNl9zYXRhICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBQSUlYX0ZMQUdfQ09NQklORUQgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwKKwkJCQkgIEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLworCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCisJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCisJCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAorCX0sCisKKwkvKiBpY2g2X3NhdGFfcm0gKi8KKwl7CisJCS5zaHQJCT0gJnBpaXhfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TUlNUIHwKKwkJCQkgIFBJSVhfRkxBR19DT01CSU5FRCB8IFBJSVhfRkxBR19DSEVDS0lOVFIgfAorCQkJCSAgQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IFBJSVhfRkxBR19BSENJLAorCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwJLyogdWRtYTAtNiAqLworCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKKwl9LAorCisJLyogaWNoN19zYXRhICovCisJeworCQkuc2h0CQk9ICZwaWl4X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBQSUlYX0ZMQUdfQ09NQklORUQgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwKKwkJCQkgIEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBQSUlYX0ZMQUdfQUhDSSwKKwkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KKwkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2JpdHMgcGlpeF9lbmFibGVfYml0c1tdID0geworCXsgMHg0MVUsIDFVLCAweDgwVUwsIDB4ODBVTCB9LAkvKiBwb3J0IDAgKi8KKwl7IDB4NDNVLCAxVSwgMHg4MFVMLCAweDgwVUwgfSwJLyogcG9ydCAxICovCit9OworCitNT0RVTEVfQVVUSE9SKCJBbmRyZSBIZWRyaWNrLCBBbGFuIENveCwgQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiwgSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBJbnRlbCBQSUlYL0lDSCBBVEEgY29udHJvbGxlcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwaWl4X3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCisvKioKKyAqCXBpaXhfcGF0YV9jYmxfZGV0ZWN0IC0gUHJvYmUgaG9zdCBjb250cm9sbGVyIGNhYmxlIGRldGVjdCBpbmZvCisgKglAYXA6IFBvcnQgZm9yIHdoaWNoIGNhYmxlIGRldGVjdCBpbmZvIGlzIGRlc2lyZWQKKyAqCisgKglSZWFkIDgwYyBjYWJsZSBpbmRpY2F0b3IgZnJvbSBBVEEgUENJIGRldmljZSdzIFBDSSBjb25maWcKKyAqCXJlZ2lzdGVyLiAgVGhpcyByZWdpc3RlciBpcyBub3JtYWxseSBzZXQgYnkgZmlybXdhcmUgKEJJT1MpLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgorICovCitzdGF0aWMgdm9pZCBwaWl4X3BhdGFfY2JsX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdTggdG1wLCBtYXNrOworCisJLyogbm8gODBjIHN1cHBvcnQgaW4gaG9zdCBjb250cm9sbGVyPyAqLworCWlmICgoYXAtPnVkbWFfbWFzayAmIH5BVEFfVURNQV9NQVNLXzQwQykgPT0gMCkKKwkJZ290byBjYmw0MDsKKworCS8qIGNoZWNrIEJJT1MgY2FibGUgZGV0ZWN0IHJlc3VsdHMgKi8KKwltYXNrID0gYXAtPmhhcmRfcG9ydF9ubyA9PSAwID8gUElJWF84MENfUFJJIDogUElJWF84MENfU0VDOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVhfSU9DRkcsICZ0bXApOworCWlmICgodG1wICYgbWFzaykgPT0gMCkKKwkJZ290byBjYmw0MDsKKworCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKKwlyZXR1cm47CisKK2NibDQwOgorCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKKwlhcC0+dWRtYV9tYXNrICY9IEFUQV9VRE1BX01BU0tfNDBDOworfQorCisvKioKKyAqCXBpaXhfcGF0YV9waHlfcmVzZXQgLSBQcm9iZSBzcGVjaWZpZWQgcG9ydCBvbiBQQVRBIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBQb3J0IHRvIHByb2JlCisgKgorICoJUHJvYmUgUEFUQSBwaHkuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCisgKi8KKworc3RhdGljIHZvaWQgcGlpeF9wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisKKwlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZwaWl4X2VuYWJsZV9iaXRzW2FwLT5oYXJkX3BvcnRfbm9dKSkgeworCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKKwkJcmV0dXJuOworCX0KKworCXBpaXhfcGF0YV9jYmxfZGV0ZWN0KGFwKTsKKworCWF0YV9wb3J0X3Byb2JlKGFwKTsKKworCWF0YV9idXNfcmVzZXQoYXApOworfQorCisvKioKKyAqCXBpaXhfc2F0YV9wcm9iZSAtIFByb2JlIFBDSSBkZXZpY2UgZm9yIHByZXNlbnQgU0FUQSBkZXZpY2VzCisgKglAYXA6IFBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBQQ0kgZGV2aWNlIHdlIHdpc2ggdG8gcHJvYmUKKyAqCisgKglSZWFkcyBTQVRBIFBDSSBkZXZpY2UncyBQQ0kgY29uZmlnIHJlZ2lzdGVyIFBvcnQgQ29uZmlndXJhdGlvbgorICoJYW5kIFN0YXR1cyAoUENTKSB0byBkZXRlcm1pbmUgcG9ydCBhbmQgZGV2aWNlIGF2YWlsYWJpbGl0eS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqCisgKglSRVRVUk5TOgorICoJTm9uLXplcm8gaWYgZGV2aWNlIGRldGVjdGVkLCB6ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBwaWl4X3NhdGFfcHJvYmUgKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0X3NldC0+ZGV2KTsKKwlpbnQgY29tYmluZWQgPSAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0xBVkVfUE9TUyk7CisJaW50IG9yaWdfbWFzaywgbWFzaywgaTsKKwl1OCBwY3M7CisKKwltYXNrID0gKFBJSVhfUE9SVF9QUkVTRU5UIDw8IGFwLT5oYXJkX3BvcnRfbm8pIHwKKwkgICAgICAgKFBJSVhfUE9SVF9FTkFCTEVEIDw8IGFwLT5oYXJkX3BvcnRfbm8pOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgSUNINV9QQ1MsICZwY3MpOworCW9yaWdfbWFzayA9IChpbnQpIHBjcyAmIDB4ZmY7CisKKwkvKiBUT0RPOiB0aGlzIGlzIHZhZ3VlbHkgd3JvbmcgZm9yIElDSDYgY29tYmluZWQgbW9kZSwKKwkgKiB3aGVyZSBvbmx5IHR3byBvZiB0aGUgZm91ciBTQVRBIHBvcnRzIGFyZSBtYXBwZWQKKwkgKiBvbnRvIGEgc2luZ2xlIEFUQSBjaGFubmVsLiAgSXQgaXMgYWxzbyB2YWd1ZWx5IGluYWNjdXJhdGUKKwkgKiBmb3IgSUNINSwgd2hpY2ggaGFzIG9ubHkgdHdvIHBvcnRzLiAgSG93ZXZlciwgdGhpcyBpcyBvaywKKwkgKiBhcyBmdXJ0aGVyIGRldmljZSBwcmVzZW5jZSBkZXRlY3Rpb24gY29kZSB3aWxsIGhhbmRsZQorCSAqIGFueSBmYWxzZSBwb3NpdGl2ZXMgcHJvZHVjZWQgaGVyZS4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJbWFzayA9IChQSUlYX1BPUlRfUFJFU0VOVCA8PCBpKSB8IChQSUlYX1BPUlRfRU5BQkxFRCA8PCBpKTsKKworCQlpZiAoKG9yaWdfbWFzayAmIG1hc2spID09IG1hc2spCisJCQlpZiAoY29tYmluZWQgfHwgKGkgPT0gYXAtPmhhcmRfcG9ydF9ubykpCisJCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJcGlpeF9zYXRhX3BoeV9yZXNldCAtIFByb2JlIHNwZWNpZmllZCBwb3J0IG9uIFNBVEEgaG9zdCBjb250cm9sbGVyCisgKglAYXA6IFBvcnQgdG8gcHJvYmUKKyAqCisgKglQcm9iZSBTQVRBIHBoeS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqLworCitzdGF0aWMgdm9pZCBwaWl4X3NhdGFfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaWYgKCFwaWl4X3NhdGFfcHJvYmUoYXApKSB7CisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogU0FUQSBwb3J0IGhhcyBubyBkZXZpY2UuXG4iLCBhcC0+aWQpOworCQlyZXR1cm47CisJfQorCisJYXAtPmNibCA9IEFUQV9DQkxfU0FUQTsKKworCWF0YV9wb3J0X3Byb2JlKGFwKTsKKworCWF0YV9idXNfcmVzZXQoYXApOworfQorCisvKioKKyAqCXBpaXhfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCisgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKKyAqCUBhZGV2OiB1bQorICoJQHBpbzogUElPIG1vZGUsIDAgLSA0CisgKgorICoJU2V0IFBJTyBtb2RlIGZvciBkZXZpY2UsIGluIGhvc3QgY29udHJvbGxlciBQQ0kgY29uZmlnIHNwYWNlLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgorICovCisKK3N0YXRpYyB2b2lkIHBpaXhfc2V0X3Bpb21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQoreworCXVuc2lnbmVkIGludCBwaW8JPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXVuc2lnbmVkIGludCBpc19zbGF2ZQk9IChhZGV2LT5kZXZubyAhPSAwKTsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX3BvcnQ9IGFwLT5oYXJkX3BvcnRfbm8gPyAweDQyIDogMHg0MDsKKwl1bnNpZ25lZCBpbnQgc2xhdmVfcG9ydAk9IDB4NDQ7CisJdTE2IG1hc3Rlcl9kYXRhOworCXU4IHNsYXZlX2RhdGE7CisKKwlzdGF0aWMgY29uc3QJIC8qIElTUCAgUlRDICovCisJdTggdGltaW5nc1tdWzJdCT0geyB7IDAsIDAgfSwKKwkJCSAgICB7IDAsIDAgfSwKKwkJCSAgICB7IDEsIDAgfSwKKwkJCSAgICB7IDIsIDEgfSwKKwkJCSAgICB7IDIsIDMgfSwgfTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsICZtYXN0ZXJfZGF0YSk7CisJaWYgKGlzX3NsYXZlKSB7CisJCW1hc3Rlcl9kYXRhIHw9IDB4NDAwMDsKKwkJLyogZW5hYmxlIFBQRSwgSUUgYW5kIFRJTUUgKi8KKwkJbWFzdGVyX2RhdGEgfD0gMHgwMDcwOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHNsYXZlX3BvcnQsICZzbGF2ZV9kYXRhKTsKKwkJc2xhdmVfZGF0YSAmPSAoYXAtPmhhcmRfcG9ydF9ubyA/IDB4MGYgOiAweGYwKTsKKwkJc2xhdmVfZGF0YSB8PQorCQkJKHRpbWluZ3NbcGlvXVswXSA8PCAyKSB8CisJCQkodGltaW5nc1twaW9dWzFdIDw8IChhcC0+aGFyZF9wb3J0X25vID8gNCA6IDApKTsKKwl9IGVsc2UgeworCQltYXN0ZXJfZGF0YSAmPSAweGNjZjg7CisJCS8qIGVuYWJsZSBQUEUsIElFIGFuZCBUSU1FICovCisJCW1hc3Rlcl9kYXRhIHw9IDB4MDAwNzsKKwkJbWFzdGVyX2RhdGEgfD0KKwkJCSh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKKwkJCSh0aW1pbmdzW3Bpb11bMV0gPDwgOCk7CisJfQorCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CisJaWYgKGlzX3NsYXZlKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBzbGF2ZV9wb3J0LCBzbGF2ZV9kYXRhKTsKK30KKworLyoqCisgKglwaWl4X3NldF9kbWFtb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncworICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCisgKglAYWRldjogdW0KKyAqCUB1ZG1hOiB1ZG1hIG1vZGUsIDAgLSA2CisgKgorICoJU2V0IFVETUEgbW9kZSBmb3IgZGV2aWNlLCBpbiBob3N0IGNvbnRyb2xsZXIgUENJIGNvbmZpZyBzcGFjZS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqLworCitzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3sKKwl1bnNpZ25lZCBpbnQgdWRtYQk9IGFkZXYtPmRtYV9tb2RlOyAvKiBGSVhNRTogTVdETUEgdG9vICovCisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXU4IG1hc2xhdmUJCT0gYXAtPmhhcmRfcG9ydF9ubyA/IDB4NDIgOiAweDQwOworCXU4IHNwZWVkCQk9IHVkbWE7CisJdW5zaWduZWQgaW50IGRyaXZlX2RuCT0gKGFwLT5oYXJkX3BvcnRfbm8gPyAyIDogMCkgKyBhZGV2LT5kZXZubzsKKwlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZV9kbiAqIDQpOworCWludCB1X2ZsYWcJCT0gMSA8PCBkcml2ZV9kbjsKKwlpbnQgdl9mbGFnCQk9IDB4MDEgPDwgZHJpdmVfZG47CisJaW50IHdfZmxhZwkJPSAweDEwIDw8IGRyaXZlX2RuOworCWludCB1X3NwZWVkCQk9IDA7CisJaW50CQkJc2l0cmU7CisJdTE2CQkJcmVnNDA0MiwgcmVnNGE7CisJdTgJCQlyZWc0OCwgcmVnNTQsIHJlZzU1OworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtYXNsYXZlLCAmcmVnNDA0Mik7CisJRFBSSU5USygicmVnNDA0MiA9IDB4JTA0eFxuIiwgcmVnNDA0Mik7CisJc2l0cmUgPSAocmVnNDA0MiAmIDB4NDAwMCkgPyAxIDogMDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZyZWc0OCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAmcmVnNGEpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgJnJlZzU0KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTUsICZyZWc1NSk7CisKKwlzd2l0Y2goc3BlZWQpIHsKKwkJY2FzZSBYRkVSX1VETUFfNDoKKwkJY2FzZSBYRkVSX1VETUFfMjoJdV9zcGVlZCA9IDIgPDwgKGRyaXZlX2RuICogNCk7IGJyZWFrOworCQljYXNlIFhGRVJfVURNQV82OgorCQljYXNlIFhGRVJfVURNQV81OgorCQljYXNlIFhGRVJfVURNQV8zOgorCQljYXNlIFhGRVJfVURNQV8xOgl1X3NwZWVkID0gMSA8PCAoZHJpdmVfZG4gKiA0KTsgYnJlYWs7CisJCWNhc2UgWEZFUl9VRE1BXzA6CXVfc3BlZWQgPSAwIDw8IChkcml2ZV9kbiAqIDQpOyBicmVhazsKKwkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQljYXNlIFhGRVJfTVdfRE1BXzE6CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlyZXR1cm47CisJfQorCisJaWYgKHNwZWVkID49IFhGRVJfVURNQV8wKSB7CisJCWlmICghKHJlZzQ4ICYgdV9mbGFnKSkKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4IHwgdV9mbGFnKTsKKwkJaWYgKHNwZWVkID09IFhGRVJfVURNQV81KSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAodTgpIHJlZzU1fHdfZmxhZyk7CisJCX0gZWxzZSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU1LCAodTgpIHJlZzU1ICYgfndfZmxhZyk7CisJCX0KKwkJaWYgKChyZWc0YSAmIGFfc3BlZWQpICE9IHVfc3BlZWQpCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAocmVnNGEgJiB+YV9zcGVlZCkgfCB1X3NwZWVkKTsKKwkJaWYgKHNwZWVkID4gWEZFUl9VRE1BXzIpIHsKKwkJCWlmICghKHJlZzU0ICYgdl9mbGFnKSkKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU0LCByZWc1NCB8IHZfZmxhZyk7CisJCX0gZWxzZQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgcmVnNTQgJiB+dl9mbGFnKTsKKwl9IGVsc2UgeworCQlpZiAocmVnNDggJiB1X2ZsYWcpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCByZWc0OCAmIH51X2ZsYWcpOworCQlpZiAocmVnNGEgJiBhX3NwZWVkKQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgcmVnNGEgJiB+YV9zcGVlZCk7CisJCWlmIChyZWc1NCAmIHZfZmxhZykKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTQsIHJlZzU0ICYgfnZfZmxhZyk7CisJCWlmIChyZWc1NSAmIHdfZmxhZykKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTUsICh1OCkgcmVnNTUgJiB+d19mbGFnKTsKKwl9Cit9CisKKy8qIG1vdmUgdG8gUENJIGxheWVyLCBpbnRlZ3JhdGUgdy8gTVNJIHN0dWZmICovCitzdGF0aWMgdm9pZCBwY2lfZW5hYmxlX2ludHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IHBjaV9jb21tYW5kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KK30KKworI2RlZmluZSBBSENJX1BDSV9CQVIgNQorI2RlZmluZSBBSENJX0dMT0JBTF9DVEwgMHgwNAorI2RlZmluZSBBSENJX0VOQUJMRSAoMSA8PCAzMSkKK3N0YXRpYyBpbnQgcGlpeF9kaXNhYmxlX2FoY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdm9pZCAqbW1pbzsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTMyIHRtcDsKKwlpbnQgcmMgPSAwOworCisJLyogQlVHOiBwY2lfZW5hYmxlX2RldmljZSBoYXMgbm90IHlldCBiZWVuIGNhbGxlZC4gIFRoaXMKKwkgKiB3b3JrcyBiZWNhdXNlIHRoaXMgZGV2aWNlIGlzIHVzdWFsbHkgc2V0IHVwIGJ5IEJJT1MuCisJICovCisKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEFIQ0lfUENJX0JBUik7CisJaWYgKCFhZGRyIHx8ICFwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEFIQ0lfUENJX0JBUikpCisJCXJldHVybiAwOworCQorCW1taW8gPSBpb3JlbWFwKGFkZHIsIDY0KTsKKwlpZiAoIW1taW8pCisJCXJldHVybiAtRU5PTUVNOworCQorCXRtcCA9IHJlYWRsKG1taW8gKyBBSENJX0dMT0JBTF9DVEwpOworCWlmICh0bXAgJiBBSENJX0VOQUJMRSkgeworCQl0bXAgJj0gfkFIQ0lfRU5BQkxFOworCQl3cml0ZWwodG1wLCBtbWlvICsgQUhDSV9HTE9CQUxfQ1RMKTsKKworCQl0bXAgPSByZWFkbChtbWlvICsgQUhDSV9HTE9CQUxfQ1RMKTsKKwkJaWYgKHRtcCAmIEFIQ0lfRU5BQkxFKQorCQkJcmMgPSAtRUlPOworCX0KKwkKKwlpb3VubWFwKG1taW8pOworCXJldHVybiByYzsKK30KKworLyoqCisgKglwaWl4X2luaXRfb25lIC0gUmVnaXN0ZXIgUElJWCBBVEEgUENJIGRldmljZSB3aXRoIGtlcm5lbCBzZXJ2aWNlcworICoJQHBkZXY6IFBDSSBkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqCUBlbnQ6IEVudHJ5IGluIHBpaXhfcGNpX3RibCBtYXRjaGluZyB3aXRoIEBwZGV2CisgKgorICoJQ2FsbGVkIGZyb20ga2VybmVsIFBDSSBsYXllci4gIFdlIHByb2JlIGZvciBjb21iaW5lZCBtb2RlIChzaWdoKSwKKyAqCWFuZCB0aGVuIGhhbmQgb3ZlciBjb250cm9sIHRvIGxpYmF0YSwgZm9yIGl0IHRvIGRvIHRoZSByZXN0LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBQQ0kgbGF5ZXIgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2Vzcywgb3IgLUVSUk5PIHZhbHVlLgorICovCisKK3N0YXRpYyBpbnQgcGlpeF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKKwl1bnNpZ25lZCBpbnQgY29tYmluZWQgPSAwLCBuX3BvcnRzID0gMTsKKwl1bnNpZ25lZCBpbnQgcGF0YV9jaGFuID0gMCwgc2F0YV9jaGFuID0gMDsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJLyogbm8gaG90cGx1Z2dpbmcgc3VwcG9ydCAoRklYTUUpICovCisJaWYgKCFpbl9tb2R1bGVfaW5pdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwb3J0X2luZm9bMF0gPSAmcGlpeF9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV07CisJcG9ydF9pbmZvWzFdID0gTlVMTDsKKworCWlmIChwb3J0X2luZm9bMF0tPmhvc3RfZmxhZ3MgJiBQSUlYX0ZMQUdfQUhDSSkgeworCQlpbnQgcmMgPSBwaWl4X2Rpc2FibGVfYWhjaShwZGV2KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCWlmIChwb3J0X2luZm9bMF0tPmhvc3RfZmxhZ3MgJiBQSUlYX0ZMQUdfQ09NQklORUQpIHsKKwkJdTggdG1wOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBJQ0g1X1BNUiwgJnRtcCk7CisKKwkJaWYgKHRtcCAmIFBJSVhfQ09NQikgeworCQkJY29tYmluZWQgPSAxOworCQkJaWYgKHRtcCAmIFBJSVhfQ09NQl9QQVRBX1AwKQorCQkJCXNhdGFfY2hhbiA9IDE7CisJCQllbHNlCisJCQkJcGF0YV9jaGFuID0gMTsKKwkJfQorCX0KKworCS8qIE9uIElDSDUsIHNvbWUgQklPU2VuIGRpc2FibGUgdGhlIGludGVycnVwdCB1c2luZyB0aGUKKwkgKiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUgYml0IGFkZGVkIGluIFBDSSAyLjMuCisJICogT24gSUNINiwgdGhpcyBiaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCwgYnV0IG9ubHkgd2hlbgorCSAqIE1TSSBpcyBkaXNhYmxlZCAoYW5kIGl0IGlzIGRpc2FibGVkLCBhcyB3ZSBkb24ndCB1c2UKKwkgKiBtZXNzYWdlLXNpZ25hbGxlZCBpbnRlcnJ1cHRzIGN1cnJlbnRseSkuCisJICovCisJaWYgKHBvcnRfaW5mb1swXS0+aG9zdF9mbGFncyAmIFBJSVhfRkxBR19DSEVDS0lOVFIpCisJCXBjaV9lbmFibGVfaW50eChwZGV2KTsKKworCWlmIChjb21iaW5lZCkgeworCQlwb3J0X2luZm9bc2F0YV9jaGFuXSA9ICZwaWl4X3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKwkJcG9ydF9pbmZvW3NhdGFfY2hhbl0tPmhvc3RfZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKKwkJcG9ydF9pbmZvW3BhdGFfY2hhbl0gPSAmcGlpeF9wb3J0X2luZm9baWNoNV9wYXRhXTsKKwkJbl9wb3J0cysrOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogY29tYmluZWQgbW9kZSBkZXRlY3RlZFxuIik7CisJfQorCisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCBuX3BvcnRzKTsKK30KKworLyoqCisgKglwaWl4X2luaXQgLQorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcGlpeF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJRFBSSU5USygicGNpX21vZHVsZV9pbml0XG4iKTsKKwlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmcGlpeF9wY2lfZHJpdmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWluX21vZHVsZV9pbml0ID0gMDsKKworCURQUklOVEsoImRvbmVcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXBpaXhfZXhpdCAtCisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KKworc3RhdGljIHZvaWQgX19leGl0IHBpaXhfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGlpeF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGlpeF9pbml0KTsKK21vZHVsZV9leGl0KHBpaXhfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvYXRhcmlfTkNSNTM4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWU3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXRhcmlfTkNSNTM4MC5jCkBAIC0wLDAgKzEsMjk4NiBAQAorLyogCisgKiBOQ1IgNTM4MCBnZW5lcmljIGRyaXZlciByb3V0aW5lcy4gIFRoZXNlIHNob3VsZCBtYWtlIGl0ICp0cml2aWFsKgorICogCXRvIGltcGxlbWVudCA1MzgwIFNDU0kgZHJpdmVycyB1bmRlciBMaW51eCB3aXRoIGEgbm9uLXRyYW50b3IKKyAqCWFyY2hpdGVjdHVyZS4KKyAqCisgKglOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgYWxzbyB3b3JrIHdpdGggTlI1M2M0MDAgZmFtaWx5IGNoaXBzLgorICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nIAorICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqIAlkcmV3QGNvbG9yYWRvLmVkdQorICoJKzEgKDMwMykgNjY2LTU4MzYKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSA2LiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICsrcm9tYW46IFRvIHBvcnQgdGhlIDUzODAgZHJpdmVyIHRvIHRoZSBBdGFyaSwgSSBoYWQgdG8gZG8gc29tZSBjaGFuZ2VzIGluCisgKiB0aGlzIGZpbGUsIHRvbzoKKyAqCisgKiAgLSBTb21lIG9mIHRoZSBkZWJ1ZyBzdGF0ZW1lbnRzIHdlcmUgaW5jb3JyZWN0ICh1bmRlZmluZWQgdmFyaWFibGVzIGFuZCB0aGUKKyAqICAgIGxpa2UpLiBJIGZpeGVkIHRoYXQuCisgKgorICogIC0gSW4gaW5mb3JtYXRpb25fdHJhbnNmZXIoKSwgSSB0aGluayBhICNpZmRlZiB3YXMgd3JvbmcuIExvb2tpbmcgYXQgdGhlCisgKiAgICBwb3NzaWJsZSBETUEgdHJhbnNmZXIgc2l6ZSBzaG91bGQgYWxzbyBoYXBwZW4gZm9yIFJFQUxfRE1BLiBJIGFkZGVkIHRoaXMKKyAqICAgIGluIHRoZSAjaWYgc3RhdGVtZW50LgorICoKKyAqICAtIFdoZW4gdXNpbmcgcmVhbCBETUEsIGluZm9ybWF0aW9uX3RyYW5zZmVyKCkgc2hvdWxkIHJldHVybiBpbiBhIERBVEFPVVQKKyAqICAgIHBoYXNlIGFmdGVyIHN0YXJ0aW5nIHRoZSBETUEuIEl0IGhhcyBub3RoaW5nIG1vcmUgdG8gZG8uCisgKgorICogIC0gVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgc2hvdWxkIHJ1biBtYWluIGFmdGVyIGVuZCBvZiBETUEsIHRvbyAobm90CisgKiAgICBvbmx5IGFmdGVyIFJFU0VMRUNUSU9OIGludGVycnVwdHMpLiBBZGRpdGlvbmFsbHksIGl0IHNob3VsZCBfbm90XyB0ZXN0CisgKiAgICBmb3IgbW9yZSBpbnRlcnJ1cHRzIGFmdGVyIHJ1bm5pbmcgbWFpbiwgc2luY2UgYSBETUEgcHJvY2VzcyBtYXkgaGF2ZQorICogICAgYmVlbiBzdGFydGVkIGFuZCBpbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb24gbm93LiBUaGUgbmV3IGludCBjb3VsZCBoYXBwZW4KKyAqICAgIGluc2lkZSB0aGUgZXhlY3V0aW9uIG9mIE5DUjUzODBfaW50cigpLCBsZWFkaW5nIHRvIHJlY3Vyc2l2ZQorICogICAgY2FsbHMuCisgKgorICogIC0gSSd2ZSBhZGRlZCBhIGZ1bmN0aW9uIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycygpIHRoYXQgdHJpZXMgdG8KKyAqICAgIG1lcmdlIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgdGhhdCBhcmUgbG9jYXRlZCBhdCBjb250aWd1b3VzCisgKiAgICBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIGNhbiBiZSBwcm9jZXNzZWQgd2l0aCB0aGUgc2FtZSBETUEgc2V0dXAuCisgKiAgICBTaW5jZSBtb3N0IHNjYXR0ZXItZ2F0aGVyIG9wZXJhdGlvbnMgd29yayBvbiBhIHBhZ2UgKDRLKSBvZgorICogICAgNCBidWZmZXJzICgxSyksIGluIG1vcmUgdGhhbiA5MCUgb2YgYWxsIGNhc2VzIHRocmVlIGludGVycnVwdHMgYW5kCisgKiAgICBETUEgc2V0dXAgYWN0aW9ucyBhcmUgc2F2ZWQuCisgKgorICogLSBJJ3ZlIGRlbGV0ZWQgYWxsIHRoZSBzdHVmZiBmb3IgQVVUT1BST0JFX0lSUSwgUkVBTF9ETUFfUE9MTCwgUFNFVURPX0RNQQorICogICAgYW5kIFVTTEVFUCwgYmVjYXVzZSB0aGVzZSB3ZXJlIG1lc3NpbmcgdXAgcmVhZGFiaWxpdHkgYW5kIHdpbGwgbmV2ZXIgYmUKKyAqICAgIG5lZWRlZCBmb3IgQXRhcmkgU0NTSS4KKyAqIAorICogLSBJJ3ZlIHJldmlzZWQgdGhlIE5DUjUzODBfbWFpbigpIGNhbGxpbmcgc2NoZW1lIChyZWxheCB0aGUgJ21haW5fcnVubmluZycKKyAqICAgc3R1ZmYpLCBhbmQgJ21haW4nIGlzIGV4ZWN1dGVkIGluIGEgYm90dG9tIGhhbGYgaWYgYXdva2VuIGJ5IGFuCisgKiAgIGludGVycnVwdC4KKyAqCisgKiAtIFRoZSBjb2RlIHdhcyBxdWl0ZSBjbHV0dGVyZWQgdXAgYnkgIiNpZiAoTkRFQlVHICYgTkRFQlVHXyopIHByaW50ay4uLiIKKyAqICAgY29uc3RydWN0cy4gSW4gbXkgZXllcywgdGhpcyBtYWRlIHRoZSBzb3VyY2UgcmF0aGVyIHVucmVhZGFibGUsIHNvIEkKKyAqICAgZmluYWxseSByZXBsYWNlZCB0aGF0IGJ5IHRoZSAqX1BSSU5USygpIG1hY3Jvcy4KKyAqCisgKi8KKworLyoKKyAqIEZ1cnRoZXIgZGV2ZWxvcG1lbnQgLyB0ZXN0aW5nIHRoYXQgc2hvdWxkIGJlIGRvbmUgOiAKKyAqIDEuICBUZXN0IGxpbmtlZCBjb21tYW5kIGhhbmRsaW5nIGNvZGUgYWZ0ZXIgRXJpYyBpcyByZWFkeSB3aXRoIAorICogICAgIHRoZSBoaWdoIGxldmVsIGNvZGUuCisgKi8KKworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisjZGVmaW5lIExJU1QoeCx5KSBcCisgIHsgcHJpbnRrKCJMSU5FOiVkICAgQWRkaW5nICVwIHRvICVwXG4iLCBfX0xJTkVfXywgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSk7IFwKKyAgICBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQorI2RlZmluZSBSRU1PVkUodyx4LHkseikgXAorICB7IHByaW50aygiTElORTolZCAgIFJlbW92aW5nOiAlcC0+JXAgICVwLT4lcCBcbiIsIF9fTElORV9fLCBcCisJICAgKHZvaWQqKSh3KSwgKHZvaWQqKSh4KSwgKHZvaWQqKSh5KSwgKHZvaWQqKSh6KSk7IFwKKyAgICBpZiAoKHgpPT0oeSkpIHVkZWxheSg1KTsgfQorI2Vsc2UKKyNkZWZpbmUgTElTVCh4LHkpCisjZGVmaW5lIFJFTU9WRSh3LHgseSx6KQorI2VuZGlmCisKKyNpZm5kZWYgbm90eWV0CisjdW5kZWYgTElOS0VECisjZW5kaWYKKworLyoKKyAqIERlc2lnbgorICogSXNzdWVzIDoKKyAqCisgKiBUaGUgb3RoZXIgTGludXggU0NTSSBkcml2ZXJzIHdlcmUgd3JpdHRlbiB3aGVuIExpbnV4IHdhcyBJbnRlbCBQQy1vbmx5LAorICogYW5kIHNwZWNpZmljYWxseSBmb3IgZWFjaCBib2FyZCByYXRoZXIgdGhhbiBlYWNoIGNoaXAuICBUaGlzIG1ha2VzIHRoZWlyCisgKiBhZGFwdGF0aW9uIHRvIHBsYXRmb3JtcyBsaWtlIHRoZSBNYWMgKFNvbWUgb2Ygd2hpY2ggdXNlIE5DUjUzODAncykKKyAqIG1vcmUgZGlmZmljdWx0IHRoYW4gaXQgaGFzIHRvIGJlLgorICoKKyAqIEFsc28sIG1hbnkgb2YgdGhlIFNDU0kgZHJpdmVycyB3ZXJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBjb21tYW5kIHF1ZXVpbmcKKyAqIHJvdXRpbmVzIHdlcmUgaW1wbGVtZW50ZWQsIG1lYW5pbmcgdGhlaXIgaW1wbGVtZW50YXRpb25zIG9mIHF1ZXVlZCAKKyAqIGNvbW1hbmRzIHdlcmUgaGFja2VkIG9uIHJhdGhlciB0aGFuIGRlc2lnbmVkIGluIGZyb20gdGhlIHN0YXJ0LgorICoKKyAqIFdoZW4gSSBkZXNpZ25lZCB0aGUgTGludXggU0NTSSBkcml2ZXJzIEkgZmlndXJlZCB0aGF0IAorICogd2hpbGUgaGF2aW5nIHR3byBkaWZmZXJlbnQgU0NTSSBib2FyZHMgaW4gYSBzeXN0ZW0gbWlnaHQgYmUgdXNlZnVsCisgKiBmb3IgZGVidWdnaW5nIHRoaW5ncywgdHdvIG9mIHRoZSBzYW1lIHR5cGUgd291bGRuJ3QgYmUgdXNlZC4KKyAqIFdlbGwsIEkgd2FzIHdyb25nIGFuZCBhIG51bWJlciBvZiB1c2VycyBoYXZlIG1haWxlZCBtZSBhYm91dCBydW5uaW5nCisgKiBtdWx0aXBsZSBoaWdoLXBlcmZvcm1hbmNlIFNDU0kgYm9hcmRzIGluIGEgc2VydmVyLgorICoKKyAqIEZpbmFsbHksIHdoZW4gSSBnZXQgcXVlc3Rpb25zIGZyb20gdXNlcnMsIEkgaGF2ZSBubyBpZGVhIHdoYXQgCisgKiByZXZpc2lvbiBvZiBteSBkcml2ZXIgdGhleSBhcmUgcnVubmluZy4KKyAqCisgKiBUaGlzIGRyaXZlciBhdHRlbXB0cyB0byBhZGRyZXNzIHRoZXNlIHByb2JsZW1zIDoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIDUzODAgZHJpdmVyLiAgVG8gdXNlIGl0IG9uIGEgZGlmZmVyZW50IHBsYXRmb3JtLCAKKyAqIG9uZSBzaW1wbHkgd3JpdGVzIGFwcHJvcHJpYXRlIHN5c3RlbSBzcGVjaWZpYyBtYWNyb3MgKGllLCBkYXRhCisgKiB0cmFuc2ZlciAtIHNvbWUgUEMncyB3aWxsIHVzZSB0aGUgSS9PIGJ1cywgNjhLJ3MgbXVzdCB1c2UgCisgKiBtZW1vcnkgbWFwcGVkKSBhbmQgZHJvcHMgdGhpcyBmaWxlIGluIHRoZWlyICdDJyB3cmFwcGVyLgorICoKKyAqIEFzIGZhciBhcyBjb21tYW5kIHF1ZXVlaW5nLCB0d28gcXVldWVzIGFyZSBtYWludGFpbmVkIGZvciAKKyAqIGVhY2ggNTM4MCBpbiB0aGUgc3lzdGVtIC0gY29tbWFuZHMgdGhhdCBoYXZlbid0IGJlZW4gaXNzdWVkIHlldCwKKyAqIGFuZCBjb21tYW5kcyB0aGF0IGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nLiAgVGhpcyBtZWFucyB0aGF0IGFuIAorICogdW5saW1pdGVkIG51bWJlciBvZiBjb21tYW5kcyBtYXkgYmUgcXVldWVkLCBsZXR0aW5nIAorICogbW9yZSBjb21tYW5kcyBwcm9wYWdhdGUgZnJvbSB0aGUgaGlnaGVyIGRyaXZlciBsZXZlbHMgZ2l2aW5nIGhpZ2hlciAKKyAqIHRocm91Z2hwdXQuICBOb3RlIHRoYXQgYm90aCBJX1RfTCBhbmQgSV9UX0xfUSBuZXh1c2VzIGFyZSBzdXBwb3J0ZWQsIAorICogYWxsb3dpbmcgbXVsdGlwbGUgY29tbWFuZHMgdG8gcHJvcGFnYXRlIGFsbCB0aGUgd2F5IHRvIGEgU0NTSS1JSSBkZXZpY2UgCisgKiB3aGlsZSBhIGNvbW1hbmQgaXMgYWxyZWFkeSBleGVjdXRpbmcuCisgKgorICogVG8gc29sdmUgdGhlIG11bHRpcGxlLWJvYXJkcy1pbi10aGUtc2FtZS1zeXN0ZW0gcHJvYmxlbSwgCisgKiB0aGVyZSBpcyBhIHNlcGFyYXRlIGluc3RhbmNlIHN0cnVjdHVyZSBmb3IgZWFjaCBpbnN0YW5jZQorICogb2YgYSA1MzgwIGluIHRoZSBzeXN0ZW0uICBTbywgbXVsdGlwbGUgTkNSNTM4MCBkcml2ZXJzIHdpbGwKKyAqIGJlIGFibGUgdG8gY29leGlzdCB3aXRoIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gdGhlIGhpZ2ggbGV2ZWwKKyAqIFNDU0kgY29kZS4gIAorICoKKyAqIEEgTkNSNTM4MF9QVUJMSUNfUkVWSVNJT04gbWFjcm8gaXMgcHJvdmlkZWQsIHdpdGggdGhlIHJlbGVhc2UKKyAqIG51bWJlciAodXBkYXRlZCBmb3IgZWFjaCBwdWJsaWMgcmVsZWFzZSkgcHJpbnRlZCBieSB0aGUgCisgKiBOQ1I1MzgwX3ByaW50X29wdGlvbnMgY29tbWFuZCwgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSAKKyAqIHdyYXBwZXIgZGV0ZWN0IGZ1bmN0aW9uLCBzbyB0aGF0IEkga25vdyB3aGF0IHJlbGVhc2Ugb2YgdGhlIGRyaXZlcgorICogdXNlcnMgYXJlIHVzaW5nLgorICoKKyAqIElzc3VlcyBzcGVjaWZpYyB0byB0aGUgTkNSNTM4MCA6IAorICoKKyAqIFdoZW4gdXNlZCBpbiBhIFBJTyBvciBwc2V1ZG8tZG1hIG1vZGUsIHRoZSBOQ1I1MzgwIGlzIGEgYnJhaW5kZWFkIAorICogcGllY2Ugb2YgaGFyZHdhcmUgdGhhdCByZXF1aXJlcyB5b3UgdG8gc2l0IGluIGEgbG9vcCBwb2xsaW5nIGZvciAKKyAqIHRoZSBSRVEgc2lnbmFsIGFzIGxvbmcgYXMgeW91IGFyZSBjb25uZWN0ZWQuICBTb21lIGRldmljZXMgYXJlIAorICogYnJhaW4gZGVhZCAoaWUsIG1hbnkgVEVYRUwgQ0QgUk9NIGRyaXZlcykgYW5kIHdvbid0IGRpc2Nvbm5lY3QgCisgKiB3aGlsZSBkb2luZyBsb25nIHNlZWsgb3BlcmF0aW9ucy4KKyAqIAorICogVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiBkZXZpY2VzIHRoYXQgaGF2ZQorICogZGlzY29ubmVjdGVkLiAgSWYgdGhlIGRldmljZSBoYXNuJ3QgZGlzY29ubmVjdGVkLCBmb3IgY29tbWFuZHMgdGhhdAorICogc2hvdWxkIGRpc2Nvbm5lY3QsIHdlIGRvIHNvbWV0aGluZyBsaWtlIAorICoKKyAqIHdoaWxlICghUkVRIGlzIGFzc2VydGVkKSB7IHNsZWVwIGZvciBOIHVzZWNzOyBwb2xsIGZvciBNIHVzZWNzIH0KKyAqIAorICogU29tZSB0d2Vha2luZyBvZiBOIGFuZCBNIG5lZWRzIHRvIGJlIGRvbmUuICBBbiBhbGdvcml0aG0gYmFzZWQgCisgKiBvbiAidGltZSB0byBkYXRhIiB3b3VsZCBnaXZlIHRoZSBiZXN0IHJlc3VsdHMgYXMgbG9uZyBhcyBzaG9ydCB0aW1lCisgKiB0byBkYXRhcyAoaWUsIG9uIHRoZSBzYW1lIHRyYWNrKSB3ZXJlIGNvbnNpZGVyZWQsIGhvd2V2ZXIgdGhlc2UgCisgKiBicm9rZW4gZGV2aWNlcyBhcmUgdGhlIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiB0aGUgcnVsZSBhbmQgSSdkIHJhdGhlcgorICogc3BlbmQgbXkgdGltZSBvcHRpbWl6aW5nIGZvciB0aGUgbm9ybWFsIGNhc2UuCisgKgorICogQXJjaGl0ZWN0dXJlIDoKKyAqCisgKiBBdCB0aGUgaGVhcnQgb2YgdGhlIGRlc2lnbiBpcyBhIGNvcm91dGluZSwgTkNSNTM4MF9tYWluLAorICogd2hpY2ggaXMgc3RhcnRlZCB3aGVuIG5vdCBydW5uaW5nIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKyAqIHRpbWVyLCBhbmQgcXVldWUgY29tbWFuZCBmdW5jdGlvbi4gIEl0IGF0dGVtcHRzIHRvIGVzdGFibGlzaAorICogSV9UX0wgb3IgSV9UX0xfUSBuZXh1c2VzIGJ5IHJlbW92aW5nIHRoZSBjb21tYW5kcyBmcm9tIHRoZSAKKyAqIGlzc3VlIHF1ZXVlIGFuZCBjYWxsaW5nIE5DUjUzODBfc2VsZWN0KCkgaWYgYSBuZXh1cyAKKyAqIGlzIG5vdCBlc3RhYmxpc2hlZC4gCisgKgorICogT25jZSBhIG5leHVzIGlzIGVzdGFibGlzaGVkLCB0aGUgTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlcigpCisgKiBwaGFzZSBnb2VzIHRocm91Z2ggdGhlIHZhcmlvdXMgcGhhc2VzIGFzIGluc3RydWN0ZWQgYnkgdGhlIHRhcmdldC4KKyAqIGlmIHRoZSB0YXJnZXQgZ29lcyBpbnRvIE1TRyBJTiBhbmQgc2VuZHMgYSBESVNDT05ORUNUIG1lc3NhZ2UsCisgKiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGludG8gdGhlIHBlciBpbnN0YW5jZSBkaXNjb25uZWN0ZWQKKyAqIHF1ZXVlLCBhbmQgTkNSNTM4MF9tYWluIHRyaWVzIHRvIGZpbmQgbW9yZSB3b3JrLiAgSWYgVVNMRUVQCisgKiB3YXMgZGVmaW5lZCwgYW5kIHRoZSB0YXJnZXQgaXMgaWRsZSBmb3IgdG9vIGxvbmcsIHRoZSBzeXN0ZW0KKyAqIHdpbGwgdHJ5IHRvIHNsZWVwLgorICoKKyAqIElmIGEgY29tbWFuZCBoYXMgZGlzY29ubmVjdGVkLCBldmVudHVhbGx5IGFuIGludGVycnVwdCB3aWxsIHRyaWdnZXIsCisgKiBjYWxsaW5nIE5DUjUzODBfaW50cigpICB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCBOQ1I1MzgwX3Jlc2VsZWN0CisgKiB0byByZWVzdGFibGlzaCBhIG5leHVzLiAgVGhpcyB3aWxsIHJ1biBtYWluIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBPbiBjb21tYW5kIHRlcm1pbmF0aW9uLCB0aGUgZG9uZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyAKKyAqIGFwcHJvcHJpYXRlLgorICoKKyAqIFNDU0kgcG9pbnRlcnMgYXJlIG1haW50YWluZWQgaW4gdGhlIFNDcCBmaWVsZCBvZiBTQ1NJIGNvbW1hbmQgCisgKiBzdHJ1Y3R1cmVzLCBiZWluZyBpbml0aWFsaXplZCBhZnRlciB0aGUgY29tbWFuZCBpcyBjb25uZWN0ZWQKKyAqIGluIE5DUjUzODBfc2VsZWN0LCBhbmQgc2V0IGFzIGFwcHJvcHJpYXRlIGluIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIuCisgKiBOb3RlIHRoYXQgaW4gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZCwgYW4gaW1wbGljaXQgU0FWRSBQT0lOVEVSUyBvcGVyYXRpb24KKyAqIGlzIGRvbmUsIHNpbmNlIHNvbWUgQlJPS0VOIGRpc2tzIGZhaWwgdG8gaXNzdWUgYW4gZXhwbGljaXQgU0FWRSBQT0lOVEVSUy4KKyAqLworCisvKgorICogVXNpbmcgdGhpcyBmaWxlIDoKKyAqIFRoaXMgZmlsZSBhIHNrZWxldG9uIExpbnV4IFNDU0kgZHJpdmVyIGZvciB0aGUgTkNSIDUzODAgc2VyaWVzCisgKiBvZiBjaGlwcy4gIFRvIHVzZSBpdCwgeW91IHdyaXRlIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmdW5jdGlvbnMgCisgKiBhbmQgbWFjcm9zIGFuZCBpbmNsdWRlIHRoaXMgZmlsZSBpbiB5b3VyIGRyaXZlci4KKyAqCisgKiBUaGVzZSBtYWNyb3MgY29udHJvbCBvcHRpb25zIDogCisgKiBBVVRPU0VOU0UgLSBpZiBkZWZpbmVkLCBSRVFVRVNUIFNFTlNFIHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAqCWZvciBjb21tYW5kcyB0aGF0IHJldHVybiB3aXRoIGEgQ0hFQ0sgQ09ORElUSU9OIHN0YXR1cy4gCisgKgorICogTElOS0VEIC0gaWYgZGVmaW5lZCwgbGlua2VkIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuCisgKgorICogUkVBTF9ETUEgLSBpZiBkZWZpbmVkLCBSRUFMIERNQSBpcyB1c2VkIGR1cmluZyB0aGUgZGF0YSB0cmFuc2ZlciBwaGFzZXMuCisgKgorICogU1VQUE9SVF9UQUdTIC0gaWYgZGVmaW5lZCwgU0NTSS0yIHRhZ2dlZCBxdWV1aW5nIGlzIHVzZWQgd2hlcmUgcG9zc2libGUKKyAqCisgKiBUaGVzZSBtYWNyb3MgTVVTVCBiZSBkZWZpbmVkIDoKKyAqIAorICogTkNSNTM4MF9yZWFkKHJlZ2lzdGVyKSAgLSByZWFkIGZyb20gdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICoKKyAqIE5DUjUzODBfd3JpdGUocmVnaXN0ZXIsIHZhbHVlKSAtIHdyaXRlIHRvIHRoZSBzcGVjaWZpYyByZWdpc3RlciAKKyAqCisgKiBFaXRoZXIgcmVhbCBETUEgKm9yKiBwc2V1ZG8gRE1BIG1heSBiZSBpbXBsZW1lbnRlZAorICogUkVBTCBmdW5jdGlvbnMgOiAKKyAqIE5DUjUzODBfUkVBTF9ETUEgc2hvdWxkIGJlIGRlZmluZWQgaWYgcmVhbCBETUEgaXMgdG8gYmUgdXNlZC4KKyAqIE5vdGUgdGhhdCB0aGUgRE1BIHNldHVwIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgCisgKgl0aGF0IHRoZXkgd2VyZSBhYmxlIHRvIHByb2dyYW0gdGhlIGNvbnRyb2xsZXIgZm9yLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IGdlbmVyaWMgaTM4Ni9QQyB2ZXJzaW9ucyBvZiB0aGVzZSBtYWNyb3MgYXJlIAorICoJYXZhaWxhYmxlIGFzIE5DUjUzODBfaTM4Nl9kbWFfd3JpdGVfc2V0dXAsCisgKglOQ1I1MzgwX2kzODZfZG1hX3JlYWRfc2V0dXAsIGFuZCBOQ1I1MzgwX2kzODZfZG1hX3Jlc2lkdWFsLgorICoKKyAqIE5DUjUzODBfZG1hX3dyaXRlX3NldHVwKGluc3RhbmNlLCBzcmMsIGNvdW50KSAtIGluaXRpYWxpemUKKyAqIE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdGFuY2UsIGRzdCwgY291bnQpIC0gaW5pdGlhbGl6ZQorICogTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpOyAtIHJlc2lkdWFsIGNvdW50CisgKgorICogUFNFVURPIGZ1bmN0aW9ucyA6CisgKiBOQ1I1MzgwX3B3cml0ZShpbnN0YW5jZSwgc3JjLCBjb3VudCkKKyAqIE5DUjUzODBfcHJlYWQoaW5zdGFuY2UsIGRzdCwgY291bnQpOworICoKKyAqIElmIG5vdGhpbmcgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBkb2luZyAoaWUsIHdpdGggZXh0ZXJuYWwKKyAqIGhhcmR3YXJlKSwgeW91IG11c3QgYWxzbyBkZWZpbmUgCisgKiAgCisgKiBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQKKyAqIE5DUjUzODBfcmVzZXQKKyAqIE5DUjUzODBfYWJvcnQKKyAqIE5DUjUzODBfcHJvY19pbmZvCisgKgorICogdG8gYmUgdGhlIGdsb2JhbCBlbnRyeSBwb2ludHMgaW50byB0aGUgc3BlY2lmaWMgZHJpdmVyLCBpZSAKKyAqICNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIHQxMjhfcXVldWVfY29tbWFuZC4KKyAqCisgKiBJZiB0aGlzIGlzIG5vdCBkb25lLCB0aGUgcm91dGluZXMgd2lsbCBiZSBkZWZpbmVkIGFzIHN0YXRpYyBmdW5jdGlvbnMKKyAqIHdpdGggdGhlIE5DUjUzODAqIG5hbWVzIGFuZCB0aGUgdXNlciBtdXN0IHByb3ZpZGUgYSBnbG9iYWxseQorICogYWNjZXNzaWJsZSB3cmFwcGVyIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBnZW5lcmljIGRyaXZlciBpcyBpbml0aWFsaXplZCBieSBjYWxsaW5nIE5DUjUzODBfaW5pdChpbnN0YW5jZSksCisgKiBhZnRlciBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBob3N0IHNwZWNpZmljIGZpZWxkcyBhbmQgSUQuICBJZiB0aGUgCisgKiBkcml2ZXIgd2lzaGVzIHRvIGF1dG9wcm9iZSBmb3IgYW4gSVJRIGxpbmUsIHRoZSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwKKyAqIHBvc3NpYmxlKSBmdW5jdGlvbiBtYXkgYmUgdXNlZC4gIEJlZm9yZSB0aGUgc3BlY2lmaWMgZHJpdmVyIGluaXRpYWxpemF0aW9uCisgKiBjb2RlIGZpbmlzaGVzLCBOQ1I1MzgwX3ByaW50X29wdGlvbnMgc2hvdWxkIGJlIGNhbGxlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZmlyc3RfaW5zdGFuY2UgPSBOVUxMOworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSAqdGhlX3RlbXBsYXRlID0gTlVMTDsKKworLyogTWFjcm9zIGVhc2UgbGlmZS4uLiA6LSkgKi8KKyNkZWZpbmUJU0VUVVBfSE9TVERBVEEoaW4pCQkJCVwKKyAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPQkJCVwKKwkoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW4pLT5ob3N0ZGF0YQorI2RlZmluZQlIT1NUREFUQShpbikgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbiktPmhvc3RkYXRhKQorCisjZGVmaW5lCU5FWFQoY21kKQkoKFNjc2lfQ21uZCAqKSgoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lCU5FWFRBRERSKGNtZCkJKChTY3NpX0NtbmQgKiopJigoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisKKyNkZWZpbmUJSE9TVE5PCQlpbnN0YW5jZS0+aG9zdF9ubworI2RlZmluZQlIX05PKGNtZCkJKGNtZCktPmRldmljZS0+aG9zdC0+aG9zdF9ubworCisjaWZkZWYgU1VQUE9SVF9UQUdTCisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRhZ2dlZCBxdWV1aW5nCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogKytyb21hbiAoMDEvOTYpOiBOb3cgSSd2ZSBpbXBsZW1lbnRlZCBTQ1NJLTIgdGFnZ2VkIHF1ZXVpbmcuIFNvbWUgbm90ZXM6CisgKgorICogVXNpbmcgY29uc2VjdXRpdmUgbnVtYmVycyBmb3IgdGhlIHRhZ3MgaXMgbm8gZ29vZCBpZGVhIGluIG15IGV5ZXMuIFRoZXJlCisgKiBjb3VsZCBiZSB3cm9uZyByZS11c2luZ3MgaWYgdGhlIGNvdW50ZXIgKDggYml0ISkgd3JhcHMgYW5kIHNvbWUgZWFybHkKKyAqIGNvbW1hbmQgaGFzIGJlZW4gcHJlZW1wdGVkIGZvciBhIGxvbmcgdGltZS4gTXkgc29sdXRpb246IGEgYml0ZmllbGQgZm9yCisgKiByZW1lbWJlcmluZyB1c2VkIHRhZ3MuCisgKgorICogVGhlcmUncyBhbHNvIHRoZSBwcm9ibGVtIHRoYXQgZWFjaCB0YXJnZXQgaGFzIGEgY2VydGFpbiBxdWV1ZSBzaXplLCBidXQgd2UKKyAqIGNhbm5vdCBrbm93IGl0IGluIGFkdmFuY2UgOi0oIFdlIGp1c3Qgc2VlIGEgUVVFVUVfRlVMTCBzdGF0dXMgYmVpbmcKKyAqIHJldHVybmVkLiBTbywgaW4gdGhpcyBjYXNlLCB0aGUgZHJpdmVyIGludGVybmFsIHF1ZXVlIHNpemUgYXNzdW1wdGlvbiBpcworICogcmVkdWNlZCB0byB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0YWdzIGlmIFFVRVVFX0ZVTEwgaXMgcmV0dXJuZWQgYnkgdGhlCisgKiB0YXJnZXQuIFRoZSBjb21tYW5kIGlzIHJldHVybmVkIHRvIHRoZSBtaWQtbGV2ZWwsIGJ1dCB3aXRoIHN0YXR1cyBjaGFuZ2VkCisgKiB0byBCVVNZLCBzaW5jZSAtLWFzIEkndmUgc2Vlbi0tIHRoZSBtaWQtbGV2ZWwgY2FuJ3QgaGFuZGxlIFFVRVVFX0ZVTEwKKyAqIGNvcnJlY3RseS4KKyAqCisgKiBXZSdyZSBhbHNvIG5vdCBhbGxvd2VkIHJ1bm5pbmcgdGFnZ2VkIGNvbW1hbmRzIGFzIGxvbmcgYXMgYW4gdW50YWdnZWQKKyAqIGNvbW1hbmQgaXMgYWN0aXZlLiBBbmQgUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhZnRlciBhIGNvbnRpbmdlbnQgYWxsZWdpYW5jZQorICogY29uZGl0aW9uIF9tdXN0XyBiZSB1bnRhZ2dlZC4gVG8ga2VlcCB0cmFjayB3aGV0aGVyIGFuIHVudGFnZ2VkIGNvbW1hbmQgaGFzCisgKiBiZWVuIGlzc3VlZCwgdGhlIGhvc3QtPmJ1c3kgYXJyYXkgaXMgc3RpbGwgZW1wbG95ZWQsIGFzIGl0IGlzIHdpdGhvdXQKKyAqIHN1cHBvcnQgZm9yIHRhZ2dlZCBxdWV1aW5nLgorICoKKyAqIE9uZSBjb3VsZCBzdXNwZWN0IHRoYXQgdGhlcmUgYXJlIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuCisgKiBpc19sdW5fYnVzeSgpLCBjbWRfZ2V0X3RhZygpIGFuZCBjbWRfZnJlZV90YWcoKS4gQnV0IEkgdGhpbmsgdGhpcyBpc24ndCB0aGUKKyAqIGNhc2U6IGlzX2x1bl9idXN5KCkgYW5kIGNtZF9nZXRfdGFnKCkgYXJlIGJvdGggY2FsbGVkIGZyb20gTkNSNTM4MF9tYWluKCksCisgKiB3aGljaCBhbHJlYWR5IGd1YXJhbnRlZWQgdG8gYmUgcnVubmluZyBhdCBtb3N0IG9uY2UuIEl0IGlzIGFsc28gdGhlIG9ubHkKKyAqIHBsYWNlIHdoZXJlIHRhZ3MvTFVOcyBhcmUgYWxsb2NhdGVkLiBTbyBubyBvdGhlciBhbGxvY2F0aW9uIGNhbiBzbGlwCisgKiBiZXR3ZWVuIHRoYXQgcGFpciwgdGhlcmUgY291bGQgb25seSBoYXBwZW4gYSByZXNlbGVjdGlvbiwgd2hpY2ggY2FuIGZyZWUgYQorICogdGFnLCBidXQgdGhhdCBkb2Vzbid0IGh1cnQuIE9ubHkgdGhlIHNlcXVlbmNlIGluIGNtZF9mcmVlX3RhZygpIGJlY29tZXMKKyAqIGltcG9ydGFudDogdGhlIHRhZyBiaXQgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSAnbnJfYWxsb2NhdGVkJyBpcyBkZWNyZWFzZWQuCisgKi8KKworLyogLTEgZm9yIFRBR19OT05FIGlzIG5vdCBwb3NzaWJsZSB3aXRoIHVuc2lnbmVkIGNoYXIgY21kLT50YWcgKi8KKyN1bmRlZiBUQUdfTk9ORQorI2RlZmluZSBUQUdfTk9ORSAweGZmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBERUNMQVJFX0JJVE1BUChhbGxvY2F0ZWQsIE1BWF9UQUdTKTsKKyAgICBpbnQJCW5yX2FsbG9jYXRlZDsKKyAgICBpbnQJCXF1ZXVlX3NpemU7Cit9IFRBR19BTExPQzsKKworc3RhdGljIFRBR19BTExPQyBUYWdBbGxvY1s4XVs4XTsgLyogOCB0YXJnZXRzIGFuZCA4IExVTnMgKi8KKworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF90YWdzKCB2b2lkICkKK3sKKyAgICBpbnQgdGFyZ2V0LCBsdW47CisgICAgVEFHX0FMTE9DICp0YTsKKyAgICAKKyAgICBpZiAoIXNldHVwX3VzZV90YWdnZWRfcXVldWluZykKKwlyZXR1cm47CisgICAgCisgICAgZm9yKCB0YXJnZXQgPSAwOyB0YXJnZXQgPCA4OyArK3RhcmdldCApIHsKKwlmb3IoIGx1biA9IDA7IGx1biA8IDg7ICsrbHVuICkgeworCSAgICB0YSA9ICZUYWdBbGxvY1t0YXJnZXRdW2x1bl07CisJICAgIGJpdG1hcF96ZXJvKHRhLT5hbGxvY2F0ZWQsIE1BWF9UQUdTKTsKKwkgICAgdGEtPm5yX2FsbG9jYXRlZCA9IDA7CisJICAgIC8qIEF0IHRoZSBiZWdpbm5pbmcsIGFzc3VtZSB0aGUgbWF4aW11bSBxdWV1ZSBzaXplIHdlIGNvdWxkCisJICAgICAqIHN1cHBvcnQgKE1BWF9UQUdTKS4gVGhpcyB2YWx1ZSB3aWxsIGJlIGRlY3JlYXNlZCBpZiB0aGUgdGFyZ2V0CisJICAgICAqIHJldHVybnMgUVVFVUVfRlVMTCBzdGF0dXMuCisJICAgICAqLworCSAgICB0YS0+cXVldWVfc2l6ZSA9IE1BWF9UQUdTOworCX0KKyAgICB9Cit9CisKKworLyogQ2hlY2sgaWYgd2UgY2FuIGlzc3VlIGEgY29tbWFuZCB0byB0aGlzIExVTjogRmlyc3Qgc2VlIGlmIHRoZSBMVU4gaXMgbWFya2VkCisgKiBidXN5IGJ5IGFuIHVudGFnZ2VkIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIHNob3VsZCB1c2UgdGFnZ2VkIHF1ZXVpbmcsIGFsc28KKyAqIGNoZWNrIHRoYXQgdGhlcmUgaXMgYSBmcmVlIHRhZyBhbmQgdGhlIHRhcmdldCdzIHF1ZXVlIHdvbid0IG92ZXJmbG93LiBUaGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCB0byBhdm9pZCByYWNlCisgKiBjb25kaXRpb25zLgorICovIAorCitzdGF0aWMgaW50IGlzX2x1bl9idXN5KCBTY3NpX0NtbmQgKmNtZCwgaW50IHNob3VsZF9iZV90YWdnZWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIGlmIChob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpCisJcmV0dXJuKCAxICk7CisgICAgaWYgKCFzaG91bGRfYmVfdGFnZ2VkIHx8CisJIXNldHVwX3VzZV90YWdnZWRfcXVldWluZyB8fCAhY21kLT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJcmV0dXJuKCAwICk7CisgICAgaWYgKFRhZ0FsbG9jW2NtZC0+ZGV2aWNlLT5pZF1bY21kLT5kZXZpY2UtPmx1bl0ubnJfYWxsb2NhdGVkID49CisJVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXS5xdWV1ZV9zaXplICkgeworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQ6IG5vIGZyZWUgdGFnc1xuIiwKKwkJICAgIEhfTk8oY21kKSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuICk7CisJcmV0dXJuKCAxICk7CisgICAgfQorICAgIHJldHVybiggMCApOworfQorCisKKy8qIEFsbG9jYXRlIGEgdGFnIGZvciBhIGNvbW1hbmQgKHRoZXJlIGFyZSBubyBjaGVja3MgYW55bW9yZSwgY2hlY2tfbHVuX2J1c3koKQorICogbXVzdCBiZSBjYWxsZWQgYmVmb3JlISksIG9yIHJlc2VydmUgdGhlIExVTiBpbiAnYnVzeScgaWYgdGhlIGNvbW1hbmQgaXMKKyAqIHVudGFnZ2VkLgorICovCisKK3N0YXRpYyB2b2lkIGNtZF9nZXRfdGFnKCBTY3NpX0NtbmQgKmNtZCwgaW50IHNob3VsZF9iZV90YWdnZWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIC8qIElmIHdlIG9yIHRoZSB0YXJnZXQgZG9uJ3Qgc3VwcG9ydCB0YWdnZWQgcXVldWluZywgYWxsb2NhdGUgdGhlIExVTiBmb3IKKyAgICAgKiBhbiB1bnRhZ2dlZCBjb21tYW5kLgorICAgICAqLworICAgIGlmICghc2hvdWxkX2JlX3RhZ2dlZCB8fAorCSFzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgfHwgIWNtZC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CisJY21kLT50YWcgPSBUQUdfTk9ORTsKKwlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgbm93IGFsbG9jYXRlZCBieSB1bnRhZ2dlZCAiCisJCSAgICAiY29tbWFuZFxuIiwgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKyAgICB9CisgICAgZWxzZSB7CisJVEFHX0FMTE9DICp0YSA9ICZUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCisJY21kLT50YWcgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCB0YS0+YWxsb2NhdGVkLCBNQVhfVEFHUyApOworCXNldF9iaXQoIGNtZC0+dGFnLCB0YS0+YWxsb2NhdGVkICk7CisJdGEtPm5yX2FsbG9jYXRlZCsrOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHVzaW5nIHRhZyAlZCBmb3IgdGFyZ2V0ICVkIGx1biAlZCAiCisJCSAgICAiKG5vdyAlZCB0YWdzIGluIHVzZSlcbiIsCisJCSAgICBIX05PKGNtZCksIGNtZC0+dGFnLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCSAgICB0YS0+bnJfYWxsb2NhdGVkICk7CisgICAgfQorfQorCisKKy8qIE1hcmsgdGhlIHRhZyBvZiBjb21tYW5kICdjbWQnIGFzIGZyZWUsIG9yIGluIGNhc2Ugb2YgYW4gdW50YWdnZWQgY29tbWFuZCwKKyAqIHVubG9jayB0aGUgTFVOLgorICovCisKK3N0YXRpYyB2b2lkIGNtZF9mcmVlX3RhZyggU2NzaV9DbW5kICpjbWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIGlmIChjbWQtPnRhZyA9PSBUQUdfTk9ORSkgeworCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgdW50YWdnZWQgY21kIGZpbmlzaGVkXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY21kLT50YWcgPj0gTUFYX1RBR1MpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogdHJ5aW5nIHRvIGZyZWUgYmFkIHRhZyAlZCFcbiIsCisJCUhfTk8oY21kKSwgY21kLT50YWcgKTsKKyAgICB9CisgICAgZWxzZSB7CisJVEFHX0FMTE9DICp0YSA9ICZUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCWNsZWFyX2JpdCggY21kLT50YWcsIHRhLT5hbGxvY2F0ZWQgKTsKKwl0YS0+bnJfYWxsb2NhdGVkLS07CisJVEFHX1BSSU5USyggInNjc2klZDogZnJlZWQgdGFnICVkIGZvciB0YXJnZXQgJWQgbHVuICVkXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPnRhZywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfYWxsX3RhZ3MoIHZvaWQgKQoreworICAgIGludCB0YXJnZXQsIGx1bjsKKyAgICBUQUdfQUxMT0MgKnRhOworCisgICAgaWYgKCFzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcpCisJcmV0dXJuOworICAgIAorICAgIGZvciggdGFyZ2V0ID0gMDsgdGFyZ2V0IDwgODsgKyt0YXJnZXQgKSB7CisJZm9yKCBsdW4gPSAwOyBsdW4gPCA4OyArK2x1biApIHsKKwkgICAgdGEgPSAmVGFnQWxsb2NbdGFyZ2V0XVtsdW5dOworCSAgICBiaXRtYXBfemVybyh0YS0+YWxsb2NhdGVkLCBNQVhfVEFHUyk7CisJICAgIHRhLT5ucl9hbGxvY2F0ZWQgPSAwOworCX0KKyAgICB9Cit9CisKKyNlbmRpZiAvKiBTVVBQT1JUX1RBR1MgKi8KKworCisvKgorICogRnVuY3Rpb246IHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBTY3NpX0NtbmQgKmNtZCApCisgKgorICogUHVycG9zZTogVHJ5IHRvIG1lcmdlIHNldmVyYWwgc2NhdHRlci1nYXRoZXIgcmVxdWVzdHMgaW50byBvbmUgRE1BCisgKiAgICB0cmFuc2Zlci4gVGhpcyBpcyBwb3NzaWJsZSBpZiB0aGUgc2NhdHRlciBidWZmZXJzIGxpZSBvbgorICogICAgcGh5c2ljYWwgY29udGlndW91cyBhZGRyZXNzZXMuCisgKgorICogUGFyYW1ldGVyczogU2NzaV9DbW5kICpjbWQKKyAqICAgIFRoZSBjb21tYW5kIHRvIHdvcmsgb24uIFRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlcidzIGRhdGEgYXJlCisgKiAgICBhc3N1bWVkIHRvIGJlIGFscmVhZHkgdHJhbnNmZXJlZCBpbnRvIHB0ci90aGlzX3Jlc2lkdWFsLgorICovCisKK3N0YXRpYyB2b2lkIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggU2NzaV9DbW5kICpjbWQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgZW5kYWRkcjsKKyNpZiAoTkRFQlVHICYgTkRFQlVHX01FUkdJTkcpCisgICAgdW5zaWduZWQgbG9uZyBvbGRsZW4gPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworICAgIGludAkJICBjbnQgPSAxOworI2VuZGlmCisKKyAgICBmb3IgKGVuZGFkZHIgPSB2aXJ0X3RvX3BoeXMoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtIDEpICsgMTsKKwkgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCAmJgorCSB2aXJ0X3RvX3BoeXMocGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlclsxXS5wYWdlKSsKKwkJICAgICAgY21kLT5TQ3AuYnVmZmVyWzFdLm9mZnNldCkgPT0gZW5kYWRkcjsgKSB7CisJTUVSX1BSSU5USygiVlRPUCglcCkgPT0gJTA4bHggLT4gbWVyZ2luZ1xuIiwKKwkJICAgY21kLT5TQ3AuYnVmZmVyWzFdLmFkZHJlc3MsIGVuZGFkZHIpOworI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKwkrK2NudDsKKyNlbmRpZgorCSsrY21kLT5TQ3AuYnVmZmVyOworCS0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsICs9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCWVuZGFkZHIgKz0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisgICAgfQorI2lmIChOREVCVUcgJiBOREVCVUdfTUVSR0lORykKKyAgICBpZiAob2xkbGVuICE9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpCisJTUVSX1BSSU5USygibWVyZ2VkICVkIGJ1ZmZlcnMgZnJvbSAlcCwgbmV3IGxlbmd0aCAlMDh4XG4iLAorCQkgICBjbnQsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisjZW5kaWYKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBpbml0aWFsaXplX1NDcChTY3NpX0NtbmQgKmNtZCkKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVycyBmb3IgY21kIHRvIHBvaW50IHRvIHRoZSAKKyAqCXN0YXJ0IG9mIHRoZSBidWZmZXIuCisgKgorICogSW5wdXRzIDogY21kIC0gU2NzaV9DbW5kIHN0cnVjdHVyZSB0byBoYXZlIHBvaW50ZXJzIHJlc2V0LgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdGlhbGl6ZV9TQ3AoU2NzaV9DbW5kICpjbWQpCit7CisgICAgLyogCisgICAgICogSW5pdGlhbGl6ZSB0aGUgU2NzaSBQb2ludGVyIGZpZWxkIHNvIHRoYXQgYWxsIG9mIHRoZSBjb21tYW5kcyBpbiB0aGUgCisgICAgICogdmFyaW91cyBxdWV1ZXMgYXJlIHZhbGlkLgorICAgICAqLworCisgICAgaWYgKGNtZC0+dXNlX3NnKSB7CisJY21kLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPmJ1ZmZlcjsKKwljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCWNtZC0+U0NwLnB0ciA9IChjaGFyICopcGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlci0+cGFnZSkrCisJCSAgICAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJLyogKytyb21hbjogVHJ5IHRvIG1lcmdlIHNvbWUgc2NhdHRlci1idWZmZXJzIGlmIHRoZXkgYXJlIGF0CisJICogY29udGlndW91cyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJICovCisJbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBjbWQgKTsKKyAgICB9IGVsc2UgeworCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgfQorfQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2lmIE5ERUJVRworc3RhdGljIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBtYXNrOworICAgIGNvbnN0IGNoYXIgKiBuYW1lO30gCitzaWduYWxzW10gPSB7eyBTUl9EQlAsICJQQVJJVFkifSwgeyBTUl9SU1QsICJSU1QiIH0sIHsgU1JfQlNZLCAiQlNZIiB9LCAKKyAgICB7IFNSX1JFUSwgIlJFUSIgfSwgeyBTUl9NU0csICJNU0ciIH0sIHsgU1JfQ0QsICAiQ0QiIH0sIHsgU1JfSU8sICJJTyIgfSwgCisgICAgeyBTUl9TRUwsICJTRUwiIH0sIHswLCBOVUxMfX0sIAorYmFzcnNbXSA9IHt7QkFTUl9BVE4sICJBVE4ifSwge0JBU1JfQUNLLCAiQUNLIn0sIHswLCBOVUxMfX0sCitpY3JzW10gPSB7e0lDUl9BU1NFUlRfUlNULCAiQVNTRVJUIFJTVCJ9LHtJQ1JfQVNTRVJUX0FDSywgIkFTU0VSVCBBQ0sifSwKKyAgICB7SUNSX0FTU0VSVF9CU1ksICJBU1NFUlQgQlNZIn0sIHtJQ1JfQVNTRVJUX1NFTCwgIkFTU0VSVCBTRUwifSwgCisgICAge0lDUl9BU1NFUlRfQVROLCAiQVNTRVJUIEFUTiJ9LCB7SUNSX0FTU0VSVF9EQVRBLCAiQVNTRVJUIERBVEEifSwgCisgICAgezAsIE5VTEx9fSwKK21yc1tdID0ge3tNUl9CTE9DS19ETUFfTU9ERSwgIk1PREUgQkxPQ0sgRE1BIn0sIHtNUl9UQVJHRVQsICJNT0RFIFRBUkdFVCJ9LCAKKyAgICB7TVJfRU5BQkxFX1BBUl9DSEVDSywgIk1PREUgUEFSSVRZIENIRUNLIn0sIHtNUl9FTkFCTEVfUEFSX0lOVFIsIAorICAgICJNT0RFIFBBUklUWSBJTlRSIn0sIHtNUl9FTkFCTEVfRU9QX0lOVFIsIk1PREUgRU9QIElOVFIifSwKKyAgICB7TVJfTU9OSVRPUl9CU1ksICJNT0RFIE1PTklUT1IgQlNZIn0sCisgICAge01SX0RNQV9NT0RFLCAiTU9ERSBETUEifSwge01SX0FSQklUUkFURSwgIk1PREUgQVJCSVRSQVRJT04ifSwgCisgICAgezAsIE5VTEx9fTsKKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBwcmludCB0aGUgU0NTSSBidXMgc2lnbmFscyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgKgorICogSW5wdXQgOiBpbnN0YW5jZSAtIHdoaWNoIE5DUjUzODAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKSB7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXMsIGRhdGEsIGJhc3IsIG1yLCBpY3IsIGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBkYXRhID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisgICAgc3RhdHVzID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworICAgIG1yID0gTkNSNTM4MF9yZWFkKE1PREVfUkVHKTsKKyAgICBpY3IgPSBOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKTsKKyAgICBiYXNyID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHByaW50aygiU1RBVFVTX1JFRzogJTAyeCAiLCBzdGF0dXMpOworICAgIGZvciAoaSA9IDA7IHNpZ25hbHNbaV0ubWFzayA7ICsraSkgCisJaWYgKHN0YXR1cyAmIHNpZ25hbHNbaV0ubWFzaykKKwkgICAgcHJpbnRrKCIsJXMiLCBzaWduYWxzW2ldLm5hbWUpOworICAgIHByaW50aygiXG5CQVNSOiAlMDJ4ICIsIGJhc3IpOworICAgIGZvciAoaSA9IDA7IGJhc3JzW2ldLm1hc2sgOyArK2kpIAorCWlmIChiYXNyICYgYmFzcnNbaV0ubWFzaykKKwkgICAgcHJpbnRrKCIsJXMiLCBiYXNyc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuSUNSOiAlMDJ4ICIsIGljcik7CisgICAgZm9yIChpID0gMDsgaWNyc1tpXS5tYXNrOyArK2kpIAorCWlmIChpY3IgJiBpY3JzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgaWNyc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuTU9ERTogJTAyeCAiLCBtcik7CisgICAgZm9yIChpID0gMDsgbXJzW2ldLm1hc2s7ICsraSkgCisJaWYgKG1yICYgbXJzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgbXJzW2ldLm5hbWUpOworICAgIHByaW50aygiXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworfSBwaGFzZXNbXSA9IHsKKyAgICB7UEhBU0VfREFUQU9VVCwgIkRBVEFPVVQifSwge1BIQVNFX0RBVEFJTiwgIkRBVEFJTiJ9LCB7UEhBU0VfQ01ET1VULCAiQ01ET1VUIn0sCisgICAge1BIQVNFX1NUQVRJTiwgIlNUQVRJTiJ9LCB7UEhBU0VfTVNHT1VULCAiTVNHT1VUIn0sIHtQSEFTRV9NU0dJTiwgIk1TR0lOIn0sCisgICAge1BIQVNFX1VOS05PV04sICJVTktOT1dOIn19OworCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50X3BoYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBwcmludCB0aGUgY3VycmVudCBTQ1NJIHBoYXNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqCisgKiBJbnB1dCA6IGluc3RhbmNlIC0gd2hpY2ggTkNSNTM4MAorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcHJpbnRfcGhhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgICAgaW50IGk7CisKKyAgICBzdGF0dXMgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRyk7CisgICAgaWYgKCEoc3RhdHVzICYgU1JfUkVRKSkgCisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogUkVRIG5vdCBhc3NlcnRlZCwgcGhhc2UgdW5rbm93bi5cbiIsIEhPU1ROTyk7CisgICAgZWxzZSB7CisJZm9yIChpID0gMDsgKHBoYXNlc1tpXS52YWx1ZSAhPSBQSEFTRV9VTktOT1dOKSAmJiAKKwkgICAgKHBoYXNlc1tpXS52YWx1ZSAhPSAoc3RhdHVzICYgUEhBU0VfTUFTSykpOyArK2kpOyAKKwlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiBwaGFzZSAlc1xuIiwgSE9TVE5PLCBwaGFzZXNbaV0ubmFtZSk7CisgICAgfQorfQorCisjZWxzZSAvKiAhTkRFQlVHICovCisKKy8qIGR1bW1pZXMuLi4gKi8KK19faW5saW5lX18gdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKSB7IH07CitfX2lubGluZV9fIHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeyB9OworCisjZW5kaWYKKworLyoKKyAqICsrcm9tYW46IE5ldyBzY2hlbWUgb2YgY2FsbGluZyBOQ1I1MzgwX21haW4oKQorICogCisgKiBJZiB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0LCB3ZSBjYW4gY2FsbCBvdXIgbWFpbiBkaXJlY3RseSwgaXQgY2Fubm90IGJlCisgKiBhbHJlYWR5IHJ1bm5pbmcuIEVsc2UsIHdlIHF1ZXVlIGl0IG9uIGEgdGFzayBxdWV1ZSwgaWYgbm90ICdtYWluX3J1bm5pbmcnCisgKiB0ZWxscyB1cyB0aGF0IGEgbG93ZXIgbGV2ZWwgaXMgYWxyZWFkeSBleGVjdXRpbmcgaXQuIFRoaXMgd2F5LAorICogJ21haW5fcnVubmluZycgbmVlZHMgbm90IGJlIHByb3RlY3RlZCBpbiBhIHNwZWNpYWwgd2F5LgorICoKKyAqIHF1ZXVlX21haW4oKSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHB1dHRpbmcgb3VyIG1haW4gb250byB0aGUgdGFzaworICogcXVldWUsIGlmIG1haW5fcnVubmluZyBpcyBmYWxzZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZyb20gYQorICogaW50ZXJydXB0IG9yIGJvdHRvbSBoYWxmLgorICovCisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworc3RhdGljIHZvbGF0aWxlIGludCBtYWluX3J1bm5pbmcgPSAwOworc3RhdGljIERFQ0xBUkVfV09SSyhOQ1I1MzgwX3RxdWV1ZSwgKHZvaWQgKCopKHZvaWQqKSlOQ1I1MzgwX21haW4sIE5VTEwpOworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHF1ZXVlX21haW4odm9pZCkKK3sKKyAgICBpZiAoIW1haW5fcnVubmluZykgeworCS8qIElmIGluIGludGVycnVwdCBhbmQgTkNSNTM4MF9tYWluKCkgbm90IGFscmVhZHkgcnVubmluZywKKwkgICBxdWV1ZSBpdCBvbiB0aGUgJ2ltbWVkaWF0ZScgdGFzayBxdWV1ZSwgdG8gYmUgcHJvY2Vzc2VkCisJICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHByb2Nlc3NpbmcgaGFzCisJICAgZmluaXNoZWQuICovCisJc2NoZWR1bGVfd29yaygmTkNSNTM4MF90cXVldWUpOworICAgIH0KKyAgICAvKiBlbHNlOiBub3RoaW5nIHRvIGRvOiB0aGUgcnVubmluZyBOQ1I1MzgwX21haW4oKSB3aWxsIHBpY2sgdXAKKyAgICAgICBhbnkgbmV3bHkgcXVldWVkIGNvbW1hbmQuICovCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIE5DUjUzODBfYWxsX2luaXQgKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKyAgICBpZiAoIWRvbmUpIHsKKwlJTklfUFJJTlRLKCJzY3NpIDogTkNSNTM4MF9hbGxfaW5pdCgpXG4iKTsKKwlkb25lID0gMTsKKyAgICB9Cit9CisKKyAKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTgzODBfcHJpbnRfb3B0aW9ucyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IGNhbGxlZCBieSBwcm9iZSBjb2RlIGluZGljYXRpbmcgdGhlIE5DUjUzODAgZHJpdmVyCisgKgkgICAgIG9wdGlvbnMgdGhhdCB3ZXJlIHNlbGVjdGVkLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBwb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UuICBVbnVzZWQuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IE5DUjUzODBfcHJpbnRfb3B0aW9ucyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgcHJpbnRrKCIgZ2VuZXJpYyBvcHRpb25zIgorI2lmZGVmIEFVVE9TRU5TRSAKKyAgICAiIEFVVE9TRU5TRSIKKyNlbmRpZgorI2lmZGVmIFJFQUxfRE1BCisgICAgIiBSRUFMIERNQSIKKyNlbmRpZgorI2lmZGVmIFBBUklUWQorICAgICIgUEFSSVRZIgorI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgIiBTQ1NJLTIgVEFHR0VEIFFVRVVJTkciCisjZW5kaWYKKyAgICApOworICAgIHByaW50aygiIGdlbmVyaWMgcmVsZWFzZT0lZCIsIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfcHJpbnRfc3RhdHVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogcHJpbnQgY29tbWFuZHMgaW4gdGhlIHZhcmlvdXMgcXVldWVzLCBjYWxsZWQgZnJvbQorICoJTkNSNTM4MF9hYm9ydCBhbmQgTkNSNTM4MF9kZWJ1ZyB0byBhaWQgZGVidWdnaW5nLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBwb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UuICAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X3N0YXR1cyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgY2hhciAqcHJfYmZyOworICAgIGNoYXIgKnN0YXJ0OworICAgIGludCBsZW47CisKKyAgICBOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisgICAgTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19BTlkpOworCisgICAgcHJfYmZyID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworICAgIGlmICghcHJfYmZyKSB7CisJcHJpbnRrKCJOQ1I1MzgwX3ByaW50X3N0YXR1czogbm8gbWVtb3J5IGZvciBwcmludCBidWZmZXJcbiIpOworCXJldHVybjsKKyAgICB9CisgICAgbGVuID0gTkNSNTM4MF9wcm9jX2luZm8ocHJfYmZyLCAmc3RhcnQsIDAsIFBBR0VfU0laRSwgSE9TVE5PLCAwKTsKKyAgICBwcl9iZnJbbGVuXSA9IDA7CisgICAgcHJpbnRrKCJcbiVzXG4iLCBwcl9iZnIpOworICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcHJfYmZyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIC9wcm9jL3Njc2kvW2R0YyBwYXMxNiB0MTI4IGdlbmVyaWNdL1swLUFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEXQorICoKKyAqICpidWZmZXI6IEkvTyBidWZmZXIKKyAqICoqc3RhcnQ6IGlmIGlub3V0ID09IEZBTFNFIHBvaW50ZXIgaW50byBidWZmZXIgd2hlcmUgdXNlciByZWFkIHNob3VsZCBzdGFydAorICogb2Zmc2V0OiBjdXJyZW50IG9mZnNldAorICogbGVuZ3RoOiBsZW5ndGggb2YgYnVmZmVyCisgKiBob3N0bm86IFNjc2lfSG9zdCBob3N0X25vCisgKiBpbm91dDogVFJVRSAtIHVzZXIgaXMgd3JpdGluZzsgRkFMU0UgLSB1c2VyIGlzIHJlYWRpbmcKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gb3Igd3JpdHRlbgorKi8KKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihmbXQsYXJncy4uLikgXAorICBkbyB7IGlmIChwb3MgKyBzdHJsZW4oZm10KSArIDIwIC8qIHNsb3AgKi8gPCBidWZmZXIgKyBsZW5ndGgpIFwKKwkgcG9zICs9IHNwcmludGYocG9zLCBmbXQgLCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorc3RhdGljCitjaGFyICpscHJpbnRfU2NzaV9DbW5kIChTY3NpX0NtbmQgKmNtZCwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworCitzdGF0aWMKK2ludCBOQ1I1MzgwX3Byb2NfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgICAgICBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisgICAgY2hhciAqcG9zID0gYnVmZmVyOworICAgIHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YTsKKyAgICBTY3NpX0NtbmQgKnB0cjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIG9mZl90IGJlZ2luID0gMDsKKyNkZWZpbmUgY2hlY2tfb2Zmc2V0KCkJCQkJXAorICAgIGRvIHsJCQkJCVwKKwlpZiAocG9zIC0gYnVmZmVyIDwgb2Zmc2V0IC0gYmVnaW4pIHsJXAorCSAgICBiZWdpbiArPSBwb3MgLSBidWZmZXI7CQlcCisJICAgIHBvcyA9IGJ1ZmZlcjsJCQlcCisJfQkJCQkJXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBob3N0ZGF0YSA9IChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YTsKKworICAgIGlmIChpbm91dCkgeyAvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGUgPyAqLworCXJldHVybigtRU5PU1lTKTsgIC8qIEN1cnJlbnRseSB0aGlzIGlzIGEgbm8tb3AgKi8KKyAgICB9CisgICAgU1BSSU5URigiTkNSNTM4MCBjb3JlIHJlbGVhc2U9JWQuXG4iLCBOQ1I1MzgwX1BVQkxJQ19SRUxFQVNFKTsKKyAgICBjaGVja19vZmZzZXQoKTsKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgU1BSSU5URigiTkNSNTM4MDogY29yb3V0aW5lIGlzJXMgcnVubmluZy5cbiIsIG1haW5fcnVubmluZyA/ICIiIDogIm4ndCIpOworICAgIGNoZWNrX29mZnNldCgpOworICAgIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwlTUFJJTlRGKCJzY3NpJWQ6IG5vIGN1cnJlbnRseSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSE9TVE5PKTsKKyAgICBlbHNlCisJcG9zID0gbHByaW50X1Njc2lfQ21uZCAoKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkLAorCQkJCXBvcywgYnVmZmVyLCBsZW5ndGgpOworICAgIFNQUklOVEYoInNjc2klZDogaXNzdWVfcXVldWVcbiIsIEhPU1ROTyk7CisgICAgY2hlY2tfb2Zmc2V0KCk7CisgICAgZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgcHRyOyBwdHIgPSBORVhUKHB0cikpIHsKKwlwb3MgPSBscHJpbnRfU2NzaV9DbW5kIChwdHIsIHBvcywgYnVmZmVyLCBsZW5ndGgpOworCWNoZWNrX29mZnNldCgpOworICAgIH0KKworICAgIFNQUklOVEYoInNjc2klZDogZGlzY29ubmVjdGVkX3F1ZXVlXG4iLCBIT1NUTk8pOworICAgIGNoZWNrX29mZnNldCgpOworICAgIGZvciAocHRyID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOyBwdHI7CisJIHB0ciA9IE5FWFQocHRyKSkgeworCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKHB0ciwgcG9zLCBidWZmZXIsIGxlbmd0aCk7CisJY2hlY2tfb2Zmc2V0KCk7CisgICAgfQorCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgICpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CisgICAgaWYgKHBvcyAtIGJ1ZmZlciA8IG9mZnNldCAtIGJlZ2luKQorCXJldHVybiAwOworICAgIGVsc2UgaWYgKHBvcyAtIGJ1ZmZlciAtIChvZmZzZXQgLSBiZWdpbikgPCBsZW5ndGgpCisJcmV0dXJuIHBvcyAtIGJ1ZmZlciAtIChvZmZzZXQgLSBiZWdpbik7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGNoYXIgKgorbHByaW50X1Njc2lfQ21uZCAoU2NzaV9DbW5kICpjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpLCBzOworICAgIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQ7CisgICAgU1BSSU5URigic2NzaSVkOiBkZXN0aW5hdGlvbiB0YXJnZXQgJWQsIGx1biAlZFxuIiwKKwkgICAgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworICAgIFNQUklOVEYoIiAgICAgICAgY29tbWFuZCA9ICIpOworICAgIGNvbW1hbmQgPSBjbWQtPmNtbmQ7CisgICAgU1BSSU5URigiJTJkICgweCUwMngpIiwgY29tbWFuZFswXSwgY29tbWFuZFswXSk7CisgICAgZm9yIChpID0gMSwgcyA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsgaSA8IHM7ICsraSkKKwlTUFJJTlRGKCIgJTAyeCIsIGNvbW1hbmRbaV0pOworICAgIFNQUklOVEYoIlxuIik7CisgICAgcmV0dXJuIHBvczsKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBpbml0aWFsaXplcyAqaW5zdGFuY2UgYW5kIGNvcnJlc3BvbmRpbmcgNTM4MCBjaGlwLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFudGlhdGlvbiBvZiB0aGUgNTM4MCBkcml2ZXIuICAKKyAqCisgKiBOb3RlcyA6IEkgYXNzdW1lIHRoYXQgdGhlIGhvc3QsIGhvc3RubywgYW5kIGlkIGJpdHMgaGF2ZSBiZWVuCisgKiAJc2V0IGNvcnJlY3RseS4gIEkgZG9uJ3QgY2FyZSBhYm91dCB0aGUgaXJxIGFuZCBvdGhlciBmaWVsZHMuIAorICogCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX2luaXQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGk7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworCisgICAgTkNSNTM4MF9hbGxfaW5pdCgpOworCisgICAgaG9zdGRhdGEtPmFib3J0ZWQgPSAwOworICAgIGhvc3RkYXRhLT5pZF9tYXNrID0gMSA8PCBpbnN0YW5jZS0+dGhpc19pZDsKKyAgICBob3N0ZGF0YS0+aWRfaGlnaGVyX21hc2sgPSAwOworICAgIGZvciAoaSA9IGhvc3RkYXRhLT5pZF9tYXNrOyBpIDw9IDB4ODA7IGkgPDw9IDEpCisJaWYgKGkgPiBob3N0ZGF0YS0+aWRfbWFzaykKKwkgICAgaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrIHw9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwlob3N0ZGF0YS0+YnVzeVtpXSA9IDA7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgaW5pdF90YWdzKCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChSRUFMX0RNQSkKKyAgICBob3N0ZGF0YS0+ZG1hX2xlbiA9IDA7CisjZW5kaWYKKyAgICBob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ID0gMDsKKyAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKyAgICBob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBOVUxMOworICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworICAgIGhvc3RkYXRhLT5mbGFncyA9IEZMQUdfQ0hFQ0tfTEFTVF9CWVRFX1NFTlQ7CisKKyAgICBpZiAoIXRoZV90ZW1wbGF0ZSkgeworCXRoZV90ZW1wbGF0ZSA9IGluc3RhbmNlLT5ob3N0dDsKKwlmaXJzdF9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKwkKKworI2lmbmRlZiBBVVRPU0VOU0UKKyAgICBpZiAoKGluc3RhbmNlLT5jbWRfcGVyX2x1biA+IDEpIHx8IChpbnN0YW5jZS0+Y2FuX3F1ZXVlID4gMSkpCisJIHByaW50aygic2NzaSVkOiBXQVJOSU5HIDogc3VwcG9ydCBmb3IgbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgZW5hYmxlZFxuIgorCSAgICAgICAgIiAgICAgICAgd2l0aG91dCBBVVRPU0VOU0Ugb3B0aW9uLCBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9ucyBtYXlcbiIKKwkgICAgICAgICIgICAgICAgIGJlIGluY29ycmVjdGx5IGNsZWFyZWQuXG4iLCBIT1NUTk8pOworI2VuZGlmIC8qIGRlZiBBVVRPU0VOU0UgKi8KKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgCisgKgl2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKSAKKyAqCisgKiBQdXJwb3NlIDogIGVucXVldWVzIGEgU0NTSSBjb21tYW5kCisgKgorICogSW5wdXRzIDogY21kIC0gU0NTSSBjb21tYW5kLCBkb25lIC0gZnVuY3Rpb24gY2FsbGVkIG9uIGNvbXBsZXRpb24sIHdpdGgKKyAqCWEgcG9pbnRlciB0byB0aGUgY29tbWFuZCBkZXNjcmlwdG9yLgorICogCisgKiBSZXR1cm5zIDogMAorICoKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogICAgICBjbWQgaXMgYWRkZWQgdG8gdGhlIHBlciBpbnN0YW5jZSBpc3N1ZV9xdWV1ZSwgd2l0aCBtaW5vciAKKyAqCXR3aWRkbGluZyBkb25lIHRvIHRoZSBob3N0IHNwZWNpZmljIGZpZWxkcyBvZiBjbWQuICBJZiB0aGUgCisgKgltYWluIGNvcm91dGluZSBpcyBub3QgcnVubmluZywgaXQgaXMgcmVzdGFydGVkLgorICoKKyAqLworCitzdGF0aWMKK2ludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqY21kLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKyAgICBTY3NpX0NtbmQgKnRtcDsKKyAgICBpbnQgb2xkdG87CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBleHRlcm4gaW50IHVwZGF0ZV90aW1lb3V0KFNjc2lfQ21uZCAqIFNDc2V0LCBpbnQgdGltZW91dCk7CisKKyNpZiAoTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFKQorICAgIHN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisgICAgY2FzZSBXUklURV82OgorICAgIGNhc2UgV1JJVEVfMTA6CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IFdSSVRFIGF0dGVtcHRlZCB3aXRoIE5PX1dSSVRFIGRlYnVnZ2luZyBmbGFnIHNldFxuIiwKKwkgICAgICAgSF9OTyhjbWQpKTsKKwljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCWRvbmUoY21kKTsKKwlyZXR1cm4gMDsKKyAgICB9CisjZW5kaWYgLyogKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkgKi8KKworCisjaWZkZWYgTkNSNTM4MF9TVEFUUworIyBpZiAwCisgICAgaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkICYmICFob3N0ZGF0YS0+aXNzdWVfcXVldWUgJiYKKwkhaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSkgeworCWhvc3RkYXRhLT50aW1lYmFzZSA9IGppZmZpZXM7CisgICAgfQorIyBlbmRpZgorIyBpZmRlZiBOQ1I1MzgwX1NUQVRfTElNSVQKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPiBOQ1I1MzgwX1NUQVRfTElNSVQpCisjIGVuZGlmCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pCisJeworCSAgICBjYXNlIFdSSVRFOgorCSAgICBjYXNlIFdSSVRFXzY6CisJICAgIGNhc2UgV1JJVEVfMTA6CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQlob3N0ZGF0YS0+Ynl0ZXNfd3JpdGVbY21kLT5kZXZpY2UtPmlkXSArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJaG9zdGRhdGEtPnBlbmRpbmd3Kys7CisJCWJyZWFrOworCSAgICBjYXNlIFJFQUQ6CisJICAgIGNhc2UgUkVBRF82OgorCSAgICBjYXNlIFJFQURfMTA6CisJCWhvc3RkYXRhLT50aW1lX3JlYWRbY21kLT5kZXZpY2UtPmlkXSAtPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCWhvc3RkYXRhLT5ieXRlc19yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWhvc3RkYXRhLT5wZW5kaW5ncisrOworCQlicmVhazsKKwl9CisjZW5kaWYKKworICAgIC8qIAorICAgICAqIFdlIHVzZSB0aGUgaG9zdF9zY3JpYmJsZSBmaWVsZCBhcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgY29tbWFuZCAgCisgICAgICogaW4gYSBxdWV1ZSAKKyAgICAgKi8KKworICAgIE5FWFQoY21kKSA9IE5VTEw7CisgICAgY21kLT5zY3NpX2RvbmUgPSBkb25lOworCisgICAgY21kLT5yZXN1bHQgPSAwOworCisKKyAgICAvKiAKKyAgICAgKiBJbnNlcnQgdGhlIGNtZCBpbnRvIHRoZSBpc3N1ZSBxdWV1ZS4gTm90ZSB0aGF0IFJFUVVFU1QgU0VOU0UgCisgICAgICogY29tbWFuZHMgYXJlIGFkZGVkIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBzaW5jZSBhbnkgY29tbWFuZCB3aWxsCisgICAgICogY2xlYXIgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gdGhhdCBleGlzdHMgYW5kIHRoZSAKKyAgICAgKiBzZW5zZSBkYXRhIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCB3aGlsZSB0aGUgY29uZGl0aW9uIGV4aXN0cy4KKyAgICAgKi8KKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAvKiArK2d1ZW50aGVyOiBub3cgdGhhdCB0aGUgaXNzdWUgcXVldWUgaXMgYmVpbmcgc2V0IHVwLCB3ZSBjYW4gbG9jayBTVC1ETUEuCisgICAgICogT3RoZXJ3aXNlIGEgcnVubmluZyBOQ1I1MzgwX21haW4gbWF5IHN0ZWFsIHRoZSBsb2NrLgorICAgICAqIExvY2sgYmVmb3JlIGFjdHVhbGx5IGluc2VydGluZyBkdWUgdG8gZmFpcm5lc3MgcmVhc29ucyBleHBsYWluZWQgaW4KKyAgICAgKiBhdGFyaV9zY3NpLmMuIElmIHdlIGluc2VydCBmaXJzdCwgdGhlbiBpdCdzIGltcG9zc2libGUgZm9yIHRoaXMgZHJpdmVyCisgICAgICogdG8gcmVsZWFzZSB0aGUgbG9jay4KKyAgICAgKiBTdG9wIHRpbWVyIGZvciB0aGlzIGNvbW1hbmQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2ssIG9yIHRpbWVvdXRzCisgICAgICogbWF5IGhhcHBlbiAoYW5kIHRoZXkgcmVhbGx5IGRvKSwgYW5kIGl0J3Mgbm8gZ29vZCBpZiB0aGUgY29tbWFuZCBkb2Vzbid0CisgICAgICogYXBwZWFyIGluIGFueSBvZiB0aGUgcXVldWVzLgorICAgICAqICsrcm9tYW46IEp1c3QgZGlzYWJsaW5nIHRoZSBOQ1IgaW50ZXJydXB0IGlzbid0IHN1ZmZpY2llbnQgaGVyZSwKKyAgICAgKiBiZWNhdXNlIGFsc28gYSB0aW1lciBpbnQgY2FuIHRyaWdnZXIgYW4gYWJvcnQgb3IgcmVzZXQsIHdoaWNoIHdvdWxkCisgICAgICogYWx0ZXIgcXVldWVzIGFuZCB0b3VjaCB0aGUgbG9jay4KKyAgICAgKi8KKyAgICBpZiAoIUlTX0FfVFQoKSkgeworCW9sZHRvID0gdXBkYXRlX3RpbWVvdXQoY21kLCAwKTsKKwlmYWxjb25fZ2V0X2xvY2soKTsKKwl1cGRhdGVfdGltZW91dChjbWQsIG9sZHRvKTsKKyAgICB9CisgICAgaWYgKCEoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CisJTElTVChjbWQsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJTkVYVChjbWQpID0gaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IGNtZDsKKyAgICB9IGVsc2UgeworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkgICAgIE5FWFQodG1wKTsgdG1wID0gTkVYVCh0bXApKQorCSAgICA7CisJTElTVChjbWQsIHRtcCk7CisJTkVYVCh0bXApID0gY21kOworICAgIH0KKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICBRVV9QUklOVEsoInNjc2klZDogY29tbWFuZCBhZGRlZCB0byAlcyBvZiBxdWV1ZVxuIiwgSF9OTyhjbWQpLAorCSAgICAgIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgPyAiaGVhZCIgOiAidGFpbCIpOworCisgICAgLyogSWYgcXVldWVfY29tbWFuZCgpIGlzIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCAocmVhbCBvbmUgb3IgYm90dG9tCisgICAgICogaGFsZiksIHdlIGxldCBxdWV1ZV9tYWluKCkgZG8gdGhlIGpvYiBvZiB0YWtpbmcgY2FyZSBhYm91dCBtYWluLiBJZiBpdAorICAgICAqIGlzIGFscmVhZHkgcnVubmluZywgdGhpcyBpcyBhIG5vLW9wLCBlbHNlIG1haW4gd2lsbCBiZSBxdWV1ZWQuCisgICAgICoKKyAgICAgKiBJZiB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0LCB3ZSBjYW4gY2FsbCBOQ1I1MzgwX21haW4oKQorICAgICAqIHVuY29uZGl0aW9uYWxseSwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgYWxyZWFkeSBydW5uaW5nLgorICAgICAqLworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSB8fCAoKGZsYWdzID4+IDgpICYgNykgPj0gNikKKwlxdWV1ZV9tYWluKCk7CisgICAgZWxzZQorCU5DUjUzODBfbWFpbihOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogTkNSNTM4MF9tYWluICh2b2lkKSAKKyAqCisgKiBQdXJwb3NlIDogTkNSNTM4MF9tYWluIGlzIGEgY29yb3V0aW5lIHRoYXQgcnVucyBhcyBsb25nIGFzIG1vcmUgd29yayBjYW4gCisgKgliZSBkb25lIG9uIHRoZSBOQ1I1MzgwIGhvc3QgYWRhcHRlcnMgaW4gYSBzeXN0ZW0uICBCb3RoIAorICoJTkNSNTM4MF9xdWV1ZV9jb21tYW5kKCkgYW5kIE5DUjUzODBfaW50cigpIHdpbGwgdHJ5IHRvIHN0YXJ0IGl0IAorICoJaW4gY2FzZSBpdCBpcyBub3QgcnVubmluZy4KKyAqIAorICogTk9URSA6IE5DUjUzODBfbWFpbiBleGl0cyB3aXRoIGludGVycnVwdHMgKmRpc2FibGVkKiwgdGhlIGNhbGxlciBzaG91bGQgCisgKiAgcmVlbmFibGUgdGhlbS4gIFRoaXMgcHJldmVudHMgcmVlbnRyYW5jeSBhbmQga2VybmVsIHN0YWNrIG92ZXJmbG93LgorICovIAkKKyAgICAKK3N0YXRpYyB2b2lkIE5DUjUzODBfbWFpbiAodm9pZCAqYmwpCit7CisgICAgU2NzaV9DbW5kICp0bXAsICpwcmV2OworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gZmlyc3RfaW5zdGFuY2U7CisgICAgc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gSE9TVERBVEEoaW5zdGFuY2UpOworICAgIGludCBkb25lOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisgICAgLyoKKyAgICAgKiBXZSBydW4gKHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCkgdW50aWwgd2UncmUgc3VyZSB0aGF0IG5vbmUgb2YgCisgICAgICogdGhlIGhvc3QgYWRhcHRlcnMgaGF2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBkb25lLCBhdCB3aGljaCBwb2ludCAKKyAgICAgKiB3ZSBzZXQgbWFpbl9ydW5uaW5nIHRvIDAgYW5kIGV4aXQuCisgICAgICoKKyAgICAgKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGJlZm9yZSBkb2luZyB2YXJpb3VzIG90aGVyIGludGVybmFsIAorICAgICAqIGluc3RydWN0aW9ucywgYWZ0ZXIgd2UndmUgZGVjaWRlZCB0aGF0IHdlIG5lZWQgdG8gcnVuIHRocm91Z2gKKyAgICAgKiB0aGUgbG9vcCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIHRoaXMgc2hvdWxkIHByZXZlbnQgYW55IHJhY2UgY29uZGl0aW9ucy4KKyAgICAgKiAKKyAgICAgKiArK3JvbWFuOiBKdXN0IGRpc2FibGluZyB0aGUgTkNSIGludGVycnVwdCBpc24ndCBzdWZmaWNpZW50IGhlcmUsCisgICAgICogYmVjYXVzZSBhbHNvIGEgdGltZXIgaW50IGNhbiB0cmlnZ2VyIGFuIGFib3J0IG9yIHJlc2V0LCB3aGljaCBjYW4KKyAgICAgKiBhbHRlciBxdWV1ZXMgYW5kIHRvdWNoIHRoZSBGYWxjb24gbG9jay4KKyAgICAgKi8KKworICAgIC8qIFRlbGwgaW50IGhhbmRsZXJzIG1haW4oKSBpcyBub3cgYWxyZWFkeSBleGVjdXRpbmcuICBOb3RlIHRoYXQKKyAgICAgICBubyByYWNlcyBhcmUgcG9zc2libGUgaGVyZS4gSWYgYW4gaW50IGNvbWVzIGluIGJlZm9yZQorICAgICAgICdtYWluX3J1bm5pbmcnIGlzIHNldCBoZXJlLCBhbmQgcXVldWVzL2V4ZWN1dGVzIG1haW4gdmlhIHRoZQorICAgICAgIHRhc2sgcXVldWUsIGl0IGRvZXNuJ3QgZG8gYW55IGhhcm0sIGp1c3QgdGhpcyBpbnN0YW5jZSBvZiBtYWluCisgICAgICAgd29uJ3QgZmluZCBhbnkgd29yayBsZWZ0IHRvIGRvLiAqLworICAgIGlmIChtYWluX3J1bm5pbmcpCisgICAgCXJldHVybjsKKyAgICBtYWluX3J1bm5pbmcgPSAxOworCisgICAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisgICAgZG8geworCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIEZyZWV6ZSByZXF1ZXN0IHF1ZXVlcyAqLworCWRvbmUgPSAxOworCQorCWlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCSAgICBNQUlOX1BSSU5USyggInNjc2klZDogbm90IGNvbm5lY3RlZFxuIiwgSE9TVE5PICk7CisJICAgIC8qCisJICAgICAqIFNlYXJjaCB0aHJvdWdoIHRoZSBpc3N1ZV9xdWV1ZSBmb3IgYSBjb21tYW5kIGRlc3RpbmVkCisJICAgICAqIGZvciBhIHRhcmdldCB0aGF0J3Mgbm90IGJ1c3kuCisJICAgICAqLworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisJICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIHByZXYgPSBOVUxMOworCQkgdG1wICYmICh0bXAgIT0gcHJldik7IHByZXYgPSB0bXAsIHRtcCA9IE5FWFQodG1wKSkKKwkJOworCQkvKnByaW50aygiJXAgICIsIHRtcCk7Ki8KKwkgICAgaWYgKCh0bXAgPT0gcHJldikgJiYgdG1wKSBwcmludGsoIiBMT09QXG4iKTsvKiBlbHNlIHByaW50aygiXG4iKTsqLworI2VuZGlmCisJICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIAorCQkgcHJldiA9IE5VTEw7IHRtcDsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApICkgeworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKKwkJaWYgKHByZXYgIT0gdG1wKQorCQkgICAgcHJpbnRrKCJNQUlOIHRtcD0lcCAgIHRhcmdldD0lZCAgIGJ1c3k9JWQgbHVuPSVkXG4iLAorCQkJICAgdG1wLCB0bXAtPmRldmljZS0+aWQsIGhvc3RkYXRhLT5idXN5W3RtcC0+ZGV2aWNlLT5pZF0sCisJCQkgICB0bXAtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkvKiAgV2hlbiB3ZSBmaW5kIG9uZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGlzc3VlIHF1ZXVlLiAqLworCQkvKiArK2d1ZW50aGVyOiBwb3NzaWJsZSByYWNlIHdpdGggRmFsY29uIGxvY2tpbmcgKi8KKwkJaWYgKAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgIWlzX2x1bl9idXN5KCB0bXAsIHRtcC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKQorI2Vsc2UKKwkJICAgICEoaG9zdGRhdGEtPmJ1c3lbdG1wLT5kZXZpY2UtPmlkXSAmICgxIDw8IHRtcC0+ZGV2aWNlLT5sdW4pKQorI2VuZGlmCisJCSAgICApIHsKKwkJICAgIC8qICsrZ3VlbnRoZXI6IGp1c3QgdG8gYmUgc3VyZSwgdGhpcyBtdXN0IGJlIGF0b21pYyAqLworCQkgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJICAgIGlmIChwcmV2KSB7CisJCSAgICAgICAgUkVNT1ZFKHByZXYsIE5FWFQocHJldiksIHRtcCwgTkVYVCh0bXApKTsKKwkJCU5FWFQocHJldikgPSBORVhUKHRtcCk7CisJCSAgICB9IGVsc2UgeworCQkgICAgICAgIFJFTU9WRSgtMSwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlLCB0bXAsIE5FWFQodG1wKSk7CisJCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBORVhUKHRtcCk7CisJCSAgICB9CisJCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgZmFsY29uX2RvbnRfcmVsZWFzZSsrOworCQkgICAgCisJCSAgICAvKiByZWVuYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGZpbmRpbmcgb25lICovCisJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICAKKwkJICAgIC8qIAorCQkgICAgICogQXR0ZW1wdCB0byBlc3RhYmxpc2ggYW4gSV9UX0wgbmV4dXMgaGVyZS4gCisJCSAgICAgKiBPbiBzdWNjZXNzLCBpbnN0YW5jZS0+aG9zdGRhdGEtPmNvbm5lY3RlZCBpcyBzZXQuCisJCSAgICAgKiBPbiBmYWlsdXJlLCB3ZSBtdXN0IGFkZCB0aGUgY29tbWFuZCBiYWNrIHRvIHRoZQorCQkgICAgICogICBpc3N1ZSBxdWV1ZSBzbyB3ZSBjYW4ga2VlcCB0cnlpbmcuCQorCQkgICAgICovCisJCSAgICBNQUlOX1BSSU5USygic2NzaSVkOiBtYWluKCk6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCAiCisJCQkJImx1biAlZCByZW1vdmVkIGZyb20gaXNzdWVfcXVldWVcbiIsCisJCQkJSE9TVE5PLCB0bXAtPmRldmljZS0+aWQsIHRtcC0+ZGV2aWNlLT5sdW4pOworCQkgICAgLyogCisJCSAgICAgKiBSRVFVRVNUIFNFTlNFIGNvbW1hbmRzIGFyZSBpc3N1ZWQgd2l0aG91dCB0YWdnZWQKKwkJICAgICAqIHF1ZXVlaW5nLCBldmVuIG9uIFNDU0ktSUkgZGV2aWNlcyBiZWNhdXNlIHRoZSAKKwkJICAgICAqIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gZXhpc3RzIGZvciB0aGUgCisJCSAgICAgKiBlbnRpcmUgdW5pdC4KKwkJICAgICAqLworCQkgICAgLyogKytyb21hbjogLi4uYW5kIHRoZSBzdGFuZGFyZCBhbHNvIHJlcXVpcmVzIHRoYXQKKwkJICAgICAqIFJFUVVFU1QgU0VOU0UgY29tbWFuZCBhcmUgdW50YWdnZWQuCisJCSAgICAgKi8KKwkJICAgIAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2dldF90YWcoIHRtcCwgdG1wLT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgKTsKKyNlbmRpZgorCQkgICAgaWYgKCFOQ1I1MzgwX3NlbGVjdChpbnN0YW5jZSwgdG1wLCAKKwkJCSAgICAodG1wLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpID8gVEFHX05PTkUgOiAKKwkJCSAgICBUQUdfTkVYVCkpIHsKKwkJCWZhbGNvbl9kb250X3JlbGVhc2UtLTsKKwkJCS8qIHJlbGVhc2UgaWYgdGFyZ2V0IGRpZCBub3QgcmVzcG9uc2UhICovCisJCQlmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBob3N0ZGF0YSApOworCQkJYnJlYWs7CisJCSAgICB9IGVsc2UgeworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCUxJU1QodG1wLCBob3N0ZGF0YS0+aXNzdWVfcXVldWUpOworCQkJTkVYVCh0bXApID0gaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCQkJaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gdG1wOworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkJY21kX2ZyZWVfdGFnKCB0bXAgKTsKKyNlbmRpZgorCQkJZmFsY29uX2RvbnRfcmVsZWFzZS0tOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJTUFJTl9QUklOVEsoInNjc2klZDogbWFpbigpOiBzZWxlY3QoKSBmYWlsZWQsICIKKwkJCQkgICAgInJldHVybmVkIHRvIGlzc3VlX3F1ZXVlXG4iLCBIT1NUTk8pOworCQkJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpCisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCX0gLyogaWYgdGFyZ2V0L2x1bi90YXJnZXQgcXVldWUgaXMgbm90IGJ1c3kgKi8KKwkgICAgfSAvKiBmb3IgaXNzdWVfcXVldWUgKi8KKwl9IC8qIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkgKi8KKwkJCisJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgCisjaWZkZWYgUkVBTF9ETUEKKwkgICAgJiYgIWhvc3RkYXRhLT5kbWFfbGVuCisjZW5kaWYKKwkgICAgKSB7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgTUFJTl9QUklOVEsoInNjc2klZDogbWFpbjogcGVyZm9ybWluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlclxuIiwKKwkJCUhPU1ROTyk7CisJICAgIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIoaW5zdGFuY2UpOworCSAgICBNQUlOX1BSSU5USygic2NzaSVkOiBtYWluOiBkb25lIHNldCBmYWxzZVxuIiwgSE9TVE5PKTsKKwkgICAgZG9uZSA9IDA7CisJfQorICAgIH0gd2hpbGUgKCFkb25lKTsKKworICAgIC8qIEJldHRlciBhbGxvdyBpbnRzIF9hZnRlcl8gJ21haW5fcnVubmluZycgaGFzIGJlZW4gY2xlYXJlZCwgZWxzZQorICAgICAgIGFuIGludGVycnVwdCBjb3VsZCBiZWxpZXZlIHdlJ2xsIHBpY2sgdXAgdGhlIHdvcmsgaXQgbGVmdCBmb3IKKyAgICAgICB1cywgYnV0IHdlIHdvbid0IHNlZSBpdCBhbnltb3JlIGhlcmUuLi4gKi8KKyAgICBtYWluX3J1bm5pbmcgPSAwOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisjaWZkZWYgUkVBTF9ETUEKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9kbWFfY29tcGxldGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBDYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBETUEgZmluaXNoZXMgb3IgYSBwaGFzZQorICoJbWlzbWF0Y2ggb2NjdXJzICh3aGljaCB3b3VsZCBmaW5pc2ggdGhlIERNQSB0cmFuc2ZlcikuICAKKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfZG1hX2NvbXBsZXRlKCBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSApCit7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworICAgIGludCAgICAgICAgICAgdHJhbnNmZXJlZCwgc2F2ZWRfZGF0YSA9IDAsIG92ZXJydW4gPSAwLCBjbnQsIHRvUElPOworICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBwOworICAgIHZvbGF0aWxlIGludCAgKmNvdW50OworCisgICAgaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiByZWNlaXZlZCBlbmQgb2YgRE1BIGludGVycnVwdCB3aXRoICIKKwkgICAgICAgIm5vIGNvbm5lY3RlZCBjbWRcbiIsIEhPU1ROTyk7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoYXRhcmlfcmVhZF9vdmVycnVucykgeworCXAgPSBob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AucGhhc2U7CisJaWYgKHAgJiBTUl9JTykgeworCSAgICB1ZGVsYXkoMTApOworCSAgICBpZiAoKCgoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykpICYKKwkJICAoQkFTUl9QSEFTRV9NQVRDSHxCQVNSX0FDSykpID09CisJCSAoQkFTUl9QSEFTRV9NQVRDSHxCQVNSX0FDSykpKSB7CisJCXNhdmVkX2RhdGEgPSBOQ1I1MzgwX3JlYWQoSU5QVVRfREFUQV9SRUcpOworCQlvdmVycnVuID0gMTsKKwkJRE1BX1BSSU5USygic2NzaSVkOiByZWFkIG92ZXJydW4gaGFuZGxlZFxuIiwgSE9TVE5PKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBETUFfUFJJTlRLKCJzY3NpJWQ6IHJlYWwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlLCBiYXNyIDB4JVgsIHNyIDB4JVhcbiIsCisJICAgICAgIEhPU1ROTywgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyksCisJICAgICAgIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisKKyAgICAodm9pZCkgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisgICAgdHJhbnNmZXJlZCA9IGhvc3RkYXRhLT5kbWFfbGVuIC0gTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpOworICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKikgJihob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AucHRyKTsKKyAgICBjb3VudCA9ICYoaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgICpkYXRhICs9IHRyYW5zZmVyZWQ7CisgICAgKmNvdW50IC09IHRyYW5zZmVyZWQ7CisKKyAgICBpZiAoYXRhcmlfcmVhZF9vdmVycnVucykgeworCWlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgUEhBU0VfTUFTSykgPT0gcCAmJiAocCAmIFNSX0lPKSkgeworCSAgICBjbnQgPSB0b1BJTyA9IGF0YXJpX3JlYWRfb3ZlcnJ1bnM7CisJICAgIGlmIChvdmVycnVuKSB7CisJCURNQV9QUklOVEsoIkdvdCBhbiBpbnB1dCBvdmVycnVuLCB1c2luZyBzYXZlZCBieXRlXG4iKTsKKwkJKigqZGF0YSkrKyA9IHNhdmVkX2RhdGE7CisJCSgqY291bnQpLS07CisJCWNudC0tOworCQl0b1BJTy0tOworCSAgICB9CisJICAgIERNQV9QUklOVEsoIkRvaW5nICVkLWJ5dGUgUElPIHRvIDB4JTA4bHhcbiIsIGNudCwgKGxvbmcpKmRhdGEpOworCSAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnAsICZjbnQsIGRhdGEpOworCSAgICAqY291bnQgLT0gdG9QSU8gLSBjbnQ7CisJfQorICAgIH0KK30KKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCisKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9pbnRyIChpbnQgaXJxKQorICogCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMsIHJlZXN0YWJsaXNoaW5nIElfVF9MIG9yIElfVF9MX1EgbmV4dXNlcworICoJZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLCBhbmQgcmVzdGFydGluZyBOQ1I1MzgwX21haW4oKSAKKyAqCWFzIHJlcXVpcmVkLgorICoKKyAqIElucHV0cyA6IGludCBpcnEsIGlycSB0aGF0IGNhdXNlZCB0aGlzIGludGVycnVwdC4KKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGZpcnN0X2luc3RhbmNlOworICAgIGludCBkb25lID0gMSwgaGFuZGxlZCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBiYXNyOworCisgICAgSU5UX1BSSU5USygic2NzaSVkOiBOQ1I1MzgwIGlycSB0cmlnZ2VyZWRcbiIsIEhPU1ROTyk7CisKKyAgICAvKiBMb29rIGZvciBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgICBiYXNyID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyk7CisgICAgSU5UX1BSSU5USygic2NzaSVkOiBCQVNSPSUwMnhcbiIsIEhPU1ROTywgYmFzcik7CisgICAgLyogZGlzcGF0Y2ggdG8gYXBwcm9wcmlhdGUgcm91dGluZSBpZiBmb3VuZCBhbmQgZG9uZT0wICovCisgICAgaWYgKGJhc3IgJiBCQVNSX0lSUSkgeworCU5DUl9QUklOVChOREVCVUdfSU5UUik7CisJaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMfFNSX0lPKSkgPT0gKFNSX1NFTHxTUl9JTykpIHsKKwkgICAgZG9uZSA9IDA7CisJICAgIEVOQUJMRV9JUlEoKTsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBTRUwgaW50ZXJydXB0XG4iLCBIT1NUTk8pOworCSAgICBOQ1I1MzgwX3Jlc2VsZWN0KGluc3RhbmNlKTsKKwkgICAgKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJfQorCWVsc2UgaWYgKGJhc3IgJiBCQVNSX1BBUklUWV9FUlJPUikgeworCSAgICBJTlRfUFJJTlRLKCJzY3NpJWQ6IFBBUklUWSBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJICAgICh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCX0KKwllbHNlIGlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUlNUKSA9PSBTUl9SU1QpIHsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBSRVNFVCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJICAgICh2b2lkKU5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJfQorCWVsc2UgeworCSAgICAvKiAgCisJICAgICAqIFRoZSByZXN0IG9mIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9ucyBjYW4gb2NjdXIgb25seSBkdXJpbmcgYQorCSAgICAgKiBETUEgdHJhbnNmZXIKKwkgICAgICovCisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorCSAgICAvKgorCSAgICAgKiBXZSBzaG91bGQgb25seSBnZXQgUEhBU0UgTUlTTUFUQ0ggYW5kIEVPUCBpbnRlcnJ1cHRzIGlmIHdlIGhhdmUKKwkgICAgICogRE1BIGVuYWJsZWQsIHNvIGRvIGEgc2FuaXR5IGNoZWNrIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNldHRpbmcKKwkgICAgICogb2YgdGhlIE1PREUgcmVnaXN0ZXIuCisJICAgICAqLworCisJICAgIGlmICgoTkNSNTM4MF9yZWFkKE1PREVfUkVHKSAmIE1SX0RNQV9NT0RFKSAmJgorCQkoKGJhc3IgJiBCQVNSX0VORF9ETUFfVFJBTlNGRVIpIHx8IAorCQkgIShiYXNyICYgQkFTUl9QSEFTRV9NQVRDSCkpKSB7CisJCSAgICAKKwkJSU5UX1BSSU5USygic2NzaSVkOiBQSEFTRSBNSVNNIG9yIEVPUCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJCU5DUjUzODBfZG1hX2NvbXBsZXRlKCBpbnN0YW5jZSApOworCQlkb25lID0gMDsKKwkJRU5BQkxFX0lSUSgpOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCSAgICB7CisvKiBNUzogSWdub3JlIHVua25vd24gcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0cyAoY2F1c2VkIGJ5IEVPUCBpbnRlcnJ1cHQpICovCisJCWlmIChiYXNyICYgQkFTUl9QSEFTRV9NQVRDSCkKKwkJICAgIHByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiB1bmtub3duIGludGVycnVwdCwgIgorCQkJICAgIkJBU1IgMHgleCwgTVIgMHgleCwgU1IgMHgleFxuIiwKKwkJCSAgIEhPU1ROTywgYmFzciwgTkNSNTM4MF9yZWFkKE1PREVfUkVHKSwKKwkJCSAgIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCSAgICB9CisJfSAvKiBpZiAhKFNFTEVDVElPTiB8fCBQQVJJVFkpICovCisJaGFuZGxlZCA9IDE7CisgICAgfSAvKiBCQVNSICYgSVJRICovCisgICAgZWxzZSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGludGVycnVwdCB3aXRob3V0IElSUSBiaXQgc2V0IGluIEJBU1IsICIKKwkgICAgICAgIkJBU1IgMHglWCwgTVIgMHglWCwgU1IgMHgleFxuIiwgSE9TVE5PLCBiYXNyLAorCSAgICAgICBOQ1I1MzgwX3JlYWQoTU9ERV9SRUcpLCBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpOworCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworICAgIH0KKyAgICAKKyAgICBpZiAoIWRvbmUpIHsKKwlJTlRfUFJJTlRLKCJzY3NpJWQ6IGluIGludCByb3V0aW5lLCBjYWxsaW5nIG1haW5cbiIsIEhPU1ROTyk7CisJLyogUHV0IGEgY2FsbCB0byBOQ1I1MzgwX21haW4oKSBvbiB0aGUgcXVldWUuLi4gKi8KKwlxdWV1ZV9tYWluKCk7CisgICAgfQorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgTkNSNTM4MF9TVEFUUworc3RhdGljIHZvaWQgY29sbGVjdF9zdGF0cyhzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSogaG9zdGRhdGEsIFNjc2lfQ21uZCogY21kKQoreworIyBpZmRlZiBOQ1I1MzgwX1NUQVRfTElNSVQKKyAgICBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPiBOQ1I1MzgwX1NUQVRfTElNSVQpCisjIGVuZGlmCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pCisJeworCSAgICBjYXNlIFdSSVRFOgorCSAgICBjYXNlIFdSSVRFXzY6CisJICAgIGNhc2UgV1JJVEVfMTA6CisJCWhvc3RkYXRhLT50aW1lX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkvKmhvc3RkYXRhLT5ieXRlc193cml0ZVtjbWQtPmRldmljZS0+aWRdICs9IGNtZC0+cmVxdWVzdF9idWZmbGVuOyovCisJCWhvc3RkYXRhLT5wZW5kaW5ndy0tOworCQlicmVhazsKKwkgICAgY2FzZSBSRUFEOgorCSAgICBjYXNlIFJFQURfNjoKKwkgICAgY2FzZSBSRUFEXzEwOgorCQlob3N0ZGF0YS0+dGltZV9yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQkvKmhvc3RkYXRhLT5ieXRlc19yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ki8KKwkJaG9zdGRhdGEtPnBlbmRpbmdyLS07CisJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIAorICoJaW50IHRhZyk7CisgKgorICogUHVycG9zZSA6IGVzdGFibGlzaGVzIElfVF9MIG9yIElfVF9MX1EgbmV4dXMgZm9yIG5ldyBvciBleGlzdGluZyBjb21tYW5kLAorICoJaW5jbHVkaW5nIEFSQklUUkFUSU9OLCBTRUxFQ1RJT04sIGFuZCBpbml0aWFsIG1lc3NhZ2Ugb3V0IGZvciAKKyAqCUlERU5USUZZIGFuZCBxdWV1ZSBtZXNzYWdlcy4gCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW50aWF0aW9uIG9mIHRoZSA1MzgwIGRyaXZlciBvbiB3aGljaCB0aGlzIAorICogCXRhcmdldCBsaXZlcywgY21kIC0gU0NTSSBjb21tYW5kIHRvIGV4ZWN1dGUsIHRhZyAtIHNldCB0byBUQUdfTkVYVCBmb3IgCisgKgluZXcgdGFnLCBUQUdfTk9ORSBmb3IgdW50YWdnZWQgcXVldWVpbmcsIG90aGVyd2lzZSBzZXQgdG8gdGhlIHRhZyBmb3IgCisgKgl0aGUgY29tbWFuZCB0aGF0IGlzIHByZXNlbnRseSBjb25uZWN0ZWQuCisgKiAKKyAqIFJldHVybnMgOiAtMSBpZiBzZWxlY3Rpb24gY291bGQgbm90IGV4ZWN1dGUgZm9yIHNvbWUgcmVhc29uLAorICoJMCBpZiBzZWxlY3Rpb24gc3VjY2VlZGVkIG9yIGZhaWxlZCBiZWNhdXNlIHRoZSB0YXJnZXQgCisgKiAJZGlkIG5vdCByZXNwb25kLgorICoKKyAqIFNpZGUgZWZmZWN0cyA6IAorICogCUlmIGJ1cyBidXN5LCBhcmJpdHJhdGlvbiBmYWlsZWQsIGV0YywgTkNSNTM4MF9zZWxlY3QoKSB3aWxsIGV4aXQgCisgKgkJd2l0aCByZWdpc3RlcnMgYXMgdGhleSBzaG91bGQgaGF2ZSBiZWVuIG9uIGVudHJ5IC0gaWUKKyAqCQlTRUxFQ1RfRU5BQkxFIHdpbGwgYmUgc2V0IGFwcHJvcHJpYXRlbHksIHRoZSBOQ1I1MzgwCisgKgkJd2lsbCBjZWFzZSB0byBkcml2ZSBhbnkgU0NTSSBidXMgc2lnbmFscy4KKyAqCisgKglJZiBzdWNjZXNzZnVsIDogSV9UX0wgb3IgSV9UX0xfUSBuZXh1cyB3aWxsIGJlIGVzdGFibGlzaGVkLCAKKyAqCQlpbnN0YW5jZS0+Y29ubmVjdGVkIHdpbGwgYmUgc2V0IHRvIGNtZC4gIAorICogCQlTRUxFQ1QgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQuCisgKgorICoJSWYgZmFpbGVkIChubyB0YXJnZXQpIDogY21kLT5zY3NpX2RvbmUoKSB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSAKKyAqCQljbWQtPnJlc3VsdCBob3N0IGJ5dGUgc2V0IHRvIERJRF9CQURfVEFSR0VULgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9zZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKmNtZCwgaW50IHRhZykKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgY2hhciB0bXBbM10sIHBoYXNlOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgaW50IGxlbjsKKyAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGhvc3RkYXRhLT5yZXN0YXJ0X3NlbGVjdCA9IDA7CisgICAgTkNSX1BSSU5UKE5ERUJVR19BUkJJVFJBVElPTik7CisgICAgQVJCX1BSSU5USygic2NzaSVkOiBzdGFydGluZyBhcmJpdHJhdGlvbiwgaWQgPSAlZFxuIiwgSE9TVE5PLAorCSAgICAgICBpbnN0YW5jZS0+dGhpc19pZCk7CisKKyAgICAvKiAKKyAgICAgKiBTZXQgdGhlIHBoYXNlIGJpdHMgdG8gMCwgb3RoZXJ3aXNlIHRoZSBOQ1I1MzgwIHdvbid0IGRyaXZlIHRoZSAKKyAgICAgKiBkYXRhIGJ1cyBkdXJpbmcgU0VMRUNUSU9OLgorICAgICAqLworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCisKKyAgICAvKiAKKyAgICAgKiBTdGFydCBhcmJpdHJhdGlvbi4KKyAgICAgKi8KKyAgICAKKyAgICBOQ1I1MzgwX3dyaXRlKE9VVFBVVF9EQVRBX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0FSQklUUkFURSk7CisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICAvKiBXYWl0IGZvciBhcmJpdHJhdGlvbiBsb2dpYyB0byBjb21wbGV0ZSAqLworI2lmIE5DUl9USU1FT1VUCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDIqTkNSX1RJTUVPVVQ7CisKKyAgICAgIHdoaWxlICghKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX1BST0dSRVNTKQorCSAgICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCTsKKyAgICAgIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorICAgICAgeworCXByaW50aygic2NzaSA6IGFyYml0cmF0aW9uIHRpbWVvdXQgYXQgJWRcbiIsIF9fTElORV9fKTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyNlbHNlIC8qIE5DUl9USU1FT1VUICovCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRykgJiBJQ1JfQVJCSVRSQVRJT05fUFJPR1JFU1MpCisJICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKTsKKyNlbmRpZgorCisgICAgQVJCX1BSSU5USygic2NzaSVkOiBhcmJpdHJhdGlvbiBjb21wbGV0ZVxuIiwgSE9TVE5PKTsKKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7IAorCXJldHVybiAtMTsKKyAgICB9CisgICAgLyogCisgICAgICogVGhlIGFyYml0cmF0aW9uIGRlbGF5IGlzIDIuMnVzLCBidXQgdGhpcyBpcyBhIG1pbmltdW0gYW5kIHRoZXJlIGlzIAorICAgICAqIG5vIG1heGltdW0gc28gd2UgY2FuIHNhZmVseSBzbGVlcCBmb3IgY2VpbCgyLjIpIHVzZWNzIHRvIGFjY29tbW9kYXRlCisgICAgICogdGhlIGludGVncmFsIG5hdHVyZSBvZiB1ZGVsYXkoKS4KKyAgICAgKgorICAgICAqLworCisgICAgdWRlbGF5KDMpOworCisgICAgLyogQ2hlY2sgZm9yIGxvc3QgYXJiaXRyYXRpb24gKi8KKyAgICBpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJKE5DUjUzODBfcmVhZChDVVJSRU5UX1NDU0lfREFUQV9SRUcpICYgaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrKSB8fAorCShOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKSAmIElDUl9BUkJJVFJBVElPTl9MT1NUKSB8fAorCWhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsgCisJQVJCX1BSSU5USygic2NzaSVkOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBNUl9BUkJJVFJBVEVcbiIsCisJCSAgIEhPU1ROTyk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgICAvKiBhZnRlci9kdXJpbmcgYXJiaXRyYXRpb24sIEJTWSBzaG91bGQgYmUgYXNzZXJ0ZWQuCisJSUJNIERQRVMtMzEwODAgVmVyc2lvbiBTMzFRIHdvcmtzIG5vdyAqLworICAgICAvKiBUbnggdG8gVGhvbWFzX1JvZXNjaEBtMi5tYXVzLmRlIGZvciBmaW5kaW5nIHRoaXMhIChSb21hbikgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1NFTCB8CisJCQkJCSBJQ1JfQVNTRVJUX0JTWSApIDsKKyAgICAKKyAgICBpZiAoKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJQVJCX1BSSU5USygic2NzaSVkOiBsb3N0IGFyYml0cmF0aW9uLCBkZWFzc2VydGluZyBJQ1JfQVNTRVJUX1NFTFxuIiwKKwkJICAgSE9TVE5PKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogCisgICAgICogQWdhaW4sIGJ1cyBjbGVhciArIGJ1cyBzZXR0bGUgdGltZSBpcyAxLjJ1cywgaG93ZXZlciwgdGhpcyBpcyAKKyAgICAgKiBhIG1pbmltdW0gc28gd2UnbGwgdWRlbGF5IGNlaWwoMS4yKQorICAgICAqLworCisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfVE9TSElCQV9ERUxBWQorICAgIC8qICsrcm9tYW46IEJ1dCBzb21lIHRhcmdldHMgKHNlZSBhYm92ZSA6LSkgc2VlbSB0byBuZWVkIGEgYml0IG1vcmUuLi4gKi8KKyAgICB1ZGVsYXkoMTUpOworI2Vsc2UKKyAgICB1ZGVsYXkoMik7CisjZW5kaWYKKyAgICAKKyAgICBpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIEFSQl9QUklOVEsoInNjc2klZDogd29uIGFyYml0cmF0aW9uXG4iLCBIT1NUTk8pOworCisgICAgLyogCisgICAgICogTm93IHRoYXQgd2UgaGF2ZSB3b24gYXJiaXRyYXRpb24sIHN0YXJ0IFNlbGVjdGlvbiBwcm9jZXNzLCBhc3NlcnRpbmcgCisgICAgICogdGhlIGhvc3QgYW5kIHRhcmdldCBJRCdzIG9uIHRoZSBTQ1NJIGJ1cy4KKyAgICAgKi8KKworICAgIE5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCAoaG9zdGRhdGEtPmlkX21hc2sgfCAoMSA8PCBjbWQtPmRldmljZS0+aWQpKSk7CisKKyAgICAvKiAKKyAgICAgKiBSYWlzZSBBVE4gd2hpbGUgU0VMIGlzIHRydWUgYmVmb3JlIEJTWSBnb2VzIGZhbHNlIGZyb20gYXJiaXRyYXRpb24sCisgICAgICogc2luY2UgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgd2UnbGwgZ2V0IGEgTUVTU0FHRSBPVVQKKyAgICAgKiBwaGFzZSBpbW1lZGlhdGVseSBhZnRlciBzZWxlY3Rpb24uCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgKElDUl9CQVNFIHwgSUNSX0FTU0VSVF9CU1kgfCAKKwlJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMICkpOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCisgICAgLyogCisgICAgICogUmVzZWxlY3QgaW50ZXJydXB0cyBtdXN0IGJlIHR1cm5lZCBvZmYgcHJpb3IgdG8gdGhlIGRyb3BwaW5nIG9mIEJTWSwKKyAgICAgKiBvdGhlcndpc2Ugd2Ugd2lsbCB0cmlnZ2VyIGFuIGludGVycnVwdC4KKyAgICAgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7CisKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWF0b3Igc2hhbGwgdGhlbiB3YWl0IGF0IGxlYXN0IHR3byBkZXNrZXcgZGVsYXlzIGFuZCByZWxlYXNlIAorICAgICAqIHRoZSBCU1kgc2lnbmFsLgorICAgICAqLworICAgIHVkZWxheSgxKTsgICAgICAgIC8qIHdpbmdlbCAtLSB3YWl0IHR3byBidXMgZGVza2V3IGRlbGF5ID4yKjQ1bnMgKi8KKworICAgIC8qIFJlc2V0IEJTWSAqLworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0RBVEEgfCAKKwlJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfU0VMKSk7CisKKyAgICAvKiAKKyAgICAgKiBTb21ldGhpbmcgd2VpcmQgaGFwcGVucyB3aGVuIHdlIGNlYXNlIHRvIGRyaXZlIEJTWSAtIGxvb2tzCisgICAgICogbGlrZSB0aGUgYm9hcmQvY2hpcCBpcyBsZXR0aW5nIHVzIGRvIGFub3RoZXIgcmVhZCBiZWZvcmUgdGhlIAorICAgICAqIGFwcHJvcHJpYXRlIHByb3BhZ2F0aW9uIGRlbGF5IGhhcyBleHBpcmVkLCBhbmQgd2UncmUgY29uZnVzaW5nCisgICAgICogYSBCU1kgc2lnbmFsIGZyb20gb3Vyc2VsdmVzIGFzIHRoZSB0YXJnZXQncyByZXNwb25zZSB0byBTRUxFQ1RJT04uCisgICAgICoKKyAgICAgKiBBIHNtYWxsIGRlbGF5ICh0aGUgJ0MrKycgZnJvbnRlbmQgYnJlYWtzIHRoZSBwaXBlbGluZSB3aXRoIGFuCisgICAgICogdW5uZWNlc3NhcnkganVtcCwgbWFraW5nIGl0IHdvcmsgb24gbXkgMzg2LTMzL1RyYW50b3IgVDEyOCwgdGhlCisgICAgICogdGlnaHRlciAnQycgY29kZSBicmVha3MgYW5kIHJlcXVpcmVzIHRoaXMpIHNvbHZlcyB0aGUgcHJvYmxlbSAtIAorICAgICAqIHRoZSAxIHVzIGRlbGF5IGlzIGFyYml0cmFyeSwgYW5kIG9ubHkgdXNlZCBiZWNhdXNlIHRoaXMgZGVsYXkgd2lsbCAKKyAgICAgKiBiZSB0aGUgc2FtZSBvbiBvdGhlciBwbGF0Zm9ybXMgYW5kIHNpbmNlIGl0IHdvcmtzIGhlcmUsIGl0IHNob3VsZCAKKyAgICAgKiB3b3JrIHRoZXJlLgorICAgICAqCisgICAgICogd2luZ2VsIHN1Z2dlc3RzIHRoYXQgdGhpcyBjb3VsZCBiZSBkdWUgdG8gZmFpbGluZyB0byB3YWl0CisgICAgICogb25lIGRlc2tldyBkZWxheS4KKyAgICAgKi8KKworICAgIHVkZWxheSgxKTsKKworICAgIFNFTF9QUklOVEsoInNjc2klZDogc2VsZWN0aW5nIHRhcmdldCAlZFxuIiwgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQpOworCisgICAgLyogCisgICAgICogVGhlIFNDU0kgc3BlY2lmaWNhdGlvbiBjYWxscyBmb3IgYSAyNTAgbXMgdGltZW91dCBmb3IgdGhlIGFjdHVhbCAKKyAgICAgKiBzZWxlY3Rpb24uCisgICAgICovCisKKyAgICB0aW1lb3V0ID0gamlmZmllcyArIDI1OyAKKworICAgIC8qIAorICAgICAqIFhYWCB2ZXJ5IGludGVyZXN0aW5nIC0gd2UncmUgc2VlaW5nIGEgYm91bmNlIHdoZXJlIHRoZSBCU1kgd2UgCisgICAgICogYXNzZXJ0ZWQgaXMgYmVpbmcgcmVmbGVjdGVkIC8gc3RpbGwgYXNzZXJ0ZWQgKHByb3BhZ2F0aW9uIGRlbGF5PykKKyAgICAgKiBhbmQgaXQncyBkZXRlY3RpbmcgYXMgdHJ1ZS4gIFNpZ2guCisgICAgICovCisKKyNpZiAwCisgICAgLyogKytyb21hbjogSWYgYSB0YXJnZXQgY29uZm9ybWVkIHRvIHRoZSBTQ1NJIHN0YW5kYXJkLCBpdCB3b3VsZG4ndCBhc3NlcnQKKyAgICAgKiBJTyB3aGlsZSBTRUwgaXMgdHJ1ZS4gQnV0IGFnYWluLCB0aGVyZSBhcmUgc29tZSBkaXNrcyBvdXQgdGhlIGluIHRoZQorICAgICAqIHdvcmxkIHRoYXQgZG8gdGhhdCBuZXZlcnRoZWxlc3MuIChTb21lYm9keSBjbGFpbWVkIHRoYXQgdGhpcyBhbm5vdW5jZXMKKyAgICAgKiByZXNlbGVjdGlvbiBjYXBhYmlsaXR5IG9mIHRoZSB0YXJnZXQuKSBTbyB3ZSBiZXR0ZXIgc2tpcCB0aGF0IHRlc3QgYW5kCisgICAgICogb25seSB3YWl0IGZvciBCU1kuLi4gKEZhbW91cyBnZXJtYW4gd29yZHM6IERlciBLbPxnZXJlIGdpYnQgbmFjaCA6LSkKKyAgICAgKi8KKworICAgIHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIAorCShTUl9CU1kgfCBTUl9JTykpKTsKKworICAgIGlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgKFNSX1NFTCB8IFNSX0lPKSkgPT0gCisJICAgIChTUl9TRUwgfCBTUl9JTykpIHsKKwkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkgICAgTkNSNTM4MF9yZXNlbGVjdChpbnN0YW5jZSk7CisJICAgIHByaW50ayAoS0VSTl9FUlIgInNjc2klZDogcmVzZWxlY3Rpb24gYWZ0ZXIgd29uIGFyYml0cmF0aW9uP1xuIiwKKwkJICAgIEhPU1ROTyk7CisJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbHNlCisgICAgd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSk7CisjZW5kaWYKKworICAgIC8qIAorICAgICAqIE5vIGxlc3MgdGhhbiB0d28gZGVza2V3IGRlbGF5cyBhZnRlciB0aGUgaW5pdGlhdG9yIGRldGVjdHMgdGhlIAorICAgICAqIEJTWSBzaWduYWwgaXMgdHJ1ZSwgaXQgc2hhbGwgcmVsZWFzZSB0aGUgU0VMIHNpZ25hbCBhbmQgbWF5IAorICAgICAqIGNoYW5nZSB0aGUgREFUQSBCVVMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aW5nZWwKKyAgICAgKi8KKworICAgIHVkZWxheSgxKTsKKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKworICAgIGlmICghKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkpIHsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCWlmIChob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2klZDogd2VpcmRuZXNzXG4iLCBIT1NUTk8pOworCSAgICBpZiAoaG9zdGRhdGEtPnJlc3RhcnRfc2VsZWN0KQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlx0cmVzdGFydCBzZWxlY3RcbiIpOworCSAgICBOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwljb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJY21kX2ZyZWVfdGFnKCBjbWQgKTsKKyNlbmRpZgorCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCVNFTF9QUklOVEsoInNjc2klZDogdGFyZ2V0IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gMjUwbXNcbiIsIEhPU1ROTyk7CisJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCXJldHVybiAwOworICAgIH0gCisKKyAgICBob3N0ZGF0YS0+dGFyZ2V0c19wcmVzZW50IHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCk7CisKKyAgICAvKgorICAgICAqIFNpbmNlIHdlIGZvbGxvd2VkIHRoZSBTQ1NJIHNwZWMsIGFuZCByYWlzZWQgQVROIHdoaWxlIFNFTCAKKyAgICAgKiB3YXMgdHJ1ZSBidXQgYmVmb3JlIEJTWSB3YXMgZmFsc2UgZHVyaW5nIHNlbGVjdGlvbiwgdGhlIGluZm9ybWF0aW9uCisgICAgICogdHJhbnNmZXIgcGhhc2Ugc2hvdWxkIGJlIGEgTUVTU0FHRSBPVVQgcGhhc2Ugc28gdGhhdCB3ZSBjYW4gc2VuZCB0aGUKKyAgICAgKiBJREVOVElGWSBtZXNzYWdlLgorICAgICAqIAorICAgICAqIElmIFNDU0ktSUkgdGFnZ2VkIHF1ZXVpbmcgaXMgZW5hYmxlZCwgd2UgYWxzbyBzZW5kIGEgU0lNUExFX1FVRVVFX1RBRworICAgICAqIG1lc3NhZ2UgKDIgYnl0ZXMpIHdpdGggYSB0YWcgSUQgdGhhdCB3ZSBpbmNyZW1lbnQgd2l0aCBldmVyeSBjb21tYW5kCisgICAgICogdW50aWwgaXQgd3JhcHMgYmFjayB0byAwLgorICAgICAqCisgICAgICogWFhYIC0gaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlIHNvbWUgYnJva2VuIFNDU0ktSUkgZGV2aWNlcywKKyAgICAgKgkgICAgIHdoaWNoIGNsYWltIHRvIHN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmcgYnV0IGZhaWwgd2hlbiBtb3JlIHRoYW4KKyAgICAgKgkgICAgIHNvbWUgbnVtYmVyIG9mIGNvbW1hbmRzIGFyZSBpc3N1ZWQgYXQgb25jZS4KKyAgICAgKi8KKworICAgIC8qIFdhaXQgZm9yIHN0YXJ0IG9mIFJFUS9BQ0sgaGFuZHNoYWtlICovCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSk7CisKKyAgICBTRUxfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBzZWxlY3RlZCwgZ29pbmcgaW50byBNRVNTQUdFIE9VVCBwaGFzZS5cbiIsCisJICAgICAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkKTsKKyAgICB0bXBbMF0gPSBJREVOVElGWSgxLCBjbWQtPmRldmljZS0+bHVuKTsKKworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGlmIChjbWQtPnRhZyAhPSBUQUdfTk9ORSkgeworCXRtcFsxXSA9IGhvc3RkYXRhLT5sYXN0X21lc3NhZ2UgPSBTSU1QTEVfUVVFVUVfVEFHOworCXRtcFsyXSA9IGNtZC0+dGFnOworCWxlbiA9IDM7CisgICAgfSBlbHNlIAorCWxlbiA9IDE7CisjZWxzZQorICAgIGxlbiA9IDE7CisgICAgY21kLT50YWc9MDsKKyNlbmRpZiAvKiBTVVBQT1JUX1RBR1MgKi8KKworICAgIC8qIFNlbmQgbWVzc2FnZShzKSAqLworICAgIGRhdGEgPSB0bXA7CisgICAgcGhhc2UgPSBQSEFTRV9NU0dPVVQ7CisgICAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworICAgIFNFTF9QUklOVEsoInNjc2klZDogbmV4dXMgZXN0YWJsaXNoZWQuXG4iLCBIT1NUTk8pOworICAgIC8qIFhYWCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgaGVyZSAqLworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisjaWZuZGVmIFNVUFBPUlRfVEFHUworICAgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gfD0gKDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYgICAgCisKKyAgICBpbml0aWFsaXplX1NDcChjbWQpOworCisKKyAgICByZXR1cm4gMDsKK30KKworLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX3BpbyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIHBvbGxlZCBJL08KKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIGRyaXZlciwgKnBoYXNlIC0gcG9pbnRlciB0byAKKyAqCXdoYXQgcGhhc2UgaXMgZXhwZWN0ZWQsICpjb3VudCAtIHBvaW50ZXIgdG8gbnVtYmVyIG9mIAorICoJYnl0ZXMgdG8gdHJhbnNmZXIsICoqZGF0YSAtIHBvaW50ZXIgdG8gZGF0YSBwb2ludGVyLgorICogCisgKiBSZXR1cm5zIDogLTEgd2hlbiBkaWZmZXJlbnQgcGhhc2UgaXMgZW50ZXJlZCB3aXRob3V0IHRyYW5zZmVycmluZworICoJbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMsIDAgaWYgYWxsIGJ5dGVzIGFyZSB0cmFuc2ZlcmVkIG9yIGV4aXQKKyAqCWlzIGluIHNhbWUgcGhhc2UuCisgKgorICogCUFsc28sICpwaGFzZSwgKmNvdW50LCAqZGF0YSBhcmUgbW9kaWZpZWQgaW4gcGxhY2UuCisgKgorICogWFhYIE5vdGUgOiBoYW5kbGluZyBmb3IgYnVzIGZyZWUgbWF5IGJlIHVzZWZ1bC4KKyAqLworCisvKgorICogTm90ZSA6IHRoaXMgY29kZSBpcyBub3QgYXMgcXVpY2sgYXMgaXQgY291bGQgYmUsIGhvd2V2ZXIgaXQgCisgKiBJUyAxMDAlIHJlbGlhYmxlLCBhbmQgZm9yIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciB3aGVyZSBzcGVlZAorICogY291bnRzLCB3ZSB3aWxsIGFsd2F5cyBkbyBhIHBzZXVkbyBETUEgb3IgRE1BIHRyYW5zZmVyLgorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9waW8oIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKwkJCQkgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhKQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgcCA9ICpwaGFzZSwgdG1wOworICAgIHJlZ2lzdGVyIGludCBjID0gKmNvdW50OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmQgPSAqZGF0YTsKKworICAgIC8qIAorICAgICAqIFRoZSBOQ1I1MzgwIGNoaXAgd2lsbCBvbmx5IGRyaXZlIHRoZSBTQ1NJIGJ1cyB3aGVuIHRoZSAKKyAgICAgKiBwaGFzZSBzcGVjaWZpZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGJpdHMgb2YgdGhlIFRBUkdFVCBDT01NQU5ECisgICAgICogUkVHSVNURVIgbWF0Y2ggdGhlIFNUQVRVUyBSRUdJU1RFUgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUihwKSk7CisKKyAgICBkbyB7CisJLyogCisJICogV2FpdCBmb3IgYXNzZXJ0aW9uIG9mIFJFUSwgYWZ0ZXIgd2hpY2ggdGhlIHBoYXNlIGJpdHMgd2lsbCBiZSAKKwkgKiB2YWxpZCAKKwkgKi8KKwl3aGlsZSAoISgodG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKSAmIFNSX1JFUSkpOworCisJSFNIX1BSSU5USygic2NzaSVkOiBSRVEgZGV0ZWN0ZWRcbiIsIEhPU1ROTyk7CisKKwkvKiBDaGVjayBmb3IgcGhhc2UgbWlzbWF0Y2ggKi8JCisJaWYgKCh0bXAgJiBQSEFTRV9NQVNLKSAhPSBwKSB7CisJICAgIFBJT19QUklOVEsoInNjc2klZDogcGhhc2UgbWlzbWF0Y2hcbiIsIEhPU1ROTyk7CisJICAgIE5DUl9QUklOVF9QSEFTRShOREVCVUdfUElPKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogRG8gYWN0dWFsIHRyYW5zZmVyIGZyb20gU0NTSSBidXMgdG8gLyBmcm9tIG1lbW9yeSAqLworCWlmICghKHAgJiBTUl9JTykpIAorCSAgICBOQ1I1MzgwX3dyaXRlKE9VVFBVVF9EQVRBX1JFRywgKmQpOworCWVsc2UgCisJICAgICpkID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisKKwkrK2Q7CisKKwkvKiAKKwkgKiBUaGUgU0NTSSBzdGFuZGFyZCBzdWdnZXN0cyB0aGF0IGluIE1TR09VVCBwaGFzZSwgdGhlIGluaXRpYXRvcgorCSAqIHNob3VsZCBkcm9wIEFUTiBvbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBtZXNzYWdlIHBoYXNlCisJICogYWZ0ZXIgUkVRIGhhcyBiZWVuIGFzc2VydGVkIGZvciB0aGUgaGFuZHNoYWtlIGJ1dCBiZWZvcmUKKwkgKiB0aGUgaW5pdGlhdG9yIHJhaXNlcyBBQ0suCisJICovCisKKwlpZiAoIShwICYgU1JfSU8pKSB7CisJICAgIGlmICghKChwICYgU1JfTVNHKSAmJiBjID4gMSkpIHsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCSAgICBJQ1JfQVNTRVJUX0RBVEEpOworCQlOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BQ0spOworCSAgICB9IGVsc2UgeworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfAorCQkgICAgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4pOworCQlOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkgICAgSUNSX0FTU0VSVF9EQVRBIHwgSUNSX0FTU0VSVF9BVE4gfCBJQ1JfQVNTRVJUX0FDSyk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBOQ1JfUFJJTlQoTkRFQlVHX1BJTyk7CisJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQUNLKTsKKwl9CisKKwl3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKTsKKworCUhTSF9QUklOVEsoInNjc2klZDogcmVxIGZhbHNlLCBoYW5kc2hha2UgY29tcGxldGVcbiIsIEhPU1ROTyk7CisKKy8qCisgKiBXZSBoYXZlIHNldmVyYWwgc3BlY2lhbCBjYXNlcyB0byBjb25zaWRlciBkdXJpbmcgUkVRL0FDSyBoYW5kc2hha2luZyA6IAorICogMS4gIFdlIHdlcmUgaW4gTVNHT1VUIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIAorICoJbWVzc2FnZS4gIEFUTiBtdXN0IGJlIGRyb3BwZWQgYXMgQUNLIGlzIGRyb3BwZWQuCisgKgorICogMi4gIFdlIGFyZSBpbiBhIE1TR0lOIHBoYXNlLCBhbmQgd2UgYXJlIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlICAKKyAqCW1lc3NhZ2UuICBXZSBtdXN0IGV4aXQgd2l0aCBBQ0sgYXNzZXJ0ZWQsIHNvIHRoYXQgdGhlIGNhbGxpbmcKKyAqCWNvZGUgbWF5IHJhaXNlIEFUTiBiZWZvcmUgZHJvcHBpbmcgQUNLIHRvIHJlamVjdCB0aGUgbWVzc2FnZS4KKyAqCisgKiAzLiAgQUNLIGFuZCBBVE4gYXJlIGNsZWFyIGFuZCB0aGUgdGFyZ2V0IG1heSBwcm9jZWVkIGFzIG5vcm1hbC4KKyAqLworCWlmICghKHAgPT0gUEhBU0VfTVNHSU4gJiYgYyA9PSAxKSkgeyAgCisJICAgIGlmIChwID09IFBIQVNFX01TR09VVCAmJiBjID4gMSkKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCSAgICBlbHNlCisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJfSAKKyAgICB9IHdoaWxlICgtLWMpOworCisgICAgUElPX1BSSU5USygic2NzaSVkOiByZXNpZHVhbCAlZFxuIiwgSE9TVE5PLCBjKTsKKworICAgICpjb3VudCA9IGM7CisgICAgKmRhdGEgPSBkOworICAgIHRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKyAgICAvKiBUaGUgcGhhc2UgcmVhZCBmcm9tIHRoZSBidXMgaXMgdmFsaWQgaWYgZWl0aGVyIFJFUSBpcyAoYWxyZWFkeSkKKyAgICAgKiBhc3NlcnRlZCBvciBpZiBBQ0sgaGFzbid0IGJlZW4gcmVsZWFzZWQgeWV0LiBUaGUgbGF0dGVyIGlzIHRoZSBjYXNlIGlmCisgICAgICogd2UncmUgaW4gTVNHSU4gYW5kIGFsbCB3YW50ZWQgYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkLiAqLworICAgIGlmICgodG1wICYgU1JfUkVRKSB8fCAocCA9PSBQSEFTRV9NU0dJTiAmJiBjID09IDApKQorCSpwaGFzZSA9IHRtcCAmIFBIQVNFX01BU0s7CisgICAgZWxzZSAKKwkqcGhhc2UgPSBQSEFTRV9VTktOT1dOOworCisgICAgaWYgKCFjIHx8ICgqcGhhc2UgPT0gcCkpCisJcmV0dXJuIDA7CisgICAgZWxzZSAKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGRvX2Fib3J0IChTY3NpX0hvc3QgKmhvc3QpCisgKiAKKyAqIFB1cnBvc2UgOiBhYm9ydCB0aGUgY3VycmVudGx5IGVzdGFibGlzaGVkIG5leHVzLiAgU2hvdWxkIG9ubHkgYmUgCisgKiAJY2FsbGVkIGZyb20gYSByb3V0aW5lIHdoaWNoIGNhbiBkcm9wIGludG8gYSAKKyAqIAorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGRvX2Fib3J0IChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KSAKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHRtcCwgKm1zZ3B0ciwgcGhhc2U7CisgICAgaW50IGxlbjsKKworICAgIC8qIFJlcXVlc3QgbWVzc2FnZSBvdXQgcGhhc2UgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisKKyAgICAvKiAKKyAgICAgKiBXYWl0IGZvciB0aGUgdGFyZ2V0IHRvIGluZGljYXRlIGEgdmFsaWQgcGhhc2UgYnkgYXNzZXJ0aW5nIAorICAgICAqIFJFUS4gIE9uY2UgdGhpcyBoYXBwZW5zLCB3ZSdsbCBoYXZlIGVpdGhlciBhIE1TR09VVCBwaGFzZSAKKyAgICAgKiBhbmQgY2FuIGltbWVkaWF0ZWx5IHNlbmQgdGhlIEFCT1JUIG1lc3NhZ2UsIG9yIHdlJ2xsIGhhdmUgc29tZSAKKyAgICAgKiBvdGhlciBwaGFzZSBhbmQgd2lsbCBoYXZlIHRvIHNvdXJjZS9zaW5rIGRhdGEuCisgICAgICogCisgICAgICogV2UgcmVhbGx5IGRvbid0IGNhcmUgd2hhdCB2YWx1ZSB3YXMgb24gdGhlIGJ1cyBvciB3aGF0IHZhbHVlCisgICAgICogdGhlIHRhcmdldCBzZWVzLCBzbyB3ZSBqdXN0IGhhbmRzaGFrZS4KKyAgICAgKi8KKyAgICAKKyAgICB3aGlsZSAoISh0bXAgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpICYgU1JfUkVRKTsKKworICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IodG1wKSk7CisKKyAgICBpZiAoKHRtcCAmIFBIQVNFX01BU0spICE9IFBIQVNFX01TR09VVCkgeworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROIHwgCisJCSAgICAgIElDUl9BU1NFUlRfQUNLKTsKKwl3aGlsZSAoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKTsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisgICAgfQorICAgCisgICAgdG1wID0gQUJPUlQ7CisgICAgbXNncHRyID0gJnRtcDsKKyAgICBsZW4gPSAxOworICAgIHBoYXNlID0gUEhBU0VfTVNHT1VUOworICAgIE5DUjUzODBfdHJhbnNmZXJfcGlvIChob3N0LCAmcGhhc2UsICZsZW4sICZtc2dwdHIpOworCisgICAgLyoKKyAgICAgKiBJZiB3ZSBnb3QgaGVyZSwgYW5kIHRoZSBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksCisgICAgICogd2UncmUgYWJvdXQgdG8gZ28gaW50byBidXMgZnJlZSBzdGF0ZS4KKyAgICAgKi8KKworICAgIHJldHVybiBsZW4gPyAtMSA6IDA7Cit9CisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorLyogCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICogICAgICB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpCisgKgorICogUHVycG9zZSA6IHRyYW5zZmVycyBkYXRhIGluIGdpdmVuIHBoYXNlIHVzaW5nIGVpdGhlciByZWFsCisgKglvciBwc2V1ZG8gRE1BLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgZHJpdmVyLCAqcGhhc2UgLSBwb2ludGVyIHRvIAorICoJd2hhdCBwaGFzZSBpcyBleHBlY3RlZCwgKmNvdW50IC0gcG9pbnRlciB0byBudW1iZXIgb2YgCisgKglieXRlcyB0byB0cmFuc2ZlciwgKipkYXRhIC0gcG9pbnRlciB0byBkYXRhIHBvaW50ZXIuCisgKiAKKyAqIFJldHVybnMgOiAtMSB3aGVuIGRpZmZlcmVudCBwaGFzZSBpcyBlbnRlcmVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nCisgKgltYXhpbXVtIG51bWJlciBvZiBieXRlcywgMCBpZiBhbGwgYnl0ZXMgb3IgdHJhbnNmZXJlZCBvciBleGl0CisgKglpcyBpbiBzYW1lIHBoYXNlLgorICoKKyAqIAlBbHNvLCAqcGhhc2UsICpjb3VudCwgKmRhdGEgYXJlIG1vZGlmaWVkIGluIHBsYWNlLgorICoKKyAqLworCisKK3N0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9kbWEoIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKwkJCQkgdW5zaWduZWQgY2hhciAqcGhhc2UsIGludCAqY291bnQsCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICByZWdpc3RlciBpbnQgYyA9ICpjb3VudDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHAgPSAqcGhhc2U7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZCA9ICpkYXRhOworICAgIHVuc2lnbmVkIGNoYXIgdG1wOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoKHRtcCA9IChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBQSEFTRV9NQVNLKSkgIT0gcCkgeworICAgICAgICAqcGhhc2UgPSB0bXA7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXRhcmlfcmVhZF9vdmVycnVucyAmJiAocCAmIFNSX0lPKSkgeworCWMgLT0gYXRhcmlfcmVhZF9vdmVycnVuczsKKyAgICB9CisKKyAgICBETUFfUFJJTlRLKCJzY3NpJWQ6IGluaXRpYWxpemluZyBETUEgZm9yICVzLCAlZCBieXRlcyAlcyAlcFxuIiwKKwkgICAgICAgSE9TVE5PLCAocCAmIFNSX0lPKSA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIiwKKwkgICAgICAgYywgKHAgJiBTUl9JTykgPyAidG8iIDogImZyb20iLCBkKTsKKworICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IocCkpOworCisjaWZkZWYgUkVBTF9ETUEKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFIHwgTVJfRE1BX01PREUgfCBNUl9FTkFCTEVfRU9QX0lOVFIgfCBNUl9NT05JVE9SX0JTWSk7CisjZW5kaWYgLyogZGVmIFJFQUxfRE1BICAqLworCisgICAgaWYgKElTX0FfVFQoKSkgeworCS8qIE9uIHRoZSBNZWR1c2EsIGl0IGlzIGEgbXVzdCB0byBpbml0aWFsaXplIHRoZSBETUEgYmVmb3JlCisJICogc3RhcnRpbmcgdGhlIE5DUi4gVGhpcyBpcyBhbHNvIHRoZSBjbGVhbmVyIHdheSBmb3IgdGhlIFRULgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlob3N0ZGF0YS0+ZG1hX2xlbiA9IChwICYgU1JfSU8pID8KKwkgICAgTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZCwgYykgOiAKKwkgICAgTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGQsIGMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgaWYgKHAgJiBTUl9JTykKKwlOQ1I1MzgwX3dyaXRlKFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcsIDApOworICAgIGVsc2UgeworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfREFUQSk7CisJTkNSNTM4MF93cml0ZShTVEFSVF9ETUFfU0VORF9SRUcsIDApOworICAgIH0KKworICAgIGlmICghSVNfQV9UVCgpKSB7CisJLyogT24gdGhlIEZhbGNvbiwgdGhlIERNQSBzZXR1cCBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGxhc3QgKi8KKwkvKiBOQ1IgYWNjZXNzLCBlbHNlIHRoZSBETUEgc2V0dXAgZ2V0cyB0cmFzaGVkIQorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlob3N0ZGF0YS0+ZG1hX2xlbiA9IChwICYgU1JfSU8pID8KKwkgICAgTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZCwgYykgOiAKKwkgICAgTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIGQsIGMpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZChSRUFMX0RNQSkgKi8KKworLyoKKyAqIEZ1bmN0aW9uIDogTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlciAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IHJ1biB0aHJvdWdoIHRoZSB2YXJpb3VzIFNDU0kgcGhhc2VzIGFuZCBkbyBhcyB0aGUgdGFyZ2V0IAorICogCWRpcmVjdHMgdXMgdG8uICBPcGVyYXRlcyBvbiB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kLCAKKyAqCWluc3RhbmNlLT5jb25uZWN0ZWQuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UsIGluc3RhbmNlIGZvciB3aGljaCB3ZSBhcmUgZG9pbmcgY29tbWFuZHMKKyAqCisgKiBTaWRlIGVmZmVjdHMgOiBTQ1NJIHRoaW5ncyBoYXBwZW4sIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUgd2lsbCBiZSAKKyAqCW1vZGlmaWVkIGlmIGEgY29tbWFuZCBkaXNjb25uZWN0cywgKmluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbAorICoJY2hhbmdlLgorICoKKyAqIFhYWCBOb3RlIDogd2UgbmVlZCB0byB3YXRjaCBmb3IgYnVzIGZyZWUgb3IgYSByZXNldCBjb25kaXRpb24gaGVyZSAKKyAqIAl0byByZWNvdmVyIGZyb20gYW4gdW5leHBlY3RlZCBidXMgZnJlZSBjb25kaXRpb24uCisgKi8KKyAKK3N0YXRpYyB2b2lkIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGNoYXIgbXNnb3V0ID0gTk9QOworICAgIGludCBzaW5rID0gMDsKKyAgICBpbnQgbGVuOworI2lmIGRlZmluZWQoUkVBTF9ETUEpCisgICAgaW50IHRyYW5zZmVyc2l6ZTsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgdW5zaWduZWQgY2hhciBwaGFzZSwgdG1wLCBleHRlbmRlZF9tc2dbMTBdLCBvbGRfcGhhc2U9MHhmZjsKKyAgICBTY3NpX0NtbmQgKmNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsKKworICAgIHdoaWxlICgxKSB7CisJdG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworCS8qIFdlIG9ubHkgaGF2ZSBhIHZhbGlkIFNDU0kgcGhhc2Ugd2hlbiBSRVEgaXMgYXNzZXJ0ZWQgKi8KKwlpZiAodG1wICYgU1JfUkVRKSB7CisJICAgIHBoYXNlID0gKHRtcCAmIFBIQVNFX01BU0spOyAKKwkgICAgaWYgKHBoYXNlICE9IG9sZF9waGFzZSkgeworCQlvbGRfcGhhc2UgPSBwaGFzZTsKKwkJTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19JTkZPUk1BVElPTik7CisJICAgIH0KKwkgICAgCisJICAgIGlmIChzaW5rICYmIChwaGFzZSAhPSBQSEFTRV9NU0dPVVQpKSB7CisJCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IodG1wKSk7CisKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4gfCAKKwkJICAgIElDUl9BU1NFUlRfQUNLKTsKKwkJd2hpbGUgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkgICAgSUNSX0FTU0VSVF9BVE4pOworCQlzaW5rID0gMDsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBzd2l0Y2ggKHBoYXNlKSB7CisJICAgIGNhc2UgUEhBU0VfREFUQU9VVDoKKyNpZiAoTkRFQlVHICYgTkRFQlVHX05PX0RBVEFPVVQpCisJCXByaW50aygic2NzaSVkOiBOREVCVUdfTk9fREFUQU9VVCBzZXQsIGF0dGVtcHRlZCBEQVRBT1VUICIKKwkJICAgICAgICJhYm9ydGVkXG4iLCBIT1NUTk8pOworCQlzaW5rID0gMTsKKwkJZG9fYWJvcnQoaW5zdGFuY2UpOworCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiAgPDwgMTY7CisJCWNtZC0+ZG9uZShjbWQpOworCQlyZXR1cm47CisjZW5kaWYKKwkgICAgY2FzZSBQSEFTRV9EQVRBSU46CisJCS8qIAorCQkgKiBJZiB0aGVyZSBpcyBubyByb29tIGxlZnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZQorCQkgKiBzY2F0dGVyLWdhdGhlciBsaXN0LCBtb3ZlIG9udG8gdGhlIG5leHQgb25lLgorCQkgKi8KKworCQlpZiAoIWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkgICAgKytjbWQtPlNDcC5idWZmZXI7CisJCSAgICAtLWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJCSAgICBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCSAgICBjbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSsKKwkJCQkgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJICAgIC8qICsrcm9tYW46IFRyeSB0byBtZXJnZSBzb21lIHNjYXR0ZXItYnVmZmVycyBpZgorCQkgICAgICogdGhleSBhcmUgYXQgY29udGlndW91cyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJCSAgICAgKi8KKwkJICAgIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggY21kICk7CisJCSAgICBJTkZfUFJJTlRLKCJzY3NpJWQ6ICVkIGJ5dGVzIGFuZCAlZCBidWZmZXJzIGxlZnRcbiIsCisJCQkgICAgICAgSE9TVE5PLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLAorCQkJICAgICAgIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworCQl9CisKKwkJLyoKKwkJICogVGhlIHByZWZlcnJlZCB0cmFuc2ZlciBtZXRob2QgaXMgZ29pbmcgdG8gYmUgCisJCSAqIFBTRVVETy1ETUEgZm9yIHN5c3RlbXMgdGhhdCBhcmUgc3RyaWN0bHkgUElPLAorCQkgKiBzaW5jZSB3ZSBjYW4gbGV0IHRoZSBoYXJkd2FyZSBkbyB0aGUgaGFuZHNoYWtpbmcuCisJCSAqCisJCSAqIEZvciB0aGlzIHRvIHdvcmssIHdlIG5lZWQgdG8ga25vdyB0aGUgdHJhbnNmZXJzaXplCisJCSAqIGFoZWFkIG9mIHRpbWUsIHNpbmNlIHRoZSBwc2V1ZG8tRE1BIGNvZGUgd2lsbCBzaXQKKwkJICogaW4gYW4gdW5jb25kaXRpb25hbCBsb29wLgorCQkgKi8KKworLyogKytyb21hbjogSSBzdWdnZXN0LCB0aGlzIHNob3VsZCBiZQorICogICAjaWYgZGVmKFJFQUxfRE1BKQorICogaW5zdGVhZCBvZiBsZWF2aW5nIFJFQUxfRE1BIG91dC4KKyAqLworCisjaWYgZGVmaW5lZChSRUFMX0RNQSkKKwkJaWYgKCFjbWQtPmRldmljZS0+Ym9ya2VuICYmCisJCSAgICAodHJhbnNmZXJzaXplID0gTkNSNTM4MF9kbWFfeGZlcl9sZW4oaW5zdGFuY2UsY21kLHBoYXNlKSkgPiAzMSkgeworCQkgICAgbGVuID0gdHJhbnNmZXJzaXplOworCQkgICAgY21kLT5TQ3AucGhhc2UgPSBwaGFzZTsKKwkJICAgIGlmIChOQ1I1MzgwX3RyYW5zZmVyX2RtYShpbnN0YW5jZSwgJnBoYXNlLAorCQkJJmxlbiwgKHVuc2lnbmVkIGNoYXIgKiopICZjbWQtPlNDcC5wdHIpKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHdhdGNoZG9nIHRpbWVyIGZpcmVzLCBhbGwgZnV0dXJlCisJCQkgKiBhY2Nlc3NlcyB0byB0aGlzIGRldmljZSB3aWxsIHVzZSB0aGUKKwkJCSAqIHBvbGxlZC1JTy4gKi8gCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogc3dpdGNoaW5nIHRhcmdldCAlZCAiCisJCQkgICAgICAgImx1biAlZCB0byBzbG93IGhhbmRzaGFrZVxuIiwgSE9TVE5PLAorCQkJICAgICAgIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQljbWQtPmRldmljZS0+Ym9ya2VuID0gMTsKKwkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJICAgIElDUl9BU1NFUlRfQVROKTsKKwkJCXNpbmsgPSAxOworCQkJZG9fYWJvcnQoaW5zdGFuY2UpOworCQkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgIDw8IDE2OworCQkJY21kLT5kb25lKGNtZCk7CisJCQkvKiBYWFggLSBuZWVkIHRvIHNvdXJjZSBvciBzaW5rIGRhdGEgaGVyZSwgYXMgYXBwcm9wcmlhdGUgKi8KKwkJICAgIH0gZWxzZSB7CisjaWZkZWYgUkVBTF9ETUEKKwkJCS8qICsrcm9tYW46IFdoZW4gdXNpbmcgcmVhbCBETUEsCisJCQkgKiBpbmZvcm1hdGlvbl90cmFuc2ZlcigpIHNob3VsZCByZXR1cm4gYWZ0ZXIKKwkJCSAqIHN0YXJ0aW5nIERNQSBzaW5jZSBpdCBoYXMgbm90aGluZyBtb3JlIHRvCisJCQkgKiBkby4KKwkJCSAqLworCQkJcmV0dXJuOworI2Vsc2UJCQkKKwkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gdHJhbnNmZXJzaXplIC0gbGVuOworI2VuZGlmCisJCSAgICB9CisJCX0gZWxzZQorI2VuZGlmIC8qIGRlZmluZWQoUkVBTF9ETUEpICovCisJCSAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgCisJCSAgICAoaW50ICopICZjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCAodW5zaWduZWQgY2hhciAqKikKKwkJICAgICZjbWQtPlNDcC5wdHIpOworCQlicmVhazsKKwkgICAgY2FzZSBQSEFTRV9NU0dJTjoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZ0bXA7CisJCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIDApOyAJLyogZGlzYWJsZSByZXNlbGVjdHMgKi8KKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQljbWQtPlNDcC5NZXNzYWdlID0gdG1wOworCisJCXN3aXRjaCAodG1wKSB7CisJCS8qCisJCSAqIExpbmtpbmcgbGV0cyB1cyByZWR1Y2UgdGhlIHRpbWUgcmVxdWlyZWQgdG8gZ2V0IHRoZSAKKwkJICogbmV4dCBjb21tYW5kIG91dCB0byB0aGUgZGV2aWNlLCBob3BlZnVsbHkgdGhpcyB3aWxsCisJCSAqIG1lYW4gd2UgZG9uJ3Qgd2FzdGUgYW5vdGhlciByZXZvbHV0aW9uIGR1ZSB0byB0aGUgZGVsYXlzCisJCSAqIHJlcXVpcmVkIGJ5IEFSQklUUkFUSU9OIGFuZCBhbm90aGVyIFNFTEVDVElPTi4KKwkJICoKKwkJICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gcHJvcG9zYWwsIGxvdyBsZXZlbCBkcml2ZXJzCisJCSAqIG1lcmVseSBoYXZlIHRvIHN0YXJ0IHRoZSBuZXh0IGNvbW1hbmQsIHBvaW50ZWQgdG8gYnkgCisJCSAqIG5leHRfbGluaywgZG9uZSgpIGlzIGNhbGxlZCBhcyB3aXRoIHVubGlua2VkIGNvbW1hbmRzLgorCQkgKi8KKyNpZmRlZiBMSU5LRUQKKwkJY2FzZSBMSU5LRURfQ01EX0NPTVBMRVRFOgorCQljYXNlIExJTktFRF9GTEdfQ01EX0NPTVBMRVRFOgorCQkgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkgICAgCisJCSAgICBMTktfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgbGlua2VkIGNvbW1hbmQgIgorCQkJICAgICAgICJjb21wbGV0ZS5cbiIsIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIC8qCisJCSAgICAgKiBTYW5pdHkgY2hlY2sgOiBBIGxpbmtlZCBjb21tYW5kIHNob3VsZCBvbmx5IHRlcm1pbmF0ZQorCQkgICAgICogd2l0aCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIG1vcmUgbGlua2VkCisJCSAgICAgKiBjb21tYW5kcyBhdmFpbGFibGUuCisJCSAgICAgKi8KKworCQkgICAgaWYgKCFjbWQtPm5leHRfbGluaykgeworCQkJIHByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkICIKKwkJCQkibGlua2VkIGNvbW1hbmQgY29tcGxldGUsIG5vIG5leHRfbGlua1xuIiwKKwkJCQlIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkgICAgc2luayA9IDE7CisJCQkgICAgZG9fYWJvcnQgKGluc3RhbmNlKTsKKwkJCSAgICByZXR1cm47CisJCSAgICB9CisKKwkJICAgIGluaXRpYWxpemVfU0NwKGNtZC0+bmV4dF9saW5rKTsKKwkJICAgIC8qIFRoZSBuZXh0IGNvbW1hbmQgaXMgc3RpbGwgcGFydCBvZiB0aGlzIHByb2Nlc3M7IGNvcHkgaXQKKwkJICAgICAqIGFuZCBkb24ndCBmcmVlIGl0ISAqLworCQkgICAgY21kLT5uZXh0X2xpbmstPnRhZyA9IGNtZC0+dGFnOworCQkgICAgY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsgCisJCSAgICBMTktfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgbGlua2VkIHJlcXVlc3QgIgorCQkJICAgICAgICJkb25lLCBjYWxsaW5nIHNjc2lfZG9uZSgpLlxuIiwKKwkJCSAgICAgICBIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisjaWZkZWYgTkNSNTM4MF9TVEFUUworCQkgICAgY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKyNlbmRpZgorCQkgICAgY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJICAgIGNtZCA9IGhvc3RkYXRhLT5jb25uZWN0ZWQ7CisJCSAgICBicmVhazsKKyNlbmRpZiAvKiBkZWYgTElOS0VEICovCisJCWNhc2UgQUJPUlQ6CisJCWNhc2UgQ09NTUFORF9DT01QTEVURTogCisJCSAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCSAgICAvKiArK2d1ZW50aGVyOiBwb3NzaWJsZSByYWNlIHdpdGggRmFsY29uIGxvY2tpbmcgKi8KKwkJICAgIGZhbGNvbl9kb250X3JlbGVhc2UrKzsKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgUVVfUFJJTlRLKCJzY3NpJWQ6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCwgbHVuICVkICIKKwkJCSAgICAgICJjb21wbGV0ZWRcbiIsIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJICAgIGNtZF9mcmVlX3RhZyggY21kICk7CisJCSAgICBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBRVUVVRV9GVUxMKSB7CisJCQkvKiBUdXJuIGEgUVVFVUUgRlVMTCBzdGF0dXMgaW50byBCVVNZLCBJIHRoaW5rIHRoZQorCQkJICogbWlkIGxldmVsIGNhbm5vdCBoYW5kbGUgUVVFVUUgRlVMTCA6LSggKFRoZQorCQkJICogY29tbWFuZCBpcyByZXRyaWVkIGFmdGVyIEJVU1kpLiBBbHNvIHVwZGF0ZSBvdXIKKwkJCSAqIHF1ZXVlIHNpemUgdG8gdGhlIG51bWJlciBvZiBjdXJyZW50bHkgaXNzdWVkCisJCQkgKiBjb21tYW5kcyBub3cuCisJCQkgKi8KKwkJCS8qICsrQW5kcmVhczogdGhlIG1pZCBsZXZlbCBjb2RlIGtub3dzIGFib3V0CisJCQkgICBRVUVVRV9GVUxMIG5vdy4gKi8KKwkJCVRBR19BTExPQyAqdGEgPSAmVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKwkJCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCByZXR1cm5lZCAiCisJCQkJICAgIlFVRVVFX0ZVTEwgYWZ0ZXIgJWQgY29tbWFuZHNcbiIsCisJCQkJICAgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCQkJICAgdGEtPm5yX2FsbG9jYXRlZCk7CisJCQlpZiAodGEtPnF1ZXVlX3NpemUgPiB0YS0+bnJfYWxsb2NhdGVkKQorCQkJICAgIHRhLT5ucl9hbGxvY2F0ZWQgPSB0YS0+cXVldWVfc2l6ZTsKKwkJICAgIH0KKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgLyogRW5hYmxlIHJlc2VsZWN0IGludGVycnVwdHMgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKworCQkgICAgLyogCisJCSAgICAgKiBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdCB0aGluZyB0byBkbyBoZXJlIGlzIDogCisJCSAgICAgKiAKKwkJICAgICAqIElmIHRoZSBjb21tYW5kIHRoYXQganVzdCBleGVjdXRlZCBpcyBOT1QgYSByZXF1ZXN0IAorCQkgICAgICogc2Vuc2UsIHRoZSBvYnZpb3VzIHRoaW5nIHRvIGRvIGlzIHRvIHNldCB0aGUgcmVzdWx0CisJCSAgICAgKiBjb2RlIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHN0b3JlZCBwYXJhbWV0ZXJzLgorCQkgICAgICogCisJCSAgICAgKiBJZiBpdCB3YXMgYSBSRVFVRVNUIFNFTlNFIGNvbW1hbmQsIHdlIG5lZWQgc29tZSB3YXkgdG8KKwkJICAgICAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgZmFpbHVyZSBjb2RlIG9mIHRoZSBvcmlnaW5hbAorCQkgICAgICogYW5kIHRoZSBmYWlsdXJlIGNvZGUgb2YgdGhlIFJFUVVFU1Qgc2Vuc2UgLSB0aGUgb2J2aW91cworCQkgICAgICogY2FzZSBpcyBzdWNjZXNzLCB3aGVyZSB3ZSBmYWxsIHRocm91Z2ggYW5kIGxlYXZlIHRoZQorCQkgICAgICogcmVzdWx0IGNvZGUgdW5jaGFuZ2VkLgorCQkgICAgICogCisJCSAgICAgKiBUaGUgbm9uLW9idmlvdXMgcGxhY2UgaXMgd2hlcmUgdGhlIFJFUVVFU1QgU0VOU0UgZmFpbGVkCisJCSAgICAgKi8KKworCQkgICAgaWYgKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKSAKKwkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7IAorCQkgICAgZWxzZSBpZiAoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSAhPSBHT09EKQorCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJICAgIAorI2lmZGVmIEFVVE9TRU5TRQorCQkgICAgaWYgKChjbWQtPmNtbmRbMF0gIT0gUkVRVUVTVF9TRU5TRSkgJiYgCisJCQkoc3RhdHVzX2J5dGUoY21kLT5TQ3AuU3RhdHVzKSA9PSBDSEVDS19DT05ESVRJT04pKSB7CisJCQlBU0VOX1BSSU5USygic2NzaSVkOiBwZXJmb3JtaW5nIHJlcXVlc3Qgc2Vuc2VcbiIsCisJCQkJICAgIEhPU1ROTyk7CisJCQljbWQtPmNtbmRbMF0gPSBSRVFVRVNUX1NFTlNFOworCQkJY21kLT5jbW5kWzFdICY9IDB4ZTA7CisJCQljbWQtPmNtbmRbMl0gPSAwOworCQkJY21kLT5jbW5kWzNdID0gMDsKKwkJCWNtZC0+Y21uZFs0XSA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisJCQljbWQtPmNtbmRbNV0gPSAwOworCQkJY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKGNtZC0+Y21uZFswXSk7CisKKwkJCWNtZC0+dXNlX3NnID0gMDsKKwkJCS8qIHRoaXMgaXMgaW5pdGlhbGl6ZWQgZnJvbSBpbml0aWFsaXplX1NDcCAKKwkJCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwkJCSovCisJCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gKGNoYXIgKikgY21kLT5zZW5zZV9idWZmZXI7CisJCQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCUxJU1QoY21kLGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJCQlORVhUKGNtZCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSBjbWQ7CisJCSAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJUVVfUFJJTlRLKCJzY3NpJWQ6IFJFUVVFU1QgU0VOU0UgYWRkZWQgdG8gaGVhZCBvZiAiCisJCQkJICAiaXNzdWUgcXVldWVcbiIsIEhfTk8oY21kKSk7CisJCSAgIH0gZWxzZQorI2VuZGlmIC8qIGRlZiBBVVRPU0VOU0UgKi8KKwkJICAgeworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwkJICAgICAgIGNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKwkJICAgICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJCSAgICB9CisKKwkJICAgIE5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwkJICAgIC8qIAorCQkgICAgICogUmVzdG9yZSBwaGFzZSBiaXRzIHRvIDAgc28gYW4gaW50ZXJydXB0ZWQgc2VsZWN0aW9uLCAKKwkJICAgICAqIGFyYml0cmF0aW9uIGNhbiByZXN1bWUuCisJCSAgICAgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKwkJICAgIAorCQkgICAgd2hpbGUgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpICYmICFob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJYmFycmllcigpOworCisJCSAgICBmYWxjb25fZG9udF9yZWxlYXNlLS07CisJCSAgICAvKiArK3JvbWFuOiBGb3IgRmFsY29uIFNDU0ksIHJlbGVhc2UgdGhlIGxvY2sgb24gdGhlCisJCSAgICAgKiBTVC1ETUEgaGVyZSBpZiBubyBvdGhlciBjb21tYW5kcyBhcmUgd2FpdGluZyBvbiB0aGUKKwkJICAgICAqIGRpc2Nvbm5lY3RlZCBxdWV1ZS4KKwkJICAgICAqLworCQkgICAgZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggaG9zdGRhdGEgKTsKKwkJICAgIHJldHVybjsKKwkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIC8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBzd2l0Y2ggKGhvc3RkYXRhLT5sYXN0X21lc3NhZ2UpIHsKKwkJICAgIGNhc2UgSEVBRF9PRl9RVUVVRV9UQUc6CisJCSAgICBjYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCQkgICAgY2FzZSBTSU1QTEVfUVVFVUVfVEFHOgorCQkJLyogVGhlIHRhcmdldCBvYnZpb3VzbHkgZG9lc24ndCBzdXBwb3J0IHRhZ2dlZAorCQkJICogcXVldWluZywgZXZlbiB0aG91Z2ggaXQgYW5ub3VuY2VkIHRoaXMgYWJpbGl0eSBpbgorCQkJICogaXRzIElOUVVJUlkgZGF0YSA/IT8gKG1heWJlIG9ubHkgdGhpcyBMVU4/KSBPaywKKwkJCSAqIGNsZWFyICd0YWdnZWRfc3VwcG9ydGVkJyBhbmQgbG9jayB0aGUgTFVOLCBzaW5jZQorCQkJICogdGhlIGNvbW1hbmQgaXMgdHJlYXRlZCBhcyB1bnRhZ2dlZCBmdXJ0aGVyIG9uLgorCQkJICovCisJCQljbWQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA9IDA7CisJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJY21kLT50YWcgPSBUQUdfTk9ORTsKKwkJCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCByZWplY3RlZCAiCisJCQkJICAgIlFVRVVFX1RBRyBtZXNzYWdlOyB0YWdnZWQgcXVldWluZyAiCisJCQkJICAgImRpc2FibGVkXG4iLAorCQkJCSAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgRElTQ09OTkVDVDoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJICAgIGNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ID0gMTsKKwkJICAgIExJU1QoY21kLGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpOworCQkgICAgTkVYVChjbWQpID0gaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IGNtZDsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIFFVX1BSSU5USygic2NzaSVkOiBjb21tYW5kIGZvciB0YXJnZXQgJWQgbHVuICVkIHdhcyAiCisJCQkgICAgICAibW92ZWQgZnJvbSBjb25uZWN0ZWQgdG8gdGhlICIKKwkJCSAgICAgICJkaXNjb25uZWN0ZWRfcXVldWVcbiIsIEhPU1ROTywgCisJCQkgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkgICAgLyogCisJCSAgICAgKiBSZXN0b3JlIHBoYXNlIGJpdHMgdG8gMCBzbyBhbiBpbnRlcnJ1cHRlZCBzZWxlY3Rpb24sIAorCQkgICAgICogYXJiaXRyYXRpb24gY2FuIHJlc3VtZS4KKwkJICAgICAqLworCQkgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgLyogV2FpdCBmb3IgYnVzIGZyZWUgdG8gYXZvaWQgbmFzdHkgdGltZW91dHMgKi8KKwkJICAgIHdoaWxlICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSAmJiAhaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwkJICAgIAliYXJyaWVyKCk7CisJCSAgICByZXR1cm47CisJCS8qIAorCQkgKiBUaGUgU0NTSSBkYXRhIHBvaW50ZXIgaXMgKklNUExJQ0lUTFkqIHNhdmVkIG9uIGEgZGlzY29ubmVjdAorCQkgKiBvcGVyYXRpb24sIGluIHZpb2xhdGlvbiBvZiB0aGUgU0NTSSBzcGVjIHNvIHdlIGNhbiBzYWZlbHkgCisJCSAqIGlnbm9yZSBTQVZFL1JFU1RPUkUgcG9pbnRlcnMgY2FsbHMuCisJCSAqCisJCSAqIFVuZm9ydHVuYXRlbHksIHNvbWUgZGlza3MgdmlvbGF0ZSB0aGUgU0NTSSBzcGVjIGFuZCAKKwkJICogZG9uJ3QgaXNzdWUgdGhlIHJlcXVpcmVkIFNBVkVfUE9JTlRFUlMgbWVzc2FnZSBiZWZvcmUKKwkJICogZGlzY29ubmVjdGluZywgYW5kIHdlIGhhdmUgdG8gYnJlYWsgc3BlYyB0byByZW1haW4gCisJCSAqIGNvbXBhdGlibGUuCisJCSAqLworCQljYXNlIFNBVkVfUE9JTlRFUlM6CisJCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIC8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBicmVhazsKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorLyogCisgKiBFeHRlbmRlZCBtZXNzYWdlcyBhcmUgc2VudCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCA6CisgKiBCeXRlIAkKKyAqIDAJCUVYVEVOREVEX01FU1NBR0UgPT0gMQorICogMQkJbGVuZ3RoIChpbmNsdWRlcyBvbmUgYnl0ZSBmb3IgY29kZSwgZG9lc24ndCAKKyAqCQlpbmNsdWRlIGZpcnN0IHR3byBieXRlcykKKyAqIDIgCQljb2RlCisgKiAzLi5sZW5ndGgrMQlhcmd1bWVudHMKKyAqCisgKiBTdGFydCB0aGUgZXh0ZW5kZWQgbWVzc2FnZSBidWZmZXIgd2l0aCB0aGUgRVhURU5ERURfTUVTU0FHRQorICogYnl0ZSwgc2luY2UgcHJpbnRfbXNnKCkgd2FudHMgdGhlIHdob2xlIHRoaW5nLiAgCisgKi8KKwkJICAgIGV4dGVuZGVkX21zZ1swXSA9IEVYVEVOREVEX01FU1NBR0U7CisJCSAgICAvKiBBY2NlcHQgZmlyc3QgYnl0ZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKwkJICAgIEVYVF9QUklOVEsoInNjc2klZDogcmVjZWl2aW5nIGV4dGVuZGVkIG1lc3NhZ2VcbiIsIEhPU1ROTyk7CisKKwkJICAgIGxlbiA9IDI7CisJCSAgICBkYXRhID0gZXh0ZW5kZWRfbXNnICsgMTsKKwkJICAgIHBoYXNlID0gUEhBU0VfTVNHSU47CisJCSAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCSAgICBFWFRfUFJJTlRLKCJzY3NpJWQ6IGxlbmd0aD0lZCwgY29kZT0weCUwMnhcbiIsIEhPU1ROTywKKwkJCSAgICAgICAoaW50KWV4dGVuZGVkX21zZ1sxXSwgKGludClleHRlbmRlZF9tc2dbMl0pOworCisJCSAgICBpZiAoIWxlbiAmJiBleHRlbmRlZF9tc2dbMV0gPD0gCisJCQkoc2l6ZW9mIChleHRlbmRlZF9tc2cpIC0gMSkpIHsKKwkJCS8qIEFjY2VwdCB0aGlyZCBieXRlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJCWxlbiA9IGV4dGVuZGVkX21zZ1sxXSAtIDE7CisJCQlkYXRhID0gZXh0ZW5kZWRfbXNnICsgMzsKKwkJCXBoYXNlID0gUEhBU0VfTVNHSU47CisKKwkJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJCUVYVF9QUklOVEsoInNjc2klZDogbWVzc2FnZSByZWNlaXZlZCwgcmVzaWR1YWwgJWRcbiIsCisJCQkJICAgSE9TVE5PLCBsZW4pOworCisJCQlzd2l0Y2ggKGV4dGVuZGVkX21zZ1syXSkgeworCQkJY2FzZSBFWFRFTkRFRF9TRFRSOgorCQkJY2FzZSBFWFRFTkRFRF9XRFRSOgorCQkJY2FzZSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSOgorCQkJY2FzZSBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWToKKwkJCSAgICB0bXAgPSAwOworCQkJfQorCQkgICAgfSBlbHNlIGlmIChsZW4pIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiBlcnJvciByZWNlaXZpbmcgIgorCQkJICAgICAgICJleHRlbmRlZCBtZXNzYWdlXG4iLCBIT1NUTk8pOworCQkJdG1wID0gMDsKKwkJICAgIH0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogZXh0ZW5kZWQgbWVzc2FnZSAiCisJCQkgICAgICAgImNvZGUgJTAyeCBsZW5ndGggJWQgaXMgdG9vIGxvbmdcbiIsCisJCQkgICAgICAgSE9TVE5PLCBleHRlbmRlZF9tc2dbMl0sIGV4dGVuZGVkX21zZ1sxXSk7CisJCQl0bXAgPSAwOworCQkgICAgfQorCQkvKiBGYWxsIHRocm91Z2ggdG8gcmVqZWN0IG1lc3NhZ2UgKi8KKworCQkvKiAKKyAgCQkgKiBJZiB3ZSBnZXQgc29tZXRoaW5nIHdlaXJkIHRoYXQgd2UgYXJlbid0IGV4cGVjdGluZywgCisgCQkgKiByZWplY3QgaXQuCisJCSAqLworCQlkZWZhdWx0OgorCQkgICAgaWYgKCF0bXApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IHJlamVjdGluZyBtZXNzYWdlICIsIEhPU1ROTyk7CisJCQlwcmludF9tc2cgKGV4dGVuZGVkX21zZyk7CisJCQlwcmludGsoIlxuIik7CisJCSAgICB9IGVsc2UgaWYgKHRtcCAhPSBFWFRFTkRFRF9NRVNTQUdFKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogcmVqZWN0aW5nIHVua25vd24gIgorCQkJICAgICAgICJtZXNzYWdlICUwMnggZnJvbSB0YXJnZXQgJWQsIGx1biAlZFxuIiwKKwkJCSAgICAgICBIT1NUTk8sIHRtcCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJICAgIGVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IHJlamVjdGluZyB1bmtub3duICIKKwkJCSAgICAgICAiZXh0ZW5kZWQgbWVzc2FnZSAiCisJCQkgICAgICAgImNvZGUgJTAyeCwgbGVuZ3RoICVkIGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsCisJCQkgICAgICAgSE9TVE5PLCBleHRlbmRlZF9tc2dbMV0sIGV4dGVuZGVkX21zZ1swXSwKKwkJCSAgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworICAgCisKKwkJICAgIG1zZ291dCA9IE1FU1NBR0VfUkVKRUNUOworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCQlJQ1JfQVNTRVJUX0FUTik7CisJCSAgICBicmVhazsKKwkJfSAvKiBzd2l0Y2ggKHRtcCkgKi8KKwkJYnJlYWs7CisJICAgIGNhc2UgUEhBU0VfTVNHT1VUOgorCQlsZW4gPSAxOworCQlkYXRhID0gJm1zZ291dDsKKwkJaG9zdGRhdGEtPmxhc3RfbWVzc2FnZSA9IG1zZ291dDsKKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQlpZiAobXNnb3V0ID09IEFCT1JUKSB7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisJCSAgICBjbWRfZnJlZV90YWcoIGNtZCApOworI2Vsc2UKKwkJICAgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworI2VuZGlmCisJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJICAgIGNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwkJICAgIGNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKwkJICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBob3N0ZGF0YSApOworCQkgICAgcmV0dXJuOworCQl9CisJCW1zZ291dCA9IE5PUDsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEhBU0VfQ01ET1VUOgorCQlsZW4gPSBjbWQtPmNtZF9sZW47CisJCWRhdGEgPSBjbWQtPmNtbmQ7CisJCS8qIAorCQkgKiBYWFggZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9uIG1hY2hpbmVzIHdpdGggYSAKKwkJICogUFNFVURPLURNQSBhcmNoaXRlY3R1cmUgd2Ugc2hvdWxkIHByb2JhYmx5IAorCQkgKiB1c2UgdGhlIGRtYSB0cmFuc2ZlciBmdW5jdGlvbi4gIAorCQkgKi8KKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgCisJCSAgICAmZGF0YSk7CisJCWJyZWFrOworCSAgICBjYXNlIFBIQVNFX1NUQVRJTjoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZ0bXA7CisJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJY21kLT5TQ3AuU3RhdHVzID0gdG1wOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRrKCJzY3NpJWQ6IHVua25vd24gcGhhc2VcbiIsIEhPU1ROTyk7CisJCU5DUl9QUklOVChOREVCVUdfQU5ZKTsKKwkgICAgfSAvKiBzd2l0Y2gocGhhc2UpICovCisJfSAvKiBpZiAodG1wICogU1JfUkVRKSAqLyAKKyAgICB9IC8qIHdoaWxlICgxKSAqLworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfcmVzZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBkb2VzIHJlc2VsZWN0aW9uLCBpbml0aWFsaXppbmcgdGhlIGluc3RhbmNlLT5jb25uZWN0ZWQgCisgKglmaWVsZCB0byBwb2ludCB0byB0aGUgU2NzaV9DbW5kIGZvciB3aGljaCB0aGUgSV9UX0wgb3IgSV9UX0xfUSAKKyAqCW5leHVzIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQsCisgKgkKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gdGhpcyBpbnN0YW5jZSBvZiB0aGUgTkNSNTM4MC4KKyAqCisgKi8KKworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgdW5zaWduZWQgY2hhciB0YXJnZXRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyIGx1biwgcGhhc2U7CisgICAgaW50IGxlbjsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKyAgICB1bnNpZ25lZCBjaGFyIHRhZzsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIgbXNnWzNdOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgU2NzaV9DbW5kICp0bXAgPSBOVUxMLCAqcHJldjsKKy8qICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCisKKyAgICAvKgorICAgICAqIERpc2FibGUgYXJiaXRyYXRpb24sIGV0Yy4gc2luY2UgdGhlIGhvc3QgYWRhcHRlciBvYnZpb3VzbHkKKyAgICAgKiBsb3N0LCBhbmQgdGVsbCBhbiBpbnRlcnJ1cHRlZCBOQ1I1MzgwX3NlbGVjdCgpIHRvIHJlc3RhcnQuCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBob3N0ZGF0YS0+cmVzdGFydF9zZWxlY3QgPSAxOworCisgICAgdGFyZ2V0X21hc2sgPSBOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKSAmIH4oaG9zdGRhdGEtPmlkX21hc2spOworCisgICAgUlNMX1BSSU5USygic2NzaSVkOiByZXNlbGVjdFxuIiwgSE9TVE5PKTsKKworICAgIC8qIAorICAgICAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCBvdXIgU0NTSSBJRCBpcyBvbiB0aGUgYnVzLAorICAgICAqIFNFTCBpcyB0cnVlIGFuZCBCU1kgd2FzIGZhbHNlIGZvciBhdCBsZWFzdCBvbmUgYnVzIHNldHRsZSBkZWxheQorICAgICAqICg0MDAgbnMpLgorICAgICAqCisgICAgICogV2UgbXVzdCBhc3NlcnQgQlNZIG91cnNlbHZlcywgdW50aWwgdGhlIHRhcmdldCBkcm9wcyB0aGUgU0VMCisgICAgICogc2lnbmFsLgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9CU1kpOworICAgIAorICAgIHdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9TRUwpOworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKyAgICAvKgorICAgICAqIFdhaXQgZm9yIHRhcmdldCB0byBnbyBpbnRvIE1TR0lOLgorICAgICAqLworCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSk7CisKKyAgICBsZW4gPSAxOworICAgIGRhdGEgPSBtc2c7CisgICAgcGhhc2UgPSBQSEFTRV9NU0dJTjsKKyAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisKKyAgICBpZiAoIShtc2dbMF0gJiAweDgwKSkgeworCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IGV4cGVjdGluZyBJREVOVElGWSBtZXNzYWdlLCBnb3QgIiwgSE9TVE5PKTsKKwlwcmludF9tc2cobXNnKTsKKwlkb19hYm9ydChpbnN0YW5jZSk7CisJcmV0dXJuOworICAgIH0KKyAgICBsdW4gPSAobXNnWzBdICYgMHgwNyk7CisKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKyAgICAvKiBJZiB0aGUgcGhhc2UgaXMgc3RpbGwgTVNHSU4sIHRoZSB0YXJnZXQgd2FudHMgdG8gc2VuZCBzb21lIG1vcmUKKyAgICAgKiBtZXNzYWdlcy4gSW4gY2FzZSBpdCBzdXBwb3J0cyB0YWdnZWQgcXVldWluZywgdGhpcyBpcyBwcm9iYWJseSBhCisgICAgICogU0lNUExFX1FVRVVFX1RBRyBmb3IgdGhlIElfVF9MX1EgbmV4dXMuCisgICAgICovCisgICAgdGFnID0gVEFHX05PTkU7CisgICAgaWYgKHBoYXNlID09IFBIQVNFX01TR0lOICYmIHNldHVwX3VzZV90YWdnZWRfcXVldWluZykgeworCS8qIEFjY2VwdCBwcmV2aW91cyBJREVOVElGWSBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgKTsKKwlsZW4gPSAyOworCWRhdGEgPSBtc2crMTsKKwlpZiAoIU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKSAmJgorCSAgICBtc2dbMV0gPT0gU0lNUExFX1FVRVVFX1RBRykKKwkgICAgdGFnID0gbXNnWzJdOworCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0IG1hc2sgJTAyeCwgbHVuICVkIHNlbnQgdGFnICVkIGF0ICIKKwkJICAgInJlc2VsZWN0aW9uXG4iLCBIT1NUTk8sIHRhcmdldF9tYXNrLCBsdW4sIHRhZyk7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogCisgICAgICogRmluZCB0aGUgY29tbWFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBJX1RfTCBvciBJX1RfTF9RICBuZXh1cyB3ZSAKKyAgICAgKiBqdXN0IHJlZXN0YWJsaXNoZWQsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgorICAgICAqLworCisgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUsIHByZXYgPSBOVUxMOyAKKwkgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSBORVhUKHRtcCkgKSB7CisJaWYgKCh0YXJnZXRfbWFzayA9PSAoMSA8PCB0bXAtPmRldmljZS0+aWQpKSAmJiAobHVuID09IHRtcC0+ZGV2aWNlLT5sdW4pCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJICAgICYmICh0YWcgPT0gdG1wLT50YWcpIAorI2VuZGlmCisJICAgICkgeworCSAgICAvKiArK2d1ZW50aGVyOiBwcmV2ZW50IHJhY2Ugd2l0aCBmYWxjb25fcmVsZWFzZV9sb2NrICovCisJICAgIGZhbGNvbl9kb250X3JlbGVhc2UrKzsKKwkgICAgaWYgKHByZXYpIHsKKwkJUkVNT1ZFKHByZXYsIE5FWFQocHJldiksIHRtcCwgTkVYVCh0bXApKTsKKwkJTkVYVChwcmV2KSA9IE5FWFQodG1wKTsKKwkgICAgfSBlbHNlIHsKKwkJUkVNT1ZFKC0xLCBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlLCB0bXAsIE5FWFQodG1wKSk7CisJCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBORVhUKHRtcCk7CisJICAgIH0KKwkgICAgTkVYVCh0bXApID0gTlVMTDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoIXRtcCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogd2FybmluZzogdGFyZ2V0IGJpdG1hc2sgJTAyeCBsdW4gJWQgIgorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkidGFnICVkICIKKyNlbmRpZgorCQkibm90IGluIGRpc2Nvbm5lY3RlZF9xdWV1ZS5cbiIsCisJCUhPU1ROTywgdGFyZ2V0X21hc2ssIGx1bgorI2lmZGVmIFNVUFBPUlRfVEFHUworCQksIHRhZworI2VuZGlmCisJCSk7CisJLyogCisJICogU2luY2Ugd2UgaGF2ZSBhbiBlc3RhYmxpc2hlZCBuZXh1cyB0aGF0IHdlIGNhbid0IGRvIGFueXRoaW5nCisJICogd2l0aCwgd2UgbXVzdCBhYm9ydCBpdC4gIAorCSAqLworCWRvX2Fib3J0KGluc3RhbmNlKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSB0bXA7CisgICAgUlNMX1BSSU5USygic2NzaSVkOiBuZXh1cyBlc3RhYmxpc2hlZCwgdGFyZ2V0ID0gJWQsIGx1biA9ICVkLCB0YWcgPSAlZFxuIiwKKwkgICAgICAgSE9TVE5PLCB0bXAtPmRldmljZS0+aWQsIHRtcC0+ZGV2aWNlLT5sdW4sIHRtcC0+dGFnKTsKKyAgICBmYWxjb25fZG9udF9yZWxlYXNlLS07Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBhYm9ydCBhIGNvbW1hbmQKKyAqCisgKiBJbnB1dHMgOiBjbWQgLSB0aGUgU2NzaV9DbW5kIHRvIGFib3J0LCBjb2RlIC0gY29kZSB0byBzZXQgdGhlIAorICogCWhvc3QgYnl0ZSBvZiB0aGUgcmVzdWx0IGZpZWxkIHRvLCBpZiB6ZXJvIERJRF9BQk9SVEVEIGlzIAorICoJdXNlZC4KKyAqCisgKiBSZXR1cm5zIDogMCAtIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKgorICogWFhYIC0gdGhlcmUgaXMgbm8gd2F5IHRvIGFib3J0IHRoZSBjb21tYW5kIHRoYXQgaXMgY3VycmVudGx5IAorICogCSBjb25uZWN0ZWQsIHlvdSBoYXZlIHRvIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgSWYgdGhpcyBpcyAKKyAqCSBhIHByb2JsZW0sIHdlIGNvdWxkIGltcGxlbWVudCBsb25nam1wKCkgLyBzZXRqbXAoKSwgc2V0am1wKCkKKyAqIAkgY2FsbGVkIHdoZXJlIHRoZSBsb29wIHN0YXJ0ZWQgaW4gTkNSNTM4MF9tYWluKCkuCisgKi8KKworc3RhdGljCitpbnQgTkNSNTM4MF9hYm9ydCAoU2NzaV9DbW5kICpjbWQpCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKKyAgICBTRVRVUF9IT1NUREFUQShpbnN0YW5jZSk7CisgICAgU2NzaV9DbW5kICp0bXAsICoqcHJldjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGFib3J0aW5nIGNvbW1hbmRcbiIsIEhPU1ROTyk7CisgICAgcHJpbnRfU2NzaV9DbW5kIChjbWQpOworCisgICAgTkNSNTM4MF9wcmludF9zdGF0dXMgKGluc3RhbmNlKTsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICBpZiAoIUlTX0FfVFQoKSAmJiAhZmFsY29uX2dvdF9sb2NrKQorCXByaW50ayhLRVJOX0VSUiAic2NzaSVkOiAhIUJJTkdPISEgRmFsY29uIGhhcyBubyBsb2NrIGluIE5DUjUzODBfYWJvcnRcbiIsCisJICAgICAgIEhPU1ROTyk7CisKKyAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydCBjYWxsZWQgYmFzciAweCUwMngsIHNyIDB4JTAyeFxuIiwgSE9TVE5PLAorCQlOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSwKKwkJTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpKTsKKworI2lmIDEKKy8qIAorICogQ2FzZSAxIDogSWYgdGhlIGNvbW1hbmQgaXMgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCwgCisgKiB3ZSdsbCBzZXQgdGhlIGFib3J0ZWQgZmxhZyBhbmQgcmV0dXJuIGNvbnRyb2wgc28gdGhhdCAKKyAqIGluZm9ybWF0aW9uIHRyYW5zZmVyIHJvdXRpbmUgY2FuIGV4aXQgY2xlYW5seS4KKyAqLworCisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgPT0gY21kKSB7CisKKwlBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydGluZyBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSE9TVE5PKTsKKy8qCisgKiBXZSBzaG91bGQgcGVyZm9ybSBCU1kgY2hlY2tpbmcsIGFuZCBtYWtlIHN1cmUgd2UgaGF2ZW4ndCBzbGlwcGVkCisgKiBpbnRvIEJVUyBGUkVFLgorICovCisKKy8qCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQVNTRVJUX0FUTik7ICovCisvKiAKKyAqIFNpbmNlIHdlIGNhbid0IGNoYW5nZSBwaGFzZXMgdW50aWwgd2UndmUgY29tcGxldGVkIHRoZSBjdXJyZW50IAorICogaGFuZHNoYWtlLCB3ZSBoYXZlIHRvIHNvdXJjZSBvciBzaW5rIGEgYnl0ZSBvZiBkYXRhIGlmIHRoZSBjdXJyZW50CisgKiBwaGFzZSBpcyBub3QgTVNHT1VULgorICovCisKKy8qIAorICogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIGV4ZWN1dGluZyBOQ1IgZHJpdmUgc28gd2UgY2FuIGNsZWFyIHRoZQorICogYWJvcnRlZCBmbGFnIGFuZCBnZXQgYmFjayBpbnRvIG91ciBtYWluIGxvb3AuCisgKi8gCisKKwlpZiAoZG9fYWJvcnQoaW5zdGFuY2UpID09IDApIHsKKwkgIGhvc3RkYXRhLT5hYm9ydGVkID0gMTsKKwkgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCSAgY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisJICBjbWRfZnJlZV90YWcoIGNtZCApOworI2Vsc2UKKwkgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworI2VuZGlmCisJICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICBjbWQtPnNjc2lfZG9uZShjbWQpOworCSAgZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggaG9zdGRhdGEgKTsKKwkgIHJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJfSBlbHNlIHsKKy8qCSAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAqLworCSAgcHJpbnRrKCJzY3NpJWQ6IGFib3J0IG9mIGNvbm5lY3RlZCBjb21tYW5kIGZhaWxlZCFcbiIsIEhPU1ROTyk7CisJICByZXR1cm4gU0NTSV9BQk9SVF9FUlJPUjsKKwl9IAorICAgfQorI2VuZGlmCisKKy8qIAorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gaXNzdWVkIHlldCwgd2Ugc2ltcGx5IHJlbW92ZSBpdCAKKyAqIAkgICAgZnJvbSB0aGUgaXNzdWUgcXVldWUuCisgKi8KKyAgICBmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSksIAorCXRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCXRtcDsgcHJldiA9IE5FWFRBRERSKHRtcCksIHRtcCA9IE5FWFQodG1wKSApCisJaWYgKGNtZCA9PSB0bXApIHsKKwkgICAgUkVNT1ZFKDUsICpwcmV2LCB0bXAsIE5FWFQodG1wKSk7CisJICAgICgqcHJldikgPSBORVhUKHRtcCk7CisJICAgIE5FWFQodG1wKSA9IE5VTEw7CisJICAgIHRtcC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IHJlbW92ZWQgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlLlxuIiwKKwkJCUhPU1ROTyk7CisJICAgIC8qIFRhZ2dlZCBxdWV1aW5nIG5vdGU6IG5vIHRhZyB0byBmcmVlIGhlcmUsIGhhc24ndCBiZWVuIGFzc2lnbmVkCisJICAgICAqIHlldC4uLiAqLworCSAgICB0bXAtPnNjc2lfZG9uZSh0bXApOworCSAgICBmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBob3N0ZGF0YSApOworCSAgICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCX0KKworLyogCisgKiBDYXNlIDMgOiBJZiBhbnkgY29tbWFuZHMgYXJlIGNvbm5lY3RlZCwgd2UncmUgZ29pbmcgdG8gZmFpbCB0aGUgYWJvcnQKKyAqCSAgICBhbmQgbGV0IHRoZSBoaWdoIGxldmVsIFNDU0kgZHJpdmVyIHJldHJ5IGF0IGEgbGF0ZXIgdGltZSBvciAKKyAqCSAgICBpc3N1ZSBhIHJlc2V0LgorICoKKyAqCSAgICBUaW1lb3V0cywgYW5kIHRoZXJlZm9yZSBhYm9ydGVkIGNvbW1hbmRzLCB3aWxsIGJlIGhpZ2hseSB1bmxpa2VseQorICogICAgICAgICAgYW5kIGhhbmRsaW5nIHRoZW0gY2xlYW5seSBpbiB0aGlzIHNpdHVhdGlvbiB3b3VsZCBtYWtlIHRoZSBjb21tb24KKyAqCSAgICBjYXNlIG9mIG5vcmVzZXRzIGxlc3MgZWZmaWNpZW50LCBhbmQgd291bGQgcG9sbHV0ZSBvdXIgY29kZS4gIFNvLAorICoJICAgIHdlIGZhaWwuCisgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IGZhaWxlZCwgY29tbWFuZCBjb25uZWN0ZWQuXG4iLCBIT1NUTk8pOworICAgICAgICByZXR1cm4gU0NTSV9BQk9SVF9TTk9PWkU7CisgICAgfQorCisvKgorICogQ2FzZSA0OiBJZiB0aGUgY29tbWFuZCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGVkIGZyb20gdGhlIGJ1cywgYW5kIAorICogCXRoZXJlIGFyZSBubyBjb25uZWN0ZWQgY29tbWFuZHMsIHdlIHJlY29ubmVjdCB0aGUgSV9UX0wgb3IgCisgKglJX1RfTF9RIG5leHVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZ28gaW50byBtZXNzYWdlIG91dCwgYW5kIHNlbmQgCisgKiAgICAgIGFuIGFib3J0IG1lc3NhZ2UuCisgKgorICogVGhpcyBjYXNlIGlzIGVzcGVjaWFsbHkgdWdseS4gSW4gb3JkZXIgdG8gcmVlc3RhYmxpc2ggdGhlIG5leHVzLCB3ZQorICogbmVlZCB0byBjYWxsIE5DUjUzODBfc2VsZWN0KCkuICBUaGUgZWFzaWVzdCB3YXkgdG8gaW1wbGVtZW50IHRoaXMgCisgKiBmdW5jdGlvbiB3YXMgdG8gYWJvcnQgaWYgdGhlIGJ1cyB3YXMgYnVzeSwgYW5kIGxldCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIHRyaWdnZXJlZCBvbiB0aGUgU0VMIGZvciByZXNlbGVjdCB0YWtlIGNhcmUgb2YgbG9zdCBhcmJpdHJhdGlvbnMKKyAqIHdoZXJlIG5lY2Vzc2FyeSwgbWVhbmluZyBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgZW5hYmxlZC4KKyAqCisgKiBXaGVuIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIHRoZSBxdWV1ZXMgbWF5IGNoYW5nZSAtIHNvIHdlIAorICogY2FuJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSBiZWZvcmUgc2VsZWN0aW5nIGl0CisgKiBiZWNhdXNlIHRoYXQgY291bGQgY2F1c2UgYSBmYWlsdXJlIGluIGhhc2hpbmcgdGhlIG5leHVzIGlmIHRoYXQgCisgKiBkZXZpY2UgcmVzZWxlY3RlZC4KKyAqIAorICogU2luY2UgdGhlIHF1ZXVlcyBtYXkgY2hhbmdlLCB3ZSBjYW4ndCB1c2UgdGhlIHBvaW50ZXJzIGZyb20gd2hlbiB3ZQorICogZmlyc3QgbG9jYXRlIGl0LgorICoKKyAqIFNvLCB3ZSBtdXN0IGZpcnN0IGxvY2F0ZSB0aGUgY29tbWFuZCwgYW5kIGlmIE5DUjUzODBfc2VsZWN0KCkKKyAqIHN1Y2NlZWRzLCB0aGVuIGlzc3VlIHRoZSBhYm9ydCwgcmVsb2NhdGUgdGhlIGNvbW1hbmQgYW5kIHJlbW92ZQorICogaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgorICovCisKKyAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOworCSB0bXAgPSBORVhUKHRtcCkpIAorICAgICAgICBpZiAoY21kID09IHRtcCkgeworICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydGluZyBkaXNjb25uZWN0ZWQgY29tbWFuZC5cbiIsIEhPU1ROTyk7CisgIAorICAgICAgICAgICAgaWYgKE5DUjUzODBfc2VsZWN0IChpbnN0YW5jZSwgY21kLCAoaW50KSBjbWQtPnRhZykpIAorCQlyZXR1cm4gU0NTSV9BQk9SVF9CVVNZOworCisJICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IG5leHVzIHJlZXN0YWJsaXNoZWQuXG4iLCBIT1NUTk8pOworCisJICAgIGRvX2Fib3J0IChpbnN0YW5jZSk7CisKKwkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSAgICBmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpLCAKKwkJdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworCQl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkgKQorCQkgICAgaWYgKGNtZCA9PSB0bXApIHsKKwkJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOworCQkgICAgKnByZXYgPSBORVhUKHRtcCk7CisJCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgdG1wLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCSAgICAvKiBXZSBtdXN0IHVubG9jayB0aGUgdGFnL0xVTiBpbW1lZGlhdGVseSBoZXJlLCBzaW5jZSB0aGUKKwkJICAgICAqIHRhcmdldCBnb2VzIHRvIEJVUyBGUkVFIGFuZCBkb2Vzbid0IHNlbmQgdXMgYW5vdGhlcgorCQkgICAgICogbWVzc2FnZSAoQ09NTUFORF9DT01QTEVURSBvciB0aGUgbGlrZSkKKwkJICAgICAqLworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2ZyZWVfdGFnKCB0bXAgKTsKKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkgICAgdG1wLT5zY3NpX2RvbmUodG1wKTsKKwkJICAgIGZhbGNvbl9yZWxlYXNlX2xvY2tfaWZfcG9zc2libGUoIGhvc3RkYXRhICk7CisJCSAgICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCQl9CisJfQorCisvKgorICogQ2FzZSA1IDogSWYgd2UgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgY29tbWFuZCB3YXMgbm90IGZvdW5kIGluIGFueSBvZiAKKyAqCSAgICB0aGUgcXVldWVzLgorICoKKyAqIFdlIHByb2JhYmx5IHJlYWNoZWQgdGhpcyBwb2ludCBiZWNhdXNlIG9mIGFuIHVubGlrZWx5IHJhY2UgY29uZGl0aW9uCisgKiBiZXR3ZWVuIHRoZSBjb21tYW5kIGNvbXBsZXRpbmcgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgYWJvcnRpb24gY29kZSwKKyAqIHNvIHdlIHdvbid0IHBhbmljLCBidXQgd2Ugd2lsbCBub3RpZnkgdGhlIHVzZXIgaW4gY2FzZSBzb21ldGhpbmcgcmVhbGx5CisgKiBicm9rZS4KKyAqLworCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHByaW50ayhLRVJOX0lORk8gInNjc2klZDogd2FybmluZyA6IFNDU0kgY29tbWFuZCBwcm9iYWJseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iCisgICAgICAgICAgIEtFUk5fSU5GTyAiICAgICAgICBiZWZvcmUgYWJvcnRpb25cbiIsIEhPU1ROTyk7IAorCisvKiBNYXliZSBpdCBpcyBzdWZmaWNpZW50IGp1c3QgdG8gcmVsZWFzZSB0aGUgU1QtRE1BIGxvY2suLi4gKGlmCisgKiBwb3NzaWJsZSBhdCBhbGwpIEF0IGxlYXN0LCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGxvY2sgY291bGQgYmUKKyAqIHJlbGVhc2VkIGFmdGVyIHRoZSBhYm9ydCwgaW4gY2FzZSBpdCBpcyBrZXB0IGR1ZSB0byBzb21lIGJ1Zy4KKyAqLworICAgIGZhbGNvbl9yZWxlYXNlX2xvY2tfaWZfcG9zc2libGUoIGhvc3RkYXRhICk7CisKKyAgICByZXR1cm4gU0NTSV9BQk9SVF9OT1RfUlVOTklORzsKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcmVzZXQgKFNjc2lfQ21uZCAqY21kKQorICogCisgKiBQdXJwb3NlIDogcmVzZXQgdGhlIFNDU0kgYnVzLgorICoKKyAqIFJldHVybnMgOiBTQ1NJX1JFU0VUX1dBS0VVUAorICoKKyAqLyAKKworc3RhdGljIGludCBOQ1I1MzgwX2J1c19yZXNldCggU2NzaV9DbW5kICpjbWQpCit7CisgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOworICAgIGludCAgICAgICAgICAgaTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmIDEKKyAgICBTY3NpX0NtbmQgKmNvbm5lY3RlZCwgKmRpc2Nvbm5lY3RlZF9xdWV1ZTsKKyNlbmRpZgorCisgICAgaWYgKCFJU19BX1RUKCkgJiYgIWZhbGNvbl9nb3RfbG9jaykKKwlwcmludGsoS0VSTl9FUlIgInNjc2klZDogISFCSU5HTyEhIEZhbGNvbiBoYXMgbm8gbG9jayBpbiBOQ1I1MzgwX3Jlc2V0XG4iLAorCSAgICAgICBIX05PKGNtZCkgKTsKKworICAgIE5DUjUzODBfcHJpbnRfc3RhdHVzIChjbWQtPmRldmljZS0+aG9zdCk7CisKKyAgICAvKiBnZXQgaW4gcGhhc2UgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworICAgIC8qIGFzc2VydCBSU1QgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9SU1QgKTsKKyAgICB1ZGVsYXkgKDQwKTsKKyAgICAvKiByZXNldCBOQ1IgcmVnaXN0ZXJzICovCisgICAgTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSApOworICAgIE5DUjUzODBfd3JpdGUoIE1PREVfUkVHLCBNUl9CQVNFICk7CisgICAgTkNSNTM4MF93cml0ZSggVEFSR0VUX0NPTU1BTkRfUkVHLCAwICk7CisgICAgTkNSNTM4MF93cml0ZSggU0VMRUNUX0VOQUJMRV9SRUcsIDAgKTsKKyAgICAvKiArK3JvbWFuOiByZXNldCBpbnRlcnJ1cHQgY29uZGl0aW9uISBvdGhlcndpc2Ugbm8gaW50ZXJydXB0cyBkb24ndCBnZXQKKyAgICAgKiB0aHJvdWdoIGFueW1vcmUgLi4uICovCisgICAgKHZvaWQpTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisjaWYgMSAvKiBYWFggU2hvdWxkIG5vdyBiZSBkb25lIGJ5IG1pZGxldmVsIGNvZGUsIGJ1dCBpdCdzIGJyb2tlbiBYWFggKi8KKyAgICAgIC8qIFhYWCBzZWUgYmVsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYWCAqLworCisgICAgLyogTVNjaDogb2xkLXN0eWxlIHJlc2V0OiBhY3R1YWxseSBhYm9ydCBhbGwgY29tbWFuZCBwcm9jZXNzaW5nIGhlcmUgKi8KKworICAgIC8qIEFmdGVyIHRoZSByZXNldCwgdGhlcmUgYXJlIG5vIG1vcmUgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBjb21tYW5kcworICAgICAqIGFuZCBubyBidXN5IHVuaXRzOyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHJlLWluc2VydGluZyB0aGUgY29tbWFuZHMKKyAgICAgKiBpbnRvIHRoZSBpc3N1ZV9xdWV1ZSAodmlhIHNjc2lfZG9uZSgpKSwgdGhlIGFib3J0ZWQgY29tbWFuZHMgYXJlCisgICAgICogcmVtZW1iZXJlZCBpbiBsb2NhbCB2YXJpYWJsZXMgZmlyc3QuCisgICAgICovCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGNvbm5lY3RlZCA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+Y29ubmVjdGVkOworICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworICAgIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgPSBOVUxMOworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGZyZWVfYWxsX3RhZ3MoKTsKKyNlbmRpZgorICAgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKyNpZmRlZiBSRUFMX0RNQQorICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKyNlbmRpZgorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIC8qIEluIG9yZGVyIHRvIHRlbGwgdGhlIG1pZC1sZXZlbCBjb2RlIHdoaWNoIGNvbW1hbmRzIHdlcmUgYWJvcnRlZCwgCisgICAgICogc2V0IHRoZSBjb21tYW5kIHN0YXR1cyB0byBESURfUkVTRVQgYW5kIGNhbGwgc2NzaV9kb25lKCkgISEhCisgICAgICogVGhpcyB1bHRpbWF0ZWx5IGFib3J0cyBwcm9jZXNzaW5nIG9mIHRoZXNlIGNvbW1hbmRzIGluIHRoZSBtaWQtbGV2ZWwuCisgICAgICovCisKKyAgICBpZiAoKGNtZCA9IGNvbm5lY3RlZCkpIHsKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGEgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhfTk8oY21kKSk7CisJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweGZmZmYpIHwgKERJRF9SRVNFVCA8PCAxNik7CisJY21kLT5zY3NpX2RvbmUoIGNtZCApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IChjbWQgPSBkaXNjb25uZWN0ZWRfcXVldWUpOyArK2kpIHsKKwlkaXNjb25uZWN0ZWRfcXVldWUgPSBORVhUKGNtZCk7CisJTkVYVChjbWQpID0gTlVMTDsKKwljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4ZmZmZikgfCAoRElEX1JFU0VUIDw8IDE2KTsKKwljbWQtPnNjc2lfZG9uZSggY21kICk7CisgICAgfQorICAgIGlmIChpID4gMCkKKwlBQlJUX1BSSU5USygic2NzaTogcmVzZXQgYWJvcnRlZCAlZCBkaXNjb25uZWN0ZWQgY29tbWFuZChzKVxuIiwgaSk7CisKKy8qIFRoZSBGYWxjb24gbG9jayBzaG91bGQgYmUgcmVsZWFzZWQgYWZ0ZXIgYSByZXNldC4uLgorICovCisvKiArK2d1ZW50aGVyOiBtb3ZlZCB0byBhdGFyaV9zY3NpX3Jlc2V0KCksIHRvIHByZXZlbnQgYSByYWNlIGJldHdlZW4KKyAqIHVubG9ja2luZyBhbmQgZW5hYmxpbmcgZG1hIGludGVycnVwdC4KKyAqLworLyogICAgZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggaG9zdGRhdGEgKTsqLworCisgICAgLyogc2luY2UgYWxsIGNvbW1hbmRzIGhhdmUgYmVlbiBleHBsaWNpdGx5IHRlcm1pbmF0ZWQsIHdlIG5lZWQgdG8gdGVsbAorICAgICAqIHRoZSBtaWRsZXZlbCBjb2RlIHRoYXQgdGhlIHJlc2V0IHdhcyBTVUNDRVNTRlVMLCBhbmQgdGhlcmUgaXMgbm8gCisgICAgICogbmVlZCB0byAnd2FrZSB1cCcgdGhlIGNvbW1hbmRzIGJ5IGEgcmVxdWVzdF9zZW5zZQorICAgICAqLworICAgIHJldHVybiBTQ1NJX1JFU0VUX1NVQ0NFU1MgfCBTQ1NJX1JFU0VUX0JVU19SRVNFVDsKKyNlbHNlIC8qIDEgKi8KKworICAgIC8qIE1TY2g6IG5ldy1zdHlsZSByZXNldCBoYW5kbGluZzogbGV0IHRoZSBtaWQtbGV2ZWwgZG8gd2hhdCBpdCBjYW4gKi8KKworICAgIC8qICsrZ3VlbnRoZXI6IE1JRC1MRVZFTCBJUyBTVElMTCBCUk9LRU4uCisgICAgICogTWlkLWxldmVsIGlzIHN1cHBvc2VkIHRvIHJlcXVldWUgYWxsIGNvbW1hbmRzIHRoYXQgd2VyZSBhY3RpdmUgb24gdGhlCisgICAgICogdmFyaW91cyBsb3ctbGV2ZWwgcXVldWVzLiBJbiBmYWN0IGl0IGRvZXMgdGhpcywgYnV0IHRoYXQncyBub3QgZW5vdWdoCisgICAgICogYmVjYXVzZSBhbGwgdGhlc2UgY29tbWFuZHMgYXJlIHN1YmplY3QgdG8gdGltZW91dC4gQW5kIGlmIGEgdGltZW91dAorICAgICAqIGhhcHBlbnMgZm9yIGFueSByZW1vdmVkIGNvbW1hbmQsICpfYWJvcnQoKSBpcyBjYWxsZWQgYnV0IGFsbCBxdWV1ZXMKKyAgICAgKiBhcmUgbm93IGVtcHR5LiBBYm9ydCB0aGVuIGdpdmVzIHVwIHRoZSBmYWxjb24gbG9jaywgd2hpY2ggaXMgZmF0YWwsCisgICAgICogc2luY2UgdGhlIG1pZC1sZXZlbCB3aWxsIHF1ZXVlIG1vcmUgY29tbWFuZHMgYW5kIG11c3QgaGF2ZSB0aGUgbG9jaworICAgICAqIChpdCdzIGFsbCBoYXBwZW5pbmcgaW5zaWRlIHRpbWVyIGludGVycnVwdCBoYW5kbGVyISEpLgorICAgICAqIEV2ZW4gd29yc2UsIGFib3J0IHdpbGwgcmV0dXJuIE5PVF9SVU5OSU5HIGZvciBhbGwgdGhvc2UgY29tbWFuZHMgbm90CisgICAgICogb24gYW55IHF1ZXVlLCBzbyB0aGV5IHdvbid0IGJlIHJldHJpZWQgLi4uCisgICAgICoKKyAgICAgKiBDb25jbHVzaW9uOiBlaXRoZXIgc2NzaS5jIGRpc2FibGVzIHRpbWVvdXQgZm9yIGFsbCByZXNldHRlZCBjb21tYW5kcworICAgICAqIGltbWVkaWF0ZWx5LCBvciB3ZSBsb3NlISAgQXMgb2YgbGludXgtMi4wLjIwIGl0IGRvZXNuJ3QuCisgICAgICovCisKKyAgICAvKiBBZnRlciB0aGUgcmVzZXQsIHRoZXJlIGFyZSBubyBtb3JlIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQgY29tbWFuZHMKKyAgICAgKiBhbmQgbm8gYnVzeSB1bml0czsgc28gY2xlYXIgdGhlIGxvdy1sZXZlbCBzdGF0dXMgaGVyZSB0byBhdm9pZCAKKyAgICAgKiBjb25mbGljdHMgd2hlbiB0aGUgbWlkLWxldmVsIGNvZGUgdHJpZXMgdG8gd2FrZSB1cCB0aGUgYWZmZWN0ZWQgCisgICAgICogY29tbWFuZHMhCisgICAgICovCisKKyAgICBpZiAoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKQorCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgaXNzdWVkIGNvbW1hbmQocylcbiIsIEhfTk8oY21kKSk7CisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpIAorCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgYSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSF9OTyhjbWQpKTsKKyAgICBpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSkKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGRpc2Nvbm5lY3RlZCBjb21tYW5kKHMpXG4iLCBIX05PKGNtZCkpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5VTEw7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgZnJlZV9hbGxfdGFncygpOworI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFJFQUxfRE1BCisgICAgaG9zdGRhdGEtPmRtYV9sZW4gPSAwOworI2VuZGlmCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgLyogd2UgZGlkIG5vIGNvbXBsZXRlIHJlc2V0IG9mIGFsbCBjb21tYW5kcywgc28gYSB3YWtldXAgaXMgcmVxdWlyZWQgKi8KKyAgICByZXR1cm4gU0NTSV9SRVNFVF9XQUtFVVAgfCBTQ1NJX1JFU0VUX0JVU19SRVNFVDsKKyNlbmRpZiAvKiAxICovCit9CisKKy8qIExvY2FsIFZhcmlhYmxlczogKi8KKy8qIHRhYi13aWR0aDogOCAgICAgKi8KKy8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jIGIvZHJpdmVycy9zY3NpL2F0YXJpX2RtYV9lbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyNjA0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogYXRhcmlfZG1hX2VtdWwuYyAtLSBUVCBTQ1NJIERNQSBlbXVsYXRvciBmb3IgdGhlIEhhZGVzLgorICoKKyAqIENvcHlyaWdodCAxOTk3IFdvdXQgS2xhcmVuIDxXLktsYXJlbkBpbnRlci5ubC5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1c2luZyB0aGUgSGFkZXMgVE9TIHNvdXJjZSBjb2RlIGFzIGEKKyAqIHJlZmVyZW5jZS4gVGhpcyBzb3VyY2UgY29kZSBjYW4gYmUgZm91bmQgb24gdGhlIGhvbWUgcGFnZQorICogb2YgTWVkdXNhIENvbXB1dGVyIFN5c3RlbXMuCisgKgorICogVmVyc2lvbiAwLjEsIDE5OTctMDktMjQuCisgKiAKKyAqIFRoaXMgY29kZSBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwuIEl0IGhhcyBvbmx5IGJlZW4KKyAqIHRlc3RlZCBvbiBhIEhhZGVzIHdpdGggYSA2ODA2MC4gSXQgbWlnaHQgbm90IHdvcmsgb24gYSBIYWRlcworICogd2l0aCBhIDY4MDQwLiBNYWtlIGJhY2t1cHMgb2YgeW91ciBoYXJkIGRyaXZlcyBiZWZvcmUgdXNpbmcKKyAqIHRoaXMgY29kZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBoYWRlc19kbWFfY3RybAkJKCoodW5zaWduZWQgY2hhciAqKSAweGZmZmY4NzE3KQorI2RlZmluZSBoYWRlc19wc2RtX3JlZwkJKCoodW5zaWduZWQgY2hhciAqKSAweGZmZmY4NzQxKQorCisjZGVmaW5lIFRSQU5TRkVSX1NJWkUJCTE2CisKK3N0cnVjdCBtNjgwNDBfZnJhbWUgeworCXVuc2lnbmVkIGxvbmcgIGVmZmFkZHI7ICAvKiBlZmZlY3RpdmUgYWRkcmVzcyAqLworCXVuc2lnbmVkIHNob3J0IHNzdzsgICAgICAvKiBzcGVjaWFsIHN0YXR1cyB3b3JkICovCisJdW5zaWduZWQgc2hvcnQgd2IzczsgICAgIC8qIHdyaXRlIGJhY2sgMyBzdGF0dXMgKi8KKwl1bnNpZ25lZCBzaG9ydCB3YjJzOyAgICAgLyogd3JpdGUgYmFjayAyIHN0YXR1cyAqLworCXVuc2lnbmVkIHNob3J0IHdiMXM7ICAgICAvKiB3cml0ZSBiYWNrIDEgc3RhdHVzICovCisJdW5zaWduZWQgbG9uZyAgZmFkZHI7ICAgIC8qIGZhdWx0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjNhOyAgICAgLyogd3JpdGUgYmFjayAzIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjNkOyAgICAgLyogd3JpdGUgYmFjayAzIGRhdGEgKi8KKwl1bnNpZ25lZCBsb25nICB3YjJhOyAgICAgLyogd3JpdGUgYmFjayAyIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjJkOyAgICAgLyogd3JpdGUgYmFjayAyIGRhdGEgKi8KKwl1bnNpZ25lZCBsb25nICB3YjFhOyAgICAgLyogd3JpdGUgYmFjayAxIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nICB3YjFkcGQwOyAgLyogd3JpdGUgYmFjayAxIGRhdGEvcHVzaCBkYXRhIDAqLworCXVuc2lnbmVkIGxvbmcgIHBkMTsgICAgICAvKiBwdXNoIGRhdGEgMSovCisJdW5zaWduZWQgbG9uZyAgcGQyOyAgICAgIC8qIHB1c2ggZGF0YSAyKi8KKwl1bnNpZ25lZCBsb25nICBwZDM7ICAgICAgLyogcHVzaCBkYXRhIDMqLworfTsKKworc3RhdGljIHZvaWQgd3JpdGViYWNrICh1bnNpZ25lZCBzaG9ydCB3YnMsIHVuc2lnbmVkIGxvbmcgd2JhLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB3YmQsIHZvaWQgKm9sZF9idXNlcnIpCit7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisJc3RhdGljIHZvaWQgKnNhdmVfYnVzZXJyOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlYy5sCSUldmJyLCUlYTBcblx0IgorCQkJICAgICAgIm1vdmUubAklMCw4KCUlYTApXG5cdCIKKwkJCSAgICAgIDoKKwkJCSAgICAgIDogInIiICgmJmJ1c19lcnJvcikKKwkJCSAgICAgIDogImEwIiApOworCisJc2F2ZV9idXNlcnIgPSBvbGRfYnVzZXJyOworCisJc2V0X2ZzIChNQUtFX01NX1NFRyh3YnMgJiBXQlRNXzA0MCkpOworCisJc3dpdGNoICh3YnMgJiBXQlNJWl8wNDApIHsKKwkgICAgY2FzZSBCQV9TSVpFX0JZVEU6CisJCXB1dF91c2VyICh3YmQgJiAweGZmLCAoY2hhciAqKXdiYSk7CisJCWJyZWFrOworCSAgICBjYXNlIEJBX1NJWkVfV09SRDoKKwkJcHV0X3VzZXIgKHdiZCAmIDB4ZmZmZiwgKHNob3J0ICopd2JhKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQkFfU0laRV9MT05HOgorCQlwdXRfdXNlciAod2JkLCAoaW50ICopd2JhKTsKKwkJYnJlYWs7CisJfQorCisJc2V0X2ZzIChmcyk7CisJcmV0dXJuOworCitidXNfZXJyb3I6CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXAubAklMCwyKCUlc3ApXG5cdCIKKwkJCSAgICAgICJiY3MucwkuanVtcF9vbGRcblx0IgorCQkJICAgICAgImNtcC5sCSUxLDIoJSVzcClcblx0IgorCQkJICAgICAgImJscy5zCS5yZXN0b3JlX29sZFxuIgorCQkJIi5qdW1wX29sZDpcblx0IgorCQkJICAgICAgIm1vdmUubAklMiwtKCUlc3ApXG5cdCIKKwkJCSAgICAgICJydHNcbiIKKwkJCSIucmVzdG9yZV9vbGQ6XG5cdCIKKwkJCSAgICAgICJtb3ZlLmwJJSVhMCwtKCUlc3ApXG5cdCIKKwkJCSAgICAgICJtb3ZlYy5sCSUldmJyLCUlYTBcblx0IgorCQkJICAgICAgIm1vdmUubAklMiw4KCUlYTApXG5cdCIKKwkJCSAgICAgICJtb3ZlLmwJKCUlc3ApKywlJWEwXG5cdCIKKwkJCSAgICAgICJydGVcblx0IgorCQkJICAgICAgOgorCQkJICAgICAgOiAiaSIgKHdyaXRlYmFjayksICJpIiAoJiZidXNfZXJyb3IpLAorCQkJICAgICAgICAibSIgKHNhdmVfYnVzZXJyKSApOworfQorCisvKgorICogc3RhdGljIGlubGluZSB2b2lkIHNldF9yZXN0ZGF0YV9yZWcodW5zaWduZWQgY2hhciAqY3VyX2FkZHIpCisgKgorICogU2V0IHRoZSByZXN0IGRhdGEgcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmVzdGRhdGFfcmVnKHVuc2lnbmVkIGNoYXIgKmN1cl9hZGRyKQoreworCWlmICgoKGxvbmcpIGN1cl9hZGRyICYgfjMpICE9IDApCisJCXR0X3Njc2lfZG1hLmRtYV9yZXN0ZGF0YSA9CisJCQkqKCh1bnNpZ25lZCBsb25nICopICgobG9uZykgY3VyX2FkZHIgJiB+MykpOworfQorCisvKgorICogdm9pZCBoYWRlc19kbWFfZW11bGF0b3IoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKKyAqIAorICogVGhpcyBjb2RlIGVtdWxhdGVzIFRUIFNDU0kgRE1BIG9uIHRoZSBIYWRlcy4KKyAqIAorICogTm90ZSB0aGUgZm9sbG93aW5nOgorICogCisgKiAxLiBXaGVuIHRoZXJlIGlzIG5vIGJ5dGUgYXZhaWxhYmxlIHRvIHJlYWQgZnJvbSB0aGUgU0NTSSBidXMsIG9yCisgKiAgICB3aGVuIGEgYnl0ZSBjYW5ub3QgeWV0IGJldCB3cml0dGVuIHRvIHRoZSBTQ1NJIGJ1cywgYSBidXMKKyAqICAgIGVycm9yIG9jY3VycyB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgcHNldWRvIERNQSBkYXRhCisgKiAgICByZWdpc3RlciAoaGFkZXNfcHNkbV9yZWcpLiBXZSBoYXZlIHRvIGNhdGNoIHRoaXMgYnVzIGVycm9yCisgKiAgICBhbmQgdHJ5IGFnYWluIHRvIHJlYWQgb3Igd3JpdGUgdGhlIGJ5dGUuIElmIGFmdGVyIHNldmVyYWwgdHJpZXMKKyAqICAgIHdlIHN0aWxsIGdldCBhIGJ1cyBlcnJvciwgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGxlZnQuIFdoZW4KKyAqICAgIHRoZSBieXRlIGNhbiBiZSByZWFkIG9yIHdyaXR0ZW4sIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcworICogICAgY2FsbGVkIGFnYWluLgorICogCisgKiAyLiBUaGUgU0NTSSBpbnRlcnJ1cHQgbXVzdCBiZSBkaXNhYmxlZCBpbiB0aGlzIGludGVycnVwdCBoYW5kbGVyLgorICogCisgKiAzLiBJZiB3ZSBzZXQgdGhlIEVPUCBzaWduYWwsIHRoZSBTQ1NJIGNvbnRyb2xsZXIgc3RpbGwgZXhwZWN0cyBvbmUKKyAqICAgIGJ5dGUgdG8gYmUgcmVhZCBvciB3cml0dGVuLiBUaGVyZWZvcmUgdGhlIGxhc3QgYnl0ZSBpcyB0cmFuc2ZlcnJlZAorICogICAgc2VwYXJhdGVseSwgYWZ0ZXIgc2V0dGluZyB0aGUgRU9QIHNpZ25hbC4KKyAqIAorICogNC4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGxlZnQsIHRoZSBhZGRyZXNzIHBvaW50ZXIgKHN0YXJ0X2FkZHIpIGlzCisgKiAgICBjb252ZXJ0ZWQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzLiBCZWNhdXNlIGl0IHBvaW50cyBvbmUgYnl0ZQorICogICAgZnVydGhlciB0aGFuIHRoZSBsYXN0IHRyYW5zZmVycmVkIGJ5dGUsIGl0IGNhbiBwb2ludCBvdXRzaWRlIHRoZQorICogICAgY3VycmVudCBwYWdlLiBJZiB2aXJ0X3RvX3BoeXMoKSBpcyBjYWxsZWQgd2l0aCB0aGlzIGFkZHJlc3Mgd2UKKyAqICAgIG1pZ2h0IGdldCBhbiBhY2Nlc3MgZXJyb3IuIFRoZXJlZm9yZSB2aXJ0X3RvX3BoeXMoKSBpcyBjYWxsZWQgd2l0aAorICogICAgc3RhcnRfYWRkciAtIDEgaWYgdGhlIGNvdW50IGhhcyByZWFjaGVkIHplcm8uIFRoZSByZXN1bHQgaXMKKyAqICAgIGluY3JlYXNlZCB3aXRoIG9uZS4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFkZXNfZG1hX2VtdWxhdG9yKGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJdW5zaWduZWQgbG9uZyBkbWFfYmFzZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGRtYV9jbnQgYXNtICgiZDMiKTsKKwlzdGF0aWMgbG9uZyBzYXZlX2J1c2VycjsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHNhdmVfc3AgYXNtICgiZDQiKTsKKwlyZWdpc3RlciBpbnQgdHJpZXMgYXNtICgiZDUiKTsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzdGFydF9hZGRyIGFzbSAoImEzIiksICplbmRfYWRkciBhc20gKCJhNCIpOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmVmZl9hZGRyOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBzZG1fcmVnOworCXVuc2lnbmVkIGxvbmcgcmVtOworCisJYXRhcmlfZGlzYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKKworCS8qCisJICogUmVhZCB0aGUgZG1hIGFkZHJlc3MgYW5kIGNvdW50IHJlZ2lzdGVycy4KKwkgKi8KKworCWRtYV9iYXNlID0gU0NTSV9ETUFfUkVBRF9QKGRtYV9hZGRyKTsKKwlkbWFfY250ID0gU0NTSV9ETUFfUkVBRF9QKGRtYV9jbnQpOworCisJLyoKKwkgKiBDaGVjayBpZiBETUEgaXMgc3RpbGwgZW5hYmxlZC4KKwkgKi8KKworCWlmICgodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAyKSA9PSAwKQorCXsKKwkJYXRhcmlfZW5hYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGRtYV9jbnQgPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX05PVElDRSAiRE1BIGVtdWxhdGlvbjogY291bnQgaXMgemVyby5cbiIpOworCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCisJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qCisJICogSW5zdGFsbCBuZXcgYnVzIGVycm9yIHJvdXRpbmUuCisJICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVjLmwJJSV2YnIsJSVhMFxuXHQiCisJCQkgICAgICAibW92ZS5sCTgoJSVhMCksJTBcblx0IgorCQkJICAgICAgIm1vdmUubAklMSw4KCUlYTApXG5cdCIKKwkJCSAgICAgIDogIj0mciIgKHNhdmVfYnVzZXJyKQorCQkJICAgICAgOiAiciIgKCYmc2NzaV9idXNfZXJyb3IpCisJCQkgICAgICA6ICJhMCIgKTsKKworCWhhZGVzX2RtYV9jdHJsICY9IDB4ZmM7CQkvKiBCdXMgZXJyb3IgYW5kIEVPUCBvZmYuICovCisKKwkvKgorCSAqIFNhdmUgdGhlIHN0YWNrIHBvaW50ZXIuCisJICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAklJXNwLCUwXG5cdCIKKwkJCSAgICAgIDogIj0mciIgKHNhdmVfc3ApICk7CisKKwl0cmllcyA9IDEwMDsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBidXMgZXJyb3JzLiAqLworCXN0YXJ0X2FkZHIgPSBwaHlzX3RvX3ZpcnQoZG1hX2Jhc2UpOworCWVuZF9hZGRyID0gc3RhcnRfYWRkciArIGRtYV9jbnQ7CisKK3Njc2lfbG9vcDoKKwlkbWFfY250LS07CisJcmVtID0gZG1hX2NudCAmIChUUkFOU0ZFUl9TSVpFIC0gMSk7CisJZG1hX2NudCAmPSB+KFRSQU5TRkVSX1NJWkUgLSAxKTsKKwlwc2RtX3JlZyA9ICZoYWRlc19wc2RtX3JlZzsKKworCWlmICh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpCS8qIFJlYWQgb3Igd3JpdGU/ICovCisJeworCQkvKgorCQkgKiBTQ1NJIHdyaXRlLiBBYm9ydCB3aGVuIGNvdW50IGlzIHplcm8uCisJCSAqLworCisJCXN3aXRjaCAocmVtKQorCQl7CisJCWNhc2UgMDoKKwkJCXdoaWxlIChkbWFfY250ID4gMCkKKwkJCXsKKwkJCQlkbWFfY250IC09IFRSQU5TRkVSX1NJWkU7CisKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDE1OgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgMTQ6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSAxMzoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDEyOgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgMTE6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSAxMDoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDk6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSA4OgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgNzoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDY6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSA1OgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgNDoKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQljYXNlIDM6CisJCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKKwkJY2FzZSAyOgorCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7CisJCWNhc2UgMToKKwkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOworCQkJfQorCQl9CisKKwkJaGFkZXNfZG1hX2N0cmwgfD0gMTsJLyogU2V0IEVPUC4gKi8KKwkJdWRlbGF5KDEwKTsKKwkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsJLyogRHVtbXkgYnl0ZS4gKi8KKwkJdHRfc2NzaV9kbWEuZG1hX2N0cmwgJj0gMHhmZDsJLyogRE1BIHJlYWR5LiAqLworCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBTQ1NJIHJlYWQuIEFib3J0IHdoZW4gY291bnQgaXMgemVyby4KKwkJICovCisKKwkJc3dpdGNoIChyZW0pCisJCXsKKwkJY2FzZSAwOgorCQkJd2hpbGUgKGRtYV9jbnQgPiAwKQorCQkJeworCQkJCWRtYV9jbnQgLT0gVFJBTlNGRVJfU0laRTsKKworCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgMTU6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSAxNDoKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDEzOgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgMTI6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSAxMToKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDEwOgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgOToKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDg6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSA3OgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgNjoKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDU6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSA0OgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCWNhc2UgMzoKKwkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQljYXNlIDI6CisJCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKKwkJY2FzZSAxOgorCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7CisJCQl9CisJCX0KKworCQloYWRlc19kbWFfY3RybCB8PSAxOwkvKiBTZXQgRU9QLiAqLworCQl1ZGVsYXkoMTApOworCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOworCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCisKKwkJc2V0X3Jlc3RkYXRhX3JlZyhzdGFydF9hZGRyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWRkciAhPSBlbmRfYWRkcikKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRE1BIGVtdWxhdGlvbjogRkFUQUw6IENvdW50IGlzIG5vdCB6ZXJvIGF0IGVuZCBvZiB0cmFuc2Zlci5cbiIpOworCisJZG1hX2NudCA9IGVuZF9hZGRyIC0gc3RhcnRfYWRkcjsKKworc2NzaV9lbmQ6CisJZG1hX2Jhc2UgPSAoZG1hX2NudCA9PSAwKSA/IHZpcnRfdG9fcGh5cyhzdGFydF9hZGRyIC0gMSkgKyAxIDogIAorCQkJCSAgICB2aXJ0X3RvX3BoeXMoc3RhcnRfYWRkcik7CisKKwlTQ1NJX0RNQV9XUklURV9QKGRtYV9hZGRyLCBkbWFfYmFzZSk7CisJU0NTSV9ETUFfV1JJVEVfUChkbWFfY250LCBkbWFfY250KTsKKworCS8qCisJICogUmVzdG9yZSBvbGQgYnVzIGVycm9yIHJvdXRpbmUuCisJICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVjLmwJJSV2YnIsJSVhMFxuXHQiCisJCQkgICAgICAibW92ZS5sCSUwLDgoJSVhMClcblx0IgorCQkJICAgICAgOgorCQkJICAgICAgOiAiciIgKHNhdmVfYnVzZXJyKQorCQkJICAgICAgOiAiYTAiICk7CisKKwlhdGFyaV9lbmFibGVfaXJxKElSUV9UVF9NRlBfU0NTSSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK3Njc2lfYnVzX2Vycm9yOgorCS8qCisJICogRmlyc3QgY2hlY2sgaWYgdGhlIGJ1cyBlcnJvciBpcyBjYXVzZWQgYnkgb3VyIGNvZGUuCisJICogSWYgbm90LCBjYWxsIHRoZSBvcmlnaW5hbCBoYW5kbGVyLgorCSAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXAubAklMCwyKCUlc3ApXG5cdCIKKwkJCSAgICAgICJiY3Mucwkub2xkX3ZlY3RvclxuXHQiCisJCQkgICAgICAiY21wLmwJJTEsMiglJXNwKVxuXHQiCisJCQkgICAgICAiYmxzLnMJLnNjc2lfYnVzZXJyXG4iCisJCQkiLm9sZF92ZWN0b3I6XG5cdCIKKwkJCSAgICAgICJtb3ZlLmwJJTIsLSglJXNwKVxuXHQiCisJCQkgICAgICAicnRzXG4iCisJCQkiLnNjc2lfYnVzZXJyOlxuXHQiCisJCQkgICAgICA6CisJCQkgICAgICA6ICJpIiAoJiZzY3NpX2xvb3ApLCAiaSIgKCYmc2NzaV9lbmQpLAorCQkJICAgICAgICAibSIgKHNhdmVfYnVzZXJyKSApOworCisJaWYgKENQVV9JU18wNjApCisJeworCQkvKgorCQkgKiBHZXQgZWZmZWN0aXZlIGFkZHJlc3MgYW5kIHJlc3RvcmUgdGhlIHN0YWNrLgorCQkgKi8KKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAk4KCUlc3ApLCUwXG5cdCIKKwkJCQkgICAgICAibW92ZS5sCSUxLCUlc3Bcblx0IgorCQkJCSAgICAgIDogIj1hJiIgKGVmZl9hZGRyKQorCQkJCSAgICAgIDogInIiIChzYXZlX3NwKSApOworCX0KKwllbHNlCisJeworCQlyZWdpc3RlciBzdHJ1Y3QgbTY4MDQwX2ZyYW1lICpmcmFtZTsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxlYQk4KCUlc3ApLCUwXG5cdCIKKwkJCQkgICAgICA6ICI9YSYiIChmcmFtZSkgKTsKKworCQlpZiAodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKQorCQl7CisJCQkvKgorCQkJICogQnVzIGVycm9yIHdoaWxlIHdyaXRpbmcuCisJCQkgKi8KKworCQkJaWYgKGZyYW1lLT53YjNzICYgV0JWXzA0MCkKKwkJCXsKKwkJCQlpZiAoZnJhbWUtPndiM2EgPT0gKGxvbmcpICZoYWRlc19wc2RtX3JlZykKKwkJCQkJc3RhcnRfYWRkci0tOworCQkJCWVsc2UKKwkJCQkJd3JpdGViYWNrKGZyYW1lLT53YjNzLCBmcmFtZS0+d2IzYSwKKwkJCQkJCSAgZnJhbWUtPndiM2QsICYmc2NzaV9idXNfZXJyb3IpOworCQkJfQorCisJCQlpZiAoZnJhbWUtPndiMnMgJiBXQlZfMDQwKQorCQkJeworCQkJCWlmIChmcmFtZS0+d2IyYSA9PSAobG9uZykgJmhhZGVzX3BzZG1fcmVnKQorCQkJCQlzdGFydF9hZGRyLS07CisJCQkJZWxzZQorCQkJCQl3cml0ZWJhY2soZnJhbWUtPndiMnMsIGZyYW1lLT53YjJhLAorCQkJCQkJICBmcmFtZS0+d2IyZCwgJiZzY3NpX2J1c19lcnJvcik7CisJCQl9CisKKwkJCWlmIChmcmFtZS0+d2IxcyAmIFdCVl8wNDApCisJCQl7CisJCQkJaWYgKGZyYW1lLT53YjFhID09IChsb25nKSAmaGFkZXNfcHNkbV9yZWcpCisJCQkJCXN0YXJ0X2FkZHItLTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBCdXMgZXJyb3Igd2hpbGUgcmVhZGluZy4KKwkJCSAqLworCisJCQlpZiAoZnJhbWUtPndiM3MgJiBXQlZfMDQwKQorCQkJCXdyaXRlYmFjayhmcmFtZS0+d2IzcywgZnJhbWUtPndiM2EsCisJCQkJCSAgZnJhbWUtPndiM2QsICYmc2NzaV9idXNfZXJyb3IpOworCQl9CisKKwkJZWZmX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBmcmFtZS0+ZmFkZHI7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlLmwJJTAsJSVzcFxuXHQiCisJCQkJICAgICAgOgorCQkJCSAgICAgIDogInIiIChzYXZlX3NwKSApOworCX0KKworCWRtYV9jbnQgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHI7CisKKwlpZiAoZWZmX2FkZHIgPT0gJmhhZGVzX3BzZG1fcmVnKQorCXsKKwkJLyoKKwkJICogQnVzIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIHBzZXVkbworCQkgKiBETUEgcmVnaXN0ZXIuIFRpbWUgb3V0LgorCQkgKi8KKworCQl0cmllcy0tOworCisJCWlmICh0cmllcyA8PSAwKQorCQl7CisJCQlpZiAoKHR0X3Njc2lfZG1hLmRtYV9jdHJsICYgMSkgPT0gMCkJLyogUmVhZCBvciB3cml0ZT8gKi8KKwkJCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOworCisJCQlpZiAoZG1hX2NudCA8PSAxKQorCQkJCXByaW50ayhLRVJOX0NSSVQgIkRNQSBlbXVsYXRpb246IEZhdGFsICIKKwkJCQkgICAgICAgImVycm9yIHdoaWxlICVzIHRoZSBsYXN0IGJ5dGUuXG4iLAorCQkJCSAgICAgICAodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKQorCQkJCSAgICAgICA/ICJ3cml0aW5nIiA6ICJyZWFkaW5nIik7CisKKwkJCWdvdG8gc2NzaV9lbmQ7CisJCX0KKwkJZWxzZQorCQkJZ290byBzY3NpX2xvb3A7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIEJ1cyBlcnJvciBkdXJpbmcgcHNldWRvIERNQSB0cmFuc2Zlci4KKwkJICogVGVybWluYXRlIHRoZSBETUEgdHJhbnNmZXIuCisJCSAqLworCisJCWhhZGVzX2RtYV9jdHJsIHw9IDM7CS8qIFNldCBFT1AgYW5kIGJ1cyBlcnJvci4gKi8KKwkJaWYgKCh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpID09IDApCS8qIFJlYWQgb3Igd3JpdGU/ICovCisJCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOworCQlnb3RvIHNjc2lfZW5kOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGFkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCkBAIC0wLDAgKzEsMTE2MyBAQAorLyoKKyAqIGF0YXJpX3Njc2kuYyAtLSBEZXZpY2UgZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgdGhlIEF0YXJpIGdlbmVyaWMgU0NTSSBwb3J0CisgKgorICogQ29weXJpZ2h0IDE5OTQgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorICoKKyAqICAgTG9vc2VseSBiYXNlZCBvbiB0aGUgd29yayBvZiBSb2JlcnQgRGUgVnJpZXMnIHRlYW0gYW5kIGFkZGVkOgorICogICAgLSB3b3JraW5nIHJlYWwgRE1BCisgKiAgICAtIEZhbGNvbiBzdXBwb3J0ICh1bnRlc3RlZCB5ZXQhKSAgICsrYmpvZXJuIGZpeGVkIGFuZCBub3cgaXQgd29ya3MKKyAqICAgIC0gbG90cyBvZiBleHRlbnNpb25zIGFuZCBidWcgZml4ZXMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGVzIGZvciBGYWxjb24gU0NTSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNpbmNlIHRoZSBGYWxjb24gU0NTSSB1c2VzIHRoZSBTVC1ETUEgY2hpcCwgdGhhdCBpcyBzaGFyZWQgYW1vbmcgICAgICAgKi8KKy8qIHNldmVyYWwgZGV2aWNlIGRyaXZlcnMsIGxvY2tpbmcgYW5kIHVubG9ja2luZyB0aGUgYWNjZXNzIHRvIHRoaXMgICAgICAgKi8KKy8qIGNoaXAgaXMgcmVxdWlyZWQuIEJ1dCBsb2NraW5nIGlzIG5vdCBwb3NzaWJsZSBmcm9tIGFuIGludGVycnVwdCwgICAgICAgKi8KKy8qIHNpbmNlIGl0IHB1dHMgdGhlIHByb2Nlc3MgdG8gc2xlZXAgaWYgdGhlIGxvY2sgaXMgbm90IGF2YWlsYWJsZS4gICAgICAgKi8KKy8qIFRoaXMgcHJldmVudHMgImxhdGUiIGxvY2tpbmcgb2YgdGhlIERNQSBjaGlwLCBpLmUuIGxvY2tpbmcgaXQganVzdCAgICAgKi8KKy8qIGJlZm9yZSB1c2luZyBpdCwgc2luY2UgaW4gY2FzZSBvZiBkaXNjb25uZWN0aW9uLXJlY29ubmVjdGlvbiAgICAgICAgICAgKi8KKy8qIGNvbW1hbmRzLCB0aGUgRE1BIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgcmVzZWxlY3Rpb24gaW50ZXJydXB0LiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFR3byBwb3NzaWJsZSBzY2hlbWVzIGZvciBTVC1ETUEtbG9ja2luZyB3b3VsZCBiZTogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxKSBUaGUgbG9jayBpcyB0YWtlbiBmb3IgZWFjaCBjb21tYW5kIHNlcGFyYXRlbHkgYW5kIGRpc2Nvbm5lY3RpbmcgICAgKi8KKy8qICAgICBpcyBmb3JiaWRkZW4gKGkuZS4gY2FuX3F1ZXVlID0gMSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyKSBUaGUgRE1BIGNoaXAgaXMgbG9ja2VkIHdoZW4gdGhlIGZpcnN0IGNvbW1hbmQgY29tZXMgaW4gYW5kICAgICAgICAgKi8KKy8qICAgICByZWxlYXNlZCB3aGVuIHRoZSBsYXN0IGNvbW1hbmQgaXMgZmluaXNoZWQgYW5kIGFsbCBxdWV1ZXMgYXJlICAgICAgKi8KKy8qICAgICBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBmaXJzdCBhbHRlcm5hdGl2ZSB3b3VsZCByZXN1bHQgaW4gYmFkIHBlcmZvcm1hbmNlLCBzaW5jZSB0aGUgICAgICAgKi8KKy8qIGludGVybGVhdmluZyBvZiBjb21tYW5kcyB3b3VsZCBub3QgYmUgdXNlZC4gVGhlIHNlY29uZCBpcyB1bmZhaXIgdG8gICAgKi8KKy8qIG90aGVyIGRyaXZlcnMgdXNpbmcgdGhlIFNULURNQSwgYmVjYXVzZSB0aGUgcXVldWVzIHdpbGwgc2VsZG9tIGJlICAgICAgKi8KKy8qIHRvdGFsbHkgZW1wdHkgaWYgdGhlcmUgaXMgYSBsb3Qgb2YgZGlzayB0cmFmZmljLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZvciB0aGlzIHJlYXNvbnMgSSBkZWNpZGVkIHRvIGVtcGxveSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZTogICAgICAgICAgKi8KKy8qICAtIEZpcnN0LCB3ZSBnaXZlIHVwIHRoZSBsb2NrIGV2ZXJ5IHRpbWUgd2UgY2FuIChmb3IgZmFpcm5lc3MpLCB0aGlzICAgICovCisvKiAgICBtZWFucyBldmVyeSB0aW1lIGEgY29tbWFuZCBmaW5pc2hlcyBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGNvbW1hbmRzICovCisvKiAgICBvbiB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgLSBJZiB0aGVyZSBhcmUgb3RoZXJzIHdhaXRpbmcgdG8gbG9jayB0aGUgRE1BIGNoaXAsIHdlIHN0b3AgICAgICAgICAgICovCisvKiAgICBpc3N1aW5nIGNvbW1hbmRzLCBpLmUuIG1vdmluZyB0aGVtIG9udG8gdGhlIGlzc3VlIHF1ZXVlLiAgICAgICAgICAgKi8KKy8qICAgIEJlY2F1c2Ugb2YgdGhhdCwgdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSB3aWxsIHJ1biBlbXB0eSBpbiBhICAgICAgICAgKi8KKy8qICAgIHdoaWxlLiBJbnN0ZWFkIHdlIGdvIHRvIHNsZWVwIG9uIGEgJ2ZhaXJuZXNzX3F1ZXVlJy4gICAgICAgICAgICAgICAgKi8KKy8qICAtIElmIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbGwgcHJvY2Vzc2VzIHdhaXRpbmcgb24gdGhlIGZhaXJuZXNzICAgICAgKi8KKy8qICAgIHF1ZXVlIHdpbGwgYmUgd29rZW4uIFRoZSBmaXJzdCBvZiB0aGVtIHRyaWVzIHRvIHJlLWxvY2sgdGhlIERNQSwgICAgICovCisvKiAgICB0aGUgb3RoZXJzIHdhaXQgZm9yIHRoZSBmaXJzdCB0byBmaW5pc2ggdGhpcyB0YXNrLiBBZnRlciB0aGF0LCAgICAgICovCisvKiAgICB0aGV5IGNhbiBhbGwgcnVuIG9uIGFuZCBkbyB0aGVpciBjb21tYW5kcy4uLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHNvdW5kcyBjb21wbGljYXRlZCAoYW5kIGl0IGlzIGl0IDotKCksIGJ1dCBpdCBzZWVtcyB0byBiZSBhICAgICAgICovCisvKiBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBmYWlybmVzcyBhbmQgcGVyZm9ybWFuY2U6IEFzIGxvbmcgYXMgbm8gb25lICAgICAqLworLyogZWxzZSB3YW50cyB0byB3b3JrIHdpdGggdGhlIFNULURNQSBjaGlwLCBTQ1NJIGNhbiBnbyBhbG9uZyBhcyAgICAgICAgICAqLworLyogdXN1YWwuIElmIG5vdyBzb21lb25lIGVsc2UgY29tZXMsIHRoaXMgYmVoYXZpb3VyIGlzIGNoYW5nZWQgdG8gYSAgICAgICAqLworLyogImZhaXJuZXNzIG1vZGUiOiBqdXN0IGFscmVhZHkgaW5pdGlhdGVkIGNvbW1hbmRzIGFyZSBmaW5pc2hlZCBhbmQgICAgICAqLworLyogdGhlbiB0aGUgbG9jayBpcyByZWxlYXNlZC4gVGhlIG90aGVyIG9uZSB3YWl0aW5nIHdpbGwgcHJvYmFibHkgd2luICAgICAqLworLyogdGhlIHJhY2UgZm9yIGxvY2tpbmcgdGhlIERNQSwgc2luY2UgaXQgd2FzIHdhaXRpbmcgZm9yIGxvbmdlci4gQW5kICAgICAqLworLyogYWZ0ZXIgaXQgaGFzIGZpbmlzaGVkLCBTQ1NJIGNhbiBnbyBhaGVhZCBhZ2Fpbi4gRmluYWxseTogSSBob3BlIEkgICAgICAqLworLyogaGF2ZSBub3QgcHJvZHVjZWQgYW55IGRlYWRsb2NrIHBvc3NpYmlsaXRpZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIE5ERUJVRyAoMCkKKworI2RlZmluZSBOREVCVUdfQUJPUlQJMHg4MDAwMDAKKyNkZWZpbmUgTkRFQlVHX1RBR1MJMHgxMDAwMDAwCisjZGVmaW5lIE5ERUJVR19NRVJHSU5HCTB4MjAwMDAwMAorCisjZGVmaW5lIEFVVE9TRU5TRQorLyogRm9yIHRoZSBBdGFyaSB2ZXJzaW9uLCB1c2Ugb25seSBwb2xsZWQgSU8gb3IgUkVBTF9ETUEgKi8KKyNkZWZpbmUJUkVBTF9ETUEKKy8qIFN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmc/IChvbiBkZXZpY2VzIHRoYXQgYXJlIGFibGUgdG8uLi4gOi0pICovCisjZGVmaW5lCVNVUFBPUlRfVEFHUworI2RlZmluZQlNQVhfVEFHUyAzMgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImF0YXJpX3Njc2kuaCIKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNkZWZpbmUJSVNfQV9UVCgpCUFUQVJJSFdfUFJFU0VOVChUVF9TQ1NJKQorCisjZGVmaW5lCVNDU0lfRE1BX1dSSVRFX1AoZWx0LHZhbCkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIHYgPSB2YWw7CQkJCVwKKwkJdHRfc2NzaV9kbWEuZWx0IyNfbG8gPSB2ICYgMHhmZjsJCVwKKwkJdiA+Pj0gODsJCQkJCVwKKwkJdHRfc2NzaV9kbWEuZWx0IyNfbG1kID0gdiAmIDB4ZmY7CQlcCisJCXYgPj49IDg7CQkJCQlcCisJCXR0X3Njc2lfZG1hLmVsdCMjX2htZCA9IHYgJiAweGZmOwkJXAorCQl2ID4+PSA4OwkJCQkJXAorCQl0dF9zY3NpX2RtYS5lbHQjI19oaSA9IHYgJiAweGZmOwkJXAorCX0gd2hpbGUoMCkKKworI2RlZmluZQlTQ1NJX0RNQV9SRUFEX1AoZWx0KQkJCQkJXAorCSgoKCgoKCh1bnNpZ25lZCBsb25nKXR0X3Njc2lfZG1hLmVsdCMjX2hpIDw8IDgpIHwJXAorCSAgICAgKHVuc2lnbmVkIGxvbmcpdHRfc2NzaV9kbWEuZWx0IyNfaG1kKSA8PCA4KSB8CVwKKwkgICAodW5zaWduZWQgbG9uZyl0dF9zY3NpX2RtYS5lbHQjI19sbWQpIDw8IDgpIHwJXAorCSAodW5zaWduZWQgbG9uZyl0dF9zY3NpX2RtYS5lbHQjI19sbykKKworCitzdGF0aWMgaW5saW5lIHZvaWQgU0NTSV9ETUFfU0VUQURSKHVuc2lnbmVkIGxvbmcgYWRyKQoreworCXN0X2RtYS5kbWFfbG8gPSAodW5zaWduZWQgY2hhcilhZHI7CisJTUZQREVMQVkoKTsKKwlhZHIgPj49IDg7CisJc3RfZG1hLmRtYV9tZCA9ICh1bnNpZ25lZCBjaGFyKWFkcjsKKwlNRlBERUxBWSgpOworCWFkciA+Pj0gODsKKwlzdF9kbWEuZG1hX2hpID0gKHVuc2lnbmVkIGNoYXIpYWRyOworCU1GUERFTEFZKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBTQ1NJX0RNQV9HRVRBRFIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKwlhZHIgPSBzdF9kbWEuZG1hX2xvOworCU1GUERFTEFZKCk7CisJYWRyIHw9IChzdF9kbWEuZG1hX21kICYgMHhmZikgPDwgODsKKwlNRlBERUxBWSgpOworCWFkciB8PSAoc3RfZG1hLmRtYV9oaSAmIDB4ZmYpIDw8IDE2OworCU1GUERFTEFZKCk7CisJcmV0dXJuIGFkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEVOQUJMRV9JUlEodm9pZCkKK3sKKwlpZiAoSVNfQV9UVCgpKQorCQlhdGFyaV9lbmFibGVfaXJxKElSUV9UVF9NRlBfU0NTSSk7CisJZWxzZQorCQlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfRlNDU0kpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRElTQUJMRV9JUlEodm9pZCkKK3sKKwlpZiAoSVNfQV9UVCgpKQorCQlhdGFyaV9kaXNhYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOworCWVsc2UKKwkJYXRhcmlfZGlzYWJsZV9pcnEoSVJRX01GUF9GU0NTSSk7Cit9CisKKworI2RlZmluZSBIT1NUREFUQV9ETUFMRU4JCSgoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopIFwKKwkJCQkoYXRhcmlfc2NzaV9ob3N0LT5ob3N0ZGF0YSkpLT5kbWFfbGVuKQorCisvKiBUaW1lIChpbiBqaWZmaWVzKSB0byB3YWl0IGFmdGVyIGEgcmVzZXQ7IHRoZSBTQ1NJIHN0YW5kYXJkIGNhbGxzIGZvciAyNTBtcywKKyAqIHdlIHVzdWFsbHkgZG8gMC41cyB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLiBCdXQgVG9zaGliYSBDRC1ST01zIG9uY2UgbW9yZQorICogbmVlZCB0ZW4gdGltZXMgdGhlIHN0YW5kYXJkIHZhbHVlLi4uICovCisjaWZuZGVmIENPTkZJR19BVEFSSV9TQ1NJX1RPU0hJQkFfREVMQVkKKyNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCisjZWxzZQorI2RlZmluZQlBRlRFUl9SRVNFVF9ERUxBWQkoNSpIWi8yKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgUkVBTF9ETUEKK3N0YXRpYyBpbnQgc2NzaV9kbWFfaXNfaWdub3JlZF9idXNlcnIoIHVuc2lnbmVkIGNoYXIgZG1hX3N0YXQgKTsKK3N0YXRpYyB2b2lkIGF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCB2b2lkICk7CitzdGF0aWMgbG9uZyBhdGFyaV9zY3NpX2RtYV9yZXNpZHVhbCggc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgKTsKK3N0YXRpYyBpbnQgZmFsY29uX2NsYXNzaWZ5X2NtZCggU2NzaV9DbW5kICpjbWQgKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF0YXJpX2RtYV94ZmVyX2xlbiggdW5zaWduZWQgbG9uZyB3YW50ZWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3NpX0NtbmQgKmNtZCwgaW50IHdyaXRlX2ZsYWcgKTsKKyNlbmRpZgorc3RhdGljIGlycXJldHVybl90IHNjc2lfdHRfaW50ciggaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9mYWxjb25faW50ciggaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgdm9pZCBmYWxjb25fcmVsZWFzZV9sb2NrX2lmX3Bvc3NpYmxlKCBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ZGF0YSApOworc3RhdGljIHZvaWQgZmFsY29uX2dldF9sb2NrKCB2b2lkICk7CisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfUkVTRVRfQk9PVAorc3RhdGljIHZvaWQgYXRhcmlfc2NzaV9yZXNldF9ib290KCB2b2lkICk7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0YXJpX3Njc2lfdHRfcmVnX3JlYWQoIHVuc2lnbmVkIGNoYXIgcmVnICk7CitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX3R0X3JlZ193cml0ZSggdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXRhcmlfc2NzaV9mYWxjb25fcmVnX3JlYWQoIHVuc2lnbmVkIGNoYXIgcmVnICk7CitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfd3JpdGUoIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICphdGFyaV9zY3NpX2hvc3QgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKCphdGFyaV9zY3NpX3JlZ19yZWFkKSggdW5zaWduZWQgY2hhciByZWcgKTsKK3N0YXRpYyB2b2lkICgqYXRhcmlfc2NzaV9yZWdfd3JpdGUpKCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSApOworCisjaWZkZWYgUkVBTF9ETUEKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWF0YXJpX2RtYV9yZXNpZHVhbCwgYXRhcmlfZG1hX3N0YXJ0YWRkcjsKK3N0YXRpYyBzaG9ydAkJYXRhcmlfZG1hX2FjdGl2ZTsKKy8qIHBvaW50ZXIgdG8gdGhlIGRyaWJibGUgYnVmZmVyICovCitzdGF0aWMgY2hhcgkJKmF0YXJpX2RtYV9idWZmZXIgPSBOVUxMOworLyogcHJlY2FsY3VsYXRlZCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkcmliYmxlIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJYXRhcmlfZG1hX3BoeXNfYnVmZmVyOworLyogIT0gMCB0ZWxscyB0aGUgRmFsY29uIGludCBoYW5kbGVyIHRvIGNvcHkgZGF0YSBmcm9tIHRoZSBkcmliYmxlIGJ1ZmZlciAqLworc3RhdGljIGNoYXIJCSphdGFyaV9kbWFfb3JpZ19hZGRyOworLyogc2l6ZSBvZiB0aGUgZHJpYmJsZSBidWZmZXI7IDRrIHNlZW1zIGVub3VnaCwgc2luY2UgdGhlIEZhbGNvbiBjYW5ub3QgdXNlCisgKiBzY2F0dGVyLWdhdGhlciBhbnl3YXksIHNvIG1vc3QgdHJhbnNmZXJzIGFyZSAxMDI0IGJ5dGUgb25seS4gSW4gdGhlIHJhcmUKKyAqIGNhc2VzIHdoZXJlIHJlcXVlc3RzIHRvIHBoeXNpY2FsIGNvbnRpZ3VvdXMgYnVmZmVycyBoYXZlIGJlZW4gbWVyZ2VkLCB0aGlzCisgKiByZXF1ZXN0IGlzIDw9IDRrIChvbmUgcGFnZSkuIFNvIEkgZG9uJ3QgdGhpbmsgd2UgaGF2ZSB0byBzcGxpdCB0cmFuc2ZlcnMKKyAqIGp1c3QgZHVlIHRvIHRoaXMgYnVmZmVyIHNpemUuLi4KKyAqLworI2RlZmluZQlTVFJBTV9CVUZGRVJfU0laRQkoNDA5NikKKy8qIG1hc2sgZm9yIGFkZHJlc3MgYml0cyB0aGF0IGNhbid0IGJlIHVzZWQgd2l0aCB0aGUgU1QtRE1BICovCitzdGF0aWMgdW5zaWduZWQgbG9uZwlhdGFyaV9kbWFfc3RyYW1fbWFzazsKKyNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIGF0YXJpX2RtYV9zdHJhbV9tYXNrKSA9PSAwKQorLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGN1dCBmcm9tIGEgdHJhbnNmZXIgdG8gaGFuZGxlIE5DUiBvdmVycnVucyAqLworc3RhdGljIGludCBhdGFyaV9yZWFkX292ZXJydW5zID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50IHNldHVwX2Nhbl9xdWV1ZSA9IC0xOworTU9EVUxFX1BBUk0oc2V0dXBfY2FuX3F1ZXVlLCAiaSIpOworc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOworTU9EVUxFX1BBUk0oc2V0dXBfY21kX3Blcl9sdW4sICJpIik7CitzdGF0aWMgaW50IHNldHVwX3NnX3RhYmxlc2l6ZSA9IC0xOworTU9EVUxFX1BBUk0oc2V0dXBfc2dfdGFibGVzaXplLCAiaSIpOworI2lmZGVmIFNVUFBPUlRfVEFHUworc3RhdGljIGludCBzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSAtMTsKK01PRFVMRV9QQVJNKHNldHVwX3VzZV90YWdnZWRfcXVldWluZywgImkiKTsKKyNlbmRpZgorc3RhdGljIGludCBzZXR1cF9ob3N0aWQgPSAtMTsKK01PRFVMRV9QQVJNKHNldHVwX2hvc3RpZCwgImkiKTsKKworCisjaWYgZGVmaW5lZChDT05GSUdfVFRfRE1BX0VNVUwpCisjaW5jbHVkZSAiYXRhcmlfZG1hX2VtdWwuYyIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChSRUFMX0RNQSkKKworc3RhdGljIGludCBzY3NpX2RtYV9pc19pZ25vcmVkX2J1c2VyciggdW5zaWduZWQgY2hhciBkbWFfc3RhdCApCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZwlhZGRyID0gU0NTSV9ETUFfUkVBRF9QKCBkbWFfYWRkciApLCBlbmRfYWRkcjsKKworCWlmIChkbWFfc3RhdCAmIDB4MDEpIHsKKworCQkvKiBBIGJ1cyBlcnJvciBoYXBwZW5zIHdoZW4gRE1BLWluZyBmcm9tIHRoZSBsYXN0IHBhZ2Ugb2YgYQorCQkgKiBwaHlzaWNhbCBtZW1vcnkgY2h1bmsgKERNQSBwcmVmZXRjaCEpLCBidXQgdGhhdCBkb2Vzbid0IGh1cnQuCisJCSAqIENoZWNrIGZvciB0aGlzIGNhc2U6CisJCSAqLworCQkKKwkJZm9yKCBpID0gMDsgaSA8IG02OGtfbnVtX21lbW9yeTsgKytpICkgeworCQkJZW5kX2FkZHIgPSBtNjhrX21lbW9yeVtpXS5hZGRyICsKKwkJCQltNjhrX21lbW9yeVtpXS5zaXplOworCQkJaWYgKGVuZF9hZGRyIDw9IGFkZHIgJiYgYWRkciA8PSBlbmRfYWRkciArIDQpCisJCQkJcmV0dXJuKCAxICk7CisJCX0KKwl9CisJcmV0dXJuKCAwICk7Cit9CisKKworI2lmIDAKKy8qIERlYWQgY29kZS4uLiB3YXNuJ3QgY2FsbGVkIGFueXdheSA6LSkgYW5kIGNhdXNlcyBzb21lIHRyb3VibGUsIGJlY2F1c2UgYXQKKyAqIGVuZC1vZi1ETUEsIGJvdGggU0NTSSBpbnRzIGFyZSB0cmlnZ2VyZWQgc2ltdWx0YW5lb3VzbHksIHNvIHRoZSBOQ1IgaW50IGhhcworICogdG8gY2xlYXIgdGhlIERNQSBpbnQgcGVuZGluZyBiaXQgYmVmb3JlIGl0IGFsbG93cyBvdGhlciBsZXZlbCA2IGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfZG1hX2J1c2VyciAoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwl1bnNpZ25lZCBjaGFyCWRtYV9zdGF0ID0gdHRfc2NzaV9kbWEuZG1hX2N0cmw7CisKKwkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiBhIE5DUiBpbnRlcnJ1cHQgaXMgcGVuZGluZy4gUHJvYmFibHkgaXQncyBqdXN0CisJICogbWFza2VkLi4uICovCisJaWYgKGF0YXJpX2lycV9wZW5kaW5nKCBJUlFfVFRfTUZQX1NDU0kgKSkKKwkJcmV0dXJuOworCQorCXByaW50aygiQmFkIFNDU0kgRE1BIGludGVycnVwdCEgZG1hX2FkZHI9MHglMDhseCBkbWFfc3RhdD0lMDJ4IGRtYV9jbnQ9JTA4bHhcbiIsCisJICAgICAgIFNDU0lfRE1BX1JFQURfUChkbWFfYWRkciksIGRtYV9zdGF0LCBTQ1NJX0RNQV9SRUFEX1AoZG1hX2NudCkpOworCWlmIChkbWFfc3RhdCAmIDB4ODApIHsKKwkJaWYgKCFzY3NpX2RtYV9pc19pZ25vcmVkX2J1c2VyciggZG1hX3N0YXQgKSkKKwkJCXByaW50ayggIlNDU0kgRE1BIGJ1cyBlcnJvciAtLSBiYWQgRE1BIHByb2dyYW1taW5nIVxuIiApOworCX0KKwllbHNlIHsKKwkJLyogVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgd2UgbmV2ZXIgc2hvdWxkIGdldCB0byB0aGlzIHBvaW50LAorCQkgKiBzaW5jZSBib3RoIGludGVycnVwdHMgYXJlIHRyaWdnZXJlZCBzaW11bHRhbmVvdXNseSBhbmQgdGhlIDUzODAKKwkJICogaW50IGhhcyBoaWdoZXIgcHJpb3JpdHkuIFdoZW4gdGhpcyBpcnEgaXMgaGFuZGxlZCwgdGhhdCBETUEKKwkJICogaW50ZXJydXB0IGlzIGNsZWFyZWQuIFNvIGEgd2FybmluZyBtZXNzYWdlIGlzIHByaW50ZWQgaGVyZS4KKwkJICovCisJCXByaW50ayggIlNDU0kgRE1BIGludHIgPz8gLS0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIVxuIiApOworCX0KK30KKyNlbmRpZgorCisjZW5kaWYKKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV90dF9pbnRyIChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworI2lmZGVmIFJFQUxfRE1BCisJaW50IGRtYV9zdGF0OworCisJZG1hX3N0YXQgPSB0dF9zY3NpX2RtYS5kbWFfY3RybDsKKworCUlOVF9QUklOVEsoInNjc2klZDogTkNSNTM4MCBpbnRlcnJ1cHQsIERNQSBzdGF0dXMgPSAlMDJ4XG4iLAorCQkgICBhdGFyaV9zY3NpX2hvc3QtPmhvc3Rfbm8sIGRtYV9zdGF0ICYgMHhmZik7CisKKwkvKiBMb29rIGlmIGl0IHdhcyB0aGUgRE1BIHRoYXQgaGFzIGludGVycnVwdGVkOiBGaXJzdCBwb3NzaWJpbGl0eQorCSAqIGlzIHRoYXQgYSBidXMgZXJyb3Igb2NjdXJyZWQuLi4KKwkgKi8KKwlpZiAoZG1hX3N0YXQgJiAweDgwKSB7CisJCWlmICghc2NzaV9kbWFfaXNfaWdub3JlZF9idXNlcnIoIGRtYV9zdGF0ICkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0NTSSBETUEgY2F1c2VkIGJ1cyBlcnJvciBuZWFyIDB4JTA4bHhcbiIsCisJCQkgICAgICAgU0NTSV9ETUFfUkVBRF9QKGRtYV9hZGRyKSk7CisJCQlwcmludGsoS0VSTl9DUklUICJTQ1NJIERNQSBidXMgZXJyb3IgLS0gYmFkIERNQSBwcm9ncmFtbWluZyEiKTsKKwkJfQorCX0KKworCS8qIElmIHRoZSBETUEgaXMgYWN0aXZlIGJ1dCBub3QgZmluaXNoZWQsIHdlIGhhdmUgdGhlIGNhc2UKKwkgKiB0aGF0IHNvbWUgb3RoZXIgNTM4MCBpbnRlcnJ1cHQgb2NjdXJyZWQgd2l0aGluIHRoZSBETUEgdHJhbnNmZXIuCisJICogVGhpcyBtZWFucyB3ZSBoYXZlIHJlc2lkdWFsIGJ5dGVzLCBpZiB0aGUgZGVzaXJlZCBlbmQgYWRkcmVzcworCSAqIGlzIG5vdCB5ZXQgcmVhY2hlZC4gTWF5YmUgd2UgaGF2ZSB0byBmZXRjaCBzb21lIGJ5dGVzIGZyb20gdGhlCisJICogcmVzdCBkYXRhIHJlZ2lzdGVyLCB0b28uIFRoZSByZXNpZHVhbCBtdXN0IGJlIGNhbGN1bGF0ZWQgZnJvbQorCSAqIHRoZSBhZGRyZXNzIHBvaW50ZXIsIG5vdCB0aGUgY291bnRlciByZWdpc3RlciwgYmVjYXVzZSBvbmx5IHRoZQorCSAqIGFkZHIgcmVnIGNvdW50cyBieXRlcyBub3QgeWV0IHdyaXR0ZW4gYW5kIHBlbmRpbmcgaW4gdGhlIHJlc3QKKwkgKiBkYXRhIHJlZyEKKwkgKi8KKwlpZiAoKGRtYV9zdGF0ICYgMHgwMikgJiYgIShkbWFfc3RhdCAmIDB4NDApKSB7CisJCWF0YXJpX2RtYV9yZXNpZHVhbCA9IEhPU1REQVRBX0RNQUxFTiAtIChTQ1NJX0RNQV9SRUFEX1AoIGRtYV9hZGRyICkgLQorCQkJCQkJCQkJCQkJYXRhcmlfZG1hX3N0YXJ0YWRkcik7CisKKwkJRE1BX1BSSU5USygiU0NTSSBETUE6IFRoZXJlIGFyZSAlbGQgcmVzaWR1YWwgYnl0ZXMuXG4iLAorCQkJICAgYXRhcmlfZG1hX3Jlc2lkdWFsKTsKKworCQlpZiAoKHNpZ25lZCBpbnQpYXRhcmlfZG1hX3Jlc2lkdWFsIDwgMCkKKwkJCWF0YXJpX2RtYV9yZXNpZHVhbCA9IDA7CisJCWlmICgoZG1hX3N0YXQgJiAxKSA9PSAwKSB7CisJCQkvKiBBZnRlciByZWFkIG9wZXJhdGlvbnMsIHdlIG1heWJlIGhhdmUgdG8KKwkJCSAgIHRyYW5zcG9ydCBzb21lIHJlc3QgYnl0ZXMgKi8KKwkJCWF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBUaGVyZSBzZWVtcyB0byBiZSBhIG5hc3R5IGJ1ZyBpbiBzb21lIFNDU0ktRE1BL05DUgorCQkJICAgY29tYmluYXRpb25zOiBJZiBhIHRhcmdldCBkaXNjb25uZWN0cyB3aGlsZSBhIHdyaXRlCisJCQkgICBvcGVyYXRpb24gaXMgZ29pbmcgb24sIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIG9mIHRoZQorCQkJICAgRE1BIG1heSBiZSBhIGZldyBieXRlcyBmYXJlciB0aGFuIGl0IGFjdHVhbGx5IHJlYWQuCisJCQkgICBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byBETUEgcHJlZmV0Y2hpbmcgYW5kIGEgZGVsYXkKKwkJCSAgIGJldHdlZW4gRE1BIGFuZCBOQ1IuICBFeHBlcmltZW50cyBzaG93ZWQgdGhhdCB0aGUKKwkJCSAgIGRtYV9hZGRyIGlzIDkgYnl0ZXMgdG8gaGlnaCwgYnV0IHRoaXMgY291bGQgdmFyeS4KKwkJCSAgIFRoZSBwcm9ibGVtIGlzLCB0aGF0IHRoZSByZXNpZHVhbCBpcyB0aHVzIGNhbGN1bGF0ZWQKKwkJCSAgIHdyb25nIGFuZCB0aGUgbmV4dCB0cmFuc2ZlciB3aWxsIHN0YXJ0IGJlaGluZCB3aGVyZQorCQkJICAgaXQgc2hvdWxkLiAgU28gd2Ugcm91bmQgdXAgdGhlIHJlc2lkdWFsIHRvIHRoZSBuZXh0CisJCQkgICBtdWx0aXBsZSBvZiBhIHNlY3RvciBzaXplLCBpZiBpdCBpc24ndCBhbHJlYWR5IGEKKwkJCSAgIG11bHRpcGxlIGFuZCB0aGUgb3JpZ2luYWxseSBleHBlY3RlZCB0cmFuc2ZlciBzaXplCisJCQkgICB3YXMuICBUaGUgbGF0dGVyIGNvbmRpdGlvbiBpcyB0aGVyZSB0byBlbnN1cmUgdGhhdAorCQkJICAgdGhlIGNvcnJlY3Rpb24gaXMgdGFrZW4gb25seSBmb3IgInJlYWwiIGRhdGEKKwkJCSAgIHRyYW5zZmVycyBhbmQgbm90IGZvciwgZS5nLiwgdGhlIHBhcmFtZXRlcnMgb2Ygc29tZQorCQkJICAgb3RoZXIgY29tbWFuZC4gIFRoZXNlIHNob3VsZG4ndCBkaXNjb25uZWN0IGFueXdheS4KKwkJCSAgICovCisJCQlpZiAoYXRhcmlfZG1hX3Jlc2lkdWFsICYgMHgxZmYpIHsKKwkJCQlETUFfUFJJTlRLKCJTQ1NJIERNQTogRE1BIGJ1ZyBjb3JyZWN0ZWQsICIKKwkJCQkJICAgImRpZmZlcmVuY2UgJWxkIGJ5dGVzXG4iLAorCQkJCQkgICA1MTIgLSAoYXRhcmlfZG1hX3Jlc2lkdWFsICYgMHgxZmYpKTsKKwkJCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAoYXRhcmlfZG1hX3Jlc2lkdWFsICsgNTExKSAmIH4weDFmZjsKKwkJCX0KKwkJfQorCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IDA7CisJfQorCisJLyogSWYgdGhlIERNQSBpcyBmaW5pc2hlZCwgZmV0Y2ggdGhlIHJlc3QgYnl0ZXMgYW5kIHR1cm4gaXQgb2ZmICovCisJaWYgKGRtYV9zdGF0ICYgMHg0MCkgeworCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAwOworCQlpZiAoKGRtYV9zdGF0ICYgMSkgPT0gMCkKKwkJCWF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCk7CisJCXR0X3Njc2lfZG1hLmRtYV9jdHJsID0gMDsKKwl9CisKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCQorCU5DUjUzODBfaW50ciAoMCwgMCwgMCk7CisKKyNpZiAwCisJLyogVG8gYmUgc3VyZSB0aGUgaW50IGlzIG5vdCBtYXNrZWQgKi8KKwlhdGFyaV9lbmFibGVfaXJxKCBJUlFfVFRfTUZQX1NDU0kgKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9mYWxjb25faW50ciAoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyNpZmRlZiBSRUFMX0RNQQorCWludCBkbWFfc3RhdDsKKworCS8qIFR1cm4gb2ZmIERNQSBhbmQgc2VsZWN0IHNlY3RvciBjb3VudGVyIHJlZ2lzdGVyIGJlZm9yZQorCSAqIGFjY2Vzc2luZyB0aGUgc3RhdHVzIHJlZ2lzdGVyIChBdGFyaSByZWNvbW1lbmRhdGlvbiEpCisJICovCisJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTA7CisJZG1hX3N0YXQgPSBzdF9kbWEuZG1hX21vZGVfc3RhdHVzOworCisJLyogQml0IDAgaW5kaWNhdGVzIHNvbWUgZXJyb3IgaW4gdGhlIERNQSBwcm9jZXNzLi4uIGRvbid0IGtub3cKKwkgKiB3aGF0IGhhcHBlbmVkIGV4YWN0bHkgKG5vIGZ1cnRoZXIgZG9jdSkuCisJICovCisJaWYgKCEoZG1hX3N0YXQgJiAweDAxKSkgeworCQkvKiBETUEgZXJyb3IgKi8KKwkJcHJpbnRrKEtFUk5fQ1JJVCAiU0NTSSBETUEgZXJyb3IgbmVhciAweCUwOGx4IVxuIiwgU0NTSV9ETUFfR0VUQURSKCkpOworCX0KKworCS8qIElmIHRoZSBETUEgd2FzIGFjdGl2ZSwgYnV0IG5vdyBiaXQgMSBpcyBub3QgY2xlYXIsIGl0IGlzIHNvbWUKKwkgKiBvdGhlciA1MzgwIGludGVycnVwdCB0aGF0IGZpbmlzaGVzIHRoZSBETUEgdHJhbnNmZXIuIFdlIGhhdmUgdG8KKwkgKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZXNpZHVhbCBieXRlcyBhbmQgZ2l2ZSBhIHdhcm5pbmcgaWYKKwkgKiBieXRlcyBhcmUgc3R1Y2sgaW4gdGhlIFNULURNQSBmaWZvICh0aGVyZSdzIG5vIHdheSB0byByZWFjaCB0aGVtISkKKwkgKi8KKwlpZiAoYXRhcmlfZG1hX2FjdGl2ZSAmJiAoZG1hX3N0YXQgJiAweDAyKSkgeworCQl1bnNpZ25lZCBsb25nCXRyYW5zZmVycmVkOworCisJCXRyYW5zZmVycmVkID0gU0NTSV9ETUFfR0VUQURSKCkgLSBhdGFyaV9kbWFfc3RhcnRhZGRyOworCQkvKiBUaGUgU1QtRE1BIGFkZHJlc3MgaXMgaW5jcmVtZW50ZWQgaW4gMi1ieXRlIHN0ZXBzLCBidXQgdGhlCisJCSAqIGRhdGEgYXJlIHdyaXR0ZW4gb25seSBpbiAxNi1ieXRlIGNodW5rcy4gSWYgdGhlIG51bWJlciBvZgorCQkgKiB0cmFuc2ZlcnJlZCBieXRlcyBpcyBub3QgZGl2aXNpYmxlIGJ5IDE2LCB0aGUgcmVtYWluZGVyIGlzCisJCSAqIGxvc3Qgc29tZXdoZXJlIGluIG91dGVyIHNwYWNlLgorCQkgKi8KKwkJaWYgKHRyYW5zZmVycmVkICYgMTUpCisJCQlwcmludGsoS0VSTl9FUlIgIlNDU0kgRE1BIGVycm9yOiAlbGQgYnl0ZXMgbG9zdCBpbiAiCisJCQkgICAgICAgIlNULURNQSBmaWZvXG4iLCB0cmFuc2ZlcnJlZCAmIDE1KTsKKworCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSBIT1NUREFUQV9ETUFMRU4gLSB0cmFuc2ZlcnJlZDsKKwkJRE1BX1BSSU5USygiU0NTSSBETUE6IFRoZXJlIGFyZSAlbGQgcmVzaWR1YWwgYnl0ZXMuXG4iLAorCQkJICAgYXRhcmlfZG1hX3Jlc2lkdWFsKTsKKwl9CisJZWxzZQorCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAwOworCWF0YXJpX2RtYV9hY3RpdmUgPSAwOworCisJaWYgKGF0YXJpX2RtYV9vcmlnX2FkZHIpIHsKKwkJLyogSWYgdGhlIGRyaWJibGUgYnVmZmVyIHdhcyB1c2VkIG9uIGEgcmVhZCBvcGVyYXRpb24sIGNvcHkgdGhlIERNQS1lZAorCQkgKiBkYXRhIHRvIHRoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCQkgKi8KKwkJbWVtY3B5KGF0YXJpX2RtYV9vcmlnX2FkZHIsIHBoeXNfdG9fdmlydChhdGFyaV9kbWFfc3RhcnRhZGRyKSwKKwkJICAgICAgIEhPU1REQVRBX0RNQUxFTiAtIGF0YXJpX2RtYV9yZXNpZHVhbCk7CisJCWF0YXJpX2RtYV9vcmlnX2FkZHIgPSBOVUxMOworCX0KKworI2VuZGlmIC8qIFJFQUxfRE1BICovCisKKwlOQ1I1MzgwX2ludHIgKDAsIDAsIDApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisjaWZkZWYgUkVBTF9ETUEKK3N0YXRpYyB2b2lkIGF0YXJpX3Njc2lfZmV0Y2hfcmVzdGJ5dGVzKCB2b2lkICkKK3sKKwlpbnQgbnI7CisJY2hhciAqc3JjLCAqZHN0OworCXVuc2lnbmVkIGxvbmcgcGh5c19kc3Q7CisKKwkvKiBmZXRjaCByZXN0IGJ5dGVzIGluIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwlwaHlzX2RzdCA9IFNDU0lfRE1BX1JFQURfUChkbWFfYWRkcik7CisJbnIgPSBwaHlzX2RzdCAmIDM7CisJaWYgKG5yKSB7CisJCS8qIHRoZXJlIGFyZSAnbnInIGJ5dGVzIGxlZnQgZm9yIHRoZSBsYXN0IGxvbmcgYWRkcmVzcworCQkgICBiZWZvcmUgdGhlIERNQSBwb2ludGVyICovCisJCXBoeXNfZHN0IF49IG5yOworCQlETUFfUFJJTlRLKCJTQ1NJIERNQTogdGhlcmUgYXJlICVkIHJlc3QgYnl0ZXMgZm9yIHBoeXMgYWRkciAweCUwOGx4IiwKKwkJCSAgIG5yLCBwaHlzX2RzdCk7CisJCS8qIFRoZSBjb250ZW50IG9mIHRoZSBETUEgcG9pbnRlciBpcyBhIHBoeXNpY2FsIGFkZHJlc3MhICAqLworCQlkc3QgPSBwaHlzX3RvX3ZpcnQocGh5c19kc3QpOworCQlETUFfUFJJTlRLKCIgPSB2aXJ0IGFkZHIgJXBcbiIsIGRzdCk7CisJCWZvciAoc3JjID0gKGNoYXIgKikmdHRfc2NzaV9kbWEuZG1hX3Jlc3RkYXRhOyBuciAhPSAwOyAtLW5yKQorCQkJKmRzdCsrID0gKnNyYysrOworCX0KK30KKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCisKK3N0YXRpYyBpbnQgZmFsY29uX2dvdF9sb2NrID0gMDsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChmYWxjb25fZmFpcm5lc3Nfd2FpdCk7CitzdGF0aWMgaW50IGZhbGNvbl90cnlpbmdfbG9jayA9IDA7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZmFsY29uX3RyeV93YWl0KTsKK3N0YXRpYyBpbnQgZmFsY29uX2RvbnRfcmVsZWFzZSA9IDA7CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgdGhlIGxvY2sgb24gdGhlIERNQSBjaGlwIGlmIHRoZXJlIGlzIG5vCisgKiBjb25uZWN0ZWQgY29tbWFuZCBhbmQgdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSBpcyBlbXB0eS4gT24KKyAqIHJlbGVhc2luZywgaW5zdGFuY2VzIG9mIGZhbGNvbl9nZXRfbG9jayBhcmUgYXdva2VuLCB0aGF0IHB1dAorICogdGhlbXNlbHZlcyB0byBzbGVlcCBmb3IgZmFpcm5lc3MuIFRoZXkgY2FuIG5vdyB0cnkgdG8gZ2V0IHRoZSBsb2NrCisgKiBhZ2FpbiAoYnV0IG90aGVycyB3YWl0aW5nIGxvbmdlciBtb3JlIHByb2JhYmx5IHdpbGwgd2luKS4KKyAqLworCitzdGF0aWMgdm9pZAorZmFsY29uX3JlbGVhc2VfbG9ja19pZl9wb3NzaWJsZSggc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKiBob3N0ZGF0YSApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJaWYgKElTX0FfVFQoKSkgcmV0dXJuOworCQorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChmYWxjb25fZ290X2xvY2sgJiYKKwkJIWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUgJiYKKwkJIWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSAmJgorCQkhaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCisJCWlmIChmYWxjb25fZG9udF9yZWxlYXNlKSB7CisjaWYgMAorCQkJcHJpbnRrKCJXQVJOSU5HOiBMb2NrIHJlbGVhc2Ugbm90IGFsbG93ZWQuIElnbm9yZWRcbiIpOworI2VuZGlmCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJZmFsY29uX2dvdF9sb2NrID0gMDsKKwkJc3RkbWFfcmVsZWFzZSgpOworCQl3YWtlX3VwKCAmZmFsY29uX2ZhaXJuZXNzX3dhaXQgKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgbG9ja2luZyBvZiB0aGUgU1QtRE1BLgorICogSWYgdGhlIERNQSBpc24ndCBsb2NrZWQgYWxyZWFkeSBmb3IgU0NTSSwgaXQgdHJpZXMgdG8gbG9jayBpdCBieQorICogY2FsbGluZyBzdGRtYV9sb2NrKCkuIEJ1dCBpZiB0aGUgRE1BIGlzIGxvY2tlZCBieSB0aGUgU0NTSSBjb2RlIGFuZAorICogdGhlcmUgYXJlIG90aGVyIGRyaXZlcnMgd2FpdGluZyBmb3IgdGhlIGNoaXAsIHdlIGRvIG5vdCBpc3N1ZSB0aGUKKyAqIGNvbW1hbmQgaW1tZWRpYXRlbHkgYnV0IHdhaXQgb24gJ2ZhbGNvbl9mYWlybmVzc19xdWV1ZScuIFdlIHdpbGwgYmUKKyAqIHdha2VkIHVwIHdoZW4gdGhlIERNQSBpcyB1bmxvY2tlZCBieSBzb21lIFNDU0kgaW50ZXJydXB0LiBBZnRlciB0aGF0CisgKiB3ZSB0cnkgdG8gZ2V0IHRoZSBsb2NrIGFnYWluLgorICogQnV0IHdlIG11c3QgYmUgcHJlcGFyZWQgdGhhdCBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCisgKiBmYWxjb25fZ2V0X2xvY2soKSBpcyB3YWl0aW5nIG9uIHRoZSBmYWlybmVzcyBxdWV1ZS4gVGhleSBzaG91bGQgbm90CisgKiB0cnkgYWxsIGF0IG9uY2UgdG8gY2FsbCBzdGRtYV9sb2NrKCksIG9uZSBpcyBlbm91Z2ghIEZvciB0aGF0LCB0aGUKKyAqIGZpcnN0IG9uZSBzZXRzICdmYWxjb25fdHJ5aW5nX2xvY2snLCBvdGhlcnMgdGhhdCBzZWUgdGhhdCB2YXJpYWJsZQorICogc2V0IHdhaXQgb24gdGhlIHF1ZXVlICdmYWxjb25fdHJ5X3dhaXQnLgorICogQ29tcGxpY2F0ZWQsIGNvbXBsaWNhdGVkLi4uLiBTaWdoLi4uCisgKi8KKworc3RhdGljIHZvaWQgZmFsY29uX2dldF9sb2NrKCB2b2lkICkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKElTX0FfVFQoKSkgcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJd2hpbGUoICFpbl9pbnRlcnJ1cHQoKSAmJiBmYWxjb25fZ290X2xvY2sgJiYgc3RkbWFfb3RoZXJzX3dhaXRpbmcoKSApCisJCXNsZWVwX29uKCAmZmFsY29uX2ZhaXJuZXNzX3dhaXQgKTsKKworCXdoaWxlICghZmFsY29uX2dvdF9sb2NrKSB7CisJCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJCXBhbmljKCAiRmFsY29uIFNDU0kgaGFzbid0IFNULURNQSBsb2NrIGluIGludGVycnVwdCIgKTsKKwkJaWYgKCFmYWxjb25fdHJ5aW5nX2xvY2spIHsKKwkJCWZhbGNvbl90cnlpbmdfbG9jayA9IDE7CisJCQlzdGRtYV9sb2NrKHNjc2lfZmFsY29uX2ludHIsIE5VTEwpOworCQkJZmFsY29uX2dvdF9sb2NrID0gMTsKKwkJCWZhbGNvbl90cnlpbmdfbG9jayA9IDA7CisJCQl3YWtlX3VwKCAmZmFsY29uX3RyeV93YWl0ICk7CisJCX0KKwkJZWxzZSB7CisJCQlzbGVlcF9vbiggJmZhbGNvbl90cnlfd2FpdCApOworCQl9CisJfQkKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlpZiAoIWZhbGNvbl9nb3RfbG9jaykKKwkJcGFuaWMoIkZhbGNvbiBTQ1NJOiBzb21lb25lIHN0b2xlIHRoZSBsb2NrIDotKFxuIik7Cit9CisKKworLyogVGhpcyBpcyB0aGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgTkNSNTM4MF9xdWV1ZV9jb21tYW5kKCkuIEl0IGp1c3QKKyAqIHRyaWVzIHRvIGdldCB0aGUgbG9jayBvbiB0aGUgU1QtRE1BIChzZWUgYWJvdmUpIGFuZCB0aGVuIGNhbGxzIHRoZQorICogb3JpZ2luYWwgZnVuY3Rpb24uCisgKi8KKworI2lmIDAKK2ludCBhdGFyaV9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKwkvKiBmYWxjb25fZ2V0X2xvY2soKTsKKwkgKiArK2d1ZW50aGVyOiBtb3ZlZCB0byBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoKSB0byBwcmV2ZW50CisJICogcmFjZSBjb25kaXRpb24sIHNlZSB0aGVyZSBmb3IgYW4gZXhwbGFuYXRpb24uCisJICovCisJcmV0dXJuKCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoIGNtZCwgZG9uZSApICk7Cit9CisjZW5kaWYKKworCitpbnQgYXRhcmlfc2NzaV9kZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqaG9zdCkKK3sKKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisKKwlpZiAoIU1BQ0hfSVNfQVRBUkkgfHwKKwkgICAgKCFBVEFSSUhXX1BSRVNFTlQoU1RfU0NTSSkgJiYgIUFUQVJJSFdfUFJFU0VOVChUVF9TQ1NJKSkgfHwKKwkgICAgY2FsbGVkKQorCQlyZXR1cm4oIDAgKTsKKworCWhvc3QtPnByb2NfbmFtZSA9ICJBdGFyaSI7CisKKwlhdGFyaV9zY3NpX3JlZ19yZWFkICA9IElTX0FfVFQoKSA/IGF0YXJpX3Njc2lfdHRfcmVnX3JlYWQgOgorCQkJCQkgICBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfcmVhZDsKKwlhdGFyaV9zY3NpX3JlZ193cml0ZSA9IElTX0FfVFQoKSA/IGF0YXJpX3Njc2lfdHRfcmVnX3dyaXRlIDoKKwkJCQkJICAgYXRhcmlfc2NzaV9mYWxjb25fcmVnX3dyaXRlOworCisJLyogc2V0dXAgdmFyaWFibGVzICovCisJaG9zdC0+Y2FuX3F1ZXVlID0KKwkJKHNldHVwX2Nhbl9xdWV1ZSA+IDApID8gc2V0dXBfY2FuX3F1ZXVlIDoKKwkJSVNfQV9UVCgpID8gQVRBUklfVFRfQ0FOX1FVRVVFIDogQVRBUklfRkFMQ09OX0NBTl9RVUVVRTsKKwlob3N0LT5jbWRfcGVyX2x1biA9CisJCShzZXR1cF9jbWRfcGVyX2x1biA+IDApID8gc2V0dXBfY21kX3Blcl9sdW4gOgorCQlJU19BX1RUKCkgPyBBVEFSSV9UVF9DTURfUEVSX0xVTiA6IEFUQVJJX0ZBTENPTl9DTURfUEVSX0xVTjsKKwkvKiBGb3JjZSBzZ190YWJsZXNpemUgdG8gMCBvbiBhIEZhbGNvbiEgKi8KKwlob3N0LT5zZ190YWJsZXNpemUgPQorCQkhSVNfQV9UVCgpID8gQVRBUklfRkFMQ09OX1NHX1RBQkxFU0laRSA6CisJCShzZXR1cF9zZ190YWJsZXNpemUgPj0gMCkgPyBzZXR1cF9zZ190YWJsZXNpemUgOiBBVEFSSV9UVF9TR19UQUJMRVNJWkU7CisKKwlpZiAoc2V0dXBfaG9zdGlkID49IDApCisJCWhvc3QtPnRoaXNfaWQgPSBzZXR1cF9ob3N0aWQ7CisJZWxzZSB7CisJCS8qIHVzZSA3IGFzIGRlZmF1bHQgKi8KKwkJaG9zdC0+dGhpc19pZCA9IDc7CisJCS8qIFRlc3QgaWYgYSBob3N0IGlkIGlzIHNldCBpbiB0aGUgTlZSYW0gKi8KKwkJaWYgKEFUQVJJSFdfUFJFU0VOVChUVF9DTEspICYmIG52cmFtX2NoZWNrX2NoZWNrc3VtKCkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYiA9IG52cmFtX3JlYWRfYnl0ZSggMTQgKTsKKwkJCS8qIEFyYml0cmF0aW9uIGVuYWJsZWQ/IChmb3IgVE9TKSBJZiB5ZXMsIHVzZSBjb25maWd1cmVkIGhvc3QgSUQgKi8KKwkJCWlmIChiICYgMHg4MCkKKwkJCQlob3N0LT50aGlzX2lkID0gYiAmIDc7CisJCX0KKwl9CisKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwlpZiAoc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nIDwgMCkKKwkJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gREVGQVVMVF9VU0VfVEFHR0VEX1FVRVVJTkc7CisjZW5kaWYKKyNpZmRlZiBSRUFMX0RNQQorCS8qIElmIHJ1bm5pbmcgb24gYSBGYWxjb24gYW5kIGlmIHRoZXJlJ3MgVFQtUmFtIChpLmUuLCBtb3JlIHRoYW4gb25lCisJICogbWVtb3J5IGJsb2NrLCBzaW5jZSB0aGVyZSdzIGFsd2F5cyBTVC1SYW0gaW4gYSBGYWxjb24pLCB0aGVuIGFsbG9jYXRlIGEKKwkgKiBTVFJBTV9CVUZGRVJfU0laRSBieXRlIGRyaWJibGUgYnVmZmVyIGZvciB0cmFuc2ZlcnMgZnJvbS90byBhbHRlcm5hdGl2ZQorCSAqIFJhbS4KKwkgKi8KKwlpZiAoTUFDSF9JU19BVEFSSSAmJiBBVEFSSUhXX1BSRVNFTlQoU1RfU0NTSSkgJiYKKwkgICAgIUFUQVJJSFdfUFJFU0VOVChFWFREX0RNQSkgJiYgbTY4a19udW1fbWVtb3J5ID4gMSkgeworCQlhdGFyaV9kbWFfYnVmZmVyID0gYXRhcmlfc3RyYW1fYWxsb2MoU1RSQU1fQlVGRkVSX1NJWkUsICJTQ1NJIik7CisJCWlmICghYXRhcmlfZG1hX2J1ZmZlcikgeworCQkJcHJpbnRrKCBLRVJOX0VSUiAiYXRhcmlfc2NzaV9kZXRlY3Q6IGNhbid0IGFsbG9jYXRlIFNULVJBTSAiCisJCQkJCSJkb3VibGUgYnVmZmVyXG4iICk7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCQlhdGFyaV9kbWFfcGh5c19idWZmZXIgPSB2aXJ0X3RvX3BoeXMoIGF0YXJpX2RtYV9idWZmZXIgKTsKKwkJYXRhcmlfZG1hX29yaWdfYWRkciA9IDA7CisJfQorI2VuZGlmCisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyIChob3N0LCBzaXplb2YgKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKSk7CisJaWYoaW5zdGFuY2UgPT0gTlVMTCkKKwl7CisJCWF0YXJpX3N0cmFtX2ZyZWUoYXRhcmlfZG1hX2J1ZmZlcik7CisJCWF0YXJpX2RtYV9idWZmZXIgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJYXRhcmlfc2NzaV9ob3N0ID0gaW5zdGFuY2U7CisgICAgICAgLyogU2V0IGlycSB0byAwLCB0byBhdm9pZCB0aGF0IHRoZSBtaWQtbGV2ZWwgY29kZSBkaXNhYmxlcyBvdXIgaW50ZXJydXB0CisgICAgICAgICogZHVyaW5nIHF1ZXVlX2NvbW1hbmQgY2FsbHMuIFRoaXMgaXMgY29tcGxldGVseSB1bm5lY2Vzc2FyeSwgYW5kIGV2ZW4KKyAgICAgICAgKiB3b3JzZSBjYXVzZXMgYmFkIHByb2JsZW1zIG9uIHRoZSBGYWxjb24sIHdoZXJlIHRoZSBpbnQgaXMgc2hhcmVkIHdpdGgKKyAgICAgICAgKiBJREUgYW5kIGZsb3BweSEgKi8KKyAgICAgICBpbnN0YW5jZS0+aXJxID0gMDsKKworI2lmZGVmIENPTkZJR19BVEFSSV9TQ1NJX1JFU0VUX0JPT1QKKwlhdGFyaV9zY3NpX3Jlc2V0X2Jvb3QoKTsKKyNlbmRpZgorCU5DUjUzODBfaW5pdCAoaW5zdGFuY2UsIDApOworCisJaWYgKElTX0FfVFQoKSkgeworCisJCS8qIFRoaXMgaW50IGlzIGFjdHVhbGx5ICJwc2V1ZG8tc2xvdyIsIGkuZS4gaXQgYWN0cyBsaWtlIGEgc2xvdworCQkgKiBpbnRlcnJ1cHQgYWZ0ZXIgaGF2aW5nIGNsZWFyZWQgdGhlIHBlbmRpbmcgZmxhZyBmb3IgdGhlIERNQQorCQkgKiBpbnRlcnJ1cHQuICovCisJCWlmIChyZXF1ZXN0X2lycShJUlFfVFRfTUZQX1NDU0ksIHNjc2lfdHRfaW50ciwgSVJRX1RZUEVfU0xPVywKKwkJCQkgIlNDU0kgTkNSNTM4MCIsIHNjc2lfdHRfaW50cikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXRhcmlfc2NzaV9kZXRlY3Q6IGNhbm5vdCBhbGxvY2F0ZSBpcnEgJWQsIGFib3J0aW5nIixJUlFfVFRfTUZQX1NDU0kpOworCQkJc2NzaV91bnJlZ2lzdGVyKGF0YXJpX3Njc2lfaG9zdCk7CisJCQlhdGFyaV9zdHJhbV9mcmVlKGF0YXJpX2RtYV9idWZmZXIpOworCQkJYXRhcmlfZG1hX2J1ZmZlciA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0dF9tZnAuYWN0aXZlX2VkZ2UgfD0gMHg4MDsJCS8qIFNDU0kgaW50IG9uIEwtPkggKi8KKyNpZmRlZiBSRUFMX0RNQQorCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IDA7CisJCWF0YXJpX2RtYV9yZXNpZHVhbCA9IDA7CisjaWZkZWYgQ09ORklHX1RUX0RNQV9FTVVMCisJCWlmIChNQUNIX0lTX0hBREVTKSB7CisJCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMiwgaGFkZXNfZG1hX2VtdWxhdG9yLAorCQkJCQkgSVJRX1RZUEVfUFJJTywgIkhhZGVzIERNQSBlbXVsYXRvciIsCisJCQkJCSBoYWRlc19kbWFfZW11bGF0b3IpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhdGFyaV9zY3NpX2RldGVjdDogY2Fubm90IGFsbG9jYXRlIGlycSAlZCwgYWJvcnRpbmcgKE1BQ0hfSVNfSEFERVMpIixJUlFfQVVUT18yKTsKKwkJCQlmcmVlX2lycShJUlFfVFRfTUZQX1NDU0ksIHNjc2lfdHRfaW50cik7CisJCQkJc2NzaV91bnJlZ2lzdGVyKGF0YXJpX3Njc2lfaG9zdCk7CisJCQkJYXRhcmlfc3RyYW1fZnJlZShhdGFyaV9kbWFfYnVmZmVyKTsKKwkJCQlhdGFyaV9kbWFfYnVmZmVyID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmIChNQUNIX0lTX01FRFVTQSB8fCBNQUNIX0lTX0hBREVTKSB7CisJCQkvKiBXaGlsZSB0aGUgcmVhZCBvdmVycnVucyAoZGVzY3JpYmVkIGJ5IERyZXcgRWNraGFyZHQgaW4KKwkJCSAqIE5DUjUzODAuYykgbmV2ZXIgaGFwcGVuZWQgb24gVFRzLCB0aGV5IGRvIGluIGZhY3Qgb24gdGhlIE1lZHVzYQorCQkJICogKFRoaXMgd2FzIHRoZSBjYXVzZSB3aHkgU0NTSSBkaWRuJ3Qgd29yayByaWdodCBmb3Igc28gbG9uZworCQkJICogdGhlcmUuKSBTaW5jZSBoYW5kbGluZyB0aGUgb3ZlcnJ1bnMgc2xvd3MgZG93biBhIGJpdCwgSSB0dXJuZWQKKwkJCSAqIHRoZSAjaWZkZWYncyBpbnRvIGEgcnVudGltZSBjb25kaXRpb24uCisJCQkgKgorCQkJICogSW4gcHJpbmNpcGxlIGl0IHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIGRvIG1heC4gMSBieXRlIHdpdGgKKwkJCSAqIFBJTywgYnV0IHRoZXJlIGlzIGFub3RoZXIgcHJvYmxlbSBvbiB0aGUgTWVkdXNhIHdpdGggdGhlIERNQQorCQkJICogcmVzdCBkYXRhIHJlZ2lzdGVyLiBTbyAnYXRhcmlfcmVhZF9vdmVycnVucycgaXMgY3VycmVudGx5IHNldAorCQkJICogdG8gNCB0byBhdm9pZCBoYXZpbmcgdHJhbnNmZXJzIHRoYXQgYXJlbid0IGEgbXVsdGlwbGUgb2YgNC4gSWYKKwkJCSAqIHRoZSByZXN0IGRhdGEgYnVnIGlzIGZpeGVkLCB0aGlzIGNhbiBiZSBsb3dlcmVkIHRvIDEuCisJCQkgKi8KKwkJCWF0YXJpX3JlYWRfb3ZlcnJ1bnMgPSA0OworCQl9CQkKKyNlbmRpZiAvKlJFQUxfRE1BKi8KKwl9CisJZWxzZSB7IC8qICEgSVNfQV9UVCAqLworCQkKKwkJLyogTm90aGluZyB0byBkbyBmb3IgdGhlIGludGVycnVwdDogdGhlIFNULURNQSBpcyBpbml0aWFsaXplZAorCQkgKiBhbHJlYWR5IGJ5IGF0YXJpX2luaXRfSU5UUygpCisJCSAqLworCisjaWZkZWYgUkVBTF9ETUEKKwkJYXRhcmlfZG1hX3Jlc2lkdWFsID0gMDsKKwkJYXRhcmlfZG1hX2FjdGl2ZSA9IDA7CisJCWF0YXJpX2RtYV9zdHJhbV9tYXNrID0gKEFUQVJJSFdfUFJFU0VOVChFWFREX0RNQSkgPyAweDAwMDAwMDAwCisJCQkJCTogMHhmZjAwMDAwMCk7CisjZW5kaWYKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IG9wdGlvbnMgQ0FOX1FVRVVFPSVkIENNRF9QRVJfTFVOPSVkIFNDQVQtR0FUPSVkICIKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJCSJUQUdHRUQtUVVFVUlORz0lcyAiCisjZW5kaWYKKwkJCSJIT1NUSUQ9JWQiLAorCQkJaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5ob3N0dC0+Y2FuX3F1ZXVlLAorCQkJaW5zdGFuY2UtPmhvc3R0LT5jbWRfcGVyX2x1biwKKwkJCWluc3RhbmNlLT5ob3N0dC0+c2dfdGFibGVzaXplLAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID8gInllcyIgOiAibm8iLAorI2VuZGlmCisJCQlpbnN0YW5jZS0+aG9zdHQtPnRoaXNfaWQgKTsKKwlOQ1I1MzgwX3ByaW50X29wdGlvbnMgKGluc3RhbmNlKTsKKwlwcmludGsgKCJcbiIpOworCisJY2FsbGVkID0gMTsKKwlyZXR1cm4oIDEgKTsKK30KKworI2lmZGVmIE1PRFVMRQoraW50IGF0YXJpX3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqc2gpCit7CisJaWYgKElTX0FfVFQoKSkKKwkJZnJlZV9pcnEoSVJRX1RUX01GUF9TQ1NJLCBzY3NpX3R0X2ludHIpOworCWlmIChhdGFyaV9kbWFfYnVmZmVyKQorCQlhdGFyaV9zdHJhbV9mcmVlIChhdGFyaV9kbWFfYnVmZmVyKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBhdGFyaV9zY3NpX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCS8qIEZvcm1hdCBvZiBhdGFzY3NpIHBhcmFtZXRlciBpczoKKwkgKiAgIGF0YXNjc2k9PGNhbl9xdWV1ZT4sPGNtZF9wZXJfbHVuPiw8c2dfdGFibGVzaXplPiw8aG9zdGlkPiw8dXNlX3RhZ3M+CisJICogRGVmYXVsdHMgZGVwZW5kIG9uIFRUIG9yIEZhbGNvbiwgaG9zdGlkIGRldGVybWluZWQgYXQgcnVuIHRpbWUuCisJICogTmVnYXRpdmUgdmFsdWVzIG1lYW4gZG9uJ3QgY2hhbmdlLgorCSAqLworCQorCWlmIChpbnRzWzBdIDwgMSkgeworCQlwcmludGsoICJhdGFyaV9zY3NpX3NldHVwOiBubyBhcmd1bWVudHMhXG4iICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW50c1swXSA+PSAxKSB7CisJCWlmIChpbnRzWzFdID4gMCkKKwkJCS8qIG5vIGxpbWl0cyBvbiB0aGlzLCBqdXN0ID4gMCAqLworCQkJc2V0dXBfY2FuX3F1ZXVlID0gaW50c1sxXTsKKwl9CisJaWYgKGludHNbMF0gPj0gMikgeworCQlpZiAoaW50c1syXSA+IDApCisJCQlzZXR1cF9jbWRfcGVyX2x1biA9IGludHNbMl07CisJfQorCWlmIChpbnRzWzBdID49IDMpIHsKKwkJaWYgKGludHNbM10gPj0gMCkgeworCQkJc2V0dXBfc2dfdGFibGVzaXplID0gaW50c1szXTsKKwkJCS8qIE11c3QgYmUgPD0gU0dfQUxMICgyNTUpICovCisJCQlpZiAoc2V0dXBfc2dfdGFibGVzaXplID4gU0dfQUxMKQorCQkJCXNldHVwX3NnX3RhYmxlc2l6ZSA9IFNHX0FMTDsKKwkJfQorCX0KKwlpZiAoaW50c1swXSA+PSA0KSB7CisJCS8qIE11c3QgYmUgYmV0d2VlbiAwIGFuZCA3ICovCisJCWlmIChpbnRzWzRdID49IDAgJiYgaW50c1s0XSA8PSA3KQorCQkJc2V0dXBfaG9zdGlkID0gaW50c1s0XTsKKwkJZWxzZSBpZiAoaW50c1s0XSA+IDcpCisJCQlwcmludGsoICJhdGFyaV9zY3NpX3NldHVwOiBpbnZhbGlkIGhvc3QgSUQgJWQgIVxuIiwgaW50c1s0XSApOworCX0KKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwlpZiAoaW50c1swXSA+PSA1KSB7CisJCWlmIChpbnRzWzVdID49IDApCisJCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSAhIWludHNbNV07CisJfQorI2VuZGlmCit9CisKK2ludCBhdGFyaV9zY3NpX2J1c19yZXNldChTY3NpX0NtbmQgKmNtZCkKK3sKKwlpbnQJCXJ2OworCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCS8qIEZvciBkb2luZyB0aGUgcmVzZXQsIFNDU0kgaW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkIGZpcnN0LAorCSAqIHNpbmNlIHRoZSA1MzgwIHJhaXNlcyBpdHMgSVJRIGxpbmUgd2hpbGUgX1JTVCBpcyBhY3RpdmUgYW5kIHdlCisJICogY2FuJ3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGNvbXBsZXRlbHksIHNpbmNlIHdlIG5lZWQgdGhlIHRpbWVyLgorCSAqLworCS8qIEFuZCBhYm9ydCBhIG1heWJlIGFjdGl2ZSBETUEgdHJhbnNmZXIgKi8KKwlpZiAoSVNfQV9UVCgpKSB7CisJCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfVFRfTUZQX1NDU0kgKTsKKyNpZmRlZiBSRUFMX0RNQQorCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IDA7CisjZW5kaWYgLyogUkVBTF9ETUEgKi8KKwl9CisJZWxzZSB7CisJCWF0YXJpX3R1cm5vZmZfaXJxKCBJUlFfTUZQX0ZTQ1NJICk7CisjaWZkZWYgUkVBTF9ETUEKKwkJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTA7CisJCWF0YXJpX2RtYV9hY3RpdmUgPSAwOworCQlhdGFyaV9kbWFfb3JpZ19hZGRyID0gTlVMTDsKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCX0KKworCXJ2ID0gTkNSNTM4MF9idXNfcmVzZXQoY21kKTsKKworCS8qIFJlLWVuYWJsZSBpbnRzICovCisJaWYgKElTX0FfVFQoKSkgeworCQlhdGFyaV90dXJub25faXJxKCBJUlFfVFRfTUZQX1NDU0kgKTsKKwl9CisJZWxzZSB7CisJCWF0YXJpX3R1cm5vbl9pcnEoIElSUV9NRlBfRlNDU0kgKTsKKwl9CisJaWYgKChydiAmIFNDU0lfUkVTRVRfQUNUSU9OKSA9PSBTQ1NJX1JFU0VUX1NVQ0NFU1MpCisJCWZhbGNvbl9yZWxlYXNlX2xvY2tfaWZfcG9zc2libGUoaG9zdGRhdGEpOworCisJcmV0dXJuKCBydiApOworfQorCisJCisjaWZkZWYgQ09ORklHX0FUQVJJX1NDU0lfUkVTRVRfQk9PVAorc3RhdGljIHZvaWQgX19pbml0IGF0YXJpX3Njc2lfcmVzZXRfYm9vdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCQorCS8qCisJICogRG8gYSBTQ1NJIHJlc2V0IHRvIGNsZWFuIHVwIHRoZSBidXMgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBObyBtZXNzaW5nCisJICogd2l0aCB0aGUgcXVldWVzLCBpbnRlcnJ1cHRzLCBvciBsb2NrcyBuZWNlc3NhcnkgaGVyZS4KKwkgKi8KKworCXByaW50ayggIkF0YXJpIFNDU0k6IHJlc2V0dGluZyB0aGUgU0NTSSBidXMuLi4iICk7CisKKwkvKiBnZXQgaW4gcGhhc2UgKi8KKwlOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgICAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworCisJLyogYXNzZXJ0IFJTVCAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1JTVCApOworCS8qIFRoZSBtaW4uIHJlc2V0IGhvbGQgdGltZSBpcyAyNXVzLCBzbyA0MHVzIHNob3VsZCBiZSBlbm91Z2ggKi8KKwl1ZGVsYXkoIDUwICk7CisJLyogcmVzZXQgUlNUIGFuZCBpbnRlcnJ1cHQgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisJTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisJZW5kID0gamlmZmllcyArIEFGVEVSX1JFU0VUX0RFTEFZOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmQpKQorCQliYXJyaWVyKCk7CisKKwlwcmludGsoICIgZG9uZVxuIiApOworfQorI2VuZGlmCisKKworY29uc3QgY2hhciAqIGF0YXJpX3Njc2lfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwkvKiBhdGFyaV9zY3NpX2RldGVjdCgpIGlzIHZlcmJvc2UgZW5vdWdoLi4uICovCisJc3RhdGljIGNvbnN0IGNoYXIgc3RyaW5nW10gPSAiQXRhcmkgbmF0aXZlIFNDU0kiOworCXJldHVybiBzdHJpbmc7Cit9CisKKworI2lmIGRlZmluZWQoUkVBTF9ETUEpCisKK3Vuc2lnbmVkIGxvbmcgYXRhcmlfc2NzaV9kbWFfc2V0dXAoIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB2b2lkICpkYXRhLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBkaXIgKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRfdG9fcGh5cyggZGF0YSApOworCisJRE1BX1BSSU5USygic2NzaSVkOiBzZXR0aW5nIHVwIGRtYSwgZGF0YSA9ICVwLCBwaHlzID0gJWx4LCBjb3VudCA9ICVsZCwgIgorCQkgICAiZGlyID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBkYXRhLCBhZGRyLCBjb3VudCwgZGlyKTsKKworCWlmICghSVNfQV9UVCgpICYmICFTVFJBTV9BRERSKGFkZHIpKSB7CisJCS8qIElmIHdlIGhhdmUgYSBub24tRE1BYWJsZSBhZGRyZXNzIG9uIGEgRmFsY29uLCB1c2UgdGhlIGRyaWJibGUKKwkJICogYnVmZmVyOyAnb3JpZ19hZGRyJyAhPSAwIGluIHRoZSByZWFkIGNhc2UgdGVsbHMgdGhlIGludGVycnVwdAorCQkgKiBoYW5kbGVyIHRvIGNvcHkgZGF0YSBmcm9tIHRoZSBkcmliYmxlIGJ1ZmZlciB0byB0aGUgb3JpZ2luYWxseQorCQkgKiB3YW50ZWQgYWRkcmVzcy4KKwkJICovCisJCWlmIChkaXIpCisJCQltZW1jcHkoIGF0YXJpX2RtYV9idWZmZXIsIGRhdGEsIGNvdW50ICk7CisJCWVsc2UKKwkJCWF0YXJpX2RtYV9vcmlnX2FkZHIgPSBkYXRhOworCQlhZGRyID0gYXRhcmlfZG1hX3BoeXNfYnVmZmVyOworCX0KKwkKKwlhdGFyaV9kbWFfc3RhcnRhZGRyID0gYWRkcjsJLyogTmVlZGVkIGZvciBjYWxjdWxhdGluZyByZXNpZHVhbCBsYXRlci4gKi8KKyAgCisJLyogQ2FjaGUgY2xlYW51cCBzdHVmZjogT24gd3JpdGVzLCBwdXNoIGFueSBkaXJ0eSBjYWNoZSBvdXQgYmVmb3JlIHNlbmRpbmcKKwkgKiBpdCB0byB0aGUgcGVyaXBoZXJhbC4gKE11c3QgYmUgZG9uZSBiZWZvcmUgRE1BIHNldHVwLCBzaW5jZSBhdCBsZWFzdAorCSAqIHRoZSBTVC1ETUEgYmVnaW5zIHRvIGZpbGwgaW50ZXJuYWwgYnVmZmVycyByaWdodCBhZnRlciBzZXR1cC4gRm9yCisJICogcmVhZHMsIGludmFsaWRhdGUgYW55IGNhY2hlLCBtYXkgYmUgYWx0ZXJlZCBhZnRlciBETUEgd2l0aG91dCBDUFUKKwkgKiBrbm93bGVkZ2UuCisJICogCisJICogKytyb21hbjogRm9yIHRoZSBNZWR1c2EsIHRoZXJlJ3Mgbm8gbmVlZCBhdCBhbGwgZm9yIHRoYXQgY2FjaGUgc3R1ZmYsCisJICogYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lcyBidXMgc25vb3BpbmcgKGZpbmUhKS4KKwkgKi8KKwlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoIGFkZHIsIGNvdW50LCBkaXIgKTsKKworCWlmIChjb3VudCA9PSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNDU0kgd2FybmluZzogRE1BIHByb2dyYW1tZWQgZm9yIDAgYnl0ZXMgIVxuIik7CisKKwlpZiAoSVNfQV9UVCgpKSB7CisJCXR0X3Njc2lfZG1hLmRtYV9jdHJsID0gZGlyOworCQlTQ1NJX0RNQV9XUklURV9QKCBkbWFfYWRkciwgYWRkciApOworCQlTQ1NJX0RNQV9XUklURV9QKCBkbWFfY250LCBjb3VudCApOworCQl0dF9zY3NpX2RtYS5kbWFfY3RybCA9IGRpciB8IDI7CisJfQorCWVsc2UgeyAvKiAhIElTX0FfVFQgKi8KKyAgCisJCS8qIHNldCBhZGRyZXNzICovCisJCVNDU0lfRE1BX1NFVEFEUiggYWRkciApOworCisJCS8qIHRvZ2dsZSBkaXJlY3Rpb24gYml0IHRvIGNsZWFyIEZJRk8gYW5kIHNldCBETUEgZGlyZWN0aW9uICovCisJCWRpciA8PD0gODsKKwkJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTAgfCBkaXI7CisJCXN0X2RtYS5kbWFfbW9kZV9zdGF0dXMgPSAweDkwIHwgKGRpciBeIDB4MTAwKTsKKwkJc3RfZG1hLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTAgfCBkaXI7CisJCXVkZWxheSg0MCk7CisJCS8qIE9uIHdyaXRlcywgcm91bmQgdXAgdGhlIHRyYW5zZmVyIGxlbmd0aCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiA1MTIKKwkJICogKHNlZSBhbHNvIGNvbW1lbnQgYXQgYXRhcmlfZG1hX3hmZXJfbGVuKCkpLiAqLworCQlzdF9kbWEuZmRjX2FjY2VzX3NlY2NvdW50ID0gKGNvdW50ICsgKGRpciA/IDUxMSA6IDApKSA+PiA5OworCQl1ZGVsYXkoNDApOworCQlzdF9kbWEuZG1hX21vZGVfc3RhdHVzID0gMHgxMCB8IGRpcjsKKwkJdWRlbGF5KDQwKTsKKwkJLyogbmVlZCBub3QgcmVzdG9yZSB2YWx1ZSBvZiBkaXIsIG9ubHkgYm9vbGVhbiB2YWx1ZSBpcyB0ZXN0ZWQgKi8KKwkJYXRhcmlfZG1hX2FjdGl2ZSA9IDE7CisJfQorCisJcmV0dXJuKCBjb3VudCApOworfQorCisKK3N0YXRpYyBsb25nIGF0YXJpX3Njc2lfZG1hX3Jlc2lkdWFsKCBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSApCit7CisJcmV0dXJuKCBhdGFyaV9kbWFfcmVzaWR1YWwgKTsKK30KKworCisjZGVmaW5lCUNNRF9TVVJFTFlfQkxPQ0tfTU9ERQkwCisjZGVmaW5lCUNNRF9TVVJFTFlfQllURV9NT0RFCTEKKyNkZWZpbmUJQ01EX01PREVfVU5LTk9XTgkJMgorCitzdGF0aWMgaW50IGZhbGNvbl9jbGFzc2lmeV9jbWQoIFNjc2lfQ21uZCAqY21kICkKK3sKKwl1bnNpZ25lZCBjaGFyIG9wY29kZSA9IGNtZC0+Y21uZFswXTsKKwkKKwlpZiAob3Bjb2RlID09IFJFQURfREVGRUNUX0RBVEEgfHwgb3Bjb2RlID09IFJFQURfTE9ORyB8fAorCQlvcGNvZGUgPT0gUkVBRF9CVUZGRVIpCisJCXJldHVybiggQ01EX1NVUkVMWV9CWVRFX01PREUgKTsKKwllbHNlIGlmIChvcGNvZGUgPT0gUkVBRF82IHx8IG9wY29kZSA9PSBSRUFEXzEwIHx8CisJCSBvcGNvZGUgPT0gMHhhOCAvKiBSRUFEXzEyICovIHx8IG9wY29kZSA9PSBSRUFEX1JFVkVSU0UgfHwKKwkJIG9wY29kZSA9PSBSRUNPVkVSX0JVRkZFUkVEX0RBVEEpIHsKKwkJLyogSW4gY2FzZSBvZiBhIHNlcXVlbnRpYWwtYWNjZXNzIHRhcmdldCAodGFwZSksIHNwZWNpYWwgY2FyZSBpcworCQkgKiBuZWVkZWQgaGVyZTogVGhlIHRyYW5zZmVyIGlzIGJsb2NrLW1vZGUgb25seSBpZiB0aGUgJ2ZpeGVkJyBiaXQgaXMKKwkJICogc2V0ISAqLworCQlpZiAoY21kLT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9UQVBFICYmICEoY21kLT5jbW5kWzFdICYgMSkpCisJCQlyZXR1cm4oIENNRF9TVVJFTFlfQllURV9NT0RFICk7CisJCWVsc2UKKwkJCXJldHVybiggQ01EX1NVUkVMWV9CTE9DS19NT0RFICk7CisJfQorCWVsc2UKKwkJcmV0dXJuKCBDTURfTU9ERV9VTktOT1dOICk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgdHJhbnNmZXJyZWQgdmlhCisgKiBETUEuIE9uIHRoZSBUVCwgdGhpcyBpcyBhcmJpdHJhcnksIGJ1dCBvbiB0aGUgRmFsY29uIHdlIGhhdmUgdG8gdXNlIHRoZQorICogU1QtRE1BIGNoaXAuIFRoZXJlIGFyZSBvbmx5IG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMgcG9zc2libGUgYW5kIG1heC4KKyAqIDI1NSo1MTIgYnl0ZXMgOi0oIFRoaXMgbWVhbnMgYWxzbywgdGhhdCBkZWZpbmluZyBSRUFEX09WRVJSVU5TIGlzIG5vdAorICogcG9zc2libGUgb24gdGhlIEZhbGNvbiwgc2luY2UgdGhhdCB3b3VsZCByZXF1aXJlIHRvIHByb2dyYW0gdGhlIERNQSBmb3IKKyAqIG4qNTEyIC0gYXRhcmlfcmVhZF9vdmVycnVuIGJ5dGVzLiBCdXQgaXQgc2VlbXMgdGhhdCB0aGUgRmFsY29uIGRvZXNuJ3QgaGF2ZQorICogdGhlIG92ZXJydW4gcHJvYmxlbSwgc28gdGhpcyBxdWVzdGlvbiBpcyBhY2FkZW1pYyA6LSkKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdGFyaV9kbWFfeGZlcl9sZW4oIHVuc2lnbmVkIGxvbmcgd2FudGVkX2xlbiwKKwkJCQkJU2NzaV9DbW5kICpjbWQsCisJCQkJCWludCB3cml0ZV9mbGFnICkKK3sKKwl1bnNpZ25lZCBsb25nCXBvc3NpYmxlX2xlbiwgbGltaXQ7CisjaWZuZGVmIENPTkZJR19UVF9ETUFfRU1VTAorCWlmIChNQUNIX0lTX0hBREVTKQorCQkvKiBIYWRlcyBoYXMgbm8gU0NTSSBETUEgYXQgYWxsIDotKCBBbHdheXMgZm9yY2UgdXNlIG9mIFBJTyAqLworCQlyZXR1cm4oIDAgKTsKKyNlbmRpZgkKKwlpZiAoSVNfQV9UVCgpKQorCQkvKiBUVCBTQ1NJIERNQSBjYW4gdHJhbnNmZXIgYXJiaXRyYXJ5ICNieXRlcyAqLworCQlyZXR1cm4oIHdhbnRlZF9sZW4gKTsKKworCS8qIFNUIERNQSBjaGlwIGlzIHN0dXBpZCAtLSBvbmx5IG11bHRpcGxlcyBvZiA1MTIgYnl0ZXMhIChhbmQgbWF4LgorCSAqIDI1NSo1MTIgYnl0ZXMsIGJ1dCB0aGlzIHNob3VsZCBiZSBlbm91Z2gpCisJICoKKwkgKiArK3JvbWFuOiBBYWFyZ2whIEFub3RoZXIgRmFsY29uLVNDU0kgcHJvYmxlbS4uLiBUaGVyZSBhcmUgc29tZSBjb21tYW5kcworCSAqIHRoYXQgcmV0dXJuIGEgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbm5vdCBiZSBrbm93biBiZWZvcmVoYW5kLiBJbiB0aGlzCisJICogY2FzZSwgdGhlIGdpdmVuIHRyYW5zZmVyIGxlbmd0aCBpcyBhbiAiYWxsb2NhdGlvbiBsZW5ndGgiLiBOb3cgaXQKKwkgKiBjYW4gaGFwcGVuIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDUxMiBieXRlcyBhbmQKKwkgKiB0aGUgRE1BIGlzIHVzZWQuIEJ1dCBpZiBub3Qgbio1MTIgYnl0ZXMgcmVhbGx5IGFycml2ZSwgc29tZSBpbnB1dCBkYXRhCisJICogd2lsbCBiZSBsb3N0IGluIHRoZSBTVC1ETUEncyBGSUZPIDotKCBUaHVzLCB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoCisJICogYmV0d2VlbiBjb21tYW5kcyB0aGF0IGRvIGJsb2NrIHRyYW5zZmVycyBhbmQgdGhvc2UgdGhhdCBkbyBieXRlCisJICogdHJhbnNmZXJzLiBCdXQgdGhpcyBpc24ndCBlYXN5Li4uIHRoZXJlIGFyZSBsb3RzIG9mIHZlbmRvciBzcGVjaWZpYworCSAqIGNvbW1hbmRzLCBhbmQgdGhlIHVzZXIgY2FuIGlzc3VlIGFueSBjb21tYW5kIHZpYSB0aGUKKwkgKiBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORC4KKwkgKgorCSAqIFRoZSBzb2x1dGlvbjogV2UgY2xhc3NpZnkgU0NTSSBjb21tYW5kcyBpbiAxKSBzdXJlbHkgYmxvY2stbW9kZSBjbWQucywKKwkgKiAyKSBzdXJlbHkgYnl0ZS1tb2RlIGNtZC5zIGFuZCAzKSBjbWQucyB3aXRoIHVua25vd24gbW9kZS4gSW4gY2FzZSAxKQorCSAqIGFuZCAzKSwgdGhlIHRoaW5nIHRvIGRvIGlzIG9idmlvdXM6IGFsbG93IGFueSBudW1iZXIgb2YgYmxvY2tzIHZpYSBETUEKKwkgKiBvciBub25lLiBJbiBjYXNlIDIpLCB3ZSBhcHBseSBzb21lIGhldXJpc3RpYzogQnl0ZSBtb2RlIGlzIGFzc3VtZWQgaWYKKwkgKiB0aGUgdHJhbnNmZXIgKGFsbG9jYXRpb24pIGxlbmd0aCBpcyA8IDEwMjQsIGhvcGluZyB0aGF0IG5vIGNtZC4gbm90CisJICogZXhwbGljaXRseSBrbm93biBhcyBieXRlIG1vZGUgaGF2ZSBzdWNoIGJpZyBhbGxvY2F0aW9uIGxlbmd0aHMuLi4KKwkgKiBCVFcsIGFsbCB0aGUgZGlzY3Vzc2lvbiBhYm92ZSBhcHBsaWVzIG9ubHkgdG8gcmVhZHMuIERNQSB3cml0ZXMgYXJlCisJICogdW5wcm9ibGVtYXRpYyBhbnl3YXlzLCBzaW5jZSB0aGUgdGFyZ2V0cyBhYm9ydHMgdGhlIHRyYW5zZmVyIGFmdGVyCisJICogcmVjZWl2aW5nIGEgc3VmZmljaWVudCBudW1iZXIgb2YgYnl0ZXMuCisJICoKKwkgKiBBbm90aGVyIHBvaW50OiBJZiB0aGUgdHJhbnNmZXIgaXMgZnJvbS90byBhbiBub24tU1QtUkFNIGFkZHJlc3MsIHdlCisJICogdXNlIHRoZSBkcmliYmxlIGJ1ZmZlciBhbmQgdGh1cyBjYW4gZG8gb25seSBTVFJBTV9CVUZGRVJfU0laRSBieXRlcy4KKwkgKi8KKworCWlmICh3cml0ZV9mbGFnKSB7CisJCS8qIFdyaXRlIG9wZXJhdGlvbiBjYW4gYWx3YXlzIHVzZSB0aGUgRE1BLCBidXQgdGhlIHRyYW5zZmVyIHNpemUgbXVzdAorCQkgKiBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDUxMiAoYXRhcmlfZG1hX3NldHVwKCkgZG9lcworCQkgKiB0aGlzKS4KKwkJICovCisJCXBvc3NpYmxlX2xlbiA9IHdhbnRlZF9sZW47CisJfQorCWVsc2UgeworCQkvKiBSZWFkIG9wZXJhdGlvbnM6IGlmIHRoZSB3YW50ZWQgdHJhbnNmZXIgbGVuZ3RoIGlzIG5vdCBhIG11bHRpcGxlIG9mCisJCSAqIDUxMiwgd2UgY2Fubm90IHVzZSBETUEsIHNpbmNlIHRoZSBTVC1ETUEgY2Fubm90IHNwbGl0IHRyYW5zZmVycworCQkgKiAobm8gaW50ZXJydXB0IG9uIERNQSBmaW5pc2hlZCEpCisJCSAqLworCQlpZiAod2FudGVkX2xlbiAmIDB4MWZmKQorCQkJcG9zc2libGVfbGVuID0gMDsKKwkJZWxzZSB7CisJCQkvKiBOb3cgY2xhc3NpZnkgdGhlIGNvbW1hbmQgKHNlZSBhYm92ZSkgYW5kIGRlY2lkZSB3aGV0aGVyIGl0IGlzCisJCQkgKiBhbGxvd2VkIHRvIGRvIERNQSBhdCBhbGwgKi8KKwkJCXN3aXRjaCggZmFsY29uX2NsYXNzaWZ5X2NtZCggY21kICkpIHsKKwkJCSAgY2FzZSBDTURfU1VSRUxZX0JMT0NLX01PREU6CisJCQkJcG9zc2libGVfbGVuID0gd2FudGVkX2xlbjsKKwkJCQlicmVhazsKKwkJCSAgY2FzZSBDTURfU1VSRUxZX0JZVEVfTU9ERToKKwkJCQlwb3NzaWJsZV9sZW4gPSAwOyAvKiBETUEgcHJvaGliaXRlZCAqLworCQkJCWJyZWFrOworCQkJICBjYXNlIENNRF9NT0RFX1VOS05PV046CisJCQkgIGRlZmF1bHQ6CisJCQkJLyogRm9yIHVua25vd24gY29tbWFuZHMgYXNzdW1lIGJsb2NrIHRyYW5zZmVycyBpZiB0aGUgdHJhbnNmZXIKKwkJCQkgKiBzaXplL2FsbG9jYXRpb24gbGVuZ3RoIGlzID49IDEwMjQgKi8KKwkJCQlwb3NzaWJsZV9sZW4gPSAod2FudGVkX2xlbiA8IDEwMjQpID8gMCA6IHdhbnRlZF9sZW47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJCisJLyogTGFzdCBzdGVwOiBhcHBseSB0aGUgaGFyZCBsaW1pdCBvbiBETUEgdHJhbnNmZXJzICovCisJbGltaXQgPSAoYXRhcmlfZG1hX2J1ZmZlciAmJiAhU1RSQU1fQUREUiggdmlydF90b19waHlzKGNtZC0+U0NwLnB0cikgKSkgPworCQkgICAgU1RSQU1fQlVGRkVSX1NJWkUgOiAyNTUqNTEyOworCWlmIChwb3NzaWJsZV9sZW4gPiBsaW1pdCkKKwkJcG9zc2libGVfbGVuID0gbGltaXQ7CisKKwlpZiAocG9zc2libGVfbGVuICE9IHdhbnRlZF9sZW4pCisJCURNQV9QUklOVEsoIlNvcnJ5LCBtdXN0IGN1dCBETUEgdHJhbnNmZXIgc2l6ZSB0byAlbGQgYnl0ZXMgIgorCQkJICAgImluc3RlYWQgb2YgJWxkXG4iLCBwb3NzaWJsZV9sZW4sIHdhbnRlZF9sZW4pOworCisJcmV0dXJuKCBwb3NzaWJsZV9sZW4gKTsKK30KKworCisjZW5kaWYJLyogUkVBTF9ETUEgKi8KKworCisvKiBOQ1I1MzgwIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMKKyAqCisgKiBUaGVyZSBhcmUgc2VwYXJhdGUgZnVuY3Rpb25zIGZvciBUVCBhbmQgRmFsY29uLCBiZWNhdXNlIHRoZSBhY2Nlc3MKKyAqIG1ldGhvZHMgYXJlIHF1aXRlIGRpZmZlcmVudC4gVGhlIGNhbGxpbmcgbWFjcm9zIE5DUjUzODBfcmVhZCBhbmQKKyAqIE5DUjUzODBfd3JpdGUgY2FsbCB0aGVzZSBmdW5jdGlvbnMgdmlhIGZ1bmN0aW9uIHBvaW50ZXJzLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0YXJpX3Njc2lfdHRfcmVnX3JlYWQoIHVuc2lnbmVkIGNoYXIgcmVnICkKK3sKKwlyZXR1cm4oIHR0X3Njc2lfcmVncFtyZWcgKiAyXSApOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX3R0X3JlZ193cml0ZSggdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUgKQoreworCXR0X3Njc2lfcmVncFtyZWcgKiAyXSA9IHZhbHVlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfcmVhZCggdW5zaWduZWQgY2hhciByZWcgKQoreworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXM9ICh1X3Nob3J0KSgweDg4ICsgcmVnKTsKKwlyZXR1cm4oICh1X2NoYXIpZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCApOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9zY3NpX2ZhbGNvbl9yZWdfd3JpdGUoIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlICkKK3sKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKHVfc2hvcnQpKDB4ODggKyByZWcpOworCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSAodV9zaG9ydCl2YWx1ZTsKK30KKworCisjaW5jbHVkZSAiYXRhcmlfTkNSNTM4MC5jIgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19pbmZvCQk9IGF0YXJpX3Njc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQXRhcmkgbmF0aXZlIFNDU0kiLAorCS5kZXRlY3QJCQk9IGF0YXJpX3Njc2lfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGF0YXJpX3Njc2lfcmVsZWFzZSwKKwkuaW5mbwkJCT0gYXRhcmlfc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhcmlfc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gYXRhcmlfc2NzaV9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhdGFyaV9zY3NpX2J1c19yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDAsIC8qIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lICovCisJLnRoaXNfaWQJCT0gMCwgLyogaW5pdGlhbGl6ZWQgYXQgcnVuLXRpbWUgKi8KKwkuc2dfdGFibGVzaXplCQk9IDAsIC8qIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lICovCisJLmNtZF9wZXJfbHVuCQk9IDAsIC8qIGluaXRpYWxpemVkIGF0IHJ1bi10aW1lICovCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMjU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBhdGFyaV9zY3NpLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBBdGFyaSBuYXRpdmUgU0NTSSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisgKgorICogKExvb3NlbHkgYmFzZWQgb24gdGhlIHdvcmsgb2YgUm9iZXJ0IERlIFZyaWVzJyB0ZWFtKQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworCisjaWZuZGVmIEFUQVJJX1NDU0lfSAorI2RlZmluZSBBVEFSSV9TQ1NJX0gKKworLyogKElfSEFWRV9PVkVSUlVOUyBzdHVmZiByZW1vdmVkKSAqLworCisjaWZuZGVmIEFTTQoraW50IGF0YXJpX3Njc2lfZGV0ZWN0IChTY3NpX0hvc3RfVGVtcGxhdGUgKik7Citjb25zdCBjaGFyICphdGFyaV9zY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgYXRhcmlfc2NzaV9yZXNldCAoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisjaWZkZWYgTU9EVUxFCitpbnQgYXRhcmlfc2NzaV9yZWxlYXNlIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworI2Vsc2UKKyNkZWZpbmUgYXRhcmlfc2NzaV9yZWxlYXNlIE5VTEwKKyNlbmRpZgorCisvKiBUaGUgdmFsdWVzIGZvciBDTURfUEVSX0xVTiBhbmQgQ0FOX1FVRVVFIGFyZSBzb21laG93IGFyYml0cmFyeS4gSGlnaGVyCisgKiB2YWx1ZXMgc2hvdWxkIHdvcmssIHRvbzsgdHJ5IGl0ISAoYnV0IGNtZF9wZXJfbHVuIGNvc3RzIG1lbW9yeSEpICovCisKKy8qIEJ1dCB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBzb21ld2hlcmUgdGhhdCByZXF1aXJlcyBDQU5fUVVFVUUgdG8gYmUKKyAqIDIqQ01EX1BFUl9MVU4uIEF0IGxlYXN0IG9uIGEgVFQsIG5vIHNwdXJpb3VzIHRpbWVvdXRzIHNlZW4gc2luY2UKKyAqIGNoYW5nZWQgQ01EX1BFUl9MVU4uLi4gKi8KKworLyogTm90ZTogVGhlIEZhbGNvbiBjdXJyZW50bHkgdXNlcyA4LzEgc2V0dGluZyBkdWUgdG8gdW5zb2x2ZWQgcHJvYmxlbXMgd2l0aAorICogY21kX3Blcl9sdW4gIT0gMSAqLworCisjZGVmaW5lIEFUQVJJX1RUX0NBTl9RVUVVRQkJMTYKKyNkZWZpbmUgQVRBUklfVFRfQ01EX1BFUl9MVU4JCTgKKyNkZWZpbmUgQVRBUklfVFRfU0dfVEFCTEVTSVpFCQlTR19BTEwKKworI2RlZmluZSBBVEFSSV9GQUxDT05fQ0FOX1FVRVVFCQk4CisjZGVmaW5lIEFUQVJJX0ZBTENPTl9DTURfUEVSX0xVTgkxCisjZGVmaW5lIEFUQVJJX0ZBTENPTl9TR19UQUJMRVNJWkUJU0dfTk9ORQorCisjZGVmaW5lCURFRkFVTFRfVVNFX1RBR0dFRF9RVUVVSU5HCTAKKworCisjZGVmaW5lCU5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzCS8qIG5vbmUgKi8KKworI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKQkJICBhdGFyaV9zY3NpX3JlZ19yZWFkKCByZWcgKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIGF0YXJpX3Njc2lfcmVnX3dyaXRlKCByZWcsIHZhbHVlICkKKworI2RlZmluZSBOQ1I1MzgwX2ludHIgYXRhcmlfc2NzaV9pbnRyCisjZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZCBhdGFyaV9zY3NpX3F1ZXVlX2NvbW1hbmQKKyNkZWZpbmUgTkNSNTM4MF9hYm9ydCBhdGFyaV9zY3NpX2Fib3J0CisjZGVmaW5lIE5DUjUzODBfcHJvY19pbmZvIGF0YXJpX3Njc2lfcHJvY19pbmZvCisjZGVmaW5lIE5DUjUzODBfZG1hX3JlYWRfc2V0dXAoaW5zdCxkLGMpIGF0YXJpX3Njc2lfZG1hX3NldHVwIChpbnN0LCBkLCBjLCAwKQorI2RlZmluZSBOQ1I1MzgwX2RtYV93cml0ZV9zZXR1cChpbnN0LGQsYykgYXRhcmlfc2NzaV9kbWFfc2V0dXAgKGluc3QsIGQsIGMsIDEpCisjZGVmaW5lIE5DUjUzODBfZG1hX3Jlc2lkdWFsKGluc3QpIGF0YXJpX3Njc2lfZG1hX3Jlc2lkdWFsKCBpbnN0ICkKKyNkZWZpbmUJTkNSNTM4MF9kbWFfeGZlcl9sZW4oaSxjbWQscGhhc2UpIFwKKwlhdGFyaV9kbWFfeGZlcl9sZW4oY21kLT5TQ3AudGhpc19yZXNpZHVhbCxjbWQsKChwaGFzZSkgJiBTUl9JTykgPyAwIDogMSkKKworLyogRGVidWdnaW5nIHByaW50ayBkZWZpbml0aW9uczoKKyAqCisgKiAgQVJCICAtPiBhcmJpdHJhdGlvbgorICogIEFTRU4gLT4gYXV0by1zZW5zZQorICogIERNQSAgLT4gRE1BCisgKiAgSFNIICAtPiBQSU8gaGFuZHNoYWtlCisgKiAgSU5GICAtPiBpbmZvcm1hdGlvbiB0cmFuc2ZlcgorICogIElOSSAgLT4gaW5pdGlhbGl6YXRpb24KKyAqICBJTlQgIC0+IGludGVycnVwdAorICogIExOSyAgLT4gbGlua2VkIGNvbW1hbmRzCisgKiAgTUFJTiAtPiBOQ1I1MzgwX21haW4oKSBjb250cm9sIGZsb3cKKyAqICBOREFUIC0+IG5vIGRhdGEtb3V0IHBoYXNlCisgKiAgTldSICAtPiBubyB3cml0ZSBjb21tYW5kcworICogIFBJTyAgLT4gUElPIHRyYW5zZmVycworICogIFBETUEgLT4gcHNldWRvIERNQSAodW51c2VkIG9uIEF0YXJpKQorICogIFFVICAgLT4gcXVldWVzCisgKiAgUlNMICAtPiByZXNlbGVjdGlvbnMKKyAqICBTRUwgIC0+IHNlbGVjdGlvbnMKKyAqICBVU0wgIC0+IHVzbGVlcCBjcGRlICh1bnVzZWQgb24gQXRhcmkpCisgKiAgTEJTICAtPiBsYXN0IGJ5dGUgc2VudCAodW51c2VkIG9uIEF0YXJpKQorICogIFJTUyAgLT4gcmVzdGFydGluZyBvZiBzZWxlY3Rpb25zCisgKiAgRVhUICAtPiBleHRlbmRlZCBtZXNzYWdlcworICogIEFCUlQgLT4gYWJvcnRpbmcgYW5kIHJlc2V0dGluZworICogIFRBRyAgLT4gcXVldWUgdGFnIGhhbmRsaW5nCisgKiAgTUVSICAtPiBtZXJnaW5nIG9mIGNvbnNlYy4gYnVmZmVycworICoKKyAqLworCisjaWYgTkRFQlVHICYgTkRFQlVHX0FSQklUUkFUSU9OCisjZGVmaW5lIEFSQl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEFSQl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0FVVE9TRU5TRQorI2RlZmluZSBBU0VOX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgQVNFTl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0RNQQorI2RlZmluZSBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19IQU5EU0hBS0UKKyNkZWZpbmUgSFNIX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSFNIX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfSU5GT1JNQVRJT04KKyNkZWZpbmUgSU5GX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSU5GX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfSU5JVAorI2RlZmluZSBJTklfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBJTklfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19JTlRSCisjZGVmaW5lIElOVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIElOVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0xJTktFRAorI2RlZmluZSBMTktfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBMTktfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19NQUlOCisjZGVmaW5lIE1BSU5fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBNQUlOX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTk9fREFUQU9VVAorI2RlZmluZSBOREFUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTkRBVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX05PX1dSSVRFCisjZGVmaW5lIE5XUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIE5XUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1BJTworI2RlZmluZSBQSU9fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQSU9fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19QU0VVRE9fRE1BCisjZGVmaW5lIFBETUFfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBQRE1BX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfUVVFVUVTCisjZGVmaW5lIFFVX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUVVfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19SRVNFTEVDVElPTgorI2RlZmluZSBSU0xfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBSU0xfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19TRUxFQ1RJT04KKyNkZWZpbmUgU0VMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgU0VMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfVVNMRUVQCisjZGVmaW5lIFVTTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFVTTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0xBU1RfQllURV9TRU5UCisjZGVmaW5lIExCU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIExCU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1JFU1RBUlRfU0VMRUNUCisjZGVmaW5lIFJTU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFJTU19QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0VYVEVOREVECisjZGVmaW5lIEVYVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEVYVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0FCT1JUCisjZGVmaW5lIEFCUlRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBBQlJUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfVEFHUworI2RlZmluZSBUQUdfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBUQUdfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HCisjZGVmaW5lIE1FUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIE1FUl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIGNvbmRpdGlvbmFsIG1hY3JvcyBmb3IgTkNSNTM4MF9wcmludF97LHBoYXNlLHN0YXR1c30gKi8KKworI2RlZmluZSBOQ1JfUFJJTlQobWFzaykJXAorCSgoTkRFQlVHICYgKG1hc2spKSA/IE5DUjUzODBfcHJpbnQoaW5zdGFuY2UpIDogKHZvaWQpMCkKKworI2RlZmluZSBOQ1JfUFJJTlRfUEhBU0UobWFzaykgXAorCSgoTkRFQlVHICYgKG1hc2spKSA/IE5DUjUzODBfcHJpbnRfcGhhc2UoaW5zdGFuY2UpIDogKHZvaWQpMCkKKworI2RlZmluZSBOQ1JfUFJJTlRfU1RBVFVTKG1hc2spIFwKKwkoKE5ERUJVRyAmIChtYXNrKSkgPyBOQ1I1MzgwX3ByaW50X3N0YXR1cyhpbnN0YW5jZSkgOiAodm9pZCkwKQorCisKKyNlbmRpZiAvKiBuZGVmIEFTTSAqLworI2VuZGlmIC8qIEFUQVJJX1NDU0lfSCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdHA4NzB1LmMgYi9kcml2ZXJzL3Njc2kvYXRwODcwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Yjc1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXRwODcwdS5jCkBAIC0wLDAgKzEsMzk3MCBAQAorLyogCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3CVd1IENoaW5nIENoZW4KKyAqICAyLjEueCB1cGRhdGUgKEMpIDE5OTggIEtyenlzenRvZiBHLiBCYXJhbm93c2tpCisgKiAgMi41LnggdXBkYXRlIChDKSAyMDAyICBSZWQgSGF0IDxhbGFuQHJlZGhhdC5jb20+CisgKiAgMi42LnggdXBkYXRlIChDKSAyMDA0ICBSZWQgSGF0IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogTWFyY2VsbyBUb3NhdHRpIDxtYXJjZWxvQGNvbmVjdGl2YS5jb20uYnI+IDogU01QIGZpeGVzCisgKgorICogV3UgQ2hpbmcgQ2hlbiA6IE5VTEwgcG9pbnRlciBmaXhlcyAgMjAwMC8wNi8wMgorICoJCSAgIHN1cHBvcnQgYXRwODc2IGNoaXAKKyAqCQkgICBlbmFibGUgMzIgYml0IGZpZm8gdHJhbnNmZXIKKyAqCQkgICBzdXBwb3J0IGNkcm9tICYgcmVtb3ZlIGRldmljZSBydW4gdWx0cmEgc3BlZWQKKyAqCQkgICBmaXggZGlzY29ubmVjdCBidWcgIDIwMDAvMTIvMjEKKyAqCQkgICBzdXBwb3J0IGF0cDg4MCBjaGlwIGx2ZCB1MTYwIDIwMDEvMDUvMTUKKyAqCQkgICBmaXggcHJkIHRhYmxlIGJ1ZyAyMDAxLzA5LzEyICg3LjEpCisgKgorICogYXRwODg1IHN1cHBvcnQgYWRkIGJ5IEFDQVJEIEhhbyBQaW5nIExpYW4gMjAwNS8wMS8wNQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAiYXRwODcwdS5oIgorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhdHA4NzB1X3RlbXBsYXRlOworc3RhdGljIHZvaWQgc2VuZF9zODcwKHN0cnVjdCBhdHBfdW5pdCAqZGV2LHVuc2lnbmVkIGNoYXIgYyk7CitzdGF0aWMgdm9pZCBpczg4NShzdHJ1Y3QgYXRwX3VuaXQgKmRldiwgdW5zaWduZWQgaW50IHdrcG9ydCx1bnNpZ25lZCBjaGFyIGMpOworc3RhdGljIHZvaWQgdHNjYW1fODg1KHZvaWQpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgYXRwODcwdV9pbnRyX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgaW50IHRtcGNpcCwgaWQ7CisJdW5zaWduZWQgY2hhciBpLCBqLCBjLCB0YXJnZXRfaWQsIGx1bixjbWRwOworCXVuc2lnbmVkIGNoYXIgKnByZDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp3b3JrcmVxOworCXVuc2lnbmVkIGludCB3b3JrcG9ydCwgdG1wb3J0LCB0bXBvcnQxOworCXVuc2lnbmVkIGxvbmcgYWRyY250LCBrOworI2lmZGVmIEVEX0RCR1AKKwl1bnNpZ25lZCBsb25nIGw7CisjZW5kaWYKKwlpbnQgZXJyc3R1czsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2lkOworCXN0cnVjdCBhdHBfdW5pdCAqZGV2ID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZob3N0LT5ob3N0ZGF0YTsKKworCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKKwkJdG1wb3J0ID0gZGV2LT5pb3BvcnRbY10gKyAweDFmOworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmICgoaiAmIDB4ODApICE9IDApCisJCXsJCQkKKwkgICAJCWdvdG8gY2hfc2VsOworCQl9CisJCWRldi0+aW5faW50W2NdID0gMDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworY2hfc2VsOgorI2lmZGVmIEVEX0RCR1AJCisJcHJpbnRrKCJhdHA4NzB1X2ludHJfaGFuZGxlIGVudGVyXG4iKTsKKyNlbmRpZgkKKwlkZXYtPmluX2ludFtjXSA9IDE7CisJY21kcCA9IGluYihkZXYtPmlvcG9ydFtjXSArIDB4MTApOworCXdvcmtwb3J0ID0gZGV2LT5pb3BvcnRbY107CisJaWYgKGRldi0+d29ya2luZ1tjXSAhPSAwKSB7CisJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsKKwkJCXRtcG9ydDEgPSB3b3JrcG9ydCArIDB4MTY7CisJCQlpZiAoKGluYih0bXBvcnQxKSAmIDB4ODApID09IDApCisJCQkJb3V0YigoaW5iKHRtcG9ydDEpIHwgMHg4MCksIHRtcG9ydDEpOworCQl9CQkKKwkJdG1wY2lwID0gZGV2LT5wY2lwb3J0W2NdOworCQlpZiAoKGluYih0bXBjaXApICYgMHgwOCkgIT0gMCkKKwkJeworCQkJdG1wY2lwICs9IDB4MjsKKwkJCWZvciAoaz0wOyBrIDwgMTAwMDsgaysrKSB7CisJCQkJaWYgKChpbmIodG1wY2lwKSAmIDB4MDgpID09IDApIHsKKwkJCQkJZ290byBzdG9wX2RtYTsKKwkJCQl9CisJCQkJaWYgKChpbmIodG1wY2lwKSAmIDB4MDEpID09IDApIHsKKwkJCQkJZ290byBzdG9wX2RtYTsKKwkJCQl9CisJCQl9CisJCX0KK3N0b3BfZG1hOgorCQl0bXBjaXAgPSBkZXYtPnBjaXBvcnRbY107CisJCW91dGIoMHgwMCwgdG1wY2lwKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCQorCQlpID0gaW5iKHRtcG9ydCk7CisJCQorCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQl0bXBjaXAgKz0gMjsKKwkJCW91dGIoMHgwNiwgdG1wY2lwKTsKKwkJCXRtcGNpcCAtPSAyOworCQl9CisKKwkJdG1wb3J0IC09IDB4MDI7CisJCXRhcmdldF9pZCA9IGluYih0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKworCQkvKgorCQkgKglSZW1hcCB3aWRlIGRldmljZXMgb250byBpZCBudW1iZXJzCisJCSAqLworCisJCWlmICgodGFyZ2V0X2lkICYgMHg0MCkgIT0gMCkgeworCQkJdGFyZ2V0X2lkID0gKHRhcmdldF9pZCAmIDB4MDcpIHwgMHgwODsKKwkJfSBlbHNlIHsKKwkJCXRhcmdldF9pZCAmPSAweDA3OworCQl9CisKKwkJaWYgKChqICYgMHg0MCkgIT0gMCkgeworCQkgICAgIGlmIChkZXYtPmxhc3RfY21kW2NdID09IDB4ZmYpIHsKKwkJCWRldi0+bGFzdF9jbWRbY10gPSB0YXJnZXRfaWQ7CisJCSAgICAgfQorCQkgICAgIGRldi0+bGFzdF9jbWRbY10gfD0gMHg0MDsKKwkJfQorCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSAKKwkJCWRldi0+cjFmW2NdW3RhcmdldF9pZF0gfD0gajsKKyNpZmRlZiBFRF9EQkdQCisJCXByaW50aygiYXRwODcwdV9pbnRyX2hhbmRsZSBzdGF0dXMgPSAleFxuIixpKTsKKyNlbmRpZgkKKwkJaWYgKGkgPT0gMHg4NSkgeworCQkJaWYgKChkZXYtPmxhc3RfY21kW2NdICYgMHhmMCkgIT0gMHg0MCkgeworCQkJICAgZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CisJCQl9CisJCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQkJdG1wb3J0IC09IDB4MDU7CisJCQkJYWRyY250ID0gMDsKKwkJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMl0gPSBpbmIodG1wb3J0KyspOworCQkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVsxXSA9IGluYih0bXBvcnQrKyk7CisJCQkJKCh1bnNpZ25lZCBjaGFyICopICZhZHJjbnQpWzBdID0gaW5iKHRtcG9ydCk7CisJCQkJaWYgKGRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbiAhPSBhZHJjbnQpCisJCQkJeworCQkJICAgCQlrID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuOworCQkJICAgCQlrIC09IGFkcmNudDsKKwkJCSAgIAkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnRyYW5fbGVuID0gazsJCQkgICAKKwkJCSAgIAlkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4gPSBhZHJjbnQ7CQkJICAgCisJCQkJfQorI2lmZGVmIEVEX0RCR1AKKwkJCQlwcmludGsoInRtcG9ydCA9ICV4IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbiA9ICVkIGRldi0+aWRbY11bdGFyZ2V0X2lkXS50cmFuX2xlbiA9ICVkXG4iLHRtcG9ydCxkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4sZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnRyYW5fbGVuKTsKKyNlbmRpZgkJCisJCQl9CisKKwkJCS8qCisJCQkgKiAgICAgIEZsaXAgd2lkZQorCQkJICovCQkJCisJCQlpZiAoZGV2LT53aWRlX2lkW2NdICE9IDApIHsKKwkJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWI7CisJCQkJb3V0YigweDAxLCB0bXBvcnQpOworCQkJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAweDAxKSB7CisJCQkJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJCQl9CisJCQl9CQkKKwkJCS8qCisJCQkgKglJc3N1ZSBtb3JlIGNvbW1hbmRzCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CQkJIAkJCSAKKwkJCWlmICgoKGRldi0+cXVoZFtjXSAhPSBkZXYtPnF1ZW5kW2NdKSB8fCAoZGV2LT5sYXN0X2NtZFtjXSAhPSAweGZmKSkgJiYKKwkJCSAgICAoZGV2LT5pbl9zbmRbY10gPT0gMCkpIHsKKyNpZmRlZiBFRF9EQkdQCisJCQkJcHJpbnRrKCJDYWxsIHNlbnRfczg3MFxuIik7CisjZW5kaWYJCQkJCisJCQkJc2VuZF9zODcwKGRldixjKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCS8qCisJCQkgKglEb25lCisJCQkgKi8KKwkJCWRldi0+aW5faW50W2NdID0gMDsKKyNpZmRlZiBFRF9EQkdQCisJCQkJcHJpbnRrKCJTdGF0dXMgMHg4NSByZXR1cm5cbiIpOworI2VuZGlmCQkJCQorCQkJZ290byBoYW5kbGVkOworCQl9CisKKwkJaWYgKGkgPT0gMHg0MCkgeworCQkgICAgIGRldi0+bGFzdF9jbWRbY10gfD0gMHg0MDsKKwkJICAgICBkZXYtPmluX2ludFtjXSA9IDA7CisJCSAgICAgZ290byBoYW5kbGVkOworCQl9CisKKwkJaWYgKGkgPT0gMHgyMSkgeworCQkJaWYgKChkZXYtPmxhc3RfY21kW2NdICYgMHhmMCkgIT0gMHg0MCkgeworCQkJICAgZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CisJCQl9CisJCQl0bXBvcnQgLT0gMHgwNTsKKwkJCWFkcmNudCA9IDA7CisJCQkoKHVuc2lnbmVkIGNoYXIgKikgJmFkcmNudClbMl0gPSBpbmIodG1wb3J0KyspOworCQkJKCh1bnNpZ25lZCBjaGFyICopICZhZHJjbnQpWzFdID0gaW5iKHRtcG9ydCsrKTsKKwkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVswXSA9IGluYih0bXBvcnQpOworCQkJayA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbjsKKwkJCWsgLT0gYWRyY250OworCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnRyYW5fbGVuID0gazsKKwkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbiA9IGFkcmNudDsKKwkJCXRtcG9ydCAtPSAweDA0OworCQkJb3V0YigweDQxLCB0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDg7CisJCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCQlnb3RvIGhhbmRsZWQ7CisJCX0KKworCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQlpZiAoKGkgPT0gMHg0YykgfHwgKGkgPT0gMHg0ZCkgfHwgKGkgPT0gMHg4YykgfHwgKGkgPT0gMHg4ZCkpIHsKKwkJICAgCQlpZiAoKGkgPT0gMHg0YykgfHwgKGkgPT0gMHg4YykpIAorCQkgICAgICAJCQlpPTB4NDg7CisJCSAgIAkJZWxzZSAKKwkJICAgICAgCQkJaT0weDQ5OworCQkgICAJfQkKKwkJCQorCQl9CisJCWlmICgoaSA9PSAweDgwKSB8fCAoaSA9PSAweDhmKSkgeworI2lmZGVmIEVEX0RCR1AKKwkJCXByaW50ayhLRVJOX0RFQlVHICJEZXZpY2UgcmVzZWxlY3RcbiIpOworI2VuZGlmCQkJCisJCQlsdW4gPSAwOworCQkJdG1wb3J0IC09IDB4MDc7CisJCQlpZiAoY21kcCA9PSAweDQ0IHx8IGk9PTB4ODApIHsKKwkJCQl0bXBvcnQgKz0gMHgwZDsKKwkJCQlsdW4gPSBpbmIodG1wb3J0KSAmIDB4MDc7CisJCQl9IGVsc2UgeworCQkJCWlmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4ZjApICE9IDB4NDApIHsKKwkJCQkgICBkZXYtPmxhc3RfY21kW2NdID0gMHhmZjsKKwkJCQl9CisJCQkJaWYgKGNtZHAgPT0gMHg0MSkgeworI2lmZGVmIEVEX0RCR1AKKwkJCQkJcHJpbnRrKCJjbWRwID0gMHg0MVxuIik7CisjZW5kaWYJCQkJCQkKKwkJCQkJdG1wb3J0ICs9IDB4MDI7CisJCQkJCWFkcmNudCA9IDA7CisJCQkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVsyXSA9IGluYih0bXBvcnQrKyk7CisJCQkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVsxXSA9IGluYih0bXBvcnQrKyk7CisJCQkJCSgodW5zaWduZWQgY2hhciAqKSAmYWRyY250KVswXSA9IGluYih0bXBvcnQpOworCQkJCQlrID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuOworCQkJCQlrIC09IGFkcmNudDsKKwkJCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnRyYW5fbGVuID0gazsKKwkJCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmxhc3RfbGVuID0gYWRyY250OworCQkJCQl0bXBvcnQgKz0gMHgwNDsKKwkJCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQkJCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCQkJCWdvdG8gaGFuZGxlZDsKKwkJCQl9IGVsc2UgeworI2lmZGVmIEVEX0RCR1AKKwkJCQkJcHJpbnRrKCJjbWRwICE9IDB4NDFcbiIpOworI2VuZGlmCQkJCQkJCisJCQkJCW91dGIoMHg0NiwgdG1wb3J0KTsKKwkJCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmRpcmN0ID0gMHgwMDsKKwkJCQkJdG1wb3J0ICs9IDB4MDI7CisJCQkJCW91dGIoMHgwMCwgdG1wb3J0KyspOworCQkJCQlvdXRiKDB4MDAsIHRtcG9ydCsrKTsKKwkJCQkJb3V0YigweDAwLCB0bXBvcnQrKyk7CisJCQkJCXRtcG9ydCArPSAweDAzOworCQkJCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCQkJCWRldi0+aW5faW50W2NdID0gMDsKKwkJCQkJZ290byBoYW5kbGVkOworCQkJCX0KKwkJCX0KKwkJCWlmIChkZXYtPmxhc3RfY21kW2NdICE9IDB4ZmYpIHsKKwkJCSAgIGRldi0+bGFzdF9jbWRbY10gfD0gMHg0MDsKKwkJCX0KKwkJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsKKwkJCQlqID0gaW5iKGRldi0+YmFzZXBvcnQgKyAweDI5KSAmIDB4ZmU7CisJCQkJb3V0YihqLCBkZXYtPmJhc2Vwb3J0ICsgMHgyOSk7CisJCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDE2OworCQkJfSBlbHNlIHsKKwkJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTA7CisJCQkJb3V0YigweDQ1LCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OwkJCQkKKwkJCX0KKwkJCQorCQkJdGFyZ2V0X2lkID0gaW5iKHRtcG9ydCk7CisJCQkvKgorCQkJICoJUmVtYXAgd2lkZSBpZGVudGlmaWVycworCQkJICovCisJCQlpZiAoKHRhcmdldF9pZCAmIDB4MTApICE9IDApIHsKKwkJCQl0YXJnZXRfaWQgPSAodGFyZ2V0X2lkICYgMHgwNykgfCAweDA4OworCQkJfSBlbHNlIHsKKwkJCQl0YXJnZXRfaWQgJj0gMHgwNzsKKwkJCX0KKwkJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsKKwkJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MTA7CisJCQkJb3V0YigweDQ1LCB0bXBvcnQpOworCQkJfQorCQkJd29ya3JlcSA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5jdXJyX3JlcTsKKyNpZmRlZiBFRF9EQkdQCQkJCisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hhbm5lbCA9ICVkIElEID0gJWQgTFVOID0gJWQgQ0RCIixjLHdvcmtyZXEtPmRldmljZS0+aWQsd29ya3JlcS0+ZGV2aWNlLT5sdW4pOworCQkJZm9yKGw9MDtsPHdvcmtyZXEtPmNtZF9sZW47bCsrKQorCQkJeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIgJXgiLHdvcmtyZXEtPmNtbmRbbF0pOworCQkJfQorI2VuZGlmCQorCQkJCisJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MGY7CisJCQlvdXRiKGx1biwgdG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDAyOworCQkJb3V0YihkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJCWFkcmNudCA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS50cmFuX2xlbjsKKwkJCWsgPSBkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW47CisKKwkJCW91dGIoKCh1bnNpZ25lZCBjaGFyICopICZrKVsyXSwgdG1wb3J0KyspOworCQkJb3V0YigoKHVuc2lnbmVkIGNoYXIgKikgJmspWzFdLCB0bXBvcnQrKyk7CisJCQlvdXRiKCgodW5zaWduZWQgY2hhciAqKSAmaylbMF0sIHRtcG9ydCsrKTsKKyNpZmRlZiBFRF9EQkdQCQkJCisJCQlwcmludGsoImsgJXgsIGtbMF0gMHgleCBrWzFdIDB4JXgga1syXSAweCV4XG4iLCBrLCBpbmIodG1wb3J0LTEpLCBpbmIodG1wb3J0LTIpLCBpbmIodG1wb3J0LTMpKTsKKyNlbmRpZgkJCQorCQkJLyogUmVtYXAgd2lkZSAqLworCQkJaiA9IHRhcmdldF9pZDsKKwkJCWlmICh0YXJnZXRfaWQgPiA3KSB7CisJCQkJaiA9IChqICYgMHgwNykgfCAweDQwOworCQkJfQorCQkJLyogQWRkIGRpcmVjdGlvbiAqLworCQkJaiB8PSBkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3Q7CisJCQlvdXRiKGosIHRtcG9ydCsrKTsKKwkJCW91dGIoMHg4MCx0bXBvcnQpOworCQkJCisJCQkvKiBlbmFibGUgMzIgYml0IGZpZm8gdHJhbnNmZXIgKi8JCisJCQlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCQkJdG1wY2lwID0gZGV2LT5wY2lwb3J0W2NdICsgMTsKKwkJCQlpPWluYih0bXBjaXApICYgMHhmMzsKKwkJCQkvL2o9d29ya3JlcS0+Y21uZFswXTsJICAgIAkJICAgIAkKKwkJCQlpZiAoKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwYSkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyYSkpIHsKKwkJCQkgICBpIHw9IDB4MGM7CisJCQkJfQorCQkJCW91dGIoaSx0bXBjaXApOwkJICAgIAkJICAgIAkJCisJCQl9IGVsc2UgaWYgKChkZXYtPmRldl9pZCA9PSBBVFA4ODBfREVWSUQxKSB8fAorCSAgICAJCSAgICAJICAgKGRldi0+ZGV2X2lkID09IEFUUDg4MF9ERVZJRDIpICkgeworCQkJCXRtcG9ydCA9IHdvcmtwb3J0IC0gMHgwNTsKKwkJCQlpZiAoKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwYSkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyYSkpIHsKKwkJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKChpbmIodG1wb3J0KSAmIDB4M2YpIHwgMHhjMCksIHRtcG9ydCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKGluYih0bXBvcnQpICYgMHgzZiksIHRtcG9ydCk7CisJCQkJfQorCQkJfSBlbHNlIHsJCQkJCisJCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDNhOworCQkJCWlmICgod29ya3JlcS0+Y21uZFswXSA9PSAweDA4KSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDI4KSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDBhKSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDJhKSkgeworCQkJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKGluYih0bXBvcnQpICYgMHhmMykgfCAweDA4KSwgdG1wb3J0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoaW5iKHRtcG9ydCkgJiAweGYzKSwgdG1wb3J0KTsKKwkJCQl9CQkJCQkJCQkJCQkJCQkKKwkJCX0JCisJCQl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWI7CisJCQlqID0gMDsKKwkJCWlkID0gMTsKKwkJCWlkID0gaWQgPDwgdGFyZ2V0X2lkOworCQkJLyoKKwkJCSAqCUlzIHRoaXMgYSB3aWRlIGRldmljZQorCQkJICovCisJCQlpZiAoKGlkICYgZGV2LT53aWRlX2lkW2NdKSAhPSAwKSB7CisJCQkJaiB8PSAweDAxOworCQkJfQorCQkJb3V0YihqLCB0bXBvcnQpOworCQkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IGopIHsKKwkJCQlvdXRiKGosdG1wb3J0KTsKKwkJCX0KKwkJCWlmIChkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW4gPT0gMCkgeworCQkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxODsKKwkJCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCQkJZGV2LT5pbl9pbnRbY10gPSAwOworI2lmZGVmIEVEX0RCR1AKKwkJCQlwcmludGsoImRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbiA9IDBcbiIpOworI2VuZGlmCQkJCQkKKwkJCQlnb3RvIGhhbmRsZWQ7CisJCQl9CisjaWZkZWYgRURfREJHUAorCQkJcHJpbnRrKCJ0YXJnZXRfaWQgPSAlZCBhZHJjbnQgPSAlZFxuIix0YXJnZXRfaWQsYWRyY250KTsKKyNlbmRpZgkJCQorCQkJcHJkID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZF9wb3M7CisJCQl3aGlsZSAoYWRyY250ICE9IDApIHsKKwkJCQlpZCA9ICgodW5zaWduZWQgc2hvcnQgaW50ICopcHJkKVsyXTsKKwkJCQlpZiAoaWQgPT0gMCkgeworCQkJCQlrID0gMHgxMDAwMDsKKwkJCQl9IGVsc2UgeworCQkJCQlrID0gaWQ7CisJCQkJfQorCQkJCWlmIChrID4gYWRyY250KSB7CisJCQkJCSgodW5zaWduZWQgc2hvcnQgaW50ICopcHJkKVsyXSA9ICh1bnNpZ25lZCBzaG9ydCBpbnQpCisJCQkJCSAgICAoayAtIGFkcmNudCk7CisJCQkJCSgodW5zaWduZWQgbG9uZyAqKXByZClbMF0gKz0gYWRyY250OworCQkJCQlhZHJjbnQgPSAwOworCQkJCQlkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkX3BvcyA9IHByZDsKKwkJCQl9IGVsc2UgeworCQkJCQlhZHJjbnQgLT0gazsKKwkJCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZGFkZHIgKz0gMHgwODsKKwkJCQkJcHJkICs9IDB4MDg7CisJCQkJCWlmIChhZHJjbnQgPT0gMCkgeworCQkJCQkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZF9wb3MgPSBwcmQ7CisJCQkJCX0KKwkJCQl9CQkJCQorCQkJfQorCQkJdG1wY2lwID0gZGV2LT5wY2lwb3J0W2NdICsgMHgwNDsKKwkJCW91dGwoZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZGFkZHIsIHRtcGNpcCk7CisjaWZkZWYgRURfREJHUAorCQkJcHJpbnRrKCJkZXYtPmlkWyVkXVslZF0ucHJkYWRkciAweCU4eFxuIiwgYywgdGFyZ2V0X2lkLCBkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkYWRkcik7CisjZW5kaWYKKwkJCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsKKwkJCQl0bXBjaXAgLT0gMHgwNDsKKwkJCX0gZWxzZSB7CisJCQkJdG1wY2lwIC09IDB4MDI7CisJCQkJb3V0YigweDA2LCB0bXBjaXApOworCQkJCW91dGIoMHgwMCwgdG1wY2lwKTsKKwkJCQl0bXBjaXAgLT0gMHgwMjsKKwkJCX0KKwkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxODsKKwkJCS8qCisJCQkgKglDaGVjayB0cmFuc2ZlciBkaXJlY3Rpb24KKwkJCSAqLworCQkJaWYgKGRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCAhPSAwKSB7CisJCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQkJCW91dGIoMHgwMSwgdG1wY2lwKTsKKwkJCQlkZXYtPmluX2ludFtjXSA9IDA7CisjaWZkZWYgRURfREJHUAorCQkJCXByaW50aygic3RhdHVzIDB4ODAgcmV0dXJuIGRpcmN0ICE9IDBcbiIpOworI2VuZGlmCQkJCQorCQkJCWdvdG8gaGFuZGxlZDsKKwkJCX0KKwkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJCW91dGIoMHgwOSwgdG1wY2lwKTsKKwkJCWRldi0+aW5faW50W2NdID0gMDsKKyNpZmRlZiBFRF9EQkdQCisJCQlwcmludGsoInN0YXR1cyAweDgwIHJldHVybiBkaXJjdCA9IDBcbiIpOworI2VuZGlmCQkJCisJCQlnb3RvIGhhbmRsZWQ7CisJCX0KKworCQkvKgorCQkgKglDdXJyZW50IHNjc2kgcmVxdWVzdCBvbiB0aGlzIHRhcmdldAorCQkgKi8KKworCQl3b3JrcmVxID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmN1cnJfcmVxOworCisJCWlmIChpID09IDB4NDIpIHsKKwkJCWlmICgoZGV2LT5sYXN0X2NtZFtjXSAmIDB4ZjApICE9IDB4NDApCisJCQl7CisJCQkgICBkZXYtPmxhc3RfY21kW2NdID0gMHhmZjsKKwkJCX0KKwkJCWVycnN0dXMgPSAweDAyOworCQkJd29ya3JlcS0+cmVzdWx0ID0gZXJyc3R1czsKKwkJCWdvdG8gZ29fNDI7CisJCX0KKwkJaWYgKGkgPT0gMHgxNikgeworCQkJaWYgKChkZXYtPmxhc3RfY21kW2NdICYgMHhmMCkgIT0gMHg0MCkgeworCQkJICAgZGV2LT5sYXN0X2NtZFtjXSA9IDB4ZmY7CisJCQl9CisJCQllcnJzdHVzID0gMDsKKwkJCXRtcG9ydCAtPSAweDA4OworCQkJZXJyc3R1cyA9IGluYih0bXBvcnQpOworCQkJaWYgKCgoZGV2LT5yMWZbY11bdGFyZ2V0X2lkXSAmIDB4MTApICE9IDApJiYoZGV2LT5kZXZfaWQ9PUFUUDg4NV9ERVZJRCkpIHsKKwkJCSAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkFFQzY3MTYyIENSQyBFUlJPUiAhXG4iKTsKKwkJCSAgIGVycnN0dXMgPSAweDAyOworCQkJfQorCQkJd29ya3JlcS0+cmVzdWx0ID0gZXJyc3R1czsKK2dvXzQyOgorCQkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgewkJCisJCQkJaiA9IGluYihkZXYtPmJhc2Vwb3J0ICsgMHgyOSkgfCAweDAxOworCQkJCW91dGIoaiwgZGV2LT5iYXNlcG9ydCArIDB4MjkpOworCQkJfQorCQkJLyoKKwkJCSAqCUNvbXBsZXRlIHRoZSBjb21tYW5kCisJCQkgKi8KKwkJCWlmICh3b3JrcmVxLT51c2Vfc2cpIHsKKwkJCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopd29ya3JlcS0+YnVmZmVyLAorCQkJCQl3b3JrcmVxLT51c2Vfc2csCisJCQkJCXdvcmtyZXEtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCX0gZWxzZSBpZiAod29ya3JlcS0+cmVxdWVzdF9idWZmbGVuICYmCisJCQkJCXdvcmtyZXEtPnNjX2RhdGFfZGlyZWN0aW9uICE9IERNQV9OT05FKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsCisJCQkJCXdvcmtyZXEtPlNDcC5kbWFfaGFuZGxlLAorCQkJCQl3b3JrcmVxLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCXdvcmtyZXEtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCX0JCQkKKwkJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQkoKndvcmtyZXEtPnNjc2lfZG9uZSkgKHdvcmtyZXEpOworI2lmZGVmIEVEX0RCR1AKKwkJCSAgIHByaW50aygid29ya3JlcS0+c2NzaV9kb25lXG4iKTsKKyNlbmRpZgkKKwkJCS8qCisJCQkgKglDbGVhciBpdCBvZmYgdGhlIHF1ZXVlCisJCQkgKi8KKwkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5jdXJyX3JlcSA9IE5VTEw7CisJCQlkZXYtPndvcmtpbmdbY10tLTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCS8qCisJCQkgKiAgICAgIFRha2UgaXQgYmFjayB3aWRlCisJCQkgKi8KKwkJCWlmIChkZXYtPndpZGVfaWRbY10gIT0gMCkgeworCQkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxYjsKKwkJCQlvdXRiKDB4MDEsIHRtcG9ydCk7CisJCQkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDB4MDEpIHsKKwkJCQkJb3V0YigweDAxLCB0bXBvcnQpOworCQkJCX0gICAgICAgCisJCQl9IAorCQkJLyoKKwkJCSAqCUlmIHRoZXJlIGlzIHN0dWZmIHRvIHNlbmQgYW5kIG5vdGhpbmcgZ29pbmcgdGhlbiBzZW5kIGl0CisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlpZiAoKChkZXYtPmxhc3RfY21kW2NdICE9IDB4ZmYpIHx8IChkZXYtPnF1aGRbY10gIT0gZGV2LT5xdWVuZFtjXSkpICYmCisJCQkgICAgKGRldi0+aW5fc25kW2NdID09IDApKSB7CisjaWZkZWYgRURfREJHUAorCQkJICAgcHJpbnRrKCJDYWxsIHNlbnRfczg3MChzY3NpX2RvbmUpXG4iKTsKKyNlbmRpZgkJCQkgICAKKwkJCSAgIHNlbmRfczg3MChkZXYsYyk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCQlnb3RvIGhhbmRsZWQ7CisJCX0KKwkJaWYgKChkZXYtPmxhc3RfY21kW2NdICYgMHhmMCkgIT0gMHg0MCkgeworCQkgICBkZXYtPmxhc3RfY21kW2NdID0gMHhmZjsKKwkJfQorCQlpZiAoaSA9PSAweDRmKSB7CisJCQlpID0gMHg4OTsKKwkJfQorCQlpICY9IDB4MGY7CisJCWlmIChpID09IDB4MDkpIHsKKwkJCXRtcGNpcCArPSA0OworCQkJb3V0bChkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkYWRkciwgdG1wY2lwKTsKKwkJCXRtcGNpcCA9IHRtcGNpcCAtIDI7CisJCQlvdXRiKDB4MDYsIHRtcGNpcCk7CisJCQlvdXRiKDB4MDAsIHRtcGNpcCk7CisJCQl0bXBjaXAgPSB0bXBjaXAgLSAyOworCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDEwOworCQkJb3V0YigweDQxLCB0bXBvcnQpOworCQkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgeworCQkJCXRtcG9ydCArPSAyOworCQkJCWsgPSBkZXYtPmlkW2NdW3RhcmdldF9pZF0ubGFzdF9sZW47CisJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgY2hhciAqKSAoJmspKVsyXSksIHRtcG9ydCsrKTsKKwkJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBjaGFyICopICgmaykpWzFdKSwgdG1wb3J0KyspOworCQkJCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIGNoYXIgKikgKCZrKSlbMF0pLCB0bXBvcnQpOworCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCA9IDB4MDA7CisJCQkJdG1wb3J0ICs9IDB4MDQ7CisJCQl9IGVsc2UgeworCQkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCA9IDB4MDA7CisJCQkJdG1wb3J0ICs9IDB4MDg7CQkJCQorCQkJfQorCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQkJb3V0YigweDA5LCB0bXBjaXApOworCQkJZGV2LT5pbl9pbnRbY10gPSAwOworCQkJZ290byBoYW5kbGVkOworCQl9CisJCWlmIChpID09IDB4MDgpIHsKKwkJCXRtcGNpcCArPSA0OworCQkJb3V0bChkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkYWRkciwgdG1wY2lwKTsKKwkJCXRtcGNpcCA9IHRtcGNpcCAtIDI7CisJCQlvdXRiKDB4MDYsIHRtcGNpcCk7CisJCQlvdXRiKDB4MDAsIHRtcGNpcCk7CisJCQl0bXBjaXAgPSB0bXBjaXAgLSAyOworCQkJdG1wb3J0ID0gd29ya3BvcnQgKyAweDEwOworCQkJb3V0YigweDQxLCB0bXBvcnQpOworCQkJaWYgKGRldi0+ZGV2X2lkID09IEFUUDg4NV9ERVZJRCkgewkJCisJCQkJdG1wb3J0ICs9IDI7CisJCQkJayA9IGRldi0+aWRbY11bdGFyZ2V0X2lkXS5sYXN0X2xlbjsKKwkJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBjaGFyICopICgmaykpWzJdKSwgdG1wb3J0KyspOworCQkJCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIGNoYXIgKikgKCZrKSlbMV0pLCB0bXBvcnQrKyk7CisJCQkJb3V0YigodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgY2hhciAqKSAoJmspKVswXSksIHRtcG9ydCsrKTsKKwkJCX0gZWxzZSB7CisJCQkJdG1wb3J0ICs9IDU7CisJCQl9CisJCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoaW5iKHRtcG9ydCkgfCAweDIwKSwgdG1wb3J0KTsKKwkJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCA9IDB4MjA7CisJCQl0bXBvcnQgKz0gMHgwMzsKKwkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJCW91dGIoMHgwMSwgdG1wY2lwKTsKKwkJCWRldi0+aW5faW50W2NdID0gMDsKKwkJCWdvdG8gaGFuZGxlZDsKKwkJfQorCQl0bXBvcnQgLT0gMHgwNzsKKwkJaWYgKGkgPT0gMHgwYSkgeworCQkJb3V0YigweDMwLCB0bXBvcnQpOworCQl9IGVsc2UgeworCQkJb3V0YigweDQ2LCB0bXBvcnQpOworCQl9CisJCWRldi0+aWRbY11bdGFyZ2V0X2lkXS5kaXJjdCA9IDB4MDA7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKDB4MDAsIHRtcG9ydCsrKTsKKwkJb3V0YigweDAwLCB0bXBvcnQrKyk7CisJCW91dGIoMHgwMCwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCWdvdG8gaGFuZGxlZDsKKwl9IGVsc2UgeworLy8JCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxNzsKKy8vCQlpbmIodG1wb3J0KTsKKy8vCQlkZXYtPndvcmtpbmdbY10gPSAwOworCQlkZXYtPmluX2ludFtjXSA9IDA7CisJCWdvdG8gaGFuZGxlZDsKKwl9CisJCitoYW5kbGVkOgorI2lmZGVmIEVEX0RCR1AKKwlwcmludGsoImF0cDg3MHVfaW50cl9oYW5kbGUgZXhpdFxuIik7CisjZW5kaWYJCQkKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisvKioKKyAqCWF0cDg3MHVfcXVldWVjb21tYW5kCS0JUXVldWUgU0NTSSBjb21tYW5kCisgKglAcmVxX3A6IHJlcXVlc3QgYmxvY2sKKyAqCUBkb25lOiBjb21wbGV0aW9uIGZ1bmN0aW9uCisgKgorICoJUXVldWUgYSBjb21tYW5kIHRvIHRoZSBBVFAgcXVldWUuIENhbGxlZCB3aXRoIHRoZSBob3N0IGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBhdHA4NzB1X3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICogcmVxX3AsIAorCQkJIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgaW50IHRtcG9ydCxtOwkKKwlzdHJ1Y3QgYXRwX3VuaXQgKmRldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCisJYyA9IHJlcV9wLT5kZXZpY2UtPmNoYW5uZWw7CQorCXJlcV9wLT5zZW5zZV9idWZmZXJbMF09MDsKKwlyZXFfcC0+cmVzaWQgPSAwOworCWlmIChyZXFfcC0+ZGV2aWNlLT5jaGFubmVsID4gMSkgeworCQlyZXFfcC0+cmVzdWx0ID0gMHgwMDA0MDAwMDsKKwkJZG9uZShyZXFfcCk7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygiYXRwODcwdV9xdWV1ZWNvbW1hbmQgOiByZXFfcC0+ZGV2aWNlLT5jaGFubmVsID4gMVxuIik7CQorI2VuZGlmCQkJCisJCXJldHVybiAwOworCX0KKworCWhvc3QgPSByZXFfcC0+ZGV2aWNlLT5ob3N0OworCWRldiA9IChzdHJ1Y3QgYXRwX3VuaXQgKikmaG9zdC0+aG9zdGRhdGE7CisJCQorCisJCQorCW0gPSAxOworCW0gPSBtIDw8IHJlcV9wLT5kZXZpY2UtPmlkOworCisJLyoKKwkgKiAgICAgIEZha2UgYSB0aW1lb3V0IGZvciBtaXNzaW5nIHRhcmdldHMKKwkgKi8KKworCWlmICgobSAmIGRldi0+YWN0aXZlX2lkW2NdKSA9PSAwKSB7CisJCXJlcV9wLT5yZXN1bHQgPSAweDAwMDQwMDAwOworCQlkb25lKHJlcV9wKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRvbmUpIHsKKwkJcmVxX3AtPnNjc2lfZG9uZSA9IGRvbmU7CisJfSBlbHNlIHsKKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCAiYXRwODcwdV9xdWV1ZWNvbW1hbmQ6IGRvbmUgY2FuJ3QgYmUgTlVMTFxuIik7CisjZW5kaWYJCQorCQlyZXFfcC0+cmVzdWx0ID0gMDsKKwkJZG9uZShyZXFfcCk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKgorCSAqCUNvdW50IG5ldyBjb21tYW5kCisJICovCisJZGV2LT5xdWVuZFtjXSsrOworCWlmIChkZXYtPnF1ZW5kW2NdID49IHFjbnQpIHsKKwkJZGV2LT5xdWVuZFtjXSA9IDA7CisJfQorCQorCS8qCisJICoJQ2hlY2sgcXVldWUgc3RhdGUKKwkgKi8KKwlpZiAoZGV2LT5xdWhkW2NdID09IGRldi0+cXVlbmRbY10pIHsKKwkJaWYgKGRldi0+cXVlbmRbY10gPT0gMCkgeworCQkJZGV2LT5xdWVuZFtjXSA9IHFjbnQ7CisJCX0KKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCJhdHA4NzB1X3F1ZXVlY29tbWFuZCA6IGRldi0+cXVoZFtjXSA9PSBkZXYtPnF1ZW5kW2NdXG4iKTsKKyNlbmRpZgkJCisJCWRldi0+cXVlbmRbY10tLTsKKwkJcmVxX3AtPnJlc3VsdCA9IDB4MDAwMjAwMDA7CisJCWRvbmUocmVxX3ApOwkKKwkJcmV0dXJuIDA7CisJfQorCWRldi0+cXVlcmVxW2NdW2Rldi0+cXVlbmRbY11dID0gcmVxX3A7CisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbY10gKyAweDFjOworI2lmZGVmIEVEX0RCR1AJCisJcHJpbnRrKCJkZXYtPmlvcG9ydFtjXSA9ICV4IGluYih0bXBvcnQpID0gJXggZGV2LT5pbl9pbnRbJWRdID0gJWQgZGV2LT5pbl9zbmRbJWRdID0gJWRcbiIsZGV2LT5pb3BvcnRbY10saW5iKHRtcG9ydCksYyxkZXYtPmluX2ludFtjXSxjLGRldi0+aW5fc25kW2NdKTsKKyNlbmRpZgorCWlmICgoaW5iKHRtcG9ydCkgPT0gMCkgJiYgKGRldi0+aW5faW50W2NdID09IDApICYmIChkZXYtPmluX3NuZFtjXSA9PSAwKSkgeworI2lmZGVmIEVEX0RCR1AKKwkJcHJpbnRrKCJDYWxsIHNlbnRfczg3MChhdHA4NzB1X3F1ZXVlY29tbWFuZClcbiIpOworI2VuZGlmCQkKKwkJc2VuZF9zODcwKGRldixjKTsKKwl9CisjaWZkZWYgRURfREJHUAkKKwlwcmludGsoImF0cDg3MHVfcXVldWVjb21tYW5kIDogZXhpdFxuIik7CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VuZF9zODcwCS0Jc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIKKyAqCUBob3N0OiBob3N0CisgKgorICoJT24gZW50cnkgdGhlcmUgaXMgd29yayBxdWV1ZWQgdG8gYmUgZG9uZS4gV2UgbW92ZSBzb21lIG9mIHRoYXQgd29yayB0byB0aGUKKyAqCWNvbnRyb2xsZXIgaXRzZWxmLiAKKyAqCisgKglDYWxsZXIgaG9sZHMgdGhlIGhvc3QgbG9jay4KKyAqLworc3RhdGljIHZvaWQgc2VuZF9zODcwKHN0cnVjdCBhdHBfdW5pdCAqZGV2LHVuc2lnbmVkIGNoYXIgYykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wb3J0OworCXN0cnVjdCBzY3NpX2NtbmQgKndvcmtyZXE7CisJdW5zaWduZWQgaW50IGk7Ly8sazsKKwl1bnNpZ25lZCBjaGFyICBqLCB0YXJnZXRfaWQ7CisJdW5zaWduZWQgY2hhciAqcHJkOworCXVuc2lnbmVkIHNob3J0IGludCB0bXBjaXAsIHc7CisJdW5zaWduZWQgbG9uZyBsLCBidHRsID0gMDsKKwl1bnNpZ25lZCBpbnQgd29ya3BvcnQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BudDsKKwl1bnNpZ25lZCBsb25nICBzZ19jb3VudDsKKworCWlmIChkZXYtPmluX3NuZFtjXSAhPSAwKSB7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygiY21uZCBpbl9zbmRcbiIpOworI2VuZGlmCisJCXJldHVybjsKKwl9CisjaWZkZWYgRURfREJHUAorCXByaW50aygiU2VudF9zODcwIGVudGVyXG4iKTsKKyNlbmRpZgorCWRldi0+aW5fc25kW2NdID0gMTsKKwlpZiAoKGRldi0+bGFzdF9jbWRbY10gIT0gMHhmZikgJiYgKChkZXYtPmxhc3RfY21kW2NdICYgMHg0MCkgIT0gMCkpIHsKKwkJZGV2LT5sYXN0X2NtZFtjXSAmPSAweDBmOworCQl3b3JrcmVxID0gZGV2LT5pZFtjXVtkZXYtPmxhc3RfY21kW2NdXS5jdXJyX3JlcTsKKwkJaWYgKHdvcmtyZXEgIT0gTlVMTCkgewkvKiBjaGVjayBOVUxMIHBvaW50ZXIgKi8KKwkJICAgZ290byBjbWRfc3VicDsKKwkJfQorCQlkZXYtPmxhc3RfY21kW2NdID0gMHhmZjsJCisJCWlmIChkZXYtPnF1aGRbY10gPT0gZGV2LT5xdWVuZFtjXSkgeworCQkgICAJZGV2LT5pbl9zbmRbY10gPSAwOworCQkgICAJcmV0dXJuIDsKKwkJfQorCX0KKwlpZiAoKGRldi0+bGFzdF9jbWRbY10gIT0gMHhmZikgJiYgKGRldi0+d29ya2luZ1tjXSAhPSAwKSkgeworCSAgICAgCWRldi0+aW5fc25kW2NdID0gMDsKKwkgICAgIAlyZXR1cm4gOworCX0KKwlkZXYtPndvcmtpbmdbY10rKzsKKwlqID0gZGV2LT5xdWhkW2NdOworCWRldi0+cXVoZFtjXSsrOworCWlmIChkZXYtPnF1aGRbY10gPj0gcWNudCkgeworCQlkZXYtPnF1aGRbY10gPSAwOworCX0KKwl3b3JrcmVxID0gZGV2LT5xdWVyZXFbY11bZGV2LT5xdWhkW2NdXTsKKwlpZiAoZGV2LT5pZFtjXVt3b3JrcmVxLT5kZXZpY2UtPmlkXS5jdXJyX3JlcSA9PSAwKSB7CQorCQlkZXYtPmlkW2NdW3dvcmtyZXEtPmRldmljZS0+aWRdLmN1cnJfcmVxID0gd29ya3JlcTsKKwkJZGV2LT5sYXN0X2NtZFtjXSA9IHdvcmtyZXEtPmRldmljZS0+aWQ7CisJCWdvdG8gY21kX3N1YnA7CisJfQkKKwlkZXYtPnF1aGRbY10gPSBqOworCWRldi0+d29ya2luZ1tjXS0tOworCWRldi0+aW5fc25kW2NdID0gMDsKKwlyZXR1cm47CitjbWRfc3VicDoKKwl3b3JrcG9ydCA9IGRldi0+aW9wb3J0W2NdOworCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxZjsKKwlpZiAoKGluYih0bXBvcnQpICYgMHhiMCkgIT0gMCkgeworCQlnb3RvIGFib3J0c25kOworCX0KKwl0bXBvcnQgPSB3b3JrcG9ydCArIDB4MWM7CisJaWYgKGluYih0bXBvcnQpID09IDApIHsKKwkJZ290byBva3Rvc2VuZDsKKwl9CithYm9ydHNuZDoKKyNpZmRlZiBFRF9EQkdQCisJcHJpbnRrKCJBYm9ydCB0byBTZW5kXG4iKTsKKyNlbmRpZgorCWRldi0+bGFzdF9jbWRbY10gfD0gMHg0MDsKKwlkZXYtPmluX3NuZFtjXSA9IDA7CisJcmV0dXJuOworb2t0b3NlbmQ6CisjaWZkZWYgRURfREJHUAorCXByaW50aygiT0sgdG8gU2VuZFxuIik7CisJcHJpbnRrKCJDREIiKTsKKwlmb3IoaT0wO2k8d29ya3JlcS0+Y21kX2xlbjtpKyspIHsKKwkJcHJpbnRrKCIgJXgiLHdvcmtyZXEtPmNtbmRbaV0pOworCX0KKwlwcmludGsoIlxuQ2hhbm5lbCA9ICVkIElEID0gJWQgTFVOID0gJWRcbiIsYyx3b3JrcmVxLT5kZXZpY2UtPmlkLHdvcmtyZXEtPmRldmljZS0+bHVuKTsKKyNlbmRpZgkKKwlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCWogPSBpbmIoZGV2LT5iYXNlcG9ydCArIDB4MjkpICYgMHhmZTsKKwkJb3V0YihqLCBkZXYtPmJhc2Vwb3J0ICsgMHgyOSk7CisJCWRldi0+cjFmW2NdW3dvcmtyZXEtPmRldmljZS0+aWRdID0gMDsKKwl9CisJCisJaWYgKHdvcmtyZXEtPmNtbmRbMF0gPT0gUkVBRF9DQVBBQ0lUWSkgeworCQlpZiAod29ya3JlcS0+cmVxdWVzdF9idWZmbGVuID4gOCkgeworCQkJd29ya3JlcS0+cmVxdWVzdF9idWZmbGVuID0gMHgwODsKKwkJfQorCX0KKwlpZiAod29ya3JlcS0+Y21uZFswXSA9PSAweDAwKSB7CisJCXdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbiA9IDA7CisJfQorCisJdG1wb3J0ID0gd29ya3BvcnQgKyAweDFiOworCWogPSAwOworCXRhcmdldF9pZCA9IHdvcmtyZXEtPmRldmljZS0+aWQ7CisKKwkvKgorCSAqCVdpZGUgPworCSAqLworCXcgPSAxOworCXcgPSB3IDw8IHRhcmdldF9pZDsKKwlpZiAoKHcgJiBkZXYtPndpZGVfaWRbY10pICE9IDApIHsKKwkJaiB8PSAweDAxOworCX0KKwlvdXRiKGosIHRtcG9ydCk7CisJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IGopIHsKKwkJb3V0YihqLHRtcG9ydCk7CisjaWZkZWYgRURfREJHUAorCQlwcmludGsoInNlbmRfczg3MCB3aGlsZSBsb29wIDFcbiIpOworI2VuZGlmCisJfQorCS8qCisJICoJV3JpdGUgdGhlIGNvbW1hbmQKKwkgKi8KKworCXRtcG9ydCA9IHdvcmtwb3J0OworCW91dGIod29ya3JlcS0+Y21kX2xlbiwgdG1wb3J0KyspOworCW91dGIoMHgyYywgdG1wb3J0KyspOworCWlmIChkZXYtPmRldl9pZCA9PSBBVFA4ODVfREVWSUQpIHsKKwkJb3V0YigweDdmLCB0bXBvcnQrKyk7CisJfSBlbHNlIHsKKwkJb3V0YigweGNmLCB0bXBvcnQrKyk7IAkKKwl9CQorCWZvciAoaSA9IDA7IGkgPCB3b3JrcmVxLT5jbWRfbGVuOyBpKyspIHsKKwkJb3V0Yih3b3JrcmVxLT5jbW5kW2ldLCB0bXBvcnQrKyk7CisJfQorCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgwZjsKKwlvdXRiKHdvcmtyZXEtPmRldmljZS0+bHVuLCB0bXBvcnQpOworCXRtcG9ydCArPSAweDAyOworCS8qCisJICoJV3JpdGUgdGhlIHRhcmdldAorCSAqLworCW91dGIoZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmRldnNwLCB0bXBvcnQrKyk7CSAKKyNpZmRlZiBFRF9EQkdQCQorCXByaW50aygiZGV2LT5pZFslZF1bJWRdLmRldnNwID0gJTJ4XG4iLGMsdGFyZ2V0X2lkLGRldi0+aWRbY11bdGFyZ2V0X2lkXS5kZXZzcCk7CisjZW5kaWYKKwkvKgorCSAqCUZpZ3VyZSBvdXQgdGhlIHRyYW5zZmVyIHNpemUKKwkgKi8KKwlpZiAod29ya3JlcS0+dXNlX3NnKSB7CisjaWZkZWYgRURfREJHUAorCQlwcmludGsoIlVzaW5nIFNHTFxuIik7CisjZW5kaWYJCQorCQlsID0gMDsKKwkJCisJCXNncG50ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSB3b3JrcmVxLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJc2dfY291bnQgPSBwY2lfbWFwX3NnKGRldi0+cGRldiwgc2dwbnQsIHdvcmtyZXEtPnVzZV9zZywKKwkgICAJCQl3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbik7CQkKKwkJCisJCWZvciAoaSA9IDA7IGkgPCB3b3JrcmVxLT51c2Vfc2c7IGkrKykgeworCQkJaWYgKHNncG50W2ldLmxlbmd0aCA9PSAwIHx8IHdvcmtyZXEtPnVzZV9zZyA+IEFUUDg3MFVfU0NBVFRFUikgeworCQkJCXBhbmljKCJGb29vb29vb29vZCBmaWdodCEiKTsKKwkJCX0KKwkJCWwgKz0gc2dwbnRbaV0ubGVuZ3RoOworCQl9CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50ayggInNlbmRfczg3MDogd29ya3JlcS0+dXNlX3NnICVkLCBzZ19jb3VudCAlZCBsICU4bGRcbiIsIHdvcmtyZXEtPnVzZV9zZywgc2dfY291bnQsIGwpOworI2VuZGlmCisJfSBlbHNlIGlmKHdvcmtyZXEtPnJlcXVlc3RfYnVmZmxlbiAmJiB3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBQQ0lfRE1BX05PTkUpIHsKKyNpZmRlZiBFRF9EQkdQCisJCXByaW50aygiTm90IHVzaW5nIFNHTFxuIik7CisjZW5kaWYJCQkJCQorCQl3b3JrcmVxLT5TQ3AuZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgd29ya3JlcS0+cmVxdWVzdF9idWZmZXIsCisJCQkJd29ya3JlcS0+cmVxdWVzdF9idWZmbGVuLAorCQkJCXdvcmtyZXEtPnNjX2RhdGFfZGlyZWN0aW9uKTsJCQorCQlsID0gd29ya3JlcS0+cmVxdWVzdF9idWZmbGVuOworI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoICJzZW5kX3M4NzA6IHdvcmtyZXEtPnVzZV9zZyAlZCwgbCAlOGxkXG4iLCB3b3JrcmVxLT51c2Vfc2csIGwpOworI2VuZGlmCisJfSBlbHNlIGwgPSAwOworCS8qCisJICoJV3JpdGUgdHJhbnNmZXIgc2l6ZQorCSAqLworCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoKHVuc2lnbmVkIGNoYXIgKikgKCZsKSlbMl0pLCB0bXBvcnQrKyk7CisJb3V0YigodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgY2hhciAqKSAoJmwpKVsxXSksIHRtcG9ydCsrKTsKKwlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBjaGFyICopICgmbCkpWzBdKSwgdG1wb3J0KyspOworCWogPSB0YXJnZXRfaWQ7CQorCWRldi0+aWRbY11bal0ubGFzdF9sZW4gPSBsOworCWRldi0+aWRbY11bal0udHJhbl9sZW4gPSAwOworI2lmZGVmIEVEX0RCR1AJCisJcHJpbnRrKCJkZXYtPmlkWyUyZF1bJTJkXS5sYXN0X2xlbiA9ICVkXG4iLGMsaixkZXYtPmlkW2NdW2pdLmxhc3RfbGVuKTsKKyNlbmRpZgkKKwkvKgorCSAqCUZsaXAgdGhlIHdpZGUgYml0cworCSAqLworCWlmICgoaiAmIDB4MDgpICE9IDApIHsKKwkJaiA9IChqICYgMHgwNykgfCAweDQwOworCX0KKwkvKgorCSAqCUNoZWNrIHRyYW5zZmVyIGRpcmVjdGlvbgorCSAqLworCWlmICh3b3JrcmVxLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCW91dGIoKHVuc2lnbmVkIGNoYXIpIChqIHwgMHgyMCksIHRtcG9ydCsrKTsKKwl9IGVsc2UgeworCQlvdXRiKGosIHRtcG9ydCsrKTsKKwl9CisJb3V0YigodW5zaWduZWQgY2hhcikgKGluYih0bXBvcnQpIHwgMHg4MCksIHRtcG9ydCk7CisJb3V0YigweDgwLCB0bXBvcnQpOworCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxYzsKKwlkZXYtPmlkW2NdW3RhcmdldF9pZF0uZGlyY3QgPSAwOworCWlmIChsID09IDApIHsKKwkJaWYgKGluYih0bXBvcnQpID09IDApIHsKKwkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxODsKKyNpZmRlZiBFRF9EQkdQCisJCQlwcmludGsoImNoYW5nZSBTQ1NJX0NNRF9SRUcgMHgwOFxuIik7CQorI2VuZGlmCQkJCQorCQkJb3V0YigweDA4LCB0bXBvcnQpOworCQl9IGVsc2UgeworCQkJZGV2LT5sYXN0X2NtZFtjXSB8PSAweDQwOworCQl9CisJCWRldi0+aW5fc25kW2NdID0gMDsKKwkJcmV0dXJuOworCX0KKwl0bXBjaXAgPSBkZXYtPnBjaXBvcnRbY107CisJcHJkID0gZGV2LT5pZFtjXVt0YXJnZXRfaWRdLnByZF90YWJsZTsKKwlkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkX3BvcyA9IHByZDsKKworCS8qCisJICoJTm93IHdyaXRlIHRoZSByZXF1ZXN0IGxpc3QuIEVpdGhlciBhcyBzY2F0dGVyL2dhdGhlciBvciBhcworCSAqCWEgbGluZWFyIGNoYWluLgorCSAqLworCisJaWYgKHdvcmtyZXEtPnVzZV9zZykgeworCQlzZ3BudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgd29ya3JlcS0+cmVxdWVzdF9idWZmZXI7CisJCWkgPSAwOworCQlmb3IgKGogPSAwOyBqIDwgd29ya3JlcS0+dXNlX3NnOyBqKyspIHsKKwkJCWJ0dGwgPSBzZ19kbWFfYWRkcmVzcygmc2dwbnRbal0pOworCQkJbD1zZ19kbWFfbGVuKCZzZ3BudFtqXSk7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygiMS4gYnR0bCAleCwgbCAleFxuIixidHRsLCBsKTsKKyNlbmRpZgkJCQorCQl3aGlsZSAobCA+IDB4MTAwMDApIHsKKwkJCQkoKCh1MTYgKikgKHByZCkpW2kgKyAzXSkgPSAweDAwMDA7CisJCQkJKCgodTE2ICopIChwcmQpKVtpICsgMl0pID0gMHgwMDAwOworCQkJCSgoKHUzMiAqKSAocHJkKSlbaSA+PiAxXSkgPSBjcHVfdG9fbGUzMihidHRsKTsKKwkJCQlsIC09IDB4MTAwMDA7CisJCQkJYnR0bCArPSAweDEwMDAwOworCQkJCWkgKz0gMHgwNDsKKwkJCX0KKwkJCSgoKHUzMiAqKSAocHJkKSlbaSA+PiAxXSkgPSBjcHVfdG9fbGUzMihidHRsKTsKKwkJCSgoKHUxNiAqKSAocHJkKSlbaSArIDJdKSA9IGNwdV90b19sZTE2KGwpOworCQkJKCgodTE2ICopIChwcmQpKVtpICsgM10pID0gMDsKKwkJCWkgKz0gMHgwNDsJCQkKKwkJfQorCQkoKCh1MTYgKikgKHByZCkpW2kgLSAxXSkgPSBjcHVfdG9fbGUxNigweDgwMDApOwkKKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCJwcmQgJTR4ICU0eCAlNHggJTR4XG4iLCgoKHVuc2lnbmVkIHNob3J0IGludCAqKXByZClbMF0pLCgoKHVuc2lnbmVkIHNob3J0IGludCAqKXByZClbMV0pLCgoKHVuc2lnbmVkIHNob3J0IGludCAqKXByZClbMl0pLCgoKHVuc2lnbmVkIHNob3J0IGludCAqKXByZClbM10pKTsKKwkJcHJpbnRrKCIyLiBidHRsICV4LCBsICV4XG4iLGJ0dGwsIGwpOworI2VuZGlmCQkJCisJfSBlbHNlIHsKKwkJLyoKKwkJICoJRm9yIGEgbGluZWFyIHJlcXVlc3Qgd3JpdGUgYSBjaGFpbiBvZiBibG9ja3MKKwkJICovICAgICAgICAKKwkJYnR0bCA9IHdvcmtyZXEtPlNDcC5kbWFfaGFuZGxlOworCQlsID0gd29ya3JlcS0+cmVxdWVzdF9idWZmbGVuOworCQlpID0gMDsKKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCIzLiBidHRsICV4LCBsICV4XG4iLGJ0dGwsIGwpOworI2VuZGlmCQkJCisJCXdoaWxlIChsID4gMHgxMDAwMCkgeworCQkJCSgoKHUxNiAqKSAocHJkKSlbaSArIDNdKSA9IDB4MDAwMDsKKwkJCQkoKCh1MTYgKikgKHByZCkpW2kgKyAyXSkgPSAweDAwMDA7CisJCQkJKCgodTMyICopIChwcmQpKVtpID4+IDFdKSA9IGNwdV90b19sZTMyKGJ0dGwpOworCQkJCWwgLT0gMHgxMDAwMDsKKwkJCQlidHRsICs9IDB4MTAwMDA7CisJCQkJaSArPSAweDA0OworCQkJfQorCQkJKCgodTE2ICopIChwcmQpKVtpICsgM10pID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKKwkJCSgoKHUxNiAqKSAocHJkKSlbaSArIDJdKSA9IGNwdV90b19sZTE2KGwpOworCQkJKCgodTMyICopIChwcmQpKVtpID4+IDFdKSA9IGNwdV90b19sZTMyKGJ0dGwpOwkJCisjaWZkZWYgRURfREJHUAkJCisJCXByaW50aygicHJkICU0eCAlNHggJTR4ICU0eFxuIiwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzBdKSwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzFdKSwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzJdKSwoKCh1bnNpZ25lZCBzaG9ydCBpbnQgKilwcmQpWzNdKSk7CisJCXByaW50aygiNC4gYnR0bCAleCwgbCAleFxuIixidHRsLCBsKTsKKyNlbmRpZgkJCQorCQkKKwl9CisJdG1wY2lwICs9IDQ7CisjaWZkZWYgRURfREJHUAkJCisJcHJpbnRrKCJzZW5kX3M4NzA6IHByZGFkZHJfMiAweCU4eCB0bXBjaXAgJXggdGFyZ2V0X2lkICVkXG4iLCBkZXYtPmlkW2NdW3RhcmdldF9pZF0ucHJkYWRkcix0bXBjaXAsdGFyZ2V0X2lkKTsKKyNlbmRpZgkKKwlvdXRsKGRldi0+aWRbY11bdGFyZ2V0X2lkXS5wcmRhZGRyLCB0bXBjaXApOworCXRtcGNpcCA9IHRtcGNpcCAtIDI7CisJb3V0YigweDA2LCB0bXBjaXApOworCW91dGIoMHgwMCwgdG1wY2lwKTsKKwlpZiAoZGV2LT5kZXZfaWQgPT0gQVRQODg1X0RFVklEKSB7CisJCXRtcGNpcC0tOworCQlqPWluYih0bXBjaXApICYgMHhmMzsKKwkJaWYgKCh3b3JrcmVxLT5jbW5kWzBdID09IDB4MDgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MjgpIHx8CisJICAgIAkod29ya3JlcS0+Y21uZFswXSA9PSAweDBhKSB8fCAod29ya3JlcS0+Y21uZFswXSA9PSAweDJhKSkgeworCSAgIAkJaiB8PSAweDBjOworCQl9CisJCW91dGIoaix0bXBjaXApOworCQl0bXBjaXAtLTsJICAgIAkKKwl9IGVsc2UgaWYgKChkZXYtPmRldl9pZCA9PSBBVFA4ODBfREVWSUQxKSB8fAorCSAgICAJICAgKGRldi0+ZGV2X2lkID09IEFUUDg4MF9ERVZJRDIpKSB7CisJCXRtcGNpcCA9dG1wY2lwIC0yOwkKKwkJdG1wb3J0ID0gd29ya3BvcnQgLSAweDA1OworCQlpZiAoKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyOCkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgwYSkgfHwgKHdvcmtyZXEtPmNtbmRbMF0gPT0gMHgyYSkpIHsKKwkJCW91dGIoKHVuc2lnbmVkIGNoYXIpICgoaW5iKHRtcG9ydCkgJiAweDNmKSB8IDB4YzApLCB0bXBvcnQpOworCQl9IGVsc2UgeworCQkJb3V0YigodW5zaWduZWQgY2hhcikgKGluYih0bXBvcnQpICYgMHgzZiksIHRtcG9ydCk7CisJCX0JCQorCX0gZWxzZSB7CQkKKwkJdG1wY2lwID10bXBjaXAgLTI7CisJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgzYTsKKwkJaWYgKCh3b3JrcmVxLT5jbW5kWzBdID09IDB4MDgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MjgpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MGEpIHx8ICh3b3JrcmVxLT5jbW5kWzBdID09IDB4MmEpKSB7CisJCQlvdXRiKChpbmIodG1wb3J0KSAmIDB4ZjMpIHwgMHgwOCwgdG1wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoaW5iKHRtcG9ydCkgJiAweGYzLCB0bXBvcnQpOworCQl9CQkKKwl9CQorCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxYzsKKworCWlmKHdvcmtyZXEtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJZGV2LT5pZFtjXVt0YXJnZXRfaWRdLmRpcmN0ID0gMHgyMDsKKwkJaWYgKGluYih0bXBvcnQpID09IDApIHsKKwkJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxODsKKwkJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJCW91dGIoMHgwMSwgdG1wY2lwKTsKKyNpZmRlZiBFRF9EQkdQCQkKKwkJcHJpbnRrKCAic3RhcnQgRE1BKHRvIHRhcmdldClcbiIpOworI2VuZGlmCQkJCQorCQl9IGVsc2UgeworCQkJZGV2LT5sYXN0X2NtZFtjXSB8PSAweDQwOworCQl9CisJCWRldi0+aW5fc25kW2NdID0gMDsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5iKHRtcG9ydCkgPT0gMCkgewkJCisJCXRtcG9ydCA9IHdvcmtwb3J0ICsgMHgxODsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQlvdXRiKDB4MDksIHRtcGNpcCk7CisjaWZkZWYgRURfREJHUAkJCisJCXByaW50ayggInN0YXJ0IERNQSh0byBob3N0KVxuIik7CisjZW5kaWYJCQkKKwl9IGVsc2UgeworCQlkZXYtPmxhc3RfY21kW2NdIHw9IDB4NDA7CisJfQorCWRldi0+aW5fc25kW2NdID0gMDsKKwlyZXR1cm47CisKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZnVuX3NjYW0oc3RydWN0IGF0cF91bml0ICpkZXYsIHVuc2lnbmVkIHNob3J0IGludCAqdmFsKQoreworCXVuc2lnbmVkIGludCB0bXBvcnQ7CisJdW5zaWduZWQgc2hvcnQgaW50IGksIGs7CisJdW5zaWduZWQgY2hhciBqOworCisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDFjOworCW91dHcoKnZhbCwgdG1wb3J0KTsKK0ZVTl9ENzoKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBzdGFibGUgPj0gYnVzIHNldHRsZSBkZWxheSg0MDAgbnMpICAqLworCQlrID0gaW53KHRtcG9ydCk7CisJCWogPSAodW5zaWduZWQgY2hhcikgKGsgPj4gOCk7CisJCWlmICgoayAmIDB4ODAwMCkgIT0gMCkgewkvKiBEQjcgYWxsIHJlbGVhc2U/ICAgICovCisJCQlnb3RvIEZVTl9ENzsKKwkJfQorCX0KKwkqdmFsIHw9IDB4NDAwMDsJCS8qIGFzc2VydCBEQjYgICAgICAgICAgICovCisJb3V0dygqdmFsLCB0bXBvcnQpOworCSp2YWwgJj0gMHhkZmZmOwkJLyogYXNzZXJ0IERCNSAgICAgICAgICAgKi8KKwlvdXR3KCp2YWwsIHRtcG9ydCk7CitGVU5fRDU6CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsJLyogc3RhYmxlID49IGJ1cyBzZXR0bGUgZGVsYXkoNDAwIG5zKSAqLworCQlpZiAoKGludyh0bXBvcnQpICYgMHgyMDAwKSAhPSAwKSB7CS8qIERCNSBhbGwgcmVsZWFzZT8gICAgICAgKi8KKwkJCWdvdG8gRlVOX0Q1OworCQl9CisJfQorCSp2YWwgfD0gMHg4MDAwOwkJLyogbm8gREI0LTAsIGFzc2VydCBEQjcgICAgKi8KKwkqdmFsICY9IDB4ZTBmZjsKKwlvdXR3KCp2YWwsIHRtcG9ydCk7CisJKnZhbCAmPSAweGJmZmY7CQkvKiByZWxlYXNlIERCNiAgICAgICAgICAgICAqLworCW91dHcoKnZhbCwgdG1wb3J0KTsKK0ZVTl9ENjoKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewkvKiBzdGFibGUgPj0gYnVzIHNldHRsZSBkZWxheSg0MDAgbnMpICAqLworCQlpZiAoKGludyh0bXBvcnQpICYgMHg0MDAwKSAhPSAwKSB7CS8qIERCNiBhbGwgcmVsZWFzZT8gICovCisJCQlnb3RvIEZVTl9ENjsKKwkJfQorCX0KKworCXJldHVybiBqOworfQorCitzdGF0aWMgdm9pZCB0c2NhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCisJdW5zaWduZWQgaW50IHRtcG9ydDsKKwl1bnNpZ25lZCBjaGFyIGksIGosIGs7CisJdW5zaWduZWQgbG9uZyBuOworCXVuc2lnbmVkIHNob3J0IGludCBtLCBhc3NpZ25pZF9tYXAsIHZhbDsKKwl1bnNpZ25lZCBjaGFyIG1idWZbMzNdLCBxdWludGV0WzJdOworCXN0cnVjdCBhdHBfdW5pdCAqZGV2ID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZob3N0LT5ob3N0ZGF0YTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBnMnFfdGFiWzhdID0geworCQkweDM4LCAweDMxLCAweDMyLCAweDJiLCAweDM0LCAweDJkLCAweDJlLCAweDI3CisJfTsKKworLyogIEkgY2FuJ3QgYmVsaWV2ZSB3ZSBuZWVkIHRoaXMgYmVmb3JlIHdlJ3ZlIGV2ZW4gZG9uZSBhbnl0aGluZy4gIFJlbW92ZSBpdAorICogIGFuZCBzZWUgaWYgYW55b25lIGJpdGNoZXMuCisJZm9yIChpID0gMDsgaSA8IDB4MTA7IGkrKykgeworCQl1ZGVsYXkoMHhmZmZmKTsKKwl9CisgKi8KKworCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMTsKKwlvdXRiKDB4MDgsIHRtcG9ydCsrKTsKKwlvdXRiKDB4N2YsIHRtcG9ydCk7CisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDExOworCW91dGIoMHgyMCwgdG1wb3J0KTsKKworCWlmICgoZGV2LT5zY2FtX29uICYgMHg0MCkgPT0gMCkgeworCQlyZXR1cm47CisJfQorCW0gPSAxOworCW0gPDw9IGRldi0+aG9zdF9pZFswXTsKKwlqID0gMTY7CisJaWYgKGRldi0+Y2hpcF92ZXIgPCA0KSB7CisJCW0gfD0gMHhmZjAwOworCQlqID0gODsKKwl9CisJYXNzaWduaWRfbWFwID0gbTsKKwl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MDI7CisJb3V0YigweDAyLCB0bXBvcnQrKyk7CS8qIDIqMj00bXMsM0VIIDIvMzIqM0U9My45bXMgKi8KKwlvdXRiKDAsIHRtcG9ydCsrKTsKKwlvdXRiKDAsIHRtcG9ydCsrKTsKKwlvdXRiKDAsIHRtcG9ydCsrKTsKKwlvdXRiKDAsIHRtcG9ydCsrKTsKKwlvdXRiKDAsIHRtcG9ydCsrKTsKKwlvdXRiKDAsIHRtcG9ydCsrKTsKKworCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKwkJbSA9IDE7CisJCW0gPSBtIDw8IGk7CisJCWlmICgobSAmIGFzc2lnbmlkX21hcCkgIT0gMCkgeworCQkJY29udGludWU7CisJCX0KKwkJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDBmOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCWlmIChpID4gNykgeworCQkJayA9IChpICYgMHgwNykgfCAweDQwOworCQl9IGVsc2UgeworCQkJayA9IGk7CisJCX0KKwkJb3V0YihrLCB0bXBvcnQrKyk7CisJCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMHgxYjsKKwkJaWYgKGRldi0+Y2hpcF92ZXIgPT0gNCkgeworCQkJb3V0YigweDAxLCB0bXBvcnQpOworCQl9IGVsc2UgeworCQkJb3V0YigweDAwLCB0bXBvcnQpOworCQl9Cit3YWl0X3JkeW9rOgorCQl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MTg7CisJCW91dGIoMHgwOSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWsgPSBpbmIodG1wb3J0KTsKKwkJaWYgKGsgIT0gMHgxNikgeworCQkJaWYgKChrID09IDB4ODUpIHx8IChrID09IDB4NDIpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MTA7CisJCQlvdXRiKDB4NDEsIHRtcG9ydCk7CisJCQlnb3RvIHdhaXRfcmR5b2s7CisJCX0KKwkJYXNzaWduaWRfbWFwIHw9IG07CisKKwl9CisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbMF0gKyAweDAyOworCW91dGIoMHg3ZiwgdG1wb3J0KTsKKwl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MWI7CisJb3V0YigweDAyLCB0bXBvcnQpOworCisJb3V0YigwLCAweDgwKTsKKworCXZhbCA9IDB4MDA4MDsJCS8qIGJzeSAgKi8KKwl0bXBvcnQgPSBkZXYtPmlvcG9ydFswXSArIDB4MWM7CisJb3V0dyh2YWwsIHRtcG9ydCk7CisJdmFsIHw9IDB4MDA0MDsJCS8qIHNlbCAgKi8KKwlvdXR3KHZhbCwgdG1wb3J0KTsKKwl2YWwgfD0gMHgwMDA0OwkJLyogbXNnICAqLworCW91dHcodmFsLCB0bXBvcnQpOworCWluYigweDgwKTsJCS8qIDIgZGVza2V3IGRlbGF5KDQ1bnMqMj05MG5zKSAqLworCXZhbCAmPSAweDAwN2Y7CQkvKiBubyBic3kgICovCisJb3V0dyh2YWwsIHRtcG9ydCk7CisJbWRlbGF5KDEyOCk7CisJdmFsICY9IDB4MDBmYjsJCS8qIGFmdGVyIDFtcyBubyBtc2cgKi8KKwlvdXR3KHZhbCwgdG1wb3J0KTsKK3dhaXRfbm9tc2c6CisJaWYgKChpbmIodG1wb3J0KSAmIDB4MDQpICE9IDApIHsKKwkJZ290byB3YWl0X25vbXNnOworCX0KKwlvdXRiKDEsIDB4ODApOworCXVkZWxheSgxMDApOworCWZvciAobiA9IDA7IG4gPCAweDMwMDAwOyBuKyspIHsKKwkJaWYgKChpbmIodG1wb3J0KSAmIDB4ODApICE9IDApIHsJLyogYnN5ID8gKi8KKwkJCWdvdG8gd2FpdF9pbzsKKwkJfQorCX0KKwlnb3RvIFRDTV9TWU5DOword2FpdF9pbzoKKwlmb3IgKG4gPSAwOyBuIDwgMHgzMDAwMDsgbisrKSB7CisJCWlmICgoaW5iKHRtcG9ydCkgJiAweDgxKSA9PSAweDAwODEpIHsKKwkJCWdvdG8gd2FpdF9pbzE7CisJCX0KKwl9CisJZ290byBUQ01fU1lOQzsKK3dhaXRfaW8xOgorCWluYigweDgwKTsKKwl2YWwgfD0gMHg4MDAzOwkJLyogaW8sY2QsZGI3ICAqLworCW91dHcodmFsLCB0bXBvcnQpOworCWluYigweDgwKTsKKwl2YWwgJj0gMHgwMGJmOwkJLyogbm8gc2VsICAgICAqLworCW91dHcodmFsLCB0bXBvcnQpOworCW91dGIoMiwgMHg4MCk7CitUQ01fU1lOQzoKKwl1ZGVsYXkoMHg4MDApOworCWlmICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKSB7CS8qIGJzeSA/ICovCisJCW91dHcoMCwgdG1wb3J0LS0pOworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCA9IGRldi0+aW9wb3J0WzBdICsgMHgxNTsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YigweDA5LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWluYih0bXBvcnQpOworCQlyZXR1cm47CisJfQorCXZhbCAmPSAweDAwZmY7CQkvKiBzeW5jaHJvbml6YXRpb24gICovCisJdmFsIHw9IDB4M2YwMDsKKwlmdW5fc2NhbShkZXYsICZ2YWwpOworCW91dGIoMywgMHg4MCk7CisJdmFsICY9IDB4MDBmZjsJCS8qIGlzb2xhdGlvbiAgICAgICAgKi8KKwl2YWwgfD0gMHgyMDAwOworCWZ1bl9zY2FtKGRldiwgJnZhbCk7CisJb3V0Yig0LCAweDgwKTsKKwlpID0gODsKKwlqID0gMDsKK1RDTV9JRDoKKwlpZiAoKGludyh0bXBvcnQpICYgMHgyMDAwKSA9PSAwKSB7CisJCWdvdG8gVENNX0lEOworCX0KKwlvdXRiKDUsIDB4ODApOworCXZhbCAmPSAweDAwZmY7CQkvKiBnZXQgSURfU1RSSU5HICovCisJdmFsIHw9IDB4MjAwMDsKKwlrID0gZnVuX3NjYW0oZGV2LCAmdmFsKTsKKwlpZiAoKGsgJiAweDAzKSA9PSAwKSB7CisJCWdvdG8gVENNXzU7CisJfQorCW1idWZbal0gPDw9IDB4MDE7CisJbWJ1ZltqXSAmPSAweGZlOworCWlmICgoayAmIDB4MDIpICE9IDApIHsKKwkJbWJ1ZltqXSB8PSAweDAxOworCX0KKwlpLS07CisJaWYgKGkgPiAwKSB7CisJCWdvdG8gVENNX0lEOworCX0KKwlqKys7CisJaSA9IDg7CisJZ290byBUQ01fSUQ7CisKK1RDTV81OgkJCS8qIGlzb2xhdGlvbiBjb21wbGV0ZS4uICAqLworLyogICAgbWJ1ZlszMl09MDsKKwlwcmludGsoIiBcbiV4ICV4ICV4ICVzXG4gIixhc3NpZ25pZF9tYXAsbWJ1ZlswXSxtYnVmWzFdLCZtYnVmWzJdKTsgKi8KKwlpID0gMTU7CisJaiA9IG1idWZbMF07CisJaWYgKChqICYgMHgyMCkgIT0gMCkgewkvKiBiaXQ1PTE6SUQgdXB0byA3ICAgICAgKi8KKwkJaSA9IDc7CisJfQorCWlmICgoaiAmIDB4MDYpID09IDApIHsJLyogSUR2YWxpZD8gICAgICAgICAgICAgKi8KKwkJZ290byBHMlE1OworCX0KKwlrID0gbWJ1ZlsxXTsKK3NtYWxsX2lkOgorCW0gPSAxOworCW0gPDw9IGs7CisJaWYgKChtICYgYXNzaWduaWRfbWFwKSA9PSAwKSB7CisJCWdvdG8gRzJRX1FVSU47CisJfQorCWlmIChrID4gMCkgeworCQlrLS07CisJCWdvdG8gc21hbGxfaWQ7CisJfQorRzJRNToJCQkvKiBzcmNoIGZyb20gbWF4IGFjY2VwdGFibGUgSUQjICAqLworCWsgPSBpOwkJCS8qIG1heCBhY2NlcHRhYmxlIElEIyAgICAgICAgICAgICovCitHMlFfTFA6CisJbSA9IDE7CisJbSA8PD0gazsKKwlpZiAoKG0gJiBhc3NpZ25pZF9tYXApID09IDApIHsKKwkJZ290byBHMlFfUVVJTjsKKwl9CisJaWYgKGsgPiAwKSB7CisJCWstLTsKKwkJZ290byBHMlFfTFA7CisJfQorRzJRX1FVSU46CQkvKiBrPWJpbklEIywgICAgICAgKi8KKwlhc3NpZ25pZF9tYXAgfD0gbTsKKwlpZiAoayA8IDgpIHsKKwkJcXVpbnRldFswXSA9IDB4Mzg7CS8qIDFzdCBkZnQgSUQ8OCAgICAqLworCX0gZWxzZSB7CisJCXF1aW50ZXRbMF0gPSAweDMxOwkvKiAxc3QgIElEPj04ICAgICAgKi8KKwl9CisJayAmPSAweDA3OworCXF1aW50ZXRbMV0gPSBnMnFfdGFiW2tdOworCisJdmFsICY9IDB4MDBmZjsJCS8qIEFzc2lnbklEIDFzdFF1aW50ZXQsQUg9MDAxeHh4eHggICovCisJbSA9IHF1aW50ZXRbMF0gPDwgODsKKwl2YWwgfD0gbTsKKwlmdW5fc2NhbShkZXYsICZ2YWwpOworCXZhbCAmPSAweDAwZmY7CQkvKiBBc3NpZ25JRCAybmRRdWludGV0LEFIPTAwMXh4eHh4ICovCisJbSA9IHF1aW50ZXRbMV0gPDwgODsKKwl2YWwgfD0gbTsKKwlmdW5fc2NhbShkZXYsICZ2YWwpOworCisJZ290byBUQ01fU1lOQzsKKworfQorCitzdGF0aWMgdm9pZCBpczg3MChzdHJ1Y3QgYXRwX3VuaXQgKmRldiwgdW5zaWduZWQgaW50IHdrcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wb3J0OworCXVuc2lnbmVkIGNoYXIgaSwgaiwgaywgcm1iLCBuOworCXVuc2lnbmVkIHNob3J0IGludCBtOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1idWZbNTEyXTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzYXRuWzldID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCA2LCA2IH07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5xZFs5XSA9IHsgMHgxMiwgMCwgMCwgMCwgMHgyNCwgMCwgMCwgMHgyNCwgNiB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN5bm5bNl0gPSB7IDB4ODAsIDEsIDMsIDEsIDB4MTksIDB4MGUgfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzeW51WzZdID0geyAweDgwLCAxLCAzLCAxLCAweDBjLCAweDBlIH07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3lud1s2XSA9IHsgMHg4MCwgMSwgMywgMSwgMHgwYywgMHgwNyB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHdpZGVbNl0gPSB7IDB4ODAsIDEsIDIsIDMsIDEsIDAgfTsKKwkKKwl0bXBvcnQgPSB3a3BvcnQgKyAweDNhOworCW91dGIoKHVuc2lnbmVkIGNoYXIpIChpbmIodG1wb3J0KSB8IDB4MTApLCB0bXBvcnQpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKChkZXYtPmNoaXBfdmVyICE9IDQpICYmIChpID4gNykpIHsKKwkJCWJyZWFrOworCQl9CisJCW0gPSAxOworCQltID0gbSA8PCBpOworCQlpZiAoKG0gJiBkZXYtPmFjdGl2ZV9pZFswXSkgIT0gMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGkgPT0gZGV2LT5ob3N0X2lkWzBdKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICBJRDogJTJkICBIb3N0IEFkYXB0ZXJcbiIsIGRldi0+aG9zdF9pZFswXSk7CisJCQljb250aW51ZTsKKwkJfQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlpZiAoZGV2LT5jaGlwX3ZlciA9PSA0KSB7CisJCQlvdXRiKDB4MDEsIHRtcG9ydCk7CisJCX0gZWxzZSB7CisJCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMTsKKwkJb3V0YigweDA4LCB0bXBvcnQrKyk7CisJCW91dGIoMHg3ZiwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkWzBdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCWogPSBpOworCQlpZiAoKGogJiAweDA4KSAhPSAwKSB7CisJCQlqID0gKGogJiAweDA3KSB8IDB4NDA7CisJCX0KKwkJb3V0YihqLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxMSAmJiBpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKKworCQlkZXYtPmFjdGl2ZV9pZFswXSB8PSBtOworCisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgwNDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCitwaGFzZV9jbWQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCQlvdXRiKDB4NDEsIHRtcG9ydCk7CisJCQlnb3RvIHBoYXNlX2NtZDsKKwkJfQorc2VsX29rOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAzOworCQlvdXRiKGlucWRbMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFsyXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbM10sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs1XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFs3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihpbnFkWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxMSAmJiBpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlpZiAoZGV2LT5jaGlwX3ZlciA9PSA0KQorCQkJb3V0YigweDAwLCB0bXBvcnQpOworCisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWogPSAwOworcmRfaW5xX2RhdGE6CisJCWsgPSBpbmIodG1wb3J0KTsKKwkJaWYgKChrICYgMHgwMSkgIT0gMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2orK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byByZF9pbnFfZGF0YTsKKwkJfQorCQlpZiAoKGsgJiAweDgwKSA9PSAwKSB7CisJCQlnb3RvIHJkX2lucV9kYXRhOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqID09IDB4MTYpIHsKKwkJCWdvdG8gaW5xX29rOworCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHg0NiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmIChpbmIodG1wb3J0KSAhPSAweDE2KSB7CisJCQlnb3RvIHNlbF9vazsKKwkJfQoraW5xX29rOgorCQltYnVmWzM2XSA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgIElEOiAlMmQgICVzXG4iLCBpLCAmbWJ1Zls4XSk7CisJCWRldi0+aWRbMF1baV0uZGV2dHlwZSA9IG1idWZbMF07CisJCXJtYiA9IG1idWZbMV07CisJCW4gPSBtYnVmWzddOworCQlpZiAoZGV2LT5jaGlwX3ZlciAhPSA0KSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmICgobWJ1Zls3XSAmIDB4NjApID09IDApIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKChkZXYtPmdsb2JhbF9tYXBbMF0gJiAweDIwKSA9PSAwKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MWI7CisJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMzsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxMSAmJiBpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKKwkJCQordHJ5X3dpZGU6CisJCWogPSAwOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDUsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIod2lkZVtqKytdLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQkKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3dpZGU7CisJCX0KKwkJY29udGludWU7Cit3aWRlcF9vdXQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHdpZGVwX291dDsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX2luOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4ZmYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3dpZGVwX2luMToKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDAxKSAhPSAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaysrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHdpZGVwX2luMTsKKwkJfQorCQlpZiAoKGogJiAweDgwKSA9PSAweDAwKSB7CisJCQlnb3RvIHdpZGVwX2luMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB3aWRlcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHdpZGVwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHdpZGVwX291dDsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX2NtZDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQkKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKworCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQlpZiAoaiA9PSAweDRlKSB7CisJCQkJZ290byB3aWRlcF9vdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDIpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMl0gIT0gMHgwMykgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlszXSAhPSAweDAxKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCW0gPSAxOworCQltID0gbSA8PCBpOworCQlkZXYtPndpZGVfaWRbMF0gfD0gbTsKK25vdF93aWRlOgorCQlpZiAoKGRldi0+aWRbMF1baV0uZGV2dHlwZSA9PSAweDAwKSB8fCAoZGV2LT5pZFswXVtpXS5kZXZ0eXBlID09IDB4MDcpIHx8ICgoZGV2LT5pZFswXVtpXS5kZXZ0eXBlID09IDB4MDUpICYmICgobiAmIDB4MTApICE9IDApKSkgeworCQkJZ290byBzZXRfc3luYzsKKwkJfQorCQljb250aW51ZTsKK3NldF9zeW5jOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlqID0gMDsKKwkJaWYgKChtICYgZGV2LT53aWRlX2lkWzBdKSAhPSAwKSB7CisJCQlqIHw9IDB4MDE7CisJCX0KKwkJb3V0YihqLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAzOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkWzBdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmIChpbmIodG1wb3J0KSAhPSAweDExICYmIGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljb250aW51ZTsKKworCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCQkJCit0cnlfc3luYzoKKwkJaiA9IDA7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwNiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJaWYgKChtICYgZGV2LT53aWRlX2lkWzBdKSAhPSAwKSB7CisJCQkJCW91dGIoc3lud1tqKytdLCB0bXBvcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgobSAmIGRldi0+dWx0cmFfbWFwWzBdKSAhPSAwKSB7CisJCQkJCQlvdXRiKHN5bnVbaisrXSwgdG1wb3J0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dGIoc3lubltqKytdLCB0bXBvcnQpOworCQkJCQl9CisJCQkJfQorCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQkKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB0cnlfc3luYzsKKwkJfQorCQljb250aW51ZTsKK3BoYXNlX291dHM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMHgwMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDg1KSB7CisJCQlnb3RvIHRhcl9kY29uczsKKwkJfQorCQlqICY9IDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gcGhhc2VfaW5zOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gcGhhc2VfY21kczsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHBoYXNlX291dHM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9pbnM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHhmZiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWsgPSAwOworcGhhc2VfaW5zMToKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDAxKSAhPSAweDAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaysrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHBoYXNlX2luczE7CisJCX0KKwkJaWYgKChqICYgMHg4MCkgPT0gMHgwMCkgeworCQkJZ290byBwaGFzZV9pbnMxOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDg1KSB7CisJCQlnb3RvIHRhcl9kY29uczsKKwkJfQorCQlqICY9IDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gcGhhc2VfaW5zOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gcGhhc2VfY21kczsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHBoYXNlX291dHM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9jbWRzOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDEwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7Cit0YXJfZGNvbnM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCQorCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzBdICE9IDB4MDEpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDMpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzRdID09IDB4MDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzNdID4gMHg2NCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbNF0gPiAweDBjKSB7CisJCQltYnVmWzRdID0gMHgwYzsKKwkJfQorCQlkZXYtPmlkWzBdW2ldLmRldnNwID0gbWJ1Zls0XTsKKwkJaWYgKChtYnVmWzNdIDwgMHgwZCkgJiYgKHJtYiA9PSAwKSkgeworCQkJaiA9IDB4YTA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKG1idWZbM10gPCAweDFhKSB7CisJCQlqID0gMHgyMDsKKwkJCWdvdG8gc2V0X3N5bl9vazsKKwkJfQorCQlpZiAobWJ1ZlszXSA8IDB4MzMpIHsKKwkJCWogPSAweDQwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmIChtYnVmWzNdIDwgMHg0YykgeworCQkJaiA9IDB4NTA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaiA9IDB4NjA7CitzZXRfc3luX29rOgorCQlkZXYtPmlkWzBdW2ldLmRldnNwID0gKGRldi0+aWRbMF1baV0uZGV2c3AgJiAweDBmKSB8IGo7CisJfQorCXRtcG9ydCA9IHdrcG9ydCArIDB4M2E7CisJb3V0YigodW5zaWduZWQgY2hhcikgKGluYih0bXBvcnQpICYgMHhlZiksIHRtcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlzODgwKHN0cnVjdCBhdHBfdW5pdCAqZGV2LCB1bnNpZ25lZCBpbnQgd2twb3J0KQoreworCXVuc2lnbmVkIGludCB0bXBvcnQ7CisJdW5zaWduZWQgY2hhciBpLCBqLCBrLCBybWIsIG4sIGx2ZG1vZGU7CisJdW5zaWduZWQgc2hvcnQgaW50IG07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbWJ1Zls1MTJdOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNhdG5bOV0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDYsIDYgfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBpbnFkWzldID0geyAweDEyLCAwLCAwLCAwLCAweDI0LCAwLCAwLCAweDI0LCA2IH07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3lubls2XSA9IHsgMHg4MCwgMSwgMywgMSwgMHgxOSwgMHgwZSB9OworCXVuc2lnbmVkIGNoYXIgc3ludVs2XSA9IHsgMHg4MCwgMSwgMywgMSwgMHgwYSwgMHgwZSB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN5bndbNl0gPSB7IDB4ODAsIDEsIDMsIDEsIDB4MTksIDB4MGUgfTsKKwl1bnNpZ25lZCBjaGFyIHN5bnV3WzZdID0geyAweDgwLCAxLCAzLCAxLCAweDBhLCAweDBlIH07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgd2lkZVs2XSA9IHsgMHg4MCwgMSwgMiwgMywgMSwgMCB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHUzWzldID0geyAweDgwLCAxLCA2LCA0LCAweDA5LCAwMCwgMHgwZSwgMHgwMSwgMHgwMiB9OworCisJbHZkbW9kZSA9IGluYih3a3BvcnQgKyAweDNmKSAmIDB4NDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQltID0gMTsKKwkJbSA9IG0gPDwgaTsKKwkJaWYgKChtICYgZGV2LT5hY3RpdmVfaWRbMF0pICE9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpID09IGRldi0+aG9zdF9pZFswXSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgSUQ6ICUyZCAgSG9zdCBBZGFwdGVyXG4iLCBkZXYtPmhvc3RfaWRbMF0pOworCQkJY29udGludWU7CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1YjsKKwkJb3V0YigweDAxLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDQxOworCQlvdXRiKDB4MDgsIHRtcG9ydCsrKTsKKwkJb3V0YigweDdmLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blswXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blszXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzVdLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDA2OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbMF1baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls2XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bN10sIHRtcG9ydCsrKTsKKwkJaiA9IGk7CisJCWlmICgoaiAmIDB4MDgpICE9IDApIHsKKwkJCWogPSAoaiAmIDB4MDcpIHwgMHg0MDsKKwkJfQorCQlvdXRiKGosIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmIChpbmIodG1wb3J0KSAhPSAweDExICYmIGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljb250aW51ZTsKKworCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCWRldi0+YWN0aXZlX2lkWzBdIHw9IG07CisKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1MDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisKK3BoYXNlX2NtZDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1ODsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJdG1wb3J0ID0gd2twb3J0ICsgMHg1MDsKKwkJCW91dGIoMHg0MSwgdG1wb3J0KTsKKwkJCWdvdG8gcGhhc2VfY21kOworCQl9CitzZWxfb2s6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NDM7CisJCW91dGIoaW5xZFswXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFszXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzVdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkWzBdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKGlucWRbOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQkKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTEgJiYgaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1YjsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU4OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlqID0gMDsKK3JkX2lucV9kYXRhOgorCQlrID0gaW5iKHRtcG9ydCk7CisJCWlmICgoayAmIDB4MDEpICE9IDApIHsKKwkJCXRtcG9ydCAtPSAweDA2OworCQkJbWJ1ZltqKytdID0gaW5iKHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCWdvdG8gcmRfaW5xX2RhdGE7CisJCX0KKwkJaWYgKChrICYgMHg4MCkgPT0gMCkgeworCQkJZ290byByZF9pbnFfZGF0YTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDE2KSB7CisJCQlnb3RvIGlucV9vazsKKwkJfQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDUwOworCQlvdXRiKDB4NDYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJCQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTYpCisJCQlnb3RvIHNlbF9vazsKKworaW5xX29rOgorCQltYnVmWzM2XSA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgIElEOiAlMmQgICVzXG4iLCBpLCAmbWJ1Zls4XSk7CisJCWRldi0+aWRbMF1baV0uZGV2dHlwZSA9IG1idWZbMF07CisJCXJtYiA9IG1idWZbMV07CisJCW4gPSBtYnVmWzddOworCQlpZiAoKG1idWZbN10gJiAweDYwKSA9PSAwKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmICgoaSA8IDgpICYmICgoZGV2LT5nbG9iYWxfbWFwWzBdICYgMHgyMCkgPT0gMCkpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKGx2ZG1vZGUgPT0gMCkgeworCQkJZ290byBjaGdfd2lkZTsKKwkJfQorCQlpZiAoZGV2LT5zcFswXVtpXSAhPSAweDA0KQkvLyBmb3JjZSB1MgorCQl7CisJCQlnb3RvIGNoZ193aWRlOworCQl9CisKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1YjsKKwkJb3V0YigweDAxLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDQzOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkWzBdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisKKwkJaWYgKGluYih0bXBvcnQpICE9IDB4MTEgJiYgaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisKK3RyeV91MzoKKwkJaiA9IDA7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHgwOSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0Yih1M1tqKytdLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB1M3BfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB1M3BfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3UzOworCQl9CisJCWNvbnRpbnVlOwordTNwX291dDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1ODsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0YigwLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHUzcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHUzcF9jbWQ7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB1M3Bfb3V0OworCQl9CisJCWNvbnRpbnVlOwordTNwX2luOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDksIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3UzcF9pbjE6CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKChqICYgMHgwMSkgIT0gMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2srK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byB1M3BfaW4xOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gdTNwX2luMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB1M3BfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB1M3BfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdTNwX291dDsKKwkJfQorCQljb250aW51ZTsKK3UzcF9jbWQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1NDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCQkKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJaWYgKGogPT0gMHg0ZSkgeworCQkJCWdvdG8gdTNwX291dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzBdICE9IDB4MDEpIHsKKwkJCWdvdG8gY2hnX3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMV0gIT0gMHgwNikgeworCQkJZ290byBjaGdfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlsyXSAhPSAweDA0KSB7CisJCQlnb3RvIGNoZ193aWRlOworCQl9CisJCWlmIChtYnVmWzNdID09IDB4MDkpIHsKKwkJCW0gPSAxOworCQkJbSA9IG0gPDwgaTsKKwkJCWRldi0+d2lkZV9pZFswXSB8PSBtOworCQkJZGV2LT5pZFswXVtpXS5kZXZzcCA9IDB4Y2U7CisJCQljb250aW51ZTsKKwkJfQorY2hnX3dpZGU6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NWI7CisJCW91dGIoMHgwMSwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg0MzsKKwkJb3V0YihzYXRuWzBdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsxXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzNdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls0XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNV0sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDY7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDI7CisJCW91dGIoZGV2LT5pZFswXVtpXS5kZXZzcCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzZdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls3XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxMSAmJiBpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKKwkJCQordHJ5X3dpZGU6CisJCWogPSAwOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDU0OworCQlvdXRiKDB4MDUsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIod2lkZVtqKytdLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQkJCisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gd2lkZXBfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB3aWRlcF9jbWQ7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB0cnlfd2lkZTsKKwkJfQorCQljb250aW51ZTsKK3dpZGVwX291dDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1ODsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0YigwLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gd2lkZXBfb3V0OworCQl9CisJCWNvbnRpbnVlOword2lkZXBfaW46CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHhmZiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWsgPSAwOword2lkZXBfaW4xOgorCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmICgoaiAmIDB4MDEpICE9IDApIHsKKwkJCXRtcG9ydCAtPSAweDA2OworCQkJbWJ1ZltrKytdID0gaW5iKHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCWdvdG8gd2lkZXBfaW4xOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gd2lkZXBfaW4xOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gd2lkZXBfb3V0OworCQl9CisJCWNvbnRpbnVlOword2lkZXBfY21kOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDUwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKworCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQlpZiAoaiA9PSAweDRlKSB7CisJCQkJZ290byB3aWRlcF9vdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDIpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMl0gIT0gMHgwMykgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlszXSAhPSAweDAxKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCW0gPSAxOworCQltID0gbSA8PCBpOworCQlkZXYtPndpZGVfaWRbMF0gfD0gbTsKK25vdF93aWRlOgorCQlpZiAoKGRldi0+aWRbMF1baV0uZGV2dHlwZSA9PSAweDAwKSB8fCAoZGV2LT5pZFswXVtpXS5kZXZ0eXBlID09IDB4MDcpIHx8ICgoZGV2LT5pZFswXVtpXS5kZXZ0eXBlID09IDB4MDUpICYmICgobiAmIDB4MTApICE9IDApKSkgeworCQkJbSA9IDE7CisJCQltID0gbSA8PCBpOworCQkJaWYgKChkZXYtPmFzeW5jWzBdICYgbSkgIT0gMCkgeworCQkJCWdvdG8gc2V0X3N5bmM7CisJCQl9CisJCX0KKwkJY29udGludWU7CitzZXRfc3luYzoKKwkJaWYgKGRldi0+c3BbMF1baV0gPT0gMHgwMikgeworCQkJc3ludVs0XSA9IDB4MGM7CisJCQlzeW51d1s0XSA9IDB4MGM7CisJCX0gZWxzZSB7CisJCQlpZiAoZGV2LT5zcFswXVtpXSA+PSAweDAzKSB7CisJCQkJc3ludVs0XSA9IDB4MGE7CisJCQkJc3ludXdbNF0gPSAweDBhOworCQkJfQorCQl9CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NWI7CisJCWogPSAwOworCQlpZiAoKG0gJiBkZXYtPndpZGVfaWRbMF0pICE9IDApIHsKKwkJCWogfD0gMHgwMTsKKwkJfQorCQlvdXRiKGosIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NDM7CisJCW91dGIoc2F0blswXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blszXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzVdLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDA2OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbMF1baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls2XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bN10sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoc2F0bls4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKChpbmIodG1wb3J0KSAhPSAweDExKSAmJiAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisKK3RyeV9zeW5jOgorCQlqID0gMDsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHg1NDsKKwkJb3V0YigweDA2LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlpZiAoKG0gJiBkZXYtPndpZGVfaWRbMF0pICE9IDApIHsKKwkJCQkJaWYgKChtICYgZGV2LT51bHRyYV9tYXBbMF0pICE9IDApIHsKKwkJCQkJCW91dGIoc3ludXdbaisrXSwgdG1wb3J0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dGIoc3lud1tqKytdLCB0bXBvcnQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChtICYgZGV2LT51bHRyYV9tYXBbMF0pICE9IDApIHsKKwkJCQkJCW91dGIoc3ludVtqKytdLCB0bXBvcnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJb3V0YihzeW5uW2orK10sIHRtcG9ydCk7CisJCQkJCX0KKwkJCQl9CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB0cnlfc3luYzsKKwkJfQorCQljb250aW51ZTsKK3BoYXNlX291dHM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMHgwMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDg1KSB7CisJCQlnb3RvIHRhcl9kY29uczsKKwkJfQorCQlqICY9IDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gcGhhc2VfaW5zOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gcGhhc2VfY21kczsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHBoYXNlX291dHM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9pbnM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHgwNiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWsgPSAwOworcGhhc2VfaW5zMToKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDAxKSAhPSAweDAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaysrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHBoYXNlX2luczE7CisJCX0KKwkJaWYgKChqICYgMHg4MCkgPT0gMHgwMCkgeworCQkJZ290byBwaGFzZV9pbnMxOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiA9PSAweDg1KSB7CisJCQlnb3RvIHRhcl9kY29uczsKKwkJfQorCQlqICY9IDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gcGhhc2VfaW5zOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gcGhhc2VfY21kczsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHBoYXNlX291dHM7CisJCX0KKwkJY29udGludWU7CitwaGFzZV9jbWRzOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDUwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7Cit0YXJfZGNvbnM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4NTQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKworCQl0bXBvcnQgLT0gMHgwODsKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoaiAhPSAweDE2KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlsxXSAhPSAweDAzKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1Zls0XSA9PSAweDAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlszXSA+IDB4NjQpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzRdID4gMHgwZSkgeworCQkJbWJ1Zls0XSA9IDB4MGU7CisJCX0KKwkJZGV2LT5pZFswXVtpXS5kZXZzcCA9IG1idWZbNF07CisJCWlmIChtYnVmWzNdIDwgMHgwYykgeworCQkJaiA9IDB4YjA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKChtYnVmWzNdIDwgMHgwZCkgJiYgKHJtYiA9PSAwKSkgeworCQkJaiA9IDB4YTA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKG1idWZbM10gPCAweDFhKSB7CisJCQlqID0gMHgyMDsKKwkJCWdvdG8gc2V0X3N5bl9vazsKKwkJfQorCQlpZiAobWJ1ZlszXSA8IDB4MzMpIHsKKwkJCWogPSAweDQwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmIChtYnVmWzNdIDwgMHg0YykgeworCQkJaiA9IDB4NTA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaiA9IDB4NjA7CitzZXRfc3luX29rOgorCQlkZXYtPmlkWzBdW2ldLmRldnNwID0gKGRldi0+aWRbMF1baV0uZGV2c3AgJiAweDBmKSB8IGo7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdHA4NzB1X2ZyZWVfdGFibGVzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGF0cF91bml0ICphdHBfZGV2ID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZob3N0LT5ob3N0ZGF0YTsKKwlpbnQgaiwgazsKKwlmb3IgKGo9MDsgaiA8IDI7IGorKykgeworCQlmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykgeworCQkJaWYgKCFhdHBfZGV2LT5pZFtqXVtrXS5wcmRfdGFibGUpCisJCQkJY29udGludWU7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGF0cF9kZXYtPnBkZXYsIDEwMjQsIGF0cF9kZXYtPmlkW2pdW2tdLnByZF90YWJsZSwgYXRwX2Rldi0+aWRbal1ba10ucHJkYWRkcik7CisJCQlhdHBfZGV2LT5pZFtqXVtrXS5wcmRfdGFibGUgPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGF0cDg3MHVfaW5pdF90YWJsZXMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYXRwX3VuaXQgKmF0cF9kZXYgPSAoc3RydWN0IGF0cF91bml0ICopJmhvc3QtPmhvc3RkYXRhOworCWludCBjLGs7CisJZm9yKGM9MDtjIDwgMjtjKyspIHsKKwkgICAJZm9yKGs9MDtrPDE2O2srKykgeworCSAgIAkJCWF0cF9kZXYtPmlkW2NdW2tdLnByZF90YWJsZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGF0cF9kZXYtPnBkZXYsIDEwMjQsICYoYXRwX2Rldi0+aWRbY11ba10ucHJkYWRkcikpOworCSAgIAkJCWlmICghYXRwX2Rldi0+aWRbY11ba10ucHJkX3RhYmxlKSB7CisJICAgCQkJCXByaW50aygiYXRwODcwdV9pbml0X3RhYmxlcyBmYWlsXG4iKTsKKwkJCQlhdHA4NzB1X2ZyZWVfdGFibGVzKGhvc3QpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYXRwX2Rldi0+aWRbY11ba10uZGV2c3A9MHgyMDsKKwkJCWF0cF9kZXYtPmlkW2NdW2tdLmRldnR5cGUgPSAweDdmOworCQkJYXRwX2Rldi0+aWRbY11ba10uY3Vycl9yZXEgPSBOVUxMOwkJCSAgIAorCSAgIAl9CisJICAgCQkJCisJICAgCWF0cF9kZXYtPmFjdGl2ZV9pZFtjXSA9IDA7CisJICAgCWF0cF9kZXYtPndpZGVfaWRbY10gPSAwOworCSAgIAlhdHBfZGV2LT5ob3N0X2lkW2NdID0gMHgwNzsKKwkgICAJYXRwX2Rldi0+cXVoZFtjXSA9IDA7CisJICAgCWF0cF9kZXYtPnF1ZW5kW2NdID0gMDsKKwkgICAJYXRwX2Rldi0+bGFzdF9jbWRbY10gPSAweGZmOworCSAgIAlhdHBfZGV2LT5pbl9zbmRbY10gPSAwOworCSAgIAlhdHBfZGV2LT5pbl9pbnRbY10gPSAwOworCSAgIAkKKwkgICAJZm9yIChrID0gMDsgayA8IHFjbnQ7IGsrKykgeworCSAgIAkJICBhdHBfZGV2LT5xdWVyZXFbY11ba10gPSBOVUxMOworCSAgIAl9CSAgIAkJICAgCisJICAgCWZvciAoayA9IDA7IGsgPCAxNjsgaysrKSB7CisJCQkgICBhdHBfZGV2LT5pZFtjXVtrXS5jdXJyX3JlcSA9IE5VTEw7CisJCQkgICBhdHBfZGV2LT5zcFtjXVtrXSA9IDB4MDQ7CisJICAgCX0JCSAgIAorCX0KKwlyZXR1cm4gMDsKK30KKworLyogcmV0dXJuIG5vbi16ZXJvIG9uIGRldGVjdGlvbiAqLworc3RhdGljIGludCBhdHA4NzB1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXVuc2lnbmVkIGNoYXIgaywgbSwgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBiYXNlX2lvLCB0bXBvcnQsIGVycm9yLG47CisJdW5zaWduZWQgY2hhciBob3N0X2lkOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gTlVMTDsKKwlzdHJ1Y3QgYXRwX3VuaXQgYXRwX2RldiwgKnA7CisJdW5zaWduZWQgY2hhciBzZXR1cGRhdGFbMl1bMTZdOworCWludCBjb3VudCA9IDA7CisJCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworICAgICAgICBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRlVMKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImF0cDg3MHU6IHVzZSAzMmJpdCBETUEgbWFzay5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYXRwODcwdTogRE1BIG1hc2sgcmVxdWlyZWQgYnV0IG5vdCBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisJbWVtc2V0KCZhdHBfZGV2LCAwLCBzaXplb2YgYXRwX2Rldik7CisJLyoKKwkgKiBJdCdzIHByb2JhYmx5IGVhc2llciB0byB3ZWVkIG91dCBzb21lIHJldmlzaW9ucyBsaWtlCisJICogdGhpcyB0aGFuIHZpYSB0aGUgUENJIGRldmljZSB0YWJsZQorCSAqLworCWlmIChlbnQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTApIHsKKwkJZXJyb3IgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZhdHBfZGV2LmNoaXBfdmVyKTsKKwkJaWYgKGF0cF9kZXYuY2hpcF92ZXIgPCAyKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChlbnQtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyVVc6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJTVVc6CisJY2FzZSBBVFA4ODBfREVWSUQxOgkKKwljYXNlIEFUUDg4MF9ERVZJRDI6CQorCWNhc2UgQVRQODg1X0RFVklEOgkKKwkJYXRwX2Rldi5jaGlwX3ZlciA9IDB4MDQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWJhc2VfaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJYmFzZV9pbyAmPSAweGZmZmZmZmY4OworCQorCWlmICgoZW50LT5kZXZpY2UgPT0gQVRQODgwX0RFVklEMSl8fChlbnQtPmRldmljZSA9PSBBVFA4ODBfREVWSUQyKSkgeworCQllcnJvciA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmF0cF9kZXYuY2hpcF92ZXIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOy8vSkNDMDgyODAzCisKKwkJaG9zdF9pZCA9IGluYihiYXNlX2lvICsgMHgzOSk7CisJCWhvc3RfaWQgPj49IDB4MDQ7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgQUNBUkQgQUVDLTY3MTYwIFBDSSBVbHRyYTMgTFZEIEhvc3QgQWRhcHRlcjogJWQiCisJCQkiICAgIElPOiV4LCBJUlE6JWQuXG4iLCBjb3VudCwgYmFzZV9pbywgcGRldi0+aXJxKTsKKwkJYXRwX2Rldi5pb3BvcnRbMF0gPSBiYXNlX2lvICsgMHg0MDsKKwkJYXRwX2Rldi5wY2lwb3J0WzBdID0gYmFzZV9pbyArIDB4Mjg7CisJCWF0cF9kZXYuZGV2X2lkID0gZW50LT5kZXZpY2U7CisJCWF0cF9kZXYuaG9zdF9pZFswXSA9IGhvc3RfaWQ7CisKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4MjI7CisJCWF0cF9kZXYuc2NhbV9vbiA9IGluYih0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgxMzsKKwkJYXRwX2Rldi5nbG9iYWxfbWFwWzBdID0gaW5iKHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlhdHBfZGV2LnVsdHJhX21hcFswXSA9IGludyh0bXBvcnQpOworCisJCW4gPSAweDNmMDk7CituZXh0X2ZibGtfODgwOgorCQlpZiAobiA+PSAweDQwMDApCisJCQlnb3RvIGZsYXNoX29rXzg4MDsKKworCQltID0gMDsKKwkJb3V0dyhuLCBiYXNlX2lvICsgMHgzNCk7CisJCW4gKz0gMHgwMDAyOworCQlpZiAoaW5iKGJhc2VfaW8gKyAweDMwKSA9PSAweGZmKQorCQkJZ290byBmbGFzaF9va184ODA7CisKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMwKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMxKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMyKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMzKTsKKwkJb3V0dyhuLCBiYXNlX2lvICsgMHgzNCk7CisJCW4gKz0gMHgwMDAyOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzApOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzEpOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzIpOworCQlhdHBfZGV2LnNwWzBdW20rK10gPSBpbmIoYmFzZV9pbyArIDB4MzMpOworCQlvdXR3KG4sIGJhc2VfaW8gKyAweDM0KTsKKwkJbiArPSAweDAwMDI7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMCk7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMSk7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMik7CisJCWF0cF9kZXYuc3BbMF1bbSsrXSA9IGluYihiYXNlX2lvICsgMHgzMyk7CisJCW91dHcobiwgYmFzZV9pbyArIDB4MzQpOworCQluICs9IDB4MDAwMjsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMwKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMxKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMyKTsKKwkJYXRwX2Rldi5zcFswXVttKytdID0gaW5iKGJhc2VfaW8gKyAweDMzKTsKKwkJbiArPSAweDAwMTg7CisJCWdvdG8gbmV4dF9mYmxrXzg4MDsKK2ZsYXNoX29rXzg4MDoKKwkJb3V0dygwLCBiYXNlX2lvICsgMHgzNCk7CisJCWF0cF9kZXYudWx0cmFfbWFwWzBdID0gMDsKKwkJYXRwX2Rldi5hc3luY1swXSA9IDA7CisJCWZvciAoayA9IDA7IGsgPCAxNjsgaysrKSB7CisJCQluID0gMTsKKwkJCW4gPSBuIDw8IGs7CisJCQlpZiAoYXRwX2Rldi5zcFswXVtrXSA+IDEpIHsKKwkJCQlhdHBfZGV2LnVsdHJhX21hcFswXSB8PSBuOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYXRwX2Rldi5zcFswXVtrXSA9PSAwKQorCQkJCQlhdHBfZGV2LmFzeW5jWzBdIHw9IG47CisgCQkJfQorCSAJfQorCQlhdHBfZGV2LmFzeW5jWzBdID0gfihhdHBfZGV2LmFzeW5jWzBdKTsKKwkJb3V0YihhdHBfZGV2Lmdsb2JhbF9tYXBbMF0sIGJhc2VfaW8gKyAweDM1KTsKKyAKKwkJc2hwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJmF0cDg3MHVfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYXRwX3VuaXQpKTsKKwkJaWYgKCFzaHBudCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXAgPSAoc3RydWN0IGF0cF91bml0ICopJnNocG50LT5ob3N0ZGF0YTsKKworCQlhdHBfZGV2Lmhvc3QgPSBzaHBudDsKKwkJYXRwX2Rldi5wZGV2ID0gcGRldjsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHApOworCQltZW1jcHkocCwgJmF0cF9kZXYsIHNpemVvZiBhdHBfZGV2KTsKKwkJaWYgKGF0cDg3MHVfaW5pdF90YWJsZXMoc2hwbnQpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgdGFibGVzIGZvciBBY2FyZCBjb250cm9sbGVyXG4iKTsKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJfQorCisJCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGF0cDg3MHVfaW50cl9oYW5kbGUsIFNBX1NISVJRLCAiYXRwODgwaSIsIHNocG50KSkgeworIAkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIElSUSVkIGZvciBBY2FyZCBjb250cm9sbGVyLlxuIiwgcGRldi0+aXJxKTsKKwkJCWdvdG8gZnJlZV90YWJsZXM7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDM4OworCQlrID0gaW5iKHRtcG9ydCkgJiAweDgwOworCQlvdXRiKGssIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCW1kZWxheSgzMik7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJbWRlbGF5KDMyKTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4NWI7CisJCWluYih0bXBvcnQpOworCQl0bXBvcnQgLT0gMHgwNDsKKwkJaW5iKHRtcG9ydCk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDQwOworCQlvdXRiKChob3N0X2lkIHwgMHgwOCksIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDE4OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkKKwkJCW1kZWxheSgxKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWluYih0bXBvcnQpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHg0MTsKKwkJb3V0Yig4LCB0bXBvcnQrKyk7CisJCW91dGIoMHg3ZiwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4NTE7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKworCQl0c2NhbShzaHBudCk7CisJCWlzODgwKHAsIGJhc2VfaW8pOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHgzODsKKwkJb3V0YigweGIwLCB0bXBvcnQpOworCQlzaHBudC0+bWF4X2lkID0gMTY7CisJCXNocG50LT50aGlzX2lkID0gaG9zdF9pZDsKKwkJc2hwbnQtPnVuaXF1ZV9pZCA9IGJhc2VfaW87CisJCXNocG50LT5pb19wb3J0ID0gYmFzZV9pbzsKKwkJc2hwbnQtPm5faW9fcG9ydCA9IDB4NjA7CS8qIE51bWJlciBvZiBieXRlcyBvZiBJL08gc3BhY2UgdXNlZCAqLworCQlzaHBudC0+aXJxID0gcGRldi0+aXJxOwkJCQorCX0gZWxzZSBpZiAoZW50LT5kZXZpY2UgPT0gQVRQODg1X0RFVklEKSB7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgQUNBUkQgQUVDLTY3MTYyIFBDSSBVbHRyYTMgTFZEIEhvc3QgQWRhcHRlcjogIElPOiV4LCBJUlE6JWQuXG4iCisJCQkgICAgICAgLCBiYXNlX2lvLCBwZGV2LT5pcnEpOworICAgICAgICAJCisJCWF0cF9kZXYucGRldiA9IHBkZXY7CQorCQlhdHBfZGV2LmRldl9pZCAgPSBlbnQtPmRldmljZTsKKwkJYXRwX2Rldi5iYXNlcG9ydCA9IGJhc2VfaW87CisJCWF0cF9kZXYuaW9wb3J0WzBdID0gYmFzZV9pbyArIDB4ODA7CisJCWF0cF9kZXYuaW9wb3J0WzFdID0gYmFzZV9pbyArIDB4YzA7CisJCWF0cF9kZXYucGNpcG9ydFswXSA9IGJhc2VfaW8gKyAweDQwOworCQlhdHBfZGV2LnBjaXBvcnRbMV0gPSBiYXNlX2lvICsgMHg1MDsKKwkJCQkKKwkJc2hwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJmF0cDg3MHVfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYXRwX3VuaXQpKTsKKwkJaWYgKCFzaHBudCkKKwkJCXJldHVybiAtRU5PTUVNOworICAgICAgICAJCisJCXAgPSAoc3RydWN0IGF0cF91bml0ICopJnNocG50LT5ob3N0ZGF0YTsKKyAgICAgICAgCQorCQlhdHBfZGV2Lmhvc3QgPSBzaHBudDsKKwkJYXRwX2Rldi5wZGV2ID0gcGRldjsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHApOworCQltZW1jcHkocCwgJmF0cF9kZXYsIHNpemVvZihzdHJ1Y3QgYXRwX3VuaXQpKTsKKwkJaWYgKGF0cDg3MHVfaW5pdF90YWJsZXMoc2hwbnQpIDwgMCkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJCQorI2lmZGVmIEVEX0RCR1AJCQorCXByaW50aygicmVxdWVzdF9pcnEoKSBzaHBudCAlcCBob3N0ZGF0YSAlcFxuIiwgc2hwbnQsIHApOworI2VuZGlmCSAgICAgICAgCisJCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGF0cDg3MHVfaW50cl9oYW5kbGUsIFNBX1NISVJRLCAiYXRwODcwdSIsIHNocG50KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIElSUSBmb3IgQWNhcmQgY29udHJvbGxlci5cbiIpOworCQkJZ290byBmcmVlX3RhYmxlczsKKwkJfQorCQkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOyAgICAgICAgCQkJCQkKKyAgICAgICAgCQkJCisJCWM9aW5iKGJhc2VfaW8gKyAweDI5KTsKKwkJb3V0YigoYyB8IDB4MDQpLGJhc2VfaW8gKyAweDI5KTsKKyAgICAgICAgCQorCQluPTB4MWY4MDsKK25leHRfZmJsa184ODU6CisJCWlmIChuID49IDB4MjAwMCkgeworCQkgICBnb3RvIGZsYXNoX29rXzg4NTsKKwkJfQorCQlvdXR3KG4sYmFzZV9pbyArIDB4M2MpOworCQlpZiAoaW5sKGJhc2VfaW8gKyAweDM4KSA9PSAweGZmZmZmZmZmKSB7CisJCSAgIGdvdG8gZmxhc2hfb2tfODg1OworCQl9CisJCWZvciAobT0wOyBtIDwgMjsgbSsrKSB7CisJCSAgICBwLT5nbG9iYWxfbWFwW21dPSAwOworCQkgICAgZm9yIChrPTA7IGsgPCA0OyBrKyspIHsKKwkJCW91dHcobisrLGJhc2VfaW8gKyAweDNjKTsKKwkJCSgodW5zaWduZWQgbG9uZyAqKSZzZXR1cGRhdGFbbV1bMF0pW2tdPWlubChiYXNlX2lvICsgMHgzOCk7CisJCSAgICB9CisJCSAgICBmb3IgKGs9MDsgayA8IDQ7IGsrKykgeworCQkJb3V0dyhuKyssYmFzZV9pbyArIDB4M2MpOworCQkJKCh1bnNpZ25lZCBsb25nICopJnAtPnNwW21dWzBdKVtrXT1pbmwoYmFzZV9pbyArIDB4MzgpOworCQkgICAgfQorCQkgICAgbiArPSA4OworCQl9CisJCWdvdG8gbmV4dF9mYmxrXzg4NTsKK2ZsYXNoX29rXzg4NToKKyNpZmRlZiBFRF9EQkdQCisJCXByaW50ayggIkZsYXNoIFJlYWQgT0tcbiIpOworI2VuZGlmCQorCQljPWluYihiYXNlX2lvICsgMHgyOSk7CisJCW91dGIoKGMgJiAweGZiKSxiYXNlX2lvICsgMHgyOSk7CisJCWZvciAoYz0wO2MgPCAyO2MrKykgeworCQkgICAgcC0+dWx0cmFfbWFwW2NdPTA7CisJCSAgICBwLT5hc3luY1tjXSA9IDA7CisJCSAgICBmb3IgKGs9MDsgayA8IDE2OyBrKyspIHsKKwkJCW49MTsKKwkJCW4gPSBuIDw8IGs7CisJCQlpZiAocC0+c3BbY11ba10gPiAxKSB7CisJCQkgICBwLT51bHRyYV9tYXBbY10gfD0gbjsKKwkJCX0gZWxzZSB7CisJCQkgICBpZiAocC0+c3BbY11ba10gPT0gMCkgeworCQkJICAgICAgcC0+YXN5bmNbY10gfD0gbjsKKwkJCSAgIH0KKwkJCX0KKwkJICAgIH0KKwkJICAgIHAtPmFzeW5jW2NdID0gfihwLT5hc3luY1tjXSk7CisKKwkJICAgIGlmIChwLT5nbG9iYWxfbWFwW2NdID09IDApIHsKKwkJICAgICAgIGs9c2V0dXBkYXRhW2NdWzFdOworCQkgICAgICAgaWYgKChrICYgMHg0MCkgIT0gMCkKKwkJCSAgcC0+Z2xvYmFsX21hcFtjXSB8PSAweDIwOworCQkgICAgICAgayAmPSAweDA3OworCQkgICAgICAgcC0+Z2xvYmFsX21hcFtjXSB8PSBrOworCQkgICAgICAgaWYgKChzZXR1cGRhdGFbY11bMl0gJiAweDA0KSAhPSAwKQorCQkJICBwLT5nbG9iYWxfbWFwW2NdIHw9IDB4MDg7CisJCSAgICAgICBwLT5ob3N0X2lkW2NdID0gc2V0dXBkYXRhW2NdWzBdICYgMHgwNzsKKwkJICAgIH0KKwkJfQorCisJCWsgPSBpbmIoYmFzZV9pbyArIDB4MjgpICYgMHg4ZjsKKwkJayB8PSAweDEwOworCQlvdXRiKGssIGJhc2VfaW8gKyAweDI4KTsKKwkJb3V0YigweDgwLCBiYXNlX2lvICsgMHg0MSk7CisJCW91dGIoMHg4MCwgYmFzZV9pbyArIDB4NTEpOworCQltZGVsYXkoMTAwKTsKKwkJb3V0YigwLCBiYXNlX2lvICsgMHg0MSk7CisJCW91dGIoMCwgYmFzZV9pbyArIDB4NTEpOworCQltZGVsYXkoMTAwMCk7CisJCWluYihiYXNlX2lvICsgMHg5Yik7CisJCWluYihiYXNlX2lvICsgMHg5Nyk7CisJCWluYihiYXNlX2lvICsgMHhkYik7CisJCWluYihiYXNlX2lvICsgMHhkNyk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDgwOworCQlrPXAtPmhvc3RfaWRbMF07CisJCWlmIChrID4gNykKKwkJICAgayA9IChrICYgMHgwNykgfCAweDQwOworCQlrIHw9IDB4MDg7CisJCW91dGIoaywgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MTg7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApCisJCQljcHVfcmVsYXgoKTsKKwkKKwkJdG1wb3J0IC09IDB4MDg7CisJCWluYih0bXBvcnQpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHg4MTsKKwkJb3V0Yig4LCB0bXBvcnQrKyk7CisJCW91dGIoMHg3ZiwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4OTE7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHhjMDsKKwkJaz1wLT5ob3N0X2lkWzFdOworCQlpZiAoayA+IDcpCisJCSAgIGsgPSAoayAmIDB4MDcpIHwgMHg0MDsKKwkJayB8PSAweDA4OworCQlvdXRiKGssIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDE4OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJdG1wb3J0IC09IDB4MDg7CisJCWluYih0bXBvcnQpOworCQl0bXBvcnQgPSBiYXNlX2lvICsgMHhjMTsKKwkJb3V0Yig4LCB0bXBvcnQrKyk7CisJCW91dGIoMHg3ZiwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4ZDE7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKworCQl0c2NhbV84ODUoKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgU2Nhbm5pbmcgQ2hhbm5lbCBBIFNDU0kgRGV2aWNlIC4uLlxuIik7CisJCWlzODg1KHAsIGJhc2VfaW8gKyAweDgwLCAwKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgU2Nhbm5pbmcgQ2hhbm5lbCBCIFNDU0kgRGV2aWNlIC4uLlxuIik7CisJCWlzODg1KHAsIGJhc2VfaW8gKyAweGMwLCAxKTsKKworCQlrID0gaW5iKGJhc2VfaW8gKyAweDI4KSAmIDB4Y2Y7CisJCWsgfD0gMHhjMDsKKwkJb3V0YihrLCBiYXNlX2lvICsgMHgyOCk7CisJCWsgPSBpbmIoYmFzZV9pbyArIDB4MWYpIHwgMHg4MDsKKwkJb3V0YihrLCBiYXNlX2lvICsgMHgxZik7CisJCWsgPSBpbmIoYmFzZV9pbyArIDB4MjkpIHwgMHgwMTsKKwkJb3V0YihrLCBiYXNlX2lvICsgMHgyOSk7CisjaWZkZWYgRURfREJHUAorCQkvL3ByaW50aygiYXRwODg1OiBhdHBfaG9zdFswXSAweCVwXG4iLCBhdHBfaG9zdFswXSk7CisjZW5kaWYJCQorCQlzaHBudC0+bWF4X2lkID0gMTY7CisJCXNocG50LT5tYXhfbHVuID0gKHAtPmdsb2JhbF9tYXBbMF0gJiAweDA3KSArIDE7CisJCXNocG50LT5tYXhfY2hhbm5lbCA9IDE7CisJCXNocG50LT50aGlzX2lkID0gcC0+aG9zdF9pZFswXTsKKwkJc2hwbnQtPnVuaXF1ZV9pZCA9IGJhc2VfaW87CisJCXNocG50LT5pb19wb3J0ID0gYmFzZV9pbzsKKwkJc2hwbnQtPm5faW9fcG9ydCA9IDB4ZmY7CS8qIE51bWJlciBvZiBieXRlcyBvZiBJL08gc3BhY2UgdXNlZCAqLworCQlzaHBudC0+aXJxID0gcGRldi0+aXJxOworCQkJCQorCX0gZWxzZSB7CisJCWVycm9yID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0OSwgJmhvc3RfaWQpOworCisJCXByaW50ayhLRVJOX0lORk8gIiAgIEFDQVJEIEFFQy02NzFYIFBDSSBVbHRyYS9XIFNDU0ktMi8zIEhvc3QgQWRhcHRlcjogJWQgIgorCQkJIklPOiV4LCBJUlE6JWQuXG4iLCBjb3VudCwgYmFzZV9pbywgcGRldi0+aXJxKTsKKworCQlhdHBfZGV2LmlvcG9ydFswXSA9IGJhc2VfaW87CisJCWF0cF9kZXYucGNpcG9ydFswXSA9IGJhc2VfaW8gKyAweDIwOworCQlhdHBfZGV2LmRldl9pZCA9IGVudC0+ZGV2aWNlOworCQlob3N0X2lkICY9IDB4MDc7CisJCWF0cF9kZXYuaG9zdF9pZFswXSA9IGhvc3RfaWQ7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDIyOworCQlhdHBfZGV2LnNjYW1fb24gPSBpbmIodG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MGI7CisJCWF0cF9kZXYuZ2xvYmFsX21hcFswXSA9IGluYih0bXBvcnQrKyk7CisJCWF0cF9kZXYudWx0cmFfbWFwWzBdID0gaW53KHRtcG9ydCk7CisKKwkJaWYgKGF0cF9kZXYudWx0cmFfbWFwWzBdID09IDApIHsKKwkJCWF0cF9kZXYuc2NhbV9vbiA9IDB4MDA7CisJCQlhdHBfZGV2Lmdsb2JhbF9tYXBbMF0gPSAweDIwOworCQkJYXRwX2Rldi51bHRyYV9tYXBbMF0gPSAweGZmZmY7CisJCX0KKworCQlzaHBudCA9IHNjc2lfaG9zdF9hbGxvYygmYXRwODcwdV90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBhdHBfdW5pdCkpOworCQlpZiAoIXNocG50KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcCA9IChzdHJ1Y3QgYXRwX3VuaXQgKikmc2hwbnQtPmhvc3RkYXRhOworCQkKKwkJYXRwX2Rldi5ob3N0ID0gc2hwbnQ7CisJCWF0cF9kZXYucGRldiA9IHBkZXY7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKwkJbWVtY3B5KHAsICZhdHBfZGV2LCBzaXplb2YgYXRwX2Rldik7CisJCWlmIChhdHA4NzB1X2luaXRfdGFibGVzKHNocG50KSA8IDApCisJCQlnb3RvIHVucmVnaXN0ZXI7CisKKwkJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgYXRwODcwdV9pbnRyX2hhbmRsZSwgU0FfU0hJUlEsICJhdHA4NzBpIiwgc2hwbnQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlElZCBmb3IgQWNhcmQgY29udHJvbGxlci5cbiIsIHBkZXYtPmlycSk7CisJCQlnb3RvIGZyZWVfdGFibGVzOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlpZiAoYXRwX2Rldi5jaGlwX3ZlciA+IDB4MDcpIHsJLyogY2hlY2sgaWYgYXRwODc2IGNoaXAgdGhlbiBlbmFibGUgdGVybWluYXRvciAqLworCQkJdG1wb3J0ID0gYmFzZV9pbyArIDB4M2U7CisJCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCX0KKyAKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4M2E7CisJCWsgPSAoaW5iKHRtcG9ydCkgJiAweGYzKSB8IDB4MTA7CisJCW91dGIoaywgdG1wb3J0KTsKKwkJb3V0YigoayAmIDB4ZGYpLCB0bXBvcnQpOworCQltZGVsYXkoMzIpOworCQlvdXRiKGssIHRtcG9ydCk7CisJCW1kZWxheSgzMik7CisJCXRtcG9ydCA9IGJhc2VfaW87CisJCW91dGIoKGhvc3RfaWQgfCAweDA4KSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MTg7CisJCW91dGIoMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKQorCQkJbWRlbGF5KDEpOworCisJCXRtcG9ydCAtPSAweDA4OworCQlpbmIodG1wb3J0KTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDE7CisJCW91dGIoOCwgdG1wb3J0KyspOworCQlvdXRiKDB4N2YsIHRtcG9ydCk7CisJCXRtcG9ydCA9IGJhc2VfaW8gKyAweDExOworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisKKwkJdHNjYW0oc2hwbnQpOworCQlpczg3MChwLCBiYXNlX2lvKTsKKwkJdG1wb3J0ID0gYmFzZV9pbyArIDB4M2E7CisJCW91dGIoKGluYih0bXBvcnQpICYgMHhlZiksIHRtcG9ydCk7CisJCXRtcG9ydCsrOworCQlvdXRiKChpbmIodG1wb3J0KSB8IDB4MjApLCB0bXBvcnQpOworCQlpZiAoYXRwX2Rldi5jaGlwX3ZlciA9PSA0KQorCQkJc2hwbnQtPm1heF9pZCA9IDE2OworCQllbHNlCQkKKwkJCXNocG50LT5tYXhfaWQgPSA3OworCQlzaHBudC0+dGhpc19pZCA9IGhvc3RfaWQ7CisJCXNocG50LT51bmlxdWVfaWQgPSBiYXNlX2lvOworCQlzaHBudC0+aW9fcG9ydCA9IGJhc2VfaW87CisJCXNocG50LT5uX2lvX3BvcnQgPSAweDQwOwkvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgSS9PIHNwYWNlIHVzZWQgKi8KKwkJc2hwbnQtPmlycSA9IHBkZXYtPmlycTsJCQorCX0gCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlpZihlbnQtPmRldmljZT09QVRQODg1X0RFVklEKSB7CisJCQlpZighcmVxdWVzdF9yZWdpb24oYmFzZV9pbywgMHhmZiwgImF0cDg3MHUiKSkgLyogUmVnaXN0ZXIgdGhlIElPIHBvcnRzIHRoYXQgd2UgdXNlICovCisJCQkJZ290byByZXF1ZXN0X2lvX2ZhaWw7CisJCX0gZWxzZSBpZigoZW50LT5kZXZpY2U9PUFUUDg4MF9ERVZJRDEpfHwoZW50LT5kZXZpY2U9PUFUUDg4MF9ERVZJRDIpKSB7CisJCQlpZighcmVxdWVzdF9yZWdpb24oYmFzZV9pbywgMHg2MCwgImF0cDg3MHUiKSkgLyogUmVnaXN0ZXIgdGhlIElPIHBvcnRzIHRoYXQgd2UgdXNlICovCisJCQkJZ290byByZXF1ZXN0X2lvX2ZhaWw7CisJCX0gZWxzZSB7CisJCQlpZighcmVxdWVzdF9yZWdpb24oYmFzZV9pbywgMHg0MCwgImF0cDg3MHUiKSkgLyogUmVnaXN0ZXIgdGhlIElPIHBvcnRzIHRoYXQgd2UgdXNlICovCisJCQkJZ290byByZXF1ZXN0X2lvX2ZhaWw7CisJCX0JCQkJCisJCWNvdW50Kys7CisJCWlmIChzY3NpX2FkZF9ob3N0KHNocG50LCAmcGRldi0+ZGV2KSkKKwkJCWdvdG8gc2NzaV9hZGRfZmFpbDsKKwkJc2NzaV9zY2FuX2hvc3Qoc2hwbnQpOworI2lmZGVmIEVEX0RCR1AJCQkKKwkJcHJpbnRrKCJhdHA4NzB1X3Byb2IgOiBleGl0XG4iKTsKKyNlbmRpZgkJCisJCXJldHVybiAwOworCitzY3NpX2FkZF9mYWlsOgorCXByaW50aygiYXRwODcwdV9wcm9iOnNjc2lfYWRkX2ZhaWxcbiIpOworCWlmKGVudC0+ZGV2aWNlPT1BVFA4ODVfREVWSUQpIHsKKwkJcmVsZWFzZV9yZWdpb24oYmFzZV9pbywgMHhmZik7CisJfSBlbHNlIGlmKChlbnQtPmRldmljZT09QVRQODgwX0RFVklEMSl8fChlbnQtPmRldmljZT09QVRQODgwX0RFVklEMikpIHsKKwkJcmVsZWFzZV9yZWdpb24oYmFzZV9pbywgMHg2MCk7CisJfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oYmFzZV9pbywgMHg0MCk7CisJfQorcmVxdWVzdF9pb19mYWlsOgorCXByaW50aygiYXRwODcwdV9wcm9iOnJlcXVlc3RfaW9fZmFpbFxuIik7CisJZnJlZV9pcnEocGRldi0+aXJxLCBzaHBudCk7CitmcmVlX3RhYmxlczoKKwlwcmludGsoImF0cDg3MHVfcHJvYjpmcmVlX3RhYmxlXG4iKTsKKwlhdHA4NzB1X2ZyZWVfdGFibGVzKHNocG50KTsKK3VucmVnaXN0ZXI6CisJcHJpbnRrKCJhdHA4NzB1X3Byb2I6dW5yZWdpc3RlclxuIik7CisJc2NzaV9ob3N0X3B1dChzaHBudCk7CisJcmV0dXJuIC0xOwkJCit9CisKKy8qIFRoZSBhYm9ydCBjb21tYW5kIGRvZXMgbm90IGxlYXZlIHRoZSBkZXZpY2UgaW4gYSBjbGVhbiBzdGF0ZSB3aGVyZQorICAgaXQgaXMgYXZhaWxhYmxlIHRvIGJlIHVzZWQgYWdhaW4uICBVbnRpbCB0aGlzIGdldHMgd29ya2VkIG91dCwgd2Ugd2lsbAorICAgbGVhdmUgaXQgY29tbWVudGVkIG91dC4gICovCisKK3N0YXRpYyBpbnQgYXRwODcwdV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJdW5zaWduZWQgY2hhciAgaiwgaywgYzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp3b3JrcmVxdTsKKwl1bnNpZ25lZCBpbnQgdG1wb3J0OworCXN0cnVjdCBhdHBfdW5pdCAqZGV2OwkKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCWhvc3QgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCisJZGV2ID0gKHN0cnVjdCBhdHBfdW5pdCAqKSZob3N0LT5ob3N0ZGF0YTsKKwljPVNDcG50LT5kZXZpY2UtPmNoYW5uZWw7CisJcHJpbnRrKCIgYXRwODcwdTogYWJvcnQgQ2hhbm5lbCA9ICV4IFxuIiwgYyk7CisJcHJpbnRrKCJ3b3JraW5nPSV4IGxhc3RfY21kPSV4ICIsIGRldi0+d29ya2luZ1tjXSwgZGV2LT5sYXN0X2NtZFtjXSk7CisJcHJpbnRrKCIgcXVoZHU9JXggcXVlbmR1PSV4ICIsIGRldi0+cXVoZFtjXSwgZGV2LT5xdWVuZFtjXSk7CisJdG1wb3J0ID0gZGV2LT5pb3BvcnRbY107CisJZm9yIChqID0gMDsgaiA8IDB4MTg7IGorKykgeworCQlwcmludGsoIiByJTJ4PSUyeCIsIGosIGluYih0bXBvcnQrKykpOworCX0KKwl0bXBvcnQgKz0gMHgwNDsKKwlwcmludGsoIiByMWM9JTJ4IiwgaW5iKHRtcG9ydCkpOworCXRtcG9ydCArPSAweDAzOworCXByaW50aygiIHIxZj0lMnggaW5fc25kPSUyeCAiLCBpbmIodG1wb3J0KSwgZGV2LT5pbl9zbmRbY10pOworCXRtcG9ydD0gZGV2LT5wY2lwb3J0W2NdOworCXByaW50aygiIGQwMD0lMngiLCBpbmIodG1wb3J0KSk7CisJdG1wb3J0ICs9IDB4MDI7CisJcHJpbnRrKCIgZDAyPSUyeCIsIGluYih0bXBvcnQpKTsKKwlmb3Ioaj0wO2o8MTY7aisrKSB7CisJICAgaWYgKGRldi0+aWRbY11bal0uY3Vycl9yZXEgIT0gTlVMTCkgeworCQl3b3JrcmVxdSA9IGRldi0+aWRbY11bal0uY3Vycl9yZXE7CisJCXByaW50aygiXG4gcXVlIGNkYj0gIik7CisJCWZvciAoaz0wOyBrIDwgd29ya3JlcXUtPmNtZF9sZW47IGsrKykgeworCQkgICAgcHJpbnRrKCIgJTJ4ICIsd29ya3JlcXUtPmNtbmRba10pOworCQl9CisJCXByaW50aygiIGxhc3RfbGVudT0gJXggIiwodW5zaWduZWQgaW50KWRldi0+aWRbY11bal0ubGFzdF9sZW4pOworCSAgIH0KKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphdHA4NzB1X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqbm90dXNlZCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTI4XTsKKworCXN0cmNweShidWZmZXIsICJBQ0FSRCBBRUMtNjcxMC82NzEyLzY3MTYwIFBDSSBVbHRyYS9XL0xWRCBTQ1NJLTMgQWRhcHRlciBEcml2ZXIgVjIuNithYyAiKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKKyNkZWZpbmUgQkxTIGJ1ZmZlciArIGxlbiArIHNpemUKK2ludCBhdHA4NzB1X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpIQkFwdHIsIGNoYXIgKmJ1ZmZlciwgCisJCSAgICAgIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RhdGljIHU4IGJ1ZmZbNTEyXTsKKwlpbnQgc2l6ZSA9IDA7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW4gPSAwOworCW9mZl90IHBvcyA9IDA7CisJCisJaWYgKGlub3V0KSAJCisJCXJldHVybiAtRUlOVkFMOworCWlmIChvZmZzZXQgPT0gMCkKKwkJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisJc2l6ZSArPSBzcHJpbnRmKEJMUywgIkFDQVJEIEFFQy02NzFYIERyaXZlciBWZXJzaW9uOiAyLjYrYWNcbiIpOworCWxlbiArPSBzaXplOworCXBvcyA9IGJlZ2luICsgbGVuOworCXNpemUgPSAwOworCisJc2l6ZSArPSBzcHJpbnRmKEJMUywgIlxuIik7CisJc2l6ZSArPSBzcHJpbnRmKEJMUywgIkFkYXB0ZXIgQ29uZmlndXJhdGlvbjpcbiIpOworCXNpemUgKz0gc3ByaW50ZihCTFMsICIgICAgICAgICAgICAgICBCYXNlIElPOiAlIy40bHhcbiIsIEhCQXB0ci0+aW9fcG9ydCk7CisJc2l6ZSArPSBzcHJpbnRmKEJMUywgIiAgICAgICAgICAgICAgICAgICBJUlE6ICVkXG4iLCBIQkFwdHItPmlycSk7CisJbGVuICs9IHNpemU7CisJcG9zID0gYmVnaW4gKyBsZW47CisJCisJKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsJLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKwlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsJLyogU3RhcnQgc2xvcCAqLworCWlmIChsZW4gPiBsZW5ndGgpIHsKKwkJbGVuID0gbGVuZ3RoOwkvKiBFbmRpbmcgc2xvcCAqLworCX0KKwlyZXR1cm4gKGxlbik7Cit9CisKKworc3RhdGljIGludCBhdHA4NzB1X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRpc2ssIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmlwKQoreworCWludCBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzOworCisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisJY3lsaW5kZXJzID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKwlpZiAoY3lsaW5kZXJzID4gMTAyNCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCQljeWxpbmRlcnMgPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCX0KKwlpcFswXSA9IGhlYWRzOworCWlwWzFdID0gc2VjdG9yczsKKwlpcFsyXSA9IGN5bGluZGVyczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdHA4NzB1X3JlbW92ZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CQorCXN0cnVjdCBhdHBfdW5pdCAqZGV2ZXh0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCA9IGRldmV4dC0+aG9zdDsKKwkKKwkKKwlzY3NpX3JlbW92ZV9ob3N0KHBzaG9zdCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZnJlZV9pcnEgOiAlZFxuIixwc2hvc3QtPmlycSk7CisJZnJlZV9pcnEocHNob3N0LT5pcnEsIHBzaG9zdCk7CisJcmVsZWFzZV9yZWdpb24ocHNob3N0LT5pb19wb3J0LCBwc2hvc3QtPm5faW9fcG9ydCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXRwODcwdV9mcmVlX3RhYmxlcyA6ICVwXG4iLHBzaG9zdCk7CisJYXRwODcwdV9mcmVlX3RhYmxlcyhwc2hvc3QpOworCXByaW50ayhLRVJOX0lORk8gInNjc2lfaG9zdF9wdXQgOiAlcFxuIixwc2hvc3QpOworCXNjc2lfaG9zdF9wdXQocHNob3N0KTsKKwlwcmludGsoS0VSTl9JTkZPICJwY2lfc2V0X2RydmRhdGEgOiAlcFxuIixwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CQorfQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhdHA4NzB1X3RlbXBsYXRlID0geworICAgICAubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKyAgICAgLm5hbWUgICAgICAgICAgICAgIAk9ICJhdHA4NzB1IgkJLyogbmFtZSAqLywKKyAgICAgLnByb2NfbmFtZQkJCT0gImF0cDg3MHUiLAorICAgICAucHJvY19pbmZvCQkJPSBhdHA4NzB1X3Byb2NfaW5mbywKKyAgICAgLmluZm8gICAgICAgICAgICAgIAk9IGF0cDg3MHVfaW5mbwkJLyogaW5mbyAqLywKKyAgICAgLnF1ZXVlY29tbWFuZCAgICAgIAk9IGF0cDg3MHVfcXVldWVjb21tYW5kCS8qIHF1ZXVlY29tbWFuZCAqLywKKyAgICAgLmVoX2Fib3J0X2hhbmRsZXIgIAk9IGF0cDg3MHVfYWJvcnQJCS8qIGFib3J0ICovLAorICAgICAuYmlvc19wYXJhbSAgICAgICAgCT0gYXRwODcwdV9iaW9zcGFyYW0JLyogYmlvc3Bhcm0gKi8sCisgICAgIC5jYW5fcXVldWUgICAgICAgICAJPSBxY250CQkJLyogY2FuX3F1ZXVlICovLAorICAgICAudGhpc19pZCAgICAgICAgICAgCT0gNwkJCS8qIFNDU0kgSUQgKi8sCisgICAgIC5zZ190YWJsZXNpemUgICAgICAJPSBBVFA4NzBVX1NDQVRURVIJLypTR19BTEwqLyAvKlNHX05PTkUqLywKKyAgICAgLmNtZF9wZXJfbHVuICAgICAgIAk9IEFUUDg3MFVfQ01ETFVOCQkvKiBjb21tYW5kcyBwZXIgbHVuICovLAorICAgICAudXNlX2NsdXN0ZXJpbmcgICAgCT0gRU5BQkxFX0NMVVNURVJJTkcsCisgICAgIC5tYXhfc2VjdG9ycwkJPSBBVFA4NzBVX01BWF9TRUNUT1JTLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0cDg3MHVfaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgQVRQODg1X0RFVklEKQkJCSAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgQVRQODgwX0RFVklEMSkJCQkgIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIEFUUDg4MF9ERVZJRDIpCQkJICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTApICAgIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQUVDNzYxMlVXKSAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyVSkgICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QX0FFQzc2MTJTKSAgIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVJUT1AsIFBDSV9ERVZJQ0VfSURfQVJUT1BfQUVDNzYxMkQpCSAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BUlRPUCwgUENJX0RFVklDRV9JRF9BUlRPUF9BRUM3NjEyU1VXKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FSVE9QLCBQQ0lfREVWSUNFX0lEX0FSVE9QXzgwNjApCSAgfSwKKwl7IDAsIH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXRwODcwdV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdHA4NzB1X2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSBhdHA4NzB1X2lkX3RhYmxlLAorCS5uYW1lCQk9ICJhdHA4NzB1IiwKKwkucHJvYmUJCT0gYXRwODcwdV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0cDg3MHVfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0cDg3MHVfaW5pdCh2b2lkKQoreworI2lmZGVmIEVEX0RCR1AJCisJcHJpbnRrKCJhdHA4NzB1X2luaXQ6IEVudHJ5XG4iKTsKKyNlbmRpZgkKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXRwODcwdV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRwODcwdV9leGl0KHZvaWQpCit7CisjaWZkZWYgRURfREJHUAkKKwlwcmludGsoImF0cDg3MHVfZXhpdDogRW50cnlcbiIpOworI2VuZGlmCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhdHA4NzB1X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHRzY2FtXzg4NSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgaTsKKworCWZvciAoaSA9IDA7IGkgPCAweDI7IGkrKykgeworCQltZGVsYXkoMzAwKTsKKwl9CisJcmV0dXJuOworfQorCisKKworc3RhdGljIHZvaWQgaXM4ODUoc3RydWN0IGF0cF91bml0ICpkZXYsIHVuc2lnbmVkIGludCB3a3BvcnQsdW5zaWduZWQgY2hhciBjKQoreworCXVuc2lnbmVkIGludCB0bXBvcnQ7CisJdW5zaWduZWQgY2hhciBpLCBqLCBrLCBybWIsIG4sIGx2ZG1vZGU7CisJdW5zaWduZWQgc2hvcnQgaW50IG07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbWJ1Zls1MTJdOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNhdG5bOV0gPQl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwgNn07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5xZFs5XSA9CXsweDEyLCAwLCAwLCAwLCAweDI0LCAwLCAwLCAweDI0LCA2fTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzeW5uWzZdID0JezB4ODAsIDEsIDMsIDEsIDB4MTksIDB4MGV9OworCXVuc2lnbmVkIGNoYXIgc3ludVs2XSA9ICB7MHg4MCwgMSwgMywgMSwgMHgwYSwgMHgwZX07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3lud1s2XSA9CXsweDgwLCAxLCAzLCAxLCAweDE5LCAweDBlfTsKKwl1bnNpZ25lZCBjaGFyIHN5bnV3WzZdID0gIHsweDgwLCAxLCAzLCAxLCAweDBhLCAweDBlfTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB3aWRlWzZdID0JezB4ODAsIDEsIDIsIDMsIDEsIDB9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHUzWzldID0geyAweDgwLDEsNiw0LDB4MDksMDAsMHgwZSwweDAxLDB4MDIgfTsKKworCWx2ZG1vZGU9aW5iKHdrcG9ydCArIDB4MWIpID4+IDc7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQltID0gMTsKKwkJbSA9IG0gPDwgaTsKKwkJaWYgKChtICYgZGV2LT5hY3RpdmVfaWRbY10pICE9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpID09IGRldi0+aG9zdF9pZFtjXSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgSUQ6ICUyZCAgSG9zdCBBZGFwdGVyXG4iLCBkZXYtPmhvc3RfaWRbY10pOworCQkJY29udGludWU7CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJb3V0YigweDAxLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDAxOworCQlvdXRiKDB4MDgsIHRtcG9ydCsrKTsKKwkJb3V0YigweDdmLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blswXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blszXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzVdLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDA2OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbY11baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJCisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCWogPSBpOworCQlpZiAoKGogJiAweDA4KSAhPSAwKSB7CisJCQlqID0gKGogJiAweDA3KSB8IDB4NDA7CisJCX0KKwkJb3V0YihqLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMzsKKwkJb3V0YihzYXRuWzhdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKChpbmIodG1wb3J0KSAhPSAweDExKSAmJiAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisJCWRldi0+YWN0aXZlX2lkW2NdIHw9IG07CisKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisKK3BoYXNlX2NtZDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxODsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJCW91dGIoMHg0MSwgdG1wb3J0KTsKKwkJCWdvdG8gcGhhc2VfY21kOworCQl9CitzZWxfb2s6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MDM7CisJCW91dGIoaW5xZFswXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoaW5xZFszXSwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzVdLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkW2NdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKGlucWRbNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihpbnFkWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKGlucWRbOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQl0bXBvcnQgLT0gMHgwODsKKwkJaWYgKChpbmIodG1wb3J0KSAhPSAweDExKSAmJiAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlIChpbmIodG1wb3J0KSAhPSAweDhlKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MWI7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxODsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJaiA9IDA7CityZF9pbnFfZGF0YToKKwkJayA9IGluYih0bXBvcnQpOworCQlpZiAoKGsgJiAweDAxKSAhPSAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaisrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHJkX2lucV9kYXRhOworCQl9CisJCWlmICgoayAmIDB4ODApID09IDApIHsKKwkJCWdvdG8gcmRfaW5xX2RhdGE7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHgxNikgeworCQkJZ290byBpbnFfb2s7CisJCX0KKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJb3V0YigweDQ2LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKDAsIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoaW5iKHRtcG9ydCkgIT0gMHgxNikgeworCQkJZ290byBzZWxfb2s7CisJCX0KK2lucV9vazoKKwkJbWJ1ZlszNl0gPSAwOworCQlwcmludGsoIEtFUk5fSU5GTyIgICAgICAgICBJRDogJTJkICAlc1xuIiwgaSwgJm1idWZbOF0pOworCQlkZXYtPmlkW2NdW2ldLmRldnR5cGUgPSBtYnVmWzBdOworCQlybWIgPSBtYnVmWzFdOworCQluID0gbWJ1Zls3XTsKKwkJaWYgKChtYnVmWzddICYgMHg2MCkgPT0gMCkgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAoKGkgPCA4KSAmJiAoKGRldi0+Z2xvYmFsX21hcFtjXSAmIDB4MjApID09IDApKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChsdmRtb2RlID09IDApIHsKKwkJICAgZ290byBjaGdfd2lkZTsKKwkJfQorCQlpZiAoZGV2LT5zcFtjXVtpXSAhPSAweDA0KSB7CS8vIGZvcmNlIHUyCisJCSAgIGdvdG8gY2hnX3dpZGU7CisJCX0KKworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlvdXRiKDB4MDEsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MDM7CisJCW91dGIoc2F0blswXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bMV0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzJdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blszXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzVdLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDA2OworCQlvdXRiKDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDAyOworCQlvdXRiKGRldi0+aWRbY11baV0uZGV2c3AsIHRtcG9ydCsrKTsKKwkJb3V0YigwLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls2XSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bN10sIHRtcG9ydCsrKTsKKwkJdG1wb3J0ICs9IDB4MDM7CisJCW91dGIoc2F0bls4XSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWlmICgoaW5iKHRtcG9ydCkgIT0gMHgxMSkgJiYgKGluYih0bXBvcnQpICE9IDB4OGUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoaW5iKHRtcG9ydCkgIT0gMHg4ZSkKKwkJCWNwdV9yZWxheCgpOwordHJ5X3UzOgorCQlqID0gMDsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDA5LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKHUzW2orK10sIHRtcG9ydCk7CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJaiA9IGluYih0bXBvcnQpICYgMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byB1M3BfaW47CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byB1M3BfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3UzOworCQl9CisJCWNvbnRpbnVlOwordTNwX291dDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxODsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0YigwLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQkJY3B1X3JlbGF4KCk7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gdTNwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gdTNwX2NtZDsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHUzcF9vdXQ7CisJCX0KKwkJY29udGludWU7Cit1M3BfaW46CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwOSwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWsgPSAwOwordTNwX2luMToKKwkJaiA9IGluYih0bXBvcnQpOworCQlpZiAoKGogJiAweDAxKSAhPSAwKSB7CisJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCW1idWZbaysrXSA9IGluYih0bXBvcnQpOworCQkJdG1wb3J0ICs9IDB4MDY7CisJCQlnb3RvIHUzcF9pbjE7CisJCX0KKwkJaWYgKChqICYgMHg4MCkgPT0gMHgwMCkgeworCQkJZ290byB1M3BfaW4xOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHUzcF9pbjsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHUzcF9jbWQ7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byB1M3Bfb3V0OworCQl9CisJCWNvbnRpbnVlOwordTNwX2NtZDoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxMDsKKwkJb3V0YigweDMwLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MDgsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCWlmIChqID09IDB4NGUpIHsKKwkJCQlnb3RvIHUzcF9vdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1ZlswXSAhPSAweDAxKSB7CisJCQlnb3RvIGNoZ193aWRlOworCQl9CisJCWlmIChtYnVmWzFdICE9IDB4MDYpIHsKKwkJCWdvdG8gY2hnX3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMl0gIT0gMHgwNCkgeworCQkJZ290byBjaGdfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlszXSA9PSAweDA5KSB7CisJCQltID0gMTsKKwkJCW0gPSBtIDw8IGk7CisJCQlkZXYtPndpZGVfaWRbY10gfD0gbTsKKwkJCWRldi0+aWRbY11baV0uZGV2c3AgPSAweGNlOworI2lmZGVmIEVEX0RCR1AJCSAgIAorCQkJcHJpbnRrKCJkZXYtPmlkWyUyZF1bJTJkXS5kZXZzcCA9ICUyeFxuIixjLGksZGV2LT5pZFtjXVtpXS5kZXZzcCk7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CitjaGdfd2lkZToKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxYjsKKwkJb3V0YigweDAxLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDAzOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkW2NdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoKGluYih0bXBvcnQpICE9IDB4MTEpICYmIChpbmIodG1wb3J0KSAhPSAweDhlKSkgeworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKK3RyeV93aWRlOgorCQlqID0gMDsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDA1LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlvdXRiKHdpZGVbaisrXSwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMHgwMCkKKwkJCWNwdV9yZWxheCgpOworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gdHJ5X3dpZGU7CisJCX0KKwkJY29udGludWU7Cit3aWRlcF9vdXQ6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTg7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAwKSB7CisJCQlpZiAoKGluYih0bXBvcnQpICYgMHgwMSkgIT0gMCkgeworCQkJCXRtcG9ydCAtPSAweDA2OworCQkJCW91dGIoMCwgdG1wb3J0KTsKKwkJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gd2lkZXBfb3V0OworCQl9CisJCWNvbnRpbnVlOword2lkZXBfaW46CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHhmZiwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgyMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCWsgPSAwOword2lkZXBfaW4xOgorCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmICgoaiAmIDB4MDEpICE9IDApIHsKKwkJCXRtcG9ydCAtPSAweDA2OworCQkJbWJ1ZltrKytdID0gaW5iKHRtcG9ydCk7CisJCQl0bXBvcnQgKz0gMHgwNjsKKwkJCWdvdG8gd2lkZXBfaW4xOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gd2lkZXBfaW4xOworCQl9CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCkgJiAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHdpZGVwX2luOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gd2lkZXBfY21kOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gd2lkZXBfb3V0OworCQl9CisJCWNvbnRpbnVlOword2lkZXBfY21kOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDEwOworCQlvdXRiKDB4MzAsIHRtcG9ydCk7CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTQ7CisJCW91dGIoMHgwMCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDQ7CisJCW91dGIoMHgwOCwgdG1wb3J0KTsKKwkJdG1wb3J0ICs9IDB4MDc7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqICE9IDB4MTYpIHsKKwkJCWlmIChqID09IDB4NGUpIHsKKwkJCQlnb3RvIHdpZGVwX291dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYnVmWzBdICE9IDB4MDEpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJaWYgKG1idWZbMV0gIT0gMHgwMikgeworCQkJZ290byBub3Rfd2lkZTsKKwkJfQorCQlpZiAobWJ1ZlsyXSAhPSAweDAzKSB7CisJCQlnb3RvIG5vdF93aWRlOworCQl9CisJCWlmIChtYnVmWzNdICE9IDB4MDEpIHsKKwkJCWdvdG8gbm90X3dpZGU7CisJCX0KKwkJbSA9IDE7CisJCW0gPSBtIDw8IGk7CisJCWRldi0+d2lkZV9pZFtjXSB8PSBtOworbm90X3dpZGU6CisJCWlmICgoZGV2LT5pZFtjXVtpXS5kZXZ0eXBlID09IDB4MDApIHx8IChkZXYtPmlkW2NdW2ldLmRldnR5cGUgPT0gMHgwNykgfHwKKwkJICAgICgoZGV2LT5pZFtjXVtpXS5kZXZ0eXBlID09IDB4MDUpICYmICgobiAmIDB4MTApICE9IDApKSkgeworCQkJbSA9IDE7CisJCQltID0gbSA8PCBpOworCQkJaWYgKChkZXYtPmFzeW5jW2NdICYgbSkgIT0gMCkgeworCQkJICAgZ290byBzZXRfc3luYzsKKwkJCX0KKwkJfQorCQljb250aW51ZTsKK3NldF9zeW5jOgorCQlpZiAoZGV2LT5zcFtjXVtpXSA9PSAweDAyKSB7CisJCSAgIHN5bnVbNF09MHgwYzsKKwkJICAgc3ludXdbNF09MHgwYzsKKwkJfSBlbHNlIHsKKwkJICAgaWYgKGRldi0+c3BbY11baV0gPj0gMHgwMykgeworCQkgICAgICBzeW51WzRdPTB4MGE7CisJCSAgICAgIHN5bnV3WzRdPTB4MGE7CisJCSAgIH0KKwkJfQorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDFiOworCQlqID0gMDsKKwkJaWYgKChtICYgZGV2LT53aWRlX2lkW2NdKSAhPSAwKSB7CisJCQlqIHw9IDB4MDE7CisJCX0KKwkJb3V0YihqLCB0bXBvcnQpOworCQl0bXBvcnQgPSB3a3BvcnQgKyAweDAzOworCQlvdXRiKHNhdG5bMF0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzFdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0blsyXSwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bM10sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzRdLCB0bXBvcnQrKyk7CisJCW91dGIoc2F0bls1XSwgdG1wb3J0KyspOworCQl0bXBvcnQgKz0gMHgwNjsKKwkJb3V0YigwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwMjsKKwkJb3V0YihkZXYtPmlkW2NdW2ldLmRldnNwLCB0bXBvcnQrKyk7CisJCW91dGIoMCwgdG1wb3J0KyspOworCQlvdXRiKHNhdG5bNl0sIHRtcG9ydCsrKTsKKwkJb3V0YihzYXRuWzddLCB0bXBvcnQrKyk7CisJCXRtcG9ydCArPSAweDAzOworCQlvdXRiKHNhdG5bOF0sIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCXRtcG9ydCAtPSAweDA4OworCQlpZiAoKGluYih0bXBvcnQpICE9IDB4MTEpICYmIChpbmIodG1wb3J0KSAhPSAweDhlKSkgeworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGluYih0bXBvcnQpICE9IDB4OGUpCisJCQljcHVfcmVsYXgoKTsKK3RyeV9zeW5jOgorCQlqID0gMDsKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDA2LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKworCQl3aGlsZSAoKGluYih0bXBvcnQpICYgMHg4MCkgPT0gMCkgeworCQkJaWYgKChpbmIodG1wb3J0KSAmIDB4MDEpICE9IDApIHsKKwkJCQl0bXBvcnQgLT0gMHgwNjsKKwkJCQlpZiAoKG0gJiBkZXYtPndpZGVfaWRbY10pICE9IDApIHsKKwkJCQkJaWYgKChtICYgZGV2LT51bHRyYV9tYXBbY10pICE9IDApIHsKKwkJCQkJCW91dGIoc3ludXdbaisrXSwgdG1wb3J0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW91dGIoc3lud1tqKytdLCB0bXBvcnQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChtICYgZGV2LT51bHRyYV9tYXBbY10pICE9IDApIHsKKwkJCQkJCW91dGIoc3ludVtqKytdLCB0bXBvcnQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJb3V0YihzeW5uW2orK10sIHRtcG9ydCk7CisJCQkJCX0KKwkJCQl9CisJCQkJdG1wb3J0ICs9IDB4MDY7CisJCQl9CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCXdoaWxlICgoaW5iKHRtcG9ydCkgJiAweDgwKSA9PSAweDAwKQorCQkJY3B1X3JlbGF4KCk7CisJCWogPSBpbmIodG1wb3J0KSAmIDB4MGY7CisJCWlmIChqID09IDB4MGYpIHsKKwkJCWdvdG8gcGhhc2VfaW5zOworCQl9CisJCWlmIChqID09IDB4MGEpIHsKKwkJCWdvdG8gcGhhc2VfY21kczsKKwkJfQorCQlpZiAoaiA9PSAweDBlKSB7CisJCQlnb3RvIHRyeV9zeW5jOworCQl9CisJCWNvbnRpbnVlOworcGhhc2Vfb3V0czoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxODsKKwkJb3V0YigweDIwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApIHsKKwkJCWlmICgoaW5iKHRtcG9ydCkgJiAweDAxKSAhPSAweDAwKSB7CisJCQkJdG1wb3J0IC09IDB4MDY7CisJCQkJb3V0YigweDAwLCB0bXBvcnQpOworCQkJCXRtcG9ydCArPSAweDA2OworCQkJfQorCQkJY3B1X3JlbGF4KCk7CisJCX0KKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogPT0gMHg4NSkgeworCQkJZ290byB0YXJfZGNvbnM7CisJCX0KKwkJaiAmPSAweDBmOworCQlpZiAoaiA9PSAweDBmKSB7CisJCQlnb3RvIHBoYXNlX2luczsKKwkJfQorCQlpZiAoaiA9PSAweDBhKSB7CisJCQlnb3RvIHBoYXNlX2NtZHM7CisJCX0KKwkJaWYgKGogPT0gMHgwZSkgeworCQkJZ290byBwaGFzZV9vdXRzOworCQl9CisJCWNvbnRpbnVlOworcGhhc2VfaW5zOgorCQl0bXBvcnQgPSB3a3BvcnQgKyAweDE0OworCQlvdXRiKDB4MDYsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA0OworCQlvdXRiKDB4MjAsIHRtcG9ydCk7CisJCXRtcG9ydCArPSAweDA3OworCQlrID0gMDsKK3BoYXNlX2luczE6CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKChqICYgMHgwMSkgIT0gMHgwMCkgeworCQkJdG1wb3J0IC09IDB4MDY7CisJCQltYnVmW2srK10gPSBpbmIodG1wb3J0KTsKKwkJCXRtcG9ydCArPSAweDA2OworCQkJZ290byBwaGFzZV9pbnMxOworCQl9CisJCWlmICgoaiAmIDB4ODApID09IDB4MDApIHsKKwkJCWdvdG8gcGhhc2VfaW5zMTsKKwkJfQorCQl0bXBvcnQgLT0gMHgwODsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApOworCQlqID0gaW5iKHRtcG9ydCk7CisJCWlmIChqID09IDB4ODUpIHsKKwkJCWdvdG8gdGFyX2Rjb25zOworCQl9CisJCWogJj0gMHgwZjsKKwkJaWYgKGogPT0gMHgwZikgeworCQkJZ290byBwaGFzZV9pbnM7CisJCX0KKwkJaWYgKGogPT0gMHgwYSkgeworCQkJZ290byBwaGFzZV9jbWRzOworCQl9CisJCWlmIChqID09IDB4MGUpIHsKKwkJCWdvdG8gcGhhc2Vfb3V0czsKKwkJfQorCQljb250aW51ZTsKK3BoYXNlX2NtZHM6CisJCXRtcG9ydCA9IHdrcG9ydCArIDB4MTA7CisJCW91dGIoMHgzMCwgdG1wb3J0KTsKK3Rhcl9kY29uczoKKwkJdG1wb3J0ID0gd2twb3J0ICsgMHgxNDsKKwkJb3V0YigweDAwLCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNDsKKwkJb3V0YigweDA4LCB0bXBvcnQpOworCQl0bXBvcnQgKz0gMHgwNzsKKwkJd2hpbGUgKChpbmIodG1wb3J0KSAmIDB4ODApID09IDB4MDApCisJCQljcHVfcmVsYXgoKTsKKwkJdG1wb3J0IC09IDB4MDg7CisJCWogPSBpbmIodG1wb3J0KTsKKwkJaWYgKGogIT0gMHgxNikgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMF0gIT0gMHgwMSkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbMV0gIT0gMHgwMykgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbNF0gPT0gMHgwMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1idWZbM10gPiAweDY0KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWJ1Zls0XSA+IDB4MGUpIHsKKwkJCW1idWZbNF0gPSAweDBlOworCQl9CisJCWRldi0+aWRbY11baV0uZGV2c3AgPSBtYnVmWzRdOworCQlpZiAobWJ1ZlszXSA8IDB4MGMpeworCQkJaiA9IDB4YjA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKChtYnVmWzNdIDwgMHgwZCkgJiYgKHJtYiA9PSAwKSkgeworCQkJaiA9IDB4YTA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaWYgKG1idWZbM10gPCAweDFhKSB7CisJCQlqID0gMHgyMDsKKwkJCWdvdG8gc2V0X3N5bl9vazsKKwkJfQorCQlpZiAobWJ1ZlszXSA8IDB4MzMpIHsKKwkJCWogPSAweDQwOworCQkJZ290byBzZXRfc3luX29rOworCQl9CisJCWlmIChtYnVmWzNdIDwgMHg0YykgeworCQkJaiA9IDB4NTA7CisJCQlnb3RvIHNldF9zeW5fb2s7CisJCX0KKwkJaiA9IDB4NjA7CisJICAgICAgc2V0X3N5bl9vazoKKwkJZGV2LT5pZFtjXVtpXS5kZXZzcCA9IChkZXYtPmlkW2NdW2ldLmRldnNwICYgMHgwZikgfCBqOworI2lmZGVmIEVEX0RCR1AJCQorCQlwcmludGsoImRldi0+aWRbJTJkXVslMmRdLmRldnNwID0gJTJ4XG4iLGMsaSxkZXYtPmlkW2NdW2ldLmRldnNwKTsKKyNlbmRpZgorCX0KKwl0bXBvcnQgPSB3a3BvcnQgKyAweDE2OworCW91dGIoMHg4MCwgdG1wb3J0KTsKK30KKworbW9kdWxlX2luaXQoYXRwODcwdV9pbml0KTsKK21vZHVsZV9leGl0KGF0cDg3MHVfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdHA4NzB1LmggYi9kcml2ZXJzL3Njc2kvYXRwODcwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjQzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYXRwODcwdS5oCkBAIC0wLDAgKzEsNjYgQEAKKyNpZm5kZWYgX0FUUDg3MFVfSAorI2RlZmluZSBfQVRQODcwVV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorCisvKiBJL08gUG9ydCAqLworCisjZGVmaW5lIE1BWF9DREIgCTEyCisjZGVmaW5lIE1BWF9TRU5TRSAJMTQKKyNkZWZpbmUgcWNudAkgICAgICAgCTMyCisjZGVmaW5lIEFUUDg3MFVfU0NBVFRFUiAJMTI4CisjZGVmaW5lIEFUUDg3MFVfQ01ETFVOICAJMQorCisjZGVmaW5lIE1BWF9BREFQVEVSCTgKKyNkZWZpbmUgTUFYX1NDU0lfSUQJMTYKKyNkZWZpbmUgQVRQODcwVV9NQVhfU0VDVE9SUyAxMjgKKworI2RlZmluZSBBVFA4ODVfREVWSUQgMHg4MDhBCisjZGVmaW5lIEFUUDg4MF9ERVZJRDEgMHg4MDgwCisjZGVmaW5lIEFUUDg4MF9ERVZJRDIgMHg4MDgxCisKKy8vI2RlZmluZSBFRF9EQkdQCisKK3N0cnVjdCBhdHBfdW5pdAoreworCXVuc2lnbmVkIGxvbmcgYmFzZXBvcnQ7CisJdW5zaWduZWQgbG9uZyBpb3BvcnRbMl07CisJdW5zaWduZWQgbG9uZyBwY2lwb3J0WzJdOworCXVuc2lnbmVkIGxvbmcgaXJxOworCXVuc2lnbmVkIGNoYXIgbGFzdF9jbWRbMl07CisJdW5zaWduZWQgY2hhciBpbl9zbmRbMl07CisJdW5zaWduZWQgY2hhciBpbl9pbnRbMl07CisJdW5zaWduZWQgY2hhciBxdWhkWzJdOworCXVuc2lnbmVkIGNoYXIgcXVlbmRbMl07CisJdW5zaWduZWQgY2hhciBnbG9iYWxfbWFwWzJdOworCXVuc2lnbmVkIGNoYXIgY2hpcF92ZXI7CisJdW5zaWduZWQgY2hhciBzY2FtX29uOworCXVuc2lnbmVkIGNoYXIgaG9zdF9pZFsyXTsKKwl1bnNpZ25lZCBpbnQgd29ya2luZ1syXTsKKwl1bnNpZ25lZCBzaG9ydCB3aWRlX2lkWzJdOworCXVuc2lnbmVkIHNob3J0IGFjdGl2ZV9pZFsyXTsKKwl1bnNpZ25lZCBzaG9ydCB1bHRyYV9tYXBbMl07CisJdW5zaWduZWQgc2hvcnQgYXN5bmNbMl07CisJdW5zaWduZWQgc2hvcnQgZGV2X2lkOworCXVuc2lnbmVkIGNoYXIgc3BbMl1bMTZdOworCXVuc2lnbmVkIGNoYXIgcjFmWzJdWzE2XTsJCQorCXN0cnVjdCBzY3NpX2NtbmQgKnF1ZXJlcVsyXVtxY250XTsKKwlzdHJ1Y3QgYXRwX2lkCisJeworCQl1bnNpZ25lZCBjaGFyIGRpcmN0OworCQl1bnNpZ25lZCBjaGFyIGRldnNwOworCQl1bnNpZ25lZCBjaGFyIGRldnR5cGU7CisJCXVuc2lnbmVkIGxvbmcgdHJhbl9sZW47CisJCXVuc2lnbmVkIGxvbmcgbGFzdF9sZW47CisJCXVuc2lnbmVkIGNoYXIgKnByZF9wb3M7CisJCXVuc2lnbmVkIGNoYXIgKnByZF90YWJsZTsKKwkJZG1hX2FkZHJfdCBwcmRhZGRyOworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJyX3JlcTsKKwl9IGlkWzJdWzE2XTsKKyAgICAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKyAgICAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdW5zaWduZWQgaW50IHVuaXQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibHoxMjMwLmMgYi9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZDlmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYmx6MTIzMC5jCkBAIC0wLDAgKzEsMzUyIEBACisvKiBibHoxMjMwLmM6IERyaXZlciBmb3IgQmxpenphcmQgMTIzMCBTQ1NJIElWIENvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIEN5YmVyU3Rvcm0gZHJpdmVyLCBoZW5jZSB0aGUgb2NjYXNpb25hbAorICogcmVmZXJlbmNlIHRvIEN5YmVyU3Rvcm0uCisgKi8KKworLyogVE9ETzoKKyAqCisgKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKKyAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KKyAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKKyAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2RlZmluZSBNS0lWIDEKKworLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKKyAqIG9mZnNldHM6CisgKi8KKyNkZWZpbmUgQkxaMTIzMF9FU1BfQUREUiAweDgwMDAKKyNkZWZpbmUgQkxaMTIzMF9ETUFfQUREUiAweDEwMDAwCisjZGVmaW5lIEJMWjEyMzBJSV9FU1BfQUREUiAweDEwMDAwCisjZGVmaW5lIEJMWjEyMzBJSV9ETUFfQUREUiAweDEwMDIxCisKKworLyogVGhlIEJsaXp6YXJkIDEyMzAgRE1BIGludGVyZmFjZQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICogT25seSB0d28gdGhpbmdzIGNhbiBiZSBwcm9ncmFtbWVkIGluIHRoZSBCbGl6emFyZCBETUE6CisgKiAgMSkgVGhlIGRhdGEgZGlyZWN0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHN0YXR1cyBvZiBiaXQgMzEgKDEgPSB3cml0ZSkKKyAqICAyKSBUaGUgc291cmNlL2Rlc3QgYWRkcmVzcyAod29yZCBhbGlnbmVkLCBzaGlmdGVkIG9uZSByaWdodCkgaW4gYml0cyAzMC0wCisgKgorICogUHJvZ3JhbSBETUEgYnkgZmlyc3QgbGF0Y2hpbmcgdGhlIGhpZ2hlc3QgYnl0ZSBvZiB0aGUgYWRkcmVzcy9kaXJlY3Rpb24KKyAqIChpLmUuIGJpdHMgMzEtMjQgb2YgdGhlIGxvbmcgd29yZCBjb25zdHJ1Y3RlZCBhcyBkZXNjcmliZWQgaW4gc3RlcHMgMSsyCisgKiBhYm92ZSkuIFRoZW4gd3JpdGUgZWFjaCBieXRlIG9mIHRoZSBhZGRyZXNzL2RpcmVjdGlvbiAoc3RhcnRpbmcgd2l0aCB0aGUKKyAqIHRvcCBieXRlLCB3b3JraW5nIGRvd24pIHRvIHRoZSBETUEgYWRkcmVzcyByZWdpc3Rlci4KKyAqCisgKiBGaWd1cmUgb3V0IGludGVycnVwdCBzdGF0dXMgYnkgcmVhZGluZyB0aGUgRVNQIHN0YXR1cyBieXRlLgorICovCitzdHJ1Y3QgYmx6MTIzMF9kbWFfcmVnaXN0ZXJzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyOyAJLyogRE1BIGFkZHJlc3MgICAgICBbMHgwMDAwXSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkMlsweDdmZmZdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2xhdGNoOyAJLyogRE1BIGxhdGNoICAgICAgICBbMHg4MDAwXSAqLworfTsKKworc3RydWN0IGJsejEyMzBJSV9kbWFfcmVnaXN0ZXJzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyOyAJLyogRE1BIGFkZHJlc3MgICAgICBbMHgwMDAwXSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkMlsweGZdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2xhdGNoOyAJLyogRE1BIGxhdGNoICAgICAgICBbMHgwMDEwXSAqLworfTsKKworI2RlZmluZSBCTFoxMjMwX0RNQV9XUklURSAweDgwMDAwMDAwCisKK3N0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAorCQkJCSAqIHZpYSBQSU8uCisJCQkJICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK2ludCBfX2luaXQgYmx6MTIzMF9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzOworCXVuc2lnbmVkIGxvbmcgYm9hcmQ7CisKKyNpZiBNS0lWCisjZGVmaW5lIFJFQUxfQkxaMTIzMF9JRAkJWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfMTIzMF9JVl8xMjYwCisjZGVmaW5lIFJFQUxfQkxaMTIzMF9FU1BfQUREUglCTFoxMjMwX0VTUF9BRERSCisjZGVmaW5lIFJFQUxfQkxaMTIzMF9ETUFfQUREUglCTFoxMjMwX0RNQV9BRERSCisjZWxzZQorI2RlZmluZSBSRUFMX0JMWjEyMzBfSUQJCVpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzEyMzBfSUlfRkFTVExBTkVfWjNfQ1lCRVJTQ1NJX0NZQkVSU1RPUk0wNjAKKyNkZWZpbmUgUkVBTF9CTFoxMjMwX0VTUF9BRERSCUJMWjEyMzBJSV9FU1BfQUREUgorI2RlZmluZSBSRUFMX0JMWjEyMzBfRE1BX0FERFIJQkxaMTIzMElJX0RNQV9BRERSCisjZW5kaWYKKworCWlmICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFJFQUxfQkxaMTIzMF9JRCwgeikpKSB7CisJICAgIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJICAgIGlmIChyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrUkVBTF9CTFoxMjMwX0VTUF9BRERSLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgeworCQkvKiBEbyBzb21lIG1hZ2ljIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGJsaXp6YXJkIGlzCisJCSAqIGVxdWlwcGVkIHdpdGggYSBTQ1NJIGNvbnRyb2xsZXIKKwkJICovCisJCWFkZHJlc3MgPSBaVFdPX1ZBRERSKGJvYXJkKTsKKwkJZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKGFkZHJlc3MgKyBSRUFMX0JMWjEyMzBfRVNQX0FERFIpOworCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCtSRUFMX0JMWjEyMzBfRVNQX0FERFIpOworCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpOworCQl1ZGVsYXkoNSk7CisJCWlmKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMSkgIT0gKEVTUF9DT05GSUcxX1BFTkFCTEUgfCA3KSkKKwkJCWdvdG8gZXJyX291dDsKKworCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KKwkJZXNwLT5kb19waW9fY21kcyA9IDE7CisKKwkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKKwkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKworCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYmFycmllciA9IDA7CisJCWVzcC0+ZG1hX2RyYWluID0gMDsKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7CisJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKKwkJZXNwLT5kbWFfbGVkX29uID0gMDsKKwkJZXNwLT5kbWFfbGVkX29mZiA9IDA7CisJCWVzcC0+ZG1hX3BvbGwgPSAwOworCQllc3AtPmRtYV9yZXNldCA9IDA7CisKKwkJLyogU0NTSSBjaGlwIHNwZWVkICovCisJCWVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsKKworCQkvKiBUaGUgRE1BIHJlZ2lzdGVycyBvbiB0aGUgQmxpenphcmQgYXJlIG1hcHBlZAorCQkgKiByZWxhdGl2ZSB0byB0aGUgZGV2aWNlIChpLmUuIGluIHRoZSBzYW1lIFpvcnJvCisJCSAqIEkvTyBibG9jaykuCisJCSAqLworCQllc3AtPmRyZWdzID0gKHZvaWQgKikoYWRkcmVzcyArIFJFQUxfQkxaMTIzMF9ETUFfQUREUik7CisJCisJCS8qIEVTUCByZWdpc3RlciBiYXNlICovCisJCWVzcC0+ZXJlZ3MgPSBlcmVnczsKKworCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCWVzcC0+ZXNwX2NvbW1hbmQgPSBjbWRfYnVmZmVyOworCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSB2aXJ0X3RvX2J1cygodm9pZCAqKWNtZF9idWZmZXIpOworCisJCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCQllc3AtPnNsb3QgPSBib2FyZCtSRUFMX0JMWjEyMzBfRVNQX0FERFI7CisJCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBTQV9TSElSUSwKKwkJCQkgIkJsaXp6YXJkIDEyMzAgU0NTSSBJViIsIGVzcC0+ZWhvc3QpKQorCQkJZ290byBlcnJfb3V0OworCisJCS8qIEZpZ3VyZSBvdXQgb3VyIHNjc2kgSUQgb24gdGhlIGJ1cyAqLworCQllc3AtPnNjc2lfaWQgPSA3OworCQkKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cy4gKi8KKwkJZXNwLT5kaWZmID0gMDsKKworCQllc3BfaW5pdGlhbGl6ZShlc3ApOworCisJCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLCBlc3BzX2luX3VzZSk7CisJCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOworCQlyZXR1cm4gZXNwc19pbl91c2U7CisJICAgIH0KKwl9CisJcmV0dXJuIDA7CisgCisgZXJyX291dDoKKwlzY3NpX3VucmVnaXN0ZXIoZXNwLT5laG9zdCk7CisJZXNwX2RlYWxsb2NhdGUoZXNwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oYm9hcmQrUkVBTF9CTFoxMjMwX0VTUF9BRERSLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworCS8qIFNpbmNlIHRoZSBCbGl6emFyZCBETUEgaXMgZnVsbHkgZGVkaWNhdGVkIHRvIHRoZSBFU1AgY2hpcCwKKwkgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgKHRvIHRoZSBFU1AgY2hpcCkgZXF1YWxzIHRoZSBudW1iZXIKKwkgKiBvZiBieXRlcyBpbiB0aGUgRklGTyAtIHRoZXJlIGlzIG5vIGJ1ZmZlcmluZyBpbiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogWFhYWCBEbyBJIHJlYWQgdGhpcyByaWdodD8gSXQgaXMgZnJvbSBob3N0IHRvIEVTUCwgcmlnaHQ/CisJICovCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCS8qIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyBhbnkgbGltaXQgb24gdGhlIEJsaXp6YXJkIERNQS4gU28gd2UgdXNlIHdoYXQKKwkgKiB0aGUgRVNQIGNoaXAgY2FuIGhhbmRsZSAoMjQgYml0KS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworCWlmKHN6ID4gMHgxMDAwMDAwKQorCQlzeiA9IDB4MTAwMDAwMDsKKwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKKwkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7Cit9CisKK3ZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworI2lmIE1LSVYKKwlzdHJ1Y3QgYmx6MTIzMF9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGJsejEyMzBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisjZWxzZQorCXN0cnVjdCBibHoxMjMwSUlfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBibHoxMjMwSUlfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisjZW5kaWYKKworCWNhY2hlX2NsZWFyKGFkZHIsIGxlbmd0aCk7CisKKwlhZGRyID4+PSAxOworCWFkZHIgJj0gfihCTFoxMjMwX0RNQV9XUklURSk7CisKKwkvKiBGaXJzdCBzZXQgbGF0Y2ggKi8KKwlkcmVncy0+ZG1hX2xhdGNoID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKKworCS8qIFRoZW4gcHVtcCB0aGUgYWRkcmVzcyB0byB0aGUgRE1BIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNpZiBNS0lWCisJZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKKyNlbmRpZgorCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyID4+IDE2KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciAgICAgICkgJiAweGZmOworfQorCit2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisjaWYgTUtJVgorCXN0cnVjdCBibHoxMjMwX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgYmx6MTIzMF9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKKyNlbHNlCisJc3RydWN0IGJsejEyMzBJSV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGJsejEyMzBJSV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKKyNlbmRpZgorCisJY2FjaGVfcHVzaChhZGRyLCBsZW5ndGgpOworCisJYWRkciA+Pj0gMTsKKwlhZGRyIHw9IEJMWjEyMzBfRE1BX1dSSVRFOworCisJLyogRmlyc3Qgc2V0IGxhdGNoICovCisJZHJlZ3MtPmRtYV9sYXRjaCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisKKwkvKiBUaGVuIHB1bXAgdGhlIGFkZHJlc3MgdG8gdGhlIERNQSBhZGRyZXNzIHJlZ2lzdGVyICovCisjaWYgTUtJVgorCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisjZW5kaWYKKwlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciA+PiAxNikgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyID4+ICA4KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgICAgICApICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZGlzYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWVuYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKTsKK30KKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCS8qIE9uIHRoZSBTcGFyYywgRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgorCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQorCSAqLworCWlmKHdyaXRlKXsKKwkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKwl9IGVsc2UgeworCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKKwl9Cit9CisKKyNkZWZpbmUgSE9TVFNfQworCitpbnQgYmx6MTIzMF9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyNpZmRlZiBNT0RVTEUKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+ZWRldjsKKwllc3BfZGVhbGxvY2F0ZSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpOworCWVzcF9yZWxlYXNlKCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcC1ibHoxMjMwIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJCbGl6emFyZDEyMzAgU0NTSSBJViIsCisJLmRldGVjdAkJCT0gYmx6MTIzMF9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gYmx6MTIzMF9lc3BfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jIGIvZHJpdmVycy9zY3NpL2JsejIwNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTIyMWQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2JsejIwNjAuYwpAQCAtMCwwICsxLDMwNiBAQAorLyogYmx6MjA2MC5jOiBEcml2ZXIgZm9yIEJsaXp6YXJkIDIwNjAgU0NTSSBDb250cm9sbGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBDeWJlclN0b3JtIGRyaXZlciwgaGVuY2UgdGhlIG9jY2FzaW9uYWwKKyAqIHJlZmVyZW5jZSB0byBDeWJlclN0b3JtLgorICovCisKKy8qIFRPRE86CisgKgorICogMSkgRmlndXJlIG91dCBob3cgdG8gbWFrZSBhIGNsZWFuZXIgbWVyZ2Ugd2l0aCB0aGUgc3BhcmMgZHJpdmVyIHdpdGggcmVnYXJkCisgKiAgICB0byB0aGUgY2FjaGVzIGFuZCB0aGUgU3BhcmMgTU1VIG1hcHBpbmcuCisgKiAyKSBNYWtlIGFzIGZldyByb3V0aW5lcyByZXF1aXJlZCBvdXRzaWRlIHRoZSBnZW5lcmljIGRyaXZlci4gQSBsb3Qgb2YgdGhlCisgKiAgICByb3V0aW5lcyBpbiB0aGlzIGZpbGUgdXNlZCB0byBiZSBpbmxpbmUhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKy8qIFRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyBjYW4gYmUgZm91bmQgaW4gdGhlIFoyIGNvbmZpZyBhcmVhIGF0IHRoZXNlCisgKiBvZmZzZXRzOgorICovCisjZGVmaW5lIEJMWjIwNjBfRVNQX0FERFIgMHgxZmYwMAorI2RlZmluZSBCTFoyMDYwX0RNQV9BRERSIDB4MWZmZTAKKworCisvKiBUaGUgQmxpenphcmQgMjA2MCBETUEgaW50ZXJmYWNlCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKiBPbmx5IHR3byB0aGluZ3MgY2FuIGJlIHByb2dyYW1tZWQgaW4gdGhlIEJsaXp6YXJkIERNQToKKyAqICAxKSBUaGUgZGF0YSBkaXJlY3Rpb24gaXMgY29udHJvbGxlZCBieSB0aGUgc3RhdHVzIG9mIGJpdCAzMSAoMSA9IHdyaXRlKQorICogIDIpIFRoZSBzb3VyY2UvZGVzdCBhZGRyZXNzICh3b3JkIGFsaWduZWQsIHNoaWZ0ZWQgb25lIHJpZ2h0KSBpbiBiaXRzIDMwLTAKKyAqCisgKiBGaWd1cmUgb3V0IGludGVycnVwdCBzdGF0dXMgYnkgcmVhZGluZyB0aGUgRVNQIHN0YXR1cyBieXRlLgorICovCitzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9sZWRfY3RybDsJLyogRE1BIGxlZCBjb250cm9sICAgWzB4MDAwXSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkMVsweDBmXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMDsgCS8qIERNQSBhZGRyZXNzIChNU0IpIFsweDAxMF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDJbMHgwM107CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjE7IAkvKiBETUEgYWRkcmVzcyAgICAgICBbMHgwMTRdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQzWzB4MDNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIyOyAJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDE4XSAqLworCXVuc2lnbmVkIGNoYXIgZG1hcGFkNFsweDAzXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMzsgCS8qIERNQSBhZGRyZXNzIChMU0IpIFsweDAxY10gKi8KK307CisKKyNkZWZpbmUgQkxaMjA2MF9ETUFfV1JJVEUgMHg4MDAwMDAwMAorCisvKiBETUEgY29udHJvbCBiaXRzICovCisjZGVmaW5lIEJMWjIwNjBfRE1BX0xFRCAgICAweDAyCQkvKiBIRCBsZWQgY29udHJvbCAxID0gb2ZmICovCisKK3N0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAorCQkJCSAqIHZpYSBQSU8uCisJCQkJICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK2ludCBfX2luaXQgYmx6MjA2MF9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKworCWlmICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzIwNjAsIHopKSkgeworCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJICAgIGlmIChyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrQkxaMjA2MF9FU1BfQUREUiwKKwkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKKwkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrQkxaMjA2MF9FU1BfQUREUik7CisKKwkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOworCQllc3AtPmRtYV9kcmFpbiA9IDA7CisJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCQllc3AtPmRtYV9pcnFfZXhpdCA9IDA7CisJCWVzcC0+ZG1hX2xlZF9vbiA9ICZkbWFfbGVkX29uOworCQllc3AtPmRtYV9sZWRfb2ZmID0gJmRtYV9sZWRfb2ZmOworCQllc3AtPmRtYV9wb2xsID0gMDsKKwkJZXNwLT5kbWFfcmVzZXQgPSAwOworCisJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCQllc3AtPmNmcmVxID0gNDAwMDAwMDA7CisKKwkJLyogVGhlIERNQSByZWdpc3RlcnMgb24gdGhlIEJsaXp6YXJkIGFyZSBtYXBwZWQKKwkJICogcmVsYXRpdmUgdG8gdGhlIGRldmljZSAoaS5lLiBpbiB0aGUgc2FtZSBab3JybworCQkgKiBJL08gYmxvY2spLgorCQkgKi8KKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKVpUV09fVkFERFIoYm9hcmQpOworCQllc3AtPmRyZWdzID0gKHZvaWQgKikoYWRkcmVzcyArIEJMWjIwNjBfRE1BX0FERFIpOworCisJCS8qIEVTUCByZWdpc3RlciBiYXNlICovCisJCWVzcC0+ZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKGFkZHJlc3MgKyBCTFoyMDYwX0VTUF9BRERSKTsKKwkJCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7CisJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7CisKKwkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisJCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIFNBX1NISVJRLAorCQkJICAgICJCbGl6emFyZCAyMDYwIFNDU0kiLCBlc3AtPmVob3N0KTsKKworCQkvKiBGaWd1cmUgb3V0IG91ciBzY3NpIElEIG9uIHRoZSBidXMgKi8KKwkJZXNwLT5zY3NpX2lkID0gNzsKKwkJCisJCS8qIFdlIGRvbid0IGhhdmUgYSBkaWZmZXJlbnRpYWwgU0NTSS1idXMuICovCisJCWVzcC0+ZGlmZiA9IDA7CisKKwkJZXNwX2luaXRpYWxpemUoZXNwKTsKKworCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwkJcmV0dXJuIGVzcHNfaW5fdXNlOworCSAgICB9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworCS8qIFNpbmNlIHRoZSBCbGl6emFyZCBETUEgaXMgZnVsbHkgZGVkaWNhdGVkIHRvIHRoZSBFU1AgY2hpcCwKKwkgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgKHRvIHRoZSBFU1AgY2hpcCkgZXF1YWxzIHRoZSBudW1iZXIKKwkgKiBvZiBieXRlcyBpbiB0aGUgRklGTyAtIHRoZXJlIGlzIG5vIGJ1ZmZlcmluZyBpbiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogWFhYWCBEbyBJIHJlYWQgdGhpcyByaWdodD8gSXQgaXMgZnJvbSBob3N0IHRvIEVTUCwgcmlnaHQ/CisJICovCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCS8qIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyBhbnkgbGltaXQgb24gdGhlIEJsaXp6YXJkIERNQS4gU28gd2UgdXNlIHdoYXQKKwkgKiB0aGUgRVNQIGNoaXAgY2FuIGhhbmRsZSAoMjQgYml0KS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworCWlmKHN6ID4gMHgxMDAwMDAwKQorCQlzeiA9IDB4MTAwMDAwMDsKKwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKKwkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisKKwljYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOworCisJYWRkciA+Pj0gMTsKKwlhZGRyICY9IH4oQkxaMjA2MF9ETUFfV1JJVEUpOworCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBibHoyMDYwX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKKworCWNhY2hlX3B1c2goYWRkciwgbGVuZ3RoKTsKKworCWFkZHIgPj49IDE7CisJYWRkciB8PSBCTFoyMDYwX0RNQV9XUklURTsKKwlkcmVncy0+ZG1hX2FkZHIzID0gKGFkZHIgICAgICApICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIxID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIwID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZGlzYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWVuYWJsZV9pcnEoZXNwLT5pcnEpOworfQorCitzdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkoKHN0cnVjdCBibHoyMDYwX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpKS0+ZG1hX2xlZF9jdHJsID0KKwkJQkxaMjA2MF9ETUFfTEVEOworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJKChzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKSktPmRtYV9sZWRfY3RybCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwkvKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKwkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKwkgKi8KKwlpZih3cml0ZSl7CisJCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7CisJfQorfQorCisjZGVmaW5lIEhPU1RTX0MKKworaW50IGJsejIwNjBfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmVkZXY7CisKKwllc3BfZGVhbGxvY2F0ZSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpOworCWVzcF9yZWxlYXNlKCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcC1ibHoyMDYwIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJCbGl6emFyZDIwNjAgU0NTSSIsCisJLmRldGVjdAkJCT0gYmx6MjA2MF9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gYmx6MjA2MF9lc3BfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYnZtZTYwMDAuYyBiL2RyaXZlcnMvc2NzaS9idm1lNjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YzdlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYnZtZTYwMDAuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogRGV0ZWN0aW9uIHJvdXRpbmUgZm9yIHRoZSBOQ1I1M2M3MTAgYmFzZWQgQlZNRTYwMDAgU0NTSSBDb250cm9sbGVycyBmb3IgTGludXguCisgKgorICogQmFzZWQgb24gd29yayBieSBBbGFuIEhvdXJpaGFuZQorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2J2bWU2MDAwaHcuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICI1M2M3eHguaCIKKyNpbmNsdWRlICJidm1lNjAwMC5oIgorCisjaW5jbHVkZTxsaW51eC9zdGF0Lmg+CisKKworaW50IGJ2bWU2MDAwX3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBjYWxsZWQgPSAwOworICAgIGludCBjbG9jazsKKyAgICBsb25nIGxvbmcgb3B0aW9uczsKKworICAgIGlmIChjYWxsZWQpCisJcmV0dXJuIDA7CisgICAgaWYgKCFNQUNIX0lTX0JWTUU2MDAwKQorCXJldHVybiAwOworCisgICAgdHBudC0+cHJvY19uYW1lID0gIkJWTUU2MDAwIjsKKworICAgIG9wdGlvbnMgPSBPUFRJT05fTUVNT1JZX01BUFBFRHxPUFRJT05fREVCVUdfVEVTVDF8T1BUSU9OX0lOVEZMWXxPUFRJT05fU1lOQ0hST05PVVN8T1BUSU9OX0FMV0FZU19TWU5DSFJPTk9VU3xPUFRJT05fRElTQ09OTkVDVDsKKworICAgIGNsb2NrID0gNDAwMDAwMDA7CS8qIDY2TUh6IFNDU0kgQ2xvY2sgKi8KKworICAgIG5jcjUzYzd4eF9pbml0KHRwbnQsIDAsIDcxMCwgKHVuc2lnbmVkIGxvbmcpQlZNRV9OQ1I1M0M3MTBfQkFTRSwKKwkJCTAsIEJWTUVfSVJRX1NDU0ksIERNQV9OT05FLAorCQkJb3B0aW9ucywgY2xvY2spOworICAgIGNhbGxlZCA9IDE7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYnZtZTYwMDBfc2NzaV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCT0gIkJWTUU2MDAwIE5DUjUzYzcxMCBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBidm1lNjAwMF9zY3NpX2RldGVjdCwKKwkucmVsZWFzZQkJPSBidm1lNjAwMF9zY3NpX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBOQ1I1M2M3eHhfcXVldWVfY29tbWFuZCwKKwkuYWJvcnQJCQk9IE5DUjUzYzd4eF9hYm9ydCwKKwkucmVzZXQJCQk9IE5DUjUzYzd4eF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDI0LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSA2MywKKwkuY21kX3Blcl9sdW4JCT0gMywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2J2bWU2MDAwLmggYi9kcml2ZXJzL3Njc2kvYnZtZTYwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWI2YmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2J2bWU2MDAwLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBCVk1FNjAwMF9TQ1NJX0gKKyNkZWZpbmUgQlZNRTYwMDBfU0NTSV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgYnZtZTYwMDBfc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworY29uc3QgY2hhciAqTkNSNTNjN3gwX2luZm8odm9pZCk7CitpbnQgTkNSNTNjN3h4X3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IE5DUjUzYzd4eF9hYm9ydChTY3NpX0NtbmQgKik7CitpbnQgTkNSNTNjN3gwX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgTkNSNTNjN3h4X3Jlc2V0KFNjc2lfQ21uZCAqLCB1bnNpZ25lZCBpbnQpOwordm9pZCBOQ1I1M2M3eDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMworI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAyNAorI2VuZGlmCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2VuZGlmIC8qIEJWTUU2MDAwX1NDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjVmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKQEAgLTAsMCArMSwxNDQ4IEBACisvKiAKKyAqIEFTQ0lJIHZhbHVlcyBmb3IgYSBudW1iZXIgb2Ygc3ltYm9saWMgY29uc3RhbnRzLCBwcmludGluZyBmdW5jdGlvbnMsCisgKiBldGMuCisgKiBBZGRpdGlvbnMgZm9yIFNDU0kgMiBhbmQgTGludXggMi4yLnggYnkgRC4gR2lsYmVydCAoOTkwNDIyKQorICogQWRkaXRpb25zIGZvciBTQ1NJIDMrIChTUEMtMyBUMTAvMTQxNi1EIFJldiAwNyAzIE1heSAyMDAyKQorICogICBieSBELiBHaWxiZXJ0IGFuZCBhZWIgKDIwMDIwNjA5KQorICogQWRkaXRpb25zIGZvciBTUEMtMyBUMTAvMTQxNi1EIFJldiAyMSAyMiBTZXB0IDIwMDQsIEQuIEdpbGJlcnQgMjAwNDEwMjUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorCisKKworLyogQ29tbWFuZHMgd2l0aCBzZXJ2aWNlIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGNvbW1hbmQgbmFtZSAqLworI2RlZmluZSBNQUlOVEVOQU5DRV9JTiAweGEzCisjZGVmaW5lIE1BSU5URU5BTkNFX09VVCAweGE0CisjZGVmaW5lIFNFUlZJQ0VfQUNUSU9OX0lOXzEyIDB4YWIKKyNkZWZpbmUgU0VSVklDRV9BQ1RJT05fT1VUXzEyIDB4YTkKKyNkZWZpbmUgU0VSVklDRV9BQ1RJT05fSU5fMTYgMHg5ZQorI2RlZmluZSBTRVJWSUNFX0FDVElPTl9PVVRfMTYgMHg5ZgorI2RlZmluZSBWQVJJQUJMRV9MRU5HVEhfQ01EIDB4N2YKKworCisKKyNpZmRlZiBDT05GSUdfU0NTSV9DT05TVEFOVFMKK3N0YXRpYyBjb25zdCBjaGFyICogY2RiX2J5dGUwX25hbWVzW10gPSB7CisvKiAwMC0wMyAqLyAiVGVzdCBVbml0IFJlYWR5IiwgIlJlemVybyBVbml0L1Jld2luZCIsIE5VTEwsICJSZXF1ZXN0IFNlbnNlIiwKKy8qIDA0LTA3ICovICJGb3JtYXQgVW5pdC9NZWRpdW0iLCAiUmVhZCBCbG9jayBMaW1pdHMiLCBOVUxMLAorCSAgICAiUmVhc3NzaWduIEJsb2NrcyIsCisvKiAwOC0wZCAqLyAiUmVhZCAoNikiLCBOVUxMLCAiV3JpdGUgKDYpIiwgIlNlZWsgKDYpIiwgTlVMTCwgTlVMTCwKKy8qIDBlLTEyICovIE5VTEwsICJSZWFkIFJldmVyc2UiLCAiV3JpdGUgRmlsZW1hcmtzIiwgIlNwYWNlIiwgIklucXVpcnkiLCAgCisvKiAxMy0xNiAqLyAiVmVyaWZ5ICg2KSIsICJSZWNvdmVyIEJ1ZmZlcmVkIERhdGEiLCAiTW9kZSBTZWxlY3QgKDYpIiwKKwkgICAgIlJlc2VydmUgKDYpIiwKKy8qIDE3LTFhICovICJSZWxlYXNlICg2KSIsICJDb3B5IiwgIkVyYXNlIiwgIk1vZGUgU2Vuc2UgKDYpIiwgCisvKiAxYi0xZCAqLyAiU3RhcnQvU3RvcCBVbml0IiwgIlJlY2VpdmUgRGlhZ25vc3RpYyIsICJTZW5kIERpYWdub3N0aWMiLCAKKy8qIDFlLTFmICovICJQcmV2ZW50L0FsbG93IE1lZGl1bSBSZW1vdmFsIiwgTlVMTCwKKy8qIDIwLTIyICovICBOVUxMLCBOVUxMLCBOVUxMLAorLyogMjMtMjggKi8gIlJlYWQgRm9ybWF0IENhcGFjaXRpZXMiLCAiU2V0IFdpbmRvdyIsCisJICAgICJSZWFkIENhcGFjaXR5ICgxMCkiLCBOVUxMLCBOVUxMLCAiUmVhZCAoMTApIiwgCisvKiAyOS0yZCAqLyAiUmVhZCBHZW5lcmF0aW9uIiwgIldyaXRlICgxMCkiLCAiU2VlayAoMTApIiwgIkVyYXNlICgxMCkiLCAKKyAgICAgICAgICAgICJSZWFkIHVwZGF0ZWQgYmxvY2siLCAKKy8qIDJlLTMxICovICJXcml0ZSBWZXJpZnkgKDEwKSIsICJWZXJpZnkgKDEwKSIsICJTZWFyY2ggSGlnaCIsICJTZWFyY2ggRXF1YWwiLCAKKy8qIDMyLTM0ICovICJTZWFyY2ggTG93IiwgIlNldCBMaW1pdHMiLCAiUHJlZmV0Y2gvUmVhZCBQb3NpdGlvbiIsIAorLyogMzUtMzcgKi8gIlN5bmNocm9uaXplIENhY2hlICgxMCkiLCAiTG9jay9VbmxvY2sgQ2FjaGUgKDEwKSIsCisJICAgICJSZWFkIERlZmVjdCBEYXRhKDEwKSIsIAorLyogMzgtM2MgKi8gIk1lZGl1bSBTY2FuIiwgIkNvbXBhcmUiLCAiQ29weSBWZXJpZnkiLCAiV3JpdGUgQnVmZmVyIiwgCisgICAgICAgICAgICAiUmVhZCBCdWZmZXIiLCAKKy8qIDNkLTNmICovICJVcGRhdGUgQmxvY2siLCAiUmVhZCBMb25nICgxMCkiLCAgIldyaXRlIExvbmcgKDEwKSIsCisvKiA0MC00MSAqLyAiQ2hhbmdlIERlZmluaXRpb24iLCAiV3JpdGUgU2FtZSAoMTApIiwKKy8qIDQyLTQ4ICovICJSZWFkIHN1Yi1jaGFubmVsIiwgIlJlYWQgVE9DL1BNQS9BVElQIiwgIlJlYWQgZGVuc2l0eSBzdXBwb3J0IiwKKyAgICAgICAgICAgICJQbGF5IGF1ZGlvICgxMCkiLCAiR2V0IGNvbmZpZ3VyYXRpb24iLCAiUGxheSBhdWRpbyBtc2YiLAorICAgICAgICAgICAgIlBsYXkgYXVkaW8gdHJhY2svaW5kZXgiLAorLyogNDktNGYgKi8gIlBsYXkgdHJhY2sgcmVsYXRpdmUgKDEwKSIsICJHZXQgZXZlbnQgc3RhdHVzIG5vdGlmaWNhdGlvbiIsCisgICAgICAgICAgICAiUGF1c2UvcmVzdW1lIiwgIkxvZyBTZWxlY3QiLCAiTG9nIFNlbnNlIiwgIlN0b3AgcGxheS9zY2FuIiwKKyAgICAgICAgICAgIE5VTEwsCisvKiA1MC01NSAqLyAiWGR3cml0ZSIsICJYcHdyaXRlLCBSZWFkIGRpc2sgaW5mbyIsICJYZHJlYWQsIFJlYWQgdHJhY2sgaW5mbyIsCisgICAgICAgICAgICAiUmVzZXJ2ZSB0cmFjayIsICJTZW5kIE9QQyBpbmZvIiwgIk1vZGUgU2VsZWN0ICgxMCkiLAorLyogNTYtNWIgKi8gIlJlc2VydmUgKDEwKSIsICJSZWxlYXNlICgxMCkiLCAiUmVwYWlyIHRyYWNrIiwgIlJlYWQgbWFzdGVyIGN1ZSIsCisgICAgICAgICAgICAiTW9kZSBTZW5zZSAoMTApIiwgIkNsb3NlIHRyYWNrL3Nlc3Npb24iLAorLyogNWMtNWYgKi8gIlJlYWQgYnVmZmVyIGNhcGFjaXR5IiwgIlNlbmQgY3VlIHNoZWV0IiwgIlBlcnNpc3RlbnQgcmVzZXJ2ZSBpbiIsCisgICAgICAgICAgICAiUGVyc2lzdGVudCByZXNlcnZlIG91dCIsCisvKiA2MC02NyAqLyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorLyogNjgtNmYgKi8gTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKy8qIDcwLTc3ICovIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisvKiA3OC03ZiAqLyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiVmFyaWFibGUgbGVuZ3RoIiwKKy8qIDgwLTg0ICovICJYZHdyaXRlICgxNikiLCAiUmVidWlsZCAoMTYpIiwgIlJlZ2VuZXJhdGUgKDE2KSIsICJFeHRlbmRlZCBjb3B5IiwKKyAgICAgICAgICAgICJSZWNlaXZlIGNvcHkgcmVzdWx0cyIsCisvKiA4NS04OSAqLyAiTWVtb3J5IEV4cG9ydCBJbiAoMTYpIiwgIkFjY2VzcyBjb250cm9sIGluIiwgIkFjY2VzcyBjb250cm9sIG91dCIsCisgICAgICAgICAgICAiUmVhZCAoMTYpIiwgIk1lbW9yeSBFeHBvcnQgT3V0ICgxNikiLAorLyogOGEtOGYgKi8gIldyaXRlICgxNikiLCBOVUxMLCAiUmVhZCBhdHRyaWJ1dGVzIiwgIldyaXRlIGF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgIldyaXRlIGFuZCB2ZXJpZnkgKDE2KSIsICJWZXJpZnkgKDE2KSIsCisvKiA5MC05NCAqLyAiUHJlLWZldGNoICgxNikiLCAiU3luY2hyb25pemUgY2FjaGUgKDE2KSIsCisgICAgICAgICAgICAiTG9jay91bmxvY2sgY2FjaGUgKDE2KSIsICJXcml0ZSBzYW1lICgxNikiLCBOVUxMLAorLyogOTUtOTkgKi8gTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKy8qIDlhLTlmICovIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJTZXJ2aWNlIGFjdGlvbiBpbiAoMTYpIiwKKyAgICAgICAgICAgICJTZXJ2aWNlIGFjdGlvbiBvdXQgKDE2KSIsCisvKiBhMC1hNSAqLyAiUmVwb3J0IGx1bnMiLCAiQmxhbmsiLCAiU2VuZCBldmVudCIsICJNYWludGVuYW5jZSBpbiIsCisgICAgICAgICAgICAiTWFpbnRlbmFuY2Ugb3V0IiwgIk1vdmUgbWVkaXVtL3BsYXkgYXVkaW8oMTIpIiwKKy8qIGE2LWE5ICovICJFeGNoYW5nZSBtZWRpdW0iLCAiTW92ZSBtZWRpdW0gYXR0YWNoZWQiLCAiUmVhZCgxMikiLAorICAgICAgICAgICAgIlBsYXkgdHJhY2sgcmVsYXRpdmUoMTIpIiwKKy8qIGFhLWFlICovICJXcml0ZSgxMikiLCBOVUxMLCAiRXJhc2UoMTIpLCBHZXQgUGVyZm9ybWFuY2UiLAorICAgICAgICAgICAgIlJlYWQgRFZEIHN0cnVjdHVyZSIsICJXcml0ZSBhbmQgdmVyaWZ5KDEyKSIsCisvKiBhZi1iMSAqLyAiVmVyaWZ5KDEyKSIsICJTZWFyY2ggZGF0YSBoaWdoKDEyKSIsICJTZWFyY2ggZGF0YSBlcXVhbCgxMikiLAorLyogYjItYjQgKi8gIlNlYXJjaCBkYXRhIGxvdygxMikiLCAiU2V0IGxpbWl0cygxMikiLAorICAgICAgICAgICAgIlJlYWQgZWxlbWVudCBzdGF0dXMgYXR0YWNoZWQiLAorLyogYjUtYjYgKi8gIlJlcXVlc3Qgdm9sdW1lIGVsZW1lbnQgYWRkcmVzcyIsICJTZW5kIHZvbHVtZSB0YWcsIHNldCBzdHJlYW1pbmciLAorLyogYjctYjkgKi8gIlJlYWQgZGVmZWN0IGRhdGEoMTIpIiwgIlJlYWQgZWxlbWVudCBzdGF0dXMiLCAiUmVhZCBDRCBtc2YiLAorLyogYmEtYmMgKi8gIlJlZHVuZGFuY3kgZ3JvdXAgKGluKSwgU2NhbiIsCisgICAgICAgICAgICAiUmVkdW5kYW5jeSBncm91cCAob3V0KSwgU2V0IGNkLXJvbSBzcGVlZCIsICJTcGFyZSBpbiwgUGxheSBjZCIsCisvKiBiZC1iZiAqLyAiU3BhcmUgb3V0LCBNZWNoYW5pc20gc3RhdHVzIiwgIlZvbHVtZSBzZXQgaW4sIFJlYWQgY2QiLAorICAgICAgICAgICAgIlZvbHVtZSBzZXQgb3V0LCBTZW5kIERWRCBzdHJ1Y3R1cmUiLAorfTsKKworc3RydWN0IHZhbHVlX25hbWVfcGFpciB7CisJaW50IHZhbHVlOworCWNvbnN0IGNoYXIgKiBuYW1lOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgbWFpbnRfaW5fYXJyW10gPSB7CisJezB4NSwgIlJlcG9ydCBkZXZpY2UgaWRlbnRpZmllciJ9LAorCXsweGEsICJSZXBvcnQgdGFyZ2V0IHBvcnQgZ3JvdXBzIn0sCisJezB4YiwgIlJlcG9ydCBhbGlhc2VzIn0sCisJezB4YywgIlJlcG9ydCBzdXBwb3J0ZWQgb3BlcmF0aW9uIGNvZGVzIn0sCisJezB4ZCwgIlJlcG9ydCBzdXBwb3J0ZWQgdGFzayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyJ9LAorCXsweGUsICJSZXBvcnQgcHJpb3JpdHkifSwKK307CisjZGVmaW5lIE1BSU5UX0lOX1NaIFwKKyAgICAgICAgKGludCkoc2l6ZW9mKG1haW50X2luX2FycikgLyBzaXplb2YobWFpbnRfaW5fYXJyWzBdKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgbWFpbnRfb3V0X2FycltdID0geworCXsweDYsICJTZXQgZGV2aWNlIGlkZW50aWZpZXIifSwKKwl7MHhhLCAiU2V0IHRhcmdldCBwb3J0IGdyb3VwcyJ9LAorCXsweGIsICJDaGFuZ2UgYWxpYXNlcyJ9LAorCXsweGUsICJTZXQgcHJpb3JpdHkifSwKK307CisjZGVmaW5lIE1BSU5UX09VVF9TWiBcCisgICAgICAgIChpbnQpKHNpemVvZihtYWludF9vdXRfYXJyKSAvIHNpemVvZihtYWludF9vdXRfYXJyWzBdKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgc2Vydl9pbjEyX2FycltdID0geworCXsweDEsICJSZWFkIG1lZGlhIHNlcmlhbCBudW1iZXIifSwKK307CisjZGVmaW5lIFNFUlZfSU4xMl9TWiAgXAorICAgICAgICAoaW50KShzaXplb2Yoc2Vydl9pbjEyX2FycikgLyBzaXplb2Yoc2Vydl9pbjEyX2FyclswXSkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfbmFtZV9wYWlyIHNlcnZfb3V0MTJfYXJyW10gPSB7CisJey0xLCAiZHVtbXkgZW50cnkifSwKK307CisjZGVmaW5lIFNFUlZfT1VUMTJfU1ogXAorICAgICAgICAoaW50KShzaXplb2Yoc2Vydl9vdXQxMl9hcnIpIC8gc2l6ZW9mKHNlcnZfaW4xMl9hcnJbMF0pKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX25hbWVfcGFpciBzZXJ2X2luMTZfYXJyW10gPSB7CisJezB4MTAsICJSZWFkIGNhcGFjaXR5KDE2KSJ9LAorCXsweDExLCAiUmVhZCBsb25nKDE2KSJ9LAorfTsKKyNkZWZpbmUgU0VSVl9JTjE2X1NaICBcCisgICAgICAgIChpbnQpKHNpemVvZihzZXJ2X2luMTZfYXJyKSAvIHNpemVvZihzZXJ2X2luMTZfYXJyWzBdKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgc2Vydl9vdXQxNl9hcnJbXSA9IHsKKwl7MHgxMSwgIldyaXRlIGxvbmcoMTYpIn0sCisJezB4MWYsICJOb3RpZnkgZGF0YSB0cmFuc2ZlciBkZXZpY2UoMTYpIn0sCit9OworI2RlZmluZSBTRVJWX09VVDE2X1NaIFwKKyAgICAgICAgKGludCkoc2l6ZW9mKHNlcnZfb3V0MTZfYXJyKSAvIHNpemVvZihzZXJ2X2luMTZfYXJyWzBdKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgdmFyaWFibGVfbGVuZ3RoX2FycltdID0geworCXsweDEsICJSZWJ1aWxkKDMyKSJ9LAorCXsweDIsICJSZWdlbmVyYXRlKDMyKSJ9LAorCXsweDMsICJYZHJlYWQoMzIpIn0sCisJezB4NCwgIlhkd3JpdGUoMzIpIn0sCisJezB4NSwgIlhkd3JpdGUgZXh0ZW5kZWQoMzIpIn0sCisJezB4NiwgIlhwd3JpdGUoMzIpIn0sCisJezB4NywgIlhkd3JpdGVyZWFkKDMyKSJ9LAorCXsweDgsICJYZHdyaXRlIGV4dGVuZGVkKDY0KSJ9LAorCXsweDksICJSZWFkKDMyKSJ9LAorCXsweGEsICJWZXJpZnkoMzIpIn0sCisJezB4YiwgIldyaXRlKDMyKSJ9LAorCXsweGMsICJXcml0ZSBhbiB2ZXJpZnkoMzIpIn0sCisJezB4ZCwgIldyaXRlIHNhbWUoMzIpIn0sCisJezB4ODgwMSwgIkZvcm1hdCBPU0QifSwKKwl7MHg4ODAyLCAiQ3JlYXRlIChvc2QpIn0sCisJezB4ODgwMywgIkxpc3QgKG9zZCkifSwKKwl7MHg4ODA1LCAiUmVhZCAob3NkKSJ9LAorCXsweDg4MDYsICJXcml0ZSAob3NkKSJ9LAorCXsweDg4MDcsICJBcHBlbmQgKG9zZCkifSwKKwl7MHg4ODA4LCAiRmx1c2ggKG9zZCkifSwKKwl7MHg4ODBhLCAiUmVtb3ZlIChvc2QpIn0sCisJezB4ODgwYiwgIkNyZWF0ZSBwYXJ0aXRpb24gKG9zZCkifSwKKwl7MHg4ODBjLCAiUmVtb3ZlIHBhcnRpdGlvbiAob3NkKSJ9LAorCXsweDg4MGUsICJHZXQgYXR0cmlidXRlcyAob3NkKSJ9LAorCXsweDg4MGYsICJTZXQgYXR0cmlidXRlcyAob3NkKSJ9LAorCXsweDg4MTIsICJDcmVhdGUgYW5kIHdyaXRlIChvc2QpIn0sCisJezB4ODgxNSwgIkNyZWF0ZSBjb2xsZWN0aW9uIChvc2QpIn0sCisJezB4ODgxNiwgIlJlbW92ZSBjb2xsZWN0aW9uIChvc2QpIn0sCisJezB4ODgxNywgIkxpc3QgY29sbGVjdGlvbiAob3NkKSJ9LAorCXsweDg4MTgsICJTZXQga2V5IChvc2QpIn0sCisJezB4ODgxOSwgIlNldCBtYXN0ZXIga2V5IChvc2QpIn0sCisJezB4ODgxYSwgIkZsdXNoIGNvbGxlY3Rpb24gKG9zZCkifSwKKwl7MHg4ODFiLCAiRmx1c2ggcGFydGl0aW9uIChvc2QpIn0sCisJezB4ODgxYywgIkZsdXNoIE9TRCJ9LAorCXsweDhmN2UsICJQZXJmb3JtIFNDU0kgY29tbWFuZCAob3NkKSJ9LAorCXsweDhmN2YsICJQZXJmb3JtIHRhc2sgbWFuYWdlbWVudCBmdW5jdGlvbiAob3NkKSJ9LAorfTsKKyNkZWZpbmUgVkFSSUFCTEVfTEVOR1RIX1NaIFwKKyAgICAgICAgKGludCkoc2l6ZW9mKHZhcmlhYmxlX2xlbmd0aF9hcnIpIC8gc2l6ZW9mKHZhcmlhYmxlX2xlbmd0aF9hcnJbMF0pKQorCitzdGF0aWMgY29uc3QgY2hhciAqIGdldF9zYV9uYW1lKGNvbnN0IHN0cnVjdCB2YWx1ZV9uYW1lX3BhaXIgKiBhcnIsCisJCQkgICAgICAgIGludCBhcnJfc3osIGludCBzZXJ2aWNlX2FjdGlvbikKK3sKKwlpbnQgazsKKworCWZvciAoayA9IDA7IGsgPCBhcnJfc3o7ICsraywgKythcnIpIHsKKwkJaWYgKHNlcnZpY2VfYWN0aW9uID09IGFyci0+dmFsdWUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIChrIDwgYXJyX3N6KSA/IGFyci0+bmFtZSA6IE5VTEw7Cit9CisKKy8qIGF0dGVtcHQgdG8gZ3Vlc3MgY2RiIGxlbmd0aCBpZiBjZGJfbGVuPT0wIC4gTm8gdHJhaWxpbmcgbGluZWZlZWQuICovCitzdGF0aWMgdm9pZCBwcmludF9vcGNvZGVfbmFtZSh1bnNpZ25lZCBjaGFyICogY2RicCwgaW50IGNkYl9sZW4sCisJCQkgICAgICBpbnQgc3RhcnRfb2ZfbGluZSkKK3sKKwlpbnQgc2EsIGxlbiwgY2RiMDsKKwljb25zdCBjaGFyICogbmFtZTsKKwljb25zdCBjaGFyICogbGVhZGluID0gc3RhcnRfb2ZfbGluZSA/IEtFUk5fSU5GTyA6ICIiOworCisJY2RiMCA9IGNkYnBbMF07CisJc3dpdGNoKGNkYjApIHsKKwljYXNlIFZBUklBQkxFX0xFTkdUSF9DTUQ6CisJCWxlbiA9IGNkYnBbN10gKyA4OworCQlpZiAobGVuIDwgMTApIHsKKwkJCXByaW50aygiJXNzaG9ydCB2YXJpYWJsZSBsZW5ndGggY29tbWFuZCwgIgorCQkJICAgICAgICJsZW49JWQgZXh0X2xlbj0lZCIsIGxlYWRpbiwgbGVuLCBjZGJfbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCXNhID0gKGNkYnBbOF0gPDwgOCkgKyBjZGJwWzldOworCQluYW1lID0gZ2V0X3NhX25hbWUobWFpbnRfaW5fYXJyLCBNQUlOVF9JTl9TWiwgc2EpOworCQlpZiAobmFtZSkgeworCQkJcHJpbnRrKCIlcyVzIiwgbGVhZGluLCBuYW1lKTsKKwkJCWlmICgoY2RiX2xlbiA+IDApICYmIChsZW4gIT0gY2RiX2xlbikpCisJCQkJcHJpbnRrKCIsIGluX2NkYl9sZW49JWQsIGV4dF9sZW49JWQiLAorCQkJCSAgICAgICBsZW4sIGNkYl9sZW4pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4LCBzYT0weCV4IiwgbGVhZGluLCBjZGIwLCBzYSk7CisJCQlpZiAoKGNkYl9sZW4gPiAwKSAmJiAobGVuICE9IGNkYl9sZW4pKQorCQkJCXByaW50aygiLCBpbl9jZGJfbGVuPSVkLCBleHRfbGVuPSVkIiwKKwkJCQkgICAgICAgbGVuLCBjZGJfbGVuKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1BSU5URU5BTkNFX0lOOgorCQlzYSA9IGNkYnBbMV0gJiAweDFmOworCQluYW1lID0gZ2V0X3NhX25hbWUobWFpbnRfaW5fYXJyLCBNQUlOVF9JTl9TWiwgc2EpOworCQlpZiAobmFtZSkKKwkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQlicmVhazsKKwljYXNlIE1BSU5URU5BTkNFX09VVDoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKG1haW50X291dF9hcnIsIE1BSU5UX09VVF9TWiwgc2EpOworCQlpZiAobmFtZSkKKwkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQlicmVhazsKKwljYXNlIFNFUlZJQ0VfQUNUSU9OX0lOXzEyOgorCQlzYSA9IGNkYnBbMV0gJiAweDFmOworCQluYW1lID0gZ2V0X3NhX25hbWUoc2Vydl9pbjEyX2FyciwgU0VSVl9JTjEyX1NaLCBzYSk7CisJCWlmIChuYW1lKQorCQkJcHJpbnRrKCIlcyVzIiwgbGVhZGluLCBuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4LCBzYT0weCV4IiwgbGVhZGluLCBjZGIwLCBzYSk7CisJCWJyZWFrOworCWNhc2UgU0VSVklDRV9BQ1RJT05fT1VUXzEyOgorCQlzYSA9IGNkYnBbMV0gJiAweDFmOworCQluYW1lID0gZ2V0X3NhX25hbWUoc2Vydl9vdXQxMl9hcnIsIFNFUlZfT1VUMTJfU1osIHNhKTsKKwkJaWYgKG5hbWUpCisJCQlwcmludGsoIiVzJXMiLCBsZWFkaW4sIG5hbWUpOworCQllbHNlCisJCQlwcmludGsoIiVzY2RiWzBdPTB4JXgsIHNhPTB4JXgiLCBsZWFkaW4sIGNkYjAsIHNhKTsKKwkJYnJlYWs7CisJY2FzZSBTRVJWSUNFX0FDVElPTl9JTl8xNjoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKHNlcnZfaW4xNl9hcnIsIFNFUlZfSU4xNl9TWiwgc2EpOworCQlpZiAobmFtZSkKKwkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQlicmVhazsKKwljYXNlIFNFUlZJQ0VfQUNUSU9OX09VVF8xNjoKKwkJc2EgPSBjZGJwWzFdICYgMHgxZjsKKwkJbmFtZSA9IGdldF9zYV9uYW1lKHNlcnZfb3V0MTZfYXJyLCBTRVJWX09VVDE2X1NaLCBzYSk7CisJCWlmIChuYW1lKQorCQkJcHJpbnRrKCIlcyVzIiwgbGVhZGluLCBuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4LCBzYT0weCV4IiwgbGVhZGluLCBjZGIwLCBzYSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChjZGIwIDwgMHhjMCkgeworCQkJbmFtZSA9IGNkYl9ieXRlMF9uYW1lc1tjZGIwXTsKKwkJCWlmIChuYW1lKQorCQkJCXByaW50aygiJXMlcyIsIGxlYWRpbiwgbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4IChyZXNlcnZlZCkiLAorCQkJCSAgICAgICBsZWFkaW4sIGNkYjApOworCQl9IGVsc2UKKwkJCXByaW50aygiJXNjZGJbMF09MHgleCAodmVuZG9yKSIsIGxlYWRpbiwgY2RiMCk7CisJCWJyZWFrOworCX0KK30KKworI2Vsc2UgLyogaWZuZGVmIENPTkZJR19TQ1NJX0NPTlNUQU5UUyAqLworCitzdGF0aWMgdm9pZCBwcmludF9vcGNvZGVfbmFtZSh1bnNpZ25lZCBjaGFyICogY2RicCwgaW50IGNkYl9sZW4sCisJCQkgICAgICBpbnQgc3RhcnRfb2ZfbGluZSkKK3sKKwlpbnQgc2EsIGxlbiwgY2RiMDsKKwljb25zdCBjaGFyICogbGVhZGluID0gc3RhcnRfb2ZfbGluZSA/IEtFUk5fSU5GTyA6ICIiOworCisJY2RiMCA9IGNkYnBbMF07CisJc3dpdGNoKGNkYjApIHsKKwljYXNlIFZBUklBQkxFX0xFTkdUSF9DTUQ6CisJCWxlbiA9IGNkYnBbN10gKyA4OworCQlpZiAobGVuIDwgMTApIHsKKwkJCXByaW50aygiJXNzaG9ydCBvcGNvZGU9MHgleCBjb21tYW5kLCBsZW49JWQgIgorCQkJICAgICAgICJleHRfbGVuPSVkIiwgbGVhZGluLCBjZGIwLCBsZW4sIGNkYl9sZW4pOworCQkJYnJlYWs7CisJCX0KKwkJc2EgPSAoY2RicFs4XSA8PCA4KSArIGNkYnBbOV07CisJCXByaW50aygiJXNjZGJbMF09MHgleCwgc2E9MHgleCIsIGxlYWRpbiwgY2RiMCwgc2EpOworCQlpZiAobGVuICE9IGNkYl9sZW4pCisJCQlwcmludGsoIiwgaW5fY2RiX2xlbj0lZCwgZXh0X2xlbj0lZCIsIGxlbiwgY2RiX2xlbik7CisJCWJyZWFrOworCWNhc2UgTUFJTlRFTkFOQ0VfSU46CisJY2FzZSBNQUlOVEVOQU5DRV9PVVQ6CisJY2FzZSBTRVJWSUNFX0FDVElPTl9JTl8xMjoKKwljYXNlIFNFUlZJQ0VfQUNUSU9OX09VVF8xMjoKKwljYXNlIFNFUlZJQ0VfQUNUSU9OX0lOXzE2OgorCWNhc2UgU0VSVklDRV9BQ1RJT05fT1VUXzE2OgorCQlzYSA9IGNkYnBbMV0gJiAweDFmOworCQlwcmludGsoIiVzY2RiWzBdPTB4JXgsIHNhPTB4JXgiLCBsZWFkaW4sIGNkYjAsIHNhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGNkYjAgPCAweGMwKQorCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4IiwgbGVhZGluLCBjZGIwKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIlc2NkYlswXT0weCV4ICh2ZW5kb3IpIiwgbGVhZGluLCBjZGIwKTsKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmICAKKwordm9pZCBfX3Njc2lfcHJpbnRfY29tbWFuZCh1bnNpZ25lZCBjaGFyICpjb21tYW5kKQoreworCWludCBrLCBsZW47CisKKwlwcmludF9vcGNvZGVfbmFtZShjb21tYW5kLCAwLCAxKTsKKwlpZiAoVkFSSUFCTEVfTEVOR1RIX0NNRCA9PSBjb21tYW5kWzBdKQorCQlsZW4gPSBjb21tYW5kWzddICsgODsKKwllbHNlCisJCWxlbiA9IENPTU1BTkRfU0laRShjb21tYW5kWzBdKTsKKwkvKiBwcmludCBvdXQgYWxsIGJ5dGVzIGluIGNkYiAqLworCWZvciAoayA9IDA7IGsgPCBsZW47ICsraykgCisJCXByaW50aygiICUwMngiLCBjb21tYW5kW2tdKTsKKwlwcmludGsoIlxuIik7Cit9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9wcmludF9jb21tYW5kKTsKKworLyogVGhpcyBmdW5jdGlvbiAocGVyaGFwcyB3aXRoIHRoZSBhZGRpdGlvbiBvZiBwZXJpcGhlcmFsIGRldmljZSB0eXBlKQorICogaXMgbW9yZSBhcHByb3JpYXRlIHRoYW4gX19zY3NpX3ByaW50X2NvbW1hbmQoKS4gUGVyaGFwcyB0aGF0IHN0YXRpYworICogY2FuIGJlIGRyb3BwZWQgbGF0ZXIgaWYgaXQgcmVwbGFjZXMgdGhlIF9fc2NzaV9wcmludF9jb21tYW5kIHZlcnNpb24uCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfcHJpbnRfY2RiKHVuc2lnbmVkIGNoYXIgKmNkYiwgaW50IGNkYl9sZW4sIGludCBzdGFydF9vZl9saW5lKQoreworCWludCBrOworCisJcHJpbnRfb3Bjb2RlX25hbWUoY2RiLCBjZGJfbGVuLCBzdGFydF9vZl9saW5lKTsKKwkvKiBwcmludCBvdXQgYWxsIGJ5dGVzIGluIGNkYiAqLworCXByaW50aygiOiIpOworCWZvciAoayA9IDA7IGsgPCBjZGJfbGVuOyArK2spIAorCQlwcmludGsoIiAlMDJ4IiwgY2RiW2tdKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qKgorICoKKyAqCXByaW50X3N0YXR1cyAtIHByaW50IHNjc2kgc3RhdHVzIGRlc2NyaXB0aW9uCisgKglAc2NzaV9zdGF0dXM6IHNjc2kgc3RhdHVzIHZhbHVlCisgKgorICoJSWYgdGhlIHN0YXR1cyBpcyByZWNvZ25pemVkLCB0aGUgZGVzY3JpcHRpb24gaXMgcHJpbnRlZC4KKyAqCU90aGVyd2lzZSAiVW5rbm93biBzdGF0dXMiIGlzIG91dHB1dC4gTm8gdHJhaWxpbmcgc3BhY2UuCisgKglJZiBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldCwgdGhlbiBwcmludCBzdGF0dXMgaW4gaGV4CisgKgkoZS5nLiAiMHgyIiBmb3IgQ2hlY2sgQ29uZGl0aW9uKS4KKyAqKi8KK3ZvaWQKK3Njc2lfcHJpbnRfc3RhdHVzKHVuc2lnbmVkIGNoYXIgc2NzaV9zdGF0dXMpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9DT05TVEFOVFMKKwljb25zdCBjaGFyICogY2NwOworCisJc3dpdGNoIChzY3NpX3N0YXR1cykgeworCWNhc2UgMDogICAgY2NwID0gIkdvb2QiOyBicmVhazsKKwljYXNlIDB4MjogIGNjcCA9ICJDaGVjayBDb25kaXRpb24iOyBicmVhazsKKwljYXNlIDB4NDogIGNjcCA9ICJDb25kaXRpb24gTWV0IjsgYnJlYWs7CisJY2FzZSAweDg6ICBjY3AgPSAiQnVzeSI7IGJyZWFrOworCWNhc2UgMHgxMDogY2NwID0gIkludGVybWVkaWF0ZSI7IGJyZWFrOworCWNhc2UgMHgxNDogY2NwID0gIkludGVybWVkaWF0ZS1Db25kaXRpb24gTWV0IjsgYnJlYWs7CisJY2FzZSAweDE4OiBjY3AgPSAiUmVzZXJ2YXRpb24gQ29uZmxpY3QiOyBicmVhazsKKwljYXNlIDB4MjI6IGNjcCA9ICJDb21tYW5kIFRlcm1pbmF0ZWQiOyBicmVhazsJLyogb2Jzb2xldGUgKi8KKwljYXNlIDB4Mjg6IGNjcCA9ICJUYXNrIHNldCBGdWxsIjsgYnJlYWs7CS8qIHdhczogUXVldWUgRnVsbCAqLworCWNhc2UgMHgzMDogY2NwID0gIkFDQSBBY3RpdmUiOyBicmVhazsKKwljYXNlIDB4NDA6IGNjcCA9ICJUYXNrIEFib3J0ZWQiOyBicmVhazsKKwlkZWZhdWx0OiAgIGNjcCA9ICJVbmtub3duIHN0YXR1cyI7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzIiwgY2NwKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAiMHglMHgiLCBzY3NpX3N0YXR1cyk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wcmludF9zdGF0dXMpOworCisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCisKK3N0cnVjdCBlcnJvcl9pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBjb2RlMTI7CS8qIDB4MDMwMiBsb29rcyBiZXR0ZXIgdGhhbiAweDAzLDB4MDIgKi8KKwljb25zdCBjaGFyICogdGV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXJyb3JfaW5mbyBhZGRpdGlvbmFsW10gPQoreworCXsweDAwMDAsICJObyBhZGRpdGlvbmFsIHNlbnNlIGluZm9ybWF0aW9uIn0sCisJezB4MDAwMSwgIkZpbGVtYXJrIGRldGVjdGVkIn0sCisJezB4MDAwMiwgIkVuZC1vZi1wYXJ0aXRpb24vbWVkaXVtIGRldGVjdGVkIn0sCisJezB4MDAwMywgIlNldG1hcmsgZGV0ZWN0ZWQifSwKKwl7MHgwMDA0LCAiQmVnaW5uaW5nLW9mLXBhcnRpdGlvbi9tZWRpdW0gZGV0ZWN0ZWQifSwKKwl7MHgwMDA1LCAiRW5kLW9mLWRhdGEgZGV0ZWN0ZWQifSwKKwl7MHgwMDA2LCAiSS9PIHByb2Nlc3MgdGVybWluYXRlZCJ9LAorCXsweDAwMTEsICJBdWRpbyBwbGF5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCXsweDAwMTIsICJBdWRpbyBwbGF5IG9wZXJhdGlvbiBwYXVzZWQifSwKKwl7MHgwMDEzLCAiQXVkaW8gcGxheSBvcGVyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCJ9LAorCXsweDAwMTQsICJBdWRpbyBwbGF5IG9wZXJhdGlvbiBzdG9wcGVkIGR1ZSB0byBlcnJvciJ9LAorCXsweDAwMTUsICJObyBjdXJyZW50IGF1ZGlvIHN0YXR1cyB0byByZXR1cm4ifSwKKwl7MHgwMDE2LCAiT3BlcmF0aW9uIGluIHByb2dyZXNzIn0sCisJezB4MDAxNywgIkNsZWFuaW5nIHJlcXVlc3RlZCJ9LAorCXsweDAwMTgsICJFcmFzZSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MifSwKKwl7MHgwMDE5LCAiTG9jYXRlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCXsweDAwMUEsICJSZXdpbmQgb3BlcmF0aW9uIGluIHByb2dyZXNzIn0sCisJezB4MDAxQiwgIlNldCBjYXBhY2l0eSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MifSwKKwl7MHgwMDFDLCAiVmVyaWZ5IG9wZXJhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCisJezB4MDEwMCwgIk5vIGluZGV4L3NlY3RvciBzaWduYWwifSwKKworCXsweDAyMDAsICJObyBzZWVrIGNvbXBsZXRlIn0sCisKKwl7MHgwMzAwLCAiUGVyaXBoZXJhbCBkZXZpY2Ugd3JpdGUgZmF1bHQifSwKKwl7MHgwMzAxLCAiTm8gd3JpdGUgY3VycmVudCJ9LAorCXsweDAzMDIsICJFeGNlc3NpdmUgd3JpdGUgZXJyb3JzIn0sCisKKwl7MHgwNDAwLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgY2F1c2Ugbm90IHJlcG9ydGFibGUifSwKKwl7MHgwNDAxLCAiTG9naWNhbCB1bml0IGlzIGluIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHkifSwKKwl7MHgwNDAyLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgaW5pdGlhbGl6aW5nIGNtZC4gcmVxdWlyZWQifSwKKwl7MHgwNDAzLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgbWFudWFsIGludGVydmVudGlvbiByZXF1aXJlZCJ9LAorCXsweDA0MDQsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBmb3JtYXQgaW4gcHJvZ3Jlc3MifSwKKwl7MHgwNDA1LCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgcmVidWlsZCBpbiBwcm9ncmVzcyJ9LAorCXsweDA0MDYsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCByZWNhbGN1bGF0aW9uIGluIHByb2dyZXNzIn0sCisJezB4MDQwNywgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIG9wZXJhdGlvbiBpbiBwcm9ncmVzcyJ9LAorCXsweDA0MDgsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBsb25nIHdyaXRlIGluIHByb2dyZXNzIn0sCisJezB4MDQwOSwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIHNlbGYtdGVzdCBpbiBwcm9ncmVzcyJ9LAorCXsweDA0MEEsICJMb2dpY2FsIHVuaXQgbm90IGFjY2Vzc2libGUsIGFzeW1tZXRyaWMgYWNjZXNzIHN0YXRlICIKKwkgInRyYW5zaXRpb24ifSwKKwl7MHgwNDBCLCAiTG9naWNhbCB1bml0IG5vdCBhY2Nlc3NpYmxlLCB0YXJnZXQgcG9ydCBpbiBzdGFuZGJ5IHN0YXRlIn0sCisJezB4MDQwQywgIkxvZ2ljYWwgdW5pdCBub3QgYWNjZXNzaWJsZSwgdGFyZ2V0IHBvcnQgaW4gdW5hdmFpbGFibGUgIgorCSAic3RhdGUifSwKKwl7MHgwNDEwLCAiTG9naWNhbCB1bml0IG5vdCByZWFkeSwgYXV4aWxpYXJ5IG1lbW9yeSBub3QgYWNjZXNzaWJsZSJ9LAorCXsweDA0MTEsICJMb2dpY2FsIHVuaXQgbm90IHJlYWR5LCBub3RpZnkgKGVuYWJsZSBzcGludXApIHJlcXVpcmVkIn0sCisJezB4MDQxMiwgIkxvZ2ljYWwgdW5pdCBub3QgcmVhZHksIG9mZmxpbmUifSwKKworCXsweDA1MDAsICJMb2dpY2FsIHVuaXQgZG9lcyBub3QgcmVzcG9uZCB0byBzZWxlY3Rpb24ifSwKKworCXsweDA2MDAsICJObyByZWZlcmVuY2UgcG9zaXRpb24gZm91bmQifSwKKworCXsweDA3MDAsICJNdWx0aXBsZSBwZXJpcGhlcmFsIGRldmljZXMgc2VsZWN0ZWQifSwKKworCXsweDA4MDAsICJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBmYWlsdXJlIn0sCisJezB4MDgwMSwgIkxvZ2ljYWwgdW5pdCBjb21tdW5pY2F0aW9uIHRpbWUtb3V0In0sCisJezB4MDgwMiwgIkxvZ2ljYWwgdW5pdCBjb21tdW5pY2F0aW9uIHBhcml0eSBlcnJvciJ9LAorCXsweDA4MDMsICJMb2dpY2FsIHVuaXQgY29tbXVuaWNhdGlvbiBDUkMgZXJyb3IgKFVsdHJhLURNQS8zMikifSwKKwl7MHgwODA0LCAiVW5yZWFjaGFibGUgY29weSB0YXJnZXQifSwKKworCXsweDA5MDAsICJUcmFjayBmb2xsb3dpbmcgZXJyb3IifSwKKwl7MHgwOTAxLCAiVHJhY2tpbmcgc2Vydm8gZmFpbHVyZSJ9LAorCXsweDA5MDIsICJGb2N1cyBzZXJ2byBmYWlsdXJlIn0sCisJezB4MDkwMywgIlNwaW5kbGUgc2Vydm8gZmFpbHVyZSJ9LAorCXsweDA5MDQsICJIZWFkIHNlbGVjdCBmYXVsdCJ9LAorCisJezB4MEEwMCwgIkVycm9yIGxvZyBvdmVyZmxvdyJ9LAorCisJezB4MEIwMCwgIldhcm5pbmcifSwKKwl7MHgwQjAxLCAiV2FybmluZyAtIHNwZWNpZmllZCB0ZW1wZXJhdHVyZSBleGNlZWRlZCJ9LAorCXsweDBCMDIsICJXYXJuaW5nIC0gZW5jbG9zdXJlIGRlZ3JhZGVkIn0sCisKKwl7MHgwQzAwLCAiV3JpdGUgZXJyb3IifSwKKwl7MHgwQzAxLCAiV3JpdGUgZXJyb3IgLSByZWNvdmVyZWQgd2l0aCBhdXRvIHJlYWxsb2NhdGlvbiJ9LAorCXsweDBDMDIsICJXcml0ZSBlcnJvciAtIGF1dG8gcmVhbGxvY2F0aW9uIGZhaWxlZCJ9LAorCXsweDBDMDMsICJXcml0ZSBlcnJvciAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQifSwKKwl7MHgwQzA0LCAiQ29tcHJlc3Npb24gY2hlY2sgbWlzY29tcGFyZSBlcnJvciJ9LAorCXsweDBDMDUsICJEYXRhIGV4cGFuc2lvbiBvY2N1cnJlZCBkdXJpbmcgY29tcHJlc3Npb24ifSwKKwl7MHgwQzA2LCAiQmxvY2sgbm90IGNvbXByZXNzaWJsZSJ9LAorCXsweDBDMDcsICJXcml0ZSBlcnJvciAtIHJlY292ZXJ5IG5lZWRlZCJ9LAorCXsweDBDMDgsICJXcml0ZSBlcnJvciAtIHJlY292ZXJ5IGZhaWxlZCJ9LAorCXsweDBDMDksICJXcml0ZSBlcnJvciAtIGxvc3Mgb2Ygc3RyZWFtaW5nIn0sCisJezB4MEMwQSwgIldyaXRlIGVycm9yIC0gcGFkZGluZyBibG9ja3MgYWRkZWQifSwKKwl7MHgwQzBCLCAiQXV4aWxpYXJ5IG1lbW9yeSB3cml0ZSBlcnJvciJ9LAorCXsweDBDMEMsICJXcml0ZSBlcnJvciAtIHVuZXhwZWN0ZWQgdW5zb2xpY2l0ZWQgZGF0YSJ9LAorCXsweDBDMEQsICJXcml0ZSBlcnJvciAtIG5vdCBlbm91Z2ggdW5zb2xpY2l0ZWQgZGF0YSJ9LAorCisJezB4MEQwMCwgIkVycm9yIGRldGVjdGVkIGJ5IHRoaXJkIHBhcnR5IHRlbXBvcmFyeSBpbml0aWF0b3IifSwKKwl7MHgwRDAxLCAiVGhpcmQgcGFydHkgZGV2aWNlIGZhaWx1cmUifSwKKwl7MHgwRDAyLCAiQ29weSB0YXJnZXQgZGV2aWNlIG5vdCByZWFjaGFibGUifSwKKwl7MHgwRDAzLCAiSW5jb3JyZWN0IGNvcHkgdGFyZ2V0IGRldmljZSB0eXBlIn0sCisJezB4MEQwNCwgIkNvcHkgdGFyZ2V0IGRldmljZSBkYXRhIHVuZGVycnVuIn0sCisJezB4MEQwNSwgIkNvcHkgdGFyZ2V0IGRldmljZSBkYXRhIG92ZXJydW4ifSwKKworCXsweDBFMDAsICJJbnZhbGlkIGluZm9ybWF0aW9uIHVuaXQifSwKKwl7MHgwRTAxLCAiSW5mb3JtYXRpb24gdW5pdCB0b28gc2hvcnQifSwKKwl7MHgwRTAyLCAiSW5mb3JtYXRpb24gdW5pdCB0b28gbG9uZyJ9LAorCisJezB4MTAwMCwgIklkIENSQyBvciBFQ0MgZXJyb3IifSwKKwl7MHgxMDAxLCAiRGF0YSBibG9jayBndWFyZCBjaGVjayBmYWlsZWQifSwKKwl7MHgxMDAyLCAiRGF0YSBibG9jayBhcHBsaWNhdGlvbiB0YWcgY2hlY2sgZmFpbGVkIn0sCisJezB4MTAwMywgIkRhdGEgYmxvY2sgcmVmZXJlbmNlIHRhZyBjaGVjayBmYWlsZWQifSwKKworCXsweDExMDAsICJVbnJlY292ZXJlZCByZWFkIGVycm9yIn0sCisJezB4MTEwMSwgIlJlYWQgcmV0cmllcyBleGhhdXN0ZWQifSwKKwl7MHgxMTAyLCAiRXJyb3IgdG9vIGxvbmcgdG8gY29ycmVjdCJ9LAorCXsweDExMDMsICJNdWx0aXBsZSByZWFkIGVycm9ycyJ9LAorCXsweDExMDQsICJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gYXV0byByZWFsbG9jYXRlIGZhaWxlZCJ9LAorCXsweDExMDUsICJMLUVDIHVuY29ycmVjdGFibGUgZXJyb3IifSwKKwl7MHgxMTA2LCAiQ0lSQyB1bnJlY292ZXJlZCBlcnJvciJ9LAorCXsweDExMDcsICJEYXRhIHJlLXN5bmNocm9uaXphdGlvbiBlcnJvciJ9LAorCXsweDExMDgsICJJbmNvbXBsZXRlIGJsb2NrIHJlYWQifSwKKwl7MHgxMTA5LCAiTm8gZ2FwIGZvdW5kIn0sCisJezB4MTEwQSwgIk1pc2NvcnJlY3RlZCBlcnJvciJ9LAorCXsweDExMEIsICJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gcmVjb21tZW5kIHJlYXNzaWdubWVudCJ9LAorCXsweDExMEMsICJVbnJlY292ZXJlZCByZWFkIGVycm9yIC0gcmVjb21tZW5kIHJld3JpdGUgdGhlIGRhdGEifSwKKwl7MHgxMTBELCAiRGUtY29tcHJlc3Npb24gQ1JDIGVycm9yIn0sCisJezB4MTEwRSwgIkNhbm5vdCBkZWNvbXByZXNzIHVzaW5nIGRlY2xhcmVkIGFsZ29yaXRobSJ9LAorCXsweDExMEYsICJFcnJvciByZWFkaW5nIFVQQy9FQU4gbnVtYmVyIn0sCisJezB4MTExMCwgIkVycm9yIHJlYWRpbmcgSVNSQyBudW1iZXIifSwKKwl7MHgxMTExLCAiUmVhZCBlcnJvciAtIGxvc3Mgb2Ygc3RyZWFtaW5nIn0sCisJezB4MTExMiwgIkF1eGlsaWFyeSBtZW1vcnkgcmVhZCBlcnJvciJ9LAorCXsweDExMTMsICJSZWFkIGVycm9yIC0gZmFpbGVkIHJldHJhbnNtaXNzaW9uIHJlcXVlc3QifSwKKworCXsweDEyMDAsICJBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBpZCBmaWVsZCJ9LAorCisJezB4MTMwMCwgIkFkZHJlc3MgbWFyayBub3QgZm91bmQgZm9yIGRhdGEgZmllbGQifSwKKworCXsweDE0MDAsICJSZWNvcmRlZCBlbnRpdHkgbm90IGZvdW5kIn0sCisJezB4MTQwMSwgIlJlY29yZCBub3QgZm91bmQifSwKKwl7MHgxNDAyLCAiRmlsZW1hcmsgb3Igc2V0bWFyayBub3QgZm91bmQifSwKKwl7MHgxNDAzLCAiRW5kLW9mLWRhdGEgbm90IGZvdW5kIn0sCisJezB4MTQwNCwgIkJsb2NrIHNlcXVlbmNlIGVycm9yIn0sCisJezB4MTQwNSwgIlJlY29yZCBub3QgZm91bmQgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50In0sCisJezB4MTQwNiwgIlJlY29yZCBub3QgZm91bmQgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQifSwKKwl7MHgxNDA3LCAiTG9jYXRlIG9wZXJhdGlvbiBmYWlsdXJlIn0sCisKKwl7MHgxNTAwLCAiUmFuZG9tIHBvc2l0aW9uaW5nIGVycm9yIn0sCisJezB4MTUwMSwgIk1lY2hhbmljYWwgcG9zaXRpb25pbmcgZXJyb3IifSwKKwl7MHgxNTAyLCAiUG9zaXRpb25pbmcgZXJyb3IgZGV0ZWN0ZWQgYnkgcmVhZCBvZiBtZWRpdW0ifSwKKworCXsweDE2MDAsICJEYXRhIHN5bmNocm9uaXphdGlvbiBtYXJrIGVycm9yIn0sCisJezB4MTYwMSwgIkRhdGEgc3luYyBlcnJvciAtIGRhdGEgcmV3cml0dGVuIn0sCisJezB4MTYwMiwgIkRhdGEgc3luYyBlcnJvciAtIHJlY29tbWVuZCByZXdyaXRlIn0sCisJezB4MTYwMywgIkRhdGEgc3luYyBlcnJvciAtIGRhdGEgYXV0by1yZWFsbG9jYXRlZCJ9LAorCXsweDE2MDQsICJEYXRhIHN5bmMgZXJyb3IgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50In0sCisKKwl7MHgxNzAwLCAiUmVjb3ZlcmVkIGRhdGEgd2l0aCBubyBlcnJvciBjb3JyZWN0aW9uIGFwcGxpZWQifSwKKwl7MHgxNzAxLCAiUmVjb3ZlcmVkIGRhdGEgd2l0aCByZXRyaWVzIn0sCisJezB4MTcwMiwgIlJlY292ZXJlZCBkYXRhIHdpdGggcG9zaXRpdmUgaGVhZCBvZmZzZXQifSwKKwl7MHgxNzAzLCAiUmVjb3ZlcmVkIGRhdGEgd2l0aCBuZWdhdGl2ZSBoZWFkIG9mZnNldCJ9LAorCXsweDE3MDQsICJSZWNvdmVyZWQgZGF0YSB3aXRoIHJldHJpZXMgYW5kL29yIGNpcmMgYXBwbGllZCJ9LAorCXsweDE3MDUsICJSZWNvdmVyZWQgZGF0YSB1c2luZyBwcmV2aW91cyBzZWN0b3IgaWQifSwKKwl7MHgxNzA2LCAiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQifSwKKwl7MHgxNzA3LCAiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSByZWNvbW1lbmQgcmVhc3NpZ25tZW50In0sCisJezB4MTcwOCwgIlJlY292ZXJlZCBkYXRhIHdpdGhvdXQgRUNDIC0gcmVjb21tZW5kIHJld3JpdGUifSwKKwl7MHgxNzA5LCAiUmVjb3ZlcmVkIGRhdGEgd2l0aG91dCBFQ0MgLSBkYXRhIHJld3JpdHRlbiJ9LAorCisJezB4MTgwMCwgIlJlY292ZXJlZCBkYXRhIHdpdGggZXJyb3IgY29ycmVjdGlvbiBhcHBsaWVkIn0sCisJezB4MTgwMSwgIlJlY292ZXJlZCBkYXRhIHdpdGggZXJyb3IgY29yci4gJiByZXRyaWVzIGFwcGxpZWQifSwKKwl7MHgxODAyLCAiUmVjb3ZlcmVkIGRhdGEgLSBkYXRhIGF1dG8tcmVhbGxvY2F0ZWQifSwKKwl7MHgxODAzLCAiUmVjb3ZlcmVkIGRhdGEgd2l0aCBDSVJDIn0sCisJezB4MTgwNCwgIlJlY292ZXJlZCBkYXRhIHdpdGggTC1FQyJ9LAorCXsweDE4MDUsICJSZWNvdmVyZWQgZGF0YSAtIHJlY29tbWVuZCByZWFzc2lnbm1lbnQifSwKKwl7MHgxODA2LCAiUmVjb3ZlcmVkIGRhdGEgLSByZWNvbW1lbmQgcmV3cml0ZSJ9LAorCXsweDE4MDcsICJSZWNvdmVyZWQgZGF0YSB3aXRoIEVDQyAtIGRhdGEgcmV3cml0dGVuIn0sCisJezB4MTgwOCwgIlJlY292ZXJlZCBkYXRhIHdpdGggbGlua2luZyJ9LAorCisJezB4MTkwMCwgIkRlZmVjdCBsaXN0IGVycm9yIn0sCisJezB4MTkwMSwgIkRlZmVjdCBsaXN0IG5vdCBhdmFpbGFibGUifSwKKwl7MHgxOTAyLCAiRGVmZWN0IGxpc3QgZXJyb3IgaW4gcHJpbWFyeSBsaXN0In0sCisJezB4MTkwMywgIkRlZmVjdCBsaXN0IGVycm9yIGluIGdyb3duIGxpc3QifSwKKworCXsweDFBMDAsICJQYXJhbWV0ZXIgbGlzdCBsZW5ndGggZXJyb3IifSwKKworCXsweDFCMDAsICJTeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVyIGVycm9yIn0sCisKKwl7MHgxQzAwLCAiRGVmZWN0IGxpc3Qgbm90IGZvdW5kIn0sCisJezB4MUMwMSwgIlByaW1hcnkgZGVmZWN0IGxpc3Qgbm90IGZvdW5kIn0sCisJezB4MUMwMiwgIkdyb3duIGRlZmVjdCBsaXN0IG5vdCBmb3VuZCJ9LAorCisJezB4MUQwMCwgIk1pc2NvbXBhcmUgZHVyaW5nIHZlcmlmeSBvcGVyYXRpb24ifSwKKworCXsweDFFMDAsICJSZWNvdmVyZWQgaWQgd2l0aCBFQ0MgY29ycmVjdGlvbiJ9LAorCisJezB4MUYwMCwgIlBhcnRpYWwgZGVmZWN0IGxpc3QgdHJhbnNmZXIifSwKKworCXsweDIwMDAsICJJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUifSwKKwl7MHgyMDAxLCAiQWNjZXNzIGRlbmllZCAtIGluaXRpYXRvciBwZW5kaW5nLWVucm9sbGVkIn0sCisJezB4MjAwMiwgIkFjY2VzcyBkZW5pZWQgLSBubyBhY2Nlc3MgcmlnaHRzIn0sCisJezB4MjAwMywgIkFjY2VzcyBkZW5pZWQgLSBpbnZhbGlkIG1nbXQgaWQga2V5In0sCisJezB4MjAwNCwgIklsbGVnYWwgY29tbWFuZCB3aGlsZSBpbiB3cml0ZSBjYXBhYmxlIHN0YXRlIn0sCisJezB4MjAwNSwgIk9ic29sZXRlIn0sCisJezB4MjAwNiwgIklsbGVnYWwgY29tbWFuZCB3aGlsZSBpbiBleHBsaWNpdCBhZGRyZXNzIG1vZGUifSwKKwl7MHgyMDA3LCAiSWxsZWdhbCBjb21tYW5kIHdoaWxlIGluIGltcGxpY2l0IGFkZHJlc3MgbW9kZSJ9LAorCXsweDIwMDgsICJBY2Nlc3MgZGVuaWVkIC0gZW5yb2xsbWVudCBjb25mbGljdCJ9LAorCXsweDIwMDksICJBY2Nlc3MgZGVuaWVkIC0gaW52YWxpZCBMVSBpZGVudGlmaWVyIn0sCisJezB4MjAwQSwgIkFjY2VzcyBkZW5pZWQgLSBpbnZhbGlkIHByb3h5IHRva2VuIn0sCisJezB4MjAwQiwgIkFjY2VzcyBkZW5pZWQgLSBBQ0wgTFVOIGNvbmZsaWN0In0sCisKKwl7MHgyMTAwLCAiTG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZSJ9LAorCXsweDIxMDEsICJJbnZhbGlkIGVsZW1lbnQgYWRkcmVzcyJ9LAorCXsweDIxMDIsICJJbnZhbGlkIGFkZHJlc3MgZm9yIHdyaXRlIn0sCisKKwl7MHgyMjAwLCAiSWxsZWdhbCBmdW5jdGlvbiAodXNlIDIwIDAwLCAyNCAwMCwgb3IgMjYgMDApIn0sCisKKwl7MHgyNDAwLCAiSW52YWxpZCBmaWVsZCBpbiBjZGIifSwKKwl7MHgyNDAxLCAiQ0RCIGRlY3J5cHRpb24gZXJyb3IifSwKKwl7MHgyNDA0LCAiU2VjdXJpdHkgYXVkaXQgdmFsdWUgZnJvemVuIn0sCisJezB4MjQwNSwgIlNlY3VyaXR5IHdvcmtpbmcga2V5IGZyb3plbiJ9LAorCXsweDI0MDYsICJOb25jZSBub3QgdW5pcXVlIn0sCisJezB4MjQwNywgIk5vbmNlIHRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UifSwKKworCXsweDI1MDAsICJMb2dpY2FsIHVuaXQgbm90IHN1cHBvcnRlZCJ9LAorCisJezB4MjYwMCwgIkludmFsaWQgZmllbGQgaW4gcGFyYW1ldGVyIGxpc3QifSwKKwl7MHgyNjAxLCAiUGFyYW1ldGVyIG5vdCBzdXBwb3J0ZWQifSwKKwl7MHgyNjAyLCAiUGFyYW1ldGVyIHZhbHVlIGludmFsaWQifSwKKwl7MHgyNjAzLCAiVGhyZXNob2xkIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCJ9LAorCXsweDI2MDQsICJJbnZhbGlkIHJlbGVhc2Ugb2YgcGVyc2lzdGVudCByZXNlcnZhdGlvbiJ9LAorCXsweDI2MDUsICJEYXRhIGRlY3J5cHRpb24gZXJyb3IifSwKKwl7MHgyNjA2LCAiVG9vIG1hbnkgdGFyZ2V0IGRlc2NyaXB0b3JzIn0sCisJezB4MjYwNywgIlVuc3VwcG9ydGVkIHRhcmdldCBkZXNjcmlwdG9yIHR5cGUgY29kZSJ9LAorCXsweDI2MDgsICJUb28gbWFueSBzZWdtZW50IGRlc2NyaXB0b3JzIn0sCisJezB4MjYwOSwgIlVuc3VwcG9ydGVkIHNlZ21lbnQgZGVzY3JpcHRvciB0eXBlIGNvZGUifSwKKwl7MHgyNjBBLCAiVW5leHBlY3RlZCBpbmV4YWN0IHNlZ21lbnQifSwKKwl7MHgyNjBCLCAiSW5saW5lIGRhdGEgbGVuZ3RoIGV4Y2VlZGVkIn0sCisJezB4MjYwQywgIkludmFsaWQgb3BlcmF0aW9uIGZvciBjb3B5IHNvdXJjZSBvciBkZXN0aW5hdGlvbiJ9LAorCXsweDI2MEQsICJDb3B5IHNlZ21lbnQgZ3JhbnVsYXJpdHkgdmlvbGF0aW9uIn0sCisJezB4MjYwRSwgIkludmFsaWQgcGFyYW1ldGVyIHdoaWxlIHBvcnQgaXMgZW5hYmxlZCJ9LAorCXsweDI2MEYsICJJbnZhbGlkIGRhdGEtb3V0IGJ1ZmZlciBpbnRlZ3JpdHkifSwKKworCXsweDI3MDAsICJXcml0ZSBwcm90ZWN0ZWQifSwKKwl7MHgyNzAxLCAiSGFyZHdhcmUgd3JpdGUgcHJvdGVjdGVkIn0sCisJezB4MjcwMiwgIkxvZ2ljYWwgdW5pdCBzb2Z0d2FyZSB3cml0ZSBwcm90ZWN0ZWQifSwKKwl7MHgyNzAzLCAiQXNzb2NpYXRlZCB3cml0ZSBwcm90ZWN0In0sCisJezB4MjcwNCwgIlBlcnNpc3RlbnQgd3JpdGUgcHJvdGVjdCJ9LAorCXsweDI3MDUsICJQZXJtYW5lbnQgd3JpdGUgcHJvdGVjdCJ9LAorCXsweDI3MDYsICJDb25kaXRpb25hbCB3cml0ZSBwcm90ZWN0In0sCisKKwl7MHgyODAwLCAiTm90IHJlYWR5IHRvIHJlYWR5IGNoYW5nZSwgbWVkaXVtIG1heSBoYXZlIGNoYW5nZWQifSwKKwl7MHgyODAxLCAiSW1wb3J0IG9yIGV4cG9ydCBlbGVtZW50IGFjY2Vzc2VkIn0sCisKKwl7MHgyOTAwLCAiUG93ZXIgb24sIHJlc2V0LCBvciBidXMgZGV2aWNlIHJlc2V0IG9jY3VycmVkIn0sCisJezB4MjkwMSwgIlBvd2VyIG9uIG9jY3VycmVkIn0sCisJezB4MjkwMiwgIlNjc2kgYnVzIHJlc2V0IG9jY3VycmVkIn0sCisJezB4MjkwMywgIkJ1cyBkZXZpY2UgcmVzZXQgZnVuY3Rpb24gb2NjdXJyZWQifSwKKwl7MHgyOTA0LCAiRGV2aWNlIGludGVybmFsIHJlc2V0In0sCisJezB4MjkwNSwgIlRyYW5zY2VpdmVyIG1vZGUgY2hhbmdlZCB0byBzaW5nbGUtZW5kZWQifSwKKwl7MHgyOTA2LCAiVHJhbnNjZWl2ZXIgbW9kZSBjaGFuZ2VkIHRvIGx2ZCJ9LAorCXsweDI5MDcsICJJX1QgbmV4dXMgbG9zcyBvY2N1cnJlZCJ9LAorCisJezB4MkEwMCwgIlBhcmFtZXRlcnMgY2hhbmdlZCJ9LAorCXsweDJBMDEsICJNb2RlIHBhcmFtZXRlcnMgY2hhbmdlZCJ9LAorCXsweDJBMDIsICJMb2cgcGFyYW1ldGVycyBjaGFuZ2VkIn0sCisJezB4MkEwMywgIlJlc2VydmF0aW9ucyBwcmVlbXB0ZWQifSwKKwl7MHgyQTA0LCAiUmVzZXJ2YXRpb25zIHJlbGVhc2VkIn0sCisJezB4MkEwNSwgIlJlZ2lzdHJhdGlvbnMgcHJlZW1wdGVkIn0sCisJezB4MkEwNiwgIkFzeW1tZXRyaWMgYWNjZXNzIHN0YXRlIGNoYW5nZWQifSwKKwl7MHgyQTA3LCAiSW1wbGljaXQgYXN5bW1ldHJpYyBhY2Nlc3Mgc3RhdGUgdHJhbnNpdGlvbiBmYWlsZWQifSwKKwl7MHgyQTA4LCAiUHJpb3JpdHkgY2hhbmdlZCJ9LAorCXsweDJBMDksICJDYXBhY2l0eSBkYXRhIGhhcyBjaGFuZ2VkIn0sCisKKwl7MHgyQjAwLCAiQ29weSBjYW5ub3QgZXhlY3V0ZSBzaW5jZSBob3N0IGNhbm5vdCBkaXNjb25uZWN0In0sCisKKwl7MHgyQzAwLCAiQ29tbWFuZCBzZXF1ZW5jZSBlcnJvciJ9LAorCXsweDJDMDEsICJUb28gbWFueSB3aW5kb3dzIHNwZWNpZmllZCJ9LAorCXsweDJDMDIsICJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHdpbmRvd3Mgc3BlY2lmaWVkIn0sCisJezB4MkMwMywgIkN1cnJlbnQgcHJvZ3JhbSBhcmVhIGlzIG5vdCBlbXB0eSJ9LAorCXsweDJDMDQsICJDdXJyZW50IHByb2dyYW0gYXJlYSBpcyBlbXB0eSJ9LAorCXsweDJDMDUsICJJbGxlZ2FsIHBvd2VyIGNvbmRpdGlvbiByZXF1ZXN0In0sCisJezB4MkMwNiwgIlBlcnNpc3RlbnQgcHJldmVudCBjb25mbGljdCJ9LAorCXsweDJDMDcsICJQcmV2aW91cyBidXN5IHN0YXR1cyJ9LAorCXsweDJDMDgsICJQcmV2aW91cyB0YXNrIHNldCBmdWxsIHN0YXR1cyJ9LAorCXsweDJDMDksICJQcmV2aW91cyByZXNlcnZhdGlvbiBjb25mbGljdCBzdGF0dXMifSwKKwl7MHgyQzBBLCAiUGFydGl0aW9uIG9yIGNvbGxlY3Rpb24gY29udGFpbnMgdXNlciBvYmplY3RzIn0sCisJezB4MkMwQiwgIk5vdCByZXNlcnZlZCJ9LAorCisJezB4MkQwMCwgIk92ZXJ3cml0ZSBlcnJvciBvbiB1cGRhdGUgaW4gcGxhY2UifSwKKworCXsweDJFMDAsICJJbnN1ZmZpY2llbnQgdGltZSBmb3Igb3BlcmF0aW9uIn0sCisKKwl7MHgyRjAwLCAiQ29tbWFuZHMgY2xlYXJlZCBieSBhbm90aGVyIGluaXRpYXRvciJ9LAorCisJezB4MzAwMCwgIkluY29tcGF0aWJsZSBtZWRpdW0gaW5zdGFsbGVkIn0sCisJezB4MzAwMSwgIkNhbm5vdCByZWFkIG1lZGl1bSAtIHVua25vd24gZm9ybWF0In0sCisJezB4MzAwMiwgIkNhbm5vdCByZWFkIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQifSwKKwl7MHgzMDAzLCAiQ2xlYW5pbmcgY2FydHJpZGdlIGluc3RhbGxlZCJ9LAorCXsweDMwMDQsICJDYW5ub3Qgd3JpdGUgbWVkaXVtIC0gdW5rbm93biBmb3JtYXQifSwKKwl7MHgzMDA1LCAiQ2Fubm90IHdyaXRlIG1lZGl1bSAtIGluY29tcGF0aWJsZSBmb3JtYXQifSwKKwl7MHgzMDA2LCAiQ2Fubm90IGZvcm1hdCBtZWRpdW0gLSBpbmNvbXBhdGlibGUgbWVkaXVtIn0sCisJezB4MzAwNywgIkNsZWFuaW5nIGZhaWx1cmUifSwKKwl7MHgzMDA4LCAiQ2Fubm90IHdyaXRlIC0gYXBwbGljYXRpb24gY29kZSBtaXNtYXRjaCJ9LAorCXsweDMwMDksICJDdXJyZW50IHNlc3Npb24gbm90IGZpeGF0ZWQgZm9yIGFwcGVuZCJ9LAorCXsweDMwMEEsICJDbGVhbmluZyByZXF1ZXN0IHJlamVjdGVkIn0sCisJezB4MzAwQywgIldPUk0gbWVkaXVtLCBvdmVyd3JpdGUgYXR0ZW1wdGVkIn0sCisJezB4MzAxMCwgIk1lZGl1bSBub3QgZm9ybWF0dGVkIn0sCisKKwl7MHgzMTAwLCAiTWVkaXVtIGZvcm1hdCBjb3JydXB0ZWQifSwKKwl7MHgzMTAxLCAiRm9ybWF0IGNvbW1hbmQgZmFpbGVkIn0sCisJezB4MzEwMiwgIlpvbmVkIGZvcm1hdHRpbmcgZmFpbGVkIGR1ZSB0byBzcGFyZSBsaW5raW5nIn0sCisKKwl7MHgzMjAwLCAiTm8gZGVmZWN0IHNwYXJlIGxvY2F0aW9uIGF2YWlsYWJsZSJ9LAorCXsweDMyMDEsICJEZWZlY3QgbGlzdCB1cGRhdGUgZmFpbHVyZSJ9LAorCisJezB4MzMwMCwgIlRhcGUgbGVuZ3RoIGVycm9yIn0sCisKKwl7MHgzNDAwLCAiRW5jbG9zdXJlIGZhaWx1cmUifSwKKworCXsweDM1MDAsICJFbmNsb3N1cmUgc2VydmljZXMgZmFpbHVyZSJ9LAorCXsweDM1MDEsICJVbnN1cHBvcnRlZCBlbmNsb3N1cmUgZnVuY3Rpb24ifSwKKwl7MHgzNTAyLCAiRW5jbG9zdXJlIHNlcnZpY2VzIHVuYXZhaWxhYmxlIn0sCisJezB4MzUwMywgIkVuY2xvc3VyZSBzZXJ2aWNlcyB0cmFuc2ZlciBmYWlsdXJlIn0sCisJezB4MzUwNCwgIkVuY2xvc3VyZSBzZXJ2aWNlcyB0cmFuc2ZlciByZWZ1c2VkIn0sCisJezB4MzUwNSwgIkVuY2xvc3VyZSBzZXJ2aWNlcyBjaGVja3N1bSBlcnJvciJ9LAorCisJezB4MzYwMCwgIlJpYmJvbiwgaW5rLCBvciB0b25lciBmYWlsdXJlIn0sCisKKwl7MHgzNzAwLCAiUm91bmRlZCBwYXJhbWV0ZXIifSwKKworCXsweDM4MDAsICJFdmVudCBzdGF0dXMgbm90aWZpY2F0aW9uIn0sCisJezB4MzgwMiwgIkVzbiAtIHBvd2VyIG1hbmFnZW1lbnQgY2xhc3MgZXZlbnQifSwKKwl7MHgzODA0LCAiRXNuIC0gbWVkaWEgY2xhc3MgZXZlbnQifSwKKwl7MHgzODA2LCAiRXNuIC0gZGV2aWNlIGJ1c3kgY2xhc3MgZXZlbnQifSwKKworCXsweDM5MDAsICJTYXZpbmcgcGFyYW1ldGVycyBub3Qgc3VwcG9ydGVkIn0sCisKKwl7MHgzQTAwLCAiTWVkaXVtIG5vdCBwcmVzZW50In0sCisJezB4M0EwMSwgIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgY2xvc2VkIn0sCisJezB4M0EwMiwgIk1lZGl1bSBub3QgcHJlc2VudCAtIHRyYXkgb3BlbiJ9LAorCXsweDNBMDMsICJNZWRpdW0gbm90IHByZXNlbnQgLSBsb2FkYWJsZSJ9LAorCXsweDNBMDQsICJNZWRpdW0gbm90IHByZXNlbnQgLSBtZWRpdW0gYXV4aWxpYXJ5IG1lbW9yeSBhY2Nlc3NpYmxlIn0sCisKKwl7MHgzQjAwLCAiU2VxdWVudGlhbCBwb3NpdGlvbmluZyBlcnJvciJ9LAorCXsweDNCMDEsICJUYXBlIHBvc2l0aW9uIGVycm9yIGF0IGJlZ2lubmluZy1vZi1tZWRpdW0ifSwKKwl7MHgzQjAyLCAiVGFwZSBwb3NpdGlvbiBlcnJvciBhdCBlbmQtb2YtbWVkaXVtIn0sCisJezB4M0IwMywgIlRhcGUgb3IgZWxlY3Ryb25pYyB2ZXJ0aWNhbCBmb3JtcyB1bml0IG5vdCByZWFkeSJ9LAorCXsweDNCMDQsICJTbGV3IGZhaWx1cmUifSwKKwl7MHgzQjA1LCAiUGFwZXIgamFtIn0sCisJezB4M0IwNiwgIkZhaWxlZCB0byBzZW5zZSB0b3Atb2YtZm9ybSJ9LAorCXsweDNCMDcsICJGYWlsZWQgdG8gc2Vuc2UgYm90dG9tLW9mLWZvcm0ifSwKKwl7MHgzQjA4LCAiUmVwb3NpdGlvbiBlcnJvciJ9LAorCXsweDNCMDksICJSZWFkIHBhc3QgZW5kIG9mIG1lZGl1bSJ9LAorCXsweDNCMEEsICJSZWFkIHBhc3QgYmVnaW5uaW5nIG9mIG1lZGl1bSJ9LAorCXsweDNCMEIsICJQb3NpdGlvbiBwYXN0IGVuZCBvZiBtZWRpdW0ifSwKKwl7MHgzQjBDLCAiUG9zaXRpb24gcGFzdCBiZWdpbm5pbmcgb2YgbWVkaXVtIn0sCisJezB4M0IwRCwgIk1lZGl1bSBkZXN0aW5hdGlvbiBlbGVtZW50IGZ1bGwifSwKKwl7MHgzQjBFLCAiTWVkaXVtIHNvdXJjZSBlbGVtZW50IGVtcHR5In0sCisJezB4M0IwRiwgIkVuZCBvZiBtZWRpdW0gcmVhY2hlZCJ9LAorCXsweDNCMTEsICJNZWRpdW0gbWFnYXppbmUgbm90IGFjY2Vzc2libGUifSwKKwl7MHgzQjEyLCAiTWVkaXVtIG1hZ2F6aW5lIHJlbW92ZWQifSwKKwl7MHgzQjEzLCAiTWVkaXVtIG1hZ2F6aW5lIGluc2VydGVkIn0sCisJezB4M0IxNCwgIk1lZGl1bSBtYWdhemluZSBsb2NrZWQifSwKKwl7MHgzQjE1LCAiTWVkaXVtIG1hZ2F6aW5lIHVubG9ja2VkIn0sCisJezB4M0IxNiwgIk1lY2hhbmljYWwgcG9zaXRpb25pbmcgb3IgY2hhbmdlciBlcnJvciJ9LAorCXsweDNCMTcsICJSZWFkIHBhc3QgZW5kIG9mIHVzZXIgb2JqZWN0In0sCisKKwl7MHgzRDAwLCAiSW52YWxpZCBiaXRzIGluIGlkZW50aWZ5IG1lc3NhZ2UifSwKKworCXsweDNFMDAsICJMb2dpY2FsIHVuaXQgaGFzIG5vdCBzZWxmLWNvbmZpZ3VyZWQgeWV0In0sCisJezB4M0UwMSwgIkxvZ2ljYWwgdW5pdCBmYWlsdXJlIn0sCisJezB4M0UwMiwgIlRpbWVvdXQgb24gbG9naWNhbCB1bml0In0sCisJezB4M0UwMywgIkxvZ2ljYWwgdW5pdCBmYWlsZWQgc2VsZi10ZXN0In0sCisJezB4M0UwNCwgIkxvZ2ljYWwgdW5pdCB1bmFibGUgdG8gdXBkYXRlIHNlbGYtdGVzdCBsb2cifSwKKworCXsweDNGMDAsICJUYXJnZXQgb3BlcmF0aW5nIGNvbmRpdGlvbnMgaGF2ZSBjaGFuZ2VkIn0sCisJezB4M0YwMSwgIk1pY3JvY29kZSBoYXMgYmVlbiBjaGFuZ2VkIn0sCisJezB4M0YwMiwgIkNoYW5nZWQgb3BlcmF0aW5nIGRlZmluaXRpb24ifSwKKwl7MHgzRjAzLCAiSW5xdWlyeSBkYXRhIGhhcyBjaGFuZ2VkIn0sCisJezB4M0YwNCwgIkNvbXBvbmVudCBkZXZpY2UgYXR0YWNoZWQifSwKKwl7MHgzRjA1LCAiRGV2aWNlIGlkZW50aWZpZXIgY2hhbmdlZCJ9LAorCXsweDNGMDYsICJSZWR1bmRhbmN5IGdyb3VwIGNyZWF0ZWQgb3IgbW9kaWZpZWQifSwKKwl7MHgzRjA3LCAiUmVkdW5kYW5jeSBncm91cCBkZWxldGVkIn0sCisJezB4M0YwOCwgIlNwYXJlIGNyZWF0ZWQgb3IgbW9kaWZpZWQifSwKKwl7MHgzRjA5LCAiU3BhcmUgZGVsZXRlZCJ9LAorCXsweDNGMEEsICJWb2x1bWUgc2V0IGNyZWF0ZWQgb3IgbW9kaWZpZWQifSwKKwl7MHgzRjBCLCAiVm9sdW1lIHNldCBkZWxldGVkIn0sCisJezB4M0YwQywgIlZvbHVtZSBzZXQgZGVhc3NpZ25lZCJ9LAorCXsweDNGMEQsICJWb2x1bWUgc2V0IHJlYXNzaWduZWQifSwKKwl7MHgzRjBFLCAiUmVwb3J0ZWQgbHVucyBkYXRhIGhhcyBjaGFuZ2VkIn0sCisJezB4M0YwRiwgIkVjaG8gYnVmZmVyIG92ZXJ3cml0dGVuIn0sCisJezB4M0YxMCwgIk1lZGl1bSBsb2FkYWJsZSJ9LAorCXsweDNGMTEsICJNZWRpdW0gYXV4aWxpYXJ5IG1lbW9yeSBhY2Nlc3NpYmxlIn0sCisvKgorICoJezB4NDBOTiwgIlJhbSBmYWlsdXJlIn0sCisgKgl7MHg0ME5OLCAiRGlhZ25vc3RpYyBmYWlsdXJlIG9uIGNvbXBvbmVudCBubiJ9LAorICoJezB4NDFOTiwgIkRhdGEgcGF0aCBmYWlsdXJlIn0sCisgKgl7MHg0Mk5OLCAiUG93ZXItb24gb3Igc2VsZi10ZXN0IGZhaWx1cmUifSwKKyAqLworCXsweDQzMDAsICJNZXNzYWdlIGVycm9yIn0sCisKKwl7MHg0NDAwLCAiSW50ZXJuYWwgdGFyZ2V0IGZhaWx1cmUifSwKKworCXsweDQ1MDAsICJTZWxlY3Qgb3IgcmVzZWxlY3QgZmFpbHVyZSJ9LAorCisJezB4NDYwMCwgIlVuc3VjY2Vzc2Z1bCBzb2Z0IHJlc2V0In0sCisKKwl7MHg0NzAwLCAiU2NzaSBwYXJpdHkgZXJyb3IifSwKKwl7MHg0NzAxLCAiRGF0YSBwaGFzZSBDUkMgZXJyb3IgZGV0ZWN0ZWQifSwKKwl7MHg0NzAyLCAiU2NzaSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIHN0IGRhdGEgcGhhc2UifSwKKwl7MHg0NzAzLCAiSW5mb3JtYXRpb24gdW5pdCBDUkMgZXJyb3IgZGV0ZWN0ZWQifSwKKwl7MHg0NzA0LCAiQXN5bmNocm9ub3VzIGluZm9ybWF0aW9uIHByb3RlY3Rpb24gZXJyb3IgZGV0ZWN0ZWQifSwKKwl7MHg0NzA1LCAiUHJvdG9jb2wgc2VydmljZSBDUkMgZXJyb3IifSwKKwl7MHg0NzdmLCAiU29tZSBjb21tYW5kcyBjbGVhcmVkIGJ5IGlTQ1NJIFByb3RvY29sIGV2ZW50In0sCisKKwl7MHg0ODAwLCAiSW5pdGlhdG9yIGRldGVjdGVkIGVycm9yIG1lc3NhZ2UgcmVjZWl2ZWQifSwKKworCXsweDQ5MDAsICJJbnZhbGlkIG1lc3NhZ2UgZXJyb3IifSwKKworCXsweDRBMDAsICJDb21tYW5kIHBoYXNlIGVycm9yIn0sCisKKwl7MHg0QjAwLCAiRGF0YSBwaGFzZSBlcnJvciJ9LAorCXsweDRCMDEsICJJbnZhbGlkIHRhcmdldCBwb3J0IHRyYW5zZmVyIHRhZyByZWNlaXZlZCJ9LAorCXsweDRCMDIsICJUb28gbXVjaCB3cml0ZSBkYXRhIn0sCisJezB4NEIwMywgIkFjay9uYWsgdGltZW91dCJ9LAorCXsweDRCMDQsICJOYWsgcmVjZWl2ZWQifSwKKwl7MHg0QjA1LCAiRGF0YSBvZmZzZXQgZXJyb3IifSwKKwl7MHg0QjA2LCAiSW5pdGlhdG9yIHJlc3BvbnNlIHRpbWVvdXQifSwKKworCXsweDRDMDAsICJMb2dpY2FsIHVuaXQgZmFpbGVkIHNlbGYtY29uZmlndXJhdGlvbiJ9LAorLyoKKyAqCXsweDRETk4sICJUYWdnZWQgb3ZlcmxhcHBlZCBjb21tYW5kcyAobm4gPSBxdWV1ZSB0YWcpIn0sCisgKi8KKwl7MHg0RTAwLCAiT3ZlcmxhcHBlZCBjb21tYW5kcyBhdHRlbXB0ZWQifSwKKworCXsweDUwMDAsICJXcml0ZSBhcHBlbmQgZXJyb3IifSwKKwl7MHg1MDAxLCAiV3JpdGUgYXBwZW5kIHBvc2l0aW9uIGVycm9yIn0sCisJezB4NTAwMiwgIlBvc2l0aW9uIGVycm9yIHJlbGF0ZWQgdG8gdGltaW5nIn0sCisKKwl7MHg1MTAwLCAiRXJhc2UgZmFpbHVyZSJ9LAorCXsweDUxMDEsICJFcmFzZSBmYWlsdXJlIC0gaW5jb21wbGV0ZSBlcmFzZSBvcGVyYXRpb24gZGV0ZWN0ZWQifSwKKworCXsweDUyMDAsICJDYXJ0cmlkZ2UgZmF1bHQifSwKKworCXsweDUzMDAsICJNZWRpYSBsb2FkIG9yIGVqZWN0IGZhaWxlZCJ9LAorCXsweDUzMDEsICJVbmxvYWQgdGFwZSBmYWlsdXJlIn0sCisJezB4NTMwMiwgIk1lZGl1bSByZW1vdmFsIHByZXZlbnRlZCJ9LAorCisJezB4NTQwMCwgIlNjc2kgdG8gaG9zdCBzeXN0ZW0gaW50ZXJmYWNlIGZhaWx1cmUifSwKKworCXsweDU1MDAsICJTeXN0ZW0gcmVzb3VyY2UgZmFpbHVyZSJ9LAorCXsweDU1MDEsICJTeXN0ZW0gYnVmZmVyIGZ1bGwifSwKKwl7MHg1NTAyLCAiSW5zdWZmaWNpZW50IHJlc2VydmF0aW9uIHJlc291cmNlcyJ9LAorCXsweDU1MDMsICJJbnN1ZmZpY2llbnQgcmVzb3VyY2VzIn0sCisJezB4NTUwNCwgIkluc3VmZmljaWVudCByZWdpc3RyYXRpb24gcmVzb3VyY2VzIn0sCisJezB4NTUwNSwgIkluc3VmZmljaWVudCBhY2Nlc3MgY29udHJvbCByZXNvdXJjZXMifSwKKwl7MHg1NTA2LCAiQXV4aWxpYXJ5IG1lbW9yeSBvdXQgb2Ygc3BhY2UifSwKKwl7MHg1NTA3LCAiUXVvdGEgZXJyb3IifSwKKworCXsweDU3MDAsICJVbmFibGUgdG8gcmVjb3ZlciB0YWJsZS1vZi1jb250ZW50cyJ9LAorCisJezB4NTgwMCwgIkdlbmVyYXRpb24gZG9lcyBub3QgZXhpc3QifSwKKworCXsweDU5MDAsICJVcGRhdGVkIGJsb2NrIHJlYWQifSwKKworCXsweDVBMDAsICJPcGVyYXRvciByZXF1ZXN0IG9yIHN0YXRlIGNoYW5nZSBpbnB1dCJ9LAorCXsweDVBMDEsICJPcGVyYXRvciBtZWRpdW0gcmVtb3ZhbCByZXF1ZXN0In0sCisJezB4NUEwMiwgIk9wZXJhdG9yIHNlbGVjdGVkIHdyaXRlIHByb3RlY3QifSwKKwl7MHg1QTAzLCAiT3BlcmF0b3Igc2VsZWN0ZWQgd3JpdGUgcGVybWl0In0sCisKKwl7MHg1QjAwLCAiTG9nIGV4Y2VwdGlvbiJ9LAorCXsweDVCMDEsICJUaHJlc2hvbGQgY29uZGl0aW9uIG1ldCJ9LAorCXsweDVCMDIsICJMb2cgY291bnRlciBhdCBtYXhpbXVtIn0sCisJezB4NUIwMywgIkxvZyBsaXN0IGNvZGVzIGV4aGF1c3RlZCJ9LAorCisJezB4NUMwMCwgIlJwbCBzdGF0dXMgY2hhbmdlIn0sCisJezB4NUMwMSwgIlNwaW5kbGVzIHN5bmNocm9uaXplZCJ9LAorCXsweDVDMDIsICJTcGluZGxlcyBub3Qgc3luY2hyb25pemVkIn0sCisKKwl7MHg1RDAwLCAiRmFpbHVyZSBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCJ9LAorCXsweDVEMDEsICJNZWRpYSBmYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIn0sCisJezB4NUQwMiwgIkxvZ2ljYWwgdW5pdCBmYWlsdXJlIHByZWRpY3Rpb24gdGhyZXNob2xkIGV4Y2VlZGVkIn0sCisJezB4NUQwMywgIlNwYXJlIGFyZWEgZXhoYXVzdGlvbiBwcmVkaWN0aW9uIHRocmVzaG9sZCBleGNlZWRlZCJ9LAorCXsweDVEMTAsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBnZW5lcmFsIGhhcmQgZHJpdmUgZmFpbHVyZSJ9LAorCXsweDVEMTEsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQxMiwgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIGRhdGEgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMTMsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDE0LCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgdG9vIG1hbnkgYmxvY2sgcmVhc3NpZ25zIn0sCisJezB4NUQxNSwgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIGFjY2VzcyB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVEMTYsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzdGFydCB1bml0IHRpbWVzIHRvbyBoaWdoIn0sCisJezB4NUQxNywgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIGNoYW5uZWwgcGFyYW1ldHJpY3MifSwKKwl7MHg1RDE4LCAiSGFyZHdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgY29udHJvbGxlciBkZXRlY3RlZCJ9LAorCXsweDVEMTksICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIn0sCisJezB4NUQxQSwgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgdGltZSBwZXJmb3JtYW5jZSJ9LAorCXsweDVEMUIsICJIYXJkd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzcGluLXVwIHJldHJ5IGNvdW50In0sCisJezB4NUQxQywgIkhhcmR3YXJlIGltcGVuZGluZyBmYWlsdXJlIGRyaXZlIGNhbGlicmF0aW9uIHJldHJ5IGNvdW50In0sCisJezB4NUQyMCwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgZ2VuZXJhbCBoYXJkIGRyaXZlIGZhaWx1cmUifSwKKwl7MHg1RDIxLCAiQ29udHJvbGxlciBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQyMiwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgZGF0YSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQyMywgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgc2VlayBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQyNCwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgdG9vIG1hbnkgYmxvY2sgcmVhc3NpZ25zIn0sCisJezB4NUQyNSwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgYWNjZXNzIHRpbWVzIHRvbyBoaWdoIn0sCisJezB4NUQyNiwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgc3RhcnQgdW5pdCB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVEMjcsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIGNoYW5uZWwgcGFyYW1ldHJpY3MifSwKKwl7MHg1RDI4LCAiQ29udHJvbGxlciBpbXBlbmRpbmcgZmFpbHVyZSBjb250cm9sbGVyIGRldGVjdGVkIn0sCisJezB4NUQyOSwgIkNvbnRyb2xsZXIgaW1wZW5kaW5nIGZhaWx1cmUgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSJ9LAorCXsweDVEMkEsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgdGltZSBwZXJmb3JtYW5jZSJ9LAorCXsweDVEMkIsICJDb250cm9sbGVyIGltcGVuZGluZyBmYWlsdXJlIHNwaW4tdXAgcmV0cnkgY291bnQifSwKKwl7MHg1RDJDLCAiQ29udHJvbGxlciBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBjYWxpYnJhdGlvbiByZXRyeSBjb3VudCJ9LAorCXsweDVEMzAsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgZ2VuZXJhbCBoYXJkIGRyaXZlIGZhaWx1cmUifSwKKwl7MHg1RDMxLCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIGRyaXZlIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDMyLCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIGRhdGEgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVEMzMsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgc2VlayBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQzNCwgIkRhdGEgY2hhbm5lbCBpbXBlbmRpbmcgZmFpbHVyZSB0b28gbWFueSBibG9jayByZWFzc2lnbnMifSwKKwl7MHg1RDM1LCAiRGF0YSBjaGFubmVsIGltcGVuZGluZyBmYWlsdXJlIGFjY2VzcyB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVEMzYsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgc3RhcnQgdW5pdCB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVEMzcsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgY2hhbm5lbCBwYXJhbWV0cmljcyJ9LAorCXsweDVEMzgsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgY29udHJvbGxlciBkZXRlY3RlZCJ9LAorCXsweDVEMzksICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSJ9LAorCXsweDVEM0EsICJEYXRhIGNoYW5uZWwgaW1wZW5kaW5nIGZhaWx1cmUgc2VlayB0aW1lIHBlcmZvcm1hbmNlIn0sCisJezB4NUQzQiwgIkRhdGEgY2hhbm5lbCBpbXBlbmRpbmcgZmFpbHVyZSBzcGluLXVwIHJldHJ5IGNvdW50In0sCisJezB4NUQzQywgIkRhdGEgY2hhbm5lbCBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBjYWxpYnJhdGlvbiByZXRyeSAiCisJICJjb3VudCJ9LAorCXsweDVENDAsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBnZW5lcmFsIGhhcmQgZHJpdmUgZmFpbHVyZSJ9LAorCXsweDVENDEsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ0MiwgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIGRhdGEgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENDMsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDQ0LCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgdG9vIG1hbnkgYmxvY2sgcmVhc3NpZ25zIn0sCisJezB4NUQ0NSwgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIGFjY2VzcyB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVENDYsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBzdGFydCB1bml0IHRpbWVzIHRvbyBoaWdoIn0sCisJezB4NUQ0NywgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIGNoYW5uZWwgcGFyYW1ldHJpY3MifSwKKwl7MHg1RDQ4LCAiU2Vydm8gaW1wZW5kaW5nIGZhaWx1cmUgY29udHJvbGxlciBkZXRlY3RlZCJ9LAorCXsweDVENDksICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIn0sCisJezB4NUQ0QSwgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgdGltZSBwZXJmb3JtYW5jZSJ9LAorCXsweDVENEIsICJTZXJ2byBpbXBlbmRpbmcgZmFpbHVyZSBzcGluLXVwIHJldHJ5IGNvdW50In0sCisJezB4NUQ0QywgIlNlcnZvIGltcGVuZGluZyBmYWlsdXJlIGRyaXZlIGNhbGlicmF0aW9uIHJldHJ5IGNvdW50In0sCisJezB4NUQ1MCwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgZ2VuZXJhbCBoYXJkIGRyaXZlIGZhaWx1cmUifSwKKwl7MHg1RDUxLCAiU3BpbmRsZSBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ1MiwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgZGF0YSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ1MywgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgc2VlayBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ1NCwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgdG9vIG1hbnkgYmxvY2sgcmVhc3NpZ25zIn0sCisJezB4NUQ1NSwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgYWNjZXNzIHRpbWVzIHRvbyBoaWdoIn0sCisJezB4NUQ1NiwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgc3RhcnQgdW5pdCB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVENTcsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIGNoYW5uZWwgcGFyYW1ldHJpY3MifSwKKwl7MHg1RDU4LCAiU3BpbmRsZSBpbXBlbmRpbmcgZmFpbHVyZSBjb250cm9sbGVyIGRldGVjdGVkIn0sCisJezB4NUQ1OSwgIlNwaW5kbGUgaW1wZW5kaW5nIGZhaWx1cmUgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSJ9LAorCXsweDVENUEsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgdGltZSBwZXJmb3JtYW5jZSJ9LAorCXsweDVENUIsICJTcGluZGxlIGltcGVuZGluZyBmYWlsdXJlIHNwaW4tdXAgcmV0cnkgY291bnQifSwKKwl7MHg1RDVDLCAiU3BpbmRsZSBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBjYWxpYnJhdGlvbiByZXRyeSBjb3VudCJ9LAorCXsweDVENjAsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBnZW5lcmFsIGhhcmQgZHJpdmUgZmFpbHVyZSJ9LAorCXsweDVENjEsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBkcml2ZSBlcnJvciByYXRlIHRvbyBoaWdoIn0sCisJezB4NUQ2MiwgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIGRhdGEgZXJyb3IgcmF0ZSB0b28gaGlnaCJ9LAorCXsweDVENjMsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzZWVrIGVycm9yIHJhdGUgdG9vIGhpZ2gifSwKKwl7MHg1RDY0LCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgdG9vIG1hbnkgYmxvY2sgcmVhc3NpZ25zIn0sCisJezB4NUQ2NSwgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIGFjY2VzcyB0aW1lcyB0b28gaGlnaCJ9LAorCXsweDVENjYsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzdGFydCB1bml0IHRpbWVzIHRvbyBoaWdoIn0sCisJezB4NUQ2NywgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIGNoYW5uZWwgcGFyYW1ldHJpY3MifSwKKwl7MHg1RDY4LCAiRmlybXdhcmUgaW1wZW5kaW5nIGZhaWx1cmUgY29udHJvbGxlciBkZXRlY3RlZCJ9LAorCXsweDVENjksICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIn0sCisJezB4NUQ2QSwgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIHNlZWsgdGltZSBwZXJmb3JtYW5jZSJ9LAorCXsweDVENkIsICJGaXJtd2FyZSBpbXBlbmRpbmcgZmFpbHVyZSBzcGluLXVwIHJldHJ5IGNvdW50In0sCisJezB4NUQ2QywgIkZpcm13YXJlIGltcGVuZGluZyBmYWlsdXJlIGRyaXZlIGNhbGlicmF0aW9uIHJldHJ5IGNvdW50In0sCisJezB4NURGRiwgIkZhaWx1cmUgcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQgKGZhbHNlKSJ9LAorCisJezB4NUUwMCwgIkxvdyBwb3dlciBjb25kaXRpb24gb24ifSwKKwl7MHg1RTAxLCAiSWRsZSBjb25kaXRpb24gYWN0aXZhdGVkIGJ5IHRpbWVyIn0sCisJezB4NUUwMiwgIlN0YW5kYnkgY29uZGl0aW9uIGFjdGl2YXRlZCBieSB0aW1lciJ9LAorCXsweDVFMDMsICJJZGxlIGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgY29tbWFuZCJ9LAorCXsweDVFMDQsICJTdGFuZGJ5IGNvbmRpdGlvbiBhY3RpdmF0ZWQgYnkgY29tbWFuZCJ9LAorCXsweDVFNDEsICJQb3dlciBzdGF0ZSBjaGFuZ2UgdG8gYWN0aXZlIn0sCisJezB4NUU0MiwgIlBvd2VyIHN0YXRlIGNoYW5nZSB0byBpZGxlIn0sCisJezB4NUU0MywgIlBvd2VyIHN0YXRlIGNoYW5nZSB0byBzdGFuZGJ5In0sCisJezB4NUU0NSwgIlBvd2VyIHN0YXRlIGNoYW5nZSB0byBzbGVlcCJ9LAorCXsweDVFNDcsICJQb3dlciBzdGF0ZSBjaGFuZ2UgdG8gZGV2aWNlIGNvbnRyb2wifSwKKworCXsweDYwMDAsICJMYW1wIGZhaWx1cmUifSwKKworCXsweDYxMDAsICJWaWRlbyBhY3F1aXNpdGlvbiBlcnJvciJ9LAorCXsweDYxMDEsICJVbmFibGUgdG8gYWNxdWlyZSB2aWRlbyJ9LAorCXsweDYxMDIsICJPdXQgb2YgZm9jdXMifSwKKworCXsweDYyMDAsICJTY2FuIGhlYWQgcG9zaXRpb25pbmcgZXJyb3IifSwKKworCXsweDYzMDAsICJFbmQgb2YgdXNlciBhcmVhIGVuY291bnRlcmVkIG9uIHRoaXMgdHJhY2sifSwKKwl7MHg2MzAxLCAiUGFja2V0IGRvZXMgbm90IGZpdCBpbiBhdmFpbGFibGUgc3BhY2UifSwKKworCXsweDY0MDAsICJJbGxlZ2FsIG1vZGUgZm9yIHRoaXMgdHJhY2sifSwKKwl7MHg2NDAxLCAiSW52YWxpZCBwYWNrZXQgc2l6ZSJ9LAorCisJezB4NjUwMCwgIlZvbHRhZ2UgZmF1bHQifSwKKworCXsweDY2MDAsICJBdXRvbWF0aWMgZG9jdW1lbnQgZmVlZGVyIGNvdmVyIHVwIn0sCisJezB4NjYwMSwgIkF1dG9tYXRpYyBkb2N1bWVudCBmZWVkZXIgbGlmdCB1cCJ9LAorCXsweDY2MDIsICJEb2N1bWVudCBqYW0gaW4gYXV0b21hdGljIGRvY3VtZW50IGZlZWRlciJ9LAorCXsweDY2MDMsICJEb2N1bWVudCBtaXNzIGZlZWQgYXV0b21hdGljIGluIGRvY3VtZW50IGZlZWRlciJ9LAorCisJezB4NjcwMCwgIkNvbmZpZ3VyYXRpb24gZmFpbHVyZSJ9LAorCXsweDY3MDEsICJDb25maWd1cmF0aW9uIG9mIGluY2FwYWJsZSBsb2dpY2FsIHVuaXRzIGZhaWxlZCJ9LAorCXsweDY3MDIsICJBZGQgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDY3MDMsICJNb2RpZmljYXRpb24gb2YgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDY3MDQsICJFeGNoYW5nZSBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIn0sCisJezB4NjcwNSwgIlJlbW92ZSBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIn0sCisJezB4NjcwNiwgIkF0dGFjaG1lbnQgb2YgbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDY3MDcsICJDcmVhdGlvbiBvZiBsb2dpY2FsIHVuaXQgZmFpbGVkIn0sCisJezB4NjcwOCwgIkFzc2lnbiBmYWlsdXJlIG9jY3VycmVkIn0sCisJezB4NjcwOSwgIk11bHRpcGx5IGFzc2lnbmVkIGxvZ2ljYWwgdW5pdCJ9LAorCXsweDY3MEEsICJTZXQgdGFyZ2V0IHBvcnQgZ3JvdXBzIGNvbW1hbmQgZmFpbGVkIn0sCisKKwl7MHg2ODAwLCAiTG9naWNhbCB1bml0IG5vdCBjb25maWd1cmVkIn0sCisKKwl7MHg2OTAwLCAiRGF0YSBsb3NzIG9uIGxvZ2ljYWwgdW5pdCJ9LAorCXsweDY5MDEsICJNdWx0aXBsZSBsb2dpY2FsIHVuaXQgZmFpbHVyZXMifSwKKwl7MHg2OTAyLCAiUGFyaXR5L2RhdGEgbWlzbWF0Y2gifSwKKworCXsweDZBMDAsICJJbmZvcm1hdGlvbmFsLCByZWZlciB0byBsb2cifSwKKworCXsweDZCMDAsICJTdGF0ZSBjaGFuZ2UgaGFzIG9jY3VycmVkIn0sCisJezB4NkIwMSwgIlJlZHVuZGFuY3kgbGV2ZWwgZ290IGJldHRlciJ9LAorCXsweDZCMDIsICJSZWR1bmRhbmN5IGxldmVsIGdvdCB3b3JzZSJ9LAorCisJezB4NkMwMCwgIlJlYnVpbGQgZmFpbHVyZSBvY2N1cnJlZCJ9LAorCisJezB4NkQwMCwgIlJlY2FsY3VsYXRlIGZhaWx1cmUgb2NjdXJyZWQifSwKKworCXsweDZFMDAsICJDb21tYW5kIHRvIGxvZ2ljYWwgdW5pdCBmYWlsZWQifSwKKworCXsweDZGMDAsICJDb3B5IHByb3RlY3Rpb24ga2V5IGV4Y2hhbmdlIGZhaWx1cmUgLSBhdXRoZW50aWNhdGlvbiAiCisJICJmYWlsdXJlIn0sCisJezB4NkYwMSwgIkNvcHkgcHJvdGVjdGlvbiBrZXkgZXhjaGFuZ2UgZmFpbHVyZSAtIGtleSBub3QgcHJlc2VudCJ9LAorCXsweDZGMDIsICJDb3B5IHByb3RlY3Rpb24ga2V5IGV4Y2hhbmdlIGZhaWx1cmUgLSBrZXkgbm90IGVzdGFibGlzaGVkIn0sCisJezB4NkYwMywgIlJlYWQgb2Ygc2NyYW1ibGVkIHNlY3RvciB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIn0sCisJezB4NkYwNCwgIk1lZGlhIHJlZ2lvbiBjb2RlIGlzIG1pc21hdGNoZWQgdG8gbG9naWNhbCB1bml0IHJlZ2lvbiJ9LAorCXsweDZGMDUsICJEcml2ZSByZWdpb24gbXVzdCBiZSBwZXJtYW5lbnQvcmVnaW9uIHJlc2V0IGNvdW50IGVycm9yIn0sCisvKgorICoJezB4NzBOTiwgIkRlY29tcHJlc3Npb24gZXhjZXB0aW9uIHNob3J0IGFsZ29yaXRobSBpZCBvZiBubiJ9LAorICovCisJezB4NzEwMCwgIkRlY29tcHJlc3Npb24gZXhjZXB0aW9uIGxvbmcgYWxnb3JpdGhtIGlkIn0sCisKKwl7MHg3MjAwLCAiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciJ9LAorCXsweDcyMDEsICJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIHdyaXRpbmcgbGVhZC1pbiJ9LAorCXsweDcyMDIsICJTZXNzaW9uIGZpeGF0aW9uIGVycm9yIHdyaXRpbmcgbGVhZC1vdXQifSwKKwl7MHg3MjAzLCAiU2Vzc2lvbiBmaXhhdGlvbiBlcnJvciAtIGluY29tcGxldGUgdHJhY2sgaW4gc2Vzc2lvbiJ9LAorCXsweDcyMDQsICJFbXB0eSBvciBwYXJ0aWFsbHkgd3JpdHRlbiByZXNlcnZlZCB0cmFjayJ9LAorCXsweDcyMDUsICJObyBtb3JlIHRyYWNrIHJlc2VydmF0aW9ucyBhbGxvd2VkIn0sCisKKwl7MHg3MzAwLCAiQ2QgY29udHJvbCBlcnJvciJ9LAorCXsweDczMDEsICJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGFsbW9zdCBmdWxsIn0sCisJezB4NzMwMiwgIlBvd2VyIGNhbGlicmF0aW9uIGFyZWEgaXMgZnVsbCJ9LAorCXsweDczMDMsICJQb3dlciBjYWxpYnJhdGlvbiBhcmVhIGVycm9yIn0sCisJezB4NzMwNCwgIlByb2dyYW0gbWVtb3J5IGFyZWEgdXBkYXRlIGZhaWx1cmUifSwKKwl7MHg3MzA1LCAiUHJvZ3JhbSBtZW1vcnkgYXJlYSBpcyBmdWxsIn0sCisJezB4NzMwNiwgIlJNQS9QTUEgaXMgYWxtb3N0IGZ1bGwifSwKKwl7MCwgTlVMTH0KK307CisKK3N0cnVjdCBlcnJvcl9pbmZvMiB7CisJdW5zaWduZWQgY2hhciBjb2RlMSwgY29kZTJfbWluLCBjb2RlMl9tYXg7CisJY29uc3QgY2hhciAqIGZtdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXJyb3JfaW5mbzIgYWRkaXRpb25hbDJbXSA9Cit7CisJezB4NDAsMHgwMCwweDdmLCJSYW0gZmFpbHVyZSAoJXgpIn0sCisJezB4NDAsMHg4MCwweGZmLCJEaWFnbm9zdGljIGZhaWx1cmUgb24gY29tcG9uZW50ICgleCkifSwKKwl7MHg0MSwweDAwLDB4ZmYsIkRhdGEgcGF0aCBmYWlsdXJlICgleCkifSwKKwl7MHg0MiwweDAwLDB4ZmYsIlBvd2VyLW9uIG9yIHNlbGYtdGVzdCBmYWlsdXJlICgleCkifSwKKwl7MHg0RCwweDAwLDB4ZmYsIlRhZ2dlZCBvdmVybGFwcGVkIGNvbW1hbmRzIChxdWV1ZSB0YWcgJXgpIn0sCisJezB4NzAsMHgwMCwweGZmLCJEZWNvbXByZXNzaW9uIGV4Y2VwdGlvbiBzaG9ydCBhbGdvcml0aG0gaWQgb2YgJXgifSwKKwl7MCwgMCwgMCwgTlVMTH0KK307CisKKy8qIGRlc2NyaXB0aW9uIG9mIHRoZSBzZW5zZSBrZXkgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqc25zdGV4dFtdID0geworCSJObyBTZW5zZSIsCSAgICAvKiAwOiBUaGVyZSBpcyBubyBzZW5zZSBpbmZvcm1hdGlvbiAqLworCSJSZWNvdmVyZWQgRXJyb3IiLCAgLyogMTogVGhlIGxhc3QgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisJCQkJICBidXQgdXNlZCBlcnJvciBjb3JyZWN0aW9uICovCisJIk5vdCBSZWFkeSIsCSAgICAvKiAyOiBUaGUgYWRkcmVzc2VkIHRhcmdldCBpcyBub3QgcmVhZHkgKi8KKwkiTWVkaXVtIEVycm9yIiwJICAgIC8qIDM6IERhdGEgZXJyb3IgZGV0ZWN0ZWQgb24gdGhlIG1lZGl1bSAqLworCSJIYXJkd2FyZSBFcnJvciIsICAgLyogNDogQ29udHJvbGxlciBvciBkZXZpY2UgZmFpbHVyZSAqLworCSJJbGxlZ2FsIFJlcXVlc3QiLCAgLyogNTogRXJyb3IgaW4gcmVxdWVzdCAqLworCSJVbml0IEF0dGVudGlvbiIsICAgLyogNjogUmVtb3ZhYmxlIG1lZGl1bSB3YXMgY2hhbmdlZCwgb3IKKwkJCQkgIHRoZSB0YXJnZXQgaGFzIGJlZW4gcmVzZXQsIG9yIC4uLiAqLworCSJEYXRhIFByb3RlY3QiLAkgICAgLyogNzogQWNjZXNzIHRvIHRoZSBkYXRhIGlzIGJsb2NrZWQgKi8KKwkiQmxhbmsgQ2hlY2siLAkgICAgLyogODogUmVhY2hlZCB1bmV4cGVjdGVkIHdyaXR0ZW4gb3IgdW53cml0dGVuCisJCQkJICByZWdpb24gb2YgdGhlIG1lZGl1bSAqLworCSJWZW5kb3IgU3BlY2lmaWMoOSkiLAorCSJDb3B5IEFib3J0ZWQiLAkgICAgLyogQTogQ09QWSBvciBDT01QQVJFIHdhcyBhYm9ydGVkICovCisJIkFib3J0ZWQgQ29tbWFuZCIsICAvKiBCOiBUaGUgdGFyZ2V0IGFib3J0ZWQgdGhlIGNvbW1hbmQgKi8KKwkiRXF1YWwiLAkgICAgLyogQzogQSBTRUFSQ0ggREFUQSBjb21tYW5kIGZvdW5kIGRhdGEgZXF1YWwgKi8KKwkiVm9sdW1lIE92ZXJmbG93IiwgIC8qIEQ6IE1lZGl1bSBmdWxsIHdpdGggc3RpbGwgZGF0YSB0byBiZSB3cml0dGVuICovCisJIk1pc2NvbXBhcmUiLAkgICAgLyogRTogU291cmNlIGRhdGEgYW5kIGRhdGEgb24gdGhlIG1lZGl1bQorCQkJCSAgZG8gbm90IGFncmVlICovCit9OworI2VuZGlmCisKKy8qIEdldCBzZW5zZSBrZXkgc3RyaW5nIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZSAqLworY29uc3QgY2hhciAqCitzY3NpX3NlbnNlX2tleV9zdHJpbmcodW5zaWduZWQgY2hhciBrZXkpIHsKKyNpZmRlZiBDT05GSUdfU0NTSV9DT05TVEFOVFMKKwlpZiAoa2V5IDw9IDB4RSkKKwkJcmV0dXJuIHNuc3RleHRba2V5XTsKKyNlbmRpZgorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3NlbnNlX2tleV9zdHJpbmcpOworCisvKgorICogR2V0IGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBzdHJpbmcgb3IgTlVMTCBpZiBub3QgYXZhaWxhYmxlLgorICogVGhpcyBzdHJpbmcgbWF5IGNvbnRhaW4gYSAiJXgiIGFuZCBzaG91bGQgYmUgcHJpbnRlZCB3aXRoIGFzY3EgYXMgYXJnLgorICovCitjb25zdCBjaGFyICoKK3Njc2lfZXh0ZF9zZW5zZV9mb3JtYXQodW5zaWduZWQgY2hhciBhc2MsIHVuc2lnbmVkIGNoYXIgYXNjcSkgeworI2lmZGVmIENPTkZJR19TQ1NJX0NPTlNUQU5UUworCWludCBpOworCXVuc2lnbmVkIHNob3J0IGNvZGUgPSAoKGFzYyA8PCA4KSB8IGFzY3EpOworCisJZm9yIChpPTA7IGFkZGl0aW9uYWxbaV0udGV4dDsgaSsrKQorCQlpZiAoYWRkaXRpb25hbFtpXS5jb2RlMTIgPT0gY29kZSkKKwkJCXJldHVybiBhZGRpdGlvbmFsW2ldLnRleHQ7CisJZm9yIChpPTA7IGFkZGl0aW9uYWwyW2ldLmZtdDsgaSsrKQorCQlpZiAoYWRkaXRpb25hbDJbaV0uY29kZTEgPT0gYXNjICYmCisJCSAgICBhZGRpdGlvbmFsMltpXS5jb2RlMl9taW4gPj0gYXNjcSAmJgorCQkgICAgYWRkaXRpb25hbDJbaV0uY29kZTJfbWF4IDw9IGFzY3EpCisJCQlyZXR1cm4gYWRkaXRpb25hbDJbaV0uZm10OworI2VuZGlmCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZXh0ZF9zZW5zZV9mb3JtYXQpOworCisvKiBQcmludCBleHRlbmRlZCBzZW5zZSBpbmZvcm1hdGlvbjsgbm8gbGVhZGluLCBubyBsaW5lZmVlZCAqLworc3RhdGljIHZvaWQKK3Njc2lfc2hvd19leHRkX3NlbnNlKHVuc2lnbmVkIGNoYXIgYXNjLCB1bnNpZ25lZCBjaGFyIGFzY3EpCit7CisJY29uc3QgY2hhciAqZXh0ZF9zZW5zZV9mbXQgPSBzY3NpX2V4dGRfc2Vuc2VfZm9ybWF0KGFzYywgYXNjcSk7CisKKwlpZiAoZXh0ZF9zZW5zZV9mbXQpIHsKKwkJaWYgKHN0cnN0cihleHRkX3NlbnNlX2ZtdCwgIiV4IikpIHsKKwkJCXByaW50aygiQWRkaXRpb25hbCBzZW5zZTogIik7CisJCQlwcmludGsoZXh0ZF9zZW5zZV9mbXQsIGFzY3EpOworCQl9IGVsc2UKKwkJCXByaW50aygiQWRkaXRpb25hbCBzZW5zZTogJXMiLCBleHRkX3NlbnNlX2ZtdCk7CisJfSBlbHNlIHsKKwkJaWYgKGFzYyA+PSAweDgwKQorCQkJcHJpbnRrKCI8PHZlbmRvcj4+IEFTQz0weCV4IEFTQ1E9MHgleCIsIGFzYywgYXNjcSk7CisJCWlmIChhc2NxID49IDB4ODApCisJCQlwcmludGsoIkFTQz0weCV4IDw8dmVuZG9yPj4gQVNDUT0weCV4IiwgYXNjLCBhc2NxKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJBU0M9MHgleCBBU0NRPTB4JXgiLCBhc2MsIGFzY3EpOworCX0KK30KKworLyogUHJpbnQgc2Vuc2UgaW5mb3JtYXRpb24gKi8KK3ZvaWQKK19fc2NzaV9wcmludF9zZW5zZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZW5zZV9idWZmZXIsCisJCSAgIGludCBzZW5zZV9sZW4pCit7CisJaW50IGssIG51bSwgcmVzOworCXVuc2lnbmVkIGludCBpbmZvOworCWNvbnN0IGNoYXIgKmVycm9yOworCWNvbnN0IGNoYXIgKnNlbnNlX3R4dDsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoOworICAgIAorCXJlcyA9IHNjc2lfbm9ybWFsaXplX3NlbnNlKHNlbnNlX2J1ZmZlciwgc2Vuc2VfbGVuLCAmc3NoKTsKKwlpZiAoMCA9PSByZXMpIHsKKwkJLyogdGhpcyBtYXkgYmUgU0NTSS0xIHNlbnNlIGRhdGEgKi8KKwkJbnVtID0gKHNlbnNlX2xlbiA8IDMyKSA/IHNlbnNlX2xlbiA6IDMyOworCQlwcmludGsoS0VSTl9JTkZPICJVbnJlY29nbml6ZWQgc2Vuc2UgZGF0YSAoaW4gaGV4KToiKTsKKwkJZm9yIChrID0gMDsgayA8IG51bTsgKytrKSB7CisJCQlpZiAoMCA9PSAoayAlIDE2KSkgeworCQkJCXByaW50aygiXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICIpOworCQkJfQorCQkJcHJpbnRrKCIlMDJ4ICIsIHNlbnNlX2J1ZmZlcltrXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQW4gZXhhbXBsZSBvZiBkZWZlcnJlZCBpcyB3aGVuIGFuIGVhcmxpZXIgd3JpdGUgdG8gZGlzayBjYWNoZQorCSAqIHN1Y2NlZWRlZCwgYnV0IG5vdyB0aGUgZGlzayBkaXNjb3ZlcnMgdGhhdCBpdCBjYW5ub3Qgd3JpdGUgdGhlCisJICogZGF0YSB0byB0aGUgbWFnbmV0aWMgbWVkaWEuCisJICovCisJZXJyb3IgPSBzY3NpX3NlbnNlX2lzX2RlZmVycmVkKCZzc2gpID8gCisJCQkiPDxERUZFUlJFRD4+IiA6ICJDdXJyZW50IjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMiLCBuYW1lLCBlcnJvcik7CisJaWYgKHNzaC5yZXNwb25zZV9jb2RlID49IDB4NzIpCisJCXByaW50aygiIFtkZXNjcmlwdG9yXSIpOworCisJc2Vuc2VfdHh0ID0gc2NzaV9zZW5zZV9rZXlfc3RyaW5nKHNzaC5zZW5zZV9rZXkpOworCWlmIChzZW5zZV90eHQpCisJCXByaW50aygiOiBzZW5zZSBrZXk6ICVzXG4iLCBzZW5zZV90eHQpOworCWVsc2UKKwkJcHJpbnRrKCI6IHNlbnNlIGtleT0weCV4XG4iLCBzc2guc2Vuc2Vfa2V5KTsKKwlwcmludGsoS0VSTl9JTkZPICIgICAgIik7CisJc2NzaV9zaG93X2V4dGRfc2Vuc2Uoc3NoLmFzYywgc3NoLmFzY3EpOworCXByaW50aygiXG4iKTsKKworCWlmIChzc2gucmVzcG9uc2VfY29kZSA8IDB4NzIpIHsKKwkJLyogb25seSBkZWNvZGUgZXh0cmFzIGZvciAiZml4ZWQiIGZvcm1hdCBub3cgKi8KKwkJY2hhciBidWZmWzgwXTsKKwkJaW50IGJsZW4sIGZpeGVkX3ZhbGlkOworCisJCWZpeGVkX3ZhbGlkID0gc2Vuc2VfYnVmZmVyWzBdICYgMHg4MDsKKwkJaW5mbyA9ICgoc2Vuc2VfYnVmZmVyWzNdIDw8IDI0KSB8IChzZW5zZV9idWZmZXJbNF0gPDwgMTYpIHwKKwkJCShzZW5zZV9idWZmZXJbNV0gPDwgOCkgfCBzZW5zZV9idWZmZXJbNl0pOworCQlyZXMgPSAwOworCQltZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsKKwkJYmxlbiA9IHNpemVvZihidWZmKSAtIDE7CisJCWlmIChmaXhlZF92YWxpZCkKKwkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLAorCQkJCQkiSW5mbyBmbGQ9MHgleCIsIGluZm8pOworCQlpZiAoc2Vuc2VfYnVmZmVyWzJdICYgMHg4MCkgeworCQkJLyogY3VycmVudCBjb21tYW5kIGhhcyByZWFkIGEgZmlsZW1hcmsgKi8KKwkJCWlmIChyZXMgPiAwKQorCQkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLCAiLCAiKTsKKwkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLCAiRk1LIik7CisJCX0KKwkJaWYgKHNlbnNlX2J1ZmZlclsyXSAmIDB4NDApIHsKKwkJCS8qIGVuZC1vZi1tZWRpdW0gY29uZGl0aW9uIGV4aXN0cyAqLworCQkJaWYgKHJlcyA+IDApCisJCQkJcmVzICs9IHNucHJpbnRmKGJ1ZmYgKyByZXMsIGJsZW4gLSByZXMsICIsICIpOworCQkJcmVzICs9IHNucHJpbnRmKGJ1ZmYgKyByZXMsIGJsZW4gLSByZXMsICJFT00iKTsKKwkJfQorCQlpZiAoc2Vuc2VfYnVmZmVyWzJdICYgMHgyMCkgeworCQkJLyogaW5jb3JyZWN0IGJsb2NrIGxlbmd0aCByZXF1ZXN0ZWQgKi8KKwkJCWlmIChyZXMgPiAwKQorCQkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLCAiLCAiKTsKKwkJCXJlcyArPSBzbnByaW50ZihidWZmICsgcmVzLCBibGVuIC0gcmVzLCAiSUxJIik7CisJCX0KKwkJaWYgKHJlcyA+IDApCisJCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYnVmZik7CisJfSBlbHNlIGlmIChzc2guYWRkaXRpb25hbF9sZW5ndGggPiAwKSB7CisJCS8qIGRlc2NyaXB0b3IgZm9ybWF0IHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMgKi8KKwkJbnVtID0gOCArIHNzaC5hZGRpdGlvbmFsX2xlbmd0aDsKKwkJbnVtID0gKHNlbnNlX2xlbiA8IG51bSkgPyBzZW5zZV9sZW4gOiBudW07CisJCXByaW50ayhLRVJOX0lORk8gIkRlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlICIKKwkJICAgICAgICJkZXNjcmlwdG9ycyAoaW4gaGV4KToiKTsKKwkJZm9yIChrID0gMDsgayA8IG51bTsgKytrKSB7CisJCQlpZiAoMCA9PSAoayAlIDE2KSkgeworCQkJCXByaW50aygiXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgICIpOworCQkJfQorCQkJcHJpbnRrKCIlMDJ4ICIsIHNlbnNlX2J1ZmZlcltrXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KK30KK0VYUE9SVF9TWU1CT0woX19zY3NpX3ByaW50X3NlbnNlKTsKKwordm9pZCBzY3NpX3ByaW50X3NlbnNlKGNvbnN0IGNoYXIgKmRldmNsYXNzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRldmNsYXNzOworCisJaWYgKGNtZC0+cmVxdWVzdC0+cnFfZGlzaykKKwkJbmFtZSA9IGNtZC0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lOworCV9fc2NzaV9wcmludF9zZW5zZShuYW1lLCBjbWQtPnNlbnNlX2J1ZmZlciwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wcmludF9zZW5zZSk7CisKK3ZvaWQgc2NzaV9wcmludF9yZXFfc2Vuc2UoY29uc3QgY2hhciAqZGV2Y2xhc3MsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRldmNsYXNzOworCisJaWYgKHNyZXEtPnNyX3JlcXVlc3QtPnJxX2Rpc2spCisJCW5hbWUgPSBzcmVxLT5zcl9yZXF1ZXN0LT5ycV9kaXNrLT5kaXNrX25hbWU7CisJX19zY3NpX3ByaW50X3NlbnNlKG5hbWUsIHNyZXEtPnNyX3NlbnNlX2J1ZmZlciwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wcmludF9yZXFfc2Vuc2UpOworCisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCitzdGF0aWMgY29uc3QgY2hhciAqb25lX2J5dGVfbXNnc1tdID0geworLyogMHgwMCAqLyAiQ29tbWFuZCBDb21wbGV0ZSIsIE5VTEwsICJTYXZlIFBvaW50ZXJzIiwKKy8qIDB4MDMgKi8gIlJlc3RvcmUgUG9pbnRlcnMiLCAiRGlzY29ubmVjdCIsICJJbml0aWF0b3IgRXJyb3IiLCAKKy8qIDB4MDYgKi8gIkFib3J0IiwgIk1lc3NhZ2UgUmVqZWN0IiwgIk5vcCIsICJNZXNzYWdlIFBhcml0eSBFcnJvciIsCisvKiAweDBhICovICJMaW5rZWQgQ29tbWFuZCBDb21wbGV0ZSIsICJMaW5rZWQgQ29tbWFuZCBDb21wbGV0ZSB3L2ZsYWciLAorLyogMHgwYyAqLyAiQnVzIGRldmljZSByZXNldCIsICJBYm9ydCBUYWciLCAiQ2xlYXIgUXVldWUiLCAKKy8qIDB4MGYgKi8gIkluaXRpYXRlIFJlY292ZXJ5IiwgIlJlbGVhc2UgUmVjb3ZlcnkiCit9OworI2RlZmluZSBOT19PTkVfQllURV9NU0dTIChzaXplb2Yob25lX2J5dGVfbXNncykgIC8gc2l6ZW9mIChjb25zdCBjaGFyICopKQorCitzdGF0aWMgY29uc3QgY2hhciAqdHdvX2J5dGVfbXNnc1tdID0geworLyogMHgyMCAqLyAiU2ltcGxlIFF1ZXVlIFRhZyIsICJIZWFkIG9mIFF1ZXVlIFRhZyIsICJPcmRlcmVkIFF1ZXVlIFRhZyIKKy8qIDB4MjMgKi8gIklnbm9yZSBXaWRlIFJlc2lkdWUiCit9OworI2RlZmluZSBOT19UV09fQllURV9NU0dTIChzaXplb2YodHdvX2J5dGVfbXNncykgIC8gc2l6ZW9mIChjb25zdCBjaGFyICopKQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5kZWRfbXNnc1tdID0geworLyogMHgwMCAqLyAiTW9kaWZ5IERhdGEgUG9pbnRlciIsICJTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3QiLAorLyogMHgwMiAqLyAiU0NTSS1JIEV4dGVuZGVkIElkZW50aWZ5IiwgIldpZGUgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IgorfTsKKyNkZWZpbmUgTk9fRVhURU5ERURfTVNHUyAoc2l6ZW9mKHR3b19ieXRlX21zZ3MpICAvIHNpemVvZiAoY29uc3QgY2hhciAqKSkKKworCitpbnQgc2NzaV9wcmludF9tc2cgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZykKK3sKKwlpbnQgbGVuID0gMCwgaTsKKwlpZiAobXNnWzBdID09IEVYVEVOREVEX01FU1NBR0UpIHsKKwkJbGVuID0gMyArIG1zZ1sxXTsKKwkJaWYgKG1zZ1syXSA8IE5PX0VYVEVOREVEX01TR1MpCisJCQlwcmludGsgKCIlcyAiLCBleHRlbmRlZF9tc2dzW21zZ1syXV0pOyAKKwkJZWxzZSAKKwkJCXByaW50ayAoIkV4dGVuZGVkIE1lc3NhZ2UsIHJlc2VydmVkIGNvZGUgKDB4JTAyeCkgIiwKKwkJCQkoaW50KSBtc2dbMl0pOworCQlzd2l0Y2ggKG1zZ1syXSkgeworCQljYXNlIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVI6CisJCQlwcmludGsoInBvaW50ZXIgPSAlZCIsIChpbnQpIChtc2dbM10gPDwgMjQpIHwKKwkJCQkobXNnWzRdIDw8IDE2KSB8IChtc2dbNV0gPDwgOCkgfCBtc2dbNl0pOworCQkJYnJlYWs7CisJCWNhc2UgRVhURU5ERURfU0RUUjoKKwkJCXByaW50aygicGVyaW9kID0gJWQgbnMsIG9mZnNldCA9ICVkIiwKKwkJCQkoaW50KSBtc2dbM10gKiA0LCAoaW50KSBtc2dbNF0pOworCQkJYnJlYWs7CisJCWNhc2UgRVhURU5ERURfV0RUUjoKKwkJCXByaW50aygid2lkdGggPSAyXiVkIGJ5dGVzIiwgbXNnWzNdKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQlmb3IgKGkgPSAyOyBpIDwgbGVuOyArK2kpIAorCQkJcHJpbnRrKCIlMDJ4ICIsIG1zZ1tpXSk7CisJCX0KKwkvKiBJZGVudGlmeSAqLworCX0gZWxzZSBpZiAobXNnWzBdICYgMHg4MCkgeworCQlwcmludGsoIklkZW50aWZ5IGRpc2Nvbm5lY3QgJXNhbGxvd2VkICVzICVkICIsCisJCQkobXNnWzBdICYgMHg0MCkgPyAiIiA6ICJub3QgIiwKKwkJCShtc2dbMF0gJiAweDIwKSA/ICJ0YXJnZXQgcm91dGluZSIgOiAibHVuIiwKKwkJCW1zZ1swXSAmIDB4Nyk7CisJCWxlbiA9IDE7CisJLyogTm9ybWFsIE9uZSBieXRlICovCisJfSBlbHNlIGlmIChtc2dbMF0gPCAweDFmKSB7CisJCWlmIChtc2dbMF0gPCBOT19PTkVfQllURV9NU0dTKQorCQkJcHJpbnRrKG9uZV9ieXRlX21zZ3NbbXNnWzBdXSk7CisJCWVsc2UKKwkJCXByaW50aygicmVzZXJ2ZWQgKCUwMngpICIsIG1zZ1swXSk7CisJCWxlbiA9IDE7CisJLyogVHdvIGJ5dGUgKi8KKwl9IGVsc2UgaWYgKG1zZ1swXSA8PSAweDJmKSB7CisJCWlmICgobXNnWzBdIC0gMHgyMCkgPCBOT19UV09fQllURV9NU0dTKQorCQkJcHJpbnRrKCIlcyAlMDJ4ICIsIHR3b19ieXRlX21zZ3NbbXNnWzBdIC0gMHgyMF0sIAorCQkJCW1zZ1sxXSk7CisJCWVsc2UgCisJCQlwcmludGsoInJlc2VydmVkIHR3byBieXRlICglMDJ4ICUwMngpICIsIAorCQkJCW1zZ1swXSwgbXNnWzFdKTsKKwkJbGVuID0gMjsKKwl9IGVsc2UgCisJCXByaW50aygicmVzZXJ2ZWQiKTsKKwlyZXR1cm4gbGVuOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3ByaW50X21zZyk7CisKKyNlbHNlICAvKiBpZm5kZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTICovCisKK2ludCBzY3NpX3ByaW50X21zZyAoY29uc3QgdW5zaWduZWQgY2hhciAqbXNnKQoreworCWludCBsZW4gPSAwLCBpOworCisJaWYgKG1zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7CisJCWxlbiA9IDMgKyBtc2dbMV07CisJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJCXByaW50aygiJTAyeCAiLCBtc2dbaV0pOworCS8qIElkZW50aWZ5ICovCisJfSBlbHNlIGlmIChtc2dbMF0gJiAweDgwKSB7CisJCXByaW50aygiJTAyeCAiLCBtc2dbMF0pOworCQlsZW4gPSAxOworCS8qIE5vcm1hbCBPbmUgYnl0ZSAqLworCX0gZWxzZSBpZiAobXNnWzBdIDwgMHgxZikgeworCQlwcmludGsoIiUwMnggIiwgbXNnWzBdKTsKKwkJbGVuID0gMTsKKwkvKiBUd28gYnl0ZSAqLworCX0gZWxzZSBpZiAobXNnWzBdIDw9IDB4MmYpIHsKKwkJcHJpbnRrKCIlMDJ4ICUwMngiLCBtc2dbMF0sIG1zZ1sxXSk7CisJCWxlbiA9IDI7CisJfSBlbHNlIAorCQlwcmludGsoIiUwMnggIiwgbXNnWzBdKTsKKwlyZXR1cm4gbGVuOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3ByaW50X21zZyk7CisjZW5kaWYgLyogISBDT05GSUdfU0NTSV9DT05TVEFOVFMgKi8KKwordm9pZCBzY3NpX3ByaW50X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCS8qIEFzc3VtZSBhcHBlbmRlZCBvdXRwdXQgKGkuZS4gbm90IGF0IHN0YXJ0IG9mIGxpbmUpICovCisJcHJpbnRrKCJzY3NpJWQgOiBkZXN0aW5hdGlvbiB0YXJnZXQgJWQsIGx1biAlZFxuIiwgCisJCWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCAKKwkJY21kLT5kZXZpY2UtPmlkLCAKKwkJY21kLT5kZXZpY2UtPmx1bik7CisJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBjb21tYW5kOiAiKTsKKwlzY3NpX3ByaW50X2NkYihjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbiwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcHJpbnRfY29tbWFuZCk7CisKKyNpZmRlZiBDT05GSUdfU0NTSV9DT05TVEFOVFMKKworc3RhdGljIGNvbnN0IGNoYXIgKiBob3N0Ynl0ZV90YWJsZVtdPXsKKyJESURfT0siLCAiRElEX05PX0NPTk5FQ1QiLCAiRElEX0JVU19CVVNZIiwgIkRJRF9USU1FX09VVCIsICJESURfQkFEX1RBUkdFVCIsIAorIkRJRF9BQk9SVCIsICJESURfUEFSSVRZIiwgIkRJRF9FUlJPUiIsICJESURfUkVTRVQiLCAiRElEX0JBRF9JTlRSIiwKKyJESURfUEFTU1RIUk9VR0giLCAiRElEX1NPRlRfRVJST1IiLCAiRElEX0lNTV9SRVRSWSJ9OworI2RlZmluZSBOVU1fSE9TVEJZVEVfU1RSUyAoc2l6ZW9mKGhvc3RieXRlX3RhYmxlKSAvIHNpemVvZihjb25zdCBjaGFyICopKQorCit2b2lkIHNjc2lfcHJpbnRfaG9zdGJ5dGUoaW50IHNjc2lyZXN1bHQpCit7CisJaW50IGhiID0gaG9zdF9ieXRlKHNjc2lyZXN1bHQpOworCisJcHJpbnRrKCJIb3N0Ynl0ZT0weCUwMngiLCBoYik7CisJaWYgKGhiIDwgTlVNX0hPU1RCWVRFX1NUUlMpCisJCXByaW50aygiKCVzKSAiLCBob3N0Ynl0ZV90YWJsZVtoYl0pOworCWVsc2UKKwkJcHJpbnRrKCJpcyBpbnZhbGlkICIpOyAKK30KKyNlbHNlCit2b2lkIHNjc2lfcHJpbnRfaG9zdGJ5dGUoaW50IHNjc2lyZXN1bHQpCit7CisJcHJpbnRrKCJIb3N0Ynl0ZT0weCUwMnggIiwgaG9zdF9ieXRlKHNjc2lyZXN1bHQpKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDU0lfQ09OU1RBTlRTCisKK3N0YXRpYyBjb25zdCBjaGFyICogZHJpdmVyYnl0ZV90YWJsZVtdPXsKKyJEUklWRVJfT0siLCAiRFJJVkVSX0JVU1kiLCAiRFJJVkVSX1NPRlQiLCAgIkRSSVZFUl9NRURJQSIsICJEUklWRVJfRVJST1IiLCAKKyJEUklWRVJfSU5WQUxJRCIsICJEUklWRVJfVElNRU9VVCIsICJEUklWRVJfSEFSRCIsICJEUklWRVJfU0VOU0UifTsKKyNkZWZpbmUgTlVNX0RSSVZFUkJZVEVfU1RSUyAoc2l6ZW9mKGRyaXZlcmJ5dGVfdGFibGUpIC8gc2l6ZW9mKGNvbnN0IGNoYXIgKikpCisKK3N0YXRpYyBjb25zdCBjaGFyICogZHJpdmVyc3VnZ2VzdF90YWJsZVtdPXsiU1VHR0VTVF9PSyIsCisiU1VHR0VTVF9SRVRSWSIsICJTVUdHRVNUX0FCT1JUIiwgIlNVR0dFU1RfUkVNQVAiLCAiU1VHR0VTVF9ESUUiLAorIlNVR0dFU1RfNSIsICJTVUdHRVNUXzYiLCAiU1VHR0VTVF83IiwgIlNVR0dFU1RfU0VOU0UifTsKKyNkZWZpbmUgTlVNX1NVR0dFU1RfU1RSUyAoc2l6ZW9mKGRyaXZlcnN1Z2dlc3RfdGFibGUpIC8gc2l6ZW9mKGNvbnN0IGNoYXIgKikpCisKK3ZvaWQgc2NzaV9wcmludF9kcml2ZXJieXRlKGludCBzY3NpcmVzdWx0KQoreworCWludCBkciA9IChkcml2ZXJfYnl0ZShzY3NpcmVzdWx0KSAmIERSSVZFUl9NQVNLKTsKKwlpbnQgc3UgPSAoKGRyaXZlcl9ieXRlKHNjc2lyZXN1bHQpICYgU1VHR0VTVF9NQVNLKSA+PiA0KTsKKworCXByaW50aygiRHJpdmVyYnl0ZT0weCUwMnggIiwgZHJpdmVyX2J5dGUoc2NzaXJlc3VsdCkpOworCXByaW50aygiKCVzLCVzKSAiLAorCSAgICAgICAoZHIgPCBOVU1fRFJJVkVSQllURV9TVFJTID8gZHJpdmVyYnl0ZV90YWJsZVtkcl0gOiAiaW52YWxpZCIpLAorCSAgICAgICAoc3UgPCBOVU1fU1VHR0VTVF9TVFJTID8gZHJpdmVyc3VnZ2VzdF90YWJsZVtzdV0gOiAiaW52YWxpZCIpKTsKK30KKyNlbHNlCit2b2lkIHNjc2lfcHJpbnRfZHJpdmVyYnl0ZShpbnQgc2NzaXJlc3VsdCkKK3sKKwlwcmludGsoIkRyaXZlcmJ5dGU9MHglMDJ4ICIsIGRyaXZlcl9ieXRlKHNjc2lyZXN1bHQpKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NwcWZjVFMuaCBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlNTNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBDUFFGQ1RTX0gKKyNkZWZpbmUgQ1BRRkNUU19ICisjaW5jbHVkZSAiY3BxZmNUU3N0cnVjdHMuaCIKKworLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCBieSB0aGUgTGludXggU0NTSSBsYXllcnMKK2V4dGVybiBpbnQgY3BxZmNUU19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworZXh0ZXJuIGludCBjcHFmY1RTX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBjb25zdCBjaGFyICogY3BxZmNUU19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitleHRlcm4gaW50IGNwcWZjVFNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQpOworZXh0ZXJuIGludCBjcHFmY1RTX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKiBkb25lKShTY3NpX0NtbmQgKikpOworZXh0ZXJuIGludCBjcHFmY1RTX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2V4dGVybiBpbnQgY3BxZmNUU19yZXNldChTY3NpX0NtbmQgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgY3BxZmNUU19laF9hYm9ydChTY3NpX0NtbmQgKkNtbmQpOworZXh0ZXJuIGludCBjcHFmY1RTX2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKik7CitleHRlcm4gaW50IGNwcWZjVFNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCXNlY3Rvcl90LCBpbnRbXSk7CitleHRlcm4gaW50IGNwcWZjVFNfaW9jdGwoIFNjc2lfRGV2aWNlICpTY3NpRGV2LCBpbnQgQ21uZCwgdm9pZCAqYXJnKTsKKworI2VuZGlmIC8qIENQUUZDVFNfSCAqLyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTY2hpcC5oIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNjaGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiODMzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTY2hpcC5oCkBAIC0wLDAgKzEsMjM4IEBACisvKiBDb3B5cmlnaHQoYykgMjAwMCwgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uIAorICogRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyIAorICogNjQtYml0LCA2Nk1IeiBQQ0kgCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgdGVzdGVkIG9uOgorICogKGZyb250KTogW2NoaXBdIFRhY2h5b24gVFMgSFBGQy01MTY2QS8xLjIgIEwyQzEwOTAgLi4uCisgKiAgICAgICAgICBTUCMgUDIyNUNYQ0JGSUVMNlQsIFJldiBYQworICogICAgICAgICAgU1AjIDE2MTI5MC0wMDEsIFJldiBYRAorICogKGJhY2spOiBCb2FyZCBOby4gMDEwMDA4LTAwMSBBL1cgUmV2IFg1LCBGQUIgUkVWIFg1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogV3JpdHRlbiBieSBEb24gWmltbWVybWFuCisqLworI2lmbmRlZiBDUFFGQ1RTQ0hJUF9ICisjZGVmaW5lIENQUUZDVFNDSElQX0gKKyNpZm5kZWYgVEFDSFlPTl9DSElQX0lOQworCisvLyBGQy1QSCAoUGh5c2ljYWwpIHNwZWNpZmljYXRpb24gbGV2ZWxzIGZvciBMb2dpbiBwYXlsb2FkcworLy8gTk9URTogVGhlc2UgYXJlIE5PVCBzdHJpY3RseSBjb21wbGllZCB3aXRoIGJ5IGFueSBGQyB2ZW5kb3JzCisKKyNkZWZpbmUgRkNfUEg0MgkJCTB4MDgKKyNkZWZpbmUgRkNfUEg0MwkJCTB4MDkKKyNkZWZpbmUgRkNfUEgzCQkJMHgyMAorCisjZGVmaW5lIFRBQ0hMSVRFX1RTX1JYX1NJWkUgICAgIDEwMjQgIC8vIG1heCBpbmJvdW5kIGZyYW1lIHNpemUKKy8vICJJIiBwcmVmaXggaXMgZm9yIEluY2x1ZGUKKworI2RlZmluZSBJVkVORElEICAgIDB4MDAgIC8vIHdvcmQKKyNkZWZpbmUgSURFVklEICAgICAweDAyCisjZGVmaW5lIElUTENGR0NNRCAweDA0CisjZGVmaW5lIElNRU1CQVNFICAgMHgxOCAgICAvLyBUYWNoeW9uCisjZGVmaW5lIElUTE1FTUJBU0UgICAweDFDICAvLyBUYWNobGl0ZQorI2RlZmluZSBJSU9CQVNFTCAgIDB4MTAgICAgLy8gVGFjaHlvbiBJL08gYmFzZSBhZGRyZXNzLCBsb3dlciAyNTYgYnl0ZXMKKyNkZWZpbmUgSUlPQkFTRVUgICAweDE0ICAgIC8vIFRhY2h5b24gSS9PIGJhc2UgYWRkcmVzcywgdXBwZXIgMjU2IGJ5dGVzCisjZGVmaW5lIElUTElPQkFTRUwgICAweDE0ICAvLyBUYWNoTGl0ZSBJL08gYmFzZSBhZGRyZXNzLCBsb3dlciAyNTYgYnl0ZXMKKyNkZWZpbmUgSVRMSU9CQVNFVSAgIDB4MTggIC8vIFRhY2hMaXRlIEkvTyBiYXNlIGFkZHJlc3MsIHVwcGVyIDI1NiBieXRlcworI2RlZmluZSBJVExSQU1CQVNFICAgMHgyMCAgLy8gVEwgb24tYm9hcmQgUkFNIHN0YXJ0CisjZGVmaW5lIElTUk9NQkFTRSAgMHgyNAorI2RlZmluZSBJUk9NQkFTRSAgIDB4MzAKKworI2RlZmluZSBJQ0ZHQ01EICAgIDB4MDQgICAgLy8gUENJIGNvbmZpZyAtIFBDSSBjb25maWcgYWNjZXNzICh3b3JkKQorI2RlZmluZSBJQ0ZHU1RBVCAgIDB4MDYgICAgLy8gUENJIHN0YXR1cyAoUiAtIHdvcmQpCisjZGVmaW5lIElSQ1RSX1dDVFIgMHgxRjIgICAvLyBST00gY29udHJvbCAvIHByZS1mZXRjaCB3YWl0IGNvdW50ZXIKKyNkZWZpbmUgSVBDSU1DVFIgICAweDFGMyAgIC8vIFBDSSBtYXN0ZXIgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBJSU5UUEVORCAgIDB4MUZEICAgLy8gSW50ZXJydXB0IHBlbmRpbmcgKEkvTyBVcHBlciAtIFRhY2h5b24gJiBUTCkKKyNkZWZpbmUgSUlOVEVOICAgICAweDFGRSAgIC8vIEludGVycnVwdCBlbmFibGUgIChJL08gVXBwZXIgLSBUYWNoeW9uICYgVEwpCisjZGVmaW5lIElJTlRTVEFUICAgMHgxRkYgICAvLyBJbnRlcnJ1cHQgc3RhdHVzICAoSS9PIFVwcGVyIC0gVGFjaHlvbiAmIFRMKQorCisjZGVmaW5lIElNUV9CQVNFICAgICAgICAgICAgMHg4MAorI2RlZmluZSBJTVFfTEVOR1RIICAgICAgICAgIDB4ODQKKyNkZWZpbmUgSU1RX0NPTlNVTUVSX0lOREVYICAweDg4CisjZGVmaW5lIElNUV9QUk9EVUNFUl9JTkRFWCAgMHg4QyAgIC8vIFRhY2ggY29waWVzIGl0cyBJTkRYIHRvIGJpdHMgMC03IG9mIHZhbHVlCisKKy8qCisvLyBJT0JBU0UgVVBQRVIKKyNkZWZpbmUgU0ZTQlFfQkFTRSAgICAgICAgICAgIDB4MDAgICAvLyBzaW5nbGUtZnJhbWUgc2VxdWVuY2VzCisjZGVmaW5lIFNGU0JRX0xFTkdUSCAgICAgICAgICAweDA0CisjZGVmaW5lIFNGU0JRX1BST0RVQ0VSX0lOREVYICAweDA4CisjZGVmaW5lIFNGU0JRX0NPTlNVTUVSX0lOREVYICAweDBDICAgLy8gKFIpCisjZGVmaW5lIFNGU19CVUZGRVJfTEVOR1RIICAgICAwWDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ1NJLUZDUCBoYXJkd2FyZSBhc3Npc3RzCisjZGVmaW5lIFNFU1RfQkFTRSAgICAgICAgICAgICAweDQwICAgLy8gU1NDSSBFeGNoYW5nZSBTdGF0ZSBUYWJsZQorI2RlZmluZSBTRVNUX0xFTkdUSCAgICAgICAgICAgMHg0NAorI2RlZmluZSBTQ1NJX0JVRkZFUl9MRU5HVEggICAgMHg0OAorI2RlZmluZSBTRVNUX0xJTktFRF9MSVNUICAgICAgMHg0QworCisjZGVmaW5lIFRBQ0hZT05fTXlfSUQgICAgICAgICAweDZDCisjZGVmaW5lIFRBQ0hZT05fQ09ORklHVVJBVElPTiAweDg0ICAgLy8gKFIvVykgcmVzZXQgdmFsIDIKKyNkZWZpbmUgVEFDSFlPTl9DT05UUk9MICAgICAgIDB4ODgKKyNkZWZpbmUgVEFDSFlPTl9TVEFUVVMgICAgICAgIDB4OEMgICAvLyAoUikKKyNkZWZpbmUgVEFDSFlPTl9GTFVTSF9TRVNUICAgIDB4OTAgICAvLyAoUi9XKQorI2RlZmluZSBUQUNIWU9OX0VFX0NSRURJVF9UTVIgMHg5NCAgIC8vIChSKQorI2RlZmluZSBUQUNIWU9OX0JCX0NSRURJVF9UTVIgMHg5OCAgIC8vIChSKQorI2RlZmluZSBUQUNIWU9OX1JDVl9GUkFNRV9FUlIgMHg5QyAgIC8vIChSKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX0NPTkZJRyAgMHhDMCAgIC8vIChSL1cpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfQ09OVFJPTCAweEM0CisjZGVmaW5lIEZSQU1FX01BTkFHRVJfU1RBVFVTICAweEM4ICAgLy8gKFIpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfRURfVE9WICAweENDCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfTElOS19FUlIxIDB4RDAgICAvLyAoUikKKyNkZWZpbmUgRlJBTUVfTUFOQUdFUl9MSU5LX0VSUjIgMHhENCAgIC8vIChSKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX1RJTUVPVVQyICAweEQ4ICAgLy8gKFcpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfQkJfQ1JFRElUIDB4REMgICAvLyAoUikKKyNkZWZpbmUgRlJBTUVfTUFOQUdFUl9XV05fSEkgICAgMHhFMCAgIC8vIChSL1cpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfV1dOX0xPICAgIDB4RTQgICAvLyAoUi9XKQorI2RlZmluZSBGUkFNRV9NQU5BR0VSX1JDVl9BTF9QQSAweEU4ICAgLy8gKFIpCisjZGVmaW5lIEZSQU1FX01BTkFHRVJfUFJJTUlUSVZFIDB4RUMgICAvLyB7SzI4LjV9IGJ5dGUxIGJ5dGUyIGJ5dGUzCisqLworCQkgICAgCisjZGVmaW5lIFRMX01FTV9FUlFfQkFTRSAgICAgICAgICAgICAgICAgICAgMHgwIC8vRVJRIEJhc2UKKyNkZWZpbmUgVExfSU9fRVJRX0JBU0UgICAgICAgICAgICAgICAgICAgICAweDAgLy9FUlEgYmFzZQorCisjZGVmaW5lIFRMX01FTV9FUlFfTEVOR1RIICAgICAgICAgICAgICAgICAgMHg0IC8vRVJRIExlbmd0aAorI2RlZmluZSBUTF9JT19FUlFfTEVOR1RIICAgICAgICAgICAgICAgICAgIDB4NCAvL0VSUSBMZW5ndGgKKworI2RlZmluZSBUTF9NRU1fRVJRX1BST0RVQ0VSX0lOREVYICAgICAgICAgIDB4OCAvL0VSUSBQcm9kdWNlciBJbmRleCAgcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fRVJRX1BST0RVQ0VSX0lOREVYICAgICAgICAgICAweDggLy9FUlEgUHJvZHVjZXIgSW5kZXggIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX0VSUV9DT05TVU1FUl9JTkRFWF9BRFIgMHhDIC8vRVJRIENvbnN1bWVyIEluZGV4IGFkZHJlc3MgcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fRVJRX0NPTlNVTUVSX0lOREVYX0FEUiAgMHhDIC8vRVJRIENvbnN1bWVyIEluZGV4IGFkZHJlc3MgcmVnaXN0ZXIKKworI2RlZmluZSBUTF9NRU1fRVJRX0NPTlNVTUVSX0lOREVYICAgICAweEMgLy9FUlEgQ29uc3VtZXIgSW5kZXggCisjZGVmaW5lIFRMX0lPX0VSUV9DT05TVU1FUl9JTkRFWCAgICAgIDB4QyAvL0VSUSBDb25zdW1lciBJbmRleCAKKworI2RlZmluZSBUTF9NRU1fU0ZRX0JBU0UgICAgICAgICAgICAgICAweDUwIC8vU0ZRIEJhc2UKKyNkZWZpbmUgVExfSU9fU0ZRX0JBU0UgICAgICAgICAgICAgICAgMHg1MCAvL1NGUSBiYXNlCisKKyNkZWZpbmUgVExfTUVNX1NGUV9MRU5HVEggICAgICAgICAgICAgMHg1NCAvL1NGUSBMZW5ndGgKKyNkZWZpbmUgVExfSU9fU0ZRX0xFTkdUSCAgICAgICAgICAgICAgMHg1NCAvL1NGUSBMZW5ndGgKKworI2RlZmluZSBUTF9NRU1fU0ZRX0NPTlNVTUVSX0lOREVYICAgICAweDU4IC8vU0ZRIENvbnN1bWVyIEluZGV4CisjZGVmaW5lIFRMX0lPX1NGUV9DT05TVU1FUl9JTkRFWCAgICAgIDB4NTggLy9TRlEgQ29uc3VtZXIgSW5kZXgKKworI2RlZmluZSBUTF9NRU1fSU1RX0JBU0UgICAgICAgICAgICAgICAweDgwIC8vSU1RIEJhc2UKKyNkZWZpbmUgVExfSU9fSU1RX0JBU0UgICAgICAgICAgICAgICAgMHg4MCAvL0lNUSBiYXNlCisKKyNkZWZpbmUgVExfTUVNX0lNUV9MRU5HVEggICAgICAgICAgICAgMHg4NCAvL0lNUSBMZW5ndGgKKyNkZWZpbmUgVExfSU9fSU1RX0xFTkdUSCAgICAgICAgICAgICAgMHg4NCAvL0lNUSBMZW5ndGgKKworI2RlZmluZSBUTF9NRU1fSU1RX0NPTlNVTUVSX0lOREVYICAgICAweDg4IC8vSU1RIENvbnN1bWVyIEluZGV4CisjZGVmaW5lIFRMX0lPX0lNUV9DT05TVU1FUl9JTkRFWCAgICAgIDB4ODggLy9JTVEgQ29uc3VtZXIgSW5kZXgKKworI2RlZmluZSBUTF9NRU1fSU1RX1BST0RVQ0VSX0lOREVYX0FEUiAweDhDIC8vSU1RIFByb2R1Y2VyIEluZGV4IGFkZHJlc3MgcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fSU1RX1BST0RVQ0VSX0lOREVYX0FEUiAgMHg4QyAvL0lNUSBQcm9kdWNlciBJbmRleCBhZGRyZXNzIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX1NFU1RfQkFTRSAgICAgICAgICAgICAgMHgxNDAgLy9TRlEgQmFzZQorI2RlZmluZSBUTF9JT19TRVNUX0JBU0UgICAgICAgICAgICAgICAweDQwIC8vU0ZRIGJhc2UKKworI2RlZmluZSBUTF9NRU1fU0VTVF9MRU5HVEggICAgICAgICAgICAweDE0NCAvL1NGUSBMZW5ndGgKKyNkZWZpbmUgVExfSU9fU0VTVF9MRU5HVEggICAgICAgICAgICAgMHg0NCAvL1NGUSBMZW5ndGgKKworI2RlZmluZSBUTF9NRU1fU0VTVF9MSU5LRURfTElTVCAgICAgICAweDE0QworCisjZGVmaW5lIFRMX01FTV9TRVNUX1NHX1BBR0UgICAgICAgICAgIDB4MTY4ICAvLyBFeHRlbmRlZCBTY2F0dGVyL0dhdGhlciBwYWdlIHNpemUKKworI2RlZmluZSBUTF9NRU1fVEFDSF9NeV9JRCAgICAgICAgICAgICAweDE2QworI2RlZmluZSBUTF9JT19UQUNIX015X0lEICAgICAgICAgICAgICAweDZDIC8vTXkgQUxfUEEgSUQKKworI2RlZmluZSBUTF9NRU1fVEFDSF9DT05GSUcgICAgICAgICAgICAweDE4NCAvL1RhY2hsaXRlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fQ09ORklHICAgICAgICAgICAgICAgICAgMHg4NCAvL1RhY2hsaXRlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKworI2RlZmluZSBUTF9NRU1fVEFDSF9DT05UUk9MICAgICAgICAgICAweDE4OCAvL1RhY2hsaXRlIENvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fQ1RSICAgICAgICAgICAgICAgICAgICAgMHg4OCAvL1RhY2hsaXRlIENvbnRyb2wgcmVnaXN0ZXIKKworI2RlZmluZSBUTF9NRU1fVEFDSF9TVEFUVVMgICAgICAgICAgICAweDE4QyAvL1RhY2hsaXRlIFN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBUTF9JT19TVEFUICAgICAgICAgICAgICAgICAgICAweDhDIC8vVGFjaGxpdGUgU3RhdHVzIHJlZ2lzdGVyCisKKyNkZWZpbmUgVExfTUVNX0ZNX0NPTkZJRyAgICAgICAgMHgxQzAgLy9GcmFtZSBNYW5hZ2VyIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fRk1fQ09ORklHICAgICAgICAgMHhDMCAvL0ZyYW1lIE1hbmFnZXIgQ29uZmlndXJhdGlvbiByZWdpc3RlcgorCisjZGVmaW5lIFRMX01FTV9GTV9DT05UUk9MICAgICAgIDB4MUM0IC8vRnJhbWUgTWFuYWdlciBDb250cm9sCisjZGVmaW5lIFRMX0lPX0ZNX0NUTCAgICAgICAgICAgIDB4QzQgLy9GcmFtZSBNYW5hZ2VyIENvbnRyb2wKKworI2RlZmluZSBUTF9NRU1fRk1fU1RBVFVTICAgICAgICAweDFDOCAvL0ZyYW1lIE1hbmFnZXIgU3RhdHVzCisjZGVmaW5lIFRMX0lPX0ZNX1NUQVQgICAgICAgICAgIDB4QzggLy9GcmFtZSBNYW5hZ2VyIFN0YXR1cworCisjZGVmaW5lIFRMX01FTV9GTV9MSU5LX1NUQVQxICAgIDB4MUQwIC8vRnJhbWUgTWFuYWdlciBMaW5rIFN0YXR1cyAxCisjZGVmaW5lIFRMX0lPX0ZNX0xJTktfU1RBVDEgICAgIDB4RDAgLy9GcmFtZSBNYW5hZ2VyIExpbmsgU3RhdHVzIDEKKworI2RlZmluZSBUTF9NRU1fRk1fTElOS19TVEFUMiAgICAweDFENCAvL0ZyYW1lIE1hbmFnZXIgTGluayBTdGF0dXMgMgorI2RlZmluZSBUTF9JT19GTV9MSU5LX1NUQVQyICAgICAweEQ0IC8vRnJhbWUgTWFuYWdlciBMaW5rIFN0YXR1cyAyCisKKyNkZWZpbmUgVExfTUVNX0ZNX1RJTUVPVVQyICAgICAgMHgxRDggICAvLyAoVykKKworI2RlZmluZSBUTF9NRU1fRk1fQkJfQ1JFRElUMCAgICAweDFEQworCisjZGVmaW5lIFRMX01FTV9GTV9XV05fSEkgICAgICAgIDB4MUUwIC8vRnJhbWUgTWFuYWdlciBXb3JsZCBXaWRlIE5hbWUgSGlnaAorI2RlZmluZSBUTF9JT19GTV9XV05fSEkgICAgICAgICAweEUwIC8vRnJhbWUgTWFuYWdlciBXb3JsZCBXaWRlIE5hbWUgSGlnaAorCisjZGVmaW5lIFRMX01FTV9GTV9XV05fTE8gICAgICAgIDB4MUU0IC8vRnJhbWUgTWFuYWdlciBXb3JsZCBXaWRlIE5hbWUgTE9XCisjZGVmaW5lIFRMX0lPX0ZNX1dXTl9MTyAgICAgICAgIDB4RTQgLy9GcmFtZSBNYW5hZ2VyIFdvcmxkIFdpZGUgTmFtZSBMb3cKKworI2RlZmluZSBUTF9NRU1fRk1fUkNWX0FMX1BBICAgICAweDFFOCAvL0ZyYW1lIE1hbmFnZXIgQUxfUEEgUmVjZWl2ZWQgcmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fRk1fQUxQQSAgICAgICAgICAgMHhFOCAvL0ZyYW1lIE1hbmFnZXIgQUxfUEEgUmVjZWl2ZWQgcmVnaXN0ZXIKKworI2RlZmluZSBUTF9NRU1fRk1fRURfVE9WICAgICAgICAgICAweDFDQworCisjZGVmaW5lIFRMX0lPX1JPTUNUUiAgICAgICAgICAgIDB4RkEgLy9UTCBQQ0kgUk9NIENvbnRyb2wgUmVnaXN0ZXIKKyNkZWZpbmUgVExfSU9fUENJTUNUUiAgICAgICAgICAgMHhGQiAvL1RMIFBDSSBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlcgorI2RlZmluZSBUTF9JT19TT0ZUUlNUICAgICAgICAgICAweEZDIC8vVGFjaGxpdGUgQ29uZmlndXJhdGlvbiByZWdpc3RlcgorI2RlZmluZSBUTF9NRU1fU09GVFJTVCAgICAgICAgICAweDFGQyAvL1RhY2hsaXRlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKworLy8gY29tcGxldGlvbiBtZXNzYWdlIHR5cGVzIChiaXQgOCBzZXQgbWVhbnMgSW50ZXJydXB0IGdlbmVyYXRlZCkKKy8vIENNX1R5cGUKKyNkZWZpbmUgT1VUQk9VTkRfQ09NUExFVElPTiAgICAgICAgMAorI2RlZmluZSBFUlJPUl9JRExFX0NPTVBMRVRJT04gICAweDAxCisjZGVmaW5lIE9VVF9ISV9QUklfQ09NUExFVElPTiAgIDB4MDEKKyNkZWZpbmUgSU5CT1VORF9NRlNfQ09NUExFVElPTiAgMHgwMgorI2RlZmluZSBJTkJPVU5EXzAwMF9DT01QTEVUSU9OICAweDAzCisjZGVmaW5lIElOQk9VTkRfU0ZTX0NPTVBMRVRJT04gIDB4MDQgIC8vIFRhY2h5b24gJiBUYWNoTGl0ZQorI2RlZmluZSBFUlFfRlJPWkVOX0NPTVBMRVRJT04gICAweDA2ICAvLyBUYWNoTGl0ZQorI2RlZmluZSBJTkJPVU5EX0MxX1RJTUVPVVQgICAgICAweDA1CisjZGVmaW5lIElOQk9VTkRfQlVTSUVEX0ZSQU1FICAgIDB4MDYKKyNkZWZpbmUgU0ZTX0JVRl9XQVJOICAgICAgICAgICAgMHgwNworI2RlZmluZSBGQ1BfRlJPWkVOX0NPTVBMRVRJT04gICAweDA3ICAvLyBUYWNoTGl0ZQorI2RlZmluZSBNRlNfQlVGX1dBUk4gICAgICAgICAgICAweDA4CisjZGVmaW5lIElNUV9CVUZfV0FSTiAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgRlJBTUVfTUdSX0lOVEVSUlVQVCAgICAgMHgwQQorI2RlZmluZSBSRUFEX1NUQVRVUyAgICAgICAgICAgICAweDBCCisjZGVmaW5lIElOQk9VTkRfU0NTSV9EQVRBX0NPTVBMRVRJT04gIDB4MEMKKyNkZWZpbmUgSU5CT1VORF9GQ1BfWENIR19DT01QTEVUSU9OICAgMHgwQyAgLy8gVGFjaExpdGUKKyNkZWZpbmUgSU5CT1VORF9TQ1NJX0RBVEFfQ09NTUFORCAgICAgMHgwRAorI2RlZmluZSBCQURfU0NTSV9GUkFNRSAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIElOQl9TQ1NJX1NUQVRVU19DT01QTEVUSU9OICAgIDB4MEYKKyNkZWZpbmUgQlVGRkVSX1BST0NFU1NFRF9DT01QTEVUSU9OICAgMHgxMQorCisvLyBGQy1BTCAoVGFjaHlvbikgTG9vcCBQb3J0IFN0YXRlIE1hY2hpbmUgZGVmcworLy8gKGxvb3AgIlVwIiBzdGF0ZXMpCisjZGVmaW5lIE1PTklUT1JJTkcgMHgwCisjZGVmaW5lIEFSQklUUkFUSU5HIDB4MQorI2RlZmluZSBBUkJJVFJBVF9XT04gMHgyCisjZGVmaW5lIE9QRU4gMHgzCisjZGVmaW5lIE9QRU5FRCAweDQKKyNkZWZpbmUgWE1JVFREX0NMT1NFIDB4NQorI2RlZmluZSBSQ1ZEX0NMT1NFIDB4NgorI2RlZmluZSBUUkFOU0ZFUiAweDcKKworLy8gKGxvb3AgIkRvd24iIHN0YXRlcykKKyNkZWZpbmUgSU5JVElBTElaSU5HIDB4OAorI2RlZmluZSBPX0lfSU5JVCAweDkKKyNkZWZpbmUgT19JX1BST1RPQ09MIDB4YQorI2RlZmluZSBPX0lfTElQX1JDVkQgMHhiCisjZGVmaW5lIEhPU1RfQ09OVFJPTCAweGMKKyNkZWZpbmUgTE9PUF9GQUlMIDB4ZAorLy8gKG5vIDB4ZSkKKyNkZWZpbmUgT0xEX1BPUlQgMHhmCisKKworCisjZGVmaW5lIFRBQ0hZT05fQ0hJUF9JTkMKKyNlbmRpZgorI2VuZGlmIC8qIENQUUZDVFNDSElQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTY29udHJvbC5jIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNjb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5NGM3MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTY29udHJvbC5jCkBAIC0wLDAgKzEsMjIzMSBAQAorLyogQ29weXJpZ2h0IDIwMDAsIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiAKKyAqIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlciAKKyAqIDY0LWJpdCwgNjZNSHogUENJIAorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIHRlc3RlZCBvbjoKKyAqIChmcm9udCk6IFtjaGlwXSBUYWNoeW9uIFRTIEhQRkMtNTE2NkEvMS4yICBMMkMxMDkwIC4uLgorICogICAgICAgICAgU1AjIFAyMjVDWENCRklFTDZULCBSZXYgWEMKKyAqICAgICAgICAgIFNQIyAxNjEyOTAtMDAxLCBSZXYgWEQKKyAqIChiYWNrKTogQm9hcmQgTm8uIDAxMDAwOC0wMDEgQS9XIFJldiBYNSwgRkFCIFJFViBYNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFdyaXR0ZW4gYnkgRG9uIFppbW1lcm1hbgorKi8KKy8qIFRoZXNlIGZ1bmN0aW9ucyBjb250cm9sIHRoZSBob3N0IGJ1cyBhZGFwdGVyIChIQkEpIGhhcmR3YXJlLiAgVGhlIG1haW4gY2hpcAorICAgY29udHJvbCB0YWtlcyBwbGFjZSBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2hlcmUgd2UgcHJvY2VzcyB0aGUgSU1RIAorICAgKEluYm91bmQgTWVzc2FnZSBRdWV1ZSkuICBUaGUgSU1RIGlzIFRhY2h5b24ncyB3YXkgb2YgY29tbXVuaWNhdGluZyBGQyBsaW5rCisgICBldmVudHMgYW5kIHN0YXRlIGluZm9ybWF0aW9uIHRvIHRoZSBkcml2ZXIuICBUaGUgU2luZ2xlIEZyYW1lIFF1ZXVlIChTRlEpCisgICBidWZmZXJzIGluY29taW5nIEZDIGZyYW1lcyBmb3IgcHJvY2Vzc2luZyBieSB0aGUgZHJpdmVyLiAgUmVmZXJlbmNlcyB0byAKKyAgICJUTC9UUyBVRyIgYXJlIGZvcjoKKyAgICJIUCBIUEZDLTUxMDAvNTE2NiBUYWNoeW9uIFRML1RTIElDcyBVc2VyIEd1aWRlIiwgQXVndXN0IDE2LCAxOTk5LCAxc3QgRWQuCisgICBIZXdsaXR0IFBhY2thcmQgTWFudWFsIFBhcnQgTnVtYmVyIDU5NjgtMTA4M0UuCisqLworCisjZGVmaW5lIExpbnV4VmVyc2lvbkNvZGUodiwgcCwgcykgKCgodik8PDE2KSsoKHApPDw4KSsocykpCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4gIC8vIHJlcXVlc3RfcmVnaW9uKCkgcHJvdG90eXBlCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ICAvLyBuZWVkICJrZnJlZSIgZm9yIGV4dC4gUy9HIHBhZ2VzCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPiAgLy8gc3RydWN0IHB0X3JlZ3MgZm9yIElSUSBoYW5kbGVyICYgUG9ydCBJL08KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPiAgIC8vIFNjc2lfSG9zdCBkZWZpbml0aW9uIGZvciBJTlQgaGFuZGxlcgorI2luY2x1ZGUgImNwcWZjVFNjaGlwLmgiCisjaW5jbHVkZSAiY3BxZmNUU3N0cnVjdHMuaCIKKworLy8jZGVmaW5lIElNUV9ERUJVRyAxCisKK3N0YXRpYyB2b2lkIGZjUGFyc2VMaW5rU3RhdHVzQ291bnRlcnMoVEFDSFlPTiAqIGZjQ2hpcCk7CitzdGF0aWMgdm9pZCBDcHFUc0dldFNGUUVudHJ5KFRBQ0hZT04gKiBmY0NoaXAsIAorCSAgICAgIFVTSE9SVCBwaSwgVUxPTkcgKiBidWZmciwgQk9PTEVBTiBVcGRhdGVDaGlwKTsgCisKK3N0YXRpYyB2b2lkIAorY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhKQoreworICAJLy8gZnJlZSB1cCB0aGUgcHJpbWFyeSBFWENIQU5HRVMgc3RydWN0IGFuZCBMaW5rIFEKKwlQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisKKwlpZiAoZmNDaGlwLT5FeGNoYW5nZXMgIT0gTlVMTCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjcHFmY0hCQWRhdGEtPlBjaURldiwgc2l6ZW9mKEZDX0VYQ0hBTkdFUyksCisJCQlmY0NoaXAtPkV4Y2hhbmdlcywgZmNDaGlwLT5leGNoX2RtYV9oYW5kbGUpOworCWZjQ2hpcC0+RXhjaGFuZ2VzID0gTlVMTDsKKwlpZiAoY3BxZmNIQkFkYXRhLT5mY0xRICE9IE5VTEwpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhLT5QY2lEZXYsIHNpemVvZihGQ19MSU5LX1FVRSksCisJCQljcHFmY0hCQWRhdGEtPmZjTFEsIGNwcWZjSEJBZGF0YS0+ZmNMUV9kbWFfaGFuZGxlKTsKKwljcHFmY0hCQWRhdGEtPmZjTFEgPSBOVUxMOworfQorCisvLyBOb3RlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIGZvciBRIGFsaWdubWVudCEgIChUTC9UUyBVRyBwZy4gMTkwKQorLy8gV2UgcGxhY2UgY3JpdGljYWwgaW5kZXggcG9pbnRlcnMgYXQgZW5kIG9mIFFVRSBlbGVtZW50cyB0byBhc3Npc3QKKy8vIGluIG5vbi1zeW1ib2xpYyAoaS5lLiBtZW1vcnkgZHVtcCkgZGVidWdnaW5nCisvLyBvcGNvZGUgZGVmaW5lcyBwbGFjZW1lbnQgb2YgUXVldWVzIChlLmcuIGxvY2FsL2V4dGVybmFsIFJBTSkKKworaW50IENwcVRzQ3JlYXRlVGFjaExpdGVRdWVzKCB2b2lkKiBwSEJBLCBpbnQgb3Bjb2RlKQoreworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBKilwSEJBOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisKKyAgaW50IGlTdGF0dXM9MDsKKyAgdW5zaWduZWQgbG9uZyB1bEFkZHI7CisgIGRtYV9hZGRyX3QgRVJRZG1hLCBJTVFkbWEsIFNQUWRtYSwgU0VTVGRtYTsKKyAgaW50IGk7CisKKyAgLy8gTk9URSEgZmNNZW1NYW5hZ2VyKCkgd2lsbCByZXR1cm4gc3lzdGVtIHZpcnR1YWwgYWRkcmVzc2VzLgorICAvLyBTeXN0ZW0gKGtlcm5lbCkgdmlydHVhbCBhZGRyZXNzZXMsIHRob3VnaCBub24tcGFnZWQsIHN0aWxsCisgIC8vIGFyZW4ndCBwaHlzaWNhbCBhZGRyZXNzZXMuICBDb252ZXJ0IHRvIFBIWVNJQ0FMX0FERFJFU1MgZm9yIFRhY2h5b24ncworICAvLyBETUEgdXNlLgorICBFTlRFUigiQ3JlYXRlVGFjaExpdGVRdWVzIik7CisKKworICAvLyBBbGxvY2F0ZSBwcmltYXJ5IEVYQ0hBTkdFUyBhcnJheS4uLgorICBmY0NoaXAtPkV4Y2hhbmdlcyA9IE5VTEw7CisgIGNwcWZjSEJBZGF0YS0+ZmNMUSA9IE5VTEw7CisgIAorICAvKiBwcmludGsoIkFsbG9jYXRpbmcgJXUgZm9yICV1IEV4Y2hhbmdlcyAiLCAKKwkgIChVTE9ORylzaXplb2YoRkNfRVhDSEFOR0VTKSwgVEFDSF9NQVhfWElEKTsgKi8KKyAgZmNDaGlwLT5FeGNoYW5nZXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjcHFmY0hCQWRhdGEtPlBjaURldiwgCisJCQlzaXplb2YoRkNfRVhDSEFOR0VTKSwgJmZjQ2hpcC0+ZXhjaF9kbWFfaGFuZGxlKTsKKyAgLyogcHJpbnRrKCJAICVwXG4iLCBmY0NoaXAtPkV4Y2hhbmdlcyk7ICovCisKKyAgaWYoIGZjQ2hpcC0+RXhjaGFuZ2VzID09IE5VTEwgKSAvLyBmYXRhbCBlcnJvciEhCisgIHsKKyAgICBwcmludGsoInBjaV9hbGxvY19jb25zaXN0ZW50IGZhaWx1cmUgb24gRXhjaGFuZ2VzOiBmYXRhbCBlcnJvclxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIHplcm8gb3V0IHRoZSBlbnRpcmUgRVhDSEFOR0Ugc3BhY2UKKyAgbWVtc2V0KCBmY0NoaXAtPkV4Y2hhbmdlcywgMCwgc2l6ZW9mKCBGQ19FWENIQU5HRVMpKTsgIAorCisKKyAgLyogcHJpbnRrKCJBbGxvY2F0aW5nICV1IGZvciBMaW5rUSAiLCAoVUxPTkcpc2l6ZW9mKEZDX0xJTktfUVVFKSk7ICovCisgIGNwcWZjSEJBZGF0YS0+ZmNMUSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNwcWZjSEJBZGF0YS0+UGNpRGV2LAorCQkJCSBzaXplb2YoIEZDX0xJTktfUVVFKSwgJmNwcWZjSEJBZGF0YS0+ZmNMUV9kbWFfaGFuZGxlKTsKKyAgLyogcHJpbnRrKCJAICVwICgldSBlbGVtZW50cylcbiIsIGNwcWZjSEJBZGF0YS0+ZmNMUSwgRkNfTElOS1FfREVQVEgpOyAqLworCisgIGlmKCBjcHFmY0hCQWRhdGEtPmZjTFEgPT0gTlVMTCApIC8vIGZhdGFsIGVycm9yISEKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoInBjaV9hbGxvY19jb25zaXN0ZW50KCkgZmFpbHVyZSBvbiBmYyBMaW5rIFF1ZTogZmF0YWwgZXJyb3JcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyB6ZXJvIG91dCB0aGUgZW50aXJlIEVYQ0hBTkdFIHNwYWNlCisgIG1lbXNldCggY3BxZmNIQkFkYXRhLT5mY0xRLCAwLCBzaXplb2YoIEZDX0xJTktfUVVFKSk7ICAKKyAgCisgIC8vIFZlcmlmeSB0aGF0IGJhc2ljIFRhY2ggSS9PIHJlZ2lzdGVycyBhcmUgbm90IE5VTEwgIAorICBpZiggIWZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSApCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCJIQkEgYmFzZSBhZGRyZXNzIE5VTEw6IGZhdGFsIGVycm9yXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisgIC8vIEluaXRpYWxpemUgdGhlIGZjTWVtTWFuYWdlciBtZW1vcnkgcGFpcnMgKHN0b3JlcyBhbGxvY2F0ZWQvYWxpZ25lZAorICAvLyBwYWlycyBmb3IgZnV0dXJlIGZyZWVpbmcpCisgIG1lbXNldCggY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbSwgMCwgc2l6ZW9mKGNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW0pKTsKKyAgCisKKyAgLy8gQWxsb2NhdGUgVGFjaCdzIEV4Y2hhbmdlIFJlcXVlc3QgUXVldWUgKGVhY2ggRVJRIGVudHJ5IDMyIGJ5dGVzKQorICAKKyAgZmNDaGlwLT5FUlEgPSBmY01lbU1hbmFnZXIoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCAKKwkJCSZjcHFmY0hCQWRhdGEtPmR5bmFtaWNfbWVtWzBdLCAKKwkJCXNpemVvZiggVGFjaExpdGVFUlEgKSwgMzIqKEVSUV9MRU4pLCAwTCwgJkVSUWRtYSk7CisgIGlmKCAhZmNDaGlwLT5FUlEgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygicGNpX2FsbG9jX2NvbnNpc3RlbnQvYWxpZ25tZW50IGZhaWx1cmUgb24gRVJROiBmYXRhbCBlcnJvclxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZjQ2hpcC0+RVJRLT5sZW5ndGggPSBFUlFfTEVOLTE7CisgIHVsQWRkciA9IChVTE9ORykgRVJRZG1hOyAKKyNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyAgaWYoICh1bEFkZHIgPj4gMzIpICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoIiBGQVRBTCEgRVJRIHB0ciAlcCBleGNlZWRzIFRhY2h5b24ncyAzMi1iaXQgcmVnaXN0ZXIgc2l6ZVxuIiwKKwkJICAgICh2b2lkKil1bEFkZHIpOworICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZAorICB9CisjZW5kaWYKKyAgZmNDaGlwLT5FUlEtPmJhc2UgPSAoVUxPTkcpdWxBZGRyOyAgLy8gY29weSBmb3IgcXVpY2sgcmVmZXJlbmNlCisKKworICAvLyBBbGxvY2F0ZSBUYWNoJ3MgSW5ib3VuZCBNZXNzYWdlIFF1ZXVlICgzMiBieXRlcyBwZXIgZW50cnkpCisgIAorICBmY0NoaXAtPklNUSA9IGZjTWVtTWFuYWdlciggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIAorCQkgICZjcHFmY0hCQWRhdGEtPmR5bmFtaWNfbWVtWzBdLAorCQkgIHNpemVvZiggVGFjaHlvbklNUSApLCAzMiooSU1RX0xFTiksIDBMLCAmSU1RZG1hICk7CisgIGlmKCAhZmNDaGlwLT5JTVEgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygicGNpX2FsbG9jX2NvbnNpc3RlbnQvYWxpZ25tZW50IGZhaWx1cmUgb24gSU1ROiBmYXRhbCBlcnJvclxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZjQ2hpcC0+SU1RLT5sZW5ndGggPSBJTVFfTEVOLTE7CisKKyAgdWxBZGRyID0gSU1RZG1hOworI2lmIEJJVFNfUEVSX0xPTkcgPiAzMgorICBpZiggKHVsQWRkciA+PiAzMikgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygiIEZBVEFMISBJTVEgcHRyICVwIGV4Y2VlZHMgVGFjaHlvbidzIDMyLWJpdCByZWdpc3RlciBzaXplXG4iLAorCQkgICAgKHZvaWQqKXVsQWRkcik7CisgICAgcmV0dXJuIC0xOyAgLy8gZmFpbGVkCisgIH0KKyNlbmRpZgorICBmY0NoaXAtPklNUS0+YmFzZSA9IChVTE9ORyl1bEFkZHI7ICAvLyBjb3B5IGZvciBxdWljayByZWZlcmVuY2UKKworCisgIC8vIEFsbG9jYXRlIFRhY2gncyAgU2luZ2xlIEZyYW1lIFF1ZXVlICg2NCBieXRlcyBwZXIgZW50cnkpCisgIGZjQ2hpcC0+U0ZRID0gZmNNZW1NYW5hZ2VyKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgCisJCSAgJmNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW1bMF0sCisJCSAgc2l6ZW9mKCBUYWNoTGl0ZVNGUSApLCA2NCooU0ZRX0xFTiksMEwsICZTUFFkbWEgKTsKKyAgaWYoICFmY0NoaXAtPlNGUSApCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCJwY2lfYWxsb2NfY29uc2lzdGVudC9hbGlnbm1lbnQgZmFpbHVyZSBvbiBTRlE6IGZhdGFsIGVycm9yXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZmNDaGlwLT5TRlEtPmxlbmd0aCA9IFNGUV9MRU4tMTsgICAgICAvLyBpLmUuIFF1ZSBsZW5ndGggWyMgZW50cmllcyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaW4uIDMyOyBtYXguICA0MDk2ICgweGZmZmYpXQorICAKKyAgdWxBZGRyID0gU1BRZG1hOworI2lmIEJJVFNfUEVSX0xPTkcgPiAzMgorICBpZiggKHVsQWRkciA+PiAzMikgKQorICB7CisgICAgY3BxZmNfZnJlZV9kbWFfY29uc2lzdGVudChjcHFmY0hCQWRhdGEpOworICAgIHByaW50aygiIEZBVEFMISBTRlEgcHRyICVwIGV4Y2VlZHMgVGFjaHlvbidzIDMyLWJpdCByZWdpc3RlciBzaXplXG4iLAorCQkgICAgKHZvaWQqKXVsQWRkcik7CisgICAgcmV0dXJuIC0xOyAgLy8gZmFpbGVkCisgIH0KKyNlbmRpZgorICBmY0NoaXAtPlNGUS0+YmFzZSA9IChVTE9ORyl1bEFkZHI7ICAvLyBjb3B5IGZvciBxdWljayByZWZlcmVuY2UKKworCisgIC8vIEFsbG9jYXRlIFNDU0kgRXhjaGFuZ2UgU3RhdGUgVGFibGU7IGFsaWduZWQgbmVhcmVzdCBAc2l6ZW9mCisgIC8vIHBvd2VyLW9mLTIgYm91bmRhcnkKKyAgLy8gTElWRSBEQU5HRVJPVVNMWSEgIEFzc3VtZSB0aGUgYm91bmRhcnkgZm9yIFNFU1QgbWVtIHdpbGwKKyAgLy8gYmUgb24gcGh5c2ljYWwgcGFnZSAoZS5nLiA0aykgYm91bmRhcnkuCisgIC8qIHByaW50aygiQWxsb2NhdGluZyAldSBmb3IgVGFjaFNFU1QgZm9yICV1IEV4Y2hhbmdlc1xuIiwgCisJCSAoVUxPTkcpc2l6ZW9mKFRhY2hTRVNUKSwgVEFDSF9TRVNUX0xFTik7ICovCisgIGZjQ2hpcC0+U0VTVCA9IGZjTWVtTWFuYWdlciggY3BxZmNIQkFkYXRhLT5QY2lEZXYsCisJCSAgJmNwcWZjSEJBZGF0YS0+ZHluYW1pY19tZW1bMF0sCisJCSAgc2l6ZW9mKFRhY2hTRVNUKSwgIDQsIDBMLCAmU0VTVGRtYSApOworLy8JCSAgc2l6ZW9mKFRhY2hTRVNUKSwgIDY0KlRBQ0hfU0VTVF9MRU4sIDBMICk7CisgIGlmKCAhZmNDaGlwLT5TRVNUICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoInBjaV9hbGxvY19jb25zaXN0ZW50L2FsaWdubWVudCBmYWlsdXJlIG9uIFNFU1Q6IGZhdGFsIGVycm9yXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmb3IoIGk9MDsgaSA8IFRBQ0hfU0VTVF9MRU47IGkrKykgIC8vIGZvciBlYWNoIGV4Y2hhbmdlCisgICAgICBmY0NoaXAtPlNFU1QtPnNnUGFnZXNbaV0gPSBOVUxMOworCisgIGZjQ2hpcC0+U0VTVC0+bGVuZ3RoID0gVEFDSF9TRVNUX0xFTjsgIC8vIGUuZy4gRE9OJ1Qgc3VidHJhY3Qgb25lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFRML1RTIFVHLCBwZyAxNTMpCisKKyAgdWxBZGRyID0gU0VTVGRtYTsgCisjaWYgQklUU19QRVJfTE9ORyA+IDMyCisgIGlmKCAodWxBZGRyID4+IDMyKSApCisgIHsKKyAgICBjcHFmY19mcmVlX2RtYV9jb25zaXN0ZW50KGNwcWZjSEJBZGF0YSk7CisgICAgcHJpbnRrKCIgRkFUQUwhIFNGUSBwdHIgJXAgZXhjZWVkcyBUYWNoeW9uJ3MgMzItYml0IHJlZ2lzdGVyIHNpemVcbiIsCisJCSAgICAodm9pZCopdWxBZGRyKTsKKyAgICByZXR1cm4gLTE7ICAvLyBmYWlsZWQKKyAgfQorI2VuZGlmCisgIGZjQ2hpcC0+U0VTVC0+YmFzZSA9IChVTE9ORyl1bEFkZHI7ICAvLyBjb3B5IGZvciBxdWljayByZWZlcmVuY2UKKworCisJCQkgICAgICAvLyBOb3cgdGhhdCBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLAorCQkJICAgICAgLy8gZmlsbCBpbiBUYWNoeW9uIGNoaXAgcmVnaXN0ZXJzLi4uCisKKwkJCSAgICAgIC8vIEVFRUVFRUVFICBFWENIQU5HRSBSRVFVRVNUIFFVRVVFCisKKyAgd3JpdGVsKCBmY0NoaXAtPkVSUS0+YmFzZSwgCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9FUlFfQkFTRSkpOworICAgICAgCisgIHdyaXRlbCggZmNDaGlwLT5FUlEtPmxlbmd0aCwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0VSUV9MRU5HVEgpKTsKKyAgICAgCisKKyAgZmNDaGlwLT5FUlEtPnByb2R1Y2VySW5kZXggPSAwTDsKKyAgd3JpdGVsKCBmY0NoaXAtPkVSUS0+cHJvZHVjZXJJbmRleCwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0VSUV9QUk9EVUNFUl9JTkRFWCkpOworICAgICAgCisKKwkJLy8gTk9URSEgd3JpdGUgY29uc3VtZXIgaW5kZXggbGFzdCwgc2luY2UgdGhlIHdyaXRlCisJCS8vIGNhdXNlcyBUYWNoeW9uIHRvIHByb2Nlc3MgdGhlIG90aGVyIHJlZ2lzdGVycworCisgIHVsQWRkciA9ICgodW5zaWduZWQgbG9uZykmZmNDaGlwLT5FUlEtPmNvbnN1bWVySW5kZXggLSAKKwkJKHVuc2lnbmVkIGxvbmcpZmNDaGlwLT5FUlEpICsgKHVuc2lnbmVkIGxvbmcpIEVSUWRtYTsKKworICAvLyBOT1RFISBUYWNoeW9uIERNQXMgdG8gdGhlIEVSUSBjb25zdW1lciBJbmRleCBob3N0CisJCS8vIGFkZHJlc3M7IG11c3QgYmUgY29ycmVjdGx5IGFsaWduZWQKKyAgd3JpdGVsKCAoVUxPTkcpdWxBZGRyLAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRVJRX0NPTlNVTUVSX0lOREVYX0FEUikpOworCisKKworCQkJCSAvLyBJSUlJSUlJSUlJSUlJICBJTkJPVU5EIE1FU1NBR0UgUVVFVUUKKwkJCQkgLy8gVGVsbCBUYWNoeW9uIHdoZXJlIHRoZSBRdWUgc3RhcnRzCisKKyAgLy8gc2V0IHRoZSBIb3N0J3MgcG9pbnRlciBmb3IgVGFjaHlvbiB0byBhY2Nlc3MKKworICAvKiBwcmludGsoIiAgY3BxZmNUUzogd3JpdGluZyBJTVEgQkFTRSAlWGggICIsIGZjQ2hpcC0+SU1RLT5iYXNlICk7ICovCisgIHdyaXRlbCggZmNDaGlwLT5JTVEtPmJhc2UsIAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJTVFfQkFTRSkpOworCisgIHdyaXRlbCggZmNDaGlwLT5JTVEtPmxlbmd0aCwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgSU1RX0xFTkdUSCkpOworCisgIHdyaXRlbCggZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXgsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElNUV9DT05TVU1FUl9JTkRFWCkpOworCisKKwkJLy8gTk9URTogVGFjaExpdGUgRE1BcyB0byB0aGUgcHJvZHVjZXJJbmRleCBob3N0IGFkZHJlc3MKKwkJLy8gbXVzdCBiZSBjb3JyZWN0bHkgYWxpZ25lZCB3aXRoIGFkZHJlc3MgYml0cyAxLTAgY2xlYXJlZAorICAgIC8vIFdyaXRpbmcgdGhlIEJBU0UgcmVnaXN0ZXIgY2xlYXJzIHRoZSBQSSByZWdpc3Rlciwgc28gd3JpdGUgaXQgbGFzdAorICB1bEFkZHIgPSAoKHVuc2lnbmVkIGxvbmcpJmZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4IC0gCisJCSh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+SU1RKSArICh1bnNpZ25lZCBsb25nKSBJTVFkbWE7CisKKyNpZiBCSVRTX1BFUl9MT05HID4gMzIKKyAgaWYoICh1bEFkZHIgPj4gMzIpICkKKyAgeworICAgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgICBwcmludGsoIiBGQVRBTCEgSU1RIHB0ciAlcCBleGNlZWRzIFRhY2h5b24ncyAzMi1iaXQgcmVnaXN0ZXIgc2l6ZVxuIiwKKwkJICAgICh2b2lkKil1bEFkZHIpOworICAgIHJldHVybiAtMTsgIC8vIGZhaWxlZAorICB9CisjZW5kaWYKKyNpZiBEQkcKKyAgcHJpbnRrKCIgIFBJICVYaFxuIiwgKFVMT05HKXVsQWRkciApOworI2VuZGlmCisgIHdyaXRlbCggKFVMT05HKXVsQWRkciwgCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElNUV9QUk9EVUNFUl9JTkRFWCkpOworCisKKworCQkJCSAvLyBTU1NTU1NTU1NTU1NTU1MgU0lOR0xFIEZSQU1FIFNFUVVFTkNFCisJCQkJIC8vIFRlbGwgVGFjaExpdGUgd2hlcmUgdGhlIFF1ZSBzdGFydHMKKworICB3cml0ZWwoIGZjQ2hpcC0+U0ZRLT5iYXNlLCAKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1NGUV9CQVNFKSk7CisKKyAgd3JpdGVsKCBmY0NoaXAtPlNGUS0+bGVuZ3RoLAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU0ZRX0xFTkdUSCkpOworCisKKyAgICAgICAgIC8vIHRlbGwgVGFjaExpdGUgd2hlcmUgU0VTVCB0YWJsZSBpcyAmIGhvdyBsb25nCisgIHdyaXRlbCggZmNDaGlwLT5TRVNULT5iYXNlLAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU0VTVF9CQVNFKSk7CisKKyAgLyogcHJpbnRrKCIgIGNwcWZjVFM6IFNFU1QgJXAodmlydCk6IFdyb3RlIGJhc2UgJVhoIEAgJXBcbiIsCisgICAgZmNDaGlwLT5TRVNULCBmY0NoaXAtPlNFU1QtPmJhc2UsIAorICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9TRVNUX0JBU0UpOyAqLworCisgIHdyaXRlbCggZmNDaGlwLT5TRVNULT5sZW5ndGgsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9TRVNUX0xFTkdUSCkpOworICAgICAgCisgIHdyaXRlbCggKFRMX0VYVF9TR19QQUdFX0NPVU5ULTEpLAorICAgIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU0VTVF9TR19QQUdFKSk7CisKKworICBMRUFWRSgiQ3JlYXRlVGFjaExpdGVRdWVzIik7CisKKyAgcmV0dXJuIGlTdGF0dXM7Cit9CisKKworCisvLyBmdW5jdGlvbiB0byByZXR1cm4gVGFjaExpdGUgdG8gUG93ZXIgT24gc3RhdGUKKy8vIDFzdCAtIHJlc2V0IHRhY2h5b24gKCdTT0ZUJyByZXNldCkKKy8vIG90aGVycyAtIGZ1dHVyZQorCitpbnQgQ3BxVHNSZXNldFRhY2hMaXRlKHZvaWQgKnBIQkEsIGludCB0eXBlKQoreworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBKilwSEJBOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIFVMT05HIHVsQnVmZiwgaTsKKyAgaW50IHJldF9zdGF0dXM9MDsgLy8gZGVmLiBzdWNjZXNzCisKKyAgRU5URVIoIlJlc2V0VGFjaCIpOworICAKKyAgc3dpdGNoKHR5cGUpCisgIHsKKworICAgIGNhc2UgQ0xFQVJfRkNQT1JUUzoKKworICAgICAgLy8gaW4gY2FzZSBoZSB3YXMgcnVubmluZyBwcmV2aW91c2x5LCBtYXNrIFRhY2gncyBpbnRlcnJ1cHQKKyAgICAgIHdyaXRlYiggMCwgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElJTlRFTikpOworICAgICAgCisgICAgIC8vIGRlLWFsbG9jYXRlIG1lbSBmb3IgYW55IExvZ2dlZCBpbiBwb3J0cworICAgICAgLy8gKGUuZy4sIG91ciBtb2R1bGUgaXMgdW5sb2FkaW5nKQorICAgICAgLy8gc2VhcmNoIHRoZSBmb3J3YXJkIGxpbmtlZCBsaXN0LCBkZS1hbGxvY2F0aW5nCisgICAgICAvLyB0aGUgbWVtb3J5IHdlIGFsbG9jYXRlZCB3aGVuIHRoZSBwb3J0IHdhcyBpbml0aWFsbHkgbG9nZ2VkIGluCisgICAgICB7CisgICAgICAgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQgPSBmY0NoaXAtPmZjUG9ydHMucE5leHRQb3J0OworICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwdHI7CisvLyAgICAgICAgcHJpbnRrKCJjaGVja2luZyBmb3IgYWxsb2NhdGVkIExvZ2dlZEluUG9ydHMuLi5cbiIpOworCQkJCisgICAgICAgIHdoaWxlKCBwTG9nZ2VkSW5Qb3J0ICkKKyAgICAgICAgeworICAgICAgICAgIHB0ciA9IHBMb2dnZWRJblBvcnQ7CisgICAgICAgICAgcExvZ2dlZEluUG9ydCA9IHB0ci0+cE5leHRQb3J0OworLy8JICBwcmludGsoImtmcmVlKCVwKSBvbiBGQyBMb2dnZWRJblBvcnQgcG9ydF9pZCAweCUwNmxYXG4iLAorLy8JCQkgIHB0ciwgcHRyLT5wb3J0X2lkKTsKKyAgICAgICAgICBrZnJlZSggcHRyICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIChjb250aW51ZSByZXNldHRpbmcgaGFyZHdhcmUuLi4pCisKKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgIC8vIFJFU1RBUlQgVGFjaHlvbiAocG93ZXItdXAgc3RhdGUpCisKKyAgICAgIC8vIGluIGNhc2UgaGUgd2FzIHJ1bm5pbmcgcHJldmlvdXNseSwgbWFzayBUYWNoJ3MgaW50ZXJydXB0CisgICAgICB3cml0ZWIoIDAsIChmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJSU5URU4pKTsKKwkJCSAgICAgIC8vIHR1cm4gT0ZGIGxhc2VyIChOT1RFOiBsYXNlciBpcyB0dXJuZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZiBkdXJpbmcgcmVzZXQsIGJlY2F1c2UgR1BJTzQgaXMgY2xlYXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gMCBieSByZXNldCBhY3Rpb24gLSBzZWUgVExVTSwgc2VjIDcuMjIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBDUFEgNjQtYml0IEhCQXMgaGF2ZSBhICJoZWFsdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNpcmN1aXQiIHdoaWNoIGtlZXBzIGxhc2VyIE9OIGZvciBhIGJyaWVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJpb2QgYWZ0ZXIgaXQgaXMgdHVybmVkIG9mZiAoIDwgMXMpCisgICAgICAKKyAgICAgIGZjQ2hpcC0+TGFzZXJDb250cm9sKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDApOworICAKKworCisgICAgICAgICAgICAvLyBzb2Z0IHJlc2V0IHRpbWluZyBjb25zdHJhaW50cyByZXF1aXJlOgorICAgICAgICAgICAgLy8gICAxLiBzZXQgUlNUIHRvIDEKKyAgICAgICAgICAgIC8vICAgMi4gcmVhZCBTT0ZUUlNUIHJlZ2lzdGVyIAorICAgICAgICAgICAgLy8gICAgICAoMTI4IHRpbWVzIHBlciBSLiBDYWxsaXNvbiBjb2RlKQorICAgICAgICAgICAgLy8gICAzLiBjbGVhciBQQ0kgaW50cworICAgICAgICAgICAgLy8gICA0LiBjbGVhciBSU1QgdG8gMAorICAgICAgd3JpdGVsKCAweGZmMDAwMDAxTCwKKyAgICAgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9TT0ZUUlNUKSk7CisgICAgICAgIAorICAgICAgZm9yKCBpPTA7IGk8MTI4OyBpKyspCisgICAgICAgIHVsQnVmZiA9IHJlYWRsKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU09GVFJTVCk7CisKKyAgICAgICAgLy8gY2xlYXIgdGhlIHNvZnQgcmVzZXQKKyAgICAgIGZvciggaT0wOyBpPDg7IGkrKykKKyAgCXdyaXRlbCggMCwgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9TT0ZUUlNUKSk7CisKKyAgICAgICAgICAgICAgIAorCisJCQkgICAgICAgLy8gY2xlYXIgb3V0IG91ciBjb3B5IG9mIFRhY2ggcmVncywKKwkJCSAgICAgICAvLyBiZWNhdXNlIHRoZXkgbXVzdCBiZSBpbnZhbGlkIG5vdywKKwkJCSAgICAgICAvLyBzaW5jZSBUYWNoTGl0ZSByZXNldCBhbGwgaGlzIHJlZ3MuCisgICAgICBDcHFUc0Rlc3Ryb3lUYWNoTGl0ZVF1ZXMoY3BxZmNIQkFkYXRhLDApOyAvLyByZW1vdmUgSG9zdC1iYXNlZCBRdWUgc3RydWN0cworICAgICAgY3BxZmNUU0NsZWFyTGlua1N0YXR1c0NvdW50ZXJzKGZjQ2hpcCk7ICAvLyBjbGVhciBvdXIgcy93IGFjY3VtdWxhdG9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvd2VyIGJpdHMgZ2l2ZSBHQklDIGluZm8KKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLnZhbHVlID0gCisJICAgICAgICAgICAgICByZWFkbCggZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMuYWRkcmVzcyApOworICAgICAgYnJlYWs7CisKKy8qCisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAvLyBmcmVlemUgU0NTSQorICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgT3V0Ym91bmQgY29tbWFuZCBxdWUgKEVSUSkKKyAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgIC8vIHVuZnJlZXplIE9TTSAoT3V0Ym91bmQgU2VxLiBNYW4uKSAnZXInCisgICAgY2FzZSA1OiAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgc3RhdHVzCisKKyAgICBicmVhazsKKyovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldF9zdGF0dXMgPSAtMTsgIC8vIGludmFsaWQgb3B0aW9uIHBhc3NlZCB0byBSRVNFVCBmdW5jdGlvbgorICAgICAgYnJlYWs7CisgIH0KKyAgTEVBVkUoIlJlc2V0VGFjaCIpOworICByZXR1cm4gcmV0X3N0YXR1czsKK30KKworCisKKworCisKKy8vICdhZGRyQmFzZScgaXMgSU9CYXNlVSBmb3IgYm90aCBUYWNoTGl0ZSBhbmQgKG9sZGVyKSBUYWNoeW9uCitpbnQgQ3BxVHNMYXNlckNvbnRyb2woIHZvaWQqIGFkZHJCYXNlLCBpbnQgb3Bjb2RlICkKK3sKKyAgVUxPTkcgZHdCdWZmOworCisgIGR3QnVmZiA9IHJlYWRsKChhZGRyQmFzZSArIFRMX01FTV9UQUNIX0NPTlRST0wpICk7IC8vIHJlYWQgVEwgQ29udHJvbCByZWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY2hhbmdlIG9ubHkgYml0IDQpCisgIGlmKCBvcGNvZGUgPT0gMSkKKyAgICBkd0J1ZmYgfD0gfjB4ZmZmZmZmZWZMOyAvLyBzZXQgLSBPTgorICBlbHNlCisgICAgZHdCdWZmICY9IDB4ZmZmZmZmZWZMOyAgLy8gY2xlYXIgLSBPRkYKKyAgd3JpdGVsKCBkd0J1ZmYsIChhZGRyQmFzZSArIFRMX01FTV9UQUNIX0NPTlRST0wpKTsgLy8gd3JpdGUgVEwgQ29udHJvbCByZWcKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKworLy8gVXNlIGNvbnRyb2xsZXIncyAiT3B0aW9ucyIgZmllbGQgdG8gZGV0ZXJtaW5lIGxvb3BiYWNrIG1vZGUgKGlmIGFueSkKKy8vICAgaW50ZXJuYWwgbG9vcGJhY2sgKHNpbGljb24gLSBubyBHQklDKQorLy8gICBleHRlcm5hbCBsb29wYmFjayAoR0JJQyAtIG5vIEZDIGxvb3ApCisvLyAgIG5vIGxvb3BiYWNrOiBMX1BPUlQsIGV4dGVybmFsIGNhYmxlIGZyb20gR0JJQyByZXF1aXJlZAorCitpbnQgQ3BxVHNJbml0aWFsaXplRnJhbWVNYW5hZ2VyKCB2b2lkICpwQ2hpcCwgaW50IG9wY29kZSkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwOworICBpbnQgaVN0YXR1czsKKyAgVUxPTkcgd3duTG8sIHd3bkhpOyAvLyBmb3IgcmVhZGJhY2sgdmVyaWZpY2F0aW9uCisKKyAgRU5URVIoIkluaXRpYWxpemVGcmFtZU1hbmFnZXIiKTsKKyAgZmNDaGlwID0gKFBUQUNIWU9OKXBDaGlwOworICBpZiggIWZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSApICAgLy8gdW5kZWZpbmVkIGNvbnRyb2xsZXI/CisgICAgcmV0dXJuIC0xOworCisgIC8vIFRML1RTIFVHLCBwZy4gMTg0CisgIC8vIDB4MDA2NSA9IDEwMG1zIGZvciBSVF9UT1YKKyAgLy8gMHgwMWY1ID0gNTAwbXMgZm9yIEVEX1RPVgorICAvLyAweDA3RDEgPSAyMDAwbXMgCisgIGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSA9IDB4MDA2NTA3RDE7IAorICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSwKKyAgICAoZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LmFkZHJlc3MpKTsKKyAgICAgIAorCisgIC8vIFNldCBMUF9UT1YgdG8gdGhlIEZDLUFMMiBzcGVjaWZpZWQgMiBzZWNzLgorICAvLyBUTC9UUyBVRywgcGcuIDE4NQorICB3cml0ZWwoIDB4MDdkMDAwMTAsIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArVExfTUVNX0ZNX1RJTUVPVVQyKTsKKworCisgIC8vIE5vdyB0cnkgdG8gcmVhZCB0aGUgV1dOIGZyb20gdGhlIGFkYXB0ZXIncyBOVlJBTQorICBpU3RhdHVzID0gQ3BxVHNSZWFkV3JpdGVXV04oIGZjQ2hpcCwgMSk7IC8vICcxJyBmb3IgUkVBRAorCisgIGlmKCBpU3RhdHVzICkgICAvLyBOVlJBTSByZWFkIGZhaWxlZD8KKyAgeworICAgIHByaW50aygiIFdBUk5JTkchIEhCQSBOVlJBTSBXV04gcmVhZCBmYWlsZWQgLSBtYWtlIGFsaWFzXG4iKTsKKyAgICAvLyBtYWtlIHVwIGEgV1dOLiAgSWYgTlVMTCBvciBkdXBsaWNhdGVkIG9uIGxvb3AsIEZDIGxvb3AgbWF5IGhhbmchCisKKworICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaSA9IChfX3UzMilqaWZmaWVzOworICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaSB8PSAweDUwMDAwMDAwTDsKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy53d25fbG8gPSAweDQ0NTU2Njc3TDsKKyAgfQorCisgIAorICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaSwgCisJICBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fV1dOX0hJKTsKKyAgCisgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMud3duX2xvLCAKKwkgIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9XV05fTE8pOworCSAgCisKKyAgLy8gcmVhZGJhY2sgZm9yIHZlcmlmaWNhdGlvbjoKKyAgd3duSGkgPSByZWFkbCggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX1dXTl9ISSApOyAKKyAgICAgICAgICAKKyAgd3duTG8gPSByZWFkbCggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX1dXTl9MTyk7CisgIC8vIHRlc3QgZm9yIGNvcnJlY3QgY2hpcCByZWdpc3RlciBXUklURS9SRUFECisgIERFQlVHX1BDSSggcHJpbnRrKCIgIFdXTiAlMDhYJTA4WFxuIiwKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy53d25faGksIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbyApICk7CisgICAgCisgIGlmKCB3d25IaSAhPSBmY0NoaXAtPlJlZ2lzdGVycy53d25faGkgfHwKKyAgICAgIHd3bkxvICE9IGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbyApCisgIHsKKyAgICBwcmludGsoICJjcHFmY1RTOiBXb3JsZFdpZGVOYW1lIHJlZ2lzdGVyIGxvYWQgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gLTE7IC8vIEZBSUxFRCEKKyAgfQorCisKKworCQkJLy8gc2V0IEZyYW1lIE1hbmFnZXIgSW5pdGlhbGl6ZSBjb21tYW5kCisgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29udHJvbC52YWx1ZSA9IDB4MDY7CisKKyAgLy8gTm90ZTogZm9yIHRlc3QvZGVidWcgcHVycG9zZXMsIHdlIG1heSB1c2UgIkhhcmQiIGFkZHJlc3MsCisgIC8vIGJ1dCB3ZSBjb21wbGV0ZWx5IHN1cHBvcnQgInNvZnQiIGFkZHJlc3NpbmcsIGluY2x1ZGluZworICAvLyBkeW5hbWljYWxseSBjaGFuZ2luZyBvdXIgYWRkcmVzcy4KKyAgaWYoIGZjQ2hpcC0+T3B0aW9ucy5pbnRMb29wYmFjayA9PSAxICkgICAgICAgICAgICAvLyBpbnRlcm5hbCBsb29wYmFjaworICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLnZhbHVlID0gMHgwZjAwMjA4MEw7CisgIGVsc2UgaWYoIGZjQ2hpcC0+T3B0aW9ucy5leHRMb29wYmFjayA9PSAxICkgICAgICAgICAgICAvLyBpbnRlcm5hbCBsb29wYmFjaworICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLnZhbHVlID0gMHgwZjAwNDA4MEw7CisgIGVsc2UgICAgICAgICAgICAgICAgICAvLyBMX1BvcnQKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSA9IDB4NTUwMDAxMDBMOyAvLyBoYXJkIGFkZHJlc3MgKDU1aCBzdGFydCkKKy8vICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLnZhbHVlID0gMHgwMTAwMDA4MEw7IC8vIHNvZnQgYWRkcmVzcyAoY2FuJ3QgcGljaykKKy8vICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLnZhbHVlID0gMHg1NTAwMDEwMEw7IC8vIGhhcmQgYWRkcmVzcyAoNTVoIHN0YXJ0KQorCQkKKyAgLy8gd3JpdGUgY29uZmlnIHRvIEZNCisKKyAgaWYoICFmY0NoaXAtPk9wdGlvbnMuaW50TG9vcGJhY2sgJiYgIWZjQ2hpcC0+T3B0aW9ucy5leHRMb29wYmFjayApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFsc28gbmVlZCBMQVNFUiBmb3IgcmVhbCBMT09QKQorICAgIGZjQ2hpcC0+TGFzZXJDb250cm9sKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDEpOyAvLyB0dXJuIG9uIExBU0VSCisKKyAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy52YWx1ZSwKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbmZpZy5hZGRyZXNzKTsKKyAgICAKKworCQkJICAgICAgIC8vIGlzc3VlIElOSVRJQUxJWkUgY29tbWFuZCB0byBGTSAtIEFDVElPTiEKKyAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5GTWNvbnRyb2wudmFsdWUsCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb250cm9sLmFkZHJlc3MpOworICAgIAorICBMRUFWRSgiSW5pdGlhbGl6ZUZyYW1lTWFuYWdlciIpOworICAKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKworLy8gVGhpcyAibG9vayBhaGVhZCIgZnVuY3Rpb24gZXhhbWluZXMgdGhlIElNUSBmb3Igb2NjdXJyZW5jZSBvZgorLy8gInR5cGUiLiAgUmV0dXJucyAxIGlmIGZvdW5kLCAwIGlmIG5vdC4KK3N0YXRpYyBpbnQgUGVla0lNUUVudHJ5KCBQVEFDSFlPTiBmY0NoaXAsIFVMT05HIHR5cGUpCit7CisgIFVMT05HIENJID0gZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXg7CisgIFVMT05HIFBJID0gZmNDaGlwLT5JTVEtPnByb2R1Y2VySW5kZXg7IC8vIHNuYXBzaG90IG9mIElNUSBpbmRleGVzCisgIAorICB3aGlsZSggQ0kgIT0gUEkgKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZWVkIHdpdGggc2VhcmNoCisgICAgaWYoICgrK0NJKSA+PSBJTVFfTEVOICkgQ0kgPSAwOyAvLyByb2xsb3ZlciBjaGVjaworICAgIAorICAgIHN3aXRjaCggdHlwZSApCisgICAgeworICAgICAgY2FzZSBFTFNfTElMUF9GUkFNRToKKyAgICAgIHsKKyAgICAgIC8vIGZpcnN0LCB3ZSBuZWVkIHRvIGZpbmQgYW4gSW5ib3VuZCBDb21wbGV0aW9uIG1lc3NhZ2UsCisgICAgICAvLyBJZiB3ZSBmaW5kIGl0LCBjaGVjayB0aGUgaW5jb21pbmcgZnJhbWUgcGF5bG9hZCAoMXN0IHdvcmQpCisgICAgICAvLyBmb3IgTElMUCBmcmFtZQorICAgICAgICBpZiggKGZjQ2hpcC0+SU1RLT5RRW50cnlbQ0ldLnR5cGUgJiAweDFGRikgPT0gMHgxMDQgKQorICAgICAgICB7IAorICAgICAgICAgIFRhY2hGQ0hEUl9HQ01ORCogZmNoczsKKyNlcnJvciBUaGlzIGlzIHRvbyBtdWNoIHN0YWNrCisgICAgICAgICAgVUxPTkcgdWxGaWJyZUZyYW1lWzIwNDgvNF07ICAvLyBtYXggRFdPUkRTIGluIGluY29taW5nIEZDIEZyYW1lCisJICBVU0hPUlQgU0ZRcGkgPSAoVVNIT1JUKShmY0NoaXAtPklNUS0+UUVudHJ5W0NJXS53b3JkWzBdICYgMHgwZmZmTCk7CisKKwkgIENwcVRzR2V0U0ZRRW50cnkoIGZjQ2hpcCwKKyAgICAgICAgICAgIFNGUXBpLCAgICAgICAgLy8gU0ZRIHByb2R1Y2VyIG5keCAgICAgICAgIAorCSAgICB1bEZpYnJlRnJhbWUsIC8vIGNvbnRpZ3VvdXMgZGVzdC4gYnVmZmVyCisJICAgIEZBTFNFKTsgICAgICAgLy8gRE9OJ1QgdXBkYXRlIGNoaXAtLXRoaXMgaXMgYSAibG9va2FoZWFkIgorICAgICAgICAgIAorCSAgZmNocyA9IChUYWNoRkNIRFJfR0NNTkQqKSZ1bEZpYnJlRnJhbWU7CisgICAgICAgICAgaWYoIGZjaHMtPnBsWzBdID09IEVMU19MSUxQX0ZSQU1FKQorCSAgeworICAgICAgICAgICAgcmV0dXJuIDE7IC8vIGZvdW5kIHRoZSBMSUxQIGZyYW1lIQorCSAgfQorCSAgZWxzZQorCSAgeworCSAgICAvLyBrZWVwIGxvb2tpbmcuLi4KKwkgIH0KKwl9ICAKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9VVEJPVU5EX0NPTVBMRVRJT046CisgICAgICAgIGlmKCAoZmNDaGlwLT5JTVEtPlFFbnRyeVtDSV0udHlwZSAmIDB4MUZGKSA9PSAweDAwICkKKwl7CisKKyAgICAgICAgICAvLyBhbnkgT0NNIGVycm9ycz8KKyAgICAgICAgICBpZiggZmNDaGlwLT5JTVEtPlFFbnRyeVtDSV0ud29yZFsyXSAmIDB4N2EwMDAwMDBMICkKKyAgICAgICAgICAgIHJldHVybiAxOyAgIAkgICAgLy8gZm91bmQgT0NNIGVycm9yCisJfQorICAgICAgYnJlYWs7CisKKworICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAwOyAvLyBmYWlsZWQgdG8gZmluZCAidHlwZSIKK30KKworCQkJCitzdGF0aWMgdm9pZCBTZXRUYWNoVE9WKCBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7IAorICAKKyAgLy8gVEwvVFMgVUcsIHBnLiAxODQKKyAgLy8gMHgwMDY1ID0gMTAwbXMgZm9yIFJUX1RPVgorICAvLyAweDAxZjUgPSA1MDBtcyBmb3IgRURfVE9WCisgIC8vIDB4MDdkMSA9IDIwMDBtcyBmb3IgRURfVE9WCisKKyAgLy8gU0FOTWFyayBMZXZlbCAxIHJlcXVpcmVzIGFuICJpbml0aWFsaXphdGlvbiBiYWNrb2ZmIgorICAvLyAoU2VlICJTQU5NYXJrIFRlc3QgU3VpdGUgTGV2ZWwgMSI6CisgIC8vIGluaXRpYWxpemF0aW9uX3RpbWVvdXQuZmNhbC5TQU5NYXJrLTEuZmMpCisgIC8vIFdlIGhhdmUgdG8gdXNlIDJzZWMsIDI0c2VjLCB0aGVuIDEyOHNlYyB3aGVuIGxvZ2luLworICAvLyBwb3J0IGRpc2NvdmVyeSBwcm9jZXNzZXMgZmFpbCB0byBjb21wbGV0ZS4KKyAgCisgIC8vIHdoZW4gcG9ydCBkaXNjb3ZlcnkgY29tcGxldGVzIChsb2dpbnMgZG9uZSksIHdlIHNldAorICAvLyBFRF9UT1YgdG8gNTAwbXMgLS0gdGhpcyBpcyB0aGUgbm9ybWFsIG9wZXJhdGlvbmFsIGNhc2UKKyAgLy8gT24gdGhlIGZpcnN0IExpbmsgRG93biwgd2UnbGwgbW92ZSB0byAyIHNlY3MgKDdEMSBtcykKKyAgaWYoIChmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUgJjB4RkZGRikgPD0gMHgxZjUpCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlID0gMHgwMDY1MDdEMTsgCisgIAorICAvLyBJZiB3ZSBnZXQgYW5vdGhlciBMU1QgYWZ0ZXIgd2UgbW92ZWQgVE9WIHRvIDIgc2VjLAorICAvLyBpbmNyZWFzZSB0byAyNCBzZWNvbmRzICg1REMxIG1zKSBwZXIgU0FOTWFyayEKKyAgZWxzZSBpZiggKGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSAmMHhGRkZGKSA8PSAweDdEMSkKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUgPSAweDAwNjU1REMxOyAKKworICAvLyBJZiB3ZSBnZXQgc3RpbGwgYW5vdGhlciBMU1QsIHNldCB0aGUgbWF4IFRPViAoVGFjaHlvbgorICAvLyBoYXMgb25seSAxNiBiaXRzIGZvciBtcyB0aW1lciwgc28gdGhlIG1heCBpcyA2NS41IHNlYykKKyAgZWxzZSBpZiggKGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi52YWx1ZSAmMHhGRkZGKSA8PSAweDVEQzEpCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlID0gMHgwMDY1RkZGRjsgCisKKyAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5lZF90b3YudmFsdWUsCisgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi5hZGRyZXNzKSk7CisgIC8vIGtlZXAgdGhlIHNhbWUgMnNlYyBMUF9UT1YgCisgIHdyaXRlbCggMHgwN0QwMDAxMCwgZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICtUTF9NRU1fRk1fVElNRU9VVDIpOworfQkKKworCisvLyBUaGUgSU1RIGlzIGFuIGFycmF5IHdpdGggSU1RX0xFTiBsZW5ndGgsIGVhY2ggZWxlbWVudCAoUUVudHJ5KQorLy8gd2l0aCBlaWdodCAzMi1iaXQgd29yZHMuICBUYWNoeW9uIFBST0RVQ0VTIGEgUUVudHJ5IHdpdGggZWFjaAorLy8gbWVzc2FnZSBpdCB3YW50cyB0byBzZW5kIHRvIHRoZSBob3N0LiAgVGhlIGhvc3QgQ09OU1VNRVMgSU1RIGVudHJpZXMKKworLy8gVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIGN1cnJlbnQKKy8vIChvciBvbGRlc3Qgbm90LXlldC1wcm9jZXNzZWQpIFFFbnRyeSB0bworLy8gdGhlIGNhbGxlciwgY2xlYXJzLyByZS1lbmFibGVzIHRoZSBpbnRlcnJ1cHQsIGFuZCB1cGRhdGVzIHRoZQorLy8gKEhvc3QpIENvbnN1bWVyIEluZGV4LgorLy8gUmV0dXJuIHZhbHVlOgorLy8gIDAgICBtZXNzYWdlIHByb2Nlc3NlZCwgbm9uZSByZW1haW4gKHByb2R1Y2VyIGFuZCBjb25zdW1lcgorLy8gICAgICAgIGluZGV4ZXMgbWF0Y2gpCisvLyAgMSAgIG1lc3NhZ2UgcHJvY2Vzc2VkLCBtb3JlIG1lc3NhZ2VzIHJlbWFpbgorLy8gLTEgICBubyBtZXNzYWdlIHByb2Nlc3NlZCAtIG5vbmUgd2VyZSBhdmFpbGFibGUgdG8gcHJvY2VzcworLy8gUmVtYXJrczoKKy8vICAgVEwvVFMgVUcgc3BlY2lmaWNlcyB0aGF0IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBmb3IKKy8vICAgSU5UQV9MIGhhbmRsaW5nOgorLy8gICAxLiByZWFkIFBDSSBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyICgweGZmKQorLy8gICAyLiBhbGwgSU1RIG1lc3NhZ2VzIHNob3VsZCBiZSBwcm9jZXNzZWQgYmVmb3JlIHdyaXRpbmcgdGhlCisvLyAgICAgIElNUSBjb25zdW1lciBpbmRleC4KKworCitpbnQgQ3BxVHNQcm9jZXNzSU1RRW50cnkodm9pZCAqaG9zdCkKK3sKKyAgc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWhvc3Q7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsgCisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIGludCBpU3RhdHVzOworICBVU0hPUlQgaSwgUlBDc2V0LCBEUENzZXQ7CisgIFVMT05HIHhfSUQ7CisgIFVMT05HIHVsQnVmZiwgZHdTdGF0dXM7CisgIFRhY2hGQ0hEUl9HQ01ORCogZmNoczsKKyNlcnJvciBUaGlzIGlzIHRvbyBtdWNoIHN0YWNrCisgIFVMT05HIHVsRmlicmVGcmFtZVsyMDQ4LzRdOyAgLy8gbWF4IG51bWJlciBvZiBEV09SRFMgaW4gaW5jb21pbmcgRmlicmUgRnJhbWUKKyAgVUNIQVIgdWNJbmJvdW5kTWVzc2FnZVR5cGU7ICAvLyBJbmJvdW5kIENNLCBkd29yZCAzICJ0eXBlIiBmaWVsZAorCisgIEVOVEVSKCJQcm9jZXNzSU1RRW50cnkiKTsKKyAgIAorCisJCQkJLy8gY2hlY2sgVGFjaExpdGUncyBJTVEgcHJvZHVjZXIgaW5kZXggLQorCQkJCS8vIGlzIGEgbmV3IG1lc3NhZ2Ugd2FpdGluZyBmb3IgdXM/CisJCQkJLy8gZXF1YWwgaW5kZXhlcyBtZWFucyBlbXB0eSBxdWUKKworICBpZiggZmNDaGlwLT5JTVEtPnByb2R1Y2VySW5kZXggIT0gZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXggKQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHByb2Nlc3MgbWVzc2FnZQorCisKKyNpZmRlZiBJTVFfREVCVUcKKyAgICBwcmludGsoIlBJICVYLCBDSSAlWCAgdHlwZTogJVhcbiIsIAorICAgICAgZmNDaGlwLT5JTVEtPnByb2R1Y2VySW5kZXgsZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXgsCisgICAgICBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS50eXBlKTsKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgLy8gRXhhbWluZSBDb21wbGV0aW9uIE1lc3NhZ2VzIGluIElNUQorICAgIC8vIHdoYXQgQ01fVHlwZT8KKyAgICBzd2l0Y2goIChVQ0hBUikoZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0udHlwZQorICAgICAgICAgICAgICAgICAgICAmIDB4ZmZMKSApCisgICAgeworICAgIGNhc2UgT1VUQk9VTkRfQ09NUExFVElPTjoKKworICAgICAgLy8gUmVtYXJrczoKKyAgICAgIC8vIHhfSURzIChPWF9JRCwgUlhfSUQpIGFyZSBwYXJ0aXRpb25lZCBieSBTRVNUIGVudHJpZXMKKyAgICAgIC8vIChzdGFydGluZyBhdCAwKSwgYW5kIFNGUyBlbnRyaWVzIChzdGFydGluZyBhdAorICAgICAgLy8gU0VTVF9MRU4gLS0gb3V0c2lkZSB0aGUgU0VTVCBzcGFjZSkuCisgICAgICAvLyBQc3VlZG8gY29kZToKKyAgICAgIC8vIHhfSUQgKE9YX0lEIG9yIFJYX0lEKSBmcm9tIG1lc3NhZ2UgaXMgVHJhbnNfSUQgb3IgU0VTVCBpbmRleAorICAgICAgLy8gcmFuZ2UgY2hlY2sgLSB4X0lECisgICAgICAvLyAgIGlmIHhfSUQgb3V0c2lkZSAnVHJhbnNhY3Rpb25zJyBsZW5ndGgsIGVycm9yIC0gZXhpdAorICAgICAgLy8gaWYgYW55IE9DTSBlcnJvciwgY29weSBlcnJvciBzdGF0dXMgdG8gRXhjaGFuZ2Ugc2xvdAorICAgICAgLy8gaWYgRkNQIEFTU0lTVCB0cmFuc2FjdGlvbiAoeF9JRCB3aXRoaW4gU0VTVCksCisgICAgICAvLyAgIGNhbGwgZmNDb21wbGV0ZSAodG8gQXBwKQorICAgICAgLy8gLi4uCisKKworICAgICAgdWxCdWZmID0gZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsxXTsKKyAgICAgIHhfSUQgPSB1bEJ1ZmYgJiAweDdmZmZMOyAgICAgLy8gbG93ZXIgMTQgYml0cyBTRVNUX0luZGV4L1RyYW5zX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmFuZ2UgY2hlY2sgQ00gT1gvUlhfSUQgdmFsdWUuLi4KKyAgICAgIGlmKCB4X0lEIDwgVEFDSF9NQVhfWElEICkgICAvLyBkb24ndCBnbyBiZXlvbmQgYXJyYXkgc3BhY2UKKyAgICAgIHsKKworCisJaWYoIHVsQnVmZiAmIDB4MjAwMDAwMDBMICkgLy8gUlBDIC1SZXNwb25zZSBQaGFzZSBDb21wbGV0ZT8KKyAgICAgICAgICBSUENzZXQgPSAxOyAgICAgICAgICAgICAgLy8gKFNFU1QgdHJhbnNhY3Rpb25zIG9ubHkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBSUENzZXQgPSAwOworCisgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDQwMDAwMDAwTCApIC8vIERQQyAtRGF0YSBQaGFzZSBDb21wbGV0ZT8KKyAgICAgICAgICBEUENzZXQgPSAxOyAgICAgICAgICAgICAgLy8gKFNFU1QgdHJhbnNhY3Rpb25zIG9ubHkpCisgICAgICAgIGVsc2UKKyAgICAgICAgICBEUENzZXQgPSAwOworICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc3RhdHVzIGZvciB0aGlzIE91dGJvdW5kIHRyYW5zYWN0aW9uJ3MgSUQKKyAgICAgICAgZHdTdGF0dXMgPSAwTDsKKyAgICAgICAgaWYoIHVsQnVmZiAmIDB4MTAwMDAwMDBMICkgLy8gU1BFPyAoU0VTVCBQcm9ncmFtbWluZyBFcnJvcikKKyAgICAgICAgICAgIGR3U3RhdHVzIHw9IFNFU1RQUk9HX0VSUjsKKworICAgICAgICB1bEJ1ZmYgPSBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS53b3JkWzJdOworICAgICAgICBpZiggdWxCdWZmICYgMHg3YTAwMDAwMEwgKSAvLyBhbnkgb3RoZXIgZXJycz8KKyAgICAgICAgeworICAgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDQwMDAwMDAwTCApCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBJTlZfRU5UUlk7CisgICAgICAgICAgaWYoIHVsQnVmZiAmIDB4MjAwMDAwMDBMICkKKyAgICAgICAgICAgIGR3U3RhdHVzIHw9IEZSQU1FX1RPOyAgICAgICAgLy8gRlRPCisgICAgICAgICAgaWYoIHVsQnVmZiAmIDB4MTAwMDAwMDBMICkKKyAgICAgICAgICAgIGR3U3RhdHVzIHw9IEhPU1RQUk9HX0VSUjsKKyAgICAgICAgICBpZiggdWxCdWZmICYgMHgwODAwMDAwMEwgKQorICAgICAgICAgICAgZHdTdGF0dXMgfD0gTElOS0ZBSUxfVFg7CisgICAgICAgICAgaWYoIHVsQnVmZiAmIDB4MDIwMDAwMDBMICkKKyAgICAgICAgICAgIGR3U3RhdHVzIHw9IEFCT1JUU0VRX05PVElGWTsgIC8vIEFTTgorICAgICAgICB9CisKKwkgIAorCWlmKCBkd1N0YXR1cyApICAgICAgICAgIC8vIGFueSBlcnJvcnM/CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgT3V0Ym91bmQgQ29tcGxldGlvbiBzdGF0dXMKKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgfD0gZHdTdGF0dXM7CisKKyAgICAgICAgICAvLyBpZiB0aGlzIE91dGJvdW5kIGZyYW1lIHdhcyBmb3IgYSBTRVNUIGVudHJ5LCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgLy8gcmVxdWUgaXQgaW4gdGhlIGNhc2Ugb2YgTElOS0ZBSUwgKGl0IHdpbGwgcmVzdGFydCBvbiBQRElTQykKKyAgICAgICAgICBpZiggeF9JRCA8IFRBQ0hfU0VTVF9MRU4gKQorICAgICAgICAgIHsKKworICAgICAgICAgICAgcHJpbnRrKCIgI09DTSBlcnJvciAlWGggeF9JRCAlWCMgIiwgCisJCSAgICBkd1N0YXR1cywgeF9JRCk7CisKKwkgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnRpbWVPdXQgPSAzMDAwMDsgLy8gc2Vjb25kcyBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKwkgICAgLy8gV2UgUSBBQlRTIGZvciBlYWNoIGV4Y2hhbmdlLgorCSAgICAvLyBOT1RFOiBXZSBjYW4gZ2V0IEZSQU1FX1RPIG9uIGJhZCBhbHBhIChkZXZpY2UgZ29uZSkuICBTaW5jZQorCSAgICAvLyBiYWQgYWxwYSBpcyByZXBvcnRlZCBiZWZvcmUgRlJBTUVfVE8sIGV4YW1pbmUgdGhlIHN0YXR1cworCSAgICAvLyBmbGFncyB0byBzZWUgaWYgdGhlIGRldmljZSBpcyByZW1vdmVkLiAgSWYgc28sIERPTidUCisJICAgIC8vIHBvc3QgYW4gQUJUUywgc2luY2UgaXQgd2lsbCBiZSB0ZXJtaW5hdGVkIGJ5IHRoZSBiYWQgYWxwYQorCSAgICAvLyBtZXNzYWdlLgorCSAgICBpZiggZHdTdGF0dXMgJiBGUkFNRV9UTyApIC8vIGNoZWNrIGZvciBkZXZpY2UgcmVtb3ZlZC4uLgorCSAgICB7CisJICAgICAgaWYoICEoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyAmIERFVklDRV9SRU1PVkVEKSApCisJICAgICAgeyAKKwkJLy8gcHJlc3VtZXMgZGV2aWNlIGlzIHN0aWxsIHRoZXJlOiBzZW5kIEFCVFMuCisgIAorICAgICAgICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEJMU19BQlRTLCAmeF9JRCk7CisJICAgICAgfQorCSAgICB9CisJICAgIGVsc2UgIC8vIEFib3J0IGFsbCBvdGhlciBlcnJvcnMKKwkgICAgeworICAgICAgICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBCTFNfQUJUUywgJnhfSUQpOworCSAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBIUEUgYml0IGlzIHNldCwgd2UgaGF2ZSB0byBDTG9zZSB0aGUgTE9PUAorICAgICAgICAgICAgLy8gKHNlZSBUTC9UUyBVRywgcGcuIDIzOSkKKworICAgICAgICAgICAgaWYoIGR3U3RhdHVzICY9IEhPU1RQUk9HX0VSUiApCisgICAgICAgICAgICAvLyBzZXQgQ0wgYml0IChzZWUgVEwvVFMgVUcsIHBnLiAxNzIpCisgICAgICAgICAgICAgIHdyaXRlbCggNCwgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb250cm9sLmFkZHJlc3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IG5lY2Vzc2FyaWx5IGNhcmUgYWJvdXQgQUxMIGNvbXBsZXRpb24gbWVzc2FnZXMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NTSSByZXNwLiBjb21wbGV0ZSBPUgorICAgICAgICBpZiggKCh4X0lEIDwgVEFDSF9TRVNUX0xFTikgJiYgUlBDc2V0KXx8IAorICAgICAgICAgICAgICh4X0lEID49IFRBQ0hfU0VTVF9MRU4pICkgIC8vIG5vbi1TQ1NJIGNvbW1hbmQKKyAgICAgICAgeworICAgICAgICAgICAgICAvLyBleGNoYW5nZSBkb25lOyBjb21wbGV0ZSB0byB1cHBlciBsZXZlbHMgd2l0aCBzdGF0dXMKKyAgICAgICAgICAgICAgLy8gKGlmIG5lY2Vzc2FyeSkgYW5kIGZyZWUgdGhlIGV4Y2hhbmdlIHNsb3QKKyAgICAgICAgICAgIAorCisgICAgICAgICAgaWYoIHhfSUQgPj0gVEFDSF9TRVNUX0xFTiApIC8vIExpbmsgU2VydmljZSBPdXRib3VuZCBmcmFtZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgUmVxdWVzdCBvciBSZXBseSBoYXMgYmVlbiBzZW50CisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgd2FpdGluZyBXb3JrZXJUaHJlYWQKKworICAgICAgICAgICAgdXAoIGNwcWZjSEJBZGF0YS0+VFlPQmNvbXBsZXRlKTsgICAvLyBmcmFtZSBpcyBPVVQgb2YgVGFjaAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZXJUaHJlYWQgd2lsbCBjb21wbGV0ZSBYY2huZworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlICAvLyBYX0lEIGlzIGZvciBGQ1AgYXNzaXN0IChTRVNUKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gVEJEICh0YXJnZXQgbW9kZSkKKy8vICAgICAgICAgICAgZmNDb21wbGV0ZUV4Y2hhbmdlKCBmY0NoaXAsIHhfSUQpOyAvLyBUUkUgY29tcGxldGVkCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlICAvLyBFUlJPUiBDT05ESVRJT04hICBib2d1cyB4X0lEIGluIGNvbXBsZXRpb24gbWVzc2FnZQorICAgICAgeworCisgICAgICAgIHByaW50aygiIFByb2Nlc3NJTVEgKE9CQ00pIHhfaWQgb3V0IG9mIHJhbmdlICVYaFxuIiwgeF9JRCk7CisKKyAgICAgIH0KKworCisKKyAgICAgICAgICAvLyBMb2FkIHRoZSBGcmFtZSBNYW5hZ2VyJ3MgZXJyb3IgY291bnRlcnMuICBXZSBjaGVjayB0aGVtIGhlcmUKKyAgICAgICAgICAvLyBiZWNhdXNlIHByZXN1bWFibHkgdGhlIGxpbmsgaXMgdXAgYW5kIGhlYWx0aHkgZW5vdWdoIGZvciB0aGUKKyAgICAgICAgICAvLyBjb3VudGVycyB0byBiZSBtZWFuaW5nZnVsIChpLmUuLCBkb24ndCBjaGVjayB0aGVtIHdoaWxlIGxvb3AKKyAgICAgICAgICAvLyBpcyBpbml0aWFsaXppbmcpLgorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMS52YWx1ZSA9ICAgIC8vIGdldCBUTCdzIGNvdW50ZXIKKyAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi52YWx1ZSA9ICAgIC8vIGdldCBUTCdzIGNvdW50ZXIKKyAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi5hZGRyZXNzKTsKKyAgICAgICAgICAgIAorCisgICAgICBmY1BhcnNlTGlua1N0YXR1c0NvdW50ZXJzKCBmY0NoaXApOyAvLyBsb2FkIGludG8gNiBzL3cgYWNjdW11bGF0b3JzCisgICAgYnJlYWs7CisKKworCisgICAgY2FzZSBFUlJPUl9JRExFX0NPTVBMRVRJT046ICAvLyBUYWNoTGl0ZSBFcnJvciBJZGxlLi4uCisgICAgCisgICAgLy8gV2UgdXN1YWxseSBnZXQgdGhpcyB3aGVuIHRoZSBsaW5rIGdvZXMgZG93biBkdXJpbmcgaGVhdnkgdHJhZmZpYy4KKyAgICAvLyBGb3Igbm93LCBwcmVzdW1lIHRoYXQgaWYgU0VTVCBFeGNoYW5nZXMgYXJlIG9wZW4sIHdlIHdpbGwKKyAgICAvLyBnZXQgdGhpcyBhcyBvdXIgY3VlIHRvIElOVkFMSURBVEUgYWxsIFNFU1QgZW50cmllcworICAgIC8vIChhbmQgd2UgT1dOIGFsbCB0aGUgU0VTVCBlbnRyaWVzKS4KKyAgICAvLyBTZWUgVEwvVFMgVUcsIHBnLiA1MworICAgIAorICAgICAgZm9yKCB4X0lEID0gMDsgeF9JRCA8IFRBQ0hfU0VTVF9MRU47IHhfSUQrKykKKyAgICAgIHsKKworICAgICAgICAvLyBEb2VzIHRoaXMgVkFMaWQgU0VTVCBlbnRyeSBuZWVkIHRvIGJlIGludmFsaWRhdGVkIGZvciBBYm9ydD8KKyAgICAgICAgZmNDaGlwLT5TRVNULT51WyB4X0lEXS5JV0UuSGRyX0xlbiAmPSAweDdGRkZGRkZGOyAKKyAgICAgIH0KKyAgICAgIAorICAgICAgQ3BxVHNVbkZyZWV6ZVRhY2hsaXRlKCBmY0NoaXAsIDIpOyAvLyB1bmZyZWV6ZSBUYWNoeW9uLCBpZiBMaW5rIE9LCisKKyAgICBicmVhazsKKworCisgICAgY2FzZSBJTkJPVU5EX1NGU19DT01QTEVUSU9OOiAgLy8weDA0CisgICAgICAgICAgLy8gTk9URSEgd2UgbXVzdCBwcm9jZXNzIHRoaXMgU0ZRIG1lc3NhZ2UgdG8gYXZvaWQgU0ZRIGZpbGxpbmcKKyAgICAgICAgICAvLyB1cCBhbmQgc3RvcHBpbmcgVGFjaExpdGUuICBJbmNvbWluZyBjb21tYW5kcyBhcmUgcGxhY2VkIGhlcmUsCisgICAgICAgICAgLy8gYXMgd2VsbCBhcyAndW5rbm93bicgZnJhbWVzIChlLmcuIExJUCBsb29wIHBvc2l0aW9uIGRhdGEpCisgICAgICAgICAgLy8gd3JpdGUgdGhpcyBDTSdzIHByb2R1Y2VyIGluZGV4IHRvIGdsb2JhbC4uLgorICAgICAgICAgIC8vIFRML1RTIFVHLCBwZyAyMzQ6CisgICAgICAgICAgLy8gVHlwZTogMCAtIHJlc2VydmVkCisgICAgICAgICAgLy8gICAgICAgMSAtIFVuYXNzaXN0ZWQgRkNQCisgICAgICAgICAgLy8gICAgICAgMiAtIEJBRCBGQ1AKKyAgICAgICAgICAvLyAgICAgICAzIC0gVW5rb3duIEZyYW1lCisgICAgICAgICAgLy8gICAgICAgNC1GIHJlc2VydmVkCisKKworICAgICAgZmNDaGlwLT5TRlEtPnByb2R1Y2VySW5kZXggPSAoVVNIT1JUKQorICAgICAgICAoZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFswXSAmIDB4MGZmZkwpOworCisKKyAgICAgIHVjSW5ib3VuZE1lc3NhZ2VUeXBlID0gMDsgIC8vIGRlZmF1bHQgdG8gdXNlbGVzcyBmcmFtZQorCisgICAgICAgIC8vIHdlIGNhbiBvbmx5IHByb2Nlc3MgdHdvIFR5cGVzOiAxLCBVbmFzc2lzdGVkIEZDUCwgYW5kIDMsIFVua25vd24KKyAgICAgICAgLy8gQWxzbywgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gcHJvY2Vzc2luZyBmcmFtZSBmcmFnbWVudHMKKyAgICAgICAgLy8gc28gZG9uJ3QgUXVlIGFueXRoaW5nIHdpdGggJ0xLRicgYml0IHNldAorICAgICAgaWYoICEoZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsyXSAKKyAgICAgICAgJiAweDQwMDAwMDAwKSApICAvLyAnTEtGJyBsaW5rIGZhaWx1cmUgYml0IGNsZWFyPworICAgICAgeworICAgICAgICB1Y0luYm91bmRNZXNzYWdlVHlwZSA9IChVQ0hBUikgIC8vIElDTSBEV29yZDMsICJUeXBlIgorICAgICAgICAoZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsyXSAmIDB4MGZMKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlmY0NoaXAtPmZjU3RhdHMubGlua0ZhaWxSWCsrOworLy8gICAgICAgIHByaW50aygiTEtGIChsaW5rIGZhaWx1cmUpIGJpdCBzZXQgb24gaW5ib3VuZCBtZXNzYWdlXG4iKTsKKyAgICAgIH0KKworICAgICAgICAgIC8vIGNsZWFycyBTRlEgZW50cnkgZnJvbSBUYWNoeW9uIGJ1ZmZlcjsgY29waWVzIHRvIGNvbnRpZ3VvdXMgdWxCdWZmCisgICAgICBDcHFUc0dldFNGUUVudHJ5KAorICAgICAgICBmY0NoaXAsICAgICAgICAgICAgICAgICAgLy8gaS5lLiB0aGlzIERldmljZSBPYmplY3QKKyAgICAgICAgKFVTSE9SVClmY0NoaXAtPlNGUS0+cHJvZHVjZXJJbmRleCwgIC8vIFNGUSBwcm9kdWNlciBuZHggICAgICAgICAKKyAgICAgICAgdWxGaWJyZUZyYW1lLCBUUlVFKTsgICAgLy8gY29udGlndW91cyBkZXN0aW5hdGlvbiBidWZmZXIsIHVwZGF0ZSBjaGlwCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gYW5hbHl6ZSB0aGUgaW5jb21pbmcgZnJhbWUgb3V0c2lkZSB0aGUgSU5UIGhhbmRsZXIuLi4KKyAgICAgICAgLy8gKGkuZS4sIFdvcmtlcikKKworICAgICAgaWYoIHVjSW5ib3VuZE1lc3NhZ2VUeXBlID09IDEgKQorICAgICAgeworICAgICAgICBmY2hzID0gKFRhY2hGQ0hEUl9HQ01ORCopdWxGaWJyZUZyYW1lOyAvLyBjYXN0IHRvIGV4YW1pbmUgSUIgZnJhbWUKKyAgICAgICAgLy8gZG9uJ3QgZmlsbCB1cCBvdXIgUSB3aXRoIGdhcmJhZ2UgLSBvbmx5IGFjY2VwdCBGQ1AtQ01ORCAgCisgICAgICAgIC8vIG9yIFhSRFkgZnJhbWVzCisgICAgICAgIGlmKCAoZmNocy0+ZF9pZCAmIDB4RkYwMDAwMDApID09IDB4MDYwMDAwMDAgKSAvLyBDTU5ECisgICAgICAgIHsKKwkgIC8vIHNvbWVvbmUgc2VudCB1cyBhIFNDU0kgY29tbWFuZAorCSAgCisvLyAgICAgICAgICBmY1B1dFNjc2lRdWUoIGNwcWZjSEJBZGF0YSwgCisvLyAgICAgICAgICAgICAgICAgICAgICAgIFNGUV9VTkFTU0lTVEVEX0ZDUCwgdWxGaWJyZUZyYW1lKTsgCisJfQorCWVsc2UgaWYoICgoZmNocy0+ZF9pZCAmIDB4RkYwMDAwMDApID09IDB4MDcwMDAwMDApIHx8IC8vIFJTUCAoc3RhdHVzKQorICAgICAgICAgICAgKGZjaHMtPmRfaWQgJiAweEZGMDAwMDAwKSA9PSAweDA1MDAwMDAwICkgIC8vIFhSRFkgIAorCXsKKwkgIFVMT05HIHhfSUQ7CisJICAvLyBVbmZvcnR1bmF0ZWx5LCBBQlRTIHJlcXVpcmVzIGEgRnJlZXplIG9uIHRoZSBjaGlwIHNvCisJICAvLyB3ZSBjYW4gbW9kaWZ5IHRoZSBzaGFyZWQgbWVtb3J5IFNFU1QuICBXaGVuIGZyb3plbiwKKwkgIC8vIGFueSByZWNlaXZlZCBFeGNoYW5nZSBmcmFtZXMgY2Fubm90IGJlIHByb2Nlc3NlZCBieQorCSAgLy8gVGFjaHlvbiwgc28gdGhleSB3aWxsIGJlIGR1bXBlZCBpbiBoZXJlLiAgSXQgaXMgdG9vCisJICAvLyBjb21wbGV4IHRvIGF0dGVtcHQgdGhlIHJlY29uc3RydWN0IHRoZXNlIGZyYW1lcyBpbgorCSAgLy8gdGhlIGNvcnJlY3QgRXhjaGFuZ2UgY29udGV4dCwgc28gd2Ugc2ltcGx5IHNlZWsgdG8KKwkgIC8vIGZpbmQgc3RhdHVzIG9yIHRyYW5zZmVyIHJlYWR5IGZyYW1lcywgYW5kIGNhdXNlIHRoZQorCSAgLy8gZXhjaGFuZ2UgdG8gY29tcGxldGUgd2l0aCBlcnJvcnMgYmVmb3JlIHRoZSB0aW1lb3V0CisJICAvLyBleHBpcmVzLiAgV2UgdXNlIGEgTGludXggU2NzaSBDbW5kIHJlc3VsdCBjb2RlIHRoYXQKKwkgIC8vIGNhdXNlcyBpbW1lZGlhdGUgcmV0cnkuCisJICAKKworCSAgLy8gRG8gd2UgaGF2ZSBhbiBvcGVuIGV4Y2hhbmdlIHRoYXQgbWF0Y2hlcyB0aGlzIHNfaWQKKwkgIC8vIGFuZCBveF9pZD8KKwkgIGZvciggeF9JRCA9IDA7IHhfSUQgPCBUQUNIX1NFU1RfTEVOOyB4X0lEKyspCisJICB7CisgICAgICAgICAgICBpZiggKGZjaHMtPnNfaWQgJiAweEZGRkZGRikgPT0gCisgICAgICAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uZmNocy5kX2lkICYgMHhGRkZGRkYpIAorCQkgICAgICAgJiYKKyAgICAgICAgICAgICAgICAoZmNocy0+b3hfcnhfaWQgJiAweEZGRkYwMDAwKSA9PSAKKyAgICAgICAgICAgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5mY2hzLm94X3J4X2lkICYgMHhGRkZGMDAwMCkgKQorCSAgICB7CisgICAgLy8gICAgICAgICAgcHJpbnRrKCIgI1IvWCBmcmFtZSB4X0lEICUwOFgjICIsIGZjaHMtPm94X3J4X2lkICk7CisgICAgICAgICAgICAgIC8vIHNpbXVsYXRlIHRoZSBhbnRpY2lwYXRlZCBlcnJvciAtIHNpbmNlIHRoZQorCSAgICAgIC8vIFNFU1Qgd2FzIGZyb3plbiwgZnJhbWVzIHdlcmUgbG9zdC4uLgorICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgfD0gU0ZRX0ZSQU1FOworICAgICAgICAgICAgICAKKwkgICAgICAvLyBwcmVzdW1lcyBkZXZpY2UgaXMgc3RpbGwgdGhlcmU6IHNlbmQgQUJUUy4KKyAgICAgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgQkxTX0FCVFMsICZ4X0lEKTsKKwkgICAgICBicmVhazsgIC8vIGRvbmUKKwkgICAgfQorCSAgfQorCX0KKwkgIAorICAgICAgfQorICAgICAgICAgIAorICAgICAgZWxzZSBpZiggdWNJbmJvdW5kTWVzc2FnZVR5cGUgPT0gMykKKyAgICAgIHsKKyAgICAgICAgLy8gRkMgTGluayBTZXJ2aWNlIGZyYW1lcyAoZS5nLiBQTE9HSSwgQUNDKSBjb21lIGluIGhlcmUuICAKKyAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgU0ZRX1VOS05PV04sIHVsRmlicmVGcmFtZSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiggdWNJbmJvdW5kTWVzc2FnZVR5cGUgPT0gMiApIC8vICJiYWQgRkNQIj8KKyAgICAgIHsKKyNpZmRlZiBJTVFfREVCVUcKKyAgICAgICAgcHJpbnRrKCJCYWQgRkNQIGluY29taW5nIGZyYW1lIGRpc2NhcmRlZFxuIik7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgZWxzZSAvLyBkb24ndCBrbm93IHRoaXMgdHlwZQorICAgICAgeworI2lmZGVmIElNUV9ERUJVRyAKKyAgICAgICAgcHJpbnRrKCJJbmNvbWluZyBmcmFtZSBkaXNjYXJkZWQsIHR5cGU6ICVYaFxuIiwgdWNJbmJvdW5kTWVzc2FnZVR5cGUpOworI2VuZGlmCisgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGUgRnJhbWUgTWFuYWdlcidzIGVycm9yIGNvdW50ZXJzLiAgV2UgY2hlY2sgdGhlbSBoZXJlCisgICAgICAgIC8vIGJlY2F1c2UgcHJlc3VtYWJseSB0aGUgbGluayBpcyB1cCBhbmQgaGVhbHRoeSBlbm91Z2ggZm9yIHRoZQorICAgICAgICAvLyBjb3VudGVycyB0byBiZSBtZWFuaW5nZnVsIChpLmUuLCBkb24ndCBjaGVjayB0aGVtIHdoaWxlIGxvb3AKKyAgICAgICAgLy8gaXMgaW5pdGlhbGl6aW5nKS4KKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEudmFsdWUgPSAgICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAKKworICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi52YWx1ZSA9ICAgIC8vIGdldCBUTCdzIGNvdW50ZXIKKyAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAKKworICAgICAgYnJlYWs7CisKKworCisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IHRoaXMgQ00gYmVjYXVzZSB3ZSBpc3N1ZWQgYSBmcmVlemUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tbWFuZCB0byBzdG9wIG91dGJvdW5kIGZyYW1lcy4gIFdlIGlzc3VlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBmcmVlemUgY29tbWFuZCBhdCBMaW5rIFVwIHRpbWU7IHdoZW4gdGhpcyBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlY2VpdmVkLCB0aGUgRVJRIGJhc2UgY2FuIGJlIHN3aXRjaGVkIGFuZCBQRElTQworICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgY2FuIGJlIHNlbnQuCisKKyAgICAgIAorICAgIGNhc2UgRVJRX0ZST1pFTl9DT01QTEVUSU9OOiAgLy8gbm90ZTogZXhwZWN0IEVSUSBmb2xsb3dlZCBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgRkNQIHdoZW4gZnJlZXppbmcgVEwKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLnZhbHVlID0gICAgICAgICAvLyByZWFkIHdoYXQncyBmcm96ZW4KKyAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMuYWRkcmVzcyk7CisgICAgICAvLyAoZG8gbm90aGluZzsgd2FpdCBmb3IgRkNQIGZyb3plbiBtZXNzYWdlKQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGQ1BfRlJPWkVOX0NPTVBMRVRJT046CisgICAgICAKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLnZhbHVlID0gICAgICAgICAvLyByZWFkIHdoYXQncyBmcm96ZW4KKyAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMuYWRkcmVzcyk7CisgICAgICAKKyAgICAgIC8vIFNpZ25hbCB0aGUga2VybmVsIHRocmVhZCB0byBwcm9jZWVkIHdpdGggU0VTVCBtb2RpZmljYXRpb24KKyAgICAgIHVwKCBjcHFmY0hCQWRhdGEtPlRhY2hGcm96ZW4pOworCisgICAgICBicmVhazsKKworCisKKyAgICBjYXNlIElOQk9VTkRfQzFfVElNRU9VVDoKKyAgICBjYXNlIE1GU19CVUZfV0FSTjoKKyAgICBjYXNlIElNUV9CVUZfV0FSTjoKKyAgICBicmVhazsKKworCisKKworCisgICAgICAgIC8vIEluIG9sZGVyIFRhY2h5b25zLCB3ZSAnY2xlYXInIHRoZSBpbnRlcm5hbCAnY29yZScgaW50ZXJydXB0IHN0YXRlCisgICAgICAgIC8vIGJ5IHJlYWRpbmcgdGhlIEZNc3RhdHVzIHJlZ2lzdGVyLiAgSW4gbmV3ZXIgVGFjaExpdGUgKFRhY2h5b24pLAorICAgICAgICAvLyB3ZSBtdXN0IFdSSVRFIHRoZSByZWdpc3RlcgorICAgICAgICAvLyB0byBjbGVhciB0aGUgY29uZGl0aW9uIChUTC9UUyBVRywgcGcgMTc5KQorICAgIGNhc2UgRlJBTUVfTUdSX0lOVEVSUlVQVDoKKyAgICB7CisgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OyAKKworICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgPSAKKyAgICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLmFkZHJlc3MgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgIC8vIFBST0JMRU06IEl0IGlzIHBvc3NpYmxlLCBlc3BlY2lhbGx5IHdpdGggImR1bWIiIGh1YnMgdGhhdAorICAgICAgLy8gZG9uJ3QgYXV0b21hdGljYWxseSBMSVAgb24gYnktcGFzcyBvZiBwb3J0cyB0aGF0IGFyZSBnb2luZworICAgICAgLy8gYXdheSwgZm9yIHRoZSBodWIgYnktcGFzcyBwcm9jZXNzIHRvIGRlc3Ryb3kgY3JpdGljYWwgCisgICAgICAvLyBvcmRlcmVkIHNldHMgb2YgYSBmcmFtZS4gIFRoZSByZXN1bHQgb2YgdGhpcyBpcyBhIGh1bmcgTFBTTQorICAgICAgLy8gKExvb3AgUG9ydCBTdGF0ZSBNYWNoaW5lKSwgd2hpY2ggb24gVGFjaHlvbiByZXN1bHRzIGluIGEKKyAgICAgIC8vIChkZWZhdWx0IDIgc2VjKSBMb29wIFN0YXRlIFRpbWVvdXQgKExTVCkgRk0gbWVzc2FnZS4gIFdlIAorICAgICAgLy8gd2FudCB0byBhdm9pZCB0aGlzIHJlbGF0aXZlbHkgaHVnZSB0aW1lb3V0IGJ5IGRldGVjdGluZworICAgICAgLy8gbGlrZWx5IHNjZW5hcmlvcyB3aGljaCB3aWxsIHJlc3VsdCBpbiBMU1QuCisgICAgICAvLyBUbyBkbyB0aGlzLCB3ZSBjb3VsZCBleGFtaW5lIEZNc3RhdHVzIGZvciBMb3NzIG9mIFN5bmNocm9uaXphdGlvbgorICAgICAgLy8gYW5kL29yIEVsYXN0aWMgU3RvcmUgKEVTKSBlcnJvcnMuICBPZiB0aGVzZSwgRWxhc3RpYyBTdG9yZSBpcyBiZXR0ZXIKKyAgICAgIC8vIGJlY2F1c2Ugd2UgZ2V0IHRoaXMgaW5kaWNhdGlvbiBtb3JlIHF1aWNrbHkgdGhhbiB0aGUgTE9TLgorICAgICAgLy8gTm90IGFsbCBFUyBlcnJvcnMgYXJlIGhhcm1mdWxsLCBzbyB3ZSBkb24ndCB3YW50IHRvIExJUCBvbiBldmVyeQorICAgICAgLy8gRVMuICBJbnN0ZWFkLCBvbiBldmVyeSBFUywgZGV0ZWN0IHdoZXRoZXIgb3VyIExQU00gaW4gaW4gb25lCisgICAgICAvLyBvZiB0aGUgTFNUIHN0YXRlczogQVJCSVRSQVRJTkcsIE9QRU4sIE9QRU5FRCwgWE1JVFRFRCBDTE9TRSwKKyAgICAgIC8vIG9yIFJFQ0VJVkVEIENMT1NFLiAgKFNlZSBUTC9UUyBVRywgcGcuIDE4MSkKKyAgICAgIC8vIElmIGFueSBvZiB0aGVzZSBMUFNNIHN0YXRlcyBhcmUgZGV0ZWN0ZWQKKyAgICAgIC8vIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIExJUCB3aGlsZSBMRG4gaXMgbm90IHNldCwgCisgICAgICAvLyBzZW5kIGFuIEZNIGluaXQgKExJUCBGNyxGNyBmb3IgbG9vcHMpIQorICAgICAgLy8gSXQgaXMgY3JpdGljYWwgdG8gdGhlIHBoeXNpY2FsIGxpbmsgc3RhYmlsaXR5IE5PVCB0byByZXNldCAoTElQKQorICAgICAgLy8gbW9yZSB0aGFuIGFic29sdXRlbHkgbmVjZXNzYXJ5OyB0aGlzIGlzIGEgYmFzaWMgcHJlbWlzZSBvZiB0aGUKKyAgICAgIC8vIFNBTk1hcmsgbGV2ZWwgMSBzcGVjLgorICAgICAgeworCVVMT05HIExwc20gPSAoZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweEYwKSA+PjQ7CisJCisJaWYoIChmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4NDAwKSAgLy8gRWxhc3RpY1N0b3JlPworICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAhKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgxMDApIC8vIE5PVCBMRG4KKwkgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAhKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgxMDAwKSkgLy8gTk9UIExGCisJeworCSAgaWYoIChMcHNtICE9IDApIHx8IC8vIG5vdCBNT05JVE9SSU5HPyBvcgorCSAgICAgICEoTHBzbSAmIDB4OCkgKS8vIG5vdCBhbHJlYWR5IG9mZmxpbmU/CisJICB7CisJICAvLyBub3cgY2hlY2sgdGhlIHBhcnRpY3VsYXIgTFNUIHN0YXRlcy4uLgorICAgICAgICAgICAgaWYoIChMcHNtID09IEFSQklUUkFUSU5HKSB8fCAoTHBzbSA9PSBPUEVOKSB8fAorCSAgICAgIChMcHNtID09IE9QRU5FRCkgICAgICB8fCAoTHBzbSA9PSBYTUlUVERfQ0xPU0UpIHx8CisJICAgICAgKExwc20gPT0gUkNWRF9DTE9TRSkgKQorCSAgICB7CisJICAgICAgLy8gcmUtaW5pdCB0aGUgbG9vcCBiZWZvcmUgaXQgaGFuZ3MgaXRzZWxmIQorICAgICAgICAgICAgICBwcmludGsoIiAjcmVxIEZNaW5pdCBvbiBFLVM6IExQU00gJVhoIyAiLExwc20pOworCisKKwkgICAgICBmY0NoaXAtPmZjU3RhdHMuRk1pbml0cysrOworICAgICAgICAgICAgICB3cml0ZWwoIDYsIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29udHJvbC5hZGRyZXNzKTsgLy8gTElQCisJICAgIH0KKwkgIH0KKwl9CisJZWxzZSBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDQwMDAwICkgLy8gTFNUPworCXsKKyAgICAgICAgICBwcmludGsoIiAjcmVxIEZNaW5pdCBvbiBMU1QsIExQU00gJVhoIyAiLExwc20pOworCSAKKyAgICAgICAgICBmY0NoaXAtPmZjU3RhdHMuRk1pbml0cysrOworICAgICAgICAgIHdyaXRlbCggNiwgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb250cm9sLmFkZHJlc3MpOyAgLy8gTElQCisJfSAgCisgICAgICB9CisKKworICAgICAgLy8gY2xlYXIgb25seSB0aGUgJ2ludGVycnVwdGluZycgdHlwZSBiaXRzIGZvciB0aGlzIFJFRyByZWFkCisgICAgICB3cml0ZWwoIChmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4ZmYzZmZmMDBMKSwKKyAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAvLyBjb3B5IGZyYW1lIG1hbmFnZXIgc3RhdHVzIHRvIHVudXNlZCBVTE9ORyBzbG90CisgICAgICBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS53b3JkWzBdID0KKyAgICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZTsgLy8gKGZvciBkZWJ1Z2dpbmcpCisKKworICAgICAgICAgIC8vIExvYWQgdGhlIEZyYW1lIE1hbmFnZXIncyBlcnJvciBjb3VudGVycy4gIFdlIGNoZWNrIHRoZW0gaGVyZQorICAgICAgICAgIC8vIGJlY2F1c2UgcHJlc3VtYWJseSB0aGUgbGluayBpcyB1cCBhbmQgaGVhbHRoeSBlbm91Z2ggZm9yIHRoZQorICAgICAgICAgIC8vIGNvdW50ZXJzIHRvIGJlIG1lYW5pbmdmdWwgKGkuZS4sIGRvbid0IGNoZWNrIHRoZW0gd2hpbGUgbG9vcAorICAgICAgICAgIC8vIGlzIGluaXRpYWxpemluZykuCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLnZhbHVlID0gICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEuYWRkcmVzcyk7CisgICAgICAgICAgICAKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIudmFsdWUgPSAgIC8vIGdldCBUTCdzIGNvdW50ZXIKKyAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi5hZGRyZXNzKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvLyBHZXQgRk0gQkJfQ3JlZGl0IFplcm8gUmVnIC0gZG9lcyBub3QgY2xlYXIgb24gUkVBRAorICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1CQl9DcmVkaXRaZXJvLnZhbHVlID0gICAvLyBnZXQgVEwncyBjb3VudGVyCisgICAgICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNQkJfQ3JlZGl0WmVyby5hZGRyZXNzKTsKKyAgICAgICAgICAgIAorCisKKyAgICAgIGZjUGFyc2VMaW5rU3RhdHVzQ291bnRlcnMoIGZjQ2hpcCk7IC8vIGxvYWQgaW50byA2IHMvdyBhY2N1bXVsYXRvcnMKKworCisgICAgICAgICAgICAgICAvLyBMSU5LIERPV04KKworICAgICAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgxMDBMICkgLy8gTGluayBET1dOIGJpdAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQorI2lmZGVmIElNUV9ERUJVRworICAgICAgICBwcmludGsoIkxpbmtEblxuIik7CisjZW5kaWYKKyAgICAgICAgcHJpbnRrKCIgI0xEbiMgIik7CisgICAgICAgIAorICAgICAgICBmY0NoaXAtPmZjU3RhdHMubGlua0Rvd24rKzsKKyAgICAgICAgCisJU2V0VGFjaFRPViggY3BxZmNIQkFkYXRhKTsgIC8vIG11c3Qgc2V0IGFjY29yZGluZyB0byBTQU5NYXJrCisKKwkvLyBDaGVjayB0aGUgRVJRIC0gZm9yY2UgaXQgdG8gYmUgImVtcHR5IiB0byBwcmV2ZW50IFRhY2gKKwkvLyBmcm9tIHNlbmRpbmcgb3V0IGZyYW1lcyBiZWZvcmUgd2UgZG8gbG9naW5zLgorCisKKyAgCWlmKCBmY0NoaXAtPkVSUS0+cHJvZHVjZXJJbmRleCAhPSBmY0NoaXAtPkVSUS0+Y29uc3VtZXJJbmRleCkKKwl7CisvLwkgIHByaW50aygiI0VSUSBQSSAhPSBDSSMiKTsKKyAgICAgICAgICBDcHFUc0ZyZWV6ZVRhY2hsaXRlKCBmY0NoaXAsIDEpOyAvLyBmcmVlemUgRVJRIG9ubHkJICAKKwkgIGZjQ2hpcC0+RVJRLT5wcm9kdWNlckluZGV4ID0gZmNDaGlwLT5FUlEtPmNvbnN1bWVySW5kZXggPSAwOworIAkgIHdyaXRlbCggZmNDaGlwLT5FUlEtPmJhc2UsIAorCSAgICAoZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0VSUV9CQVNFKSk7CisgICAgICAgICAgLy8gcmUtd3JpdGluZyBiYXNlIGZvcmNlcyBFUlEgUEkgdG8gZXF1YWwgQ0kKKyAgCisJfQorCQkKKwkvLyBsaW5rIGRvd24gdHJhbnNpdGlvbiBvY2N1cnJlZCAtLSBwb3J0X2lkcyBjYW4gY2hhbmdlCisgICAgICAgIC8vIG9uIG5leHQgTGlua1VwLCBzbyB3ZSBtdXN0IGludmFsaWRhdGUgY3VycmVudCBsb2dpbnMKKyAgICAgICAgLy8gKGFuZCBhbnkgSS9PIGluIHByb2dyZXNzKSB1bnRpbCBQRElTQyBvciBQTE9HSS9QUkxJCisgICAgICAgIC8vIGNvbXBsZXRlcworICAgICAgICB7CisgICAgICAgICAgcExvZ2dlZEluUG9ydCA9ICZmY0NoaXAtPmZjUG9ydHM7IAorICAgICAgICAgIHdoaWxlKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gZm9yIGFsbCBwb3J0cyB3aGljaCBhcmUgZXhwZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQRElTQyBhZnRlciB0aGUgbmV4dCBMSVAsIHNldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ291dFRpbWVyCisgICAgICAgICAgeworCisJICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wZGlzYykgLy8gZXhwZWN0aW5nIFBESVNDIHdpdGhpbiAyIHNlYz8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcExvZ2dlZEluUG9ydC0+TE9HT190aW1lciA9IDM7ICAvLyB3ZSB3YW50IDIgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBUaW1lciBncmFudWxhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIDEgc2Vjb25kCisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgYW55IEkvTyBpbiBwcm9ncmVzcyB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQRElTQyByZWNlaXZlZC4uLgorICAgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOyAgIC8vIGJsb2NrIEZDUC1TQ1NJIGNvbW1hbmRzCisJICAgIAorICAgICAgICAgICAgcExvZ2dlZEluUG9ydCA9IHBMb2dnZWRJblBvcnQtPnBOZXh0UG9ydDsKKyAgICAgICAgICB9ICAvLyAuLi4gYWxsIFByZXZpb3VzbHkga25vd24gcG9ydHMgY2hlY2tlZAorICAgICAgICB9CisgICAgICAgIAorCS8vIHNpbmNlIGFueSBob3QgcGx1Z2dpbmcgZGV2aWNlIG1heSBOT1Qgc3VwcG9ydCBMSUxQIGZyYW1lcworCS8vIChzdWNoIGFzIGVhcmx5IFRhY2h5b24gY2hpcHMpLCBjbGVhciB0aGlzIGZsYWcgaW5kaWNhdGluZworCS8vIHdlIHNob3VsZG4ndCB1c2UgKG91ciBjb3B5IG9mKSBhIExJTFAgbWFwLgorCS8vIElmIHdlIHJlY2VpdmUgYW4gTElMUCBmcmFtZSwgd2UnbGwgc2V0IGl0IGFnYWluLgorCWZjQ2hpcC0+T3B0aW9ucy5MSUxQaW4gPSAwOyAvLyBvdXIgTElMUG1hcCBpcyBpbnZhbGlkCisgICAgICAgIGNwcWZjSEJBZGF0YS0+UG9ydERpc2NEb25lID0gMDsgLy8gbXVzdCByZS12YWxpZGF0ZSBGQyBwb3J0cyEKKworICAgICAgICAgIC8vIGFsc28sIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSAoaS5lLiBJTklUSUFUT1JfQUJPUlQpIGFueQorICAgICAgICAgIC8vIG9wZW4gTG9naW4gZXhjaGFuZ2VzLCBpbiBjYXNlIHRoZSBMaW5rRG93biBoYXBwZW5lZCBpbiB0aGUKKyAgICAgICAgICAvLyBtaWRkbGUgb2YgbG9naW5zLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgcG9ydHMgYWxyZWFkeQorICAgICAgICAgIC8vIEFDQ2VwdGVkIGxvZ2luIGNvbW1hbmRzIHdoaWNoIHdlIGhhdmUgbm90IHByb2Nlc3NlZCBiZWZvcmUKKyAgICAgICAgICAvLyBhbm90aGVyIExpbmtEb3duIG9jY3VycmVkLiAgQW55IGFjY2VwdGVkIExvZ2luIGV4aGFuZ2VzIGFyZQorICAgICAgICAgIC8vIGludmFsaWRhdGVkIGJ5IExpbmtEb3duLCBldmVuIGJlZm9yZSB0aGV5IGFyZSBhY2tub3dsZWRnZWQuCisgICAgICAgICAgLy8gSXQncyBhbHNvIHBvc3NpYmxlIGZvciBhIHBvcnQgdG8gaGF2ZSBhIFF1ZXVlZCBSZXBseSBvciBSZXF1ZXN0CisgICAgICAgICAgLy8gZm9yIGxvZ2luIHdoaWNoIHdhcyBpbnRlcnJ1cHRlZCBieSBMaW5rRG93bjsgaXQgbWF5IGNvbWUgbGF0ZXIsCisgICAgICAgICAgLy8gYnV0IGl0IHdpbGwgYmUgdW5hY2NlcHRhYmxlIHRvIHVzLgorCisgICAgICAgICAgLy8gd2UgbXVzdCBzY2FuIHRoZSBlbnRpcmUgZXhjaGFuZ2Ugc3BhY2UsIGZpbmQgZXZlcnkgTG9naW4gdHlwZQorICAgICAgICAgIC8vIG9yaWdpbmF0ZWQgYnkgdXMsIGFuZCBhYm9ydCBpdC4gVGhpcyBpcyBOT1QgYW4gYWJvcnQgZHVlIHRvCisgICAgICAgICAgLy8gdGltZW91dCwgc28gd2UgZG9uJ3QgYWN0dWFsbHkgc2VuZCBhYm9ydCB0byB0aGUgb3RoZXIgcG9ydCAtCisgICAgICAgICAgLy8gd2UganVzdCBjb21wbGV0ZSBpdCB0byBmcmVlIHVwIHRoZSBmY0V4Y2hhbmdlIHNsb3QuCisKKyAgICAgICAgZm9yKCBpPVRBQ0hfU0VTVF9MRU47IGk8IFRBQ0hfTUFYX1hJRDsgaSsrKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgLy8gbG9va2luZyBmb3IgRXh0ZW5kZWQgTGluayBTZXJ2LkV4Y2hhbmdlcworICAgICAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSA9PSBFTFNfUERJU0MgfHwKKyAgICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgPT0gRUxTX1BMT0dJIHx8CisgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID09IEVMU19QUkxJICkgCisgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBBQk9SVCB0aGUgZXhjaGFuZ2UhCisjaWZkZWYgSU1RX0RFQlVHCisgICAgICAgICAgICBwcmludGsoIk9yaWdpbmF0b3IgQUJPUlQgeF9pZCAlWGgsIHR5cGUgJVhoLCBwb3J0X2lkICVYaCBvbiBMRG5cbiIsCisgICAgICAgICAgICAgIGksIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlLAorICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLmZjaHMuZF9pZCk7CisjZW5kaWYKKworICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnN0YXR1cyB8PSBJTklUSUFUT1JfQUJPUlQ7CisgICAgICAgICAgICBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIGZjQ2hpcCwgaSk7IC8vIGFib3J0IG9uIExEbgorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjICAgTElOSyBVUCAgICMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgyMDBMICkgLy8gTGluayBVcCBiaXQKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTF9QQSBjb3VsZCBoYXZlIGNoYW5nZWQKKworICAgICAgICAgIC8vIFdlIG5lZWQgdGhlIGZvbGxvd2luZyBjb2RlLCBkdXBsaWNhdGVkIGZyb20gTGlua0RuIGNvbmRpdGlvbiwKKyAgICAgICAgICAvLyBiZWNhdXNlIGl0J3MgcG9zc2libGUgZm9yIHRoZSBUYWNoeW9uIHRvIHJlLWluaXRpYWxpemUgKGhhcmQKKyAgICAgICAgICAvLyByZXNldCkgd2l0aG91dCBldmVyIGdldHRpbmcgYSBMaW5rRG4gaW5kaWNhdGlvbi4KKyAgICAgICAgcExvZ2dlZEluUG9ydCA9ICZmY0NoaXAtPmZjUG9ydHM7IAorICAgICAgICB3aGlsZSggcExvZ2dlZEluUG9ydCApICAgLy8gZm9yIGFsbCBwb3J0cyB3aGljaCBhcmUgZXhwZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQRElTQyBhZnRlciB0aGUgbmV4dCBMSVAsIHNldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZ291dFRpbWVyCisgICAgICAgIHsKKyAgICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cGRpc2MpIC8vIGV4cGVjdGluZyBQRElTQyB3aXRoaW4gMiBzZWM/CisgICAgICAgICAgeworICAgICAgICAgICAgcExvZ2dlZEluUG9ydC0+TE9HT190aW1lciA9IDM7ICAvLyB3ZSB3YW50IDIgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBUaW1lciBncmFudWxhcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIDEgc2Vjb25kCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBhbnkgSS9PIGluIHByb2dyZXNzIHVudGlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgcmVjZWl2ZWQuLi4KKworICAgICAgICAgIH0KKyAgICAgICAgICBwTG9nZ2VkSW5Qb3J0ID0gcExvZ2dlZEluUG9ydC0+cE5leHRQb3J0OworICAgICAgICB9ICAvLyAuLi4gYWxsIFByZXZpb3VzbHkga25vd24gcG9ydHMgY2hlY2tlZAorIAorICAgICAgICAgIC8vIENwcVRzIGFjcXVpcmVkIEFMX1BBIGluIHJlZ2lzdGVyIEFMX1BBIChBQ1FfQUxQQSkKKyAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMucmN2X2FsX3BhLnZhbHVlID0gCisgICAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMucmN2X2FsX3BhLmFkZHJlc3MpOworIAorCS8vIE5vdywgaWYgb3VyIGFjcXVpcmVkIGFkZHJlc3MgaXMgRElGRkVSRU5UIGZyb20gb3VyCisgICAgICAgIC8vIHByZXZpb3VzIG9uZSwgd2UgYXJlIG5vdCBhbGxvdyB0byBkbyBQRElTQyAtIHdlCisgICAgICAgIC8vIG11c3QgZ28gYmFjayB0byBQTE9HSSwgd2hpY2ggd2lsbCB0ZXJtaW5hdGUgSS9PIGluCisgICAgICAgIC8vIHByb2dyZXNzIGZvciBBTEwgbG9nZ2VkIGluIEZDIGRldmljZXMuLi4KKwkvLyAoVGhpcyBpcyBoaWdobHkgdW5saWtlbHkpLgorCisJaWYoIChmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSAmIDB4RkYpICE9IAorCSAgICAoKGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS52YWx1ZSA+PiAxNikgJjB4RkYpICkKKwl7CisKKy8vCSAgcHJpbnRrKCIgI291ciBIQkEgcG9ydF9pZCBjaGFuZ2VkISMgIik7IC8vIEZDIHBvcnRfaWQgY2hhbmdlZCEhCQorCisJICBwTG9nZ2VkSW5Qb3J0ID0gJmZjQ2hpcC0+ZmNQb3J0czsgCisgICAgICAgICAgd2hpbGUoIHBMb2dnZWRJblBvcnQgKSAvLyBmb3IgYWxsIHBvcnRzIHdoaWNoIGFyZSBleHBlY3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBESVNDIGFmdGVyIHRoZSBuZXh0IExJUCwgc2V0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nb3V0VGltZXIKKyAgICAgICAgICB7CisJICAgIHBMb2dnZWRJblBvcnQtPnBkaXNjICA9IEZBTFNFOworICAgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOworICAgICAgICAgICAgcExvZ2dlZEluUG9ydCA9IHBMb2dnZWRJblBvcnQtPnBOZXh0UG9ydDsKKyAgICAgICAgICB9ICAvLyAuLi4gYWxsIFByZXZpb3VzbHkga25vd24gcG9ydHMgY2hlY2tlZAorCisJICAvLyB3aGVuIHRoZSBwb3J0X2lkIGNoYW5nZXMsIHdlIG11c3QgdGVybWluYXRlCisJICAvLyBhbGwgb3BlbiBleGNoYW5nZXMuCisgICAgICAgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIE5VTEwsIFBPUlRJRF9DSEFOR0VEKTsKKworCX0KKwkgICAgICAgICAgICAgICAKKwkvLyBSZXBsYWNlIHRoZSBlbnRpcmUgMjQtYml0IHBvcnRfaWQuICBXZSBvbmx5IGtub3cgdGhlCisJLy8gbG93ZXIgOCBiaXRzIChhbHBhKSBmcm9tIFRhY2h5b247IGlmIGEgRkxPR0kgaXMgZG9uZSwKKwkvLyB3ZSdsbCBnZXQgdGhlIHVwcGVyIDE2LWJpdHMgZnJvbSB0aGUgRkxPR0kgQUNDIGZyYW1lLgorCS8vIElmIHNvbWVvbmUgcGx1Z3MgaW50byBGYWJyaWMgc3dpdGNoLCB3ZSdsbCBkbyBGTE9HSSBhbmQKKwkvLyBnZXQgZnVsbCAyNC1iaXQgcG9ydF9pZDsgc29tZW9uZSBjb3VsZCB0aGVuIHJlbW92ZSBhbmQKKwkvLyBob3QtcGx1ZyB1cyBpbnRvIGEgZHVtYiBodWIuICBJZiB3ZSBzZW5kIGEgMjQtYml0IFBMT0dJCisJLy8gdG8gYSAicHJpdmF0ZSIgbG9vcCBkZXZpY2UsIGl0IG1pZ2h0IGJsb3cgdXAuCisJLy8gQ29uc2VxdWVudGx5LCB3ZSBmb3JjZSB0aGUgdXBwZXIgMTYtYml0cyBvZiBwb3J0X2lkIHRvCisJLy8gYmUgcmUtc2V0IG9uIGV2ZXJ5IExpbmtVcCB0cmFuc2l0aW9uCisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhID0KKyAgICAgICAgICAoZmNDaGlwLT5SZWdpc3RlcnMucmN2X2FsX3BhLnZhbHVlID4+IDE2KSAmIDB4RkY7CisKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8vIGNvcHkgZnJhbWUgbWFuYWdlciBzdGF0dXMgdG8gdW51c2VkIFVMT05HIHNsb3QKKyAgICAgICAgZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsxXSA9CisgICAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGE7IC8vIChmb3IgZGVidWdnaW5nKQorCisgICAgICAgICAgICAgIC8vIGZvciBUYWNoTGl0ZSwgd2UgbmVlZCB0byB3cml0ZSB0aGUgYWNxdWlyZWQgYWxfcGEKKyAgICAgICAgICAgICAgLy8gYmFjayBpbnRvIHRoZSBGTWNvbmZpZyByZWdpc3RlciwgYmVjYXVzZSBhZnRlcgorICAgICAgICAgICAgICAvLyBmaXJzdCBpbml0aWFsaXphdGlvbiwgdGhlIEFRIChwcmV2LiBhY3EuKSBiaXQgZ2V0cworICAgICAgICAgICAgICAvLyBzZXQsIGNhdXNpbmcgVEwgRk0gdG8gdXNlIHRoZSBBTF9QQSBmaWVsZCBpbiBGTWNvbmZpZy4KKyAgICAgICAgICAgICAgLy8gKEluIFRhY2h5b24sIEZNIHdyaXRlcyB0aGUgYWNxdWlyZWQgQUxfUEEgZm9yIHVzLikKKyAgICAgICAgdWxCdWZmID0gcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLmFkZHJlc3MpOworICAgICAgICB1bEJ1ZmYgJj0gMHgwMGZmZmZmZkw7ICAvLyBtYXNrIG91dCBjdXJyZW50IGFsX3BhCisgICAgICAgIHVsQnVmZiB8PSAoIGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhIDw8IDI0ICk7IC8vIG9yIGluIGFjcS4gYWxfcGEKKyAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb25maWcudmFsdWUgPSB1bEJ1ZmY7IC8vIGNvcHkgaXQgYmFjaworICAgICAgICB3cml0ZWwoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNY29uZmlnLnZhbHVlLCAgLy8gcHV0IGluIFRhY2hMaXRlCisgICAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuRk1jb25maWcuYWRkcmVzcyk7CisgICAgICAgICAgICAKKworI2lmZGVmIElNUV9ERUJVRworICAgICAgICBwcmludGsoIiNMVXAgJVhoLCBGTXN0YXQgMHglMDhYIyIsIAorCQlmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSwgZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgLy8gYWxzbyBzZXQgdGhlIFdSSVRFLU9OTFkgTXlfSUQgUmVnaXN0ZXIgKGZvciBGYWJyaWMKKyAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24pCisgICAgICAgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEsCisgICAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICtUTF9NRU1fVEFDSF9NeV9JRCk7CisgICAgICAgICAgCisKKyAgICAgICAgZmNDaGlwLT5mY1N0YXRzLmxpbmtVcCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgVEwgc3RhdGlzdGljcyBjb3VudGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3ZSBpZ25vcmUgdGhlc2UgZXJyb3IgY291bnRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBsaW5rIGlzIGRvd24pCisgICAgICAgIHVsQnVmZiA9ICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCBUTCdzIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEuYWRkcmVzcyk7CisgICAgICAgICAgCisgICAgICAgIHVsQnVmZiA9ICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCBUTCdzIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIuYWRkcmVzcyk7CisKKyAgICAgICAgICAvLyBmb3IgaW5pdGlhdG9yLCBuZWVkIHRvIHN0YXJ0IHZlcmlmeWluZyBwb3J0cyAoZS5nLiBQRElTQykKKworCisKKyAgICAgICAgIAorICAgICAgCisgICAgICAKKwlDcHFUc1VuRnJlZXplVGFjaGxpdGUoIGZjQ2hpcCwgMik7IC8vIHVuZnJlZXplIFRhY2hsaXRlLCBpZiBMaW5rIE9LCisJCisJLy8gVGFjaHlvbiBjcmVhdGVzIGFuIGludGVyZXN0aW5nIHByb2JsZW0gZm9yIHVzIG9uIExJTFAgZnJhbWVzLgorCS8vIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgaW5jb21pbmcgTElMUCBmcmFtZSBpbnRvIHRoZSBTRlEgYmVmb3JlCisJLy8gaW5kaWNhdGluZyBMSU5LIFVQICh0aGUgYWN0dWFsIG9yZGVyIG9mIGV2ZW50cyksIFRhY2h5b24gdGVsbHMKKwkvLyB1cyBMSU5LIFVQLCBhbmQgbGF0ZXIgdXMgdGhlIExJTFAuICBTbyB3ZSBkZWxheSwgdGhlbiBleGFtaW5lIHRoZQorCS8vIElNUSBmb3IgYW4gSW5ib3VuZCBDTSAoeDA0KTsgaWYgZm91bmQsIHdlIGNhbiBzZXQKKwkvLyBMSU5LQUNUSVZFIGFmdGVyIHByb2Nlc3NpbmcgdGhlIExJTFAuICBPdGhlcndpc2UsIGp1c3QgcHJvY2VlZC4KKwkvLyBTaW5jZSBUYWNoeW9uIGltcG9zZXMgdGhpcyB0aW1lIGRlbGF5IChhbmQgZG9lc24ndCB0ZWxsIHVzCisJLy8gd2hhdCBpdCBpcyksIHdlIGhhdmUgdG8gaW1wb3NlIGEgZGVsYXkgYmVmb3JlICJQZWVraW5nIiB0aGUgSU1RCisJLy8gZm9yIFRhY2ggaGFyZHdhcmUgKERNQSkgZGVsaXZlcnkuCisJLy8gUHJvY2Vzc2luZyBMSUxQIGlzIHJlcXVpcmVkIGJ5IFNBTk1hcmsKKwl1ZGVsYXkoIDEwMDApOyAgLy8gbWljcm9zZWMgZGVsYXkgd2FpdGluZyBmb3IgTElMUCAoaWYgaXQgY29tZXMpCisgICAgICAgIGlmKCBQZWVrSU1RRW50cnkoIGZjQ2hpcCwgRUxTX0xJTFBfRlJBTUUpICkKKwl7ICAvLyBmb3VuZCBTRlEgTElMUCwgd2hpY2ggd2lsbCBwb3N0IExJTktBQ1RJVkUJICAKKy8vCSAgcHJpbnRrKCJza2lwcGluZyBMSU5LQUNUSVZFIHBvc3RcbiIpOworCisJfQorCWVsc2UKKyAgICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBMSU5LQUNUSVZFLCB1bEZpYnJlRnJhbWUpOyAgCisgICAgICB9CisKKworCisgICAgICAvLyAqKioqKioqIFNldCBGYWJyaWMgTG9naW4gaW5kaWNhdGlvbiAqKioqKioqKgorICAgICAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHgyMDAwICkKKyAgICAgIHsKKwlwcmludGsoIiAjRmFicmljIyAiKTsKKyAgICAgICAgZmNDaGlwLT5PcHRpb25zLmZhYnJpYyA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGZjQ2hpcC0+T3B0aW9ucy5mYWJyaWMgPSAwOworCisgICAgICAKKyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKioqKioqIExJUChGOCx4KSBvciBCQUQgQUxfUEE/ICoqKioqKioqCisgICAgICBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDMwMDAwTCApCisgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSBlcnJvciBBTF9QQXMKKyAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMucmN2X2FsX3BhLnZhbHVlID0gCisgICAgICAgICAgcmVhZGwoZmNDaGlwLT5SZWdpc3RlcnMucmN2X2FsX3BhLmFkZHJlc3MpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCYWQgQUxfUEE/CisgICAgICAgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MTAwMDBMICkKKyAgICAgICAgeworICAgICAgICAgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQ7CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5ICJCQUQiIGFsX3BhIGZpZWxkCisgICAgICAgICAgZmNDaGlwLT5JTVEtPlFFbnRyeVtmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleF0ud29yZFsxXSA9CisgICAgICAgICAgICAgIChmY0NoaXAtPlJlZ2lzdGVycy5yY3ZfYWxfcGEudmFsdWUgJiAweGZmMDBMKSA+PiA4OworCisJICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCBmY0NoaXAsCisgICAgICAgICAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIFNjc2kgTmV4dXMKKyAgICAgICAgICAgIGZjQ2hpcC0+SU1RLT5RRW50cnlbZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXhdLndvcmRbMV0sIC8vIHBvcnQgaWQKKyAgICAgICAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIFdXTgorICAgICAgICAgICAgTlVMTCk7ICAgIC8vIERPTidUIGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKyAKKwkgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkKKwkgIHsKKyAgICAgICAgICAgIC8vIEp1c3QgaW4gY2FzZSB3ZSBnb3QgdGhpcyBCQURfQUxQQSBiZWNhdXNlIGEgZGV2aWNlCisJICAgIC8vIHF1aWV0bHkgZGlzYXBwZWFyZWQgKGNhbiBoYXBwZW4gb24gbm9uLW1hbmFnZWQgaHVicyBzdWNoIAorCSAgICAvLyBhcyB0aGUgVml4ZWwgUmFwcG9ydCAxMDAwKSwKKwkgICAgLy8gZG8gYW4gSW1wbGljaXQgTG9nb3V0LiAgV2UgbmV2ZXIgZXhwZWN0IHRoaXMgb24gYSBMb2dnZWQKKwkgICAgLy8gaW4gcG9ydCAoYnV0IGRvIGV4cGVjdCBpdCBvbiBwb3J0IGRpc2NvdmVyeSkuCisJICAgIC8vIChBcyBhIHJlYXNvbmFibGUgYWx0ZXJuYXRpdmUsIHRoaXMgY291bGQgYmUgY2hhbmdlZCB0byAKKwkgICAgLy8gc2ltcGx5IHN0YXJ0IHRoZSBpbXBsaWNpdCBsb2dvdXQgdGltZXIsIGdpdmluZyB0aGUgZGV2aWNlCisJICAgIC8vIHNldmVyYWwgc2Vjb25kcyB0byAiY29tZSBiYWNrIi4pCisJICAgIC8vIAorCSAgICBwcmludGsoIiAjQkFEIGFscGEgJVhoIyAiLAorCQkgICBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS53b3JkWzFdKTsKKyAgICAgICAgICAgIGNwcWZjVFNJbXBsaWNpdExvZ291dCggY3BxZmNIQkFkYXRhLCBwTG9nZ2VkSW5Qb3J0KTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTElQKGY4LHgpPworICAgICAgICBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDIwMDAwTCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcsIGNvcHkgYWxfcGEgZmllbGQKKyAgICAgICAgICBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS53b3JkWzJdID0KKyAgICAgICAgICAgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLnJjdl9hbF9wYS52YWx1ZSAmIDB4ZmZMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb3RoZXIgcG9ydCdzIGFsX3BhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAob25lIHRoYXQgc2VudCBMSVAoRjgsPykgKQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxhc3RpYyBzdG9yZSBlcnIKKyAgICAgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4NDAwTCApCisgICAgICB7CisgICAgICAgICAgICAvLyBkb24ndCBjb3VudCBlLXMgaWYgbG9vcCBpcyBkb3duIQorICAgICAgICBpZiggIShVU0hPUlQpKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHg4MCkgKQorICAgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5lX3N0b3JlcysrOworICAgICAgICAgIAorICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKworCisgICAgY2FzZSBJTkJPVU5EX0ZDUF9YQ0hHX0NPTVBMRVRJT046ICAvLyAweDBDCisKKyAgICAvLyBSZW1hcmtzOgorICAgIC8vIE9uIFRhY2hsaXRlIFRML1RTLCB3ZSBnZXQgdGhpcyBtZXNzYWdlIHdoZW4gdGhlIGRhdGEgcGhhc2UKKyAgICAvLyBvZiBhIFNFU1QgaW5ib3VuZCB0cmFuc2ZlciBpcyBjb21wbGV0ZS4gIEZvciBleGFtcGxlLCBpZiBhIFdSSVRFIGNvbW1hbmQKKyAgICAvLyB3YXMgcmVjZWl2ZWQgd2l0aCBPWF9JRCAwLCB3ZSBtaWdodCByZXNwb25kIHdpdGggWEZFUl9SRFkgd2l0aAorICAgIC8vIFJYX0lEIDgwMDEuICBUaGlzIHdvdWxkIHN0YXJ0IHRoZSBTRVNUIGNvbnRyb2xsZWQgZGF0YSBwaGFzZXMuICBXaGVuCisgICAgLy8gYWxsIGRhdGEgZnJhbWVzIGFyZSByZWNlaXZlZCwgd2UgZ2V0IHRoaXMgaW5ib3VuZCBjb21wbGV0aW9uLiBUaGlzIG1lYW5zCisgICAgLy8gd2Ugc2hvdWxkIHNlbmQgYSBzdGF0dXMgZnJhbWUgdG8gY29tcGxldGUgdGhlIHN0YXR1cyBwaGFzZSBvZiB0aGUgCisgICAgLy8gRkNQLVNDU0kgZXhjaGFuZ2UsIHVzaW5nIHRoZSBzYW1lIE9YX0lELFJYX0lEIHRoYXQgd2UgdXNlZCBmb3IgZGF0YQorICAgIC8vIGZyYW1lcy4KKyAgICAvLyBTZWUgT3V0Ym91bmQgQ00gZGlzY3Vzc2lvbiBvZiB4X0lEcworICAgIC8vIFBzdWVkbyBDb2RlCisgICAgLy8gICBHZXQgU0VTVCBpbmRleCAoeF9JRCkKKyAgICAvLyAgICAgeF9JRCBvdXQgb2YgcmFuZ2UsIHJldHVybiAoZXJyIGNvbmRpdGlvbikKKyAgICAvLyAgIHNldCBzdGF0dXMgYml0cyBmcm9tIDJuZCBkd29yZAorICAgIC8vICAgZnJlZSB0cmFuc2FjdGlvbklEICYgU0VTVCBlbnRyeQorICAgIC8vICAgY2FsbCBmY0NvbXBsZXRlIHdpdGggdHJhbnNhY3Rpb25JRCAmIHN0YXR1cworCisgICAgICB1bEJ1ZmYgPSBmY0NoaXAtPklNUS0+UUVudHJ5W2ZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4XS53b3JkWzBdOworICAgICAgeF9JRCA9IHVsQnVmZiAmIDB4N2ZmZkw7ICAvLyBsb3dlciAxNCBiaXRzIFNFU1RfSW5kZXgvVHJhbnNfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG1hc2sgb3V0IE1TQiAiZGlyZWN0aW9uIiBiaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmdlIGNoZWNrIENNIE9YL1JYX0lEIHZhbHVlLi4uCisgICAgICBpZiggeF9JRCA8IFRBQ0hfU0VTVF9MRU4gKSAgLy8gZG9uJ3QgZ28gYmV5b25kIFNFU1QgYXJyYXkgc3BhY2UKKyAgICAgIHsKKworLy8jZGVmaW5lIEZDUF9DT01QTEVUSU9OX0RCRyAxCisjaWZkZWYgRkNQX0NPTVBMRVRJT05fREJHCisgICAgICAgIHByaW50aygiIEZDUF9DTSB4X0lEICVYaCwgc3RhdHVzICVYaCwgQ21uZCAlcFxuIiwgCisgICAgICAgICAgeF9JRCwgdWxCdWZmLCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uQ21uZCk7CisjZW5kaWYKKyAgICAgICAgaWYoIHVsQnVmZiAmIDB4MDgwMDAwMDBMICkgLy8gUlBDIC1SZXNwb25zZSBQaGFzZSBDb21wbGV0ZSAtIG9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZSB0byBzZW5kIHJlc3BvbnNlIGZyYW1lPworICAgICAgICAgIFJQQ3NldCA9IDE7ICAgICAgICAgICAgIC8vIChTRVNUIHRyYW5zYWN0aW9uKQorICAgICAgICBlbHNlCisgICAgICAgICAgUlBDc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXR1cyBmb3IgdGhpcyBJbmJvdW5kIFNDU0kgdHJhbnNhY3Rpb24ncyBJRAorICAgICAgICBkd1N0YXR1cyA9IDBMOworICAgICAgICBpZiggdWxCdWZmICYgMHg3MDAwMDAwMEwgKSAvLyBhbnkgZXJycz8KKyAgICAgICAgeworICAgICAgICAgIAorICAgICAgICAgIGlmKCB1bEJ1ZmYgJiAweDQwMDAwMDAwTCApCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBMSU5LRkFJTF9SWDsKKyAgICAgICAgICAKKwkgIGlmKCB1bEJ1ZmYgJiAweDIwMDAwMDAwTCApCisgICAgICAgICAgICBkd1N0YXR1cyB8PSBDT1VOVF9FUlJPUjsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiggdWxCdWZmICYgMHgxMDAwMDAwMEwgKQorICAgICAgICAgICAgZHdTdGF0dXMgfD0gT1ZFUkZMT1c7CisgICAgICAgIH0KKyAgICAgIAorCQorCSAgLy8gRkNQIHRyYW5zYWN0aW9uIGRvbmUgLSBjb3B5IHN0YXR1cworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgPSBkd1N0YXR1czsKKworCisgICAgICAgIC8vIERpZCB0aGUgZXhjaGFuZ2UgZ2V0IGFuIEZDUC1SU1AgcmVzcG9uc2UgZnJhbWU/CisgICAgICAgIC8vIChOb3RlIHRoZSBsaXR0bGUgZW5kaWFuL2JpZyBlbmRpYW4gRkMgcGF5bG9hZCBkaWZmZXJlbmNlKQorCisgICAgICAgIGlmKCBSUENzZXQgKSAgICAgICAgICAgICAvLyBTRVNUIHRyYW5zYWN0aW9uIFJlc3BvbnNlIGZyYW1lIHJlYydkCisgICAgICAgIHsKKyAgICAJICAvLyBjb21wbGV0ZSB0aGUgY29tbWFuZCBpbiBvdXIgZHJpdmVyLi4uCisgICAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LGZjQ2hpcCwgeF9JRCk7CisKKyAgICAgICAgfSAgLy8gZW5kICJSUENzZXQiCisJCisgICAgICAgIGVsc2UgIC8vICgidGFyZ2V0IiBsb2dpYykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGFjaGxpdGUgc2F5cyBhbGwgZGF0YSBmcmFtZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIC0gbm93IGl0J3MgdGltZQorICAgICAgICAgICAgLy8gdG8gYW5hbHl6ZSBkYXRhIHRyYW5zZmVyIChzdWNjZXNzZnVsPyksIHRoZW4gc2VuZCBhIHJlc3BvbnNlIAorICAgICAgICAgICAgLy8gZnJhbWUgZm9yIHRoaXMgZXhjaGFuZ2UKKworICAgICAgICAgIHVsRmlicmVGcmFtZVswXSA9IHhfSUQ7IC8vIGNvcHkgZm9yIGxhdGVyIHJlZmVyZW5jZQorCisgICAgICAgICAgLy8gaWYgdGhpcyB3YXMgYSBUV0UsIHdlIGhhdmUgdG8gc2VuZCBzYXR1cyByZXNwb25zZQorICAgICAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnR5cGUgPT0gU0NTSV9UV0UgKQorCSAgeworLy8gICAgICAgICAgICBmY1B1dFNjc2lRdWUoIGNwcWZjSEJBZGF0YSwgCisvLyAgICAgICAgICAgICAgICBORUVEX0ZDUF9SU1AsIHVsRmlicmVGcmFtZSk7ICAvLyAodWxGaWJyZUZyYW1lIG5vdCB1c2VkIGhlcmUpCisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgIC8vIEVSUk9SIENPTkRJVElPTiEgIGJvZ3VzIHhfSUQgaW4gY29tcGxldGlvbiBtZXNzYWdlCisgICAgICB7CisgICAgICAgIHByaW50aygiSU4gRkNQX1hDSEc6IGJhZCB4X0lEOiAlWGhcbiIsIHhfSUQpOworICAgICAgfQorCisgICAgYnJlYWs7CisKKworCisKKyAgICBjYXNlIElOQk9VTkRfU0NTSV9EQVRBX0NPTU1BTkQ6CisgICAgY2FzZSBCQURfU0NTSV9GUkFNRToKKyAgICBjYXNlIElOQl9TQ1NJX1NUQVRVU19DT01QTEVUSU9OOgorICAgIGNhc2UgQlVGRkVSX1BST0NFU1NFRF9DT01QTEVUSU9OOgorICAgIGJyZWFrOworICAgIH0KKworCQkJCQkgICAvLyBUYWNoeW9uIGlzIHByb2R1Y2luZzsKKwkJCQkJICAgLy8gd2UgYXJlIGNvbnN1bWluZworICAgIGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4Kys7ICAgICAgICAgICAgIC8vIGluY3JlbWVudCBPVVIgY29uc3VtZXJJbmRleAorICAgIGlmKCBmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleCA+PSBJTVFfTEVOKS8vIGNoZWNrIGZvciByb2xsb3ZlcgorICAgICAgZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXggPSAwTDsgICAgICAgIC8vIHJlc2V0IGl0CisKKworICAgIGlmKCBmY0NoaXAtPklNUS0+cHJvZHVjZXJJbmRleCA9PSBmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleCApCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBNZXNzYWdlcyBhcmUgcHJvY2Vzc2VkIC0KKyAgICAgIGlTdGF0dXMgPSAwOyAgICAgICAgICAgICAgLy8gbm8gbW9yZSBtZXNzYWdlcyB0byBwcm9jZXNzCisKKyAgICB9CisgICAgZWxzZQorICAgICAgaVN0YXR1cyA9IDE7ICAgICAgICAgICAgICAvLyBtb3JlIG1lc3NhZ2VzIHRvIHByb2Nlc3MKKworICAgIC8vIHVwZGF0ZSBUYWNoTGl0ZSdzIENvbnN1bWVySW5kZXguLi4gKGNsZWFycyBJTlRBX0wpCisgICAgLy8gTk9URTogYWNjb3JkaW5nIHRvIFRML1RTIFVHLCB0aGUgCisgICAgLy8gImhvc3QgbXVzdCByZXR1cm4gY29tcGxldGlvbiBtZXNzYWdlcyBpbiBzZXF1ZW50aWFsIG9yZGVyIi4KKyAgICAvLyBEb2VzIHRoaXMgbWVhbiBvbmUgYXQgYSB0aW1lLCBpbiB0aGUgb3JkZXIgcmVjZWl2ZWQ/ICBXZQorICAgIC8vIHByZXN1bWUgc28uCisKKyAgICB3cml0ZWwoIGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4LAorICAgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElNUV9DT05TVU1FUl9JTkRFWCkpOworCQkgICAgCisjaWYgSU1RX0RFQlVHCisgICAgcHJpbnRrKCJQcm9jZXNzIElNUTogd3JpdGluZyBjb25zdW1lciBuZHggJWRcbiAiLCAKKyAgICAgIGZjQ2hpcC0+SU1RLT5jb25zdW1lckluZGV4KTsKKyAgICBwcmludGsoIlBJICVYLCBDSSAlWFxuIiwgCisgICAgZmNDaGlwLT5JTVEtPnByb2R1Y2VySW5kZXgsZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXggKTsKKyNlbmRpZgorICAKKworCisgIH0KKyAgZWxzZQorICB7CisgICAvLyBobW1tLi4uIHdoeSBkaWQgd2UgZ2V0IGludGVycnVwdGVkL2NhbGxlZCB3aXRoIG5vIG1lc3NhZ2U/CisgICAgaVN0YXR1cyA9IC0xOyAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gcHJvY2VzcworI2lmIElNUV9ERUJVRworICAgIHByaW50aygiUHJvY2VzcyBJTVE6IG5vIG1lc3NhZ2UgUEkgJVhoICBDSSAlWGgiLCAKKyAgICAgIGZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4LAorICAgICAgZmNDaGlwLT5JTVEtPmNvbnN1bWVySW5kZXgpOworI2VuZGlmCisgIH0KKworICBMRUFWRSgiUHJvY2Vzc0lNUUVudHJ5Iik7CisgIAorICByZXR1cm4gaVN0YXR1czsKK30KKworCisKKworCisvLyBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgVGFjaHlvbiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZworLy8gb3B0aW9ucyAob3Bjb2RlMSk6CisvLyAxIC0gUkVTVEFSVCBUYWNoeW9uLCBzaW11bGF0ZSBwb3dlciBvbiBjb25kaXRpb24gYnkgc2h1dHRpbmcKKy8vICAgICBkb3duIGxhc2VyLCByZXNldHRpbmcgdGhlIGhhcmR3YXJlLCBkZS1hbGxvY2F0aW5nIGFsbCBidWZmZXJzOworLy8gICAgIGNvbnRpbnVlCisvLyAyIC0gQ29uZmlnIFRhY2h5b24gLyBQQ0kgcmVnaXN0ZXJzOworLy8gICAgIGNvbnRpbnVlCisvLyAzIC0gQWxsb2NhdGluZyBtZW1vcnkgYW5kIHNldHRpbmcgVGFjaHlvbiBxdWV1ZXMgKHdyaXRlIFRhY2h5b24gcmVncyk7CisvLyAgICAgY29udGludWUKKy8vIDQgLSBDb25maWcgZnJhbWUgbWFuYWdlciByZWdpc3RlcnMsIGluaXRpYWxpemUsIHR1cm4gb24gbGFzZXIKKy8vCisvLyBSZXR1cm5zOgorLy8gIC0xIG9uIGZhdGFsIGVycm9yCisvLyAgIDAgb24gc3VjY2VzcworCitpbnQgQ3BxVHNJbml0aWFsaXplVGFjaExpdGUoIHZvaWQgKnBIQkEsIGludCBvcGNvZGUxLCBpbnQgb3Bjb2RlMikKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSopcEhCQTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBVTE9ORyB1bEJ1ZmY7CisgIFVDSEFSIGJCdWZmOworICBpbnQgaVN0YXR1cz0tMTsgIC8vIGFzc3VtZSBmYWlsdXJlCisKKyAgRU5URVIoIkluaXRpYWxpemVUYWNoTGl0ZSIpOworCisgIC8vIHZlcmlmeSBib2FyZCdzIGJhc2UgYWRkcmVzcyAoc2FuaXR5IGNoZWNrKQorCisgIGlmKCAhZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlKSAgICAgICAgICAgICAgICAvLyBOVUxMIGFkZHJlc3MgZm9yIGNhcmQ/CisgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGQVRBTCBlcnJvciEKKworCisKKyAgc3dpdGNoKCBvcGNvZGUxICkKKyAgeworICAgIGNhc2UgMTogICAgICAgLy8gcmVzdG9yZSBoYXJkd2FyZSB0byBwb3dlci1vbiAoaGFyZCkgcmVzdGFydAorCisKKyAgICAgIGlTdGF0dXMgPSBmY0NoaXAtPlJlc2V0VGFjaHlvbiggCisJCSAgY3BxZmNIQkFkYXRhLCBvcGNvZGUyKTsgLy8gbGFzZXIgb2ZmLCByZXNldCBoYXJkd2FyZQorCQkJCSAgICAgIC8vIGRlLWFsbG9jYXRlIGFsaWduZWQgYnVmZmVycworCisKKy8qIFRCRCAgICAgIC8vIHJlc2V0IEZDIGxpbmsgUSAocHJvZHVjZXIgYW5kIGNvbnN1bWVyID0gMCkKKyAgICAgIGZjTGlua1FSZXNldChjcHFmY0hCQWRhdGEpOyAKKworKi8KKworICAgICAgaWYoIGlTdGF0dXMgKQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjogICAgICAgLy8gQ29uZmlnIFBDSS9UYWNoeW9uIHJlZ2lzdGVycworICAgICAgLy8gTk9URTogRm9yIFRhY2ggVEwvVFMsIGJpdCAzMSBtdXN0IGJlIHNldCB0byAxLiAgRm9yIFRTIGNoaXBzLCBhIHJlYWQKKyAgICAgIC8vIG9mIGJpdCAzMSBpbmRpY2F0ZXMgc3RhdGUgb2YgTTY2RU4gc2lnbmFsOyBpZiAxLCBjaGlwIG1heSBydW4gYXQgCisgICAgICAvLyAzMy02Nk1IeiAgKHNlZSBUTC9UUyBVRywgcGcgMTU5KQorCisgICAgICB1bEJ1ZmYgPSAweDgwMDAwMDAwOyAgLy8gVGFjaExpdGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCisgICAgICB3cml0ZWwoIHVsQnVmZiwgZmNDaGlwLT5SZWdpc3RlcnMuVFljb25maWcuYWRkcmVzcyk7CisvLyAgICAgIHVsQnVmZiA9IDB4MDE0N0w7ICAvLyBDcHFUcyBQQ0kgQ0ZHQ01EIHJlZ2lzdGVyCisvLyAgICAgIFdyaXRlUENJQ29uZmlndXJhdGlvbiggZmNDaGlwLT5CYWNrcGxhbmUuYnVzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBmY0NoaXAtPkJhY2twbGFuZS5zbG90LCBUTENGR0NNRCwgdWxCdWZmLCA0KTsKKy8vICAgICAgdWxCdWZmID0gMHgwTDsgIC8vIHRlc3QhCisvLyAgICAgIFJlYWRQQ0lDb25maWd1cmF0aW9uKCBmY0NoaXAtPkJhY2twbGFuZS5idXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjQ2hpcC0+QmFja3BsYW5lLnNsb3QsIFRMQ0ZHQ01ELCAmdWxCdWZmLCA0KTsKKworICAgICAgLy8gcmVhZCBiYWNrIGZvciByZWZlcmVuY2UuLi4KKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29uZmlnLnZhbHVlID0gCisgICAgICAgICByZWFkbCggZmNDaGlwLT5SZWdpc3RlcnMuVFljb25maWcuYWRkcmVzcyApOworCisgICAgICAvLyB3aGF0IGlzIHRoZSBQQ0kgYnVzIHdpZHRoPworICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzLCAvLyBQQ0lNQ1RSIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYkJ1ZmYpOworICAgICAgCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5QQ0lNQ1RSID0gYkJ1ZmY7CisKKyAgICAgIC8vIHNldCBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGNoaXAgb24gdGhlIGNpcmN1aXQgYm9hcmQKKworICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMudmFsdWUgPQorICAgICAgICByZWFkbCggZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMuYWRkcmVzcyk7CisgICAgICAKKyAgICAgIHsKKy8vIE5vdyB0aGF0IHdlIGFyZSBzdXBwb3J0aW5nIG11bHRpcGxlIGJvYXJkcywgd2UgbmVlZCB0byBjaGFuZ2UKKy8vIHRoaXMgbG9naWMgdG8gY2hlY2sgZm9yIFBDSSB2ZW5kb3IvZGV2aWNlIElEcy4uLgorLy8gZm9yIG5vdywgcXVpY2sgJiBkaXJ0eSBpcyBzaW1wbHkgY2hlY2tpbmcgQ2hpcCByZXYKKwkKKwlVTE9ORyBSZXZJZCA9IChmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy52YWx1ZSAmMHgzRTApPj41OworCVVDSEFSIE1pbm9yID0gKFVDSEFSKShSZXZJZCAmIDB4Myk7CisJVUNIQVIgTWFqb3IgPSAoVUNIQVIpKChSZXZJZCAmIDB4MUMpID4+Mik7CisgIAorCS8qIHByaW50aygiICBIQkEgVGFjaHlvbiBSZXZJZCAlZC4lZFxuIiwgTWFqb3IsIE1pbm9yKTsgKi8KKyAgCWlmKCAoTWFqb3IgPT0gMSkgJiYgKE1pbm9yID09IDIpICkKKyAgICAgICAgeworCSAgc3ByaW50ZiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuTmFtZSwgU1RBQ0hMSVRFNjZfVFMxMik7CisKKwl9CisJZWxzZSBpZiggKE1ham9yID09IDEpICYmIChNaW5vciA9PSAzKSApCisgICAgICAgIHsKKwkgIHNwcmludGYoIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk5hbWUsIFNUQUNITElURTY2X1RTMTMpOworCX0KKwllbHNlIGlmKCAoTWFqb3IgPT0gMikgJiYgKE1pbm9yID09IDEpICkKKyAgICAgICAgeworCSAgc3ByaW50ZiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuTmFtZSwgU0FHSUxFTlRfWEwyXzIxKTsKKwl9CisJZWxzZQorCSAgc3ByaW50ZiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuTmFtZSwgU1RBQ0hMSVRFX1VOS05PV04pOworICAgICAgfQorCisKKworICAgIGNhc2UgMzogICAgICAgLy8gYWxsb2NhdGUgbWVtLCBzZXQgVGFjaHlvbiBRdWUgcmVnaXN0ZXJzCisgICAgICBpU3RhdHVzID0gQ3BxVHNDcmVhdGVUYWNoTGl0ZVF1ZXMoIGNwcWZjSEJBZGF0YSwgb3Bjb2RlMik7CisKKyAgICAgIGlmKCBpU3RhdHVzICkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8vIG5vdyB0aGF0IHRoZSBRdWV1ZXMgZXhpc3QsIFRhY2ggY2FuIERNQSB0byB0aGVtLCBzbworICAgICAgLy8gd2UgY2FuIGJlZ2luIHByb2Nlc3NpbmcgSU5UcworICAgICAgLy8gSU5URU4gcmVnaXN0ZXIgLSBlbmFibGUgSU5UIChUYWNoTGl0ZSBpbnRlcnJ1cHQpCisgICAgICB3cml0ZWIoIDB4MUYsIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElJTlRFTik7CisKKwkvLyBGYWxsIHRocm91Z2gKKyAgICBjYXNlIDQ6ICAgICAgIC8vIENvbmZpZyBGYW1lIE1hbmFnZXIsIEluaXQgTG9vcCBDb21tYW5kLCBsYXNlciBvbgorCisgICAgICAgICAgICAgICAgIC8vIExfUE9SVCBvciBsb29wYmFjaworICAgICAgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gT3B0aW9ucworICAgICAgaVN0YXR1cyA9IENwcVRzSW5pdGlhbGl6ZUZyYW1lTWFuYWdlciggZmNDaGlwLDAgKTsKKyAgICAgIGlmKCBpU3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgICAgLy8gZmFpbGVkIHRvIGluaXRpYWxpemUgRnJhbWUgTWFuYWdlcgorCSAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIExFQVZFKCJJbml0aWFsaXplVGFjaExpdGUiKTsKKyAgCisgIHJldHVybiBpU3RhdHVzOworfQorCisKKworCisvLyBEZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgcGxhdGZvcm0gbWVtb3J5IGFsbG9jYXRpb24gKGUuZy4gZHluYW1pYyksCisvLyBpdCdzIHByb2JhYmx5IGJlc3QgdG8gZnJlZSBtZW1vcnkgaW4gb3Bwb3NpdGUgb3JkZXIgYXMgaXQgd2FzIGFsbG9jYXRlZC4KKy8vIE9yZGVyIG9mIGFsbG9jYXRpb246IHNlZSBvdGhlciBmdW5jdGlvbgorCisKK2ludCBDcHFUc0Rlc3Ryb3lUYWNoTGl0ZVF1ZXMoIHZvaWQgKnBIQkEsIGludCBvcGNvZGUpCit7CisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEqKXBIQkE7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgVVNIT1JUIGksIGlTdGF0dXM9MDsKKyAgdm9pZCogdlB0cjsgIC8vIG1lbSBBbGlnbiBtYW5hZ2VyIHNldHMgdGhpcyB0byB0aGUgZnJlZWQgYWRkcmVzcyBvbiBzdWNjZXNzCisgIHVuc2lnbmVkIGxvbmcgdWxQdHI7ICAvLyBmb3IgNjQtYml0IHBvaW50ZXIgY2FzdCAoZS5nLiBBbHBhIG1hY2hpbmUpCisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFBTR1BBR0VTIGosIG5leHQ7CisKKyAgRU5URVIoIkRlc3Ryb3lUYWNoTGl0ZVF1ZXMiKTsKKworICBpZiggZmNDaGlwLT5TRVNUICkKKyAgeworICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBvdXQgYW5kIGZyZWUgUG9vbCBmb3IgRXh0ZW5kZWQgUy9HIGxpc3QgcGFnZXMKKworICAgIGZvciggaT0wOyBpIDwgVEFDSF9TRVNUX0xFTjsgaSsrKSAgLy8gZm9yIGVhY2ggZXhjaGFuZ2UKKyAgICB7CisgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgZXh0ZW5kZWQgUy9HIHBhZ2VzIHdlcmUgYWxsb2NhdGVkLCBtYXBwZWQsIGFuZAorICAgICAgLy8gbm90IGNsZWFyZWQgZHVlIHRvIGVycm9yIGNvbmRpdGlvbnMgb3IgTy9TIGRyaXZlciB0ZXJtaW5hdGlvbi4KKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGV5J3JlIGFsbCBnb25lLgorICAgICAgaWYgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5DbW5kICE9IE5VTEwpIAorICAgICAgCWNwcWZjX3BjaV91bm1hcChjcHFmY0hCQWRhdGEtPlBjaURldiwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLkNtbmQsIAorCQkJZmNDaGlwLCBpKTsgLy8gdW5kbyBETUEgbWFwcGluZ3MuCisKKyAgICAgIGZvciAoaj1mY0NoaXAtPlNFU1QtPnNnUGFnZXNbaV0gOyBqICE9IE5VTEwgOyBqID0gbmV4dCkgeworCQluZXh0ID0gai0+bmV4dDsKKwkJa2ZyZWUoaik7CisgICAgICB9CisgICAgICBmY0NoaXAtPlNFU1QtPnNnUGFnZXNbaV0gPSBOVUxMOworICAgIH0KKyAgICB1bFB0ciA9ICh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+U0VTVDsKKyAgICB2UHRyID0gZmNNZW1NYW5hZ2VyKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgCisJCSAgICAmY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbVswXSwKKwkJICAgIDAsMCwgKFVMT05HKXVsUHRyLCBOVUxMICk7IC8vICdmcmVlJyBtZW0KKyAgICBmY0NoaXAtPlNFU1QgPSAwTDsgIC8vIG51bGwgaW52YWxpZCBwdHIKKyAgICBpZiggIXZQdHIgKQorICAgIHsKKyAgICAgIHByaW50aygiU0VTVCBtZW0gbm90IGZyZWVkXG4iKTsKKyAgICAgIGlTdGF0dXMgPSAtMTsKKyAgICB9CisgIH0KKworICBpZiggZmNDaGlwLT5TRlEgKQorICB7CisKKyAgICB1bFB0ciA9ICh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+U0ZROworICAgIHZQdHIgPSBmY01lbU1hbmFnZXIoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCAKKwkJICAgICZjcHFmY0hCQWRhdGEtPmR5bmFtaWNfbWVtWzBdLAorCQkgICAgMCwwLCAoVUxPTkcpdWxQdHIsIE5VTEwgKTsgLy8gJ2ZyZWUnIG1lbQorICAgIGZjQ2hpcC0+U0ZRID0gMEw7ICAvLyBudWxsIGludmFsaWQgcHRyCisgICAgaWYoICF2UHRyICkKKyAgICB7CisgICAgICBwcmludGsoIlNGUSBtZW0gbm90IGZyZWVkXG4iKTsKKyAgICAgIGlTdGF0dXMgPSAtMjsKKyAgICB9CisgIH0KKworCisgIGlmKCBmY0NoaXAtPklNUSApCisgIHsKKyAgICAgIC8vIGNsZWFyIEluZGV4ZXMgdG8gc2hvdyBlbXB0eSBRdWV1ZQorICAgIGZjQ2hpcC0+SU1RLT5wcm9kdWNlckluZGV4ID0gMDsKKyAgICBmY0NoaXAtPklNUS0+Y29uc3VtZXJJbmRleCA9IDA7CisKKyAgICB1bFB0ciA9ICh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+SU1ROworICAgIHZQdHIgPSBmY01lbU1hbmFnZXIoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCAmY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbVswXSwKKwkJICAgIDAsMCwgKFVMT05HKXVsUHRyLCBOVUxMICk7IC8vICdmcmVlJyBtZW0KKyAgICBmY0NoaXAtPklNUSA9IDBMOyAgLy8gbnVsbCBpbnZhbGlkIHB0cgorICAgIGlmKCAhdlB0ciApCisgICAgeworICAgICAgcHJpbnRrKCJJTVEgbWVtIG5vdCBmcmVlZFxuIik7CisgICAgICBpU3RhdHVzID0gLTM7CisgICAgfQorICB9CisKKyAgaWYoIGZjQ2hpcC0+RVJRICkgICAgICAgICAvLyByZWxlYXNlIG1lbW9yeSBibG9ja3MgdXNlZCBieSB0aGUgcXVldWVzCisgIHsKKyAgICB1bFB0ciA9ICh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+RVJROworICAgIHZQdHIgPSBmY01lbU1hbmFnZXIoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCAmY3BxZmNIQkFkYXRhLT5keW5hbWljX21lbVswXSwKKwkJICAgIDAsMCwgKFVMT05HKXVsUHRyLCBOVUxMICk7IC8vICdmcmVlJyBtZW0KKyAgICBmY0NoaXAtPkVSUSA9IDBMOyAgLy8gbnVsbCBpbnZhbGlkIHB0cgorICAgIGlmKCAhdlB0ciApCisgICAgeworICAgICAgcHJpbnRrKCJFUlEgbWVtIG5vdCBmcmVlZFxuIik7CisgICAgICBpU3RhdHVzID0gLTQ7CisgICAgfQorICB9CisgICAgCisgIC8vIGZyZWUgdXAgdGhlIHByaW1hcnkgRVhDSEFOR0VTIHN0cnVjdCBhbmQgTGluayBRCisgIGNwcWZjX2ZyZWVfZG1hX2NvbnNpc3RlbnQoY3BxZmNIQkFkYXRhKTsKKyAgCisgIExFQVZFKCJEZXN0cm95VGFjaExpdGVRdWVzIik7CisgIAorICByZXR1cm4gaVN0YXR1czsgICAgIC8vIG5vbi16ZXJvIChmYWlsZWQpIGlmIGFueSBtZW1vcnkgbm90IGZyZWVkCit9CisKKworCisKKworLy8gVGhlIFNGUSBpcyBhbiBhcnJheSB3aXRoIFNGUV9MRU4gbGVuZ3RoLCBlYWNoIGVsZW1lbnQgKFFFbnRyeSkKKy8vIHdpdGggZWlnaHQgMzItYml0IHdvcmRzLiAgVGFjaExpdGUgcGxhY2VzIGluY29taW5nIEZDIGZyYW1lcyAoaS5lLgorLy8gYSB2YWxpZCBGQyBmcmFtZSB3aXRoIG91ciBBTF9QQSApIGluIGNvbnRpZ3VvdXMgU0ZRIGVudHJpZXMKKy8vIGFuZCBzZW5kcyBhIGNvbXBsZXRpb24gbWVzc2FnZSB0ZWxsaW5nIHRoZSBob3N0IHdoZXJlIHRoZSBmcmFtZSBpcworLy8gaW4gdGhlIHF1ZS4KKy8vIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjdXJyZW50IChvciBvbGRlc3Qgbm90LXlldC1wcm9jZXNzZWQpIFFFbnRyeSB0bworLy8gYSBjYWxsZXIncyBjb250aWd1b3VzIGJ1ZmZlciBhbmQgdXBkYXRlcyB0aGUgVGFjaHlvbiBjaGlwJ3MgY29uc3VtZXIgaW5kZXgKKy8vCisvLyBOT1RFOgorLy8gICBBbiBGQyBmcmFtZSBtYXkgY29uc3VtZSBvbmUgb3IgbWFueSBTRlEgZW50cmllcy4gIFdlIGtub3cgdGhlIHRvdGFsCisvLyAgIGxlbmd0aCBmcm9tIHRoZSBjb21wbGV0aW9uIG1lc3NhZ2UuICBUaGUgY2FsbGVyIHBhc3NlcyBhIGJ1ZmZlciBsYXJnZQorLy8gICBlbm91Z2ggZm9yIHRoZSBjb21wbGV0ZSBtZXNzYWdlIChtYXggMmspLgorCitzdGF0aWMgdm9pZCBDcHFUc0dldFNGUUVudHJ5KAorICAgICAgICAgUFRBQ0hZT04gZmNDaGlwLAorICAgICAgICAgVVNIT1JUIHByb2R1Y2VyTmR4LAorICAgICAgICAgVUxPTkcgKnVsRGVzdFB0ciwgICAgICAgICAgICAvLyBjb250aWd1b3VzIGRlc3RpbmF0aW9uIGJ1ZmZlcgorCSBCT09MRUFOIFVwZGF0ZUNoaXApCit7CisgIFVMT05HIHRvdGFsX2J5dGVzPTA7CisgIFVMT05HIGNvbnN1bWVySW5kZXggPSBmY0NoaXAtPlNGUS0+Y29uc3VtZXJJbmRleDsKKyAgCisJCQkJLy8gY2hlY2sgcGFzc2VkIGNvcHkgb2YgU0ZRIHByb2R1Y2VyIGluZGV4IC0KKwkJCQkvLyBpcyBhIG5ldyBtZXNzYWdlIHdhaXRpbmcgZm9yIHVzPworCQkJCS8vIGVxdWFsIGluZGV4ZXMgbWVhbnMgU0ZTIGlzIGNvcGllZAorCisgIHdoaWxlKCBwcm9kdWNlck5keCAhPSBjb25zdW1lckluZGV4ICkKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBwcm9jZXNzIG1lc3NhZ2UKKyAgICB0b3RhbF9ieXRlcyArPSA2NDsgICAvLyBtYWludGFpbiBjb3VudCB0byBwcmV2ZW50IHdyaXRpbmcgcGFzdCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBjb3BpZXMgb3ZlciBGaWJyZSBDaGFubmVsIGRlZmluZWQgbGVuZ3RoIQorICAgIGlmKCB0b3RhbF9ieXRlcyA8PSAyMDQ4ICkKKyAgICB7CisgICAgICBtZW1jcHkoIHVsRGVzdFB0ciwgCisgICAgICAgICAgICAgICZmY0NoaXAtPlNGUS0+UUVudHJ5W2NvbnN1bWVySW5kZXhdLAorICAgICAgICAgICAgICA2NCApOyAgLy8gZWFjaCBTRlEgZW50cnkgaXMgNjQgYnl0ZXMKKyAgICAgIHVsRGVzdFB0ciArPSAxNjsgICAvLyBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCA2NCBieXRlIGJsb2NrCisgICAgfQorCQkgICAgICAgICAvLyBUYWNoeW9uIGlzIHByb2R1Y2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgYXJlIGNvbnN1bWluZworCisgICAgaWYoICsrY29uc3VtZXJJbmRleCA+PSBTRlFfTEVOKS8vIGNoZWNrIGZvciByb2xsb3ZlcgorICAgICAgY29uc3VtZXJJbmRleCA9IDBMOyAgICAgICAgLy8gcmVzZXQgaXQKKyAgfQorCisgIC8vIGlmIHNwZWNpZmllZCwgdXBkYXRlIHRoZSBUYWNobGl0ZSBjaGlwIENvbnN1bWVySW5kZXguLi4KKyAgaWYoIFVwZGF0ZUNoaXAgKQorICB7CisgICAgZmNDaGlwLT5TRlEtPmNvbnN1bWVySW5kZXggPSBjb25zdW1lckluZGV4OworICAgIHdyaXRlbCggZmNDaGlwLT5TRlEtPmNvbnN1bWVySW5kZXgsCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5TRlFjb25zdW1lckluZGV4LmFkZHJlc3MpOworICB9Cit9CisKKworCisvLyBUYWNoTGl0ZSByb3V0aW5lbHkgZnJlZXplcyBpdCdzIGNvcmUgcXVlcyAtIE91dGJvdW5kIEZJRk8sIEluYm91bmQgRklGTywKKy8vIGFuZCBFeGNoYW5nZSBSZXF1ZXN0IFF1ZXVlIChFUlEpIG9uIGVycm9yIHJlY292ZXIgLSAKKy8vIChlLmcuIHdoZW5ldmVyIGEgTElQIG9jY3VycykuICBIZXJlCisvLyB3ZSByb3V0aW5lbHkgUkVTVU1FIGJ5IGNsZWFyaW5nIHRoZXNlIGJpdHMsIGJ1dCBvbmx5IGlmIHRoZSBsb29wIGlzIHVwCisvLyB0byBhdm9pZCBFUlJPUiBJRExFIG1lc3NhZ2VzIGZvcmV2ZXIuCisKK3ZvaWQgQ3BxVHNVbkZyZWV6ZVRhY2hsaXRlKCB2b2lkICpwQ2hpcCwgaW50IHR5cGUgKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAoUFRBQ0hZT04pcENoaXA7CisgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC52YWx1ZSA9IAorICAgIHJlYWRsKGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC5hZGRyZXNzKTsKKyAgICAgICAgICAgIAorICAvLyAoYml0IDQgb2YgdmFsdWUgaXMgR0JJQyBMQVNFUikKKyAgLy8gaWYgd2UgJ3VuZnJlZXplJyB0aGUgY29yZSBtYWNoaW5lcyBiZWZvcmUgdGhlIGxvb3AgaXMgaGVhbHRoeQorICAvLyAoaS5lLiBGTFQsIE9TLCBMUyBmYWlsdXJlIGJpdHMgc2V0IGluIEZNc3RhdHVzKQorICAvLyB3ZSBjYW4gZ2V0ICdlcnJvciBpZGxlJyBtZXNzYWdlcyBmb3JldmVyLiAgVmVyaWZ5IHRoYXQKKyAgLy8gRk1zdGF0dXMgKExpbmsgU3RhdHVzKSBpcyBPSyBiZWZvcmUgdW5mcmVlemluZy4KKworICBpZiggIShmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MDcwMDAwMDBMKSAmJiAvLyBiaXRzIGNsZWFyPworICAgICAgIShmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4ODAgICkpICAvLyBBY3RpdmUgTFBTTT8KKyAgeworICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC52YWx1ZSAmPSAgfjB4MzAwTDsgLy8gY2xlYXIgRkVRLCBGRkEKKyAgICBpZiggdHlwZSA9PSAxICkgIC8vIHVuZnJlZXplIEVSUSBvbmx5CisgICAgeworLy8gICAgICBwcmludGsoIlVuZnJlZXppbmcgRVJRXG4iKTsKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC52YWx1ZSB8PSAweDEwMDAwTDsgLy8gc2V0IFJFUQorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgIC8vIHVuZnJlZXplIGJvdGggRVJRIGFuZCBGQ1AtQVNTSVNUIChTRVNUKQorICAgIHsKKy8vICAgICAgcHJpbnRrKCJVbmZyZWV6aW5nIEVSUSAmIEZDUC1BU1NJU1RcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgUk9GLCBSSUYsIFJFUSAtIHJlc3VtZSBPdXRib3VuZCBGQ1AsIEluYm5kIEZDUCwgRVJRCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUgfD0gMHg3MDAwMEw7IC8vIHNldCBST0YsIFJJRiwgUkVRCisgICAgfQorCisgICAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUsCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wuYWRkcmVzcyk7CisgICAgICAgICAgICAgIAorICB9CisgICAgICAgICAgLy8gcmVhZGJhY2sgZm9yIHZlcmlmeSAoVGFjaExpdGUgc3RpbGwgZnJvemVuPykKKyAgZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMudmFsdWUgPSAKKyAgICByZWFkbChmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy5hZGRyZXNzKTsKK30KKworCisvLyBXaGVuZXZlciBhbiBGQyBFeGNoYW5nZSBBYm9ydCBpcyByZXF1aXJlZCwgd2UgbXVzdCBtYW5pcHVsYXRlIHRoZQorLy8gSG9zdC9UYWNoeW9uIHNoYXJlZCBtZW1vcnkgU0VTVCB0YWJsZS4gIEJlZm9yZSBkb2luZyB0aGlzLCB3ZQorLy8gbXVzdCBmcmVlemUgVGFjaHlvbiwgd2hpY2ggZmx1c2hlcyBjZXJ0YWluIGJ1ZmZlcnMgYW5kIGVuc3VyZSB3ZQorLy8gY2FuIG1hbmlwdWxhdGUgdGhlIFNFU1Qgd2l0aG91dCBjb250ZW50aW9uLgorLy8gVGhpcyBmcmVlemUgZnVuY3Rpb24gd2lsbCByZXN1bHQgaW4gRkNQICYgRVJRIEZST1pFTiBjb21wbGV0aW9uCisvLyBtZXNzYWdlcyAocGVyIGFyZ3VtZW50ICJ0eXBlIikuCisKK3ZvaWQgQ3BxVHNGcmVlemVUYWNobGl0ZSggdm9pZCAqcENoaXAsIGludCB0eXBlICkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gKFBUQUNIWU9OKXBDaGlwOworICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUgPSAKKyAgICByZWFkbChmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wuYWRkcmVzcyk7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAvL3NldCBGRkEsIEZFUSAtIGZyZWV6ZXMgU0NTSSBhc3Npc3QgYW5kIEVSUQorICBpZiggdHlwZSA9PSAxKSAgICAvLyBmcmVlemUgRVJRIG9ubHkKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUgfD0gMHgxMDBMOyAvLyAoYml0IDQgaXMgbGFzZXIpCisgIGVsc2UgICAgICAgICAgICAgIC8vIGZyZWV6ZSBib3RoIEZDUCBhc3Npc3RzIChTRVNUKSBhbmQgRVJRCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLnZhbHVlIHw9IDB4MzAwTDsgLy8gKGJpdCA0IGlzIGxhc2VyKQorICAKKyAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5UWWNvbnRyb2wudmFsdWUsCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLmFkZHJlc3MpOworICAgICAgICAgICAgICAKK30KKworCisKKworLy8gVEwgaGFzIHR3byBGcmFtZSBNYW5hZ2VyIExpbmsgU3RhdHVzIFJlZ2lzdGVycywgd2l0aCB0aHJlZSA4LWJpdAorLy8gZmllbGRzIGVhY2guIFRoZXNlIGVpZ2h0IGJpdCBjb3VudGVycyBhcmUgY2xlYXJlZCBhZnRlciBlYWNoIHJlYWQsCisvLyBzbyB3ZSBkZWZpbmUgc2l4IDMyLWJpdCBhY2N1bXVsYXRvcnMgZm9yIHRoZXNlIFRMIGNvdW50ZXJzLiBUaGlzCisvLyBmdW5jdGlvbiBicmVha3Mgb3V0IGVhY2ggOC1iaXQgZmllbGQgYW5kIGFkZHMgdGhlIHZhbHVlIHRvIHRoZSBleGlzdGluZworLy8gc3VtLiAgKHMvdyBjb3VudGVycyBjbGVhcmVkIGluZGVwZW5kZW50bHkpCisKK3ZvaWQgZmNQYXJzZUxpbmtTdGF0dXNDb3VudGVycyhQVEFDSFlPTiBmY0NoaXApCit7CisgIFVDSEFSIGJCdWZmOworICBVTE9ORyB1bEJ1ZmY7CisKKworLy8gVGhlIEJCMCB0aW1lciB1c3VhbGx5IGluY3JlbWVudHMgd2hlbiBUTCBpcyBpbml0aWFsaXplZCwgcmVzdWx0aW5nCisvLyBpbiBhbiBpbml0aWFsbHkgYm9ndXMgY291bnQuICBJZiBvdXIgb3duIGNvdW50ZXIgaXMgWkVSTywgaXQgbWVhbnMgd2UKKy8vIGFyZSByZWFkaW5nIHRoaXMgdGhpbmcgZm9yIHRoZSBmaXJzdCB0aW1lLCBzbyB3ZSBpZ25vcmUgdGhlIGZpcnN0IGNvdW50LgorLy8gQWxzbywgcmVhZGluZyB0aGUgcmVnaXN0ZXIgZG9lcyBub3QgY2xlYXIgaXQsIHNvIHdlIGhhdmUgdG8ga2VlcCBhbgorLy8gYWRkaXRpb25hbCBzdGF0aWMgY291bnRlciB0byBkZXRlY3Qgcm9sbG92ZXIgKHl1aykuCisKKyAgaWYoIGZjQ2hpcC0+ZmNTdGF0cy5sYXN0QkIwdGltZXIgPT0gMEwpICAvLyBUTCB3YXMgcmVzZXQ/IChpZ25vcmUgMXN0IHZhbHVlcykKKyAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IFRMJ3MgcmVnaXN0ZXIgY291bnRlciAtIHRoZSAibGFzdCIgY291bnQKKyAgICBmY0NoaXAtPmZjU3RhdHMubGFzdEJCMHRpbWVyID0gCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5GTUJCX0NyZWRpdFplcm8udmFsdWUgJiAweDAwZmZmZmZmTDsKKyAgfQorICBlbHNlICAvLyBzdWJzZXF1ZW50IHBhc3MgLSBjaGVjayBmb3Igcm9sbG92ZXIKKyAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gInRoaXMiIGNvdW50CisgICAgdWxCdWZmID0gZmNDaGlwLT5SZWdpc3RlcnMuRk1CQl9DcmVkaXRaZXJvLnZhbHVlICYgMHgwMGZmZmZmZkw7CisgICAgaWYoIGZjQ2hpcC0+ZmNTdGF0cy5sYXN0QkIwdGltZXIgPiB1bEJ1ZmYgKSAvLyByb2xsb3ZlciBoYXBwZW5lZAorICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnRlciBhZHZhbmNlZCB0byBtYXguLi4KKyAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5CQjBfVGltZXIgKz0gKDB4MDBGRkZGRkZMIC0gZmNDaGlwLT5mY1N0YXRzLmxhc3RCQjB0aW1lcik7CisgICAgICBmY0NoaXAtPmZjU3RhdHMuQkIwX1RpbWVyICs9IHVsQnVmZjsgIC8vIHBsdXMgc29tZSBtb3JlCisKKworICAgIH0KKyAgICBlbHNlIC8vIG5vIHJvbGxvdmVyIC0tIG1vcmUgY291bnRzIG9yIG5vIGNoYW5nZQorICAgIHsKKyAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5CQjBfVGltZXIgKz0gICh1bEJ1ZmYgLSBmY0NoaXAtPmZjU3RhdHMubGFzdEJCMHRpbWVyKTsKKworICAgIH0KKworICAgIGZjQ2hpcC0+ZmNTdGF0cy5sYXN0QkIwdGltZXIgPSB1bEJ1ZmY7CisgIH0KKworCisKKyAgYkJ1ZmYgPSAoVUNIQVIpKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czEudmFsdWUgPj4gMjQpOworICBmY0NoaXAtPmZjU3RhdHMuTG9zc29mU2lnbmFsICs9IGJCdWZmOworCisgIGJCdWZmID0gKFVDSEFSKShmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLnZhbHVlID4+IDE2KTsKKyAgZmNDaGlwLT5mY1N0YXRzLkJhZFJYQ2hhciArPSBiQnVmZjsKKworICBiQnVmZiA9IChVQ0hBUikoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMS52YWx1ZSA+PiA4KTsKKyAgZmNDaGlwLT5mY1N0YXRzLkxvc3NvZlN5bmMgKz0gYkJ1ZmY7CisKKworICBiQnVmZiA9IChVQ0hBUikoZmNDaGlwLT5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi52YWx1ZSA+PiAyNCk7CisgIGZjQ2hpcC0+ZmNTdGF0cy5SeF9FT0ZhICs9IGJCdWZmOworCisgIGJCdWZmID0gKFVDSEFSKShmY0NoaXAtPlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMyLnZhbHVlID4+IDE2KTsKKyAgZmNDaGlwLT5mY1N0YXRzLkRpc19Gcm0gKz0gYkJ1ZmY7CisKKyAgYkJ1ZmYgPSAoVUNIQVIpKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNTGlua1N0YXR1czIudmFsdWUgPj4gOCk7CisgIGZjQ2hpcC0+ZmNTdGF0cy5CYWRfQ1JDICs9IGJCdWZmOworfQorCisKK3ZvaWQgY3BxZmNUU0NsZWFyTGlua1N0YXR1c0NvdW50ZXJzKFBUQUNIWU9OIGZjQ2hpcCkKK3sKKyAgRU5URVIoIkNsZWFyTGlua1N0YXR1c0NvdW50ZXJzIik7CisgIG1lbXNldCggJmZjQ2hpcC0+ZmNTdGF0cywgMCwgc2l6ZW9mKCBGQ1NUQVRTKSk7CisgIExFQVZFKCJDbGVhckxpbmtTdGF0dXNDb3VudGVycyIpOworCit9CisKKworCisKKy8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcmVhZHMgdGhlIEkyQyBoYXJkd2FyZSB0byBnZXQgdGhlIGFkYXB0ZXIncworLy8gV29ybGQgV2lkZSBOYW1lIChXV04pLgorLy8gSWYgdGhlIFdXTiBpcyAiNTAwODA1ZjFmYWRiNDNlOCIgKGFzIHByaW50ZWQgb24gdGhlIGNhcmQpLCB0aGUKKy8vIFRhY2h5b24gV1dOX2hpICgzMi1iaXQpIHJlZ2lzdGVyIGlzIDUwMDgwNWYxLCBhbmQgV1dOX2xvIHJlZ2lzdGVyCisvLyBpcyBmYWRiNDNlOC4KKy8vIEluIHRoZSBOVlJBTSwgdGhlIGJ5dGVzIGFwcGVhciBhczoKKy8vIFsyZF0gLi4KKy8vIFsyZV0gLi4gCisvLyBbMmZdIDUwCisvLyBbMzBdIDA4CisvLyBbMzFdIDA1CisvLyBbMzJdIGYxCisvLyBbMzNdIGZhCisvLyBbMzRdIGRiCisvLyBbMzVdIDQzCisvLyBbMzZdIGU4CisvLworLy8gSW4gdGhlIEZpYnJlIENoYW5uZWwgKEJpZyBFbmRpYW4pIGZvcm1hdCwgdGhlIEZDLUFMIExJU00gZnJhbWUgd2lsbAorLy8gYmUgY29ycmVjdGx5IGxvYWRlZCBieSBUYWNoeW9uIHNpbGljb24uICBJbiB0aGUgbG9naW4gcGF5bG9hZCwgYnl0ZXMKKy8vIG11c3QgYmUgY29ycmVjdGx5IHN3YXBwZWQgZm9yIEJpZyBFbmRpYW4gZm9ybWF0LgorCitpbnQgQ3BxVHNSZWFkV3JpdGVXV04oIFBWT0lEIHBDaGlwLCBpbnQgUmVhZCkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gKFBUQUNIWU9OKXBDaGlwOworI2RlZmluZSBOVlJBTV9TSVpFIDUxMgorICB1bnNpZ25lZCBzaG9ydCBpLCBjb3VudCA9IE5WUkFNX1NJWkU7CisgIFVDSEFSIG52UmFtW05WUkFNX1NJWkVdLCBXV05idWZbOF07CisgIFVMT05HIHVsQnVmZjsKKyAgaW50IGlTdGF0dXM9LTE7ICAvLyBhc3N1bWUgZmFpbHVyZQorICBpbnQgV1dOb2Zmc2V0OworCisgIEVOVEVSKCJSZWFkV3JpdGVXV04iKTsKKyAgLy8gTm93IHRyeSB0byByZWFkIHRoZSBXV04gZnJvbSB0aGUgYWRhcHRlcidzIE5WUkFNCisKKyAgaWYoIFJlYWQgKSAgLy8gUkVBRGluZyBOVlJBTSBXV04/CisgIHsKKyAgICB1bEJ1ZmYgPSBjcHFmY1RTX1JlYWROVlJBTSggZmNDaGlwLT5SZWdpc3RlcnMuVFlzdGF0dXMuYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZY29udHJvbC5hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsICZudlJhbVswXSApOworCisgICAgaWYoIHVsQnVmZiApICAgLy8gTlZSQU0gcmVhZCBzdWNjZXNzZnVsPworICAgIHsKKyAgICAgIGlTdGF0dXMgPSAwOyAvLyBzdWNjZXNzIQorICAgICAgCisgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVuZ2luZWVyaW5nLyBwcm90b3R5cGUgYm9hcmRzLCB0aGUgZGF0YSBtYXkgYmUKKyAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIChHSUdPLCB1c3VhbGx5IGFsbCAiRkYiKTsgdGhpcyBwcmV2ZW50cyB0aGUKKyAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSByb3V0aW5lIGZyb20gd29ya2luZyBjb3JyZWN0bHksIHdoaWNoIG1lYW5zCisgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB3aWxsIGJlIHdyaXR0ZW4gdG8gb3VyIHBhc3NlZCBidWZmZXIuCisKKyAgICAgIFdXTm9mZnNldCA9IGNwcWZjVFNfR2V0TlZSQU1fZGF0YSggV1dOYnVmLCBudlJhbSApOworCisgICAgICBpZiggIVdXTm9mZnNldCApIC8vIHVuaW5pdGlhbGl6ZWQgTlZSQU0gLS0gY29weSBieXRlcyBkaXJlY3RseQorICAgICAgeworICAgICAgICBwcmludGsoICJDQVVUSU9OOiBDb3B5aW5nIE5WUkFNIGRhdGEgb24gZmNDaGlwXG4iKTsKKyAgICAgICAgZm9yKCBpPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgIFdXTmJ1ZltpXSA9IG52UmFtW2kgKzB4MmZdOyAvLyBkYW5nZXJvdXMhIHNvbWUgZm9ybWF0cyB3b24ndCB3b3JrCisgICAgICB9CisgICAgICAKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaSA9IDBMOworICAgICAgZmNDaGlwLT5SZWdpc3RlcnMud3duX2xvID0gMEw7CisgICAgICBmb3IoIGk9MDsgaTw0OyBpKyspICAvLyBXV04gYnl0ZXMgYXJlIGJpZyBlbmRpYW4gaW4gTlZSQU0KKyAgICAgIHsKKyAgICAgICAgdWxCdWZmID0gMEw7CisgICAgICAgIHVsQnVmZiA9IChVTE9ORykoV1dOYnVmW2ldKSA8PCAoOCAqICgzLWkpKTsKKyAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMud3duX2hpIHw9IHVsQnVmZjsKKyAgICAgIH0KKyAgICAgIGZvciggaT0wOyBpPDQ7IGkrKykgIC8vIFdXTiBieXRlcyBhcmUgYmlnIGVuZGlhbiBpbiBOVlJBTQorICAgICAgeworICAgICAgICB1bEJ1ZmYgPSAwTDsKKyAgICAgICAgdWxCdWZmID0gKFVMT05HKShXV05idWZbaSs0XSkgPDwgKDggKiAoMy1pKSk7CisgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbyB8PSB1bEJ1ZmY7CisgICAgICB9CisgICAgfSAgLy8gZG9uZSByZWFkaW5nCisgICAgZWxzZQorICAgIHsKKworICAgICAgcHJpbnRrKCAiY3BxZmNUUzogTlZSQU0gcmVhZCBmYWlsZWRcbiIpOworCisgICAgfQorICB9CisKKyAgZWxzZSAgLy8gV1JJVEUKKyAgeworCisgICAgLy8gTk9URTogV1JJVEUgbm90IHN1cHBvcnRlZCAmIG5vdCB1c2VkIGluIHJlbGVhc2VkIGRyaXZlci4KKworICAgCisgICAgcHJpbnRrKCJSZWFkV3JpdGVOUkFNOiBjYW4ndCB3cml0ZSBOVlJBTTsgYWJvcnRpbmcgd3JpdGVcbiIpOworICB9CisgIAorICBMRUFWRSgiUmVhZFdyaXRlV1dOIik7CisgIHJldHVybiBpU3RhdHVzOworfQorCisKKworCisKKy8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcmVhZHMgb3Igd3JpdGVzIHRoZSBlbnRpcmUgIk5WUkFNIiBjb250ZW50cyBvZiAKKy8vIHRoZSBJMkMgaGFyZHdhcmUgKGkuZS4gdGhlIE5NMjRDMDMpLiAgTm90ZSB0aGF0IEhQJ3MgNTEyMUEgKFRTIDY2TWh6KQorLy8gYWRhcHRlciBkb2VzIG5vdCB1c2UgdGhlIE5NMjRDMDMgY2hpcCwgc28gdGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIG9uCisvLyBDb21wYXEncyBhZGFwdGVycy4KKworaW50IENwcVRzUmVhZFdyaXRlTlZSQU0oIFBWT0lEIHBDaGlwLCBQVk9JRCBidWYsIGludCBSZWFkKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAoUFRBQ0hZT04pcENoaXA7CisjZGVmaW5lIE5WUkFNX1NJWkUgNTEyCisgIFVMT05HIHVsQnVmZjsKKyAgVUNIQVIgKnVjUHRyID0gYnVmOyAvLyBjYXN0IGNhbGxlcidzIHZvaWQgcHRyIHRvIFVDSEFSIGFycmF5CisgIGludCBpU3RhdHVzPS0xOyAgLy8gYXNzdW1lIGZhaWx1cmUKKworICAgICAKKyAgaWYoIFJlYWQgKSAgLy8gUkVBRGluZyBOVlJBTT8KKyAgeworICAgIHVsQnVmZiA9IGNwcWZjVFNfUmVhZE5WUkFNKCAgIC8vIFRSVUUgb24gc3VjY2VzcworICAgICAgICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MsCisgICAgICAgICAgICAgICAgZmNDaGlwLT5SZWdpc3RlcnMuVFljb250cm9sLmFkZHJlc3MsCisgICAgICAgICAgICAgICAgMjU2LCAgICAgICAgICAgIC8vIGJ5dGVzIHRvIHdyaXRlCisgICAgICAgICAgICAgICAgdWNQdHIgKTsgICAgICAgIC8vIHNvdXJjZSBwdHIKKworCisgICAgaWYoIHVsQnVmZiApCisgICAgICBpU3RhdHVzID0gMDsgLy8gc3VjY2VzcworICAgIGVsc2UKKyAgICB7CisjaWZkZWYgREJHCisgICAgICBwcmludGsoICJDQVVUSU9OOiBOVlJBTSByZWFkIGZhaWxlZFxuIik7CisjZW5kaWYKKyAgICB9CisgIH0gIC8vIGRvbmUgcmVhZGluZworCisgIGVsc2UgIC8vIFdSSVRJTkcgTlZSQU0gCisgIHsKKworICAgIHByaW50aygiY3BxZmNUUzogV1JJVEUgb2YgRkMgQ29udHJvbGxlcidzIE5WUkFNIGRpc2FibGVkXG4iKTsKKyAgfQorICAgIAorICByZXR1cm4gaVN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTaTJjLmMgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGE2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2kyYy5jCkBAIC0wLDAgKzEsNDkzIEBACisvKiBDb3B5cmlnaHQoYykgMjAwMCwgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uIAorICogRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyIAorICogNjQtYml0LCA2Nk1IeiBQQ0kgCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgdGVzdGVkIG9uOgorICogKGZyb250KTogW2NoaXBdIFRhY2h5b24gVFMgSFBGQy01MTY2QS8xLjIgIEwyQzEwOTAgLi4uCisgKiAgICAgICAgICBTUCMgUDIyNUNYQ0JGSUVMNlQsIFJldiBYQworICogICAgICAgICAgU1AjIDE2MTI5MC0wMDEsIFJldiBYRAorICogKGJhY2spOiBCb2FyZCBOby4gMDEwMDA4LTAwMSBBL1cgUmV2IFg1LCBGQUIgUkVWIFg1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogV3JpdHRlbiBieSBEb24gWmltbWVybWFuCisqLworLy8gVGhlc2UgZnVuY3Rpb25zIGNvbnRyb2wgdGhlIE5WUkFNIEkyQyBoYXJkd2FyZSBvbiAKKy8vIG5vbi1pbnRlbGxpZ2VudCBGaWJyZSBIb3N0IEFkYXB0ZXJzLgorLy8gVGhlIHByaW1hcnkgcHVycG9zZSBpcyB0byByZWFkIHRoZSBIQkEncyBOVlJBTSB0byBnZXQgYWRhcHRlcidzIAorLy8gbWFudWZhY3R1cmVkIFdXTiB0byBjb3B5IGludG8gVGFjaHlvbiBjaGlwIHJlZ2lzdGVycworLy8gT3JpZ25hbCBzb3VyY2UgYXV0aG9yIHVua25vd24KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CitlbnVtIGJvb2xlYW4geyBGQUxTRSwgVFJVRSB9IDsKKworCisjaWZuZGVmIFVDSEFSCit0eXBlZGVmIF9fdTggVUNIQVI7CisjZW5kaWYKKyNpZm5kZWYgQk9PTEVBTgordHlwZWRlZiBfX3U4IEJPT0xFQU47CisjZW5kaWYKKyNpZm5kZWYgVVNIT1JUCit0eXBlZGVmIF9fdTE2IFVTSE9SVDsKKyNlbmRpZgorI2lmbmRlZiBVTE9ORwordHlwZWRlZiBfX3UzMiBVTE9ORzsKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+ICAvLyBzdHJ1Y3QgcHRfcmVncyBmb3IgSVJRIGhhbmRsZXIgJiBQb3J0IEkvTworCisjaW5jbHVkZSAiY3BxZmNUU2NoaXAuaCIKKworc3RhdGljIHZvaWQgdGxfaTJjX3R4X2J5dGUoIHZvaWQqIEdQSU9vdXQsIFVDSEFSIGRhdGEgKTsKKy8qc3RhdGljIEJPT0xFQU4gdGxfd3JpdGVfaTJjX3BhZ2VfcG9ydGlvbiggdm9pZCogR1BJT2luLCB2b2lkKiBHUElPb3V0LAorICBVU0hPUlQgc3RhcnRPZmZzZXQsICAvLyBlLmcuIDB4MmYgZm9yIFdXTiBzdGFydAorICBVU0hPUlQgY291bnQsCisgIFVDSEFSICpidWYgKTsKKyovCisKKy8vCisvLyBUYWNobGl0ZSBHUElPMiwgR1BJTzMgKEkyQykgREVGSU5FUworLy8gVGhlIE5WUkFNIGNoaXAgTk0yNEMwMyBkZWZpbmVzIFNDTCAoc2VyaWFsIGNsb2NrKSBhbmQgU0RBIChzZXJpYWwgZGF0YSkKKy8vIEdQSU8yIGRyaXZlcyBTREEsIGFuZCBHUElPMyBkcml2ZXMgU0NMCisvLyAKKy8vIFNpbmNlIFRhY2hsaXRlIGludmVydHMgdGhlIHN0YXRlIG9mIHRoZSBHUElPIDAtMyBvdXRwdXRzLCBTRVQgd3JpdGVzIDAKKy8vIGFuZCBjbGVhciB3cml0ZXMgMS4gVGhlIGlucHV0IGxpbmVzIChyZWFkIGluIFRMIHN0YXR1cykgaXMgTk9UIGludmVydGVkCisvLyBUaGlzIHJlYWxseSBoZWxwcyBjb25mdXNlIHRoZSBjb2RlIGFuZCBkZWJ1Z2dpbmcuCisKKyNkZWZpbmUgU0VUX0RBVEFfSEkgIDB4MAorI2RlZmluZSBTRVRfREFUQV9MTyAgMHg4CisjZGVmaW5lIFNFVF9DTE9DS19ISSAweDAKKyNkZWZpbmUgU0VUX0NMT0NLX0xPIDB4NAorCisjZGVmaW5lIFNFTlNFX0RBVEFfSEkgIDB4OAorI2RlZmluZSBTRU5TRV9EQVRBX0xPICAweDAKKyNkZWZpbmUgU0VOU0VfQ0xPQ0tfSEkgMHg0CisjZGVmaW5lIFNFTlNFX0NMT0NLX0xPIDB4MAorCisjZGVmaW5lIFNMQVZFX1JFQURfQUREUkVTUyAgICAweEExCisjZGVmaW5lIFNMQVZFX1dSSVRFX0FERFJFU1MgICAweEEwCisJCQkJCSAgICAgIAorCitzdGF0aWMgdm9pZCBpMmNfZGVsYXkoVUxPTkcgbXN0aW1lKTsKK3N0YXRpYyB2b2lkIHRsX2kyY19jbG9ja19wdWxzZSggVUNIQVIgLCB2b2lkKiBHUElPb3V0KTsKK3N0YXRpYyBVQ0hBUiB0bF9yZWFkX2kyY19kYXRhKCB2b2lkKiApOworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgIE5hbWU6ICAgSTJDX1JYX0FDSworLy8KKy8vICAgICAgVGhpcyByb3V0aW5lIHJlY2VpdmVzIGFuIGFja25vd2xlZGdlIG92ZXIgdGhlIEkyQyBidXMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHVuc2lnbmVkIHNob3J0IHRsX2kyY19yeF9hY2soIHZvaWQqIEdQSU9pbiwgdm9pZCogR1BJT291dCApCit7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkvLyBkbyBjbG9jayBwdWxzZSwgbGV0IGRhdGEgbGluZSBmbG9hdCBoaWdoCisgIHRsX2kyY19jbG9ja19wdWxzZSggU0VUX0RBVEFfSEksIEdQSU9vdXQgKTsKKworCS8vIHNsYXZlIG11c3QgZHJpdmUgZGF0YSBsb3cgZm9yIGFja25vd2xlZGdlCisgIHZhbHVlID0gdGxfcmVhZF9pMmNfZGF0YSggR1BJT2luKTsKKyAgaWYgKHZhbHVlICYgU0VOU0VfREFUQV9ISSApCisgICAgcmV0dXJuKCBGQUxTRSApOworCisgIHJldHVybiggVFJVRSApOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICAgTmFtZTogICBSRUFEX0kyQ19SRUcKKy8vCisvLyAgICAgIFRoaXMgcm91dGluZSByZWFkcyB0aGUgSTJDIGNvbnRyb2wgcmVnaXN0ZXIgdXNpbmcgdGhlIGdsb2JhbAorLy8gICAgICBJTyBhZGRyZXNzIHN0b3JlZCBpbiBncGlvcmVnLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBVQ0hBUiB0bF9yZWFkX2kyY19kYXRhKCB2b2lkKiBncGlvcmVnICkKK3sKKyAgcmV0dXJuKCAoVUNIQVIpKHJlYWRsKCBncGlvcmVnICkgJiAweDA4TCkgKTsgLy8gR1BJTzMKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgIE5hbWU6ICAgV1JJVEVfSTJDX1JFRworLy8KKy8vICAgICAgVGhpcyByb3V0aW5lIHdyaXRlcyB0aGUgSTJDIGNvbnRyb2wgcmVnaXN0ZXIgdXNpbmcgdGhlIGdsb2JhbAorLy8gICAgICBJTyBhZGRyZXNzIHN0b3JlZCBpbiBncGlvcmVnLgorLy8gICAgICBJbiBUYWNobGl0ZSwgd2UgZG9uJ3Qgd2FudCB0byBtb2RpZnkgb3RoZXIgYml0cyBpbiBUTCBDb250cm9sIHJlZy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCB0bF93cml0ZV9pMmNfcmVnKCB2b2lkKiBncGlvcmVnT1VULCBVQ0hBUiB2YWx1ZSApCit7CisgIFVMT05HICB0ZW1wOworCisJLy8gRmlyc3QgcmVhZCB0aGUgcmVnaXN0ZXIgYW5kIGNsZWFyIG91dCB0aGUgb2xkIGJpdHMKKyAgdGVtcCA9IHJlYWRsKCBncGlvcmVnT1VUICkgJiAweGZmZmZmZmYzTDsKKworCS8vIE5vdyBvciBpbiB0aGUgbmV3IGRhdGEgYW5kIHNlbmQgaXQgYmFjayBvdXQKKyAgd3JpdGVsKCB0ZW1wIHwgdmFsdWUsIGdwaW9yZWdPVVQpOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICAgTmFtZTogICBJMkNfVFhfU1RBUlQKKy8vCisvLyAgICAgIFRoaXMgcm91dGluZSB0cmFuc21pdHMgYSBzdGFydCBjb25kaXRpb24gb3ZlciB0aGUgSTJDIGJ1cy4KKy8vICAgICAgMS4gU2V0IFNDTCAoY2xvY2ssIEdQSU8yKSBISUdILCBzZXQgU0RBIChkYXRhLCBHUElPMykgSElHSCwKKy8vICAgICAgd2FpdCA1dXMgdG8gc3RhYmlsaXplLgorLy8gICAgICAyLiBXaXRoIFNDTCBzdGlsbCBISUdILCBkcml2ZSBTREEgbG93LiAgVGhlIGxvdyB0cmFuc2l0aW9uIG1hcmtzCisvLyAgICAgICAgIHRoZSBzdGFydCBjb25kaXRpb24gdG8gTk0yNEN4eCAodGhlIGNoaXApCisvLyAgICAgIE5PVEUhIEluIFRMIGNvbnRyb2wgcmVnLiwgb3V0cHV0IDEgbWVhbnMgY2hpcCBzZWVzIExPVworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bF9pMmNfdHhfc3RhcnQoIHZvaWQqIEdQSU9pbiwgdm9pZCogR1BJT291dCApCit7CisgIHVuc2lnbmVkIHNob3J0IGk7CisgIFVMT05HIHZhbHVlOworCisgIGlmICggISh0bF9yZWFkX2kyY19kYXRhKEdQSU9pbikgJiBTRU5TRV9EQVRBX0hJKSkKKyAgeworICAgIC8vIHN0YXJ0IHdpdGggY2xvY2sgaGlnaCwgbGV0IGRhdGEgZmxvYXQgaGlnaAorICAgIHRsX3dyaXRlX2kyY19yZWcoICBHUElPb3V0LCBTRVRfREFUQV9ISSB8IFNFVF9DTE9DS19ISSApOworCisgICAgLy8ga2VlcCBzZW5kaW5nIGNsb2NrIHB1bHNlcyBpZiBzbGF2ZSBpcyBkcml2aW5nIGRhdGEgbGluZQorICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgIHsKKyAgICAgIHRsX2kyY19jbG9ja19wdWxzZSggU0VUX0RBVEFfSEksIEdQSU9vdXQgKTsKKworICAgICAgaWYgKCB0bF9yZWFkX2kyY19kYXRhKEdQSU9pbikgJiBTRU5TRV9EQVRBX0hJICkKKwlicmVhazsKKyAgICB9CisKKwkJLy8gaWYgaGUncyBzdGlsbCBkcml2aW5nIGRhdGEgbG93IGFmdGVyIDEwIGNsb2NrcywgYWJvcnQKKyAgICB2YWx1ZSA9IHRsX3JlYWRfaTJjX2RhdGEoIEdQSU9pbiApOyAvLyByZWFkIHN0YXR1cworICAgIGlmICghKHZhbHVlICYgMHgwOCkgKQorICAgICAgcmV0dXJuKCBGQUxTRSApOworICB9CisKKworCS8vIFRvIFNUQVJULCBicmluZyBkYXRhIGxvdyB3aGlsZSBjbG9jayBoaWdoCisgIHRsX3dyaXRlX2kyY19yZWcoICBHUElPb3V0LCBTRVRfQ0xPQ0tfSEkgfCBTRVRfREFUQV9MTyApOworCisgIGkyY19kZWxheSgwKTsKKworICByZXR1cm4oIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUWCBzdGFydCBzdWNjZXNzZnVsCit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICAgICBOYW1lOiAgIEkyQ19UWF9TVE9QCisvLworLy8gICAgICBUaGlzIHJvdXRpbmUgdHJhbnNtaXRzIGEgc3RvcCBjb25kaXRpb24gb3ZlciB0aGUgSTJDIGJ1cy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bF9pMmNfdHhfc3RvcCggdm9pZCogR1BJT2luLCB2b2lkKiBHUElPb3V0ICkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIAorICB7CisgIC8vIFNlbmQgY2xvY2sgcHVsc2UsIGRyaXZlIGRhdGEgbGluZSBsb3cKKyAgICB0bF9pMmNfY2xvY2tfcHVsc2UoIFNFVF9EQVRBX0xPLCBHUElPb3V0ICk7CisKKyAgLy8gVG8gU1RPUCwgYnJpbmcgZGF0YSBoaWdoIHdoaWxlIGNsb2NrIGhpZ2gKKyAgICB0bF93cml0ZV9pMmNfcmVnKCAgR1BJT291dCwgU0VUX0RBVEFfSEkgfCBTRVRfQ0xPQ0tfSEkgKTsKKworICAvLyBHaXZlIHRoZSBkYXRhIGxpbmUgdGltZSB0byBmbG9hdCBoaWdoCisgICAgaTJjX2RlbGF5KDApOworCisgIC8vIElmIHNsYXZlIGlzIGRyaXZpbmcgZGF0YSBsaW5lIGxvdywgdGhlcmUncyBhIHByb2JsZW07IHJldHJ5CisgICAgaWYgKCB0bF9yZWFkX2kyY19kYXRhKEdQSU9pbikgJiBTRU5TRV9EQVRBX0hJICkKKyAgICAgIHJldHVybiggVFJVRSApOyAgLy8gVFggU1RPUCBzdWNjZXNzZnVsIQorICB9CisKKyAgcmV0dXJuKCBGQUxTRSApOyAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgICAgTmFtZTogICBJMkNfVFhfdWNoYXIKKy8vCisvLyAgICAgIFRoaXMgcm91dGluZSB0cmFuc21pdHMgYSBieXRlIGFjcm9zcyB0aGUgSTJDIGJ1cy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCB0bF9pMmNfdHhfYnl0ZSggdm9pZCogR1BJT291dCwgVUNIQVIgZGF0YSApCit7CisgIFVDSEFSIGJpdDsKKworICBmb3IgKGJpdCA9IDB4ODA7IGJpdDsgYml0ID4+PSAxKQorICB7CisgICAgaWYoIGRhdGEgJiBiaXQgKQorICAgICAgdGxfaTJjX2Nsb2NrX3B1bHNlKCAoVUNIQVIpU0VUX0RBVEFfSEksIEdQSU9vdXQpOworICAgIGVsc2UKKyAgICAgIHRsX2kyY19jbG9ja19wdWxzZSggKFVDSEFSKVNFVF9EQVRBX0xPLCBHUElPb3V0KTsKKyAgfSAgCit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICAgICBOYW1lOiAgIEkyQ19SWF91Y2hhcgorLy8KKy8vICAgICAgVGhpcyByb3V0aW5lIHJlY2VpdmVzIGEgYnl0ZSBhY3Jvc3MgdGhlIEkyQyBidXMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIFVDSEFSIHRsX2kyY19yeF9ieXRlKCB2b2lkKiBHUElPaW4sIHZvaWQqIEdQSU9vdXQgKQoreworICBVQ0hBUiBiaXQ7CisgIFVDSEFSIGRhdGEgPSAwOworCisKKyAgZm9yIChiaXQgPSAweDgwOyBiaXQ7IGJpdCA+Pj0gMSkgeworICAgIC8vIGRvIGNsb2NrIHB1bHNlLCBsZXQgZGF0YSBsaW5lIGZsb2F0IGhpZ2gKKyAgICB0bF9pMmNfY2xvY2tfcHVsc2UoIFNFVF9EQVRBX0hJLCBHUElPb3V0ICk7CisKKyAgICAvLyByZWFkIGRhdGEgbGluZQorICAgIGlmICggdGxfcmVhZF9pMmNfZGF0YSggR1BJT2luKSAmIDB4MDggKQorICAgICAgZGF0YSB8PSBiaXQ7CisgIH0KKworICByZXR1cm4gKGRhdGEpOworfQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gRnVuY3Rpb246ICAgcmVhZF9pMmNfbnZyYW0KKy8vIEFyZ3VtZW50czogIFVDSEFSIGNvdW50ICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorLy8gICAgICAgICAgICAgVUNIQVIgKmJ1ZiAgICAgIGFyZWEgdG8gc3RvcmUgdGhlIGJ5dGVzIHJlYWQKKy8vIFJldHVybnM6ICAgIDAgLSBmYWlsZWQKKy8vICAgICAgICAgICAgIDEgLSBzdWNjZXNzCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit1bnNpZ25lZCBsb25nIGNwcWZjVFNfUmVhZE5WUkFNKCB2b2lkKiBHUElPaW4sIHZvaWQqIEdQSU9vdXQgLCBVU0hPUlQgY291bnQsCisJVUNIQVIgKmJ1ZiApCit7CisgIHVuc2lnbmVkIHNob3J0IGk7CisKKyAgaWYoICEoIHRsX2kyY190eF9zdGFydChHUElPaW4sIEdQSU9vdXQpICkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8vIFNlbGVjdCB0aGUgTlZSQU0gZm9yICJkdW1teSIgd3JpdGUsIHRvIHNldCB0aGUgYWRkcmVzcworICB0bF9pMmNfdHhfYnl0ZSggR1BJT291dCAsIFNMQVZFX1dSSVRFX0FERFJFU1MgKTsKKyAgaWYgKCAhdGxfaTJjX3J4X2FjayhHUElPaW4sIEdQSU9vdXQgKSApCisgICAgcmV0dXJuKCBGQUxTRSApOworCisgIC8vIE5vdyBzZW5kIHRoZSBhZGRyZXNzIHdoZXJlIHdlIHdhbnQgdG8gc3RhcnQgcmVhZGluZyAgCisgIHRsX2kyY190eF9ieXRlKCBHUElPb3V0ICwgMCApOworICBpZiAoICF0bF9pMmNfcnhfYWNrKEdQSU9pbiwgR1BJT291dCApICkKKyAgICByZXR1cm4oIEZBTFNFICk7CisKKyAgLy8gU2VuZCBhIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiBhbmQgc2VsZWN0IHRoZQorICAvLyAgc2xhdmUgZm9yIHJlYWRpbmcgbm93LgorICBpZiggdGxfaTJjX3R4X3N0YXJ0KEdQSU9pbiwgR1BJT291dCkgKQorICAgIHRsX2kyY190eF9ieXRlKCBHUElPb3V0LCBTTEFWRV9SRUFEX0FERFJFU1MgKTsKKworICBpZiAoICF0bF9pMmNfcnhfYWNrKEdQSU9pbiwgR1BJT291dCkgKQorICAgIHJldHVybiggRkFMU0UgKTsKKworICAvLyB0aGlzIGxvb3Agd2lsbCBub3cgcmVhZCBvdXQgdGhlIGRhdGEgYW5kIHN0b3JlIGl0CisgIC8vICBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYnVmCisgIGZvciAoIGk9MDsgaTxjb3VudDsgaSsrKSAKKyAgeworICAgICpidWYrKyA9IHRsX2kyY19yeF9ieXRlKEdQSU9pbiwgR1BJT291dCk7CisKKyAgICAvLyBTZW5kIEFDSyBieSBob2xkaW5nIGRhdGEgbGluZSBsb3cgZm9yIDEgY2xvY2sKKyAgICBpZiAoIGkgPCAoY291bnQtMSkgKQorICAgICAgdGxfaTJjX2Nsb2NrX3B1bHNlKCAweDA4LCBHUElPb3V0ICk7CisgICAgZWxzZSB7CisJLy8gRG9uJ3Qgc2VuZCBhY2sgZm9yIGZpbmFsIGJ5dGUKKyAgICAgIHRsX2kyY19jbG9ja19wdWxzZSggU0VUX0RBVEFfSEksIEdQSU9vdXQgKTsKKyAgICB9CisgIH0KKworICB0bF9pMmNfdHhfc3RvcChHUElPaW4sIEdQSU9vdXQpOworCisgIHJldHVybiggVFJVRSApOworfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLworLy8KKy8vIHJvdXRpbmVzIHRvIHNldCBhbmQgY2xlYXIgdGhlIGRhdGEgYW5kIGNsb2NrIGJpdHMKKy8vCisvLworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitzdGF0aWMgdm9pZCB0bF9zZXRfY2xvY2sodm9pZCogZ3Bpb3JlZykKK3sKKyAgVUxPTkcgcmV0X3ZhbDsKKworICByZXRfdmFsID0gcmVhZGwoIGdwaW9yZWcgKTsKKyAgcmV0X3ZhbCAmPSAweGZmZmZmZkZCTDsgIC8vIGNsZWFyIEdQSU8yIChTQ0wpCisgIHdyaXRlbCggcmV0X3ZhbCwgZ3Bpb3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRsX2Nscl9jbG9jayh2b2lkKiBncGlvcmVnKQoreworICBVTE9ORyByZXRfdmFsOworCisgIHJldF92YWwgPSByZWFkbCggZ3Bpb3JlZyApOworICByZXRfdmFsIHw9IFNFVF9DTE9DS19MTzsKKyAgd3JpdGVsKCByZXRfdmFsLCBncGlvcmVnKTsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vCisvLyBUaGlzIHJvdXRpbmUgd2lsbCBhZHZhbmNlIHRoZSBjbG9jayBieSBvbmUgcGVyaW9kCisvLworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkIHRsX2kyY19jbG9ja19wdWxzZSggVUNIQVIgdmFsdWUsIHZvaWQqIEdQSU9vdXQgICkKK3sKKyAgVUxPTkcgcmV0X3ZhbDsKKworICAvLyBjbGVhciB0aGUgY2xvY2sgYml0CisgIHRsX2Nscl9jbG9jayggR1BJT291dCApOworCisgIGkyY19kZWxheSgwKTsKKworCisgIC8vIHJlYWQgdGhlIHBvcnQgdG8gcHJlc2VydmUgbm9uLUkyQyBiaXRzCisgIHJldF92YWwgPSByZWFkbCggR1BJT291dCApOworCisgIC8vIGNsZWFyIHRoZSBkYXRhICYgY2xvY2sgYml0cworICByZXRfdmFsICY9IDB4RkZGRkZGZjM7CisKKyAgLy8gd3JpdGUgdGhlIHZhbHVlIHBhc3NlZCBpbi4uLgorICAvLyBkYXRhIGNhbiBvbmx5IGNoYW5nZSB3aGlsZSBjbG9jayBpcyBMT1chCisgIHJldF92YWwgfD0gdmFsdWU7ICAgICAgICAgICAvLyB0aGUgZGF0YQorICByZXRfdmFsIHw9IFNFVF9DTE9DS19MTzsgICAgLy8gdGhlIGNsb2NrCisgIHdyaXRlbCggcmV0X3ZhbCwgR1BJT291dCApOworCisgIGkyY19kZWxheSgwKTsKKworCisgIC8vc2V0IGNsb2NrIGJpdAorICB0bF9zZXRfY2xvY2soIEdQSU9vdXQpOworfQorCisKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8KKy8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSA2NC1iaXQgV1dOCisvLworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2ludCBjcHFmY1RTX0dldE5WUkFNX2RhdGEoIFVDSEFSICp3d25idWYsIFVDSEFSICpidWYgKQoreworICBVTE9ORyBsZW47CisgIFVMT05HIHN1Yl9sZW47CisgIFVMT05HIHB0cl9pbmM7CisgIFVMT05HIGk7CisgIFVMT05HIGo7CisgIFVDSEFSICpkYXRhX3B0cjsKKyAgVUNIQVIgIHo7CisgIFVDSEFSICBuYW1lOworICBVQ0hBUiAgc3ViX25hbWU7CisgIFVDSEFSICBkb25lOworICBpbnQgaVJldHVybj0wOyAgLy8gZGVmLiAwIG9mZnNldCBpcyBmYWlsdXJlIHRvIGZpbmQgV1dOIGZpZWxkCisgIAorCisJICAKKyAgZGF0YV9wdHIgPSAoVUNIQVIgKilidWY7CisKKyAgZG9uZSA9IEZBTFNFOworICBpID0gMDsKKworICB3aGlsZSAoIChpIDwgMTI4KSAmJiAoIWRvbmUpICkgCisgIHsKKyAgICB6ID0gZGF0YV9wdHJbaV07XAorICAgIGlmICggISh6ICYgMHg4MCkgKSAgCisgICAgewkKKyAgICAgIGxlbiAgPSAxICsgKHogJiAweDA3KTsKKworICAgICAgbmFtZSA9ICh6ICYgMHg3OCkgPj4gMzsKKyAgICAgIGlmIChuYW1lID09IDB4MEYpCisgICAgICAgIGRvbmUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgIG5hbWUgPSB6ICYgMHg3RjsKKyAgICAgIGxlbiAgPSAzICsgZGF0YV9wdHJbaSsxXSArIChkYXRhX3B0cltpKzJdIDw8IDgpOworICAgICAgICAgICAKKyAgICAgIHN3aXRjaCAobmFtZSkgCisgICAgICB7CisgICAgICBjYXNlIDB4MEQ6CisJLy8KKwkgIGogPSBpICsgMzsKKwkgIC8vCisJICBpZiAoIGRhdGFfcHRyW2pdID09IDB4M2IgKSB7CisJICAgIGxlbiA9IDY7CisJICAgIGJyZWFrOworCSAgfQorCisJICB3aGlsZSAoIGo8KGkrbGVuKSApIHsKKwkgICAgc3ViX25hbWUgPSAoZGF0YV9wdHJbal0gJiAweDNmKTsKKwkgICAgc3ViX2xlbiAgPSBkYXRhX3B0cltqKzFdICsgCisJICAgICAgICAgICAgICAgKGRhdGFfcHRyW2orMl0gPDwgOCk7CisgICAgICAgICAgICBwdHJfaW5jICA9IHN1Yl9sZW4gKyAzOyAKKwkgICAgc3dpdGNoIChzdWJfbmFtZSkgCisJICAgIHsKKwkgICAgY2FzZSAweDNDOgorICAgICAgICAgICAgICBtZW1jcHkoIHd3bmJ1ZiwgJmRhdGFfcHRyW2orM10sIDgpOworICAgICAgICAgICAgICBpUmV0dXJuID0gaiszOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGogKz0gcHRyX2luYzsKKyAgICAgICAgICB9CisJICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKwkgIGJyZWFrOworICAgICAgfSAgCisgICAgfSAgCisgIC8vCisgICAgaSArPSBsZW47CisgIH0gIC8vIGVuZCB3aGlsZSAKKyAgcmV0dXJuIGlSZXR1cm47Cit9CisKKworCisKKworLy8gZGVmaW5lIGEgc2hvcnQgNSBtaWNybyBzZWMgZGVsYXksIGFuZCBsb25nZXIgKG1zKSBkZWxheQorCitzdGF0aWMgdm9pZCBpMmNfZGVsYXkoVUxPTkcgbXN0aW1lKQoreworICBVTE9ORyBpOworICAKKy8vIE5PVEU6IHdlIG9ubHkgZXhwZWN0IHRvIHVzZSB0aGVzZSBkZWxheXMgd2hlbiByZWFkaW5nCisvLyBvdXIgYWRhcHRlcidzIE5WUkFNLCB3aGljaCBoYXBwZW5zIG9ubHkgZHVyaW5nIGFkYXB0ZXIgcmVzZXQuCisvLyBEZWxheSB0ZWNobmlxdWUgZnJvbSAiTGludXggRGV2aWNlIERyaXZlcnMiLCBBLiBSdWJpbmkgCisvLyAoMXN0IEVkLikgcGcgMTM3LgorCisvLyAgcHJpbnRrKCIgZGVsYXkgJWx4ICAiLCBtc3RpbWUpOworICBpZiggbXN0aW1lICkgLy8gbXMgZGVsYXk/CisgIHsKKyAgICAvLyBkZWxheSB0ZWNobmlxdWUKKyAgICBmb3IoIGk9MDsgaSA8IG1zdGltZTsgaSsrKQorICAgICAgdWRlbGF5KDEwMDApOyAvLyAxbXMgcGVyIGxvb3AKKwkKKyAgfQorICBlbHNlICAvLyA1IG1pY3JvIHNlYyBkZWxheQorICAKKyAgICB1ZGVsYXkoIDUgKTsgLy8gbWljcm8gc2VjcworICAKKy8vICBwcmludGsoImRvbmVcbiIpOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NwcWZjVFNpbml0LmMgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWViNDkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNpbml0LmMKQEAgLTAsMCArMSwyMDk4IEBACisvKiBDb3B5cmlnaHQoYykgMjAwMCwgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uIAorICogRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyIAorICogNjQtYml0LCA2Nk1IeiBQQ0kgCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgdGVzdGVkIG9uOgorICogKGZyb250KTogW2NoaXBdIFRhY2h5b24gVFMgSFBGQy01MTY2QS8xLjIgIEwyQzEwOTAgLi4uCisgKiAgICAgICAgICBTUCMgUDIyNUNYQ0JGSUVMNlQsIFJldiBYQworICogICAgICAgICAgU1AjIDE2MTI5MC0wMDEsIFJldiBYRAorICogKGJhY2spOiBCb2FyZCBOby4gMDEwMDA4LTAwMSBBL1cgUmV2IFg1LCBGQUIgUkVWIFg1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogV3JpdHRlbiBieSBEb24gWmltbWVybWFuCisgKiBJT0NUTCBhbmQgcHJvY2ZzIGFkZGVkIGJ5IEpvdWtlIE51bWFuCisgKiBTTVAgdGVzdGluZyBieSBDaGVsIFZhbiBHZW5uaXAKKyAqCisgKiBwb3J0aW9ucyBjb3BpZWQgZnJvbToKKyAqIFFMb2dpYyBDUFFGQ1RTIFNDU0ktRkNQCisgKiBXcml0dGVuIGJ5IEVyaWsgSC4gTW9lLCBlaG1AY3Jpcy5jb20KKyAqIENvcHlyaWdodCAxOTk1LCBFcmlrIEguIE1vZQorICogUmVuYW1lZCBhbmQgdXBkYXRlZCB0byAxLjMueCBieSBNaWNoYWVsIEdyaWZmaXRoIDxncmlmQGNzLnVjci5lZHU+IAorICogQ2hyaXMgTG92ZWxhbmQgPGN3bEBpb2wudW5oLmVkdT4gdG8gc3VwcG9ydCB0aGUgaXNwMjEwMCBhbmQgaXNwMjIwMAorKi8KKworCisjZGVmaW5lIExpbnV4VmVyc2lvbkNvZGUodiwgcCwgcykgKCgodik8PDE2KSsoKHApPDw4KSsocykpCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAgCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+ICAvLyByZXF1ZXN0X3JlZ2lvbigpIHByb3RvdHlwZQorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+ICAgLy8gaW9jdGwgcmVsYXRlZAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2luY2x1ZGUgImNwcWZjVFNjaGlwLmgiCisjaW5jbHVkZSAiY3BxZmNUU3N0cnVjdHMuaCIKKyNpbmNsdWRlICJjcHFmY1RTdHJpZ2dlci5oIgorCisjaW5jbHVkZSAiY3BxZmNUUy5oIgorCisvKiBFbWJlZGRlZCBtb2R1bGUgZG9jdW1lbnRhdGlvbiBtYWNyb3MgLSBzZWUgbW9kdWxlLmggKi8KK01PRFVMRV9BVVRIT1IoIkNvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIENvbXBhcSA2NC1iaXQvNjZNaHogUENJIEZpYnJlIENoYW5uZWwgSEJBIHYuIDIuNS40Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisgIAoraW50IGNwcWZjVFNfVGFyZ2V0RGV2aWNlUmVzZXQoIFNjc2lfRGV2aWNlICpTY3NpRGV2LCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpOworCisvLyBUaGlzIHN0cnVjdCB3YXMgb3JpZ2luYWxseSBkZWZpbmVkIGluIAorLy8gL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKKy8vIHNpbmNlIGl0J3Mgb25seSBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQsIHdlIG9ubHkgdXNlIGZpcnN0CisvLyBmZXcgZmllbGRzLi4uCisvLyBOT1RFOiBwcm9jX2ZzIGNoYW5nZXMgaW4gMi40IGtlcm5lbAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgTGludXhWZXJzaW9uQ29kZSgyLDMsMjcpCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5IHByb2Nfc2NzaV9jcHFmY1RTID0KK3sKKyAgUFJPQ19TQ1NJX0NQUUZDVFMsICAgICAgICAgICAvLyB1c2hvcnQgbG93X2lubyAoZW51bWVyYXRlZCBsaXN0KQorICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzaG9ydCBuYW1lbGVuCisgIERFVl9OQU1FLCAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgY2hhciogbmFtZQorICBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sIC8vIG1vZGVfdCBtb2RlCisgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmxpbmtfdCBubGluaworCSAgICAgICAgICAgICAgICAgICAgICAgLy8gZXRjLiAuLi4KK307CisKKworI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gTGludXhWZXJzaW9uQ29kZSgyLDQsNykKKyMgIGRlZmluZSBDUFFGQ19ERUNMQVJFX0NPTVBMRVRJT04oeCkgREVDTEFSRV9DT01QTEVUSU9OKHgpCisjICBkZWZpbmUgQ1BRRkNfV0FJVElORyB3YWl0aW5nCisjICBkZWZpbmUgQ1BRRkNfQ09NUExFVEUoeCkgY29tcGxldGUoeCkKKyMgIGRlZmluZSBDUFFGQ19XQUlUX0ZPUl9DT01QTEVUSU9OKHgpIHdhaXRfZm9yX2NvbXBsZXRpb24oeCk7CisjZWxzZQorIyAgZGVmaW5lIENQUUZDX0RFQ0xBUkVfQ09NUExFVElPTih4KSBERUNMQVJFX01VVEVYX0xPQ0tFRCh4KQorIyAgZGVmaW5lIENQUUZDX1dBSVRJTkcgc2VtCisjICBkZWZpbmUgQ1BRRkNfQ09NUExFVEUoeCkgdXAoeCkKKyMgIGRlZmluZSBDUFFGQ19XQUlUX0ZPUl9DT01QTEVUSU9OKHgpIGRvd24oeCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGNwcWZjX2FsbG9jX3ByaXZhdGVfZGF0YV9wb29sKENQUUZDSEJBICpoYmEpOworCisvKiBsb2NhbCBmdW5jdGlvbiB0byBsb2FkIG91ciBwZXItSEJBIChsb2NhbCkgZGF0YSBmb3IgY2hpcAorICAgcmVnaXN0ZXJzLCBGQyBsaW5rIHN0YXRlLCBhbGwgRkMgZXhjaGFuZ2VzLCBldGMuCisKKyAgIFdlIGFsbG9jYXRlIHNwYWNlIGFuZCBjb21wdXRlIGFkZHJlc3Mgb2Zmc2V0cyBmb3IgdGhlCisgICBtb3N0IGZyZXF1ZW50bHkgYWNjZXNzZWQgYWRkcmVzc2VzOyBvdGhlcnMgKGxpa2UgV29ybGQgV2lkZQorICAgTmFtZSkgYXJlIG5vdCBuZWNlc3NhcnkuCisqLworc3RhdGljIHZvaWQgQ3BxZmNfaW5pdEhCQWRhdGEoQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgc3RydWN0IHBjaV9kZXYgKlBjaURldiApCit7CisgICAgICAgICAgICAgCisgIGNwcWZjSEJBZGF0YS0+UGNpRGV2ID0gUGNpRGV2OyAvLyBjb3B5IFBDSSBpbmZvIHB0cgorCisgIC8vIHNpbmNlIHg4NiBwb3J0IHNwYWNlIGlzIDY0aywgd2Ugb25seSBuZWVkIHRoZSBsb3dlciAxNiBiaXRzCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VMID0gCisgICAgUGNpRGV2LT5yZXNvdXJjZVsxXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKyAgCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VVID0gCisgICAgUGNpRGV2LT5yZXNvdXJjZVsyXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKyAgCisgIC8vIDMyLWJpdCBtZW1vcnkgYWRkcmVzc2VzCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5NZW1CYXNlID0gCisgICAgUGNpRGV2LT5yZXNvdXJjZVszXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSA9IAorICAgIGlvcmVtYXAoIFBjaURldi0+cmVzb3VyY2VbM10uc3RhcnQgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLLAorICAgICAgICAgICAgIDB4MjAwKTsKKyAgCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SQU1CYXNlID0gCisgICAgUGNpRGV2LT5yZXNvdXJjZVs0XS5zdGFydDsKKyAgCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5TUk9NQmFzZSA9ICAvLyBOVUxMIGZvciBIUCBUUyBhZGFwdGVyCisgICAgUGNpRGV2LT5yZXNvdXJjZVs1XS5zdGFydDsKKyAgCisgIC8vIG5vdyB0aGUgVGFjaGxpdGUgY2hpcCByZWdpc3RlcnMKKyAgLy8gdGhlIFJFR0lTVEVSIHN0cnVjdCBob2xkcyBib3RoIHRoZSBwaHlzaWNhbCBhZGRyZXNzICYgbGFzdAorICAvLyB3cml0dGVuIHZhbHVlIChzb21lIFRMIHJlZ2lzdGVycyBhcmUgV1JJVEUgT05MWSkKKworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuU0ZRY29uc3VtZXJJbmRleC5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fU0ZRX0NPTlNVTUVSX0lOREVYOworCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5FUlFwcm9kdWNlckluZGV4LmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9FUlFfUFJPRFVDRVJfSU5ERVg7CisgICAgICAKKyAgLy8gVEwgRnJhbWUgTWFuYWdlcgorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuRk1jb25maWcuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX0ZNX0NPTkZJRzsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLkZNY29udHJvbC5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fQ09OVFJPTDsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLkZNc3RhdHVzLmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9TVEFUVVM7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5GTUxpbmtTdGF0dXMxLmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9MSU5LX1NUQVQxOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuRk1MaW5rU3RhdHVzMi5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fTElOS19TVEFUMjsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLkZNQkJfQ3JlZGl0WmVyby5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fQkJfQ1JFRElUMDsKKyAgICAgIAorICAgICAgLy8gVEwgQ29udHJvbCBSZWdzCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5UWWNvbmZpZy5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fVEFDSF9DT05GSUc7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5UWWNvbnRyb2wuYWRkcmVzcyA9IAorICAgICAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlICsgVExfTUVNX1RBQ0hfQ09OVFJPTDsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlRZc3RhdHVzLmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9UQUNIX1NUQVRVUzsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLnJjdl9hbF9wYS5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fRk1fUkNWX0FMX1BBOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuZWRfdG92LmFkZHJlc3MgPSAKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9GTV9FRF9UT1Y7CisKKworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU5URU4uYWRkcmVzcyA9IAorCSAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElJTlRFTjsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklOVFBFTkQuYWRkcmVzcyA9IAorCSAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIElJTlRQRU5EOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU5UU1RBVC5hZGRyZXNzID0gCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBJSU5UU1RBVDsKKworICBERUJVR19QQ0kocHJpbnRrKCIgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy4gOlxuIikpOworICBERUJVR19QQ0kocHJpbnRrKCIgICAgSU9CYXNlTCA9ICV4XG4iLCAKKyAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlTCkpOworICBERUJVR19QQ0kocHJpbnRrKCIgICAgSU9CYXNlVSA9ICV4XG4iLCAKKyAgICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlVSkpOworICAKKyAgLyogcHJpbnRrKCIgaW9yZW1hcCdkIE1lbWJhc2U6ICVwXG4iLCBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlKTsgKi8KKyAgCisgIERFQlVHX1BDSShwcmludGsoIiAgICBTRlFjb25zdW1lckluZGV4LmFkZHJlc3MgPSAlcFxuIiwgCisgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlNGUWNvbnN1bWVySW5kZXguYWRkcmVzcykpOworICBERUJVR19QQ0kocHJpbnRrKCIgICAgRVJRcHJvZHVjZXJJbmRleC5hZGRyZXNzID0gJXBcbiIsIAorICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5FUlFwcm9kdWNlckluZGV4LmFkZHJlc3MpKTsKKyAgREVCVUdfUENJKHByaW50aygiICAgIFRZY29uZmlnLmFkZHJlc3MgPSAlcFxuIiwgCisgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlRZY29uZmlnLmFkZHJlc3MpKTsKKyAgREVCVUdfUENJKHByaW50aygiICAgIEZNY29uZmlnLmFkZHJlc3MgPSAlcFxuIiwgCisgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLkZNY29uZmlnLmFkZHJlc3MpKTsKKyAgREVCVUdfUENJKHByaW50aygiICAgIEZNY29udHJvbC5hZGRyZXNzID0gJXBcbiIsIAorICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5GTWNvbnRyb2wuYWRkcmVzcykpOworCisgIC8vIHNldCBkZWZhdWx0IG9wdGlvbnMgZm9yIEZDIGNvbnRyb2xsZXIgKGNoaXApCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk9wdGlvbnMuaW5pdGlhdG9yID0gMTsgIC8vIGRlZmF1bHQ6IFNDU0kgaW5pdGlhdG9yCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk9wdGlvbnMudGFyZ2V0ID0gMDsgICAgIC8vIGRlZmF1bHQ6IFNDU0kgdGFyZ2V0CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk9wdGlvbnMuZXh0TG9vcGJhY2sgPSAwOy8vIGRlZmF1bHQ6IG5vIGxvb3BiYWNrIEBHQklDCisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLk9wdGlvbnMuaW50TG9vcGJhY2sgPSAwOy8vIGRlZmF1bHQ6IG5vIGxvb3BiYWNrIGluc2lkZSBjaGlwCisKKyAgLy8gc2V0IGhpZ2hlc3QgYW5kIGxvd2VzdCBGQy1QSCB2ZXJzaW9uIHRoZSBhZGFwdGVyL2RyaXZlciBzdXBwb3J0cworICAvLyAoTk9UIHN0cmljdCBjb21wbGlhbmNlKQorICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5oaWdoZXN0X0ZDUEhfdmVyID0gRkNfUEgzOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5sb3dlc3RfRkNQSF92ZXIgPSBGQ19QSDQzOworCisgIC8vIHNldCBmdW5jdGlvbiBwb2ludHMgZm9yIHRoaXMgY29udHJvbGxlciAvIGFkYXB0ZXIKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVzZXRUYWNoeW9uID0gQ3BxVHNSZXNldFRhY2hMaXRlOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5GcmVlemVUYWNoeW9uID0gQ3BxVHNGcmVlemVUYWNobGl0ZTsKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuVW5GcmVlemVUYWNoeW9uID0gQ3BxVHNVbkZyZWV6ZVRhY2hsaXRlOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5DcmVhdGVUYWNoeW9uUXVlcyA9IENwcVRzQ3JlYXRlVGFjaExpdGVRdWVzOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5EZXN0cm95VGFjaHlvblF1ZXMgPSBDcHFUc0Rlc3Ryb3lUYWNoTGl0ZVF1ZXM7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLkluaXRpYWxpemVUYWNoeW9uID0gQ3BxVHNJbml0aWFsaXplVGFjaExpdGU7ICAKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuTGFzZXJDb250cm9sID0gQ3BxVHNMYXNlckNvbnRyb2w7ICAKKyAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUHJvY2Vzc0lNUUVudHJ5ID0gQ3BxVHNQcm9jZXNzSU1RRW50cnk7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLkluaXRpYWxpemVGcmFtZU1hbmFnZXIgPSBDcHFUc0luaXRpYWxpemVGcmFtZU1hbmFnZXI7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlYWRXcml0ZVdXTiA9IENwcVRzUmVhZFdyaXRlV1dOOworICBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWFkV3JpdGVOVlJBTSA9IENwcVRzUmVhZFdyaXRlTlZSQU07CisKKyAgICAgIGlmIChjcHFmY19hbGxvY19wcml2YXRlX2RhdGFfcG9vbChjcHFmY0hCQWRhdGEpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJjcHFmYzogdW5hYmxlIHRvIGFsbG9jYXRlIHBvb2wgZm9yIHBhc3N0aHJ1IGlvY3Rscy4gICIKKwkJCSJQYXNzdGhydSBpb2N0bHMgZGlzYWJsZWQuXG4iKTsKKyAgICAgIH0KK30KKworCisvKiAoYm9ycm93ZWQgZnJvbSBsaW51eC9kcml2ZXJzL3Njc2kvaG9zdHMuYykgKi8KK3N0YXRpYyB2b2lkIGxhdW5jaF9GQ3dvcmtlcl90aHJlYWQoc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIpCit7CisgIERFQ0xBUkVfTVVURVhfTE9DS0VEKHNlbSk7CisKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKworICBFTlRFUigibGF1bmNoX0ZDX3dvcmtlcl90aHJlYWQiKTsKKyAgICAgICAgICAgICAKKyAgY3BxZmNIQkFkYXRhLT5ub3RpZnlfd3QgPSAmc2VtOworCisgIC8qIG11c3QgdW5sb2NrIGJlZm9yZSBrZXJuZWxfdGhyZWFkKCksIGZvciBpdCBtYXkgY2F1c2UgYSByZXNjaGVkdWxlLiAqLworICBzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPmhvc3RfbG9jayk7CisgIGtlcm5lbF90aHJlYWQoKGludCAoKikodm9pZCAqKSljcHFmY1RTV29ya2VyVGhyZWFkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgSG9zdEFkYXB0ZXIsIDApOworICAvKgorICAgKiBOb3cgd2FpdCBmb3IgdGhlIGtlcm5lbCBlcnJvciB0aHJlYWQgdG8gaW5pdGlhbGl6ZSBpdHNlbGYKKworICAgKi8KKyAgZG93biAoJnNlbSk7CisgIHNwaW5fbG9ja19pcnEoSG9zdEFkYXB0ZXItPmhvc3RfbG9jayk7CisgIGNwcWZjSEJBZGF0YS0+bm90aWZ5X3d0ID0gTlVMTDsKKworICBMRUFWRSgibGF1bmNoX0ZDX3dvcmtlcl90aHJlYWQiKTsKKyAKK30KKworCisvKiAiRW50cnkiIHBvaW50IHRvIGRpc2NvdmVyIGlmIGFueSBzdXBwb3J0ZWQgUENJIAorICAgYnVzIGFkYXB0ZXIgY2FuIGJlIGZvdW5kCisqLworLyogV2UncmUgc3VwcG9ydGluZzoKKyAqIENvbXBhcSA2NC1iaXQsIDY2TUh6IEhCQSB3aXRoIFRhY2h5b24gVFMKKyAqIEFnaWxlbnQgWEwyIAorICogSFAgVGFjaHlvbgorICovCisjZGVmaW5lIEhCQV9UWVBFUyAzCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DT01QQVFfCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RBQ0hZT04JMHhhMGZjCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBTdXBwb3J0ZWRQQ0ljYXJkcyBjcHFmY19ib2FyZHNbXSBfX2luaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfVEFDSFlPTn0sCisJe1BDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfVEFDSExJVEV9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCBQQ0lfREVWSUNFX0lEX0hQX1RBQ0hZT059LAorfTsKKworCitpbnQgY3BxZmNUU19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpTY3NpSG9zdFRlbXBsYXRlKQoreworICBpbnQgTnVtYmVyT2ZBZGFwdGVycz0wOyAvLyBob3cgbWFueSBvZiBvdXIgUENJIGFkYXB0ZXJzIGFyZSBmb3VuZD8KKyAgc3RydWN0IHBjaV9kZXYgKlBjaURldiA9IE5VTEw7CisgIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyID0gTlVMTDsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IE5VTEw7IAorICBzdHJ1Y3QgdGltZXJfbGlzdCAqY3BxZmNUU3RpbWVyID0gTlVMTDsKKyAgaW50IGk7CisKKyAgRU5URVIoImNwcWZjVFNfZGV0ZWN0Iik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBMaW51eFZlcnNpb25Db2RlKDIsMywyNykKKyAgU2NzaUhvc3RUZW1wbGF0ZS0+cHJvY19kaXIgPSAmcHJvY19zY3NpX2NwcWZjVFM7CisjZWxzZQorICBTY3NpSG9zdFRlbXBsYXRlLT5wcm9jX25hbWUgPSAiY3BxZmNUUyI7CisjZW5kaWYKKworICBmb3IoIGk9MDsgaSA8IEhCQV9UWVBFUzsgaSsrKQorICB7CisgICAgLy8gbG9vayBmb3IgYWxsIEhCQXMgb2YgZWFjaCB0eXBlCisKKyAgICB3aGlsZSgoUGNpRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGNwcWZjX2JvYXJkc1tpXS52ZW5kb3JfaWQsCisJCQkJICAgIGNwcWZjX2JvYXJkc1tpXS5kZXZpY2VfaWQsIFBjaURldikpKQorICAgIHsKKworICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKFBjaURldikpIHsKKwlwcmludGsoS0VSTl9FUlIKKwkJImNwcWZjOiBjYW4ndCBlbmFibGUgUENJIGRldmljZSBhdCAlc1xuIiwgcGNpX25hbWUoUGNpRGV2KSk7CisJZ290byBlcnJfY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChwY2lfc2V0X2RtYV9tYXNrKFBjaURldiwgQ1BRRkNUU19ETUFfTUFTSykgIT0gMCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSJjcHFmYzogSEJBIGNhbm5vdCBzdXBwb3J0IHJlcXVpcmVkIERNQSBtYXNrLCBza2lwcGluZy5cbiIpOworCWdvdG8gZXJyX2Rpc2FibGVfZGV2OworICAgICAgfQorCisgICAgICAvLyBOT1RFOiAoa2VybmVsIDIuMi4xMi0zMikgbGltaXRzIGFsbG9jYXRpb24gdG8gMTI4ayBieXRlcy4uLgorICAgICAgLyogcHJpbnRrKCIgc2NzaV9yZWdpc3RlciBhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciBGQyBIQkFcbiIsCisJCSAgICAgIChVTE9ORylzaXplb2YoQ1BRRkNIQkEpKTsgKi8KKworICAgICAgSG9zdEFkYXB0ZXIgPSBzY3NpX3JlZ2lzdGVyKCBTY3NpSG9zdFRlbXBsYXRlLCBzaXplb2YoIENQUUZDSEJBICkgKTsKKyAgICAgIAorICAgICAgaWYoSG9zdEFkYXB0ZXIgPT0gTlVMTCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJImNwcWZjOiBjYW4ndCByZWdpc3RlciBTQ1NJIEhCQSwgc2tpcHBpbmcuXG4iKTsKKyAgICAgIAlnb3RvIGVycl9kaXNhYmxlX2RldjsKKyAgICAgIH0KKyAgICAgIERFQlVHX1BDSSggcHJpbnRrKCIgIEhCQSBmb3VuZCFcbiIpKTsKKyAgICAgIERFQlVHX1BDSSggcHJpbnRrKCIgIEhvc3RBZGFwdGVyLT5QY2lEZXYtPmlycSA9ICV1XG4iLCBQY2lEZXYtPmlycSkgKTsKKyAgICAgIERFQlVHX1BDSShwcmludGsoIiAgUGNpRGV2LT5iYXNlYWRkcmVzc1swXT0gJWx4XG4iLCAKKwkJCQlQY2lEZXYtPnJlc291cmNlWzBdLnN0YXJ0KSk7CisgICAgICBERUJVR19QQ0kocHJpbnRrKCIgIFBjaURldi0+YmFzZWFkZHJlc3NbMV09ICVseFxuIiwgCisJCQkJUGNpRGV2LT5yZXNvdXJjZVsxXS5zdGFydCkpOworICAgICAgREVCVUdfUENJKHByaW50aygiICBQY2lEZXYtPmJhc2VhZGRyZXNzWzJdPSAlbHhcbiIsIAorCQkJCVBjaURldi0+cmVzb3VyY2VbMl0uc3RhcnQpKTsKKyAgICAgIERFQlVHX1BDSShwcmludGsoIiAgUGNpRGV2LT5iYXNlYWRkcmVzc1szXT0gJWx4XG4iLCAKKwkJCQlQY2lEZXYtPnJlc291cmNlWzNdLnN0YXJ0KSk7CisKKyAgICAgIHNjc2lfc2V0X2RldmljZShIb3N0QWRhcHRlciwgJlBjaURldi0+ZGV2KTsKKyAgICAgIEhvc3RBZGFwdGVyLT5pcnEgPSBQY2lEZXYtPmlycTsgIC8vIGNvcHkgZm9yIFNjc2kgbGF5ZXJzCisgICAgICAKKyAgICAgIC8vIEhQIFRhY2hsaXRlIHVzZXMgdHdvICgyNTUtYnl0ZSkgcmFuZ2VzIG9mIFBvcnQgSS9PIChsb3dlciAmIHVwcGVyKSwKKyAgICAgIC8vIGZvciBhIHRvdGFsIEkvTyBwb3J0IGFkZHJlc3Mgc3BhY2Ugb2YgNTEyIGJ5dGVzLgorICAgICAgLy8gbWFzayBvdXQgdGhlIEkvTyBwb3J0IGFkZHJlc3MgKGxvd2VyKSAmIHJlY29yZAorICAgICAgSG9zdEFkYXB0ZXItPmlvX3BvcnQgPSAodW5zaWduZWQgaW50KQorCSAgICAgUGNpRGV2LT5yZXNvdXJjZVsxXS5zdGFydCAmIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKyAgICAgIEhvc3RBZGFwdGVyLT5uX2lvX3BvcnQgPSAweGZmOworICAgICAgCisgICAgICAvLyBpLmUuLCBleHBlY3QgMTI4IHRhcmdldHMgKGFyYml0cmFyeSBudW1iZXIpLCB3aGlsZSB0aGUKKyAgICAgIC8vICBSQS00MDAwIHN1cHBvcnRzIDMyIExVTnMKKyAgICAgIEhvc3RBZGFwdGVyLT5tYXhfaWQgPSAgMDsgICAvLyBpbmNyZW1lbnRlZCBhcyBkZXZpY2VzIGxvZyBpbiAgICAKKyAgICAgIEhvc3RBZGFwdGVyLT5tYXhfbHVuID0gQ1BRRkNUU19NQVhfTFVOOyAgICAgICAgIC8vIExVTnMgcGVyIEZDIGRldmljZQorICAgICAgSG9zdEFkYXB0ZXItPm1heF9jaGFubmVsID0gQ1BRRkNUU19NQVhfQ0hBTk5FTDsgLy8gbXVsdGlwbGUgYnVzc2VzPworICAgICAgCisgICAgICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gb3VyIEhCQSBzcGVjaWZpYyBkYXRhLi4uIChvbmUgZm9yCisgICAgICAvLyBlYWNoIEhCQSBvbiB0aGUgUENJIGJ1cyhzZXMpKS4KKyAgICAgIGNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgICAgIAorICAgICAgLy8gbWFrZSBjZXJ0YWluIG91ciBkYXRhIHN0cnVjdCBpcyBjbGVhcgorICAgICAgbWVtc2V0KCBjcHFmY0hCQWRhdGEsIDAsIHNpemVvZiggQ1BRRkNIQkEgKSApOworCisKKyAgICAgIC8vIGluaXRpYWxpemUgb3VyIEhCQSBpbmZvCisgICAgICBjcHFmY0hCQWRhdGEtPkhCQW51bSA9IE51bWJlck9mQWRhcHRlcnM7CisKKyAgICAgIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXIgPSBIb3N0QWRhcHRlcjsgLy8gYmFjayBwdHIKKyAgICAgIENwcWZjX2luaXRIQkFkYXRhKCBjcHFmY0hCQWRhdGEsIFBjaURldiApOyAvLyBmaWxsIE1PU1QgZmllbGRzCisgICAgIAorICAgICAgY3BxZmNIQkFkYXRhLT5IQkFudW0gPSBOdW1iZXJPZkFkYXB0ZXJzOworICAgICAgc3Bpbl9sb2NrX2luaXQoJmNwcWZjSEJBZGF0YS0+aGJhX3NwaW5sb2NrKTsKKworICAgICAgLy8gcmVxdWVzdCBuZWNlc3NhcnkgcmVzb3VyY2VzIGFuZCBjaGVjayBmb3IgY29uZmxpY3RzCisgICAgICBpZiggcmVxdWVzdF9pcnEoIEhvc3RBZGFwdGVyLT5pcnEsCisJCSAgICAgICBjcHFmY1RTX2ludHJfaGFuZGxlciwKKwkgICAgICAgICAgICAgICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKwkgICAgICAgICAgICAgICBERVZfTkFNRSwKKwkJICAgICAgIEhvc3RBZGFwdGVyKSApCisgICAgICB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiY3BxZmM6IElSUSAldSBhbHJlYWR5IHVzZWRcbiIsIEhvc3RBZGFwdGVyLT5pcnEpOworCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisgICAgICB9CisKKyAgICAgIC8vIFNpbmNlIHdlIGhhdmUgdHdvIDI1Ni1ieXRlIEkvTyBwb3J0IHJhbmdlcyAodXBwZXIKKyAgICAgIC8vIGFuZCBsb3dlciksIGNoZWNrIHRoZW0gYm90aAorICAgICAgaWYoICFyZXF1ZXN0X3JlZ2lvbiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZVUsCisgICAgICAJICAgICAgICAgICAgICAgICAgIDB4ZmYsIERFVl9OQU1FICkgKQorICAgICAgeworCXByaW50ayhLRVJOX1dBUk5JTkcgImNwcWZjOiBhZGRyZXNzIGluIHVzZTogJXhcbiIsCisJCQljcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlVSk7CisJZ290byBlcnJfZnJlZV9pcnE7CisgICAgICB9CQorICAgICAgCisgICAgICBpZiggIXJlcXVlc3RfcmVnaW9uKCBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlTCwKKyAgICAgIAkJCSAgIDB4ZmYsIERFVl9OQU1FICkgKQorICAgICAgeworICAJcHJpbnRrKEtFUk5fV0FSTklORyAiY3BxZmM6IGFkZHJlc3MgaW4gdXNlOiAleFxuIiwKKwkgICAgICAJCQljcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlTCk7CisJZ290byBlcnJfcmVsZWFzZV9yZWdpb25fVTsKKyAgICAgIH0JCisgICAgICAKKyAgICAgIC8vIE9LLCB3ZSBoYXZlIGdyYWJiZWQgZXZlcnl0aGluZyB3ZSBuZWVkIG5vdy4KKyAgICAgIERFQlVHX1BDSShwcmludGsoIiAgUmVzZXJ2ZWQgMjU1IEkvTyBhZGRyZXNzZXMgQCAleFxuIiwKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZUwgKSk7CisgICAgICBERUJVR19QQ0kocHJpbnRrKCIgIFJlc2VydmVkIDI1NSBJL08gYWRkcmVzc2VzIEAgJXhcbiIsCisgICAgICAgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VVICkpOworCisgICAgIAorIAorICAgICAgLy8gc3RhcnQgb3VyIGtlcm5lbCB3b3JrZXIgdGhyZWFkCisKKyAgICAgIHNwaW5fbG9ja19pcnEoSG9zdEFkYXB0ZXItPmhvc3RfbG9jayk7CisgICAgICBsYXVuY2hfRkN3b3JrZXJfdGhyZWFkKEhvc3RBZGFwdGVyKTsKKworCisgICAgICAvLyBzdGFydCBvdXIgVGltZXJUYXNrLi4uCisKKyAgICAgIGNwcWZjVFN0aW1lciA9ICZjcHFmY0hCQWRhdGEtPmNwcWZjVFN0aW1lcjsKKworICAgICAgaW5pdF90aW1lciggY3BxZmNUU3RpbWVyKTsgLy8gTGludXggY2xlYXJzIG5leHQvcHJldiB2YWx1ZXMKKyAgICAgIGNwcWZjVFN0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsgLy8gb25lIHNlY29uZAorICAgICAgY3BxZmNUU3RpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY3BxZmNIQkFkYXRhOyAvLyB0aGlzIGFkYXB0ZXIKKyAgICAgIGNwcWZjVFN0aW1lci0+ZnVuY3Rpb24gPSBjcHFmY1RTaGVhcnRiZWF0OyAvLyBoYW5kbGVzIHRpbWVvdXRzLCBob3VzZWtlZXBpbmcKKworICAgICAgYWRkX3RpbWVyKCBjcHFmY1RTdGltZXIpOyAgLy8gZ2l2ZSBpdCB0byBMaW51eAorCisKKyAgICAgIC8vIG5vdyBpbml0aWFsaXplIG91ciBoYXJkd2FyZS4uLgorICAgICAgaWYgKGNwcWZjSEJBZGF0YS0+ZmNDaGlwLkluaXRpYWxpemVUYWNoeW9uKCBjcHFmY0hCQWRhdGEsIDEsMSkpIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjcHFmYzogaW5pdGlhbGl6YXRpb24gb2YgSEJBIGhhcmR3YXJlIGZhaWxlZC5cbiIpOworCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uX0w7CisgICAgICB9CisKKyAgICAgIGNwcWZjSEJBZGF0YS0+ZmNTdGF0c1RpbWUgPSBqaWZmaWVzOyAgLy8gKGZvciBGQyBTdGF0aXN0aWNzIGRlbHRhKQorICAgICAgCisgICAgICAvLyBnaXZlIG91ciBIQkEgdGltZSB0byBpbml0aWFsaXplIGFuZCBsb2dpbiBjdXJyZW50IGRldmljZXMuLi4KKyAgICAgIHsKKwkvLyBUaGUgQnJvY2FkZSBzd2l0Y2ggKGUuZy4gMjQwMCwgMjAxMCwgZXRjLikgYXMgb2YgTWFyY2ggMjAwMCwKKwkvLyBoYXMgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gZm9yIEZMX1BvcnQgc3RhcnR1cDoKKwkvLyBUaW1lKHNlYykgQWN0aW9uCisJLy8gMDogICAgICAgIERldmljZSBQbHVnaW4gYW5kIExJUChGNyxGNykgdHJhbnNtaXNzaW9uCisJLy8gMS4wICAgICAgIExJUCBpbmNvbWluZworICAgICAgICAvLyAxLjAyNyAgICAgTElTQSBpbmNvbWluZywgbm8gQ0xTISAobGluayBub3QgdXApCisJLy8gMS4wMjggICAgIE5PUyBpbmNvbWluZyAoc3dpdGNoIHRlc3QgZm9yIE5fUG9ydCkKKyAgICAgICAgLy8gMS41NzcgICAgIEVEX1RPViBleHBpcmVkLCB0cmFuc21pdCBMSVBzIGFnYWluCQorCS8vIDMuMCAgICAgICBMSVAoRjgsRjcpIGluY29taW5nIChzd2l0Y2ggcGFzc2VzIFRhY2ggUHJpbS5TaWcpCisJLy8gMy4wMjggICAgIExJTFAgcmVjZWl2ZWQsIGxpbmsgdXAsIEZMT0dJIHN0YXJ0cworCS8vIHNsb3dlc3Qod29yc3QpIGNhc2UsIG1lYXN1cmVkIG9uIDFHYiBGaW5pc2FyIEdUIGFuYWx5emVyCisJCisJdW5zaWduZWQgbG9uZyBzdG9wX3RpbWU7CisKKwlzcGluX3VubG9ja19pcnEoSG9zdEFkYXB0ZXItPmhvc3RfbG9jayk7CisJc3RvcF90aW1lID0gamlmZmllcyArIDQqSFo7CisgICAgICAgIHdoaWxlICggdGltZV9iZWZvcmUoamlmZmllcywgc3RvcF90aW1lKSApIAorCSAgCXNjaGVkdWxlKCk7ICAvLyAob3VyIHdvcmtlciB0YXNrIG5lZWRzIHRvIHJ1bikKKworICAgICAgfQorICAgICAgCisgICAgICBzcGluX2xvY2tfaXJxKEhvc3RBZGFwdGVyLT5ob3N0X2xvY2spOworICAgICAgTnVtYmVyT2ZBZGFwdGVycysrOyAKKyAgICAgIHNwaW5fdW5sb2NrX2lycShIb3N0QWRhcHRlci0+aG9zdF9sb2NrKTsKKworICAgICAgY29udGludWU7CisKK2Vycl9yZWxlYXNlX3JlZ2lvbl9MOgorICAgICAgcmVsZWFzZV9yZWdpb24oIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VMLCAweGZmICk7CitlcnJfcmVsZWFzZV9yZWdpb25fVToKKyAgICAgIHJlbGVhc2VfcmVnaW9uKCBjcHFmY0hCQWRhdGEtPmZjQ2hpcC5SZWdpc3RlcnMuSU9CYXNlVSwgMHhmZiApOworZXJyX2ZyZWVfaXJxOgorICAgICAgZnJlZV9pcnEoIEhvc3RBZGFwdGVyLT5pcnEsIEhvc3RBZGFwdGVyKTsKK2Vycl91bnJlZ2lzdGVyOgorICAgICAgc2NzaV91bnJlZ2lzdGVyKCBIb3N0QWRhcHRlcik7CitlcnJfZGlzYWJsZV9kZXY6CisgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UoIFBjaURldiApOworZXJyX2NvbnRpbnVlOgorICAgICAgY29udGludWU7CisgICAgfSAvLyBlbmQgb2Ygd2hpbGUoKQorICB9CisKKyAgTEVBVkUoImNwcWZjVFNfZGV0ZWN0Iik7CisgCisgIHJldHVybiBOdW1iZXJPZkFkYXB0ZXJzOworfQorCisjaWZkZWYgU1VQUE9SVF9SRVNFVAorc3RhdGljIHZvaWQgbXlfaW9jdGxfZG9uZSAoU2NzaV9DbW5kICogU0NwbnQpCit7CisgICAgc3RydWN0IHJlcXVlc3QgKiByZXE7CisgICAgCisgICAgcmVxID0gU0NwbnQtPnJlcXVlc3Q7CisgICAgcmVxLT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7IC8qIEJ1c3ksIGJ1dCBpbmRpY2F0ZSByZXF1ZXN0IGRvbmUgKi8KKyAgCisgICAgaWYgKHJlcS0+Q1BRRkNfV0FJVElORyAhPSBOVUxMKQorCUNQUUZDX0NPTVBMRVRFKHJlcS0+Q1BRRkNfV0FJVElORyk7Cit9ICAgCisjZW5kaWYKKworc3RhdGljIGludCBjcHFmY19hbGxvY19wcml2YXRlX2RhdGFfcG9vbChDUFFGQ0hCQSAqaGJhKQoreworCWhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMgPSBOVUxMOworCWhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2wgPSBOVUxMOworCWhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMgPSAKKwkJa21hbGxvYygoKENQUUZDX01BWF9QQVNTVEhSVV9DTURTK0JJVFNfUEVSX0xPTkctMSkgLworCQkJCUJJVFNfUEVSX0xPTkcpKnNpemVvZih1bnNpZ25lZCBsb25nKSwgCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW1lbXNldChoYmEtPnByaXZhdGVfZGF0YV9iaXRzLCAwLAorCQkoKENQUUZDX01BWF9QQVNTVEhSVV9DTURTK0JJVFNfUEVSX0xPTkctMSkgLworCQkJCUJJVFNfUEVSX0xPTkcpKnNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaGJhLT5wcml2YXRlX2RhdGFfcG9vbCA9IGttYWxsb2Moc2l6ZW9mKGNwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdCkgKgorCQkJQ1BRRkNfTUFYX1BBU1NUSFJVX0NNRFMsIEdGUF9LRVJORUwpOworCWlmIChoYmEtPnByaXZhdGVfZGF0YV9wb29sID09IE5VTEwpIHsKKwkJa2ZyZWUoaGJhLT5wcml2YXRlX2RhdGFfYml0cyk7CisJCWhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMgPSBOVUxMOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcHFmY19mcmVlX3ByaXZhdGVfZGF0YV9wb29sKENQUUZDSEJBICpoYmEpCit7CisJa2ZyZWUoaGJhLT5wcml2YXRlX2RhdGFfYml0cyk7CisJa2ZyZWUoaGJhLT5wcml2YXRlX2RhdGFfcG9vbCk7Cit9CisKK2ludCBpc19wcml2YXRlX2RhdGFfb2ZfY3BxZmMoQ1BRRkNIQkEgKmhiYSwgdm9pZCAqcG9pbnRlcikKK3sKKwkvKiBJcyBwb2ludGVyIHdpdGhpbiBvdXIgcHJpdmF0ZSBkYXRhIHBvb2w/CisJICAgV2UgdXNlIFNjc2lfUmVxdWVzdC0+dXBwZXJfcHJpdmF0ZV9kYXRhIChub3JtYWxseQorCSAgIHJlc2VydmVkIGZvciB1cHBlciBsYXllciBkcml2ZXJzLCBlLmcuIHRoZSBzZyBkcml2ZXIpCisJICAgV2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBwb2ludGVyIGlzIG91cnMgYnkgbG9va2luZyBhdAorCSAgIGl0cyBhZGRyZXNzLiAgSXMgdGhpcyBvaz8gICBIbW0sIGl0IG9jY3VycyB0byBtZSB0aGF0CisJICAgYSB1c2VyIGFwcCBtaWdodCBkbyBzb21ldGhpbmcgYmFkIGJ5IHVzaW5nIHNnIHRvIHNlbmQKKwkgICBhIGNwcWZjIHBhc3N0aHJvdWdoIGlvY3RsIHdpdGggdXBwZXJfZGF0YV9wcml2YXRlCisJICAgZm9yZ2VkIHRvIGJlIHNvbWV3aGVyZSBpbiBvdXIgcG9vbC4uLiwgdGhvdWdoIHRoZXknZAorCSAgIG5vcm1hbGx5IGhhdmUgdG8gYmUgcm9vdCBhbHJlYWR5IHRvIGRvIHRoaXMuICAqLworCisJcmV0dXJuIChwb2ludGVyICE9IE5VTEwgJiYgCisJCXBvaW50ZXIgPj0gKHZvaWQgKikgaGJhLT5wcml2YXRlX2RhdGFfcG9vbCAmJiAKKwkJcG9pbnRlciA8ICh2b2lkICopIGhiYS0+cHJpdmF0ZV9kYXRhX3Bvb2wgKyAKKwkJCXNpemVvZigqaGJhLT5wcml2YXRlX2RhdGFfcG9vbCkgKiAKKwkJCQlDUFFGQ19NQVhfUEFTU1RIUlVfQ01EUyk7Cit9CisKK2NwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdCAqY3BxZmNfYWxsb2NfcHJpdmF0ZV9kYXRhKENQUUZDSEJBICpoYmEpCit7CisJaW50IGk7CisKKwlkbyB7CisJCWkgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMsIAorCQkJQ1BRRkNfTUFYX1BBU1NUSFJVX0NNRFMpOworCQlpZiAoaSA9PSBDUFFGQ19NQVhfUEFTU1RIUlVfQ01EUykKKwkJCXJldHVybiBOVUxMOworCX0gd2hpbGUgKCB0ZXN0X2FuZF9zZXRfYml0KGkgJiAoQklUU19QRVJfTE9ORyAtIDEpLCAKKwkJCWhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMrKGkvQklUU19QRVJfTE9ORykpICE9IDApOworCXJldHVybiAmaGJhLT5wcml2YXRlX2RhdGFfcG9vbFtpXTsKK30KKwordm9pZCBjcHFmY19mcmVlX3ByaXZhdGVfZGF0YShDUFFGQ0hCQSAqaGJhLCBjcHFmY19wYXNzdGhydV9wcml2YXRlX3QgKmRhdGEpCit7CisJaW50IGk7CisJaSA9IGRhdGEgLSBoYmEtPnByaXZhdGVfZGF0YV9wb29sOworCWNsZWFyX2JpdChpJihCSVRTX1BFUl9MT05HLTEpLCAKKwkJCWhiYS0+cHJpdmF0ZV9kYXRhX2JpdHMrKGkvQklUU19QRVJfTE9ORykpOworfQorCitpbnQgY3BxZmNUU19pb2N0bCggc3RydWN0IHNjc2lfZGV2aWNlICpTY3NpRGV2LCBpbnQgQ21uZCwgdm9pZCAqYXJnKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIgPSBTY3NpRGV2LT5ob3N0OworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQgPSBOVUxMOworICBzdHJ1Y3Qgc2NzaV9jbW5kICpEdW1DbW5kOworICBpbnQgaSwgajsKKyAgVkVORE9SX0lPQ1RMX1JFUSBpb2M7CisgIGNwcWZjX3Bhc3N0aHJ1X3QgKnZlbmRvcl9jbWQ7CisgIFNjc2lfRGV2aWNlICpTRHBudDsKKyAgU2NzaV9SZXF1ZXN0ICpTY3NpUGFzc1RocnVSZXE7CisgIGNwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdCAqcHJpdmF0ZWRhdGE7CisKKyAgRU5URVIoImNwcWZjVFNfaW9jdGwgIik7CisKKyAgICAvLyBwcmludGsoImlvY3RsIENNTkQgJWQiLCBDbW5kKTsKKyAgICBzd2l0Y2ggKENtbmQpIHsKKyAgICAgIC8vIFBhc3N0aHJvdWdoIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGJ5cGFzcyB0aGUgUkFJRAorICAgICAgLy8gb3Igb3RoZXIgY29udHJvbGxlciBhbmQgdGFsayBkaXJlY3RseSB0byB0aGUgZGV2aWNlcworICAgICAgLy8gKGUuZy4gcGh5c2ljYWwgZGlzayBkcml2ZSkKKyAgICAgIC8vIFBhc3N0aHJvdWdoIGNvbW1hbmRzLCB1bmZvcnR1bmF0ZWx5LCB0ZW5kIHRvIGJlIHZlbmRvcgorICAgICAgLy8gc3BlY2lmaWM7IHRoaXMgaXMgdGFpbG9yZWQgdG8gQ09NUEFRJ3MgUkFJRCAoUkE0eDAwKQorICAgICAgY2FzZSBDUFFGQ1RTX1NDU0lfUEFTU1RIUlU6CisgICAgICB7CisJdm9pZCAqYnVmID0gTlVMTDsgLy8gZm9yIGtlcm5lbCBzcGFjZSBidWZmZXIgZm9yIHVzZXIgZGF0YQorCisJLyogQ2hlY2sgdGhhdCBvdXIgcG9vbCBnb3QgYWxsb2NhdGVkIG9rLiAqLworCWlmIChjcHFmY0hCQWRhdGEtPnByaXZhdGVfZGF0YV9wb29sID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCQorCWlmKCAhYXJnKQorCSAgcmV0dXJuIC1FSU5WQUw7CisKKwkvLyBtdXN0IGJlIHN1cGVyIHVzZXIgdG8gc2VuZCBzdHVmZiBkaXJlY3RseSB0byB0aGUKKwkvLyBjb250cm9sbGVyIGFuZC9vciBwaHlzaWNhbCBkcml2ZXMuLi4KKwlpZiggIWNhcGFibGUoQ0FQX1NZU19SQVdJTykgKQorCSAgcmV0dXJuIC1FUEVSTTsKKworCS8vIGNvcHkgdGhlIGNhbGxlcidzIHN0cnVjdCB0byBvdXIgc3BhY2UuCisgICAgICAgIGlmKCBjb3B5X2Zyb21fdXNlciggJmlvYywgYXJnLCBzaXplb2YoIFZFTkRPUl9JT0NUTF9SRVEpKSkKKwkJcmV0dXJuKCAtRUZBVUxUKTsKKworCXZlbmRvcl9jbWQgPSBpb2MuYXJncDsgIC8vIGkuZS4sIENQUSBzcGVjaWZpYyBjb21tYW5kIHN0cnVjdAorCisJLy8gSWYgbmVjZXNzYXJ5LCBncmFiIGEga2VybmVsL0RNQSBidWZmZXIKKwlpZiggdmVuZG9yX2NtZC0+bGVuKQorCXsKKyAgCSAgYnVmID0ga21hbGxvYyggdmVuZG9yX2NtZC0+bGVuLCBHRlBfS0VSTkVMKTsKKwkgIGlmKCAhYnVmKQorCSAgICByZXR1cm4gLUVOT01FTTsKKwl9CisgICAgICAgIC8vIE5vdyBidWlsZCBhIFNjc2lfUmVxdWVzdCB0byBwYXNzIGRvd24uLi4KKyAgICAgICAgU2NzaVBhc3NUaHJ1UmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KFNjc2lEZXYsIEdGUF9LRVJORUwpOworCWlmIChTY3NpUGFzc1RocnVSZXEgPT0gTlVMTCkgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJU2NzaVBhc3NUaHJ1UmVxLT51cHBlcl9wcml2YXRlX2RhdGEgPSAKKwkJCWNwcWZjX2FsbG9jX3ByaXZhdGVfZGF0YShjcHFmY0hCQWRhdGEpOworCWlmIChTY3NpUGFzc1RocnVSZXEtPnVwcGVyX3ByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCWtmcmVlKGJ1Zik7CisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNjc2lQYXNzVGhydVJlcSk7IC8vICJkZS1hbGxvY2F0ZSIKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHZlbmRvcl9jbWQtPnJ3X2ZsYWcgPT0gVkVORE9SX1dSSVRFX09QQ09ERSkgeworCQlpZiAodmVuZG9yX2NtZC0+bGVuKSB7IC8vIE5lZWQgZGF0YSBmcm9tIHVzZXI/CisgICAgICAgIAkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdmVuZG9yX2NtZC0+YnVmcCwgCisJCQkJCQl2ZW5kb3JfY21kLT5sZW4pKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQljcHFmY19mcmVlX3ByaXZhdGVfZGF0YShjcHFmY0hCQWRhdGEsIAorCQkJCQlTY3NpUGFzc1RocnVSZXEtPnVwcGVyX3ByaXZhdGVfZGF0YSk7CisJCQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU2NzaVBhc3NUaHJ1UmVxKTsKKwkJCQlyZXR1cm4oIC1FRkFVTFQpOworCQkJfQorCQl9CisJCVNjc2lQYXNzVGhydVJlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfV1JJVEU7IAorCX0gZWxzZSBpZiAodmVuZG9yX2NtZC0+cndfZmxhZyA9PSBWRU5ET1JfUkVBRF9PUENPREUpIHsKKwkJU2NzaVBhc3NUaHJ1UmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9SRUFEOyAKKwl9IGVsc2UKKwkJLy8gbWF5YmUgdGhpcyBtZWFucyBhIGJ1ZyBpbiB0aGUgdXNlciBhcHAKKwkJU2NzaVBhc3NUaHJ1UmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9OT05FOworCSAgICAKKwlTY3NpUGFzc1RocnVSZXEtPnNyX2NtZF9sZW4gPSAwOyAvLyBzZXQgY29ycmVjdGx5IGJ5IHNjc2lfZG9fcmVxKCkKKwlTY3NpUGFzc1RocnVSZXEtPnNyX3NlbnNlX2J1ZmZlclswXSA9IDA7CisJU2NzaVBhc3NUaHJ1UmVxLT5zcl9zZW5zZV9idWZmZXJbMl0gPSAwOworCisgICAgICAgIC8vIFdlIGNvcHkgdGhlIHNjaGVtZSB1c2VkIGJ5IHNkLmM6c3BpbnVwX2Rpc2soKSB0byBzdWJtaXQgY29tbWFuZHMKKwkvLyB0byBvdXIgb3duIEhCQS4gIFdlIGRvIHRoaXMgaW4gb3JkZXIgdG8gc3RhbGwgdGhlCisJLy8gdGhyZWFkIGNhbGxpbmcgdGhlIElPQ1RMIHVudGlsIGl0IGNvbXBsZXRlcywgYW5kIHVzZQorCS8vIHRoZSBzYW1lICJfcXVlY29tbWFuZCIgZnVuY3Rpb24gZm9yIHN5bmNocm9uaXppbmcKKwkvLyBGQyBMaW5rIGV2ZW50cyB3aXRoIG91ciAid29ya2VyIHRocmVhZCIuCisKKwlwcml2YXRlZGF0YSA9IFNjc2lQYXNzVGhydVJlcS0+dXBwZXJfcHJpdmF0ZV9kYXRhOworCXByaXZhdGVkYXRhLT5idXMgPSB2ZW5kb3JfY21kLT5idXM7CisJcHJpdmF0ZWRhdGEtPnBkcml2ZSA9IHZlbmRvcl9jbWQtPnBkcml2ZTsKKwkKKyAgICAgICAgLy8gZXZlbnR1YWxseSBnZXRzIHVzIHRvIG91ciBvd24gX3F1ZWNvbW1hbmQgcm91dGluZQorCXNjc2lfd2FpdF9yZXEoU2NzaVBhc3NUaHJ1UmVxLCAKKwkJJnZlbmRvcl9jbWQtPmNkYlswXSwgYnVmLCB2ZW5kb3JfY21kLT5sZW4sIAorCQkxMCpIWiwgIC8vIHRpbWVvdXQKKwkJMSk7CS8vIHJldHJpZXMKKyAgICAgICAgcmVzdWx0ID0gU2NzaVBhc3NUaHJ1UmVxLT5zcl9yZXN1bHQ7CisKKyAgICAgICAgLy8gY29weSBhbnkgc2Vuc2UgZGF0YSBiYWNrIHRvIGNhbGxlcgorICAgICAgICBpZiggcmVzdWx0ICE9IDAgKQorCXsKKwkgIG1lbWNweSggdmVuZG9yX2NtZC0+c2Vuc2VfZGF0YSwgLy8gc2VlIHN0cnVjdCBkZWYgLSBzaXplPTQwCisJCSAgU2NzaVBhc3NUaHJ1UmVxLT5zcl9zZW5zZV9idWZmZXIsIAorCQkgIHNpemVvZihTY3NpUGFzc1RocnVSZXEtPnNyX3NlbnNlX2J1ZmZlcikgPAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZlbmRvcl9jbWQtPnNlbnNlX2RhdGEpICAgICAgICAgICA/CisgICAgICAgICAgICAgICAgICBzaXplb2YoU2NzaVBhc3NUaHJ1UmVxLT5zcl9zZW5zZV9idWZmZXIpIDoKKyAgICAgICAgICAgICAgICAgIHNpemVvZih2ZW5kb3JfY21kLT5zZW5zZV9kYXRhKQorICAgICAgICAgICAgICAgICk7IAorCX0KKyAgICAgICAgU0RwbnQgPSBTY3NpUGFzc1RocnVSZXEtPnNyX2RldmljZTsKKwkvKiB1cHBlcl9wcml2YXRlX2RhdGEgaXMgYWxyZWFkeSBmcmVlZCBpbiBjYWxsX3Njc2lfZG9uZSgpICovCisgICAgICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNjc2lQYXNzVGhydVJlcSk7IC8vICJkZS1hbGxvY2F0ZSIKKyAgICAgICAgU2NzaVBhc3NUaHJ1UmVxID0gTlVMTDsKKworCS8vIG5lZWQgdG8gcGFzcyBkYXRhIGJhY2sgdG8gdXNlciAoc3BhY2UpPworCWlmKCAodmVuZG9yX2NtZC0+cndfZmxhZyA9PSBWRU5ET1JfUkVBRF9PUENPREUpICYmCisJICAgICB2ZW5kb3JfY21kLT5sZW4gKQorICAgICAgICBpZiggIGNvcHlfdG9fdXNlciggdmVuZG9yX2NtZC0+YnVmcCwgYnVmLCB2ZW5kb3JfY21kLT5sZW4pKQorCQlyZXN1bHQgPSAtRUZBVUxUOworCisgICAgICAgIGlmKCBidWYpIAorCSAga2ZyZWUoIGJ1Zik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgY2FzZSBDUFFGQ1RTX0dFVFBDSUlORk86CisgICAgICB7CisJY3BxZmNfcGNpX2luZm9fc3RydWN0IHBjaWluZm87CisJCisJaWYoICFhcmcpCisJICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgCQorCQorICAgICAgICBwY2lpbmZvLmJ1cyA9IGNwcWZjSEJBZGF0YS0+UGNpRGV2LT5idXMtPm51bWJlcjsKKyAgICAgICAgcGNpaW5mby5kZXZfZm4gPSBjcHFmY0hCQWRhdGEtPlBjaURldi0+ZGV2Zm47ICAKKwlwY2lpbmZvLmJvYXJkX2lkID0gY3BxZmNIQkFkYXRhLT5QY2lEZXYtPmRldmljZSB8CisJCQkgIChjcHFmY0hCQWRhdGEtPlBjaURldi0+dmVuZG9yIDw8MTYpOyAKKwkgICAgICAKKyAgICAgICAgaWYoY29weV90b191c2VyKCBhcmcsICZwY2lpbmZvLCBzaXplb2YoY3BxZmNfcGNpX2luZm9fc3RydWN0KSkpCisJCXJldHVybiggLUVGQVVMVCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBjYXNlIENQUUZDVFNfR0VURFJJVlZFUjoKKyAgICAgIHsKKwlEcml2ZXJWZXJfdHlwZSBEcml2ZXJWZXIgPSAKKwkJQ1BRRkNUU19EUklWRVJfVkVSKCBWRVJfTUFKT1IsVkVSX01JTk9SLFZFUl9TVUJNSU5PUik7CisJCisJaWYoICFhcmcpCisJICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZihjb3B5X3RvX3VzZXIoIGFyZywgJkRyaXZlclZlciwgc2l6ZW9mKERyaXZlclZlcikpKQorCQlyZXR1cm4oIC1FRkFVTFQpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworCisKKyAgICAgIGNhc2UgQ1BRRkNfSU9DVExfRkNfVEFSR0VUX0FERFJFU1M6CisJLy8gY2FuIHdlIGZpbmQgYW4gRkMgZGV2aWNlIG1hcHBpbmcgdG8gdGhpcyBTQ1NJIHRhcmdldD8KKy8qIAlEdW1DbW5kLmNoYW5uZWwgPSBTY3NpRGV2LT5jaGFubmVsOyAqLwkJLy8gRm9yIHNlYXJjaGluZworLyogCUR1bUNtbmQudGFyZ2V0ICA9IFNjc2lEZXYtPmlkOyAqLworLyogCUR1bUNtbmQubHVuICAgICA9IFNjc2lEZXYtPmx1bjsgKi8KKworCUR1bUNtbmQgPSBzY3NpX2dldF9jb21tYW5kIChTY3NpRGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIUR1bUNtbmQpCisJCXJldHVybiAtRU5PTUVNOworCQorCXBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIGZjQ2hpcCwKKwkJRHVtQ21uZCwgLy8gc2VhcmNoIFNjc2kgTmV4dXMKKwkJMCwgICAgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgcG9ydCBpZAorCQlOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBGQyBXV04KKwkJTlVMTCk7ICAgIC8vIERPTidUIGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKwlzY3NpX3B1dF9jb21tYW5kIChEdW1DbW5kKTsKKwlpZiAocExvZ2dlZEluUG9ydCA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IC1FTlhJTzsKKwkJYnJlYWs7CisJfQorCXJlc3VsdCA9IGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgc2l6ZW9mKFNjc2lfRkNUYXJnQWRkcmVzcykpID8gMCA6IC1FRkFVTFQ7CisJaWYgKHJlc3VsdCkgYnJlYWs7CisgCisgICAgICBwdXRfdXNlcihwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkLAorCQkmKChTY3NpX0ZDVGFyZ0FkZHJlc3MgKikgYXJnKS0+aG9zdF9wb3J0X2lkKTsKKyAKKyAgICAgIGZvciggaT0zLGo9MDsgaT49MDsgaS0tKSAgIAkvLyBjb3B5IHRoZSBMT0dJTiBwb3J0J3MgV1dOCisgICAgICAgIHB1dF91c2VyKHBMb2dnZWRJblBvcnQtPnUudWNXV05baV0sIAorCQkmKChTY3NpX0ZDVGFyZ0FkZHJlc3MgKikgYXJnKS0+aG9zdF93d25baisrXSk7CisgICAgICBmb3IoIGk9NzsgaT4zOyBpLS0pCQkvLyBjb3B5IHRoZSBMT0dJTiBwb3J0J3MgV1dOCisgICAgICAgIHB1dF91c2VyKHBMb2dnZWRJblBvcnQtPnUudWNXV05baV0sIAorCQkmKChTY3NpX0ZDVGFyZ0FkZHJlc3MgKikgYXJnKS0+aG9zdF93d25baisrXSk7CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgQ1BRRkNfSU9DVExfRkNfVERSOgorICAgICAgICAgIAorICAgICAgICByZXN1bHQgPSBjcHFmY1RTX1RhcmdldERldmljZVJlc2V0KCBTY3NpRGV2LCAwKTsKKworICAgICAgICBicmVhazsKKworCisKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSAtRUlOVkFMOworICAgICAgYnJlYWs7CisgICAgfQorCisgIExFQVZFKCJjcHFmY1RTX2lvY3RsIik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogIlJlbGVhc2UiIHRoZSBIb3N0IEJ1cyBBZGFwdGVyLi4uCisgICBkaXNhYmxlIGludGVycnVwdHMsIHN0b3AgdGhlIEhCQSwgcmVsZWFzZSB0aGUgaW50ZXJydXB0LAorICAgYW5kIGZyZWUgYWxsIHJlc291cmNlcyAqLworCitpbnQgY3BxZmNUU19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyKQoreworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOyAKKworCisgIEVOVEVSKCJjcHFmY1RTX3JlbGVhc2UiKTsKKwkKKyAgREVCVUdfUENJKCBwcmludGsoIiBjcHFmY1RTOiBkZWxldGUgdGltZXIuLi5cbiIpKTsKKyAgZGVsX3RpbWVyKCAmY3BxZmNIQkFkYXRhLT5jcHFmY1RTdGltZXIpOyAgCisgICAgCisgIC8vIGRpc2FibGUgdGhlIGhhcmR3YXJlLi4uCisgIERFQlVHX1BDSSggcHJpbnRrKCIgZGlzYWJsZSBoYXJkd2FyZSwgZGVzdHJveSBxdWV1ZXMsIGZyZWUgbWVtXG4iKSk7CisgIGNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlc2V0VGFjaHlvbiggY3BxZmNIQkFkYXRhLCBDTEVBUl9GQ1BPUlRTKTsKKworICAvLyBraWxsIGtlcm5lbCB0aHJlYWQKKyAgaWYoIGNwcWZjSEJBZGF0YS0+d29ya2VyX3RocmVhZCApIC8vIChvbmx5IGlmIGV4aXN0cykKKyAgeworICAgIERFQ0xBUkVfTVVURVhfTE9DS0VEKHNlbSk7ICAvLyBzeW5jaHJvbml6ZSB0aHJlYWQga2lsbAorCisgICAgY3BxZmNIQkFkYXRhLT5ub3RpZnlfd3QgPSAmc2VtOworICAgIERFQlVHX1BDSSggcHJpbnRrKCIga2lsbGluZyBrZXJuZWwgdGhyZWFkXG4iKSk7CisgICAgc2VuZF9zaWcoIFNJR0tJTEwsIGNwcWZjSEJBZGF0YS0+d29ya2VyX3RocmVhZCwgMSk7CisgICAgZG93biggJnNlbSk7CisgICAgY3BxZmNIQkFkYXRhLT5ub3RpZnlfd3QgPSBOVUxMOworICAgIAorICB9CisKKyAgY3BxZmNfZnJlZV9wcml2YXRlX2RhdGFfcG9vbChjcHFmY0hCQWRhdGEpOworICAvLyBmcmVlIExpbnV4IHJlc291cmNlcworICBERUJVR19QQ0koIHByaW50aygiIGNwcWZjVFM6IGZyZWVpbmcgcmVzb3VyY2VzLi4uXG4iKSk7CisgIGZyZWVfaXJxKCBIb3N0QWRhcHRlci0+aXJxLCBIb3N0QWRhcHRlcik7CisgIHNjc2lfdW5yZWdpc3RlciggSG9zdEFkYXB0ZXIpOworICByZWxlYXNlX3JlZ2lvbiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZUwsIDB4ZmYpOworICByZWxlYXNlX3JlZ2lvbiggY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLklPQmFzZVUsIDB4ZmYpOworIC8qIHdlIGdldCAidmZyZWU6IGJhZCBhZGRyZXNzIiBleGVjdXRpbmcgdGhpcyAtIG5lZWQgdG8gaW52ZXN0aWdhdGUuLi4gCisgIGlmKCAodm9pZCopKCh1bnNpZ25lZCBsb25nKWNwcWZjSEJBZGF0YS0+ZmNDaGlwLlJlZ2lzdGVycy5NZW1CYXNlKSAhPQorICAgICAgY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSkKKyAgICB2ZnJlZSggY3BxZmNIQkFkYXRhLT5mY0NoaXAuUmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSk7CisqLworICBwY2lfZGlzYWJsZV9kZXZpY2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2KTsKKworICBMRUFWRSgiY3BxZmNUU19yZWxlYXNlIik7CisgIHJldHVybiAwOworfQorCisKK2NvbnN0IGNoYXIgKiBjcHFmY1RTX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZlszMDBdOworICBDUFFGQ0hCQSAqY3BxZmNIQkE7CisgIGludCBCdXNTcGVlZCwgQnVzV2lkdGg7CisgIAorICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gb3VyIFNjc2kgbGF5ZXIgSEJBIGJ1ZmZlciAgCisgIGNwcWZjSEJBID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworCisgIEJ1c1dpZHRoID0gKGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLlBDSU1DVFIgJjB4NCkgPiAwID8KKyAgICAgICAgICAgICAgIDY0IDogMzI7CisKKyAgaWYoIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLlRZY29uZmlnLnZhbHVlICYgMHg4MDAwMDAwMCkKKyAgICBCdXNTcGVlZCA9IDY2OworICBlbHNlCisgICAgQnVzU3BlZWQgPSAzMzsKKworICBzcHJpbnRmKGJ1ZiwgCisiJXM6IFdXTiAlMDhYJTA4WFxuIG9uIFBDSSBidXMgJWQgZGV2aWNlIDB4JTAyeCBpcnEgJWQgSU9iYXNlTCAweCV4LCBNRU1CQVNFIDB4JXhcblBDSSBidXMgd2lkdGggJWQgYml0cywgYnVzIHNwZWVkICVkIE1IelxuRkNQLVNDU0kgRHJpdmVyIHYlZC4lZC4lZCIsCisgICAgICBjcHFmY0hCQS0+ZmNDaGlwLk5hbWUsIAorICAgICAgY3BxZmNIQkEtPmZjQ2hpcC5SZWdpc3RlcnMud3duX2hpLAorICAgICAgY3BxZmNIQkEtPmZjQ2hpcC5SZWdpc3RlcnMud3duX2xvLAorICAgICAgY3BxZmNIQkEtPlBjaURldi0+YnVzLT5udW1iZXIsCisgICAgICBjcHFmY0hCQS0+UGNpRGV2LT5kZXZpY2UsICAKKyAgICAgIEhvc3RBZGFwdGVyLT5pcnEsCisgICAgICBjcHFmY0hCQS0+ZmNDaGlwLlJlZ2lzdGVycy5JT0Jhc2VMLAorICAgICAgY3BxZmNIQkEtPmZjQ2hpcC5SZWdpc3RlcnMuTWVtQmFzZSwKKyAgICAgIEJ1c1dpZHRoLAorICAgICAgQnVzU3BlZWQsCisgICAgICBWRVJfTUFKT1IsIFZFUl9NSU5PUiwgVkVSX1NVQk1JTk9SCispOworCisgIAorICBjcHFmY1RTRGVjb2RlR0JJQ3R5cGUoICZjcHFmY0hCQS0+ZmNDaGlwLCAmYnVmWyBzdHJsZW4oYnVmKV0pOworICBjcHFmY1RTR2V0TFBTTSggJmNwcWZjSEJBLT5mY0NoaXAsICZidWZbIHN0cmxlbihidWYpXSk7CisgIHJldHVybiBidWY7Cit9CisKKy8vCisvLyAvcHJvYy9zY3NpIHN1cHBvcnQuIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWxsb3cgdXMgdG8gZG8gJ25vcm1hbCcKKy8vIHNwcmludGYgbGlrZSBjYWxscyB0byByZXR1cm4gdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgcGllY2UgKGJ1ZmxlbmdodAorLy8gY2hhcnMsIHN0YXJ0aW5nIGF0IGJ1Zm9mZnNldCkgb2YgdGhlIGZpbGUuIEFsdGhvdWdoIHByb2NmcyBhbGxvd3MgZm9yCisvLyBhIDEgS2IgYnl0ZXMgb3ZlcmZsb3cgYWZ0ZXIgdGUgc3VwcGxpZWQgYnVmZmVyLCBJIGNvbnNpZGVyIGl0IGJhZCAKKy8vIHByb2dyYW1taW5nIHRvIHVzZSBpdCB0byBtYWtlIHByb2dyYW1taW5nIGEgbGl0dGxlIHNpbXBsZXIuIFRoaXMgcGllY2UKKy8vIG9mIGNvZGluZyBpcyBib3Jyb3dlZCBmcm9tIG5jcjUzYzh4eC5jIHdpdGggc29tZSBtb2RpZmljYXRpb25zIAorLy8KK3N0cnVjdCBpbmZvX3N0cgoreworICAgICAgICBjaGFyICpidWZmZXI7CQkJLy8gUG9pbnRlciB0byBvdXRwdXQgYnVmZmVyCisgICAgICAgIGludCBidWZsZW5ndGg7CQkJLy8gSXQncyBsZW5ndGgKKyAgICAgICAgaW50IGJ1Zm9mZnNldDsJCQkvLyBGaWxlIG9mZnNldCBjb3JyZXNwb25kaW5nIHdpdGggYnVmWzBdCisJaW50IGJ1ZmZpbGxlbjsJCQkvLyBDdXJyZW50IGZpbGxlZCBsZW5ndGggCisgICAgICAgIGludCBmaWxwb3M7CQkJLy8gQ3VycmVudCBmaWxlIG9mZnNldAorfTsKKworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBkYXRhbGVuKQoreworCisgIGlmIChpbmZvLT5maWxwb3MgPCBpbmZvLT5idWZvZmZzZXQpIHsJLy8gQ3VycmVudCBvZmZzZXQgYmVmb3JlIGJ1ZmZlciBvZmZzZXQKKyAgICBpZiAoaW5mby0+ZmlscG9zICsgZGF0YWxlbiA8PSBpbmZvLT5idWZvZmZzZXQpIHsKKyAgICAgIGluZm8tPmZpbHBvcyArPSBkYXRhbGVuOyAJCS8vIERpc2NhcmQgaWYgY29tcGxldGVseSBiZWZvcmUgYnVmZmVyCisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsJCQkJLy8gUGFydGlhbCBjb3B5LCBzZXQgdG8gYmVnaW4KKyAgICAgIGRhdGEgKz0gKGluZm8tPmJ1Zm9mZnNldCAtIGluZm8tPmZpbHBvcyk7CisgICAgICBkYXRhbGVuICAtPSAoaW5mby0+YnVmb2Zmc2V0IC0gaW5mby0+ZmlscG9zKTsKKyAgICAgIGluZm8tPmZpbHBvcyA9IGluZm8tPmJ1Zm9mZnNldDsKKyAgICB9CisgIH0KKworICBpbmZvLT5maWxwb3MgKz0gZGF0YWxlbjsJCS8vIFVwZGF0ZSBjdXJyZW50IG9mZnNldAorCisgIGlmIChpbmZvLT5idWZmaWxsZW4gPT0gaW5mby0+YnVmbGVuZ3RoKSAvLyBCdWZmZXIgZnVsbCwgZGlzY2FyZAorICAgIHJldHVybjsKKworICBpZiAoaW5mby0+YnVmbGVuZ3RoIC0gaW5mby0+YnVmZmlsbGVuIDwgZGF0YWxlbikgIC8vIE92ZXJmbG93cyBidWZmZXIgPworICAgIGRhdGFsZW4gPSBpbmZvLT5idWZsZW5ndGggLSBpbmZvLT5idWZmaWxsZW47CisKKyAgbWVtY3B5KGluZm8tPmJ1ZmZlciArIGluZm8tPmJ1ZmZpbGxlbiwgZGF0YSwgZGF0YWxlbik7CisgIGluZm8tPmJ1ZmZpbGxlbiArPSBkYXRhbGVuOworfQorCitzdGF0aWMgaW50IGNvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKQoreworICAgICAgICB2YV9saXN0IGFyZ3M7CisgICAgICAgIGNoYXIgYnVmWzQwMF07CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICAgICAgbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworICAgICAgICB2YV9lbmQoYXJncyk7CisKKyAgICAgICAgY29weV9tZW1faW5mbyhpbmZvLCBidWYsIGxlbik7CisgICAgICAgIHJldHVybiBsZW47Cit9CisKKworLy8gUm91dGluZSB0byBnZXQgZGF0YSBmb3IgL3Byb2MgUkFNIGZpbGVzeXN0ZW0KKy8vCitpbnQgY3BxZmNUU19wcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIAorCQkgICAgICAgaW50IGlub3V0KQoreworICBzdHJ1Y3Qgc2NzaV9jbW5kICpEdW1DbW5kOworICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNjc2lEZXY7CisgIGludCBDaGFuLCBUYXJnLCBpOworICBzdHJ1Y3QgaW5mb19zdHIgaW5mbzsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBOworICBQVEFDSFlPTiBmY0NoaXA7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQ7CisgIGNoYXIgYnVmWzgxXTsKKworICBpZiAoaW5vdXQpIHJldHVybiAtRUlOVkFMOworCisgIC8vIGdldCB0aGUgcG9pbnRlciB0byBvdXIgU2NzaSBsYXllciBIQkEgYnVmZmVyICAKKyAgY3BxZmNIQkEgPSAoQ1BRRkNIQkEgKilob3N0LT5ob3N0ZGF0YTsKKyAgZmNDaGlwID0gJmNwcWZjSEJBLT5mY0NoaXA7CisgIAorICAqc3RhcnQgCSAgPSBidWZmZXI7CisKKyAgaW5mby5idWZmZXIgICAgID0gYnVmZmVyOworICBpbmZvLmJ1Zmxlbmd0aCAgPSBsZW5ndGg7CisgIGluZm8uYnVmb2Zmc2V0ICA9IG9mZnNldDsKKyAgaW5mby5maWxwb3MgICAgID0gMDsKKyAgaW5mby5idWZmaWxsZW4gID0gMDsKKyAgY29weV9pbmZvKCZpbmZvLCAiRHJpdmVyIHZlcnNpb24gPSAlZC4lZC4lZCIsIFZFUl9NQUpPUiwgVkVSX01JTk9SLCBWRVJfU1VCTUlOT1IpOyAKKyAgY3BxZmNUU0RlY29kZUdCSUN0eXBlKCAmY3BxZmNIQkEtPmZjQ2hpcCwgJmJ1ZlswXSk7CisgIGNwcWZjVFNHZXRMUFNNKCAmY3BxZmNIQkEtPmZjQ2hpcCwgJmJ1Zlsgc3RybGVuKGJ1ZildKTsKKyAgY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsIGJ1Zik7IAorCisjZGVmaW5lIERJU1BMQVlfV1dOX0lORk8KKyNpZmRlZiBESVNQTEFZX1dXTl9JTkZPCisgIFNjc2lEZXYgPSBzY3NpX2dldF9ob3N0X2RldiAoaG9zdCk7CisgIGlmICghU2NzaURldikgCisgICAgcmV0dXJuIC1FTk9NRU07CisgIER1bUNtbmQgPSBzY3NpX2dldF9jb21tYW5kIChTY3NpRGV2LCBHRlBfS0VSTkVMKTsKKyAgaWYgKCFEdW1DbW5kKSB7CisgICAgc2NzaV9mcmVlX2hvc3RfZGV2IChTY3NpRGV2KTsKKyAgICByZXR1cm4gLUVOT01FTTsKKyAgfQorICBjb3B5X2luZm8oJmluZm8sICJXV04gZGF0YWJhc2U6IChcInBvcnRfaWQ6IDAwMDAwMFwiIG1lYW5zIGRpc2Nvbm5lY3RlZClcbiIpOworICBmb3IgKCBDaGFuPTA7IENoYW4gPD0gaG9zdC0+bWF4X2NoYW5uZWw7IENoYW4rKykgeworICAgIER1bUNtbmQtPmRldmljZS0+Y2hhbm5lbCA9IENoYW47CisgICAgZm9yIChUYXJnPTA7IFRhcmcgPD0gaG9zdC0+bWF4X2lkOyBUYXJnKyspIHsKKyAgICAgIER1bUNtbmQtPmRldmljZS0+aWQgPSBUYXJnOworICAgICAgaWYgKChwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCBmY0NoaXAsCisJICAgIAkJCUR1bUNtbmQsICAvLyBzZWFyY2ggU2NzaSBOZXh1cworICAgIAkJCQkwLCAgICAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpc3QgZm9yIEZDIHBvcnQgaWQKKyAgICAJCQkJTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaXN0IGZvciBGQyBXV04KKyAgICAJCQkJTlVMTCkpKXsgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisJY29weV9pbmZvKCZpbmZvLCAiSG9zdDogc2NzaSVkIENoYW5uZWw6ICUwMmQgVGFyZ2V0SWQ6ICUwMmQgLT4gV1dOOiAiLAorCQkJICAgaG9zdC0+aG9zdF9ubywgQ2hhbiwgVGFyZyk7CisgICAgICAgIGZvciggaT0zOyBpPj0wOyBpLS0pICAgICAgICAvLyBjb3B5IHRoZSBMT0dJTiBwb3J0J3MgV1dOCisgICAgICAgICAgY29weV9pbmZvKCZpbmZvLCAiJTAyWCIsIHBMb2dnZWRJblBvcnQtPnUudWNXV05baV0pOworICAgICAgICBmb3IoIGk9NzsgaT4zOyBpLS0pICAgICAgICAgICAgIC8vIGNvcHkgdGhlIExPR0lOIHBvcnQncyBXV04KKyAgICAgICAgICBjb3B5X2luZm8oJmluZm8sICIlMDJYIiwgcExvZ2dlZEluUG9ydC0+dS51Y1dXTltpXSk7CisJY29weV9pbmZvKCZpbmZvLCAiIHBvcnRfaWQ6ICUwNlhcbiIsIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQpOyAKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzY3NpX3B1dF9jb21tYW5kIChEdW1DbW5kKTsKKyAgc2NzaV9mcmVlX2hvc3RfZGV2IChTY3NpRGV2KTsKKyNlbmRpZgorCisKKworICAKKyAgCisvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgcHJvY19pbmZvIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoCisvLyBmb3IgZXZlcnl0aGluZyB3ZSB3b3VsZCBsaWtlLi4uCisvLyBGb3IgRkMgc3RhdHMsIGNvbXBpbGUgdGhpcyBhbmQgdHVybiBvZmYgV1dOIHN0dWZmIGFib3ZlICAKKy8vI2RlZmluZSBESVNQTEFZX0ZDX1NUQVRTCisjaWZkZWYgRElTUExBWV9GQ19TVEFUUworLy8gZ2V0IHRoZSBGaWJyZSBDaGFubmVsIHN0YXRpc3RpY3MKKyAgeworICAgIGludCBEZWx0YVNlY3MgPSAoamlmZmllcyAtIGNwcWZjSEJBLT5mY1N0YXRzVGltZSkgLyBIWjsKKyAgICBpbnQgZGF5cyxob3VycyxtaW51dGVzLHNlY3M7CisgICAgCisgICAgZGF5cyA9IERlbHRhU2VjcyAvICgzNjAwKjI0KTsgLy8gZGF5cworICAgIGhvdXJzID0gKERlbHRhU2VjcyUgKDM2MDAqMjQpKSAvIDM2MDA7IC8vIGhvdXJzCisgICAgbWludXRlcyA9IChEZWx0YVNlY3MlMzYwMCAvNjApOyAvLyBtaW51dGVzCisgICAgc2VjcyA9ICBEZWx0YVNlY3MlNjA7ICAvLyBzZWNzCitjb3B5X2luZm8oICZpbmZvLCAiRmlicmUgQ2hhbm5lbCBTdGF0cyAodGltZSBkZDpoaDptbTpzcyAlMDJ1OiUwMnU6JTAydTolMDJ1XG4iLAorICAgICAgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY3MpOworICB9CisgICAgCisgIGNwcWZjSEJBLT5mY1N0YXRzVGltZSA9IGppZmZpZXM7ICAvLyAoZm9yIG5leHQgZGVsdGEpCisKKyAgY29weV9pbmZvKCAmaW5mbywgIiAgTGlua1VwICAgICAgICAgICAlOXUgICAgIExpbmtEb3duICAgICAgJXVcbiIsCisgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5saW5rVXAsIGZjQ2hpcC0+ZmNTdGF0cy5saW5rRG93bik7CisgICAgICAgIAorICBjb3B5X2luZm8oICZpbmZvLCAiICBMb3NzIG9mIFNpZ25hbCAgICU5dSAgICAgTG9zcyBvZiBTeW5jICAldVxuIiwKKyAgICBmY0NoaXAtPmZjU3RhdHMuTG9zc29mU2lnbmFsLCBmY0NoaXAtPmZjU3RhdHMuTG9zc29mU3luYyk7CisJCSAgCisgIGNvcHlfaW5mbyggJmluZm8sICIgIERpc2NhcmRlZCBGcmFtZXMgJTl1ICAgICBCYWQgQ1JDIEZyYW1lICV1XG4iLAorICAgIGZjQ2hpcC0+ZmNTdGF0cy5EaXNfRnJtLCBmY0NoaXAtPmZjU3RhdHMuQmFkX0NSQyk7CisKKyAgY29weV9pbmZvKCAmaW5mbywgIiAgVEFDSCBMaW5rRmFpbFRYICAlOXUgICAgIFRBQ0ggTGlua0ZhaWxSWCAgICAgJXVcbiIsCisgICAgZmNDaGlwLT5mY1N0YXRzLmxpbmtGYWlsVFgsIGZjQ2hpcC0+ZmNTdGF0cy5saW5rRmFpbFJYKTsKKyAgCisgIGNvcHlfaW5mbyggJmluZm8sICIgIFRBQ0ggUnhFT0ZhICAgICAgJTl1ICAgICBUQUNIIEVsYXN0aWMgU3RvcmUgICV1XG4iLAorICAgIGZjQ2hpcC0+ZmNTdGF0cy5SeF9FT0ZhLCBmY0NoaXAtPmZjU3RhdHMuZV9zdG9yZXMpOworCisgIGNvcHlfaW5mbyggJmluZm8sICIgIEJ1ZmZlckNyZWRpdFdhaXQgJTl1dXMgICBUQUNIIEZNIEluaXRzICV1XG4iLAorICAgIGZjQ2hpcC0+ZmNTdGF0cy5CQjBfVGltZXIqMTAsIGZjQ2hpcC0+ZmNTdGF0cy5GTWluaXRzICk7CisJCisgIGNvcHlfaW5mbyggJmluZm8sICIgIEZDLTIgVGltZW91dHMgICAgJTl1ICAgICBGQy0yIExvZ291dHMgICV1XG4iLAorICAgIGZjQ2hpcC0+ZmNTdGF0cy50aW1lb3V0cywgZmNDaGlwLT5mY1N0YXRzLmxvZ291dHMpOyAKKyAgICAgICAgCisgIGNvcHlfaW5mbyggJmluZm8sICIgIEZDLTIgQWJvcnRzICAgICAgJTl1ICAgICBGQy00IEFib3J0cyAgICV1XG4iLAorICAgIGZjQ2hpcC0+ZmNTdGF0cy5GQzJhYm9ydGVkLCBmY0NoaXAtPmZjU3RhdHMuRkM0YWJvcnRlZCk7CisgICAKKyAgLy8gY2xlYXIgdGhlIGNvdW50ZXJzCisgIGNwcWZjVFNDbGVhckxpbmtTdGF0dXNDb3VudGVycyggZmNDaGlwKTsKKyNlbmRpZgorCQorICByZXR1cm4gaW5mby5idWZmaWxsZW47Cit9CisKKworI2lmIERFQlVHX0NNTkQKKworVUNIQVIgKlNjc2lUb0FzY2lpKCBVQ0hBUiBTY3NpQ29tbWFuZCkKK3sKKworLyorKworCitSb3V0aW5lIERlc2NyaXB0aW9uOgorCisgICBDb252ZXJ0cyBhIFNDU0kgY29tbWFuZCB0byBhIHRleHQgc3RyaW5nIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisKKworQXJndW1lbnRzOgorCisgICBTY3NpQ29tbWFuZCAtLSBoZXggdmFsdWUgU0NTSSBDb21tYW5kCisKKworUmV0dXJuIFZhbHVlOgorCisgICBBbiBBU0NJSSwgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBpZiBmb3VuZCwgZWxzZSByZXR1cm5zIE5VTEwuCisKK09yaWdpbmFsIGNvZGUgZnJvbSBNLiBNY0dvd2VuLCBDb21wYXEKKy0tKi8KKworCisgICBzd2l0Y2ggKFNjc2lDb21tYW5kKQorICAgeworICAgICAgY2FzZSAweDAwOgorICAgICAgICAgcmV0dXJuKCAiVGVzdCBVbml0IFJlYWR5IiApOworCisgICAgICBjYXNlIDB4MDE6CisgICAgICAgICByZXR1cm4oICJSZXplcm8gVW5pdCBvciBSZXdpbmQiICk7CisKKyAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgIHJldHVybiggIlJlcXVlc3QgQmxvY2sgQWRkcmVzcyIgKTsKKworICAgICAgY2FzZSAweDAzOgorICAgICAgICAgcmV0dXJuKCAiUmVxdWVzZSBTZW5zZSIgKTsKKworICAgICAgY2FzZSAweDA0OgorICAgICAgICAgcmV0dXJuKCAiRm9ybWF0IFVuaXQiICk7CisKKyAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgIHJldHVybiggIlJlYWQgQmxvY2sgTGltaXRzIiApOworCisgICAgICBjYXNlIDB4MDc6CisgICAgICAgICByZXR1cm4oICJSZWFzc2lnbiBCbG9ja3MiICk7CisKKyAgICAgIGNhc2UgMHgwODoKKyAgICAgICAgIHJldHVybiggIlJlYWQgKDYpIiApOworCisgICAgICBjYXNlIDB4MGE6CisgICAgICAgICByZXR1cm4oICJXcml0ZSAoNikiICk7CisKKyAgICAgIGNhc2UgMHgwYjoKKyAgICAgICAgIHJldHVybiggIlNlZWsgKDYpIiApOworCisgICAgICBjYXNlIDB4MTI6CisgICAgICAgICByZXR1cm4oICJJbnF1aXJ5IiApOworCisgICAgICBjYXNlIDB4MTU6CisgICAgICAgICByZXR1cm4oICJNb2RlIFNlbGVjdCAoNikiICk7CisKKyAgICAgIGNhc2UgMHgxNjoKKyAgICAgICAgIHJldHVybiggIlJlc2VydmUiICk7CisKKyAgICAgIGNhc2UgMHgxNzoKKyAgICAgICAgIHJldHVybiggIlJlbGVhc2UiICk7CisKKyAgICAgIGNhc2UgMHgxYToKKyAgICAgICAgIHJldHVybiggIk1vZGVTZW4oNikiICk7CisKKyAgICAgIGNhc2UgMHgxYjoKKyAgICAgICAgIHJldHVybiggIlN0YXJ0L1N0b3AgVW5pdCIgKTsKKworICAgICAgY2FzZSAweDFjOgorICAgICAgICAgcmV0dXJuKCAiUmVjZWl2ZSBEaWFnbm9zdGljIFJlc3VsdHMiICk7CisKKyAgICAgIGNhc2UgMHgxZDoKKyAgICAgICAgIHJldHVybiggIlNlbmQgRGlhZ25vc3RpYyIgKTsKKworICAgICAgY2FzZSAweDI1OgorICAgICAgICAgcmV0dXJuKCAiUmVhZCBDYXBhY2l0eSIgKTsKKworICAgICAgY2FzZSAweDI4OgorICAgICAgICAgcmV0dXJuKCAiUmVhZCAoMTApIiApOworCisgICAgICBjYXNlIDB4MmE6CisgICAgICAgICByZXR1cm4oICJXcml0ZSAoMTApIiApOworCisgICAgICBjYXNlIDB4MmI6CisgICAgICAgICByZXR1cm4oICJTZWVrICgxMCkiICk7CisKKyAgICAgIGNhc2UgMHgyZToKKyAgICAgICAgIHJldHVybiggIldyaXRlIGFuZCBWZXJpZnkiICk7CisKKyAgICAgIGNhc2UgMHgyZjoKKyAgICAgICAgIHJldHVybiggIlZlcmlmeSIgKTsKKworICAgICAgY2FzZSAweDM0OgorICAgICAgICAgcmV0dXJuKCAiUHJlLUZldGNoIiApOworCisgICAgICBjYXNlIDB4MzU6CisgICAgICAgICByZXR1cm4oICJTeW5jaHJvbml6ZSBDYWNoZSIgKTsKKworICAgICAgY2FzZSAweDM3OgorICAgICAgICAgcmV0dXJuKCAiUmVhZCBEZWZlY3QgRGF0YSAoMTApIiApOworCisgICAgICBjYXNlIDB4M2I6CisgICAgICAgICByZXR1cm4oICJXcml0ZSBCdWZmZXIiICk7CisKKyAgICAgIGNhc2UgMHgzYzoKKyAgICAgICAgIHJldHVybiggIlJlYWQgQnVmZmVyIiApOworCisgICAgICBjYXNlIDB4M2U6CisgICAgICAgICByZXR1cm4oICJSZWFkIExvbmciICk7CisKKyAgICAgIGNhc2UgMHgzZjoKKyAgICAgICAgIHJldHVybiggIldyaXRlIExvbmciICk7CisKKyAgICAgIGNhc2UgMHg0MToKKyAgICAgICAgIHJldHVybiggIldyaXRlIFNhbWUiICk7CisKKyAgICAgIGNhc2UgMHg0YzoKKyAgICAgICAgIHJldHVybiggIkxvZyBTZWxlY3QiICk7CisKKyAgICAgIGNhc2UgMHg0ZDoKKyAgICAgICAgIHJldHVybiggIkxvZyBTZW5zZSIgKTsKKworICAgICAgY2FzZSAweDU2OgorICAgICAgICAgcmV0dXJuKCAiUmVzZXJ2ZSAoMTApIiApOworCisgICAgICBjYXNlIDB4NTc6CisgICAgICAgICByZXR1cm4oICJSZWxlYXNlICgxMCkiICk7CisKKyAgICAgIGNhc2UgMHhhMDoKKyAgICAgICAgIHJldHVybiggIlJlcG9ydEx1bnMiICk7CisKKyAgICAgIGNhc2UgMHhiNzoKKyAgICAgICAgIHJldHVybiggIlJlYWQgRGVmZWN0IERhdGEgKDEyKSIgKTsKKworICAgICAgY2FzZSAweGNhOgorICAgICAgICAgcmV0dXJuKCAiUGVyaXBoZXJhbCBEZXZpY2UgQWRkcmVzc2luZyBTQ1NJIFBhc3N0aHJvdWdoIiApOworCisgICAgICBjYXNlIDB4Y2I6CisgICAgICAgICByZXR1cm4oICJDb21wYXEgQXJyYXkgRmlybXdhcmUgUGFzc3Rocm91Z2giICk7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4oIE5VTEwgKTsKKyAgIH0KKworfSAvLyBlbmQgU2NzaVRvQXNjaWkoKQorCit2b2lkIGNwcWZjVFNfcHJpbnRfc2NzaV9jbWQoU2NzaV9DbW5kICogY21kKQoreworCitwcmludGsoImNwcWZjVFM6ICglcykgY2hubCAweCUwMngsIHRyZ3QgPSAweCUwMngsIGx1biA9IDB4JTAyeCwgY21kX2xlbiA9IDB4JTAyeFxuIiwgCisgICAgU2NzaVRvQXNjaWkoIGNtZC0+Y21uZFswXSksIGNtZC0+Y2hhbm5lbCwgY21kLT50YXJnZXQsIGNtZC0+bHVuLCBjbWQtPmNtZF9sZW4pOworCitpZiggY21kLT5jbW5kWzBdID09IDApICAgLy8gVGVzdCBVbml0IFJlYWR5PworeworICBpbnQgaTsKKworICBwcmludGsoIkNtbmQtPnJlcXVlc3RfYnVmZmxlbiA9IDB4JVgsIC0+dXNlX3NnID0gJWQsIC0+YnVmZmxlbiA9ICVkXG4iLAorICAgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBjbWQtPnVzZV9zZywgY21kLT5idWZmbGVuKTsKKyAgcHJpbnRrKCJDbW5kLT5yZXF1ZXN0X2J1ZmZlciA9ICVwLCAtPnNnbGlzdF9sZW4gPSAlZCwgLT5idWZmZXIgPSAlcFxuIiwKKyAgICBjbWQtPnJlcXVlc3RfYnVmZmVyLCBjbWQtPnNnbGlzdF9sZW4sIGNtZC0+YnVmZmVyKTsKKyAgZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgaSsrKQorICAgIHByaW50aygiMHglMDJ4ICIsIGNtZC0+Y21uZFtpXSk7CisgIHByaW50aygiXG4iKTsKK30KKworfQorCisjZW5kaWYJCQkJLyogREVCVUdfQ01ORCAqLworCisKKworCitzdGF0aWMgdm9pZCBRdWVDbW5kT25Cb2FyZExvY2soIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIFNjc2lfQ21uZCAqQ21uZCkKK3sKKyAgaW50IGk7CisKKyAgZm9yKCBpPTA7IGk8IENQUUZDVFNfUkVRX1FVRVVFX0xFTjsgaSsrKQorICB7ICAgIC8vIGZpbmQgc3BhcmUgc2xvdAorICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJvYXJkTG9ja0NtbmRbaV0gPT0gTlVMTCApCisgICAgeworICAgICAgY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2tDbW5kW2ldID0gQ21uZDsKKy8vICAgICAgcHJpbnRrKCIgQm9hcmRMb2NrQ21uZFslZF0gJXAgUXVldWVkLCBjaG5sL3RhcmdldC9sdW4gJWQvJWQvJWRcbiIsCisvLyAgICAgICAgaSxDbW5kLCBDbW5kLT5jaGFubmVsLCBDbW5kLT50YXJnZXQsIENtbmQtPmx1bik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoIGkgPj0gQ1BRRkNUU19SRVFfUVVFVUVfTEVOKQorICB7CisgICAgcHJpbnRrKCIgY3BxZmNUUyBXQVJOSU5HOiBMb3N0IENtbmQgJXAgb24gQm9hcmRMb2NrIFEgZnVsbCEiLCBDbW5kKTsKKyAgfQorCit9CisKKworc3RhdGljIHZvaWQgUXVlTGlua0Rvd25DbW5kKCBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLCBTY3NpX0NtbmQgKkNtbmQpCit7CisgIGludCBpbmR4OworCisgIC8vIFJlbWVtYmVyIHRoZSBjb21tYW5kIHB0ciBzbyB3ZSBjYW4gcmV0dXJuOyB3ZSdsbCBjb21wbGV0ZSB3aGVuCisgIC8vIHRoZSBkZXZpY2UgY29tZXMgYmFjaywgY2F1c2luZyBpbW1lZGlhdGUgcmV0cnkKKyAgZm9yKCBpbmR4PTA7IGluZHggPCBDUFFGQ1RTX1JFUV9RVUVVRV9MRU47IGluZHgrKykvLywgU0NwdHIrKykKKyAgeworICAgIGlmKCBjcHFmY0hCQWRhdGEtPkxpbmtEbkNtbmRbaW5keF0gPT0gTlVMTCApIC8vIGF2YWlsYWJsZT8KKyAgICB7CisjaWZkZWYgRFVNTVlDTU5EX0RCRworICAgICAgcHJpbnRrKCIgQGFkZCBDbW5kICVwIHRvIExua0RuQ21uZFslZF1AICIsIENtbmQsaW5keCk7CisjZW5kaWYKKyAgICAgIGNwcWZjSEJBZGF0YS0+TGlua0RuQ21uZFtpbmR4XSA9IENtbmQ7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiggaW5keCA+PSBDUFFGQ1RTX1JFUV9RVUVVRV9MRU4gKSAvLyBubyBzcGFjZSBmb3IgQ21uZD8/CisgIHsKKyAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIF9hYm9ydCBjYWxsIGxhdGVyICh3aXRoIHBvc3NpYmxlIHRyb3VibGUpCisgICAgcHJpbnRrKCJubyBidWZmZXIgZm9yIExpbmtEbkNtbmQhISAlcFxuIiwgQ21uZCk7CisgIH0KK30KKworCisKKworCisvLyBUaGUgZmlsZSA8c2NzaS9zY3NpX2hvc3QuaD4gc2F5cyBub3QgdG8gY2FsbCBzY3NpX2RvbmUgZnJvbQorLy8gaW5zaWRlIF9xdWV1ZWNvbW1hbmQsIHNvIHdlJ2xsIGRvIGl0IGZyb20gdGhlIGhlYXJ0YmVhdCB0aW1lcgorLy8gKGNsYXJpZmljYXRpb246IFR1cm5zIG91dCBpdCdzIG9rIHRvIGNhbGwgc2NzaV9kb25lIGZyb20gcXVldWVjb21tYW5kIAorLy8gZm9yIGNhc2VzIHRoYXQgZG9uJ3QgZ28gdG8gdGhlIGhhcmR3YXJlIGxpa2Ugc2NzaSBjbWRzIGRlc3RpbmVkCisvLyBmb3IgTFVOcyB3ZSBrbm93IGRvbid0IGV4aXN0LCBzbyB0aGlzIGNvZGUgbWlnaHQgYmUgc2ltcGxpZmllZC4uLikKKworc3RhdGljIHZvaWQgUXVlQmFkVGFyZ2V0Q21uZCggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgU2NzaV9DbW5kICpDbW5kKQoreworICBpbnQgaTsKKyAgICAvLyAgICBwcmludGsoIiBjYW4ndCBmaW5kIHRhcmdldCAlZFxuIiwgQ21uZC0+dGFyZ2V0KTsKKworICBmb3IoIGk9MDsgaTwgQ1BRRkNUU19NQVhfVEFSR0VUX0lEOyBpKyspCisgIHsgICAgLy8gZmluZCBzcGFyZSBzbG90CisgICAgaWYoIGNwcWZjSEJBZGF0YS0+QmFkVGFyZ2V0Q21uZFtpXSA9PSBOVUxMICkKKyAgICB7CisgICAgICBjcHFmY0hCQWRhdGEtPkJhZFRhcmdldENtbmRbaV0gPSBDbW5kOworLy8gICAgICBwcmludGsoIiBCYWRUYXJnZXRDbW5kWyVkXSAlcCBRdWV1ZWQsIGNobmwvdGFyZ2V0L2x1biAlZC8lZC8lZFxuIiwKKy8vICAgICAgICAgIGksQ21uZCwgQ21uZC0+Y2hhbm5lbCwgQ21uZC0+dGFyZ2V0LCBDbW5kLT5sdW4pOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworLy8gVGhpcyBpcyB0aGUgIm1haW4iIGVudHJ5IHBvaW50IGZvciBMaW51eCBTY3NpIGNvbW1hbmRzIC0tCisvLyBpdCBhbGwgc3RhcnRzIGhlcmUuCisKK2ludCBjcHFmY1RTX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKkNtbmQsIHZvaWQgKCogZG9uZSkoU2NzaV9DbW5kICopKQoreworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciA9IENtbmQtPmRldmljZS0+aG9zdDsKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBUYWNoRkNIRFJfR0NNTkQgZmNoczsgIC8vIG9ubHkgdXNlIGZvciBGQyBkZXN0aW5hdGlvbiBpZCBmaWVsZCAgCisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQ7CisgIFVMT05HIHVsU3RhdHVzLCBTRVNUdHlwZTsKKyAgTE9ORyBFeGNoYW5nZUlEOworCisKKworCisgIEVOVEVSKCJjcHFmY1RTX3F1ZXVlY29tbWFuZCIpOworICAgICAgCisgIFBDSV9UUkFDRU8oIChVTE9ORylDbW5kLCAweDk4KQorICAgICAgCisgIAorICBDbW5kLT5zY3NpX2RvbmUgPSBkb25lOworI2lmZGVmIERFQlVHX0NNTkQgIAorICBjcHFmY1RTX3ByaW50X3Njc2lfY21kKCBDbW5kKTsKKyNlbmRpZgorCisgIC8vIHByZXZlbnQgYm9hcmQgY29udGVudGlvbiB3aXRoIGtlcm5lbCB0aHJlYWQuLi4gIAorICAKKyAgIGlmKCBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jayApCisgIHsKKy8vICAgIHByaW50aygiIEBCcmRMY2sgSGxkQCAiKTsKKyAgICBRdWVDbW5kT25Cb2FyZExvY2soIGNwcWZjSEJBZGF0YSwgQ21uZCk7CisgIH0KKyAgCisgIGVsc2UKKyAgeworCisgICAgLy8gaW4gdGhlIGN1cnJlbnQgc3lzdGVtICgyLjIuMTIpLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkCisgICAgLy8gYWZ0ZXIgc3Bpbl9sb2NrX2lycXNhdmUoKSwgc28gSU5UcyBhcmUgZGlzYWJsZWQuIEhvd2V2ZXIsCisgICAgLy8gd2UgbWlnaHQgaGF2ZSBzb21ldGhpbmcgcGVuZGluZyBpbiB0aGUgTGlua1EsIHdoaWNoCisgICAgLy8gbWlnaHQgY2F1c2UgdGhlIFdvcmtlclRhc2sgdG8gcnVuLiAgSW4gY2FzZSB0aGF0CisgICAgLy8gaGFwcGVucywgbWFrZSBzdXJlIHdlIGxvY2sgaXQgb3V0LgorICAgIAorICAgIAorICAgIAorICAgIFBDSV9UUkFDRSggMHg5OCkgCisgICAgQ1BRX1NQSU5MT0NLX0hCQSggY3BxZmNIQkFkYXRhKQorICAgIFBDSV9UUkFDRSggMHg5OCkgCisJICAgIAorICAvLyBjYW4gd2UgZmluZCBhbiBGQyBkZXZpY2UgbWFwcGluZyB0byB0aGlzIFNDU0kgdGFyZ2V0PworICAgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIGZjQ2hpcCwKKyAgICAgIENtbmQsICAgICAvLyBzZWFyY2ggU2NzaSBOZXh1cworICAgICAgMCwgICAgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgcG9ydCBpZAorICAgICAgTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgV1dOCisgICAgICBOVUxMKTsgICAgLy8gRE9OJ1QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdAorIAorICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ID09IE5VTEwgKSAgICAgIC8vIG5vdCBmb3VuZCEKKyAgICB7CisvLyAgICBwcmludGsoIiBAUSBiYWQgdGFyZyBjbW5kICVwQCAiLCBDbW5kKTsKKyAgICAgIFF1ZUJhZFRhcmdldENtbmQoIGNwcWZjSEJBZGF0YSwgQ21uZCk7CisgICAgfQorICAgIGVsc2UgaWYgKENtbmQtPmRldmljZS0+bHVuID49IENQUUZDVFNfTUFYX0xVTikKKyAgICB7CisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjcHFmYzogSW52YWxpZCBMVU46ICVkXG4iLCBDbW5kLT5kZXZpY2UtPmx1bik7CisgICAgICBRdWVCYWRUYXJnZXRDbW5kKCBjcHFmY0hCQWRhdGEsIENtbmQpOworICAgIH0gCisKKyAgICBlbHNlICAvLyB3ZSBrbm93IHdoYXQgRkMgZGV2aWNlIHRvIHNlbmQgdG8uLi4KKyAgICB7CisKKyAgICAgIC8vIGRvZXMgdGhpcyBkZXZpY2Ugc3VwcG9ydCBGQ1AgdGFyZ2V0IGZ1bmN0aW9ucz8KKyAgICAgIC8vIChkZXRlcm1pbmVkIGJ5IFBSTEkgZmllbGQpCisKKyAgICAgIGlmKCAhKHBMb2dnZWRJblBvcnQtPmZjcF9pbmZvICYgVEFSR0VUX0ZVTkNUSU9OKSApCisgICAgICB7CisgICAgICAgIHByaW50aygiIERvZXNuJ3Qgc3VwcG9ydCBUQVJHRVQgZnVuY3Rpb25zIHBvcnRfaWQgJVhoXG4iLAorICAgICAgICAgIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQgKTsKKyAgICAgICAgUXVlQmFkVGFyZ2V0Q21uZCggY3BxZmNIQkFkYXRhLCBDbW5kKTsKKyAgICAgIH0KKworICAgIC8vIEluIHRoaXMgY2FzZSAocHJldmlvdXMgbG9naW4gT0spLCB0aGUgZGV2aWNlIGlzIHRlbXBvcmFyaWx5CisgICAgLy8gdW5hdmFpbGFibGUgd2FpdGluZyBmb3IgcmUtbG9naW4sIGluIHdoaWNoIGNhc2Ugd2UgZXhwZWN0IGl0CisgICAgLy8gdG8gYmUgYmFjayBpbiBiZXR3ZWVuIDI1IC0gNTAwbXMuICAKKyAgICAvLyBJZiB0aGUgRkMgcG9ydCBkb2Vzbid0IGxvZyBiYWNrIGluIHdpdGhpbiBzZXZlcmFsIHNlY29uZHMKKyAgICAvLyAoaS5lLiBpbXBsaWNpdCAibG9nb3V0IiksIG9yIHdlIGdldCBhbiBleHBsaWNpdCBsb2dvdXQsCisgICAgLy8gd2Ugc2V0ICJkZXZpY2VfYmxvY2tlZCIgaW4gU2NzaV9EZXZpY2Ugc3RydWN0OyBpbiB0aGlzCisgICAgLy8gY2FzZSAzMCBzZWNvbmRzIHdpbGwgZWxhcHNlIGJlZm9yZSBMaW51eC9TY3NpIHNlbmRzIGFub3RoZXIKKyAgICAvLyBjb21tYW5kIHRvIHRoZSBkZXZpY2UuCisgICAgICBlbHNlIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wcmxpICE9IFRSVUUgKQorICAgICAgeworLy8gICAgICBwcmludGsoIkRldmljZSAoQ2hubC9UYXJnZXQgJWQvJWQpIGludmFsaWQgUFJMSSwgcG9ydF9pZCAlMDZsWGhcbiIsCisvLyAgICAgICAgQ21uZC0+Y2hhbm5lbCwgQ21uZC0+dGFyZ2V0LCBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkKTsKKyAgICAgICAgUXVlTGlua0Rvd25DbW5kKCBjcHFmY0hCQWRhdGEsIENtbmQpOworLy8gICAgTmVlZCB0byB1c2UgImJsb2NrZWQiIGZsYWc/PyAgIAkKKy8vCUNtbmQtPmRldmljZS0+ZGV2aWNlX2Jsb2NrZWQgPSBUUlVFOyAvLyBqdXN0IGxldCBpdCB0aW1lb3V0CisgICAgICB9CisgICAgICBlbHNlICAvLyBkZXZpY2Ugc3VwcG9ydHMgVEFSR0VUIGZ1bmN0aW9ucywgYW5kIGlzIGxvZ2dlZCBpbi4uLgorICAgICAgeworICAgICAgLy8gKGNvbnRleHQgb2YgZmNocyBpcyB0byAicmVwbHkiIHRvLi4uKQorICAgICAgICBmY2hzLnNfaWQgPSBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkOyAvLyBkZXN0aW5hdGlvbiBGQyBhZGRyZXNzCisKKyAgICAgIC8vIHdoYXQgaXMgdGhlIGRhdGEgZGlyZWN0aW9uPyAgRm9yIGRhdGEgVE8gdGhlIGRldmljZSwKKyAgICAgIC8vIHdlIG5lZWQgSVdFIChJbnRpYXRvciBXcml0ZSBFbnRyeSkuICBPdGhlcndpc2UsIElSRS4KKworICAgICAgICBpZiggQ21uZC0+Y21uZFswXSA9PSBXUklURV8xMCB8fAorICAJICBDbW5kLT5jbW5kWzBdID09IFdSSVRFXzYgfHwKKwkgIENtbmQtPmNtbmRbMF0gPT0gV1JJVEVfQlVGRkVSIHx8ICAgICAgCisJICBDbW5kLT5jbW5kWzBdID09IFZFTkRPUl9XUklURV9PUENPREUgfHwgIC8vIENQUSBzcGVjaWZpYyAKKwkgIENtbmQtPmNtbmRbMF0gPT0gTU9ERV9TRUxFQ1QgKQorICAgICAgICB7CisgICAgICAgICAgU0VTVHR5cGUgPSBTQ1NJX0lXRTsgLy8gZGF0YSBmcm9tIEhCQSB0byBEZXZpY2UKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgU0VTVHR5cGUgPSBTQ1NJX0lSRTsgLy8gZGF0YSBmcm9tIERldmljZSB0byBIQkEKKyAgICAJICAKKyAgICAgICAgdWxTdGF0dXMgPSBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgICAgICAgICBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgU0VTVHR5cGUsICAgICAvLyBlLmcuIEluaXRpYXRvciBSZWFkIEVudHJ5IChJUkUpCisgICAgICAgICAgJmZjaHMsICAgICAgICAvLyB3ZSBhcmUgb3JpZ2luYXRvcjsgb25seSB1c2UgZF9pZAorICAgICAgICAgIENtbmQsICAgICAgICAgLy8gTGludXggU0NTSSBjb21tYW5kICh3aXRoIHNjYXR0ZXIvZ2F0aGVyIGxpc3QpCisgICAgICAgICAgJkV4Y2hhbmdlSUQgKTsvLyBmY0NvbnRyb2xsZXItPmZjRXhjaGFuZ2VzIGluZGV4LCAtMSBpZiBmYWlsZWQKKworICAgICAgICBpZiggIXVsU3RhdHVzICkgLy8gRXhjaGFuZ2Ugc2V0dXA/CisgICAKKyAgICAgICAgeworICAgICAgICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jayApCisgICAgICAgICAgeworICAgIFRyaWdnZXJIQkEoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSwgMCk7CisJICAgIHByaW50aygiIEBibCEgJWQsIHhJRCAlWGhAICIsIGN1cnJlbnQtPnBpZCwgRXhjaGFuZ2VJRCk7CisgICAgICAgICAgfQorCisJICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIEV4Y2hhbmdlSUQgKTsKKwkgIGlmKCAhdWxTdGF0dXMgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFBDSV9UUkFDRU8oIEV4Y2hhbmdlSUQsIDB4QjgpIAorICAgICAgICAgIC8vIHN1Ym1pdHRlZCB0byBUYWNoJ3MgT3V0Ym91bmQgUXVlIChFUlEgUEkgaW5jcmVtZW50ZWQpCisgICAgICAgICAgLy8gd2FpdGVkIGZvciBjb21wbGV0aW9uIGZvciBFTFMgdHlwZSAoTG9naW4gZnJhbWVzIGlzc3VlZAorICAgICAgICAgIC8vIHN5bmNocm9ub3VzbHkpCisJICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gY2hlY2sgcmVhc29uIGZvciBFeGNoYW5nZSBub3QgYmVpbmcgc3RhcnRlZCAtIHdlIG1pZ2h0CisgICAgICAgICAgICAvLyB3YW50IHRvIFF1ZXVlIGFuZCBzdGFydCBsYXRlciwgb3IgZmFpbCB3aXRoIGVycm9yCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJxdWVjb21tYW5kOiBjcHFmY1RTU3RhcnRFeGNoYW5nZSBmYWlsZWQ6ICVYaFxuIiwgdWxTdGF0dXMgKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAvLyBlbmQgZ29vZCBCdWlsZEV4Y2hhbmdlIHN0YXR1cworICAgICAgICAKKyAgICAgICAgZWxzZSAgLy8gU0VTVCB0YWJsZSBwcm9iYWJseSBmdWxsICAtLSB3aHk/IGhhcmR3YXJlIGhhbmc/CisgICAgICAgIHsKKwkgIHByaW50aygicXVlY29tbWFuZDogY3BxZmNUU0J1aWxkRXhjaGFuZ2UgZmFpbGQ6ICVYaFxuIiwgdWxTdGF0dXMpOworICAgICAgICB9CisgICAgICB9ICAvLyBlbmQgY2FuJ3QgZG8gRkNQLVNDU0kgdGFyZ2V0IGZ1bmN0aW9ucworICAgIH0gLy8gZW5kIGNhbid0IGZpbmQgdGFyZ2V0IChGQyBkZXZpY2UpCisKKyAgICBDUFFfU1BJTlVOTE9DS19IQkEoIGNwcWZjSEJBZGF0YSkKKyAgfQorCQorICBQQ0lfVFJBQ0VPKCAoVUxPTkcpQ21uZCwgMHg5QykgCisgIExFQVZFKCJjcHFmY1RTX3F1ZXVlY29tbWFuZCIpOworICByZXR1cm4gMDsKK30gICAgCisKKworLy8gRW50cnkgcG9pbnQgZm9yIHVwcGVyIFNjc2kgbGF5ZXIgaW50aWF0ZWQgYWJvcnQuICBUeXBpY2FsbHkKKy8vIHRoaXMgaXMgY2FsbGVkIGlmIHRoZSBjb21tYW5kIChmb3IgaGFyZCBkaXNrKSBmYWlscyB0byBjb21wbGV0ZQorLy8gaW4gMzAgc2Vjb25kcy4gIFRoaXMgZHJpdmVyIGludGVuZHMgdG8gY29tcGxldGUgYWxsIGRpc2sgY29tbWFuZHMKKy8vIHdpdGhpbiBFeGNoYW5nZSAiLnRpbWVPdXQiIHNlY29uZHMgKG5vdyA3KSB3aXRoIHRhcmdldCBzdGF0dXMsIG9yCisvLyBpbiBjYXNlIG9mICIudGltZU91dCIgZXhwaXJhdGlvbiwgYSBESURfU09GVF9FUlJPUiB3aGljaCBjYXVzZXMKKy8vIGltbWVkaWF0ZSByZXRyeS4KKy8vIElmIGFueSBkaXNrIGNvbW1hbmRzIGdldCB0aGUgX2Fib3J0IGNhbGwsIGV4Y2VwdCBmb3IgdGhlIGNhc2UgdGhhdAorLy8gdGhlIHBoeXNpY2FsIGRldmljZSB3YXMgcmVtb3ZlZCBvciB1bmF2YWlsYWJsZSBkdWUgdG8gaGFyZHdhcmUKKy8vIGVycm9ycywgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBkcml2ZXIgZXJyb3IgYW5kIHJlcG9ydGVkIHRvCisvLyB0aGUgYXV0aG9yLgorCitpbnQgY3BxZmNUU19hYm9ydChTY3NpX0NtbmQgKkNtbmQpCit7CisvLwlwcmludGsoIiBjcHFmY1RTX2Fib3J0IGNhbGxlZD8/IFxuIik7CisgCXJldHVybiAwOworfQorIAoraW50IGNwcWZjVFNfZWhfYWJvcnQoU2NzaV9DbW5kICpDbW5kKQoreworCisgIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyID0gQ21uZC0+ZGV2aWNlLT5ob3N0OworICAvLyBnZXQgdGhlIHBvaW50ZXIgdG8gb3VyIFNjc2kgbGF5ZXIgSEJBIGJ1ZmZlciAgCisgIENQUUZDSEJBICpjcHFmY0hCQWRhdGEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgaW50IGk7CisgIEVOVEVSKCJjcHFmY1RTX2VoX2Fib3J0Iik7CisKKyAgQ21uZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8MTY7ICAvLyBhc3N1bWUgd2UnbGwgZmluZCBpdAorCisgIHByaW50aygiIEBMaW51eCBfYWJvcnQgU2NzaV9DbW5kICVwICIsIENtbmQpOworICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBDbW5kIHBvaW50ZXIgdGhhdCBtYXRjaGVzLi4uCisgIC8vIFRoZSBtb3N0IGxpa2VseSBjYXNlIGlzIHdlIGFjY2VwdGVkIHRoZSBjb21tYW5kCisgIC8vIGZyb20gTGludXggU2NzaSAoZS5nLiBjZWF0ZWQgYSBTRVNUIGVudHJ5KSBhbmQgaXQKKyAgLy8gZ290IGxvc3Qgc29tZWhvdy4gIElmIHdlIGNhbid0IGZpbmQgYW55IHJlZmVyZW5jZQorICAvLyB0byB0aGUgcGFzc2VkIHBvaW50ZXIsIHdlIGNhbiBvbmx5IHByZXN1bWUgaXQKKyAgLy8gZ290IGNvbXBsZXRlZCBhcyBmYXIgYXMgb3VyIGRyaXZlciBpcyBjb25jZXJuZWQuCisgIC8vIElmIHdlIGZvdW5kIGl0LCB3ZSB3aWxsIHRyeSB0byBhYm9ydCBpdCB0aHJvdWdoCisgIC8vIGNvbW1vbiBtZWNoYW5pc20uICBJZiBGQyBBQlRTIGlzIHN1Y2Nlc3NmdWwgKEFDQykKKyAgLy8gb3IgaXMgcmVqZWN0ZWQgKFJKVCkgYnkgdGFyZ2V0LCB3ZSB3aWxsIGNhbGwKKyAgLy8gU2NzaSAiZG9uZSIgcXVpY2tseS4gIE90aGVyd2lzZSwgdGhlIEFCVFMgd2lsbCB0aW1lb3V0CisgIC8vIGFuZCB3ZSdsbCBjYWxsICJkb25lIiBsYXRlci4KKworICAvLyBTZWFyY2ggdGhlIFNFU1QgZXhjaGFuZ2VzIGZvciBhIG1hdGNoaW5nIENtbmQgcHRyLgorICBmb3IoIGk9MDsgaTwgVEFDSF9TRVNUX0xFTjsgaSsrKQorICB7CisgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5DbW5kID09IENtbmQgKQorICAgIHsKKyAgICAgIAorICAgICAgLy8gZm91bmQgaXQhCisgICAgICBwcmludGsoIiB4X0lEICVYaCwgdHlwZSAlWGhcbiIsIGksIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlKTsKKworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnN0YXR1cyA9IElOSVRJQVRPUl9BQk9SVDsgLy8gc2Vjb25kcyBkZWZhdWx0CisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udGltZU91dCA9IDEwOyAvLyBzZWNvbmRzIGRlZmF1bHQgKGNoYW5nZWQgbGF0ZXIpCisKKyAgICAgIC8vIFNpbmNlIHdlIG5lZWQgdG8gaW1tZWRpYXRlbHkgcmV0dXJuIHRoZSBhYm9ydGVkIENtbmQgdG8gU2NzaSAKKyAgICAgIC8vIHVwcGVyIGxheWVycywgd2UgY2FuJ3QgbWFrZSBmdXR1cmUgcmVmZXJlbmNlIHRvIGFueSBvZiBpdHMgCisgICAgICAvLyBmaWVsZHMgKGUuZyB0aGUgTmV4dXMpLgorCisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBCTFNfQUJUUywgJmkpOworCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiggaSA+PSBUQUNIX1NFU1RfTEVOICkgLy8gZGlkbid0IGZpbmQgQ21uZCBwdHIgaW4gY2hpcCdzIFNFU1Q/CisgIHsKKyAgICAvLyBub3cgc2VhcmNoIG91ciBub24tU0VTVCBidWZmZXJzIChpLmUuIENtbmQgd2FpdGluZyB0bworICAgIC8vIHN0YXJ0IG9uIHRoZSBIQkEgb3Igd2FpdGluZyB0byBjb21wbGV0ZSB3aXRoIGVycm9yIGZvciByZXRyeSkuCisgICAgCisgICAgLy8gZmlyc3QgY2hlY2sgQmFkVGFyZ2V0Q21uZAorICAgIGZvciggaT0wOyBpPCBDUFFGQ1RTX01BWF9UQVJHRVRfSUQ7IGkrKykKKyAgICB7IAorICAgICAgaWYoIGNwcWZjSEJBZGF0YS0+QmFkVGFyZ2V0Q21uZFtpXSA9PSBDbW5kICkKKyAgICAgIHsKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5CYWRUYXJnZXRDbW5kW2ldID0gTlVMTDsKKwlwcmludGsoImluIEJhZFRhcmdldENtbmQgUVxuIik7CisJZ290byBEb25lOyAvLyBleGl0CisgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgbm90IGZvdW5kIGFib3ZlLi4uCisKKyAgICBmb3IoIGk9MDsgaSA8IENQUUZDVFNfUkVRX1FVRVVFX0xFTjsgaSsrKQorICAgIHsKKyAgICAgIGlmKCBjcHFmY0hCQWRhdGEtPkxpbmtEbkNtbmRbaV0gPT0gQ21uZCApIAorICAgICAgeworCWNwcWZjSEJBZGF0YS0+TGlua0RuQ21uZFtpXSA9IE5VTEw7CisJcHJpbnRrKCJpbiBMaW5rRG5DbW5kIFFcbiIpOworCWdvdG8gRG9uZTsKKyAgICAgIH0KKyAgICB9CisKKworICAgIGZvciggaT0wOyBpPCBDUFFGQ1RTX1JFUV9RVUVVRV9MRU47IGkrKykKKyAgICB7ICAgIC8vIGZpbmQgc3BhcmUgc2xvdAorICAgICAgaWYoIGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrQ21uZFtpXSA9PSBDbW5kICkKKyAgICAgIHsKKyAgICAgICAgY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2tDbW5kW2ldID0gTlVMTDsKKwlwcmludGsoImluIEJvYXJkTG9ja0NtbmQgUVxuIik7CisJZ290byBEb25lOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBDbW5kLT5yZXN1bHQgPSBESURfRVJST1IgPDwxNjsgIC8vIEhtbW0uLi4KKyAgICBwcmludGsoIk5vdCBmb3VuZCEgIik7CisvLyAgICBwYW5pYygiX2Fib3J0Iik7CisgIH0KKyAgCitEb25lOgorICAKKy8vICAgIHBhbmljKCJfYWJvcnQiKTsKKyAgTEVBVkUoImNwcWZjVFNfZWhfYWJvcnQiKTsKKyAgcmV0dXJuIDA7ICAvLyAoc2VlIHNjc2kuaCkKK30gICAgCisKKworLy8gRkNQLVNDU0kgVGFyZ2V0IERldmljZSBSZXNldAorLy8gU2VlIGRwQU5TIEZpYnJlIENoYW5uZWwgUHJvdG9jb2wgZm9yIFNDU0kKKy8vIFgzLjI2OS0xOTlYIHJldmlzaW9uIDEyLCBwZyAyNQorCisjaWZkZWYgU1VQUE9SVF9SRVNFVAorCitpbnQgY3BxZmNUU19UYXJnZXREZXZpY2VSZXNldCggU2NzaV9EZXZpY2UgKlNjc2lEZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXNldF9mbGFncykKK3sKKyAgaW50IHRpbWVvdXQgPSAxMCpIWjsKKyAgaW50IHJldHJpZXMgPSAxOworICBjaGFyIHNjc2lfY2RiWzEyXTsKKyAgaW50IHJlc3VsdDsKKyAgU2NzaV9DbW5kICogU0NwbnQ7CisgIFNjc2lfRGV2aWNlICogU0RwbnQ7CisKKy8vIEZJWE1FLCBjcHFmY1RTX1RhcmdldERldmljZVJlc2V0IG5lZWRzIHRvIGJlIGZpeGVkIAorLy8gc2ltaWxhcmx5IHRvIGhvdyB0aGUgcGFzc3Rocm91Z2ggaW9jdGwgd2FzIGZpeGVkIAorLy8gYXJvdW5kIHRoZSAyLjUuMzAga2VybmVsLiAgU2NzaV9DbW5kIHJlcGxhY2VkIHdpdGggCisvLyBTY3NpX1JlcXVlc3QsIGV0Yy4KKy8vIEZvciBub3csIHNvIHBlb3BsZSBkb24ndCBmYWxsIGludG8gYSBob2xlLi4uCisKKyAgLy8gcHJpbnRrKCIgICBFTlRFUklORyBjcHFmY1RTX1RhcmdldERldmljZVJlc2V0KCkgLSBmbGFnPSVkIFxuIixyZXNldF9mbGFncyk7CisKKyAgaWYgKFNjc2lEZXYtPmhvc3QtPmVoX2FjdGl2ZSkgcmV0dXJuIEZBSUxFRDsKKworICBtZW1zZXQoIHNjc2lfY2RiLCAwLCBzaXplb2YoIHNjc2lfY2RiKSk7CisKKyAgc2NzaV9jZGJbMF0gPSBSRUxFQVNFOworCisgIFNDcG50ID0gc2NzaV9nZXRfY29tbWFuZChTY3NpRGV2LCBHRlBfS0VSTkVMKTsKKyAgeworICAgIENQUUZDX0RFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKKyAgICAKKyAgICBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBGQ1BfVEFSR0VUX1JFU0VUOworCisJLy8gRklYTUU6IHRoaXMgd291bGQgcGFuaWMsIFNDcG50LT5yZXF1ZXN0IHdvdWxkIGJlIE5VTEwuCisJU0NwbnQtPnJlcXVlc3QtPkNQUUZDX1dBSVRJTkcgPSAmd2FpdDsKKwlzY3NpX2RvX2NtZChTQ3BudCwgIHNjc2lfY2RiLCBOVUxMLCAgMCwgbXlfaW9jdGxfZG9uZSwgIHRpbWVvdXQsIHJldHJpZXMpOworCUNQUUZDX1dBSVRfRk9SX0NPTVBMRVRJT04oJndhaXQpOworCVNDcG50LT5yZXF1ZXN0LT5DUFFGQ19XQUlUSU5HID0gTlVMTDsKKyAgfQorICAgIAorCisgICAgICBpZihkcml2ZXJfYnl0ZShTQ3BudC0+cmVzdWx0KSAhPSAwKQorCSAgc3dpdGNoKFNDcG50LT5zZW5zZV9idWZmZXJbMl0gJiAweGYpIHsKKwljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkgICAgaWYoY21kWzBdID09IEFMTE9XX01FRElVTV9SRU1PVkFMKSBkZXYtPmxvY2thYmxlID0gMDsKKwkgICAgZWxzZSBwcmludGsoIlNDU0kgZGV2aWNlIChpb2N0bCkgcmVwb3J0cyBJTExFR0FMIFJFUVVFU1QuXG4iKTsKKwkgICAgYnJlYWs7CisJY2FzZSBOT1RfUkVBRFk6IC8vIFRoaXMgaGFwcGVucyBpZiB0aGVyZSBpcyBubyBkaXNjIGluIGRyaXZlIAorCSAgICBpZihkZXYtPnJlbW92YWJsZSAmJiAoY21kWzBdICE9IFRFU1RfVU5JVF9SRUFEWSkpeworCQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2Ugbm90IHJlYWR5LiAgTWFrZSBzdXJlIHRoZXJlIGlzIGEgZGlzYyBpbiB0aGUgZHJpdmUuXG4iKTsKKwkJYnJlYWs7CisJICAgIH0KKwljYXNlIFVOSVRfQVRURU5USU9OOgorCSAgICBpZiAoZGV2LT5yZW1vdmFibGUpeworCQlkZXYtPmNoYW5nZWQgPSAxOworCQlTQ3BudC0+cmVzdWx0ID0gMDsgLy8gVGhpcyBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhbiBlcnJvcgorCQkvLyBnYWcgdGhpcyBlcnJvciwgVkZTIHdpbGwgbG9nIGl0IGFueXdheSAvYXhib2UgCisJCS8vIHByaW50ayhLRVJOX0lORk8gIkRpc2MgY2hhbmdlIGRldGVjdGVkLlxuIik7IAorCQlicmVhazsKKwkgICAgfTsKKwlkZWZhdWx0OiAvLyBGYWxsIHRocm91Z2ggZm9yIG5vbi1yZW1vdmFibGUgbWVkaWEKKwkgICAgcHJpbnRrKCJTQ1NJIGVycm9yOiBob3N0ICVkIGlkICVkIGx1biAlZCByZXR1cm4gY29kZSA9ICV4XG4iLAorCQkgICBkZXYtPmhvc3QtPmhvc3Rfbm8sCisJCSAgIGRldi0+aWQsCisJCSAgIGRldi0+bHVuLAorCQkgICBTQ3BudC0+cmVzdWx0KTsKKwkgICAgcHJpbnRrKCJcdFNlbnNlIGNsYXNzICV4LCBzZW5zZSBlcnJvciAleCwgZXh0ZW5kZWQgc2Vuc2UgJXhcbiIsCisJCSAgIHNlbnNlX2NsYXNzKFNDcG50LT5zZW5zZV9idWZmZXJbMF0pLAorCQkgICBzZW5zZV9lcnJvcihTQ3BudC0+c2Vuc2VfYnVmZmVyWzBdKSwKKwkJICAgU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4Zik7CisJICAgIAorICAgICAgfTsKKyAgcmVzdWx0ID0gU0NwbnQtPnJlc3VsdDsKKworICBTRHBudCA9IFNDcG50LT5kZXZpY2U7CisgIHNjc2lfcHV0X2NvbW1hbmQoU0NwbnQpOworICBTQ3BudCA9IE5VTEw7CisKKyAgLy8gcHJpbnRrKCIgICBMRUFWSU5HIGNwcWZjVFNfVGFyZ2V0RGV2aWNlUmVzZXQoKSAtIHJldHVybiBTVUNDRVNTIFxuIik7CisgIHJldHVybiBTVUNDRVNTOworfQorCisjZWxzZQoraW50IGNwcWZjVFNfVGFyZ2V0RGV2aWNlUmVzZXQoIFNjc2lfRGV2aWNlICpTY3NpRGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworI2VuZGlmIC8qIFNVUFBPUlRfUkVTRVQgKi8KKworaW50IGNwcWZjVFNfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqQ21uZCkKK3sKKyAgaW50IHJldHZhbDsKKyAgU2NzaV9EZXZpY2UgKlNEcG50ID0gQ21uZC0+ZGV2aWNlOworICAvLyBwcmludGsoIiAgIEVOVEVSSU5HIGNwcWZjVFNfZWhfZGV2aWNlX3Jlc2V0KCkgXG4iKTsKKyAgc3Bpbl91bmxvY2tfaXJxKENtbmQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKyAgcmV0dmFsID0gY3BxZmNUU19UYXJnZXREZXZpY2VSZXNldCggU0RwbnQsIDApOworICBzcGluX2xvY2tfaXJxKENtbmQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCQoraW50IGNwcWZjVFNfcmVzZXQoU2NzaV9DbW5kICpDbW5kLCB1bnNpZ25lZCBpbnQgcmVzZXRfZmxhZ3MpCit7CisKKyAgRU5URVIoImNwcWZjVFNfcmVzZXQiKTsKKworICBMRUFWRSgiY3BxZmNUU19yZXNldCIpOworICByZXR1cm4gU0NTSV9SRVNFVF9FUlJPUjsgICAgICAvKiBCdXMgUmVzZXQgTm90IHN1cHBvcnRlZCAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGJpb3MgcGFyYW1ldGVycyBmb3IgYSBnaXZlbgorICAgaGFyZGRpc2suIFRoZXNlIHRlbmQgdG8gYmUgbnVtYmVycyB0aGF0IGFyZSBtYWRlIHVwIGJ5IHRoZQorICAgaG9zdCBhZGFwdGVyLiAgUGFyYW1ldGVyczoKKyAgIHNpemUsIGRldmljZSBudW1iZXIsIGxpc3QgKGhlYWRzLCBzZWN0b3JzLGN5bGluZGVycykuCisgICAoZnJvbSBob3N0cy5oKQorKi8KKworaW50IGNwcWZjVFNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqbiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQoreworICBpbnQgc2l6ZSA9IGNhcGFjaXR5OworICAKKyAgRU5URVIoImNwcWZjVFNfYmlvc3BhcmFtIik7CisgIGlwWzBdID0gNjQ7CisgIGlwWzFdID0gMzI7CisgIGlwWzJdID0gc2l6ZSA+PiAxMTsKKyAgCisgIGlmKCBpcFsyXSA+IDEwMjQgKQorICB7CisgICAgaXBbMF0gPSAyNTU7CisgICAgaXBbMV0gPSA2MzsKKyAgICBpcFsyXSA9IHNpemUgLyAoaXBbMF0gKiBpcFsxXSk7CisgIH0KKworICBMRUFWRSgiY3BxZmNUU19iaW9zcGFyYW0iKTsKKyAgcmV0dXJuIDA7Cit9ICAgIAorCisKKworaXJxcmV0dXJuX3QgY3BxZmNUU19pbnRyX2hhbmRsZXIoIGludCBpcnEsIAorCQl2b2lkICpkZXZfaWQsIAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKworICB1bnNpZ25lZCBsb25nIGZsYWdzLCBJbmZMb29wQnJrPTA7CisgIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyID0gZGV2X2lkOworICBDUFFGQ0hCQSAqY3BxZmNIQkEgPSAoQ1BRRkNIQkEgKilIb3N0QWRhcHRlci0+aG9zdGRhdGE7CisgIGludCBNb3JlTWVzc2FnZXMgPSAxOyAvLyBhc3N1bWUgd2UgaGF2ZSBzb21ldGhpbmcgdG8gZG8KKyAgVUNIQVIgSW50UGVuZGluZzsKKyAgaW50IGhhbmRsZWQgPSAwOworCisgIEVOVEVSKCJpbnRyX2hhbmRsZXIiKTsKKyAgc3Bpbl9sb2NrX2lycXNhdmUoIEhvc3RBZGFwdGVyLT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgLy8gaXMgdGhpcyBvdXIgSU5UPworICBJbnRQZW5kaW5nID0gcmVhZGIoIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLklOVFBFTkQuYWRkcmVzcyk7CisKKyAgLy8gYnJva2VuIGJvYXJkcyBjYW4gZ2VuZXJhdGUgbWVzc2FnZXMgZm9yZXZlciwgc28KKyAgLy8gcHJldmVudCB0aGUgaW5maW5pdGUgbG9vcAorI2RlZmluZSBJTkZJTklURV9JTVFfQlJFQUsgMTAwMDAKKyAgaWYoIEludFBlbmRpbmcgKQorICB7CisgICAgaGFuZGxlZCA9IDE7CisgICAgLy8gbWFzayBvdXIgSEJBIGludGVycnVwdHMgdW50aWwgd2UgaGFuZGxlIGl0Li4uCisgICAgd3JpdGViKCAwLCBjcHFmY0hCQS0+ZmNDaGlwLlJlZ2lzdGVycy5JTlRFTi5hZGRyZXNzKTsKKworICAgIGlmKCBJbnRQZW5kaW5nICYgMHg0KSAvLyAiSU5UIiAtIFRhY2ggd3JvdGUgdG8gSU1RCisgICAgeworICAgICAgd2hpbGUoICgrK0luZkxvb3BCcmsgPCBJTkZJTklURV9JTVFfQlJFQUspICYmIChNb3JlTWVzc2FnZXMgPT0xKSApIAorICAgICAgeworICAgICAgICBNb3JlTWVzc2FnZXMgPSBDcHFUc1Byb2Nlc3NJTVFFbnRyeSggSG9zdEFkYXB0ZXIpOyAvLyByZXQgMCB3aGVuIGRvbmUKKyAgICAgIH0KKyAgICAgIGlmKCBJbmZMb29wQnJrID49IElORklOSVRFX0lNUV9CUkVBSyApCisgICAgICB7CisgICAgICAgIHByaW50aygiV0FSTklORzogQ29tcGFxIEZDIGFkYXB0ZXIgZ2VuZXJhdGluZyBleGNlc3NpdmUgSU5UcyAtUkVQTEFDRVxuIik7CisgICAgICAgIHByaW50aygib3IgaW52ZXN0aWdhdGUgYWx0ZXJuYXRlIGNhdXNlcyAoZS5nLiBwaHlzaWNhbCBGQyBsYXllcilcbiIpOworICAgICAgfQorCisgICAgICBlbHNlICAvLyB3b3JraW5nIG5vcm1hbGx5IC0gcmUtZW5hYmxlIElOVHMgYW5kIGNvbnRpbnVlCisgICAgICAgIHdyaXRlYiggMHgxRiwgY3BxZmNIQkEtPmZjQ2hpcC5SZWdpc3RlcnMuSU5URU4uYWRkcmVzcyk7CisgICAgCisgICAgfSAgLy8gKC4uLlByb2Nlc3NJTVFFbnRyeSgpIGNsZWFycyBJTlQgYnkgd3JpdGluZyBJTVEgY29uc3VtZXIpCisgICAgZWxzZSAgLy8gaW5kaWNhdGlvbnMgb2YgZXJyb3JzIG9yIHByb2JsZW1zLi4uCisgICAgICAgICAgLy8gdGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBjcml0aWNhbCBzeXN0ZW0gaGFyZHdhcmUgcHJvYmxlbXMuCisgICAgeworICAgICAgaWYoIEludFBlbmRpbmcgJiAweDEwICkKKyAgCXByaW50aygiIGNwcWZjVFMgYWRhcHRlciBleHRlcm5hbCBtZW1vcnkgcGFyaXR5IGVycm9yIGRldGVjdGVkXG4iKTsKKyAgICAgIGlmKCBJbnRQZW5kaW5nICYgMHg4ICkKKyAgCXByaW50aygiIGNwcWZjVFMgYWRhcHRlciBQQ0kgbWFzdGVyIGFkZHJlc3MgY3Jvc3NlZCA0NS1iaXQgYm91bmRhcnlcbiIpOworICAgICAgaWYoIEludFBlbmRpbmcgJiAweDIgKQorCXByaW50aygiIGNwcWZjVFMgYWRhcHRlciBETUEgZXJyb3IgZGV0ZWN0ZWRcbiIpOworICAgICAgaWYoIEludFBlbmRpbmcgJiAweDEgKSB7CisgIAlVQ0hBUiBJbnRTdGF0OworICAJcHJpbnRrKCIgY3BxZmNUUyBhZGFwdGVyIFBDSSBlcnJvciBkZXRlY3RlZFxuIik7CisgIAlJbnRTdGF0ID0gcmVhZGIoIGNwcWZjSEJBLT5mY0NoaXAuUmVnaXN0ZXJzLklOVFNUQVQuYWRkcmVzcyk7CisJcHJpbnRrKCJjcHFmYzogSVNSID0gMHglMDJ4XG4iLCBJbnRTdGF0KTsKKwlpZiAoSW50U3RhdCAmIDB4MSkgeworCQlfX3UxNiBwY2lzdGF0OworCQkvKiByZWFkIHRoZSBwY2kgc3RhdHVzIHJlZ2lzdGVyICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNwcWZjSEJBLT5QY2lEZXYsIDB4MDYsICZwY2lzdGF0KTsKKwkJcHJpbnRrKCJQQ0kgc3RhdHVzIHJlZ2lzdGVyIGlzIDB4JTA0eFxuIiwgcGNpc3RhdCk7CisJCWlmIChwY2lzdGF0ICYgMHg4MDAwKSBwcmludGsoIlBhcml0eSBFcnJvciBEZXRlY3RlZC5cbiIpOworCQlpZiAocGNpc3RhdCAmIDB4NDAwMCkgcHJpbnRrKCJTaWduYWxsZWQgU3lzdGVtIEVycm9yXG4iKTsKKwkJaWYgKHBjaXN0YXQgJiAweDIwMDApIHByaW50aygiUmVjZWl2ZWQgTWFzdGVyIEFib3J0XG4iKTsKKwkJaWYgKHBjaXN0YXQgJiAweDEwMDApIHByaW50aygiUmVjZWl2ZWQgVGFyZ2V0IEFib3J0XG4iKTsKKwkJaWYgKHBjaXN0YXQgJiAweDA4MDApIHByaW50aygiU2lnbmFsbGVkIFRhcmdldCBBYm9ydFxuIik7CisJfQorCWlmIChJbnRTdGF0ICYgMHg0KSBwcmludGsoIihJTlQpXG4iKTsKKwlpZiAoSW50U3RhdCAmIDB4OCkgCisJCXByaW50aygiQ1JTOiBQQ0kgbWFzdGVyIGFkZHJlc3MgY3Jvc3NlZCA0NiBiaXQgYm91YW5kYXJ5XG4iKTsKKwlpZiAoSW50U3RhdCAmIDB4MTApIHByaW50aygiTVJFOiBleHRlcm5hbCBtZW1vcnkgcGFyaXR5IGVycm9yLlxuIik7CisgICAgICB9CisgICAgfSAgICAgIAorICB9CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoIEhvc3RBZGFwdGVyLT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgTEVBVkUoImludHJfaGFuZGxlciIpOworICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisKKworaW50IGNwcWZjVFNEZWNvZGVHQklDdHlwZSggUFRBQ0hZT04gZmNDaGlwLCBjaGFyIGNFcnJvclN0cmluZ1tdKQoreworICAgICAgICAvLyBWZXJpZnkgR0JJQyB0eXBlIChpZiBhbnkpIGFuZCBjb3JyZWN0IFRhY2h5b24gUG9ydCBTdGF0ZSBNYWNoaW5lCisgICAgICAgIC8vIChHQklDKSBtb2R1bGUgZGVmaW5pdGlvbiBpczoKKyAgICAgICAgLy8gR1BJTzEsIEdQSU8wLCBHUElPNCBmb3IgTUQyLCBNRDEsIE1EMC4gIFRoZSBpbnB1dCBzdGF0ZXMgYXBwZWFyCisgICAgICAgIC8vIHRvIGJlIGludmVydGVkIC0tIGkuZS4sIGEgc2V0dGluZyBvZiAxMTEgaXMgcmVhZCB3aGVuIHRoZXJlIGlzIE5PCisgICAgICAgIC8vIEdCSUMgcHJlc2VudC4gIFRoZSBNb2R1bGUgRGVmIChNRCkgc3BlYyBzYXlzIDAwMCBpcyAibm8gR0JJQyIKKyAgICAgICAgLy8gSGFyZCBjb2RlIHRoZSBiaXQgc3RhdGVzIHRvIGRldGVjdCBDb3BwZXIsIAorICAgICAgICAvLyBMb25nIHdhdmUgKHNpbmdsZSBtb2RlKSwgU2hvcnQgd2F2ZSAobXVsdGktbW9kZSksIGFuZCBhYnNlbnQgR0JJQworCisgIFVMT05HIHVsQnVmZjsKKworICBzcHJpbnRmKCBjRXJyb3JTdHJpbmcsICJcbkdCSUMgZGV0ZWN0ZWQ6ICIpOworCisgIHVsQnVmZiA9IGZjQ2hpcC0+UmVnaXN0ZXJzLlRZc3RhdHVzLnZhbHVlICYgMHgxMzsgCisgIHN3aXRjaCggdWxCdWZmICkKKyAgeworICBjYXNlIDB4MTM6ICAvLyBHUElPNCwgR1BJTzEsIEdQSU8wID0gMTExOyBubyBHQklDIQorICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sCisgICAgICAgICAgICAiTk9ORSEgIik7CisgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAKKyAgICAgICAgICAKKyAgICAgICAKKyAgY2FzZSAweDExOiAgIC8vIENvcHBlciBHQklDIGRldGVjdGVkCisgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwKKyAgICAgICAgICAgICJDb3BwZXIuICIpOworICAgIGJyZWFrOworCisgIGNhc2UgMHgxMDogICAvLyBMb25nLXdhdmUgKHNpbmdsZSBtb2RlKSBHQklDIGRldGVjdGVkCisgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwKKyAgICAgICAgIkxvbmctd2F2ZS4gIik7CisgICAgYnJlYWs7CisgIGNhc2UgMHgxOiAgICAvLyBTaG9ydC13YXZlIChtdWx0aSBtb2RlKSBHQklDIGRldGVjdGVkCisgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwKKyAgICAgICAgIlNob3J0LXdhdmUuICIpOworICAgIGJyZWFrOworICBkZWZhdWx0OiAgICAgLy8gdW5rbm93biBHQklDIC0gcHJlc3VtYWJseSBpdCB3aWxsIHdvcmsgKD8pCisgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwKKyAgICAgICAgICAgICJVbmtub3duLiAiKTsKKyAgICAgICAgICAKKyAgICBicmVhazsKKyAgfSAgLy8gZW5kIHN3aXRjaCBHQklDIGRldGVjdGlvbgorCisgIHJldHVybiBUUlVFOworfQorCisKKworCisKKworaW50IGNwcWZjVFNHZXRMUFNNKCBQVEFDSFlPTiBmY0NoaXAsIGNoYXIgY0Vycm9yU3RyaW5nW10pCit7CisgIC8vIFRhY2h5b24ncyBGcmFtZSBNYW5hZ2VyIExQU00gaW4gTGlua0Rvd24gc3RhdGU/CisgIC8vIChGb3Igbm9uLWxvb3AgcG9ydCwgY2hlY2sgUFNNIGluc3RlYWQuKQorICAvLyByZXR1cm4gc3RyaW5nIHdpdGggc3RhdGUgYW5kIEZBTFNFIGlzIExpbmsgRG93bgorCisgIGludCBMaW5rVXA7CisKKyAgaWYoIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHg4MCApIAorICAgIExpbmtVcCA9IEZBTFNFOworICBlbHNlCisgICAgTGlua1VwID0gVFJVRTsKKworICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLAorICAgICIgTFBTTSAlWGggIiwgCisgICAgIChmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSA+PjQpICYgMHhmICk7CisKKworICBzd2l0Y2goIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHhGMCkKKyAgeworICAgICAgICAgICAgICAgICAgICAvLyBiaXRzIHNldCBpbiBMUFNNCisgICAgY2FzZSAweDEwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIkFSQiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDIwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIkFSQndvbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIk9QRU4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0MDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJPUEVOZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1MDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJYbWl0Q0xTIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NjA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiUnhDTFMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg3MDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJYZmVyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiSW5pdCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDkwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIk8tSUluaXRGaW4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhhMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJPLUlQcm90b2NvbCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGIwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIk8tSUxpcFJjdmQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjMDoKKyAgICAgIHNwcmludGYoICZjRXJyb3JTdHJpbmdbIHN0cmxlbiggY0Vycm9yU3RyaW5nKV0sICJIb3N0Q29udHJvbCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIkxvb3BGYWlsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZTA6CisgICAgICBzcHJpbnRmKCAmY0Vycm9yU3RyaW5nWyBzdHJsZW4oIGNFcnJvclN0cmluZyldLCAiT2ZmbGluZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGYwOgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIk9sZFBvcnQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICBkZWZhdWx0OgorICAgICAgc3ByaW50ZiggJmNFcnJvclN0cmluZ1sgc3RybGVuKCBjRXJyb3JTdHJpbmcpXSwgIk1vbml0b3IiKTsKKyAgICAgIGJyZWFrOworCisgIH0KKworICByZXR1cm4gTGlua1VwOworfQorCisKKworCisjaW5jbHVkZSAibGludXgvc2xhYi5oIgorCisvLyBEeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFsaWdubWVudCByb3V0aW5lcworLy8gSFAncyBUYWNoeW9uIEZpYnJlIENoYW5uZWwgQ29udHJvbGxlciBjaGlwcyByZXF1aXJlCisvLyBjZXJ0YWluIG1lbW9yeSBxdWV1ZXMgYW5kIHJlZ2lzdGVyIHBvaW50ZXJzIHRvIGJlIGFsaWduZWQKKy8vIG9uIHZhcmlvdXMgYm91bmRhcmllcywgdXN1YWxseSB0aGUgc2l6ZSBvZiB0aGUgUXVldWUgaW4gcXVlc3Rpb24uCisvLyBBbGlnbm1lbnQgbWlnaHQgYmUgb24gMiwgNCwgOCwgLi4uIG9yIGV2ZW4gNTEyIGJ5dGUgYm91bmRhcmllcy4KKy8vIFNpbmNlIG1vc3QgTy9TcyBkb24ndCBhbGxvdyB0aGlzICh1c3VhbGx5IG9ubHkgQ2FjaGUgYWxpZ25lZCAtCisvLyAzMi1ieXRlIGJvdW5kYXJ5KSwgdGhlc2Ugcm91dGluZXMgcHJvdmlkZSBnZW5lcmljIGFsaWdubWVudCAoYWZ0ZXIKKy8vIE8vUyBhbGxvY2F0aW9uKSBhdCBhbnkgYm91bmRhcnksIGFuZCBzdG9yZSB0aGUgb3JpZ2luYWwgYWxsb2NhdGVkCisvLyBwb2ludGVyIGZvciBkZWxldGlvbiAoTy9TIGZyZWUgZnVuY3Rpb24pLiAgVHlwaWNhbGx5LCB3ZSBleHBlY3QKKy8vIHRoZXNlIGZ1bmN0aW9ucyB0byBvbmx5IGJlIGNhbGxlZCBhdCBIQkEgaW5pdGlhbGl6YXRpb24gYW5kCisvLyByZW1vdmFsIHRpbWUgKGxvYWQgYW5kIHVubG9hZCB0aW1lcykKKy8vIEFMR09SSVRITSBub3RlczoKKy8vIE1lbW9yeSBhbGxvY2F0aW9uIHZhcmllcyBieSBjb21waWxlciBhbmQgcGxhdGZvcm0uICBJbiB0aGUgd29yc3QgY2FzZSwKKy8vIHdlIGFyZSBvbmx5IGFzc3VyZWQgQllURSBhbGlnbm1lbnQsIGJ1dCBpbiB0aGUgYmVzdCBjYXNlLCB3ZSBjYW4KKy8vIHJlcXVlc3QgYWxsb2NhdGlvbiBvbiBhbnkgZGVzaXJlZCBib3VuZGFyeS4gIE91ciBzdHJhdGVneTogcGFkIHRoZQorLy8gYWxsb2NhdGlvbiByZXF1ZXN0IHNpemUgKGkuZS4gd2FzdGUgbWVtb3J5KSBzbyB0aGF0IHdlIGFyZSBhc3N1cmVkCisvLyBvZiBwYXNzaW5nIGRlc2lyZWQgYm91bmRhcnkgbmVhciBiZWdpbm5pbmcgb2YgY29udGlndW91cyBzcGFjZSwgdGhlbgorLy8gbWFzayBvdXQgbG93ZXIgYWRkcmVzcyBiaXRzLgorLy8gV2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorLy8gICBhbGxvY0JvdW5kYXJ5IC0gY29tcGlsZXIvcGxhdGZvcm0gc3BlY2lmaWMgYWRkcmVzcyBhbGlnbm1lbnQKKy8vICAgICAgICAgICAgICAgICAgIGluIG51bWJlciBvZiBieXRlcyAoZGVmYXVsdCBpcyBzaW5nbGUgYnl0ZTsgaS5lLiAxKQorLy8gICBuX2FsbG9jICAgICAgIC0gbnVtYmVyIG9mIGJ5dGVzIGFwcGxpY2F0aW9uIHdhbnRzIEAgYWxpZ25lZCBhZGRyZXNzCisvLyAgIGFiICAgICAgICAgICAgLSBhbGlnbm1lbnQgYm91bmRhcnksIGluIGJ5dGVzIChlLmcuIDQsIDMyLCAuLi4pCisvLyAgIHRfYWxsb2MgICAgICAgLSB0b3RhbCBhbGxvY2F0aW9uIG5lZWRlZCB0byBlbnN1cmUgZGVzaXJlZCBib3VuZGFyeQorLy8gICBtYXNrICAgICAgICAgIC0gdG8gY2xlYXIgbGVhc3Qgc2lnbmlmaWNhbnQgYWRkcmVzcyBiaXRzIGZvciBib3VuZGFyeQorLy8gICBDb21wdXRlOgorLy8gICB0X2FsbG9jID0gbl9hbGxvYyArIChhYiAtIGFsbG9jQm91bmRhcnkpCisvLyAgIGFsbG9jYXRlIHRfYWxsb2MgYnl0ZXMgQCBhbGxvY19hZGRyZXNzCisvLyAgIG1hc2sgPSAgTk9UIChhYiAtIDEpCisvLyAgICAgICAoZS5nLiBpZiBhYj0zMiAgXzAwMDEgMTExMSAgLT4gXzExMTAgMDAwMAorLy8gICBhbGlnbmVkX2FkZHJlc3MgPSBhbGxvY19hZGRyZXNzICYgbWFzaworLy8gICBzZXQgbl9hbGxvYyBieXRlcyB0byAwCisvLyAgIHJldHVybiBhbGlnbmVkX2FkZHJlc3MgKE5VTEwgaWYgZmFpbGVkKQorLy8KKy8vIElmIHUzMl9BbGlnbmVkQWRkcmVzcyBpcyBub24temVybywgdGhlbiBzZWFyY2ggZm9yIEJhc2VBZGRyZXNzIChzdG9yZWQKKy8vIGZyb20gcHJldmlvdXMgYWxsb2NhdGlvbikuICBJZiBmb3VuZCwgaW52b2tlIGNhbGwgdG8gRlJFRSB0aGUgbWVtb3J5LgorLy8gUmV0dXJuIE5VTEwgaWYgQmFzZUFkZHJlc3Mgbm90IGZvdW5kCisKKy8vIHdlIG5lZWQgYWJvdXQgOCBhbGxvY2F0aW9ucyBwZXIgSEJBLiAgRmlndXJpbmcgYXQgbW9zdCAxMCBIQkFzIHBlciBzZXJ2ZXIKKy8vIHNpemUgdGhlIGR5bmFtaWNfbWVtIGFycmF5IGF0IDgwLgorCit2b2lkKiBmY01lbU1hbmFnZXIoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBBTElHTkVEX01FTSAqZHluYW1pY19tZW0sIAorCQkgICBVTE9ORyBuX2FsbG9jLCBVTE9ORyBhYiwgVUxPTkcgdTMyX0FsaWduZWRBZGRyZXNzLAorCQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSkKK3sKKyAgVVNIT1JUIGFsbG9jQm91bmRhcnk9MTsgICAvLyBjb21waWxlciBzcGVjaWZpYyAtIHdvcnN0IGNhc2UgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3QgY2FzZSAtIHJlcGxhY2UgbWFsbG9jKCkgY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggZnVuY3Rpb24gdGhhdCBhbGxvY2F0ZXMgZXhhY3RseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGRlc2lyZWQgYm91bmRhcnkKKworICB1bnNpZ25lZCBsb25nIHVsQWRkcmVzczsKKyAgVUxPTkcgdF9hbGxvYywgaTsKKyAgdm9pZCAqYWxsb2NfYWRkcmVzcyA9IDA7ICAvLyBkZWYuIGVycm9yIGNvZGUgLyBhZGRyZXNzIG5vdCBmb3VuZAorICBMT05HIG1hc2s7ICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMzItYml0cyB3aWRlIQorCisgIEVOVEVSKCJmY01lbU1hbmFnZXIiKTsKKyAgaWYoIHUzMl9BbGlnbmVkQWRkcmVzcyApICAgICAgICAgIC8vIGFyZSB3ZSBmcmVlaW5nIGV4aXN0aW5nIG1lbW9yeT8KKyAgeworLy8gICAgcHJpbnRrKCIgZnJlZWluZyBBbGlnbmVkQWRkcmVzcyAlWGhcbiIsIHUzMl9BbGlnbmVkQWRkcmVzcyk7CisgICAgZm9yKCBpPTA7IGk8RFlOQU1JQ19BTExPQ0FUSU9OUzsgaSsrKSAvLyBsb29rIGZvciB0aGUgYmFzZSBhZGRyZXNzCisgICAgeworLy8gICAgcHJpbnRrKCJkeW5hbWljX21lbVsldV0uQWxpZ25lZEFkZHJlc3MgJWxYXG4iLCBpLCBkeW5hbWljX21lbVtpXS5BbGlnbmVkQWRkcmVzcyk7CisgICAgICBpZiggZHluYW1pY19tZW1baV0uQWxpZ25lZEFkZHJlc3MgPT0gdTMyX0FsaWduZWRBZGRyZXNzICkKKyAgICAgIHsKKyAgICAgICAgYWxsb2NfYWRkcmVzcyA9IGR5bmFtaWNfbWVtW2ldLkJhc2VBbGxvY2F0ZWQ7IC8vICdzdWNjZXNzJyBzdGF0dXMKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsZHluYW1pY19tZW1baV0uc2l6ZSwgCisJCQkJYWxsb2NfYWRkcmVzcywgCisJCQkJZHluYW1pY19tZW1baV0uZG1hX2hhbmRsZSk7CisgICAgICAgIGR5bmFtaWNfbWVtW2ldLkJhc2VBbGxvY2F0ZWQgPSAwOyAgIC8vIGNsZWFyIGZvciBuZXh0IHVzZQorICAgICAgICBkeW5hbWljX21lbVtpXS5BbGlnbmVkQWRkcmVzcyA9IDA7CisgICAgICAgIGR5bmFtaWNfbWVtW2ldLnNpemUgPSAwOworICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWl0IGZvciBsb29wOyBkb25lCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYoIG5fYWxsb2MgKSAgICAgICAgICAgICAgICAgICAvLyB3YW50IG5ldyBtZW1vcnk/CisgIHsKKyAgICBkbWFfYWRkcl90IGhhbmRsZTsKKyAgICB0X2FsbG9jID0gbl9hbGxvYyArIChhYiAtIGFsbG9jQm91bmRhcnkpOyAvLyBwYWQgYnl0ZXMgZm9yIGFsaWdubWVudAorLy8gICAgcHJpbnRrKCJwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZvciBUYWNoIGFsaWdubWVudDogJWxkIGJ5dGVzXG4iLCB0X2FsbG9jKTsKKworLy8gKHdvdWxkIGxpa2UgdG8pIGFsbG93IHRocmVhZCBibG9jayB0byBmcmVlIHBhZ2VzIAorICAgIGFsbG9jX2FkZHJlc3MgPSAgICAgICAgICAgICAgICAgIC8vIHRvdGFsIGJ5dGVzIChOdW1iZXJPZkJ5dGVzKQorICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgdF9hbGxvYywgJmhhbmRsZSk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IG1hc2sgb2ZmIGxlYXN0IHNpZy4gYml0cyBvZiBhZGRyZXNzCisgICAgaWYoIGFsbG9jX2FkZHJlc3MgKSAgICAgICAgICAgLy8gKG9ubHkgaWYgbm9uLU5VTEwpCisgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgcGxhY2UgdG8gc3RvcmUgcHRyLCBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBmcmVlIGl0IGxhdGVyLi4uCisKKyAgICAgIG1hc2sgPSAoTE9ORykoYWIgLSAxKTsgICAgICAgICAgICAvLyBtYXNrIGFsbCBsb3ctb3JkZXIgYml0cworICAgICAgbWFzayA9IH5tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZlcnQgYml0cworICAgICAgZm9yKCBpPTA7IGk8RFlOQU1JQ19BTExPQ0FUSU9OUzsgaSsrKSAvLyBsb29rIGZvciBmcmVlIHNsb3QKKyAgICAgIHsKKyAgICAgICAgaWYoIGR5bmFtaWNfbWVtW2ldLkJhc2VBbGxvY2F0ZWQgPT0gMCkgLy8gdGFrZSAxc3QgYXZhaWxhYmxlCisgICAgICAgIHsKKyAgICAgICAgICBkeW5hbWljX21lbVtpXS5CYXNlQWxsb2NhdGVkID0gYWxsb2NfYWRkcmVzczsvLyBhZGRyZXNzIGZyb20gTy9TCisgICAgICAgICAgZHluYW1pY19tZW1baV0uZG1hX2hhbmRsZSA9IGhhbmRsZTsKKwkgIGlmIChkbWFfaGFuZGxlICE9IE5VTEwpIAorCSAgeworLy8gICAgICAgICAgICAgcHJpbnRrKCJoYW5kbGUgPSAlcCwgYWI9JWQsIGJvdW5kYXJ5ID0gJWQsIG1hc2s9MHglMDh4XG4iLCAKKy8vCQkJaGFuZGxlLCBhYiwgYWxsb2NCb3VuZGFyeSwgbWFzayk7CisJICAgICpkbWFfaGFuZGxlID0gKGRtYV9hZGRyX3QpIAorCQkoKCgoVUxPTkcpaGFuZGxlKSArIChhYiAtIGFsbG9jQm91bmRhcnkpKSAmIG1hc2spOworCSAgfQorICAgICAgICAgIGR5bmFtaWNfbWVtW2ldLnNpemUgPSB0X2FsbG9jOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB1bEFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylhbGxvY19hZGRyZXNzOworICAgICAgCisgICAgICB1bEFkZHJlc3MgKz0gKGFiIC0gYWxsb2NCb3VuZGFyeSk7ICAgIC8vIGFkZCB0aGUgYWxpZ25tZW50IGJ5dGVzLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRydW5jYXRlIGFkZHJlc3MuLi4KKyAgICAgIGFsbG9jX2FkZHJlc3MgPSAodm9pZCopKHVsQWRkcmVzcyAmIG1hc2spOworICAgICAgCisgICAgICBkeW5hbWljX21lbVtpXS5BbGlnbmVkQWRkcmVzcyA9IAorCShVTE9ORykodWxBZGRyZXNzICYgbWFzayk7IC8vIDMyYml0IFRhY2ggYWRkcmVzcworICAgICAgbWVtc2V0KCBhbGxvY19hZGRyZXNzLCAwLCBuX2FsbG9jICk7ICAvLyBjbGVhciBuZXcgbWVtb3J5CisgICAgfQorICAgIGVsc2UgIC8vIE8vUyBkeW5hbWljIG1lbSBhbGxvYyBmYWlsZWQhCisgICAgICBhbGxvY19hZGRyZXNzID0gMDsgIC8vIChmb3IgZGVidWdnaW5nIGJyZWFrcHQpCisKKyAgfQorCisgIExFQVZFKCJmY01lbU1hbmFnZXIiKTsKKyAgcmV0dXJuIGFsbG9jX2FkZHJlc3M7ICAvLyBnb29kIChvciBOVUxMKSBhZGRyZXNzCit9CisKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLmRldGVjdCAgICAgICAgICAgICAgICAgPSBjcHFmY1RTX2RldGVjdCwKKwkucmVsZWFzZSAgICAgICAgICAgICAgICA9IGNwcWZjVFNfcmVsZWFzZSwKKwkuaW5mbyAgICAgICAgICAgICAgICAgICA9IGNwcWZjVFNfaW5mbywKKwkucHJvY19pbmZvICAgICAgICAgICAgICA9IGNwcWZjVFNfcHJvY19pbmZvLAorCS5pb2N0bCAgICAgICAgICAgICAgICAgID0gY3BxZmNUU19pb2N0bCwKKwkucXVldWVjb21tYW5kICAgICAgICAgICA9IGNwcWZjVFNfcXVldWVjb21tYW5kLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciAgID0gY3BxZmNUU19laF9kZXZpY2VfcmVzZXQsCisJLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgPSBjcHFmY1RTX2VoX2Fib3J0LCAKKwkuYmlvc19wYXJhbSAgICAgICAgICAgICA9IGNwcWZjVFNfYmlvc3BhcmFtLCAKKwkuY2FuX3F1ZXVlICAgICAgICAgICAgICA9IENQUUZDVFNfUkVRX1FVRVVFX0xFTiwKKwkudGhpc19pZCAgICAgICAgICAgICAgICA9IC0xLCAKKwkuc2dfdGFibGVzaXplICAgICAgICAgICA9IFNHX0FMTCwgCisJLmNtZF9wZXJfbHVuICAgICAgICAgICAgPSBDUFFGQ1RTX0NNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZyAgICAgICAgID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW9jdGwuaCBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjU1MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2NwcWZjVFNpb2N0bC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vIGZvciB1c2VyIGFwcHMsIG1ha2Ugc3VyZSBkYXRhIHNpemUgdHlwZXMgYXJlIGRlZmluZWQKKy8vIHdpdGggCisKKworI2RlZmluZSBDQ1BRRkNUU19JT0NfTUFHSUMgJ1onCisKK3R5cGVkZWYgc3RydWN0IAoreworICBfX3U4IGJ1czsKKyAgX191OCBkZXZfZm47CisgIF9fdTMyIGJvYXJkX2lkOworfSBjcHFmY19wY2lfaW5mb19zdHJ1Y3Q7CisKK3R5cGVkZWYgX191MzIgRHJpdmVyVmVyX3R5cGU7CisvKgordHlwZWRlZiB1bmlvbgoreworICBzdHJ1Y3QgIC8vIFBlcmlwaGVyYWwgVW5pdCBEZXZpY2UKKyAgeyAKKyAgICBfX3U4IEJ1czo2OworICAgIF9fdTggTW9kZToyOyAgLy8gYjAwCisgICAgX191OCBEZXY7CisgIH0gUGVyaXBEZXY7CisgIHN0cnVjdCAgLy8gVm9sdW1lIFNldCBBZGRyZXNzCisgIHsgCisgICAgX191OCBEZXZNU0I6NjsKKyAgICBfX3U4IE1vZGU6MjsgIC8vIGIwMQorICAgIF9fdTggRGV2TFNCOworICB9IExvZ0RldjsKKyAgc3RydWN0ICAvLyBMb2dpY2FsIFVuaXQgRGV2aWNlIChTQ1NJLTMsIFNDQy0yIGRlZmluZWQpCisgIHsgCisgICAgX191OCBUYXJnOjY7CisgICAgX191OCBNb2RlOjI7ICAvLyBiMTAKKyAgICBfX3U4IERldjo1OworICAgIF9fdTggQnVzOjM7CisKKyAgfSBMb2dVbml0OworfSBTQ1NJM0FkZHJfc3RydWN0OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFNDU0kzQWRkcl9zdHJ1Y3QgRkNQX05leHVzOworICBfX3U4IGNkYlsxNl07Cit9IFBhc3NUaHJ1X0NvbW1hbmRfc3RydWN0OworKi8KKworLyogdGhpcyBpcyBuZWFybHkgZHVwbGljYXRlZCBpbiBpZGFzaGFyZS5oICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGludAlsYzsgICAgCQkvKiBDb250cm9sbGVyIG51bWJlciAqLworICBpbnQJbm9kZTsJCS8qIE5vZGUgKGJveCkgbnVtYmVyICovCisgIGludAlsZDsJCS8qIExvZ2ljYWwgRHJpdmUgb24gdGhpcyBib3gsIGlmIHJlcXVpcmVkICovCisgIF9fdTMyIG5leHVzOyAgICAgICAgICAvKiBTQ1NJIE5leHVzICovCisgIHZvaWQJKmFyZ3A7CQkvKiBBcmd1bWVudCBwb2ludGVyICovCit9IFZFTkRPUl9JT0NUTF9SRVE7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyCWNkYlsxNl07CS8qIFNDU0kgQ0RCIGZvciB0aGUgcGFzcy10aHJvdWdoICovCisgIHVzaG9ydCBidXM7CQkvKiBUYXJnZXQgYnVzIG9uIHRoZSBib3ggKi8KKyAgdXNob3J0IHBkcml2ZTsJLyogUGh5c2ljYWwgZHJpdmUgb24gdGhlIGJveCAqLworICBpbnQgbGVuOyAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBkYXRhIGFyZWEgb2YgdGhlIENEQiAqLworICBpbnQgc2Vuc2VfbGVuOwkvKiBMZW5ndGggb2YgdGhlIHNlbnNlIGRhdGEgKi8KKyAgY2hhciBzZW5zZV9kYXRhWzQwXTsgIC8qIFNlbnNlIGRhdGEgKi8KKyAgdm9pZCAqYnVmcDsJCS8qIERhdGEgYXJlYSBmb3IgdGhlIENEQiAqLworICBjaGFyIHJ3X2ZsYWc7CQkvKiBSZWFkIENEQiBvciBXcml0ZSBDREIgKi8KK30gY3BxZmNfcGFzc3RocnVfdDsKKworLyoKKyoqIERlZmluZXMgZm9yIHRoZSBJT0NUTFMuCisqLworCisjZGVmaW5lIFZFTkRPUl9SRUFEX09QQ09ERQkJCTB4MjYKKyNkZWZpbmUgVkVORE9SX1dSSVRFX09QQ09ERQkJCTB4MjcKKworI2RlZmluZSBDUFFGQ1RTX0dFVFBDSUlORk8gX0lPUiggQ0NQUUZDVFNfSU9DX01BR0lDLCAxLCBjcHFmY19wY2lfaW5mb19zdHJ1Y3QpCisjZGVmaW5lIENQUUZDVFNfR0VURFJJVlZFUiBfSU9SKCBDQ1BRRkNUU19JT0NfTUFHSUMsIDksIERyaXZlclZlcl90eXBlKQorCisjZGVmaW5lIENQUUZDVFNfU0NTSV9QQVNTVEhSVSBfSU9XUiggQ0NQUUZDVFNfSU9DX01BR0lDLDExLCBWRU5ET1JfSU9DVExfUkVRKQorCisvKiBXZSB3b3VsZCByYXRoZXIgaGF2ZSBlcXVpdmFsZW50IGdlbmVyaWMsIGxvdy1sZXZlbCBkcml2ZXIgYWdub3N0aWMgCitpb2N0bHMgdGhhdCBkbyB3aGF0IENQUUZDX0lPQ1RMX0ZDX1RBUkdFVF9BRERSRVNTIGFuZCAKK0NQUUZDX0lPQ1RMX0ZDX1REUiAweDUzODggZG8sIGJ1dCBjdXJyZW50bHksIHdlIGRvIG5vdCBoYXZlIHRoZW0sIAorY29uc2VxdWVudGx5IGFwcGxpY2F0aW9ucyB3b3VsZCBoYXZlIHRvIGtub3cgdGhleSBhcmUgdGFsa2luZyB0byBjcHFmYy4gKi8KKyAgIAorLyogVXNlZCB0byBnZXQgRmlicmUgQ2hhbm5lbCBXV04gYW5kIHBvcnRfaWQgZnJvbSBkZXZpY2UgKi8KKy8vICNkZWZpbmUgQ1BRRkNfSU9DVExfRkNfVEFSR0VUX0FERFJFU1MgMHg1Mzg3CisjZGVmaW5lIENQUUZDX0lPQ1RMX0ZDX1RBUkdFVF9BRERSRVNTIFwKKwlfSU9SKCBDQ1BRRkNUU19JT0NfTUFHSUMsIDEzLCBTY3NpX0ZDVGFyZ0FkZHJlc3MpCisKKy8qIFVzZWQgdG8gaW52b2tlIFRhcmdldCBEZWZpY2UgUmVzZXQgZm9yIEZpYnJlIENoYW5uZWwgKi8KKy8vICNkZWZpbmUgQ1BRRkNfSU9DVExfRkNfVERSIDB4NTM4OAorI2RlZmluZSBDUFFGQ19JT0NUTF9GQ19URFIgX0lPKCBDQ1BRRkNUU19JT0NfTUFHSUMsIDE1KQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU3N0cnVjdHMuaCBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTc3RydWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYWUzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3N0cnVjdHMuaApAQCAtMCwwICsxLDE1MzAgQEAKKy8qIENvcHlyaWdodChjKSAyMDAwLCBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24KKyAqIEZpYnJlIENoYW5uZWwgSG9zdCBCdXMgQWRhcHRlciA2NC1iaXQsIDY2TUh6IFBDSSAKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgb246CisgKiAoZnJvbnQpOiBbY2hpcF0gVGFjaHlvbiBUUyBIUEZDLTUxNjZBLzEuMiAgTDJDMTA5MCAuLi4KKyAqICAgICAgICAgIFNQIyBQMjI1Q1hDQkZJRUw2VCwgUmV2IFhDCisgKiAgICAgICAgICBTUCMgMTYxMjkwLTAwMSwgUmV2IFhECisgKiAoYmFjayk6IEJvYXJkIE5vLiAwMTAwMDgtMDAxIEEvVyBSZXYgWDUsIEZBQiBSRVYgWDUKKyAqICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFdyaXR0ZW4gYnkgRG9uIFppbW1lcm1hbgorKi8KKyNpZm5kZWYgQ1BRRkNUU1NUUlVDVFNfSAorI2RlZmluZSBDUFFGQ1RTU1RSVUNUU19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPiAgLy8gdGltZXIgZGVjbGFyYXRpb24gaW4gb3VyIGhvc3QgZGF0YQorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlICJjcHFmY1RTaW9jdGwuaCIKKworI2RlZmluZSBEYmdEZWxheShzZWNzKSB7IGludCB3YWl0X3RpbWU7IHByaW50ayggIiBEYmdEZWxheSAlZHMgIiwgc2Vjcyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHdhaXRfdGltZT1qaWZmaWVzICsgKHNlY3MqSFopOyBcCisJCSAgICAgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHdhaXRfdGltZSkgOykgOyB9CisKKyNkZWZpbmUgQ1BRRkNUU19EUklWRVJfVkVSKG1haixtaW4sc3VibWluKSAoKG1hajw8MTYpfChtaW48PDgpfChzdWJtaW4pKQorLy8gZG9uJ3QgZm9yZ2V0IHRvIGFsc28gY2hhbmdlIE1PRFVMRV9ERVNDUklQVElPTiBpbiBjcHFmY1RTaW5pdC5jCisjZGVmaW5lIFZFUl9NQUpPUiAyCisjZGVmaW5lIFZFUl9NSU5PUiA1CisjZGVmaW5lIFZFUl9TVUJNSU5PUiA0CisKKy8vIE1hY3JvcyBmb3Iga2VybmVsIChlc3AuIFNNUCkgdHJhY2luZyB1c2luZyBhIFBDSSBhbmFseXplcgorLy8gKGUuZy4geDg2KS4KKy8vI2RlZmluZSBQQ0lfS0VSTkVMX1RSQUNFCisjaWZkZWYgUENJX0tFUk5FTF9UUkFDRQorI2RlZmluZSBQQ0lfVFJBQ0UoeCkgaW5sKCBmY0NoaXAtPlJlZ2lzdGVycy5JT0Jhc2VMICt4KTsKKyNkZWZpbmUgUENJX1RSQUNFTyh4LHkpIG91dGwoIHgsIChmY0NoaXAtPlJlZ2lzdGVycy5JT0Jhc2VMICt5KSk7CisjZWxzZQorCisjZGVmaW5lIFBDSV9UUkFDRSh4KSAKKyNkZWZpbmUgUENJX1RSQUNFTyh4LHkpCisjZW5kaWYKKworCQkJIAorLy8jZGVmaW5lIERFQlVHX0NNTkQgMSAgIC8vIGRlYnVnIG91dHB1dCBmb3IgTGludXggU2NzaSBDREJzCisvLyNkZWZpbmUgRFVNTVlDTU5EX0RCRyAxCisKKy8vI2RlZmluZSBERUJVR19DUFFGQ1RTIDEKKy8vI3VuZGVmIERFQlVHX0NQUUZDVFMgCisjaWZkZWYgREVCVUdfQ1BRRkNUUworI2RlZmluZSBFTlRFUih4KQlwcmludGsoImNwcWZjdHMgOiBlbnRlcmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgTEVBVkUoeCkJcHJpbnRrKCJjcHFmY3RzIDogbGVhdmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgREVCVUcoeCkJeAorI2Vsc2UKKyNkZWZpbmUgRU5URVIoeCkKKyNkZWZpbmUgTEVBVkUoeCkKKyNkZWZpbmUgREVCVUcoeCkKKyNlbmRpZgkJCQkvKiBERUJVR19DUFFGQ1RTICovCisKKy8vI2RlZmluZSBERUJVR19DUFFGQ1RTX1BDSSAxCisvLyN1bmRlZiBERUJVR19DUFFGQ1RTX1BDSQorI2lmIERFQlVHX0NQUUZDVFNfUENJCisjZGVmaW5lIERFQlVHX1BDSSh4KQl4CisjZWxzZQorI2RlZmluZSBERUJVR19QQ0koeCkKKyNlbmRpZgkJCQkvKiBERUJVR19DUFFGQ1RTX1BDSSAqLworCisjZGVmaW5lIFNUQUNITElURTY2X1RTMTIgICJDb21wYXEgRmlicmVDaGFubmVsIEhCQSBUYWNoeW9uIFRTIEhQRkMtNTE2NkEvMS4yIgorI2RlZmluZSBTVEFDSExJVEU2Nl9UUzEzICAiQ29tcGFxIEZpYnJlQ2hhbm5lbCBIQkEgVGFjaHlvbiBUUyBIUEZDLTUxNjZBLzEuMyIKKyNkZWZpbmUgU1RBQ0hMSVRFX1VOS05PV04gIkNvbXBhcSBGaWJyZUNoYW5uZWwgSEJBIFRhY2h5b24gQ2hpcC9Cb2FyZCBWZXI/PyIKKyNkZWZpbmUgU0FHSUxFTlRfWEwyXzIxICAgIkFnaWxlbnQgRkMgSEJBLCBUYWNoeW9uIFhMMiBIUEZDLTUyMDBCLzIuMSIKKworLy8gUERBIGlzIFBlcmlwaGVyYWwgRGV2aWNlIEFkZHJlc3MsIFZTQSBpcyBWb2x1bWUgU2V0IEFkZHJlc3NpbmcKKy8vIExpbnV4IFNDU0kgcGFyYW1ldGVycworI2RlZmluZSBDUFFGQ1RTX01BWF9UQVJHRVRfSUQgNjQKKworLy8gTm90ZSwgY2hhbmdpbmcgQ1BRRkNUU19NQVhfTFVOIHRvIGxlc3MgdGhhbiAzMiAoZS5nLCA4KSB3aWxsIHJlc3VsdCBpbgorLy8gc3RyYW5nZSBiZWhhdmlvciBpZiBhIGJveCB3aXRoIG1vcmUgdGhhbiwgZS5nLiA4LCBpcyBvbiB0aGUgbG9vcC4KKyNkZWZpbmUgQ1BRRkNUU19NQVhfTFVOIDMyICAgIC8vIFRoZSBSQS00eDAwIHN1cHBvcnRzIDMyIChMaW51eCBTQ1NJIHN1cHBvcnRzIDgpCisjZGVmaW5lIENQUUZDVFNfTUFYX0NIQU5ORUwgMCAvLyBPbmUgRkMgcG9ydCBvbiBjcHFmY1RTIEhCQQorCisjZGVmaW5lIENQUUZDVFNfQ01EX1BFUl9MVU4gMTUgLy8gcG93ZXIgb2YgMiAtMSwgbXVzdCBiZSA+MCAKKyNkZWZpbmUgQ1BRRkNUU19SRVFfUVVFVUVfTEVOIChUQUNIX1NFU1RfTEVOLzIpIC8vIG11c3QgYmUgPCBUQUNIX1NFU1RfTEVOCisKKyNkZWZpbmUgTGludXhWZXJzaW9uQ29kZSh2LCBwLCBzKSAoKCh2KTw8MTYpKygocCk8PDgpKyhzKSkKKyNpZm5kZWYgREVDTEFSRV9NVVRFWF9MT0NLRUQKKyNkZWZpbmUgREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKSBzdHJ1Y3Qgc2VtYXBob3JlIHNlbSA9IE1VVEVYX0xPQ0tFRAorI2VuZGlmCisKKyNkZWZpbmUgREVWX05BTUUgImNwcWZjVFMiCisKK3N0cnVjdCBTdXBwb3J0ZWRQQ0ljYXJkcworeworICBfX3UxNiB2ZW5kb3JfaWQ7CisgIF9fdTE2IGRldmljZV9pZDsKK307CisJCQkgCisvLyBubjpubiBkZW5vdGVzIGJpdCBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhY2h5b25IZWFkZXIgc3RydWN0IGRlZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmllbGRzIHNoYXJlZCB3aXRoIE9EQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gaGF2ZSBzYW1lIHZhbHVlCisKKworCisKKyNpZm5kZWYgQllURQorLy90eXBlZGVmIFVDSEFSIEJZVEU7Cit0eXBlZGVmIF9fdTggQllURTsKKyNlbmRpZgorI2lmbmRlZiBVQ0hBUgordHlwZWRlZiBfX3U4IFVDSEFSOworI2VuZGlmCisjaWZuZGVmIExPTkcKK3R5cGVkZWYgX19zMzIgTE9ORzsKKyNlbmRpZgorI2lmbmRlZiBVTE9ORwordHlwZWRlZiBfX3UzMiBVTE9ORzsKKyNlbmRpZgorI2lmbmRlZiBQVk9JRAordHlwZWRlZiB2b2lkICogUFZPSUQ7CisjZW5kaWYKKyNpZm5kZWYgVVNIT1JUCit0eXBlZGVmIF9fdTE2IFVTSE9SVDsKKyNlbmRpZgorI2lmbmRlZiBCT09MRUFOCit0eXBlZGVmIF9fdTggQk9PTEVBTjsKKyNlbmRpZgorCisKKy8vIG1hY3JvIGZvciBGQy1QSCByZWplY3QgY29kZXMKKy8vIHBheWxvYWQgZm9ybWF0IGZvciBMU19SSlQgKEZDIHBheWxvYWRzIGFyZSBiaWcgZW5kaWFuKToKKy8vICAgICBieXRlICAwICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAoTVNCKQorLy8gRFdPUkQgMCAgIDAxICAgICAgICAwMCAgICAgICAgMDAgICAgICAgIDAwCisvLyBEV09SRCAxICAgcmVzdmQgICAgIGNvZGUgICAgICBleHBsLiAgICAgdmVuZG9yCisKKyNkZWZpbmUgTFNfUkpUX1JFQVNPTiggY29kZSwgZXhwbCkgKCggY29kZTw8OCkgfCAoZXhwbCA8PDE2KSkKKworCisjZGVmaW5lIFRhY2hMaXRlU1RBVFVTIDB4MTIKKworLy8gRmlicmUgQ2hhbm5lbCBFWENIQU5HRSBzdGF0dXMgY29kZXMgZm9yIFRhY2h5b24gY2hpcHMvIGRyaXZlciBzb2Z0d2FyZQorLy8gMzItYml0IEVSUk9SIHdvcmQgZGVmaW5lcworI2RlZmluZSBJTlZBTElEX0FSR1MgMHgxCisjZGVmaW5lIExOS0RXTl9PU0xTICAweDIKKyNkZWZpbmUgTE5LRFdOX0xBU0VSIDB4NAorI2RlZmluZSBPVVRRVUVfRlVMTCAgMHg4CisjZGVmaW5lIERSSVZFUlFfRlVMTCAweDEwCisjZGVmaW5lIFNFU1RfRlVMTCAgICAweDIwCisjZGVmaW5lIEJBRF9BTFBBICAgICAweDQwCisjZGVmaW5lIE9WRVJGTE9XICAgICAweDgwICAvLyBpbmJvdW5kIENNCisjZGVmaW5lIENPVU5UX0VSUk9SICAgICAweDEwMCAgLy8gaW5ib3VuZCBDTQorI2RlZmluZSBMSU5LRkFJTF9SWCAgICAgMHgyMDAgIC8vIGluYm91bmQgQ00KKyNkZWZpbmUgQUJPUlRTRVFfTk9USUZZIDB4NDAwICAvLyBvdXRib3VuZCBDTQorI2RlZmluZSBMSU5LRkFJTF9UWCAgICAgMHg4MDAgIC8vIG91dGJvdW5kIENNCisjZGVmaW5lIEhPU1RQUk9HX0VSUiAgICAgMHgxMDAwICAvLyBvdXRib3VuZCBDTQorI2RlZmluZSBGUkFNRV9UTyAgICAgICAgIDB4MjAwMCAgLy8gb3V0Ym91bmQgQ00KKyNkZWZpbmUgSU5WX0VOVFJZICAgICAgICAweDQwMDAgIC8vIG91dGJvdW5kIENNCisjZGVmaW5lIFNFU1RQUk9HX0VSUiAgICAgMHg4MDAwICAvLyBvdXRib3VuZCBDTQorI2RlZmluZSBPVVRCT1VORF9USU1FT1VUIDB4MTAwMDBMIC8vIHRpbWVvdXQgd2FpdGluZyBmb3IgVGFjaHlvbiBvdXRib3VuZCBDTQorI2RlZmluZSBJTklUSUFUT1JfQUJPUlQgIDB4MjAwMDBMIC8vIGluaXRpYXRvciBleGNoYW5nZSB0aW1lb3V0IG9yIE8vUyBBQk9SVAorI2RlZmluZSBNRU1QT09MX0ZBSUwgICAgIDB4NDAwMDBMIC8vIE8vUyBtZW1vcnkgcG9vbCBhbGxvY2F0aW9uIGZhaWxlZAorI2RlZmluZSBGQzJfVElNRU9VVCAgICAgIDB4ODAwMDBMIC8vIGRyaXZlciB0aW1lb3V0IGZvciBsb3N0IGZyYW1lcworI2RlZmluZSBUQVJHRVRfQUJPUlQgICAgIDB4MTAwMDAwTCAvLyBBQlRTIHJlY2VpdmVkIGZyb20gRkMgcG9ydAorI2RlZmluZSBFWENIQU5HRV9RVUVVRUQgIDB4MjAwMDAwTCAvLyBlLmcuIExpbmsgU3RhdGUgd2FzIExEbiBvbiBmY1N0YXJ0CisjZGVmaW5lIFBPUlRJRF9DSEFOR0VEICAgMHg0MDAwMDBMIC8vIGZjIFBvcnQgYWRkcmVzcyBjaGFuZ2VkCisjZGVmaW5lIERFVklDRV9SRU1PVkVEICAgMHg4MDAwMDBMIC8vIGZjIFBvcnQgYWRkcmVzcyBjaGFuZ2VkCisvLyBTZXZlcmFsIGVycm9yIHNjZW5hcmlvcyByZXN1bHQgaW4gU0VTVCBFeGNoYW5nZSBmcmFtZXMgCisvLyB1bmV4cGVjdGVkbHkgYXJyaXZpbmcgaW4gdGhlIFNGUQorI2RlZmluZSBTRlFfRlJBTUUgICAgICAgIDB4MTAwMDAwMEwgLy8gU0ZRIGZyYW1lcyBmcm9tIG9wZW4gRXhjaGFuZ2UKKworLy8gTWF4aW11bSBudW1iZXIgb2YgSG9zdCBCdXMgQWRhcHRlcnMgKEhCQSkgLyBjb250cm9sbGVycyBzdXBwb3J0ZWQKKy8vIG9ubHkgaW1wb3J0YW50IGZvciBtZW0gYWxsb2NhdGlvbiBkaW1lbnNpb25zIC0gaW5jcmVhc2UgYXMgbmVjZXNzYXJ5CisKKyNkZWZpbmUgTUFYX0FEQVBURVJTIDgKKyNkZWZpbmUgTUFYX1JYX1BBWUxPQUQgMTAyNCAgLy8gaGFyZHdhcmUgZGVwZW5kZW50IG1heCBmcmFtZSBwYXlsb2FkCisvLyBUYWNoIGhlYWRlciBzdHJ1YyBkZWZpbmVzCisjZGVmaW5lIFNPRmkzIDB4NworI2RlZmluZSBTT0ZmICAweDgKKyNkZWZpbmUgU09GbjMgMHhCCisjZGVmaW5lIEVPRm4gIDB4NQorI2RlZmluZSBFT0Z0ICAweDYKKworLy8gRkNQIFJfQ1RMIGRlZmluZXMKKyNkZWZpbmUgRkNQX0NNTkQgMHg2CisjZGVmaW5lIEZDUF9YRkVSX1JEWSAweDUKKyNkZWZpbmUgRkNQX1JTUCAweDcKKyNkZWZpbmUgRkNQX1JFU1BPTlNFIDB4Nzc3IC8vIChhcmJpdHJhcnkgIykKKyNkZWZpbmUgTkVFRF9GQ1BfUlNQIDB4NzcgIC8vIChhcmJpdHJhcnkgIykKKyNkZWZpbmUgRkNQX0RBVEEgMHgxCisKKyNkZWZpbmUgUkVTRVRfVEFDSCAweDEwMCAvLyBSZXNldCBUYWNoeW9uL1RhY2hMaXRlCisjZGVmaW5lIFNDU0lfSVdFIDB4MjAwMCAgLy8gaW5pdGlhdG9yIHdyaXRlIGVudHJ5IChmb3IgU0VTVCkKKyNkZWZpbmUgU0NTSV9JUkUgMHgzMDAwICAvLyBpbml0aWF0b3IgcmVhZCBlbnRyeSAoZm9yIFNFU1QpCisjZGVmaW5lIFNDU0lfVFJFIDB4NDAwICAvLyB0YXJnZXQgcmVhZCBlbnRyeSAoZm9yIFNFU1QpCisjZGVmaW5lIFNDU0lfVFdFIDB4NTAwICAvLyB0YXJnZXQgd3JpdGUgZW50cnkgKGZvciBTRVNUKQorI2RlZmluZSBUT0dHTEVfTEFTRVIgMHg4MDAKKyNkZWZpbmUgTElQIDB4OTAwCisjZGVmaW5lIENMRUFSX0ZDUE9SVFMgOTkgLy8gKGFyYml0cmFyeSAjKSBmcmVlIG1lbSBmb3IgTG9nZ2VkIGluIHBvcnRzCisjZGVmaW5lIEZNSU5JVCAweDcwNyAgICAgLy8gKGFyYml0cmFyeSkgZm9yIEZyYW1lIE1hbmFnZXIgSW5pdCBjb21tYW5kCisKKy8vIEJMUyA9PSBCYXNpYyBMaW5rIFNlcnZpY2UKKy8vIEVMUyA9PSBFeHRlbmRlZCBMaW5rIFNlcnZpY2UKKyNkZWZpbmUgQkxTX05PUCA0CisjZGVmaW5lIEJMU19BQlRTIDB4MTAgICAvLyBGQy1QSCBCYXNpYyBMaW5rIFNlcnZpY2UgQWJvcnQgU2VxdWVuY2UKKyNkZWZpbmUgQkxTX0FCVFNfQUNDIDB4MTAwICAvLyBGQy1QSCBCYXNpYyBMaW5rIFNlcnZpY2UgQWJvcnQgU2VxdWVuY2UgQWNjZXB0CisjZGVmaW5lIEJMU19BQlRTX1JKVCAweDEwMSAgLy8gRkMtUEggQmFzaWMgTGluayBTZXJ2aWNlIEFib3J0IFNlcXVlbmNlIFJlamVjdAorI2RlZmluZSBFTFNfUExPR0kgMHgwMyAgLy8gRkMtUEggUG9ydCBMb2dpbiAoYXJiaXRyYXJ5IGFzc2lnbikKKyNkZWZpbmUgRUxTX1NDUiAgIDB4NzAgIC8vIChhcmIgYXNzaWduKSBTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uIChGYWJyaWMpCisjZGVmaW5lIEZDU19OU1IgICAweDcyICAvLyAoYXJiIGFzc2lnbikgTmFtZSBTZXJ2aWNlIFJlcXVlc3QgKEZhYnJpYykKKyNkZWZpbmUgRUxTX0ZMT0dJIDB4NDQgIC8vIChhcmIgYXNzaWduKSBGYWJyaWMgTG9naW4KKyNkZWZpbmUgRUxTX0ZESVNDIDB4NDEgIC8vIChhcmIgYXNzaWduKSBGYWJyaWMgRGlzY292ZXJ5IChMb2dpbikKKyNkZWZpbmUgRUxTX1BESVNDIDB4NTAgIC8vIEZDLVBIMiBQb3J0IERpc2NvdmVyeQorI2RlZmluZSBFTFNfQUJUWCAgMHgwNiAgLy8gRkMtUEggQWJvcnQgRXhjaGFuZ2UgCisjZGVmaW5lIEVMU19MT0dPIDB4MDUgICAvLyBGQy1QSCBQb3J0IExvZ291dAorI2RlZmluZSBFTFNfUFJMSSAweDIwICAgLy8gRkNQLVNDU0kgUHJvY2VzcyBMb2dpbgorI2RlZmluZSBFTFNfUFJMTyAweDIxICAgLy8gRkNQLVNDU0kgUHJvY2VzcyBMb2dvdXQKKyNkZWZpbmUgRUxTX0xPR09fQUNDIDB4MDcgICAvLyB7RkMtUEh9IFBvcnQgTG9nb3V0IEFjY2VwdAorI2RlZmluZSBFTFNfUExPR0lfQUNDIDB4MDggIC8vIHtGQy1QSH0gUG9ydCBMb2dpbiBBY2NlcHQKKyNkZWZpbmUgRUxTX0FDQyAweDE4ICAgICAgICAvLyB7RkMtUEh9IChnZW5lcmljKSBBQ0NlcHQKKyNkZWZpbmUgRUxTX1BSTElfQUNDIDB4MjIgIC8vIHtGQ1AtU0NTSX0gUHJvY2VzcyBMb2dpbiBBY2NlcHQKKyNkZWZpbmUgRUxTX1JKVCAweDEwMDAwMDAKKyNkZWZpbmUgU0NTSV9SRVBPUlRfTFVOUyAweDBBMAorI2RlZmluZSBGQ1BfVEFSR0VUX1JFU0VUIDB4MjAwCisKKyNkZWZpbmUgRUxTX0xJTFBfRlJBTUUgMHgwMDAwMDcxMSAvLyAxc3QgcGF5bG9hZCB3b3JkIG9mIExJTFAgZnJhbWUKKworI2RlZmluZSBTRlFfVU5BU1NJU1RFRF9GQ1AgIDEgIC8vIElDTSwgRFdvcmQzLCAiVHlwZSIgdW5hc3Npc3RlZCBGQ1AKKyNkZWZpbmUgU0ZRX1VOS05PV04gICAgICAgICAweDMxIC8vIChhcmJpdHJhcnkpIElDTSwgRFdvcmQzLCAiVHlwZSIgdW5rbm93bgorCisvLyB0aGVzZSAiTElOSyIgYml0cyByZWZlciB0byBsb29wIG9yIG5vbi1sb29wCisjZGVmaW5lIExJTktBQ1RJVkUgMHgyICAgIC8vIGZjTGlua1EgdHlwZSAtIExJTksgVVAgVGFjaHlvbiBGTSAnTHVwJyBiaXQgc2V0CisjZGVmaW5lIExJTktET1dOIDB4ZjIgICAgIC8vIGZjTGlua1EgdHlwZSAtIExJTksgRE9XTiBUYWNoeW9uIEZNICdMZG4nIGJpdCBzZXQKKworLy8jZGVmaW5lIFZPTFVNRV9TRVRfQUREUkVTU0lORyAxIC8vICJjaGFubmVsIiBvciAiYnVzIiAxCisKK3R5cGVkZWYgc3RydWN0ICAgICAgLy8gMzIgYnl0ZXMgaGRyIE9OTFkgKGUuZy4gRkNQX0RBVEEgYnVmZmVyIGZvciBTRVNUKQoreworICBVTE9ORyByZXNlcnZlZDsgICAvLyBkd29yZCAwIChkb24ndCB1c2UpCisgIFVMT05HIHNvZl9lb2Y7CisgIFVMT05HIGRfaWQ7ICAgICAgIC8vIGR3b3JkIDIgLSAzMToyNCBSX0NUTCwgMjM6MCBEX0lECisgIFVMT05HIHNfaWQ7ICAgICAgIC8vIGR3b3JkIDMgLSAzMToyNCBDU19DVEwsIDIzOjAgU19JRAorICBVTE9ORyBmX2N0bDsgICAgICAvLyBkd29yZCA0IC0gMzE6MjQgVHlwZSwgIDIzOjAgRl9DVEwKKyAgVUxPTkcgc2VxX2NudDsgICAgLy8gZHdvcmQgNSAtIDMxOjI0IFNFUV9JRCwgMjM6MTYgREZfQ1RMLCAxNTowIFNFUV9DTlQKKyAgVUxPTkcgb3hfcnhfaWQ7ICAgLy8gZHdvcmQgNiAtIDMxOjE2IE9YX0lELCAgMTU6MCBSWF9JRAorICBVTE9ORyBybzsgICAgICAgICAvLyBkd29yZCA3IC0gcmVsYXRpdmUgb2Zmc2V0Cit9IFRhY2hGQ0hEUjsKKworICAgICAgICAgICAgICAgICAgICAvLyBOT1RFISEgdGhlIGZvbGxvd2luZyBzdHJ1Y3QgTVVTVCBiZSA2NCBieXRlcy4KK3R5cGVkZWYgc3RydWN0ICAgICAgLy8gMzIgYnl0ZXMgaGRyICsgMzIgYnl0ZXMgcGF5bG9hZAoreworICBVTE9ORyByZXNlcnZlZDsgICAvLyBkd29yZCAwIChkb24ndCB1c2UgLSBtdXN0IGNsZWFyIHRvIDApCisgIFVMT05HIHNvZl9lb2Y7ICAgIC8vIGR3b3JkIDEgLSAzMToyNCBTT0Y6RU9GLCBVQU0sQ0xTLCBMQ3IsIFRGViwgVGltZVN0YW1wCisgIFVMT05HIGRfaWQ7ICAgICAgIC8vIGR3b3JkIDIgLSAzMToyNCBSX0NUTCwgMjM6MCBEX0lECisgIFVMT05HIHNfaWQ7ICAgICAgIC8vIGR3b3JkIDMgLSAzMToyNCBDU19DVEwsIDIzOjAgU19JRAorICBVTE9ORyBmX2N0bDsgICAgICAvLyBkd29yZCA0IC0gMzE6MjQgVHlwZSwgIDIzOjAgRl9DVEwKKyAgVUxPTkcgc2VxX2NudDsgICAgLy8gZHdvcmQgNSAtIDMxOjI0IFNFUV9JRCwgMjM6MTYgREZfQ1RMLCAxNTowIFNFUV9DTlQKKyAgVUxPTkcgb3hfcnhfaWQ7ICAgLy8gZHdvcmQgNiAtIDMxOjE2IE9YX0lELCAgMTU6MCBSWF9JRAorICBVTE9ORyBybzsgIC8vIGR3b3JkIDcgLSByZWxhdGl2ZSBvZmZzZXQKKy8vLS0tLS0tLS0tCisgIF9fdTMyIHBsWzhdOyAgICAgICAgICAgICAgLy8gZHdvcmRzIDgtMTUgZnJhbWUgZGF0YSBwYXlsb2FkCit9IFRhY2hGQ0hEUl9DTU5EOworCisKK3R5cGVkZWYgc3RydWN0ICAgICAgLy8gMzIgYnl0ZXMgaGRyICsgMTIwIGJ5dGVzIHBheWxvYWQKK3sKKyAgVUxPTkcgcmVzZXJ2ZWQ7ICAgLy8gZHdvcmQgMCAoZG9uJ3QgdXNlIC0gbXVzdCBjbGVhciB0byAwKQorICBVTE9ORyBzb2ZfZW9mOyAgICAvLyBkd29yZCAxIC0gMzE6MjQgU09GOkVPRiwgVUFNLENMUywgTENyLCBURlYsIFRpbWVTdGFtcAorICBVTE9ORyBkX2lkOyAgICAgICAvLyBkd29yZCAyIC0gMzE6MjQgUl9DVEwsIDIzOjAgRF9JRAorICBVTE9ORyBzX2lkOyAgICAgICAvLyBkd29yZCAzIC0gMzE6MjQgQ1NfQ1RMLCAyMzowIFNfSUQKKyAgVUxPTkcgZl9jdGw7ICAgICAgLy8gZHdvcmQgNCAtIDMxOjI0IFR5cGUsICAyMzowIEZfQ1RMCisgIFVMT05HIHNlcV9jbnQ7ICAgIC8vIGR3b3JkIDUgLSAzMToyNCBTRVFfSUQsIDIzOjE2IERGX0NUTCwgMTU6MCBTRVFfQ05UCisgIFVMT05HIG94X3J4X2lkOyAgIC8vIGR3b3JkIDYgLSAzMToxNiBPWF9JRCwgIDE1OjAgUlhfSUQKKyAgVUxPTkcgcm87ICAvLyBkd29yZCA3IC0gcmVsYXRpdmUgb2Zmc2V0CisvLy0tLS0tLS0tLQorICBfX3UzMiBwbFszMF07ICAgICAgICAgICAgICAvLyBsYXJnZXN0IG5lY2Vzc2FyeSBwYXlsb2FkIChmb3IgTE9HSU4gY21uZHMpCit9IFRhY2hGQ0hEUl9HQ01ORDsKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAvLyAzMiBieXRlcyBoZHIgKyA2NCBieXRlcyBwYXlsb2FkCit7CisgIFVMT05HIHJlc2VydmVkOyAgIC8vIGR3b3JkIDAgKGRvbid0IHVzZSkKKyAgVUxPTkcgc29mX2VvZjsKKyAgVUxPTkcgZF9pZDsgICAgICAgLy8gZHdvcmQgMiAtIDMxOjI0IFJfQ1RMLCAyMzowIERfSUQKKyAgVUxPTkcgc19pZDsgICAgICAgLy8gZHdvcmQgMyAtIDMxOjI0IENTX0NUTCwgMjM6MCBTX0lECisgIFVMT05HIGZfY3RsOyAgICAgIC8vIGR3b3JkIDQgLSAzMToyNCBUeXBlLCAgMjM6MCBGX0NUTAorICBVTE9ORyBzZXFfY250OyAgICAvLyBkd29yZCA1IC0gMzE6MjQgU0VRX0lELCAyMzoxNiBERl9DVEwsIDE1OjAgU0VRX0NOVAorICBVTE9ORyBveF9yeF9pZDsgICAvLyBkd29yZCA2IC0gMzE6MTYgT1hfSUQsICAxNTowIFJYX0lECisgIFVMT05HIHJvOyAgLy8gZHdvcmQgNyAtIHJlbGF0aXZlIG9mZnNldAorLy8tLS0tLS0tLS0KKyAgX191MzIgcGxbMThdOyAvLyBwYXlsb2FkIGZvciBGQ1AtUlNQIChyZXNwb25zZSBidWZmZXIpIFJBLTR4MDAgaXMgNzJieXRlcworfSBUYWNoRkNIRFJfUlNQOworCisKKworCisKKworLy8gSW5ib3VuZCBNZXNzYWdlIFF1ZXVlIHN0cnVjdHVyZXMuLi4KK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAvLyBlYWNoIGVudHJ5IDggd29yZHMgKDMyIGJ5dGVzKQoreworICBVTE9ORyB0eXBlOyAgICAgICAgICAgICAgIC8vIElNUSBjb21wbGV0aW9uIG1lc3NhZ2UgdHlwZXMKKyAgVUxPTkcgd29yZFs3XTsgICAgICAgICAgICAvLyByZW1haW5kZXIgb2Ygc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJwcmV0ZWQgYnkgSU1RIHR5cGUKK30gVGFjaHlvbklNUUU7CisKKworLy8gUXVldWVzIGZvciBUYWNoTGl0ZSBub3QgaW4gb3JpZ2luYWwgVGFjaHlvbgorLy8gRVJRICAgICAgIC0gRXhjaGFuZ2UgUmVxdWVzdCBRdWV1ZSAoZm9yIG91dGJvdW5kIGNvbW1hbmRzKQorLy8gU0ZRICAgICAgIC0gU2luZ2xlIEZyYW1lIFF1ZXVlIChmb3IgaW5jb21pbmcgZnJhbWVzKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmaW5lIFRhY2h5b24gT3V0Ym91bmQgQ29tbWFuZCBRdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoU2luY2UgbWFueSBUYWNoeW9uIHJlZ2lzdGVycyBhcmUgUmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHksIG1haW50YWluIGNvcGllcyBmb3IgZGVidWdnaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgVGFjaCBxdWVzIG5lZWQgcG93ZXItb2YtMiBzaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSByZWdpc3RlcnMgYXJlIGxvYWRlZCB3aXRoIHBvMiAtMQorI2RlZmluZSBUQUNIX1NFU1RfTEVOIDUxMiAgIC8vIFRhY2hMaXRlIFNFU1QKKworI2RlZmluZSBFTFNfRVhDSEFOR0VTIDY0ICAgIC8vIGUuZy4gUExPR0ksIFJTQ04sIC4uLgorLy8gZGVmaW5lIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgKHNpbXVsdGFuZW91cykgZXhjaGFuZ2VzCisjZGVmaW5lIFRBQ0hfTUFYX1hJRCAoVEFDSF9TRVNUX0xFTiArIEVMU19FWENIQU5HRVMpICAvLyBFTFMgZXhjaGFuZ2VzCisKKyNkZWZpbmUgRVJRX0xFTiAxMjggICAgICAgICAvLyBwb3dlciBvZiAyLCBtYXggNDA5NgorCisvLyBJbmJvdW5kIE1lc3NhZ2UgUXVldWUgc3RydWN0dXJlcy4uLgorI2RlZmluZSBJTVFfTEVOIDUxMiAgICAgICAgICAgICAgLy8gbWluaW11bSA0IGVudHJpZXMgWyhwb3dlciBvZiAyKSAtIDFdCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgICAgICAvLyA4IHdvcmRzIC0gMzIgYnl0ZXMKK3sKKyAgVGFjaHlvbklNUUUgUUVudHJ5W0lNUV9MRU5dOworICBVTE9ORyBwcm9kdWNlckluZGV4OyAgIC8vIElNUSBQcm9kdWNlciBJbmRleCByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQDMyIGJ5dGUgYWxpZ24KKyAgVUxPTkcgY29uc3VtZXJJbmRleDsgICAvLyBDb25zdW1lciBJbmRleCByZWdpc3RlciAoaW4gVGFjaHlvbikKKyAgVUxPTkcgbGVuZ3RoOyAgICAgICAgICAvLyBMZW5ndGggcmVnaXN0ZXIKKyAgVUxPTkcgYmFzZTsKK30gVGFjaHlvbklNUTsgICAgICAgICAgICAgICAgICAgIC8vIEAgMzIgKiBJTVFfTEVOIGFsaWduCisKKworCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgLy8gaW5ib3VuZCBjb21wbGV0aW9uIG1lc3NhZ2UKK3sKKyAgVUxPTkcgVHlwZTsKKyAgVUxPTkcgSW5kZXg7CisgIFVMT05HIFRyYW5zZmVyTGVuZ3RoOworfSBUYWNoeW9uSW5iQ007CisKKworCisvLyBhcmJpdHJhcnkgbnVtZXJpYyB0YWdzIGZvciBUTCBzdHJ1Y3R1cmVzCisjZGVmaW5lIFRMX0ZDSFMgMSAgLy8gVGFjaExpdGUgRmlicmUgQ2hhbm5lbCBIZWFkZXIgU3RydWN0dXJlCisjZGVmaW5lIFRMX0lXRSAyICAvLyBpbml0aWF0b3Igd3JpdGUgZW50cnkgKGZvciBTRVNUKQorI2RlZmluZSBUTF9UV0UgMyAgLy8gdGFyZ2V0IHdyaXRlIGVudHJ5IChmb3IgU0VTVCkKKyNkZWZpbmUgVExfSVJFIDQgIC8vIGluaXRpYXRvciByZWFkIGVudHJ5IChmb3IgU0VTVCkKKyNkZWZpbmUgVExfVFJFIDUgIC8vIHRhcmdldCByZWFkIGVudHJ5IChmb3IgU0VTVCkKKyNkZWZpbmUgVExfSVJCIDYgIC8vIEkvTyByZXF1ZXN0IGJsb2NrCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIElOQ09NSU5HIGZyYW1lcworI2RlZmluZSBTRlFfTEVOIDMyICAgICAgICAgICAgICAvLyBtaW5pbXVtIDMyIGVudHJpZXMsIG1heCA0MDk2CisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIEZyYW1lIFF1ZQoreworICBUYWNoRkNIRFJfQ01ORCBRRW50cnlbU0ZRX0xFTl07IC8vIG11c3QgYmUgNjQgYnl0ZXMhIQorICBVTE9ORyBwcm9kdWNlckluZGV4OyAgIC8vIElNUSBQcm9kdWNlciBJbmRleCByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQDMyIGJ5dGUgYWxpZ24KKyAgVUxPTkcgY29uc3VtZXJJbmRleDsgICAvLyBDb25zdW1lciBJbmRleCByZWdpc3RlciAoaW4gVGFjaHlvbikKKyAgVUxPTkcgbGVuZ3RoOyAgICAgICAgICAvLyBMZW5ndGggcmVnaXN0ZXIKKyAgVUxPTkcgYmFzZTsKK30gVGFjaExpdGVTRlE7CisKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAgIC8vIEkvTyBSZXF1ZXN0IEJsb2NrIGZsYWdzCit7CisgIFVDSEFSICBCUkQgOiAxOworICBVQ0hBUiAgICAgIDogMTsgLy8gcmVzZXJ2ZWQKKyAgVUNIQVIgIFNGQSA6IDE7CisgIFVDSEFSICBETkMgOiAxOworICBVQ0hBUiAgRElOIDogMTsKKyAgVUNIQVIgIERDTSA6IDE7CisgIFVDSEFSICBDVFMgOiAxOworICBVQ0hBUiAgU0JWIDogMTsgIC8vIElSQiBlbnRyeSB2YWxpZCAtIElSQidCJyBvbmx5Cit9IElSQmZsYWdzOworCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgICAgIC8vIEkvTyBSZXF1ZXN0IEJsb2NrCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0ICdBJworICBVTE9ORyBSZXFfQV9TRlNfTGVuOyAgICAgLy8gdG90YWwgZnJhbWUgbGVuIChoZHIgKyBwYXlsb2FkKSwgbWluIDMyCisgIFVMT05HIFJlcV9BX1NGU19BZGRyOyAgICAvLyAzMi1iaXQgcG9pbnRlciB0byBGQ0hTIHN0cnVjdCAodG8gYmUgc2VudCkKKyAgVUxPTkcgUmVxX0FfU0ZTX0RfSUQ7ICAgIC8vIDI0LWJpdCBGQyBkZXN0aW5hdGlvbiAoaS5lLiA4IGJpdCBhbF9wYSkKKyAgVUxPTkcgUmVxX0FfVHJhbnNfSUQ7ICAgIC8vIFhfSUQgKE9YX0lEIG9yIFJYX0lEKSBhbmQvb3IgSW5kZXggaW4gU0VTVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCAnQicKKyAgVUxPTkcgUmVxX0JfU0ZTX0xlbjsgICAgIC8vIHRvdGFsIGZyYW1lIGxlbiAoaGRyICsgcGF5bG9hZCksIG1pbiAzMgorICBVTE9ORyBSZXFfQl9TRlNfQWRkcjsgICAgLy8gMzItYml0IHBvaW50ZXIgdG8gRkNIUyBzdHJ1Y3QgKHRvIGJlIHNlbnQpCisgIFVMT05HIFJlcV9CX1NGU19EX0lEOyAgICAvLyAyNC1iaXQgRkMgZGVzdGluYXRpb24gKGkuZS4gOCBiaXQgYWxfcGEpCisgIFVMT05HIFJlcV9CX1RyYW5zX0lEOyAgICAvLyBYX0lEIChPWF9JRCBvciBSWF9JRCkgYW5kL29yIEluZGV4IGluIFNFU1QKK30gVGFjaExpdGVJUkI7CisKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgIC8vIFRhY2hMaXRlIHBsYWNlaG9sZGVyIGZvciBJUkJzCit7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25lZCBAc2l6ZW9mKEVSUSkgZm9yIFRhY2hMaXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUFYIGNvbW1hbmRzIGlzIHN1bSBvZiBTRVNUIGxlbiBhbmQgRVJRCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IGVhY2ggU0VTVCBlbnRyeSByZXF1aXJlcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElSQiAoRVJRKSBlbnRyeTsgaW4gYWRkaXRpb24sIHdlIHByb3ZpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFUlFfTEVOCisgIFRhY2hMaXRlSVJCIFFFbnRyeVtFUlFfTEVOXTsgLy8gQmFzZSByZWdpc3RlcjsgZW50cmllcyAzMiBieXRlcyBlYS4KKyAgVUxPTkcgY29uc3VtZXJJbmRleDsgICAvLyBDb25zdW1lciBJbmRleCByZWdpc3RlcgorICBVTE9ORyBwcm9kdWNlckluZGV4OyAgIC8vIEVSUSBQcm9kdWNlciBJbmRleCByZWdpc3RlcgorICBVTE9ORyBsZW5ndGg7ICAgICAgICAgIC8vIExlbmd0aCByZWdpc3RlcgorICBVTE9ORyBiYXNlOyAgICAgICAgICAgIC8vIGNvcHkgb2YgYmFzZSBwdHIgZm9yIGRlYnVnCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0IGlzIHNpemVkIGZvciBsYXJnZXN0IGV4cGVjdGVkIGNtbmQgKExPR0lOKQorfSBUYWNoTGl0ZUVSUTsKKworLy8gZm9yIG5vdywganVzdCAzMiBiaXQgRE1BLCBldmVudHVhbGx5IDQwc29tZXRoaW5nLCB3aXRoIGNvZGUgY2hhbmdlcworI2RlZmluZSBDUFFGQ1RTX0RNQV9NQVNLICgodW5zaWduZWQgbG9uZykgKDB4MDAwMDAwMDBGRkZGRkZGRikpCisKKyNkZWZpbmUgVExfTUFYX1NHX0VMRU1fTEVOIDB4N2ZmZmYgIC8vIE1heCBidWZmZXIgbGVuZ3RoIGEgc2luZ2xlIFMvRyBlbnRyeQorCQkJCS8vIG1heSByZXByZXNlbnQgKGEgaGFyZHdhcmUgbGltaXRhdGlvbikuICBUaGUKKwkJCQkvLyBvbmx5IHJlYXNvbiB0byBldmVyIGNoYW5nZSB0aGlzIGlzIGlmIHlvdQorCQkJCS8vIHdhbnQgdG8gZXhlcmNpc2UgdmVyeS1oYXJkLXRvLXJlYWNoIGNvZGUgaW4KKwkJCQkvLyBjcHFmY1RTd29ya2VyLmM6YnVpbGRfU0VTVF9zZ2xpc3QoKS4KKworI2RlZmluZSBUTF9EQU5HRVJfU0dQQUdFUyA3ICAvLyBhcmJpdHJhcnkgaGlnaCB3YXRlciBtYXJrIGZvciAjIG9mIFMvRyBwYWdlcworCQkJCS8vIHdlIG11c3QgZXhjZWVkIHRvIGVsaWNpdCBhIHdhcm5pbmcgaW5kaWNhdGl2ZQorCQkJCS8vIG9mIEVYVFJFTUVMWSBsYXJnZSBkYXRhIHRyYW5zZmVycyBvciAKKwkJCQkvLyBFWFRSRU1FIG1lbW9yeSBmcmFnbWVudGF0aW9uLgorCQkJCS8vIChtZWFucyB3ZSBqdXN0IHVzZWQgdXAgMjA0OCBTL0cgZWxlbWVudHMsCisJCQkJLy8gTmV2ZXIgc2VlbiB0aGlzIGlzIHJlYWwgbGlmZSwgb25seSBpbiAKKwkJCQkvLyB0ZXN0aW5nIHdpdGggdHJpY2tlZCB1cCBkcml2ZXIuKQorCisjZGVmaW5lIFRMX0VYVF9TR19QQUdFX0NPVU5UIDI1NiAgLy8gTnVtYmVyIG9mIEV4dGVuZGVkIFNjYXR0ZXIvR2F0aGVyIGEvbCBQQUlSUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhY2h5b24gcmVnaXN0ZXIgKElPQmFzZVUgMHg2OCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3dlci1vZi0yIHZhbHVlIE9OTFkhICA0IG1pbiwgMjU2IG1heAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgbGVuIGlzICNQYWlycyAqIDIgVUxPTkcvUGFpciAqIDQgYnl0ZXMvVUxPTkcKKyNkZWZpbmUgVExfRVhUX1NHX1BBR0VfQllURUxFTiAoVExfRVhUX1NHX1BBR0VfQ09VTlQgKjIgKjQpCisKKworCisvLyBTRVNUIGVudHJ5IHR5cGVzOiBJV0UsIElSRSwgVFdFLCBUUkUKK3R5cGVkZWYgc3RydWN0IAoreworICBVTE9ORyBIZHJfTGVuOworICBVTE9ORyBIZHJfQWRkcjsKKyAgVUxPTkcgUlNQX0xlbjsKKyAgVUxPTkcgUlNQX0FkZHI7CisgIFVMT05HIEJ1ZmZfT2ZmOworI2RlZmluZSBVU0VTX0VYVEVOREVEX1NHTElTVCh0aGlzX3Nlc3QsIHhfSUQpIFwKKwkoISgodGhpc19zZXN0KS0+dVsgeF9JRCBdLklXRS5CdWZmX09mZiAmIDB4ODAwMDAwMDApKQorICBVTE9ORyBMaW5rOworICBVTE9ORyBSWF9JRDsKKyAgVUxPTkcgRGF0YV9MZW47CisgIFVMT05HIEV4cF9STzsKKyAgVUxPTkcgRXhwX0J5dGVfQ250OworICAgLy8gLS0tIGV4dGVuZGVkL2xvY2FsIEdhdGhlciBMZW4vQWRkcmVzcyBwYWlycworICBVTE9ORyBHTGVuMTsKKyAgVUxPTkcgR0FkZHIxOworICBVTE9ORyBHTGVuMjsKKyAgVUxPTkcgR0FkZHIyOworICBVTE9ORyBHTGVuMzsKKyAgVUxPTkcgR0FkZHIzOworfSBUYWNoTGl0ZUlXRTsKKworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgVUxPTkcgU2VxX0FjY3VtOworICBVTE9ORyByZXNlcnZlZDsgICAgICAgLy8gbXVzdCBjbGVhciB0byAwCisgIFVMT05HIFJTUF9MZW47CisgIFVMT05HIFJTUF9BZGRyOworICBVTE9ORyBCdWZmX09mZjsKKyAgVUxPTkcgQnVmZl9JbmRleDsgICAgICAgICAgIC8vIFVMT05HIDUKKyAgVUxPTkcgRXhwX1JPOworICBVTE9ORyBCeXRlX0NvdW50OworICBVTE9ORyByZXNlcnZlZF87ICAgICAgLy8gVUxPTkcgOAorICBVTE9ORyBFeHBfQnl0ZV9DbnQ7CisgICAvLyAtLS0gZXh0ZW5kZWQvbG9jYWwgU2NhdHRlciBMZW4vQWRkcmVzcyBwYWlycworICBVTE9ORyBTTGVuMTsKKyAgVUxPTkcgU0FkZHIxOworICBVTE9ORyBTTGVuMjsKKyAgVUxPTkcgU0FkZHIyOworICBVTE9ORyBTTGVuMzsKKyAgVUxPTkcgU0FkZHIzOworfSBUYWNoTGl0ZUlSRTsKKworCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAvLyBUYXJnZXQgV3JpdGUgRW50cnkKK3sKKyAgVUxPTkcgU2VxX0FjY3VtOyAgICAgIC8vIGR3b3JkIDAKKyAgVUxPTkcgcmVzZXJ2ZWQ7ICAgICAgIC8vIGR3b3JkIDEgIG11c3QgY2xlYXIgdG8gMAorICBVTE9ORyBSZW1vdGVfTm9kZV9JRDsKKyAgVUxPTkcgcmVzZXJ2ZWQxOyAgICAgIC8vIGR3b3JkIDMgIG11c3QgY2xlYXIgdG8gMAorICBVTE9ORyBCdWZmX09mZjsKKyAgVUxPTkcgQnVmZl9JbmRleDsgICAgIC8vIFVMT05HIDUKKyAgVUxPTkcgRXhwX1JPOworICBVTE9ORyBCeXRlX0NvdW50OworICBVTE9ORyByZXNlcnZlZF87ICAgICAgLy8gVUxPTkcgOAorICBVTE9ORyBFeHBfQnl0ZV9DbnQ7CisgICAvLyAtLS0gZXh0ZW5kZWQvbG9jYWwgU2NhdHRlciBMZW4vQWRkcmVzcyBwYWlycworICBVTE9ORyBTTGVuMTsKKyAgVUxPTkcgU0FkZHIxOworICBVTE9ORyBTTGVuMjsKKyAgVUxPTkcgU0FkZHIyOworICBVTE9ORyBTTGVuMzsKKyAgVUxPTkcgU0FkZHIzOworfSBUYWNoTGl0ZVRXRTsKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAKK3sKKyAgVUxPTkcgSGRyX0xlbjsKKyAgVUxPTkcgSGRyX0FkZHI7CisgIFVMT05HIFJTUF9MZW47ICAgICAgICAvLyBEV29yZCAyCisgIFVMT05HIFJTUF9BZGRyOworICBVTE9ORyBCdWZmX09mZjsKKyAgVUxPTkcgQnVmZl9JbmRleDsgICAgIC8vIERXb3JkIDUKKyAgVUxPTkcgcmVzZXJ2ZWQ7CisgIFVMT05HIERhdGFfTGVuOworICBVTE9ORyByZXNlcnZlZF87CisgIFVMT05HIHJlc2VydmVkX187CisgICAvLyAtLS0gZXh0ZW5kZWQvbG9jYWwgR2F0aGVyIExlbi9BZGRyZXNzIHBhaXJzCisgIFVMT05HIEdMZW4xOyAgICAgICAgICAvLyBEV29yZCBBCisgIFVMT05HIEdBZGRyMTsKKyAgVUxPTkcgR0xlbjI7CisgIFVMT05HIEdBZGRyMjsKKyAgVUxPTkcgR0xlbjM7CisgIFVMT05HIEdBZGRyMzsKK30gVGFjaExpdGVUUkU7CisKK3R5cGVkZWYgc3RydWN0IGV4dF9zZ19wYWdlX3B0cl90ICpQU0dQQUdFUzsKK3R5cGVkZWYgc3RydWN0IGV4dF9zZ19wYWdlX3B0cl90IAoreworICB1bnNpZ25lZCBjaGFyIHBhZ2VbVExfRVhUX1NHX1BBR0VfQllURUxFTiAqIDJdOyAvLyAyeCBmb3IgYWxpZ25tZW50CisgIGRtYV9hZGRyX3QgYnVzYWRkcjsgCS8vIG5lZWQgdGhlIGJ1cyBhZGRyZXNzZXMgYW5kCisgIHVuc2lnbmVkIGludCBtYXBsZW47ICAvLyBsZW5ndGhzIGZvciBsYXRlciBwY2kgdW5tYXBwaW5nLgorICBQU0dQQUdFUyBuZXh0OworfSBTR1BBR0VTOyAvLyBsaW5rZWQgbGlzdCBvZiBTL0cgcGFpcnMsIGJ5IEV4Y2hhbmdlCisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgICAgLy8gU0NTSSBFeGNoYW5nZSBTdGF0ZSBUYWJsZQoreworICB1bmlvbiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRyeSBjYW4gYmUgSVdFLCBJUkUsIFRXRSwgVFJFCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDY0IGJ5dGVzIHBlciBlbnRyeQorICAgIFRhY2hMaXRlSVdFIElXRTsKKyAgICBUYWNoTGl0ZUlSRSBJUkU7CisgICAgVGFjaExpdGVUV0UgVFdFOworICAgIFRhY2hMaXRlVFJFIFRSRTsKKyAgfSB1W1RBQ0hfU0VTVF9MRU5dOworCisgIFRhY2hGQ0hEUiBEYXRhSERSW1RBQ0hfU0VTVF9MRU5dOyAvLyBmb3IgU0VTVCBGQ1BfREFUQSBmcmFtZSBoZHIgKG5vIHBsKQorICBUYWNoRkNIRFJfUlNQIFJzcEhEUltUQUNIX1NFU1RfTEVOXTsgLy8gc3BhY2UgZm9yIFNFU1QgRkNQX1JTUCBmcmFtZQorICBQU0dQQUdFUyBzZ1BhZ2VzW1RBQ0hfU0VTVF9MRU5dOyAvLyBoZWFkIG9mIGxpbmtlZCBsaXN0IG9mIFBvb2wtYWxsb2NhdGlvbnMKKyAgVUxPTkcgbGVuZ3RoOyAgICAgICAgICAvLyBMZW5ndGggcmVnaXN0ZXIKKyAgVUxPTkcgYmFzZTsgICAgICAgICAgICAvLyBjb3B5IG9mIGJhc2UgcHRyIGZvciBkZWJ1ZworfSBUYWNoU0VTVDsKKworCisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgICAgLy8gZWFjaCByZWdpc3RlciBoYXMgaXQncyBvd24gYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdmFsdWUgKHVzZWQgZm9yIHdyaXRlLW9ubHkgcmVncykKK3sKKyAgdm9pZCogYWRkcmVzczsKKyAgdm9sYXRpbGUgVUxPTkcgdmFsdWU7Cit9IEZDUkVHSVNURVI7CisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAgLy8gSG9zdCBjb3B5IC0gVGFjaExpdGUgUmVnaXN0ZXJzCit7CisgIFVMT05HIElPQmFzZUwsIElPQmFzZVU7ICAvLyBJL08gcG9ydCBsb3dlciBhbmQgdXBwZXIgVEwgcmVnaXN0ZXIgYWRkcmVzc2VzCisgIFVMT05HIE1lbUJhc2U7ICAgICAgICAgICAvLyBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVyIGFkZHJlc3NlcworICB2b2lkKiBSZU1hcE1lbUJhc2U7ICAgICAgLy8gTy9TIFZNIHJlZmVyZW5jZSBmb3IgTWVtQmFzZQorICBVTE9ORyB3d25faGk7ICAgICAgICAgICAgLy8gV1dOIGlzIHNldCBvbmNlIGF0IHN0YXJ0dXAKKyAgVUxPTkcgd3duX2xvOworICBVTE9ORyBteV9hbF9wYTsgICAgICAgICAgLy8gYWxfcGEgcmVjZWl2ZWQgYWZ0ZXIgTElQKCkKKyAgVUxPTkcgUk9NQ1RSOyAgICAgICAgICAgIC8vIGZsYWdzIGZvciBvbi1ib2FyZCBSQU0vUk9NCisgIFVMT05HIFJBTUJhc2U7ICAgICAgICAgICAvLyBvbi1ib2FyZCBSQU0gKGkuZS4gc29tZSBUYWNobGl0ZXMpCisgIFVMT05HIFNST01CYXNlOyAgICAgICAgICAvLyBvbi1ib2FyZCBFRVBST00gKHNvbWUgVGFjaGxpdGVzKQorICBVTE9ORyBQQ0lNQ1RSOyAgICAgICAgICAgLy8gUENJIE1hc3RlciBDb250cm9sIFJlZyAoaGFzIGJ1cyB3aWR0aCkKKworICBGQ1JFR0lTVEVSIElOVEVOOyAgICAgICAgLy8gY29weSBvZiBpbnRlcnJ1cHQgZW5hYmxlIG1hc2sKKyAgRkNSRUdJU1RFUiBJTlRQRU5EOyAgICAgIC8vIGludGVycnVwdCBwZW5kaW5nCisgIEZDUkVHSVNURVIgSU5UU1RBVDsgICAgICAvLyBpbnRlcnJ1cHQgc3RhdHVzCisgIEZDUkVHSVNURVIgU0ZRY29uc3VtZXJJbmRleDsgCisgIEZDUkVHSVNURVIgRVJRcHJvZHVjZXJJbmRleDsgCisgIEZDUkVHSVNURVIgVFljb25maWc7ICAgLy8gVGFjaFlvbiAoY2hpcCBsZXZlbCkKKyAgRkNSRUdJU1RFUiBUWWNvbnRyb2w7CisgIEZDUkVHSVNURVIgVFlzdGF0dXM7CisgIEZDUkVHSVNURVIgRk1jb25maWc7ICAgLy8gRnJhbWUgTWFuYWdlciAoRkMgbG9vcCBsZXZlbCkKKyAgRkNSRUdJU1RFUiBGTWNvbnRyb2w7CisgIEZDUkVHSVNURVIgRk1zdGF0dXM7CisgIEZDUkVHSVNURVIgRk1MaW5rU3RhdHVzMTsKKyAgRkNSRUdJU1RFUiBGTUxpbmtTdGF0dXMyOworICBGQ1JFR0lTVEVSIEZNQkJfQ3JlZGl0WmVybzsKKyAgRkNSRUdJU1RFUiBzdGF0dXM7CisgIEZDUkVHSVNURVIgZWRfdG92OyAgICAgLy8gZXJyb3IgZGV0ZWN0IHRpbWUtb3V0IHZhbHVlCisgIEZDUkVHSVNURVIgcmN2X2FsX3BhOyAgLy8gcmVjZWl2ZWQgYXJiLiBsb29wIHBoeXNpY2FsIGFkZHJlc3MKKyAgRkNSRUdJU1RFUiBwcmltaXRpdmU7ICAvLyBlLmcuIExJUCgpLCBPUE4oKSwgLi4uCit9IFRMX1JFR0lTVEVSUzsKKworCisKK3R5cGVkZWYgc3RydWN0IAoreworICBVTE9ORyBvazsKKyAgVUxPTkcgaW52YWxpZEFyZ3M7CisgIFVMT05HIGxpbmtEb3duOworICBVTE9ORyBsaW5rVXA7CisgIFVMT05HIG91dFF1ZUZ1bGw7CisgIFVMT05HIFNFU1RGdWxsOworICBVTE9ORyBocGU7ICAgIC8vIGhvc3QgcHJvZ3JhbW1pbmcgZXJyIChmcm9tIFRhY2gpCisgIFVMT05HIEZDNGFib3J0ZWQ7IC8vIGFib3J0cyBmcm9tIEFwcGxpY2F0aW9uIG9yIHVwcGVyIGRyaXZlciBsYXllcgorICBVTE9ORyBGQzJhYm9ydGVkOyAvLyBhYm9ydHMgZnJvbSBvdXIgZHJpdmVyJ3MgdGltZW91dHMKKyAgVUxPTkcgdGltZW91dHM7ICAgLy8gb3VyIGRyaXZlciB0aW1lb3V0IChvbiBpbmRpdmlkdWFsIGV4Y2hhbmdlcykKKyAgVUxPTkcgbG9nb3V0czsgICAgLy8gZXhwbGljaXQgLSBzZW50IExPR087IGltcGxpY2l0IC0gZGV2aWNlIHJlbW92ZWQKKyAgVUxPTkcgcmV0cmllczsKKyAgVUxPTkcgbGlua0ZhaWxUWDsKKyAgVUxPTkcgbGlua0ZhaWxSWDsKKyAgVUxPTkcgQ250RXJyb3JzOyAgLy8gYnl0ZSBjb3VudCBleHBlY3RlZCAhPSBjb3VudCByZWNlaXZlZCAodHlwLiBTRVNUKQorICBVTE9ORyBlX3N0b3JlczsgICAvLyBlbGFzdGljIHN0b3JlIGVycnMKKyAgVUxPTkcgcmVzZXRzOyAgICAgLy8gaGFyZCBvciBzb2Z0IGNvbnRyb2xsZXIgcmVzZXRzCisgIFVMT05HIEZNaW5pdHM7ICAgIC8vIFRBQ0ggRnJhbWUgTWFuYWdlciBJbml0IChlLmcuIExJUHMpCisgIFVMT05HIGxua1F1ZUZ1bGw7ICAvLyB0b28gbWFueSBMT0dJTiwgbG9vcCBjb21tYW5kcworICBVTE9ORyBTY3NpUXVlRnVsbDsgLy8gdG9vIG1hbnkgRkNQLVNDU0kgaW5ib3VuZCBmcmFtZXMKKyAgVUxPTkcgTG9zc29mU2lnbmFsOyAgIC8vIEZNIGxpbmsgc3RhdHVzIDEgcmVncworICBVTE9ORyBCYWRSWENoYXI7ICAgLy8gRk0gbGluayBzdGF0dXMgMSByZWdzCisgIFVMT05HIExvc3NvZlN5bmM7ICAgLy8gRk0gbGluayBzdGF0dXMgMSByZWdzCisgIFVMT05HIFJ4X0VPRmE7ICAgLy8gRk0gbGluayBzdGF0dXMgMiByZWdzIChyZWNlaXZlZCBFT0ZhKQorICBVTE9ORyBEaXNfRnJtOyAgIC8vIEZNIGxpbmsgc3RhdHVzIDIgcmVncyAoZGlzY2FyZGVkIGZyYW1lcykKKyAgVUxPTkcgQmFkX0NSQzsgICAvLyBGTSBsaW5rIHN0YXR1cyAyIHJlZ3MKKyAgVUxPTkcgQkIwX1RpbWVyOyAvLyAgRk0gQkJfQ3JlZGl0IFplcm8gVGltZXIgUmVnCisgIFVMT05HIGxvb3BCcmVha3M7IC8vIGluZmluaXRlIGxvb3AgZXhpdHMKKyAgVUxPTkcgbGFzdEJCMHRpbWVyOyAgLy8gc3RhdGljIGFjY3VtLiBidWZmZXIgbmVlZGVkIGJ5IFRhY2hsaXRlCit9IEZDU1RBVFM7CisKKwordHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAvLyBDb25maWcgT3B0aW9ucworeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMUyBCaXQgZmlyc3QKKyAgVVNIT1JUICAgICAgICA6IDE7ICAgICAgICAgICAvLyBiaXQwOgorICBVU0hPUlQgIGZsb2dpIDogMTsgICAgICAgICAgIC8vIGJpdDE6IFdlIHNlbnQgRkxPR0kgLSB3YWl0IGZvciBGYWJyaWMgbG9naW5zCisgIFVTSE9SVCAgZmFicmljOiAxOyAgICAgICAgICAgLy8gYml0MjogVGFjaHlvbiBkZXRlY3RlZCBGYWJyaWMgKEZNIHN0YXQgTEcpCisgIFVTSE9SVCAgTElMUGluOiAxOyAgICAgICAgICAgLy8gYml0MzogV2UgY2FuIHVzZSBhbiBGQy1BTCBMSUxQIGZyYW1lCisgIFVTSE9SVCAgdGFyZ2V0OiAxOyAgICAgICAgICAgLy8gYml0NDogdGhpcyBQb3J0IGhhcyBTQ1NJIHRhcmdldCBjYXBhYmlsaXR5CisgIFVTSE9SVCAgaW5pdGlhdG9yOiAgICAxOyAgICAgLy8gYml0NTogdGhpcyBQb3J0IGhhcyBTQ1NJIGluaXRpYXRvciBjYXBhYmlsaXR5CisgIFVTSE9SVCAgZXh0TG9vcGJhY2s6ICAxOyAgICAgLy8gYml0NjogbG9vcGJhY2sgYXQgR0JJQworICBVU0hPUlQgIGludExvb3BiYWNrOiAgMTsgICAgIC8vIGJpdDc6IGxvb3BiYWNrIGluIEhQIHNpbGljb24KKyAgVVNIT1JUICAgICAgICA6IDE7ICAgICAgICAgICAvLyBiaXQ4OgorICBVU0hPUlQgICAgICAgIDogMTsgICAgICAgICAgIC8vIGJpdDk6CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MTA6CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MTE6CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MTI6CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MTM6CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MTQ6CisgIFVTSE9SVCAgICAgICAgOiAxOyAgICAgICAgICAgLy8gYml0MTU6Cit9IEZDX09QVElPTlM7CisKKworCit0eXBlZGVmIHN0cnVjdCBkeW5fbWVtX3BhaXIKK3sKKyAgdm9pZCAqQmFzZUFsbG9jYXRlZDsgIC8vIGFkZHJlc3MgYXMgYWxsb2NhdGVkIGZyb20gTy9TOworICB1bnNpZ25lZCBsb25nIEFsaWduZWRBZGRyZXNzOyAvLyBhbGlnbmVkIGFkZHJlc3MgKHVzZWQgYnkgVGFjaHlvbiBETUEpCisgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKyAgc2l6ZV90IHNpemU7Cit9IEFMSUdORURfTUVNOworCisKKworCisvLyB0aGVzZSBzdHJ1Y3RzIGNvbnRhaW4gb25seSBDUlVDSUFMIChzdHVmZiB3ZSBhY3R1YWxseSB1c2UpIHBhcmFtZXRlcnMKKy8vIGZyb20gRkMtUEgobikgbG9naW5zLiAgKERvbid0IHNhdmUgZW50aXJlIExPR0lOIHBheWxvYWQgdG8gc2F2ZSBtZW0uKQorCisvLyBJbXBsaWNpdCBsb2dvdXQgaGFwcGVucyB3aGVuIHRoZSBsb29wIGdvZXMgZG93biAtIHdlIHJlcXVpcmUgUERJU0MKKy8vIHRvIHJlc3RvcmUuICBFeHBsaWNpdCBsb2dvdXQgaXMgd2hlbiBXRSBkZWNpZGUgbmV2ZXIgdG8gdGFsayB0byBzb21lb25lLAorLy8gb3Igd2hlbiBhIHRhcmdldCByZWZ1c2VzIHRvIHRhbGsgdG8gdXMsIGkuZS4gc2VuZHMgdXMgYSBMT0dPIGZyYW1lIG9yCisvLyBMU19SSlQgcmVqZWN0IGluIHJlc3BvbnNlIHRvIG91ciBQTE9HSSByZXF1ZXN0LgorCisjZGVmaW5lIElNUExJQ0lUX0xPR09VVCAxCisjZGVmaW5lIEVYUExJQ0lUX0xPR09VVCAyCisKK3R5cGVkZWYgc3RydWN0IAoreworICBVQ0hBUiBjaGFubmVsOyAvLyBTQ1NJICJidXMiCisgIFVDSEFSIHRhcmdldDsKKyAgVUNIQVIgSW5xRGV2aWNlVHlwZTsgIC8vIGJ5dGUgMCBmcm9tIFNDU0kgSW5xdWlyeSByZXNwb25zZQorICBVQ0hBUiBWb2x1bWVTZXRBZGRyZXNzaW5nOyAgLy8gRkNQLVNDU0kgTFVOIGNvZGluZyAoNDBoIGZvciBWU0EpCisgIFVDSEFSIEx1bk1hc2tpbmc7ICAgICAvLyBUcnVlIGlmIHNlbGVjdGl2ZSBwcmVzZW50YXRpb24gc3VwcG9ydGVkCisgIFVDSEFSIGx1bltDUFFGQ1RTX01BWF9MVU5dOworfSBTQ1NJX05FWFVTOworCisKK3R5cGVkZWYgc3RydWN0ICAgICAgICAKK3sKKyAgdW5pb24gCisgIHsKKyAgICBVQ0hBUiB1Y1dXTls4XTsgIC8vIGEgRkMgNjQtYml0IFdvcmxkIFdpZGUgTmFtZS8gUG9ydElEIG9mIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgLy8gYWRkcmVzc2luZyBvZiBzaW5nbGUgdGFyZ2V0IG9uIHNpbmdsZSBsb29wLi4uCisgICAgdTY0IGxpV1dOOworICB9IHU7CisKKyAgVUxPTkcgcG9ydF9pZDsgICAgIC8vIGEgRkMgMjQtYml0IGFkZHJlc3Mgb2YgcG9ydCAobG93ZXIgOCBiaXRzID0gYWxfcGEpCisKKyNkZWZpbmUgUkVQT1JUX0xVTlNfUEwgMjU2ICAKKyAgVUNIQVIgUmVwb3J0THVuc1BheWxvYWRbUkVQT1JUX0xVTlNfUExdOworICAKKyAgU0NTSV9ORVhVUyBTY3NpTmV4dXM7IC8vIExVTnMgcGVyIEZDIGRldmljZQorCisgIFVMT05HIExPR09fY291bnRlcjsgLy8gbWlnaHQgdHJ5IHNldmVyYWwgdGltZXMgYmVmb3JlIGxvZ2dpbmcgb3V0IGZvciBnb29kCisgIFVMT05HIExPR09fdGltZXI7ICAgLy8gYWZ0ZXIgTElQLCBwb3J0cyBleHBlY3RpbmcgUERJU0MgbXVzdCB0aW1lLW91dCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAvLyBMT0dPdXQgaWYgc3VjY2Vzc2Z1bCBQRElTQyBub3QgY29tcGxldGVkIGluIDIgc2VjcworCisgIFVMT05HIGNvbmN1cnJlbnRfc2VxOyAgLy8gbXVzdCBiZSAxIG9yIGdyZWF0ZXIKKyAgVUxPTkcgcnhfZGF0YV9zaXplOyAgICAvLyBlLmcuIDEyOCwgMjU2LCAxMDI0LCAyMDQ4IHBlciBGQy1QSCBzcGVjCisgIFVMT05HIEJCX2NyZWRpdDsKKyAgVUxPTkcgRUVfY3JlZGl0OworCisgIFVMT05HIGZjcF9pbmZvOyAgICAgICAgLy8gZnJvbSBQUkxJIChpLmUuIElOSVRJQVRPUi8gVEFSR0VUIGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWdzIGZvciBsb2dpbiBwcm9jZXNzCisgIEJPT0xFQU4gT3JpZ2luYXRvcjsgICAgLy8gTG9naW4gc2VxdWVuY2UgT3JpZ2luYXRlZCAoaWYgZmFsc2UsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uZGVkIHRvIGFub3RoZXIgcG9ydCdzIGxvZ2luIHNlcXVlbmNlKQorICBCT09MRUFOIHBsb2dpOyAgICAgICAgIC8vIFBMT0dJIGZyYW1lIEFDQ2VwdGVkIChvcmlnaW5hdGVkIG9yIHJlc3BvbmRlZCkKKyAgQk9PTEVBTiBwZGlzYzsgICAgICAgICAvLyBQRElTQyBmcmFtZSB3YXMgT1JJR0lOQVRFRCAoc2VsZi1sb2dpbiBsb2dpYykKKyAgQk9PTEVBTiBwcmxpOyAgICAgICAgICAvLyBQUkxJIGZyYW1lIEFDQ2VwdGVkIChvcmlnaW5hdGVkIG9yIHJlc3BvbmRlZCkKKyAgQk9PTEVBTiBmbG9naTsgICAgICAgICAvLyBGTE9HSSBmcmFtZSBBQ0NlcHRlZCAob3JpZ2luYXRlZCBvciByZXNwb25kZWQpCisgIEJPT0xFQU4gbG9nbzsgICAgICAgICAgLy8gcG9ydCBwZXJtYW5lbnRseSBsb2dnZWQgb3V0IChpbnZhbGlkIGxvZ2luIHBhcmFtKQorICBCT09MRUFOIGZsb2dpUmVxOyAgICAgIC8vIEZhYnJpYyBsb2dpbiByZXF1aXJlZCAoc2V0IGluIExJUCBwcm9jZXNzKQorICBVQ0hBUiBoaWdoZXN0X3ZlcjsKKyAgVUNIQVIgbG93ZXN0X3ZlcjsKKworICAKKyAgLy8gd2hlbiB0aGUgInRhcmdldCIgKGFjdHVhbGx5IEZDIFBvcnQpIGlzIHdhaXRpbmcgZm9yIGxvZ2luCisgIC8vIChlLmcuIGFmdGVyIExpbmsgcmVzZXQpLCBzZXQgdGhlIGRldmljZV9ibG9ja2VkIGJpdDsKKyAgLy8gYWZ0ZXIgUG9ydCBjb21wbGV0ZXMgbG9naW4sIHVuLWJsb2NrIHRhcmdldC4KKyAgVUNIQVIgZGV2aWNlX2Jsb2NrZWQ7IC8vIHNlZSBTY3NpX0RldmljZSBzdHJ1Y3QKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgc2luZ2x5LWxpbmtlZCBsaXN0IG9mIGxvZ2dlZC1pbiBwb3J0cworICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGEgcG9ydF9pZCBpcyBpZGVudGlmaWVkLCBpdCBpcyByZW1lbWJlcmVkLAorICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBwb3J0IGlzIHJlbW92ZWQgaW5kZWZpbml0ZWx5CisgIFBWT0lEIHBOZXh0UG9ydDsgIC8vIGFjdHVhbGx5LCB0eXBlIFBGQ19MT0dHRURJTl9QT1JUOyB2b2lkIGZvciBDb21waWxlcgorCit9IEZDX0xPR0dFRElOX1BPUlQsICpQRkNfTE9HR0VESU5fUE9SVDsKKworCisKKy8vIFRoaXMgc2VydmVzIGFzIHRoZSBFU0IgKEV4Y2hhbmdlIFN0YXR1cyBCbG9jayksCisvLyBhbmQgaGFzIHRpbWVvdXQgY291bnRlcjsgdXNlZCBmb3IgQUJPUlRzCit0eXBlZGVmIHN0cnVjdCAgICAgICAgICAgICAgICAKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkMtMSBYX0lEcworICBVTE9ORyB0eXBlOyAgICAgICAgICAgIC8vIEVMU19QTE9HSSwgU0NTSV9JV0UsIC4uLiAoMCBpZiBmcmVlKQorICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OyAvLyBGQyBkZXZpY2Ugb24gb3RoZXIgZW5kIG9mIEV4Y2hhbmdlCisgIFNjc2lfQ21uZCAqQ21uZDsgICAgICAgLy8gTGludXggU0NTSSBjb21tYW5kIHBhY2tldCBpbmNsdWRlcyBTL0cgbGlzdAorICBVTE9ORyB0aW1lT3V0OyAgICAgICAgIC8vIHVuaXRzIG9mID8/LCBERUMgYnkgZHJpdmVyLCBBYm9ydCB3aGVuIDAKKyAgVUxPTkcgcmVUcmllczsgICAgICAgICAvLyBuZWVkIG9uZSBvciBtb3JlIHJldHJpZXM/CisgIFVMT05HIHN0YXR1czsgICAgICAgICAgLy8gZmxhZ3MgaW5kaWNhdGluZyBlcnJvcnMgKDAgaWYgbm9uZSkKKyAgVGFjaExpdGVJUkIgSVJCOyAgICAgICAvLyBJL08gUmVxdWVzdCBCbG9jaywgZ2V0cyBjb3BpZWQgdG8gRVJRCisgIFRhY2hGQ0hEUl9HQ01ORCBmY2hzOyAgLy8gbG9jYXRpb24gb2YgSVJCJ3MgUmVxX0FfU0ZTX0FkZHIKK30gRkNfRVhDSEFOR0UsICpQRkNfRVhDSEFOR0U7CisKKy8vIFVuZm9ydHVuYXRlbHksIExpbnV4IGxpbWl0cyBvdXIga21hbGxvYygpIGFsbG9jYXRpb25zIHRvIDEyOGsuCisvLyBCZWNhdXNlIG9mIHRoaXMgYW5kIHRoZSBmYWN0IHRoYXQgb3VyIFNjc2lSZWdpc3RlciBhbGxvY2F0aW9uCisvLyBpcyBhbHNvIGNvbnN0cmFpbmVkLCB3ZSBtb3ZlIHRoaXMgbGFyZ2Ugc3RydWN0dXJlIG91dCBmb3IKKy8vIGFsbG9jYXRpb24gYWZ0ZXIgU2NzaSBSZWdpc3Rlci4KKy8vIChJbiBvdGhlciB3b3JkcywgdGhpcyBjdW1iZXJzb21lIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeQorLy8gYmVjYXVzZSBvZiBrZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gY29uc3RyYWludHMhKQorCit0eXBlZGVmIHN0cnVjdCAvLyB3ZSB3aWxsIGFsbG9jYXRlIHRoaXMgZHluYW1pY2FsbHkKK3sKKyAgRkNfRVhDSEFOR0UgZmNFeGNoYW5nZVsgVEFDSF9NQVhfWElEIF07Cit9IEZDX0VYQ0hBTkdFUzsKKworCisKKworCisKKworCisKKworCit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyIE5hbWVbNjRdOyAvLyBuYW1lIG9mIGNvbnRyb2xsZXIgKCJIUCBUYWNobGl0ZSBUTCBSZXYyLjAsIDMzTUh6LCA2NGJpdCBidXMiKQorICAvL1BWT0lEICBwQWRhcHRlckRldkV4dDsgLy8gYmFjayBwb2ludGVyIHRvIGRldmljZSBvYmplY3QvZXh0ZW5zaW9uCisgIFVMT05HIENoaXBUeXBlOyAgICAgICAgLy8gbG9jYWwgbnVtZXJpYyBrZXkgZm9yIFRhY2h5b24gVHlwZSAvIFJldi4KKyAgVUxPTkcgc3RhdHVzOyAgICAgICAgICAgICAgLy8gb3VyIERyaXZlciAtIGxvZ2ljYWwgc3RhdHVzCisgIAorICBUTF9SRUdJU1RFUlMgUmVnaXN0ZXJzOyAgICAvLyByZWcgYWRkcmVzc2VzICYgaG9zdCBtZW1vcnkgY29waWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZDLTQgbWFwcGluZyBvZiAndHJhbnNhY3Rpb24nIHRvIFhfSURzCisgIFVDSEFSIExJTFBtYXBbMzIqNF07ICAgICAgIC8vIExvb3AgUG9zaXRpb24gTWFwIG9mIEFMUEFzIChsYXRlIEZDLUFMIG9ubHkpCisgIEZDX09QVElPTlMgT3B0aW9uczsgICAgICAgIC8vIGUuZy4gVGFyZ2V0LCBJbml0aWF0b3IsIGxvb3BiYWNrLi4uCisgIFVDSEFSIGhpZ2hlc3RfRkNQSF92ZXI7ICAgIC8vIEZDLVBIIHZlcnNpb24gbGltaXRzCisgIFVDSEFSIGxvd2VzdF9GQ1BIX3ZlcjsgICAgIC8vIEZDLVBIIHZlcnNpb24gbGltaXRzCisKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXM7ICAKKyAgVUxPTkcgZmNMc0V4Y2hhbmdlTFJVOyAgICAgICAvLyBMZWFzdCBSZWNlbnRseSBVc2VkIGNvdW50ZXIgKExpbmsgU2VydmljZSkKKyAgVUxPTkcgZmNTZXN0RXhjaGFuZ2VMUlU7ICAgICAgIC8vIExlYXN0IFJlY2VudGx5IFVzZWQgY291bnRlciAoRkNQLVNDU0kpCisgIEZDX0xPR0dFRElOX1BPUlQgZmNQb3J0czsgIC8vIGxpbmtlZCBsaXN0IG9mIGV2ZXJ5IEZDIHBvcnQgZXZlciBzZWVuCisgIEZDU1RBVFMgZmNTdGF0czsgICAgICAgICAgIC8vIEZDIGNvbW0gZXJyIGNvdW50ZXJzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9zdCBtZW1vcnkgUVVFVUUgcG9pbnRlcnMKKyAgVGFjaExpdGVFUlEgKkVSUTsgICAgICAgICAgLy8gRXhjaGFuZ2UgUmVxdWVzdCBRdWUgCisgIFRhY2h5b25JTVEgKklNUTsgICAgICAgICAgIC8vIEluYm91bmQgTWVzc2FnZSBRdWUgCisgIFRhY2hMaXRlU0ZRICpTRlE7ICAgICAgICAgIC8vIFNpbmdsZSBGcmFtZSBRdWV1ZQorICBUYWNoU0VTVCAqU0VTVDsgICAgICAgICAgICAvLyBTQ1NJIEV4Y2hhbmdlIFN0YXRlIFRhYmxlCisKKyAgZG1hX2FkZHJfdCBleGNoX2RtYV9oYW5kbGU7CisKKyAgLy8gdGhlc2UgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIGZvciAiZ2VuZXJpYyIgZnVuY3Rpb25zLCB3aGljaCBhcmUKKyAgLy8gcmVwbGFjZWQgd2l0aCBIb3N0IEJ1cyBBZGFwdGVyIHR5cGVzIGF0CisgIC8vIHJ1bnRpbWUuCisgIGludCAoKkNyZWF0ZVRhY2h5b25RdWVzKSggdm9pZCogLCBpbnQpOworICBpbnQgKCpEZXN0cm95VGFjaHlvblF1ZXMpKCB2b2lkKiAsIGludCk7CisgIGludCAoKkxhc2VyQ29udHJvbCkodm9pZCosIGludCApOyAgIC8vIGUuZy4gT24vT2ZmCisgIGludCAoKlJlc2V0VGFjaHlvbikodm9pZCosIGludCApOworICB2b2lkICgqRnJlZXplVGFjaHlvbikodm9pZCosIGludCApOworICB2b2lkICgqVW5GcmVlemVUYWNoeW9uKSh2b2lkKiwgaW50ICk7CisgIGludCAoKkluaXRpYWxpemVUYWNoeW9uKSh2b2lkKiwgaW50LCBpbnQgKTsKKyAgaW50ICgqSW5pdGlhbGl6ZUZyYW1lTWFuYWdlcikodm9pZCosIGludCApOworICBpbnQgKCpQcm9jZXNzSU1RRW50cnkpKHZvaWQqKTsKKyAgaW50ICgqUmVhZFdyaXRlV1dOKSh2b2lkKiwgaW50IFJlYWRXcml0ZSk7CisgIGludCAoKlJlYWRXcml0ZU5WUkFNKSh2b2lkKiwgdm9pZCosIGludCBSZWFkV3JpdGUpOworCit9IFRBQ0hZT04sICpQVEFDSFlPTjsKKworCit2b2lkIGNwcWZjVFNDbGVhckxpbmtTdGF0dXNDb3VudGVycyhUQUNIWU9OICogZmNDaGlwKTsKKworaW50IENwcVRzQ3JlYXRlVGFjaExpdGVRdWVzKCB2b2lkKiBwSEJBLCBpbnQgb3Bjb2RlKTsKK2ludCBDcHFUc0Rlc3Ryb3lUYWNoTGl0ZVF1ZXMoIHZvaWQqICwgaW50KTsKK2ludCBDcHFUc0luaXRpYWxpemVUYWNoTGl0ZSggdm9pZCAqcEhCQSwgaW50IG9wY29kZTEsIGludCBvcGNvZGUyKTsKKworaW50IENwcVRzUHJvY2Vzc0lNUUVudHJ5KHZvaWQqIHBIQkEpOworaW50IENwcVRzUmVzZXRUYWNoTGl0ZSh2b2lkICpwSEJBLCBpbnQgdHlwZSk7Cit2b2lkIENwcVRzRnJlZXplVGFjaGxpdGUodm9pZCAqcEhCQSwgaW50IHR5cGUpOwordm9pZCBDcHFUc1VuRnJlZXplVGFjaGxpdGUodm9pZCAqcEhCQSwgaW50IHR5cGUpOworaW50IENwcVRzSW5pdGlhbGl6ZUZyYW1lTWFuYWdlcih2b2lkICpwSEJBLCBpbnQpOworaW50IENwcVRzTGFzZXJDb250cm9sKCB2b2lkKiBhZGRyQmFzZSwgaW50IG9wY29kZSApOworaW50IENwcVRzUmVhZFdyaXRlV1dOKHZvaWQqLCBpbnQgUmVhZFdyaXRlKTsKK2ludCBDcHFUc1JlYWRXcml0ZU5WUkFNKHZvaWQqLCB2b2lkKiBkYXRhLCBpbnQgUmVhZFdyaXRlKTsKKwordm9pZCBjcHFmY1RTX1dvcmtUYXNrKCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlcik7Cit2b2lkIGNwcWZjVFNXb3JrZXJUaHJlYWQoIHZvaWQgKmhvc3QpOworCitpbnQgY3BxZmNUU19HZXROVlJBTV9kYXRhKCBVQ0hBUiAqd3duYnVmLCBVQ0hBUiAqYnVmICk7CitVTE9ORyBjcHFmY1RTX1JlYWROVlJBTSggdm9pZCogR1BJT2luLCB2b2lkKiBHUElPb3V0ICwgVVNIT1JUIGNvdW50LAorCVVDSEFSICpidWYgKTsKKworQk9PTEVBTiB0bF93cml0ZV9pMmNfbnZyYW0oIHZvaWQqIEdQSU9pbiwgdm9pZCogR1BJT291dCwKKyAgVVNIT1JUIHN0YXJ0T2Zmc2V0LCAgLy8gZS5nLiAweDJmIGZvciBXV04gc3RhcnQKKyAgVVNIT1JUIGNvdW50LAorICBVQ0hBUiAqYnVmICk7CisKKworLy8gZGVmaW5lIG1pc2MgZnVuY3Rpb25zIAoraW50IGNwcWZjVFNHZXRMUFNNKCBQVEFDSFlPTiBmY0NoaXAsIGNoYXIgY0Vycm9yU3RyaW5nW10pOworaW50IGNwcWZjVFNEZWNvZGVHQklDdHlwZSggUFRBQ0hZT04gZmNDaGlwLCBjaGFyIGNFcnJvclN0cmluZ1tdKTsKK3ZvaWQqIGZjTWVtTWFuYWdlciggc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCUFMSUdORURfTUVNICpkeW5fbWVtX3BhaXIsIFVMT05HIG5fYWxsb2MsIFVMT05HIGFiLAorICAgICAgICAgICAgICAgICAgIFVMT05HIHVsQWxpZ25lZEFkZHJlc3MsIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpOworCit2b2lkIEJpZ0VuZGlhblN3YXAoICBVQ0hBUiAqc291cmNlLCBVQ0hBUiAqZGVzdCwgIFVTSE9SVCBjbnQpOworCisvL1VMT05HIHZpcnRfdG9fcGh5cyggUFZPSUQgdmlydGFkZHIgKTsKKyAgICAgICAgICAgICAgICAgIAorCisvLyBMaW51eCBpbnRlcnJ1cHQgaGFuZGxlcgoraXJxcmV0dXJuX3QgY3BxZmNUU19pbnRyX2hhbmRsZXIoIGludCBpcnEsdm9pZCAqZGV2X2lkLHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgY3BxZmNUU2hlYXJ0YmVhdCggdW5zaWduZWQgbG9uZyBwdHIgKTsKKworCisKKy8vIFRoZSBiaWdnZXN0IFEgZWxlbWVudCB3ZSBkZWFsIHdpdGggaXMgQWJvcnRzIC0gd2UKKy8vIG5lZWQgNCBieXRlcyBmb3IgeF9JRCwgYW5kIGEgU2NzaV9DbW5kICh+Mjg0IGJ5dGVzKQorLy8jZGVmaW5lIExJTktRX0lURU1fU0laRSAoKDQrc2l6ZW9mKFNjc2lfQ21uZCkrMykvNCkKKyNkZWZpbmUgTElOS1FfSVRFTV9TSVpFICgzKjE2KQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUxPTkcgVHlwZTsgICAgICAgICAgICAgIC8vIGUuZy4gTElOS1VQLCBTRlFFTlRSWSwgUERJU0MsIEJMU19BQlRTLCAuLi4KKyAgVUxPTkcgdWxCdWZmWyBMSU5LUV9JVEVNX1NJWkUgXTsKK30gTElOS1FfSVRFTTsKKworI2RlZmluZSBGQ19MSU5LUV9ERVBUSCBUQUNIX01BWF9YSUQKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVMT05HIHByb2R1Y2VyOworICBVTE9ORyBjb25zdW1lcjsgIC8vIHdoZW4gcHJvZHVjZXIgZXF1YWxzIGNvbnN1bWVyLCBRIGVtcHR5CisKKyAgTElOS1FfSVRFTSBRaXRlbVsgRkNfTElOS1FfREVQVEggXTsKKworfSBGQ19MSU5LX1FVRSwgKlBGQ19MSU5LX1FVRTsKKworCisgICAgIC8vIERQQyByb3V0aW5lcyBwb3N0IHRvIGhlcmUgb24gSW5ib3VuZCBTQ1NJIGZyYW1lcworICAgICAvLyBVc2VyIHRocmVhZCBwcm9jZXNzZXMKKyNkZWZpbmUgRkNfU0NTSVFfREVQVEggMzIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IFR5cGU7ICAgICAgICAgICAgICAvLyBlLmcuIFNDU0kKKyAgVUxPTkcgdWxCdWZmWyAzKjE2IF07Cit9IFNDU0lRX0lURU07CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFVMT05HIHByb2R1Y2VyOworICBVTE9ORyBjb25zdW1lcjsgIC8vIHdoZW4gcHJvZHVjZXIgZXF1YWxzIGNvbnN1bWVyLCBRIGVtcHR5CisKKyAgU0NTSVFfSVRFTSBRaXRlbVsgRkNfU0NTSVFfREVQVEggXTsKKworfSBGQ19TQ1NJX1FVRSwgKlBGQ19TQ1NJX1FVRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIFRoaXMgaXMgdGFja2VkIG9uIHRvIGEgU2NzaV9SZXF1ZXN0IGluIHVwcGVyX3ByaXZhdGVfZGF0YSAKKwkgICBmb3IgcGFzdGhyb3VnaCBpb2N0bHMsIGFzIGEgcGxhY2UgdG8gaG9sZCBkYXRhIHRoYXQgY2FuJ3QgCisJICAgYmUgc3Rhc2hlZCBhbnl3aGVyZSBlbHNlIGluIHRoZSBTY3NpX1JlcXVlc3QuICBXZSBkaWZmZXJlbnRpYXRlCisJICAgdGhpcyBmcm9tIF9yZWFsXyB1cHBlcl9wcml2YXRlX2RhdGEgYnkgY2hlY2tpbmcgaWYgdGhlIHZpcnQgYWRkcgorCSAgIGlzIHdpdGhpbiBvdXIgc3BlY2lhbCBwb29sLiAgKi8KKwl1c2hvcnQgYnVzOworCXVzaG9ydCBwZHJpdmU7Cit9IGNwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdDsKKworI2RlZmluZSBDUFFGQ19NQVhfUEFTU1RIUlVfQ01EUyAxMDAKKworI2RlZmluZSBEWU5BTUlDX0FMTE9DQVRJT05TIDQgIC8vIFRhY2h5b24gYWxpZ25lZCBhbGxvY2F0aW9uczogRVJRLElNUSxTRlEsU0VTVAorCisvLyBMaW51eCBzcGFjZSBhbGxvY2F0ZWQgcGVyIEhCQSAoY2hpcCBzdGF0ZSwgZXRjLikKK3R5cGVkZWYgc3RydWN0IAoreworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlcjsgLy8gYmFjayBwb2ludGVyIHRvIExpbnV4IFNjc2kgc3RydWN0CisKKyAgVEFDSFlPTiBmY0NoaXA7ICAgIC8vIEFsbCBUYWNoeW9uIHJlZ2lzdGVycywgUXVldWVzLCBmdW5jdGlvbnMKKyAgQUxJR05FRF9NRU0gZHluYW1pY19tZW1bRFlOQU1JQ19BTExPQ0FUSU9OU107CisKKyAgc3RydWN0IHBjaV9kZXYgKlBjaURldjsKKyAgZG1hX2FkZHJfdCBmY0xRX2RtYV9oYW5kbGU7CisKKyAgU2NzaV9DbW5kICpMaW5rRG5DbW5kW0NQUUZDVFNfUkVRX1FVRVVFX0xFTl07IC8vIGNvbGxlY3RzIENtbmRzIGR1cmluZyBMRG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3IgQWNjZXB0YWJsZSB0YXJnZXRzKQorICBTY3NpX0NtbmQgKkJvYXJkTG9ja0NtbmRbQ1BRRkNUU19SRVFfUVVFVUVfTEVOXTsgLy8gU0VTVCB3YXMgZnVsbAorICAKKyAgU2NzaV9DbW5kICpCYWRUYXJnZXRDbW5kW0NQUUZDVFNfTUFYX1RBUkdFVF9JRF07IC8vIG1pc3NpbmcgdGFyZ2V0cworCisgIHVfY2hhciBIQkFudW07ICAgICAvLyAwLWJhc2VkIGhvc3QgbnVtYmVyCisKKworICBzdHJ1Y3QgdGltZXJfbGlzdCBjcHFmY1RTdGltZXI7IC8vIEZDIHV0aWxpdHkgdGltZXIgZm9yIGltcGxpY2l0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nb3V0cywgRkMgcHJvdG9jb2wgdGltZW91dHMsIGV0Yy4KKyAgaW50IGZjU3RhdHNUaW1lOyAgLy8gU3RhdGlzdGljcyBkZWx0YSByZXBvcnRpbmcgdGltZQorCisgIHN0cnVjdCB0YXNrX3N0cnVjdCAqd29ya2VyX3RocmVhZDsgLy8gb3VyIGtlcm5lbCB0aHJlYWQKKyAgaW50IFBvcnREaXNjRG9uZTsgICAgLy8gc2V0IGJ5IFNlbmRMb2dpbnMoKSwgY2xlYXJlZCBieSBMRG4KKyAgCisgIHN0cnVjdCBzZW1hcGhvcmUgKlRhY2hGcm96ZW47CisgIHN0cnVjdCBzZW1hcGhvcmUgKlRZT0Jjb21wbGV0ZTsgICAgLy8gaGFuZHNoYWtlIGZvciBUYWNoIG91dGJvdW5kIGZyYW1lcworICBzdHJ1Y3Qgc2VtYXBob3JlICpmY1F1ZVJlYWR5OyAgICAgIC8vIEZpYnJlQ2hhbm5lbCB3b3JrIGZvciBvdXIga2VybmVsIHRocmVhZAorICBzdHJ1Y3Qgc2VtYXBob3JlICpub3RpZnlfd3Q7ICAgICAgIC8vIHN5bmNocm9uaXplcyBrZXJuZWwgdGhyZWFkIGtpbGwKKyAgc3RydWN0IHNlbWFwaG9yZSAqQm9hcmRMb2NrOworICAKKyAgUEZDX0xJTktfUVVFIGZjTFE7ICAgICAgICAgICAgIC8vIHRoZSBXb3JrZXJUaHJlYWQgb3BlcmF0ZXMgb24gdGhpcworCisgIHNwaW5sb2NrX3QgaGJhX3NwaW5sb2NrOyAgICAgICAgICAgLy8gaGVsZC9yZWxlYXNlZCBieSBXb3JrZXJUaHJlYWQKKyAgY3BxZmNfcGFzc3RocnVfcHJpdmF0ZV90ICpwcml2YXRlX2RhdGFfcG9vbDsKKyAgdW5zaWduZWQgbG9uZyAqcHJpdmF0ZV9kYXRhX2JpdHM7CisKK30gQ1BRRkNIQkE7CisKKyNkZWZpbmUJQ1BRX1NQSU5MT0NLX0hCQSggeCApICAgc3Bpbl9sb2NrKCZ4LT5oYmFfc3BpbmxvY2spOworI2RlZmluZSBDUFFfU1BJTlVOTE9DS19IQkEoeCkgICBzcGluX3VubG9jaygmeC0+aGJhX3NwaW5sb2NrKTsKKworCisKK3ZvaWQgY3BxZmNUU0ltcGxpY2l0TG9nb3V0KCBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhLAorCQlQRkNfTE9HR0VESU5fUE9SVCBwRmNQb3J0KTsKKworCit2b2lkIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggQ1BRRkNIQkEqLCBTQ1NJX05FWFVTICp0YXJnZXQsIGludCApOworCitQRkNfTE9HR0VESU5fUE9SVCBmY1BvcnRMb2dnZWRJbiggCisgICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLCAKKyAgIFRhY2hGQ0hEUl9HQ01ORCogZmNocywgCisgICBCT09MRUFOLCAKKyAgIEJPT0xFQU4pOwordm9pZCBmY1Byb2Nlc3NMb2dnZWRJbiggCisgICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLCBUYWNoRkNIRFJfR0NNTkQqIGZjaHMpOworCisKK1VMT05HIGNwcWZjVFNCdWlsZEV4Y2hhbmdlKCAKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwKKyAgVUxPTkcgdHlwZSwgLy8gZS5nLiBQTE9HSQorICBUYWNoRkNIRFJfR0NNTkQqIEluRkNIUywgIC8vIGluY29taW5nIEZDSFMKKyAgdm9pZCAqRGF0YSwgICAgICAgICAgICAgICAvLyB0aGUgQ0RCLCBzY2F0dGVyL2dhdGhlciwgZXRjLiAgCisgIExPTkcgKkV4Y2hhbmdlSUQgKTsgICAgICAgLy8gYWxsb2NhdGVkIGV4Y2hhbmdlIElECisKK1VMT05HIGNwcWZjVFNTdGFydEV4Y2hhbmdlKCAKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwKKyAgTE9ORyBFeGNoYW5nZUlEICk7CisKK3ZvaWQgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIAorICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCisgICAgICAgUFRBQ0hZT04gZmNDaGlwLCAKKyAgICAgICBVTE9ORyBleGNoYW5nZV9JRCk7CisKKworUEZDX0xPR0dFRElOX1BPUlQgIGZjRmluZExvZ2dlZEluUG9ydCggCisgIFBUQUNIWU9OIGZjQ2hpcCwgCisgIFNjc2lfQ21uZCAqQ21uZCwgIC8vIChXZSB3YW50IHRoZSBjaGFubmVsL3RhcmdldC9sdW4gTmV4dXMgZnJvbSBDbW5kKQorICBVTE9ORyBwb3J0X2lkLCAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBhbF9wYSwgb3IKKyAgVUNIQVIgd3duWzhdLCAgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFdXTiwgb3IuLi4KKyAgUEZDX0xPR0dFRElOX1BPUlQgKnBMYXN0TG9nZ2VkSW5Qb3J0CispOworCit2b2lkIGNwcWZjVFNQdXRMaW5rUXVlKCAKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgCisgIGludCBUeXBlLCAKKyAgdm9pZCAqUXVlQ29udGVudCk7CisKK3ZvaWQgZmNQdXRTY3NpUXVlKCAKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgCisgIGludCBUeXBlLCAKKyAgdm9pZCAqUXVlQ29udGVudCk7CisKK3ZvaWQgZmNMaW5rUVJlc2V0KAorICAgQ1BRRkNIQkEgKik7Cit2b2lkIGZjU2NzaVFSZXNldCgKKyAgIENQUUZDSEJBICopOwordm9pZCBmY1Nlc3RSZXNldCgKKyAgIENQUUZDSEJBICopOworCit2b2lkIGNwcWZjX3BjaV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCAKKwlTY3NpX0NtbmQgKmNtZCwgCisJUFRBQ0hZT04gZmNDaGlwLCAKKwlVTE9ORyB4X0lEKTsKKworZXh0ZXJuIGNvbnN0IFVDSEFSIHZhbGlkX2FsX3BhW107CitleHRlcm4gY29uc3QgaW50IG51bWJlcl9vZl9hbF9wYTsKKworI2RlZmluZSBGQ1BfUkVTSURfVU5ERVIgICAweDgwMDAwCisjZGVmaW5lIEZDUF9SRVNJRF9PVkVSICAgIDB4NDAwMDAKKyNkZWZpbmUgRkNQX1NOU19MRU5fVkFMSUQgMHgyMDAwMAorI2RlZmluZSBGQ1BfUlNQX0xFTl9WQUxJRCAweDEwMDAwCisKKy8vIFJTUF9DT0RFIGRlZmluaXRpb25zIChkcEFOUyBGaWJyZSBDaGFubmVsIFByb3RvY29sIGZvciBTQ1NJLCBwZyAzNCkKKyNkZWZpbmUgRkNQX0RBVEFfTEVOX05PVF9CVVJTVF9MRU4gMHgxMDAwMDAwCisjZGVmaW5lIEZDUF9DTU5EX0ZJRUxEX0lOVkFMSUQgICAgIDB4MjAwMDAwMAorI2RlZmluZSBGQ1BfREFUQV9ST19OT1RfWFJEWV9STyAgICAweDMwMDAwMDAKKyNkZWZpbmUgRkNQX1RBU0tGVU5DVElPTl9OUyAgICAgICAgMHg0MDAwMDAwCisjZGVmaW5lIEZDUF9UQVNLRlVOQ1RJT05fRkFJTCAgICAgIDB4NTAwMDAwMAorCisvLyBGQ1AtU0NTSSByZXNwb25zZSBzdGF0dXMgc3RydWN0Cit0eXBlZGVmIHN0cnVjdCAgLy8gc2VlICJUYWNoRkNIRFJfUlNQIiBkZWZpbml0aW9uIC0gNjQgYnl0ZXMKK3sKKyAgX191MzIgcmVzZXJ2ZWQ7CisgIF9fdTMyIHJlc2VydmVkMTsKKyAgX191MzIgZmNwX3N0YXR1czsgICAgLy8gZmllbGQgdmFsaWRpdHkgYW5kIFNDU0kgc3RhdHVzCisgIF9fdTMyIGZjcF9yZXNpZDsKKyAgX191MzIgZmNwX3Nuc19sZW47ICAgLy8gbGVuZ3RoIG9mIEZDUF9TTlNfSU5GTyBmaWVsZAorICBfX3UzMiBmY3BfcnNwX2xlbjsgICAvLyBsZW5ndGggb2YgRkNQX1JTUF9JTkZPIGZpZWxkIChleHBlY3QgOCkKKyAgX191MzIgZmNwX3JzcF9pbmZvOyAgLy8gNCBieXRlcyBvZiBGQ1AgcHJvdG9jb2wgcmVzcG9uc2UgaW5mb3JtYXRpb24KKyAgX191MzIgZmNwX3JzcF9pbmZvMjsgLy8gKDQgbW9yZSBieXRlcywgc2luY2UgbW9zdCBpbXBsZW1lbnRhdGlvbnMgdXNlIDgpCisgIF9fdTggIGZjcF9zbnNfaW5mb1szNl07IC8vIGJ5dGVzIGZvciBTQ1NJIHNlbnNlIChBU0MsIEFTQ1EpCisKK30gRkNQX1NUQVRVU19SRVNQT05TRSwgKlBGQ1BfU1RBVFVTX1JFU1BPTlNFOworCisKKy8vIEZhYnJpYyBTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uCit0eXBlZGVmIHN0cnVjdCBzY3JwbAoreworICBfX3UzMiBjb21tYW5kOworICBfX3UzMiBmdW5jdGlvbjsKK30gU0NSX1BMOworCisvLyBGYWJyaWMgTmFtZSBTZXJ2aWNlIFJlcXVlc3QKK3R5cGVkZWYgc3RydWN0IG5zcnBsCit7CisgIF9fdTMyIENUX1JldjsgIC8vICgmIElOX0lEKSAgIFdPUkQgMAorICBfX3UzMiBGQ1NfVHlwZTsgICAgICAgICAgICAvLyBXT1JEIDEKKyAgX191MzIgQ29tbWFuZF9jb2RlOyAgICAgICAgLy8gV09SRCAyCisgIF9fdTMyIHJlYXNvbl9jb2RlOyAgICAgICAgIC8vIFdPUkQgMworICBfX3UzMiBGQ1A7ICAgICAgICAgICAgICAgICAvLyBXT1JEIDQgKGxvd2VyIGJ5dGUpCisgIAorfSBOU1JfUEw7CisKKworCisvLyAiRkMuSCIKKyNkZWZpbmUgTUFYX1JYX1NJWkUJCTB4ODAwCS8vIE1heCBSZWNlaXZlIEJ1ZmZlciBTaXplIGlzIDIwNDgKKyNkZWZpbmUgTUlOX1JYX1NJWkUJCTB4MTAwCS8vIE1pbiBTaXplIGlzIDI1NiwgcGVyIEZDLVBMREEgU3BlYworI2RlZmluZQlNQVhfVEFSR0VUX1JYSURTCVNFU1RfREVQVEgKKyNkZWZpbmUgVEFSR0VUX1JYX1NJWkUJCVNFU1RfQlVGRkVSX0xFTkdUSAorCisjZGVmaW5lIENMQVNTXzEJCQkweDAxCisjZGVmaW5lIENMQVNTXzIJCQkweDAyCisjZGVmaW5lIENMQVNTXzMJCQkweDAzCisKKyNkZWZpbmUgRkNfUEg0MgkJCTB4MDgKKyNkZWZpbmUgRkNfUEg0MwkJCTB4MDkKKyNkZWZpbmUgRkNfUEgzCQkJMHgyMAorCisjZGVmaW5lIFJSX1RPVgkJCTIJLy8gTWluaW11bSBUaW1lIGZvciB0YXJnZXQgdG8gd2FpdCBmb3IKKwkJCQkJLy8gUERJU0MgYWZ0ZXIgYSBMSVAuCisjZGVmaW5lIEVfRF9UT1YJCQkyCS8vIE1pbmltdW0gVGltZSB0byB3YWl0IGZvciBTZXF1ZW5jZQorCQkJCQkvLyBDb21wbGV0aW9uLgorI2RlZmluZSBSX0FfVE9WCQkJMAkvLyBNaW5pbXVtIFRpbWUgZm9yIFRhcmdldCB0byB3YWl0IAorCQkJCQkvLyBiZWZvcmUgcmVjbGFpbWluZyByZXNvdXJjZXMuCisvLworLy8JUl9DVEwgRmllbGQKKy8vCisvLwlSb3V0aW5nIEJpdHMgKDMxLTI4KQorLy8KKyNkZWZpbmUgRkM0X0RFVklDRV9EQVRBCQkweDAwMDAwMDAwCisjZGVmaW5lIEVYVF9MSU5LX0RBVEEJCTB4MjAwMDAwMDAKKyNkZWZpbmUgRkM0X0xJTktfREFUQQkJMHgzMDAwMDAwMAorI2RlZmluZSBWSURFT19EQVRBCQkweDQwMDAwMDAwCisjZGVmaW5lIEJBU0lDX0xJTktfREFUQQkJMHg4MDAwMDAwMAorI2RlZmluZSBMSU5LX0NPTlRST0wJCTB4QzAwMDAwMDAKKyNkZWZpbmUgUk9VVElOR19NQVNLCQkweEYwMDAwMDAwCisKKy8vCisvLwlJbmZvcm1hdGlvbiBCaXRzICgyNy0yNCkKKy8vCisjZGVmaW5lIFVOQ0FUX0lORk9STUFUSU9OCTB4MDAwMDAwMDAKKyNkZWZpbmUgU09MSUNJVEVEX0RBVEEJCTB4MDEwMDAwMDAKKyNkZWZpbmUgVU5TT0xJQ0lURURfQ09OVFJPTAkweDAyMDAwMDAwCisjZGVmaW5lIFNPTElDSVRFRF9DT05UUk9MCTB4MDMwMDAwMDAKKyNkZWZpbmUgVU5TT0xJQ0lURURfREFUQQkweDA0MDAwMDAwCisjZGVmaW5lIERBVEFfREVTQ1JJUFRPUgkJMHgwNTAwMDAwMAorI2RlZmluZSBVTlNPTElDSVRFRF9DT01NQU5ECTB4MDYwMDAwMDAKKyNkZWZpbmUgQ09NTUFORF9TVEFUVVMJCTB4MDcwMDAwMDAKKyNkZWZpbmUgSU5GT19NQVNLCQkweDBGMDAwMDAwCisvLworLy8JKExpbmsgQ29udHJvbCBDb2RlcykKKy8vCisjZGVmaW5lIEFDS18xCQkJMHgwMDAwMDAwMAorI2RlZmluZSBBQ0tfMF9PUl9OCQkweDAxMDAwMDAwCisjZGVmaW5lIFBfUkpUCQkJMHgwMjAwMDAwMCAKKyNkZWZpbmUgRl9SSlQJCQkweDAzMDAwMDAwIAorI2RlZmluZSBQX0JTWQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgRkFCUklDX0JVU1lfVE9fREYJMHgwNTAwMDAwMAkvLyBGYWJyaWMgQnVzeSB0byBEYXRhIEZyYW1lCisjZGVmaW5lIEZBQlJJQ19CVVNZX1RPX0xDCTB4MDYwMDAwMDAJLy8gRmFicmljIEJ1c3kgdG8gTGluayBDdGwgRnJhbWUKKyNkZWZpbmUgTElOS19DUkVESVRfUkVTRVQJMHgwNzAwMDAwMAorLy8KKy8vCShMaW5rIFNlcnZpY2UgQ29tbWFuZCBDb2RlcykKKy8vCisvLyNkZWZpbmUgTFNfUkpUCQkJMHgwMTAwMDAwMAkvLyBMUyBSZWplY3QKKworI2RlZmluZSBMU19BQ0MJCQkweDAyMDAwMDAwCS8vIExTIEFjY2VwdAorI2RlZmluZSBMU19QTE9HSQkJMHgwMzAwMDAwMAkvLyBOX1BPUlQgTG9naW4KKyNkZWZpbmUgTFNfRkxPR0kJCTB4MDQwMDAwMDAJLy8gRl9QT1JUIExvZ2luCisjZGVmaW5lIExTX0xPR08JCQkweDA1MDAwMDAwCS8vIExvZ291dAorI2RlZmluZSBMU19BQlRYCQkJMHgwNjAwMDAwMAkvLyBBYm9ydCBFeGNoYW5nZQorI2RlZmluZSBMU19SQ1MJCQkweDA3MDAwMDAwCS8vIFJlYWQgQ29ubmVjdGlvbiBTdGF0dXMKKyNkZWZpbmUgTFNfUkVTCQkJMHgwODAwMDAwMAkvLyBSZWFkIEV4Y2hhbmdlIFN0YXR1cworI2RlZmluZSBMU19SU1MJCQkweDA5MDAwMDAwCS8vIFJlYWQgU2VxdWVuY2UgU3RhdHVzCisjZGVmaW5lIExTX1JTSQkJCTB4MEEwMDAwMDAJLy8gUmVxdWVzdCBTZXEgSW5pdGlhdGl2ZQorI2RlZmluZSBMU19FU1RTCQkJMHgwQjAwMDAwMAkvLyBFc3RhYmxpc2ggU3RlYW1pbmcKKyNkZWZpbmUgTFNfRVNUQwkJCTB4MEMwMDAwMDAJLy8gRXN0aW1hdGUgQ3JlZGl0CisjZGVmaW5lIExTX0FEVkMJCQkweDBEMDAwMDAwCS8vIEFkdmljZSBDcmVkaXQKKyNkZWZpbmUgTFNfUlRWCQkJMHgwRTAwMDAwMAkvLyBSZWFkIFRpbWVvdXQgVmFsdWUKKyNkZWZpbmUgTFNfUkxTCQkJMHgwRjAwMDAwMAkvLyBSZWFkIExpbmsgU3RhdHVzCisjZGVmaW5lIExTX0VDSE8JCQkweDEwMDAwMDAwCS8vIEVjaG8KKyNkZWZpbmUgTFNfVEVTVAkJCTB4MTEwMDAwMDAJLy8gVGVzdAorI2RlZmluZSBMU19SUlEJCQkweDEyMDAwMDAwCS8vIFJlaW5zdGF0ZSBSZWMuIFF1YWwuCisjZGVmaW5lIExTX1BSTEkJCQkweDIwMDAwMDAwCS8vIFByb2Nlc3MgTG9naW4KKyNkZWZpbmUgTFNfUFJMTwkJCTB4MjEwMDAwMDAJLy8gUHJvY2VzcyBMb2dvdXQKKyNkZWZpbmUgTFNfVFBSTE8JCTB4MjQwMDAwMDAJLy8gM3JkIFBhcnR5IFByb2Nlc3MgTG9nb3V0CisjZGVmaW5lIExTX1BESVNDCQkweDUwMDAwMDAwCS8vIFByb2Nlc3MgRGlzY292ZXJ5CisjZGVmaW5lIExTX0ZESVNDCQkweDUxMDAwMDAwCS8vIEZhYnJpYyBEaXNjb3ZlcnkKKyNkZWZpbmUgTFNfQURJU0MJCTB4NTIwMDAwMDAJLy8gRGlzY292ZXIgQWRkcmVzcworI2RlZmluZSBMU19STkMJCQkweDUzMDAwMDAwCS8vIFJlcG9ydCBOb2RlIENhcGFiaWxpdHkKKyNkZWZpbmUgTFNfU0NSICAgICAgICAgICAgICAgICAgMHg2MjAwMDAwMCAgICAgIC8vIFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24KKyNkZWZpbmUgTFNfTUFTSwkJCTB4RkYwMDAwMDAJCisKKy8vCisvLyAJVFlQRSBCaXQgTWFza3MKKy8vCisjZGVmaW5lIEJBU0lDX0xJTktfU0VSVklDRQkweDAwMDAwMDAwCisjZGVmaW5lIEVYVF9MSU5LX1NFUlZJQ0UJMHgwMTAwMDAwMAorCisjZGVmaW5lIExMQwkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTExDX1NOQVAJCTB4MDUwMDAwMDAKKyNkZWZpbmUgU0NTSV9GQ1AJCTB4MDgwMDAwMDAKKyNkZWZpbmUgU0NTSV9HUFAJCTB4MDkwMDAwMDAKKyNkZWZpbmUgSVBJM19NQVNURVIJCTB4MTEwMDAwMDAKKyNkZWZpbmUgSVBJM19TTEFWRQkJMHgxMjAwMDAwMAorI2RlZmluZSBJUEkzX1BFRVIJCTB4MTMwMDAwMDAKKyNkZWZpbmUgQ1BfSVBJM19NQVNURVIJCTB4MTUwMDAwMDAKKyNkZWZpbmUgQ1BfSVBJM19TTEFWRQkJMHgxNjAwMDAwMAorI2RlZmluZSBDUF9JUEkzX1BFRVIJCTB4MTcwMDAwMDAKKyNkZWZpbmUgU0JDQ1NfQ0hBTk5FTAkJMHgxOTAwMDAwMAorI2RlZmluZSBTQkNDU19DT05UUk9MCQkweDFBMDAwMDAwCisjZGVmaW5lIEZJQlJFX1NFUlZJQ0VTCQkweDIwMDAwMDAwCisjZGVmaW5lIEZDX0ZHCQkJMHgyMTAwMDAwMAorI2RlZmluZSBGQ19YUwkJCTB4MjIwMDAwMDAKKyNkZWZpbmUgRkNfQUwJCQkweDIzMDAwMDAwCisjZGVmaW5lIFNOTVAJCQkweDI0MDAwMDAwCisjZGVmaW5lIEhJUFBJX0ZQCQkweDQwMDAwMDAwCisjZGVmaW5lIFRZUEVfTUFTSwkJMHhGRjAwMDAwMAorCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgc2VxX2lkX3ZhbGlkOworCVVDSEFSIHNlcV9pZDsKKwlVU0hPUlQgcmVzZXJ2ZWQ7ICAvLyAyIGJ5dGVzIHJlc2VydmVkCisJVUxPTkcgb3hfcnhfaWQ7CisJVVNIT1JUIGxvd19zZXFfY250OworCVVTSE9SVCBoaWdoX3NlcV9jbnQ7Cit9IEJBX0FDQ19QQVlMT0FEOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgcmVzZXJ2ZWQ7CisJVUNIQVIgcmVhc29uX2NvZGU7CisJVUNIQVIgcmVhc29uX2V4cGxhaW47CisJVUNIQVIgdmVuZG9yX3VuaXF1ZTsKK30gQkFfUkpUX1BBWUxPQUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HIAljb21tYW5kX2NvZGU7CisJVUxPTkcgCXNpZDsKKwlVU0hPUlQJb3hfaWQ7CisJVVNIT1JUCXJ4X2lkOworfSBSUlFfTUVTU0FHRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HIGNvbW1hbmRfY29kZTsKKwlVQ0hBUiB2ZW5kb3I7CisJVUNIQVIgZXhwbGFpbjsKKwlVQ0hBUiByZWFzb247CisJVUNIQVIgcmVzZXJ2ZWQ7Cit9IFJFSkVDVF9NRVNTQUdFOworCisKKyNkZWZpbmUJTl9PUl9GX1BPUlQJCTB4MTAwMAorI2RlZmluZSBSQU5ET01fUkVMQVRJVkVfT0ZGU0VUCTB4NDAwMAorI2RlZmluZSBDT05USU5VT1NMWV9JTkNSRUFTSU5HCTB4ODAwMAorCisjZGVmaW5lIENMQVNTX1ZBTElECQkweDgwMDAKKyNkZWZpbmUgSU5URVJNSVhfTU9ERQkJMHg0MDAwCisjZGVmaW5lIFRSQU5TUEFSRU5UX1NUQUNLRUQJMHgyMDAwCisjZGVmaW5lIExPQ0tET1dOX1NUQUNLRUQJMHgxMDAwCisjZGVmaW5lIFNFUV9ERUxJVkVSWQkJMHg4MDAKKworI2RlZmluZSBYSURfTk9UX1NVUFBPUlRFRAkweDAwCisjZGVmaW5lIFhJRF9TVVBQT1JURUQJCTB4NDAwMAorI2RlZmluZSBYSURfUkVRVUlSRUQJCTB4QzAwMAorCisjZGVmaW5lIEFTU09DSUFUT1JfTk9UX1NVUFBPUlRFRAkweDAwCisjZGVmaW5lIEFTU09DSUFUT1JfU1VQUE9SVEVECTB4MTAwMAorI2RlZmluZSBBU1NPQ0lBVE9SX1JFUVVJUkVECTB4MzAwMAorCisjZGVmaW5lCUlOSVRfQUNLMF9TVVBQT1JUCTB4ODAwCisjZGVmaW5lIElOSVRfQUNLTl9TVVBQT1JUCTB4NDAwCisKKyNkZWZpbmUJUkVDSVBfQUNLMF9TVVBQT1JUCTB4ODAwMAorI2RlZmluZSBSRUNJUF9BQ0tOX1NVUFBPUlQJMHg0MDAwCisKKyNkZWZpbmUgWF9JRF9JTlRFUkxPQ0sJCTB4MjAwMAorCisjZGVmaW5lIEVSUk9SX1BPTElDWQkJMHgxODAwCQkvLyBFcnJvciBQb2xpY3kgU3VwcG9ydGVkCisjZGVmaW5lIEVSUk9SX0RJU0NBUkQJCTB4MDAJCS8vIE9ubHkgRGlzY2FyZCBTdXBwb3J0ZWQKKyNkZWZpbmUgRVJST1JfRElTQ19QUk9DRVNTCTB4MDIJCS8vIERpc2NhcmQgYW5kIHByb2Nlc3Mgc3VwcG9ydGVkCisKKyNkZWZpbmUgTk9ERV9JRAkJCTB4MDEKKyNkZWZpbmUgSUVFRV9FWFQJCTB4MjAKKworLy8KKy8vIENhdGVnb3JpZXMgU3VwcG9ydGVkIFBlciBTZXF1ZW5jZQorLy8KKyNkZWZpbmUJQ0FURUdPUklFU19QRVJfU0VRVUVOQ0UJMHgzMDAKKyNkZWZpbmUgT05FX0NBVEVHT1JZX1NFUVVFTkNFCTB4MDAJCS8vIDEgQ2F0ZWdvcnkgcGVyIFNlcXVlbmNlCisjZGVmaW5lIFRXT19DQVRFR09SWV9TRVFVRU5DRQkweDAxCQkvLyAyIENhdGVnb3JpZXMgcGVyIFNlcXVlbmNlCisjZGVmaW5lIE1BTllfQ0FURUdPUllfU0VRVUVOQ0UJMHgwMwkJLy8gPiAyIENhdGVnb3JpZXMvU2VxdWVuY2UKKwordHlwZWRlZiBzdHJ1Y3QgeworCisJVVNIT1JUIGluaXRpYXRvcl9jb250cm9sOworCVVTSE9SVCBzZXJ2aWNlX29wdGlvbnM7CisKKwlVU0hPUlQgcnhfZGF0YV9zaXplOworCVVTSE9SVCByZWNpcGllbnRfY29udHJvbDsKKworCVVTSE9SVCBlZV9jcmVkaXQ7CisJVVNIT1JUIGNvbmN1cnJlbnRfc2VxdWVuY2VzOworCisJVVNIT1JUIHJlc2VydmVkOworCVVTSE9SVCBvcGVuX3NlcXVlbmNlczsKKworfSBDTEFTU19QQVJBTUVURVJTOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUxPTkcJbG9naW5fY21kOworCS8vCisJLy8gQ29tbW9uIFNlcnZpY2UgUGFyYW1ldGVycworCS8vCisJc3RydWN0IHsKKworCQlVU0hPUlQgYmJfY3JlZGl0OworCQlVQ0hBUiBsb3dlc3RfdmVyOworCQlVQ0hBUiBoaWdoZXN0X3ZlcjsKKworCQlVU0hPUlQgYmJfcnhfc2l6ZTsKKwkJVVNIT1JUIGNvbW1vbl9mZWF0dXJlczsKKworCQlVU0hPUlQgcmVsX29mZnNldDsKKwkJVVNIT1JUIGNvbmN1cnJlbnRfc2VxOworCisKKwkJVUxPTkcgZV9kX3RvdjsKKwl9IGNtbl9zZXJ2aWNlczsKKworCS8vCisJLy8gUG9ydCBOYW1lCisJLy8KKwlVQ0hBUiBwb3J0X25hbWVbOF07CisKKwkvLworCS8vIE5vZGUvRmFicmljIE5hbWUKKwkvLworCVVDSEFSIG5vZGVfbmFtZVs4XTsKKworCS8vCisJLy8gQ2xhc3MgMSwgMiBhbmQgMyBTZXJ2aWNlIFBhcmFtZXRlcnMKKwkvLworCUNMQVNTX1BBUkFNRVRFUlMJY2xhc3MxOworCUNMQVNTX1BBUkFNRVRFUlMJY2xhc3MyOworCUNMQVNTX1BBUkFNRVRFUlMJY2xhc3MzOworCisJVUxPTkcgcmVzZXJ2ZWRbNF07CisKKwkvLworCS8vIFZlbmRvciBWZXJzaW9uIExldmVsCisJLy8KKwlVQ0hBUgkJdmVuZG9yX2lkWzJdOworCVVDSEFSCQl2ZW5kb3JfdmVyc2lvbls2XTsKKwlVTE9ORwkJYnVmZmVyX3NpemU7CisJVVNIT1JUCQlyeGlkX3N0YXJ0OworCVVTSE9SVAkJdG90YWxfcnhpZHM7Cit9IExPR0lOX1BBWUxPQUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgVUxPTkcgY21kOyAgLy8gNCBieXRlcworICBVQ0hBUiBuX3BvcnRfaWRlbnRpZmllclszXTsKKyAgVUNIQVIgcmVzZXJ2ZWQ7CisgIFVDSEFSIHBvcnRfbmFtZVs4XTsKK30gTE9HT1VUX1BBWUxPQUQ7CisKKworLy8KKy8vCVBSTEkgUmVxdWVzdCBTZXJ2aWNlIFBhcmFtZXRlciBEZWZpbmVzCisvLworI2RlZmluZSBQUkxJX0FDQwkJCTB4MDEKKyNkZWZpbmUgUFJMSV9SRVEJCQkweDAyCisjZGVmaW5lIE9SSUdfUFJPQ0VTU19BU1NPQ19WQUxJRAkweDgwMDAKKyNkZWZpbmUgUkVTUF9QUk9DRVNTX0FTU09DX1ZBTElECTB4NDAwMAorI2RlZmluZSBFU1RBQkxJU0hfUEFJUgkJCTB4MjAwMAorI2RlZmluZSBEQVRBX09WRVJMQVlfQUxMT1dFRAkJMHg0MAorI2RlZmluZQlJTklUSUFUT1JfRlVOQ1RJT04JCTB4MjAKKyNkZWZpbmUJVEFSR0VUX0ZVTkNUSU9OCQkJMHgxMAorI2RlZmluZSBDTURfREFUQV9NSVhFRAkJCTB4MDgKKyNkZWZpbmUgREFUQV9SRVNQX01JWEVECQkJMHgwNAorI2RlZmluZSBSRUFEX1hGRVJfUkRZCQkJMHgwMgorI2RlZmluZSBXUklURV9YRkVSX1JEWQkJCTB4MDEKKworI2RlZmluZSBSRVNQT05TRV9DT0RFX01BU0sJMHhGMDAKKyNkZWZpbmUgUkVRVUVTVF9FWEVDVVRFRAkweDEwMAorI2RlZmluZSBOT19SRVNPVVJDRVMJCTB4MjAwCisjZGVmaW5lIElOSVRfTk9UX0NPTVBMRVRFCTB4MzAwCisjZGVmaW5lIElNQUdFX0RPRVNfTk9UX0VYSVNUCTB4NDAwCisjZGVmaW5lIEJBRF9QUkVERUZJTkVEX0NPTkQJMHg1MDAKKyNkZWZpbmUgUkVRX0VYRUNfQ09ORAkJMHg2MDAKKyNkZWZpbmUgTk9fTVVMVElfUEFHRQkJMHg3MDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVTSE9SVAlwYXlsb2FkX2xlbmd0aDsKKwlVQ0hBUglwYWdlX2xlbmd0aDsKKwlVQ0hBUgljbWQ7CisKKworCVVMT05HCXZhbGlkOworCisJVUxPTkcJb3JpZ19wcm9jZXNzX2Fzc29jaWF0b3I7CisKKwlVTE9ORwlyZXNwX3Byb2Nlc3NfYXNzb2NpYXRvcjsKKwkKKwlVTE9ORwlmY3BfaW5mbzsKK30gUFJMSV9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCB7CisKKwlVU0hPUlQJcGF5bG9hZF9sZW5ndGg7CisJVUNIQVIJcGFnZV9sZW5ndGg7CisJVUNIQVIJY21kOworCisJVUxPTkcJdmFsaWQ7CisJVUxPTkcJb3JpZ19wcm9jZXNzX2Fzc29jaWF0b3I7CisKKwlVTE9ORwlyZXNwX3Byb2Nlc3NfYXNzb2NpYXRvcjsKKwlVTE9ORwlyZXNlcnZlZDsKK30gUFJMT19SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUxPTkcJY21kOworCisJVUxPTkcJaGFyZF9hZGRyZXNzOworCQorCVVDSEFSCXBvcnRfbmFtZVs4XTsKKworCVVDSEFSCW5vZGVfbmFtZVs4XTsKKworCVVMT05HCXNfaWQ7Cit9IEFESVNDX1BBWUxPQUQ7CisKK3N0cnVjdCBleHRfc2dfZW50cnlfdCB7CisJX191MzIgbGVuOjE4OwkJLyogYnVmZmVyIGxlbmd0aCwgYml0cyAwLTE3ICovCisJX191MzIgdWJhOjEzOwkJLyogdXBwZXIgYnVzIGFkZHJlc3MgYml0cyAxOC0zMSAqLworCV9fdTMyIGxiYTsJCS8qIGxvd2VyIGJ1cyBhZGRyZXNzIGJpdHMgMC0zMSAqLworfTsgCisKKworLy8gSi4gTWNDYXJ0eSdzIExJTksuSAorLy8KKy8vCUxTX1JKVCBSZWFzb24gQ29kZXMKKy8vCisKKyNkZWZpbmUgSU5WQUxJRF9DT01NQU5EX0NPREUJMHgwMQorI2RlZmluZSBMT0dJQ0FMX0VSUk9SCQkweDAzCisjZGVmaW5lIExPR0lDQUxfQlVTWQkJMHgwNQorI2RlZmluZSBQUk9UT0NPTF9FUlJPUgkJMHgwNworI2RlZmluZSBVTkFCTEVfVE9fUEVSRk9STQkweDA5CisjZGVmaW5lIENPTU1BTkRfTk9UX1NVUFBPUlRFRAkweDBCCisjZGVmaW5lIExTX1ZFTkRPUl9VTklRVUUJMHhGRgorCisvLworLy8gCUxTX1JKVCBSZWFzb24gQ29kZXMgRXhwbGFuYXRpb25zCisvLworI2RlZmluZSBOT19SRUFTT04JCTB4MDAKKyNkZWZpbmUgT1BUSU9OU19FUlJPUgkJMHgwMQorI2RlZmluZSBJTklUSUFUT1JfQ1RMX0VSUk9SCTB4MDMKKyNkZWZpbmUgUkVDSVBJRU5UX0NUTF9FUlJPUgkweDA1CisjZGVmaW5lIERBVEFfRklFTERfU0laRV9FUlJPUgkweDA3CisjZGVmaW5lIENPTkNVUlJFTlRfU0VRX0VSUk9SCTB4MDkKKyNkZWZpbmUgQ1JFRElUX0VSUk9SCQkweDBCCisjZGVmaW5lIElOVkFMSURfUE9SVF9OQU1FCTB4MEQKKyNkZWZpbmUgSU5WQUxJRF9OT0RFX05BTUUJMHgwRQorI2RlZmluZSBJTlZBTElEX0NTUAkJMHgwRgkvLyBJbnZhbGlkIFNlcnZpY2UgUGFyYW1ldGVycworI2RlZmluZSBJTlZBTElEX0FTU09DX0hEUgkweDExCS8vIEludmFsaWQgQXNzb2NpYXRpb24gSGVhZGVyCisjZGVmaW5lIEFTU09DX0hEUl9SRVFVSVJFRAkweDEzCS8vIEFzc29jaWF0aW9uIEhlYWRlciBSZXF1aXJlZAorI2RlZmluZSBMU19JTlZBTElEX1NfSUQJCTB4MTUKKyNkZWZpbmUgSU5WQUxJRF9PWF9SWF9JRAkweDE3CS8vIEludmFsaWQgT1hfSUQgUlhfSUQgQ29tYmluYXRpb24KKyNkZWZpbmUgQ01EX0lOX1BST0NFU1MJCTB4MTkKKyNkZWZpbmUgSU5WQUxJRF9JREVOVElGSUVSCTB4MUYJLy8gSW52YWxpZCBOX1BPUlQgSWRlbnRpZmllcgorI2RlZmluZSBJTlZBTElEX1NFUV9JRAkJMHgyMQorI2RlZmluZSBBQlRfSU5WQUxJRF9YQ0hORwkweDIzIAkvLyBBdHRlbXB0IHRvIEFib3J0IGFuIGludmFsaWQgRXhjaGFuZ2UKKyNkZWZpbmUgQUJUX0lOQUNUSVZFX1hDSE5HCTB4MjUgCS8vIEF0dGVtcHQgdG8gQWJvcnQgYW4gaW5hY3RpdmUgRXhjaGFuZ2UKKyNkZWZpbmUgTkVFRF9SRUNfUVVBTAkJMHgyNwkvLyBSZWNvdmVyeSBRdWFsaWZpZXIgcmVxdWlyZWQKKyNkZWZpbmUgTk9fTE9HSU5fUkVTT1VSQ0VTCTB4MjkJLy8gTm8gcmVzb3VyY2VzIHRvIHN1cHBvcnQgbG9naW4KKyNkZWZpbmUgTk9fREFUQQkJCTB4MkEJLy8gVW5hYmxlIHRvIHN1cHBseSByZXF1ZXN0ZWQgZGF0YQorI2RlZmluZQlSRVFVRVNUX05PVF9TVVBQT1JURUQJMHgyQwkvLyBSZXF1ZXN0IE5vdCBTdXBwb3J0ZWQKKworLy8KKy8vCUxpbmsgQ29udHJvbCBDb2RlcworLy8KKworLy8KKy8vCVBfQlNZIEFjdGlvbiBDb2RlcworLy8KKyNkZWZpbmUgU0VRVUVOQ0VfVEVSTUlOQVRFRAkweDAxMDAwMDAwCisjZGVmaW5lIFNFUVVFTkNFX0FDVElWRQkJMHgwMjAwMDAwMAorCisvLworLy8JUF9CU1kgUmVhc29uIENvZGVzCisvLworI2RlZmluZSBQSFlTX05QT1JUX0JVU1kJCTB4MDEwMDAwCisjZGVmaW5lIE5QT1JUX1JFU09VUkNFX0JVU1kJMHgwMjAwMDAKKworLy8KKy8vIAlQX1JKVCwgRl9SSlQgQWN0aW9uIENvZGVzCisvLworCisjZGVmaW5lIFJFVFJZQUJMRV9FUlJPUgkJMHgwMTAwMDAwMAorI2RlZmluZSBOT05fUkVUUllBQkxFX0VSUk9SCTB4MDIwMDAwMDAKKworLy8KKy8vIAlQX1JKVCwgRl9SSlQgUmVhc29uIENvZGVzCisvLworI2RlZmluZSBJTlZBTElEX0RfSUQJCTB4MDEwMDAwCisjZGVmaW5lIElOVkFMSURfU19JRAkJMHgwMjAwMDAKKyNkZWZpbmUgTlBPUlRfTk9UX0FWQUlMX1RNUAkweDAzMDAwMAorI2RlZmluZSBOUE9SVF9OT1RfQVZBSUxfUEVSTQkweDA0MDAwMAorI2RlZmluZSBDTEFTU19OT1RfU1VQUE9SVEVECTB4MDUwMDAwCisjZGVmaW5lIFVTQUdFX0VSUk9SCQkweDA2MDAwMAorI2RlZmluZSBUWVBFX05PVF9TVVBQT1JURUQJMHgwNzAwMDAKKyNkZWZpbmUgSU5WQUxfTElOS19DT05UUk9MCTB4MDgwMDAwCisjZGVmaW5lIElOVkFMX1JfQ1RMCQkweDA5MDAwMAorI2RlZmluZSBJTlZBTF9GX0NUTAkJMHgwQTAwMDAKKyNkZWZpbmUgSU5WQUxfT1hfSUQJCTB4MEIwMDAwCisjZGVmaW5lIElOVkFMX1JYX0lECQkweDBDMDAwMAorI2RlZmluZSBJTlZBTF9TRVFfSUQJCTB4MEQwMDAwCisjZGVmaW5lIElOVkFMX0RGX0NUTAkJMHgwRTAwMDAKKyNkZWZpbmUgSU5WQUxfU0VRX0NOVAkJMHgwRjAwMDAKKyNkZWZpbmUgSU5WQUxfUEFSQU1TCQkweDEwMDAwMAorI2RlZmluZSBFWENIQU5HRV9FUlJPUgkJMHgxMTAwMDAKKyNkZWZpbmUgTFNfUFJPVE9DT0xfRVJST1IJMHgxMjAwMDAKKyNkZWZpbmUgSU5DT1JSRUNUX0xFTkdUSAkweDEzMDAwMAorI2RlZmluZSBVTkVYUEVDVEVEX0FDSwkJMHgxNDAwMDAKKyNkZWZpbmUgTE9HSU5fUkVRCQkweDE2MDAwMAorI2RlZmluZSBFWENFU1NJVkVfU0VRCQkweDE3MDAwMAorI2RlZmluZSBOT19FWENIQU5HRQkJMHgxODAwMDAKKyNkZWZpbmUgU0VDX0hEUl9OT1RfU1VQUE9SVEVECTB4MTkwMDAwCisjZGVmaW5lIE5PX0ZBQlJJQwkJMHgxQTAwMDAKKyNkZWZpbmUgUF9WRU5ET1JfVU5JUVVFCQkweEZGMDAwMAorCisvLworLy8gCUJBX1JKVCBSZWFzb24gQ29kZXMKKy8vCisjZGVmaW5lIEJBX0lOVkFMSURfQ09NTUFORAkweDAwMDEwMDAwCisjZGVmaW5lIEJBX0xPR0lDQUxfRVJST1IJMHgwMDAzMDAwMAorI2RlZmluZSBCQV9MT0dJQ0FMX0JVU1kJCTB4MDAwNTAwMDAKKyNkZWZpbmUgQkFfUFJPVE9DT0xfRVJST1IJMHgwMDA3MDAwMAorI2RlZmluZSBCQV9VTkFCTEVfVE9fUEVSRk9STQkweDAwMDkwMDAwCisKKy8vCisvLyAJQkFfUkpUIFJlYXNvbiBFeHBsYW5hdGlvbiBDb2RlcworLy8KKyNkZWZpbmUgQkFfTk9fUkVBU09OCQkweDAwMDAwMDAwCisjZGVmaW5lIEJBX0lOVkFMSURfT1hfUlgJMHgwMDAwMDMwMAorI2RlZmluZSBCQV9TRVFVRU5DRV9BQk9SVEVECTB4MDAwMDA1MDAKKworCisKKyNlbmRpZiAvKiBDUFFGQ1RTU1RSVUNUU19ICSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jcHFmY1RTdHJpZ2dlci5jIGIvZHJpdmVycy9zY3NpL2NwcWZjVFN0cmlnZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiN2U2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTdHJpZ2dlci5jCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFJvdXRpbmUgdG8gdHJpZ2dlciBGaW5pc2FyIEdUQSBhbmFseXplci4gUnVucyBvZiBHUElPMgorLy8gTk9URTogREVCVUcgT05MWSEgQ291bGQgaW50ZXJmZXJlIHdpdGggRkNNTkdSL01pbmlwb3J0IG9wZXJhdGlvbgorLy8gc2luY2UgaXQgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBUYWNoeW9uIGJvYXJkLiAgVGhpcyBmdW5jdGlvbgorLy8gZGV2ZWxvcGVkIGZvciBDb21wYXEgSEJBIFRhY2h5b24gVFMgdjEuMiAoUmV2IFg1IFBDQikKKworI2luY2x1ZGUgImNwcWZjVFN0cmlnZ2VyLmgiCisjaWYgVFJJR0dFUkFCTEVfSEJBCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCit2b2lkIFRyaWdnZXJIQkEoIHZvaWQqIElPQmFzZVVwcGVyLCBpbnQgUHJpbnQpCit7CisgIF9fdTMyIGxvbmcgdmFsdWU7CisKKyAgLy8gZ2V0IGluaXRpYWwgdmFsdWUgaW4gaG9wZXMgb2Ygbm90IG1vZGlmeWluZyBhbnkgb3RoZXIgR1BJTyBsaW5lCisgIElPQmFzZVVwcGVyICs9IDB4MTg4OyAgLy8gVGFjaFRML1RTIENvbnRyb2wgcmVnCisgIAorICB2YWx1ZSA9IHJlYWRsKCBJT0Jhc2VVcHBlcik7CisgIC8vIHNldCBISUdIIHRvIHRyaWdnZXIgZXh0ZXJuYWwgYW5hbHl6ZXIgKHRlc3RlZCBvbiBEb2xjaGUgRmluaXNhciAxR2IgR1RBKQorICAvLyBUaGUgRmluaXNhciBhbmF5bHplciB0cmlnZ2VycyBvbiBsb3ctdG8taGlnaCBUVEwgdHJhbnNpdGlvbgorICB2YWx1ZSB8PSAweDAxOyAvLyBzZXQgYml0IDAKKworICB3cml0ZWwoIHZhbHVlLCBJT0Jhc2VVcHBlcik7CisKKyAgaWYoIFByaW50KQorICAgIHByaW50ayggIiAtR1BJTzAgc2V0LSAiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3BxZmNUU3RyaWdnZXIuaCBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTdHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjE3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3BxZmNUU3RyaWdnZXIuaApAQCAtMCwwICsxLDggQEAKKy8vIGRvbid0IGRvIHRoaXMgdW5sZXNzIHlvdSBoYXZlIHRoZSByaWdodCBoYXJkd2FyZSEKKyNkZWZpbmUgVFJJR0dFUkFCTEVfSEJBIDAKKyNpZiBUUklHR0VSQUJMRV9IQkEKK3ZvaWQgVHJpZ2dlckhCQSggdm9pZCosIGludCk7CisjZWxzZQorI2RlZmluZSBUcmlnZ2VySEJBKHgsIHkpCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NwcWZjVFN3b3JrZXIuYyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTd29ya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmZDc0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jcHFmY1RTd29ya2VyLmMKQEAgLTAsMCArMSw2NTE2IEBACisvKiBDb3B5cmlnaHQoYykgMjAwMCwgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uIAorICogRmlicmUgQ2hhbm5lbCBIb3N0IEJ1cyBBZGFwdGVyIAorICogNjQtYml0LCA2Nk1IeiBQQ0kgCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgdGVzdGVkIG9uOgorICogKGZyb250KTogW2NoaXBdIFRhY2h5b24gVFMgSFBGQy01MTY2QS8xLjIgIEwyQzEwOTAgLi4uCisgKiAgICAgICAgICBTUCMgUDIyNUNYQ0JGSUVMNlQsIFJldiBYQworICogICAgICAgICAgU1AjIDE2MTI5MC0wMDEsIFJldiBYRAorICogKGJhY2spOiBCb2FyZCBOby4gMDEwMDA4LTAwMSBBL1cgUmV2IFg1LCBGQUIgUkVWIFg1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogV3JpdHRlbiBieSBEb24gWmltbWVybWFuCisqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjZGVmaW5lIFNIVVRET1dOX1NJR1MJKHNpZ21hc2soU0lHS0lMTCl8c2lnbWFzayhTSUdJTlQpfHNpZ21hc2soU0lHVEVSTSkpCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPiAgIC8vIHN0cnVjdCBTY3NpX0hvc3QgZGVmaW5pdGlvbiBmb3IgVCBoYW5kbGVyCisjaW5jbHVkZSAiY3BxZmNUU2NoaXAuaCIKKyNpbmNsdWRlICJjcHFmY1RTc3RydWN0cy5oIgorI2luY2x1ZGUgImNwcWZjVFN0cmlnZ2VyLmgiCisKKy8vI2RlZmluZSBMT0dJTl9EQkcgMQorCisvLyBSRU1BUktTOgorLy8gU2luY2UgVGFjaHlvbiBjaGlwcyBtYXkgYmUgcGVybWl0dGVkIHRvIHdhaXQgZnJvbSA1MDBtcyB1cCB0byAyIHNlYworLy8gdG8gZW1wdHkgYW4gb3V0Z29pbmcgZnJhbWUgZnJvbSBpdHMgRklGTyB0byB0aGUgRmlicmUgQ2hhbm5lbCBzdHJlYW0sCisvLyB3ZSBjYW5ub3QgZG8gZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gIFNwZWNpZmljYWxseSwKKy8vIGV2ZXJ5IHRpbWUgYSBsaW5rIHJlLWluaXQgKGUuZy4gTElQKSB0YWtlcyBwbGFjZSwgYWxsIFNDU0kgSS9PIGhhcyB0byBiZQorLy8gc3VzcGVuZGVkIHVudGlsIHRoZSBsb2dpbiBzZXF1ZW5jZXMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4gIExvZ2luIGNvbW1hbmRzCisvLyBhcmUgZnJhbWVzIGp1c3QgbGlrZSBTQ1NJIGNvbW1hbmRzIGFyZSBmcmFtZXM7IHRoZXkgYXJlIHN1YmplY3QgdG8gdGhlIHNhbWUKKy8vIHRpbWVvdXQgaXNzdWVzIGFuZCBkZWxheXMuICBBbHNvLCB2YXJpb3VzIHNwZWNzIHByb3ZpZGUgdXAgdG8gMiBzZWNvbmRzIGZvcgorLy8gZGV2aWNlcyB0byBsb2cgYmFjayBpbiAoaS5lLiByZXNwb25kIHdpdGggQUNDIHRvIGEgbG9naW4gZnJhbWUpLCBzbyBJL08gdG8KKy8vIHRoYXQgZGV2aWNlIGhhcyB0byBiZSBzdXNwZW5kZWQuCisvLyBBIHNlcmlvdXMgcHJvYmxlbSBoZXJlIG9jY3VycyBvbiBoaWdobHkgbG9hZGVkIEZDLUFMIHN5c3RlbXMuICBJZiBvdXIgRkMgcG9ydAorLy8gaGFzIGEgbG93IHByaW9yaXR5IChlLmcuIGhpZ2ggYXJiaXRyYXRlZCBsb29wIHBoeXNpY2FsIGFkZHJlc3MsIGFscGEpLCBhbmQKKy8vIHNvbWUgb3RoZXIgZGV2aWNlIGlzIGhvZ2dpbmcgYmFuZHdpZHRoIChwZXJtaXNzaWJsZSB1bmRlciBGQy1BTCksIHdlIG1pZ2h0CisvLyB0aW1lIG91dCB0aGlua2luZyB0aGUgbGluayBpcyBodW5nLCB3aGVuIGl0J3Mgc2ltcGx5IGJ1c3kuICBNYW55IHN1Y2gKKy8vIGNvbnNpZGVyYXRpb25zIGNvbXBsaWNhdGUgdGhlIGRlc2lnbi4gIEFsdGhvdWdoIFRhY2h5b24gYXNzdW1lcyBjb250cm9sCisvLyAoaW4gc2lsaWNvbikgZm9yIG1hbnkgbGluay1zcGVjaWZpYyBpc3N1ZXMsIHRoZSBMaW51eCBkcml2ZXIgaXMgbGVmdCB3aXRoIHRoZQorLy8gcmVzdCwgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGEgZGlmZmljdWx0LCB0aW1lIGNyaXRpY2FsIGNob3JlLgorCisvLyBUaGVzZSAid29ya2VyIiBmdW5jdGlvbnMgd2lsbCBoYW5kbGUgdGhpbmdzIGxpa2UgRkMgTG9naW5zOyBhbGwKKy8vIHByb2Nlc3NlcyB3aXRoIEkvTyB0byBvdXIgZGV2aWNlIG11c3Qgd2FpdCBmb3IgdGhlIExvZ2luIHRvIGNvbXBsZXRlCisvLyBhbmQgKGlmIHN1Y2Nlc3NmdWwpIEkvTyB0byByZXN1bWUuICBJbiB0aGUgZXZlbnQgb2YgYSBtYWxmdW5jdGlvbmluZyBvciAgCisvLyB2ZXJ5IGJ1c3kgbG9vcCwgaXQgbWF5IHRha2UgaHVuZHJlZHMgb2YgbWlsbGlzZWNzIG9yIGV2ZW4gc2Vjb25kcyB0byBjb21wbGV0ZQorLy8gYSBmcmFtZSBzZW5kLiAgV2UgZG9uJ3Qgd2FudCB0byBoYW5nIHVwIHRoZSBlbnRpcmUgc2VydmVyIChhbmQgYWxsCisvLyBwcm9jZXNzZXMgd2hpY2ggZG9uJ3QgZGVwZW5kIG9uIEZpYnJlKSBkdXJpbmcgdGhpcyB3YWl0LgorCisvLyBUaGUgVGFjaHlvbiBjaGlwIGNhbiBoYXZlIGFyb3VuZCAzMCwwMDAgSS9PIG9wZXJhdGlvbnMgKCJleGNoYW5nZXMiKQorLy8gb3BlbiBhdCBvbmUgdGltZS4gIEhvd2V2ZXIsIGVhY2ggZXhjaGFuZ2UgbXVzdCBiZSBpbml0aWF0ZWQgCisvLyBzeW5jaHJvbm91c2x5IChpLmUuIGVhY2ggb2YgdGhlIDMwayBJL08gaGFkIHRvIGJlIHN0YXJ0ZWQgb25lIGF0IGEKKy8vIHRpbWUgYnkgc2VuZGluZyBhIHN0YXJ0aW5nIGZyYW1lIHZpYSBUYWNoeW9uJ3Mgb3V0Ym91bmQgcXVlKS4gIAorCisvLyBUbyBhY2NvbW1vZGF0ZSBrZXJuZWwgIm1vZHVsZSIgYnVpbGQsIHRoaXMgZHJpdmVyIGxpbWl0cyB0aGUgZXhjaGFuZ2VzCisvLyB0byAyNTYsIGJlY2F1c2Ugb2YgdGhlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5IGxpbWl0YXRpb24gb2YgMTI4TS4KKworLy8gVHlwaWNhbCBGQyBFeGNoYW5nZXMgYXJlIG9wZW5lZCBwcmVzdW1pbmcgdGhlIEZDIGZyYW1lcyBzdGFydCB3aXRob3V0IGVycm9ycywKKy8vIHdoaWxlIEV4Y2hhbmdlIGNvbXBsZXRpb24gaXMgaGFuZGxlZCBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBUaGlzCisvLyBvcHRpbWl6ZXMgcGVyZm9ybWFuY2UgZm9yIHRoZSAiZXZlcnl0aGluZydzIHdvcmtpbmciIGNhc2UuCisvLyBIb3dldmVyLCB3aGVuIHdlIGhhdmUgRkMgcmVsYXRlZCBlcnJvcnMgb3IgaG90IHBsdWdnaW5nIG9mIEZDIHBvcnRzLCB3ZSBwYXVzZQorLy8gSS9PIGFuZCBoYW5kbGUgRkMtc3BlY2lmaWMgdGFza3MgaW4gdGhlIHdvcmtlciB0aHJlYWQuICBUaGVzZSBGQy1zcGVjaWZpYworLy8gZnVuY3Rpb25zIHdpbGwgaGFuZGxlIHRoaW5ncyBsaWtlIEZDIExvZ2lucyBhbmQgQWJvcnRzLiAgQXMgdGhlIExvZ2luIHNlcXVlbmNlCisvLyBjb21wbGV0ZXMgdG8gZWFjaCBhbmQgZXZlcnkgdGFyZ2V0LCBJL08gY2FuIHJlc3VtZSB0byB0aGF0IHRhcmdldC4gIAorCisvLyBPdXIga2VybmVsICJ3b3JrZXIgdGhyZWFkIiBtdXN0IHNoYXJlIHRoZSBIQkEgd2l0aCB0aHJlYWRzIGNhbGxpbmcgCisvLyAicXVldWVjb21tYW5kIi4gIFdlIGRlZmluZSBhICJCb2FyZExvY2siIHNlbWFwaG9yZSB3aGljaCBpbmRpY2F0ZXMKKy8vIHRvICJxdWV1ZWNvbW1hbmQiIHRoYXQgdGhlIEhCQSBpcyB1bmF2YWlsYWJsZSwgYW5kIENtbmRzIGFyZSBhZGRlZCB0byBhCisvLyBib2FyZCBsb2NrIFEuICBXaGVuIHRoZSB3b3JrZXIgdGhyZWFkIGZpbmlzaGVzIHdpdGggdGhlIGJvYXJkLCB0aGUgYm9hcmQKKy8vIGxvY2sgUSBjb21tYW5kcyBhcmUgY29tcGxldGVkIHdpdGggc3RhdHVzIGNhdXNpbmcgaW1tZWRpYXRlIHJldHJ5LgorLy8gVHlwaWNhbGx5LCB0aGUgYm9hcmQgaXMgbG9ja2VkIHdoaWxlIExvZ2lucyBhcmUgaW4gcHJvZ3Jlc3MgYWZ0ZXIgYW4KKy8vIEZDIExpbmsgRG93biBjb25kaXRpb24uICBXaGVuIENtbmRzIGFyZSByZS1xdWV1ZWQgYWZ0ZXIgYm9hcmQgbG9jaywgdGhlCisvLyBwYXJ0aWN1bGFyIFNjc2kgY2hhbm5lbC90YXJnZXQgbWF5IG9yIG1heSBub3QgaGF2ZSBsb2dnZWQgYmFjayBpbi4gIFdoZW4KKy8vIHRoZSBkZXZpY2UgaXMgd2FpdGluZyBmb3IgbG9naW4sIHRoZSAicHJsaSIgZmxhZyBpcyBjbGVhciwgaW4gd2hpY2ggY2FzZQorLy8gY29tbWFuZHMgYXJlIHBhc3NlZCB0byBhIExpbmsgRG93biBRLiAgV2hlbmV2ZXIgdGhlIGxvZ2luIGZpbmFsbHkgY29tcGxldGVzLAorLy8gdGhlIExpbmtEb3duIFEgaXMgY29tcGxldGVkLCBhZ2FpbiB3aXRoIHN0YXR1cyBjYXVzaW5nIGltbWVkaWF0ZSByZXRyeS4KKy8vIFdoZW4gRkMgZGV2aWNlcyBhcmUgbG9nZ2VkIGluLCB3ZSBidWlsZCBhbmQgc3RhcnQgRkMgY29tbWFuZHMgdG8gdGhlCisvLyBkZXZpY2VzLgorCisvLyBOT1RFISEgQXMgb2YgTWF5IDIwMDAsIGtlcm5lbCAyLjIuMTQsIHRoZSBlcnJvciByZWNvdmVyeSBsb2dpYyBmb3IgZGV2aWNlcyAKKy8vIHRoYXQgbmV2ZXIgbG9nIGJhY2sgaW4gKGUuZy4gcGh5c2ljYWxseSByZW1vdmVkKSBpcyBOT1QgY29tcGxldGVseQorLy8gdW5kZXJzdG9vZC4gIEkndmUgc3RpbGwgc2VlbiBpbnN0YW5jZXMgb2Ygc3lzdGVtIGhhbmdzIG9uIGZhaWxlZCBXcml0ZSAKKy8vIGNvbW1hbmRzIChwb3NzaWJseSBmcm9tIHRoZSBleHQyIGxheWVyPykgb24gZGV2aWNlIHJlbW92YWwuICBTdWNoIHNwZWNpYWwKKy8vIGNhc2VzIG5lZWQgdG8gYmUgZXZhbHVhdGVkIGZyb20gYSBzeXN0ZW0vYXBwbGljYXRpb24gdmlldyAtIGUuZy4sIGhvdworLy8gZXhhY3RseSBkb2VzIHRoZSBzeXN0ZW0gd2FudCBtZSB0byBjb21wbGV0ZSBjb21tYW5kcyB3aGVuIHRoZSBkZXZpY2UgaXMKKy8vIHBoeXNpY2FsbHkgcmVtb3ZlZD8/CisKKy8vIGxvY2FsIGZ1bmN0aW9ucworCitzdGF0aWMgdm9pZCBTZXRMb2dpbkZpZWxkcygKKyAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCwKKyAgVGFjaEZDSERSX0dDTU5EKiBmY2hzLAorICBCT09MRUFOIFBEaXNjLAorICBCT09MRUFOIE9yaWdpbmF0b3IpOworCitzdGF0aWMgdm9pZCBBbmFseXplSW5jb21pbmdGcmFtZSggCisgICAgICAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwKKyAgICAgICBVTE9ORyBRTmR4ICk7CisKK3N0YXRpYyB2b2lkIFNlbmRMb2dpbnMoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsIF9fdTMyICpGYWJyaWNQb3J0SWRzICk7CisKK3N0YXRpYyBpbnQgdmVyaWZ5X1BMT0dJKCBQVEFDSFlPTiBmY0NoaXAsCisgICAgICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsIFVMT05HKiByZWplY3RfZXhwbGFpbik7CitzdGF0aWMgaW50IHZlcmlmeV9QUkxJKCBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsIFVMT05HKiByZWplY3RfZXhwbGFpbik7CisKK3N0YXRpYyB2b2lkIExvYWRXV04oIFBUQUNIWU9OIGZjQ2hpcCwgVUNIQVIqIGRlc3QsIFVDSEFSIHR5cGUpOworc3RhdGljIHZvaWQgQnVpbGRMaW5rU2VydmljZVBheWxvYWQoIAorICAgICAgICAgICAgICBQVEFDSFlPTiBmY0NoaXAsIFVMT05HIHR5cGUsIHZvaWQqIHBheWxvYWQpOworCitzdGF0aWMgdm9pZCBVbmJsb2NrU2NzaURldmljZSggc3RydWN0IFNjc2lfSG9zdCAqSG9zdEFkYXB0ZXIsIAorICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0KTsKKworc3RhdGljIHZvaWQgY3BxZmNUU0NoZWNrYW5kU25vb3BGQ1AoIFBUQUNIWU9OIGZjQ2hpcCwgVUxPTkcgeF9JRCk7CisKK3N0YXRpYyB2b2lkIENvbXBsZXRlQm9hcmRMb2NrQ21uZCggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSk7CisKK3N0YXRpYyB2b2lkIFJldmFsaWRhdGVTRVNUKCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciwgCisJCSAgICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCk7CisKK3N0YXRpYyB2b2lkIElzc3VlUmVwb3J0THVuc0NvbW1hbmQoIAorICAgICAgICAgICAgICBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhLCAKKwkgICAgICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMpOworCisvLyAoc2VlIHNjc2lfZXJyb3IuYyBjb21tZW50cyBvbiBrZXJuZWwgdGFzayBjcmVhdGlvbikKKwordm9pZCBjcHFmY1RTV29ya2VyVGhyZWFkKCB2b2lkICpob3N0KQoreworICBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlciA9IChzdHJ1Y3QgU2NzaV9Ib3N0Kilob3N0OworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOyAKKyNpZmRlZiBQQ0lfS0VSTkVMX1RSQUNFCisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyNlbmRpZgorICBERUNMQVJFX01VVEVYX0xPQ0tFRChmY1F1ZVJlYWR5KTsKKyAgREVDTEFSRV9NVVRFWF9MT0NLRUQoZmNUWU9CY29tcGxldGUpOyAKKyAgREVDTEFSRV9NVVRFWF9MT0NLRUQoVGFjaEZyb3plbik7ICAKKyAgREVDTEFSRV9NVVRFWF9MT0NLRUQoQm9hcmRMb2NrKTsgIAorCisgIEVOVEVSKCJXb3JrZXJUaHJlYWQiKTsKKworICBsb2NrX2tlcm5lbCgpOworICBkYWVtb25pemUoImNwcWZjVFNfd3RfJWQiLCBIb3N0QWRhcHRlci0+aG9zdF9ubyk7CisgIHNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIFNIVVRET1dOX1NJR1MpOworCisKKyAgY3BxZmNIQkFkYXRhLT5mY1F1ZVJlYWR5ID0gJmZjUXVlUmVhZHk7ICAvLyBwcmltYXJ5IHdhaXQgcG9pbnQKKyAgY3BxZmNIQkFkYXRhLT5UWU9CY29tcGxldGUgPSAmZmNUWU9CY29tcGxldGU7CisgIGNwcWZjSEJBZGF0YS0+VGFjaEZyb3plbiA9ICZUYWNoRnJvemVuOworICAgIAorIAorICBjcHFmY0hCQWRhdGEtPndvcmtlcl90aHJlYWQgPSBjdXJyZW50OworICAKKyAgdW5sb2NrX2tlcm5lbCgpOworCisgIGlmKCBjcHFmY0hCQWRhdGEtPm5vdGlmeV93dCAhPSBOVUxMICkKKyAgICB1cCggY3BxZmNIQkFkYXRhLT5ub3RpZnlfd3QpOyAvLyBPSyB0byBjb250aW51ZQorCisgIHdoaWxlKDEpCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgZG93bl9pbnRlcnJ1cHRpYmxlKCAmZmNRdWVSZWFkeSk7ICAvLyB3YWl0IGZvciBzb21ldGhpbmcgdG8gZG8KKworICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSApCisgICAgICBicmVhazsKKyAgICAKKyAgICBQQ0lfVFJBQ0UoIDB4OTApCisgICAgLy8gZmlyc3QsIHRha2UgdGhlIElPIGxvY2sgc28gdGhlIFNDU0kgdXBwZXIgbGF5ZXJzIGNhbid0IGNhbGwKKyAgICAvLyBpbnRvIG91ciBfcXVlY29tbWFuZCBmdW5jdGlvbiAodGhpcyBhbHNvIGRpc2FibGVzIElOVHMpCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoIEhvc3RBZGFwdGVyLT5ob3N0X2xvY2ssIGZsYWdzKTsgLy8gU1RPUCBfcXVlIGZ1bmN0aW9uCisgICAgUENJX1RSQUNFKCAweDkwKQorICAgICAgICAgCisgICAgQ1BRX1NQSU5MT0NLX0hCQSggY3BxZmNIQkFkYXRhKQorICAgIC8vIG5leHQsIHNldCB0aGlzIHBvaW50ZXIgdG8gaW5kaWNhdGUgdG8gdGhlIF9xdWVjb21tYW5kIGZ1bmN0aW9uCisgICAgLy8gdGhhdCB0aGUgYm9hcmQgaXMgaW4gdXNlLCBzbyBpdCBzaG91bGQgcXVlIHRoZSBjb21tYW5kIGFuZCAKKyAgICAvLyBpbW1lZGlhdGVseSByZXR1cm4gKHdlIGRvbid0IGFjdHVhbGx5IHJlcXVpcmUgdGhlIHNlbWFwaG9yZSBmdW5jdGlvbgorICAgIC8vIGluIHRoaXMgZHJpdmVyIHJldikKKworICAgIGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrID0gJkJvYXJkTG9jazsKKworICAgIFBDSV9UUkFDRSggMHg5MCkKKworICAgIC8vIHJlbGVhc2UgdGhlIElPIGxvY2sgKGFuZCByZS1lbmFibGUgaW50ZXJydXB0cykKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCBIb3N0QWRhcHRlci0+aG9zdF9sb2NrLCBmbGFncyk7CisKKyAgICAvLyBkaXNhYmxlIE9VUiBIQkEgaW50ZXJydXB0IChrZWVwIHRoZW0gb2ZmIGFzIG11Y2ggYXMgcG9zc2libGUKKyAgICAvLyBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkpCisgICAgZGlzYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7CisKKyAgICAvLyBPSywgbGV0J3MgcHJvY2VzcyB0aGUgRmlicmUgQ2hhbm5lbCBMaW5rIFEgYW5kIGRvIHRoZSB3b3JrCisgICAgY3BxZmNUU19Xb3JrVGFzayggSG9zdEFkYXB0ZXIpOworCisgICAgLy8gaG9wZWZ1bGx5LCBubyBtb3JlICJ3b3JrIiB0byBkbzsKKyAgICAvLyByZS1lbmFibGUgb3VyIElOVHMgZm9yICJub3JtYWwiIGNvbXBsZXRpb24gcHJvY2Vzc2luZworICAgIGVuYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7CisgCisKKyAgICBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jayA9IE5VTEw7IC8vIGFsbG93IGNvbW1hbmRzIHRvIGJlIHF1ZXVlZAorICAgIENQUV9TUElOVU5MT0NLX0hCQSggY3BxZmNIQkFkYXRhKQorCisKKyAgICAvLyBOb3csIGNvbXBsZXRlIGFueSBDbW5kIHdlIFEnZCB1cCB3aGlsZSBCb2FyZExvY2sgd2FzIGhlbGQKKworICAgIENvbXBsZXRlQm9hcmRMb2NrQ21uZCggY3BxZmNIQkFkYXRhKTsKKyAgCisKKyAgfQorICAvLyBob3BlZnVsbHksIHRoZSBzaWduYWwgd2FzIGZvciBvdXIgbW9kdWxlIGV4aXQuLi4KKyAgaWYoIGNwcWZjSEJBZGF0YS0+bm90aWZ5X3d0ICE9IE5VTEwgKQorICAgIHVwKCBjcHFmY0hCQWRhdGEtPm5vdGlmeV93dCk7IC8vIHllcCwgd2UncmUgb3V0dGEgaGVyZQorfQorCisKKy8vIEZyZWV6ZSBUYWNoeW9uIHJvdXRpbmUuCisvLyBJZiBUYWNoeW9uIGlzIGFscmVhZHkgZnJvemVuLCByZXR1cm4gRkFMU0UKKy8vIElmIFRhY2h5b24gaXMgbm90IGZyb3plbiwgY2FsbCBmcmVlemUgZnVuY3Rpb24sIHJldHVybiBUUlVFCisvLworc3RhdGljIEJPT0xFQU4gRnJlZXplVGFjaCggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBCT09MRUFOIEZyb3plVGFjaCA9IEZBTFNFOworICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGNoaXAgaXMgYWxyZWFkeSBmcm96ZW47IGlmIHNvLAorICAvLyAiRnJlZXppbmciIGFnYWluIHdpbGwgTk9UISBnZW5lcmF0ZSBhbm90aGVyIEZyZWV6ZQorICAvLyBDb21wbGV0aW9uIE1lc3NhZ2UuCisKKyAgaWYoIChmY0NoaXAtPlJlZ2lzdGVycy5UWXN0YXR1cy52YWx1ZSAmIDB4NzAwMDApICE9IDB4NzAwMDApCisgIHsgIC8vIChuZWVkIHRvIGZyZWV6ZS4uLikKKyAgICBmY0NoaXAtPkZyZWV6ZVRhY2h5b24oIGZjQ2hpcCwgMik7ICAvLyBib3RoIEVSUSBhbmQgRkNQIGFzc2lzdHMKKworICAgIC8vIDIuIEdldCBUYWNoIGZyZWV6ZSBjb25maXJtYXRpb24KKyAgICAvLyAoc3luY2hyb25pemUgU0VTVCBtYW5pcHVsYXRpb24gd2l0aCBGcmVlemUgQ29tcGxldGlvbiBNZXNzYWdlKQorICAgIC8vIHdlIG5lZWQgSU5UcyBvbiBzbyBzZW1hcGhvcmUgY2FuIGJlIHNldC4JCisgICAgZW5hYmxlX2lycSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+aXJxKTsgLy8gb25seSB3YXkgdG8gZ2V0IFNlbWFwaG9yZQorICAgIGRvd25faW50ZXJydXB0aWJsZSggY3BxZmNIQkFkYXRhLT5UYWNoRnJvemVuKTsgLy8gd2FpdCBmb3IgSU5UIGhhbmRsZXIgc2VtLgorICAgIC8vIGNhbiB3ZSBUSU1FT1VUIHNlbWFwaG9yZSB3YWl0Pz8gVEJECisgICAgZGlzYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7IAorCisgICAgRnJvemVUYWNoID0gVFJVRTsKKyAgfSAgLy8gKGVsc2UsIGFscmVhZHkgZnJvemVuKQorIAorICByZXR1cm4gRnJvemVUYWNoOworfSAgCisKKworCisKKy8vIFRoaXMgaXMgdGhlIGtlcm5lbCB3b3JrZXIgdGhyZWFkIHRhc2ssIHdoaWNoIHByb2Nlc3NlcyBGQworLy8gdGFza3Mgd2hpY2ggd2VyZSBxdWV1ZWQgYnkgdGhlIEludGVycnVwdCBoYW5kbGVyIG9yIGJ5CisvLyBvdGhlciBXb3JrVGFzayBmdW5jdGlvbnMuCisKKyNkZWZpbmUgREJHIDEKKy8vI3VuZGVmIERCRwordm9pZCBjcHFmY1RTX1dvcmtUYXNrKCBzdHJ1Y3QgU2NzaV9Ib3N0ICpIb3N0QWRhcHRlcikKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKUhvc3RBZGFwdGVyLT5ob3N0ZGF0YTsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyBRY29uc3VtZXJOZHg7CisgIExPTkcgRXhjaGFuZ2VJRDsKKyAgVUxPTkcgdWxTdGF0dXM9MDsKKyAgVGFjaEZDSERSX0dDTU5EIGZjaHM7CisgIFBGQ19MSU5LX1FVRSBmY0xRID0gY3BxZmNIQkFkYXRhLT5mY0xROworCisgIEVOVEVSKCJXb3JrVGFzayIpOworCisgIC8vIGNvcHkgY3VycmVudCBpbmRleCB0byB3b3JrIG9uCisgIFFjb25zdW1lck5keCA9IGZjTFEtPmNvbnN1bWVyOworCisgIFBDSV9UUkFDRU8oIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0uVHlwZSwgMHg5MCkKKyAgCisKKyAgLy8gTk9URTogd2hlbiB0aGlzIHN3aXRjaCBjb21wbGV0ZXMsIHdlIHdpbGwgImNvbnN1bWUiIHRoZSBRdWUgaXRlbQorLy8gIHByaW50aygiUXVlIHR5cGUgJVhoXG4iLCBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLlR5cGUpOworICBzd2l0Y2goIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0uVHlwZSApCisgIHsKKyAgICAgIC8vIGluY29taW5nIGZyYW1lIC0gbGluayBzZXJ2aWNlIChBQ0MsIFVOU09MIFJFUSwgZXRjLikKKyAgICAgIC8vIG9yIEZDUC1TQ1NJIGNvbW1hbmQKKyAgICBjYXNlIFNGUV9VTktOT1dOOiAgCisgICAgICBBbmFseXplSW5jb21pbmdGcmFtZSggY3BxZmNIQkFkYXRhLCBRY29uc3VtZXJOZHggKTsKKworICAgICAgYnJlYWs7CisgIAorICAgIAorICAgIAorICAgIGNhc2UgRVhDSEFOR0VfUVVFVUVEOiAgLy8gYW4gRXhjaGFuZ2UgKGkuZS4gRkNQLVNDU0kpIHdhcyBwcmV2aW91c2x5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWV1ZWQgYmVjYXVzZSB0aGUgbGluayB3YXMgZG93bi4gIFRoZSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFydGJlYXQgdGltZXIgZGV0ZWN0ZWQgaXQgYW5kIFF1ZXVlZCBpdCBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXR0ZW1wdCB0byBzdGFydCBpdCBhZ2FpbiwgYW5kIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHdlIGNsZWFyIHRoZSBFWENIQU5HRV9RIGZsYWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluayBkb2Vzbid0IGNvbWUgdXAsIHRoZSBFeGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBldmVudHVhbGx5IHRpbWUtb3V0LgorCisgICAgICBFeGNoYW5nZUlEID0gKExPTkcpICAvLyB4X0lEIGNvcGllZCBmcm9tIERQQyB0aW1lb3V0IGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS51bEJ1ZmZbMF07CisKKyAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBhIFEnZCBleGNoYW5nZSBjb3VsZCBoYXZlIGFscmVhZHkKKyAgICAgIC8vIGJlZW4gc3RhcnRlZCBieSBvdGhlciBsb2dpYyAoZS5nLiBBQlRTIHByb2Nlc3MpCisgICAgICAvLyBEb24ndCBzdGFydCBpZiBhbHJlYWR5IHN0YXJ0ZWQgKFEnZCBmbGFnIGNsZWFyKQorCisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW0V4Y2hhbmdlSURdLnN0YXR1cyAmIEVYQ0hBTkdFX1FVRVVFRCApCisgICAgICB7CisvLyAgICAgICAgcHJpbnRrKCIgKlN0YXJ0IFEnZCB4X0lEICVYaDogdHlwZSAlWGggIiwgCisvLyAgICAgICAgICBFeGNoYW5nZUlELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbRXhjaGFuZ2VJRF0udHlwZSk7CisgICAgICAKKyAgICAgICAgdWxTdGF0dXMgPSBjcHFmY1RTU3RhcnRFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCBFeGNoYW5nZUlEKTsKKyAgICAgICAgaWYoICF1bFN0YXR1cyApCisgICAgICAgIHsKKy8vICAgICAgICAgIHByaW50aygic3VjY2VzcyogIik7CisgICAgICAgIH0JCisgICAgICAgIGVsc2UKKyAgICAgICAgeworI2lmZGVmIERCRworICAgICAgCisgICAgICAgICAgaWYoIHVsU3RhdHVzID09IEVYQ0hBTkdFX1FVRVVFRCkKKyAgICAgICAgICAgIHByaW50aygiUXVldWVkKiAiKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGsoImZhaWxlZCogIik7CisJCQorI2VuZGlmCisJfSAKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIExJTktET1dOOiAgCisgICAgICAvLyAobG90cyBvZiB0aGluZ3MgYWxyZWFkeSBkb25lIGluIElOVCBoYW5kbGVyKSBmdXR1cmUgaGVyZT8KKyAgICAgIGJyZWFrOworICAgIAorICAgIAorICAgIGNhc2UgTElOS0FDVElWRTogICAvLyBUYWNoeW9uIHNldCB0aGUgTHVwIGJpdCBpbiBGTSBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogc29tZSBtaXNiZWhhdmluZyBGQyBwb3J0cyAobGlrZSBUYWNoMi4xKQorICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gcmUtTElQIGltbWVkaWF0ZWx5IGFmdGVyIGEgTElQIGNvbXBsZXRlcy4KKyAgICAgIAorICAgICAgLy8gaWYgImluaXRpYXRvciIsIG5lZWQgdG8gdmVyaWZ5IExPR3Mgd2l0aCBwb3J0cworLy8gICAgICBwcmludGsoIlxuKkxOS1VQKiAiKTsKKworICAgICAgaWYoIGZjQ2hpcC0+T3B0aW9ucy5pbml0aWF0b3IgKQorICAgICAgICBTZW5kTG9naW5zKCBjcHFmY0hCQWRhdGEsIE5VTEwgKTsgLy8gUExPR0kgb3IgUERJU0MsIGJhc2VkIG9uIGZjUG9ydCBkYXRhCisgICAgICAgICAgICAgICAgICAvLyBpZiBTZW5kTG9naW5zIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZXMsIFBvcnREaXNjRG9uZQorICAgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBzZXQuCisgICAgICAKKyAgICAgIAorICAgICAgLy8gSWYgU2VuZExvZ2lucyB3YXMgc3VjY2Vzc2Z1bCwgdGhlbiB3ZSBleHBlY3QgdG8gZ2V0IGluY29taW5nCisgICAgICAvLyBBQ0NlcHRzIG9yIFJFSkVDVHMsIHdoaWNoIGFyZSBoYW5kbGVkIGJlbG93LgorCisgICAgICBicmVhazsKKworICAgIC8vIExpbmtTZXJ2aWNlIGFuZCBGYWJyaWMgcmVxdWVzdC9yZXBseSBwcm9jZXNzaW5nCisgICAgY2FzZSBFTFNfRkRJU0M6ICAgICAgLy8gbmVlZCB0byBzZW5kIEZhYnJpYyBEaXNjb3ZlcnkgKExvZ2luKQorICAgIGNhc2UgRUxTX0ZMT0dJOiAgICAgIC8vIG5lZWQgdG8gc2VuZCBGYWJyaWMgTG9naW4KKyAgICBjYXNlIEVMU19TQ1I6ICAgICAgICAvLyBuZWVkIHRvIHNlbmQgU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbgorICAgIGNhc2UgRkNTX05TUjogICAgICAgIC8vIG5lZWQgdG8gc2VuZCBOYW1lIFNlcnZpY2UgUmVxdWVzdAorICAgIGNhc2UgRUxTX1BMT0dJOiAgICAgIC8vIG5lZWQgdG8gc2VuZCBQTE9HSQorICAgIGNhc2UgRUxTX0FDQzogICAgICAgIC8vIHNlbmQgZ2VuZXJpYyBBQ0NlcHQKKyAgICBjYXNlIEVMU19QTE9HSV9BQ0M6ICAvLyBuZWVkIHRvIHNlbmQgRUxTIEFDQ2VwdCBmcmFtZSB0byByZWN2J2QgUExPR0kKKyAgICBjYXNlIEVMU19QUkxJX0FDQzogICAvLyBuZWVkIHRvIHNlbmQgRUxTIEFDQ2VwdCBmcmFtZSB0byByZWN2J2QgUFJMSQorICAgIGNhc2UgRUxTX0xPR086ICAgICAgLy8gbmVlZCB0byBzZW5kIEVMUyBMT0dPIChsb2dvdXQpCisgICAgY2FzZSBFTFNfTE9HT19BQ0M6ICAvLyBuZWVkIHRvIHNlbmQgRUxTIEFDQ2VwdCBmcmFtZSB0byByZWN2J2QgUExPR0kKKyAgICBjYXNlIEVMU19SSlQ6ICAgICAgICAgLy8gUmVKZWNUIHJlcGx5CisgICAgY2FzZSBFTFNfUFJMSTogICAgICAgLy8gbmVlZCB0byBzZW5kIEVMUyBQUkxJCisgCisgICAgCisvLyAgICAgIHByaW50aygiICpFTFMgJVhoKiAiLCBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLlR5cGUpOworICAgICAgLy8gaWYgUG9ydERpc2NEb25lIGlzIG5vdCBzZXQsIGl0IG1lYW5zIHRoZSBTZW5kTG9naW5zIHJvdXRpbmUKKyAgICAgIC8vIGZhaWxlZCB0byBjb21wbGV0ZSAtLSBhc3N1bWUgdGhhdCBMRG4gb2NjdXJyZWQsIHNvIGxvZ2luIGZyYW1lcworICAgICAgLy8gYXJlIGludmFsaWQKKyAgICAgIGlmKCAhY3BxZmNIQkFkYXRhLT5Qb3J0RGlzY0RvbmUpIC8vIGNsZWFyZWQgYnkgTERuCisgICAgICB7CisgICAgICAgIHByaW50aygiRGlzY2FyZCBRJ2QgRUxTIGxvZ2luIGZyYW1lXG4iKTsKKyAgICAgICAgYnJlYWs7ICAKKyAgICAgIH0KKworICAgICAgdWxTdGF0dXMgPSBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgICAgICAgICBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS5UeXBlLCAvLyBlLmcuIFBMT0dJCisgICAgICAgICAgKFRhY2hGQ0hEUl9HQ01ORCopCisgICAgICAgICAgICBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLnVsQnVmZiwgLy8gaW5jb21pbmcgZmNocworICAgICAgICAgIE5VTEwsICAgICAgICAgLy8gbm8gZGF0YSAobm8gc2NhdHRlci9nYXRoZXIgbGlzdCkKKyAgICAgICAgICAmRXhjaGFuZ2VJRCApOy8vIGZjQ29udHJvbGxlci0+ZmNFeGNoYW5nZXMgaW5kZXgsIC0xIGlmIGZhaWxlZAorCisgICAgICBpZiggIXVsU3RhdHVzICkgLy8gRXhjaGFuZ2Ugc2V0dXA/CisgICAgICB7CisgICAgICAgIHVsU3RhdHVzID0gY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgRXhjaGFuZ2VJRCApOworICAgICAgICBpZiggIXVsU3RhdHVzICkKKyAgICAgICAgeworICAgICAgICAgIC8vIHN1Ym1pdHRlZCB0byBUYWNoJ3MgT3V0Ym91bmQgUXVlIChFUlEgUEkgaW5jcmVtZW50ZWQpCisgICAgICAgICAgLy8gd2FpdGVkIGZvciBjb21wbGV0aW9uIGZvciBFTFMgdHlwZSAoTG9naW4gZnJhbWVzIGlzc3VlZAorICAgICAgICAgIC8vIHN5bmNocm9ub3VzbHkpCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIC8vIGNoZWNrIHJlYXNvbiBmb3IgRXhjaGFuZ2Ugbm90IGJlaW5nIHN0YXJ0ZWQgLSB3ZSBtaWdodAorICAgICAgICAgIC8vIHdhbnQgdG8gUXVldWUgYW5kIHN0YXJ0IGxhdGVyLCBvciBmYWlsIHdpdGggZXJyb3IKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZSAgIC8vIFhjaGFuZ2Ugc2V0dXAgZmFpbGVkLi4uCisgICAgICAgIHByaW50aygiIGNwcWZjVFNCdWlsZEV4Y2hhbmdlIGZhaWxlZDogJVhoXG4iLCB1bFN0YXR1cyApOworCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0NTSV9SRVBPUlRfTFVOUzoKKyAgICAgIC8vIHBhc3MgdGhlIGluY29taW5nIGZyYW1lIChhY3R1YWxseSwgaXQncyBhIFBSTEkgZnJhbWUpCisgICAgICAvLyBzbyB3ZSBjYW4gc2VuZCBSRVBPUlRfTFVOUywgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIFZTQS9QRFUKKyAgICAgIC8vIEZDUC1TQ1NJIEx1biBhZGRyZXNzIG1vZGUKKyAgICAgIElzc3VlUmVwb3J0THVuc0NvbW1hbmQoIGNwcWZjSEJBZGF0YSwgKFRhY2hGQ0hEUl9HQ01ORCopCisgICAgICAgICAgICBmY0xRLT5RaXRlbVtRY29uc3VtZXJOZHhdLnVsQnVmZik7IAorCisgICAgICBicmVhazsKKyAgICAgIAorCisKKworICAgIGNhc2UgQkxTX0FCVFM6ICAgICAgIC8vIG5lZWQgdG8gQUJPUlQgb25lIG9yIG1vcmUgZXhjaGFuZ2VzCisgICAgeworICAgICAgTE9ORyB4X0lEID0gZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS51bEJ1ZmZbMF07CisgICAgICBCT09MRUFOIEZyb3plVGFjaCA9IEZBTFNFOyAgIAorICAgICAKKyAgICAgIGlmICggeF9JRCA+PSBUQUNIX1NFU1RfTEVOICkgIC8vIChpbilzYW5pdHkgY2hlY2sKKyAgICAgIHsKKy8vCXByaW50ayggIiBjcHFmY1RTIEVSUk9SISBCT0dVUyB4X0lEICVYaCIsIHhfSUQpOworCWJyZWFrOworICAgICAgfQorCisKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLkNtbmQgPT0gTlVMTCApIC8vIHNob3VsZCBiZSBSQVJFCisgICAgICB7CisvLwlwcmludGsoIiBBQlRTICVYaCBTY3NpIENtbmQgbnVsbCEgIiwgeF9JRCk7CisJCisgICAgICAgYnJlYWs7ICAvLyBub3RoaW5nIHRvIGFib3J0IQorICAgICAgfQorCisvLyNkZWZpbmUgQUJUU19EQkcKKyNpZmRlZiBBQlRTX0RCRworICAgICAgcHJpbnRrKCJJTlYgU0VTVFslWF0gIiwgeF9JRCk7IAorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBGQzJfVElNRU9VVCkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJGQzJUTyIpOworICAgICAgfQorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBJTklUSUFUT1JfQUJPUlQpCisgICAgICB7CisgICAgICAgIHByaW50aygiSUEiKTsKKyAgICAgIH0KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgUE9SVElEX0NIQU5HRUQpCisgICAgICB7CisgICAgICAgIHByaW50aygiUE9SVElEIik7CisgICAgICB9CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyAmIERFVklDRV9SRU1PVkVEKQorICAgICAgeworICAgICAgICBwcmludGsoIkRFVlJNIik7CisgICAgICB9CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLnN0YXR1cyAmIExJTktGQUlMX1RYKQorICAgICAgeworICAgICAgICBwcmludGsoIkxLRiIpOworICAgICAgfQorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBGUkFNRV9UTykKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJGUk1UTyIpOworICAgICAgfQorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBBQk9SVFNFUV9OT1RJRlkpCisgICAgICB7CisgICAgICAgIHByaW50aygiQUJTUSIpOworICAgICAgfQorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBTRlFfRlJBTUUpCisgICAgICB7CisgICAgICAgIHByaW50aygiU0ZRRlIiKTsKKyAgICAgIH0KKworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0udHlwZSA9PSAweDIwMDApCisgICAgICAgIHByaW50aygiIFdSIik7CisgICAgICBlbHNlIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnR5cGUgPT0gMHgzMDAwKQorICAgICAgICBwcmludGsoIiBSRCIpOworICAgICAgZWxzZSBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS50eXBlID09IDB4MTApCisgICAgICAgIHByaW50aygiIEFCVFMiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIgJVhoIiwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS50eXBlKTsgCisKKyAgICAgIGlmKCAhKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5zdGF0dXMgJiBJTklUSUFUT1JfQUJPUlQpKQorICAgICAgeworCXByaW50aygiIENtZCAlcCwgIiwgCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5DbW5kKTsKKworICAgICAgICBwcmludGsoIiBicmQvY2huL3RyZy9sdW4gJWQvJWQvJWQvJWQgcG9ydF9pZCAlMDZYXG4iLCAKKyAgICAgICAgICBjcHFmY0hCQWRhdGEtPkhCQW51bSwKKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLkNtbmQtPmNoYW5uZWwsCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5DbW5kLT50YXJnZXQsCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5DbW5kLT5sdW4sCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5mY2hzLmRfaWQgJiAweEZGRkZGRik7CisgICAgICB9CisgICAgICBlbHNlICAvLyBhc3N1bWUgdGhhdCBDbW5kIHB0ciBpcyBpbnZhbGlkIG9uIF9hYm9ydCgpCisgICAgICB7CisJcHJpbnRrKCIgQ21kIHB0ciBpbnZhbGlkXG4iKTsKKyAgICAgIH0KKyAgICAgCisjZW5kaWYgICAgICAKKworICAgICAgCisgICAgICAvLyBTdGVwcyB0byBBQk9SVCBhIFNFU1QgZXhjaGFuZ2U6CisgICAgICAvLyAxLiBGcmVlemUgVEwgU0NTSSBhc3Npc3RzICYgRVJRIChldmVyeXRoaW5nKQorICAgICAgLy8gMi4gUmVjZWl2ZSBGUk9aRU4gaW5ib3VuZCBDTSAobXVzdCBzdWNjZWVkISkKKyAgICAgIC8vIDMuIEludmFsaWRhdGUgeF9JRCBTRVNUIGVudHJ5IAorICAgICAgLy8gNC4gUmVzdW1lIFRMIFNDU0kgYXNzaXN0cyAmIEVSUSAoZXZlcnl0aGluZykKKyAgICAgIC8vIDUuIEJ1aWxkL3N0YXJ0IG9uIGV4Y2hhbmdlIC0gY2hhbmdlICJ0eXBlIiB0byBCTFNfQUJUUywKKyAgICAgIC8vICAgIHRpbWVvdXQgdG8gWCBzZWMgKFJBX1RPViBmcm9tIFBMREEgaXMgYWN0dWFsbHkgMCkKKyAgICAgIC8vIDYuIFNldCBFeGNoYW5nZSBRJ2Qgc3RhdHVzIGlmIEFCVFMgY2Fubm90IGJlIHN0YXJ0ZWQsCisgICAgICAvLyAgICBvciBzaW1wbHkgY29tcGxldGUgRXhjaGFuZ2UgaW4gIlRlcm1pbmF0ZSIgY29uZGl0aW9uCisKKyAgUENJX1RSQUNFTyggeF9JRCwgMHhCNCkKKyAgICAgIAorICAgICAgLy8gMSAmIDIgLiBGcmVlemUgVGFjaCAmIGdldCBjb25maXJtYXRpb24gb2YgZnJlZXplCisgICAgICBGcm96ZVRhY2ggPSBGcmVlemVUYWNoKCBjcHFmY0hCQWRhdGEpOworCisgICAgICAvLyAzLiBPSywgVGFjaHlvbiBpcyBmcm96ZW4sIHNvIHdlIGNhbiBpbnZhbGlkYXRlIFNFU1QgZXhjaGFuZ2UuCisgICAgICAvLyBGQzJfVElNRU9VVCBtZWFucyB3ZSBhcmUgb3JpZ2luYXRpbmcgdGhlIGFib3J0LCB3aGlsZQorICAgICAgLy8gVEFSR0VUX0FCT1JUIG1lYW5zIHdlIGFyZSBBQ0NlcHRpbmcgYW4gYWJvcnQuCisgICAgICAvLyBMSU5LRkFJTF9UWCwgQUJPUlRTRVFfTk9GSVRZLCBJTlZfRU5UUlkgb3IgRlJBTUVfVE8gYXJlIAorICAgICAgLy8gYWxsIGZyb20gVGFjaHlvbjoKKyAgICAgIC8vIEV4Y2hhbmdlIHdhcyBjb3JydXB0ZWQgYnkgTERuIG9yIG90aGVyIEZDIHBoeXNpY2FsIGZhaWx1cmUKKyAgICAgIC8vIElOSVRJQVRPUl9BQk9SVCBtZWFucyB0aGUgdXBwZXIgbGF5ZXIgZHJpdmVyL2FwcGxpY2F0aW9uCisgICAgICAvLyByZXF1ZXN0ZWQgdGhlIGFib3J0LgorCisKKwkgIAorICAgICAgLy8gY2xlYXIgYml0IDMxIChWQUxpZCksIHRvIGludmFsaWRhdGUgJiB0YWtlIGNvbnRyb2wgZnJvbSBUTAorICAgICAgZmNDaGlwLT5TRVNULT51WyB4X0lEXS5JV0UuSGRyX0xlbiAmPSAweDdGRkZGRkZGOworCisKKyAgICAgIC8vIGV4YW1pbmUgYW5kIFRhY2gncyAiTGlua2VkIExpc3QiIGZvciBJV0VzIHRoYXQgCisgICAgICAvLyByZWNlaXZlZCAobmVhcmx5KSBzaW11bHRhbmVvdXMgdHJhbnNmZXIgcmVhZHkgKFhSRFkpIAorICAgICAgLy8gcmVwYWlyIGxpbmtlZCBsaXN0IGlmIG5lY2Vzc2FyeSAoVEJEISkKKyAgICAgIC8vIChJZiB3ZSBpZ25vcmUgdGhlICJMaW5rZWQgTGlzdCIsIHdlIHdpbGwgdGltZSBvdXQKKyAgICAgIC8vIFdSSVRFIGNvbW1hbmRzIHdoZXJlIHdlIHJlY2VpdmVkIHRoZSBGQ1AtU0NTSSBYRlJEWQorICAgICAgLy8gZnJhbWUgKGJlY2F1c2UgVGFjaHlvbiBkaWRuJ3QgcHJvY2Vzc2VzIGl0KS4gIExpbmtlZCBMaXN0CisgICAgICAvLyBtYW5hZ2VtZW50IHNob3VsZCBiZSBkb25lIGFzIGFuIG9wdGltaXphdGlvbi4KKworLy8gICAgICAgcmVhZGwoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZStUTF9NRU1fU0VTVF9MSU5LRURfTElTVCApKTsKKworCisgICAgICAKKworICAgICAgLy8gNC4gUmVzdW1lIGFsbCBUYWNobGl0ZSBmdW5jdGlvbnMgKGZvciBvdGhlciBvcGVuIEV4Y2hhbmdlcykKKyAgICAgIC8vIGFzIHF1aWNrbHkgYXMgcG9zc2libGUgdG8gYWxsb3cgb3RoZXIgZXhjaGFuZ2VzIHRvIG90aGVyIHBvcnRzCisgICAgICAvLyB0byByZXN1bWUuICBGcmVlemluZyBUYWNoeW9uIG1heSBjYXVzZSBjYXNjYWRpbmcgZXJyb3JzLCBiZWNhdXNlCisgICAgICAvLyBhbnkgcmVjZWl2ZWQgU0VTVCBmcmFtZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBTRVNULgorICAgICAgLy8gRG9uJ3QgInVuZnJlZXplIiB1bmxlc3MgTGluayBpcyBvcGVyYXRpb25hbAorICAgICAgaWYoIEZyb3plVGFjaCApICAvLyBkaWQgd2UganVzdCBmcmVlemUgaXQgKGFib3ZlKT8KKyAgICAgICAgZmNDaGlwLT5VbkZyZWV6ZVRhY2h5b24oIGZjQ2hpcCwgMik7ICAvLyBib3RoIEVSUSBhbmQgRkNQIGFzc2lzdHMKKyAgICAgIAorCisgIFBDSV9UUkFDRU8oIHhfSUQsIDB4QjQpCisKKyAgICAgIC8vIE5vdGUgdGhlcmUgaXMgbm8gY29uZmlybWF0aW9uIHRoYXQgdGhlIGNoaXAgaXMgInVuZnJvemVuIi4gIEFsc28sCisgICAgICAvLyBpZiB0aGUgTGluayBpcyBkb3duIHdoZW4gdW5mcmVlemUgaXMgY2FsbGVkLCBpdCBoYXMgbm8gZWZmZWN0LgorICAgICAgLy8gQ2hpcCB3aWxsIHVuZnJlZXplIHdoZW4gdGhlIExpbmsgaXMgYmFjayB1cC4KKworICAgICAgLy8gNS4gTm93IHNlbmQgb3V0IEFib3J0IGNvbW1hbmRzIGlmIHBvc3NpYmxlCisgICAgICAvLyBTb21lIEFib3J0cyBjYW4ndCBiZSAic2VudCIgKFBvcnRfaWQgY2hhbmdlZCBvciBnb25lKTsKKyAgICAgIC8vIGlmIHRoZSBkZXZpY2UgaXMgZ29uZSwgdGhlcmUgaXMgbm8gcG9ydF9pZCB0byBzZW5kIHRoZSBBQlRTIHRvLgorCisgICAgICBpZiggIShFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnN0YXR1cyAmIFBPUlRJRF9DSEFOR0VEKQorCQkJICAmJgorICAgICAgICAgICEoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5zdGF0dXMgJiBERVZJQ0VfUkVNT1ZFRCkgKQorICAgICAgeworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLnR5cGUgPSBCTFNfQUJUUzsKKyAgICAgICAgZmNocy5zX2lkID0gRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5mY2hzLmRfaWQ7CisgICAgICAgIHVsU3RhdHVzID0gY3BxZmNUU0J1aWxkRXhjaGFuZ2UoCisgICAgICAgICAgY3BxZmNIQkFkYXRhLAorICAgICAgICAgIEJMU19BQlRTLAorICAgICAgICAgICZmY2hzLCAgICAgICAgLy8gKHVzZXMgb25seSBzX2lkKQorICAgICAgICAgIE5VTEwsICAgICAgICAgLy8gKG5vIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgZm9yIEFCVFMpCisgICAgICAgICAgJnhfSUQgKTsvLyBBQlRTIG9uIHRoaXMgRXhjaGFuZ2UgSUQKKworICAgICAgICBpZiggIXVsU3RhdHVzICkgLy8gRXhjaGFuZ2Ugc2V0dXAgYnVpbGQgT0s/CisgICAgICAgIHsKKworICAgICAgICAgICAgLy8gQUJUUyBtYXkgYmUgbmVlZGVkIGJlY2F1c2UgYW4gRXhjaGFuZ2Ugd2FzIGNvcnJ1cHRlZAorICAgICAgICAgICAgLy8gYnkgYSBMaW5rIGRpc3J1cHRpb24uICBJZiB0aGUgTGluayBpcyBVUCwgd2UgY2FuCisJICAgIC8vIHByZXN1bWUgdGhhdCB0aGlzIEFCVFMgY2FuIHN0YXJ0IGltbWVkaWF0ZWx5OyBvdGhlcndpc2UsCisJICAgIC8vIHNldCBRdWUnZCBzdGF0dXMgc28gdGhlIExvZ2luIGZ1bmN0aW9ucworICAgICAgICAgICAgLy8gY2FuIHJlc3RhcnQgaXQgd2hlbiB0aGUgRkMgcGh5c2ljYWwgTGluayBpcyByZXN0b3JlZAorICAgICAgICAgIGlmKCAoKGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYweEYwKSAmMHg4MCkpIC8vIGxvb3AgaW5pdD8KKyAgICAgICAgICB7CQkJICAgIAorLy8gICAgICAgICAgICAgICAgcHJpbnRrKCIgKnNldCBRIHN0YXR1cyB4X0lEICVYaCBvbiBMRG4qICIsIHhfSUQpOworICAgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uc3RhdHVzIHw9IEVYQ0hBTkdFX1FVRVVFRDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbHNlICAvLyB3aGF0IEZDIGRldmljZSAocG9ydF9pZCkgZG9lcyB0aGUgQ21kIGJlbG9uZyB0bz8KKyAgICAgICAgICB7CisgICAgICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0ID0gCisgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0ucExvZ2dlZEluUG9ydDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gaWYgUG9ydCBpcyBsb2dnZWQgaW4sIHdlIG1pZ2h0IHN0YXJ0IHRoZSBhYm9ydC4KKwkKKyAgICAgICAgICAgIGlmKCAocExvZ2dlZEluUG9ydCAhPSBOVUxMKSAKKwkJCSAgICAgICYmCisgICAgICAgICAgICAgICAgKHBMb2dnZWRJblBvcnQtPnBybGkgPT0gVFJVRSkgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IGFuIEV4Y2hhbmdlIGhhcyBhbHJlYWR5IGJlZW4gUXVldWVkCisgICAgICAgICAgICAgIC8vIHRvIHN0YXJ0IGFmdGVyIExvZ2luIGNvbXBsZXRlcy4gIENoZWNrIGFuZCBkb24ndAorCSAgICAgIC8vIHN0YXJ0IGl0IChhZ2FpbikgaGVyZSBpZiBRJ2Qgc3RhdHVzIHNldAorLy8JICAgIHByaW50aygiIEFCVFMgeGNoZyAlWGggIiwgeF9JRCk7ICAgICAgICAgICAgCisgCSAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzICYgRVhDSEFOR0VfUVVFVUVEKQorCSAgICAgIHsKKy8vCQkgICAgcHJpbnRrKCJhbHJlYWR5IFEnZCAiKTsKKwkgICAgICB9CisJICAgICAgZWxzZQorCSAgICAgIHsKKy8vCSAgICAgICAgICAgIHByaW50aygic3RhcnRpbmcgIik7CisJCQorICAgICAgICAgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5GQzJhYm9ydGVkKys7IAorICAgICAgICAgICAgICAgIHVsU3RhdHVzID0gY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgeF9JRCApOworICAgICAgICAgICAgICAgIGlmKCAhdWxTdGF0dXMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VibWl0dGVkIHRvIFRhY2gncyBPdXRib3VuZCBRdWUgKEVSUSBQSSBpbmNyZW1lbnRlZCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKy8qICAgICAgICAgICAgICAgICAgIHByaW50aygiQUJUUyBleGNoYW5nZSBzdGFydCBmYWlsZWQgLXN0YXR1cyAlWGgsIHhfSUQgJVhoICIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bFN0YXR1cywgeF9JRCk7CisqLworICAgICAgICAgICAgICAgIH0gCisJICAgICAgfQorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworLyogICAgICAgICAJICBwcmludGsoIiBBQlRTIE5PVCBzdGFydGluZyB4Y2hnICVYaCwgJXAgIiwKKwkJCSAgICAgICB4X0lELCBwTG9nZ2VkSW5Qb3J0KTsKKwkgICAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQgKQorCSAgICAgICAgICAgIHByaW50aygicHJsaSAlZCAiLCBwTG9nZ2VkSW5Qb3J0LT5wcmxpKTsKKyovCisJICAgIH0JCQorIAkgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAvLyB3aGF0IHRoZSAjQCEKKyAgICAgICAgeyAgLy8gaG93IGRvIHdlIGZhaWwgdG8gYnVpbGQgYW4gRXhjaGFuZ2UgZm9yIEFCVFM/PworICAgICAgICAgICAgICBwcmludGsoIkFCVFMgZXhjaGFuZ2UgYnVpbGQgZmFpbGVkIC1zdGF0dXMgJVhoLCB4X0lEICVYaFxuIiwKKyAgICAgICAgICAgICAgICB1bFN0YXR1cywgeF9JRCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgICAvLyBhYm9ydCB3aXRob3V0IEFCVFMgLS0ganVzdCBjb21wbGV0ZSBleGNoYW5nZS9DbW5kIHRvIExpbnV4CisgICAgICB7CisvLyAgICAgICAgICAgIHByaW50aygiICpUZXJtaW5hdGluZyB4X0lEICVYaCBvbiAlWGgqICIsIAorLy8JCSAgICB4X0lELCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzKTsKKyAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIHhfSUQpOworCisgICAgICB9CisgICAgfSAvLyBlbmQgb2YgQUJUUyBjYXNlCisgICAgICBicmVhazsKKworCisKKyAgICBjYXNlIEJMU19BQlRTX0FDQzogICAvLyBuZWVkIHRvIEFDQ2VwdCBvbmUgQUJUUworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChOT1RFISB0aGlzIGNvZGUgbm90IHVwZGF0ZWQgZm9yIExpbnV4IHlldC4uKQorICAgICAgCisKKyAgICAgIHByaW50aygiICpBQlRTX0FDQyogIik7CisgICAgICAvLyAxLiBGcmVlemUgVEwKKworICAgICAgZmNDaGlwLT5GcmVlemVUYWNoeW9uKCBmY0NoaXAsIDIpOyAgLy8gYm90aCBFUlEgYW5kIEZDUCBhc3Npc3RzCisKKyAgICAgIG1lbWNweSggIC8vIGNvcHkgdGhlIGluY29taW5nIEFCVFMgZnJhbWUKKyAgICAgICAgJmZjaHMsCisgICAgICAgIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0udWxCdWZmLCAvLyBpbmNvbWluZyBmY2hzCisgICAgICAgIHNpemVvZiggZmNocykpOworCisgICAgICAvLyAzLiBPSywgVGFjaHlvbiBpcyBmcm96ZW4gc28gd2UgY2FuIGludmFsaWRhdGUgU0VTVCBlbnRyeSAKKyAgICAgIC8vIChpZiBuZWNlc3NhcnkpCisgICAgICAvLyBTdGF0dXMgRkMyX1RJTUVPVVQgbWVhbnMgd2UgYXJlIG9yaWdpbmF0aW5nIHRoZSBhYm9ydCwgd2hpbGUKKyAgICAgIC8vIFRBUkdFVF9BQk9SVCBtZWFucyB3ZSBhcmUgQUNDZXB0aW5nIGFuIGFib3J0CisgICAgICAKKyAgICAgIEV4Y2hhbmdlSUQgPSBmY2hzLm94X3J4X2lkICYgMHg3RkZGOyAvLyBSWF9JRCBmb3IgZXhjaGFuZ2UKKy8vICAgICAgcHJpbnRrKCJBQlRTIEFDQyBmb3IgVGFyZ2V0IEV4Y2hhbmdlSUQgJVhoXG4iLCBFeGNoYW5nZUlEKTsKKworCisgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gcmVjZWl2ZWQgRXhjaGFuZ2VJRAorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0uc3RhdHVzID09IFRBUkdFVF9BQk9SVCApCisgICAgICB7CisgICAgICAgICAgLy8gY2xlYXIgYml0IDMxIChWQUxpZCksIHRvIGludmFsaWRhdGUgJiB0YWtlIGNvbnRyb2wgZnJvbSBUTAorLy8gICAgICAgICAgcHJpbnRrKCJJbnZhbGlkYXRpbmcgU0VTVCBleGNoYW5nZSAlWGhcbiIsIEV4Y2hhbmdlSUQpOworICAgICAgICAgIGZjQ2hpcC0+U0VTVC0+dVsgRXhjaGFuZ2VJRF0uSVdFLkhkcl9MZW4gJj0gMHg3RkZGRkZGRjsKKyAgICAgIH0KKworCisgICAgICAvLyA0LiBSZXN1bWUgYWxsIFRhY2hsaXRlIGZ1bmN0aW9ucyAoZm9yIG90aGVyIG9wZW4gRXhjaGFuZ2VzKQorICAgICAgLy8gYXMgcXVpY2tseSBhcyBwb3NzaWJsZSB0byBhbGxvdyBvdGhlciBleGNoYW5nZXMgdG8gb3RoZXIgcG9ydHMKKyAgICAgIC8vIHRvIHJlc3VtZS4gIEZyZWV6aW5nIFRhY2h5b24gZm9yIHRvbyBsb25nIG1heSByb3lhbGx5IHNjcmV3CisgICAgICAvLyB1cCBldmVyeXRoaW5nIQorICAgICAgZmNDaGlwLT5VbkZyZWV6ZVRhY2h5b24oIGZjQ2hpcCwgMik7ICAvLyBib3RoIEVSUSBhbmQgRkNQIGFzc2lzdHMKKyAgICAgIAorICAgICAgLy8gTm90ZSB0aGVyZSBpcyBubyBjb25maXJtYXRpb24gdGhhdCB0aGUgY2hpcCBpcyAidW5mcm96ZW4iLiAgQWxzbywKKyAgICAgIC8vIGlmIHRoZSBMaW5rIGlzIGRvd24gd2hlbiB1bmZyZWV6ZSBpcyBjYWxsZWQsIGl0IGhhcyBubyBlZmZlY3QuCisgICAgICAvLyBDaGlwIHdpbGwgdW5mcmVlemUgd2hlbiB0aGUgTGluayBpcyBiYWNrIHVwLgorCisgICAgICAvLyA1LiBOb3cgc2VuZCBvdXQgQWJvcnQgQUNDIHJlcGx5IGZvciB0aGlzIGV4Y2hhbmdlCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnR5cGUgPSBCTFNfQUJUU19BQ0M7CisgICAgICAKKyAgICAgIGZjaHMuc19pZCA9IEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0uZmNocy5kX2lkOworICAgICAgdWxTdGF0dXMgPSBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgICAgICAgICAgIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgIEJMU19BQlRTX0FDQywKKyAgICAgICAgICAgICZmY2hzLAorICAgICAgICAgICAgTlVMTCwgICAgICAgICAvLyBubyBkYXRhIChubyBzY2F0dGVyL2dhdGhlciBsaXN0KQorICAgICAgICAgICAgJkV4Y2hhbmdlSUQgKTsvLyBmY0NvbnRyb2xsZXItPmZjRXhjaGFuZ2VzIGluZGV4LCAtMSBpZiBmYWlsZWQKKworICAgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwPworICAgICAgeworICAgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNTdGFydEV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIEV4Y2hhbmdlSUQgKTsKKyAgICAgICAgaWYoICF1bFN0YXR1cyApCisgICAgICAgIHsKKyAgICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gVGFjaCdzIE91dGJvdW5kIFF1ZSAoRVJRIFBJIGluY3JlbWVudGVkKQorICAgICAgICAgIC8vIHdhaXRlZCBmb3IgY29tcGxldGlvbiBmb3IgRUxTIHR5cGUgKExvZ2luIGZyYW1lcyBpc3N1ZWQKKyAgICAgICAgICAvLyBzeW5jaHJvbm91c2x5KQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvLyBjaGVjayByZWFzb24gZm9yIEV4Y2hhbmdlIG5vdCBiZWluZyBzdGFydGVkIC0gd2UgbWlnaHQKKyAgICAgICAgICAvLyB3YW50IHRvIFF1ZXVlIGFuZCBzdGFydCBsYXRlciwgb3IgZmFpbCB3aXRoIGVycm9yCisgICAgICAgIHsKKworICAgICAgICB9IAorICAgICAgfQorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQkxTX0FCVFNfUkpUOiAgIC8vIG5lZWQgdG8gUmVKZWNUIG9uZSBBQlRTOyByZWplY3QgaW1wbGllcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNoYW5nZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBUQVJHRVQgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGNoYW5nZUlEIGhhcyB0byBjb21lIGZyb20gTGlua1NlcnZpY2Ugc3BhY2UuCisKKyAgICAgIHByaW50aygiICpBQlRTX1JKVCogIik7CisgICAgICB1bFN0YXR1cyA9IGNwcWZjVFNCdWlsZEV4Y2hhbmdlKAorICAgICAgICAgICAgY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgQkxTX0FCVFNfUkpULAorICAgICAgICAgICAgKFRhY2hGQ0hEUl9HQ01ORCopCisgICAgICAgICAgICAgIGZjTFEtPlFpdGVtW1Fjb25zdW1lck5keF0udWxCdWZmLCAvLyBpbmNvbWluZyBmY2hzCisgICAgICAgICAgICBOVUxMLCAgICAgICAgIC8vIG5vIGRhdGEgKG5vIHNjYXR0ZXIvZ2F0aGVyIGxpc3QpCisgICAgICAgICAgICAmRXhjaGFuZ2VJRCApOy8vIGZjQ29udHJvbGxlci0+ZmNFeGNoYW5nZXMgaW5kZXgsIC0xIGlmIGZhaWxlZAorCisgICAgICBpZiggIXVsU3RhdHVzICkgLy8gRXhjaGFuZ2Ugc2V0dXAgT0s/CisgICAgICB7CisgICAgICAgIHVsU3RhdHVzID0gY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgRXhjaGFuZ2VJRCApOworICAgICAgICAvLyBJZiBpdCBmYWlscywgd2UgYXJlbid0IHJlcXVpcmVkIHRvIHJldHJ5LgorICAgICAgfQorICAgICAgaWYoIHVsU3RhdHVzICkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gc2VuZCBCTFNfUkpUIGZvciBBQlRTLCBYX0lEICVYaFxuIiwgRXhjaGFuZ2VJRCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHByaW50aygiU2VudCBCTFNfUkpUIGZvciBBQlRTLCBYX0lEICVYaFxuIiwgRXhjaGFuZ2VJRCk7CisgICAgICAKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9ICAgICAgICAgICAgICAgICAgIC8vIGVuZCBzd2l0Y2gKKy8vZG9Ob3RoaW5nOgorICAgIC8vIGRvbmUgd2l0aCB0aGlzIGl0ZW0gLSBub3cgc2V0IHRoZSBORVhUIGluZGV4CisKKyAgaWYoIFFjb25zdW1lck5keCsxID49IEZDX0xJTktRX0RFUFRIICkgLy8gcm9sbG92ZXIgdGVzdAorICB7CisgICAgZmNMUS0+Y29uc3VtZXIgPSAwOworICB9CisgIGVsc2UKKyAgeyAKKyAgICBmY0xRLT5jb25zdW1lcisrOworICB9CisKKyAgUENJX1RSQUNFTyggZmNMUS0+UWl0ZW1bUWNvbnN1bWVyTmR4XS5UeXBlLCAweDk0KQorCisgIExFQVZFKCJXb3JrVGFzayIpOworICByZXR1cm47Cit9CisKKworCisKKy8vIFdoZW4gVGFjaHlvbiByZXBvcnRzIGxpbmsgZG93biwgYmFkIGFsX3BhLCBvciBMaW5rIFNlcnZpY2UgKGUuZy4gTG9naW4pCisvLyBjb21tYW5kcyBjb21lIGluLCBwb3N0IHRvIHRoZSBMaW5rUSBzbyB0aGF0IGFjdGlvbiBjYW4gYmUgdGFrZW4gb3V0c2lkZSB0aGUKKy8vIGludGVycnVwdCBoYW5kbGVyLiAgCisvLyBUaGlzIGNpcmN1bGFyIFEgd29ya3MgbGlrZSBUYWNoeW9uJ3MgcXVlIC0gdGhlIHByb2R1Y2VyIHBvaW50cyB0byB0aGUgbmV4dAorLy8gKHVudXNlZCkgZW50cnkuICBDYWxsZWQgYnkgSW50ZXJydXB0IGhhbmRsZXIsIFdvcmtlclRocmVhZCwgVGltZXIKKy8vIHNwdXRsaW5rcQordm9pZCBjcHFmY1RTUHV0TGlua1F1ZSggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwKKyAgaW50IFR5cGUsIAorICB2b2lkICpRdWVDb250ZW50KQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisvLyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgUEZDX0xJTktfUVVFIGZjTFEgPSBjcHFmY0hCQWRhdGEtPmZjTFE7CisgIFVMT05HIG5keDsKKyAgCisgIEVOVEVSKCJjcHFmY1RTUHV0TGlua1EiKTsKKworICBuZHggPSBmY0xRLT5wcm9kdWNlcjsKKyAgCisgIG5keCArPSAxOyAgLy8gdGVzdCBmb3IgUXVlIGZ1bGwKKworCisgIAorICBpZiggbmR4ID49IEZDX0xJTktRX0RFUFRIICkgLy8gcm9sbG92ZXIgdGVzdAorICAgIG5keCA9IDA7CisKKyAgaWYoIG5keCA9PSBmY0xRLT5jb25zdW1lciApICAgLy8gUVVFIGZ1bGwgdGVzdAorICB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVRSB3YXMgZnVsbCEgbG9zdCBMSyBjb21tYW5kIChmYXRhbCB0byBsb2dpYykKKyAgICBmY0NoaXAtPmZjU3RhdHMubG5rUXVlRnVsbCsrOworCisgICAgcHJpbnRrKCIqTGlua1EgRnVsbCEqIik7CisgICAgVHJpZ2dlckhCQSggZmNDaGlwLT5SZWdpc3RlcnMuUmVNYXBNZW1CYXNlLCAxKTsKKy8qCisgICAgeworICAgICAgaW50IGk7CisgICAgICBwcmludGsoIkxpbmtRIFBJICVkLCBDSSAlZFxuIiwgZmNMUS0+cHJvZHVjZXIsCisgICAgICAgIGZjTFEtPmNvbnN1bWVyKTsKKwkJICAgICAgCisgICAgICBmb3IoIGk9MDsgaTwgRkNfTElOS1FfREVQVEg7ICkKKyAgICAgIHsKKwlwcmludGsoIiBbJWRdJVhoICIsIGksIGZjTFEtPlFpdGVtW2ldLlR5cGUpOworCWlmKCAoKytpICU4KSA9PSAwKSBwcmludGsoIlxuIik7CisgICAgICB9CisgIAorICAgIH0KKyovICAgIAorICAgIHByaW50ayggImNwcWZjVFM6IFdBUk5JTkchISBQdXRMaW5rUXVlIC0gRlVMTCFcbiIpOyAvLyB3ZSdyZSBodW5nCisgIH0KKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFVRSBuZXh0IGVsZW1lbnQKKyAgeworICAgIC8vIFByZXZlbnQgY2VydGFpbiBtdWx0aXBsZSAoYmFjay10by1iYWNrKSByZXF1ZXN0cy4KKyAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBpbiB0aGF0IHdlIGRvbid0IHdhbnQgdG8gaXNzdWUgbXVsdGlwbGUKKyAgICAvLyBBQlRTIGZvciB0aGUgc2FtZSBFeGNoYW5nZSwgb3IgZG8gbXVsdGlwbGUgRk0gaW5pdHMsIGV0Yy4KKyAgICAvLyBXZSBjYW4gbmV2ZXIgYmUgc3VyZSBvZiB0aGUgdGltaW5nIG9mIGV2ZW50cyByZXBvcnRlZCB0bworICAgIC8vIHVzIGJ5IFRhY2gncyBJTVEsIHdoaWNoIGNhbiBkZXBlbmQgb24gc3lzdGVtL2J1cyBzcGVlZHMsCisgICAgLy8gRkMgcGh5c2ljYWwgbGluayBjaXJjdW1zdGFuY2VzLCBldGMuCisgICAgIAorICAgIGlmKCAoZmNMUS0+cHJvZHVjZXIgIT0gZmNMUS0+Y29uc3VtZXIpCisJICAgICYmIAorICAgICAgICAoVHlwZSA9PSBGTUlOSVQpICApCisgICAgeworICAgICAgTE9ORyBsYXN0TmR4OyAgLy8gY29tcHV0ZSBwcmV2aW91cyBwcm9kdWNlciBpbmRleAorICAgICAgaWYoIGZjTFEtPnByb2R1Y2VyKQorICAgICAgICBsYXN0TmR4ID0gZmNMUS0+cHJvZHVjZXItIDE7CisgICAgICBlbHNlCisJbGFzdE5keCA9IEZDX0xJTktRX0RFUFRILTE7CisKKworICAgICAgaWYoIGZjTFEtPlFpdGVtW2xhc3ROZHhdLlR5cGUgPT0gRk1JTklUKQorICAgICAgeworLy8gICAgICAgIHByaW50aygiICpza2lwIEZNSU5JVCBRIHBvc3QqICIpOworLy8gICAgICAgIGdvdG8gRG9uZVdpdGhQdXRROworICAgICAgfQorCisgICAgfQorCisgICAgLy8gT0ssIGFkZCB0aGUgUSdkIGl0ZW0uLi4KKyAgICAKKyAgICBmY0xRLT5RaXRlbVtmY0xRLT5wcm9kdWNlcl0uVHlwZSA9IFR5cGU7CisgICAKKyAgICBtZW1jcHkoCisgICAgICAgIGZjTFEtPlFpdGVtW2ZjTFEtPnByb2R1Y2VyXS51bEJ1ZmYsCisgICAgICAgIFF1ZUNvbnRlbnQsIAorICAgICAgICBzaXplb2YoZmNMUS0+UWl0ZW1bZmNMUS0+cHJvZHVjZXJdLnVsQnVmZikpOworCisgICAgZmNMUS0+cHJvZHVjZXIgPSBuZHg7ICAvLyBpbmNyZW1lbnQgUXVlIHByb2R1Y2VyCisKKyAgICAvLyBzZXQgc2VtYXBob3JlIHRvIHdha2UgdXAgS2VybmVsICh3b3JrZXIpIHRocmVhZAorICAgIC8vIAorICAgIHVwKCBjcHFmY0hCQWRhdGEtPmZjUXVlUmVhZHkgKTsKKyAgfQorCisvL0RvbmVXaXRoUHV0UToKKworICBMRUFWRSgiY3BxZmNUU1B1dExpbmtRIik7Cit9CisKKworCisKKy8vIHJlc2V0IGRldmljZSBleHQgRkMgbGluayBRCit2b2lkIGNwcWZjVFNMaW5rUVJlc2V0KCBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhKQorICAgCit7CisgIFBGQ19MSU5LX1FVRSBmY0xRID0gY3BxZmNIQkFkYXRhLT5mY0xROworICBmY0xRLT5wcm9kdWNlciA9IDA7CisgIGZjTFEtPmNvbnN1bWVyID0gMDsKKworfQorCisKKworCisKKy8vIFdoZW4gVGFjaHlvbiBnZXRzIGFuIHVuYXNzaXN0ZWQgRkNQLVNDU0kgZnJhbWUsIHBvc3QgaGVyZSBzbworLy8gYW4gYXJiaXRyYXJ5IGNvbnRleHQgdGhyZWFkIChlLmcuIElPQ1RMIGxvb3BiYWNrIHRlc3QgZnVuY3Rpb24pCisvLyBjYW4gcHJvY2VzcyBpdC4KKworLy8gKE5PVEU6IE5vdCByZXZpc2VkIGZvciBMaW51eCkKKy8vIFRoaXMgUSB3b3JrcyBsaWtlIFRhY2h5b24ncyBxdWUgLSB0aGUgcHJvZHVjZXIgcG9pbnRzIHRvIHRoZSBuZXh0CisvLyAodW51c2VkKSBlbnRyeS4KK3ZvaWQgY3BxZmNUU1B1dFNjc2lRdWUoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEsCisgIGludCBUeXBlLCAKKyAgdm9pZCAqUXVlQ29udGVudCkKK3sKKy8vICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworLy8gIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKworLy8gIFVMT05HIG5keDsKKworLy8gIFVMT05HICpwRXhjaGFuZ2VJRDsKKy8vICBMT05HIEV4Y2hhbmdlSUQ7CisKKy8qCisgIEtlQWNxdWlyZVNwaW5Mb2NrQXREcGNMZXZlbCggJnBEZXZFeHQtPmZjU2NzaVF1ZUxvY2spOworICBuZHggPSBwRGV2RXh0LT5mY1Njc2lRdWUucHJvZHVjZXIgKyAxOyAgLy8gdGVzdCBmb3IgUXVlIGZ1bGwKKworICBpZiggbmR4ID49IEZDX1NDU0lRX0RFUFRIICkgLy8gcm9sbG92ZXIgdGVzdAorICAgIG5keCA9IDA7CisKKyAgaWYoIG5keCA9PSBwRGV2RXh0LT5mY1Njc2lRdWUuY29uc3VtZXIgKSAgIC8vIFFVRSBmdWxsIHRlc3QKKyAgeworICAgICAgICAgICAgICAgICAgICAgICAvLyBRVUUgd2FzIGZ1bGwhIGxvc3QgTEsgY29tbWFuZCAoZmF0YWwgdG8gbG9naWMpCisgICAgZmNDaGlwLT5mY1N0YXRzLlNjc2lRdWVGdWxsKys7CisjaWZkZWYgREJHCisgICAgcHJpbnRrKCAiZmNQdXRTY3NpUXVlIC0gRlVMTCFcbiIpOworI2VuZGlmCisKKyAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLy8gUVVFIG5leHQgZWxlbWVudAorICB7CisgICAgcERldkV4dC0+ZmNTY3NpUXVlLlFpdGVtW3BEZXZFeHQtPmZjU2NzaVF1ZS5wcm9kdWNlcl0uVHlwZSA9IFR5cGU7CisgICAgCisgICAgaWYoIFR5cGUgPT0gRkNQX1JTUCApCisgICAgeworICAgICAgLy8gdGhpcyBUTCBpbmJvdW5kIG1lc3NhZ2UgdHlwZSBtZWFucyB0aGF0IGEgVEwgU0VTVCBleGNoYW5nZSBoYXMKKyAgICAgIC8vIGNvcGllZCBhbiBGQ1AgcmVzcG9uc2UgZnJhbWUgaW50byBhIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSBTRVNUCisgICAgICAvLyBlbnRyeS4gIFRoYXQgYnVmZmVyIGlzIGFsbG9jYXRlZCBpbiB0aGUgU0VTVCBzdHJ1Y3R1cmUgYXQgLT5Sc3BIRFIuCisgICAgICAvLyBDb3B5IHRoZSBSc3BIRFIgZm9yIHVzZSBieSB0aGUgUXVlIGhhbmRsZXIuCisgICAgICBwRXhjaGFuZ2VJRCA9IChVTE9ORyAqKVF1ZUNvbnRlbnQ7CisgICAgICAKKyAgICAgIG1lbWNweSgKKwkgICAgICBwRGV2RXh0LT5mY1Njc2lRdWUuUWl0ZW1bcERldkV4dC0+ZmNTY3NpUXVlLnByb2R1Y2VyXS51bEJ1ZmYsCisgICAgICAgICZmY0NoaXAtPlNFU1QtPlJzcEhEUlsgKnBFeGNoYW5nZUlEIF0sCisJICAgICAgc2l6ZW9mKHBEZXZFeHQtPmZjU2NzaVF1ZS5RaXRlbVswXS51bEJ1ZmYpKTsgLy8gKGFueSBlbGVtZW50IGZvciBzaXplKQorICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtZW1jcHkoCisJICAgICAgcERldkV4dC0+ZmNTY3NpUXVlLlFpdGVtW3BEZXZFeHQtPmZjU2NzaVF1ZS5wcm9kdWNlcl0udWxCdWZmLAorICAgICAgICBRdWVDb250ZW50LCAKKwkgICAgICBzaXplb2YocERldkV4dC0+ZmNTY3NpUXVlLlFpdGVtW3BEZXZFeHQtPmZjU2NzaVF1ZS5wcm9kdWNlcl0udWxCdWZmKSk7CisgICAgfQorICAgICAgCisgICAgcERldkV4dC0+ZmNTY3NpUXVlLnByb2R1Y2VyID0gbmR4OyAgLy8gaW5jcmVtZW50IFF1ZQorCisKKyAgICBLZVNldEV2ZW50KCAmcERldkV4dC0+VFlJQnNjc2ksICAvLyBzaWduYWwgYW55IHdhaXRpbmcgdGhyZWFkCisgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByaW9yaXR5IGJvb3N0CisJCSAgIEZBTFNFICk7ICAgICAgICAgICAgICAvLyBubyB3YWl0aW5nIGxhdGVyIGZvciB0aGlzIGV2ZW50CisgIH0KKyAgS2VSZWxlYXNlU3BpbkxvY2tGcm9tRHBjTGV2ZWwoICZwRGV2RXh0LT5mY1Njc2lRdWVMb2NrKTsKKyovCit9CisKKworCisKKworCisKK3N0YXRpYyB2b2lkIFByb2Nlc3NFTFNfUmVxdWVzdCggQ1BRRkNIQkEqLFRhY2hGQ0hEUl9HQ01ORCopOworCitzdGF0aWMgdm9pZCBQcm9jZXNzRUxTX1JlcGx5KCBDUFFGQ0hCQSosVGFjaEZDSERSX0dDTU5EKik7CisKK3N0YXRpYyB2b2lkIFByb2Nlc3NGQ1NfUmVwbHkoIENQUUZDSEJBKixUYWNoRkNIRFJfR0NNTkQqKTsKKwordm9pZCBjcHFmY1RTSW1wbGljaXRMb2dvdXQoIENQUUZDSEJBKiBjcHFmY0hCQWRhdGEsCisJCVBGQ19MT0dHRURJTl9QT1JUIHBGY1BvcnQpCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKworICBpZiggcEZjUG9ydC0+cG9ydF9pZCAhPSAweEZGRkMwMSApIC8vIGRvbid0IGNhcmUgYWJvdXQgRmFicmljCisgIHsKKyAgICBmY0NoaXAtPmZjU3RhdHMubG9nb3V0cysrOworICAgIHByaW50aygiY3BxZmNUUzogSW1wbGljaXQgbG9nb3V0IG9mIFdXTiAlMDhYJTA4WCwgcG9ydF9pZCAlMDZYXG4iLCAKKyAgICAgICAgKFVMT05HKXBGY1BvcnQtPnUubGlXV04sCisgICAgICAgIChVTE9ORykocEZjUG9ydC0+dS5saVdXTiA+PjMyKSwKKwlwRmNQb3J0LT5wb3J0X2lkKTsKKworICAvLyBUZXJtaW5hdGUgSS9PIHdpdGggdGhpcyAoTGludXgpIFNjc2kgdGFyZ2V0CisgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRmNQb3J0LT5TY3NpTmV4dXMsCisJICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUkVNT1ZFRCk7CisgIH0KKwkJCQorICAvLyBEbyBhbiAiaW1wbGljaXQgbG9nb3V0IiAtIHdlIGNhbid0IHJlYWxseSBMb2dvdXQgdGhlIGRldmljZQorICAvLyAoaS5lLiB3aXRoIExPR091dCBSZXF1ZXN0KSBiZWNhdXNlIG9mIHBvcnRfaWQgY29uZnVzaW9uCisgIC8vIChpLmUuIHRoZSBPdGhlciBwb3J0IGhhcyBubyBwb3J0X2lkKS4KKyAgLy8gQSBuZXcgbG9naW4gZm9yIHRoYXQgV1dOIHdpbGwgaGF2ZSB0byByZS13cml0ZSBwb3J0X2lkICgwIGludmFsaWQpCisgIHBGY1BvcnQtPnBvcnRfaWQgPSAwOyAgLy8gaW52YWxpZCEKKyAgcEZjUG9ydC0+cGRpc2MgPSBGQUxTRTsKKyAgcEZjUG9ydC0+cHJsaSA9IEZBTFNFOworICBwRmNQb3J0LT5wbG9naSA9IEZBTFNFOworICBwRmNQb3J0LT5mbG9naSA9IEZBTFNFOworICBwRmNQb3J0LT5MT0dPX3RpbWVyID0gMDsKKyAgcEZjUG9ydC0+ZGV2aWNlX2Jsb2NrZWQgPSBUUlVFOyAvLyBibG9jayBTY3NpIFJlcXVlc3RzCisgIHBGY1BvcnQtPlNjc2lOZXh1cy5Wb2x1bWVTZXRBZGRyZXNzaW5nPTA7CQorfQorCisgIAorLy8gT24gRkMtQUwsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgYSBwcmV2aW91c2x5IGtub3duIGRldmljZSBjYW4KKy8vIGJlIHF1aWV0bHkgcmVtb3ZlZCAoZS5nLiB3aXRoIG5vbi1tYW5hZ2VkIGh1YiksIAorLy8gd2hpbGUgYSBORVcgZGV2aWNlICh3aXRoIGRpZmZlcmVudCBXV04pIHRvb2sgdGhlIHNhbWUgYWxwYSBvcgorLy8gZXZlbiAyNC1iaXQgcG9ydF9pZC4gIFRoaXMgY2hhbmNlIGlzIHVubGlrZWx5IGJ1dCB3ZSBtdXN0IGFsd2F5cworLy8gY2hlY2sgZm9yIGl0Lgorc3RhdGljIHZvaWQgVGVzdER1cGxpY2F0ZVBvcnRJZCggQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwKKwkJUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCkKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICAvLyBzZXQgIm90aGVyIHBvcnQiIGF0IGJlZ2lubmluZyBvZiBmY1BvcnRzIGxpc3QKKyAgUEZDX0xPR0dFRElOX1BPUlQgcE90aGVyUG9ydFdpdGhQb3J0SWQgPSBmY0NoaXAtPmZjUG9ydHMucE5leHRQb3J0OworICB3aGlsZSggcE90aGVyUG9ydFdpdGhQb3J0SWQgKSAKKyAgeworICAgIGlmKCAocE90aGVyUG9ydFdpdGhQb3J0SWQtPnBvcnRfaWQgPT0gCisgICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkKSAKKwkJICAgICYmCisgICAgICAgICAocE90aGVyUG9ydFdpdGhQb3J0SWQgIT0gcExvZ2dlZEluUG9ydCkgKQorICAgIHsKKyAgICAgIC8vIHRyb3VibGUhICAoSW1wbGljaXRseSkgTG9nIHRoZSBvdGhlciBndXkgb3V0CisgICAgICBwcmludGsoIiAqcG9ydF9pZCAlWGggaXMgZHVwbGljYXRlZCEqICIsIAorICAgICAgICBwT3RoZXJQb3J0V2l0aFBvcnRJZC0+cG9ydF9pZCk7CisgICAgICBjcHFmY1RTSW1wbGljaXRMb2dvdXQoIGNwcWZjSEJBZGF0YSwgcE90aGVyUG9ydFdpdGhQb3J0SWQpOyAKKyAgIH0KKyAgICBwT3RoZXJQb3J0V2l0aFBvcnRJZCA9IHBPdGhlclBvcnRXaXRoUG9ydElkLT5wTmV4dFBvcnQ7CisgIH0KK30KKworCisKKworCisKKy8vIER5bmFtaWMgTWVtb3J5IEFsbG9jYXRpb24gZm9yIG5ld2x5IGRpc2NvdmVyZWQgRkMgUG9ydHMuCisvLyBGb3Igc2ltcGxpY2l0eSwgbWFpbnRhaW4gZmNQb3J0cyBzdHJ1Y3RzIGZvciBBTEwKKy8vIGZvciBkaXNjb3ZlcmVkIGRldmljZXMsIGluY2x1ZGluZyB0aG9zZSB3ZSBuZXZlciBkbyBJL08gd2l0aAorLy8gKGUuZy4gRmFicmljIGFkZHJlc3NlcykKKworc3RhdGljIFBGQ19MT0dHRURJTl9QT1JUIENyZWF0ZUZjUG9ydCggCisJICBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhLCAKKwkgIFBGQ19MT0dHRURJTl9QT1JUIHBMYXN0TG9nZ2VkSW5Qb3J0LCAKKwkgIFRhY2hGQ0hEUl9HQ01ORCogZmNocywKKwkgIExPR0lOX1BBWUxPQUQqIHBsb2dpKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBOZXh0TG9nZ2VkSW5Qb3J0ID0gTlVMTDsKKyAgaW50IGk7CisKKworICBwcmludGsoImNwcWZjVFM6IE5ldyBGQyBwb3J0ICUwNlhoIFdXTjogIiwgZmNocy0+c19pZCk7CisgIGZvciggaT0zOyBpPj0wOyBpLS0pICAgLy8gY29weSB0aGUgTE9HSU4gcG9ydCdzIFdXTgorICAgIHByaW50aygiJTAyWCIsIHBsb2dpLT5wb3J0X25hbWVbaV0pOworICBmb3IoIGk9NzsgaT4zOyBpLS0pICAgLy8gY29weSB0aGUgTE9HSU4gcG9ydCdzIFdXTgorICAgIHByaW50aygiJTAyWCIsIHBsb2dpLT5wb3J0X25hbWVbaV0pOworCisKKyAgLy8gYWxsb2NhdGUgbWVtIGZvciBuZXcgcG9ydAorICAvLyAodGhlc2UgYXJlIHNtYWxsIGFuZCByYXJlIGFsbG9jYXRpb25zLi4uKQorICBwTmV4dExvZ2dlZEluUG9ydCA9IGttYWxsb2MoIHNpemVvZiggRkNfTE9HR0VESU5fUE9SVCksIEdGUF9BVE9NSUMgKTsKKworICAgIAorICAvLyBhbGxvY2F0aW9uIHN1Y2NlZWRlZD8gIEZpbGwgb3V0IE5FVyBQT1JUCisgIGlmKCBwTmV4dExvZ2dlZEluUG9ydCApCisgIHsgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgYW55IGdhcmJhZ2UgKHNvbWV0aW1lcyBleGlzdHMpCisgICAgbWVtc2V0KCBwTmV4dExvZ2dlZEluUG9ydCwgMCwgc2l6ZW9mKCBGQ19MT0dHRURJTl9QT1JUKSk7CisKKworICAgIC8vIElmIHdlIGxvZ2luIHRvIGEgRmFicmljLCB3ZSBkb24ndCB3YW50IHRvIHRyZWF0IGl0CisgICAgLy8gYXMgYSBTQ1NJIGRldmljZS4uLgorICAgIGlmKCAoZmNocy0+c19pZCAmIDB4RkZGMDAwKSAhPSAweEZGRjAwMCkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgLy8gY3JlYXRlIGEgdW5pcXVlICJ2aXJ0dWFsIiBTQ1NJIE5leHVzIChmb3Igbm93LCBqdXN0IGEKKyAgICAgIC8vIG5ldyB0YXJnZXQgSUQpIC0tIHdlIHdpbGwgdXBkYXRlIGNoYW5uZWwvdGFyZ2V0IG9uIFJFUE9SVF9MVU5TCisgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHZlcnkgZmlyc3QgU0NTSSB0YXJnZXQuLi4KKyAgICAgIGlmKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5tYXhfaWQgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgcE5leHRMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy50YXJnZXQgPSAwOworICAgICAgICBmY0NoaXAtPmZjUG9ydHMuU2NzaU5leHVzLnRhcmdldCA9IC0xOyAvLyBkb24ndCB1c2UgInN0dWIiCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBOZXh0TG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMudGFyZ2V0ID0KKyAgICAgICAgICBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5tYXhfaWQ7CisgICAgICB9CisKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIGx1bltdIE5leHVzIHN0cnVjdCBmb3IgbHVuIG1hc2tpbmcgICAgICAKKyAgICAgIGZvciggaT0wOyBpPCBDUFFGQ1RTX01BWF9MVU47IGkrKykKKyAgICAgICAgcE5leHRMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5baV0gPSAweEZGOyAvLyBpbml0IHRvIE5PVCBVU0VECisgICAgICAKKyAgICAgIHBOZXh0TG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuY2hhbm5lbCA9IDA7IC8vIGNwcWZjVFMgaGFzIDEgRkMgcG9ydAorICAgICAgCisgICAgICBwcmludGsoIiBTQ1NJIENoYW4vVHJndCAlZC8lZCIsIAorICAgICAgICAgIHBOZXh0TG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuY2hhbm5lbCwKKyAgICAgICAgICBwTmV4dExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLnRhcmdldCk7CisgCisgICAgICAvLyB0ZWxsIFNjc2kgbGF5ZXJzIGFib3V0IHRoZSBuZXcgdGFyZ2V0Li4uCisgICAgICBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5tYXhfaWQrKzsgCisvLyAgICBwcmludGsoIkhvc3RBZGFwdGVyLT5tYXhfaWQgPSAlZFxuIiwKKy8vICAgICAgY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+bWF4X2lkKTsJCSAgICAKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBlbHNlCisgICAgeworICAgICAgLy8gZGV2aWNlIGlzIE5PVCBTQ1NJIChpbiBjYXNlIG9mIEZhYnJpYykKKyAgICAgIHBOZXh0TG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMudGFyZ2V0ID0gLTE7ICAvLyBpbnZhbGlkCisgICAgfQorCisJICAvLyBjcmVhdGUgZm9yd2FyZCBsaW5rIHRvIG5ldyBwb3J0CisgICAgcExhc3RMb2dnZWRJblBvcnQtPnBOZXh0UG9ydCA9IHBOZXh0TG9nZ2VkSW5Qb3J0OworICAgIHByaW50aygiXG4iKTsKKworICB9ICAgICAKKyAgcmV0dXJuIHBOZXh0TG9nZ2VkSW5Qb3J0OyAgLy8gTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUKK30gICAvLyBlbmQgTkVXIFBPUlQgKFdXTikgbG9naWMKKworCisKKy8vIEZvciBjZXJ0YWluIGNhc2VzLCB3ZSB3YW50IHRvIHRlcm1pbmF0ZSBleGNoYW5nZXMgd2l0aG91dAorLy8gc2VuZGluZyBBQlRTIHRvIHRoZSBkZXZpY2UuICBFeGFtcGxlcyBpbmNsdWRlIHdoZW4gYW4gRkMKKy8vIGRldmljZSBjaGFuZ2VkIGl0J3MgcG9ydF9pZCBhZnRlciBMb29wIHJlLWluaXQsIG9yIHdoZW4KKy8vIHRoZSBkZXZpY2Ugc2VudCB1cyBhIGxvZ291dC4gIEluIHRoZSBjYXNlIG9mIGNoYW5nZWQgcG9ydF9pZCwKKy8vIHdlIHdhbnQgdG8gY29tcGxldGUgdGhlIGNvbW1hbmQgYW5kIHJldHVybiBTT0ZUX0VSUk9SIHRvCisvLyBmb3JjZSBhIHJlLXRyeS4gIEluIHRoZSBjYXNlIG9mIExPR091dCwgd2UgbWlnaHQgcmV0dXJuCisvLyBCQURfVEFSR0VUIGlmIHRoZSBkZXZpY2UgaXMgcmVhbGx5IGdvbmUuCisvLyBTaW5jZSB3ZSBtdXN0IGVuc3VyZSB0aGF0IFRhY2h5b24gaXMgbm90IG9wZXJhdGluZyBvbiB0aGUKKy8vIGV4Y2hhbmdlLCB3ZSBoYXZlIHRvIGZyZWV6ZSB0aGUgY2hpcAorLy8gc3Rlcm1pbmF0ZWV4Cit2b2lkIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggCisgIENQUUZDSEJBKiBjcHFmY0hCQWRhdGEsIFNDU0lfTkVYVVMgKlNjc2lOZXh1cywgaW50IFRlcm1pbmF0ZVN0YXR1cykKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyB4X0lEOworCisgIGlmKCBTY3NpTmV4dXMgKQorICB7CisvLyAgICBwcmludGsoIlRlcm1pbmF0ZUV4Y2hhbmdlOiBTY3NpTmV4dXMgY2hhbi90YXJnZXQgJWQvJWRcbiIsCisvLwkJICAgIFNjc2lOZXh1cy0+Y2hhbm5lbCwgU2NzaU5leHVzLT50YXJnZXQpOworCisgIH0gCisgIAorICBmb3IoIHhfSUQgPSAwOyB4X0lEIDwgVEFDSF9TRVNUX0xFTjsgeF9JRCsrKQorICB7CisgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS50eXBlICkgIC8vIGluIHVzZT8KKyAgICB7CisgICAgICBpZiggU2NzaU5leHVzID09IE5VTEwgKSAvLyBvdXIgSEJBIGNoYW5nZWQgLSB0ZXJtLiBhbGwKKyAgICAgIHsKKwlFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzID0gVGVybWluYXRlU3RhdHVzOworICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBCTFNfQUJUUywgJnhfSUQgKTsgCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJLy8gSWYgYSBkZXZpY2UsIGFjY29yZGluZyB0byBXV04sIGhhcyBiZWVuIHJlbW92ZWQsIGl0J3MKKwkvLyBwb3J0X2lkIG1heSBiZSB1c2VkIGJ5IGFub3RoZXIgd29ya2luZyBkZXZpY2UsIHNvIHdlCisJLy8gaGF2ZSB0byB0ZXJtaW5hdGUgYnkgU0NTSSB0YXJnZXQsIE5PVCBwb3J0X2lkLgorICAgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLkNtbmQpIC8vIENtbmQgaW4gcHJvZ3Jlc3M/CisJewkgICAgICAgICAgICAgICAgIAorCSAgaWYoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uQ21uZC0+ZGV2aWNlLT5pZCA9PSBTY3NpTmV4dXMtPnRhcmdldCkKKwkJCSYmCisgICAgICAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW3hfSURdLkNtbmQtPmRldmljZS0+Y2hhbm5lbCA9PSBTY3NpTmV4dXMtPmNoYW5uZWwpKSAKKyAgICAgICAgICB7CisgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uc3RhdHVzID0gVGVybWluYXRlU3RhdHVzOworICAgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgQkxTX0FCVFMsICZ4X0lEICk7IC8vIHRpbWVkLW91dAorICAgICAgICAgIH0KKwl9CisKKwkvLyAoaW4gY2FzZSB3ZSBldmVyIG5lZWQgaXQuLi4pCisJLy8gYWxsIFNFU1Qgc3RydWN0dXJlcyBoYXZlIGEgcmVtb3RlIG5vZGUgSUQgYXQgU0VTVCBEV09SRCAyCisgICAgICAgIC8vICAgICAgICAgIGlmKCAoZmNDaGlwLT5TRVNULT51WyB4X0lEIF0uVFdFLlJlbW90ZV9Ob2RlX0lEID4+IDgpCisgICAgICAgIC8vICAgICAgICAgICAgICAgID09ICBwb3J0X2lkKQorICAgICAgfSAKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBQcm9jZXNzRUxTX1JlcXVlc3QoIAorICAgICAgICAgICAgICBDUFFGQ0hCQSogY3BxZmNIQkFkYXRhLCBUYWNoRkNIRFJfR0NNTkQqIGZjaHMpCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKy8vICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworLy8gIFVMT05HIG94X2lkID0gKGZjaHMtPm94X3J4X2lkID4+MTYpOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0PU5VTEwsIHBMYXN0TG9nZ2VkSW5Qb3J0OworICBCT09MRUFOIE5lZWRSZWplY3QgPSBGQUxTRTsKKyAgVUxPTkcgbHNfcmVqZWN0X2NvZGUgPSAwOyAvLyBkZWZhdWx0IGRvbiduIGtub3c/PworCisKKyAgLy8gQ2hlY2sgdGhlIGluY29taW5nIGZyYW1lIGZvciBhIHN1cHBvcnRlZCBFTFMgdHlwZQorICBzd2l0Y2goIGZjaHMtPnBsWzBdICYgMHhGRkZGKQorICB7CisgIGNhc2UgMHgwMDUwOiAvLyAgUERJU0M/CisKKyAgICAvLyBQYXlsb2FkIGZvciBQTE9HSSBhbmQgUERJU0MgaXMgaWRlbnRpY2FsIChyZXF1ZXN0ICYgcmVwbHkpCisgICAgaWYoICF2ZXJpZnlfUExPR0koIGZjQ2hpcCwgZmNocywgJmxzX3JlamVjdF9jb2RlKSApIC8vIHZhbGlkIHBheWxvYWQ/CisgICAgeworICAgICAgTE9HSU5fUEFZTE9BRCBsb2dpOyAgICAgICAvLyBGQy1QSCBQb3J0IExvZ2luCisgICAgICAKKyAgICAgIC8vIFBESVNDIHBheWxvYWQgT0suIElmIGNyaXRpY2FsIGxvZ2luIGZpZWxkcworICAgICAgLy8gKGUuZy4gV1dOKSBtYXRjaGVzIGxhc3QgbG9naW4gZm9yIHRoaXMgcG9ydF9pZCwKKyAgICAgIC8vIHdlIG1heSByZXN1bWUgYW55IHByaW9yIGV4Y2hhbmdlcworICAgICAgLy8gd2l0aCB0aGUgb3RoZXIgcG9ydAorCisgICAgICAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZsb2dpLCBzaXplb2YobG9naSkpOworICAgCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgICBmY0NoaXAsIAorCSAgICAgTlVMTCwgICAgIC8vIGRvbid0IHNlYXJjaCBTY3NpIE5leHVzCisJICAgICAwLCAgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBwb3J0X2lkCisgICAgICAgICAgICAgJmxvZ2kucG9ydF9uYW1lWzBdLCAgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04KKyAgICAgICAgICAgICAmcExhc3RMb2dnZWRJblBvcnQpOyAgLy8gbXVzdCByZXR1cm4gbm9uLU5VTEw7IHdoZW4gYSBwb3J0X2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBmb3VuZCwgdGhpcyBwb2ludGVyIG1hcmtzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHNpbmdseSBsaW5rZWQgbGlzdAorICAgIAorICAgICAgaWYoIHBMb2dnZWRJblBvcnQgIT0gTlVMTCkgICAvLyBXV04gZm91bmQgKHByaW9yIGxvZ2luIE9LKQorICAgICAgeyAKKyAgICAgICAgICAgCisgCWlmKCAoZmNocy0+c19pZCAmIDB4RkZGRkZGKSA9PSBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkKQorCXsKKyAgICAgICAgICAvLyBZZXMuICBXZSB3ZXJlIGV4cGVjdGluZyBQRElTQz8KKyAgICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cGRpc2MgKQorCSAgeworCSAgICAvLyBZZXM7IHNldCBmaWVsZHMgYWNjb3JkaW5nbHkuICAgICAoUERJU0MsIG5vdCBPcmlnaW5hdG9yKQorICAgICAgICAgICAgU2V0TG9naW5GaWVsZHMoIHBMb2dnZWRJblBvcnQsIGZjaHMsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAKKyAgICAgICAgICAgIC8vIHNlbmQgJ0FDQycgcmVwbHkgCisgICAgICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTX1BMT0dJX0FDQywgLy8gKFBESVNDIHNhbWUgYXMgUExPR0kgQUNDKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmY2hzICk7CisKKwkgICAgLy8gT0sgdG8gcmVzdW1lIEkvTy4uLgorCSAgfQorCSAgZWxzZQorIAkgIHsKKwkgICAgcHJpbnRrKCJOb3QgZXhwZWN0aW5nIFBESVNDIChwZGlzYz1GQUxTRSlcbiIpOworCSAgICBOZWVkUmVqZWN0ID0gVFJVRTsKKwkgICAgLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICAgICAgICAgIGxzX3JlamVjdF9jb2RlID0gCisgICAgICAgICAgICAgIExTX1JKVF9SRUFTT04oIFBST1RPQ09MX0VSUk9SLCBJTklUSUFUT1JfQ1RMX0VSUk9SKTsKKwkgIH0KKwl9CisJZWxzZQorCXsKKwkgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkICE9IDApCisJICB7CisgIAkgICAgcHJpbnRrKCJQRElTQyBQb3J0SUQgY2hhbmdlOiBvbGQgJVhoLCBuZXcgJVhoXG4iLAorICAgICAgICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkLCBmY2hzLT5zX2lkICYweEZGRkZGRik7CisJICB9CisgICAgICAgICAgTmVlZFJlamVjdCA9IFRSVUU7CisgICAgICAgICAgLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICAgICAgICBsc19yZWplY3RfY29kZSA9IAorCSAgICBMU19SSlRfUkVBU09OKCBQUk9UT0NPTF9FUlJPUiwgSU5JVElBVE9SX0NUTF9FUlJPUik7CisJCSAgCisJfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCXByaW50aygiUERJU0MgUmVxdWVzdCBmcm9tIHVua25vd24gV1dOXG4iKTsKKyAgICAgICAgTmVlZFJlamVjdCA9IFRSVUU7CisgICAgICAgICAgCisJLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICAgICAgbHNfcmVqZWN0X2NvZGUgPSAKKyAgICAgICAgICBMU19SSlRfUkVBU09OKCBMT0dJQ0FMX0VSUk9SLCBJTlZBTElEX1BPUlRfTkFNRSk7CisgICAgICB9CisKKyAgICB9CisgICAgZWxzZSAvLyBQYXlsb2FkIHVuYWNjZXB0YWJsZQorICAgIHsKKyAgICAgIHByaW50aygicGF5bG9hZCB1bmFjY2VwdGFibGVcbiIpOworICAgICAgTmVlZFJlamVjdCA9IFRSVUU7ICAvLyByZWplY3QgY29kZSBhbHJlYWR5IHNldAorICAgICAgCisgICAgfQorCisgICAgaWYoIE5lZWRSZWplY3QpCisgICAgeworICAgICAgVUxPTkcgcG9ydF9pZDsKKyAgICAgIC8vIFRoZSBQRElTQyBmYWlsZWQuICBTZXQgbG9naW4gc3RydWN0IGZsYWdzIGFjY29yZGluZ2x5LAorICAgICAgLy8gdGVybWluYXRlIGFueSBJL08gdG8gdGhpcyBwb3J0LCBhbmQgUSBhIFBMT0dJCisgICAgICBpZiggcExvZ2dlZEluUG9ydCApCisgICAgICB7CisgICAgICAgIHBMb2dnZWRJblBvcnQtPnBkaXNjID0gRkFMU0U7CisgICAgICAgIHBMb2dnZWRJblBvcnQtPnBybGkgPSBGQUxTRTsKKyAgICAgICAgcExvZ2dlZEluUG9ydC0+cGxvZ2kgPSBGQUxTRTsKKwkKKyAgICAgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIAorICAgICAgICAgICZwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMsIFBPUlRJRF9DSEFOR0VEKTsKKwlwb3J0X2lkID0gcExvZ2dlZEluUG9ydC0+cG9ydF9pZDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlwb3J0X2lkID0gZmNocy0+c19pZCAmMHhGRkZGRkY7CisgICAgICB9CisgICAgICBmY2hzLT5yZXNlcnZlZCA9IGxzX3JlamVjdF9jb2RlOyAvLyBib3Jyb3cgdGhpcyAodW51c2VkKSBmaWVsZAorICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRUxTX1JKVCwgZmNocyApOworICAgIH0KKyAgIAorICAgIGJyZWFrOworCisKKworICBjYXNlIDB4MDAwMzogLy8gIFBMT0dJPworCisgICAgLy8gUGF5bG9hZCBmb3IgUExPR0kgYW5kIFBESVNDIGlzIGlkZW50aWNhbCAocmVxdWVzdCAmIHJlcGx5KQorICAgIGlmKCAhdmVyaWZ5X1BMT0dJKCBmY0NoaXAsIGZjaHMsICZsc19yZWplY3RfY29kZSkgKSAvLyB2YWxpZCBwYXlsb2FkPworICAgIHsKKyAgICAgIExPR0lOX1BBWUxPQUQgbG9naTsgICAgICAgLy8gRkMtUEggUG9ydCBMb2dpbgorICAgICAgQk9PTEVBTiBOZWVkUmVqZWN0ID0gRkFMU0U7CisgICAgICAKKyAgICAgIC8vIFBESVNDIHBheWxvYWQgT0suIElmIGNyaXRpY2FsIGxvZ2luIGZpZWxkcworICAgICAgLy8gKGUuZy4gV1dOKSBtYXRjaGVzIGxhc3QgbG9naW4gZm9yIHRoaXMgcG9ydF9pZCwKKyAgICAgIC8vIHdlIG1heSByZXN1bWUgYW55IHByaW9yIGV4Y2hhbmdlcworICAgICAgLy8gd2l0aCB0aGUgb3RoZXIgcG9ydAorCisgICAgICAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZsb2dpLCBzaXplb2YobG9naSkpOworICAgCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgICBmY0NoaXAsIAorCSAgICAgTlVMTCwgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIFNjc2kgTmV4dXMKKwkgICAgIDAsICAgICAgICAvLyBkb24ndCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIHBvcnRfaWQKKyAgICAgICAgICAgICAmbG9naS5wb3J0X25hbWVbMF0sICAgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFdXTgorICAgICAgICAgICAgICZwTGFzdExvZ2dlZEluUG9ydCk7ICAvLyBtdXN0IHJldHVybiBub24tTlVMTDsgd2hlbiBhIHBvcnRfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGZvdW5kLCB0aGlzIHBvaW50ZXIgbWFya3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0CisgICAgCisgICAgICBpZiggcExvZ2dlZEluUG9ydCA9PSBOVUxMKSAgIC8vIFdXTiBub3QgZm91bmQgLU5ldyBQb3J0CisgICAgICB7IAorICAgICAgCXBMb2dnZWRJblBvcnQgPSBDcmVhdGVGY1BvcnQoIAorCQkJICBjcHFmY0hCQWRhdGEsIAorCQkJICBwTGFzdExvZ2dlZEluUG9ydCwgCisJCQkgIGZjaHMsCisJCQkgICZsb2dpKTsKKyAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoIiBjcHFmY1RTOiBOZXcgcG9ydCBhbGxvY2F0aW9uIGZhaWxlZCAtIGxvc3QgRkMgZGV2aWNlIVxuIik7CisgICAgICAgICAgLy8gTm93IFEgYSBMT0dPdXQgUmVxdWVzdCwgc2luY2Ugd2Ugd29uJ3QgYmUgdGFsa2luZyB0byB0aGF0IGRldmljZQorCQorICAgICAgICAgIE5lZWRSZWplY3QgPSBUUlVFOyAgCisJICAKKyAgICAgICAgICAvLyBzZXQgcmVqZWN0IHJlYXNvbiBjb2RlIAorICAgICAgICAgIGxzX3JlamVjdF9jb2RlID0gCisgICAgICAgICAgICBMU19SSlRfUkVBU09OKCBMT0dJQ0FMX0VSUk9SLCBOT19MT0dJTl9SRVNPVVJDRVMpOworCSAgICAKKwl9CisgICAgICB9CisgICAgICBpZiggIU5lZWRSZWplY3QgKQorICAgICAgeworICAgICAgCisgICAgICAgIC8vIE9LIC0gd2UgaGF2ZSB2YWxpZCBmY1BvcnQgcHRyOyBzZXQgZmllbGRzIGFjY29yZGluZ2x5LiAgIAorCS8vICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgUERJU0MsIG5vdCBPcmlnaW5hdG9yKQorICAgICAgICBTZXRMb2dpbkZpZWxkcyggcExvZ2dlZEluUG9ydCwgZmNocywgRkFMU0UsIEZBTFNFKTsgCisKKyAgICAgICAgLy8gc2VuZCAnQUNDJyByZXBseSAKKyAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgRUxTX1BMT0dJX0FDQywgLy8gKFBESVNDIHNhbWUgYXMgUExPR0kgQUNDKQorICAgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvLyBQYXlsb2FkIHVuYWNjZXB0YWJsZQorICAgIHsKKyAgICAgIHByaW50aygicGF5bG9hZCB1bmFjY2VwdGFibGVcbiIpOworICAgICAgTmVlZFJlamVjdCA9IFRSVUU7ICAvLyByZWplY3QgY29kZSBhbHJlYWR5IHNldAorICAgIH0KKworICAgIGlmKCBOZWVkUmVqZWN0KQorICAgIHsKKyAgICAgIC8vIFRoZSBQRElTQyBmYWlsZWQuICBTZXQgbG9naW4gc3RydWN0IGZsYWdzIGFjY29yZGluZ2x5LAorICAgICAgLy8gdGVybWluYXRlIGFueSBJL08gdG8gdGhpcyBwb3J0LCBhbmQgUSBhIFBMT0dJCisgICAgICBwTG9nZ2VkSW5Qb3J0LT5wZGlzYyA9IEZBTFNFOworICAgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOworICAgICAgcExvZ2dlZEluUG9ydC0+cGxvZ2kgPSBGQUxTRTsKKwkKKyAgICAgIGZjaHMtPnJlc2VydmVkID0gbHNfcmVqZWN0X2NvZGU7IC8vIGJvcnJvdyB0aGlzICh1bnVzZWQpIGZpZWxkCisKKyAgICAgIC8vIHNlbmQgJ1JKVCcgcmVwbHkgCisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBFTFNfUkpULCBmY2hzICk7CisgICAgfQorICAgCisgICAgLy8gdGVybWluYXRlIGFueSBleGNoYW5nZXMgd2l0aCB0aGlzIGRldmljZS4uLgorICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkKKyAgICB7CisgICAgICBjcHFmY1RTVGVybWluYXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgCisgICAgICAgICZwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMsIFBPUlRJRF9DSEFOR0VEKTsKKyAgICB9CisgICAgYnJlYWs7CisKKworCisgIGNhc2UgMHgxMDIwOiAgLy8gUFJMST8KKyAgeworICAgIEJPT0xFQU4gTmVlZFJlamVjdCA9IFRSVUU7CisgICAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggCisgICAgICAgICAgIGZjQ2hpcCwgCisgICAgICAgICAgIE5VTEwsICAgICAgIC8vIGRvbid0IHNlYXJjaCBTY3NpIE5leHVzCisJICAgKGZjaHMtPnNfaWQgJiAweEZGRkZGRiksICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIHBvcnRfaWQKKyAgICAgICAgICAgTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgV1dOCisgICAgICAgICAgIE5VTEwpOyAgICAvLyBkb24ndCBjYXJlCisgICAgICAKKyAgICBpZiggcExvZ2dlZEluUG9ydCA9PSBOVUxMICkgCisgICAgeworICAgICAgLy8gaHVoPworICAgICAgcHJpbnRrKCIgVW5leHBlY3RlZCBQUkxJIFJlcXVlc3QgLW5vdCBsb2dnZWQgaW4hXG4iKTsKKworICAgICAgLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICAgIGxzX3JlamVjdF9jb2RlID0gTFNfUkpUX1JFQVNPTiggUFJPVE9DT0xfRVJST1IsIElOSVRJQVRPUl9DVExfRVJST1IpOworICAgICAgCisgICAgICAvLyBRIGEgTE9HT3V0IGhlcmU/CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyB2ZXJpZnkgdGhlIFBSTEkgQUNDIHBheWxvYWQKKyAgICAgIGlmKCAhdmVyaWZ5X1BSTEkoIGZjaHMsICZsc19yZWplY3RfY29kZSkgKQorICAgICAgeworICAgICAgICAvLyBQUkxJIFJlcGx5IGlzIGFjY2VwdGFibGU7IHdlcmUgd2UgZXhwZWN0aW5nIGl0PworICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cGxvZ2kgKSAKKyAgICAgICAgeyAKKyAgCSAgLy8geWVzLCB3ZSBleHBlY3RlZCB0aGUgUFJMSSBBQ0MgIChub3QgUERJU0M7IG5vdCBPcmlnaW5hdG9yKQorICAgICAgICAgIFNldExvZ2luRmllbGRzKCBwTG9nZ2VkSW5Qb3J0LCBmY2hzLCBGQUxTRSwgRkFMU0UpOworCisgICAgICAgICAgLy8gUSBhbiBBQ0NlcHQgUmVwbHkKKwkgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNfUFJMSV9BQ0MsIAorICAgICAgICAgICAgICAgICAgICAgICAgZmNocyApOyAgIAorCSAgCisJICBOZWVkUmVqZWN0ID0gRkFMU0U7CisJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBodWg/CisgICAgICAgICAgcHJpbnRrKCIgKHVuZXhwZWN0ZWQpIFBSTEkgUkVRRVNUIHdpdGggcGxvZ2kgRkFMU0VcbiIpOworCisgICAgICAgICAgLy8gc2V0IHJlamVjdCByZWFzb24gY29kZSAKKyAgICAgICAgICBsc19yZWplY3RfY29kZSA9IExTX1JKVF9SRUFTT04oIFBST1RPQ09MX0VSUk9SLCBJTklUSUFUT1JfQ1RMX0VSUk9SKTsKKyAgICAKKyAgICAJICAvLyBRIGEgTE9HT3V0IGhlcmU/CisJICAKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGsoIiBQUkxJIFJFUVVFU1QgcGF5bG9hZCBmYWlsZWQgdmVyaWZ5XG4iKTsKKyAgICAgICAgLy8gKHJlamVjdCBjb2RlIHNldCBieSAidmVyaWZ5IikKKworICAgICAgICAvLyBRIGEgTE9HT3V0IGhlcmU/CisgICAgICB9CisgICAgfQorCisgICAgaWYoIE5lZWRSZWplY3QgKQorICAgIHsKKyAgICAgIC8vIFEgYSBSZUplY1QgUmVwbHkgd2l0aCByZWFzb24gY29kZQorICAgICAgZmNocy0+cmVzZXJ2ZWQgPSBsc19yZWplY3RfY29kZTsKKyAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEVMU19SSlQsIC8vIFEgVHlwZQorICAgICAgICAgICAgICAgICAgICBmY2hzICk7ICAKKyAgICB9CisgIH0KKyAgICBicmVhazsKKyAKKworICAgIAorCisgIGNhc2UgIDB4MDAwNTogIC8vIExPR091dD8KKyAgeworICAvLyB3YXMgdGhpcyBMT0dPVVQgYmVjYXVzZSB3ZSBzZW50IGEgRUxTX1BESVNDIHRvIGFuIEZDIGRldmljZQorICAvLyB3aXRoIGNoYW5nZWQgKG9yIG5ldykgcG9ydF9pZCwgb3IgZG9lcyB0aGUgcG9ydCByZWZ1c2UgCisgIC8vIHRvIGNvbW11bmljYXRlIHRvIHVzPworICAvLyBXZSBtYWludGFpbiBhIGxvZ291dCBjb3VudGVyIC0gaWYgd2UgZ2V0IDMgY29uc2VjdXRpdmUgTE9HT3V0cywKKyAgLy8gZ2l2ZSB1cCEKKyAgICBMT0dPVVRfUEFZTE9BRCBsb2dvOworICAgIEJPT0xFQU4gR2l2ZVVwT25EZXZpY2UgPSBGQUxTRTsKKyAgICBVTE9ORyBsc19yZWplY3RfY29kZSA9IDA7CisgICAgCisgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmZmNocy0+cGxbMF0sIChVQ0hBUiopJmxvZ28sIHNpemVvZihsb2dvKSk7CisKKyAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgZmNDaGlwLCAKKyAgICAgICAgICAgTlVMTCwgICAgIC8vIGRvbid0IHNlYXJjaCBTY3NpIE5leHVzCisJICAgMCwgICAgICAgIC8vIGRvbid0IHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgcG9ydF9pZAorICAgICAgICAgICAmbG9nby5wb3J0X25hbWVbMF0sICAgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFdXTgorICAgICAgICAgICBOVUxMKTsgICAgLy8gZG9uJ3QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdAorICAgIAorICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gZm91bmQgdGhlIGRldmljZT8KKyAgICB7CisgICAgICAvLyBRIGFuIEFDQyByZXBseSAKKyAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEVMU19MT0dPX0FDQywgLy8gUSBUeXBlCisgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsgICAgICAgLy8gZGV2aWNlIHRvIHJlc3BvbmQgdG8KKworICAgICAgLy8gc2V0IGxvZ2luIHN0cnVjdCBmaWVsZHMgKExPR09fY291bnRlciBpbmNyZW1lbnQpCisgICAgICBTZXRMb2dpbkZpZWxkcyggcExvZ2dlZEluUG9ydCwgZmNocywgRkFMU0UsIEZBTFNFKTsKKyAgICAgIAorICAgICAgLy8gYXJlIHdlIGFuIEluaXRpYXRvcj8KKyAgICAgIGlmKCBmY0NoaXAtPk9wdGlvbnMuaW5pdGlhdG9yKSAgCisgICAgICB7CisgICAgICAgIC8vIHdlJ3JlIGFuIEluaXRpYXRvciwgc28gY2hlY2sgaWYgd2Ugc2hvdWxkIAorCS8vIHRyeSAoYW5vdGhlcj8pIGxvZ2luCisKKwkvLyBGYWJyaWNzIHJvdXRpbmVseSBsb2cgb3V0IGZyb20gdXMgYWZ0ZXIKKwkvLyBnZXR0aW5nIGRldmljZSBpbmZvIC0gZG9uJ3QgdHJ5IHRvIGxvZyB0aGVtCisJLy8gYmFjayBpbi4KKwlpZiggKGZjaHMtPnNfaWQgJiAweEZGRjAwMCkgPT0gMHhGRkYwMDAgKQorCXsKKwkgIDsgLy8gZG8gbm90aGluZworCX0KKwllbHNlIGlmKCBwTG9nZ2VkSW5Qb3J0LT5MT0dPX2NvdW50ZXIgPD0gMykKKwl7CisJICAvLyB0cnkgKGFub3RoZXIpIGxvZ2luIChQTE9HSSByZXF1ZXN0KQorCSAgCisgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgRUxTX1BMT0dJLCAvLyBRIFR5cGUKKyAgICAgICAgICAgICAgICAgICAgZmNocyApOyAgCisJCisJICAvLyBUZXJtaW5hdGUgSS9PIHdpdGggInJldHJ5IiBwb3RlbnRpYWwKKwkgIGNwcWZjVFNUZXJtaW5hdGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCAKKwkJCSAgICAgICAgICAgICZwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMsCisJCQkJICAgIFBPUlRJRF9DSEFOR0VEKTsKKwl9CisJZWxzZQorCXsKKwkgIHByaW50aygiIEdvdCAzIExPR091dHMgLSB0ZXJtaW5hdGluZyBjb21tLiB3aXRoIHBvcnRfaWQgJVhoXG4iLAorCQkJICBmY2hzLT5zX2lkICYmMHhGRkZGRkYpOworCSAgR2l2ZVVwT25EZXZpY2UgPSBUUlVFOworCX0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwlHaXZlVXBPbkRldmljZSA9IFRSVUU7CisgICAgICB9CisKKworICAgICAgaWYoIEdpdmVVcE9uRGV2aWNlID09IFRSVUUgKQorICAgICAgeworICAgICAgICBjcHFmY1RTVGVybWluYXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAmcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLAorCQkgICAgICAgICAgICAgICAgICBERVZJQ0VfUkVNT1ZFRCk7CisgICAgICB9CisgICAgfSAgCisgICAgZWxzZSAgLy8gd2UgZG9uJ3Qga25vdyB0aGlzIFdXTiEKKyAgICB7CisgICAgICAvLyBRIGEgUmVKZWNUIFJlcGx5IHdpdGggcmVhc29uIGNvZGUKKyAgICAgIGZjaHMtPnJlc2VydmVkID0gbHNfcmVqZWN0X2NvZGU7CisgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICBFTFNfUkpULCAvLyBRIFR5cGUKKyAgICAgICAgICAgICAgICAgICAgZmNocyApOyAgCisgICAgfQorICB9CisgICAgYnJlYWs7CisKKworCisKKyAgLy8gRkFCUklDIG9ubHkgY2FzZQorICBjYXNlIDB4MDQ2MTogIC8vIEVMUyBSU0NOIChSZWdpc3RlcmVkIFN0YXRlIENoYW5nZSBOb3RpZmljYXRpb24pPworICB7CisgICAgaW50IFBvcnRzOworICAgIGludCBpOworICAgIF9fdTMyIEJ1ZmY7CisgICAgLy8gVHlwaWNhbGx5LCBvbmUgb3IgbW9yZSBkZXZpY2VzIGhhdmUgYmVlbiBhZGRlZCB0byBvciBkcm9wcGVkCisgICAgLy8gZnJvbSB0aGUgRmFicmljLgorICAgIC8vIFRoZSBmb3JtYXQgb2YgdGhpcyBmcmFtZSBpcyBkZWZpbmVkIGluIEZDLUZMQSAoUmV2IDIuNywgQXVnIDE5OTcpCisgICAgLy8gVGhlIGZpcnN0IDMyLWJpdCB3b3JkIGhhcyBhIDItYnl0ZSBQYXlsb2FkIExlbmd0aCwgd2hpY2gKKyAgICAvLyBpbmNsdWRlcyB0aGUgNCBieXRlcyBvZiB0aGUgZmlyc3Qgd29yZC4gIENvbnNlcXVlbnRseSwKKyAgICAvLyB0aGlzIFBMIGxlbiBtdXN0IG5ldmVyIGJlIGxlc3MgdGhhbiA0LCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCwKKyAgICAvLyBhbmQgaGFzIGEgc3BlY2lmaWVkIG1heCB2YWx1ZSAyNTYuCisgICAgLy8gKEVuZGlhbmVzcyEpCisgICAgUG9ydHMgPSAoKGZjaHMtPnBsWzBdID4+MjQpIC0gNCkgLyA0OworICAgIFBvcnRzID0gUG9ydHMgPiA2MyA/IDYzIDogUG9ydHM7CisgICAgCisgICAgcHJpbnRrKCIgUlNDTiBwb3J0czogJWRcbiIsIFBvcnRzKTsKKyAgICBpZiggUG9ydHMgPD0gMCApICAvLyBodWg/CisgICAgeworICAgICAgLy8gUmVKZWNUIHRoZSBjb21tYW5kCisgICAgICBmY2hzLT5yZXNlcnZlZCA9IExTX1JKVF9SRUFTT04oIFVOQUJMRV9UT19QRVJGT1JNLCAwKTsKKyAgICAKKyAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEVMU19SSlQsIC8vIFEgVHlwZQorICAgICAgICAgICAgICAgICAgICBmY2hzICk7IAorICAgICAgCisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSAgLy8gQWNjZXB0IHRoZSBjb21tYW5kCisgICAgeworICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEVMU19BQ0MsIC8vIFEgVHlwZQorICAgICAgICAgICAgICAgICAgICBmY2hzICk7IAorICAgIH0KKyAgICAKKyAgICAgIC8vIENoZWNrIHRoZSAiYWRkcmVzcyBmb3JtYXQiIHRvIGRldGVybWluZSBhY3Rpb24uCisgICAgICAvLyBXZSBoYXZlIDMgY2FzZXM6CisgICAgICAvLyAwID0gUG9ydCBBZGRyZXNzOyAyNC1iaXQgYWRkcmVzcyBvZiBhZmZlY3RlZCBkZXZpY2UKKyAgICAgIC8vIDEgPSBBcmVhIEFkZHJlc3M7IE1TIDE2IGJpdHMgdmFsaWQKKyAgICAgIC8vIDIgPSBEb21haW4gQWRkcmVzczsgTVMgOCBiaXRzIHZhbGlkCisgICAgZm9yKCBpPTA7IGk8UG9ydHM7IGkrKykKKyAgICB7IAorICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmZmNocy0+cGxbaSsxXSwoVUNIQVIqKSZCdWZmLCA0KTsKKyAgICAgIHN3aXRjaCggQnVmZiAmIDB4RkYwMDAwMDApCisgICAgICB7CisKKyAgICAgIGNhc2UgMDogIC8vIFBvcnQgQWRkcmVzcz8KKwkKKyAgICAgIGNhc2UgMHgwMTAwMDAwMDogLy8gQXJlYSBEb21haW4/CisgICAgICBjYXNlIDB4MDIwMDAwMDA6IC8vIERvbWFpbiBBZGRyZXNzCisgICAgICAgIC8vIEZvciBleGFtcGxlLCAicG9ydF9pZCIgMHgyMDEzMDAgCisJLy8gT0ssIGxldCdzIHRyeSBhIE5hbWUgU2VydmljZSBSZXF1ZXN0IChRdWVyeSkKKyAgICAgIGZjaHMtPnNfaWQgPSAweEZGRkZGQzsgIC8vIE5hbWUgU2VydmVyIEFkZHJlc3MKKyAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEZDU19OU1IsIGZjaHMpOworCisgICAgICBicmVhazsKKwkKKwkKKyAgICAgIGRlZmF1bHQ6ICAvLyBodWg/IG5ldyB2YWx1ZSBvbiB2ZXJzaW9uIGNoYW5nZT8KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSAgICAKKyAgYnJlYWs7ICAgIAorCisKKworICAgIAorICBkZWZhdWx0OiAgLy8gZG9uJ3Qgc3VwcG9ydCB0aGlzIHJlcXVlc3QgKHlldCkKKyAgICAvLyBzZXQgcmVqZWN0IHJlYXNvbiBjb2RlIAorICAgIGZjaHMtPnJlc2VydmVkID0gTFNfUkpUX1JFQVNPTiggVU5BQkxFX1RPX1BFUkZPUk0sIAorCQkgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RfTk9UX1NVUFBPUlRFRCk7CisgICAgCisgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgRUxTX1JKVCwgLy8gUSBUeXBlCisgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsgICAgIAorICAgIGJyZWFrOyAgCisgIH0KK30KKworCitzdGF0aWMgdm9pZCBQcm9jZXNzRUxTX1JlcGx5KCAKKwkJQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwgVGFjaEZDSERSX0dDTU5EKiBmY2hzKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFVMT05HIG94X2lkID0gKGZjaHMtPm94X3J4X2lkID4+MTYpOworICBVTE9ORyBsc19yZWplY3RfY29kZTsKKyAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCwgcExhc3RMb2dnZWRJblBvcnQ7CisgIAorICAvLyBJZiB0aGlzIGlzIGEgdmFsaWQgcmVwbHksIHRoZW4gd2UgTVVTVCBoYXZlIHNlbnQgYSByZXF1ZXN0LgorICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gZmluZCBhIHZhbGlkIHJlcXVlc3QgT1hfSUQgY29ycmVzcG9uZGluZyB0bworICAvLyB0aGlzIHJlcGx5CisKKyAgCisgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbKGZjaHMtPm94X3J4X2lkID4+MTYpXS50eXBlID09IDApCisgIHsKKyAgICBwcmludGsoIiAqRGlzY2FyZGluZyBBQ0MvUkpUIGZyYW1lLCB4SUQgJTA0WC8lMDRYKiAiLCAKKwkJICAgIG94X2lkLCBmY2hzLT5veF9yeF9pZCAmIDB4ZmZmZik7CisgICAgZ290byBRdWl0OyAgLy8gZXhpdCB0aGlzIHJvdXRpbmUKKyAgfQorCisKKyAgLy8gSXMgdGhlIHJlcGx5IGEgUkpUIChyZWplY3QpPworICBpZiggKGZjaHMtPnBsWzBdICYgMHhGRkZGTCkgPT0gMHgwMSkgLy8gUmVqZWN0IHJlcGx5PworICB7CisvLyAgKioqKioqICBSRUpFQ1QgUkVQTFkgICoqKioqKioqCisgICAgc3dpdGNoKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2Vbb3hfaWRdLnR5cGUgKQorICAgIHsKKwkgIAorICAgIGNhc2UgRUxTX0ZESVNDOiAgLy8gd2Ugc2VudCBvdXQgRmFicmljIERpc2NvdmVyeQorICAgIGNhc2UgRUxTX0ZMT0dJOiAgLy8gd2Ugc2VudCBvdXQgRkxPR0kKKworICAgICAgcHJpbnRrKCJSSlQgcmVjZWl2ZWQgb24gRmFicmljIExvZ2luIGZyb20gJVhoLCByZWFzb24gJVhoXG4iLCAKKyAgICAgICAgZmNocy0+c19pZCwgZmNocy0+cGxbMV0pOyAgICAKKworICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgICB9CisgICAgICAKKyAgICBnb3RvIERvbmU7CisgIH0KKworICAvLyBPSywgd2UgaGF2ZSBhbiBBQ0NlcHQuLi4KKyAgLy8gV2hhdCdzIHRoZSBBQ0MgdHlwZT8gKGFjY29yZGluZyB0byB3aGF0IHdlIHNlbnQpCisgIHN3aXRjaCggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW294X2lkXS50eXBlICkKKyAgeworCSAgCisgIGNhc2UgRUxTX1BMT0dJOiAgLy8gd2Ugc2VudCBvdXQgUExPR0kKKyAgICBpZiggIXZlcmlmeV9QTE9HSSggZmNDaGlwLCBmY2hzLCAmbHNfcmVqZWN0X2NvZGUpICkKKyAgICB7CisgICAgICBMT0dJTl9QQVlMT0FEIGxvZ2k7ICAgICAgIC8vIEZDLVBIIFBvcnQgTG9naW4KKyAgICAgIAorICAgICAgLy8gbG9naW4gQUNDIHBheWxvYWQgYWNjZXB0YWJsZTsgc2VhcmNoIGZvciBXV04gaW4gb3VyIGxpc3QKKyAgICAgIC8vIG9mIGZjUG9ydHMKKyAgICAgIAorICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmZmNocy0+cGxbMF0sIChVQ0hBUiopJmxvZ2ksIHNpemVvZihsb2dpKSk7CisgICAKKyAgICAgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICAgICAgICAgICAgIGZjQ2hpcCwgCisJICAgICBOVUxMLCAgICAgLy8gZG9uJ3Qgc2VhcmNoIFNjc2kgTmV4dXMKKwkgICAgIDAsICAgICAgICAvLyBkb24ndCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIHBvcnRfaWQKKyAgICAgICAgICAgICAmbG9naS5wb3J0X25hbWVbMF0sICAgICAvLyBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFdXTgorICAgICAgICAgICAgICZwTGFzdExvZ2dlZEluUG9ydCk7ICAvLyBtdXN0IHJldHVybiBub24tTlVMTDsgd2hlbiBhIHBvcnRfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGZvdW5kLCB0aGlzIHBvaW50ZXIgbWFya3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0CisgICAgCisgICAgICBpZiggcExvZ2dlZEluUG9ydCA9PSBOVUxMKSAgICAgICAgIC8vIFdXTiBub3QgZm91bmQgLSBuZXcgcG9ydAorICAgICAgeworCisJcExvZ2dlZEluUG9ydCA9IENyZWF0ZUZjUG9ydCggCisJCQkgIGNwcWZjSEJBZGF0YSwgCisJCQkgIHBMYXN0TG9nZ2VkSW5Qb3J0LCAKKwkJCSAgZmNocywKKwkJCSAgJmxvZ2kpOworCisgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ID09IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKCIgY3BxZmNUUzogTmV3IHBvcnQgYWxsb2NhdGlvbiBmYWlsZWQgLSBsb3N0IEZDIGRldmljZSFcbiIpOworICAgICAgICAgIC8vIE5vdyBRIGEgTE9HT3V0IFJlcXVlc3QsIHNpbmNlIHdlIHdvbid0IGJlIHRhbGtpbmcgdG8gdGhhdCBkZXZpY2UKKwkKKyAgICAgICAgICBnb3RvIERvbmU7ICAvLyBleGl0IHdpdGggZXJyb3IhIGRyb3BwZWQgbG9naW4gZnJhbWUKKwl9CisgICAgICB9CisgICAgICBlbHNlICAgICAgLy8gV1dOIHdhcyBhbHJlYWR5IGtub3duLiAgRW5zdXJlIHRoYXQgYW55IG9wZW4KKwkgICAgICAgIC8vIGV4Y2hhbmdlcyBmb3IgdGhpcyBXV04gYXJlIHRlcm1pbmF0ZWQuCisgICAgICAJLy8gTk9URTogSXQncyBwb3NzaWJsZSB0aGF0IGEgZGV2aWNlIGNhbiBjaGFuZ2UgaXRzIAorCS8vIDI0LWJpdCBwb3J0X2lkIGFmdGVyIGEgTGluayBpbml0IG9yIEZhYnJpYyBjaGFuZ2UgCisJLy8gKGUuZy4gTElQIG9yIEZhYnJpYyBSU0NOKS4gIEluIHRoYXQgY2FzZSwgdGhlIG9sZAorCS8vIDI0LWJpdCBwb3J0X2lkIG1heSBiZSBkdXBsaWNhdGVkLCBvciBubyBsb25nZXIgZXhpc3QuCisgICAgICB7CisKKyAgICAgICAgY3BxZmNUU1Rlcm1pbmF0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEsIAorICAgICAgICAgICZwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMsIFBPUlRJRF9DSEFOR0VEKTsKKyAgICAgIH0KKworICAgICAgLy8gV2UgaGF2ZSBhbiBmY1BvcnQgc3RydWN0IC0gc2V0IGZpZWxkcyBhY2NvcmRpbmdseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IFBESVNDLCBvcmlnaW5hdG9yIAorICAgICAgU2V0TG9naW5GaWVsZHMoIHBMb2dnZWRJblBvcnQsIGZjaHMsIEZBTFNFLCBUUlVFKTsKKwkJCQorICAgICAgLy8gV2UganVzdCBzZXQgYSAicG9ydF9pZCI7IGlzIGl0IGR1cGxpY2F0ZWQ/CisgICAgICBUZXN0RHVwbGljYXRlUG9ydElkKCBjcHFmY0hCQWRhdGEsIHBMb2dnZWRJblBvcnQpOworCisgICAgICAvLyBGb3IgRmFicmljIG9wZXJhdGlvbiwgd2UgaXNzdWVkIFBMT0dJIHRvIDB4RkZGRkZDCisgICAgICAvLyBzbyB3ZSBjYW4gc2VuZCBTQ1IgKFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24pIAorICAgICAgLy8gQ2hlY2sgZm9yIHRoaXMgc3BlY2lhbCBjYXNlLi4uCisgICAgICBpZiggZmNocy0+c19pZCA9PSAweEZGRkZGQyApIAorICAgICAgeworICAgICAgICAvLyBQTE9HSSBBQ0Mgd2FzIGEgRmFicmljIHJlc3BvbnNlLi4uIGlzc3VlIFNDUgorCWZjaHMtPnNfaWQgPSAweEZGRkZGRDsgIC8vIGFkZHJlc3MgZm9yIFNDUgorICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBFTFNfU0NSLCBmY2hzKTsKKyAgICAgIH0KKworICAgICAgZWxzZQorICAgICAgeworICAgICAgLy8gTm93IHdlIG5lZWQgYSBQUkxJIHRvIGVuYWJsZSBGQ1AtU0NTSSBvcGVyYXRpb24KKyAgICAgIC8vIHNldCBmbGFncyBhbmQgUSB1cCBhIEVMU19QUkxJCisgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEVMU19QUkxJLCBmY2hzKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGxvZ2luIHBheWxvYWQgdW5hY2NlcHRhYmxlIC0gcmVhc29uIGluIGxzX3JlamVjdF9jb2RlCisgICAgICAvLyBRIHVwIGEgTG9nb3V0IFJlcXVlc3QKKyAgICAgIHByaW50aygiTG9naW4gUGF5bG9hZCB1bmFjY2VwdGFibGVcbiIpOworCisgICAgfQorICAgIGJyZWFrOworCisKKyAgLy8gUERJU0MgbG9naWMgdmVyeSBzaW1pbGFyIHRvIFBMT0dJLCBleGNlcHQgd2UgbmV2ZXIgd2FudAorICAvLyB0byBhbGxvY2F0ZSBtZW0gZm9yICJuZXciIHBvcnQsIGFuZCB3ZSBzZXQgZmxhZ3MgZGlmZmVyZW50bHkKKyAgLy8gKG1pZ2h0IGNvbWJpbmUgbGF0ZXIgd2l0aCBQTE9HSSBsb2dpYyBmb3IgZWZmaWNpZW5jeSkgIAorICBjYXNlIEVMU19QRElTQzogIC8vIHdlIHNlbnQgb3V0IFBESVNDCisgICAgaWYoICF2ZXJpZnlfUExPR0koIGZjQ2hpcCwgZmNocywgJmxzX3JlamVjdF9jb2RlKSApCisgICAgeworICAgICAgTE9HSU5fUEFZTE9BRCBsb2dpOyAgICAgICAvLyBGQy1QSCBQb3J0IExvZ2luCisgICAgICBCT09MRUFOIE5lZWRMb2dpbiA9IEZBTFNFOworICAgICAgCisgICAgICAvLyBsb2dpbiBwYXlsb2FkIGFjY2VwdGFibGU7IHNlYXJjaCBmb3IgV1dOIGluIG91ciBsaXN0CisgICAgICAvLyBvZiAocHJldmlvdXNseSBzZWVuKSBmY1BvcnRzCisgICAgICAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZsb2dpLCBzaXplb2YobG9naSkpOworICAgCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCAKKyAgICAgICAgICAgICBmY0NoaXAsIAorCSAgICAgTlVMTCwgICAgIC8vIGRvbid0IHNlYXJjaCBTY3NpIE5leHVzCisJICAgICAwLCAgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBwb3J0X2lkCisgICAgICAgICAgICAgJmxvZ2kucG9ydF9uYW1lWzBdLCAgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04KKyAgICAgICAgICAgICAmcExhc3RMb2dnZWRJblBvcnQpOyAgLy8gbXVzdCByZXR1cm4gbm9uLU5VTEw7IHdoZW4gYSBwb3J0X2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBmb3VuZCwgdGhpcyBwb2ludGVyIG1hcmtzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHNpbmdseSBsaW5rZWQgbGlzdAorICAgIAorICAgICAgaWYoIHBMb2dnZWRJblBvcnQgIT0gTlVMTCkgICAvLyBXV04gZm91bmQ/CisgICAgICB7CisgICAgICAgIC8vIFdXTiBoYXMgc2FtZSBwb3J0X2lkIGFzIGxhc3QgbG9naW4/ICAoT2YgY291cnNlLCBhIHByb3Blcmx5CisJLy8gd29ya2luZyBGQyBkZXZpY2Ugc2hvdWxkIE5FVkVSIEFDQ2VwdCBhIFBESVNDIGlmIGl0J3MKKwkvLyBwb3J0X2lkIGNoYW5nZWQsIGJ1dCBjaGVjayBqdXN0IGluIGNhc2UuLi4pCisJaWYoIChmY2hzLT5zX2lkICYgMHhGRkZGRkYpID09IHBMb2dnZWRJblBvcnQtPnBvcnRfaWQpCisJeworICAgICAgICAgIC8vIFllcy4gIFdlIHdlcmUgZXhwZWN0aW5nIFBESVNDPworICAgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wZGlzYyApCisJICB7CisgICAgICAgICAgICBpbnQgaTsKKwkgICAgCisJICAgIAorCSAgICAvLyBQRElTQyBleHBlY3RlZCAtLSBzZXQgZmllbGRzLiAgKFBESVNDLCBPcmlnaW5hdG9yKQorICAgICAgICAgICAgU2V0TG9naW5GaWVsZHMoIHBMb2dnZWRJblBvcnQsIGZjaHMsIFRSVUUsIFRSVUUpOworCisJICAgIC8vIFdlIGFyZSByZWFkeSB0byByZXN1bWUgRkNQLVNDU0kgdG8gdGhpcyBkZXZpY2UuLi4KKyAgICAgICAgICAgIC8vIERvIHdlIG5lZWQgdG8gc3RhcnQgYW55dGhpbmcgdGhhdCB3YXMgUXVldWVkPworCisgICAgICAgICAgICBmb3IoIGk9MDsgaTwgVEFDSF9TRVNUX0xFTjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBzZWUgaWYgYW55IGV4Y2hhbmdlIGZvciB0aGlzIFBESVNDJ2QgcG9ydCB3YXMgcXVldWVkCisgICAgICAgICAgICAgIGlmKCAoKGZjaHMtPnNfaWQgJjB4RkZGRkZGKSA9PSAKKyAgICAgICAgICAgICAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLmZjaHMuZF9pZCAmIDB4RkZGRkZGKSkKKyAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5zdGF0dXMgJiBFWENIQU5HRV9RVUVVRUQpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmNocy0+cmVzZXJ2ZWQgPSBpOyAvLyBjb3B5IEV4Y2hhbmdlSUQKKy8vICAgICAgICAgICAgICAgIHByaW50aygiICpRIHhfSUQgJVhoIGFmdGVyIFBESVNDKiAiLGkpOworCisgICAgICAgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRVhDSEFOR0VfUVVFVUVELCBmY2hzICk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCSAgICAvLyBDb21wbGV0ZSBjb21tYW5kcyBRJ2Qgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIGZvciBMb2dpbgorCisJICAgIFVuYmxvY2tTY3NpRGV2aWNlKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLCBwTG9nZ2VkSW5Qb3J0KTsKKwkgIH0KKwkgIGVsc2UKKwkgIHsKKwkgICAgcHJpbnRrKCJOb3QgZXhwZWN0aW5nIFBESVNDIChwZGlzYz1GQUxTRSlcbiIpOworCSAgICBOZWVkTG9naW4gPSBUUlVFOworCSAgfQorCX0KKwllbHNlCisJeworCSAgcHJpbnRrKCJQRElTQyBQb3J0SUQgY2hhbmdlOiBvbGQgJVhoLCBuZXcgJVhoXG4iLAorICAgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCwgZmNocy0+c19pZCAmMHhGRkZGRkYpOworICAgICAgICAgIE5lZWRMb2dpbiA9IFRSVUU7CisJCSAgCisJfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCXByaW50aygiUERJU0MgQUNDIGZyb20gdW5rbm93biBXV05cbiIpOworICAgICAgICBOZWVkTG9naW4gPSBUUlVFOworICAgICAgfQorCisgICAgICBpZiggTmVlZExvZ2luKQorICAgICAgeworCQorICAgICAgICAvLyBUaGUgUERJU0MgZmFpbGVkLiAgU2V0IGxvZ2luIHN0cnVjdCBmbGFncyBhY2NvcmRpbmdseSwKKwkvLyB0ZXJtaW5hdGUgYW55IEkvTyB0byB0aGlzIHBvcnQsIGFuZCBRIGEgUExPR0kKKwlpZiggcExvZ2dlZEluUG9ydCApICAvLyBGQyBkZXZpY2UgcHJldmlvdXNseSBrbm93bj8KKwl7CisKKyAgICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLAorICAgICAgICAgICAgICAgICAgICBFTFNfTE9HTywgLy8gUSBUeXBlCisgICAgICAgICAgICAgICAgICAgIGZjaHMgKTsgICAvLyBoYXMgcG9ydF9pZCB0byBzZW5kIHRvIAorCisJICAvLyBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGVycm9yIHNjZW5hcmlvcyB3aGljaCBjYW4gcmVzdWx0CisgIAkgIC8vIGluIFBESVNDIGZhaWx1cmUsIHNvIGFzIGEgY2F0Y2hhbGwsIGFkZCB0aGUgY2hlY2sgZm9yCisJICAvLyBkdXBsaWNhdGUgcG9ydF9pZC4KKwkgIFRlc3REdXBsaWNhdGVQb3J0SWQoIGNwcWZjSEJBZGF0YSwgcExvZ2dlZEluUG9ydCk7CisKKy8vICAgIFRyaWdnZXJIQkEoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSwgMCk7CisgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cGRpc2MgPSBGQUxTRTsKKyAgICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wcmxpID0gRkFMU0U7CisgICAgICAgICAgcExvZ2dlZEluUG9ydC0+cGxvZ2kgPSBGQUxTRTsKKwkKKyAgICAgICAgICBjcHFmY1RTVGVybWluYXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgCisJICAgICZwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMsIFBPUlRJRF9DSEFOR0VEKTsKKyAgICAgICAgfQorICAgICAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBFTFNfUExPR0ksIGZjaHMgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGxvZ2luIHBheWxvYWQgdW5hY2NlcHRhYmxlIC0gcmVhc29uIGluIGxzX3JlamVjdF9jb2RlCisgICAgICAvLyBRIHVwIGEgTG9nb3V0IFJlcXVlc3QKKyAgICAgIHByaW50aygiRVJST1I6IExvZ2luIFBheWxvYWQgdW5hY2NlcHRhYmxlIVxuIik7CisKKyAgICB9CisgICAKKyAgICBicmVhazsKKyAgICAKKworCisgIGNhc2UgRUxTX1BSTEk6ICAvLyB3ZSBzZW50IG91dCBQUkxJCisKKworICAgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICAgICAgICAgICBmY0NoaXAsIAorICAgICAgICAgICBOVUxMLCAgICAgICAvLyBkb24ndCBzZWFyY2ggU2NzaSBOZXh1cworCSAgIChmY2hzLT5zX2lkICYgMHhGRkZGRkYpLCAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBwb3J0X2lkCisgICAgICAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIFdXTgorICAgICAgICAgICBOVUxMKTsgICAgLy8gZG9uJ3QgY2FyZQorICAgICAgCisgICAgaWYoIHBMb2dnZWRJblBvcnQgPT0gTlVMTCApIAorICAgIHsKKyAgICAgIC8vIGh1aD8KKyAgICAgIHByaW50aygiIFVuZXhwZWN0ZWQgUFJMSSBBQ0NlcHQgZnJhbWUhXG4iKTsKKworICAgICAgLy8gUSBhIExPR091dCBoZXJlPworCisgICAgICBnb3RvIERvbmU7CisgICAgfQorCisgICAgLy8gdmVyaWZ5IHRoZSBQUkxJIEFDQyBwYXlsb2FkCisgICAgaWYoICF2ZXJpZnlfUFJMSSggZmNocywgJmxzX3JlamVjdF9jb2RlKSApCisgICAgeworICAgICAgLy8gUFJMSSBSZXBseSBpcyBhY2NlcHRhYmxlOyB3ZXJlIHdlIGV4cGVjdGluZyBpdD8KKyAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wbG9naSApIAorICAgICAgeyAKKwkvLyB5ZXMsIHdlIGV4cGVjdGVkIHRoZSBQUkxJIEFDQyAgKG5vdCBQRElTQzsgT3JpZ2luYXRvcikKKwlTZXRMb2dpbkZpZWxkcyggcExvZ2dlZEluUG9ydCwgZmNocywgRkFMU0UsIFRSVUUpOworCisgICAgICAgIC8vIE9LLCBsZXQncyBzZW5kIGEgUkVQT1JUX0xVTlMgY29tbWFuZCB0byBkZXRlcm1pbmUKKwkvLyB3aGV0aGVyIFZTQSBvciBQREEgRkNQLUxVTiBhZGRyZXNzaW5nIGlzIHVzZWQuCisJCisgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIFNDU0lfUkVQT1JUX0xVTlMsIGZjaHMgKTsKKwkKKwkvLyBJdCdzIHBvc3NpYmxlIHRoYXQgYSBkZXZpY2Ugd2Ugd2VyZSB0YWxraW5nIHRvIGNoYW5nZWQgCisJLy8gcG9ydF9pZCwgYW5kIGhhcyBsb2dnZWQgYmFjayBpbi4gIFRoaXMgZnVuY3Rpb24gZW5zdXJlcworCS8vIHRoYXQgSS9PIHdpbGwgcmVzdW1lLgorICAgICAgICBVbmJsb2NrU2NzaURldmljZSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlciwgcExvZ2dlZEluUG9ydCk7CisKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gaHVoPworICAgICAgICBwcmludGsoIiAodW5leHBlY3RlZCkgUFJMSSBBQ0NlcHQgd2l0aCBwbG9naSBGQUxTRVxuIik7CisKKyAgICAgICAgLy8gUSBhIExPR091dCBoZXJlPworICAgICAgICBnb3RvIERvbmU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmludGsoIiBQUkxJIEFDQ2VwdCBwYXlsb2FkIGZhaWxlZCB2ZXJpZnlcbiIpOworCisgICAgICAvLyBRIGEgTE9HT3V0IGhlcmU/CisgICAgfQorCisgICAgYnJlYWs7CisgCisgIGNhc2UgRUxTX0ZMT0dJOiAgLy8gd2Ugc2VudCBvdXQgRkxPR0kgKEZhYnJpYyBMb2dpbikKKworICAgIC8vIHVwZGF0ZSB0aGUgdXBwZXIgMTYgYml0cyBvZiBvdXIgcG9ydF9pZCBpbiBUYWNoeW9uCisgICAgLy8gdGhlIHN3aXRjaCBhZGRzIHRob3NlIHVwcGVyIDE2IGJpdHMgd2hlbiByZXNwb25kaW5nCisgICAgLy8gdG8gdXMgKGkuZS4gd2UgYXJlIHRoZSBkZXN0aW5hdGlvbl9pZCkKKyAgICBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSA9IChmY2hzLT5kX2lkICYgMHhGRkZGRkYpOworICAgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGEsICAKKyAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSArIFRMX01FTV9UQUNIX015X0lEKTsKKworICAgIC8vIG5vdyBzZW5kIG91dCBhIFBMT0dJIHRvIHRoZSB3ZWxsIGtub3duIHBvcnRfaWQgMHhGRkZGRkMKKyAgICBmY2hzLT5zX2lkID0gMHhGRkZGRkM7CisgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgRUxTX1BMT0dJLCBmY2hzKTsKKyAgCisgICBicmVhazsgCisKKworICBjYXNlIEVMU19GRElTQzogIC8vIHdlIHNlbnQgb3V0IEZESVNDIChGYWJyaWMgRGlzY292ZXJ5IChMb2dpbikpCisKKyAgIHByaW50ayggIiBFTFNfRkRJU0Mgc3VjY2VzcyAiKTsKKyAgIGJyZWFrOworICAgCisKKyAgY2FzZSBFTFNfU0NSOiAgLy8gd2Ugc2VudCBvdXQgU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbgorICAgIC8vIG5vdyB3ZSBjYW4gaXNzdWUgTmFtZSBTZXJ2aWNlIFJlcXVlc3QgdG8gZmluZCBhbnkKKyAgICAvLyBGYWJyaWMtY29ubmVjdGVkIGRldmljZXMgd2UgbWlnaHQgd2FudCB0byBsb2dpbiB0by4KKyAgIAorCQorICAgIGZjaHMtPnNfaWQgPSAweEZGRkZGQzsgIC8vIE5hbWUgU2VydmVyIEFkZHJlc3MKKyAgICBjcHFmY1RTUHV0TGlua1F1ZSggY3BxZmNIQkFkYXRhLCBGQ1NfTlNSLCBmY2hzKTsKKyAgICAKKworICAgIGJyZWFrOworCisgICAgCisgIGRlZmF1bHQ6CisgICAgcHJpbnRrKCIgKkRpc2NhcmRpbmcgdW5rbm93biBBQ0MgZnJhbWUsIHhJRCAlMDRYLyUwNFgqICIsIAorICAgCQkgICAgb3hfaWQsIGZjaHMtPm94X3J4X2lkICYgMHhmZmZmKTsKKyAgICBicmVhazsKKyAgfQorCisgIAorRG9uZToKKyAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBSZXBseSBpcyB2YWxpZCBvciBub3QsIHRoZQorICAvLyB0aGUgZXhjaGFuZ2UgaXMgZG9uZSAtIGNvbXBsZXRlCisgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIChmY2hzLT5veF9yeF9pZCA+PjE2KSk7IAorCSAgCitRdWl0OiAgICAKKyAgcmV0dXJuOworfQorCisKKworCisKKworLy8gKioqKioqKioqKioqKioqKiAgRmlicmUgQ2hhbm5lbCBTZXJ2aWNlcyAgKioqKioqKioqKioqKioKKy8vIFRoaXMgaXMgd2hlcmUgd2UgcHJvY2VzcyB0aGUgRGlyZWN0b3J5IChOYW1lKSBTZXJ2aWNlIFJlcGx5CisvLyB0byBrbm93IHdoaWNoIGRldmljZXMgYXJlIG9uIHRoZSBGYWJyaWMKKworc3RhdGljIHZvaWQgUHJvY2Vzc0ZDU19SZXBseSggCisJQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwgVGFjaEZDSERSX0dDTU5EKiBmY2hzKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFVMT05HIG94X2lkID0gKGZjaHMtPm94X3J4X2lkID4+MTYpOworLy8gIFVMT05HIGxzX3JlamVjdF9jb2RlOworLy8gIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQsIHBMYXN0TG9nZ2VkSW5Qb3J0OworICAKKyAgLy8gSWYgdGhpcyBpcyBhIHZhbGlkIHJlcGx5LCB0aGVuIHdlIE1VU1QgaGF2ZSBzZW50IGEgcmVxdWVzdC4KKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIGZpbmQgYSB2YWxpZCByZXF1ZXN0IE9YX0lEIGNvcnJlc3BvbmRpbmcgdG8KKyAgLy8gdGhpcyByZXBseQorCisgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbKGZjaHMtPm94X3J4X2lkID4+MTYpXS50eXBlID09IDApCisgIHsKKyAgICBwcmludGsoIiAqRGlzY2FyZGluZyBSZXBseSBmcmFtZSwgeElEICUwNFgvJTA0WCogIiwgCisJCSAgICBveF9pZCwgZmNocy0+b3hfcnhfaWQgJiAweGZmZmYpOworICAgIGdvdG8gUXVpdDsgIC8vIGV4aXQgdGhpcyByb3V0aW5lCisgIH0KKworCisgIC8vIE9LLCB3ZSB3ZXJlIGV4cGVjdGluZyBpdC4gIE5vdyBjaGVjayB0byBzZWUgaWYgaXQncyBhCisgIC8vICJOYW1lIFNlcnZpY2UiIFJlcGx5LCBhbmQgaWYgc28gZm9yY2UgYSByZS12YWxpZGF0aW9uIG9mCisgIC8vIEZhYnJpYyBkZXZpY2UgbG9naW5zIChpLmUuIFN0YXJ0IHRoZSBsb2dpbiB0aW1lb3V0IGFuZAorICAvLyBzZW5kIFBESVNDIG9yIFBMT0dJKQorICAvLyAoRW5kaWFuZXNzIEJ5dGUgU3dhcD8pCisgIGlmKCBmY2hzLT5wbFsxXSA9PSAweDAyRkMgKSAgLy8gTmFtZSBTZXJ2aWNlCisgIHsKKyAgICAvLyBnb3QgYSBuZXcgKG9yIE5VTEwpIGxpc3Qgb2YgRmFicmljIGF0dGFjaCBkZXZpY2VzLi4uIAorICAgIC8vIEludmFsaWRhdGUgY3VycmVudCBsb2dpbnMKKyAgICAKKyAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0ID0gJmZjQ2hpcC0+ZmNQb3J0czsKKyAgICB3aGlsZSggcExvZ2dlZEluUG9ydCApIC8vIGZvciBhbGwgcG9ydHMgd2hpY2ggYXJlIGV4cGVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgYWZ0ZXIgdGhlIG5leHQgTElQLCBzZXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2dvdXRUaW1lcgorICAgIHsKKworICAgICAgaWYoIChwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkICYgMHhGRkZGMDApICAvLyBGYWJyaWMgZGV2aWNlPworCQkgICAgICAmJgorICAgICAgICAgIChwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkICE9IDB4RkZGRkZDKSApIC8vIE5PVCB0aGUgRl9Qb3J0CisgICAgICB7CisgICAgICAgIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgPSA2OyAgLy8gd2hhdCdzIHRoZSBGYWJyaWMgdGltZW91dD8/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgYW55IEkvTyBpbiBwcm9ncmVzcyB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQRElTQyByZWNlaXZlZC4uLgorICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5wcmxpID0gRkFMU0U7ICAgLy8gYmxvY2sgRkNQLVNDU0kgY29tbWFuZHMKKyAgICAgIH0KKwkgICAgCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gcExvZ2dlZEluUG9ydC0+cE5leHRQb3J0OworICAgIH0KKyAgICAKKyAgICBpZiggZmNocy0+cGxbMl0gPT0gMHgwMjgwKSAgLy8gQUNDZXB0PworICAgIHsKKyAgICAgIC8vIFNlbmQgUExPR0kgb3IgUERJU0MgdG8gdGhlc2UgRmFicmljIGRldmljZXMKKyAgICAgIFNlbmRMb2dpbnMoIGNwcWZjSEJBZGF0YSwgJmZjaHMtPnBsWzRdICk7ICAKKyAgICB9CisKKworICAgIC8vIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgcmVhc29uIHRvIHJlamVjdCBpcyBiZWNhdXNlIE5PCisgICAgLy8gZGV2aWNlcyBhcmUgbGVmdCBvbiB0aGUgRmFicmljLiAgV2UgYWxyZWFkeSBzdGFydGVkCisgICAgLy8gImxvZ2dlZCBvdXQiIHRpbWVyczsgaWYgdGhlIGRldmljZShzKSBkb24ndCBjb21lCisgICAgLy8gYmFjaywgd2UnbGwgZG8gdGhlIGltcGxpY2l0IGxvZ291dCBpbiB0aGUgaGVhcnQgYmVhdCAKKyAgICAvLyB0aW1lciByb3V0aW5lCisgICAgZWxzZSAgLy8gUmVKZWNUCisgICAgeworICAgICAgLy8gdGhpcyBqdXN0IG1lYW5zIG5vIEZhYnJpYyBkZXZpY2UgaXMgdmlzaWJsZSBhdCB0aGlzIGluc3RhbnQKKyAgICB9IAorICB9CisKKyAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBSZXBseSBpcyB2YWxpZCBvciBub3QsIHRoZQorICAvLyB0aGUgZXhjaGFuZ2UgaXMgZG9uZSAtIGNvbXBsZXRlCisgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIChmY2hzLT5veF9yeF9pZCA+PjE2KSk7CisJICAKK1F1aXQ6ICAgIAorICByZXR1cm47Cit9CisKKworCisKKworCisKK3N0YXRpYyB2b2lkIEFuYWx5emVJbmNvbWluZ0ZyYW1lKCAKKyAgICAgICAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwKKyAgICAgICAgVUxPTkcgUU5keCApCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgUEZDX0xJTktfUVVFIGZjTFEgPSBjcHFmY0hCQWRhdGEtPmZjTFE7CisgIFRhY2hGQ0hEUl9HQ01ORCogZmNocyA9IAorICAgIChUYWNoRkNIRFJfR0NNTkQqKWZjTFEtPlFpdGVtW1FOZHhdLnVsQnVmZjsKKy8vICBVTE9ORyBsc19yZWplY3RfY29kZTsgIC8vIHJlYXNvbiBmb3IgcmVqZWN0aW5nIGxvZ2luCisgIExPTkcgRXhjaGFuZ2VJRDsKKy8vICBGQ19MT0dHRURJTl9QT1JUICpwTG9nZ2VkSW5Qb3J0OworICBCT09MRUFOIEFib3J0QWNjZXB0OyAgCisKKyAgRU5URVIoIkFuYWx5emVJbmNvbWluZ0ZyYW1lIik7CisKKworCisgIHN3aXRjaCggZmNMUS0+UWl0ZW1bUU5keF0uVHlwZSkgLy8gRkNQIG9yIFVua25vd24KKyAgeworCisgIGNhc2UgU0ZRX1VOS05PV046ICAvLyB1bmtub3duIGZyYW1lIChlLmcuIExJUCBwb3NpdGlvbiBmcmFtZSwgTk9QLCBldGMuKQorIAorCisgICAgICAvLyAqKioqKioqKiogIEZDLTQgRGV2aWNlIERhdGEvIEZpYnJlIENoYW5uZWwgU2VydmljZSAqKioqKioqKioqKioqCisgICAgaWYoICgoZmNocy0+ZF9pZCAmMHhGMDAwMDAwMCkgPT0gMCkgICAvLyBSX0NUTCAodXBwZXIgbmliYmxlKSAweDA/CisgICAgICAgICAgICAgICAgJiYgICAKKyAgICAgIChmY2hzLT5mX2N0bCAmIDB4MjAwMDAwMDApICkgIC8vIFRZUEUgMjBoIGlzIEZpYnJlIENoYW5uZWwgU2VydmljZQorICAgIHsKKworICAgICAgLy8gKioqKioqKioqKioqKiogRkNTIFJlcGx5ICoqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgaWYoIChmY2hzLT5kX2lkICYgMHhmZjAwMDAwMEwpID09IDB4MDMwMDAwMDBMKSAgLy8gKDMxOjIzIFJfQ1RMKQorICAgICAgeworCVByb2Nlc3NGQ1NfUmVwbHkoIGNwcWZjSEJBZGF0YSwgZmNocyApOworCisgICAgICB9ICAvLyBlbmQgb2YgIEZDUyBsb2dpYworCisgICAgfQorICAgIAorCisgICAgICAvLyAqKioqKioqKioqKiAgRXh0ZW5kZWQgTGluayBTZXJ2aWNlICoqKioqKioqKioqKioqCisKKyAgICBlbHNlIGlmKCBmY2hzLT5kX2lkICYgMHgyMDAwMDAwMCAgIC8vIFJfQ1RMIDB4Mj8KKyAgICAgICAgICAgICAgICAgICYmICAgCisgICAgICAoZmNocy0+Zl9jdGwgJiAweDAxMDAwMDAwKSApICAvLyBUWVBFID0gMQorICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgZnJhbWVzIGFyZSBlaXRoZXIgYSByZXNwb25zZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIHdlIHNlbnQgKDB4MjMpIG9yICJ1bnNvbGljaXRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyAoMHgyMikuCisKKworICAgICAgLy8gKioqKioqKioqKioqKipFeHRlbmRlZCBMaW5rIFJFUExZICoqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJfQ1RMIFNvbGljaXRlZCBDb250cm9sIFJlcGx5CisKKyAgICAgIGlmKCAoZmNocy0+ZF9pZCAmIDB4ZmYwMDAwMDBMKSA9PSAweDIzMDAwMDAwTCkgIC8vICgzMToyMyBSX0NUTCkKKyAgICAgIHsKKworCVByb2Nlc3NFTFNfUmVwbHkoIGNwcWZjSEJBZGF0YSwgZmNocyApOworCisgICAgICB9ICAvLyBlbmQgb2YgICJSX0NUTCBTb2xpY2l0ZWQgQ29udHJvbCBSZXBseSIKKworCisKKworICAgICAgIC8vICoqKioqKioqKioqKioqRXh0ZW5kZWQgTGluayBSRVFVRVNUICoqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAvLyAodW5zb2xpY2l0ZWQgY29tbWFuZHMgZnJvbSBhbm90aGVyIHBvcnQgb3IgdGFzay4uLikKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUl9DVEwgRXh0IExpbmsgUkVRVUVTVAorICAgICAgZWxzZSBpZiggKGZjaHMtPmRfaWQgJiAweGZmMDAwMDAwTCkgPT0gMHgyMjAwMDAwMEwgJiYKKyAgICAgICAgICAgICAgKGZjaHMtPm94X3J4X2lkICE9IDB4RkZGRkZGRkZMKSApIC8vIChpZ25vcmUgTElQIGZyYW1lKQorICAgICAgeworCisKKworCVByb2Nlc3NFTFNfUmVxdWVzdCggY3BxZmNIQkFkYXRhLCBmY2hzICk7CisKKyAgICAgIH0KKworCisKKyAgICAgICAgLy8gKioqKioqKioqKioqKiogTElMUCAqKioqKioqKioqKioqKioqKioqKioqCisgICAgICBlbHNlIGlmKCAoZmNocy0+ZF9pZCAmIDB4ZmYwMDAwMDBMKSA9PSAweDIyMDAwMDAwTCAmJgorICAgICAgICAgICAgICAgKGZjaHMtPm94X3J4X2lkID09IDB4RkZGRkZGRkZMKSkgLy8gKGUuZy4sIExJUCBmcmFtZXMpCisKKyAgICAgIHsKKyAgICAgICAgLy8gU0FOTWFyayBzcGVjaWZpZXMgdGhhdCB3aGVuIGF2YWlsYWJsZSwgd2UgbXVzdCB1c2UKKwkvLyB0aGUgTElMUCBmcmFtZSB0byBkZXRlcm1pbmUgd2hpY2ggQUxQQXMgdG8gc2VuZCBQb3J0IERpc2NvdmVyeQorCS8vIHRvLi4uCisKKyAgICAgICAgaWYoIGZjaHMtPnBsWzBdID09IDB4MDcxMUwpIC8vICBFTFNfUExPR0k/CisJeworLy8JICBVQ0hBUiAqcHRyID0gKFVDSEFSKikmZmNocy0+cGxbMV07CisvLwkgIHByaW50aygiICVkIEFMUEFzIGZvdW5kXG4iLCAqcHRyKTsKKwkgIG1lbWNweSggZmNDaGlwLT5MSUxQbWFwLCAmZmNocy0+cGxbMV0sIDMyKjQpOyAvLyAzMiBEV09SRHMKKwkgIGZjQ2hpcC0+T3B0aW9ucy5MSUxQaW4gPSAxOyAvLyBvdXIgTElMUG1hcCBpcyB2YWxpZCEKKwkgIC8vIG5vdyBwb3N0IHRvIG1ha2UgUG9ydCBEaXNjb3ZlcnkgaGFwcGVuLi4uCisgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwgTElOS0FDVElWRSwgZmNocyk7ICAKKwl9CisgICAgICB9CisgICAgfQorCisgICAgIAorICAgIC8vICoqKioqKioqKioqKioqKioqICBCQVNJQyBMSU5LIFNFUlZJQ0UgKioqKioqKioqKioqKioqKioKKyAgICAKKyAgICBlbHNlIGlmKCBmY2hzLT5kX2lkICYgMHg4MDAwMDAwMCAgLy8gUl9DVEw6CisgICAgICAgICAgICAgICAgICAgICYmICAgICAgICAgICAvLyBCYXNpYyBMaW5rIFNlcnZpY2UgUmVxdWVzdAorICAgICAgICAgICAhKGZjaHMtPmZfY3RsICYgMHhGRjAwMDAwMCkgKSAgLy8gdHlwZT0wIGZvciBCTFMKKyAgICB7CisKKyAgICAgIC8vIENoZWNrIGZvciBBQlRTIChBYm9ydCBTZXF1ZW5jZSkKKyAgICAgIGlmKCAoZmNocy0+ZF9pZCAmIDB4OEYwMDAwMDApID09IDB4ODEwMDAwMDApCisgICAgICB7CisgICAgICAgIC8vIGxvb2sgZm9yIE9YX0lELCBTX0lEIHBhaXIgdGhhdCBtYXRjaGVzIGluIG91cgorICAgICAgICAvLyBmY0V4Y2hhbmdlcyB0YWJsZTsgaWYgZm91bmQsIHJlcGx5IHdpdGggQUNDZXB0IGFuZCBjb21wbGV0ZQorICAgICAgICAvLyB0aGUgZXhjaGFuZ2UKKworICAgICAgICAvLyBQZXIgUExEQSwgYW4gQUJUUyBpcyBzZW50IGJ5IGFuIGluaXRpYXRvcjsgdGhlcmVmb3JlCisgICAgICAgIC8vIGFzc3VtZSB0aGF0IGlmIHdlIGhhdmUgYW4gZXhoYW5nZSBvcGVuIHRvIHRoZSBwb3J0IHdobworICAgICAgICAvLyBzZW50IEFCVFMsIGl0IHdpbGwgYmUgdGhlIGRfaWQgb2Ygd2hhdCB3ZSBzZW50LiAgCisgICAgICAgIGZvciggRXhjaGFuZ2VJRCA9IDAsIEFib3J0QWNjZXB0PUZBTFNFOworICAgICAgICAgICAgIEV4Y2hhbmdlSUQgPCBUQUNIX1NFU1RfTEVOOyBFeGNoYW5nZUlEKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFZhbGlkICJ0YXJnZXQiIGV4Y2hhbmdlIDI0LWJpdCBwb3J0X2lkIG1hdGNoZXM/IAorICAgICAgICAgICAgLy8gTk9URTogRm9yIHRoZSBjYXNlIG9mIGhhbmRsaW5nIEludGlhdG9yIEFORCBUYXJnZXQKKyAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyBvbiB0aGUgc2FtZSBjaGlwLCB3ZSBjYW4gaGF2ZSBUV08gRXhjaGFuZ2VzCisgICAgICAgICAgICAvLyB3aXRoIHRoZSBzYW1lIE9YX0lEIC0tIE9YX0lEL0ZGRkYgZm9yIHRoZSBDTU5ELCBhbmQKKyAgICAgICAgICAgIC8vIE9YX0lEL1JYX0lEIGZvciB0aGUgWFJEWSBvciBEQVRBIGZyYW1lKHMpLiAgSWRlYWxseSwKKyAgICAgICAgICAgIC8vIHdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBBQlRTIGZyb20gSW5pdGlhdG9ycyBvciBUYXJnZXRzLAorICAgICAgICAgICAgLy8gYnV0IGl0J3Mgbm90IGNsZWFyIHRoYXQgY2FuIGJlIHN1cHBvcnRlZCBvbiBUYWNoeW9uIGZvcgorICAgICAgICAgICAgLy8gYWxsIGNhc2VzIChyZXF1aXJlcyBtb3JlIGludmVzdGlnYXRpb24pLgorICAgICAgICAgICAgCisgICAgICAgICAgaWYoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnR5cGUgPT0gU0NTSV9UV0UgfHwKKyAgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0udHlwZSA9PSBTQ1NJX1RSRSkKKyAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgKChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLmZjaHMuZF9pZCAmIDB4RkZGRkZGKSA9PQorICAgICAgICAgICAgIChmY2hzLT5zX2lkICYgMHhGRkZGRkYpKSApCisgICAgICAgICAgeworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgLy8gdGFyZ2V0IHhjaG5nZSBwb3J0X2lkIG1hdGNoZXMgLS0gaG93IGFib3V0IE9YX0lEPworICAgICAgICAgICAgaWYoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLmZjaHMub3hfcnhfaWQgJjB4RkZGRjAwMDApCisgICAgICAgICAgICAgICAgICAgID09IChmY2hzLT5veF9yeF9pZCAmIDB4RkZGRjAwMDApICkKKyAgICAgICAgICAgICAgICAgICAgLy8geWVzISBwb3N0IEFDQ2VwdCByZXNwb25zZTsgd2lsbCBiZSBjb21wbGV0ZWQgYnkgZmNTdGFydAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnN0YXR1cyA9IFRBUkdFVF9BQk9SVDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBjb3B5IChhZGQpIHJ4X2lkIGZpZWxkIGZvciBzaW1wbGlmaWVkIEFDQ2VwdCByZXBseQorICAgICAgICAgICAgICBmY2hzLT5veF9yeF9pZCA9IAorICAgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0uZmNocy5veF9yeF9pZDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY3BxZmNUU1B1dExpbmtRdWUoIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFNfQUJUU19BQ0MsIC8vIFEgVHlwZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2hzICk7ICAgIC8vIHZvaWQgUXVlQ29udGVudAorICAgICAgICAgICAgICBBYm9ydEFjY2VwdCA9IFRSVUU7CisgICAgICBwcmludGsoIkFDQ2VwdGluZyBBQlRTIGZvciB4X0lEICU4LjhYaCwgU0VTVCBwYWlyICU4LjhYaFxuIiwgCisgICAgICAgICAgICAgZmNocy0+b3hfcnhfaWQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0uZmNocy5veF9yeF9pZCk7CisgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8vIEFCVFMgY2FuIGFmZmVjdCBvbmx5IE9ORSBleGNoYW5nZSAtZXhpdCBsb29wCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9ICAvLyBlbmQgb2YgRk9SIGxvb3AKKyAgICAgICAgaWYoICFBYm9ydEFjY2VwdCApIC8vIGNhbid0IEFDQ2VwdCBBQlRTIC0gc2VuZCBSZWplY3QKKyAgICAgICAgeworICAgICAgcHJpbnRrKCJSZUplY1Rpbmc6IGNhbid0IGZpbmQgRXhjaGFuZ2VJRCAlOC44WGggZm9yIEFCVFMgY29tbWFuZFxuIiwgCisgICAgICAgICAgICBmY2hzLT5veF9yeF9pZCk7CisgICAgICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0udHlwZSAKKyAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAhKGZjQ2hpcC0+U0VTVC0+dVsgRXhjaGFuZ2VJRF0uSVdFLkhkcl9MZW4KKyAgICAgICAgICAgICAgICYgMHg4MDAwMDAwMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIEV4Y2hhbmdlSUQpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJVbmV4cGVjdGVkIEFCVFMgUmVKZWNUISBTRVNUWyVYXSBEd29yZCAwOiAlWGhcbiIsIAorICAgICAgICAgICAgICBFeGNoYW5nZUlELCBmY0NoaXAtPlNFU1QtPnVbIEV4Y2hhbmdlSURdLklXRS5IZHJfTGVuKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgZm9yIEJMUyB7QUJUUz8gKEFib3J0IFNlcXVlbmNlKX0gQUNDZXB0CisgICAgICBlbHNlIGlmKCAoZmNocy0+ZF9pZCAmIDB4OEYwMDAwMDApID09IDB4ODQwMDAwMDApCisgICAgICB7CisgICAgICAgIC8vIHRhcmdldCBoYXMgcmVzcG9uZGVkIHdpdGggQUNDIGZvciBvdXIgQUJUUzsKKwkvLyBjb21wbGV0ZSB0aGUgaW5kaWNhdGVkIGV4Y2hhbmdlIHdpdGggQUJPUlRFRCBzdGF0dXMgCisgICAgICAgIC8vIE1ha2Ugbm8gY2hlY2tzIGZvciBjb3JyZWN0IFJYX0lELCBzaW5jZQorCS8vIGFsbCB3ZSBuZWVkIHRvIGNvbmZvcm0gQUJUUyBBQ0MgaXMgdGhlIE9YX0lELgorICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZF9pZCBtYXRjaGVzIQorIAorICAgICAgICBFeGNoYW5nZUlEID0gKGZjaHMtPm94X3J4X2lkID4+IDE2KSAmIDB4N0ZGRjsgLy8geF9pZCBmcm9tIEFDQworLy8JcHJpbnRrKCJBQlRTIEFDQyB4X0lEIDB4JTA0WCAweCUwNFgsIHN0YXR1cyAlWGhcbiIsIAorLy8gICAgICAgICAgZmNocy0+b3hfcnhfaWQgPj4gMTYsIGZjaHMtPm94X3J4X2lkICYgMHhmZmZmLAorLy8gICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW0V4Y2hhbmdlSURdLnN0YXR1cyk7CisKKworCQorICAgICAgICBpZiggRXhjaGFuZ2VJRCA8IFRBQ0hfU0VTVF9MRU4gKSAvLyB4X0lEIG1ha2VzIHNlbnNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERvZXMgInRhcmdldCIgZXhjaGFuZ2UgMjQtYml0IHBvcnRfaWQgbWF0Y2g/IAorICAgICAgICAgICAgLy8gKFNlZSAiTk9URSIgYWJvdmUgZm9yIGhhbmRsaW5nIEludGlhdG9yIEFORCBUYXJnZXQgaW4KKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIGRldmljZSBkcml2ZXIpCisgICAgICAgICAgICAvLyBGaXJzdCwgaWYgdGhpcyBpcyBhIHRhcmdldCByZXNwb25zZSwgdGhlbiB3ZSBvcmlnaW5hdGVkCisJICAgIC8vIChpbml0aWF0ZWQpIGl0IHdpdGggQkxTX0FCVFM6CisJICAKKyAgICAgICAgICBpZiggKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0udHlwZSA9PSBCTFNfQUJUUykKKworICAgICAgICAgICAgICAgICAgJiYKKwkgICAgLy8gU2Vjb25kLCBkb2VzIHRoZSBzb3VyY2Ugb2YgdGhpcyBBQ0MgbWF0Y2ggdGhlIGRlc3RpbmF0aW9uCisgICAgICAgICAgICAvLyBvZiB3aG8gd2Ugb3JpZ2luYWxseSBzZW50IGl0IHRvPworICAgICAgICAgICAgICgoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyBFeGNoYW5nZUlEXS5mY2hzLmRfaWQgJiAweEZGRkZGRikgPT0KKyAgICAgICAgICAgICAoZmNocy0+c19pZCAmIDB4RkZGRkZGKSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCBjcHFmY0hCQWRhdGEtPlBjaURldiwgZmNDaGlwLCBFeGNoYW5nZUlEICk7CisJICB9CisgICAgICAgIH0gICAgICAgICAgICAgIAorICAgICAgfQorICAgICAgLy8gQ2hlY2sgZm9yIEJMUyB7QUJUUz8gKEFib3J0IFNlcXVlbmNlKX0gUmVKZWNUCisgICAgICBlbHNlIGlmKCAoZmNocy0+ZF9pZCAmIDB4OEYwMDAwMDApID09IDB4ODUwMDAwMDApCisgICAgICB7CisgICAgICAgIC8vIHRhcmdldCBoYXMgcmVzcG9uZGVkIHdpdGggUkpUIGZvciBvdXIgQUJUUzsKKwkvLyBjb21wbGV0ZSB0aGUgaW5kaWNhdGVkIGV4Y2hhbmdlIHdpdGggQUJPUlRFRCBzdGF0dXMgCisgICAgICAgIC8vIE1ha2Ugbm8gY2hlY2tzIGZvciBjb3JyZWN0IFJYX0lELCBzaW5jZQorCS8vIGFsbCB3ZSBuZWVkIHRvIGNvbmZvcm0gQUJUUyBBQ0MgaXMgdGhlIE9YX0lELgorICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZF9pZCBtYXRjaGVzIQorIAorICAgICAgICBFeGNoYW5nZUlEID0gKGZjaHMtPm94X3J4X2lkID4+IDE2KSAmIDB4N0ZGRjsgLy8geF9pZCBmcm9tIEFDQworLy8JcHJpbnRrKCJCTFNfQUJUUyBSSlQgb24gRXhjaGFuZ2UgMHglMDRYIDB4JTA0WFxuIiwgCisvLyAgICAgICAgICBmY2hzLT5veF9yeF9pZCA+PiAxNiwgZmNocy0+b3hfcnhfaWQgJiAweGZmZmYpOworCisgICAgICAgIGlmKCBFeGNoYW5nZUlEIDwgVEFDSF9TRVNUX0xFTiApIC8vIHhfSUQgbWFrZXMgc2Vuc2UKKwl7ICAKKyAgICAgICAgICAgIC8vIERvZXMgInRhcmdldCIgZXhjaGFuZ2UgMjQtYml0IHBvcnRfaWQgbWF0Y2g/IAorICAgICAgICAgICAgLy8gKFNlZSAiTk9URSIgYWJvdmUgZm9yIGhhbmRsaW5nIEludGlhdG9yIEFORCBUYXJnZXQgaW4KKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIGRldmljZSBkcml2ZXIpCisgICAgICAgICAgICAvLyBGaXJzdCwgaWYgdGhpcyBpcyBhIHRhcmdldCByZXNwb25zZSwgdGhlbiB3ZSBvcmlnaW5hdGVkCisJICAgIC8vIChpbml0aWF0ZWQpIGl0IHdpdGggQkxTX0FCVFM6CisJCSAgCisgICAgICAgICAgaWYoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSURdLnR5cGUgPT0gQkxTX0FCVFMpCisKKyAgICAgICAgICAgICAgICAgICYmCisJICAgIC8vIFNlY29uZCwgZG9lcyB0aGUgc291cmNlIG9mIHRoaXMgQUNDIG1hdGNoIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICAgICAgLy8gb2Ygd2hvIHdlIG9yaWdpbmFsbHkgc2VudCBpdCB0bz8KKyAgICAgICAgICAgICAoKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgRXhjaGFuZ2VJRF0uZmNocy5kX2lkICYgMHhGRkZGRkYpID09CisgICAgICAgICAgICAgKGZjaHMtPnNfaWQgJiAweEZGRkZGRikpICkKKyAgICAgICAgICB7CisJICAgIC8vIFlFUyEgTk9URTogVGhlcmUgaXMgYSBidWcgaW4gQ1BRJ3MgUkEtNDAwMCBib3ggCisJICAgIC8vIHdoZXJlIHRoZSAicmVhc29uIGNvZGUiIGlzbid0IHJldHVybmVkIGluIHRoZSBwYXlsb2FkCisJICAgIC8vIEZvciBub3csIHNpbXBseSBwcmVzdW1lIHRoZSByZWplY3QgaXMgYmVjYXVzZSB0aGUgdGFyZ2V0CisJICAgIC8vIGFscmVhZHkgY29tcGxldGVkIHRoZSBleGNoYW5nZS4uLgorCSAgICAKKy8vICAgICAgICAgICAgcHJpbnRrKCJjb21wbGV0ZSB4X0lEICVYaCBvbiBBQlRTIFJKVFxuIiwgRXhjaGFuZ2VJRCk7CisgICAgICAgICAgICBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIGZjQ2hpcCwgRXhjaGFuZ2VJRCApOworCSAgfQorCX0gCisgICAgICB9ICAvLyBlbmQgb2YgQUJUUyBjaGVjaworICAgIH0gIC8vIGVuZCBvZiBCYXNpYyBMaW5rIFNlcnZpY2UgUmVxdWVzdAorICAgIGJyZWFrOworICAKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRrKCJBbmFseXplSW5jb21pbmdGcmFtZTogdW5rbm93biB0eXBlOiAlWGgoJWQpXG4iLAorICAgICAgICBmY0xRLT5RaXRlbVtRTmR4XS5UeXBlLAorICAgICAgICBmY0xRLT5RaXRlbVtRTmR4XS5UeXBlKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8vIEZ1bmN0aW9uIGZvciBQb3J0IERpc2NvdmVyeSBuZWNlc3NhcnkgYWZ0ZXIgZXZlcnkgRkMgCisvLyBpbml0aWFsaXphdGlvbiAoZS5nLiBMSVApLgorLy8gQWxzbyBtYXkgYmUgY2FsbGVkIGlmIGZyb20gRmFicmljIE5hbWUgU2VydmljZSBsb2dpYy4KKworc3RhdGljIHZvaWQgU2VuZExvZ2lucyggQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgX191MzIgKkZhYnJpY1BvcnRJZHMgKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFVMT05HIHVsU3RhdHVzPTA7CisgIFRhY2hGQ0hEUl9HQ01ORCBmY2hzOyAgLy8gY29weSBmaWVsZHMgZm9yIHRyYW5zbWlzc2lvbgorICBpbnQgaTsKKyAgVUxPTkcgbG9naW5UeXBlOworICBMT05HIEV4Y2hhbmdlSUQ7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQ7CisgIF9fdTMyIFBvcnRJZHNbIG51bWJlcl9vZl9hbF9wYV07CisgIGludCBOdW1iZXJPZlBvcnRzPTA7CisKKyAgLy8gV2UncmUgZ29pbmcgdG8gcHJlc3VtZSAoZm9yIG5vdykgdGhhdCBvdXIgbGltaXQgb2YgRmFicmljIGRldmljZXMKKyAgLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBhbHBhIG9uIGEgcHJpdmF0ZSBsb29wICgxMjYgZGV2aWNlcykuCisgIC8vIChPZiBjb3Vyc2UgdGhpcyBjb3VsZCBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgaG93ZXZlciBtYW55IHdlIGhhdmUKKyAgLy8gbWVtb3J5IGZvcikuCisgIG1lbXNldCggJlBvcnRJZHNbMF0sIDAsIHNpemVvZihQb3J0SWRzKSk7CisgICAKKyAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoaXMgbG9naW4gaXMgZm9yIG91ciBvd24gTGluayBJbml0aWFsaXphdGlvbgorICAvLyAoZS5nLiBMSVAgb24gRkMtQUwpLCBvciBpZiB3ZSBoYXZlIGtub3dsZWRnZSBvZiBGYWJyaWMgZGV2aWNlcworICAvLyBmcm9tIGEgc3dpdGNoLiAgSWYgd2UgYXJlIGxvZ2dpbmcgaW50byBGYWJyaWMgZGV2aWNlcywgd2UnbGwKKyAgLy8gaGF2ZSBhIG5vbi1OVUxMIEZhYnJpY1BvcnRJZCBwb2ludGVyCisgIAorICBpZiggRmFicmljUG9ydElkcyAhPSBOVUxMKSAvLyBtYXkgbmVlZCBsb2dpbnMKKyAgeworICAgIGludCBMYXN0UG9ydD1GQUxTRTsKKyAgICBpID0gMDsKKyAgICB3aGlsZSggIUxhc3RQb3J0KQorICAgIHsKKyAgICAgIC8vIHBvcnQgSURzIEZyb20gTlNSIHBheWxvYWQ7IGJ5dGUgc3dhcCBuZWVkZWQ/CisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKUZhYnJpY1BvcnRJZHMsIChVQ0hBUiopJlBvcnRJZHNbaV0sIDQpOworIAorLy8gICAgICBwcmludGsoIkZQb3J0SWRbJWRdICVYaCAiLCBpLCBQb3J0SWRzW2ldKTsKKyAgICAgIGlmKCBQb3J0SWRzW2ldICYgMHg4MDAwMDAwMCkKKwlMYXN0UG9ydCA9IFRSVUU7CisgICAgICAKKyAgICAgIFBvcnRJZHNbaV0gJj0gMHhGRkZGRkY7IC8vIGdldCAyNC1iaXQgcG9ydF9pZAorICAgICAgLy8gc29tZSBub24tRmFicmljIGRldmljZXMgKGxpa2UgdGhlIENyb3Nzcm9hZHMgRmlicmUvU2NzaSBicmlkZ2UpCisgICAgICAvLyBlcnJvbmVvdXNseSB1c2UgQUxQQSAwLgorICAgICAgaWYoIFBvcnRJZHNbaV0gICkgLy8gbmVlZCBub24temVybyBwb3J0X2lkLi4uCisgICAgICAgIGkrKzsKKyAgICAgIAorICAgICAgaWYoIGkgPj0gbnVtYmVyX29mX2FsX3BhICkgLy8gKGluKXNhbml0eSBjaGVjaworCWJyZWFrOworICAgICAgRmFicmljUG9ydElkcysrOyAgLy8gbmV4dC4uLgorICAgIH0KKworICAgIE51bWJlck9mUG9ydHMgPSBpOworLy8gICAgcHJpbnRrKCJOdW1iZXJPZiBGYWJyaWMgcG9ydHMgJWQiLCBOdW1iZXJPZlBvcnRzKTsKKyAgfQorICAKKyAgZWxzZSAgLy8gbmVlZCB0byBzZW5kIGxvZ2lucyBvbiBvdXIgImxvY2FsIiBsaW5rCisgIHsKKyAgCisgICAgLy8gYXJlIHdlIGEgbG9vcCBwb3J0PyAgSWYgc28sIGNoZWNrIGZvciByZWNlcHRpb24gb2YgTElMUCBmcmFtZSwKKyAgICAvLyBhbmQgaWYgcmVjZWl2ZWQgdXNlIGl0IChTQU5NYXJrIHJlcXVpcmVtZW50KQorICAgIGlmKCBmY0NoaXAtPk9wdGlvbnMuTElMUGluICkKKyAgICB7CisgICAgICBpbnQgaj0wOworICAgICAgLy8gc2FuaXR5IGNoZWNrIG9uIG51bWJlciBvZiBBTFBBcyBmcm9tIExJTFAgZnJhbWUuLi4KKyAgICAgIC8vIEZvciBmb3JtYXQgb2YgTElMUCBmcmFtZSwgc2VlIEZDLUFMIHNwZWNzIG9yIAorICAgICAgLy8gIkZpYnJlIENoYW5uZWwgQmVuY2ggUmVmZXJlbmNlIiwgSi4gU3RhaSwgMTk5NSAoSVNCTiAxLTg3OTkzNi0xNy04KQorICAgICAgLy8gRmlyc3QgYnl0ZSBpcyBudW1iZXIgb2YgQUxQQXMKKyAgICAgIGkgPSBmY0NoaXAtPkxJTFBtYXBbMF0gPj0gKDMyKjQpID8gMzIqNCA6IGZjQ2hpcC0+TElMUG1hcFswXTsKKyAgICAgIE51bWJlck9mUG9ydHMgPSBpOworLy8gICAgICBwcmludGsoIiBMSUxQIGFscGEgY291bnQgJWQgIiwgaSk7CisgICAgICB3aGlsZSggaSA+IDApCisgICAgICB7CisJUG9ydElkc1tqXSA9IGZjQ2hpcC0+TElMUG1hcFsxKyBqXTsKKwlqKys7IGktLTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLy8gaGF2ZSB0byBzZW5kIGxvZ2luIHRvIGV2ZXJ5Ym9keQorICAgIHsKKyAgICAgIGludCBqPTA7CisgICAgICBpID0gbnVtYmVyX29mX2FsX3BhOworICAgICAgTnVtYmVyT2ZQb3J0cyA9IGk7CisgICAgICB3aGlsZSggaSA+IDApCisgICAgICB7CisgICAgICAgIFBvcnRJZHNbal0gPSB2YWxpZF9hbF9wYVtqXTsgLy8gYWxsIGxlZ2FsIEFMUEFzCisJaisrOyBpLS07CisgICAgICB9CisgICAgfQorICB9CisKKworICAvLyBOb3cgd2UgaGF2ZSBhIGNvcHkgb2YgdGhlIHBvcnRfaWRzIChhbmQgaG93IG1hbnkpLi4uCisgIGZvciggaSA9IDA7IGkgPCBOdW1iZXJPZlBvcnRzOyBpKyspCisgIHsKKyAgICAvLyAyNC1iaXQgRkMgUG9ydCBJRAorICAgIGZjaHMuc19pZCA9IFBvcnRJZHNbaV07ICAvLyBub3RlOiBvbmx5IDgtYml0cyB1c2VkIGZvciBBTFBBCisKKworICAgIC8vIGRvbid0IGxvZyBpbnRvIG91cnNlbHZlcyAoTGludXggU2NzaSBkaXNrIHNjYW4gd2lsbCBzdG9wIG9uCisgICAgLy8gbm8gVEFSR0VUIHN1cHBvcnQgZXJyb3Igb24gdXMsIGFuZCBxdWl0IHRyeWluZyBmb3IgcmVzdCBvZiBkZXZpY2VzKQorICAgIGlmKCAoZmNocy5zX2lkICYgMHhGRiApID09IChmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSAmIDB4RkYpICkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gZmFicmljIGxvZ2luIG5lZWRlZD8KKyAgICBpZiggKGZjaHMuc19pZCA9PSAwKSB8fCAKKyAgICAgICAgKGZjQ2hpcC0+T3B0aW9ucy5mYWJyaWMgPT0gMSkgKQorICAgIHsKKyAgICAgIGZjQ2hpcC0+T3B0aW9ucy5mbG9naSA9IDE7ICAvLyBmYWJyaWMgbmVlZHMgbG9uZ2VyIGZvciBsb2dpbgorICAgICAgLy8gRG8gd2UgbmVlZCBGTE9HSSBvciBGRElTQz8KKyAgICAgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICAgICAgICAgICAgIGZjQ2hpcCwgCisgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgIC8vIGRvbid0IHNlYXJjaCBTQ1NJIE5leHVzCisgICAgICAgICAgICAgMHhGRkZGRkMsICAgICAgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRmFicmljIHBvcnRfaWQKKyAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIFdXTgorICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAvLyAoZG9uJ3QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdCkKKworICAgICAgaWYoIHBMb2dnZWRJblBvcnQgKSAgICAvLyBJZiBmb3VuZCwgd2UgaGF2ZSBwcmlvciBleHBlcmllbmNlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwb3J0IC0tIGNoZWNrIHdoZXRoZXIgUERJU0MgaXMgbmVlZGVkCisgICAgICB7CisgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5mbG9naSApCisJeworCSAgLy8gZG9lcyB0aGUgc3dpdGNoIHN1cHBvcnQgRkRJU0M/PyAoRkxPR0kgZm9yIG5vdy4uLikKKyAgICAgICAgICBsb2dpblR5cGUgPSBFTFNfRkxPR0k7ICAvLyBwcmlvciBGTE9HSSBzdGlsbCB2YWxpZAorCX0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGxvZ2luVHlwZSA9IEVMU19GTE9HSTsgIC8vIGV4cGlyZWQgRkxPR0kKKyAgICAgIH0KKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgRkxPR0k/CisgICAgICAgIGxvZ2luVHlwZSA9IEVMU19GTE9HSTsgIAorCisKKyAgICAgIGZjaHMuc19pZCA9IDB4RkZGRkZFOyAgIC8vIHdlbGwga25vd24gRl9Qb3J0IGFkZHJlc3MKKworICAgICAgLy8gRmFicmljcyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgRkRJU0MsIGFuZAorICAgICAgLy8gaXQncyBub3QgY2xlYXIgaWYgdGhhdCBoZWxwcyB1cyBhbnl3YXksIHNpbmNlCisgICAgICAvLyB3ZSdsbCB3YW50IGEgTmFtZSBTZXJ2aWNlIFJlcXVlc3QgdG8gcmUtdmVyaWZ5CisgICAgICAvLyB2aXNpYmxlIGRldmljZXMuLi4KKyAgICAgIC8vIENvbnNlcXVlbnRseSwgd2UgYWx3YXlzIHdhbnQgb3VyIHVwcGVyIDE2IGJpdAorICAgICAgLy8gcG9ydF9pZCB0byBiZSB6ZXJvICh3ZSdsbCBiZSByZWplY3RlZCBpZiB3ZQorICAgICAgLy8gdXNlIG91ciBwcmlvciBwb3J0X2lkIGlmIHdlJ3ZlIGJlZW4gcGx1Z2dlZCBpbnRvCisgICAgICAvLyBhIGRpZmZlcmVudCBzd2l0Y2ggcG9ydCkuCisgICAgICAvLyBUcmljayBUYWNoeW9uIHRvIHNlbmQgdG8gQUxQQSAwIChzZWUgVEwvVFMgVUcsIHBnIDg3KQorICAgICAgLy8gSWYgb3VyIEFMUEEgaXMgNTVoIGZvciBpbnN0YW5jZSwgd2Ugd2FudCB0aGUgRkMgZnJhbWUKKyAgICAgIC8vIHNfaWQgdG8gYmUgMHgwMDAwNTUsIHdoaWxlIFRhY2gncyBteV9hbF9wYSByZWdpc3RlcgorICAgICAgLy8gbXVzdCBiZSAweDAwMDE1NSwgdG8gZm9yY2UgYW4gT1BOIGF0IEFMUEEgMCAKKyAgICAgIC8vICh0aGUgRmFicmljIHBvcnQpCisgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSAmPSAweEZGOyAvLyBvbmx5IHVzZSBBTFBBIGZvciBGTE9HSQorICAgICAgd3JpdGVsKCBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSB8IDB4MDEwMCwgIAorICAgICAgICBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgKyBUTF9NRU1fVEFDSF9NeV9JRCk7CisgICAgfQorCisgICAgZWxzZSAvLyBub3QgRkxPR0kuLi4KKyAgICB7CisgICAgICAvLyBzaG91bGQgd2Ugc2VuZCBQTE9HSSBvciBQRElTQz8gIENoZWNrIGlmIGFueSBwcmlvciBwb3J0X2lkCisgICAgICAvLyAoZS5nLiBhbHBhKSBjb21wbGV0ZWQgYSBQTE9HSS9QUkxJIGV4Y2hhbmdlIGJ5IGNoZWNraW5nIAorICAgICAgLy8gdGhlIHBkaXNjIGZsYWcuCisKKyAgICAgIHBMb2dnZWRJblBvcnQgPSBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICAgICAgICAgICAgIGZjQ2hpcCwgCisgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgIC8vIGRvbid0IHNlYXJjaCBTQ1NJIE5leHVzCisgICAgICAgICAgICAgZmNocy5zX2lkLCAgICAgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgYWxfcGEKKyAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgLy8gZG9uJ3Qgc2VhcmNoIFdXTgorICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAvLyAoZG9uJ3QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdCkKKworICAgICAgICAgICAgIAorCisgICAgICBpZiggcExvZ2dlZEluUG9ydCApICAgICAgLy8gSWYgZm91bmQsIHdlIGhhdmUgcHJpb3IgZXhwZXJpZW5jZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcG9ydCAtLSBjaGVjayB3aGV0aGVyIFBESVNDIGlzIG5lZWRlZAorICAgICAgeworICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cGRpc2MgKQorCXsKKyAgICAgICAgICBsb2dpblR5cGUgPSBFTFNfUERJU0M7ICAvLyBwcmlvciBQTE9HSSBhbmQgUFJMSSBtYXliZSBzdGlsbCB2YWxpZAorICAgICAgICAgICAKKwl9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsb2dpblR5cGUgPSBFTFNfUExPR0k7ICAvLyBwcmlvciBrbm93bGVkZ2UsIGJ1dCBjYW4ndCB1c2UgUERJU0MKKyAgICAgIH0KKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgdGFsa2VkIHRvIHRoaXMgcG9ydF9pZCBiZWZvcmUKKyAgICAgICAgbG9naW5UeXBlID0gRUxTX1BMT0dJOyAgLy8gcHJpb3Iga25vd2xlZGdlLCBidXQgY2FuJ3QgdXNlIFBESVNDCisgICAgfQorCisKKyAgICAKKyAgICB1bFN0YXR1cyA9IGNwcWZjVFNCdWlsZEV4Y2hhbmdlKAorICAgICAgICAgIGNwcWZjSEJBZGF0YSwKKyAgICAgICAgICBsb2dpblR5cGUsICAgICAgICAgICAgLy8gZS5nLiBQTE9HSQorICAgICAgICAgICZmY2hzLCAgICAgICAgLy8gbm8gaW5jb21pbmcgZnJhbWUgKHdlIGFyZSBvcmlnaW5hdG9yKQorICAgICAgICAgIE5VTEwsICAgICAgICAgLy8gbm8gZGF0YSAobm8gc2NhdHRlci9nYXRoZXIgbGlzdCkKKyAgICAgICAgICAmRXhjaGFuZ2VJRCApOy8vIGZjQ29udHJvbGxlci0+ZmNFeGNoYW5nZXMgaW5kZXgsIC0xIGlmIGZhaWxlZAorCisgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwIE9LPworICAgIHsKKyAgICAgIHVsU3RhdHVzID0gY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgRXhjaGFuZ2VJRCApOworICAgICAgaWYoICF1bFN0YXR1cyApCisgICAgICB7CisgICAgICAgICAgLy8gc3VibWl0dGVkIHRvIFRhY2gncyBPdXRib3VuZCBRdWUgKEVSUSBQSSBpbmNyZW1lbnRlZCkKKyAgICAgICAgICAvLyB3YWl0ZWQgZm9yIGNvbXBsZXRpb24gZm9yIEVMUyB0eXBlIChMb2dpbiBmcmFtZXMgaXNzdWVkCisgICAgICAgICAgLy8gc3luY2hyb25vdXNseSkKKworCWlmKCBsb2dpblR5cGUgPT0gRUxTX1BESVNDICkKKwl7CisJICAvLyBub3csIHdlIHJlYWxseSBzaG91bGRuJ3QgUmV2YWxpZGF0ZSBTRVNUIGV4Y2hhbmdlcyB1bnRpbAorCSAgLy8gd2UgZ2V0IGFuIEFDQyByZXBseSBmcm9tIG91ciB0YXJnZXQgYW5kIHZlcmlmeSB0aGF0CisJICAvLyB0aGUgdGFyZ2V0IGFkZHJlc3MvV1dOIGlzIHVuY2hhbmdlZC4gIEhvd2V2ZXIsIHdoZW4gYSBmYXN0CisJICAvLyB0YXJnZXQgZ2V0cyB0aGUgUERJU0MsIHRoZXkgY2FuIHNlbmQgU0VTVCBFeGNoYW5nZSBkYXRhCisJICAvLyBiZWZvcmUgd2UgZXZlbiBnZXQgYXJvdW5kIHRvIHByb2Nlc3NpbmcgdGhlIFBESVNDIEFDQy4KKwkgIC8vIENvbnNlcXVlbnRseSwgd2UgbG9zZSB0aGUgSS9PLgorCSAgLy8gVG8gYXZvaWQgdGhpcywgZ28gYWhlYWQgYW5kIFJldmFsaWRhdGUgd2hlbiB0aGUgUERJU0MgZ29lcworCSAgLy8gb3V0LCBhbnRpY2lwYXRpbmcgdGhhdCB0aGUgQUNDIHdpbGwgYmUgdHJ1bHkgYWNjZXB0YWJsZQorCSAgLy8gKHRoaXMgaGFwcGVucyA5OS45OTk5Li4uLiUgb2YgdGhlIHRpbWUpLgorCSAgLy8gSWYgd2UgcmV2YWxpZGF0ZSBhIFNFU1Qgd3JpdGUsIGFuZCB3cml0ZSBkYXRhIGdvZXMgdG8gYQorCSAgLy8gdGFyZ2V0IHRoYXQgaXMgTk9UIHRoZSBvbmUgd2Ugb3JpZ2luYXRlZCB0aGUgV1JJVEUgdG8sCisJICAvLyB0aGF0IHRhcmdldCBpcyByZXF1aXJlZCAoRkNQLVNDU0kgc3BlY3MsIGV0YykgdG8gZGlzY2FyZCAKKwkgIC8vIG91ciBXUklURSBkYXRhLgorCisgICAgICAgICAgLy8gUmUtdmFsaWRhdGUgU0VTVCBlbnRyaWVzIChUYWNoeW9uIGhhcmR3YXJlIGFzc2lzdHMpCisgICAgICAgICAgUmV2YWxpZGF0ZVNFU1QoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXIsIHBMb2dnZWRJblBvcnQpOyAKKyAgICAvL1RyaWdnZXJIQkEoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSwgMSk7CisJfQorICAgICAgfQorICAgICAgZWxzZSAgLy8gZ2l2ZSB1cCBpbW1lZGlhdGVseSBvbiBlcnJvcgorICAgICAgeworI2lmZGVmIExPR0lOX0RCRworICAgICAgICBwcmludGsoIlNlbmRMb2dpbnM6IGZjU3RhcnRFeGNoYW5nZSBmYWlsZWQ6ICVYaFxuIiwgdWxTdGF0dXMgKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAgICAgICAKKyAgICAgIGlmKCBmY0NoaXAtPlJlZ2lzdGVycy5GTXN0YXR1cy52YWx1ZSAmIDB4MDgwICkgLy8gTERuIGR1cmluZyBQb3J0IERpc2MuCisgICAgICB7CisgICAgICAgIHVsU3RhdHVzID0gTE5LRFdOX09TTFM7CisjaWZkZWYgTE9HSU5fREJHCisgICAgICAgIHByaW50aygiU2VuZExvZ2luczogUG9ydERpc2MgYWJvcnRlZCAoTERuKSBAYWxwYSAlWGhcbiIsIGZjaHMuc19pZCk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAgIC8vIENoZWNrIHRoZSBleGNoYW5nZSBmb3IgYmFkIHN0YXR1cyAoaS5lLiBGcmFtZVRpbWVPdXQpLAorICAgICAgICAvLyBhbmQgY29tcGxldGUgb24gYmFkIHN0YXR1cyAobW9zdCBsaWtlbHkgZHVlIHRvIEJBRF9BTFBBKQorICAgICAgICAvLyBvbiBMRG4sIERQQyBmdW5jdGlvbiBtYXkgYWxyZWFkeSBjb21wbGV0ZSAoQUJPUlQpIGEgc3RhcnRlZAorICAgICAgICAvLyBleGNoYW5nZSwgc28gY2hlY2sgdHlwZSBmaXJzdCAodHlwZSA9IDAgb24gY29tcGxldGUpLgorICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtFeGNoYW5nZUlEXS5zdGF0dXMgKQorICAgICAgeworI2lmZGVmIExPR0lOX0RCRyAKKyAJcHJpbnRrKCJjb21wbGV0aW5nIHhfSUQgJVggb24gc3RhdHVzICVYaFxuIiwgCisgICAgICAgICAgRXhjaGFuZ2VJRCwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW0V4Y2hhbmdlSURdLnN0YXR1cyk7CisjZW5kaWYKKyAgICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsIEV4Y2hhbmdlSUQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgLy8gWGNoYW5nZSBzZXR1cCBmYWlsZWQuLi4KKyAgICB7CisjaWZkZWYgTE9HSU5fREJHCisgICAgICBwcmludGsoIkZDOiBjcHFmY1RTQnVpbGRFeGNoYW5nZSBmYWlsZWQ6ICVYaFxuIiwgdWxTdGF0dXMgKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCAhdWxTdGF0dXMgKQorICB7CisgICAgLy8gc2V0IHRoZSBldmVudCBzaWduaWZ5aW5nIHRoYXQgYWxsIEFMUEFzIHdlcmUgc2VudCBvdXQuCisjaWZkZWYgTE9HSU5fREJHCisgICAgcHJpbnRrKCJTZW5kTG9naW5zOiBQb3J0RGlzY0RvbmVcbiIpOworI2VuZGlmCisgICAgY3BxZmNIQkFkYXRhLT5Qb3J0RGlzY0RvbmUgPSAxOworCisKKyAgICAvLyBUTC9UUyBVRywgcGcuIDE4NAorICAgIC8vIDB4MDA2NSA9IDEwMG1zIGZvciBSVF9UT1YKKyAgICAvLyAweDAxZjUgPSA1MDBtcyBmb3IgRURfVE9WCisgICAgZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlID0gMHgwMDY1MDFmNUw7IAorICAgIHdyaXRlbCggZmNDaGlwLT5SZWdpc3RlcnMuZWRfdG92LnZhbHVlLAorICAgICAgKGZjQ2hpcC0+UmVnaXN0ZXJzLmVkX3Rvdi5hZGRyZXNzKSk7CisKKyAgICAvLyBzZXQgdGhlIExQX1RPViBiYWNrIHRvIEVEX1RPViAoaS5lLiA1MDAgbXMpCisgICAgd3JpdGVsKCAweDAwMDAwMDEwLCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UgK1RMX01FTV9GTV9USU1FT1VUMik7CisgIH0KKyAgZWxzZQorICB7CisgICAgcHJpbnRrKCJTZW5kTG9naW5zOiBmYWlsZWQgYXQgeGNobmcgJVhoLCBhbHBhICVYaCwgc3RhdHVzICVYaFxuIiwgCisgICAgICBFeGNoYW5nZUlELCBmY2hzLnNfaWQsIHVsU3RhdHVzKTsKKyAgfQorICBMRUFWRSgiU2VuZExvZ2lucyIpOworCit9CisKKworLy8gZm9yIFJFUE9SVF9MVU5TIGRvY3VtZW50YXRpb24sIHNlZSAiSW4tRGVwdGggRXhwbG9yYXRpb24gb2YgU2NzaSIsCisvLyBELiBEZW1pbmcsIDE5OTQsIHBnIDctMTkgKElTQk4gMS04Nzk5MzYtMDgtOSkKK3N0YXRpYyB2b2lkIFNjc2lSZXBvcnRMdW5zRG9uZShTY3NpX0NtbmQgKkNtbmQpCit7CisgIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyID0gQ21uZC0+ZGV2aWNlLT5ob3N0OworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQ7IAorICBpbnQgTHVuTGlzdExlbj0wOworICBpbnQgaTsKKyAgVUxPTkcgeF9JRCA9IDB4RkZGRkZGRkY7CisgIFVDSEFSICp1Y0J1ZmYgPSBDbW5kLT5yZXF1ZXN0X2J1ZmZlcjsKKworLy8gIHByaW50aygiY3BxZmNUUzogUmVwb3J0THVuc0RvbmUgXG4iKTsKKyAgLy8gZmlyc3QsIHdlIG5lZWQgdG8gZmluZCB0aGUgRXhjaGFuZ2UgZm9yIHRoaXMgY29tbWFuZCwKKyAgLy8gc28gd2UgY2FuIGZpbmQgdGhlIGZjUG9ydCBzdHJ1Y3QgdG8gbWFrZSB0aGUgaW5kaWNhdGVkCisgIC8vIGNoYW5nZXMuCisgIGZvciggaT0wOyBpPCBUQUNIX1NFU1RfTEVOOyBpKyspCisgIHsKKyAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgICAvLyBleGNoYW5nZSBkZWZpbmVkPworICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5DbW5kID09IENtbmQpICkgLy8gbWF0Y2hlcz8KKwkgICAgICAKKyAgICB7CisgICAgICB4X0lEID0gaTsgIC8vIGZvdW5kIGV4Y2hhbmdlIQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCB4X0lEID09IDB4RkZGRkZGRkYpCisgIHsKKy8vICAgIHByaW50aygiY3BxZmNUUzogUmVwb3J0THVucyBmYWlsZWQgLSBubyBGQyBFeGNoYW5nZVxuIik7CisgICAgZ290byBEb25lOyAgLy8gUmVwb3J0IEx1bnMgRkMgRXhjaGFuZ2UgZ29uZTsgCisgICAgICAgICAgICAgICAgLy8gZXhjaGFuZ2UgcHJvYmFibHkgVGVybWluYXRlZCBieSBJbXBsaWNpdCBsb2dvdXQKKyAgfQorCisKKyAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciB0aGUgcG9ydF9pZCB3ZSBzZW50IElOUVVJUlkgdG8KKyAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggU2NzaSBOZXh1cyAod2Ugd2lsbCBzZXQgaXQpCisgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5mY2hzLmRfaWQgJiAweEZGRkZGRiwgICAgICAgIAorICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIFdXTgorICAgIE5VTEwpOyAgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisgCisgIGlmKCAhcExvZ2dlZEluUG9ydCApCisgIHsKKy8vICAgIHByaW50aygiY3BxZmNUUzogUmVwb3J0THVucyBmYWlsZWQgLSBkZXZpY2UgZ29uZVxuIik7CisgICAgZ290byBEb25lOyAvLyBlcnJvciEgY2FuJ3QgZmluZCBsb2dnZWQgaW4gUG9ydAorICB9ICAgIAorICBMdW5MaXN0TGVuID0gdWNCdWZmWzNdOworICBMdW5MaXN0TGVuICs9IHVjQnVmZlsyXT4+ODsKKworICBpZiggIUx1bkxpc3RMZW4gKSAgLy8gZmFpbGVkCisgIHsKKyAgICAvLyBnZW5lcmljYWxseSBzcGVha2luZywgYSBzb2Z0IGVycm9yIG1lYW5zIHdlIHNob3VsZCByZXRyeS4uLgorICAgIGlmKCAoQ21uZC0+cmVzdWx0ID4+IDE2KSA9PSBESURfU09GVF9FUlJPUiApCisgICAgeworICAgICAgaWYoICgoQ21uZC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhGKSA9PSAweDYpICYmCisJICAgICAgICAoQ21uZC0+c2Vuc2VfYnVmZmVyWzEyXSA9PSAweDI5KSApIC8vIFNlbnNlIENvZGUgInJlc2V0IgorICAgICAgeworICAgICAgICBUYWNoRkNIRFJfR0NNTkQgKmZjaHMgPSAmRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS5mY2hzOworICAgICAgLy8gZGlkIHdlIGZhaWwgYmVjYXVzZSBvZiAiY2hlY2sgY29uZGl0aW9uLCBkZXZpY2UgcmVzZXQ/IgorICAgICAgLy8gZS5nLiB0aGUgZGV2aWNlIHdhcyByZXNldCAoaS5lLiwgYXQgZXZlcnkgcG93ZXIgdXApCisgICAgICAvLyByZXRyeSB0aGUgUmVwb3J0IEx1bnMKKyAgICAgIAorICAgICAgLy8gd2hvIGFyZSB3ZSBzZW5kaW5nIGl0IHRvPworICAgICAgLy8gd2Uga25vdyB0aGlzIGJlY2F1c2Ugd2UgaGF2ZSBhIGNvcHkgb2YgdGhlIGNvbW1hbmQKKyAgICAgIC8vIGZyYW1lIGZyb20gdGhlIG9yaWdpbmFsIFJlcG9ydCBMdW4gY29tbWFuZCAtCisgICAgICAvLyBzd2l0Y2ggdGhlIGRfaWQvc19pZCBmaWVsZHMsIGJlY2F1c2UgdGhlIEV4Y2hhbmdlIEJ1aWxkCisgICAgICAvLyBjb250ZXh0IGlzICJyZXBseSB0byBzb3VyY2UiLgorICAgICAgCisgICAgICAgIGZjaHMtPnNfaWQgPSBmY2hzLT5kX2lkOyAvLyAodGVtcG9yYXJpbHkgcmUtdXNlIHRoZSBzdHJ1Y3QpCisgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIFNDU0lfUkVQT1JUX0xVTlMsIGZjaHMgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLy8gcHJvYmFibHksIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IFJlcG9ydCBMdW5zCisgICAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuVm9sdW1lU2V0QWRkcmVzc2luZyA9IDA7ICAKKyAgfQorICBlbHNlICAvLyB3ZSBoYXZlIExVTiBpbmZvIC0gY2hlY2sgVlNBIG1vZGUKKyAgeworICAgIC8vIGZvciBub3csIGFzc3VtZSBhbGwgTFVOcyB3aWxsIGhhdmUgc2FtZSBhZGRyIG1vZGUKKyAgICAvLyBmb3IgVlNBLCBwYXlsb2FkIGJ5dGUgOCB3aWxsIGJlIDB4NDA7IG90aGVyd2lzZSwgMAorICAgIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5Wb2x1bWVTZXRBZGRyZXNzaW5nID0gdWNCdWZmWzhdOyAgCisgICAgICAKKyAgICAvLyBTaW5jZSB3ZSBnb3QgYSBSZXBvcnQgTHVucyBhbnN3ZXIsIHNldCBsdW4gbWFza2luZyBmbGFnCisgICAgcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLkx1bk1hc2tpbmcgPSAxOworCisgICAgaWYoIEx1bkxpc3RMZW4gPiA4KkNQUUZDVFNfTUFYX0xVTikgICAvLyBXZSBleHBlY3QgQ1BRRkNUU19NQVhfTFVOIG1heAorICAgICAgTHVuTGlzdExlbiA9IDgqQ1BRRkNUU19NQVhfTFVOOworCisvKiAgIAorICAgIHByaW50aygiRGV2aWNlIFdXTiAlMDhYJTA4WCBSZXBvcnRzIEx1bnMgQDogIiwgCisgICAgICAgICAgKFVMT05HKShwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOICYweEZGRkZGRkZGKSwgCisgICAgICAgICAgKFVMT05HKShwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOPj4zMikpOworCSAgICAKKyAgICBmb3IoIGk9ODsgaTxMdW5MaXN0TGVuKzg7IGkrPTgpCisgICAgeyAgCisgICAgICBwcmludGsoIiUwMlglMDJYICIsIHVjQnVmZltpXSwgdWNCdWZmW2krMV0gKTsKKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworKi8KKyAgICAKKyAgICAvLyBTaW5jZSB0aGUgZGV2aWNlIHdhcyBraW5kIGVub3VnaCB0byB0ZWxsIHVzIHdoZXJlIHRoZQorICAgIC8vIExVTnMgYXJlLCBsZXRzIGVuc3VyZSB0aGV5IGFyZSBjb250aWd1b3VzIGZvciBMaW51eCdzCisgICAgLy8gU0NTSSBkcml2ZXIgc2Nhbiwgd2hpY2ggZXhwZWN0cyB0aGVtIHRvIHN0YXJ0IGF0IDAuCisgICAgLy8gU2luY2UgTGludXggb25seSBzdXBwb3J0cyA4IExVTnMsIG9ubHkgY29weSB0aGUgZmlyc3QKKyAgICAvLyBlaWdodCBmcm9tIHRoZSByZXBvcnQgbHVucyBjb21tYW5kCisKKyAgICAvLyBlLmcuLCB0aGUgQ29tcGFxIFJBNHgwMCBmL3cgUmV2IDIuNTQgYW5kIGFib3ZlIG1heSByZXBvcnQKKyAgICAvLyBMVU5zIDQwMDEsIDQwMDQsIGV0Yy4sIGJlY2F1c2Ugb3RoZXIgTFVOcyBhcmUgbWFza2VkIGZyb20KKyAgICAvLyB0aGlzIEhCQSAob3duZWQgYnkgc29tZW9uZSBlbHNlKS4gIFdlJ2xsIG1ha2UgdGhvc2UgYXBwZWFyIGFzCisgICAgLy8gTFVOIDAsIDEuLi4gdG8gTGludXgKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIGludCBBcHBlbmRMdW5MaXN0ID0gMDsKKyAgICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgTFVOIGxpc3QuICBUaGUgJ2onIGFycmF5IG51bWJlciBpcworICAgICAgLy8gTGludXgncyBsdW4gIywgd2hpbGUgdGhlIHZhbHVlIG9mIC5sdW5bal0gaXMgdGhlIHRhcmdldCdzCisgICAgICAvLyBsdW4gIy4KKyAgICAgIC8vIE9uY2Ugd2UgYnVpbGQgYSBMVU4gbGlzdCwgaXQncyBwb3NzaWJsZSBmb3IgYSBrbm93biBkZXZpY2UgCisgICAgICAvLyB0byBnbyBvZmZsaW5lIHdoaWxlIHZvbHVtZXMgKExVTnMpIGFyZSBhZGRlZC4gIExhdGVyLAorICAgICAgLy8gdGhlIGRldmljZSB3aWxsIGRvIGFub3RoZXIgUExPR0kgLi4uIFJlcG9ydCBMdW5zIGNvbW1hbmQsCisgICAgICAvLyBhbmQgd2UgbXVzdCBub3QgYWx0ZXIgdGhlIGV4aXN0aW5nIExpbnV4IEx1biBtYXAuCisgICAgICAvLyAoVGhpcyB3aWxsIGJlIHZlcnkgcmFyZSkuCisgICAgICBmb3IoIGo9MDsgaiA8IENQUUZDVFNfTUFYX0xVTjsgaisrKQorICAgICAgeworICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltqXSAhPSAweEZGICkKKwl7CisJICBBcHBlbmRMdW5MaXN0ID0gMTsKKwkgIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICAgIGlmKCBBcHBlbmRMdW5MaXN0ICkKKyAgICAgIHsKKwlpbnQgazsKKyAgICAgICAgaW50IEZyZWVMdW5JbmRleDsKKy8vICAgICAgICBwcmludGsoImNwcWZjVFM6IEFwcGVuZEx1bkxpc3RcbiIpOworCisJLy8gSWYgd2UgZ2V0IGEgbmV3IFJlcG9ydCBMdW5zLCB3ZSBjYW5ub3QgY2hhbmdlCisJLy8gYW55IGV4aXN0aW5nIExVTiBtYXBwaW5nISAoT25seSBhZGRpdGl2ZSBlbnRyeSkKKwkvLyBGb3IgYWxsIExVTnMgaW4gUmVwb3J0THVuIGxpc3QKKwkvLyBpZiBSTCBsdW4gIT0gU2NzaU5leHVzIGx1bgorCS8vICAgaWYgUkwgbHVuIHByZXNlbnQgaW4gU2NzaU5leHVzIGx1bltdLCBjb250aW51ZQorCS8vICAgZWxzZSBmaW5kIFNjc2lOZXh1cyBsdW5bXT09RkYgYW5kIGFkZCwgY29udGludWUKKwkKKyAgICAgICAgZm9yKCBpPTgsIGo9MDsgaTxMdW5MaXN0TGVuKzggJiYgajwgQ1BRRkNUU19NQVhfTFVOOyBpKz04LCBqKyspCisJeworICAgICAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2pdICE9IHVjQnVmZltpKzFdICkKKwkgIHsKKwkgICAgLy8gc29tZXRoaW5nIGNoYW5nZWQgZnJvbSB0aGUgbGFzdCBSZXBvcnQgTHVucworCSAgICBwcmludGsoIiBjcHFmY1RTOiBSZXBvcnQgTHVuIGNoYW5nZSFcbiIpOworCSAgICBmb3IoIGs9MCwgRnJlZUx1bkluZGV4PUNQUUZDVFNfTUFYX0xVTjsgCisgICAgICAgICAgICAgICAgIGsgPCBDUFFGQ1RTX01BWF9MVU47IGsrKykKKyAgICAgICAgICAgIHsKKwkgICAgICBpZiggcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltrXSA9PSAweEZGKQorCSAgICAgIHsKKwkJRnJlZUx1bkluZGV4ID0gazsKKwkJYnJlYWs7CisJICAgICAgfQorICAgICAgICAgICAgICBpZiggcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltrXSA9PSB1Y0J1ZmZbaSsxXSApCisJCWJyZWFrOyAvLyB3ZSBhbHJlYWR5IG1hc2tlZCB0aGlzIGx1bgorCSAgICB9CisJICAgIGlmKCBrID49IENQUUZDVFNfTUFYX0xVTiApCisJICAgIHsKKwkgICAgICBwcmludGsoIiBubyByb29tIGZvciBuZXcgTFVOICVkXG4iLCB1Y0J1ZmZbaSsxXSk7CisJICAgIH0KKwkgICAgZWxzZSBpZiggayA9PSBGcmVlTHVuSW5kZXggKSAgLy8gbmVlZCB0byBhZGQgTFVOCisJICAgIHsKKwkgICAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2tdID0gdWNCdWZmW2krMV07CisvLwkgICAgICBwcmludGsoImFkZCBbJWRdLT4lMDJkXG4iLCBrLCBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2tdKTsKKwkgICAgICAKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBsdW4gYWxyZWFkeSBrbm93bgorCSAgICB9CisJICAgIGJyZWFrOworCSAgfQorCX0KKwkvLyBwcmludCBvdXQgdGhlIG5ldyBsaXN0Li4uCisJZm9yKCBqPTA7IGo8IENQUUZDVFNfTUFYX0xVTjsgaisrKQorCXsKKwkgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2pdID09IDB4RkYpCisJICAgIGJyZWFrOyAvLyBkb25lCisvLwkgIHByaW50aygiWyVkXS0+JTAyZCAiLCBqLCBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMubHVuW2pdKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisvLwkgIHByaW50aygiTGludXggU0NTSSBMVU5zW10gLT4gRGV2aWNlIExVTnM6ICIpOworCS8vIGZpcnN0IHRpbWUgLSB0aGlzIGlzIGVhc3kKKyAgICAgICAgZm9yKCBpPTgsIGo9MDsgaTxMdW5MaXN0TGVuKzggJiYgajwgQ1BRRkNUU19NQVhfTFVOOyBpKz04LCBqKyspCisJeworICAgICAgICAgIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5bal0gPSB1Y0J1ZmZbaSsxXTsKKy8vCSAgcHJpbnRrKCJbJWRdLT4lMDJkICIsIGosIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5bal0pOworCX0KKy8vCXByaW50aygiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworRG9uZTogOworfQorCitleHRlcm4gaW50IGlzX3ByaXZhdGVfZGF0YV9vZl9jcHFmYyhDUFFGQ0hCQSAqaGJhLCB2b2lkICogcG9pbnRlcik7CitleHRlcm4gdm9pZCBjcHFmY19mcmVlX3ByaXZhdGVfZGF0YShDUFFGQ0hCQSAqaGJhLCBjcHFmY19wYXNzdGhydV9wcml2YXRlX3QgKmRhdGEpOworCitzdGF0aWMgdm9pZCAKK2NhbGxfc2NzaV9kb25lKFNjc2lfQ21uZCAqQ21uZCkKK3sKKwlDUFFGQ0hCQSAqaGJhOworCWhiYSA9IChDUFFGQ0hCQSAqKSBDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCS8vIFdhcyB0aGlzIGNvbW1hbmQgYSBjcHFmYyBwYXNzdGhydSBpb2N0bCA/CisgICAgICAgIGlmIChDbW5kLT5zY19yZXF1ZXN0ICE9IE5VTEwgJiYgQ21uZC0+ZGV2aWNlLT5ob3N0ICE9IE5VTEwgJiYgCisJCUNtbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEgIT0gTlVMTCAmJgorCQlpc19wcml2YXRlX2RhdGFfb2ZfY3BxZmMoKENQUUZDSEJBICopIENtbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEsCisJCQlDbW5kLT5zY19yZXF1ZXN0LT51cHBlcl9wcml2YXRlX2RhdGEpKSB7CisJCWNwcWZjX2ZyZWVfcHJpdmF0ZV9kYXRhKGhiYSwgCisJCQlDbW5kLT5zY19yZXF1ZXN0LT51cHBlcl9wcml2YXRlX2RhdGEpOwkKKwkJQ21uZC0+c2NfcmVxdWVzdC0+dXBwZXJfcHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJQ21uZC0+cmVzdWx0ICY9IDB4ZmYwMGZmZmY7CisJCUNtbmQtPnJlc3VsdCB8PSAoRElEX1BBU1NUSFJPVUdIIDw8IDE2KTsgIC8vIHByZXZlbnRzIHJldHJ5CisJfQorCWlmIChDbW5kLT5zY3NpX2RvbmUgIT0gTlVMTCkKKwkJKCpDbW5kLT5zY3NpX2RvbmUpKENtbmQpOworfQorCisvLyBBZnRlciBzdWNjZXNzZnVsbHkgZ2V0dGluZyBhICJQcm9jZXNzIExvZ2luIiAoUFJMSSkgZnJvbSBhbgorLy8gRkMgcG9ydCwgd2Ugd2FudCB0byBEaXNjb3ZlciB0aGUgTFVOcyBzbyB0aGF0IHdlIGtub3cgdGhlCisvLyBhZGRyZXNzaW5nIHR5cGUgKGUuZy4sIEZDUC1TQ1NJIFZvbHVtZSBTZXQgQWRkcmVzcywgUGVyaXBoZXJhbAorLy8gVW5pdCBEZXZpY2UpLCBhbmQgd2hldGhlciBTU1AgKFNlbGVjdGl2ZSBTdG9yYWdlIFByZXNlbnRhdGlvbiBvcgorLy8gTHVuIE1hc2tpbmcpIGhhcyBtYWRlIHRoZSBMVU4gbnVtYmVycyBub24temVybyBiYXNlZCBvciAKKy8vIG5vbi1jb250aWd1b3VzLiAgVG8gcmVtYWluIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCB0aGUgU0NTSS0yCisvLyBkcml2ZXIgbW9kZWwsIHdoaWNoIGV4cGVjdHMgYSBjb250aWd1b3VzIExVTnMgc3RhcnRpbmcgYXQgMCwKKy8vIHdpbGwgdXNlIHRoZSBSZXBvcnRMdW5zIGluZm8gdG8gbWFwIGZyb20gImRldmljZSIgdG8gIkxpbnV4IiAKKy8vIExVTnMuCitzdGF0aWMgdm9pZCBJc3N1ZVJlcG9ydEx1bnNDb21tYW5kKCAKKyAgICAgICAgICAgICAgQ1BRRkNIQkEqIGNwcWZjSEJBZGF0YSwgCisJICAgICAgVGFjaEZDSERSX0dDTU5EKiBmY2hzKQoreworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQ7IAorICBzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kID0gTlVMTDsKKyAgc3RydWN0IHNjc2lfZGV2aWNlICpTY3NpRGV2ID0gTlVMTDsKKyAgTE9ORyB4X0lEOworICBVTE9ORyB1bFN0YXR1czsKKyAgVUNIQVIgKnVjQnVmZjsKKworICBpZiggIWNwcWZjSEJBZGF0YS0+UG9ydERpc2NEb25lKSAvLyBjbGVhcmVkIGJ5IExEbgorICB7CisgICAgcHJpbnRrKCJEaXNjYXJkIFEnZCBSZXBvcnRMdW4gY29tbWFuZFxuIik7CisgICAgZ290byBEb25lOworICB9CisKKyAgLy8gZmluZCB0aGUgZGV2aWNlIChmcm9tIHBvcnRfaWQpIHdlJ3JlIHRhbGtpbmcgdG8KKyAgcExvZ2dlZEluUG9ydCA9IGZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorICAgICAgICBOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIFNjc2kgTmV4dXMgCisgIAlmY2hzLT5zX2lkICYgMHhGRkZGRkYsICAgICAgICAKKwlOVUxMLCAgICAgLy8gRE9OJ1Qgc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBGQyBXV04KKyAgICAgICAgTlVMTCk7ICAgIC8vIERPTidUIGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKyAgaWYoIHBMb2dnZWRJblBvcnQgKSAvLyB3ZSdkIEJFVFRFUiBmaW5kIGl0IQorICB7CisKKworICAgIGlmKCAhKHBMb2dnZWRJblBvcnQtPmZjcF9pbmZvICYgVEFSR0VUX0ZVTkNUSU9OKSApCisgICAgICBnb3RvIERvbmU7ICAvLyBmb3JnZXQgaXQgLSBGQyBkZXZpY2Ugbm90IGEgInRhcmdldCIKKworIAorICAgIFNjc2lEZXYgPSBzY3NpX2dldF9ob3N0X2RldiAoY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlcik7CisgICAgaWYgKCFTY3NpRGV2KQorICAgICAgZ290byBEb25lOworICAgIAorICAgIENtbmQgPSBzY3NpX2dldF9jb21tYW5kIChTY3NpRGV2LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIUNtbmQpIAorICAgICAgZ290byBEb25lOworCisgICAgdWNCdWZmID0gcExvZ2dlZEluUG9ydC0+UmVwb3J0THVuc1BheWxvYWQ7CisgICAgCisgICAgbWVtc2V0KCB1Y0J1ZmYsIDAsIFJFUE9SVF9MVU5TX1BMKTsKKyAgICAKKyAgICBDbW5kLT5zY3NpX2RvbmUgPSBTY3NpUmVwb3J0THVuc0RvbmU7CisKKyAgICBDbW5kLT5yZXF1ZXN0X2J1ZmZlciA9IHBMb2dnZWRJblBvcnQtPlJlcG9ydEx1bnNQYXlsb2FkOyAKKyAgICBDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4gPSBSRVBPUlRfTFVOU19QTDsgCisJICAgIAorICAgIENtbmQtPmNtbmRbMF0gPSAweEEwOworICAgIENtbmQtPmNtbmRbOF0gPSBSRVBPUlRfTFVOU19QTCA+PiA4OworICAgIENtbmQtPmNtbmRbOV0gPSAoVUNIQVIpUkVQT1JUX0xVTlNfUEw7CisgICAgQ21uZC0+Y21kX2xlbiA9IDEyOworCisgICAgQ21uZC0+ZGV2aWNlLT5jaGFubmVsID0gcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmNoYW5uZWw7CisgICAgQ21uZC0+ZGV2aWNlLT5pZCA9IHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy50YXJnZXQ7CisKKwkgICAgCisgICAgdWxTdGF0dXMgPSBjcHFmY1RTQnVpbGRFeGNoYW5nZSgKKyAgICAgIGNwcWZjSEJBZGF0YSwKKyAgICAgIFNDU0lfSVJFLCAKKyAgICAgIGZjaHMsCisgICAgICBDbW5kLCAgICAgICAgIC8vIGJ1ZmZlciBmb3IgUmVwb3J0IEx1biBkYXRhCisgICAgICAmeF9JRCApOy8vIGZjQ29udHJvbGxlci0+ZmNFeGNoYW5nZXMgaW5kZXgsIC0xIGlmIGZhaWxlZAorCisgICAgaWYoICF1bFN0YXR1cyApIC8vIEV4Y2hhbmdlIHNldHVwPworICAgIHsKKyAgICAgIHVsU3RhdHVzID0gY3BxZmNUU1N0YXJ0RXhjaGFuZ2UoIGNwcWZjSEJBZGF0YSwgeF9JRCApOworICAgICAgaWYoICF1bFN0YXR1cyApCisgICAgICB7CisgICAgICAgIC8vIHN1Ym1pdHRlZCB0byBUYWNoJ3MgT3V0Ym91bmQgUXVlIChFUlEgUEkgaW5jcmVtZW50ZWQpCisgICAgICAgIC8vIHdhaXRlZCBmb3IgY29tcGxldGlvbiBmb3IgRUxTIHR5cGUgKExvZ2luIGZyYW1lcyBpc3N1ZWQKKyAgICAgICAgLy8gc3luY2hyb25vdXNseSkKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgLy8gY2hlY2sgcmVhc29uIGZvciBFeGNoYW5nZSBub3QgYmVpbmcgc3RhcnRlZCAtIHdlIG1pZ2h0CisgICAgICAgIC8vIHdhbnQgdG8gUXVldWUgYW5kIHN0YXJ0IGxhdGVyLCBvciBmYWlsIHdpdGggZXJyb3IKKyAgICAgIHsKKyAgCisgICAgICB9CisgICAgfQorCisgICAgZWxzZSAgIC8vIFhjaGFuZ2Ugc2V0dXAgZmFpbGVkLi4uCisgICAgICBwcmludGsoIiBjcHFmY1RTQnVpbGRFeGNoYW5nZSBmYWlsZWQ6ICVYaFxuIiwgdWxTdGF0dXMgKTsKKyAgfQorICBlbHNlICAgICAvLyBsaWtlLCB3ZSBqdXN0IGdvdCBhIFBSTEkgQUNDLCBhbmQgbm93IHRoZSBwb3J0IGlzIGdvbmU/CisgIHsKKyAgICBwcmludGsoIiBjYW4ndCBzZW5kIFJlcG9ydEx1bnMgLSBubyBsb2dpbiBmb3IgcG9ydF9pZCAlWGhcbiIsCisJICAgIGZjaHMtPnNfaWQgJiAweEZGRkZGRik7CisgIH0KKworCisKK0RvbmU6CisKKyAgaWYgKENtbmQpCisgICAgc2NzaV9wdXRfY29tbWFuZCAoQ21uZCk7CisgIGlmIChTY3NpRGV2KSAKKyAgICBzY3NpX2ZyZWVfaG9zdF9kZXYgKFNjc2lEZXYpOworfQorCisKKworCisKKworCitzdGF0aWMgdm9pZCBDb21wbGV0ZUJvYXJkTG9ja0NtbmQoIENQUUZDSEJBICpjcHFmY0hCQWRhdGEpCit7CisgIGludCBpOworICBmb3IoIGkgPSBDUFFGQ1RTX1JFUV9RVUVVRV9MRU4tMTsgaT49IDA7IGktLSkKKyAgeworICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJvYXJkTG9ja0NtbmRbaV0gIT0gTlVMTCApCisgICAgeworICAgICAgU2NzaV9DbW5kICpDbW5kID0gY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2tDbW5kW2ldOworICAgICAgY3BxZmNIQkFkYXRhLT5Cb2FyZExvY2tDbW5kW2ldID0gTlVMTDsKKyAgICAgIENtbmQtPnJlc3VsdCA9IChESURfU09GVF9FUlJPUiA8PCAxNik7ICAvLyBhc2sgZm9yIHJldHJ5CisvLyAgICAgIHByaW50aygiIEJvYXJkTG9ja0NtbmRbJWRdICVwIENvbXBsZXRlLCBjaG5sL3RhcmdldC9sdW4gJWQvJWQvJWRcbiIsCisvLyAgICAgICAgaSxDbW5kLCBDbW5kLT5jaGFubmVsLCBDbW5kLT50YXJnZXQsIENtbmQtPmx1bik7CisgICAgICBjYWxsX3Njc2lfZG9uZShDbW5kKTsKKyAgICB9CisgIH0KK30KKworCisKKworCisKKy8vIHJ1bnMgZXZlcnkgMSBzZWNvbmQgZm9yIEZDIGV4Y2hhbmdlIHRpbWVvdXRzIGFuZCBpbXBsaWNpdCBGQyBkZXZpY2UgbG9nb3V0cworCit2b2lkIGNwcWZjVFNoZWFydGJlYXQoIHVuc2lnbmVkIGxvbmcgcHRyICkKK3sKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSA9IChDUFFGQ0hCQSAqKXB0cjsKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0ID0gJmZjQ2hpcC0+ZmNQb3J0czsgCisgIFVMT05HIGk7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIERFQ0xBUkVfTVVURVhfTE9DS0VEKEJvYXJkTG9jayk7CisgIAorICBQQ0lfVFJBQ0UoIDB4QTgpCisKKyAgaWYoIGNwcWZjSEJBZGF0YS0+Qm9hcmRMb2NrKSAvLyBXb3JrZXIgVGFzayBSdW5uaW5nPworICAgIGdvdG8gU2tpcDsKKworICAvLyBTVE9QIF9xdWUgZnVuY3Rpb24KKyAgc3Bpbl9sb2NrX2lycXNhdmUoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmhvc3RfbG9jaywgZmxhZ3MpOyAKKworICBQQ0lfVFJBQ0UoIDB4QTgpCisKKworICBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jayA9ICZCb2FyZExvY2s7IC8vIHN0b3AgTGludXggU0NTSSBjb21tYW5kIHF1ZXVpbmcKKyAgCisgIC8vIHJlbGVhc2UgdGhlIElPIGxvY2sgKGFuZCByZS1lbmFibGUgaW50ZXJydXB0cykKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+aG9zdF9sb2NrLCBmbGFncyk7CisgIAorICAvLyBFbnN1cmUgbm8gY29udGVudGlvbiBmcm9tICBfcXVlY29tbWFuZCBvciBXb3JrZXIgcHJvY2VzcyAKKyAgQ1BRX1NQSU5MT0NLX0hCQSggY3BxZmNIQkFkYXRhKQorICAKKyAgUENJX1RSQUNFKCAweEE4KQorICAKKworICBkaXNhYmxlX2lycSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+aXJxKTsgIC8vIG91ciBJUlEKKworICAvLyBDb21wbGV0ZSB0aGUgImJhZCB0YXJnZXQiIGNvbW1hbmRzIChub3JtYWxseSBvbmx5IHVzZWQgZHVyaW5nCisgIC8vIGluaXRpYWxpemF0aW9uLCBzaW5jZSB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gY2FsbCAic2NzaV9kb25lIgorICAvLyBpbnNpZGUgdGhlIHF1ZXVlY29tbWFuZCgpIGZ1bmN0aW9uKS4gICh0aGlzIGlzIG92ZXJseSBjb250b3J0ZWQsCisgIC8vIHNjc2lfZG9uZSBjYW4gYmUgc2FmZWx5IGNhbGxlZCBmcm9tIHF1ZXVlY29tbWFuZCBmb3IKKyAgLy8gdGhpcyBiYWQgdGFyZ2V0IGNhc2UuICBNYXkgd2FudCB0byBzaW1wbGlmeSB0aGlzIGxhdGVyKQorCisgIGZvciggaT0wOyBpPCBDUFFGQ1RTX01BWF9UQVJHRVRfSUQ7IGkrKykKKyAgeworICAgIGlmKCBjcHFmY0hCQWRhdGEtPkJhZFRhcmdldENtbmRbaV0gKQorICAgIHsKKyAgICAgIFNjc2lfQ21uZCAqQ21uZCA9IGNwcWZjSEJBZGF0YS0+QmFkVGFyZ2V0Q21uZFtpXTsKKyAgICAgIGNwcWZjSEJBZGF0YS0+QmFkVGFyZ2V0Q21uZFtpXSA9IE5VTEw7CisgICAgICBDbW5kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworICAgICAgY2FsbF9zY3NpX2RvbmUoQ21uZCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisKKyAgCisgIC8vIGxvZ2dlZCBpbiBwb3J0cyAtLSByZS1sb2dpbiBjaGVjayAocG9ydHMgcmVxdWlyZWQgdG8gdmVyaWZ5IGxvZ2luIHdpdGgKKyAgLy8gUERJU0MgYWZ0ZXIgTElQIHdpdGhpbiAyIHNlY3MpCisKKyAgLy8gcHJldmVudCBjb250ZW50aW9uCisgIHdoaWxlKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gZm9yIGFsbCBwb3J0cyB3aGljaCBhcmUgZXhwZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUERJU0MgYWZ0ZXIgdGhlIG5leHQgTElQLCBjaGVjayB0byBzZWUgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lIGlzIHVwIQorICB7CisgICAgICAvLyBJbXBvcnRhbnQ6IHdlIG9ubHkgZGV0ZWN0ICJ0aW1lb3V0IiBjb25kaXRpb24gb24gVFJBTlNJVElPTgorICAgICAgLy8gZnJvbSBub24temVybyB0byB6ZXJvCisgICAgaWYoIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgKSAgLy8gdGltZS1vdXQgImFybWVkIj8KKyAgICB7CisgICAgICBpZiggISgtLXBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIpICkgLy8gREVDIGZyb20gMSB0byAwPworICAgICAgeworICAgICAgICAgIC8vIExPR09VVCB0aW1lISAgUGVyIFBMREEsIFBESVNDIGhhc24ndCBjb21wbGV0ZSBpbiAyIHNlY3MsIHNvCisgICAgICAgICAgLy8gaXNzdWUgTE9HTyByZXF1ZXN0IGFuZCBkZXN0cm95IGFsbCBJL08gd2l0aCBvdGhlciBGQyBwb3J0KHMpLgorICAgICAgICAKKy8qICAgICAgICAgIAorICAgICAgICBwcmludGsoIiB+Y3BxZmNUUyBoZWFydGJlYXQ6IExPR091dCF+ICIpOworICAgICAgICBwcmludGsoIkxpbnV4IFNDU0kgQ2hhbmwvVGFyZ2V0ICVkLyVkIChwb3J0X2lkICUwNlhoKSBXV04gJTA4WCUwOFhcbiIsIAorICAgICAgICBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuY2hhbm5lbCwgCisgICAgICAgIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy50YXJnZXQsIAorCXBMb2dnZWRJblBvcnQtPnBvcnRfaWQsCisgICAgICAgICAgKFVMT05HKShwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOICYweEZGRkZGRkZGKSwgCisgICAgICAgICAgKFVMT05HKShwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOPj4zMikpOworCisqLworICAgICAgICBjcHFmY1RTSW1wbGljaXRMb2dvdXQoIGNwcWZjSEJBZGF0YSwgcExvZ2dlZEluUG9ydCk7CisKKyAgICAgIH0KKyAgICAgIC8vIGVsc2Ugc2ltcGx5IGRlY3JlbWVudGVkIC0gbWF5YmUgbmV4dCB0aW1lLi4uCisgICAgfQorICAgIHBMb2dnZWRJblBvcnQgPSBwTG9nZ2VkSW5Qb3J0LT5wTmV4dFBvcnQ7CisgIH0KKworCisKKyAgCisgIAorICAvLyAqKioqKioqKioqKiogIEZDIEVYQ0hBTkdFIFRJTUVPVVQgQ0hFQ0sgKioqKioqKioqKioqKioKKyAgCisgIGZvciggaT0wOyBpPCBUQUNIX01BWF9YSUQ7IGkrKykKKyAgeworICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udHlwZSApICAvLyBleGNoYW5nZSBkZWZpbmVkPworICAgIHsKKworICAgICAgaWYoICFFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbaV0udGltZU91dCApIC8vIHRpbWUgZXhwaXJlZAorICAgICAgeworICAgICAgICAvLyBTZXQgRXhjaGFuZ2UgdGltZW91dCBzdGF0dXMKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnN0YXR1cyB8PSBGQzJfVElNRU9VVDsKKworICAgICAgICBpZiggaSA+PSBUQUNIX1NFU1RfTEVOICkgLy8gTGluayBTZXJ2aWNlIEV4Y2hhbmdlCisgICAgICAgIHsKKyAgICAgICAgICBjcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIGZjQ2hpcCwgaSk7ICAvLyBEb24ndCAiYWJvcnQiIExpbmtTZXJ2aWNlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGVsc2UgIC8vIFNFU1QgRXhjaGFuZ2UgVE8gLS0gbWF5IHBvc3QgQUJUUyB0byBXb3JrZXIgVGhyZWFkIFF1ZQorICAgICAgICB7CisJICAvLyAoTWFrZSBzdXJlIHdlIGRvbid0IGtlZXAgdGltaW5nIGl0IG91dDsgbGV0IG90aGVyIGZ1bmN0aW9ucworCSAgLy8gY29tcGxldGUgaXQgb3Igc2V0IHRoZSB0aW1lT3V0IGFzIG5lZWRlZCkKKwkgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50aW1lT3V0ID0gMzAwMDA7IC8vIHNlY29uZHMgZGVmYXVsdAorCisgICAgICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlIAorICAgICAgICAgICAgICAgICAgJiAKKyAgICAgICAgICAgICAgKEJMU19BQlRTIHwgQkxTX0FCVFNfQUNDICkgICkKKyAgICAgICAgICB7CisJICAgIC8vIEZvciBCTFNfQUJUUyosIGFuIHVwcGVyIGxldmVsIG1pZ2h0IHN0aWxsIGhhdmUKKwkgICAgLy8gYW4gb3V0c3RhbmRpbmcgY29tbWFuZCB3YWl0aW5nIGZvciBsb3ctbGV2ZWwgY29tcGxldGlvbi4KKwkgICAgLy8gQWxzbywgaW4gdGhlIGNhc2Ugb2YgYSBXUklURSwgd2UgTVVTVCBnZXQgY29uZmlybWF0aW9uCisJICAgIC8vIG9mIGVpdGhlciBBQlRTIEFDQyBvciBSSlQgYmVmb3JlIHJlLXVzaW5nIHRoZSBFeGNoYW5nZS4KKwkgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBSQUlEIGNhY2hlIGFsZ29yaXRobSBjYW4gaGFuZworCSAgICAvLyBpZiB3ZSBmYWlsIHRvIGNvbXBsZXRlIGEgV1JJVEUgdG8gYSBMQkEsIHdoZW4gYSBSRUFECisJICAgIC8vIGNvbWVzIGxhdGVyIHRvIHRoYXQgc2FtZSBMQkEuICBUaGVyZWZvcmUsIHdlIG11c3QKKwkgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHRhcmdldCB2ZXJpZmllcyByZWNlaXB0IG9mIEFCVFMgZm9yCisJICAgIC8vIHRoZSBleGNoYW5nZQorCSAgIAorCSAgICBwcmludGsoIn5UTyBRJ2QgQUJUUyAoeF9JRCAlWGgpfiAiLCBpKTsgCisvLyAgICAgICAgICAgIFRyaWdnZXJIQkEoIGZjQ2hpcC0+UmVnaXN0ZXJzLlJlTWFwTWVtQmFzZSk7CisKKwkgICAgLy8gT24gdGltZW91dCBvZiBhIEFCVFMgZXhjaGFuZ2UsIGNoZWNrIHRvCisJICAgIC8vIHNlZSBpZiB0aGUgRkMgZGV2aWNlIGhhcyBhIGN1cnJlbnQgdmFsaWQgbG9naW4uCisJICAgIC8vIElmIHNvLCByZXN0YXJ0IGl0LgorCSAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCBmY0NoaXAsCisgICAgICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS5DbW5kLCAvLyBmaW5kIFNjc2kgTmV4dXMKKyAgICAgICAgICAgICAgMCwgICAgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgcG9ydCBpZAorCSAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggbGlua2VkIGxpc3QgZm9yIEZDIFdXTgorICAgICAgICAgICAgICBOVUxMKTsgICAgLy8gRE9OJ1QgY2FyZSBhYm91dCBlbmQgb2YgbGlzdAorCisJICAgIC8vIGRldmljZSBleGlzdHM/CisJICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gZGV2aWNlIGV4aXN0cz8KKwkgICAgeworCSAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5wcmxpICkgLy8gbG9nZ2VkIGluIGZvciBGQ1AtU0NTST8KKwkgICAgICB7CisJCS8vIGF0dGVtcHQgdG8gcmVzdGFydCB0aGUgQUJUUworCQlwcmludGsoIiB+cmVzdGFydGluZyBBQlRTfiAiKTsKKyAgICAgICAgICAgICAgICBjcHFmY1RTU3RhcnRFeGNoYW5nZSggY3BxZmNIQkFkYXRhLCBpICk7CisKKwkgICAgICB9CisJICAgIH0KKyAgICAgICAgICB9CisJICBlbHNlICAvLyBub3QgYW4gQUJUUworCSAgeyAKKyAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSBleHBlY3QgdGhlIFdvcmtlclRocmVhZCB0byBjaGFuZ2UgdGhlIHhjaG5nIHR5cGUgdG8KKyAgICAgICAgICAgIC8vIGFib3J0IGFuZCBzZXQgYXBwcm9wcmlhdGUgdGltZW91dC4KKyAgICAgICAgICAgIGNwcWZjVFNQdXRMaW5rUXVlKCBjcHFmY0hCQWRhdGEsIEJMU19BQlRTLCAmaSApOyAvLyB0aW1lZC1vdXQKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAgLy8gdGltZSBub3QgZXhwaXJlZC4uLgorICAgICAgeworICAgICAgICAvLyBkZWNyZW1lbnQgdGltZW91dDogMSBvciBtb3JlIHNlY29uZHMgbGVmdAorICAgICAgICAtLUV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50aW1lT3V0OworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgZW5hYmxlX2lycSggY3BxZmNIQkFkYXRhLT5Ib3N0QWRhcHRlci0+aXJxKTsKKyAKKworICBDUFFfU1BJTlVOTE9DS19IQkEoIGNwcWZjSEJBZGF0YSkKKworICBjcHFmY0hCQWRhdGEtPkJvYXJkTG9jayA9IE5VTEw7IC8vIExpbnV4IFNDU0kgY29tbWFuZHMgbWF5IGJlIHF1ZXVlZAorCisgIC8vIE5vdywgY29tcGxldGUgYW55IENtbmQgd2UgUSdkIHVwIHdoaWxlIEJvYXJkTG9jayB3YXMgaGVsZAorCisgIENvbXBsZXRlQm9hcmRMb2NrQ21uZCggY3BxZmNIQkFkYXRhKTsKKyAKKworICAvLyByZXN0YXJ0IHRoZSB0aW1lciB0byBydW4gYWdhaW4gKDEgc2VjIGxhdGVyKQorU2tpcDoKKyAgbW9kX3RpbWVyKCAmY3BxZmNIQkFkYXRhLT5jcHFmY1RTdGltZXIsIGppZmZpZXMgKyBIWik7CisgIAorICBQQ0lfVFJBQ0VPKCBpLCAweEE4KQorICByZXR1cm47Cit9CisKKworLy8gcHV0IHZhbGlkIEZDLUFMIHBoeXNpY2FsIGFkZHJlc3MgaW4gc3BlYyBvcmRlcgorc3RhdGljIGNvbnN0IFVDSEFSIHZhbGlkX2FsX3BhW109eworICAgIDB4ZWYsIDB4ZTgsIDB4ZTQsIDB4ZTIsIAorICAgIDB4ZTEsIDB4RTAsIDB4REMsIDB4REEsIAorICAgIDB4RDksIDB4RDYsIDB4RDUsIDB4RDQsIAorICAgIDB4RDMsIDB4RDIsIDB4RDEsIDB4Q2UsIAorICAgIDB4Q2QsIDB4Q2MsIDB4Q2IsIDB4Q2EsIAorICAgIDB4QzksIDB4QzcsIDB4QzYsIDB4QzUsIAorICAgIDB4QzMsIDB4QmMsIDB4QmEsIDB4QjksCisgICAgMHhCNiwgMHhCNSwgMHhCNCwgMHhCMywgCisgICAgMHhCMiwgMHhCMSwgMHhhZSwgMHhhZCwKKyAgICAweEFjLCAweEFiLCAweEFhLCAweEE5LCAKKworICAgIDB4QTcsIDB4QTYsIDB4QTUsIDB4QTMsIAorICAgIDB4OWYsIDB4OWUsIDB4OWQsIDB4OWIsIAorICAgIDB4OTgsIDB4OTcsIDB4OTAsIDB4OGYsIAorICAgIDB4ODgsIDB4ODQsIDB4ODIsIDB4ODEsIAorICAgIDB4ODAsIDB4N2MsIDB4N2EsIDB4NzksIAorICAgIDB4NzYsIDB4NzUsIDB4NzQsIDB4NzMsIAorICAgIDB4NzIsIDB4NzEsIDB4NmUsIDB4NmQsIAorICAgIDB4NmMsIDB4NmIsIDB4NmEsIDB4NjksIAorICAgIDB4NjcsIDB4NjYsIDB4NjUsIDB4NjMsIAorICAgIDB4NWMsIDB4NWEsIDB4NTksIDB4NTYsIAorICAgIAorICAgIDB4NTUsIDB4NTQsIDB4NTMsIDB4NTIsIAorICAgIDB4NTEsIDB4NGUsIDB4NGQsIDB4NGMsIAorICAgIDB4NGIsIDB4NGEsIDB4NDksIDB4NDcsIAorICAgIDB4NDYsIDB4NDUsIDB4NDMsIDB4M2MsCisgICAgMHgzYSwgMHgzOSwgMHgzNiwgMHgzNSwgCisgICAgMHgzNCwgMHgzMywgMHgzMiwgMHgzMSwgCisgICAgMHgyZSwgMHgyZCwgMHgyYywgMHgyYiwgCisgICAgMHgyYSwgMHgyOSwgMHgyNywgMHgyNiwgCisgICAgMHgyNSwgMHgyMywgMHgxZiwgMHgxRSwKKyAgICAweDFkLCAweDFiLCAweDE4LCAweDE3LCAKKworICAgIDB4MTAsIDB4MGYsIDgsIDQsIDIsIDEgfTsgLy8gQUxQQSAwIChGYWJyaWMpIGlzIHNwZWNpYWwgY2FzZQorCitjb25zdCBpbnQgbnVtYmVyX29mX2FsX3BhID0gKHNpemVvZih2YWxpZF9hbF9wYSkgKTsKKworCisKKy8vIHRoaXMgZnVuY3Rpb24gbG9va3MgdXAgYW4gYWxfcGEgZnJvbSB0aGUgdGFibGUgb2YgdmFsaWQgYWxfcGEncworLy8gd2UgZGVjcmVtZW50IGZyb20gdGhlIGxhc3QgZGVjaW1hbCBsb29wIElELCBiZWNhdXNlIHNvZnQgYWxfcGEKKy8vIChvdXIgdHlwaWNhbCBjYXNlKSBhcmUgYXNzaWduZWQgd2l0aCBoaWdoZXN0IHByaW9yaXR5IChhbmQgaGlnaCBhbF9wYSkKKy8vIGZpcnN0LiAgU2VlICJJbi1EZXB0aCBGQy1BTCIsIFIuIEtlbWJlbCBwZy4gMzgKKy8vIElOUFVUUzoKKy8vICAgYWxfcGEgLSAyNCBiaXQgcG9ydCBpZGVudGlmaWVyICg4IGJpdCBhbF9wYSBvbiBwcml2YXRlIGxvb3ApCisvLyBSRVRVUk46CisvLyAgTG9vcCBJRCAtIHNlcnZlcyBhcmUgaW5kZXggdG8gYXJyYXkgb2YgbG9nZ2VkIGluIHBvcnRzCisvLyAgLTEgICAgICAtIGludmFsaWQgYWxfcGEgKG5vdCBhbGwgOCBiaXQgdmFsdWVzIGFyZSBsZWdhbCkKKworI2lmICgwKQorc3RhdGljIGludCBHZXRMb29wSUQoIFVMT05HIGFsX3BhICkKK3sKKyAgaW50IGk7CisKKyAgZm9yKCBpID0gbnVtYmVyX29mX2FsX3BhIC0xOyBpID49IDA7IGktLSkgIC8vIGRlYy4KKyAgeworICAgIGlmKCB2YWxpZF9hbF9wYVtpXSA9PSAoVUNIQVIpYWxfcGEgKSAgLy8gdGFrZSBsb3dlc3QgOCBiaXRzCisgICAgICByZXR1cm4gaTsgIC8vIHN1Y2Nlc3MgLSBmb3VuZCB2YWxpZCBhbF9wYTsgcmV0dXJuIGRlY2ltYWwgTG9vcElECisgIH0KKyAgcmV0dXJuIC0xOyAvLyBmYWlsZWQgLSBub3QgZm91bmQKK30KKyNlbmRpZgorCitleHRlcm4gY3BxZmNfcGFzc3RocnVfcHJpdmF0ZV90ICpjcHFmY19wcml2YXRlKFNjc2lfUmVxdWVzdCAqc3IpOworCisvLyBTZWFyY2ggdGhlIHNpbmdseSAoZm9yd2FyZCkgbGlua2VkIGxpc3QgImZjUG9ydHMiIGxvb2tpbmcgZm9yIAorLy8gZWl0aGVyIHRoZSBTQ1NJIHRhcmdldCAoaWYgIT0gLTEpLCBwb3J0X2lkIChpZiBub3QgTlVMTCksIAorLy8gb3IgV1dOIChpZiBub3QgbnVsbCksIGluIHRoYXQgc3BlY2lmaWMgb3JkZXIuCisvLyBJZiB3ZSBmaW5kIGEgU0NTSSBuZXh1cyAoZnJvbSBDbW5kIGFyZyksIHNldCB0aGUgU0NwLnBoYXNlCisvLyBmaWVsZCBhY2NvcmRpbmcgdG8gVlNBIG9yIFBEVQorLy8gUkVUVVJOUzoKKy8vICAgUHRyIHRvIGxvZ2dlZCBpbiBwb3J0IHN0cnVjdCBpZiBmb3VuZAorLy8gICAgIChOVUxMIGlmIG5vdCBmb3VuZCkKKy8vICAgcExhc3RMb2dnZWRJblBvcnQgLSBwdHIgdG8gbGFzdCBzdHJ1Y3QgKGZvciBhZGRpbmcgbmV3IG9uZXMpCisvLyAKK1BGQ19MT0dHRURJTl9QT1JUICBmY0ZpbmRMb2dnZWRJblBvcnQoIAorICBQVEFDSFlPTiBmY0NoaXAsIAorICBTY3NpX0NtbmQgKkNtbmQsIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgU2NzaSBOZXh1cyAoY2hhbm5lbC90YXJnZXQvbHVuKQorICBVTE9ORyBwb3J0X2lkLCAgIC8vIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgYWxfcGEsIG9yCisgIFVDSEFSIHd3bls4XSwgICAgLy8gc2VhcmNoIGxpbmtlZCBsaXN0IGZvciBXV04sIG9yLi4uCisgIFBGQ19MT0dHRURJTl9QT1JUICpwTGFzdExvZ2dlZEluUG9ydCApCisgICAgICAgICAgICAgCit7CisgIFBGQ19MT0dHRURJTl9QT1JUIHBMb2dnZWRJblBvcnQgPSAmZmNDaGlwLT5mY1BvcnRzOyAKKyAgQk9PTEVBTiB0YXJnZXRfaWRfdmFsaWQ9RkFMU0U7CisgIEJPT0xFQU4gcG9ydF9pZF92YWxpZD1GQUxTRTsKKyAgQk9PTEVBTiB3d25fdmFsaWQ9RkFMU0U7CisgIGludCBpOworCisKKyAgaWYoIENtbmQgIT0gTlVMTCApCisgICAgdGFyZ2V0X2lkX3ZhbGlkID0gVFJVRTsKKyAgCisgIGVsc2UgaWYoIHBvcnRfaWQgKSAvLyBub3RlISAyNC1iaXQgTlVMTCBhZGRyZXNzIGlzIGlsbGVnYWwKKyAgICBwb3J0X2lkX3ZhbGlkID0gVFJVRTsKKworICBlbHNlCisgIHsKKyAgICBpZiggd3duICkgLy8gbm9uLW51bGwgYXJnPyAoT0sgdG8gcGFzcyBOVUxMIHdoZW4gbm90IHNlYXJjaGluZyBXV04pCisgICAgeworICAgICAgZm9yKCBpPTA7IGk8ODsgaSsrKSAgLy8gdmFsaWQgV1dOIHBhc3NlZD8gIE5VTEwgV1dOIGludmFsaWQKKyAgICAgIHsKKyAgICAgICAgaWYoIHd3bltpXSAhPSAwICkKKyAgICAgICAgICB3d25fdmFsaWQgPSBUUlVFOyAgLy8gYW55IG5vbi16ZXJvIGJ5dGUgbWFrZXMgKHByZXN1bWFibHkpIHZhbGlkCisgICAgICB9CisgICAgfQorICB9CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgb3RoZXIgb3B0aW9ucyAuLi4KKworCisgIC8vIEluIGNhc2UgbXVsdGlwbGUgc2VhcmNoIG9wdGlvbnMgYXJlIGdpdmVuLCB3ZSB1c2UgYSBwcmlvcml0eQorICAvLyBzY2hlbWU6CisgIC8vIFdoaWxlIHZhbGlkIHBMb2dnZWRJbiBQdHIKKyAgLy8gICBJZiBwb3J0X2lkIGlzIHZhbGlkCisgIC8vICAgICBpZiBwb3J0X2lkIG1hdGNoZXMsIHJldHVybiBQdHIKKyAgLy8gICBJZiB3d24gaXMgdmFsaWQKKyAgLy8gICAgIGlmIHd3biBtYXRjaGVzLCByZXR1cm4gUHRyCisgIC8vICAgTmV4dCBQdHIgaW4gbGlzdAorICAvLworICAvLyBSZXR1cm4gTlVMTCAobm90IGZvdW5kKQorIAorICAgICAgCisgIHdoaWxlKCBwTG9nZ2VkSW5Qb3J0ICkgLy8gTlVMTCBtYXJrcyBlbmQgb2YgbGlzdCAoMXN0IHB0ciBhbHdheXMgdmFsaWQpCisgIHsKKyAgICBpZiggcExhc3RMb2dnZWRJblBvcnQgKSAvLyBjYWxsZXIncyBwb2ludGVyIHZhbGlkPworICAgICAgKnBMYXN0TG9nZ2VkSW5Qb3J0ID0gcExvZ2dlZEluUG9ydDsgIC8vIGVuZCBvZiBsaW5rZWQgbGlzdAorICAgIAorICAgIGlmKCB0YXJnZXRfaWRfdmFsaWQgKQorICAgIHsKKyAgICAgIC8vIGNoZWNrIExpbnV4IFNjc2kgQ21uZCBmb3IgY2hhbm5lbC90YXJnZXQgTmV4dXMgbWF0Y2gKKyAgICAgIC8vIChhbGwgbHVucyBhcmUgYWNjZXNzZWQgdGhyb3VnaCBtYXRjaGluZyAicExvZ2dlZEluUG9ydCIpCisgICAgICBpZiggKHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy50YXJnZXQgPT0gQ21uZC0+ZGV2aWNlLT5pZCkKKyAgICAgICAgICAgICAgICAmJgorICAgICAgICAgIChwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuY2hhbm5lbCA9PSBDbW5kLT5kZXZpY2UtPmNoYW5uZWwpKQorICAgICAgeworICAgICAgICAvLyBGb3IgInBhc3N0aHJ1IiBtb2RlcywgdGhlIElPQ1RMIGNhbGxlciBpcyByZXNwb25zaWJsZQorCS8vIGZvciBzZXR0aW5nIHRoZSBGQ1AtTFVOIGFkZHJlc3NpbmcKKwlpZiAoQ21uZC0+c2NfcmVxdWVzdCAhPSBOVUxMICYmIENtbmQtPmRldmljZS0+aG9zdCAhPSBOVUxMICYmIAorCQlDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhICE9IE5VTEwgJiYKKwkJaXNfcHJpdmF0ZV9kYXRhX29mX2NwcWZjKChDUFFGQ0hCQSAqKSBDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhLAorCQkJQ21uZC0+c2NfcmVxdWVzdC0+dXBwZXJfcHJpdmF0ZV9kYXRhKSkgeyAKKwkJLyogVGhpcyBpcyBhIHBhc3N0aHJ1Li4uICovCisJCWNwcWZjX3Bhc3N0aHJ1X3ByaXZhdGVfdCAqcGQ7CisJCXBkID0gQ21uZC0+c2NfcmVxdWVzdC0+dXBwZXJfcHJpdmF0ZV9kYXRhOworICAgICAgICAJQ21uZC0+U0NwLnBoYXNlID0gcGQtPmJ1czsKKwkJLy8gQ21uZC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBkLT5wZHJpdmU7CisJCUNtbmQtPlNDcC5oYXZlX2RhdGFfaW4gPSBDbW5kLT5kZXZpY2UtPmx1bjsKKwl9IGVsc2UgeworCSAgLyogVGhpcyBpcyBub3QgYSBwYXNzdGhydS4uLiAqLworCQorICAgICAgICAgIC8vIHNldCB0aGUgRkNQLUxVTiBhZGRyZXNzaW5nIHR5cGUKKyAgICAgICAgICBDbW5kLT5TQ3AucGhhc2UgPSBwTG9nZ2VkSW5Qb3J0LT5TY3NpTmV4dXMuVm9sdW1lU2V0QWRkcmVzc2luZzsJCisKKyAgICAgICAgICAvLyBzZXQgdGhlIERldmljZSBUeXBlIHdlIGdvdCBmcm9tIHRoZSBzbm9vcGVkIElOUVVJUlkgc3RyaW5nCisJICBDbW5kLT5TQ3AuTWVzc2FnZSA9IHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5JbnFEZXZpY2VUeXBlOworCisJICAvLyBoYW5kbGUgTFVOIG1hc2tpbmc7IGlmIG5vdCAiZGVmYXVsdCIgKGlsbGVnYWwpIGx1biB2YWx1ZSwKKwkgIC8vIHRoZSB1c2UgaXQuICBUaGVzZSBsdW4gdmFsdWVzIGFyZSBzZXQgYnkgYSBzdWNjZXNzZnVsCisJICAvLyBSZXBvcnQgTHVucyBjb21tYW5kCisgICAgICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5MdW5NYXNraW5nID09IDEpIAorCSAgeworCSAgICBpZiAoQ21uZC0+ZGV2aWNlLT5sdW4gPiBzaXplb2YocExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bikpCisJCXJldHVybiBOVUxMOworICAgICAgICAgICAgLy8gd2UgS05PVyBhbGwgdGhlIHZhbGlkIExVTnMuLi4gMHhGRiBpcyBpbnZhbGlkIQorICAgICAgICAgICAgQ21uZC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5sdW5bQ21uZC0+ZGV2aWNlLT5sdW5dOworCSAgICBpZiAocExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltDbW5kLT5kZXZpY2UtPmx1bl0gPT0gMHhGRikKKwkJcmV0dXJuIE5VTEw7CisJICAgIC8vIHByaW50aygieGxhdGluZyBsdW4gJWQgdG8gMHglMDJ4XG4iLCBDbW5kLT5sdW4sIAorICAgICAgICAgICAgLy8JcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLmx1bltDbW5kLT5sdW5dKTsKKwkgIH0KKwkgIGVsc2UKKwkgICAgQ21uZC0+U0NwLmhhdmVfZGF0YV9pbiA9IENtbmQtPmRldmljZS0+bHVuOyAvLyBMaW51eCAmIHRhcmdldCBsdW5zIG1hdGNoCisJfQorCWJyZWFrOyAvLyBmb3VuZCBpdCEKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYoIHBvcnRfaWRfdmFsaWQgKSAvLyBsb29rIGZvciBhbHBhIGZpcnN0CisgICAgeworICAgICAgaWYoIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQgPT0gcG9ydF9pZCApCisgICAgICAgICAgYnJlYWs7ICAvLyBmb3VuZCBpdCEKKyAgICB9CisgICAgaWYoIHd3bl92YWxpZCApIC8vIGxvb2sgZm9yIHd3biBzZWNvbmQKKyAgICB7CisKKyAgICAgIGlmKCAhbWVtY21wKCAmcExvZ2dlZEluUG9ydC0+dS51Y1dXTlswXSwgJnd3blswXSwgOCkpCisgICAgICB7ICAKKyAgICAgICAgICAgICAgICAgLy8gYWxsIDggYnl0ZXMgb2YgV1dOIG1hdGNoCisgICAgICAgIGJyZWFrOyAgIC8vIGZvdW5kIGl0IQorICAgICAgfQorICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICBwTG9nZ2VkSW5Qb3J0ID0gcExvZ2dlZEluUG9ydC0+cE5leHRQb3J0OyAvLyB0cnkgbmV4dCBwb3J0CisgIH0KKworICByZXR1cm4gcExvZ2dlZEluUG9ydDsKK30KKworCisKKworLy8gCisvLyBXZSBuZWVkIHRvIGV4YW1pbmUgdGhlIFNFU1QgdGFibGUgYW5kIHJlLXZhbGlkYXRlCisvLyBhbnkgb3BlbiBFeGNoYW5nZXMgZm9yIHRoaXMgTG9nZ2VkSW5Qb3J0CisvLyBUbyBtYWtlIFRhY2h5b24gcGF5IGF0dGVudGlvbiwgRnJlZXplIEZDUCBhc3Npc3RzLAorLy8gc2V0IFZBTCBiaXRzLCBVbmZyZWV6ZSBGQ1AgYXNzaXN0cworc3RhdGljIHZvaWQgUmV2YWxpZGF0ZVNFU1QoIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyLCAKKwkJICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0KQoreworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBQVEFDSFlPTiBmY0NoaXAgPSAmY3BxZmNIQkFkYXRhLT5mY0NoaXA7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFVMT05HIHhfSUQ7CisgIEJPT0xFQU4gVGFjaEZyb3plID0gRkFMU0U7CisgIAorICAKKyAgLy8gcmUtdmFsaWRhdGUgYW55IFNFU1QgZXhjaGFuZ2VzIHRoYXQgYXJlIHBlcm1pdHRlZAorICAvLyB0byBzdXJ2aXZlIHRoZSBsaW5rIGRvd24gKGUuZy4sIGdvb2QgUERJU0MgcGVyZm9ybWVkKQorICBmb3IoIHhfSUQgPSAwOyB4X0lEIDwgVEFDSF9TRVNUX0xFTjsgeF9JRCsrKQorICB7CisKKyAgICAvLyBJZiB0aGUgU0VTVCBlbnRyeSBwb3J0X2lkIG1hdGNoZXMgdGhlIHBMb2dnZWRJblBvcnQsCisgICAgLy8gd2UgbmVlZCB0byByZS12YWxpZGF0ZQorICAgIGlmKCAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEXS50eXBlID09IFNDU0lfSVJFKQorICAgICAgICAgfHwgCisJKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0udHlwZSA9PSBTQ1NJX0lXRSkpCisgICAgeworCQkgICAgIAorICAgICAgaWYoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLmZjaHMuZF9pZCAmIDB4RkZGRkZGKSAgLy8gKDI0LWJpdCBwb3J0IElEKQorICAgICAgICAgICAgPT0gcExvZ2dlZEluUG9ydC0+cG9ydF9pZCkgCisgICAgICB7CisvLwlwcmludGsoIiByZS12YWwgeElEICVYaCAiLCB4X0lEKTsKKyAgICAgICAgaWYoICFUYWNoRnJvemUgKSAgLy8gZnJlZXplIGlmIG5vdCBhbHJlYWR5IGZyb3plbgorICAgICAgICAgIFRhY2hGcm96ZSB8PSBGcmVlemVUYWNoKCBjcHFmY0hCQWRhdGEpOworICAgICAgICBmY0NoaXAtPlNFU1QtPnVbIHhfSURdLklXRS5IZHJfTGVuIHw9IDB4ODAwMDAwMDA7IC8vIHNldCBWQUwgYml0CisgICAgICB9CisgICAgfSAKKyAgfQorCisgIGlmKCBUYWNoRnJvemUpIAorICB7IAorICAgIGZjQ2hpcC0+VW5GcmVlemVUYWNoeW9uKCBmY0NoaXAsIDIpOyAgLy8gYm90aCBFUlEgYW5kIEZDUCBhc3Npc3RzCisgIH0KK30gCisKKworLy8gQ29tcGxldGUgYW4gTGludXggQ21uZHMgdGhhdCB3ZSBRdWV1ZWQgYmVjYXVzZQorLy8gb3VyIEZDIGxpbmsgd2FzIGRvd24gKGNhdXNlIGltbWVkaWF0ZSByZXRyeSkKKworc3RhdGljIHZvaWQgVW5ibG9ja1Njc2lEZXZpY2UoIHN0cnVjdCBTY3NpX0hvc3QgKkhvc3RBZGFwdGVyLCAKKwkJICAgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0KQoreworICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhID0gKENQUUZDSEJBICopSG9zdEFkYXB0ZXItPmhvc3RkYXRhOworICBTY3NpX0NtbmQqICpTQ3B0ciA9ICZjcHFmY0hCQWRhdGEtPkxpbmtEbkNtbmRbMF07CisgIFNjc2lfQ21uZCAqQ21uZDsKKyAgaW50IGluZHg7CisKKyAKKyAgCisgIC8vIGlmIHRoZSBkZXZpY2Ugd2FzIHByZXZpb3VzbHkgImJsb2NrZWQiLCBtYWtlIHN1cmUKKyAgLy8gd2UgdW5ibG9jayBpdCBzbyBMaW51eCBTQ1NJIHdpbGwgcmVzdW1lCisKKyAgcExvZ2dlZEluUG9ydC0+ZGV2aWNlX2Jsb2NrZWQgPSBGQUxTRTsgLy8gY2xlYXIgb3VyIGZsYWcKKworICAvLyBjaGVjayB0aGUgTGluayBEb3duIGNvbW1hbmQgcHRyIGJ1ZmZlcjsKKyAgLy8gd2UgY2FuIGNvbXBsZXRlIG5vdyBjYXVzaW5nIGltbWVkaWF0ZSByZXRyeQorICBmb3IoIGluZHg9MDsgaW5keCA8IENQUUZDVFNfUkVRX1FVRVVFX0xFTjsgaW5keCsrLCBTQ3B0cisrKQorICB7CisgICAgaWYoICpTQ3B0ciAhPSBOVUxMICkgLy8gc2NzaSBjb21tYW5kIHRvIGNvbXBsZXRlPworICAgIHsKKyNpZmRlZiBEVU1NWUNNTkRfREJHCisgICAgICBwcmludGsoImNvbXBsZXRlIENtbmQgJXAgaW4gTGlua0RuQ21uZFslZF1cbiIsICpTQ3B0cixpbmR4KTsKKyNlbmRpZgorICAgICAgQ21uZCA9ICpTQ3B0cjsKKworCisgICAgICAvLyBBcmUgdGhlcmUgYW55IFEnZCBjb21tYW5kcyBmb3IgdGhpcyB0YXJnZXQ/CisgICAgICBpZiggKENtbmQtPmRldmljZS0+aWQgPT0gcExvZ2dlZEluUG9ydC0+U2NzaU5leHVzLnRhcmdldCkKKwkgICAgICAgJiYKKyAgICAgICAgICAoQ21uZC0+ZGV2aWNlLT5jaGFubmVsID09IHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5jaGFubmVsKSApCisgICAgICB7CisgICAgICAgIENtbmQtPnJlc3VsdCA9IChESURfU09GVF9FUlJPUiA8PDE2KTsgLy8gZm9yY2UgcmV0cnkKKyAgICAgICAgaWYoIENtbmQtPnNjc2lfZG9uZSA9PSBOVUxMKSAKKwl7CisgICAgICAgICAgcHJpbnRrKCJMaW5rRG5DbW5kIHNjc2lfZG9uZSBwdHIgbnVsbCwgcG9ydF9pZCAlWGhcbiIsCisJCSAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCk7CisJfQorCWVsc2UKKwkgIGNhbGxfc2NzaV9kb25lKENtbmQpOworICAgICAgICAqU0NwdHIgPSBOVUxMOyAgLy8gZnJlZSB0aGlzIHNsb3QgZm9yIG5leHQgdXNlCisgICAgICB9CisgICAgfQorICB9Cit9CisKKyAgCisvLyNkZWZpbmUgV1dOX0RCRyAxCisKK3N0YXRpYyB2b2lkIFNldExvZ2luRmllbGRzKAorICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0LAorICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsCisgIEJPT0xFQU4gUERpc2MsCisgIEJPT0xFQU4gT3JpZ2luYXRvcikKK3sKKyAgTE9HSU5fUEFZTE9BRCBsb2dpOyAgICAgICAvLyBGQy1QSCBQb3J0IExvZ2luCisgIFBSTElfUkVRVUVTVCBwcmxpOyAgLy8gY29weSBmb3IgQklHIEVORElBTiBzd2l0Y2gKKyAgaW50IGk7CisjaWZkZWYgV1dOX0RCRworICBVTE9ORyB1bEJ1ZmY7CisjZW5kaWYKKworICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZmY2hzLT5wbFswXSwgKFVDSEFSKikmbG9naSwgc2l6ZW9mKGxvZ2kpKTsKKworICBwTG9nZ2VkSW5Qb3J0LT5PcmlnaW5hdG9yID0gT3JpZ2luYXRvcjsKKyAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCA9IGZjaHMtPnNfaWQgJiAweEZGRkZGRjsKKyAgCisgIHN3aXRjaCggZmNocy0+cGxbMF0gJiAweGZmZmYgKQorICB7CisgIGNhc2UgMHgwMDAwMDAwMjogIC8vICBQTE9HSSBvciBQRElTQyBBQ0NlcHQ/CisgICAgaWYoIFBEaXNjICkgICAgIC8vIFBESVNDIGFjY2VwdAorICAgICAgZ290byBQRElTQ19jYXNlOworCisgIGNhc2UgMHgwMDAwMDAwMzogIC8vICBFTFNfUExPR0kgb3IgRUxTX1BMT0dJX0FDQworCisgIC8vIExvZ2luIEJCX2NyZWRpdCB0eXBpY2FsbHkgMCBmb3IgVGFjaHlvbnMKKyAgICBwTG9nZ2VkSW5Qb3J0LT5CQl9jcmVkaXQgPSBsb2dpLmNtbl9zZXJ2aWNlcy5iYl9jcmVkaXQ7CisKKyAgICAvLyBlLmcuIDEyOCwgMjU2LCAxMDI0LCAyMDQ4IHBlciBGQy1QSCBzcGVjCisgICAgLy8gV2UgaGF2ZSB0byB1c2UgdGhpcyB3aGVuIHNldHRpbmcgdXAgU0VTVCBXcml0ZXMsCisgICAgLy8gc2luY2UgdGhhdCBkZXRlcm1pbmVzIGZyYW1lIHNpemUgd2Ugc2VuZC4KKyAgICBwTG9nZ2VkSW5Qb3J0LT5yeF9kYXRhX3NpemUgPSBsb2dpLmNsYXNzMy5yeF9kYXRhX3NpemU7CisgICAgcExvZ2dlZEluUG9ydC0+cGxvZ2kgPSBUUlVFOworICAgIHBMb2dnZWRJblBvcnQtPnBkaXNjID0gRkFMU0U7CisgICAgcExvZ2dlZEluUG9ydC0+cHJsaSA9IEZBTFNFOyAgICAvLyBFTFNfUExPR0kgcmVzZXRzCisgICAgcExvZ2dlZEluUG9ydC0+ZmxvZ2kgPSBGQUxTRTsgICAvLyBFTFNfUExPR0kgcmVzZXRzCisgICAgcExvZ2dlZEluUG9ydC0+bG9nbyA9IEZBTFNFOyAgICAvLyBFTFNfUExPR0kgcmVzZXRzCisgICAgcExvZ2dlZEluUG9ydC0+TE9HT19jb3VudGVyID0gMDsvLyBFTFNfUExPR0kgcmVzZXRzCisgICAgcExvZ2dlZEluUG9ydC0+TE9HT190aW1lciA9IDA7Ly8gRUxTX1BMT0dJIHJlc2V0cworCisgICAgLy8gd2FzIHRoaXMgUExPR0kgdG8gYSBGYWJyaWM/CisgICAgaWYoIHBMb2dnZWRJblBvcnQtPnBvcnRfaWQgPT0gMHhGRkZGRkMgKSAvLyB3ZWxsIGtub3cgYWRkcmVzcworICAgICAgcExvZ2dlZEluUG9ydC0+ZmxvZ2kgPSBUUlVFOworCisKKyAgICBmb3IoIGk9MDsgaTw4OyBpKyspICAgLy8gY29weSB0aGUgTE9HSU4gcG9ydCdzIFdXTgorICAgICAgcExvZ2dlZEluUG9ydC0+dS51Y1dXTltpXSA9IGxvZ2kucG9ydF9uYW1lW2ldOyAgCisKKyNpZmRlZiBXV05fREJHCisgICAgdWxCdWZmID0gKFVMT05HKXBMb2dnZWRJblBvcnQtPnUubGlXV047CisgICAgaWYoIHBMb2dnZWRJblBvcnQtPk9yaWdpbmF0b3IpCisgICAgICBwcmludGsoIm8iKTsKKyAgICBlbHNlCisgICAgICBwcmludGsoInIiKTsKKyAgICBwcmludGsoIlBMT0dJIHBvcnRfaWQgJVhoLCBXV04gJTA4WCIsCisgICAgICBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkLCB1bEJ1ZmYpOworCisgICAgdWxCdWZmID0gKFVMT05HKShwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOID4+IDMyKTsKKyAgICBwcmludGsoIiUwOFhoIGZjUG9ydCAlcFxuIiwgdWxCdWZmLCBwTG9nZ2VkSW5Qb3J0KTsKKyNlbmRpZgorICAgIGJyZWFrOworCisKKworICAKKyAgY2FzZSAweDAwMDAwMDA1OiAgLy8gIEVMU19MT0dPIChsb2dvdXQpCisKKworICAgIHBMb2dnZWRJblBvcnQtPnBsb2dpID0gRkFMU0U7CisgICAgcExvZ2dlZEluUG9ydC0+cGRpc2MgPSBGQUxTRTsKKyAgICBwTG9nZ2VkSW5Qb3J0LT5wcmxpID0gRkFMU0U7ICAgLy8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPmZsb2dpID0gRkFMU0U7ICAvLyBFTFNfUExPR0kgcmVzZXRzCisgICAgcExvZ2dlZEluUG9ydC0+bG9nbyA9IFRSVUU7ICAgIC8vIEVMU19QTE9HSSByZXNldHMKKyAgICBwTG9nZ2VkSW5Qb3J0LT5MT0dPX2NvdW50ZXIrKzsgLy8gRUxTX1BMT0dJIHJlc2V0cworICAgIHBMb2dnZWRJblBvcnQtPkxPR09fdGltZXIgPSAwOworI2lmZGVmIFdXTl9EQkcKKyAgICB1bEJ1ZmYgPSAoVUxPTkcpcExvZ2dlZEluUG9ydC0+dS5saVdXTjsKKyAgICBpZiggcExvZ2dlZEluUG9ydC0+T3JpZ2luYXRvcikKKyAgICAgIHByaW50aygibyIpOworICAgIGVsc2UKKyAgICAgIHByaW50aygiciIpOworICAgIHByaW50aygiTE9HTyBwb3J0X2lkICVYaCwgV1dOICUwOFgiLAorICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCwgdWxCdWZmKTsKKworICAgIHVsQnVmZiA9IChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTiA+PiAzMik7CisgICAgcHJpbnRrKCIlMDhYaFxuIiwgdWxCdWZmKTsKKyNlbmRpZgorICAgIGJyZWFrOworCisKKworUERJU0NfY2FzZToKKyAgY2FzZSAweDAwMDAwMDUwOiAvLyAgRUxTX1BESVNDIG9yIEVMU19QRElTQ19BQ0MKKyAgICBwTG9nZ2VkSW5Qb3J0LT5MT0dPX3RpbWVyID0gMDsgIC8vIHN0b3AgdGhlIHRpbWUtb3V0CisgICAgICAKKyAgICBwTG9nZ2VkSW5Qb3J0LT5wcmxpID0gVFJVRTsgICAgIC8vIHJlYWR5IHRvIGFjY2VwdCBGQ1AtU0NTSSBJL08KKyAgICAKKworICAgICAgCisjaWZkZWYgV1dOX0RCRworICAgIHVsQnVmZiA9IChVTE9ORylwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOOworICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5PcmlnaW5hdG9yKQorICAgICAgcHJpbnRrKCJvIik7CisgICAgZWxzZQorICAgICAgcHJpbnRrKCJyIik7CisgICAgcHJpbnRrKCJQRElTQyBwb3J0X2lkICVYaCwgV1dOICUwOFgiLAorICAgICAgcExvZ2dlZEluUG9ydC0+cG9ydF9pZCwgdWxCdWZmKTsKKworICAgIHVsQnVmZiA9IChVTE9ORykocExvZ2dlZEluUG9ydC0+dS5saVdXTiA+PiAzMik7CisgICAgcHJpbnRrKCIlMDhYaFxuIiwgdWxCdWZmKTsKKyNlbmRpZgorCisKKyAgICAKKyAgICBicmVhazsKKworCisgICAgCisgIGNhc2UgIDB4MTAyMEw6IC8vICBQUkxJPworICBjYXNlICAweDEwMDJMOiAvLyAgUFJMSSBBQ0NlcHQ/CisgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmZmNocy0+cGxbMF0sIChVQ0hBUiopJnBybGksIHNpemVvZihwcmxpKSk7CisKKyAgICBwTG9nZ2VkSW5Qb3J0LT5mY3BfaW5mbyA9IHBybGkuZmNwX2luZm87IC8vIHRhcmdldC9pbml0aWF0b3IgZmxhZ3MKKyAgICBwTG9nZ2VkSW5Qb3J0LT5wcmxpID0gVFJVRTsgIC8vIFBMT0dJIHJlc2V0cywgUERJU0MgZG9lc24ndAorCisgICAgcExvZ2dlZEluUG9ydC0+cGRpc2MgPSBUUlVFOyAgLy8gZXhwZWN0IHRvIHNlbmQgKG9yIHJlY2VpdmUpIFBESVNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCB0aW1lCisgICAgcExvZ2dlZEluUG9ydC0+TE9HT190aW1lciA9IDA7ICAvLyB3aWxsIGJlIHNldCBuZXh0IExpbmtEb3duCisjaWZkZWYgV1dOX0RCRworICAgIHVsQnVmZiA9IChVTE9ORylwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOOworICAgIGlmKCBwTG9nZ2VkSW5Qb3J0LT5PcmlnaW5hdG9yKQorICAgICAgcHJpbnRrKCJvIik7CisgICAgZWxzZQorICAgICAgcHJpbnRrKCJyIik7CisgICAgcHJpbnRrKCJQUkxJIHBvcnRfaWQgJVhoLCBXV04gJTA4WCIsCisgICAgICBwTG9nZ2VkSW5Qb3J0LT5wb3J0X2lkLCB1bEJ1ZmYpOworCisgICAgdWxCdWZmID0gKFVMT05HKShwTG9nZ2VkSW5Qb3J0LT51LmxpV1dOID4+IDMyKTsKKyAgICAgIHByaW50aygiJTA4WGhcbiIsIHVsQnVmZik7CisjZW5kaWYKKworICAgIGJyZWFrOworCisgIH0KKworICByZXR1cm47Cit9CisKKworCisKKworCitzdGF0aWMgdm9pZCBCdWlsZExpbmtTZXJ2aWNlUGF5bG9hZCggUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyB0eXBlLCB2b2lkKiBwYXlsb2FkKQoreworICBMT0dJTl9QQVlMT0FEICpwbG9naTsgIC8vIEZDLVBIIFBvcnQgTG9naW4KKyAgTE9HSU5fUEFZTE9BRCBQbG9naVBheWxvYWQ7ICAgLy8gY29weSBmb3IgQklHIEVORElBTiBzd2l0Y2gKKyAgUFJMSV9SRVFVRVNUICAqcHJsaTsgICAgICAgICAgLy8gRkNQLVNDU0kgUHJvY2VzcyBMb2dpbgorICBQUkxJX1JFUVVFU1QgIFBybGlQYXlsb2FkOyAgICAvLyBjb3B5IGZvciBCSUcgRU5ESUFOIHN3aXRjaAorICBMT0dPVVRfUEFZTE9BRCAgKmxvZ287CisgIExPR09VVF9QQVlMT0FEICBMb2dvdXRQYXlsb2FkOworLy8gIFBSTE9fUkVRVUVTVCAgKnBybG87CisvLyAgUFJMT19SRVFVRVNUICBQcmxvUGF5bG9hZDsKKyAgUkVKRUNUX01FU1NBR0Ugcmp0LCAqcHJqdDsKKworICBtZW1zZXQoICZQbG9naVBheWxvYWQsIDAsIHNpemVvZiggUGxvZ2lQYXlsb2FkKSk7CisgIHBsb2dpID0gJlBsb2dpUGF5bG9hZDsgICAgLy8gbG9hZCBpbnRvIHN0YWNrIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBCSUctRU5ESUFOIHN3aXRjaCBhIGNvcHkgdG8gY2FsbGVyCisKKworICBzd2l0Y2goIHR5cGUgKSAgLy8gcGF5bG9hZCB0eXBlIGNhbiBiZSBFTFNfUExPR0ksIEVMU19QUkxJLCBBRElTQywgLi4uCisgIHsKKyAgICBjYXNlIEVMU19GRElTQzoKKyAgICBjYXNlIEVMU19GTE9HSToKKyAgICBjYXNlIEVMU19QTE9HSV9BQ0M6ICAgLy8gRkMtUEggUE9SVCBMb2dpbiBBY2NlcHQKKyAgICBjYXNlIEVMU19QTE9HSTogICAvLyBGQy1QSCBQT1JUIExvZ2luCisgICAgY2FzZSBFTFNfUERJU0M6ICAgLy8gRkMtUEgyIFBvcnQgRGlzY292ZXJ5IC0gc2FtZSBwYXlsb2FkIGFzIEVMU19QTE9HSQorICAgICAgcGxvZ2ktPmxvZ2luX2NtZCA9IExTX1BMT0dJOworICAgICAgaWYoIHR5cGUgPT0gRUxTX1BESVNDKQorICAgICAgICBwbG9naS0+bG9naW5fY21kID0gTFNfUERJU0M7CisgICAgICBlbHNlIGlmKCB0eXBlID09IEVMU19QTE9HSV9BQ0MgKQorICAgICAgICBwbG9naS0+bG9naW5fY21kID0gTFNfQUNDOworCisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmJiX2NyZWRpdCA9IDB4MDA7CisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmxvd2VzdF92ZXIgPSBmY0NoaXAtPmxvd2VzdF9GQ1BIX3ZlcjsKKyAgICAgIHBsb2dpLT5jbW5fc2VydmljZXMuaGlnaGVzdF92ZXIgPSBmY0NoaXAtPmhpZ2hlc3RfRkNQSF92ZXI7CisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmJiX3J4X3NpemUgPSBUQUNITElURV9UU19SWF9TSVpFOworICAgICAgcGxvZ2ktPmNtbl9zZXJ2aWNlcy5jb21tb25fZmVhdHVyZXMgPSBDT05USU5VT1NMWV9JTkNSRUFTSU5HIHwKKyAgICAgICAgICAgICAgUkFORE9NX1JFTEFUSVZFX09GRlNFVDsKKworICAgICAgICAgICAgIC8vIGZpbGwgaW4gd2l0aCBXb3JsZCBXaWRlIE5hbWUgYmFzZWQgUG9ydCBOYW1lIC0gOCBVQ0hBUnMKKyAgICAgICAgICAgICAvLyBnZXQgZnJvbSBUYWNoIHJlZ2lzdGVycyBXV04gaGkgJiBsbworICAgICAgTG9hZFdXTiggZmNDaGlwLCBwbG9naS0+cG9ydF9uYW1lLCAwKTsKKyAgICAgICAgICAgICAvLyBmaWxsIGluIHdpdGggV29ybGQgV2lkZSBOYW1lIGJhc2VkIE5vZGUvRmFicmljIE5hbWUgLSA4IFVDSEFScworICAgICAgICAgICAgIC8vIGdldCBmcm9tIFRhY2ggcmVnaXN0ZXJzIFdXTiBoaSAmIGxvCisgICAgICBMb2FkV1dOKCBmY0NoaXAsIHBsb2dpLT5ub2RlX25hbWUsIDEpOworCisJLy8gRm9yIFNlYWdhdGUgRHJpdmVzLgorCS8vCisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmNvbW1vbl9mZWF0dXJlcyB8PSAweDgwMDsKKyAgICAgIHBsb2dpLT5jbW5fc2VydmljZXMucmVsX29mZnNldCA9IDB4RkU7CisgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmNvbmN1cnJlbnRfc2VxID0gMTsKKyAgICAgIHBsb2dpLT5jbGFzczEuc2VydmljZV9vcHRpb25zID0gMHgwMDsKKyAgICAgIHBsb2dpLT5jbGFzczIuc2VydmljZV9vcHRpb25zID0gMHgwMDsKKyAgICAgIHBsb2dpLT5jbGFzczMuc2VydmljZV9vcHRpb25zID0gQ0xBU1NfVkFMSUQ7CisgICAgICBwbG9naS0+Y2xhc3MzLmluaXRpYXRvcl9jb250cm9sID0gMHgwMDsKKyAgICAgIHBsb2dpLT5jbGFzczMucnhfZGF0YV9zaXplID0gTUFYX1JYX1BBWUxPQUQ7CisgICAgICBwbG9naS0+Y2xhc3MzLnJlY2lwaWVudF9jb250cm9sID0KKyAgICAgICAgICAgICBFUlJPUl9ESVNDQVJEIHwgT05FX0NBVEVHT1JZX1NFUVVFTkNFOworICAgICAgcGxvZ2ktPmNsYXNzMy5jb25jdXJyZW50X3NlcXVlbmNlcyA9IDE7CisgICAgICBwbG9naS0+Y2xhc3MzLm9wZW5fc2VxdWVuY2VzID0gMTsKKyAgICAgIHBsb2dpLT52ZW5kb3JfaWRbMF0gPSAnQyc7IHBsb2dpLT52ZW5kb3JfaWRbMV0gPSAnUSc7CisgICAgICBwbG9naS0+dmVuZG9yX3ZlcnNpb25bMF0gPSAnQyc7IHBsb2dpLT52ZW5kb3JfdmVyc2lvblsxXSA9ICdRJzsKKyAgICAgIHBsb2dpLT52ZW5kb3JfdmVyc2lvblsyXSA9ICcgJzsgcGxvZ2ktPnZlbmRvcl92ZXJzaW9uWzNdID0gJzAnOworICAgICAgcGxvZ2ktPnZlbmRvcl92ZXJzaW9uWzRdID0gJzAnOyBwbG9naS0+dmVuZG9yX3ZlcnNpb25bNV0gPSAnMCc7CisKKworICAgICAgLy8gRkxPR0kgc3BlY2lmaWMgZmllbGRzLi4uIChzZWUgRkMtRkxBLCBSZXYgMi43LCBBdWcgMTk5OSwgc2VjIDUuMSkKKyAgICAgIGlmKCAodHlwZSA9PSBFTFNfRkxPR0kpIHx8ICh0eXBlID09IEVMU19GRElTQykgKQorICAgICAgeworICAgICAgICBpZiggdHlwZSA9PSBFTFNfRkxPR0kgKQorICAJICBwbG9naS0+bG9naW5fY21kID0gTFNfRkxPR0k7ICAKKwllbHNlCisgIAkgIHBsb2dpLT5sb2dpbl9jbWQgPSBMU19GRElTQzsgIAorCisgICAgICAgIHBsb2dpLT5jbW5fc2VydmljZXMubG93ZXN0X3ZlciA9IDB4MjA7CisgICAgICAgIHBsb2dpLT5jbW5fc2VydmljZXMuY29tbW9uX2ZlYXR1cmVzID0gMHgwODAwOworICAgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLnJlbF9vZmZzZXQgPSAwOworICAgICAgICBwbG9naS0+Y21uX3NlcnZpY2VzLmNvbmN1cnJlbnRfc2VxID0gMDsKKworICAgICAgICBwbG9naS0+Y2xhc3MzLnNlcnZpY2Vfb3B0aW9ucyA9IDB4ODgwMDsKKyAgICAgICAgcGxvZ2ktPmNsYXNzMy5yeF9kYXRhX3NpemUgPSAwOworICAgICAgICBwbG9naS0+Y2xhc3MzLnJlY2lwaWVudF9jb250cm9sID0gMDsKKyAgICAgICAgcGxvZ2ktPmNsYXNzMy5jb25jdXJyZW50X3NlcXVlbmNlcyA9IDA7CisgICAgICAgIHBsb2dpLT5jbGFzczMub3Blbl9zZXF1ZW5jZXMgPSAwOworICAgICAgfQorICAgICAgCisgICAgICAgICAgICAgIC8vIGNvcHkgYmFjayB0byBjYWxsZXIncyBidWZmLCB3LyBCSUcgRU5ESUFOIHN3YXAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJlBsb2dpUGF5bG9hZCwgcGF5bG9hZCwgIHNpemVvZihQbG9naVBheWxvYWQpKTsKKyAgICAgIGJyZWFrOworCisgICAgCisgICAgY2FzZSBFTFNfQUNDOiAgICAgICAvLyBnZW5lcmljIEV4dGVuZGVkIExpbmsgU2VydmljZSBBQ0NlcHQJICAgIAorICAgICAgcGxvZ2ktPmxvZ2luX2NtZCA9IExTX0FDQzsKKyAgICAgICAgICAgICAgLy8gY29weSBiYWNrIHRvIGNhbGxlcidzIGJ1ZmYsIHcvIEJJRyBFTkRJQU4gc3dhcAorICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmUGxvZ2lQYXlsb2FkLCBwYXlsb2FkLCAgNCk7CisgICAgICBicmVhazsKKworCisgICAgICAKKyAgICBjYXNlIEVMU19TQ1I6ICAgIC8vIEZhYnJpYyBTdGF0ZSBDaGFuZ2UgUmVnaXN0cmF0aW9uCisgICAgeworICAgICAgU0NSX1BMIHNjcjsgICAgIC8vIHN0YXRlIGNoYW5nZSByZWdpc3RyYXRpb24KKworICAgICAgbWVtc2V0KCAmc2NyLCAwLCBzaXplb2Yoc2NyKSk7CisKKyAgICAgIHNjci5jb21tYW5kID0gTFNfU0NSOyAgLy8gMHg2MjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgRkMtRkxBLCBSZXYgMi43LCBUYWJsZSBBLjIyIChwZyA4MikKKyAgICAgIHNjci5mdW5jdGlvbiA9IDM7ICAgICAgLy8gMSA9IEV2ZW50cyBkZXRlY3RlZCBieSBGYWJyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiA9IE5fUG9ydCBkZXRlY3RlZCByZWdpc3RyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMyA9IEZ1bGwgcmVnaXN0cmF0aW9uCisgICAgICAKKyAgICAgIC8vIGNvcHkgYmFjayB0byBjYWxsZXIncyBidWZmLCB3LyBCSUcgRU5ESUFOIHN3YXAKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJnNjciwgcGF5bG9hZCwgIHNpemVvZihTQ1JfUEwpKTsKKyAgICB9CisgICAgCisgICAgYnJlYWs7CisKKyAgICAKKyAgICBjYXNlIEZDU19OU1I6ICAgIC8vIEZhYnJpYyBOYW1lIFNlcnZpY2UgUmVxdWVzdAorICAgIHsKKyAgICAgIE5TUl9QTCBuc3I7ICAgIC8vIE5hbWUgU2VydmVyIFJlcS4gcGF5bG9hZAorCisgICAgICBtZW1zZXQoICZuc3IsIDAsIHNpemVvZihOU1JfUEwpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgQnJvY2FkZSBGYWJyaWMgUHJvZ3JhbW1pbmcgR3VpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldiAxLjMsIHBnIDQtNDQKKyAgICAgIG5zci5DVF9SZXYgPSAweDAxMDAwMDAwOworICAgICAgbnNyLkZDU19UeXBlID0gMHhGQzAyMDAwMDsKKyAgICAgIG5zci5Db21tYW5kX2NvZGUgPSAweDAxNzEwMDAwOworICAgICAgbnNyLkZDUCA9IDg7CisgICAgIAorICAgICAgLy8gY29weSBiYWNrIHRvIGNhbGxlcidzIGJ1ZmYsIHcvIEJJRyBFTkRJQU4gc3dhcAorICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmbnNyLCBwYXlsb2FkLCAgc2l6ZW9mKE5TUl9QTCkpOworICAgIH0KKyAgICAKKyAgICBicmVhazsKKworCisKKyAgICAKKyAgICBjYXNlIEVMU19MT0dPOiAgIC8vIEZDLVBIIFBPUlQgTG9nT3V0CisgICAgICBsb2dvID0gJkxvZ291dFBheWxvYWQ7ICAgIC8vIGxvYWQgaW50byBzdGFjayBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gQklHLUVORElBTiBzd2l0Y2ggYSBjb3B5IHRvIGNhbGxlcgorICAgICAgbG9nby0+Y21kID0gTFNfTE9HTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgMyBVQ0hBUnMgb2YgdGhlIG5vZGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoaWYgcHJpdmF0ZSBsb29wLCB1cHBlciB0d28gVUNIQVJzIDApCisgICAgICBsb2dvLT5yZXNlcnZlZCA9IDA7CisKKyAgICAgIGxvZ28tPm5fcG9ydF9pZGVudGlmaWVyWzBdID0gKFVDSEFSKShmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYSk7CisgICAgICBsb2dvLT5uX3BvcnRfaWRlbnRpZmllclsxXSA9CisgICAgICAgICAgICAgICAgICAgICAoVUNIQVIpKGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhPj44KTsKKyAgICAgIGxvZ28tPm5fcG9ydF9pZGVudGlmaWVyWzJdID0KKyAgICAgICAgICAgICAgICAgICAgIChVQ0hBUikoZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGE+PjE2KTsKKyAgICAgICAgICAgICAvLyBmaWxsIGluIHdpdGggV29ybGQgV2lkZSBOYW1lIGJhc2VkIFBvcnQgTmFtZSAtIDggVUNIQVJzCisgICAgICAgICAgICAgLy8gZ2V0IGZyb20gVGFjaCByZWdpc3RlcnMgV1dOIGhpICYgbG8KKyAgICAgIExvYWRXV04oIGZjQ2hpcCwgbG9nby0+cG9ydF9uYW1lLCAwKTsKKworICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmTG9nb3V0UGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQsICBzaXplb2YoTG9nb3V0UGF5bG9hZCkgKTsgIC8vIDE2IFVDSEFSIHN0cnVjdAorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgRUxTX0xPR09fQUNDOiAgICAgLy8gTG9nb3V0IEFjY2VwdCAoRkgtUEggcGcgMTQ5LCB0YWJsZSA3NCkKKyAgICAgIGxvZ28gPSAmTG9nb3V0UGF5bG9hZDsgICAgLy8gbG9hZCBpbnRvIHN0YWNrIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBCSUctRU5ESUFOIHN3aXRjaCBhIGNvcHkgdG8gY2FsbGVyCisgICAgICBsb2dvLT5jbWQgPSBMU19BQ0M7CisgICAgICBCaWdFbmRpYW5Td2FwKCAoVUNIQVIqKSZMb2dvdXRQYXlsb2FkLCBwYXlsb2FkLCA0ICk7ICAvLyA0IFVDSEFSIGNtbmQKKyAgICAgIGJyZWFrOworICAgICAgCisKKyAgICBjYXNlIEVMU19SSlQ6ICAgICAgICAgIC8vIEVMU19SSlQgbGluayBzZXJ2aWNlIHJlamVjdCAoRkgtUEggcGcgMTU1KQorCisgICAgICBwcmp0ID0gKFJFSkVDVF9NRVNTQUdFKilwYXlsb2FkOyAgLy8gcGljayB1cCBwYXNzZWQgZGF0YQorICAgICAgcmp0LmNvbW1hbmRfY29kZSA9IEVMU19SSlQ7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2UgZmllbGRzLCBiZWNhdXNlIG9mIFN3YXAgdGhhdCBmb2xsb3dzLi4uCisgICAgICByanQudmVuZG9yID0gcHJqdC0+cmVzZXJ2ZWQ7IC8vIHZlbmRvciBzcGVjaWZpYworICAgICAgcmp0LmV4cGxhaW4gPSBwcmp0LT5yZWFzb247IC8vCisgICAgICByanQucmVhc29uID0gcHJqdC0+ZXhwbGFpbjsgLy8KKyAgICAgIHJqdC5yZXNlcnZlZCA9IHByanQtPnZlbmRvcjsgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gQklHLUVORElBTiBzd2l0Y2ggYSBjb3B5IHRvIGNhbGxlcgorICAgICAgQmlnRW5kaWFuU3dhcCggKFVDSEFSKikmcmp0LCBwYXlsb2FkLCA4ICk7ICAvLyA4IFVDSEFSIGNtbmQKKyAgICAgIGJyZWFrOworCisKKworCisKKyAgICBjYXNlIEVMU19QUkxJX0FDQzogIC8vIFByb2Nlc3MgTG9naW4gQUNDZXB0CisgICAgY2FzZSBFTFNfUFJMSTogIC8vIFByb2Nlc3MgTG9naW4KKyAgICBjYXNlIEVMU19QUkxPOiAgLy8gUHJvY2VzcyBMb2dvdXQKKyAgICAgIG1lbXNldCggJlBybGlQYXlsb2FkLCAwLCBzaXplb2YoIFBybGlQYXlsb2FkKSk7CisgICAgICBwcmxpID0gJlBybGlQYXlsb2FkOyAgICAgIC8vIGxvYWQgaW50byBzdGFjayBidWZmZXIsCisKKyAgICAgIGlmKCB0eXBlID09IEVMU19QUkxJICkKKyAgICAgICAgcHJsaS0+Y21kID0gMHgyMDsgIC8vIExvZ2luCisgICAgICBlbHNlIGlmKCB0eXBlID09IEVMU19QUkxPICkKKyAgICAgICAgcHJsaS0+Y21kID0gMHgyMTsgIC8vIExvZ291dAorICAgICAgZWxzZSBpZiggdHlwZSA9PSBFTFNfUFJMSV9BQ0MgKQorICAgICAgeworICAgICAgICBwcmxpLT5jbWQgPSAweDAyOyAgLy8gTG9naW4gQUNDZXB0CisgICAgICAgIHBybGktPnZhbGlkID0gUkVRVUVTVF9FWEVDVVRFRDsKKyAgICAgIH0KKworCisgICAgICBwcmxpLT52YWxpZCB8PSBTQ1NJX0ZDUCB8IEVTVEFCTElTSF9QQUlSOworICAgICAgcHJsaS0+ZmNwX2luZm8gPSBSRUFEX1hGRVJfUkRZOworICAgICAgcHJsaS0+cGFnZV9sZW5ndGggPSAweDEwOworICAgICAgcHJsaS0+cGF5bG9hZF9sZW5ndGggPSAyMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGJlIGluaXRpYXRvciBBTkQgdGFyZ2V0CisKKyAgICAgIGlmKCBmY0NoaXAtPk9wdGlvbnMuaW5pdGlhdG9yICkKKyAgICAgICAgcHJsaS0+ZmNwX2luZm8gfD0gSU5JVElBVE9SX0ZVTkNUSU9OOworICAgICAgaWYoIGZjQ2hpcC0+T3B0aW9ucy50YXJnZXQgKQorICAgICAgICBwcmxpLT5mY3BfaW5mbyB8PSBUQVJHRVRfRlVOQ1RJT047CisKKyAgICAgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJlBybGlQYXlsb2FkLCBwYXlsb2FkLCAgcHJsaS0+cGF5bG9hZF9sZW5ndGgpOworICAgICAgYnJlYWs7CisKKworCisgICAgZGVmYXVsdDogIC8vIG5vIGNhbiBkbyAtIHByb2dyYW1taW5nIGVycm9yCisgICAgICBwcmludGsoIiBCdWlsZExpbmtTZXJ2aWNlUGF5bG9hZCB1bmtub3duIVxuIik7CisgICAgICBicmVhazsKKyAgfQorfQorCisvLyBsb2FkcyA4IFVDSEFScyBmb3IgUE9SVCBuYW1lIG9yIE5PREUgbmFtZSBiYXNlIG9uCisvLyBjb250cm9sbGVyJ3MgV1dOLgordm9pZCBMb2FkV1dOKCBQVEFDSFlPTiBmY0NoaXAsIFVDSEFSKiBkZXN0LCBVQ0hBUiB0eXBlKQoreworICBVQ0hBUiogYlB0ciwgaTsKKworICBzd2l0Y2goIHR5cGUgKQorICB7CisgICAgY2FzZSAwOiAgLy8gUG9ydF9OYW1lCisgICAgICBiUHRyID0gKFVDSEFSKikmZmNDaGlwLT5SZWdpc3RlcnMud3duX2hpOworICAgICAgZm9yKCBpID0wOyBpPDQ7IGkrKykKKyAgICAgICAgZGVzdFtpXSA9ICpiUHRyKys7CisgICAgICBiUHRyID0gKFVDSEFSKikmZmNDaGlwLT5SZWdpc3RlcnMud3duX2xvOworICAgICAgZm9yKCBpID00OyBpPDg7IGkrKykKKyAgICAgICAgZGVzdFtpXSA9ICpiUHRyKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6ICAvLyBOb2RlL0ZhYnJpYyBfTmFtZQorICAgICAgYlB0ciA9IChVQ0hBUiopJmZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9oaTsKKyAgICAgIGZvciggaSA9MDsgaTw0OyBpKyspCisgICAgICAgIGRlc3RbaV0gPSAqYlB0cisrOworICAgICAgYlB0ciA9IChVQ0hBUiopJmZjQ2hpcC0+UmVnaXN0ZXJzLnd3bl9sbzsKKyAgICAgIGZvciggaSA9NDsgaTw4OyBpKyspCisgICAgICAgIGRlc3RbaV0gPSAqYlB0cisrOworICAgICAgYnJlYWs7CisgIH0KKyAgCit9CisKKworCisvLyBXZSBjaGVjayB0aGUgUG9ydCBMb2dpbiBwYXlsb2FkIGZvciByZXF1aXJlZCB2YWx1ZXMuICBOb3RlIHRoYXQKKy8vIEVMU19QTE9HSSBhbmQgRUxTX1BESVNDIChQb3J0IERJU0NvdmVyKSB1c2UgdGhlIHNhbWUgcGF5bG9hZC4KKworCitpbnQgdmVyaWZ5X1BMT0dJKCBQVEFDSFlPTiBmY0NoaXAsCisgICAgICAgICAgICAgICAgICBUYWNoRkNIRFJfR0NNTkQqIGZjaHMsIAorICAgICAgICAgICAgICAgICAgVUxPTkcqIHJlamVjdF9leHBsYWluKQoreworICBMT0dJTl9QQVlMT0FECWxvZ2luOworCisgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UsIGRlc3QsIGxlbiAoc2hvdWxkIGJlIG11bHQuIG9mIDQpCisgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZsb2dpbiwgIHNpemVvZihsb2dpbikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgRkMgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG90aGVyIHBvcnQncyBoaWdoZXN0IHN1cHBvcnRlZCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbGVzcyB0aGFuIG91ciBsb3dlc3QsIGFuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBvdGhlciBwb3J0J3MgbG93ZXN0CisgIGlmKCBsb2dpbi5jbW5fc2VydmljZXMuaGlnaGVzdF92ZXIgPCBmY0NoaXAtPmxvd2VzdF9GQ1BIX3ZlciB8fAorICAgICAgbG9naW4uY21uX3NlcnZpY2VzLmxvd2VzdF92ZXIgPiBmY0NoaXAtPmhpZ2hlc3RfRkNQSF92ZXIgKQorICB7CisgICAgKnJlamVjdF9leHBsYWluID0gTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgT1BUSU9OU19FUlJPUik7CisgICAgcmV0dXJuIExPR0lDQUxfRVJST1I7CisgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY2VpdmUgRGF0YSBGaWVsZCBTaXplIG11c3QgYmUgPj0xMjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXIgRkMtUEgKKyAgaWYgKGxvZ2luLmNtbl9zZXJ2aWNlcy5iYl9yeF9zaXplIDwgMTI4KQorICB7CisgICAgKnJlamVjdF9leHBsYWluID0gTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgREFUQV9GSUVMRF9TSVpFX0VSUk9SKTsKKyAgICByZXR1cm4gTE9HSUNBTF9FUlJPUjsKKyAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjaGVjayBDbGFzcyAzIHBhcmFtcworICBpZiggbG9naW4uY2xhc3MzLnNlcnZpY2Vfb3B0aW9ucyAmIENMQVNTX1ZBTElEKQorICB7CisgICAgaWYgKGxvZ2luLmNsYXNzMy5yeF9kYXRhX3NpemUgPCAxMjgpCisgICAgeworICAgICAgKnJlamVjdF9leHBsYWluID0gTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgSU5WQUxJRF9DU1ApOworICAgICAgcmV0dXJuIExPR0lDQUxfRVJST1I7CisgICAgfQorICAgIGlmKCBsb2dpbi5jbGFzczMuaW5pdGlhdG9yX2NvbnRyb2wgJiBYSURfUkVRVUlSRUQpCisgICAgeworICAgICAgKnJlamVjdF9leHBsYWluID0gTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgSU5JVElBVE9SX0NUTF9FUlJPUik7CisgICAgICByZXR1cm4gTE9HSUNBTF9FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7ICAgLy8gc3VjY2VzcworfQorCisKKworCitpbnQgdmVyaWZ5X1BSTEkoIFRhY2hGQ0hEUl9HQ01ORCogZmNocywgVUxPTkcqIHJlamVjdF9leHBsYWluKQoreworICBQUkxJX1JFUVVFU1QgcHJsaTsgIC8vIGJ1ZmZlciBmb3IgQklHIEVORElBTgorCisgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UsIGRlc3QsIGxlbiAoc2hvdWxkIGJlIG11bHQuIG9mIDQpCisgIEJpZ0VuZGlhblN3YXAoIChVQ0hBUiopJmZjaHMtPnBsWzBdLCAoVUNIQVIqKSZwcmxpLCAgc2l6ZW9mKHBybGkpKTsKKworICBpZiggcHJsaS5mY3BfaW5mbyA9PSAwICkgIC8vIGkuZS4sIG5vdCB0YXJnZXQgb3IgaW5pdGlhdG9yPworICB7CisgICAgKnJlamVjdF9leHBsYWluID0gTFNfUkpUX1JFQVNPTiggTE9HSUNBTF9FUlJPUiwgT1BUSU9OU19FUlJPUik7CisgICAgcmV0dXJuIExPR0lDQUxfRVJST1I7CisgIH0KKworICByZXR1cm4gMDsgIC8vIHN1Y2Nlc3MKK30KKworCisvLyBTV0FQIFVDSEFScyBhcyByZXF1aXJlZCBieSBGaWJyZSBDaGFubmVsIChpLmUuIEJJRyBFTkRJQU4pCisvLyBJTlBVVFM6CisvLyAgIHNvdXJjZSAgIC0gcHRyIHRvIExJVFRMRSBFTkRJQU4gVUxPTkdTCisvLyAgIGNudCAgICAgIC0gbnVtYmVyIG9mIFVDSEFScyB0byBzd2l0Y2ggKHNob3VsZCBiZSBtdWx0LiBvZiBVTE9ORykKKy8vIE9VVFBVVFM6CisvLyAgIGRlc3QgICAgIC0gcHRyIHRvIEJJRyBFTkRJQU4gY29weQorLy8gUkVUVVJOOgorLy8gICBub25lCisvLwordm9pZCBCaWdFbmRpYW5Td2FwKCBVQ0hBUiAqc291cmNlLCBVQ0hBUiAqZGVzdCwgIFVTSE9SVCBjbnQpCit7CisgIGludCBpLGo7CisKKyAgc291cmNlKz0zOyAgIC8vIHN0YXJ0IGF0IE1TQiBvZiAxc3QgVUxPTkcKKyAgZm9yKCBqPTA7IGogPCBjbnQ7IGorPTQsIHNvdXJjZSs9NCwgZGVzdCs9NCkgIC8vIGV2ZXJ5IFVMT05HCisgIHsKKyAgICBmb3IoIGk9MDsgaTw0OyBpKyspICAvLyBldmVyeSBVQ0hBUiBpbiBVTE9ORworICAgICAgICAgICooZGVzdCtpKSA9ICooc291cmNlLWkpOworICB9Cit9CisKKworCisKKy8vIEJ1aWxkIEZDIEV4Y2hhbmdlcy4uLi4uLi4uLi4uLgorCitzdGF0aWMgdm9pZCAgYnVpbGRGQ1BzdGF0dXMoIAorICBQVEFDSFlPTiBmY0NoaXAsIAorICBVTE9ORyBFeGNoYW5nZUlEKTsKKworc3RhdGljIExPTkcgRmluZEZyZWVFeGNoYW5nZSggUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyB0eXBlICk7CisKK3N0YXRpYyBVTE9ORyBidWlsZF9TRVNUX3NnTGlzdCggCisgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCisgIFVMT05HICpTRVNUYWxQYWlyU3RhcnQsCisgIFNjc2lfQ21uZCAqQ21uZCwKKyAgVUxPTkcgKnNnUGFpcnMsCisgIFBTR1BBR0VTICpzZ1BhZ2VzX2hlYWQgIC8vIGxpbmsgbGlzdCBvZiBUTCBFeHQuIFMvRyBwYWdlcyBmcm9tIE8vUyBQb29sCispOworCitzdGF0aWMgaW50IGJ1aWxkX0ZDUF9wYXlsb2FkKCBTY3NpX0NtbmQgKkNtbmQsIAorICBVQ0hBUiogcGF5bG9hZCwgVUxPTkcgdHlwZSwgVUxPTkcgZmNwX2RsICk7CisKKworLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJCCisgICAgICBFUlEgICAgICAgICAgIF9fX19fX19fX19fX19fX19fXworICB8ICAgICAgICAgIHwgICAvIHwgUmVxX0FfU0ZTX0xlbiAgICB8ICAgICAgICBfX19fX19fX19fX19fX19fX19fXworICB8LS0tLS0tLS0tLXwgIC8gIHwgUmVxX0FfU0ZTX0FkZHIgICB8LS0tLS0tLT58ICBSZXNlcnZlZCAgICAgICAgIHwKKyAgfCAgIElSQiAgICB8IC8gICB8IFJlcV9BX0RfSUQgICAgICAgfCAgICAgICAgfCBTT0YgRU9GIFRpbWVTdGFtcCB8CisgIHwtLS0tLS0tLS0tLS8gICAgfCBSZXFfQV9TRVNUX0luZGV4IHwtKyAgICAgIHwgUl9DVEwgfCAgIERfSUQgICAgfAorICB8ICAgSVJCICAgIHwgICAgIHwgUmVxX0IuLi4gICAgICAgICB8IHwgICAgICB8IENTX0NUTHwgICBTX0lEICAgIHwgCisgIHwtLS0tLS0tLS0tLVwgICAgfCAgICAgICAgICAgICAgICAgIHwgfCAgICAgIHwgVFlQRSAgfCAgIEZfQ1RMICAgfAorICB8ICAgSVJCICAgIHwgXCAgIHwgICAgICAgICAgICAgICAgICB8IHwgICAgICB8IFNFUV9JRCAgfCBTRVFfQ05UIHwKKyAgfC0tLS0tLS0tLS0tICBcICB8ICAgICAgICAgICAgICAgICAgfCArLS0+Ky0tfCBPWF9JRCAgIHwgUlhfSUQgICB8CisgIHwgICAgICAgICAgfCAgIFwgfF9fX19fX19fX19fX19fX19fX3wgICAgIHwgIHwgICAgICAgUk8gICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8IHBsIChwYXlsb2FkL2NtbmQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgICAgICAgLi4uLi4gICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHxfX19fX19fX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfAorfAorfCAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gSVdFICAgIAorfCAgICBTRVNUICAgICAgICAgICBfX19fX19fX19fX19fX19fX18gICAgICAgICAgICAgZm9yIEZDUF9EQVRBCit8IHwgICAgICAgICAgfCAgIC8gfCAgICAgICB8IEhkcl9MZW4gIHwgICAgICAgIF9fX19fX19fX19fX19fX19fX19fCit8IHwtLS0tLS0tLS0tfCAgLyAgfCAgSGRyX0FkZHJfQWRkciAgIHwtLS0tLS0tPnwgIFJlc2VydmVkICAgICAgICAgfAorfCB8ICAgWzBdICAgIHwgLyAgIHxSZW1vdGVfSUR8IFJTUF9MZW58ICAgICAgICB8IFNPRiBFT0YgVGltZVN0YW1wIHwKK3wgfC0tLS0tLS0tLS0tLyAgICB8ICAgUlNQX0FkZHIgICAgICAgfC0tLSsgICAgfCBSX0NUTCB8ICAgRF9JRCAgICB8CisrLT4gICBbMV0gICAgfCAgICAgfCAgICAgICB8IEJ1ZmZfT2ZmIHwgICB8ICAgIHwgQ1NfQ1RMfCAgIFNfSUQgICAgfCAKKyAgfC0tLS0tLS0tLS0tXCAgICB8QnVmZkluZGV4fCBMaW5rICAgfCAgIHwgICAgfCBUWVBFICB8ICAgRl9DVEwgICB8CisgIHwgICBbMl0gICAgfCBcICAgfCBSc3ZkICB8ICAgUlhfSUQgIHwgICB8ICAgIHwgU0VRX0lEICB8IFNFUV9DTlQgfAorICB8LS0tLS0tLS0tLS0gIFwgIHwgICAgRGF0YV9MZW4gICAgICB8ICAgfCAgICB8IE9YX0lEICAgfCBSWF9JRCAgIHwKKyAgfCAgICAuLi4gICB8ICAgXCB8ICAgICBFeHBfUk8gICAgICAgfCAgIHwgICAgfCAgICAgICBSTyAgICAgICAgICB8CisgIHwtLS0tLS0tLS0tfCAgICAgfCAgIEV4cF9CeXRlX0NudCAgIHwgICB8ICAgIHxfX19fX19fX19fX19fX19fX19ffAorICB8IFNFU1RfTEVOIHwgICstLXwgICAgTGVuICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB8X19fX19fX19fX3wgIHwgIHwgICBBZGRyZXNzICAgICAgICB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB8ICB8ICAgIC4uLiAgICAgICAgICAgfCAgIHwgICAgICAgICBmb3IgRkNQX1JTUCAgCisgICAgICAgICAgICAgICAgfCAgfF9fX19fX19fX19fX19fX19fX3wgICB8ICAgIF9fX19fX19fX19fX19fX19fX19fCisgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLXwgIFJlc2VydmVkICAgICAgICAgfCAgIAorICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNPRiBFT0YgVGltZVN0YW1wIHwKKyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSX0NUTCB8ICAgRF9JRCAgICB8CisgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ1NfQ1RMfCAgIFNfSUQgICAgfCAKKyAgICAgICAgICAgICAgICArLS0tIGxvY2FsIG9yIGV4dGVuZGVkICAgICAgICAgfCAgICAgLi4uLiAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICBzY2F0dGVyL2dhdGhlciBsaXN0cworICAgICAgICAgICAgICAgICAgICAgZGVmaW5pbmcgdXBwZXItbGF5ZXIKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEgKGUuZy4gZnJvbSB1c2VyJ3MgQXBwKQorCisKKyovCisvLyBBbGwgVGFjaExpdGUgY29tbWFuZHMgbXVzdCBzdGFydCB3aXRoIGEgU0ZTIChTaW5nbGUgRnJhbWUgU2VxdWVuY2UpCisvLyBjb21tYW5kLiAgSW4gdGhlIHNpbXBsZXN0IGNhc2UgKGEgTk9QIEJhc2ljIExpbmsgY29tbWFuZCksCisvLyBvbmx5IG9uZSBmcmFtZSBoZWFkZXIgYW5kIEVSUSBlbnRyeSBpcyByZXF1aXJlZC4gIFRoZSBtb3N0IGNvbXBsZXgKKy8vIGNhc2UgaXMgdGhlIFNDU0kgYXNzaXN0ZWQgY29tbWFuZCwgd2hpY2ggcmVxdWlyZXMgYW4gRVJRIGVudHJ5LAorLy8gU0VTVCBlbnRyeSwgYW5kIHNldmVyYWwgZnJhbWUgaGVhZGVycyBhbmQgZGF0YSBidWZmZXJzIGFsbAorLy8gbG9naWNhbGx5IGxpbmtlZCB0b2dldGhlci4KKy8vIElucHV0czoKKy8vICAgY3BxZmNIQkFkYXRhICAtIGNvbnRyb2xsZXIgc3RydWN0CisvLyAgIHR5cGUgICAgICAgICAgLSBQTE9HSSwgU0NTSV9JV0UsIGV0Yy4KKy8vICAgSW5GQ0hTICAgICAgICAtIEluY29taW5nIFRhY2hsaXRlIEZDSFMgd2hpY2ggcHJvbXB0ZWQgdGhpcyBleGNoYW5nZQorLy8gICAgICAgICAgICAgICAgICAgKG9ubHkgc19pZCBzZXQgaWYgd2UgYXJlIG9yaWdpbmF0aW5nKQorLy8gICBEYXRhICAgICAgICAgIC0gUFZPSUQgdG8gZGF0YSBzdHJ1Y3QgY29uc2lzdGVudCB3aXRoICJ0eXBlIgorLy8gICBmY0V4Y2hhbmdlSW5kZXggLSBwb2ludGVyIHRvIE9YL1JEIElEIHZhbHVlIG9mIGJ1aWx0IGV4Y2hhbmdlCisvLyBSZXR1cm46CisvLyAgIGZjRXhjaGFuZ2VJbmRleCAtIE9YL1JEIElEIHZhbHVlIGlmIHN1Y2Nlc3NmdWwKKy8vICAgMCAgICAtIHN1Y2Nlc3MKKy8vICBJTlZBTElEX0FSR1MgICAgLSBOVUxMLyBpbnZhbGlkIHBhc3NlZCBhcmdzCisvLyAgQkFEX0FMUEEgICAgICAgIC0gQmFkIHNvdXJjZSBhbF9wYSBhZGRyZXNzCisvLyAgTE5LRFdOX09TTFMgICAgIC0gTGluayBEb3duIChhY2NvcmRpbmcgdG8gdGhpcyBjb250cm9sbGVyKQorLy8gIE9VVFFVRV9GVUxMICAgICAtIE91dGJvdW5kIFF1ZSBmdWxsCisvLyAgRFJJVkVSUV9GVUxMICAgIC0gY29udHJvbGxlcidzIEV4Y2hhbmdlIGFycmF5IGZ1bGwKKy8vICBTRVNUX0ZVTEwgICAgICAgLSBTRVNUIHRhYmxlIGZ1bGwKKy8vCisvLyBSZW1hcmtzOgorLy8gUHN1ZWRvIGNvZGU6CisvLyBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAvIGJhZCBhcmdzCisvLyBCdWlsZCBvdXRnb2luZyBGQ0hTIC0gdGhlIGhlYWRlci9wYXlsb2FkIHN0cnVjdAorLy8gQnVpbGQgSVJCIChmb3IgRVJRIGVudHJ5KQorLy8gaWYgU0NTSSBjb21tYW5kLCBidWlsZCBTRVNUIGVudHJ5IChlLmcuIElXRSwgVFJFLC4uLikKKy8vIHJldHVybiBzdWNjZXNzCisKKy8vc2J1aWxkZXgKK1VMT05HIGNwcWZjVFNCdWlsZEV4Y2hhbmdlKAorICBDUFFGQ0hCQSAqY3BxZmNIQkFkYXRhLAorICBVTE9ORyB0eXBlLCAvLyBlLmcuIFBMT0dJCisgIFRhY2hGQ0hEUl9HQ01ORCogSW5GQ0hTLCAgLy8gaW5jb21pbmcgRkNIUworICB2b2lkICpEYXRhLCAgICAgICAgICAgICAgIC8vIHRoZSBDREIsIHNjYXR0ZXIvZ2F0aGVyLCBldGMuICAKKyAgTE9ORyAqZmNFeGNoYW5nZUluZGV4ICkgICAvLyBwb2ludHMgdG8gYWxsb2NhdGVkIGV4Y2hhbmdlLCAKK3sKKyAgUFRBQ0hZT04gZmNDaGlwID0gJmNwcWZjSEJBZGF0YS0+ZmNDaGlwOworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBVTE9ORyB1bFN0YXR1cyA9IDA7ICAvLyBhc3N1bWUgT0sKKyAgVVNIT1JUIG94X0lELCByeF9JRD0weEZGRkY7CisgIFVMT05HIFNmc0xlbj0wTDsKKyAgVGFjaExpdGVJUkIqIHBJUkI7CisgIElSQmZsYWdzIElSQl9mbGFnczsKKyAgVUNIQVIgKnBJUkJfZmxhZ3MgPSAoVUNIQVIqKSZJUkJfZmxhZ3M7CisgIFRhY2hGQ0hEUl9HQ01ORCogQ01EZmNoczsKKyAgVGFjaEZDSERSKiBkYXRhSERSOyAgICAgLy8gMzIgYnl0ZSBIRUFERVIgT05MWSBGQ1AtREFUQSBidWZmZXIKKyAgVGFjaEZDSERSX1JTUCogcnNwSERSOyAgICAgLy8gMzIgYnl0ZSBoZWFkZXIgKyBSU1AgcGF5bG9hZAorICBTY3NpX0NtbmQgKkNtbmQgPSAoU2NzaV9DbW5kKilEYXRhOyAgIC8vIExpbnV4IFNjc2kgQ0RCLCBTL0csIC4uLgorICBUYWNoTGl0ZUlXRSogcElXRTsKKyAgVGFjaExpdGVJUkUqIHBJUkU7CisgIFRhY2hMaXRlVFdFKiBwVFdFOworICBUYWNoTGl0ZVRSRSogcFRSRTsKKyAgVUxPTkcgZmNwX2RsOyAgICAgICAgICAgLy8gdG90YWwgYnl0ZSBsZW5ndGggb2YgREFUQSB0cmFuc2ZlcnJlZAorICBVTE9ORyBmbDsgICAgICAgICAgICAgICAvLyBmcmFtZSBsZW5ndGggKEZDIGZyYW1lIHNpemUsIDEyOCwgMjU2LCA1MTIsIDEwMjQpCisgIFVMT05HIHNnUGFpcnM7ICAgICAgICAgIC8vIG51bWJlciBvZiB2YWxpZCBzY2F0dGVyL2dhdGhlciBwYWlycworICBpbnQgRkNQX1NDU0lfY29tbWFuZDsKKyAgQkFfQUNDX1BBWUxPQUQgKmJhX2FjYzsKKyAgQkFfUkpUX1BBWUxPQUQgKmJhX3JqdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBwYXNzZWQgQVJHUworICBpZiggIWZjQ2hpcC0+RVJRICkgICAgICAvLyBOVUxMIHB0ciBtZWFucyB1bmluaXRpYWxpemVkIFRhY2hsaXRlIGNoaXAKKyAgICByZXR1cm4gSU5WQUxJRF9BUkdTOworCisKKyAgaWYoIHR5cGUgPT0gU0NTSV9JUkUgfHwKKyAgICAgIHR5cGUgPT0gU0NTSV9UUkUgfHwKKyAgICAgIHR5cGUgPT0gU0NTSV9JV0UgfHwKKyAgICAgIHR5cGUgPT0gU0NTSV9UV0UpCisgICAgRkNQX1NDU0lfY29tbWFuZCA9IDE7CisKKyAgZWxzZQorICAgIEZDUF9TQ1NJX2NvbW1hbmQgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21tYW5kcyB0aGF0IHBhc3MgcGF5bG9hZCBkYXRhIChlLmcuIFNDU0kgd3JpdGUpCisgICAgICAgICAgICAgICAgICAgICAvLyBleGFtaW5lIGNvbW1hbmQgc3RydWN0IC0gdmVyaWZ5IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2Ygcy9nIGJ1ZmZlcnMgaXMgYWRlcXVhdGUgZm9yIHRvdGFsIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCAoZW5kIG9mIGxpc3QgaXMgTlVMTCBhZGRyZXNzKQorCisgIGlmKCBGQ1BfU0NTSV9jb21tYW5kICkKKyAgeworICAgIGlmKCBEYXRhICkgICAgIC8vIG11c3QgaGF2ZSBkYXRhIGRlc2NyaXB0b3IgKFMvRyBsaXN0IC0tIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgLy8gb25lIGFkZHJlc3Mgd2l0aCBhdCBsZWFzdCAxIGJ5dGUgb2YgZGF0YSkKKyAgICB7CisgICAgICAvLyBzb21ldGhpbmcgdG8gZG8gKGxhdGVyKT8KKyAgICB9CisKKyAgICBlbHNlCisgICAgICByZXR1cm4gSU5WQUxJRF9BUkdTOyAgLy8gaW52YWxpZCBEQVRBIHB0cgorICB9CisKKyAgICAKKworICAgICAgICAgLy8gd2UgY2FuIGJ1aWxkIGFuIEV4Y2hhbmdlIGZvciBsYXRlciBRdWV1aW5nIChvbiB0aGUgVEwgY2hpcCkKKyAgICAgICAgIC8vIGlmIGFuIGVtcHR5IHNsb3QgaXMgYXZhaWxhYmxlIGluIHRoZSBEZXZFeHQgZm9yIHRoaXMgY29udHJvbGxlcgorICAgICAgICAgLy8gbG9vayBmb3IgYXZhaWxhYmxlIEV4Y2hhbmdlIHNsb3QuLi4KKworICBpZiggdHlwZSAhPSBGQ1BfUkVTUE9OU0UgJiYKKyAgICAgIHR5cGUgIT0gQkxTX0FCVFMgJiYKKyAgICAgIHR5cGUgIT0gQkxTX0FCVFNfQUNDICkgIC8vIGFscmVhZHkgaGF2ZSBFeGNoYW5nZSBzbG90IQorICAgICpmY0V4Y2hhbmdlSW5kZXggPSBGaW5kRnJlZUV4Y2hhbmdlKCBmY0NoaXAsIHR5cGUgKTsKKworICBpZiggKmZjRXhjaGFuZ2VJbmRleCAhPSAtMSApICAgLy8gRXhjaGFuZ2UgaXMgYXZhaWxhYmxlPworICB7CisgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gdG1wIHB0ciAoc2hvcnRoYW5kKQorICAgIENNRGZjaHMgPSAmRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS5mY2hzOyAKKworICAgIGlmKCBDbW5kICE9IE5VTEwgKSAvLyAobmVjZXNzYXJ5IGZvciBBQlRTIGNhc2VzKQorICAgIHsKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0uQ21uZCA9IENtbmQ7IC8vIExpbnV4IFNjc2kKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0ucExvZ2dlZEluUG9ydCA9IAorCWZjRmluZExvZ2dlZEluUG9ydCggZmNDaGlwLAorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0uQ21uZCwgLy8gZmluZCBTY3NpIE5leHVzCisgICAgICAgICAgMCwgICAgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgcG9ydCBpZAorCSAgTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgV1dOCisgICAgICAgICAgTlVMTCk7ICAgIC8vIERPTidUIGNhcmUgYWJvdXQgZW5kIG9mIGxpc3QKKworICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgY29tbWFuZCBmcmFtZSBoZWFkZXIgKCYgZGF0YSkgYWNjb3JkaW5nCisgICAgICAgICAgICAgICAgICAgICAvLyB0byBjb21tYW5kIHR5cGUKKworICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzIGNvbW1vbiBmb3IgYWxsIFNGUyBmcmFtZSB0eXBlcworICAgIENNRGZjaHMtPnJlc2VydmVkID0gMEw7IC8vIG11c3QgY2xlYXIKKyAgICBDTURmY2hzLT5zb2ZfZW9mID0gMHg3NTAwMDAwMEw7ICAvLyBTT0ZpMzpFT0ZuICBubyBVQU07IExDcj0wLCBubyBUUworICAgIAorICAgICAgICAgICAgIC8vIGdldCB0aGUgZGVzdGluYXRpb24gcG9ydF9pZCBmcm9tIGluY29taW5nIEZDSFMKKyAgICAgICAgICAgICAvLyAoaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaWYgd2UncmUgT3JpZ2luYXRvcikKKyAgICAgICAgICAgICAvLyBGcmFtZSBnb2VzIHRvIHBvcnQgaXQgd2FzIGZyb20gLSB0aGUgc291cmNlX2lkCisgICAgCisgICAgQ01EZmNocy0+ZF9pZCA9IEluRkNIUy0+c19pZCAmMHhGRkZGRkY7IC8vIGRlc3RpbmF0aW9uIChhZGQgUl9DVEwgbGF0ZXIpCisgICAgQ01EZmNocy0+c19pZCA9IGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhOyAvLyBDU19DVEwgPSAwCisKKworICAgIC8vIG5vdyBlbnRlciBjb21tYW5kLXNwZWNpZmljIGZpZWxkcworICAgIHN3aXRjaCggdHlwZSApCisgICAgeworCisgICAgY2FzZSBCTFNfTk9QOiAgIC8vIEZDIGRlZmluZWQgYmFzaWMgbGluayBzZXJ2aWNlIGNvbW1hbmQgTk8tT1AKKyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdW5pcXVlIFhfSURzISAodXNlIHRyYWNraW5nIGZ1bmN0aW9uKQorCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKG5vdCBTRVNUIGluZGV4KQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSAzMkw7ICAgICAgICAvLyBhZGQgbGVuIHRvIExTQiAoaGVhZGVyIG9ubHkgLSBubyBwYXlsb2FkKQorCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDAgQmFzaWMgTGluayBTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgb3JpZ2luYXRvciwgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICBDTURmY2hzLT5kX2lkIHw9IDB4ODAwMDAwMDBMOyAgLy8gUl9DVEwgPSA4MCBmb3IgTk9QIChCYXNpYyBMaW5rIFNlci4pCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDAzMTAwMDBMOyAgLy8geGNobmcgb3JpZ2luYXRvciwgMXN0IHNlcSwuLi4uCisgICAgICBDTURmY2hzLT5zZXFfY250ID0gMHgwTDsKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gMHhGRkZGOyAgICAgICAgLy8gUlhfSUQgZm9yIG5vdzsgT1hfSUQgb24gc3RhcnQKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisgICAgICBDTURmY2hzLT5wbFswXSA9IDB4YWFiYmNjZGRMOyAgIC8vIHdvcmRzIDgtMTUgZnJhbWUgZGF0YSBwYXlsb2FkIChuL2EpCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSAxOyAvLyBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChOT1Agc2hvdWxkIGNvbXBsZXRlIH5pbnN0YW50bHkpCisgICAgICBicmVhazsKKworCisgICAgCisgICAgCisgICAgY2FzZSBCTFNfQUJUU19BQ0M6ICAvLyBBYm9ydCBTZXF1ZW5jZSBBQ0NlcHQKKyAgICAgICpwSVJCX2ZsYWdzID0gMDsgICAgICAvLyBjbGVhciBJUkIgZmxhZ3MKKyAgICAgIElSQl9mbGFncy5TRkEgPSAxOyAgICAvLyBzZW5kIFNGUyAobm90IFNFU1QgaW5kZXgpCisgICAgICBTZnNMZW4gPSAqcElSQl9mbGFnczsKKworICAgICAgU2ZzTGVuIDw8PSAyNDsgICAgICAgIC8vIHNoaWZ0IGZsYWdzIHRvIE1TQgorICAgICAgU2ZzTGVuICs9IDMyICsgMTI7ICAgIC8vIGFkZCBsZW4gdG8gTFNCIChoZWFkZXIgKyAzIERXT1JEIHBheWxvYWQpCisKKyAgICAgIENNRGZjaHMtPmRfaWQgfD0gMHg4NDAwMDAwMEw7ICAvLyBSX0NUTCA9IDg0IGZvciBCQVNJQyBBQ0NlcHQKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSAwMCBCYXNpYyBMaW5rIFNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSBleGNoZyBvcmlnaW5hdG9yLCBub3QgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDA5MTAwMDBMOyAgLy8geGNobmdlIHJlc3BvbmRlciwgbGFzdCBzZXEsIHhmZXIgU0kKKyAgICAgICAgICAgICAgICAgICAvLyBDTURmY2hzLT5zZXFfaWQgJiBjb3VudCBtaWdodCBiZSBzZXQgZnJvbSBEYXRhSGRyPworICAgICAgQ01EZmNocy0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IDU7IC8vIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChUaW1lb3V0IGluIGNhc2Ugb2Ygd2VpcmQgZXJyb3IpCisgICAgICAKKyAgICAgIC8vIG5vdyBzZXQgdGhlIEFDQ2VwdCBwYXlsb2FkLi4uCisgICAgICBiYV9hY2MgPSAoQkFfQUNDX1BBWUxPQUQqKSZDTURmY2hzLT5wbFswXTsKKyAgICAgIG1lbXNldCggYmFfYWNjLCAwLCBzaXplb2YoIEJBX0FDQ19QQVlMT0FEKSk7CisgICAgICAvLyBTaW5jZSBQTERBIHJlcXVpcmVzIChvbmx5KSBlbnRpcmUgRXhjaGFuZ2UgYWJvcnRzLCB3ZSBkb24ndCBuZWVkCisgICAgICAvLyB0byB3b3JyeSBhYm91dCB3aGF0IHRoZSBsYXN0IHNlcXVlbmNlIHdhcy4KKworICAgICAgLy8gV2UgZXhwZWN0IHRoYXQgYSAidGFyZ2V0IiB0YXNrIGlzIGFjY2VwdGluZyB0aGUgYWJvcnQsIHNvIHdlCisgICAgICAvLyBjYW4gdXNlIHRoZSBPWC9SWCBJRCBwYWlyIAorICAgICAgYmFfYWNjLT5veF9yeF9pZCA9IENNRGZjaHMtPm94X3J4X2lkOworIAorICAgICAgLy8gc291cmNlLCBkZXN0LCAjYnl0ZXMKKyAgICAgIEJpZ0VuZGlhblN3YXAoKFVDSEFSICopJkNNRGZjaHMtPm94X3J4X2lkLCAoVUNIQVIgKikmYmFfYWNjLT5veF9yeF9pZCwgNCk7CisKKyAgICAgIGJhX2FjYy0+bG93X3NlcV9jbnQgPSAwOworICAgICAgYmFfYWNjLT5oaWdoX3NlcV9jbnQgPSAweEZGRkY7CisKKworICAgICAgYnJlYWs7CisgICAgCisKKyAgICBjYXNlIEJMU19BQlRTX1JKVDogIC8vIEFib3J0IFNlcXVlbmNlIEFDQ2VwdAorICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIChub3QgU0VTVCBpbmRleCkKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gMzIgKyAxMjsgICAgLy8gYWRkIGxlbiB0byBMU0IgKGhlYWRlciArIDMgRFdPUkQgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAweDg1MDAwMDAwTDsgIC8vIFJfQ1RMID0gODUgZm9yIEJBU0lDIFJlSmVjVAorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIG9yaWdpbmF0b3IsIG5vdCAxc3Qgc2VxLCB4ZmVyIFMuSS4KKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSAwMCBCYXNpYyBMaW5rIFNlcnZpY2UKKyAgICAgIENNRGZjaHMtPmZfY3RsID0gMHgwMDkxMDAwMEw7ICAvLyB4Y2huZ2UgcmVzcG9uZGVyLCBsYXN0IHNlcSwgeGZlciBTSQorICAgICAgICAgICAgICAgICAgIC8vIENNRGZjaHMtPnNlcV9pZCAmIGNvdW50IG1pZ2h0IGJlIHNldCBmcm9tIERhdGFIZHI/CisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gNTsgLy8gc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFRpbWVvdXQgaW4gY2FzZSBvZiB3ZWlyZCBlcnJvcikKKyAgICAgIAorICAgICAgQ01EZmNocy0+b3hfcnhfaWQgPSBJbkZDSFMtPm94X3J4X2lkOyAvLyBjb3B5IGZyb20gc2VuZGVyIQorICAgICAgCisgICAgICAvLyBub3cgc2V0IHRoZSBSZUplY1QgcGF5bG9hZC4uLgorICAgICAgYmFfcmp0ID0gKEJBX1JKVF9QQVlMT0FEKikmQ01EZmNocy0+cGxbMF07CisgICAgICBtZW1zZXQoIGJhX3JqdCwgMCwgc2l6ZW9mKCBCQV9SSlRfUEFZTE9BRCkpOworCisgICAgICAvLyBXZSBleHBlY3QgdGhhdCBhICJ0YXJnZXQiIHRhc2sgY291bGRuJ3QgZmluZCB0aGUgRXhoYW5nZSBpbiB0aGUKKyAgICAgIC8vIGFycmF5IG9mIGFjdGl2ZSBleGNoYW5nZXMsIHNvIHdlIHVzZSBhIG5ldyBMaW5rU2VydmljZSBYX0lELgorICAgICAgLy8gU2VlIFJlamVjdCBwYXlsb2FkIGRlc2NyaXB0aW9uIGluIEZDLVBIIChSZXYgNC4zKSwgcGcuIDE0MAorICAgICAgYmFfcmp0LT5yZWFzb25fY29kZSA9IDB4MDk7IC8vICJ1bmFibGUgdG8gcGVyZm9ybSBjb21tYW5kIHJlcXVlc3QiCisgICAgICBiYV9yanQtPnJlYXNvbl9leHBsYWluID0gMHgwMzsgLy8gaW52YWxpZCBPWC9SWCBJRCBwYWlyCisKKworICAgICAgYnJlYWs7CisgICAgCisgICAgCisgICAgY2FzZSBCTFNfQUJUUzogICAvLyBGQyBkZWZpbmVkIGJhc2ljIGxpbmsgc2VydmljZSBjb21tYW5kIEFCVFMgCisgICAgICAgICAgICAgICAgICAgICAvLyBBYm9ydCBTZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICpwSVJCX2ZsYWdzID0gMDsgICAgICAvLyBjbGVhciBJUkIgZmxhZ3MKKyAgICAgIElSQl9mbGFncy5TRkEgPSAxOyAgICAvLyBzZW5kIFNGUyAobm90IFNFU1QgaW5kZXgpCisgICAgICBTZnNMZW4gPSAqcElSQl9mbGFnczsKKworICAgICAgU2ZzTGVuIDw8PSAyNDsgICAgICAgIC8vIHNoaWZ0IGZsYWdzIHRvIE1TQgorICAgICAgU2ZzTGVuICs9IDMyTDsgICAgICAgIC8vIGFkZCBsZW4gdG8gTFNCIChoZWFkZXIgb25seSAtIG5vIHBheWxvYWQpCisKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSAwMCBCYXNpYyBMaW5rIFNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSBleGNoZyBvcmlnaW5hdG9yLCBub3QgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICBDTURmY2hzLT5kX2lkIHw9IDB4ODEwMDAwMDBMOyAgLy8gUl9DVEwgPSA4MSBmb3IgQUJUUworICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDAwMTEwMDAwTDsgIC8vIHhjaG5nZSBvcmlnaW5hdG9yLCBsYXN0IHNlcSwgeGZlciBTSQorICAgICAgICAgICAgICAgICAgIC8vIENNRGZjaHMtPnNlcV9pZCAmIGNvdW50IG1pZ2h0IGJlIHNldCBmcm9tIERhdGFIZHI/CisgICAgICBDTURmY2hzLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMjsgLy8gc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEFCVFMgbXVzdCB0aW1lb3V0IHdoZW4gcmVzcG9uZGVyIGlzIGdvbmUpCisgICAgICBicmVhazsKKworICAgIAorICAgIAorICAgIGNhc2UgRkNTX05TUjogICAgLy8gRmFicmljIE5hbWUgU2VydmljZSBSZXF1ZXN0CisgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS5yZVRyaWVzID0gMjsKKworCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSAyOyAvLyBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1hfSUQsIGxpbmtlZCB0byBEcml2ZXIgVHJhbnNhY3Rpb24gSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZml4LXVwIGF0IFF1ZWluZyB0aW1lKQorICAgICAgQ01EZmNocy0+b3hfcnhfaWQgPSAweEZGRkY7IC8vIFJYX0lEIC0gUmVzcG9uZGVyICh0YXJnZXQpIHRvIG1vZGlmeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1hfSUQgc2V0IGF0IEVSUXVlaW5nIHRpbWUKKyAgICAgICpwSVJCX2ZsYWdzID0gMDsgICAgICAvLyBjbGVhciBJUkIgZmxhZ3MKKyAgICAgIElSQl9mbGFncy5TRkEgPSAxOyAgICAvLyBzZW5kIFNGUyAobm90IFNFU1QgaW5kZXgpCisgICAgICBTZnNMZW4gPSAqcElSQl9mbGFnczsKKworICAgICAgU2ZzTGVuIDw8PSAyNDsgICAgICAgIC8vIHNoaWZ0IGZsYWdzIHRvIE1TQgorICAgICAgU2ZzTGVuICs9ICgzMkwgKyBzaXplb2YoTlNSX1BMKSk7IC8vIGFkZCBsZW4gKGhlYWRlciAmIE5TUiBwYXlsb2FkKQorCisgICAgICBDTURmY2hzLT5kX2lkIHw9IDB4MDIwMDAwMDBMOyAgLy8gUl9DVEwgPSAwMiBmb3IgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lIFNlcnZpY2UgUmVxdWVzdDogVW5zb2xpY2l0ZWQgCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDEgRXh0ZW5kZWQgTGluayBTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgb3JpZ2luYXRvciwgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MjAyMTAwMDBMOworICAgICAgICAgICAgICAgICAgIC8vIE9YX0lEIHdpbGwgYmUgZml4ZWQtdXAgYXQgVGFjaHlvbiBlbnF1ZWluZyB0aW1lCisgICAgICBDTURmY2hzLT5zZXFfY250ID0gMDsgLy8gc2VxIElELCBERl9jdGwsIHNlcSBjbnQKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKyAgICAgIEJ1aWxkTGlua1NlcnZpY2VQYXlsb2FkKCBmY0NoaXAsIHR5cGUsICZDTURmY2hzLT5wbFswXSk7CisKKyAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgICAgYnJlYWs7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgY2FzZSBFTFNfUExPR0k6ICAvLyBGQy1QSCBleHRlbmRlZCBsaW5rIHNlcnZpY2UgY29tbWFuZCBQb3J0IExvZ2luCisgICAgICAvLyAoTWF5LCAyMDAwKQorICAgICAgLy8gTk9URSEgVGhpcyBzcGVjaWFsIGNhc2UgZmFjaWxpdGF0ZXMgU0FOTWFyayB0ZXN0aW5nLiAgVGhlIFNBTk1hcmsKKyAgICAgIC8vIHRlc3Qgc2NyaXB0IGZvciBpbml0aWFsaXphdGlvbi10aW1lb3V0LmZjYWwuU0FOTWFyay0xLmZjCisgICAgICAvLyAiZWF0cyIgdGhlIE9QTigpIHByaW1pdGl2ZSB3aXRob3V0IGlzc3VpbmcgYW4gUl9SRFksIGNhdXNpbmcKKyAgICAgIC8vIFRhY2h5b24gdG8gcmVwb3J0IExTVCAobG9vcCBzdGF0ZSB0aW1lb3V0KSwgd2hpY2ggY2F1c2VzIGEKKyAgICAgIC8vIExJUC4gIFRvIGF2b2lkIHRoaXMsIHNpbXBseSBzZW5kIG91dCB0aGUgZnJhbWUgKGkuZS4gYXNzdW1pbmcgYQorICAgICAgLy8gYnVmZmVyIGNyZWRpdCBvZiAxKSB3aXRob3V0IHdhaXRpbmcgZm9yIFJfUkRZLiAgTWFueSBGQyBkZXZpY2VzCisgICAgICAvLyAob3RoZXIgdGhhbiBUYWNoeW9uKSBoYXZlIGJlZW4gZG9pbmcgdGhpcyBmb3IgeWVhcnMuICBXZSBkb24ndAorICAgICAgLy8gZXZlciB3YW50IHRvIGRvIHRoaXMgZm9yIG5vbi1MaW5rIFNlcnZpY2UgZnJhbWVzIHVubGVzcyB0aGUKKyAgICAgIC8vIG90aGVyIGRldmljZSByZWFsbHkgZGlkIHJlcG9ydCBub24temVybyBsb2dpbiBCQiBjcmVkaXQgKGkuZS4KKyAgICAgIC8vIGluIHRoZSBQTE9HSSBBQ0NlcHQgZnJhbWUpLgorLy8gICAgICBDTURmY2hzLT5zb2ZfZW9mIHw9IDB4MDAwMDA0MDBMOyAgLy8gTENyPTEKKyAgICAKKyAgICBjYXNlIEVMU19GRElTQzogIC8vIEZhYnJpYyBEaXNjb3ZlcnkgKExvZ2luKQorICAgIGNhc2UgRUxTX0ZMT0dJOiAgLy8gRmFicmljIExvZ2luCisgICAgY2FzZSBFTFNfU0NSOiAgICAvLyBGYWJyaWMgU3RhdGUgQ2hhbmdlIFJlZ2lzdHJhdGlvbgorICAgIGNhc2UgRUxTX0xPR086ICAgLy8gRkMtUEggZXh0ZW5kZWQgbGluayBzZXJ2aWNlIGNvbW1hbmQgUG9ydCBMb2dvdXQKKyAgICBjYXNlIEVMU19QRElTQzogIC8vIEZDLVBIIGV4dGVuZGVkIGxpbmsgc2VydmljZSBjbW5kIFBvcnQgRGlzY292ZXJ5CisgICAgY2FzZSBFTFNfUFJMSTogICAvLyBGQy1QSCBleHRlbmRlZCBsaW5rIHNlcnZpY2UgY21uZCBQcm9jZXNzIExvZ2luCisKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0ucmVUcmllcyA9IDI7CisKKworICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMjsgLy8gc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9YX0lELCBsaW5rZWQgdG8gRHJpdmVyIFRyYW5zYWN0aW9uIElECisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZpeC11cCBhdCBRdWVpbmcgdGltZSkKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gMHhGRkZGOyAvLyBSWF9JRCAtIFJlc3BvbmRlciAodGFyZ2V0KSB0byBtb2RpZnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9YX0lEIHNldCBhdCBFUlF1ZWluZyB0aW1lCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKG5vdCBTRVNUIGluZGV4KQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIGlmKCB0eXBlID09IEVMU19MT0dPICkKKyAgICAgICAgU2ZzTGVuICs9ICgzMkwgKyAxNkwpOyAvLyAgYWRkIGxlbiAoaGVhZGVyICYgUExPR0kgcGF5bG9hZCkKKyAgICAgIGVsc2UgaWYoIHR5cGUgPT0gRUxTX1BSTEkgKQorICAgICAgICBTZnNMZW4gKz0gKDMyTCArIDIwTCk7IC8vICBhZGQgbGVuIChoZWFkZXIgJiBQUkxJIHBheWxvYWQpCisgICAgICBlbHNlIGlmKCB0eXBlID09IEVMU19TQ1IgKQorICAgICAgICBTZnNMZW4gKz0gKDMyTCArIHNpemVvZihTQ1JfUEwpKTsgLy8gIGFkZCBsZW4gKGhlYWRlciAmIFNDUiBwYXlsb2FkKQorICAgICAgZWxzZQorICAgICAgICBTZnNMZW4gKz0gKDMyTCArIDExNkwpOyAvLyAgYWRkIGxlbiAoaGVhZGVyICYgUExPR0kgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAweDIyMDAwMDAwTDsgIC8vIFJfQ1RMID0gMjIgZm9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgTGlua19EYXRhOiBVbnNvbGljaXRlZCBDb250cm9sCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gMDEgRXh0ZW5kZWQgTGluayBTZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgb3JpZ2luYXRvciwgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDEyMTAwMDBMOworICAgICAgICAgICAgICAgICAgIC8vIE9YX0lEIHdpbGwgYmUgZml4ZWQtdXAgYXQgVGFjaHlvbiBlbnF1ZWluZyB0aW1lCisgICAgICBDTURmY2hzLT5zZXFfY250ID0gMDsgLy8gc2VxIElELCBERl9jdGwsIHNlcSBjbnQKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKyAgICAgIEJ1aWxkTGlua1NlcnZpY2VQYXlsb2FkKCBmY0NoaXAsIHR5cGUsICZDTURmY2hzLT5wbFswXSk7CisKKyAgICAgIGJyZWFrOworCisKKworICAgIGNhc2UgRUxTX0xPR09fQUNDOiAvLyBGQy1QSCBleHRlbmRlZCBsaW5rIHNlcnZpY2UgbG9nb3V0IGFjY2VwdAorICAgIGNhc2UgRUxTX1JKVDogICAgICAgICAgLy8gZXh0ZW5kZWQgbGluayBzZXJ2aWNlIHJlamVjdCAoYWRkIHJlYXNvbikKKyAgICBjYXNlIEVMU19BQ0M6ICAgICAgLy8gZXh0LiBsaW5rIHNlcnZpY2UgZ2VuZXJpYyBhY2NlcHQKKyAgICBjYXNlIEVMU19QTE9HSV9BQ0M6Ly8gZXh0LiBsaW5rIHNlcnZpY2UgbG9naW4gYWNjZXB0IChQTE9HSSBvciBQRElTQykKKyAgICBjYXNlIEVMU19QUkxJX0FDQzogLy8gZXh0LiBsaW5rIHNlcnZpY2UgcHJvY2VzcyBsb2dpbiBhY2NlcHQKKworCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSAxOyAvLyBhc3N1bWUgZG9uZQorICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB1bmlxdWUgWF9JRHMhICh1c2UgdHJhY2tpbmcgZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgLy8gT1hfSUQgZnJvbSBpbml0aWF0b3IgY21kCisgICAgICBveF9JRCA9IChVU0hPUlQpKEluRkNIUy0+b3hfcnhfaWQgPj4gMTYpOyAKKyAgICAgIHJ4X0lEID0gMHhGRkZGOyAvLyBSWF9JRCwgbGlua2VkIHRvIERyaXZlciBFeGNoYW5nZSBJRAorCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKG5vdCBTRVNUIGluZGV4KQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIGlmKCB0eXBlID09IEVMU19SSlQgKQorICAgICAgeworICAgICAgICBTZnNMZW4gKz0gKDMyTCArIDhMKTsgLy8gIGFkZCBsZW4gKGhlYWRlciArIHBheWxvYWQpCisKKyAgICAgICAgLy8gRUxTX1JKVCByZWFzb24gY29kZXMgKHV0aWxpemUgdW51c2VkICJyZXNlcnZlZCIgZmllbGQpCisgICAgICAgIENNRGZjaHMtPnBsWzBdID0gMTsKKyAgICAgICAgQ01EZmNocy0+cGxbMV0gPSBJbkZDSFMtPnJlc2VydmVkOyAgCisgICAgICAgICAgCisgICAgICB9CisgICAgICBlbHNlIGlmKCAodHlwZSA9PSBFTFNfTE9HT19BQ0MpIHx8ICh0eXBlID09IEVMU19BQ0MpICApCisgICAgICAgIFNmc0xlbiArPSAoMzJMICsgNEwpOyAvLyAgYWRkIGxlbiAoaGVhZGVyICsgcGF5bG9hZCkKKyAgICAgIGVsc2UgaWYoIHR5cGUgPT0gRUxTX1BMT0dJX0FDQyApCisgICAgICAgIFNmc0xlbiArPSAoMzJMICsgMTE2TCk7IC8vICBhZGQgbGVuIChoZWFkZXIgKyBwYXlsb2FkKQorICAgICAgZWxzZSBpZiggdHlwZSA9PSBFTFNfUFJMSV9BQ0MgKQorICAgICAgICBTZnNMZW4gKz0gKDMyTCArIDIwTCk7IC8vICBhZGQgbGVuIChoZWFkZXIgKyBwYXlsb2FkKQorCisgICAgICBDTURmY2hzLT5kX2lkIHw9IDB4MjMwMDAwMDBMOyAgLy8gUl9DVEwgPSAyMyBmb3IgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbmRlZCBMaW5rX0RhdGE6IENvbnRyb2wgUmVwbHkKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSAwMSBFeHRlbmRlZCBMaW5rIFNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSBleGNoZyByZXNwb25kZXIsIGxhc3Qgc2VxLCBlX3MsIHRzaQorICAgICAgQ01EZmNocy0+Zl9jdGwgPSAweDAxOTkwMDAwTDsKKyAgICAgIENNRGZjaHMtPnNlcV9jbnQgPSAweDBMOworICAgICAgQ01EZmNocy0+b3hfcnhfaWQgPSAwTDsgICAgICAgIC8vIGNsZWFyCisgICAgICBDTURmY2hzLT5veF9yeF9pZCA9IG94X0lEOyAvLyBsb2FkIHVwcGVyIDE2IGJpdHMKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkIDw8PSAxNjsgICAgICAvLyBzaGlmdCB0aGVtCisKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKyAgICAgIEJ1aWxkTGlua1NlcnZpY2VQYXlsb2FkKCBmY0NoaXAsIHR5cGUsICZDTURmY2hzLT5wbFswXSk7CisKKyAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWJyZSBDaGFubmVsIFNDU0kgJ29yaWdpbmF0b3InIHNlcXVlbmNlcy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChvcmlnaW5hdG9yIG1lYW5zICdpbml0aWF0b3InIGluIEZDUC1TQ1NJKQorCisgICAgY2FzZSBTQ1NJX0lXRTogLy8gVGFjaExpdGUgSW5pdGlhdG9yIFdyaXRlIEVudHJ5CisgICAgeworICAgICAgUEZDX0xPR0dFRElOX1BPUlQgcExvZ2dlZEluUG9ydCA9IAorICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnBMb2dnZWRJblBvcnQ7CisKKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0ucmVUcmllcyA9IDE7CisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSA3OyAvLyBGQzIgdGltZW91dAorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIC8vIGZpcnN0LCBidWlsZCBGQ1BfQ01ORAorICAgICAgLy8gdW5pcXVlIFhfSUQgZml4LXVwcyBpbiBTdGFydEV4Y2hhbmdlIAorCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgRkNQLUNNTkQgKG5vdCBTRVNUIGluZGV4KQorCisgICAgICAvLyBOT1RFOiB1bmxpa2UgRkMgTGlua1NlcnZpY2UgbG9naW4gZnJhbWVzLCBub3JtYWwKKyAgICAgIC8vIFNDU0kgY29tbWFuZHMgYXJlIHNlbnQgd2l0aG91dCBvdXRnb2luZyB2ZXJpZmljYXRpb24KKyAgICAgIElSQl9mbGFncy5EQ00gPSAxOyAgICAvLyBEaXNhYmxlIGNvbXBsZXRpb24gbWVzc2FnZSBmb3IgQ21uZCBmcmFtZQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSA2NEw7ICAgICAgICAvLyBhZGQgbGVuIHRvIExTQiAoaGVhZGVyICYgQ01ORCBwYXlsb2FkKQorCisgICAgICBDTURmY2hzLT5kX2lkIHw9ICgweDA2MDAwMDAwTCk7ICAvLyBSX0NUTCA9IDYgZm9yIGNvbW1hbmQKKworICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDggZm9yIEZDUCBTQ1NJCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgb3JpZ2luYXRvciwgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgdmFsaWQgUk8KKyAgICAgIENNRGZjaHMtPmZfY3RsID0gMHgwODIxMDAwOEw7CisgICAgICBDTURmY2hzLT5zZXFfY250ID0gMHgwTDsKKyAgICAgIENNRGZjaHMtPm94X3J4X2lkID0gMEw7ICAgICAgICAvLyBjbGVhciBmb3Igbm93ICgtb3ItIGluIGxhdGVyKQorICAgICAgQ01EZmNocy0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKworICAgICAgICAgICAgICAgICAgIC8vIG5vdywgZmlsbCBvdXQgRkNQLURBVEEgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgLy8gKHVzZSBidWZmZXIgaW5zaWRlIFNFU1Qgb2JqZWN0KQorICAgICAgZGF0YUhEUiA9ICZmY0NoaXAtPlNFU1QtPkRhdGFIRFJbICpmY0V4Y2hhbmdlSW5kZXggXTsKKyAgICAgIGRhdGFIRFItPnJlc2VydmVkID0gMEw7IC8vIG11c3QgY2xlYXIKKyAgICAgIGRhdGFIRFItPnNvZl9lb2YgPSAweDc1MDAyMDAwTDsgIC8vIFNPRmkzOkVPRm4gIG5vIFVBTTsgbm8gQ0xTLCBub0xDciwgbm8gVFMKKyAgICAgIGRhdGFIRFItPmRfaWQgPSAoSW5GQ0hTLT5zX2lkIHwgMHgwMTAwMDAwMEwpOyAvLyBSX0NUTD0gRkNQX0RBVEEKKyAgICAgIGRhdGFIRFItPnNfaWQgPSBmY0NoaXAtPlJlZ2lzdGVycy5teV9hbF9wYTsgLy8gQ1NfQ1RMID0gMAorICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDggZm9yIEZDUCBTQ1NJCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0geGZlciBTLkkufCB2YWxpZCBSTworICAgICAgZGF0YUhEUi0+Zl9jdGwgPSAweDA4MDEwMDA4TDsKKyAgICAgIGRhdGFIRFItPnNlcV9jbnQgPSAweDAyMDAwMDAwTDsgIC8vIHNlcXVlbmNlIElEOiBkZl9jdGwgOiBzZXFlbmNlIGNvdW50CisgICAgICBkYXRhSERSLT5veF9yeF9pZCA9IDBMOyAgICAgICAgLy8gY2xlYXI7IGZpeC11cCBkYXRhSERSIGZpZWxkcyBsYXRlcgorICAgICAgZGF0YUhEUi0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKworICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzZXR1cCB0aGUgU0VTVCBlbnRyeQorICAgICAgcElXRSA9ICZmY0NoaXAtPlNFU1QtPnVbICpmY0V4Y2hhbmdlSW5kZXggXS5JV0U7CisgICAgICAKKyAgICAgICAgICAgICAgICAgICAvLyBmaWxsIG91dCB0aGUgSVdFOgorCisgICAgICAgICAgICAgICAgLy8gVkFMaWQgZW50cnk6RGlyIG91dGJvdW5kOkRDTTplbmFibGUgQ006ZW5hbCBJTlQ6IEZDIGZyYW1lIGxlbgorICAgICAgcElXRS0+SGRyX0xlbiA9IDB4OGUwMDAwMjBMOyAvLyBkYXRhIGZyYW1lIExlbiBhbHdheXMgMzIgYnl0ZXMKKyAgICAgIAorICAgICAgCisgICAgICAvLyBmcm9tIGxvZ2luIHBhcmFtZXRlcnMgd2l0aCBvdGhlciBwb3J0LCB3aGF0J3MgdGhlIGxhcmdlc3QgZnJhbWUKKyAgICAgIC8vIHdlIGNhbiBzZW5kPyAKKyAgICAgIGlmKCBwTG9nZ2VkSW5Qb3J0ID09IE5VTEwpIAorICAgICAgeworCXVsU3RhdHVzID0gSU5WQUxJRF9BUkdTOyAgLy8gZmFpbGVkISBnaXZlIHVwCisJYnJlYWs7CisgICAgICB9CisgICAgICBpZiggcExvZ2dlZEluUG9ydC0+cnhfZGF0YV9zaXplICA+PSAyMDQ4KQorICAgICAgICBmbCA9IDB4MDAwMjAwMDA7ICAvLyAyMDQ4IGNvZGUgKG9ubHkgc3VwcG9ydCAxMDI0ISkKKyAgICAgIGVsc2UgaWYoIHBMb2dnZWRJblBvcnQtPnJ4X2RhdGFfc2l6ZSAgPj0gMTAyNCkKKyAgICAgICAgZmwgPSAweDAwMDIwMDAwOyAgLy8gMTAyNCBjb2RlCisgICAgICBlbHNlIGlmKCBwTG9nZ2VkSW5Qb3J0LT5yeF9kYXRhX3NpemUgID49IDUxMikKKyAgICAgICAgZmwgPSAweDAwMDEwMDAwOyAgLy8gNTEyIGNvZGUKKyAgICAgIGVsc2UKKwlmbCA9IDA7ICAvLyAxMjggYnl0ZXMgLS0gc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgCisgICAgICAKKyAgICAgIHBJV0UtPkhkcl9MZW4gfD0gZmw7IC8vIGFkZCB4bWl0IEZDIGZyYW1lIGxlbiBmb3IgZGF0YSBwaGFzZQorICAgICAgcElXRS0+SGRyX0FkZHIgPSBmY0NoaXAtPlNFU1QtPmJhc2UgKyAKKwkJKCh1bnNpZ25lZCBsb25nKSZmY0NoaXAtPlNFU1QtPkRhdGFIRFJbKmZjRXhjaGFuZ2VJbmRleF0gLSAKKwkJCSh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+U0VTVCk7CisKKyAgICAgIHBJV0UtPlJTUF9MZW4gPSBzaXplb2YoVGFjaEZDSERSX1JTUCkgOyAvLyBoZHIrZGF0YSAocmVjdidkIFJTUCBmcmFtZSkKKyAgICAgIHBJV0UtPlJTUF9MZW4gfD0gKEluRkNIUy0+c19pZCA8PCA4KTsgLy8gTVMgMjQgYml0cyBSZW1vdGVfSUQKKyAgICAgIAorICAgICAgbWVtc2V0KCAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbICpmY0V4Y2hhbmdlSW5kZXhdLnBsLCAwLCAKKyAgICAgICAgc2l6ZW9mKCBGQ1BfU1RBVFVTX1JFU1BPTlNFKSApOyAgLy8gY2xlYXIgb3V0IHByZXZpb3VzIHN0YXR1cworIAorICAgICAgcElXRS0+UlNQX0FkZHIgPSBmY0NoaXAtPlNFU1QtPmJhc2UgKyAKKwkJKCh1bnNpZ25lZCBsb25nKSZmY0NoaXAtPlNFU1QtPlJzcEhEUlsqZmNFeGNoYW5nZUluZGV4XSAtIAorCQkJKHVuc2lnbmVkIGxvbmcpZmNDaGlwLT5TRVNUKTsKKworICAgICAgICAgICAgICAgICAgIC8vIERvIHdlIG5lZWQgbG9jYWwgb3IgZXh0ZW5kZWQgZ2F0aGVyIGxpc3Q/CisgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiBzaXplIC0gd2UgY2FuIGhhbmRsZSAzIGxlbi9hZGRyIHBhaXJzCisgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS4KKworICAgICAgZmNwX2RsID0gYnVpbGRfU0VTVF9zZ0xpc3QoIAorCWNwcWZjSEJBZGF0YS0+UGNpRGV2LAorICAgICAgICAmcElXRS0+R0xlbjEsIAorICAgICAgICBDbW5kLCAgICAgICAvLyBTL0cgbGlzdAorICAgICAgICAmc2dQYWlycywgICAvLyByZXR1cm4gIyBvZiBwYWlycyBpbiBTL0cgbGlzdCAoZnJvbSAiRGF0YSIgZGVzY3JpcHRvcikKKyAgICAgICAgJmZjQ2hpcC0+U0VTVC0+c2dQYWdlc1sgKmZjRXhjaGFuZ2VJbmRleCBdKTsvLyAoZm9yIEZyZWVpbmcgbGF0ZXIpCisKKyAgICAgIGlmKCAhZmNwX2RsICkgLy8gZXJyb3IgYnVpbGRpbmcgUy9HIGxpc3Q/CisgICAgICB7CisgICAgICAgIHVsU3RhdHVzID0gTUVNUE9PTF9GQUlMOworICAgICAgICBicmVhazsgICAgICAvLyBnaXZlIHVwCisgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB0b3RhbCBkYXRhIGxlbmd0aCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFzc2VkIFMvRyBidWZmZXIsIHNldCBGQ1AgQ01ORCBmcmFtZQorICAgICAgYnVpbGRfRkNQX3BheWxvYWQoIENtbmQsIChVQ0hBUiopJkNNRGZjaHMtPnBsWzBdLCB0eXBlLCBmY3BfZGwgKTsKKworCisgICAgICAKKyAgICAgIGlmKCBzZ1BhaXJzID4gMyApICAvLyBuZWVkIGV4dGVuZGVkIHMvZyBsaXN0CisgICAgICAgIHBJV0UtPkJ1ZmZfT2ZmID0gMHg3ODAwMDAwMEw7IC8vIGV4dGVuZGVkIGRhdGEgfCAobm8gb2Zmc2V0KQorICAgICAgZWxzZSAgICAgICAgICAgICAgIC8vIGxvY2FsIGRhdGEgcG9pbnRlcnMgKGluIFNFU1QpCisgICAgICAgIHBJV0UtPkJ1ZmZfT2ZmID0gMHhmODAwMDAwMEw7IC8vIGxvY2FsIGRhdGEgfCAobm8gb2Zmc2V0KQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVTE9ORyA1CisgICAgICBwSVdFLT5MaW5rID0gMHgwMDAwZmZmZkw7ICAgLy8gQnVmZl9JbmRleCB8IExpbmsKKworICAgICAgcElXRS0+UlhfSUQgPSAweDBMOyAgICAgLy8gRFdvcmQgNjogUlhfSUQgc2V0IGJ5IHRhcmdldCBYRkVSX1JEWQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERXb3JkIDcKKyAgICAgIHBJV0UtPkRhdGFfTGVuID0gMEw7ICAgIC8vIFRMIGVudGVycyByY3YnZCBYRkVSX1JEWSBCVVJTVF9MRU4KKyAgICAgIHBJV0UtPkV4cF9STyA9IDBMOyAgICAgIC8vIERXb3JkIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERXb3JkIDkKKyAgICAgIHBJV0UtPkV4cF9CeXRlX0NudCA9IGZjcF9kbDsgIC8vIHN1bSBvZiBnYXRoZXIgYnVmZmVycworICAgIH0KKyAgICBicmVhazsKKworCisKKworCisgICAgY2FzZSBTQ1NJX0lSRTogLy8gVGFjaExpdGUgSW5pdGlhdG9yIFJlYWQgRW50cnkKKworICAgICAgaWYoIENtbmQtPnRpbWVvdXQgIT0gMCkKKyAgICAgIHsKKy8vCXByaW50aygiQ21uZC0+dGltZW91dCAlZFxuIiwgQ21uZC0+dGltZW91dCk7CisJLy8gcGVyIExpbnV4IFNjc2kKKyAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gQ21uZC0+dGltZW91dDsKKyAgICAgIH0KKyAgICAgIGVsc2UgIC8vIHVzZSBvdXIgYmVzdCBndWVzcywgYmFzZWQgb24gRkMgJiBkZXZpY2UKKyAgICAgIHsKKworICAgICAgICBpZiggQ21uZC0+U0NwLk1lc3NhZ2UgPT0gMSApIC8vIFRhcGUgZGV2aWNlPyAoZnJvbSBJTlFVSVJZKQkKKwl7CisJICAvLyB0dXJuIG9mZiBvdXIgdGltZW91dHMgKGZvciBub3cuLi4pCisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS50aW1lT3V0ID0gMHhGRkZGRkZGRjsgCisJfQorCWVsc2UKKwl7CisgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyAqZmNFeGNoYW5nZUluZGV4XS5yZVRyaWVzID0gMTsKKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSA3OyAvLyBwZXIgU0NTSSByZXEuCisJfQorICAgICAgfQorCisgIAorICAgICAgLy8gZmlyc3QsIGJ1aWxkIEZDUF9DTU5ECisKKworICAgICAgKnBJUkJfZmxhZ3MgPSAwOyAgICAgIC8vIGNsZWFyIElSQiBmbGFncworICAgICAgSVJCX2ZsYWdzLlNGQSA9IDE7ICAgIC8vIHNlbmQgU0ZTIEZDUC1DTU5EIChub3QgU0VTVCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB1bmxpa2UgRkMgTGlua1NlcnZpY2UgbG9naW4gZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCBTQ1NJIGNvbW1hbmRzIGFyZSBzZW50ICJvcGVuIGxvb3AiCisgICAgICBJUkJfZmxhZ3MuRENNID0gMTsgICAgLy8gRGlzYWJsZSBjb21wbGV0aW9uIG1lc3NhZ2UgZm9yIENtbmQgZnJhbWUKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gNjRMOyAgICAgICAgLy8gYWRkIGxlbiB0byBMU0IgKGhlYWRlciAmIENNTkQgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAoMHgwNjAwMDAwMEwpOyAgLy8gUl9DVEwgPSA2IGZvciBjb21tYW5kCisKKyAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSA4IGZvciBGQ1AgU0NTSQorICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIGV4Y2hnIG9yaWdpbmF0b3IsIDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHZhbGlkIFJPCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDgyMTAwMDhMOworICAgICAgQ01EZmNocy0+c2VxX2NudCA9IDB4MEw7CisgICAgICAvLyB4X0lEICYgZGF0YSBkaXJlY3Rpb24gYml0IHNldCBsYXRlcgorICAgICAgQ01EZmNocy0+b3hfcnhfaWQgPSAweEZGRkY7ICAgICAgICAvLyBjbGVhcgorICAgICAgQ01EZmNocy0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKworCisKKyAgICAgICAgICAgICAgICAgICAvLyBOb3cgc2V0dXAgdGhlIFNFU1QgZW50cnkKKyAgICAgIHBJUkUgPSAmZmNDaGlwLT5TRVNULT51WyAqZmNFeGNoYW5nZUluZGV4IF0uSVJFOworCisgICAgICAvLyBmaWxsIG91dCB0aGUgSVJFOgorICAgICAgLy8gVkFMaWQgZW50cnk6RGlyIG91dGJvdW5kOmVuYWJsZSBDTTplbmFsIElOVDoKKyAgICAgIHBJUkUtPlNlcV9BY2N1bSA9IDB4Q0UwMDAwMDBMOyAvLyBWQUwsRElSIGluYm91bmQsRENNfCBJTkksREFULFJTUAorCisgICAgICBwSVJFLT5yZXNlcnZlZCA9IDBMOworICAgICAgcElSRS0+UlNQX0xlbiA9IHNpemVvZihUYWNoRkNIRFJfUlNQKSA7IC8vIGhkcitkYXRhIChyZWN2J2QgUlNQIGZyYW1lKQorICAgICAgcElSRS0+UlNQX0xlbiB8PSAoSW5GQ0hTLT5zX2lkIDw8IDgpOyAvLyBNUyAyNCBiaXRzIFJlbW90ZV9JRAorCisgICAgICBwSVJFLT5SU1BfQWRkciA9IGZjQ2hpcC0+U0VTVC0+YmFzZSArIAorCQkoKHVuc2lnbmVkIGxvbmcpJmZjQ2hpcC0+U0VTVC0+UnNwSERSWypmY0V4Y2hhbmdlSW5kZXhdIC0gCisJCQkodW5zaWduZWQgbG9uZylmY0NoaXAtPlNFU1QpOworICAgICAgCisgICAgICAgICAgICAgICAgICAgLy8gRG8gd2UgbmVlZCBsb2NhbCBvciBleHRlbmRlZCBnYXRoZXIgbGlzdD8KKyAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRzIG9uIHNpemUgLSB3ZSBjYW4gaGFuZGxlIDMgbGVuL2FkZHIgcGFpcnMKKyAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LgorCisgICAgICBmY3BfZGwgPSBidWlsZF9TRVNUX3NnTGlzdCggCisJY3BxZmNIQkFkYXRhLT5QY2lEZXYsCisgICAgICAgICZwSVJFLT5TTGVuMSwgCisgICAgICAgIENtbmQsICAgICAgIC8vIFNDU0kgY29tbWFuZCBEYXRhIGRlc2MuIHdpdGggUy9HIGxpc3QKKyAgICAgICAgJnNnUGFpcnMsICAgLy8gcmV0dXJuICMgb2YgcGFpcnMgaW4gUy9HIGxpc3QgKGZyb20gIkRhdGEiIGRlc2NyaXB0b3IpCisgICAgICAgICZmY0NoaXAtPlNFU1QtPnNnUGFnZXNbICpmY0V4Y2hhbmdlSW5kZXggXSk7Ly8gKGZvciBGcmVlaW5nIGxhdGVyKQorICAgICAgCisgICAgICAKKyAgICAgIGlmKCAhZmNwX2RsICkgLy8gZXJyb3IgYnVpbGRpbmcgUy9HIGxpc3Q/CisgICAgICB7CisJLy8gSXQgaXMgcGVybWlzc2libGUgdG8gaGF2ZSBhIFpFUk8gTEVOR1RIIFJlYWQgY29tbWFuZC4KKwkvLyBJZiB0aGVyZSBpcyB0aGUgY2FzZSwgc2ltcGx5IHNldCBmY3BfZGwgKGFuZCBFeHBfQnl0ZV9DbnQpCisJLy8gdG8gMCBhbmQgY29udGludWUuCisJaWYoIENtbmQtPnJlcXVlc3RfYnVmZmxlbiA9PSAwICkKKwl7CisJICBmY3BfZGwgPSAwOyAvLyBubyBGQyBEQVRBIGZyYW1lcyBleHBlY3RlZAorCisJfQorCWVsc2UKKwl7CisgICAgICAgICAgdWxTdGF0dXMgPSBNRU1QT09MX0ZBSUw7CisgICAgICAgICAgYnJlYWs7ICAgICAgLy8gZ2l2ZSB1cAorCX0KKyAgICAgIH0KKworICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgUy9HIGxlbmd0aCwgYnVpbGQgQ01ORCBwYXlsb2FkCisgICAgICBidWlsZF9GQ1BfcGF5bG9hZCggQ21uZCwgKFVDSEFSKikmQ01EZmNocy0+cGxbMF0sIHR5cGUsIGZjcF9kbCApOworCisgICAgICAKKyAgICAgIGlmKCBzZ1BhaXJzID4gMyApICAvLyBuZWVkIGV4dGVuZGVkIHMvZyBsaXN0CisgICAgICAgIHBJUkUtPkJ1ZmZfT2ZmID0gMHgwMDAwMDAwMDsgLy8gRFdvcmQgNDogZXh0ZW5kZWQgcy9nIGxpc3QsIG5vIG9mZnNldAorICAgICAgZWxzZQorICAgICAgICBwSVJFLT5CdWZmX09mZiA9IDB4ODAwMDAwMDA7IC8vIGxvY2FsIGRhdGEsIG5vIG9mZnNldAorICAgICAgCisgICAgICBwSVJFLT5CdWZmX0luZGV4ID0gMHgwTDsgICAgLy8gRFdvcmQgNTogQnVmZl9JbmRleCB8IFJlc2VydmVkCisKKyAgICAgIHBJUkUtPkV4cF9STyAgPSAweDBMOyAgICAgICAvLyBEV29yZCA2OiBFeHBlY3RlZCBSZWwuIE9mZnNldAorCisgICAgICBwSVJFLT5CeXRlX0NvdW50ID0gMDsgIC8vIERXb3JkIDc6IGZpbGxlZCBpbiBieSBUTCBvbiBlcnIKKyAgICAgIHBJUkUtPnJlc2VydmVkXyA9IDA7ICAgLy8gRFdvcmQgODogcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogMCBsZW5ndGggUkVBRCBpcyBPSy4KKyAgICAgIHBJUkUtPkV4cF9CeXRlX0NudCA9IGZjcF9kbDsvLyBEV29yZCA5OiBzdW0gb2Ygc2NhdHRlciBidWZmZXJzCisgICAgICAKKyAgICAgIGJyZWFrOworCisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlicmUgQ2hhbm5lbCBTQ1NJICdyZXNwb25kZXInIHNlcXVlbmNlcy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChvcmlnaW5hdG9yIG1lYW5zICd0YXJnZXQnIGluIEZDUC1TQ1NJKQorICAgIGNhc2UgU0NTSV9UV0U6IC8vIFRhY2hMaXRlIFRhcmdldCBXcml0ZSBFbnRyeQorCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnRpbWVPdXQgPSAxMDsgLy8gcGVyIFNDU0kgcmVxLgorCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0LCBidWlsZCBGQ1BfQ01ORAorCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKFhGRVJfUkRZKQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSAoMzJMICsgMTJMKTsvLyBhZGQgU0ZTIGxlbiAoaGVhZGVyICYgWEZFUl9SRFkgcGF5bG9hZCkKKworICAgICAgQ01EZmNocy0+ZF9pZCB8PSAoMHgwNTAwMDAwMEwpOyAgLy8gUl9DVEwgPSA1IGZvciBYRkVSX1JEWQorCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gOCBmb3IgRkNQIFNDU0kKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSBleGNoZyByZXNwb25kZXIsIDFzdCBzZXEsIHhmZXIgUy5JLgorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHZhbGlkIFJPCisgICAgICBDTURmY2hzLT5mX2N0bCA9IDB4MDg4MTAwMDhMOworICAgICAgQ01EZmNocy0+c2VxX2NudCA9IDB4MDEwMDAwMDA7IC8vIHNlcXVlbmNlIElEOiBkZl9jdGw6IHNlcXVlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBvcmlnaW5hdG9yIChvdGhlciBwb3J0J3MpIE9YX0lECisgICAgICBDTURmY2hzLT5veF9yeF9pZCA9IEluRkNIUy0+b3hfcnhfaWQ7ICAgICAvLyB3ZSB3YW50IHVwcGVyIDE2IGJpdHMKKyAgICAgIENNRGZjaHMtPnJvID0gMHgwTDsgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IChuL2EpCisKKyAgICAgICAgICAgICAgICAgICAvLyBub3csIGZpbGwgb3V0IEZDUC1SU1AgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgLy8gKHVzZSBidWZmZXIgaW5zaWRlIFNFU1Qgb2JqZWN0KQorCisgICAgICByc3BIRFIgPSAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbICpmY0V4Y2hhbmdlSW5kZXggXTsKKyAgICAgIHJzcEhEUi0+cmVzZXJ2ZWQgPSAwTDsgLy8gbXVzdCBjbGVhcgorICAgICAgcnNwSERSLT5zb2ZfZW9mID0gMHg3NTAwMDAwMEw7ICAvLyBTT0ZpMzpFT0ZuICBubyBVQU07IG5vIENMUywgbm9MQ3IsIG5vIFRTCisgICAgICByc3BIRFItPmRfaWQgPSAoSW5GQ0hTLT5zX2lkIHwgMHgwNzAwMDAwMEwpOyAvLyBSX0NUTD0gRkNQX1JTUAorICAgICAgcnNwSERSLT5zX2lkID0gZmNDaGlwLT5SZWdpc3RlcnMubXlfYWxfcGE7IC8vIENTX0NUTCA9IDAKKyAgICAgICAgICAgICAgICAgICAvLyBUWVBFWzMxLTI0XSA4IGZvciBGQ1AgU0NTSQorICAgICAgICAgICAgICAgICAgIC8vIGZfY3RsWzIzOjBdIHJlc3BvbmRlcnxsYXN0IHNlcXwgeGZlciBTLkkuCisgICAgICByc3BIRFItPmZfY3RsID0gMHgwODkxMDAwMEw7CisgICAgICByc3BIRFItPnNlcV9jbnQgPSAweDAzMDAwMDAwOyAgLy8gc2VxdWVuY2UgSUQKKyAgICAgIHJzcEhEUi0+b3hfcnhfaWQgPSBJbkZDSFMtPm94X3J4X2lkOyAvLyBnaXZlcyB1cyBPWF9JRAorICAgICAgcnNwSERSLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorCisKKyAgICAgICAgICAgICAgICAgICAvLyBOb3cgc2V0dXAgdGhlIFNFU1QgZW50cnkKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgIHBUV0UgPSAmZmNDaGlwLT5TRVNULT51WyAqZmNFeGNoYW5nZUluZGV4IF0uVFdFOworCisgICAgICAvLyBmaWxsIG91dCB0aGUgVFdFOgorCisgICAgICAvLyBWQUxpZCBlbnRyeTpEaXIgb3V0Ym91bmQ6ZW5hYmxlIENNOmVuYWwgSU5UOgorICAgICAgcFRXRS0+U2VxX0FjY3VtID0gMHhDNDAwMDAwMEw7ICAvLyB1cHBlciB3b3JkIGZsYWdzCisgICAgICBwVFdFLT5yZXNlcnZlZCA9IDBMOworICAgICAgcFRXRS0+UmVtb3RlX05vZGVfSUQgPSAwTDsgLy8gbm8gbW9yZSBhdXRvIFJTUCBmcmFtZSEgKFRML1RTIGNoYW5nZSkKKyAgICAgIHBUV0UtPlJlbW90ZV9Ob2RlX0lEIHw9IChJbkZDSFMtPnNfaWQgPDwgOCk7IC8vIE1TIDI0IGJpdHMgUmVtb3RlX0lECisgICAgICAKKworICAgICAgICAgICAgICAgICAgIC8vIERvIHdlIG5lZWQgbG9jYWwgb3IgZXh0ZW5kZWQgZ2F0aGVyIGxpc3Q/CisgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiBzaXplIC0gd2UgY2FuIGhhbmRsZSAzIGxlbi9hZGRyIHBhaXJzCisgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS4KKworICAgICAgZmNwX2RsID0gYnVpbGRfU0VTVF9zZ0xpc3QoIAorCWNwcWZjSEJBZGF0YS0+UGNpRGV2LAorICAgICAgICAmcFRXRS0+U0xlbjEsIAorICAgICAgICBDbW5kLCAgICAgICAvLyBTL0cgbGlzdAorICAgICAgICAmc2dQYWlycywgICAvLyByZXR1cm4gIyBvZiBwYWlycyBpbiBTL0cgbGlzdCAoZnJvbSAiRGF0YSIgZGVzY3JpcHRvcikKKyAgICAgICAgJmZjQ2hpcC0+U0VTVC0+c2dQYWdlc1sgKmZjRXhjaGFuZ2VJbmRleCBdKTsvLyAoZm9yIEZyZWVpbmcgbGF0ZXIpCisgICAgICAKKyAgICAgIAorICAgICAgaWYoICFmY3BfZGwgKSAvLyBlcnJvciBidWlsZGluZyBTL0cgbGlzdD8KKyAgICAgIHsKKyAgICAgICAgdWxTdGF0dXMgPSBNRU1QT09MX0ZBSUw7CisgICAgICAgIGJyZWFrOyAgICAgIC8vIGdpdmUgdXAKKyAgICAgIH0KKworICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgUy9HIGxlbmd0aCwgYnVpbGQgQ01ORCBwYXlsb2FkCisgICAgICBidWlsZF9GQ1BfcGF5bG9hZCggQ21uZCwgKFVDSEFSKikmQ01EZmNocy0+cGxbMF0sIHR5cGUsIGZjcF9kbCApOworCisgICAgICAKKyAgICAgIGlmKCBzZ1BhaXJzID4gMyApICAvLyBuZWVkIGV4dGVuZGVkIHMvZyBsaXN0CisgICAgICAgIHBUV0UtPkJ1ZmZfT2ZmID0gMHgwMDAwMDAwMDsgLy8gZXh0ZW5kZWQgcy9nIGxpc3QsIG5vIG9mZnNldAorICAgICAgZWxzZQorICAgICAgICBwVFdFLT5CdWZmX09mZiA9IDB4ODAwMDAwMDA7IC8vIGxvY2FsIGRhdGEsIG5vIG9mZnNldAorICAgICAgCisgICAgICBwVFdFLT5CdWZmX0luZGV4ID0gMDsgICAgIC8vIEJ1ZmZfSW5kZXggfCBMaW5rCisgICAgICBwVFdFLT5FeHBfUk8gPSAwOworICAgICAgcFRXRS0+Qnl0ZV9Db3VudCA9IDA7ICAvLyBmaWxsZWQgaW4gYnkgVEwgb24gZXJyCisgICAgICBwVFdFLT5yZXNlcnZlZF8gPSAwOworICAgICAgcFRXRS0+RXhwX0J5dGVfQ250ID0gZmNwX2RsOy8vIHN1bSBvZiBzY2F0dGVyIGJ1ZmZlcnMKKyAgICAgIAorICAgICAgYnJlYWs7CisKKworCisKKworCisgICAgY2FzZSBTQ1NJX1RSRTogLy8gVGFjaExpdGUgVGFyZ2V0IFJlYWQgRW50cnkKKworICAgICAgLy8gSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgZm9yIHVzIHRvICJ0aW1lLW91dCIgYSBSRUFELAorICAgICAgLy8gYnV0IHdlJ2xsIHVzZSBpdCBmb3IgZGVzaWduIGNvbnNpc3RlbmN5IGFuZCBpbnRlcm5hbCBlcnJvciByZWNvdmVyeS4KKyAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0udGltZU91dCA9IDEwOyAvLyBwZXIgU0NTSSByZXEuCisKKyAgICAgIC8vIEkvTyByZXF1ZXN0IGJsb2NrIHNldHRpbmdzLi4uCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgUFJMSSAocHJvY2VzcyBsb2dpbikgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHNlZSBpZiBJbml0aWF0b3IgUmVxdWlyZXMgWEZFUl9SRFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3QsIGRvbid0IHNlbmQgb25lIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHsgUFJMSSBjaGVjay4uLn0KKyAgICAgIElSQl9mbGFncy5TRkEgPSAwOyAgICAvLyBkb24ndCBzZW5kIFhGRVJfUkRZIC0gc3RhcnQgZGF0YQorICAgICAgU2ZzTGVuID0gKnBJUkJfZmxhZ3M7CisKKyAgICAgIFNmc0xlbiA8PD0gMjQ7ICAgICAgICAvLyBzaGlmdCBmbGFncyB0byBNU0IKKyAgICAgIFNmc0xlbiArPSAoMzJMICsgMTJMKTsvLyBhZGQgU0ZTIGxlbiAoaGVhZGVyICYgWEZFUl9SRFkgcGF5bG9hZCkKKworCisgICAgICAKKyAgICAgIC8vIG5vdywgZmlsbCBvdXQgRkNQLURBVEEgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgLy8gKHVzZSBidWZmZXIgaW5zaWRlIFNFU1Qgb2JqZWN0KQorICAgICAgZGF0YUhEUiA9ICZmY0NoaXAtPlNFU1QtPkRhdGFIRFJbICpmY0V4Y2hhbmdlSW5kZXggXTsKKworICAgICAgZGF0YUhEUi0+cmVzZXJ2ZWQgPSAwTDsgLy8gbXVzdCBjbGVhcgorICAgICAgZGF0YUhEUi0+c29mX2VvZiA9IDB4NzUwMDAwMDBMOyAgLy8gU09GaTM6RU9GbiBubyBVQU07IG5vIENMUyxub0xDcixubyBUUworICAgICAgZGF0YUhEUi0+ZF9pZCA9IChJbkZDSFMtPnNfaWQgfCAweDAxMDAwMDAwTCk7IC8vIFJfQ1RMPSBGQ1BfREFUQQorICAgICAgZGF0YUhEUi0+c19pZCA9IGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhOyAvLyBDU19DVEwgPSAwCisKKworICAgICAgICAgICAgICAgICAgIC8vIFRZUEVbMzEtMjRdIDggZm9yIEZDUCBTQ1NJCisgICAgICAgICAgICAgICAgICAgLy8gZl9jdGxbMjM6MF0gZXhjaGcgcmVzcG9uZGVyLCBub3QgMXN0IHNlcSwgeGZlciBTLkkuCisgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgdmFsaWQgUk8KKyAgICAgIGRhdGFIRFItPmZfY3RsID0gMHgwODgxMDAwOEw7CisgICAgICBkYXRhSERSLT5zZXFfY250ID0gMHgwMTAwMDAwMDsgIC8vIHNlcXVlbmNlIElEIChubyBYUkRZKQorICAgICAgZGF0YUhEUi0+b3hfcnhfaWQgPSBJbkZDSFMtPm94X3J4X2lkICYgMHhGRkZGMDAwMDsgLy8gd2Ugd2FudCB1cHBlciAxNiBiaXRzCisgICAgICBkYXRhSERSLT5ybyA9IDB4MEw7ICAgIC8vIHJlbGF0aXZlIG9mZnNldCAobi9hKQorCisgICAgICAgICAgICAgICAgICAgLy8gbm93LCBmaWxsIG91dCBGQ1AtUlNQIGhlYWRlcgorICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYnVmZmVyIGluc2lkZSBTRVNUIG9iamVjdCkKKyAgICAgIHJzcEhEUiA9ICZmY0NoaXAtPlNFU1QtPlJzcEhEUlsgKmZjRXhjaGFuZ2VJbmRleCBdOworCisgICAgICByc3BIRFItPnJlc2VydmVkID0gMEw7IC8vIG11c3QgY2xlYXIKKyAgICAgIHJzcEhEUi0+c29mX2VvZiA9IDB4NzUwMDAwMDBMOyAgLy8gU09GaTM6RU9GbiAgbm8gVUFNOyBubyBDTFMsIG5vTENyLCBubyBUUworICAgICAgcnNwSERSLT5kX2lkID0gKEluRkNIUy0+c19pZCB8IDB4MDcwMDAwMDBMKTsgLy8gUl9DVEw9IEZDUF9SU1AKKyAgICAgIHJzcEhEUi0+c19pZCA9IGZjQ2hpcC0+UmVnaXN0ZXJzLm15X2FsX3BhOyAvLyBDU19DVEwgPSAwCisgICAgICAgICAgICAgICAgICAgLy8gVFlQRVszMS0yNF0gOCBmb3IgRkNQIFNDU0kKKyAgICAgICAgICAgICAgICAgICAvLyBmX2N0bFsyMzowXSByZXNwb25kZXJ8bGFzdCBzZXF8IHhmZXIgUy5JLgorICAgICAgcnNwSERSLT5mX2N0bCA9IDB4MDg5MTAwMDBMOworICAgICAgcnNwSERSLT5zZXFfY250ID0gMHgwMjAwMDAwMDsgIC8vIHNlcXVlbmNlIElEOiBkZl9jdGw6IHNlcXVlbmNlIGNvdW50CisKKyAgICAgIHJzcEhEUi0+cm8gPSAweDBMOyAgICAvLyByZWxhdGl2ZSBvZmZzZXQgKG4vYSkKKworCisgICAgICAvLyBOb3cgc2V0dXAgdGhlIFNFU1QgZW50cnkKKyAgICAgIHBUUkUgPSAmZmNDaGlwLT5TRVNULT51WyAqZmNFeGNoYW5nZUluZGV4IF0uVFJFOworCisKKyAgICAgIC8vIFZBTGlkIGVudHJ5OkRpciBvdXRib3VuZDplbmFibGUgQ006ZW5hbCBJTlQ6CisgICAgICBwVFJFLT5IZHJfTGVuID0gMHg4NjAxMDAyMEw7IC8vIGRhdGEgZnJhbWUgTGVuIGFsd2F5cyAzMiBieXRlcworICAgICAgcFRSRS0+SGRyX0FkZHIgPSAgLy8gYnVzIGFkZHJlc3Mgb2YgZGF0YUhEUjsKKyAgICAgICAgICAgIGZjQ2hpcC0+U0VTVC0+YmFzZSArIAorCQkoKHVuc2lnbmVkIGxvbmcpJmZjQ2hpcC0+U0VTVC0+RGF0YUhEUlsgKmZjRXhjaGFuZ2VJbmRleCBdIC0KKwkJCSh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+U0VTVCk7CisJCisgICAgICBwVFJFLT5SU1BfTGVuID0gNjRMOyAvLyBoZHIrZGF0YSAoVEwgYXNzaXN0ZWQgUlNQIGZyYW1lKQorICAgICAgcFRSRS0+UlNQX0xlbiB8PSAoSW5GQ0hTLT5zX2lkIDw8IDgpOyAvLyBNUyAyNCBiaXRzIFJlbW90ZV9JRAorICAgICAgcFRSRS0+UlNQX0FkZHIgPSAvLyBidXMgYWRkcmVzcyBvZiByc3BIRFIKKwkJZmNDaGlwLT5TRVNULT5iYXNlICsgCisJCQkoKHVuc2lnbmVkIGxvbmcpJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyAqZmNFeGNoYW5nZUluZGV4IF0gLQorCQkJCSh1bnNpZ25lZCBsb25nKWZjQ2hpcC0+U0VTVCk7CisKKyAgICAgICAgICAgICAgICAgICAvLyBEbyB3ZSBuZWVkIGxvY2FsIG9yIGV4dGVuZGVkIGdhdGhlciBsaXN0PworICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gc2l6ZSAtIHdlIGNhbiBoYW5kbGUgMyBsZW4vYWRkciBwYWlycworICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsbHkuCisKKyAgICAgIGZjcF9kbCA9IGJ1aWxkX1NFU1Rfc2dMaXN0KCAKKwljcHFmY0hCQWRhdGEtPlBjaURldiwKKyAgICAgICAgJnBUUkUtPkdMZW4xLCAKKyAgICAgICAgQ21uZCwgICAgICAgLy8gUy9HIGxpc3QKKyAgICAgICAgJnNnUGFpcnMsICAgLy8gcmV0dXJuICMgb2YgcGFpcnMgaW4gUy9HIGxpc3QgKGZyb20gIkRhdGEiIGRlc2NyaXB0b3IpCisgICAgICAgICZmY0NoaXAtPlNFU1QtPnNnUGFnZXNbICpmY0V4Y2hhbmdlSW5kZXggXSk7Ly8gKGZvciBGcmVlaW5nIGxhdGVyKQorICAgICAgCisgICAgICAKKyAgICAgIGlmKCAhZmNwX2RsICkgLy8gZXJyb3IgYnVpbGRpbmcgUy9HIGxpc3Q/CisgICAgICB7CisgICAgICAgIHVsU3RhdHVzID0gTUVNUE9PTF9GQUlMOworICAgICAgICBicmVhazsgICAgICAvLyBnaXZlIHVwCisgICAgICB9CisKKyAgICAgIC8vIG5vIHBheWxvYWQgb3IgY29tbWFuZCB0byBidWlsZCAtLSBSRUFEIGRvZXNuJ3QgbmVlZCBYUkRZCisKKyAgICAgIAorICAgICAgaWYoIHNnUGFpcnMgPiAzICkgIC8vIG5lZWQgZXh0ZW5kZWQgcy9nIGxpc3QKKyAgICAgICAgcFRSRS0+QnVmZl9PZmYgPSAweDc4MDAwMDAwTDsgLy8gZXh0ZW5kZWQgZGF0YSB8IChubyBvZmZzZXQpCisgICAgICBlbHNlICAgICAgICAgICAgICAgLy8gbG9jYWwgZGF0YSBwb2ludGVycyAoaW4gU0VTVCkKKyAgICAgICAgcFRSRS0+QnVmZl9PZmYgPSAweGY4MDAwMDAwTDsgLy8gbG9jYWwgZGF0YSB8IChubyBvZmZzZXQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUxPTkcgNQorICAgICAgcFRSRS0+QnVmZl9JbmRleCA9IDBMOyAgIC8vIEJ1ZmZfSW5kZXggfCByZXNlcnZlZAorICAgICAgcFRSRS0+cmVzZXJ2ZWQgPSAweDBMOyAgIC8vIERXb3JkIDYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERXb3JkIDc6IE5PVEU6IHplcm8gbGVuZ3RoIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5nIFRhY2hMaXRlIQorICAgICAgcFRSRS0+RGF0YV9MZW4gPSBmY3BfZGw7IC8vIGUuZy4gc3VtIG9mIHNjYXR0ZXIgYnVmZmVycworCisgICAgICBwVFJFLT5yZXNlcnZlZF8gPSAwTDsgICAgIC8vIERXb3JkIDgKKyAgICAgIHBUUkUtPnJlc2VydmVkX18gPSAwTDsgICAgLy8gRFdvcmQgOQorCisgICAgICBicmVhazsKKworCisKKworCisgICAgCisKKyAgICBjYXNlIEZDUF9SRVNQT05TRTogCisgICAgICAgICAgICAgICAgICAvLyBUYXJnZXQgcmVzcG9uc2UgZnJhbWU6IHRoaXMgc2VxdWVuY2UgdXNlcyBhbiBPWC9SWCBJRAorICAgICAgICAgICAgICAgICAgLy8gcGFpciBmcm9tIGEgY29tcGxldGVkIFNFU1QgZXhjaGFuZ2UuICBXZSBidWlsdCBtb3N0CisgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcmVzcG9uc2UgZnJhbWUgd2hlbiB3ZSBjcmVhdGVkIHRoZSBUV0UvVFJFLgorCisgICAgICAqcElSQl9mbGFncyA9IDA7ICAgICAgLy8gY2xlYXIgSVJCIGZsYWdzCisgICAgICBJUkJfZmxhZ3MuU0ZBID0gMTsgICAgLy8gc2VuZCBTRlMgKFJTUCkKKyAgICAgIFNmc0xlbiA9ICpwSVJCX2ZsYWdzOworCisgICAgICBTZnNMZW4gPDw9IDI0OyAgICAgICAgLy8gc2hpZnQgZmxhZ3MgdG8gTVNCCisgICAgICBTZnNMZW4gKz0gc2l6ZW9mKFRhY2hGQ0hEUl9SU1ApOy8vIGFkZCBTRlMgbGVuIChoZWFkZXIgJiBSU1AgcGF5bG9hZCkKKyAgICAgIAorCisgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbICpmY0V4Y2hhbmdlSW5kZXhdLnR5cGUgPSAKKyAgICAgICAgRkNQX1JFU1BPTlNFOyAvLyBjaGFuZ2UgRXhjaGFuZ2UgdHlwZSB0byAicmVzcG9uc2UiIHBoYXNlCisKKyAgICAgIC8vIHRha2UgYWR2YW50YWdlIG9mIHByaW9yIGtub3dsZWRnZSBvZiBPWC9SWF9JRCBwYWlyIGZyb20KKyAgICAgIC8vIHByZXZpb3VzIFhGRVIgb3V0Ym91bmQgZnJhbWUgKHN0aWxsIGluIGZjaHMgb2YgZXhjaGFuZ2UpCisgICAgICBmY0NoaXAtPlNFU1QtPlJzcEhEUlsgKmZjRXhjaGFuZ2VJbmRleCBdLm94X3J4X2lkID0gCisgICAgICAgIENNRGZjaHMtPm94X3J4X2lkOworCisgICAgICAvLyBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBEQVRBIHBoYXNlIG9mIHRoZSBleGNoYW5nZSBzbyB3ZSBjYW4gcmVwb3J0CisgICAgICAvLyBzdGF0dXMgdG8gdGhlIGluaXRpYXRvcgorICAgICAgYnVpbGRGQ1BzdGF0dXMoIGZjQ2hpcCwgKmZjRXhjaGFuZ2VJbmRleCk7IC8vIHNldCBSU1AgcGF5bG9hZCBmaWVsZHMKKworICAgICAgbWVtY3B5KAorICAgICAgICBDTURmY2hzLCAgLy8gcmUtdXNlIHNhbWUgWEZFUiBmY2hzIGZvciBSZXNwb25zZSBmcmFtZQorICAgICAgICAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbICpmY0V4Y2hhbmdlSW5kZXggXSwKKyAgICAgICAgc2l6ZW9mKCBUYWNoRkNIRFJfUlNQICkpOworICAgICAgCisgICAgICAgIAorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRrKCJjcHFmY1RTOiBkb24ndCBrbm93IGhvdyB0byBidWlsZCBGQyB0eXBlOiAlWGgoJWQpXG4iLCB0eXBlLHR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICB9CisKKyAgICAKKyAgICAKKyAgICBpZiggIXVsU3RhdHVzKSAgLy8gbm8gZXJyb3JzIGFib3ZlPworICAgIHsKKyAgICAgIC8vIEZDSFMgaXMgYnVpbHQ7IG5vdyBidWlsZCBJUkIKKworICAgICAgLy8gbGluayB0aGUganVzdCBidWlsdCBGQ0hTICh0aGUgImNvbW1hbmQiKSB0byB0aGUgSVJCIGVudHJ5IAorICAgICAgLy8gZm9yIHRoaXMgRXhjaGFuZ2UuCisgICAgICBwSVJCID0gJkV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgKmZjRXhjaGFuZ2VJbmRleF0uSVJCOyAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuICYgZmxhZ3MgYWNjb3JkaW5nIHRvIGNvbW1hbmQgdHlwZSBhYm92ZQorICAgICAgcElSQi0+UmVxX0FfU0ZTX0xlbiA9IFNmc0xlbjsgIC8vIGluY2x1ZGVzIElSQiBmbGFncyAmIGxlbgorICAgICAgcElSQi0+UmVxX0FfU0ZTX0FkZHIgPSAvLyBUTCBuZWVkcyBwaHlzaWNhbCBhZGRyIG9mIGZyYW1lIHRvIHNlbmQKKwkJZmNDaGlwLT5leGNoX2RtYV9oYW5kbGUgKyAodW5zaWduZWQgbG9uZylDTURmY2hzIC0gCisJCQkodW5zaWduZWQgbG9uZylFeGNoYW5nZXM7CisKKyAgICAgIHBJUkItPlJlcV9BX1NGU19EX0lEID0gQ01EZmNocy0+ZF9pZCA8PCA4OyAvLyBEZXN0X0lEIG11c3QgYmUgY29uc2lzdGVudCEKKworICAgIC8vIEV4Y2hhbmdlIGlzIGNvbXBsZXRlIGV4Y2VwdCBmb3IgImZpeC11cCIgZmllbGRzIHRvIGJlIHNldAorICAgIC8vIGF0IFRhY2h5b24gUXVldWluZyB0aW1lOgorICAgIC8vICAgIElSQi0+UmVxX0FfVHJhbnNfSUQgKE9YX0lELyBSWF9JRCk6ICAKKyAgICAvLyAgICAgICAgZm9yIFNFU1QgZW50cnksIGxvd2VyIGJpdHMgY29ycmVzcG9uZCB0byBhY3R1YWwgRkMgRXhjaGFuZ2UgSUQKKyAgICAvLyAgICBmY2hzLT5PWF9JRCBvciBSWF9JRAorICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmZGVmIERCRyAgICAgCisgICAgICBwcmludGsoICJGQyBFcnJvcjogU0VTVCBidWlsZCBQb29sIEFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKyNlbmRpZgorICAgICAgLy8gcmV0dXJuIHJlc291cmNlcy4uLgorICAgICAgY3BxZmNUU0NvbXBsZXRlRXhjaGFuZ2UoIGNwcWZjSEJBZGF0YS0+UGNpRGV2LCBmY0NoaXAsICpmY0V4Y2hhbmdlSW5kZXgpOyAgLy8gU0VTVCBidWlsZCBmYWlsZWQKKyAgICB9CisgIH0KKyAgZWxzZSAgLy8gbm8gRXhjaGFuZ2VzIGF2YWlsYWJsZQorICB7CisgICAgdWxTdGF0dXMgPSBTRVNUX0ZVTEw7CisgICAgcHJpbnRrKCAiRkMgRXJyb3I6IG5vIGZjRXhjaGFuZ2VzIGF2YWlsYWJsZVxuIik7CisgIH0KKyAgcmV0dXJuIHVsU3RhdHVzOworfQorCisKKworCisKKworLy8gc2V0IFJTUCBwYXlsb2FkIGZpZWxkcworc3RhdGljIHZvaWQgIGJ1aWxkRkNQc3RhdHVzKCBQVEFDSFlPTiBmY0NoaXAsIFVMT05HIEV4Y2hhbmdlSUQpIAoreworICBGQ19FWENIQU5HRVMgKkV4Y2hhbmdlcyA9IGZjQ2hpcC0+RXhjaGFuZ2VzOworICBGQ19FWENIQU5HRSAqcEV4Y2hhbmdlID0gJkV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtFeGNoYW5nZUlEXTsgIC8vIHNob3J0aGFuZAorICBQRkNQX1NUQVRVU19SRVNQT05TRSBwRmNwU3RhdHVzOworICAKKyAgbWVtc2V0KCAmZmNDaGlwLT5TRVNULT5Sc3BIRFJbIEV4Y2hhbmdlSUQgXS5wbCwgMCwKKyAgICBzaXplb2YoIEZDUF9TVEFUVVNfUkVTUE9OU0UpICk7CisgIGlmKCBwRXhjaGFuZ2UtPnN0YXR1cyApIC8vIHNvbWV0aGluZyB3cm9uZz8KKyAgeworICAgIHBGY3BTdGF0dXMgPSAoUEZDUF9TVEFUVVNfUkVTUE9OU0UpICAvLyBjYXN0IFJTUCBidWZmZXIgZm9yIHRoaXMgeGNobmcKKyAgICAgICZmY0NoaXAtPlNFU1QtPlJzcEhEUlsgRXhjaGFuZ2VJRCBdLnBsOworICAgIGlmKCBwRXhjaGFuZ2UtPnN0YXR1cyAmIENPVU5UX0VSUk9SICkKKyAgICB7CisgICAgICAKKyAgICAgIC8vIHNldCBGQ1AgcmVzcG9uc2UgbGVuIHZhbGlkIChzbyB3ZSBjYW4gcmVwb3J0IGNvdW50IGVycm9yKQorICAgICAgcEZjcFN0YXR1cy0+ZmNwX3N0YXR1cyB8PSBGQ1BfUlNQX0xFTl9WQUxJRDsKKyAgICAgIHBGY3BTdGF0dXMtPmZjcF9yc3BfbGVuID0gMHgwNDAwMDAwMDsgIC8vIDQgYnl0ZSBsZW4gKEJJRyBFbmRpYW4pCisKKyAgICAgIHBGY3BTdGF0dXMtPmZjcF9yc3BfaW5mbyA9IEZDUF9EQVRBX0xFTl9OT1RfQlVSU1RfTEVOOyAvLyBSU1BfQ09ERQorICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBkbWFfYWRkcl90IAorY3BxZmNfcGNpX21hcF9zZ19wYWdlKAorICAgIAkJc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJVUxPTkcgKmh3X3BhZGRyLCAJLy8gd2hlcmUgdG8gcHV0IHBoeXMgYWRkciBmb3IgSFcgdXNlCisJCXZvaWQgKnNncF92YWRkciwJLy8gdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc2cgcGFnZSAKKwkgCWRtYV9hZGRyX3QgKnVtYXBfcGFkZHIsCS8vIHdoZXJlIHRvIHB1dCBwaHlzIGFkZHIgZm9yIHVubWFwCisJCXVuc2lnbmVkIGludCAqbWFwbGVuLAkvLyB3aGVyZSB0byBzdG9yZSBzZyBlbnRyeSBsZW5ndGgKKwkJaW50IFBhaXJDb3VudCkJCS8vIG51bWJlciBvZiBzZyBwYWlycyB1c2VkIGluIHRoZSBwYWdlLgkKK3sKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzZ3BfdmFkZHI7CisKKwkqbWFwbGVuID0gUGFpckNvdW50ICogODsKKyAgICAgICAgYWxpZ25lZF9hZGRyICs9IFRMX0VYVF9TR19QQUdFX0JZVEVMRU47CisgICAgICAgIGFsaWduZWRfYWRkciAmPSB+KFRMX0VYVF9TR19QQUdFX0JZVEVMRU4gLTEpOworCQorCSp1bWFwX3BhZGRyID0gcGNpX21hcF9zaW5nbGUocGNpZGV2LCAodm9pZCAqKSBhbGlnbmVkX2FkZHIsIAorCQkJCSptYXBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCSpod19wYWRkciA9IChVTE9ORykgKnVtYXBfcGFkZHI7CisKKyMgICAgICAgaWYgQklUU19QRVJfTE9ORyA+IDMyCisgICAgICAgCQlpZiggKnVtYXBfcGFkZHIgPj4zMiApIHsKKyAgICAgICAJICAJCXByaW50aygiY3FwZmNUUzpUYWNoIFNHIERNQSBhZGRyICVwPjMyIGJpdHNcbiIsIAorCSAgCQkJKHZvaWQqKXVtYXBfcGFkZHIpOworICAgICAgIAkJCXJldHVybiAwOworICAgICAgIAkJfQorIyAgICAgICBlbmRpZgorCXJldHVybiAqdW1hcF9wYWRkcjsKK30KKworc3RhdGljIHZvaWQKK2NwcWZjX3VuZG9fU0VTVF9tYXBwaW5ncyhzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJdW5zaWduZWQgbG9uZyBjb250aWdhZGRyLCBpbnQgbGVuLCBpbnQgZGlyLAorICAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IHVzZV9zZywKKyAgICAJCQlQU0dQQUdFUyAqc2dQYWdlc19oZWFkLAorCQkJaW50IGFsbG9jYXRlZF9wYWdlcykKK3sKKwlQU0dQQUdFUyBpLCBuZXh0OworCisJaWYgKGNvbnRpZ2FkZHIgIT0gKHVuc2lnbmVkIGxvbmcpIE5VTEwpCisJCXBjaV91bm1hcF9zaW5nbGUocGNpZGV2LCBjb250aWdhZGRyLCBsZW4sIGRpcik7CisKKwlpZiAoc2dsICE9IE5VTEwpCisJCXBjaV91bm1hcF9zZyhwY2lkZXYsIHNnbCwgdXNlX3NnLCBkaXIpOworCisJZm9yIChpPSpzZ1BhZ2VzX2hlYWQ7IGkgIT0gTlVMTCA7aSA9IG5leHQpCisJeworCQlwY2lfdW5tYXBfc2luZ2xlKHBjaWRldiwgaS0+YnVzYWRkciwgaS0+bWFwbGVuLCAKKwkJCXNjc2lfdG9fcGNpX2RtYV9kaXIoUENJX0RNQV9UT0RFVklDRSkpOworCQlpLT5idXNhZGRyID0gKGRtYV9hZGRyX3QpIE5VTEw7IAorCQlpLT5tYXBsZW4gPSAwTDsgCisJCW5leHQgPSBpLT5uZXh0OworCQlrZnJlZShpKTsgCisJfQorCSpzZ1BhZ2VzX2hlYWQgPSBOVUxMOworfQorCisvLyBUaGlzIHJvdXRpbmUgYnVpbGRzIHNjYXR0ZXIvZ2F0aGVyIGxpc3RzIGludG8gU0VTVCBlbnRyaWVzCisvLyBJTlBVVFM6CisvLyAgIFNFU1RhbFBhaXIgLSBTRVNUIGFkZHJlc3MgQERXb3JkQSAiTG9jYWwgQnVmZmVyIExlbmd0aCIKKy8vICAgc2dMaXN0ICAgICAtIFNjYXR0ZXIvR2F0aGVyIGxpbmtlZCBsaXN0IG9mIExlbi9BZGRyZXNzIGRhdGEgYnVmZmVycworLy8gT1VUUFVUOgorLy8gICBzZ1BhaXJzIC0gbnVtYmVyIG9mIHZhbGlkIGFkZHJlc3MvbGVuZ3RoIHBhaXJzCisvLyBSZW1hcmtzOgorLy8gICBUaGUgU0VTVCBkYXRhIGJ1ZmZlciBwb2ludGVycyBvbmx5IGRlcGVuZCBvbiBudW1iZXIgb2YKKy8vICAgbGVuZ3RoLyBhZGRyZXNzIHBhaXJzLCBOT1Qgb24gdGhlIHR5cGUgKElXRSwgVFJFLC4uLikKKy8vICAgVXAgdG8gMyBwYWlycyBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgU0VTVCAtIG1vcmUgdGhhbiAzCisvLyAgIHJlcXVpcmUgdGhpcyBFeHRlbmRlZCBTL0cgbGlzdCBwYWdlLiAgVGhlIHBhZ2UgaG9sZHMgNCwgOCwgMTYuLi4KKy8vICAgbGVuL2FkZHIgcGFpcnMsIHBlciBTY2F0dGVyL0dhdGhlciBMaXN0IFBhZ2UgTGVuZ3RoIFJlZy4KKy8vICAgVGFjaExpdGUgYWxsb3dzIHBhZ2VzIHRvIGJlIGxpbmtlZCB0byBhbnkgZGVwdGguCisKKy8vI2RlZmluZSBEQkdfU0VTVF9TR0xJU1QgMSAvLyBmb3IgcHJpbnRpbmcgb3V0IFMvRyBwYWlycyB3aXRoIEV4dC4gcGFnZXMKKworc3RhdGljIGludCBhcF9oaV93YXRlciA9IFRMX0RBTkdFUl9TR1BBR0VTOworCitzdGF0aWMgVUxPTkcgYnVpbGRfU0VTVF9zZ0xpc3QoIAorICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCisgICAgVUxPTkcgKlNFU1RhbFBhaXJTdGFydCwgIC8vIHRoZSAzIGxlbi9hZGRyZXNzIGJ1ZmZlcnMgaW4gU0VTVAorICAgIFNjc2lfQ21uZCAqQ21uZCwKKyAgICBVTE9ORyAqc2dQYWlycywgCisgICAgUFNHUEFHRVMgKnNnUGFnZXNfaGVhZCkgIC8vIGxpbmsgbGlzdCBvZiBUTCBFeHQuIFMvRyBwYWdlcyBmcm9tIE8vUyBQb29sCisgICAgCit7CisgIFVMT05HIGksIEFsbG9jYXRlZFBhZ2VzPTA7IC8vIFRhY2ggRXh0LiBTL0cgcGFnZSBhbGxvY2F0aW9ucworICBVTE9ORyogYWxQYWlyID0gU0VTVGFsUGFpclN0YXJ0OworICBVTE9ORyogZXh0X3NnX3BhZ2VfcGh5c19hZGRyX3BsYWNlID0gTlVMTDsKKyAgaW50IFBhaXJDb3VudDsKKyAgdW5zaWduZWQgbG9uZyB1bEJ1ZmYsIGNvbnRpZ2FkZHI7CisgIFVMT05HIHRvdGFsX2RhdGFfbGVuPTA7IC8vIChpbiBieXRlcykKKyAgVUxPTkcgYnl0ZXNfdG9fZ28gPSBDbW5kLT5yZXF1ZXN0X2J1ZmZsZW47IC8vIHRvdGFsIHhmZXIgKFMvRyBzdW0pCisgIFVMT05HIHRoaXNNYXBwaW5nTGVuOworICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9IE5VTEw7ICAvLyBTL0cgbGlzdCAoTGludXggZm9ybWF0KQorICBpbnQgc2dfY291bnQsIHRvdGFsc2dzOyAKKyAgZG1hX2FkZHJfdCBidXNhZGRyOworICB1bnNpZ25lZCBsb25nIHRoaXNsZW4sIG9mZnNldDsKKyAgUFNHUEFHRVMgKnNncGFnZSA9IHNnUGFnZXNfaGVhZDsKKyAgUFNHUEFHRVMgcHJldl9wYWdlID0gTlVMTDsKKworIyBkZWZpbmUgV0VfSEFWRV9TR19MSVNUIChzZ2wgIT0gKHVuc2lnbmVkIGxvbmcpIE5VTEwpCisgIGNvbnRpZ2FkZHIgPSAodW5zaWduZWQgbG9uZykgTlVMTDsKKworICBpZiggIUNtbmQtPnVzZV9zZyApICAvLyBubyBTL0cgbGlzdD8KKyAgeworCWlmIChieXRlc190b19nbyA8PSBUTF9NQVhfU0dfRUxFTV9MRU4pCisJeworICAgIAkJKnNnUGFpcnMgPSAxOwkvLyB1c2UgImxvY2FsIiBTL0cgcGFpciBpbiBTRVNUIGVudHJ5CisJCQkJLy8gKGZvciBub3csIGlnbm9yZSBhZGRyZXNzIGJpdHMgYWJvdmUgIzMxKQorCisJCSphbFBhaXIrKyA9IGJ5dGVzX3RvX2dvOyAvLyBiaXRzIDE4LTAsIGxlbmd0aAorCisJCWlmIChieXRlc190b19nbyAhPSAwKSB7CisJCQljb250aWdhZGRyID0gdWxCdWZmID0gcGNpX21hcF9zaW5nbGUocGNpZGV2LCAKKwkJCQlDbW5kLT5yZXF1ZXN0X2J1ZmZlciwgCisJCQkJQ21uZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCXNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCS8vIHByaW50aygibXMgJXAgIiwgdWxCdWZmKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIE5vIGRhdGEgdHJhbnNmZXIsIChlLmcuOiBUZXN0IFVuaXQgUmVhZHkpCisJCQkvLyBwcmludGsoImJ0Zz0wICIpOworCQkJKnNnUGFpcnMgPSAwOworCQkJbWVtc2V0KGFsUGFpciwgMCwgc2l6ZW9mKCphbFBhaXIpKTsKKwkJCXJldHVybiAwOworCQl9CisKKyMJCWlmIEJJVFNfUEVSX0xPTkcgPiAzMgorICAgIAkJCWlmKCB1bEJ1ZmYgPj4zMiApIHsKKyAgICAgIAkJCQlwcmludGsoIkZBVEFMISBUYWNoeW9uIERNQSBhZGRyZXNzICVwICIKKwkJCQkJImV4Y2VlZHMgMzIgYml0c1xuIiwgKHZvaWQqKXVsQnVmZiApOworICAgICAgCQkJCXJldHVybiAwOworICAgIAkJCX0KKyMJCWVuZGlmCisgICAgCQkqYWxQYWlyID0gKFVMT05HKXVsQnVmZjsgICAgICAKKyAgICAJCXJldHVybiBieXRlc190b19nbzsKKwl9IAorCWVsc2UJLy8gV2UgaGF2ZSBhIHNpbmdsZSBsYXJnZSAodG9vIGJpZykgY29udGlndW91cyBidWZmZXIuCisJewkvLyBXZSB3aWxsIGhhdmUgdG8gYnJlYWsgaXQgdXAuICBXZSdsbCB1c2UgdGhlIHNjYXR0ZXIKKwkJLy8gZ2F0aGVyIGNvZGUgd2F5IGJlbG93LCBidXQgdXNlIGNvbnRpZ2FkZHIgaW5zdGVhZAorCQkvLyBvZiBzZ19kbWFfYWRkcigpLiAodGhpcyBpcyBhIHZlcnkgcmFyZSBjYXNlKS4KKworCQl1bnNpZ25lZCBsb25nIGJ0ZzsKKwkJY29udGlnYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBjaWRldiwgQ21uZC0+cmVxdWVzdF9idWZmZXIsIAorCQkJCUNtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQlzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisKKwkJLy8gcHJpbnRrKCJjb250aWdhZGRyID0gJXAsIGxlbiA9ICVkXG4iLCAKKwkJLy8JKHZvaWQgKikgY29udGlnYWRkciwgYnl0ZXNfdG9fZ28pOworCQl0b3RhbHNncyA9IDA7CisJCWZvciAoYnRnID0gYnl0ZXNfdG9fZ287IGJ0ZyA+IDA7ICkgeworCQkJYnRnIC09ICggYnRnID4gVExfTUFYX1NHX0VMRU1fTEVOID8gCisJCQkJVExfTUFYX1NHX0VMRU1fTEVOIDogYnRnICk7CisJCQl0b3RhbHNncysrOworCQl9CisJCXNnbCA9IE5VTEw7CisJCSpzZ1BhaXJzID0gdG90YWxzZ3M7CisJfQorICB9CisgIGVsc2UgIC8vIHdlIGRvIGhhdmUgYSBzY2F0dGVyIGdhdGhlciBsaXN0CisgIHsKKwkvLyBbVEJEIC0gdXBkYXRlIGZvciBMaW51eCB0byBzdXBwb3J0ID4gMzIgYml0cyBhZGRyZXNzaW5nXQorCS8vIHNpbmNlIHRoZSBmb3JtYXQgZm9yIGxvY2FsICYgZXh0ZW5kZWQgUy9HIGxpc3RzIGlzIGRpZmZlcmVudCwKKwkvLyBjaGVjayBpZiBTL0cgcGFpcnMgZXhjZWVkcyAzLgorCS8vICpzZ1BhaXJzID0gQ21uZC0+dXNlX3NnOyBOb3BlLCB0aGF0J3Mgd3JvbmcuCisgCisJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCopQ21uZC0+cmVxdWVzdF9idWZmZXI7ICAKKwlzZ19jb3VudCA9IHBjaV9tYXBfc2cocGNpZGV2LCBzZ2wsIENtbmQtPnVzZV9zZywgCisJCXNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKyAgCWlmKCBzZ19jb3VudCA8PSAzICkgeworCisJLy8gd2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmUgdGhhdCBubyBpbmRpdmlkdWFsIG1hcHBpbmcKKwkvLyBpcyB0b28gbGFyZ2UsIGFuZCBpZiBhbnkgaXMsIHRoYXQgYnJlYWtpbmcgaXQgdXAKKwkvLyBkb2Vzbid0IHB1c2ggdXMgb3ZlciAzIHNncywgb3IsIGlmIGl0IGRvZXMsIHRoYXQgd2UKKwkvLyBoYW5kbGUgdGhhdCBjYXNlLiAgVGFjaHlvbiBjYW4gdGFrZSAweDdGRkZGIGJpdHMgZm9yIGxlbmd0aCwKKwkvLyBidXQgc2cgc3RydWN0dXJlIHVzZXMgInVuc2lnbmVkIGludCIsIG9uIHRoZSBmYWNlIG9mIGl0LCAKKwkvLyB1cCB0byAweEZGRkZGRkZGIG9yIGV2ZW4gbW9yZS4KKworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyB0aGlzbGVuOworCisJCXRvdGFsc2dzID0gMDsKKwkJZm9yIChpPTA7aTxzZ19jb3VudDtpKyspIHsKKyAgICAgIAkJCXRoaXNsZW4gPSBzZ19kbWFfbGVuKCZzZ2xbaV0pOworCQkJd2hpbGUgKHRoaXNsZW4gPj0gVExfTUFYX1NHX0VMRU1fTEVOKSB7CisJCQkJdG90YWxzZ3MrKzsKKwkJCQl0aGlzbGVuIC09IFRMX01BWF9TR19FTEVNX0xFTjsKKwkJCX0KKwkJCWlmICh0aGlzbGVuID4gMCkgdG90YWxzZ3MrKzsKKwkJfQorCQkqc2dQYWlycyA9IHRvdGFsc2dzOworICAJfSBlbHNlIHRvdGFsc2dzID0gOTk5OyAvLyBhcyBhIGZpcnN0IGVzdGltYXRlLCBkZWZpbml0ZWx5ID4zLCAKKwkJCSAgICAgIAorCS8vIGlmICh0b3RhbHNncyAhPSBzZ19jb3VudCkgCisJLy8JcHJpbnRrKCJ0b3RhbHNncyA9ICVkLCBzZ2NvdW50PSVkXG4iLHRvdGFsc2dzLHNnX2NvdW50KTsKKyAgfQorCisgIGlmKCB0b3RhbHNncyA8PSAzICkgLy8gY2FuIChtdXN0KSB1c2UgImxvY2FsIiBTRVNUIGxpc3QKKyAgeworICAgIHdoaWxlKCBieXRlc190b19nbykKKyAgICB7CisgICAgICBvZmZzZXQgPSAwTDsKKworICAgICAgaWYgKCBXRV9IQVZFX1NHX0xJU1QgKSAKKwl0aGlzTWFwcGluZ0xlbiA9IHNnX2RtYV9sZW4oc2dsKTsKKyAgICAgIGVsc2UJCQkJCS8vIG9yIGNvbnRpZ3VvdXMgYnVmZmVyPworCXRoaXNNYXBwaW5nTGVuID0gYnl0ZXNfdG9fZ287CisKKyAgICAgIHdoaWxlICh0aGlzTWFwcGluZ0xlbiA+IDApCisgICAgICB7ICAKKwl0aGlzbGVuID0gdGhpc01hcHBpbmdMZW4gPiBUTF9NQVhfU0dfRUxFTV9MRU4gPyAKKwkJVExfTUFYX1NHX0VMRU1fTEVOIDogdGhpc01hcHBpbmdMZW47CisJYnl0ZXNfdG9fZ28gPSBieXRlc190b19nbyAtIHRoaXNsZW47CisKKwkvLyB3ZSBoYXZlIEwvQSBwYWlyOyBMID0gdGhpc2xlbiwgQSA9IHBoeXNpY2FsQWRkcmVzcworCS8vIGxvYWQgaW50byBTRVNULi4uCisKKwl0b3RhbF9kYXRhX2xlbiArPSB0aGlzbGVuOworCSphbFBhaXIgPSB0aGlzbGVuOyAvLyBiaXRzIDE4LTAsIGxlbmd0aAorCisJYWxQYWlyKys7CisKKwlpZiAoIFdFX0hBVkVfU0dfTElTVCApIAorCQl1bEJ1ZmYgPSBzZ19kbWFfYWRkcmVzcyhzZ2wpICsgb2Zmc2V0OworCWVsc2UKKwkJdWxCdWZmID0gY29udGlnYWRkciArIG9mZnNldDsKKworCW9mZnNldCArPSB0aGlzbGVuOworCisjCWlmIEJJVFNfUEVSX0xPTkcgPiAzMgorCQlpZiggdWxCdWZmID4+MzIgKSB7CisgICAgICAgIAkJcHJpbnRrKCJjcXBmY1RTOiAyVGFjaCBETUEgYWRkcmVzcyAlcCA+IDMyIGJpdHNcbiIsIAorCQkJCSh2b2lkKil1bEJ1ZmYgKTsKKwkJICAgIHByaW50aygiJXMgPSAlcCwgb2Zmc2V0ID0gJWxkXG4iLCAKKwkJCVdFX0hBVkVfU0dfTElTVCA/ICJ1bEJ1ZmYiIDogImNvbnRpZ2FkZHIiLAorCQkJV0VfSEFWRV9TR19MSVNUID8gKHZvaWQgKikgdWxCdWZmIDogKHZvaWQgKikgY29udGlnYWRkciwKKwkJCQlvZmZzZXQpOworICAgICAgICAJCXJldHVybiAwOworICAgICAgCQl9CisjCWVuZGlmCisgICAgICAgICphbFBhaXIrKyA9IChVTE9ORyl1bEJ1ZmY7IC8vIGxvd2VyIDMyIGJpdHMgKDMxLTApCisJdGhpc01hcHBpbmdMZW4gLT0gdGhpc2xlbjsKKyAgICAgIH0KKworICAgICAgaWYgKCBXRV9IQVZFX1NHX0xJU1QgKSArK3NnbDsgIC8vIG5leHQgUy9HIHBhaXIKKwllbHNlIGlmIChieXRlc190b19nbyAhPSAwKSBwcmludGsoIkJURyBub3QgemVybyFcbiIpOworCisjICAgICBpZmRlZiBEQkdfU0VTVF9TR0xJU1QKKwlwcmludGsoIkw9JWQgIiwgdGhpc01hcHBpbmdMZW4pOworCXByaW50aygiYnRnPSVkICIsIGJ5dGVzX3RvX2dvKTsKKyMgICAgIGVuZGlmCisKKyAgICB9CisgICAgLy8gcHJpbnRrKCJpOiVkXG4iLCAqc2dQYWlycyk7CisgIH0KKyAgZWxzZSAgICAvLyBtb3JlIHRoYW4gMyBwYWlycyByZXF1aXJlcyBFeHRlbmRlZCBTL0cgcGFnZSAoUG9vbCBBbGxvY2F0aW9uKQorICB7CisgICAgLy8gY2xlYXIgb3V0IFNFU1QgRFdPUkRzIChsb2NhbCBTL0cgYWRkcikgQy1GIChBLUIgc2V0IGluIGZvbGxvd2luZyBsb2dpYykKKyAgICBmb3IoIGk9MjsgaTw2OyBpKyspCisgICAgICBhbFBhaXJbaV0gPSAwOworCisgICAgUGFpckNvdW50ID0gVExfRVhUX1NHX1BBR0VfQ09VTlQ7ICAgIC8vIGZvcmNlcyBpbml0aWFsIHBhZ2UgYWxsb2NhdGlvbgorICAgIHRvdGFsc2dzID0gMDsKKyAgICB3aGlsZSggYnl0ZXNfdG9fZ28gKQorICAgIHsKKyAgICAgIC8vIFBlciBTRVNUIGZvcm1hdCwgd2UgY2FuIHN1cHBvcnQgNTI0Mjg3IGJ5dGUgbGVuZ3RocyBwZXIKKyAgICAgIC8vIFMvRyBwYWlyLiAgVHlwaWNhbCB1c2VyIGJ1ZmZlcnMgYXJlIDRrLCBhbmQgdmVyeSByYXJlbHkKKyAgICAgIC8vIGV4Y2VlZCAxMmsgZHVlIHRvIGZyYWdtZW50YXRpb24gb2YgcGh5c2ljYWwgbWVtb3J5IHBhZ2VzLgorICAgICAgLy8gSG93ZXZlciwgb24gY2VydGFpbiBPL1Mgc3lzdGVtIChub3QgInVzZXIiKSBidWZmZXJzIChvbiBwbGF0Zm9ybXMgCisgICAgICAvLyB3aXRoIGh1Z2UgbWVtb3JpZXMpLCBpdCdzIHBvc3NpYmxlIHRvIGV4Y2VlZCB0aGlzCisgICAgICAvLyBsZW5ndGggaW4gYSBzaW5nbGUgUy9HIGFkZHJlc3MvbGVuIG1hcHBpbmcsIHNvIHdlIGhhdmUgdG8gaGFuZGxlCisgICAgICAvLyB0aGF0LgorCisgICAgICBvZmZzZXQgPSAwTDsKKyAgICAgIGlmICggV0VfSEFWRV9TR19MSVNUICkgCisJdGhpc01hcHBpbmdMZW4gPSBzZ19kbWFfbGVuKHNnbCk7CisgICAgICBlbHNlCisJdGhpc01hcHBpbmdMZW4gPSBieXRlc190b19nbzsKKworICAgICAgd2hpbGUgKHRoaXNNYXBwaW5nTGVuID4gMCkKKyAgICAgIHsKKwl0aGlzbGVuID0gdGhpc01hcHBpbmdMZW4gPiBUTF9NQVhfU0dfRUxFTV9MRU4gPyAKKwkJVExfTUFYX1NHX0VMRU1fTEVOIDogdGhpc01hcHBpbmdMZW47CisJLy8gcHJpbnRrKCIlZC8lZC8lZFxuIiwgdGhpc2xlbiwgdGhpc01hcHBpbmdMZW4sIGJ5dGVzX3RvX2dvKTsKKyAgICAgIAorICAJLy8gc2hvdWxkIHdlIGxvYWQgaW50byAidGhpcyIgZXh0ZW5kZWQgUy9HIHBhZ2UsIG9yIGFsbG9jYXRlCisJLy8gbmV3IHBhZ2U/CisKKwlpZiggUGFpckNvdW50ID49IFRMX0VYVF9TR19QQUdFX0NPVU5UICkKKwl7CisJICAvLyBOb3csIHdlIGhhdmUgdG8gbWFwIHRoZSBwcmV2aW91cyBwYWdlLCAodHJpZ2dlcmluZyBidWZmZXIgYm91bmNlKQorCSAgLy8gVGhlIGZpcnN0IHRpbWUgdGhydSB0aGUgbG9vcCwgdGhlcmUgd29uJ3QgYmUgYSBwcmV2aW91cyBwYWdlLgorCSAgaWYgKHByZXZfcGFnZSAhPSBOVUxMKSAvLyBpcyB0aGVyZSBhIHByZXYgcGFnZT8gCisJICB7CisJCS8vIHRoaXMgY29kZSBpcyBub3JtYWxseSBraW5kIG9mIGhhcmQgdG8gdHJpZ2dlciwgCisJCS8vIHlvdSBoYXZlIHRvIHVzZSB1cCBtb3JlIHRoYW4gMjU2IHNjYXR0ZXIgZ2F0aGVyIAorCQkvLyBlbGVtZW50cyB0byBnZXQgaGVyZS4gIENyYW5raW5nIGRvd24gVExfTUFYX1NHX0VMRU1fTEVOCisJCS8vIHRvIGFuIGFic3VyZGx5IGxvdyB2YWx1ZSAoMTI4IGJ5dGVzIG9yIHNvKSB0byBhcnRpZmljaWFsbHkKKwkJLy8gYnJlYWsgaS9vJ3MgaW50byBhIHppbGxpb24gcGllY2VzIGlzIGhvdyBJIHRlc3RlZCBpdC4gCisJCWJ1c2FkZHIgPSBjcHFmY19wY2lfbWFwX3NnX3BhZ2UocGNpZGV2LAorCQkJCWV4dF9zZ19wYWdlX3BoeXNfYWRkcl9wbGFjZSwKKwkJCQlwcmV2X3BhZ2UtPnBhZ2UsCisgICAgICAgIAkJCSZwcmV2X3BhZ2UtPmJ1c2FkZHIsCisgICAgICAgIAkJCSZwcmV2X3BhZ2UtPm1hcGxlbiwKKwkJCQlQYWlyQ291bnQpOworICAgICAgICAgIH0gCisgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIFRMIEV4dGVuZGVkIFMvRyBsaXN0IHBhZ2UuICBXZSBoYXZlCisgICAgICAgICAgLy8gdG8gYWxsb2NhdGUgdHdpY2Ugd2hhdCB3ZSB3YW50IHRvIGVuc3VyZSByZXF1aXJlZCBUTCBhbGlnbm1lbnQKKyAgICAgICAgICAvLyAoVGFjaGxpdGUgVEwvVFMgVXNlciBNYW4uIFJldiA2LjAsIHAgMTY4KQorICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCBhbGxvY2F0ZWQgUFZPSUQgc28gd2UgY2FuIGZyZWUgbGF0ZXIKKwkgICpzZ3BhZ2UgPSBrbWFsbG9jKCBzaXplb2YoU0dQQUdFUyksIEdGUF9BVE9NSUMpOworCSAgaWYgKCAhICpzZ3BhZ2UgKQorICAgICAgICAgIHsKKwkJcHJpbnRrKCJjcHFmYzogQWxsb2NhdGlvbiBmYWlsZWQgQCAlZCBTL0cgcGFnZSBhbGxvY2F0aW9uc1xuIiwKKwkJCUFsbG9jYXRlZFBhZ2VzKTsKKwkJdG90YWxfZGF0YV9sZW4gPSAwOyAgLy8gZmFpbHVyZSEhIEV4dC4gUy9HIGlzIEFsbC1vci1ub25lIGFmZmFpcgorCisJICAgICAgICAvLyB1bm1hcCB0aGUgcHJldmlvdXMgbWFwcGluZ3MsIGlmIGFueS4KKworCSAgICAgICAgY3BxZmNfdW5kb19TRVNUX21hcHBpbmdzKHBjaWRldiwgY29udGlnYWRkciwgCisJCQlDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQlzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSwKKyAgCQkJc2dsLCBDbW5kLT51c2Vfc2csIHNnUGFnZXNfaGVhZCwgQWxsb2NhdGVkUGFnZXMrMSk7CisKKwkJLy8gRklYTUU6IHRlc3Rpbmcgc2hvd3MgdGhhdCBpZiB3ZSBnZXQgaGVyZSwgCisJCS8vIGl0J3MgYmFkIG5ld3MuICAodGhpcyBoYXMgYmVlbiB0aGlzIHdheSBmb3IgYSBsb25nIAorCQkvLyB0aW1lIHRob3VnaCwgQUZBSUsuICBOb3QgdGhhdCB0aGF0IGV4Y3VzZXMgaXQuKQorCisJCXJldHVybiAwOyAvLyBnaXZlIHVwIChhbmQgcHJvYmFibHkgaGFuZyB0aGUgc3lzdGVtKQorICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQgbWVtb3J5IHdlIGp1c3QgYWxsb2NhdGVkCisJICBtZW1zZXQoICgqc2dwYWdlKS0+cGFnZSwwLFRMX0VYVF9TR19QQUdFX0JZVEVMRU4qMik7CisJICAoKnNncGFnZSktPm5leHQgPSBOVUxMOworCSAgKCpzZ3BhZ2UpLT5idXNhZGRyID0gKGRtYV9hZGRyX3QpIE5VTEw7CisJICAoKnNncGFnZSktPm1hcGxlbiA9IDBMOworICAgICAgCisJICAvLyBhbGlnbiB0aGUgbWVtb3J5IC0gVEwgcmVxdWlyZXMgc2l6ZW9mKCkgRXh0LiBTL0cgcGFnZSBhbGlnbm1lbnQuCisJICAvLyBXZSBkb3VibGVkIHRoZSBhY3R1YWwgcmVxdWlyZWQgc2l6ZSBzbyB3ZSBjb3VsZCBtYXNrIG9mZiBMU0JzIAorCSAgLy8gdG8gZ2V0IGRlc2lyZWQgb2Zmc2V0IAorCisJICB1bEJ1ZmYgPSAodW5zaWduZWQgbG9uZykgKCpzZ3BhZ2UpLT5wYWdlOworCSAgdWxCdWZmICs9IFRMX0VYVF9TR19QQUdFX0JZVEVMRU47CisJICB1bEJ1ZmYgJj0gfihUTF9FWFRfU0dfUEFHRV9CWVRFTEVOIC0xKTsKKworCSAgLy8gc2V0IHBvaW50ZXIsIGluIFNFU1QgaWYgZmlyc3QgRXh0LiBTL0cgcGFnZSwgb3IgaW4gbGFzdCBwYWlyCisJICAvLyBvZiBsaW5rZWQgRXh0LiBTL0cgcGFnZXMuLi4gKE9ubHkgMzItYml0IFBWT0lEcywgc28ganVzdCAKKwkgIC8vIGxvYWQgbG93ZXIgMzIgYml0cykKKwkgIC8vIE5PVEU6IHRoZSBMZW4gZmllbGQgbXVzdCBiZSAnMCcgaWYgdGhpcyBpcyB0aGUgZmlyc3QgRXh0LiBTL0cKKwkgIC8vIHBvaW50ZXIgaW4gU0VTVCwgYW5kIG5vdCAwIG90aGVyd2lzZSAod2Uga25vdyB0aGlzbGVuICE9IDApLgorCisJICAqYWxQYWlyID0gKGFsUGFpciAhPSBTRVNUYWxQYWlyU3RhcnQpID8gdGhpc2xlbiA6IDA7CisKKyMJICBpZmRlZiBEQkdfU0VTVF9TR0xJU1QKKyAgICAgICAgCXByaW50aygiUGFpckNvdW50ICVkIEAlcCBldmVuICVYaCwgIiwgCisJCQlQYWlyQ291bnQsIGFsUGFpciwgKmFsUGFpcik7CisjCSAgZW5kaWYKKworCSAgLy8gU2F2ZSB0aGUgcGxhY2Ugd2hlcmUgd2UgbmVlZCB0byBzdG9yZSB0aGUgcGh5c2ljYWwKKwkgIC8vIGFkZHJlc3Mgb2YgdGhpcyBzY2F0dGVyIGdhdGhlciBwYWdlIHdoaWNoIHdlIGdldCB3aGVuIHdlIG1hcCBpdAorCSAgLy8gKGFuZCBtYXBwaW5nIHdlIGNhbiBkbyBvbmx5IGFmdGVyIHdlIGZpbGwgaXQgaW4uKQorCSAgYWxQYWlyKys7ICAvLyBuZXh0IERXT1JELCB3aWxsIGNvbnRhaW4gcGh5cyBhZGRyIG9mIHRoZSBleHQgcGFnZQorCSAgZXh0X3NnX3BhZ2VfcGh5c19hZGRyX3BsYWNlID0gYWxQYWlyOworCisJICAvLyBOb3csIHNldCBhbFBhaXIgPSB0aGUgdmlydHVhbCBhZGRyIG9mIHRoZSAoRXh0ZW5kZWQpIFMvRyBwYWdlCisJICAvLyB3aGljaCB3aWxsIGFjY2VwdCB0aGUgTGVuLyBQaHlzaWNhbEFkZHJlc3MgcGFpcnMKKwkgIGFsUGFpciA9IChVTE9ORyAqKSB1bEJ1ZmY7CisKKwkgIEFsbG9jYXRlZFBhZ2VzKys7CisJICBpZiAoQWxsb2NhdGVkUGFnZXMgPj0gYXBfaGlfd2F0ZXIpCisJICB7CisJCS8vIFRoaXMgbWVzc2FnZSBzaG91bGQgcmFyZWx5LCBpZiBldmVyLCBjb21lIG91dC4KKwkJLy8gUHJldmlvdXNseSAoY3BxZmMgdmVyc2lvbiA8PSAyLjAuNSkgdGhlIGRyaXZlciB3b3VsZAorCQkvLyBqdXN0IHB1a2UgaWYgbW9yZSB0aGFuIDQgU0cgcGFnZXMgd2VyZSB1c2VkLCBhbmQgbm9ib2R5CisJCS8vIGV2ZXIgY29tcGxhaW5lZCBhYm91dCB0aGF0LiAgVGhpcyBvbmx5IGNvbWVzIG91dCBpZiAKKwkJLy8gbW9yZSB0aGFuIDggcGFnZXMgYXJlIHVzZWQuCisKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkiY3BxZmM6IFBvc3NpYmxlIGRhbmdlci4gICVkIHNjYXR0ZXIgZ2F0aGVyIHBhZ2VzIHVzZWQuXG4iCisJCQkiY3BxZmM6IGRldGVjdGVkIHNlZW1pbmdseSBleHRyZW1lIG1lbW9yeSAiCisJCQkiZnJhZ21lbnRhdGlvbiBvciBodWdlIGRhdGEgdHJhbnNmZXJzLlxuIiwgCisJCQlBbGxvY2F0ZWRQYWdlcyk7CisJCWFwX2hpX3dhdGVyID0gQWxsb2NhdGVkUGFnZXMrMTsKKwkgIH0KKwkJCisJICBQYWlyQ291bnQgPSAxOyAgLy8gc3RhcnRpbmcgbmV3IEV4dC4gUy9HIHBhZ2UKKwkgIHByZXZfcGFnZSA9ICgqc2dwYWdlKTsgIC8vIHJlbWVtYmVyIHRoaXMgcGFnZSwgZm9yIG5leHQgdGltZSB0aHJ1CisJICBzZ3BhZ2UgPSAmKCgqc2dwYWdlKS0+bmV4dCk7CisJfSAgLy8gZW5kIG9mIG5ldyBUTCBFeHQuIFMvRyBwYWdlIGFsbG9jYXRpb24KKworCSphbFBhaXIgPSB0aGlzbGVuOyAvLyBiaXRzIDE4LTAsIGxlbmd0aCAocmFuZ2UgY2hlY2sgYWJvdmUpCisgICAgICAKKyMJaWZkZWYgREJHX1NFU1RfU0dMSVNUCisJICBwcmludGsoIlBhaXJDb3VudCAlZCBAJXAsIGV2ZW4gJVhoLCAiLCBQYWlyQ291bnQsIGFsUGFpciwgKmFsUGFpcik7CisjCWVuZGlmCisKKwlhbFBhaXIrKzsgICAgLy8gbmV4dCBEV09SRCwgcGh5c2ljYWwgYWRkcmVzcyAKKworCWlmICggV0VfSEFWRV9TR19MSVNUICkgCisJCXVsQnVmZiA9IHNnX2RtYV9hZGRyZXNzKHNnbCkgKyBvZmZzZXQ7CisJZWxzZQorCQl1bEJ1ZmYgPSBjb250aWdhZGRyICsgb2Zmc2V0OworCW9mZnNldCArPSB0aGlzbGVuOworCisjCWlmIEJJVFNfUEVSX0xPTkcgPiAzMgorICAgICAgICAgIGlmKCB1bEJ1ZmYgPj4zMiApCisJICB7CisJICAgIHByaW50aygiY3FwZmNUUzogMVRhY2ggRE1BIGFkZHJlc3MgJXAgPiAzMiBiaXRzXG4iLCAodm9pZCopdWxCdWZmICk7CisJICAgIHByaW50aygiJXMgPSAlcCwgb2Zmc2V0ID0gJWxkXG4iLCAKKwkJV0VfSEFWRV9TR19MSVNUID8gInVsQnVmZiIgOiAiY29udGlnYWRkciIsCisJCVdFX0hBVkVfU0dfTElTVCA/ICh2b2lkICopIHVsQnVmZiA6ICh2b2lkICopIGNvbnRpZ2FkZHIsCisJCQlvZmZzZXQpOworCSAgICByZXR1cm4gMDsKKwkgIH0KKyMJZW5kaWYKKworCSphbFBhaXIgPSAoVUxPTkcpIHVsQnVmZjsgLy8gbG93ZXIgMzIgYml0cyAoMzEtMCkKKworIyAgICAgICBpZmRlZiBEQkdfU0VTVF9TR0xJU1QKKyAgICAgICAgcHJpbnRrKCJvZGQgJVhoXG4iLCAqYWxQYWlyKTsKKyMgICAgICAgZW5kaWYKKwlhbFBhaXIrKzsgICAgLy8gbmV4dCBEV09SRCwgbmV4dCBhZGRyZXNzL2xlbmd0aCBwYWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJUGFpckNvdW50Kys7IC8vIG5leHQgTGVuZ3RoL0FkZHJlc3MgcGFpcgorCisJLy8gaWYgKFBhaXJDb3VudCA+IHBjX2hpX3dhdGVyKQorCS8vIHsKKwkJLy8gcHJpbnRrKCJwYyBoaSA9ICVkICIsIFBhaXJDb3VudCk7CisJCS8vIHBjX2hpX3dhdGVyID0gUGFpckNvdW50OworCS8vIH0KKwlieXRlc190b19nbyAtPSB0aGlzbGVuOworCXRvdGFsX2RhdGFfbGVuICs9IHRoaXNsZW47ICAKKwl0aGlzTWFwcGluZ0xlbiAtPSB0aGlzbGVuOworCXRvdGFsc2dzKys7CisgICAgICB9IC8vIHdoaWxlICh0aGlzTWFwcGluZ0xlbiA+IDApCisgICAgICBpZiAoIFdFX0hBVkVfU0dfTElTVCApIHNnbCsrOyAgLy8gbmV4dCBTL0cgcGFpcgorICAgIH0gLy8gd2hpbGUgKGJ5dGVzX3RvX2dvKQorCisgICAgLy8gcHJpbnRrKCJUb3RhbHNncz0lZFxuIiwgdG90YWxzZ3MpOworICAgICpzZ1BhaXJzID0gdG90YWxzZ3M7CisKKyAgICAvLyBQQ0kgbWFwIChhbmQgYm91bmNlKSB0aGUgbGFzdCAoYW5kIHVzdWFsbHkgb25seSkgZXh0ZW5kZWQgU0cgcGFnZQorICAgIGJ1c2FkZHIgPSBjcHFmY19wY2lfbWFwX3NnX3BhZ2UocGNpZGV2LAorCQlleHRfc2dfcGFnZV9waHlzX2FkZHJfcGxhY2UsCisJCXByZXZfcGFnZS0+cGFnZSwgCisJCSZwcmV2X3BhZ2UtPmJ1c2FkZHIsIAorCQkmcHJldl9wYWdlLT5tYXBsZW4sCisJCVBhaXJDb3VudCk7CisgIH0KKyAgcmV0dXJuIHRvdGFsX2RhdGFfbGVuOworfQorCisKKworLy8gVGhlIFRhY2hsaXRlIFNFU1QgdGFibGUgaXMgcmVmZXJlbmNlZCB0byBPWF9JRCAob3IgUlhfSUQpLiAgVG8gb3B0aW1pemUKKy8vIHBlcmZvcm1hbmNlIGFuZCBkZWJ1Z2dhYmlsaXR5LCB3ZSBpbmRleCB0aGUgRXhjaGFuZ2Ugc3RydWN0dXJlIHRvIEZDIFhfSUQKKy8vIFRoaXMgZW5hYmxlcyB1cyB0byBidWlsZCBleGNoYW5nZXMgZm9yIGxhdGVyIGVuLXF1ZWluZyB0byBUYWNoeW9uLAorLy8gcHJvdmlkZWQgd2UgaGF2ZSBhbiBvcGVuIFhfSUQgc2xvdC4gQXQgVGFjaHlvbiBxdWVpbmcgdGltZSwgd2Ugb25seSAKKy8vIG5lZWQgYW4gRVJRIHNsb3Q7IHRoZW4gImZpeC11cCIgcmVmZXJlbmNlcyBpbiB0aGUgCisvLyBJUkIsIEZDSFMsIGV0Yy4gYXMgbmVlZGVkLgorLy8gUkVUVVJOUzoKKy8vIDAgaWYgc3VjY2Vzc2Z1bAorLy8gbm9uLXplcm8gb24gZXJyb3IKKy8vc3N0YXJ0ZXgKK1VMT05HIGNwcWZjVFNTdGFydEV4Y2hhbmdlKCAKKyAgQ1BRRkNIQkEgKmNwcWZjSEJBZGF0YSwgICAgICAgICAgICAgICAgICAgICAgCisgIExPTkcgRXhjaGFuZ2VJRCApCit7CisgIFBUQUNIWU9OIGZjQ2hpcCA9ICZjcHFmY0hCQWRhdGEtPmZjQ2hpcDsKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgRkNfRVhDSEFOR0UgKnBFeGNoYW5nZSA9ICZFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIEV4Y2hhbmdlSUQgXTsgLy8gc2hvcnRoYW5kCisgIFVTSE9SVCBwcm9kdWNlciwgY29uc3VtZXI7CisgIFVMT05HIHVsU3RhdHVzPTA7CisgIHNob3J0IGludCBFcnFJbmRleDsKKyAgQk9PTEVBTiBDb21wbGV0ZUV4Y2hhbmdlID0gRkFMU0U7ICAvLyBlLmcuIEFDQyByZXBsaWVzIGFyZSBjb21wbGV0ZQorICBCT09MRUFOIFNlc3RUeXBlPUZBTFNFOworICBVTE9ORyBJbmJvdW5kRGF0YT0wOworCisgIC8vIFdlIHdpbGwgbWFuaXB1bGF0ZSBUYWNobGl0ZSBjaGlwIHJlZ2lzdGVycyBoZXJlIHRvIHN1Y2Nlc3NmdWxseQorICAvLyBzdGFydCBleGNoYW5nZXMuIAorCisgIC8vIENoZWNrIHRoYXQgbGluayBpcyBub3QgZG93biAtLSB3ZSBjYW4ndCBzdGFydCBhbiBleGNoYW5nZSBvbiBhCisgIC8vIGRvd24gbGluayEKKworICBpZiggZmNDaGlwLT5SZWdpc3RlcnMuRk1zdGF0dXMudmFsdWUgJiAweDgwKSAvLyBMUFNNIG9mZmxpbmU/CisgIHsKK3ByaW50aygiZmNTdGFydEV4Y2hhbmdlOiBQU00gb2ZmbGluZSAoJVhoKSwgeF9JRCAlWGgsIHR5cGUgJVhoLCBwb3J0X2lkICVYaFxuIiwKKyAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkZNc3RhdHVzLnZhbHVlICYgMHhGRiwKKyAgICAgICAgIEV4Y2hhbmdlSUQsCisgICAgICAgICBwRXhjaGFuZ2UtPnR5cGUsCisgICAgICAgICBwRXhjaGFuZ2UtPmZjaHMuZF9pZCk7CisKKyAgICBpZiggRXhjaGFuZ2VJRCA+PSBUQUNIX1NFU1RfTEVOICkgIC8vIExpbmsgU2VydmljZSBPdXRib3VuZCBmcmFtZT8KKyAgICB7CisgICAgICAvLyBPdXIgbW9zdCBwb3B1bGFyIExpbmtTZXJ2aWNlIGNvbW1hbmRzIGFyZSBwb3J0IGRpc2NvdmVyeSB0eXBlcworICAgICAgLy8gKFBMT0dJLyBQRElTQy4uLiksIHdoaWNoIGFyZSBpbXBsaWNpdGx5IG51bGxpZmllZCBieSBMaW5rIERvd24KKyAgICAgIC8vIGV2ZW50cywgc28gaXQgbWFrZXMgbm8gc2Vuc2UgdG8gUXVlIHRoZW0uICBIb3dldmVyLCBBQlRTIHNob3VsZAorICAgICAgLy8gYmUgcXVldWVkLCBzaW5jZSBleGNoYW5nZSBzZXF1ZW5jZXMgYXJlIGxpa2VseSBkZXN0cm95ZWQgYnkKKyAgICAgIC8vIExpbmsgRG93biBldmVudHMsIGFuZCB3ZSB3YW50IHRvIG5vdGlmeSBvdGhlciBwb3J0cyBvZiBicm9rZW4KKyAgICAgIC8vIHNlcXVlbmNlcyBieSBhYm9ydGluZyB0aGUgY29ycmVzcG9uZGluZyBleGNoYW5nZXMuCisgICAgICBpZiggcEV4Y2hhbmdlLT50eXBlICE9IEJMU19BQlRTICkKKyAgICAgIHsKKwl1bFN0YXR1cyA9IExOS0RXTl9PU0xTOworCWdvdG8gRG9uZTsKKyAgICAgICAgLy8gZG9uJ3QgUXVlIG1vc3QgTGlua1NlcnYgZXhjaGFuZ2VzIG9uIExJTksgRE9XTgorICAgICAgfQorICAgIH0KKworICAgIHByaW50aygiZmNTdGFydEV4Y2hhbmdlOiBRdWUgeF9JRCAlWGgsIHR5cGUgJVhoXG4iLCAKKyAgICAgIEV4Y2hhbmdlSUQsIHBFeGNoYW5nZS0+dHlwZSk7CisgICAgcEV4Y2hhbmdlLT5zdGF0dXMgfD0gRVhDSEFOR0VfUVVFVUVEOworICAgIHVsU3RhdHVzID0gRVhDSEFOR0VfUVVFVUVEOworICAgIGdvdG8gRG9uZTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBFUlEgaGFzIGF2YWlsYWJsZSBzcGFjZS4KKyAgCisgIHByb2R1Y2VyID0gKFVTSE9SVClmY0NoaXAtPkVSUS0+cHJvZHVjZXJJbmRleDsgLy8gY29waWVzIGZvciBsb2dpY2FsIGFyaXRoLgorICBjb25zdW1lciA9IChVU0hPUlQpZmNDaGlwLT5FUlEtPmNvbnN1bWVySW5kZXg7CisgIHByb2R1Y2VyKys7ICAvLyBXZSBhcmUgdGVzdGluZyBmb3IgZnVsbCBxdWUgYnkgaW5jcmVtZW50aW5nCisgIAorICBpZiggcHJvZHVjZXIgPj0gRVJRX0xFTiApICAvLyByb2xsb3ZlciBjb25kaXRpb24/CisgICAgcHJvZHVjZXIgPSAwOworICBpZiggY29uc3VtZXIgIT0gcHJvZHVjZXIgKSAvLyBFUlEgbm90IGZ1bGw/CisgIHsKKyAgICAvLyAqKioqKioqKioqKioqKioqKiogTmVlZCBBdG9taWMgYWNjZXNzIHRvIGNoaXAgcmVnaXN0ZXJzISEqKioqKioqKgorICAgIAorICAgIC8vIHJlbWVtYmVyIEVSUSBQSSBmb3IgY29weWluZyBJUkIKKyAgICBFcnFJbmRleCA9IChVU0hPUlQpZmNDaGlwLT5FUlEtPnByb2R1Y2VySW5kZXg7IAorICAgIGZjQ2hpcC0+RVJRLT5wcm9kdWNlckluZGV4ID0gcHJvZHVjZXI7IC8vIHRoaXMgaXMgd3JpdHRlbiB0byBUYWNoeW9uCisgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGFuIEVSUSBzbG90ISBJZiBTQ1NJIGNvbW1hbmQsIG5lZWQgU0VTVCBzbG90CisgICAgICAgICAgICAgICAvLyBvdGhlcndpc2Ugd2UgYXJlIGRvbmUuCisKKyAgICAvLyBOb3RlIHRoYXQgVGFjaHlvbiByZXF1aXJlcyB0aGF0IGJpdCAxNSBvZiB0aGUgT1hfSUQgb3IgUlhfSUQgYmUKKyAgICAvLyBzZXQgYWNjb3JkaW5nIHRvIGRpcmVjdGlvbiBvZiBkYXRhIHRvL2Zyb20gVGFjaHlvbiBmb3IgU0VTVCBhc3Npc3RzLgorICAgIC8vIEZvciBjb25zaXN0ZW5jeSwgZW5mb3JjZSB0aGlzIHJ1bGUgZm9yIExpbmsgU2VydmljZSAobm9uLVNFU1QpCisgICAgLy8gZXhjaGFuZ2VzIGFzIHdlbGwuCisKKyAgICAvLyBmaXgtdXAgdGhlIFhfSUQgZmllbGQgaW4gSVJCCisgICAgcEV4Y2hhbmdlLT5JUkIuUmVxX0FfVHJhbnNfSUQgPSBFeGNoYW5nZUlEICYgMHg3RkZGOyAvLyAxNS1iaXQgZmllbGQKKworICAgIC8vIGZpeC11cCB0aGUgWF9JRCBmaWVsZCBpbiBmY2hzIC0tIGRlcGVuZHMgb24gT3JpZ2luYXRvciBvciBSZXNwb25kZXIsCisgICAgLy8gb3V0Z29pbmcgb3IgaW5jb21pbmcgZGF0YT8KKyAgICBzd2l0Y2goIHBFeGNoYW5nZS0+dHlwZSApCisgICAgeworICAgICAgICAgICAgICAgLy8gT1JJR0lOQVRPUiB0eXBlcy4uLiAgd2UncmUgc2V0dGluZyBvdXIgT1hfSUQgYW5kCisgICAgICAgICAgICAgICAvLyBkZWZhdWx0aW5nIHRoZSByZXNwb25kZXIncyBSWF9JRCB0byAweEZGRkYKKyAgICAKKyAgICBjYXNlIFNDU0lfSVJFOgorICAgICAgLy8gUmVxdWlyZW1lbnQ6IHNldCBNU0Igb2YgeF9JRCBmb3IgSW5jb21pbmcgVEwgZGF0YQorICAgICAgLy8gKHNlZSAiVGFjaHlvbiBUTC9UUyBVc2VyJ3MgTWFudWFsIiwgUmV2IDYuMCwgU2VwdC4nOTgsIHBnLiA1MCkKKyAgICAgIEluYm91bmREYXRhID0gMHg4MDAwOworCisgICAgY2FzZSBTQ1NJX0lXRTogICAKKyAgICAgIFNlc3RUeXBlID0gVFJVRTsKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCA9IChFeGNoYW5nZUlEIHwgSW5ib3VuZERhdGEpOworICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkIDw8PSAxNjsgICAgIC8vIE1TVyBzaGlmdAorICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkIHw9IDB4ZmZmZjsgIC8vIGFkZCBkZWZhdWx0IFJYX0lECisgICAgICAKKyAgICAgIC8vIG5vdyBmaXgtdXAgdGhlIERhdGEgSERSIE9YX0lEIChUTCBhdXRvbWF0aWNhbGx5IGRvZXMgcnhfaWQpCisgICAgICAvLyAobm90IG5lY2Vzc2FyeSBmb3IgSVJFIC0tIGRhdGEgYnVmZmVyIHVudXNlZCkKKyAgICAgIGlmKCBwRXhjaGFuZ2UtPnR5cGUgPT0gU0NTSV9JV0UpCisgICAgICB7CisgICAgICAgIGZjQ2hpcC0+U0VTVC0+RGF0YUhEUlsgRXhjaGFuZ2VJRCBdLm94X3J4X2lkID0gCisgICAgICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkOworCisgICAgICB9CisKKyAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIEZDU19OU1I6ICAvLyBleHQuIGxpbmsgc2VydmljZSBOYW1lIFNlcnZpY2UgUmVxdWVzdAorICAgIGNhc2UgRUxTX1NDUjogIC8vIGV4dC4gbGluayBzZXJ2aWNlIFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24KKyAgICBjYXNlIEVMU19GRElTQzovLyBleHQuIGxpbmsgc2VydmljZSBsb2dpbgorICAgIGNhc2UgRUxTX0ZMT0dJOi8vIGV4dC4gbGluayBzZXJ2aWNlIGxvZ2luCisgICAgY2FzZSBFTFNfTE9HTzogLy8gRkMtUEggZXh0ZW5kZWQgbGluayBzZXJ2aWNlIGxvZ291dAorICAgIGNhc2UgQkxTX05PUDogIC8vIEJhc2ljIGxpbmsgc2VydmljZSBObyBPUGVyYXRpb24KKyAgICBjYXNlIEVMU19QTE9HSTovLyBleHQuIGxpbmsgc2VydmljZSBsb2dpbiAoUExPR0kpCisgICAgY2FzZSBFTFNfUERJU0M6Ly8gZXh0LiBsaW5rIHNlcnZpY2UgbG9naW4gKFBESVNDKQorICAgIGNhc2UgRUxTX1BSTEk6IC8vIGV4dC4gbGluayBzZXJ2aWNlIHByb2Nlc3MgbG9naW4KKworICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkID0gRXhjaGFuZ2VJRDsKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCA8PD0gMTY7ICAvLyBNU1cgc2hpZnQKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCB8PSAweGZmZmY7ICAvLyBhbmQgUlhfSUQKKworICAgICAgYnJlYWs7CisgICAgICAKKworCisKKyAgICAgICAgICAgICAgIC8vIFJFU1BPTkRFUiB0eXBlcy4uLiB3ZSBtdXN0IHNldCBvdXIgUlhfSUQgd2hpbGUgcHJlc2VydmluZworICAgICAgICAgICAgICAgLy8gc2VuZGVyJ3MgT1hfSUQKKyAgICAgICAgICAgICAgIC8vIG91dGdvaW5nIChvciBubykgZGF0YQorICAgIGNhc2UgRUxTX1JKVDogICAgICAgLy8gZXh0ZW5kZWQgbGluayBzZXJ2aWNlIHJlamVjdCAKKyAgICBjYXNlIEVMU19MT0dPX0FDQzogLy8gRkMtUEggZXh0ZW5kZWQgbGluayBzZXJ2aWNlIGxvZ291dCBhY2NlcHQKKyAgICBjYXNlIEVMU19BQ0M6ICAgICAgLy8gZXh0LiBnZW5lcmljIGxpbmsgc2VydmljZSBhY2NlcHQKKyAgICBjYXNlIEVMU19QTE9HSV9BQ0M6Ly8gZXh0LiBsaW5rIHNlcnZpY2UgbG9naW4gYWNjZXB0IChQTE9HSSBvciBQRElTQykKKyAgICBjYXNlIEVMU19QUkxJX0FDQzogLy8gZXh0LiBsaW5rIHNlcnZpY2UgcHJvY2VzcyBsb2dpbiBhY2NlcHQKKworICAgICAgQ29tcGxldGVFeGNoYW5nZSA9IFRSVUU7ICAgLy8gUmVwbHkgKEFDQyBvciBSSlQpIGlzIGVuZCBvZiBleGNoYW5nZQorICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkIHw9IChFeGNoYW5nZUlEICYgMHhGRkZGKTsKKworICAgICAgYnJlYWs7CisKKworICAgICAgLy8gc2luY2Ugd2UgYXJlIGEgUmVzcG9uZGVyLCBPWF9JRCBzaG91bGQgYWxyZWFkeSBiZSBzZXQgYnkKKyAgICAgIC8vIGNwcWZjVFNCdWlsZEV4Y2hhbmdlKCkuICBXZSBuZWVkIHRvIC1PUi0gaW4gUlhfSUQKKyAgICBjYXNlIFNDU0lfVFdFOgorICAgICAgU2VzdFR5cGUgPSBUUlVFOworICAgICAgLy8gUmVxdWlyZW1lbnQ6IHNldCBNU0Igb2YgeF9JRCBmb3IgSW5jb21pbmcgVEwgZGF0YQorICAgICAgLy8gKHNlZSAiVGFjaHlvbiBUTC9UUyBVc2VyJ3MgTWFudWFsIiwgUmV2IDYuMCwgU2VwdC4nOTgsIHBnLiA1MCkKKworICAgICAgcEV4Y2hhbmdlLT5mY2hzLm94X3J4X2lkICY9IDB4RkZGRjAwMDA7ICAvLyBjbGVhciBSWF9JRAorICAgICAgLy8gUmVxdWlyZW1lbnQ6IHNldCBNU0Igb2YgUlhfSUQgZm9yIEluY29taW5nIFRMIGRhdGEKKyAgICAgIC8vIChzZWUgIlRhY2h5b24gVEwvVFMgVXNlcidzIE1hbnVhbCIsIFJldiA2LjAsIFNlcHQuJzk4LCBwZy4gNTApCisgICAgICBwRXhjaGFuZ2UtPmZjaHMub3hfcnhfaWQgfD0gKEV4Y2hhbmdlSUQgfCAweDgwMDApOworICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgCisgICAgY2FzZSBTQ1NJX1RSRToKKyAgICAgIFNlc3RUeXBlID0gVFJVRTsKKyAgICAgIAorICAgICAgLy8gdGhlcmUgaXMgbm8gWFJEWSBmb3IgU0VTVCB0YXJnZXQgcmVhZDsgdGhlIGRhdGEKKyAgICAgIC8vIGhlYWRlciBuZWVkcyB0byBiZSB1cGRhdGVkLiBBbHNvIHVwZGF0ZSB0aGUgUlNQCisgICAgICAvLyBleGNoYW5nZSBJRHMgZm9yIHRoZSBzdGF0dXMgZnJhbWUsIGluIGNhc2UgaXQgaXMgc2VudCBhdXRvbWF0aWNhbGx5CisgICAgICBmY0NoaXAtPlNFU1QtPkRhdGFIRFJbIEV4Y2hhbmdlSUQgXS5veF9yeF9pZCB8PSBFeGNoYW5nZUlEOworICAgICAgZmNDaGlwLT5TRVNULT5Sc3BIRFJbIEV4Y2hhbmdlSUQgXS5veF9yeF9pZCA9IAorICAgICAgICBmY0NoaXAtPlNFU1QtPkRhdGFIRFJbIEV4Y2hhbmdlSUQgXS5veF9yeF9pZDsKKyAgICAgIAorICAgICAgLy8gZm9yIGVhc2llciBGQ1AgcmVzcG9uc2UgbG9naWMgKHdvcmtzIGZvciBUV0UgYW5kIFRSRSksIAorICAgICAgLy8gY29weSBleGNoYW5nZSBJRHMuICAoTm90IG5lZWRlZCBpZiBUUkUgJ1JTUCcgYml0IHNldCkKKyAgICAgIHBFeGNoYW5nZS0+ZmNocy5veF9yeF9pZCA9CisgICAgICAgIGZjQ2hpcC0+U0VTVC0+RGF0YUhEUlsgRXhjaGFuZ2VJRCBdLm94X3J4X2lkOworCisgICAgICBicmVhazsKKworCisgICAgY2FzZSBGQ1BfUkVTUE9OU0U6ICAvLyB1c2luZyBleGlzdGluZyBPWF9JRC8gUlhfSUQgcGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IFNGUyBGQ1AtUkVTUE9OU0UgZnJhbWUKKyAgICAgIC8vIE9YL1JYX0lEIHNob3VsZCBhbHJlYWR5IGJlIHNldCEgKFNlZSAiZmNCdWlsZCIgYWJvdmUpCisgICAgICBDb21wbGV0ZUV4Y2hhbmdlID0gVFJVRTsgICAvLyBSU1AgaXMgZW5kIG9mIEZDUC1TQ1NJIGV4Y2hhbmdlCisKKyAgICAgIAorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQkxTX0FCVFNfUkpUOiAgLy8gdXNlcyBuZXcgUlhfSUQsIHNpbmNlIFNFU1QgeF9JRCBub24tZXhpc3RlbnQKKyAgICBjYXNlIEJMU19BQlRTX0FDQzogIC8vIHVzaW5nIGV4aXN0aW5nIE9YX0lELyBSWF9JRCBwYWlyIGZyb20gU0VTVCBlbnRyeQorICAgICAgQ29tcGxldGVFeGNoYW5nZSA9IFRSVUU7ICAgLy8gQUNDIG9yIFJKVCBtYXJrcyBlbmQgb2YgRkNQLVNDU0kgZXhjaGFuZ2UKKyAgICBjYXNlIEJMU19BQlRTOiAgLy8gdXNpbmcgZXhpc3RpbmcgT1hfSUQvIFJYX0lEIHBhaXIgZnJvbSBTRVNUIGVudHJ5CisKKworICAgICAgYnJlYWs7CisKKworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGsoIkVycm9yIG9uIGZjU3RhcnRFeGNoYW5nZTogdW5kZWZpbmVkIHR5cGUgJVhoKCVkKVxuIiwKKyAgICAgICAgcEV4Y2hhbmdlLT50eXBlLCBwRXhjaGFuZ2UtPnR5cGUpOworICAgICAgcmV0dXJuIElOVkFMSURfQVJHUzsKKyAgICB9CisgICAgCisgICAgCisgICAgICAvLyBYX0lEIGZpZWxkcyBhcmUgZW50ZXJlZCAtLSBjb3B5IElSQiB0byBUYWNoeW9uJ3MgRVJRCisgICAgCisKKyAgICBtZW1jcHkoCisgICAgICAgICZmY0NoaXAtPkVSUS0+UUVudHJ5WyBFcnFJbmRleCBdLCAgLy8gZGVzdC4KKyAgICAgICAgJnBFeGNoYW5nZS0+SVJCLAorICAgICAgICAzMik7ICAvLyBmaXhlZCAoaGFyZHdhcmUpIGxlbmd0aCEKKworICAgIFBDSV9UUkFDRU8oIEV4Y2hhbmdlSUQsIDB4QTApCisKKyAgICAvLyBBQ1RJT04hICBNYXkgZ2VuZXJhdGUgSU5UIGFuZCBJTVEgZW50cnkKKyAgICB3cml0ZWwoIGZjQ2hpcC0+RVJRLT5wcm9kdWNlckluZGV4LAorICAgICAgICAgIGZjQ2hpcC0+UmVnaXN0ZXJzLkVSUXByb2R1Y2VySW5kZXguYWRkcmVzcyk7CisKKyAgCisgICAgaWYoIEV4Y2hhbmdlSUQgPj0gVEFDSF9TRVNUX0xFTiApICAvLyBMaW5rIFNlcnZpY2UgT3V0Ym91bmQgZnJhbWU/CisgICAgeworICAgIAorICAgICAgLy8gd2FpdCBmb3IgY29tcGxldGlvbiEgKFREQiAtLSB0aW1lb3V0IGFuZCBjaGlwIHJlc2V0KQorICAgICAgCisKKyAgUENJX1RSQUNFTyggRXhjaGFuZ2VJRCwgMHhBNCkKKyAgCisgICAgICBlbmFibGVfaXJxKCBjcHFmY0hCQWRhdGEtPkhvc3RBZGFwdGVyLT5pcnEpOyAvLyBvbmx5IHdheSB0byBnZXQgU2VtLgorICAgICAgCisgICAgICBkb3duX2ludGVycnVwdGlibGUoIGNwcWZjSEJBZGF0YS0+VFlPQmNvbXBsZXRlKTsgCisgIAorICAgICAgZGlzYWJsZV9pcnEoIGNwcWZjSEJBZGF0YS0+SG9zdEFkYXB0ZXItPmlycSk7CisgIFBDSV9UUkFDRSggMHhBNCkKKworICAgICAgLy8gT24gbG9naW4gZXhjaGFuZ2VzLCBCQURfQUxQQSAobm9uLWV4aXN0ZW50IHBvcnRfaWQpIHJlc3VsdHMgaW4gCisgICAgICAvLyBGVE8gKEZyYW1lIFRpbWUgT3V0KSBvbiB0aGUgT3V0Ym91bmQgQ29tcGxldGlvbiBtZXNzYWdlLgorICAgICAgLy8gSWYgd2UgZ290IGFuIEZUTyBzdGF0dXMsIGNvbXBsZXRlIHRoZSBleGNoYW5nZSAoZnJlZSB1cCBzbG90KQorICAgICAgaWYoIENvbXBsZXRlRXhjaGFuZ2UgfHwgICAvLyBmbGFnIGZyb20gUmVwbHkgZnJhbWVzCisgICAgICAgICAgcEV4Y2hhbmdlLT5zdGF0dXMgKSAgIC8vIHR5cGljYWxseSwgY2FuIGdldCBGUkFNRV9UTworICAgICAgeworICAgIAljcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIGZjQ2hpcCwgRXhjaGFuZ2VJRCk7ICAKKyAgICAgIH0KKyAgICB9CisKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNFU1QgRXhjaGFuZ2UKKyAgICB7CisgICAgICB1bFN0YXR1cyA9IDA7ICAgLy8gc2hpcCAmIHByYXkgc3VjY2VzcyAoZS5nLiBGQ1AtU0NTSSkKKyAgICAgIAorICAgICAgaWYoIENvbXBsZXRlRXhjaGFuZ2UgKSAgIC8vIGJ5IFR5cGUgb2YgZXhjaGFuZ2UgKGUuZy4gZW5kLW9mLXhjaG5nKQorICAgICAgeworICAgIAljcHFmY1RTQ29tcGxldGVFeGNoYW5nZSggY3BxZmNIQkFkYXRhLT5QY2lEZXYsIGZjQ2hpcCwgRXhjaGFuZ2VJRCk7ICAKKyAgICAgIH0KKyAgICAgICAKKyAgICAgIGVsc2UKKyAgICAgICAgcEV4Y2hhbmdlLT5zdGF0dXMgJj0gfkVYQ0hBTkdFX1FVRVVFRDsgIC8vIGNsZWFyIEV4Y2hhbmdlUXVldWVkIGZsYWcgCisKKyAgICB9CisgIH0KKworICAKKyAgZWxzZSAgICAgICAgICAgICAgICAvLyBFUlEgJ3Byb2R1Y2VyJyA9ICdjb25zdW1lcicgYW5kIFFVRSBpcyBmdWxsCisgIHsKKyAgICB1bFN0YXR1cyA9IE9VVFFVRV9GVUxMOyAvLyBPdXRib3VuZCAoRVJRKSBRdWUgZnVsbAorICB9CisgCitEb25lOiAKKyAgUENJX1RSQUNFKCAweEEwKQorICByZXR1cm4gdWxTdGF0dXM7IAorfQorCisKKworCisKKy8vIFNjYW4gZmNDb250cm9sbGVyLT5mY0V4Y2hhbmdlcyBhcnJheSBmb3IgYSB1c3VhYmxlIGluZGV4IChhICJmcmVlIgorLy8gZXhjaGFuZ2UpLgorLy8gSW5wdXRzOgorLy8gICBmY0NoaXAgLSBwb2ludGVyIHRvIFRhY2hMaXRlIGNoaXAgc3RydWN0dXJlCisvLyBSZXR1cm46CisvLyAgaW5kZXggLSBleGNoYW5nZSBhcnJheSBlbGVtZW50IHdoZXJlIGV4Y2hhbmdlIGNhbiBiZSBidWlsdAorLy8gIC0xICAgIC0gZXhjaGFuZ2UgYXJyYXkgaXMgZnVsbAorLy8gUkVNQVJLUzoKKy8vIEFsdGhvdWdoIHRoaXMgaXMgYSAoeXVrISkgbGluZWFyIHNlYXJjaCwgd2UgcHJlc3VtZQorLy8gdGhhdCB0aGUgc3lzdGVtIHdpbGwgY29tcGxldGUgZXhjaGFuZ2VzIGFib3V0IGFzIHF1aWNrbHkgYXMKKy8vIHRoZXkgYXJlIHN1Ym1pdHRlZC4gIEEgZnVsbCBFeGNoYW5nZSBhcnJheSAoYW5kIGhlbmNlLCBtYXggbGluZWFyCisvLyBzZWFyY2ggdGltZSBmb3IgZnJlZSBleGNoYW5nZSBzbG90KSBhbG1vc3QgZ3VhcmFudGVlcyBhIEZpYnJlIHByb2JsZW0gCisvLyBvZiBzb21lIHNvcnQuCisvLyBJbiB0aGUgaW50ZXJlc3Qgb2YgbWFraW5nIGV4Y2hhbmdlcyBlYXNpZXIgdG8gZGVidWcsIHdlIHdhbnQgYSBMUlUKKy8vIChMZWFzdCBSZWNlbnRseSBVc2VkKSBzY2hlbWUuCisKKworc3RhdGljIExPTkcgRmluZEZyZWVFeGNoYW5nZSggUFRBQ0hZT04gZmNDaGlwLCBVTE9ORyB0eXBlICkKK3sKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgVUxPTkcgaTsKKyAgVUxPTkcgdWxTdGF0dXM9LTE7ICAvLyBhc3N1bWUgZmFpbHVyZQorCisKKyAgaWYoIHR5cGUgPT0gU0NTSV9JUkUgfHwKKyAgICAgIHR5cGUgPT0gU0NTSV9UUkUgfHwKKyAgICAgIHR5cGUgPT0gU0NTSV9JV0UgfHwKKyAgICAgIHR5cGUgPT0gU0NTSV9UV0UpCisgIHsKKyAgICAgICAgLy8gU0NTSSB0eXBlIC0gWF9JRHMgc2hvdWxkIGJlIGZyb20gMCB0byBUQUNIX1NFU1RfTEVOLTEKKyAgICBpZiggZmNDaGlwLT5mY1Nlc3RFeGNoYW5nZUxSVSA+PSBUQUNIX1NFU1RfTEVOKSAvLyByb2xsb3Zlcj8KKyAgICAgIGZjQ2hpcC0+ZmNTZXN0RXhjaGFuZ2VMUlUgPSAwOworICAgIGkgPSBmY0NoaXAtPmZjU2VzdEV4Y2hhbmdlTFJVOyAvLyB0eXBpY2FsbHkgaXQncyBhbHJlYWR5IGZyZWUhCisKKyAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgPT0gMCApIC8vIGNoZWNrIGZvciAiZnJlZSIgZWxlbWVudAorICAgIHsKKyAgICAgIHVsU3RhdHVzID0gMDsgLy8gc3VjY2VzcyEKKyAgICB9CisgICAgCisgICAgZWxzZQorICAgIHsgICAgICAgICAvLyBZVUshIHdlIG5lZWQgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBmcmVlIGVsZW1lbnQuCisgICAgICAgICAgICAgIC8vIEZyYWdtZW50YXRpb24gb2YgdGhlIGZjRXhjaGFuZ2UgYXJyYXkgaXMgZHVlIHRvIGV4Y2Vzc2l2ZWx5CisgICAgICAgICAgICAgIC8vIGxvbmcgY29tcGxldGlvbnMgb3IgdGltZW91dHMuCisgICAgICAKKyAgICAgIHdoaWxlKCBUUlVFICkKKyAgICAgIHsKKyAgICAgICAgaWYoICsraSA+PSBUQUNIX1NFU1RfTEVOICkgLy8gcm9sbG92ZXIgY2hlY2sKKyAgICAgICAgICBpID0gMDsgIC8vIGJlZ2lubmluZyBvZiBTRVNUIFhfSURzCisKKy8vICAgICAgICBwcmludGsoICJsb29waW5nIGZvciBTQ1NJIHhjaG5nIElEOiBpPSVkLCB0eXBlPSVYaFxuIiwgCisvLyAgICAgICAgIGksIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlKTsKKworICAgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgPT0gMCApIC8vICJmcmVlIj8KKyAgICAgICAgeworICAgICAgICAgIHVsU3RhdHVzID0gMDsgLy8gc3VjY2VzcyEKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiggaSA9PSBmY0NoaXAtPmZjU2VzdEV4Y2hhbmdlTFJVICkgLy8gd3JhcHBlZC1hcm91bmQgYXJyYXk/CisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoICJTRVNUIFhfSUQgc3BhY2UgZnVsbFxuIik7CisgICAgICAgICAgYnJlYWs7ICAgICAgIC8vIGZhaWxlZCAtIHByZXZlbnQgaW5mLiBsb29wCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZmNDaGlwLT5mY1Nlc3RFeGNoYW5nZUxSVSA9IGkgKyAxOyAvLyBuZXh0ISAocm9sbG92ZXIgY2hlY2sgbmV4dCBwYXNzKQorICB9CisKKyAgCisgIAorICBlbHNlICAvLyBMaW5rIFNlcnZpY2UgdHlwZSAtIFhfSURzIHNob3VsZCBiZSBmcm9tIFRBQ0hfU0VTVF9MRU4gCisgICAgICAgIC8vIHRvIFRBQ0hfTUFYX1hJRAorICB7CisgICAgaWYoIGZjQ2hpcC0+ZmNMc0V4Y2hhbmdlTFJVID49IFRBQ0hfTUFYX1hJRCB8fCAvLyByYW5nZSBjaGVjaworICAgICAgICBmY0NoaXAtPmZjTHNFeGNoYW5nZUxSVSA8IFRBQ0hfU0VTVF9MRU4gKSAvLyAoZS5nLiBzdGFydHVwKQorICAgICAgZmNDaGlwLT5mY0xzRXhjaGFuZ2VMUlUgPSBUQUNIX1NFU1RfTEVOOworCisgICAgaSA9IGZjQ2hpcC0+ZmNMc0V4Y2hhbmdlTFJVOyAvLyB0eXBpY2FsbHkgaXQncyBhbHJlYWR5IGZyZWUhCisgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlID09IDAgKSAvLyBjaGVjayBmb3IgImZyZWUiIGVsZW1lbnQKKyAgICB7CisgICAgICB1bFN0YXR1cyA9IDA7IC8vIHN1Y2Nlc3MhCisgICAgfQorICAgIAorICAgIGVsc2UKKyAgICB7ICAgICAgICAgLy8gWVVLISB3ZSBuZWVkIHRvIGRvIGEgbGluZWFyIHNlYXJjaCBmb3IgZnJlZSBlbGVtZW50CisgICAgICAgICAgICAgIC8vIEZyYWdtZW50YXRpb24gb2YgdGhlIGZjRXhjaGFuZ2UgYXJyYXkgaXMgZHVlIHRvIGV4Y2Vzc2l2ZWx5CisgICAgICAgICAgICAgIC8vIGxvbmcgY29tcGxldGlvbnMgb3IgdGltZW91dHMuCisgICAgICAKKyAgICAgIHdoaWxlKCBUUlVFICkKKyAgICAgIHsKKyAgICAgICAgaWYoICsraSA+PSBUQUNIX01BWF9YSUQgKSAvLyByb2xsb3ZlciBjaGVjaworICAgICAgICAgIGkgPSBUQUNIX1NFU1RfTEVOOy8vIGJlZ2lubmluZyBvZiBMaW5rIFNlcnZpY2UgWF9JRHMKKworLy8gICAgICAgIHByaW50ayggImxvb3BpbmcgZm9yIHhjaG5nIElEOiBpPSVkLCB0eXBlPSVYaFxuIiwgCisvLyAgICAgICAgIGksIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVtpXS50eXBlKTsKKworICAgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgPT0gMCApIC8vICJmcmVlIj8KKyAgICAgICAgeworICAgICAgICAgIHVsU3RhdHVzID0gMDsgLy8gc3VjY2VzcyEKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiggaSA9PSBmY0NoaXAtPmZjTHNFeGNoYW5nZUxSVSApIC8vIHdyYXBwZWQtYXJvdW5kIGFycmF5PworICAgICAgICB7CisgICAgICAgICAgcHJpbnRrKCAiTGlua1NlcnZpY2UgWF9JRCBzcGFjZSBmdWxsXG4iKTsKKyAgICAgICAgICBicmVhazsgICAgICAgLy8gZmFpbGVkIC0gcHJldmVudCBpbmYuIGxvb3AKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmY0NoaXAtPmZjTHNFeGNoYW5nZUxSVSA9IGkgKyAxOyAvLyBuZXh0ISAocm9sbG92ZXIgY2hlY2sgbmV4dCBwYXNzKQorCisgIH0KKworICBpZiggIXVsU3RhdHVzICkgIC8vIHN1Y2Nlc3M/CisgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlW2ldLnR5cGUgPSB0eXBlOyAvLyBhbGxvY2F0ZSBpdC4KKyAgCisgIGVsc2UKKyAgICBpID0gLTE7ICAvLyBlcnJvciAtIGFsbCBleGNoYW5nZXMgIm9wZW4iCisKKyAgcmV0dXJuIGk7ICAKK30KKworc3RhdGljIHZvaWQKK2NwcWZjX3BjaV91bm1hcF9leHRlbmRlZF9zZyhzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCVBUQUNIWU9OIGZjQ2hpcCwKKwlVTE9ORyB4X0lEKQoreworCS8vIFVubWFwcyB0aGUgbWVtb3J5IHJlZ2lvbnMgdXNlZCB0byBob2xkIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0cworCisJUFNHUEFHRVMgaTsKKworCS8vIFdlcmUgdGhlcmUgYW55IHN1Y2ggcmVnaW9ucyBuZWVkaW5nIHVubWFwcGluZz8KKwlpZiAoISBVU0VTX0VYVEVOREVEX1NHTElTVChmY0NoaXAtPlNFU1QsIHhfSUQpKQorCQlyZXR1cm47CS8vIE5vIHN1Y2ggcmVnaW9ucywgd2UncmUgb3V0dGEgaGVyZS4KKworCS8vIGZvciBlYWNoIGV4dGVuZGVkIHNjYXR0ZXIgZ2F0aGVyIHJlZ2lvbiBuZWVkaW5nIHVubWFwcGluZy4uLiAKKwlmb3IgKGk9ZmNDaGlwLT5TRVNULT5zZ1BhZ2VzW3hfSURdIDsgaSAhPSBOVUxMIDsgaSA9IGktPm5leHQpCisJCXBjaV91bm1hcF9zaW5nbGUocGNpZGV2LCBpLT5idXNhZGRyLCBpLT5tYXBsZW4sCisJCQlzY3NpX3RvX3BjaV9kbWFfZGlyKFBDSV9ETUFfVE9ERVZJQ0UpKTsKK30KKworLy8gQ2FsbGVkIGFsc28gZnJvbSBjcHFmY1RTY29udHJvbC5vLCBzbyBjYW4ndCBiZSBzdGF0aWMKK3ZvaWQKK2NwcWZjX3BjaV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCAKKwlTY3NpX0NtbmQgKmNtZCwgCisJUFRBQ0hZT04gZmNDaGlwLCAKKwlVTE9ORyB4X0lEKQoreworCS8vIFVuZG8gdGhlIERNQSBtYXBwaW5ncworCWlmIChjbWQtPnVzZV9zZykgewkvLyBVc2VkIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgZm9yIGRhdGEgYnVmZmVyPworCQljcHFmY19wY2lfdW5tYXBfZXh0ZW5kZWRfc2cocGNpZGV2LCBmY0NoaXAsIHhfSUQpOworCQlwY2lfdW5tYXBfc2cocGNpZGV2LCBjbWQtPmJ1ZmZlciwgY21kLT51c2Vfc2csCisJCQlzY3NpX3RvX3BjaV9kbWFfZGlyKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJLy8gcHJpbnRrKCJ1bXNnICVkXG4iLCBjbWQtPnVzZV9zZyk7CisJfQorCWVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCS8vIHByaW50aygidW1zICVwICIsIGZjQ2hpcC0+U0VTVC0+dVsgeF9JRCBdLklXRS5HQWRkcjEpOworCQlwY2lfdW5tYXBfc2luZ2xlKHBjaWRldiwgZmNDaGlwLT5TRVNULT51WyB4X0lEIF0uSVdFLkdBZGRyMSwKKwkJCWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJc2NzaV90b19wY2lfZG1hX2RpcihjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJfQkgCit9CisKKy8vIFdlIGNhbGwgdGhpcyByb3V0aW5lIHRvIGZyZWUgYW4gRXhjaGFuZ2UgZm9yIGFueSByZWFzb246CisvLyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBjb21wbGV0ZWQgd2l0aCBlcnJvciwgYWJvcnRlZCwgZXRjLgorCisvLyByZXR1cm5zIEZBTFNFIGlmIEV4Y2hhbmdlIGZhaWxlZCBhbmQgInJldHJ5IiBpcyBhY2NlcHRhYmxlCisvLyByZXR1cm5zIFRSVUUgaWYgRXhjaGFuZ2Ugd2FzIHN1Y2Nlc3NmdWwsIG9yIHJldHJ5IGlzIGltcG9zc2libGUKKy8vIChlLmcuIHBvcnQvZGV2aWNlIGdvbmUpLgorLy9zY29tcGxldGVleGNoYW5nZQorCit2b2lkIGNwcWZjVFNDb21wbGV0ZUV4Y2hhbmdlKCAKKyAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorICAgICAgIFBUQUNIWU9OIGZjQ2hpcCwgCisgICAgICAgVUxPTkcgeF9JRCkKK3sKKyAgRkNfRVhDSEFOR0VTICpFeGNoYW5nZXMgPSBmY0NoaXAtPkV4Y2hhbmdlczsKKyAgaW50IGFscmVhZHlfdW5tYXBwZWQgPSAwOworICAKKyAgaWYoIHhfSUQgPCBUQUNIX1NFU1RfTEVOICkgLy8gU0VTVC1iYXNlZCAob3IgTGlua1NlcnYgZm9yIEZDUCBleGNoYW5nZSkKKyAgeworICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kID09IE5VTEwgKSAvLyB3aGF0I0AhCisgICAgeworLy8gICAgICBUcmlnZ2VySEJBKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDApOworICAgICAgcHJpbnRrKCIgeF9JRCAlWGgsIHR5cGUgJVhoLCBOVUxMIHB0ciFcbiIsIHhfSUQsCisJCQlFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS50eXBlKTsKKworICAgICAgZ290byBDbGVhblVwU2VzdFJlc291cmNlczsgIC8vIHRoaXMgcGF0aCBzaG91bGQgYmUgdmVyeSByYXJlLgorICAgIH0KKworICAgIC8vIHdlIGhhdmUgTGludXggU2NzaSBDbW5kIHB0ci4uLiwgbm93IGNoZWNrIG91ciBFeGNoYW5nZSBzdGF0dXMKKyAgICAvLyB0byBkZWNpZGUgaG93IHRvIGNvbXBsZXRlIHRoaXMgU0VTVCBGQ1AgZXhjaGFuZ2UKKworICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgKSAvLyBwZXJoYXBzIGEgVGFjaCBpbmRpY2F0ZWQgcHJvYmxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGFibm9ybWFsIGV4Y2hhbmdlIGNvbXBsZXRpb24KKyAgICB7CisgICAgICAvLyBzZXQgRkNQIExpbmsgc3RhdGlzdGljcworICAgICAKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgJiBGQzJfVElNRU9VVCkKKyAgICAgICAgZmNDaGlwLT5mY1N0YXRzLnRpbWVvdXRzKys7CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgSU5JVElBVE9SX0FCT1JUKQorICAgICAgICBmY0NoaXAtPmZjU3RhdHMuRkM0YWJvcnRlZCsrOworICAgICAgaWYoIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIENPVU5UX0VSUk9SKQorICAgICAgICBmY0NoaXAtPmZjU3RhdHMuQ250RXJyb3JzKys7CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgTElOS0ZBSUxfVFgpCisgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5saW5rRmFpbFRYKys7CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgTElOS0ZBSUxfUlgpCisgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5saW5rRmFpbFJYKys7CisgICAgICBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgT1ZFUkZMT1cpCisgICAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5DbnRFcnJvcnMrKzsKKworICAgICAgLy8gRmlyc3QsIHNlZSBpZiB0aGUgU2NzaSB1cHBlciBsZXZlbCBpbml0aWF0ZWQgYW4gQUJPUlQgb24gdGhpcworICAgICAgLy8gZXhjaGFuZ2UuLi4KKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgPT0gSU5JVElBVE9SX0FCT1JUICkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRrKCIgRElEX0FCT1JULCB4X0lEICVYaCwgQ21uZCAlcCAiLCAKKyAgICAgICAgICAgIHhfSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOworICAgICAgICBnb3RvIENsZWFuVXBTZXN0UmVzb3VyY2VzOyAgLy8gKHdlIGRvbid0IGV4cGVjdCBMaW51eCBfYWJvcnRzKQorICAgICAgfQorCisgICAgICAvLyBEaWQgb3VyIGRyaXZlciB0aW1lb3V0IHRoZSBFeGNoYW5nZSwgb3IgZGlkIFRhY2h5b24gaW5kaWNhdGUKKyAgICAgIC8vIGEgZmFpbHVyZSBkdXJpbmcgdHJhbnNtaXNzaW9uPyAgQXNrIGZvciByZXRyeSB3aXRoICJTT0ZUX0VSUk9SIgorICAgICAgZWxzZSBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgRkMyX1RJTUVPVVQpIAorICAgICAgeworLy8gICAgICAgIHByaW50aygicmVzdWx0IERJRF9TT0ZUX0VSUk9SLCB4X0lEICVYaCwgQ21uZCAlcFxuIiwgCisvLyAgICAgICAgICAgIHhfSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgPSAoRElEX1NPRlRfRVJST1IgPDwxNik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIERpZCBmcmFtZShzKSBmb3IgYW4gb3BlbiBleGNoYW5nZSBhcnJpdmUgaW4gdGhlIFNGUSwKKyAgICAgIC8vIG1lYW5pbmcgdGhlIFNFU1Qgd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZW0/CisgICAgICBlbHNlIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgJiBTRlFfRlJBTUUpIAorICAgICAgeworLy8gICAgICAgIHByaW50aygicmVzdWx0IERJRF9TT0ZUX0VSUk9SLCB4X0lEICVYaCwgQ21uZCAlcFxuIiwgCisvLyAgICAgICAgICAgIHhfSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgPSAoRElEX1NPRlRfRVJST1IgPDwxNik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIERpZCBvdXIgZHJpdmVyIHRpbWVvdXQgdGhlIEV4Y2hhbmdlLCBvciBkaWQgVGFjaHlvbiBpbmRpY2F0ZQorICAgICAgLy8gYSBmYWlsdXJlIGR1cmluZyB0cmFuc21pc3Npb24/ICBBc2sgZm9yIHJldHJ5IHdpdGggIlNPRlRfRVJST1IiCisgICAgICBlbHNlIGlmKCAKKyAgICAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgJiBMSU5LRkFJTF9UWCkgfHwKKyAgICAgICAgICAgICAgIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXMgJiBQT1JUSURfQ0hBTkdFRCkgfHwKKwkgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyAmIEZSQU1FX1RPKSAgICB8fAorCSAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgSU5WX0VOVFJZKSAgICB8fAorCSAgICAgICAoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgQUJPUlRTRVFfTk9USUZZKSAgICApCisKKworICAgICAgeworLy8gICAgICAgIHByaW50aygicmVzdWx0IERJRF9TT0ZUX0VSUk9SLCB4X0lEICVYaCwgQ21uZCAlcFxuIiwgCisvLyAgICAgICAgICAgIHhfSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgPSAoRElEX1NPRlRfRVJST1IgPDwxNik7CisKKworICAgICAgfQorCisgICAgICAvLyBlLmcuLCBhIExPR091dCBoYXBwZW5lZCwgb3IgZGV2aWNlIG5ldmVyIGxvZ2dlZCBiYWNrIGluLgorICAgICAgZWxzZSBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzICYgREVWSUNFX1JFTU9WRUQpIAorICAgICAgeworLy8JcHJpbnRrKCIgKkxPR091dCBvciB0aW1lb3V0IG9uIGxvZ2luISogIik7CisJLy8gdHJpZ2dlcj8KKy8vICAgICAgICBUcmlnZ2VySEJBKCBmY0NoaXAtPlJlZ2lzdGVycy5SZU1hcE1lbUJhc2UsIDApOworCisgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PDE2KTsKKyAgICAgIH0gICAgICAKKwkJCisJCSAgICAgIAorICAgICAgLy8gRGlkIFRhY2h5b24gaW5kaWNhdGUgYSBDTlQgZXJyb3I/ICBXZSBuZWVkIGZ1cnRoZXIgYW5hbHlzaXMKKyAgICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGUgZXhjaGFuZ2UgaXMgYWNjZXB0YWJsZQorICAgICAgZWxzZSBpZiggRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzID09IENPVU5UX0VSUk9SKQorICAgICAgeworICAgICAgICBVQ0hBUiBTY3NpU3RhdHVzOworICAgICAgICBGQ1BfU1RBVFVTX1JFU1BPTlNFICpwRmNwU3RhdHVzID0gCisJICAoUEZDUF9TVEFUVVNfUkVTUE9OU0UpJmZjQ2hpcC0+U0VTVC0+UnNwSERSWyB4X0lEIF0ucGw7CisKKyAgICAgIAlTY3NpU3RhdHVzID0gcEZjcFN0YXR1cy0+ZmNwX3N0YXR1cyA+PjI0OworICAKKwkvLyBJZiB0aGUgY29tbWFuZCBpcyBhIFNDU0kgUmVhZC9Xcml0ZSB0eXBlLCB3ZSBkb24ndCB0b2xlcmF0ZQorCS8vIGNvdW50IGVycm9ycyBvZiBhbnkga2luZDsgYXNzdW1lIHRoZSBjb3VudCBlcnJvciBpcyBkdWUgdG8KKwkvLyBhIGRyb3BwZWQgZnJhbWUgYW5kIGFzayBmb3IgcmV0cnkuLi4KKwkKKwlpZigoIChFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5jbW5kWzBdID09IDB4OCkgfHwKKwkgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQtPmNtbmRbMF0gPT0gMHgyOCkgfHwJCQorICAgICAgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQtPmNtbmRbMF0gPT0gMHhBKSB8fAorICAgICAgICAgICAgKEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQtPmNtbmRbMF0gPT0gMHgyQSkgKQorCSAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICAgU2NzaVN0YXR1cyA9PSAwICkKKwl7CisgICAgICAgICAgLy8gYXNrIGZvciByZXRyeQorLyogICAgICAgICAgcHJpbnRrKCJDT1VOVF9FUlJPUiByZXRyeSwgeF9JRCAlWGgsIHN0YXR1cyAlWGgsIENtbmQgJXBcbiIsIAorICAgICAgICAgICAgeF9JRCwgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uc3RhdHVzLAorICAgICAgICAgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZCk7Ki8KKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgPSAoRElEX1NPRlRfRVJST1IgPDwxNik7CisJfQorCQorCWVsc2UgIC8vIG5lZWQgbW9yZSBhbmFseXNpcworCXsKKwkgIGNwcWZjVFNDaGVja2FuZFNub29wRkNQKGZjQ2hpcCwgeF9JRCk7ICAvLyAod2lsbCBzZXQgLT5yZXN1bHQpCisJfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBkZWZhdWx0OiBOT1RFISBXZSBkb24ndCBldmVyIHdhbnQgdG8gZ2V0IGhlcmUuICBHZXR0aW5nIGhlcmUKKyAgICAgIC8vIGltcGxpZXMgc29tZXRoaW5nIG5ldyBpcyBoYXBwZW5pbmcgdGhhdCB3ZSd2ZSBuZXZlciBoYWQgYSB0ZXN0CisgICAgICAvLyBjYXNlIGZvci4gIE5lZWQgY29kZSBtYWludGVuYW5jZSEgIFJldHVybiAiRVJST1IiCisgICAgICBlbHNlCisgICAgICB7CisJdW5zaWduZWQgaW50IHN0YXQgPSBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5zdGF0dXM7CisgICAgICAgIHByaW50aygiREVGQVVMVCByZXN1bHQgJVhoLCB4X0lEICVYaCwgQ21uZCAlcCIsIAorICAgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cywgeF9JRCwgCisJICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kKTsKKworCWlmIChzdGF0ICYgSU5WQUxJRF9BUkdTKQlwcmludGsoIiBJTlZBTElEX0FSR1MgIik7CisJaWYgKHN0YXQgJiBMTktEV05fT1NMUykJCXByaW50aygiIExOS0RXTl9PU0xTICIpOworCWlmIChzdGF0ICYgTE5LRFdOX0xBU0VSKQlwcmludGsoIiBMTktEV05fTEFTRVIgIik7CisJaWYgKHN0YXQgJiBPVVRRVUVfRlVMTCkJCXByaW50aygiIE9VVFFVRV9GVUxMICIpOworCWlmIChzdGF0ICYgRFJJVkVSUV9GVUxMKQlwcmludGsoIiBEUklWRVJRX0ZVTEwgIik7CisJaWYgKHN0YXQgJiBTRVNUX0ZVTEwpCQlwcmludGsoIiBTRVNUX0ZVTEwgIik7CisJaWYgKHN0YXQgJiBCQURfQUxQQSkJCXByaW50aygiIEJBRF9BTFBBICIpOworCWlmIChzdGF0ICYgT1ZFUkZMT1cpCQlwcmludGsoIiBPVkVSRkxPVyAiKTsKKwlpZiAoc3RhdCAmIENPVU5UX0VSUk9SKQkJcHJpbnRrKCIgQ09VTlRfRVJST1IgIik7CisJaWYgKHN0YXQgJiBMSU5LRkFJTF9SWCkJCXByaW50aygiIExJTktGQUlMX1JYICIpOworCWlmIChzdGF0ICYgQUJPUlRTRVFfTk9USUZZKQlwcmludGsoIiBBQk9SVFNFUV9OT1RJRlkgIik7CisJaWYgKHN0YXQgJiBMSU5LRkFJTF9UWCkJCXByaW50aygiIExJTktGQUlMX1RYICIpOworCWlmIChzdGF0ICYgSE9TVFBST0dfRVJSKQlwcmludGsoIiBIT1NUUFJPR19FUlIgIik7CisJaWYgKHN0YXQgJiBGUkFNRV9UTykJCXByaW50aygiIEZSQU1FX1RPICIpOworCWlmIChzdGF0ICYgSU5WX0VOVFJZKQkJcHJpbnRrKCIgSU5WX0VOVFJZICIpOworCWlmIChzdGF0ICYgU0VTVFBST0dfRVJSKQlwcmludGsoIiBTRVNUUFJPR19FUlIgIik7CisJaWYgKHN0YXQgJiBPVVRCT1VORF9USU1FT1VUKQlwcmludGsoIiBPVVRCT1VORF9USU1FT1VUICIpOworCWlmIChzdGF0ICYgSU5JVElBVE9SX0FCT1JUKQlwcmludGsoIiBJTklUSUFUT1JfQUJPUlQgIik7CisJaWYgKHN0YXQgJiBNRU1QT09MX0ZBSUwpCXByaW50aygiIE1FTVBPT0xfRkFJTCAiKTsKKwlpZiAoc3RhdCAmIEZDMl9USU1FT1VUKQkJcHJpbnRrKCIgRkMyX1RJTUVPVVQgIik7CisJaWYgKHN0YXQgJiBUQVJHRVRfQUJPUlQpCXByaW50aygiIFRBUkdFVF9BQk9SVCAiKTsKKwlpZiAoc3RhdCAmIEVYQ0hBTkdFX1FVRVVFRCkJcHJpbnRrKCIgRVhDSEFOR0VfUVVFVUVEICIpOworCWlmIChzdGF0ICYgUE9SVElEX0NIQU5HRUQpCXByaW50aygiIFBPUlRJRF9DSEFOR0VEICIpOworCWlmIChzdGF0ICYgREVWSUNFX1JFTU9WRUQpCXByaW50aygiIERFVklDRV9SRU1PVkVEICIpOworCWlmIChzdGF0ICYgU0ZRX0ZSQU1FKQkJcHJpbnRrKCIgU0ZRX0ZSQU1FICIpOworCXByaW50aygiXG4iKTsKKworICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8MTYpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgIC8vIGRlZmluaXRlbHkgbm8gVGFjaCBwcm9ibGVtLCBidXQgcGVyaGFwcyBhbiBGQ1AgcHJvYmxlbQorICAgIHsKKyAgICAgIC8vIHNldCBGQ1AgTGluayBzdGF0aXN0aWMKKyAgICAgIGZjQ2hpcC0+ZmNTdGF0cy5vaysrOworICAgICAgY3BxZmNUU0NoZWNrYW5kU25vb3BGQ1AoIGZjQ2hpcCwgeF9JRCk7ICAvLyAod2lsbCBzZXQgLT5yZXN1bHQpICAgIAorICAgIH0KKworICAgIGNwcWZjX3BjaV91bm1hcChwY2lkZXYsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5DbW5kLCAKKwkJCWZjQ2hpcCwgeF9JRCk7IC8vIHVuZG8gRE1BIG1hcHBpbmdzLgorICAgIGFscmVhZHlfdW5tYXBwZWQgPSAxOworCisgICAgLy8gT0ssIHdlJ3ZlIHNldCB0aGUgU2NzaSAiLT5yZXN1bHQiIGZpZWxkLCBzbyBwcm9jZWVkIHdpdGggY2FsbGluZworICAgIC8vIExpbnV4IFNjc2kgImRvbmUiIChpZiBub3QgTlVMTCksIGFuZCBmcmVlIGFueSBrZXJuZWwgbWVtb3J5IHdlCisgICAgLy8gbWF5IGhhdmUgYWxsb2NhdGVkIGZvciB0aGUgZXhjaGFuZ2UuCisKKyAgUENJX1RSQUNFTyggKFVMT05HKUV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVt4X0lEXS5DbW5kLCAweEFDKTsKKyAgICAvLyBjb21wbGV0ZSB0aGUgY29tbWFuZCBiYWNrIHRvIHVwcGVyIFNjc2kgZHJpdmVycworICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5zY3NpX2RvbmUgIT0gTlVMTCkKKyAgICB7CisgICAgICAvLyBDYWxsaW5nICJkb25lIiBvbiBhbiBMaW51eCBfYWJvcnQoKSBhYm9ydGVkCisgICAgICAvLyBDbW5kIGNhdXNlcyBhIGtlcm5lbCBwYW5pYyB0cnlpbmcgdG8gcmUtZnJlZSBtZW0uCisgICAgICAvLyBBY3R1YWxseSwgd2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nIHdpdGggYW4gX2Fib3J0IENNTkQKKyAgICAgIGlmKCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5yZXN1bHQgIT0gKERJRF9BQk9SVDw8MTYpICkKKyAgICAgIHsKKyAgICAgICAgUENJX1RSQUNFKDB4QUMpCisJY2FsbF9zY3NpX2RvbmUoRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisvLwlwcmludGsoIiBub3QgY2FsbGluZyBzY3NpX2RvbmUgb24geF9JRCAlWGgsIENtbmQgJXBcbiIsCisvLwkJCXhfSUQsIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLkNtbmQpOworICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgcHJpbnRrKCIgeF9JRCAlWGgsIHR5cGUgJVhoLCBDZGIwICVYaFxuIiwgeF9JRCwKKwlFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS50eXBlLCAKKwlFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSUQgXS5DbW5kLT5jbW5kWzBdKTsJICAgICAgCisgICAgICBwcmludGsoIiBjcHFmY1RTOiBOdWxsIHNjc2lfZG9uZSBmdW5jdGlvbiBwb2ludGVyIVxuIik7CisgICAgfQorCisKKyAgICAvLyBOb3csIGNsZWFuIHVwIG5vbi1TY3NpX0NtbmQgaXRlbXMuLi4KK0NsZWFuVXBTZXN0UmVzb3VyY2VzOgorICAgCisgICAgaWYgKCFhbHJlYWR5X3VubWFwcGVkKSAKKwljcHFmY19wY2lfdW5tYXAocGNpZGV2LCBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbeF9JRF0uQ21uZCwgCisJCQlmY0NoaXAsIHhfSUQpOyAvLyB1bmRvIERNQSBtYXBwaW5ncy4KKworICAgIC8vIFdhcyBhbiBFeHRlbmRlZCBTY2F0dGVyL0dhdGhlciBwYWdlIGFsbG9jYXRlZD8gIFdlIGtub3cKKyAgICAvLyB0aGlzIGJ5IGNoZWNraW5nIERXT1JEIDQsIGJpdCAzMSAoIkxPQyIpIG9mIFNFU1QgZW50cnkKKyAgICBpZiggIShmY0NoaXAtPlNFU1QtPnVbIHhfSUQgXS5JV0UuQnVmZl9PZmYgJiAweDgwMDAwMDAwKSkKKyAgICB7CisgICAgICBQU0dQQUdFUyBwLCBuZXh0OworCisgICAgICAvLyBleHRlbmRlZCBTL0cgbGlzdCB3YXMgdXNlZCAtLSBGcmVlIHRoZSBhbGxvY2F0ZWQgZXh0LiBTL0cgcGFnZXMKKyAgICAgIGZvciAocCA9IGZjQ2hpcC0+U0VTVC0+c2dQYWdlc1t4X0lEXTsgcCAhPSBOVUxMOyBwID0gbmV4dCkgeworCSBuZXh0ID0gcC0+bmV4dDsKKwkga2ZyZWUocCk7CisgICAgICB9CisgICAgICBmY0NoaXAtPlNFU1QtPnNnUGFnZXNbeF9JRF0gPSBOVUxMOworICAgIH0KKyAgCisgICAgRXhjaGFuZ2VzLT5mY0V4Y2hhbmdlWyB4X0lEIF0uQ21uZCA9IE5VTEw7IAorICB9ICAvLyBEb25lIHdpdGggRkNQIChTRVNUKSBleGNoYW5nZXMKKworCisgIC8vIHRoZSByZW1haW5pbmcgbG9naWMgaXMgY29tbW9uIHRvIEFMTCBFeGNoYW5nZXM6IAorICAvLyBGQ1AoU0VTVCkgYW5kIExpbmtTZXJ2LgorCisgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnR5cGUgPSAwOyAvLyB0aGVyZSAtLSBGUkVFISAgCisgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRCBdLnN0YXR1cyA9IDA7IAorCisgIFBDSV9UUkFDRU8oIHhfSUQsIDB4QUMpCisgICAgIAorICAKKyAgcmV0dXJuOworfSAgIC8vIChFTkQgb2YgQ29tcGxldGVFeGNoYW5nZSBmdW5jdGlvbikKKyAKKworCisKKy8vIFVuZm9ydHVuYXRlbHksIHdlIG11c3Qgc25vb3AgYWxsIGNvbW1hbmQgY29tcGxldGlvbnMgaW4KKy8vIG9yZGVyIHRvIG1hbmlwdWxhdGUgY2VydGFpbiByZXR1cm4gZmllbGRzLCBhbmQgdGFrZSBub3RlIG9mCisvLyBkZXZpY2UgdHlwZXMsIGV0Yy4sIHRvIGZhY2lsaXRhdGUgdGhlIEZpYnJlLUNoYW5uZWwgdG8gU0NTSQorLy8gIm1hcHBpbmciLiAgCisvLyAoV2F0Y2ggZm9yIEJJRyBFbmRpYW4gY29uZnVzaW9uIG9uIHNvbWUgcGF5bG9hZCBmaWVsZHMpCit2b2lkIGNwcWZjVFNDaGVja2FuZFNub29wRkNQKCBQVEFDSFlPTiBmY0NoaXAsIFVMT05HIHhfSUQpCit7CisgIEZDX0VYQ0hBTkdFUyAqRXhjaGFuZ2VzID0gZmNDaGlwLT5FeGNoYW5nZXM7CisgIFNjc2lfQ21uZCAqQ21uZCA9IEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uQ21uZDsKKyAgRkNQX1NUQVRVU19SRVNQT05TRSAqcEZjcFN0YXR1cyA9IAorICAgIChQRkNQX1NUQVRVU19SRVNQT05TRSkmZmNDaGlwLT5TRVNULT5Sc3BIRFJbIHhfSUQgXS5wbDsKKyAgVUNIQVIgU2NzaVN0YXR1czsKKworICBTY3NpU3RhdHVzID0gcEZjcFN0YXR1cy0+ZmNwX3N0YXR1cyA+PjI0OworCisjaWZkZWYgRkNQX0NPTVBMRVRJT05fREJHCisgIHByaW50aygiU2NzaVN0YXR1cyA9IDB4JVhcbiIsIFNjc2lTdGF0dXMpOworI2VuZGlmCQorCisgIC8vIEZpcnN0LCBjaGVjayBGQ1Agc3RhdHVzCisgIGlmKCBwRmNwU3RhdHVzLT5mY3Bfc3RhdHVzICYgRkNQX1JTUF9MRU5fVkFMSUQgKQorICB7CisgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZSAoUlNQX0NPREUpIC0tIG1vc3QgcG9wdWxhciBpcyBiYWQgbGVuCisgICAgLy8gMXN0IDQgYnl0ZXMgb2YgcnNwIGluZm8gLS0gb25seSBieXRlIDMgaW50ZXJlc3RpbmcKKyAgICBpZiggcEZjcFN0YXR1cy0+ZmNwX3JzcF9pbmZvICYgRkNQX0RBVEFfTEVOX05PVF9CVVJTVF9MRU4gKQorICAgIHsgCisKKyAgICAgIC8vIGRvIHdlIEVWRVIgZ2V0IGhlcmU/CisgICAgICBwcmludGsoImNwcWZjVFM6IEZDUCBkYXRhIGxlbiBub3QgYnVyc3QgbGVuLCB4X0lEICVYaFxuIiwgeF9JRCk7CisgICAgfQorICB9CisKKyAgLy8gZm9yIG5vdywgZ28gYnkgdGhlIFNjc2lTdGF0dXMsIGFuZCBtYW5pcHVsYXRlIGNlcnRhaW4KKyAgLy8gY29tbWFuZHMgd2hlbiBuZWNlc3NhcnkuLi4KKyAgaWYoIFNjc2lTdGF0dXMgPT0gMCkgLy8gU0NTSSBzdGF0dXMgYnl0ZSAiZ29vZCI/CisgIHsKKyAgICBDbW5kLT5yZXN1bHQgPSAwOyAvLyBldmVyeXRoaW5nJ3MgT0sKKworICAgIGlmKCAoQ21uZC0+Y21uZFswXSA9PSBJTlFVSVJZKSkgCisgICAgeworICAgICAgVUNIQVIgKklucXVpcnlEYXRhID0gQ21uZC0+cmVxdWVzdF9idWZmZXI7CisgICAgICBQRkNfTE9HR0VESU5fUE9SVCBwTG9nZ2VkSW5Qb3J0OworCisgICAgICAvLyBXZSBuZWVkIHRvIG1hbmlwdWxhdGUgSU5RVUlSWQorICAgICAgLy8gc3RyaW5ncyBmb3IgQ09NUEFRIFJBSUQgY29udHJvbGxlcnMgdG8gZm9yY2UKKyAgICAgIC8vIExpbnV4IHRvIHNjYW4gYWRkaXRpb25hbCBMVU5zLiAgTmFtZWx5LCBzZXQKKyAgICAgIC8vIHRoZSBJbnF1aXJ5IHN0cmluZyBieXRlIDIgKEFOU0ktYXBwcm92ZWQgdmVyc2lvbikKKyAgICAgIC8vIHRvIDIuCisKKyAgICAgIGlmKCAhbWVtY21wKCAmSW5xdWlyeURhdGFbOF0sICJDT01QQVEiLCA2ICkpCisgICAgICB7CisgICAgICAgIElucXVpcnlEYXRhWzJdID0gMHgyOyAgLy8gY2xhaW0gU0NTSS0yIGNvbXBsaWFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbXVsdGlwbGUgTFVOcyBtYXkgYmUgc2Nhbm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobm8gU0NTSS0yIHByb2JsZW1zIGtub3duIGluIENQUSkKKyAgICAgIH0KKyAgICAgICAgCisgICAgICAvLyBzbm9vcCB0aGUgSW5xdWlyeSB0byBkZXRlY3QgRGlzaywgVGFwZSwgZXRjLiB0eXBlCisgICAgICAvLyAoc2VhcmNoIGxpbmtlZCBsaXN0IGZvciB0aGUgcG9ydF9pZCB3ZSBzZW50IElOUVVJUlkgdG8pCisgICAgICBwTG9nZ2VkSW5Qb3J0ID0gZmNGaW5kTG9nZ2VkSW5Qb3J0KCBmY0NoaXAsCisgICAgICAgIE5VTEwsICAgICAvLyBET04nVCBzZWFyY2ggU2NzaSBOZXh1cyAod2Ugd2lsbCBzZXQgaXQpCisgICAgICAgIEV4Y2hhbmdlcy0+ZmNFeGNoYW5nZVsgeF9JRF0uZmNocy5kX2lkICYgMHhGRkZGRkYsICAgICAgICAKKyAgICAgICAgTlVMTCwgICAgIC8vIERPTidUIHNlYXJjaCBsaW5rZWQgbGlzdCBmb3IgRkMgV1dOCisgICAgICAgIE5VTEwpOyAgICAvLyBET04nVCBjYXJlIGFib3V0IGVuZCBvZiBsaXN0CisgCisgICAgICBpZiggcExvZ2dlZEluUG9ydCApCisgICAgICB7CisgICAgICAgIHBMb2dnZWRJblBvcnQtPlNjc2lOZXh1cy5JbnFEZXZpY2VUeXBlID0gSW5xdWlyeURhdGFbMF07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJcHJpbnRrKCJjcHFmY1RTOiBjYW4ndCBmaW5kIExvZ2dlZEluIEZDIHBvcnQgJTA2WCBmb3IgSU5RVUlSWVxuIiwKKyAgICAgICAgICBFeGNoYW5nZXMtPmZjRXhjaGFuZ2VbIHhfSURdLmZjaHMuZF9pZCAmIDB4RkZGRkZGKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8vIFNjc2kgU3RhdHVzIG5vdCBnb29kIC0tIHBhc3MgaXQgYmFjayB0byBjYWxsZXIgCisKKyAgZWxzZQorICB7CisgICAgQ21uZC0+cmVzdWx0ID0gU2NzaVN0YXR1czsgLy8gU0NTSSBzdGF0dXMgYnl0ZSBpcyAxc3QKKyAgICAKKyAgICAvLyBjaGVjayBmb3IgdmFsaWQgInNlbnNlIiBkYXRhCisKKyAgICBpZiggcEZjcFN0YXR1cy0+ZmNwX3N0YXR1cyAmIEZDUF9TTlNfTEVOX1ZBTElEICkgCisgICAgeyAgICAgICAgICAgIC8vIGxpbWl0IFNjc2kgU2Vuc2UgZmllbGQgbGVuZ3RoIQorICAgICAgaW50IFNlbnNlTGVuID0gcEZjcFN0YXR1cy0+ZmNwX3Nuc19sZW4gPj4yNDsgLy8gKEJpZ0VuZGlhbikgbG93ZXIgYnl0ZQorICAgICAgCisgICAgICBTZW5zZUxlbiA9IFNlbnNlTGVuID4gc2l6ZW9mKCBDbW5kLT5zZW5zZV9idWZmZXIpID8gCisgICAgICAgIHNpemVvZiggQ21uZC0+c2Vuc2VfYnVmZmVyKSA6IFNlbnNlTGVuOworCSAgIAorCisjaWZkZWYgRkNQX0NPTVBMRVRJT05fREJHCSAgICAKKyAgICAgIHByaW50aygiY29weSBzZW5zZV9idWZmZXIgJXAsIGxlbiAlZCwgcmVzdWx0ICVYaFxuIiwKKyAgICAgICAgQ21uZC0+c2Vuc2VfYnVmZmVyLCBTZW5zZUxlbiwgQ21uZC0+cmVzdWx0KTsKKyNlbmRpZgkgIAorCisgICAgICAvLyBOT1RFOiBUaGVyZSBpcyBzb21lIGRpc3B1dGUgb3ZlciB0aGUgRkNQIHJlc3BvbnNlCisgICAgICAvLyBmb3JtYXQuICBNb3N0IEZDIGRldmljZXMgYXNzdW1lIHRoYXQgRkNQX1JTUF9JTkZPCisgICAgICAvLyBpcyA4IGJ5dGVzIGxvbmcsIGluIHNwaXRlIG9mIHRoZSBmYWN0IHRoYXQgRkNQX1JTUF9MRU4KKyAgICAgIC8vIGlzICh2aXJ0dWFsbHkpIGFsd2F5cyAwIGFuZCB0aGUgZmllbGQgaXMgImludmFsaWQiLiAgCisgICAgICAvLyBTb21lIG90aGVyIGRldmljZXMgYXNzdW1lIHRoYXQKKyAgICAgIC8vIHRoZSBGQ1BfU05TX0lORk8gYmVnaW5zIGFmdGVyIEZDUF9SU1BfTEVOIGJ5dGVzIChpLmUuIDApCisgICAgICAvLyB3aGVuIHRoZSBGQ1BfUlNQIGlzIGludmFsaWQgKHRoaXMgYWxtb3N0IGFwcGVhcnMgdG8gYmUKKyAgICAgIC8vIG9uZSBvZiB0aG9zZSAicmVsaWdpb3VzIiBpc3N1ZXMpLgorICAgICAgLy8gQ29uc2VxdWVudGx5LCB3ZSB0ZXN0IHRoZSB1c3VhbCBwb3NpdGlvbiBvZiBGQ1BfU05TX0lORk8KKyAgICAgIC8vIGZvciA3WGgsIHNpbmNlIHRoZSBTQ1NJIHNlbnNlIGZvcm1hdCBzYXlzIHRoZSBmaXJzdAorICAgICAgLy8gYnl0ZSAoImVycm9yIGNvZGUiKSBzaG91bGQgYmUgMHg3MCBvciAweDcxLiAgSW4gcHJhY3RpY2UsCisgICAgICAvLyB3ZSBmaW5kIHRoYXQgZXZlcnkgZGV2aWNlIGRvZXMgaW4gZmFjdCBoYXZlIDB4NzAgb3IgMHg3MQorICAgICAgLy8gaW4gdGhlIGZpcnN0IGJ5dGUgcG9zaXRpb24sIHNvIHRoaXMgdGVzdCB3b3JrcyBmb3IgYWxsCisgICAgICAvLyBGQyBkZXZpY2VzLiAgCisgICAgICAvLyAoVGhpcyBsb2dpYyBpcyBlc3BlY2lhbGx5IGVmZmVjdGl2ZSBmb3IgdGhlIENQUS9ERUMgSFNHODAKKyAgICAgIC8vICYgSFNHNjAgY29udHJvbGxlcnMpLgorCisgICAgICBpZiggKHBGY3BTdGF0dXMtPmZjcF9zbnNfaW5mb1swXSAmIDB4NzApID09IDB4NzAgKQorICAgICAgICBtZW1jcHkoIENtbmQtPnNlbnNlX2J1ZmZlciwgCisgICAgICAgICAgJnBGY3BTdGF0dXMtPmZjcF9zbnNfaW5mb1swXSwgU2Vuc2VMZW4pOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpzYlB0ciA9IAorCQkodW5zaWduZWQgY2hhciAqKSZwRmNwU3RhdHVzLT5mY3Bfc25zX2luZm9bMF07CisgICAgICAgIHNiUHRyIC09IDg7ICAvLyBiYWNrIHVwIDggYnl0ZXMgaG9waW5nIHRvIGZpbmQgdGhlCisJICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIHRoZSBzZW5zZSBidWZmZXIKKyAgICAgICAgbWVtY3B5KCBDbW5kLT5zZW5zZV9idWZmZXIsIHNiUHRyLCBTZW5zZUxlbik7CisgICAgICB9CisKKyAgICAgIC8vIGluIHRoZSBzcGVjaWFsIGNhc2Ugb2YgRGV2aWNlIFJlc2V0LCB0ZWxsIHVwcGVyIGxheWVyCisgICAgICAvLyB0byBpbW1lZGlhdGVseSByZXRyeSAod2l0aCBTT0ZUX0VSUk9SIHN0YXR1cykKKyAgICAgIC8vIGxvb2sgZm9yIFNlbnNlIEtleSBVbml0IEF0dGVudGlvbiAoMHg2KSB3aXRoIEFTQyBEZXZpY2UKKyAgICAgIC8vIFJlc2V0ICgweDI5KQorICAgICAgLy8JICAgIHByaW50aygiU2Vuc2VMZW4gJWQsIEtleSA9IDB4JVgsIEFTQyA9IDB4JVhcbiIsCisgICAgICAvLwkJICAgIFNlbnNlTGVuLCBDbW5kLT5zZW5zZV9idWZmZXJbMl0sIAorICAgICAgLy8gICAgICAgICAgICAgICAgICAgQ21uZC0+c2Vuc2VfYnVmZmVyWzEyXSk7CisgICAgICBpZiggKChDbW5kLT5zZW5zZV9idWZmZXJbMl0gJiAweEYpID09IDB4NikgJiYKKwkgICAgICAgIChDbW5kLT5zZW5zZV9idWZmZXJbMTJdID09IDB4MjkpICkgLy8gU2Vuc2UgQ29kZSAicmVzZXQiCisgICAgICB7CisgICAgICAgIENtbmQtPnJlc3VsdCB8PSAoRElEX1NPRlRfRVJST1IgPDwgMTYpOyAvLyAiSG9zdCIgc3RhdHVzIGJ5dGUgM3JkCisgICAgICB9CisgCisgICAgICAvLyBjaGVjayBmb3IgU2Vuc2VLZXkgIkhBUkRXQVJFIEVSUk9SIiwgQVNDIEludGVybmFsVGFyZ2V0RmFpbHVyZQorICAgICAgZWxzZSBpZiggICgoQ21uZC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhGKSA9PSAweDQpICYmICAvLyAiaGFyZHdhcmUgZXJyb3IiCisgICAgICAJICAgICAgICAoQ21uZC0+c2Vuc2VfYnVmZmVyWzEyXSA9PSAweDQ0KSApIC8vIEFkZHRsLiBTZW5zZSBDb2RlIAorICAgICAgeworLy8gICAgICAgIHByaW50aygiSEFSRFdBUkVfRVJST1IsIENoYW5uZWwvVGFyZ2V0L0x1biAlZC8lZC8lZFxuIiwKKy8vCQlDbW5kLT5jaGFubmVsLCBDbW5kLT50YXJnZXQsIENtbmQtPmx1bik7CisgICAgICAJQ21uZC0+cmVzdWx0IHw9IChESURfRVJST1IgPDwgMTYpOyAvLyAiSG9zdCIgc3RhdHVzIGJ5dGUgM3JkCisgICAgICB9CisgICAgICAKKyAgICB9ICAvLyAoZW5kIG9mIHNlbnNlIGxlbiB2YWxpZCkKKworICAgIC8vIHRoZXJlIGlzIG5vIHNlbnNlIGRhdGEgdG8gaGVscCBvdXQgTGludXgncyBTY3NpIGxheWVycy4uLgorICAgIC8vIFdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBTY3NpIHN0YXR1cyBhbmQgaG9wZSBoZSB3aWxsICJkbyB0aGUgCisgICAgLy8gcmlnaHQgdGhpbmciCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGFzIGZhciBhcyB3ZSBrbm93LCB0aGUgU2NzaSBzdGF0dXMgaXMgc3VmZmljaWVudAorICAgICAgQ21uZC0+cmVzdWx0IHw9IChESURfT0sgPDwgMTYpOyAvLyAiSG9zdCIgc3RhdHVzIGJ5dGUgM3JkCisgICAgfQorICB9Cit9CisKKworCisvL1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAgIFBBWUxPQUQgIFBQUFBQUFBQUAorLy8gYnVpbGQgZGF0YSBQQVlMT0FEOyBTQ1NJIEZDUF9DTU5EIEkuVS4KKy8vIHJlbWVtYmVyIEJJRyBFTkRJQU4gcGF5bG9hZCAtIERXb3JkIHZhbHVlcyBtdXN0IGJlIGJ5dGUtcmV2ZXJzZWQKKy8vIChoZW5jZSB0aGUgYWZmaW5pdHkgZm9yIGJ5dGUgcG9pbnRlciBidWlsZGluZykuCisKK3N0YXRpYyBpbnQgYnVpbGRfRkNQX3BheWxvYWQoIFNjc2lfQ21uZCAqQ21uZCwgCisgICAgICBVQ0hBUiogcGF5bG9hZCwgVUxPTkcgdHlwZSwgVUxPTkcgZmNwX2RsICkKK3sKKyAgaW50IGk7CisKKyAgCisgIHN3aXRjaCggdHlwZSkKKyAgeworCQkgIAorICAgIGNhc2UgU0NTSV9JV0U6IAorICAgIGNhc2UgU0NTSV9JUkU6ICAgICAgICAKKyAgICAgIC8vIDggYnl0ZXMgRkNQX0xVTgorICAgICAgLy8gUGVyaXBoZXJhbCBEZXZpY2Ugb3IgVm9sdW1lIFNldCBhZGRyZXNzaW5nLCBhbmQgTFVOIG1hcHBpbmcKKyAgICAgIC8vIFdoZW4gdGhlIEZDIHBvcnQgd2FzIGxvb2tlZCB1cCwgd2UgY29waWVkIGFkZHJlc3MgbW9kZQorICAgICAgLy8gYW5kIGFueSBMVU4gbWFzayB0byB0aGUgc2NyYXRjaCBwYWQgU0NwLnBoYXNlICYgLm1vZGUKKworICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUilDbW5kLT5TQ3AucGhhc2U7CisKKyAgICAgIC8vIE5vdywgYmVjYXVzZSBvZiAibHVuIG1hc2tpbmciIAorICAgICAgLy8gKGFrYSBzZWxlY3RpdmUgc3RvcmFnZSBwcmVzZW50YXRpb24pLAorICAgICAgLy8gdGhlIGNvbnRpZ3VvdXMgTGludXggU2NzaSBsdW4gbnVtYmVyIG1heSBub3QgbWF0Y2ggdGhlCisgICAgICAvLyBkZXZpY2UncyBsdW4gbnVtYmVyLCBzbyB3ZSBtYXkgaGF2ZSB0byAibWFwIi4gIAorICAgICAgCisgICAgICAqcGF5bG9hZCsrID0gKFVDSEFSKUNtbmQtPlNDcC5oYXZlX2RhdGFfaW47CisgICAgICAKKyAgICAgIC8vIFdlIGRvbid0IGtub3cgb2YgYW55b25lIGluIHRoZSBGQyBidXNpbmVzcyB1c2luZyB0aGVzZSAKKyAgICAgIC8vIGV4dHJhICJsZXZlbHMiIG9mIGFkZHJlc3NpbmcuICBJbiBmYWN0LCBjb25mdXNpb24gc3RpbGwgZXhpc3RzCisgICAgICAvLyBqdXN0IHVzaW5nIHRoZSBGSVJTVCBsZXZlbC4uLiA7LSkKKyAgICAgIAorICAgICAgKnBheWxvYWQrKyA9IDA7ICAvLyAybmQgbGV2ZWwgYWRkcmVzc2luZworICAgICAgKnBheWxvYWQrKyA9IDA7CisgICAgICAqcGF5bG9hZCsrID0gMDsgIC8vIDNyZCBsZXZlbCBhZGRyZXNzaW5nCisgICAgICAqcGF5bG9hZCsrID0gMDsKKyAgICAgICpwYXlsb2FkKysgPSAwOyAgLy8gNHRoIGxldmVsIGFkZHJlc3NpbmcKKyAgICAgICpwYXlsb2FkKysgPSAwOworCisgICAgICAvLyA0IGJ5dGVzIENvbnRyb2wgRmllbGQgRkNQX0NOVEwKKyAgICAgICpwYXlsb2FkKysgPSAwOyAgICAvLyBieXRlIDA6IChNU0IpIHJlc2VydmVkCisgICAgICAqcGF5bG9hZCsrID0gMDsgICAgLy8gYnl0ZSAxOiB0YXNrIGNvZGVzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIDI6IHRhc2sgbWFuYWdlbWVudCBmbGFncworICAgICAgLy8gYW5vdGhlciAidXNlIiBvZiB0aGUgc3BhcmUgZmllbGQgdG8gYWNjb21wbGlzaCBURFIKKyAgICAgIC8vIG5vdGUgY29tYmluYXRpb24gbmVlZGVkCisgICAgICBpZiggKENtbmQtPmNtbmRbMF0gPT0gUkVMRUFTRSkgJiYKKyAgICAgICAgICAoQ21uZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPT0gRkNQX1RBUkdFVF9SRVNFVCkgKQorICAgICAgeworICAgICAgICBDbW5kLT5jbW5kWzBdID0gMDsgICAgLy8gaXNzdWUgIlRlc3QgVW5pdCBSZWFkeSIgZm9yIFREUgorICAgICAgICAqcGF5bG9hZCsrID0gMHgyMDsgICAgLy8gdGFyZ2V0IGRldmljZSByZXNldCBiaXQKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKnBheWxvYWQrKyA9IDA7ICAgIC8vIG5vIFREUgorCQkgICAgICAvLyBieXRlIDM6IChMU0IpIGV4ZWN1dGlvbiBtYW5hZ2VtZW50IGNvZGVzCisJCSAgICAgIC8vIGJpdCAwIHdyaXRlLCBiaXQgMSByZWFkIChkb24ndCBzZXQgdG9nZXRoZXIpCisgICAgICAKKyAgICAgIGlmKCBmY3BfZGwgIT0gMCApCisgICAgICB7CisgICAgICAgIGlmKCB0eXBlID09IFNDU0lfSVdFICkgICAgICAgICAvLyBXUklURQorICAgICAgICAgICpwYXlsb2FkKysgPSAxOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkVBRAorICAgICAgICAgICpwYXlsb2FkKysgPSAyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCS8vIE9uIHNvbWUgZGV2aWNlcywgaWYgUkQgb3IgV1IgYml0cyBhcmUgc2V0LAorCS8vIGFuZCBmY3BfZGwgaXMgMCwgdGhleSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIG9uIHRoZSBjb21tYW5kLgorCS8vIChpLmUuLCBpZiBkaXJlY3Rpb24gaXMgc3BlY2lmaWVkLCB0aGV5IGluc2lzdCBvbiBhIGxlbmd0aCkuCisJKnBheWxvYWQrKyA9IDA7ICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgKG5lY2Vzc2FyeSBmb3IgQ1BRKQorICAgICAgfQorCisKKyAgICAgIC8vIE5PVEU6IGNsZWFuIHRoaXMgdXAgaWYvd2hlbiBNQVhfQ09NTUFORF9TSVpFIGlzIGluY3JlYXNlZCB0byAxNgorICAgICAgLy8gRkNQX0NEQiBhbGxvd3MgMTYgYnl0ZSBTQ1NJIGNvbW1hbmQgZGVzY3JpcHRvciBibGs7CisgICAgICAvLyBMaW51eCBTQ1NJIENEQiBhcnJheSBpcyBNQVhfQ09NTUFORF9TSVpFICgxMiBhdCB0aGlzIHRpbWUuLi4pCisgICAgICBmb3IoIGk9MDsgKGkgPCBDbW5kLT5jbWRfbGVuKSAmJiBpIDwgTUFYX0NPTU1BTkRfU0laRTsgaSsrKQorCSpwYXlsb2FkKysgPSBDbW5kLT5jbW5kW2ldOworCisgICAgICAvLyBpZiggQ21uZC0+Y21kX2xlbiA9PSAxNiApCisgICAgICAvLyB7CisgICAgICAvLyAgbWVtY3B5KCBwYXlsb2FkLCAmQ21uZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwsIDQpOworICAgICAgLy8gfQorICAgICAgcGF5bG9hZCs9ICgxNiAtIGkpOyAgCisKKwkJICAgICAgLy8gRkNQX0RMIGlzIGxhcmdlc3QgbnVtYmVyIG9mIGV4cGVjdGVkIGRhdGEgYnl0ZXMKKwkJICAgICAgLy8gcGVyIENEQiAoaS5lLiByZWFkL3dyaXRlIGNvbW1hbmQpCisgICAgICAqcGF5bG9hZCsrID0gKFVDSEFSKShmY3BfZGwgPj4yNCk7ICAvLyAoTVNCKSA4IGJ5dGVzIGRhdGEgbGVuIEZDUF9ETAorICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUikoZmNwX2RsID4+MTYpOworICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUikoZmNwX2RsID4+OCk7CisgICAgICAqcGF5bG9hZCsrID0gKFVDSEFSKWZjcF9kbDsgICAgLy8gKExTQikKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQ1NJX1RXRTogICAgICAgICAgLy8gbmVlZCBGQ1BfWEZFUl9SRFkKKyAgICAgICpwYXlsb2FkKysgPSAwOyAgICAgLy8gKDQgYnl0ZXMpIERBVEFfUk8gKE1TQiBieXRlIDApCisgICAgICAqcGF5bG9hZCsrID0gMDsKKyAgICAgICpwYXlsb2FkKysgPSAwOworICAgICAgKnBheWxvYWQrKyA9IDA7ICAgICAvLyBMU0IgKGJ5dGUgMykKKwkJCSAgICAgLy8gKDQgYnl0ZXMpIEJVUlNUX0xFTgorCQkJICAgICAvLyBzaXplIG9mIGZvbGxvd2luZyBGQ1BfREFUQSBwYXlsb2FkCisgICAgICAqcGF5bG9hZCsrID0gKFVDSEFSKShmY3BfZGwgPj4yNCk7ICAvLyAoTVNCKSA4IGJ5dGVzIGRhdGEgbGVuIEZDUF9ETAorICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUikoZmNwX2RsID4+MTYpOworICAgICAgKnBheWxvYWQrKyA9IChVQ0hBUikoZmNwX2RsID4+OCk7CisgICAgICAqcGF5bG9hZCsrID0gKFVDSEFSKWZjcF9kbDsgICAgLy8gKExTQikKKwkJICAgICAgIC8vIDQgYnl0ZXMgUkVTRVJWRUQKKyAgICAgICpwYXlsb2FkKysgPSAwOworICAgICAgKnBheWxvYWQrKyA9IDA7CisgICAgICAqcGF5bG9hZCsrID0gMDsKKyAgICAgICpwYXlsb2FkKysgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N5YmVyc3Rvcm0uYyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiY2E4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jCkBAIC0wLDAgKzEsMzc3IEBACisvKiBjeWJlcnN0b3JtLmM6IERyaXZlciBmb3IgQ3liZXJTdG9ybSBTQ1NJIENvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCisgKgorICogVGhlIEN5YmVyU3Rvcm0gU0NTSSBkcml2ZXIgaXMgYmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MgRVNQIGRyaXZlcgorICogZm9yIHRoZSBTcGFyYyBjb21wdXRlcnMuIAorICogCisgKiBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgYnkgUGhhc2U1IHdobyB3aWxsaW5nbHkgKGFuZCBtb3N0IGdlbmVyb3VzbHkpCisgKiBzdXBwb3J0ZWQgbWUgd2l0aCBoYXJkd2FyZSBhbmQgYWxsIHRoZSBpbmZvcm1hdGlvbiBJIG5lZWRlZC4KKyAqLworCisvKiBUT0RPOgorICoKKyAqIDEpIEZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjbGVhbmVyIG1lcmdlIHdpdGggdGhlIHNwYXJjIGRyaXZlciB3aXRoIHJlZ2FyZAorICogICAgdG8gdGhlIGNhY2hlcyBhbmQgdGhlIFNwYXJjIE1NVSBtYXBwaW5nLgorICogMikgTWFrZSBhcyBmZXcgcm91dGluZXMgcmVxdWlyZWQgb3V0c2lkZSB0aGUgZ2VuZXJpYyBkcml2ZXIuIEEgbG90IG9mIHRoZQorICogICAgcm91dGluZXMgaW4gdGhpcyBmaWxlIHVzZWQgdG8gYmUgaW5saW5lIQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKiBUaGUgY29udHJvbGxlciByZWdpc3RlcnMgY2FuIGJlIGZvdW5kIGluIHRoZSBaMiBjb25maWcgYXJlYSBhdCB0aGVzZQorICogb2Zmc2V0czoKKyAqLworI2RlZmluZSBDWUJFUl9FU1BfQUREUiAweGY0MDAKKyNkZWZpbmUgQ1lCRVJfRE1BX0FERFIgMHhmODAwCisKKworLyogVGhlIEN5YmVyU3Rvcm0gRE1BIGludGVyZmFjZSAqLworc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgeworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIwOwkvKiBETUEgYWRkcmVzcyAoTVNCKSBbMHgwMDBdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQxWzFdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIxOwkvKiBETUEgYWRkcmVzcyAgICAgICBbMHgwMDJdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQyWzFdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIyOwkvKiBETUEgYWRkcmVzcyAgICAgICBbMHgwMDRdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQzWzFdOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIzOwkvKiBETUEgYWRkcmVzcyAoTFNCKSBbMHgwMDZdICovCisJdW5zaWduZWQgY2hhciBkbWFwYWQ0WzB4M2ZiXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNvbmRfcmVnOyAgICAgICAgLyogRE1BIGNvbmQgICAgKHJvKSAgWzB4NDAyXSAqLworI2RlZmluZSBjdHJsX3JlZyAgY29uZF9yZWcJCQkvKiBETUEgY29udHJvbCAod28pICBbMHg0MDJdICovCit9OworCisvKiBETUEgY29udHJvbCBiaXRzICovCisjZGVmaW5lIENZQkVSX0RNQV9MRUQgICAgMHg4MAkvKiBIRCBsZWQgY29udHJvbCAxID0gb24gKi8KKyNkZWZpbmUgQ1lCRVJfRE1BX1dSSVRFICAweDQwCS8qIERNQSBkaXJlY3Rpb24uIDEgPSB3cml0ZSAqLworI2RlZmluZSBDWUJFUl9ETUFfWjMgICAgIDB4MjAJLyogMTYgKFoyKSBvciAzMiAoQ0hJUC9aMykgYml0IERNQSB0cmFuc2ZlciAqLworCisvKiBETUEgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgQ1lCRVJfRE1BX0hORExfSU5UUiAweDgwCS8qIERNQSBJUlEgcGVuZGluZz8gKi8KKworLyogVGhlIGJpdHMgYmVsb3cgYXBwZWFycyB0byBiZSBQaGFzZTUgRGVidWcgYml0cyBvbmx5OyB0aGV5IHdlcmUgbm90CisgKiBkZXNjcmliZWQgYnkgUGhhc2U1IHNvIHVzaW5nIHRoZW0gbWF5IHNlZW0gYSBiaXQgc3R1cGlkLi4uCisgKi8KKyNkZWZpbmUgQ1lCRVJfSE9TVF9JRCAweDAyCS8qIElmIHNldCwgaG9zdCBJRCBzaG91bGQgYmUgNywgb3RoZXJ3aXNlCisJCQkJICogaXQgc2hvdWxkIGJlIDYuCisJCQkJICovCisjZGVmaW5lIENZQkVSX1NMT1dfQ0FCTEUgMHgwOAkvKiBJZiAqbm90KiBzZXQsIGFzc3VtZSBTTE9XX0NBQkxFICovCisKK3N0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjdHJsX2RhdGEgPSAwOwkvKiBLZWVwIGJhY2t1cCBvZiB0aGUgc3R1ZmYgd3JpdHRlbgorCQkJCSAqIHRvIGN0cmxfcmVnLiBBbHdheXMgd3JpdGUgYSBjb3B5CisJCQkJICogdG8gdGhpcyByZWdpc3RlciB3aGVuIHdyaXRpbmcgdG8KKwkJCQkgKiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIhCisJCQkJICovCisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbMTZdOworCQkJCS8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQKKwkJCQkgKiBiZWZvcmUgdGhleSBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIEVTUCBjaGlwCisJCQkJICogdmlhIFBJTy4KKwkJCQkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLworaW50IF9faW5pdCBjeWJlcl9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKworCXdoaWxlICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1dJTERDQVJELCB6KSkpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworCSAgICBpZiAoKHotPmlkID09IFpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzEyMjBfQ1lCRVJTVE9STSB8fAorCQkgei0+aWQgPT0gWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfMTIzMF9JSV9GQVNUTEFORV9aM19DWUJFUlNDU0lfQ1lCRVJTVE9STTA2MCkgJiYKKwkJcmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK0NZQkVSX0VTUF9BRERSLAorCQkgICAgCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKKwkJLyogRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgQ3liZXJTdG9ybSBvciByZWFsbHkgYSAKKwkJICogRmFzdGxhbmUvQmxpenphcmQgTWsgSUkgYnkgbG9va2luZyBhdCB0aGUgYm9hcmQgc2l6ZS4KKwkJICogQ3liZXJTdG9ybSBtYXBzIDY0a0IKKwkJICogKFpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzEyMjBfQ1lCRVJTVE9STSBkb2VzIGFueXdheSkKKwkJICovCisJCWlmKHotPnJlc291cmNlLmVuZC1ib2FyZCAhPSAweGZmZmYpIHsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihib2FyZCtDWUJFUl9FU1BfQUREUiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQrQ1lCRVJfRVNQX0FERFIpOworCisJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLworCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7CisJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOworCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKKwkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKKwkJZXNwLT5kbWFfZHJhaW4gPSAwOworCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKKwkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKKwkJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOworCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKKwkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKKwkJZXNwLT5kbWFfcG9sbCA9IDA7CisJCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKworCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KKwkJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOworCisJCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBDeWJlclN0b3JtIGFyZSBtYXBwZWQKKwkJICogcmVsYXRpdmUgdG8gdGhlIGRldmljZSAoaS5lLiBpbiB0aGUgc2FtZSBab3JybworCQkgKiBJL08gYmxvY2spLgorCQkgKi8KKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKVpUV09fVkFERFIoYm9hcmQpOworCQllc3AtPmRyZWdzID0gKHZvaWQgKikoYWRkcmVzcyArIENZQkVSX0RNQV9BRERSKTsKKworCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLworCQllc3AtPmVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgQ1lCRVJfRVNQX0FERFIpOworCQkKKwkJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCQllc3AtPmVzcF9jb21tYW5kID0gY21kX2J1ZmZlcjsKKwkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19idXMoKHZvaWQgKiljbWRfYnVmZmVyKTsKKworCQllc3AtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKKwkJcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50ciwgU0FfU0hJUlEsCisJCQkgICAgIkN5YmVyU3Rvcm0gU0NTSSIsIGVzcC0+ZWhvc3QpOworCQkvKiBGaWd1cmUgb3V0IG91ciBzY3NpIElEIG9uIHRoZSBidXMgKi8KKwkJLyogVGhlIERNQSBjb25kIGZsYWcgY29udGFpbnMgYSBoYXJkY29kZWQganVtcGVyIGJpdAorCQkgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBzZWxlY3QgaG9zdCBudW1iZXIgNiBvciA3LgorCQkgKiBIb3dldmVyLCBldmVuIHRob3VnaCBpdCBtYXkgY2hhbmdlLCB3ZSB1c2UgYSBoYXJkY29kZWQKKwkJICogdmFsdWUgb2YgNy4KKwkJICovCisJCWVzcC0+c2NzaV9pZCA9IDc7CisJCQorCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLworCQllc3AtPmRpZmYgPSAwOworCisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKKwkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7CisJCXJldHVybiBlc3BzX2luX3VzZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKwkvKiBTaW5jZSB0aGUgQ3liZXJTdG9ybSBETUEgaXMgZnVsbHkgZGVkaWNhdGVkIHRvIHRoZSBFU1AgY2hpcCwKKwkgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgKHRvIHRoZSBFU1AgY2hpcCkgZXF1YWxzIHRoZSBudW1iZXIKKwkgKiBvZiBieXRlcyBpbiB0aGUgRklGTyAtIHRoZXJlIGlzIG5vIGJ1ZmZlcmluZyBpbiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogWFhYWCBEbyBJIHJlYWQgdGhpcyByaWdodD8gSXQgaXMgZnJvbSBob3N0IHRvIEVTUCwgcmlnaHQ/CisJICovCisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworCS8qIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyBhbnkgbGltaXQgb24gdGhlIEN5YmVyRE1BLiBTbyB3ZSB1c2Ugd2hhdAorCSAqIHRoZSBFU1AgY2hpcCBjYW4gaGFuZGxlICgyNCBiaXQpLgorCSAqLworCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJaWYoc3ogPiAweDEwMDAwMDApCisJCXN6ID0gMHgxMDAwMDAwOworCXJldHVybiBzejsKK30KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwMng+XG4iLAorCQllc3AtPmVzcF9pZCwgKChzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqKQorCQkJICAgICAgKGVzcC0+ZHJlZ3MpKS0+Y29uZF9yZWcpKTsKKwlFU1BMT0coKCJpbnRyZXE6PCUwNHg+LCBpbnRlbmE6PCUwNHg+XG4iLAorCQljdXN0b20uaW50cmVxciwgY3VzdG9tLmludGVuYXIpKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCWNhY2hlX2NsZWFyKGFkZHIsIGxlbmd0aCk7CisKKwlhZGRyICY9IH4oMSk7CisJZHJlZ3MtPmRtYV9hZGRyMCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMSA9IChhZGRyID4+IDE2KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMiA9IChhZGRyID4+ICA4KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMyA9IChhZGRyICAgICAgKSAmIDB4ZmY7CisJY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1dSSVRFKTsKKworCS8qIENoZWNrIGlmIHBoeXNpY2FsIGFkZHJlc3MgaXMgb3V0c2lkZSBaMiBzcGFjZSBhbmQgb2YKKwkgKiBibG9jayBsZW5ndGgvYmxvY2sgYWxpZ25lZCBpbiBtZW1vcnkuIElmIHRoaXMgaXMgdGhlCisJICogY2FzZSwgZW5hYmxlIDMyIGJpdCB0cmFuc2Zlci4gSW4gYWxsIG90aGVyIGNhc2VzLCBmYWxsIGJhY2sKKwkgKiB0byAxNiBiaXQgdHJhbnNmZXIuCisJICogT2J2aW91c2x5IDMyIGJpdCB0cmFuc2ZlciBzaG91bGQgYmUgZW5hYmxlZCBpZiB0aGUgRE1BIGFkZHJlc3MKKwkgKiBhbmQgbGVuZ3RoIGFyZSAzMiBiaXQgYWxpZ25lZC4gSG93ZXZlciwgdGhpcyBsZWFkcyB0byBzb21lCisJICogc3RyYW5nZSBiZWhhdmlvci4gRXZlbiA2NCBiaXQgYWxpZ25lZCBhZGRyL2xlbmd0aCBmYWlscy4KKwkgKiBVbnRpbCBJJ3ZlIGZvdW5kIGEgcmVhc29uIGZvciB0aGlzLCAzMiBiaXQgdHJhbnNmZXIgaXMgb25seQorCSAqIHVzZWQgZm9yIGZ1bGwtYmxvY2sgdHJhbnNmZXJzICgxa0IpLgorCSAqCQkJCQkJCS1qc2tvdgorCSAqLworI2lmIDAKKwlpZigoYWRkciAmIDB4M2ZjKSB8fCBsZW5ndGggJiAweDNmZiB8fCAoKGFkZHIgPiAweDIwMDAwMCkgJiYKKwkJCQkJCShhZGRyIDwgMHhmZjAwMDApKSkKKwkJY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1ozKTsJLyogWjIsIGRvIDE2IGJpdCBETUEgKi8KKwllbHNlCisJCWN0cmxfZGF0YSB8PSBDWUJFUl9ETUFfWjM7IC8qIENISVAvWjMsIGRvIDMyIGJpdCBETUEgKi8KKyNlbHNlCisJY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1ozKTsJLyogWjIsIGRvIDE2IGJpdCBETUEgKi8KKyNlbmRpZgorCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisKKwljYWNoZV9wdXNoKGFkZHIsIGxlbmd0aCk7CisKKwlhZGRyIHw9IDE7CisJZHJlZ3MtPmRtYV9hZGRyMCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMSA9IChhZGRyID4+IDE2KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMiA9IChhZGRyID4+ICA4KSAmIDB4ZmY7CisJZHJlZ3MtPmRtYV9hZGRyMyA9IChhZGRyICAgICAgKSAmIDB4ZmY7CisJY3RybF9kYXRhIHw9IENZQkVSX0RNQV9XUklURTsKKworCS8qIFNlZSBjb21tZW50IGFib3ZlICovCisjaWYgMAorCWlmKChhZGRyICYgMHgzZmMpIHx8IGxlbmd0aCAmIDB4M2ZmIHx8ICgoYWRkciA+IDB4MjAwMDAwKSAmJgorCQkJCQkJKGFkZHIgPCAweGZmMDAwMCkpKQorCQljdHJsX2RhdGEgJj0gfihDWUJFUl9ETUFfWjMpOwkvKiBaMiwgZG8gMTYgYml0IERNQSAqLworCWVsc2UKKwkJY3RybF9kYXRhIHw9IENZQkVSX0RNQV9aMzsgLyogQ0hJUC9aMywgZG8gMzIgYml0IERNQSAqLworI2Vsc2UKKwljdHJsX2RhdGEgJj0gfihDWUJFUl9ETUFfWjMpOwkvKiBaMiwgZG8gMTYgYml0IERNQSAqLworI2VuZGlmCisJZHJlZ3MtPmN0cmxfcmVnID0gY3RybF9kYXRhOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlkaXNhYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZW5hYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyogSXQncyBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIERNQSBJUlEgYml0IGluIHRoZSBjb3JyZWN0IHdheSEgKi8KKwlyZXR1cm4gKChlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpICYmCisJCSgoKChzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqKShlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSAmCisJCSBDWUJFUl9ETUFfSE5ETF9JTlRSKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJY3RybF9kYXRhICY9IH5DWUJFUl9ETUFfTEVEOworCSgoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWN0cmxfZGF0YSB8PSBDWUJFUl9ETUFfTEVEOworCSgoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKK30KKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCS8qIE9uIHRoZSBTcGFyYywgRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgorCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQorCSAqLworCWlmKHdyaXRlKXsKKwkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKwl9IGVsc2UgeworCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKKwl9Cit9CisKKyNkZWZpbmUgSE9TVFNfQworCitpbnQgY3liZXJfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmVkZXY7CisKKwllc3BfZGVhbGxvY2F0ZSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpOworCWVzcF9yZWxlYXNlKCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcC1jeWJlcnN0b3JtIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJDeWJlclN0b3JtIFNDU0kiLAorCS5kZXRlY3QJCQk9IGN5YmVyX2VzcF9kZXRlY3QsCisJLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKKwkucmVsZWFzZQkJPSBjeWJlcl9lc3BfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1ZDkyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtSUkuYwpAQCAtMCwwICsxLDMxNCBAQAorLyogY3liZXJzdG9ybUlJLmM6IERyaXZlciBmb3IgQ3liZXJTdG9ybSBTQ1NJIE1rIElJCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gY3liZXJzdG9ybS5jCisgKi8KKworLyogVE9ETzoKKyAqCisgKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKKyAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KKyAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKKyAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKKyAqIG9mZnNldHM6CisgKi8KKyNkZWZpbmUgQ1lCRVJJSV9FU1BfQUREUiAweDFmZjAzCisjZGVmaW5lIENZQkVSSUlfRE1BX0FERFIgMHgxZmY0MworCisKKy8qIFRoZSBDeWJlclN0b3JtIElJIERNQSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgeworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY29uZF9yZWc7ICAgICAgICAvKiBETUEgY29uZCAgICAocm8pICBbMHgwMDBdICovCisjZGVmaW5lIGN0cmxfcmVnICBjb25kX3JlZwkJCS8qIERNQSBjb250cm9sICh3bykgIFsweDAwMF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDRbMHgzZl07CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjA7CS8qIERNQSBhZGRyZXNzIChNU0IpIFsweDA0MF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDFbM107CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjE7CS8qIERNQSBhZGRyZXNzICAgICAgIFsweDA0NF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDJbM107CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjI7CS8qIERNQSBhZGRyZXNzICAgICAgIFsweDA0OF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDNbM107CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjM7CS8qIERNQSBhZGRyZXNzIChMU0IpIFsweDA0Y10gKi8KK307CisKKy8qIERNQSBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgQ1lCRVJJSV9ETUFfTEVEICAgIDB4MDIJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9uICovCisKK3N0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAorCQkJCSAqIHZpYSBQSU8uCisJCQkJICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK2ludCBfX2luaXQgY3liZXJJSV9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzOworCisJaWYgKCh6ID0gem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fUFJPRF9QSEFTRTVfQ1lCRVJTVE9STV9NS19JSSwgeikpKSB7CisJICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKwkgICAgaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtDWUJFUklJX0VTUF9BRERSLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgeworCQkvKiBEbyBzb21lIG1hZ2ljIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIEN5YmVyU3Rvcm0gTWsgSUkKKwkJICogaXMgZXF1aXBwZWQgd2l0aCBhIFNDU0kgY29udHJvbGxlcgorCQkgKi8KKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKVpUV09fVkFERFIoYm9hcmQpOworCQllcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIENZQkVSSUlfRVNQX0FERFIpOworCisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkK0NZQkVSSUlfRVNQX0FERFIpOworCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpOworCQl1ZGVsYXkoNSk7CisJCWlmKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMSkgIT0gKEVTUF9DT05GSUcxX1BFTkFCTEUgfCA3KSkgeworCQkJZXNwX2RlYWxsb2NhdGUoZXNwKTsKKwkJCXNjc2lfdW5yZWdpc3Rlcihlc3AtPmVob3N0KTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihib2FyZCtDWUJFUklJX0VTUF9BRERSLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7CisJCQlyZXR1cm4gMDsgLyogQmFpbCBvdXQgaWYgYWRkcmVzcyBkaWQgbm90IGhvbGQgZGF0YSAqLworCQl9CisKKwkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7CisJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOworCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOworCQllc3AtPmRtYV9kcmFpbiA9IDA7CisJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCQllc3AtPmRtYV9pcnFfZXhpdCA9IDA7CisJCWVzcC0+ZG1hX2xlZF9vbiA9ICZkbWFfbGVkX29uOworCQllc3AtPmRtYV9sZWRfb2ZmID0gJmRtYV9sZWRfb2ZmOworCQllc3AtPmRtYV9wb2xsID0gMDsKKwkJZXNwLT5kbWFfcmVzZXQgPSAwOworCisJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCQllc3AtPmNmcmVxID0gNDAwMDAwMDA7CisKKwkJLyogVGhlIERNQSByZWdpc3RlcnMgb24gdGhlIEN5YmVyU3Rvcm0gYXJlIG1hcHBlZAorCQkgKiByZWxhdGl2ZSB0byB0aGUgZGV2aWNlIChpLmUuIGluIHRoZSBzYW1lIFpvcnJvCisJCSAqIEkvTyBibG9jaykuCisJCSAqLworCQllc3AtPmRyZWdzID0gKHZvaWQgKikoYWRkcmVzcyArIENZQkVSSUlfRE1BX0FERFIpOworCisJCS8qIEVTUCByZWdpc3RlciBiYXNlICovCisJCWVzcC0+ZXJlZ3MgPSBlcmVnczsKKwkJCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7CisJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7CisKKwkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisJCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIFNBX1NISVJRLAorCQkJICAgICJDeWJlclN0b3JtIFNDU0kgTWsgSUkiLCBlc3AtPmVob3N0KTsKKworCQkvKiBGaWd1cmUgb3V0IG91ciBzY3NpIElEIG9uIHRoZSBidXMgKi8KKwkJZXNwLT5zY3NpX2lkID0gNzsKKwkJCisJCS8qIFdlIGRvbid0IGhhdmUgYSBkaWZmZXJlbnRpYWwgU0NTSS1idXMuICovCisJCWVzcC0+ZGlmZiA9IDA7CisKKwkJZXNwX2luaXRpYWxpemUoZXNwKTsKKworCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwkJcmV0dXJuIGVzcHNfaW5fdXNlOworCSAgICB9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworCS8qIFNpbmNlIHRoZSBDeWJlclN0b3JtIERNQSBpcyBmdWxseSBkZWRpY2F0ZWQgdG8gdGhlIEVTUCBjaGlwLAorCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCAodG8gdGhlIEVTUCBjaGlwKSBlcXVhbHMgdGhlIG51bWJlcgorCSAqIG9mIGJ5dGVzIGluIHRoZSBGSUZPIC0gdGhlcmUgaXMgbm8gYnVmZmVyaW5nIGluIHRoZSBETUEgY29udHJvbGxlci4KKwkgKiBYWFhYIERvIEkgcmVhZCB0aGlzIHJpZ2h0PyBJdCBpcyBmcm9tIGhvc3QgdG8gRVNQLCByaWdodD8KKwkgKi8KKwlyZXR1cm4gZmlmb19jb3VudDsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJLyogSSBkb24ndCB0aGluayB0aGVyZSdzIGFueSBsaW1pdCBvbiB0aGUgQ3liZXJETUEuIFNvIHdlIHVzZSB3aGF0CisJICogdGhlIEVTUCBjaGlwIGNhbiBoYW5kbGUgKDI0IGJpdCkuCisJICovCisJdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlpZihzeiA+IDB4MTAwMDAwMCkKKwkJc3ogPSAweDEwMDAwMDA7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCUVTUExPRygoImVzcCVkOiBkbWEgLS0gY29uZF9yZWc8JTAyeD5cbiIsCisJCWVzcC0+ZXNwX2lkLCAoKHN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgKikKKwkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7CisJRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKKwkJY3VzdG9tLmludHJlcXIsIGN1c3RvbS5pbnRlbmFyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOworCisJY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsKKworCWFkZHIgJj0gfigxKTsKKwlkcmVncy0+ZG1hX2FkZHIwID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIxID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKKwlkcmVncy0+ZG1hX2FkZHIzID0gKGFkZHIgICAgICApICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOworCisJY2FjaGVfcHVzaChhZGRyLCBsZW5ndGgpOworCisJYWRkciB8PSAxOworCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOworCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlkaXNhYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZW5hYmxlX2lycShlc3AtPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyogSXQncyBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIERNQSBJUlEgYml0IGluIHRoZSBjb3JyZWN0IHdheSEgKi8KKwlyZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJKChzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgJj0gfkNZQkVSSUlfRE1BX0xFRDsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCSgoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKShlc3AtPmRyZWdzKSktPmN0cmxfcmVnIHw9IENZQkVSSUlfRE1BX0xFRDsKK30KKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoKGN1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCS8qIE9uIHRoZSBTcGFyYywgRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgorCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQorCSAqLworCWlmKHdyaXRlKXsKKwkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKwl9IGVsc2UgeworCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKKwl9Cit9CisKKyNkZWZpbmUgSE9TVFNfQworCitpbnQgY3liZXJJSV9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKyNpZmRlZiBNT0RVTEUKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+ZWRldjsKKworCWVzcF9kZWFsbG9jYXRlKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSk7IAorCWVzcF9yZWxlYXNlKCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcC1jeWJlcnN0b3JtSUkiLAorCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIkN5YmVyU3Rvcm0gTWsgSUkgU0NTSSIsCisJLmRldGVjdAkJCT0gY3liZXJJSV9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gY3liZXJJSV9lc3BfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGMzOTV4LmMgYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNDFjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kYzM5NXguYwpAQCAtMCwwICsxLDQ5NDIgQEAKKy8qCisgKiBkYzM5NXguYworICoKKyAqIERldmljZSBEcml2ZXIgZm9yIFRla3JhbSBEQzM5NShVL1VXL0YpLCBEQzMxNShVKQorICogUENJIFNDU0kgQnVzIE1hc3RlciBIb3N0IEFkYXB0ZXIKKyAqIChTQ1NJIGNoaXAgc2V0IHVzZWQgVGVrcmFtIEFTSUMgVFJNLVMxMDQwKQorICoKKyAqIEF1dGhvcnM6CisgKiAgQy5MLiBIdWFuZyA8Y2hpbmdAdGVrcmFtLmNvbS50dz4KKyAqICBFcmljaCBDaGVuIDxlcmljaEB0ZWtyYW0uY29tLnR3PgorICogIChDKSBDb3B5cmlnaHQgMTk5NS0xOTk5IFRla3JhbSBUZWNobm9sb2d5IENvLiwgTHRkLgorICoKKyAqICBLdXJ0IEdhcmxvZmYgPGdhcmxvZmZAc3VzZS5kZT4KKyAqICAoQykgMTk5OS0yMDAwIEt1cnQgR2FybG9mZgorICoKKyAqICBPbGl2ZXIgTmV1a3VtIDxvbGl2ZXJAbmV1a3VtLm5hbWU+CisgKiAgQWxpIEFrY2FhZ2FjIDxhbGlha2NAd2ViLmRlPgorICogIEphbWllIExlbmVoYW4gPGxlbmVoYW5AdHdpYmJsZS5vcmc+CisgKiAgKEMpIDIwMDMKKyAqCisgKiBMaWNlbnNlOiBHTlUgR1BMCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4JLyogbmVlZGVkIGZvciBzY3NpY2FtX2Jpb3NfcGFyYW0gKi8KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAiZGMzOTV4LmgiCisKKyNkZWZpbmUgREMzOTVYX05BTUUJImRjMzk1eCIKKyNkZWZpbmUgREMzOTVYX0JBTk5FUgkiVGVrcmFtIERDMzk1KFUvVVcvRiksIERDMzE1KFUpIC0gQVNJQyBUUk0tUzEwNDAiCisjZGVmaW5lIERDMzk1WF9WRVJTSU9OCSJ2Mi4wNSwgMjAwNC8wMy8wOCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlcworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IHRvIGRpc2FibGUgcGFydHMgb2YgdGhlIGRyaXZlcgorICovCisvKiNkZWZpbmUgREMzOTV4X05PX0RJU0NPTk5FQ1QqLworLyojZGVmaW5lIERDMzk1eF9OT19UQUdRKi8KKy8qI2RlZmluZSBEQzM5NXhfTk9fU1lOQyovCisvKiNkZWZpbmUgREMzOTV4X05PX1dJREUqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2luZworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHlwZXMgb2YgZGVidWdnaW5nIHRoYXQgY2FuIGJlIGVuYWJsZWQgYW5kIGRpc2FibGVkCisgKi8KKyNkZWZpbmUgREJHX0tHCQkweDAwMDEKKyNkZWZpbmUgREJHXzAJCTB4MDAwMgorI2RlZmluZSBEQkdfMQkJMHgwMDA0CisjZGVmaW5lIERCR19TRwkJMHgwMDIwCisjZGVmaW5lIERCR19GSUZPCTB4MDA0MAorI2RlZmluZSBEQkdfUElPCQkweDAwODAKKworCisvKgorICogU2V0IHNldCBvZiB0aGluZ3MgdG8gb3V0cHV0IGRlYnVnZ2luZyBmb3IuCisgKiBVbmRlZmluZSB0byByZW1vdmUgYWxsIGRlYnVnZ2luZworICovCisvKiNkZWZpbmUgREVCVUdfTUFTSyAoREJHXzB8REJHXzF8REJHX1NHfERCR19GSUZPfERCR19QSU8pKi8KKy8qI2RlZmluZSAgREVCVUdfTUFTSwlEQkdfMCovCisKKworLyoKKyAqIE91dHB1dCBhIGtlcm5lbCBtZXNhZ2UgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCBhbmQgYXBwZW5kIHRoZQorICogZHJpdmVyIG5hbWUgYW5kIGEgIjogIiB0byB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UKKyAqLworI2RlZmluZSBkcHJpbnRrbChsZXZlbCwgZm9ybWF0LCBhcmcuLi4pICBcCisgICAgcHJpbnRrKGxldmVsIERDMzk1WF9OQU1FICI6ICIgZm9ybWF0ICwgIyMgYXJnKQorCisKKyNpZmRlZiBERUJVR19NQVNLCisvKgorICogcHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIC0gdGhpcyBpcyBmb3JtYXRlZCB3aXRoIEtFUk5fREVCVUcsIHRoZW4gdGhlCisgKiBkcml2ZXIgbmFtZSBmb2xsb3dlZCBieSBhICI6ICIgYW5kIHRoZW4gdGhlIG1lc3NhZ2UgaXMgb3V0cHV0LiAKKyAqIFRoaXMgYWxzbyBjaGVja3MgdGhhdCB0aGUgc3BlY2lmaWVkIGRlYnVnIGxldmVsIGlzIGVuYWJsZWQgYmVmb3JlCisgKiBvdXRwdXRpbmcgdGhlIG1lc3NhZ2UKKyAqLworI2RlZmluZSBkcHJpbnRrZGJnKHR5cGUsIGZvcm1hdCwgYXJnLi4uKSBcCisJZG8geyBcCisJCWlmICgodHlwZSkgJiAoREVCVUdfTUFTSykpIFwKKwkJCWRwcmludGtsKEtFUk5fREVCVUcgLCBmb3JtYXQgLCAjIyBhcmcpOyBcCisJfSB3aGlsZSAoMCkKKworLyoKKyAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBvZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZAorICovCisjZGVmaW5lIGRlYnVnX2VuYWJsZWQodHlwZSkJKChERUJVR19NQVNLKSAmICh0eXBlKSkKKworI2Vsc2UKKy8qCisgKiBObyBkZWJ1Z2dpbmcuIERvIG5vdGhpbmcKKyAqLworI2RlZmluZSBkcHJpbnRrZGJnKHR5cGUsIGZvcm1hdCwgYXJnLi4uKSBcCisJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX2VuYWJsZWQodHlwZSkJKDApCisKKyNlbmRpZgorCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9URUtSQU0KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9URUtSQU0gICAgICAgICAgICAgICAgICAgIDB4MURFMQkvKiBWZW5kb3IgSUQgICAgKi8KKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1RFS1JBTV9UUk1TMTA0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RFS1JBTV9UUk1TMTA0MCAgICAgICAgICAgMHgwMzkxCS8qIERldmljZSBJRCAgICAqLworI2VuZGlmCisKKworI2RlZmluZSBEQzM5NXhfTE9DS19JTyhkZXYsZmxhZ3MpCQlzcGluX2xvY2tfaXJxc2F2ZSgoKHN0cnVjdCBTY3NpX0hvc3QgKilkZXYpLT5ob3N0X2xvY2ssIGZsYWdzKQorI2RlZmluZSBEQzM5NXhfVU5MT0NLX0lPKGRldixmbGFncykJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKChzdHJ1Y3QgU2NzaV9Ib3N0ICopZGV2KS0+aG9zdF9sb2NrLCBmbGFncykKKworI2RlZmluZSBEQzM5NXhfcmVhZDgoYWNiLGFkZHJlc3MpCQkodTgpKGluYihhY2ItPmlvX3BvcnRfYmFzZSArIChhZGRyZXNzKSkpCisjZGVmaW5lIERDMzk1eF9yZWFkMTYoYWNiLGFkZHJlc3MpCQkodTE2KShpbncoYWNiLT5pb19wb3J0X2Jhc2UgKyAoYWRkcmVzcykpKQorI2RlZmluZSBEQzM5NXhfcmVhZDMyKGFjYixhZGRyZXNzKQkJKHUzMikoaW5sKGFjYi0+aW9fcG9ydF9iYXNlICsgKGFkZHJlc3MpKSkKKyNkZWZpbmUgREMzOTV4X3dyaXRlOChhY2IsYWRkcmVzcyx2YWx1ZSkJb3V0YigodmFsdWUpLCBhY2ItPmlvX3BvcnRfYmFzZSArIChhZGRyZXNzKSkKKyNkZWZpbmUgREMzOTV4X3dyaXRlMTYoYWNiLGFkZHJlc3MsdmFsdWUpCW91dHcoKHZhbHVlKSwgYWNiLT5pb19wb3J0X2Jhc2UgKyAoYWRkcmVzcykpCisjZGVmaW5lIERDMzk1eF93cml0ZTMyKGFjYixhZGRyZXNzLHZhbHVlKQlvdXRsKCh2YWx1ZSksIGFjYi0+aW9fcG9ydF9iYXNlICsgKGFkZHJlc3MpKQorCisvKiBjbWQtPnJlc3VsdCAqLworI2RlZmluZSBSRVNfVEFSR0VUCQkweDAwMDAwMEZGCS8qIFRhcmdldCBTdGF0ZSAqLworI2RlZmluZSBSRVNfVEFSR0VUX0xOWCAgU1RBVFVTX01BU0sJLyogT25seSBvZmZpY2lhbCAuLi4gKi8KKyNkZWZpbmUgUkVTX0VORE1TRwkJMHgwMDAwRkYwMAkvKiBFbmQgTWVzc2FnZSAqLworI2RlZmluZSBSRVNfRElECQkJMHgwMEZGMDAwMAkvKiBESURfIGNvZGVzICovCisjZGVmaW5lIFJFU19EUlYJCQkweEZGMDAwMDAwCS8qIERSSVZFUl8gY29kZXMgKi8KKworI2RlZmluZSBNS19SRVMoZHJ2LGRpZCxtc2csdGd0KSAoKGludCkoZHJ2KTw8MjQgfCAoaW50KShkaWQpPDwxNiB8IChpbnQpKG1zZyk8PDggfCAoaW50KSh0Z3QpKQorI2RlZmluZSBNS19SRVNfTE5YKGRydixkaWQsbXNnLHRndCkgKChpbnQpKGRydik8PDI0IHwgKGludCkoZGlkKTw8MTYgfCAoaW50KShtc2cpPDw4IHwgKGludCkodGd0KTw8MSkKKworI2RlZmluZSBTRVRfUkVTX1RBUkdFVCh3aG8sdGd0KSB7IHdobyAmPSB+UkVTX1RBUkdFVDsgd2hvIHw9IChpbnQpKHRndCk7IH0KKyNkZWZpbmUgU0VUX1JFU19UQVJHRVRfTE5YKHdobyx0Z3QpIHsgd2hvICY9IH5SRVNfVEFSR0VUX0xOWDsgd2hvIHw9IChpbnQpKHRndCkgPDwgMTsgfQorI2RlZmluZSBTRVRfUkVTX01TRyh3aG8sbXNnKSB7IHdobyAmPSB+UkVTX0VORE1TRzsgd2hvIHw9IChpbnQpKG1zZykgPDwgODsgfQorI2RlZmluZSBTRVRfUkVTX0RJRCh3aG8sZGlkKSB7IHdobyAmPSB+UkVTX0RJRDsgd2hvIHw9IChpbnQpKGRpZCkgPDwgMTY7IH0KKyNkZWZpbmUgU0VUX1JFU19EUlYod2hvLGRydikgeyB3aG8gJj0gflJFU19EUlY7IHdobyB8PSAoaW50KShkcnYpIDw8IDI0OyB9CisKKyNkZWZpbmUgVEFHX05PTkUgMjU1CisKKy8qCisgKiBzcmItPnNlZ2VtZW50X3ggaXMgdGhlIGh3IHNnIGxpc3QuIEl0IGlzIGFsd2F5cyBhbGxvY2F0ZWQgYXMgYQorICogREMzOTV4X01BWF9TR19MSVNURU5UUlkgZW50cmllcyBpbiBhIGxpbmVhciBibG9jayB3aGljaCBkb2VzIG5vdAorICogY3Jvc3MgYSBwYWdlIGJvdW5keS4KKyAqLworI2RlZmluZSBTRUdNRU5UWF9MRU4JKHNpemVvZihzdHJ1Y3QgU0dlbnRyeSkqREMzOTV4X01BWF9TR19MSVNURU5UUlkpCisjZGVmaW5lIFZJUlRYX0xFTgkoc2l6ZW9mKHZvaWQgKikgKiBEQzM5NXhfTUFYX1NHX0xJU1RFTlRSWSkKKworc3RydWN0IFNHZW50cnkgeworCXUzMiBhZGRyZXNzOwkJLyogYnVzISBhZGRyZXNzICovCisJdTMyIGxlbmd0aDsKK307CisKKy8qIFRoZSBTRUVQUk9NIHN0cnVjdHVyZSBmb3IgVFJNX1MxMDQwICovCitzdHJ1Y3QgTlZSYW1UYXJnZXQgeworCXU4IGNmZzA7CQkvKiBUYXJnZXQgY29uZmlndXJhdGlvbiBieXRlIDAgICovCisJdTggcGVyaW9kOwkJLyogVGFyZ2V0IHBlcmlvZCAgICAgICAgICAgICAgICAqLworCXU4IGNmZzI7CQkvKiBUYXJnZXQgY29uZmlndXJhdGlvbiBieXRlIDIgICovCisJdTggY2ZnMzsJCS8qIFRhcmdldCBjb25maWd1cmF0aW9uIGJ5dGUgMyAgKi8KK307CisKK3N0cnVjdCBOdlJhbVR5cGUgeworCXU4IHN1Yl92ZW5kb3JfaWRbMl07CS8qIDAsMSAgU3ViIFZlbmRvciBJRCAgICovCisJdTggc3ViX3N5c19pZFsyXTsJLyogMiwzICBTdWIgU3lzdGVtIElEICAgKi8KKwl1OCBzdWJfY2xhc3M7CQkvKiA0ICAgIFN1YiBDbGFzcyAgICAgICAqLworCXU4IHZlbmRvcl9pZFsyXTsJLyogNSw2ICBWZW5kb3IgSUQgICAgICAgKi8KKwl1OCBkZXZpY2VfaWRbMl07CS8qIDcsOCAgRGV2aWNlIElEICAgICAgICovCisJdTggcmVzZXJ2ZWQ7CQkvKiA5ICAgIFJlc2VydmVkICAgICAgICAqLworCXN0cnVjdCBOVlJhbVRhcmdldCB0YXJnZXRbREMzOTV4X01BWF9TQ1NJX0lEXTsKKwkJCQkJCS8qKiAxMCwxMSwxMiwxMworCQkJCQkJICoqIDE0LDE1LDE2LDE3CisJCQkJCQkgKiogLi4uLgorCQkJCQkJICoqIC4uLi4KKwkJCQkJCSAqKiA3MCw3MSw3Miw3MworCQkJCQkJICovCisJdTggc2NzaV9pZDsJCS8qIDc0IEhvc3QgQWRhcHRlciBTQ1NJIElEICAgICAgKi8KKwl1OCBjaGFubmVsX2NmZzsJCS8qIDc1IENoYW5uZWwgY29uZmlndXJhdGlvbiAgICAgKi8KKwl1OCBkZWxheV90aW1lOwkJLyogNzYgUG93ZXIgb24gZGVsYXkgdGltZSAgICAgICAqLworCXU4IG1heF90YWc7CQkvKiA3NyBNYXhpbXVtIHRhZ3MgICAgICAgICAgICAgICovCisJdTggcmVzZXJ2ZWQwOwkJLyogNzggICovCisJdTggYm9vdF90YXJnZXQ7CQkvKiA3OSAgKi8KKwl1OCBib290X2x1bjsJCS8qIDgwICAqLworCXU4IHJlc2VydmVkMTsJCS8qIDgxICAqLworCXUxNiByZXNlcnZlZDJbMjJdOwkvKiA4MiwuLjEyNSAqLworCXUxNiBja3N1bTsJCS8qIDEyNiwxMjcgKi8KK307CisKK3N0cnVjdCBTY3NpUmVxQmxrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBuZXh0L3ByZXYgcHRycyBmb3Igc3JiIGxpc3RzICovCisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCXN0cnVjdCBTR2VudHJ5ICpzZWdtZW50X3g7CS8qIExpbmVhciBhcnJheSBvZiBodyBzZyBlbnRyaWVzICh1cCB0byA2NCBlbnRyaWVzKSAqLworCXUzMiBzZ19idXNfYWRkcjsJICAgICAgICAvKiBCdXMgYWRkcmVzcyBvZiBzZyBsaXN0IChpZSwgb2Ygc2VnbWVudF94KSAqLworCisJdTggc2dfY291bnQ7CQkJLyogTm8gb2YgSFcgc2cgZW50cmllcyBmb3IgdGhpcyByZXF1ZXN0ICovCisJdTggc2dfaW5kZXg7CQkJLyogSW5kZXggb2YgSFcgc2cgZW50cnkgZm9yIHRoaXMgcmVxdWVzdCAqLworCXUzMiB0b3RhbF94ZmVyX2xlbmd0aDsJCS8qIFRvdGFsIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgdHJhbnNmZXJlZCAqLworCXZvaWQgKip2aXJ0X21hcDsKKwl1bnNpZ25lZCBjaGFyICp2aXJ0X2FkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBjdXJyZW50IHRyYW5zZmVyIHBvc2l0aW9uICovCisKKwkvKgorCSAqIFRoZSBzZW5zZSBidWZmZXIgaGFuZGxpbmcgZnVuY3Rpb24sIHJlcXVlc3Rfc2Vuc2UsIHVzZXMKKwkgKiB0aGUgZmlyc3QgaHcgc2cgZW50cnkgKHNlZ21lbnRfeFswXSkgYW5kIHRoZSB0cmFuc2ZlcgorCSAqIGxlbmd0aCAodG90YWxfeGZlcl9sZW5ndGgpLiBXaGlsZSBkb2luZyB0aGlzIGl0IHN0b3JlcyB0aGUKKwkgKiBvcmlnaW5hbCB2YWx1ZXMgaW50byB0aGUgbGFzdCBzZyBodyBsaXN0CisJICogKHNyYi0+c2VnbWVudF94W0RDMzk1eF9NQVhfU0dfTElTVEVOVFJZIC0gMV0gYW5kIHRoZQorCSAqIHRvdGFsX3hmZXJfbGVuZ3RoIGluIHhmZXJyZWQuIFRoZXNlIHZhbHVlcyBhcmUgcmVzdG9yZWQgaW4KKwkgKiBwY2lfdW5tYXBfc3JiX3NlbnNlLiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHhmZXJyZWQgaXMgdXNlZC4KKwkgKi8KKwl1MzIgeGZlcnJlZDsJCSAgICAgICAgLyogU2F2ZWQgY29weSBvZiB0b3RhbF94ZmVyX2xlbmd0aCAqLworCisJdTE2IHN0YXRlOworCisJdTggbXNnaW5fYnVmWzZdOworCXU4IG1zZ291dF9idWZbNl07CisKKwl1OCBhZGFwdGVyX3N0YXR1czsKKwl1OCB0YXJnZXRfc3RhdHVzOworCXU4IG1zZ19jb3VudDsKKwl1OCBlbmRfbWVzc2FnZTsKKworCXU4IHRhZ19udW1iZXI7CisJdTggc3RhdHVzOworCXU4IHJldHJ5X2NvdW50OworCXU4IGZsYWc7CisKKwl1OCBzY3NpX3BoYXNlOworfTsKKworc3RydWN0IERldmljZUN0bEJsayB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbmV4dC9wcmV2IHB0cnMgZm9yIHRoZSBkY2IgbGlzdCAqLworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2I7CisJc3RydWN0IGxpc3RfaGVhZCBzcmJfZ29pbmdfbGlzdDsJLyogaGVhZCBvZiBnb2luZyBzcmIgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3JiX3dhaXRpbmdfbGlzdDsJLyogaGVhZCBvZiB3YWl0aW5nIHNyYiBsaXN0ICovCisKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqYWN0aXZlX3NyYjsKKwl1MzIgdGFnX21hc2s7CisKKwl1MTYgbWF4X2NvbW1hbmQ7CisKKwl1OCB0YXJnZXRfaWQ7CQkvKiBTQ1NJIFRhcmdldCBJRCAgKFNDU0kgT25seSkgKi8KKwl1OCB0YXJnZXRfbHVuOwkJLyogU0NTSSBMb2cuICBVbml0IChTQ1NJIE9ubHkpICovCisJdTggaWRlbnRpZnlfbXNnOworCXU4IGRldl9tb2RlOworCisJdTggaW5xdWlyeTc7CQkvKiBUbyBzdG9yZSBJbnF1aXJ5IGZsYWdzICovCisJdTggc3luY19tb2RlOwkJLyogMDphc3luYyBtb2RlICovCisJdTggbWluX25lZ29fcGVyaW9kOwkvKiBmb3IgbmVnby4gKi8KKwl1OCBzeW5jX3BlcmlvZDsJCS8qIGZvciByZWcuICAqLworCisJdTggc3luY19vZmZzZXQ7CQkvKiBmb3IgcmVnLiBhbmQgbmVnby4obG93IG5pYmJsZSkgKi8KKwl1OCBmbGFnOworCXU4IGRldl90eXBlOworCXU4IGluaXRfdGNxX2ZsYWc7Cit9OworCitzdHJ1Y3QgQWRhcHRlckN0bEJsayB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0OworCisJdW5zaWduZWQgbG9uZyBpb19wb3J0X2Jhc2U7CisJdW5zaWduZWQgbG9uZyBpb19wb3J0X2xlbjsKKworCXN0cnVjdCBsaXN0X2hlYWQgZGNiX2xpc3Q7CQkvKiBoZWFkIG9mIGdvaW5nIGRjYiBsaXN0ICovCisJc3RydWN0IERldmljZUN0bEJsayAqZGNiX3J1bl9yb2JpbjsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICphY3RpdmVfZGNiOworCisJc3RydWN0IGxpc3RfaGVhZCBzcmJfZnJlZV9saXN0OwkJLyogaGVhZCBvZiBmcmVlIHNyYiBsaXN0ICovCisJc3RydWN0IFNjc2lSZXFCbGsgKnRtcF9zcmI7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2FpdGluZ190aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzZWx0b190aW1lcjsKKworCXUxNiBzcmJfY291bnQ7CisKKwl1OCBzZWxfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBpcnFfbGV2ZWw7CisJdTggdGFnX21heF9udW07CisJdTggYWNiX2ZsYWc7CisJdTggZ21vZGUyOworCisJdTggY29uZmlnOworCXU4IGx1bl9jaGs7CisJdTggc2Nhbl9kZXZpY2VzOworCXU4IGhvc3RpZF9iaXQ7CisKKwl1OCBkY2JfbWFwW0RDMzk1eF9NQVhfU0NTSV9JRF07CisJc3RydWN0IERldmljZUN0bEJsayAqY2hpbGRyZW5bREMzOTV4X01BWF9TQ1NJX0lEXVszMl07CisKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJdTggbXNnX2xlbjsKKworCXN0cnVjdCBTY3NpUmVxQmxrIHNyYl9hcnJheVtEQzM5NXhfTUFYX1NSQl9DTlRdOworCXN0cnVjdCBTY3NpUmVxQmxrIHNyYjsKKworCXN0cnVjdCBOdlJhbVR5cGUgZWVwcm9tOwkvKiBlZXByb20gc2V0dGluZ3MgZm9yIHRoaXMgYWRhcHRlciAqLworfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcndhcmQgZGVjbGFyYXRpb25zCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRhdGFfb3V0X3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYXRhX2luX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBjb21tYW5kX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBzdGF0dXNfcGhhc2UwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG1zZ291dF9waGFzZTAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgbXNnaW5fcGhhc2UwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRhdGFfb3V0X3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYXRhX2luX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBjb21tYW5kX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBzdGF0dXNfcGhhc2UxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG1zZ291dF9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgbXNnaW5fcGhhc2UxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG5vcDAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgbm9wMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLCAKKwkJdTE2ICpwc2NzaV9zdGF0dXMpOworc3RhdGljIHZvaWQgc2V0X2Jhc2ljX2NvbmZpZyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKTsKK3N0YXRpYyB2b2lkIGNsZWFudXBfYWZ0ZXJfdHJhbnNmZXIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYik7CitzdGF0aWMgdm9pZCByZXNldF9zY3NpX2J1cyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKTsKK3N0YXRpYyB2b2lkIGRhdGFfaW9fdHJhbnNmZXIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwgdTE2IGlvX2Rpcik7CitzdGF0aWMgdm9pZCBkaXNjb25uZWN0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpOworc3RhdGljIHZvaWQgcmVzZWxlY3Qoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYik7CitzdGF0aWMgdTggc3RhcnRfc2NzaShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9tc2dvdXRfYWJvcnQoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYik7CitzdGF0aWMgdm9pZCBidWlsZF9zcmIoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIHZvaWQgZG9pbmdfc3JiX2RvbmUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgdTggZGlkX2NvZGUsCisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdTggZm9yY2UpOworc3RhdGljIHZvaWQgc2NzaV9yZXNldF9kZXRlY3Qoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYik7CitzdGF0aWMgdm9pZCBwY2lfdW5tYXBfc3JiKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpOworc3RhdGljIHZvaWQgcGNpX3VubWFwX3NyYl9zZW5zZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKTsKK3N0YXRpYyB2b2lkIHNyYl9kb25lKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYik7CitzdGF0aWMgdm9pZCByZXF1ZXN0X3NlbnNlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYik7CitzdGF0aWMgdm9pZCBzZXRfeGZlcl9yYXRlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYik7CitzdGF0aWMgdm9pZCB3YWl0aW5nX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwdHIpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWMgRGF0YQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTE2IGN1cnJlbnRfc3luY19vZmZzZXQgPSAwOworCitzdGF0aWMgdm9pZCAqZGMzOTV4X3Njc2lfcGhhc2UwW10gPSB7CisJZGF0YV9vdXRfcGhhc2UwLC8qIHBoYXNlOjAgKi8KKwlkYXRhX2luX3BoYXNlMCwJLyogcGhhc2U6MSAqLworCWNvbW1hbmRfcGhhc2UwLAkvKiBwaGFzZToyICovCisJc3RhdHVzX3BoYXNlMCwJLyogcGhhc2U6MyAqLworCW5vcDAsCQkvKiBwaGFzZTo0IFBIX0JVU19GUkVFIC4uIGluaXRpYWwgcGhhc2UgKi8KKwlub3AwLAkJLyogcGhhc2U6NSBQSF9CVVNfRlJFRSAuLiBpbml0aWFsIHBoYXNlICovCisJbXNnb3V0X3BoYXNlMCwJLyogcGhhc2U6NiAqLworCW1zZ2luX3BoYXNlMCwJLyogcGhhc2U6NyAqLworfTsKKworc3RhdGljIHZvaWQgKmRjMzk1eF9zY3NpX3BoYXNlMVtdID0geworCWRhdGFfb3V0X3BoYXNlMSwvKiBwaGFzZTowICovCisJZGF0YV9pbl9waGFzZTEsCS8qIHBoYXNlOjEgKi8KKwljb21tYW5kX3BoYXNlMSwJLyogcGhhc2U6MiAqLworCXN0YXR1c19waGFzZTEsCS8qIHBoYXNlOjMgKi8KKwlub3AxLAkJLyogcGhhc2U6NCBQSF9CVVNfRlJFRSAuLiBpbml0aWFsIHBoYXNlICovCisJbm9wMSwJCS8qIHBoYXNlOjUgUEhfQlVTX0ZSRUUgLi4gaW5pdGlhbCBwaGFzZSAqLworCW1zZ291dF9waGFzZTEsCS8qIHBoYXNlOjYgKi8KKwltc2dpbl9waGFzZTEsCS8qIHBoYXNlOjcgKi8KK307CisKKy8qCisgKkZhc3QyMDoJMDAwCSA1MG5zLCAyMC4wIE1IegorICoJCTAwMQkgNzVucywgMTMuMyBNSHoKKyAqCQkwMTAJMTAwbnMsIDEwLjAgTUh6CisgKgkJMDExCTEyNW5zLCAgOC4wIE1IegorICoJCTEwMAkxNTBucywgIDYuNiBNSHoKKyAqCQkxMDEJMTc1bnMsICA1LjcgTUh6CisgKgkJMTEwCTIwMG5zLCAgNS4wIE1IegorICoJCTExMQkyNTBucywgIDQuMCBNSHoKKyAqCisgKkZhc3Q0MChMVkRTKToJMDAwCSAyNW5zLCA0MC4wIE1IegorICoJCTAwMQkgNTBucywgMjAuMCBNSHoKKyAqCQkwMTAJIDc1bnMsIDEzLjMgTUh6CisgKgkJMDExCTEwMG5zLCAxMC4wIE1IegorICoJCTEwMAkxMjVucywgIDguMCBNSHoKKyAqCQkxMDEJMTUwbnMsICA2LjYgTUh6CisgKgkJMTEwCTE3NW5zLCAgNS43IE1IegorICoJCTExMQkyMDBucywgIDUuMCBNSHoKKyAqLworLypzdGF0aWMgdTgJY2xvY2tfcGVyaW9kW10gPSB7MTIsMTksMjUsMzEsMzcsNDQsNTAsNjJ9OyovCisKKy8qIHJlYWwgcGVyaW9kOjQ4bnMsNzZucywxMDBucywxMjRucywxNDhucywxNzZucywyMDBucywyNDhucyAqLworc3RhdGljIHU4IGNsb2NrX3BlcmlvZFtdID0geyAxMiwgMTgsIDI1LCAzMSwgMzcsIDQzLCA1MCwgNjIgfTsKK3N0YXRpYyB1MTYgY2xvY2tfc3BlZWRbXSA9IHsgMjAwLCAxMzMsIDEwMCwgODAsIDY3LCA1OCwgNTAsIDQwIH07CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZS9ib290IHBhcmFtZXRlcnMgY3VycmVudGx5IGVmZmVjdCAqYWxsKiBpbnN0YW5jZXMgb2YgdGhlCisgKiBjYXJkIGluIHRoZSBzeXN0ZW0uCisgKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFyZSBzdG9yZWQgaW4gYSBzdHJ1Y3R1cmUgYmVsb3cuCisgKiBUaGVzZSBhcmUgdGhlIGluZGV4J3MgaW50byB0aGUgc3RydWN0dXJlIGZvciB0aGUgdmFyaW91cworICogY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0ZHX0FEQVBURVJfSUQJCTAKKyNkZWZpbmUgQ0ZHX01BWF9TUEVFRAkJMQorI2RlZmluZSBDRkdfREVWX01PREUJCTIKKyNkZWZpbmUgQ0ZHX0FEQVBURVJfTU9ERQkzCisjZGVmaW5lIENGR19UQUdTCQk0CisjZGVmaW5lIENGR19SRVNFVF9ERUxBWQkJNQorCisjZGVmaW5lIENGR19OVU0JCQk2CS8qIG51bWJlciBvZiBjb25maWd1cmF0aW9uIGl0ZW1zICovCisKKworLyoKKyAqIFZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbW1hbmQgbGluZSBvdmVycmlkZQorICogaGFzbid0IGJlZW4gdXNlZCB0byBtb2RpZnkgdGhlIHZhbHVlLgorICovCisjZGVmaW5lIENGR19QQVJBTV9VTlNFVCAtMQorCisKKy8qCisgKiBIb2xkIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgUGFyYW1ldGVyRGF0YSB7CisJaW50IHZhbHVlOwkJLyogdmFsdWUgb2YgdGhpcyBzZXR0aW5nICovCisJaW50IG1pbjsJCS8qIG1pbmltdW0gdmFsdWUgKi8KKwlpbnQgbWF4OwkJLyogbWF4aW11bSB2YWx1ZSAqLworCWludCBkZWY7CQkvKiBkZWZhdWx0IHZhbHVlICovCisJaW50IHNhZmU7CQkvKiBzYWZlIHZhbHVlICovCit9Oworc3RhdGljIHN0cnVjdCBQYXJhbWV0ZXJEYXRhIF9fZGV2aW5pdGRhdGEgY2ZnX2RhdGFbXSA9IHsKKwl7IC8qIGFkYXB0ZXIgaWQgKi8KKwkJQ0ZHX1BBUkFNX1VOU0VULAorCQkwLAorCQkxNSwKKwkJNywKKwkJNworCX0sCisJeyAvKiBtYXggc3BlZWQgKi8KKwkJQ0ZHX1BBUkFNX1VOU0VULAorCQkgIDAsCisJCSAgNywKKwkJICAxLAkvKiAxMy4zTWh6ICovCisJCSAgNCwJLyogIDYuN0hteiAqLworCX0sCisJeyAvKiBkZXYgbW9kZSAqLworCQlDRkdfUEFSQU1fVU5TRVQsCisJCTAsCisJCTB4M2YsCisJCU5UQ19ET19QQVJJVFlfQ0hLIHwgTlRDX0RPX0RJU0NPTk5FQ1QgfCBOVENfRE9fU1lOQ19ORUdPIHwKKwkJCU5UQ19ET19XSURFX05FR08gfCBOVENfRE9fVEFHX1FVRVVFSU5HIHwKKwkJCU5UQ19ET19TRU5EX1NUQVJULAorCQlOVENfRE9fUEFSSVRZX0NISyB8IE5UQ19ET19TRU5EX1NUQVJUCisJfSwKKwl7IC8qIGFkYXB0ZXIgbW9kZSAqLworCQlDRkdfUEFSQU1fVU5TRVQsCisJCTAsCisJCTB4MmYsCisjaWZkZWYgQ09ORklHX1NDU0lfTVVMVElfTFVOCisJCQlOQUNfU0NBTkxVTiB8CisjZW5kaWYKKwkJTkFDX0dUMkRSSVZFUyB8IE5BQ19HUkVBVEVSXzFHIHwgTkFDX1BPV0VST05fU0NTSV9SRVNFVAorCQkJLyp8IE5BQ19BQ1RJVkVfTkVHKi8sCisJCU5BQ19HVDJEUklWRVMgfCBOQUNfR1JFQVRFUl8xRyB8IE5BQ19QT1dFUk9OX1NDU0lfUkVTRVQgfCAweDA4CisJfSwKKwl7IC8qIHRhZ3MgKi8KKwkJQ0ZHX1BBUkFNX1VOU0VULAorCQkwLAorCQk1LAorCQkzLAkvKiAxNiB0YWdzICg/PykgKi8KKwkJMiwKKwl9LAorCXsgLyogcmVzZXQgZGVsYXkgKi8KKwkJQ0ZHX1BBUkFNX1VOU0VULAorCQkwLAorCQkxODAsCisJCTEsCS8qIDEgc2Vjb25kICovCisJCTEwLAkvKiAxMCBzZWNvbmRzICovCisJfQorfTsKKworCisvKgorICogU2FmZSBzZXR0aW5ncy4gSWYgc2V0IHRvIHplcm8gdGhlIHRoZSBCSU9TL2RlZmF1bHQgdmFsdWVzIHdpdGgKKyAqIGNvbW1hbmQgbGluZSBvdmVycmlkZXMgd2lsbCBiZSB1c2VkLiBJZiBzZXQgdG8gMSB0aGVuIHNhZmUgYW5kCisgKiBzbG93IHNldHRpbmdzIHdpbGwgYmUgdXNlZC4KKyAqLworc3RhdGljIGludCB1c2Vfc2FmZV9zZXR0aW5ncyA9IDA7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2FmZSwgdXNlX3NhZmVfc2V0dGluZ3MsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhzYWZlLCAiVXNlIHNhZmUgYW5kIHNsb3cgc2V0dGluZ3Mgb25seS4gRGVmYXVsdDogZmFsc2UiKTsKKworCittb2R1bGVfcGFyYW1fbmFtZWQoYWRhcHRlcl9pZCwgY2ZnX2RhdGFbQ0ZHX0FEQVBURVJfSURdLnZhbHVlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZGFwdGVyX2lkLCAiQWRhcHRlciBTQ1NJIElELiBEZWZhdWx0IDcgKDAtMTUpIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfc3BlZWQsIGNmZ19kYXRhW0NGR19NQVhfU1BFRURdLnZhbHVlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc3BlZWQsICJNYXhpbXVtIGJ1cyBzcGVlZC4gRGVmYXVsdCAxICgwLTcpIFNwZWVkczogMD0yMCwgMT0xMy4zLCAyPTEwLCAzPTgsIDQ9Ni43LCA1PTUuOCwgNj01LCA3PTQgTWh6Iik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfbW9kZSwgY2ZnX2RhdGFbQ0ZHX0RFVl9NT0RFXS52YWx1ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X21vZGUsICJEZXZpY2UgbW9kZS4iKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFkYXB0ZXJfbW9kZSwgY2ZnX2RhdGFbQ0ZHX0FEQVBURVJfTU9ERV0udmFsdWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFkYXB0ZXJfbW9kZSwgIkFkYXB0ZXIgbW9kZS4iKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKHRhZ3MsIGNmZ19kYXRhW0NGR19UQUdTXS52YWx1ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGFncywgIk51bWJlciBvZiB0YWdzICgxPDx4KS4gRGVmYXVsdCAzICgwLTUpIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChyZXNldF9kZWxheSwgY2ZnX2RhdGFbQ0ZHX1JFU0VUX0RFTEFZXS52YWx1ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXRfZGVsYXksICJSZXNldCBkZWxheSBpbiBzZWNvbmRzLiBEZWZhdWx0IDEgKDAtMTgwKSIpOworCisKKy8qKgorICogc2V0X3NhZmVfc2V0dGluZ3MgLSBpZiB0aGUgdXNlX3NhZmVfc2V0dGluZ3Mgb3B0aW9uIGlzIHNldCB0aGVuCisgKiBzZXQgYWxsIHZhbHVlcyB0byB0aGUgc2FmZSBhbmQgc2xvdyB2YWx1ZXMuCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2V0X3NhZmVfc2V0dGluZ3Modm9pZCkKK3sKKwlpZiAodXNlX3NhZmVfc2V0dGluZ3MpCisJeworCQlpbnQgaTsKKworCQlkcHJpbnRrbChLRVJOX0lORk8sICJVc2luZyBzYWZlIHNldHRpbmdzLlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBDRkdfTlVNOyBpKyspCisJCXsKKwkJCWNmZ19kYXRhW2ldLnZhbHVlID0gY2ZnX2RhdGFbaV0uc2FmZTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIGZpeF9zZXR0aW5ncyAtIHJlc2V0IGFueSBib290IHBhcmFtZXRlcnMgd2hpY2ggYXJlIG91dCBvZiByYW5nZQorICogYmFjayB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZml4X3NldHRpbmdzKHZvaWQpCit7CisJaW50IGk7CisKKwlkcHJpbnRrZGJnKERCR18xLAorCQkic2V0dXA6IEFkYXB0ZXJJZD0lMDh4IE1heFNwZWVkPSUwOHggRGV2TW9kZT0lMDh4ICIKKwkJIkFkYXB0ZXJNb2RlPSUwOHggVGFncz0lMDh4IFJlc2V0RGVsYXk9JTA4eFxuIiwKKwkJY2ZnX2RhdGFbQ0ZHX0FEQVBURVJfSURdLnZhbHVlLAorCQljZmdfZGF0YVtDRkdfTUFYX1NQRUVEXS52YWx1ZSwKKwkJY2ZnX2RhdGFbQ0ZHX0RFVl9NT0RFXS52YWx1ZSwKKwkJY2ZnX2RhdGFbQ0ZHX0FEQVBURVJfTU9ERV0udmFsdWUsCisJCWNmZ19kYXRhW0NGR19UQUdTXS52YWx1ZSwKKwkJY2ZnX2RhdGFbQ0ZHX1JFU0VUX0RFTEFZXS52YWx1ZSk7CisJZm9yIChpID0gMDsgaSA8IENGR19OVU07IGkrKykKKwl7CisJCWlmIChjZmdfZGF0YVtpXS52YWx1ZSA8IGNmZ19kYXRhW2ldLm1pbgorCQkgICAgfHwgY2ZnX2RhdGFbaV0udmFsdWUgPiBjZmdfZGF0YVtpXS5tYXgpCisJCQljZmdfZGF0YVtpXS52YWx1ZSA9IGNmZ19kYXRhW2ldLmRlZjsKKwl9Cit9CisKKworCisvKgorICogTWFwcGluZyBmcm9tIHRoZSBlZXByb20gZGVsYXkgaW5kZXggdmFsdWUgKGluZGV4IGludG8gdGhpcyBhcnJheSkKKyAqIHRvIHRoZSB0aGUgbnVtYmVyIG9mIGFjdHVhbCBzZWNvbmRzIHRoYXQgdGhlIGRlbGF5IHNob3VsZCBiZSBmb3IuCisgKi8KK3N0YXRpYyBjaGFyIF9fZGV2aW5pdGRhdGEgZWVwcm9tX2luZGV4X3RvX2RlbGF5X21hcFtdID0gCisJeyAxLCAzLCA1LCAxMCwgMTYsIDMwLCA2MCwgMTIwIH07CisKKworLyoqCisgKiBlZXByb21faW5kZXhfdG9fZGVsYXkgLSBUYWtlIHRoZSBlZXByb20gZGVsYXkgc2V0dGluZyBhbmQgY29udmVydCBpdAorICogaW50byBhIG51bWJlciBvZiBzZWNvbmRzLgorICoKKyAqIEBlZXByb206IFRoZSBlZXByb20gc3RydWN0dXJlIGluIHdoaWNoIHdlIGZpbmQgdGhlIGRlbGF5IGluZGV4IHRvIG1hcC4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlZXByb21faW5kZXhfdG9fZGVsYXkoc3RydWN0IE52UmFtVHlwZSAqZWVwcm9tKQoreworCWVlcHJvbS0+ZGVsYXlfdGltZSA9IGVlcHJvbV9pbmRleF90b19kZWxheV9tYXBbZWVwcm9tLT5kZWxheV90aW1lXTsKK30KKworCisvKioKKyAqIGRlbGF5X3RvX2VlcHJvbV9pbmRleCAtIFRha2UgYSBkZWxheSBpbiBzZWNvbmRzIGFuZCByZXR1cm4gdGhlCisgKiBjbG9zZXN0IGVlcHJvbSBpbmRleCB3aGljaCB3aWxsIGRlbGF5IGZvciBhdCBsZWFzdCB0aGF0IGFtb3VudCBvZgorICogc2Vjb25kcy4KKyAqCisgKiBAZGVsYXk6IFRoZSBkZWxheSwgaW4gc2Vjb25kcywgdG8gZmluZCB0aGUgZWVwcm9tIGluZGV4IGZvci4KKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGRlbGF5X3RvX2VlcHJvbV9pbmRleChpbnQgZGVsYXkpCit7CisJdTggaWR4ID0gMDsKKwl3aGlsZSAoaWR4IDwgNyAmJiBlZXByb21faW5kZXhfdG9fZGVsYXlfbWFwW2lkeF0gPCBkZWxheSkKKwkJaWR4Kys7CisJcmV0dXJuIGlkeDsKK30KKworCisvKioKKyAqIGVlcHJvbV9vdmVycmlkZSAtIE92ZXJyaWRlIHRoZSBlZXByb20gc2V0dGluZ3MsIGluIHRoZSBwcm92aWRlZAorICogZWVwcm9tIHN0cnVjdHVyZSwgd2l0aCB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gc2V0IG9uIHRoZSBjb21tYW5kCisgKiBsaW5lLgorICoKKyAqIEBlZXByb206IFRoZSBlZXByb20gZGF0YSB0byBvdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGVlcHJvbV9vdmVycmlkZShzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20pCit7CisJdTggaWQ7CisKKwkvKiBBZGFwdGVyIFNldHRpbmdzICovCisJaWYgKGNmZ19kYXRhW0NGR19BREFQVEVSX0lEXS52YWx1ZSAhPSBDRkdfUEFSQU1fVU5TRVQpCisJCWVlcHJvbS0+c2NzaV9pZCA9ICh1OCljZmdfZGF0YVtDRkdfQURBUFRFUl9JRF0udmFsdWU7CisKKwlpZiAoY2ZnX2RhdGFbQ0ZHX0FEQVBURVJfTU9ERV0udmFsdWUgIT0gQ0ZHX1BBUkFNX1VOU0VUKQorCQllZXByb20tPmNoYW5uZWxfY2ZnID0gKHU4KWNmZ19kYXRhW0NGR19BREFQVEVSX01PREVdLnZhbHVlOworCisJaWYgKGNmZ19kYXRhW0NGR19SRVNFVF9ERUxBWV0udmFsdWUgIT0gQ0ZHX1BBUkFNX1VOU0VUKQorCQllZXByb20tPmRlbGF5X3RpbWUgPSBkZWxheV90b19lZXByb21faW5kZXgoCisJCQkJCWNmZ19kYXRhW0NGR19SRVNFVF9ERUxBWV0udmFsdWUpOworCisJaWYgKGNmZ19kYXRhW0NGR19UQUdTXS52YWx1ZSAhPSBDRkdfUEFSQU1fVU5TRVQpCisJCWVlcHJvbS0+bWF4X3RhZyA9ICh1OCljZmdfZGF0YVtDRkdfVEFHU10udmFsdWU7CisKKwkvKiBEZXZpY2UgU2V0dGluZ3MgKi8KKwlmb3IgKGlkID0gMDsgaWQgPCBEQzM5NXhfTUFYX1NDU0lfSUQ7IGlkKyspIHsKKwkJaWYgKGNmZ19kYXRhW0NGR19ERVZfTU9ERV0udmFsdWUgIT0gQ0ZHX1BBUkFNX1VOU0VUKQorCQkJZWVwcm9tLT50YXJnZXRbaWRdLmNmZzAgPQorCQkJCSh1OCljZmdfZGF0YVtDRkdfREVWX01PREVdLnZhbHVlOworCisJCWlmIChjZmdfZGF0YVtDRkdfTUFYX1NQRUVEXS52YWx1ZSAhPSBDRkdfUEFSQU1fVU5TRVQpCisJCQllZXByb20tPnRhcmdldFtpZF0ucGVyaW9kID0KKwkJCQkodTgpY2ZnX2RhdGFbQ0ZHX01BWF9TUEVFRF0udmFsdWU7CisKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdW5zaWduZWQgaW50IGxpc3Rfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCWxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKQorCQljb3VudCsrOworCXJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgc3RydWN0IERldmljZUN0bEJsayAqZGNiX2dldF9uZXh0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCXN0cnVjdCBEZXZpY2VDdGxCbGsgKnBvcykKK3sKKwlpbnQgdXNlX25leHQgPSAwOworCXN0cnVjdCBEZXZpY2VDdGxCbGsqIG5leHQgPSBOVUxMOworCXN0cnVjdCBEZXZpY2VDdGxCbGsqIGk7CisKKwlpZiAobGlzdF9lbXB0eShoZWFkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBmaW5kIHN1cHBsaWVkIGRjYiBhbmQgdGhlbiBzZWxlY3QgdGhlIG5leHQgb25lICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCBoZWFkLCBsaXN0KQorCQlpZiAodXNlX25leHQpIHsKKwkJCW5leHQgPSBpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoaSA9PSBwb3MpIHsKKwkJCXVzZV9uZXh0ID0gMTsKKwkJfQorCS8qIGlmIG5vIG5leHQgb25lIHRha2UgdGhlIGhlYWQgb25lIChpZSwgd3JhcGFyb3VuZCkgKi8KKwlpZiAoIW5leHQpCisgICAgICAgIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksIGhlYWQsIGxpc3QpIHsKKyAgICAgICAgCQluZXh0ID0gaTsKKyAgICAgICAgCQlicmVhazsKKyAgICAgICAgCX0KKworCXJldHVybiBuZXh0OworfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfdGFnKHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlpZiAoc3JiLT50YWdfbnVtYmVyIDwgMjU1KSB7CisJCWRjYi0+dGFnX21hc2sgJj0gfigxIDw8IHNyYi0+dGFnX251bWJlcik7CS8qIGZyZWUgdGFnIG1hc2sgKi8KKwkJc3JiLT50YWdfbnVtYmVyID0gMjU1OworCX0KK30KKworCisvKiBGaW5kIGNtZCBpbiBTUkIgbGlzdCAqLworaW5saW5lIHN0YXRpYyBzdHJ1Y3QgU2NzaVJlcUJsayAqZmluZF9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCAKKwkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqaTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksIGhlYWQsIGxpc3QpCisJCWlmIChpLT5jbWQgPT0gY21kKQorCQkJcmV0dXJuIGk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHN0cnVjdCBTY3NpUmVxQmxrICpzcmJfZ2V0X2ZyZWUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmFjYi0+c3JiX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlzcmIgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBTY3NpUmVxQmxrLCBsaXN0KTsKKwkJbGlzdF9kZWwoaGVhZC0+bmV4dCk7CisJCWRwcmludGtkYmcoREJHXzAsICJzcmJfZ2V0X2ZyZWU6IHNyYj0lcFxuIiwgc3JiKTsKKwl9CisJcmV0dXJuIHNyYjsKK30KKworCitzdGF0aWMgdm9pZCBzcmJfZnJlZV9pbnNlcnQoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAic3JiX2ZyZWVfaW5zZXJ0OiBzcmI9JXBcbiIsIHNyYik7CisJbGlzdF9hZGRfdGFpbCgmc3JiLT5saXN0LCAmYWNiLT5zcmJfZnJlZV9saXN0KTsKK30KKworCitzdGF0aWMgdm9pZCBzcmJfd2FpdGluZ19pbnNlcnQoc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCWRwcmludGtkYmcoREJHXzAsICJzcmJfd2FpdGluZ19pbnNlcnQ6IChwaWQjJWxpKSA8JTAyaS0laT4gc3JiPSVwXG4iLAorCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCBzcmIpOworCWxpc3RfYWRkKCZzcmItPmxpc3QsICZkY2ItPnNyYl93YWl0aW5nX2xpc3QpOworfQorCisKK3N0YXRpYyB2b2lkIHNyYl93YWl0aW5nX2FwcGVuZChzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJZHByaW50a2RiZyhEQkdfMCwgInNyYl93YWl0aW5nX2FwcGVuZDogKHBpZCMlbGkpIDwlMDJpLSVpPiBzcmI9JXBcbiIsCisJCSBzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCBzcmIpOworCWxpc3RfYWRkX3RhaWwoJnNyYi0+bGlzdCwgJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCk7Cit9CisKKworc3RhdGljIHZvaWQgc3JiX2dvaW5nX2FwcGVuZChzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJZHByaW50a2RiZyhEQkdfMCwgInNyYl9nb2luZ19hcHBlbmQ6IChwaWQjJWxpKSA8JTAyaS0laT4gc3JiPSVwXG4iLAorCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCBzcmIpOworCWxpc3RfYWRkX3RhaWwoJnNyYi0+bGlzdCwgJmRjYi0+c3JiX2dvaW5nX2xpc3QpOworfQorCisKK3N0YXRpYyB2b2lkIHNyYl9nb2luZ19yZW1vdmUoc3RydWN0IERldmljZUN0bEJsayAqZGNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBTY3NpUmVxQmxrICppOworCXN0cnVjdCBTY3NpUmVxQmxrICp0bXA7CisJZHByaW50a2RiZyhEQkdfMCwgInNyYl9nb2luZ19yZW1vdmU6IChwaWQjJWxpKSA8JTAyaS0laT4gc3JiPSVwXG4iLAorCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCBzcmIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJmRjYi0+c3JiX2dvaW5nX2xpc3QsIGxpc3QpCisJCWlmIChpID09IHNyYikgeworCQkJbGlzdF9kZWwoJnNyYi0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorfQorCisKK3N0YXRpYyB2b2lkIHNyYl93YWl0aW5nX3JlbW92ZShzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3RydWN0IFNjc2lSZXFCbGsgKmk7CisJc3RydWN0IFNjc2lSZXFCbGsgKnRtcDsKKwlkcHJpbnRrZGJnKERCR18wLCAic3JiX3dhaXRpbmdfcmVtb3ZlOiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpLCB0bXAsICZkY2ItPnNyYl93YWl0aW5nX2xpc3QsIGxpc3QpCisJCWlmIChpID09IHNyYikgeworCQkJbGlzdF9kZWwoJnNyYi0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorfQorCisKK3N0YXRpYyB2b2lkIHNyYl9nb2luZ190b193YWl0aW5nX21vdmUoc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCWRwcmludGtkYmcoREJHXzAsCisJCSJzcmJfZ29pbmdfdG9fd2FpdGluZ19tb3ZlOiAocGlkIyVsaSkgPCUwMmktJWk+IHNyYj0lcFxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1biwgc3JiKTsKKwlsaXN0X21vdmUoJnNyYi0+bGlzdCwgJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCk7Cit9CisKKworc3RhdGljIHZvaWQgc3JiX3dhaXRpbmdfdG9fZ29pbmdfbW92ZShzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJZHByaW50a2RiZyhEQkdfMCwKKwkJInNyYl93YWl0aW5nX3RvX2dvaW5nX21vdmU6IChwaWQjJWxpKSA8JTAyaS0laT4gc3JiPSVwXG4iLAorCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCBzcmIpOworCWxpc3RfbW92ZSgmc3JiLT5saXN0LCAmZGNiLT5zcmJfZ29pbmdfbGlzdCk7Cit9CisKKworLyogU2V0cyB0aGUgdGltZXIgdG8gd2FrZSB1cyB1cCAqLworc3RhdGljIHZvaWQgd2FpdGluZ19zZXRfdGltZXIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgdW5zaWduZWQgbG9uZyB0bykKK3sKKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT53YWl0aW5nX3RpbWVyKSkKKwkJcmV0dXJuOworCWluaXRfdGltZXIoJmFjYi0+d2FpdGluZ190aW1lcik7CisJYWNiLT53YWl0aW5nX3RpbWVyLmZ1bmN0aW9uID0gd2FpdGluZ190aW1lb3V0OworCWFjYi0+d2FpdGluZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFjYjsKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcyArIHRvLCBhY2ItPnNjc2lfaG9zdC0+bGFzdF9yZXNldCAtIEhaIC8gMikpCisJCWFjYi0+d2FpdGluZ190aW1lci5leHBpcmVzID0KKwkJICAgIGFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0IC0gSFogLyAyICsgMTsKKwllbHNlCisJCWFjYi0+d2FpdGluZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIHRvICsgMTsKKwlhZGRfdGltZXIoJmFjYi0+d2FpdGluZ190aW1lcik7Cit9CisKKworLyogU2VuZCB0aGUgbmV4dCBjb21tYW5kIGZyb20gdGhlIHdhaXRpbmcgbGlzdCB0byB0aGUgYnVzICovCitzdGF0aWMgdm9pZCB3YWl0aW5nX3Byb2Nlc3NfbmV4dChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKnN0YXJ0ID0gTlVMTDsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpwb3M7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBTY3NpUmVxQmxrICpzcmI7CisJc3RydWN0IGxpc3RfaGVhZCAqZGNiX2xpc3RfaGVhZCA9ICZhY2ItPmRjYl9saXN0OworCisJaWYgKGFjYi0+YWN0aXZlX2RjYgorCSAgICB8fCAoYWNiLT5hY2JfZmxhZyAmIChSRVNFVF9ERVRFQ1QgKyBSRVNFVF9ET05FICsgUkVTRVRfREVWKSkpCisJCXJldHVybjsKKworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPndhaXRpbmdfdGltZXIpKQorCQlkZWxfdGltZXIoJmFjYi0+d2FpdGluZ190aW1lcik7CisKKwlpZiAobGlzdF9lbXB0eShkY2JfbGlzdF9oZWFkKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaW5kIHRoZSBzdGFydGluZyBkY2IuIE5lZWQgdG8gZmluZCBpdCBhZ2FpbiBpbiB0aGUgbGlzdAorCSAqIHNpbmNlIHRoZSBsaXN0IG1heSBoYXZlIGNoYW5nZWQgc2luY2Ugd2Ugc2V0IHRoZSBwdHIgdG8gaXQKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYiwgZGNiX2xpc3RfaGVhZCwgbGlzdCkKKwkJaWYgKGRjYiA9PSBhY2ItPmRjYl9ydW5fcm9iaW4pIHsKKwkJCXN0YXJ0ID0gZGNiOworCQkJYnJlYWs7CisJCX0KKwlpZiAoIXN0YXJ0KSB7CisJCS8qIFRoaXMgY2FuIGhhcHBlbiEgKi8KKwkJc3RhcnQgPSBsaXN0X2VudHJ5KGRjYl9saXN0X2hlYWQtPm5leHQsIHR5cGVvZigqc3RhcnQpLCBsaXN0KTsKKwkJYWNiLT5kY2JfcnVuX3JvYmluID0gc3RhcnQ7CisJfQorCisKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgZGNiLCBidXQgd2Ugc3RhcnQgc29tZXdoZXJlIChwb3RlbnRpYWxseSkgaW4KKwkgKiB0aGUgbWlkZGxlIG9mIHRoZSBsb29wIHNvIHdlIG5lZWQgdG8gbWFudWxseSBkbyB0aGlzLgorCSAqLworCXBvcyA9IHN0YXJ0OworCWRvIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqd2FpdGluZ19saXN0X2hlYWQgPSAmcG9zLT5zcmJfd2FpdGluZ19saXN0OworCisJCS8qIE1ha2Ugc3VyZSwgdGhlIG5leHQgYW5vdGhlciBkZXZpY2UgZ2V0cyBzY2hlZHVsZWQgLi4uICovCisJCWFjYi0+ZGNiX3J1bl9yb2JpbiA9IGRjYl9nZXRfbmV4dChkY2JfbGlzdF9oZWFkLAorCQkJCQkJICBhY2ItPmRjYl9ydW5fcm9iaW4pOworCisJCWlmIChsaXN0X2VtcHR5KHdhaXRpbmdfbGlzdF9oZWFkKSB8fAorCQkgICAgcG9zLT5tYXhfY29tbWFuZCA8PSBsaXN0X3NpemUoJnBvcy0+c3JiX2dvaW5nX2xpc3QpKSB7CisJCQkvKiBtb3ZlIHRvIG5leHQgZGNiICovCisJCQlwb3MgPSBkY2JfZ2V0X25leHQoZGNiX2xpc3RfaGVhZCwgcG9zKTsKKwkJfSBlbHNlIHsKKwkJCXNyYiA9IGxpc3RfZW50cnkod2FpdGluZ19saXN0X2hlYWQtPm5leHQsCisJCQkJCSBzdHJ1Y3QgU2NzaVJlcUJsaywgbGlzdCk7CisKKwkJCS8qIFRyeSB0byBzZW5kIHRvIHRoZSBidXMgKi8KKwkJCWlmICghc3RhcnRfc2NzaShhY2IsIHBvcywgc3JiKSkKKwkJCQlzcmJfd2FpdGluZ190b19nb2luZ19tb3ZlKHBvcywgc3JiKTsKKwkJCWVsc2UKKwkJCQl3YWl0aW5nX3NldF90aW1lcihhY2IsIEhaLzUwKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocG9zICE9IHN0YXJ0KTsKK30KKworCisvKiBXYWtlIHVwIHdhaXRpbmcgcXVldWUgKi8KK3N0YXRpYyB2b2lkIHdhaXRpbmdfdGltZW91dCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKilwdHI7CisJZHByaW50a2RiZyhEQkdfMSwKKwkJIndhaXRpbmdfdGltZW91dDogUXVldWUgd29rZW4gdXAgYnkgdGltZXIuIGFjYj0lcFxuIiwgYWNiKTsKKwlEQzM5NXhfTE9DS19JTyhhY2ItPnNjc2lfaG9zdCwgZmxhZ3MpOworCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7CisJREMzOTV4X1VOTE9DS19JTyhhY2ItPnNjc2lfaG9zdCwgZmxhZ3MpOworfQorCisKKy8qIEdldCB0aGUgRENCIGZvciBhIGdpdmVuIElEL0xVTiBjb21iaW5hdGlvbiAqLworc3RhdGljIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmZpbmRfZGNiKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHU4IGlkLCB1OCBsdW4pCit7CisJcmV0dXJuIGFjYi0+Y2hpbGRyZW5baWRdW2x1bl07Cit9CisKKworLyogU2VuZCBTQ1NJIFJlcXVlc3QgQmxvY2sgKHNyYikgdG8gYWRhcHRlciAoYWNiKSAqLworc3RhdGljIHZvaWQgc2VuZF9zcmIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBzcmItPmRjYjsKKworCWlmIChkY2ItPm1heF9jb21tYW5kIDw9IGxpc3Rfc2l6ZSgmZGNiLT5zcmJfZ29pbmdfbGlzdCkgfHwKKwkgICAgYWNiLT5hY3RpdmVfZGNiIHx8CisJICAgIChhY2ItPmFjYl9mbGFnICYgKFJFU0VUX0RFVEVDVCArIFJFU0VUX0RPTkUgKyBSRVNFVF9ERVYpKSkgeworCQlzcmJfd2FpdGluZ19hcHBlbmQoZGNiLCBzcmIpOworCQl3YWl0aW5nX3Byb2Nlc3NfbmV4dChhY2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFzdGFydF9zY3NpKGFjYiwgZGNiLCBzcmIpKQorCQlzcmJfZ29pbmdfYXBwZW5kKGRjYiwgc3JiKTsKKwllbHNlIHsKKwkJc3JiX3dhaXRpbmdfaW5zZXJ0KGRjYiwgc3JiKTsKKwkJd2FpdGluZ19zZXRfdGltZXIoYWNiLCBIWiAvIDUwKTsKKwl9Cit9CisKKworLyogUHJlcGFyZSBTUkIgZm9yIGJlaW5nIHNlbnQgdG8gRGV2aWNlIERDQiB3LyBjb21tYW5kICpjbWQgKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX3NyYihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCWRwcmludGtkYmcoREJHXzAsICJidWlsZF9zcmI6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCWNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKworCXNyYi0+ZGNiID0gZGNiOworCXNyYi0+Y21kID0gY21kOworCXNyYi0+c2dfY291bnQgPSAwOworCXNyYi0+dG90YWxfeGZlcl9sZW5ndGggPSAwOworCXNyYi0+c2dfYnVzX2FkZHIgPSAwOworCXNyYi0+dmlydF9hZGRyID0gTlVMTDsKKwlzcmItPnNnX2luZGV4ID0gMDsKKwlzcmItPmFkYXB0ZXJfc3RhdHVzID0gMDsKKwlzcmItPnRhcmdldF9zdGF0dXMgPSAwOworCXNyYi0+bXNnX2NvdW50ID0gMDsKKwlzcmItPnN0YXR1cyA9IDA7CisJc3JiLT5mbGFnID0gMDsKKwlzcmItPnN0YXRlID0gMDsKKwlzcmItPnJldHJ5X2NvdW50ID0gMDsKKwlzcmItPnRhZ19udW1iZXIgPSBUQUdfTk9ORTsKKwlzcmItPnNjc2lfcGhhc2UgPSBQSF9CVVNfRlJFRTsJLyogaW5pdGlhbCBwaGFzZSAqLworCXNyYi0+ZW5kX21lc3NhZ2UgPSAwOworCisJaWYgKGRpciA9PSBQQ0lfRE1BX05PTkUgfHwgIWNtZC0+cmVxdWVzdF9idWZmZXIpIHsKKwkJZHByaW50a2RiZyhEQkdfMCwKKwkJCSJidWlsZF9zcmI6IFswXSBsZW49JWQgYnVmPSVwIHVzZV9zZz0lZCAhTUFQPSUwOHhcbiIsCisJCQljbWQtPmJ1ZmZsZW4sIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQljbWQtPnVzZV9zZywgc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcyk7CisJfSBlbHNlIGlmIChjbWQtPnVzZV9zZykgeworCQlpbnQgaTsKKwkJdTMyIHJlcWxlbiA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKQorCQkJCQkgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJc3RydWN0IFNHZW50cnkgKnNncCA9IHNyYi0+c2VnbWVudF94OworCQlzcmItPnNnX2NvdW50ID0gcGNpX21hcF9zZyhkY2ItPmFjYi0+ZGV2LCBzbCwgY21kLT51c2Vfc2csCisJCQkJCSAgIGRpcik7CisJCWRwcmludGtkYmcoREJHXzAsCisJCQkiYnVpbGRfc3JiOiBbbl0gbGVuPSVkIGJ1Zj0lcCB1c2Vfc2c9JWQgc2Vncz0lZFxuIiwKKwkJCXJlcWxlbiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT51c2Vfc2csCisJCQlzcmItPnNnX2NvdW50KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc3JiLT5zZ19jb3VudDsgaSsrKSB7CisJCQl1MzIgc2VnbGVuID0gKHUzMilzZ19kbWFfbGVuKHNsICsgaSk7CisJCQlzZ3BbaV0uYWRkcmVzcyA9ICh1MzIpc2dfZG1hX2FkZHJlc3Moc2wgKyBpKTsKKwkJCXNncFtpXS5sZW5ndGggPSBzZWdsZW47CisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoICs9IHNlZ2xlbjsKKwkJCXNyYi0+dmlydF9tYXBbaV0gPSBrbWFwKHNsW2ldLnBhZ2UpOworCQl9CisJCXNyYi0+dmlydF9hZGRyID0gc3JiLT52aXJ0X21hcFswXTsKKwkJc2dwICs9IHNyYi0+c2dfY291bnQgLSAxOworCisJCS8qCisJCSAqIGFkanVzdCBsYXN0IHBhZ2UgaWYgdG9vIGJpZyBhcyBpdCBpcyBhbGxvY2F0ZWQKKwkJICogb24gZXZlbiBwYWdlIGJvdW5kYXJpZXMKKwkJICovCisJCWlmIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID4gcmVxbGVuKSB7CisJCQlzZ3AtPmxlbmd0aCAtPSAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCAtIHJlcWxlbik7CisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID0gcmVxbGVuOworCQl9CisKKwkJLyogRml4dXAgZm9yIFdJREUgcGFkZGluZyAtIG1ha2Ugc3VyZSBsZW5ndGggaXMgZXZlbiAqLworCQlpZiAoZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQyAmJgorCQkgICAgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCAlIDIpIHsKKwkJCXNyYi0+dG90YWxfeGZlcl9sZW5ndGgrKzsKKwkJCXNncC0+bGVuZ3RoKys7CisJCX0KKworCQlzcmItPnNnX2J1c19hZGRyID0gcGNpX21hcF9zaW5nbGUoZGNiLT5hY2ItPmRldiwKKwkJCQkJCXNyYi0+c2VnbWVudF94LAorCQkJCSAgICAgICAgICAgIAlTRUdNRU5UWF9MRU4sCisJCQkJICAgICAgICAgICAgCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWRwcmludGtkYmcoREJHX1NHLCAiYnVpbGRfc3JiOiBbbl0gbWFwIHNnICVwLT4lMDh4KCUwNXgpXG4iLAorCQkJc3JiLT5zZWdtZW50X3gsIHNyYi0+c2dfYnVzX2FkZHIsIFNFR01FTlRYX0xFTik7CisJfSBlbHNlIHsKKwkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlzcmItPnNnX2NvdW50ID0gMTsKKwkJc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcyA9CisJCQlwY2lfbWFwX3NpbmdsZShkY2ItPmFjYi0+ZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSAgICAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoLCBkaXIpOworCisJCS8qIEZpeHVwIGZvciBXSURFIHBhZGRpbmcgLSBtYWtlIHN1cmUgbGVuZ3RoIGlzIGV2ZW4gKi8KKwkJaWYgKGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMgJiYgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCAlIDIpCisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKys7CisKKwkJc3JiLT5zZWdtZW50X3hbMF0ubGVuZ3RoID0gc3JiLT50b3RhbF94ZmVyX2xlbmd0aDsKKwkJc3JiLT52aXJ0X2FkZHIgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlkcHJpbnRrZGJnKERCR18wLAorCQkJImJ1aWxkX3NyYjogWzFdIGxlbj0lZCBidWY9JXAgdXNlX3NnPSVkIG1hcD0lMDh4XG4iLAorCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCWNtZC0+dXNlX3NnLCBzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzKTsKKwl9Cit9CisKKworLyoqCisgKiBkYzM5NXhfcXVldWVfY29tbWFuZCAtIHF1ZXVlIHNjc2kgY29tbWFuZCBwYXNzZWQgZnJvbSB0aGUgbWlkCisgKiBsYXllciwgaW52b2tlICdkb25lJyBvbiBjb21wbGV0aW9uCisgKgorICogQGNtZDogcG9pbnRlciB0byBzY3NpIGNvbW1hbmQgb2JqZWN0CisgKiBAZG9uZTogZnVuY3Rpb24gcG9pbnRlciB0byBiZSBpbnZva2VkIG9uIGNvbXBsZXRpb24KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIGFkYXB0ZXIgKGhvc3QpIGlzIGJ1c3ksIGVsc2UgcmV0dXJucyAwLiBPbmUKKyAqIHJlYXNvbiBmb3IgYW4gYWRhcHRlciB0byBiZSBidXN5IGlzIHRoYXQgdGhlIG51bWJlcgorICogb2Ygb3V0c3RhbmRpbmcgcXVldWVkIGNvbW1hbmRzIGlzIGFscmVhZHkgZXF1YWwgdG8KKyAqIHN0cnVjdCBTY3NpX0hvc3Q6OmNhbl9xdWV1ZSAuCisgKgorICogUmVxdWlyZWQ6IGlmIHN0cnVjdCBTY3NpX0hvc3Q6OmNhbl9xdWV1ZSBpcyBldmVyIG5vbi16ZXJvCisgKiAgICAgICAgICAgdGhlbiB0aGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkLgorICoKKyAqIExvY2tzOiBzdHJ1Y3QgU2NzaV9Ib3N0Ojpob3N0X2xvY2sgaGVsZCBvbiBlbnRyeSAod2l0aCAiaXJxc2F2ZSIpCisgKiAgICAgICAgYW5kIGlzIGV4cGVjdGVkIHRvIGJlIGhlbGQgb24gcmV0dXJuLgorICoKKyAqKi8KK3N0YXRpYyBpbnQgZGMzOTV4X3F1ZXVlX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisJc3RydWN0IFNjc2lSZXFCbGsgKnNyYjsKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0KKwkgICAgKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWRwcmludGtkYmcoREJHXzAsICJxdWV1ZV9jb21tYW5kOiAocGlkIyVsaSkgPCUwMmktJWk+IGNtbmQ9MHglMDJ4XG4iLAorCQljbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOworCisJLyogQXNzdW1lIEJBRF9UQVJHRVQ7IHdpbGwgYmUgY2xlYXJlZCBsYXRlciAqLworCWNtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisKKwkvKiBpZ25vcmUgaW52YWxpZCB0YXJnZXRzICovCisJaWYgKGNtZC0+ZGV2aWNlLT5pZCA+PSBhY2ItPnNjc2lfaG9zdC0+bWF4X2lkIHx8CisJICAgIGNtZC0+ZGV2aWNlLT5sdW4gPj0gYWNiLT5zY3NpX2hvc3QtPm1heF9sdW4gfHwKKwkgICAgY21kLT5kZXZpY2UtPmx1biA+MzEpIHsKKwkJZ290byBjb21wbGV0ZTsKKwl9CisKKwkvKiBkb2VzIHRoZSBzcGVjaWZpZWQgbHVuIG9uIHRoZSBzcGVjaWZpZWQgZGV2aWNlIGV4aXN0ICovCisJaWYgKCEoYWNiLT5kY2JfbWFwW2NtZC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCBjbWQtPmRldmljZS0+bHVuKSkpIHsKKwkJZHByaW50a2woS0VSTl9JTkZPLCAicXVldWVfY29tbWFuZDogSWdub3JlIHRhcmdldCA8JTAyaS0laT5cbiIsCisJCQljbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIGNvbXBsZXRlOworCX0KKworCS8qIGRvIHdlIGhhdmUgYSBEQ0IgZm9yIHRoZSBkZXZpY2UgKi8KKwlkY2IgPSBmaW5kX2RjYihhY2IsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJaWYgKCFkY2IpIHsKKwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlkcHJpbnRrbChLRVJOX0VSUiwgInF1ZXVlX2NvbW1hbmQ6IE5vIHN1Y2ggZGV2aWNlIDwlMDJpLSVpPiIsCisJCQljbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQlnb3RvIGNvbXBsZXRlOworCX0KKworCS8qIHNldCBjYWxsYmFjayBhbmQgY2xlYXIgcmVzdWx0IGluIHRoZSBjb21tYW5kICovCisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCWNtZC0+cmVzdWx0ID0gMDsKKworCXNyYiA9IHNyYl9nZXRfZnJlZShhY2IpOworCWlmICghc3JiKQorCXsKKwkJLyoKKwkJICogUmV0dXJuIDEgc2luY2Ugd2UgYXJlIHVuYWJsZSB0byBxdWV1ZSB0aGlzIGNvbW1hbmQgYXQgdGhpcworCQkgKiBwb2ludCBpbiB0aW1lLgorCQkgKi8KKwkJZHByaW50a2RiZyhEQkdfMCwgInF1ZXVlX2NvbW1hbmQ6IE5vIGZyZWUgc3JiJ3NcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlidWlsZF9zcmIoY21kLCBkY2IsIHNyYik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCkpIHsKKwkJLyogYXBwZW5kIHRvIHdhaXRpbmcgcXVldWUgKi8KKwkJc3JiX3dhaXRpbmdfYXBwZW5kKGRjYiwgc3JiKTsKKwkJd2FpdGluZ19wcm9jZXNzX25leHQoYWNiKTsKKwl9IGVsc2UgeworCQkvKiBwcm9jZXNzIGltbWVkaWF0ZWx5ICovCisJCXNlbmRfc3JiKGFjYiwgc3JiKTsKKwl9CisJZHByaW50a2RiZyhEQkdfMSwgInF1ZXVlX2NvbW1hbmQ6IChwaWQjJWxpKSBkb25lXG4iLCBjbWQtPnBpZCk7CisJcmV0dXJuIDA7CisKK2NvbXBsZXRlOgorCS8qCisJICogQ29tcGxldGUgdGhlIGNvbW1hbmQgaW1tZWRpYXRleSwgYW5kIHRoZW4gcmV0dXJuIDAgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgaGFuZGxlZCB0aGUgY29tbWFuZC4gVGhpcyBpcyB1c3VhbGx5CisJICogZG9uZSB3aGVuIHRoZSBjb21tYWQgaXMgZm9yIHRoaW5ncyBsaWtlIG5vbiBleGlzdGVudAorCSAqIGRldmljZXMuCisJICovCisJZG9uZShjbWQpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZXR1cm4gdGhlIGRpc2sgZ2VvbWV0cnkgZm9yIHRoZSBnaXZlbiBTQ1NJIGRldmljZS4KKyAqLworc3RhdGljIGludCBkYzM5NXhfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm8pCit7CisjaWZkZWYgQ09ORklHX1NDU0lfREMzOTV4X1RSTVMxMDQwX1RSQURNQVAKKwlpbnQgaGVhZHMsIHNlY3RvcnMsIGN5bGluZGVyczsKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiOworCWludCBzaXplID0gY2FwYWNpdHk7CisKKwlkcHJpbnRrZGJnKERCR18wLCAiZGMzOTV4X2Jpb3NfcGFyYW0uLi4uLi4uLi4uLi4uLlxuIik7CisJYWNiID0gKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisJY3lsaW5kZXJzID0gc2l6ZSAvIChoZWFkcyAqIHNlY3RvcnMpOworCisJaWYgKChhY2ItPmdtb2RlMiAmIE5BQ19HUkVBVEVSXzFHKSAmJiAoY3lsaW5kZXJzID4gMTAyNCkpIHsKKwkJaGVhZHMgPSAyNTU7CisJCXNlY3RvcnMgPSA2MzsKKwkJY3lsaW5kZXJzID0gc2l6ZSAvIChoZWFkcyAqIHNlY3RvcnMpOworCX0KKwlnZW9tWzBdID0gaGVhZHM7CisJZ2VvbVsxXSA9IHNlY3RvcnM7CisJZ2VvbVsyXSA9IGN5bGluZGVyczsKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIHNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBjYXBhY2l0eSwgaW5mbyk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBkdW1wX3JlZ2lzdGVyX2luZm8oc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IERldmljZUN0bEJsayAqZGNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXUxNiBwc3RhdDsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYWNiLT5kZXY7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1RBVFVTLCAmcHN0YXQpOworCWlmICghZGNiKQorCQlkY2IgPSBhY2ItPmFjdGl2ZV9kY2I7CisJaWYgKCFzcmIgJiYgZGNiKQorCQlzcmIgPSBkY2ItPmFjdGl2ZV9zcmI7CisJaWYgKHNyYikgeworCQlpZiAoIXNyYi0+Y21kKQorCQkJZHByaW50a2woS0VSTl9JTkZPLCAiZHVtcDogc3JiPSVwIGNtZD0lcCBPT09QUyFcbiIsCisJCQkJc3JiLCBzcmItPmNtZCk7CisJCWVsc2UKKwkJCWRwcmludGtsKEtFUk5fSU5GTywgImR1bXA6IHNyYj0lcCBjbWQ9JXAgKHBpZCMlbGkpICIKKwkJCQkgImNtbmQ9MHglMDJ4IDwlMDJpLSVpPlxuIiwKKwkJCSAgICAJc3JiLCBzcmItPmNtZCwgc3JiLT5jbWQtPnBpZCwKKwkJCQlzcmItPmNtZC0+Y21uZFswXSwgc3JiLT5jbWQtPmRldmljZS0+aWQsCisJCQkgICAgICAgCXNyYi0+Y21kLT5kZXZpY2UtPmx1bik7CisJCXByaW50aygiICBzZ2xpc3Q9JXAgY250PSVpIGlkeD0laSBsZW49JWlcbiIsCisJCSAgICAgICBzcmItPnNlZ21lbnRfeCwgc3JiLT5zZ19jb3VudCwgc3JiLT5zZ19pbmRleCwKKwkJICAgICAgIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCQlwcmludGsoIiAgc3RhdGU9MHglMDR4IHN0YXR1cz0weCUwMnggcGhhc2U9MHglMDJ4ICglc2Nvbm4uKVxuIiwKKwkJICAgICAgIHNyYi0+c3RhdGUsIHNyYi0+c3RhdHVzLCBzcmItPnNjc2lfcGhhc2UsCisJCSAgICAgICAoYWNiLT5hY3RpdmVfZGNiKSA/ICIiIDogIm5vdCIpOworCX0KKwlkcHJpbnRrbChLRVJOX0lORk8sICJkdW1wOiBTQ1NJe3N0YXR1cz0weCUwNHggZmlmb2NudD0weCUwMnggIgorCQkic2lnbmFscz0weCUwMnggaXJxc3RhdD0weCUwMnggc3luYz0weCUwMnggdGFyZ2V0PTB4JTAyeCAiCisJCSJyc2VsaWQ9MHglMDJ4IGN0cj0weCUwOHggaXJxZW49MHglMDJ4IGNvbmZpZz0weCUwNHggIgorCQkiY29uZmlnMj0weCUwMnggY21kPTB4JTAyeCBzZWx0bz0weCUwMnh9XG4iLAorCQlEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfU1RBVFVTKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NJR05BTCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVFNUQVRVUyksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NZTkMpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9UQVJHRVRJRCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lETVNHKSwKKwkJREMzOTV4X3JlYWQzMihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRFTiksCisJCURDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05GSUcwKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMiksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9USU1FT1VUKSk7CisJZHByaW50a2woS0VSTl9JTkZPLCAiZHVtcDogRE1Be2NtZD0weCUwNHggZmlmb2NudD0weCUwMnggZnN0YXQ9MHglMDJ4ICIKKwkJImlycXN0YXQ9MHglMDJ4IGlycWVuPTB4JTAyeCBjZmc9MHglMDR4IHRjdHI9MHglMDh4ICIKKwkJImN0Y3RyPTB4JTA4eCBhZGRyPTB4JTA4eDoweCUwOHh9XG4iLAorCQlEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX0RNQV9DT01NQU5EKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPQ05UKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPU1RBVCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfU1RBVFVTKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9JTlRFTiksCisJCURDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTkZJRyksCisJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hDTlQpLAorCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX0RNQV9DWENOVCksCisJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hISUdIQUREUiksCisJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hMT1dBRERSKSk7CisJZHByaW50a2woS0VSTl9JTkZPLCAiZHVtcDogZ2Vue2djdHJsPTB4JTAyeCBnc3RhdD0weCUwMnggZ3Rtcj0weCUwMnh9ICIKKwkJInBjaXtzdGF0dXM9MHglMDR4fVxuIiwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0dFTl9DT05UUk9MKSwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0dFTl9TVEFUVVMpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfR0VOX1RJTUVSKSwKKwkJcHN0YXQpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9maWZvKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIGNoYXIgKnR4dCkKK3sKKyNpZiBkZWJ1Z19lbmFibGVkKERCR19GSUZPKQorCXU4IGxpbmVzID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfU0lHTkFMKTsKKwl1OCBmaWZvY250ID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCk7CisJaWYgKCEoZmlmb2NudCAmIDB4NDApKQorCQlkcHJpbnRrZGJnKERCR19GSUZPLAorCQkJImNsZWFyX2ZpZm86ICglaSBieXRlcykgb24gcGhhc2UgJTAyeCBpbiAlc1xuIiwKKwkJCWZpZm9jbnQgJiAweDNmLCBsaW5lcywgdHh0KTsKKyNlbmRpZgorCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fQ0xSRklGTyk7Cit9CisKKworc3RhdGljIHZvaWQgcmVzZXRfZGV2X3BhcmFtKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSA9ICZhY2ItPmVlcHJvbTsKKwlkcHJpbnRrZGJnKERCR18wLCAicmVzZXRfZGV2X3BhcmFtOiBhY2I9JXBcbiIsIGFjYik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYiwgJmFjYi0+ZGNiX2xpc3QsIGxpc3QpIHsKKwkJdTggcGVyaW9kX2luZGV4OworCisJCWRjYi0+c3luY19tb2RlICY9IH4oU1lOQ19ORUdPX0RPTkUgKyBXSURFX05FR09fRE9ORSk7CisJCWRjYi0+c3luY19wZXJpb2QgPSAwOworCQlkY2ItPnN5bmNfb2Zmc2V0ID0gMDsKKworCQlkY2ItPmRldl9tb2RlID0gZWVwcm9tLT50YXJnZXRbZGNiLT50YXJnZXRfaWRdLmNmZzA7CisJCXBlcmlvZF9pbmRleCA9IGVlcHJvbS0+dGFyZ2V0W2RjYi0+dGFyZ2V0X2lkXS5wZXJpb2QgJiAweDA3OworCQlkY2ItPm1pbl9uZWdvX3BlcmlvZCA9IGNsb2NrX3BlcmlvZFtwZXJpb2RfaW5kZXhdOworCQlpZiAoIShkY2ItPmRldl9tb2RlICYgTlRDX0RPX1dJREVfTkVHTykKKwkJICAgIHx8ICEoYWNiLT5jb25maWcgJiBIQ0NfV0lERV9DQVJEKSkKKwkJCWRjYi0+c3luY19tb2RlICY9IH5XSURFX05FR09fRU5BQkxFOworCX0KK30KKworCisvKgorICogcGVyZm9ybSBhIGhhcmQgcmVzZXQgb24gdGhlIFNDU0kgYnVzCisgKiBAY21kIC0gc29tZSBjb21tYW5kIGZvciB0aGlzIGhvc3QgKGZvciBmZXRjaGluZyBob29rcykKKyAqIFJldHVybnM6IFNVQ0NFU1MgKDB4MjAwMikgb24gc3VjY2VzcywgZWxzZSBGQUlMRUQgKDB4MjAwMykuCisgKi8KK3N0YXRpYyBpbnQgZGMzOTV4X2VoX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9CisJCShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlkcHJpbnRrbChLRVJOX0lORk8sCisJCSJlaF9idXNfcmVzZXQ6IChwaWQjJWxpKSB0YXJnZXQ9PCUwMmktJWk+IGNtZD0lcFxuIiwKKwkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kKTsKKworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPndhaXRpbmdfdGltZXIpKQorCQlkZWxfdGltZXIoJmFjYi0+d2FpdGluZ190aW1lcik7CisKKwkvKgorCSAqIGRpc2FibGUgaW50ZXJydXB0ICAgIAorCSAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0lOVEVOLCAweDAwKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5URU4sIDB4MDApOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19SU1RNT0RVTEUpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIERNQVJFU0VUTU9EVUxFKTsKKworCXJlc2V0X3Njc2lfYnVzKGFjYik7CisJdWRlbGF5KDUwMCk7CisKKwkvKiBXZSBtYXkgYmUgaW4gc2VyaW91cyB0cm91YmxlLiBXYWl0IHNvbWUgc2Vjb25kcyAqLworCWFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0ID0KKwkgICAgamlmZmllcyArIDMgKiBIWiAvIDIgKworCSAgICBIWiAqIGFjYi0+ZWVwcm9tLmRlbGF5X3RpbWU7CisKKwkvKgorCSAqIHJlLWVuYWJsZSBpbnRlcnJ1cHQgICAgICAKKwkgKi8KKwkvKiBDbGVhciBTQ1NJIEZJRk8gICAgICAgICAgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05UUk9MLCBDTFJYRklGTyk7CisJY2xlYXJfZmlmbyhhY2IsICJlaF9idXNfcmVzZXQiKTsKKwkvKiBEZWxldGUgcGVuZGluZyBJUlEgKi8KKwlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRTVEFUVVMpOworCXNldF9iYXNpY19jb25maWcoYWNiKTsKKworCXJlc2V0X2Rldl9wYXJhbShhY2IpOworCWRvaW5nX3NyYl9kb25lKGFjYiwgRElEX1JFU0VULCBjbWQsIDApOworCWFjYi0+YWN0aXZlX2RjYiA9IE5VTEw7CisJYWNiLT5hY2JfZmxhZyA9IDA7CS8qIFJFU0VUX0RFVEVDVCwgUkVTRVRfRE9ORSAsUkVTRVRfREVWICovCisJd2FpdGluZ19wcm9jZXNzX25leHQoYWNiKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisKKy8qCisgKiBhYm9ydCBhbiBlcnJhbnQgU0NTSSBjb21tYW5kCisgKiBAY21kIC0gY29tbWFuZCB0byBiZSBhYm9ydGVkCisgKiBSZXR1cm5zOiBTVUNDRVNTICgweDIwMDIpIG9uIHN1Y2Nlc3MsIGVsc2UgRkFJTEVEICgweDIwMDMpLgorICovCitzdGF0aWMgaW50IGRjMzk1eF9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJLyoKKwkgKiBMb29rIGludG8gb3VyIGNvbW1hbmQgcXVldWVzOiBJZiBpdCBoYXMgbm90IGJlZW4gc2VudCBhbHJlYWR5LAorCSAqIHdlIHJlbW92ZSBpdCBhbmQgcmV0dXJuIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgorCSAqLworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPQorCSAgICAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBTY3NpUmVxQmxrICpzcmI7CisJZHByaW50a2woS0VSTl9JTkZPLCAiZWhfYWJvcnQ6IChwaWQjJWxpKSB0YXJnZXQ9PCUwMmktJWk+IGNtZD0lcFxuIiwKKwkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kKTsKKworCWRjYiA9IGZpbmRfZGNiKGFjYiwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwlpZiAoIWRjYikgeworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiZWhfYWJvcnQ6IE5vIHN1Y2ggZGV2aWNlXG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlzcmIgPSBmaW5kX2NtZChjbWQsICZkY2ItPnNyYl93YWl0aW5nX2xpc3QpOworCWlmIChzcmIpIHsKKwkJc3JiX3dhaXRpbmdfcmVtb3ZlKGRjYiwgc3JiKTsKKwkJcGNpX3VubWFwX3NyYl9zZW5zZShhY2IsIHNyYik7CisJCXBjaV91bm1hcF9zcmIoYWNiLCBzcmIpOworCQlmcmVlX3RhZyhkY2IsIHNyYik7CisJCXNyYl9mcmVlX2luc2VydChhY2IsIHNyYik7CisJCWRwcmludGtsKEtFUk5fREVCVUcsICJlaF9hYm9ydDogQ29tbWFuZCB3YXMgd2FpdGluZ1xuIik7CisJCWNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJc3JiID0gZmluZF9jbWQoY21kLCAmZGNiLT5zcmJfZ29pbmdfbGlzdCk7CisJaWYgKHNyYikgeworCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAiZWhfYWJvcnQ6IENvbW1hbmQgaW4gcHJvZ3Jlc3MiKTsKKwkJLyogWFhYOiBTaG91bGQgYWJvcnQgdGhlIGNvbW1hbmQgaGVyZSAqLworCX0gZWxzZSB7CisJCWRwcmludGtsKEtFUk5fREVCVUcsICJlaF9hYm9ydDogQ29tbWFuZCBub3QgZm91bmQiKTsKKwl9CisJcmV0dXJuIEZBSUxFRDsKK30KKworCisvKiBTRFRSICovCitzdGF0aWMgdm9pZCBidWlsZF9zZHRyKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwl1OCAqcHRyID0gc3JiLT5tc2dvdXRfYnVmICsgc3JiLT5tc2dfY291bnQ7CisJaWYgKHNyYi0+bXNnX2NvdW50ID4gMSkgeworCQlkcHJpbnRrbChLRVJOX0lORk8sCisJCQkiYnVpbGRfc2R0cjogbXNnb3V0X2J1ZiBCVVNZICglaTogJTAyeCAlMDJ4KVxuIiwKKwkJCXNyYi0+bXNnX2NvdW50LCBzcmItPm1zZ291dF9idWZbMF0sCisJCQlzcmItPm1zZ291dF9idWZbMV0pOworCQlyZXR1cm47CisJfQorCWlmICghKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fU1lOQ19ORUdPKSkgeworCQlkY2ItPnN5bmNfb2Zmc2V0ID0gMDsKKwkJZGNiLT5taW5fbmVnb19wZXJpb2QgPSAyMDAgPj4gMjsKKwl9IGVsc2UgaWYgKGRjYi0+c3luY19vZmZzZXQgPT0gMCkKKwkJZGNiLT5zeW5jX29mZnNldCA9IFNZTkNfTkVHT19PRkZTRVQ7CisKKwkqcHRyKysgPSBNU0dfRVhURU5ERUQ7CS8qICgwMWgpICovCisJKnB0cisrID0gMzsJCS8qIGxlbmd0aCAqLworCSpwdHIrKyA9IEVYVEVOREVEX1NEVFI7CS8qICgwMWgpICovCisJKnB0cisrID0gZGNiLT5taW5fbmVnb19wZXJpb2Q7CS8qIFRyYW5zZmVyIHBlcmlvZCAoaW4gNG5zKSAqLworCSpwdHIrKyA9IGRjYi0+c3luY19vZmZzZXQ7CS8qIFRyYW5zZmVyIHBlcmlvZCAobWF4LiBSRVEvQUNLIGRpc3QpICovCisJc3JiLT5tc2dfY291bnQgKz0gNTsKKwlzcmItPnN0YXRlIHw9IFNSQl9ET19TWU5DX05FR087Cit9CisKKworLyogV0RUUiAqLworc3RhdGljIHZvaWQgYnVpbGRfd2R0cihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJdTggd2lkZSA9ICgoZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19XSURFX05FR08pICYKKwkJICAgKGFjYi0+Y29uZmlnICYgSENDX1dJREVfQ0FSRCkpID8gMSA6IDA7CisJdTggKnB0ciA9IHNyYi0+bXNnb3V0X2J1ZiArIHNyYi0+bXNnX2NvdW50OworCWlmIChzcmItPm1zZ19jb3VudCA+IDEpIHsKKwkJZHByaW50a2woS0VSTl9JTkZPLAorCQkJImJ1aWxkX3dkdHI6IG1zZ291dF9idWYgQlVTWSAoJWk6ICUwMnggJTAyeClcbiIsCisJCQlzcmItPm1zZ19jb3VudCwgc3JiLT5tc2dvdXRfYnVmWzBdLAorCQkJc3JiLT5tc2dvdXRfYnVmWzFdKTsKKwkJcmV0dXJuOworCX0KKwkqcHRyKysgPSBNU0dfRVhURU5ERUQ7CS8qICgwMWgpICovCisJKnB0cisrID0gMjsJCS8qIGxlbmd0aCAqLworCSpwdHIrKyA9IEVYVEVOREVEX1dEVFI7CS8qICgwM2gpICovCisJKnB0cisrID0gd2lkZTsKKwlzcmItPm1zZ19jb3VudCArPSA0OworCXNyYi0+c3RhdGUgfD0gU1JCX0RPX1dJREVfTkVHTzsKK30KKworCisjaWYgMAorLyogVGltZXIgdG8gd29yayBhcm91bmQgY2hpcCBmbGF3OiBXaGVuIHNlbGVjdGluZyBhbmQgdGhlIGJ1cyBpcyAKKyAqIGJ1c3ksIHdlIHNvbWV0aW1lcyBtaXNzIGEgU2VsZWN0aW9uIHRpbWVvdXQgSVJRICovCit2b2lkIHNlbGVjdGlvbl90aW1lb3V0X21pc3NlZCh1bnNpZ25lZCBsb25nIHB0cik7CisvKiBTZXRzIHRoZSB0aW1lciB0byB3YWtlIHVzIHVwICovCitzdGF0aWMgdm9pZCBzZWx0b190aW1lcihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPnNlbHRvX3RpbWVyKSkKKwkJcmV0dXJuOworCWFjYi0+c2VsdG9fdGltZXIuZnVuY3Rpb24gPSBzZWxlY3Rpb25fdGltZW91dF9taXNzZWQ7CisJYWNiLT5zZWx0b190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFjYjsKKwlpZiAodGltZV9iZWZvcmUKKwkgICAgKGppZmZpZXMgKyBIWiwgYWNiLT5zY3NpX2hvc3QtPmxhc3RfcmVzZXQgKyBIWiAvIDIpKQorCQlhY2ItPnNlbHRvX3RpbWVyLmV4cGlyZXMgPQorCQkgICAgYWNiLT5zY3NpX2hvc3QtPmxhc3RfcmVzZXQgKyBIWiAvIDIgKyAxOworCWVsc2UKKwkJYWNiLT5zZWx0b190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaICsgMTsKKwlhZGRfdGltZXIoJmFjYi0+c2VsdG9fdGltZXIpOworfQorCisKK3ZvaWQgc2VsZWN0aW9uX3RpbWVvdXRfbWlzc2VkKHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKXB0cjsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiOworCWRwcmludGtsKEtFUk5fREVCVUcsICJDaGlwIGZvcmdvdCB0byBwcm9kdWNlIFNlbFRPIElSUSFcbiIpOworCWlmICghYWNiLT5hY3RpdmVfZGNiIHx8ICFhY2ItPmFjdGl2ZV9kY2ItPmFjdGl2ZV9zcmIpIHsKKwkJZHByaW50a2woS0VSTl9ERUJVRywgIi4uLiBidXQgbm8gY21kIHBlbmRpbmc/IE9vcHMhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlEQzM5NXhfTE9DS19JTyhhY2ItPnNjc2lfaG9zdCwgZmxhZ3MpOworCXNyYiA9IGFjYi0+YWN0aXZlX2RjYi0+YWN0aXZlX3NyYjsKKwlkaXNjb25uZWN0KGFjYik7CisJREMzOTV4X1VOTE9DS19JTyhhY2ItPnNjc2lfaG9zdCwgZmxhZ3MpOworfQorI2VuZGlmCisKKworc3RhdGljIHU4IHN0YXJ0X3Njc2koc3RydWN0IEFkYXB0ZXJDdGxCbGsqIGFjYiwgc3RydWN0IERldmljZUN0bEJsayogZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayogc3JiKQoreworCXUxNiBzX3N0YXQyLCByZXR1cm5fY29kZTsKKwl1OCBzX3N0YXQsIHNjc2ljb21tYW5kLCBpLCBpZGVudGlmeV9tZXNzYWdlOworCXU4ICpwdHI7CisJZHByaW50a2RiZyhEQkdfMCwgInN0YXJ0X3Njc2k6IChwaWQjJWxpKSA8JTAyaS0laT4gc3JiPSVwXG4iLAorCQlzcmItPmNtZC0+cGlkLCBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLCBzcmIpOworCisJc3JiLT50YWdfbnVtYmVyID0gVEFHX05PTkU7CS8qIGFjYi0+dGFnX21heF9udW06IGhhZCBlcnJvciByZWFkIGluIGVlcHJvbSAqLworCisJc19zdGF0ID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfU0lHTkFMKTsKKwlzX3N0YXQyID0gMDsKKwlzX3N0YXQyID0gREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX1NUQVRVUyk7CisjaWYgMQorCWlmIChzX3N0YXQgJiAweDIwIC8qIHNfc3RhdDIgJiAweDAyMDAwICovICkgeworCQlkcHJpbnRrZGJnKERCR19LRywgInN0YXJ0X3Njc2k6IChwaWQjJWxpKSBCVVNZICUwMnggJTA0eFxuIiwKKwkJCXNyYi0+Y21kLT5waWQsIHNfc3RhdCwgc19zdGF0Mik7CisJCS8qCisJCSAqIFRyeSBhbnl3YXk/CisJCSAqCisJCSAqIFdlIGNvdWxkLCBCVVQ6IFNvbWV0aW1lcyB0aGUgVFJNX1MxMDQwIG1pc3NlcyB0byBwcm9kdWNlIGEgU2VsZWN0aW9uCisJCSAqIFRpbWVvdXQsIGEgRGlzY29ubmVjdCBvciBhIFJlc2VsY3Rpb24gSVJRLCBzbyB3ZSB3b3VsZCBiZSBzY3Jld2VkIQorCQkgKiAoVGhpcyBpcyBsaWtlbHkgdG8gYmUgYSBidWcgaW4gdGhlIGhhcmR3YXJlLiBPYnZpb3VzbHksIG1vc3QgcGVvcGxlCisJCSAqICBvbmx5IGhhdmUgb25lIGluaXRpYXRvciBwZXIgU0NTSSBidXMuKQorCQkgKiBJbnN0ZWFkIGxldCB0aGlzIGZhaWwgYW5kIGhhdmUgdGhlIHRpbWVyIG1ha2Ugc3VyZSB0aGUgY29tbWFuZCBpcyAKKwkJICogdHJpZWQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCB0aW1lCisJCSAqLworCQkvKnNlbHRvX3RpbWVyIChhY2IpOyAqLworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlpZiAoYWNiLT5hY3RpdmVfZGNiKSB7CisJCWRwcmludGtsKEtFUk5fREVCVUcsICJzdGFydF9zY3NpOiAocGlkIyVsaSkgQXR0ZW1wdCB0byBzdGFydCBhIgorCQkJImNvbW1hbmQgd2hpbGUgYW5vdGhlciBjb21tYW5kIChwaWQjJWxpKSBpcyBhY3RpdmUuIiwKKwkJCXNyYi0+Y21kLT5waWQsCisJCQlhY2ItPmFjdGl2ZV9kY2ItPmFjdGl2ZV9zcmIgPworCQkJICAgIGFjYi0+YWN0aXZlX2RjYi0+YWN0aXZlX3NyYi0+Y21kLT5waWQgOiAwKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfU1RBVFVTKSAmIFNDU0lJTlRFUlJVUFQpIHsKKwkJZHByaW50a2RiZyhEQkdfS0csICJzdGFydF9zY3NpOiAocGlkIyVsaSkgRmFpbGVkIChidXN5KVxuIiwKKwkJCXNyYi0+Y21kLT5waWQpOworCQlyZXR1cm4gMTsKKwl9CisJLyogQWxsb3cgc3RhcnRpbmcgb2YgU0NTSSBjb21tYW5kcyBoYWxmIGEgc2Vjb25kIGJlZm9yZSB3ZSBhbGxvdyB0aGUgbWlkLWxldmVsCisJICogdG8gcXVldWUgdGhlbSBhZ2FpbiBhZnRlciBhIHJlc2V0ICovCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0IC0gSFogLyAyKSkgeworCQlkcHJpbnRrZGJnKERCR19LRywgInN0YXJ0X3Njc2k6IFJlZnVzZSBjbWRzIChyZXNldCB3YWl0KVxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIEZsdXNoIEZJRk8gKi8KKwljbGVhcl9maWZvKGFjYiwgInN0YXJ0X3Njc2kiKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSE9TVElELCBhY2ItPnNjc2lfaG9zdC0+dGhpc19pZCk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1RBUkdFVElELCBkY2ItPnRhcmdldF9pZCk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NZTkMsIGRjYi0+c3luY19wZXJpb2QpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9PRkZTRVQsIGRjYi0+c3luY19vZmZzZXQpOworCXNyYi0+c2NzaV9waGFzZSA9IFBIX0JVU19GUkVFOwkvKiBpbml0aWFsIHBoYXNlICovCisKKwlpZGVudGlmeV9tZXNzYWdlID0gZGNiLT5pZGVudGlmeV9tc2c7CisJLypEQzM5NXhfVFJNX3dyaXRlOChUUk1fUzEwNDBfU0NTSV9JRE1TRywgaWRlbnRpZnlfbWVzc2FnZSk7ICovCisJLyogRG9uJ3QgYWxsb3cgZGlzY29ubmVjdGlvbiBmb3IgQVVUT19SRVFTRU5TRTogQ29udC5BbGwuQ29uZC4hICovCisJaWYgKHNyYi0+ZmxhZyAmIEFVVE9fUkVRU0VOU0UpCisJCWlkZW50aWZ5X21lc3NhZ2UgJj0gMHhCRjsKKworCWlmICgoKHNyYi0+Y21kLT5jbW5kWzBdID09IElOUVVJUlkpCisJICAgICB8fCAoc3JiLT5jbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkKKwkgICAgIHx8IChzcmItPmZsYWcgJiBBVVRPX1JFUVNFTlNFKSkKKwkgICAgJiYgKCgoZGNiLT5zeW5jX21vZGUgJiBXSURFX05FR09fRU5BQkxFKQorCQkgJiYgIShkY2ItPnN5bmNfbW9kZSAmIFdJREVfTkVHT19ET05FKSkKKwkJfHwgKChkY2ItPnN5bmNfbW9kZSAmIFNZTkNfTkVHT19FTkFCTEUpCisJCSAgICAmJiAhKGRjYi0+c3luY19tb2RlICYgU1lOQ19ORUdPX0RPTkUpKSkKKwkgICAgJiYgKGRjYi0+dGFyZ2V0X2x1biA9PSAwKSkgeworCQlzcmItPm1zZ291dF9idWZbMF0gPSBpZGVudGlmeV9tZXNzYWdlOworCQlzcmItPm1zZ19jb3VudCA9IDE7CisJCXNjc2ljb21tYW5kID0gU0NNRF9TRUxfQVROU1RPUDsKKwkJc3JiLT5zdGF0ZSA9IFNSQl9NU0dPVVQ7CisjaWZuZGVmIFNZTkNfRklSU1QKKwkJaWYgKGRjYi0+c3luY19tb2RlICYgV0lERV9ORUdPX0VOQUJMRQorCQkgICAgJiYgZGNiLT5pbnF1aXJ5NyAmIFNDU0lfSU5RX1dCVVMxNikgeworCQkJYnVpbGRfd2R0cihhY2IsIGRjYiwgc3JiKTsKKwkJCWdvdG8gbm9fY21kOworCQl9CisjZW5kaWYKKwkJaWYgKGRjYi0+c3luY19tb2RlICYgU1lOQ19ORUdPX0VOQUJMRQorCQkgICAgJiYgZGNiLT5pbnF1aXJ5NyAmIFNDU0lfSU5RX1NZTkMpIHsKKwkJCWJ1aWxkX3NkdHIoYWNiLCBkY2IsIHNyYik7CisJCQlnb3RvIG5vX2NtZDsKKwkJfQorCQlpZiAoZGNiLT5zeW5jX21vZGUgJiBXSURFX05FR09fRU5BQkxFCisJCSAgICAmJiBkY2ItPmlucXVpcnk3ICYgU0NTSV9JTlFfV0JVUzE2KSB7CisJCQlidWlsZF93ZHRyKGFjYiwgZGNiLCBzcmIpOworCQkJZ290byBub19jbWQ7CisJCX0KKwkJc3JiLT5tc2dfY291bnQgPSAwOworCX0KKwkvKiBTZW5kIGlkZW50aWZ5IG1lc3NhZ2UgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgaWRlbnRpZnlfbWVzc2FnZSk7CisKKwlzY3NpY29tbWFuZCA9IFNDTURfU0VMX0FUTjsKKwlzcmItPnN0YXRlID0gU1JCX1NUQVJUXzsKKyNpZm5kZWYgREMzOTV4X05PX1RBR1EKKwlpZiAoKGRjYi0+c3luY19tb2RlICYgRU5fVEFHX1FVRVVFSU5HKQorCSAgICAmJiAoaWRlbnRpZnlfbWVzc2FnZSAmIDB4QzApKSB7CisJCS8qIFNlbmQgVGFnIG1lc3NhZ2UgKi8KKwkJdTMyIHRhZ19tYXNrID0gMTsKKwkJdTggdGFnX251bWJlciA9IDA7CisJCXdoaWxlICh0YWdfbWFzayAmIGRjYi0+dGFnX21hc2sKKwkJICAgICAgICYmIHRhZ19udW1iZXIgPD0gZGNiLT5tYXhfY29tbWFuZCkgeworCQkJdGFnX21hc2sgPSB0YWdfbWFzayA8PCAxOworCQkJdGFnX251bWJlcisrOworCQl9CisJCWlmICh0YWdfbnVtYmVyID49IGRjYi0+bWF4X2NvbW1hbmQpIHsKKwkJCWRwcmludGtsKEtFUk5fV0FSTklORywgInN0YXJ0X3Njc2k6IChwaWQjJWxpKSAiCisJCQkJIk91dCBvZiB0YWdzIHRhcmdldD08JTAyaS0laT4pXG4iLAorCQkJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLAorCQkJCXNyYi0+Y21kLT5kZXZpY2UtPmx1bik7CisJCQlzcmItPnN0YXRlID0gU1JCX1JFQURZOworCQkJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLAorCQkJCSAgICAgICBET19IV1JFU0VMRUNUKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIFNlbmQgVGFnIGlkICovCisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCBNU0dfU0lNUExFX1FUQUcpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgdGFnX251bWJlcik7CisJCWRjYi0+dGFnX21hc2sgfD0gdGFnX21hc2s7CisJCXNyYi0+dGFnX251bWJlciA9IHRhZ19udW1iZXI7CisJCXNjc2ljb21tYW5kID0gU0NNRF9TRUxfQVROMzsKKwkJc3JiLT5zdGF0ZSA9IFNSQl9TVEFSVF87CisJfQorI2VuZGlmCisvKnBvbGxpbmc6Ki8KKwkvKiBTZW5kIENEQiAuLmNvbW1hbmQgYmxvY2sgLi4uLi4uLi4uICovCisJZHByaW50a2RiZyhEQkdfS0csICJzdGFydF9zY3NpOiAocGlkIyVsaSkgPCUwMmktJWk+IGNtbmQ9MHglMDJ4IHRhZz0laVxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgc3JiLT5jbWQtPmRldmljZS0+aWQsIHNyYi0+Y21kLT5kZXZpY2UtPmx1biwKKwkJc3JiLT5jbWQtPmNtbmRbMF0sIHNyYi0+dGFnX251bWJlcik7CisJaWYgKHNyYi0+ZmxhZyAmIEFVVE9fUkVRU0VOU0UpIHsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIFJFUVVFU1RfU0VOU0UpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgKGRjYi0+dGFyZ2V0X2x1biA8PCA1KSk7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAwKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIDApOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywKKwkJCSAgICAgIHNpemVvZihzcmItPmNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAwKTsKKwl9IGVsc2UgeworCQlwdHIgPSAodTggKilzcmItPmNtZC0+Y21uZDsKKwkJZm9yIChpID0gMDsgaSA8IHNyYi0+Y21kLT5jbWRfbGVuOyBpKyspCisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgKnB0cisrKTsKKwl9CisgICAgICBub19jbWQ6CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLAorCQkgICAgICAgRE9fSFdSRVNFTEVDVCB8IERPX0RBVEFMQVRDSCk7CisJaWYgKERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9TVEFUVVMpICYgU0NTSUlOVEVSUlVQVCkgeworCQkvKiAKKwkJICogSWYgc3RhcnRfc2NzaSByZXR1cm4gMToKKwkJICogd2UgY2F1Z2h0IGFuIGludGVycnVwdCAobXVzdCBiZSByZXNldCBvciByZXNlbGVjdGlvbiAuLi4gKQorCQkgKiA6IExldCdzIHByb2Nlc3MgaXQgZmlyc3QhCisJCSAqLworCQlkcHJpbnRrZGJnKERCR18wLCAic3RhcnRfc2NzaTogKHBpZCMlbGkpIDwlMDJpLSVpPiBGYWlsZWQgLSBidXN5XG4iLAorCQkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1bik7CisJCXNyYi0+c3RhdGUgPSBTUkJfUkVBRFk7CisJCWZyZWVfdGFnKGRjYiwgc3JiKTsKKwkJc3JiLT5tc2dfY291bnQgPSAwOworCQlyZXR1cm5fY29kZSA9IDE7CisJCS8qIFRoaXMgSVJRIHNob3VsZCBOT1QgZ2V0IGxvc3QsIGFzIHdlIGRpZCBub3QgYWNrbm93bGVkZ2UgaXQgKi8KKwl9IGVsc2UgeworCQkvKiAKKwkJICogSWYgc3RhcnRfc2NzaSByZXR1cm5zIDA6CisJCSAqIHdlIGtub3cgdGhhdCB0aGUgU0NTSSBwcm9jZXNzb3IgaXMgZnJlZQorCQkgKi8KKwkJc3JiLT5zY3NpX3BoYXNlID0gUEhfQlVTX0ZSRUU7CS8qIGluaXRpYWwgcGhhc2UgKi8KKwkJZGNiLT5hY3RpdmVfc3JiID0gc3JiOworCQlhY2ItPmFjdGl2ZV9kY2IgPSBkY2I7CisJCXJldHVybl9jb2RlID0gMDsKKwkJLyogaXQncyBpbXBvcnRhbnQgZm9yIGF0biBzdG9wICovCisJCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwKKwkJCSAgICAgICBET19EQVRBTEFUQ0ggfCBET19IV1JFU0VMRUNUKTsKKwkJLyogU0NTSSBjb21tYW5kICovCisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBzY3NpY29tbWFuZCk7CisJfQorCXJldHVybiByZXR1cm5fY29kZTsKK30KKworCisjZGVmaW5lIERDMzk1eF9FTkFCTEVfTVNHT1VUIFwKKyBEQzM5NXhfd3JpdGUxNiAoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19TRVRBVE4pOyBcCisgc3JiLT5zdGF0ZSB8PSBTUkJfTVNHT1VUCisKKworLyogYWJvcnQgY29tbWFuZCAqLworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9tc2dvdXRfYWJvcnQoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzcmItPm1zZ291dF9idWZbMF0gPSBBQk9SVDsKKwlzcmItPm1zZ19jb3VudCA9IDE7CisJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJc3JiLT5zdGF0ZSAmPSB+U1JCX01TR0lOOworCXNyYi0+c3RhdGUgfD0gU1JCX01TR09VVDsKK30KKworCisvKioKKyAqIGRjMzk1eF9oYW5kbGVfaW50ZXJydXB0IC0gSGFuZGxlIGFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGNvbmZpcm1lZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gdHJpZ2dlcmVkIGZvciB0aGlzIGNhcmQuCisgKgorICogQGFjYjoJIGEgcG9pbnRlciB0byB0aGUgYWRwdGVyIGNvbnRyb2wgYmxvY2sKKyAqIEBzY3NpX3N0YXR1czogdGhlIHN0YXR1cyByZXR1cm4gd2hlbiB3ZSBjaGVja2VkIHRoZSBjYXJkCisgKiovCitzdGF0aWMgdm9pZCBkYzM5NXhfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQl1MTYgc2NzaV9zdGF0dXMpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiOworCXN0cnVjdCBTY3NpUmVxQmxrICpzcmI7CisJdTE2IHBoYXNlOworCXU4IHNjc2lfaW50c3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAoKmRjMzk1eF9zdGF0ZXYpKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICosIHN0cnVjdCBTY3NpUmVxQmxrICosIAorCQkJICAgICAgdTE2ICopOworCisJREMzOTV4X0xPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKKworCS8qIFRoaXMgYWNrbm93bGVkZ2VzIHRoZSBJUlEgKi8KKwlzY3NpX2ludHN0YXR1cyA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0lOVFNUQVRVUyk7CisJaWYgKChzY3NpX3N0YXR1cyAmIDB4MjAwNykgPT0gMHgyMDAyKQorCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJIkNPUCBhZnRlciBDT1AgY29tcGxldGVkPyAlMDR4XG4iLCBzY3NpX3N0YXR1cyk7CisJaWYgKGRlYnVnX2VuYWJsZWQoREJHX0tHKSkgeworCQlpZiAoc2NzaV9pbnRzdGF0dXMgJiBJTlRfU0VMVElNRU9VVCkKKwkJCWRwcmludGtkYmcoREJHX0tHLCAiaGFuZGxlX2ludGVycnVwdDogU2VsZWN0aW9uIHRpbWVvdXRcbiIpOworCX0KKwkvKmRwcmludGtsKEtFUk5fREVCVUcsICJoYW5kbGVfaW50ZXJydXB0OiBpbnRzdGF0dXMgPSAweCUwMnggIiwgc2NzaV9pbnRzdGF0dXMpOyAqLworCisJaWYgKHRpbWVyX3BlbmRpbmcoJmFjYi0+c2VsdG9fdGltZXIpKQorCQlkZWxfdGltZXIoJmFjYi0+c2VsdG9fdGltZXIpOworCisJaWYgKHNjc2lfaW50c3RhdHVzICYgKElOVF9TRUxUSU1FT1VUIHwgSU5UX0RJU0NPTk5FQ1QpKSB7CisJCWRpc2Nvbm5lY3QoYWNiKTsJLyogYnVzIGZyZWUgaW50ZXJydXB0ICAqLworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmIChzY3NpX2ludHN0YXR1cyAmIElOVF9SRVNFTEVDVEVEKSB7CisJCXJlc2VsZWN0KGFjYik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJaWYgKHNjc2lfaW50c3RhdHVzICYgSU5UX1NFTEVDVCkgeworCQlkcHJpbnRrbChLRVJOX0lORk8sICJIb3N0IGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IG1vZGUhXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAoc2NzaV9pbnRzdGF0dXMgJiBJTlRfU0NTSVJFU0VUKSB7CisJCXNjc2lfcmVzZXRfZGV0ZWN0KGFjYik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJaWYgKHNjc2lfaW50c3RhdHVzICYgKElOVF9CVVNTRVJWSUNFIHwgSU5UX0NNRERPTkUpKSB7CisJCWRjYiA9IGFjYi0+YWN0aXZlX2RjYjsKKwkJaWYgKCFkY2IpIHsKKwkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkJIk9vcHM6IEJ1c1NlcnZpY2UgKCUwNHggJTAyeCkgdy9vIEFjdGl2ZURDQiFcbiIsCisJCQkJc2NzaV9zdGF0dXMsIHNjc2lfaW50c3RhdHVzKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlzcmIgPSBkY2ItPmFjdGl2ZV9zcmI7CisJCWlmIChkY2ItPmZsYWcgJiBBQk9SVF9ERVZfKSB7CisJCQlkcHJpbnRrZGJnKERCR18wLCAiTXNnT3V0IEFib3J0IERldmljZS4uLi4uXG4iKTsKKwkJCWVuYWJsZV9tc2dvdXRfYWJvcnQoYWNiLCBzcmIpOworCQl9CisKKwkJLyogc29mdHdhcmUgc2VxdWVudGlhbCBtYWNoaW5lICovCisJCXBoYXNlID0gKHUxNilzcmItPnNjc2lfcGhhc2U7CisKKwkJLyogCisJCSAqIDYyMDM3IG9yIDYyMTM3CisJCSAqIGNhbGwgIGRjMzk1eF9zY3NpX3BoYXNlMFtdLi4uICJwaGFzZSBlbnRyeSIKKwkJICogaGFuZGxlIGV2ZXJ5IHBoYXNlIGJlZm9yZSBzdGFydCB0cmFuc2ZlcgorCQkgKi8KKwkJLyogZGF0YV9vdXRfcGhhc2UwLAlwaGFzZTowICovCisJCS8qIGRhdGFfaW5fcGhhc2UwLAlwaGFzZToxICovCisJCS8qIGNvbW1hbmRfcGhhc2UwLAlwaGFzZToyICovCisJCS8qIHN0YXR1c19waGFzZTAsCXBoYXNlOjMgKi8KKwkJLyogbm9wMCwJCXBoYXNlOjQgUEhfQlVTX0ZSRUUgLi4gaW5pdGlhbCBwaGFzZSAqLworCQkvKiBub3AwLAkJcGhhc2U6NSBQSF9CVVNfRlJFRSAuLiBpbml0aWFsIHBoYXNlICovCisJCS8qIG1zZ291dF9waGFzZTAsCXBoYXNlOjYgKi8KKwkJLyogbXNnaW5fcGhhc2UwLAlwaGFzZTo3ICovCisJCWRjMzk1eF9zdGF0ZXYgPSBkYzM5NXhfc2NzaV9waGFzZTBbcGhhc2VdOworCQlkYzM5NXhfc3RhdGV2KGFjYiwgc3JiLCAmc2NzaV9zdGF0dXMpOworCisJCS8qIAorCQkgKiBpZiB0aGVyZSB3ZXJlIGFueSBleGNlcHRpb24gb2NjdXJlZCBzY3NpX3N0YXR1cworCQkgKiB3aWxsIGJlIG1vZGlmeSB0byBidXMgZnJlZSBwaGFzZSBuZXcgc2NzaV9zdGF0dXMKKwkJICogdHJhbnNmZXIgb3V0IGZyb20gLi4uIHByZXZpb3VzIGRjMzk1eF9zdGF0ZXYKKwkJICovCisJCXNyYi0+c2NzaV9waGFzZSA9IHNjc2lfc3RhdHVzICYgUEhBU0VNQVNLOworCQlwaGFzZSA9ICh1MTYpc2NzaV9zdGF0dXMgJiBQSEFTRU1BU0s7CisKKwkJLyogCisJCSAqIGNhbGwgIGRjMzk1eF9zY3NpX3BoYXNlMVtdLi4uICJwaGFzZSBlbnRyeSIgaGFuZGxlCisJCSAqIGV2ZXJ5IHBoYXNlIHRvIGRvIHRyYW5zZmVyCisJCSAqLworCQkvKiBkYXRhX291dF9waGFzZTEsCXBoYXNlOjAgKi8KKwkJLyogZGF0YV9pbl9waGFzZTEsCXBoYXNlOjEgKi8KKwkJLyogY29tbWFuZF9waGFzZTEsCXBoYXNlOjIgKi8KKwkJLyogc3RhdHVzX3BoYXNlMSwJcGhhc2U6MyAqLworCQkvKiBub3AxLAkJcGhhc2U6NCBQSF9CVVNfRlJFRSAuLiBpbml0aWFsIHBoYXNlICovCisJCS8qIG5vcDEsCQlwaGFzZTo1IFBIX0JVU19GUkVFIC4uIGluaXRpYWwgcGhhc2UgKi8KKwkJLyogbXNnb3V0X3BoYXNlMSwJcGhhc2U6NiAqLworCQkvKiBtc2dpbl9waGFzZTEsCXBoYXNlOjcgKi8KKwkJZGMzOTV4X3N0YXRldiA9IGRjMzk1eF9zY3NpX3BoYXNlMVtwaGFzZV07CisJCWRjMzk1eF9zdGF0ZXYoYWNiLCBzcmIsICZzY3NpX3N0YXR1cyk7CisJfQorICAgICAgb3V0X3VubG9jazoKKwlEQzM5NXhfVU5MT0NLX0lPKGFjYi0+c2NzaV9ob3N0LCBmbGFncyk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IGRjMzk1eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0gKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopZGV2X2lkOworCXUxNiBzY3NpX3N0YXR1czsKKwl1OCBkbWFfc3RhdHVzOworCWlycXJldHVybl90IGhhbmRsZWQgPSBJUlFfTk9ORTsKKworCS8qCisJICogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJ1cHQKKwkgKi8KKwlzY3NpX3N0YXR1cyA9IERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9TVEFUVVMpOworCWRtYV9zdGF0dXMgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX1NUQVRVUyk7CisJaWYgKHNjc2lfc3RhdHVzICYgU0NTSUlOVEVSUlVQVCkgeworCQkvKiBpbnRlcnVwdCBwZW5kaW5nIC0gbGV0J3MgcHJvY2VzcyBpdCEgKi8KKwkJZGMzOTV4X2hhbmRsZV9pbnRlcnJ1cHQoYWNiLCBzY3NpX3N0YXR1cyk7CisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwl9CisJZWxzZSBpZiAoZG1hX3N0YXR1cyAmIDB4MjApIHsKKwkJLyogRXJyb3IgZnJvbSB0aGUgRE1BIGVuZ2luZSAqLworCQlkcHJpbnRrbChLRVJOX0lORk8sICJJbnRlcnJ1cHQgZnJvbSBETUEgZW5naW5lOiAweCUwMnghXG4iLCBkbWFfc3RhdHVzKTsKKyNpZiAwCisJCWRwcmludGtsKEtFUk5fSU5GTywgIlRoaXMgbWVhbnMgRE1BIGVycm9yISBUcnkgdG8gaGFuZGxlIC4uLlxuIik7CisJCWlmIChhY2ItPmFjdGl2ZV9kY2IpIHsKKwkJCWFjYi0+YWN0aXZlX2RjYi0+IGZsYWcgfD0gQUJPUlRfREVWXzsKKwkJCWlmIChhY2ItPmFjdGl2ZV9kY2ItPmFjdGl2ZV9zcmIpCisJCQkJZW5hYmxlX21zZ291dF9hYm9ydChhY2IsIGFjYi0+YWN0aXZlX2RjYi0+YWN0aXZlX3NyYik7CisJCX0KKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCwgQUJPUlRYRkVSIHwgQ0xSWEZJRk8pOworI2Vsc2UKKwkJZHByaW50a2woS0VSTl9JTkZPLCAiSWdub3JpbmcgRE1BIGVycm9yIChwcm9iYWJseSBhIGJhZCB0aGluZykgLi4uXG4iKTsKKwkJYWNiID0gTlVMTDsKKyNlbmRpZgorCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKKworc3RhdGljIHZvaWQgbXNnb3V0X3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAibXNnb3V0X3BoYXNlMDogKHBpZCMlbGkpXG4iLCBzcmItPmNtZC0+cGlkKTsKKwlpZiAoc3JiLT5zdGF0ZSAmIChTUkJfVU5FWFBFQ1RfUkVTRUwgKyBTUkJfQUJPUlRfU0VOVCkpCisJCSpwc2NzaV9zdGF0dXMgPSBQSF9CVVNfRlJFRTsJLyouLiBpbml0aWFsIHBoYXNlICovCisKKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCXNyYi0+c3RhdGUgJj0gflNSQl9NU0dPVVQ7Cit9CisKKworc3RhdGljIHZvaWQgbXNnb3V0X3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwl1MTYgaTsKKwl1OCAqcHRyOworCWRwcmludGtkYmcoREJHXzAsICJtc2dvdXRfcGhhc2UxOiAocGlkIyVsaSlcbiIsIHNyYi0+Y21kLT5waWQpOworCisJY2xlYXJfZmlmbyhhY2IsICJtc2dvdXRfcGhhc2UxIik7CisJaWYgKCEoc3JiLT5zdGF0ZSAmIFNSQl9NU0dPVVQpKSB7CisJCXNyYi0+c3RhdGUgfD0gU1JCX01TR09VVDsKKwkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCSJtc2dvdXRfcGhhc2UxOiAocGlkIyVsaSkgUGhhc2UgdW5leHBlY3RlZFxuIiwKKwkJCXNyYi0+Y21kLT5waWQpOwkvKiBTbyB3aGF0ID8gKi8KKwl9CisJaWYgKCFzcmItPm1zZ19jb3VudCkgeworCQlkcHJpbnRrZGJnKERCR18wLCAibXNnb3V0X3BoYXNlMTogKHBpZCMlbGkpIE5PUCBtc2dcbiIsCisJCQlzcmItPmNtZC0+cGlkKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIE1TR19OT1ApOworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgU0NNRF9GSUZPX09VVCk7CisJCXJldHVybjsKKwl9CisJcHRyID0gKHU4ICopc3JiLT5tc2dvdXRfYnVmOworCWZvciAoaSA9IDA7IGkgPCBzcmItPm1zZ19jb3VudDsgaSsrKQorCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgKnB0cisrKTsKKwlzcmItPm1zZ19jb3VudCA9IDA7CisJaWYgKHNyYi0+bXNnb3V0X2J1ZlswXSA9PSBNU0dfQUJPUlQpCisJCXNyYi0+c3RhdGUgPSBTUkJfQUJPUlRfU0VOVDsKKworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBTQ01EX0ZJRk9fT1VUKTsKK30KKworCitzdGF0aWMgdm9pZCBjb21tYW5kX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAiY29tbWFuZF9waGFzZTA6IChwaWQjJWxpKVxuIiwgc3JiLT5jbWQtPnBpZCk7CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbW1hbmRfcGhhc2UxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwl1OCAqcHRyOworCXUxNiBpOworCWRwcmludGtkYmcoREJHXzAsICJjb21tYW5kX3BoYXNlMTogKHBpZCMlbGkpXG4iLCBzcmItPmNtZC0+cGlkKTsKKworCWNsZWFyX2ZpZm8oYWNiLCAiY29tbWFuZF9waGFzZTEiKTsKKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0NMUkFUTik7CisJaWYgKCEoc3JiLT5mbGFnICYgQVVUT19SRVFTRU5TRSkpIHsKKwkJcHRyID0gKHU4ICopc3JiLT5jbWQtPmNtbmQ7CisJCWZvciAoaSA9IDA7IGkgPCBzcmItPmNtZC0+Y21kX2xlbjsgaSsrKSB7CisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgKnB0cik7CisJCQlwdHIrKzsKKwkJfQorCX0gZWxzZSB7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCBSRVFVRVNUX1NFTlNFKTsKKwkJZGNiID0gYWNiLT5hY3RpdmVfZGNiOworCQkvKiB0YXJnZXQgaWQgKi8KKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIChkY2ItPnRhcmdldF9sdW4gPDwgNSkpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgMCk7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAwKTsKKwkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sCisJCQkgICAgICBzaXplb2Yoc3JiLT5jbWQtPnNlbnNlX2J1ZmZlcikpOworCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgMCk7CisJfQorCXNyYi0+c3RhdGUgfD0gU1JCX0NPTU1BTkQ7CisJLyogaXQncyBpbXBvcnRhbnQgZm9yIGF0biBzdG9wICovCisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOworCS8qIFNDU0kgY29tbWFuZCAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBTQ01EX0ZJRk9fT1VUKTsKK30KKworCisvKgorICogVmVyaWZ5IHRoYXQgdGhlIHJlbWFpbmluZyBzcGFjZSBpbiB0aGUgaHcgc2cgbGlzdHMgaXMgdGhlIHNhbWUgYXMKKyAqIHRoZSBjb3VudCBvZiByZW1haW5pbmcgYnl0ZXMgaW4gc3JiLT50b3RhbF94ZmVyX2xlbmd0aAorICovCitzdGF0aWMgdm9pZCBzZ192ZXJpZnlfbGVuZ3RoKHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJaWYgKGRlYnVnX2VuYWJsZWQoREJHX1NHKSkgeworCQl1bnNpZ25lZCBsZW4gPSAwOworCQl1bnNpZ25lZCBpZHggPSBzcmItPnNnX2luZGV4OworCQlzdHJ1Y3QgU0dlbnRyeSAqcHNnZSA9IHNyYi0+c2VnbWVudF94ICsgaWR4OworCQlmb3IgKDsgaWR4IDwgc3JiLT5zZ19jb3VudDsgcHNnZSsrLCBpZHgrKykKKwkJCWxlbiArPSBwc2dlLT5sZW5ndGg7CisJCWlmIChsZW4gIT0gc3JiLT50b3RhbF94ZmVyX2xlbmd0aCkKKwkJCWRwcmludGtkYmcoREJHX1NHLAorCQkJICAgICAgICJJbmNvbnNpc3RlbnQgU1JCIFMvRyBsZW5ndGhzIChUb3Q9JWksIENvdW50PSVpKSAhIVxuIiwKKwkJCSAgICAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoLCBsZW4pOworCX0JCQkgICAgICAgCit9CisKKworLyoKKyAqIENvbXB1dGUgdGhlIG5leHQgU2NhdHRlciBHYXRoZXIgbGlzdCBpbmRleCBhbmQgYWRqdXN0IGl0cyBsZW5ndGgKKyAqIGFuZCBhZGRyZXNzIGlmIG5lY2Vzc2FyeTsgYWxzbyBjb21wdXRlIHZpcnRfYWRkcgorICovCitzdGF0aWMgdm9pZCBzZ191cGRhdGVfbGlzdChzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLCB1MzIgbGVmdCkKK3sKKwl1OCBpZHg7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzcmItPmNtZDsKKwlpbnQgc2VnbWVudCA9IGNtZC0+dXNlX3NnOworCXUzMiB4ZmVycmVkID0gc3JiLT50b3RhbF94ZmVyX2xlbmd0aCAtIGxlZnQ7IC8qIGJ5dGVzIHRyYW5zZmVyZWQgKi8KKwlzdHJ1Y3QgU0dlbnRyeSAqcHNnZSA9IHNyYi0+c2VnbWVudF94ICsgc3JiLT5zZ19pbmRleDsKKwl2b2lkICoqdmlydCA9IHNyYi0+dmlydF9tYXA7CisKKwlkcHJpbnRrZGJnKERCR18wLAorCQkic2dfdXBkYXRlX2xpc3Q6IFRyYW5zZmVyZWQgJWkgb2YgJWkgYnl0ZXMsICVpIHJlbWFpblxuIiwKKwkJeGZlcnJlZCwgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCwgbGVmdCk7CisJaWYgKHhmZXJyZWQgPT0gMCkgeworCQkvKiBub3RoaW5nIHRvIHVwZGF0ZSBzaW5jZSB3ZSBkaWQgbm90IHRyYW5zZmVyIGFueSBkYXRhICovCisJCXJldHVybjsKKwl9CisKKwlzZ192ZXJpZnlfbGVuZ3RoKHNyYik7CisJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IGxlZnQ7CS8qIHVwZGF0ZSByZW1haW5pbmcgY291bnQgKi8KKwlmb3IgKGlkeCA9IHNyYi0+c2dfaW5kZXg7IGlkeCA8IHNyYi0+c2dfY291bnQ7IGlkeCsrKSB7CisJCWlmICh4ZmVycmVkID49IHBzZ2UtPmxlbmd0aCkgeworCQkJLyogQ29tcGxldGUgU0cgZW50cmllcyBkb25lICovCisJCQl4ZmVycmVkIC09IHBzZ2UtPmxlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCS8qIFBhcnRpYWwgU0cgZW50cnkgZG9uZSAqLworCQkJcHNnZS0+bGVuZ3RoIC09IHhmZXJyZWQ7CisJCQlwc2dlLT5hZGRyZXNzICs9IHhmZXJyZWQ7CisJCQlzcmItPnNnX2luZGV4ID0gaWR4OworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNyYi0+ZGNiLT4KKwkJCQkJICAgIGFjYi0+ZGV2LAorCQkJCQkgICAgc3JiLT5zZ19idXNfYWRkciwKKwkJCQkJICAgIFNFR01FTlRYX0xFTiwKKwkJCQkJICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnJlYWs7CisJCX0KKwkJcHNnZSsrOworCX0KKwlzZ192ZXJpZnlfbGVuZ3RoKHNyYik7CisKKwkvKiB3ZSBuZWVkIHRoZSBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcyAqLworCWlmICghc2VnbWVudCkgeworCQlzcmItPnZpcnRfYWRkciArPSB4ZmVycmVkOworCQlyZXR1cm47CisJfQorCisJLyogV2UgaGF2ZSB0byB3YWxrIHRoZSBzY2F0dGVybGlzdCB0byBmaW5kIGl0ICovCisJc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwlpZHggPSAwOworCXdoaWxlIChzZWdtZW50LS0pIHsKKwkJdW5zaWduZWQgbG9uZyBtYXNrID0KKwkJICAgIH4oKHVuc2lnbmVkIGxvbmcpc2ctPmxlbmd0aCAtIDEpICYgUEFHRV9NQVNLOworCQlpZiAoKHNnX2RtYV9hZGRyZXNzKHNnKSAmIG1hc2spID09IChwc2dlLT5hZGRyZXNzICYgbWFzaykpIHsKKwkJCXNyYi0+dmlydF9hZGRyID0gdmlydFtpZHhdICsgKHBzZ2UtPmFkZHJlc3MgJiB+UEFHRV9NQVNLKTsKKwkJCXJldHVybjsKKwkJfQorCQkrK3NnOworCQkrK2lkeDsKKwl9CisKKwlkcHJpbnRrbChLRVJOX0VSUiwgInNnX3VwZGF0ZV9saXN0OiBzZ190b192aXJ0IGZhaWxlZFxuIik7CisJc3JiLT52aXJ0X2FkZHIgPSBOVUxMOworfQorCisKKy8qCisgKiBXZSBoYXZlIHRyYW5zZmVyZWQgYSBzaW5nbGUgYnl0ZSAoUElPIG1vZGU/KSBhbmQgbmVlZCB0byB1cGRhdGUKKyAqIHRoZSBjb3VudCBvZiBieXRlcyByZW1haW5pbmcgKHRvdGFsX3hmZXJfbGVuZ3RoKSBhbmQgdXBkYXRlIHRoZSBzZworICogZW50cnkgdG8gZWl0aGVyIHBvaW50IHRvIG5leHQgYnl0ZSBpbiB0aGUgY3VycmVudCBzZyBlbnRyeSwgb3Igb2YKKyAqIGFscmVhZHkgYXQgdGhlIGVuZCB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2cgZW50cnkKKyAqLworc3RhdGljIHZvaWQgc2dfc3VidHJhY3Rfb25lKHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3JiLT50b3RhbF94ZmVyX2xlbmd0aC0tOworCXNyYi0+c2VnbWVudF94W3NyYi0+c2dfaW5kZXhdLmxlbmd0aC0tOworCWlmIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoICYmCisJICAgICFzcmItPnNlZ21lbnRfeFtzcmItPnNnX2luZGV4XS5sZW5ndGgpIHsKKwkJaWYgKGRlYnVnX2VuYWJsZWQoREJHX1BJTykpCisJCQlwcmludGsoIiAobmV4dCBzZWdtZW50KSIpOworCQlzcmItPnNnX2luZGV4Kys7CisJCXNnX3VwZGF0ZV9saXN0KHNyYiwgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCk7CisJfQorfQorCisKKy8qIAorICogY2xlYW51cF9hZnRlcl90cmFuc2ZlcgorICogCisgKiBNYWtlcyBzdXJlLCBETUEgYW5kIFNDU0kgZW5naW5lIGFyZSBlbXB0eSwgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBmaW5pc2hlZAorICogS0c6IEN1cnJlbnRseSBjYWxsZWQgZnJvbSAgU3RhdHVzUGhhc2UxICgpCisgKiBTaG91bGQgcHJvYmFibHkgYWxzbyBiZSBjYWxsZWQgZnJvbSBvdGhlciBwbGFjZXMKKyAqIEJlc3QgbWlnaHQgYmUgdG8gY2FsbCBpdCBpbiBEYXRhWFhQaGFzZTAsIGlmIG5ldyBwaGFzZSB3aWxsIGRpZmZlciAKKyAqLworc3RhdGljIHZvaWQgY2xlYW51cF9hZnRlcl90cmFuc2ZlcihzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCS8qREMzOTV4X3dyaXRlOCAoVFJNX1MxMDQwX0RNQV9TVEFUVVMsIEZPUkNFRE1BQ09NUCk7ICovCisJaWYgKERDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTU1BTkQpICYgMHgwMDAxKSB7CS8qIHJlYWQgKi8KKwkJaWYgKCEoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgJiAweDQwKSkKKwkJCWNsZWFyX2ZpZm8oYWNiLCAiY2xlYW51cC9pbiIpOworCQlpZiAoIShEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSAmIDB4ODApKQorCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCwgQ0xSWEZJRk8pOworCX0gZWxzZSB7CQkvKiB3cml0ZSAqLworCQlpZiAoIShEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSAmIDB4ODApKQorCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCwgQ0xSWEZJRk8pOworCQlpZiAoIShEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSAmIDB4NDApKQorCQkJY2xlYXJfZmlmbyhhY2IsICJjbGVhbnVwL291dCIpOworCX0KKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7Cit9CisKKworLyoKKyAqIFRob3NlIG5vIG9mIGJ5dGVzIHdpbGwgYmUgdHJhbnNmZXJlZCB3LyBQSU8gdGhyb3VnaCB0aGUgU0NTSSBGSUZPCisgKiBTZWVtcyB0byBiZSBuZWVkZWQgZm9yIHVua25vd24gcmVhc29uczsgY291bGQgYmUgYSBoYXJkd2FyZSBidWcgOi0oCisgKi8KKyNkZWZpbmUgREMzOTV4X0xBU1RQSU8gNAorCisKK3N0YXRpYyB2b2lkIGRhdGFfb3V0X3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBzcmItPmRjYjsKKwl1MTYgc2NzaV9zdGF0dXMgPSAqcHNjc2lfc3RhdHVzOworCXUzMiBkX2xlZnRfY291bnRlciA9IDA7CisJZHByaW50a2RiZyhEQkdfMCwgImRhdGFfb3V0X3BoYXNlMDogKHBpZCMlbGkpIDwlMDJpLSVpPlxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgc3JiLT5jbWQtPmRldmljZS0+aWQsIHNyYi0+Y21kLT5kZXZpY2UtPmx1bik7CisKKwkvKgorCSAqIEtHOiBXZSBuZWVkIHRvIGRyYWluIHRoZSBidWZmZXJzIGJlZm9yZSB3ZSBkcmF3IGFueSBjb25jbHVzaW9ucyEKKwkgKiBUaGlzIG1lYW5zIHRlbGxpbmcgdGhlIERNQSB0byBwdXNoIHRoZSByZXN0IGludG8gU0NTSSwgdGVsbGluZworCSAqIFNDU0kgdG8gcHVzaCB0aGUgcmVzdCB0byB0aGUgYnVzLgorCSAqIEhvd2V2ZXIsIHRoZSBkZXZpY2UgbWlnaHQgaGF2ZSBiZWVuIHRoZSBvbmUgdG8gc3RvcCB1cyAocGhhc2UKKwkgKiBjaGFuZ2UpLCBhbmQgdGhlIGRhdGEgaW4gdHJhbnNpdCBqdXN0IG5lZWRzIHRvIGJlIGFjY291bnRlZCBzbworCSAqIGl0IGNhbiBiZSByZXRyYW5zbWl0dGVkLikKKwkgKi8KKwkvKiAKKwkgKiBLRzogU3RvcCBETUEgZW5naW5lIHB1c2hpbmcgbW9yZSBkYXRhIGludG8gdGhlIFNDU0kgRklGTworCSAqIElmIHdlIG5lZWQgbW9yZSBkYXRhLCB0aGUgRE1BIFNHIGxpc3Qgd2lsbCBiZSBmcmVzaGx5IHNldCB1cCwgYW55d2F5CisJICovCisJZHByaW50a2RiZyhEQkdfUElPLCAiZGF0YV9vdXRfcGhhc2UwOiAiCisJCSJETUF7ZmlmY250PTB4JTAyeCBmaWZvc3RhdD0weCUwMnh9ICIKKwkJIlNDU0l7Zmlmb2NudD0weCUwMnggY250PTB4JTA2eCBzdGF0dXM9MHglMDR4fSB0b3RhbD0weCUwNnhcbiIsCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT0NOVCksCisJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT1NUQVQpLAorCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSwKKwkJREMzOTV4X3JlYWQzMihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIpLCBzY3NpX3N0YXR1cywKKwkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfQ09OVFJPTCwgU1RPUERNQVhGRVIgfCBDTFJYRklGTyk7CisKKwlpZiAoIShzcmItPnN0YXRlICYgU1JCX1hGRVJQQUQpKSB7CisJCWlmIChzY3NpX3N0YXR1cyAmIFBBUklUWUVSUk9SKQorCQkJc3JiLT5zdGF0dXMgfD0gUEFSSVRZX0VSUk9SOworCisJCS8qCisJCSAqIEtHOiBSaWdodCwgd2UgY2FuJ3QganVzdCByZWx5IG9uIHRoZSBTQ1NJX0NPVU5URVIsIGJlY2F1c2UgdGhpcworCQkgKiBpcyB0aGUgbm8gb2YgYnl0ZXMgaXQgZ290IGZyb20gdGhlIERNQSBlbmdpbmUgbm90IHRoZSBubyBpdCAKKwkJICogdHJhbnNmZXJyZWQgc3VjY2Vzc2Z1bGx5IHRvIHRoZSBkZXZpY2UuIChBbmQgdGhlIGRpZmZlcmVuY2UgY291bGQKKwkJICogYmUgYXMgbXVjaCBhcyB0aGUgRklGTyBzaXplLCBJIGd1ZXNzIC4uLikKKwkJICovCisJCWlmICghKHNjc2lfc3RhdHVzICYgU0NTSVhGRVJET05FKSkgeworCQkJLyoKKwkJCSAqIHdoZW4gZGF0YSB0cmFuc2ZlciBmcm9tIERNQSBGSUZPIHRvIFNDU0kgRklGTworCQkJICogaWYgdGhlcmUgd2FzIHNvbWUgZGF0YSBsZWZ0IGluIFNDU0kgRklGTworCQkJICovCisJCQlkX2xlZnRfY291bnRlciA9CisJCQkgICAgKHUzMikoREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgJgorCQkJCSAgMHgxRik7CisJCQlpZiAoZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQykKKwkJCQlkX2xlZnRfY291bnRlciA8PD0gMTsKKworCQkJZHByaW50a2RiZyhEQkdfS0csICJkYXRhX291dF9waGFzZTA6IEZJRk8gY29udGFpbnMgJWkgJXNcbiIKKwkJCQkiU0NTSXtmaWZvY250PTB4JTAyeCBjbnQ9MHglMDh4fSAiCisJCQkJIkRNQXtmaWZvY250PTB4JTA0eCBjbnQ9MHglMDJ4IGN0cj0weCUwOHh9XG4iLAorCQkJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpLAorCQkJCShkY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKSA/ICJ3b3JkcyIgOiAiYnl0ZXMiLAorCQkJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk9DTlQpLAorCQkJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSKSwKKwkJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9DTlQpLAorCQkJCURDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT1NUQVQpLAorCQkJCURDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfRE1BX0NYQ05UKSk7CisJCX0KKwkJLyoKKwkJICogY2FsY3VsYXRlIGFsbCB0aGUgcmVzaWR1ZSBkYXRhIHRoYXQgbm90IHlldCB0cmFuc2ZlcmVkCisJCSAqIFNDU0kgdHJhbnNmZXIgY291bnRlciArIGxlZnQgaW4gU0NTSSBGSUZPIGRhdGEKKwkJICoKKwkJICogLi4uLi5UUk1fUzEwNDBfU0NTSV9DT1VOVEVSICgyNGJpdHMpCisJCSAqIFRoZSBjb3VudGVyIGFsd2F5cyBkZWNyZW1lbnQgYnkgb25lIGZvciBldmVyeSBTQ1NJIGJ5dGUgdHJhbnNmZXIuCisJCSAqIC4uLi4uVFJNX1MxMDQwX1NDU0lfRklGT0NOVCAoIDViaXRzKQorCQkgKiBUaGUgY291bnRlciBpcyBTQ1NJIEZJRk8gb2Zmc2V0IGNvdW50ZXIgKGluIHVuaXRzIG9mIGJ5dGVzIG9yISB3b3JkcykKKwkJICovCisJCWlmIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID4gREMzOTV4X0xBU1RQSU8pCisJCQlkX2xlZnRfY291bnRlciArPQorCQkJICAgIERDMzk1eF9yZWFkMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSKTsKKworCQkvKiBJcyB0aGlzIGEgZ29vZCBpZGVhPyAqLworCQkvKmNsZWFyX2ZpZm8oYWNiLCAiRE9QMSIpOyAqLworCQkvKiBLRzogV2hhdCBpcyB0aGlzIHN1cHBvc2VkIHRvIGJlIHVzZWZ1bCBmb3I/IFdJREUgcGFkZGluZyBzdHVmZj8gKi8KKwkJaWYgKGRfbGVmdF9jb3VudGVyID09IDEgJiYgZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQworCQkgICAgJiYgc3JiLT5jbWQtPnJlcXVlc3RfYnVmZmxlbiAlIDIpIHsKKwkJCWRfbGVmdF9jb3VudGVyID0gMDsKKwkJCWRwcmludGtsKEtFUk5fSU5GTywKKwkJCQkiZGF0YV9vdXRfcGhhc2UwOiBEaXNjYXJkIDEgYnl0ZSAoMHglMDJ4KVxuIiwKKwkJCQlzY3NpX3N0YXR1cyk7CisJCX0KKwkJLyoKKwkJICogS0c6IE9vcHMgYWdhaW4uIFNhbWUgdGhpbmtvIGFzIGFib3ZlOiBUaGUgU0NTSSBtaWdodCBoYXZlIGJlZW4KKwkJICogZmFzdGVyIHRoYW4gdGhlIERNQSBlbmdpbmUsIHNvIHRoYXQgaXQgcmFuIG91dCBvZiBkYXRhLgorCQkgKiBJbiB0aGF0IGNhc2UsIHdlIGhhdmUgdG8gZG8ganVzdCBub3RoaW5nISAKKwkJICogQnV0OiBXaHkgdGhlIGludGVycnVwdDogTm8gcGhhc2UgY2hhbmdlLiBObyBYRkVSQ05UXzJfWkVSTy4gT3I/CisJCSAqLworCQkvKgorCQkgKiBLRzogVGhpcyBpcyBub25zZW5zZTogV2UgaGF2ZSBiZWVuIFdSSVRJTkcgZGF0YSB0byB0aGUgYnVzCisJCSAqIElmIHRoZSBTQ1NJIGVuZ2luZSBoYXMgbm8gYnl0ZXMgbGVmdCwgaG93IHNob3VsZCB0aGUgRE1BIGVuZ2luZT8KKwkJICovCisJCWlmIChkX2xlZnRfY291bnRlciA9PSAwKSB7CisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBpZiB0cmFuc2ZlciBub3QgeWV0IGNvbXBsZXRlCisJCQkgKiB0aGVyZSB3ZXJlIHNvbWUgZGF0YSByZXNpZHVlIGluIFNDU0kgRklGTyBvcgorCQkJICogU0NTSSB0cmFuc2ZlciBjb3VudGVyIG5vdCBlbXB0eQorCQkJICovCisJCQlsb25nIG9sZHhmZXJyZWQgPQorCQkJICAgIHNyYi0+dG90YWxfeGZlcl9sZW5ndGggLSBkX2xlZnRfY291bnRlcjsKKwkJCWNvbnN0IGludCBkaWZmID0KKwkJCSAgICAoZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQykgPyAyIDogMTsKKwkJCXNnX3VwZGF0ZV9saXN0KHNyYiwgZF9sZWZ0X2NvdW50ZXIpOworCQkJLyogS0c6IE1vc3QgdWdseSBoYWNrISBBcHBhcmVudGx5LCB0aGlzIHdvcmtzIGFyb3VuZCBhIGNoaXAgYnVnICovCisJCQlpZiAoKHNyYi0+c2VnbWVudF94W3NyYi0+c2dfaW5kZXhdLmxlbmd0aCA9PQorCQkJICAgICBkaWZmICYmIHNyYi0+Y21kLT51c2Vfc2cpCisJCQkgICAgfHwgKChvbGR4ZmVycmVkICYgflBBR0VfTUFTSykgPT0KKwkJCQkoUEFHRV9TSVpFIC0gZGlmZikpCisJCQkgICAgKSB7CisJCQkJZHByaW50a2woS0VSTl9JTkZPLCAiZGF0YV9vdXRfcGhhc2UwOiAiCisJCQkJCSJXb3JrIGFyb3VuZCBjaGlwIGJ1ZyAoJWkpP1xuIiwgZGlmZik7CisJCQkJZF9sZWZ0X2NvdW50ZXIgPQorCQkJCSAgICBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoIC0gZGlmZjsKKwkJCQlzZ191cGRhdGVfbGlzdChzcmIsIGRfbGVmdF9jb3VudGVyKTsKKwkJCQkvKnNyYi0+dG90YWxfeGZlcl9sZW5ndGggLT0gZGlmZjsgKi8KKwkJCQkvKnNyYi0+dmlydF9hZGRyICs9IGRpZmY7ICovCisJCQkJLyppZiAoc3JiLT5jbWQtPnVzZV9zZykgKi8KKwkJCQkvKiAgICAgIHNyYi0+c2dfaW5kZXgrKzsgKi8KKwkJCX0KKwkJfQorCX0KKwlpZiAoKCpwc2NzaV9zdGF0dXMgJiBQSEFTRU1BU0spICE9IFBIX0RBVEFfT1VUKSB7CisJCWNsZWFudXBfYWZ0ZXJfdHJhbnNmZXIoYWNiLCBzcmIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBkYXRhX291dF9waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgImRhdGFfb3V0X3BoYXNlMTogKHBpZCMlbGkpIDwlMDJpLSVpPlxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgc3JiLT5jbWQtPmRldmljZS0+aWQsIHNyYi0+Y21kLT5kZXZpY2UtPmx1bik7CisJY2xlYXJfZmlmbyhhY2IsICJkYXRhX291dF9waGFzZTEiKTsKKwkvKiBkbyBwcmVwYXJlIGJlZm9yZSB0cmFuc2ZlciB3aGVuIGRhdGEgb3V0IHBoYXNlICovCisJZGF0YV9pb190cmFuc2ZlcihhY2IsIHNyYiwgWEZFUkRBVEFPVVQpOworfQorCisKK3N0YXRpYyB2b2lkIGRhdGFfaW5fcGhhc2UwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKQoreworCXUxNiBzY3NpX3N0YXR1cyA9ICpwc2NzaV9zdGF0dXM7CisJdTMyIGRfbGVmdF9jb3VudGVyID0gMDsKKwlkcHJpbnRrZGJnKERCR18wLCAiZGF0YV9pbl9waGFzZTA6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCisJLyoKKwkgKiBLRzogRGF0YUluIGlzIG11Y2ggbW9yZSB0cmlja3kgdGhhbiBEYXRhT3V0LiBXaGVuIHRoZSBkZXZpY2UgaXMgZmluaXNoZWQKKwkgKiBhbmQgc3dpdGNoZXMgdG8gYW5vdGhlciBwaGFzZSwgdGhlIFNDU0kgZW5naW5lIHNob3VsZCBiZSBmaW5pc2hlZCB0b28uCisJICogQnV0OiBUaGVyZSBtaWdodCBzdGlsbCBiZSBieXRlcyBsZWZ0IGluIGl0cyBGSUZPIHRvIGJlIGZldGNoZWQgYnkgdGhlIERNQQorCSAqIGVuZ2luZSBhbmQgdHJhbnNmZXJyZWQgdG8gbWVtb3J5LgorCSAqIFdlIHNob3VsZCB3YWl0IGZvciB0aGUgRklGT3MgdG8gYmUgZW1wdGllZCBieSB0aGF0IChpcyB0aGVyZSBhbnkgd2F5IHRvIAorCSAqIGVuZm9yY2UgdGhpcz8pIGFuZCB0aGVuIHN0b3AgdGhlIERNQSBlbmdpbmUsIGJlY2F1c2UgaXQgbWlnaHQgdGhpbmssIHRoYXQKKwkgKiB0aGVyZSBhcmUgbW9yZSBieXRlcyB0byBmb2xsb3cuIFllcywgdGhlIGRldmljZSBtaWdodCBkaXNjb25uZWN0IHByaW9yIHRvCisJICogaGF2aW5nIGFsbCBieXRlcyB0cmFuc2ZlcnJlZCEgCisJICogQWxzbyB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgYWxsIGRhdGEgZnJvbSB0aGUgRE1BIGVuZ2luZSBidWZmZXIncyByZWFsbHkKKwkgKiBtYWRlIGl0cyB3YXkgdG8gdGhlIHN5c3RlbSBtZW1vcnkhIFNvbWUgZG9jdW1lbnRhdGlvbiBvbiB0aGlzIHdvdWxkIG5vdAorCSAqIHNlZW0gdG8gYmUgYSBiYWQgaWRlYSwgYWN0dWFsbHkuCisJICovCisJaWYgKCEoc3JiLT5zdGF0ZSAmIFNSQl9YRkVSUEFEKSkgeworCQlpZiAoc2NzaV9zdGF0dXMgJiBQQVJJVFlFUlJPUikgeworCQkJZHByaW50a2woS0VSTl9JTkZPLCAiZGF0YV9pbl9waGFzZTA6IChwaWQjJWxpKSAiCisJCQkJIlBhcml0eSBFcnJvclxuIiwgc3JiLT5jbWQtPnBpZCk7CisJCQlzcmItPnN0YXR1cyB8PSBQQVJJVFlfRVJST1I7CisJCX0KKwkJLyoKKwkJICogS0c6IFdlIHNob3VsZCB3YWl0IGZvciB0aGUgRE1BIEZJRk8gdG8gYmUgZW1wdHkgLi4uCisJCSAqIGJ1dDogaXQgd291bGQgYmUgYmV0dGVyIHRvIHdhaXQgZmlyc3QgZm9yIHRoZSBTQ1NJIEZJRk8gYW5kIHRoZW4gdGhlCisJCSAqIHRoZSBETUEgRklGTyB0byBiZWNvbWUgZW1wdHk/IEhvdyBkbyB3ZSBrbm93LCB0aGF0IHRoZSBkZXZpY2Ugbm90IGFscmVhZHkKKwkJICogc2VudCBkYXRhIHRvIHRoZSBGSUZPIGluIGEgTXNnSW4gcGhhc2UsIGVnLj8KKwkJICovCisJCWlmICghKERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfRklGT1NUQVQpICYgMHg4MCkpIHsKKyNpZiAwCisJCQlpbnQgY3RyID0gNjAwMDAwMDsKKwkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkJIkRJUDA6IFdhaXQgZm9yIERNQSBGSUZPIHRvIGZsdXNoIC4uLlxuIik7CisJCQkvKkRDMzk1eF93cml0ZTggIChUUk1fUzEwNDBfRE1BX0NPTlRST0wsIFNUT1BETUFYRkVSKTsgKi8KKwkJCS8qREMzOTV4X3dyaXRlMzIgKFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIsIDcpOyAqLworCQkJLypEQzM5NXhfd3JpdGU4ICAoVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgU0NNRF9ETUFfSU4pOyAqLworCQkJd2hpbGUgKCEKKwkJCSAgICAgICAoREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9ETUFfRklGT1NUQVQpICYKKwkJCQkweDgwKSAmJiAtLWN0cik7CisJCQlpZiAoY3RyIDwgNjAwMDAwMCAtIDEpCisJCQkJZHByaW50a2woS0VSTl9ERUJVRworCQkJCSAgICAgICAiRElQMDogSGFkIHRvIHdhaXQgZm9yIERNQSAuLi5cbiIpOworCQkJaWYgKCFjdHIpCisJCQkJZHByaW50a2woS0VSTl9FUlIsCisJCQkJICAgICAgICJEZWFkbG9jayBpbiBESVAwIHdhaXRpbmcgZm9yIERNQSBGSUZPIGVtcHR5ISFcbiIpOworCQkJLypEQzM5NXhfd3JpdGUzMiAoVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiwgMCk7ICovCisjZW5kaWYKKwkJCWRwcmludGtkYmcoREJHX0tHLCAiZGF0YV9pbl9waGFzZTA6ICIKKwkJCQkiRE1Be2ZpZm9jbnQ9MHglMDJ4IGZpZm9zdGF0PTB4JTAyeH1cbiIsCisJCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPQ05UKSwKKwkJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUKSk7CisJCX0KKwkJLyogTm93OiBDaGVjayByZW1haW5pZyBkYXRhOiBUaGUgU0NTSSBjb3VudGVycyBzaG91bGQgdGVsbCB1cyAuLi4gKi8KKwkJZF9sZWZ0X2NvdW50ZXIgPSBEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUikKKwkJICAgICsgKChEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSAmIDB4MWYpCisJCSAgICAgICA8PCAoKHNyYi0+ZGNiLT5zeW5jX3BlcmlvZCAmIFdJREVfU1lOQykgPyAxIDoKKwkJCSAgIDApKTsKKwkJZHByaW50a2RiZyhEQkdfS0csICJkYXRhX2luX3BoYXNlMDogIgorCQkJIlNDU0l7Zmlmb2NudD0weCUwMnglcyBjdHI9MHglMDh4fSAiCisJCQkiRE1Be2ZpZm9jbnQ9MHglMDJ4IGZpZm9zdGF0PTB4JTAyeCBjdHI9MHglMDh4fSAiCisJCQkiUmVtYWlue3RvdHhmZXI9JWkgc2NzaV9maWZvK2N0cj0laX1cbiIsCisJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSwKKwkJCShzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpID8gIndvcmRzIiA6ICJieXRlcyIsCisJCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiksCisJCQlEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfRE1BX0ZJRk9DTlQpLAorCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0RNQV9GSUZPU1RBVCksCisJCQlEQzM5NXhfcmVhZDMyKGFjYiwgVFJNX1MxMDQwX0RNQV9DWENOVCksCisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoLCBkX2xlZnRfY291bnRlcik7CisjaWYgREMzOTV4X0xBU1RQSU8KKwkJLyogS0c6IExlc3MgdGhhbiBvciBlcXVhbCB0byA0IGJ5dGVzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCB2aWEgRE1BLCBpdCBzZWVtcy4gKi8KKwkJaWYgKGRfbGVmdF9jb3VudGVyCisJCSAgICAmJiBzcmItPnRvdGFsX3hmZXJfbGVuZ3RoIDw9IERDMzk1eF9MQVNUUElPKSB7CisJCQkvKnUzMiBhZGRyID0gKHNyYi0+c2VnbWVudF94W3NyYi0+c2dfaW5kZXhdLmFkZHJlc3MpOyAqLworCQkJLypzZ191cGRhdGVfbGlzdCAoc3JiLCBkX2xlZnRfY291bnRlcik7ICovCisJCQlkcHJpbnRrZGJnKERCR19QSU8sICJkYXRhX2luX3BoYXNlMDogUElPICglaSAlcykgdG8gIgorCQkJCSIlcCBmb3IgcmVtYWluaW5nICVpIGJ5dGVzOiIsCisJCQkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGT0NOVCkgJiAweDFmLAorCQkJCShzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpID8KKwkJCQkgICAgIndvcmRzIiA6ICJieXRlcyIsCisJCQkJc3JiLT52aXJ0X2FkZHIsCisJCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCk7CisJCQlpZiAoc3JiLT5kY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKQorCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05GSUcyLAorCQkJCQkgICAgICBDRkcyX1dJREVGSUZPKTsKKwkJCXdoaWxlIChEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSAhPSAweDQwKSB7CisJCQkJdTggYnl0ZSA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOworCQkJCSooc3JiLT52aXJ0X2FkZHIpKysgPSBieXRlOworCQkJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJCQlwcmludGsoIiAlMDJ4IiwgYnl0ZSk7CisJCQkJZF9sZWZ0X2NvdW50ZXItLTsKKwkJCQlzZ19zdWJ0cmFjdF9vbmUoc3JiKTsKKwkJCX0KKwkJCWlmIChzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpIHsKKyNpZiAxCisgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgbGFzdCBieXRlIC4uLiAqLworCQkJCWlmIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID4gMCkgeworCQkJCQl1OCBieXRlID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTyk7CisJCQkJCSooc3JiLT52aXJ0X2FkZHIpKysgPSBieXRlOworCQkJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoLS07CisJCQkJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJCQkJcHJpbnRrKCIgJTAyeCIsIGJ5dGUpOworCQkJCX0KKyNlbmRpZgorCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05GSUcyLCAwKTsKKwkJCX0KKwkJCS8qcHJpbnRrKCIgJTA4eCIsICoodTMyKikoYnVzX3RvX3ZpcnQgKGFkZHIpKSk7ICovCisJCQkvKnNyYi0+dG90YWxfeGZlcl9sZW5ndGggPSAwOyAqLworCQkJaWYgKGRlYnVnX2VuYWJsZWQoREJHX1BJTykpCisJCQkJcHJpbnRrKCJcbiIpOworCQl9CisjZW5kaWYJCQkJLyogREMzOTV4X0xBU1RQSU8gKi8KKworI2lmIDAKKwkJLyoKKwkJICogS0c6IFRoaXMgd2FzIGluIERBVEFPVVQuIERvZXMgaXQgYWxzbyBiZWxvbmcgaGVyZT8KKwkJICogTm9ib2R5IHNlZW1zIHRvIGtub3cgd2hhdCBjb3VudGVyIGFuZCBmaWZvX2NudCBjb3VudCBleGFjdGx5IC4uLgorCQkgKi8KKwkJaWYgKCEoc2NzaV9zdGF0dXMgJiBTQ1NJWEZFUkRPTkUpKSB7CisJCQkvKgorCQkJICogd2hlbiBkYXRhIHRyYW5zZmVyIGZyb20gRE1BIEZJRk8gdG8gU0NTSSBGSUZPCisJCQkgKiBpZiB0aGVyZSB3YXMgc29tZSBkYXRhIGxlZnQgaW4gU0NTSSBGSUZPCisJCQkgKi8KKwkJCWRfbGVmdF9jb3VudGVyID0KKwkJCSAgICAodTMyKShEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPQ05UKSAmCisJCQkJICAweDFGKTsKKwkJCWlmIChzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpCisJCQkJZF9sZWZ0X2NvdW50ZXIgPDw9IDE7CisJCQkvKgorCQkJICogaWYgV0lERSBzY3NpIFNDU0kgRklGT0NOVCB1bml0IGlzIHdvcmQgISEhCisJCQkgKiBzbyBuZWVkIHRvICo9IDIKKwkJCSAqIEtHOiBTZWVtcyB0byBiZSBjb3JyZWN0IC4uLgorCQkJICovCisJCX0KKyNlbmRpZgorCQkvKiBLRzogVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCBhbnkgbW9yZSEgKi8KKwkJaWYgKGRfbGVmdF9jb3VudGVyID09IDAKKwkJICAgIHx8IChzY3NpX3N0YXR1cyAmIFNDU0lYRkVSQ05UXzJfWkVSTykpIHsKKyNpZiAwCisJCQlpbnQgY3RyID0gNjAwMDAwMDsKKwkJCXU4IFRlbXBETUFzdGF0dXM7CisJCQlkbyB7CisJCQkJVGVtcERNQXN0YXR1cyA9CisJCQkJICAgIERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfU1RBVFVTKTsKKwkJCX0gd2hpbGUgKCEoVGVtcERNQXN0YXR1cyAmIERNQVhGRVJDT01QKSAmJiAtLWN0cik7CisJCQlpZiAoIWN0cikKKwkJCQlkcHJpbnRrbChLRVJOX0VSUiwKKwkJCQkgICAgICAgIkRlYWRsb2NrIGluIERhdGFJblBoYXNlMCB3YWl0aW5nIGZvciBETUEhIVxuIik7CisJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID0gMDsKKyNlbmRpZgorCQkJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IGRfbGVmdF9jb3VudGVyOworCQl9IGVsc2UgewkvKiBwaGFzZSBjaGFuZ2VkICovCisJCQkvKgorCQkJICogcGFyc2luZyB0aGUgY2FzZToKKwkJCSAqIHdoZW4gYSB0cmFuc2ZlciBub3QgeWV0IGNvbXBsZXRlIAorCQkJICogYnV0IGJlIGRpc2Nvbm5lY3RlZCBieSB0YXJnZXQKKwkJCSAqIGlmIHRyYW5zZmVyIG5vdCB5ZXQgY29tcGxldGUKKwkJCSAqIHRoZXJlIHdlcmUgc29tZSBkYXRhIHJlc2lkdWUgaW4gU0NTSSBGSUZPIG9yCisJCQkgKiBTQ1NJIHRyYW5zZmVyIGNvdW50ZXIgbm90IGVtcHR5CisJCQkgKi8KKwkJCXNnX3VwZGF0ZV9saXN0KHNyYiwgZF9sZWZ0X2NvdW50ZXIpOworCQl9CisJfQorCS8qIEtHOiBUaGUgdGFyZ2V0IG1heSBkZWNpZGUgdG8gZGlzY29ubmVjdDogRW1wdHkgRklGTyBiZWZvcmUhICovCisJaWYgKCgqcHNjc2lfc3RhdHVzICYgUEhBU0VNQVNLKSAhPSBQSF9EQVRBX0lOKSB7CisJCWNsZWFudXBfYWZ0ZXJfdHJhbnNmZXIoYWNiLCBzcmIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBkYXRhX2luX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAiZGF0YV9pbl9waGFzZTE6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCWRhdGFfaW9fdHJhbnNmZXIoYWNiLCBzcmIsIFhGRVJEQVRBSU4pOworfQorCisKK3N0YXRpYyB2b2lkIGRhdGFfaW9fdHJhbnNmZXIoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIsIHUxNiBpb19kaXIpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gc3JiLT5kY2I7CisJdTggYnZhbDsKKwlkcHJpbnRrZGJnKERCR18wLAorCQkiZGF0YV9pb190cmFuc2ZlcjogKHBpZCMlbGkpIDwlMDJpLSVpPiAlYyBsZW49JWksIHNnPSglaS8laSlcbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4sCisJCSgoaW9fZGlyICYgRE1BQ01EX0RJUikgPyAncicgOiAndycpLAorCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoLCBzcmItPnNnX2luZGV4LCBzcmItPnNnX2NvdW50KTsKKwlpZiAoc3JiID09IGFjYi0+dG1wX3NyYikKKwkJZHByaW50a2woS0VSTl9FUlIsICJkYXRhX2lvX3RyYW5zZmVyOiBVc2luZyB0bXBfc3JiIVxuIik7CisJaWYgKHNyYi0+c2dfaW5kZXggPj0gc3JiLT5zZ19jb3VudCkgeworCQkvKiBjYW4ndCBoYXBwZW4/IG91dCBvZiBib3VuZHMgZXJyb3IgKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID4gREMzOTV4X0xBU1RQSU8pIHsKKwkJdTggZG1hX3N0YXR1cyA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfU1RBVFVTKTsKKwkJLyoKKwkJICogS0c6IFdoYXQgc2hvdWxkIHdlIGRvOiBVc2UgU0NTSSBDbWQgMHg5MC8weDkyPworCQkgKiBNYXliZSwgZXZlbiBBQk9SVFhGRVIgd291bGQgYmUgYXBwcm9wcmlhdGUKKwkJICovCisJCWlmIChkbWFfc3RhdHVzICYgWEZFUlBFTkRJTkcpIHsKKwkJCWRwcmludGtsKEtFUk5fREVCVUcsICJkYXRhX2lvX3RyYW5zZmVyOiBYZmVyIHBlbmRpbmchICIKKwkJCQkiRXhwZWN0IHRyb3VibGUhXG4iKTsKKwkJCWR1bXBfcmVnaXN0ZXJfaW5mbyhhY2IsIGRjYiwgc3JiKTsKKwkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIENMUlhGSUZPKTsKKwkJfQorCQkvKiBjbGVhcl9maWZvKGFjYiwgIklPIik7ICovCisJCS8qIAorCQkgKiBsb2FkIHdoYXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBTY2F0dGVyL0dhdGhlciBsaXN0IHRhYmxlCisJCSAqIHdhbnQgdG8gYmUgdHJhbnNmZXIKKwkJICovCisJCXNyYi0+c3RhdGUgfD0gU1JCX0RBVEFfWEZFUjsKKwkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hISUdIQUREUiwgMCk7CisJCWlmIChzcmItPmNtZC0+dXNlX3NnKSB7CS8qIHdpdGggUy9HICovCisJCQlpb19kaXIgfD0gRE1BQ01EX1NHOworCQkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hMT1dBRERSLAorCQkJCSAgICAgICBzcmItPnNnX2J1c19hZGRyICsKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBTR2VudHJ5KSAqCisJCQkJICAgICAgIHNyYi0+c2dfaW5kZXgpOworCQkJLyogbG9hZCBob3cgbWFueSBieXRlcyBpbiB0aGUgc2cgbGlzdCB0YWJsZSAqLworCQkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hDTlQsCisJCQkJICAgICAgICgodTMyKShzcmItPnNnX2NvdW50IC0KKwkJCQkJICAgICAgc3JiLT5zZ19pbmRleCkgPDwgMykpOworCQl9IGVsc2UgewkvKiB3aXRob3V0IFMvRyAqLworCQkJaW9fZGlyICY9IH5ETUFDTURfU0c7CisJCQlEQzM5NXhfd3JpdGUzMihhY2IsIFRSTV9TMTA0MF9ETUFfWExPV0FERFIsCisJCQkJICAgICAgIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MpOworCQkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfRE1BX1hDTlQsCisJCQkJICAgICAgIHNyYi0+c2VnbWVudF94WzBdLmxlbmd0aCk7CisJCX0KKwkJLyogbG9hZCB0b3RhbCB0cmFuc2ZlciBsZW5ndGggKDI0Yml0cykgbWF4IHZhbHVlIDE2TWJ5dGUgKi8KKwkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSLAorCQkJICAgICAgIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQlpZiAoaW9fZGlyICYgRE1BQ01EX0RJUikgewkvKiByZWFkICovCisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwKKwkJCQkgICAgICBTQ01EX0RNQV9JTik7CisJCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9ETUFfQ09NTUFORCwgaW9fZGlyKTsKKwkJfSBlbHNlIHsKKwkJCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX0RNQV9DT01NQU5ELCBpb19kaXIpOworCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsCisJCQkJICAgICAgU0NNRF9ETUFfT1VUKTsKKwkJfQorCisJfQorI2lmIERDMzk1eF9MQVNUUElPCisJZWxzZSBpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA+IDApIHsJLyogVGhlIGxhc3QgZm91ciBieXRlczogRG8gUElPICovCisJCS8qIAorCQkgKiBsb2FkIHdoYXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBTY2F0dGVyL0dhdGhlciBsaXN0IHRhYmxlCisJCSAqIHdhbnQgdG8gYmUgdHJhbnNmZXIKKwkJICovCisJCXNyYi0+c3RhdGUgfD0gU1JCX0RBVEFfWEZFUjsKKwkJLyogbG9hZCB0b3RhbCB0cmFuc2ZlciBsZW5ndGggKDI0Yml0cykgbWF4IHZhbHVlIDE2TWJ5dGUgKi8KKwkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSLAorCQkJICAgICAgIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQlpZiAoaW9fZGlyICYgRE1BQ01EX0RJUikgewkvKiByZWFkICovCisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwKKwkJCQkgICAgICBTQ01EX0ZJRk9fSU4pOworCQl9IGVsc2UgewkvKiB3cml0ZSAqLworCQkJaW50IGxuID0gc3JiLT50b3RhbF94ZmVyX2xlbmd0aDsKKwkJCWlmIChzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpCisJCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzIsCisJCQkJICAgICBDRkcyX1dJREVGSUZPKTsKKwkJCWRwcmludGtkYmcoREJHX1BJTywKKwkJCQkiZGF0YV9pb190cmFuc2ZlcjogUElPICVpIGJ5dGVzIGZyb20gJXA6IiwKKwkJCQlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoLCBzcmItPnZpcnRfYWRkcik7CisKKwkJCXdoaWxlIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKSB7CisJCQkJaWYgKGRlYnVnX2VuYWJsZWQoREJHX1BJTykpCisJCQkJCXByaW50aygiICUwMngiLCAodW5zaWduZWQgY2hhcikgKihzcmItPnZpcnRfYWRkcikpOworCisJCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8sIAorCQkJCSAgICAgKihzcmItPnZpcnRfYWRkcikrKyk7CisKKwkJCQlzZ19zdWJ0cmFjdF9vbmUoc3JiKTsKKwkJCX0KKwkJCWlmIChzcmItPmRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpIHsKKwkJCQlpZiAobG4gJSAyKSB7CisJCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAwKTsKKwkJCQkJaWYgKGRlYnVnX2VuYWJsZWQoREJHX1BJTykpCisJCQkJCQlwcmludGsoIiB8MDAiKTsKKwkJCQl9CisJCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzIsIDApOworCQkJfQorCQkJLypEQzM5NXhfd3JpdGUzMihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPVU5URVIsIGxuKTsgKi8KKwkJCWlmIChkZWJ1Z19lbmFibGVkKERCR19QSU8pKQorCQkJCXByaW50aygiXG4iKTsKKwkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELAorCQkJCQkgIFNDTURfRklGT19PVVQpOworCQl9CisJfQorI2VuZGlmCQkJCS8qIERDMzk1eF9MQVNUUElPICovCisJZWxzZSB7CQkvKiB4ZmVyIHBhZCAqLworCQl1OCBkYXRhID0gMCwgZGF0YTIgPSAwOworCQlpZiAoc3JiLT5zZ19jb3VudCkgeworCQkJc3JiLT5hZGFwdGVyX3N0YXR1cyA9IEhfT1ZFUl9VTkRFUl9SVU47CisJCQlzcmItPnN0YXR1cyB8PSBPVkVSX1JVTjsKKwkJfQorCQkvKgorCQkgKiBLRzogZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHdlIGFyZSB1c2luZyAxNiBiaXRzIEkvTyBvcHMKKwkJICogdGhlIFNDU0kgRklGTyBpcyBvbmx5IDggYml0cyBhY2NvcmRpbmcgdG8gdGhlIGRvY3MKKwkJICogKHdlIGNhbiBzZXQgYml0IDEgaW4gMHg4ZiB0byBzZXJpYWxpemUgRklGTyBhY2Nlc3MgLi4uKQorCQkgKi8KKwkJaWYgKGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpIHsKKwkJCURDMzk1eF93cml0ZTMyKGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09VTlRFUiwgMik7CisJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMiwKKwkJCQkgICAgICBDRkcyX1dJREVGSUZPKTsKKwkJCWlmIChpb19kaXIgJiBETUFDTURfRElSKSB7CisJCQkJZGF0YSA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOworCQkJCWRhdGEyID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTyk7CisJCQl9IGVsc2UgeworCQkJCS8qIERhbmdlciwgUm9iaW5zb246IElmIHlvdSBmaW5kIEtHcworCQkJCSAqIHNjYXR0ZXJlZCBvdmVyIHRoZSB3aWRlIGRpc2ssIHRoZSBkcml2ZXIKKwkJCQkgKiBvciBjaGlwIGlzIHRvIGJsYW1lIDotKCAqLworCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAnSycpOworCQkJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPLCAnRycpOworCQkJfQorCQkJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzIsIDApOworCQl9IGVsc2UgeworCQkJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSLCAxKTsKKwkJCS8qIERhbmdlciwgUm9iaW5zb246IElmIHlvdSBmaW5kIGEgY29sbGVjdGlvbiBvZiBLcyBvbiB5b3VyIGRpc2sKKwkJCSAqIHNvbWV0aGluZyBicm9rZSA6LSggKi8KKwkJCWlmIChpb19kaXIgJiBETUFDTURfRElSKQorCQkJCWRhdGEgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9GSUZPKTsKKwkJCWVsc2UKKwkJCQlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTywgJ0snKTsKKwkJfQorCQlzcmItPnN0YXRlIHw9IFNSQl9YRkVSUEFEOworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQkvKiBTQ1NJIGNvbW1hbmQgKi8KKwkJYnZhbCA9IChpb19kaXIgJiBETUFDTURfRElSKSA/IFNDTURfRklGT19JTiA6IFNDTURfRklGT19PVVQ7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT01NQU5ELCBidmFsKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc3RhdHVzX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAic3RhdHVzX3BoYXNlMDogKHBpZCMlbGkpIDwlMDJpLSVpPlxuIiwKKwkJc3JiLT5jbWQtPnBpZCwgc3JiLT5jbWQtPmRldmljZS0+aWQsIHNyYi0+Y21kLT5kZXZpY2UtPmx1bik7CisJc3JiLT50YXJnZXRfc3RhdHVzID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfRklGTyk7CisJc3JiLT5lbmRfbWVzc2FnZSA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOwkvKiBnZXQgbWVzc2FnZSAqLworCXNyYi0+c3RhdGUgPSBTUkJfQ09NUExFVEVEOworCSpwc2NzaV9zdGF0dXMgPSBQSF9CVVNfRlJFRTsJLyouLiBpbml0aWFsIHBoYXNlICovCisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkvKiBpdCdzIGltcG9ydGFudCBmb3IgYXRuIHN0b3AgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgU0NNRF9NU0dBQ0NFUFQpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXR1c19waGFzZTEoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYiwKKwkJdTE2ICpwc2NzaV9zdGF0dXMpCit7CisJZHByaW50a2RiZyhEQkdfMCwgInN0YXR1c19waGFzZTE6IChwaWQjJWxpKSA8JTAyaS0laT5cbiIsCisJCXNyYi0+Y21kLT5waWQsIHNyYi0+Y21kLT5kZXZpY2UtPmlkLCBzcmItPmNtZC0+ZGV2aWNlLT5sdW4pOworCXNyYi0+c3RhdGUgPSBTUkJfU1RBVFVTOworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fREFUQUxBVENIKTsJLyogaXQncyBpbXBvcnRhbnQgZm9yIGF0biBzdG9wICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfQ09NUCk7Cit9CisKKworLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUgKi8KK3N0YXRpYyBpbmxpbmUgdTggbXNnaW5fY29tcGxldGVkKHU4ICogbXNnYnVmLCB1MzIgbGVuKQoreworCWlmICgqbXNnYnVmID09IEVYVEVOREVEX01FU1NBR0UpIHsKKwkJaWYgKGxlbiA8IDIpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGxlbiA8IG1zZ2J1ZlsxXSArIDIpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCptc2didWYgPj0gMHgyMCAmJiAqbXNnYnVmIDw9IDB4MmYpCS8qIHR3byBieXRlIG1lc3NhZ2VzICovCisJCWlmIChsZW4gPCAyKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIHJlamVjdF9tc2cgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc2dpbl9yZWplY3Qoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzcmItPm1zZ291dF9idWZbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwlzcmItPm1zZ19jb3VudCA9IDE7CisJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJc3JiLT5zdGF0ZSAmPSB+U1JCX01TR0lOOworCXNyYi0+c3RhdGUgfD0gU1JCX01TR09VVDsKKwlkcHJpbnRrbChLRVJOX0lORk8sICJtc2dpbl9yZWplY3Q6IDB4JTAyeCA8JTAyaS0laT5cbiIsCisJCXNyYi0+bXNnaW5fYnVmWzBdLAorCQlzcmItPmRjYi0+dGFyZ2V0X2lkLCBzcmItPmRjYi0+dGFyZ2V0X2x1bik7Cit9CisKKworc3RhdGljIHN0cnVjdCBTY3NpUmVxQmxrICptc2dpbl9xdGFnKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwgdTggdGFnKQoreworCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIgPSBOVUxMOworCXN0cnVjdCBTY3NpUmVxQmxrICppOworCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9xdGFnOiAocGlkIyVsaSkgdGFnPSVpIHNyYj0lcFxuIiwKKwkJICAgc3JiLT5jbWQtPnBpZCwgdGFnLCBzcmIpOworCisJaWYgKCEoZGNiLT50YWdfbWFzayAmICgxIDw8IHRhZykpKQorCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJIm1zZ2luX3F0YWc6IHRhZ19tYXNrPTB4JTA4eCBkb2VzIG5vdCByZXNlcnZlIHRhZyAlaSFcbiIsCisJCQlkY2ItPnRhZ19tYXNrLCB0YWcpOworCisJaWYgKGxpc3RfZW1wdHkoJmRjYi0+c3JiX2dvaW5nX2xpc3QpKQorCQlnb3RvIG1pbmd4MDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZkY2ItPnNyYl9nb2luZ19saXN0LCBsaXN0KSB7CisJCWlmIChpLT50YWdfbnVtYmVyID09IHRhZykgeworCQkJc3JiID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghc3JiKQorCQlnb3RvIG1pbmd4MDsKKworCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9xdGFnOiAocGlkIyVsaSkgPCUwMmktJWk+XG4iLAorCQlzcmItPmNtZC0+cGlkLCBzcmItPmRjYi0+dGFyZ2V0X2lkLCBzcmItPmRjYi0+dGFyZ2V0X2x1bik7CisJaWYgKGRjYi0+ZmxhZyAmIEFCT1JUX0RFVl8pIHsKKwkJLypzcmItPnN0YXRlID0gU1JCX0FCT1JUX1NFTlQ7ICovCisJCWVuYWJsZV9tc2dvdXRfYWJvcnQoYWNiLCBzcmIpOworCX0KKworCWlmICghKHNyYi0+c3RhdGUgJiBTUkJfRElTQ09OTkVDVCkpCisJCWdvdG8gbWluZ3gwOworCisJbWVtY3B5KHNyYi0+bXNnaW5fYnVmLCBkY2ItPmFjdGl2ZV9zcmItPm1zZ2luX2J1ZiwgYWNiLT5tc2dfbGVuKTsKKwlzcmItPnN0YXRlIHw9IGRjYi0+YWN0aXZlX3NyYi0+c3RhdGU7CisJc3JiLT5zdGF0ZSB8PSBTUkJfREFUQV9YRkVSOworCWRjYi0+YWN0aXZlX3NyYiA9IHNyYjsKKwkvKiBIb3cgY2FuIHdlIG1ha2UgdGhlIERPUlMgaGFwcHk/ICovCisJcmV0dXJuIHNyYjsKKworICAgICAgbWluZ3gwOgorCXNyYiA9IGFjYi0+dG1wX3NyYjsKKwlzcmItPnN0YXRlID0gU1JCX1VORVhQRUNUX1JFU0VMOworCWRjYi0+YWN0aXZlX3NyYiA9IHNyYjsKKwlzcmItPm1zZ291dF9idWZbMF0gPSBNU0dfQUJPUlRfVEFHOworCXNyYi0+bXNnX2NvdW50ID0gMTsKKwlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwlkcHJpbnRrbChLRVJOX0RFQlVHLCAibXNnaW5fcXRhZzogVW5rbm93biB0YWcgJWkgLSBhYm9ydFxuIiwgdGFnKTsKKwlyZXR1cm4gc3JiOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXByb2dyYW1fcmVncyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IpCit7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1RBUkdFVElELCBkY2ItPnRhcmdldF9pZCk7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NZTkMsIGRjYi0+c3luY19wZXJpb2QpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9PRkZTRVQsIGRjYi0+c3luY19vZmZzZXQpOworCXNldF94ZmVyX3JhdGUoYWNiLCBkY2IpOworfQorCisKKy8qIHNldCBhc3luYyB0cmFuc2ZlciBtb2RlICovCitzdGF0aWMgdm9pZCBtc2dpbl9zZXRfYXN5bmMoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBzcmItPmRjYjsKKwlkcHJpbnRrbChLRVJOX0RFQlVHLCAibXNnaW5fc2V0X2FzeW5jOiBObyBzeW5jIHRyYW5zZmVycyA8JTAyaS0laT5cbiIsCisJCWRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4pOworCisJZGNiLT5zeW5jX21vZGUgJj0gfihTWU5DX05FR09fRU5BQkxFKTsKKwlkY2ItPnN5bmNfbW9kZSB8PSBTWU5DX05FR09fRE9ORTsKKwkvKmRjYi0+c3luY19wZXJpb2QgJj0gMDsgKi8KKwlkY2ItPnN5bmNfb2Zmc2V0ID0gMDsKKwlkY2ItPm1pbl9uZWdvX3BlcmlvZCA9IDIwMCA+PiAyOwkvKiAyMDBucyA8PT4gNSBNSHogKi8KKwlzcmItPnN0YXRlICY9IH5TUkJfRE9fU1lOQ19ORUdPOworCXJlcHJvZ3JhbV9yZWdzKGFjYiwgZGNiKTsKKwlpZiAoKGRjYi0+c3luY19tb2RlICYgV0lERV9ORUdPX0VOQUJMRSkKKwkgICAgJiYgIShkY2ItPnN5bmNfbW9kZSAmIFdJREVfTkVHT19ET05FKSkgeworCQlidWlsZF93ZHRyKGFjYiwgZGNiLCBzcmIpOworCQlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3NldF9hc3luYyhyZWopOiBUcnkgV0RUUiBhbnl3YXlcbiIpOworCX0KK30KKworCisvKiBzZXQgc3luYyB0cmFuc2ZlciBtb2RlICovCitzdGF0aWMgdm9pZCBtc2dpbl9zZXRfc3luYyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiA9IHNyYi0+ZGNiOworCXU4IGJ2YWw7CisJaW50IGZhY3Q7CisJZHByaW50a2RiZyhEQkdfMSwgIm1zZ2luX3NldF9zeW5jOiA8JTAyaT4gU3luYzogJWlucyAiCisJCSIoJTAyaS4lMDFpIE1IeikgT2Zmc2V0ICVpXG4iLAorCQlkY2ItPnRhcmdldF9pZCwgc3JiLT5tc2dpbl9idWZbM10gPDwgMiwKKwkJKDI1MCAvIHNyYi0+bXNnaW5fYnVmWzNdKSwKKwkJKCgyNTAgJSBzcmItPm1zZ2luX2J1ZlszXSkgKiAxMCkgLyBzcmItPm1zZ2luX2J1ZlszXSwKKwkJc3JiLT5tc2dpbl9idWZbNF0pOworCisJaWYgKHNyYi0+bXNnaW5fYnVmWzRdID4gMTUpCisJCXNyYi0+bXNnaW5fYnVmWzRdID0gMTU7CisJaWYgKCEoZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19TWU5DX05FR08pKQorCQlkY2ItPnN5bmNfb2Zmc2V0ID0gMDsKKwllbHNlIGlmIChkY2ItPnN5bmNfb2Zmc2V0ID09IDApCisJCWRjYi0+c3luY19vZmZzZXQgPSBzcmItPm1zZ2luX2J1Zls0XTsKKwlpZiAoc3JiLT5tc2dpbl9idWZbNF0gPiBkY2ItPnN5bmNfb2Zmc2V0KQorCQlzcmItPm1zZ2luX2J1Zls0XSA9IGRjYi0+c3luY19vZmZzZXQ7CisJZWxzZQorCQlkY2ItPnN5bmNfb2Zmc2V0ID0gc3JiLT5tc2dpbl9idWZbNF07CisJYnZhbCA9IDA7CisJd2hpbGUgKGJ2YWwgPCA3ICYmIChzcmItPm1zZ2luX2J1ZlszXSA+IGNsb2NrX3BlcmlvZFtidmFsXQorCQkJICAgIHx8IGRjYi0+bWluX25lZ29fcGVyaW9kID4KKwkJCSAgICBjbG9ja19wZXJpb2RbYnZhbF0pKQorCQlidmFsKys7CisJaWYgKHNyYi0+bXNnaW5fYnVmWzNdIDwgY2xvY2tfcGVyaW9kW2J2YWxdKQorCQlkcHJpbnRrbChLRVJOX0lORk8sCisJCQkibXNnaW5fc2V0X3N5bmM6IEluY3JlYXNlIHN5bmMgbmVnbyBwZXJpb2QgdG8gJWluc1xuIiwKKwkJCWNsb2NrX3BlcmlvZFtidmFsXSA8PCAyKTsKKwlzcmItPm1zZ2luX2J1ZlszXSA9IGNsb2NrX3BlcmlvZFtidmFsXTsKKwlkY2ItPnN5bmNfcGVyaW9kICY9IDB4ZjA7CisJZGNiLT5zeW5jX3BlcmlvZCB8PSBBTFRfU1lOQyB8IGJ2YWw7CisJZGNiLT5taW5fbmVnb19wZXJpb2QgPSBzcmItPm1zZ2luX2J1ZlszXTsKKworCWlmIChkY2ItPnN5bmNfcGVyaW9kICYgV0lERV9TWU5DKQorCQlmYWN0ID0gNTAwOworCWVsc2UKKwkJZmFjdCA9IDI1MDsKKworCWRwcmludGtsKEtFUk5fSU5GTywKKwkJIlRhcmdldCAlMDJpOiAlcyBTeW5jOiAlaW5zIE9mZnNldCAlaSAoJTAyaS4lMDFpIE1CL3MpXG4iLAorCQlkY2ItPnRhcmdldF9pZCwgKGZhY3QgPT0gNTAwKSA/ICJXaWRlMTYiIDogIiIsCisJCWRjYi0+bWluX25lZ29fcGVyaW9kIDw8IDIsIGRjYi0+c3luY19vZmZzZXQsCisJCShmYWN0IC8gZGNiLT5taW5fbmVnb19wZXJpb2QpLAorCQkoKGZhY3QgJSBkY2ItPm1pbl9uZWdvX3BlcmlvZCkgKiAxMCArCisJCWRjYi0+bWluX25lZ29fcGVyaW9kIC8gMikgLyBkY2ItPm1pbl9uZWdvX3BlcmlvZCk7CisKKwlpZiAoIShzcmItPnN0YXRlICYgU1JCX0RPX1NZTkNfTkVHTykpIHsKKwkJLyogUmVwbHkgd2l0aCBjb3JyZWN0ZWQgU0RUUiBNZXNzYWdlICovCisJCWRwcmludGtsKEtFUk5fREVCVUcsICJtc2dpbl9zZXRfc3luYzogYW5zd2VyIHcvJWlucyAlaVxuIiwKKwkJCXNyYi0+bXNnaW5fYnVmWzNdIDw8IDIsIHNyYi0+bXNnaW5fYnVmWzRdKTsKKworCQltZW1jcHkoc3JiLT5tc2dvdXRfYnVmLCBzcmItPm1zZ2luX2J1ZiwgNSk7CisJCXNyYi0+bXNnX2NvdW50ID0gNTsKKwkJREMzOTV4X0VOQUJMRV9NU0dPVVQ7CisJCWRjYi0+c3luY19tb2RlIHw9IFNZTkNfTkVHT19ET05FOworCX0gZWxzZSB7CisJCWlmICgoZGNiLT5zeW5jX21vZGUgJiBXSURFX05FR09fRU5BQkxFKQorCQkgICAgJiYgIShkY2ItPnN5bmNfbW9kZSAmIFdJREVfTkVHT19ET05FKSkgeworCQkJYnVpbGRfd2R0cihhY2IsIGRjYiwgc3JiKTsKKwkJCURDMzk1eF9FTkFCTEVfTVNHT1VUOworCQkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3NldF9zeW5jOiBBbHNvIHRyeSBXRFRSXG4iKTsKKwkJfQorCX0KKwlzcmItPnN0YXRlICY9IH5TUkJfRE9fU1lOQ19ORUdPOworCWRjYi0+c3luY19tb2RlIHw9IFNZTkNfTkVHT19ET05FIHwgU1lOQ19ORUdPX0VOQUJMRTsKKworCXJlcHJvZ3JhbV9yZWdzKGFjYiwgZGNiKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnaW5fc2V0X25vd2lkZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiA9IHNyYi0+ZGNiOworCWRwcmludGtkYmcoREJHXzEsICJtc2dpbl9zZXRfbm93aWRlOiA8JTAyaT5cbiIsIGRjYi0+dGFyZ2V0X2lkKTsKKworCWRjYi0+c3luY19wZXJpb2QgJj0gfldJREVfU1lOQzsKKwlkY2ItPnN5bmNfbW9kZSAmPSB+KFdJREVfTkVHT19FTkFCTEUpOworCWRjYi0+c3luY19tb2RlIHw9IFdJREVfTkVHT19ET05FOworCXNyYi0+c3RhdGUgJj0gflNSQl9ET19XSURFX05FR087CisJcmVwcm9ncmFtX3JlZ3MoYWNiLCBkY2IpOworCWlmICgoZGNiLT5zeW5jX21vZGUgJiBTWU5DX05FR09fRU5BQkxFKQorCSAgICAmJiAhKGRjYi0+c3luY19tb2RlICYgU1lOQ19ORUdPX0RPTkUpKSB7CisJCWJ1aWxkX3NkdHIoYWNiLCBkY2IsIHNyYik7CisJCURDMzk1eF9FTkFCTEVfTVNHT1VUOworCQlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fc2V0X25vd2lkZTogUmVqZWN0ZWQuIFRyeSBTRFRSIGFueXdheVxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc2dpbl9zZXRfd2lkZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiA9IHNyYi0+ZGNiOworCXU4IHdpZGUgPSAoZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19XSURFX05FR08KKwkJICAgJiYgYWNiLT5jb25maWcgJiBIQ0NfV0lERV9DQVJEKSA/IDEgOiAwOworCWRwcmludGtkYmcoREJHXzEsICJtc2dpbl9zZXRfd2lkZTogPCUwMmk+XG4iLCBkY2ItPnRhcmdldF9pZCk7CisKKwlpZiAoc3JiLT5tc2dpbl9idWZbM10gPiB3aWRlKQorCQlzcmItPm1zZ2luX2J1ZlszXSA9IHdpZGU7CisJLyogQ29tcGxldGVkICovCisJaWYgKCEoc3JiLT5zdGF0ZSAmIFNSQl9ET19XSURFX05FR08pKSB7CisJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkibXNnaW5fc2V0X3dpZGU6IFdpZGUgbmVnbyBpbml0aWF0ZWQgPCUwMmk+XG4iLAorCQkJZGNiLT50YXJnZXRfaWQpOworCQltZW1jcHkoc3JiLT5tc2dvdXRfYnVmLCBzcmItPm1zZ2luX2J1ZiwgNCk7CisJCXNyYi0+bXNnX2NvdW50ID0gNDsKKwkJc3JiLT5zdGF0ZSB8PSBTUkJfRE9fV0lERV9ORUdPOworCQlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwl9CisKKwlkY2ItPnN5bmNfbW9kZSB8PSAoV0lERV9ORUdPX0VOQUJMRSB8IFdJREVfTkVHT19ET05FKTsKKwlpZiAoc3JiLT5tc2dpbl9idWZbM10gPiAwKQorCQlkY2ItPnN5bmNfcGVyaW9kIHw9IFdJREVfU1lOQzsKKwllbHNlCisJCWRjYi0+c3luY19wZXJpb2QgJj0gfldJREVfU1lOQzsKKwlzcmItPnN0YXRlICY9IH5TUkJfRE9fV0lERV9ORUdPOworCS8qZGNiLT5zeW5jX21vZGUgJj0gfihXSURFX05FR09fRU5BQkxFK1dJREVfTkVHT19ET05FKTsgKi8KKwlkcHJpbnRrZGJnKERCR18xLAorCQkibXNnaW5fc2V0X3dpZGU6IFdpZGUgKCVpIGJpdCkgbmVnb3RpYXRlZCA8JTAyaT5cbiIsCisJCSg4IDw8IHNyYi0+bXNnaW5fYnVmWzNdKSwgZGNiLT50YXJnZXRfaWQpOworCXJlcHJvZ3JhbV9yZWdzKGFjYiwgZGNiKTsKKwlpZiAoKGRjYi0+c3luY19tb2RlICYgU1lOQ19ORUdPX0VOQUJMRSkKKwkgICAgJiYgIShkY2ItPnN5bmNfbW9kZSAmIFNZTkNfTkVHT19ET05FKSkgeworCQlidWlsZF9zZHRyKGFjYiwgZGNiLCBzcmIpOworCQlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3NldF93aWRlOiBBbHNvIHRyeSBTRFRSLlxuIik7CisJfQorfQorCisKKy8qCisgKiBleHRlbmRlZCBtZXNzYWdlIGNvZGVzOgorICoKKyAqCWNvZGUJZGVzY3JpcHRpb24KKyAqCisgKgkwMmgJUmVzZXJ2ZWQKKyAqCTAwaAlNT0RJRlkgREFUQSAgUE9JTlRFUgorICoJMDFoCVNZTkNIUk9OT1VTIERBVEEgVFJBTlNGRVIgUkVRVUVTVAorICoJMDNoCVdJREUgREFUQSBUUkFOU0ZFUiBSRVFVRVNUCisgKiAgIDA0aCAtIDdGaAlSZXNlcnZlZAorICogICA4MGggLSBGRmgJVmVuZG9yIHNwZWNpZmljCisgKi8KK3N0YXRpYyB2b2lkIG1zZ2luX3BoYXNlMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBhY2ItPmFjdGl2ZV9kY2I7CisJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3BoYXNlMDogKHBpZCMlbGkpXG4iLCBzcmItPmNtZC0+cGlkKTsKKworCXNyYi0+bXNnaW5fYnVmW2FjYi0+bXNnX2xlbisrXSA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0ZJRk8pOworCWlmIChtc2dpbl9jb21wbGV0ZWQoc3JiLT5tc2dpbl9idWYsIGFjYi0+bXNnX2xlbikpIHsKKwkJLyogTm93IGV2YWwgdGhlIG1zZyAqLworCQlzd2l0Y2ggKHNyYi0+bXNnaW5fYnVmWzBdKSB7CisJCWNhc2UgRElTQ09OTkVDVDoKKwkJCXNyYi0+c3RhdGUgPSBTUkJfRElTQ09OTkVDVDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lNUExFX1FVRVVFX1RBRzoKKwkJY2FzZSBIRUFEX09GX1FVRVVFX1RBRzoKKwkJY2FzZSBPUkRFUkVEX1FVRVVFX1RBRzoKKwkJCXNyYiA9CisJCQkgICAgbXNnaW5fcXRhZyhhY2IsIGRjYiwKKwkJCQkJICAgICAgc3JiLT5tc2dpbl9idWZbMV0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwKKwkJCQkgICAgICAgRE9fQ0xSQVROIHwgRE9fREFUQUxBVENIKTsKKwkJCS8qIEEgc3luYyBuZWdvIG1lc3NhZ2Ugd2FzIHJlamVjdGVkICEgKi8KKwkJCWlmIChzcmItPnN0YXRlICYgU1JCX0RPX1NZTkNfTkVHTykgeworCQkJCW1zZ2luX3NldF9hc3luYyhhY2IsIHNyYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBBIHdpZGUgbmVnbyBtZXNzYWdlIHdhcyByZWplY3RlZCAhICovCisJCQlpZiAoc3JiLT5zdGF0ZSAmIFNSQl9ET19XSURFX05FR08pIHsKKwkJCQltc2dpbl9zZXRfbm93aWRlKGFjYiwgc3JiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVuYWJsZV9tc2dvdXRfYWJvcnQoYWNiLCBzcmIpOworCQkJLypzcmItPnN0YXRlIHw9IFNSQl9BQk9SVF9TRU5UICovCisJCQlicmVhazsKKworCQljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCQkvKiBTRFRSICovCisJCQlpZiAoc3JiLT5tc2dpbl9idWZbMV0gPT0gMworCQkJICAgICYmIHNyYi0+bXNnaW5fYnVmWzJdID09IEVYVEVOREVEX1NEVFIpIHsKKwkJCQltc2dpbl9zZXRfc3luYyhhY2IsIHNyYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBXRFRSICovCisJCQlpZiAoc3JiLT5tc2dpbl9idWZbMV0gPT0gMgorCQkJICAgICYmIHNyYi0+bXNnaW5fYnVmWzJdID09IEVYVEVOREVEX1dEVFIKKwkJCSAgICAmJiBzcmItPm1zZ2luX2J1ZlszXSA8PSAyKSB7IC8qIHNhbml0eSBjaGVjayAuLi4gKi8KKwkJCQltc2dpbl9zZXRfd2lkZShhY2IsIHNyYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltc2dpbl9yZWplY3QoYWNiLCBzcmIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNU0dfSUdOT1JFV0lERToKKwkJCS8qIERpc2NhcmQgIHdpZGUgcmVzaWR1YWwgKi8KKwkJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9waGFzZTA6IElnbm9yZSBXaWRlIFJlc2lkdWFsIVxuIik7CisJCQlicmVhazsKKworCQljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJCQkvKiBub3RoaW5nIGhhcyB0byBiZSBkb25lICovCisJCQlicmVhazsKKworCQljYXNlIFNBVkVfUE9JTlRFUlM6CisJCQkvKgorCQkJICogU0FWRSBQT0lOVEVSIG1heSBiZSBpZ25vcmVkIGFzIHdlIGhhdmUgdGhlIHN0cnVjdAorCQkJICogU2NzaVJlcUJsayogYXNzb2NpYXRlZCB3aXRoIHRoZSBzY3NpIGNvbW1hbmQuCisJCQkgKi8KKwkJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9waGFzZTA6IChwaWQjJWxpKSAiCisJCQkJIlNBVkUgUE9JTlRFUiByZW09JWkgSWdub3JlXG4iLAorCQkJCXNyYi0+Y21kLT5waWQsIHNyYi0+dG90YWxfeGZlcl9sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkJZHByaW50a2RiZyhEQkdfMCwgIm1zZ2luX3BoYXNlMDogUkVTVE9SRSBQT0lOVEVSLiBJZ25vcmVcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQk9SVDoKKwkJCWRwcmludGtkYmcoREJHXzAsICJtc2dpbl9waGFzZTA6IChwaWQjJWxpKSAiCisJCQkJIjwlMDJpLSVpPiBBQk9SVCBtc2dcbiIsCisJCQkJc3JiLT5jbWQtPnBpZCwgZGNiLT50YXJnZXRfaWQsCisJCQkJZGNiLT50YXJnZXRfbHVuKTsKKwkJCWRjYi0+ZmxhZyB8PSBBQk9SVF9ERVZfOworCQkJZW5hYmxlX21zZ291dF9hYm9ydChhY2IsIHNyYik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogcmVqZWN0IHVua25vd24gbWVzc2FnZXMgKi8KKwkJCWlmIChzcmItPm1zZ2luX2J1ZlswXSAmIElERU5USUZZX0JBU0UpIHsKKwkJCQlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcGhhc2UwOiBJZGVudGlmeSBtc2dcbiIpOworCQkJCXNyYi0+bXNnX2NvdW50ID0gMTsKKwkJCQlzcmItPm1zZ291dF9idWZbMF0gPSBkY2ItPmlkZW50aWZ5X21zZzsKKwkJCQlEQzM5NXhfRU5BQkxFX01TR09VVDsKKwkJCQlzcmItPnN0YXRlIHw9IFNSQl9NU0dPVVQ7CisJCQkJLypicmVhazsgKi8KKwkJCX0KKwkJCW1zZ2luX3JlamVjdChhY2IsIHNyYik7CisJCX0KKworCQkvKiBDbGVhciBjb3VudGVyIGFuZCBNc2dJbiBzdGF0ZSAqLworCQlzcmItPnN0YXRlICY9IH5TUkJfTVNHSU47CisJCWFjYi0+bXNnX2xlbiA9IDA7CisJfQorCSpwc2NzaV9zdGF0dXMgPSBQSF9CVVNfRlJFRTsKKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IC4uLiB5b3Uga25vdyEgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09NTUFORCwgU0NNRF9NU0dBQ0NFUFQpOworfQorCisKK3N0YXRpYyB2b2lkIG1zZ2luX3BoYXNlMShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKKwlkcHJpbnRrZGJnKERCR18wLCAibXNnaW5fcGhhc2UxOiAocGlkIyVsaSlcbiIsIHNyYi0+Y21kLT5waWQpOworCWNsZWFyX2ZpZm8oYWNiLCAibXNnaW5fcGhhc2UxIik7CisJREMzOTV4X3dyaXRlMzIoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSLCAxKTsKKwlpZiAoIShzcmItPnN0YXRlICYgU1JCX01TR0lOKSkgeworCQlzcmItPnN0YXRlICY9IH5TUkJfRElTQ09OTkVDVDsKKwkJc3JiLT5zdGF0ZSB8PSBTUkJfTVNHSU47CisJfQorCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fREFUQUxBVENIKTsJLyogaXQncyBpbXBvcnRhbnQgZm9yIGF0biBzdG9wICovCisJLyogU0NTSSBjb21tYW5kICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfRklGT19JTik7Cit9CisKKworc3RhdGljIHZvaWQgbm9wMChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiLAorCQl1MTYgKnBzY3NpX3N0YXR1cykKK3sKK30KKworCitzdGF0aWMgdm9pZCBub3AxKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIsCisJCXUxNiAqcHNjc2lfc3RhdHVzKQoreworfQorCisKK3N0YXRpYyB2b2lkIHNldF94ZmVyX3JhdGUoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IERldmljZUN0bEJsayAqZGNiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmk7CisKKwkvKiBzZXQgYWxsIGx1biBkZXZpY2UncyAgcGVyaW9kLCBvZmZzZXQgKi8KKwlpZiAoZGNiLT5pZGVudGlmeV9tc2cgJiAweDA3KQorCQlyZXR1cm47CisKKwlpZiAoYWNiLT5zY2FuX2RldmljZXMpIHsKKwkJY3VycmVudF9zeW5jX29mZnNldCA9IGRjYi0+c3luY19vZmZzZXQ7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZhY2ItPmRjYl9saXN0LCBsaXN0KQorCQlpZiAoaS0+dGFyZ2V0X2lkID09IGRjYi0+dGFyZ2V0X2lkKSB7CisJCQlpLT5zeW5jX3BlcmlvZCA9IGRjYi0+c3luY19wZXJpb2Q7CisJCQlpLT5zeW5jX29mZnNldCA9IGRjYi0+c3luY19vZmZzZXQ7CisJCQlpLT5zeW5jX21vZGUgPSBkY2ItPnN5bmNfbW9kZTsKKwkJCWktPm1pbl9uZWdvX3BlcmlvZCA9IGRjYi0+bWluX25lZ29fcGVyaW9kOworCQl9Cit9CisKKworc3RhdGljIHZvaWQgZGlzY29ubmVjdChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiA9IGFjYi0+YWN0aXZlX2RjYjsKKwlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiOworCisJaWYgKCFkY2IpIHsKKwkJZHByaW50a2woS0VSTl9FUlIsICJkaXNjb25uZWN0OiBObyBzdWNoIGRldmljZVxuIik7CisJCXVkZWxheSg1MDApOworCQkvKiBTdXNwZW5kIHF1ZXVlIGZvciBhIHdoaWxlICovCisJCWFjYi0+c2NzaV9ob3N0LT5sYXN0X3Jlc2V0ID0KKwkJICAgIGppZmZpZXMgKyBIWiAvIDIgKworCQkgICAgSFogKiBhY2ItPmVlcHJvbS5kZWxheV90aW1lOworCQljbGVhcl9maWZvKGFjYiwgImRpc2Nvbm5lY3RFeCIpOworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0hXUkVTRUxFQ1QpOworCQlyZXR1cm47CisJfQorCXNyYiA9IGRjYi0+YWN0aXZlX3NyYjsKKwlhY2ItPmFjdGl2ZV9kY2IgPSBOVUxMOworCWRwcmludGtkYmcoREJHXzAsICJkaXNjb25uZWN0OiAocGlkIyVsaSlcbiIsIHNyYi0+Y21kLT5waWQpOworCisJc3JiLT5zY3NpX3BoYXNlID0gUEhfQlVTX0ZSRUU7CS8qIGluaXRpYWwgcGhhc2UgKi8KKwljbGVhcl9maWZvKGFjYiwgImRpc2Nvbm5lY3QiKTsKKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0hXUkVTRUxFQ1QpOworCWlmIChzcmItPnN0YXRlICYgU1JCX1VORVhQRUNUX1JFU0VMKSB7CisJCWRwcmludGtsKEtFUk5fRVJSLAorCQkJImRpc2Nvbm5lY3Q6IFVuZXhwZWN0ZWQgcmVzZWxlY3Rpb24gPCUwMmktJWk+XG4iLAorCQkJZGNiLT50YXJnZXRfaWQsIGRjYi0+dGFyZ2V0X2x1bik7CisJCXNyYi0+c3RhdGUgPSAwOworCQl3YWl0aW5nX3Byb2Nlc3NfbmV4dChhY2IpOworCX0gZWxzZSBpZiAoc3JiLT5zdGF0ZSAmIFNSQl9BQk9SVF9TRU5UKSB7CisJCWRjYi0+ZmxhZyAmPSB+QUJPUlRfREVWXzsKKwkJYWNiLT5zY3NpX2hvc3QtPmxhc3RfcmVzZXQgPSBqaWZmaWVzICsgSFogLyAyICsgMTsKKwkJZHByaW50a2woS0VSTl9FUlIsICJkaXNjb25uZWN0OiBTUkJfQUJPUlRfU0VOVFxuIik7CisJCWRvaW5nX3NyYl9kb25lKGFjYiwgRElEX0FCT1JULCBzcmItPmNtZCwgMSk7CisJCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7CisJfSBlbHNlIHsKKwkJaWYgKChzcmItPnN0YXRlICYgKFNSQl9TVEFSVF8gKyBTUkJfTVNHT1VUKSkKKwkJICAgIHx8ICEoc3JiLT4KKwkJCSBzdGF0ZSAmIChTUkJfRElTQ09OTkVDVCArIFNSQl9DT01QTEVURUQpKSkgeworCQkJLyoKKwkJCSAqIFNlbGVjdGlvbiB0aW1lIG91dCAKKwkJCSAqIFNSQl9TVEFSVF8gfHwgU1JCX01TR09VVCB8fCAoIVNSQl9ESVNDT05ORUNUICYmICFTUkJfQ09NUExFVEVEKQorCQkJICovCisJCQkvKiBVbmV4cC4gRGlzYyAvIFNlbCBUaW1lb3V0ICovCisJCQlpZiAoc3JiLT5zdGF0ZSAhPSBTUkJfU1RBUlRfCisJCQkgICAgJiYgc3JiLT5zdGF0ZSAhPSBTUkJfTVNHT1VUKSB7CisJCQkJc3JiLT5zdGF0ZSA9IFNSQl9SRUFEWTsKKwkJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCQkiZGlzY29ubmVjdDogKHBpZCMlbGkpIFVuZXhwZWN0ZWRcbiIsCisJCQkJCXNyYi0+Y21kLT5waWQpOworCQkJCXNyYi0+dGFyZ2V0X3N0YXR1cyA9IFNDU0lfU1RBVF9TRUxfVElNRU9VVDsKKwkJCQlnb3RvIGRpc2MxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOb3JtYWwgc2VsZWN0aW9uIHRpbWVvdXQgKi8KKwkJCQlkcHJpbnRrZGJnKERCR19LRywgImRpc2Nvbm5lY3Q6IChwaWQjJWxpKSAiCisJCQkJCSI8JTAyaS0laT4gU2VsVE9cbiIsIHNyYi0+Y21kLT5waWQsCisJCQkJCWRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4pOworCQkJCWlmIChzcmItPnJldHJ5X2NvdW50KysgPiBEQzM5NXhfTUFYX1JFVFJJRVMKKwkJCQkgICAgfHwgYWNiLT5zY2FuX2RldmljZXMpIHsKKwkJCQkJc3JiLT50YXJnZXRfc3RhdHVzID0KKwkJCQkJICAgIFNDU0lfU1RBVF9TRUxfVElNRU9VVDsKKwkJCQkJZ290byBkaXNjMTsKKwkJCQl9CisJCQkJZnJlZV90YWcoZGNiLCBzcmIpOworCQkJCXNyYl9nb2luZ190b193YWl0aW5nX21vdmUoZGNiLCBzcmIpOworCQkJCWRwcmludGtkYmcoREJHX0tHLAorCQkJCQkiZGlzY29ubmVjdDogKHBpZCMlbGkpIFJldHJ5XG4iLAorCQkJCQlzcmItPmNtZC0+cGlkKTsKKwkJCQl3YWl0aW5nX3NldF90aW1lcihhY2IsIEhaIC8gMjApOworCQkJfQorCQl9IGVsc2UgaWYgKHNyYi0+c3RhdGUgJiBTUkJfRElTQ09OTkVDVCkgeworCQkJdTggYnZhbCA9IERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1NJR05BTCk7CisJCQkvKgorCQkJICogU1JCX0RJU0NPTk5FQ1QgKFRoaXMgaXMgd2hhdCB3ZSBleHBlY3QhKQorCQkJICovCisJCQlpZiAoYnZhbCAmIDB4NDApIHsKKwkJCQlkcHJpbnRrZGJnKERCR18wLCAiZGlzY29ubmVjdDogU0NTSSBidXMgc3RhdCAiCisJCQkJCSIgMHglMDJ4OiBBQ0sgc2V0ISBPdGhlciBjb250cm9sbGVycz9cbiIsCisJCQkJCWJ2YWwpOworCQkJCS8qIEl0IGNvdWxkIGNvbWUgZnJvbSBhbm90aGVyIGluaXRpYXRvciwgdGhlcmVmb3JlIGRvbid0IGRvIG11Y2ggISAqLworCQkJfSBlbHNlCisJCQkJd2FpdGluZ19wcm9jZXNzX25leHQoYWNiKTsKKwkJfSBlbHNlIGlmIChzcmItPnN0YXRlICYgU1JCX0NPTVBMRVRFRCkgeworCQkgICAgICBkaXNjMToKKwkJCS8qCisJCQkgKiogU1JCX0NPTVBMRVRFRAorCQkJICovCisJCQlmcmVlX3RhZyhkY2IsIHNyYik7CisJCQlkY2ItPmFjdGl2ZV9zcmIgPSBOVUxMOworCQkJc3JiLT5zdGF0ZSA9IFNSQl9GUkVFOworCQkJc3JiX2RvbmUoYWNiLCBkY2IsIHNyYik7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgcmVzZWxlY3Qoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IgPSBhY2ItPmFjdGl2ZV9kY2I7CisJc3RydWN0IFNjc2lSZXFCbGsgKnNyYiA9IE5VTEw7CisJdTE2IHJzZWxfdGFyX2x1bl9pZDsKKwl1OCBpZCwgbHVuOworCXU4IGFyYmxvc3RmbGFnID0gMDsKKwlkcHJpbnRrZGJnKERCR18wLCAicmVzZWxlY3Q6IGFjYj0lcFxuIiwgYWNiKTsKKworCWNsZWFyX2ZpZm8oYWNiLCAicmVzZWxlY3QiKTsKKwkvKkRDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fSFdSRVNFTEVDVCB8IERPX0RBVEFMQVRDSCk7ICovCisJLyogUmVhZCBSZXNlbGVjdGVkIFRhcmdldCBJRCBhbmQgTFVOICovCisJcnNlbF90YXJfbHVuX2lkID0gREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX1RBUkdFVElEKTsKKwlpZiAoZGNiKSB7CQkvKiBBcmJpdHJhdGlvbiBsb3N0IGJ1dCBSZXNlbGVjdGlvbiB3aW4gKi8KKwkJc3JiID0gZGNiLT5hY3RpdmVfc3JiOworCQlpZiAoIXNyYikgeworCQkJZHByaW50a2woS0VSTl9ERUJVRywgInJlc2VsZWN0OiBBcmIgbG9zdCBSZXNlbCB3b24sICIKKwkJCQkiYnV0IGFjdGl2ZV9zcmIgPT0gTlVMTFxuIik7CisJCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQkJcmV0dXJuOworCQl9CisJCS8qIFdoeSB0aGUgaWYgPyAqLworCQlpZiAoIWFjYi0+c2Nhbl9kZXZpY2VzKSB7CisJCQlkcHJpbnRrZGJnKERCR19LRywgInJlc2VsZWN0OiAocGlkIyVsaSkgPCUwMmktJWk+ICIKKwkJCQkiQXJiIGxvc3QgYnV0IFJlc2VsIHdpbiByc2VsPSVpIHN0YXQ9MHglMDR4XG4iLAorCQkJCXNyYi0+Y21kLT5waWQsIGRjYi0+dGFyZ2V0X2lkLAorCQkJCWRjYi0+dGFyZ2V0X2x1biwgcnNlbF90YXJfbHVuX2lkLAorCQkJCURDMzk1eF9yZWFkMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9TVEFUVVMpKTsKKwkJCWFyYmxvc3RmbGFnID0gMTsKKwkJCS8qc3JiLT5zdGF0ZSB8PSBTUkJfRElTQ09OTkVDVDsgKi8KKworCQkJc3JiLT5zdGF0ZSA9IFNSQl9SRUFEWTsKKwkJCWZyZWVfdGFnKGRjYiwgc3JiKTsKKwkJCXNyYl9nb2luZ190b193YWl0aW5nX21vdmUoZGNiLCBzcmIpOworCQkJd2FpdGluZ19zZXRfdGltZXIoYWNiLCBIWiAvIDIwKTsKKworCQkJLyogcmV0dXJuOyAqLworCQl9CisJfQorCS8qIFJlYWQgUmVzZWxlY3RlZCBUYXJnZXQgSWQgYW5kIExVTiAqLworCWlmICghKHJzZWxfdGFyX2x1bl9pZCAmIChJREVOVElGWV9CQVNFIDw8IDgpKSkKKwkJZHByaW50a2woS0VSTl9ERUJVRywgInJlc2VsZWN0OiBFeHBlY3RzIGlkZW50aWZ5IG1zZy4gIgorCQkJIkdvdCAlaSFcbiIsIHJzZWxfdGFyX2x1bl9pZCk7CisJaWQgPSByc2VsX3Rhcl9sdW5faWQgJiAweGZmOworCWx1biA9IChyc2VsX3Rhcl9sdW5faWQgPj4gOCkgJiA3OworCWRjYiA9IGZpbmRfZGNiKGFjYiwgaWQsIGx1bik7CisJaWYgKCFkY2IpIHsKKwkJZHByaW50a2woS0VSTl9FUlIsICJyZXNlbGVjdDogRnJvbSBub24gZXhpc3RlbnQgZGV2aWNlICIKKwkJCSI8JTAyaS0laT5cbiIsIGlkLCBsdW4pOworCQlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0RBVEFMQVRDSCk7CS8qIGl0J3MgaW1wb3J0YW50IGZvciBhdG4gc3RvcCAqLworCQlyZXR1cm47CisJfQorCWFjYi0+YWN0aXZlX2RjYiA9IGRjYjsKKworCWlmICghKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fRElTQ09OTkVDVCkpCisJCWRwcmludGtsKEtFUk5fREVCVUcsICJyZXNlbGVjdDogaW4gc3BpdGUgb2YgZm9yYmlkZGVuICIKKwkJCSJkaXNjb25uZWN0aW9uPyA8JTAyaS0laT5cbiIsCisJCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKworCWlmIChkY2ItPnN5bmNfbW9kZSAmIEVOX1RBR19RVUVVRUlORyAvKiYmICFhcmJsb3N0ZmxhZyAqLykgeworCQlzcmIgPSBhY2ItPnRtcF9zcmI7CisJCWRjYi0+YWN0aXZlX3NyYiA9IHNyYjsKKwl9IGVsc2UgeworCQkvKiBUaGVyZSBjYW4gYmUgb25seSBvbmUhICovCisJCXNyYiA9IGRjYi0+YWN0aXZlX3NyYjsKKwkJaWYgKCFzcmIgfHwgIShzcmItPnN0YXRlICYgU1JCX0RJU0NPTk5FQ1QpKSB7CisJCQkvKgorCQkJICogYWJvcnQgY29tbWFuZAorCQkJICovCisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCSJyZXNlbGVjdDogdy9vIGRpc2Nvbm5lY3RlZCBjbWRzIDwlMDJpLSVpPlxuIiwKKwkJCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKwkJCXNyYiA9IGFjYi0+dG1wX3NyYjsKKwkJCXNyYi0+c3RhdGUgPSBTUkJfVU5FWFBFQ1RfUkVTRUw7CisJCQlkY2ItPmFjdGl2ZV9zcmIgPSBzcmI7CisJCQllbmFibGVfbXNnb3V0X2Fib3J0KGFjYiwgc3JiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkY2ItPmZsYWcgJiBBQk9SVF9ERVZfKSB7CisJCQkJLypzcmItPnN0YXRlID0gU1JCX0FCT1JUX1NFTlQ7ICovCisJCQkJZW5hYmxlX21zZ291dF9hYm9ydChhY2IsIHNyYik7CisJCQl9IGVsc2UKKwkJCQlzcmItPnN0YXRlID0gU1JCX0RBVEFfWEZFUjsKKworCQl9CisJfQorCXNyYi0+c2NzaV9waGFzZSA9IFBIX0JVU19GUkVFOwkvKiBpbml0aWFsIHBoYXNlICovCisKKwkvKiBQcm9ncmFtIEhBIElELCB0YXJnZXQgSUQsIHBlcmlvZCBhbmQgb2Zmc2V0ICovCisJZHByaW50a2RiZyhEQkdfMCwgInJlc2VsZWN0OiBzZWxlY3QgPCVpPlxuIiwgZGNiLT50YXJnZXRfaWQpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9IT1NUSUQsIGFjYi0+c2NzaV9ob3N0LT50aGlzX2lkKTsJLyogaG9zdCAgIElEICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1RBUkdFVElELCBkY2ItPnRhcmdldF9pZCk7CQkvKiB0YXJnZXQgSUQgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfT0ZGU0VULCBkY2ItPnN5bmNfb2Zmc2V0KTsJCS8qIG9mZnNldCAgICAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9TWU5DLCBkY2ItPnN5bmNfcGVyaW9kKTsJCS8qIHN5bmMgcGVyaW9kLCB3aWRlICovCisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19EQVRBTEFUQ0gpOwkJLyogaXQncyBpbXBvcnRhbnQgZm9yIGF0biBzdG9wICovCisJLyogU0NTSSBjb21tYW5kICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTU1BTkQsIFNDTURfTVNHQUNDRVBUKTsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IHRhZ3FfYmxhY2tsaXN0KGNoYXIgKm5hbWUpCit7CisjaWZuZGVmIERDMzk1eF9OT19UQUdRCisjaWYgMAorCXU4IGk7CisJZm9yIChpID0gMDsgaSA8IEJBRERFVkNOVDsgaSsrKQorCQlpZiAobWVtY21wKG5hbWUsIERDMzk1eF9iYWRkZXZuYW1lMVtpXSwgMjgpID09IDApCisJCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gMTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGRpc2NfdGFncV9zZXQoc3RydWN0IERldmljZUN0bEJsayAqZGNiLCBzdHJ1Y3QgU2NzaUlucURhdGEgKnB0cikKK3sKKwkvKiBDaGVjayBmb3IgU0NTSSBmb3JtYXQgKEFOU0kgYW5kIFJlc3BvbnNlIGRhdGEgZm9ybWF0KSAqLworCWlmICgocHRyLT5WZXJzICYgMHgwNykgPj0gMiB8fCAocHRyLT5SREYgJiAweDBGKSA9PSAyKSB7CisJCWlmICgocHRyLT5GbGFncyAmIFNDU0lfSU5RX0NNRFFVRVVFKQorCQkgICAgJiYgKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fVEFHX1FVRVVFSU5HKSAmJgorCQkgICAgLyooZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19ESVNDT05ORUNUKSAqLworCQkgICAgLyogKChkY2ItPmRldl90eXBlID09IFRZUEVfRElTSykgCisJCSAgICAgICB8fCAoZGNiLT5kZXZfdHlwZSA9PSBUWVBFX01PRCkpICYmICovCisJCSAgICAhdGFncV9ibGFja2xpc3QoKChjaGFyICopcHRyKSArIDgpKSB7CisJCQlpZiAoZGNiLT5tYXhfY29tbWFuZCA9PSAxKQorCQkJCWRjYi0+bWF4X2NvbW1hbmQgPQorCQkJCSAgICBkY2ItPmFjYi0+dGFnX21heF9udW07CisJCQlkY2ItPnN5bmNfbW9kZSB8PSBFTl9UQUdfUVVFVUVJTkc7CisJCQkvKmRjYi0+dGFnX21hc2sgPSAwOyAqLworCQl9IGVsc2UKKwkJCWRjYi0+bWF4X2NvbW1hbmQgPSAxOworCX0KK30KKworCitzdGF0aWMgdm9pZCBhZGRfZGV2KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYiwKKwkJc3RydWN0IFNjc2lJbnFEYXRhICpwdHIpCit7CisJdTggYnZhbDEgPSBwdHItPkRldlR5cGUgJiBTQ1NJX0RFVlRZUEU7CisJZGNiLT5kZXZfdHlwZSA9IGJ2YWwxOworCS8qIGlmIChidmFsMSA9PSBUWVBFX0RJU0sgfHwgYnZhbDEgPT0gVFlQRV9NT0QpICovCisJZGlzY190YWdxX3NldChkY2IsIHB0cik7Cit9CisKKworLyogdW5tYXAgbWFwcGVkIHBjaSByZWdpb25zIGZyb20gU1JCICovCitzdGF0aWMgdm9pZCBwY2lfdW5tYXBfc3JiKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsIHN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3JiLT5jbWQ7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwlpZiAoY21kLT51c2Vfc2cgJiYgZGlyICE9IFBDSV9ETUFfTk9ORSkgeworCQlpbnQgaTsKKwkJLyogdW5tYXAgREMzOTV4IFNHIGxpc3QgKi8KKwkJZHByaW50a2RiZyhEQkdfU0csICJwY2lfdW5tYXBfc3JiOiBsaXN0PSUwOHgoJTA1eClcbiIsCisJCQlzcmItPnNnX2J1c19hZGRyLCBTRUdNRU5UWF9MRU4pOworCQlwY2lfdW5tYXBfc2luZ2xlKGFjYi0+ZGV2LCBzcmItPnNnX2J1c19hZGRyLAorCQkJCSBTRUdNRU5UWF9MRU4sCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkcHJpbnRrZGJnKERCR19TRywgInBjaV91bm1hcF9zcmI6IHNlZ3M9JWkgYnVmZmVyPSVwXG4iLAorCQkJY21kLT51c2Vfc2csIGNtZC0+cmVxdWVzdF9idWZmZXIpOworCQkvKiB1bm1hcCB0aGUgc2cgc2VnbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNyYi0+c2dfY291bnQ7IGkrKykKKwkJCWt1bm1hcCh2aXJ0X3RvX3BhZ2Uoc3JiLT52aXJ0X21hcFtpXSkpOworCQlwY2lfdW5tYXBfc2coYWNiLT5kZXYsCisJCQkgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJICAgICBjbWQtPnVzZV9zZywgZGlyKTsKKwl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmZXIgJiYgZGlyICE9IFBDSV9ETUFfTk9ORSkgeworCQlkcHJpbnRrZGJnKERCR19TRywgInBjaV91bm1hcF9zcmI6IGJ1ZmZlcj0lMDh4KCUwNXgpXG4iLAorCQkJc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcywgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQlwY2lfdW5tYXBfc2luZ2xlKGFjYi0+ZGV2LCBzcmItPnNlZ21lbnRfeFswXS5hZGRyZXNzLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgZGlyKTsKKwl9Cit9CisKKworLyogdW5tYXAgbWFwcGVkIHBjaSBzZW5zZSBidWZmZXIgZnJvbSBTUkIgKi8KK3N0YXRpYyB2b2lkIHBjaV91bm1hcF9zcmJfc2Vuc2Uoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYikKK3sKKwlpZiAoIShzcmItPmZsYWcgJiBBVVRPX1JFUVNFTlNFKSkKKwkJcmV0dXJuOworCS8qIFVubWFwIHNlbnNlIGJ1ZmZlciAqLworCWRwcmludGtkYmcoREJHX1NHLCAicGNpX3VubWFwX3NyYl9zZW5zZTogYnVmZmVyPSUwOHhcbiIsCisJICAgICAgIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MpOworCXBjaV91bm1hcF9zaW5nbGUoYWNiLT5kZXYsIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MsCisJCQkgc3JiLT5zZWdtZW50X3hbMF0ubGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCS8qIFJlc3RvcmUgU0cgc3R1ZmYgKi8KKwlzcmItPnRvdGFsX3hmZXJfbGVuZ3RoID0gc3JiLT54ZmVycmVkOworCXNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3MgPQorCSAgICBzcmItPnNlZ21lbnRfeFtEQzM5NXhfTUFYX1NHX0xJU1RFTlRSWSAtIDFdLmFkZHJlc3M7CisJc3JiLT5zZWdtZW50X3hbMF0ubGVuZ3RoID0KKwkgICAgc3JiLT5zZWdtZW50X3hbREMzOTV4X01BWF9TR19MSVNURU5UUlkgLSAxXS5sZW5ndGg7Cit9CisKKworLyoKKyAqIENvbXBsZXRlIGV4ZWN1dGlvbiBvZiBhIFNDU0kgY29tbWFuZAorICogU2lnbmFsIGNvbXBsZXRpb24gdG8gdGhlIGdlbmVyaWMgU0NTSSBkcml2ZXIgIAorICovCitzdGF0aWMgdm9pZCBzcmJfZG9uZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCBzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IsCisJCXN0cnVjdCBTY3NpUmVxQmxrICpzcmIpCit7CisJdTggdGVtcGNudCwgc3RhdHVzOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNyYi0+Y21kOworCXN0cnVjdCBTY3NpSW5xRGF0YSAqcHRyOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0KiBzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQlwdHIgPSAoc3RydWN0IFNjc2lJbnFEYXRhICopKHNyYi0+dmlydF9tYXBbMF0gKyBzZy0+b2Zmc2V0KTsKKwl9IGVsc2UgeworCQlwdHIgPSAoc3RydWN0IFNjc2lJbnFEYXRhICopKGNtZC0+cmVxdWVzdF9idWZmZXIpOworCX0KKworCWRwcmludGtkYmcoREJHXzEsICJzcmJfZG9uZTogKHBpZCMlbGkpIDwlMDJpLSVpPlxuIiwgc3JiLT5jbWQtPnBpZCwKKwkJc3JiLT5jbWQtPmRldmljZS0+aWQsIHNyYi0+Y21kLT5kZXZpY2UtPmx1bik7CisJZHByaW50a2RiZyhEQkdfU0csICJzcmJfZG9uZTogc3JiPSVwIHNnPSVpKCVpLyVpKSBidWY9JXAgYWRkcj0lcFxuIiwKKwkJc3JiLCBjbWQtPnVzZV9zZywgc3JiLT5zZ19pbmRleCwgc3JiLT5zZ19jb3VudCwKKwkJY21kLT5yZXF1ZXN0X2J1ZmZlciwgcHRyKTsKKwlzdGF0dXMgPSBzcmItPnRhcmdldF9zdGF0dXM7CisJaWYgKHNyYi0+ZmxhZyAmIEFVVE9fUkVRU0VOU0UpIHsKKwkJZHByaW50a2RiZyhEQkdfMCwgInNyYl9kb25lOiBBVVRPX1JFUVNFTlNFMVxuIik7CisJCXBjaV91bm1hcF9zcmJfc2Vuc2UoYWNiLCBzcmIpOworCQkvKgorCQkgKiogdGFyZ2V0IHN0YXR1cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJCSAqLworCQlzcmItPmZsYWcgJj0gfkFVVE9fUkVRU0VOU0U7CisJCXNyYi0+YWRhcHRlcl9zdGF0dXMgPSAwOworCQlzcmItPnRhcmdldF9zdGF0dXMgPSBDSEVDS19DT05ESVRJT04gPDwgMTsKKwkJaWYgKGRlYnVnX2VuYWJsZWQoREJHXzEpKSB7CisJCQlzd2l0Y2ggKGNtZC0+c2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgeworCQkJY2FzZSBOT1RfUkVBRFk6CisJCQkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCQkgICAgICJSZXFTZW5zZTogTk9UX1JFQURZIGNtbmQ9MHglMDJ4IDwlMDJpLSVpPiBzdGF0PSVpIHNjYW49JWkgIiwKKwkJCQkgICAgIGNtZC0+Y21uZFswXSwgZGNiLT50YXJnZXRfaWQsCisJCQkJICAgICBkY2ItPnRhcmdldF9sdW4sIHN0YXR1cywgYWNiLT5zY2FuX2RldmljZXMpOworCQkJCWJyZWFrOworCQkJY2FzZSBVTklUX0FUVEVOVElPTjoKKwkJCQlkcHJpbnRrbChLRVJOX0RFQlVHLAorCQkJCSAgICAgIlJlcVNlbnNlOiBVTklUX0FUVEVOVElPTiBjbW5kPTB4JTAyeCA8JTAyaS0laT4gc3RhdD0laSBzY2FuPSVpICIsCisJCQkJICAgICBjbWQtPmNtbmRbMF0sIGRjYi0+dGFyZ2V0X2lkLAorCQkJCSAgICAgZGNiLT50YXJnZXRfbHVuLCBzdGF0dXMsIGFjYi0+c2Nhbl9kZXZpY2VzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgorCQkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkJICAgICAiUmVxU2Vuc2U6IElMTEVHQUxfUkVRVUVTVCBjbW5kPTB4JTAyeCA8JTAyaS0laT4gc3RhdD0laSBzY2FuPSVpICIsCisJCQkJICAgICBjbWQtPmNtbmRbMF0sIGRjYi0+dGFyZ2V0X2lkLAorCQkJCSAgICAgZGNiLT50YXJnZXRfbHVuLCBzdGF0dXMsIGFjYi0+c2Nhbl9kZXZpY2VzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUVESVVNX0VSUk9SOgorCQkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkJICAgICAiUmVxU2Vuc2U6IE1FRElVTV9FUlJPUiBjbW5kPTB4JTAyeCA8JTAyaS0laT4gc3RhdD0laSBzY2FuPSVpICIsCisJCQkJICAgICBjbWQtPmNtbmRbMF0sIGRjYi0+dGFyZ2V0X2lkLAorCQkJCSAgICAgZGNiLT50YXJnZXRfbHVuLCBzdGF0dXMsIGFjYi0+c2Nhbl9kZXZpY2VzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSEFSRFdBUkVfRVJST1I6CisJCQkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCQkgICAgICJSZXFTZW5zZTogSEFSRFdBUkVfRVJST1IgY21uZD0weCUwMnggPCUwMmktJWk+IHN0YXQ9JWkgc2Nhbj0laSAiLAorCQkJCSAgICAgY21kLT5jbW5kWzBdLCBkY2ItPnRhcmdldF9pZCwKKwkJCQkgICAgIGRjYi0+dGFyZ2V0X2x1biwgc3RhdHVzLCBhY2ItPnNjYW5fZGV2aWNlcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY21kLT5zZW5zZV9idWZmZXJbN10gPj0gNikKKwkJCQlwcmludGsoInNlbnNlPTB4JTAyeCBBU0M9MHglMDJ4IEFTQ1E9MHglMDJ4ICIKKwkJCQkJIigweCUwOHggMHglMDh4KVxuIiwKKwkJCQkJY21kLT5zZW5zZV9idWZmZXJbMl0sIGNtZC0+c2Vuc2VfYnVmZmVyWzEyXSwKKwkJCQkJY21kLT5zZW5zZV9idWZmZXJbMTNdLAorCQkJCQkqKCh1bnNpZ25lZCBpbnQgKikoY21kLT5zZW5zZV9idWZmZXIgKyAzKSksCisJCQkJCSooKHVuc2lnbmVkIGludCAqKShjbWQtPnNlbnNlX2J1ZmZlciArIDgpKSk7CisJCQllbHNlCisJCQkJcHJpbnRrKCJzZW5zZT0weCUwMnggTm8gQVNDL0FTQ1EgKDB4JTA4eClcbiIsCisJCQkJCWNtZC0+c2Vuc2VfYnVmZmVyWzJdLAorCQkJCQkqKCh1bnNpZ25lZCBpbnQgKikoY21kLT5zZW5zZV9idWZmZXIgKyAzKSkpOworCQl9CisKKwkJaWYgKHN0YXR1cyA9PSAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpKSB7CisJCQljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQkJZ290byBja2NfZTsKKwkJfQorCQlkcHJpbnRrZGJnKERCR18wLCAic3JiX2RvbmU6IEFVVE9fUkVRU0VOU0UyXG4iKTsKKworCQlpZiAoc3JiLT50b3RhbF94ZmVyX2xlbmd0aAorCQkgICAgJiYgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA+PSBjbWQtPnVuZGVyZmxvdykKKwkJCWNtZC0+cmVzdWx0ID0KKwkJCSAgICBNS19SRVNfTE5YKERSSVZFUl9TRU5TRSwgRElEX09LLAorCQkJCSAgICAgICBzcmItPmVuZF9tZXNzYWdlLCBDSEVDS19DT05ESVRJT04pOworCQkvKlNFVF9SRVNfRElEKGNtZC0+cmVzdWx0LERJRF9PSykgKi8KKwkJZWxzZQorCQkJY21kLT5yZXN1bHQgPQorCQkJICAgIE1LX1JFU19MTlgoRFJJVkVSX1NFTlNFLCBESURfT0ssCisJCQkJICAgICAgIHNyYi0+ZW5kX21lc3NhZ2UsIENIRUNLX0NPTkRJVElPTik7CisKKwkJZ290byBja2NfZTsKKwl9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChzdGF0dXMpIHsKKwkJLyoKKwkJICogdGFyZ2V0IHN0YXR1cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisJCSAqLworCQlpZiAoc3RhdHVzX2J5dGUoc3RhdHVzKSA9PSBDSEVDS19DT05ESVRJT04pIHsKKwkJCXJlcXVlc3Rfc2Vuc2UoYWNiLCBkY2IsIHNyYik7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoc3RhdHVzX2J5dGUoc3RhdHVzKSA9PSBRVUVVRV9GVUxMKSB7CisJCQl0ZW1wY250ID0gKHU4KWxpc3Rfc2l6ZSgmZGNiLT5zcmJfZ29pbmdfbGlzdCk7CisJCQlkcHJpbnRrbChLRVJOX0lORk8sICJRVUVVRV9GVUxMIGZvciBkZXYgPCUwMmktJWk+IHdpdGggJWkgY21uZHNcbiIsCisJCQkgICAgIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4sIHRlbXBjbnQpOworCQkJaWYgKHRlbXBjbnQgPiAxKQorCQkJCXRlbXBjbnQtLTsKKwkJCWRjYi0+bWF4X2NvbW1hbmQgPSB0ZW1wY250OworCQkJZnJlZV90YWcoZGNiLCBzcmIpOworCQkJc3JiX2dvaW5nX3RvX3dhaXRpbmdfbW92ZShkY2IsIHNyYik7CisJCQl3YWl0aW5nX3NldF90aW1lcihhY2IsIEhaIC8gMjApOworCQkJc3JiLT5hZGFwdGVyX3N0YXR1cyA9IDA7CisJCQlzcmItPnRhcmdldF9zdGF0dXMgPSAwOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBTQ1NJX1NUQVRfU0VMX1RJTUVPVVQpIHsKKwkJCXNyYi0+YWRhcHRlcl9zdGF0dXMgPSBIX1NFTF9USU1FT1VUOworCQkJc3JiLT50YXJnZXRfc3RhdHVzID0gMDsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCX0gZWxzZSB7CisJCQlzcmItPmFkYXB0ZXJfc3RhdHVzID0gMDsKKwkJCVNFVF9SRVNfRElEKGNtZC0+cmVzdWx0LCBESURfRVJST1IpOworCQkJU0VUX1JFU19NU0coY21kLT5yZXN1bHQsIHNyYi0+ZW5kX21lc3NhZ2UpOworCQkJU0VUX1JFU19UQVJHRVQoY21kLT5yZXN1bHQsIHN0YXR1cyk7CisKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqKiBwcm9jZXNzIGluaXRpYXRvciBzdGF0dXMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCQkgKi8KKwkJc3RhdHVzID0gc3JiLT5hZGFwdGVyX3N0YXR1czsKKwkJaWYgKHN0YXR1cyAmIEhfT1ZFUl9VTkRFUl9SVU4pIHsKKwkJCXNyYi0+dGFyZ2V0X3N0YXR1cyA9IDA7CisJCQlTRVRfUkVTX0RJRChjbWQtPnJlc3VsdCwgRElEX09LKTsKKwkJCVNFVF9SRVNfTVNHKGNtZC0+cmVzdWx0LCBzcmItPmVuZF9tZXNzYWdlKTsKKwkJfSBlbHNlIGlmIChzcmItPnN0YXR1cyAmIFBBUklUWV9FUlJPUikgeworCQkJU0VUX1JFU19ESUQoY21kLT5yZXN1bHQsIERJRF9QQVJJVFkpOworCQkJU0VUX1JFU19NU0coY21kLT5yZXN1bHQsIHNyYi0+ZW5kX21lc3NhZ2UpOworCQl9IGVsc2UgewkvKiBObyBlcnJvciAqLworCisJCQlzcmItPmFkYXB0ZXJfc3RhdHVzID0gMDsKKwkJCXNyYi0+dGFyZ2V0X3N0YXR1cyA9IDA7CisJCQlTRVRfUkVTX0RJRChjbWQtPnJlc3VsdCwgRElEX09LKTsKKwkJfQorCX0KKworCWlmIChkaXIgIT0gUENJX0RNQV9OT05FKSB7CisJCWlmIChjbWQtPnVzZV9zZykKKwkJCXBjaV9kbWFfc3luY19zZ19mb3JfY3B1KGFjYi0+ZGV2LAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT4KKwkJCQkJcmVxdWVzdF9idWZmZXIsIGNtZC0+dXNlX3NnLCBkaXIpOworCQllbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmVyKQorCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFjYi0+ZGV2LAorCQkJCQkgICAgc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcywKKwkJCQkJICAgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBkaXIpOworCX0KKworCWlmICgoY21kLT5yZXN1bHQgJiBSRVNfRElEKSA9PSAwICYmIGNtZC0+Y21uZFswXSA9PSBJTlFVSVJZCisJICAgICYmIGNtZC0+Y21uZFsyXSA9PSAwICYmIGNtZC0+cmVxdWVzdF9idWZmbGVuID49IDgKKwkgICAgJiYgZGlyICE9IFBDSV9ETUFfTk9ORSAmJiBwdHIgJiYgKHB0ci0+VmVycyAmIDB4MDcpID49IDIpCisJCWRjYi0+aW5xdWlyeTcgPSBwdHItPkZsYWdzOworLyogQ2hlY2sgRXJyb3IgQ29uZGl0aW9ucyAqLworICAgICAgY2tjX2U6CisKKwkvKmlmKCBzcmItPmNtZC0+Y21uZFswXSA9PSBJTlFVSVJZICYmICovCisJLyogIChob3N0X2J5dGUoY21kLT5yZXN1bHQpID09IERJRF9PSyB8fCBzdGF0dXNfYnl0ZShjbWQtPnJlc3VsdCkgJiBDSEVDS19DT05ESVRJT04pICkgKi8KKwlpZiAoY21kLT5jbW5kWzBdID09IElOUVVJUlkgJiYgKGNtZC0+cmVzdWx0ID09IChESURfT0sgPDwgMTYpCisJCQkJCSB8fCBzdGF0dXNfYnl0ZShjbWQtPgorCQkJCQkJCXJlc3VsdCkgJgorCQkJCQkgQ0hFQ0tfQ09ORElUSU9OKSkgeworCisJCWlmICghZGNiLT5pbml0X3RjcV9mbGFnKSB7CisJCQlhZGRfZGV2KGFjYiwgZGNiLCBwdHIpOworCQkJZGNiLT5pbml0X3RjcV9mbGFnID0gMTsKKwkJfQorCisJfQorCisKKwkvKiBIZXJlIGlzIHRoZSBpbmZvIGZvciBEb3VnIEdpbGJlcnQncyBzZzMgLi4uICovCisJY21kLT5yZXNpZCA9IHNyYi0+dG90YWxfeGZlcl9sZW5ndGg7CisJLyogVGhpcyBtYXkgYmUgaW50ZXJwcmV0ZWQgYnkgc2IuIG9yIG5vdCAuLi4gKi8KKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gc3JiLT50b3RhbF94ZmVyX2xlbmd0aDsKKwljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwlpZiAoZGVidWdfZW5hYmxlZChEQkdfS0cpKSB7CisJCWlmIChzcmItPnRvdGFsX3hmZXJfbGVuZ3RoKQorCQkJZHByaW50a2RiZyhEQkdfS0csICJzcmJfZG9uZTogKHBpZCMlbGkpIDwlMDJpLSVpPiAiCisJCQkJImNtbmQ9MHglMDJ4IE1pc3NlZCAlaSBieXRlc1xuIiwKKwkJCQljbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCQkJCWNtZC0+Y21uZFswXSwgc3JiLT50b3RhbF94ZmVyX2xlbmd0aCk7CisJfQorCisJc3JiX2dvaW5nX3JlbW92ZShkY2IsIHNyYik7CisJLyogQWRkIHRvIGZyZWUgbGlzdCAqLworCWlmIChzcmIgPT0gYWNiLT50bXBfc3JiKQorCQlkcHJpbnRrbChLRVJOX0VSUiwgInNyYl9kb25lOiBFUlJPUiEgQ29tcGxldGVkIGNtZCB3aXRoIHRtcF9zcmJcbiIpOworCWVsc2UgeworCQlkcHJpbnRrZGJnKERCR18wLCAic3JiX2RvbmU6IChwaWQjJWxpKSBkb25lIHJlc3VsdD0weCUwOHhcbiIsCisJCQljbWQtPnBpZCwgY21kLT5yZXN1bHQpOworCQlzcmJfZnJlZV9pbnNlcnQoYWNiLCBzcmIpOworCX0KKwlwY2lfdW5tYXBfc3JiKGFjYiwgc3JiKTsKKworCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJd2FpdGluZ19wcm9jZXNzX25leHQoYWNiKTsKK30KKworCisvKiBhYm9ydCBhbGwgY21kcyBpbiBvdXIgcXVldWVzICovCitzdGF0aWMgdm9pZCBkb2luZ19zcmJfZG9uZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLCB1OCBkaWRfZmxhZywKKwkJc3RydWN0IHNjc2lfY21uZCAqY21kLCB1OCBmb3JjZSkKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisJZHByaW50a2woS0VSTl9JTkZPLCAiZG9pbmdfc3JiX2RvbmU6IHBpZHMgIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRjYiwgJmFjYi0+ZGNiX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnNyYjsKKwkJc3RydWN0IFNjc2lSZXFCbGsgKnRtcDsKKwkJc3RydWN0IHNjc2lfY21uZCAqcDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3JiLCB0bXAsICZkY2ItPnNyYl9nb2luZ19saXN0LCBsaXN0KSB7CisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisJCQlpbnQgcmVzdWx0OworCisJCQlwID0gc3JiLT5jbWQ7CisJCQlkaXIgPSBwLT5zY19kYXRhX2RpcmVjdGlvbjsKKwkJCXJlc3VsdCA9IE1LX1JFUygwLCBkaWRfZmxhZywgMCwgMCk7CisJCQlwcmludGsoIkc6JWxpKCUwMmktJWkpICIsIHAtPnBpZCwKKwkJCSAgICAgICBwLT5kZXZpY2UtPmlkLCBwLT5kZXZpY2UtPmx1bik7CisJCQlzcmJfZ29pbmdfcmVtb3ZlKGRjYiwgc3JiKTsKKwkJCWZyZWVfdGFnKGRjYiwgc3JiKTsKKwkJCXNyYl9mcmVlX2luc2VydChhY2IsIHNyYik7CisJCQlwLT5yZXN1bHQgPSByZXN1bHQ7CisJCQlwY2lfdW5tYXBfc3JiX3NlbnNlKGFjYiwgc3JiKTsKKwkJCXBjaV91bm1hcF9zcmIoYWNiLCBzcmIpOworCQkJaWYgKGZvcmNlKSB7CisJCQkJLyogRm9yIG5ldyBFSCwgd2Ugbm9ybWFsbHkgZG9uJ3QgbmVlZCB0byBnaXZlIGNvbW1hbmRzIGJhY2ssCisJCQkJICogYXMgdGhleSBhbGwgY29tcGxldGUgb3IgYWxsIHRpbWUgb3V0ICovCisJCQkJcC0+c2NzaV9kb25lKHApOworCQkJfQorCQl9CisJCWlmICghbGlzdF9lbXB0eSgmZGNiLT5zcmJfZ29pbmdfbGlzdCkpCisJCQlkcHJpbnRrbChLRVJOX0RFQlVHLCAKKwkJCSAgICAgICAiSG93IGNvdWxkIHRoZSBNTCBzZW5kIGNtbmRzIHRvIHRoZSBHb2luZyBxdWV1ZT8gPCUwMmktJWk+XG4iLAorCQkJICAgICAgIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4pOworCQlpZiAoZGNiLT50YWdfbWFzaykKKwkJCWRwcmludGtsKEtFUk5fREVCVUcsCisJCQkgICAgICAgInRhZ19tYXNrIGZvciA8JTAyaS0laT4gc2hvdWxkIGJlIGVtcHR5LCBpcyAlMDh4IVxuIiwKKwkJCSAgICAgICBkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLAorCQkJICAgICAgIGRjYi0+dGFnX21hc2spOworCisJCS8qIFdhaXRpbmcgcXVldWUgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNyYiwgdG1wLCAmZGNiLT5zcmJfd2FpdGluZ19saXN0LCBsaXN0KSB7CisJCQlpbnQgcmVzdWx0OworCQkJcCA9IHNyYi0+Y21kOworCisJCQlyZXN1bHQgPSBNS19SRVMoMCwgZGlkX2ZsYWcsIDAsIDApOworCQkJcHJpbnRrKCJXOiVsaTwlMDJpLSVpPiIsIHAtPnBpZCwgcC0+ZGV2aWNlLT5pZCwKKwkJCSAgICAgICBwLT5kZXZpY2UtPmx1bik7CisJCQlzcmJfd2FpdGluZ19yZW1vdmUoZGNiLCBzcmIpOworCQkJc3JiX2ZyZWVfaW5zZXJ0KGFjYiwgc3JiKTsKKwkJCXAtPnJlc3VsdCA9IHJlc3VsdDsKKwkJCXBjaV91bm1hcF9zcmJfc2Vuc2UoYWNiLCBzcmIpOworCQkJcGNpX3VubWFwX3NyYihhY2IsIHNyYik7CisJCQlpZiAoZm9yY2UpIHsKKwkJCQkvKiBGb3IgbmV3IEVILCB3ZSBub3JtYWxseSBkb24ndCBuZWVkIHRvIGdpdmUgY29tbWFuZHMgYmFjaywKKwkJCQkgKiBhcyB0aGV5IGFsbCBjb21wbGV0ZSBvciBhbGwgdGltZSBvdXQgKi8KKwkJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJfQorCQl9CisJCWlmICghbGlzdF9lbXB0eSgmZGNiLT5zcmJfd2FpdGluZ19saXN0KSkKKwkJCWRwcmludGtsKEtFUk5fREVCVUcsICJNTCBxdWV1ZWQgJWkgY21uZHMgYWdhaW4gdG8gPCUwMmktJWk+XG4iLAorCQkJICAgICBsaXN0X3NpemUoJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCksIGRjYi0+dGFyZ2V0X2lkLAorCQkJICAgICBkY2ItPnRhcmdldF9sdW4pOworCQlkY2ItPmZsYWcgJj0gfkFCT1JUX0RFVl87CisJfQorCXByaW50aygiXG4iKTsKK30KKworCitzdGF0aWMgdm9pZCByZXNldF9zY3NpX2J1cyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCWRwcmludGtkYmcoREJHXzAsICJyZXNldF9zY3NpX2J1czogYWNiPSVwXG4iLCBhY2IpOworCWFjYi0+YWNiX2ZsYWcgfD0gUkVTRVRfREVWOwkvKiBSRVNFVF9ERVRFQ1QsIFJFU0VUX0RPTkUsIFJFU0VUX0RFViAqLworCURDMzk1eF93cml0ZTE2KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fUlNUU0NTSSk7CisKKwl3aGlsZSAoIShEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRTVEFUVVMpICYgSU5UX1NDU0lSRVNFVCkpCisJCS8qIG5vdGhpbmcgKi87Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2Jhc2ljX2NvbmZpZyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXU4IGJ2YWw7CisJdTE2IHd2YWw7CisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9TQ1NJX1RJTUVPVVQsIGFjYi0+c2VsX3RpbWVvdXQpOworCWlmIChhY2ItPmNvbmZpZyAmIEhDQ19QQVJJVFkpCisJCWJ2YWwgPSBQSEFTRUxBVENIIHwgSU5JVElBVE9SIHwgQkxPQ0tSU1QgfCBQQVJJVFlDSEVDSzsKKwllbHNlCisJCWJ2YWwgPSBQSEFTRUxBVENIIHwgSU5JVElBVE9SIHwgQkxPQ0tSU1Q7CisKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMCwgYnZhbCk7CisKKwkvKiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24gMTogQWN0X05lZyAoKyBBY3RfTmVnX0VuaD8gKyBGYXN0X0ZpbHRlcj8gKyBEYXRhRGlzPykgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMSwgMHgwMyk7CS8qIHdhcyAweDEzOiBkZWZhdWx0ICovCisJLyogcHJvZ3JhbSBIb3N0IElEICAgICAgICAgICAgICAgICAgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSE9TVElELCBhY2ItPnNjc2lfaG9zdC0+dGhpc19pZCk7CisJLyogc2V0IGFuc3luY2hyb25vdXMgdHJhbnNmZXIgICAgICAgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfT0ZGU0VULCAweDAwKTsKKwkvKiBUdXJuIExFRCBjb250cm9sIG9mZiAqLworCXd2YWwgPSBEQzM5NXhfcmVhZDE2KGFjYiwgVFJNX1MxMDQwX0dFTl9DT05UUk9MKSAmIDB4N0Y7CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfR0VOX0NPTlRST0wsIHd2YWwpOworCS8qIERNQSBjb25maWcgICAgICAgICAgKi8KKwl3dmFsID0gREMzOTV4X3JlYWQxNihhY2IsIFRSTV9TMTA0MF9ETUFfQ09ORklHKSAmIH5ETUFfRklGT19DVFJMOworCXd2YWwgfD0KKwkgICAgRE1BX0ZJRk9fSEFMRl9IQUxGIHwgRE1BX0VOSEFOQ0UgLyp8IERNQV9NRU1fTVVMVElfUkVBRCAqLyA7CisJREMzOTV4X3dyaXRlMTYoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTkZJRywgd3ZhbCk7CisJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQgc3RhdHVzICovCisJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5UU1RBVFVTKTsKKwkvKiBFbmFibGUgU0NTSSBpbnRlcnJ1cHQgICAgKi8KKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5URU4sIDB4N0YpOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0lOVEVOLCBFTl9TQ1NJSU5UUiB8IEVOX0RNQVhGRVJFUlJPUgorCQkgICAgICAvKnwgRU5fRE1BWEZFUkFCT1JUIHwgRU5fRE1BWEZFUkNPTVAgfCBFTl9GT1JDRURNQUNPTVAgKi8KKwkJICAgICAgKTsKK30KKworCitzdGF0aWMgdm9pZCBzY3NpX3Jlc2V0X2RldGVjdChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCWRwcmludGtsKEtFUk5fSU5GTywgInNjc2lfcmVzZXRfZGV0ZWN0OiBhY2I9JXBcbiIsIGFjYik7CisJLyogZGVsYXkgaGFsZiBhIHNlY29uZCAqLworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPndhaXRpbmdfdGltZXIpKQorCQlkZWxfdGltZXIoJmFjYi0+d2FpdGluZ190aW1lcik7CisKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09OVFJPTCwgRE9fUlNUTU9EVUxFKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05UUk9MLCBETUFSRVNFVE1PRFVMRSk7CisJLypEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX0RNQV9DT05UUk9MLFNUT1BETUFYRkVSKTsgKi8KKwl1ZGVsYXkoNTAwKTsKKwkvKiBNYXliZSB3ZSBsb2NrZWQgdXAgdGhlIGJ1cz8gVGhlbiBsZXRzIHdhaXQgZXZlbiBsb25nZXIgLi4uICovCisJYWNiLT5zY3NpX2hvc3QtPmxhc3RfcmVzZXQgPQorCSAgICBqaWZmaWVzICsgNSAqIEhaIC8gMiArCisJICAgIEhaICogYWNiLT5lZXByb20uZGVsYXlfdGltZTsKKworCWNsZWFyX2ZpZm8oYWNiLCAic2NzaV9yZXNldF9kZXRlY3QiKTsKKwlzZXRfYmFzaWNfY29uZmlnKGFjYik7CisJLyoxLjI1ICovCisJLypEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX0hXUkVTRUxFQ1QpOyAqLworCisJaWYgKGFjYi0+YWNiX2ZsYWcgJiBSRVNFVF9ERVYpIHsJLyogUkVTRVRfREVURUNULCBSRVNFVF9ET05FLCBSRVNFVF9ERVYgKi8KKwkJYWNiLT5hY2JfZmxhZyB8PSBSRVNFVF9ET05FOworCX0gZWxzZSB7CisJCWFjYi0+YWNiX2ZsYWcgfD0gUkVTRVRfREVURUNUOworCQlyZXNldF9kZXZfcGFyYW0oYWNiKTsKKwkJZG9pbmdfc3JiX2RvbmUoYWNiLCBESURfUkVTRVQsIE5VTEwsIDEpOworCQkvKkRDMzk1eF9SZWNvdmVyU1JCKCBhY2IgKTsgKi8KKwkJYWNiLT5hY3RpdmVfZGNiID0gTlVMTDsKKwkJYWNiLT5hY2JfZmxhZyA9IDA7CisJCXdhaXRpbmdfcHJvY2Vzc19uZXh0KGFjYik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJlcXVlc3Rfc2Vuc2Uoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiwgc3RydWN0IERldmljZUN0bEJsayAqZGNiLAorCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNyYi0+Y21kOworCWRwcmludGtkYmcoREJHXzEsICJyZXF1ZXN0X3NlbnNlOiAocGlkIyVsaSkgPCUwMmktJWk+XG4iLAorCQljbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCXNyYi0+ZmxhZyB8PSBBVVRPX1JFUVNFTlNFOworCXNyYi0+YWRhcHRlcl9zdGF0dXMgPSAwOworCXNyYi0+dGFyZ2V0X3N0YXR1cyA9IDA7CisKKwkvKiBLRzogQ2FuIHRoaXMgcHJldmVudCBjcmFwIHNlbnNlIGRhdGEgPyAqLworCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwkvKiBTYXZlIHNvbWUgZGF0YSAqLworCXNyYi0+c2VnbWVudF94W0RDMzk1eF9NQVhfU0dfTElTVEVOVFJZIC0gMV0uYWRkcmVzcyA9CisJICAgIHNyYi0+c2VnbWVudF94WzBdLmFkZHJlc3M7CisJc3JiLT5zZWdtZW50X3hbREMzOTV4X01BWF9TR19MSVNURU5UUlkgLSAxXS5sZW5ndGggPQorCSAgICBzcmItPnNlZ21lbnRfeFswXS5sZW5ndGg7CisJc3JiLT54ZmVycmVkID0gc3JiLT50b3RhbF94ZmVyX2xlbmd0aDsKKwkvKiBzcmItPnNlZ21lbnRfeCA6IGEgb25lIGVudHJ5IG9mIFMvRyBsaXN0IHRhYmxlICovCisJc3JiLT50b3RhbF94ZmVyX2xlbmd0aCA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisJc3JiLT5zZWdtZW50X3hbMF0ubGVuZ3RoID0gc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKTsKKwkvKiBNYXAgc2Vuc2UgYnVmZmVyICovCisJc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcyA9CisJICAgIHBjaV9tYXBfc2luZ2xlKGFjYi0+ZGV2LCBjbWQtPnNlbnNlX2J1ZmZlciwKKwkJCSAgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlciksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZHByaW50a2RiZyhEQkdfU0csICJyZXF1ZXN0X3NlbnNlOiBtYXAgYnVmZmVyICVwLT4lMDh4KCUwNXgpXG4iLAorCSAgICAgICBjbWQtPnNlbnNlX2J1ZmZlciwgc3JiLT5zZWdtZW50X3hbMF0uYWRkcmVzcywKKwkgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJc3JiLT5zZ19jb3VudCA9IDE7CisJc3JiLT5zZ19pbmRleCA9IDA7CisKKwlpZiAoc3RhcnRfc2NzaShhY2IsIGRjYiwgc3JiKSkgewkvKiBTaG91bGQgb25seSBoYXBwZW4sIGlmIHNiLiBlbHNlIGdyYWJzIHRoZSBidXMgKi8KKwkJZHByaW50a2woS0VSTl9ERUJVRywKKwkJCSJyZXF1ZXN0X3NlbnNlOiAocGlkIyVsaSkgZmFpbGVkIDwlMDJpLSVpPlxuIiwKKwkJCXNyYi0+Y21kLT5waWQsIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4pOworCQlzcmJfZ29pbmdfdG9fd2FpdGluZ19tb3ZlKGRjYiwgc3JiKTsKKwkJd2FpdGluZ19zZXRfdGltZXIoYWNiLCBIWiAvIDEwMCk7CisJfQorfQorCisKKy8qKgorICogZGV2aWNlX2FsbG9jIC0gQWxsb2NhdGUgYSBuZXcgZGV2aWNlIGluc3RhbmNlLiBUaGlzIGNyZWF0ZSB0aGUKKyAqIGRldmljZXMgaW5zdGFuY2UgYW5kIHNldHMgdXAgYWxsIHRoZSBkYXRhIGl0ZW1zLiBUaGUgYWRhcHRlcgorICogaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gb2J0YWluIGNvbmZpdXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcworICogZGV2aWNlLiBUaGlzIGRvZXMgKm5vdCogYWRkIHRoaXMgZGV2aWNlIHRvIHRoZSBhZGFwdGVycyBkZXZpY2UKKyAqIGxpc3QuCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgdG8gb2J0YWluIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbS4KKyAqIEB0YXJnZXQ6IFRoZSB0YXJnZXQgZm9yIHRoZSBuZXcgZGV2aWNlLgorICogQGx1bjogVGhlIGx1biBmb3IgdGhlIG5ldyBkZXZpY2UuCisgKgorICogUmV0dXJuIHRoZSBuZXcgZGV2aWNlIGlmIHN1Y2Nlc2Z1bGwgb3IgTlVMTCBvbiBmYWlsdXJlLgorICoqLworc3RhdGljIHN0cnVjdCBEZXZpY2VDdGxCbGsgKmRldmljZV9hbGxvYyhzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQl1OCB0YXJnZXQsIHU4IGx1bikKK3sKKwlzdHJ1Y3QgTnZSYW1UeXBlICplZXByb20gPSAmYWNiLT5lZXByb207CisJdTggcGVyaW9kX2luZGV4ID0gZWVwcm9tLT50YXJnZXRbdGFyZ2V0XS5wZXJpb2QgJiAweDA3OworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKworCWRjYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBEZXZpY2VDdGxCbGspLCBHRlBfQVRPTUlDKTsKKwlkcHJpbnRrZGJnKERCR18wLCAiZGV2aWNlX2FsbG9jOiA8JTAyaS0laT5cbiIsIHRhcmdldCwgbHVuKTsKKwlpZiAoIWRjYikKKwkJcmV0dXJuIE5VTEw7CisJZGNiLT5hY2IgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZkY2ItPnNyYl9nb2luZ19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZGNiLT5zcmJfd2FpdGluZ19saXN0KTsKKwlkY2ItPmFjdGl2ZV9zcmIgPSBOVUxMOworCWRjYi0+dGFnX21hc2sgPSAwOworCWRjYi0+bWF4X2NvbW1hbmQgPSAxOworCWRjYi0+dGFyZ2V0X2lkID0gdGFyZ2V0OworCWRjYi0+dGFyZ2V0X2x1biA9IGx1bjsKKyNpZm5kZWYgREMzOTV4X05PX0RJU0NPTk5FQ1QKKwlkY2ItPmlkZW50aWZ5X21zZyA9CisJICAgIElERU5USUZZKGRjYi0+ZGV2X21vZGUgJiBOVENfRE9fRElTQ09OTkVDVCwgbHVuKTsKKyNlbHNlCisJZGNiLT5pZGVudGlmeV9tc2cgPSBJREVOVElGWSgwLCBsdW4pOworI2VuZGlmCisJZGNiLT5kZXZfbW9kZSA9IGVlcHJvbS0+dGFyZ2V0W3RhcmdldF0uY2ZnMDsKKwlkY2ItPmlucXVpcnk3ID0gMDsKKwlkY2ItPnN5bmNfbW9kZSA9IDA7CisJZGNiLT5taW5fbmVnb19wZXJpb2QgPSBjbG9ja19wZXJpb2RbcGVyaW9kX2luZGV4XTsKKwlkY2ItPnN5bmNfcGVyaW9kID0gMDsKKwlkY2ItPnN5bmNfb2Zmc2V0ID0gMDsKKwlkY2ItPmZsYWcgPSAwOworCisjaWZuZGVmIERDMzk1eF9OT19XSURFCisJaWYgKChkY2ItPmRldl9tb2RlICYgTlRDX0RPX1dJREVfTkVHTykKKwkgICAgJiYgKGFjYi0+Y29uZmlnICYgSENDX1dJREVfQ0FSRCkpCisJCWRjYi0+c3luY19tb2RlIHw9IFdJREVfTkVHT19FTkFCTEU7CisjZW5kaWYKKyNpZm5kZWYgREMzOTV4X05PX1NZTkMKKwlpZiAoZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19TWU5DX05FR08pCisJCWlmICghKGx1bikgfHwgY3VycmVudF9zeW5jX29mZnNldCkKKwkJCWRjYi0+c3luY19tb2RlIHw9IFNZTkNfTkVHT19FTkFCTEU7CisjZW5kaWYKKwlpZiAoZGNiLT50YXJnZXRfbHVuICE9IDApIHsKKwkJLyogQ29weSBzZXR0aW5ncyAqLworCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZhY2ItPmRjYl9saXN0LCBsaXN0KQorCQkJaWYgKHAtPnRhcmdldF9pZCA9PSBkY2ItPnRhcmdldF9pZCkKKwkJCQlicmVhazsKKwkJZHByaW50a2RiZyhEQkdfMSwgCisJCSAgICAgICAiZGV2aWNlX2FsbG9jOiA8JTAyaS0laT4gY29weSBmcm9tIDwlMDJpLSVpPlxuIiwKKwkJICAgICAgIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4sCisJCSAgICAgICBwLT50YXJnZXRfaWQsIHAtPnRhcmdldF9sdW4pOworCQlkY2ItPnN5bmNfbW9kZSA9IHAtPnN5bmNfbW9kZTsKKwkJZGNiLT5zeW5jX3BlcmlvZCA9IHAtPnN5bmNfcGVyaW9kOworCQlkY2ItPm1pbl9uZWdvX3BlcmlvZCA9IHAtPm1pbl9uZWdvX3BlcmlvZDsKKwkJZGNiLT5zeW5jX29mZnNldCA9IHAtPnN5bmNfb2Zmc2V0OworCQlkY2ItPmlucXVpcnk3ID0gcC0+aW5xdWlyeTc7CisJfQorCXJldHVybiBkY2I7Cit9CisKKworLyoqCisgKiBhZGFwdGVyX2FkZF9kZXZpY2UgLSBBZGRzIHRoZSBkZXZpY2UgaW5zdGFuY2UgdG8gdGhlIGFkYXB0b3IgaW5zdGFuY2UuCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgZGV2aWNlIHRvIGJlIHVwZGF0ZWQKKyAqIEBkY2I6IEEgbmV3bHkgY3JlYXRlZCBhbmQgaW50aWFsaXNlZCBkZXZpY2UgaW5zdGFuY2UgdG8gYWRkLgorICoqLworc3RhdGljIHZvaWQgYWRhcHRlcl9hZGRfZGV2aWNlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYikKK3sKKwkvKiBiYWNrcG9pbnRlciB0byBhZGFwdGVyICovCisJZGNiLT5hY2IgPSBhY2I7CisJCisJLyogc2V0IHJ1bl9yb2JpbiB0byB0aGlzIGRldmljZSBpZiBpdCBpcyBjdXJyZW50bHkgZW1wdHkgKi8KKwlpZiAobGlzdF9lbXB0eSgmYWNiLT5kY2JfbGlzdCkpCisJCWFjYi0+ZGNiX3J1bl9yb2JpbiA9IGRjYjsKKworCS8qIGFkZCBkZXZpY2UgdG8gbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJmRjYi0+bGlzdCwgJmFjYi0+ZGNiX2xpc3QpOworCisJLyogdXBkYXRlIGRldmljZSBtYXBzICovCisJYWNiLT5kY2JfbWFwW2RjYi0+dGFyZ2V0X2lkXSB8PSAoMSA8PCBkY2ItPnRhcmdldF9sdW4pOworCWFjYi0+Y2hpbGRyZW5bZGNiLT50YXJnZXRfaWRdW2RjYi0+dGFyZ2V0X2x1bl0gPSBkY2I7Cit9CisKKworLyoqCisgKiBhZGFwdGVyX3JlbW92ZV9kZXZpY2UgLSBSZW1vdmVzIHRoZSBkZXZpY2UgaW5zdGFuY2UgZnJvbSB0aGUgYWRhcHRvcgorICogaW5zdGFuY2UuIFRoZSBkZXZpY2UgaW5zdGFuY2UgaXMgbm90IGNoZWNrIGluIGFueSB3YXkgb3IgZnJlZWQgYnkgdGhpcy4gCisgKiBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHRha2UgY2FyZSBvZiB0aGF0LiBUaGlzIHdpbGwgc2ltcGx5IHJlbW92ZSB0aGUKKyAqIGRldmljZSBmcm9tIHRoZSBhZGFwdGVycyBkYXRhIHN0cmN1dHVyZXMuCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgZGV2aWNlIHRvIGJlIHVwZGF0ZWQKKyAqIEBkY2I6IEEgZGV2aWNlIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlci4KKyAqKi8KK3N0YXRpYyB2b2lkIGFkYXB0ZXJfcmVtb3ZlX2RldmljZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAorCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IpCit7CisJc3RydWN0IERldmljZUN0bEJsayAqaTsKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICp0bXA7CisJZHByaW50a2RiZyhEQkdfMCwgImFkYXB0ZXJfcmVtb3ZlX2RldmljZTogPCUwMmktJWk+XG4iLAorCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuKTsKKworCS8qIGZpeCB1cCBhbnkgcG9pbnRlcnMgdG8gdGhpcyBkZXZpY2UgdGhhdCB3ZSBoYXZlIGluIHRoZSBhZGFwdGVyICovCisJaWYgKGFjYi0+YWN0aXZlX2RjYiA9PSBkY2IpCisJCWFjYi0+YWN0aXZlX2RjYiA9IE5VTEw7CisJaWYgKGFjYi0+ZGNiX3J1bl9yb2JpbiA9PSBkY2IpCisJCWFjYi0+ZGNiX3J1bl9yb2JpbiA9IGRjYl9nZXRfbmV4dCgmYWNiLT5kY2JfbGlzdCwgZGNiKTsKKworCS8qIHVubGluayBmcm9tIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaSwgdG1wLCAmYWNiLT5kY2JfbGlzdCwgbGlzdCkKKwkJaWYgKGRjYiA9PSBpKSB7CisJCQlsaXN0X2RlbCgmaS0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorCisJLyogY2xlYXIgbWFwIGFuZCBjaGlsZHJlbiAqLwkKKwlhY2ItPmRjYl9tYXBbZGNiLT50YXJnZXRfaWRdICY9IH4oMSA8PCBkY2ItPnRhcmdldF9sdW4pOworCWFjYi0+Y2hpbGRyZW5bZGNiLT50YXJnZXRfaWRdW2RjYi0+dGFyZ2V0X2x1bl0gPSBOVUxMOworCWRjYi0+YWNiID0gTlVMTDsKK30KKworCisvKioKKyAqIGFkYXB0ZXJfcmVtb3ZlX2FuZF9mcmVlX2RldmljZSAtIFJlbW92ZXMgYSBzaW5nbGUgZGV2aWNlIGZyb20gdGhlIGFkYXB0ZXIKKyAqIGFuZCB0aGVuIGZyZWVzIHRoZSBkZXZpY2UgaW5mb3JtYXRpb24uCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgZGV2aWNlIHRvIGJlIHVwZGF0ZWQKKyAqIEBkY2I6IEEgZGV2aWNlIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIHZvaWQgYWRhcHRlcl9yZW1vdmVfYW5kX2ZyZWVfZGV2aWNlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYikKK3sKKwlpZiAobGlzdF9zaXplKCZkY2ItPnNyYl9nb2luZ19saXN0KSA+IDEpIHsKKwkJZHByaW50a2RiZyhEQkdfMSwgImFkYXB0ZXJfcmVtb3ZlX2FuZF9mcmVlX2RldmljZTogPCUwMmktJWk+ICIKKwkJICAgICAgICAgICAiV29uJ3QgcmVtb3ZlIGJlY2F1c2Ugb2YgJWkgYWN0aXZlIHJlcXVlc3RzLlxuIiwKKwkJCSAgIGRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4sCisJCQkgICBsaXN0X3NpemUoJmRjYi0+c3JiX2dvaW5nX2xpc3QpKTsKKwkJcmV0dXJuOworCX0KKwlhZGFwdGVyX3JlbW92ZV9kZXZpY2UoYWNiLCBkY2IpOworCWtmcmVlKGRjYik7Cit9CisKKworLyoqCisgKiBhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9hbGxfZGV2aWNlcyAtIFJlbW92ZXMgYW5kIGZyZWVzIGFsbCBvZiB0aGUKKyAqIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KKyAqCisgKiBAYWNiOiBUaGUgYWRhcHRlciBmcm9tIHdoaWNoIGFsbCBkZXZpY2VzIHNob3VsZCBiZSByZW1vdmVkLgorICoqLworc3RhdGljIHZvaWQgYWRhcHRlcl9yZW1vdmVfYW5kX2ZyZWVfYWxsX2RldmljZXMoc3RydWN0IEFkYXB0ZXJDdGxCbGsqIGFjYikKK3sKKwlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2I7CisJc3RydWN0IERldmljZUN0bEJsayAqdG1wOworCWRwcmludGtkYmcoREJHXzEsICJhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9hbGxfZGV2aWNlczogbnVtPSVpXG4iLAorCQkgICBsaXN0X3NpemUoJmFjYi0+ZGNiX2xpc3QpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkY2IsIHRtcCwgJmFjYi0+ZGNiX2xpc3QsIGxpc3QpCisJCWFkYXB0ZXJfcmVtb3ZlX2FuZF9mcmVlX2RldmljZShhY2IsIGRjYik7Cit9CisKKworLyoqCisgKiBkYzM5NXhfc2xhdmVfYWxsb2MgLSBDYWxsZWQgYnkgdGhlIHNjc2kgbWlkIGxheWVyIHRvIHRlbGwgdXMgYWJvdXQgYSBuZXcKKyAqIHNjc2kgZGV2aWNlIHRoYXQgd2UgbmVlZCB0byBkZWFsIHdpdGguIFdlIGFsbG9jYXRlIGEgbmV3IGRldmljZSBhbmQgdGhlbgorICogaW5zZXJ0IHRoYXQgZGV2aWNlIGludG8gdGhlIGFkYXB0ZXJzIGRldmljZSBsaXN0LgorICoKKyAqIEBzY3NpX2RldmljZTogVGhlIG5ldyBzY3NpIGRldmljZSB0aGF0IHdlIG5lZWQgdG8gaGFuZGxlLgorICoqLworc3RhdGljIGludCBkYzM5NXhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldmljZSkKK3sKKwlzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiID0gKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICopc2NzaV9kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKworCWRjYiA9IGRldmljZV9hbGxvYyhhY2IsIHNjc2lfZGV2aWNlLT5pZCwgc2NzaV9kZXZpY2UtPmx1bik7CisJaWYgKCFkY2IpCisJCXJldHVybiAtRU5PTUVNOworCWFkYXB0ZXJfYWRkX2RldmljZShhY2IsIGRjYik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIGRjMzk1eF9zbGF2ZV9kZXN0cm95IC0gQ2FsbGVkIGJ5IHRoZSBzY3NpIG1pZCBsYXllciB0byB0ZWxsIHVzIGFib3V0IGEKKyAqIGRldmljZSB0aGF0IGlzIGdvaW5nIGF3YXkuCisgKgorICogQHNjc2lfZGV2aWNlOiBUaGUgbmV3IHNjc2kgZGV2aWNlIHRoYXQgd2UgbmVlZCB0byBoYW5kbGUuCisgKiovCitzdGF0aWMgdm9pZCBkYzM5NXhfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlKQoreworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKilzY3NpX2RldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IERldmljZUN0bEJsayAqZGNiID0gZmluZF9kY2IoYWNiLCBzY3NpX2RldmljZS0+aWQsIHNjc2lfZGV2aWNlLT5sdW4pOworCWlmIChkY2IpCisJCWFkYXB0ZXJfcmVtb3ZlX2FuZF9mcmVlX2RldmljZShhY2IsIGRjYik7Cit9CisKKworCisKKy8qKgorICogdHJtczEwNDBfd2FpdF8zMHVzOiB3YWl0IGZvciAzMCB1cworICoKKyAqIFdhaXRzIGZvciAzMHVzICh1c2luZyB0aGUgY2hpcCBieSB0aGUgbG9va3Mgb2YgaXQuLikKKyAqCisgKiBAaW9fcG9ydDogYmFzZSBJL08gYWRkcmVzcworICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHRybXMxMDQwX3dhaXRfMzB1cyh1bnNpZ25lZCBsb25nIGlvX3BvcnQpCit7CisJLyogU2NzaVBvcnRTdGFsbEV4ZWN1dGlvbigzMCk7IHdhaXQgMzAgdXMgKi8KKwlvdXRiKDUsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX1RJTUVSKTsKKwl3aGlsZSAoIShpbmIoaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fU1RBVFVTKSAmIEdUSU1FT1VUKSkKKwkJLyogbm90aGluZyAqLyA7Cit9CisKKworLyoqCisgKiB0cm1zMTA0MF93cml0ZV9jbWQgLSB3cml0ZSB0aGUgc2VjaWZpZWQgY29tbWFuZCBhbmQgYWRkcmVzcyB0bworICogY2hpcAorICoKKyAqIEBpb19wb3J0OgliYXNlIEkvTyBhZGRyZXNzCisgKiBAY21kOglTQiArIG9wIGNvZGUgKGNvbW1hbmQpIHRvIHNlbmQKKyAqIEBhZGRyOglhZGRyZXNzIHRvIHNlbmQKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0cm1zMTA0MF93cml0ZV9jbWQodW5zaWduZWQgbG9uZyBpb19wb3J0LCB1OCBjbWQsIHU4IGFkZHIpCit7CisJaW50IGk7CisJdTggc2VuZF9kYXRhOworCisJLyogcHJvZ3JhbSBTQiArIE9QIGNvZGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrLCBjbWQgPDw9IDEpIHsKKwkJc2VuZF9kYXRhID0gTlZSX1NFTEVDVDsKKwkJaWYgKGNtZCAmIDB4MDQpCS8qIFN0YXJ0IGZyb20gYml0IDIgKi8KKwkJCXNlbmRfZGF0YSB8PSBOVlJfQklUT1VUOworCisJCW91dGIoc2VuZF9kYXRhLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwkJb3V0Yigoc2VuZF9kYXRhIHwgTlZSX0NMT0NLKSwKKwkJICAgICBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwl9CisKKwkvKiBzZW5kIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBhZGRyIDw8PSAxKSB7CisJCXNlbmRfZGF0YSA9IE5WUl9TRUxFQ1Q7CisJCWlmIChhZGRyICYgMHg0MCkJLyogU3RhcnQgZnJvbSBiaXQgNiAqLworCQkJc2VuZF9kYXRhIHw9IE5WUl9CSVRPVVQ7CisKKwkJb3V0YihzZW5kX2RhdGEsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwkJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCQlvdXRiKChzZW5kX2RhdGEgfCBOVlJfQ0xPQ0spLAorCQkgICAgIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwkJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCX0KKwlvdXRiKE5WUl9TRUxFQ1QsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7Cit9CisKKworLyoqCisgKiB0cm1zMTA0MF9zZXRfZGF0YSAtIHN0b3JlIGEgc2luZ2xlIGJ5dGUgaW4gdGhlIGVlcHJvbQorICoKKyAqIENhbGxlZCBmcm9tIHdyaXRlIGFsbCB0byB3cml0ZSBhIHNpbmdsZSBieXRlIGludG8gdGhlIFNTRUVQUk9NCisgKiBXaGljaCBpcyBkb25lIG9uZSBiaXQgYXQgYSB0aW1lLgorICoKKyAqIEBpb19wb3J0OgliYXNlIEkvTyBhZGRyZXNzCisgKiBAYWRkcjoJb2Zmc2V0IGludG8gRUVQUk9NCisgKiBAYnl0ZToJYnl0ZXMgdG8gd3JpdGUKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0cm1zMTA0MF9zZXRfZGF0YSh1bnNpZ25lZCBsb25nIGlvX3BvcnQsIHU4IGFkZHIsIHU4IGJ5dGUpCit7CisJaW50IGk7CisJdTggc2VuZF9kYXRhOworCisJLyogU2VuZCB3cml0ZSBjb21tYW5kICYgYWRkcmVzcyAqLworCXRybXMxMDQwX3dyaXRlX2NtZChpb19wb3J0LCAweDA1LCBhZGRyKTsKKworCS8qIFdyaXRlIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBieXRlIDw8PSAxKSB7CisJCXNlbmRfZGF0YSA9IE5WUl9TRUxFQ1Q7CisJCWlmIChieXRlICYgMHg4MCkJLyogU3RhcnQgZnJvbSBiaXQgNyAqLworCQkJc2VuZF9kYXRhIHw9IE5WUl9CSVRPVVQ7CisKKwkJb3V0YihzZW5kX2RhdGEsIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwkJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCQlvdXRiKChzZW5kX2RhdGEgfCBOVlJfQ0xPQ0spLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwl9CisJb3V0YihOVlJfU0VMRUNULCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCisJLyogRGlzYWJsZSBjaGlwIHNlbGVjdCAqLworCW91dGIoMCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKworCW91dGIoTlZSX1NFTEVDVCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKworCS8qIFdhaXQgZm9yIHdyaXRlIHJlYWR5ICovCisJd2hpbGUgKDEpIHsKKwkJb3V0YigoTlZSX1NFTEVDVCB8IE5WUl9DTE9DSyksIGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX05WUkFNKTsKKwkJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCisJCW91dGIoTlZSX1NFTEVDVCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCQl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisKKwkJaWYgKGluYihpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSkgJiBOVlJfQklUSU4pCisJCQlicmVhazsKKwl9CisKKwkvKiAgRGlzYWJsZSBjaGlwIHNlbGVjdCAqLworCW91dGIoMCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworfQorCisKKy8qKgorICogdHJtczEwNDBfd3JpdGVfYWxsIC0gd3JpdGUgMTI4IGJ5dGVzIHRvIHRoZSBlZXByb20KKyAqCisgKiBXcml0ZSB0aGUgc3VwcGxpZWQgMTI4IGJ5dGVzIHRvIHRoZSBjaGlwcyBTRUVQUk9NCisgKgorICogQGVlcHJvbToJdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBpb19wb3J0Ogl0aGUgYmFzZSBpbyBwb3J0CisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdHJtczEwNDBfd3JpdGVfYWxsKHN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSwgdW5zaWduZWQgbG9uZyBpb19wb3J0KQoreworCXU4ICpiX2VlcHJvbSA9ICh1OCAqKWVlcHJvbTsKKwl1OCBhZGRyOworCisJLyogRW5hYmxlIFNFRVBST00gKi8KKwlvdXRiKChpbmIoaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCkgfCBFTl9FRVBST00pLAorCSAgICAgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCk7CisKKwkvKiB3cml0ZSBlbmFibGUgKi8KKwl0cm1zMTA0MF93cml0ZV9jbWQoaW9fcG9ydCwgMHgwNCwgMHhGRik7CisJb3V0YigwLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJdHJtczEwNDBfd2FpdF8zMHVzKGlvX3BvcnQpOworCisJLyogd3JpdGUgKi8KKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgMTI4OyBhZGRyKyssIGJfZWVwcm9tKyspCisJCXRybXMxMDQwX3NldF9kYXRhKGlvX3BvcnQsIGFkZHIsICpiX2VlcHJvbSk7CisKKwkvKiB3cml0ZSBkaXNhYmxlICovCisJdHJtczEwNDBfd3JpdGVfY21kKGlvX3BvcnQsIDB4MDQsIDB4MDApOworCW91dGIoMCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKworCS8qIERpc2FibGUgU0VFUFJPTSAqLworCW91dGIoKGluYihpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9DT05UUk9MKSAmIH5FTl9FRVBST00pLAorCSAgICAgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCk7Cit9CisKKworLyoqCisgKiB0cm1zMTA0MF9nZXRfZGF0YSAtIGdldCBhIHNpbmdsZSBieXRlIGZyb20gdGhlIGVlcHJvbQorICoKKyAqIENhbGxlZCBmcm9tIHJlYWQgYWxsIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSBpbnRvIHRoZSBTU0VFUFJPTQorICogV2hpY2ggaXMgZG9uZSBvbmUgYml0IGF0IGEgdGltZS4KKyAqCisgKiBAaW9fcG9ydDoJYmFzZSBJL08gYWRkcmVzcworICogQGFkZHI6CW9mZnNldCBpbnRvIFNFRVBST00KKyAqCisgKiBSZXR1cm5zIHRoZSB0aGUgYnl0ZSByZWFkLgorICoqLworc3RhdGljIHU4IF9fZGV2aW5pdCB0cm1zMTA0MF9nZXRfZGF0YSh1bnNpZ25lZCBsb25nIGlvX3BvcnQsIHU4IGFkZHIpCit7CisJaW50IGk7CisJdTggcmVhZF9ieXRlOworCXU4IHJlc3VsdCA9IDA7CisKKwkvKiBTZW5kIHJlYWQgY29tbWFuZCAmIGFkZHJlc3MgKi8KKwl0cm1zMTA0MF93cml0ZV9jbWQoaW9fcG9ydCwgMHgwNiwgYWRkcik7CisKKwkvKiByZWFkIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCW91dGIoKE5WUl9TRUxFQ1QgfCBOVlJfQ0xPQ0spLCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisJCXRybXMxMDQwX3dhaXRfMzB1cyhpb19wb3J0KTsKKwkJb3V0YihOVlJfU0VMRUNULCBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9OVlJBTSk7CisKKwkJLyogR2V0IGRhdGEgYml0IHdoaWxlIGZhbGxpbmcgZWRnZSAqLworCQlyZWFkX2J5dGUgPSBpbmIoaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCQlyZXN1bHQgPDw9IDE7CisJCWlmIChyZWFkX2J5dGUgJiBOVlJfQklUSU4pCisJCQlyZXN1bHQgfD0gMTsKKworCQl0cm1zMTA0MF93YWl0XzMwdXMoaW9fcG9ydCk7CisJfQorCisJLyogRGlzYWJsZSBjaGlwIHNlbGVjdCAqLworCW91dGIoMCwgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fTlZSQU0pOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiB0cm1zMTA0MF9yZWFkX2FsbCAtIHJlYWQgYWxsIGJ5dGVzIGZyb20gdGhlIGVlcHJvbQorICoKKyAqIFJlYWQgdGhlIDEyOCBieXRlcyBmcm9tIHRoZSBTRUVQUk9NLgorICoKKyAqIEBlZXByb206CXdoZXJlIHRvIHN0b3JlIHRoZSBkYXRhCisgKiBAaW9fcG9ydDoJdGhlIGJhc2UgaW8gcG9ydAorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHRybXMxMDQwX3JlYWRfYWxsKHN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSwgdW5zaWduZWQgbG9uZyBpb19wb3J0KQoreworCXU4ICpiX2VlcHJvbSA9ICh1OCAqKWVlcHJvbTsKKwl1OCBhZGRyOworCisJLyogRW5hYmxlIFNFRVBST00gKi8KKwlvdXRiKChpbmIoaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCkgfCBFTl9FRVBST00pLAorCSAgICAgaW9fcG9ydCArIFRSTV9TMTA0MF9HRU5fQ09OVFJPTCk7CisKKwkvKiByZWFkIGRldGFpbHMgKi8KKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgMTI4OyBhZGRyKyssIGJfZWVwcm9tKyspCisJCSpiX2VlcHJvbSA9IHRybXMxMDQwX2dldF9kYXRhKGlvX3BvcnQsIGFkZHIpOworCisJLyogRGlzYWJsZSBTRUVQUk9NICovCisJb3V0YigoaW5iKGlvX3BvcnQgKyBUUk1fUzEwNDBfR0VOX0NPTlRST0wpICYgfkVOX0VFUFJPTSksCisJICAgICBpb19wb3J0ICsgVFJNX1MxMDQwX0dFTl9DT05UUk9MKTsKK30KKworCisKKy8qKgorICogY2hlY2tfZWVwcm9tIC0gZ2V0IGFuZCBjaGVjayBjb250ZW50cyBvZiB0aGUgZWVwcm9tCisgKgorICogUmVhZCBzZWVwcm9tIDEyOCBieXRlcyBpbnRvIHRoZSBtZW1vcnkgcHJvdmlkZXIgaW4gZWVwcm9tLgorICogQ2hlY2tzIHRoZSBjaGVja3N1bSBhbmQgaWYgaXQncyBub3QgY29ycmVjdCBpdCB1c2VzIGEgc2V0IG9mIGRlZmF1bHQKKyAqIHZhbHVlcy4KKyAqCisgKiBAZWVwcm9tOgljYWxsZXIgYWxsb2NhdGVkIHN0cmN1dHVyZSB0byByZWFkIHRoZSBlZXByb20gZGF0YSBpbnRvCisgKiBAaW9fcG9ydDoJaW8gcG9ydCB0byByZWFkIGZyb20KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjaGVja19lZXByb20oc3RydWN0IE52UmFtVHlwZSAqZWVwcm9tLCB1bnNpZ25lZCBsb25nIGlvX3BvcnQpCit7CisJdTE2ICp3X2VlcHJvbSA9ICh1MTYgKillZXByb207CisJdTE2IHdfYWRkcjsKKwl1MTYgY2tzdW07CisJdTMyIGRfYWRkcjsKKwl1MzIgKmRfZWVwcm9tOworCisJdHJtczEwNDBfcmVhZF9hbGwoZWVwcm9tLCBpb19wb3J0KTsJLyogcmVhZCBlZXByb20gKi8KKworCWNrc3VtID0gMDsKKwlmb3IgKHdfYWRkciA9IDAsIHdfZWVwcm9tID0gKHUxNiAqKWVlcHJvbTsgd19hZGRyIDwgNjQ7CisJICAgICB3X2FkZHIrKywgd19lZXByb20rKykKKwkJY2tzdW0gKz0gKndfZWVwcm9tOworCWlmIChja3N1bSAhPSAweDEyMzQpIHsKKwkJLyoKKwkJICogQ2hlY2tzdW0gaXMgd3JvbmcuCisJCSAqIExvYWQgYSBzZXQgb2YgZGVmYXVsdHMgaW50byB0aGUgZWVwcm9tIGJ1ZmZlcgorCQkgKi8KKwkJZHByaW50a2woS0VSTl9XQVJOSU5HLAorCQkJIkVFUHJvbSBjaGVja3N1bSBlcnJvcjogdXNpbmcgZGVmYXVsdCB2YWx1ZXMgYW5kIG9wdGlvbnMuXG4iKTsKKwkJZWVwcm9tLT5zdWJfdmVuZG9yX2lkWzBdID0gKHU4KVBDSV9WRU5ET1JfSURfVEVLUkFNOworCQllZXByb20tPnN1Yl92ZW5kb3JfaWRbMV0gPSAodTgpKFBDSV9WRU5ET1JfSURfVEVLUkFNID4+IDgpOworCQllZXByb20tPnN1Yl9zeXNfaWRbMF0gPSAodTgpUENJX0RFVklDRV9JRF9URUtSQU1fVFJNUzEwNDA7CisJCWVlcHJvbS0+c3ViX3N5c19pZFsxXSA9CisJCSAgICAodTgpKFBDSV9ERVZJQ0VfSURfVEVLUkFNX1RSTVMxMDQwID4+IDgpOworCQllZXByb20tPnN1Yl9jbGFzcyA9IDB4MDA7CisJCWVlcHJvbS0+dmVuZG9yX2lkWzBdID0gKHU4KVBDSV9WRU5ET1JfSURfVEVLUkFNOworCQllZXByb20tPnZlbmRvcl9pZFsxXSA9ICh1OCkoUENJX1ZFTkRPUl9JRF9URUtSQU0gPj4gOCk7CisJCWVlcHJvbS0+ZGV2aWNlX2lkWzBdID0gKHU4KVBDSV9ERVZJQ0VfSURfVEVLUkFNX1RSTVMxMDQwOworCQllZXByb20tPmRldmljZV9pZFsxXSA9CisJCSAgICAodTgpKFBDSV9ERVZJQ0VfSURfVEVLUkFNX1RSTVMxMDQwID4+IDgpOworCQllZXByb20tPnJlc2VydmVkID0gMHgwMDsKKworCQlmb3IgKGRfYWRkciA9IDAsIGRfZWVwcm9tID0gKHUzMiAqKWVlcHJvbS0+dGFyZ2V0OworCQkgICAgIGRfYWRkciA8IDE2OyBkX2FkZHIrKywgZF9lZXByb20rKykKKwkJCSpkX2VlcHJvbSA9IDB4MDAwMDAwNzc7CS8qIGNmZzMsY2ZnMixwZXJpb2QsY2ZnMCAqLworCisJCSpkX2VlcHJvbSsrID0gMHgwNDAwMEYwNzsJLyogbWF4X3RhZyxkZWxheV90aW1lLGNoYW5uZWxfY2ZnLHNjc2lfaWQgKi8KKwkJKmRfZWVwcm9tKysgPSAweDAwMDAwMDE1OwkvKiByZXNlcnZlZDEsYm9vdF9sdW4sYm9vdF90YXJnZXQscmVzZXJ2ZWQwICovCisJCWZvciAoZF9hZGRyID0gMDsgZF9hZGRyIDwgMTI7IGRfYWRkcisrLCBkX2VlcHJvbSsrKQorCQkJKmRfZWVwcm9tID0gMHgwMDsKKworCQkvKiBOb3cgbG9hZCBkZWZhdWx0cyAobWF5YmUgc2V0IGJ5IGJvb3QvbW9kdWxlIHBhcmFtcykgKi8KKwkJc2V0X3NhZmVfc2V0dGluZ3MoKTsKKwkJZml4X3NldHRpbmdzKCk7CisJCWVlcHJvbV9vdmVycmlkZShlZXByb20pOworCisJCWVlcHJvbS0+Y2tzdW0gPSAweDAwOworCQlmb3IgKHdfYWRkciA9IDAsIGNrc3VtID0gMCwgd19lZXByb20gPSAodTE2ICopZWVwcm9tOworCQkgICAgIHdfYWRkciA8IDYzOyB3X2FkZHIrKywgd19lZXByb20rKykKKwkJCWNrc3VtICs9ICp3X2VlcHJvbTsKKworCQkqd19lZXByb20gPSAweDEyMzQgLSBja3N1bTsKKwkJdHJtczEwNDBfd3JpdGVfYWxsKGVlcHJvbSwgaW9fcG9ydCk7CisJCWVlcHJvbS0+ZGVsYXlfdGltZSA9IGNmZ19kYXRhW0NGR19SRVNFVF9ERUxBWV0udmFsdWU7CisJfSBlbHNlIHsKKwkJc2V0X3NhZmVfc2V0dGluZ3MoKTsKKwkJZWVwcm9tX2luZGV4X3RvX2RlbGF5KGVlcHJvbSk7CisJCWVlcHJvbV9vdmVycmlkZShlZXByb20pOworCX0KK30KKworCisvKioKKyAqIHByaW50X2VlcHJvbV9zZXR0aW5ncyAtIG91dHB1dCB0aGUgZWVwcm9tIHNldHRpbmdzCisgKiB0byB0aGUga2VybmVsIGxvZyBzbyBwZW9wbGUgY2FuIHNlZSB3aGF0IHRoZXkgd2VyZS4KKyAqCisgKiBAZWVwcm9tOiBUaGUgZWVwcm9tIGRhdGEgc3RydWN1dHJlIHRvIHNob3cgZGV0YWlscyBmb3IuCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJpbnRfZWVwcm9tX3NldHRpbmdzKHN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSkKK3sKKwlkcHJpbnRrbChLRVJOX0lORk8sICJVc2VkIHNldHRpbmdzOiBBZGFwdGVySUQ9JTAyaSwgU3BlZWQ9JWkoJTAyaS4lMDFpTUh6KSwgZGV2X21vZGU9MHglMDJ4XG4iLAorCQllZXByb20tPnNjc2lfaWQsCisJCWVlcHJvbS0+dGFyZ2V0WzBdLnBlcmlvZCwKKwkJY2xvY2tfc3BlZWRbZWVwcm9tLT50YXJnZXRbMF0ucGVyaW9kXSAvIDEwLAorCQljbG9ja19zcGVlZFtlZXByb20tPnRhcmdldFswXS5wZXJpb2RdICUgMTAsCisJCWVlcHJvbS0+dGFyZ2V0WzBdLmNmZzApOworCWRwcmludGtsKEtFUk5fSU5GTywgIiAgICAgICAgICAgICAgIEFkYXB0TW9kZT0weCUwMngsIFRhZ3M9JWkoJTAyaSksIERlbGF5UmVzZXQ9JWlzXG4iLAorCQllZXByb20tPmNoYW5uZWxfY2ZnLCBlZXByb20tPm1heF90YWcsCisJCTEgPDwgZWVwcm9tLT5tYXhfdGFnLCBlZXByb20tPmRlbGF5X3RpbWUpOworfQorCisKKy8qIEZyZWUgU0cgdGFibGVzICovCitzdGF0aWMgdm9pZCBhZGFwdGVyX3NnX3RhYmxlc19mcmVlKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJaW50IGk7CisJY29uc3QgdW5zaWduZWQgc3Jic19wZXJfcGFnZSA9IFBBR0VfU0laRS9TRUdNRU5UWF9MRU47CisKKwlmb3IgKGkgPSAwOyBpIDwgREMzOTV4X01BWF9TUkJfQ05UOyBpICs9IHNyYnNfcGVyX3BhZ2UpCisJCWtmcmVlKGFjYi0+c3JiX2FycmF5W2ldLnNlZ21lbnRfeCk7CisKKwl2ZnJlZShhY2ItPnNyYl9hcnJheVswXS52aXJ0X21hcCk7Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIFNHIHRhYmxlczsgYXMgd2UgaGF2ZSB0byBwY2lfbWFwIHRoZW0sIGFuIFNHIGxpc3QgKHN0cnVjdCBTR2VudHJ5KikKKyAqIHNob3VsZCBuZXZlciBjcm9zcyBhIHBhZ2UgYm91bmRhcnkgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkYXB0ZXJfc2dfdGFibGVzX2FsbG9jKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJY29uc3QgdW5zaWduZWQgbWVtX25lZWRlZCA9IChEQzM5NXhfTUFYX1NSQl9DTlQrMSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNFR01FTlRYX0xFTjsKKwlpbnQgcGFnZXMgPSAobWVtX25lZWRlZCsoUEFHRV9TSVpFLTEpKS9QQUdFX1NJWkU7CisJY29uc3QgdW5zaWduZWQgc3Jic19wZXJfcGFnZSA9IFBBR0VfU0laRS9TRUdNRU5UWF9MRU47CisJaW50IHNyYl9pZHggPSAwOworCXVuc2lnbmVkIGkgPSAwOworCXN0cnVjdCBTR2VudHJ5ICpwdHI7CisJdm9pZCAqKnZpcnRfYXJyYXk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREMzOTV4X01BWF9TUkJfQ05UOyBpKyspIHsKKwkJYWNiLT5zcmJfYXJyYXlbaV0uc2VnbWVudF94ID0gTlVMTDsKKwkJYWNiLT5zcmJfYXJyYXlbaV0udmlydF9tYXAgPSBOVUxMOworCX0KKworCWRwcmludGtkYmcoREJHXzEsICJBbGxvY2F0ZSAlaSBwYWdlcyBmb3IgU0cgdGFibGVzXG4iLCBwYWdlcyk7CisJd2hpbGUgKHBhZ2VzLS0pIHsKKwkJcHRyID0gKHN0cnVjdCBTR2VudHJ5ICopa21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIXB0cikgeworCQkJYWRhcHRlcl9zZ190YWJsZXNfZnJlZShhY2IpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZHByaW50a2RiZyhEQkdfMSwgIkFsbG9jYXRlICVsaSBieXRlcyBhdCAlcCBmb3IgU0cgc2VnbWVudHMgJWlcbiIsCisJCQlQQUdFX1NJWkUsIHB0ciwgc3JiX2lkeCk7CisJCWkgPSAwOworCQl3aGlsZSAoaSA8IHNyYnNfcGVyX3BhZ2UgJiYgc3JiX2lkeCA8IERDMzk1eF9NQVhfU1JCX0NOVCkKKwkJCWFjYi0+c3JiX2FycmF5W3NyYl9pZHgrK10uc2VnbWVudF94ID0KKwkJCSAgICBwdHIgKyAoaSsrICogREMzOTV4X01BWF9TR19MSVNURU5UUlkpOworCX0KKwlpZiAoaSA8IHNyYnNfcGVyX3BhZ2UpCisJCWFjYi0+c3JiLnNlZ21lbnRfeCA9CisJCSAgICBwdHIgKyAoaSAqIERDMzk1eF9NQVhfU0dfTElTVEVOVFJZKTsKKwllbHNlCisJCWRwcmludGtsKEtFUk5fREVCVUcsICJObyBzcGFjZSBmb3IgdG1zcmIgU0cgdGFibGUgcmVzZXJ2ZWQ/IVxuIik7CisKKwl2aXJ0X2FycmF5ID0gdm1hbGxvYygoREMzOTV4X01BWF9TUkJfQ05UICsgMSkgKiBEQzM5NXhfTUFYX1NHX0xJU1RFTlRSWSAqIHNpemVvZih2b2lkKikpOworCisJaWYgKCF2aXJ0X2FycmF5KSB7CisJCWFkYXB0ZXJfc2dfdGFibGVzX2ZyZWUoYWNiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERDMzk1eF9NQVhfU1JCX0NOVCArIDE7IGkrKykgeworCQlhY2ItPnNyYl9hcnJheVtpXS52aXJ0X21hcCA9IHZpcnRfYXJyYXk7CisJCXZpcnRfYXJyYXkgKz0gREMzOTV4X01BWF9TR19MSVNURU5UUlk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKioKKyAqIGFkYXB0ZXJfcHJpbnRfY29uZmlnIC0gcHJpbnQgYWRhcHRlciBjb25uZWN0aW9uIGFuZCB0ZXJtaW5hdGlvbgorICogY29uZmlnCisgKgorICogVGhlIGlvIHBvcnQgaW4gdGhlIGFkYXB0ZXIgbmVlZHMgdG8gaGF2ZSBiZWVuIHNldCBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAYWNiOiBUaGUgYWRhcHRlciB0byBwcmludCB0aGUgaW5mb3JtYXRpb24gZm9yLgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGFkYXB0ZXJfcHJpbnRfY29uZmlnKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJdTggYnZhbDsKKworCWJ2YWwgPSBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfR0VOX1NUQVRVUyk7CisJZHByaW50a2woS0VSTl9JTkZPLCAiJXNDb25uZWN0b3JzOiAiLAorCQkoKGJ2YWwgJiBXSURFU0NTSSkgPyAiKFdpZGUpICIgOiAiIikpOworCWlmICghKGJ2YWwgJiBDT041MDY4KSkKKwkJcHJpbnRrKCJleHQlcyAiLCAhKGJ2YWwgJiBFWFQ2OEhJR0gpID8gIjY4IiA6ICI1MCIpOworCWlmICghKGJ2YWwgJiBDT042OCkpCisJCXByaW50aygiaW50NjglcyAiLCAhKGJ2YWwgJiBJTlQ2OEhJR0gpID8gIiIgOiAiKDUwKSIpOworCWlmICghKGJ2YWwgJiBDT041MCkpCisJCXByaW50aygiaW50NTAgIik7CisJaWYgKChidmFsICYgKENPTjUwNjggfCBDT041MCB8IENPTjY4KSkgPT0KKwkgICAgMCAvKihDT041MDY4IHwgQ09ONTAgfCBDT042OCkgKi8gKQorCQlwcmludGsoIiBPb3BzISAoQWxsIDM/KSAiKTsKKwlidmFsID0gREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX0dFTl9DT05UUk9MKTsKKwlwcmludGsoIiBUZXJtaW5hdGlvbjogIik7CisJaWYgKGJ2YWwgJiBESVNfVEVSTSkKKwkJcHJpbnRrKCJEaXNhYmxlZFxuIik7CisJZWxzZSB7CisJCWlmIChidmFsICYgQVVUT1RFUk0pCisJCQlwcmludGsoIkF1dG8gIik7CisJCWlmIChidmFsICYgTE9XOFRFUk0pCisJCQlwcmludGsoIkxvdyAiKTsKKwkJaWYgKGJ2YWwgJiBVUDhURVJNKQorCQkJcHJpbnRrKCJIaWdoICIpOworCQlwcmludGsoIlxuIik7CisJfQorfQorCisKKy8qKgorICogYWRhcHRlcl9pbml0X3BhcmFtcyAtIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgcGFyYW1ldGVycyBpbiB0aGUKKyAqIGFkYXB0ZXIgc3RydWN0dXJlLiBOb3RlIHRoYXQgdGhlIHBvaW50ZXIgdG8gdGhlIHNjc2lfaG9zdCBpcyBzZXQKKyAqIGVhcmx5ICh3aGVuIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCkgYW5kIHRoZSBpb19wb3J0IGFuZCBpcnEKKyAqIHZhbHVlcyBhcmUgc2V0IGxhdGVyIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIHJlc2VydmVkLiBUaGlzIGp1c3QgZ2V0cworICogZXZlcnl0aGluZyBzZXQgdG8gYSBnb29kIHN0YXJ0aW5nIHBvc2l0aW9uLgorICoKKyAqIFRoZSBlZXByb20gc3RydWN0dXJlIGluIHRoZSBhZGFwdGVyIG5lZWRzIHRvIGhhdmUgYmVlbiBzZXQgYmVmb3JlCisgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgdG8gaW5pdGlhbGl6ZS4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhZGFwdGVyX2luaXRfcGFyYW1zKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJc3RydWN0IE52UmFtVHlwZSAqZWVwcm9tID0gJmFjYi0+ZWVwcm9tOworCWludCBpOworCisJLyogTk9URTogYWNiLT5zY3NpX2hvc3QgaXMgc2V0IGF0IHNjc2lfaG9zdC9hY2IgY3JlYXRpb24gdGltZSAqLworCS8qIE5PVEU6IGFjYi0+aW9fcG9ydF9iYXNlIGlzIHNldCBhdCBwb3J0IHJlZ2lzdHJhdGlvbiB0aW1lICovCisJLyogTk9URTogYWNiLT5pb19wb3J0X2xlbiBpcyBzZXQgYXQgcG9ydCByZWdpc3RyYXRpb24gdGltZSAqLworCisJSU5JVF9MSVNUX0hFQUQoJmFjYi0+ZGNiX2xpc3QpOworCWFjYi0+ZGNiX3J1bl9yb2JpbiA9IE5VTEw7CisJYWNiLT5hY3RpdmVfZGNiID0gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZhY2ItPnNyYl9mcmVlX2xpc3QpOworCS8qICB0ZW1wIFNSQiBmb3IgUSB0YWcgdXNlZCBvciBhYm9ydCBjb21tYW5kIHVzZWQgICovCisJYWNiLT50bXBfc3JiID0gJmFjYi0+c3JiOworCWluaXRfdGltZXIoJmFjYi0+d2FpdGluZ190aW1lcik7CisJaW5pdF90aW1lcigmYWNiLT5zZWx0b190aW1lcik7CisKKwlhY2ItPnNyYl9jb3VudCA9IERDMzk1eF9NQVhfU1JCX0NOVDsKKworCWFjYi0+c2VsX3RpbWVvdXQgPSBEQzM5NXhfU0VMX1RJTUVPVVQ7CS8qIHRpbWVvdXQ9MjUwbXMgKi8KKwkvKiBOT1RFOiBhY2ItPmlycV9sZXZlbCBpcyBzZXQgYXQgSVJRIHJlZ2lzdHJhdGlvbiB0aW1lICovCisKKwlhY2ItPnRhZ19tYXhfbnVtID0gMSA8PCBlZXByb20tPm1heF90YWc7CisJaWYgKGFjYi0+dGFnX21heF9udW0gPiAzMCkKKwkJYWNiLT50YWdfbWF4X251bSA9IDMwOworCisJYWNiLT5hY2JfZmxhZyA9IDA7CS8qIFJFU0VUX0RFVEVDVCwgUkVTRVRfRE9ORSwgUkVTRVRfREVWICovCisJYWNiLT5nbW9kZTIgPSBlZXByb20tPmNoYW5uZWxfY2ZnOworCWFjYi0+Y29uZmlnID0gMDsJLyogTk9URTogYWN0dWFsbHkgc2V0IGluIGFkYXB0ZXJfaW5pdF9jaGlwICovCisKKwlpZiAoZWVwcm9tLT5jaGFubmVsX2NmZyAmIE5BQ19TQ0FOTFVOKQorCQlhY2ItPmx1bl9jaGsgPSAxOworCWFjYi0+c2Nhbl9kZXZpY2VzID0gMTsKKworCWFjYi0+c2NzaV9ob3N0LT50aGlzX2lkID0gZWVwcm9tLT5zY3NpX2lkOworCWFjYi0+aG9zdGlkX2JpdCA9ICgxIDw8IGFjYi0+c2NzaV9ob3N0LT50aGlzX2lkKTsKKworCWZvciAoaSA9IDA7IGkgPCBEQzM5NXhfTUFYX1NDU0lfSUQ7IGkrKykKKwkJYWNiLT5kY2JfbWFwW2ldID0gMDsKKworCWFjYi0+bXNnX2xlbiA9IDA7CisJCisJLyogbGluayBzdGF0aWMgYXJyYXkgb2Ygc3JicyBpbnRvIHRoZSBzcmIgZnJlZSBsaXN0ICovCisJZm9yIChpID0gMDsgaSA8IGFjYi0+c3JiX2NvdW50IC0gMTsgaSsrKQorCQlzcmJfZnJlZV9pbnNlcnQoYWNiLCAmYWNiLT5zcmJfYXJyYXlbaV0pOworfQorCisKKy8qKgorICogYWRhcHRlcl9pbml0X2hvc3QgLSBJbml0aWFsaXplIHRoZSBzY3NpIGhvc3QgaW5zdGFuY2UgYmFzZWQgb24KKyAqIHZhbHVlcyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBzdG9yZWQgaW4gdGhlIGFkYXB0ZXIgaW5zdGFuY2UuIFRoZXJlJ3MKKyAqIHNvbWUgbWVudGlvbiB0aGF0IGEgbG90IG9mIHRoZXNlIGFyZSBkZXByZWNhdGVkLCBzbyB3ZSB3b24ndCB1c2UKKyAqIHRoZW0gKHdlJ2xsIHVzZSB0aGUgb25lcyBpbiB0aGUgYWRhcHRlciBpbnN0YW5jZSkgYnV0IHdlJ2xsIGZpbGwKKyAqIHRoZW0gaW4gaW4gY2FzZSBzb21ldGhpbmcgZWxzZSBuZWVkcyB0aGVtLgorICoKKyAqIFRoZSBlZXByb20gc3RydWN0dXJlLCBpcnEgYW5kIGlvIHBvcnRzIGluIHRoZSBhZGFwdGVyIG5lZWQgdG8gaGF2ZQorICogYmVlbiBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBAaG9zdDogVGhlIHNjc2kgaG9zdCBpbnN0YW5jZSB0byBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yLgorICoqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGFkYXB0ZXJfaW5pdF9zY3NpX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKyAgICAgICAgc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKWhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBOdlJhbVR5cGUgKmVlcHJvbSA9ICZhY2ItPmVlcHJvbTsKKyAgICAgICAgCisJaG9zdC0+bWF4X2NtZF9sZW4gPSAyNDsKKwlob3N0LT5jYW5fcXVldWUgPSBEQzM5NXhfTUFYX0NNRF9RVUVVRTsKKwlob3N0LT5jbWRfcGVyX2x1biA9IERDMzk1eF9NQVhfQ01EX1BFUl9MVU47CisJaG9zdC0+dGhpc19pZCA9IChpbnQpZWVwcm9tLT5zY3NpX2lkOworCWhvc3QtPmlvX3BvcnQgPSBhY2ItPmlvX3BvcnRfYmFzZTsKKwlob3N0LT5uX2lvX3BvcnQgPSBhY2ItPmlvX3BvcnRfbGVuOworCWhvc3QtPmRtYV9jaGFubmVsID0gLTE7CisJaG9zdC0+dW5pcXVlX2lkID0gYWNiLT5pb19wb3J0X2Jhc2U7CisJaG9zdC0+aXJxID0gYWNiLT5pcnFfbGV2ZWw7CisJaG9zdC0+bGFzdF9yZXNldCA9IGppZmZpZXM7CisKKwlob3N0LT5tYXhfaWQgPSAxNjsKKwlpZiAoaG9zdC0+bWF4X2lkIC0gMSA9PSBlZXByb20tPnNjc2lfaWQpCisJCWhvc3QtPm1heF9pZC0tOworCisjaWZkZWYgQ09ORklHX1NDU0lfTVVMVElfTFVOCisJaWYgKGVlcHJvbS0+Y2hhbm5lbF9jZmcgJiBOQUNfU0NBTkxVTikKKwkJaG9zdC0+bWF4X2x1biA9IDg7CisJZWxzZQorCQlob3N0LT5tYXhfbHVuID0gMTsKKyNlbHNlCisJaG9zdC0+bWF4X2x1biA9IDE7CisjZW5kaWYKKworfQorCisKKy8qKgorICogYWRhcHRlcl9pbml0X2NoaXAgLSBHZXQgdGhlIGNoaXAgaW50byBhIGtub3cgc3RhdGUgYW5kIGZpZ3VyZSBvdXQKKyAqIHNvbWUgb2YgdGhlIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhpcyBhZGFwdGVyLgorICoKKyAqIFRoZSBpbyBwb3J0IGluIHRoZSBhZGFwdGVyIG5lZWRzIHRvIGhhdmUgYmVlbiBzZXQgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uIFRoZSBjb25maWcgd2lsbCBiZSBjb25maWd1cmVkIGNvcnJlY3RseSBvbiByZXR1cm4uCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgd2hpY2ggd2UgYXJlIHRvIGluaXQuCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYWRhcHRlcl9pbml0X2NoaXAoc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYikKK3sKKyAgICAgICAgc3RydWN0IE52UmFtVHlwZSAqZWVwcm9tID0gJmFjYi0+ZWVwcm9tOworICAgICAgICAKKyAgICAgICAgLyogTWFzayBhbGwgdGhlIGludGVycnVwdCAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0lOVEVOLCAweDAwKTsKKwlEQzM5NXhfd3JpdGU4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5URU4sIDB4MDApOworCisJLyogUmVzZXQgU0NTSSBtb2R1bGUgKi8KKwlEQzM5NXhfd3JpdGUxNihhY2IsIFRSTV9TMTA0MF9TQ1NJX0NPTlRST0wsIERPX1JTVE1PRFVMRSk7CisKKwkvKiBSZXNldCBQQ0kvRE1BIG1vZHVsZSAqLworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfRE1BX0NPTlRST0wsIERNQVJFU0VUTU9EVUxFKTsKKwl1ZGVsYXkoMjApOworCisJLyogcHJvZ3JhbSBjb25maWd1cmF0aW9uIDAgKi8KKwlhY2ItPmNvbmZpZyA9IEhDQ19BVVRPVEVSTSB8IEhDQ19QQVJJVFk7CisJaWYgKERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9HRU5fU1RBVFVTKSAmIFdJREVTQ1NJKQorCQlhY2ItPmNvbmZpZyB8PSBIQ0NfV0lERV9DQVJEOworCisJaWYgKGVlcHJvbS0+Y2hhbm5lbF9jZmcgJiBOQUNfUE9XRVJPTl9TQ1NJX1JFU0VUKQorCQlhY2ItPmNvbmZpZyB8PSBIQ0NfU0NTSV9SRVNFVDsKKworCWlmIChhY2ItPmNvbmZpZyAmIEhDQ19TQ1NJX1JFU0VUKSB7CisJCWRwcmludGtsKEtFUk5fSU5GTywgIlBlcmZvcm1pbmcgaW5pdGlhbCBTQ1NJIGJ1cyByZXNldFxuIik7CisJCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9DT05UUk9MLCBET19SU1RTQ1NJKTsKKworCQkvKndoaWxlICghKCBEQzM5NXhfcmVhZDgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRTVEFUVVMpICYgSU5UX1NDU0lSRVNFVCApKTsgKi8KKwkJLypzcGluX3VubG9ja19pcnEgKCZpb19yZXF1ZXN0X2xvY2spOyAqLworCQl1ZGVsYXkoNTAwKTsKKworCQlhY2ItPnNjc2lfaG9zdC0+bGFzdF9yZXNldCA9CisJCSAgICBqaWZmaWVzICsgSFogLyAyICsKKwkJICAgIEhaICogYWNiLT5lZXByb20uZGVsYXlfdGltZTsKKworCQkvKnNwaW5fbG9ja19pcnEgKCZpb19yZXF1ZXN0X2xvY2spOyAqLworCX0KK30KKworCisvKioKKyAqIGluaXRfYWRhcHRlciAtIEdyYWIgdGhlIHJlc291cmNlIGZvciB0aGUgY2FyZCwgc2V0dXAgdGhlIGFkYXB0ZXIKKyAqIGluZm9ybWF0aW9uLCBzZXQgdGhlIGNhcmQgaW50byBhIGtub3duIHN0YXRlLCBjcmVhdGUgdGhlIHZhcmlvdXMKKyAqIHRhYmxlcyBldGMgZXRjLiBUaGlzIGJhc2ljYWxseSBnZXRzIGFsbCBhZGFwdGVyIGluZm9ybWF0aW9uIGFsbCB1cAorICogdG8gZGF0ZSwgaW50aWFsaXNlZCBhbmQgZ2V0cyB0aGUgY2hpcCBpbiBzeW5jIHdpdGggaXQuCisgKgorICogQGhvc3Q6CVRoaXMgaG9zdHMgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBpb19wb3J0OglUaGUgYmFzZSBJL08gcG9ydAorICogQGlycToJSVJRCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkcywgYW55IG90aGVyIHZhbHVlIG9uCisgKiBmYWlsdXJlLgorICoqLworc3RhdGljIGludCBfX2RldmluaXQgYWRhcHRlcl9pbml0KHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IsCisJdW5zaWduZWQgbG9uZyBpb19wb3J0LCB1MzIgaW9fcG9ydF9sZW4sIHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCBpb19wb3J0X2xlbiwgREMzOTVYX05BTUUpKSB7CisJCWRwcmludGtsKEtFUk5fRVJSLCAiRmFpbGVkIHRvIHJlc2VydmUgSU8gcmVnaW9uIDB4JWx4XG4iLCBpb19wb3J0KTsKKwkJZ290byBmYWlsZWQ7CisJfQorCS8qIHN0b3JlIHBvcnQgYmFzZSB0byBpbmRpY2F0ZSB3ZSBoYXZlIHJlZ2lzdGVyZWQgaXQgKi8KKwlhY2ItPmlvX3BvcnRfYmFzZSA9IGlvX3BvcnQ7CisJYWNiLT5pb19wb3J0X2xlbiA9IGlvX3BvcnRfbGVuOworCQorCWlmIChyZXF1ZXN0X2lycShpcnEsIGRjMzk1eF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBEQzM5NVhfTkFNRSwgYWNiKSkgeworCSAgICAJLyogcmVsZWFzZSB0aGUgcmVnaW9uIHdlIGp1c3QgY2xhaW1lZCAqLworCQlkcHJpbnRrbChLRVJOX0lORk8sICJGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCS8qIHN0b3JlIGlycSB0byBpbmRpY2F0ZSB3ZSBoYXZlIHJlZ2lzdGVyZWQgaXQgKi8KKwlhY2ItPmlycV9sZXZlbCA9IGlycTsKKworCS8qIGdldCBlZXByb20gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgY29tbWFuZCBsaW5lIHNldHRpbmdzIGV0YyAqLworCWNoZWNrX2VlcHJvbSgmYWNiLT5lZXByb20sIGlvX3BvcnQpOworIAlwcmludF9lZXByb21fc2V0dGluZ3MoJmFjYi0+ZWVwcm9tKTsKKworCS8qIHNldHVwIGFkYXB0ZXIgY29udHJvbCBibG9jayAqLwkKKwlhZGFwdGVyX2luaXRfcGFyYW1zKGFjYik7CisJCisJLyogZGlzcGxheSBjYXJkIGNvbm5lY3RvcnMvdGVybWluYXRpb24gc2V0dGluZ3MgKi8KKyAJYWRhcHRlcl9wcmludF9jb25maWcoYWNiKTsKKworCWlmIChhZGFwdGVyX3NnX3RhYmxlc19hbGxvYyhhY2IpKSB7CisJCWRwcmludGtsKEtFUk5fREVCVUcsICJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgU0cgdGFibGVzIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlhZGFwdGVyX2luaXRfc2NzaV9ob3N0KGFjYi0+c2NzaV9ob3N0KTsKKwlhZGFwdGVyX2luaXRfY2hpcChhY2IpOworCXNldF9iYXNpY19jb25maWcoYWNiKTsKKworCWRwcmludGtkYmcoREJHXzAsCisJCSJhZGFwdGVyX2luaXQ6IGFjYj0lcCwgcGRjYl9tYXA9JXAgcHNyYl9hcnJheT0lcCAiCisJCSJzaXple2FjYj0weCUwNHggZGNiPTB4JTA0eCBzcmI9MHglMDR4fVxuIiwKKwkJYWNiLCBhY2ItPmRjYl9tYXAsIGFjYi0+c3JiX2FycmF5LCBzaXplb2Yoc3RydWN0IEFkYXB0ZXJDdGxCbGspLAorCQlzaXplb2Yoc3RydWN0IERldmljZUN0bEJsayksIHNpemVvZihzdHJ1Y3QgU2NzaVJlcUJsaykpOworCXJldHVybiAwOworCitmYWlsZWQ6CisJaWYgKGFjYi0+aXJxX2xldmVsKQorCQlmcmVlX2lycShhY2ItPmlycV9sZXZlbCwgYWNiKTsKKwlpZiAoYWNiLT5pb19wb3J0X2Jhc2UpCisJCXJlbGVhc2VfcmVnaW9uKGFjYi0+aW9fcG9ydF9iYXNlLCBhY2ItPmlvX3BvcnRfbGVuKTsKKwlhZGFwdGVyX3NnX3RhYmxlc19mcmVlKGFjYik7CisKKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqIGFkYXB0ZXJfdW5pbml0X2NoaXAgLSBjbGVhbmx5IHNodXQgZG93biB0aGUgc2NzaSBjb250cm9sbGVyIGNoaXAsCisgKiBzdG9wcGluZyBhbGwgb3BlcmF0aW9ucyBhbmQgZGlzYWJsaW5nIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHRoZQorICogY2FyZC4KKyAqCisgKiBAYWNiOiBUaGUgYWRhcHRlciB3aGljaCB3ZSBhcmUgdG8gc2h1dGRvd24uCisgKiovCitzdGF0aWMgdm9pZCBhZGFwdGVyX3VuaW5pdF9jaGlwKHN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IpCit7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJREMzOTV4X3dyaXRlOChhY2IsIFRSTV9TMTA0MF9ETUFfSU5URU4sIDApOworCURDMzk1eF93cml0ZTgoYWNiLCBUUk1fUzEwNDBfU0NTSV9JTlRFTiwgMCk7CisKKwkvKiByZXNldCB0aGUgc2NzaSBidXMgKi8KKwlpZiAoYWNiLT5jb25maWcgJiBIQ0NfU0NTSV9SRVNFVCkKKwkJcmVzZXRfc2NzaV9idXMoYWNiKTsKKworCS8qIGNsZWFyIGFueSBwZW5kaW5nIGludGVydXB0IHN0YXRlICovCisJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfSU5UU1RBVFVTKTsKK30KKworCisKKy8qKgorICogYWRhcHRlcl91bmluaXQgLSBTaHV0IGRvd24gdGhlIGNoaXAgYW5kIHJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0CisgKiB3ZSBoYWQgYWxsb2NhdGVkLiBPbmNlIHRoaXMgcmV0dXJucyB0aGUgYWRhcHRlciBzaG91bGQgbm90IGJlIHVzZWQKKyAqIGFueW1vcmUuCisgKgorICogQGFjYjogVGhlIGFkYXB0ZXIgd2hpY2ggd2UgYXJlIHRvIHVuLWluaXRpYWxpemUuCisgKiovCitzdGF0aWMgdm9pZCBhZGFwdGVyX3VuaW5pdChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREMzOTV4X0xPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKKworCS8qIHJlbW92ZSB0aW1lcnMgKi8KKwlpZiAodGltZXJfcGVuZGluZygmYWNiLT53YWl0aW5nX3RpbWVyKSkKKwkJZGVsX3RpbWVyKCZhY2ItPndhaXRpbmdfdGltZXIpOworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPnNlbHRvX3RpbWVyKSkKKwkJZGVsX3RpbWVyKCZhY2ItPnNlbHRvX3RpbWVyKTsKKworCWFkYXB0ZXJfdW5pbml0X2NoaXAoYWNiKTsKKwlhZGFwdGVyX3JlbW92ZV9hbmRfZnJlZV9hbGxfZGV2aWNlcyhhY2IpOworCURDMzk1eF9VTkxPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKKworCWlmIChhY2ItPmlycV9sZXZlbCkKKwkJZnJlZV9pcnEoYWNiLT5pcnFfbGV2ZWwsIGFjYik7CisJaWYgKGFjYi0+aW9fcG9ydF9iYXNlKQorCQlyZWxlYXNlX3JlZ2lvbihhY2ItPmlvX3BvcnRfYmFzZSwgYWNiLT5pb19wb3J0X2xlbik7CisKKwlhZGFwdGVyX3NnX3RhYmxlc19mcmVlKGFjYik7Cit9CisKKworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSBwb3MgKz0gc3ByaW50Zihwb3MsIGFyZ3MpCisKKyN1bmRlZiBZRVNOTworI2RlZmluZSBZRVNOTyhZTikgXAorIGlmIChZTikgU1BSSU5URigiIFllcyAiKTtcCisgZWxzZSBTUFJJTlRGKCIgTm8gICIpCisKK3N0YXRpYyBpbnQgZGMzOTV4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsCisJCWNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKWhvc3QtPmhvc3RkYXRhOworCWludCBzcGQsIHNwZDE7CisJY2hhciAqcG9zID0gYnVmZmVyOworCXN0cnVjdCBEZXZpY2VDdGxCbGsgKmRjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkZXY7CisKKwlpZiAoaW5vdXQpCQkvKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGUgPyAqLworCQlyZXR1cm4gLUVQRVJNOworCisJU1BSSU5URihEQzM5NVhfQkFOTkVSICIgUENJIFNDU0kgSG9zdCBBZGFwdGVyXG4iKTsKKwlTUFJJTlRGKCIgRHJpdmVyIFZlcnNpb24gIiBEQzM5NVhfVkVSU0lPTiAiXG4iKTsKKworCURDMzk1eF9MT0NLX0lPKGFjYi0+c2NzaV9ob3N0LCBmbGFncyk7CisKKwlTUFJJTlRGKCJTQ1NJIEhvc3QgTnIgJWksICIsIGhvc3QtPmhvc3Rfbm8pOworCVNQUklOVEYoIkRDMzk1VS9VVy9GIERDMzE1L1UgJXNcbiIsCisJCShhY2ItPmNvbmZpZyAmIEhDQ19XSURFX0NBUkQpID8gIldpZGUiIDogIiIpOworCVNQUklOVEYoImlvX3BvcnRfYmFzZSAweCUwNGx4LCAiLCBhY2ItPmlvX3BvcnRfYmFzZSk7CisJU1BSSU5URigiaXJxX2xldmVsIDB4JTA0eCwgIiwgYWNiLT5pcnFfbGV2ZWwpOworCVNQUklOVEYoIiBTZWxUaW1lb3V0ICVpbXNcbiIsICgxNjM4ICogYWNiLT5zZWxfdGltZW91dCkgLyAxMDAwKTsKKworCVNQUklOVEYoIk1heElEICVpLCBNYXhMVU4gJWksICIsIGhvc3QtPm1heF9pZCwgaG9zdC0+bWF4X2x1bik7CisJU1BSSU5URigiQWRhcHRlcklEICVpXG4iLCBob3N0LT50aGlzX2lkKTsKKworCVNQUklOVEYoInRhZ19tYXhfbnVtICVpIiwgYWNiLT50YWdfbWF4X251bSk7CisJLypTUFJJTlRGKCIsIERNQV9TdGF0dXMgJWlcbiIsIERDMzk1eF9yZWFkOChhY2IsIFRSTV9TMTA0MF9ETUFfU1RBVFVTKSk7ICovCisJU1BSSU5URigiLCBGaWx0ZXJDZmcgMHglMDJ4IiwKKwkJREMzOTV4X3JlYWQ4KGFjYiwgVFJNX1MxMDQwX1NDU0lfQ09ORklHMSkpOworCVNQUklOVEYoIiwgRGVsYXlSZXNldCAlaXNcbiIsIGFjYi0+ZWVwcm9tLmRlbGF5X3RpbWUpOworCS8qU1BSSU5URigiXG4iKTsgKi8KKworCVNQUklOVEYoIk5yIG9mIERDQnM6ICVpXG4iLCBsaXN0X3NpemUoJmFjYi0+ZGNiX2xpc3QpKTsKKwlTUFJJTlRGCisJICAgICgiTWFwIG9mIGF0dGFjaGVkIExVTnM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkgICAgIGFjYi0+ZGNiX21hcFswXSwgYWNiLT5kY2JfbWFwWzFdLCBhY2ItPmRjYl9tYXBbMl0sCisJICAgICBhY2ItPmRjYl9tYXBbM10sIGFjYi0+ZGNiX21hcFs0XSwgYWNiLT5kY2JfbWFwWzVdLAorCSAgICAgYWNiLT5kY2JfbWFwWzZdLCBhY2ItPmRjYl9tYXBbN10pOworCVNQUklOVEYKKwkgICAgKCIgICAgICAgICAgICAgICAgICAgICAgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCSAgICAgYWNiLT5kY2JfbWFwWzhdLCBhY2ItPmRjYl9tYXBbOV0sIGFjYi0+ZGNiX21hcFsxMF0sCisJICAgICBhY2ItPmRjYl9tYXBbMTFdLCBhY2ItPmRjYl9tYXBbMTJdLCBhY2ItPmRjYl9tYXBbMTNdLAorCSAgICAgYWNiLT5kY2JfbWFwWzE0XSwgYWNiLT5kY2JfbWFwWzE1XSk7CisKKwlTUFJJTlRGCisJICAgICgiVW4gSUQgTFVOIFBydHkgU3luYyBXaWRlIERzQ24gU25kUyBUYWdRIG5lZ29fcGVyaW9kIFN5bmNGcmVxIFN5bmNPZmZzIE1heENtZFxuIik7CisKKwlkZXYgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGNiLCAmYWNiLT5kY2JfbGlzdCwgbGlzdCkgeworCQlpbnQgbmVnb19wZXJpb2Q7CisJCVNQUklOVEYoIiUwMmkgJTAyaSAgJTAyaSAiLCBkZXYsIGRjYi0+dGFyZ2V0X2lkLAorCQkJZGNiLT50YXJnZXRfbHVuKTsKKwkJWUVTTk8oZGNiLT5kZXZfbW9kZSAmIE5UQ19ET19QQVJJVFlfQ0hLKTsKKwkJWUVTTk8oZGNiLT5zeW5jX29mZnNldCk7CisJCVlFU05PKGRjYi0+c3luY19wZXJpb2QgJiBXSURFX1NZTkMpOworCQlZRVNOTyhkY2ItPmRldl9tb2RlICYgTlRDX0RPX0RJU0NPTk5FQ1QpOworCQlZRVNOTyhkY2ItPmRldl9tb2RlICYgTlRDX0RPX1NFTkRfU1RBUlQpOworCQlZRVNOTyhkY2ItPnN5bmNfbW9kZSAmIEVOX1RBR19RVUVVRUlORyk7CisJCW5lZ29fcGVyaW9kID0gY2xvY2tfcGVyaW9kW2RjYi0+c3luY19wZXJpb2QgJiAweDA3XSA8PCAyOworCQlpZiAoZGNiLT5zeW5jX29mZnNldCkKKwkJCVNQUklOVEYoIiAgJTAzaSBucyAiLCBuZWdvX3BlcmlvZCk7CisJCWVsc2UKKwkJCVNQUklOVEYoIiAoJTAzaSBucykiLCAoZGNiLT5taW5fbmVnb19wZXJpb2QgPDwgMikpOworCisJCWlmIChkY2ItPnN5bmNfb2Zmc2V0ICYgMHgwZikgeworCQkJc3BkID0gMTAwMCAvIChuZWdvX3BlcmlvZCk7CisJCQlzcGQxID0gMTAwMCAlIChuZWdvX3BlcmlvZCk7CisJCQlzcGQxID0gKHNwZDEgKiAxMCArIG5lZ29fcGVyaW9kIC8gMikgLyAobmVnb19wZXJpb2QpOworCQkJU1BSSU5URigiICAgJTJpLiUxaSBNICAgICAlMDJpICIsIHNwZCwgc3BkMSwKKwkJCQkoZGNiLT5zeW5jX29mZnNldCAmIDB4MGYpKTsKKwkJfSBlbHNlCisJCQlTUFJJTlRGKCIgICAgICAgICAgICAgICAgICIpOworCisJCS8qIEFkZCBtb3JlIGluZm8gLi4uICovCisJCVNQUklOVEYoIiAgICAgJTAyaVxuIiwgZGNiLT5tYXhfY29tbWFuZCk7CisJCWRldisrOworCX0KKworCWlmICh0aW1lcl9wZW5kaW5nKCZhY2ItPndhaXRpbmdfdGltZXIpKQorCQlTUFJJTlRGKCJXYWl0aW5nIHF1ZXVlIHRpbWVyIHJ1bm5pbmdcbiIpOworCWVsc2UKKwkJU1BSSU5URigiXG4iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGNiLCAmYWNiLT5kY2JfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgU2NzaVJlcUJsayAqc3JiOworCQlpZiAoIWxpc3RfZW1wdHkoJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCkpCisJCQlTUFJJTlRGKCJEQ0IgKCUwMmktJWkpOiBXYWl0aW5nOiAlaToiLAorCQkJCWRjYi0+dGFyZ2V0X2lkLCBkY2ItPnRhcmdldF9sdW4sCisJCQkJbGlzdF9zaXplKCZkY2ItPnNyYl93YWl0aW5nX2xpc3QpKTsKKyAgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHNyYiwgJmRjYi0+c3JiX3dhaXRpbmdfbGlzdCwgbGlzdCkKKwkJCVNQUklOVEYoIiAlbGkiLCBzcmItPmNtZC0+cGlkKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZkY2ItPnNyYl9nb2luZ19saXN0KSkKKwkJCVNQUklOVEYoIlxuRENCICglMDJpLSVpKTogR29pbmcgIDogJWk6IiwKKwkJCQlkY2ItPnRhcmdldF9pZCwgZGNiLT50YXJnZXRfbHVuLAorCQkJCWxpc3Rfc2l6ZSgmZGNiLT5zcmJfZ29pbmdfbGlzdCkpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNyYiwgJmRjYi0+c3JiX2dvaW5nX2xpc3QsIGxpc3QpCisJCQlTUFJJTlRGKCIgJWxpIiwgc3JiLT5jbWQtPnBpZCk7CisJCWlmICghbGlzdF9lbXB0eSgmZGNiLT5zcmJfd2FpdGluZ19saXN0KSB8fCAhbGlzdF9lbXB0eSgmZGNiLT5zcmJfZ29pbmdfbGlzdCkpCisJCQlTUFJJTlRGKCJcbiIpOworCX0KKworCWlmIChkZWJ1Z19lbmFibGVkKERCR18xKSkgeworCQlTUFJJTlRGKCJEQ0IgbGlzdCBmb3IgQUNCICVwOlxuIiwgYWNiKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkY2IsICZhY2ItPmRjYl9saXN0LCBsaXN0KSB7CisJCQlTUFJJTlRGKCIlcCAtPiAiLCBkY2IpOworCQl9CisJCVNQUklOVEYoIkVORFxuIik7CisJfQorCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCURDMzk1eF9VTkxPQ0tfSU8oYWNiLT5zY3NpX2hvc3QsIGZsYWdzKTsKKworCWlmIChwb3MgLSBidWZmZXIgPCBvZmZzZXQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHBvcyAtIGJ1ZmZlciAtIG9mZnNldCA8IGxlbmd0aCkKKwkJcmV0dXJuIHBvcyAtIGJ1ZmZlciAtIG9mZnNldDsKKwllbHNlCisJCXJldHVybiBsZW5ndGg7Cit9CisKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZGMzOTV4X2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5wcm9jX25hbWUgICAgICAgICAgICAgID0gREMzOTVYX05BTUUsCisJLnByb2NfaW5mbyAgICAgICAgICAgICAgPSBkYzM5NXhfcHJvY19pbmZvLAorCS5uYW1lICAgICAgICAgICAgICAgICAgID0gREMzOTVYX0JBTk5FUiAiICIgREMzOTVYX1ZFUlNJT04sCisJLnF1ZXVlY29tbWFuZCAgICAgICAgICAgPSBkYzM5NXhfcXVldWVfY29tbWFuZCwKKwkuYmlvc19wYXJhbSAgICAgICAgICAgICA9IGRjMzk1eF9iaW9zX3BhcmFtLAorCS5zbGF2ZV9hbGxvYyAgICAgICAgICAgID0gZGMzOTV4X3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95ICAgICAgICAgID0gZGMzOTV4X3NsYXZlX2Rlc3Ryb3ksCisJLmNhbl9xdWV1ZSAgICAgICAgICAgICAgPSBEQzM5NXhfTUFYX0NBTl9RVUVVRSwKKwkudGhpc19pZCAgICAgICAgICAgICAgICA9IDcsCisJLnNnX3RhYmxlc2l6ZSAgICAgICAgICAgPSBEQzM5NXhfTUFYX1NHX1RBQkxFU0laRSwKKwkuY21kX3Blcl9sdW4gICAgICAgICAgICA9IERDMzk1eF9NQVhfQ01EX1BFUl9MVU4sCisJLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgPSBkYzM5NXhfZWhfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyICAgPSBkYzM5NXhfZWhfYnVzX3Jlc2V0LAorCS51bmNoZWNrZWRfaXNhX2RtYSAgICAgID0gMCwKKwkudXNlX2NsdXN0ZXJpbmcgICAgICAgICA9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKKworLyoqCisgKiBiYW5uZXJfZGlzcGxheSAtIERpc3BsYXkgYmFubmVyIG9uIGZpcnN0IGluc3RhbmNlIG9mIGRyaXZlcgorICogaW5pdGlhbGl6ZWQuCisgKiovCitzdGF0aWMgdm9pZCBiYW5uZXJfZGlzcGxheSh2b2lkKQoreworCXN0YXRpYyBpbnQgYmFubmVyX2RvbmUgPSAwOworCWlmICghYmFubmVyX2RvbmUpCisJeworCQlkcHJpbnRrbChLRVJOX0lORk8sICIlcyAlc1xuIiwgREMzOTVYX0JBTk5FUiwgREMzOTVYX1ZFUlNJT04pOworCQliYW5uZXJfZG9uZSA9IDE7CisJfQorfQorCisKKy8qKgorICogZGMzOTV4X2luaXRfb25lIC0gSW5pdGlhbGlzZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KKyAqCisgKiBUaGUgUENJIGxheWVyIHdpbGwgY2FsbCB0aGlzIG9uY2UgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIKKyAqIHRoYXQgaXQgZmluZHMgaW4gdGhlIHN5c3RlbS4gVGhlIHBjaV9kZXYgc3RyY3V0dXJlIGluZGljYXRlcyB3aGljaAorICogaW5zdGFuY2Ugd2UgYXJlIGJlaW5nIGNhbGxlZCBmcm9tLgorICogCisgKiBAZGV2OiBUaGUgUENJIGRldmljZSB0byBpbnRpYWxpemUuCisgKiBAaWQ6IExvb2tzIGxpa2UgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiBvdXIgcGNpIGRldmljZSB0YWJsZQorICogdGhhdCB3YXMgYWN0dWFsbHkgbWF0Y2hlZCBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZSAoLXZlKSBvbiBmYWlsdXJlLgorICoqLworc3RhdGljIGludCBfX2RldmluaXQgZGMzOTV4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3QgPSBOVUxMOworCXN0cnVjdCBBZGFwdGVyQ3RsQmxrICphY2IgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydF9iYXNlOworCXVuc2lnbmVkIGludCBpb19wb3J0X2xlbjsKKwl1bnNpZ25lZCBpbnQgaXJxOworCQorCWRwcmludGtkYmcoREJHXzAsICJJbml0IG9uZSBpbnN0YW5jZSAoJXMpXG4iLCBwY2lfbmFtZShkZXYpKTsKKwliYW5uZXJfZGlzcGxheSgpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCisJeworCQlkcHJpbnRrbChLRVJOX0lORk8sICJQQ0kgRW5hYmxlIGRldmljZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlvX3BvcnRfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCWlvX3BvcnRfbGVuID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDApOworCWlycSA9IGRldi0+aXJxOworCWRwcmludGtkYmcoREJHXzAsICJJT19QT1JUPTB4JTA0bHgsIElSUT0weCV4XG4iLCBpb19wb3J0X2Jhc2UsIGRldi0+aXJxKTsKKworCS8qIGFsbG9jYXRlIHNjc2kgaG9zdCBpbmZvcm1hdGlvbiAoaW5jbHVkZXMgb3V0IGFkYXB0ZXIpICovCisJc2NzaV9ob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkYzM5NXhfZHJpdmVyX3RlbXBsYXRlLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IEFkYXB0ZXJDdGxCbGspKTsKKwlpZiAoIXNjc2lfaG9zdCkgeworCQlkcHJpbnRrbChLRVJOX0lORk8sICJzY3NpX2hvc3RfYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKyAJYWNiID0gKHN0cnVjdCBBZGFwdGVyQ3RsQmxrKilzY3NpX2hvc3QtPmhvc3RkYXRhOworIAlhY2ItPnNjc2lfaG9zdCA9IHNjc2lfaG9zdDsKKyAJYWNiLT5kZXYgPSBkZXY7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBhZGFwdGVyIGFuZCBldmVyeXRoaW5nIHdlIG5lZWQgKi8KKyAJaWYgKGFkYXB0ZXJfaW5pdChhY2IsIGlvX3BvcnRfYmFzZSwgaW9fcG9ydF9sZW4sIGlycSkpIHsKKwkJZHByaW50a2woS0VSTl9JTkZPLCAiYWRhcHRlciBpbml0IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihkZXYpOworCisJLyogZ2V0IHRoZSBzY3NpIG1pZCBsZXZlbCB0byBzY2FuIGZvciBuZXcgZGV2aWNlcyBvbiB0aGUgYnVzICovCisJaWYgKHNjc2lfYWRkX2hvc3Qoc2NzaV9ob3N0LCAmZGV2LT5kZXYpKSB7CisJCWRwcmludGtsKEtFUk5fRVJSLCAic2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHNjc2lfaG9zdCk7CisJc2NzaV9zY2FuX2hvc3Qoc2NzaV9ob3N0KTsKKyAgICAgICAgCQorCXJldHVybiAwOworCitmYWlsOgorCWlmIChhY2IgIT0gTlVMTCkKKwkJYWRhcHRlcl91bmluaXQoYWNiKTsKKwlpZiAoc2NzaV9ob3N0ICE9IE5VTEwpCisJCXNjc2lfaG9zdF9wdXQoc2NzaV9ob3N0KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCisvKioKKyAqIGRjMzk1eF9yZW1vdmVfb25lIC0gQ2FsbGVkIHRvIHJlbW92ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUKKyAqIGFkYXB0ZXIuCisgKgorICogQGRldjogVGhlIFBDSSBkZXZpY2UgdG8gaW50aWFsaXplLgorICoqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGRjMzk1eF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IEFkYXB0ZXJDdGxCbGsgKmFjYiA9IChzdHJ1Y3QgQWRhcHRlckN0bEJsayAqKShzY3NpX2hvc3QtPmhvc3RkYXRhKTsKKworCWRwcmludGtkYmcoREJHXzAsICJkYzM5NXhfcmVtb3ZlX29uZTogYWNiPSVwXG4iLCBhY2IpOworCisJc2NzaV9yZW1vdmVfaG9zdChzY3NpX2hvc3QpOworCWFkYXB0ZXJfdW5pbml0KGFjYik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJc2NzaV9ob3N0X3B1dChzY3NpX2hvc3QpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkYzM5NXhfcGNpX3RhYmxlW10gPSB7CisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfVEVLUkFNLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfVEVLUkFNX1RSTVMxMDQwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJIH0sCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkYzM5NXhfcGNpX3RhYmxlKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGMzOTV4X2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSBEQzM5NVhfTkFNRSwKKwkuaWRfdGFibGUgICAgICAgPSBkYzM5NXhfcGNpX3RhYmxlLAorCS5wcm9iZSAgICAgICAgICA9IGRjMzk1eF9pbml0X29uZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcChkYzM5NXhfcmVtb3ZlX29uZSksCit9OworCisKKy8qKgorICogZGMzOTV4X21vZHVsZV9pbml0IC0gTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogVXNlZCBieSBib3RoIG1vZHVsZSBhbmQgYnVpbHQtaW4gZHJpdmVyIHRvIGluaXRpYWxpc2UgdGhpcyBkcml2ZXIuCisgKiovCitzdGF0aWMgaW50IF9faW5pdCBkYzM5NXhfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkYzM5NXhfZHJpdmVyKTsKK30KKworCisvKioKKyAqIGRjMzk1eF9tb2R1bGVfZXhpdCAtIE1vZHVsZSBjbGVhbnVwIGZ1bmN0aW9uLgorICoqLworc3RhdGljIHZvaWQgX19leGl0IGRjMzk1eF9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGMzOTV4X2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoZGMzOTV4X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGRjMzk1eF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkMuTC4gSHVhbmcgLyBFcmljaCBDaGVuIC8gS3VydCBHYXJsb2ZmIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgaG9zdCBhZGFwdGVyIGRyaXZlciBmb3IgVGVrcmFtIFRSTS1TMTA0MCBiYXNlZCBhZGFwdGVyczogVGVrcmFtIERDMzk1IGFuZCBEQzMxNSBzZXJpZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kYzM5NXguaCBiL2RyaXZlcnMvc2NzaS9kYzM5NXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgzNjBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RjMzk1eC5oCkBAIC0wLDAgKzEsNjQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJZGMzOTV4LmgJCQkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCURldmljZSBEcml2ZXIgZm9yIFRla3JhbSBEQzM5NShVL1VXL0YpLCBEQzMxNShVKQkJKi8KKy8qCVBDSSBTQ1NJIEJ1cyBNYXN0ZXIgSG9zdCBBZGFwdGVyCQkJCSovCisvKgkoU0NTSSBjaGlwIHNldCB1c2VkIFRla3JhbSBBU0lDIFRSTS1TMTA0MCkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgREMzOTV4X0gKKyNkZWZpbmUgREMzOTV4X0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUluaXRpYWwgdmFsdWVzCQkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBEQzM5NXhfTUFYX0NNRF9RVUVVRQkJMzIKKy8qICNkZWZpbmUgREMzOTV4X01BWF9RVEFHUwkJMzIgKi8KKyNkZWZpbmUgREMzOTV4X01BWF9RVEFHUwkJMTYKKyNkZWZpbmUgREMzOTV4X01BWF9TQ1NJX0lECQkxNgorI2RlZmluZSBEQzM5NXhfTUFYX0NNRF9QRVJfTFVOCQlEQzM5NXhfTUFYX1FUQUdTCisjZGVmaW5lIERDMzk1eF9NQVhfU0dfVEFCTEVTSVpFCQk2NAkvKiBIVyBsaW1pdGF0aW9uCQkJKi8KKyNkZWZpbmUgREMzOTV4X01BWF9TR19MSVNURU5UUlkJCTY0CS8qIE11c3QgYmUgZXF1YWwgb3IgbG93ZXIgdG8gcHJldmlvdXMJKi8KKwkJCQkJCS8qIGl0ZW0JCQkJCSovCisjZGVmaW5lIERDMzk1eF9NQVhfU1JCX0NOVAkJNjMKKy8qICNkZWZpbmUgREMzOTV4X01BWF9DQU5fUVVFVUUJCTcgKiBEQzM5NXhfTUFYX1FUQUdTICovCisjZGVmaW5lIERDMzk1eF9NQVhfQ0FOX1FVRVVFCQlEQzM5NXhfTUFYX1NSQl9DTlQKKyNkZWZpbmUgREMzOTV4X0VORF9TQ0FOCQkJMgorI2RlZmluZSBEQzM5NXhfU0VMX1RJTUVPVVQJCTE1MwkvKiAyNTAgbXMgc2VsZWN0aW9uIHRpbWVvdXQgKEAgNDAgTUh6KQkqLworI2RlZmluZSBEQzM5NXhfTUFYX1JFVFJJRVMJCTMKKworI2lmIDAKKyNkZWZpbmUgU1lOQ19GSVJTVAorI2VuZGlmCisKKyNkZWZpbmUgTk9STV9SRUNfTFZMCQkJMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVmFyaW91cyBkZWZpbml0aW9ucwkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCSVQzMQkJCQkweDgwMDAwMDAwCisjZGVmaW5lIEJJVDMwCQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQklUMjkJCQkJMHgyMDAwMDAwMAorI2RlZmluZSBCSVQyOAkJCQkweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI3CQkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQklUMjYJCQkJMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNQkJCQkweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI0CQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQklUMjMJCQkJMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyMgkJCQkweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIxCQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgQklUMjAJCQkJMHgwMDEwMDAwMAorI2RlZmluZSBCSVQxOQkJCQkweDAwMDgwMDAwCisjZGVmaW5lIEJJVDE4CQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgQklUMTcJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxNgkJCQkweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE1CQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgQklUMTQJCQkJMHgwMDAwNDAwMAorI2RlZmluZSBCSVQxMwkJCQkweDAwMDAyMDAwCisjZGVmaW5lIEJJVDEyCQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQklUMTEJCQkJMHgwMDAwMDgwMAorI2RlZmluZSBCSVQxMAkJCQkweDAwMDAwNDAwCisjZGVmaW5lIEJJVDkJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBCSVQ4CQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQklUNwkJCQkweDAwMDAwMDgwCisjZGVmaW5lIEJJVDYJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ1CQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQklUNAkJCQkweDAwMDAwMDEwCisjZGVmaW5lIEJJVDMJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBCSVQyCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQklUMQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIEJJVDAJCQkJMHgwMDAwMDAwMQorCisvKiBVbml0Q3RybEZsYWcgKi8KKyNkZWZpbmUgVU5JVF9BTExPQ0FURUQJCQlCSVQwCisjZGVmaW5lIFVOSVRfSU5GT19DSEFOR0VECQlCSVQxCisjZGVmaW5lIEZPUk1BVElOR19NRURJQQkJCUJJVDIKKyNkZWZpbmUgVU5JVF9SRVRSWQkJCUJJVDMKKworLyogVW5pdEZsYWdzICovCisjZGVmaW5lIERBU0RfU1VQUE9SVAkJCUJJVDAKKyNkZWZpbmUgU0NTSV9TVVBQT1JUCQkJQklUMQorI2RlZmluZSBBU1BJX1NVUFBPUlQJCQlCSVQyCisKKy8qIFNSQlN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbiAqLworI2RlZmluZSBTUkJfRlJFRQkJCTB4MDAwMAorI2RlZmluZSBTUkJfV0FJVAkJCTB4MDAwMQorI2RlZmluZSBTUkJfUkVBRFkJCQkweDAwMDIKKyNkZWZpbmUgU1JCX01TR09VVAkJCTB4MDAwNAkvKiBhcmJpdHJhdGlvbittc2dfb3V0IDFzdCBieXRlCQkqLworI2RlZmluZSBTUkJfTVNHSU4JCQkweDAwMDgKKyNkZWZpbmUgU1JCX0VYVEVORF9NU0dJTgkJMHgwMDEwCisjZGVmaW5lIFNSQl9DT01NQU5ECQkJMHgwMDIwCisjZGVmaW5lIFNSQl9TVEFSVF8JCQkweDAwNDAJLyogYXJiaXRyYXRpb24rbXNnX291dCtjb21tYW5kX291dAkqLworI2RlZmluZSBTUkJfRElTQ09OTkVDVAkJCTB4MDA4MAorI2RlZmluZSBTUkJfREFUQV9YRkVSCQkJMHgwMTAwCisjZGVmaW5lIFNSQl9YRkVSUEFECQkJMHgwMjAwCisjZGVmaW5lIFNSQl9TVEFUVVMJCQkweDA0MDAKKyNkZWZpbmUgU1JCX0NPTVBMRVRFRAkJCTB4MDgwMAorI2RlZmluZSBTUkJfQUJPUlRfU0VOVAkJCTB4MTAwMAorI2RlZmluZSBTUkJfRE9fU1lOQ19ORUdPCQkweDIwMDAKKyNkZWZpbmUgU1JCX0RPX1dJREVfTkVHTwkJMHg0MDAwCisjZGVmaW5lIFNSQl9VTkVYUEVDVF9SRVNFTAkJMHg4MDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglBQ0IgQ29uZmlnCQkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0NfV0lERV9DQVJECQkJMHgyMAorI2RlZmluZSBIQ0NfU0NTSV9SRVNFVAkJCTB4MTAKKyNkZWZpbmUgSENDX1BBUklUWQkJCTB4MDgKKyNkZWZpbmUgSENDX0FVVE9URVJNCQkJMHgwNAorI2RlZmluZSBIQ0NfTE9XOFRFUk0JCQkweDAyCisjZGVmaW5lIEhDQ19VUDhURVJNCQkJMHgwMQorCisvKiBBQ0JGbGFnICovCisjZGVmaW5lIFJFU0VUX0RFVgkJCUJJVDAKKyNkZWZpbmUgUkVTRVRfREVURUNUCQkJQklUMQorI2RlZmluZSBSRVNFVF9ET05FCQkJQklUMgorCisvKiBEQ0JGbGFnICovCisjZGVmaW5lIEFCT1JUX0RFVl8JCQlCSVQwCisKKy8qIFNSQnN0YXR1cyAqLworI2RlZmluZSBTUkJfT0sJCQkJQklUMAorI2RlZmluZSBBQk9SVElPTgkJCUJJVDEKKyNkZWZpbmUgT1ZFUl9SVU4JCQlCSVQyCisjZGVmaW5lIFVOREVSX1JVTgkJCUJJVDMKKyNkZWZpbmUgUEFSSVRZX0VSUk9SCQkJQklUNAorI2RlZmluZSBTUkJfRVJST1IJCQlCSVQ1CisKKy8qIFNSQkZsYWcgKi8KKyNkZWZpbmUgREFUQU9VVAkJCQlCSVQ3CisjZGVmaW5lIERBVEFJTgkJCQlCSVQ2CisjZGVmaW5lIFJFU0lEVUFMX1ZBTElECQkJQklUNQorI2RlZmluZSBFTkFCTEVfVElNRVIJCQlCSVQ0CisjZGVmaW5lIFJFU0VUX0RFVjAJCQlCSVQyCisjZGVmaW5lIEFCT1JUX0RFVgkJCUJJVDEKKyNkZWZpbmUgQVVUT19SRVFTRU5TRQkJCUJJVDAKKworLyogQWRhcHRlciBzdGF0dXMgKi8KKyNkZWZpbmUgSF9TVEFUVVNfR09PRAkJCTAKKyNkZWZpbmUgSF9TRUxfVElNRU9VVAkJCTB4MTEKKyNkZWZpbmUgSF9PVkVSX1VOREVSX1JVTgkJMHgxMgorI2RlZmluZSBIX1VORVhQX0JVU19GUkVFCQkweDEzCisjZGVmaW5lIEhfVEFSR0VUX1BIQVNFX0YJCTB4MTQKKyNkZWZpbmUgSF9JTlZBTElEX0NDQl9PUAkJMHgxNgorI2RlZmluZSBIX0xJTktfQ0NCX0JBRAkJCTB4MTcKKyNkZWZpbmUgSF9CQURfVEFSR0VUX0RJUgkJMHgxOAorI2RlZmluZSBIX0RVUExJQ0FURV9DQ0IJCQkweDE5CisjZGVmaW5lIEhfQkFEX0NDQl9PUl9TRwkJCTB4MUEKKyNkZWZpbmUgSF9BQk9SVAkJCQkweDBGRgorCisvKiBTQ1NJIEJVUyBTdGF0dXMgYnl0ZSBjb2RlcyAqLworI2RlZmluZSBTQ1NJX1NUQVRfR09PRAkJCTB4MAkvKiBHb29kIHN0YXR1cwkJCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfQ0hFQ0tDT05ECQkweDAyCS8qIFNDU0kgQ2hlY2sgQ29uZGl0aW9uCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0NPTkRNRVQJCTB4MDQJLyogQ29uZGl0aW9uIE1ldAkJCSovCisjZGVmaW5lIFNDU0lfU1RBVF9CVVNZCQkJMHgwOAkvKiBUYXJnZXQgYnVzeSBzdGF0dXMJCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfSU5URVIJCQkweDEwCS8qIEludGVybWVkaWF0ZSBzdGF0dXMJCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfSU5URVJDT05ETUVUCQkweDE0CS8qIEludGVybWVkaWF0ZSBjb25kaXRpb24gbWV0CQkqLworI2RlZmluZSBTQ1NJX1NUQVRfUkVTQ09ORkxJQ1QJCTB4MTgJLyogUmVzZXJ2YXRpb24gY29uZmxpY3QJCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfQ01EVEVSTQkJMHgyMgkvKiBDb21tYW5kIFRlcm1pbmF0ZWQJCQkqLworI2RlZmluZSBTQ1NJX1NUQVRfUVVFVUVGVUxMCQkweDI4CS8qIFF1ZXVlIEZ1bGwJCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX1VORVhQX0JVU19GCQkweEZECS8qIFVuZXhwZWN0IEJ1cyBGcmVlCQkJKi8KKyNkZWZpbmUgU0NTSV9TVEFUX0JVU19SU1RfREVURUNUCTB4RkUJLyogU2NzaSBCdXMgUmVzZXQgZGV0ZWN0ZWQJCSovCisjZGVmaW5lIFNDU0lfU1RBVF9TRUxfVElNRU9VVAkJMHhGRgkvKiBTZWxlY3Rpb24gVGltZSBvdXQJCQkqLworCisvKiBTeW5jX01vZGUgKi8KKyNkZWZpbmUgU1lOQ19XSURFX1RBR19BVE5UX0RJU0FCTEUJMAorI2RlZmluZSBTWU5DX05FR09fRU5BQkxFCQlCSVQwCisjZGVmaW5lIFNZTkNfTkVHT19ET05FCQkJQklUMQorI2RlZmluZSBXSURFX05FR09fRU5BQkxFCQlCSVQyCisjZGVmaW5lIFdJREVfTkVHT19ET05FCQkJQklUMworI2RlZmluZSBXSURFX05FR09fU1RBVEUJCQlCSVQ0CisjZGVmaW5lIEVOX1RBR19RVUVVRUlORwkJCUJJVDUKKyNkZWZpbmUgRU5fQVROX1NUT1AJCQlCSVQ2CisKKyNkZWZpbmUgU1lOQ19ORUdPX09GRlNFVAkJMTUKKworLyogU0NTSSBNU0cgQllURSAqLworI2RlZmluZSBNU0dfQ09NUExFVEUJCQkweDAwCisjZGVmaW5lIE1TR19FWFRFTkRFRAkJCTB4MDEKKyNkZWZpbmUgTVNHX1NBVkVfUFRSCQkJMHgwMgorI2RlZmluZSBNU0dfUkVTVE9SRV9QVFIJCQkweDAzCisjZGVmaW5lIE1TR19ESVNDT05ORUNUCQkJMHgwNAorI2RlZmluZSBNU0dfSU5JVElBVE9SX0VSUk9SCQkweDA1CisjZGVmaW5lIE1TR19BQk9SVAkJCTB4MDYKKyNkZWZpbmUgTVNHX1JFSkVDVF8JCQkweDA3CisjZGVmaW5lIE1TR19OT1AJCQkJMHgwOAorI2RlZmluZSBNU0dfUEFSSVRZX0VSUk9SCQkweDA5CisjZGVmaW5lIE1TR19MSU5LX0NNRF9DT01QTAkJMHgwQQorI2RlZmluZSBNU0dfTElOS19DTURfQ09NUExfRkxHCQkweDBCCisjZGVmaW5lIE1TR19CVVNfUkVTRVQJCQkweDBDCisjZGVmaW5lIE1TR19BQk9SVF9UQUcJCQkweDBECisjZGVmaW5lIE1TR19TSU1QTEVfUVRBRwkJCTB4MjAKKyNkZWZpbmUgTVNHX0hFQURfUVRBRwkJCTB4MjEKKyNkZWZpbmUgTVNHX09SREVSX1FUQUcJCQkweDIyCisjZGVmaW5lIE1TR19JR05PUkVXSURFCQkJMHgyMworI2RlZmluZSBNU0dfSURFTlRJRlkJCQkweDgwCisjZGVmaW5lIE1TR19IT1NUX0lECQkJMHhDMAorCisvKiBTQ1NJIFNUQVRVUyBCWVRFICovCisjZGVmaW5lIFNUQVRVU19HT09ECQkJMHgwMAorI2RlZmluZSBDSEVDS19DT05ESVRJT05fCQkweDAyCisjZGVmaW5lIFNUQVRVU19CVVNZCQkJMHgwOAorI2RlZmluZSBTVEFUVVNfSU5URVJNRURJQVRFCQkweDEwCisjZGVmaW5lIFJFU0VSVkVfQ09ORkxJQ1QJCTB4MTgKKworLyogY21kLT5yZXN1bHQgKi8KKyNkZWZpbmUgU1RBVFVTX01BU0tfCQkJMHhGRgorI2RlZmluZSBNU0dfTUFTSwkJCTB4RkYwMAorI2RlZmluZSBSRVRVUk5fTUFTSwkJCTB4RkYwMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglJbnF1aXJ5IERhdGEgZm9ybWF0CQkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgU2NzaUlucURhdGEKK3sJCQkJCQkvKiBJTlEJCQkJCSovCisJdTggRGV2VHlwZTsJCQkJLyogUGVyaXBoIFF1YWxpZmllciAmIFBlcmlwaCBEZXYgVHlwZQkqLworCXU4IFJNQl9UeXBlTW9kOwkJCQkvKiByZW0gbWVkaWEgYml0ICYgRGV2IFR5cGUgTW9kaWZpZXIJKi8KKwl1OCBWZXJzOwkJCQkvKiBJU08sIEVDTUEsICYgQU5TSSB2ZXJzaW9ucwkJKi8KKwl1OCBSREY7CQkJCQkvKiBBRU4sIFRSTUlPUCwgJiByZXNwb25zZSBkYXRhIGZvcm1hdAkqLworCXU4IEFkZExlbjsJCQkJLyogbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YQkJKi8KKwl1OCBSZXMxOwkJCQkvKiByZXNlcnZlZAkJCQkqLworCXU4IFJlczI7CQkJCS8qIHJlc2VydmVkCQkJCSovCisJdTggRmxhZ3M7CQkJCS8qIFJlbEFEciwgV2J1czMyLCBXYnVzMTYsIFN5bmMsIGV0Yy4JKi8KKwl1OCBWZW5kb3JJRFs4XTsJCQkJLyogVmVuZG9yIElkZW50aWZpY2F0aW9uCQkqLworCXU4IFByb2R1Y3RJRFsxNl07CQkJLyogUHJvZHVjdCBJZGVudGlmaWNhdGlvbgkJKi8KKwl1OCBQcm9kdWN0UmV2WzRdOwkJCS8qIFByb2R1Y3QgUmV2aXNpb24JCQkqLworfTsKKworCQkJCQkJLyogSW5xdWlyeSBieXRlIDAgbWFza3MJCQkqLworI2RlZmluZSBTQ1NJX0RFVlRZUEUJCQkweDFGCS8qIFBlcmlwaGVyYWwgRGV2aWNlIFR5cGUJCSovCisjZGVmaW5lIFNDU0lfUEVSSVBIUVVBTAkJCTB4RTAJLyogUGVyaXBoZXJhbCBRdWFsaWZpZXIJCQkqLworCQkJCQkJLyogSW5xdWlyeSBieXRlIDEgbWFzawkJCSovCisjZGVmaW5lIFNDU0lfUkVNT1ZBQkxFX01FRElBCQkweDgwCS8qIFJlbW92YWJsZSBNZWRpYSBiaXQgKDE9cmVtb3ZhYmxlKQkqLworCQkJCQkJLyogUGVyaXBoZXJhbCBEZXZpY2UgVHlwZSBkZWZpbml0aW9ucwkqLworCQkJCQkJLyogU2VlIGluY2x1ZGUvc2NzaS9zY3NpLmgJCSovCisjZGVmaW5lIFRZUEVfTk9ERVYJCVNDU0lfREVWVFlQRQkvKiBVbmtub3duIG9yIG5vIGRldmljZSB0eXBlCQkqLworI2lmbmRlZiBUWVBFX1BSSU5URVIJCQkJLyoJCQkJCSovCisjIGRlZmluZSBUWVBFX1BSSU5URVIJCQkweDAyCS8qIFByaW50ZXIgZGV2aWNlCQkJKi8KKyNlbmRpZgkJCQkJCS8qCQkJCQkqLworI2lmbmRlZiBUWVBFX0NPTU0JCQkJLyoJCQkJCSovCisjIGRlZmluZSBUWVBFX0NPTU0JCQkweDA5CS8qIENvbW11bmljYXRpb25zIGRldmljZQkJKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJSW5xdWlyeSBmbGFnIGRlZmluaXRpb25zIChJbnEgZGF0YSBieXRlIDcpCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNDU0lfSU5RX1JFTEFEUgkJCTB4ODAJLyogZGV2aWNlIHN1cHBvcnRzIHJlbGF0aXZlIGFkZHJlc3NpbmcJKi8KKyNkZWZpbmUgU0NTSV9JTlFfV0JVUzMyCQkJMHg0MAkvKiBkZXZpY2Ugc3VwcG9ydHMgMzIgYml0IGRhdGEgeGZlcnMJKi8KKyNkZWZpbmUgU0NTSV9JTlFfV0JVUzE2CQkJMHgyMAkvKiBkZXZpY2Ugc3VwcG9ydHMgMTYgYml0IGRhdGEgeGZlcnMJKi8KKyNkZWZpbmUgU0NTSV9JTlFfU1lOQwkJCTB4MTAJLyogZGV2aWNlIHN1cHBvcnRzIHN5bmNocm9ub3VzIHhmZXIJKi8KKyNkZWZpbmUgU0NTSV9JTlFfTElOS0VECQkJMHgwOAkvKiBkZXZpY2Ugc3VwcG9ydHMgbGlua2VkIGNvbW1hbmRzCSovCisjZGVmaW5lIFNDU0lfSU5RX0NNRFFVRVVFCQkweDAyCS8qIGRldmljZSBzdXBwb3J0cyBjb21tYW5kIHF1ZXVlaW5nCSovCisjZGVmaW5lIFNDU0lfSU5RX1NGVFJFCQkJMHgwMQkvKiBkZXZpY2Ugc3VwcG9ydHMgc29mdCByZXNldHMJCSovCisKKyNkZWZpbmUgRU5BQkxFX0NFCQkJMQorI2RlZmluZSBESVNBQkxFX0NFCQkJMAorI2RlZmluZSBFRVBST01fUkVBRAkJCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVRoZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlciBvZmZzZXQgZm9yIFRSTV9TMTA0MAkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRSTV9TMTA0MF9JRAkJCTB4MDAJLyogVmVuZG9yIGFuZCBEZXZpY2UgSUQJCQkqLworI2RlZmluZSBUUk1fUzEwNDBfQ09NTUFORAkJMHgwNAkvKiBQQ0kgY29tbWFuZCByZWdpc3RlcgkJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9JT0JBU0UJCTB4MTAJLyogSS9PIFNwYWNlIGJhc2UgYWRkcmVzcwkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1JPTUJBU0UJCTB4MzAJLyogRXhwYW5zaW9uIFJPTSBCYXNlIEFkZHJlc3MJCSovCisjZGVmaW5lIFRSTV9TMTA0MF9JTlRMSU5FCQkweDNDCS8qIEludGVycnVwdCBsaW5lCQkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCVRoZSBTQ1NJIHJlZ2lzdGVyIG9mZnNldCBmb3IgVFJNX1MxMDQwCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9TVEFUVVMJCTB4ODAJLyogU0NTSSBTdGF0dXMgKFIpCQkJKi8KKyNkZWZpbmUgQ09NTUFORFBIQVNFRE9ORQkJMHgyMDAwCS8qIFNDU0kgY29tbWFuZCBwaGFzZSBkb25lCQkqLworI2RlZmluZSBTQ1NJWEZFUkRPTkUJCQkweDA4MDAJLyogU0NTSSBTQ1NJIHRyYW5zZmVyIGRvbmUJCSovCisjZGVmaW5lIFNDU0lYRkVSQ05UXzJfWkVSTwkJMHgwMTAwCS8qIFNDU0kgU0NTSSB0cmFuc2ZlciBjb3VudCB0byB6ZXJvCSovCisjZGVmaW5lIFNDU0lJTlRFUlJVUFQJCQkweDAwODAJLyogU0NTSSBpbnRlcnJ1cHQgcGVuZGluZwkJKi8KKyNkZWZpbmUgQ09NTUFOREFCT1JUCQkJMHgwMDQwCS8qIFNDU0kgY29tbWFuZCBhYm9ydAkJCSovCisjZGVmaW5lIFNFUVVFTkNFUkFDVElWRQkJCTB4MDAyMAkvKiBTQ1NJIHNlcXVlbmNlciBhY3RpdmUJCSovCisjZGVmaW5lIFBIQVNFTUlTTUFUQ0gJCQkweDAwMTAJLyogU0NTSSBwaGFzZSBtaXNtYXRjaAkJCSovCisjZGVmaW5lIFBBUklUWUVSUk9SCQkJMHgwMDA4CS8qIFNDU0kgcGFyaXR5IGVycm9yCQkJKi8KKworI2RlZmluZSBQSEFTRU1BU0sJCQkweDAwMDcJLyogUGhhc2UgTVNHL0NEL0lPCQkJKi8KKyNkZWZpbmUgUEhfREFUQV9PVVQJCQkweDAwCS8qIERhdGEgb3V0IHBoYXNlCQkJKi8KKyNkZWZpbmUgUEhfREFUQV9JTgkJCTB4MDEJLyogRGF0YSBpbiBwaGFzZQkJCSovCisjZGVmaW5lIFBIX0NPTU1BTkQJCQkweDAyCS8qIENvbW1hbmQgcGhhc2UJCQkqLworI2RlZmluZSBQSF9TVEFUVVMJCQkweDAzCS8qIFN0YXR1cyBwaGFzZQkJCQkqLworI2RlZmluZSBQSF9CVVNfRlJFRQkJCTB4MDUJLyogSW52YWxpZCBwaGFzZSB1c2VkIGFzIGJ1cyBmcmVlCSovCisjZGVmaW5lIFBIX01TR19PVVQJCQkweDA2CS8qIE1lc3NhZ2Ugb3V0IHBoYXNlCQkJKi8KKyNkZWZpbmUgUEhfTVNHX0lOCQkJMHgwNwkvKiBNZXNzYWdlIGluIHBoYXNlCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9DT05UUk9MCQkweDgwCS8qIFNDU0kgQ29udHJvbCAoVykJCQkqLworI2RlZmluZSBET19DTFJBVE4JCQkweDA0MDAJLyogQ2xlYXIgQVROCQkJCSovCisjZGVmaW5lIERPX1NFVEFUTgkJCTB4MDIwMAkvKiBTZXQgQVROCQkJCSovCisjZGVmaW5lIERPX0NNREFCT1JUCQkJMHgwMTAwCS8qIEFib3J0IFNDU0kgY29tbWFuZAkJCSovCisjZGVmaW5lIERPX1JTVE1PRFVMRQkJCTB4MDAxMAkvKiBSZXNldCBTQ1NJIGNoaXAJCQkqLworI2RlZmluZSBET19SU1RTQ1NJCQkJMHgwMDA4CS8qIFJlc2V0IFNDU0kgYnVzCQkJKi8KKyNkZWZpbmUgRE9fQ0xSRklGTwkJCTB4MDAwNAkvKiBDbGVhciBTQ1NJIHRyYW5zZmVyIEZJRk8JCSovCisjZGVmaW5lIERPX0RBVEFMQVRDSAkJCTB4MDAwMgkvKiBFbmFibGUgU0NTSSBidXMgZGF0YSBpbnB1dCAobGF0Y2hlZCkJKi8KKy8qICNkZWZpbmUgRE9fREFUQUxBVENICQkJMHgwMDAwICovCS8qIEtHOiBESVNhYmxlIFNDU0kgYnVzIGRhdGEgbGF0Y2gJKi8KKyNkZWZpbmUgRE9fSFdSRVNFTEVDVAkJCTB4MDAwMQkvKiBFbmFibGUgaGFyZHdhcmUgcmVzZWxlY3Rpb24JCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfRklGT0NOVAkJMHg4MgkvKiBTQ1NJIEZJRk8gQ291bnRlciA1Yml0cyhSKQkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfU0lHTkFMCQkweDgzCS8qIFNDU0kgbG93IGxldmVsIHNpZ25hbCAoUi9XKQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9JTlRTVEFUVVMJMHg4NAkvKiBTQ1NJIEludGVycnVwdCBTdGF0dXMgKFIpCQkqLworI2RlZmluZSBJTlRfU0NBTQkJCTB4ODAJLyogU0NBTSBzZWxlY3Rpb24gaW50ZXJydXB0CQkqLworI2RlZmluZSBJTlRfU0VMRUNUCQkJMHg0MAkvKiBTZWxlY3Rpb24gaW50ZXJydXB0CQkJKi8KKyNkZWZpbmUgSU5UX1NFTFRJTUVPVVQJCQkweDIwCS8qIFNlbGVjdGlvbiB0aW1lb3V0IGludGVycnVwdAkJKi8KKyNkZWZpbmUgSU5UX0RJU0NPTk5FQ1QJCQkweDEwCS8qIEJ1cyBkaXNjb25uZWN0ZWQgaW50ZXJydXB0CQkqLworI2RlZmluZSBJTlRfUkVTRUxFQ1RFRAkJCTB4MDgJLyogUmVzZWxlY3RlZCBpbnRlcnJ1cHQJCQkqLworI2RlZmluZSBJTlRfU0NTSVJFU0VUCQkJMHgwNAkvKiBTQ1NJIHJlc2V0IGRldGVjdGVkIGludGVycnVwdAkqLworI2RlZmluZSBJTlRfQlVTU0VSVklDRQkJCTB4MDIJLyogQnVzIHNlcnZpY2UgaW50ZXJydXB0CQkqLworI2RlZmluZSBJTlRfQ01ERE9ORQkJCTB4MDEJLyogU0NTSSBjb21tYW5kIGRvbmUgaW50ZXJydXB0CQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX09GRlNFVAkJMHg4NAkvKiBTQ1NJIE9mZnNldCBDb3VudCAoVykJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglCaXQJCU5hbWUJCURlZmluaXRpb24JCQkqLworLyoJLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworLyoJMDctMDUJMAlSU1ZECQlSZXZlcnNlZC4gQWx3YXlzIDAuCQkqLworLyoJMDQJMAlPRkZTRVQ0CQlSZXZlcnNlZCBmb3IgTFZEUy4gQWx3YXlzIDAuCSovCisvKgkwMy0wMAkwCU9GRlNFVFswMzowMF0JT2Zmc2V0IG51bWJlciBmcm9tIDAgdG8gMTUJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfU1lOQwkJMHg4NQkvKiBTQ1NJIFN5bmNocm9ub3VzIENvbnRyb2wgKFIvVykJKi8KKyNkZWZpbmUgTFZEU19TWU5DCQkJMHgyMAkvKiBFbmFibGUgTFZEUyBzeW5jaHJvbm91cwkJKi8KKyNkZWZpbmUgV0lERV9TWU5DCQkJMHgxMAkvKiBFbmFibGUgV0lERSBzeW5jaHJvbm91cwkJKi8KKyNkZWZpbmUgQUxUX1NZTkMJCQkweDA4CS8qIEVuYWJsZSBGYXN0LTIwIGFsdGVybmF0ZSBzeW5jaHJvbm91cwkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJU1lOQ00JNyAgICA2ICAgIDUgICAgNCAgICAzICAgICAgIDIgICAgICAgMSAgICAgICAwCQkqLworLyoJTmFtZQlSU1ZEIFJTVkQgTFZEUyBXSURFIEFMVFBFUkQgUEVSSU9EMiBQRVJJT0QxIFBFUklPRDAJKi8KKy8qCURlZmF1bHQJMCAgICAwICAgIDAgICAgMCAgICAwICAgICAgIDAgICAgICAgMCAgICAgICAwCQkqLworLyoJCQkJCQkJCQkqLworLyoJQml0CQlOYW1lCQlEZWZpbml0aW9uCQkJKi8KKy8qCS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworLyoJMDctMDYJMAlSU1ZECQlSZXZlcnNlZC4gQWx3YXlzIHJlYWQgMAkJKi8KKy8qCTA1CTAJTFZEUwkJUmV2ZXJzZWQuIEFsd2F5cyByZWFkIDAJCSovCisvKgkwNAkwCVdJREUvV1NDU0kJRW5hYmxlIHdpZGUgKDE2LWJpdHMpIFNDU0kJKi8KKy8qCQkJCQl0cmFuc2Zlci4JCQkqLworLyoJMDMJMAlBTFRQRVJEL0FMVFBECUFsdGVybmF0ZSAoU3luYy4vUGVyaW9kKSBtb2RlLgkqLworLyoJCQkJCQkJCQkqLworLyoJCQlAQCBXaGVuIHRoaXMgYml0IGlzIHNldCwJCQkqLworLyoJCQkgICB0aGUgc3luY2hyb25vdXMgcGVyaW9kIGJpdHMgMjowCQkqLworLyoJCQkgICBpbiB0aGUgU3luY2hyb25vdXMgTW9kZSByZWdpc3RlcgkJKi8KKy8qCQkJICAgYXJlIHVzZWQgdG8gdHJhbnNmZXIgZGF0YQkJCSovCisvKgkJCSAgIGF0IHRoZSBGYXN0LTIwIHJhdGUuCQkJCSovCisvKgkJCUBAIFdoZW4gdGhpcyBiaXQgaXMgdW5zZXQsCQkJKi8KKy8qCQkJICAgdGhlIHN5bmNocm9ub3VzIHBlcmlvZCBiaXRzIDI6MAkJKi8KKy8qCQkJICAgaW4gdGhlIFN5bmNocm9ub3VzIE1vZGUgUmVnaXN0ZXIJCSovCisvKgkJCSAgIGFyZSB1c2VkIHRvIHRyYW5zZmVyIGRhdGEJCQkqLworLyoJCQkgICBhdCB0aGUgRmFzdC0xMCByYXRlIChvciBGYXN0LTQwIHcvIExWRFMpLgkqLworLyoJCQkJCQkJCQkqLworLyoJMDItMDAJMAlQRVJJT0RbMjowXS8JU3luY2hyb25vdXMgU0NTSSBUcmFuc2ZlciBSYXRlLgkqLworLyoJCQlTWFBEWzAyOjAwXQlUaGVzZSAzIGJpdHMgc3BlY2lmeQkJKi8KKy8qCQkJCQl0aGUgU3luY2hyb25vdXMgU0NTSSBUcmFuc2ZlcgkqLworLyoJCQkJCVJhdGUgZm9yIEZhc3QtMjAgYW5kIEZhc3QtMTAuCSovCisvKgkJCQkJVGhlc2UgYml0cyBhcmUgYWxzbyByZXNldAkqLworLyoJCQkJCWJ5IGEgU0NTSSBCdXMgcmVzZXQuCQkqLworLyoJCQkJCQkJCQkqLworLyoJRm9yIEZhc3QtMTAgYml0IEFMVFBEID0gMCBhbmQgTFZEUyA9IDAJCQkJKi8KKy8qCWFuZCBiaXQyLGJpdDEsYml0MCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgOgkJCSovCisvKgkJCQkJCQkJCSovCisvKgkwMDAJMTAwbnMsIDEwLjAgTUh6CQkJCQkJKi8KKy8qCTAwMQkxNTBucywgIDYuNiBNSHoJCQkJCQkqLworLyoJMDEwCTIwMG5zLCAgNS4wIE1IegkJCQkJCSovCisvKgkwMTEJMjUwbnMsICA0LjAgTUh6CQkJCQkJKi8KKy8qCTEwMAkzMDBucywgIDMuMyBNSHoJCQkJCQkqLworLyoJMTAxCTM1MG5zLCAgMi44IE1IegkJCQkJCSovCisvKgkxMTAJNDAwbnMsICAyLjUgTUh6CQkJCQkJKi8KKy8qCTExMQk0NTBucywgIDIuMiBNSHoJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJRm9yIEZhc3QtMjAgYml0IEFMVFBEID0gMSBhbmQgTFZEUyA9IDAJCQkJKi8KKy8qCWFuZCBiaXQyLGJpdDEsYml0MCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgOgkJCSovCisvKgkJCQkJCQkJCSovCisvKgkwMDAJIDUwbnMsIDIwLjAgTUh6CQkJCQkJKi8KKy8qCTAwMQkgNzVucywgMTMuMyBNSHoJCQkJCQkqLworLyoJMDEwCTEwMG5zLCAxMC4wIE1IegkJCQkJCSovCisvKgkwMTEJMTI1bnMsICA4LjAgTUh6CQkJCQkJKi8KKy8qCTEwMAkxNTBucywgIDYuNiBNSHoJCQkJCQkqLworLyoJMTAxCTE3NW5zLCAgNS43IE1IegkJCQkJCSovCisvKgkxMTAJMjAwbnMsICA1LjAgTUh6CQkJCQkJKi8KKy8qCTExMQkyNTBucywgIDQuMCBNSHogICBLRzogTWF5YmUgMjI1bnMsIDQuNCBNSHoJCSovCisvKgkJCQkJCQkJCSovCisvKglGb3IgRmFzdC00MCBiaXQgQUxUUEQgPSAwIGFuZCBMVkRTID0gMQkJCQkqLworLyoJYW5kIGJpdDIsYml0MSxiaXQwIGlzIGRlZmluZWQgYXMgZm9sbG93cyA6CQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCTAwMAkgMjVucywgNDAuMCBNSHoJCQkJCQkqLworLyoJMDAxCSA1MG5zLCAyMC4wIE1IegkJCQkJCSovCisvKgkwMTAJIDc1bnMsIDEzLjMgTUh6CQkJCQkJKi8KKy8qCTAxMQkxMDBucywgMTAuMCBNSHoJCQkJCQkqLworLyoJMTAwCTEyNW5zLCAgOC4wIE1IegkJCQkJCSovCisvKgkxMDEJMTUwbnMsICA2LjYgTUh6CQkJCQkJKi8KKy8qCTExMAkxNzVucywgIDUuNyBNSHoJCQkJCQkqLworLyoJMTExCTIwMG5zLCAgNS4wIE1IegkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX1RBUkdFVElECQkweDg2CS8qIFNDU0kgVGFyZ2V0IElEIChSL1cpCQkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfSURNU0cJCTB4ODcJLyogU0NTSSBJZGVudGlmeSBNZXNzYWdlIChSKQkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfSE9TVElECQkweDg3CS8qIFNDU0kgSG9zdCBJRCAoVykJCQkqLworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9DT1VOVEVSCQkweDg4CS8qIFNDU0kgVHJhbnNmZXIgQ291bnRlciAyNGJpdHMoUi9XKQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0lOVEVOCQkweDhDCS8qIFNDU0kgSW50ZXJydXB0IEVuYWJsZSAoUi9XKQkJKi8KKyNkZWZpbmUgRU5fU0NBTQkJCQkweDgwCS8qIEVuYWJsZSBTQ0FNIHNlbGVjdGlvbiBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgRU5fU0VMRUNUCQkJMHg0MAkvKiBFbmFibGUgc2VsZWN0aW9uIGludGVycnVwdAkJKi8KKyNkZWZpbmUgRU5fU0VMVElNRU9VVAkJCTB4MjAJLyogRW5hYmxlIHNlbGVjdGlvbiB0aW1lb3V0IGludGVycnVwdAkqLworI2RlZmluZSBFTl9ESVNDT05ORUNUCQkJMHgxMAkvKiBFbmFibGUgYnVzIGRpc2Nvbm5lY3RlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgRU5fUkVTRUxFQ1RFRAkJCTB4MDgJLyogRW5hYmxlIHJlc2VsZWN0ZWQgaW50ZXJydXB0CQkqLworI2RlZmluZSBFTl9TQ1NJUkVTRVQJCQkweDA0CS8qIEVuYWJsZSBTQ1NJIHJlc2V0IGRldGVjdGVkIGludGVycnVwdAkqLworI2RlZmluZSBFTl9CVVNTRVJWSUNFCQkJMHgwMgkvKiBFbmFibGUgYnVzIHNlcnZpY2UgaW50ZXJydXB0CQkqLworI2RlZmluZSBFTl9DTURET05FCQkJMHgwMQkvKiBFbmFibGUgU0NTSSBjb21tYW5kIGRvbmUgaW50ZXJydXB0CSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfQ09ORklHMAkJMHg4RAkvKiBTQ1NJIENvbmZpZ3VyYXRpb24gMCAoUi9XKQkJKi8KKyNkZWZpbmUgUEhBU0VMQVRDSAkJCTB4NDAJLyogRW5hYmxlIHBoYXNlIGxhdGNoCQkJKi8KKyNkZWZpbmUgSU5JVElBVE9SCQkJMHgyMAkvKiBFbmFibGUgaW5pdGlhdG9yIG1vZGUJCSovCisjZGVmaW5lIFBBUklUWUNIRUNLCQkJMHgxMAkvKiBFbmFibGUgcGFyaXR5IGNoZWNrCQkJKi8KKyNkZWZpbmUgQkxPQ0tSU1QJCQkweDAxCS8qIERpc2FibGUgU0NTSSByZXNldDEJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX0NPTkZJRzEJCTB4OEUJLyogU0NTSSBDb25maWd1cmF0aW9uIDEgKFIvVykJCSovCisjZGVmaW5lIEFDVElWRV9ORUdQTFVTCQkJMHgxMAkvKiBFbmhhbmNlIGFjdGl2ZSBuZWdhdGlvbgkJKi8KKyNkZWZpbmUgRklMVEVSX0RJU0FCTEUJCQkweDA4CS8qIERpc2FibGUgU0NTSSBkYXRhIGZpbHRlcgkJKi8KKyNkZWZpbmUgRkFTVF9GSUxURVIJCQkweDA0CS8qID8JCQkJCSovCisjZGVmaW5lIEFDVElWRV9ORUcJCQkweDAyCS8qIEVuYWJsZSBhY3RpdmUgbmVnYXRpb24JCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfQ09ORklHMgkJMHg4RgkvKiBTQ1NJIENvbmZpZ3VyYXRpb24gMiAoUi9XKQkJKi8KKyNkZWZpbmUgQ0ZHMl9XSURFRklGTwkJCTB4MDIJLyoJCQkJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfQ09NTUFORAkJMHg5MAkvKiBTQ1NJIENvbW1hbmQgKFIvVykJCQkqLworI2RlZmluZSBTQ01EX0NPTVAJCQkweDEyCS8qIENvbW1hbmQgY29tcGxldGUJCQkqLworI2RlZmluZSBTQ01EX1NFTF9BVE4JCQkweDYwCS8qIFNlbGVjdGlvbiB3aXRoIEFUTgkJCSovCisjZGVmaW5lIFNDTURfU0VMX0FUTjMJCQkweDY0CS8qIFNlbGVjdGlvbiB3aXRoIEFUTjMJCQkqLworI2RlZmluZSBTQ01EX1NFTF9BVE5TVE9QCQkweEI4CS8qIFNlbGVjdGlvbiB3aXRoIEFUTiBhbmQgU3RvcAkJKi8KKyNkZWZpbmUgU0NNRF9GSUZPX09VVAkJCTB4QzAJLyogU0NTSSBGSUZPIHRyYW5zZmVyIG91dAkJKi8KKyNkZWZpbmUgU0NNRF9ETUFfT1VUCQkJMHhDMQkvKiBTQ1NJIERNQSB0cmFuc2ZlciBvdXQJCSovCisjZGVmaW5lIFNDTURfRklGT19JTgkJCTB4QzIJLyogU0NTSSBGSUZPIHRyYW5zZmVyIGluCQkqLworI2RlZmluZSBTQ01EX0RNQV9JTgkJCTB4QzMJLyogU0NTSSBETUEgdHJhbnNmZXIgaW4JCQkqLworI2RlZmluZSBTQ01EX01TR0FDQ0VQVAkJCTB4RDgJLyogTWVzc2FnZSBhY2NlcHQJCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJQ29kZQlDb21tYW5kIERlc2NyaXB0aW9uCQkJCQkqLworLyoJLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQkqLworLyoJMDIJRW5hYmxlIHJlc2VsZWN0aW9uIHdpdGggRklGTwkJCQkqLworLyoJNDAJU2VsZWN0IHdpdGhvdXQgQVROIHdpdGggRklGTwkJCQkqLworLyoJNjAJU2VsZWN0IHdpdGggQVROIHdpdGggRklGTwkJCQkqLworLyoJNjQJU2VsZWN0IHdpdGggQVROMyB3aXRoIEZJRk8JCQkJKi8KKy8qCUEwCVNlbGVjdCB3aXRoIEFUTiBhbmQgc3RvcCB3aXRoIEZJRk8JCQkqLworLyoJQzAJVHJhbnNmZXIgaW5mb3JtYXRpb24gb3V0IHdpdGggRklGTwkJCSovCisvKglDMQlUcmFuc2ZlciBpbmZvcm1hdGlvbiBvdXQgd2l0aCBETUEJCQkqLworLyoJQzIJVHJhbnNmZXIgaW5mb3JtYXRpb24gaW4gd2l0aCBGSUZPCQkJKi8KKy8qCUMzCVRyYW5zZmVyIGluZm9ybWF0aW9uIGluIHdpdGggRE1BCQkJKi8KKy8qCTEyCUluaXRpYXRvciBjb21tYW5kIGNvbXBsZXRlIHdpdGggRklGTwkJCSovCisvKgk1MAlJbml0aWF0b3IgdHJhbnNmZXIgaW5mb3JtYXRpb24gb3V0IHNlcXVlbmNlIHdpdGhvdXQgQVROCSovCisvKgkJd2l0aCBGSUZPCQkJCQkJKi8KKy8qCTcwCUluaXRpYXRvciB0cmFuc2ZlciBpbmZvcm1hdGlvbiBvdXQgc2VxdWVuY2Ugd2l0aCBBVE4JKi8KKy8qCQl3aXRoIEZJRk8JCQkJCQkqLworLyoJNzQJSW5pdGlhdG9yIHRyYW5zZmVyIGluZm9ybWF0aW9uIG91dCBzZXF1ZW5jZSB3aXRoIEFUTjMJKi8KKy8qCQl3aXRoIEZJRk8JCQkJCQkqLworLyoJNTIJSW5pdGlhdG9yIHRyYW5zZmVyIGluZm9ybWF0aW9uIGluIHNlcXVlbmNlIHdpdGhvdXQgQVROCSovCisvKgkJd2l0aCBGSUZPCQkJCQkJKi8KKy8qCTcyCUluaXRpYXRvciB0cmFuc2ZlciBpbmZvcm1hdGlvbiBpbiBzZXF1ZW5jZSB3aXRoIEFUTgkqLworLyoJCXdpdGggRklGTwkJCQkJCSovCisvKgk3NglJbml0aWF0b3IgdHJhbnNmZXIgaW5mb3JtYXRpb24gaW4gc2VxdWVuY2Ugd2l0aCBBVE4zCSovCisvKgkJd2l0aCBGSUZPCQkJCQkJKi8KKy8qCTkwCUluaXRpYXRvciB0cmFuc2ZlciBpbmZvcm1hdGlvbiBvdXQgY29tbWFuZCBjb21wbGV0ZQkqLworLyoJCXdpdGggRklGTwkJCQkJCSovCisvKgk5MglJbml0aWF0b3IgdHJhbnNmZXIgaW5mb3JtYXRpb24gaW4gY29tbWFuZCBjb21wbGV0ZQkqLworLyoJCXdpdGggRklGTwkJCQkJCSovCisvKglEMglFbmFibGUgc2VsZWN0aW9uCQkJCQkqLworLyoJMDgJUmVzZWxlY3Rpb24JCQkJCQkqLworLyoJNDgJRGlzY29ubmVjdCBjb21tYW5kIHdpdGggRklGTwkJCQkqLworLyoJODgJVGVybWluYXRlIGNvbW1hbmQgd2l0aCBGSUZPCQkJCSovCisvKglDOAlUYXJnZXQgY29tbWFuZCBjb21wbGV0ZSB3aXRoIEZJRk8JCQkqLworLyoJMTgJU0NBTSBBcmJpdHJhdGlvbi8gU2VsZWN0aW9uCQkJCSovCisvKgk1QQlFbmFibGUgcmVzZWxlY3Rpb24JCQkJCSovCisvKgk5OAlTZWxlY3Qgd2l0aG91dCBBVE4gd2l0aCBGSUZPCQkJCSovCisvKglCOAlTZWxlY3Qgd2l0aCBBVE4gd2l0aCBGSUZPCQkJCSovCisvKglEOAlNZXNzYWdlIEFjY2VwdGVkCQkJCQkqLworLyoJNTgJTk9QCQkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX1RJTUVPVVQJCTB4OTEJLyogU0NTSSBUaW1lIE91dCBWYWx1ZSAoUi9XKQkJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX1NDU0lfRklGTwkJMHg5OAkvKiBTQ1NJIEZJRk8gKFIvVykJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9TQ1NJX1RDUjAJCTB4OUMJLyogU0NTSSBUYXJnZXQgQ29udHJvbCAwIChSL1cpCQkqLworI2RlZmluZSBUQ1IwX1dJREVfTkVHT19ET05FCQkweDgwMDAJLyogV2lkZSBuZWdvIGRvbmUJCQkqLworI2RlZmluZSBUQ1IwX1NZTkNfTkVHT19ET05FCQkweDQwMDAJLyogU3luY2hyb25vdXMgbmVnbyBkb25lCQkqLworI2RlZmluZSBUQ1IwX0VOQUJMRV9MVkRTCQkweDIwMDAJLyogRW5hYmxlIExWRFMgc3luY2hyb25vdXMJCSovCisjZGVmaW5lIFRDUjBfRU5BQkxFX1dJREUJCTB4MTAwMAkvKiBFbmFibGUgV0lERSBzeW5jaHJvbm91cwkJKi8KKyNkZWZpbmUgVENSMF9FTkFCTEVfQUxUCQkJMHgwODAwCS8qIEVuYWJsZSBhbHRlcm5hdGUgc3luY2hyb25vdXMJCSovCisjZGVmaW5lIFRDUjBfUEVSSU9EX01BU0sJCTB4MDcwMAkvKiBUcmFuc2ZlciByYXRlCQkJKi8KKworI2RlZmluZSBUQ1IwX0RPX1dJREVfTkVHTwkJMHgwMDgwCS8qIERvIHdpZGUgTkVHTwkJCQkqLworI2RlZmluZSBUQ1IwX0RPX1NZTkNfTkVHTwkJMHgwMDQwCS8qIERvIHN5bmMgTkVHTwkJCQkqLworI2RlZmluZSBUQ1IwX0RJU0NPTk5FQ1RfRU4JCTB4MDAyMAkvKiBEaXNjb25uZWN0aW9uIGVuYWJsZQkJCSovCisjZGVmaW5lIFRDUjBfT0ZGU0VUX01BU0sJCTB4MDAxRgkvKiBPZmZzZXQgbnVtYmVyCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfU0NTSV9UQ1IxCQkweDlFCS8qIFNDU0kgVGFyZ2V0IENvbnRyb2wgMSAoUi9XKQkJKi8KKyNkZWZpbmUgTUFYVEFHX01BU0sJCQkweDdGMDAJLyogTWF4aW11bSB0YWdzICgxMjcpCQkJKi8KKyNkZWZpbmUgTk9OX1RBR19CVVNZCQkJMHgwMDgwCS8qIE5vbiB0YWcgY29tbWFuZCBhY3RpdmUJCSovCisjZGVmaW5lIEFDVFRBR19NQVNLCQkJMHgwMDdGCS8qIEFjdGl2ZSB0YWdzCQkJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglUaGUgRE1BIHJlZ2lzdGVyIG9mZnNldCBmb3IgVFJNX1MxMDQwCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0NPTU1BTkQJCTB4QTAJLyogRE1BIENvbW1hbmQgKFIvVykJCQkqLworI2RlZmluZSBETUFDTURfU0cJCQkweDAyCS8qIEVuYWJsZSBIVyBTL0cgc3VwcG9ydAkJKi8KKyNkZWZpbmUgRE1BQ01EX0RJUgkJCTB4MDEJLyogMSA9IHJlYWQgZnJvbSBTQ1NJIHdyaXRlIHRvIEhvc3QJKi8KKyNkZWZpbmUgWEZFUkRBVEFJTl9TRwkJCTB4MDEwMwkvKiBUcmFuc2ZlciBkYXRhIGluICB3LyAgU0cJCSovCisjZGVmaW5lIFhGRVJEQVRBT1VUX1NHCQkJMHgwMTAyCS8qIFRyYW5zZmVyIGRhdGEgb3V0IHcvICBTRwkJKi8KKyNkZWZpbmUgWEZFUkRBVEFJTgkJCTB4MDEwMQkvKiBUcmFuc2ZlciBkYXRhIGluICB3L28gU0cJCSovCisjZGVmaW5lIFhGRVJEQVRBT1VUCQkJMHgwMTAwCS8qIFRyYW5zZmVyIGRhdGEgb3V0IHcvbyBTRwkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0ZJRk9DTlQJCTB4QTEJLyogRE1BIEZJRk8gQ291bnRlciAoUikJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfQ09OVFJPTAkJMHhBMQkvKiBETUEgQ29udHJvbCAoVykJCQkqLworI2RlZmluZSBETUFSRVNFVE1PRFVMRQkJCTB4MTAJLyogUmVzZXQgUENJL0RNQSBtb2R1bGUJCQkqLworI2RlZmluZSBTVE9QRE1BWEZFUgkJCTB4MDgJLyogU3RvcCAgRE1BIHRyYW5zZmVyCQkJKi8KKyNkZWZpbmUgQUJPUlRYRkVSCQkJMHgwNAkvKiBBYm9ydCBETUEgdHJhbnNmZXIJCQkqLworI2RlZmluZSBDTFJYRklGTwkJCTB4MDIJLyogQ2xlYXIgRE1BIHRyYW5zZmVyIEZJRk8JCSovCisjZGVmaW5lIFNUQVJURE1BWEZFUgkJCTB4MDEJLyogU3RhcnQgRE1BIHRyYW5zZmVyCQkJKi8KKworI2RlZmluZSBUUk1fUzEwNDBfRE1BX0ZJRk9TVEFUCQkweEEyCS8qIERNQSBGSUZPIFN0YXR1cyAoUikJCQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfU1RBVFVTCQkweEEzCS8qIERNQSBJbnRlcnJ1cHQgU3RhdHVzIChSL1cpCQkqLworI2RlZmluZSBYRkVSUEVORElORwkJCTB4ODAJLyogVHJhbnNmZXIgcGVuZGluZwkJCSovCisjZGVmaW5lIFNDU0lCVVNZCQkJMHg0MAkvKiBTQ1NJIGJ1c3kJCQkJKi8KKyNkZWZpbmUgR0xPQkFMSU5UCQkJMHgyMAkvKiBETUFfSU5URU4gYml0IDAtNCBzZXQJCSovCisjZGVmaW5lIEZPUkNFRE1BQ09NUAkJCTB4MTAJLyogRm9yY2UgRE1BIHRyYW5zZmVyIGNvbXBsZXRlCQkqLworI2RlZmluZSBETUFYRkVSRVJST1IJCQkweDA4CS8qIERNQSB0cmFuc2ZlciBlcnJvcgkJCSovCisjZGVmaW5lIERNQVhGRVJBQk9SVAkJCTB4MDQJLyogRE1BIHRyYW5zZmVyIGFib3J0CQkJKi8KKyNkZWZpbmUgRE1BWEZFUkNPTVAJCQkweDAyCS8qIEJ1cyBNYXN0ZXIgWEZFUiBDb21wbGV0ZSBzdGF0dXMJKi8KKyNkZWZpbmUgU0NTSUNPTVAJCQkweDAxCS8qIFNDU0kgY29tcGxldGUgaW50ZXJydXB0CQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfSU5URU4JCTB4QTQJLyogRE1BIEludGVycnVwdCBFbmFibGUgKFIvVykJCSovCisjZGVmaW5lIEVOX0ZPUkNFRE1BQ09NUAkJCTB4MTAJLyogRm9yY2UgRE1BIHRyYW5zZmVyIGNvbXBsZXRlCQkqLworI2RlZmluZSBFTl9ETUFYRkVSRVJST1IJCQkweDA4CS8qIERNQSB0cmFuc2ZlciBlcnJvcgkJCSovCisjZGVmaW5lIEVOX0RNQVhGRVJBQk9SVAkJCTB4MDQJLyogRE1BIHRyYW5zZmVyIGFib3J0CQkJKi8KKyNkZWZpbmUgRU5fRE1BWEZFUkNPTVAJCQkweDAyCS8qIEJ1cyBNYXN0ZXIgWEZFUiBDb21wbGV0ZSBzdGF0dXMJKi8KKyNkZWZpbmUgRU5fU0NTSUlOVFIJCQkweDAxCS8qIEVuYWJsZSBTQ1NJIGNvbXBsZXRlIGludGVycnVwdAkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfQ09ORklHCQkweEE2CS8qIERNQSBDb25maWd1cmF0aW9uIChSL1cpCQkqLworI2RlZmluZSBETUFfRU5IQU5DRQkJCTB4ODAwMAkvKiBFbmFibGUgRE1BIGVuaGFuY2UgZmVhdHVyZSAoU0c/KQkqLworI2RlZmluZSBETUFfUENJX0RVQUxfQUREUgkJMHg0MDAwCS8qCQkJCQkqLworI2RlZmluZSBETUFfQ0ZHX1JFUwkJCTB4MjAwMAkvKiBBbHdheXMgMQkJCQkqLworI2RlZmluZSBETUFfQVVUT19DTFJfRklGTwkJMHgxMDAwCS8qIERJU2FibGUgRE1BIGF1dG8gY2xlYXIgRklGTwkJKi8KKyNkZWZpbmUgRE1BX01FTV9NVUxUSV9SRUFECQkweDA4MDAJLyoJCQkJCSovCisjZGVmaW5lIERNQV9NRU1fV1JJVEVfSU5WQUwJCTB4MDQwMAkvKiBNZW1vcnkgd3JpdGUgYW5kIGludmFsaWRhdGUJCSovCisjZGVmaW5lIERNQV9GSUZPX0NUUkwJCQkweDAzMDAJLyogQ29udHJvbCBGSUZPIG9wZXJhdGlvbiB3aXRoIERNQQkqLworI2RlZmluZSBETUFfRklGT19IQUxGX0hBTEYJCTB4MDIwMAkvKiBLZWVwIGhhbGYgZmlsbGVkIG9uIGJvdGggcmVhZC93cml0ZQkqLworCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfWENOVAkJMHhBOAkvKiBETUEgVHJhbnNmZXIgQ291bnRlciAoUi9XKSwgMjRiaXRzCSovCisjZGVmaW5lIFRSTV9TMTA0MF9ETUFfQ1hDTlQJCTB4QUMJLyogRE1BIEN1cnJlbnQgVHJhbnNmZXIgQ291bnRlciAoUikJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0RNQV9YTE9XQUREUgkJMHhCMAkvKiBETUEgVHJhbnNmZXIgUGh5c2ljYWwgTG93IEFkZHJlc3MJKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0RNQV9YSElHSEFERFIJCTB4QjQJLyogRE1BIFRyYW5zZmVyIFBoeXNpY2FsIEhpZ2ggQWRkcmVzcwkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJVGhlIGdlbmVyYWwgcmVnaXN0ZXIgb2Zmc2V0IGZvciBUUk1fUzEwNDAJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFJNX1MxMDQwX0dFTl9DT05UUk9MCQkweEQ0CS8qIEdsb2JhbCBDb250cm9sCQkJKi8KKyNkZWZpbmUgQ1RSTF9MRUQJCQkweDgwCS8qIENvbnRyb2wgb25ib2FyZCBMRUQJCQkqLworI2RlZmluZSBFTl9FRVBST00JCQkweDEwCS8qIEVuYWJsZSBFRVBST00gcHJvZ3JhbW1pbmcJCSovCisjZGVmaW5lIERJU19URVJNCQkJMHgwOAkvKiBEaXNhYmxlIG9uYm9hcmQgdGVybWluYXRpb24JCSovCisjZGVmaW5lIEFVVE9URVJNCQkJMHgwNAkvKiBFbmFibGUgQXV0byBTQ1NJIHRlcm1pbmF0b3IJCSovCisjZGVmaW5lIExPVzhURVJNCQkJMHgwMgkvKiBFbmFibGUgTG93ZXIgOCBiaXQgU0NTSSB0ZXJtaW5hdG9yCSovCisjZGVmaW5lIFVQOFRFUk0JCQkJMHgwMQkvKiBFbmFibGUgVXBwZXIgOCBiaXQgU0NTSSB0ZXJtaW5hdG9yCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX0dFTl9TVEFUVVMJCTB4RDUJLyogR2xvYmFsIFN0YXR1cwkJCSovCisjZGVmaW5lIEdUSU1FT1VUCQkJMHg4MAkvKiBHbG9iYWwgdGltZXIgcmVhY2ggMAkJCSovCisjZGVmaW5lIEVYVDY4SElHSAkJCTB4NDAJLyogSGlnaGVyIDggYml0IGNvbm5lY3RlZCBleHRlcm5hbGx5CSovCisjZGVmaW5lIElOVDY4SElHSAkJCTB4MjAJLyogSGlnaGVyIDggYml0IGNvbm5lY3RlZCBpbnRlcm5hbGx5CSovCisjZGVmaW5lIENPTjUwNjgJCQkJMHgxMAkvKiBFeHRlcm5hbCA1MC82OCBwaW4gY29ubmVjdGVkIChsb3cpCSovCisjZGVmaW5lIENPTjY4CQkJCTB4MDgJLyogSW50ZXJuYWwgNjggcGluIGNvbm5lY3RlZCAobG93KQkqLworI2RlZmluZSBDT041MAkJCQkweDA0CS8qIEludGVybmFsIDUwIHBpbiBjb25uZWN0ZWQgKGxvdyEpCSovCisjZGVmaW5lIFdJREVTQ1NJCQkJMHgwMgkvKiBXaWRlIFNDU0kgY2FyZAkJCSovCisjZGVmaW5lIFNUQVRVU19MT0FEX0RFRkFVTFQJCTB4MDEJLyoJCQkJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX0dFTl9OVlJBTQkJMHhENgkvKiBTZXJpYWwgTk9OLVZPTEFUSUxFIFJBTSBwb3J0CQkqLworI2RlZmluZSBOVlJfQklUT1VUCQkJMHgwOAkvKiBTZXJpYWwgZGF0YSBvdXQJCQkqLworI2RlZmluZSBOVlJfQklUSU4JCQkweDA0CS8qIFNlcmlhbCBkYXRhIGluCQkJKi8KKyNkZWZpbmUgTlZSX0NMT0NLCQkJMHgwMgkvKiBTZXJpYWwgY2xvY2sJCQkJKi8KKyNkZWZpbmUgTlZSX1NFTEVDVAkJCTB4MDEJLyogU2VyaWFsIHNlbGVjdAkJCSovCisKKyNkZWZpbmUgVFJNX1MxMDQwX0dFTl9FREFUQQkJMHhENwkvKiBQYXJhbGxlbCBFRVBST00gZGF0YSBwb3J0CQkqLworI2RlZmluZSBUUk1fUzEwNDBfR0VOX0VBRERSRVNTCQkweEQ4CS8qIFBhcmFsbGVsIEVFUFJPTSBhZGRyZXNzCQkqLworI2RlZmluZSBUUk1fUzEwNDBfR0VOX1RJTUVSCQkweERCCS8qIEdsb2JhbCB0aW1lcgkJCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJTnZtVGFyQ2ZnMDogVGFyZ2V0IGNvbmZpZ3VyYXRpb24gYnl0ZSAwIDouLnBEQ0ItPkRldk1vZGUJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5UQ19ET19XSURFX05FR08JCTB4MjAJLyogV2lkZSBuZWdvdGlhdGUJCQkqLworI2RlZmluZSBOVENfRE9fVEFHX1FVRVVFSU5HCQkweDEwCS8qIEVuYWJsZSBTQ1NJIHRhZyBxdWV1aW5nCQkqLworI2RlZmluZSBOVENfRE9fU0VORF9TVEFSVAkJMHgwOAkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQgU1BJTlVQCQkqLworI2RlZmluZSBOVENfRE9fRElTQ09OTkVDVAkJMHgwNAkvKiBFbmFibGUgU0NTSSBkaXNjb25uZWN0CQkqLworI2RlZmluZSBOVENfRE9fU1lOQ19ORUdPCQkweDAyCS8qIFN5bmMgbmVnb3RpYXRpb24JCQkqLworI2RlZmluZSBOVENfRE9fUEFSSVRZX0NISwkJMHgwMQkvKiAoaXQgc291bGQgZGVmaW5lIGF0IE5BQykJCSovCisJCQkJCQkvKiBQYXJpdHkgY2hlY2sgZW5hYmxlCQkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCU52cmFtIEluaXRpYXRlciBiaXRzIGRlZmluaXRpb24JCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIDAKKyNkZWZpbmUgTU9SRTJfRFJWCQkJQklUMAorI2RlZmluZSBHUkVBVEVSXzFHCQkJQklUMQorI2RlZmluZSBSU1RfU0NTSV9CVVMJCQlCSVQyCisjZGVmaW5lIEFDVElWRV9ORUdBVElPTgkJCUJJVDMKKyNkZWZpbmUgTk9fU0VFSwkJCQlCSVQ0CisjZGVmaW5lIExVTl9DSEVDSwkJCUJJVDUKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJTnZyYW0gQWRhcHRlciBDZmcgYml0cyBkZWZpbml0aW9uCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOQUNfU0NBTkxVTgkJCTB4MjAJLyogSW5jbHVkZSBMVU4gYXMgQklPUyBkZXZpY2UJCSovCisjZGVmaW5lIE5BQ19QT1dFUk9OX1NDU0lfUkVTRVQJCTB4MDQJLyogUG93ZXIgb24gcmVzZXQgZW5hYmxlCQkqLworI2RlZmluZSBOQUNfR1JFQVRFUl8xRwkJCTB4MDIJLyogPiAxRyBzdXBwb3J0IGVuYWJsZQkJCSovCisjZGVmaW5lIE5BQ19HVDJEUklWRVMJCQkweDAxCS8qIFN1cHBvcnQgbW9yZSB0aGFuIDIgZHJpdmVzCQkqLworLyogI2RlZmluZSBOQUNfRE9fUEFSSVRZX0NISwkJMHgwOCAqLwkvKiBQYXJpdHkgY2hlY2sgZW5hYmxlCQkJKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGVjX2VzcC5jIGIvZHJpdmVycy9zY3NpL2RlY19lc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTVmOTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RlY19lc3AuYwpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIGRlY19lc3AuYzogRHJpdmVyIGZvciBTQ1NJIGNoaXBzIG9uIElPQVNJQyBiYXNlZCBUVVJCT2NoYW5uZWwgREVDc3RhdGlvbnMKKyAqICAgICAgICAgICAgYW5kIFRVUkJPY2hhbm5lbCBQTUFaLUEgY2FyZHMKKyAqCisgKiBUVVJCT2NoYW5uZWwgY2hhbmdlcyBieSBIYXJhbGQgS29lcmZnZW4KKyAqIFBNQVotQSBzdXBwb3J0IGJ5IERhdmlkIEFpcmxpZQorICoKKyAqIGJhc2VkIG9uIGphenpfZXNwLmM6CisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZSkKKyAqCisgKiBqYXp6X2VzcCBpcyBiYXNlZCBvbiBEYXZpZCBTLiBNaWxsZXIncyBFU1AgZHJpdmVyIGFuZCBjeWJlcl9lc3AKKyAqCisgKiAyMDAwMDgxOSAtIFNtYWxsIFBNQVotQUEgZml4ZXMgYnkgRmxvcmlhbiBMb2hvZmYgPGZsb0ByZmM4MjIub3JnPgorICogICAgICAgICAgICBCZSB3YXJuZWQgdGhlIFBNQVotQUEgd29ya3MgY3VycmVudGx5IGFzIGEgc2luZ2xlIGNhcmQuCisgKiAgICAgICAgICAgIERvbnQgdHJ5IHRvIHB1dCBtdWx0aXBsZSBjYXJkcyBpbiBvbmUgbWFjaGluZSAtIFRoZXkgYXJlCisgKiAgICAgICAgICAgIGJvdGggZGV0ZWN0ZWQgYnV0IGl0IG1heSBjcmFzaCB1bmRlciBoaWdoIGxvYWQgZ2FyYmxpbmcgeW91cgorICogICAgICAgICAgICBkYXRhLgorICogMjAwMDEwMDUJLSBJbml0aWFsaXphdGlvbiBmaXhlcyBmb3IgMi40LjAtdGVzdDkKKyAqIAkJCSAgRmxvcmlhbiBMb2hvZmYgPGZsb0ByZmM4MjIub3JnPgorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgTWFjaWVqIFcuIFJvenlja2kKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2RlYy9pbnRlcnJ1cHRzLmg+CisjaW5jbHVkZSA8YXNtL2RlYy9pb2FzaWMuaD4KKyNpbmNsdWRlIDxhc20vZGVjL2lvYXNpY19hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9kZWMvaW9hc2ljX2ludHMuaD4KKyNpbmNsdWRlIDxhc20vZGVjL21hY2h0eXBlLmg+CisjaW5jbHVkZSA8YXNtL2RlYy90Yy5oPgorCisjZGVmaW5lIERFQ19TQ1NJX1NSRUcgMAorI2RlZmluZSBERUNfU0NTSV9ETUFSRUcgMHg0MDAwMAorI2RlZmluZSBERUNfU0NTSV9TUkFNIDB4ODAwMDAKKyNkZWZpbmUgREVDX1NDU0lfRElBRyAweEMwMDAwCisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCk7CitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApOworc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2coc3RydWN0IHNjc2lfY21uZCAqIHNwKTsKKworc3RhdGljIHZvaWQgcG1hel9kbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgcG1hel9kbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSk7CitzdGF0aWMgdm9pZCBwbWF6X2RtYV9tbXVfZ2V0X3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCk7CisKKyNkZWZpbmUgVENfRVNQX1JBTV9TSVpFIDB4MjAwMDAKKyNkZWZpbmUgRVNQX1RHVF9ETUFfU0laRSAoKFRDX0VTUF9SQU1fU0laRS83KSAmIH4oc2l6ZW9mKGludCktMSkpCisjZGVmaW5lIEVTUF9OQ01EIDcKKworI2RlZmluZSBUQ19FU1BfRE1BUl9NQVNLICAweDFmZmZmCisjZGVmaW5lIFRDX0VTUF9ETUFSX1dSSVRFIDB4ODAwMDAwMDAKKyNkZWZpbmUgVENfRVNQX0RNQV9BRERSKHgpICgodW5zaWduZWQpKHgpICYgVENfRVNQX0RNQVJfTUFTSykKKwordTMyIGVzcF92aXJ0X2J1ZmZlcjsKK2ludCBzY3NpX2N1cnJlbnRfbGVuZ3RoOworCit2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbMTZdOwordm9sYXRpbGUgdW5zaWduZWQgY2hhciBwbWF6X2NtZF9idWZmZXJbMTZdOworCQkJCS8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQKKwkJCQkgKiBiZWZvcmUgdGhleSBhcmUgdHJhc2ZlcmVkIHRvIHRoZSBFU1AgY2hpcAorCQkJCSAqIHZpYSBQSU8uCisJCQkJICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX2RtYV9tZXJyX2ludChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfZXJyX2ludChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfaW50KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworc3RhdGljIGludCBkZWNfZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCk7CisKK3N0YXRpYyBpbnQgZGVjX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJkZWNfZXNwIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJOQ1I1M0M5NCIsCisJLmRldGVjdAkJCT0gZGVjX2VzcF9kZXRlY3QsCisJLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKKwkucmVsZWFzZQkJPSBkZWNfZXNwX3JlbGVhc2UsCisJLmluZm8JCQk9IGVzcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLworc3RhdGljIGludCBkZWNfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJc3RydWN0IENvbmZpZ0RldiAqZXNwX2RldjsKKwlpbnQgc2xvdDsKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydDsKKworCWlmIChJT0FTSUMpIHsKKwkJZXNwX2RldiA9IDA7CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBlc3BfZGV2KTsKKworCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KKwkJZXNwLT5kb19waW9fY21kcyA9IDE7CisKKwkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKKwkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKworCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYmFycmllciA9IDA7CisJCWVzcC0+ZG1hX2RyYWluID0gJmRtYV9kcmFpbjsKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7CisJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKKwkJZXNwLT5kbWFfcG9sbCA9IDA7CisJCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKKwkJZXNwLT5kbWFfbGVkX29mZiA9IDA7CisJCWVzcC0+ZG1hX2xlZF9vbiA9IDA7CisKKwkJLyogdmlydHVhbCBETUEgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSAmZG1hX21tdV9nZXRfc2NzaV9vbmU7CisJCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAmZG1hX21tdV9nZXRfc2NzaV9zZ2w7CisJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gMDsKKwkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAwOworCQllc3AtPmRtYV9hZHZhbmNlX3NnID0gJmRtYV9hZHZhbmNlX3NnOworCisKKwkJLyogU0NTSSBjaGlwIHNwZWVkICovCisJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKKworCQllc3AtPmRyZWdzID0gMDsKKworCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLworCQllc3AtPmVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKSAoc3lzdGVtX2Jhc2UgKyBJT0FTSUNfU0NTSSk7CisKKwkJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCQllc3AtPmVzcF9jb21tYW5kID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgY21kX2J1ZmZlcjsKKworCQkvKiBnZXQgdmlydHVhbCBkbWEgYWRkcmVzcyBmb3IgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19waHlzKGNtZF9idWZmZXIpOworCisJCWVzcC0+aXJxID0gZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ107CisKKwkJZXNwLT5zY3NpX2lkID0gNzsKKworCQkvKiBDaGVjayBmb3IgZGlmZmVyZW50aWFsIFNDU0ktYnVzICovCisJCWVzcC0+ZGlmZiA9IDA7CisKKwkJZXNwX2luaXRpYWxpemUoZXNwKTsKKworCQlpZiAocmVxdWVzdF9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyLCBTQV9JTlRFUlJVUFQsCisJCQkJIm5jcjUzYzk0IiwgZXNwLT5laG9zdCkpCisJCQlnb3RvIGVycl9kZWFsbG9jOworCQlpZiAocmVxdWVzdF9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19NRVJSXSwKKwkJCQlzY3NpX2RtYV9tZXJyX2ludCwgU0FfSU5URVJSVVBULAorCQkJCSJuY3I1M2M5NCBlcnJvciIsIGVzcC0+ZWhvc3QpKQorCQkJZ290byBlcnJfZnJlZV9pcnE7CisJCWlmIChyZXF1ZXN0X2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sCisJCQkJc2NzaV9kbWFfZXJyX2ludCwgU0FfSU5URVJSVVBULAorCQkJCSJuY3I1M2M5NCBvdmVycnVuIiwgZXNwLT5laG9zdCkpCisJCQlnb3RvIGVycl9mcmVlX2lycV9tZXJyOworCQlpZiAocmVxdWVzdF9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19ETUFdLAorCQkJCXNjc2lfZG1hX2ludCwgU0FfSU5URVJSVVBULAorCQkJCSJuY3I1M2M5NCBkbWEiLCBlc3AtPmVob3N0KSkKKwkJCWdvdG8gZXJyX2ZyZWVfaXJxX2VycjsKKworCX0KKworCWlmIChUVVJCT0NIQU5ORUwpIHsKKwkJd2hpbGUgKChzbG90ID0gc2VhcmNoX3RjX2NhcmQoIlBNQVotQUEiKSkgPj0gMCkgeworCQkJY2xhaW1fdGNfY2FyZChzbG90KTsKKworCQkJZXNwX2RldiA9IDA7CisJCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgZXNwX2Rldik7CisKKwkJCW1lbV9zdGFydCA9IGdldF90Y19iYXNlX2FkZHIoc2xvdCk7CisKKwkJCS8qIFN0b3JlIGJhc2UgYWRkciBpbnRvIGVzcCBzdHJ1Y3QgKi8KKwkJCWVzcC0+c2xvdCA9IFBIWVNBRERSKG1lbV9zdGFydCk7CisKKwkJCWVzcC0+ZHJlZ3MgPSAwOworCQkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikgKG1lbV9zdGFydCArIERFQ19TQ1NJX1NSRUcpOworCQkJZXNwLT5kb19waW9fY21kcyA9IDE7CisKKwkJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBwbWF6X2NtZF9idWZmZXI7CisKKwkJCS8qIGdldCB2aXJ0dWFsIGRtYSBhZGRyZXNzIGZvciBjb21tYW5kIGJ1ZmZlciAqLworCQkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19waHlzKHBtYXpfY21kX2J1ZmZlcik7CisKKwkJCWVzcC0+Y2ZyZXEgPSBnZXRfdGNfc3BlZWQoKTsKKworCQkJZXNwLT5pcnEgPSBnZXRfdGNfaXJxX25yKHNsb3QpOworCisJCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwkJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKKwkJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmcG1hel9kbWFfaW5pdF9yZWFkOworCQkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZwbWF6X2RtYV9pbml0X3dyaXRlOworCQkJZXNwLT5kbWFfaW50c19vZmYgPSAmcG1hel9kbWFfaW50c19vZmY7CisJCQllc3AtPmRtYV9pbnRzX29uID0gJnBtYXpfZG1hX2ludHNfb247CisJCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQkJZXNwLT5kbWFfc2V0dXAgPSAmcG1hel9kbWFfc2V0dXA7CisKKwkJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLworCQkJZXNwLT5kbWFfYmFycmllciA9IDA7CisJCQllc3AtPmRtYV9kcmFpbiA9ICZwbWF6X2RtYV9kcmFpbjsKKwkJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOworCQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKKwkJCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKKwkJCWVzcC0+ZG1hX3BvbGwgPSAwOworCQkJZXNwLT5kbWFfcmVzZXQgPSAwOworCQkJZXNwLT5kbWFfbGVkX29mZiA9IDA7CisJCQllc3AtPmRtYV9sZWRfb24gPSAwOworCisJCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gcG1hel9kbWFfbW11X2dldF9zY3NpX29uZTsKKwkJCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAwOworCQkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUgPSAwOworCQkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAwOworCQkJZXNwLT5kbWFfYWR2YW5jZV9zZyA9IDA7CisKKyAJCQlpZiAocmVxdWVzdF9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyLCBTQV9JTlRFUlJVUFQsCisgCQkJCQkgIlBNQVpfQUEiLCBlc3AtPmVob3N0KSkgeworIAkJCQllc3BfZGVhbGxvY2F0ZShlc3ApOworIAkJCQlyZWxlYXNlX3RjX2NhcmQoc2xvdCk7CisgCQkJCWNvbnRpbnVlOworIAkJCX0KKwkJCWVzcC0+c2NzaV9pZCA9IDc7CisJCQllc3AtPmRpZmYgPSAwOworCQkJZXNwX2luaXRpYWxpemUoZXNwKTsKKwkJfQorCX0KKworCWlmKG5lc3BzKSB7CisJCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLCBlc3BzX2luX3VzZSk7CisJCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOworCQlyZXR1cm4gZXNwc19pbl91c2U7CisJfQorCXJldHVybiAwOworCitlcnJfZnJlZV9pcnFfZXJyOgorCWZyZWVfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfRVJSXSwgc2NzaV9kbWFfZXJyX2ludCk7CitlcnJfZnJlZV9pcnFfbWVycjoKKwlmcmVlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX01FUlJdLCBzY3NpX2RtYV9tZXJyX2ludCk7CitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyKTsKK2Vycl9kZWFsbG9jOgorCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX2RtYV9tZXJyX2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50aygiR290IHVuZXhwZWN0ZWQgU0NTSSBETUEgSW50ZXJydXB0ISA8ICIpOworCXByaW50aygiU0NTSV9ETUFfTUVNUkRFUlIgIik7CisJcHJpbnRrKCI+XG4iKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2Vycl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBlbXB0eSAqLworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIHNjc2lfbmV4dF9wdHI7CisKKwlzY3NpX25leHRfcHRyID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfRE1BX1ApOworCisJLyogbmV4dCBwYWdlICovCisJc2NzaV9uZXh0X3B0ciA9ICgoKHNjc2lfbmV4dF9wdHIgPj4gMykgKyBQQUdFX1NJWkUpICYgUEFHRV9NQVNLKSA8PCAzOworCWlvYXNpY193cml0ZShJT19SRUdfU0NTSV9ETUFfQlAsIHNjc2lfbmV4dF9wdHIpOworCWZhc3RfaW9iKCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJcmV0dXJuIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kcmFpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXUzMiBudywgZGF0YTAsIGRhdGExLCBzY3NpX2RhdGFfcHRyOworCXUxNiAqcDsKKworCW53ID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfU0NSKTsKKworCS8qCisJICogSXMgdGhlcmUgc29tZXRoaW5nIGluIHRoZSBkbWEgYnVmZmVycyBsZWZ0PworCSAqLworCWlmIChudykgeworCQlzY3NpX2RhdGFfcHRyID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfRE1BX1ApID4+IDM7CisJCXAgPSBwaHlzX3RvX3ZpcnQoc2NzaV9kYXRhX3B0cik7CisJCXN3aXRjaCAobncpIHsKKwkJY2FzZSAxOgorCQkJZGF0YTAgPSBpb2FzaWNfcmVhZChJT19SRUdfU0NTSV9TRFIwKTsKKwkJCXBbMF0gPSBkYXRhMCAmIDB4ZmZmZjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhMCA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX1NEUjApOworCQkJcFswXSA9IGRhdGEwICYgMHhmZmZmOworCQkJcFsxXSA9IChkYXRhMCA+PiAxNikgJiAweGZmZmY7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZGF0YTAgPSBpb2FzaWNfcmVhZChJT19SRUdfU0NTSV9TRFIwKTsKKwkJCWRhdGExID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfU0RSMSk7CisJCQlwWzBdID0gZGF0YTAgJiAweGZmZmY7CisJCQlwWzFdID0gKGRhdGEwID4+IDE2KSAmIDB4ZmZmZjsKKwkJCXBbMl0gPSBkYXRhMSAmIDB4ZmZmZjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJTdHJhbmdlOiAlZCB3b3JkcyBpbiBkbWEgYnVmZmVyIGxlZnRcbiIsIG53KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqIHNwKQoreworCXJldHVybiBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXUzMiBzY3NpX25leHRfcHRyLCBpb2FzaWNfc3NyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodmFkZHJlc3MgJiAzKQorCQlwYW5pYygiZGVjX2VzcC5jOiB1bmFibGUgdG8gaGFuZGxlIHBhcnRpYWwgd29yZCB0cmFuc2ZlcnMsIHlldC4uLiIpOworCisJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykgcGh5c190b192aXJ0KHZhZGRyZXNzKSwgbGVuZ3RoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKKworCWZhc3RfbWIoKTsKKwlpb2FzaWNfc3NyID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NTUik7CisKKwlpb2FzaWNfc3NyICY9IH5JT19TU1JfU0NTSV9ETUFfRU47CisJaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsIGlvYXNpY19zc3IpOworCisJZmFzdF93bWIoKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfU0NSLCAwKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX1AsIHZhZGRyZXNzIDw8IDMpOworCisJLyogcHJlcGFyZSBmb3IgbmV4dCBwYWdlICovCisJc2NzaV9uZXh0X3B0ciA9ICgodmFkZHJlc3MgKyBQQUdFX1NJWkUpICYgUEFHRV9NQVNLKSA8PCAzOworCWlvYXNpY193cml0ZShJT19SRUdfU0NTSV9ETUFfQlAsIHNjc2lfbmV4dF9wdHIpOworCisJaW9hc2ljX3NzciB8PSAoSU9fU1NSX1NDU0lfRE1BX0RJUiB8IElPX1NTUl9TQ1NJX0RNQV9FTik7CisJZmFzdF93bWIoKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NTUiwgaW9hc2ljX3Nzcik7CisKKwlmYXN0X2lvYigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpCit7CisJdTMyIHNjc2lfbmV4dF9wdHIsIGlvYXNpY19zc3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh2YWRkcmVzcyAmIDMpCisJCXBhbmljKCJkZWNfZXNwLmM6IHVuYWJsZSB0byBoYW5kbGUgcGFydGlhbCB3b3JkIHRyYW5zZmVycywgeWV0Li4uIik7CisKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSBwaHlzX3RvX3ZpcnQodmFkZHJlc3MpLCBsZW5ndGgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOworCisJZmFzdF9tYigpOworCWlvYXNpY19zc3IgPSBpb2FzaWNfcmVhZChJT19SRUdfU1NSKTsKKworCWlvYXNpY19zc3IgJj0gfihJT19TU1JfU0NTSV9ETUFfRElSIHwgSU9fU1NSX1NDU0lfRE1BX0VOKTsKKwlpb2FzaWNfd3JpdGUoSU9fUkVHX1NTUiwgaW9hc2ljX3Nzcik7CisKKwlmYXN0X3dtYigpOworCWlvYXNpY193cml0ZShJT19SRUdfU0NTSV9TQ1IsIDApOworCWlvYXNpY193cml0ZShJT19SRUdfU0NTSV9ETUFfUCwgdmFkZHJlc3MgPDwgMyk7CisKKwkvKiBwcmVwYXJlIGZvciBuZXh0IHBhZ2UgKi8KKwlzY3NpX25leHRfcHRyID0gKCh2YWRkcmVzcyArIFBBR0VfU0laRSkgJiBQQUdFX01BU0spIDw8IDM7CisJaW9hc2ljX3dyaXRlKElPX1JFR19TQ1NJX0RNQV9CUCwgc2NzaV9uZXh0X3B0cik7CisKKwlpb2FzaWNfc3NyIHw9IElPX1NTUl9TQ1NJX0RNQV9FTjsKKwlmYXN0X3dtYigpOworCWlvYXNpY193cml0ZShJT19SRUdfU1NSLCBpb2FzaWNfc3NyKTsKKworCWZhc3RfaW9iKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hc2ljX3Nzcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWRpc2FibGVfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfRE1BXSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJZW5hYmxlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0RNQV0pOworfQorCitzdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCXJldHVybiAoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cyAmIEVTUF9TVEFUX0lOVFIpOworfQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyoKKwkgKiBGSVhNRTogd2hhdCdzIHRoaXMgZ29vZCBmb3I/CisJICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJLyoKKwkgKiBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCisJICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCisJICovCisJaWYgKHdyaXRlKQorCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOworCWVsc2UKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKK3sKKwlzcC0+U0NwLnB0ciA9IChjaGFyICopdmlydF90b19waHlzKHNwLT5yZXF1ZXN0X2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKK3sKKwlpbnQgc3ogPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNwLT5TQ3AuYnVmZmVyOworCisJd2hpbGUgKHN6ID49IDApIHsKKwkJc2dbc3pdLmRtYV9hZGRyZXNzID0gcGFnZV90b19waHlzKHNnW3N6XS5wYWdlKSArIHNnW3N6XS5vZmZzZXQ7CisJCXN6LS07CisJfQorCXNwLT5TQ3AucHRyID0gKGNoYXIgKikoc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2coc3RydWN0IHNjc2lfY21uZCAqIHNwKQoreworCXNwLT5TQ3AucHRyID0gKGNoYXIgKikoc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQgcG1hel9kbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwltZW1jcHkocGh5c190b192aXJ0KGVzcF92aXJ0X2J1ZmZlciksCisJCSh2b2lkICopS1NFRzFBRERSKGVzcC0+c2xvdCArIERFQ19TQ1NJX1NSQU0gKyBFU1BfVEdUX0RNQV9TSVpFKSwKKwkJc2NzaV9jdXJyZW50X2xlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpCit7CisJdm9sYXRpbGUgdTMyICpkbWFyZWcgPQorCQkodm9sYXRpbGUgdTMyICopS1NFRzFBRERSKGVzcC0+c2xvdCArIERFQ19TQ1NJX0RNQVJFRyk7CisKKwlpZiAobGVuZ3RoID4gRVNQX1RHVF9ETUFfU0laRSkKKwkJbGVuZ3RoID0gRVNQX1RHVF9ETUFfU0laRTsKKworCSpkbWFyZWcgPSBUQ19FU1BfRE1BX0FERFIoRVNQX1RHVF9ETUFfU0laRSk7CisKKwlpb2IoKTsKKworCWVzcF92aXJ0X2J1ZmZlciA9IHZhZGRyZXNzOworCXNjc2lfY3VycmVudF9sZW5ndGggPSBsZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXZvbGF0aWxlIHUzMiAqZG1hcmVnID0KKwkJKHZvbGF0aWxlIHUzMiAqKUtTRUcxQUREUihlc3AtPnNsb3QgKyBERUNfU0NTSV9ETUFSRUcpOworCisJbWVtY3B5KCh2b2lkICopS1NFRzFBRERSKGVzcC0+c2xvdCArIERFQ19TQ1NJX1NSQU0gKyBFU1BfVEdUX0RNQV9TSVpFKSwKKwkgICAgICAgcGh5c190b192aXJ0KHZhZGRyZXNzKSwgbGVuZ3RoKTsKKworCXdtYigpOworCSpkbWFyZWcgPSBUQ19FU1BfRE1BUl9XUklURSB8IFRDX0VTUF9ETUFfQUREUihFU1BfVEdUX0RNQV9TSVpFKTsKKworCWlvYigpOworfQorCitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworfQorCitzdGF0aWMgdm9pZCBwbWF6X2RtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7Cit9CisKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwkvKgorCSAqIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKwkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKwkgKi8KKwlpZiAod3JpdGUpCisJCXBtYXpfZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKwllbHNlCisJCXBtYXpfZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtYXpfZG1hX21tdV9nZXRfc2NzaV9vbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqIHNwKQoreworCXNwLT5TQ3AucHRyID0gKGNoYXIgKil2aXJ0X3RvX3BoeXMoc3AtPnJlcXVlc3RfYnVmZmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kbXgzMTkxZC5jIGIvZHJpdmVycy9zY3NpL2RteDMxOTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyMjQyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kbXgzMTkxZC5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICAgIGRteDMxOTFkLmMgLSBkcml2ZXIgZm9yIHRoZSBEb21leCBETVgzMTkxRCBTQ1NJIGNhcmQuCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIGJ5IE1hc3NpbW8gUGljY2lvbmkgPGRhZmFzdGlkaW9AbGliZXJvLml0PgorICAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCBieSBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KKworICAgIEJhc2VkIG9uIHRoZSBnZW5lcmljIE5DUjUzODAgZHJpdmVyIGJ5IERyZXcgRWNraGFyZHQgZXQgYWwuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisvKgorICogRGVmaW50aW9ucyBmb3IgdGhlIGdlbmVyaWMgNTM4MCBkcml2ZXIuCisgKi8KKyNkZWZpbmUgQVVUT1NFTlNFCisKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykJCWluYihwb3J0ICsgcmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpCW91dGIodmFsdWUsIHBvcnQgKyByZWcpCisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMJdW5zaWduZWQgaW50IHBvcnQKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkJCU5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzCisjZGVmaW5lIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpCQlwb3J0ID0gaW5zdGFuY2UtPmlvX3BvcnQKKworLyoKKyAqIEluY2x1ZGVzIG5lZWRlZCBmb3IgTkNSNTM4MC5bY2hdIChYWFg6IE1vdmUgdGhlbSB0byBOQ1I1MzgwLmgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInNjc2kuaCIKKworI2luY2x1ZGUgIk5DUjUzODAuaCIKKyNpbmNsdWRlICJOQ1I1MzgwLmMiCisKKyNkZWZpbmUgRE1YMzE5MURfRFJJVkVSX05BTUUJImRteDMxOTFkIgorI2RlZmluZSBETVgzMTkxRF9SRUdJT05fTEVOCTgKKworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkbXgzMTkxZF9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSBETVgzMTkxRF9EUklWRVJfTkFNRSwKKwkubmFtZQkJCT0gIkRvbWV4IERNWDMxOTFEIiwKKwkucXVldWVjb21tYW5kCQk9IE5DUjUzODBfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IE5DUjUzODBfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gTkNSNTM4MF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyPSBOQ1I1MzgwX2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gTkNSNTM4MF9ob3N0X3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gMzIsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZG14MzE5MWRfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJdW5zaWduZWQgbG9uZyBpbzsKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKworCWlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIERNWDMxOTFEX1JFR0lPTl9MRU4sIERNWDMxOTFEX0RSSVZFUl9OQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgImRteDMxOTE6IHJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IHJlc2VydmVkXG4iLAorCQkJCWlvLCBpbyArIERNWDMxOTFEX1JFR0lPTl9MRU4pOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZG14MzE5MWRfZHJpdmVyX3RlbXBsYXRlLAorCQkJc2l6ZW9mKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKSk7CisJaWYgKCFzaG9zdCkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247ICAgICAgIAorCXNob3N0LT5pb19wb3J0ID0gaW87CisJc2hvc3QtPmlycSA9IHBkZXYtPmlycTsKKworCU5DUjUzODBfaW5pdChzaG9zdCwgRkxBR19OT19QU0VVRE9fRE1BIHwgRkxBR19EVEMzMTgxRSk7CisKKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBOQ1I1MzgwX2ludHIsIFNBX1NISVJRLAorCQkJCURNWDMxOTFEX0RSSVZFUl9OQU1FLCBzaG9zdCkpIHsKKwkJLyoKKwkJICogU3RlYW0gcG93ZXJlZCBzY3NpIGNvbnRyb2xsZXJzIHJ1biB3aXRob3V0IGFuIElSUSBhbnl3YXkKKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRteDMxOTE6IElSUSAlZCBub3QgYXZhaWxhYmxlIC0gIgorCQkJCSAgICAic3dpdGNoaW5nIHRvIHBvbGxlZCBtb2RlLlxuIiwgcGRldi0+aXJxKTsKKwkJc2hvc3QtPmlycSA9IFNDU0lfSVJRX05PTkU7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHNob3N0KTsKKworCWVycm9yID0gc2NzaV9hZGRfaG9zdChzaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9mcmVlX2lycTsKKworCXNjc2lfc2Nhbl9ob3N0KHNob3N0KTsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX2lycToKKwlmcmVlX2lycShzaG9zdC0+aXJxLCBzaG9zdCk7Cisgb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBETVgzMTkxRF9SRUdJT05fTEVOKTsKKyBvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkbXgzMTkxZF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisKKwlOQ1I1MzgwX2V4aXQoc2hvc3QpOworCisJaWYgKHNob3N0LT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOworCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBETVgzMTkxRF9SRUdJT05fTEVOKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRteDMxOTFkX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9ET01FWCwgUENJX0RFVklDRV9JRF9ET01FWF9ETVgzMTkxRCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRteDMxOTFkX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZG14MzE5MWRfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBETVgzMTkxRF9EUklWRVJfTkFNRSwKKwkuaWRfdGFibGUJPSBkbXgzMTkxZF9wY2lfdGJsLAorCS5wcm9iZQkJPSBkbXgzMTkxZF9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkbXgzMTkxZF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRteDMxOTFkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkbXgzMTkxZF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRteDMxOTFkX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRteDMxOTFkX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkbXgzMTkxZF9pbml0KTsKK21vZHVsZV9leGl0KGRteDMxOTFkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXNzaW1vIFBpY2Npb25pIDxkYWZhc3RpZGlvQGxpYmVyby5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRG9tZXggRE1YMzE5MUQgU0NTSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pMm8uaCBiL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pMm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU4NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2kyby5oCkBAIC0wLDAgKzEsNDU5IEBACisjaWZuZGVmIF9TQ1NJX0kyT19ICisjZGVmaW5lIF9TQ1NJX0kyT19ICisKKy8qIEkyTyBrZXJuZWwgc3BhY2UgYWNjZXNzaWJsZSBzdHJ1Y3R1cmVzL0FQSXMKKyAqCisgKiAoYykgQ29weXJpZ2h0IDE5OTksIDIwMDAgUmVkIEhhdCBTb2Z0d2FyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZWQgdGhlIEkyTyBBUElzL3N0cnVjdHVyZXMgZm9yIHVzZSBieQorICogdGhlIEkyTyBrZXJuZWwgbW9kdWxlcy4KKyAqCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18gICAgICAgLyogVGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIGJ5IGtlcm5lbCBvbmx5ICovCisKKyNpbmNsdWRlIDxsaW51eC9pMm8tZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+IC8qIE5lZWRlZCBmb3IgTVVURVggaW5pdCBtYWNyb3MgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKworLyoKKyAqCVR1bmFibGUgcGFyYW1ldGVycyBmaXJzdAorICovCisKKy8qIEhvdyBtYW55IGRpZmZlcmVudCBPU00ncyBhcmUgd2UgYWxsb3dpbmcgKi8gCisjZGVmaW5lIE1BWF9JMk9fTU9EVUxFUwkJNjQKKworI2RlZmluZSBJMk9fRVZUX0NBUEFCSUxJVFlfT1RIRVIJCTB4MDEKKyNkZWZpbmUgSTJPX0VWVF9DQVBBQklMSVRZX0NIQU5HRUQJCTB4MDIKKworI2RlZmluZSBJMk9fRVZUX1NFTlNPUl9TVEFURV9DSEFOR0VECQkweDAxCisKKy8vI2lmZGVmIF9fS0VSTkVMX18gICAvKiBpb2N0bCBzdHVmZiBvbmx5IHRoaW5nIGV4cG9ydGVkIHRvIHVzZXJzICovCisKKyNkZWZpbmUgSTJPX01BWF9NQU5BR0VSUwk0CisKKy8qCisgKglJMk8gSW50ZXJmYWNlIE9iamVjdHMKKyAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApCisKKyNkZWZpbmUgREVDTEFSRV9NVVRFWChuYW1lKSBzdHJ1Y3Qgc2VtYXBob3JlIG5hbWU9TVVURVgKKwordHlwZWRlZiBzdHJ1Y3Qgd2FpdF9xdWV1ZSAqYWRwdF93YWl0X3F1ZXVlX2hlYWRfdDsKKyNkZWZpbmUgQURQVF9ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KSBhZHB0X3dhaXRfcXVldWVfaGVhZF90IHdhaXQgPSBOVUxMCit0eXBlZGVmIHN0cnVjdCB3YWl0X3F1ZXVlIGFkcHRfd2FpdF9xdWV1ZV90OworI2Vsc2UKKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KK3R5cGVkZWYgd2FpdF9xdWV1ZV9oZWFkX3QgYWRwdF93YWl0X3F1ZXVlX2hlYWRfdDsKKyNkZWZpbmUgQURQVF9ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KSBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KQordHlwZWRlZiB3YWl0X3F1ZXVlX3QgYWRwdF93YWl0X3F1ZXVlX3Q7CisKKyNlbmRpZgorLyoKKyAqIG1lc3NhZ2Ugc3RydWN0dXJlcworICovCisKK3N0cnVjdCBpMm9fbWVzc2FnZQoreworCXU4CXZlcnNpb25fb2Zmc2V0OworCXU4CWZsYWdzOworCXUxNglzaXplOworCXUzMgl0YXJnZXRfdGlkOjEyOworCXUzMglpbml0X3RpZDoxMjsKKwl1MzIJZnVuY3Rpb246ODsJCisJdTMyCWluaXRpYXRvcl9jb250ZXh0OworCS8qIExpc3QgZm9sbG93cyAqLworfTsKKworc3RydWN0IGFkcHRfZGV2aWNlOworc3RydWN0IF9hZHB0X2hiYTsKK3N0cnVjdCBpMm9fZGV2aWNlCit7CisJc3RydWN0IGkyb19kZXZpY2UgKm5leHQ7CS8qIENoYWluICovCisJc3RydWN0IGkyb19kZXZpY2UgKnByZXY7CisKKwljaGFyIGRldl9uYW1lWzhdOwkJLyogbGludXggL2RldiBuYW1lIGlmIGF2YWlsYWJsZSAqLworCWkyb19sY3RfZW50cnkgbGN0X2RhdGE7LyogRGV2aWNlIExDVCBpbmZvcm1hdGlvbiAqLworCXUzMiBmbGFnczsJCQorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSogcHJvY19lbnRyeTsJLyogL3Byb2MgZGlyICovCisJc3RydWN0IGFkcHRfZGV2aWNlICpvd25lcjsKKwlzdHJ1Y3QgX2FkcHRfaGJhICpjb250cm9sbGVyOwkvKiBDb250cm9sbGluZyBJT1AgKi8KK307CisKKy8qCisgKglFYWNoIEkyTyBjb250cm9sbGVyIGhhcyBvbmUgb2YgdGhlc2Ugb2JqZWN0cworICovCisgCitzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIKK3sKKwljaGFyIG5hbWVbMTZdOworCWludCB1bml0OworCWludCB0eXBlOworCWludCBlbmFibGVkOworCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpldmVudF9ub3RpZmVyOwkvKiBFdmVudHMgKi8KKwlhdG9taWNfdCB1c2VyczsKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2aWNlczsJCS8qIEkyTyBkZXZpY2UgY2hhaW4gKi8KKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKm5leHQ7CQkvKiBDb250cm9sbGVyIGNoYWluICovCisKK307CisKKy8qCisgKiBJMk8gU3lzdGVtIHRhYmxlIGVudHJ5CisgKi8KK3N0cnVjdCBpMm9fc3lzX3RibF9lbnRyeQoreworCXUxNglvcmdfaWQ7CisJdTE2CXJlc2VydmVkMTsKKwl1MzIJaW9wX2lkOjEyOworCXUzMglyZXNlcnZlZDI6MjA7CisJdTE2CXNlZ19udW06MTI7CisJdTE2IAlpMm9fdmVyc2lvbjo0OworCXU4IAlpb3Bfc3RhdGU7CisJdTggCW1zZ190eXBlOworCXUxNglmcmFtZV9zaXplOworCXUxNglyZXNlcnZlZDM7CisJdTMyCWxhc3RfY2hhbmdlZDsKKwl1MzIJaW9wX2NhcGFiaWxpdGllczsKKwl1MzIJaW5ib3VuZF9sb3c7CisJdTMyCWluYm91bmRfaGlnaDsKK307CisKK3N0cnVjdCBpMm9fc3lzX3RibAoreworCXU4IAludW1fZW50cmllczsKKwl1OCAJdmVyc2lvbjsKKwl1MTYgCXJlc2VydmVkMTsKKwl1MzIJY2hhbmdlX2luZDsKKwl1MzIJcmVzZXJ2ZWQyOworCXUzMglyZXNlcnZlZDM7CisJc3RydWN0IGkyb19zeXNfdGJsX2VudHJ5IGlvcHNbMF07Cit9OwkKKworLyoKKyAqCUkyTyBjbGFzc2VzIC8gc3ViY2xhc3NlcworICovCisKKy8qICBDbGFzcyBJRCBhbmQgQ29kZSBBc3NpZ25tZW50cworICogIChMQ1QuQ2xhc3NJRC5WZXJzaW9uIGZpZWxkKQorICovCisjZGVmaW5lICAgIEkyT19DTEFTU19WRVJTSU9OXzEwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICBJMk9fQ0xBU1NfVkVSU0lPTl8xMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworLyogIENsYXNzIGNvZGUgbmFtZXMKKyAqICAoZnJvbSB2MS41IFRhYmxlIDYtMSBDbGFzcyBDb2RlIEFzc2lnbm1lbnRzLikKKyAqLworIAorI2RlZmluZSAgICBJMk9fQ0xBU1NfRVhFQ1VUSVZFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwCisjZGVmaW5lICAgIEkyT19DTEFTU19ERE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFICAgICAgICAgICAgICAweDAxMAorI2RlZmluZSAgICBJMk9fQ0xBU1NfU0VRVUVOVElBTF9TVE9SQUdFICAgICAgICAgICAgICAgIDB4MDExCisjZGVmaW5lICAgIEkyT19DTEFTU19MQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1dBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMAorI2RlZmluZSAgICBJMk9fQ0xBU1NfRklCUkVfQ0hBTk5FTF9QT1JUICAgICAgICAgICAgICAgIDB4MDQwCisjZGVmaW5lICAgIEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BFUklQSEVSQUwgICAgICAgICAgMHgwNDEKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1NDU0lfUEVSSVBIRVJBTCAgICAgICAgICAgICAgICAgICAweDA1MQorI2RlZmluZSAgICBJMk9fQ0xBU1NfQVRFX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwCisjZGVmaW5lICAgIEkyT19DTEFTU19BVEVfUEVSSVBIRVJBTCAgICAgICAgICAgICAgICAgICAgMHgwNjEKKyNkZWZpbmUgICAgSTJPX0NMQVNTX0ZMT1BQWV9DT05UUk9MTEVSICAgICAgICAgICAgICAgICAweDA3MAorI2RlZmluZSAgICBJMk9fQ0xBU1NfRkxPUFBZX0RFVklDRSAgICAgICAgICAgICAgICAgICAgIDB4MDcxCisjZGVmaW5lICAgIEkyT19DTEFTU19CVVNfQURBUFRFUl9QT1JUICAgICAgICAgICAgICAgICAgMHgwODAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUX0FHRU5UICAgICAgICAgICAgICAweDA5MAorI2RlZmluZSAgICBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlQgICAgICAgICAgICAgICAgICAgIDB4MDkxCisKKy8qICBSZXN0IG9mIDB4MDkyIC0gMHgwOWYgcmVzZXJ2ZWQgZm9yIHBlZXItdG8tcGVlciBjbGFzc2VzCisgKi8KKyAKKyNkZWZpbmUgICAgSTJPX0NMQVNTX01BVENIX0FOWUNMQVNTICAgICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisKKy8qICBTdWJjbGFzc2VzCisgKi8KKworI2RlZmluZSAgICBJMk9fU1VCQ0xBU1NfaTk2MCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxCisjZGVmaW5lICAgIEkyT19TVUJDTEFTU19IRE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAKKyNkZWZpbmUgICAgSTJPX1NVQkNMQVNTX0lTTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMQorIAorLyogT3BlcmF0aW9uIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIEkyT19QQVJBTVNfRklFTERfR0VUCTB4MDAwMQorI2RlZmluZSBJMk9fUEFSQU1TX0xJU1RfR0VUCTB4MDAwMgorI2RlZmluZSBJMk9fUEFSQU1TX01PUkVfR0VUCTB4MDAwMworI2RlZmluZSBJMk9fUEFSQU1TX1NJWkVfR0VUCTB4MDAwNAorI2RlZmluZSBJMk9fUEFSQU1TX1RBQkxFX0dFVAkweDAwMDUKKyNkZWZpbmUgSTJPX1BBUkFNU19GSUVMRF9TRVQJMHgwMDA2CisjZGVmaW5lIEkyT19QQVJBTVNfTElTVF9TRVQJMHgwMDA3CisjZGVmaW5lIEkyT19QQVJBTVNfUk9XX0FERAkweDAwMDgKKyNkZWZpbmUgSTJPX1BBUkFNU19ST1dfREVMRVRFCTB4MDAwOQorI2RlZmluZSBJMk9fUEFSQU1TX1RBQkxFX0NMRUFSCTB4MDAwQQorCisvKgorICoJSTJPIHNlcmlhbCBudW1iZXIgY29udmVudGlvbnMgLyBmb3JtYXRzCisgKgkoY2lyY2EgdjEuNSkKKyAqLworCisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICBJMk9fU05GT1JNQVRfQklOQVJZICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX0FTQ0lJICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9VTklDT0RFICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSAgICBJMk9fU05GT1JNQVRfTEFONDhfTUFDICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX1dBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisKKy8qIFBsdXMgbmV3IGluIHYyLjAgKFllbGxvd3N0b25lIHBkZiBkb2MpCisgKi8KKworI2RlZmluZSAgICBJMk9fU05GT1JNQVRfTEFONjRfTUFDICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX0RETSAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lICAgIEkyT19TTkZPUk1BVF9JRUVFX1JFRzY0ICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSAgICBJMk9fU05GT1JNQVRfSUVFRV9SRUcxMjggICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgICAgSTJPX1NORk9STUFUX1VOS05PV04yICAgICAgICAgICAgICAgICAgICAgICAweGZmCisKKy8qIFRyYW5zYWN0aW9uIFJlcGx5IExpc3RzIChUUkwpIENvbnRyb2wgV29yZCBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBUUkxfU0lOR0xFX0ZJWEVEX0xFTkdUSAkJMHgwMAorI2RlZmluZSBUUkxfU0lOR0xFX1ZBUklBQkxFX0xFTkdUSAkweDQwCisjZGVmaW5lIFRSTF9NVUxUSVBMRV9GSVhFRF9MRU5HVEgJMHg4MAorCisvKgorICoJTWVzc2FnaW5nIEFQSSB2YWx1ZXMKKyAqLworIAorI2RlZmluZQlJMk9fQ01EX0FEQVBURVJfQVNTSUdOCQkweEIzCisjZGVmaW5lCUkyT19DTURfQURBUFRFUl9SRUFECQkweEIyCisjZGVmaW5lCUkyT19DTURfQURBUFRFUl9SRUxFQVNFCQkweEI1CisjZGVmaW5lCUkyT19DTURfQklPU19JTkZPX1NFVAkJMHhBNQorI2RlZmluZQlJMk9fQ01EX0JPT1RfREVWSUNFX1NFVAkJMHhBNworI2RlZmluZQlJMk9fQ01EX0NPTkZJR19WQUxJREFURQkJMHhCQgorI2RlZmluZQlJMk9fQ01EX0NPTk5fU0VUVVAJCTB4Q0EKKyNkZWZpbmUJSTJPX0NNRF9ERE1fREVTVFJPWQkJMHhCMQorI2RlZmluZQlJMk9fQ01EX0RETV9FTkFCTEUJCTB4RDUKKyNkZWZpbmUJSTJPX0NNRF9ERE1fUVVJRVNDRQkJMHhDNworI2RlZmluZQlJMk9fQ01EX0RETV9SRVNFVAkJMHhEOQorI2RlZmluZQlJMk9fQ01EX0RETV9TVVNQRU5ECQkweEFGCisjZGVmaW5lCUkyT19DTURfREVWSUNFX0FTU0lHTgkJMHhCNworI2RlZmluZQlJMk9fQ01EX0RFVklDRV9SRUxFQVNFCQkweEI5CisjZGVmaW5lCUkyT19DTURfSFJUX0dFVAkJCTB4QTgKKyNkZWZpbmUJSTJPX0NNRF9BREFQVEVSX0NMRUFSCQkweEJFCisjZGVmaW5lCUkyT19DTURfQURBUFRFUl9DT05ORUNUCQkweEM5CisjZGVmaW5lCUkyT19DTURfQURBUFRFUl9SRVNFVAkJMHhCRAorI2RlZmluZQlJMk9fQ01EX0xDVF9OT1RJRlkJCTB4QTIKKyNkZWZpbmUJSTJPX0NNRF9PVVRCT1VORF9JTklUCQkweEExCisjZGVmaW5lCUkyT19DTURfUEFUSF9FTkFCTEUJCTB4RDMKKyNkZWZpbmUJSTJPX0NNRF9QQVRIX1FVSUVTQ0UJCTB4QzUKKyNkZWZpbmUJSTJPX0NNRF9QQVRIX1JFU0VUCQkweEQ3CisjZGVmaW5lCUkyT19DTURfU1RBVElDX01GX0NSRUFURQkweERECisjZGVmaW5lCUkyT19DTURfU1RBVElDX01GX1JFTEVBU0UJMHhERgorI2RlZmluZQlJMk9fQ01EX1NUQVRVU19HRVQJCTB4QTAKKyNkZWZpbmUJSTJPX0NNRF9TV19ET1dOTE9BRAkJMHhBOQorI2RlZmluZQlJMk9fQ01EX1NXX1VQTE9BRAkJMHhBQgorI2RlZmluZQlJMk9fQ01EX1NXX1JFTU9WRQkJMHhBRAorI2RlZmluZQlJMk9fQ01EX1NZU19FTkFCTEUJCTB4RDEKKyNkZWZpbmUJSTJPX0NNRF9TWVNfTU9ESUZZCQkweEMxCisjZGVmaW5lCUkyT19DTURfU1lTX1FVSUVTQ0UJCTB4QzMKKyNkZWZpbmUJSTJPX0NNRF9TWVNfVEFCX1NFVAkJMHhBMworCisjZGVmaW5lIEkyT19DTURfVVRJTF9OT1AJCTB4MDAKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0FCT1JUCQkweDAxCisjZGVmaW5lIEkyT19DTURfVVRJTF9DTEFJTQkJMHgwOQorI2RlZmluZSBJMk9fQ01EX1VUSUxfUkVMRUFTRQkJMHgwQgorI2RlZmluZSBJMk9fQ01EX1VUSUxfUEFSQU1TX0dFVAkJMHgwNgorI2RlZmluZSBJMk9fQ01EX1VUSUxfUEFSQU1TX1NFVAkJMHgwNQorI2RlZmluZSBJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSCTB4MTMKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0VWVF9BQ0sJCTB4MTQKKyNkZWZpbmUgSTJPX0NNRF9VVElMX0NPTkZJR19ESUFMT0cJMHgxMAorI2RlZmluZSBJMk9fQ01EX1VUSUxfREVWSUNFX1JFU0VSVkUJMHgwRAorI2RlZmluZSBJMk9fQ01EX1VUSUxfREVWSUNFX1JFTEVBU0UJMHgwRgorI2RlZmluZSBJMk9fQ01EX1VUSUxfTE9DSwkJMHgxNworI2RlZmluZSBJMk9fQ01EX1VUSUxfTE9DS19SRUxFQVNFCTB4MTkKKyNkZWZpbmUgSTJPX0NNRF9VVElMX1JFUExZX0ZBVUxUX05PVElGWQkweDE1CisKKyNkZWZpbmUgSTJPX0NNRF9TQ1NJX0VYRUMJCTB4ODEKKyNkZWZpbmUgSTJPX0NNRF9TQ1NJX0FCT1JUCQkweDgzCisjZGVmaW5lIEkyT19DTURfU0NTSV9CVVNSRVNFVAkJMHgyNworCisjZGVmaW5lIEkyT19DTURfQkxPQ0tfUkVBRAkJMHgzMAorI2RlZmluZSBJMk9fQ01EX0JMT0NLX1dSSVRFCQkweDMxCisjZGVmaW5lIEkyT19DTURfQkxPQ0tfQ0ZMVVNICQkweDM3CisjZGVmaW5lIEkyT19DTURfQkxPQ0tfTUxPQ0sJCTB4NDkKKyNkZWZpbmUgSTJPX0NNRF9CTE9DS19NVU5MT0NLCQkweDRCCisjZGVmaW5lIEkyT19DTURfQkxPQ0tfTU1PVU5UCQkweDQxCisjZGVmaW5lIEkyT19DTURfQkxPQ0tfTUVKRUNUCQkweDQzCisKKyNkZWZpbmUgSTJPX1BSSVZBVEVfTVNHCQkJMHhGRgorCisvKgorICoJSW5pdCBPdXRib3VuZCBRIHN0YXR1cyAKKyAqLworIAorI2RlZmluZSBJMk9fQ01EX09VVEJPVU5EX0lOSVRfSU5fUFJPR1JFU1MJMHgwMQorI2RlZmluZSBJMk9fQ01EX09VVEJPVU5EX0lOSVRfUkVKRUNURUQJCTB4MDIKKyNkZWZpbmUgSTJPX0NNRF9PVVRCT1VORF9JTklUX0ZBSUxFRAkJMHgwMworI2RlZmluZSBJMk9fQ01EX09VVEJPVU5EX0lOSVRfQ09NUExFVEUJCTB4MDQKKworLyoKKyAqCUkyTyBHZXQgU3RhdHVzIFN0YXRlIHZhbHVlcyAKKyAqLworCisjZGVmaW5lCUFEQVBURVJfU1RBVEVfSU5JVElBTElaSU5HCQkweDAxCisjZGVmaW5lCUFEQVBURVJfU1RBVEVfUkVTRVQJCQkweDAyCisjZGVmaW5lCUFEQVBURVJfU1RBVEVfSE9MRAkJCTB4MDQKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9SRUFEWQkJCTB4MDUKKyNkZWZpbmUJQURBUFRFUl9TVEFURV9PUEVSQVRJT05BTAkJMHgwOAorI2RlZmluZQlBREFQVEVSX1NUQVRFX0ZBSUxFRAkJCTB4MTAKKyNkZWZpbmUJQURBUFRFUl9TVEFURV9GQVVMVEVECQkJMHgxMQorCQorLyogSTJPIEFQSSBmdW5jdGlvbiByZXR1cm4gdmFsdWVzICovCisKKyNkZWZpbmUgSTJPX1JUTl9OT19FUlJPUgkJCTAKKyNkZWZpbmUgSTJPX1JUTl9OT1RfSU5JVAkJCTEKKyNkZWZpbmUgSTJPX1JUTl9GUkVFX1FfRU1QVFkJCQkyCisjZGVmaW5lIEkyT19SVE5fVENCX0VSUk9SCQkJMworI2RlZmluZSBJMk9fUlROX1RSQU5TQUNUSU9OX0VSUk9SCQk0CisjZGVmaW5lIEkyT19SVE5fQURBUFRFUl9BTFJFQURZX0lOSVQJCTUKKyNkZWZpbmUgSTJPX1JUTl9NQUxMT0NfRVJST1IJCQk2CisjZGVmaW5lIEkyT19SVE5fQURQVFJfTk9UX1JFR0lTVEVSRUQJCTcKKyNkZWZpbmUgSTJPX1JUTl9NU0dfUkVQTFlfVElNRU9VVAkJOAorI2RlZmluZSBJMk9fUlROX05PX1NUQVRVUwkJCTkKKyNkZWZpbmUgSTJPX1JUTl9OT19GSVJNX1ZFUgkJCTEwCisjZGVmaW5lCUkyT19SVE5fTk9fTElOS19TUEVFRAkJCTExCisKKy8qIFJlcGx5IG1lc3NhZ2Ugc3RhdHVzIGRlZmluZXMgZm9yIGFsbCBtZXNzYWdlcyAqLworCisjZGVmaW5lIEkyT19SRVBMWV9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgCTB4MDAKKyNkZWZpbmUgSTJPX1JFUExZX1NUQVRVU19BQk9SVF9ESVJUWSAgICAgICAgICAgICAgICAJMHgwMQorI2RlZmluZSBJMk9fUkVQTFlfU1RBVFVTX0FCT1JUX05PX0RBVEFfVFJBTlNGRVIgICAgIAkweDAyCisjZGVmaW5lCUkyT19SRVBMWV9TVEFUVVNfQUJPUlRfUEFSVElBTF9UUkFOU0ZFUgkJMHgwMworI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX0VSUk9SX0RJUlRZCQkJMHgwNAorI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX0VSUk9SX05PX0RBVEFfVFJBTlNGRVIJCTB4MDUKKyNkZWZpbmUJSTJPX1JFUExZX1NUQVRVU19FUlJPUl9QQVJUSUFMX1RSQU5TRkVSCQkweDA2CisjZGVmaW5lCUkyT19SRVBMWV9TVEFUVVNfUFJPQ0VTU19BQk9SVF9ESVJUWQkJMHgwOAorI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX1BST0NFU1NfQUJPUlRfTk9fREFUQV9UUkFOU0ZFUgkweDA5CisjZGVmaW5lCUkyT19SRVBMWV9TVEFUVVNfUFJPQ0VTU19BQk9SVF9QQVJUSUFMX1RSQU5TRkVSCTB4MEEKKyNkZWZpbmUJSTJPX1JFUExZX1NUQVRVU19UUkFOU0FDVElPTl9FUlJPUgkJMHgwQgorI2RlZmluZQlJMk9fUkVQTFlfU1RBVFVTX1BST0dSRVNTX1JFUE9SVAkJMHg4MAorCisvKiBTdGF0dXMgY29kZXMgYW5kIEVycm9yIEluZm9ybWF0aW9uIGZvciBQYXJhbWV0ZXIgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfU1VDQ0VTUwkJMHgwMAorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19CQURfS0VZX0FCT1JUCQkweDAxCisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX0JBRF9LRVlfQ09OVElOVUUgICAJMHgwMgorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19CVUZGRVJfRlVMTAkJMHgwMworI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19CVUZGRVJfVE9PX1NNQUxMCTB4MDQKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfRklFTERfVU5SRUFEQUJMRQkweDA1CisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX0ZJRUxEX1VOV1JJVEVBQkxFCTB4MDYKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfSU5TVUZGSUNJRU5UX0ZJRUxEUwkweDA3CisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX0lOVkFMSURfR1JPVVBfSUQJMHgwOAorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19JTlZBTElEX09QRVJBVElPTgkweDA5CisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX05PX0tFWV9GSUVMRAkJMHgwQQorI2RlZmluZSBJMk9fUEFSQU1TX1NUQVRVU19OT19TVUNIX0ZJRUxECQkweDBCCisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX05PTl9EWU5BTUlDX0dST1VQCTB4MEMKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfT1BFUkFUSU9OX0VSUk9SCTB4MEQKKyNkZWZpbmUgSTJPX1BBUkFNU19TVEFUVVNfU0NBTEFSX0VSUk9SCQkweDBFCisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX1RBQkxFX0VSUk9SCQkweDBGCisjZGVmaW5lIEkyT19QQVJBTVNfU1RBVFVTX1dST05HX0dST1VQX1RZUEUJMHgxMAorCisvKiBEZXRhaWxlZFN0YXR1c0NvZGUgZGVmaW5lcyBmb3IgRXhlY3V0aXZlLCBERE0sIFV0aWwgYW5kIFRyYW5zYWN0aW9uIGVycm9yCisgKiBtZXNzYWdlczogVGFibGUgMy0yIERldGFpbGVkIFN0YXR1cyBDb2Rlcy4qLworCisjZGVmaW5lIEkyT19EU0NfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBJMk9fRFNDX0JBRF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSTJPX0RTQ19UQ0xfRVJST1IgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEkyT19EU0NfUkVQTFlfQlVGRkVSX0ZVTEwgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJMk9fRFNDX05PX1NVQ0hfUEFHRSAgICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgSTJPX0RTQ19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VfU09GVCAgICAgMHgwMDA2CisjZGVmaW5lIEkyT19EU0NfSU5TVUZGSUNJRU5UX1JFU09VUkNFX0hBUkQgICAgIDB4MDAwNworI2RlZmluZSBJMk9fRFNDX0NIQUlOX0JVRkZFUl9UT09fTEFSR0UgICAgICAgICAweDAwMDkKKyNkZWZpbmUgSTJPX0RTQ19VTlNVUFBPUlRFRF9GVU5DVElPTiAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIEkyT19EU0NfREVWSUNFX0xPQ0tFRCAgICAgICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBJMk9fRFNDX0RFVklDRV9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgSTJPX0RTQ19JTkFQUFJPUFJJQVRFX0ZVTkNUSU9OICAgICAgICAgMHgwMDBECisjZGVmaW5lIEkyT19EU0NfSU5WQUxJRF9JTklUSUFUT1JfQUREUkVTUyAgICAgIDB4MDAwRQorI2RlZmluZSBJMk9fRFNDX0lOVkFMSURfTUVTU0FHRV9GTEFHUyAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgSTJPX0RTQ19JTlZBTElEX09GRlNFVCAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEkyT19EU0NfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBJMk9fRFNDX0lOVkFMSURfUkVRVUVTVCAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgSTJPX0RTQ19JTlZBTElEX1RBUkdFVF9BRERSRVNTICAgICAgICAgMHgwMDEzCisjZGVmaW5lIEkyT19EU0NfTUVTU0FHRV9UT09fTEFSR0UgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBJMk9fRFNDX01FU1NBR0VfVE9PX1NNQUxMICAgICAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgSTJPX0RTQ19NSVNTSU5HX1BBUkFNRVRFUiAgICAgICAgICAgICAgMHgwMDE2CisjZGVmaW5lIEkyT19EU0NfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNworI2RlZmluZSBJMk9fRFNDX1VOS05PV05fRVJST1IgICAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgSTJPX0RTQ19VTktOT1dOX0ZVTkNUSU9OICAgICAgICAgICAgICAgMHgwMDE5CisjZGVmaW5lIEkyT19EU0NfVU5TVVBQT1JURURfVkVSU0lPTiAgICAgICAgICAgIDB4MDAxQQorI2RlZmluZSBJMk9fRFNDX0RFVklDRV9CVVNZICAgICAgICAgICAgICAgICAgICAweDAwMUIKKyNkZWZpbmUgSTJPX0RTQ19ERVZJQ0VfTk9UX0FWQUlMQUJMRSAgICAgICAgICAgMHgwMDFDCisKKy8qIERldmljZSBDbGFpbSBUeXBlcyAqLworI2RlZmluZQlJMk9fQ0xBSU1fUFJJTUFSWQkJCQkJMHgwMTAwMDAwMAorI2RlZmluZQlJMk9fQ0xBSU1fTUFOQUdFTUVOVAkJCQkJMHgwMjAwMDAwMAorI2RlZmluZQlJMk9fQ0xBSU1fQVVUSE9SSVpFRAkJCQkJMHgwMzAwMDAwMAorI2RlZmluZQlJMk9fQ0xBSU1fU0VDT05EQVJZCQkJCQkweDA0MDAwMDAwCisgCisvKiBNZXNzYWdlIGhlYWRlciBkZWZpbmVzIGZvciBWZXJzaW9uT2Zmc2V0ICovCisjZGVmaW5lIEkyT1ZFUjE1CTB4MDAwMQorI2RlZmluZSBJMk9WRVIyMAkweDAwMDIKKy8qIERlZmF1bHQgaXMgMS41LCBGSVhNRTogTmVlZCBzdXBwb3J0IGZvciBib3RoIDEuNSBhbmQgMi4wICovCisjZGVmaW5lIEkyT1ZFUlNJT04JSTJPVkVSMTUKKyNkZWZpbmUgU0dMX09GRlNFVF8wICAgIEkyT1ZFUlNJT04KKyNkZWZpbmUgU0dMX09GRlNFVF80ICAgICgweDAwNDAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBTR0xfT0ZGU0VUXzUgICAgKDB4MDA1MCB8IEkyT1ZFUlNJT04pCisjZGVmaW5lIFNHTF9PRkZTRVRfNiAgICAoMHgwMDYwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgU0dMX09GRlNFVF83ICAgICgweDAwNzAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBTR0xfT0ZGU0VUXzggICAgKDB4MDA4MCB8IEkyT1ZFUlNJT04pCisjZGVmaW5lIFNHTF9PRkZTRVRfOSAgICAoMHgwMDkwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgU0dMX09GRlNFVF8xMCAgICgweDAwQTAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBTR0xfT0ZGU0VUXzEyICAgKDB4MDBDMCB8IEkyT1ZFUlNJT04pCisKKyNkZWZpbmUgVFJMX09GRlNFVF81ICAgICgweDAwNTAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBUUkxfT0ZGU0VUXzYgICAgKDB4MDA2MCB8IEkyT1ZFUlNJT04pCisKKyAvKiBtc2cgaGVhZGVyIGRlZmluZXMgZm9yIE1zZ0ZsYWdzICovCisjZGVmaW5lIE1TR19TVEFUSUMJMHgwMTAwCisjZGVmaW5lIE1TR182NEJJVF9DTlRYVAkweDAyMDAKKyNkZWZpbmUgTVNHX01VTFRJX1RSQU5TCTB4MTAwMAorI2RlZmluZSBNU0dfRkFJTAkweDIwMDAKKyNkZWZpbmUgTVNHX0xBU1QJMHg0MDAwCisjZGVmaW5lIE1TR19SRVBMWQkweDgwMDAKKworIC8qIG1pbmltdW0gc2l6ZSBtc2cgKi8KKyNkZWZpbmUgVEhSRUVfV09SRF9NU0dfU0laRQkweDAwMDMwMDAwCisjZGVmaW5lIEZPVVJfV09SRF9NU0dfU0laRQkweDAwMDQwMDAwCisjZGVmaW5lIEZJVkVfV09SRF9NU0dfU0laRQkweDAwMDUwMDAwCisjZGVmaW5lIFNJWF9XT1JEX01TR19TSVpFCTB4MDAwNjAwMDAKKyNkZWZpbmUgU0VWRU5fV09SRF9NU0dfU0laRQkweDAwMDcwMDAwCisjZGVmaW5lIEVJR0hUX1dPUkRfTVNHX1NJWkUJMHgwMDA4MDAwMAorI2RlZmluZSBOSU5FX1dPUkRfTVNHX1NJWkUJMHgwMDA5MDAwMAorI2RlZmluZSBURU5fV09SRF9NU0dfU0laRQkweDAwMEEwMDAwCisjZGVmaW5lIEkyT19NRVNTQUdFX1NJWkUoeCkJKCh4KTw8MTYpCisKKworLyogU3BlY2lhbCBUSUQgQXNzaWdubWVudHMgKi8KKworI2RlZmluZSBBREFQVEVSX1RJRAkJMAorI2RlZmluZSBIT1NUX1RJRAkJMQorCisjZGVmaW5lIE1TR19GUkFNRV9TSVpFCQkxMjgKKyNkZWZpbmUgTk1CUl9NU0dfRlJBTUVTCQkxMjgKKworI2RlZmluZSBNU0dfUE9PTF9TSVpFCQkxNjM4NAorCisjZGVmaW5lIEkyT19QT1NUX1dBSVRfT0sJMAorI2RlZmluZSBJMk9fUE9TVF9XQUlUX1RJTUVPVVQJLUVUSU1FRE9VVAorCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfU0NTSV9JMk9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2lvY3RsLmggYi9kcml2ZXJzL3Njc2kvZHB0L2RwdGlfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQyNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2lvY3RsLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHB0aV9pb2N0bC5oICAtICBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYmVnaW4gICAgICAgICAgICAgICAgOiBUaHUgU2VwIDcgMjAwMAorICAgIGNvcHlyaWdodCAgICAgICAgICAgIDogKEMpIDIwMDEgYnkgQWRhcHRlYworCisgICAgU2VlIERvY3VtZW50YXRpb24vc2NzaS9kcHRpLnR4dCBmb3IgaGlzdG9yeSwgbm90ZXMsIGxpY2Vuc2UgaW5mbworICAgIGFuZCBjcmVkaXRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gIG9zZF91bml4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9kcHRpX2lvY3RsX2gKKyNkZWZpbmUgX2RwdGlfaW9jdGxfaAorCisvLyBJT0NUTCBpbnRlcmZhY2UgY29tbWFuZHMKKworI2lmbmRlZiBfSU9XUgorIyBkZWZpbmUgX0lPV1IoeCx5LHopCSgoKHgpPDw4KXx5KQorI2VuZGlmCisjaWZuZGVmIF9JT1cKKyMgZGVmaW5lIF9JT1coeCx5LHopCSgoKHgpPDw4KXx5KQorI2VuZGlmCisjaWZuZGVmIF9JT1IKKyMgZGVmaW5lIF9JT1IoeCx5LHopCSgoKHgpPDw4KXx5KQorI2VuZGlmCisjaWZuZGVmIF9JTworIyBkZWZpbmUgX0lPKHgseSkJKCgoeCk8PDgpfHkpCisjZW5kaWYKKy8qIEVBVEEgUGFzc1Rocm91Z2ggQ29tbWFuZAkqLworI2RlZmluZSBFQVRBVVNSQ01EICAgICAgX0lPV1IoJ0QnLDY1LEVBVEFfQ1ApCisvKiBTZXQgRGVidWcgTGV2ZWwgSWYgRW5hYmxlZAkqLworI2RlZmluZSBEUFRfREVCVUcgICAgICAgX0lPVygnRCcsNjYsaW50KQorLyogR2V0IFNpZ25hdHVyZSBTdHJ1Y3R1cmUJKi8KKyNkZWZpbmUgRFBUX1NJR05BVFVSRSAgIF9JT1IoJ0QnLDY3LGRwdF9zaWdfUykKKyNpZiBkZWZpbmVkIF9fYnNkaV9fCisjZGVmaW5lIERQVF9TSUdOQVRVUkVfUEFDS0VEICAgX0lPUignRCcsNjcsZHB0X3NpZ19TX1BhY2tlZCkKKyNlbmRpZgorLyogR2V0IE51bWJlciBPZiBEUFQgQWRhcHRlcnMJKi8KKyNkZWZpbmUgRFBUX05VTUNUUkxTICAgIF9JT1IoJ0QnLDY4LGludCkKKy8qIEdldCBBZGFwdGVyIEluZm8gU3RydWN0dXJlCSovCisjZGVmaW5lIERQVF9DVFJMSU5GTyAgICBfSU9SKCdEJyw2OSxDdHJsSW5mbykKKy8qIEdldCBTdGF0aXN0aWNzIElmIEVuYWJsZWQJKi8KKyNkZWZpbmUgRFBUX1NUQVRJTkZPICAgIF9JTygnRCcsNzApCisvKiBDbGVhciBTdGF0cyBJZiBFbmFibGVkCSovCisjZGVmaW5lIERQVF9DTFJTVEFUICAgICBfSU8oJ0QnLDcxKQorLyogR2V0IFN5c3RlbSBJbmZvIFN0cnVjdHVyZQkqLworI2RlZmluZSBEUFRfU1lTSU5GTyAgICAgX0lPUignRCcsNzIsc3lzSW5mb19TKQorLyogU2V0IFRpbWVvdXQgVmFsdWUJCSovCisjZGVmaW5lIERQVF9USU1FT1VUICAgICBfSU8oJ0QnLDczKQorLyogR2V0IGNvbmZpZyBEYXRhICAJCSovCisjZGVmaW5lIERQVF9DT05GSUcgICAgICBfSU8oJ0QnLDc0KQorLyogR2V0IEJsaW5rIExFRCBDb2RlCSAgICAgICAgKi8KKyNkZWZpbmUgRFBUX0JMSU5LTEVEICAgIF9JT1IoJ0QnLDc1LGludCkKKy8qIEdldCBTdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworI2RlZmluZSBEUFRfU1RBVFNfSU5GTyAgICAgICAgX0lPUignRCcsODAsU1RBVFNfREFUQSkKKy8qIENsZWFyIHRoZSBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiAgICAgICAgICAqLworI2RlZmluZSBEUFRfU1RBVFNfQ0xFQVIgICAgICAgX0lPKCdEJyw4MSkKKy8qIEdldCBQZXJmb3JtYW5jZSBtZXRyaWNzICovCisjZGVmaW5lIERQVF9QRVJGX0lORk8gICAgICAgIF9JT1IoJ0QnLDgyLGRwdF9wZXJmX3QpCisvKiBTZW5kIGFuIEkyTyBjb21tYW5kICovCisjZGVmaW5lIEkyT1VTUkNNRAlfSU8oJ0QnLDc2KQorLyogSW5mb3JtIGRyaXZlciB0byByZS1hY3F1aXJlIExDVCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBJMk9SRVNDQU5DTUQJX0lPKCdEJyw3NykKKy8qIEluZm9ybSBkcml2ZXIgdG8gcmVzZXQgYWRhcHRlciAqLworI2RlZmluZSBJMk9SRVNFVENNRAlfSU8oJ0QnLDc4KQorLyogU2VlIGlmIHRoZSB0YXJnZXQgaXMgbW91bnRlZCAqLworI2RlZmluZSBEUFRfVEFSR0VUX0JVU1kJX0lPUignRCcsNzksIFRBUkdFVF9CVVNZX1QpCisKKworICAvKiBTdHJ1Y3R1cmUgUmV0dXJuZWQgRnJvbSBHZXQgQ29udHJvbGxlciBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdUNIQVIgICAgc3RhdGU7ICAgICAgICAgICAgLyogT3BlcmF0aW9uYWwgc3RhdGUgICAgICAgICAgICAgICAqLworCXVDSEFSICAgIGlkOyAgICAgICAgICAgICAgIC8qIEhvc3QgYWRhcHRlciBTQ1NJIGlkICAgICAgICAgICAgKi8KKwlpbnQgICAgICB2ZWN0OyAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yIG51bWJlciAgICAgICAgICovCisJaW50ICAgICAgYmFzZTsgICAgICAgICAgICAgLyogQmFzZSBJL08gYWRkcmVzcyAgICAgICAgICAgICAgICAqLworCWludCAgICAgIG5qb2JzOyAgICAgICAgICAgIC8qICMgb2Ygam9icyBzZW50IHRvIEhBICAgICAgICAgICAgKi8KKwlpbnQgICAgICBxZGVwdGg7ICAgICAgICAgICAvKiBDb250cm9sbGVyIHF1ZXVlIGRlcHRoLiAgICAgICAgICovCisJaW50ICAgICAgd2FrZWJhc2U7ICAgICAgICAgLyogbXB4IHdha2V1cCBiYXNlIGluZGV4LiAgICAgICAgICAqLworCXVMT05HICAgIFNHc2l6ZTsgICAgICAgICAgIC8qIFNjYXR0ZXIvR2F0aGVyIGxpc3Qgc2l6ZS4gICAgICAgKi8KKwl1bnNpZ25lZCBoZWFkczsgICAgICAgICAgICAvKiBoZWFkcyBmb3IgZHJpdmVzIG9uIGNudGxyLiAgICAgICovCisJdW5zaWduZWQgc2VjdG9yczsgICAgICAgICAgLyogc2VjdG9ycyBmb3IgZHJpdmVzIG9uIGNudGxyLiAgICAqLworCXVDSEFSICAgIGRvX2RyaXZlMzI7ICAgICAgIC8qIEZsYWcgZm9yIEFib3ZlIDE2IE1CIEFiaWxpdHkgICAgKi8KKwl1Q0hBUiAgICBCdXNRdWlldDsgICAgICAgICAvKiBTQ1NJIEJ1cyBRdWlldCBGbGFnICAgICAgICAgICAgICovCisJY2hhciAgICAgaWRQQUxbNF07ICAgICAgICAgLyogNCBCeXRlcyBPZiBUaGUgSUQgUGFsICAgICAgICAgICAqLworCXVDSEFSICAgIHByaW1hcnk7ICAgICAgICAgIC8qIDEgRm9yIFByaW1hcnksIDAgRm9yIFNlY29uZGFyeSAgKi8KKwl1Q0hBUiAgICBlYXRhVmVyc2lvbjsgICAgICAvKiBFQVRBIFZlcnNpb24gICAgICAgICAgICAgICAgICAgICovCisJdUxPTkcgICAgY3BMZW5ndGg7ICAgICAgICAgLyogRUFUQSBDb21tYW5kIFBhY2tldCBMZW5ndGggICAgICAqLworCXVMT05HICAgIHNwTGVuZ3RoOyAgICAgICAgIC8qIEVBVEEgU3RhdHVzIFBhY2tldCBMZW5ndGggICAgICAgKi8KKwl1Q0hBUiAgICBkcnFOdW07ICAgICAgICAgICAvKiBEUlEgSW5kZXggKDAsNSw2LDcpICAgICAgICAgICAgICovIAorCXVDSEFSICAgIGZsYWcxOyAgICAgICAgICAgIC8qIEVBVEEgRmxhZ3MgMSAoQnl0ZSA5KSAgICAgICAgICAgKi8KKwl1Q0hBUiAgICBmbGFnMjsgICAgICAgICAgICAvKiBFQVRBIEZsYWdzIDIgKEJ5dGUgMzApICAgICAgICAgICovCit9IEN0cmxJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdVNIT1JUIGxlbmd0aDsJCS8vIFJlbWFpbmluZyBsZW5ndGggb2YgdGhpcworCXVTSE9SVCBkcnZySEJBbnVtOwkvLyBSZWxhdGl2ZSBIQkEgIyB1c2VkIGJ5IHRoZSBkcml2ZXIKKwl1TE9ORyBiYXNlQWRkcjsJCS8vIEJhc2UgSS9PIGFkZHJlc3MKKwl1U0hPUlQgYmxpbmtTdGF0ZTsJLy8gQmxpbmsgTEVEIHN0YXRlICgwPU5vdCBpbiBibGluayBMRUQpCisJdUNIQVIgcGNpQnVzTnVtOwkvLyBQQ0kgQnVzICMgKE9wdGlvbmFsKQorCXVDSEFSIHBjaURldmljZU51bTsJLy8gUENJIERldmljZSAjIChPcHRpb25hbCkKKwl1U0hPUlQgaGJhRmxhZ3M7CS8vIE1pc2NlbGxhbmVvdXMgSEJBIGZsYWdzCisJdVNIT1JUIEludGVycnVwdDsJLy8gSW50ZXJydXB0IHNldCBmb3IgdGhpcyBkZXZpY2UuCisjICAgaWYgKGRlZmluZWQoX0RQVF9BUkMpKQorCXVMT05HIGJhc2VMZW5ndGg7CisJQURBUFRFUl9PQkpFQ1QgKkFkYXB0ZXJPYmplY3Q7CisJTEFSR0VfSU5URUdFUiBEbWFMb2dpY2FsQWRkcmVzczsKKwlQVk9JRCBEbWFWaXJ0dWFsQWRkcmVzczsKKwlMQVJHRV9JTlRFR0VSIFJlcGx5TG9naWNhbEFkZHJlc3M7CisJUFZPSUQgUmVwbHlWaXJ0dWFsQWRkcmVzczsKKyMgICBlbHNlCisJdUxPTkcgcmVzZXJ2ZWQxOwkvLyBSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbgorCXVMT05HIHJlc2VydmVkMjsJLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24KKwl1TE9ORyByZXNlcnZlZDM7CS8vIFJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uCisjICAgZW5kaWYKK30gZHJ2ckhCQWluZm9fUzsKKwordHlwZWRlZiBzdHJ1Y3QgVEFSR0VUX0JVU1kKK3sKKyAgdUxPTkcgY2hhbm5lbDsKKyAgdUxPTkcgaWQ7CisgIHVMT05HIGx1bjsKKyAgdUxPTkcgaXNCdXN5OworfSBUQVJHRVRfQlVTWV9UOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdC9kcHRzaWcuaCBiL2RyaXZlcnMvc2NzaS9kcHQvZHB0c2lnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhNGNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kcHQvZHB0c2lnLmgKQEAgLTAsMCArMSwzMzkgQEAKKy8qCUJTREkgZHB0c2lnLmgsdiAxLjcgMTk5OC8wNi8wMyAxOToxNTowMCBrYXJlbHMgRXhwCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgZm9ybSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisgKiBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYGFzIGlzJyBieSBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgYW5kCisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUKKyAqIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLAorICogYXJlIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBiZQorICogbGlhYmxlIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5IG9yCisgKiBjb25zZXF1ZW50aWFsIGRhbWFnZXMgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZgorICogc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzCisgKiBpbnRlcnJ1cHRpb25zKSBob3dldmVyIGNhdXNlZCBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4KKyAqIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpCisgKiBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBkcml2ZXIgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZAorICogb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorICoKKyAqLworCisjaWZuZGVmIF9fRFBUU0lHX0hfCisjZGVmaW5lIF9fRFBUU0lHX0hfCisjaWZkZWYgX1NJTklYX0FERE9OCisjaW5jbHVkZSAiZHB0LmgiCisjZW5kaWYKKy8qIERQVCBTSUdOQVRVUkUgU1BFQyBBTkQgSEVBREVSIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU2lnbmF0dXJlIFZlcnNpb24gMSAoc29ycnkgbm8gJ0EnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgdGFsa2luZyB0aGUgc2FtZSBzaXplIHVuZGVyIGFsbCBPUydzICAgICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHNpZ0JZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHNpZ1dPUkQ7CisjaWYgKGRlZmluZWQoX01VTFRJX0RBVEFNT0RFTCkgJiYgZGVmaW5lZChzdW4pICYmICFkZWZpbmVkKF9JTFAzMikpCit0eXBlZGVmIHVpbnQzMl90IHNpZ0xPTkc7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNpZ0xPTkc7CisjZW5kaWYKKworLyoKKyAqIHVzZSBzaWdXT1JETGl0dGxlRW5kaWFuIGZvcjoKKyAqICBkc0NhcGFiaWxpdGllcworICogIGRzRGV2aWNlU3VwcAorICogIGRzQWRhcHRlclN1cHAKKyAqICBkc0FwcGxpY2F0aW9uCisgKiB1c2Ugc2lnTE9OR0xpdHRsZUVuZGlhbiBmb3I6CisgKiAgICAgIGRzT1MKKyAqIHNvIHRoYXQgdGhlIHNpZyBjYW4gYmUgc3RhbmRhcmRpc2VkIHRvIExpdHRsZSBFbmRpYW4KKyAqLworI2lmIChkZWZpbmVkKF9EUFRfQklHX0VORElBTikpCisjIGRlZmluZSBzaWdXT1JETGl0dGxlRW5kaWFuKHgpICgoKCh4KSYweEZGKTw8OCl8KCgoeCk+PjgpJjB4RkYpKQorIyBkZWZpbmUgc2lnTE9OR0xpdHRsZUVuZGlhbih4KSBcCisgICAgICAgICgoKCh4KSYweEZGKTw8MjQpIHwgICAgICAgICAgICAgXAorICAgICAgICAgKCgoeCkmMHhGRjAwKTw8OCkgfCAgICBcCisgICAgICAgICAoKCh4KSYweEZGMDAwMEwpPj44KSB8IFwKKyAgICAgICAgICgoKHgpJjB4RkYwMDAwMDBMKT4+MjQpKQorI2Vsc2UKKyMgZGVmaW5lIHNpZ1dPUkRMaXR0bGVFbmRpYW4oeCkgKHgpCisjIGRlZmluZSBzaWdMT05HTGl0dGxlRW5kaWFuKHgpICh4KQorI2VuZGlmCisKKy8qIG11c3QgbWFrZSBzdXJlIHRoZSBzdHJ1Y3R1cmUgaXMgbm90IHdvcmQgb3IgZG91YmxlLXdvcmQgYWxpZ25lZCAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAqLworLyogQm9ybGFuZCB3aWxsIGlnbm9yZSB0aGUgZm9sbG93aW5nIHByYWdtYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFdvcmQgYWxpZ25tZW50IGlzIE9GRiBieSBkZWZhdWx0LiAgSWYgaW4gdGhlLCBJREUgbWFrZSAgICAgICAgICAgICAgICovCisvKiBzdXJlIHRoYXQgT3B0aW9ucyB8IENvbXBpbGVyIHwgQ29kZSBHZW5lcmF0aW9uIHwgV29yZCBBbGlnbm1lbnQgICAgICAqLworLyogaXMgbm90IGNoZWNrZWQuICBJZiB1c2luZyBCQ0MsIGRvIG5vdCB1c2UgdGhlIC1hIG9wdGlvbi4gICAgICAgICAgICAgKi8KKworI2lmbmRlZiBOT19QQUNLCisjaWYgZGVmaW5lZCAoX0RQVF9BSVgpCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cGFja2VkCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYgIC8qIGFpeCAqLworI2VuZGlmCisvKiBGb3IgdGhlIE1hY2ludG9zaCAqLworI2lmIFNUUlVDVEFMSUdOTUVOVFNVUFBPUlRFRAorI3ByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4aworI2VuZGlmCisKKworLyogQ3VycmVudCBTaWduYXR1cmUgVmVyc2lvbiAtIHNpZ0JZVEUgZHNTaWdWZXJzaW9uOyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFNJR19WRVJTSU9OIDEKKworLyogUHJvY2Vzc29yIEZhbWlseSAtIHNpZ0JZVEUgZHNQcm9jZXNzb3JGYW1pbHk7ICBESVNUSU5DVCBWQUxVRVMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogV2hhdCB0eXBlIG9mIHByb2Nlc3NvciB0aGUgZmlsZSBpcyBtZWFudCB0byBydW4gb24uICovCisvKiBUaGlzIHdpbGwgbGV0IHVzIGtub3cgd2hldGhlciB0byByZWFkIHNpZ1dPUkRzIGFzIGhpZ2gvbG93IG9yIGxvdy9oaWdoLiAqLworI2RlZmluZSBQUk9DX0lOVEVMICAgICAgMHgwMCAgICAvKiBJbnRlbCA4MHg4NiAqLworI2RlZmluZSBQUk9DX01PVE9ST0xBICAgMHgwMSAgICAvKiBNb3Rvcm9sYSA2OEsgKi8KKyNkZWZpbmUgUFJPQ19NSVBTNDAwMCAgIDB4MDIgICAgLyogTUlQUyBSSVNDIDQwMDAgKi8KKyNkZWZpbmUgUFJPQ19BTFBIQSAgICAgIDB4MDMgICAgLyogREVDIEFscGhhICovCisjZGVmaW5lIFBST0NfUE9XRVJQQyAgICAweDA0ICAgIC8qIElCTSBQb3dlciBQQyAqLworI2RlZmluZSBQUk9DX2k5NjAgICAgICAgMHgwNSAgICAvKiBJbnRlbCBpOTYwICovCisjZGVmaW5lIFBST0NfVUxUUkFTUEFSQyAweDA2ICAgIC8qIFNQQVJDIHByb2Nlc3NvciAqLworCisvKiBTcGVjaWZpYyBNaW5pbWltIFByb2Nlc3NvciAtIHNpZ0JZVEUgZHNQcm9jZXNzb3I7ICAgIEZMQUcgQklUUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEaWZmZXJlbnQgYml0IGRlZmluaXRpb25zIGRlcGVuZGVudCBvbiBwcm9jZXNzb3JfZmFtaWx5ICovCisKKy8qIFBST0NfSU5URUw6ICovCisjZGVmaW5lIFBST0NfODA4NiAgICAgICAweDAxICAgIC8qIEludGVsIDgwODYgKi8KKyNkZWZpbmUgUFJPQ18yODYgICAgICAgIDB4MDIgICAgLyogSW50ZWwgODAyODYgKi8KKyNkZWZpbmUgUFJPQ18zODYgICAgICAgIDB4MDQgICAgLyogSW50ZWwgODAzODYgKi8KKyNkZWZpbmUgUFJPQ180ODYgICAgICAgIDB4MDggICAgLyogSW50ZWwgODA0ODYgKi8KKyNkZWZpbmUgUFJPQ19QRU5USVVNICAgIDB4MTAgICAgLyogSW50ZWwgNTg2IGFrYSBQNSBha2EgUGVudGl1bSAqLworI2RlZmluZSBQUk9DX1NFWElVTQkweDIwCS8qIEludGVsIDY4NiBha2EgUDYgYWthIFBlbnRpdW0gUHJvIG9yIE1NWCAqLworCisvKiBQUk9DX2k5NjA6ICovCisjZGVmaW5lIFBST0NfOTYwUlggICAgICAweDAxICAgIC8qIEludGVsIDgwOTYwUkMvUkQgKi8KKyNkZWZpbmUgUFJPQ185NjBIWCAgICAgIDB4MDIgICAgLyogSW50ZWwgODA5NjBIQS9IRC9IVCAqLworCisvKiBQUk9DX01PVE9ST0xBOiAqLworI2RlZmluZSBQUk9DXzY4MDAwICAgICAgMHgwMSAgICAvKiBNb3Rvcm9sYSA2ODAwMCAqLworI2RlZmluZSBQUk9DXzY4MDEwCTB4MDIJLyogTW90b3JvbGEgNjgwMTAgKi8KKyNkZWZpbmUgUFJPQ182ODAyMCAgICAgIDB4MDQgICAgLyogTW90b3JvbGEgNjgwMjAgKi8KKyNkZWZpbmUgUFJPQ182ODAzMCAgICAgIDB4MDggICAgLyogTW90b3JvbGEgNjgwMzAgKi8KKyNkZWZpbmUgUFJPQ182ODA0MCAgICAgIDB4MTAgICAgLyogTW90b3JvbGEgNjgwNDAgKi8KKworLyogUFJPQ19QT1dFUlBDICovCisjZGVmaW5lIFBST0NfUFBDNjAxCQkweDAxCS8qIFBvd2VyUEMgNjAxICovCisjZGVmaW5lIFBST0NfUFBDNjAzCQkweDAyCS8qIFBvd2VyUEMgNjAzICovCisjZGVmaW5lIFBST0NfUFBDNjA0CQkweDA0CS8qIFBvd2VyUEMgNjA0ICovCisKKy8qIFBST0NfTUlQUzQwMDA6ICovCisjZGVmaW5lIFBST0NfUjQwMDAgICAgICAweDAxICAgIC8qIE1JUFMgUjQwMDAgKi8KKworLyogRmlsZXR5cGUgLSBzaWdCWVRFIGRzRmlsZXR5cGU7ICAgICAgIERJU1RJTkNUIFZBTFVFUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZUX0VYRUNVVEFCTEUgICAwICAgICAgIC8qIEV4ZWN1dGFibGUgUHJvZ3JhbSAqLworI2RlZmluZSBGVF9TQ1JJUFQgICAgICAgMSAgICAgICAvKiBTY3JpcHQvQmF0Y2ggRmlsZT8/PyAqLworI2RlZmluZSBGVF9IQkFEUlZSICAgICAgMiAgICAgICAvKiBIQkEgRHJpdmVyICovCisjZGVmaW5lIEZUX09USEVSRFJWUiAgICAzICAgICAgIC8qIE90aGVyIERyaXZlciAqLworI2RlZmluZSBGVF9JRlMgICAgICAgICAgNCAgICAgICAvKiBJbnN0YWxsYWJsZSBGaWxlc3lzdGVtIERyaXZlciAqLworI2RlZmluZSBGVF9FTkdJTkUgICAgICAgNSAgICAgICAvKiBEUFQgRW5naW5lICovCisjZGVmaW5lIEZUX0NPTVBEUlZSICAgICA2ICAgICAgIC8qIENvbXByZXNzZWQgRHJpdmVyIERpc2sgKi8KKyNkZWZpbmUgRlRfTEFOR1VBR0UgICAgIDcgICAgICAgLyogRm9yZWlnbiBMYW5ndWFnZSBmaWxlICovCisjZGVmaW5lIEZUX0ZJUk1XQVJFICAgICA4ICAgICAgIC8qIERvd25sb2FkYWJsZSBvciBhY3R1YWwgRmlybXdhcmUgKi8KKyNkZWZpbmUgRlRfQ09NTU1PREwgICAgIDkgICAgICAgLyogQ29tbXVuaWNhdGlvbnMgTW9kdWxlICovCisjZGVmaW5lIEZUX0lOVDEzICAgICAgICAxMCAgICAgIC8qIElOVCAxMyBzdHlsZSBIQkEgRHJpdmVyICovCisjZGVmaW5lIEZUX0hFTFBGSUxFICAgICAxMSAgICAgIC8qIEhlbHAgZmlsZSAqLworI2RlZmluZSBGVF9MT0dHRVIgICAgICAgMTIgICAgICAvKiBFdmVudCBMb2dnZXIgKi8KKyNkZWZpbmUgRlRfSU5TVEFMTCAgICAgIDEzICAgICAgLyogQW4gSW5zdGFsbCBQcm9ncmFtICovCisjZGVmaW5lIEZUX0xJQlJBUlkgICAgICAxNCAgICAgIC8qIFN0b3JhZ2UgTWFuYWdlciBSZWFsLU1vZGUgQ2FsbHMgKi8KKyNkZWZpbmUgRlRfUkVTT1VSQ0UgCTE1IAkvKiBTdG9yYWdlIE1hbmFnZXIgUmVzb3VyY2UgRmlsZSAqLworI2RlZmluZSBGVF9NT0RFTV9EQiAgCTE2ICAJLyogU3RvcmFnZSBNYW5hZ2VyIE1vZGVtIERhdGFiYXNlICovCisKKy8qIEZpbGV0eXBlIGZsYWdzIC0gc2lnQllURSBkc0ZpbGV0eXBlRmxhZ3M7ICAgIEZMQUcgQklUUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZURl9ETEwgICAgICAgICAweDAxICAgIC8qIER5bmFtaWMgTGluayBMaWJyYXJ5ICovCisjZGVmaW5lIEZURl9OTE0gICAgICAgICAweDAyICAgIC8qIE5ldHdhcmUgTG9hZGFibGUgTW9kdWxlICovCisjZGVmaW5lIEZURl9PVkVSTEFZUyAgICAweDA0ICAgIC8qIFVzZXMgb3ZlcmxheXMgKi8KKyNkZWZpbmUgRlRGX0RFQlVHICAgICAgIDB4MDggICAgLyogRGVidWcgdmVyc2lvbiAqLworI2RlZmluZSBGVEZfVFNSICAgICAgICAgMHgxMCAgICAvKiBUU1IgKi8KKyNkZWZpbmUgRlRGX1NZUyAgICAgICAgIDB4MjAgICAgLyogRE9TIExvYWRhYmxlIGRyaXZlciAqLworI2RlZmluZSBGVEZfUFJPVEVDVEVEICAgMHg0MCAgICAvKiBSdW5zIGluIHByb3RlY3RlZCBtb2RlICovCisjZGVmaW5lIEZURl9BUFBfU1BFQyAgICAweDgwICAgIC8qIEFwcGxpY2F0aW9uIFNwZWNpZmljICovCisjZGVmaW5lIEZURl9ST00JCShGVEZfU1lTfEZURl9UU1IpCS8qIFNwZWNpYWwgQ2FzZSAqLworCisvKiBPRU0gLSBzaWdCWVRFIGRzT0VNOyAgICAgICAgIERJU1RJTkNUIFZBTFVFUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE9FTV9EUFQgICAgICAgICAwICAgICAgIC8qIERQVCAqLworI2RlZmluZSBPRU1fQVRUICAgICAgICAgMSAgICAgICAvKiBBVFQgKi8KKyNkZWZpbmUgT0VNX05FQyAgICAgICAgIDIgICAgICAgLyogTkVDICovCisjZGVmaW5lIE9FTV9BTFBIQSAgICAgICAzICAgICAgIC8qIEFscGhhdHJvbml4ICovCisjZGVmaW5lIE9FTV9BU1QgICAgICAgICA0ICAgICAgIC8qIEFTVCAqLworI2RlZmluZSBPRU1fT0xJVkVUVEkgICAgNSAgICAgICAvKiBPbGl2ZXR0aSAqLworI2RlZmluZSBPRU1fU05JICAgICAgICAgNiAgICAgICAvKiBTaWVtZW5zL05peGRvcmYgKi8KKyNkZWZpbmUgT0VNX1NVTiAgICAgICAgIDcgICAgICAgLyogU1VOIE1pY3Jvc3lzdGVtcyAqLworCisvKiBPcGVyYXRpbmcgU3lzdGVtICAtIHNpZ0xPTkcgZHNPUzsgICAgRkxBRyBCSVRTICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgT1NfRE9TICAgICAgICAgIDB4MDAwMDAwMDEgLyogUEMvTVMtRE9TCQkJCSovCisjZGVmaW5lIE9TX1dJTkRPV1MgICAgICAweDAwMDAwMDAyIC8qIE1pY3Jvc29mdCBXaW5kb3dzIDMueAkJKi8KKyNkZWZpbmUgT1NfV0lORE9XU19OVCAgIDB4MDAwMDAwMDQgLyogTWljcm9zb2Z0IFdpbmRvd3MgTlQJCSovCisjZGVmaW5lIE9TX09TMk0gICAgICAgICAweDAwMDAwMDA4IC8qIE9TLzIgMS4yLngsTVMgMS4zLjAsSUJNIDEuMy54IC0gTW9ub2xpdGhpYyAqLworI2RlZmluZSBPU19PUzJMICAgICAgICAgMHgwMDAwMDAxMCAvKiBNaWNyb3NvZnQgT1MvMiAxLjMwMSAtIExBRERSCSovCisjZGVmaW5lIE9TX09TMjJ4ICAgICAgICAweDAwMDAwMDIwIC8qIElCTSBPUy8yIDIueAkJCSovCisjZGVmaW5lIE9TX05XMjg2ICAgICAgICAweDAwMDAwMDQwIC8qIE5vdmVsbCBOZXRXYXJlIDI4NgkJKi8KKyNkZWZpbmUgT1NfTlczODYgICAgICAgIDB4MDAwMDAwODAgLyogTm92ZWxsIE5ldFdhcmUgMzg2CQkqLworI2RlZmluZSBPU19HRU5fVU5JWCAgICAgMHgwMDAwMDEwMCAvKiBHZW5lcmljIFVuaXgJCQkqLworI2RlZmluZSBPU19TQ09fVU5JWCAgICAgMHgwMDAwMDIwMCAvKiBTQ08gVW5peAkJCQkqLworI2RlZmluZSBPU19BVFRfVU5JWCAgICAgMHgwMDAwMDQwMCAvKiBBVFQgVW5peAkJCQkqLworI2RlZmluZSBPU19VTklYV0FSRSAgICAgMHgwMDAwMDgwMCAvKiBVU0wgVW5peAkJCQkqLworI2RlZmluZSBPU19JTlRfVU5JWCAgICAgMHgwMDAwMTAwMCAvKiBJbnRlcmFjdGl2ZSBVbml4CQkJKi8KKyNkZWZpbmUgT1NfU09MQVJJUyAgICAgIDB4MDAwMDIwMDAgLyogU3VuU29mdCBTb2xhcmlzCQkJKi8KKyNkZWZpbmUgT1NfUU5YICAgICAgICAgIDB4MDAwMDQwMDAgLyogUU5YIGZvciBUb20gTW9jaAkJCSovCisjZGVmaW5lIE9TX05FWFRTVEVQICAgICAweDAwMDA4MDAwIC8qIE5lWFRTVEVQL09QRU5TVEVQL01BQ0gJCSovCisjZGVmaW5lIE9TX0JBTllBTiAgICAgICAweDAwMDEwMDAwIC8qIEJhbnlhbiBWaW5lcwkJCSovCisjZGVmaW5lIE9TX09MSVZFVFRJX1VOSVggMHgwMDAyMDAwMC8qIE9saXZldHRpIFVuaXgJCQkqLworI2RlZmluZSBPU19NQUNfT1MJMHgwMDA0MDAwMCAvKiBNYWMgT1MJCQkJKi8KKyNkZWZpbmUgT1NfV0lORE9XU185NQkweDAwMDgwMDAwIC8qIE1pY3Jvc29mdCBXaW5kb3dzICc5NQkJKi8KKyNkZWZpbmUgT1NfTlc0eAkJMHgwMDEwMDAwMCAvKiBOb3ZlbGwgTmV0d2FyZSA0LngJCSovCisjZGVmaW5lIE9TX0JTRElfVU5JWAkweDAwMjAwMDAwIC8qIEJTRGkgVW5peCBCU0QvT1MgMi4wIGFuZCB1cAkqLworI2RlZmluZSBPU19BSVhfVU5JWCAgICAgMHgwMDQwMDAwMCAvKiBBSVggVW5peAkJCQkqLworI2RlZmluZSBPU19GUkVFX0JTRAkweDAwODAwMDAwIC8qIEZyZWVCU0QgVW5peAkJCSovCisjZGVmaW5lIE9TX0xJTlVYCTB4MDEwMDAwMDAgLyogTGludXgJCQkJKi8KKyNkZWZpbmUgT1NfREdVWF9VTklYCTB4MDIwMDAwMDAgLyogRGF0YSBHZW5lcmFsIFVuaXgJCQkqLworI2RlZmluZSBPU19TSU5JWF9OICAgICAgMHgwNDAwMDAwMCAvKiBTTkkgU0lOSVgtTgkJCSovCisjZGVmaW5lIE9TX1BMQU45CTB4MDgwMDAwMDAgLyogQVRUIFBsYW4gOQkJCSovCisjZGVmaW5lIE9TX1RTWAkJMHgxMDAwMDAwMCAvKiBTTkggVFNYLTMyCQkJKi8KKworI2RlZmluZSBPU19PVEhFUiAgICAgICAgMHg4MDAwMDAwMCAvKiBPdGhlcgkJCQkqLworCisvKiBDYXBhYmlsaXRpZXMgLSBzaWdXT1JEIGRzQ2FwYWJpbGl0aWVzOyAgICAgICAgRkxBRyBCSVRTICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQ0FQX1JBSUQwICAgICAgIDB4MDAwMSAgLyogUkFJRC0wICovCisjZGVmaW5lIENBUF9SQUlEMSAgICAgICAweDAwMDIgIC8qIFJBSUQtMSAqLworI2RlZmluZSBDQVBfUkFJRDMgICAgICAgMHgwMDA0ICAvKiBSQUlELTMgKi8KKyNkZWZpbmUgQ0FQX1JBSUQ1ICAgICAgIDB4MDAwOCAgLyogUkFJRC01ICovCisjZGVmaW5lIENBUF9TUEFOICAgICAgICAweDAwMTAgIC8qIFNwYW5uaW5nICovCisjZGVmaW5lIENBUF9QQVNTICAgICAgICAweDAwMjAgIC8qIFByb3ZpZGVzIHBhc3N0aHJvdWdoICovCisjZGVmaW5lIENBUF9PVkVSTEFQICAgICAweDAwNDAgIC8qIFBhc3N0aHJvdWdoIHN1cHBvcnRzIG92ZXJsYXBwZWQgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ0FQX0FTUEkgICAgICAgIDB4MDA4MCAgLyogU3VwcG9ydHMgQVNQSSBDb21tYW5kIFJlcXVlc3RzICovCisjZGVmaW5lIENBUF9BQk9WRTE2TUIgICAweDAxMDAgIC8qIElTQSBEcml2ZXIgc3VwcG9ydHMgZ3JlYXRlciB0aGFuIDE2TUIgKi8KKyNkZWZpbmUgQ0FQX0VYVEVORCAgICAgIDB4ODAwMCAgLyogRXh0ZW5kZWQgaW5mbyBhcHBlYXJzIGFmdGVyIGRlc2NyaXB0aW9uICovCisjaWZkZWYgU05JX01JUFMKKyNkZWZpbmUgQ0FQX0NBQ0hFTU9ERSAgIDB4MTAwMCAgLyogZHB0X2ZvcmNlX2NhY2hlIGlzIHNldCBpbiBkcml2ZXIgKi8KKyNlbmRpZgorCisvKiBEZXZpY2VzIFN1cHBvcnRlZCAtIHNpZ1dPUkQgZHNEZXZpY2VTdXBwOyAgICBGTEFHIEJJVFMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBERVZfREFTRCAgICAgICAgMHgwMDAxICAvKiBEQVNEIChoYXJkIGRyaXZlcykgKi8KKyNkZWZpbmUgREVWX1RBUEUgICAgICAgIDB4MDAwMiAgLyogVGFwZSBkcml2ZXMgKi8KKyNkZWZpbmUgREVWX1BSSU5URVIgICAgIDB4MDAwNCAgLyogUHJpbnRlcnMgKi8KKyNkZWZpbmUgREVWX1BST0MgICAgICAgIDB4MDAwOCAgLyogUHJvY2Vzc29ycyAqLworI2RlZmluZSBERVZfV09STSAgICAgICAgMHgwMDEwICAvKiBXT1JNIGRyaXZlcyAqLworI2RlZmluZSBERVZfQ0RST00gICAgICAgMHgwMDIwICAvKiBDRC1ST00gZHJpdmVzICovCisjZGVmaW5lIERFVl9TQ0FOTkVSICAgICAweDAwNDAgIC8qIFNjYW5uZXJzICovCisjZGVmaW5lIERFVl9PUFRJQ0FMICAgICAweDAwODAgIC8qIE9wdGljYWwgRHJpdmVzICovCisjZGVmaW5lIERFVl9KVUtFQk9YICAgICAweDAxMDAgIC8qIEp1a2Vib3ggKi8KKyNkZWZpbmUgREVWX0NPTU0gICAgICAgIDB4MDIwMCAgLyogQ29tbXVuaWNhdGlvbnMgRGV2aWNlcyAqLworI2RlZmluZSBERVZfT1RIRVIgICAgICAgMHgwNDAwICAvKiBPdGhlciBEZXZpY2VzICovCisjZGVmaW5lIERFVl9BTEwgICAgICAgICAweEZGRkYgIC8qIEFsbCBTQ1NJIERldmljZXMgKi8KKworLyogQWRhcHRlcnMgRmFtaWxpZXMgU3VwcG9ydGVkIC0gc2lnV09SRCBkc0FkYXB0ZXJTdXBwOyBGTEFHIEJJVFMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBBREZfMjAwMSAgICAgICAgMHgwMDAxICAvKiBQTTIwMDEgICAgICAgICAgICovCisjZGVmaW5lIEFERl8yMDEyQSAgICAgICAweDAwMDIgIC8qIFBNMjAxMkEgICAgICAgICAgKi8KKyNkZWZpbmUgQURGX1BMVVNfSVNBICAgIDB4MDAwNCAgLyogUE0yMDExLFBNMjAyMSAgICAqLworI2RlZmluZSBBREZfUExVU19FSVNBICAgMHgwMDA4ICAvKiBQTTIwMTJCLFBNMjAyMiAgICovCisjZGVmaW5lIEFERl9TQzNfSVNBCTB4MDAxMCAgLyogUE0yMDIxICAgICAgICAgICAqLworI2RlZmluZSBBREZfU0MzX0VJU0EJMHgwMDIwICAvKiBQTTIwMjIsUE0yMTIyLCBldGMgKi8KKyNkZWZpbmUgQURGX1NDM19QQ0kJMHgwMDQwICAvKiBTbWFydENhY2hlIElJSSBQQ0kgKi8KKyNkZWZpbmUgQURGX1NDNF9JU0EJMHgwMDgwICAvKiBTbWFydENhY2hlIElWIElTQSAqLworI2RlZmluZSBBREZfU0M0X0VJU0EJMHgwMTAwICAvKiBTbWFydENhY2hlIElWIEVJU0EgKi8KKyNkZWZpbmUgQURGX1NDNF9QQ0kJMHgwMjAwCS8qIFNtYXJ0Q2FjaGUgSVYgUENJICovCisjZGVmaW5lIEFERl9TQzVfUENJCTB4MDQwMAkvKiBGaWZ0aCBHZW5lcmF0aW9uIEkyTyBwcm9kdWN0cyAqLworLyoKKyAqCUNvbWJpbmF0aW9ucyBvZiBwcm9kdWN0cworICovCisjZGVmaW5lIEFERl9BTExfMjAwMAkoQURGXzIwMDF8QURGXzIwMTJBKQorI2RlZmluZSBBREZfQUxMX1BMVVMJKEFERl9QTFVTX0lTQXxBREZfUExVU19FSVNBKQorI2RlZmluZSBBREZfQUxMX1NDMwkoQURGX1NDM19JU0F8QURGX1NDM19FSVNBfEFERl9TQzNfUENJKQorI2RlZmluZSBBREZfQUxMX1NDNAkoQURGX1NDNF9JU0F8QURGX1NDNF9FSVNBfEFERl9TQzRfUENJKQorI2RlZmluZSBBREZfQUxMX1NDNQkoQURGX1NDNV9QQ0kpCisvKiBBbGwgRUFUQSBDYWNoZWluZyBQcm9kdWN0cyAqLworI2RlZmluZSBBREZfQUxMX0NBQ0hFCShBREZfQUxMX1BMVVN8QURGX0FMTF9TQzN8QURGX0FMTF9TQzQpCisvKiBBbGwgRUFUQSBCdXMgTWFzdGVyaW5nIFByb2R1Y3RzICovCisjZGVmaW5lIEFERl9BTExfTUFTVEVSCShBREZfMjAxMkF8QURGX0FMTF9DQUNIRSkKKy8qIEFsbCBFQVRBIEFkYXB0ZXIgUHJvZHVjdHMgKi8KKyNkZWZpbmUgQURGX0FMTF9FQVRBCShBREZfMjAwMXxBREZfQUxMX01BU1RFUikKKyNkZWZpbmUgQURGX0FMTAkJQURGX0FMTF9FQVRBCisKKy8qIEFwcGxpY2F0aW9uIC0gc2lnV09SRCBkc0FwcGxpY2F0aW9uOyAgICAgICAgIEZMQUcgQklUUyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEFQUF9EUFRNR1IgICAgICAweDAwMDEgIC8qIERQVCBTdG9yYWdlIE1hbmFnZXIgKi8KKyNkZWZpbmUgQVBQX0VOR0lORSAgICAgIDB4MDAwMiAgLyogRFBUIEVuZ2luZSAqLworI2RlZmluZSBBUFBfU1lUT1MgICAgICAgMHgwMDA0ICAvKiBTeXRyb24gU3l0b3MgUGx1cyAqLworI2RlZmluZSBBUFBfQ0hFWUVOTkUgICAgMHgwMDA4ICAvKiBDaGV5ZW5uZSBBUkNTZXJ2ZSArIEFSQ1NvbG8gKi8KKyNkZWZpbmUgQVBQX01TQ0RFWCAgICAgIDB4MDAxMCAgLyogTWljcm9zb2Z0IENELVJPTSBleHRlbnNpb25zICovCisjZGVmaW5lIEFQUF9OT1ZBQkFDSyAgICAweDAwMjAgIC8qIE5vdmFTdG9yIE5vdmFiYWNrICovCisjZGVmaW5lIEFQUF9BSU0gICAgICAgICAweDAwNDAgIC8qIEFyY2hpdmUgSW5mb3JtYXRpb24gTWFuYWdlciAqLworCisvKiBSZXF1aXJlbWVudHMgLSBzaWdCWVRFIGRzUmVxdWlyZW1lbnRzOyAgICAgICAgIEZMQUcgQklUUyAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KKyNkZWZpbmUgUkVRX1NNQVJUUk9NICAgIDB4MDEgICAgLyogUmVxdWlyZXMgU21hcnRST00gdG8gYmUgcHJlc2VudCAgICAgICovCisjZGVmaW5lIFJFUV9EUFREREwgICAgICAweDAyICAgIC8qIFJlcXVpcmVzIERQVERETC5TWVMgdG8gYmUgbG9hZGVkICAgICAqLworI2RlZmluZSBSRVFfSEJBX0RSSVZFUiAgMHgwNCAgICAvKiBSZXF1aXJlcyBhbiBIQkEgZHJpdmVyIHRvIGJlIGxvYWRlZCAgKi8KKyNkZWZpbmUgUkVRX0FTUElfVFJBTiAgIDB4MDggICAgLyogUmVxdWlyZXMgYW4gQVNQSSBUcmFuc3BvcnQgTW9kdWxlcyAgICovCisjZGVmaW5lIFJFUV9FTkdJTkUgICAgICAweDEwICAgIC8qIFJlcXVpcmVzIGEgRFBUIEVuZ2luZSB0byBiZSBsb2FkZWQgICAqLworI2RlZmluZSBSRVFfQ09NTV9FTkcgICAgMHgyMCAgICAvKiBSZXF1aXJlcyBhIERQVCBDb21tdW5pY2F0aW9ucyBFbmdpbmUgKi8KKworLyoKKyAqIFlvdSBtYXkgYWRqdXN0IGRzRGVzY3JpcHRpb25fc2l6ZSB3aXRoIGFuIG92ZXJyaWRlIHRvIGEgdmFsdWUgbGVzcyB0aGFuCisgKiA1MCBzbyB0aGF0IHRoZSBzdHJ1Y3R1cmUgYWxsb2NhdGVzIGxlc3MgcmVhbCBzcGFjZS4KKyAqLworI2lmICghZGVmaW5lZChkc0Rlc2NyaXB0aW9uX3NpemUpKQorIyBkZWZpbmUgZHNEZXNjcmlwdGlvbl9zaXplIDUwCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgZHB0X3NpZyB7CisgICAgY2hhciAgICBkc1NpZ25hdHVyZVs2XTsgICAgICAvKiBBTFdBWVMgImRQdFNpRyIgKi8KKyAgICBzaWdCWVRFIGRzU2lnVmVyc2lvbjsgICAgICAgIC8qIHNpZ25hdHVyZSB2ZXJzaW9uIChjdXJyZW50bHkgMSkgKi8KKyAgICBzaWdCWVRFIGRzUHJvY2Vzc29yRmFtaWx5OyAgIC8qIHdoYXQgdHlwZSBvZiBwcm9jZXNzb3IgKi8KKyAgICBzaWdCWVRFIGRzUHJvY2Vzc29yOyAgICAgICAgIC8qIHByZWNpc2UgcHJvY2Vzc29yICovCisgICAgc2lnQllURSBkc0ZpbGV0eXBlOyAgICAgICAgICAvKiB0eXBlIG9mIGZpbGUgKi8KKyAgICBzaWdCWVRFIGRzRmlsZXR5cGVGbGFnczsgICAgIC8qIGZsYWdzIHRvIHNwZWNpZnkgbG9hZCB0eXBlLCBldGMuICovCisgICAgc2lnQllURSBkc09FTTsgICAgICAgICAgICAgICAvKiBPRU0gZmlsZSB3YXMgY3JlYXRlZCBmb3IgKi8KKyAgICBzaWdMT05HIGRzT1M7ICAgICAgICAgICAgICAgIC8qIHdoaWNoIE9wZXJhdGluZyBzeXN0ZW1zICovCisgICAgc2lnV09SRCBkc0NhcGFiaWxpdGllczsgICAgICAvKiBSQUlEIGxldmVscywgZXRjLiAqLworICAgIHNpZ1dPUkQgZHNEZXZpY2VTdXBwOyAgICAgICAgLyogVHlwZXMgb2YgU0NTSSBkZXZpY2VzIHN1cHBvcnRlZCAqLworICAgIHNpZ1dPUkQgZHNBZGFwdGVyU3VwcDsgICAgICAgLyogRFBUIGFkYXB0ZXIgZmFtaWxpZXMgc3VwcG9ydGVkICovCisgICAgc2lnV09SRCBkc0FwcGxpY2F0aW9uOyAgICAgICAvKiBhcHBsaWNhdGlvbnMgZmlsZSBpcyBmb3IgKi8KKyAgICBzaWdCWVRFIGRzUmVxdWlyZW1lbnRzOyAgICAgIC8qIE90aGVyIGRyaXZlciBkZXBlbmRlbmNpZXMgKi8KKyAgICBzaWdCWVRFIGRzVmVyc2lvbjsgICAgICAgICAgIC8qIDEgKi8KKyAgICBzaWdCWVRFIGRzUmV2aXNpb247ICAgICAgICAgIC8qICdKJyAqLworICAgIHNpZ0JZVEUgZHNTdWJSZXZpc2lvbjsgICAgICAgLyogJzknICAgJyAnIGlmIE4vQSAqLworICAgIHNpZ0JZVEUgZHNNb250aDsgICAgICAgICAgICAgLyogY3JlYXRpb24gbW9udGggKi8KKyAgICBzaWdCWVRFIGRzRGF5OyAgICAgICAgICAgICAgIC8qIGNyZWF0aW9uIGRheSAqLworICAgIHNpZ0JZVEUgZHNZZWFyOyAgICAgICAgICAgICAgLyogY3JlYXRpb24geWVhciBzaW5jZSAxOTgwICgxOTkzPTEzKSAqLworICAgIC8qIGRlc2NyaXB0aW9uIChOVUxMIHRlcm1pbmF0ZWQpICovCisgICAgY2hhciAgZHNEZXNjcmlwdGlvbltkc0Rlc2NyaXB0aW9uX3NpemVdOworfSBkcHRfc2lnX1M7CisvKiAzMiBieXRlcyBtaW5pbXVtIC0gd2l0aCBubyBkZXNjcmlwdGlvbi4gIFB1dCBOVUxMIGF0IGRlc2NyaXB0aW9uWzBdICovCisvKiA4MSBieXRlcyBtYXhpbXVtIC0gd2l0aCA0OSBjaGFyYWN0ZXIgZGVzY3JpcHRpb24gcGx1cyBOVUxMLiAqLworCisvKiBUaGlzIGxpbmUgYWRkZWQgYXQgUm95Y3JvZnQncyByZXF1ZXN0ICovCisvKiBNaWNyb3NvZnQncyBOVCBjb21waWxlciBnZXRzIGNvbmZ1c2VkIGlmIHlvdSBkbyBhIHBhY2sgYW5kIGRvbid0ICovCisvKiByZXN0b3JlIGl0LiAqLworCisjaWZuZGVmIE5PX1VOUEFDSworI2lmIGRlZmluZWQgKF9EUFRfQUlYKQorI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CisjZWxpZiBkZWZpbmVkIChVTlBBQ0tfRk9VUikKKyNwcmFnbWEgcGFjayg0KQorI2Vsc2UKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYgIC8qIGFpeCAqLworI2VuZGlmCisvKiBGb3IgdGhlIE1hY2ludG9zaCAqLworI2lmIFNUUlVDVEFMSUdOTUVOVFNVUFBPUlRFRAorI3ByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0L29zZF9kZWZzLmggYi9kcml2ZXJzL3Njc2kvZHB0L29zZF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzYWU1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kcHQvb3NkX2RlZnMuaApAQCAtMCwwICsxLDc5IEBACisvKglCU0RJIG9zZF9kZWZzLmgsdiAxLjQgMTk5OC8wNi8wMyAxOToxNDo1OCBrYXJlbHMgRXhwCSovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGZvcm0sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGBhcyBpcycgYnkgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IGFuZAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlCisgKiBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSwKKyAqIGFyZSBkaXNjbGFpbWVkLiBJbiBubyBldmVudCBzaGFsbCBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgYmUKKyAqIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSBvcgorICogY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2YKKyAqIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcworICogaW50ZXJydXB0aW9ucykgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluCisgKiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKQorICogYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgZHJpdmVyIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQKKyAqIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKyAqCisgKi8KKworI2lmbmRlZgkJX09TRF9ERUZTX0gKKyNkZWZpbmUJCV9PU0RfREVGU19ICisKKy8qRmlsZSAtIE9TRF9ERUZTLkgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKglUaGlzIGZpbGUgY29udGFpbnMgdGhlIE9TIGRlcGVuZGVudCBkZWZpbmVzLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkCisgKmluIG9zZF91dGlsLmggYW5kIHByb3ZpZGVzIHRoZSBPUyBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGF0IGZpbGUuCisgKgorICpDb3B5cmlnaHQgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5LCBDb3JwLgorICoJICAxNDAgQ2FuZGFjZSBEci4KKyAqCSAgTWFpdGxhbmQsIEZsLgkzMjc1MSAgIFVTQQorICoJICBQaG9uZTogKDQwNykgODMwLTU1MjIgIEZheDogKDQwNykgMjYwLTUzNjYKKyAqCSAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqQXV0aG9yOglEb3VnIEFuZGVyc29uCisgKkRhdGU6CQkxLzMxLzk0CisgKgorICpFZGl0b3JzOgorICoKKyAqUmVtYXJrczoKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qRGVmaW5pdGlvbnMgLSBEZWZpbmVzICYgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogRGVmaW5lIHRoZSBvcGVyYXRpbmcgc3lzdGVtICovCisjaWYgKGRlZmluZWQoX19saW51eF9fKSkKKyMgZGVmaW5lIF9EUFRfTElOVVgKKyNlbGlmIChkZWZpbmVkKF9fYnNkaV9fKSkKKyMgZGVmaW5lIF9EUFRfQlNESQorI2VsaWYgKGRlZmluZWQoX19GcmVlQlNEX18pKQorIyBkZWZpbmUgX0RQVF9GUkVFX0JTRAorI2Vsc2UKKyMgZGVmaW5lIF9EUFRfU0NPCisjZW5kaWYKKworI2lmIGRlZmluZWQgKFpJTF9DVVJTRVMpCisjZGVmaW5lCQlfRFBUX0NVUlNFUworI2Vsc2UKKyNkZWZpbmUgICAgICAgICBfRFBUX01PVElGCisjZW5kaWYKKworICAvKiBSZWRlZmluZSAnZmFyJyB0byBub3RoaW5nIC0gbm8gZmFyIHBvaW50ZXIgdHlwZSByZXF1aXJlZCBpbiBVTklYICovCisjZGVmaW5lCQlmYXIKKworICAvKiBEZWZpbmUgdGhlIG11dHVhbGx5IGV4Y2x1c2l2ZSBzZW1hcGhvcmUgdHlwZSAqLworI2RlZmluZQkJU0VNQVBIT1JFX1QJdW5zaWduZWQgaW50ICoKKyAgLyogRGVmaW5lIGEgaGFuZGxlIHRvIGEgRExMICovCisjZGVmaW5lCQlETExfSEFORExFX1QJdW5zaWduZWQgaW50ICoKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0L29zZF91dGlsLmggYi9kcml2ZXJzL3Njc2kvZHB0L29zZF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1NmMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kcHQvb3NkX3V0aWwuaApAQCAtMCwwICsxLDM1OCBAQAorLyoJQlNESSBvc2RfdXRpbC5oLHYgMS44IDE5OTgvMDYvMDMgMTk6MTQ6NTgga2FyZWxzIEV4cAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGZvcm0sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGBhcyBpcycgYnkgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IGFuZAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlCisgKiBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSwKKyAqIGFyZSBkaXNjbGFpbWVkLiBJbiBubyBldmVudCBzaGFsbCBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgYmUKKyAqIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSBvcgorICogY29uc2VxdWVudGlhbCBkYW1hZ2VzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2YKKyAqIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7IGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcworICogaW50ZXJydXB0aW9ucykgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluCisgKiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKQorICogYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZiB0aGUgdXNlIG9mIHRoaXMgZHJpdmVyIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQKKyAqIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKyAqCisgKi8KKworI2lmbmRlZiAgICAgICAgIF9fT1NEX1VUSUxfSAorI2RlZmluZSAgICAgICAgIF9fT1NEX1VUSUxfSAorCisvKkZpbGUgLSBPU0RfVVRJTC5ICisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5lcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyB0aGF0IGFyZQorICpvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudC4gIFRoZSByZXNvdXJjZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUKKyAqYXJlIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBhcHBsaWNhdGlvbi4KKyAqCisgKkNvcHlyaWdodCBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3ksIENvcnAuCisgKiAgICAgICAgMTQwIENhbmRhY2UgRHIuCisgKiAgICAgICAgTWFpdGxhbmQsIEZsLiAzMjc1MSAgIFVTQQorICogICAgICAgIFBob25lOiAoNDA3KSA4MzAtNTUyMiAgRmF4OiAoNDA3KSAyNjAtNTM2NgorICogICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKkF1dGhvcjogICAgICAgRG91ZyBBbmRlcnNvbgorICpEYXRlOiAgICAgICAgIDEvNy85NAorICoKKyAqRWRpdG9yczoKKyAqCisgKlJlbWFya3M6CisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKkRlZmluaXRpb25zIC0gRGVmaW5lcyAmIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBPcGVyYXRpbmcgc3lzdGVtIHNlbGVjdGlvbnM6ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfTVNET1MgICAgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9XSU5fM1ggICAgICovCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX1dJTl80WCAgICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfV0lOX05UICAgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9ORVRXQVJFICAgICovCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX09TMiAgICAgICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfU0NPICAgICAgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9VTklYV0FSRSAgICovCisvKiNkZWZpbmUgICAgICAgICAgICAgICBfRFBUX1NPTEFSSVMgICAgKi8KKy8qI2RlZmluZSAgICAgICAgICAgICAgIF9EUFRfTkVYVFNURVAgICAqLworLyojZGVmaW5lICAgICAgICAgICAgICAgX0RQVF9CQU5ZQU4gICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEluY2x1ZGUgdGhlIE9TIHNwZWNpZmljIGRlZmluZXMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyojZGVmaW5lICAgICAgIE9TX1NFTEVDVElPTiAgICBGcm9tIEFib3ZlIExpc3QgKi8KKy8qI2RlZmluZSAgICAgICBTRU1BUEhPUkVfVCAgICAgPz8/ICovCisvKiNkZWZpbmUgICAgICAgRExMX0hBTkRMRV9UICAgID8/PyAqLworCisjaWYgKGRlZmluZWQoS0VSTkVMKSAmJiAoZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX2JzZGlfXykpKQorIyBpbmNsdWRlICAgICAgICAiaTM4Ni9pc2EvZHB0X29zZF9kZWZzLmgiCisjZWxzZQorIyBpbmNsdWRlICAgICAgICAib3NkX2RlZnMuaCIKKyNlbmRpZgorCisjaWZuZGVmIERQVF9VTkFMSUdORUQKKyAgICNkZWZpbmUgICAgICBEUFRfVU5BTElHTkVECisjZW5kaWYKKworI2lmbmRlZiBEUFRfRVhQT1JUCisgICAjZGVmaW5lICAgICAgRFBUX0VYUE9SVAorI2VuZGlmCisKKyNpZm5kZWYgRFBUX0lNUE9SVAorICAgI2RlZmluZSAgICAgIERQVF9JTVBPUlQKKyNlbmRpZgorCisjaWZuZGVmIERQVF9SVU5USU1FX0lNUE9SVAorICAgI2RlZmluZSAgICAgIERQVF9SVU5USU1FX0lNUE9SVCAgRFBUX0lNUE9SVAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBPUyBkZXBlbmRlbnQgZGVmaW5lcyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQgKF9EUFRfTVNET1MpIHx8IGRlZmluZWQgKF9EUFRfV0lOXzNYKQorICAgI2RlZmluZSAgICAgIF9EUFRfMTZfQklUCisjZWxzZQorICAgI2RlZmluZSAgICAgIF9EUFRfMzJfQklUCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9EUFRfU0NPKSB8fCBkZWZpbmVkIChfRFBUX1VOSVhXQVJFKSB8fCBkZWZpbmVkIChfRFBUX1NPTEFSSVMpIHx8IGRlZmluZWQgKF9EUFRfQUlYKSB8fCBkZWZpbmVkIChTTklfTUlQUykgfHwgZGVmaW5lZCAoX0RQVF9CU0RJKSB8fCBkZWZpbmVkIChfRFBUX0ZSRUVfQlNEKSB8fCBkZWZpbmVkKF9EUFRfTElOVVgpCisgICAjZGVmaW5lICAgICAgX0RQVF9VTklYCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9EUFRfV0lOXzN4KSB8fCBkZWZpbmVkIChfRFBUX1dJTl80WCkgfHwgZGVmaW5lZCAoX0RQVF9XSU5fTlQpIFwKKwkgICAgfHwgZGVmaW5lZCAoX0RQVF9PUzIpCisgICAjZGVmaW5lICAgICAgX0RQVF9ETExfU1VQUE9SVAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX0RQVF9NU0RPUykgJiYgIWRlZmluZWQgKF9EUFRfV0lOXzNYKSAmJiAhZGVmaW5lZCAoX0RQVF9ORVRXQVJFKQorICAgI2RlZmluZSAgICAgIF9EUFRfUFJFRU1QVElWRQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX0RQVF9NU0RPUykgJiYgIWRlZmluZWQgKF9EUFRfV0lOXzNYKQorICAgI2RlZmluZSAgICAgIF9EUFRfTVVMVElfVEhSRUFERUQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9EUFRfTVNET1MpCisgICAjZGVmaW5lICAgICAgX0RQVF9NVUxUSV9UQVNLSU5HCisjZW5kaWYKKworICAvKiBUaGVzZSBleGlzdCBmb3IgcGxhdGZvcm1zIHRoYXQgICAqLworICAvKiBjaHVuayB3aGVuIGFjY2Vzc2luZyBtaXMtYWxpZ25lZCAqLworICAvKiBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIGRlZmluZWQgKFNOSV9NSVBTKSB8fCBkZWZpbmVkIChfRFBUX1NPTEFSSVMpCisgICAjaWYgZGVmaW5lZCAoX0RQVF9CSUdfRU5ESUFOKQorCSNpZiAhZGVmaW5lZCAoX0RQVF9TVFJJQ1RfQUxJR04pCisgICAgICAgICAgICAjZGVmaW5lIF9EUFRfU1RSSUNUX0FMSUdOCisJI2VuZGlmCisgICAjZW5kaWYKKyNlbmRpZgorCisgIC8qIERldGVybWluZSBpZiBpbiBDIG9yIEMrKyBtb2RlICovCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICAjZGVmaW5lICAgICAgX0RQVF9DUFAKKyNlbHNlCisgICAjZGVmaW5lICAgICAgX0RQVF9DCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFVuZGVyIFNvbGFyaXMgdGhlIGNvbXBpbGVyIHJlZnVzZXMgdG8gYWNjZXB0IGNvZGUgbGlrZTogICAgICAgICAgICovCisvKiAgIHsgeyJEUFQifSwgMCwgTlVMTCAuLi4uIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogYW5kIGNvbXBsYWlucyBhYm91dCB0aGUgeyJEUFQifSBwYXJ0IGJ5IHNheWluZyAiY2Fubm90IHVzZSB7IH0gICAgKi8KKy8qIHRvIGluaXRpYWxpemUgY2hhcioiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnkgZGVmaW5pbmcgdGhlc2UgdWdseSBtYWNyb3Mgd2UgY2FuIGdldCBhcm91bmQgdGhpcyBhbmQgYWxzbyAgICAgKi8KKy8qIG5vdCBoYXZlIHRvIGNvcHkgYW5kICNpZmRlZiBsYXJnZSBzZWN0aW9ucyBvZiBjb2RlLiAgSSBrbm93IHRoYXQgICovCisvKiB0aGVzZSBtYWNyb3MgYXJlICpyZWFsbHkqIHVnbHksIGJ1dCB0aGV5IHNob3VsZCBoZWxwIHJlZHVjZSAgICAgICAqLworLyogbWFpbnRlbmFuY2UgaW4gdGhlIGxvbmcgcnVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmICFkZWZpbmVkIChEUFRTUU8pCisgICAjaWYgZGVmaW5lZCAoX0RQVF9TT0xBUklTKQorICAgICAgI2RlZmluZSBEUFRTUU8KKyAgICAgICNkZWZpbmUgRFBUU1FDCisgICAjZWxzZQorICAgICAgI2RlZmluZSBEUFRTUU8geworICAgICAgI2RlZmluZSBEUFRTUUMgfQorICAgI2VuZGlmICAvKiBzb2xhcmlzICovCisjZW5kaWYgIC8qIERQVFNRTyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogT1MgZGVwZW5kZW50IHR5cGVkZWZzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQgKF9EUFRfTVNET1MpIHx8IGRlZmluZWQgKF9EUFRfU0NPKQorICAgI2RlZmluZSBCWVRFIHVuc2lnbmVkIGNoYXIKKyAgICNkZWZpbmUgV09SRCB1bnNpZ25lZCBzaG9ydAorI2VuZGlmCisKKyNpZm5kZWYgX0RQVF9UWVBFREVGUworICAgI2RlZmluZSBfRFBUX1RZUEVERUZTCisgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1Q0hBUjsKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVTSE9SVDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVJTlQ7CisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1TE9ORzsKKworICAgdHlwZWRlZiB1bmlvbiB7CisJIHVDSEFSICAgICAgICB1OFs0XTsKKwkgdVNIT1JUICAgICAgIHUxNlsyXTsKKwkgdUxPTkcgICAgICAgIHUzMjsKKyAgIH0gYWNjZXNzX1U7CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOVUxMKQorICAgI2RlZmluZSAgICAgIE5VTEwgICAgMAorI2VuZGlmCisKKworLypQcm90b3R5cGVzIC0gZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworICAgZXh0ZXJuICJDIiB7ICAgICAgICAgLyogRGVjbGFyZSBhbGwgdGhlc2UgZnVuY3Rpb25zIGFzICJDIiBmdW5jdGlvbnMgKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQnl0ZSByZXZlcnNhbCBmdW5jdGlvbnMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogUmV2ZXJzZXMgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgYSAyIGJ5dGUgdmFyaWFibGUgKi8KKyNpZiAoIWRlZmluZWQob3NkU3dhcDIpKQorIHVTSE9SVCAgICAgICBvc2RTd2FwMihEUFRfVU5BTElHTkVEIHVTSE9SVCAqKTsKKyNlbmRpZiAgLy8gIW9zZFN3YXAyCisKKyAgLyogUmV2ZXJzZXMgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgYSA0IGJ5dGUgdmFyaWFibGUgYW5kIHNoaWZ0cyBsZWZ0IDggYml0cyAqLworI2lmICghZGVmaW5lZChvc2RTd2FwMykpCisgdUxPTkcgICAgICAgIG9zZFN3YXAzKERQVF9VTkFMSUdORUQgdUxPTkcgKik7CisjZW5kaWYgIC8vICFvc2RTd2FwMworCisKKyNpZmRlZiAgX0RQVF9ORVRXQVJFCisgICAjaW5jbHVkZSAibm92cGFzcy5oIiAvKiBGb3IgRFBUX0Jzd2FwbCgpIHByb3RvdHlwZSAqLworCS8qIElubGluZSB0aGUgYnl0ZSBzd2FwICovCisgICAjaWZkZWYgX19jcGx1c3BsdXMKKwkgaW5saW5lIHVMT05HIG9zZFN3YXA0KHVMT05HICppbkxvbmcpIHsKKwkgcmV0dXJuICppbkxvbmcgPSBEUFRfQnN3YXBsKCppbkxvbmcpOworCSB9CisgICAjZWxzZQorCSAjZGVmaW5lIG9zZFN3YXA0KGluTG9uZykgICAgICAgRFBUX0Jzd2FwbChpbkxvbmcpCisgICAjZW5kaWYgIC8vIGNwbHVzcGx1cworI2Vsc2UKKwkvKiBSZXZlcnNlcyB0aGUgYnl0ZSBvcmRlcmluZyBvZiBhIDQgYnl0ZSB2YXJpYWJsZSAqLworIyBpZiAoIWRlZmluZWQob3NkU3dhcDQpKQorICAgdUxPTkcgICAgICAgIG9zZFN3YXA0KERQVF9VTkFMSUdORUQgdUxPTkcgKik7CisjIGVuZGlmICAvLyAhb3NkU3dhcDQKKworICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBBTFdBWVMgc3dhcCByZWdhcmRsZXNzIG9mIHRoZSAqCisgICAqIHByZXNlbmNlIG9mIERQVF9CSUdfRU5ESUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgIHVTSE9SVCAgICAgICB0cnVlU3dhcDIoRFBUX1VOQUxJR05FRCB1U0hPUlQgKik7CisgICB1TE9ORyAgICAgICAgdHJ1ZVN3YXA0KERQVF9VTkFMSUdORUQgdUxPTkcgKik7CisKKyNlbmRpZiAgLy8gbmV0d2FyZQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIE5ldHdvcmsgb3JkZXIgc3dhcCBmdW5jdGlvbnMgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZXNlIGZ1bmN0aW9ucy9tYWNyb3Mgd2lsbCBiZSB1c2VkICoKKyAqIGJ5IHRoZSBzdHJ1Y3R1cmUgaW5zZXJ0KCkvZXh0cmFjdCgpICoKKyAqIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCisgKiBXZSB3aWxsIGVuY2xvc2UgYWxsIHN0cnVjdHVyZSAgICAgICAqCisgKiBwb3J0YWJpbGl0eSBtb2RpZmljYXRpb25zIGluc2lkZSAgICAqCisgKiAjaWZkZWZzLiAgV2hlbiB3ZSBhcmUgcmVhZHksIHdlICAgICAqCisgKiB3aWxsICNkZWZpbmUgRFBUX1BPUlRBQkxFIHRvIGJlZ2luICAqCisgKiB1c2luZyB0aGUgbW9kaWZpY2F0aW9ucy4gICAgICAgICAgICAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordUxPTkcJbmV0U3dhcDQodUxPTkcgdmFsKTsKKworI2lmIGRlZmluZWQgKF9EUFRfQklHX0VORElBTikKKworLy8gZm9yIGJpZy1lbmRpYW4gd2UgbmVlZCB0byBzd2FwCisKKyNpZm5kZWYgTkVUX1NXQVBfMgorI2RlZmluZSBORVRfU1dBUF8yKHgpICgoKHgpID4+IDgpIHwgKCh4KSA8PCA4KSkKKyNlbmRpZiAgLy8gTkVUX1NXQVBfMgorCisjaWZuZGVmIE5FVF9TV0FQXzQKKyNkZWZpbmUgTkVUX1NXQVBfNCh4KSBuZXRTd2FwNCgoeCkpCisjZW5kaWYgIC8vIE5FVF9TV0FQXzQKKworI2Vsc2UKKworLy8gZm9yIGxpdHRsZS1lbmRpYW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZworCisjaWZuZGVmIE5FVF9TV0FQXzIKKyNkZWZpbmUgTkVUX1NXQVBfMih4KSAoeCkKKyNlbmRpZiAgLy8gTkVUX1NXQVBfMgorCisjaWZuZGVmIE5FVF9TV0FQXzQKKyNkZWZpbmUgTkVUX1NXQVBfNCh4KSAoeCkKKyNlbmRpZiAgLy8gTkVUX1NXQVBfNAorCisjZW5kaWYgIC8vIGJpZyBlbmRpYW4KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJ1bi10aW1lIGxvYWRhYmxlIG1vZHVsZSBmdW5jdGlvbnMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBMb2FkcyB0aGUgc3BlY2lmaWVkIHJ1bi10aW1lIGxvYWRhYmxlIERMTCAqLworRExMX0hBTkRMRV9UICAgIG9zZExvYWRNb2R1bGUodUNIQVIgKik7CisgIC8qIFVubG9hZHMgdGhlIHNwZWNpZmllZCBydW4tdGltZSBsb2FkYWJsZSBETEwgKi8KK3VTSE9SVCAgICAgICAgICBvc2RVbmxvYWRNb2R1bGUoRExMX0hBTkRMRV9UKTsKKyAgLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiBpbnNpZGUgYSBydW4tdGltZSBsb2FkYWJsZSBETEwgKi8KK3ZvaWQgKiAgICAgICAgICBvc2RHZXRGbkFkZHIoRExMX0hBTkRMRV9ULHVDSEFSICopOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTXV0dWFsbHkgZXhjbHVzaXZlIHNlbWFwaG9yZSBmdW5jdGlvbnMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogQ3JlYXRlIGEgbmFtZWQgc2VtYXBob3JlICovCitTRU1BUEhPUkVfVCAgICAgb3NkQ3JlYXRlTmFtZWRTZW1hcGhvcmUoY2hhciAqKTsKKyAgLyogQ3JlYXRlIGEgbXV0dWFsbHkgZXhsdXNpdmUgc2VtYXBob3JlICovCitTRU1BUEhPUkVfVCAgICAgb3NkQ3JlYXRlU2VtYXBob3JlKHZvaWQpOworCS8qIGNyZWF0ZSBhbiBldmVudCBzZW1hcGhvcmUgKi8KK1NFTUFQSE9SRV9UICAgICAgICAgICAgICBvc2RDcmVhdGVFdmVudFNlbWFwaG9yZSh2b2lkKTsKKwkvKiBjcmVhdGUgYSBuYW1lZCBldmVudCBzZW1hcGhvcmUgKi8KK1NFTUFQSE9SRV9UICAgICAgICAgICAgIG9zZENyZWF0ZU5hbWVkRXZlbnRTZW1hcGhvcmUoY2hhciAqKTsKKworICAvKiBEZXN0cm95IHRoZSBzcGVjaWZpZWQgbXV0dWFsbHkgZXhjbHVzaXZlIHNlbWFwaG9yZSBvYmplY3QgKi8KK3VTSE9SVCAgICAgICAgICBvc2REZXN0cm95U2VtYXBob3JlKFNFTUFQSE9SRV9UKTsKKyAgLyogUmVxdWVzdCBhY2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBtdXR1YWxseSBleGNsdXNpdmUgc2VtYXBob3JlICovCit1TE9ORyAgICAgICAgICAgb3NkUmVxdWVzdFNlbWFwaG9yZShTRU1BUEhPUkVfVCx1TE9ORyk7CisgIC8qIFJlbGVhc2UgYWNjZXNzIHRvIHRoZSBzcGVjaWZpZWQgbXV0dWFsbHkgZXhjbHVzaXZlIHNlbWFwaG9yZSAqLwordVNIT1JUICAgICAgICAgIG9zZFJlbGVhc2VTZW1hcGhvcmUoU0VNQVBIT1JFX1QpOworCS8qIHdhaXQgZm9yIGEgZXZlbnQgdG8gaGFwcGVuICovCit1TE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc2RXYWl0Rm9yRXZlbnRTZW1hcGhvcmUoU0VNQVBIT1JFX1QsIHVMT05HKTsKKwkvKiBzaWduYWwgYW4gZXZlbnQgKi8KK3VMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zZFNpZ25hbEV2ZW50U2VtYXBob3JlKFNFTUFQSE9SRV9UKTsKKwkvKiByZXNldCB0aGUgZXZlbnQgKi8KK3VMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zZFJlc2V0RXZlbnRTZW1hcGhvcmUoU0VNQVBIT1JFX1QpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaHJlYWQgZnVuY3Rpb25zICovCisvKi0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogUmVsZWFzZXMgY29udHJvbCB0byB0aGUgdGFzayBzd2l0Y2hlciBpbiBub24tcHJlZW1wdGl2ZSAqLworICAvKiBtdWx0aXRhc2tpbmcgb3BlcmF0aW5nIHN5c3RlbXMuICovCit2b2lkICAgICAgICAgICAgb3NkU3dpdGNoVGhyZWFkcyh2b2lkKTsKKworICAvKiBTdGFydHMgYSB0aHJlYWQgZnVuY3Rpb24gKi8KK3VMT05HICAgb3NkU3RhcnRUaHJlYWQodm9pZCAqLHZvaWQgKik7CisKKy8qIHdoYXQgaXMgbXkgdGhyZWFkIGlkICovCit1TE9ORyBvc2RHZXRUaHJlYWRJRCh2b2lkKTsKKworLyogd2FrZXMgdXAgdGhlIHNwZWNpZmVkIHRocmVhZCAqLwordm9pZCBvc2RXYWtlVGhyZWFkKHVMT05HKTsKKworLyogb3NkIHNsZWVwIGZvciB4IG1pbGlzZWNvbmRzICovCit2b2lkIG9zZFNsZWVwKHVMT05HKTsKKworI2RlZmluZSBEUFRfVEhSRUFEX1BSSU9SSVRZX0xPV0VTVCAweDAwCisjZGVmaW5lIERQVF9USFJFQURfUFJJT1JJVFlfTk9STUFMIDB4MDEKKyNkZWZpbmUgRFBUX1RIUkVBRF9QUklPUklUWV9ISUdIRVNUIDB4MDIKKwordUNIQVIgb3NkU2V0VGhyZWFkUHJpb3JpdHkodUxPTkcgdGlkLCB1Q0hBUiBwcmlvcml0eSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgfSAgICAvKiBlbmQgdGhlIHh0ZXJuICJDIiBkZWNsYXJhdGlvbiAqLworI2VuZGlmCisKKyNlbmRpZiAgLyogb3NkX3V0aWxfaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RwdC9zeXNfaW5mby5oIGIvZHJpdmVycy9zY3NpL2RwdC9zeXNfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyM2I3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHB0L3N5c19pbmZvLmgKQEAgLTAsMCArMSw0MTcgQEAKKy8qCUJTREkgc3lzX2luZm8uaCx2IDEuNiAxOTk4LzA2LzAzIDE5OjE0OjU5IGthcmVscyBFeHAJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBmb3JtLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyAqIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUKKyAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBgYXMgaXMnIGJ5IERpc3RyaWJ1dGVkIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBhbmQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZQorICogaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UsCisgKiBhcmUgZGlzY2xhaW1lZC4gSW4gbm8gZXZlbnQgc2hhbGwgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5IGJlCisgKiBsaWFibGUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnkgb3IKKyAqIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mCisgKiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MKKyAqIGludGVycnVwdGlvbnMpIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbgorICogY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkKKyAqIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIGRyaXZlciBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkCisgKiBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisgKgorICovCisKKyNpZm5kZWYgICAgICAgICBfX1NZU19JTkZPX0gKKyNkZWZpbmUgICAgICAgICBfX1NZU19JTkZPX0gKKworLypGaWxlIC0gU1lTX0lORk8uSAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKkRlc2NyaXB0aW9uOgorICoKKyAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgdGhlIE9TIGRlcGVuZGVudAorICpsYXllciBzeXN0ZW0gaW5mb3JtYXRpb24gYnVmZmVycy4KKyAqCisgKkNvcHlyaWdodCBEaXN0cmlidXRlZCBQcm9jZXNzaW5nIFRlY2hub2xvZ3ksIENvcnAuCisgKiAgICAgICAgMTQwIENhbmRhY2UgRHIuCisgKiAgICAgICAgTWFpdGxhbmQsIEZsLiAzMjc1MSAgIFVTQQorICogICAgICAgIFBob25lOiAoNDA3KSA4MzAtNTUyMiAgRmF4OiAoNDA3KSAyNjAtNTM2NgorICogICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKkF1dGhvcjogICAgICAgRG9uIEtlbXBlcgorICpEYXRlOiAgICAgICAgIDUvMTAvOTQKKyAqCisgKkVkaXRvcnM6CisgKgorICpSZW1hcmtzOgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLypJbmNsdWRlIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgICAgICAgICJvc2RfdXRpbC5oIgorCisjaWZuZGVmIE5PX1BBQ0sKKyNpZiBkZWZpbmVkIChfRFBUX0FJWCkKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1wYWNrZWQKKyNlbHNlCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZiAgLyogYWl4ICovCisjZW5kaWYgIC8vIG5vIHVucGFjaworCisKKy8qc3RydWN0IC0gZHJpdmVQYXJhbV9TIC0gc3RhcnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGRyaXZlIHBhcmFtZXRlcnMgc2VlbiBkdXJpbmcKKyAqYm9vdGluZy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBkcml2ZVBhcmFtX1MgeworI2Vsc2UKKyAgIHR5cGVkZWYgc3RydWN0ICB7CisjZW5kaWYKKworICAgdVNIT1JUICAgICAgIGN5bGluZGVyczsgICAgICAvKiBVcHRvIDEwMjQgKi8KKyAgIHVDSEFSICAgICAgICBoZWFkczsgICAgICAgICAgLyogVXB0byAyNTUgKi8KKyAgIHVDSEFSICAgICAgICBzZWN0b3JzOyAgICAgICAgLyogVXB0byA2MyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisKKy8vLS0tLS0tLS0tLSBQb3J0YWJpbGl0eSBBZGRpdGlvbnMgLS0tLS0tLS0tLS0gaW4gc3Bfc2luZm8uY3BwCisjaWZkZWYgRFBUX1BPUlRBQkxFCisJdVNIT1JUCQluZXRJbnNlcnQoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisJdVNIT1JUCQluZXRFeHRyYWN0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworI2VuZGlmIC8vIERQVCBQT1JUQUJMRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICB9OworI2Vsc2UKKyAgIH0gZHJpdmVQYXJhbV9TOworI2VuZGlmCisvKmRyaXZlUGFyYW1fUyAtIGVuZCAqLworCisKKy8qc3RydWN0IC0gc3lzSW5mb19TIC0gc3RhcnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbW1hbmQgc3lzdGVtIGluZm9ybWF0aW9uIHRoYXQKKyAqc2hvdWxkIGJlIHJldHVybmVkIGJ5IGV2ZXJ5IE9TIGRlcGVuZGVudCBsYXllci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qZmxhZ3MgLSBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0lfQ01PU19WYWxpZCAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFNJX051bURyaXZlc1ZhbGlkICAgICAgIDB4MDAwMgorI2RlZmluZSBTSV9Qcm9jZXNzb3JWYWxpZCAgICAgICAweDAwMDQKKyNkZWZpbmUgU0lfTWVtb3J5U2l6ZVZhbGlkICAgICAgMHgwMDA4CisjZGVmaW5lIFNJX0RyaXZlUGFyYW1zVmFsaWQgICAgIDB4MDAxMAorI2RlZmluZSBTSV9TbWFydFJPTXZlclZhbGlkICAgICAweDAwMjAKKyNkZWZpbmUgU0lfT1N2ZXJzaW9uVmFsaWQgICAgICAgMHgwMDQwCisjZGVmaW5lIFNJX09Tc3BlY2lmaWNWYWxpZCAgICAgIDB4MDA4MCAgLyogMSBpZiBPUyBzdHJ1Y3R1cmUgcmV0dXJuZWQgKi8KKyNkZWZpbmUgU0lfQnVzVHlwZVZhbGlkICAgICAgICAgMHgwMTAwCisKKyNkZWZpbmUgU0lfQUxMX1ZBTElEICAgICAgICAgICAgMHgwRkZGICAvKiBBbGwgU3RkIFN5c0luZm8gaXMgdmFsaWQgKi8KKyNkZWZpbmUgU0lfTk9fU21hcnRST00gICAgICAgICAgMHg4MDAwCisKKy8qYnVzVHlwZSAtIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNJX0lTQV9CVVMgICAgICAweDAwCisjZGVmaW5lIFNJX01DQV9CVVMgICAgICAweDAxCisjZGVmaW5lIFNJX0VJU0FfQlVTICAgICAweDAyCisjZGVmaW5lIFNJX1BDSV9CVVMgICAgICAweDA0CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBzeXNJbmZvX1MgeworI2Vsc2UKKyAgIHR5cGVkZWYgc3RydWN0ICB7CisjZW5kaWYKKworICAgdUNIQVIgICAgICAgIGRyaXZlMENNT1M7ICAgICAgICAgICAgIC8qIENNT1MgRHJpdmUgMCBUeXBlICovCisgICB1Q0hBUiAgICAgICAgZHJpdmUxQ01PUzsgICAgICAgICAgICAgLyogQ01PUyBEcml2ZSAxIFR5cGUgKi8KKyAgIHVDSEFSICAgICAgICBudW1Ecml2ZXM7ICAgICAgICAgICAgICAvKiAwMDQwOjAwNzUgY29udGVudHMgKi8KKyAgIHVDSEFSICAgICAgICBwcm9jZXNzb3JGYW1pbHk7ICAgICAgICAvKiBTYW1lIGFzIERQVFNJRydzIGRlZmluaXRpb24gKi8KKyAgIHVDSEFSICAgICAgICBwcm9jZXNzb3JUeXBlOyAgICAgICAgICAvKiBTYW1lIGFzIERQVFNJRydzIGRlZmluaXRpb24gKi8KKyAgIHVDSEFSICAgICAgICBzbWFydFJPTU1ham9yVmVyc2lvbjsKKyAgIHVDSEFSICAgICAgICBzbWFydFJPTU1pbm9yVmVyc2lvbjsgICAvKiBTbWFydFJPTSB2ZXJzaW9uICovCisgICB1Q0hBUiAgICAgICAgc21hcnRST01SZXZpc2lvbjsKKyAgIHVTSE9SVCAgICAgICBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBTZWUgYml0IGRlZmluaXRpb25zIGFib3ZlICovCisgICB1U0hPUlQgICAgICAgY29udmVudGlvbmFsTWVtU2l6ZTsgICAgLyogaW4gS0IgKi8KKyAgIHVMT05HICAgICAgICBleHRlbmRlZE1lbVNpemU7ICAgICAgICAvKiBpbiBLQiAqLworICAgdUxPTkcgICAgICAgIG9zVHlwZTsgICAgICAgICAgICAgICAgIC8qIFNhbWUgYXMgRFBUU0lHJ3MgZGVmaW5pdGlvbiAqLworICAgdUNIQVIgICAgICAgIG9zTWFqb3JWZXJzaW9uOworICAgdUNIQVIgICAgICAgIG9zTWlub3JWZXJzaW9uOyAgICAgICAgIC8qIFRoZSBPUyB2ZXJzaW9uICovCisgICB1Q0hBUiAgICAgICAgb3NSZXZpc2lvbjsKKyNpZmRlZiBfU0lOSVhfQURET04KKyAgIHVDSEFSICAgICAgICBidXNUeXBlOyAgICAgICAgICAgICAgICAvKiBTZWUgZGVmaW5pbml0aW9ucyBhYm92ZSAqLworICAgdVNIT1JUICAgICAgIG9zU3ViUmV2aXNpb247CisgICB1Q0hBUiAgICAgICAgcGFkWzJdOyAgICAgICAgICAgICAgICAgLyogRm9yIGFsaWdubWVudCAqLworI2Vsc2UKKyAgIHVDSEFSICAgICAgICBvc1N1YlJldmlzaW9uOworICAgdUNIQVIgICAgICAgIGJ1c1R5cGU7ICAgICAgICAgICAgICAgIC8qIFNlZSBkZWZpbmluaXRpb25zIGFib3ZlICovCisgICB1Q0hBUiAgICAgICAgcGFkWzNdOyAgICAgICAgICAgICAgICAgLyogRm9yIGFsaWdubWVudCAqLworI2VuZGlmCisgICBkcml2ZVBhcmFtX1MgZHJpdmVzWzE2XTsgICAgICAgICAgICAgLyogU21hcnRST00gTG9naWNhbCBEcml2ZXMgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IHN5c0luZm9fUzsKKyNlbmRpZgorLypzeXNJbmZvX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIERPU19JbmZvX1MgLSBzdGFydAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKkRlc2NyaXB0aW9uOgorICoKKyAqICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3lzdGVtIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEKKyAqRE9TIHdvcmtzdGF0aW9uLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLypmbGFncyAtIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBESV9ET1NfSElHSCAgICAgICAgICAgICAweDAxICAgIC8qIERPUyBpcyBsb2FkZWQgaGlnaCAqLworI2RlZmluZSBESV9EUE1JX1ZBTElEICAgICAgICAgICAweDAyICAgIC8qIERQTUkgdmVyc2lvbiBpcyB2YWxpZCAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgICBzdHJ1Y3QgRE9TX0luZm9fUyB7CisjZWxzZQorICAgdHlwZWRlZiBzdHJ1Y3QgeworI2VuZGlmCisKKyAgIHVDSEFSICAgICAgICBmbGFnczsgICAgICAgICAgLyogU2VlIGJpdCBkZWZpbml0aW9ucyBhYm92ZSAqLworICAgdVNIT1JUICAgICAgIGRyaXZlckxvY2F0aW9uOyAvKiBTbWFydFJPTSBCSU9TIGFkZHJlc3MgKi8KKyAgIHVTSE9SVCAgICAgICBET1NfdmVyc2lvbjsKKyAgIHVTSE9SVCAgICAgICBEUE1JX3ZlcnNpb247CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKworLy8tLS0tLS0tLS0tIFBvcnRhYmlsaXR5IEFkZGl0aW9ucyAtLS0tLS0tLS0tLSBpbiBzcF9zaW5mby5jcHAKKyNpZmRlZiBEUFRfUE9SVEFCTEUKKwl1U0hPUlQJCW5ldEluc2VydChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKwl1U0hPUlQJCW5ldEV4dHJhY3QoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisjZW5kaWYgLy8gRFBUIFBPUlRBQkxFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIH07CisjZWxzZQorICAgfSBET1NfSW5mb19TOworI2VuZGlmCisvKkRPU19JbmZvX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIE5ldHdhcmVfSW5mb19TIC0gc3RhcnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhCisgKk5ldHdhcmUgbWFjaGluZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBOZXR3YXJlX0luZm9fUyB7CisjZWxzZQorICAgdHlwZWRlZiBzdHJ1Y3QgeworI2VuZGlmCisKKyAgIHVDSEFSICAgICAgICBkcml2ZXJOYW1lWzEzXTsgICAgICAgICAvKiBpZSBQTTEyTlczMS5EU0sgKi8KKyAgIHVDSEFSICAgICAgICBzZXJ2ZXJOYW1lWzQ4XTsKKyAgIHVDSEFSICAgICAgICBuZXR3YXJlVmVyc2lvbjsgICAgICAgICAvKiBUaGUgTmV0d2FyZSBPUyB2ZXJzaW9uICovCisgICB1Q0hBUiAgICAgICAgbmV0d2FyZVN1YlZlcnNpb247CisgICB1Q0hBUiAgICAgICAgbmV0d2FyZVJldmlzaW9uOworICAgdVNIT1JUICAgICAgIG1heENvbm5lY3Rpb25zOyAgICAgICAgIC8qIFByb2JhYmx5ICAyNTAgb3IgMTAwMCAqLworICAgdVNIT1JUICAgICAgIGNvbm5lY3Rpb25zSW5Vc2U7CisgICB1U0hPUlQgICAgICAgbWF4Vm9sdW1lczsKKyAgIHVDSEFSICAgICAgICB1bnVzZWQ7CisgICB1Q0hBUiAgICAgICAgU0ZUbGV2ZWw7CisgICB1Q0hBUiAgICAgICAgVFRTbGV2ZWw7CisKKyAgIHVDSEFSICAgICAgICBjbGliTWFqb3JWZXJzaW9uOyAgICAgICAvKiBUaGUgQ0xJQi5OTE0gdmVyc2lvbiAqLworICAgdUNIQVIgICAgICAgIGNsaWJNaW5vclZlcnNpb247CisgICB1Q0hBUiAgICAgICAgY2xpYlJldmlzaW9uOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisKKy8vLS0tLS0tLS0tLSBQb3J0YWJpbGl0eSBBZGRpdGlvbnMgLS0tLS0tLS0tLS0gaW4gc3Bfc2luZm8uY3BwCisjaWZkZWYgRFBUX1BPUlRBQkxFCisJdVNIT1JUCQluZXRJbnNlcnQoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisJdVNIT1JUCQluZXRFeHRyYWN0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworI2VuZGlmIC8vIERQVCBQT1JUQUJMRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICB9OworI2Vsc2UKKyAgIH0gTmV0d2FyZV9JbmZvX1M7CisjZW5kaWYKKy8qTmV0d2FyZV9JbmZvX1MgLSBlbmQgKi8KKworCisvKnN0cnVjdCAtIE9TMl9JbmZvX1MgLSBzdGFydAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKkRlc2NyaXB0aW9uOgorICoKKyAqICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3lzdGVtIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGFuCisgKk9TLzIgbWFjaGluZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBPUzJfSW5mb19TIHsKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCB7CisjZW5kaWYKKworICAgdUNIQVIgICAgICAgIHNvbWV0aGluZzsKKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IE9TMl9JbmZvX1M7CisjZW5kaWYKKy8qT1MyX0luZm9fUyAtIGVuZCAqLworCisKKy8qc3RydWN0IC0gV2luTlRfSW5mb19TIC0gc3RhcnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICpEZXNjcmlwdGlvbjoKKyAqCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhCisgKldpbmRvd3MgTlQgbWFjaGluZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBXaW5OVF9JbmZvX1MgeworI2Vsc2UKKyAgIHR5cGVkZWYgc3RydWN0IHsKKyNlbmRpZgorCisgICB1Q0hBUiAgICAgICAgc29tZXRoaW5nOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisKKy8vLS0tLS0tLS0tLSBQb3J0YWJpbGl0eSBBZGRpdGlvbnMgLS0tLS0tLS0tLS0gaW4gc3Bfc2luZm8uY3BwCisjaWZkZWYgRFBUX1BPUlRBQkxFCisJdVNIT1JUCQluZXRJbnNlcnQoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisJdVNIT1JUCQluZXRFeHRyYWN0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworI2VuZGlmIC8vIERQVCBQT1JUQUJMRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICB9OworI2Vsc2UKKyAgIH0gV2luTlRfSW5mb19TOworI2VuZGlmCisvKldpbk5UX0luZm9fUyAtIGVuZCAqLworCisKKy8qc3RydWN0IC0gU0NPX0luZm9fUyAtIHN0YXJ0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYW4KKyAqU0NPIFVOSVggbWFjaGluZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgIHN0cnVjdCBTQ09fSW5mb19TIHsKKyNlbHNlCisgICB0eXBlZGVmIHN0cnVjdCB7CisjZW5kaWYKKworICAgdUNIQVIgICAgICAgIHNvbWV0aGluZzsKKworI2lmZGVmICBfX2NwbHVzcGx1cworCisvLy0tLS0tLS0tLS0gUG9ydGFiaWxpdHkgQWRkaXRpb25zIC0tLS0tLS0tLS0tIGluIHNwX3NpbmZvLmNwcAorI2lmZGVmIERQVF9QT1JUQUJMRQorCXVTSE9SVAkJbmV0SW5zZXJ0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworCXVTSE9SVAkJbmV0RXh0cmFjdChkcHRCdWZmZXJfUyAqYnVmZmVyKTsKKyNlbmRpZiAvLyBEUFQgUE9SVEFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgfTsKKyNlbHNlCisgICB9IFNDT19JbmZvX1M7CisjZW5kaWYKKy8qU0NPX0luZm9fUyAtIGVuZCAqLworCisKKy8qc3RydWN0IC0gVVNMX0luZm9fUyAtIHN0YXJ0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqRGVzY3JpcHRpb246CisgKgorICogICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYQorICpVU0wgVU5JWCBtYWNoaW5lLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworICAgc3RydWN0IFVTTF9JbmZvX1MgeworI2Vsc2UKKyAgIHR5cGVkZWYgc3RydWN0IHsKKyNlbmRpZgorCisgICB1Q0hBUiAgICAgICAgc29tZXRoaW5nOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCisKKy8vLS0tLS0tLS0tLSBQb3J0YWJpbGl0eSBBZGRpdGlvbnMgLS0tLS0tLS0tLS0gaW4gc3Bfc2luZm8uY3BwCisjaWZkZWYgRFBUX1BPUlRBQkxFCisJdVNIT1JUCQluZXRJbnNlcnQoZHB0QnVmZmVyX1MgKmJ1ZmZlcik7CisJdVNIT1JUCQluZXRFeHRyYWN0KGRwdEJ1ZmZlcl9TICpidWZmZXIpOworI2VuZGlmIC8vIERQVCBQT1JUQUJMRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICB9OworI2Vsc2UKKyAgIH0gVVNMX0luZm9fUzsKKyNlbmRpZgorLypVU0xfSW5mb19TIC0gZW5kICovCisKKworICAvKiBSZXN0b3JlIGRlZmF1bHQgc3RydWN0dXJlIHBhY2tpbmcgKi8KKyNpZm5kZWYgTk9fVU5QQUNLCisjaWYgZGVmaW5lZCAoX0RQVF9BSVgpCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKKyNlbGlmIGRlZmluZWQgKFVOUEFDS19GT1VSKQorI3ByYWdtYSBwYWNrKDQpCisjZWxzZQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZiAgLyogYWl4ICovCisjZW5kaWYgIC8vIG5vIHVucGFjaworCisjZW5kaWYgIC8vIF9fU1lTX0lORk9fSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0X2kyby5jIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M5YjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwpAQCAtMCwwICsxLDMzODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHB0aS5jICAtICBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYmVnaW4gICAgICAgICAgICAgICAgOiBUaHUgU2VwIDcgMjAwMAorICAgIGNvcHlyaWdodCAgICAgICAgICAgIDogKEMpIDIwMDAgYnkgQWRhcHRlYworCisJCQkgICBKdWx5IDMwLCAyMDAxIEZpcnN0IHZlcnNpb24gYmVpbmcgc3VibWl0dGVkCisJCQkgICBmb3IgaW5jbHVzaW9uIGluIHRoZSBrZXJuZWwuICBWMi40CisKKyAgICBTZWUgRG9jdW1lbnRhdGlvbi9zY3NpL2RwdGkudHh0IGZvciBoaXN0b3J5LCBub3RlcywgbGljZW5zZSBpbmZvCisgICAgYW5kIGNyZWRpdHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTYXQgRGVjIDIwIDIwMDMgR28gVGFuaWd1Y2hpIDxnb0B0dXJib2xpbnV4LmNvLmpwPgorIC0gU3VwcG9ydCAyLjYga2VybmVsIGFuZCBETUEtbWFwcGluZworIC0gaW9jdGwgZml4IGZvciByYWlkIHRvb2xzCisgLSB1c2Ugc2NoZWR1bGVfdGltZW91dCBpbiBsb25nIGxvbmcgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiNkZWZpbmUgREVCVUcgMSAqLworLyojZGVmaW5lIFVBUlRERUxBWSAxICovCisKKy8qIE9uIHRoZSByZWFsIGtlcm5lbCBBRERSMzIgc2hvdWxkIGFsd2F5cyBiZSB6ZXJvIGZvciAyLjQuIEdGUF9ISUdIIGFsbG9jYXRlcworICAgaGlnaCBwYWdlcy4gS2VlcCB0aGUgbWFjcm8gYXJvdW5kIGJlY2F1c2Ugb2YgdGhlIGJyb2tlbiB1bm1lcmdlZCBpYTY0IHRyZWUgKi8KKworI2RlZmluZSBBRERSMzIgKDApCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK01PRFVMRV9BVVRIT1IoIkRlYW5uYSBCb25kcywgd2l0aCBfbG90c18gb2YgaGVscCBmcm9tIE1hcmsgU2FseXp5biIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBZGFwdGVjIEkyTyBSQUlEIERyaXZlciIpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgkvKiBGb3IgU0NTSS1QYXNzdGhyb3VnaCAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyogZm9yIGttYWxsb2MoKSAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBmb3IgQ09ORklHX1BDSSAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogZm9yIFBDSSBzdXBwb3J0ICovCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciB1ZGVsYXkgKi8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogZm9yIHByaW50ayAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogZm9yIGJvb3RfY3B1X2RhdGEgKi8KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogZm9yIHZpcnRfdG9fYnVzLCBldGMuICovCisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKworI2luY2x1ZGUgImRwdC9kcHRzaWcuaCIKKyNpbmNsdWRlICJkcHRpLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ3JlYXRlIGEgYmluYXJ5IHNpZ25hdHVyZSAtIHRoaXMgaXMgcmVhZCBieSBkcHRzaWcKKyAqIE5lZWRlZCBmb3Igb3VyIG1hbmFnZW1lbnQgYXBwcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBkcHRfc2lnX1MgRFBUSV9zaWcgPSB7CisJeydkJywgJ1AnLCAndCcsICdTJywgJ2knLCAnRyd9LCBTSUdfVkVSU0lPTiwKKyNpZmRlZiBfX2kzODZfXworCVBST0NfSU5URUwsIFBST0NfMzg2IHwgUFJPQ180ODYgfCBQUk9DX1BFTlRJVU0gfCBQUk9DX1NFWElVTSwKKyNlbGlmIGRlZmluZWQoX19pYTY0X18pCisJUFJPQ19JTlRFTCwgUFJPQ19JQTY0LAorI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisJUFJPQ19VTFRSQVNQQVJDLCBQUk9DX1VMVFJBU1BBUkMsCisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlQUk9DX0FMUEhBLCBQUk9DX0FMUEhBLAorI2Vsc2UKKwkoLTEpLCgtMSksCisjZW5kaWYKKwkgRlRfSEJBRFJWUiwgMCwgT0VNX0RQVCwgT1NfTElOVVgsIENBUF9PVkVSTEFQLCBERVZfQUxMLAorCUFERl9BTExfU0M1LCAwLCAwLCBEUFRfVkVSU0lPTiwgRFBUX1JFVklTSU9OLCBEUFRfU1VCUkVWSVNJT04sCisJRFBUX01PTlRILCBEUFRfREFZLCBEUFRfWUVBUiwgIkFkYXB0ZWMgTGludXggSTJPIFJBSUQgRHJpdmVyIgorfTsKKworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHbG9iYWxzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgREVDTEFSRV9NVVRFWChhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJvX3N5c190YmwgKnN5c190YmwgPSBOVUxMOworc3RhdGljIGludCBzeXNfdGJsX2luZCA9IDA7CitzdGF0aWMgaW50IHN5c190YmxfbGVuID0gMDsKKworc3RhdGljIGFkcHRfaGJhKiBoYmFzW0RQVElfTUFYX0hCQV07CitzdGF0aWMgYWRwdF9oYmEqIGhiYV9jaGFpbiA9IE5VTEw7CitzdGF0aWMgaW50IGhiYV9jb3VudCA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkcHRfZm9wcyA9IHsKKwkuaW9jdGwJCT0gYWRwdF9pb2N0bCwKKwkub3BlbgkJPSBhZHB0X29wZW4sCisJLnJlbGVhc2UJPSBhZHB0X2Nsb3NlCit9OworCisjaWZkZWYgUkVCT09UX05PVElGSUVSCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFkcHRfcmVib290X25vdGlmaWVyID0KK3sKKwkgYWRwdF9yZWJvb3RfZXZlbnQsCisJIE5VTEwsCisJIDAKK307CisjZW5kaWYKKworLyogU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHN5bmNocm9ub3VzIG1lc3NhZ2UgcG9zdGluZy4KKyAqIFNlZSBhZHB0X2kyb19wb3N0X3dhaXQoKSBmb3IgZGVzY3JpcHRpb24KKyAqICovCitzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEKK3sKKwlpbnQgc3RhdHVzOworCXUzMiBpZDsKKwlhZHB0X3dhaXRfcXVldWVfaGVhZF90ICp3cTsKKwlzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhICphZHB0X3Bvc3Rfd2FpdF9xdWV1ZSA9IE5VTEw7CitzdGF0aWMgdTMyIGFkcHRfcG9zdF93YWl0X2lkID0gMDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWRwdF9wb3N0X3dhaXRfbG9jayk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJCQkJRnVuY3Rpb25zCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgdTggYWRwdF9yZWFkX2JsaW5rX2xlZChhZHB0X2hiYSogaG9zdCkKK3sKKwlpZihob3N0LT5Gd0RlYnVnQkxFRGZsYWdfUCAhPSAwKSB7CisJCWlmKCByZWFkYihob3N0LT5Gd0RlYnVnQkxFRGZsYWdfUCkgPT0gMHhiYyApeworCQkJcmV0dXJuIHJlYWRiKGhvc3QtPkZ3RGVidWdCTEVEdmFsdWVfUCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NzaSBob3N0IHRlbXBsYXRlIGludGVyZmFjZSBmdW5jdGlvbnMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkcHRpZHNbXSA9IHsKKwl7IFBDSV9EUFRfVkVORE9SX0lELCBQQ0lfRFBUX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXsgUENJX0RQVF9WRU5ET1JfSUQsIFBDSV9EUFRfUkFQVE9SX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLGRwdGlkcyk7CisKK3N0YXRpYyBpbnQgYWRwdF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSogc2h0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwRGV2ID0gTlVMTDsKKwlhZHB0X2hiYSogcEhiYTsKKworCWFkcHRfaW5pdCgpOworCisJUElORk8oIkRldGVjdGluZyBBZGFwdGVjIEkyTyBSQUlEIGNvbnRyb2xsZXJzLi4uXG4iKTsKKworICAgICAgICAvKiBzZWFyY2ggZm9yIGFsbCBBZGF0cGVjIEkyTyBSQUlEIGNhcmRzICovCisJd2hpbGUgKChwRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKCBQQ0lfRFBUX1ZFTkRPUl9JRCwgUENJX0FOWV9JRCwgcERldikpKSB7CisJCWlmKHBEZXYtPmRldmljZSA9PSBQQ0lfRFBUX0RFVklDRV9JRCB8fAorCQkgICBwRGV2LT5kZXZpY2UgPT0gUENJX0RQVF9SQVBUT1JfREVWSUNFX0lEKXsKKwkJCWlmKGFkcHRfaW5zdGFsbF9oYmEoc2h0LCBwRGV2KSApeworCQkJCVBFUlJPUigiQ291bGQgbm90IEluaXQgYW4gSTJPIFJBSUQgZGV2aWNlXG4iKTsKKwkJCQlQRVJST1IoIldpbGwgbm90IHRyeSB0byBkZXRlY3Qgb3RoZXJzLlxuIik7CisJCQkJcmV0dXJuIGhiYV9jb3VudC0xOworCQkJfQorCQl9CisJfQorCisJLyogSW4gSU5JVCBzdGF0ZSwgQWN0aXZhdGUgSU9QcyAqLworCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKKwkJLy8gQWN0aXZhdGUgZG9lcyBnZXQgc3RhdHVzICwgaW5pdCBvdXRib3VuZCwgYW5kIGdldCBocnQKKwkJaWYgKGFkcHRfaTJvX2FjdGl2YXRlX2hiYShwSGJhKSA8IDApIHsKKwkJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCX0KKwl9CisKKworCS8qIEFjdGl2ZSBJT1BzIGluIEhPTEQgc3RhdGUgKi8KKworcmVidWlsZF9zeXNfdGFiOgorCWlmIChoYmFfY2hhaW4gPT0gTlVMTCkgCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBidWlsZF9zeXNfdGFibGUgZmFpbHMsIHdlIGtpbGwgZXZlcnl0aGluZyBhbmQgYmFpbAorCSAqIGFzIHdlIGNhbid0IGluaXQgdGhlIElPUHMgdy9vIGEgc3lzdGVtIHRhYmxlCisJICovCQorCWlmIChhZHB0X2kyb19idWlsZF9zeXNfdGFibGUoKSA8IDApIHsKKwkJYWRwdF9pMm9fc3lzX3NodXRkb3duKCk7CisJCXJldHVybiAwOworCX0KKworCVBERUJVRygiSEJBJ3MgaW4gSE9MRCBzdGF0ZVxuIik7CisKKwkvKiBJZiBJT1AgZG9uJ3QgZ2V0IG9ubGluZSwgd2UgbmVlZCB0byByZWJ1aWxkIHRoZSBTeXN0ZW0gdGFibGUgKi8KKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCWlmIChhZHB0X2kyb19vbmxpbmVfaGJhKHBIYmEpIDwgMCkgeworCQkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsJCisJCQlnb3RvIHJlYnVpbGRfc3lzX3RhYjsKKwkJfQorCX0KKworCS8qIEFjdGl2ZSBJT1BzIG5vdyBpbiBPUEVSQVRJT05BTCBzdGF0ZSAqLworCVBERUJVRygiSEJBJ3MgaW4gT1BFUkFUSU9OQUwgc3RhdGVcbiIpOworCisJcHJpbnRrKCJkcHRpOiBJZiB5b3UgaGF2ZSBhIGxvdCBvZiBkZXZpY2VzIHRoaXMgY291bGQgdGFrZSBhIGZldyBtaW51dGVzLlxuIik7CisJZm9yIChwSGJhID0gaGJhX2NoYWluOyBwSGJhOyBwSGJhID0gcEhiYS0+bmV4dCkgeworCQlwcmludGsoS0VSTl9JTkZPIiVzOiBSZWFkaW5nIHRoZSBoYXJkd2FyZSByZXNvdXJjZSB0YWJsZS5cbiIsIHBIYmEtPm5hbWUpOworCQlpZiAoYWRwdF9pMm9fbGN0X2dldChwSGJhKSA8IDApeworCQkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGFkcHRfaTJvX3BhcnNlX2xjdChwSGJhKSA8IDApeworCQkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFkcHRfaW5xdWlyeShwSGJhKTsKKwl9CisKKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCWlmKCBhZHB0X3Njc2lfcmVnaXN0ZXIocEhiYSxzaHQpIDwgMCl7CisJCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQkJY29udGludWU7CisJCX0KKwkJcEhiYS0+aW5pdGlhbGl6ZWQgPSBUUlVFOworCQlwSGJhLT5zdGF0ZSAmPSB+RFBUSV9TVEFURV9SRVNFVDsKKwl9CisKKwkvLyBSZWdpc3RlciBvdXIgY29udHJvbCBkZXZpY2Ugbm9kZQorCS8vIG5vZGVzIHdpbGwgbmVlZCB0byBiZSBjcmVhdGVkIGluIC9kZXYgdG8gYWNjZXNzIHRoaXMKKwkvLyB0aGUgbm9kZXMgY2FuIG5vdCBiZSBjcmVhdGVkIGZyb20gd2l0aGluIHRoZSBkcml2ZXIKKwlpZiAoaGJhX2NvdW50ICYmIHJlZ2lzdGVyX2NocmRldihEUFRJX0kyT19NQUpPUiwgRFBUX0RSSVZFUiwgJmFkcHRfZm9wcykpIHsKKwkJYWRwdF9pMm9fc3lzX3NodXRkb3duKCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gaGJhX2NvdW50OworfQorCisKKy8qCisgKiBzY3NpX3VucmVnaXN0ZXIgd2lsbCBiZSBjYWxsZWQgQUZURVIgd2UgcmV0dXJuLiAKKyAqLworc3RhdGljIGludCBhZHB0X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlhZHB0X2hiYSogcEhiYSA9IChhZHB0X2hiYSopIGhvc3QtPmhvc3RkYXRhWzBdOworLy8JYWRwdF9pMm9fcXVpZXNjZV9oYmEocEhiYSk7CisJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwlzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYWRwdF9pbnF1aXJ5KGFkcHRfaGJhKiBwSGJhKQoreworCXUzMiBtc2dbMTRdOyAKKwl1MzIgKm1wdHI7CisJdTMyICpsZW5wdHI7CisJaW50IGRpcmVjdGlvbjsKKwlpbnQgc2NzaWRpcjsKKwl1MzIgbGVuOworCXUzMiByZXFsZW47CisJdTgqIGJ1ZjsKKwl1OCAgc2NiWzE2XTsKKwlzMzIgcmNvZGU7CisKKwltZW1zZXQobXNnLCAwLCBzaXplb2YobXNnKSk7CisJYnVmID0gKHU4KilrbWFsbG9jKDgwLEdGUF9LRVJORUx8QUREUjMyKTsKKwlpZighYnVmKXsKKwkJcHJpbnRrKEtFUk5fRVJSIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm47CisJfQorCW1lbXNldCgodm9pZCopYnVmLCAwLCAzNik7CisJCisJbGVuID0gMzY7CisJZGlyZWN0aW9uID0gMHgwMDAwMDAwMDsJCisJc2NzaWRpciAgPTB4NDAwMDAwMDA7CS8vIERBVEEgSU4gIChpb3A8LS1kZXYpCisKKwlyZXFsZW4gPSAxNDsJCS8vIFNJTkdMRSBTR0UKKwkvKiBTdGljayB0aGUgaGVhZGVycyBvbiAqLworCW1zZ1swXSA9IHJlcWxlbjw8MTYgfCBTR0xfT0ZGU0VUXzEyOworCW1zZ1sxXSA9ICgweGZmPDwyNHxIT1NUX1RJRDw8MTJ8QURBUFRFUl9USUQpOworCW1zZ1syXSA9IDA7CisJbXNnWzNdICA9IDA7CisJLy8gQWRhcHRlYy9EUFQgUHJpdmF0ZSBzdHVmZiAKKwltc2dbNF0gPSBJMk9fQ01EX1NDU0lfRVhFQ3xEUFRfT1JHQU5JWkFUSU9OX0lEPDwxNjsKKwltc2dbNV0gPSBBREFQVEVSX1RJRCB8IDE8PDE2IC8qIEludGVycHJldCovOworCS8qIERpcmVjdGlvbiwgZGlzY29ubmVjdCBvayB8IHNlbnNlIGRhdGEgfCBzaW1wbGUgcXVldWUgLCBDREJMZW4gKi8KKwkvLyBJMk9fU0NCX0ZMQUdfRU5BQkxFX0RJU0NPTk5FQ1QgfCAKKwkvLyBJMk9fU0NCX0ZMQUdfU0lNUExFX1FVRVVFX1RBRyB8IAorCS8vIEkyT19TQ0JfRkxBR19TRU5TRV9EQVRBX0lOX01FU1NBR0U7CisJbXNnWzZdID0gc2NzaWRpcnwweDIwYTAwMDAwfCA2IC8qIGNtZCBsZW4qLzsKKworCW1wdHI9bXNnKzc7CisKKwltZW1zZXQoc2NiLCAwLCBzaXplb2Yoc2NiKSk7CisJLy8gV3JpdGUgU0NTSSBjb21tYW5kIGludG8gdGhlIG1lc3NhZ2UgLSBhbHdheXMgMTYgYnl0ZSBibG9jayAKKwlzY2JbMF0gPSBJTlFVSVJZOworCXNjYlsxXSA9IDA7CisJc2NiWzJdID0gMDsKKwlzY2JbM10gPSAwOworCXNjYls0XSA9IDM2OworCXNjYls1XSA9IDA7CisJLy8gRG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdCBvZiBzY2IKKworCW1lbWNweShtcHRyLCBzY2IsIHNpemVvZihzY2IpKTsKKwltcHRyKz00OworCWxlbnB0cj1tcHRyKys7CQkvKiBSZW1lbWJlciBtZSAtIGZpbGwgaW4gd2hlbiB3ZSBrbm93ICovCisKKwkvKiBOb3cgZmlsbCBpbiB0aGUgU0dMaXN0IGFuZCBjb21tYW5kICovCisJKmxlbnB0ciA9IGxlbjsKKwkqbXB0cisrID0gMHhEMDAwMDAwMHxkaXJlY3Rpb258bGVuOworCSptcHRyKysgPSB2aXJ0X3RvX2J1cyhidWYpOworCisJLy8gU2VuZCBpdCBvbiBpdCdzIHdheQorCXJjb2RlID0gYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgcmVxbGVuPDwyLCAxMjApOworCWlmIChyY29kZSAhPSAwKSB7CisJCXNwcmludGYocEhiYS0+ZGV0YWlsLCAiQWRhcHRlYyBJMk8gUkFJRCIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW5xdWlyeSBFcnJvciAoJWQpXG4iLHBIYmEtPm5hbWUscmNvZGUpOworCQlpZiAocmNvZGUgIT0gLUVUSU1FICYmIHJjb2RlICE9IC1FSU5UUikKKwkJCWtmcmVlKGJ1Zik7CisJfSBlbHNlIHsKKwkJbWVtc2V0KHBIYmEtPmRldGFpbCwgMCwgc2l6ZW9mKHBIYmEtPmRldGFpbCkpOworCQltZW1jcHkoJihwSGJhLT5kZXRhaWwpLCAiVmVuZG9yOiBBZGFwdGVjICIsIDE2KTsKKwkJbWVtY3B5KCYocEhiYS0+ZGV0YWlsWzE2XSksICIgTW9kZWw6ICIsIDgpOworCQltZW1jcHkoJihwSGJhLT5kZXRhaWxbMjRdKSwgKHU4KikgJmJ1ZlsxNl0sIDE2KTsKKwkJbWVtY3B5KCYocEhiYS0+ZGV0YWlsWzQwXSksICIgRlc6ICIsIDQpOworCQltZW1jcHkoJihwSGJhLT5kZXRhaWxbNDRdKSwgKHU4KikgJmJ1ZlszMl0sIDQpOworCQlwSGJhLT5kZXRhaWxbNDhdID0gJ1wwJzsJLyogcHJlY2F1dGlvbmFyeSAqLworCQlrZnJlZShidWYpOworCX0KKwlhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpOworCXJldHVybiA7Cit9CisKKworc3RhdGljIGludCBhZHB0X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkZXZpY2UpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldmljZS0+aG9zdDsKKwlhZHB0X2hiYSogcEhiYTsKKworCXBIYmEgPSAoYWRwdF9oYmEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisKKwlpZiAoaG9zdC0+Y2FuX3F1ZXVlICYmIGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIE1TR19TSU1QTEVfVEFHLAorCQkJCWhvc3QtPmNhbl9xdWV1ZSAtIDEpOworCX0gZWxzZSB7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgMCwgMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcHRfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqIGNtZCwgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCWFkcHRfaGJhKiBwSGJhID0gTlVMTDsKKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIHBEZXYgPSBOVUxMOwkvKiBkcHQgcGVyIGRldmljZSBpbmZvcm1hdGlvbiAqLworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKFRNT1VUX1NDU0kqSFopOworCisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCS8qCisJICogU0NTSSBSRVFVRVNUX1NFTlNFIGNvbW1hbmRzIHdpbGwgYmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgCisJICogSG9zdCBBZGFwdGVyIGZvciBhbnkgZXJyb3JzLCBzbyB0aGV5IHNob3VsZCBub3QgYmUgZXhlY3V0ZWQgCisJICogZXhwbGljaXRseSB1bmxlc3MgdGhlIFNlbnNlIERhdGEgaXMgemVybyBpbmRpY2F0aW5nIHRoYXQgbm8gZXJyb3IgCisJICogb2NjdXJyZWQuCisJICovCisKKwlpZiAoKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSAmJiAoY21kLT5zZW5zZV9idWZmZXJbMF0gIT0gMCkpIHsKKwkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcEhiYSA9IChhZHB0X2hiYSopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOworCWlmICghcEhiYSkgeworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXJtYigpOworCS8qCisJICogVE9ETzogSSBuZWVkIHRvIGJsb2NrIGhlcmUgaWYgSSBhbSBwcm9jZXNzaW5nIGlvY3RsIGNtZHMKKwkgKiBidXQgaWYgdGhlIG91dHN0YW5kaW5nIGNtZHMgYWxsIGZpbmlzaCBiZWZvcmUgdGhlIGlvY3RsLAorCSAqIHRoZSBzY3NpLWNvcmUgd2lsbCBub3Qga25vdyB0byBzdGFydCBzZW5kaW5nIGNtZHMgdG8gbWUgYWdhaW4uCisJICogSSBuZWVkIHRvIGEgd2F5IHRvIHJlc3RhcnQgdGhlIHNjc2ktY29yZXMgcXVldWVzIG9yIHNob3VsZCBJIGJsb2NrCisJICogY2FsbGluZyBzY3NpX2RvbmUgb24gdGhlIG91dHN0YW5kaW5nIGNtZHMgaW5zdGVhZAorCSAqIGZvciBub3cgd2UgZG9uJ3Qgc2V0IHRoZSBJT0NUTCBzdGF0ZQorCSAqLworCWlmKCgocEhiYS0+c3RhdGUpICYgRFBUSV9TVEFURV9JT0NUTCkgfHwgKChwSGJhLT5zdGF0ZSkgJiBEUFRJX1NUQVRFX1JFU0VUKSkgeworCQlwSGJhLT5ob3N0LT5sYXN0X3Jlc2V0ID0gamlmZmllczsKKwkJcEhiYS0+aG9zdC0+cmVzZXR0aW5nID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYoY21kLT5laF9zdGF0ZSAhPSBTQ1NJX1NUQVRFX1FVRVVFRCl7CisJCS8vIElmIHdlIGFyZSBub3QgZG9pbmcgZXJyb3IgcmVjb3ZlcnkKKwkJbW9kX3RpbWVyKCZjbWQtPmVoX3RpbWVvdXQsIHRpbWVvdXQpOworCX0KKworCS8vIFRPRE8gaWYgdGhlIGNtZC0+ZGV2aWNlIGlmIG9mZmxpbmUgdGhlbiBJIG1heSBuZWVkIHRvIGlzc3VlIGEgYnVzIHJlc2NhbgorCS8vIGZvbGxvd2VkIGJ5IGEgZ2V0X2xjdCB0byBzZWUgaWYgdGhlIGRldmljZSBpcyB0aGVyZSBhbnltb3JlCisJaWYoKHBEZXYgPSAoc3RydWN0IGFkcHRfZGV2aWNlKikgKGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YSkpID09IE5VTEwpIHsKKwkJLyoKKwkJICogRmlyc3QgY29tbWFuZCByZXF1ZXN0IGZvciB0aGlzIGRldmljZS4gIFNldCB1cCBhIHBvaW50ZXIKKwkJICogdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICBUaGlzIHNob3VsZCBiZSBhIFRFU1RfVU5JVF9SRUFEWQorCQkgKiBjb21tYW5kIGZyb20gc2Nhbl9zY3Npc19zaW5nbGUuCisJCSAqLworCQlpZiAoKHBEZXYgPSBhZHB0X2ZpbmRfZGV2aWNlKHBIYmEsICh1MzIpY21kLT5kZXZpY2UtPmNoYW5uZWwsICh1MzIpY21kLT5kZXZpY2UtPmlkLCAodTMyKWNtZC0+ZGV2aWNlLT5sdW4pKSA9PSBOVUxMKSB7CisJCQkvLyBUT0RPOiBpZiBhbnkgbHVucyBhcmUgYXQgdGhpcyBidXMsIHNjc2kgaWQgdGhlbiBmYWtlIGEgVEVTVF9VTklUX1JFQURZIGFuZCBJTlFVSVJZIHJlc3BvbnNlIAorCQkJLy8gd2l0aCB0eXBlIDdGIChmb3IgYWxsIGx1bnMgbGVzcyB0aGFuIHRoZSBtYXggZm9yIHRoaXMgYnVzLGlkKSBzbyB0aGUgbHVuIHNjYW4gd2lsbCBjb250aW51ZS4KKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljbWQtPmRldmljZS0+aG9zdGRhdGEgPSBwRGV2OworCX0KKwlwRGV2LT5wU2NzaV9kZXYgPSBjbWQtPmRldmljZTsKKworCS8qCisJICogSWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBmcm9tIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyByZXNldCwgCisJICogZGVsYXkgcHJvY2Vzc2luZyBvZiB0aGUgY29tbWFuZCB1bnRpbCBsYXRlci4KKwkgKi8KKwlpZiAocERldi0+c3RhdGUgJiBEUFRJX0RFVl9SRVNFVCApIHsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcmV0dXJuIGFkcHRfc2NzaV90b19pMm8ocEhiYSwgY21kLCBwRGV2KTsKK30KKworc3RhdGljIGludCBhZHB0X2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCWludCBoZWFkcz0tMTsKKwlpbnQgc2VjdG9ycz0tMTsKKwlpbnQgY3lsaW5kZXJzPS0xOworCisJLy8gKioqIEZpcnN0IGxldHMgc2V0IHRoZSBkZWZhdWx0IGdlb21ldHJ5ICoqKioKKwkKKwkvLyBJZiB0aGUgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIG94MjAwMAorCWlmIChjYXBhY2l0eSA8IDB4MjAwMCApIHsJLy8gZmxvcHB5CisJCWhlYWRzID0gMTg7CisJCXNlY3RvcnMgPSAyOworCX0gCisJLy8gZWxzZSBpZiBiZXR3ZWVuIDB4MjAwMCBhbmQgMHgyMDAwMAorCWVsc2UgaWYgKGNhcGFjaXR5IDwgMHgyMDAwMCkgeworCQloZWFkcyA9IDY0OworCQlzZWN0b3JzID0gMzI7CisJfQorCS8vIGVsc2UgaWYgYmV0d2VlbiAweDIwMDAwIGFuZCAweDQwMDAwCisJZWxzZSBpZiAoY2FwYWNpdHkgPCAweDQwMDAwKSB7CisJCWhlYWRzID0gNjU7CisJCXNlY3RvcnMgPSA2MzsKKwl9CisJLy8gZWxzZSBpZiBiZXR3ZWVuIDB4NDAwMCBhbmQgMHg4MDAwMAorCWVsc2UgaWYgKGNhcGFjaXR5IDwgMHg4MDAwMCkgeworCQloZWFkcyA9IDEyODsKKwkJc2VjdG9ycyA9IDYzOworCX0KKwkvLyBlbHNlIGlmIGdyZWF0ZXIgdGhhbiAweDgwMDAwCisJZWxzZSB7CisJCWhlYWRzID0gMjU1OworCQlzZWN0b3JzID0gNjM7CisJfQorCWN5bGluZGVycyA9IHNlY3Rvcl9kaXYoY2FwYWNpdHksIGhlYWRzICogc2VjdG9ycyk7CisKKwkvLyBTcGVjaWFsIGNhc2UgaWYgQ0RST00KKwlpZihzZGV2LT50eXBlID09IDUpIHsgIC8vIENEUk9NCisJCWhlYWRzID0gMjUyOworCQlzZWN0b3JzID0gNjM7CisJCWN5bGluZGVycyA9IDExMTE7CisJfQorCisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJCisJUERFQlVHKCJhZHB0X2Jpb3NfcGFyYW06IGV4aXRcbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICphZHB0X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlhZHB0X2hiYSogcEhiYTsKKworCXBIYmEgPSAoYWRwdF9oYmEgKikgaG9zdC0+aG9zdGRhdGFbMF07CisJcmV0dXJuIChjaGFyICopIChwSGJhLT5kZXRhaWwpOworfQorCitzdGF0aWMgaW50IGFkcHRfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCSAgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCXN0cnVjdCBhZHB0X2RldmljZSogZDsKKwlpbnQgaWQ7CisJaW50IGNoYW47CisJaW50IGxlbiA9IDA7CisJaW50IGJlZ2luID0gMDsKKwlpbnQgcG9zID0gMDsKKwlhZHB0X2hiYSogcEhiYTsKKwlpbnQgdW5pdDsKKworCSpzdGFydCA9IGJ1ZmZlcjsKKwlpZiAoaW5vdXQgPT0gVFJVRSkgeworCQkvKgorCQkgKiBUaGUgdXNlciBoYXMgZG9uZSBhIHdyaXRlIGFuZCB3YW50cyB1cyB0byB0YWtlIHRoZQorCQkgKiBkYXRhIGluIHRoZSBidWZmZXIgYW5kIGRvIHNvbWV0aGluZyB3aXRoIGl0LgorCQkgKiBwcm9jX3Njc2l3cml0ZSBjYWxscyB1cyB3aXRoIGlub3V0ID0gMQorCQkgKgorCQkgKiBSZWFkIGRhdGEgZnJvbSBidWZmZXIgKHdyaXRpbmcgdG8gdXMpIC0gTk9UIFNVUFBPUlRFRAorCQkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBpbm91dCA9IDAgbWVhbnMgdGhlIHVzZXIgaGFzIGRvbmUgYSByZWFkIGFuZCB3YW50cyBpbmZvcm1hdGlvbgorCSAqIHJldHVybmVkLCBzbyB3ZSB3cml0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZHMgaW50byB0aGUgYnVmZmVyCisJICogcHJvY19zY3NpcmVhZCgpIGNhbGxzIHVzIHdpdGggaW5vdXQgPSAwCisJICovCisKKwkvLyBGaW5kIEhCQSAoaG9zdCBidXMgYWRhcHRlcikgd2UgYXJlIGxvb2tpbmcgZm9yCisJZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKKwkJaWYgKHBIYmEtPmhvc3QgPT0gaG9zdCkgeworCQkJYnJlYWs7CS8qIGZvdW5kIGFkYXB0ZXIgKi8KKwkJfQorCX0KKwl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCWlmIChwSGJhID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCWhvc3QgPSBwSGJhLT5ob3N0OworCisJbGVuICA9IHNwcmludGYoYnVmZmVyICAgICwgIkFkYXB0ZWMgSTJPIFJBSUQgRHJpdmVyIFZlcnNpb246ICVzXG5cbiIsIERQVF9JMk9fVkVSU0lPTik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiVzXG4iLCBwSGJhLT5kZXRhaWwpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJTQ1NJIEhvc3Q9c2NzaSVkICBDb250cm9sIE5vZGU9L2Rldi8lcyAgaXJxPSVkXG4iLCAKKwkJCXBIYmEtPmhvc3QtPmhvc3Rfbm8sIHBIYmEtPm5hbWUsIGhvc3QtPmlycSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0cG9zdCBmaWZvIHNpemUgID0gJWRcblx0cmVwbHkgZmlmbyBzaXplID0gJWRcblx0c2cgdGFibGUgc2l6ZSAgID0gJWRcblxuIiwKKwkJCWhvc3QtPmNhbl9xdWV1ZSwgKGludCkgcEhiYS0+cmVwbHlfZmlmb19zaXplICwgaG9zdC0+c2dfdGFibGVzaXplKTsKKworCXBvcyA9IGJlZ2luICsgbGVuOworCisJLyogQ0hFQ0tQT0lOVCAqLworCWlmKHBvcyA+IG9mZnNldCArIGxlbmd0aCkgeworCQlnb3RvIHN0b3Bfb3V0cHV0OworCX0KKwlpZihwb3MgPD0gb2Zmc2V0KSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmVuJ3QgZXZlbiB3cml0dGVuIHRvIHdoZXJlIHdlIGxhc3QgbGVmdAorCQkgKiBvZmYgKHRoZSBsYXN0IHRpbWUgd2Ugd2VyZSBjYWxsZWQpLCByZXNldCB0aGUgCisJCSAqIGJlZ2lubmluZyBwb2ludGVyLgorCQkgKi8KKwkJbGVuID0gMDsKKwkJYmVnaW4gPSBwb3M7CisJfQorCWxlbiArPSAgc3ByaW50ZihidWZmZXIrbGVuLCAiRGV2aWNlczpcbiIpOworCWZvcihjaGFuID0gMDsgY2hhbiA8IE1BWF9DSEFOTkVMOyBjaGFuKyspIHsKKwkJZm9yKGlkID0gMDsgaWQgPCBNQVhfSUQ7IGlkKyspIHsKKwkJCWQgPSBwSGJhLT5jaGFubmVsW2NoYW5dLmRldmljZVtpZF07CisJCQl3aGlsZShkKXsKKwkJCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJcdCUtMjQuMjRzIiwgZC0+cFNjc2lfZGV2LT52ZW5kb3IpOworCQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIiBSZXY6ICUtOC44c1xuIiwgZC0+cFNjc2lfZGV2LT5yZXYpOworCQkJCXBvcyA9IGJlZ2luICsgbGVuOworCisKKwkJCQkvKiBDSEVDS1BPSU5UICovCisJCQkJaWYocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKSB7CisJCQkJCWdvdG8gc3RvcF9vdXRwdXQ7CisJCQkJfQorCQkJCWlmKHBvcyA8PSBvZmZzZXQpIHsKKwkJCQkJbGVuID0gMDsKKwkJCQkJYmVnaW4gPSBwb3M7CisJCQkJfQorCisJCQkJdW5pdCA9IGQtPnBJMm9fZGV2LT5sY3RfZGF0YS50aWQ7CisJCQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0VElEPSVkLCAoQ2hhbm5lbD0lZCwgVGFyZ2V0PSVkLCBMdW49JWQpICAoJXMpXG5cbiIsCisJCQkJCSAgICAgICB1bml0LCAoaW50KWQtPnNjc2lfY2hhbm5lbCwgKGludClkLT5zY3NpX2lkLCAoaW50KWQtPnNjc2lfbHVuLAorCQkJCQkgICAgICAgc2NzaV9kZXZpY2Vfb25saW5lKGQtPnBTY3NpX2Rldik/ICJvbmxpbmUiOiJvZmZsaW5lIik7IAorCQkJCXBvcyA9IGJlZ2luICsgbGVuOworCisJCQkJLyogQ0hFQ0tQT0lOVCAqLworCQkJCWlmKHBvcyA+IG9mZnNldCArIGxlbmd0aCkgeworCQkJCQlnb3RvIHN0b3Bfb3V0cHV0OworCQkJCX0KKwkJCQlpZihwb3MgPD0gb2Zmc2V0KSB7CisJCQkJCWxlbiA9IDA7CisJCQkJCWJlZ2luID0gcG9zOworCQkJCX0KKworCQkJCWQgPSBkLT5uZXh0X2x1bjsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogYmVnaW4gaXMgd2hlcmUgd2UgbGFzdCBjaGVja2VkIG91ciBwb3NpdGlvbiB3aXRoIHJlZ2FyZHMgdG8gb2Zmc2V0CisJICogYmVnaW4gaXMgYWx3YXlzIGxlc3MgdGhhbiBvZmZzZXQuICBsZW4gaXMgcmVsYXRpdmUgdG8gYmVnaW4uICBJdAorCSAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBwYXN0IGJlZ2luCisJICoKKwkgKi8KK3N0b3Bfb3V0cHV0OgorCS8qIHN0b3AgdGhlIG91dHB1dCBhbmQgY2FsY3VsYXRlIHRoZSBjb3JyZWN0IGxlbmd0aCAqLworCSooYnVmZmVyICsgbGVuKSA9ICdcMCc7CisKKwkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBvZiB3YW50ZWQgZGF0YSAqLworCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOworCWlmKGxlbiA+IGxlbmd0aCkgeworCQlsZW4gPSBsZW5ndGg7CisJfSBlbHNlIGlmKGxlbiA8IDApeworCQlsZW4gPSAwOworCQkqKnN0YXJ0ID0gJ1wwJzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXJyb3IgSGFuZGxpbmcgcm91dGluZXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIGludCBhZHB0X2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQpCit7CisJYWRwdF9oYmEqIHBIYmEgPSBOVUxMOwkvKiBob3N0IGJ1cyBhZGFwdGVyIHN0cnVjdHVyZSAqLworCXN0cnVjdCBhZHB0X2RldmljZSogZHB0ZGV2aWNlOwkvKiBkcHQgcGVyIGRldmljZSBpbmZvcm1hdGlvbiAqLworCXUzMiBtc2dbNV07CisJaW50IHJjb2RlOworCisJaWYoY21kLT5zZXJpYWxfbnVtYmVyID09IDApeworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlwSGJhID0gKGFkcHRfaGJhKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOworCXByaW50ayhLRVJOX0lORk8iJXM6IFRyeWluZyB0byBBYm9ydCBjbWQ9JWxkXG4iLHBIYmEtPm5hbWUsIGNtZC0+c2VyaWFsX251bWJlcik7CisJaWYgKChkcHRkZXZpY2UgPSAodm9pZCopIChjbWQtPmRldmljZS0+aG9zdGRhdGEpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBhYm9ydDogTm8gZGV2aWNlIGluIGNtbmRcbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZ1swXSA9IEZJVkVfV09SRF9NU0dfU0laRXxTR0xfT0ZGU0VUXzA7CisJbXNnWzFdID0gSTJPX0NNRF9TQ1NJX0FCT1JUPDwyNHxIT1NUX1RJRDw8MTJ8ZHB0ZGV2aWNlLT50aWQ7CisJbXNnWzJdID0gMDsKKwltc2dbM109IDA7IAorCW1zZ1s0XSA9ICh1MzIpY21kOworCWlmKCAocmNvZGUgPSBhZHB0X2kyb19wb3N0X3dhaXQocEhiYSwgbXNnLCBzaXplb2YobXNnKSwgRk9SRVZFUikpICE9IDApeworCQlpZihyY29kZSA9PSAtRU9QTk9UU1VQUCApeworCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogQWJvcnQgY21kIG5vdCBzdXBwb3J0ZWRcbiIscEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJCXByaW50ayhLRVJOX0lORk8iJXM6IEFib3J0IGNtZD0lbGQgZmFpbGVkLlxuIixwSGJhLT5uYW1lLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCQlyZXR1cm4gRkFJTEVEOworCX0gCisJcHJpbnRrKEtFUk5fSU5GTyIlczogQWJvcnQgY21kPSVsZCBjb21wbGV0ZS5cbiIscEhiYS0+bmFtZSwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisjZGVmaW5lIEkyT19ERVZJQ0VfUkVTRVQgMHgyNworLy8gVGhpcyBpcyB0aGUgc2FtZSBmb3IgQkxLIGFuZCBTQ1NJIGRldmljZXMKKy8vIE5PVEUgdGhpcyBpcyB3cm9uZyBpbiB0aGUgaTJvLmggZGVmaW5pdGlvbnMKKy8vIFRoaXMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgb3VyIGFkYXB0ZXIgYnV0IHdlIGlzc3VlIGl0IGFueXdheQorc3RhdGljIGludCBhZHB0X2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQpCit7CisJYWRwdF9oYmEqIHBIYmE7CisJdTMyIG1zZ1s0XTsKKwl1MzIgcmNvZGU7CisJaW50IG9sZF9zdGF0ZTsKKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIGQgPSAodm9pZCopIGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCXBIYmEgPSAodm9pZCopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlwcmludGsoS0VSTl9JTkZPIiVzOiBUcnlpbmcgdG8gcmVzZXQgZGV2aWNlXG4iLHBIYmEtPm5hbWUpOworCWlmICghZCkgeworCQlwcmludGsoS0VSTl9JTkZPIiVzOiBSZXNldCBEZXZpY2U6IERldmljZSBOb3QgZm91bmRcbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCW1lbXNldChtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2dbMF0gPSBGT1VSX1dPUkRfTVNHX1NJWkV8U0dMX09GRlNFVF8wOworCW1zZ1sxXSA9IChJMk9fREVWSUNFX1JFU0VUPDwyNHxIT1NUX1RJRDw8MTJ8ZC0+dGlkKTsKKwltc2dbMl0gPSAwOworCW1zZ1szXSA9IDA7CisKKwlvbGRfc3RhdGUgPSBkLT5zdGF0ZTsKKwlkLT5zdGF0ZSB8PSBEUFRJX0RFVl9SRVNFVDsKKwlpZiggKHJjb2RlID0gYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsICh2b2lkKiltc2csc2l6ZW9mKG1zZyksIEZPUkVWRVIpKSApeworCQlkLT5zdGF0ZSA9IG9sZF9zdGF0ZTsKKwkJaWYocmNvZGUgPT0gLUVPUE5PVFNVUFAgKXsKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IERldmljZSByZXNldCBub3Qgc3VwcG9ydGVkXG4iLHBIYmEtPm5hbWUpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiBEZXZpY2UgcmVzZXQgZmFpbGVkXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gRkFJTEVEOworCX0gZWxzZSB7CisJCWQtPnN0YXRlID0gb2xkX3N0YXRlOworCQlwcmludGsoS0VSTl9JTkZPIiVzOiBEZXZpY2UgcmVzZXQgc3VjY2Vzc2Z1bFxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorfQorCisKKyNkZWZpbmUgSTJPX0hCQV9CVVNfUkVTRVQgMHg4NworLy8gVGhpcyB2ZXJzaW9uIG9mIGJ1cyByZXNldCBpcyBjYWxsZWQgYnkgdGhlIGVoX2Vycm9yIGhhbmRsZXIKK3N0YXRpYyBpbnQgYWRwdF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCogY21kKQoreworCWFkcHRfaGJhKiBwSGJhOworCXUzMiBtc2dbNF07CisKKwlwSGJhID0gKGFkcHRfaGJhKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKG1zZykpOworCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IEJ1cyByZXNldDogU0NTSSBCdXMgJWQ6IHRpZDogJWRcbiIscEhiYS0+bmFtZSwgY21kLT5kZXZpY2UtPmNoYW5uZWwscEhiYS0+Y2hhbm5lbFtjbWQtPmRldmljZS0+Y2hhbm5lbF0udGlkICk7CisJbXNnWzBdID0gRk9VUl9XT1JEX01TR19TSVpFfFNHTF9PRkZTRVRfMDsKKwltc2dbMV0gPSAoSTJPX0hCQV9CVVNfUkVTRVQ8PDI0fEhPU1RfVElEPDwxMnxwSGJhLT5jaGFubmVsW2NtZC0+ZGV2aWNlLT5jaGFubmVsXS50aWQpOworCW1zZ1syXSA9IDA7CisJbXNnWzNdID0gMDsKKwlpZihhZHB0X2kyb19wb3N0X3dhaXQocEhiYSwgKHZvaWQqKW1zZyxzaXplb2YobXNnKSwgRk9SRVZFUikgKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogQnVzIHJlc2V0IGZhaWxlZC5cbiIscEhiYS0+bmFtZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogQnVzIHJlc2V0IHN1Y2Nlc3MuXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9Cit9CisKKy8vIFRoaXMgdmVyc2lvbiBvZiByZXNldCBpcyBjYWxsZWQgYnkgdGhlIGVoX2Vycm9yX2hhbmRsZXIKK3N0YXRpYyBpbnQgYWRwdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQpCit7CisJYWRwdF9oYmEqIHBIYmE7CisJaW50IHJjb2RlOworCXBIYmEgPSAoYWRwdF9oYmEqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBIYmEgUmVzZXQ6IHNjc2kgaWQgJWQ6IHRpZDogJWRcbiIscEhiYS0+bmFtZSxjbWQtPmRldmljZS0+Y2hhbm5lbCxwSGJhLT5jaGFubmVsW2NtZC0+ZGV2aWNlLT5jaGFubmVsXS50aWQgKTsKKwlyY29kZSA9ICBhZHB0X2hiYV9yZXNldChwSGJhKTsKKwlpZihyY29kZSA9PSAwKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogSEJBIHJlc2V0IGNvbXBsZXRlXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBIQkEgcmVzZXQgZmFpbGVkICgleClcbiIscEhiYS0+bmFtZSwgcmNvZGUpOworCQlyZXR1cm4gRkFJTEVEOworCX0KK30KKworLy8gVGhpcyB2ZXJzaW9uIG9mIHJlc2V0IGlzIGNhbGxlZCBieSB0aGUgaW9jdGxzIGFuZCBpbmRpcmVjdGx5IGZyb20gZWhfZXJyb3JfaGFuZGxlciB2aWEgYWRwdF9yZXNldAorc3RhdGljIGludCBhZHB0X2hiYV9yZXNldChhZHB0X2hiYSogcEhiYSkKK3sKKwlpbnQgcmNvZGU7CisKKwlwSGJhLT5zdGF0ZSB8PSBEUFRJX1NUQVRFX1JFU0VUOworCisJLy8gQWN0aXZhdGUgZG9lcyBnZXQgc3RhdHVzICwgaW5pdCBvdXRib3VuZCwgYW5kIGdldCBocnQKKwlpZiAoKHJjb2RlPWFkcHRfaTJvX2FjdGl2YXRlX2hiYShwSGJhKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhY3RpdmF0ZVxuIiwgcEhiYS0+bmFtZSk7CisJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCXJldHVybiByY29kZTsKKwl9CisKKwlpZiAoKHJjb2RlPWFkcHRfaTJvX2J1aWxkX3N5c190YWJsZSgpKSA8IDApIHsKKwkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJcmV0dXJuIHJjb2RlOworCX0KKwlQREVCVUcoIiVzOiBpbiBIT0xEIHN0YXRlXG4iLHBIYmEtPm5hbWUpOworCisJaWYgKChyY29kZT1hZHB0X2kyb19vbmxpbmVfaGJhKHBIYmEpKSA8IDApIHsKKwkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsJCisJCXJldHVybiByY29kZTsKKwl9CisJUERFQlVHKCIlczogaW4gT1BFUkFUSU9OQUwgc3RhdGVcbiIscEhiYS0+bmFtZSk7CisKKwlpZiAoKHJjb2RlPWFkcHRfaTJvX2xjdF9nZXQocEhiYSkpIDwgMCl7CisJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJCXJldHVybiByY29kZTsKKwl9CisKKwlpZiAoKHJjb2RlPWFkcHRfaTJvX3JlcGFyc2VfbGN0KHBIYmEpKSA8IDApeworCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQlyZXR1cm4gcmNvZGU7CisJfQorCXBIYmEtPnN0YXRlICY9IH5EUFRJX1NUQVRFX1JFU0VUOworCisJYWRwdF9mYWlsX3Bvc3RlZF9zY2JzKHBIYmEpOworCXJldHVybiAwOwkvKiByZXR1cm4gc3VjY2VzcyAqLworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworc3RhdGljIHZvaWQgYWRwdF9pMm9fc3lzX3NodXRkb3duKHZvaWQpCit7CisJYWRwdF9oYmEgKnBIYmEsICpwTmV4dDsKKwlzdHJ1Y3QgYWRwdF9pMm9fcG9zdF93YWl0X2RhdGEgKnAxLCAqcDI7CisKKwkgcHJpbnRrKEtFUk5fSU5GTyJTaHV0dGluZyBkb3duIEFkYXB0ZWMgSTJPIGNvbnRyb2xsZXJzLlxuIik7CisJIHByaW50ayhLRVJOX0lORk8iICAgVGhpcyBjb3VsZCB0YWtlIGEgZmV3IG1pbnV0ZXMgaWYgdGhlcmUgYXJlIG1hbnkgZGV2aWNlcyBhdHRhY2hlZFxuIik7CisJLyogRGVsZXRlIGFsbCBJT1BzIGZyb20gdGhlIGNvbnRyb2xsZXIgY2hhaW4gKi8KKwkvKiBUaGV5IHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWxlYXNlZCBieSB0aGUKKwkgKiBzY3NpLWNvcmUKKwkgKi8KKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwTmV4dCkgeworCQlwTmV4dCA9IHBIYmEtPm5leHQ7CisJCWFkcHRfaTJvX2RlbGV0ZV9oYmEocEhiYSk7CisJfQorCisJLyogUmVtb3ZlIGFueSB0aW1lZG91dCBlbnRyaWVzIGZyb20gdGhlIHdhaXQgcXVldWUuICAqLworCXAyID0gTlVMTDsKKy8vCXNwaW5fbG9ja19pcnFzYXZlKCZhZHB0X3Bvc3Rfd2FpdF9sb2NrLCBmbGFncyk7CisJLyogTm90aGluZyBzaG91bGQgYmUgb3V0c3RhbmRpbmcgYXQgdGhpcyBwb2ludCBzbyBqdXN0CisJICogZnJlZSB0aGVtIAorCSAqLworCWZvcihwMSA9IGFkcHRfcG9zdF93YWl0X3F1ZXVlOyBwMTsgcDIgPSBwMSwgcDEgPSBwMi0+bmV4dCkgeworCQlrZnJlZShwMSk7CisJfQorLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwdF9wb3N0X3dhaXRfbG9jaywgZmxhZ3MpOworCWFkcHRfcG9zdF93YWl0X3F1ZXVlID0gTlVMTDsKKworCSBwcmludGsoS0VSTl9JTkZPICJBZGFwdGVjIEkyTyBjb250cm9sbGVycyBkb3duLlxuIik7Cit9CisKKy8qCisgKiByZWJvb3Qvc2h1dGRvd24gbm90aWZpY2F0aW9uLgorICoKKyAqIC0gUXVpZXNjZSBlYWNoIElPUCBpbiB0aGUgc3lzdGVtCisgKgorICovCisKKyNpZmRlZiBSRUJPT1RfTk9USUZJRVIKK3N0YXRpYyBpbnQgYWRwdF9yZWJvb3RfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLCB1bG9uZyBjb2RlLCB2b2lkICpwKQoreworCisJIGlmKGNvZGUgIT0gU1lTX1JFU1RBUlQgJiYgY29kZSAhPSBTWVNfSEFMVCAmJiBjb2RlICE9IFNZU19QT1dFUl9PRkYpCisJCSAgcmV0dXJuIE5PVElGWV9ET05FOworCisJIGFkcHRfaTJvX3N5c19zaHV0ZG93bigpOworCisJIHJldHVybiBOT1RJRllfRE9ORTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgYWRwdF9pbnN0YWxsX2hiYShzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlKiBzaHQsIHN0cnVjdCBwY2lfZGV2KiBwRGV2KSAKK3sKKworCWFkcHRfaGJhKiBwSGJhID0gTlVMTDsKKwlhZHB0X2hiYSogcCA9IE5VTEw7CisJdWxvbmcgYmFzZV9hZGRyMF9waHlzID0gMDsKKwl1bG9uZyBiYXNlX2FkZHIxX3BoeXMgPSAwOworCXUzMiBoYmFfbWFwMF9hcmVhX3NpemUgPSAwOworCXUzMiBoYmFfbWFwMV9hcmVhX3NpemUgPSAwOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyX3ZpcnQgPSBOVUxMOworCXZvaWQgX19pb21lbSAqbXNnX2FkZHJfdmlydCA9IE5VTEw7CisKKwlpbnQgcmFwdG9yRmxhZyA9IEZBTFNFOworCWludCBpOworCisJaWYocGNpX2VuYWJsZV9kZXZpY2UocERldikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBEZXYpOworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBEZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgJiYKKwkgICAgcGNpX3NldF9kbWFfbWFzayhwRGV2LCAweGZmZmZmZmZmVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYXNlX2FkZHIwX3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocERldiwwKTsKKwloYmFfbWFwMF9hcmVhX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBEZXYsMCk7CisKKwkvLyBDaGVjayBpZiBzdGFuZGFyZCBQQ0kgY2FyZCBvciBzaW5nbGUgQkFSIFJhcHRvcgorCWlmKHBEZXYtPmRldmljZSA9PSBQQ0lfRFBUX0RFVklDRV9JRCl7CisJCWlmKHBEZXYtPnN1YnN5c3RlbV9kZXZpY2UgPj0weGMwMzIgJiYgcERldi0+c3Vic3lzdGVtX2RldmljZSA8PSAweGMwM2IpeworCQkJLy8gUmFwdG9yIGNhcmQgd2l0aCB0aGlzIGRldmljZSBpZCBuZWVkcyA0TQorCQkJaGJhX21hcDBfYXJlYV9zaXplID0gMHg0MDAwMDA7CisJCX0gZWxzZSB7IC8vIE5vdCBSYXB0b3IgLSBpdCBpcyBhIFBDSSBjYXJkCisJCQlpZihoYmFfbWFwMF9hcmVhX3NpemUgPiAweDEwMDAwMCApeyAKKwkJCQloYmFfbWFwMF9hcmVhX3NpemUgPSAweDEwMDAwMDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7Ly8gUmFwdG9yIHNwbGl0IEJBUiBjb25maWcKKwkJLy8gVXNlIEJBUjEgaW4gdGhpcyBjb25maWd1cmF0aW9uCisJCWJhc2VfYWRkcjFfcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwRGV2LDEpOworCQloYmFfbWFwMV9hcmVhX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBEZXYsMSk7CisJCXJhcHRvckZsYWcgPSBUUlVFOworCX0KKworCisJYmFzZV9hZGRyX3ZpcnQgPSBpb3JlbWFwKGJhc2VfYWRkcjBfcGh5cyxoYmFfbWFwMF9hcmVhX3NpemUpOworCWlmICghYmFzZV9hZGRyX3ZpcnQpIHsKKwkJUEVSUk9SKCJkcHRpOiBhZHB0X2NvbmZpZ19oYmE6IGlvIHJlbWFwIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworICAgICAgICBpZihyYXB0b3JGbGFnID09IFRSVUUpIHsKKwkJbXNnX2FkZHJfdmlydCA9IGlvcmVtYXAoYmFzZV9hZGRyMV9waHlzLCBoYmFfbWFwMV9hcmVhX3NpemUgKTsKKwkJaWYgKCFtc2dfYWRkcl92aXJ0KSB7CisJCQlQRVJST1IoImRwdGk6IGFkcHRfY29uZmlnX2hiYTogaW8gcmVtYXAgZmFpbGVkIG9uIEJBUjFcbiIpOworCQkJaW91bm1hcChiYXNlX2FkZHJfdmlydCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCW1zZ19hZGRyX3ZpcnQgPSBiYXNlX2FkZHJfdmlydDsKKwl9CisJCisJLy8gQWxsb2NhdGUgYW5kIHplcm8gdGhlIGRhdGEgc3RydWN0dXJlCisJcEhiYSA9IGttYWxsb2Moc2l6ZW9mKGFkcHRfaGJhKSwgR0ZQX0tFUk5FTCk7CisJaWYoIHBIYmEgPT0gTlVMTCkgeworCQlpZihtc2dfYWRkcl92aXJ0ICE9IGJhc2VfYWRkcl92aXJ0KXsKKwkJCWlvdW5tYXAobXNnX2FkZHJfdmlydCk7CisJCX0KKwkJaW91bm1hcChiYXNlX2FkZHJfdmlydCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocEhiYSwgMCwgc2l6ZW9mKGFkcHRfaGJhKSk7CisKKwlkb3duKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJZm9yKGk9MDtpPERQVElfTUFYX0hCQTtpKyspIHsKKwkJaWYoaGJhc1tpXT09TlVMTCkgeworCQkJaGJhc1tpXT1wSGJhOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZihoYmFfY2hhaW4gIT0gTlVMTCl7CisJCWZvcihwID0gaGJhX2NoYWluOyBwLT5uZXh0OyBwID0gcC0+bmV4dCk7CisJCXAtPm5leHQgPSBwSGJhOworCX0gZWxzZSB7CisJCWhiYV9jaGFpbiA9IHBIYmE7CisJfQorCXBIYmEtPm5leHQgPSBOVUxMOworCXBIYmEtPnVuaXQgPSBoYmFfY291bnQ7CisJc3ByaW50ZihwSGJhLT5uYW1lLCAiZHB0aSVkIiwgaSk7CisJaGJhX2NvdW50Kys7CisJCisJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKworCXBIYmEtPnBEZXYgPSBwRGV2OworCXBIYmEtPmJhc2VfYWRkcl9waHlzID0gYmFzZV9hZGRyMF9waHlzOworCisJLy8gU2V0IHVwIHRoZSBWaXJ0dWFsIEJhc2UgQWRkcmVzcyBvZiB0aGUgSTJPIERldmljZQorCXBIYmEtPmJhc2VfYWRkcl92aXJ0ID0gYmFzZV9hZGRyX3ZpcnQ7CisJcEhiYS0+bXNnX2FkZHJfdmlydCA9IG1zZ19hZGRyX3ZpcnQ7CisJcEhiYS0+aXJxX21hc2sgPSBiYXNlX2FkZHJfdmlydCsweDMwOworCXBIYmEtPnBvc3RfcG9ydCA9IGJhc2VfYWRkcl92aXJ0KzB4NDA7CisJcEhiYS0+cmVwbHlfcG9ydCA9IGJhc2VfYWRkcl92aXJ0KzB4NDQ7CisKKwlwSGJhLT5ocnQgPSBOVUxMOworCXBIYmEtPmxjdCA9IE5VTEw7CisJcEhiYS0+bGN0X3NpemUgPSAwOworCXBIYmEtPnN0YXR1c19ibG9jayA9IE5VTEw7CisJcEhiYS0+cG9zdF9jb3VudCA9IDA7CisJcEhiYS0+c3RhdGUgPSBEUFRJX1NUQVRFX1JFU0VUOworCXBIYmEtPnBEZXYgPSBwRGV2OworCXBIYmEtPmRldmljZXMgPSBOVUxMOworCisJLy8gSW5pdGlhbGl6aW5nIHRoZSBzcGlubG9ja3MKKwlzcGluX2xvY2tfaW5pdCgmcEhiYS0+c3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkcHRfcG9zdF93YWl0X2xvY2spOworCisJaWYocmFwdG9yRmxhZyA9PSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyJBZGFwdGVjIEkyTyBSQUlEIGNvbnRyb2xsZXIgJWQgYXQgJXAgc2l6ZT0leCBpcnE9JWRcbiIsIAorCQkJaGJhX2NvdW50LTEsIGJhc2VfYWRkcl92aXJ0LCBoYmFfbWFwMF9hcmVhX3NpemUsIHBEZXYtPmlycSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyJBZGFwdGVjIEkyTyBSQUlEIGNvbnRyb2xsZXIgJWQgaXJxPSVkXG4iLGhiYV9jb3VudC0xLCBwRGV2LT5pcnEpOworCQlwcmludGsoS0VSTl9JTkZPIiAgICAgQkFSMCAlcCAtIHNpemU9ICV4XG4iLGJhc2VfYWRkcl92aXJ0LGhiYV9tYXAwX2FyZWFfc2l6ZSk7CisJCXByaW50ayhLRVJOX0lORk8iICAgICBCQVIxICVwIC0gc2l6ZT0gJXhcbiIsbXNnX2FkZHJfdmlydCxoYmFfbWFwMV9hcmVhX3NpemUpOworCX0KKworCWlmIChyZXF1ZXN0X2lycSAocERldi0+aXJxLCBhZHB0X2lzciwgU0FfU0hJUlEsIHBIYmEtPm5hbWUsIHBIYmEpKSB7CisJCXByaW50ayhLRVJOX0VSUiIlczogQ291bGRuJ3QgcmVnaXN0ZXIgSVJRICVkXG4iLCBwSGJhLT5uYW1lLCBwRGV2LT5pcnEpOworCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhZHB0X2kyb19kZWxldGVfaGJhKGFkcHRfaGJhKiBwSGJhKQoreworCWFkcHRfaGJhKiBwMTsKKwlhZHB0X2hiYSogcDI7CisJc3RydWN0IGkyb19kZXZpY2UqIGQ7CisJc3RydWN0IGkyb19kZXZpY2UqIG5leHQ7CisJaW50IGk7CisJaW50IGo7CisJc3RydWN0IGFkcHRfZGV2aWNlKiBwRGV2OworCXN0cnVjdCBhZHB0X2RldmljZSogcE5leHQ7CisKKworCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwkvLyBzY3NpX3VucmVnaXN0ZXIgY2FsbHMgb3VyIGFkcHRfcmVsZWFzZSB3aGljaAorCS8vIGRvZXMgYSBxdWllc2UKKwlpZihwSGJhLT5ob3N0KXsKKwkJZnJlZV9pcnEocEhiYS0+aG9zdC0+aXJxLCBwSGJhKTsKKwl9CisJZm9yKGk9MDtpPERQVElfTUFYX0hCQTtpKyspIHsKKwkJaWYoaGJhc1tpXT09cEhiYSkgeworCQkJaGJhc1tpXSA9IE5VTEw7CisJCX0KKwl9CisJcDIgPSBOVUxMOworCWZvciggcDEgPSBoYmFfY2hhaW47IHAxOyBwMiA9IHAxLHAxPXAxLT5uZXh0KXsKKwkJaWYocDEgPT0gcEhiYSkgeworCQkJaWYocDIpIHsKKwkJCQlwMi0+bmV4dCA9IHAxLT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQloYmFfY2hhaW4gPSBwMS0+bmV4dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaGJhX2NvdW50LS07CisJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKworCWlvdW5tYXAocEhiYS0+YmFzZV9hZGRyX3ZpcnQpOworCWlmKHBIYmEtPm1zZ19hZGRyX3ZpcnQgIT0gcEhiYS0+YmFzZV9hZGRyX3ZpcnQpeworCQlpb3VubWFwKHBIYmEtPm1zZ19hZGRyX3ZpcnQpOworCX0KKwlpZihwSGJhLT5ocnQpIHsKKwkJa2ZyZWUocEhiYS0+aHJ0KTsKKwl9CisJaWYocEhiYS0+bGN0KXsKKwkJa2ZyZWUocEhiYS0+bGN0KTsKKwl9CisJaWYocEhiYS0+c3RhdHVzX2Jsb2NrKSB7CisJCWtmcmVlKHBIYmEtPnN0YXR1c19ibG9jayk7CisJfQorCWlmKHBIYmEtPnJlcGx5X3Bvb2wpeworCQlrZnJlZShwSGJhLT5yZXBseV9wb29sKTsKKwl9CisKKwlmb3IoZCA9IHBIYmEtPmRldmljZXM7IGQgOyBkID0gbmV4dCl7CisJCW5leHQgPSBkLT5uZXh0OworCQlrZnJlZShkKTsKKwl9CisJZm9yKGkgPSAwIDsgaSA8IHBIYmEtPnRvcF9zY3NpX2NoYW5uZWwgOyBpKyspeworCQlmb3IoaiA9IDA7IGogPCBNQVhfSUQ7IGorKyl7CisJCQlpZihwSGJhLT5jaGFubmVsW2ldLmRldmljZVtqXSAhPSBOVUxMKXsKKwkJCQlmb3IocERldiA9IHBIYmEtPmNoYW5uZWxbaV0uZGV2aWNlW2pdOyBwRGV2OyBwRGV2ID0gcE5leHQpeworCQkJCQlwTmV4dCA9IHBEZXYtPm5leHRfbHVuOworCQkJCQlrZnJlZShwRGV2KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJa2ZyZWUocEhiYSk7CisKKwlpZihoYmFfY291bnQgPD0gMCl7CisJCXVucmVnaXN0ZXJfY2hyZGV2KERQVElfSTJPX01BSk9SLCBEUFRfRFJJVkVSKTsgICAKKwl9Cit9CisKKworc3RhdGljIGludCBhZHB0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXByaW50aygiTG9hZGluZyBBZGFwdGVjIEkyTyBSQUlEOiBWZXJzaW9uICIgRFBUX0kyT19WRVJTSU9OICJcbiIpOworCWZvciAoaSA9IDA7IGkgPCBEUFRJX01BWF9IQkE7IGkrKykgeworCQloYmFzW2ldID0gTlVMTDsKKwl9CisjaWZkZWYgUkVCT09UX05PVElGSUVSCisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZhZHB0X3JlYm9vdF9ub3RpZmllcik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYWRwdF9kZXZpY2UqIGFkcHRfZmluZF9kZXZpY2UoYWRwdF9oYmEqIHBIYmEsIHUzMiBjaGFuLCB1MzIgaWQsIHUzMiBsdW4pCit7CisJc3RydWN0IGFkcHRfZGV2aWNlKiBkOworCisJaWYoY2hhbiA8IDAgfHwgY2hhbiA+PSBNQVhfQ0hBTk5FTCkKKwkJcmV0dXJuIE5VTEw7CisJCisJaWYoIHBIYmEtPmNoYW5uZWxbY2hhbl0uZGV2aWNlID09IE5VTEwpeworCQlwcmludGsoS0VSTl9ERUJVRyJBZGFwdGVjIEkyTyBSQUlEOiBUcnlpbmcgdG8gZmluZCBkZXZpY2UgYmVmb3JlIHRoZXkgYXJlIGFsbG9jYXRlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWQgPSBwSGJhLT5jaGFubmVsW2NoYW5dLmRldmljZVtpZF07CisJaWYoIWQgfHwgZC0+dGlkID09IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSWYgaXQgaXMgdGhlIG9ubHkgbHVuIGF0IHRoYXQgYWRkcmVzcyB0aGVuIHRoaXMgc2hvdWxkIG1hdGNoKi8KKwlpZihkLT5zY3NpX2x1biA9PSBsdW4peworCQlyZXR1cm4gZDsKKwl9CisKKwkvKiBlbHNlIHdlIG5lZWQgdG8gbG9vayB0aHJvdWdoIGFsbCB0aGUgbHVucyAqLworCWZvcihkPWQtPm5leHRfbHVuIDsgZCA7IGQgPSBkLT5uZXh0X2x1bil7CisJCWlmKGQtPnNjc2lfbHVuID09IGx1bil7CisJCQlyZXR1cm4gZDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50IGFkcHRfaTJvX3Bvc3Rfd2FpdChhZHB0X2hiYSogcEhiYSwgdTMyKiBtc2csIGludCBsZW4sIGludCB0aW1lb3V0KQoreworCS8vIEkgdXNlZCBteSBvd24gdmVyc2lvbiBvZiB0aGUgV0FJVF9RVUVVRV9IRUFECisJLy8gdG8gaGFuZGxlIHNvbWUgdmVyc2lvbiBkaWZmZXJlbmNlcworCS8vIFdoZW4gZW1iZWRkZWQgaW4gdGhlIGtlcm5lbCB0aGlzIGNvdWxkIGdvIGJhY2sgdG8gdGhlIHZhbmlsbGEgb25lCisJQURQVF9ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhZHB0X3dxX2kyb19wb3N0KTsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bG9uZyBmbGFncyA9IDA7CisJc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhICpwMSwgKnAyOworCXN0cnVjdCBhZHB0X2kyb19wb3N0X3dhaXRfZGF0YSAqd2FpdF9kYXRhID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGFkcHRfaTJvX3Bvc3Rfd2FpdF9kYXRhKSxHRlBfS0VSTkVMKTsKKwlhZHB0X3dhaXRfcXVldWVfdCB3YWl0OworCisJaWYoIXdhaXRfZGF0YSl7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKgorCSAqIFRoZSBzcGluIGxvY2tpbmcgaXMgbmVlZGVkIHRvIGtlZXAgYW55b25lIGZyb20gcGxheWluZworCSAqIHdpdGggdGhlIHF1ZXVlIHBvaW50ZXJzIGFuZCBpZCB3aGlsZSB3ZSBkbyB0aGUgc2FtZQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZHB0X3Bvc3Rfd2FpdF9sb2NrLCBmbGFncyk7CisgICAgICAgLy8gVE9ETyB3ZSBuZWVkIGEgTU9SRSB1bmlxdWUgd2F5IG9mIGdldHRpbmcgaWRzCisgICAgICAgLy8gdG8gc3VwcG9ydCBhc3luYyBMQ1QgZ2V0CisJd2FpdF9kYXRhLT5uZXh0ID0gYWRwdF9wb3N0X3dhaXRfcXVldWU7CisJYWRwdF9wb3N0X3dhaXRfcXVldWUgPSB3YWl0X2RhdGE7CisJYWRwdF9wb3N0X3dhaXRfaWQrKzsKKwlhZHB0X3Bvc3Rfd2FpdF9pZCAmPSAweDdmZmY7CisJd2FpdF9kYXRhLT5pZCA9ICBhZHB0X3Bvc3Rfd2FpdF9pZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHB0X3Bvc3Rfd2FpdF9sb2NrLCBmbGFncyk7CisKKwl3YWl0X2RhdGEtPndxID0gJmFkcHRfd3FfaTJvX3Bvc3Q7CisJd2FpdF9kYXRhLT5zdGF0dXMgPSAtRVRJTUVET1VUOworCisJLy8gdGhpcyBjb2RlIGlzIHRha2VuIGZyb20ga2VybmVsL3NjaGVkLmM6aW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJd2FpdC50YXNrID0gY3VycmVudDsKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkcHRfd3FfaTJvX3Bvc3QubG9jaywgZmxhZ3MpOworCV9fYWRkX3dhaXRfcXVldWUoJmFkcHRfd3FfaTJvX3Bvc3QsICZ3YWl0KTsKKwlzcGluX3VubG9jaygmYWRwdF93cV9pMm9fcG9zdC5sb2NrKTsKKworCW1zZ1syXSB8PSAweDgwMDAwMDAwIHwgKCh1MzIpd2FpdF9kYXRhLT5pZCk7CisJdGltZW91dCAqPSBIWjsKKwlpZigoc3RhdHVzID0gYWRwdF9pMm9fcG9zdF90aGlzKHBIYmEsIG1zZywgbGVuKSkgPT0gMCl7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmKHBIYmEtPmhvc3QpCisJCQlzcGluX3VubG9ja19pcnEocEhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJaWYgKCF0aW1lb3V0KQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZXsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJCS8vIEkvTyBpc3N1ZWQsIGJ1dCBjYW5ub3QgZ2V0IHJlc3VsdCBpbgorCQkJCS8vIHNwZWNpZmllZCB0aW1lLiBGcmVlaW5nIHJlc29yY2VzIGlzCisJCQkJLy8gZGFuZ2Vyb3VzLgorCQkJCXN0YXR1cyA9IC1FVElNRTsKKwkJCX0KKwkJfQorCQlpZihwSGJhLT5ob3N0KQorCQkJc3Bpbl9sb2NrX2lycShwSGJhLT5ob3N0LT5ob3N0X2xvY2spOworCX0KKwlzcGluX2xvY2tfaXJxKCZhZHB0X3dxX2kyb19wb3N0LmxvY2spOworCV9fcmVtb3ZlX3dhaXRfcXVldWUoJmFkcHRfd3FfaTJvX3Bvc3QsICZ3YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHB0X3dxX2kyb19wb3N0LmxvY2ssIGZsYWdzKTsKKworCWlmKHN0YXR1cyA9PSAtRVRJTUVET1VUKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyJkcHRpJWQ6IFBPU1QgV0FJVCBUSU1FT1VUXG4iLHBIYmEtPnVuaXQpOworCQkvLyBXZSB3aWxsIGhhdmUgdG8gZnJlZSB0aGUgd2FpdF9kYXRhIG1lbW9yeSBkdXJpbmcgc2h1dGRvd24KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHF1ZXVlLiAgKi8KKwlwMiA9IE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkcHRfcG9zdF93YWl0X2xvY2ssIGZsYWdzKTsKKwlmb3IocDEgPSBhZHB0X3Bvc3Rfd2FpdF9xdWV1ZTsgcDE7IHAyID0gcDEsIHAxID0gcDEtPm5leHQpIHsKKwkJaWYocDEgPT0gd2FpdF9kYXRhKSB7CisJCQlpZihwMS0+c3RhdHVzID09IEkyT19ERVRBSUxfU1RBVFVTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OICkgeworCQkJCXN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJfQorCQkJaWYocDIpIHsKKwkJCQlwMi0+bmV4dCA9IHAxLT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlhZHB0X3Bvc3Rfd2FpdF9xdWV1ZSA9IHAxLT5uZXh0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRwdF9wb3N0X3dhaXRfbG9jaywgZmxhZ3MpOworCisJa2ZyZWUod2FpdF9kYXRhKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIHMzMiBhZHB0X2kyb19wb3N0X3RoaXMoYWRwdF9oYmEqIHBIYmEsIHUzMiogZGF0YSwgaW50IGxlbikKK3sKKworCXUzMiBtID0gRU1QVFlfUVVFVUU7CisJdTMyIF9faW9tZW0gKm1zZzsKKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDMwKkhaOworCWRvIHsKKwkJcm1iKCk7CisJCW0gPSByZWFkbChwSGJhLT5wb3N0X3BvcnQpOworCQlpZiAobSAhPSBFTVBUWV9RVUVVRSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciZHB0aSVkOiBUaW1lb3V0IHdhaXRpbmcgZm9yIG1lc3NhZ2UgZnJhbWUhXG4iLCBwSGJhLT51bml0KTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9IHdoaWxlKG0gPT0gRU1QVFlfUVVFVUUpOworCQkKKwltc2cgPSBwSGJhLT5tc2dfYWRkcl92aXJ0ICsgbTsKKwltZW1jcHlfdG9pbyhtc2csIGRhdGEsIGxlbik7CisJd21iKCk7CisKKwkvL3Bvc3QgbWVzc2FnZQorCXdyaXRlbChtLCBwSGJhLT5wb3N0X3BvcnQpOworCXdtYigpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYWRwdF9pMm9fcG9zdF93YWl0X2NvbXBsZXRlKHUzMiBjb250ZXh0LCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBhZHB0X2kyb19wb3N0X3dhaXRfZGF0YSAqcDEgPSBOVUxMOworCS8qCisJICogV2UgbmVlZCB0byBzZWFyY2ggdGhyb3VnaCB0aGUgYWRwdF9wb3N0X3dhaXQKKwkgKiBxdWV1ZSB0byBzZWUgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgc3RpbGwKKwkgKiBvdXRzdGFuZGluZy4gIElmIG5vdCwgaXQgbWVhbnMgdGhhdCB0aGUgSU9QCisJICogdG9vayBsb25nZXIgdG8gcmVzcG9uZCB0byB0aGUgbWVzc2FnZSB0aGFuIHdlCisJICogaGFkIGFsbG93ZWQgYW5kIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQuCisJICogTm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IHRoYXQgZXhjZXB0IGxvZworCSAqIGl0IGZvciBkZWJ1ZyBwdXJwb3NlcywgaW5jcmVhc2UgdGltZW91dCwgYW5kIHJlY29tcGlsZQorCSAqCisJICogTG9jayBuZWVkZWQgdG8ga2VlcCBhbnlvbmUgZnJvbSBtb3ZpbmcgcXVldWUgcG9pbnRlcnMKKwkgKiBhcm91bmQgd2hpbGUgd2UncmUgbG9va2luZyB0aHJvdWdoIHRoZW0uCisJICovCisKKwljb250ZXh0ICY9IDB4N2ZmZjsKKworCXNwaW5fbG9jaygmYWRwdF9wb3N0X3dhaXRfbG9jayk7CisJZm9yKHAxID0gYWRwdF9wb3N0X3dhaXRfcXVldWU7IHAxOyBwMSA9IHAxLT5uZXh0KSB7CisJCWlmKHAxLT5pZCA9PSBjb250ZXh0KSB7CisJCQlwMS0+c3RhdHVzID0gc3RhdHVzOworCQkJc3Bpbl91bmxvY2soJmFkcHRfcG9zdF93YWl0X2xvY2spOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHAxLT53cSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmFkcHRfcG9zdF93YWl0X2xvY2spOworICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgd2UgbG9zZSBjb21tYW5kcyB0aGF0IHByb2JhYmx5IHJlYWxseSBjb21wbGV0ZWQKKwlwcmludGsoS0VSTl9ERUJVRyJkcHRpOiBDb3VsZCBOb3QgZmluZCB0YXNrICVkIGluIHdhaXQgcXVldWVcbiIsY29udGV4dCk7CisJcHJpbnRrKEtFUk5fREVCVUciICAgICAgVGFza3MgaW4gd2FpdCBxdWV1ZTpcbiIpOworCWZvcihwMSA9IGFkcHRfcG9zdF93YWl0X3F1ZXVlOyBwMTsgcDEgPSBwMS0+bmV4dCkgeworCQlwcmludGsoS0VSTl9ERUJVRyIgICAgICAgICAgICVkXG4iLHAxLT5pZCk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHMzMiBhZHB0X2kyb19yZXNldF9oYmEoYWRwdF9oYmEqIHBIYmEpCQkJCit7CisJdTMyIG1zZ1s4XTsKKwl1OCogc3RhdHVzOworCXUzMiBtID0gRU1QVFlfUVVFVUUgOworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKFRNT1VUX0lPUFJFU0VUKkhaKTsKKworCWlmKHBIYmEtPmluaXRpYWxpemVkICA9PSBGQUxTRSkgewkvLyBGaXJzdCB0aW1lIHJlc2V0IHNob3VsZCBiZSBxdWljaworCQl0aW1lb3V0ID0gamlmZmllcyArICgyNSpIWik7CisJfSBlbHNlIHsKKwkJYWRwdF9pMm9fcXVpZXNjZV9oYmEocEhiYSk7CisJfQorCisJZG8geworCQlybWIoKTsKKwkJbSA9IHJlYWRsKHBIYmEtPnBvc3RfcG9ydCk7CisJCWlmIChtICE9IEVNUFRZX1FVRVVFKSB7CisJCQlicmVhazsKKwkJfQorCQlpZih0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyJUaW1lb3V0IHdhaXRpbmcgZm9yIG1lc3NhZ2UhXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9IHdoaWxlIChtID09IEVNUFRZX1FVRVVFKTsKKworCXN0YXR1cyA9ICh1OCopa21hbGxvYyg0LCBHRlBfS0VSTkVMfEFERFIzMik7CisJaWYoc3RhdHVzID09IE5VTEwpIHsKKwkJYWRwdF9zZW5kX25vcChwSGJhLCBtKTsKKwkJcHJpbnRrKEtFUk5fRVJSIklPUCByZXNldCBmYWlsZWQgLSBubyBmcmVlIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHN0YXR1cywwLDQpOworCisJbXNnWzBdPUVJR0hUX1dPUkRfTVNHX1NJWkV8U0dMX09GRlNFVF8wOworCW1zZ1sxXT1JMk9fQ01EX0FEQVBURVJfUkVTRVQ8PDI0fEhPU1RfVElEPDwxMnxBREFQVEVSX1RJRDsKKwltc2dbMl09MDsKKwltc2dbM109MDsKKwltc2dbNF09MDsKKwltc2dbNV09MDsKKwltc2dbNl09dmlydF90b19idXMoc3RhdHVzKTsKKwltc2dbN109MDsgICAgIAorCisJbWVtY3B5X3RvaW8ocEhiYS0+bXNnX2FkZHJfdmlydCttLCBtc2csIHNpemVvZihtc2cpKTsKKwl3bWIoKTsKKwl3cml0ZWwobSwgcEhiYS0+cG9zdF9wb3J0KTsKKwl3bWIoKTsKKworCXdoaWxlKCpzdGF0dXMgPT0gMCl7CisJCWlmKHRpbWVfYWZ0ZXIoamlmZmllcyx0aW1lb3V0KSl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBJT1AgUmVzZXQgVGltZW91dFxuIixwSGJhLT5uYW1lKTsKKwkJCWtmcmVlKHN0YXR1cyk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlybWIoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmKCpzdGF0dXMgPT0gMHgwMSAvKkkyT19FWEVDX0lPUF9SRVNFVF9JTl9QUk9HUkVTUyovKSB7CisJCVBERUJVRygiJXM6IFJlc2V0IGluIHByb2dyZXNzLi4uXG4iLCBwSGJhLT5uYW1lKTsKKwkJLy8gSGVyZSB3ZSB3YWl0IGZvciBtZXNzYWdlIGZyYW1lIHRvIGJlY29tZSBhdmFpbGFibGUKKwkJLy8gaW5kaWNhdGVkIHRoYXQgcmVzZXQgaGFzIGZpbmlzaGVkCisJCWRvIHsKKwkJCXJtYigpOworCQkJbSA9IHJlYWRsKHBIYmEtPnBvc3RfcG9ydCk7CisJCQlpZiAobSAhPSBFTVBUWV9RVUVVRSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOlRpbWVvdXQgd2FpdGluZyBmb3IgSU9QIFJlc2V0LlxuIixwSGJhLT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCX0KKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0gd2hpbGUgKG0gPT0gRU1QVFlfUVVFVUUpOworCQkvLyBGbHVzaCB0aGUgb2Zmc2V0CisJCWFkcHRfc2VuZF9ub3AocEhiYSwgbSk7CisJfQorCWFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSk7CisJaWYoKnN0YXR1cyA9PSAweDAyIHx8CisJCQlwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFJlc2V0IHJlamVjdCwgdHJ5aW5nIHRvIGNsZWFyXG4iLAorCQkJCXBIYmEtPm5hbWUpOworCX0gZWxzZSB7CisJCVBERUJVRygiJXM6IFJlc2V0IGNvbXBsZXRlZC5cbiIsIHBIYmEtPm5hbWUpOworCX0KKworCWtmcmVlKHN0YXR1cyk7CisjaWZkZWYgVUFSVERFTEFZCisJLy8gVGhpcyBkZWxheSBpcyB0byBhbGxvdyBzb21lb25lIGF0dGFjaGVkIHRvIHRoZSBjYXJkIHRocm91Z2ggdGhlIGRlYnVnIFVBUlQgdG8gCisJLy8gc2V0IHVwIHRoZSBkdW1wIGxldmVscyB0aGF0IHRoZXkgd2FudCBiZWZvcmUgdGhlIHJlc3Qgb2YgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisJYWRwdF9kZWxheSgyMDAwMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFkcHRfaTJvX3BhcnNlX2xjdChhZHB0X2hiYSogcEhiYSkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4OworCWludCB0aWQ7CisJc3RydWN0IGkyb19kZXZpY2UgKmQ7CisJaTJvX2xjdCAqbGN0ID0gcEhiYS0+bGN0OworCXU4IGJ1c19ubyA9IDA7CisJczE2IHNjc2lfaWQ7CisJczE2IHNjc2lfbHVuOworCXUzMiBidWZbMTBdOyAvLyBsYXJnZXIgdGhhbiA3LCBvciA4IC4uLgorCXN0cnVjdCBhZHB0X2RldmljZSogcERldjsgCisJCisJaWYgKGxjdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExDVCBpcyBlbXB0eT8/P1xuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwltYXggPSBsY3QtPnRhYmxlX3NpemU7CQorCW1heCAtPSAzOworCW1heCAvPSA5OworCisJZm9yKGk9MDtpPG1heDtpKyspIHsKKwkJaWYoIGxjdC0+bGN0X2VudHJ5W2ldLnVzZXJfdGlkICE9IDB4ZmZmKXsKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlIGhpZGRlbiBkZXZpY2VzLCB3ZSBuZWVkIHRvIGluZm9ybSB0aGUgdXBwZXIgbGF5ZXJzIGFib3V0CisJCQkgKiB0aGUgcG9zc2libGUgbWF4aW11bSBpZCByZWZlcmVuY2UgdG8gaGFuZGxlIGRldmljZSBhY2Nlc3Mgd2hlbgorCQkJICogYW4gYXJyYXkgaXMgZGlzYXNzZW1ibGVkLiBUaGlzIGNvZGUgaGFzIG5vIG90aGVyIHB1cnBvc2UgYnV0IHRvCisJCQkgKiBhbGxvdyB1cyBmdXR1cmUgYWNjZXNzIHRvIGRldmljZXMgdGhhdCBhcmUgY3VycmVudGx5IGhpZGRlbgorCQkJICogYmVoaW5kIGFycmF5cywgaG90c3BhcmVzIG9yIGhhdmUgbm90IGJlZW4gY29uZmlndXJlZCAoSkJPRCBtb2RlKS4KKwkJCSAqLworCQkJaWYoIGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkICE9IEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRSAmJgorCQkJICAgIGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkICE9IEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUwgJiYKKwkJCSAgICBsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCAhPSBJMk9fQ0xBU1NfRklCUkVfQ0hBTk5FTF9QRVJJUEhFUkFMICl7CisJCQkgICAgCWNvbnRpbnVlOworCQkJfQorCQkJdGlkID0gbGN0LT5sY3RfZW50cnlbaV0udGlkOworCQkJLy8gSTJPX0RQVF9ERVZJQ0VfSU5GT19HUk9VUF9OTzsKKwkJCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCB0aWQsIDB4ODAwMCwgLTEsIGJ1ZiwgMzIpPDApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJ1c19ubyA9IGJ1ZlswXT4+MTY7CisJCQlzY3NpX2lkID0gYnVmWzFdOworCQkJc2NzaV9sdW4gPSAoYnVmWzJdPj44ICkmMHhmZjsKKwkJCWlmKGJ1c19ubyA+PSBNQVhfQ0hBTk5FTCkgewkvLyBTb21ldGhpbmcgd3Jvbmcgc2tpcCBpdAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENoYW5uZWwgbnVtYmVyICVkIG91dCBvZiByYW5nZSBcbiIsIHBIYmEtPm5hbWUsIGJ1c19ubyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc2NzaV9pZCA+PSBNQVhfSUQpeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFNDU0kgSUQgJWQgb3V0IG9mIHJhbmdlIFxuIiwgcEhiYS0+bmFtZSwgYnVzX25vKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmKGJ1c19ubyA+IHBIYmEtPnRvcF9zY3NpX2NoYW5uZWwpeworCQkJCXBIYmEtPnRvcF9zY3NpX2NoYW5uZWwgPSBidXNfbm87CisJCQl9CisJCQlpZihzY3NpX2lkID4gcEhiYS0+dG9wX3Njc2lfaWQpeworCQkJCXBIYmEtPnRvcF9zY3NpX2lkID0gc2NzaV9pZDsKKwkJCX0KKwkJCWlmKHNjc2lfbHVuID4gcEhiYS0+dG9wX3Njc2lfbHVuKXsKKwkJCQlwSGJhLT50b3Bfc2NzaV9sdW4gPSBzY3NpX2x1bjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSksIEdGUF9LRVJORUwpOworCQlpZihkPT1OVUxMKQorCQl7CisJCQlwcmludGsoS0VSTl9DUklUIiVzOiBPdXQgb2YgbWVtb3J5IGZvciBJMk8gZGV2aWNlIGRhdGEuXG4iLHBIYmEtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJCisJCWQtPmNvbnRyb2xsZXIgPSAodm9pZCopcEhiYTsKKwkJZC0+bmV4dCA9IE5VTEw7CisKKwkJbWVtY3B5KCZkLT5sY3RfZGF0YSwgJmxjdC0+bGN0X2VudHJ5W2ldLCBzaXplb2YoaTJvX2xjdF9lbnRyeSkpOworCisJCWQtPmZsYWdzID0gMDsKKwkJdGlkID0gZC0+bGN0X2RhdGEudGlkOworCQlhZHB0X2kyb19yZXBvcnRfaGJhX3VuaXQocEhiYSwgZCk7CisJCWFkcHRfaTJvX2luc3RhbGxfZGV2aWNlKHBIYmEsIGQpOworCX0KKwlidXNfbm8gPSAwOworCWZvcihkID0gcEhiYS0+ZGV2aWNlczsgZCA7IGQgPSBkLT5uZXh0KSB7CisJCWlmKGQtPmxjdF9kYXRhLmNsYXNzX2lkICA9PSBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVCB8fAorCQkgICBkLT5sY3RfZGF0YS5jbGFzc19pZCAgPT0gSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUE9SVCl7CisJCQl0aWQgPSBkLT5sY3RfZGF0YS50aWQ7CisJCQkvLyBUT0RPIGdldCB0aGUgYnVzX25vIGZyb20gaHJ0LWJ1dCBmb3Igbm93IHRoZXkgYXJlIGluIG9yZGVyCisJCQkvL2J1c19ubyA9IAorCQkJaWYoYnVzX25vID4gcEhiYS0+dG9wX3Njc2lfY2hhbm5lbCl7CisJCQkJcEhiYS0+dG9wX3Njc2lfY2hhbm5lbCA9IGJ1c19ubzsKKwkJCX0KKwkJCXBIYmEtPmNoYW5uZWxbYnVzX25vXS50eXBlID0gZC0+bGN0X2RhdGEuY2xhc3NfaWQ7CisJCQlwSGJhLT5jaGFubmVsW2J1c19ub10udGlkID0gdGlkOworCQkJaWYoYWRwdF9pMm9fcXVlcnlfc2NhbGFyKHBIYmEsIHRpZCwgMHgwMjAwLCAtMSwgYnVmLCAyOCk+PTApCisJCQl7CisJCQkJcEhiYS0+Y2hhbm5lbFtidXNfbm9dLnNjc2lfaWQgPSBidWZbMV07CisJCQkJUERFQlVHKCJCdXMgJWQgLSBTQ1NJIElEICVkLlxuIiwgYnVzX25vLCBidWZbMV0pOworCQkJfQorCQkJLy8gVE9ETyByZW1vdmUgLSB0aGlzIGlzIGp1c3QgdW50aWwgd2UgZ2V0IGZyb20gaHJ0CisJCQlidXNfbm8rKzsKKwkJCWlmKGJ1c19ubyA+PSBNQVhfQ0hBTk5FTCkgewkvLyBTb21ldGhpbmcgd3Jvbmcgc2tpcCBpdAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENoYW5uZWwgbnVtYmVyICVkIG91dCBvZiByYW5nZSAtIExDVFxuIiwgcEhiYS0+bmFtZSwgYnVzX25vKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIFNldHVwIGFkcHRfZGV2aWNlIHRhYmxlCisJZm9yKGQgPSBwSGJhLT5kZXZpY2VzOyBkIDsgZCA9IGQtPm5leHQpIHsKKwkJaWYoZC0+bGN0X2RhdGEuY2xhc3NfaWQgID09IEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRSB8fAorCQkgICBkLT5sY3RfZGF0YS5jbGFzc19pZCAgPT0gSTJPX0NMQVNTX1NDU0lfUEVSSVBIRVJBTCB8fAorCQkgICBkLT5sY3RfZGF0YS5jbGFzc19pZCAgPT0gSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTCApeworCisJCQl0aWQgPSBkLT5sY3RfZGF0YS50aWQ7CisJCQlzY3NpX2lkID0gLTE7CisJCQkvLyBJMk9fRFBUX0RFVklDRV9JTkZPX0dST1VQX05POworCQkJaWYoYWRwdF9pMm9fcXVlcnlfc2NhbGFyKHBIYmEsIHRpZCwgMHg4MDAwLCAtMSwgYnVmLCAzMik+PTApIHsKKwkJCQlidXNfbm8gPSBidWZbMF0+PjE2OworCQkJCXNjc2lfaWQgPSBidWZbMV07CisJCQkJc2NzaV9sdW4gPSAoYnVmWzJdPj44ICkmMHhmZjsKKwkJCQlpZihidXNfbm8gPj0gTUFYX0NIQU5ORUwpIHsJLy8gU29tZXRoaW5nIHdyb25nIHNraXAgaXQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChzY3NpX2lkID49IE1BWF9JRCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYoIHBIYmEtPmNoYW5uZWxbYnVzX25vXS5kZXZpY2Vbc2NzaV9pZF0gPT0gTlVMTCl7CisJCQkJCXBEZXYgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkcHRfZGV2aWNlKSxHRlBfS0VSTkVMKTsKKwkJCQkJaWYocERldiA9PSBOVUxMKSB7CisJCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQkJfQorCQkJCQlwSGJhLT5jaGFubmVsW2J1c19ub10uZGV2aWNlW3Njc2lfaWRdID0gcERldjsKKwkJCQkJbWVtc2V0KHBEZXYsMCxzaXplb2Yoc3RydWN0IGFkcHRfZGV2aWNlKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yKCBwRGV2ID0gcEhiYS0+Y2hhbm5lbFtidXNfbm9dLmRldmljZVtzY3NpX2lkXTsJCisJCQkJCQkJcERldi0+bmV4dF9sdW47IHBEZXYgPSBwRGV2LT5uZXh0X2x1bil7CisJCQkJCX0KKwkJCQkJcERldi0+bmV4dF9sdW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRwdF9kZXZpY2UpLEdGUF9LRVJORUwpOworCQkJCQlpZihwRGV2LT5uZXh0X2x1biA9PSBOVUxMKSB7CisJCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQkJfQorCQkJCQltZW1zZXQocERldi0+bmV4dF9sdW4sMCxzaXplb2Yoc3RydWN0IGFkcHRfZGV2aWNlKSk7CisJCQkJCXBEZXYgPSBwRGV2LT5uZXh0X2x1bjsKKwkJCQl9CisJCQkJcERldi0+dGlkID0gdGlkOworCQkJCXBEZXYtPnNjc2lfY2hhbm5lbCA9IGJ1c19ubzsKKwkJCQlwRGV2LT5zY3NpX2lkID0gc2NzaV9pZDsKKwkJCQlwRGV2LT5zY3NpX2x1biA9IHNjc2lfbHVuOworCQkJCXBEZXYtPnBJMm9fZGV2ID0gZDsKKwkJCQlkLT5vd25lciA9IHBEZXY7CisJCQkJcERldi0+dHlwZSA9IChidWZbMF0pJjB4ZmY7CisJCQkJcERldi0+ZmxhZ3MgPSAoYnVmWzBdPj44KSYweGZmOworCQkJCWlmKHNjc2lfaWQgPiBwSGJhLT50b3Bfc2NzaV9pZCl7CisJCQkJCXBIYmEtPnRvcF9zY3NpX2lkID0gc2NzaV9pZDsKKwkJCQl9CisJCQkJaWYoc2NzaV9sdW4gPiBwSGJhLT50b3Bfc2NzaV9sdW4peworCQkJCQlwSGJhLT50b3Bfc2NzaV9sdW4gPSBzY3NpX2x1bjsKKwkJCQl9CisJCQl9CisJCQlpZihzY3NpX2lkID09IC0xKXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIkNvdWxkIG5vdCBmaW5kIFNDU0kgSUQgZm9yICVzXG4iLAorCQkJCQkJZC0+bGN0X2RhdGEuaWRlbnRpdHlfdGFnKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJRWFjaCBJMk8gY29udHJvbGxlciBoYXMgYSBjaGFpbiBvZiBkZXZpY2VzIG9uIGl0IC0gdGhlc2UgbWF0Y2gKKyAqCXRoZSB1c2VmdWwgcGFydHMgb2YgdGhlIExDVCBvZiB0aGUgYm9hcmQuCisgKi8KKyAKK3N0YXRpYyBpbnQgYWRwdF9pMm9faW5zdGFsbF9kZXZpY2UoYWRwdF9oYmEqIHBIYmEsIHN0cnVjdCBpMm9fZGV2aWNlICpkKQoreworCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlkLT5jb250cm9sbGVyPXBIYmE7CisJZC0+b3duZXI9TlVMTDsKKwlkLT5uZXh0PXBIYmEtPmRldmljZXM7CisJZC0+cHJldj1OVUxMOworCWlmIChwSGJhLT5kZXZpY2VzICE9IE5VTEwpeworCQlwSGJhLT5kZXZpY2VzLT5wcmV2PWQ7CisJfQorCXBIYmEtPmRldmljZXM9ZDsKKwkqZC0+ZGV2X25hbWUgPSAwOworCisJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHB0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yOworCWFkcHRfaGJhKiBwSGJhOworCisJLy9UT0RPIGNoZWNrIGZvciByb290IGFjY2VzcworCS8vCisJbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWlmIChtaW5vciA+PSBoYmFfY291bnQpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKKwkJaWYgKHBIYmEtPnVuaXQgPT0gbWlub3IpIHsKKwkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCisJCX0KKwl9CisJaWYgKHBIYmEgPT0gTlVMTCkgeworCQl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKworLy8JaWYocEhiYS0+aW5fdXNlKXsKKwkvLwl1cCgmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworLy8JCXJldHVybiAtRUJVU1k7CisvLwl9CisKKwlwSGJhLT5pbl91c2UgPSAxOworCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHB0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vcjsKKwlhZHB0X2hiYSogcEhiYTsKKworCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpZiAobWlub3IgPj0gaGJhX2NvdW50KSB7CisJCXJldHVybiAtRU5YSU87CisJfQorCWRvd24oJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlmb3IgKHBIYmEgPSBoYmFfY2hhaW47IHBIYmE7IHBIYmEgPSBwSGJhLT5uZXh0KSB7CisJCWlmIChwSGJhLT51bml0ID09IG1pbm9yKSB7CisJCQlicmVhazsJLyogZm91bmQgYWRhcHRlciAqLworCQl9CisJfQorCXVwKCZhZHB0X2NvbmZpZ3VyYXRpb25fbG9jayk7CisJaWYgKHBIYmEgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXBIYmEtPmluX3VzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFkcHRfaTJvX3Bhc3N0aHJ1KGFkcHRfaGJhKiBwSGJhLCB1MzIgX191c2VyICphcmcpCit7CisJdTMyIG1zZ1tNQVhfTUVTU0FHRV9TSVpFXTsKKwl1MzIqIHJlcGx5ID0gTlVMTDsKKwl1MzIgc2l6ZSA9IDA7CisJdTMyIHJlcGx5X3NpemUgPSAwOworCXUzMiBfX3VzZXIgKnVzZXJfbXNnID0gYXJnOworCXUzMiBfX3VzZXIgKiB1c2VyX3JlcGx5ID0gTlVMTDsKKwl2b2lkICpzZ19saXN0W3BIYmEtPnNnX3RhYmxlc2l6ZV07CisJdTMyIHNnX29mZnNldCA9IDA7CisJdTMyIHNnX2NvdW50ID0gMDsKKwlpbnQgc2dfaW5kZXggPSAwOworCXUzMiBpID0gMDsKKwl1MzIgcmNvZGUgPSAwOworCXZvaWQgKnAgPSBOVUxMOworCXVsb25nIGZsYWdzID0gMDsKKworCW1lbXNldCgmbXNnLCAwLCBNQVhfTUVTU0FHRV9TSVpFKjQpOworCS8vIGdldCB1c2VyIG1zZyBzaXplIGluIHUzMnMgCisJaWYoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSl7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlzaXplID0gc2l6ZT4+MTY7CisKKwl1c2VyX3JlcGx5ID0gJnVzZXJfbXNnW3NpemVdOworCWlmKHNpemUgPiBNQVhfTUVTU0FHRV9TSVpFKXsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXNpemUgKj0gNDsgLy8gQ29udmVydCB0byBieXRlcworCisJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCisJaWYoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKTsKKwlyZXBseV9zaXplID0gcmVwbHlfc2l6ZT4+MTY7CisJaWYocmVwbHlfc2l6ZSA+IFJFUExZX0ZSQU1FX1NJWkUpeworCQlyZXBseV9zaXplID0gUkVQTFlfRlJBTUVfU0laRTsKKwl9CisJcmVwbHlfc2l6ZSAqPSA0OworCXJlcGx5ID0ga21hbGxvYyhSRVBMWV9GUkFNRV9TSVpFKjQsIEdGUF9LRVJORUwpOworCWlmKHJlcGx5ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IGJ1ZmZlclxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChyZXBseSwwLFJFUExZX0ZSQU1FX1NJWkUqNCk7CisJc2dfb2Zmc2V0ID0gKG1zZ1swXT4+NCkmMHhmOworCW1zZ1syXSA9IDB4NDAwMDAwMDA7IC8vIElPQ1RMIGNvbnRleHQKKwltc2dbM10gPSAodTMyKXJlcGx5OworCW1lbXNldChzZ19saXN0LDAsIHNpemVvZihzZ19saXN0WzBdKSpwSGJhLT5zZ190YWJsZXNpemUpOworCWlmKHNnX29mZnNldCkgeworCQkvLyBUT0RPIDY0Yml0IGZpeAorCQlzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKnNnID0gIChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQqKSAobXNnK3NnX29mZnNldCk7CisJCXNnX2NvdW50ID0gKHNpemUgLSBzZ19vZmZzZXQqNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKKwkJaWYgKHNnX2NvdW50ID4gcEhiYS0+c2dfdGFibGVzaXplKXsKKwkJCXByaW50ayhLRVJOX0RFQlVHIiVzOklPQ1RMIFNHIExpc3QgdG9vIGxhcmdlICgldSlcbiIsIHBIYmEtPm5hbWUsc2dfY291bnQpOworCQkJa2ZyZWUgKHJlcGx5KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZm9yKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgeworCQkJaW50IHNnX3NpemU7CisKKwkJCWlmICghKHNnW2ldLmZsYWdfY291bnQgJiAweDEwMDAwMDAwIC8qSTJPX1NHTF9GTEFHU19TSU1QTEVfQUREUkVTU19FTEVNRU5UKi8pKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUciJXM6QmFkIFNHIGVsZW1lbnQgJWQgLSBub3Qgc2ltcGxlICgleClcbiIscEhiYS0+bmFtZSxpLCAgc2dbaV0uZmxhZ19jb3VudCk7CisJCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCXNnX3NpemUgPSBzZ1tpXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7ICAgICAgCisJCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc2ZlciAqLworCQkJcCA9IGttYWxsb2Moc2dfc2l6ZSwgR0ZQX0tFUk5FTHxBRERSMzIpOworCQkJaWYoIXApIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyIlczogQ291bGQgbm90IGFsbG9jYXRlIFNHIGJ1ZmZlciAtIHNpemUgPSAlZCBidWZmZXIgbnVtYmVyICVkIG9mICVkXG4iLAorCQkJCQkJcEhiYS0+bmFtZSxzZ19zaXplLGksc2dfY291bnQpOworCQkJCXJjb2RlID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ19saXN0W3NnX2luZGV4KytdID0gcDsgLy8gc2dsaXN0IGluZGV4ZWQgd2l0aCBpbnB1dCBmcmFtZSwgbm90IG91ciBpbnRlcm5hbCBmcmFtZS4KKwkJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBTRyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisJCQlpZihzZ1tpXS5mbGFnX2NvdW50ICYgMHgwNDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSKi8pIHsKKwkJCQkvLyBUT0RPIDY0Yml0IGZpeAorCQkJCWlmIChjb3B5X2Zyb21fdXNlcihwLCh2b2lkIF9fdXNlciAqKXNnW2ldLmFkZHJfYnVzLCBzZ19zaXplKSkgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRyIlczogQ291bGQgbm90IGNvcHkgU0cgYnVmICVkIEZST00gdXNlclxuIixwSGJhLT5uYW1lLGkpOworCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCQkvL1RPRE8gNjRiaXQgZml4CisJCQlzZ1tpXS5hZGRyX2J1cyA9ICh1MzIpdmlydF90b19idXMocCk7CisJCX0KKwl9CisKKwlkbyB7CisJCWlmKHBIYmEtPmhvc3QpCisJCQlzcGluX2xvY2tfaXJxc2F2ZShwSGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJLy8gVGhpcyBzdGF0ZSBzdG9wcyBhbnkgbmV3IGNvbW1hbmRzIGZyb20gZW50ZXJyaW5nIHRoZQorCQkvLyBjb250cm9sbGVyIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGlvY3RsCisvLwkJcEhiYS0+c3RhdGUgfD0gRFBUSV9TVEFURV9JT0NUTDsKKy8vCQlXZSBjYW4ndCBzZXQgdGhpcyBub3cgLSBUaGUgc2NzaSBzdWJzeXN0ZW0gc2V0cyBob3N0X2Jsb2NrZWQgYW5kCisvLwkJdGhlIHF1ZXVlIGVtcHRpZXMgYW5kIHN0b3BzLiAgV2UgbmVlZCBhIHdheSB0byByZXN0YXJ0IHRoZSBxdWV1ZQorCQlyY29kZSA9IGFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCBtc2csIHNpemUsIEZPUkVWRVIpOworCQlpZiAocmNvZGUgIT0gMCkKKwkJCXByaW50aygiYWRwdF9pMm9fcGFzc3RocnU6IHBvc3Qgd2FpdCBmYWlsZWQgJWQgJXBcbiIsCisJCQkJCXJjb2RlLCByZXBseSk7CisvLwkJcEhiYS0+c3RhdGUgJj0gfkRQVElfU1RBVEVfSU9DVEw7CisJCWlmKHBIYmEtPmhvc3QpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBIYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0gd2hpbGUocmNvZGUgPT0gLUVUSU1FRE9VVCk7ICAKKworCWlmKHJjb2RlKXsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmKHNnX29mZnNldCkgeworCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KKwkJdTMyIGo7CisJCS8vIFRPRE8gNjRiaXQgZml4CisJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCogc2c7CisJCWludCBzZ19zaXplOworCisJCS8vIHJlLWFjcXVpcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgc2cgY29weSBvcGVyYXRpb24KKwkJbWVtc2V0KCZtc2csIDAsIE1BWF9NRVNTQUdFX1NJWkUqNCk7IAorCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzIAorCQlpZihnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKXsKKwkJCXJjb2RlID0gLUVGQVVMVDsgCisJCQlnb3RvIGNsZWFudXA7IAorCQl9CisJCXNpemUgPSBzaXplPj4xNjsKKwkJc2l6ZSAqPSA0OworCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyIChtc2csIHVzZXJfbXNnLCBzaXplKSkgeworCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXNnX2NvdW50ID0gKHNpemUgLSBzZ19vZmZzZXQqNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKKworCQkvLyBUT0RPIDY0Yml0IGZpeAorCQlzZyAJID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCopKG1zZyArIHNnX29mZnNldCk7CisJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CisJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYoISAoc2dbal0uZmxhZ19jb3VudCAmIDB4NDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSKi8pKSB7CisJCQkJc2dfc2l6ZSA9IHNnW2pdLmZsYWdfY291bnQgJiAweGZmZmZmZjsgCisJCQkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXNnW2pdLmFkZHJfYnVzLHNnX2xpc3Rbal0sIHNnX3NpemUpKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIG5vdCBjb3B5ICVwIFRPIHVzZXIgJXhcbiIscEhiYS0+bmFtZSwgc2dfbGlzdFtqXSwgc2dbal0uYWRkcl9idXMpOworCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IAorCisJLyogQ29weSBiYWNrIHRoZSByZXBseSB0byB1c2VyIHNwYWNlICovCisJaWYgKHJlcGx5X3NpemUpIHsKKwkJLy8gd2Ugd3JvdGUgb3VyIG93biB2YWx1ZXMgZm9yIGNvbnRleHQgLSBub3cgcmVzdG9yZSB0aGUgdXNlciBzdXBwbGllZCBvbmVzCisJCWlmKGNvcHlfZnJvbV91c2VyKHJlcGx5KzIsIHVzZXJfbXNnKzIsIHNpemVvZih1MzIpKjIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBDb3VsZCBub3QgY29weSBtZXNzYWdlIGNvbnRleHQgRlJPTSB1c2VyXG4iLHBIYmEtPm5hbWUpOworCQkJcmNvZGUgPSAtRUZBVUxUOworCQl9CisJCWlmKGNvcHlfdG9fdXNlcih1c2VyX3JlcGx5LCByZXBseSwgcmVwbHlfc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIG5vdCBjb3B5IHJlcGx5IFRPIHVzZXJcbiIscEhiYS0+bmFtZSk7CisJCQlyY29kZSA9IC1FRkFVTFQ7CisJCX0KKwl9CisKKworY2xlYW51cDoKKwlpZiAocmNvZGUgIT0gLUVUSU1FICYmIHJjb2RlICE9IC1FSU5UUikKKwkJa2ZyZWUgKHJlcGx5KTsKKwl3aGlsZShzZ19pbmRleCkgeworCQlpZihzZ19saXN0Wy0tc2dfaW5kZXhdKSB7CisJCQlpZiAocmNvZGUgIT0gLUVUSU1FICYmIHJjb2RlICE9IC1FSU5UUikKKwkJCQlrZnJlZShzZ19saXN0W3NnX2luZGV4XSk7CisJCX0KKwl9CisJcmV0dXJuIHJjb2RlOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtLiAgVGhpcyBkb2VzIG5vdCBlZmZlY3QKKyAqIGFueSBsb2dpYyBhbmQgaWYgdGhlIGluZm8gaXMgd3JvbmcgLSBpdCBkb2Vzbid0IG1hdHRlci4KKyAqLworCisvKiBHZXQgYWxsIHRoZSBpbmZvIHdlIGNhbiBub3QgZ2V0IGZyb20ga2VybmVsIHNlcnZpY2VzICovCitzdGF0aWMgaW50IGFkcHRfc3lzdGVtX2luZm8odm9pZCBfX3VzZXIgKmJ1ZmZlcikKK3sKKwlzeXNJbmZvX1Mgc2k7CisKKwltZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsKKworCXNpLm9zVHlwZSA9IE9TX0xJTlVYOworCXNpLm9zTWFqb3JWZXJzaW9uID0gKHU4KSAoTElOVVhfVkVSU0lPTl9DT0RFID4+IDE2KTsKKwlzaS5vc01pbm9yVmVyc2lvbiA9ICh1OCkgKExJTlVYX1ZFUlNJT05fQ09ERSA+PiA4ICYgMHgwZmYpOworCXNpLm9zUmV2aXNpb24gPSAgICAgKHU4KSAoTElOVVhfVkVSU0lPTl9DT0RFICYgMHgwZmYpOworCXNpLmJ1c1R5cGUgPSBTSV9QQ0lfQlVTOworCXNpLnByb2Nlc3NvckZhbWlseSA9IERQVElfc2lnLmRzUHJvY2Vzc29yRmFtaWx5OworCisjaWYgZGVmaW5lZCBfX2kzODZfXyAKKwlhZHB0X2kzODZfaW5mbygmc2kpOworI2VsaWYgZGVmaW5lZCAoX19pYTY0X18pCisJYWRwdF9pYTY0X2luZm8oJnNpKTsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCWFkcHRfc3BhcmNfaW5mbygmc2kpOworI2VsaWYgZGVmaW5lZCAoX19hbHBoYV9fKQorCWFkcHRfYWxwaGFfaW5mbygmc2kpOworI2Vsc2UKKwlzaS5wcm9jZXNzb3JUeXBlID0gMHhmZiA7CisjZW5kaWYKKwlpZihjb3B5X3RvX3VzZXIoYnVmZmVyLCAmc2ksIHNpemVvZihzaSkpKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyJkcHRpOiBDb3VsZCBub3QgY29weSBidWZmZXIgVE8gdXNlclxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZCBfX2lhNjRfXyAKK3N0YXRpYyB2b2lkIGFkcHRfaWE2NF9pbmZvKHN5c0luZm9fUyogc2kpCit7CisJLy8gVGhpcyBpcyBhbGwgdGhlIGluZm8gd2UgbmVlZCBmb3Igbm93CisJLy8gV2Ugd2lsbCBhZGQgbW9yZSBpbmZvIGFzIG91ciBuZXcKKwkvLyBtYW5hZ21lbmVudCB1dGlsaXR5IHJlcXVpcmVzIGl0CisJc2ktPnByb2Nlc3NvclR5cGUgPSBQUk9DX0lBNjQ7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX3NwYXJjX18gCitzdGF0aWMgdm9pZCBhZHB0X3NwYXJjX2luZm8oc3lzSW5mb19TKiBzaSkKK3sKKwkvLyBUaGlzIGlzIGFsbCB0aGUgaW5mbyB3ZSBuZWVkIGZvciBub3cKKwkvLyBXZSB3aWxsIGFkZCBtb3JlIGluZm8gYXMgb3VyIG5ldworCS8vIG1hbmFnbWVuZW50IHV0aWxpdHkgcmVxdWlyZXMgaXQKKwlzaS0+cHJvY2Vzc29yVHlwZSA9IFBST0NfVUxUUkFTUEFSQzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX2FscGhhX18gCitzdGF0aWMgdm9pZCBhZHB0X2FscGhhX2luZm8oc3lzSW5mb19TKiBzaSkKK3sKKwkvLyBUaGlzIGlzIGFsbCB0aGUgaW5mbyB3ZSBuZWVkIGZvciBub3cKKwkvLyBXZSB3aWxsIGFkZCBtb3JlIGluZm8gYXMgb3VyIG5ldworCS8vIG1hbmFnbWVuZW50IHV0aWxpdHkgcmVxdWlyZXMgaXQKKwlzaS0+cHJvY2Vzc29yVHlwZSA9IFBST0NfQUxQSEE7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19pMzg2X18KKworc3RhdGljIHZvaWQgYWRwdF9pMzg2X2luZm8oc3lzSW5mb19TKiBzaSkKK3sKKwkvLyBUaGlzIGlzIGFsbCB0aGUgaW5mbyB3ZSBuZWVkIGZvciBub3cKKwkvLyBXZSB3aWxsIGFkZCBtb3JlIGluZm8gYXMgb3VyIG5ldworCS8vIG1hbmFnbWVuZW50IHV0aWxpdHkgcmVxdWlyZXMgaXQKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7CisJY2FzZSBDUFVfMzg2OgorCQlzaS0+cHJvY2Vzc29yVHlwZSA9IFBST0NfMzg2OworCQlicmVhazsKKwljYXNlIENQVV80ODY6CisJCXNpLT5wcm9jZXNzb3JUeXBlID0gUFJPQ180ODY7CisJCWJyZWFrOworCWNhc2UgQ1BVXzU4NjoKKwkJc2ktPnByb2Nlc3NvclR5cGUgPSBQUk9DX1BFTlRJVU07CisJCWJyZWFrOworCWRlZmF1bHQ6ICAvLyBKdXN0IGluIGNhc2UgCisJCXNpLT5wcm9jZXNzb3JUeXBlID0gUFJPQ19QRU5USVVNOworCQlicmVhazsKKwl9Cit9CisKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgYWRwdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdWludCBjbWQsCisJICAgICAgdWxvbmcgYXJnKQoreworCWludCBtaW5vcjsKKwlpbnQgZXJyb3IgPSAwOworCWFkcHRfaGJhKiBwSGJhOworCXVsb25nIGZsYWdzID0gMDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpZiAobWlub3IgPj0gRFBUSV9NQVhfSEJBKXsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJZG93bigmYWRwdF9jb25maWd1cmF0aW9uX2xvY2spOworCWZvciAocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKKwkJaWYgKHBIYmEtPnVuaXQgPT0gbWlub3IpIHsKKwkJCWJyZWFrOwkvKiBmb3VuZCBhZGFwdGVyICovCisJCX0KKwl9CisJdXAoJmFkcHRfY29uZmlndXJhdGlvbl9sb2NrKTsKKwlpZihwSGJhID09IE5VTEwpeworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXdoaWxlKCh2b2xhdGlsZSB1MzIpIHBIYmEtPnN0YXRlICYgRFBUSV9TVEFURV9SRVNFVCApIHsKKwkJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCxUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCS8vIFRPRE86IGhhbmRsZSAzIGNhc2VzCisJY2FzZSBEUFRfU0lHTkFUVVJFOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZEUFRJX3NpZywgc2l6ZW9mKERQVElfc2lnKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCWNhc2UgSTJPVVNSQ01EOgorCQlyZXR1cm4gYWRwdF9pMm9fcGFzc3RocnUocEhiYSwgYXJncCk7CisKKwljYXNlIERQVF9DVFJMSU5GTzp7CisJCWRydnJIQkFpbmZvX1MgSGJhSW5mbzsKKworI2RlZmluZSBGTEdfT1NEX1BDSV9WQUxJRCAweDAwMDEKKyNkZWZpbmUgRkxHX09TRF9ETUEJICAweDAwMDIKKyNkZWZpbmUgRkxHX09TRF9JMk8JICAweDAwMDQKKwkJbWVtc2V0KCZIYmFJbmZvLCAwLCBzaXplb2YoSGJhSW5mbykpOworCQlIYmFJbmZvLmRydnJIQkFudW0gPSBwSGJhLT51bml0OworCQlIYmFJbmZvLmJhc2VBZGRyID0gKHVsb25nKSBwSGJhLT5iYXNlX2FkZHJfcGh5czsKKwkJSGJhSW5mby5ibGlua1N0YXRlID0gYWRwdF9yZWFkX2JsaW5rX2xlZChwSGJhKTsKKwkJSGJhSW5mby5wY2lCdXNOdW0gPSAgcEhiYS0+cERldi0+YnVzLT5udW1iZXI7CisJCUhiYUluZm8ucGNpRGV2aWNlTnVtPVBDSV9TTE9UKHBIYmEtPnBEZXYtPmRldmZuKTsgCisJCUhiYUluZm8uSW50ZXJydXB0ID0gcEhiYS0+cERldi0+aXJxOyAKKwkJSGJhSW5mby5oYmFGbGFncyA9IEZMR19PU0RfUENJX1ZBTElEIHwgRkxHX09TRF9ETUEgfCBGTEdfT1NEX0kyTzsKKwkJaWYoY29weV90b191c2VyKGFyZ3AsICZIYmFJbmZvLCBzaXplb2YoSGJhSW5mbykpKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIG5vdCBjb3B5IEhiYUluZm8gVE8gdXNlclxuIixwSGJhLT5uYW1lKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCQl9CisJY2FzZSBEUFRfU1lTSU5GTzoKKwkJcmV0dXJuIGFkcHRfc3lzdGVtX2luZm8oYXJncCk7CisJY2FzZSBEUFRfQkxJTktMRUQ6eworCQl1MzIgdmFsdWU7CisJCXZhbHVlID0gKHUzMilhZHB0X3JlYWRfYmxpbmtfbGVkKHBIYmEpOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCQl9CisJY2FzZSBJMk9SRVNFVENNRDoKKwkJaWYocEhiYS0+aG9zdCkKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHBIYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlhZHB0X2hiYV9yZXNldChwSGJhKTsKKwkJaWYocEhiYS0+aG9zdCkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocEhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgSTJPUkVTQ0FOQ01EOgorCQlhZHB0X3Jlc2NhbihwSGJhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZHB0X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzY3NpX2NtbmQqIGNtZDsKKwlhZHB0X2hiYSogcEhiYSA9IGRldl9pZDsKKwl1MzIgbTsKKwl1bG9uZyByZXBseTsKKwl1MzIgc3RhdHVzPTA7CisJdTMyIGNvbnRleHQ7CisJdWxvbmcgZmxhZ3MgPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCWlmIChwSGJhID09IE5VTEwpeworCQlwcmludGsoS0VSTl9XQVJOSU5HImFkcHRfaXNyOiBOVUxMIGRldl9pZFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJaWYocEhiYS0+aG9zdCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUocEhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSggcmVhZGwocEhiYS0+aXJxX21hc2spICYgSTJPX0lOVEVSUlVQVF9QRU5ESU5HX0IpIHsKKwkJbSA9IHJlYWRsKHBIYmEtPnJlcGx5X3BvcnQpOworCQlpZihtID09IEVNUFRZX1FVRVVFKXsKKwkJCS8vIFRyeSB0d2ljZSB0aGVuIGdpdmUgdXAKKwkJCXJtYigpOworCQkJbSA9IHJlYWRsKHBIYmEtPnJlcGx5X3BvcnQpOworCQkJaWYobSA9PSBFTVBUWV9RVUVVRSl7IAorCQkJCS8vIFRoaXMgcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuCisJCQkJcHJpbnRrKEtFUk5fRVJSImRwdGk6IENvdWxkIG5vdCBnZXQgcmVwbHkgZnJhbWVcbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXJlcGx5ID0gKHVsb25nKWJ1c190b192aXJ0KG0pOworCisJCWlmIChyZWFkbChyZXBseSkgJiBNU0dfRkFJTCkgeworCQkJdTMyIG9sZF9tID0gcmVhZGwocmVwbHkrMjgpOyAKKwkJCXVsb25nIG1zZzsKKwkJCXUzMiBvbGRfY29udGV4dDsKKwkJCVBERUJVRygiJXM6IEZhaWxlZCBtZXNzYWdlXG4iLHBIYmEtPm5hbWUpOworCQkJaWYob2xkX20gPj0gMHgxMDAwMDApeworCQkJCXByaW50ayhLRVJOX0VSUiIlczogQmFkIHByZXNlcnZlZCBNRkEgKCV4KS0gZHJvcHBpbmcgZnJhbWVcbiIscEhiYS0+bmFtZSxvbGRfbSk7CisJCQkJd3JpdGVsKG0scEhiYS0+cmVwbHlfcG9ydCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBUcmFuc2FjdGlvbiBjb250ZXh0IGlzIDAgaW4gZmFpbGVkIHJlcGx5IGZyYW1lCisJCQltc2cgPSAodWxvbmcpKHBIYmEtPm1zZ19hZGRyX3ZpcnQgKyBvbGRfbSk7CisJCQlvbGRfY29udGV4dCA9IHJlYWRsKG1zZysxMik7CisJCQl3cml0ZWwob2xkX2NvbnRleHQsIHJlcGx5KzEyKTsKKwkJCWFkcHRfc2VuZF9ub3AocEhiYSwgb2xkX20pOworCQl9IAorCQljb250ZXh0ID0gcmVhZGwocmVwbHkrOCk7CisJCWlmKGNvbnRleHQgJiAweDQwMDAwMDAwKXsgLy8gSU9DVEwKKwkJCXVsb25nIHAgPSAodWxvbmcpKHJlYWRsKHJlcGx5KzEyKSk7CisJCQlpZiggcCAhPSAwKSB7CisJCQkJbWVtY3B5KCh2b2lkKilwLCAodm9pZCopcmVwbHksIFJFUExZX0ZSQU1FX1NJWkUgKiA0KTsKKwkJCX0KKwkJCS8vIEFsbCBJT0NUTHMgd2lsbCBhbHNvIGJlIHBvc3Qgd2FpdAorCQl9CisJCWlmKGNvbnRleHQgJiAweDgwMDAwMDAwKXsgLy8gUG9zdCB3YWl0IG1lc3NhZ2UKKwkJCXN0YXR1cyA9IHJlYWRsKHJlcGx5KzE2KTsKKwkJCWlmKHN0YXR1cyAgPj4gMjQpeworCQkJCXN0YXR1cyAmPSAgMHhmZmZmOyAvKiBHZXQgZGV0YWlsIHN0YXR1cyAqLworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSBJMk9fUE9TVF9XQUlUX09LOworCQkJfQorCQkJaWYoIShjb250ZXh0ICYgMHg0MDAwMDAwMCkpIHsKKwkJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCopIHJlYWRsKHJlcGx5KzEyKTsgCisJCQkJaWYoY21kICE9IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogQXBwYXJlbnQgU0NTSSBjbWQgaW4gUG9zdCBXYWl0IENvbnRleHQgLSBjbWQ9JXAgY29udGV4dD0leFxuIiwgcEhiYS0+bmFtZSwgY21kLCBjb250ZXh0KTsKKwkJCQl9CisJCQl9CisJCQlhZHB0X2kyb19wb3N0X3dhaXRfY29tcGxldGUoY29udGV4dCwgc3RhdHVzKTsKKwkJfSBlbHNlIHsgLy8gU0NTSSBtZXNzYWdlCisJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCopIHJlYWRsKHJlcGx5KzEyKTsgCisJCQlpZihjbWQgIT0gTlVMTCl7CisJCQkJaWYoY21kLT5zZXJpYWxfbnVtYmVyICE9IDApIHsgLy8gSWYgbm90IHRpbWVkb3V0CisJCQkJCWFkcHRfaTJvX3RvX3Njc2kocmVwbHksIGNtZCk7CisJCQkJfQorCQkJfQorCQl9CisJCXdyaXRlbChtLCBwSGJhLT5yZXBseV9wb3J0KTsKKwkJd21iKCk7CisJCXJtYigpOworCX0KKwloYW5kbGVkID0gMTsKK291dDoJaWYocEhiYS0+aG9zdCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwSGJhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHMzMiBhZHB0X3Njc2lfdG9faTJvKGFkcHRfaGJhKiBwSGJhLCBzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQsIHN0cnVjdCBhZHB0X2RldmljZSogZCkKK3sKKwlpbnQgaTsKKwl1MzIgbXNnW01BWF9NRVNTQUdFX1NJWkVdOworCXUzMiogbXB0cjsKKwl1MzIgKmxlbnB0cjsKKwlpbnQgZGlyZWN0aW9uOworCWludCBzY3NpZGlyOworCXUzMiBsZW47CisJdTMyIHJlcWxlbjsKKwlzMzIgcmNvZGU7CisKKwltZW1zZXQobXNnLCAwICwgc2l6ZW9mKG1zZykpOworCWxlbiA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWRpcmVjdGlvbiA9IDB4MDAwMDAwMDA7CQorCQorCXNjc2lkaXIgPSAweDAwMDAwMDAwOwkJCS8vIERBVEEgTk8gWEZFUgorCWlmKGxlbikgeworCQkvKgorCQkgKiBTZXQgU0NCRmxhZ3MgdG8gaW5kaWNhdGUgaWYgZGF0YSBpcyBiZWluZyB0cmFuc2ZlcnJlZAorCQkgKiBpbiBvciBvdXQsIG9yIG5vIGRhdGEgdHJhbnNmZXIKKwkJICogTm90ZTogIERvIG5vdCBoYXZlIHRvIHZlcmlmeSBpbmRleCBpcyBsZXNzIHRoYW4gMCBzaW5jZQorCQkgKiBjbWQtPmNtbmRbMF0gaXMgYW4gdW5zaWduZWQgY2hhcgorCQkgKi8KKwkJc3dpdGNoKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24peworCQljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJCXNjc2lkaXIgID0weDQwMDAwMDAwOwkvLyBEQVRBIElOICAoaW9wPC0tZGV2KQorCQkJYnJlYWs7CisJCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJCWRpcmVjdGlvbj0weDA0MDAwMDAwOwkvLyBTR0wgT1VUCisJCQlzY3NpZGlyICA9MHg4MDAwMDAwMDsJLy8gREFUQSBPVVQgKGlvcC0tPmRldikKKwkJCWJyZWFrOworCQljYXNlIERNQV9OT05FOgorCQkJYnJlYWs7CisJCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCQlzY3NpZGlyICA9MHg0MDAwMDAwMDsJLy8gREFUQSBJTiAgKGlvcDwtLWRldikKKwkJCS8vIEFzc3VtZSBJbiAtIGFuZCBjb250aW51ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogc2NzaSBvcGNvZGUgMHgleCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCSAgICAgcEhiYS0+bmFtZSwgY21kLT5jbW5kWzBdKTsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PDE2KSB8IChJTklUSUFUT1JfRVJST1IgPDwgOCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIAkwOworCQl9CisJfQorCS8vIG1zZ1swXSBpcyBzZXQgbGF0ZXIKKwkvLyBJMk9fQ01EX1NDU0lfRVhFQworCW1zZ1sxXSA9ICgoMHhmZjw8MjQpfChIT1NUX1RJRDw8MTIpfGQtPnRpZCk7CisJbXNnWzJdID0gMDsKKwltc2dbM10gPSAodTMyKWNtZDsJLyogV2Ugd2FudCB0aGUgU0NTSSBjb250cm9sIGJsb2NrIGJhY2sgKi8KKwkvLyBPdXIgY2FyZHMgdXNlIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0IGFzIHRoZSB0YWcgZm9yIHF1ZXVlaW5nCisJLy8gQWRhcHRlYy9EUFQgUHJpdmF0ZSBzdHVmZiAKKwltc2dbNF0gPSBJMk9fQ01EX1NDU0lfRVhFQ3woRFBUX09SR0FOSVpBVElPTl9JRDw8MTYpOworCW1zZ1s1XSA9IGQtPnRpZDsKKwkvKiBEaXJlY3Rpb24sIGRpc2Nvbm5lY3Qgb2sgfCBzZW5zZSBkYXRhIHwgc2ltcGxlIHF1ZXVlICwgQ0RCTGVuICovCisJLy8gSTJPX1NDQl9GTEFHX0VOQUJMRV9ESVNDT05ORUNUIHwgCisJLy8gSTJPX1NDQl9GTEFHX1NJTVBMRV9RVUVVRV9UQUcgfCAKKwkvLyBJMk9fU0NCX0ZMQUdfU0VOU0VfREFUQV9JTl9NRVNTQUdFOworCW1zZ1s2XSA9IHNjc2lkaXJ8MHgyMGEwMDAwMHxjbWQtPmNtZF9sZW47CisKKwltcHRyPW1zZys3OworCisJLy8gV3JpdGUgU0NTSSBjb21tYW5kIGludG8gdGhlIG1lc3NhZ2UgLSBhbHdheXMgMTYgYnl0ZSBibG9jayAKKwltZW1zZXQobXB0ciwgMCwgIDE2KTsKKwltZW1jcHkobXB0ciwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworCW1wdHIrPTQ7CisJbGVucHRyPW1wdHIrKzsJCS8qIFJlbWVtYmVyIG1lIC0gZmlsbCBpbiB3aGVuIHdlIGtub3cgKi8KKwlyZXFsZW4gPSAxNDsJCS8vIFNJTkdMRSBTR0UKKwkvKiBOb3cgZmlsbCBpbiB0aGUgU0dMaXN0IGFuZCBjb21tYW5kICovCisJaWYoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPnJlcXVlc3RfYnVmZmVyOworCQlpbnQgc2dfY291bnQgPSBwY2lfbWFwX3NnKHBIYmEtPnBEZXYsIHNnLCBjbWQtPnVzZV9zZywKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCisJCWxlbiA9IDA7CisJCWZvcihpID0gMCA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisJCQkqbXB0cisrID0gZGlyZWN0aW9ufDB4MTAwMDAwMDB8c2dfZG1hX2xlbihzZyk7CisJCQlsZW4rPXNnX2RtYV9sZW4oc2cpOworCQkJKm1wdHIrKyA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCXNnKys7CisJCX0KKwkJLyogTWFrZSB0aGlzIGFuIGVuZCBvZiBsaXN0ICovCisJCW1wdHJbLTJdID0gZGlyZWN0aW9ufDB4RDAwMDAwMDB8c2dfZG1hX2xlbihzZy0xKTsKKwkJcmVxbGVuID0gbXB0ciAtIG1zZzsKKwkJKmxlbnB0ciA9IGxlbjsKKwkJCisJCWlmKGNtZC0+dW5kZXJmbG93ICYmIGxlbiAhPSBjbWQtPnVuZGVyZmxvdyl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIkNtZCBsZW4gJTA4WCBDbWQgdW5kZXJmbG93ICUwOFhcbiIsCisJCQkJbGVuLCBjbWQtPnVuZGVyZmxvdyk7CisJCX0KKwl9IGVsc2UgeworCQkqbGVucHRyID0gbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWlmKGxlbiA9PSAwKSB7CisJCQlyZXFsZW4gPSAxMjsKKwkJfSBlbHNlIHsKKwkJCSptcHRyKysgPSAweEQwMDAwMDAwfGRpcmVjdGlvbnxjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCSptcHRyKysgPSBwY2lfbWFwX3NpbmdsZShwSGJhLT5wRGV2LAorCQkJCWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0KKwl9CisJCisJLyogU3RpY2sgdGhlIGhlYWRlcnMgb24gKi8KKwltc2dbMF0gPSByZXFsZW48PDE2IHwgKChyZXFsZW4gPiAxMikgPyBTR0xfT0ZGU0VUXzEyIDogU0dMX09GRlNFVF8wKTsKKwkKKwkvLyBTZW5kIGl0IG9uIGl0J3Mgd2F5CisJcmNvZGUgPSBhZHB0X2kyb19wb3N0X3RoaXMocEhiYSwgbXNnLCByZXFsZW48PDIpOworCWlmIChyY29kZSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisKKworc3RhdGljIHMzMiBhZHB0X3Njc2lfcmVnaXN0ZXIoYWRwdF9oYmEqIHBIYmEsc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqIHNodCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gTlVMTDsKKworCWhvc3QgPSBzY3NpX3JlZ2lzdGVyKHNodCwgc2l6ZW9mKGFkcHRfaGJhKikpOworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJcHJpbnRrICgiJXM6IHNjc2lfcmVnaXN0ZXIgcmV0dXJuZWQgTlVMTFxuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlob3N0LT5ob3N0ZGF0YVswXSA9ICh1bnNpZ25lZCBsb25nKXBIYmE7CisJcEhiYS0+aG9zdCA9IGhvc3Q7CisKKwlob3N0LT5pcnEgPSBwSGJhLT5wRGV2LT5pcnE7CisJLyogbm8gSU8gcG9ydHMsIHNvIGRvbid0IGhhdmUgdG8gc2V0IGhvc3QtPmlvX3BvcnQgYW5kIAorCSAqIGhvc3QtPm5faW9fcG9ydAorCSAqLworCWhvc3QtPmlvX3BvcnQgPSAwOworCWhvc3QtPm5faW9fcG9ydCA9IDA7CisJCQkJLyogc2VlIGNvbW1lbnRzIGluIGhvc3RzLmggKi8KKwlob3N0LT5tYXhfaWQgPSAxNjsKKwlob3N0LT5tYXhfbHVuID0gMjU2OworCWhvc3QtPm1heF9jaGFubmVsID0gcEhiYS0+dG9wX3Njc2lfY2hhbm5lbCArIDE7CisJaG9zdC0+Y21kX3Blcl9sdW4gPSAxOworCWhvc3QtPnVuaXF1ZV9pZCA9ICh1aW50KSBwSGJhOworCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IHBIYmEtPnNnX3RhYmxlc2l6ZTsKKwlob3N0LT5jYW5fcXVldWUgPSBwSGJhLT5wb3N0X2ZpZm9fc2l6ZTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzMzIgYWRwdF9pMm9fdG9fc2NzaSh1bG9uZyByZXBseSwgc3RydWN0IHNjc2lfY21uZCogY21kKQoreworCWFkcHRfaGJhKiBwSGJhOworCXUzMiBoYmFfc3RhdHVzOworCXUzMiBkZXZfc3RhdHVzOworCXUzMiByZXBseV9mbGFncyA9IHJlYWRsKHJlcGx5KSAmIDB4ZmYwMDsgLy8gTGVhdmUgaXQgc2hpZnRlZCB1cCA4IGJpdHMgCisJLy8gSSBrbm93IHRoaXMgd291bGQgbG9vayBjbGVhbmVyIGlmIEkganVzdCByZWFkIGJ5dGVzCisJLy8gYnV0IHRoZSBtb2RlbCBJIGhhdmUgYmVlbiB1c2luZyBmb3IgYWxsIHRoZSByZXN0IG9mIHRoZQorCS8vIGlvIGlzIGluIDQgYnl0ZSB3b3JkcyAtIHNvIEkga2VlcCB0aGF0IG1vZGVsCisJdTE2IGRldGFpbGVkX3N0YXR1cyA9IHJlYWRsKHJlcGx5KzE2KSAmMHhmZmZmOworCWRldl9zdGF0dXMgPSAoZGV0YWlsZWRfc3RhdHVzICYgMHhmZik7CisJaGJhX3N0YXR1cyA9IGRldGFpbGVkX3N0YXR1cyA+PiA4OworCisJLy8gY2FsY3VsYXRlIHJlc2lkIGZvciBzZyAKKwljbWQtPnJlc2lkID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW4gLSByZWFkbChyZXBseSs1KTsKKworCXBIYmEgPSAoYWRwdF9oYmEqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisKKwljbWQtPnNlbnNlX2J1ZmZlclswXSA9ICdcMCc7ICAvLyBpbml0aWFsaXplIHNlbnNlIHZhbGlkIGZsYWcgdG8gZmFsc2UKKworCWlmKCEocmVwbHlfZmxhZ3MgJiBNU0dfRkFJTCkpIHsKKwkJc3dpdGNoKGRldGFpbGVkX3N0YXR1cyAmIEkyT19TQ1NJX0RTQ19NQVNLKSB7CisJCWNhc2UgSTJPX1NDU0lfRFNDX1NVQ0NFU1M6CisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJLy8gaGFuZGxlIHVuZGVyZmxvdworCQkJaWYocmVhZGwocmVwbHkrNSkgPCBjbWQtPnVuZGVyZmxvdyApIHsKKwkJCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwxNik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogU0NTSSBDTUQgdW5kZXJmbG93XG4iLHBIYmEtPm5hbWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSTJPX1NDU0lfRFNDX1JFUVVFU1RfQUJPUlRFRDoKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisJCQlicmVhazsKKwkJY2FzZSBJMk9fU0NTSV9EU0NfUEFUSF9JTlZBTElEOgorCQljYXNlIEkyT19TQ1NJX0RTQ19ERVZJQ0VfTk9UX1BSRVNFTlQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1NFTEVDVElPTl9USU1FT1VUOgorCQljYXNlIEkyT19TQ1NJX0RTQ19DT01NQU5EX1RJTUVPVVQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX05PX0FEQVBURVI6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1JFU09VUkNFX1VOQVZBSUxBQkxFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogU0NTSSBUaW1lb3V0LURldmljZSAoJWQsJWQsJWQpIGhiYSBzdGF0dXM9MHgleCwgZGV2IHN0YXR1cz0weCV4LCBjbWQ9MHgleFxuIiwKKwkJCQlwSGJhLT5uYW1lLCAodTMyKWNtZC0+ZGV2aWNlLT5jaGFubmVsLCAodTMyKWNtZC0+ZGV2aWNlLT5pZCwgKHUzMiljbWQtPmRldmljZS0+bHVuLCBoYmFfc3RhdHVzLCBkZXZfc3RhdHVzLCBjbWQtPmNtbmRbMF0pOworCQkJY21kLT5yZXN1bHQgPSAoRElEX1RJTUVfT1VUIDw8IDE2KTsKKwkJCWJyZWFrOworCQljYXNlIEkyT19TQ1NJX0RTQ19BREFQVEVSX0JVU1k6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0JVU19CVVNZOgorCQkJY21kLT5yZXN1bHQgPSAoRElEX0JVU19CVVNZIDw8IDE2KTsKKwkJCWJyZWFrOworCQljYXNlIEkyT19TQ1NJX0RTQ19TQ1NJX0JVU19SRVNFVDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfQkRSX01FU1NBR0VfU0VOVDoKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisJCQlicmVhazsKKwkJY2FzZSBJMk9fU0NTSV9EU0NfUEFSSVRZX0VSUk9SX0ZBSUxVUkU6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBTQ1NJIENNRCBwYXJpdHkgZXJyb3JcbiIscEhiYS0+bmFtZSk7CisJCQljbWQtPnJlc3VsdCA9IChESURfUEFSSVRZIDw8IDE2KTsKKwkJCWJyZWFrOworCQljYXNlIEkyT19TQ1NJX0RTQ19VTkFCTEVfVE9fQUJPUlQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0NPTVBMRVRFX1dJVEhfRVJST1I6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1VOQUJMRV9UT19URVJNSU5BVEU6CisJCWNhc2UgSTJPX1NDU0lfRFNDX01SX01FU1NBR0VfUkVDRUlWRUQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0FVVE9TRU5TRV9GQUlMRUQ6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0RBVEFfT1ZFUlJVTjoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfVU5FWFBFQ1RFRF9CVVNfRlJFRToKKwkJY2FzZSBJMk9fU0NTSV9EU0NfU0VRVUVOQ0VfRkFJTFVSRToKKwkJY2FzZSBJMk9fU0NTSV9EU0NfUkVRVUVTVF9MRU5HVEhfRVJST1I6CisJCWNhc2UgSTJPX1NDU0lfRFNDX1BST1ZJREVfRkFJTFVSRToKKwkJY2FzZSBJMk9fU0NTSV9EU0NfUkVRVUVTVF9URVJNSU5BVEVEOgorCQljYXNlIEkyT19TQ1NJX0RTQ19JREVfTUVTU0FHRV9TRU5UOgorCQljYXNlIEkyT19TQ1NJX0RTQ19VTkFDS05PV0xFREdFRF9FVkVOVDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfTUVTU0FHRV9SRUNFSVZFRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfSU5WQUxJRF9DREI6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0xVTl9JTlZBTElEOgorCQljYXNlIEkyT19TQ1NJX0RTQ19TQ1NJX1RJRF9JTlZBTElEOgorCQljYXNlIEkyT19TQ1NJX0RTQ19GVU5DVElPTl9VTkFWQUlMQUJMRToKKwkJY2FzZSBJMk9fU0NTSV9EU0NfTk9fTkVYVVM6CisJCWNhc2UgSTJPX1NDU0lfRFNDX0NEQl9SRUNFSVZFRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfTFVOX0FMUkVBRFlfRU5BQkxFRDoKKwkJY2FzZSBJMk9fU0NTSV9EU0NfUVVFVUVfRlJPWkVOOgorCQljYXNlIEkyT19TQ1NJX0RTQ19SRVFVRVNUX0lOVkFMSUQ6CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBTQ1NJIGVycm9yICUweC1EZXZpY2UoJWQsJWQsJWQpIGhiYV9zdGF0dXM9MHgleCwgZGV2X3N0YXR1cz0weCV4LCBjbWQ9MHgleFxuIiwKKwkJCQlwSGJhLT5uYW1lLCBkZXRhaWxlZF9zdGF0dXMgJiBJMk9fU0NTSV9EU0NfTUFTSywgKHUzMiljbWQtPmRldmljZS0+Y2hhbm5lbCwgKHUzMiljbWQtPmRldmljZS0+aWQsICh1MzIpY21kLT5kZXZpY2UtPmx1biwKKwkJCSAgICAgICBoYmFfc3RhdHVzLCBkZXZfc3RhdHVzLCBjbWQtPmNtbmRbMF0pOworCQkJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gY29weSBvdmVyIHRoZSByZXF1ZXN0IHNlbnNlIGRhdGEgaWYgaXQgd2FzIGEgY2hlY2sKKwkJLy8gY29uZGl0aW9uIHN0YXR1cworCQlpZihkZXZfc3RhdHVzID09IDB4MDIgLypDSEVDS19DT05ESVRJT04qLykgeworCQkJdTMyIGxlbiA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7CisJCQlsZW4gPSAobGVuID4gNDApID8gIDQwIDogbGVuOworCQkJLy8gQ29weSBvdmVyIHRoZSBzZW5zZSBkYXRhCisJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsICh2b2lkKikocmVwbHkrMjgpICwgbGVuKTsKKwkJCWlmKGNtZC0+c2Vuc2VfYnVmZmVyWzBdID09IDB4NzAgLyogY2xhc3MgNyAqLyAmJiAKKwkJCSAgIGNtZC0+c2Vuc2VfYnVmZmVyWzJdID09IERBVEFfUFJPVEVDVCApeworCQkJCS8qIFRoaXMgaXMgdG8gaGFuZGxlIGFuIGFycmF5IGZhaWxlZCAqLworCQkJCWNtZC0+cmVzdWx0ID0gKERJRF9USU1FX09VVCA8PCAxNik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogU0NTSSBEYXRhIFByb3RlY3QtRGV2aWNlICglZCwlZCwlZCkgaGJhX3N0YXR1cz0weCV4LCBkZXZfc3RhdHVzPTB4JXgsIGNtZD0weCV4XG4iLAorCQkJCQlwSGJhLT5uYW1lLCAodTMyKWNtZC0+ZGV2aWNlLT5jaGFubmVsLCAodTMyKWNtZC0+ZGV2aWNlLT5pZCwgKHUzMiljbWQtPmRldmljZS0+bHVuLCAKKwkJCQkJaGJhX3N0YXR1cywgZGV2X3N0YXR1cywgY21kLT5jbW5kWzBdKTsKKworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogSW4gdGhpcyBjb25kdGlvbiB3ZSBjb3VsZCBub3QgdGFsayB0byB0aGUgdGlkCisJCSAqIHRoZSBjYXJkIHJlamVjdGVkIGl0LiAgV2Ugc2hvdWxkIHNpZ25hbCBhIHJldHJ5CisJCSAqIGZvciBhIGxpbWl0dGVkIG51bWJlciBvZiByZXRyaWVzLgorCQkgKi8KKwkJY21kLT5yZXN1bHQgPSAoRElEX1RJTUVfT1VUIDw8IDE2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogSTJPIE1TR19GQUlMIC0gRGV2aWNlICglZCwlZCwlZCkgdGlkPSVkLCBjbWQ9MHgleFxuIiwKKwkJCXBIYmEtPm5hbWUsICh1MzIpY21kLT5kZXZpY2UtPmNoYW5uZWwsICh1MzIpY21kLT5kZXZpY2UtPmlkLCAodTMyKWNtZC0+ZGV2aWNlLT5sdW4sCisJCQkoKHN0cnVjdCBhZHB0X2RldmljZSopKGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YSkpLT50aWQsIGNtZC0+Y21uZFswXSk7CisJfQorCisJY21kLT5yZXN1bHQgfD0gKGRldl9zdGF0dXMpOworCisJaWYoY21kLT5zY3NpX2RvbmUgIT0gTlVMTCl7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJfSAKKwlyZXR1cm4gY21kLT5yZXN1bHQ7Cit9CisKKworc3RhdGljIHMzMiBhZHB0X3Jlc2NhbihhZHB0X2hiYSogcEhiYSkKK3sKKwlzMzIgcmNvZGU7CisJdWxvbmcgZmxhZ3MgPSAwOworCisJaWYocEhiYS0+aG9zdCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUocEhiYS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKChyY29kZT1hZHB0X2kyb19sY3RfZ2V0KHBIYmEpKSA8IDApCisJCWdvdG8gb3V0OworCWlmICgocmNvZGU9YWRwdF9pMm9fcmVwYXJzZV9sY3QocEhiYSkpIDwgMCkKKwkJZ290byBvdXQ7CisJcmNvZGUgPSAwOworb3V0OglpZihwSGJhLT5ob3N0KQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBIYmEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiByY29kZTsKK30KKworCitzdGF0aWMgczMyIGFkcHRfaTJvX3JlcGFyc2VfbGN0KGFkcHRfaGJhKiBwSGJhKQoreworCWludCBpOworCWludCBtYXg7CisJaW50IHRpZDsKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZDsKKwlpMm9fbGN0ICpsY3QgPSBwSGJhLT5sY3Q7CisJdTggYnVzX25vID0gMDsKKwlzMTYgc2NzaV9pZDsKKwlzMTYgc2NzaV9sdW47CisJdTMyIGJ1ZlsxMF07IC8vIGF0IGxlYXN0IDggdTMyJ3MKKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIHBEZXYgPSBOVUxMOworCXN0cnVjdCBpMm9fZGV2aWNlKiBwSTJvX2RldiA9IE5VTEw7CisJCisJaWYgKGxjdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExDVCBpcyBlbXB0eT8/P1xuIixwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwltYXggPSBsY3QtPnRhYmxlX3NpemU7CQorCW1heCAtPSAzOworCW1heCAvPSA5OworCisJLy8gTWFyayBlYWNoIGRyaXZlIGFzIHVuc2Nhbm5lZAorCWZvciAoZCA9IHBIYmEtPmRldmljZXM7IGQ7IGQgPSBkLT5uZXh0KSB7CisJCXBEZXYgPShzdHJ1Y3QgYWRwdF9kZXZpY2UqKSBkLT5vd25lcjsKKwkJaWYoIXBEZXYpeworCQkJY29udGludWU7CisJCX0KKwkJcERldi0+c3RhdGUgfD0gRFBUSV9ERVZfVU5TQ0FOTkVEOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBMQ1QgaGFzICVkIGVudHJpZXMuXG4iLCBwSGJhLT5uYW1lLG1heCk7CisJCisJZm9yKGk9MDtpPG1heDtpKyspIHsKKwkJaWYoIGxjdC0+bGN0X2VudHJ5W2ldLnVzZXJfdGlkICE9IDB4ZmZmKXsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYoIGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkID09IEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRSB8fAorCQkgICAgbGN0LT5sY3RfZW50cnlbaV0uY2xhc3NfaWQgPT0gSTJPX0NMQVNTX1NDU0lfUEVSSVBIRVJBTCB8fAorCQkgICAgbGN0LT5sY3RfZW50cnlbaV0uY2xhc3NfaWQgPT0gSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTCApeworCQkJdGlkID0gbGN0LT5sY3RfZW50cnlbaV0udGlkOworCQkJaWYoYWRwdF9pMm9fcXVlcnlfc2NhbGFyKHBIYmEsIHRpZCwgMHg4MDAwLCAtMSwgYnVmLCAzMik8MCkgeworCQkJCXByaW50ayhLRVJOX0VSUiIlczogQ291bGQgbm90IHF1ZXJ5IGRldmljZVxuIixwSGJhLT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJ1c19ubyA9IGJ1ZlswXT4+MTY7CisJCQlzY3NpX2lkID0gYnVmWzFdOworCQkJc2NzaV9sdW4gPSAoYnVmWzJdPj44ICkmMHhmZjsKKwkJCXBEZXYgPSBwSGJhLT5jaGFubmVsW2J1c19ub10uZGV2aWNlW3Njc2lfaWRdOworCQkJLyogZGEgbHVuICovCisJCQl3aGlsZShwRGV2KSB7CisJCQkJaWYocERldi0+c2NzaV9sdW4gPT0gc2NzaV9sdW4pIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBEZXYgPSBwRGV2LT5uZXh0X2x1bjsKKwkJCX0KKwkJCWlmKCFwRGV2ICkgeyAvLyBTb21ldGhpbmcgbmV3IGFkZCBpdAorCQkJCWQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSksIEdGUF9LRVJORUwpOworCQkJCWlmKGQ9PU5VTEwpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9DUklUICJPdXQgb2YgbWVtb3J5IGZvciBJMk8gZGV2aWNlIGRhdGEuXG4iKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCQorCQkJCWQtPmNvbnRyb2xsZXIgPSAodm9pZCopcEhiYTsKKwkJCQlkLT5uZXh0ID0gTlVMTDsKKworCQkJCW1lbWNweSgmZC0+bGN0X2RhdGEsICZsY3QtPmxjdF9lbnRyeVtpXSwgc2l6ZW9mKGkyb19sY3RfZW50cnkpKTsKKworCQkJCWQtPmZsYWdzID0gMDsKKwkJCQlhZHB0X2kyb19yZXBvcnRfaGJhX3VuaXQocEhiYSwgZCk7CisJCQkJYWRwdF9pMm9faW5zdGFsbF9kZXZpY2UocEhiYSwgZCk7CisJCisJCQkJaWYoYnVzX25vID49IE1BWF9DSEFOTkVMKSB7CS8vIFNvbWV0aGluZyB3cm9uZyBza2lwIGl0CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENoYW5uZWwgbnVtYmVyICVkIG91dCBvZiByYW5nZSBcbiIsIHBIYmEtPm5hbWUsIGJ1c19ubyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlwRGV2ID0gcEhiYS0+Y2hhbm5lbFtidXNfbm9dLmRldmljZVtzY3NpX2lkXTsJCisJCQkJaWYoIHBEZXYgPT0gTlVMTCl7CisJCQkJCXBEZXYgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkcHRfZGV2aWNlKSxHRlBfS0VSTkVMKTsKKwkJCQkJaWYocERldiA9PSBOVUxMKSB7CisJCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQkJfQorCQkJCQlwSGJhLT5jaGFubmVsW2J1c19ub10uZGV2aWNlW3Njc2lfaWRdID0gcERldjsKKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAocERldi0+bmV4dF9sdW4pIHsKKwkJCQkJCXBEZXYgPSBwRGV2LT5uZXh0X2x1bjsKKwkJCQkJfQorCQkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRwdF9kZXZpY2UpLEdGUF9LRVJORUwpOworCQkJCQlpZihwRGV2ID09IE5VTEwpIHsKKwkJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQl9CisJCQkJfQorCQkJCW1lbXNldChwRGV2LDAsc2l6ZW9mKHN0cnVjdCBhZHB0X2RldmljZSkpOworCQkJCXBEZXYtPnRpZCA9IGQtPmxjdF9kYXRhLnRpZDsKKwkJCQlwRGV2LT5zY3NpX2NoYW5uZWwgPSBidXNfbm87CisJCQkJcERldi0+c2NzaV9pZCA9IHNjc2lfaWQ7CisJCQkJcERldi0+c2NzaV9sdW4gPSBzY3NpX2x1bjsKKwkJCQlwRGV2LT5wSTJvX2RldiA9IGQ7CisJCQkJZC0+b3duZXIgPSBwRGV2OworCQkJCXBEZXYtPnR5cGUgPSAoYnVmWzBdKSYweGZmOworCQkJCXBEZXYtPmZsYWdzID0gKGJ1ZlswXT4+OCkmMHhmZjsKKwkJCQkvLyBUb28gbGF0ZSwgU0NTSSBzeXN0ZW0gaGFzIG1hZGUgdXAgaXQncyBtaW5kLCBidXQgd2hhdCB0aGUgaGV5IC4uLgorCQkJCWlmKHNjc2lfaWQgPiBwSGJhLT50b3Bfc2NzaV9pZCl7CisJCQkJCXBIYmEtPnRvcF9zY3NpX2lkID0gc2NzaV9pZDsKKwkJCQl9CisJCQkJaWYoc2NzaV9sdW4gPiBwSGJhLT50b3Bfc2NzaV9sdW4peworCQkJCQlwSGJhLT50b3Bfc2NzaV9sdW4gPSBzY3NpX2x1bjsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IC8vIGVuZCBvZiBuZXcgaTJvIGRldmljZQorCisJCQkvLyBXZSBmb3VuZCBhbiBvbGQgZGV2aWNlIC0gY2hlY2sgaXQKKwkJCXdoaWxlKHBEZXYpIHsKKwkJCQlpZihwRGV2LT5zY3NpX2x1biA9PSBzY3NpX2x1bikgeworCQkJCQlpZighc2NzaV9kZXZpY2Vfb25saW5lKHBEZXYtPnBTY3NpX2RldikpIHsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFNldHRpbmcgZGV2aWNlICglZCwlZCwlZCkgYmFjayBvbmxpbmVcbiIsCisJCQkJCQkJCXBIYmEtPm5hbWUsYnVzX25vLHNjc2lfaWQsc2NzaV9sdW4pOworCQkJCQkJaWYgKHBEZXYtPnBTY3NpX2RldikgeworCQkJCQkJCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShwRGV2LT5wU2NzaV9kZXYsIFNERVZfUlVOTklORyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZCA9IHBEZXYtPnBJMm9fZGV2OworCQkJCQlpZihkLT5sY3RfZGF0YS50aWQgIT0gdGlkKSB7IC8vIHNvbWV0aGluZyBjaGFuZ2VkCisJCQkJCQlwRGV2LT50aWQgPSB0aWQ7CisJCQkJCQltZW1jcHkoJmQtPmxjdF9kYXRhLCAmbGN0LT5sY3RfZW50cnlbaV0sIHNpemVvZihpMm9fbGN0X2VudHJ5KSk7CisJCQkJCQlpZiAocERldi0+cFNjc2lfZGV2KSB7CisJCQkJCQkJcERldi0+cFNjc2lfZGV2LT5jaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlwRGV2LT5wU2NzaV9kZXYtPnJlbW92YWJsZSA9IFRSVUU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gRm91bmQgaXQgLSBtYXJrIGl0IHNjYW5uZWQKKwkJCQkJcERldi0+c3RhdGUgPSBEUFRJX0RFVl9PTkxJTkU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwRGV2ID0gcERldi0+bmV4dF9sdW47CisJCQl9CisJCX0KKwl9CisJZm9yIChwSTJvX2RldiA9IHBIYmEtPmRldmljZXM7IHBJMm9fZGV2OyBwSTJvX2RldiA9IHBJMm9fZGV2LT5uZXh0KSB7CisJCXBEZXYgPShzdHJ1Y3QgYWRwdF9kZXZpY2UqKSBwSTJvX2Rldi0+b3duZXI7CisJCWlmKCFwRGV2KXsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIERyaXZlIG9mZmxpbmUgZHJpdmVzIHRoYXQgcHJldmlvdXNseSBleGlzdGVkIGJ1dCBjb3VsZCBub3QgYmUgZm91bmQKKwkJLy8gaW4gdGhlIExDVCB0YWJsZQorCQlpZiAocERldi0+c3RhdGUgJiBEUFRJX0RFVl9VTlNDQU5ORUQpeworCQkJcERldi0+c3RhdGUgPSBEUFRJX0RFVl9PRkZMSU5FOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogRGV2aWNlICglZCwlZCwlZCkgb2ZmbGluZVxuIixwSGJhLT5uYW1lLHBEZXYtPnNjc2lfY2hhbm5lbCxwRGV2LT5zY3NpX2lkLHBEZXYtPnNjc2lfbHVuKTsKKwkJCWlmIChwRGV2LT5wU2NzaV9kZXYpIHsKKwkJCQlzY3NpX2RldmljZV9zZXRfc3RhdGUocERldi0+cFNjc2lfZGV2LCBTREVWX09GRkxJTkUpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZHB0X2ZhaWxfcG9zdGVkX3NjYnMoYWRwdF9oYmEqIHBIYmEpCit7CisJc3RydWN0IHNjc2lfY21uZCogCWNtZCA9IE5VTEw7CisJc3RydWN0IHNjc2lfZGV2aWNlKiAJZCA9IE5VTEw7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2UoZCwgcEhiYS0+aG9zdCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmZC0+Y21kX2xpc3QsIGxpc3QpIHsKKwkJCWlmKGNtZC0+c2VyaWFsX251bWJlciA9PSAwKXsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoUVVFVUVfRlVMTCA8PDEpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5saXN0X2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgUm91dGluZXMgZnJvbSBpMm8gc3Vic3lzdGVtCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKKworLyoKKyAqCUJyaW5nIGFuIEkyTyBjb250cm9sbGVyIGludG8gSE9MRCBzdGF0ZS4gU2VlIHRoZSBzcGVjLgorICovCitzdGF0aWMgaW50IGFkcHRfaTJvX2FjdGl2YXRlX2hiYShhZHB0X2hiYSogcEhiYSkKK3sKKwlpbnQgcmNvZGU7CisKKwlpZihwSGJhLT5pbml0aWFsaXplZCApIHsKKwkJaWYgKGFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSkgPCAwKSB7CisJCQlpZigocmNvZGUgPSBhZHB0X2kyb19yZXNldF9oYmEocEhiYSkpICE9IDApeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIE5PVCByZXNldC5cbiIsIHBIYmEtPm5hbWUpOworCQkJCXJldHVybiByY29kZTsKKwkJCX0KKwkJCWlmIChhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIkhCQSBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJCWlmKHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlID09IEFEQVBURVJfU1RBVEVfRkFVTFRFRCkgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGhhcmR3YXJlIGZhdWx0XG4iLCBwSGJhLT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSA9PSBBREFQVEVSX1NUQVRFX1JFQURZIHx8CisJCSAgICBwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSA9PSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMIHx8CisJCSAgICBwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSA9PSBBREFQVEVSX1NUQVRFX0hPTEQgfHwKKwkJICAgIHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlID09IEFEQVBURVJfU1RBVEVfRkFJTEVEKSB7CisJCQlhZHB0X2kyb19yZXNldF9oYmEocEhiYSk7CQkJCisJCQlpZiAoYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKSA8IDAgfHwgcEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRVNFVCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplLlxuIiwgcEhiYS0+bmFtZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYoKHJjb2RlID0gYWRwdF9pMm9fcmVzZXRfaGJhKHBIYmEpKSAhPSAwKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIE5PVCByZXNldC5cbiIsIHBIYmEtPm5hbWUpOworCQkJcmV0dXJuIHJjb2RlOworCQl9CisKKwl9CisKKwlpZiAoYWRwdF9pMm9faW5pdF9vdXRib3VuZF9xKHBIYmEpIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSW4gSE9MRCBzdGF0ZSAqLworCQorCWlmIChhZHB0X2kyb19ocnRfZ2V0KHBIYmEpIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglCcmluZyBhIGNvbnRyb2xsZXIgb25saW5lIGludG8gT1BFUkFUSU9OQUwgc3RhdGUuIAorICovCisgCitzdGF0aWMgaW50IGFkcHRfaTJvX29ubGluZV9oYmEoYWRwdF9oYmEqIHBIYmEpCit7CisJaWYgKGFkcHRfaTJvX3N5c3RhYl9zZW5kKHBIYmEpIDwgMCkgeworCQlhZHB0X2kyb19kZWxldGVfaGJhKHBIYmEpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIEluIFJFQURZIHN0YXRlICovCisKKwlpZiAoYWRwdF9pMm9fZW5hYmxlX2hiYShwSGJhKSA8IDApIHsKKwkJYWRwdF9pMm9fZGVsZXRlX2hiYShwSGJhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluIE9QRVJBVElPTkFMIHN0YXRlICAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIGFkcHRfc2VuZF9ub3AoYWRwdF9oYmEqcEhiYSx1MzIgbSkKK3sKKwl1MzIgX19pb21lbSAqbXNnOworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgNSpIWjsKKworCXdoaWxlKG0gPT0gRU1QVFlfUVVFVUUpeworCQlybWIoKTsKKwkJbSA9IHJlYWRsKHBIYmEtPnBvc3RfcG9ydCk7CisJCWlmKG0gIT0gRU1QVFlfUVVFVUUpeworCQkJYnJlYWs7CisJCX0KKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSBmcmFtZSFcbiIscEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gMjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCW1zZyA9ICh1MzIgX19pb21lbSAqKShwSGJhLT5tc2dfYWRkcl92aXJ0ICsgbSk7CisJd3JpdGVsKCBUSFJFRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCZtc2dbMF0pOworCXdyaXRlbCggSTJPX0NNRF9VVElMX05PUCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgMCwmbXNnWzFdKTsKKwl3cml0ZWwoIDAsJm1zZ1syXSk7CisJd21iKCk7CisKKwl3cml0ZWwobSwgcEhiYS0+cG9zdF9wb3J0KTsKKwl3bWIoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMiBhZHB0X2kyb19pbml0X291dGJvdW5kX3EoYWRwdF9oYmEqIHBIYmEpCit7CisJdTggKnN0YXR1czsKKwl1MzIgX19pb21lbSAqbXNnID0gTlVMTDsKKwlpbnQgaTsKKwl1bG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRNT1VUX0lOSVRPVVRCT1VORCpIWjsKKwl1MzIqIHB0cjsKKwl1MzIgb3V0Ym91bmRfZnJhbWU7ICAvLyBUaGlzIGhhZCB0byBiZSBhIDMyIGJpdCBhZGRyZXNzCisJdTMyIG07CisKKwlkbyB7CisJCXJtYigpOworCQltID0gcmVhZGwocEhiYS0+cG9zdF9wb3J0KTsKKwkJaWYgKG0gIT0gRU1QVFlfUVVFVUUpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSBmcmFtZVxuIixwSGJhLT5uYW1lKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9IHdoaWxlKG0gPT0gRU1QVFlfUVVFVUUpOworCisJbXNnPSh1MzIgX19pb21lbSAqKShwSGJhLT5tc2dfYWRkcl92aXJ0K20pOworCisJc3RhdHVzID0ga21hbGxvYyg0LEdGUF9LRVJORUx8QUREUjMyKTsKKwlpZiAoc3RhdHVzPT1OVUxMKSB7CisJCWFkcHRfc2VuZF9ub3AocEhiYSwgbSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IElPUCByZXNldCBmYWlsZWQgLSBubyBmcmVlIG1lbW9yeS5cbiIsCisJCQlwSGJhLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzdGF0dXMsIDAsIDQpOworCisJd3JpdGVsKEVJR0hUX1dPUkRfTVNHX1NJWkV8IFNHTF9PRkZTRVRfNiwgJm1zZ1swXSk7CisJd3JpdGVsKEkyT19DTURfT1VUQk9VTkRfSU5JVDw8MjQgfCBIT1NUX1RJRDw8MTIgfCBBREFQVEVSX1RJRCwgJm1zZ1sxXSk7CisJd3JpdGVsKDAsICZtc2dbMl0pOworCXdyaXRlbCgweDAxMDYsICZtc2dbM10pOwkvKiBUcmFuc2FjdGlvbiBjb250ZXh0ICovCisJd3JpdGVsKDQwOTYsICZtc2dbNF0pOwkJLyogSG9zdCBwYWdlIGZyYW1lIHNpemUgKi8KKwl3cml0ZWwoKFJFUExZX0ZSQU1FX1NJWkUpPDwxNnwweDgwLCAmbXNnWzVdKTsJLyogT3V0Ym91bmQgbXNnIGZyYW1lIHNpemUgYW5kIEluaXRjb2RlICovCisJd3JpdGVsKDB4RDAwMDAwMDQsICZtc2dbNl0pOwkJLyogU2ltcGxlIFNHIExFLCBFT0IgKi8KKwl3cml0ZWwodmlydF90b19idXMoc3RhdHVzKSwgJm1zZ1s3XSk7CisKKwl3cml0ZWwobSwgcEhiYS0+cG9zdF9wb3J0KTsKKwl3bWIoKTsKKworCS8vIFdhaXQgZm9yIHRoZSByZXBseSBzdGF0dXMgdG8gY29tZSBiYWNrCisJZG8geworCQlpZiAoKnN0YXR1cykgeworCQkJaWYgKCpzdGF0dXMgIT0gMHgwMSAvKkkyT19FWEVDX09VVEJPVU5EX0lOSVRfSU5fUFJPR1JFU1MqLykgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJtYigpOworCQlpZih0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyIlczogVGltZW91dCBJbml0aWFsaXppbmdcbiIscEhiYS0+bmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfSB3aGlsZSAoMSk7CisKKwkvLyBJZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bCwgZmlsbCB0aGUgZmlmbyB3aXRoIG91ciByZXBseQorCS8vIG1lc3NhZ2UgcGFja2V0cworCWlmKCpzdGF0dXMgIT0gMHgwNCAvKkkyT19FWEVDX09VVEJPVU5EX0lOSVRfQ09NUExFVEUqLykgeworCQlrZnJlZSgodm9pZCopc3RhdHVzKTsKKwkJcmV0dXJuIC0yOworCX0KKwlrZnJlZSgodm9pZCopc3RhdHVzKTsKKworCWlmKHBIYmEtPnJlcGx5X3Bvb2wgIT0gTlVMTCl7CisJCWtmcmVlKHBIYmEtPnJlcGx5X3Bvb2wpOworCX0KKworCXBIYmEtPnJlcGx5X3Bvb2wgPSAodTMyKilrbWFsbG9jKHBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSAqIFJFUExZX0ZSQU1FX1NJWkUgKiA0LCBHRlBfS0VSTkVMfEFERFIzMik7CisJaWYoIXBIYmEtPnJlcGx5X3Bvb2wpeworCQlwcmludGsoS0VSTl9FUlIiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBwb29sXG4iLHBIYmEtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChwSGJhLT5yZXBseV9wb29sLCAwICwgcEhiYS0+cmVwbHlfZmlmb19zaXplICogUkVQTFlfRlJBTUVfU0laRSAqIDQpOworCisJcHRyID0gcEhiYS0+cmVwbHlfcG9vbDsKKwlmb3IoaSA9IDA7IGkgPCBwSGJhLT5yZXBseV9maWZvX3NpemU7IGkrKykgeworCQlvdXRib3VuZF9mcmFtZSA9ICh1MzIpdmlydF90b19idXMocHRyKTsKKwkJd3JpdGVsKG91dGJvdW5kX2ZyYW1lLCBwSGJhLT5yZXBseV9wb3J0KTsKKwkJd21iKCk7CisJCXB0ciArPSAgUkVQTFlfRlJBTUVfU0laRTsKKwl9CisJYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogSTJPIFN5c3RlbSBUYWJsZS4gIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CisgKiBhbGwgdGhlIElPUHMgaW4gdGhlIHN5c3RlbS4gIFVzZWQgdG8gaW5mb3JtIElPUHMKKyAqIGFib3V0IGVhY2ggb3RoZXIncyBleGlzdGVuY2UuCisgKgorICogc3lzX3RibF92ZXIgaXMgdGhlIEN1cnJlbnRDaGFuZ2VJbmRpY2F0b3IgdGhhdCBpcworICogdXNlZCBieSBJT1BzIHRvIHRyYWNrIGNoYW5nZXMuCisgKi8KKworCisKK3N0YXRpYyBzMzIgYWRwdF9pMm9fc3RhdHVzX2dldChhZHB0X2hiYSogcEhiYSkKK3sKKwl1bG9uZyB0aW1lb3V0OworCXUzMiBtOworCXUzMiBfX2lvbWVtICptc2c7CisJdTggKnN0YXR1c19ibG9jaz1OVUxMOworCXVsb25nIHN0YXR1c19ibG9ja19idXM7CisKKwlpZihwSGJhLT5zdGF0dXNfYmxvY2sgPT0gTlVMTCkgeworCQlwSGJhLT5zdGF0dXNfYmxvY2sgPSAoaTJvX3N0YXR1c19ibG9jayopCisJCQlrbWFsbG9jKHNpemVvZihpMm9fc3RhdHVzX2Jsb2NrKSxHRlBfS0VSTkVMfEFERFIzMik7CisJCWlmKHBIYmEtPnN0YXR1c19ibG9jayA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSJkcHRpJWQ6IEdldCBTdGF0dXMgQmxvY2sgZmFpbGVkOyBPdXQgb2YgbWVtb3J5LiBcbiIsIAorCQkJcEhiYS0+dW5pdCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwltZW1zZXQocEhiYS0+c3RhdHVzX2Jsb2NrLCAwLCBzaXplb2YoaTJvX3N0YXR1c19ibG9jaykpOworCXN0YXR1c19ibG9jayA9ICh1OCopKHBIYmEtPnN0YXR1c19ibG9jayk7CisJc3RhdHVzX2Jsb2NrX2J1cyA9IHZpcnRfdG9fYnVzKHBIYmEtPnN0YXR1c19ibG9jayk7CisJdGltZW91dCA9IGppZmZpZXMrVE1PVVRfR0VUU1RBVFVTKkhaOworCWRvIHsKKwkJcm1iKCk7CisJCW0gPSByZWFkbChwSGJhLT5wb3N0X3BvcnQpOworCQlpZiAobSAhPSBFTVBUWV9RVUVVRSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYodGltZV9hZnRlcihqaWZmaWVzLHRpbWVvdXQpKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSAhXG4iLAorCQkJCQlwSGJhLT5uYW1lKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9IHdoaWxlKG09PUVNUFRZX1FVRVVFKTsKKworCQorCW1zZz0odTMyIF9faW9tZW0gKikocEhiYS0+bXNnX2FkZHJfdmlydCttKTsKKworCXdyaXRlbChOSU5FX1dPUkRfTVNHX1NJWkV8U0dMX09GRlNFVF8wLCAmbXNnWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TVEFUVVNfR0VUPDwyNHxIT1NUX1RJRDw8MTJ8QURBUFRFUl9USUQsICZtc2dbMV0pOworCXdyaXRlbCgxLCAmbXNnWzJdKTsKKwl3cml0ZWwoMCwgJm1zZ1szXSk7CisJd3JpdGVsKDAsICZtc2dbNF0pOworCXdyaXRlbCgwLCAmbXNnWzVdKTsKKwl3cml0ZWwoKCh1MzIpc3RhdHVzX2Jsb2NrX2J1cykmMHhmZmZmZmZmZiwgJm1zZ1s2XSk7CisJd3JpdGVsKDAsICZtc2dbN10pOworCXdyaXRlbChzaXplb2YoaTJvX3N0YXR1c19ibG9jayksICZtc2dbOF0pOyAvLyA4OCBieXRlcworCisJLy9wb3N0IG1lc3NhZ2UKKwl3cml0ZWwobSwgcEhiYS0+cG9zdF9wb3J0KTsKKwl3bWIoKTsKKworCXdoaWxlKHN0YXR1c19ibG9ja1s4N10hPTB4ZmYpeworCQlpZih0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpeworCQkJcHJpbnRrKEtFUk5fRVJSImRwdGklZDogR2V0IHN0YXR1cyB0aW1lb3V0LlxuIiwKKwkJCQlwSGJhLT51bml0KTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXJtYigpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJLy8gU2V0IHVwIG91ciBudW1iZXIgb2Ygb3V0Ym91bmQgYW5kIGluYm91bmQgbWVzc2FnZXMKKwlwSGJhLT5wb3N0X2ZpZm9fc2l6ZSA9IHBIYmEtPnN0YXR1c19ibG9jay0+bWF4X2luYm91bmRfZnJhbWVzOworCWlmIChwSGJhLT5wb3N0X2ZpZm9fc2l6ZSA+IE1BWF9UT19JT1BfTUVTU0FHRVMpIHsKKwkJcEhiYS0+cG9zdF9maWZvX3NpemUgPSBNQVhfVE9fSU9QX01FU1NBR0VTOworCX0KKworCXBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSA9IHBIYmEtPnN0YXR1c19ibG9jay0+bWF4X291dGJvdW5kX2ZyYW1lczsKKwlpZiAocEhiYS0+cmVwbHlfZmlmb19zaXplID4gTUFYX0ZST01fSU9QX01FU1NBR0VTKSB7CisJCXBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSA9IE1BWF9GUk9NX0lPUF9NRVNTQUdFUzsKKwl9CisKKwkvLyBDYWxjdWxhdGUgdGhlIFNjYXR0ZXIgR2F0aGVyIGxpc3Qgc2l6ZQorCXBIYmEtPnNnX3RhYmxlc2l6ZSA9IChwSGJhLT5zdGF0dXNfYmxvY2stPmluYm91bmRfZnJhbWVfc2l6ZSAqIDQgLTQwKS8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CisJaWYgKHBIYmEtPnNnX3RhYmxlc2l6ZSA+IFNHX0xJU1RfRUxFTUVOVFMpIHsKKwkJcEhiYS0+c2dfdGFibGVzaXplID0gU0dfTElTVF9FTEVNRU5UUzsKKwl9CisKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJkcHRpJWQ6IFN0YXRlID0gIixwSGJhLT51bml0KTsKKwlzd2l0Y2gocEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUpIHsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKCJJTklUXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CisJCQlwcmludGsoIlJFU0VUXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoIkhPTERcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNToKKwkJCXByaW50aygiUkVBRFlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwODoKKwkJCXByaW50aygiT1BFUkFUSU9OQUxcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMDoKKwkJCXByaW50aygiRkFJTEVEXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MTE6CisJCQlwcmludGsoIkZBVUxURURcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiV4ICh1bmtub3duISEpXG4iLHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCB0aGUgSU9QJ3MgTG9naWNhbCBDb25maWd1cmF0aW9uIFRhYmxlCisgKi8KK3N0YXRpYyBpbnQgYWRwdF9pMm9fbGN0X2dldChhZHB0X2hiYSogcEhiYSkKK3sKKwl1MzIgbXNnWzhdOworCWludCByZXQ7CisJdTMyIGJ1ZlsxNl07CisKKwlpZiAoKHBIYmEtPmxjdF9zaXplID09IDApIHx8IChwSGJhLT5sY3QgPT0gTlVMTCkpeworCQlwSGJhLT5sY3Rfc2l6ZSA9IHBIYmEtPnN0YXR1c19ibG9jay0+ZXhwZWN0ZWRfbGN0X3NpemU7CisJfQorCWRvIHsKKwkJaWYgKHBIYmEtPmxjdCA9PSBOVUxMKSB7CisJCQlwSGJhLT5sY3QgPSBrbWFsbG9jKHBIYmEtPmxjdF9zaXplLCBHRlBfS0VSTkVMfEFERFIzMik7CisJCQlpZihwSGJhLT5sY3QgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBMY3QgR2V0IGZhaWxlZC4gT3V0IG9mIG1lbW9yeS5cbiIsCisJCQkJCXBIYmEtPm5hbWUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisJCW1lbXNldChwSGJhLT5sY3QsIDAsIHBIYmEtPmxjdF9zaXplKTsKKworCQltc2dbMF0gPSBFSUdIVF9XT1JEX01TR19TSVpFfFNHTF9PRkZTRVRfNjsKKwkJbXNnWzFdID0gSTJPX0NNRF9MQ1RfTk9USUZZPDwyNCB8IEhPU1RfVElEPDwxMiB8IEFEQVBURVJfVElEOworCQltc2dbMl0gPSAwOworCQltc2dbM10gPSAwOworCQltc2dbNF0gPSAweEZGRkZGRkZGOwkvKiBBbGwgZGV2aWNlcyAqLworCQltc2dbNV0gPSAweDAwMDAwMDAwOwkvKiBSZXBvcnQgbm93ICovCisJCW1zZ1s2XSA9IDB4RDAwMDAwMDB8cEhiYS0+bGN0X3NpemU7CisJCW1zZ1s3XSA9IHZpcnRfdG9fYnVzKHBIYmEtPmxjdCk7CisKKwkJaWYgKChyZXQ9YWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgc2l6ZW9mKG1zZyksIDM2MCkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMQ1QgR2V0IGZhaWxlZCAoc3RhdHVzPSUjMTB4LlxuIiwgCisJCQkJcEhiYS0+bmFtZSwgcmV0KTsJCisJCQlwcmludGsoS0VSTl9FUlIiQWRhcHRlYzogRXJyb3IgUmVhZGluZyBIYXJkd2FyZS5cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmICgocEhiYS0+bGN0LT50YWJsZV9zaXplIDw8IDIpID4gcEhiYS0+bGN0X3NpemUpIHsKKwkJCXBIYmEtPmxjdF9zaXplID0gcEhiYS0+bGN0LT50YWJsZV9zaXplIDw8IDI7CisJCQlrZnJlZShwSGJhLT5sY3QpOworCQkJcEhiYS0+bGN0ID0gTlVMTDsKKwkJfQorCX0gd2hpbGUgKHBIYmEtPmxjdCA9PSBOVUxMKTsKKworCVBERUJVRygiJXM6IEhhcmR3YXJlIHJlc291cmNlIHRhYmxlIHJlYWQuXG4iLCBwSGJhLT5uYW1lKTsKKworCisJLy8gSTJPX0RQVF9FWEVDX0lPUF9CVUZGRVJTX0dST1VQX05POworCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCAwICwgMHg4MDAwLCAtMSwgYnVmLCBzaXplb2YoYnVmKSk+PTApIHsKKwkJcEhiYS0+RndEZWJ1Z0J1ZmZlclNpemUgPSBidWZbMV07CisJCXBIYmEtPkZ3RGVidWdCdWZmZXJfUCAgICA9IHBIYmEtPmJhc2VfYWRkcl92aXJ0ICsgYnVmWzBdOworCQlwSGJhLT5Gd0RlYnVnRmxhZ3NfUCAgICAgPSBwSGJhLT5Gd0RlYnVnQnVmZmVyX1AgKyBGV19ERUJVR19GTEFHU19PRkZTRVQ7CisJCXBIYmEtPkZ3RGVidWdCTEVEdmFsdWVfUCA9IHBIYmEtPkZ3RGVidWdCdWZmZXJfUCArIEZXX0RFQlVHX0JMRURfT0ZGU0VUOworCQlwSGJhLT5Gd0RlYnVnQkxFRGZsYWdfUCAgPSBwSGJhLT5Gd0RlYnVnQkxFRHZhbHVlX1AgKyAxOworCQlwSGJhLT5Gd0RlYnVnU3RyTGVuZ3RoX1AgPSBwSGJhLT5Gd0RlYnVnQnVmZmVyX1AgKyBGV19ERUJVR19TVFJfTEVOR1RIX09GRlNFVDsKKwkJcEhiYS0+RndEZWJ1Z0J1ZmZlcl9QICs9IGJ1ZlsyXTsgCisJCXBIYmEtPkZ3RGVidWdGbGFncyA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRwdF9pMm9fYnVpbGRfc3lzX3RhYmxlKHZvaWQpCit7CisJYWRwdF9oYmEqIHBIYmEgPSBOVUxMOworCWludCBjb3VudCA9IDA7CisKKwlzeXNfdGJsX2xlbiA9IHNpemVvZihzdHJ1Y3QgaTJvX3N5c190YmwpICsJLy8gSGVhZGVyICsgSU9QcworCQkJCShoYmFfY291bnQpICogc2l6ZW9mKHN0cnVjdCBpMm9fc3lzX3RibF9lbnRyeSk7CisKKwlpZihzeXNfdGJsKQorCQlrZnJlZShzeXNfdGJsKTsKKworCXN5c190YmwgPSBrbWFsbG9jKHN5c190YmxfbGVuLCBHRlBfS0VSTkVMfEFERFIzMik7CisJaWYoIXN5c190YmwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3lzVGFiIFNldCBmYWlsZWQuIE91dCBvZiBtZW1vcnkuXG4iKTsJCisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc3lzX3RibCwgMCwgc3lzX3RibF9sZW4pOworCisJc3lzX3RibC0+bnVtX2VudHJpZXMgPSBoYmFfY291bnQ7CisJc3lzX3RibC0+dmVyc2lvbiA9IEkyT1ZFUlNJT047CisJc3lzX3RibC0+Y2hhbmdlX2luZCA9IHN5c190YmxfaW5kKys7CisKKwlmb3IocEhiYSA9IGhiYV9jaGFpbjsgcEhiYTsgcEhiYSA9IHBIYmEtPm5leHQpIHsKKwkJLy8gR2V0IHVwZGF0ZWQgU3RhdHVzIEJsb2NrIHNvIHdlIGhhdmUgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbgorCQlpZiAoYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKSkgeworCQkJc3lzX3RibC0+bnVtX2VudHJpZXMtLTsKKwkJCWNvbnRpbnVlOyAvLyB0cnkgbmV4dCBvbmUJCisJCX0KKworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5vcmdfaWQgPSBwSGJhLT5zdGF0dXNfYmxvY2stPm9yZ19pZDsKKwkJc3lzX3RibC0+aW9wc1tjb3VudF0uaW9wX2lkID0gcEhiYS0+dW5pdCArIDI7CisJCXN5c190YmwtPmlvcHNbY291bnRdLnNlZ19udW0gPSAwOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5pMm9fdmVyc2lvbiA9IHBIYmEtPnN0YXR1c19ibG9jay0+aTJvX3ZlcnNpb247CisJCXN5c190YmwtPmlvcHNbY291bnRdLmlvcF9zdGF0ZSA9IHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5tc2dfdHlwZSA9IHBIYmEtPnN0YXR1c19ibG9jay0+bXNnX3R5cGU7CisJCXN5c190YmwtPmlvcHNbY291bnRdLmZyYW1lX3NpemUgPSBwSGJhLT5zdGF0dXNfYmxvY2stPmluYm91bmRfZnJhbWVfc2l6ZTsKKwkJc3lzX3RibC0+aW9wc1tjb3VudF0ubGFzdF9jaGFuZ2VkID0gc3lzX3RibF9pbmQgLSAxOyAvLyA/PworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5pb3BfY2FwYWJpbGl0aWVzID0gcEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3BfY2FwYWJpbGl0aWVzOworCQlzeXNfdGJsLT5pb3BzW2NvdW50XS5pbmJvdW5kX2xvdyA9ICh1MzIpdmlydF90b19idXMoKHZvaWQqKXBIYmEtPnBvc3RfcG9ydCk7CisJCXN5c190YmwtPmlvcHNbY291bnRdLmluYm91bmRfaGlnaCA9ICh1MzIpKCh1NjQpdmlydF90b19idXMoKHZvaWQqKXBIYmEtPnBvc3RfcG9ydCk+PjMyKTsKKworCQljb3VudCsrOworCX0KKworI2lmZGVmIERFQlVHCit7CisJdTMyICp0YWJsZSA9ICh1MzIqKXN5c190Ymw7CisJcHJpbnRrKEtFUk5fREVCVUcic3lzX3RibF9sZW49JWQgaW4gMzJiaXQgd29yZHNcbiIsKHN5c190YmxfbGVuID4+MikpOworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgKHN5c190YmxfbGVuID4+Mik7IGNvdW50KyspIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3lzX3RibFslZF0gPSAlMCMxMHhcbiIsIAorCQkJY291bnQsIHRhYmxlW2NvdW50XSk7CisJfQorfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJIER1bXAgdGhlIGluZm9ybWF0aW9uIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHVuaXQgKFRJRCkKKyAqLworIAorc3RhdGljIHZvaWQgYWRwdF9pMm9fcmVwb3J0X2hiYV91bml0KGFkcHRfaGJhKiBwSGJhLCBzdHJ1Y3QgaTJvX2RldmljZSAqZCkKK3sKKwljaGFyIGJ1Zls2NF07CisJaW50IHVuaXQgPSBkLT5sY3RfZGF0YS50aWQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJUSUQgJTMuM2QgIiwgdW5pdCk7CisKKwlpZihhZHB0X2kyb19xdWVyeV9zY2FsYXIocEhiYSwgdW5pdCwgMHhGMTAwLCAzLCBidWYsIDE2KT49MCkKKwl7CisJCWJ1ZlsxNl09MDsKKwkJcHJpbnRrKCIgVmVuZG9yOiAlLTEyLjEycyIsIGJ1Zik7CisJfQorCWlmKGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihwSGJhLCB1bml0LCAweEYxMDAsIDQsIGJ1ZiwgMTYpPj0wKQorCXsKKwkJYnVmWzE2XT0wOworCQlwcmludGsoIiBEZXZpY2U6ICUtMTIuMTJzIiwgYnVmKTsKKwl9CisJaWYoYWRwdF9pMm9fcXVlcnlfc2NhbGFyKHBIYmEsIHVuaXQsIDB4RjEwMCwgNiwgYnVmLCA4KT49MCkKKwl7CisJCWJ1Zls4XT0wOworCQlwcmludGsoIiBSZXY6ICUtMTIuMTJzXG4iLCBidWYpOworCX0KKyNpZmRlZiBERUJVRworCSBwcmludGsoS0VSTl9JTkZPICJcdENsYXNzOiAlLjIxc1xuIiwgYWRwdF9pMm9fZ2V0X2NsYXNzX25hbWUoZC0+bGN0X2RhdGEuY2xhc3NfaWQpKTsKKwkgcHJpbnRrKEtFUk5fSU5GTyAiXHRTdWJjbGFzczogMHglMDRYXG4iLCBkLT5sY3RfZGF0YS5zdWJfY2xhc3MpOworCSBwcmludGsoS0VSTl9JTkZPICJcdEZsYWdzOiAiKTsKKworCSBpZihkLT5sY3RfZGF0YS5kZXZpY2VfZmxhZ3MmKDE8PDApKQorCQkgIHByaW50aygiQyIpOwkgICAgIC8vIENvbmZpZ0RpYWxvZyByZXF1ZXN0ZWQKKwkgaWYoZC0+bGN0X2RhdGEuZGV2aWNlX2ZsYWdzJigxPDwxKSkKKwkJICBwcmludGsoIlUiKTsJICAgICAvLyBNdWx0aS11c2VyIGNhcGFibGUKKwkgaWYoIShkLT5sY3RfZGF0YS5kZXZpY2VfZmxhZ3MmKDE8PDQpKSkKKwkJICBwcmludGsoIlAiKTsJICAgICAvLyBQZWVyIHNlcnZpY2UgZW5hYmxlZCEKKwkgaWYoIShkLT5sY3RfZGF0YS5kZXZpY2VfZmxhZ3MmKDE8PDUpKSkKKwkJICBwcmludGsoIk0iKTsJICAgICAvLyBNZ210IHNlcnZpY2UgZW5hYmxlZCEKKwkgcHJpbnRrKCJcbiIpOworI2VuZGlmCit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqCURvIGkybyBjbGFzcyBuYW1lIGxvb2t1cAorICovCitzdGF0aWMgY29uc3QgY2hhciAqYWRwdF9pMm9fZ2V0X2NsYXNzX25hbWUoaW50IGNsYXNzKQoreworCWludCBpZHggPSAxNjsKKwlzdGF0aWMgY2hhciAqaTJvX2NsYXNzX25hbWVbXSA9IHsKKwkJIkV4ZWN1dGl2ZSIsCisJCSJEZXZpY2UgRHJpdmVyIE1vZHVsZSIsCisJCSJCbG9jayBEZXZpY2UiLAorCQkiVGFwZSBEZXZpY2UiLAorCQkiTEFOIEludGVyZmFjZSIsCisJCSJXQU4gSW50ZXJmYWNlIiwKKwkJIkZpYnJlIENoYW5uZWwgUG9ydCIsCisJCSJGaWJyZSBDaGFubmVsIERldmljZSIsCisJCSJTQ1NJIERldmljZSIsCisJCSJBVEUgUG9ydCIsCisJCSJBVEUgRGV2aWNlIiwKKwkJIkZsb3BweSBDb250cm9sbGVyIiwKKwkJIkZsb3BweSBEZXZpY2UiLAorCQkiU2Vjb25kYXJ5IEJ1cyBQb3J0IiwKKwkJIlBlZXIgVHJhbnNwb3J0IEFnZW50IiwKKwkJIlBlZXIgVHJhbnNwb3J0IiwKKwkJIlVua25vd24iCisJfTsKKwkKKwlzd2l0Y2goY2xhc3MmMHhGRkYpIHsKKwljYXNlIEkyT19DTEFTU19FWEVDVVRJVkU6CisJCWlkeCA9IDA7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0RETToKKwkJaWR4ID0gMTsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0U6CisJCWlkeCA9IDI7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX1NFUVVFTlRJQUxfU1RPUkFHRToKKwkJaWR4ID0gMzsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfTEFOOgorCQlpZHggPSA0OyBicmVhazsKKwljYXNlIEkyT19DTEFTU19XQU46CisJCWlkeCA9IDU7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUE9SVDoKKwkJaWR4ID0gNjsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfRklCUkVfQ0hBTk5FTF9QRVJJUEhFUkFMOgorCQlpZHggPSA3OyBicmVhazsKKwljYXNlIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUw6CisJCWlkeCA9IDg7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0FURV9QT1JUOgorCQlpZHggPSA5OyBicmVhazsKKwljYXNlIEkyT19DTEFTU19BVEVfUEVSSVBIRVJBTDoKKwkJaWR4ID0gMTA7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZMT1BQWV9DT05UUk9MTEVSOgorCQlpZHggPSAxMTsgYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfRkxPUFBZX0RFVklDRToKKwkJaWR4ID0gMTI7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQ6CisJCWlkeCA9IDEzOyBicmVhazsKKwljYXNlIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVF9BR0VOVDoKKwkJaWR4ID0gMTQ7IGJyZWFrOworCWNhc2UgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUOgorCQlpZHggPSAxNTsgYnJlYWs7CisJfQorCXJldHVybiBpMm9fY2xhc3NfbmFtZVtpZHhdOworfQorI2VuZGlmCisKKworc3RhdGljIHMzMiBhZHB0X2kyb19ocnRfZ2V0KGFkcHRfaGJhKiBwSGJhKQoreworCXUzMiBtc2dbNl07CisJaW50IHJldCwgc2l6ZSA9IHNpemVvZihpMm9faHJ0KTsKKworCWRvIHsKKwkJaWYgKHBIYmEtPmhydCA9PSBOVUxMKSB7CisJCQlwSGJhLT5ocnQ9a21hbGxvYyhzaXplLCBHRlBfS0VSTkVMfEFERFIzMik7CisJCQlpZiAocEhiYS0+aHJ0ID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9DUklUICIlczogSHJ0IEdldCBmYWlsZWQ7IE91dCBvZiBtZW1vcnkuXG4iLCBwSGJhLT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCisJCW1zZ1swXT0gU0lYX1dPUkRfTVNHX1NJWkV8IFNHTF9PRkZTRVRfNDsKKwkJbXNnWzFdPSBJMk9fQ01EX0hSVF9HRVQ8PDI0IHwgSE9TVF9USUQ8PDEyIHwgQURBUFRFUl9USUQ7CisJCW1zZ1syXT0gMDsKKwkJbXNnWzNdPSAwOworCQltc2dbNF09ICgweEQwMDAwMDAwIHwgc2l6ZSk7ICAgIC8qIFNpbXBsZSB0cmFuc2FjdGlvbiAqLworCQltc2dbNV09IHZpcnRfdG9fYnVzKHBIYmEtPmhydCk7ICAgLyogRHVtcCBpdCBoZXJlICovCisKKwkJaWYgKChyZXQgPSBhZHB0X2kyb19wb3N0X3dhaXQocEhiYSwgbXNnLCBzaXplb2YobXNnKSwyMCkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IEhSVCAoc3RhdHVzPSUjMTB4KVxuIiwgcEhiYS0+bmFtZSwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAocEhiYS0+aHJ0LT5udW1fZW50cmllcyAqIHBIYmEtPmhydC0+ZW50cnlfbGVuIDw8IDIgPiBzaXplKSB7CisJCQlzaXplID0gcEhiYS0+aHJ0LT5udW1fZW50cmllcyAqIHBIYmEtPmhydC0+ZW50cnlfbGVuIDw8IDI7CisJCQlrZnJlZShwSGJhLT5ocnQpOworCQkJcEhiYS0+aHJ0ID0gTlVMTDsKKwkJfQorCX0gd2hpbGUocEhiYS0+aHJ0ID09IE5VTEwpOworCXJldHVybiAwOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKgorICoJIFF1ZXJ5IG9uZSBzY2FsYXIgZ3JvdXAgdmFsdWUgb3IgYSB3aG9sZSBzY2FsYXIgZ3JvdXAuCisgKi8JCSAgICAJCitzdGF0aWMgaW50IGFkcHRfaTJvX3F1ZXJ5X3NjYWxhcihhZHB0X2hiYSogcEhiYSwgaW50IHRpZCwgCisJCQlpbnQgZ3JvdXAsIGludCBmaWVsZCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQoreworCXUxNiBvcGJsa1tdID0geyAxLCAwLCBJMk9fUEFSQU1TX0ZJRUxEX0dFVCwgZ3JvdXAsIDEsIGZpZWxkIH07CisJdTggKnJlc2JsazsKKworCWludCBzaXplOworCisJLyogOCBieXRlcyBmb3IgaGVhZGVyICovCisJcmVzYmxrID0ga21hbGxvYyhzaXplb2YodTgpICogKDgrYnVmbGVuKSwgR0ZQX0tFUk5FTHxBRERSMzIpOworCWlmIChyZXNibGsgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9DUklUICIlczogcXVlcnkgc2NhbGFyIGZhaWxlZDsgT3V0IG9mIG1lbW9yeS5cbiIsIHBIYmEtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZmllbGQgPT0gLTEpICAJCS8qIHdob2xlIGdyb3VwICovCisJCQlvcGJsa1s0XSA9IC0xOworCisJc2l6ZSA9IGFkcHRfaTJvX2lzc3VlX3BhcmFtcyhJMk9fQ01EX1VUSUxfUEFSQU1TX0dFVCwgcEhiYSwgdGlkLCAKKwkJb3BibGssIHNpemVvZihvcGJsayksIHJlc2Jsaywgc2l6ZW9mKHU4KSooOCtidWZsZW4pKTsKKwlpZiAoc2l6ZSA9PSAtRVRJTUUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlzc3VlIHBhcmFtcyBmYWlsZWQ7IFRpbWVkIG91dC5cbiIsIHBIYmEtPm5hbWUpOworCQlyZXR1cm4gLUVUSU1FOworCX0gZWxzZSBpZiAoc2l6ZSA9PSAtRUlOVFIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlzc3VlIHBhcmFtcyBmYWlsZWQ7IEludGVycnVwdGVkLlxuIiwgcEhiYS0+bmFtZSk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCQkJCisJbWVtY3B5KGJ1ZiwgcmVzYmxrKzgsIGJ1Zmxlbik7ICAvKiBjdXQgb2ZmIGhlYWRlciAqLworCisJa2ZyZWUocmVzYmxrKTsKKwlpZiAoc2l6ZSA8IDApCisJCXJldHVybiBzaXplOwkKKworCXJldHVybiBidWZsZW47Cit9CisKKworLyoJSXNzdWUgVVRJTF9QQVJBTVNfR0VUIG9yIFVUSUxfUEFSQU1TX1NFVAorICoKKyAqCVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBVdGlsUGFyYW1zR2V0L1NldCBvcGVyYXRpb25zLgorICoJVGhlIE9wZXJhdGlvbkJsb2NrIGlzIGdpdmVuIGluIG9wYmxrLWJ1ZmZlciwgCisgKglhbmQgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gcmVzYmxrLWJ1ZmZlci4KKyAqCU5vdGUgdGhhdCB0aGUgbWluaW11bSBzaXplZCByZXNibGsgaXMgOCBieXRlcyBhbmQgY29udGFpbnMKKyAqCVJlc3VsdENvdW50LCBFcnJvckluZm9TaXplLCBCbG9ja1N0YXR1cyBhbmQgQmxvY2tTaXplLgorICovCitzdGF0aWMgaW50IGFkcHRfaTJvX2lzc3VlX3BhcmFtcyhpbnQgY21kLCBhZHB0X2hiYSogcEhiYSwgaW50IHRpZCwgCisJCSAgdm9pZCAqb3BibGssIGludCBvcGxlbiwgdm9pZCAqcmVzYmxrLCBpbnQgcmVzbGVuKQoreworCXUzMiBtc2dbOV07IAorCXUzMiAqcmVzID0gKHUzMiAqKXJlc2JsazsKKwlpbnQgd2FpdF9zdGF0dXM7CisKKwltc2dbMF0gPSBOSU5FX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzU7CisJbXNnWzFdID0gY21kIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQ7IAorCW1zZ1syXSA9IDA7CisJbXNnWzNdID0gMDsKKwltc2dbNF0gPSAwOworCW1zZ1s1XSA9IDB4NTQwMDAwMDAgfCBvcGxlbjsJLyogT3BlcmF0aW9uQmxvY2sgKi8KKwltc2dbNl0gPSB2aXJ0X3RvX2J1cyhvcGJsayk7CisJbXNnWzddID0gMHhEMDAwMDAwMCB8IHJlc2xlbjsJLyogUmVzdWx0QmxvY2sgKi8KKwltc2dbOF0gPSB2aXJ0X3RvX2J1cyhyZXNibGspOworCisJaWYgKCh3YWl0X3N0YXR1cyA9IGFkcHRfaTJvX3Bvc3Rfd2FpdChwSGJhLCBtc2csIHNpemVvZihtc2cpLCAyMCkpKSB7CisJCXByaW50aygiYWRwdF9pMm9faXNzdWVfcGFyYW1zOiBwb3N0X3dhaXQgZmFpbGVkICglcClcbiIsIHJlc2Jsayk7CisgICAJCXJldHVybiB3YWl0X3N0YXR1czsgCS8qIC1EZXRhaWxlZFN0YXR1cyAqLworCX0KKworCWlmIChyZXNbMV0mMHgwMEZGMDAwMCkgeyAJLyogQmxvY2tTdGF0dXMgIT0gU1VDQ0VTUyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgLSBFcnJvcjpcbiAgRXJyb3JJbmZvU2l6ZSA9IDB4JTAyeCwgIgorCQkJIkJsb2NrU3RhdHVzID0gMHglMDJ4LCBCbG9ja1NpemUgPSAweCUwNHhcbiIsCisJCQlwSGJhLT5uYW1lLAorCQkJKGNtZCA9PSBJMk9fQ01EX1VUSUxfUEFSQU1TX1NFVCkgPyAiUEFSQU1TX1NFVCIKKwkJCQkJCQkgOiAiUEFSQU1TX0dFVCIsICAgCisJCQlyZXNbMV0+PjI0LCAocmVzWzFdPj4xNikmMHhGRiwgcmVzWzFdJjB4RkZGRik7CisJCXJldHVybiAtKChyZXNbMV0gPj4gMTYpICYgMHhGRik7IC8qIC1CbG9ja1N0YXR1cyAqLworCX0KKworCSByZXR1cm4gNCArICgocmVzWzFdICYgMHgwMDAwRkZGRikgPDwgMik7IC8qIGJ5dGVzIHVzZWQgaW4gcmVzYmxrICovIAorfQorCisKK3N0YXRpYyBzMzIgYWRwdF9pMm9fcXVpZXNjZV9oYmEoYWRwdF9oYmEqIHBIYmEpCit7CisJdTMyIG1zZ1s0XTsKKwlpbnQgcmV0OworCisJYWRwdF9pMm9fc3RhdHVzX2dldChwSGJhKTsKKworCS8qIFN5c1F1aWVzY2UgZGlzY2FyZGVkIGlmIElPUCBub3QgaW4gUkVBRFkgb3IgT1BFUkFUSU9OQUwgc3RhdGUgKi8KKworCWlmKChwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX1JFQURZKSAmJgorICAgCSAgIChwSGJhLT5zdGF0dXNfYmxvY2stPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMKSl7CisJCXJldHVybiAwOworCX0KKworCW1zZ1swXSA9IEZPVVJfV09SRF9NU0dfU0laRXxTR0xfT0ZGU0VUXzA7CisJbXNnWzFdID0gSTJPX0NNRF9TWVNfUVVJRVNDRTw8MjR8SE9TVF9USUQ8PDEyfEFEQVBURVJfVElEOworCW1zZ1syXSA9IDA7CisJbXNnWzNdID0gMDsKKworCWlmKChyZXQgPSBhZHB0X2kyb19wb3N0X3dhaXQocEhiYSwgbXNnLCBzaXplb2YobXNnKSwgMjQwKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyJkcHRpJWQ6IFVuYWJsZSB0byBxdWllc2NlIChzdGF0dXM9JSN4KS5cbiIsCisJCQkJcEhiYS0+dW5pdCwgLXJldCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyJkcHRpJWQ6IFF1aWVzY2VkLlxuIixwSGJhLT51bml0KTsKKwl9CisKKwlhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpOworCXJldHVybiByZXQ7Cit9CisKKworLyogCisgKiBFbmFibGUgSU9QLiBBbGxvd3MgdGhlIElPUCB0byByZXN1bWUgZXh0ZXJuYWwgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBhZHB0X2kyb19lbmFibGVfaGJhKGFkcHRfaGJhKiBwSGJhKQoreworCXUzMiBtc2dbNF07CisJaW50IHJldDsKKwkKKwlhZHB0X2kyb19zdGF0dXNfZ2V0KHBIYmEpOworCWlmKCFwSGJhLT5zdGF0dXNfYmxvY2speworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogRW5hYmxlIG9ubHkgYWxsb3dlZCBvbiBSRUFEWSBzdGF0ZSAqLworCWlmKHBIYmEtPnN0YXR1c19ibG9jay0+aW9wX3N0YXRlID09IEFEQVBURVJfU1RBVEVfT1BFUkFUSU9OQUwpCisJCXJldHVybiAwOworCisJaWYocEhiYS0+c3RhdHVzX2Jsb2NrLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRUFEWSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2dbMF09Rk9VUl9XT1JEX01TR19TSVpFfFNHTF9PRkZTRVRfMDsKKwltc2dbMV09STJPX0NNRF9TWVNfRU5BQkxFPDwyNHxIT1NUX1RJRDw8MTJ8QURBUFRFUl9USUQ7CisJbXNnWzJdPSAwOworCW1zZ1szXT0gMDsKKworCWlmICgocmV0ID0gYWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgc2l6ZW9mKG1zZyksIDI0MCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IENvdWxkIG5vdCBlbmFibGUgKHN0YXR1cz0lIzEweCkuXG4iLCAKKwkJCXBIYmEtPm5hbWUsIHJldCk7CisJfSBlbHNlIHsKKwkJUERFQlVHKCIlczogRW5hYmxlZC5cbiIsIHBIYmEtPm5hbWUpOworCX0KKworCWFkcHRfaTJvX3N0YXR1c19nZXQocEhiYSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGFkcHRfaTJvX3N5c3RhYl9zZW5kKGFkcHRfaGJhKiBwSGJhKQoreworCSB1MzIgbXNnWzEyXTsKKwkgaW50IHJldDsKKworCW1zZ1swXSA9IEkyT19NRVNTQUdFX1NJWkUoMTIpIHwgU0dMX09GRlNFVF82OworCW1zZ1sxXSA9IEkyT19DTURfU1lTX1RBQl9TRVQ8PDI0IHwgSE9TVF9USUQ8PDEyIHwgQURBUFRFUl9USUQ7CisJbXNnWzJdID0gMDsKKwltc2dbM10gPSAwOworCW1zZ1s0XSA9ICgwPDwxNikgfCAoKHBIYmEtPnVuaXQrMikgPDwgMTIpOyAvKiBIb3N0IDAgSU9QIElEICh1bml0ICsgMikgKi8KKwltc2dbNV0gPSAwOwkJCQkgICAvKiBTZWdtZW50IDAgKi8KKworCS8qIAorCSAqIFByb3ZpZGUgdGhyZWUgU0dMLWVsZW1lbnRzOgorCSAqIFN5c3RlbSB0YWJsZSAoU3lzVGFiKSwgUHJpdmF0ZSBtZW1vcnkgc3BhY2UgZGVjbGFyYXRpb24gYW5kIAorCSAqIFByaXZhdGUgaS9vIHNwYWNlIGRlY2xhcmF0aW9uICAKKwkgKi8KKwltc2dbNl0gPSAweDU0MDAwMDAwIHwgc3lzX3RibF9sZW47CisJbXNnWzddID0gdmlydF90b19waHlzKHN5c190YmwpOworCW1zZ1s4XSA9IDB4NTQwMDAwMDAgfCAwOworCW1zZ1s5XSA9IDA7CisJbXNnWzEwXSA9IDB4RDQwMDAwMDAgfCAwOworCW1zZ1sxMV0gPSAwOworCisJaWYgKChyZXQ9YWRwdF9pMm9fcG9zdF93YWl0KHBIYmEsIG1zZywgc2l6ZW9mKG1zZyksIDEyMCkpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gc2V0IFN5c1RhYiAoc3RhdHVzPSUjMTB4KS5cbiIsIAorCQkJcEhiYS0+bmFtZSwgcmV0KTsKKwl9CisjaWZkZWYgREVCVUcKKwllbHNlIHsKKwkJUElORk8oIiVzOiBTeXNUYWIgc2V0LlxuIiwgcEhiYS0+bmFtZSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OwkKKyB9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworCisjaWZkZWYgVUFSVERFTEFZIAorCitzdGF0aWMgc3RhdGljIHZvaWQgYWRwdF9kZWxheShpbnQgbWlsbGlzZWMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG1pbGxpc2VjOyBpKyspIHsKKwkJdWRlbGF5KDEwMDApOwkvKiBkZWxheSBmb3Igb25lIG1pbGxpc2Vjb25kICovCisJfQorfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSAiZHB0X2kybyIsCisJLnByb2NfbmFtZQkJPSAiZHB0X2kybyIsCisJLnByb2NfaW5mbwkJPSBhZHB0X3Byb2NfaW5mbywKKwkuZGV0ZWN0CQkJPSBhZHB0X2RldGVjdCwJCisJLnJlbGVhc2UJCT0gYWRwdF9yZWxlYXNlLAorCS5pbmZvCQkJPSBhZHB0X2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBhZHB0X3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gYWRwdF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBhZHB0X2RldmljZV9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBhZHB0X2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gYWRwdF9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBhZHB0X2Jpb3NfcGFyYW0sCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGFkcHRfc2xhdmVfY29uZmlndXJlLAorCS5jYW5fcXVldWUJCT0gTUFYX1RPX0lPUF9NRVNTQUdFUywKKwkudGhpc19pZAkJPSA3LAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHRpLmggYi9kcml2ZXJzL3Njc2kvZHB0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmUxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHB0aS5oCkBAIC0wLDAgKzEsMzU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwdGkuaCAgLSAgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJlZ2luICAgICAgICAgICAgICAgIDogVGh1IFNlcCA3IDIwMDAKKyAgICBjb3B5cmlnaHQgICAgICAgICAgICA6IChDKSAyMDAxIGJ5IEFkYXB0ZWMKKworICAgIFNlZSBEb2N1bWVudGF0aW9uL3Njc2kvZHB0aS50eHQgZm9yIGhpc3RvcnksIG5vdGVzLCBsaWNlbnNlIGluZm8KKyAgICBhbmQgY3JlZGl0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRFBUX0gKKyNkZWZpbmUgX0RQVF9ICisKKyNpZm5kZWYgTElOVVhfVkVSU0lPTl9DT0RFCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMDApCisjZGVmaW5lIE1BWF9UT19JT1BfTUVTU0FHRVMgICAoMjEwKQorI2Vsc2UKKyNkZWZpbmUgTUFYX1RPX0lPUF9NRVNTQUdFUyAgICgyNTUpCisjZW5kaWYKKyNkZWZpbmUgTUFYX0ZST01fSU9QX01FU1NBR0VTICgyNTUpCisKKworLyoKKyAqIFNDU0kgaW50ZXJmYWNlIGZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworCitzdGF0aWMgaW50IGFkcHRfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiBzaHQpOworc3RhdGljIGludCBhZHB0X3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQsIHZvaWQgKCpjbWRjb21wbGV0ZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpOworc3RhdGljIGludCBhZHB0X2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQpOworc3RhdGljIGludCBhZHB0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQqIGNtZCk7CitzdGF0aWMgaW50IGFkcHRfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgYWRwdF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICopOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRwdF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnBTSG9zdCk7CitzdGF0aWMgaW50IGFkcHRfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCXNlY3Rvcl90LCBpbnQgZ2VvbVtdKTsKKworc3RhdGljIGludCBhZHB0X2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQpOworc3RhdGljIGludCBhZHB0X2RldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQpOworCisKKy8qCisgKiBTY3NpX0hvc3RfVGVtcGxhdGUgKHNlZSBob3N0cy5oKSAKKyAqLworCisjZGVmaW5lIERQVF9EUklWRVJfTkFNRQkiQWRhcHRlYyBJMk8gUkFJRCIKKworI2lmbmRlZiBIT1NUU19DCisKKyNpbmNsdWRlICJkcHQvc3lzX2luZm8uaCIKKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSAiZHB0L2RwdGlfaTJvLmgiCisjaW5jbHVkZSAiZHB0L2RwdGlfaW9jdGwuaCIKKworI2RlZmluZSBEUFRfSTJPX1ZFUlNJT04gIjIuNCBCdWlsZCA1Z28iCisjZGVmaW5lIERQVF9WRVJTSU9OICAgICAyCisjZGVmaW5lIERQVF9SRVZJU0lPTiAgICAnNCcKKyNkZWZpbmUgRFBUX1NVQlJFVklTSU9OICc1JworI2RlZmluZSBEUFRfQkVUQQkiIgorI2RlZmluZSBEUFRfTU9OVEggICAgICA4IAorI2RlZmluZSBEUFRfREFZICAgICAgICA3CisjZGVmaW5lIERQVF9ZRUFSICAgICAgICAoMjAwMS0xOTgwKQorCisjZGVmaW5lIERQVF9EUklWRVIJImRwdF9pMm8iCisjZGVmaW5lIERQVElfSTJPX01BSk9SCSgxNTEpCisjZGVmaW5lIERQVF9PUkdBTklaQVRJT05fSUQgKDB4MUIpICAgICAgICAvKiBGb3IgUHJpdmF0ZSBNZXNzYWdlcyAqLworI2RlZmluZSBEUFRJX01BWF9IQkEJKDE2KQorI2RlZmluZSBNQVhfQ0hBTk5FTCAgICAgKDUpCS8vIE1heGltdW0gQ2hhbm5lbCAjIFN1cHBvcnRlZAorI2RlZmluZSBNQVhfSUQgICAgICAgIAkoMTI4KQkvLyBNYXhpbXVtIFRhcmdldCBJRCBTdXBwb3J0ZWQKKworLyogU2l6ZXMgaW4gNCBieXRlIHdvcmRzICovCisjZGVmaW5lIFJFUExZX0ZSQU1FX1NJWkUgICgxNykKKyNkZWZpbmUgTUFYX01FU1NBR0VfU0laRSAgKDEyOCkKKyNkZWZpbmUgU0dfTElTVF9FTEVNRU5UUyAgKDU2KQorCisjZGVmaW5lIEVNUFRZX1FVRVVFICAgICAgICAgICAweGZmZmZmZmZmCisjZGVmaW5lIEkyT19JTlRFUlJVUFRfUEVORElOR19CICAgKDB4MDgpCisKKyNkZWZpbmUgUENJX0RQVF9WRU5ET1JfSUQgICAgICAgICAoMHgxMDQ0KQkvLyBEUFQgUENJIFZlbmRvciBJRAorI2RlZmluZSBQQ0lfRFBUX0RFVklDRV9JRCAgICAgICAgICgweEE1MDEpCS8vIERQVCBQQ0kgSTJPIERldmljZSBJRAorI2RlZmluZSBQQ0lfRFBUX1JBUFRPUl9ERVZJQ0VfSUQgICgweEE1MTEpCQorCisvLyNkZWZpbmUgUkVCT09UX05PVElGSUVSIDEKKy8qIERlYnVnZ2luZyBtYWNybyBmcm9tIExpbnV4IERldmljZSBEcml2ZXJzIC0gUnViaW5pICovCisjdW5kZWYgUERFQlVHCisjaWZkZWYgREVCVUcKKy8vVE9ETyBhZGQgZGVidWcgbGV2ZWwgc3dpdGNoCisjICBkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikgIHByaW50ayhLRVJOX0RFQlVHICJkcHRpOiAiIGZtdCwgIyNhcmdzKQorIyAgZGVmaW5lIFBERUJVR1YoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiZHB0aTogIiBmbXQsICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKSAvKiBub3QgZGVidWdnaW5nOiBub3RoaW5nICovCisjIGRlZmluZSBQREVCVUdWKGZtdCwgYXJncy4uLikgLyogbm90IGRlYnVnZ2luZzogbm90aGluZyAqLworI2VuZGlmCisKKyNkZWZpbmUgUEVSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0FSTihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFBJTkZPKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fSU5GTyBmbXQsICMjYXJncykKKyNkZWZpbmUgUENSSVQoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9DUklUIGZtdCwgIyNhcmdzKQorCisjZGVmaW5lIFNIVVRET1dOX1NJR1MJKHNpZ21hc2soU0lHS0lMTCl8c2lnbWFzayhTSUdJTlQpfHNpZ21hc2soU0lHVEVSTSkpCisKKy8vIENvbW1hbmQgdGltZW91dHMKKyNkZWZpbmUgRk9SRVZFUgkJCSgwKQorI2RlZmluZSBUTU9VVF9JTlFVSVJZIAkJKDIwKQorI2RlZmluZSBUTU9VVF9GTFVTSAkJKDM2MC80NSkKKyNkZWZpbmUgVE1PVVRfQUJPUlQJCSgzMCkKKyNkZWZpbmUgVE1PVVRfU0NTSQkJKDMwMCkKKyNkZWZpbmUgVE1PVVRfSU9QUkVTRVQJCSgzNjApCisjZGVmaW5lIFRNT1VUX0dFVFNUQVRVUwkJKDE1KQorI2RlZmluZSBUTU9VVF9JTklUT1VUQk9VTkQJKDE1KQorI2RlZmluZSBUTU9VVF9MQ1QJCSgzNjApCisKKworI2RlZmluZSBJMk9fU0NTSV9ERVZJQ0VfRFNDX01BU0sgICAgICAgICAgICAgICAgMHgwMEZGCisKKyNkZWZpbmUgSTJPX0RFVEFJTF9TVEFUVVNfVU5TVVBQT1JURURfRlVOQ1RJT04gIDB4MDAwQQorCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkYwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfU1VDQ0VTUyAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1JFUVVFU1RfQUJPUlRFRCAgICAgICAgMHgwMjAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19VTkFCTEVfVE9fQUJPUlQgICAgICAgIDB4MDMwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfQ09NUExFVEVfV0lUSF9FUlJPUiAgICAweDA0MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0FEQVBURVJfQlVTWSAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19SRVFVRVNUX0lOVkFMSUQgICAgICAgIDB4MDYwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfUEFUSF9JTlZBTElEICAgICAgICAgICAweDA3MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0RFVklDRV9OT1RfUFJFU0VOVCAgICAgMHgwODAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19VTkFCTEVfVE9fVEVSTUlOQVRFICAgIDB4MDkwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfU0VMRUNUSU9OX1RJTUVPVVQgICAgICAweDBBMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0NPTU1BTkRfVElNRU9VVCAgICAgICAgMHgwQjAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19NUl9NRVNTQUdFX1JFQ0VJVkVEICAgIDB4MEQwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfU0NTSV9CVVNfUkVTRVQgICAgICAgICAweDBFMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1BBUklUWV9FUlJPUl9GQUlMVVJFICAgMHgwRjAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19BVVRPU0VOU0VfRkFJTEVEICAgICAgIDB4MTAwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfTk9fQURBUFRFUiAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0RBVEFfT1ZFUlJVTiAgICAgICAgICAgMHgxMjAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19VTkVYUEVDVEVEX0JVU19GUkVFICAgIDB4MTMwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfU0VRVUVOQ0VfRkFJTFVSRSAgICAgICAweDE0MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1JFUVVFU1RfTEVOR1RIX0VSUk9SICAgMHgxNTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19QUk9WSURFX0ZBSUxVUkUgICAgICAgIDB4MTYwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfQkRSX01FU1NBR0VfU0VOVCAgICAgICAweDE3MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1JFUVVFU1RfVEVSTUlOQVRFRCAgICAgMHgxODAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19JREVfTUVTU0FHRV9TRU5UICAgICAgIDB4MzMwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfUkVTT1VSQ0VfVU5BVkFJTEFCTEUgICAweDM0MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX1VOQUNLTk9XTEVER0VEX0VWRU5UICAgMHgzNTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19NRVNTQUdFX1JFQ0VJVkVEICAgICAgIDB4MzYwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfSU5WQUxJRF9DREIgICAgICAgICAgICAweDM3MDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0xVTl9JTlZBTElEICAgICAgICAgICAgMHgzODAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19TQ1NJX1RJRF9JTlZBTElEICAgICAgIDB4MzkwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfRlVOQ1RJT05fVU5BVkFJTEFCTEUgICAweDNBMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX05PX05FWFVTICAgICAgICAgICAgICAgMHgzQjAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19TQ1NJX0lJRF9JTlZBTElEICAgICAgIDB4M0MwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfQ0RCX1JFQ0VJVkVEICAgICAgICAgICAweDNEMDAKKyNkZWZpbmUgSTJPX1NDU0lfRFNDX0xVTl9BTFJFQURZX0VOQUJMRUQgICAgMHgzRTAwCisjZGVmaW5lIEkyT19TQ1NJX0RTQ19CVVNfQlVTWSAgICAgICAgICAgICAgIDB4M0YwMAorI2RlZmluZSBJMk9fU0NTSV9EU0NfUVVFVUVfRlJPWkVOICAgICAgICAgICAweDQwMDAKKworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisjZGVmaW5lIEhCQV9GTEFHU19JTlNUQUxMRURfQiAgICAgICAweDAwMDAwMDAxCS8vIEFkYXB0ZXIgV2FzIEluc3RhbGxlZAorI2RlZmluZSBIQkFfRkxBR1NfQkxJTktMRURfQiAgICAgICAgMHgwMDAwMDAwMgkvLyBBZGFwdGVyIEluIEJsaW5rIExFRCBTdGF0ZQorI2RlZmluZSBIQkFfRkxBR1NfSU5fUkVTRVQJMHgwMDAwMDA0MAkvKiBpbiByZXNldCAqLworI2RlZmluZSBIQkFfSE9TVFJFU0VUX0ZBSUxFRAkweDAwMDAwMDgwCS8qIGFkcHRfcmVzZXRob3N0IGZhaWxlZCAqLworCisKKy8vIERldmljZSBzdGF0ZSBmbGFncworI2RlZmluZSBEUFRJX0RFVl9PTkxJTkUgICAgMHgwMAorI2RlZmluZSBEUFRJX0RFVl9VTlNDQU5ORUQgMHgwMQorI2RlZmluZSBEUFRJX0RFVl9SRVNFVAkgICAweDAyCisjZGVmaW5lIERQVElfREVWX09GRkxJTkUgICAweDA0CisKKworc3RydWN0IGFkcHRfZGV2aWNlIHsKKwlzdHJ1Y3QgYWRwdF9kZXZpY2UqIG5leHRfbHVuOworCXUzMglmbGFnczsKKwl1MzIJdHlwZTsKKwl1MzIJY2FwYWNpdHk7CisJdTMyCWJsb2NrX3NpemU7CisJdTgJc2NzaV9jaGFubmVsOworCXU4CXNjc2lfaWQ7CisJdTggCXNjc2lfbHVuOworCXU4CXN0YXRlOworCXUxNgl0aWQ7CisJc3RydWN0IGkyb19kZXZpY2UqIHBJMm9fZGV2OworCXN0cnVjdCBzY3NpX2RldmljZSAqcFNjc2lfZGV2OworfTsKKworc3RydWN0IGFkcHRfY2hhbm5lbCB7CisJc3RydWN0IGFkcHRfZGV2aWNlKiBkZXZpY2VbTUFYX0lEXTsJLyogdXNlZCBhcyBhbiBhcnJheSBvZiAxMjggc2NzaSBpZHMgKi8KKwl1OAlzY3NpX2lkOworCXU4CXR5cGU7CisJdTE2CXRpZDsKKwl1MzIJc3RhdGU7CisJc3RydWN0IGkyb19kZXZpY2UqIHBJMm9fZGV2OworfTsKKworLy8gSEJBIHN0YXRlIGZsYWdzCisjZGVmaW5lIERQVElfU1RBVEVfUkVTRVQJKDB4MDEpCisjZGVmaW5lIERQVElfU1RBVEVfSU9DVEwJKDB4MDIpCisKK3R5cGVkZWYgc3RydWN0IF9hZHB0X2hiYSB7CisJc3RydWN0IF9hZHB0X2hiYSAqbmV4dDsKKwlzdHJ1Y3QgcGNpX2RldiAqcERldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXUzMiBzdGF0ZTsKKwlzcGlubG9ja190IHN0YXRlX2xvY2s7CisJaW50IHVuaXQ7CisJaW50IGhvc3Rfbm87CQkvKiBTQ1NJIGhvc3QgbnVtYmVyICovCisJdTggaW5pdGlhbGl6ZWQ7CisJdTggaW5fdXNlOwkJLyogaXMgdGhlIG1hbmFnZW1lbnQgbm9kZSBvcGVuKi8KKworCWNoYXIgbmFtZVszMl07CisJY2hhciBkZXRhaWxbNTVdOworCisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJfdmlydDsKKwl2b2lkIF9faW9tZW0gKm1zZ19hZGRyX3ZpcnQ7CisJdWxvbmcgYmFzZV9hZGRyX3BoeXM7CisJdm9pZCBfX2lvbWVtICpwb3N0X3BvcnQ7CisJdm9pZCBfX2lvbWVtICpyZXBseV9wb3J0OworCXZvaWQgX19pb21lbSAqaXJxX21hc2s7CisJdTE2ICBwb3N0X2NvdW50OworCXUzMiAgcG9zdF9maWZvX3NpemU7CisJdTMyICByZXBseV9maWZvX3NpemU7CisJdTMyKiByZXBseV9wb29sOworCXUzMiAgc2dfdGFibGVzaXplOwkvLyBTY2F0dGVyL0dhdGhlciBMaXN0IFNpemUuICAgICAgIAorCXU4ICB0b3Bfc2NzaV9jaGFubmVsOworCXU4ICB0b3Bfc2NzaV9pZDsKKwl1OCAgdG9wX3Njc2lfbHVuOworCisJaTJvX3N0YXR1c19ibG9jayogc3RhdHVzX2Jsb2NrOworCWkyb19ocnQqIGhydDsKKwlpMm9fbGN0KiBsY3Q7CisJdWludCBsY3Rfc2l6ZTsKKwlzdHJ1Y3QgaTJvX2RldmljZSogZGV2aWNlczsKKwlzdHJ1Y3QgYWRwdF9jaGFubmVsIGNoYW5uZWxbTUFYX0NIQU5ORUxdOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSogcHJvY19lbnRyeTsJLyogL3Byb2MgZGlyICovCisKKwl2b2lkIF9faW9tZW0gKkZ3RGVidWdCdWZmZXJfUDsJLy8gVmlydHVhbCBBZGRyZXNzIE9mIEZXIERlYnVnIEJ1ZmZlcgorCXUzMiAgIEZ3RGVidWdCdWZmZXJTaXplOwkvLyBGVyBEZWJ1ZyBCdWZmZXIgU2l6ZSBJbiBCeXRlcworCXZvaWQgX19pb21lbSAqRndEZWJ1Z1N0ckxlbmd0aF9QOy8vIFZpcnR1YWwgQWRkciBPZiBGVyBEZWJ1ZyBTdHJpbmcgTGVuCisJdm9pZCBfX2lvbWVtICpGd0RlYnVnRmxhZ3NfUDsJLy8gVmlydHVhbCBBZGRyZXNzIE9mIEZXIERlYnVnIEZsYWdzIAorCXZvaWQgX19pb21lbSAqRndEZWJ1Z0JMRURmbGFnX1A7Ly8gVmlydHVhbCBBZGRyIE9mIEZXIERlYnVnIEJMRUQKKwl2b2lkIF9faW9tZW0gKkZ3RGVidWdCTEVEdmFsdWVfUDsvLyBWaXJ0dWFsIEFkZHIgT2YgRlcgRGVidWcgQkxFRAorCXUzMiBGd0RlYnVnRmxhZ3M7Cit9IGFkcHRfaGJhOworCitzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgeworICAgdTMyICBmbGFnX2NvdW50OworICAgdTMyIGFkZHJfYnVzOworfTsgCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KKworc3RhdGljIHZvaWQgYWRwdF9pMm9fc3lzX3NodXRkb3duKHZvaWQpOworc3RhdGljIGludCBhZHB0X2luaXQodm9pZCk7CitzdGF0aWMgaW50IGFkcHRfaTJvX2J1aWxkX3N5c190YWJsZSh2b2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZHB0X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNpZmRlZiBSRUJPT1RfTk9USUZJRVIKK3N0YXRpYyBpbnQgYWRwdF9yZWJvb3RfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLCB1bG9uZyBjb2RlLCB2b2lkICpwKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhZHB0X2kyb19yZXBvcnRfaGJhX3VuaXQoYWRwdF9oYmEqIHBIYmEsIHN0cnVjdCBpMm9fZGV2aWNlICpkKTsKK3N0YXRpYyBpbnQgYWRwdF9pMm9fcXVlcnlfc2NhbGFyKGFkcHRfaGJhKiBwSGJhLCBpbnQgdGlkLCAKKwkJCWludCBncm91cCwgaW50IGZpZWxkLCB2b2lkICpidWYsIGludCBidWZsZW4pOworI2lmZGVmIERFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqYWRwdF9pMm9fZ2V0X2NsYXNzX25hbWUoaW50IGNsYXNzKTsKKyNlbmRpZgorc3RhdGljIGludCBhZHB0X2kyb19pc3N1ZV9wYXJhbXMoaW50IGNtZCwgYWRwdF9oYmEqIHBIYmEsIGludCB0aWQsIAorCQkgIHZvaWQgKm9wYmxrLCBpbnQgb3BsZW4sIHZvaWQgKnJlc2JsaywgaW50IHJlc2xlbik7CitzdGF0aWMgaW50IGFkcHRfaTJvX3Bvc3Rfd2FpdChhZHB0X2hiYSogcEhiYSwgdTMyKiBtc2csIGludCBsZW4sIGludCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgYWRwdF9pMm9fbGN0X2dldChhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgaW50IGFkcHRfaTJvX3BhcnNlX2xjdChhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgaW50IGFkcHRfaTJvX2FjdGl2YXRlX2hiYShhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgaW50IGFkcHRfaTJvX2VuYWJsZV9oYmEoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIGludCBhZHB0X2kyb19pbnN0YWxsX2RldmljZShhZHB0X2hiYSogcEhiYSwgc3RydWN0IGkyb19kZXZpY2UgKmQpOworc3RhdGljIHMzMiBhZHB0X2kyb19wb3N0X3RoaXMoYWRwdF9oYmEqIHBIYmEsIHUzMiogZGF0YSwgaW50IGxlbik7CitzdGF0aWMgczMyIGFkcHRfaTJvX3F1aWVzY2VfaGJhKGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyBzMzIgYWRwdF9pMm9fc3RhdHVzX2dldChhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgczMyIGFkcHRfaTJvX2luaXRfb3V0Ym91bmRfcShhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgczMyIGFkcHRfaTJvX2hydF9nZXQoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHMzMiBhZHB0X3Njc2lfdG9faTJvKGFkcHRfaGJhKiBwSGJhLCBzdHJ1Y3Qgc2NzaV9jbW5kKiBjbWQsIHN0cnVjdCBhZHB0X2RldmljZSogZHB0ZGV2aWNlKTsKK3N0YXRpYyBzMzIgYWRwdF9pMm9fdG9fc2NzaSh1bG9uZyByZXBseSwgc3RydWN0IHNjc2lfY21uZCogY21kKTsKK3N0YXRpYyBzMzIgYWRwdF9zY3NpX3JlZ2lzdGVyKGFkcHRfaGJhKiBwSGJhLHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiBzaHQpOworc3RhdGljIHMzMiBhZHB0X2hiYV9yZXNldChhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgczMyIGFkcHRfaTJvX3Jlc2V0X2hiYShhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgczMyIGFkcHRfcmVzY2FuKGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyBzMzIgYWRwdF9pMm9fcmVwYXJzZV9sY3QoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHMzMiBhZHB0X3NlbmRfbm9wKGFkcHRfaGJhKnBIYmEsdTMyIG0pOworc3RhdGljIHZvaWQgYWRwdF9pMm9fZGVsZXRlX2hiYShhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgdm9pZCBhZHB0X2lucXVpcnkoYWRwdF9oYmEqIHBIYmEpOworc3RhdGljIHZvaWQgYWRwdF9mYWlsX3Bvc3RlZF9zY2JzKGFkcHRfaGJhKiBwSGJhKTsKK3N0YXRpYyBzdHJ1Y3QgYWRwdF9kZXZpY2UqIGFkcHRfZmluZF9kZXZpY2UoYWRwdF9oYmEqIHBIYmEsIHUzMiBjaGFuLCB1MzIgaWQsIHUzMiBsdW4pOworc3RhdGljIGludCBhZHB0X2luc3RhbGxfaGJhKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUqIHNodCwgc3RydWN0IHBjaV9kZXYqIHBEZXYpIDsKK3N0YXRpYyBpbnQgYWRwdF9pMm9fb25saW5lX2hiYShhZHB0X2hiYSogcEhiYSk7CitzdGF0aWMgdm9pZCBhZHB0X2kyb19wb3N0X3dhaXRfY29tcGxldGUodTMyLCBpbnQpOworc3RhdGljIGludCBhZHB0X2kyb19zeXN0YWJfc2VuZChhZHB0X2hiYSogcEhiYSk7CisKK3N0YXRpYyBpbnQgYWRwdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdWludCBjbWQsIHVsb25nIGFyZyk7CitzdGF0aWMgaW50IGFkcHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFkcHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCisKKyNpZmRlZiBVQVJUREVMQVkKK3N0YXRpYyB2b2lkIGFkcHRfZGVsYXkoaW50IG1pbGxpc2VjKTsKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApCitzdGF0aWMgc3RydWN0IHBjaV9kZXYqIGFkcHRfcGNpX2ZpbmRfZGV2aWNlKHVpbnQgdmVuZG9yLCBzdHJ1Y3QgcGNpX2RldiogZnJvbSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19pYTY0X18gCitzdGF0aWMgdm9pZCBhZHB0X2lhNjRfaW5mbyhzeXNJbmZvX1MqIHNpKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgX19zcGFyY19fIAorc3RhdGljIHZvaWQgYWRwdF9zcGFyY19pbmZvKHN5c0luZm9fUyogc2kpOworI2VuZGlmCisjaWYgZGVmaW5lZCBfX2FscGhhX18gCitzdGF0aWMgdm9pZCBhZHB0X3NwYXJjX2luZm8oc3lzSW5mb19TKiBzaSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIF9faTM4Nl9fCitzdGF0aWMgdm9pZCBhZHB0X2kzODZfaW5mbyhzeXNJbmZvX1MqIHNpKTsKKyNlbmRpZgorCisjZGVmaW5lIFBSSU5UX0JVRkZFUl9TSVpFICAgICA1MTIKKworI2RlZmluZSBIQkFfRkxBR1NfREJHX0ZMQUdTX01BU0sgICAgICAgICAweGZmZmYwMDAwCS8vIE1hc2sgZm9yIGRlYnVnIGZsYWdzCisjZGVmaW5lIEhCQV9GTEFHU19EQkdfS0VSTkVMX1BSSU5UX0IgICAgIDB4MDAwMTAwMDAJLy8gS2VybmVsIERlYnVnZ2VyIFByaW50CisjZGVmaW5lIEhCQV9GTEFHU19EQkdfRldfUFJJTlRfQiAgICAgICAgIDB4MDAwMjAwMDAJLy8gRmlybXdhcmUgRGVidWdnZXIgUHJpbnQKKyNkZWZpbmUgSEJBX0ZMQUdTX0RCR19GVU5DVElPTl9FTlRSWV9CICAgMHgwMDA0MDAwMAkvLyBGdW5jdGlvbiBFbnRyeSBQb2ludAorI2RlZmluZSBIQkFfRkxBR1NfREJHX0ZVTkNUSU9OX0VYSVRfQiAgICAweDAwMDgwMDAwCS8vIEZ1bmN0aW9uIEV4aXQKKyNkZWZpbmUgSEJBX0ZMQUdTX0RCR19FUlJPUl9CICAgICAgICAgICAgMHgwMDEwMDAwMAkvLyBFcnJvciBDb25kaXRpb25zCisjZGVmaW5lIEhCQV9GTEFHU19EQkdfSU5JVF9CICAgICAgICAgICAgIDB4MDAyMDAwMDAJLy8gSW5pdCBQcmludHMKKyNkZWZpbmUgSEJBX0ZMQUdTX0RCR19PU19DT01NQU5EU19CICAgICAgMHgwMDQwMDAwMAkvLyBPUyBDb21tYW5kIEluZm8KKyNkZWZpbmUgSEJBX0ZMQUdTX0RCR19TQ0FOX0IgICAgICAgICAgICAgMHgwMDgwMDAwMAkvLyBEZXZpY2UgU2NhbgorCisjZGVmaW5lIEZXX0RFQlVHX1NUUl9MRU5HVEhfT0ZGU0VUIDAKKyNkZWZpbmUgRldfREVCVUdfRkxBR1NfT0ZGU0VUICAgICAgNAorI2RlZmluZSBGV19ERUJVR19CTEVEX09GRlNFVCAgICAgICA4CisKKyNkZWZpbmUgRldfREVCVUdfRkxBR1NfTk9fSEVBREVSU19CICAgIDB4MDEKKyNlbmRpZgkJCQkvKiAhSE9TVFNfQyAqLworI2VuZGlmCQkJCS8qIF9EUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2R0Yy5jIGIvZHJpdmVycy9zY3NpL2R0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWFhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZHRjLmMKQEAgLTAsMCArMSw0OTQgQEAKKworI2RlZmluZSBBVVRPU0VOU0UKKyNkZWZpbmUgUFNFVURPX0RNQQorI2RlZmluZSBET05UX1VTRV9JTlRSCisjZGVmaW5lIFVOU0FGRQkJCS8qIExlYXZlIGludGVycnVwdHMgZW5hYmxlZCBkdXJpbmcgcHNldWRvLWRtYSBJL08gKi8KKyNkZWZpbmUgeE5ERUJVRyAoTkRFQlVHX0lOVFIrTkRFQlVHX1JFU0VMRUNUSU9OK1wKKwkJIE5ERUJVR19TRUxFQ1RJT04rTkRFQlVHX0FSQklUUkFUSU9OKQorI2RlZmluZSBETUFfV09SS1NfUklHSFQKKworCisvKgorICogRFRDIDMxODAvMzI4MCBkcml2ZXIsIGJ5CisgKglSYXkgVmFuIFRhc3NsZQlyYXl2dEBjb21tLm1vdC5jb20KKyAqCisgKgl0YWtlbiBmcm9tIC4uLgorICoJVHJhbnRvciBUMTI4L1QxMjhGL1QyMjggZHJpdmVyIGJ5Li4uCisgKgorICogCURyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcKKyAqCShVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCisgKglkcmV3QGNvbG9yYWRvLmVkdQorICogICAgICArMSAoMzAzKSA0NDAtNDg5NAorICoKKyAqIERJU1RSSUJVVElPTiBSRUxFQVNFIDEuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworKi8KKworLyoKKyAqIE9wdGlvbnMgOiAKKyAqIEFVVE9TRU5TRSAtIGlmIGRlZmluZWQsIFJFUVVFU1QgU0VOU0Ugd2lsbCBiZSBwZXJmb3JtZWQgYXV0b21hdGljYWxseQorICogICAgICBmb3IgY29tbWFuZHMgdGhhdCByZXR1cm4gd2l0aCBhIENIRUNLIENPTkRJVElPTiBzdGF0dXMuIAorICoKKyAqIFBTRVVET19ETUEgLSBlbmFibGVzIFBTRVVETy1ETUEgaGFyZHdhcmUsIHNob3VsZCBnaXZlIGEgMy00WCBwZXJmb3JtYW5jZQorICogaW5jcmVhc2UgY29tcGFyZWQgdG8gcG9sbGVkIEkvTy4KKyAqCisgKiBQQVJJVFkgLSBlbmFibGUgcGFyaXR5IGNoZWNraW5nLiAgTm90IHN1cHBvcnRlZC4KKyAqCisgKiBVTlNBRkUgLSBsZWF2ZSBpbnRlcnJ1cHRzIGVuYWJsZWQgZHVyaW5nIHBzZXVkby1ETUEgdHJhbnNmZXJzLiAKKyAqCQlZb3UgcHJvYmFibHkgd2FudCB0aGlzLgorICoKKyAqIFRoZSBjYXJkIGlzIGRldGVjdGVkIGFuZCBpbml0aWFsaXplZCBpbiBvbmUgb2Ygc2V2ZXJhbCB3YXlzIDogCisgKiAxLiAgQXV0b3Byb2JlIChkZWZhdWx0KSAtIHNpbmNlIHRoZSBib2FyZCBpcyBtZW1vcnkgbWFwcGVkLCAKKyAqICAgICBhIEJJT1Mgc2lnbmF0dXJlIGlzIHNjYW5uZWQgZm9yIHRvIGxvY2F0ZSB0aGUgcmVnaXN0ZXJzLgorICogICAgIEFuIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgdG8gYXV0b3Byb2JlIGZvciB0aGUgaW50ZXJydXB0CisgKiAgICAgbGluZS4KKyAqCisgKiAyLiAgV2l0aCBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIC0gZHRjPWFkZHJlc3MsaXJxIG1heSBiZSAKKyAqICAgICB1c2VkIG9uIHRoZSBMSUxPIGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCisgKiAKKyovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgZm9sbG93aW5nIHdpbGwgc2V0IHRoZSBtb25pdG9yIGJvcmRlciBjb2xvciAodXNlZnVsIHRvIGZpbmQKKyB3aGVyZSBzb21ldGhpbmcgY3Jhc2hlZCBvciBnZXRzIHN0dWNrIGF0ICovCisvKiAxID0gYmx1ZQorIDIgPSBncmVlbgorIDMgPSBjeWFuCisgNCA9IHJlZAorIDUgPSBtYWdlbnRhCisgNiA9IHllbGxvdworIDcgPSB3aGl0ZQorKi8KKyNpZiAwCisjZGVmaW5lIHJ0cmMoaSkge2luYigweDNkYSk7IG91dGIoMHgzMSwgMHgzYzApOyBvdXRiKChpKSwgMHgzYzApO30KKyNlbHNlCisjZGVmaW5lIHJ0cmMoaSkge30KKyNlbmRpZgorCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiZHRjLmgiCisjZGVmaW5lIEFVVE9QUk9CRV9JUlEKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisKKworI2RlZmluZSBEVENfUFVCTElDX1JFTEVBU0UgMgorCisvKiNkZWZpbmUgRFRDREVCVUcgMHgxKi8KKyNkZWZpbmUgRFRDREVCVUdfSU5JVAkweDEKKyNkZWZpbmUgRFRDREVCVUdfVFJBTlNGRVIgMHgyCisKKy8qCisgKiBUaGUgRFRDMzE4MCAmIDMyODAgYm9hcmRzIGFyZSBtZW1vcnkgbWFwcGVkLgorICogCisgKi8KKworLyoKKyAqLworLyogT2Zmc2V0IGZyb20gRFRDXzUzODBfT0ZGU0VUICovCisjZGVmaW5lIERUQ19DT05UUk9MX1JFRwkJMHgxMDAJLyogcncgKi8KKyNkZWZpbmUgRF9DUl9BQ0NFU1MJCTB4ODAJLyogcm8gc2V0PWNhbiBhY2Nlc3MgMzI4MCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ1NSX0RJUl9SRUFECQkweDQwCS8qIHJ3IGRpcmVjdGlvbiwgMSA9IHJlYWQgMCA9IHdyaXRlICovCisKKyNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAweDgwCS8qIHdvICBSZXNldHMgNTNjNDAwICovCisjZGVmaW5lIENTUl81MzgwX1JFRyAgICAgICAgICAgMHg4MAkvKiBybyAgNTM4MCByZWdpc3RlcnMgY2FuIGJlIGFjY2Vzc2VkICovCisjZGVmaW5lIENTUl9UUkFOU19ESVIgICAgICAgICAgMHg0MAkvKiBydyAgRGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgQ1NSX1NDU0lfQlVGRl9JTlRSICAgICAweDIwCS8qIHJ3ICBFbmFibGUgaW50IG9uIHRyYW5zZmVyIHJlYWR5ICovCisjZGVmaW5lIENTUl81MzgwX0lOVFIgICAgICAgICAgMHgxMAkvKiBydyAgRW5hYmxlIDUzODAgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfU0hBUkVEX0lOVFIgICAgICAgIDB4MDgJLyogcncgIEludGVycnVwdCBzaGFyaW5nICovCisjZGVmaW5lIENTUl9IT1NUX0JVRl9OT1RfUkRZICAgMHgwNAkvKiBybyAgSG9zdCBidWZmZXIgbm90IHJlYWR5ICovCisjZGVmaW5lIENTUl9TQ1NJX0JVRl9SRFkgICAgICAgMHgwMgkvKiBybyAgU0NTSSBidWZmZXIgcmVhZHkgKi8KKyNkZWZpbmUgQ1NSX0dBVEVEXzUzODBfSVJRICAgICAweDAxCS8qIHJvICBMYXN0IGJsb2NrIHhmZXJyZWQgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CQVNFIChDU1JfU0NTSV9CVUZGX0lOVFIgfCBDU1JfNTM4MF9JTlRSKQorCisKKyNkZWZpbmUgRFRDX0JMS19DTlQJCTB4MTAxCS8qIHJ3IAorCQkJCQkgKiAjIG9mIDEyOC1ieXRlIGJsb2NrcyB0byB0cmFuc2ZlciAqLworCisKKyNkZWZpbmUgRF9DUl9BQ0NFU1MgICAgICAgICAgICAgMHg4MAkvKiBybyBzZXQ9Y2FuIGFjY2VzcyAzMjgwIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIERUQ19TV0lUQ0hfUkVHCQkweDM5ODIJLyogcm8gLSBESVAgc3dpdGNoZXMgKi8KKyNkZWZpbmUgRFRDX1JFU1VNRV9YRkVSCQkweDM5ODIJLyogd28gLSByZXN1bWUgZGF0YSB4ZmVyIAorCQkJCQkgKiBhZnRlciBkaXNjb25uZWN0L3JlY29ubmVjdCovCisKKyNkZWZpbmUgRFRDXzUzODBfT0ZGU0VUCQkweDM4ODAJLyogOCByZWdpc3RlcnMgaGVyZSwgc2VlIE5DUjUzODAuaCAqLworCisvKiEhISEgZm9yIGR0YywgaXQncyBhIDEyOCBieXRlIGJ1ZmZlciBhdCAzOTAwICEhISAqLworI2RlZmluZSBEVENfREFUQV9CVUYJCTB4MzkwMAkvKiBydyAxMjggYnl0ZXMgbG9uZyAqLworCitzdGF0aWMgc3RydWN0IG92ZXJyaWRlIHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsKKwlpbnQgaXJxOworfSBvdmVycmlkZXMKKyNpZmRlZiBPVkVSUklERQorW10gX19pbml0ZGF0YSA9IE9WRVJSSURFOworI2Vsc2UKK1s0XSBfX2luaXRkYXRhID0geyB7CiswLCBJUlFfQVVUT30sIHsKKzAsIElSUV9BVVRPfSwgeworMCwgSVJRX0FVVE99LCB7CiswLCBJUlFfQVVUT319OworI2VuZGlmCisKKyNkZWZpbmUgTk9fT1ZFUlJJREVTIChzaXplb2Yob3ZlcnJpZGVzKSAvIHNpemVvZihzdHJ1Y3Qgb3ZlcnJpZGUpKQorCitzdGF0aWMgc3RydWN0IGJhc2UgeworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlpbnQgbm9hdXRvOworfSBiYXNlc1tdIF9faW5pdGRhdGEgPSB7IAorCXsgMHhjYzAwMCwgMCB9LCAKKwl7IDB4YzgwMDAsIDAgfSwgCisJeyAweGRjMDAwLCAwIH0sIAorCXsgMHhkODAwMCwgMCB9Cit9OworCisjZGVmaW5lIE5PX0JBU0VTIChzaXplb2YgKGJhc2VzKSAvIHNpemVvZiAoc3RydWN0IGJhc2UpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpZ25hdHVyZSB7CisJY29uc3QgY2hhciAqc3RyaW5nOworCWludCBvZmZzZXQ7Cit9IHNpZ25hdHVyZXNbXSA9IHsgCisJeyJEQVRBIFRFQ0hOT0xPR1kgQ09SUE9SQVRJT04gQklPUyIsIDB4MjV9LAorfTsKKworI2RlZmluZSBOT19TSUdOQVRVUkVTIChzaXplb2YgKHNpZ25hdHVyZXMpIC8gIHNpemVvZiAoc3RydWN0IHNpZ25hdHVyZSkpCisKKyNpZm5kZWYgTU9EVUxFCisvKgorICogRnVuY3Rpb24gOiBkdGNfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCisgKgorICogUHVycG9zZSA6IExJTE8gY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKiAKKyAqIElucHV0cyA6IHN0ciAtIHVudXNlZCwgaW50cyAtIGFycmF5IG9mIGludGVnZXIgcGFyYW1ldGVycyB3aXRoIGludHNbMF0KKyAqCWVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaW50cy4KKyAqCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZHRjX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCXN0YXRpYyBpbnQgY29tbWFuZGxpbmVfY3VycmVudCA9IDA7CisJaW50IGk7CisJaWYgKGludHNbMF0gIT0gMikKKwkJcHJpbnRrKCJkdGNfc2V0dXA6IHVzYWdlIGR0Yz1hZGRyZXNzLGlycVxuIik7CisJZWxzZSBpZiAoY29tbWFuZGxpbmVfY3VycmVudCA8IE5PX09WRVJSSURFUykgeworCQlvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uYWRkcmVzcyA9IGludHNbMV07CisJCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pcnEgPSBpbnRzWzJdOworCQlmb3IgKGkgPSAwOyBpIDwgTk9fQkFTRVM7ICsraSkKKwkJCWlmIChiYXNlc1tpXS5hZGRyZXNzID09IGludHNbMV0pIHsKKwkJCQliYXNlc1tpXS5ub2F1dG8gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkrK2NvbW1hbmRsaW5lX2N1cnJlbnQ7CisJfQorfQorI2VuZGlmCisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgZHRjX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQorICoKKyAqIFB1cnBvc2UgOiBkZXRlY3RzIGFuZCBpbml0aWFsaXplcyBEVEMgMzE4MC8zMjgwIGNvbnRyb2xsZXJzCisgKgl0aGF0IHdlcmUgYXV0b3Byb2JlZCwgb3ZlcnJpZGRlbiBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUsIAorICoJb3Igc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBJbnB1dHMgOiB0cG50IC0gdGVtcGxhdGUgZm9yIHRoaXMgU0NTSSBhZGFwdGVyLgorICogCisgKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgorICoKKyovCisKK3N0YXRpYyBpbnQgX19pbml0IGR0Y19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwlzdGF0aWMgaW50IGN1cnJlbnRfb3ZlcnJpZGUgPSAwLCBjdXJyZW50X2Jhc2UgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGludCBhZGRyOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgc2lnLCBjb3VudDsKKworCXRwbnQtPnByb2NfbmFtZSA9ICJkdGMzeDgwIjsKKwl0cG50LT5wcm9jX2luZm8gPSAmZHRjX3Byb2NfaW5mbzsKKworCWZvciAoY291bnQgPSAwOyBjdXJyZW50X292ZXJyaWRlIDwgTk9fT1ZFUlJJREVTOyArK2N1cnJlbnRfb3ZlcnJpZGUpIHsKKwkJYWRkciA9IDA7CisJCWJhc2UgPSBOVUxMOworCisJCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uYWRkcmVzcykgeworCQkJYWRkciA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5hZGRyZXNzOworCQkJYmFzZSA9IGlvcmVtYXAoYWRkciwgMHgyMDAwKTsKKwkJCWlmICghYmFzZSkKKwkJCQlhZGRyID0gMDsKKwkJfSBlbHNlCisJCQlmb3IgKDsgIWFkZHIgJiYgKGN1cnJlbnRfYmFzZSA8IE5PX0JBU0VTKTsgKytjdXJyZW50X2Jhc2UpIHsKKyNpZiAoRFRDREVCVUcgJiBEVENERUJVR19JTklUKQorCQkJCXByaW50aygic2NzaS1kdGMgOiBwcm9iaW5nIGFkZHJlc3MgJTA4eFxuIiwgYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzKTsKKyNlbmRpZgorCQkJCWlmIChiYXNlc1tjdXJyZW50X2Jhc2VdLm5vYXV0bykKKwkJCQkJY29udGludWU7CisJCQkJYmFzZSA9IGlvcmVtYXAoYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzLCAweDIwMDApOworCQkJCWlmICghYmFzZSkKKwkJCQkJY29udGludWU7CisJCQkJZm9yIChzaWcgPSAwOyBzaWcgPCBOT19TSUdOQVRVUkVTOyArK3NpZykgeworCQkJCQlpZiAoY2hlY2tfc2lnbmF0dXJlKGJhc2UgKyBzaWduYXR1cmVzW3NpZ10ub2Zmc2V0LCBzaWduYXR1cmVzW3NpZ10uc3RyaW5nLCBzdHJsZW4oc2lnbmF0dXJlc1tzaWddLnN0cmluZykpKSB7CisJCQkJCQlhZGRyID0gYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzOworI2lmIChEVENERUJVRyAmIERUQ0RFQlVHX0lOSVQpCisJCQkJCQlwcmludGsoInNjc2ktZHRjIDogZGV0ZWN0ZWQgYm9hcmQuXG4iKTsKKyNlbmRpZgorCQkJCQkJZ290byBmb3VuZDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpb3VubWFwKGJhc2UpOworCQkJfQorCisjaWYgZGVmaW5lZChEVENERUJVRykgJiYgKERUQ0RFQlVHICYgRFRDREVCVUdfSU5JVCkKKwkJcHJpbnRrKCJzY3NpLWR0YyA6IGJhc2UgPSAlMDh4XG4iLCBhZGRyKTsKKyNlbmRpZgorCisJCWlmICghYWRkcikKKwkJCWJyZWFrOworCitmb3VuZDoKKwkJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCQlpZiAoaW5zdGFuY2UgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWluc3RhbmNlLT5iYXNlID0gYWRkcjsKKwkJKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbnN0YW5jZSktPmhvc3RkYXRhKS0+YmFzZSA9IGJhc2U7CisKKwkJTkNSNTM4MF9pbml0KGluc3RhbmNlLCAwKTsKKworCQlOQ1I1MzgwX3dyaXRlKERUQ19DT05UUk9MX1JFRywgQ1NSXzUzODBfSU5UUik7CS8qIEVuYWJsZSBpbnQncyAqLworCQlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycSAhPSBJUlFfQVVUTykKKwkJCWluc3RhbmNlLT5pcnEgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxOworCQllbHNlCisJCQlpbnN0YW5jZS0+aXJxID0gTkNSNTM4MF9wcm9iZV9pcnEoaW5zdGFuY2UsIERUQ19JUlFTKTsKKworI2lmbmRlZiBET05UX1VTRV9JTlRSCisJCS8qIFdpdGggaW50ZXJydXB0cyBlbmFibGVkLCBpdCB3aWxsIHNvbWV0aW1lcyBoYW5nIHdoZW4gZG9pbmcgaGVhdnkKKwkJICogcmVhZHMuIFNvIGJldHRlciBub3QgZW5hYmxlIHRoZW0gdW50aWwgSSBmaW5nZXIgaXQgb3V0LiAqLworCQlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCQkJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIGR0Y19pbnRyLCBTQV9JTlRFUlJVUFQsICJkdGMiLCBpbnN0YW5jZSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisJCQkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisJCQl9CisKKwkJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogaW50ZXJydXB0cyBub3QgZW5hYmxlZC4gZm9yIGJldHRlciBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSxcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCA6IHBsZWFzZSBqdW1wZXIgdGhlIGJvYXJkIGZvciBhIGZyZWUgSVJRLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQl9CisjZWxzZQorCQlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogaW50ZXJydXB0cyBub3QgdXNlZC4gTWlnaHQgYXMgd2VsbCBub3QganVtcGVyIGl0LlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQlpbnN0YW5jZS0+aXJxID0gU0NTSV9JUlFfTk9ORTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRFRDREVCVUcpICYmIChEVENERUJVRyAmIERUQ0RFQlVHX0lOSVQpCisJCXByaW50aygic2NzaSVkIDogaXJxID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKyNlbmRpZgorCisJCXByaW50ayhLRVJOX0lORk8gInNjc2klZCA6IGF0IDB4JTA1WCIsIGluc3RhbmNlLT5ob3N0X25vLCAoaW50KSBpbnN0YW5jZS0+YmFzZSk7CisJCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpCisJCQlwcmludGsoIiBpbnRlcnJ1cHRzIGRpc2FibGVkIik7CisJCWVsc2UKKwkJCXByaW50aygiIGlycSAlZCIsIGluc3RhbmNlLT5pcnEpOworCQlwcmludGsoIiBvcHRpb25zIENBTl9RVUVVRT0lZCAgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsIENBTl9RVUVVRSwgQ01EX1BFUl9MVU4sIERUQ19QVUJMSUNfUkVMRUFTRSk7CisJCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisJCXByaW50aygiXG4iKTsKKworCQkrK2N1cnJlbnRfb3ZlcnJpZGU7CisJCSsrY291bnQ7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IGR0Y19iaW9zcGFyYW0oRGlzayAqIGRpc2ssIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwgaW50ICppcCkKKyAqCisgKiBQdXJwb3NlIDogR2VuZXJhdGVzIGEgQklPUyAvIERPUyBjb21wYXRpYmxlIEgtQy1TIG1hcHBpbmcgZm9yIAorICoJdGhlIHNwZWNpZmllZCBkZXZpY2UgLyBzaXplLgorICogCisgKiBJbnB1dHMgOiBzaXplID0gc2l6ZSBvZiBkZXZpY2UgaW4gc2VjdG9ycyAoNTEyIGJ5dGVzKSwgZGV2ID0gYmxvY2sgZGV2aWNlCisgKgltYWpvciAvIG1pbm9yLCBpcFtdID0ge2hlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnN9ICAKKyAqCisgKiBSZXR1cm5zIDogYWx3YXlzIDAgKHN1Y2Nlc3MpLCBpbml0aWFsaXplcyBpcAorICoJCisqLworCisvKiAKKyAqIFhYWCBNb3N0IFNDU0kgYm9hcmRzIHVzZSB0aGlzIG1hcHBpbmcsIEkgY291bGQgYmUgaW5jb3JyZWN0LiAgU29tZSBvbmUKKyAqIHVzaW5nIGhhcmQgZGlza3Mgb24gYSB0cmFudG9yIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGlzIG1hcHBpbmcgY29ycmVzcG9uZHMKKyAqIHRvIHRoYXQgdXNlZCBieSB0aGUgQklPUyAvIEFTUEkgZHJpdmVyIGJ5IHJ1bm5pbmcgdGhlIGxpbnV4IGZkaXNrIHByb2dyYW0KKyAqIGFuZCBtYXRjaGluZyB0aGUgSF9DX1MgY29vcmRpbmF0ZXMgdG8gd2hhdCBET1MgdXNlcy4KKyovCisKK3N0YXRpYyBpbnQgZHRjX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCSBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwlpbnQgc2l6ZSA9IGNhcGFjaXR5OworCisJaXBbMF0gPSA2NDsKKwlpcFsxXSA9IDMyOworCWlwWzJdID0gc2l6ZSA+PiAxMTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9wcmVhZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICoJdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKQorICoKKyAqIFB1cnBvc2UgOiBGYXN0IDUzODAgcHNldWRvLWRtYSByZWFkIGZ1bmN0aW9uLCByZWFkcyBsZW4gYnl0ZXMgdG8gCisgKglkc3QKKyAqIAorICogSW5wdXRzIDogZHN0ID0gZGVzdGluYXRpb24sIGxlbiA9IGxlbmd0aCBpbiBieXRlcworICoKKyAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCisgKiAJdGltZW91dC4KKyovCisKK3N0YXRpYyBpbnQgZHRjX21heGkgPSAwOworc3RhdGljIGludCBkdGNfd21heGkgPSAwOworCitzdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3ByZWFkKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwlpbnQgaTsJCQkvKiBGb3IgY291bnRpbmcgdGltZSBzcGVudCBpbiB0aGUgcG9sbC1sb29wICovCisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlpID0gMDsKKwlOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0VOQUJMRV9FT1BfSU5UUiB8IE1SX0RNQV9NT0RFKTsKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQlOQ1I1MzgwX3dyaXRlKERUQ19DT05UUk9MX1JFRywgQ1NSX0RJUl9SRUFEKTsKKwllbHNlCisJCU5DUjUzODBfd3JpdGUoRFRDX0NPTlRST0xfUkVHLCBDU1JfRElSX1JFQUQgfCBDU1JfSU5UX0JBU0UpOworCU5DUjUzODBfd3JpdGUoRFRDX0JMS19DTlQsIGxlbiA+PiA3KTsJLyogQmxvY2sgY291bnQgKi8KKwlydHJjKDEpOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXJ0cmMoMik7CisJCXdoaWxlIChOQ1I1MzgwX3JlYWQoRFRDX0NPTlRST0xfUkVHKSAmIENTUl9IT1NUX0JVRl9OT1RfUkRZKQorCQkJKytpOworCQlydHJjKDMpOworCQltZW1jcHlfZnJvbWlvKGQsIGJhc2UgKyBEVENfREFUQV9CVUYsIDEyOCk7CisJCWQgKz0gMTI4OworCQlsZW4gLT0gMTI4OworCQlydHJjKDcpOworCQkvKioqIHdpdGggaW50J3Mgb24sIGl0IHNvbWV0aW1lcyBoYW5ncyBhZnRlciBoZXJlLgorCQkgKiBMb29rcyBsaWtlIHNvbWV0aGluZyBtYWtlcyBIQk5SIGdvIGF3YXkuICovCisJfQorCXJ0cmMoNCk7CisJd2hpbGUgKCEoTkNSNTM4MF9yZWFkKERUQ19DT05UUk9MX1JFRykgJiBEX0NSX0FDQ0VTUykpCisJCSsraTsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCAwKTsJLyogQ2xlYXIgdGhlIG9wZXJhdGluZyBtb2RlICovCisJcnRyYygwKTsKKwlOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCWlmIChpID4gZHRjX21heGkpCisJCWR0Y19tYXhpID0gaTsKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9wd3JpdGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKyAqCXVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKKyAqCisgKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgd3JpdGUgZnVuY3Rpb24sIHRyYW5zZmVycyBsZW4gYnl0ZXMgZnJvbQorICoJc3JjCisgKiAKKyAqIElucHV0cyA6IHNyYyA9IHNvdXJjZSwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKKyAqIAl0aW1lb3V0LgorKi8KKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wd3JpdGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworCU5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfRU5BQkxFX0VPUF9JTlRSIHwgTVJfRE1BX01PREUpOworCS8qIHNldCBkaXJlY3Rpb24gKHdyaXRlKSAqLworCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpCisJCU5DUjUzODBfd3JpdGUoRFRDX0NPTlRST0xfUkVHLCAwKTsKKwllbHNlCisJCU5DUjUzODBfd3JpdGUoRFRDX0NPTlRST0xfUkVHLCBDU1JfNTM4MF9JTlRSKTsKKwlOQ1I1MzgwX3dyaXRlKERUQ19CTEtfQ05ULCBsZW4gPj4gNyk7CS8qIEJsb2NrIGNvdW50ICovCisJZm9yIChpID0gMDsgbGVuID4gMDsgKytpKSB7CisJCXJ0cmMoNSk7CisJCS8qIFBvbGwgdW50aWwgdGhlIGhvc3QgYnVmZmVyIGNhbiBhY2NlcHQgZGF0YS4gKi8KKwkJd2hpbGUgKE5DUjUzODBfcmVhZChEVENfQ09OVFJPTF9SRUcpICYgQ1NSX0hPU1RfQlVGX05PVF9SRFkpCisJCQkrK2k7CisJCXJ0cmMoMyk7CisJCW1lbWNweV90b2lvKGJhc2UgKyBEVENfREFUQV9CVUYsIHNyYywgMTI4KTsKKwkJc3JjICs9IDEyODsKKwkJbGVuIC09IDEyODsKKwl9CisJcnRyYyg0KTsKKwl3aGlsZSAoIShOQ1I1MzgwX3JlYWQoRFRDX0NPTlRST0xfUkVHKSAmIERfQ1JfQUNDRVNTKSkKKwkJKytpOworCXJ0cmMoNik7CisJLyogV2FpdCB1bnRpbCB0aGUgbGFzdCBieXRlIGhhcyBiZWVuIHNlbnQgdG8gdGhlIGRpc2sgKi8KKwl3aGlsZSAoIShOQ1I1MzgwX3JlYWQoVEFSR0VUX0NPTU1BTkRfUkVHKSAmIFRDUl9MQVNUX0JZVEVfU0VOVCkpCisJCSsraTsKKwlydHJjKDcpOworCS8qIENoZWNrIGZvciBwYXJpdHkgZXJyb3IgaGVyZS4gZml4bWUuICovCisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgMCk7CS8qIENsZWFyIHRoZSBvcGVyYXRpbmcgbW9kZSAqLworCXJ0cmMoMCk7CisJaWYgKGkgPiBkdGNfd21heGkpCisJCWR0Y193bWF4aSA9IGk7CisJcmV0dXJuICgwKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSAiTkNSNTM4MC5jIgorCitzdGF0aWMgaW50IGR0Y19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCU5DUjUzODBfc2V0dXAoc2hvc3QpOworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlOQ1I1MzgwX2V4aXQoc2hvc3QpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlpb3VubWFwKGJhc2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCQk9ICJEVEMgMzE4MC8zMjgwICIsCisJLmRldGVjdAkJCQk9IGR0Y19kZXRlY3QsCisJLnJlbGVhc2UJCQk9IGR0Y19yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCQk9IGR0Y19xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IGR0Y19hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gZHRjX2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBkdGNfZGV2aWNlX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgICAgICAgICAgPSBkdGNfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbSAgICAgCQk9IGR0Y19iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZSAgICAgIAkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQgICAgICAgIAkJPSA3LAorCS5zZ190YWJsZXNpemUgICAJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1biAgICAJCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nIAkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHRjLmggYi9kcml2ZXJzL3Njc2kvZHRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiY2RiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9kdGMuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogRFRDIGNvbnRyb2xsZXIsIHRha2VuIGZyb20gVDEyOCBkcml2ZXIgYnkuLi4KKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSAyLiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogCisgKiAKKyAqIGFuZCAKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisjaWZuZGVmIERUQzMyODBfSAorI2RlZmluZSBEVEMzMjgwX0gKKworc3RhdGljIGludCBkdGNfYWJvcnQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBkdGNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCSAgICAgICAgIHNlY3Rvcl90LCBpbnQqKTsKK3N0YXRpYyBpbnQgZHRjX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgaW50IGR0Y19xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBpbnQgZHRjX2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGR0Y19kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBkdGNfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAzMiAKKyNlbmRpZgorCisjZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIFwKKyAgICB2b2lkIF9faW9tZW0gKmJhc2UKKworI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKSBcCisgICAgdm9pZCBfX2lvbWVtICpiYXNlCisKKyNkZWZpbmUgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSkgXAorICAgIGJhc2UgPSAoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopKGluc3RhbmNlKS0+aG9zdGRhdGEpLT5iYXNlCisKKyNkZWZpbmUgRFRDX2FkZHJlc3MocmVnKSAoYmFzZSArIERUQ181MzgwX09GRlNFVCArIHJlZykKKworI2RlZmluZSBkYk5DUjUzODBfcmVhZChyZWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocnZhbD1yZWFkYihEVENfYWRkcmVzcyhyZWcpKSwgXAorICAgICAoKCh1bnNpZ25lZCBjaGFyKSBwcmludGsoIkRUQyA6IHJlYWQgcmVnaXN0ZXIgJWQgYXQgYWRkciAlcCBpczogJTAyeFxuIlwKKyAgICAsIChyZWcpLCBEVENfYWRkcmVzcyhyZWcpLCBydmFsKSksIHJ2YWwgKSApCisKKyNkZWZpbmUgZGJOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRFRDIDogd3JpdGUgJTAyeCB0byByZWdpc3RlciAlZCBhdCBhZGRyZXNzICVwXG4iLCAgICAgICAgIFwKKyAgICAgICAgICAgICh2YWx1ZSksIChyZWcpLCBEVENfYWRkcmVzcyhyZWcpKTsgICAgIFwKKyAgICB3cml0ZWIodmFsdWUsIERUQ19hZGRyZXNzKHJlZykpO30gd2hpbGUoMCkKKworCisjaWYgIShEVENERUJVRyAmIERUQ0RFQlVHX1RSQU5TRkVSKSAKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgKHJlYWRiKERUQ19hZGRyZXNzKHJlZykpKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpICh3cml0ZWIodmFsdWUsIERUQ19hZGRyZXNzKHJlZykpKQorI2Vsc2UKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgKHJlYWRiKERUQ19hZGRyZXNzKHJlZykpKQorI2RlZmluZSB4TkNSNTM4MF9yZWFkKHJlZykJCQkJCQlcCisgICAgKCgodW5zaWduZWQgY2hhcikgcHJpbnRrKCJEVEMgOiByZWFkIHJlZ2lzdGVyICVkIGF0IGFkZHJlc3MgJXBcbiJcCisgICAgLCAocmVnKSwgRFRDX2FkZHJlc3MocmVnKSkpLCByZWFkYihEVENfYWRkcmVzcyhyZWcpKSkKKworI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIGRvIHsJCQkJCVwKKyAgICBwcmludGsoIkRUQyA6IHdyaXRlICUwMnggdG8gcmVnaXN0ZXIgJWQgYXQgYWRkcmVzcyAlcFxuIiwgCVwKKwkgICAgKHZhbHVlKSwgKHJlZyksIERUQ19hZGRyZXNzKHJlZykpOwlcCisgICAgd3JpdGViKHZhbHVlLCBEVENfYWRkcmVzcyhyZWcpKTt9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBOQ1I1MzgwX2ludHIJCQlkdGNfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQJCWR0Y19xdWV1ZV9jb21tYW5kCisjZGVmaW5lIE5DUjUzODBfYWJvcnQJCQlkdGNfYWJvcnQKKyNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQJCWR0Y19idXNfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9kZXZpY2VfcmVzZXQJCWR0Y19kZXZpY2VfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9ob3N0X3Jlc2V0CQlkdGNfaG9zdF9yZXNldAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbwkJZHRjX3Byb2NfaW5mbyAKKworLyogMTUgMTIgMTEgMTAKKyAgIDEwMDEgMTEwMCAwMDAwIDAwMDAgKi8KKworI2RlZmluZSBEVENfSVJRUyAweDljMDAKKworCisjZW5kaWYgLyogRFRDMzI4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZWF0YS5jIGIvZHJpdmVycy9zY3NpL2VhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQxNmNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2VhdGEuYwpAQCAtMCwwICsxLDI2MjEgQEAKKy8qCisgKiAgICAgIGVhdGEuYyAtIExvdy1sZXZlbCBkcml2ZXIgZm9yIEVBVEEvRE1BIFNDU0kgaG9zdCBhZGFwdGVycy4KKyAqCisgKiAgICAgIDAzIEp1biAyMDAzIFJldi4gOC4xMCBmb3IgbGludXgtMi41LjcwCisgKiAgICAgICAgKyBVcGRhdGUgZm9yIG5ldyBJUlEgQVBJLgorICogICAgICAgICsgVXNlICJnb3RvIiB3aGVuIGFwcHJvcHJpYXRlLgorICogICAgICAgICsgRHJvcCBlYXRhLmguCisgKiAgICAgICAgKyBVcGRhdGUgZm9yIG5ldyBtb2R1bGVfcGFyYW0gQVBJLgorICogICAgICAgICsgTW9kdWxlIHBhcmFtZXRlcnMgIGNhbiBub3cgYmUgc3BlY2lmaWVkIG9ubHkgaW4gdGhlCisgKiAgICAgICAgICBzYW1lIGZvcm1hdCBhcyB0aGUga2VybmVsIGJvb3Qgb3B0aW9ucy4KKyAqCisgKiAgICAgICAgICAgICBib290IG9wdGlvbiAgICBvbGQgbW9kdWxlIHBhcmFtIAorICogICAgICAgICAgICAgLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICBhZGRyLC4uLiAgICAgICBpb19wb3J0PWFkZHIsLi4uCisgKiAgICAgICAgICAgICBsYzpbeXxuXSAgICAgICBsaW5rZWRfY29tbT1bMXwwXQorICogICAgICAgICAgICAgbXE6eHggICAgICAgICAgbWF4X3F1ZXVlX2RlcHRoPXh4CisgKiAgICAgICAgICAgICB0bTpbMHwxfDJdICAgICB0YWdfbW9kZT1bMHwxfDJdCisgKiAgICAgICAgICAgICBldDpbeXxuXSAgICAgICBleHRfdHJhbj1bMXwwXQorICogICAgICAgICAgICAgcnM6W3l8bl0gICAgICAgcmV2X3NjYW49WzF8MF0KKyAqICAgICAgICAgICAgIGlwOlt5fG5dICAgICAgIGlzYV9wcm9iZT1bMXwwXQorICogICAgICAgICAgICAgZXA6W3l8bl0gICAgICAgZWlzYV9wcm9iZT1bMXwwXQorICogICAgICAgICAgICAgcHA6W3l8bl0gICAgICAgcGNpX3Byb2JlPVsxfDBdCisgKgorICogICAgICAgICAgQSB2YWxpZCBleGFtcGxlIHVzaW5nIHRoZSBuZXcgcGFyYW1ldGVyIGZvcm1hdCBpczoKKyAqICAgICAgICAgIG1vZHByb2JlIGVhdGEgImVhdGE9MHg3NDEwLDB4MjMwLGxjOnksdG06MCxtcTo0LGVwOm4iCisgKgorICogICAgICAgICAgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgb2xkIGZvcm1hdDoKKyAqICAgICAgICAgIG1vZHByb2JlIGVhdGEgaW9fcG9ydD0weDc0MTAsMHgyMzAgbGlua2VkX2NvbW09MSB0YWdfbW9kZT0wIFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3F1ZXVlX2RlcHRoPTQgZWlzYV9wcm9iZT0wCisgKgorICogICAgICAxMiBGZWIgMjAwMyBSZXYuIDguMDQgZm9yIGxpbnV4IDIuNS42MAorICogICAgICAgICsgUmVsZWFzZSBpcnEgYmVmb3JlIGNhbGxpbmcgc2NzaV9yZWdpc3Rlci4KKyAqCisgKiAgICAgIDEyIE5vdiAyMDAyIFJldi4gOC4wMiBmb3IgbGludXggMi41LjQ3CisgKiAgICAgICAgKyBSZWxlYXNlIGRyaXZlcl9sb2NrIGJlZm9yZSBjYWxsaW5nIHNjc2lfcmVnaXN0ZXIuCisgKgorICogICAgICAxMSBOb3YgMjAwMiBSZXYuIDguMDEgZm9yIGxpbnV4IDIuNS40NworICogICAgICAgICsgRml4ZWQgYmlvc19wYXJhbSBhbmQgc2NzaWNhbV9iaW9zX3BhcmFtIGNhbGxpbmcgcGFyYW1ldGVycy4KKyAqCisgKiAgICAgIDI4IE9jdCAyMDAyIFJldi4gOC4wMCBmb3IgbGludXggMi41LjQ0LWFjNAorICogICAgICAgICsgVXNlIG5ldyB0Y3EgYW5kIGFkanVzdF9xdWV1ZV9kZXB0aCBhcGkuCisgKiAgICAgICAgKyBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAodG06WzAtMl0pIHRvIGNob29zZSB0aGUgdHlwZSBvZiB0YWdzOgorICogICAgICAgICAgMCAtPiBkaXNhYmxlIHRhZ2dpbmcgOyAxIC0+IHNpbXBsZSB0YWdzICA7IDIgLT4gb3JkZXJlZCB0YWdzLgorICogICAgICAgICAgRGVmYXVsdCBpcyB0bTowICh0YWdnZWQgY29tbWFuZHMgZGlzYWJsZWQpLgorICogICAgICAgICAgRm9yIGNvbXBhdGliaWxpdHkgdGhlICJ0YzoiIG9wdGlvbiBpcyBhbiBhbGlhcyBvZiB0aGUgInRtOiIKKyAqICAgICAgICAgIG9wdGlvbjsgdGM6biBpcyBlcXVpdmFsZW50IHRvIHRtOjAgYW5kIHRjOnkgaXMgZXF1aXZhbGVudCB0bworICogICAgICAgICAgdG06MS4KKyAqICAgICAgICArIFRoZSB0YWdnZWRfY29tbSBtb2R1bGUgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQsIHVzZSB0YWdfbW9kZQorICogICAgICAgICAgaW5zdGVhZCwgZXF1aXZhbGVudCB0byB0aGUgInRtOiIgYm9vdCBvcHRpb24uCisgKgorICogICAgICAxMCBPY3QgMjAwMiBSZXYuIDcuNzAgZm9yIGxpbnV4IDIuNS40MgorICogICAgICAgICsgRm9yZXBvcnQgZnJvbSByZXZpc2lvbiA2LjcwLgorICoKKyAqICAgICAgMjUgSnVuIDIwMDIgUmV2LiA2LjcwIGZvciBsaW51eCAyLjQuMTkKKyAqICAgICAgICArIFRoaXMgcmVsZWFzZSBpcyB0aGUgZmlyc3Qgb25lIHRlc3RlZCBvbiBhIEJpZyBFbmRpYW4gcGxhdGZvcm06CisgKiAgICAgICAgICBmaXhlZCBlbmRpYW4tbmVzcyBwcm9ibGVtIGR1ZSB0byBiaXRmaWVsZHM7CisgKiAgICAgICAgICBmaXhlZCBlbmRpYW4tbmVzcyBwcm9ibGVtIGluIHJlYWRfcGlvLgorICogICAgICAgICsgQWRkZWQgbmV3IG9wdGlvbnMgZm9yIHNlbGVjdGl2ZWx5IHByb2JpbmcgSVNBLCBFSVNBIGFuZCBQQ0kgYnVzOgorICoKKyAqICAgICAgICAgIEJvb3Qgb3B0aW9uICAgUGFyYW1ldGVyIG5hbWUgICAgRGVmYXVsdCBhY2NvcmRpbmcgdG8KKyAqCisgKiAgICAgICAgICBpcDpbeXxuXSAgICAgIGlzYV9wcm9iZT1bMXwwXSAgIENPTkZJR19JU0EgIGRlZmluZWQKKyAqICAgICAgICAgIGVwOlt5fG5dICAgICAgZWlzYV9wcm9iZT1bMXwwXSAgQ09ORklHX0VJU0EgZGVmaW5lZAorICogICAgICAgICAgcHA6W3l8bl0gICAgICBwY2lfcHJvYmU9WzF8MF0gICBDT05GSUdfUENJICBkZWZpbmVkCisgKgorICogICAgICAgICAgVGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHBlcmZvcm0gcHJvYmluZyBpZiB0aGUgY29ycmlzcG9uZGluZworICogICAgICAgICAgYnVzIGlzIGNvbmZpZ3VyZWQgYW5kIHRvIHNraXAgcHJvYmluZyBvdGhlcndpc2UuCisgKgorICogICAgICAgICsgSWYgcGNpX3Byb2JlIGlzIGluIGVmZmVjdCBhbmQgYSBsaXN0IG9mIEkvTyAgcG9ydHMgaXMgc3BlY2lmaWVkCisgKiAgICAgICAgICBhcyBwYXJhbWV0ZXIgb3IgYm9vdCBvcHRpb24sIHBjaV9lbmFibGVfZGV2aWNlKCkgaXMgcGVyZm9ybWVkCisgKiAgICAgICAgICBvbiBhbGwgcGNpIGRldmljZXMgbWF0Y2hpbmcgUENJX0NMQVNTX1NUT1JBR0VfU0NTSS4KKyAqCisgKiAgICAgIDIxIEZlYiAyMDAyIFJldi4gNi41MiBmb3IgbGludXggMi40LjE4CisgKiAgICAgICAgKyBCYWNrcG9ydCBmcm9tIHJldi4gNy4yMiAodXNlIGlvX3JlcXVlc3RfbG9jaykuCisgKgorICogICAgICAyMCBGZWIgMjAwMiBSZXYuIDcuMjIgZm9yIGxpbnV4IDIuNS41CisgKiAgICAgICAgKyBSZW1vdmUgYW55IHJlZmVyZW5jZSB0byB2aXJ0X3RvX2J1cygpLgorICogICAgICAgICsgRml4IHBpbyBoYW5nIHdoaWxlIGRldGVjdGluZyBtdWx0aXBsZSBIQkFzLgorICogICAgICAgICsgRml4ZWQgYSBib2FyZCBkZXRlY3Rpb24gYnVnOiBpbiBhIHN5c3RlbSB3aXRoCisgKiAgICAgICAgICBtdWx0aXBsZSBJU0EvRUlTQSBib2FyZHMsIGFsbCBidXQgdGhlIGZpcnN0IG9uZQorICogICAgICAgICAgd2VyZSBlcnJvbmVvdXNseSBkZXRlY3RlZCBhcyBQQ0kuCisgKgorICogICAgICAwMSBKYW4gMjAwMiBSZXYuIDcuMjAgZm9yIGxpbnV4IDIuNS4xCisgKiAgICAgICAgKyBVc2UgdGhlIGR5bmFtaWMgRE1BIG1hcHBpbmcgQVBJLgorICoKKyAqICAgICAgMTkgRGVjIDIwMDEgUmV2LiA3LjAyIGZvciBsaW51eCAyLjUuMQorICogICAgICAgICsgVXNlIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiBpZiBzZXQuCisgKiAgICAgICAgKyBVc2Ugc2dsaXN0LnBhZ2UgaW5zdGVhZCBvZiBzZ2xpc3QuYWRkcmVzcy4KKyAqCisgKiAgICAgIDExIERlYyAyMDAxIFJldi4gNy4wMCBmb3IgbGludXggMi41LjEKKyAqICAgICAgICArIFVzZSBob3N0LT5ob3N0X2xvY2sgaW5zdGVhZCBvZiBpb19yZXF1ZXN0X2xvY2suCisgKgorICogICAgICAgMSBNYXkgMjAwMSBSZXYuIDYuMDUgZm9yIGxpbnV4IDIuNC40CisgKiAgICAgICAgKyBDbGVhbiB1cCBhbGwgcGNpIHJlbGF0ZWQgcm91dGluZXMuCisgKiAgICAgICAgKyBGaXggZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gZm9yIG9wY29kZSBTRU5EX0NVRV9TSEVFVCAoMHg1ZCkKKyAqCisgKiAgICAgIDMwIEphbiAyMDAxIFJldi4gNi4wNCBmb3IgbGludXggMi40LjEKKyAqICAgICAgICArIENhbGwgcGNpX3Jlc291cmNlX3N0YXJ0IGFmdGVyIHBjaV9lbmFibGVfZGV2aWNlLgorICoKKyAqICAgICAgMjUgSmFuIDIwMDEgUmV2LiA2LjAzIGZvciBsaW51eCAyLjQuMAorICogICAgICAgICsgImNoZWNrX3JlZ2lvbiIgY2FsbCByZXBsYWNlZCBieSAicmVxdWVzdF9yZWdpb24iLgorICoKKyAqICAgICAgMjIgTm92IDIwMDAgUmV2LiA2LjAyIGZvciBsaW51eCAyLjQuMC10ZXN0MTEKKyAqICAgICAgICArIFJldHVybiBjb2RlIGNoZWNrZWQgd2hlbiBjYWxsaW5nIHBjaV9lbmFibGVfZGV2aWNlLgorICogICAgICAgICsgUmVtb3ZlZCBvbGQgc2NzaSBlcnJvciBoYW5kbGluZyBzdXBwb3J0LgorICogICAgICAgICsgVGhlIG9ic29sZXRlIGJvb3Qgb3B0aW9uIGZsYWcgZWg6biBpcyBzaWxlbnRseSBpZ25vcmVkLgorICogICAgICAgICsgUmVtb3ZlZCBlcnJvciBtZXNzYWdlcyB3aGlsZSBhIGRpc2sgZHJpdmUgaXMgcG93ZXJlZCB1cCBhdAorICogICAgICAgICAgYm9vdCB0aW1lLgorICogICAgICAgICsgSW1wcm92ZWQgYm9vdCBtZXNzYWdlczogYWxsIHRhZ2dlZCBjYXBhYmxlIGRldmljZSBhcmUKKyAqICAgICAgICAgIGluZGljYXRlZCBhcyAidGFnZ2VkIiBvciAic29mdC10YWdnZWQiIDoKKyAqICAgICAgICAgIC0gInNvZnQtdGFnZ2VkIiAgbWVhbnMgdGhhdCB0aGUgZHJpdmVyIGlzIHRyeWluZyB0byBkbyBpdHMKKyAqICAgICAgICAgICAgb3duIHRhZ2dpbmcgKGkuZS4gdGhlIHRjOnkgb3B0aW9uIGlzIGluIGVmZmVjdCk7CisgKiAgICAgICAgICAtICJ0YWdnZWQiIG1lYW5zIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyB0YWdnZWQgY29tbWFuZHMsCisgKiAgICAgICAgICAgIGJ1dCB0aGUgZHJpdmVyIGxldHMgdGhlIEhCQSBiZSByZXNwb25zaWJsZSBmb3IgdGFnZ2luZworICogICAgICAgICAgICBzdXBwb3J0LgorICoKKyAqICAgICAgMTYgU2VwIDE5OTkgUmV2LiA1LjExIGZvciBsaW51eCAyLjIuMTIgYW5kIDIuMy4xOAorICogICAgICAgICsgVXBkYXRlZCB0byB0aGUgbmV3IF9fc2V0dXAgaW50ZXJmYWNlIGZvciBib290IGNvbW1hbmQgbGluZSBvcHRpb25zLgorICogICAgICAgICsgV2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUsIGFjY2VwdHMgdGhlIG5ldyBwYXJhbWV0ZXIgYm9vdF9vcHRpb25zCisgKiAgICAgICAgICB3aGljaCB2YWx1ZSBpcyBhIHN0cmluZyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBvZiB0aGUga2VybmVsIGJvb3QKKyAqICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb25zLiBBIHZhbGlkIGV4YW1wbGUgaXM6CisgKiAgICAgICAgICBtb2Rwcm9iZSBlYXRhICdib290X29wdGlvbnM9IjB4NzQxMCwweDIzMCxsYzp5LHRjOm4sbXE6NCInCisgKgorICogICAgICAgOSBTZXAgMTk5OSBSZXYuIDUuMTAgZm9yIGxpbnV4IDIuMi4xMiBhbmQgMi4zLjE3CisgKiAgICAgICAgKyA2NGJpdCBjbGVhbnVwIGZvciBMaW51eC9BbHBoYSBwbGF0Zm9ybSBzdXBwb3J0CisgKiAgICAgICAgICAoY29udHJpYnV0aW9uIGZyb20gSC5KLiBMdSkuCisgKgorICogICAgICAyMiBKdWwgMTk5OSBSZXYuIDUuMDAgZm9yIGxpbnV4IDIuMi4xMCBhbmQgMi4zLjExCisgKiAgICAgICAgKyBSZW1vdmVkIHByZS0yLjIgc291cmNlIGNvZGUgY29tcGF0aWJpbGl0eS4KKyAqICAgICAgICArIEFkZGVkIGNhbGwgdG8gcGNpX3NldF9tYXN0ZXIuCisgKgorICogICAgICAyNiBKdWwgMTk5OCBSZXYuIDQuMzMgZm9yIGxpbnV4IDIuMC4zNSBhbmQgMi4xLjExMQorICogICAgICAgICsgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAocnM6W3l8bl0pIHRvIHJldmVyc2UgdGhlIHNjYW4gb3JkZXIKKyAqICAgICAgICAgIG9mIFBDSSBib2FyZHMuIFRoZSBkZWZhdWx0IGlzIHJzOnksIHdoaWNoIHJldmVyc2VzIHRoZSBCSU9TIG9yZGVyCisgKiAgICAgICAgICB3aGlsZSByZWdpc3RlcmluZyBQQ0kgYm9hcmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSByczp5IGdlbmVyYXRlcworICogICAgICAgICAgdGhlIHNhbWUgb3JkZXIgb2YgYWxsIHByZXZpb3VzIHJldmlzaW9ucyBvZiB0aGlzIGRyaXZlci4KKyAqICAgICAgICAgIFBscy4gbm90ZSB0aGF0ICJCSU9TIG9yZGVyIiBtaWdodCBoYXZlIGJlZW4gcmV2ZXJzZWQgaXRzZWxmCisgKiAgICAgICAgICBhZnRlciB0aGUgMi4xLjl4IFBDSSBtb2RpZmljYXRpb25zIGluIHRoZSBsaW51eCBrZXJuZWwuCisgKiAgICAgICAgICBUaGUgcnMgdmFsdWUgaXMgaWdub3JlZCB3aGVuIHRoZSBleHBsaWNpdCBsaXN0IG9mIGFkZHJlc3NlcworICogICAgICAgICAgaXMgdXNlZCBieSB0aGUgImVhdGE9cG9ydDAscG9ydDEsLi4uIiBjb21tYW5kIGxpbmUgb3B0aW9uLgorICogICAgICAgICsgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAoZXQ6W3l8bl0pIHRvIGZvcmNlIHVzZSBvZiBleHRlbmRlZAorICogICAgICAgICAgdHJhbnNsYXRpb24gKDI1NSBoZWFkcywgNjMgc2VjdG9ycykgYXMgZGlzayBnZW9tZXRyeS4KKyAqICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGV0Om4sIHdoaWNoIHVzZXMgdGhlIGRpc2sgZ2VvbWV0cnkgcmV0dXJuZWQKKyAqICAgICAgICAgIGJ5IHNjc2ljYW1fYmlvc19wYXJhbS4gVGhlIGRlZmF1bHQgdmFsdWUgZXQ6biBpcyBjb21wYXRpYmxlIHdpdGgKKyAqICAgICAgICAgIGFsbCBwcmV2aW91cyByZXZpc2lvbnMgb2YgdGhpcyBkcml2ZXIuCisgKgorICogICAgICAyOCBNYXkgMTk5OCBSZXYuIDQuMzIgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjEwNAorICogICAgICAgICAgSW5jcmVhc2VkIGJ1c3kgdGltZW91dCBmcm9tIDEwIG1zZWMuIHRvIDIwMCBtc2VjLiB3aGlsZQorICogICAgICAgICAgcHJvY2Vzc2luZyBpbnRlcnJ1cHRzLgorICoKKyAqICAgICAgMTYgTWF5IDE5OTggUmV2LiA0LjMxIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS4xMDIKKyAqICAgICAgICAgIEltcHJvdmVkIGFib3J0IGhhbmRsaW5nIGR1cmluZyB0aGUgZWggcmVjb3ZlcnkgcHJvY2Vzcy4KKyAqCisgKiAgICAgIDEzIE1heSAxOTk4IFJldi4gNC4zMCBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuMTAxCisgKiAgICAgICAgICBUaGUgZHJpdmVyIGlzIG5vdyBmdWxseSBTTVAgc2FmZSwgaW5jbHVkaW5nIHRoZQorICogICAgICAgICAgYWJvcnQgYW5kIHJlc2V0IHJvdXRpbmVzLgorICogICAgICAgICAgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGVoOlt5fG5dKSB0byBjaG9vc2UgYmV0d2VlbgorICogICAgICAgICAgbmV3X2VoX2NvZGUgYW5kIHRoZSBvbGQgc2NzaSBjb2RlLgorICogICAgICAgICAgSWYgbGludXggdmVyc2lvbiA+PSAyLjEuMTAxIHRoZSBkZWZhdWx0IGlzIGVoOnksIHdoaWxlIHRoZSBlaAorICogICAgICAgICAgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHByZXZpb3VzIHJlbGVhc2VzIGFuZCB0aGUgb2xkIHNjc2kgY29kZQorICogICAgICAgICAgaXMgdXNlZC4KKyAqCisgKiAgICAgIDE4IEFwciAxOTk4IFJldi4gNC4yMCBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTcKKyAqICAgICAgICAgIFJld29ya2VkIGludGVycnVwdCBoYW5kbGVyLgorICoKKyAqICAgICAgMTEgQXByIDE5OTggcmV2LiA0LjA1IGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45NQorICogICAgICAgICAgTWFqb3IgcmVsaWFiaWxpdHkgaW1wcm92ZW1lbnQ6IHdoZW4gYSBiYXRjaCB3aXRoIG92ZXJsYXBwaW5nCisgKiAgICAgICAgICByZXF1ZXN0cyBpcyBkZXRlY3RlZCwgcmVxdWVzdHMgYXJlIHF1ZXVlZCBvbmUgYXQgYSB0aW1lCisgKiAgICAgICAgICBlbGltaW5hdGluZyBhbnkgcG9zc2libGUgYm9hcmQgb3IgZHJpdmUgcmVvcmRlcmluZy4KKyAqCisgKiAgICAgIDEwIEFwciAxOTk4IHJldi4gNC4wNCBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTUKKyAqICAgICAgICAgIEltcHJvdmVkIFNNUCBzdXBwb3J0IChpZiBsaW51eCB2ZXJzaW9uID49IDIuMS45NSkuCisgKgorICogICAgICAgOSBBcHIgMTk5OCByZXYuIDQuMDMgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk0CisgKiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBuZXcgUENJIGNvZGUgYW5kIElPLUFQSUMgcmVtYXBwaW5nIG9mIGlycXMuCisgKiAgICAgICAgICBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogd2hlbiBzZXF1ZW50aWFsIGkvbyBpcyBkZXRlY3RlZCwKKyAqICAgICAgICAgIGFsd2F5cyB1c2UgZGlyZWN0IHNvcnQgaW5zdGVhZCBvZiByZXZlcnNlIHNvcnQuCisgKgorICogICAgICAgNCBBcHIgMTk5OCByZXYuIDQuMDIgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjkyCisgKiAgICAgICAgICBpb19wb3J0IGlzIG5vdyB1bnNpZ25lZCBsb25nLgorICoKKyAqICAgICAgMTcgTWFyIDE5OTggcmV2LiA0LjAxIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS44OAorICogICAgICAgICAgVXNlIG5ldyBzY3NpIGVycm9yIGhhbmRsaW5nIGNvZGUgKGlmIGxpbnV4IHZlcnNpb24gPj0gMi4xLjg4KS4KKyAqICAgICAgICAgIFVzZSBuZXcgaW50ZXJydXB0IGNvZGUuCisgKgorICogICAgICAxMiBTZXAgMTk5NyByZXYuIDMuMTEgZm9yIGxpbnV4IDIuMC4zMCBhbmQgMi4xLjU1CisgKiAgICAgICAgICBVc2Ugb2YgdWRlbGF5IGluc2lkZSB0aGUgd2FpdCBsb29wcyB0byBhdm9pZCB0aW1lb3V0CisgKiAgICAgICAgICBwcm9ibGVtcyB3aXRoIGZhc3QgY3B1cy4KKyAqICAgICAgICAgIFJlbW92ZWQgY2hlY2sgYWJvdXQgdXNlbGVzcyBjYWxscyB0byB0aGUgaW50ZXJydXB0IHNlcnZpY2UKKyAqICAgICAgICAgIHJvdXRpbmUgKHJlcG9ydGVkIG9uIFNNUCBzeXN0ZW1zIG9ubHkpLgorICogICAgICAgICAgQXQgaW5pdGlhbGl6YXRpb24gdGltZSAic29ydGVkL3Vuc29ydGVkIiBpcyBkaXNwbGF5ZWQgaW5zdGVhZAorICogICAgICAgICAgb2YgImxpbmtlZC91bmxpbmtlZCIgdG8gcmVpbmZvcmNlIHRoZSBmYWN0IHRoYXQgImxpbmtpbmciIGlzCisgKiAgICAgICAgICBub3RoaW5nIGJ1dCAiZWxldmF0b3Igc29ydGluZyIgaW4gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAgICAgIDE3IE1heSAxOTk3IHJldi4gMy4xMCBmb3IgbGludXggMi4wLjMwIGFuZCAyLjEuMzgKKyAqICAgICAgICAgIFVzZSBvZiBzZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgaW4gYWJvcnQgYW5kIHJlc2V0IHByb2Nlc3NpbmcuCisgKiAgICAgICAgICBVc2Ugb2YgdGhlIF9faW5pdGZ1bmMgYW5kIF9faW5pdGRhdGEgbWFjcm8gaW4gc2V0dXAgY29kZS4KKyAqICAgICAgICAgIE1pbm9yIGNsZWFudXBzIGluIHRoZSBsaXN0X3N0YXRpc3RpY3MgY29kZS4KKyAqICAgICAgICAgIEluY3JlYXNlZCBjb250cm9sbGVyIGJ1c3kgdGltZW91dCBpbiBvcmRlciB0byBiZXR0ZXIgc3VwcG9ydAorICogICAgICAgICAgc2xvdyBTQ1NJIGRldmljZXMuCisgKgorICogICAgICAyNCBGZWIgMTk5NyByZXYuIDMuMDAgZm9yIGxpbnV4IDIuMC4yOSBhbmQgMi4xLjI2CisgKiAgICAgICAgICBXaGVuIGxvYWRpbmcgYXMgYSBtb2R1bGUsIHBhcmFtZXRlciBwYXNzaW5nIGlzIG5vdyBzdXBwb3J0ZWQKKyAqICAgICAgICAgIGJvdGggaW4gMi4wIGFuZCBpbiAyLjEgc3R5bGUuCisgKiAgICAgICAgICBGaXhlZCBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiBmb3Igc29tZSBTQ1NJIG9wY29kZXMuCisgKiAgICAgICAgICBJbW1lZGlhdGUgYWNrbm93bGVkZ2UgdG8gcmVxdWVzdCBzZW5zZSBjb21tYW5kcy4KKyAqICAgICAgICAgIExpbmtlZCBjb21tYW5kcyB0byBlYWNoIGRpc2sgZGV2aWNlIGFyZSBub3cgcmVvcmRlcmVkIGJ5IGVsZXZhdG9yCisgKiAgICAgICAgICBzb3J0aW5nLiBSYXJlIGNhc2VzIGluIHdoaWNoIHJlb3JkZXJpbmcgb2Ygd3JpdGUgcmVxdWVzdHMgY291bGQKKyAqICAgICAgICAgIGNhdXNlIHdyb25nIHJlc3VsdHMgYXJlIG1hbmFnZWQuCisgKiAgICAgICAgICBGaXhlZCBzcHVyaW91cyB0aW1lb3V0cyBjYXVzZWQgYnkgbG9uZyBzaW1wbGUgcXVldWUgdGFnIHNlcXVlbmNlcy4KKyAqICAgICAgICAgIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uICh0bTpbMC0zXSkgdG8gY2hvb3NlIHRoZSB0eXBlIG9mIHRhZ3M6CisgKiAgICAgICAgICAwIC0+IG1peGVkIChkZWZhdWx0KTsgMSAtPiBzaW1wbGU7IDIgLT4gaGVhZDsgMyAtPiBvcmRlcmVkLgorICoKKyAqICAgICAgMTggSmFuIDE5OTcgcmV2LiAyLjYwIGZvciBsaW51eCAyLjEuMjEgYW5kIDIuMC4yOAorICogICAgICAgICAgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUgbGlua2VkIGNvbW1hbmRzCisgKiAgICAgICAgICAobGM6W3l8bl0pLCB0YWdnZWQgY29tbWFuZHMgKHRjOlt5fG5dKSBhbmQgdG8gc2V0IHRoZSBtYXggcXVldWUKKyAqICAgICAgICAgIGRlcHRoIChtcTp4eCkuIERlZmF1bHQgaXMgImVhdGE9bGM6bix0YzpuLG1xOjE2Ii4KKyAqICAgICAgICAgIEltcHJvdmVkIGNvbW1hbmQgbGlua2luZy4KKyAqICAgICAgICAgIERvY3VtZW50ZWQgaG93IHRvIHNldHVwIFJBSUQtMCB3aXRoIERQVCBTbWFydFJBSUQgYm9hcmRzLgorICoKKyAqICAgICAgIDggSmFuIDE5OTcgcmV2LiAyLjUwIGZvciBsaW51eCAyLjEuMjAgYW5kIDIuMC4yNworICogICAgICAgICAgQWRkZWQgbGlua2VkIGNvbW1hbmQgc3VwcG9ydC4KKyAqICAgICAgICAgIEltcHJvdmVkIGRldGVjdGlvbiBvZiBQQ0kgYm9hcmRzIHVzaW5nIElTQSBiYXNlIGFkZHJlc3Nlcy4KKyAqCisgKiAgICAgICAzIERlYyAxOTk2IHJldi4gMi40MCBmb3IgbGludXggMi4xLjE0IGFuZCAyLjAuMjcKKyAqICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRhZ2dlZCBjb21tYW5kcyBhbmQgcXVldWUgZGVwdGggYWRqdXN0bWVudC4KKyAqCisgKiAgICAgIDIyIE5vdiAxOTk2IHJldi4gMi4zMCBmb3IgbGludXggMi4xLjEyIGFuZCAyLjAuMjYKKyAqICAgICAgICAgIFdoZW4gQ09ORklHX1BDSSBpcyBkZWZpbmVkLCBCSU9TMzIgaXMgdXNlZCB0byBpbmNsdWRlIGluIHRoZQorICogICAgICAgICAgbGlzdCBvZiBpL28gcG9ydHMgdG8gYmUgcHJvYmVkIGFsbCB0aGUgUENJIFNDU0kgY29udHJvbGxlcnMuCisgKiAgICAgICAgICBUaGUgbGlzdCBvZiBpL28gcG9ydHMgdG8gYmUgcHJvYmVkIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUKKyAqICAgICAgICAgICJlYXRhPXBvcnQwLHBvcnQxLC4uLi4iIGJvb3QgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyAqICAgICAgICAgIFNjYXR0ZXIvZ2F0aGVyIGxpc3RzIGFyZSBub3cgYWxsb2NhdGVkIGJ5IGEgbnVtYmVyIG9mIGttYWxsb2MKKyAqICAgICAgICAgIGNhbGxzLCBpbiBvcmRlciB0byBhdm9pZCB0aGUgcHJldmlvdXMgc2l6ZSBsaW1pdCBvZiA2NEtiLgorICoKKyAqICAgICAgMTYgTm92IDE5OTYgcmV2LiAyLjIwIGZvciBsaW51eCAyLjEuMTAgYW5kIDIuMC4yNQorICogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgRUFUQSAyLjBDLCBQQ0ksIG11bHRpY2hhbm5lbCBhbmQgd2lkZSBTQ1NJLgorICoKKyAqICAgICAgMjcgU2VwIDE5OTYgcmV2LiAyLjEyIGZvciBsaW51eCAyLjEuMAorICogICAgICAgICAgUG9ydGFiaWxpdHkgY2xlYW51cHMgKHZpcnR1YWwvYnVzIGFkZHJlc3NpbmcsIGxpdHRsZS9iaWcgZW5kaWFuCisgKiAgICAgICAgICBzdXBwb3J0KS4KKyAqCisgKiAgICAgIDA5IEp1bCAxOTk2IHJldi4gMi4xMSBmb3IgbGludXggMi4wLjQKKyAqICAgICAgICAgIE51bWJlciBvZiBpbnRlcm5hbCByZXRyaWVzIGlzIG5vdyBsaW1pdGVkLgorICoKKyAqICAgICAgMTYgQXByIDE5OTYgcmV2LiAyLjEwIGZvciBsaW51eCAxLjMuOTAKKyAqICAgICAgICAgIE5ldyBhcmd1bWVudCAicmVzZXRfZmxhZ3MiIHRvIHRoZSByZXNldCByb3V0aW5lLgorICoKKyAqICAgICAgIDYgSnVsIDE5OTUgcmV2LiAyLjAxIGZvciBsaW51eCAxLjMuNworICogICAgICAgICAgVXBkYXRlIHJlcXVpcmVkIGJ5IHRoZSBuZXcgL3Byb2Mvc2NzaSBzdXBwb3J0LgorICoKKyAqICAgICAgMTEgTWFyIDE5OTUgcmV2LiAyLjAwIGZvciBsaW51eCAxLjIuMAorICogICAgICAgICAgRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIG1lZGlhIGNoYW5nZSBkZXRlY3Rpb24gZm9yIHJlbW92YWJsZQorICogICAgICAgICAgZGlzayBkcml2ZXMuCisgKgorICogICAgICAyMyBGZWIgMTk5NSByZXYuIDEuMTggZm9yIGxpbnV4IDEuMS45NAorICogICAgICAgICAgQWRkZWQgYSBjaGVjayBmb3Igc2NzaV9yZWdpc3RlciByZXR1cm5pbmcgTlVMTC4KKyAqCisgKiAgICAgIDExIEZlYiAxOTk1IHJldi4gMS4xNyBmb3IgbGludXggMS4xLjkxCisgKiAgICAgICAgICBOb3cgREVCVUdfUkVTRVQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAqICAgICAgICAgIFJlZ2lzdGVyIGEgYm9hcmQgZXZlbiBpZiBpdCBkb2VzIG5vdCBhc3NlcnQgRE1BIHByb3RvY29sIHN1cHBvcnQKKyAqICAgICAgICAgIChEUFQgU0syMDExQiBkb2VzIG5vdCByZXBvcnQgY29ycmVjdGx5IHRoZSBkbWFzdXAgYml0KS4KKyAqCisgKiAgICAgICA5IEZlYiAxOTk1IHJldi4gMS4xNiBmb3IgbGludXggMS4xLjkwCisgKiAgICAgICAgICBVc2UgaG9zdC0+d2lzaF9ibG9jayBpbnN0ZWFkIG9mIGhvc3QtPmJsb2NrLgorICogICAgICAgICAgTmV3IGxpc3Qgb2YgRGF0YSBPdXQgU0NTSSBjb21tYW5kcy4KKyAqCisgKiAgICAgICA4IEZlYiAxOTk1IHJldi4gMS4xNSBmb3IgbGludXggMS4xLjg5CisgKiAgICAgICAgICBDbGVhcmVkIHRhcmdldF90aW1lX291dCBjb3VudGVyIHdoaWxlIHBlcmZvcm1pbmcgYSByZXNldC4KKyAqICAgICAgICAgIEFsbCBleHRlcm5hbCBzeW1ib2xzIHJlbmFtZWQgdG8gYXZvaWQgcG9zc2libGUgbmFtZSBjb25mbGljdHMuCisgKgorICogICAgICAyOCBKYW4gMTk5NSByZXYuIDEuMTQgZm9yIGxpbnV4IDEuMS44NgorICogICAgICAgICAgQWRkZWQgbW9kdWxlIHN1cHBvcnQuCisgKiAgICAgICAgICBMb2cgYW5kIGRvIGEgcmV0cnkgd2hlbiBhIGRpc2sgZHJpdmUgcmV0dXJucyBhIHRhcmdldCBzdGF0dXMKKyAqICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHplcm8gb24gYSByZWNvdmVyZWQgZXJyb3IuCisgKgorICogICAgICAyNCBKYW4gMTk5NSByZXYuIDEuMTMgZm9yIGxpbnV4IDEuMS44NQorICogICAgICAgICAgVXNlIG9wdGltaXplZCBib2FyZCBjb25maWd1cmF0aW9uLCB3aXRoIGEgbWVhc3VyZWQgcGVyZm9ybWFuY2UKKyAqICAgICAgICAgIGluY3JlYXNlIGluIHRoZSByYW5nZSAxMCUtMjAlIG9uIGkvbyB0aHJvdWdocHV0LgorICoKKyAqICAgICAgMTYgSmFuIDE5OTUgcmV2LiAxLjEyIGZvciBsaW51eCAxLjEuODEKKyAqICAgICAgICAgIEZpeCBtc2NwIHN0cnVjdHVyZSBjb21tZW50cyAobm8gZnVuY3Rpb25hbCBjaGFuZ2UpLgorICogICAgICAgICAgRGlzcGxheSBhIG1lc3NhZ2UgaWYgY2hlY2tfcmVnaW9uIGRldGVjdHMgYSBwb3J0IGFkZHJlc3MKKyAqICAgICAgICAgIGFscmVhZHkgaW4gdXNlLgorICoKKyAqICAgICAgMTcgRGVjIDE5OTQgcmV2LiAxLjExIGZvciBsaW51eCAxLjEuNzQKKyAqICAgICAgICAgIFVzZSB0aGUgc2NzaWNhbV9iaW9zX3BhcmFtIHJvdXRpbmUuIFRoaXMgYWxsb3dzIGFuIGVhc3kKKyAqICAgICAgICAgIG1pZ3JhdGlvbiBwYXRoIGZyb20gZGlzayBwYXJ0aXRpb24gdGFibGVzIGNyZWF0ZWQgdXNpbmcKKyAqICAgICAgICAgIGRpZmZlcmVudCBTQ1NJIGRyaXZlcnMgYW5kIG5vbiBvcHRpbWFsIGRpc2sgZ2VvbWV0cnkuCisgKgorICogICAgICAxNSBEZWMgMTk5NCByZXYuIDEuMTAgZm9yIGxpbnV4IDEuMS43NAorICogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSVNBIEVBVEEgYm9hcmRzIChEUFQgUE0yMDExLCBEUFQgUE0yMDIxKS4KKyAqICAgICAgICAgIFRoZSBob3N0LT5ibG9jayBmbGFnIGlzIHNldCBmb3IgYWxsIHRoZSBkZXRlY3RlZCBJU0EgYm9hcmRzLgorICogICAgICAgICAgVGhlIGRldGVjdCByb3V0aW5lIG5vIGxvbmdlciBlbmZvcmNlcyBMRVZFTCB0cmlnZ2VyaW5nCisgKiAgICAgICAgICBmb3IgRUlTQSBib2FyZHMsIGl0IGp1c3QgcHJpbnRzIGEgd2FybmluZyBtZXNzYWdlLgorICoKKyAqICAgICAgMzAgTm92IDE5OTQgcmV2LiAxLjA5IGZvciBsaW51eCAxLjEuNjgKKyAqICAgICAgICAgIFJlZG8gaS9vIG9uIHRhcmdldCBzdGF0dXMgQ0hFQ0tfQ09ORElUSU9OIGZvciBUWVBFX0RJU0sgb25seS4KKyAqICAgICAgICAgIEFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIHVzaW5nIGEgc2luZ2xlIGJvYXJkIGF0IGEgdGltZS4KKyAqCisgKiAgICAgIDE4IE5vdiAxOTk0IHJldi4gMS4wOCBmb3IgbGludXggMS4xLjY0CisgKiAgICAgICAgICBGb3JjZXMgc2dfdGFibGVzaXplID0gNjQgYW5kIGNhbl9xdWV1ZSA9IDY0IGlmIHRoZXNlCisgKiAgICAgICAgICB2YWx1ZXMgYXJlIG5vdCBjb3JyZWN0bHkgZGV0ZWN0ZWQgKERQVCBQTTIwMTIpLgorICoKKyAqICAgICAgMTQgTm92IDE5OTQgcmV2LiAxLjA3IGZvciBsaW51eCAxLjEuNjMgIEZpbmFsIEJFVEEgcmVsZWFzZS4KKyAqICAgICAgMDQgQXVnIDE5OTQgcmV2LiAxLjAwIGZvciBsaW51eCAxLjEuMzkgIEZpcnN0IEJFVEEgcmVsZWFzZS4KKyAqCisgKgorICogICAgICAgICAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIENBTSAoQ29tbW9uIEFjY2VzcyBNZXRob2QgQ29tbWl0dGVlKQorICogICAgICAgICAgRUFUQSAoRW5oYW5jZWQgQVQgQnVzIEF0dGFjaG1lbnQpIHJldi4gMi4wQSwgdXNpbmcgRE1BIHByb3RvY29sLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMyBEYXJpbyBCYWxsYWJpbyAoYmFsbGFiaW9fZGFyaW9AZW1jLmNvbSkKKyAqCisgKiAgQWx0ZXJuYXRlIGVtYWlsOiBkYXJpby5iYWxsYWJpb0BpbndpbmQuaXQsIGRhcmlvLmJhbGxhYmlvQHRpc2NhbGluZXQuaXQKKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogIG1vZGlmaWNhdGlvbi4KKyAqCisgKi8KKworLyoKKyAqCisgKiAgSGVyZSBpcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBEUFQgU0NTSSBob3N0IGFkYXB0ZXJzLgorICogIEFsbCB0aGVzZSBib2FyZHMgcHJvdmlkZSBhbiBFQVRBL0RNQSBjb21wYXRpYmxlIHByb2dyYW1taW5nIGludGVyZmFjZQorICogIGFuZCBhcmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyIGluIGFueSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKKyAqICBtdWx0aXBsZSBTQ1NJIGNoYW5uZWxzOgorICoKKyAqICBQTTIwMTFCLzlYIC0gIEVudHJ5IExldmVsIElTQQorICogIFBNMjAyMUEvOVggLSAgSGlnaCBQZXJmb3JtYW5jZSBJU0EKKyAqICBQTTIwMTJBICAgICAgIE9sZCBFSVNBCisgKiAgUE0yMDEyQiAgICAgICBPbGQgRUlTQQorICogIFBNMjAyMkEvOVggLSAgRW50cnkgTGV2ZWwgRUlTQQorICogIFBNMjEyMkEvOVggLSAgSGlnaCBQZXJmb3JtYW5jZSBFSVNBCisgKiAgUE0yMzIyQS85WCAtICBFeHRyYSBIaWdoIFBlcmZvcm1hbmNlIEVJU0EKKyAqICBQTTMwMjEgICAgIC0gIFNtYXJ0UkFJRCBBZGFwdGVyIGZvciBJU0EKKyAqICBQTTMyMjIgICAgIC0gIFNtYXJ0UkFJRCBBZGFwdGVyIGZvciBFSVNBIChQTTMyMjJXIGlzIDE2LWJpdCB3aWRlIFNDU0kpCisgKiAgUE0zMjI0ICAgICAtICBTbWFydFJBSUQgQWRhcHRlciBmb3IgUENJICAoUE0zMjI0VyBpcyAxNi1iaXQgd2lkZSBTQ1NJKQorICogIFBNMzMzNDBVVyAgLSAgU21hcnRSQUlEIEFkYXB0ZXIgZm9yIFBDSSAgdWx0cmEgd2lkZSBtdWx0aWNoYW5uZWwKKyAqCisgKiAgVGhlIGFib3ZlIGxpc3QgaXMganVzdCBhbiBpbmRpY2F0aW9uOiBhcyBhIG1hdHRlciBvZiBmYWN0IGFsbCBEUFQKKyAqICBib2FyZHMgdXNpbmcgdGhlIEVBVEEvRE1BIHByb3RvY29sIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsCisgKiAgc2luY2UgdGhleSB1c2UgZXhhY3RlbHkgdGhlIHNhbWUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgorICoKKyAqICBUaGUgRFBUIFBNMjAwMSBwcm92aWRlcyBvbmx5IHRoZSBFQVRBL1BJTyBpbnRlcmZhY2UgYW5kIGhlbmNlIGlzIG5vdAorICogIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyAqCisgKiAgVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHVwIHRvIDMgRGlzdHJpYnV0ZWQgUHJvY2Vzc2luZyBUZWNobm9sb2d5CisgKiAgUE0yMTIyQS85WCAoRFBUIFNDU0kgQklPUyB2MDAyLkQxLCBmaXJtd2FyZSB2MDVFLjApIEVJU0EgY29udHJvbGxlcnMsCisgKiAgaW4gYW55IGNvbWJpbmF0aW9uIG9mIHByaXZhdGUgYW5kIHNoYXJlZCBJUlEuCisgKiAgUENJIHN1cHBvcnQgaGFzIGJlZW4gdGVzdGVkIHVzaW5nIHVwIHRvIDIgRFBUIFBNMzIyNFcgKERQVCBTQ1NJIEJJT1MKKyAqICB2MDAzLkQwLCBmaXJtd2FyZSB2MDdHLjApLgorICoKKyAqICBEUFQgU21hcnRSQUlEIGJvYXJkcyBzdXBwb3J0ICJIYXJkd2FyZSBBcnJheSIgLSBhIGdyb3VwIG9mIGRpc2sgZHJpdmVzCisgKiAgd2hpY2ggYXJlIGFsbCBtZW1iZXJzIG9mIHRoZSBzYW1lIFJBSUQtMCwgUkFJRC0xIG9yIFJBSUQtNSBhcnJheSBpbXBsZW1lbnRlZAorICogIGluIGhvc3QgYWRhcHRlciBoYXJkd2FyZS4gSGFyZHdhcmUgQXJyYXlzIGFyZSBmdWxseSBjb21wYXRpYmxlIHdpdGggdGhpcworICogIGRyaXZlciwgc2luY2UgdGhleSBsb29rIHRvIGl0IGFzIGEgc2luZ2xlIGRpc2sgZHJpdmUuCisgKgorICogIFdBUk5JTkc6IHRvIGNyZWF0ZSBhIFJBSUQtMCAiSGFyZHdhcmUgQXJyYXkiIHlvdSBtdXN0IHNlbGVjdCAiT3RoZXIgVW5peCIKKyAqICBhcyB0aGUgY3VycmVudCBPUyBpbiB0aGUgRFBUTUdSICJJbml0aWFsIFN5c3RlbSBJbnN0YWxsYXRpb24iIG1lbnUuCisgKiAgT3RoZXJ3aXNlIFJBSUQtMCBpcyBnZW5lcmF0ZWQgYXMgYW4gIkFycmF5IEdyb3VwIiAoaS5lLiBzb2Z0d2FyZSBSQUlELTApLAorICogIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGFjdHVhbCBTQ1NJIHN1YnN5c3RlbS4KKyAqICBUbyBnZXQgdGhlICJBcnJheSBHcm91cCIgZnVuY3Rpb25hbGl0eSwgdGhlIExpbnV4IE1EIGRyaXZlciBtdXN0IGJlIHVzZWQKKyAqICBpbnN0ZWFkIG9mIHRoZSBEUFQgIkFycmF5IEdyb3VwIiBmZWF0dXJlLgorICoKKyAqICBNdWx0aXBsZSBJU0EsIEVJU0EgYW5kIFBDSSBib2FyZHMgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIHNhbWUgc3lzdGVtLgorICogIEl0IGlzIHN1Z2dlc3RlZCB0byBwdXQgYWxsIHRoZSBFSVNBIGJvYXJkcyBvbiB0aGUgc2FtZSBJUlEgbGV2ZWwsIGFsbAorICogIHRoZSBQQ0kgIGJvYXJkcyBvbiBhbm90aGVyIElSUSBsZXZlbCwgd2hpbGUgSVNBIGJvYXJkcyBjYW5ub3Qgc2hhcmUKKyAqICBpbnRlcnJ1cHRzLgorICoKKyAqICBJZiB5b3UgY29uZmlndXJlIG11bHRpcGxlIGJvYXJkcyBvbiB0aGUgc2FtZSBJUlEsIHRoZSBpbnRlcnJ1cHQgbXVzdAorICogIGJlIF9sZXZlbF8gdHJpZ2dlcmVkIChub3QgX2VkZ2VfIHRyaWdnZXJlZCkuCisgKgorICogIFRoaXMgZHJpdmVyIGRldGVjdHMgRUFUQSBib2FyZHMgYnkgcHJvYmVzIGF0IGZpeGVkIHBvcnQgYWRkcmVzc2VzLAorICogIHNvIG5vIEJJT1MzMiBvciBQQ0kgQklPUyBzdXBwb3J0IGlzIHJlcXVpcmVkLgorICogIFRoZSBzdWdnZXN0ZWQgd2F5IHRvIGRldGVjdCBhIGdlbmVyaWMgRUFUQSBQQ0kgYm9hcmQgaXMgdG8gZm9yY2Ugb24gaXQKKyAqICBhbnkgdW51c2VkIEVJU0EgYWRkcmVzcywgZXZlbiBpZiB0aGVyZSBhcmUgb3RoZXIgY29udHJvbGxlcnMgb24gdGhlIEVJU0EKKyAqICBidXMsIG9yIGV2ZW4gaWYgeW91IHN5c3RlbSBoYXMgbm8gRUlTQSBidXMgYXQgYWxsLgorICogIERvIG5vdCBmb3JjZSBhbnkgSVNBIGFkZHJlc3Mgb24gRUFUQSBQQ0kgYm9hcmRzLgorICoKKyAqICBJZiBQQ0kgYmlvcyBzdXBwb3J0IGlzIGNvbmZpZ3VyZWQgaW50byB0aGUga2VybmVsLCBCSU9TMzIgaXMgdXNlZCB0bworICogIGluY2x1ZGUgaW4gdGhlIGxpc3Qgb2YgaS9vIHBvcnRzIHRvIGJlIHByb2JlZCBhbGwgdGhlIFBDSSBTQ1NJIGNvbnRyb2xsZXJzLgorICoKKyAqICBEdWUgdG8gYSBEUFQgQklPUyAiZmVhdHVyZSIsIGl0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSB0byBmb3JjZSBhbiBFSVNBCisgKiAgYWRkcmVzcyBvbiBtb3JlIHRoYW4gYSBzaW5nbGUgRFBUIFBDSSBib2FyZCwgc28gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvCisgKiAgbGV0IHRoZSBQQ0kgQklPUyBhc3NpZ24gdGhlIGFkZHJlc3Nlcy4KKyAqCisgKiAgVGhlIHNlcXVlbmNlIG9mIGRldGVjdGlvbiBwcm9iZXMgaXM6CisgKgorICogIC0gSVNBIDB4MUYwOworICogIC0gUENJIFNDU0kgY29udHJvbGxlcnMgKG9ubHkgaWYgQklPUzMyIGlzIGF2YWlsYWJsZSk7CisgKiAgLSBFSVNBL1BDSSAweDFDODggdGhyb3VnaCAweEZDODggKGNvcnJlc3BvbmRpbmcgdG8gRUlTQSBzbG90cyAxIHRvIDE1KTsKKyAqICAtIElTQSAgMHgxNzAsIDB4MjMwLCAweDMzMC4KKyAqCisgKiAgVGhlIGFib3ZlIGxpc3Qgb2YgZGV0ZWN0aW9uIHByb2JlcyBjYW4gYmUgdG90YWxseSByZXBsYWNlZCBieSB0aGUKKyAqICBib290IGNvbW1hbmQgbGluZSBvcHRpb246ICJlYXRhPXBvcnQwLHBvcnQxLHBvcnQyLC4uLiIsIHdoZXJlIHRoZQorICogIHBvcnQwLCBwb3J0MS4uLiBhcmd1bWVudHMgYXJlIElTQS9FSVNBL1BDSSBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLgorICogIEZvciBleGFtcGxlIHVzaW5nICJlYXRhPTB4NzQxMCwweDc0NTAsMHgyMzAiLCB0aGUgZHJpdmVyIHByb2JlcworICogIG9ubHkgdGhlIHR3byBQQ0kgYWRkcmVzc2VzIDB4NzQxMCBhbmQgMHg3NDUwIGFuZCB0aGUgSVNBIGFkZHJlc3MgMHgyMzAsCisgKiAgaW4gdGhpcyBvcmRlcjsgImVhdGE9MCIgdG90YWxseSBkaXNhYmxlcyB0aGlzIGRyaXZlci4KKyAqCisgKiAgQWZ0ZXIgdGhlIG9wdGlvbmFsIGxpc3Qgb2YgZGV0ZWN0aW9uIHByb2Jlcywgb3RoZXIgcG9zc2libGUgY29tbWFuZCBsaW5lCisgKiAgb3B0aW9ucyBhcmU6CisgKgorICogIGV0OnkgIGZvcmNlIHVzZSBvZiBleHRlbmRlZCB0cmFuc2xhdGlvbiAoMjU1IGhlYWRzLCA2MyBzZWN0b3JzKTsKKyAqICBldDpuICB1c2UgZGlzayBnZW9tZXRyeSBkZXRlY3RlZCBieSBzY3NpY2FtX2Jpb3NfcGFyYW07CisgKiAgcnM6eSAgcmV2ZXJzZSBzY2FuIG9yZGVyIHdoaWxlIGRldGVjdGluZyBQQ0kgYm9hcmRzOworICogIHJzOm4gIHVzZSBCSU9TIG9yZGVyIHdoaWxlIGRldGVjdGluZyBQQ0kgYm9hcmRzOworICogIGxjOnkgIGVuYWJsZXMgbGlua2VkIGNvbW1hbmRzOworICogIGxjOm4gIGRpc2FibGVzIGxpbmtlZCBjb21tYW5kczsKKyAqICB0bTowICBkaXNhYmxlcyB0YWdnZWQgY29tbWFuZHMgKHNhbWUgYXMgdGM6bik7CisgKiAgdG06MSAgdXNlIHNpbXBsZSBxdWV1ZSB0YWdzIChzYW1lIGFzIHRjOnkpOworICogIHRtOjIgIHVzZSBvcmRlcmVkIHF1ZXVlIHRhZ3MgKHNhbWUgYXMgdGM6Mik7CisgKiAgbXE6eHggc2V0IHRoZSBtYXggcXVldWUgZGVwdGggdG8gdGhlIHZhbHVlIHh4ICgyIDw9IHh4IDw9IDMyKS4KKyAqCisgKiAgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICJlYXRhPWxjOm4sbXE6MTYsdG06MCxldDpuLHJzOm4iLgorICogIEFuIGV4YW1wbGUgdXNpbmcgdGhlIGxpc3Qgb2YgZGV0ZWN0aW9uIHByb2JlcyBjb3VsZCBiZToKKyAqICAiZWF0YT0weDc0MTAsMHgyMzAsbGM6eSx0bToyLG1xOjQsZXQ6biIuCisgKgorICogIFdoZW4gbG9hZGluZyBhcyBhIG1vZHVsZSwgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGFzIHdlbGwuCisgKiAgVGhlIGFib3ZlIGV4YW1wbGUgd291bGQgYmUgKHVzZSAxIGluIHBsYWNlIG9mIHkgYW5kIDAgaW4gcGxhY2Ugb2Ygbik6CisgKgorICogIG1vZHByb2JlIGVhdGEgaW9fcG9ydD0weDc0MTAsMHgyMzAgbGlua2VkX2NvbW09MSBcCisgKiAgICAgICAgICAgICAgICBtYXhfcXVldWVfZGVwdGg9NCBleHRfdHJhbj0wIHRhZ19tb2RlPTIgXAorICogICAgICAgICAgICAgICAgcmV2X3NjYW49MQorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgbGlua2VkIGNvbW1hbmRzIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggYW55IERJU0sKKyAqICBvciBDRC1ST00sIHNpbmNlIHRoaXMgbGlua2luZyBoYXMgb25seSB0aGUgaW50ZW50IG9mIGNsdXN0ZXJpbmcgKHRpbWUtd2lzZSkKKyAqICBhbmQgcmVvcmRlcmluZyBieSBlbGV2YXRvciBzb3J0aW5nIGNvbW1hbmRzIGRpcmVjdGVkIHRvIGVhY2ggZGV2aWNlLAorICogIHdpdGhvdXQgYW55IHJlbGF0aW9uIHdpdGggdGhlIGFjdHVhbCBTQ1NJIHByb3RvY29sIGJldHdlZW4gdGhlIGNvbnRyb2xsZXIKKyAqICBhbmQgdGhlIGRldmljZS4KKyAqICBJZiBRIGlzIHRoZSBxdWV1ZSBkZXB0aCByZXBvcnRlZCBhdCBib290IHRpbWUgZm9yIGVhY2ggZGV2aWNlIChhbHNvIG5hbWVkCisgKiAgY21kcy9sdW4pIGFuZCBRID4gMiwgd2hlbmV2ZXIgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgY29tbWFuZCB0byB0aGUKKyAqICBkZXZpY2UgYWxsIG90aGVyIGNvbW1hbmRzIHRvIHRoZSBzYW1lIGRldmljZSAgKHVwIHRvIFEtMSkgYXJlIGtlcHQgd2FpdGluZworICogIGluIHRoZSBlbGV2YXRvciBzb3J0aW5nIHF1ZXVlLiBXaGVuIHRoZSBhY3RpdmUgY29tbWFuZCBjb21wbGV0ZXMsIHRoZQorICogIGNvbW1hbmRzIGluIHRoaXMgcXVldWUgYXJlIHNvcnRlZCBieSBzZWN0b3IgYWRkcmVzcy4gVGhlIHNvcnQgaXMgY2hvc2VuCisgKiAgYmV0d2VlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgYnkgbWluaW1pemluZyB0aGUgc2VlayBkaXN0YW5jZSBiZXR3ZWVuCisgKiAgdGhlIHNlY3RvciBvZiB0aGUgY29tbWFuZHMganVzdCBjb21wbGV0ZWQgYW5kIHRoZSBzZWN0b3Igb2YgdGhlIGZpcnN0CisgKiAgY29tbWFuZCBpbiB0aGUgbGlzdCB0byBiZSBzb3J0ZWQuCisgKiAgVHJpdmlhbCBtYXRoIGFzc3VyZXMgdGhhdCB0aGUgdW5zb3J0ZWQgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIHdoZW4gZG9pbmcKKyAqICByYW5kb20gc2Vla3Mgb3ZlciBTIHNlY3RvcnMgaXMgUy8zLgorICogIFdoZW4gKFEtMSkgcmVxdWVzdHMgYXJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBvdmVyIFMgc2VjdG9ycywgdGhlIGF2ZXJhZ2UKKyAqICBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhZGphY2VudCByZXF1ZXN0cyBpcyBTLygoUS0xKSArIDEpLCBzbyB0aGUgc29ydGVkCisgKiAgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIGZvciAoUS0xKSByYW5kb20gcmVxdWVzdHMgb3ZlciBTIHNlY3RvcnMgaXMgUy9RLgorICogIFRoZSBlbGV2YXRvciBzb3J0aW5nIGhlbmNlIGRpdmlkZXMgdGhlIHNlZWsgZGlzdGFuY2UgYnkgYSBmYWN0b3IgUS8zLgorICogIFRoZSBhYm92ZSBwdXJlIGdlb21ldHJpYyByZW1hcmtzIGFyZSB2YWxpZCBpbiBhbGwgY2FzZXMgYW5kIHRoZQorICogIGRyaXZlciBlZmZlY3RpdmVseSByZWR1Y2VzIHRoZSBzZWVrIGRpc3RhbmNlIGJ5IHRoZSBwcmVkaWN0ZWQgZmFjdG9yCisgKiAgd2hlbiB0aGVyZSBhcmUgUSBjb25jdXJyZW50IHJlYWQgaS9vIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZSwgYnV0IHRoaXMKKyAqICBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXN1bHRzIGluIGEgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDoKKyAqICB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuLi4uCisgKgorICogIE5vdGU6IGNvbW1hbmQgcmVvcmRlcmluZyBpbnNpZGUgYSBiYXRjaCBvZiBxdWV1ZWQgY29tbWFuZHMgY291bGQgY2F1c2UKKyAqICAgICAgICB3cm9uZyByZXN1bHRzIG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHdyaXRlIHJlcXVlc3QgYW5kIHRoZQorICogICAgICAgIGludGVyc2VjdGlvbiAoc2VjdG9yLXdpc2UpIG9mIGFsbCByZXF1ZXN0cyBpcyBub3QgZW1wdHkuCisgKiAgICAgICAgV2hlbiB0aGUgZHJpdmVyIGRldGVjdHMgYSBiYXRjaCBpbmNsdWRpbmcgb3ZlcmxhcHBpbmcgcmVxdWVzdHMKKyAqICAgICAgICAoYSByZWFsbHkgcmFyZSBldmVudCkgc3RyaWN0IHNlcmlhbCAocGlkKSBvcmRlciBpcyBlbmZvcmNlZC4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIG9wdGlvbiAoZXQ6eSkgaXMgdXNlZnVsIHdoZW4gdXNpbmcgbGFyZ2UgcGh5c2ljYWwKKyAqICBkaXNrcy9hcnJheXMuIEl0IGNvdWxkIGFsc28gYmUgdXNlZnVsIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gQWRhcHRlYyBib2FyZHMKKyAqICBhbmQgRFBUIGJvYXJkcyB3aXRob3V0IHJlZm9ybWF0dGluZyB0aGUgZGlzay4KKyAqICBXaGVuIGEgYm9vdCBkaXNrIGlzIHBhcnRpdGlvbmVkIHdpdGggZXh0ZW5kZWQgdHJhbnNsYXRpb24sIGluIG9yZGVyIHRvCisgKiAgYmUgYWJsZSB0byBib290IGl0IHdpdGggYSBEUFQgYm9hcmQgaXMgY291bGQgYmUgbmVjZXNzYXJ5IHRvIGFkZCB0bworICogIGxpbG8uY29uZiBhZGRpdGlvbmFsIGNvbW1hbmRzIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAqCisgKiAgZml4LXRhYmxlCisgKiAgZGlzaz0vZGV2L3NkYSBiaW9zPTB4ODAgc2VjdG9ycz02MyBoZWFkcz0xMjggY3lsaW5kcmVzPTU0NgorICoKKyAqICB3aGVyZSB0aGUgYWJvdmUgZ2VvbWV0cnkgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZSByZXBvcnRlZCBhdAorICogIHBvd2VyIHVwIGJ5IHRoZSBEUFQgY29udHJvbGxlci4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoZSBib2FyZHMgYXJlIG5hbWVkIEVBVEEwLCBFQVRBMSwuLi4gYWNjb3JkaW5nIHRvIHRoZSBkZXRlY3Rpb24gb3JkZXIuCisgKgorICogIEluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgSVNBIGJvYXJkcyBpbiBhIHJlbGlhYmxlIHdheSwKKyAqICB0aGUgZHJpdmVyIHNldHMgaG9zdC0+d2lzaF9ibG9jayA9IDEgZm9yIGFsbCBJU0EgYm9hcmRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCitzdGF0aWMgaW50IGVhdGEyeF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgZWF0YTJ4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgZWF0YTJ4X3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosCisJCQkgICAgICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgZWF0YTJ4X2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IGVhdGEyeF9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IGVhdGEyeF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCQkgICAgIHNlY3Rvcl90LCBpbnQgKik7CitzdGF0aWMgaW50IGVhdGEyeF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICopOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAiRUFUQS9ETUEgMi4weCByZXYuIDguMTAuMDAgIiwKKwkuZGV0ZWN0ID0gZWF0YTJ4X2RldGVjdCwKKwkucmVsZWFzZSA9IGVhdGEyeF9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQgPSBlYXRhMnhfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gZWF0YTJ4X2VoX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IE5VTEwsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gTlVMTCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gZWF0YTJ4X2VoX2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0gPSBlYXRhMnhfYmlvc19wYXJhbSwKKwkuc2xhdmVfY29uZmlndXJlID0gZWF0YTJ4X3NsYXZlX2NvbmZpZ3VyZSwKKwkudGhpc19pZCA9IDcsCisJLnVuY2hlY2tlZF9pc2FfZG1hID0gMSwKKwkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworI2lmICFkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkgJiYgIWRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorI2Vycm9yICJBZGp1c3QgeW91ciA8YXNtL2J5dGVvcmRlci5oPiBkZWZpbmVzIgorI2VuZGlmCisKKy8qIFN1YnZlcnNpb24gdmFsdWVzICovCisjZGVmaW5lIElTQSAgMAorI2RlZmluZSBFU0EgMQorCisjdW5kZWYgIEZPUkNFX0NPTkZJRworCisjdW5kZWYgIERFQlVHX0xJTktFRF9DT01NQU5EUworI3VuZGVmICBERUJVR19ERVRFQ1QKKyN1bmRlZiAgREVCVUdfUENJX0RFVEVDVAorI3VuZGVmICBERUJVR19JTlRFUlJVUFQKKyN1bmRlZiAgREVCVUdfUkVTRVQKKyN1bmRlZiAgREVCVUdfR0VORVJBVEVfRVJST1JTCisjdW5kZWYgIERFQlVHX0dFTkVSQVRFX0FCT1JUUworI3VuZGVmICBERUJVR19HRU9NRVRSWQorCisjZGVmaW5lIE1BWF9JU0EgNAorI2RlZmluZSBNQVhfVkVTQSAwCisjZGVmaW5lIE1BWF9FSVNBIDE1CisjZGVmaW5lIE1BWF9QQ0kgMTYKKyNkZWZpbmUgTUFYX0JPQVJEUyAoTUFYX0lTQSArIE1BWF9WRVNBICsgTUFYX0VJU0EgKyBNQVhfUENJKQorI2RlZmluZSBNQVhfQ0hBTk5FTCA0CisjZGVmaW5lIE1BWF9MVU4gMzIKKyNkZWZpbmUgTUFYX1RBUkdFVCAzMgorI2RlZmluZSBNQVhfTUFJTEJPWEVTIDY0CisjZGVmaW5lIE1BWF9TR0xJU1QgNjQKKyNkZWZpbmUgTUFYX0xBUkdFX1NHTElTVCAxMjIKKyNkZWZpbmUgTUFYX0lOVEVSTkFMX1JFVFJJRVMgNjQKKyNkZWZpbmUgTUFYX0NNRF9QRVJfTFVOIDIKKyNkZWZpbmUgTUFYX1RBR0dFRF9DTURfUEVSX0xVTiAoTUFYX01BSUxCT1hFUyAtIE1BWF9DTURfUEVSX0xVTikKKworI2RlZmluZSBTS0lQIFVMT05HX01BWAorI2RlZmluZSBGUkVFIDAKKyNkZWZpbmUgSU5fVVNFICAgMQorI2RlZmluZSBMT0NLRUQgICAyCisjZGVmaW5lIElOX1JFU0VUIDMKKyNkZWZpbmUgSUdOT1JFICAgNAorI2RlZmluZSBSRUFEWSAgICA1CisjZGVmaW5lIEFCT1JUSU5HIDYKKyNkZWZpbmUgTk9fRE1BICAweGZmCisjZGVmaW5lIE1BWExPT1AgIDEwMDAwCisjZGVmaW5lIFRBR19ESVNBQkxFRCAwCisjZGVmaW5lIFRBR19TSU1QTEUgICAxCisjZGVmaW5lIFRBR19PUkRFUkVEICAyCisKKyNkZWZpbmUgUkVHX0NNRCAgICAgICAgIDcKKyNkZWZpbmUgUkVHX1NUQVRVUyAgICAgIDcKKyNkZWZpbmUgUkVHX0FVWF9TVEFUVVMgIDgKKyNkZWZpbmUgUkVHX0RBVEEgICAgICAgIDAKKyNkZWZpbmUgUkVHX0RBVEEyICAgICAgIDEKKyNkZWZpbmUgUkVHX1NFRSAgICAgICAgIDYKKyNkZWZpbmUgUkVHX0xPVyAgICAgICAgIDIKKyNkZWZpbmUgUkVHX0xNICAgICAgICAgIDMKKyNkZWZpbmUgUkVHX01JRCAgICAgICAgIDQKKyNkZWZpbmUgUkVHX01TQiAgICAgICAgIDUKKyNkZWZpbmUgUkVHSU9OX1NJWkUgICAgIDlVTAorI2RlZmluZSBNQVhfSVNBX0FERFIgICAgMHgwM2ZmCisjZGVmaW5lIE1JTl9FSVNBX0FERFIgICAweDFjODgKKyNkZWZpbmUgTUFYX0VJU0FfQUREUiAgIDB4ZmM4OAorI2RlZmluZSBCU1lfQVNTRVJURUQgICAgICAweDgwCisjZGVmaW5lIERSUV9BU1NFUlRFRCAgICAgIDB4MDgKKyNkZWZpbmUgQUJTWV9BU1NFUlRFRCAgICAgMHgwMQorI2RlZmluZSBJUlFfQVNTRVJURUQgICAgICAweDAyCisjZGVmaW5lIFJFQURfQ09ORklHX1BJTyAgIDB4ZjAKKyNkZWZpbmUgU0VUX0NPTkZJR19QSU8gICAgMHhmMQorI2RlZmluZSBTRU5EX0NQX1BJTyAgICAgICAweGYyCisjZGVmaW5lIFJFQ0VJVkVfU1BfUElPICAgIDB4ZjMKKyNkZWZpbmUgVFJVTkNBVEVfWEZSX1BJTyAgMHhmNAorI2RlZmluZSBSRVNFVF9QSU8gICAgICAgICAweGY5CisjZGVmaW5lIFJFQURfQ09ORklHX0RNQSAgIDB4ZmQKKyNkZWZpbmUgU0VUX0NPTkZJR19ETUEgICAgMHhmZQorI2RlZmluZSBTRU5EX0NQX0RNQSAgICAgICAweGZmCisjZGVmaW5lIEFTT0sgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVNTVCAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFlFU05PKGEpICgoYSkgPyAneScgOiAnbicpCisjZGVmaW5lIFRMREVWKHR5cGUpICgodHlwZSkgPT0gVFlQRV9ESVNLIHx8ICh0eXBlKSA9PSBUWVBFX1JPTSkKKworLyogIkVBVEEiLCBpbiBCaWcgRW5kaWFuIGZvcm1hdCAqLworI2RlZmluZSBFQVRBX1NJR19CRSAweDQ1NDE1NDQxCisKKy8qIE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiB0aGUgYm9hcmQgY29uZmlnIHN0cnVjdHVyZSBmb3IgRUFUQSAyLjB4ICovCisjZGVmaW5lIEVBVEFfMl8wQV9TSVpFIDI4CisjZGVmaW5lIEVBVEFfMl8wQl9TSVpFIDMwCisjZGVmaW5lIEVBVEFfMl8wQ19TSVpFIDM0CisKKy8qIEJvYXJkIGluZm8gc3RydWN0dXJlICovCitzdHJ1Y3QgZWF0YV9pbmZvIHsKKwl1X2ludDMyX3QgZGF0YV9sZW47CS8qIE51bWJlciBvZiB2YWxpZCBieXRlcyBhZnRlciB0aGlzIGZpZWxkICovCisJdV9pbnQzMl90IHNpZ247CQkvKiBBU0NJSSAiRUFUQSIgc2lnbmF0dXJlICovCisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwl1bmNoYXIgdmVyc2lvbgk6IDQsCisJICAgICAgIAkJOiA0OworCXVuY2hhciBoYWF2YWwJOiAxLAorCSAgICAgICBhdGEJOiAxLAorCSAgICAgICBkcnF2bGQJOiAxLAorCSAgICAgICBkbWFzdXAJOiAxLAorCSAgICAgICBtb3JzdXAJOiAxLAorCSAgICAgICB0cm54ZnIJOiAxLAorCSAgICAgICB0YXJzdXAJOiAxLAorCSAgICAgICBvY3NlbmEJOiAxOworI2Vsc2UKKwl1bmNoYXIJCTogNCwJLyogdW51c2VkIGxvdyBuaWJibGUgKi8KKwkgCXZlcnNpb24JOiA0OwkvKiBFQVRBIHZlcnNpb24sIHNob3VsZCBiZSAweDEgKi8KKwl1bmNoYXIgb2NzZW5hCTogMSwJLyogT3ZlcmxhcCBDb21tYW5kIFN1cHBvcnQgRW5hYmxlZCAqLworCSAgICAgICB0YXJzdXAJOiAxLAkvKiBUYXJnZXQgTW9kZSBTdXBwb3J0ZWQgKi8KKwkgICAgICAgdHJueGZyCTogMSwJLyogVHJ1bmNhdGUgVHJhbnNmZXIgQ21kIE5PVCBOZWNlc3NhcnkgKi8KKwkgICAgICAgbW9yc3VwCTogMSwJLyogTW9yZSBTdXBwb3J0ZWQgKi8KKwkgICAgICAgZG1hc3VwCTogMSwJLyogRE1BIFN1cHBvcnRlZCAqLworCSAgICAgICBkcnF2bGQJOiAxLAkvKiBEUlEgSW5kZXggKERSUVgpIGlzIHZhbGlkICovCisJICAgICAgIGF0YQk6IDEsCS8qIFRoaXMgaXMgYW4gQVRBIGRldmljZSAqLworCSAgICAgICBoYWF2YWwJOiAxOwkvKiBIb3N0IEFkYXB0ZXIgQWRkcmVzcyBWYWxpZCAqLworI2VuZGlmCisKKwl1c2hvcnQgY3BfcGFkX2xlbjsJLyogTnVtYmVyIG9mIHBhZCBieXRlcyBhZnRlciBjcF9sZW4gKi8KKwl1bmNoYXIgaG9zdF9hZGRyWzRdOwkvKiBIb3N0IEFkYXB0ZXIgU0NTSSBJRCBmb3IgY2hhbm5lbHMgMywgMiwgMSwgMCAqLworCXVfaW50MzJfdCBjcF9sZW47CS8qIE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBjcCAqLworCXVfaW50MzJfdCBzcF9sZW47CS8qIE51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBzcCAqLworCXVzaG9ydCBxdWV1ZV9zaXplOwkvKiBNYXggbnVtYmVyIG9mIGNwIHRoYXQgY2FuIGJlIHF1ZXVlZCAqLworCXVzaG9ydCB1bnVzZWQ7CisJdXNob3J0IHNjYXR0X3NpemU7CS8qIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiBzY2F0dGVyL2dhdGhlciB0YWJsZSAqLworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5jaGFyIGRycXgJOiAyLAorCSAgICAgICBzZWNvbmQJOiAxLAorCSAgICAgICBpcnFfdHIJOiAxLAorCSAgICAgICBpcnEJOiA0OworCXVuY2hhciBzeW5jOworCXVuY2hhcgkJOiA0LAorCSAgICAgICByZXMxCTogMSwKKwkgICAgICAgbGFyZ2Vfc2cJOiAxLAorCSAgICAgICBmb3JjYWRkcgk6IDEsCisJICAgICAgIGlzYWVuYQk6IDE7CisJdW5jaGFyIG1heF9jaGFuCTogMywKKwkgICAgICAgbWF4X2lkCTogNTsKKwl1bmNoYXIgbWF4X2x1bjsKKwl1bmNoYXIgZWlzYQk6IDEsCisJICAgICAgIHBjaQk6IDEsCisJICAgICAgIGlkcXVlc3QJOiAxLAorCSAgICAgICBtMQk6IDEsCisJICAgICAgIAkJOiA0OworI2Vsc2UKKwl1bmNoYXIgaXJxCTogNCwJLyogSW50ZXJydXB0IFJlcXVlc3QgYXNzaWduZWQgdG8gdGhpcyBjb250cm9sbGVyICovCisJICAgICAgIGlycV90cgk6IDEsCS8qIDAgZm9yIGVkZ2UgdHJpZ2dlcmVkLCAxIGZvciBsZXZlbCB0cmlnZ2VyZWQgKi8KKwkgICAgICAgc2Vjb25kCTogMSwJLyogMSBpZiB0aGlzIGlzIGEgc2Vjb25kYXJ5IChub3QgcHJpbWFyeSkgY29udHJvbGxlciAqLworCSAgICAgICBkcnF4CTogMjsJLyogRFJRIEluZGV4ICgwPURNQTAsIDE9RE1BNywgMj1ETUE2LCAzPURNQTUpICovCisJdW5jaGFyIHN5bmM7CQkvKiAxIGlmIHNjc2kgdGFyZ2V0IGlkIDcuLi4wIGlzIHJ1bm5pbmcgc3luYyBzY3NpICovCisKKwkvKiBTdHJ1Y3R1cmUgZXh0ZW5zaW9uIGRlZmluZWQgaW4gRUFUQSAyLjBCICovCisJdW5jaGFyIGlzYWVuYQk6IDEsCS8qIElTQSBpL28gYWRkcmVzc2luZyBpcyBkaXNhYmxlZC9lbmFibGVkICovCisJICAgICAgIGZvcmNhZGRyCTogMSwJLyogUG9ydCBhZGRyZXNzIGhhcyBiZWVuIGZvcmNlZCAqLworCSAgICAgICBsYXJnZV9zZwk6IDEsCS8qIDEgaWYgbGFyZ2UgU0cgbGlzdHMgYXJlIHN1cHBvcnRlZCAqLworCSAgICAgICByZXMxCTogMSwKKwkgICAgICAgCQk6IDQ7CisJdW5jaGFyIG1heF9pZAk6IDUsCS8qIE1heCBTQ1NJIHRhcmdldCBJRCBudW1iZXIgKi8KKwkgICAgICAgbWF4X2NoYW4JOiAzOwkvKiBNYXggU0NTSSBjaGFubmVsIG51bWJlciBvbiB0aGlzIGJvYXJkICovCisKKwkvKiBTdHJ1Y3R1cmUgZXh0ZW5zaW9uIGRlZmluZWQgaW4gRUFUQSAyLjBDICovCisJdW5jaGFyIG1heF9sdW47CQkvKiBNYXggU0NTSSBMVU4gbnVtYmVyICovCisJdW5jaGFyCisJCQk6IDQsCisJICAgICAgIG0xCTogMSwJLyogVGhpcyBpcyBhIFBDSSB3aXRoIGFuIE0xIGNoaXAgaW5zdGFsbGVkICovCisJICAgICAgIGlkcXVlc3QJOiAxLAkvKiBSQUlETlVNIHJldHVybmVkIGlzIHF1ZXN0aW9uYWJsZSAqLworCSAgICAgICBwY2kJOiAxLAkvKiBUaGlzIGJvYXJkIGlzIFBDSSAqLworCSAgICAgICBlaXNhCTogMTsJLyogVGhpcyBib2FyZCBpcyBFSVNBICovCisjZW5kaWYKKworCXVuY2hhciByYWlkbnVtOwkJLyogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIEhCQSBpbiBhIHN5c3RlbSAqLworCXVuY2hhciBub3R1c2VkOworCisJdXNob3J0IGlwYWRbMjQ3XTsKK307CisKKy8qIEJvYXJkIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBlYXRhX2NvbmZpZyB7CisJdXNob3J0IGxlbjsJCS8qIE51bWJlciBvZiBieXRlcyBmb2xsb3dpbmcgdGhpcyBmaWVsZCAqLworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5jaGFyCQk6IDQsCisJICAgICAgIHRhcmVuYQk6IDEsCisJICAgICAgIG1kcGVuYQk6IDEsCisJICAgICAgIG9jZW5hCTogMSwKKwkgICAgICAgZWRpcwk6IDE7CisjZWxzZQorCXVuY2hhciBlZGlzCTogMSwJLyogRGlzYWJsZSBFQVRBIGludGVyZmFjZSBhZnRlciBjb25maWcgY29tbWFuZCAqLworCSAgICAgICBvY2VuYQk6IDEsCS8qIE92ZXJsYXBwZWQgQ29tbWFuZHMgRW5hYmxlZCAqLworCSAgICAgICBtZHBlbmEJOiAxLAkvKiBUcmFuc2ZlciBhbGwgTW9kaWZpZWQgRGF0YSBQb2ludGVyIE1lc3NhZ2VzICovCisJICAgICAgIHRhcmVuYQk6IDEsCS8qIFRhcmdldCBNb2RlIEVuYWJsZWQgZm9yIHRoaXMgY29udHJvbGxlciAqLworCSAgICAgICAJCTogNDsKKyNlbmRpZgorCXVuY2hhciBjcGFkWzUxMV07Cit9OworCisvKiBSZXR1cm5lZCBzdGF0dXMgcGFja2V0IHN0cnVjdHVyZSAqLworc3RydWN0IG1zc3AgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuY2hhciBlb2MJOiAxLAorCSAgICAgICBhZGFwdGVyX3N0YXR1cyA6IDc7CisjZWxzZQorCXVuY2hhciBhZGFwdGVyX3N0YXR1cyA6IDcsCS8qIFN0YXRlIHJlbGF0ZWQgdG8gY3VycmVudCBjb21tYW5kICovCisJICAgICAgIGVvYwk6IDE7CQkvKiBFbmQgT2YgQ29tbWFuZCAoMSA9IGNvbW1hbmQgY29tcGxldGVkKSAqLworI2VuZGlmCisJdW5jaGFyIHRhcmdldF9zdGF0dXM7CS8qIFNDU0kgc3RhdHVzIHJlY2VpdmVkIGFmdGVyIGRhdGEgdHJhbnNmZXIgKi8KKwl1bmNoYXIgdW51c2VkWzJdOworCXVfaW50MzJfdCBpbnZfcmVzX2xlbjsJLyogTnVtYmVyIG9mIGJ5dGVzIG5vdCB0cmFuc2ZlcnJlZCAqLworCXVfaW50MzJfdCBjcHBfaW5kZXg7CS8qIEluZGV4IG9mIGFkZHJlc3Mgc2V0IGluIGNwICovCisJY2hhciBtZXNzWzEyXTsKK307CisKK3N0cnVjdCBzZ19saXN0IHsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzczsJLyogU2VnbWVudCBBZGRyZXNzICovCisJdW5zaWduZWQgaW50IG51bV9ieXRlczsJLyogU2VnbWVudCBMZW5ndGggKi8KK307CisKKy8qIE1haWxCb3ggU0NTSSBDb21tYW5kIFBhY2tldCAqLworc3RydWN0IG1zY3AgeworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCXVuY2hhciBkaW4JOiAxLAorCSAgICAgICBkb3V0CTogMSwKKwkgICAgICAgaW50ZXJwCTogMSwKKwkgICAgICAgCQk6IDEsCisJCXNnCTogMSwKKwkJcmVxc2VuCToxLAorCQlpbml0CTogMSwKKwkJc3Jlc2V0CTogMTsKKwl1bmNoYXIgc2Vuc2VfbGVuOworCXVuY2hhciB1bnVzZWRbM107CisJdW5jaGFyCQk6IDcsCisJICAgICAgIGZ3bmVzdAk6IDE7CisJdW5jaGFyCQk6IDUsCisJICAgICAgIGhiYWNpCTogMSwKKwkgICAgICAgaWF0CTogMSwKKwkgICAgICAgcGhzdW5pdAk6IDE7CisJdW5jaGFyIGNoYW5uZWwJOiAzLAorCSAgICAgICB0YXJnZXQJOiA1OworCXVuY2hhciBvbmUJOiAxLAorCSAgICAgICBkaXNwcmkJOiAxLAorCSAgICAgICBsdW50YXIJOiAxLAorCSAgICAgICBsdW4JOiA1OworI2Vsc2UKKwl1bmNoYXIgc3Jlc2V0CToxLAkvKiBTQ1NJIEJ1cyBSZXNldCBTaWduYWwgc2hvdWxkIGJlIGFzc2VydGVkICovCisJICAgICAgIGluaXQJOjEsCS8qIFJlLWluaXRpYWxpemUgY29udHJvbGxlciBhbmQgc2VsZiB0ZXN0ICovCisJICAgICAgIHJlcXNlbgk6MSwJLyogVHJhbnNmZXIgUmVxdWVzdCBTZW5zZSBEYXRhIHRvIGFkZHIgdXNpbmcgRE1BICovCisJICAgICAgIHNnCToxLAkvKiBVc2UgU2NhdHRlci9HYXRoZXIgKi8KKwkgICAgICAgCQk6MSwKKwkgICAgICAgaW50ZXJwCToxLAkvKiBUaGUgY29udHJvbGxlciBpbnRlcnByZXRzIGNwLCBub3QgdGhlIHRhcmdldCAqLworCSAgICAgICBkb3V0CToxLAkvKiBEaXJlY3Rpb24gb2YgVHJhbnNmZXIgaXMgT3V0IChIb3N0IHRvIFRhcmdldCkgKi8KKwkgICAgICAgZGluCToxOwkvKiBEaXJlY3Rpb24gb2YgVHJhbnNmZXIgaXMgSW4gKFRhcmdldCB0byBIb3N0KSAqLworCXVuY2hhciBzZW5zZV9sZW47CS8qIFJlcXVlc3QgU2Vuc2UgTGVuZ3RoICovCisJdW5jaGFyIHVudXNlZFszXTsKKwl1bmNoYXIgZnduZXN0CTogMSwJLyogU2VuZCBjb21tYW5kIHRvIGEgY29tcG9uZW50IG9mIGFuIEFycmF5IEdyb3VwICovCisJCQk6IDc7CisJdW5jaGFyIHBoc3VuaXQJOiAxLAkvKiBTZW5kIHRvIFRhcmdldCBQaHlzaWNhbCBVbml0IChieXBhc3MgUkFJRCkgKi8KKwkgICAgICAgaWF0CTogMSwJLyogSW5oaWJpdCBBZGRyZXNzIFRyYW5zbGF0aW9uICovCisJICAgICAgIGhiYWNpCTogMSwJLyogSW5oaWJpdCBIQkEgQ2FjaGluZyBmb3IgdGhpcyBjb21tYW5kICovCisJICAgICAgIAkJOiA1OworCXVuY2hhciB0YXJnZXQJOiA1LAkvKiBTQ1NJIHRhcmdldCBJRCAqLworCSAgICAgICBjaGFubmVsCTogMzsJLyogU0NTSSBjaGFubmVsIG51bWJlciAqLworCXVuY2hhciBsdW4JOiA1LAkvKiBTQ1NJIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KKwkgICAgICAgbHVudGFyCTogMSwJLyogVGhpcyBjcCBpcyBmb3IgVGFyZ2V0IChub3QgTFVOKSAqLworCSAgICAgICBkaXNwcmkJOiAxLAkvKiBEaXNjb25uZWN0IFByaXZpbGVnZSBncmFudGVkICovCisJICAgICAgIG9uZQk6IDE7CS8qIDEgKi8KKyNlbmRpZgorCisJdW5jaGFyIG1lc3NbM107CQkvKiBNYXNzYWdlIHRvL2Zyb20gVGFyZ2V0ICovCisJdW5jaGFyIGNkYlsxMl07CQkvKiBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sgKi8KKwl1X2ludDMyX3QgZGF0YV9sZW47CS8qIElmIHNnPTAgRGF0YSBMZW5ndGgsIGlmIHNnPTEgc2dsaXN0IGxlbmd0aCAqLworCXVfaW50MzJfdCBjcHBfaW5kZXg7CS8qIEluZGV4IG9mIGFkZHJlc3MgdG8gYmUgcmV0dXJuZWQgaW4gc3AgKi8KKwl1X2ludDMyX3QgZGF0YV9hZGRyZXNzOwkvKiBJZiBzZz0wIERhdGEgQWRkcmVzcywgaWYgc2c9MSBzZ2xpc3QgYWRkcmVzcyAqLworCXVfaW50MzJfdCBzcF9kbWFfYWRkcjsJLyogQWRkcmVzcyB3aGVyZSBzcCBpcyBETUEnZWQgd2hlbiBjcCBjb21wbGV0ZXMgKi8KKwl1X2ludDMyX3Qgc2Vuc2VfYWRkcjsJLyogQWRkcmVzcyB3aGVyZSBTZW5zZSBEYXRhIGlzIERNQSdlZCBvbiBlcnJvciAqLworCisJLyogQWRkaXRpb25hbCBmaWVsZHMgYmVnaW4gaGVyZS4gKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKworCS8qIEFsbCB0aGUgY3Agc3RydWN0dXJlIGlzIHplcm8gZmlsbGVkIGJ5IHF1ZXVlY29tbWFuZCBleGNlcHQgdGhlCisJICAgZm9sbG93aW5nIENQX1RBSUxfU0laRSBieXRlcywgaW5pdGlhbGl6ZWQgYnkgZGV0ZWN0ICovCisJZG1hX2FkZHJfdCBjcF9kbWFfYWRkcjsJLyogZG1hIGhhbmRsZSBmb3IgdGhpcyBjcCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3Qgc2dfbGlzdCAqc2dsaXN0OwkvKiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgU0cgbGlzdCAqLworfTsKKworI2RlZmluZSBDUF9UQUlMX1NJWkUgKHNpemVvZihzdHJ1Y3Qgc2dsaXN0ICopICsgc2l6ZW9mKGRtYV9hZGRyX3QpKQorCitzdHJ1Y3QgaG9zdGRhdGEgeworCXN0cnVjdCBtc2NwIGNwW01BWF9NQUlMQk9YRVNdOwkvKiBNYWlsYm94ZXMgZm9yIHRoaXMgYm9hcmQgKi8KKwl1bnNpZ25lZCBpbnQgY3Bfc3RhdFtNQVhfTUFJTEJPWEVTXTsJLyogRlJFRSwgSU5fVVNFLCBMT0NLRUQsIElOX1JFU0VUICovCisJdW5zaWduZWQgaW50IGxhc3RfY3BfdXNlZDsJLyogSW5kZXggb2YgbGFzdCBtYWlsYm94IHVzZWQgKi8KKwl1bnNpZ25lZCBpbnQgaW9jb3VudDsJLyogVG90YWwgaS9vIGRvbmUgZm9yIHRoaXMgYm9hcmQgKi8KKwlpbnQgYm9hcmRfbnVtYmVyOwkvKiBOdW1iZXIgb2YgdGhpcyBib2FyZCAqLworCWNoYXIgYm9hcmRfbmFtZVsxNl07CS8qIE5hbWUgb2YgdGhpcyBib2FyZCAqLworCWludCBpbl9yZXNldDsJCS8qIFRydWUgaWYgYm9hcmQgaXMgZG9pbmcgYSByZXNldCAqLworCWludCB0YXJnZXRfdG9bTUFYX1RBUkdFVF1bTUFYX0NIQU5ORUxdOwkvKiBOLiBvZiB0aW1lb3V0IGVycm9ycyBvbiB0YXJnZXQgKi8KKwlpbnQgdGFyZ2V0X3JlZG9bTUFYX1RBUkdFVF1bTUFYX0NIQU5ORUxdOwkvKiBJZiAxIHJlZG8gaS9vIG9uIHRhcmdldCAqLworCXVuc2lnbmVkIGludCByZXRyaWVzOwkvKiBOdW1iZXIgb2YgaW50ZXJuYWwgcmV0cmllcyAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZXRyaWVkX3BpZDsJLyogUGlkIG9mIGxhc3QgcmV0cmllZCBjb21tYW5kICovCisJdW5zaWduZWQgY2hhciBzdWJ2ZXJzaW9uOwkvKiBCdXMgdHlwZSwgZWl0aGVyIElTQSBvciBFSVNBL1BDSSAqLworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2xfcmV2OwkvKiBFQVRBIDIuMCByZXYuLCAnQScgb3IgJ0InIG9yICdDJyAqLworCXVuc2lnbmVkIGNoYXIgaXNfcGNpOwkvKiAxIGlzIGJ1cyB0eXBlIGlzIFBDSSAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBwZGV2IGZvciBQQ0kgYnVzLCBOVUxMIG90aGVyd2lzZSAqLworCXN0cnVjdCBtc3NwICpzcF9jcHVfYWRkcjsJLyogY3B1IGFkZHIgZm9yIERNQSBidWZmZXIgc3AgKi8KKwlkbWFfYWRkcl90IHNwX2RtYV9hZGRyOwkvKiBkbWEgaGFuZGxlIGZvciBETUEgYnVmZmVyIHNwICovCisJc3RydWN0IG1zc3Agc3A7CQkvKiBMb2NhbCBjb3B5IG9mIHNwIGJ1ZmZlciAqLworfTsKKworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKnNoW01BWF9CT0FSRFNdOworc3RhdGljIGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lID0gIkVBVEEiOworc3RhdGljIGNoYXIgc2hhW01BWF9CT0FSRFNdOworc3RhdGljIERFRklORV9TUElOTE9DSyhkcml2ZXJfbG9jayk7CisKKy8qIEluaXRpYWxpemUgbnVtX2JvYXJkcyBzbyB0aGF0IGloZGxyIGNhbiB3b3JrIHdoaWxlIGRldGVjdCBpcyBpbiBwcm9ncmVzcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBudW1fYm9hcmRzID0gTUFYX0JPQVJEUzsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9fcG9ydFtdID0geworCisJLyogU3BhY2UgZm9yIE1BWF9JTlRfUEFSQU0gcG9ydHMgdXNhYmxlIHdoaWxlIGxvYWRpbmcgYXMgYSBtb2R1bGUgKi8KKwlTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLAorCVNLSVAsIFNLSVAsCisKKwkvKiBGaXJzdCBJU0EgKi8KKwkweDFmMCwKKworCS8qIFNwYWNlIGZvciBNQVhfUENJIHBvcnRzIHBvc3NpYmx5IHJlcG9ydGVkIGJ5IFBDSV9CSU9TICovCisJU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwgU0tJUCwKKwlTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLCBTS0lQLAorCisJLyogTUFYX0VJU0EgcG9ydHMgKi8KKwkweDFjODgsIDB4MmM4OCwgMHgzYzg4LCAweDRjODgsIDB4NWM4OCwgMHg2Yzg4LCAweDdjODgsIDB4OGM4OCwKKwkweDljODgsIDB4YWM4OCwgMHhiYzg4LCAweGNjODgsIDB4ZGM4OCwgMHhlYzg4LCAweGZjODgsCisKKwkvKiBPdGhlciAoTUFYX0lTQSAtIDEpIHBvcnRzICovCisJMHgxNzAsIDB4MjMwLCAweDMzMCwKKworCS8qIEVuZCBvZiBsaXN0ICovCisJMHgwCit9OworCisvKiBEZXZpY2UgaXMgQmlnIEVuZGlhbiAqLworI2RlZmluZSBIMkRFVih4KSAgIGNwdV90b19iZTMyKHgpCisjZGVmaW5lIERFVjJIKHgpICAgYmUzMl90b19jcHUoeCkKKyNkZWZpbmUgSDJERVYxNih4KSBjcHVfdG9fYmUxNih4KQorI2RlZmluZSBERVYySDE2KHgpIGJlMTZfdG9fY3B1KHgpCisKKy8qIEJ1dCB0cmFuc2ZlciBvcmllbnRhdGlvbiBmcm9tIHRoZSAxNiBiaXQgZGF0YSByZWdpc3RlciBpcyBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIFJFRzJIKHgpICAgbGUxNl90b19jcHUoeCkKKworc3RhdGljIGlycXJldHVybl90IGRvX2ludGVycnVwdF9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIGZsdXNoX2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGhvc3RkYXRhICosCisJCSAgICAgIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IGRvX3RyYWNlID0gMDsKK3N0YXRpYyBpbnQgc2V0dXBfZG9uZSA9IDA7CitzdGF0aWMgaW50IGxpbmtfc3RhdGlzdGljczsKK3N0YXRpYyBpbnQgZXh0X3RyYW4gPSAwOworc3RhdGljIGludCByZXZfc2NhbiA9IDE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX0VBVEFfVEFHR0VEX1FVRVVFKQorc3RhdGljIGludCB0YWdfbW9kZSA9IFRBR19TSU1QTEU7CisjZWxzZQorc3RhdGljIGludCB0YWdfbW9kZSA9IFRBR19ESVNBQkxFRDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9FQVRBX0xJTktFRF9DT01NQU5EUykKK3N0YXRpYyBpbnQgbGlua2VkX2NvbW0gPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgbGlua2VkX2NvbW0gPSAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX0VBVEFfTUFYX1RBR1MpCitzdGF0aWMgaW50IG1heF9xdWV1ZV9kZXB0aCA9IENPTkZJR19TQ1NJX0VBVEFfTUFYX1RBR1M7CisjZWxzZQorc3RhdGljIGludCBtYXhfcXVldWVfZGVwdGggPSBNQVhfQ01EX1BFUl9MVU47CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0lTQSkKK3N0YXRpYyBpbnQgaXNhX3Byb2JlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGlzYV9wcm9iZSA9IDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0VJU0EpCitzdGF0aWMgaW50IGVpc2FfcHJvYmUgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgZWlzYV9wcm9iZSA9IDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKK3N0YXRpYyBpbnQgcGNpX3Byb2JlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IHBjaV9wcm9iZSA9IDA7CisjZW5kaWYKKworI2RlZmluZSBNQVhfSU5UX1BBUkFNIDEwCisjZGVmaW5lIE1BWF9CT09UX09QVElPTlNfU0laRSAyNTYKK3N0YXRpYyBjaGFyIGJvb3Rfb3B0aW9uc1tNQVhfQk9PVF9PUFRJT05TX1NJWkVdOworCisjaWYgZGVmaW5lZChNT0RVTEUpCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworbW9kdWxlX3BhcmFtX3N0cmluZyhlYXRhLCBib290X29wdGlvbnMsIE1BWF9CT09UX09QVElPTlNfU0laRSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGVhdGEsICIgZXF1aXZhbGVudCB0byB0aGUgXCJlYXRhPS4uLlwiIGtlcm5lbCBib290IG9wdGlvbi4iCisJCSAiICAgICAgICAgICAgRXhhbXBsZTogbW9kcHJvYmUgZWF0YSBcImVhdGE9MHg3NDEwLDB4MjMwLGxjOnksdG06MCxtcTo0LGVwOm5cIiIpOworTU9EVUxFX0FVVEhPUigiRGFyaW8gQmFsbGFiaW8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRUFUQS9ETUEgU0NTSSBEcml2ZXIiKTsKKworI2VuZGlmCisKK3N0YXRpYyBpbnQgZWF0YTJ4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldikKK3sKKwlpbnQgdHFkLCB1dHFkOworCWNoYXIgKnRhZ19zdWZmaXgsICpsaW5rX3N1ZmZpeDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldi0+aG9zdDsKKwlzdHJ1Y3QgaG9zdGRhdGEgKmhhID0gKHN0cnVjdCBob3N0ZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKworCXV0cWQgPSBNQVhfQ01EX1BFUl9MVU47CisJdHFkID0gbWF4X3F1ZXVlX2RlcHRoOworCisJaWYgKFRMREVWKGRldi0+dHlwZSkgJiYgZGV2LT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCWlmICh0YWdfbW9kZSA9PSBUQUdfU0lNUExFKSB7CisJCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIE1TR19TSU1QTEVfVEFHLCB0cWQpOworCQkJdGFnX3N1ZmZpeCA9ICIsIHNpbXBsZSB0YWdzIjsKKwkJfSBlbHNlIGlmICh0YWdfbW9kZSA9PSBUQUdfT1JERVJFRCkgeworCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCBNU0dfT1JERVJFRF9UQUcsIHRxZCk7CisJCQl0YWdfc3VmZml4ID0gIiwgb3JkZXJlZCB0YWdzIjsKKwkJfSBlbHNlIHsKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldiwgMCwgdHFkKTsKKwkJCXRhZ19zdWZmaXggPSAiLCBubyB0YWdzIjsKKwkJfQorCX0gZWxzZSBpZiAoVExERVYoZGV2LT50eXBlKSAmJiBsaW5rZWRfY29tbSkgeworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIDAsIHRxZCk7CisJCXRhZ19zdWZmaXggPSAiLCB1bnRhZ2dlZCI7CisJfSBlbHNlIHsKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCAwLCB1dHFkKTsKKwkJdGFnX3N1ZmZpeCA9ICIiOworCX0KKworCWlmIChUTERFVihkZXYtPnR5cGUpICYmIGxpbmtlZF9jb21tICYmIGRldi0+cXVldWVfZGVwdGggPiAyKQorCQlsaW5rX3N1ZmZpeCA9ICIsIHNvcnRlZCI7CisJZWxzZSBpZiAoVExERVYoZGV2LT50eXBlKSkKKwkJbGlua19zdWZmaXggPSAiLCB1bnNvcnRlZCI7CisJZWxzZQorCQlsaW5rX3N1ZmZpeCA9ICIiOworCisJcHJpbnRrKCIlczogc2NzaSVkLCBjaGFubmVsICVkLCBpZCAlZCwgbHVuICVkLCBjbWRzL2x1biAlZCVzJXMuXG4iLAorCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgc2hvc3QtPmhvc3Rfbm8sIGRldi0+Y2hhbm5lbCwgZGV2LT5pZCwgZGV2LT5sdW4sCisJICAgICAgIGRldi0+cXVldWVfZGVwdGgsIGxpbmtfc3VmZml4LCB0YWdfc3VmZml4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhaXRfb25fYnVzeSh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdW5zaWduZWQgaW50IGxvb3ApCit7CisJd2hpbGUgKGluYihpb2Jhc2UgKyBSRUdfQVVYX1NUQVRVUykgJiBBQlNZX0FTU0VSVEVEKSB7CisJCXVkZWxheSgxTCk7CisJCWlmICgtLWxvb3AgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19kbWEodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5jaGFyIGNtZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpieWFkZHI7CisJdW5zaWduZWQgbG9uZyBkZXZhZGRyOworCisJaWYgKHdhaXRfb25fYnVzeShpb2Jhc2UsIChhZGRyID8gTUFYTE9PUCAqIDEwMCA6IE1BWExPT1ApKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYWRkcikgeworCQlkZXZhZGRyID0gSDJERVYoYWRkcik7CisJCWJ5YWRkciA9ICh1bnNpZ25lZCBjaGFyICopJmRldmFkZHI7CisJCW91dGIoYnlhZGRyWzNdLCBpb2Jhc2UgKyBSRUdfTE9XKTsKKwkJb3V0YihieWFkZHJbMl0sIGlvYmFzZSArIFJFR19MTSk7CisJCW91dGIoYnlhZGRyWzFdLCBpb2Jhc2UgKyBSRUdfTUlEKTsKKwkJb3V0YihieWFkZHJbMF0sIGlvYmFzZSArIFJFR19NU0IpOworCX0KKworCW91dGIoY21kLCBpb2Jhc2UgKyBSRUdfQ01EKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3Bpbyh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdXNob3J0ICogc3RhcnQsIHVzaG9ydCAqIGVuZCkKK3sKKwl1bnNpZ25lZCBpbnQgbG9vcCA9IE1BWExPT1A7CisJdXNob3J0ICpwOworCisJZm9yIChwID0gc3RhcnQ7IHAgPD0gZW5kOyBwKyspIHsKKwkJd2hpbGUgKCEoaW5iKGlvYmFzZSArIFJFR19TVEFUVVMpICYgRFJRX0FTU0VSVEVEKSkgeworCQkJdWRlbGF5KDFMKTsKKwkJCWlmICgtLWxvb3AgPT0gMCkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlsb29wID0gTUFYTE9PUDsKKwkJKnAgPSBSRUcySChpbncoaW9iYXNlKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqZ2V0X3BjaV9kZXYodW5zaWduZWQgbG9uZyBwb3J0X2Jhc2UpCit7CisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCXVuc2lnbmVkIGludCBhZGRyOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCisJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19TVE9SQUdFX1NDU0kgPDwgOCwgZGV2KSkpIHsKKwkJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOworCisjaWYgZGVmaW5lZChERUJVR19QQ0lfREVURUNUKQorCQlwcmludGsoIiVzOiBnZXRfcGNpX2RldiwgYnVzICVkLCBkZXZmbiAweCV4LCBhZGRyIDB4JXguXG4iLAorCQkgICAgICAgZHJpdmVyX25hbWUsIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4sIGFkZHIpOworI2VuZGlmCisKKwkJLyogd2UgYXJlIGluIHNvIG11Y2ggdHJvdWJsZSBmb3IgYSBwY2kgaG90cGx1ZyBzeXN0ZW0gd2l0aCB0aGlzIGRyaXZlcgorCQkgKiBhbnl3YXksIHNvIGRvaW5nIHRoaXMgYXQgbGVhc3QgbGV0cyBwZW9wbGUgdW5sb2FkIHRoZSBkcml2ZXIgYW5kIG5vdAorCQkgKiBjYXVzZSBtZW1vcnkgcHJvYmxlbXMsIGJ1dCBpbiBnZW5lcmFsIHRoaXMgaXMgYSBiYWQgdGhpbmcgdG8gZG8gKHRoaXMKKwkJICogZHJpdmVyIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgcHJvcGVyIFBDSSBhcGkgc29tZWRheS4uLiAqLworCQlwY2lfZGV2X3B1dChkZXYpOworCQlpZiAoYWRkciArIFBDSV9CQVNFX0FERFJFU1NfMCA9PSBwb3J0X2Jhc2UpCisJCQlyZXR1cm4gZGV2OworCX0KKyNlbmRpZgkJCQkvKiBlbmQgQ09ORklHX1BDSSAqLworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfcGNpX3BvcnRzKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCisJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19TVE9SQUdFX1NDU0kgPDwgOCwgZGV2KSkpIHsKKyNpZiBkZWZpbmVkKERFQlVHX1BDSV9ERVRFQ1QpCisJCXByaW50aygiJXM6IGVuYWJsZV9wY2lfcG9ydHMsIGJ1cyAlZCwgZGV2Zm4gMHgleC5cbiIsCisJCSAgICAgICBkcml2ZXJfbmFtZSwgZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CisjZW5kaWYKKworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJCXByaW50aworCQkJICAgICgiJXM6IHdhcm5pbmcsIHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgYnVzICVkIGRldmZuIDB4JXguXG4iLAorCQkJICAgICBkcml2ZXJfbmFtZSwgZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CisJfQorCisjZW5kaWYJCQkJLyogZW5kIENPTkZJR19QQ0kgKi8KK30KKworc3RhdGljIGludCBwb3J0X2RldGVjdCh1bnNpZ25lZCBsb25nIHBvcnRfYmFzZSwgdW5zaWduZWQgaW50IGosCisJCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJdW5zaWduZWQgY2hhciBpcnEsIGRtYV9jaGFubmVsLCBzdWJ2ZXJzaW9uLCBpLCBpc19wY2kgPSAwOworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2xfcmV2OworCXN0cnVjdCBlYXRhX2luZm8gaW5mbzsKKwljaGFyICpidXNfdHlwZSwgZG1hX25hbWVbMTZdOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCS8qIEFsbG93ZWQgRE1BIGNoYW5uZWxzIGZvciBJU0EgKDAgaW5kaWNhdGVzIHJlc2VydmVkKSAqLworCXVuc2lnbmVkIGNoYXIgZG1hX2NoYW5uZWxfdGFibGVbNF0gPSB7IDUsIDYsIDcsIDAgfTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgaG9zdGRhdGEgKmhhOworCWNoYXIgbmFtZVsxNl07CisKKwlzcHJpbnRmKG5hbWUsICIlcyVkIiwgZHJpdmVyX25hbWUsIGopOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwb3J0X2Jhc2UsIFJFR0lPTl9TSVpFLCBkcml2ZXJfbmFtZSkpIHsKKyNpZiBkZWZpbmVkKERFQlVHX0RFVEVDVCkKKwkJcHJpbnRrKCIlczogYWRkcmVzcyAweCUwM2x4IGluIHVzZSwgc2tpcHBpbmcgcHJvYmUuXG4iLCBuYW1lLAorCQkgICAgICAgcG9ydF9iYXNlKTsKKyNlbmRpZgorCQlnb3RvIGZhaWw7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmZHJpdmVyX2xvY2spOworCisJaWYgKGRvX2RtYShwb3J0X2Jhc2UsIDAsIFJFQURfQ09ORklHX1BJTykpIHsKKyNpZiBkZWZpbmVkKERFQlVHX0RFVEVDVCkKKwkJcHJpbnRrKCIlczogZGV0ZWN0LCBkb19kbWEgZmFpbGVkIGF0IDB4JTAzbHguXG4iLCBuYW1lLAorCQkgICAgICAgcG9ydF9iYXNlKTsKKyNlbmRpZgorCQlnb3RvIGZyZWVsb2NrOworCX0KKworCS8qIFJlYWQgdGhlIGluZm8gc3RydWN0dXJlICovCisJaWYgKHJlYWRfcGlvKHBvcnRfYmFzZSwgKHVzaG9ydCAqKSAmIGluZm8sICh1c2hvcnQgKikgJiBpbmZvLmlwYWRbMF0pKSB7CisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisJCXByaW50aygiJXM6IGRldGVjdCwgcmVhZF9waW8gZmFpbGVkIGF0IDB4JTAzbHguXG4iLCBuYW1lLAorCQkgICAgICAgcG9ydF9iYXNlKTsKKyNlbmRpZgorCQlnb3RvIGZyZWVsb2NrOworCX0KKworCWluZm8uZGF0YV9sZW4gPSBERVYySChpbmZvLmRhdGFfbGVuKTsKKwlpbmZvLnNpZ24gPSBERVYySChpbmZvLnNpZ24pOworCWluZm8uY3BfcGFkX2xlbiA9IERFVjJIMTYoaW5mby5jcF9wYWRfbGVuKTsKKwlpbmZvLmNwX2xlbiA9IERFVjJIKGluZm8uY3BfbGVuKTsKKwlpbmZvLnNwX2xlbiA9IERFVjJIKGluZm8uc3BfbGVuKTsKKwlpbmZvLnNjYXR0X3NpemUgPSBERVYySDE2KGluZm8uc2NhdHRfc2l6ZSk7CisJaW5mby5xdWV1ZV9zaXplID0gREVWMkgxNihpbmZvLnF1ZXVlX3NpemUpOworCisJLyogQ2hlY2sgdGhlIGNvbnRyb2xsZXIgIkVBVEEiIHNpZ25hdHVyZSAqLworCWlmIChpbmZvLnNpZ24gIT0gRUFUQV9TSUdfQkUpIHsKKyNpZiBkZWZpbmVkKERFQlVHX0RFVEVDVCkKKwkJcHJpbnRrKCIlczogc2lnbmF0dXJlIDB4JTA0eCBkaXNjYXJkZWQuXG4iLCBuYW1lLCBpbmZvLnNpZ24pOworI2VuZGlmCisJCWdvdG8gZnJlZWxvY2s7CisJfQorCisJaWYgKGluZm8uZGF0YV9sZW4gPCBFQVRBXzJfMEFfU0laRSkgeworCQlwcmludGsKKwkJICAgICgiJXM6IGNvbmZpZyBzdHJ1Y3R1cmUgc2l6ZSAoJWQgYnl0ZXMpIHRvbyBzaG9ydCwgZGV0YWNoaW5nLlxuIiwKKwkJICAgICBuYW1lLCBpbmZvLmRhdGFfbGVuKTsKKwkJZ290byBmcmVlbG9jazsKKwl9IGVsc2UgaWYgKGluZm8uZGF0YV9sZW4gPT0gRUFUQV8yXzBBX1NJWkUpCisJCXByb3RvY29sX3JldiA9ICdBJzsKKwllbHNlIGlmIChpbmZvLmRhdGFfbGVuID09IEVBVEFfMl8wQl9TSVpFKQorCQlwcm90b2NvbF9yZXYgPSAnQic7CisJZWxzZQorCQlwcm90b2NvbF9yZXYgPSAnQyc7CisKKwlpZiAocHJvdG9jb2xfcmV2ICE9ICdBJyAmJiBpbmZvLmZvcmNhZGRyKSB7CisJCXByaW50aygiJXM6IHdhcm5pbmcsIHBvcnQgYWRkcmVzcyBoYXMgYmVlbiBmb3JjZWQuXG4iLCBuYW1lKTsKKwkJYnVzX3R5cGUgPSAiUENJIjsKKwkJaXNfcGNpID0gMTsKKwkJc3VidmVyc2lvbiA9IEVTQTsKKwl9IGVsc2UgaWYgKHBvcnRfYmFzZSA+IE1BWF9FSVNBX0FERFIKKwkJICAgfHwgKHByb3RvY29sX3JldiA9PSAnQycgJiYgaW5mby5wY2kpKSB7CisJCWJ1c190eXBlID0gIlBDSSI7CisJCWlzX3BjaSA9IDE7CisJCXN1YnZlcnNpb24gPSBFU0E7CisJfSBlbHNlIGlmIChwb3J0X2Jhc2UgPj0gTUlOX0VJU0FfQUREUgorCQkgICB8fCAocHJvdG9jb2xfcmV2ID09ICdDJyAmJiBpbmZvLmVpc2EpKSB7CisJCWJ1c190eXBlID0gIkVJU0EiOworCQlzdWJ2ZXJzaW9uID0gRVNBOworCX0gZWxzZSBpZiAocHJvdG9jb2xfcmV2ID09ICdDJyAmJiAhaW5mby5laXNhICYmICFpbmZvLnBjaSkgeworCQlidXNfdHlwZSA9ICJJU0EiOworCQlzdWJ2ZXJzaW9uID0gSVNBOworCX0gZWxzZSBpZiAocG9ydF9iYXNlID4gTUFYX0lTQV9BRERSKSB7CisJCWJ1c190eXBlID0gIlBDSSI7CisJCWlzX3BjaSA9IDE7CisJCXN1YnZlcnNpb24gPSBFU0E7CisJfSBlbHNlIHsKKwkJYnVzX3R5cGUgPSAiSVNBIjsKKwkJc3VidmVyc2lvbiA9IElTQTsKKwl9CisKKwlpZiAoIWluZm8uaGFhdmFsIHx8IGluZm8uYXRhKSB7CisJCXByaW50aworCQkgICAgKCIlczogYWRkcmVzcyAweCUwM2x4LCB1bnVzYWJsZSAlcyBib2FyZCAoJWQlZCksIGRldGFjaGluZy5cbiIsCisJCSAgICAgbmFtZSwgcG9ydF9iYXNlLCBidXNfdHlwZSwgaW5mby5oYWF2YWwsIGluZm8uYXRhKTsKKwkJZ290byBmcmVlbG9jazsKKwl9CisKKwlpZiAoaW5mby5kcnF2bGQpIHsKKwkJaWYgKHN1YnZlcnNpb24gPT0gRVNBKQorCQkJcHJpbnRrKCIlczogd2FybmluZywgd2VpcmQgJXMgYm9hcmQgdXNpbmcgRE1BLlxuIiwgbmFtZSwKKwkJCSAgICAgICBidXNfdHlwZSk7CisKKwkJc3VidmVyc2lvbiA9IElTQTsKKwkJZG1hX2NoYW5uZWwgPSBkbWFfY2hhbm5lbF90YWJsZVszIC0gaW5mby5kcnF4XTsKKwl9IGVsc2UgeworCQlpZiAoc3VidmVyc2lvbiA9PSBJU0EpCisJCQlwcmludGsoIiVzOiB3YXJuaW5nLCB3ZWlyZCAlcyBib2FyZCBub3QgdXNpbmcgRE1BLlxuIiwKKwkJCSAgICAgICBuYW1lLCBidXNfdHlwZSk7CisKKwkJc3VidmVyc2lvbiA9IEVTQTsKKwkJZG1hX2NoYW5uZWwgPSBOT19ETUE7CisJfQorCisJaWYgKCFpbmZvLmRtYXN1cCkKKwkJcHJpbnRrKCIlczogd2FybmluZywgRE1BIHByb3RvY29sIHN1cHBvcnQgbm90IGFzc2VydGVkLlxuIiwKKwkJICAgICAgIG5hbWUpOworCisJaXJxID0gaW5mby5pcnE7CisKKwlpZiAoc3VidmVyc2lvbiA9PSBFU0EgJiYgIWluZm8uaXJxX3RyKQorCQlwcmludGsKKwkJICAgICgiJXM6IHdhcm5pbmcsIExFVkVMIHRyaWdnZXJpbmcgaXMgc3VnZ2VzdGVkIGZvciBJUlEgJXUuXG4iLAorCQkgICAgIG5hbWUsIGlycSk7CisKKwlpZiAoaXNfcGNpKSB7CisJCXBkZXYgPSBnZXRfcGNpX2Rldihwb3J0X2Jhc2UpOworCQlpZiAoIXBkZXYpCisJCQlwcmludGsKKwkJCSAgICAoIiVzOiB3YXJuaW5nLCBmYWlsZWQgdG8gZ2V0IHBjaV9kZXYgc3RydWN0dXJlLlxuIiwKKwkJCSAgICAgbmFtZSk7CisJfSBlbHNlCisJCXBkZXYgPSBOVUxMOworCisJaWYgKHBkZXYgJiYgKGlycSAhPSBwZGV2LT5pcnEpKSB7CisJCXByaW50aygiJXM6IElSUSAldSBtYXBwZWQgdG8gSU8tQVBJQyBJUlEgJXUuXG4iLCBuYW1lLCBpcnEsCisJCSAgICAgICBwZGV2LT5pcnEpOworCQlpcnEgPSBwZGV2LT5pcnE7CisJfQorCisJLyogQm9hcmQgZGV0ZWN0ZWQsIGFsbG9jYXRlIGl0cyBJUlEgKi8KKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBkb19pbnRlcnJ1cHRfaGFuZGxlciwKKwkJCVNBX0lOVEVSUlVQVCB8ICgoc3VidmVyc2lvbiA9PSBFU0EpID8gU0FfU0hJUlEgOiAwKSwKKwkJCWRyaXZlcl9uYW1lLCAodm9pZCAqKSZzaGFbal0pKSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIGRldGFjaGluZy5cbiIsIG5hbWUsCisJCSAgICAgICBpcnEpOworCQlnb3RvIGZyZWVsb2NrOworCX0KKworCWlmIChzdWJ2ZXJzaW9uID09IElTQSAmJiByZXF1ZXN0X2RtYShkbWFfY2hhbm5lbCwgZHJpdmVyX25hbWUpKSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbCAldSwgZGV0YWNoaW5nLlxuIiwKKwkJICAgICAgIG5hbWUsIGRtYV9jaGFubmVsKTsKKwkJZ290byBmcmVlaXJxOworCX0KKyNpZiBkZWZpbmVkKEZPUkNFX0NPTkZJRykKKwl7CisJCXN0cnVjdCBlYXRhX2NvbmZpZyAqY2Y7CisJCWRtYV9hZGRyX3QgY2ZfZG1hX2FkZHI7CisKKwkJY2YgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IGVhdGFfY29uZmlnKSwKKwkJCQkJICAmY2ZfZG1hX2FkZHIpOworCisJCWlmICghY2YpIHsKKwkJCXByaW50aworCQkJICAgICgiJXM6IGNvbmZpZywgcGNpX2FsbG9jX2NvbnNpc3RlbnQgZmFpbGVkLCBkZXRhY2hpbmcuXG4iLAorCQkJICAgICBuYW1lKTsKKwkJCWdvdG8gZnJlZWRtYTsKKwkJfQorCisJCS8qIFNldCBib2FyZCBjb25maWd1cmF0aW9uICovCisJCW1lbXNldCgoY2hhciAqKWNmLCAwLCBzaXplb2Yoc3RydWN0IGVhdGFfY29uZmlnKSk7CisJCWNmLT5sZW4gPSAodXNob3J0KSBIMkRFVjE2KCh1c2hvcnQpIDUxMCk7CisJCWNmLT5vY2VuYSA9IDE7CisKKwkJaWYgKGRvX2RtYShwb3J0X2Jhc2UsIGNmX2RtYV9hZGRyLCBTRVRfQ09ORklHX0RNQSkpIHsKKwkJCXByaW50aworCQkJICAgICgiJXM6IGJ1c3kgdGltZW91dCBzZW5kaW5nIGNvbmZpZ3VyYXRpb24sIGRldGFjaGluZy5cbiIsCisJCQkgICAgIG5hbWUpOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IGVhdGFfY29uZmlnKSwKKwkJCQkJICAgIGNmLCBjZl9kbWFfYWRkcik7CisJCQlnb3RvIGZyZWVkbWE7CisJCX0KKworCX0KKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxKCZkcml2ZXJfbG9jayk7CisJc2hbal0gPSBzaG9zdCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKHN0cnVjdCBob3N0ZGF0YSkpOworCXNwaW5fbG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKworCWlmIChzaG9zdCA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byByZWdpc3RlciBob3N0LCBkZXRhY2hpbmcuXG4iLCBuYW1lKTsKKwkJZ290byBmcmVlZG1hOworCX0KKworCXNob3N0LT5pb19wb3J0ID0gcG9ydF9iYXNlOworCXNob3N0LT51bmlxdWVfaWQgPSBwb3J0X2Jhc2U7CisJc2hvc3QtPm5faW9fcG9ydCA9IFJFR0lPTl9TSVpFOworCXNob3N0LT5kbWFfY2hhbm5lbCA9IGRtYV9jaGFubmVsOworCXNob3N0LT5pcnEgPSBpcnE7CisJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9ICh1c2hvcnQpIGluZm8uc2NhdHRfc2l6ZTsKKwlzaG9zdC0+dGhpc19pZCA9ICh1c2hvcnQpIGluZm8uaG9zdF9hZGRyWzNdOworCXNob3N0LT5jYW5fcXVldWUgPSAodXNob3J0KSBpbmZvLnF1ZXVlX3NpemU7CisJc2hvc3QtPmNtZF9wZXJfbHVuID0gTUFYX0NNRF9QRVJfTFVOOworCisJaGEgPSAoc3RydWN0IGhvc3RkYXRhICopc2hvc3QtPmhvc3RkYXRhOworCQorCW1lbXNldChoYSwgMCwgc2l6ZW9mKHN0cnVjdCBob3N0ZGF0YSkpOworCWhhLT5zdWJ2ZXJzaW9uID0gc3VidmVyc2lvbjsKKwloYS0+cHJvdG9jb2xfcmV2ID0gcHJvdG9jb2xfcmV2OworCWhhLT5pc19wY2kgPSBpc19wY2k7CisJaGEtPnBkZXYgPSBwZGV2OworCWhhLT5ib2FyZF9udW1iZXIgPSBqOworCisJaWYgKGhhLT5zdWJ2ZXJzaW9uID09IEVTQSkKKwkJc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID0gMDsKKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID0gMTsKKworCQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCWRpc2FibGVfZG1hKGRtYV9jaGFubmVsKTsKKwkJY2xlYXJfZG1hX2ZmKGRtYV9jaGFubmVsKTsKKwkJc2V0X2RtYV9tb2RlKGRtYV9jaGFubmVsLCBETUFfTU9ERV9DQVNDQURFKTsKKwkJZW5hYmxlX2RtYShkbWFfY2hhbm5lbCk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJfQorCisJc3RyY3B5KGhhLT5ib2FyZF9uYW1lLCBuYW1lKTsKKworCS8qIERQVCBQTTIwMTIgZG9lcyBub3QgYWxsb3cgdG8gZGV0ZWN0IHNnX3RhYmxlc2l6ZSBjb3JyZWN0bHkgKi8KKwlpZiAoc2hvc3QtPnNnX3RhYmxlc2l6ZSA+IE1BWF9TR0xJU1QgfHwgc2hvc3QtPnNnX3RhYmxlc2l6ZSA8IDIpIHsKKwkJcHJpbnRrKCIlczogZGV0ZWN0LCB3cm9uZyBuLiBvZiBTRyBsaXN0cyAlZCwgZml4ZWQuXG4iLAorCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIHNob3N0LT5zZ190YWJsZXNpemUpOworCQlzaG9zdC0+c2dfdGFibGVzaXplID0gTUFYX1NHTElTVDsKKwl9CisKKwkvKiBEUFQgUE0yMDEyIGRvZXMgbm90IGFsbG93IHRvIGRldGVjdCBjYW5fcXVldWUgY29ycmVjdGx5ICovCisJaWYgKHNob3N0LT5jYW5fcXVldWUgPiBNQVhfTUFJTEJPWEVTIHx8IHNob3N0LT5jYW5fcXVldWUgPCAyKSB7CisJCXByaW50aygiJXM6IGRldGVjdCwgd3Jvbmcgbi4gb2YgbWJveCAlZCwgZml4ZWQuXG4iLAorCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIHNob3N0LT5jYW5fcXVldWUpOworCQlzaG9zdC0+Y2FuX3F1ZXVlID0gTUFYX01BSUxCT1hFUzsKKwl9CisKKwlpZiAocHJvdG9jb2xfcmV2ICE9ICdBJykgeworCQlpZiAoaW5mby5tYXhfY2hhbiA+IDAgJiYgaW5mby5tYXhfY2hhbiA8IE1BWF9DSEFOTkVMKQorCQkJc2hvc3QtPm1heF9jaGFubmVsID0gaW5mby5tYXhfY2hhbjsKKworCQlpZiAoaW5mby5tYXhfaWQgPiA3ICYmIGluZm8ubWF4X2lkIDwgTUFYX1RBUkdFVCkKKwkJCXNob3N0LT5tYXhfaWQgPSBpbmZvLm1heF9pZCArIDE7CisKKwkJaWYgKGluZm8ubGFyZ2Vfc2cgJiYgc2hvc3QtPnNnX3RhYmxlc2l6ZSA9PSBNQVhfU0dMSVNUKQorCQkJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IE1BWF9MQVJHRV9TR0xJU1Q7CisJfQorCisJaWYgKHByb3RvY29sX3JldiA9PSAnQycpIHsKKwkJaWYgKGluZm8ubWF4X2x1biA+IDcgJiYgaW5mby5tYXhfbHVuIDwgTUFYX0xVTikKKwkJCXNob3N0LT5tYXhfbHVuID0gaW5mby5tYXhfbHVuICsgMTsKKwl9CisKKwlpZiAoZG1hX2NoYW5uZWwgPT0gTk9fRE1BKQorCQlzcHJpbnRmKGRtYV9uYW1lLCAiJXMiLCAiQk1TVCIpOworCWVsc2UKKwkJc3ByaW50ZihkbWFfbmFtZSwgIkRNQSAldSIsIGRtYV9jaGFubmVsKTsKKworCXNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IHNob3N0LT5jYW5fcXVldWU7IGkrKykKKwkJaGEtPmNwW2ldLmNwX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoaGEtPnBkZXYsCisJCQkJCQkJICAmaGEtPmNwW2ldLAorCQkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBtc2NwKSwKKwkJCQkJCQkgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2hvc3QtPmNhbl9xdWV1ZTsgaSsrKSB7CisJCXNpemVfdCBzeiA9IHNob3N0LT5zZ190YWJsZXNpemUgKnNpemVvZihzdHJ1Y3Qgc2dfbGlzdCk7CisJCXVuc2lnbmVkIGludCBnZnBfbWFzayA9IChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyBHRlBfRE1BIDogMCkgfCBHRlBfQVRPTUlDOworCQloYS0+Y3BbaV0uc2dsaXN0ID0ga21hbGxvYyhzeiwgZ2ZwX21hc2spOworCQlpZiAoIWhhLT5jcFtpXS5zZ2xpc3QpIHsKKwkJCXByaW50aworCQkJICAgICgiJXM6IGttYWxsb2MgU0dsaXN0IGZhaWxlZCwgbWJveCAlZCwgZGV0YWNoaW5nLlxuIiwKKwkJCSAgICAgaGEtPmJvYXJkX25hbWUsIGkpOworCQkJZ290byByZWxlYXNlOworCQl9CisJfQorCisJaWYgKCEoaGEtPnNwX2NwdV9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsCisJCQkJCQkJc2l6ZW9mKHN0cnVjdCBtc3NwKSwKKwkJCQkJCQkmaGEtPnNwX2RtYV9hZGRyKSkpIHsKKwkJcHJpbnRrKCIlczogcGNpX2FsbG9jX2NvbnNpc3RlbnQgZmFpbGVkLCBkZXRhY2hpbmcuXG4iLCBoYS0+Ym9hcmRfbmFtZSk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwlpZiAobWF4X3F1ZXVlX2RlcHRoID4gTUFYX1RBR0dFRF9DTURfUEVSX0xVTikKKwkJbWF4X3F1ZXVlX2RlcHRoID0gTUFYX1RBR0dFRF9DTURfUEVSX0xVTjsKKworCWlmIChtYXhfcXVldWVfZGVwdGggPCBNQVhfQ01EX1BFUl9MVU4pCisJCW1heF9xdWV1ZV9kZXB0aCA9IE1BWF9DTURfUEVSX0xVTjsKKworCWlmICh0YWdfbW9kZSAhPSBUQUdfRElTQUJMRUQgJiYgdGFnX21vZGUgIT0gVEFHX1NJTVBMRSkKKwkJdGFnX21vZGUgPSBUQUdfT1JERVJFRDsKKworCWlmIChqID09IDApIHsKKwkJcHJpbnRrCisJCSAgICAoIkVBVEEvRE1BIDIuMHg6IENvcHlyaWdodCAoQykgMTk5NC0yMDAzIERhcmlvIEJhbGxhYmlvLlxuIik7CisJCXByaW50aworCQkgICAgKCIlcyBjb25maWcgb3B0aW9ucyAtPiB0bTolZCwgbGM6JWMsIG1xOiVkLCByczolYywgZXQ6JWMsICIKKwkJICAgICAiaXA6JWMsIGVwOiVjLCBwcDolYy5cbiIsIGRyaXZlcl9uYW1lLCB0YWdfbW9kZSwKKwkJICAgICBZRVNOTyhsaW5rZWRfY29tbSksIG1heF9xdWV1ZV9kZXB0aCwgWUVTTk8ocmV2X3NjYW4pLAorCQkgICAgIFlFU05PKGV4dF90cmFuKSwgWUVTTk8oaXNhX3Byb2JlKSwgWUVTTk8oZWlzYV9wcm9iZSksCisJCSAgICAgWUVTTk8ocGNpX3Byb2JlKSk7CisJfQorCisJcHJpbnRrKCIlczogMi4wJWMsICVzIDB4JTAzbHgsIElSUSAldSwgJXMsIFNHICVkLCBNQiAlZC5cbiIsCisJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBoYS0+cHJvdG9jb2xfcmV2LCBidXNfdHlwZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5pcnEsIGRtYV9uYW1lLAorCSAgICAgICBzaG9zdC0+c2dfdGFibGVzaXplLCBzaG9zdC0+Y2FuX3F1ZXVlKTsKKworCWlmIChzaG9zdC0+bWF4X2lkID4gOCB8fCBzaG9zdC0+bWF4X2x1biA+IDgpCisJCXByaW50aworCQkgICAgKCIlczogd2lkZSBTQ1NJIHN1cHBvcnQgZW5hYmxlZCwgbWF4X2lkICV1LCBtYXhfbHVuICV1LlxuIiwKKwkJICAgICBoYS0+Ym9hcmRfbmFtZSwgc2hvc3QtPm1heF9pZCwgc2hvc3QtPm1heF9sdW4pOworCisJZm9yIChpID0gMDsgaSA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7IGkrKykKKwkJcHJpbnRrKCIlczogU0NTSSBjaGFubmVsICV1IGVuYWJsZWQsIGhvc3QgdGFyZ2V0IElEICVkLlxuIiwKKwkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBpbmZvLmhvc3RfYWRkclszIC0gaV0pOworCisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisJcHJpbnRrKCIlczogVmVycy4gMHgleCwgb2NzICV1LCB0YXIgJXUsIHRybnhmciAldSwgbW9yZSAldSwgU1lOQyAweCV4LCAiCisJICAgICAgICJzZWMuICV1LCBpbmZvbCAlZCwgY3BsICVkIHNwbCAlZC5cbiIsIG5hbWUsIGluZm8udmVyc2lvbiwKKwkgICAgICAgaW5mby5vY3NlbmEsIGluZm8udGFyc3VwLCBpbmZvLnRybnhmciwgaW5mby5tb3JzdXAsIGluZm8uc3luYywKKwkgICAgICAgaW5mby5zZWNvbmQsIGluZm8uZGF0YV9sZW4sIGluZm8uY3BfbGVuLCBpbmZvLnNwX2xlbik7CisKKwlpZiAocHJvdG9jb2xfcmV2ID09ICdCJyB8fCBwcm90b2NvbF9yZXYgPT0gJ0MnKQorCQlwcmludGsoIiVzOiBpc2FlbmEgJXUsIGZvcmNhZGRyICV1LCBtYXhfaWQgJXUsIG1heF9jaGFuICV1LCAiCisJCSAgICAgICAibGFyZ2Vfc2cgJXUsIHJlczEgJXUuXG4iLCBuYW1lLCBpbmZvLmlzYWVuYSwKKwkJICAgICAgIGluZm8uZm9yY2FkZHIsIGluZm8ubWF4X2lkLCBpbmZvLm1heF9jaGFuLCBpbmZvLmxhcmdlX3NnLAorCQkgICAgICAgaW5mby5yZXMxKTsKKworCWlmIChwcm90b2NvbF9yZXYgPT0gJ0MnKQorCQlwcmludGsoIiVzOiBtYXhfbHVuICV1LCBtMSAldSwgaWRxdWVzdCAldSwgcGNpICV1LCBlaXNhICV1LCAiCisJCSAgICAgICAicmFpZG51bSAldS5cbiIsIG5hbWUsIGluZm8ubWF4X2x1biwgaW5mby5tMSwKKwkJICAgICAgIGluZm8uaWRxdWVzdCwgaW5mby5wY2ksIGluZm8uZWlzYSwgaW5mby5yYWlkbnVtKTsKKyNlbmRpZgorCisJaWYgKGhhLT5wZGV2KSB7CisJCXBjaV9zZXRfbWFzdGVyKGhhLT5wZGV2KTsKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIDB4ZmZmZmZmZmYpKQorCQkJcHJpbnRrKCIlczogd2FybmluZywgcGNpX3NldF9kbWFfbWFzayBmYWlsZWQuXG4iLAorCQkJICAgICAgIGhhLT5ib2FyZF9uYW1lKTsKKwl9CisKKwlyZXR1cm4gMTsKKworICAgICAgZnJlZWRtYToKKwlpZiAoc3VidmVyc2lvbiA9PSBJU0EpCisJCWZyZWVfZG1hKGRtYV9jaGFubmVsKTsKKyAgICAgIGZyZWVpcnE6CisJZnJlZV9pcnEoaXJxLCAmc2hhW2pdKTsKKyAgICAgIGZyZWVsb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOworCXJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgUkVHSU9OX1NJWkUpOworICAgICAgZmFpbDoKKwlyZXR1cm4gMDsKKworICAgICAgcmVsZWFzZToKKwllYXRhMnhfcmVsZWFzZShzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCWludCBpLCBhcmdjID0gaW50c1swXTsKKwljaGFyICpjdXIgPSBzdHIsICpwYzsKKworCWlmIChhcmdjID4gMCkgeworCQlpZiAoYXJnYyA+IE1BWF9JTlRfUEFSQU0pCisJCQlhcmdjID0gTUFYX0lOVF9QQVJBTTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorCQkJaW9fcG9ydFtpXSA9IGludHNbaSArIDFdOworCisJCWlvX3BvcnRbaV0gPSAwOworCQlzZXR1cF9kb25lID0gMTsKKwl9CisKKwl3aGlsZSAoY3VyICYmIChwYyA9IHN0cmNocihjdXIsICc6JykpKSB7CisJCWludCB2YWwgPSAwLCBjID0gKisrcGM7CisKKwkJaWYgKGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQkJdmFsID0gMDsKKwkJZWxzZSBpZiAoYyA9PSAneScgfHwgYyA9PSAnWScpCisJCQl2YWwgPSAxOworCQllbHNlCisJCQl2YWwgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKHBjLCBOVUxMLCAwKTsKKworCQlpZiAoIXN0cm5jbXAoY3VyLCAibGM6IiwgMykpCisJCQlsaW5rZWRfY29tbSA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAidG06IiwgMykpCisJCQl0YWdfbW9kZSA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAidGM6IiwgMykpCisJCQl0YWdfbW9kZSA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAibXE6IiwgMykpCisJCQltYXhfcXVldWVfZGVwdGggPSB2YWw7CisJCWVsc2UgaWYgKCFzdHJuY21wKGN1ciwgImxzOiIsIDMpKQorCQkJbGlua19zdGF0aXN0aWNzID0gdmFsOworCQllbHNlIGlmICghc3RybmNtcChjdXIsICJldDoiLCAzKSkKKwkJCWV4dF90cmFuID0gdmFsOworCQllbHNlIGlmICghc3RybmNtcChjdXIsICJyczoiLCAzKSkKKwkJCXJldl9zY2FuID0gdmFsOworCQllbHNlIGlmICghc3RybmNtcChjdXIsICJpcDoiLCAzKSkKKwkJCWlzYV9wcm9iZSA9IHZhbDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAiZXA6IiwgMykpCisJCQllaXNhX3Byb2JlID0gdmFsOworCQllbHNlIGlmICghc3RybmNtcChjdXIsICJwcDoiLCAzKSkKKwkJCXBjaV9wcm9iZSA9IHZhbDsKKworCQlpZiAoKGN1ciA9IHN0cmNocihjdXIsICcsJykpKQorCQkJKytjdXI7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG9wdGlvbl9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbTUFYX0lOVF9QQVJBTV07CisJY2hhciAqY3VyID0gc3RyOworCWludCBpID0gMTsKKworCXdoaWxlIChjdXIgJiYgaXNkaWdpdCgqY3VyKSAmJiBpIDw9IE1BWF9JTlRfUEFSQU0pIHsKKwkJaW50c1tpKytdID0gc2ltcGxlX3N0cnRvdWwoY3VyLCBOVUxMLCAwKTsKKworCQlpZiAoKGN1ciA9IHN0cmNocihjdXIsICcsJykpICE9IE5VTEwpCisJCQljdXIrKzsKKwl9CisKKwlpbnRzWzBdID0gaSAtIDE7CisJaW50ZXJuYWxfc2V0dXAoY3VyLCBpbnRzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgYWRkX3BjaV9wb3J0cyh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwl1bnNpZ25lZCBpbnQgYWRkciwgazsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCWZvciAoayA9IDA7IGsgPCBNQVhfUENJOyBrKyspIHsKKworCQlpZiAoIShkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19TVE9SQUdFX1NDU0kgPDwgOCwgZGV2KSkpCisJCQlicmVhazsKKworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgeworI2lmIGRlZmluZWQoREVCVUdfUENJX0RFVEVDVCkKKwkJCXByaW50aworCQkJICAgICgiJXM6IGRldGVjdCwgYnVzICVkLCBkZXZmbiAweCV4LCBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQuXG4iLAorCQkJICAgICBkcml2ZXJfbmFtZSwgZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CisjZW5kaWYKKworCQkJY29udGludWU7CisJCX0KKworCQlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CisKKyNpZiBkZWZpbmVkKERFQlVHX1BDSV9ERVRFQ1QpCisJCXByaW50aygiJXM6IGRldGVjdCwgc2VxLiAlZCwgYnVzICVkLCBkZXZmbiAweCV4LCBhZGRyIDB4JXguXG4iLAorCQkgICAgICAgZHJpdmVyX25hbWUsIGssIGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4sIGFkZHIpOworI2VuZGlmCisKKwkJLyogT3JkZXIgYWRkcmVzc2VzIGFjY29yZGluZyB0byByZXZfc2NhbiB2YWx1ZSAqLworCQlpb19wb3J0W01BWF9JTlRfUEFSQU0gKyAocmV2X3NjYW4gPyAoTUFYX1BDSSAtIGspIDogKDEgKyBrKSldID0KKwkJICAgIGFkZHIgKyBQQ0lfQkFTRV9BRERSRVNTXzA7CisJfQorCisJcGNpX2Rldl9wdXQoZGV2KTsKKyNlbmRpZgkJCQkvKiBlbmQgQ09ORklHX1BDSSAqLworfQorCitzdGF0aWMgaW50IGVhdGEyeF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKwl1bnNpZ25lZCBpbnQgaiA9IDAsIGs7CisKKwl0cG50LT5wcm9jX25hbWUgPSAiZWF0YTJ4IjsKKworCWlmIChzdHJsZW4oYm9vdF9vcHRpb25zKSkKKwkJb3B0aW9uX3NldHVwKGJvb3Rfb3B0aW9ucyk7CisKKyNpZiBkZWZpbmVkKE1PRFVMRSkKKwkvKiBpb19wb3J0IGNvdWxkIGhhdmUgYmVlbiBtb2RpZmllZCB3aGVuIGxvYWRpbmcgYXMgYSBtb2R1bGUgKi8KKwlpZiAoaW9fcG9ydFswXSAhPSBTS0lQKSB7CisJCXNldHVwX2RvbmUgPSAxOworCQlpb19wb3J0W01BWF9JTlRfUEFSQU1dID0gMDsKKwl9CisjZW5kaWYKKworCWZvciAoayA9IE1BWF9JTlRfUEFSQU07IGlvX3BvcnRba107IGsrKykKKwkJaWYgKGlvX3BvcnRba10gPT0gU0tJUCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChpb19wb3J0W2tdIDw9IE1BWF9JU0FfQUREUikgeworCQkJaWYgKCFpc2FfcHJvYmUpCisJCQkJaW9fcG9ydFtrXSA9IFNLSVA7CisJCX0gZWxzZSBpZiAoaW9fcG9ydFtrXSA+PSBNSU5fRUlTQV9BRERSCisJCQkgICAmJiBpb19wb3J0W2tdIDw9IE1BWF9FSVNBX0FERFIpIHsKKwkJCWlmICghZWlzYV9wcm9iZSkKKwkJCQlpb19wb3J0W2tdID0gU0tJUDsKKwkJfQorCisJaWYgKHBjaV9wcm9iZSkgeworCQlpZiAoIXNldHVwX2RvbmUpCisJCQlhZGRfcGNpX3BvcnRzKCk7CisJCWVsc2UKKwkJCWVuYWJsZV9wY2lfcG9ydHMoKTsKKwl9CisKKwlmb3IgKGsgPSAwOyBpb19wb3J0W2tdOyBrKyspIHsKKworCQlpZiAoaW9fcG9ydFtrXSA9PSBTS0lQKQorCQkJY29udGludWU7CisKKwkJaWYgKGogPCBNQVhfQk9BUkRTICYmIHBvcnRfZGV0ZWN0KGlvX3BvcnRba10sIGosIHRwbnQpKQorCQkJaisrOworCX0KKworCW51bV9ib2FyZHMgPSBqOworCXJldHVybiBqOworfQorCitzdGF0aWMgdm9pZCBtYXBfZG1hKHVuc2lnbmVkIGludCBpLCBzdHJ1Y3QgaG9zdGRhdGEgKmhhKQoreworCXVuc2lnbmVkIGludCBrLCBjb3VudCwgcGNpX2RpcjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50OworCXN0cnVjdCBtc2NwICpjcHA7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKwljcHAgPSAmaGEtPmNwW2ldOworCVNDcG50ID0gY3BwLT5TQ3BudDsKKwlwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJaWYgKFNDcG50LT5zZW5zZV9idWZmZXIpCisJCWNwcC0+c2Vuc2VfYWRkciA9CisJCSAgICBIMkRFVihwY2lfbWFwX3NpbmdsZShoYS0+cGRldiwgU0NwbnQtPnNlbnNlX2J1ZmZlciwKKwkJCSAgIHNpemVvZiBTQ3BudC0+c2Vuc2VfYnVmZmVyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKworCWNwcC0+c2Vuc2VfbGVuID0gc2l6ZW9mIFNDcG50LT5zZW5zZV9idWZmZXI7CisKKwlpZiAoIVNDcG50LT51c2Vfc2cpIHsKKworCQkvKiBJZiB3ZSBnZXQgaGVyZSB3aXRoIFBDSV9ETUFfTk9ORSwgcGNpX21hcF9zaW5nbGUgdHJpZ2dlcnMgYSBCVUcoKSAqLworCQlpZiAoIVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pCisJCQlwY2lfZGlyID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCisJCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmZXIpCisJCQljcHAtPmRhdGFfYWRkcmVzcyA9IEgyREVWKHBjaV9tYXBfc2luZ2xlKGhhLT5wZGV2LAorCQkJCQkJCQkgU0NwbnQtPgorCQkJCQkJCQkgcmVxdWVzdF9idWZmZXIsCisJCQkJCQkJCSBTQ3BudC0+CisJCQkJCQkJCSByZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkJCSBwY2lfZGlyKSk7CisKKwkJY3BwLT5kYXRhX2xlbiA9IEgyREVWKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworCQlyZXR1cm47CisJfQorCisJc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCWNvdW50ID0gcGNpX21hcF9zZyhoYS0+cGRldiwgc2dwbnQsIFNDcG50LT51c2Vfc2csIHBjaV9kaXIpOworCisJZm9yIChrID0gMDsgayA8IGNvdW50OyBrKyspIHsKKwkJY3BwLT5zZ2xpc3Rba10uYWRkcmVzcyA9IEgyREVWKHNnX2RtYV9hZGRyZXNzKCZzZ3BudFtrXSkpOworCQljcHAtPnNnbGlzdFtrXS5udW1fYnl0ZXMgPSBIMkRFVihzZ19kbWFfbGVuKCZzZ3BudFtrXSkpOworCX0KKworCWNwcC0+c2cgPSAxOworCWNwcC0+ZGF0YV9hZGRyZXNzID0gSDJERVYocGNpX21hcF9zaW5nbGUoaGEtPnBkZXYsIGNwcC0+c2dsaXN0LAorCQkJCQkJIFNDcG50LT51c2Vfc2cgKgorCQkJCQkJIHNpemVvZihzdHJ1Y3Qgc2dfbGlzdCksCisJCQkJCQkgcGNpX2RpcikpOworCWNwcC0+ZGF0YV9sZW4gPSBIMkRFVigoU0NwbnQtPnVzZV9zZyAqIHNpemVvZihzdHJ1Y3Qgc2dfbGlzdCkpKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXBfZG1hKHVuc2lnbmVkIGludCBpLCBzdHJ1Y3QgaG9zdGRhdGEgKmhhKQoreworCXVuc2lnbmVkIGludCBwY2lfZGlyOworCXN0cnVjdCBtc2NwICpjcHA7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKwljcHAgPSAmaGEtPmNwW2ldOworCVNDcG50ID0gY3BwLT5TQ3BudDsKKwlwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJaWYgKERFVjJIKGNwcC0+c2Vuc2VfYWRkcikpCisJCXBjaV91bm1hcF9zaW5nbGUoaGEtPnBkZXYsIERFVjJIKGNwcC0+c2Vuc2VfYWRkciksCisJCQkJIERFVjJIKGNwcC0+c2Vuc2VfbGVuKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCWlmIChTQ3BudC0+dXNlX3NnKQorCQlwY2lfdW5tYXBfc2coaGEtPnBkZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnVzZV9zZywKKwkJCSAgICAgcGNpX2Rpcik7CisKKwlpZiAoIURFVjJIKGNwcC0+ZGF0YV9sZW4pKQorCQlwY2lfZGlyID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCisJaWYgKERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSkKKwkJcGNpX3VubWFwX3NpbmdsZShoYS0+cGRldiwgREVWMkgoY3BwLT5kYXRhX2FkZHJlc3MpLAorCQkJCSBERVYySChjcHAtPmRhdGFfbGVuKSwgcGNpX2Rpcik7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfZG1hKHVuc2lnbmVkIGludCBpLCBzdHJ1Y3QgaG9zdGRhdGEgKmhhKQoreworCXVuc2lnbmVkIGludCBwY2lfZGlyOworCXN0cnVjdCBtc2NwICpjcHA7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKwljcHAgPSAmaGEtPmNwW2ldOworCVNDcG50ID0gY3BwLT5TQ3BudDsKKwlwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJaWYgKERFVjJIKGNwcC0+c2Vuc2VfYWRkcikpCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShoYS0+cGRldiwgREVWMkgoY3BwLT5zZW5zZV9hZGRyKSwKKwkJCQkJICAgIERFVjJIKGNwcC0+c2Vuc2VfbGVuKSwKKwkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlpZiAoU0NwbnQtPnVzZV9zZykKKwkJcGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUoaGEtPnBkZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJU0NwbnQtPnVzZV9zZywgcGNpX2Rpcik7CisKKwlpZiAoIURFVjJIKGNwcC0+ZGF0YV9sZW4pKQorCQlwY2lfZGlyID0gUENJX0RNQV9CSURJUkVDVElPTkFMOworCisJaWYgKERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSkKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhhLT5wZGV2LAorCQkJCQkgICAgREVWMkgoY3BwLT5kYXRhX2FkZHJlc3MpLAorCQkJCQkgICAgREVWMkgoY3BwLT5kYXRhX2xlbiksIHBjaV9kaXIpOworfQorCitzdGF0aWMgdm9pZCBzY3NpX3RvX2Rldl9kaXIodW5zaWduZWQgaW50IGksIHN0cnVjdCBob3N0ZGF0YSAqaGEpCit7CisJdW5zaWduZWQgaW50IGs7CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXRhX291dF9jbWRzW10gPSB7CisJCTB4MGEsIDB4MmEsIDB4MTUsIDB4NTUsIDB4MDQsIDB4MDcsIDB4MTgsIDB4MWQsIDB4MjQsIDB4MmUsCisJCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2QsIDB4M2YsIDB4NDAsCisJCTB4NDEsIDB4NGMsIDB4YWEsIDB4YWUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjYsIDB4ZWEsIDB4MWIsIDB4NWQKKwl9OworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9ub25lX2NtZHNbXSA9IHsKKwkJMHgwMSwgMHgwYiwgMHgxMCwgMHgxMSwgMHgxMywgMHgxNiwgMHgxNywgMHgxOSwgMHgyYiwgMHgxZSwKKwkJMHgyYywgMHhhYywgMHgyZiwgMHhhZiwgMHgzMywgMHhiMywgMHgzNSwgMHgzNiwgMHg0NSwgMHg0NywKKwkJMHg0OCwgMHg0OSwgMHhhOSwgMHg0YiwgMHhhNSwgMHhhNiwgMHhiNSwgMHgwMAorCX07CisKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisJY3BwID0gJmhhLT5jcFtpXTsKKwlTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKwlpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQljcHAtPmRpbiA9IDE7CisJCWNwcC0+ZG91dCA9IDA7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCWNwcC0+ZGluID0gMDsKKwkJY3BwLT5kb3V0ID0gMTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7CisJCWNwcC0+ZGluID0gMDsKKwkJY3BwLT5kb3V0ID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gIT0gRE1BX0JJRElSRUNUSU9OQUwpCisJCXBhbmljKCIlczogcWNvbW0sIGludmFsaWQgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uLlxuIiwKKwkJCQloYS0+Ym9hcmRfbmFtZSk7CisKKwlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShkYXRhX291dF9jbWRzKTsgaysrKQorCQlpZiAoU0NwbnQtPmNtbmRbMF0gPT0gZGF0YV9vdXRfY21kc1trXSkgeworCQkJY3BwLT5kb3V0ID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoKGNwcC0+ZGluID0gIWNwcC0+ZG91dCkpCisJCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKGRhdGFfbm9uZV9jbWRzKTsgaysrKQorCQkJaWYgKFNDcG50LT5jbW5kWzBdID09IGRhdGFfbm9uZV9jbWRzW2tdKSB7CisJCQkJY3BwLT5kaW4gPSAwOworCQkJCWJyZWFrOworCQkJfQorCit9CisKK3N0YXRpYyBpbnQgZWF0YTJ4X3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgICAgICB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBob3N0ZGF0YSAqaGEgPSAoc3RydWN0IGhvc3RkYXRhICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCBpLCBrOworCXN0cnVjdCBtc2NwICpjcHA7CisKKwlpZiAoU0NwbnQtPmhvc3Rfc2NyaWJibGUpCisJCXBhbmljKCIlczogcWNvbW0sIHBpZCAlbGQsIFNDcG50ICVwIGFscmVhZHkgYWN0aXZlLlxuIiwKKwkJICAgICAgaGEtPmJvYXJkX25hbWUsIFNDcG50LT5waWQsIFNDcG50KTsKKworCS8qIGkgaXMgdGhlIG1haWxib3ggbnVtYmVyLCBsb29rIGZvciB0aGUgZmlyc3QgZnJlZSBtYWlsYm94CisJICAgc3RhcnRpbmcgZnJvbSBsYXN0X2NwX3VzZWQgKi8KKwlpID0gaGEtPmxhc3RfY3BfdXNlZCArIDE7CisKKwlmb3IgKGsgPSAwOyBrIDwgc2hvc3QtPmNhbl9xdWV1ZTsgaysrLCBpKyspIHsKKwkJaWYgKGkgPj0gc2hvc3QtPmNhbl9xdWV1ZSkKKwkJCWkgPSAwOworCQlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gRlJFRSkgeworCQkJaGEtPmxhc3RfY3BfdXNlZCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChrID09IHNob3N0LT5jYW5fcXVldWUpIHsKKwkJcHJpbnRrKCIlczogcWNvbW0sIG5vIGZyZWUgbWFpbGJveC5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU2V0IHBvaW50ZXIgdG8gY29udHJvbCBwYWNrZXQgc3RydWN0dXJlICovCisJY3BwID0gJmhhLT5jcFtpXTsKKworCW1lbXNldChjcHAsIDAsIHNpemVvZihzdHJ1Y3QgbXNjcCkgLSBDUF9UQUlMX1NJWkUpOworCisJLyogU2V0IHBvaW50ZXIgdG8gc3RhdHVzIHBhY2tldCBzdHJ1Y3R1cmUsIEJpZyBFbmRpYW4gZm9ybWF0ICovCisJY3BwLT5zcF9kbWFfYWRkciA9IEgyREVWKGhhLT5zcF9kbWFfYWRkcik7CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwljcHAtPmNwcF9pbmRleCA9IGk7CisJU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSZjcHAtPmNwcF9pbmRleDsKKworCWlmIChkb190cmFjZSkKKwkJcHJpbnRrKCIlczogcWNvbW0sIG1ib3ggJWQsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZC5cbiIsCisJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsCisJCSAgICAgICBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQpOworCisJY3BwLT5yZXFzZW4gPSAxOworCWNwcC0+ZGlzcHJpID0gMTsKKyNpZiAwCisJaWYgKFNDcG50LT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9UQVBFKQorCQljcHAtPmhiYWNpID0gMTsKKyNlbmRpZgorCWNwcC0+b25lID0gMTsKKwljcHAtPmNoYW5uZWwgPSBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsOworCWNwcC0+dGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJY3BwLT5sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CisJY3BwLT5TQ3BudCA9IFNDcG50OworCW1lbWNweShjcHAtPmNkYiwgU0NwbnQtPmNtbmQsIFNDcG50LT5jbWRfbGVuKTsKKworCS8qIFVzZSBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gKi8KKwlzY3NpX3RvX2Rldl9kaXIoaSwgaGEpOworCisJLyogTWFwIERNQSBidWZmZXJzIGFuZCBTRyBsaXN0ICovCisJbWFwX2RtYShpLCBoYSk7CisKKwlpZiAobGlua2VkX2NvbW0gJiYgU0NwbnQtPmRldmljZS0+cXVldWVfZGVwdGggPiAyCisJICAgICYmIFRMREVWKFNDcG50LT5kZXZpY2UtPnR5cGUpKSB7CisJCWhhLT5jcF9zdGF0W2ldID0gUkVBRFk7CisJCWZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBoYSwgMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFNlbmQgY29udHJvbCBwYWNrZXQgdG8gdGhlIGJvYXJkICovCisJaWYgKGRvX2RtYShzaG9zdC0+aW9fcG9ydCwgY3BwLT5jcF9kbWFfYWRkciwgU0VORF9DUF9ETUEpKSB7CisJCXVubWFwX2RtYShpLCBoYSk7CisJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJcHJpbnRrKCIlczogcWNvbW0sIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCwgYWRhcHRlciBidXN5LlxuIiwKKwkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCk7CisJCXJldHVybiAxOworCX0KKworCWhhLT5jcF9zdGF0W2ldID0gSU5fVVNFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVhdGEyeF9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ2FyZykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IFNDYXJnLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IGhvc3RkYXRhICpoYSA9IChzdHJ1Y3QgaG9zdGRhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoU0NhcmctPmhvc3Rfc2NyaWJibGUgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBhYm9ydCwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkIGluYWN0aXZlLlxuIiwKKwkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBTQ2FyZy0+ZGV2aWNlLT5jaGFubmVsLCBTQ2FyZy0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIFNDYXJnLT5kZXZpY2UtPmx1biwgU0NhcmctPnBpZCk7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCWkgPSAqKHVuc2lnbmVkIGludCAqKVNDYXJnLT5ob3N0X3NjcmliYmxlOworCXByaW50aygiJXM6IGFib3J0LCBtYm94ICVkLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQuXG4iLAorCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NhcmctPmRldmljZS0+Y2hhbm5lbCwgU0NhcmctPmRldmljZS0+aWQsCisJICAgICAgIFNDYXJnLT5kZXZpY2UtPmx1biwgU0NhcmctPnBpZCk7CisKKwlpZiAoaSA+PSBzaG9zdC0+Y2FuX3F1ZXVlKQorCQlwYW5pYygiJXM6IGFib3J0LCBpbnZhbGlkIFNDYXJnLT5ob3N0X3NjcmliYmxlLlxuIiwgaGEtPmJvYXJkX25hbWUpOworCisJaWYgKHdhaXRfb25fYnVzeShzaG9zdC0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKKwkJcHJpbnRrKCIlczogYWJvcnQsIHRpbWVvdXQgZXJyb3IuXG4iLCBoYS0+Ym9hcmRfbmFtZSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGhhLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKKwkJcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgZnJlZS5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJaWYgKGhhLT5jcF9zdGF0W2ldID09IElOX1VTRSkgeworCQlwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCBpcyBpbiB1c2UuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaSk7CisKKwkJaWYgKFNDYXJnICE9IGhhLT5jcFtpXS5TQ3BudCkKKwkJCXBhbmljKCIlczogYWJvcnQsIG1ib3ggJWQsIFNDYXJnICVwLCBjcCBTQ3BudCAlcC5cbiIsCisJCQkgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NhcmcsIGhhLT5jcFtpXS5TQ3BudCk7CisKKwkJaWYgKGluYihzaG9zdC0+aW9fcG9ydCArIFJFR19BVVhfU1RBVFVTKSAmIElSUV9BU1NFUlRFRCkKKwkJCXByaW50aygiJXM6IGFib3J0LCBtYm94ICVkLCBpbnRlcnJ1cHQgcGVuZGluZy5cbiIsCisJCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIGkpOworCisJCWlmIChTQ2FyZy0+ZWhfc3RhdGUgPT0gU0NTSV9TVEFURV9USU1FT1VUKSB7CisJCQl1bm1hcF9kbWEoaSwgaGEpOworCQkJU0NhcmctPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQkJaGEtPmNwX3N0YXRbaV0gPSBGUkVFOworCQkJcHJpbnRrCisJCQkgICAgKCIlcywgYWJvcnQsIG1ib3ggJWQsIGVoX3N0YXRlIHRpbWVvdXQsIHBpZCAlbGQuXG4iLAorCQkJICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NhcmctPnBpZCk7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGhhLT5jcF9zdGF0W2ldID09IElOX1JFU0VUKSB7CisJCXByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGluIHJlc2V0LlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBMT0NLRUQpIHsKKwkJcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgbG9ja2VkLlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gUkVBRFkgfHwgaGEtPmNwX3N0YXRbaV0gPT0gQUJPUlRJTkcpIHsKKwkJdW5tYXBfZG1hKGksIGhhKTsKKwkJU0NhcmctPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJU0NhcmctPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQloYS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisJCXByaW50aygiJXMsIGFib3J0LCBtYm94ICVkIHJlYWR5LCBESURfQUJPUlQsIHBpZCAlbGQgZG9uZS5cbiIsCisJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NhcmctPnBpZCk7CisJCVNDYXJnLT5zY3NpX2RvbmUoU0NhcmcpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwlwYW5pYygiJXM6IGFib3J0LCBtYm94ICVkLCBpbnZhbGlkIGNwX3N0YXQuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaSk7Cit9CisKK3N0YXRpYyBpbnQgZWF0YTJ4X2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NhcmcpCit7CisJdW5zaWduZWQgaW50IGksIHRpbWUsIGssIGMsIGxpbWl0ID0gMDsKKwlpbnQgYXJnX2RvbmUgPSAwOworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gU0NhcmctPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgaG9zdGRhdGEgKmhhID0gKHN0cnVjdCBob3N0ZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKworCXByaW50aygiJXM6IHJlc2V0LCBlbnRlciwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLlxuIiwKKwkgICAgICAgaGEtPmJvYXJkX25hbWUsIFNDYXJnLT5kZXZpY2UtPmNoYW5uZWwsIFNDYXJnLT5kZXZpY2UtPmlkLAorCSAgICAgICBTQ2FyZy0+ZGV2aWNlLT5sdW4sIFNDYXJnLT5waWQpOworCisJaWYgKFNDYXJnLT5ob3N0X3NjcmliYmxlID09IE5VTEwpCisJCXByaW50aygiJXM6IHJlc2V0LCBwaWQgJWxkIGluYWN0aXZlLlxuIiwgaGEtPmJvYXJkX25hbWUsIFNDYXJnLT5waWQpOworCisJaWYgKGhhLT5pbl9yZXNldCkgeworCQlwcmludGsoIiVzOiByZXNldCwgZXhpdCwgYWxyZWFkeSBpbiByZXNldC5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpZiAod2FpdF9vbl9idXN5KHNob3N0LT5pb19wb3J0LCBNQVhMT09QKSkgeworCQlwcmludGsoIiVzOiByZXNldCwgZXhpdCwgdGltZW91dCBlcnJvci5cbiIsIGhhLT5ib2FyZF9uYW1lKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwloYS0+cmV0cmllcyA9IDA7CisKKwlmb3IgKGMgPSAwOyBjIDw9IHNob3N0LT5tYXhfY2hhbm5lbDsgYysrKQorCQlmb3IgKGsgPSAwOyBrIDwgc2hvc3QtPm1heF9pZDsgaysrKSB7CisJCQloYS0+dGFyZ2V0X3JlZG9ba11bY10gPSAxOworCQkJaGEtPnRhcmdldF90b1trXVtjXSA9IDA7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaG9zdC0+Y2FuX3F1ZXVlOyBpKyspIHsKKworCQlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gRlJFRSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBMT0NLRUQpIHsKKwkJCWhhLT5jcF9zdGF0W2ldID0gRlJFRTsKKwkJCXByaW50aygiJXM6IHJlc2V0LCBsb2NrZWQgbWJveCAlZCBmb3JjZWQgZnJlZS5cbiIsCisJCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShTQ3BudCA9IGhhLT5jcFtpXS5TQ3BudCkpCisJCQlwYW5pYygiJXM6IHJlc2V0LCBtYm94ICVkLCBTQ3BudCA9PSBOVUxMLlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCisJCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBSRUFEWSB8fCBoYS0+Y3Bfc3RhdFtpXSA9PSBBQk9SVElORykgeworCQkJaGEtPmNwX3N0YXRbaV0gPSBBQk9SVElORzsKKwkJCXByaW50aygiJXM6IHJlc2V0LCBtYm94ICVkIGFib3J0aW5nLCBwaWQgJWxkLlxuIiwKKwkJCSAgICAgICBoYS0+Ym9hcmRfbmFtZSwgaSwgU0NwbnQtPnBpZCk7CisJCX0KKworCQllbHNlIHsKKwkJCWhhLT5jcF9zdGF0W2ldID0gSU5fUkVTRVQ7CisJCQlwcmludGsoIiVzOiByZXNldCwgbWJveCAlZCBpbiByZXNldCwgcGlkICVsZC5cbiIsCisJCQkgICAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDcG50LT5waWQpOworCQl9CisKKwkJaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlID09IE5VTEwpCisJCQlwYW5pYygiJXM6IHJlc2V0LCBtYm94ICVkLCBnYXJibGVkIFNDcG50LlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCisJCWlmICgqKHVuc2lnbmVkIGludCAqKVNDcG50LT5ob3N0X3NjcmliYmxlICE9IGkpCisJCQlwYW5pYygiJXM6IHJlc2V0LCBtYm94ICVkLCBpbmRleCBtaXNtYXRjaC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpKTsKKworCQlpZiAoU0NwbnQtPnNjc2lfZG9uZSA9PSBOVUxMKQorCQkJcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgU0NwbnQtPnNjc2lfZG9uZSA9PSBOVUxMLlxuIiwKKwkJCSAgICAgIGhhLT5ib2FyZF9uYW1lLCBpKTsKKworCQlpZiAoU0NwbnQgPT0gU0NhcmcpCisJCQlhcmdfZG9uZSA9IDE7CisJfQorCisJaWYgKGRvX2RtYShzaG9zdC0+aW9fcG9ydCwgMCwgUkVTRVRfUElPKSkgeworCQlwcmludGsoIiVzOiByZXNldCwgY2Fubm90IHJlc2V0LCB0aW1lb3V0IGVycm9yLlxuIiwgaGEtPmJvYXJkX25hbWUpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXByaW50aygiJXM6IHJlc2V0LCBib2FyZCByZXNldCBkb25lLCBlbmFibGluZyBpbnRlcnJ1cHRzLlxuIiwgaGEtPmJvYXJkX25hbWUpOworCisjaWYgZGVmaW5lZChERUJVR19SRVNFVCkKKwlkb190cmFjZSA9IDE7CisjZW5kaWYKKworCWhhLT5pbl9yZXNldCA9IDE7CisKKwlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CisJdGltZSA9IGppZmZpZXM7CisJd2hpbGUgKChqaWZmaWVzIC0gdGltZSkgPCAoMTAgKiBIWikgJiYgbGltaXQrKyA8IDIwMDAwMCkKKwkJdWRlbGF5KDEwMEwpOworCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CisKKwlwcmludGsoIiVzOiByZXNldCwgaW50ZXJydXB0cyBkaXNhYmxlZCwgbG9vcHMgJWQuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgbGltaXQpOworCisJZm9yIChpID0gMDsgaSA8IHNob3N0LT5jYW5fcXVldWU7IGkrKykgeworCisJCWlmIChoYS0+Y3Bfc3RhdFtpXSA9PSBJTl9SRVNFVCkgeworCQkJU0NwbnQgPSBoYS0+Y3BbaV0uU0NwbnQ7CisJCQl1bm1hcF9kbWEoaSwgaGEpOworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCQkJLyogVGhpcyBtYWlsYm94IGlzIHN0aWxsIHdhaXRpbmcgZm9yIGl0cyBpbnRlcnJ1cHQgKi8KKwkJCWhhLT5jcF9zdGF0W2ldID0gTE9DS0VEOworCisJCQlwcmludGsKKwkJCSAgICAoIiVzLCByZXNldCwgbWJveCAlZCBsb2NrZWQsIERJRF9SRVNFVCwgcGlkICVsZCBkb25lLlxuIiwKKwkJCSAgICAgaGEtPmJvYXJkX25hbWUsIGksIFNDcG50LT5waWQpOworCQl9CisKKwkJZWxzZSBpZiAoaGEtPmNwX3N0YXRbaV0gPT0gQUJPUlRJTkcpIHsKKwkJCVNDcG50ID0gaGEtPmNwW2ldLlNDcG50OworCQkJdW5tYXBfZG1hKGksIGhhKTsKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCQlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKwkJCS8qIFRoaXMgbWFpbGJveCB3YXMgbmV2ZXIgcXVldWVkIHRvIHRoZSBhZGFwdGVyICovCisJCQloYS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisKKwkJCXByaW50aworCQkJICAgICgiJXMsIHJlc2V0LCBtYm94ICVkIGFib3J0aW5nLCBESURfUkVTRVQsIHBpZCAlbGQgZG9uZS5cbiIsCisJCQkgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBTQ3BudC0+cGlkKTsKKwkJfQorCisJCWVsc2UKKwkJCS8qIEFueSBvdGhlciBtYWlsYm94IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGZyZWUgYnkgaW50ZXJydXB0ICovCisJCQljb250aW51ZTsKKworCQlTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKKwl9CisKKwloYS0+aW5fcmVzZXQgPSAwOworCWRvX3RyYWNlID0gMDsKKworCWlmIChhcmdfZG9uZSkKKwkJcHJpbnRrKCIlczogcmVzZXQsIGV4aXQsIHBpZCAlbGQgZG9uZS5cbiIsIGhhLT5ib2FyZF9uYW1lLCBTQ2FyZy0+cGlkKTsKKwllbHNlCisJCXByaW50aygiJXM6IHJlc2V0LCBleGl0LlxuIiwgaGEtPmJvYXJkX25hbWUpOworCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK2ludCBlYXRhMnhfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmRraW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGNhcGFjaXR5OworCisJaWYgKGV4dF90cmFuIHx8IChzY3NpY2FtX2Jpb3NfcGFyYW0oYmRldiwgY2FwYWNpdHksIGRraW5mbykgPCAwKSkgeworCQlka2luZm9bMF0gPSAyNTU7CisJCWRraW5mb1sxXSA9IDYzOworCQlka2luZm9bMl0gPSBzaXplIC8gKGRraW5mb1swXSAqIGRraW5mb1sxXSk7CisJfQorI2lmIGRlZmluZWQgKERFQlVHX0dFT01FVFJZKQorCXByaW50aygiJXM6IGJpb3NfcGFyYW0sIGhlYWQ9JWQsIHNlYz0lZCwgY3lsPSVkLlxuIiwgZHJpdmVyX25hbWUsCisJICAgICAgIGRraW5mb1swXSwgZGtpbmZvWzFdLCBka2luZm9bMl0pOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29ydCh1bnNpZ25lZCBsb25nIHNrW10sIHVuc2lnbmVkIGludCBkYVtdLCB1bnNpZ25lZCBpbnQgbiwKKwkJIHVuc2lnbmVkIGludCByZXYpCit7CisJdW5zaWduZWQgaW50IGksIGosIGssIHk7CisJdW5zaWduZWQgbG9uZyB4OworCisJZm9yIChpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKKwkJayA9IGk7CisKKwkJZm9yIChqID0gayArIDE7IGogPCBuOyBqKyspCisJCQlpZiAocmV2KSB7CisJCQkJaWYgKHNrW2pdID4gc2tba10pCisJCQkJCWsgPSBqOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2tbal0gPCBza1trXSkKKwkJCQkJayA9IGo7CisJCQl9CisKKwkJaWYgKGsgIT0gaSkgeworCQkJeCA9IHNrW2tdOworCQkJc2tba10gPSBza1tpXTsKKwkJCXNrW2ldID0geDsKKwkJCXkgPSBkYVtrXTsKKwkJCWRhW2tdID0gZGFbaV07CisJCQlkYVtpXSA9IHk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcmVvcmRlcihzdHJ1Y3QgaG9zdGRhdGEgKmhhLCB1bnNpZ25lZCBsb25nIGN1cnNlYywKKwkJICAgdW5zaWduZWQgaW50IGloZGxyLCB1bnNpZ25lZCBpbnQgaWxbXSwgdW5zaWduZWQgaW50IG5fcmVhZHkpCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisJc3RydWN0IG1zY3AgKmNwcDsKKwl1bnNpZ25lZCBpbnQgaywgbjsKKwl1bnNpZ25lZCBpbnQgcmV2ID0gMCwgcyA9IDEsIHIgPSAxOworCXVuc2lnbmVkIGludCBpbnB1dF9vbmx5ID0gMSwgb3ZlcmxhcCA9IDA7CisJdW5zaWduZWQgbG9uZyBzbFtuX3JlYWR5XSwgcGxbbl9yZWFkeV0sIGxsW25fcmVhZHldOworCXVuc2lnbmVkIGxvbmcgbWF4c2VjID0gMCwgbWluc2VjID0gVUxPTkdfTUFYLCBzZWVrID0gMCwgaXNlZWsgPSAwOworCXVuc2lnbmVkIGxvbmcgaW9zZWVrID0gMDsKKworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZmx1c2hjb3VudCA9IDAsIGJhdGNoY291bnQgPSAwLCBzb3J0Y291bnQgPSAwOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZHljb3VudCA9IDAsIG92bGNvdW50ID0gMCwgaW5wdXRjb3VudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGludCByZWFkeXNvcnRlZCA9IDAsIHJldmNvdW50ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBzZWVrc29ydGVkID0gMCwgc2Vla25vc29ydCA9IDA7CisKKwlpZiAobGlua19zdGF0aXN0aWNzICYmICEoKytmbHVzaGNvdW50ICUgbGlua19zdGF0aXN0aWNzKSkKKwkJcHJpbnRrKCJmYyAlZCBiYyAlZCBpYyAlZCBvYyAlZCByYyAlZCBycyAlZCBzYyAlZCByZSAlZCIKKwkJICAgICAgICIgYXYgJWxkSyBhcyAlbGRLLlxuIiwgZmx1c2hjb3VudCwgYmF0Y2hjb3VudCwKKwkJICAgICAgIGlucHV0Y291bnQsIG92bGNvdW50LCByZWFkeWNvdW50LCByZWFkeXNvcnRlZCwgc29ydGNvdW50LAorCQkgICAgICAgcmV2Y291bnQsIHNlZWtub3NvcnQgLyAocmVhZHljb3VudCArIDEpLAorCQkgICAgICAgc2Vla3NvcnRlZCAvIChyZWFkeWNvdW50ICsgMSkpOworCisJaWYgKG5fcmVhZHkgPD0gMSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7CisJCWsgPSBpbFtuXTsKKwkJY3BwID0gJmhhLT5jcFtrXTsKKwkJU0NwbnQgPSBjcHAtPlNDcG50OworCisJCWlmICghY3BwLT5kaW4pCisJCQlpbnB1dF9vbmx5ID0gMDsKKworCQlpZiAoU0NwbnQtPnJlcXVlc3QtPnNlY3RvciA8IG1pbnNlYykKKwkJCW1pbnNlYyA9IFNDcG50LT5yZXF1ZXN0LT5zZWN0b3I7CisJCWlmIChTQ3BudC0+cmVxdWVzdC0+c2VjdG9yID4gbWF4c2VjKQorCQkJbWF4c2VjID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcjsKKworCQlzbFtuXSA9IFNDcG50LT5yZXF1ZXN0LT5zZWN0b3I7CisJCWlvc2VlayArPSBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9yczsKKworCQlpZiAoIW4pCisJCQljb250aW51ZTsKKworCQlpZiAoc2xbbl0gPCBzbFtuIC0gMV0pCisJCQlzID0gMDsKKwkJaWYgKHNsW25dID4gc2xbbiAtIDFdKQorCQkJciA9IDA7CisKKwkJaWYgKGxpbmtfc3RhdGlzdGljcykgeworCQkJaWYgKHNsW25dID4gc2xbbiAtIDFdKQorCQkJCXNlZWsgKz0gc2xbbl0gLSBzbFtuIC0gMV07CisJCQllbHNlCisJCQkJc2VlayArPSBzbFtuIC0gMV0gLSBzbFtuXTsKKwkJfQorCisJfQorCisJaWYgKGxpbmtfc3RhdGlzdGljcykgeworCQlpZiAoY3Vyc2VjID4gc2xbMF0pCisJCQlzZWVrICs9IGN1cnNlYyAtIHNsWzBdOworCQllbHNlCisJCQlzZWVrICs9IHNsWzBdIC0gY3Vyc2VjOworCX0KKworCWlmIChjdXJzZWMgPiAoKG1heHNlYyArIG1pbnNlYykgLyAyKSkKKwkJcmV2ID0gMTsKKworCWlmIChpb3NlZWsgPiAoKG1heHNlYyAtIG1pbnNlYykgLyAyKSkKKwkJcmV2ID0gMDsKKworCWlmICghKChyZXYgJiYgcikgfHwgKCFyZXYgJiYgcykpKQorCQlzb3J0KHNsLCBpbCwgbl9yZWFkeSwgcmV2KTsKKworCWlmICghaW5wdXRfb25seSkKKwkJZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworCQkJayA9IGlsW25dOworCQkJY3BwID0gJmhhLT5jcFtrXTsKKwkJCVNDcG50ID0gY3BwLT5TQ3BudDsKKwkJCWxsW25dID0gU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnM7CisJCQlwbFtuXSA9IFNDcG50LT5waWQ7CisKKwkJCWlmICghbikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKChzbFtuXSA9PSBzbFtuIC0gMV0pCisJCQkgICAgfHwgKCFyZXYgJiYgKChzbFtuIC0gMV0gKyBsbFtuIC0gMV0pID4gc2xbbl0pKQorCQkJICAgIHx8IChyZXYgJiYgKChzbFtuXSArIGxsW25dKSA+IHNsW24gLSAxXSkpKQorCQkJCW92ZXJsYXAgPSAxOworCQl9CisKKwlpZiAob3ZlcmxhcCkKKwkJc29ydChwbCwgaWwsIG5fcmVhZHksIDApOworCisJaWYgKGxpbmtfc3RhdGlzdGljcykgeworCQlpZiAoY3Vyc2VjID4gc2xbMF0pCisJCQlpc2VlayA9IGN1cnNlYyAtIHNsWzBdOworCQllbHNlCisJCQlpc2VlayA9IHNsWzBdIC0gY3Vyc2VjOworCQliYXRjaGNvdW50Kys7CisJCXJlYWR5Y291bnQgKz0gbl9yZWFkeTsKKwkJc2Vla25vc29ydCArPSBzZWVrIC8gMTAyNDsKKwkJaWYgKGlucHV0X29ubHkpCisJCQlpbnB1dGNvdW50Kys7CisJCWlmIChvdmVybGFwKSB7CisJCQlvdmxjb3VudCsrOworCQkJc2Vla3NvcnRlZCArPSBpc2VlayAvIDEwMjQ7CisJCX0gZWxzZQorCQkJc2Vla3NvcnRlZCArPSAoaXNlZWsgKyBtYXhzZWMgLSBtaW5zZWMpIC8gMTAyNDsKKwkJaWYgKHJldiAmJiAhcikgeworCQkJcmV2Y291bnQrKzsKKwkJCXJlYWR5c29ydGVkICs9IG5fcmVhZHk7CisJCX0KKwkJaWYgKCFyZXYgJiYgIXMpIHsKKwkJCXNvcnRjb3VudCsrOworCQkJcmVhZHlzb3J0ZWQgKz0gbl9yZWFkeTsKKwkJfQorCX0KKyNpZiBkZWZpbmVkKERFQlVHX0xJTktFRF9DT01NQU5EUykKKwlpZiAobGlua19zdGF0aXN0aWNzICYmIChvdmVybGFwIHx8ICEoZmx1c2hjb3VudCAlIGxpbmtfc3RhdGlzdGljcykpKQorCQlmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7CisJCQlrID0gaWxbbl07CisJCQljcHAgPSAmaGEtPmNwW2tdOworCQkJU0NwbnQgPSBjcHAtPlNDcG50OworCQkJcHJpbnRrCisJCQkgICAgKCIlcyAlZC4lZDolZCBwaWQgJWxkIG1iICVkIGZjICVkIG5yICVkIHNlYyAlbGQgbnMgJWxkIgorCQkJICAgICAiIGN1ciAlbGQgczolYyByOiVjIHJldjolYyBpbjolYyBvdjolYyB4ZCAlZC5cbiIsCisJCQkgICAgIChpaGRsciA/ICJpaGRsciIgOiAicWNvbW0iKSwKKwkJCSAgICAgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsCisJCQkgICAgIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCwgaywgZmx1c2hjb3VudCwKKwkJCSAgICAgbl9yZWFkeSwgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwKKwkJCSAgICAgU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnMsIGN1cnNlYywgWUVTTk8ocyksCisJCQkgICAgIFlFU05PKHIpLCBZRVNOTyhyZXYpLCBZRVNOTyhpbnB1dF9vbmx5KSwKKwkJCSAgICAgWUVTTk8ob3ZlcmxhcCksIGNwcC0+ZGluKTsKKwkJfQorI2VuZGlmCisJcmV0dXJuIG92ZXJsYXA7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjdXJzZWMsCisJCSAgICAgIHN0cnVjdCBob3N0ZGF0YSAqaGEsIHVuc2lnbmVkIGludCBpaGRscikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCXVuc2lnbmVkIGludCBrLCBuLCBuX3JlYWR5ID0gMCwgaWxbTUFYX01BSUxCT1hFU107CisKKwlmb3IgKGsgPSAwOyBrIDwgZGV2LT5ob3N0LT5jYW5fcXVldWU7IGsrKykgeworCisJCWlmIChoYS0+Y3Bfc3RhdFtrXSAhPSBSRUFEWSAmJiBoYS0+Y3Bfc3RhdFtrXSAhPSBJTl9VU0UpCisJCQljb250aW51ZTsKKworCQljcHAgPSAmaGEtPmNwW2tdOworCQlTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKwkJaWYgKFNDcG50LT5kZXZpY2UgIT0gZGV2KQorCQkJY29udGludWU7CisKKwkJaWYgKGhhLT5jcF9zdGF0W2tdID09IElOX1VTRSkKKwkJCXJldHVybjsKKworCQlpbFtuX3JlYWR5KytdID0gazsKKwl9CisKKwlpZiAocmVvcmRlcihoYSwgY3Vyc2VjLCBpaGRsciwgaWwsIG5fcmVhZHkpKQorCQluX3JlYWR5ID0gMTsKKworCWZvciAobiA9IDA7IG4gPCBuX3JlYWR5OyBuKyspIHsKKwkJayA9IGlsW25dOworCQljcHAgPSAmaGEtPmNwW2tdOworCQlTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKwkJaWYgKGRvX2RtYShkZXYtPmhvc3QtPmlvX3BvcnQsIGNwcC0+Y3BfZG1hX2FkZHIsIFNFTkRfQ1BfRE1BKSkgeworCQkJcHJpbnRrCisJCQkgICAgKCIlczogJXMsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCwgbWJveCAlZCwgYWRhcHRlciIKKwkJCSAgICAgIiBidXN5LCB3aWxsIGFib3J0LlxuIiwgaGEtPmJvYXJkX25hbWUsCisJCQkgICAgIChpaGRsciA/ICJpaGRsciIgOiAicWNvbW0iKSwKKwkJCSAgICAgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsCisJCQkgICAgIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCwgayk7CisJCQloYS0+Y3Bfc3RhdFtrXSA9IEFCT1JUSU5HOworCQkJY29udGludWU7CisJCX0KKworCQloYS0+Y3Bfc3RhdFtrXSA9IElOX1VTRTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpaGRscihpbnQgaXJxLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKwl1bnNpZ25lZCBpbnQgaSwgaywgYywgc3RhdHVzLCB0c3RhdHVzLCByZWc7CisJc3RydWN0IG1zc3AgKnNwcDsKKwlzdHJ1Y3QgbXNjcCAqY3BwOworCXN0cnVjdCBob3N0ZGF0YSAqaGEgPSAoc3RydWN0IGhvc3RkYXRhICopc2hvc3QtPmhvc3RkYXRhOworCisJaWYgKHNob3N0LT5pcnEgIT0gaXJxKQorCQlwYW5pYygiJXM6IGloZGxyLCBpcnEgJWQsIHNob3N0LT5pcnEgJWQuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaXJxLAorCQkgICAgICBzaG9zdC0+aXJxKTsKKworCS8qIENoZWNrIGlmIHRoaXMgYm9hcmQgbmVlZCB0byBiZSBzZXJ2aWNlZCAqLworCWlmICghKGluYihzaG9zdC0+aW9fcG9ydCArIFJFR19BVVhfU1RBVFVTKSAmIElSUV9BU1NFUlRFRCkpCisJCWdvdG8gbm9uZTsKKworCWhhLT5pb2NvdW50Kys7CisKKwlpZiAoZG9fdHJhY2UpCisJCXByaW50aygiJXM6IGloZGxyLCBlbnRlciwgaXJxICVkLCBjb3VudCAlZC5cbiIsIGhhLT5ib2FyZF9uYW1lLCBpcnEsCisJCSAgICAgICBoYS0+aW9jb3VudCk7CisKKwkvKiBDaGVjayBpZiB0aGlzIGJvYXJkIGlzIHN0aWxsIGJ1c3kgKi8KKwlpZiAod2FpdF9vbl9idXN5KHNob3N0LT5pb19wb3J0LCAyMCAqIE1BWExPT1ApKSB7CisJCXJlZyA9IGluYihzaG9zdC0+aW9fcG9ydCArIFJFR19TVEFUVVMpOworCQlwcmludGsKKwkJICAgICgiJXM6IGloZGxyLCBidXN5IHRpbWVvdXQgZXJyb3IsICBpcnEgJWQsIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCisJCSAgICAgaGEtPmJvYXJkX25hbWUsIGlycSwgcmVnLCBoYS0+aW9jb3VudCk7CisJCWdvdG8gbm9uZTsKKwl9CisKKwlzcHAgPSAmaGEtPnNwOworCisJLyogTWFrZSBhIGxvY2FsIGNvcHkganVzdCBiZWZvcmUgY2xlYXJpbmcgdGhlIGludGVycnVwdCBpbmRpY2F0aW9uICovCisJbWVtY3B5KHNwcCwgaGEtPnNwX2NwdV9hZGRyLCBzaXplb2Yoc3RydWN0IG1zc3ApKTsKKworCS8qIENsZWFyIHRoZSBjb21wbGV0aW9uIGZsYWcgYW5kIGNwIHBvaW50ZXIgb24gdGhlIGR5bmFtaWMgY29weSBvZiBzcCAqLworCW1lbXNldChoYS0+c3BfY3B1X2FkZHIsIDAsIHNpemVvZihzdHJ1Y3QgbXNzcCkpOworCisJLyogUmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgaW5kaWNhdGlvbiAqLworCXJlZyA9IGluYihzaG9zdC0+aW9fcG9ydCArIFJFR19TVEFUVVMpOworCisjaWYgZGVmaW5lZCAoREVCVUdfSU5URVJSVVBUKQorCXsKKwkJdW5zaWduZWQgY2hhciAqYnl0ZXNwOworCQlpbnQgY250OworCQlieXRlc3AgPSAodW5zaWduZWQgY2hhciAqKXNwcDsKKwkJaWYgKGhhLT5pb2NvdW50IDwgMjAwKSB7CisJCQlwcmludGsoInNwW10gPSIpOworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCAxNTsgY250KyspCisJCQkJcHJpbnRrKCIgMHgleCIsIGJ5dGVzcFtjbnRdKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogUmVqZWN0IGFueSBzcCB3aXRoIHN1cHNwZWN0IGRhdGEgKi8KKwlpZiAoc3BwLT5lb2MgPT0gMCAmJiBoYS0+aW9jb3VudCA+IDEpCisJCXByaW50aworCQkgICAgKCIlczogaWhkbHIsIHNwcC0+ZW9jID09IDAsIGlycSAlZCwgcmVnIDB4JXgsIGNvdW50ICVkLlxuIiwKKwkJICAgICBoYS0+Ym9hcmRfbmFtZSwgaXJxLCByZWcsIGhhLT5pb2NvdW50KTsKKwlpZiAoc3BwLT5jcHBfaW5kZXggPCAwIHx8IHNwcC0+Y3BwX2luZGV4ID49IHNob3N0LT5jYW5fcXVldWUpCisJCXByaW50aworCQkgICAgKCIlczogaWhkbHIsIGJhZCBzcHAtPmNwcF9pbmRleCAlZCwgaXJxICVkLCByZWcgMHgleCwgY291bnQgJWQuXG4iLAorCQkgICAgIGhhLT5ib2FyZF9uYW1lLCBzcHAtPmNwcF9pbmRleCwgaXJxLCByZWcsIGhhLT5pb2NvdW50KTsKKwlpZiAoc3BwLT5lb2MgPT0gMCB8fCBzcHAtPmNwcF9pbmRleCA8IDAKKwkgICAgfHwgc3BwLT5jcHBfaW5kZXggPj0gc2hvc3QtPmNhbl9xdWV1ZSkKKwkJZ290byBoYW5kbGVkOworCisJLyogRmluZCB0aGUgbWFpbGJveCB0byBiZSBzZXJ2aWNlZCBvbiB0aGlzIGJvYXJkICovCisJaSA9IHNwcC0+Y3BwX2luZGV4OworCisJY3BwID0gJihoYS0+Y3BbaV0pOworCisjaWYgZGVmaW5lZChERUJVR19HRU5FUkFURV9BQk9SVFMpCisJaWYgKChoYS0+aW9jb3VudCA+IDUwMCkgJiYgKChoYS0+aW9jb3VudCAlIDUwMCkgPCAzKSkKKwkJZ290byBoYW5kbGVkOworI2VuZGlmCisKKwlpZiAoaGEtPmNwX3N0YXRbaV0gPT0gSUdOT1JFKSB7CisJCWhhLT5jcF9zdGF0W2ldID0gRlJFRTsKKwkJZ290byBoYW5kbGVkOworCX0gZWxzZSBpZiAoaGEtPmNwX3N0YXRbaV0gPT0gTE9DS0VEKSB7CisJCWhhLT5jcF9zdGF0W2ldID0gRlJFRTsKKwkJcHJpbnRrKCIlczogaWhkbHIsIG1ib3ggJWQgdW5sb2NrZWQsIGNvdW50ICVkLlxuIiwgaGEtPmJvYXJkX25hbWUsIGksCisJCSAgICAgICBoYS0+aW9jb3VudCk7CisJCWdvdG8gaGFuZGxlZDsKKwl9IGVsc2UgaWYgKGhhLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKKwkJcHJpbnRrKCIlczogaWhkbHIsIG1ib3ggJWQgaXMgZnJlZSwgY291bnQgJWQuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaSwKKwkJICAgICAgIGhhLT5pb2NvdW50KTsKKwkJZ290byBoYW5kbGVkOworCX0gZWxzZSBpZiAoaGEtPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpCisJCXByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIGlzIGluIHJlc2V0LlxuIiwgaGEtPmJvYXJkX25hbWUsIGkpOworCWVsc2UgaWYgKGhhLT5jcF9zdGF0W2ldICE9IElOX1VTRSkKKwkJcGFuaWMoIiVzOiBpaGRsciwgbWJveCAlZCwgaW52YWxpZCBjcF9zdGF0OiAlZC5cbiIsCisJCSAgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBoYS0+Y3Bfc3RhdFtpXSk7CisKKwloYS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisJU0NwbnQgPSBjcHAtPlNDcG50OworCisJaWYgKFNDcG50ID09IE5VTEwpCisJCXBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIFNDcG50ID09IE5VTEwuXG4iLCBoYS0+Ym9hcmRfbmFtZSwgaSk7CisKKwlpZiAoU0NwbnQtPmhvc3Rfc2NyaWJibGUgPT0gTlVMTCkKKwkJcGFuaWMoIiVzOiBpaGRsciwgbWJveCAlZCwgcGlkICVsZCwgU0NwbnQgJXAgZ2FyYmxlZC5cbiIsIGhhLT5ib2FyZF9uYW1lLAorCQkgICAgICBpLCBTQ3BudC0+cGlkLCBTQ3BudCk7CisKKwlpZiAoKih1bnNpZ25lZCBpbnQgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSAhPSBpKQorCQlwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBwaWQgJWxkLCBpbmRleCBtaXNtYXRjaCAlZC5cbiIsCisJCSAgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBTQ3BudC0+cGlkLAorCQkgICAgICAqKHVuc2lnbmVkIGludCAqKVNDcG50LT5ob3N0X3NjcmliYmxlKTsKKworCXN5bmNfZG1hKGksIGhhKTsKKworCWlmIChsaW5rZWRfY29tbSAmJiBTQ3BudC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCA+IDIKKwkgICAgJiYgVExERVYoU0NwbnQtPmRldmljZS0+dHlwZSkpCisJCWZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBoYSwgMSk7CisKKwl0c3RhdHVzID0gc3RhdHVzX2J5dGUoc3BwLT50YXJnZXRfc3RhdHVzKTsKKworI2lmIGRlZmluZWQoREVCVUdfR0VORVJBVEVfRVJST1JTKQorCWlmICgoaGEtPmlvY291bnQgPiA1MDApICYmICgoaGEtPmlvY291bnQgJSAyMDApIDwgMikpCisJCXNwcC0+YWRhcHRlcl9zdGF0dXMgPSAweDAxOworI2VuZGlmCisKKwlzd2l0Y2ggKHNwcC0+YWRhcHRlcl9zdGF0dXMpIHsKKwljYXNlIEFTT0s6CQkvKiBzdGF0dXMgT0sgKi8KKworCQkvKiBGb3JjZXMgYSByZXNldCBpZiBhIGRpc2sgZHJpdmUga2VlcHMgcmV0dXJuaW5nIEJVU1kgKi8KKwkJaWYgKHRzdGF0dXMgPT0gQlVTWSAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlICE9IFRZUEVfVEFQRSkKKwkJCXN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKworCQkvKiBJZiB0aGVyZSB3YXMgYSBidXMgcmVzZXQsIHJlZG8gb3BlcmF0aW9uIG9uIGVhY2ggdGFyZ2V0ICovCisJCWVsc2UgaWYgKHRzdGF0dXMgIT0gR09PRCAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfRElTSworCQkJICYmIGhhLT50YXJnZXRfcmVkb1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPgorCQkJCQkJCQkgIGRldmljZS0+CisJCQkJCQkJCSAgY2hhbm5lbF0pCisJCQlzdGF0dXMgPSBESURfQlVTX0JVU1kgPDwgMTY7CisKKwkJLyogV29ya3MgYXJvdW5kIGEgZmxhdyBpbiBzY3NpLmMgKi8KKwkJZWxzZSBpZiAodHN0YXR1cyA9PSBDSEVDS19DT05ESVRJT04KKwkJCSAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfRElTSworCQkJICYmIChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhmKSA9PSBSRUNPVkVSRURfRVJST1IpCisJCQlzdGF0dXMgPSBESURfQlVTX0JVU1kgPDwgMTY7CisKKwkJZWxzZQorCQkJc3RhdHVzID0gRElEX09LIDw8IDE2OworCisJCWlmICh0c3RhdHVzID09IEdPT0QpCisJCQloYS0+dGFyZ2V0X3JlZG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPgorCQkJCQkJCSAgICAgIGNoYW5uZWxdID0gMDsKKworCQlpZiAoc3BwLT50YXJnZXRfc3RhdHVzICYmIFNDcG50LT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9ESVNLICYmCisJCSAgICAoISh0c3RhdHVzID09IENIRUNLX0NPTkRJVElPTiAmJiBoYS0+aW9jb3VudCA8PSAxMDAwICYmCisJCSAgICAgICAoU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4ZikgPT0gTk9UX1JFQURZKSkpCisJCQlwcmludGsoIiVzOiBpaGRsciwgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLCAiCisJCQkgICAgICAgInRhcmdldF9zdGF0dXMgMHgleCwgc2Vuc2Uga2V5IDB4JXguXG4iLAorCQkJICAgICAgIGhhLT5ib2FyZF9uYW1lLAorCQkJICAgICAgIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkJICAgICAgIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCwKKwkJCSAgICAgICBzcHAtPnRhcmdldF9zdGF0dXMsIFNDcG50LT5zZW5zZV9idWZmZXJbMl0pOworCisJCWhhLT50YXJnZXRfdG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPmNoYW5uZWxdID0gMDsKKworCQlpZiAoaGEtPmxhc3RfcmV0cmllZF9waWQgPT0gU0NwbnQtPnBpZCkKKwkJCWhhLT5yZXRyaWVzID0gMDsKKworCQlicmVhazsKKwljYXNlIEFTU1Q6CQkvKiBTZWxlY3Rpb24gVGltZSBPdXQgKi8KKwljYXNlIDB4MDI6CQkvKiBDb21tYW5kIFRpbWUgT3V0ICAgKi8KKworCQlpZiAoaGEtPnRhcmdldF90b1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+Y2hhbm5lbF0gPiAxKQorCQkJc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OworCQllbHNlIHsKKwkJCXN0YXR1cyA9IERJRF9USU1FX09VVCA8PCAxNjsKKwkJCWhhLT50YXJnZXRfdG9bU0NwbnQtPmRldmljZS0+aWRdW1NDcG50LT5kZXZpY2UtPgorCQkJCQkJCSAgICBjaGFubmVsXSsrOworCQl9CisKKwkJYnJlYWs7CisKKwkJLyogUGVyZm9ybSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGludGVybmFsIHJldHJpZXMgKi8KKwljYXNlIDB4MDM6CQkvKiBTQ1NJIEJ1cyBSZXNldCBSZWNlaXZlZCAqLworCWNhc2UgMHgwNDoJCS8qIEluaXRpYWwgQ29udHJvbGxlciBQb3dlci11cCAqLworCisJCWZvciAoYyA9IDA7IGMgPD0gc2hvc3QtPm1heF9jaGFubmVsOyBjKyspCisJCQlmb3IgKGsgPSAwOyBrIDwgc2hvc3QtPm1heF9pZDsgaysrKQorCQkJCWhhLT50YXJnZXRfcmVkb1trXVtjXSA9IDE7CisKKwkJaWYgKFNDcG50LT5kZXZpY2UtPnR5cGUgIT0gVFlQRV9UQVBFCisJCSAgICAmJiBoYS0+cmV0cmllcyA8IE1BWF9JTlRFUk5BTF9SRVRSSUVTKSB7CisKKyNpZiBkZWZpbmVkKERJRF9TT0ZUX0VSUk9SKQorCQkJc3RhdHVzID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisjZWxzZQorCQkJc3RhdHVzID0gRElEX0JVU19CVVNZIDw8IDE2OworI2VuZGlmCisKKwkJCWhhLT5yZXRyaWVzKys7CisJCQloYS0+bGFzdF9yZXRyaWVkX3BpZCA9IFNDcG50LT5waWQ7CisJCX0gZWxzZQorCQkJc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OworCisJCWJyZWFrOworCWNhc2UgMHgwNToJCS8qIFVuZXhwZWN0ZWQgQnVzIFBoYXNlICovCisJY2FzZSAweDA2OgkJLyogVW5leHBlY3RlZCBCdXMgRnJlZSAqLworCWNhc2UgMHgwNzoJCS8qIEJ1cyBQYXJpdHkgRXJyb3IgKi8KKwljYXNlIDB4MDg6CQkvKiBTQ1NJIEh1bmcgKi8KKwljYXNlIDB4MDk6CQkvKiBVbmV4cGVjdGVkIE1lc3NhZ2UgUmVqZWN0ICovCisJY2FzZSAweDBhOgkJLyogU0NTSSBCdXMgUmVzZXQgU3R1Y2sgKi8KKwljYXNlIDB4MGI6CQkvKiBBdXRvIFJlcXVlc3QtU2Vuc2UgRmFpbGVkICovCisJY2FzZSAweDBjOgkJLyogQ29udHJvbGxlciBSYW0gUGFyaXR5IEVycm9yICovCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OworCQlicmVhazsKKwl9CisKKwlTQ3BudC0+cmVzdWx0ID0gc3RhdHVzIHwgc3BwLT50YXJnZXRfc3RhdHVzOworCisjaWYgZGVmaW5lZChERUJVR19JTlRFUlJVUFQpCisJaWYgKFNDcG50LT5yZXN1bHQgfHwgZG9fdHJhY2UpCisjZWxzZQorCWlmICgoc3BwLT5hZGFwdGVyX3N0YXR1cyAhPSBBU09LICYmIGhhLT5pb2NvdW50ID4gMTAwMCkgfHwKKwkgICAgKHNwcC0+YWRhcHRlcl9zdGF0dXMgIT0gQVNPSyAmJgorCSAgICAgc3BwLT5hZGFwdGVyX3N0YXR1cyAhPSBBU1NUICYmIGhhLT5pb2NvdW50IDw9IDEwMDApIHx8CisJICAgIGRvX3RyYWNlIHx8IG1zZ19ieXRlKHNwcC0+dGFyZ2V0X3N0YXR1cykpCisjZW5kaWYKKwkJcHJpbnRrKCIlczogaWhkbHIsIG1ib3ggJTJkLCBlcnIgMHgleDoleCwiCisJCSAgICAgICAiIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCwgcmVnIDB4JXgsIGNvdW50ICVkLlxuIiwKKwkJICAgICAgIGhhLT5ib2FyZF9uYW1lLCBpLCBzcHAtPmFkYXB0ZXJfc3RhdHVzLCBzcHAtPnRhcmdldF9zdGF0dXMsCisJCSAgICAgICBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkJICAgICAgIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCwgcmVnLCBoYS0+aW9jb3VudCk7CisKKwl1bm1hcF9kbWEoaSwgaGEpOworCisJLyogU2V0IHRoZSBjb21tYW5kIHN0YXRlIHRvIGluYWN0aXZlICovCisJU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisKKwlpZiAoZG9fdHJhY2UpCisJCXByaW50aygiJXM6IGloZGxyLCBleGl0LCBpcnEgJWQsIGNvdW50ICVkLlxuIiwgaGEtPmJvYXJkX25hbWUsCisJCQkJaXJxLCBoYS0+aW9jb3VudCk7CisKKyAgICAgIGhhbmRsZWQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgbm9uZToKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpzaGFwLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwl1bnNpZ25lZCBpbnQgajsKKwl1bnNpZ25lZCBsb25nIHNwaW5fZmxhZ3M7CisJaXJxcmV0dXJuX3QgcmV0OworCisJLyogQ2hlY2sgaWYgdGhlIGludGVycnVwdCBtdXN0IGJlIHByb2Nlc3NlZCBieSB0aGlzIGhhbmRsZXIgKi8KKwlpZiAoKGogPSAodW5zaWduZWQgaW50KSgoY2hhciAqKXNoYXAgLSBzaGEpKSA+PSBudW1fYm9hcmRzKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc2hvc3QgPSBzaFtqXTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIHNwaW5fZmxhZ3MpOworCXJldCA9IGloZGxyKGlycSwgc2hvc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgc3Bpbl9mbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlYXRhMnhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgaG9zdGRhdGEgKmhhID0gKHN0cnVjdCBob3N0ZGF0YSAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaG9zdC0+Y2FuX3F1ZXVlOyBpKyspCisJCWlmICgoJmhhLT5jcFtpXSktPnNnbGlzdCkKKwkJCWtmcmVlKCgmaGEtPmNwW2ldKS0+c2dsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBzaG9zdC0+Y2FuX3F1ZXVlOyBpKyspCisJCXBjaV91bm1hcF9zaW5nbGUoaGEtPnBkZXYsIGhhLT5jcFtpXS5jcF9kbWFfYWRkciwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBtc2NwKSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCWlmIChoYS0+c3BfY3B1X2FkZHIpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihzdHJ1Y3QgbXNzcCksCisJCQkJICAgIGhhLT5zcF9jcHVfYWRkciwgaGEtPnNwX2RtYV9hZGRyKTsKKworCWZyZWVfaXJxKHNob3N0LT5pcnEsICZzaGFbaGEtPmJvYXJkX251bWJlcl0pOworCisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSBOT19ETUEpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisKKwlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKKyNpZm5kZWYgTU9EVUxFCitfX3NldHVwKCJlYXRhPSIsIG9wdGlvbl9zZXR1cCk7CisjZW5kaWYJCQkJLyogZW5kIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VhdGFfZ2VuZXJpYy5oIGIvZHJpdmVycy9zY3NpL2VhdGFfZ2VuZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YmNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZWF0YV9nZW5lcmljLmgKQEAgLTAsMCArMSw0MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBIZWFkZXIgZmlsZSBmb3IgZWF0YV9kbWEuYyBhbmQgZWF0YV9waW8uYwkJKgorKiBMaW51eCBFQVRBIFNDU0kgZHJpdmVycwkJCQkqCisqIChjKSAxOTkzLTk2IE1pY2hhZWwgTmV1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgbWlrZUBpLUNvbm5lY3QuTmV0ICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICBuZXVmZmVyQG1haWwudW5pLW1haW56LmRlICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbGFzdCBjaGFuZ2U6IDk2LzA4LzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfRUFUQV9HRU5FUklDX0gKKyNkZWZpbmUgX0VBVEFfR0VORVJJQ19ICisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNaXNjLiBkZWZpbml0aW9ucwkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjZGVmaW5lIFJfTElNSVQgMHgyMDAwMAorCisjZGVmaW5lIE1BWElTQQkgICA0CisjZGVmaW5lIE1BWEVJU0EJICAxNiAgCisjZGVmaW5lIE1BWFBDSQkgIDE2CisjZGVmaW5lIE1BWElSUQkgIDE2IAorI2RlZmluZSBNQVhUQVJHRVQgMTYKKyNkZWZpbmUgTUFYQ0hBTk5FTCAzCisKKyNkZWZpbmUgSVNfSVNBCSAgICdJJworI2RlZmluZSBJU19FSVNBCSAgICdFJworI2RlZmluZSBJU19QQ0kJICAgJ1AnCisKKyNkZWZpbmUgQlJPS0VOX0lOUVVJUlkJMQorCisjZGVmaW5lIEJVU01BU1RFUiAgICAgICAweGZmCisjZGVmaW5lIFBJTyAgICAgICAgICAgICAweGZlCisKKyNkZWZpbmUgRUFUQV9TSUdOQVRVUkUJMHg0NTQxNTQ0MSAgICAgLyogQklHIEVORElBTiBjb2RlZCAiRUFUQSIgc2lnLgkgKi8KKworI2RlZmluZSBEUFRfSUQxICAgICAgICAgMHgxMgorI2RlZmluZSBEUFRfSUQyICAgICAgICAgMHgxNAorCisjZGVmaW5lIEFUVF9JRDEgICAgICAgICAweDA2CisjZGVmaW5lIEFUVF9JRDIgICAgICAgICAweDk0CisjZGVmaW5lIEFUVF9JRDMgICAgICAgICAweDAKKworI2RlZmluZSBORUNfSUQxICAgICAgICAgMHgzOAorI2RlZmluZSBORUNfSUQyICAgICAgICAgMHhhMworI2RlZmluZSBORUNfSUQzICAgICAgICAgMHg4MgorCisgCisjZGVmaW5lIEVBVEFfQ1BfU0laRQkgNDQKKworI2RlZmluZSBNQVhfUENJX0RFVklDRVMgIDMyCSAgICAgICAvKiBNYXhpbXVtICMgT2YgRGV2aWNlcyBQZXIgQnVzCSAqLworI2RlZmluZSBNQVhfTUVUSE9EXzIJIDE2CSAgICAgICAvKiBNYXggRGV2aWNlcyBGb3IgTWV0aG9kIDIJICovCisjZGVmaW5lIE1BWF9QQ0lfQlVTCSAxNgkgICAgICAgLyogTWF4aW11bSAjIE9mIEJ1c3NlcyBBbGxvd2VkCSAqLworCisjZGVmaW5lIFNHX1NJWkUJCSA2NCAKKyNkZWZpbmUgU0dfU0laRV9CSUcJIDI1MgkgICAgICAgLyogbWF4LiA4MDk2IGVsZW1lbnRzLCA2NGsgKi8KKworI2RlZmluZSBVUFBFUl9ERVZJQ0VfUVVFVUVfTElNSVQgNjQgICAgLyogVGhlIGxpbWl0IHdlIGhhdmUgdG8gc2V0IGZvciB0aGUgCisJCQkJCSogZGV2aWNlIHF1ZXVlIHRvIGtlZXAgdGhlIGJyb2tlbiAKKwkJCQkJKiBtaWRsZXZlbCBTQ1NJIGNvZGUgZnJvbSBwcm9kdWNpbmcKKwkJCQkJKiBib2d1cyB0aW1lb3V0cworCQkJCQkqLworCisjZGVmaW5lIFRZUEVfRElTS19RVUVVRSAgMTYKKyNkZWZpbmUgVFlQRV9UQVBFX1FVRVVFICA0CisjZGVmaW5lIFRZUEVfUk9NX1FVRVVFICAgNAorI2RlZmluZSBUWVBFX09USEVSX1FVRVVFIDIKKworI2RlZmluZSBGUkVFCSAgICAgICAgIDAKKyNkZWZpbmUgT0sJICAgICAgICAgMAorI2RlZmluZSBOT19USU1FT1VUICAgICAgIDAKKyNkZWZpbmUgVVNFRAkgICAgICAgICAxCisjZGVmaW5lIFRJTUVPVVQJICAgICAgICAgMgorI2RlZmluZSBSRVNFVAkgICAgICAgICA0CisjZGVmaW5lIExPQ0tFRAkgICAgICAgICA4CisjZGVmaW5lIEFCT1JURUQgICAgICAgICAgMTYKKworI2RlZmluZSBSRUFEICAgICAgICAgICAgIDAKKyNkZWZpbmUgV1JJVEUgICAgICAgICAgICAxCisjZGVmaW5lIE9USEVSICAgICAgICAgICAgMgorCisjZGVmaW5lIEhEKGNtZCkJICgoaG9zdGRhdGEgKikmKGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkpCisjZGVmaW5lIENEKGNtZCkJICgoc3RydWN0IGVhdGFfY2NiICopKGNtZC0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lIFNEKGhvc3QpICgoaG9zdGRhdGEgKikmKGhvc3QtPmhvc3RkYXRhKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICBFQVRBIENvbW1hbmQgJiBSZWdpc3RlciBkZWZpbml0aW9ucyAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUENJX1JFR19EUFRjb25maWcJIDB4NDAJIAorI2RlZmluZSBQQ0lfUkVHX1B1bXBNb2RlQWRkcmVzcwkgMHg0NAkgCisjZGVmaW5lIFBDSV9SRUdfUHVtcE1vZGVEYXRhCSAweDQ4CSAKKyNkZWZpbmUgUENJX1JFR19Db25maWdQYXJhbTEJIDB4NTAJIAorI2RlZmluZSBQQ0lfUkVHX0NvbmZpZ1BhcmFtMgkgMHg1NAkgCisKKworI2RlZmluZSBFQVRBX0NNRF9QSU9fU0VUVVBURVNUCSAweGM2CisjZGVmaW5lIEVBVEFfQ01EX1BJT19SRUFEX0NPTkZJRyAweGYwCisjZGVmaW5lIEVBVEFfQ01EX1BJT19TRVRfQ09ORklHCSAweGYxCisjZGVmaW5lIEVBVEFfQ01EX1BJT19TRU5EX0NQCSAweGYyCisjZGVmaW5lIEVBVEFfQ01EX1BJT19SRUNFSVZFX1NQCSAweGYzCisjZGVmaW5lIEVBVEFfQ01EX1BJT19UUlVOQwkgMHhmNAorCisjZGVmaW5lIEVBVEFfQ01EX1JFU0VUCQkgMHhmOQorI2RlZmluZSBFQVRBX0NNRF9JTU1FRElBVEUJIDB4ZmEKKworI2RlZmluZSBFQVRBX0NNRF9ETUFfUkVBRF9DT05GSUcgMHhmZAorI2RlZmluZSBFQVRBX0NNRF9ETUFfU0VUX0NPTkZJRwkgMHhmZQorI2RlZmluZSBFQVRBX0NNRF9ETUFfU0VORF9DUAkgMHhmZgorCisjZGVmaW5lIEVDU19FTVVMQVRFX1NFTlNFCSAweGQ0CisKKyNkZWZpbmUgRUFUQV9HRU5FUklDX0FCT1JUICAgICAgIDB4MDAgCisjZGVmaW5lIEVBVEFfU1BFQ0lGSUNfUkVTRVQgICAgICAweDAxCisjZGVmaW5lIEVBVEFfQlVTX1JFU0VUICAgICAgICAgICAweDAyCisjZGVmaW5lIEVBVEFfU1BFQ0lGSUNfQUJPUlQgICAgICAweDAzCisjZGVmaW5lIEVBVEFfUVVJRVRfSU5UUiAgICAgICAgICAweDA0CisjZGVmaW5lIEVBVEFfQ09MRF9CT09UX0hCQSAgICAgICAweDA2CSAgIC8qIE9ubHkgYXMgYSBsYXN0IHJlc29ydAkqLworI2RlZmluZSBFQVRBX0ZPUkNFX0lPICAgICAgICAgICAgMHgwNworCisjZGVmaW5lIEhBX0NUUkxSRUcgICAgIDB4MjA2ICAgICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIEhCQSAgICAqLworI2RlZmluZSBIQV9DVFJMX0RJU0lOVCAweDAyICAgICAgICAvKiBDVFJMUkVHOiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSEFfQ1RSTF9SRVNDUFUgMHgwNCAgICAgICAgLyogQ1RSTFJFRzogcmVzZXQgcHJvY2Vzc29yICAgICovCisjZGVmaW5lIEhBX0NUUkxfOEhFQURTIDB4MDggICAgICAgIC8qIENUUkxSRUc6IHNldCBmb3IgZHJpdmVzIHdpdGgqIAorCQkJCSAgICAqID49OCBoZWFkcyAoV0QxMDAzIHJ1ZGltZW50YXJ5IDotKSAqLworCisjZGVmaW5lIEhBX1dDT01NQU5EICAgIDB4MDcJICAgLyogY29tbWFuZCByZWdpc3RlciBvZmZzZXQJKi8KKyNkZWZpbmUgSEFfV0lGQyAgICAgICAgMHgwNgkgICAvKiBpbW1lZGlhdGUgY29tbWFuZCBvZmZzZXQgICovCisjZGVmaW5lIEhBX1dDT0RFICAgICAgIDB4MDUgCisjZGVmaW5lIEhBX1dDT0RFMiAgICAgIDB4MDQgCisjZGVmaW5lIEhBX1dETUFBRERSICAgIDB4MDIJICAgLyogRE1BIGFkZHJlc3MgTFNCIG9mZnNldAkqLyAgCisjZGVmaW5lIEhBX1JBVVhTVEFUICAgIDB4MDgJICAgLyogYXV4IHN0YXR1cyByZWdpc3RlciBvZmZzZXQqLworI2RlZmluZSBIQV9SU1RBVFVTICAgICAweDA3CSAgIC8qIHN0YXR1cyByZWdpc3RlciBvZmZzZXQJKi8KKyNkZWZpbmUgSEFfUkRBVEEgICAgICAgMHgwMAkgICAvKiBkYXRhIHJlZ2lzdGVyICgxNmJpdCkJKi8KKyNkZWZpbmUgSEFfV0RBVEEgICAgICAgMHgwMAkgICAvKiBkYXRhIHJlZ2lzdGVyICgxNmJpdCkJKi8KKworI2RlZmluZSBIQV9BQlVTWSAgICAgICAweDAxCSAgIC8qIGF1eCBidXN5IGJpdAkJKi8KKyNkZWZpbmUgSEFfQUlSUQkgICAgICAgMHgwMgkgICAvKiBhdXggSVJRIHBlbmRpbmcgYml0CSovCisjZGVmaW5lIEhBX1NFUlJPUiAgICAgIDB4MDEJICAgLyogcHIuIGNvbW1hbmQgZW5kZWQgaW4gZXJyb3IqLworI2RlZmluZSBIQV9TTU9SRSAgICAgICAweDAyCSAgIC8qIG1vcmUgZGF0YSBzb29uIHRvIGNvbWUJKi8KKyNkZWZpbmUgSEFfU0NPUlIgICAgICAgMHgwNAkgICAvKiBkYXRhIGNvcnJlY3RlZAkJKi8KKyNkZWZpbmUgSEFfU0RSUQkgICAgICAgMHgwOAkgICAvKiBkYXRhIHJlcXVlc3QgYWN0aXZlCSovCisjZGVmaW5lIEhBX1NTQwkgICAgICAgMHgxMAkgICAvKiBzZWVrIGNvbXBsZXRlCQkqLworI2RlZmluZSBIQV9TRkFVTFQgICAgICAweDIwCSAgIC8qIHdyaXRlIGZhdWx0CQkqLworI2RlZmluZSBIQV9TUkVBRFkgICAgICAweDQwCSAgIC8qIGRyaXZlIHJlYWR5CQkqLworI2RlZmluZSBIQV9TQlVTWSAgICAgICAweDgwCSAgIC8qIGRyaXZlIGJ1c3kJCSovCisjZGVmaW5lIEhBX1NEUkRZICAgICAgIEhBX1NTQytIQV9TUkVBRFkrSEFfU0RSUSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1lc3NhZ2UgZGVmaW5pdGlvbnMJCQkgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBIQV9OT19FUlJPUgkgMHgwMAkvKiBObyBFcnJvcgkJCQkqLworI2RlZmluZSBIQV9FUlJfU0VMX1RPCSAweDAxCS8qIFNlbGVjdGlvbiBUaW1lb3V0CQkJKi8KKyNkZWZpbmUgSEFfRVJSX0NNRF9UTwkgMHgwMgkvKiBDb21tYW5kIFRpbWVvdXQJCQkqLworI2RlZmluZSBIQV9CVVNfUkVTRVQJIDB4MDMJLyogU0NTSSBCdXMgUmVzZXQgUmVjZWl2ZWQJCSovCisjZGVmaW5lIEhBX0lOSVRfUE9XRVJVUAkgMHgwNAkvKiBJbml0aWFsIENvbnRyb2xsZXIgUG93ZXItdXAJCSovCisjZGVmaW5lIEhBX1VOWF9CVVNQSEFTRQkgMHgwNQkvKiBVbmV4cGVjdGVkIEJ1cyBQaGFzZQkJCSovCisjZGVmaW5lIEhBX1VOWF9CVVNfRlJFRQkgMHgwNgkvKiBVbmV4cGVjdGVkIEJ1cyBGcmVlCQkJKi8KKyNkZWZpbmUgSEFfQlVTX1BBUklUWQkgMHgwNwkvKiBCdXMgUGFyaXR5IEVycm9yCQkJKi8KKyNkZWZpbmUgSEFfU0NTSV9IVU5HCSAweDA4CS8qIFNDU0kgSHVuZwkJCQkqLworI2RlZmluZSBIQV9VTlhfTVNHUkpDVAkgMHgwOQkvKiBVbmV4cGVjdGVkIE1lc3NhZ2UgUmVqZWN0ZWQJCSovCisjZGVmaW5lIEhBX1JFU0VUX1NUVUNLCSAweDBhCS8qIFNDU0kgQnVzIFJlc2V0IFN0dWNrCQkJKi8KKyNkZWZpbmUgSEFfUlNFTlNFX0ZBSUwJIDB4MGIJLyogQXV0byBSZXF1ZXN0LVNlbnNlIEZhaWxlZAkJKi8KKyNkZWZpbmUgSEFfUEFSSVRZX0VSUgkgMHgwYwkvKiBDb250cm9sbGVyIFJhbSBQYXJpdHkgRXJyb3IJCSovCisjZGVmaW5lIEhBX0NQX0FCT1JUX05BCSAweDBkCS8qIEFib3J0IE1lc3NhZ2Ugc2VudCB0byBub24tYWN0aXZlIGNtZCAqLworI2RlZmluZSBIQV9DUF9BQk9SVEVECSAweDBlCS8qIEFib3J0IE1lc3NhZ2Ugc2VudCB0byBhY3RpdmUgY21kCSovCisjZGVmaW5lIEhBX0NQX1JFU0VUX05BCSAweDBmCS8qIFJlc2V0IE1lc3NhZ2Ugc2VudCB0byBub24tYWN0aXZlIGNtZCAqLworI2RlZmluZSBIQV9DUF9SRVNFVAkgMHgxMAkvKiBSZXNldCBNZXNzYWdlIHNlbnQgdG8gYWN0aXZlIGNtZAkqLworI2RlZmluZSBIQV9FQ0NfRVJSCSAweDExCS8qIENvbnRyb2xsZXIgUmFtIEVDQyBFcnJvcgkJKi8KKyNkZWZpbmUgSEFfUENJX1BBUklUWQkgMHgxMgkvKiBQQ0kgUGFyaXR5IEVycm9yCQkJKi8KKyNkZWZpbmUgSEFfUENJX01BQk9SVAkgMHgxMwkvKiBQQ0kgTWFzdGVyIEFib3J0CQkJKi8KKyNkZWZpbmUgSEFfUENJX1RBQk9SVAkgMHgxNAkvKiBQQ0kgVGFyZ2V0IEFib3J0CQkJKi8KKyNkZWZpbmUgSEFfUENJX1NUQUJPUlQJIDB4MTUJLyogUENJIFNpZ25hbGVkIFRhcmdldCBBYm9ydAkJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBPdGhlciAgZGVmaW5pdGlvbnMJCQkgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHJlZ19iaXQgeyAgICAgIC8qIHJlYWRpbmcgdGhpcyBvbmUgd2lsbCBjbGVhciB0aGUgaW50ZXJydXB0ICAgICovCisgICAgX191OCBlcnJvcjoxOyAgICAgLyogcHJldmlvdXMgY29tbWFuZCBlbmRlZCBpbiBhbiBlcnJvcgkgICAgICAqLworICAgIF9fdTggbW9yZToxOyAgICAgIC8qIG1vcmUgREFUQSBjb21pbmcgc29vbiwgcG9sbCBCU1kgJiBEUlEgKFBJTykgICovCisgICAgX191OCBjb3JyOjE7ICAgICAgLyogZGF0YSByZWFkIHdhcyBzdWNjZXNzZnVsbHkgY29ycmVjdGVkIHdpdGggRUNDKi8KKyAgICBfX3U4IGRycToxOwkgICAgICAvKiBkYXRhIHJlcXVlc3QgYWN0aXZlICAqLyAgICAgCisgICAgX191OCBzYzoxOwkgICAgICAvKiBzZWVrIGNvbXBsZXRlCSAgICAgICovCisgICAgX191OCBmYXVsdDoxOyAgICAgLyogd3JpdGUgZmF1bHQJICAgICAgKi8KKyAgICBfX3U4IHJlYWR5OjE7ICAgICAvKiBkcml2ZSByZWFkeQkgICAgICAqLworICAgIF9fdTggYnVzeToxOyAgICAgIC8qIGNvbnRyb2xsZXIgYnVzeSAgICAgICovCit9OworCitzdHJ1Y3QgcmVnX2FiaXQgeyAgICAgLyogcmVhZGluZyB0aGlzIHdvbid0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICBfX3U4IGFidXN5OjE7ICAgICAvKiBhdXhpbGlhcnkgYnVzeQkJCQkqLworICAgIF9fdTggaXJxOjE7CSAgICAgIC8qIHNldCB3aGVuIGRyaXZlIGludGVycnVwdCBpcyBhc3NlcnRlZAkqLworICAgIF9fdTggZHVtbXk6NjsKK307CisKK3N0cnVjdCBlYXRhX3JlZ2lzdGVyIHsJICAgIC8qIEVBVEEgcmVnaXN0ZXIgc2V0ICovCisgICAgX191OCBkYXRhX3JlZ1syXTsJICAgIC8qIFIsIGNvdWxkbid0IGZpZ3VyZSB0aGlzIG9uZSBvdXQJCSovCisgICAgX191OCBjcF9hZGRyWzRdOwkgICAgLyogVywgQ1AgYWRkcmVzcyByZWdpc3RlcgkJCSovCisgICAgdW5pb24geyAKKwlfX3U4IGNvbW1hbmQ7CSAgICAvKiBXLCBjb21tYW5kIGNvZGU6IFtyZWFkfHNldF0gY29uZiwgc2VuZCBDUCovCisJc3RydWN0IHJlZ19iaXQgc3RhdHVzOwkvKiBSLCBzZWUgcmVnaXN0ZXJfYml0MQkJCSovCisJX191OCBzdGF0dXNieXRlOworICAgIH0gb3ZyOyAgIAorICAgIHN0cnVjdCByZWdfYWJpdCBhdXhfc3RhdDsgLyogUiwgc2VlIHJlZ2lzdGVyX2JpdDIJCQkqLworfTsKKworc3RydWN0IGdldF9jb25mIHsJICAgICAgLyogUmVhZCBDb25maWd1cmF0aW9uIEFycmF5CQkqLworICAgIF9fdTMyICBsZW47CQkgICAgICAvKiBTaG91bGQgcmV0dXJuIDB4MjIsIDB4MjQsIGV0YwkJKi8KKyAgICBfX3UzMiBzaWduYXR1cmU7CSAgICAgIC8qIFNpZ25hdHVyZSBNVVNUIGJlICJFQVRBIgkJKi8KKyAgICBfX3U4ICAgIHZlcnNpb24yOjQsCisJICAgICB2ZXJzaW9uOjQ7CSAgICAgIC8qIEVBVEEgVmVyc2lvbiBsZXZlbAkJCSovCisgICAgX191OCBPQ1NfZW5hYmxlZDoxLAkgICAgICAvKiBPdmVybGFwIENvbW1hbmQgU3VwcG9ydCBlbmFibGVkCSovCisJIFRBUl9zdXBwb3J0OjEsCSAgICAgIC8qIFNDU0kgVGFyZ2V0IE1vZGUgc3VwcG9ydGVkCQkqLworCSAgICAgIFRSTlhGUjoxLAkgICAgICAvKiBUcnVuY2F0ZSBUcmFuc2ZlciBDbWQgbm90IG5lY2Vzc2FyeQkqCisJCQkgICAgICAgKiBPbmx5IHVzZWQgaW4gUElPIE1vZGUJCQkqLworCU1PUkVfc3VwcG9ydDoxLAkgICAgICAvKiBNT1JFIHN1cHBvcnRlZCAob25seSBQSU8gTW9kZSkJCSovCisJIERNQV9zdXBwb3J0OjEsCSAgICAgIC8qIERNQSBzdXBwb3J0ZWQgRHJpdmVyIHVzZXMgb25seQkJKgorCQkJICAgICAgICogdGhpcyBtb2RlCQkJCSovCisJICAgRE1BX3ZhbGlkOjEsCSAgICAgIC8qIERSUSB2YWx1ZSBpbiBCeXRlIDMwIGlzIHZhbGlkCQkqLworCQkgQVRBOjEsCSAgICAgIC8qIEFUQSBkZXZpY2UgY29ubmVjdGVkIChub3Qgc3VwcG9ydGVkKQkqLworCSAgIEhBQV92YWxpZDoxOwkgICAgICAvKiBIb3N0YWRhcHRlciBBZGRyZXNzIGlzIHZhbGlkCQkqLworCisgICAgX191MTYgY3BwYWRsZW47CSAgICAgIC8qIE51bWJlciBvZiBwYWQgYnl0ZXMgc2VuZCBhZnRlciBDRCBkYXRhICoKKwkJCSAgICAgICAqIHNldCB0byB6ZXJvIGZvciBETUEgY29tbWFuZHMJCSovCisgICAgX191OCBzY3NpX2lkWzRdOwkgICAgICAvKiBTQ1NJIElEIG9mIGNvbnRyb2xsZXIgMi0wIEJ5dGUgMCByZXMuCSoKKwkJCSAgICAgICAqIGlmIG5vdCwgemVybyBpcyByZXR1cm5lZAkJKi8KKyAgICBfX3UzMiAgY3BsZW47CSAgICAgIC8qIENQIGxlbmd0aDogbnVtYmVyIG9mIHZhbGlkIGNwIGJ5dGVzCSovCisgICAgX191MzIgIHNwbGVuOwkgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgYWZ0ZXIJCSogCisJCQkgICAgICAgKiBSZWNlaXZlIFNQIGNvbW1hbmQJCQkqLworICAgIF9fdTE2IHF1ZXVlc2l6OwkgICAgICAvKiBtYXggbnVtYmVyIG9mIHF1ZXVlYWJsZSBDUHMJCSovCisgICAgX191MTYgZHVtbXk7CisgICAgX191MTYgU0dzaXo7CSAgICAgIC8qIG1heCBudW1iZXIgb2YgU0cgdGFibGUgZW50cmllcwkJKi8KKyAgICBfX3U4ICAgIElSUTo0LAkgICAgICAvKiBJUlEgdXNlZCB0aGlzIEhBCQkJKi8KKwkgSVJRX1RSOjEsCSAgICAgIC8qIElSUSBUcmlnZ2VyOiAwPWVkZ2UsIDE9bGV2ZWwJCSovCisJIFNFQ09ORDoxLAkgICAgICAvKiBUaGlzIGlzIGEgc2Vjb25kYXJ5IGNvbnRyb2xsZXIJCSovCisgICAgRE1BX2NoYW5uZWw6MjsJICAgICAgLyogRFJRIGluZGV4LCBEUlEgaXMgMmNvbXAgb2YgRFJRWAkqLworICAgIF9fdTggc3luYzsJCSAgICAgIC8qIGRldmljZSBhdCBJRCA3IHRydSAwIGlzIHJ1bm5pbmcgaW4JKgorCQkJICAgICAgICogc3luY2hyb25vdXMgbW9kZSwgdGhpcyB3aWxsIGRpc2FwcGVhcgkqLworICAgIF9fdTggICBEU0JMRToxLAkgICAgICAvKiBJU0EgaS9vIGFkZHJlc3NpbmcgaXMgZGlzYWJsZWQJCSovCisJIEZPUkNBRFI6MSwJICAgICAgLyogaS9vIGFkZHJlc3MgaGFzIGJlZW4gZm9yY2VkCQkqLworCSAgU0dfNjRLOjEsCisJICBTR19VQUU6MSwKKwkJOjQ7CisgICAgX191OCAgTUFYX0lEOjUsCSAgICAgIC8qIE1heCBudW1iZXIgb2YgU0NTSSB0YXJnZXQgSURzCQkqLworCU1BWF9DSEFOOjM7CSAgICAgIC8qIE51bWJlciBvZiBTQ1NJIGJ1c3NlcyBvbiBIQkEJCSovCisgICAgX191OCBNQVhfTFVOOwkgICAgICAvKiBNYXggbnVtYmVyIG9mIExVTnMJCQkqLworICAgIF9fdTgJOjMsCisJIEFVVE9UUk06MSwKKwkgTTFfaW5zdDoxLAorCSBJRF9xZXN0OjEsCSAgICAgIC8qIFJhaWRudW0gSUQgaXMgcXVlc3Rpb25hYmxlCQkqLworCSAgaXNfUENJOjEsCSAgICAgIC8qIEhCQSBpcyBQQ0kJCQkJKi8KKwkgaXNfRUlTQToxOwkgICAgICAvKiBIQkEgaXMgRUlTQQkJCQkqLworICAgIF9fdTggUkFJRE5VTTsgICAgICAgICAgICAgLyogdW5pcXVlIEhCQSBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgKi8KKyAgICBfX3U4IHVudXNlZFs0NzRdOyAKK307CisKK3N0cnVjdCBlYXRhX3NnX2xpc3QKK3sKKyAgICBfX3UzMiBkYXRhOworICAgIF9fdTMyIGxlbjsKK307CisKK3N0cnVjdCBlYXRhX2NjYiB7CSAgICAgIC8qIFNlbmQgQ29tbWFuZCBQYWNrZXQgc3RydWN0dXJlCSAgICAqLworIAorICAgIF9fdTggU0NTSV9SZXNldDoxLAkgICAgICAvKiBDYXVzZSBhIFNDU0kgQnVzIHJlc2V0IG9uIHRoZSBjbWQJKi8KKwkgICBIQkFfSW5pdDoxLAkgICAgICAvKiBDYXVzZSBDb250cm9sbGVyIHRvIHJlaW5pdGlhbGl6ZQkqLworICAgICAgIEF1dG9fUmVxX1NlbjoxLAkgICAgICAvKiBEbyBBdXRvIFJlcXVlc3QgU2Vuc2Ugb24gZXJyb3JzCSovCisJICAgIHNjYXR0ZXI6MSwJICAgICAgLyogRGF0YSBQdHIgcG9pbnRzIHRvIGEgU0cgUGFja2V0CQkqLworCSAgICAgUmVzcnZkOjEsCSAgICAgIC8qIFJGVQkJCQkJKi8KKwkgIEludGVycHJldDoxLAkgICAgICAvKiBJbnRlcnByZXQgdGhlIFNDU0kgY2RiIG9mIG93biB1c2UJKi8KKwkgICAgRGF0YU91dDoxLAkgICAgICAvKiBEYXRhIE91dCBwaGFzZSB3aXRoIGNvbW1hbmQJCSovCisJICAgICBEYXRhSW46MTsJICAgICAgLyogRGF0YSBJbiBwaGFzZSB3aXRoIGNvbW1hbmQJCSovCisgICAgX191OCByZXFsZW47CSAgICAgIC8qIFJlcXVlc3QgU2Vuc2UgTGVuZ3RoCQkJKiAKKwkJCSAgICAgICAqIFZhbGlkIGlmIEF1dG9fUmVxX1Nlbj0xCQkqLworICAgIF9fdTggdW51c2VkWzNdOworICAgIF9fdTggIEZXTkVTVDoxLAkgICAgICAvKiBzZW5kIGNtZCB0byBwaHlzIFJBSUQgY29tcG9uZW50CSovCisJIHVudXNlZDI6NzsKKyAgICBfX3U4IFBoc3VuaXQ6MSwJICAgICAgLyogcGh5c2ljYWwgdW5pdCBvbiBtaXJyb3JlZCBwYWlyCQkqLworCSAgICBJX0FUOjEsCSAgICAgIC8qIGluaGliaXQgYWRkcmVzcyB0cmFuc2xhdGlvbgkJKi8KKwkgSV9IQkFfQzoxLAkgICAgICAvKiBIQkEgaW5oaWJpdCBjYWNoaW5nCQkJKi8KKwkgdW51c2VkMzo1OworCisgICAgX191OCAgICAgY3BfaWQ6NSwJICAgICAgLyogU0NTSSBEZXZpY2UgSUQgb2YgdGFyZ2V0CQkqLyAKKwljcF9jaGFubmVsOjM7CSAgICAgIC8qIFNDU0kgQ2hhbm5lbCAjIG9mIEhCQQkJCSovCisgICAgX191OCAgICBjcF9sdW46MywKKwkJICA6MiwKKwkgY3BfbHVudGFyOjEsCSAgICAgIC8qIENQIGlzIGZvciB0YXJnZXQgUk9VVElORQkJKi8KKwkgY3BfZGlzcHJpOjEsCSAgICAgIC8qIEdyYW50IGRpc2Nvbm5lY3QgcHJpdmlsZWdlCQkqLworICAgICAgIGNwX2lkZW50aWZ5OjE7CSAgICAgIC8qIEFsd2F5cyBUUlVFCQkJCSovCisgICAgX191OCBjcF9tc2cxOwkgICAgICAvKiBNZXNzYWdlIGJ5dGVzIDAtMwkJCSovCisgICAgX191OCBjcF9tc2cyOworICAgIF9fdTggY3BfbXNnMzsKKyAgICBfX3U4IGNwX2NkYlsxMl07CSAgICAgIC8qIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jawkJKi8KKyAgICBfX3UzMiBjcF9kYXRhbGVuOwkgICAgICAvKiBEYXRhIFRyYW5zZmVyIExlbmd0aAkJCSoKKwkJCSAgICAgICAqIElmIHNjYXR0ZXI9MSBsZW4gb2Ygc2cgcGFja2FnZQkJKi8KKyAgICB2b2lkICpjcF92aXJhZGRyOwkgICAgICAvKiBhZGRyZXNzIG9mIHRoaXMgY2NiCQkJKi8KKyAgICBfX3UzMiBjcF9kYXRhRE1BOwkgICAgICAvKiBEYXRhIEFkZHJlc3MsIGlmIHNjYXR0ZXI9MQkJKgorCQkJICAgICAgICogYWRkcmVzcyBvZiBzY2F0dGVyIHBhY2tldAkJKi8KKyAgICBfX3UzMiBjcF9zdGF0RE1BOwkgICAgICAvKiBhZGRyZXNzIGZvciBTdGF0dXMgUGFja2V0CQkqLyAKKyAgICBfX3UzMiBjcF9yZXFETUE7CSAgICAgIC8qIFJlcXVlc3QgU2Vuc2UgQWRkcmVzcywgdXNlZCBpZgkJKgorCQkJICAgICAgICogQ1AgY29tbWFuZCBlbmRzIHdpdGggZXJyb3IJCSovCisgICAgLyogQWRkaXRpb25hbCBDUCBpbmZvIGJlZ2lucyBoZXJlICovCisgICAgX191MzIgdGltZXN0YW1wOwkgICAgICAvKiBOZWVkZWQgdG8gbWVhc3VyZSBjb21tYW5kIGxhdGVuY3kJKi8KKyAgICBfX3UzMiB0aW1lb3V0OworICAgIF9fdTggc2l6ZWluZGV4OworICAgIF9fdTggcndfbGF0ZW5jeTsKKyAgICBfX3U4IHJldHJpZXM7CisgICAgX191OCBzdGF0dXM7CSAgICAgIC8qIHN0YXR1cyBvZiB0aGlzIHF1ZXVlc2xvdAkJKi8KKyAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7ICAgIC8qIGFkZHJlc3Mgb2YgY21kCQkJCSovCisgICAgc3RydWN0IGVhdGFfc2dfbGlzdCAqc2dfbGlzdDsKK307CisKKworc3RydWN0IGVhdGFfc3AgeworICAgIF9fdTggaGJhX3N0YXQ6NywJICAgICAgLyogSEJBIHN0YXR1cwkJCQkqLworCSAgICAgIEVPQzoxOwkgICAgICAvKiBUcnVlIGlmIGNvbW1hbmQgZmluaXNoZWQJCSovCisgICAgX191OCBzY3NpX3N0YXQ7CSAgICAgIC8qIFRhcmdldCBTQ1NJIHN0YXR1cwkJCSovCisgICAgX191OCByZXNlcnZlZFsyXTsKKyAgICBfX3UzMiAgcmVzaWR1ZV9sZW47CSAgICAgIC8qIE51bWJlciBvZiBieXRlcyBub3QgdHJhbnNmZXJyZWQJKi8KKyAgICBzdHJ1Y3QgZWF0YV9jY2IgKmNjYjsgICAgIC8qIEFkZHJlc3Mgc2V0IGluIENPTU1BTkQgUEFDS0VUCQkqLworICAgIF9fdTggbXNnWzEyXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGhzdGQgeworICAgIF9fdTggICB2ZW5kb3JbOV07CisgICAgX191OCAgIG5hbWVbMThdOworICAgIF9fdTggICByZXZpc2lvbls2XTsKKyAgICBfX3U4ICAgRUFUQV9yZXZpc2lvbjsKKyAgICBfX3UzMiAgZmlybXdhcmVfcmV2aXNpb247CisgICAgX191OCAgIEhCQV9udW1iZXI7CisgICAgX191OCAgIGJ1c3R5cGU7CQkgLyogYnVzdHlwZSBvZiBIQkEJICAgICAgICovCisgICAgX191OCAgIGNoYW5uZWw7CQkgLyogIyBvZiBhdmFpbC4gc2NzaSBjaGFubmVscyAgKi8KKyAgICBfX3U4ICAgc3RhdGU7CQkgLyogc3RhdGUgb2YgSEJBCSAgICAgICAqLworICAgIF9fdTggICBwcmltYXJ5OwkJIC8qIHRydWUgaWYgcHJpbWFyeQkgICAgICAgKi8KKyAgICBfX3U4ICAgICAgICBtb3JlX3N1cHBvcnQ6MSwgIC8qIEhCQSBzdXBwb3J0cyBNT1JFIGZsYWcgICAgICovCisgICAgICAgICAgIGltbWVkaWF0ZV9zdXBwb3J0OjEsICAvKiBIQkEgc3VwcG9ydHMgSU1NRURJQVRFIENNRHMqLworICAgICAgICAgICAgICBicm9rZW5fSU5RVUlSWToxOwkgLyogVGhpcyBpcyBhbiBFSVNBIEhCQSB3aXRoICAgKgorCQkJCSAgKiBicm9rZW4gSU5RVUlSWQkgICAgICAgKi8KKyAgICBfX3U4ICAgZG9fbGF0ZW5jeTsJCSAvKiBMYXRlbmN5IG1lYXN1cmVtZW50IGZsYWcgICAqLworICAgIF9fdTMyICByZWFkc1sxM107CisgICAgX191MzIgIHdyaXRlc1sxM107CisgICAgX191MzIgIHJlYWRzX2xhdFsxMl1bNF07CisgICAgX191MzIgIHdyaXRlc19sYXRbMTJdWzRdOworICAgIF9fdTMyICBhbGxfbGF0WzRdOworICAgIF9fdTggICByZXNldGxldmVsW01BWENIQU5ORUxdOyAKKyAgICBfX3UzMiAgbGFzdF9jY2I7CQkgLyogTGFzdCB1c2VkIGNjYgkgICAgICAgKi8KKyAgICBfX3UzMiAgY3BsZW47CQkgLyogc2l6ZSBvZiBDUCBpbiB3b3JkcwkgICAgICAgKi8KKyAgICBfX3UxNiAgY3BwYWRsZW47CQkgLyogcGFkIGxlbmd0aCBvZiBjcCBpbiB3b3JkcyAgKi8KKyAgICBfX3UxNiAgcXVldWVzaXplOworICAgIF9fdTE2ICBzZ3NpemU7ICAgICAgICAgICAgICAgLyogIyBvZiBlbnRyaWVzIGluIHRoZSBTRyBsaXN0Ki8KKyAgICBfX3UxNiAgZGV2ZmxhZ3M7CQkgLyogYml0cyBzZXQgZm9yIGRldGVjdGVkIGRldmljZXMgKi8KKyAgICBfX3U4ICAgaG9zdGlkOwkJIC8qIFNDU0kgSUQgb2YgSEJBCSAgICAgICAqLworICAgIF9fdTggICBtb3Jlc3VwcG9ydDsJCSAvKiBIQkEgc3VwcG9ydHMgTU9SRSBmbGFnICAgICAqLworICAgIHN0cnVjdCBTY3NpX0hvc3QgKm5leHQ7CSAgICAKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpwcmV2OworICAgIHN0cnVjdCBlYXRhX3NwIHNwOwkJIC8qIHN0YXR1cyBwYWNrZXQJICAgICAgICovIAorICAgIHN0cnVjdCBlYXRhX2NjYiBjY2JbMF07CSAvKiBjY2IgYXJyYXkgYmVnaW5zIGhlcmUgICAgICAqLworfWhvc3RkYXRhOworCisvKiBzdHJ1Y3R1cmUgZm9yIG1heC4gMiBlbXVsYXRlZCBkcml2ZXMgKi8KK3N0cnVjdCBkcml2ZV9nZW9tX2VtdWwgeworICAgIF9fdTggIHRyYW5zOwkJIC8qIHRyYW5zbGF0aW9uIGZsYWcgMT10cmFuc2wgKi8KKyAgICBfX3U4ICBjaGFubmVsOwkJIC8qIFNDU0kgY2hhbm5lbCBudW1iZXIJICAgICAgKi8KKyAgICBfX3U4ICBIQkE7CQkJIC8qIEhCQSBudW1iZXIgKHByaW0vc2VjKSAgICAgKi8KKyAgICBfX3U4ICBpZDsJCQkgLyogZHJpdmUgaWQJCSAgICAgICovCisgICAgX191OCAgbHVuOwkJCSAvKiBkcml2ZSBsdW4JCSAgICAgICovCisgICAgX191MzIgaGVhZHM7CQkgLyogbnVtYmVyIG9mIGhlYWRzCSAgICAgICovCisgICAgX191MzIgc2VjdG9yczsJCSAvKiBudW1iZXIgb2Ygc2VjdG9ycwkgICAgICAqLworICAgIF9fdTMyIGN5bGluZGVyOwkJIC8qIG51bWJlciBvZiBjeWxpbmRlcnMJICAgICAgKi8KK307CisKK3N0cnVjdCBnZW9tX2VtdWwgeworICAgIF9fdTggYmlvc19kcml2ZXM7CQkgLyogbnVtYmVyIG9mIGVtdWxhdGVkIGRyaXZlcyAqLworICAgIHN0cnVjdCBkcml2ZV9nZW9tX2VtdWwgZHJ2WzJdOyAvKiBkcml2ZSBzdHJ1Y3R1cmVzCSAgICAgICovCit9OworCisjZW5kaWYgLyogX0VBVEFfR0VORVJJQ19IICovCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgYWxtb3N0IGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogNAorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTQKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDQKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtNAorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMgYi9kcml2ZXJzL3Njc2kvZWF0YV9waW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU0OWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKQEAgLTAsMCArMSw5OTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgTGludXggRUFUQSBTQ1NJIFBJTyBkcml2ZXIgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBiYXNlZCBvbiB0aGUgQ0FNIGRvY3VtZW50IENBTS84OS0wMDQgcmV2LiAyLjBjLCAgICAgICAgICoKKyAqICBEUFQncyBkcml2ZXIga2l0LCBzb21lIGludGVybmFsIGRvY3VtZW50cyBhbmQgc291cmNlLCAgICoKKyAqICBhbmQgc2V2ZXJhbCBvdGhlciBMaW51eCBzY3NpIGRyaXZlcnMgYW5kIGtlcm5lbCBkb2NzLiAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBUaGUgZHJpdmVyIGN1cnJlbnRseTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgLXN1cHBvcnRzIGFsbCBFQVRBLVBJTyBib2FyZHMgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgLW9ubHkgc3VwcG9ydHMgREFTRCBkZXZpY2VzICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAoYykxOTkzLTk2IE1pY2hhZWwgTmV1ZmZlciwgQWxmcmVkIEFybm9sZCAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIG5ldWZmZXJAZ29vZnkuemR2LnVuaS1tYWluei5kZSAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIGEuYXJub2xkQGtmYS1qdWVsaWNoLmRlICAgICAgICAgICAgICAgICAgICAgICogCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVXBkYXRlZCAyMDAyIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IGZvciBMaW51eCAgICAqCisgKiAgMi41LnggYW5kIHRoZSBuZXdlciBsb2NraW5nIGFuZCBlcnJvciBoYW5kbGluZyAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0ICAqCisgKiAgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICAgICAqCisgKiAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAqCisgKiAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgICAqCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSAqCisgKiAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgICAgICAqCisgKiAgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSAgICAqCisgKiAgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAqCisgKiAgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgICAgICAqCisgKiAgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGtlcm5lbDsgaWYgbm90LCB3cml0ZSB0byAqCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCAgICAgICAqCisgKiAgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKgkJCQkJCQkgICAgKgorICogIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgKgorICogIGNvZGUgaXMgb25lIHdoaWNoIGlzIGluIGFuIG9wZW4gbm9uIHBhdGVudCBlbmN1bWJlcmVkICAgKgorICogIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZyBmb3JtcyBwYXJ0IG9mICAgKgorICogIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uICAgKgorICogIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgICAgICAgKgorICogIGZ1bmN0aW9uYWwgZXhlY3V0YWJsZSBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIAkgICAgKgorICogIHNvdXJjZSBjb2RlIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGxhc3QgY2hhbmdlOiAyMDAyLzExLzAyICAgICAgICAgICAgICAgT1M6IExpbnV4IDIuNS40NSAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImVhdGFfZ2VuZXJpYy5oIgorI2luY2x1ZGUgImVhdGFfcGlvLmgiCisKKworc3RhdGljIHVpbnQgSVNBYmFzZXNbTUFYSVNBXSA9CXsKKwkgMHgxRjAsIDB4MTcwLCAweDMzMCwgMHgyMzAKK307CisKK3N0YXRpYyB1aW50IElTQWlycXNbTUFYSVNBXSA9IHsKKwkxNCwgMTIsIDE1LCAxMQorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgRUlTQWJhc2VzW10gPSB7IAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSAKK307CisKK3N0YXRpYyB1aW50IHJlZ2lzdGVyZWRfSEJBczsKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpsYXN0X0hCQTsKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpmaXJzdF9IQkE7CitzdGF0aWMgdW5zaWduZWQgY2hhciByZWdfSVJRWzE2XTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlZ19JUlFMWzE2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludF9jb3VudGVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcXVldWVfY291bnRlcjsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlOworCisvKgorICogZWF0YV9wcm9jX2luZm8KKyAqIGlub3V0IDogZGVjaWRlcyBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBkYXRhZmxvdyBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIAorICogICAgICAgICB2YXJpYWJsZXMKKyAqIGJ1ZmZlcjogSWYgaW5vdXQ9PUZBTFNFIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBpdCBlbHNlIHJlYWQgZnJvbSBpdAorICogKnN0YXJ0OiBJZiBpbm91dD09RkFMU0Ugc3RhcnQgb2YgdGhlIHZhbGlkIGRhdGEgaW4gdGhlIGJ1ZmZlcgorICogb2Zmc2V0OiBJZiBpbm91dD09RkFMU0Ugb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1hZ2luYXJ5IGZpbGUgCisgKiAgICAgICAgIGZyb20gd2hpY2ggd2Ugc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBidWZmZXIKKyAqIGxlbmd0aDogSWYgaW5vdXQ9PUZBTFNFIG1heCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIgCisgKiAgICAgICAgIGVsc2UgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGludCBlYXRhX3Bpb19wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICBpbnQgbGVuZ3RoLCBpbnQgcncpCit7CisgICAgc3RhdGljIHU4IGJ1ZmZbNTEyXTsKKyAgICBpbnQgc2l6ZSwgbGVuID0gMDsKKyAgICBvZmZfdCBiZWdpbiA9IDAsIHBvcyA9IDA7CisKKyAgICBpZiAocncpCisgICAgCXJldHVybiAtRU5PU1lTOworICAgIGlmIChvZmZzZXQgPT0gMCkKKwltZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsKKworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJFQVRBIChFeHRlbmRlZCBBdHRhY2htZW50KSBQSU8gZHJpdmVyIHZlcnNpb246ICIKKwkJICAgIiVkLiVkJXNcbiIsVkVSX01BSk9SLCBWRVJfTUlOT1IsIFZFUl9TVUIpOworICAgIGxlbiArPSBzaXplOyBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJxdWV1ZWQgY29tbWFuZHM6ICAgICAlMTBsZFxuIgorCQkgICAicHJvY2Vzc2VkIGludGVycnVwdHM6JTEwbGRcbiIsIHF1ZXVlX2NvdW50ZXIsIGludF9jb3VudGVyKTsKKyAgICBsZW4gKz0gc2l6ZTsgcG9zID0gYmVnaW4gKyBsZW47CisgICAgCisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiXG5zY3NpJS0yZDogSEJBICUuMTBzXG4iLAorCQkgICBzaG9zdC0+aG9zdF9ubywgU0Qoc2hvc3QpLT5uYW1lKTsKKyAgICBsZW4gKz0gc2l6ZTsgCisgICAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiRmlybXdhcmUgcmV2aXNpb246IHYlc1xuIiwgCisJCSAgIFNEKHNob3N0KS0+cmV2aXNpb24pOworICAgIGxlbiArPSBzaXplOworICAgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIklPOiBQSU9cbiIpOworICAgIGxlbiArPSBzaXplOyAKKyAgICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJCYXNlIElPIDogJSMuNHhcbiIsICh1MzIpIHNob3N0LT5iYXNlKTsKKyAgICBsZW4gKz0gc2l6ZTsgCisgICAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiSG9zdCBCdXM6ICVzXG4iLCAKKwkJICAgKFNEKHNob3N0KS0+YnVzdHlwZSA9PSAnUCcpPyJQQ0kgIjoKKwkJICAgKFNEKHNob3N0KS0+YnVzdHlwZSA9PSAnRScpPyJFSVNBIjoiSVNBICIpOworICAgIAorICAgIGxlbiArPSBzaXplOyAKKyAgICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAKKyAgICBpZiAocG9zIDwgb2Zmc2V0KSB7CisJbGVuID0gMDsKKwliZWdpbiA9IHBvczsKKyAgICB9CisgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKwlnb3RvIHN0b3Bfb3V0cHV0OworICAgIAorIHN0b3Bfb3V0cHV0OgorICAgIERCRyhEQkdfUFJPQywgcHJpbnRrKCIycG9zOiAlbGQgb2Zmc2V0OiAlbGQgbGVuOiAlZFxuIiwgcG9zLCBvZmZzZXQsIGxlbikpOworICAgICpzdGFydD1idWZmZXIrKG9mZnNldC1iZWdpbik7ICAgLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKyAgICBsZW4tPShvZmZzZXQtYmVnaW4pOyAgICAgICAgICAgIC8qIFN0YXJ0IHNsb3AgKi8KKyAgICBpZihsZW4+bGVuZ3RoKQorCWxlbiA9IGxlbmd0aDsgICAgICAgICAgICAgICAvKiBFbmRpbmcgc2xvcCAqLworICAgIERCRyhEQkdfUFJPQywgcHJpbnRrKCIzcG9zOiAlbGQgb2Zmc2V0OiAlbGQgbGVuOiAlZFxuIiwgcG9zLCBvZmZzZXQsIGxlbikpOworICAgIAorICAgIHJldHVybiAobGVuKTsgICAgIAorfQorCitzdGF0aWMgaW50IGVhdGFfcGlvX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2gpCit7CisJaWYgKHNoLT5pcnEgJiYgcmVnX0lSUVtzaC0+aXJxXSA9PSAxKQorCQlmcmVlX2lycShzaC0+aXJxLCBOVUxMKTsKKwllbHNlCisJCXJlZ19JUlFbc2gtPmlycV0tLTsKKwlpZiAoU0Qoc2gpLT5jaGFubmVsID09IDApIHsKKwkJaWYgKHNoLT5pb19wb3J0ICYmIHNoLT5uX2lvX3BvcnQpCisJCQlyZWxlYXNlX3JlZ2lvbihzaC0+aW9fcG9ydCwgc2gtPm5faW9fcG9ydCk7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBJbmNTdGF0KHN0cnVjdCBzY3NpX3BvaW50ZXIgKlNDcCwgdWludCBJbmNyZW1lbnQpCit7CisJU0NwLT5wdHIgKz0gSW5jcmVtZW50OworCWlmICgoU0NwLT50aGlzX3Jlc2lkdWFsIC09IEluY3JlbWVudCkgPT0gMCkgeworCQlpZiAoKC0tU0NwLT5idWZmZXJzX3Jlc2lkdWFsKSA9PSAwKQorCQkJU0NwLT5TdGF0dXMgPSAwOworCQllbHNlIHsKKwkJCVNDcC0+YnVmZmVyKys7CisJCQlTQ3AtPnB0ciA9IHBhZ2VfYWRkcmVzcyhTQ3AtPmJ1ZmZlci0+cGFnZSkgKyBTQ3AtPmJ1ZmZlci0+b2Zmc2V0OworCQkJU0NwLT50aGlzX3Jlc2lkdWFsID0gU0NwLT5idWZmZXItPmxlbmd0aDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZWF0YV9waW9faW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJZWF0YV9waW9faW50X2hhbmRsZXIoaXJxLCBkZXZfaWQsIHJlZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGVhdGFfcGlvX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdWludCBlYXRhX3N0YXQgPSAweGZmZmZmOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlob3N0ZGF0YSAqaGQ7CisJc3RydWN0IGVhdGFfY2NiICpjcDsKKwl1aW50IGJhc2U7CisJdWludCB4LCB6OworCXN0cnVjdCBTY3NpX0hvc3QgKnNoOworCXVuc2lnbmVkIHNob3J0IHp3aWNrZWwgPSAwOworCXVuc2lnbmVkIGNoYXIgc3RhdCwgb2RkOworCisJZm9yICh4ID0gMSwgc2ggPSBmaXJzdF9IQkE7IHggPD0gcmVnaXN0ZXJlZF9IQkFzOyB4KyssIHNoID0gU0Qoc2gpLT5wcmV2KSAKKwl7CisJCWlmIChzaC0+aXJxICE9IGlycSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5iKCh1aW50KSBzaC0+YmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0JVU1kpCisJCQljb250aW51ZTsKKworCQlpbnRfY291bnRlcisrOworCisJCWhkID0gU0Qoc2gpOworCisJCWNwID0gJmhkLT5jY2JbMF07CisJCWNtZCA9IGNwLT5jbWQ7CisJCWJhc2UgPSAodWludCkgY21kLT5kZXZpY2UtPmhvc3QtPmJhc2U7CisKKwkJZG8geworCQkJc3RhdCA9IGluYihiYXNlICsgSEFfUlNUQVRVUyk7CisJCQlpZiAoc3RhdCAmIEhBX1NEUlEpIHsKKwkJCQlpZiAoY3AtPkRhdGFJbikgeworCQkJCQl6ID0gMjU2OworCQkJCQlvZGQgPSAwOworCQkJCQl3aGlsZSAoKGNtZC0+U0NwLlN0YXR1cykgJiYgKCh6ID4gMCkgfHwgKG9kZCkpKSB7CisJCQkJCQlpZiAob2RkKSB7CisJCQkJCQkJKihjbWQtPlNDcC5wdHIpID0gendpY2tlbCA+PiA4OworCQkJCQkJCUluY1N0YXQoJmNtZC0+U0NwLCAxKTsKKwkJCQkJCQlvZGQgPSAwOworCQkJCQkJfQorCQkJCQkJeCA9IG1pbl90KHVuc2lnbmVkIGludCwgeiwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCAvIDIpOworCQkJCQkJaW5zdyhiYXNlICsgSEFfUkRBVEEsIGNtZC0+U0NwLnB0ciwgeCk7CisJCQkJCQl6IC09IHg7CisJCQkJCQlJbmNTdGF0KCZjbWQtPlNDcCwgMiAqIHgpOworCQkJCQkJaWYgKCh6ID4gMCkgJiYgKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPT0gMSkpIHsKKwkJCQkJCQl6d2lja2VsID0gaW53KGJhc2UgKyBIQV9SREFUQSk7CisJCQkJCQkJKihjbWQtPlNDcC5wdHIpID0gendpY2tlbCAmIDB4ZmY7CisJCQkJCQkJSW5jU3RhdCgmY21kLT5TQ3AsIDEpOworCQkJCQkJCXotLTsKKwkJCQkJCQlvZGQgPSAxOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXdoaWxlICh6ID4gMCkgeworCQkJCQkJendpY2tlbCA9IGludyhiYXNlICsgSEFfUkRBVEEpOworCQkJCQkJei0tOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLyogY3AtPkRhdGFPdXQgKi8KKworCQkJCQlvZGQgPSAwOworCQkJCQl6ID0gMjU2OworCQkJCQl3aGlsZSAoKGNtZC0+U0NwLlN0YXR1cykgJiYgKCh6ID4gMCkgfHwgKG9kZCkpKSB7CisJCQkJCQlpZiAob2RkKSB7CisJCQkJCQkJendpY2tlbCArPSAqKGNtZC0+U0NwLnB0cikgPDwgODsKKwkJCQkJCQlJbmNTdGF0KCZjbWQtPlNDcCwgMSk7CisJCQkJCQkJb3V0dyh6d2lja2VsLCBiYXNlICsgSEFfUkRBVEEpOworCQkJCQkJCXotLTsKKwkJCQkJCQlvZGQgPSAwOworCQkJCQkJfQorCQkJCQkJeCA9IG1pbl90KHVuc2lnbmVkIGludCwgeiwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCAvIDIpOworCQkJCQkJb3V0c3coYmFzZSArIEhBX1JEQVRBLCBjbWQtPlNDcC5wdHIsIHgpOworCQkJCQkJeiAtPSB4OworCQkJCQkJSW5jU3RhdCgmY21kLT5TQ3AsIDIgKiB4KTsKKwkJCQkJCWlmICgoeiA+IDApICYmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID09IDEpKSB7CisJCQkJCQkJendpY2tlbCA9ICooY21kLT5TQ3AucHRyKTsKKwkJCQkJCQl6d2lja2VsICY9IDB4ZmY7CisJCQkJCQkJSW5jU3RhdCgmY21kLT5TQ3AsIDEpOworCQkJCQkJCW9kZCA9IDE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJd2hpbGUgKHogPiAwIHx8IG9kZCkgeworCQkJCQkJb3V0dyh6d2lja2VsLCBiYXNlICsgSEFfUkRBVEEpOworCQkJCQkJei0tOworCQkJCQkJb2RkID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQl3aGlsZSAoKHN0YXQgJiBIQV9TRFJRKSB8fCAoKHN0YXQgJiBIQV9TTU9SRSkgJiYgaGQtPm1vcmVzdXBwb3J0KSk7CisKKwkJLyogdGVybWluYXRlIGhhbmRsZXIgaWYgSEJBIGdvZXMgYnVzeSBhZ2FpbiwgaS5lLiB0cmFuc2ZlcnMKKwkJICogbW9yZSBkYXRhICovCisKKwkJaWYgKHN0YXQgJiBIQV9TQlVTWSkKKwkJCWJyZWFrOworCisJCS8qIE9LLCB0aGlzIGlzIHF1aXRlIHN0dXBpZCwgYnV0IEkgaGF2ZW4ndCBmb3VuZCBhbnkgY29ycmVjdAorCQkgKiB3YXkgdG8gZ2V0IEhCQSZTQ1NJIHN0YXR1cyBzbyBmYXIgKi8KKworCQlpZiAoIShpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0VSUk9SKSkgeworCQkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KTsKKwkJCWhkLT5kZXZmbGFncyB8PSAoMSA8PCBjcC0+Y3BfaWQpOworCQl9IGVsc2UgaWYgKGhkLT5kZXZmbGFncyAmIDEgPDwgY3AtPmNwX2lkKQorCQkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSArIDB4MDI7CisJCWVsc2UKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKworCQlpZiAoY3AtPnN0YXR1cyA9PSBMT0NLRUQpIHsKKwkJCWNwLT5zdGF0dXMgPSBGUkVFOworCQkJZWF0YV9zdGF0ID0gaW5iKGJhc2UgKyBIQV9SU1RBVFVTKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgImVhdGFfcGlvOiBpbnRfaGFuZGxlciwgZnJlZWluZyBsb2NrZWQgIiAicXVldWVzbG90XG4iKTsKKwkJCXJldHVybjsKKwkJfQorI2lmIERCR19JTlRSMgorCQlpZiAoc3RhdCAhPSAweDUwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInN0YXQ6ICUjLjJ4LCByZXN1bHQ6ICUjLjh4XG4iLCBzdGF0LCBjbWQtPnJlc3VsdCk7CisjZW5kaWYKKworCQljcC0+c3RhdHVzID0gRlJFRTsJLyogbm93IHdlIGNhbiByZWxlYXNlIHRoZSBzbG90ICAqLworCisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQgZWF0YV9waW9fc2VuZF9jb21tYW5kKHVpbnQgYmFzZSwgdW5zaWduZWQgY2hhciBjb21tYW5kKQoreworCXVpbnQgbG9vcCA9IEhaIC8gMjsKKworCXdoaWxlIChpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0JVU1kpCisJCWlmICgtLWxvb3AgPT0gMCkKKwkJCXJldHVybiAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMgZm9yIEhCQS4gIEl0IGlzIG5vdCB0aGUgYmVzdCB3YXkgdG8gZG8gaXQgYXQgdGhpcworCSAqIHBsYWNlLCBidXQgSSBob3BlIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0aGUgSURFIGRyaXZlciAKKwkgKiBpbml0aWFsaXphdGlvbiB0aGlzIHdheSAqLworCisJb3V0YihIQV9DVFJMXzhIRUFEUywgYmFzZSArIEhBX0NUUkxSRUcpOworCisJb3V0Yihjb21tYW5kLCBiYXNlICsgSEFfV0NPTU1BTkQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVhdGFfcGlvX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJdWludCB4LCB5OworCXVpbnQgYmFzZTsKKworCWhvc3RkYXRhICpoZDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaDsKKwlzdHJ1Y3QgZWF0YV9jY2IgKmNwOworCisJcXVldWVfY291bnRlcisrOworCisJaGQgPSBIRChjbWQpOworCXNoID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJYmFzZSA9ICh1aW50KSBzaC0+YmFzZTsKKworCS8qIHVzZSBvbmx5IHNsb3QgMCwgYXMgMjAwMSBjYW4gaGFuZGxlIG9ubHkgb25lIGNtZCBhdCBhIHRpbWUgKi8KKworCXkgPSB4ID0gMDsKKworCWlmIChoZC0+Y2NiW3ldLnN0YXR1cyAhPSBGUkVFKSB7CisKKwkJREJHKERCR19RVUVVRSwgcHJpbnRrKEtFUk5fRU1FUkcgImNhbl9xdWV1ZSAlZCwgeCAlZCwgeSAlZFxuIiwgc2gtPmNhbl9xdWV1ZSwgeCwgeSkpOworI2lmIERFQlVHX0VBVEEKKwkJcGFuaWMoS0VSTl9FTUVSRyAiZWF0YV9waW86IHJ1biBvdXQgb2YgcXVldWUgc2xvdHMgY21kbm86JWxkICIgImludHJubzogJWxkXG4iLCBxdWV1ZV9jb3VudGVyLCBpbnRfY291bnRlcik7CisjZWxzZQorCQlwYW5pYyhLRVJOX0VNRVJHICJlYXRhX3BpbzogcnVuIG91dCBvZiBxdWV1ZSBzbG90cy4uLi5cbiIpOworI2VuZGlmCisJfQorCisJY3AgPSAmaGQtPmNjYlt5XTsKKworCW1lbXNldChjcCwgMCwgc2l6ZW9mKHN0cnVjdCBlYXRhX2NjYikpOworCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwljcC0+c3RhdHVzID0gVVNFRDsJLyogY2xhaW0gZnJlZSBzbG90ICovCisKKwlEQkcoREJHX1FVRVVFLCBwcmludGsoS0VSTl9ERUJVRyAiZWF0YV9waW9fcXVldWUgcGlkICVsZCwgdGFyZ2V0OiAleCwgbHVuOiIgIiAleCwgeSAlZFxuIiwgY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgeSkpOworCisJY21kLT5zY3NpX2RvbmUgPSAodm9pZCAqKSBkb25lOworCisJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJY3AtPkRhdGFPdXQgPSAxOwkvKiBPdXRwdXQgbW9kZSAqLworCWVsc2UKKwkJY3AtPkRhdGFJbiA9IDA7CS8qIElucHV0IG1vZGUgICovCisKKwljcC0+SW50ZXJwcmV0ID0gKGNtZC0+ZGV2aWNlLT5pZCA9PSBoZC0+aG9zdGlkKTsKKwljcC0+Y3BfZGF0YWxlbiA9IGh0b25sKCh1bnNpZ25lZCBsb25nKSBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJY3AtPkF1dG9fUmVxX1NlbiA9IDA7CisJY3AtPmNwX3JlcURNQSA9IGh0b25sKDApOworCWNwLT5yZXFsZW4gPSAwOworCisJY3AtPmNwX2lkID0gY21kLT5kZXZpY2UtPmlkOworCWNwLT5jcF9sdW4gPSBjbWQtPmRldmljZS0+bHVuOworCWNwLT5jcF9kaXNwcmkgPSAwOworCWNwLT5jcF9pZGVudGlmeSA9IDE7CisJbWVtY3B5KGNwLT5jcF9jZGIsIGNtZC0+Y21uZCwgQ09NTUFORF9TSVpFKCpjbWQtPmNtbmQpKTsKKworCWNwLT5jcF9zdGF0RE1BID0gaHRvbmwoMCk7CisKKwljcC0+Y3BfdmlyYWRkciA9IGNwOworCWNwLT5jbWQgPSBjbWQ7CisJY21kLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKikgJmhkLT5jY2JbeV07CisKKwlpZiAoY21kLT51c2Vfc2cgPT0gMCkgeworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMTsKKwkJY21kLT5TQ3AucHRyID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQljbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCX0gZWxzZSB7CisJCWNtZC0+U0NwLmJ1ZmZlciA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBjbWQtPnVzZV9zZzsKKwkJY21kLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCX0KKwljbWQtPlNDcC5TdGF0dXMgPSAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCAhPSAwKTsJLyogVFJVRSBhcyBsb25nIGFzIGJ5dGVzIAorCQkJCQkJCQkgKiBhcmUgdG8gdHJhbnNmZXIgKi8KKworCWlmIChlYXRhX3Bpb19zZW5kX2NvbW1hbmQoYmFzZSwgRUFUQV9DTURfUElPX1NFTkRfQ1ApKSB7CisJCWNtZC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQlwcmludGsoS0VSTl9OT1RJQ0UgImVhdGFfcGlvX3F1ZXVlIHRhcmdldCAlZCwgcGlkICVsZCwgSEJBIGJ1c3ksICIgInJldHVybmluZyBESURfQlVTX0JVU1ksIGRvbmUuXG4iLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+cGlkKTsKKwkJZG9uZShjbWQpOworCQljcC0+c3RhdHVzID0gRlJFRTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyogRklYTUU6IHRpbWVvdXQgKi8KKwl3aGlsZSAoIShpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0RSUSkpCisJCWNwdV9yZWxheCgpOworCW91dHN3KGJhc2UgKyBIQV9SREFUQSwgY3AsIGhkLT5jcGxlbik7CisJb3V0YihFQVRBX0NNRF9QSU9fVFJVTkMsIGJhc2UgKyBIQV9XQ09NTUFORCk7CisJZm9yICh4ID0gMDsgeCA8IGhkLT5jcHBhZGxlbjsgeCsrKQorCQlvdXR3KDAsIGJhc2UgKyBIQV9SREFUQSk7CisKKwlEQkcoREJHX1FVRVVFLCBwcmludGsoS0VSTl9ERUJVRyAiUXVldWVkIGJhc2UgJSMuNGx4IHBpZDogJWxkIHRhcmdldDogJXggIiAibHVuOiAleCBzbG90ICVkIGlycSAlZFxuIiwgKGxvbmcpIHNoLT5iYXNlLCBjbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCB5LCBzaC0+aXJxKSk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IGVhdGFfcGlvX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl1aW50IGxvb3AgPSBIWjsKKworCURCRyhEQkdfQUJOT1JNLCBwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3Bpb19hYm9ydCBjYWxsZWQgcGlkOiAlbGQgIiAidGFyZ2V0OiAleCBsdW46ICV4IHJlYXNvbiAleFxuIiwgY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5hYm9ydF9yZWFzb24pKTsKKworCisJd2hpbGUgKGluYihjbWQtPmRldmljZS0+aG9zdC0+YmFzZSArIEhBX1JBVVhTVEFUKSAmIEhBX0FCVVNZKQorCQlpZiAoLS1sb29wID09IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvOiBhYm9ydCwgdGltZW91dCBlcnJvci5cbiIpOworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCWlmIChDRChjbWQpLT5zdGF0dXMgPT0gRlJFRSkgeworCQlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiUmV0dXJuaW5nOiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HXG4iKSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCWlmIChDRChjbWQpLT5zdGF0dXMgPT0gVVNFRCkgeworCQlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiUmV0dXJuaW5nOiBTQ1NJX0FCT1JUX0JVU1lcbiIpKTsKKwkJLyogV2Ugd2FudCB0byBzbGVlcCBhIGJpdCBtb3JlIGhlcmUgKi8KKwkJcmV0dXJuIEZBSUxFRDsJCS8qIFNOT09aRSAqLworCX0KKwlpZiAoQ0QoY21kKS0+c3RhdHVzID09IFJFU0VUKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvOiBhYm9ydCwgY29tbWFuZCByZXNldCBlcnJvci5cbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKwlpZiAoQ0QoY21kKS0+c3RhdHVzID09IExPQ0tFRCkgeworCQlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW86IGFib3J0LCBxdWV1ZSBzbG90ICIgImxvY2tlZC5cbiIpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcGFuaWMoImVhdGFfcGlvOiBhYm9ydDogaW52YWxpZCBzbG90IHN0YXR1c1xuIik7Cit9CisKK3N0YXRpYyBpbnQgZWF0YV9waW9faG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdWludCB4LCBsaW1pdCA9IDA7CisJdW5zaWduZWQgY2hhciBzdWNjZXNzID0gMDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisKKwlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fcmVzZXQgY2FsbGVkIHBpZDolbGQgdGFyZ2V0OiIgIiAleCBsdW46ICV4IHJlYXNvbiAleFxuIiwgY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5hYm9ydF9yZWFzb24pKTsKKworCWlmIChIRChjbWQpLT5zdGF0ZSA9PSBSRVNFVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3Bpb19yZXNldDogZXhpdCwgYWxyZWFkeSBpbiByZXNldC5cbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qIGZvcmNlIGFsbCBzbG90cyB0byBiZSBmcmVlICovCisKKwlmb3IgKHggPSAwOyB4IDwgY21kLT5kZXZpY2UtPmhvc3QtPmNhbl9xdWV1ZTsgeCsrKSB7CisKKwkJaWYgKEhEKGNtZCktPmNjYlt4XS5zdGF0dXMgPT0gRlJFRSkKKwkJCWNvbnRpbnVlOworCisJCXNwID0gSEQoY21kKS0+Y2NiW3hdLmNtZDsKKwkJSEQoY21kKS0+Y2NiW3hdLnN0YXR1cyA9IFJFU0VUOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYXRhX3Bpb19yZXNldDogc2xvdCAlZCBpbiByZXNldCwgcGlkICVsZC5cbiIsIHgsIHNwLT5waWQpOworCisJCWlmIChzcCA9PSBOVUxMKQorCQkJcGFuaWMoImVhdGFfcGlvX3Jlc2V0OiBzbG90ICVkLCBzcD09TlVMTC5cbiIsIHgpOworCX0KKworCS8qIGhhcmQgcmVzZXQgdGhlIEhCQSAgKi8KKwlvdXRiKEVBVEFfQ01EX1JFU0VULCAodWludCkgY21kLT5kZXZpY2UtPmhvc3QtPmJhc2UgKyBIQV9XQ09NTUFORCk7CisKKwlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fcmVzZXQ6IGJvYXJkIHJlc2V0IGRvbmUuXG4iKSk7CisJSEQoY21kKS0+c3RhdGUgPSBSRVNFVDsKKworCXNwaW5fdW5sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCW1zbGVlcCgzMDAwKTsKKwlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7CisKKwlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fcmVzZXQ6IGludGVycnVwdHMgZGlzYWJsZWQsICIgImxvb3BzICVkLlxuIiwgbGltaXQpKTsKKworCWZvciAoeCA9IDA7IHggPCBjbWQtPmRldmljZS0+aG9zdC0+Y2FuX3F1ZXVlOyB4KyspIHsKKworCQkvKiBTa2lwIHNsb3RzIGFscmVhZHkgc2V0IGZyZWUgYnkgaW50ZXJydXB0ICovCisJCWlmIChIRChjbWQpLT5jY2JbeF0uc3RhdHVzICE9IFJFU0VUKQorCQkJY29udGludWU7CisKKwkJc3AgPSBIRChjbWQpLT5jY2JbeF0uY21kOworCQlzcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCisJCS8qIFRoaXMgbWFpbGJveCBpcyB0ZXJtaW5hdGVkICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvX3Jlc2V0OiByZXNldCBjY2IgJWQuXG4iLCB4KTsKKwkJSEQoY21kKS0+Y2NiW3hdLnN0YXR1cyA9IEZSRUU7CisKKwkJc3AtPnNjc2lfZG9uZShzcCk7CisJfQorCisJSEQoY21kKS0+c3RhdGUgPSAwOworCisJaWYgKHN1Y2Nlc3MpIHsJCS8qIGhtbW0uLi4gKi8KKwkJREJHKERCR19BQk5PUk0sIHByaW50ayhLRVJOX1dBUk5JTkcgImVhdGFfcGlvX3Jlc2V0OiBleGl0LCBzdWNjZXNzLlxuIikpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlEQkcoREJHX0FCTk9STSwgcHJpbnRrKEtFUk5fV0FSTklORyAiZWF0YV9waW9fcmVzZXQ6IGV4aXQsIHdha2V1cC5cbiIpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfcGlvX2JvYXJkX2RhdGEodW5zaWduZWQgbG9uZyBiYXNlLCB1aW50IGlycSwgdWludCBpZCwgdW5zaWduZWQgbG9uZyBjcGxlbiwgdW5zaWduZWQgc2hvcnQgY3BwYWRsZW4pCit7CisJc3RydWN0IGVhdGFfY2NiIGNwOworCXN0YXRpYyBjaGFyIGJ1ZmZbMjU2XTsKKwlpbnQgejsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihzdHJ1Y3QgZWF0YV9jY2IpKTsKKwltZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsKKworCWNwLkRhdGFJbiA9IDE7CisJY3AuSW50ZXJwcmV0ID0gMTsJLyogSW50ZXJwcmV0IGNvbW1hbmQgKi8KKworCWNwLmNwX2RhdGFsZW4gPSBodG9ubCgyNTQpOworCWNwLmNwX2RhdGFETUEgPSBodG9ubCgwKTsKKworCWNwLmNwX2lkID0gaWQ7CisJY3AuY3BfbHVuID0gMDsKKworCWNwLmNwX2NkYlswXSA9IElOUVVJUlk7CisJY3AuY3BfY2RiWzFdID0gMDsKKwljcC5jcF9jZGJbMl0gPSAwOworCWNwLmNwX2NkYlszXSA9IDA7CisJY3AuY3BfY2RiWzRdID0gMjU0OworCWNwLmNwX2NkYls1XSA9IDA7CisKKwlpZiAoZWF0YV9waW9fc2VuZF9jb21tYW5kKCh1aW50KSBiYXNlLCBFQVRBX0NNRF9QSU9fU0VORF9DUCkpCisJCXJldHVybiAoTlVMTCk7CisJd2hpbGUgKCEoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NEUlEpKTsKKwlvdXRzdyhiYXNlICsgSEFfUkRBVEEsICZjcCwgY3BsZW4pOworCW91dGIoRUFUQV9DTURfUElPX1RSVU5DLCBiYXNlICsgSEFfV0NPTU1BTkQpOworCWZvciAoeiA9IDA7IHogPCBjcHBhZGxlbjsgeisrKQorCQlvdXR3KDAsIGJhc2UgKyBIQV9SREFUQSk7CisKKwl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NCVVNZKTsKKwlpZiAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NFUlJPUikKKwkJcmV0dXJuIChOVUxMKTsKKwllbHNlIGlmICghKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRFJRKSkKKwkJcmV0dXJuIChOVUxMKTsKKwllbHNlIHsKKwkJaW5zdyhiYXNlICsgSEFfUkRBVEEsICZidWZmLCAxMjcpOworCQl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NEUlEpCisJCQlpbncoYmFzZSArIEhBX1JEQVRBKTsKKwkJcmV0dXJuIChidWZmKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Bpb19jb25mX1BJTyh1MzIgYmFzZSwgc3RydWN0IGdldF9jb25mICpidWYpCit7CisJdW5zaWduZWQgbG9uZyBsb29wID0gSFogLyAyOworCWludCB6OworCXVuc2lnbmVkIHNob3J0ICpwOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCA5LCAiZWF0YV9waW8iKSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2Yoc3RydWN0IGdldF9jb25mKSk7CisKKwl3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NCVVNZKQorCQlpZiAoLS1sb29wID09IDApCisJCQlnb3RvIGZhaWw7CisKKwlEQkcoREJHX1BJTyAmJiBEQkdfUFJPQkUsIHByaW50ayhLRVJOX0RFQlVHICJJc3N1aW5nIFBJTyBSRUFEIENPTkZJRyB0byBIQkEgYXQgJSN4XG4iLCBiYXNlKSk7CisJZWF0YV9waW9fc2VuZF9jb21tYW5kKGJhc2UsIEVBVEFfQ01EX1BJT19SRUFEX0NPTkZJRyk7CisKKwlsb29wID0gSFogLyAyOworCWZvciAocCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBidWY7IChsb25nKSBwIDw9ICgobG9uZykgYnVmICsgKHNpemVvZihzdHJ1Y3QgZ2V0X2NvbmYpIC8gMikpOyBwKyspIHsKKwkJd2hpbGUgKCEoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NEUlEpKQorCQkJaWYgKC0tbG9vcCA9PSAwKQorCQkJCWdvdG8gZmFpbDsKKworCQlsb29wID0gSFogLyAyOworCQkqcCA9IGludyhiYXNlICsgSEFfUkRBVEEpOworCX0KKwlpZiAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIEhBX1NFUlJPUikgeworCQlEQkcoREJHX1BST0JFLCBwcmludGsoImVhdGFfZG1hOiBnZXRfY29uZl9QSU8sIGVycm9yIGR1cmluZyAiCisJCQkJCSJ0cmFuc2ZlciBmb3IgSEJBIGF0ICV4XG4iLCBiYXNlKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoaHRvbmwoRUFUQV9TSUdOQVRVUkUpICE9IGJ1Zi0+c2lnbmF0dXJlKQorCQlnb3RvIGZhaWw7CisKKwlEQkcoREJHX1BJTyAmJiBEQkdfUFJPQkUsIHByaW50ayhLRVJOX05PVElDRSAiRUFUQSBDb250cm9sbGVyIGZvdW5kICIKKwkJCQkiYXQgJSM0eCBFQVRBIExldmVsOiAleFxuIiwKKwkJCQliYXNlLCAodWludCkgKGJ1Zi0+dmVyc2lvbikpKTsKKworCXdoaWxlIChpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0RSUSkKKwkJaW53KGJhc2UgKyBIQV9SREFUQSk7CisKKwlpZiAoIUFMTE9XX0RNQV9CT0FSRFMpIHsKKwkJZm9yICh6ID0gMDsgeiA8IE1BWElTQTsgeisrKQorCQkJaWYgKGJhc2UgPT0gSVNBYmFzZXNbel0pIHsKKwkJCQlidWYtPklSUSA9IElTQWlycXNbel07CisJCQkJYnJlYWs7CisJCQl9CisJfQorCisJcmV0dXJuIDE7CisKKyBmYWlsOgorCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9waW9fY29uZmlnKHN0cnVjdCBnZXRfY29uZiAqZ2MpCit7CisJcHJpbnRrKCJQbGVhc2UgY2hlY2sgdmFsdWVzOiAocmVhZCBjb25maWcgZGF0YSlcbiIpOworCXByaW50aygiTEVOOiAlZCB2ZXI6JWQgT0NTOiVkIFRBUjolZCBUUk5YRlI6JWQgTU9SRVM6JWRcbiIsICh1aW50KSBudG9obChnYy0+bGVuKSwgZ2MtPnZlcnNpb24sIGdjLT5PQ1NfZW5hYmxlZCwgZ2MtPlRBUl9zdXBwb3J0LCBnYy0+VFJOWEZSLCBnYy0+TU9SRV9zdXBwb3J0KTsKKwlwcmludGsoIkhBQVY6JWQgU0NTSUlEMDolZCBJRDE6JWQgSUQyOiVkIFFVRVVFOiVkIFNHOiVkIFNFQzolZFxuIiwgZ2MtPkhBQV92YWxpZCwgZ2MtPnNjc2lfaWRbM10sIGdjLT5zY3NpX2lkWzJdLCBnYy0+c2NzaV9pZFsxXSwgbnRvaHMoZ2MtPnF1ZXVlc2l6KSwgbnRvaHMoZ2MtPlNHc2l6KSwgZ2MtPlNFQ09ORCk7CisJcHJpbnRrKCJJUlE6JWQgSVJRVDolZCBGT1JDQURSOiVkIE1DSDolZCBSSURROiVkXG4iLCBnYy0+SVJRLCBnYy0+SVJRX1RSLCBnYy0+Rk9SQ0FEUiwgZ2MtPk1BWF9DSEFOLCBnYy0+SURfcWVzdCk7Cit9CisKK3N0YXRpYyB1aW50IHByaW50X3NlbGZ0ZXN0KHVpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1MTJdOworI2lmZGVmIFZFUkJPU0VfU0VUVVAKKwlpbnQgejsKKyNlbmRpZgorCisJcHJpbnRrKCJlYXRhX3BpbzogZXhlY3V0aW5nIGNvbnRyb2xsZXIgc2VsZiB0ZXN0ICYgc2V0dXAuLi5cbiIpOworCXdoaWxlIChpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0JVU1kpOworCW91dGIoRUFUQV9DTURfUElPX1NFVFVQVEVTVCwgYmFzZSArIEhBX1dDT01NQU5EKTsKKwlkbyB7CisJCXdoaWxlIChpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0JVU1kpCisJCQkvKiBub3RoaW5nICovIDsKKwkJaWYgKGluYihiYXNlICsgSEFfUlNUQVRVUykgJiBIQV9TRFJRKSB7CisJCQlpbnN3KGJhc2UgKyBIQV9SREFUQSwgJmJ1ZmZlciwgMjU2KTsKKyNpZmRlZiBWRVJCT1NFX1NFVFVQCisJCQkvKiBubyBiZWVwcyBwbGVhc2UuLi4gKi8KKwkJCWZvciAoeiA9IDA7IHogPCA1MTEgJiYgYnVmZmVyW3pdOyB6KyspCisJCQkJaWYgKGJ1ZmZlclt6XSAhPSA3KQorCQkJCQlwcmludGsoIiVjIiwgYnVmZmVyW3pdKTsKKyNlbmRpZgorCQl9CisJfSB3aGlsZSAoaW5iKGJhc2UgKyBIQV9SU1RBVFVTKSAmIChIQV9TQlVTWSB8IEhBX1NEUlEpKTsKKworCXJldHVybiAoIShpbmIoYmFzZSArIEhBX1JTVEFUVVMpICYgSEFfU0VSUk9SKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfcGlvX0hCQShsb25nIGJhc2UsIHN0cnVjdCBnZXRfY29uZiAqZ2MpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKwljaGFyICpidWZmOworCXVuc2lnbmVkIGxvbmcgY3BsZW47CisJdW5zaWduZWQgc2hvcnQgY3BwYWRsZW47CisJc3RydWN0IFNjc2lfSG9zdCAqc2g7CisJaG9zdGRhdGEgKmhkOworCisJREJHKERCR19SRUdJU1RFUiwgcHJpbnRfcGlvX2NvbmZpZyhnYykpOworCisJaWYgKGdjLT5ETUFfc3VwcG9ydCkgeworCQlwcmludGsoIkhCQSBhdCAlIy40bHggc3VwcG9ydHMgRE1BLiBQbGVhc2UgdXNlIEVBVEEtRE1BIGRyaXZlci5cbiIsIGJhc2UpOworCQlpZiAoIUFMTE9XX0RNQV9CT0FSRFMpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGJ1ZmYgPSBnZXRfcGlvX2JvYXJkX2RhdGEoKHVpbnQpIGJhc2UsIGdjLT5JUlEsIGdjLT5zY3NpX2lkWzNdLCBjcGxlbiA9IChodG9ubChnYy0+Y3BsZW4pICsgMSkgLyAyLCBjcHBhZGxlbiA9IChodG9ucyhnYy0+Y3BwYWRsZW4pICsgMSkgLyAyKSkgPT0gTlVMTCkgeworCQlwcmludGsoIkhCQSBhdCAlI2x4IGRpZG4ndCByZWFjdCBvbiBJTlFVSVJZLiBTb3JyeS5cbiIsICh1bnNpZ25lZCBsb25nKSBiYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwcmludF9zZWxmdGVzdChiYXNlKSAmJiAhQUxMT1dfRE1BX0JPQVJEUykgeworCQlwcmludGsoIkhCQSBhdCAlI2x4IGZhaWxlZCB3aGlsZSBwZXJmb3JtaW5nIHNlbGYgdGVzdCAmIHNldHVwLlxuIiwgKHVuc2lnbmVkIGxvbmcpIGJhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzaXplID0gc2l6ZW9mKGhvc3RkYXRhKSArIChzaXplb2Yoc3RydWN0IGVhdGFfY2NiKSAqIG50b2hzKGdjLT5xdWV1ZXNpeikpOworCisJc2ggPSBzY3NpX3JlZ2lzdGVyKCZkcml2ZXJfdGVtcGxhdGUsIHNpemUpOworCWlmIChzaCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmICghcmVnX0lSUVtnYy0+SVJRXSkgewkvKiBJbnRlcnJ1cHQgYWxyZWFkeSByZWdpc3RlcmVkID8gKi8KKwkJaWYgKCFyZXF1ZXN0X2lycShnYy0+SVJRLCBkb19lYXRhX3Bpb19pbnRfaGFuZGxlciwgU0FfSU5URVJSVVBULCAiRUFUQS1QSU8iLCBzaCkpIHsKKwkJCXJlZ19JUlFbZ2MtPklSUV0rKzsKKwkJCWlmICghZ2MtPklSUV9UUikKKwkJCQlyZWdfSVJRTFtnYy0+SVJRXSA9IDE7CS8qIElSUSBpcyBlZGdlIHRyaWdnZXJlZCAqLworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJDb3VsZG4ndCBhbGxvY2F0ZSBJUlEgJWQsIFNvcnJ5LlxuIiwgZ2MtPklSUSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CQkvKiBNb3JlIHRoYW4gb25lIEhCQSBvbiB0aGlzIElSUSAqLworCQlpZiAocmVnX0lSUUxbZ2MtPklSUV0pIHsKKwkJCXByaW50aygiQ2FuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIEhCQSBvbiB0aGlzIElSUSxcbiIgIiAgaWYgdGhlIElSUSBpcyBlZGdlIHRyaWdnZXJlZC4gU29ycnkuXG4iKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXJlZ19JUlFbZ2MtPklSUV0rKzsKKwl9CisKKwloZCA9IFNEKHNoKTsKKworCW1lbXNldChoZC0+Y2NiLCAwLCAoc2l6ZW9mKHN0cnVjdCBlYXRhX2NjYikgKiBudG9ocyhnYy0+cXVldWVzaXopKSk7CisJbWVtc2V0KGhkLT5yZWFkcywgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogMjYpOworCisJc3RybGNweShTRChzaCktPnZlbmRvciwgJmJ1ZmZbOF0sIHNpemVvZihTRChzaCktPnZlbmRvcikpOworCXN0cmxjcHkoU0Qoc2gpLT5uYW1lLCAmYnVmZlsxNl0sIHNpemVvZihTRChzaCktPm5hbWUpKTsKKwlTRChzaCktPnJldmlzaW9uWzBdID0gYnVmZlszMl07CisJU0Qoc2gpLT5yZXZpc2lvblsxXSA9IGJ1ZmZbMzNdOworCVNEKHNoKS0+cmV2aXNpb25bMl0gPSBidWZmWzM0XTsKKwlTRChzaCktPnJldmlzaW9uWzNdID0gJy4nOworCVNEKHNoKS0+cmV2aXNpb25bNF0gPSBidWZmWzM1XTsKKwlTRChzaCktPnJldmlzaW9uWzVdID0gMDsKKworCXN3aXRjaCAobnRvaGwoZ2MtPmxlbikpIHsKKwljYXNlIDB4MWM6CisJCVNEKHNoKS0+RUFUQV9yZXZpc2lvbiA9ICdhJzsKKwkJYnJlYWs7CisJY2FzZSAweDFlOgorCQlTRChzaCktPkVBVEFfcmV2aXNpb24gPSAnYic7CisJCWJyZWFrOworCWNhc2UgMHgyMjoKKwkJU0Qoc2gpLT5FQVRBX3JldmlzaW9uID0gJ2MnOworCQlicmVhazsKKwljYXNlIDB4MjQ6CisJCVNEKHNoKS0+RUFUQV9yZXZpc2lvbiA9ICd6JzsKKwlkZWZhdWx0OgorCQlTRChzaCktPkVBVEFfcmV2aXNpb24gPSAnPyc7CisJfQorCisJaWYgKG50b2hsKGdjLT5sZW4pID49IDB4MjIpIHsKKwkJaWYgKGdjLT5pc19QQ0kpCisJCQloZC0+YnVzdHlwZSA9IElTX1BDSTsKKwkJZWxzZSBpZiAoZ2MtPmlzX0VJU0EpCisJCQloZC0+YnVzdHlwZSA9IElTX0VJU0E7CisJCWVsc2UKKwkJCWhkLT5idXN0eXBlID0gSVNfSVNBOworCX0gZWxzZSB7CisJCWlmIChidWZmWzIxXSA9PSAnNCcpCisJCQloZC0+YnVzdHlwZSA9IElTX1BDSTsKKwkJZWxzZSBpZiAoYnVmZlsyMV0gPT0gJzInKQorCQkJaGQtPmJ1c3R5cGUgPSBJU19FSVNBOworCQllbHNlCisJCQloZC0+YnVzdHlwZSA9IElTX0lTQTsKKwl9CisKKwlTRChzaCktPmNwbGVuID0gY3BsZW47CisJU0Qoc2gpLT5jcHBhZGxlbiA9IGNwcGFkbGVuOworCVNEKHNoKS0+aG9zdGlkID0gZ2MtPnNjc2lfaWRbM107CisJU0Qoc2gpLT5kZXZmbGFncyA9IDEgPDwgZ2MtPnNjc2lfaWRbM107CisJU0Qoc2gpLT5tb3Jlc3VwcG9ydCA9IGdjLT5NT1JFX3N1cHBvcnQ7CisJc2gtPnVuaXF1ZV9pZCA9IGJhc2U7CisJc2gtPmJhc2UgPSBiYXNlOworCXNoLT5pb19wb3J0ID0gYmFzZTsKKwlzaC0+bl9pb19wb3J0ID0gOTsKKwlzaC0+aXJxID0gZ2MtPklSUTsKKwlzaC0+ZG1hX2NoYW5uZWwgPSBQSU87CisJc2gtPnRoaXNfaWQgPSBnYy0+c2NzaV9pZFszXTsKKwlzaC0+Y2FuX3F1ZXVlID0gMTsKKwlzaC0+Y21kX3Blcl9sdW4gPSAxOworCXNoLT5zZ190YWJsZXNpemUgPSBTR19BTEw7CisKKwloZC0+Y2hhbm5lbCA9IDA7CisKKwlzaC0+bWF4X2lkID0gODsKKwlzaC0+bWF4X2x1biA9IDg7CisKKwlpZiAoZ2MtPlNFQ09ORCkKKwkJaGQtPnByaW1hcnkgPSAwOworCWVsc2UKKwkJaGQtPnByaW1hcnkgPSAxOworCisJc2gtPnVuY2hlY2tlZF9pc2FfZG1hID0gMDsJLyogV2UgY2FuIG9ubHkgZG8gUElPICovCisKKwloZC0+bmV4dCA9IE5VTEw7CS8qIGJ1aWxkIGEgbGlua2VkIGxpc3Qgb2YgYWxsIEhCQXMgKi8KKwloZC0+cHJldiA9IGxhc3RfSEJBOworCWlmIChoZC0+cHJldiAhPSBOVUxMKQorCQlTRChoZC0+cHJldiktPm5leHQgPSBzaDsKKwlsYXN0X0hCQSA9IHNoOworCWlmIChmaXJzdF9IQkEgPT0gTlVMTCkKKwkJZmlyc3RfSEJBID0gc2g7CisJcmVnaXN0ZXJlZF9IQkFzKys7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQgZmluZF9waW9fSVNBKHN0cnVjdCBnZXRfY29uZiAqYnVmKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWElTQTsgaSsrKSB7CisJCWlmICghSVNBYmFzZXNbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKCFnZXRfcGlvX2NvbmZfUElPKElTQWJhc2VzW2ldLCBidWYpKQorCQkJY29udGludWU7CisJCWlmICghcmVnaXN0ZXJfcGlvX0hCQShJU0FiYXNlc1tpXSwgYnVmKSkKKwkJCXJlbGVhc2VfcmVnaW9uKElTQWJhc2VzW2ldLCA5KTsKKwkJZWxzZQorCQkJSVNBYmFzZXNbaV0gPSAwOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfcGlvX0VJU0Eoc3RydWN0IGdldF9jb25mICpidWYpCit7CisJdTMyIGJhc2U7CisJaW50IGk7CisKKyNpZmRlZiBDSEVDS1BBTAorCXU4IHBhbDEsIHBhbDIsIHBhbDM7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBNQVhFSVNBOyBpKyspIHsKKwkJaWYgKEVJU0FiYXNlc1tpXSkgewkvKiBTdGlsbCBhIHBvc3NpYmlsaXR5ID8gICAgICAgICAgKi8KKworCQkJYmFzZSA9IDB4MWM4OCArIChpICogMHgxMDAwKTsKKyNpZmRlZiBDSEVDS1BBTAorCQkJcGFsMSA9IGluYigodTE2KSBiYXNlIC0gOCk7CisJCQlwYWwyID0gaW5iKCh1MTYpIGJhc2UgLSA3KTsKKwkJCXBhbDMgPSBpbmIoKHUxNikgYmFzZSAtIDYpOworCisJCQlpZiAoKChwYWwxID09IDB4MTIpICYmIChwYWwyID09IDB4MTQpKSB8fCAoKHBhbDEgPT0gMHgzOCkgJiYgKHBhbDIgPT0gMHhhMykgJiYgKHBhbDMgPT0gMHg4MikpIHx8ICgocGFsMSA9PSAweDA2KSAmJiAocGFsMiA9PSAweDk0KSAmJiAocGFsMyA9PSAweDI0KSkpIHsKKwkJCQlEQkcoREJHX1BST0JFLCBwcmludGsoS0VSTl9OT1RJQ0UgIkVJU0EgRUFUQSBpZCB0YWdzIGZvdW5kOiAiICIleCAleCAleCBcbiIsIChpbnQpIHBhbDEsIChpbnQpIHBhbDIsIChpbnQpIHBhbDMpKTsKKyNlbmRpZgorCQkJCWlmIChnZXRfcGlvX2NvbmZfUElPKGJhc2UsIGJ1ZikpIHsKKwkJCQkJREJHKERCR19QUk9CRSAmJiBEQkdfRUlTQSwgcHJpbnRfcGlvX2NvbmZpZyhidWYpKTsKKwkJCQkJaWYgKGJ1Zi0+SVJRKSB7CisJCQkJCQlpZiAoIXJlZ2lzdGVyX3Bpb19IQkEoYmFzZSwgYnVmKSkKKwkJCQkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA5KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50ayhLRVJOX05PVElDRSAiZWF0YV9kbWE6IE5vIHZhbGlkIElSUS4gSEJBICIgInJlbW92ZWQgZnJvbSBsaXN0XG4iKTsKKwkJCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDkpOworCQkJCQl9CisJCQkJfQorCQkJCS8qIE5vdGhpbmcgZm91bmQgaGVyZSBzbyB3ZSB0YWtlIGl0IGZyb20gdGhlIGxpc3QgKi8KKwkJCQlFSVNBYmFzZXNbaV0gPSAwOworI2lmZGVmIENIRUNLUEFMCisJCQl9CisjZW5kaWYKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfcGlvX1BDSShzdHJ1Y3QgZ2V0X2NvbmYgKmJ1ZikKK3sKKyNpZm5kZWYgQ09ORklHX1BDSQorCXByaW50aygiZWF0YV9kbWE6IGtlcm5lbCBQQ0kgc3VwcG9ydCBub3QgZW5hYmxlZC4gU2tpcHBpbmcgc2NhbiBmb3IgUENJIEhCQXMuXG4iKTsKKyNlbHNlCisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJdTMyIGJhc2UsIHg7CisKKwl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0RQVCwgUENJX0RFVklDRV9JRF9EUFQsIGRldikpICE9IE5VTEwpIHsKKwkJREJHKERCR19QUk9CRSAmJiBEQkdfUENJLCBwcmludGsoImVhdGFfcGlvOiBmaW5kX1BDSSwgSEJBIGF0ICVzXG4iLCBwY2lfbmFtZShkZXYpKSk7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKQorCQkJY29udGludWU7CisJCXBjaV9zZXRfbWFzdGVyKGRldik7CisJCWJhc2UgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCAwKTsKKwkJaWYgKGJhc2UgJiBJT1JFU09VUkNFX01FTSkgeworCQkJcHJpbnRrKCJlYXRhX3BpbzogaW52YWxpZCBiYXNlIGFkZHJlc3Mgb2YgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwkJLyogRUlTQSB0YWcgdGhlcmUgPyAqLworCQlpZiAoKGluYihiYXNlKSA9PSAweDEyKSAmJiAoaW5iKGJhc2UgKyAxKSA9PSAweDE0KSkKKwkJCWNvbnRpbnVlOwkvKiBKZXAsIGl0J3MgZm9yY2VkLCBzbyBtb3ZlIG9uICAqLworCQliYXNlICs9IDB4MTA7CS8qIE5vdywgVEhJUyBpcyB0aGUgcmVhbCBhZGRyZXNzICovCisJCWlmIChiYXNlICE9IDB4MWY4KSB7CisJCQkvKiBXZSBkaWRuJ3QgZmluZCBpdCBpbiB0aGUgcHJpbWFyeSBzZWFyY2ggKi8KKwkJCWlmIChnZXRfcGlvX2NvbmZfUElPKGJhc2UsIGJ1ZikpIHsKKwkJCQlpZiAoYnVmLT5GT1JDQURSKSB7CS8qIElmIHRoZSBhZGRyZXNzIGlzIGZvcmNlZCAqLworCQkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlLCA5KTsKKwkJCQkJY29udGludWU7CS8qIHdlJ2xsIGZpbmQgaXQgbGF0ZXIgICAgICAqLworCQkJCX0KKworCQkJCS8qIE9LLiBXZSBtYWRlIGl0IHRpbGwgaGVyZSwgc28gd2UgY2FuIGdvIG5vdyAgCisJCQkJICogYW5kIHJlZ2lzdGVyIGl0LiBXZSAgb25seSBoYXZlIHRvIGNoZWNrIGFuZCAKKwkJCQkgKiBldmVudHVhbGx5IHJlbW92ZSBpdCBmcm9tIHRoZSBFSVNBIGFuZCBJU0EgbGlzdCAKKwkJCQkgKi8KKworCQkJCWlmICghcmVnaXN0ZXJfcGlvX0hCQShiYXNlLCBidWYpKSB7CisJCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDkpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoYmFzZSA8IDB4MTAwMCkgeworCQkJCQlmb3IgKHggPSAwOyB4IDwgTUFYSVNBOyArK3gpIHsKKwkJCQkJCWlmIChJU0FiYXNlc1t4XSA9PSBiYXNlKSB7CisJCQkJCQkJSVNBYmFzZXNbeF0gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmICgoYmFzZSAmIDB4MGZmZikgPT0gMHgwYzg4KSB7CisJCQkJCXggPSAoYmFzZSA+PiAxMikgJiAweDBmOworCQkJCQlFSVNBYmFzZXNbeF0gPSAwOworCQkJCX0KKwkJCX0KKyNpZmRlZiBDSEVDS19CTElOSworCQkJZWxzZSBpZiAoY2hlY2tfYmxpbmtfc3RhdGUoYmFzZSkpIHsKKwkJCQlwcmludGsoImVhdGFfcGlvOiBIQkEgaXMgaW4gQkxJTksgc3RhdGUuXG4iICJDb25zdWx0IHlvdXIgSEJBcyBtYW51YWwgdG8gY29ycmVjdCB0aGlzLlxuIik7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKyNlbmRpZgkJCQkvKiAjaWZuZGVmIENPTkZJR19QQ0kgKi8KK30KKworc3RhdGljIGludCBlYXRhX3Bpb19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpIQkFfcHRyOworCXN0cnVjdCBnZXRfY29uZiBnYzsKKwlpbnQgaTsKKworCWZpbmRfcGlvX1BDSSgmZ2MpOworCWZpbmRfcGlvX0VJU0EoJmdjKTsKKwlmaW5kX3Bpb19JU0EoJmdjKTsKKworCWZvciAoaSA9IDA7IGkgPD0gTUFYSVJROyBpKyspCisJCWlmIChyZWdfSVJRW2ldKQorCQkJcmVxdWVzdF9pcnEoaSwgZG9fZWF0YV9waW9faW50X2hhbmRsZXIsIFNBX0lOVEVSUlVQVCwgIkVBVEEtUElPIiwgTlVMTCk7CisKKwlIQkFfcHRyID0gZmlyc3RfSEJBOworCisJaWYgKHJlZ2lzdGVyZWRfSEJBcyAhPSAwKSB7CisJCXByaW50aygiRUFUQSAoRXh0ZW5kZWQgQXR0YWNobWVudCkgUElPIGRyaXZlciB2ZXJzaW9uOiAlZC4lZCVzXG4iCisJCSAgICAgICAiKGMpIDE5OTMtOTUgTWljaGFlbCBOZXVmZmVyLCBuZXVmZmVyQGdvb2Z5Lnpkdi51bmktbWFpbnouZGVcbiIgIiAgICAgICAgICAgIEFsZnJlZCBBcm5vbGQsICAgYS5hcm5vbGRAa2ZhLWp1ZWxpY2guZGVcbiIgIlRoaXMgcmVsZWFzZSBvbmx5IHN1cHBvcnRzIERBU0QgZGV2aWNlcyAoaGFyZGRpc2tzKVxuIiwgVkVSX01BSk9SLCBWRVJfTUlOT1IsIFZFUl9TVUIpOworCisJCXByaW50aygiUmVnaXN0ZXJlZCBIQkFzOlxuIik7CisJCXByaW50aygiSEJBIG5vLiBCb2FyZHR5cGU6IFJldmlzOiBFQVRBOiBCdXM6IEJhc2VJTzogSVJROiBDaDogSUQ6IFByOiIgIiBRUzogU0c6IENQTDpcbiIpOworCQlmb3IgKGkgPSAxOyBpIDw9IHJlZ2lzdGVyZWRfSEJBczsgaSsrKSB7CisJCQlwcmludGsoInNjc2klLTJkOiAlLjEwcyB2JXMgMi4wJWMgICVzICUjLjR4ICAgJTJkICAgJWQgICAlZCAgICVjIgorCQkJICAgICAgICIgICUyZCAgJTJkICAlMmRcbiIsCisJCQkgICAgICAgSEJBX3B0ci0+aG9zdF9ubywgU0QoSEJBX3B0ciktPm5hbWUsIFNEKEhCQV9wdHIpLT5yZXZpc2lvbiwKKwkJCSAgICAgICBTRChIQkFfcHRyKS0+RUFUQV9yZXZpc2lvbiwgKFNEKEhCQV9wdHIpLT5idXN0eXBlID09ICdQJykgPworCQkJICAgICAgICJQQ0kgIiA6IChTRChIQkFfcHRyKS0+YnVzdHlwZSA9PSAnRScpID8gIkVJU0EiIDogIklTQSAiLAorCQkJICAgICAgICh1aW50KSBIQkFfcHRyLT5iYXNlLCBIQkFfcHRyLT5pcnEsIFNEKEhCQV9wdHIpLT5jaGFubmVsLCBIQkFfcHRyLT50aGlzX2lkLAorCQkJICAgICAgIFNEKEhCQV9wdHIpLT5wcmltYXJ5ID8gJ1knIDogJ04nLCBIQkFfcHRyLT5jYW5fcXVldWUsCisJCQkgICAgICAgSEJBX3B0ci0+c2dfdGFibGVzaXplLCBIQkFfcHRyLT5jbWRfcGVyX2x1bik7CisJCQlIQkFfcHRyID0gU0QoSEJBX3B0ciktPm5leHQ7CisJCX0KKwl9CisJcmV0dXJuIChyZWdpc3RlcmVkX0hCQXMpOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiZWF0YV9waW8iLAorCS5uYW1lICAgICAgICAgICAgICAJPSAiRUFUQSAoRXh0ZW5kZWQgQXR0YWNobWVudCkgUElPIGRyaXZlciIsCisJLnByb2NfaW5mbyAgICAgICAgIAk9IGVhdGFfcGlvX3Byb2NfaW5mbywKKwkuZGV0ZWN0ICAgICAgICAgICAgCT0gZWF0YV9waW9fZGV0ZWN0LAorCS5yZWxlYXNlICAgICAgICAgICAJPSBlYXRhX3Bpb19yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQgICAgICAJPSBlYXRhX3Bpb19xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlciAgCT0gZWF0YV9waW9fYWJvcnQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGVhdGFfcGlvX2hvc3RfcmVzZXQsCisJLnVzZV9jbHVzdGVyaW5nICAgIAk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBOZXVmZmVyLCBBbGZyZWQgQXJub2xkIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVBVEEgU0NTSSBQSU8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmggYi9kcml2ZXJzL3Njc2kvZWF0YV9waW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVlYjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmgKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEhlYWRlciBmaWxlIGZvciBlYXRhX3Bpby5jIExpbnV4IEVBVEEtUElPIFNDU0kgZHJpdmVyICoKKyogKGMpIDE5OTMtOTYgTWljaGFlbCBOZXVmZmVyICAJICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGxhc3QgY2hhbmdlOiAyMDAyLzExLzAyCQkJCSoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX0VBVEFfUElPX0gKKyNkZWZpbmUgX0VBVEFfUElPX0gKKworI2RlZmluZSBWRVJfTUFKT1IgMAorI2RlZmluZSBWRVJfTUlOT1IgMAorI2RlZmluZSBWRVJfU1VCCSAgIjFiIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIZXJlIHlvdSBjYW4gc3dpdGNoIHBhcnRzIG9mIHRoZSBjb2RlIG9uIGFuZCBvZgkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVkVSQk9TRV9TRVRVUAkJLyogc2hvdyBzdGFydHVwIHNjcmVlbiBvZiAyMDAxICovCisjZGVmaW5lIEFMTE9XX0RNQV9CT0FSRFMgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWJ1ZyBvcHRpb25zLgkJCQkJCQkqIAorICogRW5hYmxlIERFQlVHIGFuZCB3aGljaGV2ZXIgb3B0aW9ucyB5b3UgcmVxdWlyZS4JCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBERUJVR19FQVRBCTEJLyogRW5hYmxlIGRlYnVnIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEUFRfREVCVUcJMAkvKiBCb2JzIHNwZWNpYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19ERUxBWQkwCS8qIEJ1aWxkIGluIGRlbGF5cyBzbyBkZWJ1ZyBtZXNzYWdlcyBjYW4gYmUKKwkJCQkgKiBiZSByZWFkIGJlZm9yZSB0aGV5IHZhbmlzaCBvZiB0aGUgdG9wIG9mCisJCQkJICogdGhlIHNjcmVlbiEKKwkJCQkgKi8KKyNkZWZpbmUgREJHX1BST0JFCTAJLyogRGVidWcgcHJvYmUgcm91dGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQkdfSVNBCQkwCS8qIFRyYWNlIElTQSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREJHX0VJU0EJMAkvKiBUcmFjZSBFSVNBIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19QQ0kJCTAJLyogVHJhY2UgUENJIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQkdfUElPCQkwCS8qIFRyYWNlIGdldF9jb25maWdfUElPICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREJHX0NPTQkJMAkvKiBUcmFjZSBjb21tYW5kIGNhbGwgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19RVUVVRQkwCS8qIFRyYWNlIGNvbW1hbmQgcXVldWVpbmcuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREJHX0lOVFIJMAkvKiBUcmFjZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAgICAgICAgICovCisjZGVmaW5lIERCR19JTlRSMgkwCS8qIFRyYWNlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICAgICAgICAgKi8KKyNkZWZpbmUgREJHX1BST0MJMAkvKiBEZWJ1ZyBwcm9jLWZzIHJlbGF0ZWQgc3RhdGlzdGljcyAgICAgICAgICovCisjZGVmaW5lIERCR19QUk9DX1dSSVRFCTAKKyNkZWZpbmUgREJHX1JFR0lTVEVSCTAJLyogKi8KKyNkZWZpbmUgREJHX0FCTk9STQkxCS8qIERlYnVnIGFibm9ybWFsIGFjdGlvbnMgKHJlc2V0LCBhYm9ydCkgICAgKi8KKworI2lmIERFQlVHX0VBVEEKKyNkZWZpbmUgREJHKHgsIHkpICAgaWYgKCh4KSkge3k7fQorI2Vsc2UKKyNkZWZpbmUgREJHKHgsIHkpCisjZW5kaWYKKworI2VuZGlmCQkJCS8qIF9FQVRBX1BJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNwLmMgYi9kcml2ZXJzL3Njc2kvZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhYjczYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9lc3AuYwpAQCAtMCwwICsxLDQ0MDIgQEAKKy8qICRJZDogZXNwLmMsdiAxLjEwMSAyMDAyLzAxLzE1IDA2OjQ4OjU1IGRhdmVtIEV4cCAkCisgKiBlc3AuYzogIEVuaGFuY2VkU2NzaVByb2Nlc3NvciBTdW4gU0NTSSBkcml2ZXIgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICovCisKKy8qIFRPRE86CisgKgorICogMSkgTWF5YmUgZGlzYWJsZSBwYXJpdHkgY2hlY2tpbmcgaW4gY29uZmlnIHJlZ2lzdGVyIG9uZSBmb3IgU0NTSTEKKyAqICAgIHRhcmdldHMuICAoR2lsbW9yZSBzYXlzIHBhcml0eSBlcnJvciBvbiB0aGUgU0J1cyBjYW4gbG9jayB1cAorICogICAgb2xkIHN1bjRjJ3MpCisgKiAyKSBBZGQgc3VwcG9ydCBmb3IgRE1BMiBwaXBlbGluaW5nLgorICogMykgQWRkIHRhZ2dlZCBxdWV1ZWluZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiZXNwLmgiCisKKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2lmbmRlZiBfX3NwYXJjX3Y5X18KKyNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorCisjZGVmaW5lIERFQlVHX0VTUAorLyogI2RlZmluZSBERUJVR19FU1BfSE1FICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9EQVRBICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9RVUVVRSAqLworLyogI2RlZmluZSBERUJVR19FU1BfRElTQ09OTkVDVCAqLworLyogI2RlZmluZSBERUJVR19FU1BfU1RBVFVTICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9QSEFTRVMgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX1dPUktCVVMgKi8KKy8qICNkZWZpbmUgREVCVUdfU1RBVEVfTUFDSElORSAqLworLyogI2RlZmluZSBERUJVR19FU1BfQ01EUyAqLworLyogI2RlZmluZSBERUJVR19FU1BfSVJRUyAqLworLyogI2RlZmluZSBERUJVR19TRFRSICovCisvKiAjZGVmaW5lIERFQlVHX0VTUF9TRyAqLworCisvKiBVc2UgdGhlIGZvbGxvd2luZyB0byBzcHJpbmtsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgaW4gYSB3YXkgd2hpY2gKKyAqIHN1aXRzIHlvdSBpZiBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGJlY29tZSB0b28gdmVyYm9zZSB3aGVuCisgKiB0cnlpbmcgdG8gdHJhY2sgZG93biBhIHNwZWNpZmljIHByb2JsZW0uCisgKi8KKy8qICNkZWZpbmUgREVCVUdfRVNQX01JU0MgKi8KKworI2lmIGRlZmluZWQoREVCVUdfRVNQKQorI2RlZmluZSBFU1BMT0coZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQTE9HKGZvbykKKyNlbmRpZiAvKiAoREVCVUdfRVNQKSAqLworCisjaWYgZGVmaW5lZChERUJVR19FU1BfSE1FKQorI2RlZmluZSBFU1BITUUoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQSE1FKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfREFUQSkKKyNkZWZpbmUgRVNQREFUQShmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BEQVRBKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfUVVFVUUpCisjZGVmaW5lIEVTUFFVRVVFKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUFFVRVVFKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfRElTQ09OTkVDVCkKKyNkZWZpbmUgRVNQRElTQyhmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BESVNDKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfU1RBVFVTKQorI2RlZmluZSBFU1BTVEFUKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUFNUQVQoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX0VTUF9QSEFTRVMpCisjZGVmaW5lIEVTUFBIQVNFKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUFBIQVNFKGZvbykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVR19FU1BfV09SS0JVUykKKyNkZWZpbmUgRVNQQlVTKGZvbykgIHByaW50ayBmb28KKyNlbHNlCisjZGVmaW5lIEVTUEJVUyhmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX0lSUVMpCisjZGVmaW5lIEVTUElSUShmb28pICBwcmludGsgZm9vCisjZWxzZQorI2RlZmluZSBFU1BJUlEoZm9vKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHX1NEVFIpCisjZGVmaW5lIEVTUFNEVFIoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQU0RUUihmb28pCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRVNQX01JU0MpCisjZGVmaW5lIEVTUE1JU0MoZm9vKSAgcHJpbnRrIGZvbworI2Vsc2UKKyNkZWZpbmUgRVNQTUlTQyhmb28pCisjZW5kaWYKKworLyogQ29tbWFuZCBwaGFzZSBlbnVtZXJhdGlvbi4gKi8KK2VudW0geworCW5vdF9pc3N1ZWQgICAgPSAweDAwLCAgLyogU3RpbGwgaW4gdGhlIGlzc3VlX1NDIHF1ZXVlLiAgICAgICAgICAqLworCisJLyogVmFyaW91cyBmb3JtcyBvZiBzZWxlY3RpbmcgYSB0YXJnZXQuICovCisjZGVmaW5lIGluX3NsY3RfbWFzayAgICAweDEwCisJaW5fc2xjdF9ub3JtICA9IDB4MTAsICAvKiBFU1AgaXMgYXJiaXRyYXRpbmcsIG5vcm1hbCBzZWxlY3Rpb24gICovCisJaW5fc2xjdF9zdG9wICA9IDB4MTEsICAvKiBFU1Agd2lsbCBzZWxlY3QsIHRoZW4gc3RvcCB3aXRoIElSUSAgICovCisJaW5fc2xjdF9tc2cgICA9IDB4MTIsICAvKiBzZWxlY3QsIHRoZW4gc2VuZCBhIG1lc3NhZ2UgICAgICAgICAgICovCisJaW5fc2xjdF90YWcgICA9IDB4MTMsICAvKiBzZWxlY3QgYW5kIHNlbmQgdGFnZ2VkIHF1ZXVlIG1zZyAgICAgICovCisJaW5fc2xjdF9zbmVnICA9IDB4MTQsICAvKiBzZWxlY3QgYW5kIGFjcXVpcmUgc3luYyBjYXBhYmlsaXRpZXMgICovCisKKwkvKiBBbnkgcG9zdCBzZWxlY3Rpb24gYWN0aXZpdHkuICovCisjZGVmaW5lIGluX3BoYXNlc19tYXNrICAweDIwCisJaW5fZGF0YWluICAgICA9IDB4MjAsICAvKiBEYXRhIGlzIHRyYW5zZmVycmluZyBmcm9tIHRoZSBidXMgICAgICovCisJaW5fZGF0YW91dCAgICA9IDB4MjEsICAvKiBEYXRhIGlzIHRyYW5zZmVycmluZyB0byB0aGUgYnVzICAgICAgICovCisJaW5fZGF0YV9kb25lICA9IDB4MjIsICAvKiBMYXN0IERNQSBkYXRhIG9wZXJhdGlvbiBkb25lIChtYXliZSkgICovCisJaW5fbXNnaW4gICAgICA9IDB4MjMsICAvKiBFYXRpbmcgbWVzc2FnZSBmcm9tIHRhcmdldCAgICAgICAgICAgICovCisJaW5fbXNnaW5jb250ICA9IDB4MjQsICAvKiBFYXRpbmcgbW9yZSBtc2cgYnl0ZXMgZnJvbSB0YXJnZXQgICAgICovCisJaW5fbXNnaW5kb25lICA9IDB4MjUsICAvKiBEZWNpZGUgd2hhdCB0byBkbyB3aXRoIHdoYXQgd2UgZ290ICAgICovCisJaW5fbXNnb3V0ICAgICA9IDB4MjYsICAvKiBTZW5kaW5nIG1lc3NhZ2UgdG8gdGFyZ2V0ICAgICAgICAgICAgICovCisJaW5fbXNnb3V0ZG9uZSA9IDB4MjcsICAvKiBEb25lIHNlbmRpbmcgbXNnIG91dCAgICAgICAgICAgICAgICAgICovCisJaW5fY21kYmVnaW4gICA9IDB4MjgsICAvKiBTZW5kaW5nIGNtZCBhZnRlciBhYm5vcm1hbCBzZWxlY3Rpb24gICovCisJaW5fY21kZW5kICAgICA9IDB4MjksICAvKiBEb25lIHNlbmRpbmcgc2xvdyBjbWQgICAgICAgICAgICAgICAgICovCisJaW5fc3RhdHVzICAgICA9IDB4MmEsICAvKiBXYXMgaW4gc3RhdHVzIHBoYXNlLCBmaW5pc2hpbmcgY21kICAgICovCisJaW5fZnJlZWluZyAgICA9IDB4MmIsICAvKiBmcmVlaW5nIHRoZSBidXMgZm9yIGNtZCBjbXBsdCBvciBkaXNjICovCisJaW5fdGhlX2RhcmsgICA9IDB4MmMsICAvKiBEb24ndCBrbm93IHdoYXQgYnVzIHBoYXNlIHdlIGFyZSBpbiAgICovCisKKwkvKiBTcGVjaWFsIHN0YXRlcywgaWUuIG5vdCBub3JtYWwgYnVzIHRyYW5zaXRpb25zLi4uICovCisjZGVmaW5lIGluX3NwZWNfbWFzayAgICAweDgwCisJaW5fYWJvcnRvbmUgICA9IDB4ODAsICAvKiBBYm9ydGluZyBvbmUgY29tbWFuZCBjdXJyZW50bHkgICAgICAgICovCisJaW5fYWJvcnRhbGwgICA9IDB4ODEsICAvKiBCbG93aW5nIGF3YXkgYWxsIGNvbW1hbmRzIHdlIGhhdmUgICAgICovCisJaW5fcmVzZXRkZXYgICA9IDB4ODIsICAvKiBTQ1NJIHRhcmdldCByZXNldCBpbiBwcm9ncmVzcyAgICAgICAgICovCisJaW5fcmVzZXRidXMgICA9IDB4ODMsICAvKiBTQ1NJIGJ1cyByZXNldCBpbiBwcm9ncmVzcyAgICAgICAgICAgICovCisJaW5fdGd0ZXJyb3IgICA9IDB4ODQsICAvKiBUYXJnZXQgZGlkIHNvbWV0aGluZyBzdHVwaWQgICAgICAgICAgICovCit9OworCitlbnVtIHsKKwkvKiBaZXJvIGhhcyBzcGVjaWFsIG1lYW5pbmcsIHNlZSBza2lwYWhlYWRbMTJdLiAqLworLyowKi8JZG9fbmV2ZXIsCisKKy8qMSovCWRvX3BoYXNlX2RldGVybWluZSwKKy8qMiovCWRvX3Jlc2V0X2J1cywKKy8qMyovCWRvX3Jlc2V0X2NvbXBsZXRlLAorLyo0Ki8JZG9fd29ya19idXMsCisvKjUqLwlkb19pbnRyX2VuZAorfTsKKworLyogVGhlIG1hc3RlciByaW5nIG9mIGFsbCBlc3AgaG9zdHMgd2UgYXJlIG1hbmFnaW5nIGluIHRoaXMgZHJpdmVyLiAqLworc3RhdGljIHN0cnVjdCBlc3AgKmVzcGNoYWluOworc3RhdGljIERFRklORV9TUElOTE9DSyhlc3BjaGFpbl9sb2NrKTsKK3N0YXRpYyBpbnQgZXNwc19ydW5uaW5nID0gMDsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZXNwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpOworCisvKiBEZWJ1Z2dpbmcgcm91dGluZXMgKi8KK3N0cnVjdCBlc3BfY21kc3RyaW5ncyB7CisJdTggY21kY2hhcjsKKwljaGFyICp0ZXh0OworfSBlc3BfY21kX3N0cmluZ3NbXSA9IHsKKwkvKiBNaXNjZWxsYW5lb3VzICovCisJeyBFU1BfQ01EX05VTEwsICJFU1BfTk9QIiwgfSwKKwl7IEVTUF9DTURfRkxVU0gsICJGSUZPX0ZMVVNIIiwgfSwKKwl7IEVTUF9DTURfUkMsICJSU1RFU1AiLCB9LAorCXsgRVNQX0NNRF9SUywgIlJTVFNDU0kiLCB9LAorCS8qIERpc2Nvbm5lY3RlZCBTdGF0ZSBHcm91cCAqLworCXsgRVNQX0NNRF9SU0VMLCAiUkVTTENUU0VRIiwgfSwKKwl7IEVTUF9DTURfU0VMLCAiU0xDVE5BVE4iLCB9LAorCXsgRVNQX0NNRF9TRUxBLCAiU0xDVEFUTiIsIH0sCisJeyBFU1BfQ01EX1NFTEFTLCAiU0xDVEFUTlNUT1AiLCB9LAorCXsgRVNQX0NNRF9FU0VMLCAiRU5TTENUUkVTRUwiLCB9LAorCXsgRVNQX0NNRF9EU0VMLCAiRElTU0VMUkVTRUwiLCB9LAorCXsgRVNQX0NNRF9TQTMsICJTTENUQVROMyIsIH0sCisJeyBFU1BfQ01EX1JTRUwzLCAiUkVTTENUU0VRIiwgfSwKKwkvKiBUYXJnZXQgU3RhdGUgR3JvdXAgKi8KKwl7IEVTUF9DTURfU01TRywgIlNORE1TRyIsIH0sCisJeyBFU1BfQ01EX1NTVEFULCAiU05EU1RBVFVTIiwgfSwKKwl7IEVTUF9DTURfU0RBVEEsICJTTkREQVRBIiwgfSwKKwl7IEVTUF9DTURfRFNFUSwgIkRJU0NTRVEiLCB9LAorCXsgRVNQX0NNRF9UU0VRLCAiVEVSTVNFUSIsIH0sCisJeyBFU1BfQ01EX1RDQ1NFUSwgIlRSR1RDTURDT01QU0VRIiwgfSwKKwl7IEVTUF9DTURfRENOQ1QsICJESVNDIiwgfSwKKwl7IEVTUF9DTURfUk1TRywgIlJDVk1TRyIsIH0sCisJeyBFU1BfQ01EX1JDTUQsICJSQ1ZDTUQiLCB9LAorCXsgRVNQX0NNRF9SREFUQSwgIlJDVkRBVEEiLCB9LAorCXsgRVNQX0NNRF9SQ1NFUSwgIlJDVkNNRFNFUSIsIH0sCisJLyogSW5pdGlhdG9yIFN0YXRlIEdyb3VwICovCisJeyBFU1BfQ01EX1RJLCAiVFJBTlNJTkZPIiwgfSwKKwl7IEVTUF9DTURfSUNDU0VRLCAiSU5JQ01EU0VRQ09NUCIsIH0sCisJeyBFU1BfQ01EX01PSywgIk1TR0FDQ0VQVEVEIiwgfSwKKwl7IEVTUF9DTURfVFBBRCwgIlRQQUQiLCB9LAorCXsgRVNQX0NNRF9TQVROLCAiU0FUTiIsIH0sCisJeyBFU1BfQ01EX1JBVE4sICJSQVROIiwgfSwKK307CisjZGVmaW5lIE5VTV9FU1BfQ09NTUFORFMgICgoc2l6ZW9mKGVzcF9jbWRfc3RyaW5ncykpIC8gKHNpemVvZihzdHJ1Y3QgZXNwX2NtZHN0cmluZ3MpKSkKKworLyogUHJpbnQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhbiBFU1AgY29tbWFuZCAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9jbWQodTggZXNwY21kKQoreworCXU4IGRtYV9iaXQgPSBlc3BjbWQgJiBFU1BfQ01EX0RNQTsKKwlpbnQgaTsKKworCWVzcGNtZCAmPSB+ZG1hX2JpdDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VTUF9DT01NQU5EUzsgaSsrKQorCQlpZiAoZXNwX2NtZF9zdHJpbmdzW2ldLmNtZGNoYXIgPT0gZXNwY21kKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gTlVNX0VTUF9DT01NQU5EUykKKwkJcHJpbnRrKCJFU1BfVW5rbm93biIpOworCWVsc2UKKwkJcHJpbnRrKCIlcyVzIiwgZXNwX2NtZF9zdHJpbmdzW2ldLnRleHQsCisJCSAgICAgICAoKGRtYV9iaXQpID8gIitETUEiIDogIiIpKTsKK30KKworLyogUHJpbnQgdGhlIHN0YXR1cyByZWdpc3RlcidzIHZhbHVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X3N0YXRyZWcodTggc3RhdHJlZykKK3sKKwl1OCBwaGFzZTsKKworCXByaW50aygiU1RBVFVTPCIpOworCXBoYXNlID0gc3RhdHJlZyAmIEVTUF9TVEFUX1BNQVNLOworCXByaW50aygiJXMsIiwgKHBoYXNlID09IEVTUF9ET1AgPyAiREFUQS1PVVQiIDoKKwkJICAgICAgIChwaGFzZSA9PSBFU1BfRElQID8gIkRBVEEtSU4iIDoKKwkJCShwaGFzZSA9PSBFU1BfQ01EUCA/ICJDT01NQU5EIiA6CisJCQkgKHBoYXNlID09IEVTUF9TVEFUUCA/ICJTVEFUVVMiIDoKKwkJCSAgKHBoYXNlID09IEVTUF9NT1AgPyAiTVNHLU9VVCIgOgorCQkJICAgKHBoYXNlID09IEVTUF9NSVAgPyAiTVNHX0lOIiA6CisJCQkgICAgInVua25vd24iKSkpKSkpKTsKKwlpZiAoc3RhdHJlZyAmIEVTUF9TVEFUX1RET05FKQorCQlwcmludGsoIlRSQU5TX0RPTkUsIik7CisJaWYgKHN0YXRyZWcgJiBFU1BfU1RBVF9UQ05UKQorCQlwcmludGsoIlRDT1VOVF9aRVJPLCIpOworCWlmIChzdGF0cmVnICYgRVNQX1NUQVRfUEVSUikKKwkJcHJpbnRrKCJQX0VSUk9SLCIpOworCWlmIChzdGF0cmVnICYgRVNQX1NUQVRfU1BBTSkKKwkJcHJpbnRrKCJTUEFNLCIpOworCWlmIChzdGF0cmVnICYgRVNQX1NUQVRfSU5UUikKKwkJcHJpbnRrKCJJUlEsIik7CisJcHJpbnRrKCI+Iik7Cit9CisKKy8qIFByaW50IHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIncyB2YWx1ZSAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9pcmVnKHU4IGludHJlZykKK3sKKwlwcmludGsoIklOVFJFRzwgIik7CisJaWYgKGludHJlZyAmIEVTUF9JTlRSX1MpCisJCXByaW50aygiU0xDVF9OQVROICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9TQVROKQorCQlwcmludGsoIlNMQ1RfQVROICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9SU0VMKQorCQlwcmludGsoIlJTTENUICIpOworCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9GRE9ORSkKKwkJcHJpbnRrKCJGRE9ORSAiKTsKKwlpZiAoaW50cmVnICYgRVNQX0lOVFJfQlNFUlYpCisJCXByaW50aygiQlNFUlYgIik7CisJaWYgKGludHJlZyAmIEVTUF9JTlRSX0RDKQorCQlwcmludGsoIkRJU0NOQ1QgIik7CisJaWYgKGludHJlZyAmIEVTUF9JTlRSX0lDKQorCQlwcmludGsoIklMTF9DTUQgIik7CisJaWYgKGludHJlZyAmIEVTUF9JTlRSX1NSKQorCQlwcmludGsoIlNDU0lfQlVTX1JFU0VUICIpOworCXByaW50aygiPiIpOworfQorCisvKiBQcmludCB0aGUgc2VxdWVuY2Ugc3RlcCByZWdpc3RlcnMgY29udGVudHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfc2VxcmVnKHU4IHN0ZXByZWcpCit7CisJc3RlcHJlZyAmPSBFU1BfU1RFUF9WQklUUzsKKwlwcmludGsoIlNURVA8JXM+IiwKKwkgICAgICAgKHN0ZXByZWcgPT0gRVNQX1NURVBfQVNFTCA/ICJTTENUX0FSQl9DTVBMVCIgOgorCQkoc3RlcHJlZyA9PSBFU1BfU1RFUF9TSUQgPyAiMUJZVEVfTVNHX1NFTlQiIDoKKwkJIChzdGVwcmVnID09IEVTUF9TVEVQX05DTUQgPyAiTk9UX0lOX0NNRF9QSEFTRSIgOgorCQkgIChzdGVwcmVnID09IEVTUF9TVEVQX1BQQyA/ICJDTURfQllURVNfTE9TVCIgOgorCQkgICAoc3RlcHJlZyA9PSBFU1BfU1RFUF9GSU5JNCA/ICJDTURfU0VOVF9PSyIgOgorCQkgICAgIlVOS05PV04iKSkpKSkpOworfQorCitzdGF0aWMgY2hhciAqcGhhc2Vfc3RyaW5nKGludCBwaGFzZSkKK3sKKwlzd2l0Y2ggKHBoYXNlKSB7CisJY2FzZSBub3RfaXNzdWVkOgorCQlyZXR1cm4gIlVOSVNTVUVEIjsKKwljYXNlIGluX3NsY3Rfbm9ybToKKwkJcmV0dXJuICJTTENUTk9STSI7CisJY2FzZSBpbl9zbGN0X3N0b3A6CisJCXJldHVybiAiU0xDVFNUT1AiOworCWNhc2UgaW5fc2xjdF9tc2c6CisJCXJldHVybiAiU0xDVE1TRyI7CisJY2FzZSBpbl9zbGN0X3RhZzoKKwkJcmV0dXJuICJTTENUVEFHIjsKKwljYXNlIGluX3NsY3Rfc25lZzoKKwkJcmV0dXJuICJTTENUU05FRyI7CisJY2FzZSBpbl9kYXRhaW46CisJCXJldHVybiAiREFUQUlOIjsKKwljYXNlIGluX2RhdGFvdXQ6CisJCXJldHVybiAiREFUQU9VVCI7CisJY2FzZSBpbl9kYXRhX2RvbmU6CisJCXJldHVybiAiREFUQURPTkUiOworCWNhc2UgaW5fbXNnaW46CisJCXJldHVybiAiTVNHSU4iOworCWNhc2UgaW5fbXNnaW5jb250OgorCQlyZXR1cm4gIk1TR0lOQ09OVCI7CisJY2FzZSBpbl9tc2dpbmRvbmU6CisJCXJldHVybiAiTVNHSU5ET05FIjsKKwljYXNlIGluX21zZ291dDoKKwkJcmV0dXJuICJNU0dPVVQiOworCWNhc2UgaW5fbXNnb3V0ZG9uZToKKwkJcmV0dXJuICJNU0dPVVRET05FIjsKKwljYXNlIGluX2NtZGJlZ2luOgorCQlyZXR1cm4gIkNNREJFR0lOIjsKKwljYXNlIGluX2NtZGVuZDoKKwkJcmV0dXJuICJDTURFTkQiOworCWNhc2UgaW5fc3RhdHVzOgorCQlyZXR1cm4gIlNUQVRVUyI7CisJY2FzZSBpbl9mcmVlaW5nOgorCQlyZXR1cm4gIkZSRUVJTkciOworCWNhc2UgaW5fdGhlX2Rhcms6CisJCXJldHVybiAiQ0xVRUxFU1MiOworCWNhc2UgaW5fYWJvcnRvbmU6CisJCXJldHVybiAiQUJPUlRPTkUiOworCWNhc2UgaW5fYWJvcnRhbGw6CisJCXJldHVybiAiQUJPUlRBTEwiOworCWNhc2UgaW5fcmVzZXRkZXY6CisJCXJldHVybiAiUkVTRVRERVYiOworCWNhc2UgaW5fcmVzZXRidXM6CisJCXJldHVybiAiUkVTRVRCVVMiOworCWNhc2UgaW5fdGd0ZXJyb3I6CisJCXJldHVybiAiVEdURVJST1IiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJfTsKK30KKworI2lmZGVmIERFQlVHX1NUQVRFX01BQ0hJTkUKK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfYWR2YW5jZV9waGFzZShzdHJ1Y3Qgc2NzaV9jbW5kICpzLCBpbnQgbmV3cGhhc2UpCit7CisJRVNQTE9HKCgiPCVzPiIsIHBoYXNlX3N0cmluZyhuZXdwaGFzZSkpKTsKKwlzLT5TQ3Auc2VudF9jb21tYW5kID0gcy0+U0NwLnBoYXNlOworCXMtPlNDcC5waGFzZSA9IG5ld3BoYXNlOworfQorI2Vsc2UKKyNkZWZpbmUgZXNwX2FkdmFuY2VfcGhhc2UoX19zLCBfX25ld3BoYXNlKSBcCisJKF9fcyktPlNDcC5zZW50X2NvbW1hbmQgPSAoX19zKS0+U0NwLnBoYXNlOyBcCisJKF9fcyktPlNDcC5waGFzZSA9IChfX25ld3BoYXNlKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfRVNQX0NNRFMKK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY21kKHN0cnVjdCBlc3AgKmVzcCwgdTggY21kKQoreworCWVzcC0+ZXNwY21kbG9nW2VzcC0+ZXNwY21kZW50XSA9IGNtZDsKKwllc3AtPmVzcGNtZGVudCA9IChlc3AtPmVzcGNtZGVudCArIDEpICYgMzE7CisJc2J1c193cml0ZWIoY21kLCBlc3AtPmVyZWdzICsgRVNQX0NNRCk7Cit9CisjZWxzZQorI2RlZmluZSBlc3BfY21kKF9fZXNwLCBfX2NtZCkJXAorCXNidXNfd3JpdGViKChfX2NtZCksICgoX19lc3ApLT5lcmVncykgKyBFU1BfQ01EKQorI2VuZGlmCisKKyNkZWZpbmUgRVNQX0lOVFNPRkYoX19kcmVncykJXAorCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoKF9fZHJlZ3MpK0RNQV9DU1IpJn4oRE1BX0lOVF9FTkFCKSwgKF9fZHJlZ3MpK0RNQV9DU1IpCisjZGVmaW5lIEVTUF9JTlRTT04oX19kcmVncykJXAorCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoKF9fZHJlZ3MpK0RNQV9DU1IpfERNQV9JTlRfRU5BQiwgKF9fZHJlZ3MpK0RNQV9DU1IpCisjZGVmaW5lIEVTUF9JUlFfUChfX2RyZWdzKQlcCisJKHNidXNfcmVhZGwoKF9fZHJlZ3MpK0RNQV9DU1IpICYgKERNQV9ITkRMX0lOVFJ8RE1BX0hORExfRVJST1IpKQorCisvKiBIb3cgd2UgdXNlIHRoZSB2YXJpb3VzIExpbnV4IFNDU0kgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvcGVyYXRpb24uCisgKgorICogc3RydWN0IHNjc2lfY21uZDoKKyAqCisgKiAgIFdlIGtlZXAgdHJhY2sgb2YgdGhlIHN5bmNocm9ub3VzIGNhcGFiaWxpdGllcyBvZiBhIHRhcmdldAorICogICBpbiB0aGUgZGV2aWNlIG1lbWJlciwgdXNpbmcgc3luY19taW5fcGVyaW9kIGFuZAorICogICBzeW5jX21heF9vZmZzZXQuICBUaGVzZSBhcmUgdGhlIHZhbHVlcyB3ZSBkaXJlY3RseSB3cml0ZQorICogICBpbnRvIHRoZSBFU1AgcmVnaXN0ZXJzIHdoaWxlIHJ1bm5pbmcgYSBjb21tYW5kLiAgSWYgb2Zmc2V0CisgKiAgIGlzIHplcm8gdGhlIEVTUCB3aWxsIHVzZSBhc3luY2hyb25vdXMgdHJhbnNmZXJzLgorICogICBJZiB0aGUgYm9ya2VuIGZsYWcgaXMgc2V0IHdlIGFzc3VtZSB3ZSBzaG91bGRuJ3QgZXZlbiBib3RoZXIKKyAqICAgdHJ5aW5nIHRvIG5lZ290aWF0ZSBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXIgYXMgdGhpcyB0YXJnZXQKKyAqICAgaXMgcmVhbGx5IHN0dXBpZC4gIElmIHdlIG5vdGljZSB0aGUgdGFyZ2V0IGlzIGRyb3BwaW5nIHRoZQorICogICBidXMsIGFuZCB3ZSBoYXZlIGJlZW4gYWxsb3dpbmcgaXQgdG8gZGlzY29ubmVjdCwgd2UgY2xlYXIKKyAqICAgdGhlIGRpc2Nvbm5lY3QgZmxhZy4KKyAqLworCisKKy8qIE1hbmlwdWxhdGlvbiBvZiB0aGUgRVNQIGNvbW1hbmQgcXVldWVzLiAgVGhhbmtzIHRvIHRoZSBhaGExNTJ4IGRyaXZlcgorICogYW5kIGl0cyBhdXRob3IsIEp1ZXJnZW4gRS4gRmlzY2hlciwgZm9yIHRoZSBtZXRob2RzIHVzZWQgaGVyZS4KKyAqIE5vdGUgdGhhdCB0aGVzZSBhcmUgcGVyLUVTUCBxdWV1ZXMsIG5vdCBnbG9iYWwgcXVldWVzIGxpa2UKKyAqIHRoZSBhaGExNTJ4IGRyaXZlciB1c2VzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX1NDKHN0cnVjdCBzY3NpX2NtbmQgKipTQywgc3RydWN0IHNjc2lfY21uZCAqbmV3X1NDKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmVuZDsKKworCW5ld19TQy0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIE5VTEw7CisJaWYgKCEqU0MpCisJCSpTQyA9IG5ld19TQzsKKwllbHNlIHsKKwkJZm9yIChlbmQ9KlNDO2VuZC0+aG9zdF9zY3JpYmJsZTtlbmQ9KHN0cnVjdCBzY3NpX2NtbmQgKillbmQtPmhvc3Rfc2NyaWJibGUpCisJCQk7CisJCWVuZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIG5ld19TQzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwZW5kX1NDKHN0cnVjdCBzY3NpX2NtbmQgKipTQywgc3RydWN0IHNjc2lfY21uZCAqbmV3X1NDKQoreworCW5ld19TQy0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopICpTQzsKKwkqU0MgPSBuZXdfU0M7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfY21uZCAqcmVtb3ZlX2ZpcnN0X1NDKHN0cnVjdCBzY3NpX2NtbmQgKipTQykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwdHI7CisJcHRyID0gKlNDOworCWlmIChwdHIpCisJCSpTQyA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopICgqU0MpLT5ob3N0X3NjcmliYmxlOworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfY21uZCAqcmVtb3ZlX1NDKHN0cnVjdCBzY3NpX2NtbmQgKipTQywgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwdHIsICpwcmV2OworCisJZm9yIChwdHIgPSAqU0MsIHByZXYgPSBOVUxMOworCSAgICAgcHRyICYmICgocHRyLT5kZXZpY2UtPmlkICE9IHRhcmdldCkgfHwgKHB0ci0+ZGV2aWNlLT5sdW4gIT0gbHVuKSk7CisJICAgICBwcmV2ID0gcHRyLCBwdHIgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBwdHItPmhvc3Rfc2NyaWJibGUpCisJCTsKKwlpZiAocHRyKSB7CisJCWlmIChwcmV2KQorCQkJcHJldi0+aG9zdF9zY3JpYmJsZT1wdHItPmhvc3Rfc2NyaWJibGU7CisJCWVsc2UKKwkJCSpTQz0oc3RydWN0IHNjc2lfY21uZCAqKXB0ci0+aG9zdF9zY3JpYmJsZTsKKwl9CisJcmV0dXJuIHB0cjsKK30KKworLyogUmVzZXR0aW5nIHZhcmlvdXMgcGllY2VzIG9mIHRoZSBFU1Agc2NzaSBkcml2ZXIgY2hpcHNldC9idXNlcy4gKi8KK3N0YXRpYyB2b2lkIGVzcF9yZXNldF9kbWEoc3RydWN0IGVzcCAqZXNwKQoreworCWludCBjYW5fZG9fYnVyc3QxNiwgY2FuX2RvX2J1cnN0MzIsIGNhbl9kb19idXJzdDY0OworCWludCBjYW5fZG9fc2J1czY0OworCXUzMiB0bXA7CisKKwljYW5fZG9fYnVyc3QxNiA9IChlc3AtPmJ1cnN0cyAmIERNQV9CVVJTVDE2KSAhPSAwOworCWNhbl9kb19idXJzdDMyID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUMzIpICE9IDA7CisJY2FuX2RvX2J1cnN0NjQgPSAwOworCWNhbl9kb19zYnVzNjQgPSAwOworCWlmIChzYnVzX2Nhbl9kbWFfNjRiaXQoZXNwLT5zZGV2KSkKKwkJY2FuX2RvX3NidXM2NCA9IDE7CisJaWYgKHNidXNfY2FuX2J1cnN0NjQoZXNwLT5zZGV2KSkKKwkJY2FuX2RvX2J1cnN0NjQgPSAoZXNwLT5idXJzdHMgJiBETUFfQlVSU1Q2NCkgIT0gMDsKKworCS8qIFB1bnQgdGhlIERWTUEgaW50byBhIGtub3duIHN0YXRlLiAqLworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gIT0gZHZtYWhtZSkgeworCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJc2J1c193cml0ZWwodG1wIHwgRE1BX1JTVF9TQ1NJLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCXNidXNfd3JpdGVsKHRtcCAmIH5ETUFfUlNUX1NDU0ksIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9CisJc3dpdGNoIChlc3AtPmRtYS0+cmV2aXNpb24pIHsKKwljYXNlIGR2bWFobWU6CisJCS8qIFRoaXMgaXMgdGhlIEhNRSBEVk1BIGdhdGUgYXJyYXkuICovCisKKwkJc2J1c193cml0ZWwoRE1BX1JFU0VUX0ZBUzM2NiwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlzYnVzX3dyaXRlbChETUFfUlNUX1NDU0ksIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQllc3AtPnByZXZfaG1lX2RtYWNzciA9IChETUFfUEFSSVRZX09GRnxETUFfMkNMS1N8RE1BX1NDU0lfRElTQUJ8RE1BX0lOVF9FTkFCKTsKKwkJZXNwLT5wcmV2X2htZV9kbWFjc3IgJj0gfihETUFfRU5BQkxFfERNQV9TVF9XUklURXxETUFfQlJTVF9TWik7CisKKwkJaWYgKGNhbl9kb19idXJzdDY0KQorCQkJZXNwLT5wcmV2X2htZV9kbWFjc3IgfD0gRE1BX0JSU1Q2NDsKKwkJZWxzZSBpZiAoY2FuX2RvX2J1cnN0MzIpCisJCQllc3AtPnByZXZfaG1lX2RtYWNzciB8PSBETUFfQlJTVDMyOworCisJCWlmIChjYW5fZG9fc2J1czY0KSB7CisJCQllc3AtPnByZXZfaG1lX2RtYWNzciB8PSBETUFfU0NTSV9TQlVTNjQ7CisJCQlzYnVzX3NldF9zYnVzNjQoZXNwLT5zZGV2LCBlc3AtPmJ1cnN0cyk7CisJCX0KKworCQkvKiBUaGlzIGNoaXAgaXMgaG9ycmlibGUuICovCisJCXdoaWxlIChzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9QRU5EX1JFQUQpCisJCQl1ZGVsYXkoMSk7CisKKwkJc2J1c193cml0ZWwoMCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlzYnVzX3dyaXRlbChlc3AtPnByZXZfaG1lX2RtYWNzciwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCisJCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGhhdmluZyB0aGUgU0NTSSBjaGFubmVsCisJCSAqIGVuZ2luZSBsb2NrIHVwIG9uIHVzLgorCQkgKi8KKwkJc2J1c193cml0ZWwoMCwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKKworCQlicmVhazsKKwljYXNlIGR2bWFyZXYyOgorCQkvKiBUaGlzIGlzIHRoZSBnYXRlIGFycmF5IGZvdW5kIGluIHRoZSBzdW40bQorCQkgKiBOQ1IgU0JVUyBJL08gc3Vic3lzdGVtLgorCQkgKi8KKwkJaWYgKGVzcC0+ZXJldiAhPSBlc3AxMDApIHsKKwkJCXRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCQkJc2J1c193cml0ZWwodG1wIHwgRE1BXzNDTEtTLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkdm1hcmV2MzoKKwkJdG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCXRtcCAmPSB+RE1BXzNDTEtTOworCQl0bXAgfD0gRE1BXzJDTEtTOworCQlpZiAoY2FuX2RvX2J1cnN0MzIpIHsKKwkJCXRtcCAmPSB+RE1BX0JSU1RfU1o7CisJCQl0bXAgfD0gRE1BX0JSU1QzMjsKKwkJfQorCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJYnJlYWs7CisJY2FzZSBkdm1hZXNjMToKKwkJLyogVGhpcyBpcyB0aGUgRE1BIHVuaXQgZm91bmQgb24gU0NTSS9FdGhlciBjYXJkcy4gKi8KKwkJdG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCXRtcCB8PSBETUFfQUREX0VOQUJMRTsKKwkJdG1wICY9IH5ETUFfQkNOVF9FTkFCOworCQlpZiAoIWNhbl9kb19idXJzdDMyICYmIGNhbl9kb19idXJzdDE2KSB7CisJCQl0bXAgfD0gRE1BX0VTQ19CVVJTVDsKKwkJfSBlbHNlIHsKKwkJCXRtcCAmPSB+KERNQV9FU0NfQlVSU1QpOworCQl9CisJCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7Cit9CisKKy8qIFJlc2V0IHRoZSBFU1AgY2hpcCwgX25vdF8gdGhlIFNDU0kgYnVzLiAqLworc3RhdGljIHZvaWQgX19pbml0IGVzcF9yZXNldF9lc3Aoc3RydWN0IGVzcCAqZXNwKQoreworCXU4IGZhbWlseV9jb2RlLCB2ZXJzaW9uOworCWludCBpOworCisJLyogTm93IHJlc2V0IHRoZSBFU1AgY2hpcCAqLworCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1JDKTsKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMIHwgRVNQX0NNRF9ETUEpOworCWVzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwgfCBFU1BfQ01EX0RNQSk7CisKKwkvKiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJc2J1c193cml0ZWIoZXNwLT5jZmFjdCwgZXNwLT5lcmVncyArIEVTUF9DRkFDVCk7CisJZXNwLT5wcmV2X3N0cCA9IDA7CisJc2J1c193cml0ZWIoZXNwLT5wcmV2X3N0cCwgZXNwLT5lcmVncyArIEVTUF9TVFApOworCWVzcC0+cHJldl9zb2ZmID0gMDsKKwlzYnVzX3dyaXRlYihlc3AtPnByZXZfc29mZiwgZXNwLT5lcmVncyArIEVTUF9TT0ZGKTsKKwlzYnVzX3dyaXRlYihlc3AtPm5lZ19kZWZwLCBlc3AtPmVyZWdzICsgRVNQX1RJTUVPKTsKKworCS8qIFRoaXMgaXMgdGhlIG9ubHkgcG9pbnQgYXQgd2hpY2ggaXQgaXMgcmVsaWFibGUgdG8gcmVhZAorCSAqIHRoZSBJRC1jb2RlIGZvciBhIGZhc3QgRVNQIGNoaXAgdmFyaWFudHMuCisJICovCisJZXNwLT5tYXhfcGVyaW9kID0gKCgzNSAqIGVzcC0+Y2N5Y2xlKSAvIDEwMDApOworCWlmIChlc3AtPmVyZXYgPT0gZmFzdCkgeworCQl2ZXJzaW9uID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1VJRCk7CisJCWZhbWlseV9jb2RlID0gKHZlcnNpb24gJiAweGY4KSA+PiAzOworCQlpZiAoZmFtaWx5X2NvZGUgPT0gMHgwMikKKwkJCWVzcC0+ZXJldiA9IGZhczIzNjsKKwkJZWxzZSBpZiAoZmFtaWx5X2NvZGUgPT0gMHgwYSkKKwkJCWVzcC0+ZXJldiA9IGZhc2htZTsgLyogVmVyc2lvbiBpcyB1c3VhbGx5ICc1Jy4gKi8KKwkJZWxzZQorCQkJZXNwLT5lcmV2ID0gZmFzMTAwYTsKKwkJRVNQTUlTQygoImVzcCVkOiBGQVNUIGNoaXAgaXMgJXMgKGZhbWlseT0lZCwgdmVyc2lvbj0lZClcbiIsCisJCQkgZXNwLT5lc3BfaWQsCisJCQkgKGVzcC0+ZXJldiA9PSBmYXMyMzYpID8gImZhczIzNiIgOgorCQkJICgoZXNwLT5lcmV2ID09IGZhczEwMGEpID8gImZhczEwMGEiIDoKKwkJCSAgImZhc0hNRSIpLCBmYW1pbHlfY29kZSwgKHZlcnNpb24gJiA3KSkpOworCisJCWVzcC0+bWluX3BlcmlvZCA9ICgoNCAqIGVzcC0+Y2N5Y2xlKSAvIDEwMDApOworCX0gZWxzZSB7CisJCWVzcC0+bWluX3BlcmlvZCA9ICgoNSAqIGVzcC0+Y2N5Y2xlKSAvIDEwMDApOworCX0KKwllc3AtPm1heF9wZXJpb2QgPSAoZXNwLT5tYXhfcGVyaW9kICsgMyk+PjI7CisJZXNwLT5taW5fcGVyaW9kID0gKGVzcC0+bWluX3BlcmlvZCArIDMpPj4yOworCisJc2J1c193cml0ZWIoZXNwLT5jb25maWcxLCBlc3AtPmVyZWdzICsgRVNQX0NGRzEpOworCXN3aXRjaCAoZXNwLT5lcmV2KSB7CisJY2FzZSBlc3AxMDA6CisJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJYnJlYWs7CisJY2FzZSBlc3AxMDBhOgorCQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7CisJCWJyZWFrOworCWNhc2UgZXNwMjM2OgorCQkvKiBTbG93IDIzNiAqLworCQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7CisJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOworCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJYnJlYWs7CisJY2FzZSBmYXNobWU6CisJCWVzcC0+Y29uZmlnMiB8PSAoRVNQX0NPTkZJRzJfSE1FMzIgfCBFU1BfQ09ORklHMl9ITUVGRU5BQik7CisJCS8qIGZhbGx0aHJvdWdoLi4uICovCisJY2FzZSBmYXMyMzY6CisJCS8qIEZhc3QgMjM2IG9yIEhNRSAqLworCQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkJCXU4IGNmZzM7CisKKwkJCQljZmczID0gRVNQX0NPTkZJRzNfRkNMT0NLIHwgRVNQX0NPTkZJRzNfT0JQVVNIOworCQkJCWlmIChlc3AtPnNjc2lfaWQgPj0gOCkKKwkJCQkJY2ZnMyB8PSBFU1BfQ09ORklHM19JREJJVDM7CisJCQkJZXNwLT5jb25maWczW2ldIHw9IGNmZzM7CisJCQl9IGVsc2UgeworCQkJCWVzcC0+Y29uZmlnM1tpXSB8PSBFU1BfQ09ORklHM19GQ0xLOworCQkJfQorCQl9CisJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOworCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCWVzcC0+cmFkZWxheSA9IDgwOworCQl9IGVsc2UgeworCQkJaWYgKGVzcC0+ZGlmZikKKwkJCQllc3AtPnJhZGVsYXkgPSAwOworCQkJZWxzZQorCQkJCWVzcC0+cmFkZWxheSA9IDk2OworCQl9CisJCWJyZWFrOworCWNhc2UgZmFzMTAwYToKKwkJLyogRmFzdCAxMDBhICovCisJCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQllc3AtPmNvbmZpZzNbaV0gfD0gRVNQX0NPTkZJRzNfRkNMT0NLOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXTsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisJCWVzcC0+cmFkZWxheSA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwYW5pYygiZXNwOiB3aGF0IGNvdWxkIGl0IGJlLi4uIEkgd29uZGVyLi4uIik7CisJCWJyZWFrOworCX07CisKKwkvKiBFYXQgYW55IGJpdHJvdCBpbiB0aGUgY2hpcCAqLworCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpOworCXVkZWxheSgxMDApOworfQorCisvKiBUaGlzIHBsYWNlcyB0aGUgRVNQIGludG8gYSBrbm93biBzdGF0ZSBhdCBib290IHRpbWUuICovCitzdGF0aWMgdm9pZCBfX2luaXQgZXNwX2Jvb3R1cF9yZXNldChzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggdG1wOworCisJLyogUmVzZXQgdGhlIERNQSAqLworCWVzcF9yZXNldF9kbWEoZXNwKTsKKworCS8qIFJlc2V0IHRoZSBFU1AgKi8KKwllc3BfcmVzZXRfZXNwKGVzcCk7CisKKwkvKiBSZXNldCB0aGUgU0NTSSBidXMsIGJ1dCB0ZWxsIEVTUCBub3QgdG8gZ2VuZXJhdGUgYW4gaXJxICovCisJdG1wID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0NGRzEpOworCXRtcCB8PSBFU1BfQ09ORklHMV9TUlJESVNBQjsKKwlzYnVzX3dyaXRlYih0bXAsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMSk7CisKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9SUyk7CisJdWRlbGF5KDQwMCk7CisKKwlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzEsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMSk7CisKKwkvKiBFYXQgYW55IGJpdHJvdCBpbiB0aGUgY2hpcCBhbmQgd2UgYXJlIGRvbmUuLi4gKi8KKwlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKTsKK30KKworc3RhdGljIHZvaWQgZXNwX2NoYWluX2FkZChzdHJ1Y3QgZXNwICplc3ApCit7CisJc3Bpbl9sb2NrX2lycSgmZXNwY2hhaW5fbG9jayk7CisJaWYgKGVzcGNoYWluKSB7CisJCXN0cnVjdCBlc3AgKmVsaW5rID0gZXNwY2hhaW47CisJCXdoaWxlIChlbGluay0+bmV4dCkKKwkJCWVsaW5rID0gZWxpbmstPm5leHQ7CisJCWVsaW5rLT5uZXh0ID0gZXNwOworCX0gZWxzZSB7CisJCWVzcGNoYWluID0gZXNwOworCX0KKwllc3AtPm5leHQgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmZXNwY2hhaW5fbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9jaGFpbl9kZWwoc3RydWN0IGVzcCAqZXNwKQoreworCXNwaW5fbG9ja19pcnEoJmVzcGNoYWluX2xvY2spOworCWlmIChlc3BjaGFpbiA9PSBlc3ApIHsKKwkJZXNwY2hhaW4gPSBlc3AtPm5leHQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IGVzcCAqZWxpbmsgPSBlc3BjaGFpbjsKKwkJd2hpbGUgKGVsaW5rLT5uZXh0ICE9IGVzcCkKKwkJCWVsaW5rID0gZWxpbmstPm5leHQ7CisJCWVsaW5rLT5uZXh0ID0gZXNwLT5uZXh0OworCX0KKwllc3AtPm5leHQgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmZXNwY2hhaW5fbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVzcF9maW5kX2R2bWEoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2J1c19kZXYgKmRtYV9zZGV2KQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+c2RldjsKKwlzdHJ1Y3Qgc2J1c19kbWEgKmRtYTsKKworCWlmIChkbWFfc2RldiAhPSBOVUxMKSB7CisJCWZvcl9lYWNoX2R2bWEoZG1hKSB7CisJCQlpZiAoZG1hLT5zZGV2ID09IGRtYV9zZGV2KQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZm9yX2VhY2hfZHZtYShkbWEpIHsKKwkJCS8qIElmIGFsbG9jYXRlZCBhbHJlYWR5LCBjYW4ndCB1c2UgaXQuICovCisJCQlpZiAoZG1hLT5hbGxvY2F0ZWQpCisJCQkJY29udGludWU7CisKKwkJCWlmIChkbWEtPnNkZXYgPT0gTlVMTCkKKwkJCQlicmVhazsKKworCQkJLyogSWYgYnVzICsgc2xvdCBhcmUgdGhlIHNhbWUgYW5kIGl0IGhhcyB0aGUKKwkJCSAqIGNvcnJlY3QgT0JQIG5hbWUsIGl0J3Mgb3Vycy4KKwkJCSAqLworCQkJaWYgKHNkZXYtPmJ1cyA9PSBkbWEtPnNkZXYtPmJ1cyAmJgorCQkJICAgIHNkZXYtPnNsb3QgPT0gZG1hLT5zZGV2LT5zbG90ICYmCisJCQkgICAgKCFzdHJjbXAoZG1hLT5zZGV2LT5wcm9tX25hbWUsICJkbWEiKSB8fAorCQkJICAgICAhc3RyY21wKGRtYS0+c2Rldi0+cHJvbV9uYW1lLCAiZXNwZG1hIikpKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBkdm1hLAorCSAqIGRvIG5vdCB1c2UgdGhpcyBkZXZpY2UuCisJICovCisJaWYgKGRtYSA9PSBOVUxMKSB7CisJCXByaW50aygiQ2Fubm90IGZpbmQgZHZtYSBmb3IgRVNQJWQncyBTQ1NJXG4iLCBlc3AtPmVzcF9pZCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGRtYS0+YWxsb2NhdGVkKSB7CisJCXByaW50aygiZXNwJWQ6IGNhbid0IHVzZSBteSBlc3BkbWFcbiIsIGVzcC0+ZXNwX2lkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkbWEtPmFsbG9jYXRlZCA9IDE7CisJZXNwLT5kbWEgPSBkbWE7CisJZXNwLT5kcmVncyA9IGRtYS0+cmVnczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlc3BfbWFwX3JlZ3Moc3RydWN0IGVzcCAqZXNwLCBpbnQgaG1lKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+c2RldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCS8qIE9uIEhNRSwgdHdvIHJlZyBzZXRzIGV4aXN0LCBmaXJzdCBpcyBEVk1BLAorCSAqIHNlY29uZCBpcyBFU1AgcmVnaXN0ZXJzLgorCSAqLworCWlmIChobWUpCisJCXJlcyA9ICZzZGV2LT5yZXNvdXJjZVsxXTsKKwllbHNlCisJCXJlcyA9ICZzZGV2LT5yZXNvdXJjZVswXTsKKworCWVzcC0+ZXJlZ3MgPSBzYnVzX2lvcmVtYXAocmVzLCAwLCBFU1BfUkVHX1NJWkUsICJFU1AgUmVnaXN0ZXJzIik7CisKKwlpZiAoZXNwLT5lcmVncyA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVzcF9tYXBfY21kYXJlYShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5zZGV2OworCisJZXNwLT5lc3BfY29tbWFuZCA9IHNidXNfYWxsb2NfY29uc2lzdGVudChzZGV2LCAxNiwKKwkJCQkJCSAmZXNwLT5lc3BfY29tbWFuZF9kdm1hKTsKKwlpZiAoZXNwLT5lc3BfY29tbWFuZCA9PSBOVUxMIHx8CisJICAgIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVzcF9yZWdpc3Rlcl9pcnEoc3RydWN0IGVzcCAqZXNwKQoreworCWVzcC0+ZWhvc3QtPmlycSA9IGVzcC0+aXJxID0gZXNwLT5zZGV2LT5pcnFzWzBdOworCisJLyogV2UgdXNlZCB0byB0cnkgdmFyaW91cyBvdmVybHktY2xldmVyIHRoaW5ncyB0bworCSAqIHJlZHVjZSB0aGUgaW50ZXJydXB0IHByb2Nlc3Npbmcgb3ZlcmhlYWQgb24KKwkgKiBzdW40Yy9zdW40bSB3aGVuIG11bHRpcGxlIEVTUCdzIHNoYXJlZCB0aGUKKwkgKiBzYW1lIElSUS4gIEl0IHdhcyB0b28gY29tcGxleCBhbmQgbWVzc3kgdG8KKwkgKiBzYW5lbHkgbWFpbnRhaW4uCisJICovCisJaWYgKHJlcXVlc3RfaXJxKGVzcC0+ZWhvc3QtPmlycSwgZXNwX2ludHIsCisJCQlTQV9TSElSUSwgIkVTUCBTQ1NJIiwgZXNwKSkgeworCQlwcmludGsoImVzcCVkOiBDYW5ub3QgYWNxdWlyZSBpcnEgbGluZVxuIiwKKwkJICAgICAgIGVzcC0+ZXNwX2lkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50aygiZXNwJWQ6IElSUSAlcyAiLCBlc3AtPmVzcF9pZCwKKwkgICAgICAgX19pcnFfaXRvYShlc3AtPmVob3N0LT5pcnEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXNwX2dldF9zY3NpX2lkKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7CisKKwllc3AtPnNjc2lfaWQgPSBwcm9tX2dldGludGRlZmF1bHQoZXNwLT5wcm9tX25vZGUsCisJCQkJCSAgImluaXRpYXRvci1pZCIsCisJCQkJCSAgLTEpOworCWlmIChlc3AtPnNjc2lfaWQgPT0gLTEpCisJCWVzcC0+c2NzaV9pZCA9IHByb21fZ2V0aW50ZGVmYXVsdChlc3AtPnByb21fbm9kZSwKKwkJCQkJCSAgInNjc2ktaW5pdGlhdG9yLWlkIiwKKwkJCQkJCSAgLTEpOworCWlmIChlc3AtPnNjc2lfaWQgPT0gLTEpCisJCWVzcC0+c2NzaV9pZCA9IChzZGV2LT5idXMgPT0gTlVMTCkgPyA3IDoKKwkJCXByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5idXMtPnByb21fbm9kZSwKKwkJCQkJICAgInNjc2ktaW5pdGlhdG9yLWlkIiwKKwkJCQkJICAgNyk7CisJZXNwLT5laG9zdC0+dGhpc19pZCA9IGVzcC0+c2NzaV9pZDsKKwllc3AtPnNjc2lfaWRfbWFzayA9ICgxIDw8IGVzcC0+c2NzaV9pZCk7CisKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVzcF9nZXRfY2xvY2tfcGFyYW1zKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7CisJaW50IHByb21fbm9kZSA9IGVzcC0+cHJvbV9ub2RlOworCWludCBzYnVzX3Byb21fbm9kZTsKKwl1bnNpZ25lZCBpbnQgZm1oejsKKwl1OCBjY2Y7CisKKwlpZiAoc2RldiAhPSBOVUxMICYmIHNkZXYtPmJ1cyAhPSBOVUxMKQorCQlzYnVzX3Byb21fbm9kZSA9IHNkZXYtPmJ1cy0+cHJvbV9ub2RlOworCWVsc2UKKwkJc2J1c19wcm9tX25vZGUgPSAwOworCisJLyogVGhpcyBpcyBnZXR0aW5nIG1lc3N5IGJ1dCBpdCBoYXMgdG8gYmUgZG9uZQorCSAqIGNvcnJlY3RseSBvciBlbHNlIHlvdSBnZXQgd2VpcmQgYmVoYXZpb3IgYWxsCisJICogb3ZlciB0aGUgcGxhY2UuICBXZSBhcmUgdHJ5aW5nIHRvIGJhc2ljYWxseQorCSAqIGZpZ3VyZSBvdXQgdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uLgorCSAqCisJICogYSkgQ2xvY2sgQ29udmVyc2lvbiBGYWN0b3IKKwkgKgorCSAqICAgIFRoaXMgaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQKKwkgKiAgICBjcnlzdGFsIGNsb2NrIGZyZXF1ZW5jeSBnb2luZyBpbnRvIHRoZQorCSAqICAgIEVTUCBvbiB0aGlzIG1hY2hpbmUuICBBbnkgb3BlcmF0aW9uIHdob3NlCisJICogICAgdGltaW5nIGlzIGxvbmdlciB0aGFuIDQwMG5zIGRlcGVuZHMgb24gdGhpcworCSAqICAgIHZhbHVlIGJlaW5nIGNvcnJlY3QuICBGb3IgZXhhbXBsZSwgeW91J2xsCisJICogICAgZ2V0IGJsaXBzIGZvciBhcmJpdHJhdGlvbi9zZWxlY3Rpb24gZHVyaW5nCisJICogICAgaGlnaCBsb2FkIG9yIHdpdGggbXVsdGlwbGUgdGFyZ2V0cyBpZiB0aGlzCisJICogICAgaXMgbm90IHNldCBjb3JyZWN0bHkuCisJICoKKwkgKiBiKSBTZWxlY3Rpb24gVGltZS1PdXQKKwkgKgorCSAqICAgIFRoZSBFU1AgaXNuJ3QgdmVyeSBicmlnaHQgYW5kIHdpbGwgYXJiaXRyYXRlCisJICogICAgZm9yIHRoZSBidXMgYW5kIHRyeSB0byBzZWxlY3QgYSB0YXJnZXQKKwkgKiAgICBmb3JldmVyIGlmIHlvdSBsZXQgaXQuICBUaGlzIHZhbHVlIHRlbGxzCisJICogICAgdGhlIEVTUCB3aGVuIGl0IGhhcyB0YWtlbiB0b28gbG9uZyB0bworCSAqICAgIG5lZ290aWF0ZSBhbmQgdGhhdCBpdCBzaG91bGQgaW50ZXJydXB0CisJICogICAgdGhlIENQVSBzbyB3ZSBjYW4gc2VlIHdoYXQgaGFwcGVuZWQuCisJICogICAgVGhlIHZhbHVlIGlzIGNvbXB1dGVkIGFzIGZvbGxvd3MgKGZyb20KKwkgKiAgICBOQ1IvU3ltYmlvcyBjaGlwIGRvY3MpLgorCSAqCisJICogICAgICAgICAgKFRpbWUgT3V0IFBlcmlvZCkgKiAgKElucHV0IENsb2NrKQorCSAqICAgIFNUTyA9IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgICAgICAgICAoODE5MikgKiAoQ2xvY2sgQ29udmVyc2lvbiBGYWN0b3IpCisJICoKKwkgKiAgICBZb3UgdXN1YWxseSB3YW50IHRoZSB0aW1lIG91dCBwZXJpb2QgdG8gYmUKKwkgKiAgICBhcm91bmQgMjUwbXMsIEkgdGhpbmsgd2UnbGwgc2V0IGl0IGEgbGl0dGxlCisJICogICAgYml0IGhpZ2hlciB0byBhY2NvdW50IGZvciBmdWxseSBsb2FkZWQgU0NTSQorCSAqICAgIGJ1cydzIGFuZCBzbG93IGRldmljZXMgdGhhdCBkb24ndCByZXNwb25kIHNvCisJICogICAgcXVpY2tseSB0byBzZWxlY3Rpb24gYXR0ZW1wdHMuICh5ZWFoLCBJIGtub3cKKwkgKiAgICB0aGlzIGlzIG91dCBvZiBzcGVjLiBidXQgdGhlcmUgaXMgYSBsb3Qgb2YKKwkgKiAgICBidWdneSBwaWVjZXMgb2YgZmlybXdhcmUgb3V0IHRoZXJlIHNvIGJpdGUgbWUpCisJICoKKwkgKiBjKSBJbXBlcmljYWwgY29uc3RhbnRzIGZvciBzeW5jaHJvbm91cyBvZmZzZXQKKwkgKiAgICBhbmQgdHJhbnNmZXIgcGVyaW9kIHJlZ2lzdGVyIHZhbHVlcworCSAqCisJICogICAgVGhpcyBlbnRhaWxzIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBzeW5jCisJICogICAgcGVyaW9kIHdlIGNvdWxkIGV2ZXIgaGFuZGxlIG9uIHRoaXMgRVNQLgorCSAqLworCisJZm1oeiA9IHByb21fZ2V0aW50ZGVmYXVsdChwcm9tX25vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAtMSk7CisJaWYgKGZtaHogPT0gLTEpCisJCWZtaHogPSAoIXNidXNfcHJvbV9ub2RlKSA/IDAgOgorCQkJcHJvbV9nZXRpbnRkZWZhdWx0KHNidXNfcHJvbV9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgLTEpOworCisJaWYgKGZtaHogPD0gKDUwMDAwMDApKQorCQljY2YgPSAwOworCWVsc2UKKwkJY2NmID0gKCgoNTAwMDAwMCAtIDEpICsgKGZtaHopKS8oNTAwMDAwMCkpOworCisJaWYgKCFjY2YgfHwgY2NmID4gOCkgeworCQkvKiBJZiB3ZSBjYW4ndCBmaW5kIGFueXRoaW5nIHJlYXNvbmFibGUsCisJCSAqIGp1c3QgYXNzdW1lIDIwTUhaLiAgVGhpcyBpcyB0aGUgY2xvY2sKKwkJICogZnJlcXVlbmN5IG9mIHRoZSBvbGRlciBzdW40YydzIHdoZXJlIEkndmUKKwkJICogYmVlbiB1bmFibGUgdG8gZmluZCB0aGUgY2xvY2stZnJlcXVlbmN5CisJCSAqIFBST00gcHJvcGVydHkuICBBbGwgb3RoZXIgbWFjaGluZXMgcHJvdmlkZQorCQkgKiB1c2VmdWwgdmFsdWVzIGl0IHNlZW1zLgorCQkgKi8KKwkJY2NmID0gRVNQX0NDRl9GNDsKKwkJZm1oeiA9ICgyMDAwMDAwMCk7CisJfQorCisJaWYgKGNjZiA9PSAoRVNQX0NDRl9GNyArIDEpKQorCQllc3AtPmNmYWN0ID0gRVNQX0NDRl9GMDsKKwllbHNlIGlmIChjY2YgPT0gRVNQX0NDRl9ORVZFUikKKwkJZXNwLT5jZmFjdCA9IEVTUF9DQ0ZfRjI7CisJZWxzZQorCQllc3AtPmNmYWN0ID0gY2NmOworCWVzcC0+cmF3X2NmYWN0ID0gY2NmOworCisJZXNwLT5jZnJlcSA9IGZtaHo7CisJZXNwLT5jY3ljbGUgPSBFU1BfTUhaX1RPX0NZQ0xFKGZtaHopOworCWVzcC0+Y3RpY2sgPSBFU1BfVElDSyhjY2YsIGVzcC0+Y2N5Y2xlKTsKKwllc3AtPm5lZ19kZWZwID0gRVNQX05FR19ERUZQKGZtaHosIGNjZik7CisJZXNwLT5zeW5jX2RlZnAgPSBTWU5DX0RFRlBfU0xPVzsKKworCXByaW50aygiU0NTSSBJRCAlZCBDbGsgJWRNSHogQ0NZQz0lZCBDQ0Y9JWQgVE91dCAlZCAiLAorCSAgICAgICBlc3AtPnNjc2lfaWQsIChmbWh6IC8gMTAwMDAwMCksCisJICAgICAgIChpbnQpZXNwLT5jY3ljbGUsIChpbnQpY2NmLCAoaW50KSBlc3AtPm5lZ19kZWZwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVzcF9nZXRfYnVyc3RzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNidXNfZGV2ICpkbWEpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5zZGV2OworCXU4IGJ1cnN0czsKKworCWJ1cnN0cyA9IHByb21fZ2V0aW50ZGVmYXVsdChlc3AtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisKKwlpZiAoZG1hKSB7CisJCXU4IHRtcCA9IHByb21fZ2V0aW50ZGVmYXVsdChkbWEtPnByb21fbm9kZSwKKwkJCQkJICAgICJidXJzdC1zaXplcyIsIDB4ZmYpOworCQlpZiAodG1wICE9IDB4ZmYpCisJCQlidXJzdHMgJj0gdG1wOworCX0KKworCWlmIChzZGV2LT5idXMpIHsKKwkJdTggdG1wID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCQkgICAgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJCWlmICh0bXAgIT0gMHhmZikKKwkJCWJ1cnN0cyAmPSB0bXA7CisJfQorCisJaWYgKGJ1cnN0cyA9PSAweGZmIHx8CisJICAgIChidXJzdHMgJiBETUFfQlVSU1QxNikgPT0gMCB8fAorCSAgICAoYnVyc3RzICYgRE1BX0JVUlNUMzIpID09IDApCisJCWJ1cnN0cyA9IChETUFfQlVSU1QzMiAtIDEpOworCisJZXNwLT5idXJzdHMgPSBidXJzdHM7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlc3BfZ2V0X3JldmlzaW9uKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwl1OCB0bXA7CisKKwllc3AtPmNvbmZpZzEgPSAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IChlc3AtPnNjc2lfaWQgJiA3KSk7CisJZXNwLT5jb25maWcyID0gKEVTUF9DT05GSUcyX1NDU0kyRU5BQiB8IEVTUF9DT05GSUcyX1JFR1BBUklUWSk7CisJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOworCisJdG1wID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0NGRzIpOworCXRtcCAmPSB+RVNQX0NPTkZJRzJfTUFHSUM7CisJaWYgKHRtcCAhPSAoRVNQX0NPTkZJRzJfU0NTSTJFTkFCIHwgRVNQX0NPTkZJRzJfUkVHUEFSSVRZKSkgeworCQkvKiBJZiB3aGF0IHdlIHdyaXRlIHRvIGNmZzIgZG9lcyBub3QgY29tZSBiYWNrLCBjZmcyCisJCSAqIGlzIG5vdCBpbXBsZW1lbnRlZCwgdGhlcmVmb3JlIHRoaXMgbXVzdCBiZSBhIHBsYWluCisJCSAqIGVzcDEwMC4KKwkJICovCisJCWVzcC0+ZXJldiA9IGVzcDEwMDsKKwkJcHJpbnRrKCJOQ1I1M0M5MChlc3AxMDApXG4iKTsKKwl9IGVsc2UgeworCQllc3AtPmNvbmZpZzIgPSAwOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1swXSA9IDU7CisJCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKKwkJc2J1c193cml0ZWIoMCwgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisKKwkJdG1wID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCQlpZiAodG1wICE9IDUpIHsKKwkJCS8qIFRoZSBjZmcyIHJlZ2lzdGVyIGlzIGltcGxlbWVudGVkLCBob3dldmVyCisJCQkgKiBjZmczIGlzIG5vdCwgbXVzdCBiZSBlc3AxMDBhLgorCQkJICovCisJCQllc3AtPmVyZXYgPSBlc3AxMDBhOworCQkJcHJpbnRrKCJOQ1I1M0M5MEEoZXNwMTAwYSlcbiIpOworCQl9IGVsc2UgeworCQkJaW50IHRhcmdldDsKKworCQkJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCAxNjsgdGFyZ2V0KyspCisJCQkJZXNwLT5jb25maWczW3RhcmdldF0gPSAwOworCQkJZXNwLT5wcmV2X2NmZzMgPSAwOworCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisKKwkJCS8qIEFsbCBvZiBjZmd7MSwyLDN9IGltcGxlbWVudGVkLCBtdXN0IGJlIG9uZSBvZgorCQkJICogdGhlIGZhcyB2YXJpYW50cywgZmlndXJlIG91dCB3aGljaCBvbmUuCisJCQkgKi8KKwkJCWlmIChlc3AtPnJhd19jZmFjdCA+IEVTUF9DQ0ZfRjUpIHsKKwkJCQllc3AtPmVyZXYgPSBmYXN0OworCQkJCWVzcC0+c3luY19kZWZwID0gU1lOQ19ERUZQX0ZBU1Q7CisJCQkJcHJpbnRrKCJOQ1I1M0M5WEYoZXNwZmFzdClcbiIpOworCQkJfSBlbHNlIHsKKwkJCQllc3AtPmVyZXYgPSBlc3AyMzY7CisJCQkJcHJpbnRrKCJOQ1I1M0M5eChlc3AyMzYpXG4iKTsKKwkJCX0KKwkJCWVzcC0+Y29uZmlnMiA9IDA7CisJCQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlc3BfaW5pdF9zd3N0YXRlKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpbnQgaTsKKworCS8qIENvbW1hbmQgcXVldWVzLi4uICovCisJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKwllc3AtPmRpc2Nvbm5lY3RlZF9TQyA9IE5VTEw7CisJZXNwLT5pc3N1ZV9TQyA9IE5VTEw7CisKKwkvKiBUYXJnZXQgYW5kIGN1cnJlbnQgY29tbWFuZCBzdGF0ZS4uLiAqLworCWVzcC0+dGFyZ2V0c19wcmVzZW50ID0gMDsKKwllc3AtPnJlc2V0dGluZ19idXMgPSAwOworCWVzcC0+c25pcCA9IDA7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlc3AtPnJlc2V0X3F1ZXVlKTsKKworCS8qIERlYnVnZ2luZy4uLiAqLworCWZvcihpID0gMDsgaSA8IDMyOyBpKyspCisJCWVzcC0+ZXNwY21kbG9nW2ldID0gMDsKKwllc3AtPmVzcGNtZGVudCA9IDA7CisKKwkvKiBNU0cgcGhhc2Ugc3RhdGUuLi4gKi8KKwlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWVzcC0+Y3VyX21zZ291dFtpXSA9IDA7CisJCWVzcC0+Y3VyX21zZ2luW2ldID0gMDsKKwl9CisJZXNwLT5wcmV2bXNnb3V0ID0gZXNwLT5wcmV2bXNnaW4gPSAwOworCWVzcC0+bXNnb3V0X2xlbiA9IGVzcC0+bXNnaW5fbGVuID0gMDsKKworCS8qIENsZWFyIHRoZSBvbmUgYmVoaW5kIGNhY2hlcyB0byBob2xkIHVubWF0Y2hhYmxlIHZhbHVlcy4gKi8KKwllc3AtPnByZXZfc29mZiA9IGVzcC0+cHJldl9zdHAgPSBlc3AtPnByZXZfY2ZnMyA9IDB4ZmY7CisJZXNwLT5wcmV2X2htZV9kbWFjc3IgPSAweGZmZmZmZmZmOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZXRlY3Rfb25lX2VzcChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50LCBzdHJ1Y3Qgc2J1c19kZXYgKmVzcF9kZXYsCisJCQkJIHN0cnVjdCBzYnVzX2RldiAqZXNwZG1hLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMsCisJCQkJIGludCBpZCwgaW50IGhtZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICplc3BfaG9zdCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKHN0cnVjdCBlc3ApKTsKKwlzdHJ1Y3QgZXNwICplc3A7CisJCisJaWYgKCFlc3BfaG9zdCkgeworCQlwcmludGsoIkVTUDogQ2Fubm90IHJlZ2lzdGVyIFNDU0kgaG9zdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGhtZSkKKwkJZXNwX2hvc3QtPm1heF9pZCA9IDE2OworCWVzcCA9IChzdHJ1Y3QgZXNwICopIGVzcF9ob3N0LT5ob3N0ZGF0YTsKKwllc3AtPmVob3N0ID0gZXNwX2hvc3Q7CisJZXNwLT5zZGV2ID0gZXNwX2RldjsKKwllc3AtPmVzcF9pZCA9IGlkOworCWVzcC0+cHJvbV9ub2RlID0gZXNwX2Rldi0+cHJvbV9ub2RlOworCXByb21fZ2V0c3RyaW5nKGVzcC0+cHJvbV9ub2RlLCAibmFtZSIsIGVzcC0+cHJvbV9uYW1lLAorCQkgICAgICAgc2l6ZW9mKGVzcC0+cHJvbV9uYW1lKSk7CisKKwllc3BfY2hhaW5fYWRkKGVzcCk7CisJaWYgKGVzcF9maW5kX2R2bWEoZXNwLCBlc3BkbWEpIDwgMCkKKwkJZ290byBmYWlsX3VubGluazsKKwlpZiAoZXNwX21hcF9yZWdzKGVzcCwgaG1lKSA8IDApIHsKKwkJcHJpbnRrKCJFU1AgcmVnaXN0ZXJzIHVubWFwcGFibGUiKTsKKwkJZ290byBmYWlsX2R2bWFfcmVsZWFzZTsKKwl9CisJaWYgKGVzcF9tYXBfY21kYXJlYShlc3ApIDwgMCkgeworCQlwcmludGsoIkVTUCBEVk1BIHRyYW5zcG9ydCBhcmVhIHVubWFwcGFibGUiKTsKKwkJZ290byBmYWlsX3VubWFwX3JlZ3M7CisJfQorCWlmIChlc3BfcmVnaXN0ZXJfaXJxKGVzcCkgPCAwKQorCQlnb3RvIGZhaWxfdW5tYXBfY21kYXJlYTsKKworCWVzcF9nZXRfc2NzaV9pZChlc3ApOworCisJZXNwLT5kaWZmID0gcHJvbV9nZXRib29sKGVzcC0+cHJvbV9ub2RlLCAiZGlmZmVyZW50aWFsIik7CisJaWYgKGVzcC0+ZGlmZikKKwkJcHJpbnRrKCJEaWZmZXJlbnRpYWwgIik7CisKKwllc3BfZ2V0X2Nsb2NrX3BhcmFtcyhlc3ApOworCWVzcF9nZXRfYnVyc3RzKGVzcCwgZXNwZG1hKTsKKwllc3BfZ2V0X3JldmlzaW9uKGVzcCk7CisJZXNwX2luaXRfc3dzdGF0ZShlc3ApOworCisJZXNwX2Jvb3R1cF9yZXNldChlc3ApOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdW5tYXBfY21kYXJlYToKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChlc3AtPnNkZXYsIDE2LAorCQkJICAgICAodm9pZCAqKSBlc3AtPmVzcF9jb21tYW5kLAorCQkJICAgICBlc3AtPmVzcF9jb21tYW5kX2R2bWEpOworCitmYWlsX3VubWFwX3JlZ3M6CisJc2J1c19pb3VubWFwKGVzcC0+ZXJlZ3MsIEVTUF9SRUdfU0laRSk7CisKK2ZhaWxfZHZtYV9yZWxlYXNlOgorCWVzcC0+ZG1hLT5hbGxvY2F0ZWQgPSAwOworCitmYWlsX3VubGluazoKKwllc3BfY2hhaW5fZGVsKGVzcCk7CisJc2NzaV91bnJlZ2lzdGVyKGVzcF9ob3N0KTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIERldGVjdGluZyBFU1AgY2hpcHMgb24gdGhlIG1hY2hpbmUuICBUaGlzIGlzIHRoZSBzaW1wbGUgYW5kIGVhc3kKKyAqIHZlcnNpb24uCisgKi8KKworI2lmZGVmIENPTkZJR19TVU40CisKKyNpbmNsdWRlIDxhc20vc3VuNHBhZGRyLmg+CisKK3N0YXRpYyBpbnQgX19pbml0IGVzcF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKwlzdGF0aWMgc3RydWN0IHNidXNfZGV2IGVzcF9kZXY7CisJaW50IGVzcHNfaW5fdXNlID0gMDsKKworCWVzcGNoYWluID0gMDsKKworCWlmIChzdW40X2VzcF9waHlzYWRkcikgeworCQltZW1zZXQgKCZlc3BfZGV2LCAwLCBzaXplb2YoZXNwX2RldikpOworCQllc3BfZGV2LnJlZ19hZGRyc1swXS5waHlzX2FkZHIgPSBzdW40X2VzcF9waHlzYWRkcjsKKwkJZXNwX2Rldi5pcnFzWzBdID0gNDsKKwkJZXNwX2Rldi5yZXNvdXJjZVswXS5zdGFydCA9IHN1bjRfZXNwX3BoeXNhZGRyOworCQllc3BfZGV2LnJlc291cmNlWzBdLmVuZCA9IHN1bjRfZXNwX3BoeXNhZGRyICsgRVNQX1JFR19TSVpFIC0gMTsKKwkJZXNwX2Rldi5yZXNvdXJjZVswXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisKKwkJaWYgKCFkZXRlY3Rfb25lX2VzcCh0cG50LCAmZXNwX2RldiwgTlVMTCwgTlVMTCwgMCwgMCkpCisJCQllc3BzX2luX3VzZSsrOworCQlwcmludGsoIkVTUDogVG90YWwgb2YgMSBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIGVzcHNfaW5fdXNlKTsKKwkJZXNwc19ydW5uaW5nID0gIGVzcHNfaW5fdXNlOworCX0KKwlyZXR1cm4gZXNwc19pbl91c2U7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU1VONCAqLworCitzdGF0aWMgaW50IF9faW5pdCBlc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IHNidXNfYnVzICpzYnVzOworCXN0cnVjdCBzYnVzX2RldiAqZXNwX2RldiwgKnNiZGV2X2l0ZXI7CisJaW50IG5lc3BzID0gMCwgZXNwc19pbl91c2UgPSAwOworCisJZXNwY2hhaW4gPSAwOworCWlmICghc2J1c19yb290KSB7CisjaWZkZWYgQ09ORklHX1BDSQorCQlyZXR1cm4gMDsKKyNlbHNlCisJCXBhbmljKCJObyBTQlVTIGluIGVzcF9kZXRlY3QoKSIpOworI2VuZGlmCisJfQorCWZvcl9lYWNoX3NidXMoc2J1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2KHNiZGV2X2l0ZXIsIHNidXMpIHsKKwkJCXN0cnVjdCBzYnVzX2RldiAqZXNwZG1hID0gTlVMTDsKKwkJCWludCBobWUgPSAwOworCisJCQkvKiBJcyBpdCBhbiBlc3Agc2J1cyBkZXZpY2U/ICovCisJCQllc3BfZGV2ID0gc2JkZXZfaXRlcjsKKwkJCWlmIChzdHJjbXAoZXNwX2Rldi0+cHJvbV9uYW1lLCAiZXNwIikgJiYKKwkJCSAgICBzdHJjbXAoZXNwX2Rldi0+cHJvbV9uYW1lLCAiU1VOVyxlc3AiKSkgeworCQkJCWlmICghc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgIlNVTlcsZmFzIikpIHsKKwkJCQkJaG1lID0gMTsKKwkJCQkJZXNwZG1hID0gZXNwX2RldjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIWVzcF9kZXYtPmNoaWxkIHx8CisJCQkJCSAgICAoc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgImVzcGRtYSIpICYmCisJCQkJCSAgICAgc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgImRtYSIpKSkKKwkJCQkJCWNvbnRpbnVlOyAvKiBub3BlLi4uICovCisJCQkJCWVzcGRtYSA9IGVzcF9kZXY7CisJCQkJCWVzcF9kZXYgPSBlc3BfZGV2LT5jaGlsZDsKKwkJCQkJaWYgKHN0cmNtcChlc3BfZGV2LT5wcm9tX25hbWUsICJlc3AiKSAmJgorCQkJCQkgICAgc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgIlNVTlcsZXNwIikpCisJCQkJCQljb250aW51ZTsgLyogaG93IGNhbiB0aGlzIGhhcHBlbj8gKi8KKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChkZXRlY3Rfb25lX2VzcCh0cG50LCBlc3BfZGV2LCBlc3BkbWEsIHNidXMsIG5lc3BzKyssIGhtZSkgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJCQorCQkJZXNwc19pbl91c2UrKzsKKwkJfSAvKiBmb3IgZWFjaCBzYnVzZGV2ICovCisJfSAvKiBmb3IgZWFjaCBzYnVzICovCisJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsCisJICAgICAgIGVzcHNfaW5fdXNlKTsKKwllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwlyZXR1cm4gZXNwc19pbl91c2U7Cit9CisKKyNlbmRpZiAvKiAhQ09ORklHX1NVTjQgKi8KKworLyoKKyAqLworc3RhdGljIGludCBlc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIGhvc3QtPmhvc3RkYXRhOworCisJRVNQX0lOVFNPRkYoZXNwLT5kcmVncyk7CisjaWYgMAorCWVzcF9yZXNldF9kbWEoZXNwKTsKKwllc3BfcmVzZXRfZXNwKGVzcCk7CisjZW5kaWYKKworCWZyZWVfaXJxKGVzcC0+ZWhvc3QtPmlycSwgZXNwKTsKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChlc3AtPnNkZXYsIDE2LAorCQkJICAgICAodm9pZCAqKSBlc3AtPmVzcF9jb21tYW5kLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEpOworCXNidXNfaW91bm1hcChlc3AtPmVyZWdzLCBFU1BfUkVHX1NJWkUpOworCWVzcC0+ZG1hLT5hbGxvY2F0ZWQgPSAwOworCWVzcF9jaGFpbl9kZWwoZXNwKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyogVGhlIGluZm8gZnVuY3Rpb24gd2lsbCByZXR1cm4gd2hhdGV2ZXIgdXNlZnVsCisgKiBpbmZvcm1hdGlvbiB0aGUgZGV2ZWxvcGVyIHNlZXMgZml0LiAgSWYgbm90IHByb3ZpZGVkLCB0aGVuCisgKiB0aGUgbmFtZSBmaWVsZCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmVzcF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGVzcCAqZXNwOworCisJZXNwID0gKHN0cnVjdCBlc3AgKikgaG9zdC0+aG9zdGRhdGE7CisJc3dpdGNoIChlc3AtPmVyZXYpIHsKKwljYXNlIGVzcDEwMDoKKwkJcmV0dXJuICJTcGFyYyBFU1AxMDAgKE5DUjUzQzkwKSI7CisJY2FzZSBlc3AxMDBhOgorCQlyZXR1cm4gIlNwYXJjIEVTUDEwMEEgKE5DUjUzQzkwQSkiOworCWNhc2UgZXNwMjM2OgorCQlyZXR1cm4gIlNwYXJjIEVTUDIzNiI7CisJY2FzZSBmYXMyMzY6CisJCXJldHVybiAiU3BhcmMgRVNQMjM2LUZBU1QiOworCWNhc2UgZmFzaG1lOgorCQlyZXR1cm4gIlNwYXJjIEVTUDM2Ni1ITUUiOworCWNhc2UgZmFzMTAwYToKKwkJcmV0dXJuICJTcGFyYyBFU1AxMDBBLUZBU1QiOworCWRlZmF1bHQ6CisJCXJldHVybiAiQm9nb24gRVNQIHJldmlzaW9uIjsKKwl9OworfQorCisvKiBGcm9tIFdvbGZnYW5nIFN0YW5nbG1laWVyJ3MgTkNSIHNjc2kgZHJpdmVyLiAqLworc3RydWN0IGluZm9fc3RyCit7CisJY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7CisJaW50IG9mZnNldDsKKwlpbnQgcG9zOworfTsKKworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaWYgKGluZm8tPnBvcyArIGxlbiA+IGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+bGVuZ3RoIC0gaW5mby0+cG9zOworCisJaWYgKGluZm8tPnBvcyArIGxlbiA8IGluZm8tPm9mZnNldCkgeworCQlpbmZvLT5wb3MgKz0gbGVuOworCQlyZXR1cm47CisJfQorCWlmIChpbmZvLT5wb3MgPCBpbmZvLT5vZmZzZXQpIHsKKwkJZGF0YSArPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwkJbGVuICAtPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyICsgaW5mby0+cG9zLCBkYXRhLCBsZW4pOworCQlpbmZvLT5wb3MgKz0gbGVuOworCX0KK30KKworc3RhdGljIGludCBjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbODFdOworCWludCBsZW47CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwljb3B5X21lbV9pbmZvKGluZm8sIGJ1ZiwgbGVuKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGVzcF9ob3N0X2luZm8oc3RydWN0IGVzcCAqZXNwLCBjaGFyICpwdHIsIG9mZl90IG9mZnNldCwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IGluZm9fc3RyIGluZm87CisJaW50IGk7CisKKwlpbmZvLmJ1ZmZlcgk9IHB0cjsKKwlpbmZvLmxlbmd0aAk9IGxlbjsKKwlpbmZvLm9mZnNldAk9IG9mZnNldDsKKwlpbmZvLnBvcwk9IDA7CisKKwljb3B5X2luZm8oJmluZm8sICJTcGFyYyBFU1AgSG9zdCBBZGFwdGVyOlxuIik7CisJY29weV9pbmZvKCZpbmZvLCAiXHRQUk9NIG5vZGVcdFx0JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgZXNwLT5wcm9tX25vZGUpOworCWNvcHlfaW5mbygmaW5mbywgIlx0UFJPTSBuYW1lXHRcdCVzXG4iLCBlc3AtPnByb21fbmFtZSk7CisJY29weV9pbmZvKCZpbmZvLCAiXHRFU1AgTW9kZWxcdFx0Iik7CisJc3dpdGNoIChlc3AtPmVyZXYpIHsKKwljYXNlIGVzcDEwMDoKKwkJY29weV9pbmZvKCZpbmZvLCAiRVNQMTAwXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBlc3AxMDBhOgorCQljb3B5X2luZm8oJmluZm8sICJFU1AxMDBBXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBlc3AyMzY6CisJCWNvcHlfaW5mbygmaW5mbywgIkVTUDIzNlxuIik7CisJCWJyZWFrOworCWNhc2UgZmFzMjM2OgorCQljb3B5X2luZm8oJmluZm8sICJGQVMyMzZcbiIpOworCQlicmVhazsKKwljYXNlIGZhczEwMGE6CisJCWNvcHlfaW5mbygmaW5mbywgIkZBUzEwMEFcbiIpOworCQlicmVhazsKKwljYXNlIGZhc3Q6CisJCWNvcHlfaW5mbygmaW5mbywgIkZBU1RcbiIpOworCQlicmVhazsKKwljYXNlIGZhc2htZToKKwkJY29weV9pbmZvKCZpbmZvLCAiSGFwcHkgTWVhbCBGQVNcbiIpOworCQlicmVhazsKKwljYXNlIGVzcHVua25vd246CisJZGVmYXVsdDoKKwkJY29weV9pbmZvKCZpbmZvLCAiVW5rbm93biFcbiIpOworCQlicmVhazsKKwl9OworCWNvcHlfaW5mbygmaW5mbywgIlx0RE1BIFJldmlzaW9uXHRcdCIpOworCXN3aXRjaCAoZXNwLT5kbWEtPnJldmlzaW9uKSB7CisJY2FzZSBkdm1hcmV2MDoKKwkJY29weV9pbmZvKCZpbmZvLCAiUmV2IDBcbiIpOworCQlicmVhazsKKwljYXNlIGR2bWFlc2MxOgorCQljb3B5X2luZm8oJmluZm8sICJFU0MgUmV2IDFcbiIpOworCQlicmVhazsKKwljYXNlIGR2bWFyZXYxOgorCQljb3B5X2luZm8oJmluZm8sICJSZXYgMVxuIik7CisJCWJyZWFrOworCWNhc2UgZHZtYXJldjI6CisJCWNvcHlfaW5mbygmaW5mbywgIlJldiAyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkdm1hcmV2MzoKKwkJY29weV9pbmZvKCZpbmZvLCAiUmV2IDNcbiIpOworCQlicmVhazsKKwljYXNlIGR2bWFyZXZwbHVzOgorCQljb3B5X2luZm8oJmluZm8sICJSZXYgMStcbiIpOworCQlicmVhazsKKwljYXNlIGR2bWFobWU6CisJCWNvcHlfaW5mbygmaW5mbywgIlJldiBITUUvRkFTXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29weV9pbmZvKCZpbmZvLCAiVW5rbm93biFcbiIpOworCQlicmVhazsKKwl9OworCWNvcHlfaW5mbygmaW5mbywgIlx0TGl2ZSBUYXJnZXRzXHRcdFsgIik7CisJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJaWYgKGVzcC0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgaSkpCisJCQljb3B5X2luZm8oJmluZm8sICIlZCAiLCBpKTsKKwl9CisJY29weV9pbmZvKCZpbmZvLCAiXVxuXG4iKTsKKwkKKwkvKiBOb3cgZGVzY3JpYmUgdGhlIHN0YXRlIG9mIGVhY2ggZXhpc3RpbmcgdGFyZ2V0LiAqLworCWNvcHlfaW5mbygmaW5mbywgIlRhcmdldCAjXHRjb25maWczXHRcdFN5bmMgQ2FwYWJpbGl0aWVzXHREaXNjb25uZWN0XHRXaWRlXG4iKTsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBlc3AtPmVob3N0KSB7CisJCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gc2Rldi0+aG9zdGRhdGE7CisJCXVpbnQgaWQgPSBzZGV2LT5pZDsKKworCQlpZiAoIShlc3AtPnRhcmdldHNfcHJlc2VudCAmICgxIDw8IGlkKSkpCisJCQljb250aW51ZTsKKworCQljb3B5X2luZm8oJmluZm8sICIlZFx0XHQiLCBpZCk7CisJCWNvcHlfaW5mbygmaW5mbywgIiUwOGx4XHQiLCBlc3AtPmNvbmZpZzNbaWRdKTsKKwkJY29weV9pbmZvKCZpbmZvLCAiWyUwMmx4LCUwMmx4XVx0XHRcdCIsCisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQsCisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QpOworCQljb3B5X2luZm8oJmluZm8sICIlc1x0XHQiLAorCQkJZXNwX2Rldi0+ZGlzY29ubmVjdCA/ICJ5ZXMiIDogIm5vIik7CisJCWNvcHlfaW5mbygmaW5mbywgIiVzXG4iLAorCQkJKGVzcC0+Y29uZmlnM1tpZF0gJiBFU1BfQ09ORklHM19FV0lERSkgPyAieWVzIiA6ICJubyIpOworCX0KKwlyZXR1cm4gaW5mby5wb3MgPiBpbmZvLm9mZnNldD8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7Cit9CisKKy8qIEVTUCBwcm9jIGZpbGVzeXN0ZW0gY29kZS4gKi8KK3N0YXRpYyBpbnQgZXNwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgZXNwICplc3A7CisKKwlpZiAoaW5vdXQpCisJCXJldHVybiAtRUlOVkFMOyAvKiBub3QgeWV0ICovCisKKwlmb3JfZWFjaF9lc3AoZXNwKSB7CisJCWlmIChlc3AtPmVob3N0ID09IGhvc3QpCisJCQlicmVhazsKKwl9CisJaWYgKCFlc3ApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0YXJ0KQorCQkqc3RhcnQgPSBidWZmZXI7CisKKwlyZXR1cm4gZXNwX2hvc3RfaW5mbyhlc3AsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBlc3BfZ2V0X2RtYWJ1ZnMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKwlpZiAoc3AtPnVzZV9zZyA9PSAwKSB7CisJCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNwLT5yZXF1ZXN0X2J1ZmZsZW47CisJCXNwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+cmVxdWVzdF9idWZmZXI7CisJCXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7CisJCWlmIChzcC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCQlzcC0+U0NwLmhhdmVfZGF0YV9pbiA9IHNidXNfbWFwX3NpbmdsZShlc3AtPnNkZXYsIHNwLT5TQ3AuYnVmZmVyLAorCQkJCQkJCSAgICAgICBzcC0+U0NwLnRoaXNfcmVzaWR1YWwsCisJCQkJCQkJICAgICAgIHNwLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlzcC0+U0NwLnB0ciA9IChjaGFyICopICgodW5zaWduZWQgbG9uZylzcC0+U0NwLmhhdmVfZGF0YV9pbik7CisJCX0gZWxzZSB7CisJCQlzcC0+U0NwLnB0ciA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzcC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc3AtPmJ1ZmZlcjsKKwkJc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gc2J1c19tYXBfc2coZXNwLT5zZGV2LAorCQkJCQkJICAgICAgIHNwLT5TQ3AuYnVmZmVyLAorCQkJCQkJICAgICAgIHNwLT51c2Vfc2csCisJCQkJCQkgICAgICAgc3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gc2dfZG1hX2xlbihzcC0+U0NwLmJ1ZmZlcik7CisJCXNwLT5TQ3AucHRyID0gKGNoYXIgKikgKCh1bnNpZ25lZCBsb25nKXNnX2RtYV9hZGRyZXNzKHNwLT5TQ3AuYnVmZmVyKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3BfcmVsZWFzZV9kbWFidWZzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJaWYgKHNwLT51c2Vfc2cpIHsKKwkJc2J1c191bm1hcF9zZyhlc3AtPnNkZXYsIHNwLT5idWZmZXIsIHNwLT51c2Vfc2csCisJCQkgICAgICBzcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0gZWxzZSBpZiAoc3AtPnJlcXVlc3RfYnVmZmxlbikgeworCQlzYnVzX3VubWFwX3NpbmdsZShlc3AtPnNkZXYsCisJCQkJICBzcC0+U0NwLmhhdmVfZGF0YV9pbiwKKwkJCQkgIHNwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJICBzcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0KK30KKworc3RhdGljIHZvaWQgZXNwX3Jlc3RvcmVfcG9pbnRlcnMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKwlzdHJ1Y3QgZXNwX3BvaW50ZXJzICplcCA9ICZlc3AtPmRhdGFfcG9pbnRlcnNbc3AtPmRldmljZS0+aWRdOworCisJc3AtPlNDcC5wdHIgPSBlcC0+c2F2ZWRfcHRyOworCXNwLT5TQ3AuYnVmZmVyID0gZXAtPnNhdmVkX2J1ZmZlcjsKKwlzcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBlcC0+c2F2ZWRfdGhpc19yZXNpZHVhbDsKKwlzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBlcC0+c2F2ZWRfYnVmZmVyc19yZXNpZHVhbDsKK30KKworc3RhdGljIHZvaWQgZXNwX3NhdmVfcG9pbnRlcnMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKwlzdHJ1Y3QgZXNwX3BvaW50ZXJzICplcCA9ICZlc3AtPmRhdGFfcG9pbnRlcnNbc3AtPmRldmljZS0+aWRdOworCisJZXAtPnNhdmVkX3B0ciA9IHNwLT5TQ3AucHRyOworCWVwLT5zYXZlZF9idWZmZXIgPSBzcC0+U0NwLmJ1ZmZlcjsKKwllcC0+c2F2ZWRfdGhpc19yZXNpZHVhbCA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwllcC0+c2F2ZWRfYnVmZmVyc19yZXNpZHVhbCA9IHNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKK30KKworLyogU29tZSBydWxlczoKKyAqCisgKiAgIDEpIE5ldmVyIGV2ZXIgcGFuaWMgd2hpbGUgc29tZXRoaW5nIGlzIGxpdmUgb24gdGhlIGJ1cy4KKyAqICAgICAgSWYgdGhlcmUgaXMgdG8gYmUgYW55IGNoYW5jZSBvZiBzeW5jaW5nIHRoZSBkaXNrcyB0aGlzCisgKiAgICAgIHJ1bGUgaXMgdG8gYmUgb2JleWVkLgorICoKKyAqICAgMikgQW55IHRhcmdldCB0aGF0IGNhdXNlcyBhIGZvdWwgY29uZGl0aW9uIHdpbGwgbm8gbG9uZ2VyCisgKiAgICAgIGhhdmUgc3luY2hyb25vdXMgdHJhbnNmZXJzIGRvbmUgdG8gaXQsIG5vIHF1ZXN0aW9ucworICogICAgICBhc2tlZC4KKyAqCisgKiAgIDMpIEtlZXAgcmVnaXN0ZXIgYWNjZXNzZXMgdG8gYSBtaW5pbXVtLiAgVGhpbmsgYWJvdXQgc29tZQorICogICAgICBkYXkgd2hlbiB3ZSBoYXZlIFhidXMgbWFjaGluZXMgdGhpcyBpcyBydW5uaW5nIG9uIGFuZAorICogICAgICB0aGUgRVNQIGNoaXAgaXMgb24gdGhlIG90aGVyIGVuZCBvZiB0aGUgbWFjaGluZSBvbiBhCisgKiAgICAgIGRpZmZlcmVudCBib2FyZCBmcm9tIHRoZSBjcHUgd2hlcmUgdGhpcyBpcyBydW5uaW5nLgorICovCisKKy8qIEZpcmUgb2ZmIGEgY29tbWFuZC4gIFdlIGFzc3VtZSB0aGUgYnVzIGlzIGZyZWUgYW5kIHRoYXQgdGhlIG9ubHkKKyAqIGNhc2Ugd2hlcmUgd2UgY291bGQgc2VlIGFuIGludGVycnVwdCBpcyB3aGVyZSB3ZSBoYXZlIGRpc2Nvbm5lY3RlZAorICogY29tbWFuZHMgYWN0aXZlIGFuZCB0aGV5IGFyZSB0cnlpbmcgdG8gcmVzZWxlY3QgdXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY2hlY2tfY21kKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJc3dpdGNoIChzcC0+Y21kX2xlbikgeworCWNhc2UgNjoKKwljYXNlIDEwOgorCWNhc2UgMTI6CisJCWVzcC0+ZXNwX3Nsb3djbWQgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVzcC0+ZXNwX3Nsb3djbWQgPSAxOworCQllc3AtPmVzcF9zY21kbGVmdCA9IHNwLT5jbWRfbGVuOworCQllc3AtPmVzcF9zY21kcCA9ICZzcC0+Y21uZFswXTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3N5bmNfbmVnb19tc2coc3RydWN0IGVzcCAqZXNwLCBpbnQgcGVyaW9kLCBpbnQgb2Zmc2V0KQoreworCWVzcC0+Y3VyX21zZ291dFswXSA9IEVYVEVOREVEX01FU1NBR0U7CisJZXNwLT5jdXJfbXNnb3V0WzFdID0gMzsKKwllc3AtPmN1cl9tc2dvdXRbMl0gPSBFWFRFTkRFRF9TRFRSOworCWVzcC0+Y3VyX21zZ291dFszXSA9IHBlcmlvZDsKKwllc3AtPmN1cl9tc2dvdXRbNF0gPSBvZmZzZXQ7CisJZXNwLT5tc2dvdXRfbGVuID0gNTsKK30KKworLyogU0laRSBpcyBpbiBiaXRzLCBjdXJyZW50bHkgSE1FIG9ubHkgc3VwcG9ydHMgMTYgYml0IHdpZGUgdHJhbnNmZXJzLiAqLworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3dpZGVfbmVnb19tc2coc3RydWN0IGVzcCAqZXNwLCBpbnQgc2l6ZSkKK3sKKwllc3AtPmN1cl9tc2dvdXRbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCWVzcC0+Y3VyX21zZ291dFsxXSA9IDI7CisJZXNwLT5jdXJfbXNnb3V0WzJdID0gRVhURU5ERURfV0RUUjsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDMyOgorCQllc3AtPmN1cl9tc2dvdXRbM10gPSAyOworCQlicmVhazsKKwljYXNlIDE2OgorCQllc3AtPmN1cl9tc2dvdXRbM10gPSAxOworCQlicmVhazsKKwljYXNlIDg6CisJZGVmYXVsdDoKKwkJZXNwLT5jdXJfbXNnb3V0WzNdID0gMDsKKwkJYnJlYWs7CisJfTsKKworCWVzcC0+bXNnb3V0X2xlbiA9IDQ7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9leGVjX2NtZChzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHI7CisJc3RydWN0IHNjc2lfZGV2aWNlICpTRHB0cjsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldjsKKwl2b2xhdGlsZSB1OCAqY21kcCA9IGVzcC0+ZXNwX2NvbW1hbmQ7CisJdTggdGhlX2VzcF9jb21tYW5kOworCWludCBsdW4sIHRhcmdldDsKKwlpbnQgaTsKKworCS8qIEhvbGQgb2ZmIGlmIHdlIGhhdmUgZGlzY29ubmVjdGVkIGNvbW1hbmRzIGFuZAorCSAqIGFuIElSUSBpcyBzaG93aW5nLi4uCisJICovCisJaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDICYmIEVTUF9JUlFfUChlc3AtPmRyZWdzKSkKKwkJcmV0dXJuOworCisJLyogR3JhYiBmaXJzdCBtZW1iZXIgb2YgdGhlIGlzc3VlIHF1ZXVlLiAqLworCVNDcHRyID0gZXNwLT5jdXJyZW50X1NDID0gcmVtb3ZlX2ZpcnN0X1NDKCZlc3AtPmlzc3VlX1NDKTsKKworCS8qIFNhZmUgdG8gcGFuaWMgaGVyZSBiZWNhdXNlIGN1cnJlbnRfU0MgaXMgbnVsbC4gKi8KKwlpZiAoIVNDcHRyKQorCQlwYW5pYygiZXNwOiBlc3BfZXhlY19jbWQgYW5kIGlzc3VlIHF1ZXVlIGlzIE5VTEwiKTsKKworCVNEcHRyID0gU0NwdHItPmRldmljZTsKKwllc3BfZGV2ID0gU0RwdHItPmhvc3RkYXRhOworCWx1biA9IFNDcHRyLT5kZXZpY2UtPmx1bjsKKwl0YXJnZXQgPSBTQ3B0ci0+ZGV2aWNlLT5pZDsKKworCWVzcC0+c25pcCA9IDA7CisJZXNwLT5tc2dvdXRfbGVuID0gMDsKKworCS8qIFNlbmQgaXQgb3V0IHdob2xlLCBvciBwaWVjZSBieSBwaWVjZT8gICBUaGUgRVNQCisJICogb25seSBrbm93cyBob3cgdG8gYXV0b21hdGljYWxseSBzZW5kIG91dCA2LCAxMCwKKwkgKiBhbmQgMTIgYnl0ZSBjb21tYW5kcy4gIEkgdXNlZCB0byB0aGluayB0aGF0IHRoZQorCSAqIExpbnV4IFNDU0kgY29kZSB3b3VsZCBuZXZlciB0aHJvdyBhbnl0aGluZyBvdGhlcgorCSAqIHRoYW4gdGhhdCB0byB1cywgYnV0IHRoZW4gYWdhaW4gdGhlcmUgaXMgdGhlCisJICogU0NTSSBnZW5lcmljIGRyaXZlciB3aGljaCBjYW4gc2VuZCB1cyBhbnl0aGluZy4KKwkgKi8KKwllc3BfY2hlY2tfY21kKGVzcCwgU0NwdHIpOworCisJLyogSWYgYXJiaXRyYXRpb24vc2VsZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSBFU1Agd2lsbCBsZWF2ZQorCSAqIEFUTiBhc3NlcnRlZCwgY2F1c2luZyB0aGUgdGFyZ2V0IHRvIGdvIGludG8gbWVzc2FnZSBvdXQKKwkgKiBwaGFzZS4gIFRoZSBFU1Agd2lsbCBmZWVkIHRoZSB0YXJnZXQgdGhlIGlkZW50aWZ5IGFuZCB0aGVuCisJICogdGhlIHRhcmdldCBjYW4gb25seSBsZWdhbGx5IGdvIHRvIG9uZSBvZiBjb21tYW5kLAorCSAqIGRhdGFpbi9vdXQsIHN0YXR1cywgb3IgbWVzc2FnZSBpbiBwaGFzZSwgb3Igc3RheSBpbiBtZXNzYWdlCisJICogb3V0IHBoYXNlIChzaG91bGQgd2UgYmUgdHJ5aW5nIHRvIHNlbmQgYSBzeW5jIG5lZ290aWF0aW9uCisJICogbWVzc2FnZSBhZnRlciB0aGUgaWRlbnRpZnkpLiAgSXQgaXMgbm90IGFsbG93ZWQgdG8gZHJvcAorCSAqIEJTWSwgYnV0IHNvbWUgYnVnZ3kgdGFyZ2V0cyBkbyBhbmQgd2UgY2hlY2sgZm9yIHRoaXMKKwkgKiBjb25kaXRpb24gaW4gdGhlIHNlbGVjdGlvbiBjb21wbGV0ZSBjb2RlLiAgTW9zdCBvZiB0aGUgdGltZQorCSAqIHdlJ2xsIG1ha2UgdGhlIGNvbW1hbmQgYnl0ZXMgYXZhaWxhYmxlIHRvIHRoZSBFU1AgYW5kIGl0CisJICogd2lsbCBub3QgaW50ZXJydXB0IHVzIHVudGlsIGl0IGZpbmlzaGVzIGNvbW1hbmQgcGhhc2UsIHdlCisJICogY2Fubm90IGRvIHRoaXMgZm9yIGNvbW1hbmQgc2l6ZXMgdGhlIEVTUCBkb2VzIG5vdAorCSAqIHVuZGVyc3RhbmQgYW5kIGluIHRoaXMgY2FzZSB3ZSdsbCBnZXQgaW50ZXJydXB0ZWQgcmlnaHQKKwkgKiB3aGVuIHRoZSB0YXJnZXQgZ29lcyBpbnRvIGNvbW1hbmQgcGhhc2UuCisJICoKKwkgKiBJdCBpcyBhYnNvbHV0ZWx5IF9pbGxlZ2FsXyBpbiB0aGUgcHJlc2VuY2Ugb2YgU0NTSS0yIGRldmljZXMKKwkgKiB0byB1c2UgdGhlIEVTUCBzZWxlY3Qgdy9vIEFUTiBjb21tYW5kLiAgV2hlbiBTQ1NJLTIgZGV2aWNlcyBhcmUKKwkgKiBwcmVzZW50IG9uIHRoZSBidXMgd2UgX211c3RfIGFsd2F5cyBnbyBzdHJhaWdodCB0byBtZXNzYWdlIG91dAorCSAqIHBoYXNlIHdpdGggYW4gaWRlbnRpZnkgbWVzc2FnZSBmb3IgdGhlIHRhcmdldC4gIEJlaW5nIHRoYXQKKwkgKiBzZWxlY3Rpb24gYXR0ZW1wdHMgaW4gU0NTSS0xIHcvbyBBVE4gd2FzIGFuIG9wdGlvbiwgZG9pbmcgU0NTSS0yCisJICogc2VsZWN0aW9ucyBzaG91bGQgbm90IGNvbmZ1c2UgU0NTSS0xIHdlIGhvcGUuCisJICovCisKKwlpZiAoZXNwX2Rldi0+c3luYykgeworCQkvKiB0aGlzIHRhcmdldHMgc3luYyBpcyBrbm93biAqLworI2lmbmRlZiBfX3NwYXJjX3Y5X18KK2RvX3N5bmNfa25vd246CisjZW5kaWYKKwkJaWYgKGVzcF9kZXYtPmRpc2Nvbm5lY3QpCisJCQkqY21kcCsrID0gSURFTlRJRlkoMSwgbHVuKTsKKwkJZWxzZQorCQkJKmNtZHArKyA9IElERU5USUZZKDAsIGx1bik7CisKKwkJaWYgKGVzcC0+ZXNwX3Nsb3djbWQpIHsKKwkJCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEFTIHwgRVNQX0NNRF9ETUEpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3NsY3Rfc3RvcCk7CisJCX0gZWxzZSB7CisJCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBIHwgRVNQX0NNRF9ETUEpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3NsY3Rfbm9ybSk7CisJCX0KKwl9IGVsc2UgaWYgKCEoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMTw8dGFyZ2V0KSkgfHwgIShlc3BfZGV2LT5kaXNjb25uZWN0KSkgeworCQkvKiBBZnRlciB0aGUgYm9vdHVwIFNDU0kgY29kZSBzZW5kcyBib3RoIHRoZQorCQkgKiBURVNUX1VOSVRfUkVBRFkgYW5kIElOUVVJUlkgY29tbWFuZHMgd2Ugd2FudAorCQkgKiB0byBhdCBsZWFzdCBhdHRlbXB0IGFsbG93aW5nIHRoZSBkZXZpY2UgdG8KKwkJICogZGlzY29ubmVjdC4KKwkJICovCisJCUVTUE1JU0MoKCJlc3A6IFNlbGVjdGluZyBkZXZpY2UgZm9yIGZpcnN0IHRpbWUuIHRhcmdldD0lZCAiCisJCQkgImx1bj0lZFxuIiwgdGFyZ2V0LCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJaWYgKCFTRHB0ci0+Ym9ya2VuICYmICFlc3BfZGV2LT5kaXNjb25uZWN0KQorCQkJZXNwX2Rldi0+ZGlzY29ubmVjdCA9IDE7CisKKwkJKmNtZHArKyA9IElERU5USUZZKDAsIGx1bik7CisJCWVzcC0+cHJldm1zZ291dCA9IE5PUDsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3NsY3Rfbm9ybSk7CisJCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEEgfCBFU1BfQ01EX0RNQSk7CisKKwkJLyogVGFrZSBubyBjaGFuY2VzLi4uICovCisJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7CisJfSBlbHNlIHsKKwkJLyogU29ycnksIEkgaGF2ZSBoYWQgd2F5IHRvbyBtYW55IHByb2JsZW1zIHdpdGgKKwkJICogdmFyaW91cyBDRFJPTSBkZXZpY2VzIG9uIEVTUC4gLURhdmVNCisJCSAqLworCQlpbnQgY2Ryb21faHdidWdfd2thcm91bmQgPSAwOworCisjaWZuZGVmIF9fc3BhcmNfdjlfXworCQkvKiBOZXZlciBhbGxvdyBkaXNjb25uZWN0cyBvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgb24KKwkJICogU3BhcmNTdGF0aW9uMSBhbmQgU3BhcmNTdGF0aW9uMSsuICBBbGxvd2luZyB0aG9zZQorCQkgKiB0byBiZSBlbmFibGVkIHNlZW1zIHRvIGxvY2t1cCB0aGUgbWFjaGluZSBjb21wbGV0ZWx5LgorCQkgKi8KKwkJaWYgKChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40QyB8IFNNXzRDX1NTMSkpIHx8CisJCSAgICAoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzFQTFVTKSkpIHsKKwkJCS8qIEJ1dCB3ZSBhcmUgbmljZSBhbmQgYWxsb3cgdGFwZXMgYW5kIHJlbW92YWJsZQorCQkJICogZGlza3MgKGJ1dCBub3QgQ0RST01zKSB0byBkaXNjb25uZWN0LgorCQkJICovCisJCQlpZihTRHB0ci0+dHlwZSA9PSBUWVBFX1RBUEUgfHwKKwkJCSAgIChTRHB0ci0+dHlwZSAhPSBUWVBFX1JPTSAmJiBTRHB0ci0+cmVtb3ZhYmxlKSkKKwkJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKKwkJCWVsc2UKKwkJCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMDsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQkJZXNwX2Rldi0+c3luYyA9IDE7CisJCQllc3AtPnNuaXAgPSAwOworCQkJZ290byBkb19zeW5jX2tub3duOworCQl9CisjZW5kaWYgLyogIShfX3NwYXJjX3Y5X18pICovCisKKwkJLyogV2UndmUgdGFsa2VkIHRvIHRoaXMgZ3V5IGJlZm9yZSwKKwkJICogYnV0IG5ldmVyIG5lZ290aWF0ZWQuICBMZXQncyB0cnksCisJCSAqIG5lZWQgdG8gYXR0ZW1wdCBXSURFIGZpcnN0LCBiZWZvcmUKKwkJICogc3luYyBuZWdvLCBhcyBwZXIgU0NTSSAyIHN0YW5kYXJkLgorCQkgKi8KKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUgJiYgIWVzcF9kZXYtPndpZGUpIHsKKwkJCWlmICghU0RwdHItPmJvcmtlbiAmJgorCQkJICAgU0RwdHItPnR5cGUgIT0gVFlQRV9ST00gJiYKKwkJCSAgIFNEcHRyLT5yZW1vdmFibGUgPT0gMCkgeworCQkJCWJ1aWxkX3dpZGVfbmVnb19tc2coZXNwLCAxNik7CisJCQkJZXNwX2Rldi0+d2lkZSA9IDE7CisJCQkJZXNwLT53bmlwID0gMTsKKwkJCQlnb3RvIGFmdGVyX25lZ29fbXNnX2J1aWx0OworCQkJfSBlbHNlIHsKKwkJCQllc3BfZGV2LT53aWRlID0gMTsKKwkJCQkvKiBGYWxsIHRocm91Z2ggYW5kIHRyeSBzeW5jLiAqLworCQkJfQorCQl9CisKKwkJaWYgKCFTRHB0ci0+Ym9ya2VuKSB7CisJCQlpZiAoKFNEcHRyLT50eXBlID09IFRZUEVfUk9NKSkgeworCQkJCS8qIE5pY2UgdHJ5IHN1Y2tlci4uLiAqLworCQkJCUVTUE1JU0MoKCJlc3AlZDogRGlzYWJsaW5nIHN5bmMgZm9yIGJ1Z2d5ICIKKwkJCQkJICJDRFJPTS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJCQkJY2Ryb21faHdidWdfd2thcm91bmQgPSAxOworCQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJCX0gZWxzZSBpZiAoU0RwdHItPnJlbW92YWJsZSAhPSAwKSB7CisJCQkJRVNQTUlTQygoImVzcCVkOiBOb3QgbmVnb3RpYXRpbmcgc3luYy93aWRlIGJ1dCAiCisJCQkJCSAiYWxsb3dpbmcgZGlzY29ubmVjdCBmb3IgcmVtb3ZhYmxlIG1lZGlhLlxuIiwKKwkJCQkJIGVzcC0+ZXNwX2lkKSk7CisJCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOworCQkJfSBlbHNlIHsKKwkJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgZXNwLT5zeW5jX2RlZnAsIDE1KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKKwkJfQorCQllc3BfZGV2LT5zeW5jID0gMTsKKwkJZXNwLT5zbmlwID0gMTsKKworYWZ0ZXJfbmVnb19tc2dfYnVpbHQ6CisJCS8qIEEgZml4IGZvciBicm9rZW4gU0NTSTEgdGFyZ2V0cywgd2hlbiB0aGV5IGRpc2Nvbm5lY3QKKwkJICogdGhleSBsb2NrIHVwIHRoZSBidXMgYW5kIGNvbmZ1c2UgRVNQLiAgU28gZGlzYWxsb3cKKwkJICogZGlzY29ubmVjdHMgZm9yIFNDU0kxIHRhcmdldHMgZm9yIG5vdyB1bnRpbCB3ZQorCQkgKiBmaW5kIGEgYmV0dGVyIGZpeC4KKwkJICoKKwkJICogQWRkZW5kdW06IFRoaXMgaXMgZnVubnksIEkgZmlndXJlZCBvdXQgd2hhdCB3YXMgZ29pbmcKKwkJICogICAgICAgICAgIG9uLiAgVGhlIGJsb3R6ZWQgU0NTSTEgdGFyZ2V0IHdvdWxkIGRpc2Nvbm5lY3QsCisJCSAqICAgICAgICAgICBvbmUgb2YgdGhlIG90aGVyIFNDU0kyIHRhcmdldHMgb3IgYm90aCB3b3VsZCBiZQorCQkgKiAgICAgICAgICAgZGlzY29ubmVjdGVkIGFzIHdlbGwuICBUaGUgU0NTSTEgdGFyZ2V0IHdvdWxkCisJCSAqICAgICAgICAgICBzdGF5IGRpc2Nvbm5lY3RlZCBsb25nIGVub3VnaCB0aGF0IHdlIHN0YXJ0CisJCSAqICAgICAgICAgICB1cCBhIGNvbW1hbmQgb24gb25lIG9mIHRoZSBTQ1NJMiB0YXJnZXRzLiAgQXMKKwkJICogICAgICAgICAgIHRoZSBFU1AgaXMgYXJiaXRyYXRpbmcgZm9yIHRoZSBidXMgdGhlIFNDU0kxCisJCSAqICAgICAgICAgICB0YXJnZXQgYmVnaW5zIHRvIGFyYml0cmF0ZSBhcyB3ZWxsIHRvIHJlc2VsZWN0CisJCSAqICAgICAgICAgICB0aGUgRVNQLiAgVGhlIFNDU0kxIHRhcmdldCByZWZ1c2VzIHRvIGRyb3AgaXQncworCQkgKiAgICAgICAgICAgSUQgYml0IG9uIHRoZSBkYXRhIGJ1cyBldmVuIHRob3VnaCB0aGUgRVNQIGlzCisJCSAqICAgICAgICAgICBhdCBJRCA3IGFuZCBpcyB0aGUgb2J2aW91cyB3aW5uZXIgZm9yIGFueQorCQkgKiAgICAgICAgICAgYXJiaXRyYXRpb24uICBUaGUgRVNQIGlzIGEgcG9vciBzcG9ydCBhbmQgcmVmdXNlcworCQkgKiAgICAgICAgICAgdG8gbG9zZSBhcmJpdHJhdGlvbiwgaXQgd2lsbCBjb250aW51ZSBpbmRlZmluaXRlbHkKKwkJICogICAgICAgICAgIHRyeWluZyB0byBhcmJpdHJhdGUgZm9yIHRoZSBidXMgYW5kIGNhbiBvbmx5IGJlCisJCSAqICAgICAgICAgICBzdG9wcGVkIHZpYSBhIGNoaXAgcmVzZXQgb3IgU0NTSSBidXMgcmVzZXQuCisJCSAqICAgICAgICAgICBUaGVyZWZvcmUgX25vXyBkaXNjb25uZWN0cyBmb3IgU0NTSTEgdGFyZ2V0cworCQkgKiAgICAgICAgICAgdGhhbmsgeW91IHZlcnkgbXVjaC4gOy0pCisJCSAqLworCQlpZigoKFNEcHRyLT5zY3NpX2xldmVsIDwgMykgJiYKKwkJICAgIChTRHB0ci0+dHlwZSAhPSBUWVBFX1RBUEUpICYmCisJCSAgICBTRHB0ci0+cmVtb3ZhYmxlID09IDApIHx8CisJCSAgICBjZHJvbV9od2J1Z193a2Fyb3VuZCB8fCBTRHB0ci0+Ym9ya2VuKSB7CisJCQlFU1BNSVNDKChLRVJOX0lORk8gImVzcCVkOiBEaXNhYmxpbmcgRElTQ09OTkVDVCBmb3IgdGFyZ2V0ICVkICIKKwkJCQkgImx1biAlZFxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJCWVzcF9kZXYtPmRpc2Nvbm5lY3QgPSAwOworCQkJKmNtZHArKyA9IElERU5USUZZKDAsIGx1bik7CisJCX0gZWxzZSB7CisJCQkqY21kcCsrID0gSURFTlRJRlkoMSwgbHVuKTsKKwkJfQorCisJCS8qIEVTUCBmaWZvIGlzIG9ubHkgc28gYmlnLi4uCisJCSAqIE1ha2UgdGhpcyBsb29rIGxpa2UgYSBzbG93IGNvbW1hbmQuCisJCSAqLworCQllc3AtPmVzcF9zbG93Y21kID0gMTsKKwkJZXNwLT5lc3Bfc2NtZGxlZnQgPSBTQ3B0ci0+Y21kX2xlbjsKKwkJZXNwLT5lc3Bfc2NtZHAgPSAmU0NwdHItPmNtbmRbMF07CisKKwkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQVMgfCBFU1BfQ01EX0RNQSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X21zZyk7CisJfQorCisJaWYgKCFlc3AtPmVzcF9zbG93Y21kKQorCQlmb3IgKGkgPSAwOyBpIDwgU0NwdHItPmNtZF9sZW47IGkrKykKKwkJCSpjbWRwKysgPSBTQ3B0ci0+Y21uZFtpXTsKKworCS8qIEhNRSBzdWNrcy4uLiAqLworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQorCQlzYnVzX3dyaXRlYigodGFyZ2V0ICYgMHhmKSB8IChFU1BfQlVTSURfUkVTRUxJRCB8IEVTUF9CVVNJRF9DVFIzMkJJVCksCisJCQkgICAgZXNwLT5lcmVncyArIEVTUF9CVVNJRCk7CisJZWxzZQorCQlzYnVzX3dyaXRlYih0YXJnZXQgJiA3LCBlc3AtPmVyZWdzICsgRVNQX0JVU0lEKTsKKwlpZiAoZXNwLT5wcmV2X3NvZmYgIT0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0IHx8CisJICAgIGVzcC0+cHJldl9zdHAgICE9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCB8fAorCSAgICAoZXNwLT5lcmV2ID4gZXNwMTAwYSAmJgorCSAgICAgZXNwLT5wcmV2X2NmZzMgIT0gZXNwLT5jb25maWczW3RhcmdldF0pKSB7CisJCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0OworCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc29mZiwgZXNwLT5lcmVncyArIEVTUF9TT0ZGKTsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3N0cCwgZXNwLT5lcmVncyArIEVTUF9TVFApOworCQlpZiAoZXNwLT5lcmV2ID4gZXNwMTAwYSkgeworCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbdGFyZ2V0XTsKKwkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCQl9CisJfQorCWkgPSAoY21kcCAtIGVzcC0+ZXNwX2NvbW1hbmQpOworCisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOyAvKiBHcnJyISAqLworCisJCS8qIFNldCB1cCB0aGUgRE1BIGFuZCBITUUgY291bnRlcnMgKi8KKwkJc2J1c193cml0ZWIoaSwgZXNwLT5lcmVncyArIEVTUF9UQ0xPVyk7CisJCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfVENNRUQpOworCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRkFTX1JMTyk7CisJCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBGQVNfUkhJKTsKKwkJZXNwX2NtZChlc3AsIHRoZV9lc3BfY29tbWFuZCk7CisKKwkJLyogVGFsayBhYm91dCB0b3VjaHkgaGFyZHdhcmUuLi4gKi8KKwkJZXNwLT5wcmV2X2htZV9kbWFjc3IgPSAoKGVzcC0+cHJldl9obWVfZG1hY3NyIHwKKwkJCQkJIChETUFfU0NTSV9ESVNBQiB8IERNQV9FTkFCTEUpKSAmCisJCQkJCX4oRE1BX1NUX1dSSVRFKSk7CisJCXNidXNfd3JpdGVsKDE2LCBlc3AtPmRyZWdzICsgRE1BX0NPVU5UKTsKKwkJc2J1c193cml0ZWwoZXNwLT5lc3BfY29tbWFuZF9kdm1hLCBlc3AtPmRyZWdzICsgRE1BX0FERFIpOworCQlzYnVzX3dyaXRlbChlc3AtPnByZXZfaG1lX2RtYWNzciwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCX0gZWxzZSB7CisJCXUzMiB0bXA7CisKKwkJLyogU2V0IHVwIHRoZSBETUEgYW5kIEVTUCBjb3VudGVycyAqLworCQlzYnVzX3dyaXRlYihpLCBlc3AtPmVyZWdzICsgRVNQX1RDTE9XKTsKKwkJc2J1c193cml0ZWIoMCwgZXNwLT5lcmVncyArIEVTUF9UQ01FRCk7CisJCXRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCQl0bXAgJj0gfkRNQV9TVF9XUklURTsKKwkJdG1wIHw9IERNQV9FTkFCTEU7CisJCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFlc2MxKSB7CisJCQlpZiAoaSkgLyogV29ya2Fyb3VuZCBFU0MgZ2F0ZSBhcnJheSBTQlVTIHJlcnVuIGJ1Zy4gKi8KKwkJCQlzYnVzX3dyaXRlbChQQUdFX1NJWkUsIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOworCQl9CisJCXNidXNfd3JpdGVsKGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKKworCQkvKiBUZWxsIEVTUCB0byAiZ28iLiAqLworCQllc3BfY21kKGVzcCwgdGhlX2VzcF9jb21tYW5kKTsKKwl9Cit9CisKKy8qIFF1ZXVlIGEgU0NTSSBjb21tYW5kIGRlbGl2ZXJlZCBmcm9tIHRoZSBtaWQtbGV2ZWwgTGludXggU0NTSSBjb2RlLiAqLworc3RhdGljIGludCBlc3BfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBlc3AgKmVzcDsKKworCS8qIFNldCB1cCBmdW5jIHB0ciBhbmQgaW5pdGlhbCBkcml2ZXIgY21kLXBoYXNlLiAqLworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCVNDcG50LT5TQ3AucGhhc2UgPSBub3RfaXNzdWVkOworCisJLyogV2UgdXNlIHRoZSBzY3JhdGNoIGFyZWEuICovCisJRVNQUVVFVUUoKCJlc3BfcXVldWU6IHRhcmdldD0lZCBsdW49JWQgIiwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1bikpOworCUVTUERJU0MoKCJOPCUwMngsJTAyeD4iLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmRldmljZS0+bHVuKSk7CisKKwllc3AgPSAoc3RydWN0IGVzcCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwllc3BfZ2V0X2RtYWJ1ZnMoZXNwLCBTQ3BudCk7CisJZXNwX3NhdmVfcG9pbnRlcnMoZXNwLCBTQ3BudCk7IC8qIEZJWE1FIGZvciB0YWcgcXVldWVpbmcgKi8KKworCVNDcG50LT5TQ3AuU3RhdHVzICAgICAgICAgICA9IENIRUNLX0NPTkRJVElPTjsKKwlTQ3BudC0+U0NwLk1lc3NhZ2UgICAgICAgICAgPSAweGZmOworCVNDcG50LT5TQ3Auc2VudF9jb21tYW5kICAgICA9IDA7CisKKwkvKiBQbGFjZSBpbnRvIG91ciBxdWV1ZS4gKi8KKwlpZiAoU0NwbnQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgeworCQlFU1BRVUVVRSgoIlJRU0VOU0VcbiIpKTsKKwkJcHJlcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOworCX0gZWxzZSB7CisJCUVTUFFVRVVFKCgiXG4iKSk7CisJCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOworCX0KKworCS8qIFJ1biBpdCBub3cgaWYgd2UgY2FuLiAqLworCWlmICghZXNwLT5jdXJyZW50X1NDICYmICFlc3AtPnJlc2V0dGluZ19idXMpCisJCWVzcF9leGVjX2NtZChlc3ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIER1bXAgZHJpdmVyIHN0YXRlLiAqLworc3RhdGljIHZvaWQgZXNwX2R1bXBfY21kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyKQoreworCUVTUExPRygoIlt0Z3Q8JTAyeD4gbHVuPCUwMng+ICIKKwkJInBwaGFzZTwlcz4gY3BoYXNlPCVzPl0iLAorCQlTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuLAorCQlwaGFzZV9zdHJpbmcoU0NwdHItPlNDcC5zZW50X2NvbW1hbmQpLAorCQlwaGFzZV9zdHJpbmcoU0NwdHItPlNDcC5waGFzZSkpKTsKK30KKworc3RhdGljIHZvaWQgZXNwX2R1bXBfc3RhdGUoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworI2lmZGVmIERFQlVHX0VTUF9DTURTCisJaW50IGk7CisjZW5kaWYKKworCUVTUExPRygoImVzcCVkOiBkdW1waW5nIHN0YXRlXG4iLCBlc3AtPmVzcF9pZCkpOworCUVTUExPRygoImVzcCVkOiBkbWEgLS0gY29uZF9yZWc8JTA4eD4gYWRkcjwlMDh4PlxuIiwKKwkJZXNwLT5lc3BfaWQsCisJCXNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpLAorCQlzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQUREUikpKTsKKwlFU1BMT0coKCJlc3AlZDogU1cgW3NyZWc8JTAyeD4gc3N0ZXA8JTAyeD4gaXJlZzwlMDJ4Pl1cbiIsCisJCWVzcC0+ZXNwX2lkLCBlc3AtPnNyZWcsIGVzcC0+c2VxcmVnLCBlc3AtPmlyZWcpKTsKKwlFU1BMT0coKCJlc3AlZDogSFcgcmVyZWFkIFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAorCQllc3AtPmVzcF9pZCwKKwkJc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUyksCisJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TU1RFUCksCisJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpKSk7CisjaWZkZWYgREVCVUdfRVNQX0NNRFMKKwlwcmludGsoImVzcCVkOiBsYXN0IEVTUCBjbWRzIFsiLCBlc3AtPmVzcF9pZCk7CisJaSA9IChlc3AtPmVzcGNtZGVudCAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7IGVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOyBwcmludGsoIj4iKTsKKwlpID0gKGkgLSAxKSAmIDMxOworCXByaW50aygiPCIpOyBlc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsgcHJpbnRrKCI+Iik7CisJaSA9IChpIC0gMSkgJiAzMTsKKwlwcmludGsoIjwiKTsgZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7IHByaW50aygiPiIpOworCWkgPSAoaSAtIDEpICYgMzE7CisJcHJpbnRrKCI8Iik7IGVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOyBwcmludGsoIj4iKTsKKwlwcmludGsoIl1cbiIpOworI2VuZGlmIC8qIChERUJVR19FU1BfQ01EUykgKi8KKworCWlmIChTQ3B0cikgeworCQlFU1BMT0coKCJlc3AlZDogY3VycmVudCBjb21tYW5kICIsIGVzcC0+ZXNwX2lkKSk7CisJCWVzcF9kdW1wX2NtZChTQ3B0cik7CisJfQorCUVTUExPRygoIlxuIikpOworCVNDcHRyID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZCAiLCBlc3AtPmVzcF9pZCkpOworCXdoaWxlIChTQ3B0cikgeworCQllc3BfZHVtcF9jbWQoU0NwdHIpOworCQlTQ3B0ciA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIFNDcHRyLT5ob3N0X3NjcmliYmxlOworCX0KKwlFU1BMT0coKCJcbiIpKTsKK30KKworLyogQWJvcnQgYSBjb21tYW5kLiAgVGhlIGhvc3RfbG9jayBpcyBhY3F1aXJlZCBieSBjYWxsZXIuICovCitzdGF0aWMgaW50IGVzcF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0cikKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSAoc3RydWN0IGVzcCAqKSBTQ3B0ci0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgZG9uOworCisJRVNQTE9HKCgiZXNwJWQ6IEFib3J0aW5nIGNvbW1hbmRcbiIsIGVzcC0+ZXNwX2lkKSk7CisJZXNwX2R1bXBfc3RhdGUoZXNwKTsKKworCS8qIFdoZWVlLCBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IGNvbW1hbmQgb24gdGhlIGJ1cywgdGhlCisJICogYmVzdCB3ZSBjYW4gZG8gaXMgYXNzZXJ0IEFUTiBhbmQgd2FpdCBmb3IgbXNnb3V0IHBoYXNlLgorCSAqIFRoaXMgc2hvdWxkIGV2ZW4gZml4IGEgaHVuZyBTQ1NJIGJ1cyB3aGVuIHdlIGxvc2Ugc3RhdGUKKwkgKiBpbiB0aGUgZHJpdmVyIGFuZCB0aW1lb3V0IGJlY2F1c2UgdGhlIGV2ZW50dWFsIHBoYXNlIGNoYW5nZQorCSAqIHdpbGwgY2F1c2UgdGhlIEVTUCB0byAoZXZlbnR1YWxseSkgZ2l2ZSBhbiBpbnRlcnJ1cHQuCisJICovCisJaWYgKGVzcC0+Y3VycmVudF9TQyA9PSBTQ3B0cikgeworCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBBQk9SVDsKKwkJZXNwLT5tc2dvdXRfbGVuID0gMTsKKwkJZXNwLT5tc2dvdXRfY3RyID0gMDsKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCS8qIElmIGl0IGlzIHN0aWxsIGluIHRoZSBpc3N1ZSBxdWV1ZSB0aGVuIHdlIGNhbiBzYWZlbHkKKwkgKiBjYWxsIHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgYW5kIHJlcG9ydCBhYm9ydCBzdWNjZXNzLgorCSAqLworCWRvbiA9IChzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9JTlRfRU5BQik7CisJaWYgKGRvbikgeworCQlFU1BfSU5UU09GRihlc3AtPmRyZWdzKTsKKwl9CisJaWYgKGVzcC0+aXNzdWVfU0MpIHsKKwkJc3RydWN0IHNjc2lfY21uZCAqKnByZXYsICp0aGlzOworCQlmb3IgKHByZXYgPSAoJmVzcC0+aXNzdWVfU0MpLCB0aGlzID0gZXNwLT5pc3N1ZV9TQzsKKwkJICAgICB0aGlzICE9IE5VTEw7CisJCSAgICAgcHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICoqKSAmKHRoaXMtPmhvc3Rfc2NyaWJibGUpLAorCQkJICAgICB0aGlzID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgdGhpcy0+aG9zdF9zY3JpYmJsZSkgeworCisJCQlpZiAodGhpcyA9PSBTQ3B0cikgeworCQkJCSpwcmV2ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgdGhpcy0+aG9zdF9zY3JpYmJsZTsKKwkJCQl0aGlzLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCQkJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCB0aGlzKTsKKwkJCQl0aGlzLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJdGhpcy0+c2NzaV9kb25lKHRoaXMpOworCisJCQkJaWYgKGRvbikKKwkJCQkJRVNQX0lOVFNPTihlc3AtPmRyZWdzKTsKKworCQkJCXJldHVybiBTVUNDRVNTOworCQkJfQorCQl9CisJfQorCisJLyogWXVjaywgdGhlIGNvbW1hbmQgdG8gYWJvcnQgaXMgZGlzY29ubmVjdGVkLCBpdCBpcyBub3QKKwkgKiB3b3J0aCB0cnlpbmcgdG8gYWJvcnQgaXQgbm93IGlmIHNvbWV0aGluZyBlbHNlIGlzIGxpdmUKKwkgKiBvbiB0aGUgYnVzIGF0IHRoaXMgdGltZS4gIFNvLCB3ZSBsZXQgdGhlIFNDU0kgY29kZSB3YWl0CisJICogYSBsaXR0bGUgYml0IGFuZCB0cnkgYWdhaW4gbGF0ZXIuCisJICovCisJaWYgKGVzcC0+Y3VycmVudF9TQykgeworCQlpZiAoZG9uKQorCQkJRVNQX0lOVFNPTihlc3AtPmRyZWdzKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKiBJdCdzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gcmUtZXN0YWJsaXNoCisJICogdGhlIG5leHVzIGFuZCB0ZWxsIHRoZSBkZXZpY2UgdG8gYWJvcnQuICBIb3dldmVyLCB3ZSByZWFsbHkKKwkgKiBjYW5ub3QgJ3JlY29ubmVjdCcgcGVyIHNlLiAgRG9uJ3QgdHJ5IHRvIGJlIGZhbmN5LCBqdXN0CisJICogaW5kaWNhdGUgZmFpbHVyZSwgd2hpY2ggY2F1c2VzIG91ciBjYWxsZXIgdG8gcmVzZXQgdGhlIHdob2xlCisJICogYnVzLgorCSAqLworCisJaWYgKGRvbikKKwkJRVNQX0lOVFNPTihlc3AtPmRyZWdzKTsKKworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qIFdlJ3ZlIHNlbnQgRVNQX0NNRF9SUyB0byB0aGUgRVNQLCB0aGUgaW50ZXJydXB0IGhhZCBqdXN0CisgKiBhcnJpdmVkIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgU0NTSSBidXMgcmVzZXQuICBPdXIgam9iCisgKiBpcyB0byBjbGVhbiBvdXQgdGhlIGNvbW1hbmQgcXVldWVzIGFuZCBiZWdpbiByZS1leGVjdXRpb24KKyAqIG9mIFNDU0kgY29tbWFuZHMgb25jZSBtb3JlLgorICovCitzdGF0aWMgaW50IGVzcF9maW5pc2hfcmVzZXQoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNwID0gZXNwLT5jdXJyZW50X1NDOworCisJLyogQ2xlYW4gdXAgY3VycmVudGx5IGV4ZWN1dGluZyBjb21tYW5kLCBpZiBhbnkuICovCisJaWYgKHNwICE9IE5VTEwpIHsKKwkJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKworCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgc3ApOworCQlzcC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7CisKKwkJc3AtPnNjc2lfZG9uZShzcCk7CisJfQorCisJLyogQ2xlYW4gdXAgZGlzY29ubmVjdGVkIHF1ZXVlLCB0aGV5IGhhdmUgYmVlbiBpbnZhbGlkYXRlZAorCSAqIGJ5IHRoZSBidXMgcmVzZXQuCisJICovCisJaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDKSB7CisJCXdoaWxlICgoc3AgPSByZW1vdmVfZmlyc3RfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDKSkgIT0gTlVMTCkgeworCQkJZXNwX3JlbGVhc2VfZG1hYnVmcyhlc3AsIHNwKTsKKwkJCXNwLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKworCQkJc3AtPnNjc2lfZG9uZShzcCk7CisJCX0KKwl9CisKKwkvKiBTQ1NJIGJ1cyByZXNldCBpcyBjb21wbGV0ZS4gKi8KKwllc3AtPnJlc2V0dGluZ19idXMgPSAwOworCXdha2VfdXAoJmVzcC0+cmVzZXRfcXVldWUpOworCisJLyogT2ssIG5vdyBpdCBpcyBzYWZlIHRvIGdldCBjb21tYW5kcyBnb2luZyBvbmNlIG1vcmUuICovCisJaWYgKGVzcC0+aXNzdWVfU0MpCisJCWVzcF9leGVjX2NtZChlc3ApOworCisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19yZXNldGJ1cyhzdHJ1Y3QgZXNwICplc3ApCit7CisJRVNQTE9HKCgiZXNwJWQ6IFJlc2V0dGluZyBzY3NpIGJ1c1xuIiwgZXNwLT5lc3BfaWQpKTsKKwllc3AtPnJlc2V0dGluZ19idXMgPSAxOworCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1JTKTsKKworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogUmVzZXQgRVNQIGNoaXAsIHJlc2V0IGhhbmdpbmcgYnVzLCB0aGVuIGtpbGwgYWN0aXZlIGFuZAorICogZGlzY29ubmVjdGVkIGNvbW1hbmRzIGZvciB0YXJnZXRzIHdpdGhvdXQgc29mdCByZXNldC4KKyAqCisgKiBUaGUgaG9zdF9sb2NrIGlzIGFjcXVpcmVkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIGludCBlc3BfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwdHIpCit7CisJc3RydWN0IGVzcCAqZXNwID0gKHN0cnVjdCBlc3AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkodm9pZCkgZXNwX2RvX3Jlc2V0YnVzKGVzcCk7CisKKwlzcGluX3VubG9ja19pcnEoZXNwLT5laG9zdC0+aG9zdF9sb2NrKTsKKworCXdhaXRfZXZlbnQoZXNwLT5yZXNldF9xdWV1ZSwgKGVzcC0+cmVzZXR0aW5nX2J1cyA9PSAwKSk7CisKKwlzcGluX2xvY2tfaXJxKGVzcC0+ZWhvc3QtPmhvc3RfbG9jayk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogSW50ZXJuYWwgRVNQIGRvbmUgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCBlc3BfZG9uZShzdHJ1Y3QgZXNwICplc3AsIGludCBlcnJvcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpkb25lX1NDID0gZXNwLT5jdXJyZW50X1NDOworCisJZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKKworCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBkb25lX1NDKTsKKwlkb25lX1NDLT5yZXN1bHQgPSBlcnJvcjsKKworCWRvbmVfU0MtPnNjc2lfZG9uZShkb25lX1NDKTsKKworCS8qIEJ1cyBpcyBmcmVlLCBpc3N1ZSBhbnkgY29tbWFuZHMgaW4gdGhlIHF1ZXVlLiAqLworCWlmIChlc3AtPmlzc3VlX1NDICYmICFlc3AtPmN1cnJlbnRfU0MpCisJCWVzcF9leGVjX2NtZChlc3ApOworCit9CisKKy8qIFdoZWVlLCBFU1AgaW50ZXJydXB0IGVuZ2luZS4gKi8gIAorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3BoYXNlX2RldGVybWluZShzdHJ1Y3QgZXNwICplc3ApOworc3RhdGljIGludCBlc3BfZG9fZGF0YV9maW5hbGUoc3RydWN0IGVzcCAqZXNwKTsKK3N0YXRpYyBpbnQgZXNwX3NlbGVjdF9jb21wbGV0ZShzdHJ1Y3QgZXNwICplc3ApOworc3RhdGljIGludCBlc3BfZG9fc3RhdHVzKHN0cnVjdCBlc3AgKmVzcCk7CitzdGF0aWMgaW50IGVzcF9kb19tc2dpbihzdHJ1Y3QgZXNwICplc3ApOworc3RhdGljIGludCBlc3BfZG9fbXNnaW5kb25lKHN0cnVjdCBlc3AgKmVzcCk7CitzdGF0aWMgaW50IGVzcF9kb19tc2dvdXQoc3RydWN0IGVzcCAqZXNwKTsKK3N0YXRpYyBpbnQgZXNwX2RvX2NtZGJlZ2luKHN0cnVjdCBlc3AgKmVzcCk7CisKKyNkZWZpbmUgc3JlZ19kYXRhaW5wKF9fc3JlZykgICgoKF9fc3JlZykgJiBFU1BfU1RBVF9QTUFTSykgPT0gRVNQX0RJUCkKKyNkZWZpbmUgc3JlZ19kYXRhb3V0cChfX3NyZWcpICgoKF9fc3JlZykgJiBFU1BfU1RBVF9QTUFTSykgPT0gRVNQX0RPUCkKKworLyogUmVhZCBhbnkgYnl0ZXMgZm91bmQgaW4gdGhlIEZBUzM2NiBmaWZvLCBzdG9yaW5nIHRoZW0gaW50bworICogdGhlIEVTUCBkcml2ZXIgc29mdHdhcmUgc3RhdGUgc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBobWVfZmlmb19yZWFkKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwl1OCBjb3VudCA9IDA7CisJdTggc3RhdHVzID0gZXNwLT5zcmVnOworCisJLyogQ2Fubm90IHNhZmVseSBmcm9iIHRoZSBmaWZvIGZvciB0aGVzZSBmb2xsb3dpbmcgY2FzZXMsIGJ1dAorCSAqIHdlIG11c3QgYWx3YXlzIHJlYWQgdGhlIGZpZm8gd2hlbiB0aGUgcmVzZWxlY3QgaW50ZXJydXB0CisJICogaXMgcGVuZGluZy4KKwkgKi8KKwlpZiAoKChlc3AtPmlyZWcgJiBFU1BfSU5UUl9SU0VMKSA9PSAwKQkmJgorCSAgICAoc3JlZ19kYXRhaW5wKHN0YXR1cykJCXx8CisJICAgICBzcmVnX2RhdGFvdXRwKHN0YXR1cykJCXx8CisJICAgICAoZXNwLT5jdXJyZW50X1NDICYmCisJICAgICAgZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UgPT0gaW5fZGF0YV9kb25lKSkpIHsKKwkJRVNQSE1FKCgiPHdrYXJvdW5kX3NraXBwZWQ+IikpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgZmNudCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUzsKKworCQkvKiBUaGUgSE1FIHN0b3JlcyBieXRlcyBpbiBtdWx0aXBsZXMgb2YgMiBpbiB0aGUgZmlmby4gKi8KKwkJRVNQSE1FKCgiaG1lX2ZpZm9bZmNudD0lZCIsIChpbnQpZmNudCkpOworCQl3aGlsZSAoZmNudCkgeworCQkJZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlcltjb3VudCsrXSA9CisJCQkJc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKKwkJCWVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQrK10gPQorCQkJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCQlFU1BITUUoKCI8JTAyeCwlMDJ4PiIsIGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQtMl0sIGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQtMV0pKTsKKwkJCWZjbnQtLTsKKwkJfQorCQlpZiAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpICYgRVNQX1NUQVQyX0YxQllURSkgeworCQkJRVNQSE1FKCgiPHBva2VfYnl0ZT4iKSk7CisJCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKKwkJCWVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQrK10gPQorCQkJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCQlFU1BITUUoKCI8JTAyeCwweDAwPiIsIGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQtMV0pKTsKKwkJCUVTUEhNRSgoIkNNRF9GTFVTSCIpKTsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJfSBlbHNlIHsKKwkJCUVTUEhNRSgoIm5vX3h0cmFfYnl0ZSIpKTsKKwkJfQorCX0KKwlFU1BITUUoKCJ3a2FybmRfY250PSVkXSIsIChpbnQpY291bnQpKTsKKwllc3AtPmhtZV9maWZvX3dvcmthcm91bmRfY291bnQgPSBjb3VudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhtZV9maWZvX3B1c2goc3RydWN0IGVzcCAqZXNwLCB1OCAqYnl0ZXMsIHU4IGNvdW50KQoreworCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwl3aGlsZSAoY291bnQpIHsKKwkJdTggdG1wID0gKmJ5dGVzKys7CisJCXNidXNfd3JpdGViKHRtcCwgZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQljb3VudC0tOworCX0KK30KKworLyogV2UgdHJ5IHRvIGF2b2lkIHNvbWUgaW50ZXJydXB0cyBieSBqdW1waW5nIGFoZWFkIGFuZCBzZWUgaWYgdGhlIEVTUAorICogaGFzIGdvdHRlbiBmYXIgZW5vdWdoIHlldC4gIEhlbmNlIHRoZSBmb2xsb3dpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNraXBhaGVhZDEoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCisJCQkgICAgIGludCBwcmV2X3BoYXNlLCBpbnQgbmV3X3BoYXNlKQoreworCWlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZSkKKwkJcmV0dXJuIDA7CisJaWYgKEVTUF9JUlFfUChlc3AtPmRyZWdzKSkgeworCQkvKiBZZXMsIHdlIGFyZSBhYmxlIHRvIHNhdmUgYW4gaW50ZXJydXB0LiAqLworCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJCWVzcC0+c3JlZzIgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTMik7CisJCWVzcC0+c3JlZyA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTKSAmIH4oRVNQX1NUQVRfSU5UUikpOworCQllc3AtPmlyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKTsKKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCS8qIFRoaXMgY2hpcCBpcyByZWFsbHkgbG9zaW5nLiAqLworCQkJRVNQSE1FKCgiSE1FWyIpKTsKKwkJCS8qIE11c3QgbGF0Y2ggZmlmbyBiZWZvcmUgcmVhZGluZyB0aGUgaW50ZXJydXB0CisJCQkgKiByZWdpc3RlciBlbHNlIGdhcmJhZ2UgZW5kcyB1cCBpbiB0aGUgRklGTworCQkJICogd2hpY2ggY29uZnVzZXMgdGhlIGRyaXZlciB1dHRlcmx5LgorCQkJICogSGFwcHkgTWVhbCBpbmRlZWQuLi4uCisJCQkgKi8KKwkJCUVTUEhNRSgoImZpZm9fd29ya2Fyb3VuZF0iKSk7CisJCQlpZiAoIShlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0ZFTVBUWSkgfHwKKwkJCSAgICAoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GMUJZVEUpKQorCQkJCWhtZV9maWZvX3JlYWQoZXNwKTsKKwkJfQorCQlpZiAoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJcmV0dXJuIGRvX3Jlc2V0X2NvbXBsZXRlOworCX0KKwkvKiBIbyBodW0sIHRhcmdldCBpcyB0YWtpbmcgZm9yZXZlci4uLiAqLworCXNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IG5ld19waGFzZTsgLyogc28gd2UgZG9uJ3QgcmVjdXJzZS4uLiAqLworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2tpcGFoZWFkMihzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKKwkJCSAgICAgaW50IHByZXZfcGhhc2UxLCBpbnQgcHJldl9waGFzZTIsIGludCBuZXdfcGhhc2UpCit7CisJaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCAhPSBwcmV2X3BoYXNlMSAmJgorCSAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTIpCisJCXJldHVybiAwOworCWlmIChFU1BfSVJRX1AoZXNwLT5kcmVncykpIHsKKwkJLyogWWVzLCB3ZSBhcmUgYWJsZSB0byBzYXZlIGFuIGludGVycnVwdC4gKi8KKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCQllc3AtPnNyZWcyID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpOworCQllc3AtPnNyZWcgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUykgJiB+KEVTUF9TVEFUX0lOVFIpKTsKKwkJZXNwLT5pcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7CisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQkvKiBUaGlzIGNoaXAgaXMgcmVhbGx5IGxvc2luZy4gKi8KKwkJCUVTUEhNRSgoIkhNRVsiKSk7CisKKwkJCS8qIE11c3QgbGF0Y2ggZmlmbyBiZWZvcmUgcmVhZGluZyB0aGUgaW50ZXJydXB0CisJCQkgKiByZWdpc3RlciBlbHNlIGdhcmJhZ2UgZW5kcyB1cCBpbiB0aGUgRklGTworCQkJICogd2hpY2ggY29uZnVzZXMgdGhlIGRyaXZlciB1dHRlcmx5LgorCQkJICogSGFwcHkgTWVhbCBpbmRlZWQuLi4uCisJCQkgKi8KKwkJCUVTUEhNRSgoImZpZm9fd29ya2Fyb3VuZF0iKSk7CisJCQlpZiAoIShlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0ZFTVBUWSkgfHwKKwkJCSAgICAoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GMUJZVEUpKQorCQkJCWhtZV9maWZvX3JlYWQoZXNwKTsKKwkJfQorCQlpZiAoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJcmV0dXJuIGRvX3Jlc2V0X2NvbXBsZXRlOworCX0KKwkvKiBIbyBodW0sIHRhcmdldCBpcyB0YWtpbmcgZm9yZXZlci4uLiAqLworCXNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IG5ld19waGFzZTsgLyogc28gd2UgZG9uJ3QgcmVjdXJzZS4uLiAqLworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogTm93IHNvbWUgZG1hIGhlbHBlcnMuICovCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IGVzcCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwl1MzIgbnJlZyA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOworCisJaWYgKHdyaXRlKQorCQlucmVnIHw9IERNQV9TVF9XUklURTsKKwllbHNlCisJCW5yZWcgJj0gfihETUFfU1RfV1JJVEUpOworCW5yZWcgfD0gRE1BX0VOQUJMRTsKKwlzYnVzX3dyaXRlbChucmVnLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkgeworCQkvKiBUaGlzIEVTQyBnYXRlIGFycmF5IHN1Y2tzISAqLworCQlfX3UzMiBzcmMgPSBhZGRyOworCQlfX3UzMiBkZXN0ID0gc3JjICsgY291bnQ7CisKKwkJaWYgKGRlc3QgJiAoUEFHRV9TSVpFIC0gMSkpCisJCQljb3VudCA9IFBBR0VfQUxJR04oY291bnQpOworCQlzYnVzX3dyaXRlbChjb3VudCwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7CisJfQorCXNidXNfd3JpdGVsKGFkZHIsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kcmFpbihzdHJ1Y3QgZXNwICplc3ApCit7CisJdTMyIHRtcDsKKworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWhtZSkKKwkJcmV0dXJuOworCWlmICgodG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikpICYgRE1BX0ZJRk9fSVNEUkFJTikgeworCQlzd2l0Y2ggKGVzcC0+ZG1hLT5yZXZpc2lvbikgeworCQlkZWZhdWx0OgorCQkJdG1wIHw9IERNQV9GSUZPX1NURFJBSU47CisJCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQljYXNlIGR2bWFyZXYzOgorCQljYXNlIGR2bWFlc2MxOgorCQkJd2hpbGUgKHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpICYgRE1BX0ZJRk9fSVNEUkFJTikKKwkJCQl1ZGVsYXkoMSk7CisJCX07CisJfQorfQorCitzdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgZXNwICplc3ApCit7CisJdTMyIHRtcDsKKworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWhtZSkgeworCQlzYnVzX3dyaXRlbChETUFfUlNUX1NDU0ksIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQllc3AtPnByZXZfaG1lX2RtYWNzciA9ICgoZXNwLT5wcmV2X2htZV9kbWFjc3IgfAorCQkJCQkgKERNQV9QQVJJVFlfT0ZGIHwgRE1BXzJDTEtTIHwKKwkJCQkJICBETUFfU0NTSV9ESVNBQiB8IERNQV9JTlRfRU5BQikpICYKKwkJCQkJfihETUFfU1RfV1JJVEUgfCBETUFfRU5BQkxFKSk7CisKKwkJc2J1c193cml0ZWwoMCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlzYnVzX3dyaXRlbChlc3AtPnByZXZfaG1lX2RtYWNzciwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCisJCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGhhdmluZyB0aGUgU0NTSSBjaGFubmVsCisJCSAqIGVuZ2luZSBsb2NrIHVwIG9uIHVzLgorCQkgKi8KKwkJc2J1c193cml0ZWwoMCwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKKwl9IGVsc2UgeworCQl3aGlsZSAoKHRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpKSAmIERNQV9QRU5EX1JFQUQpCisJCQl1ZGVsYXkoMSk7CisKKwkJdG1wICY9IH4oRE1BX0VOQUJMRSB8IERNQV9TVF9XUklURSB8IERNQV9CQ05UX0VOQUIpOworCQl0bXAgfD0gRE1BX0ZJRk9fSU5WOworCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJdG1wICY9IH5ETUFfRklGT19JTlY7CisJCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9mbGFzaGNsZWFyKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlkbWFfZHJhaW4oZXNwKTsKKwlkbWFfaW52YWxpZGF0ZShlc3ApOworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKwlfX3UzMiBiYXNlLCBlbmQsIHN6OworCisJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hcmV2MykgeworCQlzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJaWYgKHN6ID4gMHgxMDAwMDAwKQorCQkJc3ogPSAweDEwMDAwMDA7CisJfSBlbHNlIHsKKwkJYmFzZSA9ICgoX191MzIpKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AucHRyKSk7CisJCWJhc2UgJj0gKDB4MTAwMDAwMCAtIDEpOworCQllbmQgPSAoYmFzZSArIHNwLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJCWlmIChlbmQgPiAweDEwMDAwMDApCisJCQllbmQgPSAweDEwMDAwMDA7CisJCXN6ID0gKGVuZCAtIGJhc2UpOworCX0KKwlyZXR1cm4gc3o7Cit9CisKKy8qIE1pc2MuIGVzcCBoZWxwZXIgbWFjcm9zLiAqLworI2RlZmluZSBlc3Bfc2V0Y291bnQoX19lcmVncywgX19jbnQsIF9faG1lKSBcCisJc2J1c193cml0ZWIoKChfX2NudCkmMHhmZiksIChfX2VyZWdzKSArIEVTUF9UQ0xPVyk7IFwKKwlzYnVzX3dyaXRlYigoKChfX2NudCk+PjgpJjB4ZmYpLCAoX19lcmVncykgKyBFU1BfVENNRUQpOyBcCisJaWYgKF9faG1lKSB7IFwKKwkJc2J1c193cml0ZWIoKCgoX19jbnQpPj4xNikmMHhmZiksIChfX2VyZWdzKSArIEZBU19STE8pOyBcCisJCXNidXNfd3JpdGViKDAsIChfX2VyZWdzKSArIEZBU19SSEkpOyBcCisJfQorCisjZGVmaW5lIGVzcF9nZXRjb3VudChfX2VyZWdzLCBfX2htZSkgXAorCSgoc2J1c19yZWFkYigoX19lcmVncykgKyBFU1BfVENMT1cpJjB4ZmYpIHwgXAorCSAoKHNidXNfcmVhZGIoKF9fZXJlZ3MpICsgRVNQX1RDTUVEKSYweGZmKSA8PCA4KSB8IFwKKyAgICAgICAgICgoX19obWUpID8gc2J1c19yZWFkYigoX19lcmVncykgKyBGQVNfUkxPKSA8PCAxNiA6IDApKQorCisjZGVmaW5lIGZjb3VudChfX2VzcCkgXAorCSgoKF9fZXNwKS0+ZXJldiA9PSBmYXNobWUpID8gXAorCSAgKF9fZXNwKS0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9jb3VudCA6IFwKKwkgIHNidXNfcmVhZGIoKChfX2VzcCktPmVyZWdzKSArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUykKKworI2RlZmluZSBmbnplcm8oX19lc3ApIFwKKwkoKChfX2VzcCktPmVyZXYgPT0gZmFzaG1lKSA/IDAgOiBcCisJIHNidXNfcmVhZGIoKChfX2VzcCktPmVyZWdzKSArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX09OT1RaRVJPKQorCisvKiBYWFggc3BlY3VsYXRpdmUgbm9wcyB1bm5lY2Vzc2FyeSB3aGVuIGNvbnRpbnVpbmcgYW1pZHN0IGEgZGF0YSBwaGFzZQorICogWFhYIGV2ZW4gb24gZXNwMTAwISEhICBhbm90aGVyIGNhc2Ugb2YgZmxvb2RpbmcgdGhlIGJ1cyB3aXRoIEkvTyByZWcKKyAqIFhYWCB3cml0ZXMuLi4KKyAqLworI2RlZmluZSBlc3BfbWF5YmVfbm9wKF9fZXNwKSBcCisJaWYgKChfX2VzcCktPmVyZXYgPT0gZXNwMTAwKSBcCisJCWVzcF9jbWQoKF9fZXNwKSwgRVNQX0NNRF9OVUxMKQorCisjZGVmaW5lIHNyZWdfdG9fZGF0YXBoYXNlKF9fc3JlZykgXAorCSgoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApID8gaW5fZGF0YW91dCA6IGluX2RhdGFpbikKKworLyogVGhlIEVTUDEwMCB3aGVuIGluIHN5bmNocm9ub3VzIGRhdGEgcGhhc2UsIGNhbiBtaXN0YWtlIGEgbG9uZyBmaW5hbAorICogUkVRIHB1bHNlIGZyb20gdGhlIHRhcmdldCBhcyBhbiBleHRyYSBieXRlLCBpdCBwbGFjZXMgd2hhdGV2ZXIgaXMgb24KKyAqIHRoZSBkYXRhIGxpbmVzIGludG8gdGhlIGZpZm8uICBGb3Igbm93LCB3ZSB3aWxsIGFzc3VtZSB3aGVuIHRoaXMKKyAqIGhhcHBlbnMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgYml0IHF1aXJreSBhbmQgd2UgZG9uJ3Qgd2FudCB0bworICogYmUgdGFsa2luZyBzeW5jaHJvbm91c2x5IHRvIGl0IGFueXdheXMuICBSZWdhcmRsZXNzLCB3ZSBuZWVkIHRvCisgKiB0ZWxsIHRoZSBFU1AgdG8gZWF0IHRoZSBleHRyYW5lb3VzIGJ5dGUgc28gdGhhdCB3ZSBjYW4gcHJvY2VlZAorICogdG8gdGhlIG5leHQgcGhhc2UuCisgKi8KK3N0YXRpYyBpbnQgZXNwMTAwX3N5bmNfaHdidWcoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCwgaW50IGZpZm9jbnQpCit7CisJLyogRG8gbm90IHRvdWNoIHRoaXMgcGllY2Ugb2YgY29kZS4gKi8KKwlpZiAoKCEoZXNwLT5lcmV2ID09IGVzcDEwMCkpIHx8CisJICAgICghKHNyZWdfZGF0YWlucCgoZXNwLT5zcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUykpKSAmJgorCSAgICAgICAhZmlmb2NudCkgJiYKKwkgICAgICEoc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpICYmICFmbnplcm8oZXNwKSkpKSB7CisJCWlmIChzcC0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIEFzeW5jIG1vZGUgZm9yIHRoaXMgZ3V5LiAqLworCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7CisKKwkJLyogQWNrIHRoZSBib2d1cyBieXRlLCBidXQgc2V0IEFUTiBmaXJzdC4gKi8KKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX01PSyk7CisJCXJldHVybiAxOworCX0KK30KKworLyogVGhpcyBjbG9zZXMgdGhlIHdpbmRvdyBkdXJpbmcgYSBzZWxlY3Rpb24gd2l0aCBhIHJlc2VsZWN0IHBlbmRpbmcsIGJlY2F1c2UKKyAqIHdlIHVzZSBETUEgZm9yIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyB0aGUgRklGTyBzaG91bGQgaG9sZCB0aGUgY29ycmVjdAorICogY29udGVudHMgaWYgd2UgZ2V0IHJlc2VsZWN0ZWQgZHVyaW5nIHRoaXMgcHJvY2Vzcy4gIFNvIHdlIGp1c3QgbmVlZCB0bworICogYWNrIHRoZSBwb3NzaWJsZSBpbGxlZ2FsIGNtZCBpbnRlcnJ1cHQgcGVuZGluZyBvbiB0aGUgZXNwMTAwLgorICovCitzdGF0aWMgaW5saW5lIGludCBlc3AxMDBfcmVjb25uZWN0X2h3YnVnKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwl1OCB0bXA7CisKKwlpZiAoZXNwLT5lcmV2ICE9IGVzcDEwMCkKKwkJcmV0dXJuIDA7CisJdG1wID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7CisJaWYgKHRtcCAmIEVTUF9JTlRSX1NSKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyB2ZXJpZmllcyB0aGUgQlVTSUQgYml0cyBkdXJpbmcgYSByZXNlbGVjdGlvbiBzbyB0aGF0IHdlIGtub3cgd2hpY2gKKyAqIHRhcmdldCBpcyB0YWxraW5nIHRvIHVzLgorICovCitzdGF0aWMgaW5saW5lIGludCByZWNvbm5lY3RfdGFyZ2V0KHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpbnQgaXQsIG1lID0gZXNwLT5zY3NpX2lkX21hc2ssIHRhcmcgPSAwOworCisJaWYgKDIgIT0gZmNvdW50KGVzcCkpCisJCXJldHVybiAtMTsKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkvKiBITUUgZG9lcyBub3QgbGF0Y2ggaXQncyBvd24gQlVTIElEIGJpdHMgZHVyaW5nCisJCSAqIGEgcmVzZWxlY3Rpb24uICBBbHNvIHRoZSB0YXJnZXQgbnVtYmVyIGlzIGdpdmVuCisJCSAqIGFzIGFuIHVuc2lnbmVkIGNoYXIsIG5vdCBhcyBhIHNvbGUgYml0IG51bWJlcgorCQkgKiBsaWtlIHRoZSBvdGhlciBFU1AncyBkby4KKwkJICogSGFwcHkgTWVhbCBpbmRlZWQuLi4uCisJCSAqLworCQl0YXJnID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclswXTsKKwl9IGVsc2UgeworCQlpdCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCWlmICghKGl0ICYgbWUpKQorCQkJcmV0dXJuIC0xOworCQlpdCAmPSB+bWU7CisJCWlmIChpdCAmIChpdCAtIDEpKQorCQkJcmV0dXJuIC0xOworCQl3aGlsZSAoIShpdCAmIDEpKQorCQkJdGFyZysrLCBpdCA+Pj0gMTsKKwl9CisJcmV0dXJuIHRhcmc7Cit9CisKKy8qIFRoaXMgdmVyaWZpZXMgdGhlIGlkZW50aWZ5IGZyb20gdGhlIHRhcmdldCBzbyB0aGF0IHdlIGtub3cgd2hpY2ggbHVuIGlzCisgKiBiZWluZyByZWNvbm5lY3RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmVjb25uZWN0X2x1bihzdHJ1Y3QgZXNwICplc3ApCit7CisJaW50IGx1bjsKKworCWlmICgoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spICE9IEVTUF9NSVApCisJCXJldHVybiAtMTsKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJbHVuID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclsxXTsKKwllbHNlCisJCWx1biA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisKKwkvKiBZZXMsIHlvdSByZWFkIHRoaXMgY29ycmVjdGx5LiAgV2UgcmVwb3J0IGx1biBvZiB6ZXJvCisJICogaWYgd2Ugc2VlIHBhcml0eSBlcnJvci4gIEVTUCByZXBvcnRzIHBhcml0eSBlcnJvciBmb3IKKwkgKiB0aGUgbHVuIGJ5dGUsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBob3BlIHRvIHJlY292ZXIKKwkgKiBiZWNhdXNlIHRoZSB0YXJnZXQgaXMgY29ubmVjdGVkLgorCSAqLworCWlmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBpbGxlZ2FsIGJpdHMgYmVpbmcgc2V0IGluIHRoZSBsdW4uICovCisJaWYgKChsdW4gJiAweDQwKSB8fCAhKGx1biAmIDB4ODApKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbHVuICYgNzsKK30KKworLyogVGhpcyBwdXRzIHRoZSBkcml2ZXIgaW4gYSBzdGF0ZSB3aGVyZSBpdCBjYW4gcmV2aXRhbGl6ZSBhIGNvbW1hbmQgdGhhdAorICogaXMgYmVpbmcgY29udGludWVkIGR1ZSB0byByZXNlbGVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9jb25uZWN0KHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBzcC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKworCWlmIChlc3AtPnByZXZfc29mZiAgIT0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0IHx8CisJICAgIGVzcC0+cHJldl9zdHAgICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKKwkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKKwkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1tzcC0+ZGV2aWNlLT5pZF0pKSB7CisJCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0OworCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOworCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc29mZiwgZXNwLT5lcmVncyArIEVTUF9TT0ZGKTsKKwkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3N0cCwgZXNwLT5lcmVncyArIEVTUF9TVFApOworCQlpZiAoZXNwLT5lcmV2ID4gZXNwMTAwYSkgeworCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbc3AtPmRldmljZS0+aWRdOworCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7CisJCX0KKwl9CisJZXNwLT5jdXJyZW50X1NDID0gc3A7Cit9CisKKy8qIFRoaXMgd2lsbCBwbGFjZSB0aGUgY3VycmVudCB3b3JraW5nIGNvbW1hbmQgYmFjayBpbnRvIHRoZSBpc3N1ZSBxdWV1ZQorICogaWYgd2UgYXJlIHRvIHJlY2VpdmUgYSByZXNlbGVjdGlvbiBhbWlkc3QgYSBzZWxlY3Rpb24gYXR0ZW1wdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVzcF9yZWNvbm5lY3Qoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKwlpZiAoIWVzcC0+ZGlzY29ubmVjdGVkX1NDKQorCQlFU1BMT0coKCJlc3AlZDogV2VpcmQsIGJlaW5nIHJlc2VsZWN0ZWQgYnV0IGRpc2Nvbm5lY3RlZCAiCisJCQkiY29tbWFuZCBxdWV1ZSBpcyBlbXB0eS5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJZXNwLT5zbmlwID0gMDsKKwllc3AtPmN1cnJlbnRfU0MgPSAwOworCXNwLT5TQ3AucGhhc2UgPSBub3RfaXNzdWVkOworCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgc3ApOworfQorCisvKiBCZWdpbiBtZXNzYWdlIGluIHBoYXNlLiAqLworc3RhdGljIGludCBlc3BfZG9fbXNnaW4oc3RydWN0IGVzcCAqZXNwKQoreworCS8qIE11c3QgYmUgdmVyeSBjYXJlZnVsIHdpdGggdGhlIGZpZm8gb24gdGhlIEhNRSAqLworCWlmICgoZXNwLT5lcmV2ICE9IGZhc2htZSkgfHwKKwkgICAgIShzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTMikgJiBFU1BfU1RBVDJfRkVNUFRZKSkKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCWVzcF9tYXliZV9ub3AoZXNwKTsKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJZXNwLT5tc2dpbl9sZW4gPSAxOworCWVzcC0+bXNnaW5fY3RyID0gMDsKKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luZG9uZSk7CisJcmV0dXJuIGRvX3dvcmtfYnVzOworfQorCisvKiBUaGlzIHVzZXMgdmFyaW91cyBETUEgY3NyIGZpZWxkcyBhbmQgdGhlIGZpZm8gZmxhZ3MgY291bnQgdmFsdWUgdG8KKyAqIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZW50L3JlY2VpdmVkIGJ5IHRoZSBFU1AuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVzcF9ieXRlc19zZW50KHN0cnVjdCBlc3AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJaW50IHJ2YWwgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQUREUikgLSBlc3AtPmVzcF9jb21tYW5kX2R2bWE7CisKKwlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFyZXYxKQorCQlydmFsIC09ICg0IC0gKChzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9SRUFEX0FIRUFEKT4+MTEpKTsKKwlyZXR1cm4gcnZhbCAtIGZpZm9fY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHZhbmNlX3NnKHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworCSsrc3AtPlNDcC5idWZmZXI7CisJLS1zcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gc2dfZG1hX2xlbihzcC0+U0NwLmJ1ZmZlcik7CisJc3AtPlNDcC5wdHIgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZylzZ19kbWFfYWRkcmVzcyhzcC0+U0NwLmJ1ZmZlcikpOworfQorCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB3YXkgSSd2ZSBjb2RlZCB0aGVzZSByb3V0aW5lcyBpcyB0aGF0IEkgX2Fsd2F5c18KKyAqIGNoZWNrIGZvciBhIGRpc2Nvbm5lY3QgZHVyaW5nIGFueSBhbmQgYWxsIGluZm9ybWF0aW9uIHRyYW5zZmVyCisgKiBwaGFzZXMuICBUaGUgU0NTSSBzdGFuZGFyZCBzdGF0ZXMgdGhhdCB0aGUgdGFyZ2V0IF9jYW5fIGNhdXNlIGEgQlVTCisgKiBGUkVFIGNvbmRpdGlvbiBieSBkcm9wcGluZyBhbGwgTVNHL0NEL0lPL0JTWSBzaWduYWxzLiAgQWxzbyBub3RlCisgKiB0aGF0IGR1cmluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMgdGhlIHRhcmdldCBjb250cm9scyBldmVyeQorICogY2hhbmdlIGluIHBoYXNlLCB0aGUgb25seSB0aGluZyB0aGUgaW5pdGlhdG9yIGNhbiBkbyBpcyAiYXNrIiBmb3IKKyAqIGEgbWVzc2FnZSBvdXQgcGhhc2UgYnkgZHJpdmluZyBBVE4gdHJ1ZS4gIFRoZSB0YXJnZXQgY2FuLCBhbmQgc29tZXRpbWVzCisgKiB3aWxsLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHJlcXVlc3Qgc28gd2UgY2Fubm90IGFzc3VtZSBhbnl0aGluZyB3aGVuCisgKiB3ZSB0cnkgdG8gZm9yY2UgYSBtZXNzYWdlIG91dCBwaGFzZSB0byBhYm9ydC9yZXNldCBhIHRhcmdldC4gIE1vc3Qgb2YKKyAqIHRoZSB0aW1lIHRoZSB0YXJnZXQgd2lsbCBldmVudHVhbGx5IGJlIG5pY2UgYW5kIGdvIHRvIG1lc3NhZ2Ugb3V0LCBzbworICogd2UgbWF5IGhhdmUgdG8gaG9sZCBvbiB0byBvdXIgc3RhdGUgYWJvdXQgd2hhdCB3ZSB3YW50IHRvIHRlbGwgdGhlIHRhcmdldAorICogZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCisgKi8KKworLyogSSB0aGluayBJIGhhdmUgdGhpbmdzIHdvcmtpbmcgaGVyZSBjb3JyZWN0bHkuICBFdmVuIHBhcnRpYWwgdHJhbnNmZXJzCisgKiB3aXRoaW4gYSBidWZmZXIgb3Igc3ViLWJ1ZmZlciBzaG91bGQgbm90IHVwc2V0IHVzIGF0IGFsbCBubyBtYXR0ZXIKKyAqIGhvdyBiYWQgdGhlIHRhcmdldCBhbmQvb3IgRVNQIGZ1Y2tzIHRoaW5ncyB1cC4KKyAqLworc3RhdGljIGludCBlc3BfZG9fZGF0YShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IHRoaXNwaGFzZSwgaG11Y2g7CisKKwlFU1BEQVRBKCgiZXNwX2RvX2RhdGE6ICIpKTsKKwllc3BfbWF5YmVfbm9wKGVzcCk7CisJdGhpc3BoYXNlID0gc3JlZ190b19kYXRhcGhhc2UoZXNwLT5zcmVnKTsKKwllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgdGhpc3BoYXNlKTsKKwlFU1BEQVRBKCgibmV3cGhhc2U8JXM+ICIsICh0aGlzcGhhc2UgPT0gaW5fZGF0YWluKSA/ICJEQVRBSU4iIDogIkRBVEFPVVQiKSk7CisJaG11Y2ggPSBkbWFfY2FuX3RyYW5zZmVyKGVzcCwgU0NwdHIpOworCWlmIChobXVjaCA+ICg2NCAqIDEwMjQpICYmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSkKKwkJaG11Y2ggPSAoNjQgKiAxMDI0KTsKKwlFU1BEQVRBKCgiaG11Y2g8JWQ+ICIsIGhtdWNoKSk7CisJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKKworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCXUzMiB0bXAgPSBlc3AtPnByZXZfaG1lX2RtYWNzcjsKKworCQkvKiBBbHdheXMgc2V0IHRoZSBFU1AgY291bnQgcmVnaXN0ZXJzIGZpcnN0LiAqLworCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgaG11Y2gsIDEpOworCisJCS8qIEdldCB0aGUgRE1BIGNzciBjb21wdXRlZC4gKi8KKwkJdG1wIHw9IChETUFfU0NTSV9ESVNBQiB8IERNQV9FTkFCTEUpOworCQlpZiAodGhpc3BoYXNlID09IGluX2RhdGFpbikKKwkJCXRtcCB8PSBETUFfU1RfV1JJVEU7CisJCWVsc2UKKwkJCXRtcCAmPSB+KERNQV9TVF9XUklURSk7CisJCWVzcC0+cHJldl9obWVfZG1hY3NyID0gdG1wOworCisJCUVTUERBVEEoKCJETUF8VEkgLS0+IGRvX2ludHJfZW5kXG4iKSk7CisJCWlmICh0aGlzcGhhc2UgPT0gaW5fZGF0YWluKSB7CisJCQlzYnVzX3dyaXRlbChobXVjaCwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKKwkJfSBlbHNlIHsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQkJc2J1c193cml0ZWwoaG11Y2gsIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOworCQl9CisJCXNidXNfd3JpdGVsKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpU0NwdHItPlNDcC5wdHIpLCBlc3AtPmRyZWdzK0RNQV9BRERSKTsKKwkJc2J1c193cml0ZWwoZXNwLT5wcmV2X2htZV9kbWFjc3IsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9IGVsc2UgeworCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgaG11Y2gsIDApOworCQlkbWFfc2V0dXAoZXNwLCAoKF9fdTMyKSgodW5zaWduZWQgbG9uZylTQ3B0ci0+U0NwLnB0cikpLAorCQkJICBobXVjaCwgKHRoaXNwaGFzZSA9PSBpbl9kYXRhaW4pKTsKKwkJRVNQREFUQSgoIkRNQXxUSSAtLT4gZG9faW50cl9lbmRcbiIpKTsKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisJfQorCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogU2VlIGhvdyBzdWNjZXNzZnVsIHRoZSBkYXRhIHRyYW5zZmVyIHdhcy4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX2RhdGFfZmluYWxlKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCWludCBib2d1c19kYXRhID0gMCwgYnl0ZXNfc2VudCA9IDAsIGZpZm9jbnQsIGVjb3VudCA9IDA7CisKKwlFU1BEQVRBKCgiZXNwX2RvX2RhdGFfZmluYWxlOiAiKSk7CisKKwlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhaW4pIHsKKwkJaWYgKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpIHsKKwkJCS8qIFl1Y2ssIHBhcml0eSBlcnJvci4gIFRoZSBFU1AgYXNzZXJ0cyBBVE4KKwkJCSAqIHNvIHRoYXQgd2UgY2FuIGdvIHRvIG1lc3NhZ2Ugb3V0IHBoYXNlCisJCQkgKiBpbW1lZGlhdGVseSBhbmQgaW5mb3JtIHRoZSB0YXJnZXQgdGhhdAorCQkJICogc29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KKwkJCSAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IGRhdGEgYmFkIHBhcml0eSBkZXRlY3RlZC5cbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCWVzcC0+Y3VyX21zZ291dFswXSA9IElOSVRJQVRPUl9FUlJPUjsKKwkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7CisJCX0KKwkJZG1hX2RyYWluKGVzcCk7CisJfQorCWRtYV9pbnZhbGlkYXRlKGVzcCk7CisKKwkvKiBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgdGhlIGFib3ZlIHBhcml0eSBlcnJvciBjYXNlLiAqLworCWlmIChlc3AtPmlyZWcgIT0gRVNQX0lOVFJfQlNFUlYpIHsKKwkJLyogUGxlYXNlIGdvIHRvIG1zZ291dCBwaGFzZSwgcGxlYXNlIHBsZWFzZSBwbGVhc2UuLi4gKi8KKwkJRVNQTE9HKCgiZXNwJWQ6ICFCU0VSViBhZnRlciBkYXRhLCBwcm9iYWJseSB0byBtc2dvdXRcbiIsCisJCQllc3AtPmVzcF9pZCkpOworCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOworCX0JCisKKwkvKiBDaGVjayBmb3IgcGFydGlhbCB0cmFuc2ZlcnMgYW5kIG90aGVyIGhvcnJpYmxlIGV2ZW50cy4KKwkgKiBOb3RlLCBoZXJlIHdlIHJlYWQgdGhlIHJlYWwgZmlmbyBmbGFncyByZWdpc3RlciBldmVuCisJICogb24gSE1FIGJyb2tlbiBhZGFwdGVycyBiZWNhdXNlIHdlIHNraXAgdGhlIEhNRSBmaWZvCisJICogd29ya2Fyb3VuZCBjb2RlIGluIGVzcF9oYW5kbGUoKSBpZiB3ZSBhcmUgZG9pbmcgZGF0YQorCSAqIHBoYXNlIHRoaW5ncy4gIFdlIGRvbid0IHdhbnQgdG8gZnVjayBkaXJlY3RseSB3aXRoCisJICogdGhlIGZpZm8gbGlrZSB0aGF0LCBlc3BlY2lhbGx5IGlmIGRvaW5nIHN5bmNocm9ub3VzCisJICogdHJhbnNmZXJzISAgQWxzbywgd2lsbCBuZWVkIHRvIGRvdWJsZSB0aGUgY291bnQgb24KKwkgKiBITUUgaWYgd2UgYXJlIGRvaW5nIHdpZGUgdHJhbnNmZXJzLCBhcyB0aGUgSE1FIGZpZm8KKwkgKiB3aWxsIG1vdmUgYW5kIGNvdW50IDE2LWJpdCBxdWFudGl0aWVzIGR1cmluZyB3aWRlIGRhdGEuCisJICogU01DQyBfYW5kXyBRbG9naWMgY2FuIGJvdGggYml0ZSBtZS4KKwkgKi8KKwlmaWZvY250ID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUyk7CisJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpCisJCWVjb3VudCA9IGVzcF9nZXRjb3VudChlc3AtPmVyZWdzLCAwKTsKKwlieXRlc19zZW50ID0gZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemU7CisKKwlFU1BEQVRBKCgidHJhbnNfc3ooJWQpLCAiLCBieXRlc19zZW50KSk7CisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJaWYgKCEoZXNwLT5zcmVnICYgRVNQX1NUQVRfVENOVCkpIHsKKwkJCWVjb3VudCA9IGVzcF9nZXRjb3VudChlc3AtPmVyZWdzLCAxKTsKKwkJCWJ5dGVzX3NlbnQgLT0gZWNvdW50OworCQl9CisKKwkJLyogQWx3YXlzIHN1YnRyYWN0IGFueSBjcnVmdCByZW1haW5pbmcgaW4gdGhlIEZJRk8uICovCisJCWlmIChlc3AtPnByZXZfY2ZnMyAmIEVTUF9DT05GSUczX0VXSURFKQorCQkJZmlmb2NudCA8PD0gMTsKKwkJaWYgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKKwkJCWJ5dGVzX3NlbnQgLT0gZmlmb2NudDsKKworCQkvKiBJIGhhdmUgYW4gSUJNIGRpc2sgd2hpY2ggZXhoaWJpdHMgdGhlIGZvbGxvd2luZworCQkgKiBiZWhhdmlvciBkdXJpbmcgd3JpdGVzIHRvIGl0LiAgSXQgZGlzY29ubmVjdHMgaW4KKwkJICogdGhlIG1pZGRsZSBvZiBhIHBhcnRpYWwgdHJhbnNmZXIsIHRoZSBjdXJyZW50IHNnbGlzdAorCQkgKiBidWZmZXIgaXMgMTAyNCBieXRlcywgdGhlIGRpc2sgc3RvcHMgZGF0YSB0cmFuc2ZlcgorCQkgKiBhdCA1MTIgYnl0ZXMuCisJCSAqCisJCSAqIEhvd2V2ZXIgdGhlIEZBUzM2NiByZXBvcnRzIHRoYXQgMzIgbW9yZSBieXRlcyB3ZXJlCisJCSAqIHRyYW5zZmVycmVkIHRoYW4gcmVhbGx5IHdlcmUuICBUaGlzIGlzIHByZWNpc2VseQorCQkgKiB0aGUgc2l6ZSBvZiBhIGZ1bGx5IGxvYWRlZCBGSUZPIGluIHdpZGUgc2NzaSBtb2RlLgorCQkgKiBUaGUgRklGTyBzdGF0ZSByZWNvcmRlZCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBlbXB0eS4KKwkJICoKKwkJICogSSBoYXZlIG5vIGlkZWEgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgRkFTMzY2IGNoaXAKKwkJICogb3IgYSBidWcgaW4gdGhlIGZpcm13YXJlIG9uIHRoaXMgSUJNIGRpc2suICBJbiBhbnkKKwkJICogZXZlbnQgdGhlIGZvbGxvd2luZyBzZWVtcyB0byBiZSBhIGdvb2Qgd29ya2Fyb3VuZC4gIC1EYXZlTQorCQkgKi8KKwkJaWYgKGJ5dGVzX3NlbnQgIT0gZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgJiYKKwkJICAgIFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkgeworCQkJaW50IG1hc2sgPSAoNjQgLSAxKTsKKworCQkJaWYgKChlc3AtPnByZXZfY2ZnMyAmIEVTUF9DT05GSUczX0VXSURFKSA9PSAwKQorCQkJCW1hc2sgPj49IDE7CisKKwkJCWlmIChieXRlc19zZW50ICYgbWFzaykKKwkJCQlieXRlc19zZW50IC09IChieXRlc19zZW50ICYgbWFzayk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShlc3AtPnNyZWcgJiBFU1BfU1RBVF9UQ05UKSkKKwkJCWJ5dGVzX3NlbnQgLT0gZWNvdW50OworCQlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhb3V0KQorCQkJYnl0ZXNfc2VudCAtPSBmaWZvY250OworCX0KKworCUVTUERBVEEoKCJieXRlc19zZW50KCVkKSwgIiwgYnl0ZXNfc2VudCkpOworCisJLyogSWYgd2Ugd2VyZSBpbiBzeW5jaHJvbm91cyBtb2RlLCBjaGVjayBmb3IgcGVjdWxpYXJpdGllcy4gKi8KKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQlpZiAoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7CisJCQlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhb3V0KQorCQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJfSBlbHNlIHsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQpCisJCQlib2d1c19kYXRhID0gZXNwMTAwX3N5bmNfaHdidWcoZXNwLCBTQ3B0ciwgZmlmb2NudCk7CisJCWVsc2UKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwl9CisKKwkvKiBVbnRpbCB3ZSBhcmUgc3VyZSBvZiB3aGF0IGhhcyBoYXBwZW5lZCwgd2UgYXJlIGNlcnRhaW5seQorCSAqIGluIHRoZSBkYXJrLgorCSAqLworCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisKKwlpZiAoYnl0ZXNfc2VudCA8IDApIHsKKwkJLyogSSd2ZSBzZWVuIHRoaXMgaGFwcGVuIGR1ZSB0byBsb3N0IHN0YXRlIGluIHRoaXMKKwkJICogZHJpdmVyLiAgTm8gaWRlYSB3aHkgaXQgaGFwcGVuZWQsIGJ1dCBhbGxvd2luZworCQkgKiB0aGlzIHZhbHVlIHRvIGJlIG5lZ2F0aXZlIGNhdXNlZCB0aGluZ3MgdG8KKwkJICogbG9jayB1cC4gIFRoaXMgYWxsb3dzIGdyZWF0ZXIgY2hhbmNlIG9mIHJlY292ZXJ5LgorCQkgKiBJbiBmYWN0IGV2ZXJ5IHRpbWUgSSd2ZSBzZWVuIHRoaXMsIGl0IGhhcyBiZWVuCisJCSAqIGEgZHJpdmVyIGJ1ZyB3aXRob3V0IHF1ZXN0aW9uLgorCQkgKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IHlpZWVlLCBieXRlc19zZW50IDwgMCFcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCUVTUExPRygoImVzcCVkOiBjc3o9JWQgZmlmb2NvdW50PSVkIGVjb3VudD0lZFxuIiwKKwkJCWVzcC0+ZXNwX2lkLAorCQkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUsIGZpZm9jbnQsIGVjb3VudCkpOworCQlFU1BMT0coKCJlc3AlZDogdXNlX3NnPSVkIHB0cj0lcCB0aGlzX3Jlc2lkdWFsPSVkXG4iLAorCQkJZXNwLT5lc3BfaWQsCisJCQlTQ3B0ci0+dXNlX3NnLCBTQ3B0ci0+U0NwLnB0ciwgU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsKSk7CisJCUVTUExPRygoImVzcCVkOiBGb3JjaW5nIGFzeW5jIGZvciB0YXJnZXQgJWRcbiIsIGVzcC0+ZXNwX2lkLCAKKwkJCVNDcHRyLT5kZXZpY2UtPmlkKSk7CisJCVNDcHRyLT5kZXZpY2UtPmJvcmtlbiA9IDE7CisJCWVzcF9kZXYtPnN5bmMgPSAwOworCQlieXRlc19zZW50ID0gMDsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRlIG9mIG91ciB0cmFuc2Zlci4gKi8KKwlTQ3B0ci0+U0NwLnB0ciArPSBieXRlc19zZW50OworCVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCAtPSBieXRlc19zZW50OworCWlmIChTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgPCAwKSB7CisJCS8qIHNoaXQgKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IERhdGEgdHJhbnNmZXIgb3ZlcnJ1bi5cbiIsIGVzcC0+ZXNwX2lkKSk7CisJCVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCA9IDA7CisJfQorCisJLyogTWF5YmUgY29udGludWUuICovCisJaWYgKCFib2d1c19kYXRhKSB7CisJCUVTUERBVEEoKCIhYm9ndXNfZGF0YSwgIikpOworCisJCS8qIE5PIE1BVFRFUiBXSEFULCB3ZSBhZHZhbmNlIHRoZSBzY2F0dGVybGlzdCwKKwkJICogaWYgdGhlIHRhcmdldCBzaG91bGQgZGVjaWRlIHRvIGRpc2Nvbm5lY3QKKwkJICogaW4gYmV0d2VlbiBzY2F0dGVyIGNodW5rcyAod2hpY2ggaXMgY29tbW9uKQorCQkgKiB3ZSBjb3VsZCBkaWUgaG9ycmlibHkhICBJIHVzZWQgdG8gaGF2ZSB0aGUgc2cKKwkJICogYWR2YW5jZSBvY2N1ciBvbmx5IGlmIHdlIGFyZSBnb2luZyBiYWNrIGludG8KKwkJICogKG9yIGFyZSBzdGF5aW5nIGluKSBhIGRhdGEgcGhhc2UsIHlvdSBjYW4KKwkJICogaW1hZ2luZSB0aGUgaGVsbCBJIHdlbnQgdGhyb3VnaCB0cnlpbmcgdG8KKwkJICogZmlndXJlIHRoaXMgb3V0LgorCQkgKi8KKwkJaWYgKFNDcHRyLT51c2Vfc2cgJiYgIVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCkKKwkJCWFkdmFuY2Vfc2coU0NwdHIpOworCQlpZiAoc3JlZ19kYXRhaW5wKGVzcC0+c3JlZykgfHwgc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpKSB7CisJCQlFU1BEQVRBKCgidG8gbW9yZSBkYXRhXG4iKSk7CisJCQlyZXR1cm4gZXNwX2RvX2RhdGEoZXNwKTsKKwkJfQorCQlFU1BEQVRBKCgidG8gbmV3IHBoYXNlXG4iKSk7CisJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7CisJfQorCS8qIEJvZ3VzIGRhdGEsIGp1c3Qgd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQuICovCisJRVNQTE9HKCgiZXNwJWQ6IGJvZ3VzX2RhdGEgZHVyaW5nIGVuZCBvZiBkYXRhIHBoYXNlXG4iLAorCQllc3AtPmVzcF9pZCkpOworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworLyogV2UgcmVjZWl2ZWQgYSBub24tZ29vZCBzdGF0dXMgcmV0dXJuIGF0IHRoZSBlbmQgb2YKKyAqIHJ1bm5pbmcgYSBTQ1NJIGNvbW1hbmQuICBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIGlmCisgKiB3ZSBzaG91bGQgY2xlYXIgb3VyIHN5bmNocm9ub3VzIHRyYW5zZmVyIHN0YXRlIGZvcgorICogc3VjaCBhIGRldmljZSB3aGVuIHRoYXQgaGFwcGVucy4KKyAqCisgKiBUaGUgaWRlYSBpcyB0aGF0IHdoZW4gc3Bpbm5pbmcgdXAgYSBkaXNrIG9yIHJld2luZGluZworICogYSB0YXBlLCB3ZSBkb24ndCB3YW50IHRvIGdvIGludG8gYSBsb29wIHJlLW5lZ290aWF0aW5nCisgKiBzeW5jaHJvbm91cyBjYXBhYmlsaXRpZXMgb3ZlciBhbmQgb3Zlci4KKyAqLworc3RhdGljIGludCBlc3Bfc2hvdWxkX2NsZWFyX3N5bmMoc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisJdTggY21kMSA9IHNwLT5jbW5kWzBdOworCXU4IGNtZDIgPSBzcC0+ZGF0YV9jbW5kWzBdOworCisJLyogVGhlc2UgY2FzZXMgYXJlIGZvciBzcGlubmluZyB1cCBhIGRpc2sgYW5kCisJICogd2FpdGluZyBmb3IgdGhhdCBzcGludXAgdG8gY29tcGxldGUuCisJICovCisJaWYgKGNtZDEgPT0gU1RBUlRfU1RPUCB8fAorCSAgICBjbWQyID09IFNUQVJUX1NUT1ApCisJCXJldHVybiAwOworCisJaWYgKGNtZDEgPT0gVEVTVF9VTklUX1JFQURZIHx8CisJICAgIGNtZDIgPT0gVEVTVF9VTklUX1JFQURZKQorCQlyZXR1cm4gMDsKKworCS8qIE9uZSBtb3JlIHNwZWNpYWwgY2FzZSBmb3IgU0NTSSB0YXBlIGRyaXZlcywKKwkgKiB0aGlzIGlzIHdoYXQgaXMgdXNlZCB0byBwcm9iZSB0aGUgZGV2aWNlIGZvcgorCSAqIGNvbXBsZXRpb24gb2YgYSByZXdpbmQgb3IgdGFwZSBsb2FkIG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoc3AtPmRldmljZS0+dHlwZSA9PSBUWVBFX1RBUEUpIHsKKwkJaWYgKGNtZDEgPT0gTU9ERV9TRU5TRSB8fAorCQkgICAgY21kMiA9PSBNT0RFX1NFTlNFKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIEVpdGhlciBhIGNvbW1hbmQgaXMgY29tcGxldGluZyBvciBhIHRhcmdldCBpcyBkcm9wcGluZyBvZmYgdGhlIGJ1cworICogdG8gY29udGludWUgdGhlIGNvbW1hbmQgaW4gdGhlIGJhY2tncm91bmQgc28gd2UgY2FuIGRvIG90aGVyIHdvcmsuCisgKi8KK3N0YXRpYyBpbnQgZXNwX2RvX2ZyZWVidXMoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gU0NwdHItPmRldmljZS0+aG9zdGRhdGE7CisJaW50IHJ2YWw7CisKKwlydmFsID0gc2tpcGFoZWFkMihlc3AsIFNDcHRyLCBpbl9zdGF0dXMsIGluX21zZ2luZG9uZSwgaW5fZnJlZWluZyk7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCWlmIChlc3AtPmlyZWcgIT0gRVNQX0lOVFJfREMpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IFRhcmdldCB3aWxsIG5vdCBkaXNjb25uZWN0XG4iLCBlc3AtPmVzcF9pZCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOyAvKiB0YXJnZXQgd2lsbCBub3QgZHJvcCBCU1kuLi4gKi8KKwl9CisJZXNwLT5tc2dvdXRfbGVuID0gMDsKKwllc3AtPnByZXZtc2dvdXQgPSBOT1A7CisJaWYgKGVzcC0+cHJldm1zZ2luID09IENPTU1BTkRfQ09NUExFVEUpIHsKKwkJLyogTm9ybWFsIGVuZCBvZiBuZXh1cy4gKi8KKwkJaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDIHx8IChlc3AtPmVyZXYgPT0gZmFzaG1lKSkKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0VTRUwpOworCisJCWlmIChTQ3B0ci0+U0NwLlN0YXR1cyAhPSBHT09EICYmCisJCSAgICBTQ3B0ci0+U0NwLlN0YXR1cyAhPSBDT05ESVRJT05fR09PRCAmJgorCQkgICAgKCgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCkgJiBlc3AtPnRhcmdldHNfcHJlc2VudCkgJiYKKwkJICAgIGVzcF9kZXYtPnN5bmMgJiYKKwkJICAgIGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkgeworCQkJLyogU0NTSSBzdGFuZGFyZCBzYXlzIHRoYXQgdGhlIHN5bmNocm9ub3VzIGNhcGFiaWxpdGllcworCQkJICogc2hvdWxkIGJlIHJlbmVnb3RpYXRlZCBhdCB0aGlzIHBvaW50LiAgTW9zdCBsaWtlbHkKKwkJCSAqIHdlIGFyZSBhYm91dCB0byByZXF1ZXN0IHNlbnNlIGZyb20gdGhpcyB0YXJnZXQKKwkJCSAqIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBhdm9pZCB1c2luZyBzeW5jCisJCQkgKiB0cmFuc2ZlcnMgdW50aWwgd2UgYXJlIHN1cmUgb2YgdGhlIGN1cnJlbnQgdGFyZ2V0CisJCQkgKiBzdGF0ZS4KKwkJCSAqLworCQkJRVNQTUlTQygoImVzcDogU3RhdHVzIDwlZD4gZm9yIHRhcmdldCAlZCBsdW4gJWRcbiIsCisJCQkJIFNDcHRyLT5TQ3AuU3RhdHVzLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisKKwkJCS8qIEJ1dCBkb24ndCBkbyB0aGlzIHdoZW4gc3Bpbm5pbmcgdXAgYSBkaXNrIGF0CisJCQkgKiBib290IHRpbWUgd2hpbGUgd2UgcG9sbCBmb3IgY29tcGxldGlvbiBhcyBpdAorCQkJICogZmlsbHMgdXAgdGhlIGNvbnNvbGUgd2l0aCBtZXNzYWdlcy4gIEFsc28sIHRhcGVzCisJCQkgKiBjYW4gcmVwb3J0IG5vdCByZWFkeSBtYW55IHRpbWVzIHJpZ2h0IGFmdGVyCisJCQkgKiBsb2FkaW5nIHVwIGEgdGFwZS4KKwkJCSAqLworCQkJaWYgKGVzcF9zaG91bGRfY2xlYXJfc3luYyhTQ3B0cikgIT0gMCkKKwkJCQllc3BfZGV2LT5zeW5jID0gMDsKKwkJfQorCQlFU1BESVNDKCgiRjwlMDJ4LCUwMng+IiwgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOworCQllc3BfZG9uZShlc3AsICgoU0NwdHItPlNDcC5TdGF0dXMgJiAweGZmKSB8CisJCQkgICAgICAgKChTQ3B0ci0+U0NwLk1lc3NhZ2UgJiAweGZmKTw8OCkgfAorCQkJICAgICAgIChESURfT0sgPDwgMTYpKSk7CisJfSBlbHNlIGlmIChlc3AtPnByZXZtc2dpbiA9PSBESVNDT05ORUNUKSB7CisJCS8qIE5vcm1hbCBkaXNjb25uZWN0LiAqLworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9FU0VMKTsKKwkJRVNQRElTQygoIkQ8JTAyeCwlMDJ4PiIsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKKwkJYXBwZW5kX1NDKCZlc3AtPmRpc2Nvbm5lY3RlZF9TQywgU0NwdHIpOworCQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOworCQlpZiAoZXNwLT5pc3N1ZV9TQykKKwkJCWVzcF9leGVjX2NtZChlc3ApOworCX0gZWxzZSB7CisJCS8qIERyaXZlciBidWcsIHdlIGRvIG5vdCBleHBlY3QgYSBkaXNjb25uZWN0IGhlcmUKKwkJICogYW5kIHNob3VsZCBub3QgaGF2ZSBhZHZhbmNlZCB0aGUgc3RhdGUgZW5naW5lCisJCSAqIHRvIGluX2ZyZWVpbmcuCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogbGFzdCBtc2cgbm90IGRpc2MgYW5kIG5vdCBjbWQgY21wbHQuXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKKwl9CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCisvKiBXaGVuIGEgcmVzZWxlY3Qgb2NjdXJzLCBhbmQgd2UgY2Fubm90IGZpbmQgdGhlIGNvbW1hbmQgdG8KKyAqIHJlY29ubmVjdCB0byBpbiBvdXIgcXVldWVzLCB3ZSBkbyB0aGlzLgorICovCitzdGF0aWMgaW50IGVzcF9iYWRfcmVjb25uZWN0KHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcDsKKworCUVTUExPRygoImVzcCVkOiBFaWVlZWUsIHJlY29ubmVjdGluZyB1bmtub3duIGNvbW1hbmQhXG4iLAorCQllc3AtPmVzcF9pZCkpOworCUVTUExPRygoIlFVRVVFIERVTVBcbiIpKTsKKwlzcCA9IGVzcC0+aXNzdWVfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGlzc3VlX1NDWyIsIGVzcC0+ZXNwX2lkKSk7CisJd2hpbGUgKHNwKSB7CisJCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOworCQlzcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHNwLT5ob3N0X3NjcmliYmxlOworCX0KKwlFU1BMT0coKCJdXG4iKSk7CisJc3AgPSBlc3AtPmN1cnJlbnRfU0M7CisJRVNQTE9HKCgiZXNwJWQ6IGN1cnJlbnRfU0NbIiwgZXNwLT5lc3BfaWQpKTsKKwlpZiAoc3ApCisJCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOworCWVsc2UKKwkJRVNQTE9HKCgiPE5VTEw+IikpOworCUVTUExPRygoIl1cbiIpKTsKKwlzcCA9IGVzcC0+ZGlzY29ubmVjdGVkX1NDOworCUVTUExPRygoImVzcCVkOiBkaXNjb25uZWN0ZWRfU0NbIiwgZXNwLT5lc3BfaWQpKTsKKwl3aGlsZSAoc3ApIHsKKwkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7CisJCXNwID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgc3AtPmhvc3Rfc2NyaWJibGU7CisJfQorCUVTUExPRygoIl1cbiIpKTsKKwlyZXR1cm4gZG9fcmVzZXRfYnVzOworfQorCisvKiBEbyB0aGUgbmVlZHkgd2hlbiBhIHRhcmdldCB0cmllcyB0byByZWNvbm5lY3QgdG8gdXMuICovCitzdGF0aWMgaW50IGVzcF9kb19yZWNvbm5lY3Qoc3RydWN0IGVzcCAqZXNwKQoreworCWludCBsdW4sIHRhcmdldDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0cjsKKworCS8qIENoZWNrIGZvciBhbGwgYm9ndXMgY29uZGl0aW9ucyBmaXJzdC4gKi8KKwl0YXJnZXQgPSByZWNvbm5lY3RfdGFyZ2V0KGVzcCk7CisJaWYgKHRhcmdldCA8IDApIHsKKwkJRVNQRElTQygoImJhZCBidXMgYml0c1xuIikpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKwlsdW4gPSByZWNvbm5lY3RfbHVuKGVzcCk7CisJaWYgKGx1biA8IDApIHsKKwkJRVNQRElTQygoInRhcmdldD0lMngsIGJhZCBpZGVudGlmeSBtc2dcbiIsIHRhcmdldCkpOworCQlyZXR1cm4gZG9fcmVzZXRfYnVzOworCX0KKworCS8qIFRoaW5ncyBsb29rIG9rLi4uICovCisJRVNQRElTQygoIlI8JTAyeCwlMDJ4PiIsIHRhcmdldCwgbHVuKSk7CisKKwkvKiBNdXN0IG5vdCBmbHVzaCBGSUZPIG9yIERWTUEgb24gSE1FLiAqLworCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSB7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJaWYgKGVzcDEwMF9yZWNvbm5lY3RfaHdidWcoZXNwKSkKKwkJCXJldHVybiBkb19yZXNldF9idXM7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOworCX0KKworCVNDcHRyID0gcmVtb3ZlX1NDKCZlc3AtPmRpc2Nvbm5lY3RlZF9TQywgKHU4KSB0YXJnZXQsICh1OCkgbHVuKTsKKwlpZiAoIVNDcHRyKQorCQlyZXR1cm4gZXNwX2JhZF9yZWNvbm5lY3QoZXNwKTsKKworCWVzcF9jb25uZWN0KGVzcCwgU0NwdHIpOworCWVzcF9jbWQoZXNwLCBFU1BfQ01EX01PSyk7CisKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJc2J1c193cml0ZWIoKChTQ3B0ci0+ZGV2aWNlLT5pZCAmIDB4ZikgfAorCQkJICAgICAoRVNQX0JVU0lEX1JFU0VMSUQgfCBFU1BfQlVTSURfQ1RSMzJCSVQpKSwKKwkJCSAgICBlc3AtPmVyZWdzICsgRVNQX0JVU0lEKTsKKworCS8qIFJlY29ubmVjdCBpbXBsaWVzIGEgcmVzdG9yZSBwb2ludGVycyBvcGVyYXRpb24uICovCisJZXNwX3Jlc3RvcmVfcG9pbnRlcnMoZXNwLCBTQ3B0cik7CisKKwllc3AtPnNuaXAgPSAwOworCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCisvKiBFbmQgb2YgTkVYVVMgKGhvcGVmdWxseSksIHBpY2sgdXAgc3RhdHVzICsgbWVzc2FnZSBieXRlIHRoZW4gbGVhdmUgaWYKKyAqIGFsbCBnb2VzIHdlbGwuCisgKi8KK3N0YXRpYyBpbnQgZXNwX2RvX3N0YXR1cyhzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisJaW50IGludHIsIHJ2YWw7CisKKwlydmFsID0gc2tpcGFoZWFkMShlc3AsIFNDcHRyLCBpbl90aGVfZGFyaywgaW5fc3RhdHVzKTsKKwlpZiAocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisJaW50ciA9IGVzcC0+aXJlZzsKKwlFU1BTVEFUKCgiZXNwX2RvX3N0YXR1czogIikpOworCWlmIChpbnRyICE9IEVTUF9JTlRSX0RDKSB7CisJCWludCBtZXNzYWdlX291dCA9IDA7IC8qIGZvciBwYXJpdHkgcHJvYmxlbXMgKi8KKworCQkvKiBBY2sgdGhlIG1lc3NhZ2UuICovCisJCUVTUFNUQVQoKCJhY2sgbXNnLCAiKSk7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX01PSyk7CisKKwkJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpIHsKKwkJCWRtYV9mbGFzaGNsZWFyKGVzcCk7CisKKwkJCS8qIFdhaXQgdGlsbCB0aGUgZmlyc3QgYml0cyBzZXR0bGUuICovCisJCQl3aGlsZSAoZXNwLT5lc3BfY29tbWFuZFswXSA9PSAweGZmKQorCQkJCXVkZWxheSgxKTsKKwkJfSBlbHNlIHsKKwkJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyWzBdOworCQkJZXNwLT5lc3BfY29tbWFuZFsxXSA9IGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbMV07CisJCX0KKworCQlFU1BTVEFUKCgiZ290IHNvbWV0aGluZywgIikpOworCQkvKiBFU1AgY2hpbWVzIGluIHdpdGggb25lIG9mCisJCSAqCisJCSAqIDEpIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0OgorCQkgKglib3RoIHN0YXR1cyBhbmQgbWVzc2FnZSBpbiBieXRlcworCQkgKglhcmUgYXZhaWxhYmxlCisJCSAqCisJCSAqIDIpIGJ1cyBzZXJ2aWNlIGludGVycnVwdDoKKwkJICoJb25seSBzdGF0dXMgYnl0ZSB3YXMgYWNxdWlyZWQKKwkJICoKKwkJICogMykgQW55dGhpbmcgZWxzZToKKwkJICoJY2FuJ3QgaGFwcGVuLCBidXQgd2UgdGVzdCBmb3IgaXQKKwkJICoJYW55d2F5cworCQkgKgorCQkgKiBBTFNPOiBJZiBiYWQgcGFyaXR5IHdhcyBkZXRlY3RlZCBvbiBlaXRoZXIKKwkJICogICAgICAgdGhlIHN0YXR1cyBfb3JfIHRoZSBtZXNzYWdlIGJ5dGUgdGhlbgorCQkgKiAgICAgICB0aGUgRVNQIGhhcyBhc3NlcnRlZCBBVE4gb24gdGhlIGJ1cworCQkgKiAgICAgICBhbmQgd2UgbXVzdCB0aGVyZWZvcmUgd2FpdCBmb3IgdGhlCisJCSAqICAgICAgIG5leHQgcGhhc2UgY2hhbmdlLgorCQkgKi8KKwkJaWYgKGludHIgJiBFU1BfSU5UUl9GRE9ORSkgeworCQkJLyogV2UgZ290IGl0IGFsbCwgaGFsbGVqdWxpYS4gKi8KKwkJCUVTUFNUQVQoKCJnb3QgYm90aCwgIikpOworCQkJU0NwdHItPlNDcC5TdGF0dXMgPSBlc3AtPmVzcF9jb21tYW5kWzBdOworCQkJU0NwdHItPlNDcC5NZXNzYWdlID0gZXNwLT5lc3BfY29tbWFuZFsxXTsKKwkJCWVzcC0+cHJldm1zZ2luID0gU0NwdHItPlNDcC5NZXNzYWdlOworCQkJZXNwLT5jdXJfbXNnaW5bMF0gPSBTQ3B0ci0+U0NwLk1lc3NhZ2U7CisJCQlpZiAoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikgeworCQkJCS8qIFRoZXJlIHdhcyBiYWQgcGFyaXR5IGZvciB0aGUKKwkJCQkgKiBtZXNzYWdlIGJ5dGUsIHRoZSBzdGF0dXMgYnl0ZQorCQkJCSAqIHdhcyBvay4KKwkJCQkgKi8KKwkJCQltZXNzYWdlX291dCA9IE1TR19QQVJJVFlfRVJST1I7CisJCQl9CisJCX0gZWxzZSBpZiAoaW50ciA9PSBFU1BfSU5UUl9CU0VSVikgeworCQkJLyogT25seSBnb3Qgc3RhdHVzIGJ5dGUuICovCisJCQlFU1BMT0coKCJlc3AlZDogZ290IHN0YXR1cyBvbmx5LCAiLCBlc3AtPmVzcF9pZCkpOworCQkJaWYgKCEoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikpIHsKKwkJCQlTQ3B0ci0+U0NwLlN0YXR1cyA9IGVzcC0+ZXNwX2NvbW1hbmRbMF07CisJCQkJU0NwdHItPlNDcC5NZXNzYWdlID0gMHhmZjsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlIHN0YXR1cyBieXRlIGhhZCBiYWQgcGFyaXR5LgorCQkJCSAqIHdlIGxlYXZlIHRoZSBzY3NpX3BvaW50ZXIgU3RhdHVzCisJCQkJICogZmllbGQgYWxvbmUgYXMgd2Ugc2V0IGl0IHRvIGEgZGVmYXVsdAorCQkJCSAqIG9mIENIRUNLX0NPTkRJVElPTiBpbiBlc3BfcXVldWUuCisJCQkJICovCisJCQkJbWVzc2FnZV9vdXQgPSBJTklUSUFUT1JfRVJST1I7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gZXZlci4gKi8KKwkJCUVTUFNUQVQoKCJnb3QgYm9saXhlZFxuIikpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7CisJCX0KKworCQlpZiAoIW1lc3NhZ2Vfb3V0KSB7CisJCQlFU1BTVEFUKCgic3RhdHVzPSUyeCBtc2c9JTJ4LCAiLCBTQ3B0ci0+U0NwLlN0YXR1cywKKwkJCQlTQ3B0ci0+U0NwLk1lc3NhZ2UpKTsKKwkJCWlmIChTQ3B0ci0+U0NwLk1lc3NhZ2UgPT0gQ09NTUFORF9DT01QTEVURSkgeworCQkJCUVTUFNUQVQoKCJhbmQgd2FzIENPTU1BTkRfQ09NUExFVEVcbiIpKTsKKwkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fZnJlZWluZyk7CisJCQkJcmV0dXJuIGVzcF9kb19mcmVlYnVzKGVzcCk7CisJCQl9IGVsc2UgeworCQkJCUVTUExPRygoImVzcCVkOiBhbmQgX25vdF8gQ09NTUFORF9DT01QTEVURVxuIiwKKwkJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCQllc3AtPm1zZ2luX2xlbiA9IGVzcC0+bXNnaW5fY3RyID0gMTsKKwkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fbXNnaW5kb25lKTsKKwkJCQlyZXR1cm4gZXNwX2RvX21zZ2luZG9uZShlc3ApOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogV2l0aCBsdWNrIHdlJ2xsIGJlIGFibGUgdG8gbGV0IHRoZSB0YXJnZXQKKwkJCSAqIGtub3cgdGhhdCBiYWQgcGFyaXR5IGhhcHBlbmVkLCBpdCB3aWxsIGtub3cKKwkJCSAqIHdoaWNoIGJ5dGUgY2F1c2VkIHRoZSBwcm9ibGVtcyBhbmQgc2VuZCBpdAorCQkJICogYWdhaW4uICBGb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHN0YXR1cyBieXRlCisJCQkgKiByZWNlaXZlcyBiYWQgcGFyaXR5LCBJIGRvIG5vdCBiZWxpZXZlIG1vc3QKKwkJCSAqIHRhcmdldHMgcmVjb3ZlciB2ZXJ5IHdlbGwuICBXZSdsbCBzZWUuCisJCQkgKi8KKwkJCUVTUExPRygoImVzcCVkOiBiYWQgcGFyaXR5IHNvbWV3aGVyZSBtb3V0PSUyeFxuIiwKKwkJCQllc3AtPmVzcF9pZCwgbWVzc2FnZV9vdXQpKTsKKwkJCWVzcC0+Y3VyX21zZ291dFswXSA9IG1lc3NhZ2Vfb3V0OworCQkJZXNwLT5tc2dvdXRfbGVuID0gZXNwLT5tc2dvdXRfY3RyID0gMTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgZGlzY29ubmVjdCBub3csIGFsbCBoZWxsIGJyZWFrcyBsb29zZS4gKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IHdob29wcywgZGlzY29ubmVjdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX3N0YXR1cyhzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggdGhlY21kID0gRVNQX0NNRF9JQ0NTRVE7CisKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpIHsKKwkJdTMyIHRtcDsKKworCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwLT5lc3BfY29tbWFuZFsxXSA9IDB4ZmY7CisJCXNidXNfd3JpdGViKDIsIGVzcC0+ZXJlZ3MgKyBFU1BfVENMT1cpOworCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX1RDTUVEKTsKKwkJdG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCXRtcCB8PSAoRE1BX1NUX1dSSVRFIHwgRE1BX0VOQUJMRSk7CisJCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCQlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFlc2MxKQorCQkJc2J1c193cml0ZWwoMHgxMDAsIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOworCQlzYnVzX3dyaXRlbChlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7CisJCXRoZWNtZCB8PSBFU1BfQ01EX0RNQTsKKwl9CisJZXNwX2NtZChlc3AsIHRoZWNtZCk7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9zdGF0dXMpOworCisJcmV0dXJuIGVzcF9kb19zdGF0dXMoZXNwKTsKK30KKworc3RhdGljIGludCBlc3BfZGlzY29ubmVjdF9hbWlkc3RfcGhhc2VzKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcCA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IHNwLT5kZXZpY2UtPmhvc3RkYXRhOworCisJLyogVGhpcyBtZWFucyByZWFsIHByb2JsZW1zIGlmIHdlIHNlZSB0aGlzCisJICogaGVyZS4gIFVubGVzcyB3ZSB3ZXJlIGFjdHVhbGx5IHRyeWluZworCSAqIHRvIGZvcmNlIHRoZSBkZXZpY2UgdG8gYWJvcnQvcmVzZXQuCisJICovCisJRVNQTE9HKCgiZXNwJWQgRGlzY29ubmVjdCBhbWlkc3QgcGhhc2VzLCAiLCBlc3AtPmVzcF9pZCkpOworCUVTUExPRygoInBwaGFzZTwlcz4gY3BoYXNlPCVzPiwgIiwKKwkJcGhhc2Vfc3RyaW5nKHNwLT5TQ3AucGhhc2UpLAorCQlwaGFzZV9zdHJpbmcoc3AtPlNDcC5zZW50X2NvbW1hbmQpKSk7CisKKwlpZiAoZXNwLT5kaXNjb25uZWN0ZWRfU0MgIT0gTlVMTCB8fCAoZXNwLT5lcmV2ID09IGZhc2htZSkpCisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0VTRUwpOworCisJc3dpdGNoIChlc3AtPmN1cl9tc2dvdXRbMF0pIHsKKwlkZWZhdWx0OgorCQkvKiBXZSBkaWRuJ3QgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGF0IGFsbC4gKi8KKwkJRVNQTE9HKCgiZGV2aWNlIGlzIGJvbGl4ZWRcbiIpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX3RndGVycm9yKTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX0VSUk9SIDw8IDE2KSk7CisJCWJyZWFrOworCisJY2FzZSBCVVNfREVWSUNFX1JFU0VUOgorCQlFU1BMT0coKCJkZXZpY2UgcmVzZXQgc3VjY2Vzc2Z1bFxuIikpOworCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQllc3BfZGV2LT5zeW5jID0gMDsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX3Jlc2V0ZGV2KTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX1JFU0VUIDw8IDE2KSk7CisJCWJyZWFrOworCisJY2FzZSBBQk9SVDoKKwkJRVNQTE9HKCgiZGV2aWNlIGFib3J0IHN1Y2Nlc3NmdWxcbiIpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2Uoc3AsIGluX2Fib3J0b25lKTsKKwkJZXNwX2RvbmUoZXNwLCAoRElEX0FCT1JUIDw8IDE2KSk7CisJCWJyZWFrOworCisJfTsKKwlyZXR1cm4gZG9faW50cl9lbmQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX21zZ291dChzdHJ1Y3QgZXNwICplc3ApCit7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dvdXQpOworCXJldHVybiBlc3BfZG9fbXNnb3V0KGVzcCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX21zZ2luKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luKTsKKwlyZXR1cm4gZXNwX2RvX21zZ2luKGVzcCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2VudGVyX2NtZChzdHJ1Y3QgZXNwICplc3ApCit7CisJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9jbWRiZWdpbik7CisJcmV0dXJuIGVzcF9kb19jbWRiZWdpbihlc3ApOworfQorCitzdGF0aWMgaW50IGVzcF9lbnRlcl9iYWRwaGFzZShzdHJ1Y3QgZXNwICplc3ApCit7CisJRVNQTE9HKCgiZXNwJWQ6IEJpemFycmUgYnVzIHBoYXNlICUyeC5cbiIsIGVzcC0+ZXNwX2lkLAorCQllc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykpOworCXJldHVybiBkb19yZXNldF9idXM7Cit9CisKK3R5cGVkZWYgaW50ICgqZXNwZnVuY190KShzdHJ1Y3QgZXNwICopOworCitzdGF0aWMgZXNwZnVuY190IHBoYXNlX3ZlY3RvcltdID0geworCWVzcF9kb19kYXRhLAkJLyogRVNQX0RPUCAqLworCWVzcF9kb19kYXRhLAkJLyogRVNQX0RJUCAqLworCWVzcF9lbnRlcl9jbWQsCQkvKiBFU1BfQ01EUCAqLworCWVzcF9lbnRlcl9zdGF0dXMsCS8qIEVTUF9TVEFUUCAqLworCWVzcF9lbnRlcl9iYWRwaGFzZSwJLyogRVNQX1NUQVRfUE1TRyAqLworCWVzcF9lbnRlcl9iYWRwaGFzZSwJLyogRVNQX1NUQVRfUE1TRyB8IEVTUF9TVEFUX1BJTyAqLworCWVzcF9lbnRlcl9tc2dvdXQsCS8qIEVTUF9NT1AgKi8KKwllc3BfZW50ZXJfbXNnaW4sCS8qIEVTUF9NSVAgKi8KK307CisKKy8qIFRoZSB0YXJnZXQgaGFzIGNvbnRyb2wgb2YgdGhlIGJ1cyBhbmQgd2UgaGF2ZSB0byBzZWUgd2hlcmUgaXQgaGFzCisgKiB0YWtlbiB1cy4KKyAqLworc3RhdGljIGludCBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpZiAoKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSAhPSAwKQorCQlyZXR1cm4gZXNwX2Rpc2Nvbm5lY3RfYW1pZHN0X3BoYXNlcyhlc3ApOworCXJldHVybiBwaGFzZV92ZWN0b3JbZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0tdKGVzcCk7Cit9CisKKy8qIEZpcnN0IGludGVycnVwdCBhZnRlciBleGVjJ2luZyBhIGNtZCBjb21lcyBoZXJlLiAqLworc3RhdGljIGludCBlc3Bfc2VsZWN0X2NvbXBsZXRlKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCWludCBjbWRfYnl0ZXNfc2VudCwgZmNudDsKKworCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKQorCQllc3AtPnNlcXJlZyA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1NURVApICYgRVNQX1NURVBfVkJJVFMpOworCisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCWZjbnQgPSBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfY291bnQ7CisJZWxzZQorCQlmY250ID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUyk7CisKKwljbWRfYnl0ZXNfc2VudCA9IGVzcF9ieXRlc19zZW50KGVzcCwgZmNudCk7CisJZG1hX2ludmFsaWRhdGUoZXNwKTsKKworCS8qIExldCdzIGNoZWNrIHRvIHNlZSBpZiBhIHJlc2VsZWN0IGhhcHBlbmVkCisJICogd2hpbGUgd2Ugd2UncmUgdHJ5aW5nIHRvIHNlbGVjdC4gIFRoaXMgbXVzdAorCSAqIGJlIGNoZWNrZWQgZmlyc3QuCisJICovCisJaWYgKGVzcC0+aXJlZyA9PSAoRVNQX0lOVFJfUlNFTCB8IEVTUF9JTlRSX0ZET05FKSkgeworCQllc3BfcmVjb25uZWN0KGVzcCwgU0NwdHIpOworCQlyZXR1cm4gZXNwX2RvX3JlY29ubmVjdChlc3ApOworCX0KKworCS8qIExvb2tzIGxpa2UgdGhpbmdzIHdvcmtlZCwgd2Ugc2hvdWxkIHNlZSBhIGJ1cyBzZXJ2aWNlICYKKwkgKiBhIGZ1bmN0aW9uIGNvbXBsZXRlIGludGVycnVwdCBhdCB0aGlzIHBvaW50LiAgTm90ZSB3ZQorCSAqIGFyZSBkb2luZyBhIGRpcmVjdCBjb21wYXJpc29uIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0bworCSAqIGJlIGZvb2xlZCBpbnRvIHRoaW5raW5nIHNlbGVjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBpZgorCSAqIEVTUF9JTlRSX0RDIGlzIHNldCwgc2VlIGJlbG93LgorCSAqLworCWlmIChlc3AtPmlyZWcgPT0gKEVTUF9JTlRSX0ZET05FIHwgRVNQX0lOVFJfQlNFUlYpKSB7CisJCS8qIHRhcmdldCBzcGVha3MuLi4gKi8KKwkJZXNwLT50YXJnZXRzX3ByZXNlbnQgfD0gKDE8PFNDcHRyLT5kZXZpY2UtPmlkKTsKKworCQkvKiBXaGF0IGlmIHRoZSB0YXJnZXQgaWdub3JlcyB0aGUgc2R0cj8gKi8KKwkJaWYgKGVzcC0+c25pcCkKKwkJCWVzcF9kZXYtPnN5bmMgPSAxOworCisJCS8qIFNlZSBob3cgZmFyLCBpZiBhdCBhbGwsIHdlIGdvdCBpbiBnZXR0aW5nCisJCSAqIHRoZSBpbmZvcm1hdGlvbiBvdXQgdG8gdGhlIHRhcmdldC4KKwkJICovCisJCXN3aXRjaCAoZXNwLT5zZXFyZWcpIHsKKwkJZGVmYXVsdDoKKworCQljYXNlIEVTUF9TVEVQX0FTRUw6CisJCQkvKiBBcmJpdHJhdGlvbiB3b24sIHRhcmdldCBzZWxlY3RlZCwgYnV0CisJCQkgKiB3ZSBhcmUgaW4gc29tZSBwaGFzZSB3aGljaCBpcyBub3QgY29tbWFuZAorCQkJICogcGhhc2Ugbm9yIGlzIGl0IG1lc3NhZ2Ugb3V0IHBoYXNlLgorCQkJICoKKwkJCSAqIFhYWCBXZSd2ZSBjb25mdXNlZCB0aGUgdGFyZ2V0LCBvYnZpb3VzbHkuCisJCQkgKiBYWFggU28gY2xlYXIgaXQncyBzdGF0ZSwgYnV0IHdlIGFsc28gZW5kCisJCQkgKiBYWFggdXAgY2xlYXJpbmcgZXZlcnlvbmUgZWxzZXMuICBUaGF0IGlzbid0CisJCQkgKiBYWFggc28gbmljZS4gIEknZCBsaWtlIHRvIGp1c3QgcmVzZXQgdGhpcworCQkJICogWFhYIHRhcmdldCwgYnV0IGlmIEkgY2Fubm90IGV2ZW4gZ2V0IGl0J3MKKwkJCSAqIFhYWCBhdHRlbnRpb24gYW5kIGZpbmlzaCBzZWxlY3Rpb24gdG8gdGFsaworCQkJICogWFhYIHRvIGl0LCB0aGVyZSBpcyBub3QgbXVjaCBtb3JlIEkgY2FuIGRvLgorCQkJICogWFhYIElmIHdlIGhhdmUgYSBsb2FkZWQgYnVzIHdlJ3JlIGdvaW5nIHRvCisJCQkgKiBYWFggc3BlbmQgdGhlIG5leHQgc2Vjb25kIG9yIHNvIHJlbmVnb3RpYXRpbmcKKwkJCSAqIFhYWCBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzLgorCQkJICovCisJCQlFU1BMT0coKCJlc3AlZDogU1RFUF9BU0VMIGZvciB0Z3QgJWRcbiIsCisJCQkJZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7CisKKwkJY2FzZSBFU1BfU1RFUF9TSUQ6CisJCQkvKiBBcmJpdHJhdGlvbiB3b24sIHRhcmdldCBzZWxlY3RlZCwgd2VudAorCQkJICogdG8gbWVzc2FnZSBvdXQgcGhhc2UsIHNlbnQgb25lIG1lc3NhZ2UKKwkJCSAqIGJ5dGUsIHRoZW4gd2Ugc3RvcHBlZC4gIEFUTiBpcyBhc3NlcnRlZAorCQkJICogb24gdGhlIFNDU0kgYnVzIGFuZCB0aGUgdGFyZ2V0IGlzIHN0aWxsCisJCQkgKiB0aGVyZSBoYW5naW5nIG9uLiAgVGhpcyBpcyBhIGxlZ2FsCisJCQkgKiBzZXF1ZW5jZSBzdGVwIGlmIHdlIGdhdmUgdGhlIEVTUCBhIHNlbGVjdAorCQkJICogYW5kIHN0b3AgY29tbWFuZC4KKwkJCSAqCisJCQkgKiBYWFggU2VlIGFib3ZlLCBJIGNvdWxkIHNldCB0aGUgYm9ya2VuIGZsYWcKKwkJCSAqIFhYWCBpbiB0aGUgZGV2aWNlIHN0cnVjdCBhbmQgcmV0cnkgdGhlCisJCQkgKiBYWFggY29tbWFuZC4gIEJ1dCB3b3VsZCB0aGF0IGhlbHAgZm9yCisJCQkgKiBYWFggdGFnZ2VkIGNhcGFibGUgdGFyZ2V0cz8KKwkJCSAqLworCisJCWNhc2UgRVNQX1NURVBfTkNNRDoKKwkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCBtYXliZQorCQkJICogc2VudCB0aGUgb25lIG1lc3NhZ2UgYnl0ZSBpbiBtZXNzYWdlIG91dAorCQkJICogcGhhc2UsIGJ1dCB3ZSBkaWQgbm90IGdvIHRvIGNvbW1hbmQgcGhhc2UKKwkJCSAqIGluIHRoZSBlbmQuICBBY3R1YWxseSwgd2UgY291bGQgaGF2ZSBzZW50CisJCQkgKiBvbmx5IHNvbWUgb2YgdGhlIG1lc3NhZ2UgYnl0ZXMgaWYgd2UgdHJpZWQKKwkJCSAqIHRvIHNlbmQgb3V0IHRoZSBlbnRpcmUgaWRlbnRpZnkgYW5kIHRhZworCQkJICogbWVzc2FnZSB1c2luZyBFU1BfQ01EX1NBMy4KKwkJCSAqLworCQkJY21kX2J5dGVzX3NlbnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBFU1BfU1RFUF9QUEM6CisJCQkvKiBObywgbm90IHRoZSBwb3dlclBDIHBpbmhlYWQuICBBcmJpdHJhdGlvbgorCQkJICogd29uLCBhbGwgbWVzc2FnZSBieXRlcyBzZW50IGlmIHdlIHdlbnQgdG8KKwkJCSAqIG1lc3NhZ2Ugb3V0IHBoYXNlLCB3ZW50IHRvIGNvbW1hbmQgcGhhc2UKKwkJCSAqIGJ1dCBvbmx5IHBhcnQgb2YgdGhlIGNvbW1hbmQgd2FzIHNlbnQuCisJCQkgKgorCQkJICogWFhYIEkndmUgc2VlbiB0aGlzLCBidXQgdXN1YWxseSBpbiBjb25qdW5jdGlvbgorCQkJICogWFhYIHdpdGggYSBncm9zcyBlcnJvciB3aGljaCBhcHBlYXJzIHRvIGhhdmUKKwkJCSAqIFhYWCBvY2N1cnJlZCBiZXR3ZWVuIHRoZSB0aW1lIEkgdG9sZCB0aGUKKwkJCSAqIFhYWCBFU1AgdG8gYXJiaXRyYXRlIGFuZCB3aGVuIEkgZ290IHRoZQorCQkJICogWFhYIGludGVycnVwdC4gIENvdWxkIEkgaGF2ZSBtaXNsb2FkZWQgdGhlCisJCQkgKiBYWFggY29tbWFuZCBieXRlcyBpbnRvIHRoZSBmaWZvPyAgQWN0dWFsbHksCisJCQkgKiBYWFggSSBtb3N0IGxpa2VseSBtaXNzZWQgYSBwaGFzZSwgYW5kIHRoZXJlZm9yZQorCQkJICogWFhYIHdlbnQgaW50byBuZXZlciBuZXZlciBsYW5kIGFuZCBkaWRuJ3QgZXZlbgorCQkJICogWFhYIGtub3cgaXQuICBUaGF0IHdhcyB0aGUgb2xkIGRyaXZlciB0aG91Z2guCisJCQkgKiBYWFggV2hhdCBpcyBldmVuIG1vcmUgcGVjdWxpYXIgaXMgdGhhdCB0aGUgRVNQCisJCQkgKiBYWFggc2hvd2VkIHRoZSBwcm9wZXIgZnVuY3Rpb24gY29tcGxldGUgYW5kCisJCQkgKiBYWFggYnVzIHNlcnZpY2UgYml0cyBpbiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyLgorCQkJICovCisKKwkJY2FzZSBFU1BfU1RFUF9GSU5JNDoKKwkJY2FzZSBFU1BfU1RFUF9GSU5JNToKKwkJY2FzZSBFU1BfU1RFUF9GSU5JNjoKKwkJY2FzZSBFU1BfU1RFUF9GSU5JNzoKKwkJCS8qIEFjY291bnQgZm9yIHRoZSBpZGVudGlmeSBtZXNzYWdlICovCisJCQlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9zbGN0X25vcm0pCisJCQkJY21kX2J5dGVzX3NlbnQgLT0gMTsKKwkJfTsKKworCQlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOworCisJCS8qIEJlIGNhcmVmdWwsIHdlIGNvdWxkIHJlYWxseSBnZXQgZnVja2VkIGR1cmluZyBzeW5jaHJvbm91cworCQkgKiBkYXRhIHRyYW5zZmVycyBpZiB3ZSB0cnkgdG8gZmx1c2ggdGhlIGZpZm8gbm93LgorCQkgKi8KKwkJaWYgKChlc3AtPmVyZXYgIT0gZmFzaG1lKSAmJiAvKiBub3QgYSBIYXBweSBNZWFsIGFuZC4uLiAqLworCQkgICAgIWZjbnQgJiYgLyogRmlmbyBpcyBlbXB0eSBhbmQuLi4gKi8KKwkJICAgIC8qIGVpdGhlciB3ZSBhcmUgbm90IGRvaW5nIHN5bmNocm9ub3VzIHRyYW5zZmVycyBvci4uLiAqLworCQkgICAgKCFlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgfHwKKwkJICAgICAvKiBXZSBhcmUgbm90IGdvaW5nIGludG8gZGF0YSBpbiBwaGFzZS4gKi8KKwkJICAgICAoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSAhPSBFU1BfRElQKSkpCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7IC8qIGZsdXNoIGlzIHNhZmUgKi8KKworCQkvKiBTZWUgaG93IGZhciB3ZSBnb3QgaWYgdGhpcyBpcyBub3QgYSBzbG93IGNvbW1hbmQuICovCisJCWlmICghZXNwLT5lc3Bfc2xvd2NtZCkgeworCQkJaWYgKGNtZF9ieXRlc19zZW50IDwgMCkKKwkJCQljbWRfYnl0ZXNfc2VudCA9IDA7CisJCQlpZiAoY21kX2J5dGVzX3NlbnQgIT0gU0NwdHItPmNtZF9sZW4pIHsKKwkJCQkvKiBDcmFwb2xhLCBtYXJrIGl0IGFzIGEgc2xvd2NtZAorCQkJCSAqIHNvIHRoYXQgd2UgaGF2ZSBzb21lIGNoYW5jZSBvZgorCQkJCSAqIGtlZXBpbmcgdGhlIGNvbW1hbmQgYWxpdmUgd2l0aAorCQkJCSAqIGdvb2QgbHVjay4KKwkJCQkgKgorCQkJCSAqIFhYWCBBY3R1YWxseSwgaWYgd2UgZGlkbid0IHNlbmQgaXQgYWxsCisJCQkJICogWFhYIHRoaXMgbWVhbnMgZWl0aGVyIHdlIGRpZG4ndCBzZXQgdGhpbmdzCisJCQkJICogWFhYIHVwIHByb3Blcmx5IChkcml2ZXIgYnVnKSBvciB0aGUgdGFyZ2V0CisJCQkJICogWFhYIG9yIHRoZSBFU1AgZGV0ZWN0ZWQgcGFyaXR5IG9uIG9uZSBvZgorCQkJCSAqIFhYWCB0aGUgY29tbWFuZCBieXRlcy4gIFRoaXMgbWFrZXMgbXVjaAorCQkJCSAqIFhYWCBtb3JlIHNlbnNlLCBhbmQgdGhlcmVmb3JlIHRoaXMgY29kZQorCQkJCSAqIFhYWCBzaG91bGQgYmUgY2hhbmdlZCB0byBzZW5kIG91dCBhCisJCQkJICogWFhYIHBhcml0eSBlcnJvciBtZXNzYWdlIG9yIGlmIHRoZSBzdGF0dXMKKwkJCQkgKiBYWFggcmVnaXN0ZXIgc2hvd3Mgbm8gcGFyaXR5IGVycm9yIHRoZW4KKwkJCQkgKiBYWFgganVzdCBleHBlY3QgdGhlIHRhcmdldCB0byBicmluZyB0aGUKKwkJCQkgKiBYWFggYnVzIGludG8gbWVzc2FnZSBpbiBwaGFzZSBzbyB0aGF0IGl0CisJCQkJICogWFhYIGNhbiBzZW5kIHVzIHRoZSBwYXJpdHkgZXJyb3IgbWVzc2FnZS4KKwkJCQkgKiBYWFggU0NTSSBzdWNrcy4uLgorCQkJCSAqLworCQkJCWVzcC0+ZXNwX3Nsb3djbWQgPSAxOworCQkJCWVzcC0+ZXNwX3NjbWRwID0gJihTQ3B0ci0+Y21uZFtjbWRfYnl0ZXNfc2VudF0pOworCQkJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gKFNDcHRyLT5jbWRfbGVuIC0gY21kX2J5dGVzX3NlbnQpOworCQkJfQorCQl9CisKKwkJLyogTm93IGZpZ3VyZSBvdXQgd2hlcmUgd2Ugd2VudC4gKi8KKwkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKKwl9CisKKwkvKiBEaWQgdGhlIHRhcmdldCBldmVuIG1ha2UgaXQ/ICovCisJaWYgKGVzcC0+aXJlZyA9PSBFU1BfSU5UUl9EQykgeworCQkvKiB3aGVlZS4uLiBub2JvZHkgdGhlcmUgb3IgdGhleSBkaWRuJ3QgbGlrZQorCQkgKiB3aGF0IHdlIHRvbGQgaXQgdG8gZG8sIGNsZWFuIHVwLgorCQkgKi8KKworCQkvKiBJZiBhbnlvbmUgaXMgb2ZmIHRoZSBidXMsIGJ1dCB3b3JraW5nIG9uCisJCSAqIGEgY29tbWFuZCBpbiB0aGUgYmFja2dyb3VuZCBmb3IgdXMsIHRlbGwKKwkJICogdGhlIEVTUCB0byBsaXN0ZW4gZm9yIHRoZW0uCisJCSAqLworCQlpZiAoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9FU0VMKTsKKworCQlpZiAoKCgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCkgJiBlc3AtPnRhcmdldHNfcHJlc2VudCkgJiYKKwkJICAgIGVzcC0+c2VxcmVnICE9IDAgJiYKKwkJICAgIChlc3AtPmN1cl9tc2dvdXRbMF0gPT0gRVhURU5ERURfTUVTU0FHRSkgJiYKKwkJICAgIChTQ3B0ci0+U0NwLnBoYXNlID09IGluX3NsY3RfbXNnIHx8CisJCSAgICAgU0NwdHItPlNDcC5waGFzZSA9PSBpbl9zbGN0X3N0b3ApKSB7CisJCQkvKiBzaGl0ICovCisJCQllc3AtPnNuaXAgPSAwOworCQkJRVNQTE9HKCgiZXNwJWQ6IEZhaWxlZCBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiBmb3IgdGFyZ2V0ICVkICIKKwkJCQkibHVuICVkXG4iLCBlc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOworCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKKwkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7CisJCQllc3BfZGV2LT5zeW5jID0gMTsgLyogc28gd2UgZG9uJ3QgbmVnb3RpYXRlIGFnYWluICovCisKKwkJCS8qIFJ1biB0aGUgY29tbWFuZCBhZ2FpbiwgdGhpcyB0aW1lIHRob3VnaCB3ZQorCQkJICogd29uJ3QgdHJ5IHRvIG5lZ290aWF0ZSBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzLgorCQkJICoKKwkJCSAqIFhYWCBJJ2QgbGlrZSB0byBkbyBzb21ldGhpbmcgbGlrZSBzZW5kIGFuCisJCQkgKiBYWFggSU5JVElBVE9SX0VSUk9SIG9yIEFCT1JUIG1lc3NhZ2UgdG8gdGhlCisJCQkgKiBYWFggdGFyZ2V0IHRvIHRlbGwgaXQsICJTb3JyeSBJIGNvbmZ1c2VkIHlvdSwKKwkJCSAqIFhYWCBwbGVhc2UgY29tZSBiYWNrIGFuZCBJIHdpbGwgYmUgbmljZXIgbmV4dAorCQkJICogWFhYIHRpbWUiLiAgQnV0IHRoYXQgcmVxdWlyZXMgaGF2aW5nIHRoZSB0YXJnZXQKKwkJCSAqIFhYWCBvbiB0aGUgYnVzLCBhbmQgaXQgaGFzIGRyb3BwZWQgQlNZIG9uIHVzLgorCQkJICovCisJCQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIG5vdF9pc3N1ZWQpOworCQkJcHJlcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwdHIpOworCQkJZXNwX2V4ZWNfY21kKGVzcCk7CisJCQlyZXR1cm4gZG9faW50cl9lbmQ7CisJCX0KKworCQkvKiBPaywgdGhpcyBpcyBub3JtYWwsIHRoaXMgaXMgd2hhdCB3ZSBzZWUgZHVyaW5nIGJvb3QKKwkJICogb3Igd2hlbmV2ZXIgd2hlbiB3ZSBhcmUgc2Nhbm5pbmcgdGhlIGJ1cyBmb3IgdGFyZ2V0cy4KKwkJICogQnV0IGZpcnN0IG1ha2Ugc3VyZSB0aGF0IGlzIHJlYWxseSB3aGF0IGlzIGhhcHBlbmluZy4KKwkJICovCisJCWlmICgoKDE8PFNDcHRyLT5kZXZpY2UtPmlkKSAmIGVzcC0+dGFyZ2V0c19wcmVzZW50KSkgeworCQkJRVNQTE9HKCgiZXNwJWQ6IFdhcm5pbmcsIGxpdmUgdGFyZ2V0ICVkIG5vdCByZXNwb25kaW5nIHRvICIKKwkJCQkic2VsZWN0aW9uLlxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7CisKKwkJCS8qIFRoaXMgX0NBTl8gaGFwcGVuLiAgVGhlIFNDU0kgc3RhbmRhcmQgc3RhdGVzIHRoYXQKKwkJCSAqIHRoZSB0YXJnZXQgaXMgdG8gX25vdF8gcmVzcG9uZCB0byBzZWxlY3Rpb24gaWYKKwkJCSAqIF9pdF8gZGV0ZWN0cyBiYWQgcGFyaXR5IG9uIHRoZSBidXMgZm9yIGFueSByZWFzb24uCisJCQkgKiBUaGVyZWZvcmUsIHdlIGFzc3VtZSB0aGF0IGlmIHdlJ3ZlIHRhbGtlZCBzdWNjZXNzZnVsbHkKKwkJCSAqIHRvIHRoaXMgdGFyZ2V0IGJlZm9yZSwgYmFkIHBhcml0eSBpcyB0aGUgcHJvYmxlbS4KKwkJCSAqLworCQkJZXNwX2RvbmUoZXNwLCAoRElEX1BBUklUWSA8PCAxNikpOworCQl9IGVsc2UgeworCQkJLyogRWxzZSwgdGhlcmUgcmVhbGx5IGlzbid0IGFueW9uZSB0aGVyZS4gKi8KKwkJCUVTUE1JU0MoKCJlc3A6IHNlbGVjdGlvbiBmYWlsdXJlLCBtYXliZSBub2JvZHkgdGhlcmU/XG4iKSk7CisJCQlFU1BNSVNDKCgiZXNwOiB0YXJnZXQgJWQgbHVuICVkXG4iLAorCQkJCSBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7CisJCQllc3BfZG9uZShlc3AsIChESURfQkFEX1RBUkdFVCA8PCAxNikpOworCQl9CisJCXJldHVybiBkb19pbnRyX2VuZDsKKwl9CisKKwlFU1BMT0coKCJlc3AlZDogU2VsZWN0aW9uIGZhaWx1cmUuXG4iLCBlc3AtPmVzcF9pZCkpOworCXByaW50aygiZXNwJWQ6IEN1cnJlbnRseSAtLSAiLCBlc3AtPmVzcF9pZCk7CisJZXNwX3ByaW50X2lyZWcoZXNwLT5pcmVnKTsgcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3N0YXRyZWcoZXNwLT5zcmVnKTsgcHJpbnRrKCIgIik7CisJZXNwX3ByaW50X3NlcXJlZyhlc3AtPnNlcXJlZyk7IHByaW50aygiXG4iKTsKKwlwcmludGsoImVzcCVkOiBOZXcgLS0gIiwgZXNwLT5lc3BfaWQpOworCWVzcC0+c3JlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpOworCWVzcC0+c2VxcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NTVEVQKTsKKwllc3AtPmlyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKTsKKwllc3BfcHJpbnRfaXJlZyhlc3AtPmlyZWcpOyBwcmludGsoIiAiKTsKKwllc3BfcHJpbnRfc3RhdHJlZyhlc3AtPnNyZWcpOyBwcmludGsoIiAiKTsKKwllc3BfcHJpbnRfc2VxcmVnKGVzcC0+c2VxcmVnKTsgcHJpbnRrKCJcbiIpOworCUVTUExPRygoImVzcCVkOiByZXNldHRpbmcgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOworCXJldHVybiBkb19yZXNldF9idXM7IC8qIHVnaC4uLiAqLworfQorCisvKiBDb250aW51ZSByZWFkaW5nIGJ5dGVzIGZvciBtc2dpbiBwaGFzZS4gKi8KK3N0YXRpYyBpbnQgZXNwX2RvX21zZ2luY29udChzdHJ1Y3QgZXNwICplc3ApCit7CisJaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0JTRVJWKSB7CisJCS8qIGluIHRoZSByaWdodCBwaGFzZSB0b28/ICovCisJCWlmICgoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9NSVApIHsKKwkJCS8qIHBoZXcuLi4gKi8KKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW5kb25lKTsKKwkJCXJldHVybiBkb19pbnRyX2VuZDsKKwkJfQorCisJCS8qIFdlIGNoYW5nZWQgcGhhc2UgYnV0IEVTUCBzaG93cyBidXMgc2VydmljZSwKKwkJICogaW4gdGhpcyBjYXNlIGl0IGlzIG1vc3QgbGlrZWx5IHRoYXQgd2UsIHRoZQorCQkgKiBoYWNrZXIgd2hvIGhhcyBiZWVuIHVwIGZvciAyMGhycyBzdHJhaWdodAorCQkgKiBzdGFyaW5nIGF0IHRoZSBzY3JlZW4sIGRyb3duZWQgaW4gY29mZmVlCisJCSAqIHNtZWxsaW5nIGxpa2UgcmV0Y2hlZCBjaWdhcmV0dGUgYXNoZXMKKwkJICogaGF2ZSBtaXNjb2RlZCBzb21ldGhpbmcuLi4uLiBzbywgdHJ5IHRvCisJCSAqIHJlY292ZXIgYXMgYmVzdCB3ZSBjYW4uCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogbWVzc2FnZSBpbiBtaXMtY2FycmlhZ2UuXG4iLCBlc3AtPmVzcF9pZCkpOworCX0KKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKKwlyZXR1cm4gZG9fcGhhc2VfZGV0ZXJtaW5lOworfQorCitzdGF0aWMgaW50IGNoZWNrX3NpbmdsZWJ5dGVfbXNnKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwllc3AtPnByZXZtc2dpbiA9IGVzcC0+Y3VyX21zZ2luWzBdOworCWlmIChlc3AtPmN1cl9tc2dpblswXSAmIDB4ODApIHsKKwkJLyogd2hlZWUuLi4gKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IHRhcmdldCBzZW5kcyBpZGVudGlmeSBhbWlkc3QgcGhhc2VzXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoKChlc3AtPmN1cl9tc2dpblswXSAmIDB4ZjApID09IDB4MjApIHx8CisJCSAgIChlc3AtPmN1cl9tc2dpblswXSA9PSBFWFRFTkRFRF9NRVNTQUdFKSkgeworCQllc3AtPm1zZ2luX2xlbiA9IDI7CisJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW5jb250KTsKKwkJcmV0dXJuIDA7CisJfQorCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCXN3aXRjaCAoZXNwLT5jdXJfbXNnaW5bMF0pIHsKKwlkZWZhdWx0OgorCQkvKiBXZSBkb24ndCB3YW50IHRvIGhlYXIgYWJvdXQgaXQuICovCisJCUVTUExPRygoImVzcCVkOiBtc2cgJTAyeCB3aGljaCB3ZSBkb24ndCBrbm93IGFib3V0XG4iLCBlc3AtPmVzcF9pZCwKKwkJCWVzcC0+Y3VyX21zZ2luWzBdKSk7CisJCXJldHVybiBNRVNTQUdFX1JFSkVDVDsKKworCWNhc2UgTk9QOgorCQlFU1BMT0coKCJlc3AlZDogdGFyZ2V0ICVkIHNlbmRzIGEgbm9wXG4iLCBlc3AtPmVzcF9pZCwKKwkJCWVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5pZCkpOworCQlyZXR1cm4gMDsKKworCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJLyogSW4gdGhpcyBjYXNlIHdlIG1pZ2h0IGFsc28gaGF2ZSB0byBiYWNrdXAgdGhlCisJCSAqICJzbG93IGNvbW1hbmQiIHBvaW50ZXIuICBJdCBpcyByYXJlIHRvIGdldCBzdWNoCisJCSAqIGEgc2F2ZS9yZXN0b3JlIHBvaW50ZXIgc2VxdWVuY2Ugc28gZWFybHkgaW4gdGhlCisJCSAqIGJ1cyB0cmFuc2l0aW9uIHNlcXVlbmNlcywgYnV0IGNvdmVyIGl0LgorCQkgKi8KKwkJaWYgKGVzcC0+ZXNwX3Nsb3djbWQpIHsKKwkJCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gZXNwLT5jdXJyZW50X1NDLT5jbWRfbGVuOworCQkJZXNwLT5lc3Bfc2NtZHAgPSAmZXNwLT5jdXJyZW50X1NDLT5jbW5kWzBdOworCQl9CisJCWVzcF9yZXN0b3JlX3BvaW50ZXJzKGVzcCwgZXNwLT5jdXJyZW50X1NDKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNBVkVfUE9JTlRFUlM6CisJCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgZXNwLT5jdXJyZW50X1NDKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJY2FzZSBESVNDT05ORUNUOgorCQkvKiBGcmVlaW5nIHRoZSBidXMsIGxldCBpdCBnby4gKi8KKwkJZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpbl9mcmVlaW5nOworCQlyZXR1cm4gMDsKKworCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCUVTUE1JU0MoKCJtc2cgcmVqZWN0LCAiKSk7CisJCWlmIChlc3AtPnByZXZtc2dvdXQgPT0gRVhURU5ERURfTUVTU0FHRSkgeworCQkJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aG9zdGRhdGE7CisKKwkJCS8qIERvZXNuJ3QgbG9vayBsaWtlIHRoaXMgdGFyZ2V0IGNhbgorCQkJICogZG8gc3luY2hyb25vdXMgb3IgV0lERSB0cmFuc2ZlcnMuCisJCQkgKi8KKwkJCUVTUFNEVFIoKCJnb3QgcmVqZWN0LCB3YXMgdHJ5aW5nIG5lZ28sIGNsZWFyaW5nIHN5bmMvV0lERVxuIikpOworCQkJZXNwX2Rldi0+c3luYyA9IDE7CisJCQllc3BfZGV2LT53aWRlID0gMTsKKwkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlFU1BNSVNDKCgibm90IHN5bmMgbmVnbywgc2VuZGluZyBBQk9SVFxuIikpOworCQkJcmV0dXJuIEFCT1JUOworCQl9CisJfTsKK30KKworLyogVGFyZ2V0IG5lZ290aWF0ZXMgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycyBiZWZvcmUgd2UgZG8sIHRoaXMKKyAqIGlzIGxlZ2FsIGFsdGhvdWdoIHZlcnkgc3RyYW5nZS4gIFdoYXQgaXMgZXZlbiBmdW5uaWVyIGlzIHRoYXQKKyAqIHRoZSBTQ1NJMiBzdGFuZGFyZCBzcGVjaWZpY2FsbHkgcmVjb21tZW5kcyBhZ2FpbnN0IHRhcmdldHMgZG9pbmcKKyAqIHRoaXMgYmVjYXVzZSBzbyBtYW55IGluaXRpYXRvcnMgY2Fubm90IGNvcGUgd2l0aCB0aGlzIG9jY3VycmluZy4KKyAqLworc3RhdGljIGludCB0YXJnZXRfd2l0aF9hbnRzX2luX3BhbnRzKHN0cnVjdCBlc3AgKmVzcCwKKwkJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyLAorCQkJCSAgICAgc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYpCit7CisJaWYgKGVzcF9kZXYtPnN5bmMgfHwgU0NwdHItPmRldmljZS0+Ym9ya2VuKSB7CisJCS8qIHNvcnJ5LCBubyBjYW4gZG8gKi8KKwkJRVNQU0RUUigoImZvcmNpbmcgdG8gYXN5bmMsICIpKTsKKwkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOworCQllc3BfZGV2LT5zeW5jID0gMTsKKwkJZXNwLT5zbmlwID0gMTsKKwkJRVNQTE9HKCgiZXNwJWQ6IGhvcGluZyBmb3IgbXNnb3V0XG4iLCBlc3AtPmVzcF9pZCkpOworCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCQlyZXR1cm4gRVhURU5ERURfTUVTU0FHRTsKKwl9CisKKwkvKiBPaywgd2UnbGwgY2hlY2sgdGhlbSBvdXQuLi4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3luY19yZXBvcnQoc3RydWN0IGVzcCAqZXNwKQoreworCWludCBtc2czLCBtc2c0OworCWNoYXIgKnR5cGU7CisKKwltc2czID0gZXNwLT5jdXJfbXNnaW5bM107CisJbXNnNCA9IGVzcC0+Y3VyX21zZ2luWzRdOworCWlmIChtc2c0KSB7CisJCWludCBoeiA9IDEwMDAwMDAwMDAgLyAobXNnMyAqIDQpOworCQlpbnQgaW50ZWdlciA9IGh6IC8gMTAwMDAwMDsKKwkJaW50IGZyYWN0aW9uID0gKGh6IC0gKGludGVnZXIgKiAxMDAwMDAwKSkgLyAxMDAwMDsKKwkJaWYgKChlc3AtPmVyZXYgPT0gZmFzaG1lKSAmJgorCQkgICAgKGVzcC0+Y29uZmlnM1tlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWRdICYgRVNQX0NPTkZJRzNfRVdJREUpKSB7CisJCQl0eXBlID0gIkZBU1QtV0lERSI7CisJCQlpbnRlZ2VyIDw8PSAxOworCQkJZnJhY3Rpb24gPDw9IDE7CisJCX0gZWxzZSBpZiAoKG1zZzMgKiA0KSA8IDIwMCkgeworCQkJdHlwZSA9ICJGQVNUIjsKKwkJfSBlbHNlIHsKKwkJCXR5cGUgPSAic3luY2hyb25vdXMiOworCQl9CisKKwkJLyogRG8gbm90IHRyYW5zZm9ybSB0aGlzIGJhY2sgaW50byBvbmUgYmlnIHByaW50aworCQkgKiBhZ2FpbiwgaXQgdHJpZ2dlcnMgYSBidWcgaW4gb3VyIHNwYXJjNjQtZ2NjMjcyCisJCSAqIHNpYmxpbmcgY2FsbCBvcHRpbWl6YXRpb24uICAtRGF2ZU0KKwkJICovCisJCUVTUExPRygoS0VSTl9JTkZPICJlc3AlZDogdGFyZ2V0ICVkICIsCisJCQllc3AtPmVzcF9pZCwgZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmlkKSk7CisJCUVTUExPRygoIltwZXJpb2QgJWRucyBvZmZzZXQgJWQgJWQuJTAyZE1IeiAiLAorCQkJKGludCkgbXNnMyAqIDQsIChpbnQpIG1zZzQsCisJCQlpbnRlZ2VyLCBmcmFjdGlvbikpOworCQlFU1BMT0coKCIlcyBTQ1NJJXNdXG4iLCB0eXBlLAorCQkJKCgobXNnMyAqIDQpIDwgMjAwKSA/ICItSUkiIDogIiIpKSk7CisJfSBlbHNlIHsKKwkJRVNQTE9HKChLRVJOX0lORk8gImVzcCVkOiB0YXJnZXQgJWQgYXN5bmNocm9ub3VzXG4iLAorCQkJZXNwLT5lc3BfaWQsIGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5pZCkpOworCX0KK30KKworc3RhdGljIGludCBjaGVja19tdWx0aWJ5dGVfbXNnKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOworCXU4IHJlZ3ZhbCA9IDA7CisJaW50IG1lc3NhZ2Vfb3V0ID0gMDsKKworCUVTUFNEVFIoKCJjaGsgbXVsdGlieXRlIG1zZzogIikpOworCWlmIChlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9TRFRSKSB7CisJCWludCBwZXJpb2QgPSBlc3AtPmN1cl9tc2dpblszXTsKKwkJaW50IG9mZnNldCA9IGVzcC0+Y3VyX21zZ2luWzRdOworCisJCUVTUFNEVFIoKCJpcyBzeW5jIG5lZ28gcmVzcG9uc2UsICIpKTsKKwkJaWYgKCFlc3AtPnNuaXApIHsKKwkJCWludCBydmFsOworCisJCQkvKiBUYXJnZXQgbmVnb3RpYXRlcyBmaXJzdCEgKi8KKwkJCUVTUFNEVFIoKCJ0YXJnZXQganVtcHMgdGhlIGd1biwgIikpOworCQkJbWVzc2FnZV9vdXQgPSBFWFRFTkRFRF9NRVNTQUdFOyAvKiB3ZSBtdXN0IHJlc3BvbmQgKi8KKwkJCXJ2YWwgPSB0YXJnZXRfd2l0aF9hbnRzX2luX3BhbnRzKGVzcCwgU0NwdHIsIGVzcF9kZXYpOworCQkJaWYgKHJ2YWwpCisJCQkJcmV0dXJuIHJ2YWw7CisJCX0KKworCQlFU1BTRFRSKCgiZXhhbWluaW5nIHNkdHIsICIpKTsKKworCQkvKiBPZmZzZXQgY2Fubm90IGJlIGxhcmdlciB0aGFuIEVTUCBmaWZvIHNpemUuICovCisJCWlmIChvZmZzZXQgPiAxNSkgeworCQkJRVNQU0RUUigoIm9mZnNldCB0b28gYmlnICUyeCwgIiwgb2Zmc2V0KSk7CisJCQlvZmZzZXQgPSAxNTsKKwkJCUVTUFNEVFIoKCJzZW5kaW5nIGJhY2sgbmV3IG9mZnNldFxuIikpOworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIHBlcmlvZCwgb2Zmc2V0KTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisKKwkJaWYgKG9mZnNldCAmJiBwZXJpb2QgPiBlc3AtPm1heF9wZXJpb2QpIHsKKwkJCS8qIFllZWUsIGFzeW5jIGZvciB0aGlzIHNsb3cgZGV2aWNlLiAqLworCQkJRVNQU0RUUigoInBlcmlvZCB0b28gbG9uZyAlMngsICIsIHBlcmlvZCkpOworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOworCQkJRVNQU0RUUigoImhvcGluZyBmb3IgbXNnb3V0XG4iKSk7CisJCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9IGVsc2UgaWYgKG9mZnNldCAmJiBwZXJpb2QgPCBlc3AtPm1pbl9wZXJpb2QpIHsKKwkJCUVTUFNEVFIoKCJwZXJpb2QgdG9vIHNob3J0ICUyeCwgIiwgcGVyaW9kKSk7CisJCQlwZXJpb2QgPSBlc3AtPm1pbl9wZXJpb2Q7CisJCQlpZiAoZXNwLT5lcmV2ID4gZXNwMjM2KQorCQkJCXJlZ3ZhbCA9IDQ7CisJCQllbHNlCisJCQkJcmVndmFsID0gNTsKKwkJfSBlbHNlIGlmIChvZmZzZXQpIHsKKwkJCWludCB0bXA7CisKKwkJCUVTUFNEVFIoKCJwZXJpb2QgaXMgb2ssICIpKTsKKwkJCXRtcCA9IGVzcC0+Y2N5Y2xlIC8gMTAwMDsKKwkJCXJlZ3ZhbCA9ICgoKHBlcmlvZCA8PCAyKSArIHRtcCAtIDEpIC8gdG1wKTsKKwkJCWlmIChyZWd2YWwgJiYgKChlc3AtPmVyZXYgPT0gZmFzMTAwYSB8fAorCQkJCQllc3AtPmVyZXYgPT0gZmFzMjM2ICB8fAorCQkJCQllc3AtPmVyZXYgPT0gZmFzaG1lKSkpIHsKKwkJCQlpZiAocGVyaW9kID49IDUwKQorCQkJCQlyZWd2YWwtLTsKKwkJCX0KKwkJfQorCisJCWlmIChvZmZzZXQpIHsKKwkJCXU4IGJpdDsKKworCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gKHJlZ3ZhbCAmIDB4MWYpOworCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gKG9mZnNldCB8IGVzcC0+cmFkZWxheSk7CisJCQlpZiAoZXNwLT5lcmV2ID09IGZhczEwMGEgfHwgZXNwLT5lcmV2ID09IGZhczIzNiB8fCBlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQkJaWYgKChlc3AtPmVyZXYgPT0gZmFzMTAwYSkgfHwgKGVzcC0+ZXJldiA9PSBmYXNobWUpKQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GQVNUOworCQkJCWVsc2UKKwkJCQkJYml0ID0gRVNQX0NPTkZJRzNfRlNDU0k7CisJCQkJaWYgKHBlcmlvZCA8IDUwKSB7CisJCQkJCS8qIE9uIEZBUzM2NiwgaWYgdXNpbmcgZmFzdC0yMCBzeW5jaHJvbm91cyB0cmFuc2ZlcnMKKwkJCQkJICogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIFJFUS9BQ0sgYXNzZXJ0L2RlYXNzZXJ0CisJCQkJCSAqIGNvbnRyb2wgYml0cyBhcmUgY2xlYXIuCisJCQkJCSAqLworCQkJCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJCQkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCAmPSB+ZXNwLT5yYWRlbGF5OworCQkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdIHw9IGJpdDsKKwkJCQl9IGVsc2UgeworCQkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH5iaXQ7CisJCQkJfQorCQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXTsKKwkJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKwkJCX0KKwkJCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0OworCQkJZXNwLT5wcmV2X3N0cCA9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZDsKKwkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9zb2ZmLCBlc3AtPmVyZWdzICsgRVNQX1NPRkYpOworCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3N0cCwgZXNwLT5lcmVncyArIEVTUF9TVFApOworCQkJRVNQU0RUUigoInNvZmY9JTJ4IHN0cD0lMnggY2ZnMz0lMnhcbiIsCisJCQkJIGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCwKKwkJCQkgZXNwX2Rldi0+c3luY19taW5fcGVyaW9kLAorCQkJCSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdKSk7CisKKwkJCWVzcC0+c25pcCA9IDA7CisJCX0gZWxzZSBpZiAoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7CisJCQl1OCBiaXQ7CisKKwkJCS8qIGJhY2sgdG8gYXN5bmMgbW9kZSAqLworCQkJRVNQU0RUUigoInVuYWNjYXB0YWJsZSBzeW5jIG5lZ28sIGZvcmNpbmcgYXN5bmNcbiIpKTsKKwkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7CisJCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOworCQkJZXNwLT5wcmV2X3NvZmYgPSAwOworCQkJZXNwLT5wcmV2X3N0cCA9IDA7CisJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc29mZiwgZXNwLT5lcmVncyArIEVTUF9TT0ZGKTsKKwkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9zdHAsIGVzcC0+ZXJlZ3MgKyBFU1BfU1RQKTsKKwkJCWlmIChlc3AtPmVyZXYgPT0gZmFzMTAwYSB8fCBlc3AtPmVyZXYgPT0gZmFzMjM2IHx8IGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCQlpZiAoKGVzcC0+ZXJldiA9PSBmYXMxMDBhKSB8fCAoZXNwLT5lcmV2ID09IGZhc2htZSkpCisJCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZBU1Q7CisJCQkJZWxzZQorCQkJCQliaXQgPSBFU1BfQ09ORklHM19GU0NTSTsKKwkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdICY9IH5iaXQ7CisJCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOworCQkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOworCQkJfQorCQl9CisKKwkJc3luY19yZXBvcnQoZXNwKTsKKworCQlFU1BTRFRSKCgiY2hrIG11bHRpYnl0ZSBtc2c6IHN5bmMgaXMga25vd24sICIpKTsKKwkJZXNwX2Rldi0+c3luYyA9IDE7CisKKwkJaWYgKG1lc3NhZ2Vfb3V0KSB7CisJCQlFU1BMT0coKCJlc3AlZDogc2VuZGluZyBzZHRyIGJhY2ssIGhvcGluZyBmb3IgbXNnb3V0XG4iLAorCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgcGVyaW9kLCBvZmZzZXQpOworCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKKwkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOworCQl9CisKKwkJRVNQU0RUUigoInJldHVybmluZyB6ZXJvXG4iKSk7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7IC8qIC4uLm9yIGVsc2UhICovCisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfV0RUUikgeworCQlpbnQgc2l6ZSA9IDggPDwgZXNwLT5jdXJfbXNnaW5bM107CisKKwkJZXNwLT53bmlwID0gMDsKKwkJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpIHsKKwkJCUVTUExPRygoImVzcCVkOiBBSUVFRSB3aWRlIG1zZyByZWNlaXZlZCBhbmQgbm90IEhNRS5cbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJCX0gZWxzZSBpZiAoc2l6ZSA+IDE2KSB7CisJCQlFU1BMT0coKCJlc3AlZDogQUlFRUUgd2lkZSB0cmFuc2ZlciBmb3IgJWQgc2l6ZSAiCisJCQkJIm5vdCBzdXBwb3J0ZWQuXG4iLCBlc3AtPmVzcF9pZCwgc2l6ZSkpOworCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoaW5ncyBsb29rIGdvb2Q7IGxldCdzIHNlZSB3aGF0IHdlIGdvdC4gKi8KKwkJCWlmIChzaXplID09IDE2KSB7CisJCQkJLyogU2V0IGNvbmZpZyAzIHJlZ2lzdGVyIGZvciB0aGlzIHRhcmdldC4gKi8KKwkJCQllc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdIHw9IEVTUF9DT05GSUczX0VXSURFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBKdXN0IG1ha2Ugc3VyZSBpdCB3YXMgb25lIGJ5dGUgc2l6ZWQuICovCisJCQkJaWYgKHNpemUgIT0gOCkgeworCQkJCQlFU1BMT0coKCJlc3AlZDogQWllZWUsIHdpZGUgbmVnbyBvZiAlZCBzaXplLlxuIiwKKwkJCQkJCWVzcC0+ZXNwX2lkLCBzaXplKSk7CisJCQkJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7CisJCQkJCWdvdG8gZmluaXNoOworCQkJCX0KKwkJCQkvKiBQdXJlIHBhcmFub2lhLiAqLworCQkJCWVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0gJj0gfihFU1BfQ09ORklHM19FV0lERSk7CisJCQl9CisJCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF07CisJCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKKworCQkJLyogUmVnYXJkbGVzcywgbmV4dCB0cnkgZm9yIHN5bmMgdHJhbnNmZXJzLiAqLworCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIGVzcC0+c3luY19kZWZwLCAxNSk7CisJCQllc3BfZGV2LT5zeW5jID0gMTsKKwkJCWVzcC0+c25pcCA9IDE7CisJCQltZXNzYWdlX291dCA9IEVYVEVOREVEX01FU1NBR0U7CisJCX0KKwl9IGVsc2UgaWYgKGVzcC0+Y3VyX21zZ2luWzJdID09IEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVIpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IHJlamVjdGluZyBtb2RpZnkgZGF0YSBwdHIgbXNnXG4iLCBlc3AtPmVzcF9pZCkpOworCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOworCX0KK2ZpbmlzaDoKKwllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOworCXJldHVybiBtZXNzYWdlX291dDsKK30KKworc3RhdGljIGludCBlc3BfZG9fbXNnaW5kb25lKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKKwlpbnQgbWVzc2FnZV9vdXQgPSAwLCBpdCA9IDAsIHJ2YWw7CisKKwlydmFsID0gc2tpcGFoZWFkMShlc3AsIFNDcHRyLCBpbl9tc2dpbiwgaW5fbXNnaW5kb25lKTsKKwlpZiAocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisJaWYgKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kICE9IGluX3N0YXR1cykgeworCQlpZiAoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykpIHsKKwkJCWlmIChlc3AtPm1zZ2luX2xlbiAmJiAoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikpIHsKKwkJCQltZXNzYWdlX291dCA9IE1TR19QQVJJVFlfRVJST1I7CisJCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCQkJfSBlbHNlIGlmIChlc3AtPmVyZXYgIT0gZmFzaG1lICYmCisJCQkgIChpdCA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkZMQUdTKSAmIEVTUF9GRl9GQllURVMpKSAhPSAxKSB7CisJCQkJLyogV2UgY2VydGFpbmx5IGRyb3BwZWQgdGhlIGJhbGwgc29tZXdoZXJlLiAqLworCQkJCW1lc3NhZ2Vfb3V0ID0gSU5JVElBVE9SX0VSUk9SOworCQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJCX0gZWxzZSBpZiAoIWVzcC0+bXNnaW5fbGVuKSB7CisJCQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCQkJCWl0ID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclswXTsKKwkJCQllbHNlCisJCQkJCWl0ID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKKwkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fbXNnaW5jb250KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogaXQgaXMgb2sgYW5kIHdlIHdhbnQgaXQgKi8KKwkJCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKKwkJCQkJaXQgPSBlc3AtPmN1cl9tc2dpbltlc3AtPm1zZ2luX2N0cl0gPQorCQkJCQkJZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclswXTsKKwkJCQllbHNlCisJCQkJCWl0ID0gZXNwLT5jdXJfbXNnaW5bZXNwLT5tc2dpbl9jdHJdID0KKwkJCQkJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCQkJZXNwLT5tc2dpbl9jdHIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCQlyZXR1cm4gZG9fd29ya19idXM7CisJCX0KKwl9IGVsc2UgeworCQlpdCA9IGVzcC0+Y3VyX21zZ2luWzBdOworCX0KKwlpZiAoIW1lc3NhZ2Vfb3V0ICYmIGVzcC0+bXNnaW5fbGVuKSB7CisJCWlmIChlc3AtPm1zZ2luX2N0ciA8IGVzcC0+bXNnaW5fbGVuKSB7CisJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fbXNnaW5jb250KTsKKwkJfSBlbHNlIGlmIChlc3AtPm1zZ2luX2xlbiA9PSAxKSB7CisJCQltZXNzYWdlX291dCA9IGNoZWNrX3NpbmdsZWJ5dGVfbXNnKGVzcCk7CisJCX0gZWxzZSBpZiAoZXNwLT5tc2dpbl9sZW4gPT0gMikgeworCQkJaWYgKGVzcC0+Y3VyX21zZ2luWzBdID09IEVYVEVOREVEX01FU1NBR0UpIHsKKwkJCQlpZiAoKGl0ICsgMikgPj0gMTUpIHsKKwkJCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwkJCQl9IGVsc2UgeworCQkJCQllc3AtPm1zZ2luX2xlbiA9IChpdCArIDIpOworCQkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fbXNnaW5jb250KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7IC8qIGZvbyBvbiB5b3UgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1lc3NhZ2Vfb3V0ID0gY2hlY2tfbXVsdGlieXRlX21zZyhlc3ApOworCQl9CisJfQorCWlmIChtZXNzYWdlX291dCA8IDApIHsKKwkJcmV0dXJuIC1tZXNzYWdlX291dDsKKwl9IGVsc2UgaWYgKG1lc3NhZ2Vfb3V0KSB7CisJCWlmICgoKG1lc3NhZ2Vfb3V0ICE9IDEpICYmCisJCSAgICAgKChtZXNzYWdlX291dCA8IDB4MjApIHx8IChtZXNzYWdlX291dCAmIDB4ODApKSkpCisJCQllc3AtPm1zZ291dF9sZW4gPSAxOworCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBtZXNzYWdlX291dDsKKwkJZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7CisJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7CisJCWVzcC0+bXNnaW5fbGVuID0gMDsKKwl9CisJZXNwLT5zcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUyk7CisJZXNwLT5zcmVnICY9IH4oRVNQX1NUQVRfSU5UUik7CisJaWYgKChlc3AtPnNyZWcgJiAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpKSA9PSAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpKQorCQllc3BfY21kKGVzcCwgRVNQX0NNRF9NT0spOworCWlmICgoU0NwdHItPlNDcC5zZW50X2NvbW1hbmQgPT0gaW5fbXNnaW5kb25lKSAmJgorCSAgICAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9mcmVlaW5nKSkKKwkJcmV0dXJuIGVzcF9kb19mcmVlYnVzKGVzcCk7CisJcmV0dXJuIGRvX2ludHJfZW5kOworfQorCitzdGF0aWMgaW50IGVzcF9kb19jbWRiZWdpbihzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisKKwllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fY21kZW5kKTsKKwlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQl1MzIgdG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBlc3AtPmVzcF9zY21kbGVmdDsgaSsrKQorCQkJZXNwLT5lc3BfY29tbWFuZFtpXSA9ICplc3AtPmVzcF9zY21kcCsrOworCQllc3AtPmVzcF9zY21kbGVmdCA9IDA7CisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJZXNwX3NldGNvdW50KGVzcC0+ZXJlZ3MsIGksIDEpOworCQllc3BfY21kKGVzcCwgKEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSkpOworCQl0bXAgfD0gKERNQV9TQ1NJX0RJU0FCIHwgRE1BX0VOQUJMRSk7CisJCXRtcCAmPSB+KERNQV9TVF9XUklURSk7CisJCXNidXNfd3JpdGVsKGksIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOworCQlzYnVzX3dyaXRlbChlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7CisJCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOworCX0gZWxzZSB7CisJCXU4IHRtcDsKKworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCXRtcCA9ICplc3AtPmVzcF9zY21kcCsrOworCQllc3AtPmVzcF9zY21kbGVmdC0tOworCQlzYnVzX3dyaXRlYih0bXAsIGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJfQorCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGludCBlc3BfZG9fY21kZG9uZShzdHJ1Y3QgZXNwICplc3ApCit7CisJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCisJCWRtYV9pbnZhbGlkYXRlKGVzcCk7CisJZWxzZQorCQllc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMKTsKKworCWlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9CU0VSVikgeworCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKKwkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKKwl9CisKKwlFU1BMT0coKCJlc3AlZDogaW4gZG9fY21kZG9uZSgpIGJ1dCBkaWRuJ3QgZ2V0IEJTRVJWIGludGVycnVwdC5cbiIsCisJCWVzcC0+ZXNwX2lkKSk7CisJcmV0dXJuIGRvX3Jlc2V0X2J1czsKK30KKworc3RhdGljIGludCBlc3BfZG9fbXNnb3V0KHN0cnVjdCBlc3AgKmVzcCkKK3sKKwllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJc3dpdGNoIChlc3AtPm1zZ291dF9sZW4pIHsKKwljYXNlIDE6CisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQorCQkJaG1lX2ZpZm9fcHVzaChlc3AsICZlc3AtPmN1cl9tc2dvdXRbMF0sIDEpOworCQllbHNlCisJCQlzYnVzX3dyaXRlYihlc3AtPmN1cl9tc2dvdXRbMF0sIGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOworCisJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07CisJCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07CisKKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCWhtZV9maWZvX3B1c2goZXNwLCAmZXNwLT5jdXJfbXNnb3V0WzBdLCAyKTsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKKwkJfSBlbHNlIHsKKwkJCWRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgMiwgMCk7CisJCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgMiwgMCk7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgNDoKKwkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwkJZXNwLT5lc3BfY29tbWFuZFsxXSA9IGVzcC0+Y3VyX21zZ291dFsxXTsKKwkJZXNwLT5lc3BfY29tbWFuZFsyXSA9IGVzcC0+Y3VyX21zZ291dFsyXTsKKwkJZXNwLT5lc3BfY29tbWFuZFszXSA9IGVzcC0+Y3VyX21zZ291dFszXTsKKwkJZXNwLT5zbmlwID0gMTsKKworCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgeworCQkJaG1lX2ZpZm9fcHVzaChlc3AsICZlc3AtPmN1cl9tc2dvdXRbMF0sIDQpOworCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOworCQl9IGVsc2UgeworCQkJZG1hX3NldHVwKGVzcCwgZXNwLT5lc3BfY29tbWFuZF9kdm1hLCA0LCAwKTsKKwkJCWVzcF9zZXRjb3VudChlc3AtPmVyZWdzLCA0LCAwKTsKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSA1OgorCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwLT5jdXJfbXNnb3V0WzBdOworCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOworCQllc3AtPmVzcF9jb21tYW5kWzJdID0gZXNwLT5jdXJfbXNnb3V0WzJdOworCQllc3AtPmVzcF9jb21tYW5kWzNdID0gZXNwLT5jdXJfbXNnb3V0WzNdOworCQllc3AtPmVzcF9jb21tYW5kWzRdID0gZXNwLT5jdXJfbXNnb3V0WzRdOworCQllc3AtPnNuaXAgPSAxOworCisJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCQlobWVfZmlmb19wdXNoKGVzcCwgJmVzcC0+Y3VyX21zZ291dFswXSwgNSk7CisJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCX0gZWxzZSB7CisJCQlkbWFfc2V0dXAoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIDUsIDApOworCQkJZXNwX3NldGNvdW50KGVzcC0+ZXJlZ3MsIDUsIDApOworCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiB3aG9vcHMgKi8KKwkJRVNQTUlTQygoImJvZ3VzIG1zZ291dCBzZW5kaW5nIE5PUFxuIikpOworCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBOT1A7CisKKwkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKKwkJCWhtZV9maWZvX3B1c2goZXNwLCAmZXNwLT5jdXJfbXNnb3V0WzBdLCAxKTsKKwkJfSBlbHNlIHsKKwkJCXNidXNfd3JpdGViKGVzcC0+Y3VyX21zZ291dFswXSwgZXNwLT5lcmVncyArIEVTUF9GREFUQSk7CisJCX0KKworCQllc3AtPm1zZ291dF9sZW4gPSAxOworCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCWJyZWFrOworCX07CisKKwllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ291dGRvbmUpOworCXJldHVybiBkb19pbnRyX2VuZDsKK30KKworc3RhdGljIGludCBlc3BfZG9fbXNnb3V0ZG9uZShzdHJ1Y3QgZXNwICplc3ApCit7CisJaWYgKGVzcC0+bXNnb3V0X2xlbiA+IDEpIHsKKwkJLyogWFhYIEhNRS9GQVMgQVROIGRlYXNzZXJ0IHdvcmthcm91bmQgcmVxdWlyZWQsCisJCSAqIFhYWCBubyBETUEgZmx1c2hpbmcsIG9ubHkgcG9zc2libGUgRVNQX0NNRF9GTFVTSAorCQkgKiBYWFggdG8ga2lsbCB0aGUgZmlmby4KKwkJICovCisJCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSB7CisJCQl1MzIgdG1wOworCisJCQl3aGlsZSAoKHRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpKSAmIERNQV9QRU5EX1JFQUQpCisJCQkJdWRlbGF5KDEpOworCQkJdG1wICY9IH5ETUFfRU5BQkxFOworCQkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7CisJCQlkbWFfaW52YWxpZGF0ZShlc3ApOworCQl9IGVsc2UgeworCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCQl9CisJfQorCWlmICghKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSkgeworCQlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkKKwkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOworCQlzd2l0Y2ggKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSB7CisJCWNhc2UgRVNQX01PUDoKKwkJCS8qIHdob29wcywgcGFyaXR5IGVycm9yICovCisJCQlFU1BMT0coKCJlc3AlZDogc3RpbGwgaW4gbXNnb3V0LCBwYXJpdHkgZXJyb3IgYXNzdW1lZFxuIiwKKwkJCQllc3AtPmVzcF9pZCkpOworCQkJaWYgKGVzcC0+bXNnb3V0X2xlbiA+IDEpCisJCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7CisJCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ291dCk7CisJCQlyZXR1cm4gZG9fd29ya19idXM7CisKKwkJY2FzZSBFU1BfRElQOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIEhhcHB5IE1lYWwgZmlmbyBpcyB0b3VjaHkuLi4gKi8KKwkJCWlmICgoZXNwLT5lcmV2ICE9IGZhc2htZSkgJiYKKwkJCSAgICAhZmNvdW50KGVzcCkgJiYKKwkJCSAgICAhKCgoc3RydWN0IGVzcF9kZXZpY2UgKillc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aG9zdGRhdGEpLT5zeW5jX21heF9vZmZzZXQpKQorCQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJCWJyZWFrOworCisJCX07CisJfSBlbHNlIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3QsIHJlc2V0dGluZyBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7CisJCXJldHVybiBkb19yZXNldF9idXM7CisJfQorCisJLyogSWYgd2Ugc2VudCBvdXQgYSBzeW5jaHJvbm91cyBuZWdvdGlhdGlvbiBtZXNzYWdlLCB1cGRhdGUKKwkgKiBvdXIgc3RhdGUuCisJICovCisJaWYgKGVzcC0+Y3VyX21zZ291dFsyXSA9PSBFWFRFTkRFRF9NRVNTQUdFICYmCisJICAgIGVzcC0+Y3VyX21zZ291dFs0XSA9PSBFWFRFTkRFRF9TRFRSKSB7CisJCWVzcC0+c25pcCA9IDE7IC8qIGFuYWwgcmV0ZW50aXZlbmVzcy4uLiAqLworCX0KKworCWVzcC0+cHJldm1zZ291dCA9IGVzcC0+Y3VyX21zZ291dFswXTsKKwllc3AtPm1zZ291dF9sZW4gPSAwOworCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOworCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2J1c191bmV4cGVjdGVkKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlFU1BMT0coKCJlc3AlZDogY29tbWFuZCBpbiB3ZWlyZCBzdGF0ZSAlMnhcbiIsCisJCWVzcC0+ZXNwX2lkLCBlc3AtPmN1cnJlbnRfU0MtPlNDcC5waGFzZSkpOworCXJldHVybiBkb19yZXNldF9idXM7Cit9CisKK3N0YXRpYyBlc3BmdW5jX3QgYnVzX3ZlY3RvcltdID0geworCWVzcF9kb19kYXRhX2ZpbmFsZSwKKwllc3BfZG9fZGF0YV9maW5hbGUsCisJZXNwX2J1c191bmV4cGVjdGVkLAorCWVzcF9kb19tc2dpbiwKKwllc3BfZG9fbXNnaW5jb250LAorCWVzcF9kb19tc2dpbmRvbmUsCisJZXNwX2RvX21zZ291dCwKKwllc3BfZG9fbXNnb3V0ZG9uZSwKKwllc3BfZG9fY21kYmVnaW4sCisJZXNwX2RvX2NtZGRvbmUsCisJZXNwX2RvX3N0YXR1cywKKwllc3BfZG9fZnJlZWJ1cywKKwllc3BfZG9fcGhhc2VfZGV0ZXJtaW5lLAorCWVzcF9idXNfdW5leHBlY3RlZCwKKwllc3BfYnVzX3VuZXhwZWN0ZWQsCisJZXNwX2J1c191bmV4cGVjdGVkLAorfTsKKworLyogVGhpcyBpcyB0aGUgc2Vjb25kIHRpZXIgaW4gb3VyIGR1YWwtbGV2ZWwgU0NTSSBzdGF0ZSBtYWNoaW5lLiAqLworc3RhdGljIGludCBlc3Bfd29ya19idXMoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOworCXVuc2lnbmVkIGludCBwaGFzZTsKKworCUVTUEJVUygoImVzcF93b3JrX2J1czogIikpOworCWlmICghU0NwdHIpIHsKKwkJRVNQQlVTKCgicmVjb25uZWN0XG4iKSk7CisJCXJldHVybiBlc3BfZG9fcmVjb25uZWN0KGVzcCk7CisJfQorCXBoYXNlID0gU0NwdHItPlNDcC5waGFzZTsKKwlpZiAoKHBoYXNlICYgMHhmMCkgPT0gaW5fcGhhc2VzX21hc2spCisJCXJldHVybiBidXNfdmVjdG9yWyhwaGFzZSAmIDB4MGYpXShlc3ApOworCWVsc2UgaWYgKChwaGFzZSAmIDB4ZjApID09IGluX3NsY3RfbWFzaykKKwkJcmV0dXJuIGVzcF9zZWxlY3RfY29tcGxldGUoZXNwKTsKKwllbHNlCisJCXJldHVybiBlc3BfYnVzX3VuZXhwZWN0ZWQoZXNwKTsKK30KKworc3RhdGljIGVzcGZ1bmNfdCBpc3ZjX3ZlY3RvcltdID0geworCTAsCisJZXNwX2RvX3BoYXNlX2RldGVybWluZSwKKwllc3BfZG9fcmVzZXRidXMsCisJZXNwX2ZpbmlzaF9yZXNldCwKKwllc3Bfd29ya19idXMKK307CisKKy8qIE1haW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFuIGVzcCBhZGFwdGVyLiAqLworc3RhdGljIHZvaWQgZXNwX2hhbmRsZShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwdHI7CisJaW50IHdoYXRfbmV4dCA9IGRvX2ludHJfZW5kOworCisJU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7CisKKwkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLworCWVzcC0+c3JlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpOworCWVzcC0+c3JlZyAmPSAofkVTUF9TVEFUX0lOVFIpOworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCWVzcC0+c3JlZzIgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTMik7CisJCWVzcC0+c2VxcmVnID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TU1RFUCkgJiBFU1BfU1RFUF9WQklUUyk7CisJfQorCisJaWYgKGVzcC0+c3JlZyAmIChFU1BfU1RBVF9TUEFNKSkgeworCQkvKiBHcm9zcyBlcnJvciwgY291bGQgYmUgZHVlIHRvIG9uZSBvZjoKKwkJICoKKwkJICogLSB0b3Agb2YgZmlmbyBvdmVyd3JpdHRlbiwgY291bGQgYmUgYmVjYXVzZQorCQkgKiAgIHdlIHRyaWVkIHRvIGRvIGEgc3luY2hyb25vdXMgdHJhbnNmZXIgd2l0aAorCQkgKiAgIGFuIG9mZnNldCBncmVhdGVyIHRoYW4gRVNQIGZpZm8gc2l6ZQorCQkgKgorCQkgKiAtIHRvcCBvZiBjb21tYW5kIHJlZ2lzdGVyIG92ZXJ3cml0dGVuCisJCSAqCisJCSAqIC0gRE1BIHNldHVwIHRvIGdvIGluIG9uZSBkaXJlY3Rpb24sIFNDU0kKKwkJICogICBidXMgcG9pbnRzIGluIHRoZSBvdGhlciwgd2hvb3BzCisJCSAqCisJCSAqIC0gd2VpcmQgcGhhc2UgY2hhbmdlIGR1cmluZyBhc3luY2hyb25vdXMKKwkJICogICBkYXRhIHBoYXNlIHdoaWxlIHdlIGFyZSBpbml0aWF0b3IKKwkJICovCisJCUVTUExPRygoImVzcCVkOiBHcm9zcyBlcnJvciBzcmVnPSUyeFxuIiwgZXNwLT5lc3BfaWQsIGVzcC0+c3JlZykpOworCisJCS8qIElmIGEgY29tbWFuZCBpcyBsaXZlIG9uIHRoZSBidXMgd2UgY2Fubm90IHNhZmVseQorCQkgKiByZXNldCB0aGUgYnVzLCBzbyB3ZSdsbCBqdXN0IGxldCB0aGUgcGllY2VzIGZhbGwKKwkJICogd2hlcmUgdGhleSBtYXkuICBIZXJlIHdlIGFyZSBob3BpbmcgdGhhdCB0aGUKKwkJICogdGFyZ2V0IHdpbGwgYmUgYWJsZSB0byBjbGVhbmx5IGdvIGF3YXkgc29vbgorCQkgKiBzbyB3ZSBjYW4gc2FmZWx5IHJlc2V0IHRoaW5ncy4KKwkJICovCisJCWlmICghU0NwdHIpIHsKKwkJCUVTUExPRygoImVzcCVkOiBObyBjdXJyZW50IGNtZCBkdXJpbmcgZ3Jvc3MgZXJyb3IsICIKKwkJCQkicmVzZXR0aW5nIGJ1c1xuIiwgZXNwLT5lc3BfaWQpKTsKKwkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJCWdvdG8gc3RhdGVfbWFjaGluZTsKKwkJfQorCX0KKworCWlmIChzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9ITkRMX0VSUk9SKSB7CisJCS8qIEEgRE1BIGdhdGUgYXJyYXkgZXJyb3IuICBIZXJlIHdlIG11c3QKKwkJICogYmUgc2VlaW5nIG9uZSBvZiB0d28gdGhpbmdzLiAgRWl0aGVyIHRoZQorCQkgKiB2aXJ0dWFsIHRvIHBoeXNpY2FsIGFkZHJlc3MgdHJhbnNsYXRpb24KKwkJICogb24gdGhlIFNCVVMgY291bGQgbm90IG9jY3VyLCBlbHNlIHRoZQorCQkgKiB0cmFuc2xhdGlvbiBpdCBkaWQgZ2V0IHBvaW50ZWQgdG8gYSBib2d1cworCQkgKiBwYWdlLiAgSG8gaHVtLi4uCisJCSAqLworCQlFU1BMT0coKCJlc3AlZDogRE1BIGVycm9yICUwOHhcbiIsIGVzcC0+ZXNwX2lkLAorCQkJc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikpKTsKKworCQkvKiBETUEgZ2F0ZSBhcnJheSBpdHNlbGYgbXVzdCBiZSByZXNldCB0byBjbGVhciB0aGUKKwkJICogZXJyb3IgY29uZGl0aW9uLgorCQkgKi8KKwkJZXNwX3Jlc2V0X2RtYShlc3ApOworCisJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJZ290byBzdGF0ZV9tYWNoaW5lOworCX0KKworCWVzcC0+aXJlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpOyAgIC8qIFVubGF0Y2ggaW50ciByZWcgKi8KKworCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7CisJCS8qIFRoaXMgY2hpcCBpcyByZWFsbHkgbG9zaW5nLiAqLworCQlFU1BITUUoKCJITUVbIikpOworCisJCUVTUEhNRSgoInNyZWcyPSUwMngsIiwgZXNwLT5zcmVnMikpOworCQkvKiBNdXN0IGxhdGNoIGZpZm8gYmVmb3JlIHJlYWRpbmcgdGhlIGludGVycnVwdAorCQkgKiByZWdpc3RlciBlbHNlIGdhcmJhZ2UgZW5kcyB1cCBpbiB0aGUgRklGTworCQkgKiB3aGljaCBjb25mdXNlcyB0aGUgZHJpdmVyIHV0dGVybHkuCisJCSAqLworCQlpZiAoIShlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0ZFTVBUWSkgfHwKKwkJICAgIChlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0YxQllURSkpIHsKKwkJCUVTUEhNRSgoImZpZm9fd29ya2Fyb3VuZF0iKSk7CisJCQlobWVfZmlmb19yZWFkKGVzcCk7CisJCX0gZWxzZSB7CisJCQlFU1BITUUoKCJub19maWZvX3dvcmthcm91bmRdIikpOworCQl9CisJfQorCisJLyogTm8gY3VycmVudCBjbWQgaXMgb25seSB2YWxpZCBhdCB0aGlzIHBvaW50IHdoZW4gdGhlcmUgYXJlCisJICogY29tbWFuZHMgb2ZmIHRoZSBidXMgb3Igd2UgYXJlIHRyeWluZyBhIHJlc2V0LgorCSAqLworCWlmICghU0NwdHIgJiYgIWVzcC0+ZGlzY29ubmVjdGVkX1NDICYmICEoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpKSB7CisJCS8qIFBhbmljIGlzIHNhZmUsIHNpbmNlIGN1cnJlbnRfU0MgaXMgbnVsbC4gKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IG5vIGNvbW1hbmQgaW4gZXNwX2hhbmRsZSgpXG4iLCBlc3AtPmVzcF9pZCkpOworCQlwYW5pYygiZXNwX2hhbmRsZTogY3VycmVudF9TQyA9PSBwZW5ndWluIHdpdGhpbiBpbnRlcnJ1cHQhIik7CisJfQorCisJaWYgKGVzcC0+aXJlZyAmIChFU1BfSU5UUl9JQykpIHsKKwkJLyogSWxsZWdhbCBjb21tYW5kIGZlZCB0byBFU1AuICBPdXRzaWRlIG9mIG9idmlvdXMKKwkJICogc29mdHdhcmUgYnVncyB0aGF0IGNvdWxkIGNhdXNlIHRoaXMsIHRoZXJlIGlzCisJCSAqIGEgY29uZGl0aW9uIHdpdGggZXNwMTAwIHdoZXJlIHdlIGNhbiBjb25mdXNlIHRoZQorCQkgKiBFU1AgaW50byBhbiBlcnJvbmVvdXMgaWxsZWdhbCBjb21tYW5kIGludGVycnVwdAorCQkgKiBiZWNhdXNlIGl0IGRvZXMgbm90IHNjcmFwZSB0aGUgRklGTyBwcm9wZXJseQorCQkgKiBmb3IgcmVzZWxlY3Rpb24uICBTZWUgZXNwMTAwX3JlY29ubmVjdF9od2J1ZygpCisJCSAqIHRvIHNlZSBob3cgd2UgdHJ5IHZlcnkgaGFyZCB0byBhdm9pZCB0aGlzLgorCQkgKi8KKwkJRVNQTE9HKCgiZXNwJWQ6IGludmFsaWQgY29tbWFuZFxuIiwgZXNwLT5lc3BfaWQpKTsKKworCQllc3BfZHVtcF9zdGF0ZShlc3ApOworCisJCWlmIChTQ3B0ciAhPSBOVUxMKSB7CisJCQkvKiBEZXZpY2VzIHdpdGggdmVyeSBidWdneSBmaXJtd2FyZSBjYW4gZHJvcCBCU1kKKwkJCSAqIGR1cmluZyBhIHNjYXR0ZXIgbGlzdCBpbnRlcnJ1cHQgd2hlbiB1c2luZyBzeW5jCisJCQkgKiBtb2RlIHRyYW5zZmVycy4gIFdlIGNvbnRpbnVlIHRoZSB0cmFuc2ZlciBhcworCQkJICogZXhwZWN0ZWQsIHRoZSB0YXJnZXQgZHJvcHMgdGhlIGJ1cywgdGhlIEVTUAorCQkJICogZ2V0cyBjb25mdXNlZCwgYW5kIHdlIGdldCBhIGlsbGVnYWwgY29tbWFuZAorCQkJICogaW50ZXJydXB0IGJlY2F1c2UgdGhlIGJ1cyBpcyBpbiB0aGUgZGlzY29ubmVjdGVkCisJCQkgKiBzdGF0ZSBub3cgYW5kIEVTUF9DTURfVEkgaXMgb25seSBhbGxvd2VkIHdoZW4KKwkJCSAqIGEgbmV4dXMgaXMgYWxpdmUgb24gdGhlIGJ1cy4KKwkJCSAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IEZvcmNpbmcgYXN5bmMgYW5kIGRpc2FibGluZyBkaXNjb25uZWN0IGZvciAiCisJCQkJInRhcmdldCAlZFxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7CisJCQlTQ3B0ci0+ZGV2aWNlLT5ib3JrZW4gPSAxOyAvKiBmb28gb24geW91ICovCisJCX0KKworCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7CisJfSBlbHNlIGlmICghKGVzcC0+aXJlZyAmIH4oRVNQX0lOVFJfRkRPTkUgfCBFU1BfSU5UUl9CU0VSViB8IEVTUF9JTlRSX0RDKSkpIHsKKwkJaWYgKFNDcHRyKSB7CisJCQl1bnNpZ25lZCBpbnQgcGhhc2UgPSBTQ3B0ci0+U0NwLnBoYXNlOworCisJCQlpZiAocGhhc2UgJiBpbl9waGFzZXNfbWFzaykgeworCQkJCXdoYXRfbmV4dCA9IGVzcF93b3JrX2J1cyhlc3ApOworCQkJfSBlbHNlIGlmIChwaGFzZSAmIGluX3NsY3RfbWFzaykgeworCQkJCXdoYXRfbmV4dCA9IGVzcF9zZWxlY3RfY29tcGxldGUoZXNwKTsKKwkJCX0gZWxzZSB7CisJCQkJRVNQTE9HKCgiZXNwJWQ6IGludGVycnVwdCBmb3Igbm8gZ29vZCByZWFzb24uLi5cbiIsCisJCQkJCWVzcC0+ZXNwX2lkKSk7CisJCQkJd2hhdF9uZXh0ID0gZG9faW50cl9lbmQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlFU1BMT0coKCJlc3AlZDogQlNFUlYgb3IgRkRPTkUgb3IgREMgd2hpbGUgU0NwdHI9PU5VTExcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJfQorCX0gZWxzZSBpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpIHsKKwkJRVNQTE9HKCgiZXNwJWQ6IFNDU0kgYnVzIHJlc2V0IGludGVycnVwdFxuIiwgZXNwLT5lc3BfaWQpKTsKKwkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfY29tcGxldGU7CisJfSBlbHNlIGlmIChlc3AtPmlyZWcgJiAoRVNQX0lOVFJfUyB8IEVTUF9JTlRSX1NBVE4pKSB7CisJCUVTUExPRygoImVzcCVkOiBBSUVFRSB3ZSBoYXZlIGJlZW4gc2VsZWN0ZWQgYnkgYW5vdGhlciBpbml0aWF0b3IhXG4iLAorCQkJZXNwLT5lc3BfaWQpKTsKKwkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOworCX0gZWxzZSBpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfUlNFTCkgeworCQlpZiAoU0NwdHIgPT0gTlVMTCkgeworCQkJLyogVGhpcyBpcyBvay4gKi8KKwkJCXdoYXRfbmV4dCA9IGVzcF9kb19yZWNvbm5lY3QoZXNwKTsKKwkJfSBlbHNlIGlmIChTQ3B0ci0+U0NwLnBoYXNlICYgaW5fc2xjdF9tYXNrKSB7CisJCQkvKiBPbmx5IHNlbGVjdGlvbiBjb2RlIGtub3dzIGhvdyB0byBjbGVhbgorCQkJICogdXAgcHJvcGVybHkuCisJCQkgKi8KKwkJCUVTUERJU0MoKCJSZXNlbGVjdGVkIGR1cmluZyBzZWxlY3Rpb24gYXR0ZW1wdFxuIikpOworCQkJd2hhdF9uZXh0ID0gZXNwX3NlbGVjdF9jb21wbGV0ZShlc3ApOworCQl9IGVsc2UgeworCQkJRVNQTE9HKCgiZXNwJWQ6IFJlc2VsZWN0ZWQgd2hpbGUgYnVzIGlzIGJ1c3lcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJfQorCX0KKworCS8qIFRoaXMgaXMgdGllci1vbmUgaW4gb3VyIGR1YWwgbGV2ZWwgU0NTSSBzdGF0ZSBtYWNoaW5lLiAqLworc3RhdGVfbWFjaGluZToKKwl3aGlsZSAod2hhdF9uZXh0ICE9IGRvX2ludHJfZW5kKSB7CisJCWlmICh3aGF0X25leHQgPj0gZG9fcGhhc2VfZGV0ZXJtaW5lICYmCisJCSAgICB3aGF0X25leHQgPCBkb19pbnRyX2VuZCkgeworCQkJd2hhdF9uZXh0ID0gaXN2Y192ZWN0b3Jbd2hhdF9uZXh0XShlc3ApOworCQl9IGVsc2UgeworCQkJLyogc3RhdGUgaXMgY29tcGxldGVseSBsb3N0IDstKCAqLworCQkJRVNQTE9HKCgiZXNwJWQ6IGludGVycnVwdCBlbmdpbmUgbG9zZXMgc3RhdGUsIHJlc2V0dGluZyBidXNcbiIsCisJCQkJZXNwLT5lc3BfaWQpKTsKKwkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKKwkJfQorCX0KK30KKworLyogU2VydmljZSBvbmx5IHRoZSBFU1AgZGVzY3JpYmVkIGJ5IGRldl9pZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBlc3BfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwcmVncykKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGVzcC0+ZWhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWlmIChFU1BfSVJRX1AoZXNwLT5kcmVncykpIHsKKwkJRVNQX0lOVFNPRkYoZXNwLT5kcmVncyk7CisKKwkJRVNQSVJRKCgiSVslZDolZF0oIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBlc3AtPmVzcF9pZCkpOworCQllc3BfaGFuZGxlKGVzcCk7CisJCUVTUElSUSgoIikiKSk7CisKKwkJRVNQX0lOVFNPTihlc3AtPmRyZWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShlc3AtPmVob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBlc3Bfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpTRHB0cikKK3sKKwlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9CisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3BfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWVzcF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChlc3BfZGV2LCAwLCBzaXplb2Yoc3RydWN0IGVzcF9kZXZpY2UpKTsKKwlTRHB0ci0+aG9zdGRhdGEgPSBlc3BfZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlc3Bfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcHRyKQoreworCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIFNEcHRyLT5ob3N0LT5ob3N0ZGF0YTsKKworCWVzcC0+dGFyZ2V0c19wcmVzZW50ICY9IH4oMSA8PCBTRHB0ci0+aWQpOworCWtmcmVlKFNEcHRyLT5ob3N0ZGF0YSk7CisJU0RwdHItPmhvc3RkYXRhID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcCIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiU3VuIEVTUCAxMDAvMTAwYS8yMDAiLAorCS5kZXRlY3QJCQk9IGVzcF9kZXRlY3QsCisJLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKKwkucmVsZWFzZQkJPSBlc3BfcmVsZWFzZSwKKwkuaW5mbwkJCT0gZXNwX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lc3AuaCBiL2RyaXZlcnMvc2NzaS9lc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Y3ZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2VzcC5oCkBAIC0wLDAgKzEsNDEwIEBACisvKiAkSWQ6IGVzcC5oLHYgMS4yOSAyMDAxLzEyLzExIDA0OjU1OjQ3IGRhdmVtIEV4cCAkCisgKiBlc3AuaDogIERlZmluZXMgYW5kIHN0cnVjdHVyZXMgZm9yIHRoZSBTcGFyYyBFU1AgKEVuaGFuY2VkIFNDU0kKKyAqICAgICAgICAgUHJvY2Vzc29yKSBkcml2ZXIgdW5kZXIgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9TUEFSQ19FU1BfSAorI2RlZmluZSBfU1BBUkNfRVNQX0gKKworLyogRm9yIGR2bWEgY29udHJvbGxlciByZWdpc3RlciBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKy8qIFRoZSBFU1AgU0NTSSBjb250cm9sbGVycyBoYXZlIHRoZWlyIHJlZ2lzdGVyIHNldHMgaW4gdGhyZWUKKyAqICJjbGFzc2VzIjoKKyAqCisgKiAxKSBSZWdpc3RlcnMgd2hpY2ggYXJlIGJvdGggcmVhZCBhbmQgd3JpdGUuCisgKiAyKSBSZWdpc3RlcnMgd2hpY2ggYXJlIHJlYWQgb25seS4KKyAqIDMpIFJlZ2lzdGVycyB3aGljaCBhcmUgd3JpdGUgb25seS4KKyAqCisgKiBZZXQsIHRoZXkgYWxsIGxpdmUgd2l0aGluIHRoZSBzYW1lIElPIHNwYWNlLgorICovCisKKy8qIEFsbCB0aGUgRVNQIHJlZ2lzdGVycyBhcmUgb25lIGJ5dGUgZWFjaCBhbmQgYXJlIGFjY2Vzc2VkIGxvbmd3b3JkcworICogYXBhcnQgd2l0aCBhIGJpZy1lbmRpYW4gb3JkZXJpbmcgdG8gdGhlIGJ5dGVzLgorICovCisJCQkJCS8qIEFjY2VzcyAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgT2Zmc2V0ICovCisjZGVmaW5lIEVTUF9UQ0xPVwkweDAwVUwJCS8qIHJ3ICBMb3cgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwMCAgICovCisjZGVmaW5lIEVTUF9UQ01FRAkweDA0VUwJCS8qIHJ3ICBNaWQgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwNCAgICovCisjZGVmaW5lIEVTUF9GREFUQQkweDA4VUwJCS8qIHJ3ICBGSUZPIGRhdGEgYml0cyAgICAgICAgICAgICAgICAgMHgwOCAgICovCisjZGVmaW5lIEVTUF9DTUQJCTB4MGNVTAkJLyogcncgIFNDU0kgY29tbWFuZCBiaXRzICAgICAgICAgICAgICAweDBjICAgKi8KKyNkZWZpbmUgRVNQX1NUQVRVUwkweDEwVUwJCS8qIHJvICBFU1Agc3RhdHVzIHJlZ2lzdGVyICAgICAgICAgICAgMHgxMCAgICovCisjZGVmaW5lIEVTUF9CVVNJRAlFU1BfU1RBVFVTCS8qIHdvICBCdXMgSUQgZm9yIHNlbGVjdC9yZXNlbGVjdCAgICAgMHgxMCAgICovCisjZGVmaW5lIEVTUF9JTlRSUFQJMHgxNFVMCQkvKiBybyAgS2luZCBvZiBpbnRlcnJ1cHQgICAgICAgICAgICAgIDB4MTQgICAqLworI2RlZmluZSBFU1BfVElNRU8JRVNQX0lOVFJQVAkvKiB3byAgVGltZW91dCB2YWx1ZSBmb3Igc2VsZWN0L3Jlc2VsIDB4MTQgICAqLworI2RlZmluZSBFU1BfU1NURVAJMHgxOFVMCQkvKiBybyAgU2VxdWVuY2Ugc3RlcCByZWdpc3RlciAgICAgICAgIDB4MTggICAqLworI2RlZmluZSBFU1BfU1RQCQlFU1BfU1NURVAJLyogd28gIFRyYW5zZmVyIHBlcmlvZCBwZXIgc3luYyAgICAgICAweDE4ICAgKi8KKyNkZWZpbmUgRVNQX0ZGTEFHUwkweDFjVUwJCS8qIHJvICBCaXRzIG9mIGN1cnJlbnQgRklGTyBpbmZvICAgICAgMHgxYyAgICovCisjZGVmaW5lIEVTUF9TT0ZGCUVTUF9GRkxBR1MJLyogd28gIFN5bmMgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAweDFjICAgKi8KKyNkZWZpbmUgRVNQX0NGRzEJMHgyMFVMCQkvKiBydyAgRmlyc3QgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MjAgICAqLworI2RlZmluZSBFU1BfQ0ZBQ1QJMHgyNFVMCQkvKiB3byAgQ2xvY2sgY29udmVyc2lvbiBmYWN0b3IgICAgICAgIDB4MjQgICAqLworI2RlZmluZSBFU1BfU1RBVFVTMglFU1BfQ0ZBQ1QJLyogcm8gIEhNRSBzdGF0dXMyIHJlZ2lzdGVyICAgICAgICAgICAweDI0ICAgKi8KKyNkZWZpbmUgRVNQX0NURVNUCTB4MjhVTAkJLyogd28gIENoaXAgdGVzdCByZWdpc3RlciAgICAgICAgICAgICAweDI4ICAgKi8KKyNkZWZpbmUgRVNQX0NGRzIJMHgyY1VMCQkvKiBydyAgU2Vjb25kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgIDB4MmMgICAqLworI2RlZmluZSBFU1BfQ0ZHMwkweDMwVUwJCS8qIHJ3ICBUaGlyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgzMCAgICovCisjZGVmaW5lIEVTUF9UQ0hJCTB4MzhVTAkJLyogcncgIEhpZ2ggYml0cyBvZiB0cmFuc2ZlciBjb3VudCAgICAweDM4ICAgKi8KKyNkZWZpbmUgRVNQX1VJRAkJRVNQX1RDSEkJLyogcm8gIFVuaXF1ZSBJRCBjb2RlICAgICAgICAgICAgICAgICAweDM4ICAgKi8KKyNkZWZpbmUgRkFTX1JMTwkJRVNQX1RDSEkJLyogcncgIEhNRSBleHRlbmRlZCBjb3VudGVyICAgICAgICAgICAweDM4ICAgKi8KKyNkZWZpbmUgRVNQX0ZHUk5ECTB4M2NVTAkJLyogcncgIERhdGEgYmFzZSBmb3IgZmlmbyAgICAgICAgICAgICAweDNjICAgKi8KKyNkZWZpbmUgRkFTX1JISQkJRVNQX0ZHUk5ECS8qIHJ3ICBITUUgZXh0ZW5kZWQgY291bnRlciAgICAgICAgICAgMHgzYyAgICovCisjZGVmaW5lIEVTUF9SRUdfU0laRQkweDQwVUwKKworLyogVmFyaW91cyByZXZpc2lvbnMgb2YgdGhlIEVTUCBib2FyZC4gKi8KK2VudW0gZXNwX3JldiB7CisJZXNwMTAwICAgICA9IDB4MDAsICAvKiBOQ1I1M0M5MCAtIHZlcnkgYnJva2VuICovCisJZXNwMTAwYSAgICA9IDB4MDEsICAvKiBOQ1I1M0M5MEEgKi8KKwllc3AyMzYgICAgID0gMHgwMiwKKwlmYXMyMzYgICAgID0gMHgwMywKKwlmYXMxMDBhICAgID0gMHgwNCwKKwlmYXN0ICAgICAgID0gMHgwNSwKKwlmYXNobWUgICAgID0gMHgwNiwKKwllc3B1bmtub3duID0gMHgwNworfTsKKworLyogV2UgYWxsb2NhdGUgb25lIG9mIHRoZXNlIGZvciBlYWNoIHNjc2kgZGV2aWNlIGFuZCBhdHRhY2ggaXQgdG8KKyAqIFNEcHRyLT5ob3N0ZGF0YSBmb3IgdXNlIGluIHRoZSBkcml2ZXIKKyAqLworc3RydWN0IGVzcF9kZXZpY2UgeworICB1bnNpZ25lZCBjaGFyIHN5bmNfbWluX3BlcmlvZDsKKyAgdW5zaWduZWQgY2hhciBzeW5jX21heF9vZmZzZXQ7CisgIHVuc2lnbmVkIHN5bmM6MTsKKyAgdW5zaWduZWQgd2lkZToxOworICB1bnNpZ25lZCBkaXNjb25uZWN0OjE7Cit9OworCitzdHJ1Y3Qgc2NzaV9jbW5kOworCisvKiBXZSBnZXQgb25lIG9mIHRoZXNlIGZvciBlYWNoIEVTUCBwcm9iZWQuICovCitzdHJ1Y3QgZXNwIHsKKwl2b2lkIF9faW9tZW0JCSplcmVnczsJCS8qIEVTUCBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCXZvaWQgX19pb21lbQkJKmRyZWdzOwkJLyogRE1BIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisJc3RydWN0IHNidXNfZG1hCQkqZG1hOwkJLyogRE1BIGNvbnRyb2xsZXIgc3cgc3RhdGUgKi8KKwlzdHJ1Y3QgU2NzaV9Ib3N0CSplaG9zdDsJCS8qIEJhY2twb2ludGVyIHRvIFNDU0kgSG9zdCAqLworCXN0cnVjdCBzYnVzX2RldgkJKnNkZXY7CQkvKiBQb2ludGVyIHRvIFNCdXMgZW50cnkgKi8KKworCS8qIEVTUCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworCXU4CQkJY29uZmlnMTsJLyogQ29weSBvZiB0aGUgMXN0IGNvbmZpZyByZWdpc3RlciAqLworCXU4CQkJY29uZmlnMjsJLyogQ29weSBvZiB0aGUgMm5kIGNvbmZpZyByZWdpc3RlciAqLworCXU4CQkJY29uZmlnM1sxNl07CS8qIENvcHkgb2YgdGhlIDNyZCBjb25maWcgcmVnaXN0ZXIgKi8KKworCS8qIFRoZSBjdXJyZW50IGNvbW1hbmQgd2UgYXJlIHNlbmRpbmcgdG8gdGhlIEVTUCBjaGlwLiAgVGhpcyBlc3BfY29tbWFuZAorCSAqIHB0ciBuZWVkcyB0byBiZSBtYXBwZWQgaW4gRFZNQSBhcmVhIHNvIHdlIGNhbiBzZW5kIGNvbW1hbmRzIGFuZCByZWFkCisJICogZnJvbSB0aGUgRVNQIGZpZm8gd2l0aG91dCBidXJuaW5nIHByZWNpb3VzIENQVSBjeWNsZXMuICBQcm9ncmFtbWVkIEkvTworCSAqIHN1Y2tzIHdoZW4gd2UgaGF2ZSB0aGUgRFZNQSB0byBkbyBpdCBmb3IgdXMuICBUaGUgRVNQIGlzIHN0dXBpZCBhbmQgd2lsbAorCSAqIG9ubHkgc2VuZCBvdXQgNiwgMTAsIGFuZCAxMiBieXRlIFNDU0kgY29tbWFuZHMsIG90aGVycyB3ZSBuZWVkIHRvIHNlbmQKKwkgKiBvbmUgYnl0ZSBhdCBhIHRpbWUuICBlc3Bfc2xvd2NtZCBiZWluZyBzZXQgc2F5cyB0aGF0IHdlIGFyZSBkb2luZyBvbmUKKwkgKiBvZiB0aGUgY29tbWFuZCB0eXBlcyBFU1AgZG9lc24ndCB1bmRlcnN0YW5kLCBlc3Bfc2NtZHAga2VlcHMgdHJhY2sgb2YKKwkgKiB3aGljaCBieXRlIHdlIGFyZSBzZW5kaW5nLCBlc3Bfc2NtZGxlZnQgc2F5cyBob3cgbWFueSBieXRlcyB0byBnby4KKwkgKi8KKwl2b2xhdGlsZSB1OAkJKmVzcF9jb21tYW5kOyAgICAvKiBMb2NhdGlvbiBvZiBjb21tYW5kIChDUFUgdmlldykgICovCisJX191MzIJCQllc3BfY29tbWFuZF9kdm1hOy8qIExvY2F0aW9uIG9mIGNvbW1hbmQgKERWTUEgdmlldykgKi8KKwl1bnNpZ25lZCBjaGFyCQllc3BfY2xlbjsJIC8qIExlbmd0aCBvZiB0aGlzIGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBjaGFyCQllc3Bfc2xvd2NtZDsKKwl1bnNpZ25lZCBjaGFyCQkqZXNwX3NjbWRwOworCXVuc2lnbmVkIGNoYXIJCWVzcF9zY21kbGVmdDsKKworCS8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBhbiBJUlEuIFVwb24gZXZlcnkKKwkgKiBJUlEgZW50cnkgd2Ugc3luY2hyb25pemUgdGhlc2Ugd2l0aCB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLgorCSAqLworCXU4CQkJaXJlZzsJCS8qIENvcHkgb2YgRVNQIGludGVycnVwdCByZWdpc3RlciAqLworCXU4CQkJc3JlZzsJCS8qIENvcHkgb2YgRVNQIHN0YXR1cyByZWdpc3RlciAqLworCXU4CQkJc2VxcmVnOwkJLyogQ29weSBvZiBFU1Agc2VxdWVuY2Ugc3RlcCByZWdpc3RlciAqLworCXU4CQkJc3JlZzI7CQkvKiBDb3B5IG9mIEhNRSBzdGF0dXMyIHJlZ2lzdGVyICovCisKKwkvKiBUbyBzYXZlIHJlZ2lzdGVyIHdyaXRlcyB0byB0aGUgRVNQLCB3aGljaCBjYW4gYmUgZXhwZW5zaXZlLCB3ZQorCSAqIGtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIHZhbHVlIHRoYXQgdmFyaW91cyByZWdpc3RlcnMgaGFkIGZvcgorCSAqIHRoZSBsYXN0IHRhcmdldCB3ZSBjb25uZWN0ZWQgdG8uICBJZiB0aGV5IGFyZSB0aGUgc2FtZSBmb3IgdGhlCisJICogY3VycmVudCB0YXJnZXQsIHdlIHNraXAgdGhlIHJlZ2lzdGVyIHdyaXRlcyBhcyB0aGV5IGFyZSBub3QgbmVlZGVkLgorCSAqLworCXU4CQkJcHJldl9zb2ZmLCBwcmV2X3N0cDsKKwl1OAkJCXByZXZfY2ZnMywgX19jYWNoZV9wYWQ7CisKKwkvKiBXZSBhbHNvIGtlZXAgYSBjYWNoZSBvZiB0aGUgcHJldmlvdXMgRkFTL0hNRSBETUEgQ1NSIHJlZ2lzdGVyIHZhbHVlLiAgKi8KKwl1MzIJCQlwcmV2X2htZV9kbWFjc3I7CisKKwkvKiBUaGUgSE1FIGlzIHRoZSBiaWdnZXN0IHBpZWNlIG9mIHNoaXQgSSBoYXZlIGV2ZXIgc2Vlbi4gKi8KKwl1OAkJCWhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyWzE2ICogMl07CisJdTgJCQlobWVfZmlmb193b3JrYXJvdW5kX2NvdW50OworCisJLyogRm9yIGVhY2ggdGFyZ2V0IHdlIGtlZXAgdHJhY2sgb2Ygc2F2ZS9yZXN0b3JlIGRhdGEKKwkgKiBwb2ludGVyIGluZm9ybWF0aW9uLiAgVGhpcyBuZWVkcyB0byBiZSB1cGRhdGVkIG1ham9ybHkKKwkgKiB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciB0YWdnZWQgcXVldWVpbmcuICAtRGF2ZU0KKwkgKi8KKwlzdHJ1Y3QgZXNwX3BvaW50ZXJzIHsKKwkJY2hhcgkJCSpzYXZlZF9wdHI7CisJCXN0cnVjdCBzY2F0dGVybGlzdAkqc2F2ZWRfYnVmZmVyOworCQlpbnQJCQlzYXZlZF90aGlzX3Jlc2lkdWFsOworCQlpbnQJCQlzYXZlZF9idWZmZXJzX3Jlc2lkdWFsOworCX0gZGF0YV9wb2ludGVyc1sxNl0gLypYWFggW01BWF9UQUdTX1BFUl9UQVJHRVRdKi87CisKKwkvKiBDbG9jayBwZXJpb2RzLCBmcmVxdWVuY2llcywgc3luY2hyb25pemF0aW9uLCBldGMuICovCisJdW5zaWduZWQgaW50CQljZnJlcTsJCS8qIENsb2NrIGZyZXF1ZW5jeSBpbiBIWiAqLworCXVuc2lnbmVkIGludAkJY2ZhY3Q7CQkvKiBDbG9jayBjb252ZXJzaW9uIGZhY3RvciAqLworCXVuc2lnbmVkIGludAkJcmF3X2NmYWN0OwkvKiBSYXcgY29weSBmcm9tIHByb2JpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCWNjeWNsZTsJCS8qIE9uZSBFU1AgY2xvY2sgY3ljbGUgKi8KKwl1bnNpZ25lZCBpbnQJCWN0aWNrOwkJLyogT25lIEVTUCBjbG9jayB0aW1lICovCisJdW5zaWduZWQgaW50CQlyYWRlbGF5OwkvKiBGQVNUIGNoaXAgcmVxL2FjayBkZWxheSAqLworCXVuc2lnbmVkIGludAkJbmVnX2RlZnA7CS8qIERlZmF1bHQgbmVnb3RpYXRpb24gcGVyaW9kICovCisJdW5zaWduZWQgaW50CQlzeW5jX2RlZnA7CS8qIERlZmF1bHQgc3luYyB0cmFuc2ZlciBwZXJpb2QgKi8KKwl1bnNpZ25lZCBpbnQJCW1heF9wZXJpb2Q7CS8qIGxvbmdlc3Qgb3VyIHBlcmlvZCBjYW4gYmUgKi8KKwl1bnNpZ25lZCBpbnQJCW1pbl9wZXJpb2Q7CS8qIHNob3J0ZXN0IHBlcmlvZCB3ZSBjYW4gd2l0aHN0YW5kICovCisKKwlzdHJ1Y3QgZXNwCQkqbmV4dDsJCS8qIE5leHQgRVNQIHdlIHByb2JlZCBvciBOVUxMICovCisJY2hhcgkJCXByb21fbmFtZVs2NF07CS8qIE5hbWUgb2YgRVNQIGRldmljZSBmcm9tIHByb20gKi8KKwlpbnQJCQlwcm9tX25vZGU7CS8qIFByb20gbm9kZSB3aGVyZSBFU1AgZm91bmQgKi8KKwlpbnQJCQllc3BfaWQ7CQkvKiBVbmlxdWUgcGVyLUVTUCBJRCBudW1iZXIgKi8KKworCS8qIEZvciBzbG93IHRvIG1lZGl1bSBzcGVlZCBpbnB1dCBjbG9jayByYXRlcyB3ZSBzaG9vdCBmb3IgNW1iL3MsCisJICogYnV0IGZvciBoaWdoIGlucHV0IGNsb2NrIHJhdGVzIHdlIHRyeSB0byBkbyAxMG1iL3MgYWx0aG91Z2ggSQorCSAqIGRvbid0IHRoaW5rIGEgdHJhbnNmZXIgY2FuIGV2ZW4gcnVuIHRoYXQgZmFzdCB3aXRoIGFuIEVTUCBldmVuCisJICogd2l0aCBETUEyIHNjYXR0ZXIgZ2F0aGVyIHBpcGVsaW5pbmcuCisJICovCisjZGVmaW5lIFNZTkNfREVGUF9TTE9XICAgICAgICAgICAgMHgzMiAgIC8qIDVtYi9zICAqLworI2RlZmluZSBTWU5DX0RFRlBfRkFTVCAgICAgICAgICAgIDB4MTkgICAvKiAxMG1iL3MgKi8KKworCXVuc2lnbmVkIGludAkJc25pcDsJCS8qIFN5bmMuIG5lZ290aWF0aW9uIGluIHByb2dyZXNzICovCisJdW5zaWduZWQgaW50CQl3bmlwOwkJLyogV0lERSBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCXVuc2lnbmVkIGludAkJdGFyZ2V0c19wcmVzZW50Oy8qIHRhcmdldHMgc3Bva2VuIHRvIGJlZm9yZSAqLworCisJaW50CQljdXJyZW50X3RyYW5zZmVyX3NpemU7CS8qIFNldCBhdCBiZWdpbm5pbmcgb2YgZGF0YSBkbWEgKi8KKworCXU4CQkJZXNwY21kbG9nWzMyXTsJLyogTG9nIG9mIGN1cnJlbnQgZXNwIGNtZHMgc2VudC4gKi8KKwl1OAkJCWVzcGNtZGVudDsJLyogQ3VycmVudCBlbnRyeSBpbiBlc3AgY21kIGxvZy4gKi8KKworCS8qIE1pc2MuIGluZm8gYWJvdXQgdGhpcyBFU1AgKi8KKwllbnVtIGVzcF9yZXYJCWVyZXY7CQkvKiBFU1AgcmV2aXNpb24gKi8KKwlpbnQJCQlpcnE7CQkvKiBTQnVzIElSUSBmb3IgdGhpcyBFU1AgKi8KKwlpbnQJCQlzY3NpX2lkOwkvKiBXaG8gYW0gSSBhcyBpbml0aWF0b3I/ICovCisJaW50CQkJc2NzaV9pZF9tYXNrOwkvKiBCaXRtYXNrIG9mICdtZScuICovCisJaW50CQkJZGlmZjsJCS8qIERpZmZlcmVudGlhbCBTQ1NJIGJ1cz8gKi8KKwlpbnQJCQlidXJzdHM7CQkvKiBCdXJzdCBzaXplcyBvdXIgRFZNQSBzdXBwb3J0cyAqLworCisJLyogT3VyIGNvbW1hbmQgcXVldWVzLCBvbmx5IG9uZSBjbWQgbGl2ZXMgaW4gdGhlIGN1cnJlbnRfU0MgcXVldWUuICovCisJc3RydWN0IHNjc2lfY21uZAkqaXNzdWVfU0M7CS8qIENvbW1hbmRzIHRvIGJlIGlzc3VlZCAqLworCXN0cnVjdCBzY3NpX2NtbmQJKmN1cnJlbnRfU0M7CS8qIFdobyBpcyBjdXJyZW50bHkgd29ya2luZyB0aGUgYnVzICovCisJc3RydWN0IHNjc2lfY21uZAkqZGlzY29ubmVjdGVkX1NDOy8qIENvbW1hbmRzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMgKi8KKworCS8qIE1lc3NhZ2UgZ29vICovCisJdTgJCQljdXJfbXNnb3V0WzE2XTsKKwl1OAkJCWN1cl9tc2dpblsxNl07CisJdTgJCQlwcmV2bXNnb3V0LCBwcmV2bXNnaW47CisJdTgJCQltc2dvdXRfbGVuLCBtc2dpbl9sZW47CisJdTgJCQltc2dvdXRfY3RyLCBtc2dpbl9jdHI7CisKKwkvKiBTdGF0ZXMgdGhhdCB3ZSBjYW5ub3Qga2VlcCBpbiB0aGUgcGVyIGNtZCBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGV5CisJICogY2Fubm90IGJlIGFzc29zY2lhdGVkIHdpdGggYW55IHNwZWNpZmljIGNvbW1hbmQuCisJICovCisJdTgJCQlyZXNldHRpbmdfYnVzOworCXdhaXRfcXVldWVfaGVhZF90CXJlc2V0X3F1ZXVlOworfTsKKworLyogQml0ZmllbGQgbWVhbmluZ3MgZm9yIHRoZSBhYm92ZSByZWdpc3RlcnMuICovCisKKy8qIEVTUCBjb25maWcgcmVnIDEsIHJlYWQtd3JpdGUsIGZvdW5kIG9uIGFsbCBFU1AgY2hpcHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzFfSUQgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogTXkgQlVTIElEIGJpdHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzFfQ0hURVNUICAgIDB4MDggICAgICAgICAgICAgLyogRW5hYmxlIEVTUCBjaGlwIHRlc3RzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1BFTkFCTEUgICAweDEwICAgICAgICAgICAgIC8qIEVuYWJsZSBwYXJpdHkgY2hlY2tzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1BBUlRFU1QgICAweDIwICAgICAgICAgICAgIC8qIFBhcml0eSB0ZXN0IG1vZGUgZW5hYmxlZD8gKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzFfU1JSRElTQUIgIDB4NDAgICAgICAgICAgICAgLyogRGlzYWJsZSBTQ1NJIHJlc2V0IHJlcG9ydHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzFfU0xDQUJMRSAgIDB4ODAgICAgICAgICAgICAgLyogRW5hYmxlIHNsb3cgY2FibGUgbW9kZSAqLworCisvKiBFU1AgY29uZmlnIHJlZyAyLCByZWFkLXdyaXRlLCBmb3VuZCBvbmx5IG9uIGVzcDEwMGErZXNwMjAwK2VzcDIzNiBjaGlwcyAqLworI2RlZmluZSBFU1BfQ09ORklHMl9ETUFQQVJJVFkgMHgwMSAgICAgICAgICAgICAvKiBlbmFibGUgRE1BIFBhcml0eSAoMjAwLDIzNikgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfUkVHUEFSSVRZIDB4MDIgICAgICAgICAgICAgLyogZW5hYmxlIHJlZyBQYXJpdHkgKDIwMCwyMzYpICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0JBRFBBUklUWSAweDA0ICAgICAgICAgICAgIC8qIEJhZCBwYXJpdHkgdGFyZ2V0IGFib3J0ICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9TQ1NJMkVOQUIgMHgwOCAgICAgICAgICAgICAvKiBFbmFibGUgU0NTSS0yIGZlYXR1cmVzICh0bW9kZSBvbmx5KSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9ISSAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBIaWdoIEltcGVkYW5jZSBEUkVRID8/PyAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfSE1FRkVOQUIgIDB4MTAgICAgICAgICAgICAgLyogSE1FIGZlYXR1cmVzIGVuYWJsZSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9CQ00gICAgICAgMHgyMCAgICAgICAgICAgICAvKiBFbmFibGUgYnl0ZS1jdHJsICgyMzYpICAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfRElTUElOVCAgIDB4MjAgICAgICAgICAgICAgLyogRGlzYWJsZSBwYXVzZSBpcnEgKGhtZSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfRkVOQUIgICAgIDB4NDAgICAgICAgICAgICAgLyogRW5hYmxlIGZlYXR1cmVzIChmYXMxMDAsZXNwMjE2KSAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUcyX1NQTCAgICAgICAweDQwICAgICAgICAgICAgIC8qIEVuYWJsZSBzdGF0dXMtcGhhc2UgbGF0Y2ggKGVzcDIzNikgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9NS0RPTkUgICAgMHg0MCAgICAgICAgICAgICAvKiBITUUgbWFnaWMgZmVhdHVyZSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9ITUUzMiAgICAgMHg4MCAgICAgICAgICAgICAvKiBITUUgMzIgZXh0ZW5kZWQgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfTUFHSUMgICAgIDB4ZTAgICAgICAgICAgICAgLyogSW52YWxpZCBiaXRzLi4uICovCisKKy8qIEVTUCBjb25maWcgcmVnaXN0ZXIgMyByZWFkLXdyaXRlLCBmb3VuZCBvbmx5IGVzcDIzNitmYXMyMzYrZmFzMTAwYStobWUgY2hpcHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfRkNMT0NLICAgIDB4MDEgICAgICAgICAgICAgLyogRkFTVCBTQ1NJIGNsb2NrIHJhdGUgKGVzcDEwMGEvaG1lKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19URU0gICAgICAgMHgwMSAgICAgICAgICAgICAvKiBFbmFibGUgdGhyZXNoLTggbW9kZSAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZBU1QgICAgICAweDAyICAgICAgICAgICAgIC8qIEVuYWJsZSBGQVNUIFNDU0kgICAgIChlc3AxMDBhL2htZSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfQURNQSAgICAgIDB4MDIgICAgICAgICAgICAgLyogRW5hYmxlIGFsdGVybmF0ZS1kbWEgKGVzcC9mYXMyMzYpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19URU5CICAgICAgMHgwNCAgICAgICAgICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX1NSQiAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFNhdmUgcmVzaWR1YWwgYnl0ZSAgIChlc3AvZmFzMjM2KSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfVE1TICAgICAgIDB4MDggICAgICAgICAgICAgLyogVGhyZWUtYnl0ZSBtc2cncyBvayAgKGVzcDEwMGEvaG1lKSAqLworI2RlZmluZSBFU1BfQ09ORklHM19GQ0xLICAgICAgMHgwOCAgICAgICAgICAgICAvKiBGYXN0IFNDU0kgY2xvY2sgcmF0ZSAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lETVNHICAgICAweDEwICAgICAgICAgICAgIC8qIElEIG1lc3NhZ2UgY2hlY2tpbmcgIChlc3AxMDBhL2htZSkgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfRlNDU0kgICAgIDB4MTAgICAgICAgICAgICAgLyogRW5hYmxlIEZBU1QgU0NTSSAgICAgKGVzcC9mYXMyMzYpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19HVE0gICAgICAgMHgyMCAgICAgICAgICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lEQklUMyAgICAweDIwICAgICAgICAgICAgIC8qIEJpdCAzIG9mIEhNRSBTQ1NJLUlEIChobWUpICAgICAgICAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfVEJNUyAgICAgIDB4NDAgICAgICAgICAgICAgLyogVGhyZWUtYnl0ZSBtc2cncyBvayAgKGVzcC9mYXMyMzYpICAqLworI2RlZmluZSBFU1BfQ09ORklHM19FV0lERSAgICAgMHg0MCAgICAgICAgICAgICAvKiBFbmFibGUgV2lkZS1TQ1NJICAgICAoaG1lKSAgICAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lNUyAgICAgICAweDgwICAgICAgICAgICAgIC8qIElEIG1zZyBjaGsnbmcgICAgICAgIChlc3AvZmFzMjM2KSAgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzNfT0JQVVNIICAgIDB4ODAgICAgICAgICAgICAgLyogUHVzaCBvZGQtYnl0ZSB0byBkbWEgKGhtZSkgICAgICAgICAqLworCisvKiBFU1AgY29tbWFuZCByZWdpc3RlciByZWFkLXdyaXRlICovCisvKiBHcm91cCAxIGNvbW1hbmRzOiAgVGhlc2UgbWF5IGJlIHNlbnQgYXQgYW55IHBvaW50IGluIHRpbWUgdG8gdGhlIEVTUAorICogICAgICAgICAgICAgICAgICAgIGNoaXAuICBOb25lIG9mIHRoZW0gY2FuIGdlbmVyYXRlIGludGVycnVwdHMgJ2NlcHQKKyAqICAgICAgICAgICAgICAgICAgICB0aGUgIlNDU0kgYnVzIHJlc2V0IiBjb21tYW5kIGlmIHlvdSBoYXZlIG5vdCBkaXNhYmxlZAorICogICAgICAgICAgICAgICAgICAgIFNDU0kgcmVzZXQgaW50ZXJydXB0cyBpbiB0aGUgY29uZmlnMSBFU1AgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRVNQX0NNRF9OVUxMICAgICAgICAgIDB4MDAgICAgICAgICAgICAgLyogTnVsbCBjb21tYW5kLCBpZS4gYSBub3AgKi8KKyNkZWZpbmUgRVNQX0NNRF9GTFVTSCAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogRklGTyBGbHVzaCAqLworI2RlZmluZSBFU1BfQ01EX1JDICAgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBDaGlwIHJlc2V0ICovCisjZGVmaW5lIEVTUF9DTURfUlMgICAgICAgICAgICAweDAzICAgICAgICAgICAgIC8qIFNDU0kgYnVzIHJlc2V0ICovCisKKy8qIEdyb3VwIDIgY29tbWFuZHM6ICBFU1AgbXVzdCBiZSBhbiBpbml0aWF0b3IgYW5kIGNvbm5lY3RlZCB0byBhIHRhcmdldAorICogICAgICAgICAgICAgICAgICAgIGZvciB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgorICovCisjZGVmaW5lIEVTUF9DTURfVEkgICAgICAgICAgICAweDEwICAgICAgICAgICAgIC8qIFRyYW5zZmVyIEluZm9ybWF0aW9uICovCisjZGVmaW5lIEVTUF9DTURfSUNDU0VRICAgICAgICAweDExICAgICAgICAgICAgIC8qIEluaXRpYXRvciBjbWQgY29tcGxldGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9NT0sgICAgICAgICAgIDB4MTIgICAgICAgICAgICAgLyogTWVzc2FnZSBva2llLWRva2llICovCisjZGVmaW5lIEVTUF9DTURfVFBBRCAgICAgICAgICAweDE4ICAgICAgICAgICAgIC8qIFRyYW5zZmVyIFBhZCAqLworI2RlZmluZSBFU1BfQ01EX1NBVE4gICAgICAgICAgMHgxYSAgICAgICAgICAgICAvKiBTZXQgQVROICovCisjZGVmaW5lIEVTUF9DTURfUkFUTiAgICAgICAgICAweDFiICAgICAgICAgICAgIC8qIERlLWFzc2VydCBBVE4gKi8KKworLyogR3JvdXAgMyBjb21tYW5kczogIEVTUCBtdXN0IGJlIGluIHRoZSBNU0dPVVQgb3IgTVNHSU4gc3RhdGUgYW5kIGJlIGNvbm5lY3RlZAorICogICAgICAgICAgICAgICAgICAgIHRvIGEgdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IgZm9yIHRoZXNlIGNvbW1hbmRzIHRvIHdvcmsuCisgKi8KKyNkZWZpbmUgRVNQX0NNRF9TTVNHICAgICAgICAgIDB4MjAgICAgICAgICAgICAgLyogU2VuZCBtZXNzYWdlICovCisjZGVmaW5lIEVTUF9DTURfU1NUQVQgICAgICAgICAweDIxICAgICAgICAgICAgIC8qIFNlbmQgc3RhdHVzICovCisjZGVmaW5lIEVTUF9DTURfU0RBVEEgICAgICAgICAweDIyICAgICAgICAgICAgIC8qIFNlbmQgZGF0YSAqLworI2RlZmluZSBFU1BfQ01EX0RTRVEgICAgICAgICAgMHgyMyAgICAgICAgICAgICAvKiBEaXNjb250aW51ZSBTZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX1RTRVEgICAgICAgICAgMHgyNCAgICAgICAgICAgICAvKiBUZXJtaW5hdGUgU2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9UQ0NTRVEgICAgICAgIDB4MjUgICAgICAgICAgICAgLyogVGFyZ2V0IGNtZCBjbXBsdCBzZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX0RDTkNUICAgICAgICAgMHgyNyAgICAgICAgICAgICAvKiBEaXNjb25uZWN0ICovCisjZGVmaW5lIEVTUF9DTURfUk1TRyAgICAgICAgICAweDI4ICAgICAgICAgICAgIC8qIFJlY2VpdmUgTWVzc2FnZSAqLworI2RlZmluZSBFU1BfQ01EX1JDTUQgICAgICAgICAgMHgyOSAgICAgICAgICAgICAvKiBSZWNlaXZlIENvbW1hbmQgKi8KKyNkZWZpbmUgRVNQX0NNRF9SREFUQSAgICAgICAgIDB4MmEgICAgICAgICAgICAgLyogUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIEVTUF9DTURfUkNTRVEgICAgICAgICAweDJiICAgICAgICAgICAgIC8qIFJlY2VpdmUgY21kIHNlcXVlbmNlICovCisKKy8qIEdyb3VwIDQgY29tbWFuZHM6ICBUaGUgRVNQIG11c3QgYmUgaW4gdGhlIGRpc2Nvbm5lY3RlZCBzdGF0ZSBhbmQgbXVzdAorICogICAgICAgICAgICAgICAgICAgIG5vdCBiZSBjb25uZWN0ZWQgdG8gYW55IHRhcmdldHMgYXMgaW5pdGlhdG9yIGZvcgorICogICAgICAgICAgICAgICAgICAgIHRoZXNlIGNvbW1hbmRzIHRvIHdvcmsuCisgKi8KKyNkZWZpbmUgRVNQX0NNRF9SU0VMICAgICAgICAgIDB4NDAgICAgICAgICAgICAgLyogUmVzZWxlY3QgKi8KKyNkZWZpbmUgRVNQX0NNRF9TRUwgICAgICAgICAgIDB4NDEgICAgICAgICAgICAgLyogU2VsZWN0IHcvbyBBVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9TRUxBICAgICAgICAgIDB4NDIgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICovCisjZGVmaW5lIEVTUF9DTURfU0VMQVMgICAgICAgICAweDQzICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTiAmIFNUT1AgKi8KKyNkZWZpbmUgRVNQX0NNRF9FU0VMICAgICAgICAgIDB4NDQgICAgICAgICAgICAgLyogRW5hYmxlIHNlbGVjdGlvbiAqLworI2RlZmluZSBFU1BfQ01EX0RTRUwgICAgICAgICAgMHg0NSAgICAgICAgICAgICAvKiBEaXNhYmxlIHNlbGVjdGlvbnMgKi8KKyNkZWZpbmUgRVNQX0NNRF9TQTMgICAgICAgICAgIDB4NDYgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROMyAqLworI2RlZmluZSBFU1BfQ01EX1JTRUwzICAgICAgICAgMHg0NyAgICAgICAgICAgICAvKiBSZXNlbGVjdDMgKi8KKworLyogVGhpcyBiaXQgZW5hYmxlcyB0aGUgRVNQJ3MgRE1BIG9uIHRoZSBTQnVzICovCisjZGVmaW5lIEVTUF9DTURfRE1BICAgICAgICAgICAweDgwICAgICAgICAgICAgIC8qIERvIERNQT8gKi8KKworCisvKiBFU1Agc3RhdHVzIHJlZ2lzdGVyIHJlYWQtb25seSAqLworI2RlZmluZSBFU1BfU1RBVF9QSU8gICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBJTyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUENEICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogQ0QgcGhhc2UgYml0ICovCisjZGVmaW5lIEVTUF9TVEFUX1BNU0cgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIE1TRyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUE1BU0sgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogTWFzayBvZiBwaGFzZSBiaXRzICovCisjZGVmaW5lIEVTUF9TVEFUX1RET05FICAgICAgICAweDA4ICAgICAgICAgICAgIC8qIFRyYW5zZmVyIENvbXBsZXRlZCAqLworI2RlZmluZSBFU1BfU1RBVF9UQ05UICAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBDb3VudGVyIElzIFplcm8gKi8KKyNkZWZpbmUgRVNQX1NUQVRfUEVSUiAgICAgICAgIDB4MjAgICAgICAgICAgICAgLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIEVTUF9TVEFUX1NQQU0gICAgICAgICAweDQwICAgICAgICAgICAgIC8qIFJlYWwgYmFkIGVycm9yICovCisvKiBUaGlzIGluZGljYXRlcyB0aGUgJ2ludGVycnVwdCBwZW5kaW5nJyBjb25kaXRpb24gb24gZXNwMjM2LCBpdCBpcyBhIHJlc2VydmVkCisgKiBiaXQgb24gb3RoZXIgcmV2cyBvZiB0aGUgRVNQLgorICovCisjZGVmaW5lIEVTUF9TVEFUX0lOVFIgICAgICAgICAweDgwICAgICAgICAgICAgIC8qIEludGVycnVwdCAqLworCisvKiBITUUgb25seTogc3RhdHVzIDIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX1NDSEJJVCAgICAgIDB4MDEgLyogVXBwZXIgYml0cyAzLTcgb2Ygc3N0ZXAgZW5hYmxlZCAqLworI2RlZmluZSBFU1BfU1RBVDJfRkZMQUdTICAgICAgMHgwMiAvKiBUaGUgZmlmbyBmbGFncyBhcmUgbm93IGxhdGNoZWQgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX1hDTlQgICAgICAgIDB4MDQgLyogVGhlIHRyYW5zZmVyIGNvdW50ZXIgaXMgbGF0Y2hlZCAqLworI2RlZmluZSBFU1BfU1RBVDJfQ1JFR0EgICAgICAgMHgwOCAvKiBUaGUgY29tbWFuZCByZWcgaXMgYWN0aXZlIG5vdyAqLworI2RlZmluZSBFU1BfU1RBVDJfV0lERSAgICAgICAgMHgxMCAvKiBJbnRlcmZhY2Ugb24gdGhpcyBhZGFwdGVyIGlzIHdpZGUgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0YxQllURSAgICAgIDB4MjAgLyogVGhlcmUgaXMgb25lIGJ5dGUgYXQgdG9wIG9mIGZpZm8gKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0ZNU0IgICAgICAgIDB4NDAgLyogTmV4dCBieXRlIGluIGZpZm8gaXMgbW9zdCBzaWduaWZpY2FudCAqLworI2RlZmluZSBFU1BfU1RBVDJfRkVNUFRZICAgICAgMHg4MCAvKiBGSUZPIGlzIGVtcHR5ICovCisKKy8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgY2FuIGJlIG1hc2tlZCB3aXRoIEVTUF9TVEFUX1BNQVNLIGFuZCBjb21wYXJlZAorICogd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGhhc2UgdGhlIEVTUAorICogKGF0IGxlYXN0IHRoaW5rcyBpdCkgaXMgaW4uICBGb3Igb3VyIHB1cnBvc2VzIHdlIGFsc28gYWRkIG91ciBvd24KKyAqIHNvZnR3YXJlICdkb25lJyBiaXQgZm9yIG91ciBwaGFzZSBtYW5hZ2VtZW50IGVuZ2luZS4KKyAqLworI2RlZmluZSBFU1BfRE9QICAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBPdXQgICovCisjZGVmaW5lIEVTUF9ESVAgICAoRVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIEluICAgKi8KKyNkZWZpbmUgRVNQX0NNRFAgIChFU1BfU1RBVF9QQ0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgICAqLworI2RlZmluZSBFU1BfU1RBVFAgKEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pICAgICAgICAgICAgICAgLyogU3RhdHVzICAgICovCisjZGVmaW5lIEVTUF9NT1AgICAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpICAgICAgICAgICAgICAvKiBNZXNzYWdlIE91dCAqLworI2RlZmluZSBFU1BfTUlQICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEfEVTUF9TVEFUX1BJTykgLyogTWVzc2FnZSBJbiAqLworCisvKiBFU1AgaW50ZXJydXB0IHJlZ2lzdGVyIHJlYWQtb25seSAqLworI2RlZmluZSBFU1BfSU5UUl9TICAgICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9vIEFUTiAqLworI2RlZmluZSBFU1BfSU5UUl9TQVROICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gKi8KKyNkZWZpbmUgRVNQX0lOVFJfUlNFTCAgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogUmVzZWxlY3RlZCAqLworI2RlZmluZSBFU1BfSU5UUl9GRE9ORSAgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBGdW5jdGlvbiBkb25lICovCisjZGVmaW5lIEVTUF9JTlRSX0JTRVJWICAgICAgICAweDEwICAgICAgICAgICAgIC8qIEJ1cyBzZXJ2aWNlICovCisjZGVmaW5lIEVTUF9JTlRSX0RDICAgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgKi8KKyNkZWZpbmUgRVNQX0lOVFJfSUMgICAgICAgICAgIDB4NDAgICAgICAgICAgICAgLyogSWxsZWdhbCBjb21tYW5kIGdpdmVuICovCisjZGVmaW5lIEVTUF9JTlRSX1NSICAgICAgICAgICAweDgwICAgICAgICAgICAgIC8qIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkICovCisKKy8qIEludGVycnVwdCBzdGF0dXMgbWFjcm9zICovCisjZGVmaW5lIEVTUF9TUkVTRVRfSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1NSKSkKKyNkZWZpbmUgRVNQX0lMTENNRF9JUlEoZXNwKSAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfSUMpKQorI2RlZmluZSBFU1BfU0VMRUNUX1dJVEhfQVROX0lSUShlc3ApICAgICAoKGVzcCktPmludHJlZyAmIChFU1BfSU5UUl9TQVROKSkKKyNkZWZpbmUgRVNQX1NFTEVDVF9XSVRIT1VUX0FUTl9JUlEoZXNwKSAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfUykpCisjZGVmaW5lIEVTUF9TRUxFQ1RJT05fSVJRKGVzcCkgICgoRVNQX1NFTEVDVF9XSVRIX0FUTl9JUlEoZXNwKSkgfHwgICAgICAgICBcCisJCQkJIChFU1BfU0VMRUNUX1dJVEhPVVRfQVROX0lSUShlc3ApKSkKKyNkZWZpbmUgRVNQX1JFU0VMRUNUSU9OX0lSUShlc3ApICAgICAgICAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfUlNFTCkpCisKKy8qIEVTUCBzZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyIHJlYWQtb25seSAqLworI2RlZmluZSBFU1BfU1RFUF9WQklUUyAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiBWYWxpZCBiaXRzICovCisjZGVmaW5lIEVTUF9TVEVQX0FTRUwgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIFNlbGVjdGlvbiZBcmJpdHJhdGUgY21wbHQgKi8KKyNkZWZpbmUgRVNQX1NURVBfU0lEICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogT25lIG1zZyBieXRlIHNlbnQgKi8KKyNkZWZpbmUgRVNQX1NURVBfTkNNRCAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogV2FzIG5vdCBpbiBjb21tYW5kIHBoYXNlICovCisjZGVmaW5lIEVTUF9TVEVQX1BQQyAgICAgICAgICAweDAzICAgICAgICAgICAgIC8qIEVhcmx5IHBoYXNlIGNoZyBjYXVzZWQgY21uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBieXRlcyB0byBiZSBsb3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFU1BfU1RFUF9GSU5JNCAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBDb21tYW5kIHdhcyBzZW50IG9rICovCisKKy8qIEhvIGh1bSwgc29tZSBFU1AncyBzZXQgdGhlIHN0ZXAgcmVnaXN0ZXIgdG8gdGhpcyBhcyB3ZWxsLi4uICovCisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk1ICAgICAgICAweDA1CisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk2ICAgICAgICAweDA2CisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk3ICAgICAgICAweDA3CisKKy8qIEVTUCBjaGlwLXRlc3QgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLworI2RlZmluZSBFU1BfVEVTVF9UQVJHICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBUYXJnZXQgdGVzdCBtb2RlICovCisjZGVmaW5lIEVTUF9URVNUX0lOSSAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIEluaXRpYXRvciB0ZXN0IG1vZGUgKi8KKyNkZWZpbmUgRVNQX1RFU1RfVFMgICAgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogVHJpc3RhdGUgdGVzdCBtb2RlICovCisKKy8qIEVTUCB1bmlxdWUgSUQgcmVnaXN0ZXIgcmVhZC1vbmx5LCBmb3VuZCBvbiBmYXMyMzYrZmFzMTAwYSBvbmx5ICovCisjZGVmaW5lIEVTUF9VSURfRjEwMEEgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIEVTUCBGQVMxMDBBICAqLworI2RlZmluZSBFU1BfVUlEX0YyMzYgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBFU1AgRkFTMjM2ICAgKi8KKyNkZWZpbmUgRVNQX1VJRF9SRVYgICAgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogRVNQIHJldmlzaW9uICovCisjZGVmaW5lIEVTUF9VSURfRkFNICAgICAgICAgICAweGY4ICAgICAgICAgICAgIC8qIEVTUCBmYW1pbHkgICAqLworCisvKiBFU1AgZmlmbyBmbGFncyByZWdpc3RlciByZWFkLW9ubHkgKi8KKy8qIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGltcGxpZXMgYSAxNiBieXRlIEZJRk8gb24gdGhlIEVTUC4gKi8KKyNkZWZpbmUgRVNQX0ZGX0ZCWVRFUyAgICAgICAgIDB4MWYgICAgICAgICAgICAgLyogTnVtIGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgRVNQX0ZGX09OT1RaRVJPICAgICAgIDB4MjAgICAgICAgICAgICAgLyogb2Zmc2V0IGN0ciBub3QgemVybyAoZXNwMTAwKSAqLworI2RlZmluZSBFU1BfRkZfU1NURVAgICAgICAgICAgMHhlMCAgICAgICAgICAgICAvKiBTZXF1ZW5jZSBzdGVwICovCisKKy8qIEVTUCBjbG9jayBjb252ZXJzaW9uIGZhY3RvciByZWdpc3RlciB3cml0ZS1vbmx5ICovCisjZGVmaW5lIEVTUF9DQ0ZfRjAgICAgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIDM1LjAxTUh6IC0gNDBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9ORVZFUiAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogU2V0IGl0IHRvIHRoaXMgYW5kIGRpZSAqLworI2RlZmluZSBFU1BfQ0NGX0YyICAgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiAxME1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0YzICAgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiAxMC4wMU1IeiAtIDE1TUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfRjQgICAgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIDE1LjAxTUh6IC0gMjBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNSAgICAgICAgICAgIDB4MDUgICAgICAgICAgICAgLyogMjAuMDFNSHogLSAyNU1IeiAqLworI2RlZmluZSBFU1BfQ0NGX0Y2ICAgICAgICAgICAgMHgwNiAgICAgICAgICAgICAvKiAyNS4wMU1IeiAtIDMwTUh6ICovCisjZGVmaW5lIEVTUF9DQ0ZfRjcgICAgICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIDMwLjAxTUh6IC0gMzVNSHogKi8KKworLyogSE1FIG9ubHkuLi4gKi8KKyNkZWZpbmUgRVNQX0JVU0lEX1JFU0VMSUQgICAgIDB4MTAKKyNkZWZpbmUgRVNQX0JVU0lEX0NUUjMyQklUICAgIDB4NDAKKworI2RlZmluZSBFU1BfQlVTX1RJTUVPVVQgICAgICAgIDI3NSAgICAgICAgICAgICAvKiBJbiBtaWxsaS1zZWNvbmRzICovCisjZGVmaW5lIEVTUF9USU1FT19DT05TVCAgICAgICA4MTkyCisjZGVmaW5lIEVTUF9ORUdfREVGUChtaHosIGNmYWN0KSBcCisgICAgICAgICgoRVNQX0JVU19USU1FT1VUICogKChtaHopIC8gMTAwMCkpIC8gKDgxOTIgKiAoY2ZhY3QpKSkKKyNkZWZpbmUgRVNQX01IWl9UT19DWUNMRShtaGVydHopICAoKDEwMDAwMDAwMDApIC8gKChtaGVydHopIC8gMTAwMCkpCisjZGVmaW5lIEVTUF9USUNLKGNjZiwgY3ljbGUpICAoKDc2ODIgKiAoY2NmKSAqIChjeWNsZSkgLyAxMDAwKSkKKworLyogRm9yIG91ciBpbnRlcnJ1cHQgZW5naW5lLiAqLworI2RlZmluZSBmb3JfZWFjaF9lc3AoZXNwKSBcCisgICAgICAgIGZvcigoZXNwKSA9IGVzcGNoYWluOyAoZXNwKTsgKGVzcCkgPSAoZXNwKS0+bmV4dCkKKworI2VuZGlmIC8qICEoX1NQQVJDX0VTUF9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMgYi9kcml2ZXJzL3Njc2kvZmFzdGxhbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQ3NjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKQEAgLTAsMCArMSw0MjEgQEAKKy8qIGZhc3RsYW5lLmM6IERyaXZlciBmb3IgUGhhc2U1J3MgRmFzdGxhbmUgU0NTSSBDb250cm9sbGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBDeWJlclN0b3JtIGRyaXZlciwgaGVuY2UgdGhlIG9jY2FzaW9uYWwKKyAqIHJlZmVyZW5jZSB0byBDeWJlclN0b3JtLgorICoKKyAqIEJldGF0ZXN0aW5nICYgY3J1Y2lhbCBhZGp1c3RtZW50cyBieQorICogICAgICAgIFBhdHJpayBSYWsgKHByYWszMjY0QHNzMTAwMC5tcy5tZmYuY3VuaS5jeikKKyAqCisgKi8KKworLyogVE9ETzoKKyAqCisgKiBvIEFjY29yZGluZyB0byB0aGUgZG9jIGZyb20gbGFpcmUsIGl0IGlzIHJlcXVpcmVkIHRvIHJlc2V0IHRoZSBETUEgd2hlbgorICogICB0aGUgdHJhbnNmZXIgaXMgZG9uZS4gQVRNIHdlIHJlc2V0IERNQSBqdXN0IGJlZm9yZSBldmVyeSBuZXcgCisgKiAgIGRtYV9pbml0XyhyZWFkfHdyaXRlKS4KKyAqCisgKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKKyAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KKyAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKKyAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKiBTdWNoIGRheSBoYXMganVzdCBjb21lLi4uICovCisjaWYgMAorLyogTGV0IHRoaXMgZGVmaW5lZCB1bmxlc3MgeW91IHJlYWxseSBuZWVkIHRvIGVuYWJsZSBETUEgSVJRIG9uZSBkYXkgKi8KKyNkZWZpbmUgTk9ETUFJUlEKKyNlbmRpZgorCisvKiBUaGUgY29udHJvbGxlciByZWdpc3RlcnMgY2FuIGJlIGZvdW5kIGluIHRoZSBaMiBjb25maWcgYXJlYSBhdCB0aGVzZQorICogb2Zmc2V0czoKKyAqLworI2RlZmluZSBGQVNUTEFORV9FU1BfQUREUiAweDEwMDAwMDEKKyNkZWZpbmUgRkFTVExBTkVfRE1BX0FERFIgMHgxMDAwMDQxCisKKworLyogVGhlIEZhc3RsYW5lIERNQSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNvbmRfcmVnOwkvKiBETUEgc3RhdHVzICAocm8pIFsweDAwMDBdICovCisjZGVmaW5lIGN0cmxfcmVnICBjb25kX3JlZwkJCS8qIERNQSBjb250cm9sICh3bykgWzB4MDAwMF0gKi8KKwl1bnNpZ25lZCBjaGFyIGRtYXBhZDFbMHgzZl07CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbGVhcl9zdHJvYmU7ICAgIC8qIERNQSBjbGVhciAgICh3bykgWzB4MDA0MF0gKi8KK307CisKKworLyogRE1BIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9NSU5UICAweDgwCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9JQUNUICAweDQwCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9DUkVRICAweDIwCisKKy8qIERNQSBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgRkFTVExBTkVfRE1BX0ZDT0RFIDB4YTAKKyNkZWZpbmUgRkFTVExBTkVfRE1BX01BU0sgIDB4ZjMKKyNkZWZpbmUgRkFTVExBTkVfRE1BX0xFRCAgIDB4MTAJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9uICovCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9XUklURSAweDA4IC8qIDEgPSB3cml0ZSAqLworI2RlZmluZSBGQVNUTEFORV9ETUFfRU5BQkxFIDB4MDQgLyogRW5hYmxlIERNQSAqLworI2RlZmluZSBGQVNUTEFORV9ETUFfRURJICAgMHgwMgkvKiBFbmFibGUgRE1BIElSUSA/ICovCisjZGVmaW5lIEZBU1RMQU5FX0RNQV9FU0kgICAweDAxCS8qIEVuYWJsZSBTQ1NJIElSUSAqLworCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgdmFkZHIsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgaW50ICBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaXJxX2V4aXQoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgaW50ICBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGN0cmxfZGF0YSA9IDA7CS8qIEtlZXAgYmFja3VwIG9mIHRoZSBzdHVmZiB3cml0dGVuCisJCQkJICogdG8gY3RybF9yZWcuIEFsd2F5cyB3cml0ZSBhIGNvcHkKKwkJCQkgKiB0byB0aGlzIHJlZ2lzdGVyIHdoZW4gd3JpdGluZyB0bworCQkJCSAqIHRoZSBoYXJkd2FyZSByZWdpc3RlciEKKwkJCQkgKi8KKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07CisJCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAorCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NsZWFyKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KKwkJKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKKwl1bnNpZ25lZCBsb25nICp0OworCisJY3RybF9kYXRhID0gKGN0cmxfZGF0YSAmIEZBU1RMQU5FX0RNQV9NQVNLKTsKKwlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7CisKKwl0ID0gKHVuc2lnbmVkIGxvbmcgKikoZXNwLT5lZGV2KTsKKworCWRyZWdzLT5jbGVhcl9zdHJvYmUgPSAwOworCSp0ID0gMCA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK2ludCBfX2luaXQgZmFzdGxhbmVfZXNwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisJc3RydWN0IE5DUl9FU1AgKmVzcDsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlpZiAoKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjMwX0lJX0ZBU1RMQU5FX1ozX0NZQkVSU0NTSV9DWUJFUlNUT1JNMDYwLCB6KSkpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworCSAgICBpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK0ZBU1RMQU5FX0VTUF9BRERSLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgeworCQkvKiBDaGVjayBpZiB0aGlzIGlzIHJlYWxseSBhIGZhc3RsYW5lIGNvbnRyb2xsZXIuIFRoZSBwcm9ibGVtCisJCSAqIGlzIHRoYXQgYWxzbyB0aGUgY3liZXJzdG9ybSBhbmQgYmxpenphcmQgY29udHJvbGxlcnMgdXNlCisJCSAqIHRoaXMgSUQgdmFsdWUuIEZvcnR1bmF0ZWx5IG9ubHkgRmFzdGxhbmUgbWFwcyBpbiBaMyBzcGFjZQorCQkgKi8KKwkJaWYgKGJvYXJkIDwgMHgxMDAwMDAwKSB7CisJCQlnb3RvIGVycl9yZWxlYXNlOworCQl9CisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkK0ZBU1RMQU5FX0VTUF9BRERSKTsKKworCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KKwkJZXNwLT5kb19waW9fY21kcyA9IDE7CisKKwkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKKwkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisJCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKKworCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYmFycmllciA9IDA7CisJCWVzcC0+ZG1hX2RyYWluID0gMDsKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7CisJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJCWVzcC0+ZG1hX2lycV9leGl0ID0gJmRtYV9pcnFfZXhpdDsKKwkJZXNwLT5kbWFfbGVkX29uID0gJmRtYV9sZWRfb247CisJCWVzcC0+ZG1hX2xlZF9vZmYgPSAmZG1hX2xlZF9vZmY7CisJCWVzcC0+ZG1hX3BvbGwgPSAwOworCQllc3AtPmRtYV9yZXNldCA9IDA7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgcG9ydEJpdHMgKGVuYWJsZSBJUlFzKSAqLworCQljdHJsX2RhdGEgPSAoRkFTVExBTkVfRE1BX0ZDT0RFIHwKKyNpZm5kZWYgTk9ETUFJUlEKKwkJCSAgICAgRkFTVExBTkVfRE1BX0VESSB8CisjZW5kaWYKKwkJCSAgICAgRkFTVExBTkVfRE1BX0VTSSk7CisJCQkKKworCQkvKiBTQ1NJIGNoaXAgY2xvY2sgKi8KKwkJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOworCisKKwkJLyogTWFwIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIGludG8gdmlydHVhbCBrZXJuZWwgc3BhY2UgKi8KKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKQorCQkJel9pb3JlbWFwKGJvYXJkLCB6LT5yZXNvdXJjZS5lbmQtYm9hcmQrMSk7CisKKwkJaWYoIWFkZHJlc3MpeworCQkJcHJpbnRrKCJDb3VsZCBub3QgcmVtYXAgRmFzdGxhbmUgY29udHJvbGxlciBtZW1vcnkhIik7CisJCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCQl9CisKKworCQkvKiBUaGUgRE1BIHJlZ2lzdGVycyBvbiB0aGUgRmFzdGxhbmUgYXJlIG1hcHBlZAorCQkgKiByZWxhdGl2ZSB0byB0aGUgZGV2aWNlIChpLmUuIGluIHRoZSBzYW1lIFpvcnJvCisJCSAqIEkvTyBibG9jaykuCisJCSAqLworCQllc3AtPmRyZWdzID0gKHZvaWQgKikoYWRkcmVzcyArIEZBU1RMQU5FX0RNQV9BRERSKTsKKworCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLworCQllc3AtPmVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgRkFTVExBTkVfRVNQX0FERFIpOworCisJCS8qIEJvYXJkIGJhc2UgKi8KKwkJZXNwLT5lZGV2ID0gKHZvaWQgKikgYWRkcmVzczsKKwkJCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7CisJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7CisKKwkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisJCWVzcC0+c2xvdCA9IGJvYXJkK0ZBU1RMQU5FX0VTUF9BRERSOworCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50ciwgU0FfU0hJUlEsCisJCQkJIkZhc3RsYW5lIFNDU0kiLCBlc3AtPmVob3N0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFzdGxhbmU6IENvdWxkIG5vdCBnZXQgSVJRJWQsIGFib3J0aW5nLlxuIiwgSVJRX0FNSUdBX1BPUlRTKTsKKwkJCWdvdG8gZXJyX3VubWFwOworCQl9CQkJCisKKwkJLyogQ29udHJvbGxlciBJRCAqLworCQllc3AtPnNjc2lfaWQgPSA3OworCQkKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cy4gKi8KKwkJZXNwLT5kaWZmID0gMDsKKworCQlkbWFfY2xlYXIoZXNwKTsKKwkJZXNwX2luaXRpYWxpemUoZXNwKTsKKworCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOworCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwkJcmV0dXJuIGVzcHNfaW5fdXNlOworCSAgICB9CisJfQorCXJldHVybiAwOworCisgZXJyX3VubWFwOgorCXpfaW91bm1hcCgodm9pZCAqKWFkZHJlc3MpOworIGVycl91bnJlZ2lzdGVyOgorCXNjc2lfdW5yZWdpc3RlciAoZXNwLT5laG9zdCk7CisgZXJyX3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHotPnJlc291cmNlLnN0YXJ0K0ZBU1RMQU5FX0VTUF9BRERSLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJLyogU2luY2UgdGhlIEZhc3RsYW5lIERNQSBpcyBmdWxseSBkZWRpY2F0ZWQgdG8gdGhlIEVTUCBjaGlwLAorCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCAodG8gdGhlIEVTUCBjaGlwKSBlcXVhbHMgdGhlIG51bWJlcgorCSAqIG9mIGJ5dGVzIGluIHRoZSBGSUZPIC0gdGhlcmUgaXMgbm8gYnVmZmVyaW5nIGluIHRoZSBETUEgY29udHJvbGxlci4KKwkgKiBYWFhYIERvIEkgcmVhZCB0aGlzIHJpZ2h0PyBJdCBpcyBmcm9tIGhvc3QgdG8gRVNQLCByaWdodD8KKwkgKi8KKwlyZXR1cm4gZmlmb19jb3VudDsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlpZihzeiA+IDB4ZmZmYykKKwkJc3ogPSAweGZmZmM7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCUVTUExPRygoImVzcCVkOiBkbWEgLS0gY29uZF9yZWc8JTAyeD5cbiIsCisJCWVzcC0+ZXNwX2lkLCAoKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopCisJCQkgICAgICAoZXNwLT5kcmVncykpLT5jb25kX3JlZykpOworCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCisJCWN1c3RvbS5pbnRyZXFyLCBjdXN0b20uaW50ZW5hcikpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisJdW5zaWduZWQgbG9uZyAqdDsKKwkKKwljYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOworCisJZG1hX2NsZWFyKGVzcCk7CisKKwl0ID0gKHVuc2lnbmVkIGxvbmcgKikoKGFkZHIgJiAweDAwZmZmZmZmKSArIGVzcC0+ZWRldik7CisKKwlkcmVncy0+Y2xlYXJfc3Ryb2JlID0gMDsKKwkqdCA9IGFkZHI7CisKKwljdHJsX2RhdGEgPSAoY3RybF9kYXRhICYgRkFTVExBTkVfRE1BX01BU0spIHwgRkFTVExBTkVfRE1BX0VOQUJMRTsKKwlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisJdW5zaWduZWQgbG9uZyAqdDsKKworCWNhY2hlX3B1c2goYWRkciwgbGVuZ3RoKTsKKworCWRtYV9jbGVhcihlc3ApOworCisJdCA9ICh1bnNpZ25lZCBsb25nICopKChhZGRyICYgMHgwMGZmZmZmZikgKyAoZXNwLT5lZGV2KSk7CisKKwlkcmVncy0+Y2xlYXJfc3Ryb2JlID0gMDsKKwkqdCA9IGFkZHI7CisKKwljdHJsX2RhdGEgPSAoKGN0cmxfZGF0YSAmIEZBU1RMQU5FX0RNQV9NQVNLKSB8IAorCQkgICAgIEZBU1RMQU5FX0RNQV9FTkFCTEUgfAorCQkgICAgIEZBU1RMQU5FX0RNQV9XUklURSk7CisJZHJlZ3MtPmN0cmxfcmVnID0gY3RybF9kYXRhOworfQorCisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWRpc2FibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwllbmFibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2lycV9leGl0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7CisKKwlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGEgJiB+KEZBU1RMQU5FX0RNQV9FREl8RkFTVExBTkVfRE1BX0VTSSk7CisjaWZkZWYgX19tYzY4MDAwX18KKwlub3AoKTsKKyNlbmRpZgorCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKKwl1bnNpZ25lZCBjaGFyIGRtYV9zdGF0dXM7CisKKwlkbWFfc3RhdHVzID0gZHJlZ3MtPmNvbmRfcmVnOworCisJaWYoZG1hX3N0YXR1cyAmIEZBU1RMQU5FX0RNQV9JQUNUKQorCQlyZXR1cm4gMDsJLyogbm90IG91ciBJUlEgKi8KKworCS8qIFJldHVybiBub24temVybyBpZiBFU1AgcmVxdWVzdGVkIElSUSAqLworCXJldHVybiAoCisjaWZuZGVmIE5PRE1BSVJRCisJICAgKGRtYV9zdGF0dXMgJiBGQVNUTEFORV9ETUFfQ1JFUSkgJiYKKyNlbmRpZgorCSAgICghKGRtYV9zdGF0dXMgJiBGQVNUTEFORV9ETUFfTUlOVCkpICYmCisJICAgKGVzcF9yZWFkKCgoc3RydWN0IEVTUF9yZWdzICopIChlc3AtPmVyZWdzKSktPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWN0cmxfZGF0YSAmPSB+RkFTVExBTkVfRE1BX0xFRDsKKwkoKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwljdHJsX2RhdGEgfD0gRkFTVExBTkVfRE1BX0xFRDsKKwkoKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKChjdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwkvKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKwkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKwkgKi8KKwlpZih3cml0ZSl7CisJCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7CisJfQorfQorCisjZGVmaW5lIEhPU1RTX0MKKworaW50IGZhc3RsYW5lX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworI2lmZGVmIE1PRFVMRQorCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OworCWVzcF9kZWFsbG9jYXRlKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSk7CisJZXNwX3JlbGVhc2UoKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAiZXNwLWZhc3RsYW5lIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJGYXN0bGFuZSBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBmYXN0bGFuZV9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gZmFzdGxhbmVfZXNwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORworfTsKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY2FsLmMgYi9kcml2ZXJzL3Njc2kvZmNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWQ4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZmNhbC5jCkBAIC0wLDAgKzEsMzIwIEBACisvKiBmY2FsLmM6IEZpYnJlIENoYW5uZWwgQXJiaXRyYXRlZCBMb29wIFNDU0kgaG9zdCBhZGFwdGVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSBKYWt1YiBKZWxpbmVrIChqakB1bHRyYS5saW51eC5jeikKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIi4uL2ZjNC9mY3BfaW1wbC5oIgorI2luY2x1ZGUgImZjYWwuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKiAjZGVmaW5lIEZDQUxfREVCVUcgKi8KKworI2RlZmluZSBmY2FsX3ByaW50ayBwcmludGsgKCJGQ0FMICVzOiAiLCBmYy0+bmFtZSk7IHByaW50aworCisjaWZkZWYgRkNBTF9ERUJVRworI2RlZmluZSBGQ0FMRCh4KSAgZmNhbF9wcmludGsgeDsKKyNkZWZpbmUgRkNBTE5EKHgpIHByaW50ayAoIkZDQUw6ICIpOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIEZDQUxEKHgpCisjZGVmaW5lIEZDQUxORCh4KQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFscGEydGFyZ2V0W10gPSB7CisweDdlLCAweDdkLCAweDdjLCAweGZmLCAweDdiLCAweGZmLCAweGZmLCAweGZmLCAweDdhLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDc5LAorMHg3OCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg3NywgMHg3NiwgMHhmZiwgMHhmZiwgMHg3NSwgMHhmZiwgMHg3NCwgMHg3MywgMHg3MiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4NzEsIDB4ZmYsIDB4NzAsIDB4NmYsIDB4NmUsIDB4ZmYsIDB4NmQsIDB4NmMsIDB4NmIsIDB4NmEsIDB4NjksIDB4NjgsIDB4ZmYsCisweGZmLCAweDY3LCAweDY2LCAweDY1LCAweDY0LCAweDYzLCAweDYyLCAweGZmLCAweGZmLCAweDYxLCAweDYwLCAweGZmLCAweDVmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHg1ZSwgMHhmZiwgMHg1ZCwgMHg1YywgMHg1YiwgMHhmZiwgMHg1YSwgMHg1OSwgMHg1OCwgMHg1NywgMHg1NiwgMHg1NSwgMHhmZiwKKzB4ZmYsIDB4NTQsIDB4NTMsIDB4NTIsIDB4NTEsIDB4NTAsIDB4NGYsIDB4ZmYsIDB4ZmYsIDB4NGUsIDB4NGQsIDB4ZmYsIDB4NGMsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweDRiLCAweGZmLCAweDRhLCAweDQ5LCAweDQ4LCAweGZmLCAweDQ3LCAweDQ2LCAweDQ1LCAweDQ0LCAweDQzLCAweDQyLCAweGZmLAorMHhmZiwgMHg0MSwgMHg0MCwgMHgzZiwgMHgzZSwgMHgzZCwgMHgzYywgMHhmZiwgMHhmZiwgMHgzYiwgMHgzYSwgMHhmZiwgMHgzOSwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4MzgsIDB4MzcsIDB4MzYsIDB4ZmYsIDB4MzUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzQsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzMsCisweDMyLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDMxLCAweDMwLCAweGZmLCAweGZmLCAweDJmLCAweGZmLCAweDJlLCAweDJkLCAweDJjLAorMHhmZiwgMHhmZiwgMHhmZiwgMHgyYiwgMHhmZiwgMHgyYSwgMHgyOSwgMHgyOCwgMHhmZiwgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyMywgMHgyMiwgMHhmZiwKKzB4ZmYsIDB4MjEsIDB4MjAsIDB4MWYsIDB4MWUsIDB4MWQsIDB4MWMsIDB4ZmYsIDB4ZmYsIDB4MWIsIDB4MWEsIDB4ZmYsIDB4MTksIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweDE4LCAweGZmLCAweDE3LCAweDE2LCAweDE1LCAweGZmLCAweDE0LCAweDEzLCAweDEyLCAweDExLCAweDEwLCAweDBmLCAweGZmLAorMHhmZiwgMHgwZSwgMHgwZCwgMHgwYywgMHgwYiwgMHgwYSwgMHgwOSwgMHhmZiwgMHhmZiwgMHgwOCwgMHgwNywgMHhmZiwgMHgwNiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4MDUsIDB4MDQsIDB4MDMsIDB4ZmYsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRhcmdldDJhbHBhW10gPSB7CisweGVmLCAweGU4LCAweGU0LCAweGUyLCAweGUxLCAweGUwLCAweGRjLCAweGRhLCAweGQ5LCAweGQ2LCAweGQ1LCAweGQ0LCAweGQzLCAweGQyLCAweGQxLCAweGNlLAorMHhjZCwgMHhjYywgMHhjYiwgMHhjYSwgMHhjOSwgMHhjNywgMHhjNiwgMHhjNSwgMHhjMywgMHhiYywgMHhiYSwgMHhiOSwgMHhiNiwgMHhiNSwgMHhiNCwgMHhiMywKKzB4YjIsIDB4YjEsIDB4YWUsIDB4YWQsIDB4YWMsIDB4YWIsIDB4YWEsIDB4YTksIDB4YTcsIDB4YTYsIDB4YTUsIDB4YTMsIDB4OWYsIDB4OWUsIDB4OWQsIDB4OWIsCisweDk4LCAweDk3LCAweDkwLCAweDhmLCAweDg4LCAweDg0LCAweDgyLCAweDgxLCAweDgwLCAweDdjLCAweDdhLCAweDc5LCAweDc2LCAweDc1LCAweDc0LCAweDczLAorMHg3MiwgMHg3MSwgMHg2ZSwgMHg2ZCwgMHg2YywgMHg2YiwgMHg2YSwgMHg2OSwgMHg2NywgMHg2NiwgMHg2NSwgMHg2MywgMHg1YywgMHg1YSwgMHg1OSwgMHg1NiwKKzB4NTUsIDB4NTQsIDB4NTMsIDB4NTIsIDB4NTEsIDB4NGUsIDB4NGQsIDB4NGMsIDB4NGIsIDB4NGEsIDB4NDksIDB4NDcsIDB4NDYsIDB4NDUsIDB4NDMsIDB4M2MsCisweDNhLCAweDM5LCAweDM2LCAweDM1LCAweDM0LCAweDMzLCAweDMyLCAweDMxLCAweDJlLCAweDJkLCAweDJjLCAweDJiLCAweDJhLCAweDI5LCAweDI3LCAweDI2LAorMHgyNSwgMHgyMywgMHgxZiwgMHgxZSwgMHgxZCwgMHgxYiwgMHgxOCwgMHgxNywgMHgxMCwgMHgwZiwgMHgwOCwgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMAorfTsKKworc3RhdGljIGludCBmY2FsX2VuY29kZV9hZGRyKFNjc2lfQ21uZCAqU0NwbnQsIHUxNiAqYWRkciwgZmNfY2hhbm5lbCAqZmMsIGZjcF9jbW5kICpmY21kKTsKKworaW50IGZjYWxfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICpkZXZpY2UpCit7CisJaW50IGRlcHRoX3RvX3VzZTsKKwkKKwlpZiAoZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKQorCQlkZXB0aF90b191c2UgPSAvKiAyNTQgKi8gODsKKwllbHNlCisJCWRlcHRoX3RvX3VzZSA9IDI7CisKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsCisJCQkJKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA/CisJCQkJIE1TR19TSU1QTEVfVEFHIDogMCksCisJCQkJZGVwdGhfdG9fdXNlKTsKKworCXJldHVybiAwOworfQorCisvKiBEZXRlY3QgYWxsIEZDIEFyYml0cmF0ZWQgTG9vcHMgYXR0YWNoZWQgdG8gdGhlIG1hY2hpbmUuCisgICBmYzQgbW9kdWxlIGhhcyBkb25lIGFsbCB0aGUgd29yayBmb3IgdXMuLi4gKi8KK2ludCBfX2luaXQgZmNhbF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworCWludCBuZmNhbHMgPSAwOworCWZjX2NoYW5uZWwgKmZjOworCWludCBmY2FsY291bnQ7CisJaW50IGk7CisKKwl0cG50LT5wcm9jX25hbWUgPSAiZmNhbCI7CisJZmNhbGNvdW50ID0gMDsKKwlmb3JfZWFjaF9vbmxpbmVfZmNfY2hhbm5lbChmYykKKwkJaWYgKGZjLT5wb3NtYXApCisJCQlmY2FsY291bnQrKzsKKwlGQ0FMTkQoKCIlZCBjaGFubmVscyBvbmxpbmVcbiIsIGZjYWxjb3VudCkpCisJaWYgKCFmY2FsY291bnQpIHsKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfRkM0X1NPQ0FMX01PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfS01PRCkKKwkJcmVxdWVzdF9tb2R1bGUoInNvY2FsIik7CisJCQorCQlmb3JfZWFjaF9vbmxpbmVfZmNfY2hhbm5lbChmYykKKwkJCWlmIChmYy0+cG9zbWFwKQorCQkJCWZjYWxjb3VudCsrOworCQlpZiAoIWZjYWxjb3VudCkKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJfQorCWZvcl9lYWNoX29ubGluZV9mY19jaGFubmVsKGZjKSB7CisJCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJCWxvbmcgKmFnZXM7CisJCXN0cnVjdCBmY2FsICpmY2FsOworCQkKKwkJaWYgKCFmYy0+cG9zbWFwKSBjb250aW51ZTsKKwkJCisJCS8qIFN0cmFuZ2UsIHRoaXMgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRvIHNvbWUgb3RoZXIgU0NTSSBob3N0LCB0aGVuIGl0IGNhbm5vdCBiZSBmY2FsICovCisJCWlmIChmYy0+c2NzaV9uYW1lWzBdKSBjb250aW51ZTsKKwkJbWVtY3B5IChmYy0+c2NzaV9uYW1lLCAiRkNBTCIsIDQpOworCQkKKwkJZmMtPmNhbl9xdWV1ZSA9IEZDQUxfQ0FOX1FVRVVFOworCQlmYy0+cnNwX3NpemUgPSA2NDsKKwkJZmMtPmVuY29kZV9hZGRyID0gZmNhbF9lbmNvZGVfYWRkcjsKKwkJCisJCWFnZXMgPSBrbWFsbG9jICgxMjggKiBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCQlpZiAoIWFnZXMpIGNvbnRpbnVlOworCQkJCQorCQlob3N0ID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mIChzdHJ1Y3QgZmNhbCkpOworCQlpZiAoIWhvc3QpIAorCQl7CisJCQlrZnJlZShhZ2VzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQkJCisJCWlmICghdHJ5X21vZHVsZV9nZXQoZmMtPm1vZHVsZSkpIHsKKwkJCWtmcmVlKGFnZXMpOworCQkJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCQkJY29udGludWU7CisJCX0KKwkKKwkJbmZjYWxzKys7CisJCQkJCisJCWZjYWwgPSAoc3RydWN0IGZjYWwgKilob3N0LT5ob3N0ZGF0YTsKKwkJCisJCWZjLT5mY3BfcmVnaXN0ZXIoZmMsIFRZUEVfU0NTSV9GQ1AsIDApOworCisJCWZvciAoaSA9IDA7IGkgPCBmYy0+cG9zbWFwLT5sZW47IGkrKykgeworCQkJaW50IHN0YXR1cywgdGFyZ2V0LCBhbHBhOworCisJCQlhbHBhID0gZmMtPnBvc21hcC0+bGlzdFtpXTsJCQkKKwkJCUZDQUxEKCgiU2VuZGluZyBQTE9HSSB0byAlMDJ4XG4iLCBhbHBhKSkKKwkJCXRhcmdldCA9IGFscGEydGFyZ2V0W2FscGFdOworCQkJc3RhdHVzID0gZmNfZG9fcGxvZ2koZmMsIGFscGEsIGZjYWwtPm5vZGVfd3duICsgdGFyZ2V0LCAKKwkJCQkJICAgICBmY2FsLT5ucG9ydF93d24gKyB0YXJnZXQpOworCQkJRkNBTEQoKCJQTE9HSSByZXR1cm5lZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKSkKKwkJCWlmIChzdGF0dXMgIT0gRkNfU1RBVFVTX09LKQorCQkJCWNvbnRpbnVlOworCQkJRkNBTEQoKCJTZW5kaW5nIFBSTEkgdG8gJTAyeFxuIiwgYWxwYSkpCisJCQlzdGF0dXMgPSBmY19kb19wcmxpKGZjLCBhbHBhKTsKKwkJCUZDQUxEKCgiUFJMSSByZXR1cm5lZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKSkKKwkJCWlmIChzdGF0dXMgPT0gRkNfU1RBVFVTX09LKQorCQkJCWZjYWwtPm1hcFt0YXJnZXRdID0gMTsKKwkJfQorCQkKKwkJaG9zdC0+bWF4X2lkID0gMTI3OworCQlob3N0LT5pcnEgPSBmYy0+aXJxOworI2lmZGVmIF9fc3BhcmNfdjlfXworCQlob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IDE7CisjZW5kaWYKKworCQlmYy0+Y2hhbm5lbHMgPSAxOworCQlmYy0+dGFyZ2V0cyA9IDEyNzsKKwkJZmMtPmFnZXMgPSBhZ2VzOworCQltZW1zZXQgKGFnZXMsIDAsIDEyOCAqIHNpemVvZihsb25nKSk7CisJCQkJCisJCWZjYWwtPmZjID0gZmM7CisJCQorCQlGQ0FMRCgoIkZvdW5kIEZDQUxcbiIpKQorCX0KKwlpZiAobmZjYWxzKQorI2lmZGVmIF9fc3BhcmNfXworCQlwcmludGsgKCJGQ0FMOiBUb3RhbCBvZiAlZCBTdW4gRW50ZXJwcmlzZSBOZXR3b3JrIEFycmF5IChBNTAwMCBvciBFWDUwMCkgY2hhbm5lbHMgZm91bmRcbiIsIG5mY2Fscyk7CisjZWxzZQorCQlwcmludGsgKCJGQ0FMOiBUb3RhbCBvZiAlZCBGaWJyZSBDaGFubmVsIEFyYml0cmF0ZWQgTG9vcHMgZm91bmRcbiIsIG5mY2Fscyk7CisjZW5kaWYKKwlyZXR1cm4gbmZjYWxzOworfQorCitpbnQgZmNhbF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IGZjYWwgKmZjYWwgPSAoc3RydWN0IGZjYWwgKilob3N0LT5ob3N0ZGF0YTsKKwlmY19jaGFubmVsICpmYyA9IGZjYWwtPmZjOworCisJbW9kdWxlX3B1dChmYy0+bW9kdWxlKTsKKwkKKwlmYy0+ZmNwX3JlZ2lzdGVyKGZjLCBUWVBFX1NDU0lfRkNQLCAxKTsKKwlGQ0FMTkQoKCIgcmVsZWFzaW5nIGZjYWwuXG4iKSk7CisJa2ZyZWUgKGZjLT5hZ2VzKTsKKwlGQ0FMTkQoKCJyZWxlYXNlZCBmY2FsIVxuIikpOworCXJldHVybiAwOworfQorCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIHsgaWYgKHBvcyA8IChidWZmZXIgKyBsZW5ndGgpKSBwb3MgKz0gc3ByaW50ZiAocG9zLCAjIyBhcmdzKTsgfQorCitpbnQgZmNhbF9wcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgZmNhbCAqZmNhbDsKKwlmY19jaGFubmVsICpmYzsKKwljaGFyICpwb3MgPSBidWZmZXI7CisJaW50IGksIGo7CisKKwlpZiAoaW5vdXQpIHJldHVybiBsZW5ndGg7CisgICAgCisJZmNhbCA9IChzdHJ1Y3QgZmNhbCAqKWhvc3QtPmhvc3RkYXRhOworCWZjID0gZmNhbC0+ZmM7CisKKyNpZmRlZiBfX3NwYXJjX18KKwlTUFJJTlRGICgiU3VuIEVudGVycHJpc2UgTmV0d29yayBBcnJheSAoQTUwMDAgb3IgRT81MDApIG9uICVzIFBST00gbm9kZSAleFxuIiwgZmMtPm5hbWUsIGZjLT5kZXYtPnByb21fbm9kZSk7CisjZWxzZQorCVNQUklOVEYgKCJGaWJyZSBDaGFubmVsIEFyYml0cmF0ZWQgTG9vcCBvbiAlc1xuIiwgZmMtPm5hbWUpOworI2VuZGlmCisJU1BSSU5URiAoIkluaXRpYXRvciBBTC1QQTogJTAyeFxuIiwgZmMtPnNpZCk7CisKKwlTUFJJTlRGICgiXG5BdHRhY2hlZCBkZXZpY2VzOlxuIik7CisJCisJZm9yIChpID0gMDsgaSA8IGZjLT5wb3NtYXAtPmxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYWxwYSA9IGZjLT5wb3NtYXAtPmxpc3RbaV07CisJCXVuc2lnbmVkIGNoYXIgdGFyZ2V0OworCQl1MzIgKnUxLCAqdTI7CisJCQorCQl0YXJnZXQgPSBhbHBhMnRhcmdldFthbHBhXTsKKwkJdTEgPSAodTMyICopJmZjYWwtPm5wb3J0X3d3blt0YXJnZXRdOworCQl1MiA9ICh1MzIgKikmZmNhbC0+bm9kZV93d25bdGFyZ2V0XTsKKwkJaWYgKCF1MVswXSAmJiAhdTFbMV0pIHsKKwkJCVNQUklOVEYgKCIgIFtBTC1QQTogJTAyeF0gTm90IHJlc3BvbmRlZCB0byBQTE9HSVxuIiwgYWxwYSk7CisJCX0gZWxzZSBpZiAoIWZjYWwtPm1hcFt0YXJnZXRdKSB7CisJCQlTUFJJTlRGICgiICBbQUwtUEE6ICUwMngsIFBvcnQgV1dOOiAlMDh4JTA4eCwgTm9kZSBXV046ICUwOHglMDh4XSBOb3QgcmVzcG9uZGVkIHRvIFBSTElcbiIsCisJCQkJIGFscGEsIHUxWzBdLCB1MVsxXSwgdTJbMF0sIHUyWzFdKTsKKwkJfSBlbHNlIHsKKwkJCVNjc2lfRGV2aWNlICpzY2Q7CisJCQlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2NkLCBob3N0KQorCQkJCWlmIChzY2QtPmlkID09IHRhcmdldCkgeworCQkJCQlTUFJJTlRGICgiICBbQUwtUEE6ICUwMngsIElkOiAlMDJkLCBQb3J0IFdXTjogJTA4eCUwOHgsIE5vZGUgV1dOOiAlMDh4JTA4eF0gICIsCisJCQkJCQlhbHBhLCB0YXJnZXQsIHUxWzBdLCB1MVsxXSwgdTJbMF0sIHUyWzFdKTsKKwkJCQkJU1BSSU5URiAoIiVzICIsIChzY2QtPnR5cGUgPCBNQVhfU0NTSV9ERVZJQ0VfQ09ERSkgPworCQkJCQkJc2NzaV9kZXZpY2VfdHlwZXNbKHNob3J0KSBzY2QtPnR5cGVdIDogIlVua25vd24gZGV2aWNlIik7CisKKwkJCQkJZm9yIChqID0gMDsgKGogPCA4KSAmJiAoc2NkLT52ZW5kb3Jbal0gPj0gMHgyMCk7IGorKykKKwkJCQkJCVNQUklOVEYgKCIlYyIsIHNjZC0+dmVuZG9yW2pdKTsKKwkJCQkJU1BSSU5URiAoIiAiKTsKKworCQkJCQlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoc2NkLT5tb2RlbFtqXSA+PSAweDIwKTsgaisrKQorCQkJCQkJU1BSSU5URiAoIiVjIiwgc2NkLT5tb2RlbFtqXSk7CisJCQorCQkJCQlTUFJJTlRGICgiXG4iKTsKKwkJCQl9CisJCX0KKwl9CisJU1BSSU5URiAoIlxuIik7CisKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlpZiAoKHBvcyAtIGJ1ZmZlcikgPCBvZmZzZXQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHBvcyAtIGJ1ZmZlciAtIG9mZnNldCA8IGxlbmd0aCkKKwkJcmV0dXJuIHBvcyAtIGJ1ZmZlciAtIG9mZnNldDsKKwllbHNlCisJCXJldHVybiBsZW5ndGg7Cit9CisKKy8qIAorICAgRm9yIEZDLUFMLCB3ZSB1c2UgYSBzaW1wbGUgYWRkcmVzc2luZzogd2UgaGF2ZSBqdXN0IG9uZSBjaGFubmVsIDAsCisgICBhbmQgYWxsIEFMLVBBcyBhcmUgbWFwcGVkIHRvIHRhcmdldHMgMC4uMHg3ZQorICovCitzdGF0aWMgaW50IGZjYWxfZW5jb2RlX2FkZHIoU2NzaV9DbW5kICpTQ3BudCwgdTE2ICphZGRyLCBmY19jaGFubmVsICpmYywgZmNwX2NtbmQgKmZjbWQpCit7CisJc3RydWN0IGZjYWwgKmY7CisJCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCBMVU5zIHlldCAtIEknbSBub3Qgc3VyZSBpZiBMVU4gc2hvdWxkIGJlIGluIFNDU0kgZmNwX2NkYiwgb3IgaW4gc2Vjb25kIGJ5dGUgb2YgYWRkclswXSAqLworCWlmIChTQ3BudC0+Y21uZFsxXSAmIDB4ZTApIHJldHVybiAtRUlOVkFMOworCS8qIEZDLVBMREEgdGVsbHMgdXMuLi4gKi8KKwltZW1zZXQoYWRkciwgMCwgOCk7CisJZiA9IChzdHJ1Y3QgZmNhbCAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWlmICghZi0+bWFwW1NDcG50LT5kZXZpY2UtPmlkXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogTm93LCBkZXRlcm1pbmUgRElEOiBJdCB3aWxsIGJlIE5hdGl2ZSBJZGVudGlmaWVyLCBzbyB3ZSB6ZXJvIHVwcGVyCisJICAgMiBieXRlcyBvZiB0aGUgMyBieXRlIERJRCwgbG93ZXN0IGJ5dGUgd2lsbCBiZSBBTC1QQSAqLworCWZjbWQtPmRpZCA9IHRhcmdldDJhbHBhW1NDcG50LT5kZXZpY2UtPmlkXTsKKwlGQ0FMRCgoInRyeWluZyBESUQgJTA2eFxuIiwgZmNtZC0+ZGlkKSkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9ICJGaWJyZSBDaGFubmVsIEFyYml0cmF0ZWQgTG9vcCIsCisJLmRldGVjdAkJCT0gZmNhbF9kZXRlY3QsCisJLnJlbGVhc2UJCT0gZmNhbF9yZWxlYXNlLAkKKwkucHJvY19pbmZvCQk9IGZjYWxfcHJvY19pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZmNwX3Njc2lfcXVldWVjb21tYW5kLAorCS5zbGF2ZV9jb25maWd1cmUJPSBmY2FsX3NsYXZlX2NvbmZpZ3VyZSwKKwkuY2FuX3F1ZXVlCQk9IEZDQUxfQ0FOX1FVRVVFLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gMSwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBmY3Bfc2NzaV9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBmY3Bfc2NzaV9kZXZfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZmNwX3Njc2lfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBmY3Bfc2NzaV9ob3N0X3Jlc2V0LAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY2FsLmggYi9kcml2ZXJzL3Njc2kvZmNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWEzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZmNhbC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIGZjYWwuaDogR2VuZXJpYyBGaWJyZSBDaGFubmVsIEFyYml0cmF0ZWQgTG9vcCBTQ1NJIGhvc3QgYWRhcHRlciBkcml2ZXIgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LDE5OTkgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCisgKi8KKworI2lmbmRlZiBfRkNBTF9ICisjZGVmaW5lIF9GQ0FMX0gKKworI2luY2x1ZGUgIi4uL2ZjNC9mY3BfaW1wbC5oIgorCitzdHJ1Y3QgZmNhbCB7CisJLyogZmMgbXVzdCBiZSBmaXJzdCAqLworCWZjX2NoYW5uZWwJCSpmYzsKKwl1bnNpZ25lZCBjaGFyCQltYXBbMTI4XTsKKwlmY193d24JCQlucG9ydF93d25bMTI4XTsKKwlmY193d24JCQlub2RlX3d3blsxMjhdOworfTsKKworLyogQXJiaXRyYXJ5IGNvbnN0YW50LiBDYW5ub3QgYmUgdG9vIGxhcmdlLCBhcyBmYzQgbGF5ZXIgaGFzIGxpbWl0YXRpb25zCisgICBmb3IgYSBwYXJ0aWN1bGFyIGNoYW5uZWwgKi8KKyNkZWZpbmUgRkNBTF9DQU5fUVVFVUUJCTUxMgorCitpbnQgZmNhbF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworaW50IGZjYWxfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworaW50IGZjYWxfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICopOworCisjZW5kaWYgLyogIShfRkNBTF9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2ZkX21jcy5jIGIvZHJpdmVycy9zY3NpL2ZkX21jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDkzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZmRfbWNzLmMKQEAgLTAsMCArMSwxMzY5IEBACisvKiBmZF9tY3MuYyAtLSBGdXR1cmUgRG9tYWluIE1DUyA2MDAvNzAwIChvciBJQk0gT0VNKSBkcml2ZXIKKyAqCisgKiBGdXR1cmVEb21haW4gTUNTLTYwMC83MDAgdjAuMiAwMy8xMS8xOTk4IGJ5IFpQIEd1ICh6cGdAY2FzdGxlLm5ldCkKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBjbG9uZWQgZnJvbSBmZG9tYWluLiogdG8gc3BlY2lmaWNhbGx5IHN1cHBvcnQKKyAqIHRoZSBGdXR1cmUgRG9tYWluIE1DUyA2MDAvNzAwIE1DQSBTQ1NJIGFkYXB0ZXJzLiBTb21lIFBTLzJzCisgKiBhbHNvIGVxdWlwcGVkIHdpdGggSUJNIEZhc3QgU0NTSSBBZGFwdGVyL0Egd2hpY2ggaXMgYW4gT0VNCisgKiBvZiBNQ1MgNzAwLgorICoKKyAqIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgUmVwbHkgU0IxNi9TQ1NJIGNhcmQgKHRoZSBTQ1NJIHBhcnQpLgorICoKKyAqIFdoYXQgbWFrZXMgdGhpcyBkcml2ZXIgZGlmZmVyZW50IGlzIHRoYXQgdGhpcyBkcml2ZXIgaXMgTUNBIG9ubHkKKyAqIGFuZCBpdCBzdXBwb3J0cyBtdWx0aXBsZSBhZGFwdGVycyBpbiB0aGUgc2FtZSBzeXN0ZW0sIElSUSAKKyAqIHNoYXJpbmcsIHNvbWUgZHJpdmVyIHN0YXRpc3RpY3MsIGFuZCBtYXBzIGhpZ2hlc3QgU0NTSSBpZCB0byBzZGEuCisgKiBBbGwgY2FyZHMgYXJlIGF1dG8tZGV0ZWN0ZWQuCisgKgorICogQXNzdW1wdGlvbnM6IFRNQy0xODAwLzE4QzUwLzE4QzMwLCBCSU9TID49IDMuNAorICoKKyAqIExJTE8gY29tbWFuZC1saW5lIG9wdGlvbnM6CisgKiAgIGZkX21jcz08RklGT19DT1VOVD5bLDxGSUZPX1NJWkU+XQorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbGVhc2Ugc2VlIENvcHlyaWdodHMvQ29tbWVudHMgaW4gZmRvbWFpbi4qIGZvciBjcmVkaXRzLgorICogRm9sbG93aW5nIGlzIGZyb20gZmRvbWFpbi5jIGZvciBhY2tub3dsZWRnZW1lbnQ6CisgKgorICogQ3JlYXRlZDogU3VuIE1heSAgMyAxODo1MzoxOSAxOTkyIGJ5IGZhaXRoQGNzLnVuYy5lZHUKKyAqIFJldmlzZWQ6IFdlZCBPY3QgIDIgMTE6MTA6NTUgMTk5NiBieSByLmZhaXRoQGllZWUub3JnCisgKiBBdXRob3I6IFJpY2thcmQgRS4gRmFpdGgsIGZhaXRoQGNzLnVuYy5lZHUKKyAqIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IFJpY2thcmQgRS4gRmFpdGgKKyAqCisgKiAkSWQ6IGZkb21haW4uYyx2IDUuNDUgMTk5Ni8xMC8wMiAxNToxMzowNiByb290IEV4cCAkCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgTk9URVMgT04gVVNFUiBERUZJTkFCTEUgT1BUSU9OUzoKKworIERFQlVHOiBUaGlzIHR1cm5zIG9uIHRoZSBwcmludGluZyBvZiB2YXJpb3VzIGRlYnVnIGluZm9ybWF0aW9uLgorCisgRU5BQkxFX1BBUklUWTogVGhpcyB0dXJucyBvbiBTQ1NJIHBhcml0eSBjaGVja2luZy4gIFdpdGggdGhlIGN1cnJlbnQKKyBkcml2ZXIsIGFsbCBhdHRhY2hlZCBkZXZpY2VzIG11c3Qgc3VwcG9ydCBTQ1NJIHBhcml0eS4gIElmIG5vbmUgb2YgeW91cgorIGRldmljZXMgc3VwcG9ydCBwYXJpdHksIHRoZW4geW91IGNhbiBwcm9iYWJseSBnZXQgdGhlIGRyaXZlciB0byB3b3JrIGJ5CisgdHVybmluZyB0aGlzIG9wdGlvbiBvZmYuICBJIGhhdmUgbm8gd2F5IG9mIHRlc3RpbmcgdGhpcywgaG93ZXZlciwgYW5kIGl0Cisgd291bGQgYXBwZWFyIHRoYXQgbm8gb25lIGV2ZXIgdXNlcyB0aGlzIG9wdGlvbi4KKworIEZJRk9fQ09VTlQ6IFRoZSBob3N0IGFkYXB0ZXIgaGFzIGFuIDhLIGNhY2hlIChob3N0IGFkYXB0ZXJzIGJhc2VkIG9uIHRoZQorIDE4QzMwIGNoaXAgaGF2ZSBhIDJrIGNhY2hlKS4gIFdoZW4gdGhpcyBtYW55IDUxMiBieXRlIGJsb2NrcyBhcmUgZmlsbGVkIGJ5CisgdGhlIFNDU0kgZGV2aWNlLCBhbiBpbnRlcnJ1cHQgd2lsbCBiZSByYWlzZWQuICBUaGVyZWZvcmUsIHRoaXMgY291bGQgYmUgYXMKKyBsb3cgYXMgMCwgb3IgYXMgaGlnaCBhcyAxNi4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdmFsdWVzIHdoaWNoIGFyZSB0b28gaGlnaAorIG9yIHRvbyBsb3cgc2VlbSB0byBwcmV2ZW50IGFueSBpbnRlcnJ1cHRzIGZyb20gb2NjdXJyaW5nLCBhbmQgdGhlcmVieSBsb2NrCisgdXAgdGhlIG1hY2hpbmUuICBJIGhhdmUgZm91bmQgdGhhdCAyIGlzIGEgZ29vZCBudW1iZXIsIGJ1dCB0aHJvdWdocHV0IG1heQorIGJlIGluY3JlYXNlZCBieSBjaGFuZ2luZyB0aGlzIHZhbHVlIHRvIHZhbHVlcyB3aGljaCBhcmUgY2xvc2UgdG8gMi4KKyBQbGVhc2UgbGV0IG1lIGtub3cgaWYgeW91IHRyeSBhbnkgZGlmZmVyZW50IHZhbHVlcy4KKyBbKioqKipOb3cgYSBydW50aW1lIG9wdGlvbioqKioqXQorCisgUkVTRUxFQ1RJT046IFRoaXMgaXMgbm8gbG9uZ2VyIGFuIG9wdGlvbiwgc2luY2UgSSBnYXZlIHVwIHRyeWluZyB0bworIGltcGxlbWVudCBpdCBpbiB2ZXJzaW9uIDQueCBvZiB0aGlzIGRyaXZlci4gIEl0IGRpZCBub3QgaW1wcm92ZQorIHBlcmZvcm1hbmNlIGF0IGFsbCBhbmQgbWFkZSB0aGUgZHJpdmVyIHVuc3RhYmxlIChiZWNhdXNlIEkgbmV2ZXIgZm91bmQgb25lCisgb2YgdGhlIHR3byByYWNlIGNvbmRpdGlvbnMgd2hpY2ggd2VyZSBpbnRyb2R1Y2VkIGJ5IHRoZSBtdWx0aXBsZQorIG91dHN0YW5kaW5nIGNvbW1hbmQgY29kZSkuICBUaGUgaW5zdGFiaWxpdHkgc2VlbXMgYSB2ZXJ5IGhpZ2ggcHJpY2UgdG8gcGF5CisganVzdCBzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIHRoZSB0YXBlIHRvIHJld2luZC4gIElmIHlvdSB3YW50CisgdGhpcyBmZWF0dXJlIGltcGxlbWVudGVkLCBzZW5kIG1lIHBhdGNoZXMuICBJJ2xsIGJlIGhhcHB5IHRvIHNlbmQgYSBjb3B5Cisgb2YgbXkgKGJyb2tlbikgZHJpdmVyIHRvIGFueW9uZSB3aG8gd291bGQgbGlrZSB0byBzZWUgYSBjb3B5LgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4yIGJ5IFpQIEd1PHpwZ0BjYXN0bGUubmV0PiIKKworLyogU1RBUlQgT0YgVVNFUiBERUZJTkFCTEUgT1BUSU9OUyAqLworCisjZGVmaW5lIERFQlVHICAgICAgICAgICAgMAkvKiBFbmFibGUgZGVidWdnaW5nIG91dHB1dCAqLworI2RlZmluZSBFTkFCTEVfUEFSSVRZICAgIDEJLyogRW5hYmxlIFNDU0kgUGFyaXR5ICovCisKKy8qIEVORCBPRiBVU0VSIERFRklOQUJMRSBPUFRJT05TICovCisKKyNpZiBERUJVRworI2RlZmluZSBFVkVSWV9BQ0NFU1MgICAgIDAJLyogV3JpdGUgYSBsaW5lIG9uIGV2ZXJ5IHNjc2kgYWNjZXNzICovCisjZGVmaW5lIEVSUk9SU19PTkxZICAgICAgMQkvKiBPbmx5IHdyaXRlIGEgbGluZSBpZiB0aGVyZSBpcyBhbiBlcnJvciAqLworI2RlZmluZSBERUJVR19NRVNTQUdFUyAgIDEJLyogRGVidWcgTUVTU0FHRSBJTiBwaGFzZSAqLworI2RlZmluZSBERUJVR19BQk9SVCAgICAgIDEJLyogRGVidWcgYWJvcnQoKSByb3V0aW5lICovCisjZGVmaW5lIERFQlVHX1JFU0VUICAgICAgMQkvKiBEZWJ1ZyByZXNldCgpIHJvdXRpbmUgKi8KKyNkZWZpbmUgREVCVUdfUkFDRSAgICAgICAxCS8qIERlYnVnIGludGVycnVwdC1kcml2ZW4gcmFjZSBjb25kaXRpb24gKi8KKyNlbHNlCisjZGVmaW5lIEVWRVJZX0FDQ0VTUyAgICAgMAkvKiBMRUFWRSBUSEVTRSBBTE9ORS0tQ0hBTkdFIFRIRSBPTkVTIEFCT1ZFICovCisjZGVmaW5lIEVSUk9SU19PTkxZICAgICAgMAorI2RlZmluZSBERUJVR19NRVNTQUdFUyAgIDAKKyNkZWZpbmUgREVCVUdfQUJPUlQgICAgICAwCisjZGVmaW5lIERFQlVHX1JFU0VUICAgICAgMAorI2RlZmluZSBERUJVR19SQUNFICAgICAgIDAKKyNlbmRpZgorCisvKiBFcnJvcnMgYXJlIHJlcG9ydGVkIG9uIHRoZSBsaW5lLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlcG9ydCB0aGVtIGFnYWluICovCisjaWYgRVZFUllfQUNDRVNTCisjdW5kZWYgRVJST1JTX09OTFkKKyNkZWZpbmUgRVJST1JTX09OTFkgICAgICAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9QQVJJVFkKKyNkZWZpbmUgUEFSSVRZX01BU0sgICAgICAweDA4CisjZWxzZQorI2RlZmluZSBQQVJJVFlfTUFTSyAgICAgIDB4MDAKKyNlbmRpZgorCitlbnVtIGNoaXBfdHlwZSB7CisJdW5rbm93biA9IDB4MDAsCisJdG1jMTgwMCA9IDB4MDEsCisJdG1jMThjNTAgPSAweDAyLAorCXRtYzE4YzMwID0gMHgwMywKK307CisKK2VudW0geworCWluX2FyYml0cmF0aW9uID0gMHgwMiwKKwlpbl9zZWxlY3Rpb24gPSAweDA0LAorCWluX290aGVyID0gMHgwOCwKKwlkaXNjb25uZWN0ID0gMHgxMCwKKwlhYm9ydGVkID0gMHgyMCwKKwlzZW50X2lkZW50ID0gMHg0MCwKK307CisKK2VudW0gaW5fcG9ydF90eXBlIHsKKwlSZWFkX1NDU0lfRGF0YSA9IDAsCisJU0NTSV9TdGF0dXMgPSAxLAorCVRNQ19TdGF0dXMgPSAyLAorCUZJRk9fU3RhdHVzID0gMywJLyogdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworCUludGVycnVwdF9Db25kID0gNCwJLyogdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworCUxTQl9JRF9Db2RlID0gNSwKKwlNU0JfSURfQ29kZSA9IDYsCisJUmVhZF9Mb29wYmFjayA9IDcsCisJU0NTSV9EYXRhX05vQUNLID0gOCwKKwlJbnRlcnJ1cHRfU3RhdHVzID0gOSwKKwlDb25maWd1cmF0aW9uMSA9IDEwLAorCUNvbmZpZ3VyYXRpb24yID0gMTEsCS8qIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKwlSZWFkX0ZJRk8gPSAxMiwKKwlGSUZPX0RhdGFfQ291bnQgPSAxNAorfTsKKworZW51bSBvdXRfcG9ydF90eXBlIHsKKwlXcml0ZV9TQ1NJX0RhdGEgPSAwLAorCVNDU0lfQ250bCA9IDEsCisJSW50ZXJydXB0X0NudGwgPSAyLAorCVNDU0lfTW9kZV9DbnRsID0gMywKKwlUTUNfQ250bCA9IDQsCisJTWVtb3J5X0NudGwgPSA1LAkvKiB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisJV3JpdGVfTG9vcGJhY2sgPSA3LAorCUlPX0NvbnRyb2wgPSAxMSwJLyogdG1jMThjMzAgb25seSAqLworCVdyaXRlX0ZJRk8gPSAxMgorfTsKKworc3RydWN0IGZkX2hvc3RkYXRhIHsKKwl1bnNpZ25lZCBsb25nIF9iaW9zX2Jhc2U7CisJaW50IF9iaW9zX21ham9yOworCWludCBfYmlvc19taW5vcjsKKwl2b2xhdGlsZSBpbnQgX2luX2NvbW1hbmQ7CisJU2NzaV9DbW5kICpfY3VycmVudF9TQzsKKwllbnVtIGNoaXBfdHlwZSBfY2hpcDsKKwlpbnQgX2FkYXB0ZXJfbWFzazsKKwlpbnQgX2ZpZm9fY291bnQ7CS8qIE51bWJlciBvZiA1MTIgYnl0ZSBibG9ja3MgYmVmb3JlIElOVFIgKi8KKworCWNoYXIgX2FkYXB0ZXJfbmFtZVs2NF07CisjaWYgREVCVUdfUkFDRQorCXZvbGF0aWxlIGludCBfaW5faW50ZXJydXB0X2ZsYWc7CisjZW5kaWYKKworCWludCBfU0NTSV9Nb2RlX0NudGxfcG9ydDsKKwlpbnQgX0ZJRk9fRGF0YV9Db3VudF9wb3J0OworCWludCBfSW50ZXJydXB0X0NudGxfcG9ydDsKKwlpbnQgX0ludGVycnVwdF9TdGF0dXNfcG9ydDsKKwlpbnQgX0ludGVycnVwdF9Db25kX3BvcnQ7CisJaW50IF9SZWFkX0ZJRk9fcG9ydDsKKwlpbnQgX1JlYWRfU0NTSV9EYXRhX3BvcnQ7CisJaW50IF9TQ1NJX0NudGxfcG9ydDsKKwlpbnQgX1NDU0lfRGF0YV9Ob0FDS19wb3J0OworCWludCBfU0NTSV9TdGF0dXNfcG9ydDsKKwlpbnQgX1RNQ19DbnRsX3BvcnQ7CisJaW50IF9UTUNfU3RhdHVzX3BvcnQ7CisJaW50IF9Xcml0ZV9GSUZPX3BvcnQ7CisJaW50IF9Xcml0ZV9TQ1NJX0RhdGFfcG9ydDsKKworCWludCBfRklGT19TaXplOwkJLyogPSAweDIwMDA7ICA4ayBGSUZPIGZvcgorCQkJCSAgIHByZS10bWMxOGMzMCBjaGlwcyAqLworCS8qIHNpbXBsZSBzdGF0cyAqLworCWludCBfQnl0ZXNfUmVhZDsKKwlpbnQgX0J5dGVzX1dyaXR0ZW47CisJaW50IF9JTlRSX1Byb2Nlc3NlZDsKK307CisKKyNkZWZpbmUgRkRfTUFYX0hPU1RTIDMJCS8qIGVub3VnaD8gKi8KKworI2RlZmluZSBIT1NUREFUQShzaHBudCkgKChzdHJ1Y3QgZmRfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKQorI2RlZmluZSBiaW9zX2Jhc2UgICAgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2Jpb3NfYmFzZSkKKyNkZWZpbmUgYmlvc19tYWpvciAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9iaW9zX21ham9yKQorI2RlZmluZSBiaW9zX21pbm9yICAgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2Jpb3NfbWlub3IpCisjZGVmaW5lIGluX2NvbW1hbmQgICAgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5faW5fY29tbWFuZCkKKyNkZWZpbmUgY3VycmVudF9TQyAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9jdXJyZW50X1NDKQorI2RlZmluZSBjaGlwICAgICAgICAgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2NoaXApCisjZGVmaW5lIGFkYXB0ZXJfbWFzayAgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fYWRhcHRlcl9tYXNrKQorI2RlZmluZSBGSUZPX0NPVU5UICAgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X2ZpZm9fY291bnQpCisjZGVmaW5lIGFkYXB0ZXJfbmFtZSAgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fYWRhcHRlcl9uYW1lKQorI2lmIERFQlVHX1JBQ0UKKyNkZWZpbmUgaW5faW50ZXJydXB0X2ZsYWcgICAgIChIT1NUREFUQShzaHBudCktPl9pbl9pbnRlcnJ1cHRfZmxhZykKKyNlbmRpZgorI2RlZmluZSBTQ1NJX01vZGVfQ250bF9wb3J0ICAgKEhPU1REQVRBKHNocG50KS0+X1NDU0lfTW9kZV9DbnRsX3BvcnQpCisjZGVmaW5lIEZJRk9fRGF0YV9Db3VudF9wb3J0ICAoSE9TVERBVEEoc2hwbnQpLT5fRklGT19EYXRhX0NvdW50X3BvcnQpCisjZGVmaW5lIEludGVycnVwdF9DbnRsX3BvcnQgICAoSE9TVERBVEEoc2hwbnQpLT5fSW50ZXJydXB0X0NudGxfcG9ydCkKKyNkZWZpbmUgSW50ZXJydXB0X1N0YXR1c19wb3J0IChIT1NUREFUQShzaHBudCktPl9JbnRlcnJ1cHRfU3RhdHVzX3BvcnQpCisjZGVmaW5lIEludGVycnVwdF9Db25kX3BvcnQgICAoSE9TVERBVEEoc2hwbnQpLT5fSW50ZXJydXB0X0NvbmRfcG9ydCkKKyNkZWZpbmUgUmVhZF9GSUZPX3BvcnQgICAgICAgIChIT1NUREFUQShzaHBudCktPl9SZWFkX0ZJRk9fcG9ydCkKKyNkZWZpbmUgUmVhZF9TQ1NJX0RhdGFfcG9ydCAgIChIT1NUREFUQShzaHBudCktPl9SZWFkX1NDU0lfRGF0YV9wb3J0KQorI2RlZmluZSBTQ1NJX0NudGxfcG9ydCAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X1NDU0lfQ250bF9wb3J0KQorI2RlZmluZSBTQ1NJX0RhdGFfTm9BQ0tfcG9ydCAgKEhPU1REQVRBKHNocG50KS0+X1NDU0lfRGF0YV9Ob0FDS19wb3J0KQorI2RlZmluZSBTQ1NJX1N0YXR1c19wb3J0ICAgICAgKEhPU1REQVRBKHNocG50KS0+X1NDU0lfU3RhdHVzX3BvcnQpCisjZGVmaW5lIFRNQ19DbnRsX3BvcnQgICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fVE1DX0NudGxfcG9ydCkKKyNkZWZpbmUgVE1DX1N0YXR1c19wb3J0ICAgICAgIChIT1NUREFUQShzaHBudCktPl9UTUNfU3RhdHVzX3BvcnQpCisjZGVmaW5lIFdyaXRlX0ZJRk9fcG9ydCAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fV3JpdGVfRklGT19wb3J0KQorI2RlZmluZSBXcml0ZV9TQ1NJX0RhdGFfcG9ydCAgKEhPU1REQVRBKHNocG50KS0+X1dyaXRlX1NDU0lfRGF0YV9wb3J0KQorI2RlZmluZSBGSUZPX1NpemUgICAgICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X0ZJRk9fU2l6ZSkKKyNkZWZpbmUgQnl0ZXNfUmVhZCAgICAgICAgICAgIChIT1NUREFUQShzaHBudCktPl9CeXRlc19SZWFkKQorI2RlZmluZSBCeXRlc19Xcml0dGVuICAgICAgICAgKEhPU1REQVRBKHNocG50KS0+X0J5dGVzX1dyaXR0ZW4pCisjZGVmaW5lIElOVFJfUHJvY2Vzc2VkICAgICAgICAoSE9TVERBVEEoc2hwbnQpLT5fSU5UUl9Qcm9jZXNzZWQpCisKK3N0cnVjdCBmZF9tY3NfYWRhcHRlcnNfc3RydWN0IHsKKwljaGFyICpuYW1lOworCWludCBpZDsKKwllbnVtIGNoaXBfdHlwZSBmZF9jaGlwOworCWludCBmaWZvX3NpemU7CisJaW50IGZpZm9fY291bnQ7Cit9OworCisjZGVmaW5lIFJFUExZX0lEIDB4NTEzNworCitzdGF0aWMgc3RydWN0IGZkX21jc19hZGFwdGVyc19zdHJ1Y3QgZmRfbWNzX2FkYXB0ZXJzW10gPSB7CisJeyJGdXR1cmUgRG9tYWluIFNDU0kgQWRhcHRlciBNQ1MtNzAwKDE4QzUwKSIsCisJIDB4NjBlOSwKKwkgdG1jMThjNTAsCisJIDB4MjAwMCwKKwkgNH0sCisJeyJGdXR1cmUgRG9tYWluIFNDU0kgQWRhcHRlciBNQ1MtNjAwLzcwMChUTUMtMTgwMCkiLAorCSAweDYxMjcsCisJIHRtYzE4MDAsCisJIDB4MjAwMCwKKwkgNH0sCisJeyJSZXBseSBTb3VuZCBCbGFzdGVyL1NDU0kgQWRhcHRlciIsCisJIFJFUExZX0lELAorCSB0bWMxOGMzMCwKKwkgMHg4MDAsCisJIDJ9LAorfTsKKworI2RlZmluZSBGRF9CUkRTIHNpemVvZihmZF9tY3NfYWRhcHRlcnMpL3NpemVvZihzdHJ1Y3QgZmRfbWNzX2FkYXB0ZXJzX3N0cnVjdCkKKworc3RhdGljIGlycXJldHVybl90IGZkX21jc19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhZGRyZXNzZXNbXSA9IHsgMHhjODAwMCwgMHhjYTAwMCwgMHhjZTAwMCwgMHhkZTAwMCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW10gPSB7IDB4MTQwLCAweDE1MCwgMHgxNjAsIDB4MTcwIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW50ZXJydXB0c1tdID0geyAzLCA1LCAxMCwgMTEsIDEyLCAxNCwgMTUsIDAgfTsKKworLyogaG9zdCBpbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBmb3VuZCA9IDA7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaG9zdHNbRkRfTUFYX0hPU1RTICsgMV0gPSB7IE5VTEwgfTsKKworc3RhdGljIGludCB1c2VyX2ZpZm9fY291bnQgPSAwOworc3RhdGljIGludCB1c2VyX2ZpZm9fc2l6ZSA9IDA7CisKK3N0YXRpYyBpbnQgX19pbml0IGZkX21jc19zZXR1cChjaGFyICpzdHIpCit7CisJc3RhdGljIGludCBkb25lX3NldHVwID0gMDsKKwlpbnQgaW50c1szXTsKKworCWdldF9vcHRpb25zKHN0ciwgMywgaW50cyk7CisJaWYgKGRvbmVfc2V0dXArKyB8fCBpbnRzWzBdIDwgMSB8fCBpbnRzWzBdID4gMiB8fCBpbnRzWzFdIDwgMSB8fCBpbnRzWzFdID4gMTYpIHsKKwkJcHJpbnRrKCJmZF9tY3M6IHVzYWdlOiBmZF9tY3M9RklGT19DT1VOVCwgRklGT19TSVpFXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdXNlcl9maWZvX2NvdW50ID0gaW50c1swXSA+PSAxID8gaW50c1sxXSA6IDA7CisJdXNlcl9maWZvX3NpemUgPSBpbnRzWzBdID49IDIgPyBpbnRzWzJdIDogMDsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZmRfbWNzPSIsIGZkX21jc19zZXR1cCk7CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlwcmludGsoInNjc2klZCA8ZmRfbWNzPjogIiwgc2hwbnQtPmhvc3Rfbm8pOworCisJaWYgKGJpb3NfYmFzZSkgeworCQlwcmludGsoIkJJT1MgYXQgMHglbFgiLCBiaW9zX2Jhc2UpOworCX0gZWxzZSB7CisJCXByaW50aygiTm8gQklPUyIpOworCX0KKworCXByaW50aygiLCBIb3N0SUQgJWQsICVzIENoaXAsIElSUSAlZCwgSU8gMHglbFhcbiIsIHNocG50LT50aGlzX2lkLCBjaGlwID09IHRtYzE4YzUwID8gIlRNQy0xOEM1MCIgOiAoY2hpcCA9PSB0bWMxOGMzMCA/ICJUTUMtMThDMzAiIDogKGNoaXAgPT0gdG1jMTgwMCA/ICJUTUMtMTgwMCIgOiAiVW5rbm93biIpKSwgc2hwbnQtPmlycSwgc2hwbnQtPmlvX3BvcnQpOworfQorCisKK3N0YXRpYyB2b2lkIGRvX3BhdXNlKHVuc2lnbmVkIGFtb3VudCkKK3sJCQkJLyogUGF1c2UgZm9yIGFtb3VudCoxMCBtaWxsaXNlY29uZHMgKi8KKwlkbyB7CisJCW1kZWxheSgxMCk7CisJfSB3aGlsZSAoLS1hbW91bnQpOworfQorCitzdGF0aWMgdm9pZCBmZF9tY3NfbWFrZV9idXNfaWRsZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlvdXRiKDAsIFNDU0lfQ250bF9wb3J0KTsKKwlvdXRiKDAsIFNDU0lfTW9kZV9DbnRsX3BvcnQpOworCWlmIChjaGlwID09IHRtYzE4YzUwIHx8IGNoaXAgPT0gdG1jMThjMzApCisJCW91dGIoMHgyMSB8IFBBUklUWV9NQVNLLCBUTUNfQ250bF9wb3J0KTsJLyogQ2xlYXIgZm9yY2VkIGludHIuICovCisJZWxzZQorCQlvdXRiKDB4MDEgfCBQQVJJVFlfTUFTSywgVE1DX0NudGxfcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgZmRfbWNzX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCWludCBsb29wOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCisJLyogZ2V0IGlkLCBwb3J0LCBiaW9zLCBpcnEgKi8KKwlpbnQgc2xvdDsKKwl1X2NoYXIgcG9zMiwgcG9zMywgcG9zNDsKKwlpbnQgaWQsIHBvcnQsIGlycTsKKwl1bnNpZ25lZCBsb25nIGJpb3M7CisKKwkvKiBpZiBub3QgTUNBIG1hY2hpbmUsIHJldHVybiAqLworCWlmICghTUNBX2J1cykKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGFuZ2VhYmxlPyAqLworCWlkID0gNzsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBGRF9CUkRTOyBsb29wKyspIHsKKwkJc2xvdCA9IDA7CisJCXdoaWxlIChNQ0FfTk9URk9VTkQgIT0gKHNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKGZkX21jc19hZGFwdGVyc1tsb29wXS5pZCwgc2xvdCkpKSB7CisKKwkJCS8qIGlmIHdlIGdldCB0aGlzIGZhciwgYW4gYWRhcHRlciBoYXMgYmVlbiBkZXRlY3RlZCBhbmQgaXMKKwkJCSAgIGVuYWJsZWQgKi8KKworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSAgPGZkX21jcz46ICVzIGF0IHNsb3QgJWRcbiIsIGZkX21jc19hZGFwdGVyc1tsb29wXS5uYW1lLCBzbG90ICsgMSk7CisKKwkJCXBvczIgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCQkJcG9zMyA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMyk7CisJCQlwb3M0ID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KTsKKworCQkJLyogcmVhZHkgZm9yIG5leHQgcHJvYmUgKi8KKwkJCXNsb3QrKzsKKworCQkJaWYgKGZkX21jc19hZGFwdGVyc1tsb29wXS5pZCA9PSBSRVBMWV9JRCkgewkvKiByZXBseSBjYXJkICovCisJCQkJc3RhdGljIGludCByZXBseV9pcnFbXSA9IHsgMTAsIDExLCAxNCwgMTUgfTsKKworCQkJCWJpb3MgPSAwOwkvKiBubyBiaW9zICovCisKKwkJCQlpZiAocG9zMiAmIDB4MikKKwkJCQkJcG9ydCA9IHBvcnRzW3BvczQgJiAweDNdOworCQkJCWVsc2UKKwkJCQkJY29udGludWU7CisKKwkJCQkvKiBjYW4ndCByZWFsbHkgZGlzYWJsZSBpdCwgc2FtZSBhcyBpcnE9MTAgKi8KKwkJCQlpcnEgPSByZXBseV9pcnFbKChwb3M0ID4+IDIpICYgMHgxKSArIDIgKiAoKHBvczQgPj4gNCkgJiAweDEpXTsKKwkJCX0gZWxzZSB7CisJCQkJYmlvcyA9IGFkZHJlc3Nlc1twb3MyID4+IDZdOworCQkJCXBvcnQgPSBwb3J0c1socG9zMiA+PiA0KSAmIDB4MDNdOworCQkJCWlycSA9IGludGVycnVwdHNbKHBvczIgPj4gMSkgJiAweDA3XTsKKwkJCX0KKworCQkJaWYgKGlycSkgeworCQkJCS8qIGNsYWltIHRoZSBzbG90ICovCisJCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCAtIDEsIGZkX21jc19hZGFwdGVyc1tsb29wXS5uYW1lKTsKKworCQkJCS8qIGNoZWNrIGlycS9yZWdpb24gKi8KKwkJCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBmZF9tY3NfaW50ciwgU0FfU0hJUlEsICJmZF9tY3MiLCBob3N0cykpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJmZF9tY3M6IGludGVycnVwdCBpcyBub3QgYXZhaWxhYmxlLCBza2lwcGluZy4uLlxuIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8qIHJlcXVlc3QgSS9PIHJlZ2lvbiAqLworCQkJCWlmIChyZXF1ZXN0X3JlZ2lvbihwb3J0LCAweDEwLCAiZmRfbWNzIikpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJmZF9tY3M6IEkvTyByZWdpb24gaXMgYWxyZWFkeSBpbiB1c2UsIHNraXBwaW5nLi4uXG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIHJlZ2lzdGVyICovCisJCQkJaWYgKCEoc2hwbnQgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgZmRfaG9zdGRhdGEpKSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJmZF9tY3M6IHNjc2lfcmVnaXN0ZXIoKSBmYWlsZWRcbiIpOworCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAweDEwKTsKKwkJCQkJZnJlZV9pcnEoaXJxLCBob3N0cyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCisJCQkJLyogc2F2ZSBuYW1lICovCisJCQkJc3RyY3B5KGFkYXB0ZXJfbmFtZSwgZmRfbWNzX2FkYXB0ZXJzW2xvb3BdLm5hbWUpOworCisJCQkJLyogY2hpcC9maWZvICovCisJCQkJY2hpcCA9IGZkX21jc19hZGFwdGVyc1tsb29wXS5mZF9jaGlwOworCQkJCS8qIHVzZSBib290IHRpbWUgdmFsdWUgaWYgYXZhaWxhYmxlICovCisJCQkJRklGT19DT1VOVCA9IHVzZXJfZmlmb19jb3VudCA/IHVzZXJfZmlmb19jb3VudCA6IGZkX21jc19hZGFwdGVyc1tsb29wXS5maWZvX2NvdW50OworCQkJCUZJRk9fU2l6ZSA9IHVzZXJfZmlmb19zaXplID8gdXNlcl9maWZvX3NpemUgOiBmZF9tY3NfYWRhcHRlcnNbbG9vcF0uZmlmb19zaXplOworCisvKiBGSVhNRTogRG8gd2UgbmVlZCB0byBrZWVwIHRoaXMgYml0IG9mIGNvZGUgaW5zaWRlIE5PVF9VU0VEIGFyb3VuZCBhdCBhbGw/ICovCisjaWZkZWYgTk9UX1VTRUQKKwkJCQkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkJCQkvKiBUcnkgdG8gdG9nZ2xlIDMyLWJpdCBtb2RlLiAgVGhpcyBvbmx5CisJCQkJICAgd29ya3Mgb24gYW4gMThjMzAgY2hpcC4gIChVc2VyIHJlcG9ydHMKKwkJCQkgICBzYXkgdGhpcyB3b3Jrcywgc28gd2Ugc2hvdWxkIHN3aXRjaCB0bworCQkJCSAgIGl0IGluIHRoZSBuZWFyIGZ1dHVyZS4pICovCisJCQkJb3V0YigweDgwLCBwb3J0ICsgSU9fQ29udHJvbCk7CisJCQkJaWYgKChpbmIocG9ydCArIENvbmZpZ3VyYXRpb24yKSAmIDB4ODApID09IDB4ODApIHsKKwkJCQkJb3V0YigweDAwLCBwb3J0ICsgSU9fQ29udHJvbCk7CisJCQkJCWlmICgoaW5iKHBvcnQgKyBDb25maWd1cmF0aW9uMikgJiAweDgwKSA9PSAweDAwKSB7CisJCQkJCQljaGlwID0gdG1jMThjMzA7CisJCQkJCQlGSUZPX1NpemUgPSAweDgwMDsJLyogMmsgRklGTyAqLworCisJCQkJCQlwcmludGsoIkZJUlNUOiBjaGlwPSVzLCBmaWZvX3NpemU9MHgleFxuIiwgKGNoaXAgPT0gdG1jMThjMzApID8gInRtYzE4YzMwIiA6ICJ0bWMxOGM1MCIsIEZJRk9fU2l6ZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBUaGF0IHNob3VsZCBoYXZlIHdvcmtlZCwgYnV0IGFwcGVhcnMgdG8KKwkJCQkgICBoYXZlIHByb2JsZW1zLiAgTGV0J3MgYXNzdW1lIGl0IGlzIGFuCisJCQkJICAgMThjMzAgaWYgdGhlIFJBTSBpcyBkaXNhYmxlZC4gKi8KKworCQkJCWlmIChpbmIocG9ydCArIENvbmZpZ3VyYXRpb24yKSAmIDB4MDIpIHsKKwkJCQkJY2hpcCA9IHRtYzE4YzMwOworCQkJCQlGSUZPX1NpemUgPSAweDgwMDsJLyogMmsgRklGTyAqLworCisJCQkJCXByaW50aygiU0VDT05EOiBjaGlwPSVzLCBmaWZvX3NpemU9MHgleFxuIiwgKGNoaXAgPT0gdG1jMThjMzApID8gInRtYzE4YzMwIiA6ICJ0bWMxOGM1MCIsIEZJRk9fU2l6ZSk7CisJCQkJfQorCQkJCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2VuZGlmCisKKwkJCQkvKiBJQk0vQU5TSSBzY3NpIHNjYW4gb3JkZXJpbmcgKi8KKwkJCQkvKiBTdGljayB0aGlzIGJhY2sgaW4gd2hlbiB0aGUgc2NzaS5jIGNoYW5nZXMgYXJlIHRoZXJlICovCisJCQkJc2hwbnQtPnJldmVyc2Vfb3JkZXJpbmcgPSAxOworCisKKwkJCQkvKiBzYXZpbmcgaW5mbyAqLworCQkJCWhvc3RzW2ZvdW5kKytdID0gc2hwbnQ7CisKKwkJCQlzaHBudC0+dGhpc19pZCA9IGlkOworCQkJCXNocG50LT5pcnEgPSBpcnE7CisJCQkJc2hwbnQtPmlvX3BvcnQgPSBwb3J0OworCQkJCXNocG50LT5uX2lvX3BvcnQgPSAweDEwOworCisJCQkJLyogc2F2ZSAqLworCQkJCWJpb3NfYmFzZSA9IGJpb3M7CisJCQkJYWRhcHRlcl9tYXNrID0gKDEgPDwgaWQpOworCisJCQkJLyogc2F2ZSBtb3JlICovCisJCQkJU0NTSV9Nb2RlX0NudGxfcG9ydCA9IHBvcnQgKyBTQ1NJX01vZGVfQ250bDsKKwkJCQlGSUZPX0RhdGFfQ291bnRfcG9ydCA9IHBvcnQgKyBGSUZPX0RhdGFfQ291bnQ7CisJCQkJSW50ZXJydXB0X0NudGxfcG9ydCA9IHBvcnQgKyBJbnRlcnJ1cHRfQ250bDsKKwkJCQlJbnRlcnJ1cHRfU3RhdHVzX3BvcnQgPSBwb3J0ICsgSW50ZXJydXB0X1N0YXR1czsKKwkJCQlJbnRlcnJ1cHRfQ29uZF9wb3J0ID0gcG9ydCArIEludGVycnVwdF9Db25kOworCQkJCVJlYWRfRklGT19wb3J0ID0gcG9ydCArIFJlYWRfRklGTzsKKwkJCQlSZWFkX1NDU0lfRGF0YV9wb3J0ID0gcG9ydCArIFJlYWRfU0NTSV9EYXRhOworCQkJCVNDU0lfQ250bF9wb3J0ID0gcG9ydCArIFNDU0lfQ250bDsKKwkJCQlTQ1NJX0RhdGFfTm9BQ0tfcG9ydCA9IHBvcnQgKyBTQ1NJX0RhdGFfTm9BQ0s7CisJCQkJU0NTSV9TdGF0dXNfcG9ydCA9IHBvcnQgKyBTQ1NJX1N0YXR1czsKKwkJCQlUTUNfQ250bF9wb3J0ID0gcG9ydCArIFRNQ19DbnRsOworCQkJCVRNQ19TdGF0dXNfcG9ydCA9IHBvcnQgKyBUTUNfU3RhdHVzOworCQkJCVdyaXRlX0ZJRk9fcG9ydCA9IHBvcnQgKyBXcml0ZV9GSUZPOworCQkJCVdyaXRlX1NDU0lfRGF0YV9wb3J0ID0gcG9ydCArIFdyaXRlX1NDU0lfRGF0YTsKKworCQkJCUJ5dGVzX1JlYWQgPSAwOworCQkJCUJ5dGVzX1dyaXR0ZW4gPSAwOworCQkJCUlOVFJfUHJvY2Vzc2VkID0gMDsKKworCQkJCS8qIHNheSBzb21ldGhpbmcgKi8KKwkJCQlwcmludF9iYW5uZXIoc2hwbnQpOworCisJCQkJLyogcmVzZXQgKi8KKwkJCQlvdXRiKDEsIFNDU0lfQ250bF9wb3J0KTsKKwkJCQlkb19wYXVzZSgyKTsKKwkJCQlvdXRiKDAsIFNDU0lfQ250bF9wb3J0KTsKKwkJCQlkb19wYXVzZSgxMTUpOworCQkJCW91dGIoMCwgU0NTSV9Nb2RlX0NudGxfcG9ydCk7CisJCQkJb3V0YihQQVJJVFlfTUFTSywgVE1DX0NudGxfcG9ydCk7CisJCQkJLyogZG9uZSByZXNldCAqLworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kID09IEZEX01BWF9IT1NUUykgeworCQkJcHJpbnRrKCJmZF9tY3M6IGRldGVjdGluZyByZWFjaGVkIG1heD0lZCBob3N0IGFkYXB0ZXJzLlxuIiwgRkRfTUFYX0hPU1RTKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmRfbWNzX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJcmV0dXJuIGFkYXB0ZXJfbmFtZTsKK30KKworc3RhdGljIGludCBUT1RBTF9JTlRSID0gMDsKKworLyoKKyAqIGlub3V0IDogZGVjaWRlcyBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBkYXRhZmxvdyBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIAorICogICAgICAgICB2YXJpYWJsZXMKKyAqIGJ1ZmZlcjogSWYgaW5vdXQ9PUZBTFNFIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBpdCBlbHNlIHJlYWQgZnJvbSBpdAorICogKnN0YXJ0OiBJZiBpbm91dD09RkFMU0Ugc3RhcnQgb2YgdGhlIHZhbGlkIGRhdGEgaW4gdGhlIGJ1ZmZlcgorICogb2Zmc2V0OiBJZiBpbm91dD09RkFMU0Ugb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1hZ2luYXJ5IGZpbGUgCisgKiAgICAgICAgIGZyb20gd2hpY2ggd2Ugc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBidWZmZXIKKyAqIGxlbmd0aDogSWYgaW5vdXQ9PUZBTFNFIG1heCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIgCisgKiAgICAgICAgIGVsc2UgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGludCBmZF9tY3NfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJaW50IGxlbiA9IDA7CisKKwlpZiAoaW5vdXQpCisJCXJldHVybiAoLUVOT1NZUyk7CisKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJGdXR1cmUgRG9tYWluIE1DUy02MDAvNzAwIERyaXZlciAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIkhPU1QgIyVkOiAlc1xuIiwgc2hwbnQtPmhvc3Rfbm8sIGFkYXB0ZXJfbmFtZSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiRklGTyBTaXplPTB4JXgsIEZJRk8gQ291bnQ9JWRcbiIsIEZJRk9fU2l6ZSwgRklGT19DT1VOVCk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiRHJpdmVyQ2FsbHM9JWQsIEludGVycnVwdHM9JWQsIEJ5dGVzUmVhZD0lZCwgQnl0ZXNXcml0ZT0lZFxuXG4iLCBUT1RBTF9JTlRSLCBJTlRSX1Byb2Nlc3NlZCwgQnl0ZXNfUmVhZCwgQnl0ZXNfV3JpdHRlbik7CisKKwlpZiAoKGxlbiAtPSBvZmZzZXQpIDw9IDApCisJCXJldHVybiAwOworCWlmIChsZW4gPiBsZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGZkX21jc19zZWxlY3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGludCB0YXJnZXQpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlvdXRiKDB4ODIsIFNDU0lfQ250bF9wb3J0KTsJLyogQnVzIEVuYWJsZSArIFNlbGVjdCAqLworCW91dGIoYWRhcHRlcl9tYXNrIHwgKDEgPDwgdGFyZ2V0KSwgU0NTSV9EYXRhX05vQUNLX3BvcnQpOworCisJLyogU3RvcCBhcmJpdHJhdGlvbiBhbmQgZW5hYmxlIHBhcml0eSAqLworCW91dGIoUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCisJdGltZW91dCA9IDM1MDsJCS8qIDM1MG1TIC0tIGJlY2F1c2Ugb2YgdGltZW91dHMKKwkJCQkgICAod2FzIDI1MG1TKSAqLworCisJZG8geworCQlzdGF0dXMgPSBpbmIoU0NTSV9TdGF0dXNfcG9ydCk7CS8qIFJlYWQgYWRhcHRlciBzdGF0dXMgKi8KKwkJaWYgKHN0YXR1cyAmIDEpIHsJLyogQnVzeSBhc3NlcnRlZCAqLworCQkJLyogRW5hYmxlIFNDU0kgQnVzIChvbiBlcnJvciwgc2hvdWxkIG1ha2UgYnVzIGlkbGUgd2l0aCAwKSAqLworCQkJb3V0YigweDgwLCBTQ1NJX0NudGxfcG9ydCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1ZGVsYXkoMTAwMCk7CS8qIHdhaXQgb25lIG1zZWMgKi8KKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJLyogTWFrZSBidXMgaWRsZSAqLworCWZkX21jc19tYWtlX2J1c19pZGxlKHNocG50KTsKKyNpZiBFVkVSWV9BQ0NFU1MKKwlpZiAoIXRhcmdldCkKKwkJcHJpbnRrKCJTZWxlY3Rpb24gZmFpbGVkXG4iKTsKKyNlbmRpZgorI2lmIEVSUk9SU19PTkxZCisJaWYgKCF0YXJnZXQpIHsKKwkJc3RhdGljIGludCBmbGFnID0gMDsKKworCQlpZiAoIWZsYWcpCS8qIFNraXAgZmlyc3QgZmFpbHVyZSBmb3IgYWxsIGNoaXBzLiAqLworCQkJKytmbGFnOworCQllbHNlCisJCQlwcmludGsoImZkX21jczogU2VsZWN0aW9uIGZhaWxlZFxuIik7CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG15X2RvbmUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGludCBlcnJvcikKK3sKKwlpZiAoaW5fY29tbWFuZCkgeworCQlpbl9jb21tYW5kID0gMDsKKwkJb3V0YigweDAwLCBJbnRlcnJ1cHRfQ250bF9wb3J0KTsKKwkJZmRfbWNzX21ha2VfYnVzX2lkbGUoc2hwbnQpOworCQljdXJyZW50X1NDLT5yZXN1bHQgPSBlcnJvcjsKKwkJY3VycmVudF9TQy0+c2NzaV9kb25lKGN1cnJlbnRfU0MpOworCX0gZWxzZSB7CisJCXBhbmljKCJmZF9tY3M6IG15X2RvbmUoKSBjYWxsZWQgb3V0c2lkZSBvZiBjb21tYW5kXG4iKTsKKwl9CisjaWYgREVCVUdfUkFDRQorCWluX2ludGVycnVwdF9mbGFnID0gMDsKKyNlbmRpZgorfQorCisvKiBvbmx5IG15X2RvbmUgbmVlZHMgdG8gYmUgcHJvdGVjdGVkICAqLworc3RhdGljIGlycXJldHVybl90IGZkX21jc19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzOworCWludCBkb25lID0gMDsKKwl1bnNpZ25lZCBkYXRhX2NvdW50LCB0bXBfY291bnQ7CisKKwlpbnQgaSA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CisKKwlUT1RBTF9JTlRSKys7CisKKwkvKiBzZWFyY2ggZm9yIG9uZSBhZGFwdGVyLXJlc3BvbnNlIG9uIHNoYXJlZCBpbnRlcnJ1cHQgKi8KKwl3aGlsZSAoKHNocG50ID0gaG9zdHNbaSsrXSkpIHsKKwkJaWYgKChpbmIoVE1DX1N0YXR1c19wb3J0KSkgJiAxKQorCQkJYnJlYWs7CisJfQorCisJLyogcmV0dXJuIGlmIHNvbWUgb3RoZXIgZGV2aWNlIG9uIHRoaXMgSVJRIGNhdXNlZCB0aGUgaW50ZXJydXB0ICovCisJaWYgKCFzaHBudCkgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJSU5UUl9Qcm9jZXNzZWQrKzsKKworCW91dGIoMHgwMCwgSW50ZXJydXB0X0NudGxfcG9ydCk7CisKKwkvKiBBYm9ydCBjYWxscyBteV9kb25lLCBzbyB3ZSBkbyBub3RoaW5nIGhlcmUuICovCisJaWYgKGN1cnJlbnRfU0MtPlNDcC5waGFzZSAmIGFib3J0ZWQpIHsKKyNpZiBERUJVR19BQk9SVAorCQlwcmludGsoIkludGVycnVwdCBhZnRlciBhYm9ydCwgaWdub3JpbmdcbiIpOworI2VuZGlmCisJCS8qIHJldHVybiBJUlFfSEFORExFRDsgKi8KKwl9CisjaWYgREVCVUdfUkFDRQorCSsraW5faW50ZXJydXB0X2ZsYWc7CisjZW5kaWYKKworCWlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBpbl9hcmJpdHJhdGlvbikgeworCQlzdGF0dXMgPSBpbmIoVE1DX1N0YXR1c19wb3J0KTsJLyogUmVhZCBhZGFwdGVyIHN0YXR1cyAqLworCQlpZiAoIShzdGF0dXMgJiAweDAyKSkgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJcHJpbnRrKCIgQUZBSUwgIik7CisjZW5kaWYKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCW15X2RvbmUoc2hwbnQsIERJRF9CVVNfQlVTWSA8PCAxNik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpbl9zZWxlY3Rpb247CisKKwkJb3V0YigweDQwIHwgRklGT19DT1VOVCwgSW50ZXJydXB0X0NudGxfcG9ydCk7CisKKwkJb3V0YigweDgyLCBTQ1NJX0NudGxfcG9ydCk7CS8qIEJ1cyBFbmFibGUgKyBTZWxlY3QgKi8KKwkJb3V0YihhZGFwdGVyX21hc2sgfCAoMSA8PCBjdXJyZW50X1NDLT5kZXZpY2UtPmlkKSwgU0NTSV9EYXRhX05vQUNLX3BvcnQpOworCisJCS8qIFN0b3AgYXJiaXRyYXRpb24gYW5kIGVuYWJsZSBwYXJpdHkgKi8KKwkJb3V0YigweDEwIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworI2lmIERFQlVHX1JBQ0UKKwkJaW5faW50ZXJydXB0X2ZsYWcgPSAwOworI2VuZGlmCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKGN1cnJlbnRfU0MtPlNDcC5waGFzZSAmIGluX3NlbGVjdGlvbikgeworCQlzdGF0dXMgPSBpbmIoU0NTSV9TdGF0dXNfcG9ydCk7CisJCWlmICghKHN0YXR1cyAmIDB4MDEpKSB7CisJCQkvKiBUcnkgYWdhaW4sIGZvciBzbG93IGRldmljZXMgKi8KKwkJCWlmIChmZF9tY3Nfc2VsZWN0KHNocG50LCBjdXJyZW50X1NDLT5kZXZpY2UtPmlkKSkgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJCXByaW50aygiIFNGQUlMICIpOworI2VuZGlmCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJCW15X2RvbmUoc2hwbnQsIERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9IGVsc2UgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJCXByaW50aygiIEFsdFNlbCAiKTsKKyNlbmRpZgorCQkJCS8qIFN0b3AgYXJiaXRyYXRpb24gYW5kIGVuYWJsZSBwYXJpdHkgKi8KKwkJCQlvdXRiKDB4MTAgfCBQQVJJVFlfTUFTSywgVE1DX0NudGxfcG9ydCk7CisJCQl9CisJCX0KKwkJY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaW5fb3RoZXI7CisJCW91dGIoMHg5MCB8IEZJRk9fQ09VTlQsIEludGVycnVwdF9DbnRsX3BvcnQpOworCQlvdXRiKDB4ODAsIFNDU0lfQ250bF9wb3J0KTsKKyNpZiBERUJVR19SQUNFCisJCWluX2ludGVycnVwdF9mbGFnID0gMDsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogY3VycmVudF9TQy0+U0NwLnBoYXNlID09IGluX290aGVyOiB0aGlzIGlzIHRoZSBib2R5IG9mIHRoZSByb3V0aW5lICovCisKKwlzdGF0dXMgPSBpbmIoU0NTSV9TdGF0dXNfcG9ydCk7CisKKwlpZiAoc3RhdHVzICYgMHgxMCkgewkvKiBSRVEgKi8KKworCQlzd2l0Y2ggKHN0YXR1cyAmIDB4MGUpIHsKKworCQljYXNlIDB4MDg6CS8qIENPTU1BTkQgT1VUICovCisJCQlvdXRiKGN1cnJlbnRfU0MtPmNtbmRbY3VycmVudF9TQy0+U0NwLnNlbnRfY29tbWFuZCsrXSwgV3JpdGVfU0NTSV9EYXRhX3BvcnQpOworI2lmIEVWRVJZX0FDQ0VTUworCQkJcHJpbnRrKCJDTUQgPSAleCwiLCBjdXJyZW50X1NDLT5jbW5kW2N1cnJlbnRfU0MtPlNDcC5zZW50X2NvbW1hbmQgLSAxXSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIDB4MDA6CS8qIERBVEEgT1VUIC0tIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKwkJCWlmIChjaGlwICE9IHRtYzE4MDAgJiYgIWN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4pIHsKKwkJCQljdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luID0gLTE7CisJCQkJb3V0YigweGQwIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoJLyogREFUQSBJTiAtLSB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisJCQlpZiAoY2hpcCAhPSB0bWMxODAwICYmICFjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luKSB7CisJCQkJY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IDE7CisJCQkJb3V0YigweDkwIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwYzoJLyogU1RBVFVTIElOICovCisJCQljdXJyZW50X1NDLT5TQ3AuU3RhdHVzID0gaW5iKFJlYWRfU0NTSV9EYXRhX3BvcnQpOworI2lmIEVWRVJZX0FDQ0VTUworCQkJcHJpbnRrKCJTdGF0dXMgPSAleCwgIiwgY3VycmVudF9TQy0+U0NwLlN0YXR1cyk7CisjZW5kaWYKKyNpZiBFUlJPUlNfT05MWQorCQkJaWYgKGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgJiYgY3VycmVudF9TQy0+U0NwLlN0YXR1cyAhPSAyICYmIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgIT0gOCkgeworCQkJCXByaW50aygiRVJST1IgZmRfbWNzOiB0YXJnZXQgPSAlZCwgY29tbWFuZCA9ICV4LCBzdGF0dXMgPSAleFxuIiwgY3VycmVudF9TQy0+ZGV2aWNlLT5pZCwgY3VycmVudF9TQy0+Y21uZFswXSwgY3VycmVudF9TQy0+U0NwLlN0YXR1cyk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIDB4MGE6CS8qIE1FU1NBR0UgT1VUICovCisJCQlvdXRiKE1FU1NBR0VfUkVKRUNULCBXcml0ZV9TQ1NJX0RhdGFfcG9ydCk7CS8qIFJlamVjdCAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwZToJLyogTUVTU0FHRSBJTiAqLworCQkJY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UgPSBpbmIoUmVhZF9TQ1NJX0RhdGFfcG9ydCk7CisjaWYgRVZFUllfQUNDRVNTCisJCQlwcmludGsoIk1lc3NhZ2UgPSAleCwgIiwgY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UpOworI2VuZGlmCisJCQlpZiAoIWN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlKQorCQkJCSsrZG9uZTsKKyNpZiBERUJVR19NRVNTQUdFUyB8fCBFVkVSWV9BQ0NFU1MKKwkJCWlmIChjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSkgeworCQkJCXByaW50aygiZmRfbWNzOiBtZXNzYWdlID0gJXhcbiIsIGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2hpcCA9PSB0bWMxODAwICYmICFjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luICYmIChjdXJyZW50X1NDLT5TQ3Auc2VudF9jb21tYW5kID49IGN1cnJlbnRfU0MtPmNtZF9sZW4pKSB7CisJCS8qIFdlIGhhdmUgdG8gZ2V0IHRoZSBGSUZPIGRpcmVjdGlvbgorCQkgICBjb3JyZWN0LCBzbyBJJ3ZlIG1hZGUgYSB0YWJsZSBiYXNlZAorCQkgICBvbiB0aGUgU0NTSSBTdGFuZGFyZCBvZiB3aGljaCBjb21tYW5kcworCQkgICBhcHBlYXIgdG8gcmVxdWlyZSBhIERBVEEgT1VUIHBoYXNlLgorCQkgKi8KKwkJLyoKKwkJICAgcC4gOTQ6IENvbW1hbmQgZm9yIGFsbCBkZXZpY2UgdHlwZXMKKwkJICAgQ0hBTkdFIERFRklOSVRJT04gICAgICAgICAgICA0MCBEQVRBIE9VVAorCQkgICBDT01QQVJFICAgICAgICAgICAgICAgICAgICAgIDM5IERBVEEgT1VUCisJCSAgIENPUFkgICAgICAgICAgICAgICAgICAgICAgICAgMTggREFUQSBPVVQKKwkJICAgQ09QWSBBTkQgVkVSSUZZICAgICAgICAgICAgICAzYSBEQVRBIE9VVAorCQkgICBJTlFVSVJZICAgICAgICAgICAgICAgICAgICAgIDEyIAorCQkgICBMT0cgU0VMRUNUICAgICAgICAgICAgICAgICAgIDRjIERBVEEgT1VUCisJCSAgIExPRyBTRU5TRSAgICAgICAgICAgICAgICAgICAgNGQKKwkJICAgTU9ERSBTRUxFQ1QgKDYpICAgICAgICAgICAgICAxNSBEQVRBIE9VVAorCQkgICBNT0RFIFNFTEVDVCAoMTApICAgICAgICAgICAgIDU1IERBVEEgT1VUCisJCSAgIE1PREUgU0VOU0UgKDYpICAgICAgICAgICAgICAgMWEKKwkJICAgTU9ERSBTRU5TRSAoMTApICAgICAgICAgICAgICA1YQorCQkgICBSRUFEIEJVRkZFUiAgICAgICAgICAgICAgICAgIDNjCisJCSAgIFJFQ0VJVkUgRElBR05PU1RJQyBSRVNVTFRTICAgMWMKKwkJICAgUkVRVUVTVCBTRU5TRSAgICAgICAgICAgICAgICAwMworCQkgICBTRU5EIERJQUdOT1NUSUMgICAgICAgICAgICAgIDFkIERBVEEgT1VUCisJCSAgIFRFU1QgVU5JVCBSRUFEWSAgICAgICAgICAgICAgMDAKKwkJICAgV1JJVEUgQlVGRkVSICAgICAgICAgICAgICAgICAzYiBEQVRBIE9VVAorCisJCSAgIHAuMTc4OiBDb21tYW5kcyBmb3IgZGlyZWN0LWFjY2VzcyBkZXZpY2VzIChub3QgbGlzdGVkIG9uIHAuIDk0KQorCQkgICBGT1JNQVQgVU5JVCAgICAgICAgICAgICAgICAgIDA0IERBVEEgT1VUCisJCSAgIExPQ0stVU5MT0NLIENBQ0hFICAgICAgICAgICAgMzYKKwkJICAgUFJFLUZFVENIICAgICAgICAgICAgICAgICAgICAzNAorCQkgICBQUkVWRU5ULUFMTE9XIE1FRElVTSBSRU1PVkFMIDFlCisJCSAgIFJFQUQgKDYpL1JFQ0VJVkUgICAgICAgICAgICAgMDgKKwkJICAgUkVBRCAoMTApICAgICAgICAgICAgICAgICAgICAzYworCQkgICBSRUFEIENBUEFDSVRZICAgICAgICAgICAgICAgIDI1CisJCSAgIFJFQUQgREVGRUNUIERBVEEgKDEwKSAgICAgICAgMzcKKwkJICAgUkVBRCBMT05HICAgICAgICAgICAgICAgICAgICAzZQorCQkgICBSRUFTU0lHTiBCTE9DS1MgICAgICAgICAgICAgIDA3IERBVEEgT1VUCisJCSAgIFJFTEVBU0UgICAgICAgICAgICAgICAgICAgICAgMTcKKwkJICAgUkVTRVJWRSAgICAgICAgICAgICAgICAgICAgICAxNiBEQVRBIE9VVAorCQkgICBSRVpFUk8gVU5JVC9SRVdJTkQgICAgICAgICAgIDAxCisJCSAgIFNFQVJDSCBEQVRBIEVRVUFMICgxMCkgICAgICAgMzEgREFUQSBPVVQKKwkJICAgU0VBUkNIIERBVEEgSElHSCAoMTApICAgICAgICAzMCBEQVRBIE9VVAorCQkgICBTRUFSQ0ggREFUQSBMT1cgKDEwKSAgICAgICAgIDMyIERBVEEgT1VUCisJCSAgIFNFRUsgKDYpICAgICAgICAgICAgICAgICAgICAgMGIKKwkJICAgU0VFSyAoMTApICAgICAgICAgICAgICAgICAgICAyYgorCQkgICBTRVQgTElNSVRTICgxMCkgICAgICAgICAgICAgIDMzCisJCSAgIFNUQVJUIFNUT1AgVU5JVCAgICAgICAgICAgICAgMWIKKwkJICAgU1lOQ0hST05JWkUgQ0FDSEUgICAgICAgICAgICAzNQorCQkgICBWRVJJRlkgKDEwKSAgICAgICAgICAgICAgICAgIDJmCisJCSAgIFdSSVRFICg2KS9QUklOVC9TRU5EICAgICAgICAgMGEgREFUQSBPVVQKKwkJICAgV1JJVEUgKDEwKS9TRU5EICAgICAgICAgICAgICAyYSBEQVRBIE9VVAorCQkgICBXUklURSBBTkQgVkVSSUZZICgxMCkgICAgICAgIDJlIERBVEEgT1VUCisJCSAgIFdSSVRFIExPTkcgICAgICAgICAgICAgICAgICAgM2YgREFUQSBPVVQKKwkJICAgV1JJVEUgU0FNRSAgICAgICAgICAgICAgICAgICA0MSBEQVRBIE9VVCA/CisKKwkJICAgcC4gMjYxOiBDb21tYW5kcyBmb3Igc2VxdWVudGlhbC1hY2Nlc3MgZGV2aWNlcyAobm90IHByZXZpb3VzbHkgbGlzdGVkKQorCQkgICBFUkFTRSAgICAgICAgICAgICAgICAgICAgICAgIDE5CisJCSAgIExPQUQgVU5MT0FEICAgICAgICAgICAgICAgICAgMWIKKwkJICAgTE9DQVRFICAgICAgICAgICAgICAgICAgICAgICAyYgorCQkgICBSRUFEIEJMT0NLIExJTUlUUyAgICAgICAgICAgIDA1CisJCSAgIFJFQUQgUE9TSVRJT04gICAgICAgICAgICAgICAgMzQKKwkJICAgUkVBRCBSRVZFUlNFICAgICAgICAgICAgICAgICAwZgorCQkgICBSRUNPVkVSIEJVRkZFUkVEIERBVEEgICAgICAgIDE0CisJCSAgIFNQQUNFICAgICAgICAgICAgICAgICAgICAgICAgMTEKKwkJICAgV1JJVEUgRklMRU1BUktTICAgICAgICAgICAgICAxMCA/CisKKwkJICAgcC4gMjk4OiBDb21tYW5kcyBmb3IgcHJpbnRlciBkZXZpY2VzIChub3QgcHJldmlvdXNseSBsaXN0ZWQpCisJCSAgICoqKioqKiBOT1QgU1VQUE9SVEVEIEJZIFRISVMgRFJJVkVSLCBzaW5jZSAwYiBpcyBTRUVLICg2KSAqKioqKgorCQkgICBTTEVXIEFORCBQUklOVCAgICAgICAgICAgICAgIDBiIERBVEEgT1VUICAtLSBzYW1lIGFzIHNlZWsKKwkJICAgU1RPUCBQUklOVCAgICAgICAgICAgICAgICAgICAxYgorCQkgICBTWU5DSFJPTklaRSBCVUZGRVIgICAgICAgICAgIDEwCisKKwkJICAgcC4gMzE1OiBDb21tYW5kcyBmb3IgcHJvY2Vzc29yIGRldmljZXMgKG5vdCBwcmV2aW91c2x5IGxpc3RlZCkKKworCQkgICBwLiAzMjE6IENvbW1hbmRzIGZvciB3cml0ZS1vbmNlIGRldmljZXMgKG5vdCBwcmV2aW91c2x5IGxpc3RlZCkKKwkJICAgTUVESVVNIFNDQU4gICAgICAgICAgICAgICAgICAzOAorCQkgICBSRUFEICgxMikgICAgICAgICAgICAgICAgICAgIGE4CisJCSAgIFNFQVJDSCBEQVRBIEVRVUFMICgxMikgICAgICAgYjEgREFUQSBPVVQKKwkJICAgU0VBUkNIIERBVEEgSElHSCAoMTIpICAgICAgICBiMCBEQVRBIE9VVAorCQkgICBTRUFSQ0ggREFUQSBMT1cgKDEyKSAgICAgICAgIGIyIERBVEEgT1VUCisJCSAgIFNFVCBMSU1JVFMgKDEyKSAgICAgICAgICAgICAgYjMKKwkJICAgVkVSSUZZICgxMikgICAgICAgICAgICAgICAgICBhZgorCQkgICBXUklURSAoMTIpICAgICAgICAgICAgICAgICAgIGFhIERBVEEgT1VUCisJCSAgIFdSSVRFIEFORCBWRVJJRlkgKDEyKSAgICAgICAgYWUgREFUQSBPVVQKKworCQkgICBwLiAzMzI6IENvbW1hbmRzIGZvciBDRC1ST00gZGV2aWNlcyAobm90IHByZXZpb3VzbHkgbGlzdGVkKQorCQkgICBQQVVTRS9SRVNVTUUgICAgICAgICAgICAgICAgIDRiCisJCSAgIFBMQVkgQVVESU8gKDEwKSAgICAgICAgICAgICAgNDUKKwkJICAgUExBWSBBVURJTyAoMTIpICAgICAgICAgICAgICBhNQorCQkgICBQTEFZIEFVRElPIE1TRiAgICAgICAgICAgICAgIDQ3CisJCSAgIFBMQVkgVFJBQ0sgUkVMQVRJVkUgKDEwKSAgICAgNDkKKwkJICAgUExBWSBUUkFDSyBSRUxBVElWRSAoMTIpICAgICBhOQorCQkgICBSRUFEIEhFQURFUiAgICAgICAgICAgICAgICAgIDQ0CisJCSAgIFJFQUQgU1VCLUNIQU5ORUwgICAgICAgICAgICAgNDIKKwkJICAgUkVBRCBUT0MgICAgICAgICAgICAgICAgICAgICA0MworCisJCSAgIHAuIDM3MDogQ29tbWFuZHMgZm9yIHNjYW5uZXIgZGV2aWNlcyAobm90IHByZXZpb3VzbHkgbGlzdGVkKQorCQkgICBHRVQgREFUQSBCVUZGRVIgU1RBVFVTICAgICAgIDM0CisJCSAgIEdFVCBXSU5ET1cgICAgICAgICAgICAgICAgICAgMjUKKwkJICAgT0JKRUNUIFBPU0lUSU9OICAgICAgICAgICAgICAzMQorCQkgICBTQ0FOICAgICAgICAgICAgICAgICAgICAgICAgIDFiCisJCSAgIFNFVCBXSU5ET1cgICAgICAgICAgICAgICAgICAgMjQgREFUQSBPVVQKKworCQkgICBwLiAzOTE6IENvbW1hbmRzIGZvciBvcHRpY2FsIG1lbW9yeSBkZXZpY2VzIChub3QgbGlzdGVkKQorCQkgICBFUkFTRSAoMTApICAgICAgICAgICAgICAgICAgIDJjCisJCSAgIEVSQVNFICgxMikgICAgICAgICAgICAgICAgICAgYWMKKwkJICAgTUVESVVNIFNDQU4gICAgICAgICAgICAgICAgICAzOCBEQVRBIE9VVAorCQkgICBSRUFEIERFRkVDVCBEQVRBICgxMikgICAgICAgIGI3CisJCSAgIFJFQUQgR0VORVJBVElPTiAgICAgICAgICAgICAgMjkKKwkJICAgUkVBRCBVUERBVEVEIEJMT0NLICAgICAgICAgICAyZAorCQkgICBVUERBVEUgQkxPQ0sgICAgICAgICAgICAgICAgIDNkIERBVEEgT1VUCisKKwkJICAgcC4gNDE5OiBDb21tYW5kcyBmb3IgbWVkaXVtIGNoYW5nZXIgZGV2aWNlcyAobm90IGxpc3RlZCkKKwkJICAgRVhDSEFOR0UgTUVESVVNICAgICAgICAgICAgICA0NgorCQkgICBJTklUSUFMSVpFIEVMRU1FTlQgU1RBVFVTICAgIDA3CisJCSAgIE1PVkUgTUVESVVNICAgICAgICAgICAgICAgICAgYTUKKwkJICAgUE9TSVRJT04gVE8gRUxFTUVOVCAgICAgICAgICAyYgorCQkgICBSRUFEIEVMRU1FTlQgU1RBVFVTICAgICAgICAgIGI4CisJCSAgIFJFUVVFU1QgVk9MLiBFTEVNRU5UIEFERFJFU1MgYjUKKwkJICAgU0VORCBWT0xVTUUgVEFHICAgICAgICAgICAgICBiNiBEQVRBIE9VVAorCisJCSAgIHAuIDQ1NDogQ29tbWFuZHMgZm9yIGNvbW11bmljYXRpb25zIGRldmljZXMgKG5vdCBsaXN0ZWQgcHJldmlvdXNseSkKKwkJICAgR0VUIE1FU1NBR0UgKDYpICAgICAgICAgICAgICAwOAorCQkgICBHRVQgTUVTU0FHRSAoMTApICAgICAgICAgICAgIDI4CisJCSAgIEdFVCBNRVNTQUdFICgxMikgICAgICAgICAgICAgYTgKKwkJICovCisKKwkJc3dpdGNoIChjdXJyZW50X1NDLT5jbW5kWzBdKSB7CisJCWNhc2UgQ0hBTkdFX0RFRklOSVRJT046CisJCWNhc2UgQ09NUEFSRToKKwkJY2FzZSBDT1BZOgorCQljYXNlIENPUFlfVkVSSUZZOgorCQljYXNlIExPR19TRUxFQ1Q6CisJCWNhc2UgTU9ERV9TRUxFQ1Q6CisJCWNhc2UgTU9ERV9TRUxFQ1RfMTA6CisJCWNhc2UgU0VORF9ESUFHTk9TVElDOgorCQljYXNlIFdSSVRFX0JVRkZFUjoKKworCQljYXNlIEZPUk1BVF9VTklUOgorCQljYXNlIFJFQVNTSUdOX0JMT0NLUzoKKwkJY2FzZSBSRVNFUlZFOgorCQljYXNlIFNFQVJDSF9FUVVBTDoKKwkJY2FzZSBTRUFSQ0hfSElHSDoKKwkJY2FzZSBTRUFSQ0hfTE9XOgorCQljYXNlIFdSSVRFXzY6CisJCWNhc2UgV1JJVEVfMTA6CisJCWNhc2UgV1JJVEVfVkVSSUZZOgorCQljYXNlIDB4M2Y6CisJCWNhc2UgMHg0MToKKworCQljYXNlIDB4YjE6CisJCWNhc2UgMHhiMDoKKwkJY2FzZSAweGIyOgorCQljYXNlIDB4YWE6CisJCWNhc2UgMHhhZToKKworCQljYXNlIDB4MjQ6CisKKwkJY2FzZSAweDM4OgorCQljYXNlIDB4M2Q6CisKKwkJY2FzZSAweGI2OgorCisJCWNhc2UgMHhlYToJLyogYWx0ZXJuYXRlIG51bWJlciBmb3IgV1JJVEUgTE9ORyAqLworCisJCQljdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luID0gLTE7CisJCQlvdXRiKDB4ZDAgfCBQQVJJVFlfTUFTSywgVE1DX0NudGxfcG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIDB4MDA6CisJCWRlZmF1bHQ6CisKKwkJCWN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSAxOworCQkJb3V0YigweDkwIHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9PSAtMSkgewkvKiBEQVRBIE9VVCAqLworCQl3aGlsZSAoKGRhdGFfY291bnQgPSBGSUZPX1NpemUgLSBpbncoRklGT19EYXRhX0NvdW50X3BvcnQpKSA+IDUxMikgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJcHJpbnRrKCJEQz0lZCwgIiwgZGF0YV9jb3VudCk7CisjZW5kaWYKKwkJCWlmIChkYXRhX2NvdW50ID4gY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwpCisJCQkJZGF0YV9jb3VudCA9IGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkJaWYgKGRhdGFfY291bnQgPiAwKSB7CisjaWYgRVZFUllfQUNDRVNTCisJCQkJcHJpbnRrKCIlZCBPVVQsICIsIGRhdGFfY291bnQpOworI2VuZGlmCisJCQkJaWYgKGRhdGFfY291bnQgPT0gMSkgeworCQkJCQlCeXRlc19Xcml0dGVuKys7CisKKwkJCQkJb3V0YigqY3VycmVudF9TQy0+U0NwLnB0cisrLCBXcml0ZV9GSUZPX3BvcnQpOworCQkJCQktLWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkJCX0gZWxzZSB7CisJCQkJCWRhdGFfY291bnQgPj49IDE7CisJCQkJCXRtcF9jb3VudCA9IGRhdGFfY291bnQgPDwgMTsKKwkJCQkJb3V0c3coV3JpdGVfRklGT19wb3J0LCBjdXJyZW50X1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKwkJCQkJY3VycmVudF9TQy0+U0NwLnB0ciArPSB0bXBfY291bnQ7CisJCQkJCUJ5dGVzX1dyaXR0ZW4gKz0gdG1wX2NvdW50OworCQkJCQljdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCAtPSB0bXBfY291bnQ7CisJCQkJfQorCQkJfQorCQkJaWYgKCFjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCkgeworCQkJCWlmIChjdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkJCQktLWN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCQkJCQkrK2N1cnJlbnRfU0MtPlNDcC5idWZmZXI7CisJCQkJCWN1cnJlbnRfU0MtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCQkJCWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJCX0gZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9PSAxKSB7CS8qIERBVEEgSU4gKi8KKwkJd2hpbGUgKChkYXRhX2NvdW50ID0gaW53KEZJRk9fRGF0YV9Db3VudF9wb3J0KSkgPiAwKSB7CisjaWYgRVZFUllfQUNDRVNTCisJCQlwcmludGsoIkRDPSVkLCAiLCBkYXRhX2NvdW50KTsKKyNlbmRpZgorCQkJaWYgKGRhdGFfY291bnQgPiBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCkKKwkJCQlkYXRhX2NvdW50ID0gY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCQlpZiAoZGF0YV9jb3VudCkgeworI2lmIEVWRVJZX0FDQ0VTUworCQkJCXByaW50aygiJWQgSU4sICIsIGRhdGFfY291bnQpOworI2VuZGlmCisJCQkJaWYgKGRhdGFfY291bnQgPT0gMSkgeworCQkJCQlCeXRlc19SZWFkKys7CisJCQkJCSpjdXJyZW50X1NDLT5TQ3AucHRyKysgPSBpbmIoUmVhZF9GSUZPX3BvcnQpOworCQkJCQktLWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkJCX0gZWxzZSB7CisJCQkJCWRhdGFfY291bnQgPj49IDE7CS8qIE51bWJlciBvZiB3b3JkcyAqLworCQkJCQl0bXBfY291bnQgPSBkYXRhX2NvdW50IDw8IDE7CisJCQkJCWluc3coUmVhZF9GSUZPX3BvcnQsIGN1cnJlbnRfU0MtPlNDcC5wdHIsIGRhdGFfY291bnQpOworCQkJCQljdXJyZW50X1NDLT5TQ3AucHRyICs9IHRtcF9jb3VudDsKKwkJCQkJQnl0ZXNfUmVhZCArPSB0bXBfY291bnQ7CisJCQkJCWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsIC09IHRtcF9jb3VudDsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsICYmIGN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7CisJCQkJLS1jdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkJCQkrK2N1cnJlbnRfU0MtPlNDcC5idWZmZXI7CisJCQkJY3VycmVudF9TQy0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5wYWdlKSArIGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJCQljdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkb25lKSB7CisjaWYgRVZFUllfQUNDRVNTCisJCXByaW50aygiICoqIElOIERPTkUgJWQgKiogIiwgY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbik7CisjZW5kaWYKKworI2lmIEVSUk9SU19PTkxZCisJCWlmIChjdXJyZW50X1NDLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgJiYgIWN1cnJlbnRfU0MtPlNDcC5TdGF0dXMpIHsKKwkJCWlmICgodW5zaWduZWQgY2hhcikgKCooKGNoYXIgKikgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIgKyAyKSkgJiAweDBmKSB7CisJCQkJdW5zaWduZWQgY2hhciBrZXk7CisJCQkJdW5zaWduZWQgY2hhciBjb2RlOworCQkJCXVuc2lnbmVkIGNoYXIgcXVhbGlmaWVyOworCisJCQkJa2V5ID0gKHVuc2lnbmVkIGNoYXIpICgqKChjaGFyICopIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyICsgMikpICYgMHgwZjsKKwkJCQljb2RlID0gKHVuc2lnbmVkIGNoYXIpICgqKChjaGFyICopIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyICsgMTIpKTsKKwkJCQlxdWFsaWZpZXIgPSAodW5zaWduZWQgY2hhcikgKCooKGNoYXIgKikgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIgKyAxMykpOworCisJCQkJaWYgKGtleSAhPSBVTklUX0FUVEVOVElPTiAmJiAhKGtleSA9PSBOT1RfUkVBRFkgJiYgY29kZSA9PSAweDA0ICYmICghcXVhbGlmaWVyIHx8IHF1YWxpZmllciA9PSAweDAyIHx8IHF1YWxpZmllciA9PSAweDAxKSkKKwkJCQkgICAgJiYgIShrZXkgPT0gSUxMRUdBTF9SRVFVRVNUICYmIChjb2RlID09IDB4MjUgfHwgY29kZSA9PSAweDI0IHx8ICFjb2RlKSkpCisKKwkJCQkJcHJpbnRrKCJmZF9tY3M6IFJFUVVFU1QgU0VOU0UgIiAiS2V5ID0gJXgsIENvZGUgPSAleCwgUXVhbGlmaWVyID0gJXhcbiIsIGtleSwgY29kZSwgcXVhbGlmaWVyKTsKKwkJCX0KKwkJfQorI2VuZGlmCisjaWYgRVZFUllfQUNDRVNTCisJCXByaW50aygiQkVGT1JFIE1ZX0RPTkUuIC4gLiIpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJbXlfZG9uZShzaHBudCwgKGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKQorCQkJfCAoKGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX09LIDw8IDE2KSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworI2lmIEVWRVJZX0FDQ0VTUworCQlwcmludGsoIlJFVFVSTklORy5cbiIpOworI2VuZGlmCisKKwl9IGVsc2UgeworCQlpZiAoY3VycmVudF9TQy0+U0NwLnBoYXNlICYgZGlzY29ubmVjdCkgeworCQkJb3V0YigweGQwIHwgRklGT19DT1VOVCwgSW50ZXJydXB0X0NudGxfcG9ydCk7CisJCQlvdXRiKDB4MDAsIFNDU0lfQ250bF9wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoMHg5MCB8IEZJRk9fQ09VTlQsIEludGVycnVwdF9DbnRsX3BvcnQpOworCQl9CisJfQorI2lmIERFQlVHX1JBQ0UKKwlpbl9pbnRlcnJ1cHRfZmxhZyA9IDA7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZmRfbWNzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaW50IGksIHRoaXNfaG9zdCwgaXJxX3VzYWdlOworCisJcmVsZWFzZV9yZWdpb24oc2hwbnQtPmlvX3BvcnQsIHNocG50LT5uX2lvX3BvcnQpOworCisJdGhpc19ob3N0ID0gLTE7CisJaXJxX3VzYWdlID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZm91bmQ7IGkrKykgeworCQlpZiAoc2hwbnQgPT0gaG9zdHNbaV0pCisJCQl0aGlzX2hvc3QgPSBpOworCQlpZiAoc2hwbnQtPmlycSA9PSBob3N0c1tpXS0+aXJxKQorCQkJaXJxX3VzYWdlKys7CisJfQorCisJLyogb25seSBmb3IgdGhlIGxhc3Qgb25lICovCisJaWYgKDEgPT0gaXJxX3VzYWdlKQorCQlmcmVlX2lycShzaHBudC0+aXJxLCBob3N0cyk7CisKKwlmb3VuZC0tOworCisJZm9yIChpID0gdGhpc19ob3N0OyBpIDwgZm91bmQ7IGkrKykKKwkJaG9zdHNbaV0gPSBob3N0c1tpICsgMV07CisKKwlob3N0c1tmb3VuZF0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmRfbWNzX3F1ZXVlKFNjc2lfQ21uZCAqIFNDcG50LCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisKKwlpZiAoaW5fY29tbWFuZCkgeworCQlwYW5pYygiZmRfbWNzOiBmZF9tY3NfcXVldWUoKSBOT1QgUkVFTlRSQU5UIVxuIik7CisJfQorI2lmIEVWRVJZX0FDQ0VTUworCXByaW50aygicXVldWU6IHRhcmdldCA9ICVkIGNtbmQgPSAweCUwMnggcGllY2VzID0gJWQgc2l6ZSA9ICV1XG4iLCBTQ3BudC0+dGFyZ2V0LCAqKHVuc2lnbmVkIGNoYXIgKikgU0NwbnQtPmNtbmQsIFNDcG50LT51c2Vfc2csIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworI2VuZGlmCisKKwlmZF9tY3NfbWFrZV9idXNfaWRsZShzaHBudCk7CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsJLyogU2F2ZSB0aGlzIGZvciB0aGUgZG9uZSBmdW5jdGlvbiAqLworCWN1cnJlbnRfU0MgPSBTQ3BudDsKKworCS8qIEluaXRpYWxpemUgc3RhdGljIGRhdGEgKi8KKworCWlmIChjdXJyZW50X1NDLT51c2Vfc2cpIHsKKwkJY3VycmVudF9TQy0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXI7CisJCWN1cnJlbnRfU0MtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQljdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPnVzZV9zZyAtIDE7CisJfSBlbHNlIHsKKwkJY3VycmVudF9TQy0+U0NwLnB0ciA9IChjaGFyICopIGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyOworCQljdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmxlbjsKKwkJY3VycmVudF9TQy0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCWN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwl9CisKKworCWN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgPSAwOworCWN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlID0gMDsKKwljdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luID0gMDsKKwljdXJyZW50X1NDLT5TQ3Auc2VudF9jb21tYW5kID0gMDsKKwljdXJyZW50X1NDLT5TQ3AucGhhc2UgPSBpbl9hcmJpdHJhdGlvbjsKKworCS8qIFN0YXJ0IGFyYml0cmF0aW9uICovCisJb3V0YigweDAwLCBJbnRlcnJ1cHRfQ250bF9wb3J0KTsKKwlvdXRiKDB4MDAsIFNDU0lfQ250bF9wb3J0KTsJLyogRGlzYWJsZSBkYXRhIGRyaXZlcnMgKi8KKwlvdXRiKGFkYXB0ZXJfbWFzaywgU0NTSV9EYXRhX05vQUNLX3BvcnQpOwkvKiBTZXQgb3VyIGlkIGJpdCAqLworCWluX2NvbW1hbmQgPSAxOworCW91dGIoMHgyMCwgSW50ZXJydXB0X0NudGxfcG9ydCk7CisJb3V0YigweDE0IHwgUEFSSVRZX01BU0ssIFRNQ19DbnRsX3BvcnQpOwkvKiBTdGFydCBhcmJpdHJhdGlvbiAqLworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBERUJVR19BQk9SVCB8fCBERUJVR19SRVNFVAorc3RhdGljIHZvaWQgZmRfbWNzX3ByaW50X2luZm8oU2NzaV9DbW5kICogU0NwbnQpCit7CisJdW5zaWduZWQgaW50IGltcjsKKwl1bnNpZ25lZCBpbnQgaXJyOworCXVuc2lnbmVkIGludCBpc3I7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+aG9zdDsKKworCWlmICghU0NwbnQgfHwgIVNDcG50LT5ob3N0KSB7CisJCXByaW50aygiZmRfbWNzOiBjYW5ub3QgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvblxuIik7CisJfQorCisJcHJpbnRrKCIlc1xuIiwgZmRfbWNzX2luZm8oU0NwbnQtPmhvc3QpKTsKKwlwcmludF9iYW5uZXIoU0NwbnQtPmhvc3QpOworCXN3aXRjaCAoU0NwbnQtPlNDcC5waGFzZSkgeworCWNhc2UgaW5fYXJiaXRyYXRpb246CisJCXByaW50aygiYXJiaXRyYXRpb24gIik7CisJCWJyZWFrOworCWNhc2UgaW5fc2VsZWN0aW9uOgorCQlwcmludGsoInNlbGVjdGlvbiAiKTsKKwkJYnJlYWs7CisJY2FzZSBpbl9vdGhlcjoKKwkJcHJpbnRrKCJvdGhlciAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJ1bmtub3duICIpOworCQlicmVhazsKKwl9CisKKwlwcmludGsoIiglZCksIHRhcmdldCA9ICVkIGNtbmQgPSAweCUwMnggcGllY2VzID0gJWQgc2l6ZSA9ICV1XG4iLCBTQ3BudC0+U0NwLnBoYXNlLCBTQ3BudC0+ZGV2aWNlLT5pZCwgKih1bnNpZ25lZCBjaGFyICopIFNDcG50LT5jbW5kLCBTQ3BudC0+dXNlX3NnLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwlwcmludGsoInNlbnRfY29tbWFuZCA9ICVkLCBoYXZlX2RhdGFfaW4gPSAlZCwgdGltZW91dCA9ICVkXG4iLCBTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCwgU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIFNDcG50LT50aW1lb3V0KTsKKyNpZiBERUJVR19SQUNFCisJcHJpbnRrKCJpbl9pbnRlcnJ1cHRfZmxhZyA9ICVkXG4iLCBpbl9pbnRlcnJ1cHRfZmxhZyk7CisjZW5kaWYKKworCWltciA9IChpbmIoMHgwYTEpIDw8IDgpICsgaW5iKDB4MjEpOworCW91dGIoMHgwYSwgMHhhMCk7CisJaXJyID0gaW5iKDB4YTApIDw8IDg7CisJb3V0YigweDBhLCAweDIwKTsKKwlpcnIgKz0gaW5iKDB4MjApOworCW91dGIoMHgwYiwgMHhhMCk7CisJaXNyID0gaW5iKDB4YTApIDw8IDg7CisJb3V0YigweDBiLCAweDIwKTsKKwlpc3IgKz0gaW5iKDB4MjApOworCisJLyogUHJpbnQgb3V0IGludGVyZXN0aW5nIGluZm9ybWF0aW9uICovCisJcHJpbnRrKCJJTVIgPSAweCUwNHgiLCBpbXIpOworCWlmIChpbXIgJiAoMSA8PCBzaHBudC0+aXJxKSkKKwkJcHJpbnRrKCIgKG1hc2tlZCkiKTsKKwlwcmludGsoIiwgSVJSID0gMHglMDR4LCBJU1IgPSAweCUwNHhcbiIsIGlyciwgaXNyKTsKKworCXByaW50aygiU0NTSSBTdGF0dXMgICAgICA9IDB4JTAyeFxuIiwgaW5iKFNDU0lfU3RhdHVzX3BvcnQpKTsKKwlwcmludGsoIlRNQyBTdGF0dXMgICAgICAgPSAweCUwMngiLCBpbmIoVE1DX1N0YXR1c19wb3J0KSk7CisJaWYgKGluYihUTUNfU3RhdHVzX3BvcnQpICYgMSkKKwkJcHJpbnRrKCIgKGludGVycnVwdCkiKTsKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJJbnRlcnJ1cHQgU3RhdHVzID0gMHglMDJ4IiwgaW5iKEludGVycnVwdF9TdGF0dXNfcG9ydCkpOworCWlmIChpbmIoSW50ZXJydXB0X1N0YXR1c19wb3J0KSAmIDB4MDgpCisJCXByaW50aygiIChlbmFibGVkKSIpOworCXByaW50aygiXG4iKTsKKwlpZiAoY2hpcCA9PSB0bWMxOGM1MCB8fCBjaGlwID09IHRtYzE4YzMwKSB7CisJCXByaW50aygiRklGTyBTdGF0dXMgICAgICA9IDB4JTAyeFxuIiwgaW5iKHNocG50LT5pb19wb3J0ICsgRklGT19TdGF0dXMpKTsKKwkJcHJpbnRrKCJJbnQuIENvbmRpdGlvbiAgID0gMHglMDJ4XG4iLCBpbmIoc2hwbnQtPmlvX3BvcnQgKyBJbnRlcnJ1cHRfQ29uZCkpOworCX0KKwlwcmludGsoIkNvbmZpZ3VyYXRpb24gMSAgPSAweCUwMnhcbiIsIGluYihzaHBudC0+aW9fcG9ydCArIENvbmZpZ3VyYXRpb24xKSk7CisJaWYgKGNoaXAgPT0gdG1jMThjNTAgfHwgY2hpcCA9PSB0bWMxOGMzMCkKKwkJcHJpbnRrKCJDb25maWd1cmF0aW9uIDIgID0gMHglMDJ4XG4iLCBpbmIoc2hwbnQtPmlvX3BvcnQgKyBDb25maWd1cmF0aW9uMikpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZmRfbWNzX2Fib3J0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWYgRVZFUllfQUNDRVNTIHx8IEVSUk9SU19PTkxZIHx8IERFQlVHX0FCT1JUCisJcHJpbnRrKCJmZF9tY3M6IGFib3J0ICIpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaHBudC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKCFpbl9jb21tYW5kKSB7CisjaWYgRVZFUllfQUNDRVNTIHx8IEVSUk9SU19PTkxZCisJCXByaW50aygiIChub3QgaW4gY29tbWFuZClcbiIpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gRkFJTEVEOworCX0gZWxzZQorCQlwcmludGsoIlxuIik7CisKKyNpZiBERUJVR19BQk9SVAorCWZkX21jc19wcmludF9pbmZvKFNDcG50KTsKKyNlbmRpZgorCisJZmRfbWNzX21ha2VfYnVzX2lkbGUoc2hwbnQpOworCisJY3VycmVudF9TQy0+U0NwLnBoYXNlIHw9IGFib3J0ZWQ7CisKKwljdXJyZW50X1NDLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisKKwkvKiBBYm9ydHMgYXJlIG5vdCBkb25lIHdlbGwuIC4gLiAqLworCW15X2RvbmUoc2hwbnQsIERJRF9BQk9SVCA8PCAxNik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBmZF9tY3NfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IGZkX21jc19kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpIAoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZmRfbWNzX2J1c19yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkgeworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKworI2lmIERFQlVHX1JFU0VUCisJc3RhdGljIGludCBjYWxsZWRfb25jZSA9IDA7CisjZW5kaWYKKworI2lmIEVSUk9SU19PTkxZCisJaWYgKFNDcG50KQorCQlwcmludGsoImZkX21jczogU0NTSSBCdXMgUmVzZXRcbiIpOworI2VuZGlmCisKKyNpZiBERUJVR19SRVNFVAorCWlmIChjYWxsZWRfb25jZSkKKwkJZmRfbWNzX3ByaW50X2luZm8oY3VycmVudF9TQyk7CisJY2FsbGVkX29uY2UgPSAxOworI2VuZGlmCisKKwlvdXRiKDEsIFNDU0lfQ250bF9wb3J0KTsKKwlkb19wYXVzZSgyKTsKKwlvdXRiKDAsIFNDU0lfQ250bF9wb3J0KTsKKwlkb19wYXVzZSgxMTUpOworCW91dGIoMCwgU0NTSV9Nb2RlX0NudGxfcG9ydCk7CisJb3V0YihQQVJJVFlfTUFTSywgVE1DX0NudGxfcG9ydCk7CisKKwkvKiBVbmxlc3MgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjYWxsIChpLmUuLCBTQ1BudCA9PSBOVUxMKSwgZXZlcnl0aGluZworCSAgIGlzIHByb2JhYmx5IGhvc2VkIGF0IHRoaXMgcG9pbnQuICBXZSB3aWxsLCBob3dldmVyLCB0cnkgdG8ga2VlcAorCSAgIHRoaW5ncyBnb2luZyBieSBpbmZvcm1pbmcgdGhlIGhpZ2gtbGV2ZWwgY29kZSB0aGF0IHdlIG5lZWQgaGVscC4gKi8KKwkJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKworc3RhdGljIGludCBmZF9tY3NfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqIGRpc2ssIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mb19hcnJheSkgCit7CisJdW5zaWduZWQgY2hhciAqcCA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7CisJaW50IHNpemUgPSBjYXBhY2l0eTsKKworCS8qIEJJT1MgPj0gMy40IGZvciBNQ0EgY2FyZHMgKi8KKwkvKiBUaGlzIGFsZ29yaXRobSB3YXMgcHJvdmlkZWQgYnkgRnV0dXJlIERvbWFpbiAobXVjaCB0aGFua3MhKS4gKi8KKworCWlmIChwICYmIHBbNjVdID09IDB4YWEgJiYgcFs2NF0gPT0gMHg1NQkvKiBQYXJ0aXRpb24gdGFibGUgdmFsaWQgKi8KKwkgICAgJiYgcFs0XSkgewkvKiBQYXJ0aXRpb24gdHlwZSAqLworCQkvKiBUaGUgcGFydGl0aW9uIHRhYmxlIGxheW91dCBpcyBhcyBmb2xsb3dzOgorCisJCSAgIFN0YXJ0OiAweDFiM2gKKwkJICAgT2Zmc2V0OiAwID0gcGFydGl0aW9uIHN0YXR1cworCQkgICAxID0gc3RhcnRpbmcgaGVhZAorCQkgICAyID0gc3RhcnRpbmcgc2VjdG9yIGFuZCBjeWxpbmRlciAod29yZCwgZW5jb2RlZCkKKwkJICAgNCA9IHBhcnRpdGlvbiB0eXBlCisJCSAgIDUgPSBlbmRpbmcgaGVhZAorCQkgICA2ID0gZW5kaW5nIHNlY3RvciBhbmQgY3lsaW5kZXIgKHdvcmQsIGVuY29kZWQpCisJCSAgIDggPSBzdGFydGluZyBhYnNvbHV0ZSBzZWN0b3IgKGRvdWJsZSB3b3JkKQorCQkgICBjID0gbnVtYmVyIG9mIHNlY3RvcnMgKGRvdWJsZSB3b3JkKQorCQkgICBTaWduYXR1cmU6IDB4MWZlID0gMHg1NWFhCisKKwkJICAgU28sIHRoaXMgYWxnb3JpdGhtIGFzc3VtZXM6CisJCSAgIDEpIHRoZSBmaXJzdCBwYXJ0aXRpb24gdGFibGUgaXMgaW4gdXNlLAorCQkgICAyKSB0aGUgZGF0YSBpbiB0aGUgZmlyc3QgZW50cnkgaXMgY29ycmVjdCwgYW5kCisJCSAgIDMpIHBhcnRpdGlvbnMgbmV2ZXIgZGl2aWRlIGN5bGluZGVycworCisJCSAgIE5vdGUgdGhhdCAoMSkgbWF5IGJlIEZBTFNFIGZvciBOZXRCU0QgKGFuZCBvdGhlciBCU0QgZmxhdm9ycyksCisJCSAgIGFzIHdlbGwgYXMgZm9yIExpbnV4LiAgTm90ZSBhbHNvLCB0aGF0IExpbnV4IGRvZXNuJ3QgcGF5IGFueQorCQkgICBhdHRlbnRpb24gdG8gdGhlIGZpZWxkcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgYWxnb3JpdGhtIC0tIGl0CisJCSAgIG9ubHkgdXNlcyB0aGUgYWJzb2x1dGUgc2VjdG9yIGRhdGEuICBSZWNlbnQgdmVyc2lvbnMgb2YgTGludXgncworCQkgICBmZGlzaygxKSB3aWxsIGZpbGwgdGhpcyBkYXRhIGluIGNvcnJlY3RseSwgYW5kIGZvcnRoY29taW5nCisJCSAgIHZlcnNpb25zIHdpbGwgY2hlY2sgZm9yIGNvbnNpc3RlbmN5LgorCisJCSAgIENoZWNraW5nIGZvciBhIG5vbi16ZXJvIHBhcnRpdGlvbiB0eXBlIGlzIG5vdCBwYXJ0IG9mIHRoZQorCQkgICBGdXR1cmUgRG9tYWluIGFsZ29yaXRobSwgYnV0IGl0IHNlZW1lZCB0byBiZSBhIHJlYXNvbmFibGUgdGhpbmcKKwkJICAgdG8gZG8sIGVzcGVjaWFsbHkgaW4gdGhlIExpbnV4IGFuZCBCU0Qgd29ybGRzLiAqLworCisJCWluZm9fYXJyYXlbMF0gPSBwWzVdICsgMTsJLyogaGVhZHMgKi8KKwkJaW5mb19hcnJheVsxXSA9IHBbNl0gJiAweDNmOwkvKiBzZWN0b3JzICovCisJfSBlbHNlIHsKKwkJLyogTm90ZSB0aGF0IHRoaXMgbmV3IG1ldGhvZCBndWFyYW50ZWVzIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUKKwkJICAgbGVzcyB0aGFuIDEwMjQgY3lsaW5kZXJzIG9uIGEgcGxhdHRlci4gIFRoaXMgaXMgZ29vZCBmb3IgZHJpdmVzCisJCSAgIHVwIHRvIGFwcHJveGltYXRlbHkgNy44NUdCICh3aGVyZSAxR0IgPSAxMDI0ICogMTAyNCBrQikuICovCisJCWlmICgodW5zaWduZWQgaW50KSBzaXplID49IDB4N2UwMDAwVSkgCisJCXsKKwkJCWluZm9fYXJyYXlbMF0gPSAweGZmOwkvKiBoZWFkcyAgID0gMjU1ICovCisJCQlpbmZvX2FycmF5WzFdID0gMHgzZjsJLyogc2VjdG9ycyA9ICA2MyAqLworCQl9IGVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpIHNpemUgPj0gMHgyMDAwMDBVKSB7CisJCQlpbmZvX2FycmF5WzBdID0gMHg4MDsJLyogaGVhZHMgICA9IDEyOCAqLworCQkJaW5mb19hcnJheVsxXSA9IDB4M2Y7CS8qIHNlY3RvcnMgPSAgNjMgKi8KKwkJfSBlbHNlIHsKKwkJCWluZm9fYXJyYXlbMF0gPSAweDQwOwkvKiBoZWFkcyAgID0gIDY0ICovCisJCQlpbmZvX2FycmF5WzFdID0gMHgyMDsJLyogc2VjdG9ycyA9ICAzMiAqLworCQl9CisJfQorCS8qIEZvciBib3RoIG1ldGhvZHMsIGNvbXB1dGUgdGhlIGN5bGluZGVycyAqLworCWluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgaW50KSBzaXplIC8gKGluZm9fYXJyYXlbMF0gKiBpbmZvX2FycmF5WzFdKTsKKwlrZnJlZShwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJCT0gImZkX21jcyIsCisJLnByb2NfaW5mbwkJCT0gZmRfbWNzX3Byb2NfaW5mbywKKwkuZGV0ZWN0CQkJCT0gZmRfbWNzX2RldGVjdCwKKwkucmVsZWFzZQkJCT0gZmRfbWNzX3JlbGVhc2UsCisJLmluZm8JCQkJPSBmZF9tY3NfaW5mbywKKwkucXVldWVjb21tYW5kICAgCQk9IGZkX21jc19xdWV1ZSwgCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gZmRfbWNzX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBmZF9tY3NfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gZmRfbWNzX2hvc3RfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gZmRfbWNzX2RldmljZV9yZXNldCwKKwkuYmlvc19wYXJhbSAgICAgCQk9IGZkX21jc19iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZSAgICAgIAkJPSAxLAorCS50aGlzX2lkICAgICAgICAJCT0gNywKKwkuc2dfdGFibGVzaXplICAgCQk9IDY0LAorCS5jbWRfcGVyX2x1biAgICAJCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcgCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mZG9tYWluLmMgYi9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDNjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jCkBAIC0wLDAgKzEsMTczOSBAQAorLyogZmRvbWFpbi5jIC0tIEZ1dHVyZSBEb21haW4gVE1DLTE2eDAgU0NTSSBkcml2ZXIKKyAqIENyZWF0ZWQ6IFN1biBNYXkgIDMgMTg6NTM6MTkgMTk5MiBieSBmYWl0aEBjcy51bmMuZWR1CisgKiBSZXZpc2VkOiBNb24gRGVjIDI4IDIxOjU5OjAyIDE5OTggYnkgZmFpdGhAYWNtLm9yZworICogQXV0aG9yOiBSaWNrYXJkIEUuIEZhaXRoLCBmYWl0aEBjcy51bmMuZWR1CisgKiBDb3B5cmlnaHQgMTk5Mi0xOTk2LCAxOTk4IFJpY2thcmQgRS4gRmFpdGggKGZhaXRoQGFjbS5vcmcpCisgKiBTaGFyZWQgSVJRIHN1cHBvcnRlZCBhZGRlZCA3LzcvMjAwMSAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyBTVU1NQVJZOgorCisgRnV0dXJlIERvbWFpbiBCSU9TIHZlcnNpb25zIHN1cHBvcnRlZCBmb3IgYXV0b2RldGVjdDoKKyAgICAyLjAsIDMuMCwgMy4yLCAzLjQgKDEuMCksIDMuNSAoMi4wKSwgMy42LCAzLjYxCisgQ2hpcHMgYXJlIHN1cHBvcnRlZDoKKyAgICBUTUMtMTgwMCwgVE1DLTE4QzUwLCBUTUMtMThDMzAsIFRNQy0zNkM3MAorIEJvYXJkcyBzdXBwb3J0ZWQ6CisgICAgRnV0dXJlIERvbWFpbiBUTUMtMTY1MCwgVE1DLTE2NjAsIFRNQy0xNjcwLCBUTUMtMTY4MCwgVE1DLTE2MTBNL01FUi9NRVgKKyAgICBGdXR1cmUgRG9tYWluIFRNQy0zMjYwIChQQ0kpCisgICAgUXVhbnR1bSBJU0EtMjAwUywgSVNBLTI1ME1HCisgICAgQWRhcHRlYyBBSEEtMjkyMEEgKFBDSSkgW0JVVCAqTk9UKiBBSEEtMjkyMEMgLS0gdXNlIGFpYzd4eHggaW5zdGVhZF0KKyAgICBJQk0gPworIExJTE8vSU5TTU9EIGNvbW1hbmQtbGluZSBvcHRpb25zOgorICAgIGZkb21haW49PFBPUlRfQkFTRT4sPElSUT5bLDxBREFQVEVSX0lEPl0KKworCisgICAgCisgTk9URToKKworIFRoZSBBZGFwdGVjIEFIQS0yOTIwQyBoYXMgYW4gQWRhcHRlYyBBSUMtNzg1MCBjaGlwIG9uIGl0LgorIFVzZSB0aGUgYWljN3h4eCBkcml2ZXIgZm9yIHRoaXMgYm9hcmQuCisgICAgICAgCisgVGhlIEFkYXB0ZWMgQUhBLTI5MjBBIGhhcyBhIEZ1dHVyZSBEb21haW4gY2hpcCBvbiBpdCwgc28gdGhpcyBpcyB0aGUgcmlnaHQKKyBkcml2ZXIgZm9yIHRoYXQgY2FyZC4gIFVuZm9ydHVuYXRlbHksIHRoZSBib3hlcyB3aWxsIHByb2JhYmx5IGp1c3Qgc2F5CisgIjI5MjAiLCBzbyB5b3UnbGwgaGF2ZSB0byBsb29rIG9uIHRoZSBjYXJkIGZvciBhIEZ1dHVyZSBEb21haW4gbG9nbywgb3IgYQorIGxldHRlciBhZnRlciB0aGUgMjkyMC4KKworIAorIAorIFRIQU5LUzoKKworIFRoYW5rcyB0byBBZGFwdGVjIGZvciBwcm92aWRpbmcgUENJIGJvYXJkcyBmb3IgdGVzdGluZy4gIFRoaXMgZmluYWxseQorIGVuYWJsZWQgbWUgdG8gdGVzdCB0aGUgUENJIGRldGVjdGlvbiBhbmQgY29ycmVjdCBpdCBmb3IgUENJIGJvYXJkcyB0aGF0IGRvCisgbm90IGhhdmUgYSBCSU9TIGF0IGEgc3RhbmRhcmQgSVNBIGxvY2F0aW9uLiAgRm9yIFBDSSBib2FyZHMsIExJTE8vSU5TTU9ECisgY29tbWFuZC1saW5lIG9wdGlvbnMgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQuICAtLVJGIDE4Tm92OTgKKworCisgCisgREVTQ1JJUFRJT046CisgCisgVGhpcyBpcyB0aGUgTGludXggbG93LWxldmVsIFNDU0kgZHJpdmVyIGZvciBGdXR1cmUgRG9tYWluIFRNQy0xNjYwLzE2ODAKKyBUTUMtMTY1MC8xNjcwLCBhbmQgVE1DLTMyNjAgU0NTSSBob3N0IGFkYXB0ZXJzLiAgVGhlIDE2NTAgYW5kIDE2NzAgaGF2ZSBhCisgMjUtcGluIGV4dGVybmFsIGNvbm5lY3Rvciwgd2hlcmVhcyB0aGUgMTY2MCBhbmQgMTY4MCBoYXZlIGEgU0NTSS0yIDUwLXBpbgorIGhpZ2gtZGVuc2l0eSBleHRlcm5hbCBjb25uZWN0b3IuICBUaGUgMTY3MCBhbmQgMTY4MCBoYXZlIGZsb3BweSBkaXNrCisgY29udHJvbGxlcnMgYnVpbHQgaW4uICBUaGUgVE1DLTMyNjAgaXMgYSBQQ0kgYnVzIGNhcmQuCisKKyBGdXR1cmUgRG9tYWluJ3Mgb2xkZXIgYm9hcmRzIGFyZSBiYXNlZCBvbiB0aGUgVE1DLTE4MDAgY2hpcCwgYW5kIHRoaXMKKyBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgYSBUTUMtMTY4MCBib2FyZCB3aXRoIHRoZSBUTUMtMTgwMCBjaGlwLgorIE1vcmUgcmVjZW50bHksIGJvYXJkcyBhcmUgYmVpbmcgcHJvZHVjZWQgd2l0aCB0aGUgVE1DLTE4QzUwIGFuZCBUTUMtMThDMzAKKyBjaGlwcy4gIFRoZSBsYXRlc3QgYW5kIGdyZWF0ZXN0IGJvYXJkIG1heSBub3Qgd29yayB3aXRoIHRoaXMgZHJpdmVyLiAgSWYKKyB5b3UgaGF2ZSB0byBwYXRjaCB0aGlzIGRyaXZlciBzbyB0aGF0IGl0IHdpbGwgcmVjb2duaXplIHlvdXIgYm9hcmQncyBCSU9TCisgc2lnbmF0dXJlLCB0aGVuIHRoZSBkcml2ZXIgbWF5IGZhaWwgdG8gZnVuY3Rpb24gYWZ0ZXIgdGhlIGJvYXJkIGlzCisgZGV0ZWN0ZWQuCisKKyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkcml2ZSBvcmRlcmluZyB0aGF0IEZ1dHVyZSBEb21haW4gaW1wbGVtZW50ZWQgaW4gQklPUworIHZlcnNpb25zIDMuNCBhbmQgMy41IGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUgb3JkZXIgKGN1cnJlbnRseSkgdXNlZCBieSB0aGUKKyByZXN0IG9mIHRoZSBTQ1NJIGluZHVzdHJ5LiAgSWYgeW91IGhhdmUgQklPUyB2ZXJzaW9uIDMuNCBvciAzLjUsIGFuZCBoYXZlCisgbW9yZSB0aGFuIG9uZSBkcml2ZSwgdGhlbiB0aGUgZHJpdmUgb3JkZXJpbmcgd2lsbCBiZSB0aGUgcmV2ZXJzZSBvZiB0aGF0Cisgd2hpY2ggeW91IHNlZSB1bmRlciBET1MuICBGb3IgZXhhbXBsZSwgdW5kZXIgRE9TIFNDU0kgSUQgMCB3aWxsIGJlIEQ6IGFuZAorIFNDU0kgSUQgMSB3aWxsIGJlIEM6ICh0aGUgYm9vdCBkZXZpY2UpLiAgVW5kZXIgTGludXgsIFNDU0kgSUQgMCB3aWxsIGJlCisgL2Rldi9zZGEgYW5kIFNDU0kgSUQgMSB3aWxsIGJlIC9kZXYvc2RiLiAgVGhlIExpbnV4IG9yZGVyaW5nIGlzIGNvbnNpc3RlbnQKKyB3aXRoIHRoYXQgcHJvdmlkZWQgYnkgYWxsIHRoZSBvdGhlciBTQ1NJIGRyaXZlcnMgZm9yIExpbnV4LiAgSWYgeW91IHdhbnQKKyB0aGlzIGNoYW5nZWQsIHlvdSB3aWxsIHByb2JhYmx5IGhhdmUgdG8gcGF0Y2ggdGhlIGhpZ2hlciBsZXZlbCBTQ1NJIGNvZGUuCisgSWYgeW91IGRvIHNvLCBwbGVhc2Ugc2VuZCBtZSBwYXRjaGVzIHRoYXQgYXJlIHByb3RlY3RlZCBieSAjaWZkZWZzLgorCisgSWYgeW91IGhhdmUgYSBUTUMtOHh4IG9yIFRNQy05eHggYm9hcmQsIHRoZW4gdGhpcyBpcyBub3QgdGhlIGRyaXZlciBmb3IKKyB5b3VyIGJvYXJkLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBTZWFnYXRlIGRyaXZlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQKKyBwb3NzaWJsZSBzdXBwb3J0LgorCisgCisgCisgSElTVE9SWToKKworIExpbnV4ICAgICAgIERyaXZlciAgICAgIERyaXZlcgorIFZlcnNpb24gICAgIFZlcnNpb24gICAgIERhdGUgICAgICAgICBTdXBwb3J0L05vdGVzCisKKyAgICAgICAgICAgICAwLjAgICAgICAgICAgMyBNYXkgMTk5MiAgVjIuMCBCSU9TOyAxODAwIGNoaXAKKyAwLjk3ICAgICAgICAxLjkgICAgICAgICAyOCBKdWwgMTk5MgorIDAuOTguNiAgICAgIDMuMSAgICAgICAgIDI3IE5vdiAxOTkyCisgMC45OSAgICAgICAgMy4yICAgICAgICAgIDkgRGVjIDE5OTIKKworIDAuOTkuMyAgICAgIDMuMyAgICAgICAgIDEwIEphbiAxOTkzICBWMy4wIEJJT1MKKyAwLjk5LjUgICAgICAzLjUgICAgICAgICAxOCBGZWIgMTk5MworIDAuOTkuMTAgICAgIDMuNiAgICAgICAgIDE1IE1heSAxOTkzICBWMy4yIEJJT1M7IDE4QzUwIGNoaXAKKyAwLjk5LjExICAgICAzLjE3ICAgICAgICAgMyBKdWwgMTk5MyAgKG5vdyB1bmRlciBSQ1MpCisgMC45OS4xMiAgICAgMy4xOCAgICAgICAgMTMgQXVnIDE5OTMKKyAwLjk5LjE0ICAgICA1LjYgICAgICAgICAzMSBPY3QgMTk5MyAgKHJlc2VsZWN0aW9uIGNvZGUgcmVtb3ZlZCkKKworIDAuOTkuMTUgICAgIDUuOSAgICAgICAgIDIzIEphbiAxOTk0ICBWMy40IEJJT1MgKHByZWxpbWluYXJ5KQorIDEuMC44LzEuMS4xIDUuMTUgICAgICAgICAxIEFwciAxOTk0ICBWMy40IEJJT1M7IDE4QzMwIGNoaXAgKHByZWxpbWluYXJ5KQorIDEuMC45LzEuMS4zIDUuMTYgICAgICAgICA3IEFwciAxOTk0ICBWMy40IEJJT1M7IDE4QzMwIGNoaXAKKyAxLjEuMzggICAgICA1LjE4ICAgICAgICAzMCBKdWwgMTk5NCAgMzZDNzAgY2hpcCAoUENJIHZlcnNpb24gb2YgMThDMzApCisgMS4xLjYyICAgICAgNS4yMCAgICAgICAgIDIgTm92IDE5OTQgIFYzLjUgQklPUworIDEuMS43MyAgICAgIDUuMjIgICAgICAgICA3IERlYyAxOTk0ICBRdWFudHVtIElTQS0yMDBTIGJvYXJkOyBWMi4wIEJJT1MKKworIDEuMS44MiAgICAgIDUuMjYgICAgICAgIDE0IEphbiAxOTk1ICBWMy41IEJJT1M7IFRNQy0xNjEwTS9NRVIvTUVYIGJvYXJkCisgMS4yLjEwICAgICAgNS4yOCAgICAgICAgIDUgSnVuIDE5OTUgIFF1YW50dW0gSVNBLTI1ME1HIGJvYXJkOyBWMi4wLCBWMi4wMSBCSU9TCisgMS4zLjQgICAgICAgNS4zMSAgICAgICAgMjMgSnVuIDE5OTUgIFBDSSBCSU9TLTMyIGRldGVjdGlvbiAocHJlbGltaW5hcnkpCisgMS4zLjcgICAgICAgNS4zMyAgICAgICAgIDQgSnVsIDE5OTUgIFBDSSBCSU9TLTMyIGRldGVjdGlvbgorIDEuMy4yOCAgICAgIDUuMzYgICAgICAgIDE3IFNlcCAxOTk1ICBWMy42MSBCSU9TOyBMSUxPIGNvbW1hbmQtbGluZSBzdXBwb3J0CisgMS4zLjM0ICAgICAgNS4zOSAgICAgICAgMTIgT2N0IDE5OTUgIFYzLjYwIEJJT1M7IC9wcm9jCisgMS4zLjcyICAgICAgNS4zOSAgICAgICAgIDggRmViIDE5OTYgIEFkYXB0ZWMgQUhBLTI5MjAgYm9hcmQKKyAxLjMuODUgICAgICA1LjQxICAgICAgICAgNCBBcHIgMTk5NgorIDIuMC4xMiAgICAgIDUuNDQgICAgICAgICA4IEF1ZyAxOTk2ICBVc2UgSUQgNyBmb3IgYWxsIFBDSSBjYXJkcworIDIuMS4xICAgICAgIDUuNDUgICAgICAgICAyIE9jdCAxOTk2ICBVcGRhdGUgUk9NIGFjY2Vzc2VzIGZvciAyLjEueAorIDIuMS45NyAgICAgIDUuNDYJIDIzIEFwciAxOTk4ICBSZXdyaXR0ZW4gUENJIGRldGVjdGlvbiByb3V0aW5lcyBbbWpdCisgMi4xLjExeCAgICAgNS40NwkgIDkgQXVnIDE5OTggIFRvdWNoZWQgZm9yIDggU0NTSSBkaXNrIG1ham9ycyBzdXBwb3J0CisgICAgICAgICAgICAgNS40OCAgICAgICAgMTggTm92IDE5OTggIEJJT1Mgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUENJIGRldGVjdGlvbgorIDIuMi4wICAgICAgIDUuNTAgICAgICAgIDI4IERlYyAxOTk4ICBTdXBwb3J0IGluc21vZCBwYXJhbWV0ZXJzCisgCisKKyBSRUZFUkVOQ0VTIFVTRUQ6CisKKyAiVE1DLTE4MDAgU0NTSSBDaGlwIFNwZWNpZmljYXRpb24gKEZEQy0xODAwVCkiLCBGdXR1cmUgRG9tYWluIENvcnBvcmF0aW9uLAorIDE5OTAuCisKKyAiVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWw6IDE4QzUwIFNDU0kgSG9zdCBBZGFwdGVyIENoaXAiLCBGdXR1cmUgRG9tYWluCisgQ29ycG9yYXRpb24sIEphbnVhcnkgMTk5Mi4KKworICJMWFQgU0NTSSBQcm9kdWN0czogU3BlY2lmaWNhdGlvbnMgYW5kIE9FTSBUZWNobmljYWwgTWFudWFsIChSZXZpc2lvbgorIEIvU2VwdGVtYmVyIDE5OTEpIiwgTWF4dG9yIENvcnBvcmF0aW9uLCAxOTkxLgorCisgIjcyMTNTIHByb2R1Y3QgTWFudWFsIChSZXZpc2lvbiBQMykiLCBNYXh0b3IgQ29ycG9yYXRpb24sIDE5OTIuCisKKyAiRHJhZnQgUHJvcG9zZWQgQW1lcmljYW4gTmF0aW9uYWwgU3RhbmRhcmQ6IFNtYWxsIENvbXB1dGVyIFN5c3RlbQorIEludGVyZmFjZSAtIDIgKFNDU0ktMikiLCBHbG9iYWwgRW5naW5lZXJpbmcgRG9jdW1lbnRzLiAoWDNUOS4yLzg2LTEwOSwKKyByZXZpc2lvbiAxMGgsIE9jdG9iZXIgMTcsIDE5OTEpCisKKyBQcml2YXRlIGNvbW11bmljYXRpb25zLCBEcmV3IEVja2hhcmR0IChkcmV3QGNzLmNvbG9yYWRvLmVkdSkgYW5kIEVyaWMKKyBZb3VuZ2RhbGUgKGVyaWN5QGNhaXMuY29tKSwgMTk5Mi4KKworIFByaXZhdGUgY29tbXVuaWNhdGlvbiwgVHVvbmcgTGUgKEZ1dHVyZSBEb21haW4gRW5naW5lZXJpbmcgZGVwYXJ0bWVudCksCisgMTk5NC4gKERpc2sgZ2VvbWV0cnkgY29tcHV0YXRpb25zIGZvciBGdXR1cmUgRG9tYWluIEJJT1MgdmVyc2lvbiAzLjQsIGFuZAorIFRNQy0xOEMzMCBkZXRlY3Rpb24uKQorCisgSG9nYW4sIFRob20uIFRoZSBQcm9ncmFtbWVyJ3MgUEMgU291cmNlYm9vay4gTWljcm9zb2Z0IFByZXNzLCAxOTg4LiBQYWdlCisgNjAgKDIuMzk6IERpc2sgUGFydGl0aW9uIFRhYmxlIExheW91dCkuCisKKyAiMThDMzAgVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWwiLCBGdXR1cmUgRG9tYWluIENvcnBvcmF0aW9uLCAxOTkzLCBwYWdlCisgNi0xLgorCisKKyAKKyBOT1RFUyBPTiBSRUZFUkVOQ0VTOgorCisgVGhlIE1heHRvciBtYW51YWxzIHdlcmUgZnJlZS4gIE1heHRvciB0ZWxlcGhvbmUgdGVjaG5pY2FsIHN1cHBvcnQgaXMKKyBncmVhdCEKKworIFRoZSBGdXR1cmUgRG9tYWluIG1hbnVhbHMgd2VyZSAkMjUgYW5kICQzNS4gIFRoZXkgZG9jdW1lbnQgdGhlIGNoaXAsIG5vdAorIHRoZSBUTUMtMTZ4MCBib2FyZHMsIHNvIHNvbWUgaW5mb3JtYXRpb24gSSBoYWQgdG8gZ3Vlc3MgYXQuICBJbiAxOTkyLAorIEZ1dHVyZSBEb21haW4gc29sZCBET1MgQklPUyBzb3VyY2UgZm9yICQyNTAgYW5kIHRoZSBVTipYIGRyaXZlciBzb3VyY2Ugd2FzCisgJDc1MCwgYnV0IHRoZXNlIHJlcXVpcmVkIGEgbm9uLWRpc2Nsb3N1cmUgYWdyZWVtZW50LCBzbyBldmVuIGlmIEkgY291bGQKKyBoYXZlIGFmZm9yZGVkIHRoZW0sIHRoZXkgd291bGQgKm5vdCogaGF2ZSBiZWVuIHVzZWZ1bCBmb3Igd3JpdGluZyB0aGlzCisgcHVibGljYWxseSBkaXN0cmlidXRhYmxlIGRyaXZlci4gIEZ1dHVyZSBEb21haW4gdGVjaG5pY2FsIHN1cHBvcnQgaGFzCisgcHJvdmlkZWQgc29tZSBpbmZvcm1hdGlvbiBvbiB0aGUgcGhvbmUgYW5kIGhhdmUgc2VudCBhIGZldyB1c2VmdWwgRkFYcy4KKyBUaGV5IGhhdmUgYmVlbiBtdWNoIG1vcmUgaGVscGZ1bCBzaW5jZSB0aGV5IHN0YXJ0ZWQgdG8gcmVjb2duaXplIHRoYXQgdGhlCisgd29yZCAiTGludXgiIHJlZmVycyB0byBhbiBvcGVyYXRpbmcgc3lzdGVtIDotKS4KKworIAorCisgQUxQSEEgVEVTVEVSUzoKKworIFRoZXJlIGFyZSBtYW55IG90aGVyIGFscGhhIHRlc3RlcnMgdGhhdCBjb21lIGFuZCBnbyBhcyB0aGUgZHJpdmVyCisgZGV2ZWxvcHMuICBUaGUgcGVvcGxlIGxpc3RlZCBoZXJlIHdlcmUgbW9zdCBoZWxwZnVsIGluIHRpbWVzIG9mIGdyZWF0ZXN0CisgbmVlZCAobW9zdGx5IGVhcmx5IG9uIC0tIEkndmUgcHJvYmFibHkgbGVmdCBvdXQgYSBmZXcgd29ydGh5IHBlb3BsZSBpbgorIG1vcmUgcmVjZW50IHRpbWVzKToKKworIFRvZGQgQ2FycmljbyAodG9kZEB3dXRjLnd1c3RsLmVkdSksIERhbiBQb2lyaWVyIChwb2lyaWVyQGNzLnVuYy5lZHUgKSwgS2VuCisgQ29yZXkgKGtlbmNAc29sLmFjcy51bnQuZWR1KSwgQy4gZGUgQnJ1aW4gKGJydWluQGJydWluQHN0ZXJiYnMubmwpLCBTYWthcmkKKyBBYWx0b25lbiAoc2FrYXJpYUB2aXB1bmVuLmhpdC5maSksIEpvaG4gUmljZSAocmljZUB4YW50aC5jcy5vZHUuZWR1KSwgQnJhZAorIFllYXJ3b29kIChicmFkQG9wdGlsaW5rLmNvbSksIGFuZCBSYXkgVG95ICh0b3lAc29oby5jcmQuZ2UuY29tKS4KKworIFNwZWNpYWwgdGhhbmtzIHRvIFRpZW4tV2FuIFlhbmcgKHR3eWFuZ0Bjcy51aC5lZHUpLCB3aG8gZ3JhY2lvdXNseSBsZW50IG1lCisgaGlzIDE4QzUwLWJhc2VkIGNhcmQgZm9yIGRlYnVnZ2luZy4gIEhlIGlzIHRoZSBzb2xlIHJlYXNvbiB0aGF0IHRoaXMKKyBkcml2ZXIgd29ya3Mgd2l0aCB0aGUgMThDNTAgY2hpcC4KKworIFRoYW5rcyB0byBEYXZlIE5ld21hbiAoZG5ld21hbkBjcmwuY29tKSBmb3IgcHJvdmlkaW5nIGluaXRpYWwgcGF0Y2hlcyBmb3IKKyB0aGUgdmVyc2lvbiAzLjQgQklPUy4KKworIFRoYW5rcyB0byBKYW1lcyBULiBNY0tpbmxleSAobWNraW5sZXlAbXN1cGEucGEubXN1LmVkdSkgZm9yIHByb3ZpZGluZworIHBhdGNoZXMgdGhhdCBzdXBwb3J0IHRoZSBUTUMtMzI2MCwgYSBQQ0kgYnVzIGNhcmQgd2l0aCB0aGUgMzZDNzAgY2hpcC4KKyBUaGUgMzZDNzAgY2hpcCBhcHBlYXJzIHRvIGJlICJjb21wbGV0ZWx5IGNvbXBhdGlibGUiIHdpdGggdGhlIDE4QzMwIGNoaXAuCisKKyBUaGFua3MgdG8gRXJpYyBLYXN0ZW4gKHRpZ2dlckBwZXRyb2dseXBoLmNsLm1zdS5lZHUpIGZvciBwcm92aWRpbmcgdGhlCisgcGF0Y2ggZm9yIHRoZSB2ZXJzaW9uIDMuNSBCSU9TLgorCisgVGhhbmtzIGZvciBTdGVwaGVuIEhlbnNvbiAoc2hlbnNvbkBueXgxMC5jcy5kdS5lZHUpIGZvciBwcm92aWRpbmcgdGhlCisgcGF0Y2ggZm9yIHRoZSBRdWFudHVtIElTQS0yMDBTIFNDU0kgYWRhcHRlci4KKyAKKyBUaGFua3MgdG8gQWRhbSBCb3dlbiBmb3IgdGhlIHNpZ25hdHVyZSB0byB0aGUgMTYxME0vTUVSL01FWCBzY3NpIGNhcmRzLCB0bworIE1hcnRpbiBBbmRyZXdzIChhbmRyZXdtQGNjZmFkbS5lZWcuY2NmLm9yZykgZm9yIHRoZSBzaWduYXR1cmUgdG8gc29tZQorIHJhbmRvbSBUTUMtMTY4MCByZXBhY2thZ2VkIGJ5IElCTTsgYW5kIHRvIE1pbnRhayBOZyAobWludGFrQHBhbml4LmNvbSkgZm9yCisgdGhlIHZlcnNpb24gMy42MSBCSU9TIHNpZ25hdHVyZS4KKworIFRoYW5rcyBmb3IgTWFyayBTaW5nZXIgKGVsZkBuZXRjb20uY29tKSBhbmQgUmljaGFyZCBTaW1wc29uCisgKHJzaW1wc29uQGV3cmNzZHJhLmRlbW9uLmNvLnVrKSBmb3IgbW9yZSBRdWFudHVtIHNpZ25hdHVyZXMgYW5kIGRldGVjdGl2ZQorIHdvcmsgb24gdGhlIFF1YW50dW0gUkFNIGxheW91dC4KKworIFNwZWNpYWwgdGhhbmtzIHRvIEphbWVzIFQuIE1jS2lubGV5IChtY2tpbmxleUBtc3VwYS5wYS5tc3UuZWR1KSBmb3IKKyBwcm92aWRpbmcgcGF0Y2hlcyBmb3IgcHJvcGVyIFBDSSBCSU9TMzItbWVkaWF0ZWQgZGV0ZWN0aW9uIG9mIHRoZSBUTUMtMzI2MAorIGNhcmQgKGEgUENJIGJ1cyBjYXJkIHdpdGggdGhlIDM2QzcwIGNoaXApLiAgUGxlYXNlIHNlbmQgSmFtZXMgUENJLXJlbGF0ZWQKKyBidWcgcmVwb3J0cy4KKworIFRoYW5rcyB0byBUb20gQ2F2aW4gKHRlY0B1c2ExLmNvbSkgZm9yIHByZWxpbWluYXJ5IGNvbW1hbmQtbGluZSBvcHRpb24KKyBwYXRjaGVzLgorCisgTmV3IFBDSSBkZXRlY3Rpb24gY29kZSB3cml0dGVuIGJ5IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgorCisgSW5zbW9kIHBhcmFtZXRlciBjb2RlIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBEYW5pZWwgR3JhaGFtCisgPGdyYWhhbUBiYWxhbmNlLnVvcmVnb24uZWR1Pi4gCisgCisgQWxsIG9mIHRoZSBhbHBoYSB0ZXN0ZXJzIGRlc2VydmUgbXVjaCB0aGFua3MuCisKKworCisgTk9URVMgT04gVVNFUiBERUZJTkFCTEUgT1BUSU9OUzoKKworIERFQlVHOiBUaGlzIHR1cm5zIG9uIHRoZSBwcmludGluZyBvZiB2YXJpb3VzIGRlYnVnIGluZm9ybWF0aW9uLgorCisgRU5BQkxFX1BBUklUWTogVGhpcyB0dXJucyBvbiBTQ1NJIHBhcml0eSBjaGVja2luZy4gIFdpdGggdGhlIGN1cnJlbnQKKyBkcml2ZXIsIGFsbCBhdHRhY2hlZCBkZXZpY2VzIG11c3Qgc3VwcG9ydCBTQ1NJIHBhcml0eS4gIElmIG5vbmUgb2YgeW91cgorIGRldmljZXMgc3VwcG9ydCBwYXJpdHksIHRoZW4geW91IGNhbiBwcm9iYWJseSBnZXQgdGhlIGRyaXZlciB0byB3b3JrIGJ5CisgdHVybmluZyB0aGlzIG9wdGlvbiBvZmYuICBJIGhhdmUgbm8gd2F5IG9mIHRlc3RpbmcgdGhpcywgaG93ZXZlciwgYW5kIGl0Cisgd291bGQgYXBwZWFyIHRoYXQgbm8gb25lIGV2ZXIgdXNlcyB0aGlzIG9wdGlvbi4KKworIEZJRk9fQ09VTlQ6IFRoZSBob3N0IGFkYXB0ZXIgaGFzIGFuIDhLIGNhY2hlIChob3N0IGFkYXB0ZXJzIGJhc2VkIG9uIHRoZQorIDE4QzMwIGNoaXAgaGF2ZSBhIDJrIGNhY2hlKS4gIFdoZW4gdGhpcyBtYW55IDUxMiBieXRlIGJsb2NrcyBhcmUgZmlsbGVkIGJ5CisgdGhlIFNDU0kgZGV2aWNlLCBhbiBpbnRlcnJ1cHQgd2lsbCBiZSByYWlzZWQuICBUaGVyZWZvcmUsIHRoaXMgY291bGQgYmUgYXMKKyBsb3cgYXMgMCwgb3IgYXMgaGlnaCBhcyAxNi4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdmFsdWVzIHdoaWNoIGFyZSB0b28gaGlnaAorIG9yIHRvbyBsb3cgc2VlbSB0byBwcmV2ZW50IGFueSBpbnRlcnJ1cHRzIGZyb20gb2NjdXJyaW5nLCBhbmQgdGhlcmVieSBsb2NrCisgdXAgdGhlIG1hY2hpbmUuICBJIGhhdmUgZm91bmQgdGhhdCAyIGlzIGEgZ29vZCBudW1iZXIsIGJ1dCB0aHJvdWdocHV0IG1heQorIGJlIGluY3JlYXNlZCBieSBjaGFuZ2luZyB0aGlzIHZhbHVlIHRvIHZhbHVlcyB3aGljaCBhcmUgY2xvc2UgdG8gMi4KKyBQbGVhc2UgbGV0IG1lIGtub3cgaWYgeW91IHRyeSBhbnkgZGlmZmVyZW50IHZhbHVlcy4KKworIFJFU0VMRUNUSU9OOiBUaGlzIGlzIG5vIGxvbmdlciBhbiBvcHRpb24sIHNpbmNlIEkgZ2F2ZSB1cCB0cnlpbmcgdG8KKyBpbXBsZW1lbnQgaXQgaW4gdmVyc2lvbiA0Lnggb2YgdGhpcyBkcml2ZXIuICBJdCBkaWQgbm90IGltcHJvdmUKKyBwZXJmb3JtYW5jZSBhdCBhbGwgYW5kIG1hZGUgdGhlIGRyaXZlciB1bnN0YWJsZSAoYmVjYXVzZSBJIG5ldmVyIGZvdW5kIG9uZQorIG9mIHRoZSB0d28gcmFjZSBjb25kaXRpb25zIHdoaWNoIHdlcmUgaW50cm9kdWNlZCBieSB0aGUgbXVsdGlwbGUKKyBvdXRzdGFuZGluZyBjb21tYW5kIGNvZGUpLiAgVGhlIGluc3RhYmlsaXR5IHNlZW1zIGEgdmVyeSBoaWdoIHByaWNlIHRvIHBheQorIGp1c3Qgc28gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aGUgdGFwZSB0byByZXdpbmQuICBJZiB5b3Ugd2FudAorIHRoaXMgZmVhdHVyZSBpbXBsZW1lbnRlZCwgc2VuZCBtZSBwYXRjaGVzLiAgSSdsbCBiZSBoYXBweSB0byBzZW5kIGEgY29weQorIG9mIG15IChicm9rZW4pIGRyaXZlciB0byBhbnlvbmUgd2hvIHdvdWxkIGxpa2UgdG8gc2VlIGEgY29weS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2luY2x1ZGUgImZkb21haW4uaCIKKworTU9EVUxFX0FVVEhPUigiUmlja2FyZCBFLiBGYWl0aCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGdXR1cmUgZG9tYWluIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyAgCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAgIiRSZXZpc2lvbjogNS41MSAkIgorCisvKiBTVEFSVCBPRiBVU0VSIERFRklOQUJMRSBPUFRJT05TICovCisKKyNkZWZpbmUgREVCVUcgICAgICAgICAgICAwCS8qIEVuYWJsZSBkZWJ1Z2dpbmcgb3V0cHV0ICovCisjZGVmaW5lIEVOQUJMRV9QQVJJVFkgICAgMQkvKiBFbmFibGUgU0NTSSBQYXJpdHkgKi8KKyNkZWZpbmUgRklGT19DT1VOVCAgICAgICAyCS8qIE51bWJlciBvZiA1MTIgYnl0ZSBibG9ja3MgYmVmb3JlIElOVFIgKi8KKworLyogRU5EIE9GIFVTRVIgREVGSU5BQkxFIE9QVElPTlMgKi8KKworI2lmIERFQlVHCisjZGVmaW5lIEVWRVJZX0FDQ0VTUyAgICAgMAkvKiBXcml0ZSBhIGxpbmUgb24gZXZlcnkgc2NzaSBhY2Nlc3MgKi8KKyNkZWZpbmUgRVJST1JTX09OTFkgICAgICAxCS8qIE9ubHkgd3JpdGUgYSBsaW5lIGlmIHRoZXJlIGlzIGFuIGVycm9yICovCisjZGVmaW5lIERFQlVHX0RFVEVDVCAgICAgMAkvKiBEZWJ1ZyBmZG9tYWluXzE2eDBfZGV0ZWN0KCkgKi8KKyNkZWZpbmUgREVCVUdfTUVTU0FHRVMgICAxCS8qIERlYnVnIE1FU1NBR0UgSU4gcGhhc2UgKi8KKyNkZWZpbmUgREVCVUdfQUJPUlQgICAgICAxCS8qIERlYnVnIGFib3J0KCkgcm91dGluZSAqLworI2RlZmluZSBERUJVR19SRVNFVCAgICAgIDEJLyogRGVidWcgcmVzZXQoKSByb3V0aW5lICovCisjZGVmaW5lIERFQlVHX1JBQ0UgICAgICAgMSAgICAgIC8qIERlYnVnIGludGVycnVwdC1kcml2ZW4gcmFjZSBjb25kaXRpb24gKi8KKyNlbHNlCisjZGVmaW5lIEVWRVJZX0FDQ0VTUyAgICAgMAkvKiBMRUFWRSBUSEVTRSBBTE9ORS0tQ0hBTkdFIFRIRSBPTkVTIEFCT1ZFICovCisjZGVmaW5lIEVSUk9SU19PTkxZICAgICAgMAorI2RlZmluZSBERUJVR19ERVRFQ1QgICAgIDAKKyNkZWZpbmUgREVCVUdfTUVTU0FHRVMgICAwCisjZGVmaW5lIERFQlVHX0FCT1JUICAgICAgMAorI2RlZmluZSBERUJVR19SRVNFVCAgICAgIDAKKyNkZWZpbmUgREVCVUdfUkFDRSAgICAgICAwCisjZW5kaWYKKworLyogRXJyb3JzIGFyZSByZXBvcnRlZCBvbiB0aGUgbGluZSwgc28gd2UgZG9uJ3QgbmVlZCB0byByZXBvcnQgdGhlbSBhZ2FpbiAqLworI2lmIEVWRVJZX0FDQ0VTUworI3VuZGVmIEVSUk9SU19PTkxZCisjZGVmaW5lIEVSUk9SU19PTkxZICAgICAgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfUEFSSVRZCisjZGVmaW5lIFBBUklUWV9NQVNLICAgICAgMHgwOAorI2Vsc2UKKyNkZWZpbmUgUEFSSVRZX01BU0sgICAgICAweDAwCisjZW5kaWYKKworZW51bSBjaGlwX3R5cGUgeworICAgdW5rbm93biAgICAgICAgICA9IDB4MDAsCisgICB0bWMxODAwICAgICAgICAgID0gMHgwMSwKKyAgIHRtYzE4YzUwICAgICAgICAgPSAweDAyLAorICAgdG1jMThjMzAgICAgICAgICA9IDB4MDMsCit9OworCitlbnVtIHsKKyAgIGluX2FyYml0cmF0aW9uICAgPSAweDAyLAorICAgaW5fc2VsZWN0aW9uICAgICA9IDB4MDQsCisgICBpbl9vdGhlciAgICAgICAgID0gMHgwOCwKKyAgIGRpc2Nvbm5lY3QgICAgICAgPSAweDEwLAorICAgYWJvcnRlZCAgICAgICAgICA9IDB4MjAsCisgICBzZW50X2lkZW50ICAgICAgID0gMHg0MCwKK307CisKK2VudW0gaW5fcG9ydF90eXBlIHsKKyAgIFJlYWRfU0NTSV9EYXRhICAgPSAgMCwKKyAgIFNDU0lfU3RhdHVzICAgICAgPSAgMSwKKyAgIFRNQ19TdGF0dXMgICAgICAgPSAgMiwKKyAgIEZJRk9fU3RhdHVzICAgICAgPSAgMywJLyogdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworICAgSW50ZXJydXB0X0NvbmQgICA9ICA0LAkvKiB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisgICBMU0JfSURfQ29kZSAgICAgID0gIDUsCisgICBNU0JfSURfQ29kZSAgICAgID0gIDYsCisgICBSZWFkX0xvb3BiYWNrICAgID0gIDcsCisgICBTQ1NJX0RhdGFfTm9BQ0sgID0gIDgsCisgICBJbnRlcnJ1cHRfU3RhdHVzID0gIDksCisgICBDb25maWd1cmF0aW9uMSAgID0gMTAsCisgICBDb25maWd1cmF0aW9uMiAgID0gMTEsCS8qIHRtYzE4YzUwL3RtYzE4YzMwIG9ubHkgKi8KKyAgIFJlYWRfRklGTyAgICAgICAgPSAxMiwKKyAgIEZJRk9fRGF0YV9Db3VudCAgPSAxNAorfTsKKworZW51bSBvdXRfcG9ydF90eXBlIHsKKyAgIFdyaXRlX1NDU0lfRGF0YSAgPSAgMCwKKyAgIFNDU0lfQ250bCAgICAgICAgPSAgMSwKKyAgIEludGVycnVwdF9DbnRsICAgPSAgMiwKKyAgIFNDU0lfTW9kZV9DbnRsICAgPSAgMywKKyAgIFRNQ19DbnRsICAgICAgICAgPSAgNCwKKyAgIE1lbW9yeV9DbnRsICAgICAgPSAgNSwJLyogdG1jMThjNTAvdG1jMThjMzAgb25seSAqLworICAgV3JpdGVfTG9vcGJhY2sgICA9ICA3LAorICAgSU9fQ29udHJvbCAgICAgICA9IDExLAkvKiB0bWMxOGMzMCBvbmx5ICovCisgICBXcml0ZV9GSUZPICAgICAgID0gMTIKK307CisKKy8qIC5ic3Mgd2lsbCB6ZXJvIGFsbCB0aGUgc3RhdGljIHZhcmlhYmxlcyBiZWxvdyAqLworc3RhdGljIGludCAgICAgICAgICAgICAgIHBvcnRfYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICAgICBiaW9zX2Jhc2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICogICAgYmlvc19tZW07CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgYmlvc19tYWpvcjsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBiaW9zX21pbm9yOworc3RhdGljIGludCAgICAgICAgICAgICAgIFBDSV9idXM7CitzdGF0aWMgaW50ICAgICAgICAgICAgICAgUXVhbnR1bTsJLyogUXVhbnR1bSBib2FyZCB2YXJpYW50ICovCitzdGF0aWMgaW50ICAgICAgICAgICAgICAgaW50ZXJydXB0X2xldmVsOworc3RhdGljIHZvbGF0aWxlIGludCAgICAgIGluX2NvbW1hbmQ7CitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAgKmN1cnJlbnRfU0M7CitzdGF0aWMgZW51bSBjaGlwX3R5cGUgICAgY2hpcCAgICAgICAgICAgICAgPSB1bmtub3duOworc3RhdGljIGludCAgICAgICAgICAgICAgIGFkYXB0ZXJfbWFzazsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgICB0aGlzX2lkOworc3RhdGljIGludCAgICAgICAgICAgICAgIHNldHVwX2NhbGxlZDsKKworI2lmIERFQlVHX1JBQ0UKK3N0YXRpYyB2b2xhdGlsZSBpbnQgICAgICBpbl9pbnRlcnJ1cHRfZmxhZzsKKyNlbmRpZgorCitzdGF0aWMgaW50ICAgICAgICAgICAgICAgRklGT19TaXplID0gMHgyMDAwOyAvKiA4ayBGSUZPIGZvcgorCQkJCQkJcHJlLXRtYzE4YzMwIGNoaXBzICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCAgICAgICBkb19mZG9tYWluXzE2eDBfaW50ciggaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzICk7CisvKiBBbGxvdyBpbnNtb2QgcGFyYW1ldGVycyB0byBiZSBsaWtlIExJTE8gcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgorICAgaW5zbW9kIGZkb21haW4gZmRvbWFpbj0weDE0MCwxMSAqLworc3RhdGljIGNoYXIgKiBmZG9tYWluID0gTlVMTDsKK21vZHVsZV9wYXJhbShmZG9tYWluLCBjaGFycCwgMCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFkZHJlc3Nlc1tdID0geworICAgMHhjODAwMCwKKyAgIDB4Y2EwMDAsCisgICAweGNlMDAwLAorICAgMHhkZTAwMCwKKyAgIDB4Y2MwMDAsCQkvKiBFeHRyYSBhZGRyZXNzZXMgZm9yIFBDSSBib2FyZHMgKi8KKyAgIDB4ZDAwMDAsCisgICAweGUwMDAwLAorfTsKKyNkZWZpbmUgQUREUkVTU19DT1VOVCAoc2l6ZW9mKCBhZGRyZXNzZXMgKSAvIHNpemVvZiggdW5zaWduZWQgKSkKKwkJICAgICAgIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW10gPSB7IDB4MTQwLCAweDE1MCwgMHgxNjAsIDB4MTcwIH07CisjZGVmaW5lIFBPUlRfQ09VTlQgKHNpemVvZiggcG9ydHMgKSAvIHNpemVvZiggdW5zaWduZWQgc2hvcnQgKSkKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGludHNbXSA9IHsgMywgNSwgMTAsIDExLCAxMiwgMTQsIDE1LCAwIH07CisKKy8qCisKKyAgUkVBRCBUSElTIEJFRk9SRSBZT1UgQUREIEEgU0lHTkFUVVJFIQorCisgIFJFQURJTkcgVEhJUyBTSE9SVCBOT1RFIENBTiBTQVZFIFlPVSBMT1RTIE9GIFRJTUUhCisKKyAgUkVBRCBFVkVSWSBXT1JELCBFU1BFQ0lBTExZIFRIRSBXT1JEICpOT1QqCisKKyAgVGhpcyBkcml2ZXIgd29ya3MgKk9OTFkqIGZvciBGdXR1cmUgRG9tYWluIGNhcmRzIHVzaW5nIHRoZSBUTUMtMTgwMCwKKyAgVE1DLTE4QzUwLCBvciBUTUMtMThDMzAgY2hpcC4gIFRoaXMgaW5jbHVkZXMgbW9kZWxzIFRNQy0xNjUwLCAxNjYwLCAxNjcwLAorICBhbmQgMTY4MC4gIFRoZXNlIGFyZSBhbGwgMTYtYml0IGNhcmRzLgorCisgIFRoZSBmb2xsb3dpbmcgQklPUyBzaWduYXR1cmUgc2lnbmF0dXJlcyBhcmUgZm9yIGJvYXJkcyB3aGljaCBkbyAqTk9UKgorICB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKHRoZXNlIFRNQy04eHggYW5kIFRNQy05eHggYm9hcmRzIG1heSB3b3JrIHdpdGggdGhlCisgIFNlYWdhdGUgZHJpdmVyKToKKworICBGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5ODggVjQuMEkgMDMvMTYvODgKKyAgRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTg5IFY1LjBDMi8xNC84OQorICBGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5ODkgVjYuMEE3LzI4Lzg5CisgIEZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCBWNi4wMTA1LzMxLzkwCisgIEZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCBWNi4wMjA5LzE4LzkwCisgIEZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCBWNy4wMDkvMTgvOTAKKyAgRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk5MiBWOC4wMC4wMDQvMDIvOTIKKworICAoVGhlIGNhcmRzIHdoaWNoIGRvICpOT1QqIHdvcmsgYXJlIGFsbCA4LWJpdCBjYXJkcyAtLSBhbHRob3VnaCBzb21lIG9mCisgIHRoZW0gaGF2ZSBhIDE2LWJpdCBmb3JtLWZhY3RvciwgdGhlIHVwcGVyIDgtYml0cyBhcmUgdXNlZCBvbmx5IGZvciBJUlFzCisgIGFuZCBhcmUgKk5PVCogdXNlZCBmb3IgZGF0YS4gIFlvdSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBieSBmb2xsb3dpbmcKKyAgdGhlIHRyYWNpbmdzIG9uIHRoZSBjaXJjdWl0IGJvYXJkIC0tIGlmIG9ubHkgdGhlIElSUSBsaW5lcyBhcmUgaW52b2x2ZWQsCisgIHlvdSBoYXZlIGEgIjgtYml0IiBjYXJkLCBhbmQgc2hvdWxkICpOT1QqIHVzZSB0aGlzIGRyaXZlci4pCisKKyovCisKK3N0YXRpYyBzdHJ1Y3Qgc2lnbmF0dXJlIHsKKyAgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZTsKKyAgIGludCAgc2lnX29mZnNldDsKKyAgIGludCAgc2lnX2xlbmd0aDsKKyAgIGludCAgbWFqb3JfYmlvc192ZXJzaW9uOworICAgaW50ICBtaW5vcl9iaW9zX3ZlcnNpb247CisgICBpbnQgIGZsYWc7IC8qIDEgPT0gUENJX2J1cywgMiA9PSBJU0FfMjAwUywgMyA9PSBJU0FfMjUwTUcsIDQgPT0gSVNBXzIwMFMgKi8KK30gc2lnbmF0dXJlc1tdID0geworICAgLyogICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAgICAgICAgNCAgICAgICAgIDUgICAgICAgICA2ICovCisgICAvKiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgKi8KKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCAxODAwLVYyLjA3LzI4Lzg5IiwgIDUsIDUwLCAgMiwgIDAsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCAxODAwLVYxLjA3LzI4Lzg5IiwgIDUsIDUwLCAgMiwgIDAsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCAxODAwLVYyLjA3LzI4Lzg5IiwgNzIsIDUwLCAgMiwgIDAsIDIgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk5MCAxODAwLVYyLjAiLCAgICAgICAgNzMsIDQzLCAgMiwgIDAsIDMgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5OTEgMTgwMC1WMi4wLiIsICAgICAgICAgICAgNzIsIDM5LCAgMiwgIDAsIDQgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5OTIgVjMuMDAuMDA0LzAyLzkyIiwgICAgICAgIDUsIDQ0LCAgMywgIDAsIDAgfSwKKyAgIHsgIkZVVFVSRSBET01BSU4gVE1DLTE4WFggKEMpIDE5OTMgVjMuMjAzLzEyLzkzIiwgICAgICAgIDUsIDQ0LCAgMywgIDIsIDAgfSwKKyAgIHsgIklCTSBGMSBQMiBCSU9TIHYxLjAxMDQvMjkvOTMiLCAgICAgICAgICAgICAgICAgICAgICAgIDUsIDI4LCAgMywgLTEsIDAgfSwKKyAgIHsgIkZ1dHVyZSBEb21haW4gQ29ycC4gVjEuMDAwOC8xOC85MyIsICAgICAgICAgICAgICAgICAgIDUsIDMzLCAgMywgIDQsIDAgfSwKKyAgIHsgIkZ1dHVyZSBEb21haW4gQ29ycC4gVjEuMDAwOC8xOC85MyIsICAgICAgICAgICAgICAgICAgMjYsIDMzLCAgMywgIDQsIDEgfSwKKyAgIHsgIkFkYXB0ZWMgQUhBLTI5MjAgUENJLVNDU0kgQ2FyZCIsICAgICAgICAgICAgICAgICAgICAgNDIsIDMxLCAgMywgLTEsIDEgfSwKKyAgIHsgIklCTSBGMSBQMjY0LzMyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDE0LCAgMywgLTEsIDEgfSwKKwkJCQkvKiBUaGlzIG5leHQgc2lnbmF0dXJlIG1heSBub3QgYmUgYSAzLjUgYmlvcyAqLworICAgeyAiRnV0dXJlIERvbWFpbiBDb3JwLiBWMi4wMTA4LzE4LzkzIiwgICAgICAgICAgICAgICAgICAgNSwgMzMsICAzLCAgNSwgMCB9LAorICAgeyAiRlVUVVJFIERPTUFJTiBDT1JQLiAgVjMuNTAwOC8xOC85MyIsICAgICAgICAgICAgICAgICAgNSwgMzQsICAzLCAgNSwgMCB9LAorICAgeyAiRlVUVVJFIERPTUFJTiAxOGMzMC8xOGM1MC8xODAwIChDKSAxOTk0IFYzLjUiLCAgICAgICAgNSwgNDQsICAzLCAgNSwgMCB9LAorICAgeyAiRlVUVVJFIERPTUFJTiBDT1JQLiAgVjMuNjAwOC8xOC85MyIsICAgICAgICAgICAgICAgICAgNSwgMzQsICAzLCAgNiwgMCB9LAorICAgeyAiRlVUVVJFIERPTUFJTiBDT1JQLiAgVjMuNjEwOC8xOC85MyIsICAgICAgICAgICAgICAgICAgNSwgMzQsICAzLCAgNiwgMCB9LAorICAgeyAiRlVUVVJFIERPTUFJTiBUTUMtMThYWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMjIsIC0xLCAtMSwgMCB9LAorCisgICAvKiBSRUFEIE5PVElDRSBBQk9WRSAqQkVGT1JFKiBZT1UgV0FTVEUgWU9VUiBUSU1FIEFERElORyBBIFNJR05BVFVSRQorICAgIEFsc28sIGZpeCB0aGUgZGlzayBnZW9tZXRyeSBjb2RlIGZvciB5b3VyIHNpZ25hdHVyZSBhbmQgc2VuZCB5b3VyCisgICAgY2hhbmdlcyBmb3IgZmFpdGhAY3MudW5jLmVkdS4gIEFib3ZlIGFsbCwgZG8gKk5PVCogY2hhbmdlIGFueSBvbGQKKyAgICBzaWduYXR1cmVzIQorCisgICAgTm90ZSB0aGF0IHRoZSBsYXN0IGxpbmUgd2lsbCBtYXRjaCBhICJnZW5lcmljIiAxOFhYIGJpb3MuICBCZWNhdXNlCisgICAgRnV0dXJlIERvbWFpbiBoYXMgY2hhbmdlZCB0aGUgaG9zdCBTQ1NJIElEIGFuZC9vciB0aGUgbG9jYXRpb24gb2YgdGhlCisgICAgZ2VvbWV0cnkgaW5mb3JtYXRpb24gaW4gdGhlIG9uLWJvYXJkIFJBTSBhcmVhIGZvciBlYWNoIG9mIHRoZSBmaXJzdAorICAgIHRocmVlIEJJT1MncywgaXQgaXMgc3RpbGwgaW1wb3J0YW50IHRvIGVudGVyIGEgZnVsbHkgcXVhbGlmaWVkCisgICAgc2lnbmF0dXJlIGluIHRoZSB0YWJsZSBmb3IgYW55IG5ldyBCSU9TJ3MgKGFmdGVyIHRoZSBob3N0IFNDU0kgSUQgYW5kCisgICAgZ2VvbWV0cnkgbG9jYXRpb24gYXJlIHZlcmlmaWVkKS4gKi8KK307CisKKyNkZWZpbmUgU0lHTkFUVVJFX0NPVU5UIChzaXplb2YoIHNpZ25hdHVyZXMgKSAvIHNpemVvZiggc3RydWN0IHNpZ25hdHVyZSApKQorCitzdGF0aWMgdm9pZCBwcmludF9iYW5uZXIoIHN0cnVjdCBTY3NpX0hvc3QgKnNocG50ICkKK3sKKyAgIGlmICghc2hwbnQpIHJldHVybjsJCS8qIFRoaXMgd29uJ3QgZXZlciBoYXBwZW4gKi8KKworICAgaWYgKGJpb3NfbWFqb3IgPCAwICYmIGJpb3NfbWlub3IgPCAwKSB7CisgICAgICBwcmludGsoS0VSTl9JTkZPICJzY3NpJWQ6IDxmZG9tYWluPiBObyBCSU9TOyB1c2luZyBzY3NpIGlkICVkXG4iLAorCSAgICAgIHNocG50LT5ob3N0X25vLCBzaHBudC0+dGhpc19pZCk7CisgICB9IGVsc2UgeworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiA8ZmRvbWFpbj4gQklPUyB2ZXJzaW9uICIsIHNocG50LT5ob3N0X25vKTsKKworICAgICAgaWYgKGJpb3NfbWFqb3IgPj0gMCkgcHJpbnRrKCIlZC4iLCBiaW9zX21ham9yKTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgIHByaW50aygiPy4iKTsKKworICAgICAgaWYgKGJpb3NfbWlub3IgPj0gMCkgcHJpbnRrKCIlZCIsIGJpb3NfbWlub3IpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgcHJpbnRrKCI/LiIpOworICAgCisgICAgICBwcmludGsoICIgYXQgMHglbHggdXNpbmcgc2NzaSBpZCAlZFxuIiwKKwkgICAgICBiaW9zX2Jhc2UsIHNocG50LT50aGlzX2lkICk7CisgICB9CisKKwkJCQkvKiBJZiB0aGlzIGRyaXZlciB3b3JrcyBmb3IgbGF0ZXIgRkQgUENJCisJCQkJICAgYm9hcmRzLCB3ZSB3aWxsIGhhdmUgdG8gbW9kaWZ5IGJhbm5lcgorCQkJCSAgIGZvciBhZGRpdGlvbmFsIFBDSSBjYXJkcywgYnV0IGZvciBub3cgaWYKKwkJCQkgICBpdCdzIFBDSSBpdCdzIGEgVE1DLTMyNjAgLSBKVE0gKi8KKyAgIHByaW50ayhLRVJOX0lORk8gInNjc2klZDogPGZkb21haW4+ICVzIGNoaXAgYXQgMHgleCBpcnEgIiwKKwkgICBzaHBudC0+aG9zdF9ubywKKwkgICBjaGlwID09IHRtYzE4MDAgPyAiVE1DLTE4MDAiIDogKGNoaXAgPT0gdG1jMThjNTAgPyAiVE1DLTE4QzUwIiA6IChjaGlwID09IHRtYzE4YzMwID8gKFBDSV9idXMgPyAiVE1DLTM2QzcwIChQQ0kgYnVzKSIgOiAiVE1DLTE4QzMwIikgOiAiVW5rbm93biIpKSwKKwkgICBwb3J0X2Jhc2UpOworCisgICBpZiAoaW50ZXJydXB0X2xldmVsKQorICAgCXByaW50aygiJWQiLCBpbnRlcnJ1cHRfbGV2ZWwpOworICAgZWxzZQorICAgICAgICBwcmludGsoIjxub25lPiIpOworCisgICBwcmludGsoICJcbiIgKTsKK30KKworaW50IGZkb21haW5fc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzRdOworCisJKHZvaWQpZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlmIChzZXR1cF9jYWxsZWQrKyB8fCBpbnRzWzBdIDwgMiB8fCBpbnRzWzBdID4gMykgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpOiA8ZmRvbWFpbj4gVXNhZ2U6IGZkb21haW49PFBPUlRfQkFTRT4sPElSUT5bLDxBREFQVEVSX0lEPl1cbiIpOworCQlwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBCYWQgTElMTy9JTlNNT0QgcGFyYW1ldGVycz9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwb3J0X2Jhc2UgICAgICAgPSBpbnRzWzBdID49IDEgPyBpbnRzWzFdIDogMDsKKwlpbnRlcnJ1cHRfbGV2ZWwgPSBpbnRzWzBdID49IDIgPyBpbnRzWzJdIDogMDsKKwl0aGlzX2lkICAgICAgICAgPSBpbnRzWzBdID49IDMgPyBpbnRzWzNdIDogMDsKKyAgIAorCWJpb3NfbWFqb3IgPSBiaW9zX21pbm9yID0gLTE7IC8qIFVzZSBnZW9tZXRyeSBmb3IgQklPUyB2ZXJzaW9uID49IDMuNCAqLworCSsrc2V0dXBfY2FsbGVkOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJmZG9tYWluPSIsIGZkb21haW5fc2V0dXApOworCisKK3N0YXRpYyB2b2lkIGRvX3BhdXNlKHVuc2lnbmVkIGFtb3VudCkJLyogUGF1c2UgZm9yIGFtb3VudCoxMCBtaWxsaXNlY29uZHMgKi8KK3sKKwltZGVsYXkoMTAqYW1vdW50KTsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkIGZkb21haW5fbWFrZV9idXNfaWRsZSggdm9pZCApCit7CisgICBvdXRiKDAsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7CisgICBvdXRiKDAsIHBvcnRfYmFzZSArIFNDU0lfTW9kZV9DbnRsKTsKKyAgIGlmIChjaGlwID09IHRtYzE4YzUwIHx8IGNoaXAgPT0gdG1jMThjMzApCisJIG91dGIoMHgyMSB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7IC8qIENsZWFyIGZvcmNlZCBpbnRyLiAqLworICAgZWxzZQorCSBvdXRiKDB4MDEgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOworfQorCitzdGF0aWMgaW50IGZkb21haW5faXNfdmFsaWRfcG9ydCggaW50IHBvcnQgKQoreworI2lmIERFQlVHX0RFVEVDVCAKKyAgIHByaW50ayggIiAoJXgleCksIiwKKwkgICBpbmIoIHBvcnQgKyBNU0JfSURfQ29kZSApLCBpbmIoIHBvcnQgKyBMU0JfSURfQ29kZSApICk7CisjZW5kaWYKKworICAgLyogVGhlIE1DQSBJRCBpcyBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBNQ0EgY29tcGF0aWJsZSBib2FyZC4gIFdlCisgICAgICBhcmUgdXNpbmcgSVNBIGJvYXJkcywgYnV0IEZ1dHVyZSBEb21haW4gcHJvdmlkZXMgdGhlIE1DQSBJRAorICAgICAgYW55d2F5LiAgV2UgY2FuIHVzZSB0aGlzIElEIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgYSBGdXR1cmUKKyAgICAgIERvbWFpbiBUTUMtMTY2MC9UTUMtMTY4MC4KKyAgICAqLworCisgICBpZiAoaW5iKCBwb3J0ICsgTFNCX0lEX0NvZGUgKSAhPSAweGU5KSB7IC8qIHRlc3QgZm9yIDB4NjEyNyBpZCAqLworICAgICAgaWYgKGluYiggcG9ydCArIExTQl9JRF9Db2RlICkgIT0gMHgyNykgcmV0dXJuIDA7CisgICAgICBpZiAoaW5iKCBwb3J0ICsgTVNCX0lEX0NvZGUgKSAhPSAweDYxKSByZXR1cm4gMDsKKyAgICAgIGNoaXAgPSB0bWMxODAwOworICAgfSBlbHNlIHsJCQkJICAgIC8qIHRlc3QgZm9yIDB4ZTk2MCBpZCAqLworICAgICAgaWYgKGluYiggcG9ydCArIE1TQl9JRF9Db2RlICkgIT0gMHg2MCkgcmV0dXJuIDA7CisgICAgICBjaGlwID0gdG1jMThjNTA7CisKKwkJCQkvKiBUcnkgdG8gdG9nZ2xlIDMyLWJpdCBtb2RlLiAgVGhpcyBvbmx5CisJCQkJICAgd29ya3Mgb24gYW4gMThjMzAgY2hpcC4gIChVc2VyIHJlcG9ydHMKKwkJCQkgICBzYXkgdGhpcyB3b3Jrcywgc28gd2Ugc2hvdWxkIHN3aXRjaCB0bworCQkJCSAgIGl0IGluIHRoZSBuZWFyIGZ1dHVyZS4pICovCisKKyAgICAgIG91dGIoIDB4ODAsIHBvcnQgKyBJT19Db250cm9sICk7CisgICAgICBpZiAoKGluYiggcG9ydCArIENvbmZpZ3VyYXRpb24yICkgJiAweDgwKSA9PSAweDgwKSB7CisJIG91dGIoIDB4MDAsIHBvcnQgKyBJT19Db250cm9sICk7CisJIGlmICgoaW5iKCBwb3J0ICsgQ29uZmlndXJhdGlvbjIgKSAmIDB4ODApID09IDB4MDApIHsKKwkgICAgY2hpcCA9IHRtYzE4YzMwOworCSAgICBGSUZPX1NpemUgPSAweDgwMDsJLyogMmsgRklGTyAqLworCSB9CisgICAgICB9CisJCQkJLyogSWYgdGhhdCBmYWlsZWQsIHdlIGFyZSBhbiAxOGM1MC4gKi8KKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmRvbWFpbl90ZXN0X2xvb3BiYWNrKCB2b2lkICkKK3sKKyAgIGludCBpOworICAgaW50IHJlc3VsdDsKKworICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisgICAgICBvdXRiKCBpLCBwb3J0X2Jhc2UgKyBXcml0ZV9Mb29wYmFjayApOworICAgICAgcmVzdWx0ID0gaW5iKCBwb3J0X2Jhc2UgKyBSZWFkX0xvb3BiYWNrICk7CisgICAgICBpZiAoaSAhPSByZXN1bHQpCisJICAgIHJldHVybiAxOworICAgfQorICAgcmV0dXJuIDA7Cit9CisKKy8qIGZkb21haW5fZ2V0X2lycSBhc3N1bWVzIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIE1DQSBJRCBmb3IgYQorICAgVE1DLTE2NjAvVE1DLTE2ODAgRnV0dXJlIERvbWFpbiBib2FyZC4gIE5vdywgY2hlY2sgdG8gYmUgc3VyZSB0aGUKKyAgIGJpb3NfYmFzZSBtYXRjaGVzIHRoZXNlIHBvcnRzLiAgSWYgc29tZW9uZSB3YXMgdW5sdWNreSBlbm91Z2ggdG8gaGF2ZQorICAgcHVyY2hhc2VkIG1vcmUgdGhhbiBvbmUgRnV0dXJlIERvbWFpbiBib2FyZCwgdGhlbiB0aGV5IHdpbGwgaGF2ZSB0bworICAgbW9kaWZ5IHRoaXMgY29kZSwgYXMgd2Ugb25seSBkZXRlY3Qgb25lIGJvYXJkIGhlcmUuICBbVGhlIG9uZSB3aXRoIHRoZQorICAgbG93ZXN0IGJpb3NfYmFzZS5dCisKKyAgIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgaXMgb25seSB1c2VkIGZvciBzeXN0ZW1zIHdpdGhvdXQgYSBQQ0kgQklPUzMyCisgICAoZS5nLiwgSVNBIGJ1cykuICBGb3IgUENJIGJ1cyBzeXN0ZW1zLCB0aGlzIHJvdXRpbmUgd2lsbCBsaWtlbHkgZmFpbAorICAgdW5sZXNzIG9uZSBvZiB0aGUgSVJRcyBsaXN0ZWQgaW4gdGhlIGludHMgYXJyYXkgaXMgdXNlZCBieSB0aGUgYm9hcmQuCisgICBTb21ldGltZXMgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBjb21wdXRlcidzIEJJT1Mgc2V0dXAgc2NyZWVuIHRvCisgICBjb25maWd1cmUgYSBQQ0kgc3lzdGVtIHNvIHRoYXQgb25lIG9mIHRoZXNlIElSUXMgd2lsbCBiZSB1c2VkIGJ5IHRoZQorICAgRnV0dXJlIERvbWFpbiBjYXJkLiAqLworCitzdGF0aWMgaW50IGZkb21haW5fZ2V0X2lycSggaW50IGJhc2UgKQoreworICAgaW50IG9wdGlvbnMgPSBpbmIoYmFzZSArIENvbmZpZ3VyYXRpb24xKTsKKworI2lmIERFQlVHX0RFVEVDVAorICAgcHJpbnRrKCJzY3NpOiA8ZmRvbWFpbj4gT3B0aW9ucyA9ICV4XG4iLCBvcHRpb25zKTsKKyNlbmRpZgorIAorICAgLyogQ2hlY2sgZm9yIGJvYXJkIHdpdGggbG93ZXN0IGJpb3NfYmFzZSAtLQorICAgICAgdGhpcyBpc24ndCB2YWxpZCBmb3IgdGhlIDE4YzMwIG9yIGZvcgorICAgICAgYm9hcmRzIG9uIHRoZSBQQ0kgYnVzLCBzbyBqdXN0IGFzc3VtZSB3ZQorICAgICAgaGF2ZSB0aGUgcmlnaHQgYm9hcmQuICovCisKKyAgIGlmIChjaGlwICE9IHRtYzE4YzMwICYmICFQQ0lfYnVzICYmIGFkZHJlc3Nlc1sob3B0aW9ucyAmIDB4YzApID4+IDYgXSAhPSBiaW9zX2Jhc2UpCisgICAJcmV0dXJuIDA7CisgICByZXR1cm4gaW50c1sob3B0aW9ucyAmIDB4MGUpID4+IDFdOworfQorCitzdGF0aWMgaW50IGZkb21haW5faXNhX2RldGVjdCggaW50ICppcnEsIGludCAqaW9iYXNlICkKK3sKKyNpZm5kZWYgUENNQ0lBCisgICBpbnQgaSwgajsKKyAgIGludCBiYXNlID0gMHhkZWFkYmVlZjsKKyAgIGludCBmbGFnID0gMDsKKworI2lmIERFQlVHX0RFVEVDVAorICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IGZkb21haW5faXNhX2RldGVjdDoiICk7CisjZW5kaWYKKworICAgZm9yIChpID0gMDsgaSA8IEFERFJFU1NfQ09VTlQ7IGkrKykgeworICAgICAgdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcChhZGRyZXNzZXNbaV0sIDB4MjAwMCk7CisgICAgICBpZiAoIXApCisJY29udGludWU7CisjaWYgREVCVUdfREVURUNUCisgICAgICBwcmludGsoICIgJWx4KCVseCksIiwgYWRkcmVzc2VzW2ldLCBiaW9zX2Jhc2UgKTsKKyNlbmRpZgorICAgICAgZm9yIChqID0gMDsgaiA8IFNJR05BVFVSRV9DT1VOVDsgaisrKSB7CisJIGlmIChjaGVja19zaWduYXR1cmUocCArIHNpZ25hdHVyZXNbal0uc2lnX29mZnNldCwKKwkJCSAgICAgc2lnbmF0dXJlc1tqXS5zaWduYXR1cmUsCisJCQkgICAgIHNpZ25hdHVyZXNbal0uc2lnX2xlbmd0aCApKSB7CisJICAgIGJpb3NfbWFqb3IgPSBzaWduYXR1cmVzW2pdLm1ham9yX2Jpb3NfdmVyc2lvbjsKKwkgICAgYmlvc19taW5vciA9IHNpZ25hdHVyZXNbal0ubWlub3JfYmlvc192ZXJzaW9uOworCSAgICBQQ0lfYnVzICAgID0gKHNpZ25hdHVyZXNbal0uZmxhZyA9PSAxKTsKKwkgICAgUXVhbnR1bSAgICA9IChzaWduYXR1cmVzW2pdLmZsYWcgPiAxKSA/IHNpZ25hdHVyZXNbal0uZmxhZyA6IDA7CisJICAgIGJpb3NfYmFzZSAgPSBhZGRyZXNzZXNbaV07CisJICAgIGJpb3NfbWVtICAgPSBwOworCSAgICBnb3RvIGZvdW5kOworCSB9CisgICAgICB9CisgICAgICBpb3VubWFwKHApOworICAgfQorIAorZm91bmQ6CisgICBpZiAoYmlvc19tYWpvciA9PSAyKSB7CisgICAgICAvKiBUaGUgVE1DLTE2NjAvVE1DLTE2ODAgaGFzIGEgUkFNIGFyZWEganVzdCBhZnRlciB0aGUgQklPUyBST00uCisJIEFzc3VtaW5nIHRoZSBST00gaXMgZW5hYmxlZCAob3RoZXJ3aXNlIHdlIHdvdWxkbid0IGhhdmUgYmVlbgorCSBhYmxlIHRvIHJlYWQgdGhlIFJPTSBzaWduYXR1cmUgOi0pLCB0aGVuIHRoZSBST00gc2V0cyB1cCB0aGUKKwkgUkFNIGFyZWEgd2l0aCBzb21lIG1hZ2ljIG51bWJlcnMsIHN1Y2ggYXMgYSBsaXN0IG9mIHBvcnQKKwkgYmFzZSBhZGRyZXNzZXMgYW5kIGEgbGlzdCBvZiB0aGUgZGlzayAiZ2VvbWV0cnkiIHJlcG9ydGVkIHRvCisJIERPUyAodGhpcyBnZW9tZXRyeSBoYXMgbm90aGluZyB0byBkbyB3aXRoIHBoeXNpY2FsIGdlb21ldHJ5KS4KKyAgICAgICAqLworCisgICAgICBzd2l0Y2ggKFF1YW50dW0pIHsKKyAgICAgIGNhc2UgMjoJCQkvKiBJU0FfMjAwUyAqLworICAgICAgY2FzZSAzOgkJCS8qIElTQV8yNTBNRyAqLworCSBiYXNlID0gcmVhZGIoYmlvc19tZW0gKyAweDFmYTIpICsgKHJlYWRiKGJpb3NfbWVtICsgMHgxZmEzKSA8PCA4KTsKKwkgYnJlYWs7CisgICAgICBjYXNlIDQ6CQkJLyogSVNBXzIwMFMgKGFub3RoZXIgb25lKSAqLworCSBiYXNlID0gcmVhZGIoYmlvc19tZW0gKyAweDFmYTMpICsgKHJlYWRiKGJpb3NfbWVtICsgMHgxZmE0KSA8PCA4KTsKKwkgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSBiYXNlID0gcmVhZGIoYmlvc19tZW0gKyAweDFmY2MpICsgKHJlYWRiKGJpb3NfbWVtICsgMHgxZmNkKSA8PCA4KTsKKwkgYnJlYWs7CisgICAgICB9CisgICAKKyNpZiBERUJVR19ERVRFQ1QKKyAgICAgIHByaW50ayggIiAleCwiLCBiYXNlICk7CisjZW5kaWYKKworICAgICAgZm9yIChpID0gMDsgaSA8IFBPUlRfQ09VTlQ7IGkrKykgeworCWlmIChiYXNlID09IHBvcnRzW2ldKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgMHgxMCwgImZkb21haW4iKSkKKwkJCWJyZWFrOworCQlpZiAoIWZkb21haW5faXNfdmFsaWRfcG9ydChiYXNlKSkgeworCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgMHgxMCk7CisJCQlicmVhazsKKwkJfQorCQkqaXJxICAgID0gZmRvbWFpbl9nZXRfaXJxKCBiYXNlICk7CisJCSppb2Jhc2UgPSBiYXNlOworCQlyZXR1cm4gMTsKKwl9CisgICAgICB9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBiYWQgc2lnbi4gIEl0IHVzdWFsbHkgbWVhbnMgdGhhdCBzb21lb25lIHBhdGNoZWQgdGhlCisJIEJJT1Mgc2lnbmF0dXJlIGxpc3QgKHRoZSBzaWduYXR1cmVzIHZhcmlhYmxlKSB0byBjb250YWluIGEgQklPUworCSBzaWduYXR1cmUgZm9yIGEgYm9hcmQgKk9USEVSIFRIQU4qIHRoZSBUTUMtMTY2MC9UTUMtMTY4MC4gKi8KKyAgICAgIAorI2lmIERFQlVHX0RFVEVDVAorICAgICAgcHJpbnRrKCAiIFJBTSBGQUlMRUQsICIgKTsKKyNlbmRpZgorICAgfQorCisgICAvKiBBbnl3YXksIHRoZSBhbHRlcm5hdGl2ZSB0byBmaW5kaW5nIHRoZSBhZGRyZXNzIGluIHRoZSBSQU0gaXMgdG8ganVzdAorICAgICAgc2VhcmNoIHRocm91Z2ggZXZlcnkgcG9zc2libGUgcG9ydCBhZGRyZXNzIGZvciBvbmUgdGhhdCBpcyBhdHRhY2hlZAorICAgICAgdG8gdGhlIEZ1dHVyZSBEb21haW4gY2FyZC4gIERvbid0IHBhbmljLCB0aG91Z2gsIGFib3V0IHJlYWRpbmcgYWxsCisgICAgICB0aGVzZSByYW5kb20gcG9ydCBhZGRyZXNzZXMgLS0gdGhlcmUgYXJlIHJ1bW9ycyB0aGF0IHRoZSBGdXR1cmUKKyAgICAgIERvbWFpbiBCSU9TIGRvZXMgc29tZXRoaW5nIHZlcnkgc2ltaWxhci4KKworICAgICAgRG8gbm90LCBob3dldmVyLCBjaGVjayBwb3J0cyB3aGljaCB0aGUga2VybmVsIGtub3dzIGFyZSBiZWluZyB1c2VkIGJ5CisgICAgICBhbm90aGVyIGRyaXZlci4gKi8KKworICAgZm9yIChpID0gMDsgaSA8IFBPUlRfQ09VTlQ7IGkrKykgeworICAgICAgYmFzZSA9IHBvcnRzW2ldOworICAgICAgaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCAweDEwLCAiZmRvbWFpbiIpKSB7CisjaWYgREVCVUdfREVURUNUCisJIHByaW50ayggIiAoJXggaW51c2UpLCIsIGJhc2UgKTsKKyNlbmRpZgorCSBjb250aW51ZTsKKyAgICAgIH0KKyNpZiBERUJVR19ERVRFQ1QKKyAgICAgIHByaW50ayggIiAleCwiLCBiYXNlICk7CisjZW5kaWYKKyAgICAgIGZsYWcgPSBmZG9tYWluX2lzX3ZhbGlkX3BvcnQoYmFzZSk7CisgICAgICBpZiAoZmxhZykKKwlicmVhazsKKyAgICAgIHJlbGVhc2VfcmVnaW9uKGJhc2UsIDB4MTApOworICAgfQorCisjaWYgREVCVUdfREVURUNUCisgICBpZiAoZmxhZykgcHJpbnRrKCAiIFNVQ0NFU1NcbiIgKTsKKyAgIGVsc2UgICAgICBwcmludGsoICIgRkFJTFVSRVxuIiApOworI2VuZGlmCisKKyAgIGlmICghZmxhZykgcmV0dXJuIDA7CQkvKiBpb2Jhc2Ugbm90IGZvdW5kICovCisKKyAgICppcnEgICAgPSBmZG9tYWluX2dldF9pcnEoIGJhc2UgKTsKKyAgICppb2Jhc2UgPSBiYXNlOworCisgICByZXR1cm4gMTsJCQkvKiBzdWNjZXNzICovCisjZWxzZQorICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyogUENJIGRldGVjdGlvbiBmdW5jdGlvbjogaW50IGZkb21haW5fcGNpX2Jpb3NfZGV0ZWN0KGludCogaXJxLCBpbnQqCisgICBpb2Jhc2UpIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgSW50ZXJydXB0IExldmVsIGFuZCBJL08gYmFzZSBhZGRyZXNzIGZyb20KKyAgIHRoZSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IGZkb21haW5fcGNpX2Jpb3NfZGV0ZWN0KCBpbnQgKmlycSwgaW50ICppb2Jhc2UsIHN0cnVjdCBwY2lfZGV2ICoqcmV0X3BkZXYgKQoreworICAgdW5zaWduZWQgaW50ICAgICBwY2lfaXJxOyAgICAgICAgICAgICAgICAvKiBQQ0kgaW50ZXJydXB0IGxpbmUgKi8KKyAgIHVuc2lnbmVkIGxvbmcgICAgcGNpX2Jhc2U7ICAgICAgICAgICAgICAgLyogUENJIEkvTyBiYXNlIGFkZHJlc3MgKi8KKyAgIHN0cnVjdCBwY2lfZGV2ICAgKnBkZXYgPSBOVUxMOworCisjaWYgREVCVUdfREVURUNUCisgICAvKiBUZWxsIGhvdyB0byBwcmludCBhIGxpc3Qgb2YgdGhlIGtub3duIFBDSSBkZXZpY2VzIGZyb20gYmlvczMyIGFuZAorICAgICAgbGlzdCB2ZW5kb3IgYW5kIGRldmljZSBJRHMgYmVpbmcgdXNlZCBpZiBpbiBkZWJ1ZyBtb2RlLiAgKi8KKyAgICAgIAorICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IElORk86IHVzZSBsc3BjaSAtdiB0byBzZWUgbGlzdCBvZiBQQ0kgZGV2aWNlc1xuIiApOworICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IFRNQy0zMjYwIGRldGVjdDoiCisJICAgIiBVc2luZyBWZW5kb3IgSUQ6IDB4JXggYW5kIERldmljZSBJRDogMHgleFxuIiwKKwkgICBQQ0lfVkVORE9SX0lEX0ZELCAKKwkgICBQQ0lfREVWSUNFX0lEX0ZEXzM2QzcwICk7CisjZW5kaWYgCisKKyAgIGlmICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0ZELCBQQ0lfREVWSUNFX0lEX0ZEXzM2QzcwLCBwZGV2KSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHJldHVybiAwOworICAgICAgIAorI2lmIERFQlVHX0RFVEVDVAorICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IFRNQy0zMjYwIGRldGVjdDoiCisJICAgIiBQQ0kgYnVzICV1LCBkZXZpY2UgJXUsIGZ1bmN0aW9uICV1XG4iLAorCSAgIHBkZXYtPmJ1cy0+bnVtYmVyLAorCSAgIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKKwkgICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworI2VuZGlmCisKKyAgIC8qIFdlIG5vdyBoYXZlIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgZnVuY3Rpb24gZm9yIHRoZSBGRCBib2FyZCBzbyB3ZQorICAgICAganVzdCByZWFkIHRoZSBQQ0kgY29uZmlnIGluZm8gZnJvbSB0aGUgcmVnaXN0ZXJzLiAgKi8KKworICAgcGNpX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisgICBwY2lfaXJxID0gcGRldi0+aXJxOworCisgICBpZiAoIXJlcXVlc3RfcmVnaW9uKCBwY2lfYmFzZSwgMHgxMCwgImZkb21haW4iICkpCisJcmV0dXJuIDA7CisKKyAgIC8qIE5vdyB3ZSBoYXZlIHRoZSBJL08gYmFzZSBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgZnJvbSB0aGUgUENJCisgICAgICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KKworICAgKmlycSAgICA9IHBjaV9pcnE7CisgICAqaW9iYXNlID0gcGNpX2Jhc2U7CisgICAqcmV0X3BkZXYgPSBwZGV2OworCisjaWYgREVCVUdfREVURUNUCisgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gVE1DLTMyNjAgZGV0ZWN0OiIKKwkgICAiIElSUSA9ICVkLCBJL08gYmFzZSA9IDB4JXggWzB4JWx4XVxuIiwgKmlycSwgKmlvYmFzZSwgcGNpX2Jhc2UgKTsKKyNlbmRpZgorCisgICBpZiAoIWZkb21haW5faXNfdmFsaWRfcG9ydChwY2lfYmFzZSkpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IFBDSSBjYXJkIGRldGVjdGVkLCBidXQgZHJpdmVyIG5vdCBsb2FkZWQgKGludmFsaWQgcG9ydClcbiIgKTsKKyAgICAgIHJlbGVhc2VfcmVnaW9uKHBjaV9iYXNlLCAweDEwKTsKKyAgICAgIHJldHVybiAwOworICAgfQorCisJCQkJLyogRmlsbCBpbiBhIGZldyBnbG9iYWwgdmFyaWFibGVzLiAgVWdoLiAqLworICAgYmlvc19tYWpvciA9IGJpb3NfbWlub3IgPSAtMTsKKyAgIFBDSV9idXMgICAgPSAxOworICAgUXVhbnR1bSAgICA9IDA7CisgICBiaW9zX2Jhc2UgID0gMDsKKyAgIAorICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RydWN0IFNjc2lfSG9zdCAqX19mZG9tYWluXzE2eDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQgKQoreworICAgaW50ICAgICAgICAgICAgICByZXRjb2RlOworICAgc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CisgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKyAgIGlmIChzZXR1cF9jYWxsZWQpIHsKKyNpZiBERUJVR19ERVRFQ1QKKyAgICAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBObyBCSU9TLCB1c2luZyBwb3J0X2Jhc2UgPSAweCV4LCBpcnEgPSAlZFxuIiwKKwkgICAgICBwb3J0X2Jhc2UsIGludGVycnVwdF9sZXZlbCApOworI2VuZGlmCisgICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCwgImZkb21haW4iKSkgeworCSBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gcG9ydCAweCV4IGlzIGJ1c3lcbiIsIHBvcnRfYmFzZSApOworCSBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gQmFkIExJTE8vSU5TTU9EIHBhcmFtZXRlcnM/XG4iICk7CisJIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKCFmZG9tYWluX2lzX3ZhbGlkX3BvcnQoIHBvcnRfYmFzZSApKSB7CisJIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBDYW5ub3QgbG9jYXRlIGNoaXAgYXQgcG9ydCBiYXNlIDB4JXhcbiIsCisJCSBwb3J0X2Jhc2UgKTsKKwkgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IEJhZCBMSUxPL0lOU01PRCBwYXJhbWV0ZXJzP1xuIiApOworCSByZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBpbnQgZmxhZyA9IDA7CisKKyNpZmRlZiBDT05GSUdfUENJCisJCQkJLyogVHJ5IFBDSSBkZXRlY3Rpb24gZmlyc3QgKi8KKyAgICAgIGZsYWcgPSBmZG9tYWluX3BjaV9iaW9zX2RldGVjdCggJmludGVycnVwdF9sZXZlbCwgJnBvcnRfYmFzZSwgJnBkZXYgKTsKKyNlbmRpZgorICAgICAgaWYgKCFmbGFnKSB7CisJCQkJLyogVGhlbiB0cnkgSVNBIGJ1cyBkZXRlY3Rpb24gKi8KKwkgZmxhZyA9IGZkb21haW5faXNhX2RldGVjdCggJmludGVycnVwdF9sZXZlbCwgJnBvcnRfYmFzZSApOworCisJIGlmICghZmxhZykgeworCSAgICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gRGV0ZWN0aW9uIGZhaWxlZCAobm8gY2FyZClcbiIgKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJIH0KKyAgICAgIH0KKyAgIH0KKworICAgZmRvbWFpbl8xNngwX2J1c19yZXNldChOVUxMKTsKKworICAgaWYgKGZkb21haW5fdGVzdF9sb29wYmFjaygpKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgICJzY3NpOiA8ZmRvbWFpbj4gRGV0ZWN0aW9uIGZhaWxlZCAobG9vcGJhY2sgdGVzdCBmYWlsZWQgYXQgcG9ydCBiYXNlIDB4JXgpXG4iLCBwb3J0X2Jhc2UpOworICAgICAgaWYgKHNldHVwX2NhbGxlZCkgeworCSBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBCYWQgTElMTy9JTlNNT0QgcGFyYW1ldGVycz9cbiIpOworICAgICAgfQorICAgICAgcmVsZWFzZV9yZWdpb24ocG9ydF9iYXNlLCAweDEwKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorCisgICBpZiAodGhpc19pZCkgeworICAgICAgdHBudC0+dGhpc19pZCA9ICh0aGlzX2lkICYgMHgwNyk7CisgICAgICBhZGFwdGVyX21hc2sgID0gKDEgPDwgdHBudC0+dGhpc19pZCk7CisgICB9IGVsc2UgeworICAgICAgaWYgKFBDSV9idXMgfHwgKGJpb3NfbWFqb3IgPT0gMyAmJiBiaW9zX21pbm9yID49IDIpIHx8IGJpb3NfbWFqb3IgPCAwKSB7CisJIHRwbnQtPnRoaXNfaWQgPSA3OworCSBhZGFwdGVyX21hc2sgID0gMHg4MDsKKyAgICAgIH0gZWxzZSB7CisJIHRwbnQtPnRoaXNfaWQgPSA2OworCSBhZGFwdGVyX21hc2sgID0gMHg0MDsKKyAgICAgIH0KKyAgIH0KKworLyogUHJpbnQgb3V0IGEgYmFubmVyIGhlcmUgaW4gY2FzZSB3ZSBjYW4ndAorICAgZ2V0IHJlc291cmNlcy4gICovCisKKyAgIHNocG50ID0gc2NzaV9yZWdpc3RlciggdHBudCwgMCApOworICAgaWYoc2hwbnQgPT0gTlVMTCkgeworCXJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisgICAJcmV0dXJuIE5VTEw7CisgICB9CisgICBzaHBudC0+aXJxID0gaW50ZXJydXB0X2xldmVsOworICAgc2hwbnQtPmlvX3BvcnQgPSBwb3J0X2Jhc2U7CisgICBzY3NpX3NldF9kZXZpY2Uoc2hwbnQsICZwZGV2LT5kZXYpOworICAgc2hwbnQtPm5faW9fcG9ydCA9IDB4MTA7CisgICBwcmludF9iYW5uZXIoIHNocG50ICk7CisKKyAgIC8qIExvZyBJUlEgd2l0aCBrZXJuZWwgKi8gICAKKyAgIGlmICghaW50ZXJydXB0X2xldmVsKSB7CisgICAgICBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBDYXJkIERldGVjdGVkLCBidXQgZHJpdmVyIG5vdCBsb2FkZWQgKG5vIElSUSlcbiIgKTsKKyAgICAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0gZWxzZSB7CisgICAgICAvKiBSZWdpc3RlciB0aGUgSVJRIHdpdGggdGhlIGtlcm5lbCAqLworCisgICAgICByZXRjb2RlID0gcmVxdWVzdF9pcnEoIGludGVycnVwdF9sZXZlbCwKKwkJCSAgICAgZG9fZmRvbWFpbl8xNngwX2ludHIsIHBkZXY/U0FfU0hJUlE6MCwgImZkb21haW4iLCBzaHBudCk7CisKKyAgICAgIGlmIChyZXRjb2RlIDwgMCkgeworCSBpZiAocmV0Y29kZSA9PSAtRUlOVkFMKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IElSUSAlZCBpcyBiYWQhXG4iLCBpbnRlcnJ1cHRfbGV2ZWwgKTsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgICAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIVxuIiApOworCSAgICBwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgICBTZW5kIG1haWwgdG8gZmFpdGhAYWNtLm9yZ1xuIiApOworCSB9IGVsc2UgaWYgKHJldGNvZGUgPT0gLUVCVVNZKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IElSUSAlZCBpcyBhbHJlYWR5IGluIHVzZSFcbiIsIGludGVycnVwdF9sZXZlbCApOworCSAgICBwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgICBQbGVhc2UgdXNlIGFub3RoZXIgSVJRIVxuIiApOworCSB9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBFcnJvciBnZXR0aW5nIElSUSAlZFxuIiwgaW50ZXJydXB0X2xldmVsICk7CisJICAgIHByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICAgIFRoaXMgc2hvdWxkbid0IGhhcHBlbiFcbiIgKTsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgICAgU2VuZCBtYWlsIHRvIGZhaXRoQGFjbS5vcmdcbiIgKTsKKwkgfQorCSBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBEZXRlY3RlZCwgYnV0IGRyaXZlciBub3QgbG9hZGVkIChJUlEpXG4iICk7CisgICAgICAgICByZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOworCSByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBzaHBudDsKK30KKworc3RhdGljIGludCBmZG9tYWluXzE2eDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJaWYgKGZkb21haW4pCisJCWZkb21haW5fc2V0dXAoZmRvbWFpbik7CisJcmV0dXJuIChfX2Zkb21haW5fMTZ4MF9kZXRlY3QodHBudCkgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmZG9tYWluXzE2eDBfaW5mbyggc3RydWN0IFNjc2lfSG9zdCAqaWdub3JlICkKK3sKKyAgIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMjhdOworICAgY2hhciAgICAgICAgKnB0OworICAgCisgICBzdHJjcHkoIGJ1ZmZlciwgIkZ1dHVyZSBEb21haW4gMTYtYml0IFNDU0kgRHJpdmVyIFZlcnNpb24iICk7CisgICBpZiAoc3RyY2hyKCBWRVJTSU9OLCAnOicpKSB7IC8qIEFzc3VtZSBWRVJTSU9OIGlzIGFuIFJDUyBSZXZpc2lvbiBzdHJpbmcgKi8KKyAgICAgIHN0cmNhdCggYnVmZmVyLCBzdHJjaHIoIFZFUlNJT04sICc6JyApICsgMSApOworICAgICAgcHQgPSBzdHJyY2hyKCBidWZmZXIsICckJykgLSAxOworICAgICAgaWYgKCFwdCkgIAkJLyogU3RyaXBwZWQgUkNTIFJldmlzaW9uIHN0cmluZz8gKi8KKwkgICAgcHQgPSBidWZmZXIgKyBzdHJsZW4oIGJ1ZmZlciApIC0gMTsKKyAgICAgIGlmICgqcHQgIT0gJyAnKQorCSAgICArK3B0OworICAgICAgKnB0ID0gJ1wwJzsKKyAgIH0gZWxzZSB7CQkJLyogQXNzdW1lIFZFUlNJT04gaXMgYSBudW1iZXIgKi8KKyAgICAgIHN0cmNhdCggYnVmZmVyLCAiICIgVkVSU0lPTiApOworICAgfQorICAgICAgCisgICByZXR1cm4gYnVmZmVyOworfQorCisjaWYgMAorc3RhdGljIGludCBmZG9tYWluX2FyYml0cmF0ZSggdm9pZCApCit7CisgICBpbnQgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKyNpZiBFVkVSWV9BQ0NFU1MKKyAgIHByaW50ayggImZkb21haW5fYXJiaXRyYXRlKClcbiIgKTsKKyNlbmRpZgorICAgCisgICBvdXRiKDB4MDAsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7ICAgICAgICAgICAgICAvKiBEaXNhYmxlIGRhdGEgZHJpdmVycyAqLworICAgb3V0YihhZGFwdGVyX21hc2ssIHBvcnRfYmFzZSArIFNDU0lfRGF0YV9Ob0FDSyk7IC8qIFNldCBvdXIgaWQgYml0ICovCisgICBvdXRiKDB4MDQgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOyAvKiBTdGFydCBhcmJpdHJhdGlvbiAqLworCisgICB0aW1lb3V0ID0gNTAwOworICAgZG8geworICAgICAgc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFRNQ19TdGF0dXMpOyAgICAgICAgLyogUmVhZCBhZGFwdGVyIHN0YXR1cyAqLworICAgICAgaWYgKHN0YXR1cyAmIDB4MDIpCQkgICAgICAvKiBBcmJpdHJhdGlvbiBjb21wbGV0ZSAqLworCSAgICByZXR1cm4gMDsKKyAgICAgIG1kZWxheSgxKTsJCQkvKiBXYWl0IG9uZSBtaWxsaXNlY29uZCAqLworICAgfSB3aGlsZSAoLS10aW1lb3V0KTsKKworICAgLyogTWFrZSBidXMgaWRsZSAqLworICAgZmRvbWFpbl9tYWtlX2J1c19pZGxlKCk7CisKKyNpZiBFVkVSWV9BQ0NFU1MKKyAgIHByaW50ayggIkFyYml0cmF0aW9uIGZhaWxlZCwgc3RhdHVzID0gJXhcbiIsIHN0YXR1cyApOworI2VuZGlmCisjaWYgRVJST1JTX09OTFkKKyAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBBcmJpdHJhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICV4XG4iLCBzdGF0dXMgKTsKKyNlbmRpZgorICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBmZG9tYWluX3NlbGVjdCggaW50IHRhcmdldCApCit7CisgICBpbnQgICAgICAgICAgIHN0YXR1czsKKyAgIHVuc2lnbmVkIGxvbmcgdGltZW91dDsKKyNpZiBFUlJPUlNfT05MWQorICAgc3RhdGljIGludCAgICBmbGFnID0gMDsKKyNlbmRpZgorCisgICBvdXRiKDB4ODIsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7IC8qIEJ1cyBFbmFibGUgKyBTZWxlY3QgKi8KKyAgIG91dGIoYWRhcHRlcl9tYXNrIHwgKDEgPDwgdGFyZ2V0KSwgcG9ydF9iYXNlICsgU0NTSV9EYXRhX05vQUNLKTsKKworICAgLyogU3RvcCBhcmJpdHJhdGlvbiBhbmQgZW5hYmxlIHBhcml0eSAqLworICAgb3V0YihQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOyAKKworICAgdGltZW91dCA9IDM1MDsJCQkvKiAzNTAgbXNlYyAqLworCisgICBkbyB7CisgICAgICBzdGF0dXMgPSBpbmIocG9ydF9iYXNlICsgU0NTSV9TdGF0dXMpOyAvKiBSZWFkIGFkYXB0ZXIgc3RhdHVzICovCisgICAgICBpZiAoc3RhdHVzICYgMSkgewkJCS8qIEJ1c3kgYXNzZXJ0ZWQgKi8KKwkgLyogRW5hYmxlIFNDU0kgQnVzIChvbiBlcnJvciwgc2hvdWxkIG1ha2UgYnVzIGlkbGUgd2l0aCAwKSAqLworCSBvdXRiKDB4ODAsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7CisJIHJldHVybiAwOworICAgICAgfQorICAgICAgbWRlbGF5KDEpOwkJCS8qIHdhaXQgb25lIG1zZWMgKi8KKyAgIH0gd2hpbGUgKC0tdGltZW91dCk7CisgICAvKiBNYWtlIGJ1cyBpZGxlICovCisgICBmZG9tYWluX21ha2VfYnVzX2lkbGUoKTsKKyNpZiBFVkVSWV9BQ0NFU1MKKyAgIGlmICghdGFyZ2V0KSBwcmludGsoICJTZWxlY3Rpb24gZmFpbGVkXG4iICk7CisjZW5kaWYKKyNpZiBFUlJPUlNfT05MWQorICAgaWYgKCF0YXJnZXQpIHsKKyAgICAgIGlmICghZmxhZykgLyogU2tpcCBmaXJzdCBmYWlsdXJlIGZvciBhbGwgY2hpcHMuICovCisJICAgICsrZmxhZzsKKyAgICAgIGVsc2UKKwkgICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IFNlbGVjdGlvbiBmYWlsZWRcbiIgKTsKKyAgIH0KKyNlbmRpZgorICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG15X2RvbmUoaW50IGVycm9yKQoreworICAgaWYgKGluX2NvbW1hbmQpIHsKKyAgICAgIGluX2NvbW1hbmQgPSAwOworICAgICAgb3V0YigweDAwLCBwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfQ250bCk7CisgICAgICBmZG9tYWluX21ha2VfYnVzX2lkbGUoKTsKKyAgICAgIGN1cnJlbnRfU0MtPnJlc3VsdCA9IGVycm9yOworICAgICAgaWYgKGN1cnJlbnRfU0MtPnNjc2lfZG9uZSkKKwkgICAgY3VycmVudF9TQy0+c2NzaV9kb25lKCBjdXJyZW50X1NDICk7CisgICAgICBlbHNlIHBhbmljKCAic2NzaTogPGZkb21haW4+IGN1cnJlbnRfU0MtPnNjc2lfZG9uZSgpID09IE5VTEwiICk7CisgICB9IGVsc2UgeworICAgICAgcGFuaWMoICJzY3NpOiA8ZmRvbWFpbj4gbXlfZG9uZSgpIGNhbGxlZCBvdXRzaWRlIG9mIGNvbW1hbmRcbiIgKTsKKyAgIH0KKyNpZiBERUJVR19SQUNFCisgICBpbl9pbnRlcnJ1cHRfZmxhZyA9IDA7CisjZW5kaWYKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX2Zkb21haW5fMTZ4MF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKiByZWdzICkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICBpbnQgICAgICBzdGF0dXM7CisgICBpbnQgICAgICBkb25lID0gMDsKKyAgIHVuc2lnbmVkIGRhdGFfY291bnQ7CisKKwkJCQkvKiBUaGUgZmRvbWFpbl8xNngwX2ludHIgaXMgb25seSBjYWxsZWQgdmlhCisJCQkJICAgdGhlIGludGVycnVwdCBoYW5kbGVyLiAgVGhlIGdvYWwgb2YgdGhlCisJCQkJICAgc3RpKCkgaGVyZSBpcyB0byBhbGxvdyBvdGhlcgorCQkJCSAgIGludGVycnVwdGlvbnMgd2hpbGUgdGhpcyByb3V0aW5lIGlzCisJCQkJICAgcnVubmluZy4gKi8KKworICAgLyogQ2hlY2sgZm9yIG90aGVyIElSUSBzb3VyY2VzICovCisgICBpZiAoKGluYihwb3J0X2Jhc2UgKyBUTUNfU3RhdHVzKSAmIDB4MDEpID09IDApCisgICAJcmV0dXJuIElSUV9OT05FOworCisgICAvKiBJdCBpcyBvdXIgSVJRICovICAgCQorICAgb3V0YigweDAwLCBwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfQ250bCk7CisKKyAgIC8qIFdlIHVzdWFsbHkgaGF2ZSBvbmUgc3B1cmlvdXMgaW50ZXJydXB0IGFmdGVyIGVhY2ggY29tbWFuZC4gIElnbm9yZSBpdC4gKi8KKyAgIGlmICghaW5fY29tbWFuZCB8fCAhY3VycmVudF9TQykgewkvKiBTcHVyaW91cyBpbnRlcnJ1cHQgKi8KKyNpZiBFVkVSWV9BQ0NFU1MKKyAgICAgIHByaW50ayggIlNwdXJpb3VzIGludGVycnVwdCwgaW5fY29tbWFuZCA9ICVkLCBjdXJyZW50X1NDID0gJXhcbiIsCisJICAgICAgaW5fY29tbWFuZCwgY3VycmVudF9TQyApOworI2VuZGlmCisgICAgICByZXR1cm4gSVJRX05PTkU7CisgICB9CisKKyAgIC8qIEFib3J0IGNhbGxzIG15X2RvbmUsIHNvIHdlIGRvIG5vdGhpbmcgaGVyZS4gKi8KKyAgIGlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CisjaWYgREVCVUdfQUJPUlQKKyAgICAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBJbnRlcnJ1cHQgYWZ0ZXIgYWJvcnQsIGlnbm9yaW5nXG4iICk7CisjZW5kaWYKKyAgICAgIC8qCisgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7ICovCisgICB9CisKKyNpZiBERUJVR19SQUNFCisgICArK2luX2ludGVycnVwdF9mbGFnOworI2VuZGlmCisKKyAgIGlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBpbl9hcmJpdHJhdGlvbikgeworICAgICAgc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFRNQ19TdGF0dXMpOyAgICAgICAgLyogUmVhZCBhZGFwdGVyIHN0YXR1cyAqLworICAgICAgaWYgKCEoc3RhdHVzICYgMHgwMikpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgcHJpbnRrKCAiIEFGQUlMICIgKTsKKyNlbmRpZgorICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoY3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkgbXlfZG9uZSggRElEX0JVU19CVVNZIDw8IDE2ICk7CisgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGN1cnJlbnRfU0MtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IGluX3NlbGVjdGlvbjsKKyAgICAgIAorICAgICAgb3V0YigweDQwIHwgRklGT19DT1VOVCwgcG9ydF9iYXNlICsgSW50ZXJydXB0X0NudGwpOworCisgICAgICBvdXRiKDB4ODIsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7IC8qIEJ1cyBFbmFibGUgKyBTZWxlY3QgKi8KKyAgICAgIG91dGIoYWRhcHRlcl9tYXNrIHwgKDEgPDwgY3VycmVudF9TQy0+ZGV2aWNlLT5pZCksIHBvcnRfYmFzZSArIFNDU0lfRGF0YV9Ob0FDSyk7CisgICAgICAKKyAgICAgIC8qIFN0b3AgYXJiaXRyYXRpb24gYW5kIGVuYWJsZSBwYXJpdHkgKi8KKyAgICAgIG91dGIoMHgxMCB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7CisjaWYgREVCVUdfUkFDRQorICAgICAgaW5faW50ZXJydXB0X2ZsYWcgPSAwOworI2VuZGlmCisgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICB9IGVsc2UgaWYgKGN1cnJlbnRfU0MtPlNDcC5waGFzZSAmIGluX3NlbGVjdGlvbikgeworICAgICAgc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFNDU0lfU3RhdHVzKTsKKyAgICAgIGlmICghKHN0YXR1cyAmIDB4MDEpKSB7CisJIC8qIFRyeSBhZ2FpbiwgZm9yIHNsb3cgZGV2aWNlcyAqLworCSBpZiAoZmRvbWFpbl9zZWxlY3QoIGN1cnJlbnRfU0MtPmRldmljZS0+aWQgKSkgeworI2lmIEVWRVJZX0FDQ0VTUworCSAgICBwcmludGsoICIgU0ZBSUwgIiApOworI2VuZGlmCisgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZShjdXJyZW50X1NDLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCSAgICBteV9kb25lKCBESURfTk9fQ09OTkVDVCA8PCAxNiApOworICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjdXJyZW50X1NDLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCSAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisJIH0gZWxzZSB7CisjaWYgRVZFUllfQUNDRVNTCisJICAgIHByaW50ayggIiBBbHRTZWwgIiApOworI2VuZGlmCisJICAgIC8qIFN0b3AgYXJiaXRyYXRpb24gYW5kIGVuYWJsZSBwYXJpdHkgKi8KKwkgICAgb3V0YigweDEwIHwgUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsKKwkgfQorICAgICAgfQorICAgICAgY3VycmVudF9TQy0+U0NwLnBoYXNlID0gaW5fb3RoZXI7CisgICAgICBvdXRiKDB4OTAgfCBGSUZPX0NPVU5ULCBwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfQ250bCk7CisgICAgICBvdXRiKDB4ODAsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7CisjaWYgREVCVUdfUkFDRQorICAgICAgaW5faW50ZXJydXB0X2ZsYWcgPSAwOworI2VuZGlmCisgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICB9CisgICAKKyAgIC8qIGN1cnJlbnRfU0MtPlNDcC5waGFzZSA9PSBpbl9vdGhlcjogdGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgcm91dGluZSAqLworICAgCisgICBzdGF0dXMgPSBpbmIocG9ydF9iYXNlICsgU0NTSV9TdGF0dXMpOworICAgCisgICBpZiAoc3RhdHVzICYgMHgxMCkgewkvKiBSRVEgKi8KKyAgICAgIAorICAgICAgc3dpdGNoIChzdGF0dXMgJiAweDBlKSB7CisgICAgICAgCisgICAgICBjYXNlIDB4MDg6CQkvKiBDT01NQU5EIE9VVCAqLworCSBvdXRiKGN1cnJlbnRfU0MtPmNtbmRbY3VycmVudF9TQy0+U0NwLnNlbnRfY29tbWFuZCsrXSwKKwkgICAgICBwb3J0X2Jhc2UgKyBXcml0ZV9TQ1NJX0RhdGEpOworI2lmIEVWRVJZX0FDQ0VTUworCSBwcmludGsoICJDTUQgPSAleCwiLAorCQkgY3VycmVudF9TQy0+Y21uZFsgY3VycmVudF9TQy0+U0NwLnNlbnRfY29tbWFuZCAtIDFdICk7CisjZW5kaWYKKwkgYnJlYWs7CisgICAgICBjYXNlIDB4MDA6CQkvKiBEQVRBIE9VVCAtLSB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisJIGlmIChjaGlwICE9IHRtYzE4MDAgJiYgIWN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4pIHsKKwkgICAgY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IC0xOworCSAgICBvdXRiKDB4ZDAgfCBQQVJJVFlfTUFTSywgcG9ydF9iYXNlICsgVE1DX0NudGwpOworCSB9CisJIGJyZWFrOworICAgICAgY2FzZSAweDA0OgkJLyogREFUQSBJTiAtLSB0bWMxOGM1MC90bWMxOGMzMCBvbmx5ICovCisJIGlmIChjaGlwICE9IHRtYzE4MDAgJiYgIWN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4pIHsKKwkgICAgY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IDE7CisJICAgIG91dGIoMHg5MCB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7CisJIH0KKwkgYnJlYWs7CisgICAgICBjYXNlIDB4MGM6CQkvKiBTVEFUVVMgSU4gKi8KKwkgY3VycmVudF9TQy0+U0NwLlN0YXR1cyA9IGluYihwb3J0X2Jhc2UgKyBSZWFkX1NDU0lfRGF0YSk7CisjaWYgRVZFUllfQUNDRVNTCisJIHByaW50ayggIlN0YXR1cyA9ICV4LCAiLCBjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICk7CisjZW5kaWYKKyNpZiBFUlJPUlNfT05MWQorCSBpZiAoY3VycmVudF9TQy0+U0NwLlN0YXR1cworCSAgICAgJiYgY3VycmVudF9TQy0+U0NwLlN0YXR1cyAhPSAyCisJICAgICAmJiBjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICE9IDgpIHsKKwkgICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IHRhcmdldCA9ICVkLCBjb21tYW5kID0gJXgsIHN0YXR1cyA9ICV4XG4iLAorCQkgICAgY3VycmVudF9TQy0+ZGV2aWNlLT5pZCwKKwkJICAgIGN1cnJlbnRfU0MtPmNtbmRbMF0sCisJCSAgICBjdXJyZW50X1NDLT5TQ3AuU3RhdHVzICk7CisJIH0KKyNlbmRpZgorCSAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgwYToJCS8qIE1FU1NBR0UgT1VUICovCisJIG91dGIoTUVTU0FHRV9SRUpFQ1QsIHBvcnRfYmFzZSArIFdyaXRlX1NDU0lfRGF0YSk7IC8qIFJlamVjdCAqLworCSBicmVhazsKKyAgICAgIGNhc2UgMHgwZToJCS8qIE1FU1NBR0UgSU4gKi8KKwkgY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UgPSBpbmIocG9ydF9iYXNlICsgUmVhZF9TQ1NJX0RhdGEpOworI2lmIEVWRVJZX0FDQ0VTUworCSBwcmludGsoICJNZXNzYWdlID0gJXgsICIsIGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlICk7CisjZW5kaWYKKwkgaWYgKCFjdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSkgKytkb25lOworI2lmIERFQlVHX01FU1NBR0VTIHx8IEVWRVJZX0FDQ0VTUworCSBpZiAoY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UpIHsKKwkgICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IG1lc3NhZ2UgPSAleFxuIiwKKwkJICAgIGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlICk7CisJIH0KKyNlbmRpZgorCSBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKGNoaXAgPT0gdG1jMTgwMCAmJiAhY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbgorICAgICAgICYmIChjdXJyZW50X1NDLT5TQ3Auc2VudF9jb21tYW5kID49IGN1cnJlbnRfU0MtPmNtZF9sZW4pKSB7CisgICAgICAKKyAgICAgIGlmKGN1cnJlbnRfU0MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisgICAgICB7CisJIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSAtMTsKKwkgb3V0YigweGQwIHwgUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKwkgY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9IDE7CisJIG91dGIoMHg5MCB8IFBBUklUWV9NQVNLLCBwb3J0X2Jhc2UgKyBUTUNfQ250bCk7CisgICAgICB9CisgICB9CisKKyAgIGlmIChjdXJyZW50X1NDLT5TQ3AuaGF2ZV9kYXRhX2luID09IC0xKSB7IC8qIERBVEEgT1VUICovCisgICAgICB3aGlsZSAoKGRhdGFfY291bnQgPSBGSUZPX1NpemUgLSBpbncocG9ydF9iYXNlICsgRklGT19EYXRhX0NvdW50KSkgPiA1MTIpIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgcHJpbnRrKCAiREM9JWQsICIsIGRhdGFfY291bnQgKSA7CisjZW5kaWYKKwkgaWYgKGRhdGFfY291bnQgPiBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCkKKwkgICAgICAgZGF0YV9jb3VudCA9IGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCSBpZiAoZGF0YV9jb3VudCA+IDApIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgICAgcHJpbnRrKCAiJWQgT1VULCAiLCBkYXRhX2NvdW50ICk7CisjZW5kaWYKKwkgICAgaWYgKGRhdGFfY291bnQgPT0gMSkgeworCSAgICAgICBvdXRiKCpjdXJyZW50X1NDLT5TQ3AucHRyKyssIHBvcnRfYmFzZSArIFdyaXRlX0ZJRk8pOworCSAgICAgICAtLWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOworCSAgICB9IGVsc2UgeworCSAgICAgICBkYXRhX2NvdW50ID4+PSAxOworCSAgICAgICBvdXRzdyhwb3J0X2Jhc2UgKyBXcml0ZV9GSUZPLCBjdXJyZW50X1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKKwkgICAgICAgY3VycmVudF9TQy0+U0NwLnB0ciArPSAyICogZGF0YV9jb3VudDsKKwkgICAgICAgY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gMiAqIGRhdGFfY291bnQ7CisJICAgIH0KKwkgfQorCSBpZiAoIWN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsKSB7CisJICAgIGlmIChjdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCSAgICAgICAtLWN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCSAgICAgICArK2N1cnJlbnRfU0MtPlNDcC5idWZmZXI7CisJICAgICAgIGN1cnJlbnRfU0MtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJICAgICAgIGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCSAgICB9IGVsc2UKKwkJICBicmVhazsKKwkgfQorICAgICAgfQorICAgfQorICAgCisgICBpZiAoY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiA9PSAxKSB7IC8qIERBVEEgSU4gKi8KKyAgICAgIHdoaWxlICgoZGF0YV9jb3VudCA9IGludyhwb3J0X2Jhc2UgKyBGSUZPX0RhdGFfQ291bnQpKSA+IDApIHsKKyNpZiBFVkVSWV9BQ0NFU1MKKwkgcHJpbnRrKCAiREM9JWQsICIsIGRhdGFfY291bnQgKTsKKyNlbmRpZgorCSBpZiAoZGF0YV9jb3VudCA+IGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsKQorCSAgICAgICBkYXRhX2NvdW50ID0gY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw7CisJIGlmIChkYXRhX2NvdW50KSB7CisjaWYgRVZFUllfQUNDRVNTCisJICAgIHByaW50ayggIiVkIElOLCAiLCBkYXRhX2NvdW50ICk7CisjZW5kaWYKKwkgICAgaWYgKGRhdGFfY291bnQgPT0gMSkgeworCSAgICAgICAqY3VycmVudF9TQy0+U0NwLnB0cisrID0gaW5iKHBvcnRfYmFzZSArIFJlYWRfRklGTyk7CisJICAgICAgIC0tY3VycmVudF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw7CisJICAgIH0gZWxzZSB7CisJICAgICAgIGRhdGFfY291bnQgPj49IDE7IC8qIE51bWJlciBvZiB3b3JkcyAqLworCSAgICAgICBpbnN3KHBvcnRfYmFzZSArIFJlYWRfRklGTywgY3VycmVudF9TQy0+U0NwLnB0ciwgZGF0YV9jb3VudCk7CisJICAgICAgIGN1cnJlbnRfU0MtPlNDcC5wdHIgKz0gMiAqIGRhdGFfY291bnQ7CisJICAgICAgIGN1cnJlbnRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsIC09IDIgKiBkYXRhX2NvdW50OworCSAgICB9CisJIH0KKwkgaWYgKCFjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbAorCSAgICAgJiYgY3VycmVudF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkgICAgLS1jdXJyZW50X1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkgICAgKytjdXJyZW50X1NDLT5TQ3AuYnVmZmVyOworCSAgICBjdXJyZW50X1NDLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPnBhZ2UpICsgY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCSAgICBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkgfQorICAgICAgfQorICAgfQorICAgCisgICBpZiAoZG9uZSkgeworI2lmIEVWRVJZX0FDQ0VTUworICAgICAgcHJpbnRrKCAiICoqIElOIERPTkUgJWQgKiogIiwgY3VycmVudF9TQy0+U0NwLmhhdmVfZGF0YV9pbiApOworI2VuZGlmCisKKyNpZiBFUlJPUlNfT05MWQorICAgICAgaWYgKGN1cnJlbnRfU0MtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiAhY3VycmVudF9TQy0+U0NwLlN0YXR1cykgeworCSBpZiAoKHVuc2lnbmVkIGNoYXIpKCooKGNoYXIgKiljdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlcisyKSkgJiAweDBmKSB7CisJICAgIHVuc2lnbmVkIGNoYXIga2V5OworCSAgICB1bnNpZ25lZCBjaGFyIGNvZGU7CisJICAgIHVuc2lnbmVkIGNoYXIgcXVhbGlmaWVyOworCisJICAgIGtleSA9ICh1bnNpZ25lZCBjaGFyKSgqKChjaGFyICopY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXIgKyAyKSkKKwkJICAmIDB4MGY7CisJICAgIGNvZGUgPSAodW5zaWduZWQgY2hhcikoKigoY2hhciAqKWN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyICsgMTIpKTsKKwkgICAgcXVhbGlmaWVyID0gKHVuc2lnbmVkIGNoYXIpKCooKGNoYXIgKiljdXJyZW50X1NDLT5yZXF1ZXN0X2J1ZmZlcgorCQkJCQkgICsgMTMpKTsKKworCSAgICBpZiAoa2V5ICE9IFVOSVRfQVRURU5USU9OCisJCSYmICEoa2V5ID09IE5PVF9SRUFEWQorCQkgICAgICYmIGNvZGUgPT0gMHgwNAorCQkgICAgICYmICghcXVhbGlmaWVyIHx8IHF1YWxpZmllciA9PSAweDAyIHx8IHF1YWxpZmllciA9PSAweDAxKSkKKwkJJiYgIShrZXkgPT0gSUxMRUdBTF9SRVFVRVNUICYmIChjb2RlID09IDB4MjUKKwkJCQkJCXx8IGNvZGUgPT0gMHgyNAorCQkJCQkJfHwgIWNvZGUpKSkKKwkJICAKKwkJICBwcmludGsoICJzY3NpOiA8ZmRvbWFpbj4gUkVRVUVTVCBTRU5TRSIKKwkJCSAgIiBLZXkgPSAleCwgQ29kZSA9ICV4LCBRdWFsaWZpZXIgPSAleFxuIiwKKwkJCSAga2V5LCBjb2RlLCBxdWFsaWZpZXIgKTsKKwkgfQorICAgICAgfQorI2VuZGlmCisjaWYgRVZFUllfQUNDRVNTCisgICAgICBwcmludGsoICJCRUZPUkUgTVlfRE9ORS4gLiAuIiApOworI2VuZGlmCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZShjdXJyZW50X1NDLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworICAgICAgbXlfZG9uZSggKGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKQorCSAgICAgICB8ICgoY3VycmVudF9TQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCA4KSB8IChESURfT0sgPDwgMTYpICk7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGN1cnJlbnRfU0MtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisjaWYgRVZFUllfQUNDRVNTCisgICAgICBwcmludGsoICJSRVRVUk5JTkcuXG4iICk7CisjZW5kaWYKKyAgICAgIAorICAgfSBlbHNlIHsKKyAgICAgIGlmIChjdXJyZW50X1NDLT5TQ3AucGhhc2UgJiBkaXNjb25uZWN0KSB7CisJIG91dGIoMHhkMCB8IEZJRk9fQ09VTlQsIHBvcnRfYmFzZSArIEludGVycnVwdF9DbnRsKTsKKwkgb3V0YigweDAwLCBwb3J0X2Jhc2UgKyBTQ1NJX0NudGwpOworICAgICAgfSBlbHNlIHsKKwkgb3V0YigweDkwIHwgRklGT19DT1VOVCwgcG9ydF9iYXNlICsgSW50ZXJydXB0X0NudGwpOworICAgICAgfQorICAgfQorI2lmIERFQlVHX1JBQ0UKKyAgIGluX2ludGVycnVwdF9mbGFnID0gMDsKKyNlbmRpZgorICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGZkb21haW5fMTZ4MF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisgICBpZiAoaW5fY29tbWFuZCkgeworICAgICAgcGFuaWMoICJzY3NpOiA8ZmRvbWFpbj4gZmRvbWFpbl8xNngwX3F1ZXVlKCkgTk9UIFJFRU5UUkFOVCFcbiIgKTsKKyAgIH0KKyNpZiBFVkVSWV9BQ0NFU1MKKyAgIHByaW50ayggInF1ZXVlOiB0YXJnZXQgPSAlZCBjbW5kID0gMHglMDJ4IHBpZWNlcyA9ICVkIHNpemUgPSAldVxuIiwKKwkgICBTQ3BudC0+dGFyZ2V0LAorCSAgICoodW5zaWduZWQgY2hhciAqKVNDcG50LT5jbW5kLAorCSAgIFNDcG50LT51c2Vfc2csCisJICAgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiApOworI2VuZGlmCisKKyAgIGZkb21haW5fbWFrZV9idXNfaWRsZSgpOworCisgICBjdXJyZW50X1NDICAgICAgICAgICAgPSBTQ3BudDsgLyogU2F2ZSB0aGlzIGZvciB0aGUgZG9uZSBmdW5jdGlvbiAqLworICAgY3VycmVudF9TQy0+c2NzaV9kb25lID0gZG9uZTsKKworICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgZGF0YSAqLworCisgICBpZiAoY3VycmVudF9TQy0+dXNlX3NnKSB7CisgICAgICBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyID0KKwkgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKWN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmVyOworICAgICAgY3VycmVudF9TQy0+U0NwLnB0ciAgICAgICAgICAgICAgPSBwYWdlX2FkZHJlc3MoY3VycmVudF9TQy0+U0NwLmJ1ZmZlci0+cGFnZSkgKyBjdXJyZW50X1NDLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisgICAgICBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCAgICA9IGN1cnJlbnRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKKyAgICAgIGN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY3VycmVudF9TQy0+dXNlX3NnIC0gMTsKKyAgIH0gZWxzZSB7CisgICAgICBjdXJyZW50X1NDLT5TQ3AucHRyICAgICAgICAgICAgICA9IChjaGFyICopY3VycmVudF9TQy0+cmVxdWVzdF9idWZmZXI7CisgICAgICBjdXJyZW50X1NDLT5TQ3AudGhpc19yZXNpZHVhbCAgICA9IGN1cnJlbnRfU0MtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICAgIGN1cnJlbnRfU0MtPlNDcC5idWZmZXIgICAgICAgICAgID0gTlVMTDsKKyAgICAgIGN1cnJlbnRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKyAgIH0KKwkgCisgICAKKyAgIGN1cnJlbnRfU0MtPlNDcC5TdGF0dXMgICAgICAgICAgICAgID0gMDsKKyAgIGN1cnJlbnRfU0MtPlNDcC5NZXNzYWdlICAgICAgICAgICAgID0gMDsKKyAgIGN1cnJlbnRfU0MtPlNDcC5oYXZlX2RhdGFfaW4gICAgICAgID0gMDsKKyAgIGN1cnJlbnRfU0MtPlNDcC5zZW50X2NvbW1hbmQgICAgICAgID0gMDsKKyAgIGN1cnJlbnRfU0MtPlNDcC5waGFzZSAgICAgICAgICAgICAgID0gaW5fYXJiaXRyYXRpb247CisKKyAgIC8qIFN0YXJ0IGFyYml0cmF0aW9uICovCisgICBvdXRiKDB4MDAsIHBvcnRfYmFzZSArIEludGVycnVwdF9DbnRsKTsKKyAgIG91dGIoMHgwMCwgcG9ydF9iYXNlICsgU0NTSV9DbnRsKTsgICAgICAgICAgICAgIC8qIERpc2FibGUgZGF0YSBkcml2ZXJzICovCisgICBvdXRiKGFkYXB0ZXJfbWFzaywgcG9ydF9iYXNlICsgU0NTSV9EYXRhX05vQUNLKTsgLyogU2V0IG91ciBpZCBiaXQgKi8KKyAgICsraW5fY29tbWFuZDsKKyAgIG91dGIoMHgyMCwgcG9ydF9iYXNlICsgSW50ZXJydXB0X0NudGwpOworICAgb3V0YigweDE0IHwgUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsgLyogU3RhcnQgYXJiaXRyYXRpb24gKi8KKworICAgcmV0dXJuIDA7Cit9CisKKyNpZiBERUJVR19BQk9SVAorc3RhdGljIHZvaWQgcHJpbnRfaW5mbyhzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKyAgIHVuc2lnbmVkIGludCBpbXI7CisgICB1bnNpZ25lZCBpbnQgaXJyOworICAgdW5zaWduZWQgaW50IGlzcjsKKworICAgaWYgKCFTQ3BudCB8fCAhU0NwbnQtPmRldmljZSB8fCAhU0NwbnQtPmRldmljZS0+aG9zdCkgeworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaTogPGZkb21haW4+IENhbm5vdCBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uXG4iKTsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIAorICAgcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGZkb21haW5fMTZ4MF9pbmZvKCBTQ3BudC0+ZGV2aWNlLT5ob3N0ICkgKTsKKyAgIHByaW50X2Jhbm5lcihTQ3BudC0+ZGV2aWNlLT5ob3N0KTsKKyAgIHN3aXRjaCAoU0NwbnQtPlNDcC5waGFzZSkgeworICAgY2FzZSBpbl9hcmJpdHJhdGlvbjogcHJpbnRrKCJhcmJpdHJhdGlvbiIpOyBicmVhazsKKyAgIGNhc2UgaW5fc2VsZWN0aW9uOiAgIHByaW50aygic2VsZWN0aW9uIik7ICAgYnJlYWs7CisgICBjYXNlIGluX290aGVyOiAgICAgICBwcmludGsoIm90aGVyIik7ICAgICAgIGJyZWFrOworICAgZGVmYXVsdDogICAgICAgICAgICAgcHJpbnRrKCJ1bmtub3duIik7ICAgICBicmVhazsKKyAgIH0KKworICAgcHJpbnRrKCAiICglZCksIHRhcmdldCA9ICVkIGNtbmQgPSAweCUwMnggcGllY2VzID0gJWQgc2l6ZSA9ICV1XG4iLAorCSAgIFNDcG50LT5TQ3AucGhhc2UsCisJICAgU0NwbnQtPmRldmljZS0+aWQsCisJICAgKih1bnNpZ25lZCBjaGFyICopU0NwbnQtPmNtbmQsCisJICAgU0NwbnQtPnVzZV9zZywKKwkgICBTQ3BudC0+cmVxdWVzdF9idWZmbGVuICk7CisgICBwcmludGsoICJzZW50X2NvbW1hbmQgPSAlZCwgaGF2ZV9kYXRhX2luID0gJWQsIHRpbWVvdXQgPSAlZFxuIiwKKwkgICBTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCwKKwkgICBTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwKKwkgICBTQ3BudC0+dGltZW91dCApOworI2lmIERFQlVHX1JBQ0UKKyAgIHByaW50ayggImluX2ludGVycnVwdF9mbGFnID0gJWRcbiIsIGluX2ludGVycnVwdF9mbGFnICk7CisjZW5kaWYKKworICAgaW1yID0gKGluYiggMHgwYTEgKSA8PCA4KSArIGluYiggMHgyMSApOworICAgb3V0YiggMHgwYSwgMHhhMCApOworICAgaXJyID0gaW5iKCAweGEwICkgPDwgODsKKyAgIG91dGIoIDB4MGEsIDB4MjAgKTsKKyAgIGlyciArPSBpbmIoIDB4MjAgKTsKKyAgIG91dGIoIDB4MGIsIDB4YTAgKTsKKyAgIGlzciA9IGluYiggMHhhMCApIDw8IDg7CisgICBvdXRiKCAweDBiLCAweDIwICk7CisgICBpc3IgKz0gaW5iKCAweDIwICk7CisKKwkJCQkvKiBQcmludCBvdXQgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gKi8KKyAgIHByaW50ayggIklNUiA9IDB4JTA0eCIsIGltciApOworICAgaWYgKGltciAmICgxIDw8IGludGVycnVwdF9sZXZlbCkpCisJIHByaW50ayggIiAobWFza2VkKSIgKTsKKyAgIHByaW50ayggIiwgSVJSID0gMHglMDR4LCBJU1IgPSAweCUwNHhcbiIsIGlyciwgaXNyICk7CisKKyAgIHByaW50ayggIlNDU0kgU3RhdHVzICAgICAgPSAweCUwMnhcbiIsIGluYihwb3J0X2Jhc2UgKyBTQ1NJX1N0YXR1cykpOworICAgcHJpbnRrKCAiVE1DIFN0YXR1cyAgICAgICA9IDB4JTAyeCIsIGluYihwb3J0X2Jhc2UgKyBUTUNfU3RhdHVzKSk7CisgICBpZiAoaW5iKChwb3J0X2Jhc2UgKyBUTUNfU3RhdHVzKSAmIDEpKQorCSBwcmludGsoICIgKGludGVycnVwdCkiICk7CisgICBwcmludGsoICJcbiIgKTsKKyAgIHByaW50aygiSW50ZXJydXB0IFN0YXR1cyA9IDB4JTAyeCIsIGluYihwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfU3RhdHVzKSk7CisgICBpZiAoaW5iKHBvcnRfYmFzZSArIEludGVycnVwdF9TdGF0dXMpICYgMHgwOCkKKwkgcHJpbnRrKCAiIChlbmFibGVkKSIgKTsKKyAgIHByaW50ayggIlxuIiApOworICAgaWYgKGNoaXAgPT0gdG1jMThjNTAgfHwgY2hpcCA9PSB0bWMxOGMzMCkgeworICAgICAgcHJpbnRrKCJGSUZPIFN0YXR1cyAgICAgID0gMHglMDJ4XG4iLCBpbmIocG9ydF9iYXNlICsgRklGT19TdGF0dXMpKTsKKyAgICAgIHByaW50ayggIkludC4gQ29uZGl0aW9uICAgPSAweCUwMnhcbiIsCisJICAgICAgaW5iKCBwb3J0X2Jhc2UgKyBJbnRlcnJ1cHRfQ29uZCApICk7CisgICB9CisgICBwcmludGsoICJDb25maWd1cmF0aW9uIDEgID0gMHglMDJ4XG4iLCBpbmIoIHBvcnRfYmFzZSArIENvbmZpZ3VyYXRpb24xICkgKTsKKyAgIGlmIChjaGlwID09IHRtYzE4YzUwIHx8IGNoaXAgPT0gdG1jMThjMzApCisJIHByaW50ayggIkNvbmZpZ3VyYXRpb24gMiAgPSAweCUwMnhcbiIsCisJCSBpbmIoIHBvcnRfYmFzZSArIENvbmZpZ3VyYXRpb24yICkgKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGZkb21haW5fMTZ4MF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKyNpZiBFVkVSWV9BQ0NFU1MgfHwgRVJST1JTX09OTFkgfHwgREVCVUdfQUJPUlQKKyAgIHByaW50ayggInNjc2k6IDxmZG9tYWluPiBhYm9ydCAiICk7CisjZW5kaWYKKworICAgaWYgKCFpbl9jb21tYW5kKSB7CisjaWYgRVZFUllfQUNDRVNTIHx8IEVSUk9SU19PTkxZCisgICAgICBwcmludGsoICIgKG5vdCBpbiBjb21tYW5kKVxuIiApOworI2VuZGlmCisgICAgICByZXR1cm4gRkFJTEVEOworICAgfSBlbHNlIHByaW50ayggIlxuIiApOworCisjaWYgREVCVUdfQUJPUlQKKyAgIHByaW50X2luZm8oIFNDcG50ICk7CisjZW5kaWYKKworICAgZmRvbWFpbl9tYWtlX2J1c19pZGxlKCk7CisgICBjdXJyZW50X1NDLT5TQ3AucGhhc2UgfD0gYWJvcnRlZDsKKyAgIGN1cnJlbnRfU0MtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyAgIAorICAgLyogQWJvcnRzIGFyZSBub3QgZG9uZSB3ZWxsLiAuIC4gKi8KKyAgIG15X2RvbmUoRElEX0FCT1JUIDw8IDE2KTsKKyAgIHJldHVybiBTVUNDRVNTOworfQorCitpbnQgZmRvbWFpbl8xNngwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKyAgIG91dGIoMSwgcG9ydF9iYXNlICsgU0NTSV9DbnRsKTsKKyAgIGRvX3BhdXNlKCAyICk7CisgICBvdXRiKDAsIHBvcnRfYmFzZSArIFNDU0lfQ250bCk7CisgICBkb19wYXVzZSggMTE1ICk7CisgICBvdXRiKDAsIHBvcnRfYmFzZSArIFNDU0lfTW9kZV9DbnRsKTsKKyAgIG91dGIoUEFSSVRZX01BU0ssIHBvcnRfYmFzZSArIFRNQ19DbnRsKTsKKyAgIHJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IGZkb21haW5fMTZ4MF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppbmZvX2FycmF5KQoreworICAgaW50ICAgICAgICAgICAgICBkcml2ZTsKKyAgIGludAkJICAgIHNpemUgICAgICA9IGNhcGFjaXR5OworICAgdW5zaWduZWQgbG9uZyAgICBvZmZzZXQ7CisgICBzdHJ1Y3QgZHJpdmVfaW5mbyB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcnM7CisgICAgICB1bnNpZ25lZCBjaGFyICBoZWFkczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgIHNlY3RvcnM7CisgICB9IGk7CisgICAKKyAgIC8qIE5PVEVTOgorICAgICAgVGhlIFJBTSBhcmVhIHN0YXJ0cyBhdCAweDFmMDAgZnJvbSB0aGUgYmlvc19iYXNlIGFkZHJlc3MuCisKKyAgICAgIEZvciBCSU9TIFZlcnNpb24gMi4wOgorICAgICAgCisgICAgICBUaGUgZHJpdmUgcGFyYW1ldGVyIHRhYmxlIHNlZW1zIHRvIHN0YXJ0IGF0IDB4MWYzMC4KKyAgICAgIFRoZSBmaXJzdCBieXRlJ3MgcHVycG9zZSBpcyBub3Qga25vd24uCisgICAgICBOZXh0IGlzIHRoZSBjeWxpbmRlciwgaGVhZCwgYW5kIHNlY3RvciBpbmZvcm1hdGlvbi4KKyAgICAgIFRoZSBsYXN0IDQgYnl0ZXMgYXBwZWFyIHRvIGJlIHRoZSBkcml2ZSdzIHNpemUgaW4gc2VjdG9ycy4KKyAgICAgIFRoZSBvdGhlciBieXRlcyBpbiB0aGUgZHJpdmUgcGFyYW1ldGVyIHRhYmxlIGFyZSB1bmtub3duLgorICAgICAgSWYgYW55b25lIGZpZ3VyZXMgdGhlbSBvdXQsIHBsZWFzZSBzZW5kIG1lIG1haWwsIGFuZCBJIHdpbGwKKyAgICAgIHVwZGF0ZSB0aGVzZSBub3Rlcy4KKworICAgICAgVGFwZSBkcml2ZXMgZG8gbm90IGdldCBwbGFjZWQgaW4gdGhpcyB0YWJsZS4KKworICAgICAgVGhlcmUgaXMgYW5vdGhlciB0YWJsZSBhdCAweDFmZWE6CisgICAgICBJZiB0aGUgYnl0ZSBpcyAweDAxLCB0aGVuIHRoZSBTQ1NJIElEIGlzIG5vdCBpbiB1c2UuCisgICAgICBJZiB0aGUgYnl0ZSBpcyAweDE4IG9yIDB4NDgsIHRoZW4gdGhlIFNDU0kgSUQgaXMgaW4gdXNlLAorICAgICAgYWx0aG91Z2ggdGFwZXMgZG9uJ3Qgc2VlbSB0byBiZSBpbiB0aGlzIHRhYmxlLiAgSSBoYXZlbid0CisgICAgICBzZWVuIGFueSBvdGhlciBudW1iZXJzIChpbiBhIGxpbWl0ZWQgc2FtcGxlKS4KKworICAgICAgMHgxZjJkIGlzIGEgZHJpdmUgY291bnQgKGkuZS4sIG5vdCBpbmNsdWRpbmcgdGFwZXMpCisKKyAgICAgIFRoZSB0YWJsZSBhdCAweDFmY2MgYXJlIEkvTyBwb3J0cyBhZGRyZXNzZXMgZm9yIHRoZSB2YXJpb3VzCisgICAgICBvcGVyYXRpb25zLiAgSSBjYWxjdWxhdGUgdGhlc2UgYnkgaGFuZCBpbiB0aGlzIGRyaXZlciBjb2RlLgorCisgICAgICAKKyAgICAgIAorICAgICAgRm9yIHRoZSBJU0EtMjAwUyB2ZXJzaW9uIG9mIEJJT1MgVmVyc2lvbiAyLjA6CisKKyAgICAgIFRoZSBkcml2ZSBwYXJhbWV0ZXIgdGFibGUgc3RhcnRzIGF0IDB4MWYzMy4KKworICAgICAgV0FSTklORzogQXNzdW1lIHRoYXQgdGhlIHRhYmxlIGVudHJ5IGlzIDI1IGJ5dGVzIGxvbmcuICBTb21lb25lIG5lZWRzCisgICAgICB0byBjaGVjayB0aGlzIGZvciB0aGUgUXVhbnR1bSBJU0EtMjAwUyBjYXJkLgorCisgICAgICAKKyAgICAgIAorICAgICAgRm9yIEJJT1MgVmVyc2lvbiAzLjI6CisKKyAgICAgIFRoZSBkcml2ZSBwYXJhbWV0ZXIgdGFibGUgc3RhcnRzIGF0IDB4MWY3MC4gIEVhY2ggZW50cnkgaXMKKyAgICAgIDB4MGEgYnl0ZXMgbG9uZy4gIEhlYWRzIGFyZSBvbmUgbGVzcyB0aGFuIHdlIG5lZWQgdG8gcmVwb3J0LgorICAgICovCisKKyAgIGlmIChNQUpPUihiZGV2LT5iZF9kZXYpICE9IFNDU0lfRElTSzBfTUFKT1IpIHsKKyAgICAgIHByaW50aygic2NzaTogPGZkb21haW4+IGZkb21haW5fMTZ4MF9iaW9zcGFyYW06IHRvbyBtYW55IGRpc2tzIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIGRyaXZlID0gTUlOT1IoYmRldi0+YmRfZGV2KSA+PiA0OworCisgICBpZiAoYmlvc19tYWpvciA9PSAyKSB7CisgICAgICBzd2l0Y2ggKFF1YW50dW0pIHsKKyAgICAgIGNhc2UgMjoJCQkvKiBJU0FfMjAwUyAqLworCQkJCS8qIFRoZSB2YWx1ZSBvZiAyNSBoYXMgbmV2ZXIgYmVlbiB2ZXJpZmllZC4KKwkJCQkgICBJdCBzaG91bGQgcHJvYmFibHkgYmUgMTUuICovCisJIG9mZnNldCA9IDB4MWYzMyArIGRyaXZlICogMjU7CisJIGJyZWFrOworICAgICAgY2FzZSAzOgkJCS8qIElTQV8yNTBNRyAqLworCSBvZmZzZXQgPSAweDFmMzYgKyBkcml2ZSAqIDE1OworCSBicmVhazsKKyAgICAgIGNhc2UgNDoJCQkvKiBJU0FfMjAwUyAoYW5vdGhlciBvbmUpICovCisJIG9mZnNldCA9IDB4MWYzNCArIGRyaXZlICogMTU7CisJIGJyZWFrOworICAgICAgZGVmYXVsdDoKKwkgb2Zmc2V0ID0gMHgxZjMxICsgZHJpdmUgKiAyNTsKKwkgYnJlYWs7CisgICAgICB9CisgICAgICBtZW1jcHlfZnJvbWlvKCAmaSwgYmlvc19tZW0gKyBvZmZzZXQsIHNpemVvZiggc3RydWN0IGRyaXZlX2luZm8gKSApOworICAgICAgaW5mb19hcnJheVswXSA9IGkuaGVhZHM7CisgICAgICBpbmZvX2FycmF5WzFdID0gaS5zZWN0b3JzOworICAgICAgaW5mb19hcnJheVsyXSA9IGkuY3lsaW5kZXJzOworICAgfSBlbHNlIGlmIChiaW9zX21ham9yID09IDMKKwkgICAgICAmJiBiaW9zX21pbm9yID49IDAKKwkgICAgICAmJiBiaW9zX21pbm9yIDwgNCkgeyAvKiAzLjAgYW5kIDMuMiBCSU9TICovCisgICAgICBtZW1jcHlfZnJvbWlvKCAmaSwgYmlvc19tZW0gKyAweDFmNzEgKyBkcml2ZSAqIDEwLAorCQkgICAgIHNpemVvZiggc3RydWN0IGRyaXZlX2luZm8gKSApOworICAgICAgaW5mb19hcnJheVswXSA9IGkuaGVhZHMgKyAxOworICAgICAgaW5mb19hcnJheVsxXSA9IGkuc2VjdG9yczsKKyAgICAgIGluZm9fYXJyYXlbMl0gPSBpLmN5bGluZGVyczsKKyAgIH0gZWxzZSB7CQkJLyogMy40IEJJT1MgKGFuZCB1cD8pICovCisgICAgICAvKiBUaGlzIGFsZ29yaXRobSB3YXMgcHJvdmlkZWQgYnkgRnV0dXJlIERvbWFpbiAobXVjaCB0aGFua3MhKS4gKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBzY3NpX2Jpb3NfcHRhYmxlKGJkZXYpOworCisgICAgICBpZiAocCAmJiBwWzY1XSA9PSAweGFhICYmIHBbNjRdID09IDB4NTUgLyogUGFydGl0aW9uIHRhYmxlIHZhbGlkICovCisJICAmJiBwWzRdKSB7CQkJICAgIC8qIFBhcnRpdGlvbiB0eXBlICovCisKKwkgLyogVGhlIHBhcnRpdGlvbiB0YWJsZSBsYXlvdXQgaXMgYXMgZm9sbG93czoKKworCSAgICBTdGFydDogMHgxYjNoCisJICAgIE9mZnNldDogMCA9IHBhcnRpdGlvbiBzdGF0dXMKKwkJICAgIDEgPSBzdGFydGluZyBoZWFkCisJCSAgICAyID0gc3RhcnRpbmcgc2VjdG9yIGFuZCBjeWxpbmRlciAod29yZCwgZW5jb2RlZCkKKwkJICAgIDQgPSBwYXJ0aXRpb24gdHlwZQorCQkgICAgNSA9IGVuZGluZyBoZWFkCisJCSAgICA2ID0gZW5kaW5nIHNlY3RvciBhbmQgY3lsaW5kZXIgKHdvcmQsIGVuY29kZWQpCisJCSAgICA4ID0gc3RhcnRpbmcgYWJzb2x1dGUgc2VjdG9yIChkb3VibGUgd29yZCkKKwkJICAgIGMgPSBudW1iZXIgb2Ygc2VjdG9ycyAoZG91YmxlIHdvcmQpCisJICAgIFNpZ25hdHVyZTogMHgxZmUgPSAweDU1YWEKKworCSAgICBTbywgdGhpcyBhbGdvcml0aG0gYXNzdW1lczoKKwkgICAgMSkgdGhlIGZpcnN0IHBhcnRpdGlvbiB0YWJsZSBpcyBpbiB1c2UsCisJICAgIDIpIHRoZSBkYXRhIGluIHRoZSBmaXJzdCBlbnRyeSBpcyBjb3JyZWN0LCBhbmQKKwkgICAgMykgcGFydGl0aW9ucyBuZXZlciBkaXZpZGUgY3lsaW5kZXJzCisKKwkgICAgTm90ZSB0aGF0ICgxKSBtYXkgYmUgRkFMU0UgZm9yIE5ldEJTRCAoYW5kIG90aGVyIEJTRCBmbGF2b3JzKSwKKwkgICAgYXMgd2VsbCBhcyBmb3IgTGludXguICBOb3RlIGFsc28sIHRoYXQgTGludXggZG9lc24ndCBwYXkgYW55CisJICAgIGF0dGVudGlvbiB0byB0aGUgZmllbGRzIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBhbGdvcml0aG0gLS0gaXQKKwkgICAgb25seSB1c2VzIHRoZSBhYnNvbHV0ZSBzZWN0b3IgZGF0YS4gIFJlY2VudCB2ZXJzaW9ucyBvZiBMaW51eCdzCisJICAgIGZkaXNrKDEpIHdpbGwgZmlsbCB0aGlzIGRhdGEgaW4gY29ycmVjdGx5LCBhbmQgZm9ydGhjb21pbmcKKwkgICAgdmVyc2lvbnMgd2lsbCBjaGVjayBmb3IgY29uc2lzdGVuY3kuCisKKwkgICAgQ2hlY2tpbmcgZm9yIGEgbm9uLXplcm8gcGFydGl0aW9uIHR5cGUgaXMgbm90IHBhcnQgb2YgdGhlCisJICAgIEZ1dHVyZSBEb21haW4gYWxnb3JpdGhtLCBidXQgaXQgc2VlbWVkIHRvIGJlIGEgcmVhc29uYWJsZSB0aGluZworCSAgICB0byBkbywgZXNwZWNpYWxseSBpbiB0aGUgTGludXggYW5kIEJTRCB3b3JsZHMuICovCisKKwkgaW5mb19hcnJheVswXSA9IHBbNV0gKyAxOwkgICAgLyogaGVhZHMgKi8KKwkgaW5mb19hcnJheVsxXSA9IHBbNl0gJiAweDNmOwkgICAgLyogc2VjdG9ycyAqLworICAgICAgfSBlbHNlIHsKKworIAkgLyogTm90ZSB0aGF0IHRoaXMgbmV3IG1ldGhvZCBndWFyYW50ZWVzIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUKKwkgICAgbGVzcyB0aGFuIDEwMjQgY3lsaW5kZXJzIG9uIGEgcGxhdHRlci4gIFRoaXMgaXMgZ29vZCBmb3IgZHJpdmVzCisJICAgIHVwIHRvIGFwcHJveGltYXRlbHkgNy44NUdCICh3aGVyZSAxR0IgPSAxMDI0ICogMTAyNCBrQikuICovCisKKwkgaWYgKCh1bnNpZ25lZCBpbnQpc2l6ZSA+PSAweDdlMDAwMFUpIHsKKwkgICAgaW5mb19hcnJheVswXSA9IDB4ZmY7IC8qIGhlYWRzICAgPSAyNTUgKi8KKwkgICAgaW5mb19hcnJheVsxXSA9IDB4M2Y7IC8qIHNlY3RvcnMgPSAgNjMgKi8KKwkgfSBlbHNlIGlmICgodW5zaWduZWQgaW50KXNpemUgPj0gMHgyMDAwMDBVKSB7CisJICAgIGluZm9fYXJyYXlbMF0gPSAweDgwOyAvKiBoZWFkcyAgID0gMTI4ICovCisJICAgIGluZm9fYXJyYXlbMV0gPSAweDNmOyAvKiBzZWN0b3JzID0gIDYzICovCisJIH0gZWxzZSB7CisJICAgIGluZm9fYXJyYXlbMF0gPSAweDQwOyAvKiBoZWFkcyAgID0gIDY0ICovCisJICAgIGluZm9fYXJyYXlbMV0gPSAweDIwOyAvKiBzZWN0b3JzID0gIDMyICovCisJIH0KKyAgICAgIH0KKwkJCQkvKiBGb3IgYm90aCBtZXRob2RzLCBjb21wdXRlIHRoZSBjeWxpbmRlcnMgKi8KKyAgICAgIGluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgaW50KXNpemUgLyAoaW5mb19hcnJheVswXSAqIGluZm9fYXJyYXlbMV0gKTsKKyAgICAgIGtmcmVlKHApOworICAgfQorICAgCisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZG9tYWluXzE2eDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZiAoc2hwbnQtPmlycSkKKwkJZnJlZV9pcnEoc2hwbnQtPmlycSwgc2hwbnQpOworCWlmIChzaHBudC0+aW9fcG9ydCAmJiBzaHBudC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaHBudC0+aW9fcG9ydCwgc2hwbnQtPm5faW9fcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZmRvbWFpbl9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICJmZG9tYWluIiwKKwkucHJvY19uYW1lCQk9ICJmZG9tYWluIiwKKwkuZGV0ZWN0CQkJPSBmZG9tYWluXzE2eDBfZGV0ZWN0LAorCS5pbmZvCQkJPSBmZG9tYWluXzE2eDBfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGZkb21haW5fMTZ4MF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGZkb21haW5fMTZ4MF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBmZG9tYWluXzE2eDBfYnVzX3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IGZkb21haW5fMTZ4MF9iaW9zcGFyYW0sCisJLnJlbGVhc2UJCT0gZmRvbWFpbl8xNngwX3JlbGVhc2UsCisJLmNhbl9xdWV1ZQkJPSAxLAorCS50aGlzX2lkCQk9IDYsCisJLnNnX3RhYmxlc2l6ZQkJPSA2NCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworI2lmbmRlZiBQQ01DSUEKKyNkZWZpbmUgZHJpdmVyX3RlbXBsYXRlIGZkb21haW5fZHJpdmVyX3RlbXBsYXRlCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zkb21haW4uaCBiL2RyaXZlcnMvc2NzaS9mZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwMjFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9mZG9tYWluLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIGZkb21haW4uYyAtLSBGdXR1cmUgRG9tYWluIFRNQy0xNngwIFNDU0kgZHJpdmVyCisgKiBBdXRob3I6IFJpY2thcmQgRS4gRmFpdGgsIGZhaXRoQGNzLnVuYy5lZHUKKyAqIENvcHlyaWdodCAxOTkyLTE5OTYsIDE5OTggUmlja2FyZCBFLiBGYWl0aCAoZmFpdGhAYWNtLm9yZykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitleHRlcm4gc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBmZG9tYWluX2RyaXZlcl90ZW1wbGF0ZTsKK2V4dGVybiBpbnQgZmRvbWFpbl9zZXR1cChjaGFyICpzdHIpOworZXh0ZXJuIHN0cnVjdCBTY3NpX0hvc3QgKl9fZmRvbWFpbl8xNngwX2RldGVjdChzdHJ1Y3QgIHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCApOworZXh0ZXJuIGludCBmZG9tYWluXzE2eDBfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTlkNWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2dfTkNSNTM4MC5jCkBAIC0wLDAgKzEsOTQ3IEBACisvKgorICogR2VuZXJpYyBHZW5lcmljIE5DUjUzODAgZHJpdmVyCisgKgkKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBOQ1I1M0M0MDAgZXh0ZW5zaW9ucyAoYykgMTk5NCwxOTk1LDE5OTYsIEtldmluIExlbnRpbgorICogICAgSy5MZW50aW5AY3MubW9uYXNoLmVkdS5hdQorICoKKyAqIE5DUjUzQzQwMEEgZXh0ZW5zaW9ucyAoYykgMTk5NiwgSW5nbWFyIEJhdW1nYXJ0CisgKiAgICBpbmdtYXJAZ29uem8uc2Nod2FiZW4uZGUKKyAqCisgKiBEVEMzMTgxRSBleHRlbnNpb25zIChjKSAxOTk3LCBSb25hbGQgdmFuIEN1aWpsZW5ib3JnCisgKiByb25hbGQudmFuLmN1aWpsZW5ib3JnQHRpcC5ubCBvciBudXR0eUBkZHMubmwKKyAqCisgKiBBZGRlZCBJU0FQTlAgc3VwcG9ydCBmb3IgRFRDNDM2IGFkYXB0ZXJzLAorICogVGhvbWFzIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoCisgKgorICogQUxQSEEgUkVMRUFTRSAxLiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyogCisgKiBUT0RPIDogZmxlc2ggb3V0IERNQSBzdXBwb3J0LCBmaW5kIHNvbWUgb25lIGFjdHVhbGx5IHVzaW5nIHRoaXMgKEkgaGF2ZQorICogCWEgbWVtb3J5IG1hcHBlZCBUcmFudG9yIGJvYXJkIHRoYXQgd29ya3MgZmluZSkKKyAqLworCisvKgorICogT3B0aW9ucyA6CisgKgorICogUEFSSVRZIC0gZW5hYmxlIHBhcml0eSBjaGVja2luZy4gIE5vdCBzdXBwb3J0ZWQuCisgKgorICogU0NTSTIgLSBlbmFibGUgc3VwcG9ydCBmb3IgU0NTSS1JSSB0YWdnZWQgcXVldWVpbmcuICBVbnRlc3RlZC4KKyAqCisgKiBVU0xFRVAgLSBlbmFibGUgc3VwcG9ydCBmb3IgZGV2aWNlcyB0aGF0IGRvbid0IGRpc2Nvbm5lY3QuICBVbnRlc3RlZC4KKyAqCisgKiBUaGUgY2FyZCBpcyBkZXRlY3RlZCBhbmQgaW5pdGlhbGl6ZWQgaW4gb25lIG9mIHNldmVyYWwgd2F5cyA6IAorICogMS4gIFdpdGggY29tbWFuZCBsaW5lIG92ZXJyaWRlcyAtIE5DUjUzODA9cG9ydCxpcnEgbWF5IGJlIAorICogICAgIHVzZWQgb24gdGhlIExJTE8gY29tbWFuZCBsaW5lIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KKyAqCisgKiAyLiAgV2l0aCB0aGUgR0VORVJJQ19OQ1I1MzgwX09WRVJSSURFIGNvbXBpbGUgdGltZSBkZWZpbmUuICBUaGlzIGlzIAorICogICAgIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBhZGRyZXNzLCBpcnEsIGRtYSwgYm9hcmQgdHVwbGVzLiAgSWUsIGZvcgorICogICAgIG9uZSBib2FyZCBhdCAweDM1MCwgSVJRNSwgbm8gZG1hLCBJIGNvdWxkIHNheSAgCisgKiAgICAgLURHRU5FUklDX05DUjUzODBfT1ZFUlJJREU9e3sweGNjMDAwLCA1LCBETUFfTk9ORSwgQk9BUkRfTkNSNTM4MH19CisgKiAKKyAqIC0xIHNob3VsZCBiZSBzcGVjaWZpZWQgZm9yIG5vIG9yIERNQSBpbnRlcnJ1cHQsIC0yIHRvIGF1dG9wcm9iZSBmb3IgYW4gCisgKiAJSVJRIGxpbmUgaWYgb3ZlcnJpZGRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIDMuICBXaGVuIGluY2x1ZGVkIGFzIGEgbW9kdWxlLCB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZToKKyAqICAgICAgICAgbmNyX2lycT14eAl0aGUgaW50ZXJydXB0CisgKiAgICAgICAgIG5jcl9hZGRyPXh4ICB0aGUgcG9ydCBvciBiYXNlIGFkZHJlc3MgKGZvciBwb3J0IG9yIG1lbW9yeQorICogICAgICAgICAgICAgIAltYXBwZWQsIHJlc3AuKQorICogICAgICAgICBuY3JfZG1hPXh4CXRoZSBETUEKKyAqICAgICAgICAgbmNyXzUzODA9MQl0byBzZXQgdXAgZm9yIGEgTkNSNTM4MCBib2FyZAorICogICAgICAgICBuY3JfNTNjNDAwPTEJdG8gc2V0IHVwIGZvciBhIE5DUjUzQzQwMCBib2FyZAorICogICAgIGUuZy4KKyAqICAgICBtb2Rwcm9iZSBnX05DUjUzODAgbmNyX2lycT01IG5jcl9hZGRyPTB4MzUwIG5jcl81MzgwPTEKKyAqICAgICAgIGZvciBhIHBvcnQgbWFwcGVkIE5DUjUzODAgYm9hcmQgb3IKKyAqICAgICBtb2Rwcm9iZSBnX05DUjUzODAgbmNyX2lycT0yNTUgbmNyX2FkZHI9MHhjODAwMCBuY3JfNTNjNDAwPTEKKyAqICAgICAgIGZvciBhIG1lbW9yeSBtYXBwZWQgTkNSNTNDNDAwIGJvYXJkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIAorICogMjU1IHNob3VsZCBiZSBzcGVjaWZpZWQgZm9yIG5vIG9yIERNQSBpbnRlcnJ1cHQsIDI1NCB0byBhdXRvcHJvYmUgZm9yIGFuIAorICogCUlSUSBsaW5lIGlmIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqICAgICAKKyAqLworCisvKgorICogJExvZzogZ2VuZXJpY19OQ1I1MzgwLmMsdiAkCisgKi8KKworLyogc2V0dGluZ3MgZm9yIERUQzMxODFFIGNhcmQgd2l0aCBvbmx5IE11c3RlayBzY2FubmVyIGF0dGFjaGVkICovCisjZGVmaW5lIFVTTEVFUAorI2RlZmluZSBVU0xFRVBfUE9MTAkxCisjZGVmaW5lIFVTTEVFUF9TTEVFUAkyMAorI2RlZmluZSBVU0xFRVBfV0FJVExPTkcJNTAwCisKKyNkZWZpbmUgQVVUT1BST0JFX0lSUQorI2RlZmluZSBBVVRPU0VOU0UKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1M0M0MDAKKyNkZWZpbmUgTkNSNTNDNDAwX1BTRVVET19ETUEgMQorI2RlZmluZSBQU0VVRE9fRE1BCisjZGVmaW5lIE5DUjUzQzQwMAorI2RlZmluZSBOQ1I1MzgwX1NUQVRTCisjdW5kZWYgTkNSNTM4MF9TVEFUX0xJTUlUCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImdfTkNSNTM4MC5oIgorI2luY2x1ZGUgIk5DUjUzODAuaCIKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgTkNSX05PVF9TRVQgMAorc3RhdGljIGludCBuY3JfaXJxID0gTkNSX05PVF9TRVQ7CitzdGF0aWMgaW50IG5jcl9kbWEgPSBOQ1JfTk9UX1NFVDsKK3N0YXRpYyBpbnQgbmNyX2FkZHIgPSBOQ1JfTk9UX1NFVDsKK3N0YXRpYyBpbnQgbmNyXzUzODAgPSBOQ1JfTk9UX1NFVDsKK3N0YXRpYyBpbnQgbmNyXzUzYzQwMCA9IE5DUl9OT1RfU0VUOworc3RhdGljIGludCBuY3JfNTNjNDAwYSA9IE5DUl9OT1RfU0VUOworc3RhdGljIGludCBkdGNfMzE4MWUgPSBOQ1JfTk9UX1NFVDsKKworc3RhdGljIHN0cnVjdCBvdmVycmlkZSB7CisJTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHM7CisJaW50IGlycTsKKwlpbnQgZG1hOworCWludCBib2FyZDsJCS8qIFVzZSBOQ1I1M2M0MDAsIFJpY29oLCBldGMuIGV4dGVuc2lvbnMgPyAqLworfSBvdmVycmlkZXMKKyNpZmRlZiBHRU5FUklDX05DUjUzODBfT1ZFUlJJREUKK1tdIF9faW5pdGRhdGEgPSBHRU5FUklDX05DUjUzODBfT1ZFUlJJREU7CisjZWxzZQorWzFdIF9faW5pdGRhdGEgPSB7IHsgMCx9LH07CisjZW5kaWYKKworCisjZGVmaW5lIE5PX09WRVJSSURFUyAoc2l6ZW9mKG92ZXJyaWRlcykgLyBzaXplb2Yoc3RydWN0IG92ZXJyaWRlKSkKKworI2lmbmRlZiBNT0RVTEUgCisKKy8qKgorICoJaW50ZXJuYWxfc2V0dXAJCS0JaGFuZGxlIGxpbG8gY29tbWFuZCBzdHJpbmcgb3ZlcnJpZGUKKyAqCUBib2FyZDoJQk9BUkRfKiBpZGVudGlmaWVyIGZvciB0aGUgYm9hcmQKKyAqCUBzdHI6IHVudXNlZAorICoJQGludHM6IG51bWVyaWMgcGFyYW1ldGVycworICoKKyAqIAlEbyBMSUxPIGNvbW1hbmQgbGluZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3ZlcnJpZGVzIGFycmF5LiBEaXNwbGF5CisgKgllcnJvcnMgd2hlbiBuZWVkZWQKKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbnRlcm5hbF9zZXR1cChpbnQgYm9hcmQsIGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCXN0YXRpYyBpbnQgY29tbWFuZGxpbmVfY3VycmVudCA9IDA7CisJc3dpdGNoIChib2FyZCkgeworCWNhc2UgQk9BUkRfTkNSNTM4MDoKKwkJaWYgKGludHNbMF0gIT0gMiAmJiBpbnRzWzBdICE9IDMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZ2VuZXJpY19OQ1I1MzgwX3NldHVwIDogdXNhZ2UgbmNyNTM4MD0iIFNUUlZBTChOQ1I1MzgwX21hcF9uYW1lKSAiLGlycSxkbWFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgQk9BUkRfTkNSNTNDNDAwOgorCQlpZiAoaW50c1swXSAhPSAyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImdlbmVyaWNfTkNSNTNDNDAwX3NldHVwIDogdXNhZ2UgbmNyNTNjNDAwPSIgU1RSVkFMKE5DUjUzODBfbWFwX25hbWUpICIsaXJxXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIEJPQVJEX05DUjUzQzQwMEE6CisJCWlmIChpbnRzWzBdICE9IDIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZ2VuZXJpY19OQ1I1M0M0MDBBX3NldHVwIDogdXNhZ2UgbmNyNTNjNDAwYT0iIFNUUlZBTChOQ1I1MzgwX21hcF9uYW1lKSAiLGlycVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCT0FSRF9EVEMzMTgxRToKKwkJaWYgKGludHNbMF0gIT0gMikgeworCQkJcHJpbnRrKCJnZW5lcmljX0RUQzMxODFFX3NldHVwIDogdXNhZ2UgZHRjMzE4MWU9IiBTVFJWQUwoTkNSNTM4MF9tYXBfbmFtZSkgIixpcnFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCX0KKworCWlmIChjb21tYW5kbGluZV9jdXJyZW50IDwgTk9fT1ZFUlJJREVTKSB7CisJCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5OQ1I1MzgwX21hcF9uYW1lID0gKE5DUjUzODBfbWFwX3R5cGUpIGludHNbMV07CisJCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pcnEgPSBpbnRzWzJdOworCQlpZiAoaW50c1swXSA9PSAzKQorCQkJb3ZlcnJpZGVzW2NvbW1hbmRsaW5lX2N1cnJlbnRdLmRtYSA9IGludHNbM107CisJCWVsc2UKKwkJCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5kbWEgPSBETUFfTk9ORTsKKwkJb3ZlcnJpZGVzW2NvbW1hbmRsaW5lX2N1cnJlbnRdLmJvYXJkID0gYm9hcmQ7CisJCSsrY29tbWFuZGxpbmVfY3VycmVudDsKKwl9Cit9CisKKworLyoqCisgKiAJZG9fTkNSNTNDODBfc2V0dXAJCS0Jc2V0IHVwIGVudHJ5IHBvaW50CisgKglAc3RyOiB1bnVzZWQKKyAqCisgKglTZXR1cCBmdW5jdGlvbiBpbnZva2VkIGF0IGJvb3QgdG8gcGFyc2UgdGhlIG5jcjUzODA9IGNvbW1hbmQKKyAqCWxpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fTkNSNTM4MF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbMTBdOworCisJZ2V0X29wdGlvbnMoc3RyLCBzaXplb2YoaW50cykgLyBzaXplb2YoaW50KSwgaW50cyk7CisJaW50ZXJuYWxfc2V0dXAoQk9BUkRfTkNSNTM4MCwgc3RyLCBpbnRzKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiAJZG9fTkNSNTNDNDAwX3NldHVwCQktCXNldCB1cCBlbnRyeSBwb2ludAorICoJQHN0cjogdW51c2VkCisgKglAaW50czogaW50ZWdlciBwYXJhbWV0ZXJzIGZyb20ga2VybmVsIHNldHVwIGNvZGUgCisgKgorICoJU2V0dXAgZnVuY3Rpb24gaW52b2tlZCBhdCBib290IHRvIHBhcnNlIHRoZSBuY3I1M2M0MDA9IGNvbW1hbmQKKyAqCWxpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fTkNSNTNDNDAwX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1sxMF07CisKKwlnZXRfb3B0aW9ucyhzdHIsIHNpemVvZihpbnRzKSAvIHNpemVvZihpbnQpLCBpbnRzKTsKKwlpbnRlcm5hbF9zZXR1cChCT0FSRF9OQ1I1M0M0MDAsIHN0ciwgaW50cyk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogCWRvX05DUjUzQzQwMEFfc2V0dXAJLQlzZXQgdXAgZW50cnkgcG9pbnQKKyAqCUBzdHI6IHVudXNlZAorICoJQGludHM6IGludGVnZXIgcGFyYW1ldGVycyBmcm9tIGtlcm5lbCBzZXR1cCBjb2RlIAorICoKKyAqCVNldHVwIGZ1bmN0aW9uIGludm9rZWQgYXQgYm9vdCB0byBwYXJzZSB0aGUgbmNyNTNjNDAwYT0gY29tbWFuZAorICoJbGluZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19OQ1I1M0M0MDBBX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1sxMF07CisKKwlnZXRfb3B0aW9ucyhzdHIsIHNpemVvZihpbnRzKSAvIHNpemVvZihpbnQpLCBpbnRzKTsKKwlpbnRlcm5hbF9zZXR1cChCT0FSRF9OQ1I1M0M0MDBBLCBzdHIsIGludHMpOworCXJldHVybiAxOworfQorCisvKioKKyAqIAlkb19EVEMzMTgxRV9zZXR1cAktCXNldCB1cCBlbnRyeSBwb2ludAorICoJQHN0cjogdW51c2VkCisgKglAaW50czogaW50ZWdlciBwYXJhbWV0ZXJzIGZyb20ga2VybmVsIHNldHVwIGNvZGUgCisgKgorICoJU2V0dXAgZnVuY3Rpb24gaW52b2tlZCBhdCBib290IHRvIHBhcnNlIHRoZSBkdGMzMTgxZT0gY29tbWFuZAorICoJbGluZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19EVEMzMTgxRV9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbMTBdOworCisJZ2V0X29wdGlvbnMoc3RyLCBzaXplb2YoaW50cykgLyBzaXplb2YoaW50KSwgaW50cyk7CisJaW50ZXJuYWxfc2V0dXAoQk9BUkRfRFRDMzE4MUUsIHN0ciwgaW50cyk7CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisvKioKKyAqIAlnZW5lcmljX05DUjUzODBfZGV0ZWN0CS0JbG9vayBmb3IgTkNSNTM4MCBjb250cm9sbGVycworICoJQHRwbnQ6IHRoZSBzY3NpIHRlbXBsYXRlCisgKgorICoJU2NhbiBmb3IgdGhlIHByZXNlbnQgb2YgTkNSNTM4MCwgTkNSNTNDNDAwLCBOQ1I1M0M0MDBBLCBEVEMzMTgxRQorICoJYW5kIERUQzQzNihJU0FQblApIGNvbnRyb2xsZXJzLiBJZiBvdmVycmlkZXMgaGF2ZSBiZWVuIHNldCB3ZSB1c2UKKyAqCXRoZW0uCisgKgorICoJVGhlIGNhbGxlciBzdXBwbGllZCBOQ1I1MzgwX2luaXQgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIGhlcmUsIGJlZm9yZQorICoJdGhlIGludGVycnVwdCBsaW5lIGlzIHRha2VuLgorICoKKyAqCUxvY2tzOiBub25lCisgKi8KKworaW50IF9faW5pdCBnZW5lcmljX05DUjUzODBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJc3RhdGljIGludCBjdXJyZW50X292ZXJyaWRlID0gMDsKKwlpbnQgY291bnQsIGk7CisJdW5zaWduZWQgaW50ICpwb3J0czsKKwl1bnNpZ25lZCBsb25nIHJlZ2lvbl9zaXplID0gMTY7CisJc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIG5jcl81M2M0MDBhX3BvcnRzW10gPSB7CisJCTB4MjgwLCAweDI5MCwgMHgzMDAsIDB4MzEwLCAweDMzMCwgMHgzNDAsIDB4MzQ4LCAweDM1MCwgMAorCX07CisJc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIGR0Y18zMTgxZV9wb3J0c1tdID0geworCQkweDIyMCwgMHgyNDAsIDB4MjgwLCAweDJhMCwgMHgyYzAsIDB4MzAwLCAweDMyMCwgMHgzNDAsIDAKKwl9OworCWludCBmbGFncyA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisKKwlpZiAobmNyX2lycSAhPSBOQ1JfTk9UX1NFVCkKKwkJb3ZlcnJpZGVzWzBdLmlycSA9IG5jcl9pcnE7CisJaWYgKG5jcl9kbWEgIT0gTkNSX05PVF9TRVQpCisJCW92ZXJyaWRlc1swXS5kbWEgPSBuY3JfZG1hOworCWlmIChuY3JfYWRkciAhPSBOQ1JfTk9UX1NFVCkKKwkJb3ZlcnJpZGVzWzBdLk5DUjUzODBfbWFwX25hbWUgPSAoTkNSNTM4MF9tYXBfdHlwZSkgbmNyX2FkZHI7CisJaWYgKG5jcl81MzgwICE9IE5DUl9OT1RfU0VUKQorCQlvdmVycmlkZXNbMF0uYm9hcmQgPSBCT0FSRF9OQ1I1MzgwOworCWVsc2UgaWYgKG5jcl81M2M0MDAgIT0gTkNSX05PVF9TRVQpCisJCW92ZXJyaWRlc1swXS5ib2FyZCA9IEJPQVJEX05DUjUzQzQwMDsKKwllbHNlIGlmIChuY3JfNTNjNDAwYSAhPSBOQ1JfTk9UX1NFVCkKKwkJb3ZlcnJpZGVzWzBdLmJvYXJkID0gQk9BUkRfTkNSNTNDNDAwQTsKKwllbHNlIGlmIChkdGNfMzE4MWUgIT0gTkNSX05PVF9TRVQpCisJCW92ZXJyaWRlc1swXS5ib2FyZCA9IEJPQVJEX0RUQzMxODFFOworCisJaWYgKCFjdXJyZW50X292ZXJyaWRlICYmIGlzYXBucF9wcmVzZW50KCkpIHsKKwkJc3RydWN0IHBucF9kZXYgKmRldiA9IE5VTEw7CisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKChkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwgSVNBUE5QX1ZFTkRPUignRCcsICdUJywgJ0MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NDM2ZSksIGRldikpKSB7CisJCQlpZiAoY291bnQgPj0gTk9fT1ZFUlJJREVTKQorCQkJCWJyZWFrOworCQkJaWYgKHBucF9kZXZpY2VfYXR0YWNoKGRldikgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJkdGM0MzZlIHByb2JlOiBhdHRhY2ggZmFpbGVkXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChwbnBfYWN0aXZhdGVfZGV2KGRldikgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJkdGM0MzZlIHByb2JlOiBhY3RpdmF0ZSBmYWlsZWRcbiIpOworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGRldik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXBucF9wb3J0X3ZhbGlkKGRldiwgMCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImR0YzQzNmUgcHJvYmU6IG5vIHZhbGlkIHBvcnRcbiIpOworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGRldik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocG5wX2lycV92YWxpZChkZXYsIDApKQorCQkJCW92ZXJyaWRlc1tjb3VudF0uaXJxID0gcG5wX2lycShkZXYsIDApOworCQkJZWxzZQorCQkJCW92ZXJyaWRlc1tjb3VudF0uaXJxID0gU0NTSV9JUlFfTk9ORTsKKwkJCWlmIChwbnBfZG1hX3ZhbGlkKGRldiwgMCkpCisJCQkJb3ZlcnJpZGVzW2NvdW50XS5kbWEgPSBwbnBfZG1hKGRldiwgMCk7CisJCQllbHNlCisJCQkJb3ZlcnJpZGVzW2NvdW50XS5kbWEgPSBETUFfTk9ORTsKKwkJCW92ZXJyaWRlc1tjb3VudF0uTkNSNTM4MF9tYXBfbmFtZSA9IChOQ1I1MzgwX21hcF90eXBlKSBwbnBfcG9ydF9zdGFydChkZXYsIDApOworCQkJb3ZlcnJpZGVzW2NvdW50XS5ib2FyZCA9IEJPQVJEX0RUQzMxODFFOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCXRwbnQtPnByb2NfbmFtZSA9ICJnX05DUjUzODAiOworCisJZm9yIChjb3VudCA9IDA7IGN1cnJlbnRfb3ZlcnJpZGUgPCBOT19PVkVSUklERVM7ICsrY3VycmVudF9vdmVycmlkZSkgeworCQlpZiAoIShvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSkpCisJCQljb250aW51ZTsKKworCQlwb3J0cyA9IE5VTEw7CisJCXN3aXRjaCAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmJvYXJkKSB7CisJCWNhc2UgQk9BUkRfTkNSNTM4MDoKKwkJCWZsYWdzID0gRkxBR19OT19QU0VVRE9fRE1BOworCQkJYnJlYWs7CisJCWNhc2UgQk9BUkRfTkNSNTNDNDAwOgorCQkJZmxhZ3MgPSBGTEFHX05DUjUzQzQwMDsKKwkJCWJyZWFrOworCQljYXNlIEJPQVJEX05DUjUzQzQwMEE6CisJCQlmbGFncyA9IEZMQUdfTk9fUFNFVURPX0RNQTsKKwkJCXBvcnRzID0gbmNyXzUzYzQwMGFfcG9ydHM7CisJCQlicmVhazsKKwkJY2FzZSBCT0FSRF9EVEMzMTgxRToKKwkJCWZsYWdzID0gRkxBR19OT19QU0VVRE9fRE1BIHwgRkxBR19EVEMzMTgxRTsKKwkJCXBvcnRzID0gZHRjXzMxODFlX3BvcnRzOworCQkJYnJlYWs7CisJCX0KKworI2lmbmRlZiBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNCisJCWlmIChwb3J0cykgeworCQkJLyogd2FrZXVwIHNlcXVlbmNlIGZvciB0aGUgTkNSNTNDNDAwQSBhbmQgRFRDMzE4MUUgKi8KKworCQkJLyogRGlzYWJsZSB0aGUgYWRhcHRlciBhbmQgbG9vayBmb3IgYSBmcmVlIGlvIHBvcnQgKi8KKwkJCW91dGIoMHg1OSwgMHg3NzkpOworCQkJb3V0YigweGI5LCAweDM3OSk7CisJCQlvdXRiKDB4YzUsIDB4Mzc5KTsKKwkJCW91dGIoMHhhZSwgMHgzNzkpOworCQkJb3V0YigweGE2LCAweDM3OSk7CisJCQlvdXRiKDB4MDAsIDB4Mzc5KTsKKworCQkJaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5OQ1I1MzgwX21hcF9uYW1lICE9IFBPUlRfQVVUTykKKwkJCQlmb3IgKGkgPSAwOyBwb3J0c1tpXTsgaSsrKSB7CisJCQkJCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydHNbaV0sICAxNiwgIm5jcjUzYzgwIikpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5OQ1I1MzgwX21hcF9uYW1lID09IHBvcnRzW2ldKQorCQkJCQkJYnJlYWs7CisJCQkJCXJlbGVhc2VfcmVnaW9uKHBvcnRzW2ldLCAxNik7CisJCQl9IGVsc2UKKwkJCQlmb3IgKGkgPSAwOyBwb3J0c1tpXTsgaSsrKSB7CisJCQkJCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydHNbaV0sICAxNiwgIm5jcjUzYzgwIikpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKGluYihwb3J0c1tpXSkgPT0gMHhmZikKKwkJCQkJCWJyZWFrOworCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgMTYpOworCQkJCX0KKwkJCWlmIChwb3J0c1tpXSkgeworCQkJCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBvdXIgcmVnaW9uIHJlc2VydmVkICovCisJCQkJb3V0YigweDU5LCAweDc3OSk7CisJCQkJb3V0YigweGI5LCAweDM3OSk7CisJCQkJb3V0YigweGM1LCAweDM3OSk7CisJCQkJb3V0YigweGFlLCAweDM3OSk7CisJCQkJb3V0YigweGE2LCAweDM3OSk7CisJCQkJb3V0YigweDgwIHwgaSwgMHgzNzkpOwkvKiBzZXQgaW8gcG9ydCB0byBiZSB1c2VkICovCisJCQkJb3V0YigweGMwLCBwb3J0c1tpXSArIDkpOworCQkJCWlmIChpbmIocG9ydHNbaV0gKyA5KSAhPSAweDgwKQorCQkJCQljb250aW51ZTsKKwkJCQllbHNlCisJCQkJCW92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5OQ1I1MzgwX21hcF9uYW1lID0gcG9ydHNbaV07CisJCQl9IGVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIE5vdCBhIDUzQzQwMEEgc3R5bGUgc2V0dXAgLSBqdXN0IGdyYWIgKi8KKwkJCWlmKCEocmVxdWVzdF9yZWdpb24ob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLk5DUjUzODBfbWFwX25hbWUsIE5DUjUzODBfcmVnaW9uX3NpemUsICJuY3I1MzgwIikpKQorCQkJCWNvbnRpbnVlOworCQkJcmVnaW9uX3NpemUgPSBOQ1I1MzgwX3JlZ2lvbl9zaXplOworCQl9CisjZWxzZQorCQlpZighcmVxdWVzdF9tZW1fcmVnaW9uKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5OQ1I1MzgwX21hcF9uYW1lLCBOQ1I1MzgwX3JlZ2lvbl9zaXplLCAibmNyNTM4MCIpKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCQlpZiAoaW5zdGFuY2UgPT0gTlVMTCkgeworI2lmbmRlZiBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNCisJCQlyZWxlYXNlX3JlZ2lvbihvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSwgcmVnaW9uX3NpemUpOworI2Vsc2UKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uTkNSNTM4MF9tYXBfbmFtZSwgTkNSNTM4MF9yZWdpb25fc2l6ZSk7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaW5zdGFuY2UtPk5DUjUzODBfaW5zdGFuY2VfbmFtZSA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5OQ1I1MzgwX21hcF9uYW1lOworI2lmbmRlZiBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNCisJCWluc3RhbmNlLT5uX2lvX3BvcnQgPSByZWdpb25fc2l6ZTsKKyNlbmRpZgorCisJCU5DUjUzODBfaW5pdChpbnN0YW5jZSwgZmxhZ3MpOworCisJCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxICE9IElSUV9BVVRPKQorCQkJaW5zdGFuY2UtPmlycSA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnE7CisJCWVsc2UKKwkJCWluc3RhbmNlLT5pcnEgPSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwgMHhmZmZmKTsKKworCQlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCQkJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIGdlbmVyaWNfTkNSNTM4MF9pbnRyLCBTQV9JTlRFUlJVUFQsICJOQ1I1MzgwIiwgaW5zdGFuY2UpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKwkJCQlpbnN0YW5jZS0+aXJxID0gU0NTSV9JUlFfTk9ORTsKKwkJCX0KKworCQlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQgOiBpbnRlcnJ1cHRzIG5vdCBlbmFibGVkLiBmb3IgYmV0dGVyIGludGVyYWN0aXZlIHBlcmZvcm1hbmNlLFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkIDogcGxlYXNlIGp1bXBlciB0aGUgYm9hcmQgZm9yIGEgZnJlZSBJUlEuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpJWQgOiBhdCAiIFNUUlZBTChOQ1I1MzgwX21hcF9uYW1lKSAiIDB4JXgiLCBpbnN0YW5jZS0+aG9zdF9ubywgKHVuc2lnbmVkIGludCkgaW5zdGFuY2UtPk5DUjUzODBfaW5zdGFuY2VfbmFtZSk7CisJCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpCisJCQlwcmludGsoIiBpbnRlcnJ1cHRzIGRpc2FibGVkIik7CisJCWVsc2UKKwkJCXByaW50aygiIGlycSAlZCIsIGluc3RhbmNlLT5pcnEpOworCQlwcmludGsoIiBvcHRpb25zIENBTl9RVUVVRT0lZCAgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsIENBTl9RVUVVRSwgQ01EX1BFUl9MVU4sIEdFTkVSSUNfTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSk7CisJCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisJCXByaW50aygiXG4iKTsKKworCQkrK2N1cnJlbnRfb3ZlcnJpZGU7CisJCSsrY291bnQ7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKglnZW5lcmljX05DUjUzODBfaW5mbwktCXJlcG9ydGluZyBzdHJpbmcKKyAqCUBob3N0OiBOQ1I1MzgwIHRvIHJlcG9ydCBvbgorICoKKyAqCVJlcG9ydCBkcml2ZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBOQ1I1MzgwCisgKi8KKyAJCitjb25zdCBjaGFyICpnZW5lcmljX05DUjUzODBfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjb25zdCBjaGFyIHN0cmluZ1tdID0gIkdlbmVyaWMgTkNSNTM4MC81M0M0MDAgRHJpdmVyIjsKKwlyZXR1cm4gc3RyaW5nOworfQorCisvKioKKyAqCWdlbmVyaWNfTkNSNTM4MF9yZWxlYXNlX3Jlc291cmNlcwktCWZyZWUgcmVzb3VyY2VzCisgKglAaW5zdGFuY2U6IGhvc3QgYWRhcHRlciB0byBjbGVhbiB1cCAKKyAqCisgKglGcmVlIHRoZSBnZW5lcmljIGludGVyZmFjZSByZXNvdXJjZXMgZnJvbSB0aGlzIGFkYXB0ZXIuCisgKgorICoJTG9ja3M6IG5vbmUKKyAqLworIAoraW50IGdlbmVyaWNfTkNSNTM4MF9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKwkKKwlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKQorCQlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCBOVUxMKTsKKwlOQ1I1MzgwX2V4aXQoaW5zdGFuY2UpOworCisjaWZuZGVmIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0KKwlyZWxlYXNlX3JlZ2lvbihpbnN0YW5jZS0+TkNSNTM4MF9pbnN0YW5jZV9uYW1lLCBpbnN0YW5jZS0+bl9pb19wb3J0KTsKKyNlbHNlCisJcmVsZWFzZV9tZW1fcmVnaW9uKGluc3RhbmNlLT5OQ1I1MzgwX2luc3RhbmNlX25hbWUsIE5DUjUzODBfcmVnaW9uX3NpemUpOworI2VuZGlmCisKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQklPU1BBUkFNCisvKioKKyAqCWdlbmVyaWNfTkNSNTM4MF9iaW9zcGFyYW0KKyAqCUBkaXNrOiBkaXNrIHRvIGNvbXB1dGUgZ2VvbWV0cnkgZm9yCisgKglAZGV2OiBkZXZpY2UgaWRlbnRpZmllciBmb3IgdGhpcyBkaXNrCisgKglAaXA6IHNpemVzIHRvIGZpbGwgaW4KKyAqCisgKglHZW5lcmF0ZXMgYSBCSU9TIC8gRE9TIGNvbXBhdGlibGUgSC1DLVMgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCAKKyAqCWRldmljZSAvIHNpemUuCisgKiAKKyAqIAlYWFggTW9zdCBTQ1NJIGJvYXJkcyB1c2UgdGhpcyBtYXBwaW5nLCBJIGNvdWxkIGJlIGluY29ycmVjdC4gIFNvbWVvbmUKKyAqCXVzaW5nIGhhcmQgZGlza3Mgb24gYSB0cmFudG9yIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGlzIG1hcHBpbmcKKyAqCWNvcnJlc3BvbmRzIHRvIHRoYXQgdXNlZCBieSB0aGUgQklPUyAvIEFTUEkgZHJpdmVyIGJ5IHJ1bm5pbmcgdGhlIGxpbnV4CisgKglmZGlzayBwcm9ncmFtIGFuZCBtYXRjaGluZyB0aGUgSF9DX1MgY29vcmRpbmF0ZXMgdG8gd2hhdCBET1MgdXNlcy4KKyAqCisgKglMb2Nrczogbm9uZQorICovCisKK3N0YXRpYyBpbnQKK2dlbmVyaWNfTkNSNTM4MF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwlpcFswXSA9IDY0OworCWlwWzFdID0gMzI7CisJaXBbMl0gPSBjYXBhY2l0eSA+PiAxMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgTkNSNTNDNDAwX1BTRVVET19ETUEKKworLyoqCisgKglOQ1I1MzgwX3ByZWFkCQktCXBzZXVkbyBETUEgcmVhZAorICoJQGluc3RhbmNlOiBhZGFwdGVyIHRvIHJlYWQgZnJvbQorICoJQGRzdDogYnVmZmVyIHRvIHJlYWQgaW50bworICoJQGxlbjogYnVmZmVyIGxlbmd0aAorICoKKyAqCVBlcmZvcm0gYSBwc3VlZG8gRE1BIG1vZGUgcmVhZCBmcm9tIGFuIE5DUjUzQzQwMCBvciBlcXVpdmFsZW50CisgKgljb250cm9sbGVyCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHJlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKK3sKKwlpbnQgYmxvY2tzID0gbGVuIC8gMTI4OworCWludCBzdGFydCA9IDA7CisJaW50IGJsOworCisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlOQ1I1MzgwX3dyaXRlKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHLCBDU1JfQkFTRSB8IENTUl9UUkFOU19ESVIpOworCU5DUjUzODBfd3JpdGUoQzQwMF9CTE9DS19DT1VOVEVSX1JFRywgYmxvY2tzKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoKGJsID0gTkNSNTM4MF9yZWFkKEM0MDBfQkxPQ0tfQ09VTlRFUl9SRUcpKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAoTkNSNTM4MF9yZWFkKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHKSAmIENTUl9HQVRFRF81M0M4MF9JUlEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiNTNDNDAwcjogR290IDUzQzgwX0lSUSBzdGFydD0lZCwgYmxvY2tzPSVkXG4iLCBzdGFydCwgYmxvY2tzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl3aGlsZSAoTkNSNTM4MF9yZWFkKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHKSAmIENTUl9IT1NUX0JVRl9OT1RfUkRZKTsKKworI2lmbmRlZiBDT05GSUdfU0NTSV9HX05DUjUzODBfTUVNCisJCXsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQkJCWRzdFtzdGFydCArIGldID0gTkNSNTM4MF9yZWFkKEM0MDBfSE9TVF9CVUZGRVIpOworCQl9CisjZWxzZQorCQkvKiBpbXBsaWVzIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0gKi8KKwkJaXNhX21lbWNweV9mcm9taW8oZHN0ICsgc3RhcnQsIE5DUjUzQzQwMF9ob3N0X2J1ZmZlciArIE5DUjUzODBfbWFwX25hbWUsIDEyOCk7CisjZW5kaWYKKwkJc3RhcnQgKz0gMTI4OworCQlibG9ja3MtLTsKKwl9CisKKwlpZiAoYmxvY2tzKSB7CisJCXdoaWxlIChOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSX0hPU1RfQlVGX05PVF9SRFkpCisJCXsKKwkJCS8vIEZJWE1FIC0gbm8gdGltZW91dAorCQl9CisKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCQl7CisJCQlpbnQgaTsJCisJCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisJCQkJZHN0W3N0YXJ0ICsgaV0gPSBOQ1I1MzgwX3JlYWQoQzQwMF9IT1NUX0JVRkZFUik7CisJCX0KKyNlbHNlCisJCS8qIGltcGxpZXMgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTSAqLworCQlpc2FfbWVtY3B5X2Zyb21pbyhkc3QgKyBzdGFydCwgTkNSNTNDNDAwX2hvc3RfYnVmZmVyICsgTkNSNTM4MF9tYXBfbmFtZSwgMTI4KTsKKyNlbmRpZgorCQlzdGFydCArPSAxMjg7CisJCWJsb2Nrcy0tOworCX0KKworCWlmICghKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfR0FURURfNTNDODBfSVJRKSkKKwkJcHJpbnRrKCI1M0M0MDByOiBubyA1M0M4MCBnYXRlZCBpcnEgYWZ0ZXIgdHJhbnNmZXIiKTsKKworI2lmIDAKKwkvKgorCSAqCURPTidUIERPIFRISVMgLSBUSEVZIE5FVkVSIEFSUklWRSEKKwkgKi8KKwlwcmludGsoIjUzQzQwMHI6IFdhaXRpbmcgZm9yIDUzQzgwIHJlZ2lzdGVyc1xuIik7CisJd2hpbGUgKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfNTNDODBfUkVHKQorCQk7CisjZW5kaWYKKwlpZiAoIShOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIEJBU1JfRU5EX0RNQV9UUkFOU0ZFUikpCisJCXByaW50ayhLRVJOX0VSUiAiNTNDNDAwcjogbm8gZW5kIGRtYSBzaWduYWxcbiIpOworCQkKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKwlOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCXJldHVybiAwOworfQorCisvKioKKyAqCU5DUjUzODBfd3JpdGUJCS0JcHNldWRvIERNQSB3cml0ZQorICoJQGluc3RhbmNlOiBhZGFwdGVyIHRvIHJlYWQgZnJvbQorICoJQGRzdDogYnVmZmVyIHRvIHJlYWQgaW50bworICoJQGxlbjogYnVmZmVyIGxlbmd0aAorICoKKyAqCVBlcmZvcm0gYSBwc3VlZG8gRE1BIG1vZGUgcmVhZCBmcm9tIGFuIE5DUjUzQzQwMCBvciBlcXVpdmFsZW50CisgKgljb250cm9sbGVyCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wd3JpdGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKK3sKKwlpbnQgYmxvY2tzID0gbGVuIC8gMTI4OworCWludCBzdGFydCA9IDA7CisJaW50IGJsOworCWludCBpOworCisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKwlOQ1I1MzgwX3dyaXRlKEM0MDBfQ09OVFJPTF9TVEFUVVNfUkVHLCBDU1JfQkFTRSk7CisJTkNSNTM4MF93cml0ZShDNDAwX0JMT0NLX0NPVU5URVJfUkVHLCBibG9ja3MpOworCXdoaWxlICgxKSB7CisJCWlmIChOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSX0dBVEVEXzUzQzgwX0lSUSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICI1M0M0MDB3OiBHb3QgNTNDODBfSVJRIHN0YXJ0PSVkLCBibG9ja3M9JWRcbiIsIHN0YXJ0LCBibG9ja3MpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKChibCA9IE5DUjUzODBfcmVhZChDNDAwX0JMT0NLX0NPVU5URVJfUkVHKSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfSE9TVF9CVUZfTk9UX1JEWSkKKwkJCTsgLy8gRklYTUUgLSB0aW1lb3V0CisjaWZuZGVmIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0KKwkJeworCQkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQkJCU5DUjUzODBfd3JpdGUoQzQwMF9IT1NUX0JVRkZFUiwgc3JjW3N0YXJ0ICsgaV0pOworCQl9CisjZWxzZQorCQkvKiBpbXBsaWVzIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0gKi8KKwkJaXNhX21lbWNweV90b2lvKE5DUjUzQzQwMF9ob3N0X2J1ZmZlciArIE5DUjUzODBfbWFwX25hbWUsIHNyYyArIHN0YXJ0LCAxMjgpOworI2VuZGlmCisJCXN0YXJ0ICs9IDEyODsKKwkJYmxvY2tzLS07CisJfQorCWlmIChibG9ja3MpIHsKKwkJd2hpbGUgKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfSE9TVF9CVUZfTk9UX1JEWSkKKwkJCTsgLy8gRklYTUUgLSBubyB0aW1lb3V0CisKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCQl7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisJCQkJTkNSNTM4MF93cml0ZShDNDAwX0hPU1RfQlVGRkVSLCBzcmNbc3RhcnQgKyBpXSk7CisJCX0KKyNlbHNlCisJCS8qIGltcGxpZXMgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTSAqLworCQlpc2FfbWVtY3B5X3RvaW8oTkNSNTNDNDAwX2hvc3RfYnVmZmVyICsgTkNSNTM4MF9tYXBfbmFtZSwgc3JjICsgc3RhcnQsIDEyOCk7CisjZW5kaWYKKwkJc3RhcnQgKz0gMTI4OworCQlibG9ja3MtLTsKKwl9CisKKyNpZiAwCisJcHJpbnRrKCI1M0M0MDB3OiB3YWl0aW5nIGZvciByZWdpc3RlcnMgdG8gYmUgYXZhaWxhYmxlXG4iKTsKKwlUSEVZIE5FVkVSIERPICEgd2hpbGUgKE5DUjUzODBfcmVhZChDNDAwX0NPTlRST0xfU1RBVFVTX1JFRykgJiBDU1JfNTNDODBfUkVHKTsKKwlwcmludGsoIjUzQzQwMHc6IEdvdCBlbVxuIik7CisjZW5kaWYKKworCS8qIExldCdzIHdhaXQgZm9yIHRoaXMgaW5zdGVhZCAtIGNvdWxkIGJlIHVnbHkgKi8KKwkvKiBBbGwgZG9jdW1lbnRhdGlvbiBzYXlzIHRvIGNoZWNrIGZvciB0aGlzLiBNYXliZSBteSBoYXJkd2FyZSBpcyB0b28KKwkgKiBmYXN0LiBXYWl0aW5nIGZvciBpdCBzZWVtcyB0byB3b3JrIGZpbmUhIEtMTAorCSAqLworCXdoaWxlICghKGkgPSBOQ1I1MzgwX3JlYWQoQzQwMF9DT05UUk9MX1NUQVRVU19SRUcpICYgQ1NSX0dBVEVEXzUzQzgwX0lSUSkpCisJCTsJLy8gRklYTUUgLSBubyB0aW1lb3V0CisKKwkvKgorCSAqIEkga25vdy4gaSBpcyBjZXJ0YWlubHkgIT0gMCBoZXJlIGJ1dCB0aGUgbG9vcCBpcyBuZXcuIFNlZSBwcmV2aW91cworCSAqIGNvbW1lbnQuCisJICovCisJaWYgKGkpIHsKKwkJaWYgKCEoKGkgPSBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSkgJiBCQVNSX0VORF9ETUFfVFJBTlNGRVIpKQorCQkJcHJpbnRrKEtFUk5fRVJSICI1M0M0MDB3OiBObyBFTkQgT0YgRE1BIGJpdCAtIFdIT09QUyEgQkFTUj0lMHhcbiIsIGkpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIjUzQzQwMHc6IG5vIDUzQzgwIGdhdGVkIGlycSBhZnRlciB0cmFuc2ZlciAobGFzdCBibG9jaylcbiIpOworCisjaWYgMAorCWlmICghKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9FTkRfRE1BX1RSQU5TRkVSKSkgeworCQlwcmludGsoS0VSTl9FUlIgIjUzQzQwMHc6IG5vIGVuZCBkbWEgc2lnbmFsXG4iKTsKKwl9CisjZW5kaWYKKwl3aGlsZSAoIShOQ1I1MzgwX3JlYWQoVEFSR0VUX0NPTU1BTkRfUkVHKSAmIFRDUl9MQVNUX0JZVEVfU0VOVCkpCisJCTsgCS8vIFRJTUVPVVQKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBQU0VVRE9fRE1BICovCisKKy8qCisgKglJbmNsdWRlIHRoZSBOQ1I1MzgwIGNvcmUgY29kZSB0aGF0IHdlIGJ1aWxkIG91ciBkcml2ZXIgYXJvdW5kCQorICovCisgCisjaW5jbHVkZSAiTkNSNTM4MC5jIgorCisjZGVmaW5lIFBSSU5UUCh4KSBsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCB4KQorI2RlZmluZSBBTkRQICwKKworc3RhdGljIGludCBzcHJpbnRfb3Bjb2RlKGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgaW50IG9wY29kZSkKK3sKKwlpbnQgc3RhcnQgPSBsZW47CisJUFJJTlRQKCIweCUwMnggIiBBTkRQIG9wY29kZSk7CisJcmV0dXJuIGxlbiAtIHN0YXJ0OworfQorCitzdGF0aWMgaW50IHNwcmludF9jb21tYW5kKGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqY29tbWFuZCkKK3sKKwlpbnQgaSwgcywgc3RhcnQgPSBsZW47CisJbGVuICs9IHNwcmludF9vcGNvZGUoYnVmZmVyLCBsZW4sIGNvbW1hbmRbMF0pOworCWZvciAoaSA9IDEsIHMgPSBDT01NQU5EX1NJWkUoY29tbWFuZFswXSk7IGkgPCBzOyArK2kpCisJCVBSSU5UUCgiJTAyeCAiIEFORFAgY29tbWFuZFtpXSk7CisJUFJJTlRQKCJcbiIpOworCXJldHVybiBsZW4gLSBzdGFydDsKK30KKworLyoqCisgKglzcHJpbnRmX1Njc2lfQ21uZAktCXByaW50IGEgc2NzaSBjb21tYW5kCisgKglAYnVmZmVyOiBidWZmciB0byBwcmludCBpbnRvCisgKglAbGVuOiBidWZmZXIgbGVuZ3RoCisgKglAY21kOiBTQ1NJIGNvbW1hbmQgYmxvY2sKKyAqCQorICoJUHJpbnQgb3V0IHRoZSB0YXJnZXQgYW5kIGNvbW1hbmQgZGF0YSBpbiBoZXgKKyAqLworCitzdGF0aWMgaW50IHNwcmludF9TY3NpX0NtbmQoY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBTY3NpX0NtbmQgKiBjbWQpCit7CisJaW50IHN0YXJ0ID0gbGVuOworCVBSSU5UUCgiaG9zdCBudW1iZXIgJWQgZGVzdGluYXRpb24gdGFyZ2V0ICVkLCBsdW4gJWRcbiIgQU5EUCBjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubyBBTkRQIGNtZC0+ZGV2aWNlLT5pZCBBTkRQIGNtZC0+ZGV2aWNlLT5sdW4pOworCVBSSU5UUCgiICAgICAgICBjb21tYW5kID0gIik7CisJbGVuICs9IHNwcmludF9jb21tYW5kKGJ1ZmZlciwgbGVuLCBjbWQtPmNtbmQpOworCXJldHVybiBsZW4gLSBzdGFydDsKK30KKworLyoqCisgKglnZW5lcmljX05DUjUzODBfcHJvY19pbmZvCS0JL3Byb2MgZm9yIE5DUjUzODAgZHJpdmVyCisgKglAYnVmZmVyOiBidWZmZXIgdG8gcHJpbnQgaW50bworICoJQHN0YXJ0OiBzdGFydCBwb3NpdGlvbgorICoJQG9mZnNldDogb2Zmc2V0IGludG8gYnVmZmVyCisgKglAbGVuOiBsZW5ndGgKKyAqCUBob3N0bm86IGluc3RhbmNlIHRvIGFmZmVjdAorICoJQGlub3V0OiByZWFkL3dyaXRlCisgKgorICoJUHJvdmlkZSB0aGUgcHJvY2ZzIGluZm9ybWF0aW9uIGZvciB0aGUgNTM4MCBjb250cm9sbGVyLiBXZSBmaWxsCisgKgl0aGlzIHdpdGggdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGhlIGNvbW1hbmRzCisgKgliZWluZyBleGVjdXRlZCwgZGlzY29ubmVjdGVkIGNvbW1hbmQgcXVldWUgYW5kIHRoZSBzdGF0aXN0aWNhbAorICoJZGF0YQorICoKKyAqCUxvY2tzOiBnbG9iYWwgY2xpL2xvY2sgZm9yIHF1ZXVlIHdhbGsKKyAqLworIAorc3RhdGljIGludCBnZW5lcmljX05DUjUzODBfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfcHRyLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJaW50IGxlbiA9IDA7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwlpbnQgaTsKKwlTY3NpX0NtbmQgKnB0cjsKKwlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisjaWZkZWYgTkNSNTM4MF9TVEFUUworCVNjc2lfRGV2aWNlICpkZXY7CisJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHNjc2lfZGV2aWNlX3R5cGVzW01BWF9TQ1NJX0RFVklDRV9DT0RFXTsKKyNlbmRpZgorCisJTkNSNTM4MF9zZXR1cChzY3NpX3B0cik7CisJaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikgc2NzaV9wdHItPmhvc3RkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2NzaV9wdHItPmhvc3RfbG9jaywgZmxhZ3MpOworCVBSSU5UUCgiU0NTSSBob3N0IG51bWJlciAlZCA6ICVzXG4iIEFORFAgc2NzaV9wdHItPmhvc3Rfbm8gQU5EUCBzY3NpX3B0ci0+aG9zdHQtPm5hbWUpOworCVBSSU5UUCgiR2VuZXJpYyBOQ1I1MzgwIGRyaXZlciB2ZXJzaW9uICVkXG4iIEFORFAgR0VORVJJQ19OQ1I1MzgwX1BVQkxJQ19SRUxFQVNFKTsKKwlQUklOVFAoIk5DUjUzODAgY29yZSB2ZXJzaW9uICVkXG4iIEFORFAgTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSk7CisjaWZkZWYgTkNSNTNDNDAwCisJUFJJTlRQKCJOQ1I1M0M0MDAgZXh0ZW5zaW9uIHZlcnNpb24gJWRcbiIgQU5EUCBOQ1I1M0M0MDBfUFVCTElDX1JFTEVBU0UpOworCVBSSU5UUCgiTkNSNTNDNDAwIGNhcmQlcyBkZXRlY3RlZFxuIiBBTkRQKCgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikgc2NzaV9wdHItPmhvc3RkYXRhKS0+ZmxhZ3MgJiBGTEFHX05DUjUzQzQwMCkgPyAiIiA6ICIgbm90Iik7CisjIGlmIE5DUjUzQzQwMF9QU0VVRE9fRE1BCisJUFJJTlRQKCJOQ1I1M0M0MDAgcHNldWRvIERNQSB1c2VkXG4iKTsKKyMgZW5kaWYKKyNlbHNlCisJUFJJTlRQKCJOTyBOQ1I1M0M0MDAgZHJpdmVyIGV4dGVuc2lvbnNcbiIpOworI2VuZGlmCisJUFJJTlRQKCJVc2luZyAlcyBtYXBwaW5nIGF0ICVzIDB4JWx4LCAiIEFORFAgU1RSVkFMKE5DUjUzODBfbWFwX2NvbmZpZykgQU5EUCBTVFJWQUwoTkNSNTM4MF9tYXBfbmFtZSkgQU5EUCBzY3NpX3B0ci0+TkNSNTM4MF9pbnN0YW5jZV9uYW1lKTsKKwlpZiAoc2NzaV9wdHItPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQlQUklOVFAoIm5vIGludGVycnVwdFxuIik7CisJZWxzZQorCQlQUklOVFAoIm9uIGludGVycnVwdCAlZFxuIiBBTkRQIHNjc2lfcHRyLT5pcnEpOworCisjaWZkZWYgTkNSNTM4MF9TVEFUUworCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkIHx8IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSB8fCBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlKQorCQlQUklOVFAoIlRoZXJlIGFyZSBjb21tYW5kcyBwZW5kaW5nLCB0cmFuc2ZlciByYXRlcyBtYXkgYmUgY3J1ZFxuIik7CisJaWYgKGhvc3RkYXRhLT5wZW5kaW5ncikKKwkJUFJJTlRQKCIgICVkIHBlbmRpbmcgcmVhZHMiIEFORFAgaG9zdGRhdGEtPnBlbmRpbmdyKTsKKwlpZiAoaG9zdGRhdGEtPnBlbmRpbmd3KQorCQlQUklOVFAoIiAgJWQgcGVuZGluZyB3cml0ZXMiIEFORFAgaG9zdGRhdGEtPnBlbmRpbmd3KTsKKwlpZiAoaG9zdGRhdGEtPnBlbmRpbmdyIHx8IGhvc3RkYXRhLT5wZW5kaW5ndykKKwkJUFJJTlRQKCJcbiIpOworCXNob3N0X2Zvcl9lYWNoX2RldmljZShkZXYsIHNjc2lfcHRyKSB7CisJCXVuc2lnbmVkIGxvbmcgYnIgPSBob3N0ZGF0YS0+Ynl0ZXNfcmVhZFtkZXYtPmlkXTsKKwkJdW5zaWduZWQgbG9uZyBidyA9IGhvc3RkYXRhLT5ieXRlc193cml0ZVtkZXYtPmlkXTsKKwkJbG9uZyB0ciA9IGhvc3RkYXRhLT50aW1lX3JlYWRbZGV2LT5pZF0gLyBIWjsKKwkJbG9uZyB0dyA9IGhvc3RkYXRhLT50aW1lX3dyaXRlW2Rldi0+aWRdIC8gSFo7CisKKwkJUFJJTlRQKCIgIFQ6JWQgJXMgIiBBTkRQIGRldi0+aWQgQU5EUChkZXYtPnR5cGUgPCBNQVhfU0NTSV9ERVZJQ0VfQ09ERSkgPyBzY3NpX2RldmljZV90eXBlc1soaW50KSBkZXYtPnR5cGVdIDogIlVua25vd24iKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWlmIChkZXYtPnZlbmRvcltpXSA+PSAweDIwKQorCQkJCSooYnVmZmVyICsgKGxlbisrKSkgPSBkZXYtPnZlbmRvcltpXTsKKwkJKihidWZmZXIgKyAobGVuKyspKSA9ICcgJzsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlpZiAoZGV2LT5tb2RlbFtpXSA+PSAweDIwKQorCQkJCSooYnVmZmVyICsgKGxlbisrKSkgPSBkZXYtPm1vZGVsW2ldOworCQkqKGJ1ZmZlciArIChsZW4rKykpID0gJyAnOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJaWYgKGRldi0+cmV2W2ldID49IDB4MjApCisJCQkJKihidWZmZXIgKyAobGVuKyspKSA9IGRldi0+cmV2W2ldOworCQkqKGJ1ZmZlciArIChsZW4rKykpID0gJyAnOworCisJCVBSSU5UUCgiXG4lMTBsZCBrYiByZWFkICAgIGluICU1bGQgc2VjcyIgQU5EUCBiciAvIDEwMjQgQU5EUCB0cik7CisJCWlmICh0cikKKwkJCVBSSU5UUCgiIEAgJTVsZCBicHMiIEFORFAgYnIgLyB0cik7CisKKwkJUFJJTlRQKCJcbiUxMGxkIGtiIHdyaXR0ZW4gaW4gJTVsZCBzZWNzIiBBTkRQIGJ3IC8gMTAyNCBBTkRQIHR3KTsKKwkJaWYgKHR3KQorCQkJUFJJTlRQKCIgQCAlNWxkIGJwcyIgQU5EUCBidyAvIHR3KTsKKwkJUFJJTlRQKCJcbiIpOworCX0KKyNlbmRpZgorCisJc3RhdHVzID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworCWlmICghKHN0YXR1cyAmIFNSX1JFUSkpCisJCVBSSU5UUCgiUkVRIG5vdCBhc3NlcnRlZCwgcGhhc2UgdW5rbm93bi5cbiIpOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyAocGhhc2VzW2ldLnZhbHVlICE9IFBIQVNFX1VOS05PV04pICYmIChwaGFzZXNbaV0udmFsdWUgIT0gKHN0YXR1cyAmIFBIQVNFX01BU0spKTsgKytpKTsKKwkJUFJJTlRQKCJQaGFzZSAlc1xuIiBBTkRQIHBoYXNlc1tpXS5uYW1lKTsKKwl9CisKKwlpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwkJUFJJTlRQKCJObyBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmRcbiIpOworCX0gZWxzZSB7CisJCWxlbiArPSBzcHJpbnRfU2NzaV9DbW5kKGJ1ZmZlciwgbGVuLCAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQpOworCX0KKworCVBSSU5UUCgiaXNzdWVfcXVldWVcbiIpOworCisJZm9yIChwdHIgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsgcHRyOyBwdHIgPSAoU2NzaV9DbW5kICopIHB0ci0+aG9zdF9zY3JpYmJsZSkKKwkJbGVuICs9IHNwcmludF9TY3NpX0NtbmQoYnVmZmVyLCBsZW4sIHB0cik7CisKKwlQUklOVFAoImRpc2Nvbm5lY3RlZF9xdWV1ZVxuIik7CisKKwlmb3IgKHB0ciA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgcHRyOyBwdHIgPSAoU2NzaV9DbW5kICopIHB0ci0+aG9zdF9zY3JpYmJsZSkKKwkJbGVuICs9IHNwcmludF9TY3NpX0NtbmQoYnVmZmVyLCBsZW4sIHB0cik7CisKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY3NpX3B0ci0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGxlbjsKK30KKworI3VuZGVmIFBSSU5UUAorI3VuZGVmIEFORFAKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfaW5mbyAgICAgIAk9IGdlbmVyaWNfTkNSNTM4MF9wcm9jX2luZm8sCisJLm5hbWUgICAgICAgICAgIAk9ICJHZW5lcmljIE5DUjUzODAvTkNSNTNDNDAwIFNjc2kgRHJpdmVyIiwKKwkuZGV0ZWN0ICAgICAgICAgCT0gZ2VuZXJpY19OQ1I1MzgwX2RldGVjdCwKKwkucmVsZWFzZSAgICAgICAgCT0gZ2VuZXJpY19OQ1I1MzgwX3JlbGVhc2VfcmVzb3VyY2VzLAorCS5pbmZvICAgICAgICAgICAJPSBnZW5lcmljX05DUjUzODBfaW5mbywKKwkucXVldWVjb21tYW5kICAgCT0gZ2VuZXJpY19OQ1I1MzgwX3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBnZW5lcmljX05DUjUzODBfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZ2VuZXJpY19OQ1I1MzgwX2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBnZW5lcmljX05DUjUzODBfZGV2aWNlX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBnZW5lcmljX05DUjUzODBfaG9zdF9yZXNldCwKKwkuYmlvc19wYXJhbSAgICAgCT0gTkNSNTM4MF9CSU9TUEFSQU0sCisJLmNhbl9xdWV1ZSAgICAgIAk9IENBTl9RVUVVRSwKKyAgICAgICAgLnRoaXNfaWQgICAgICAgIAk9IDcsCisgICAgICAgIC5zZ190YWJsZXNpemUgICAJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuICAgIAk9IENNRF9QRVJfTFVOLAorICAgICAgICAudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCittb2R1bGVfcGFyYW0obmNyX2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuY3JfZG1hLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5jcl9hZGRyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5jcl81MzgwLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5jcl81M2M0MDAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obmNyXzUzYzQwMGEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZHRjXzMxODFlLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK3N0YXRpYyBzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCBpZF90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCSBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCSBJU0FQTlBfVkVORE9SKCdEJywgJ1QnLCAnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHg0MzZlKSwKKwkgMH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaWRfdGFibGUpOworCisKK19fc2V0dXAoIm5jcjUzODA9IiwgZG9fTkNSNTM4MF9zZXR1cCk7CitfX3NldHVwKCJuY3I1M2M0MDA9IiwgZG9fTkNSNTNDNDAwX3NldHVwKTsKK19fc2V0dXAoIm5jcjUzYzQwMGE9IiwgZG9fTkNSNTNDNDAwQV9zZXR1cCk7CitfX3NldHVwKCJkdGMzMTgxZT0iLCBkb19EVEMzMTgxRV9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmggYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwNGNlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9nX05DUjUzODAuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIEdlbmVyaWMgR2VuZXJpYyBOQ1I1MzgwIGRyaXZlciBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcKKyAqCShVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCisgKglkcmV3QGNvbG9yYWRvLmVkdQorICogICAgICArMSAoMzAzKSA0NDAtNDg5NAorICoKKyAqIE5DUjUzQzQwMCBleHRlbnNpb25zIChjKSAxOTk0LDE5OTUsMTk5NiwgS2V2aW4gTGVudGluCisgKiAgICBLLkxlbnRpbkBjcy5tb25hc2guZWR1LmF1CisgKgorICogQUxQSEEgUkVMRUFTRSAxLiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICRMb2c6IGdlbmVyaWNfTkNSNTM4MC5oLHYgJAorICovCisKKyNpZm5kZWYgR0VORVJJQ19OQ1I1MzgwX0gKKyNkZWZpbmUgR0VORVJJQ19OQ1I1MzgwX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIEdFTkVSSUNfTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSAxCisKKyNpZmRlZiBOQ1I1M0M0MDAKKyNkZWZpbmUgQklPU1BBUkFNCisjZGVmaW5lIE5DUjUzODBfQklPU1BBUkFNIGdlbmVyaWNfTkNSNTM4MF9iaW9zcGFyYW0KKyNlbHNlCisjZGVmaW5lIE5DUjUzODBfQklPU1BBUkFNIE5VTEwKKyNlbmRpZgorCisjaWZuZGVmIEFTTQorc3RhdGljIGludCBnZW5lcmljX05DUjUzODBfYWJvcnQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBnZW5lcmljX05DUjUzODBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgZ2VuZXJpY19OQ1I1MzgwX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IGdlbmVyaWNfTkNSNTM4MF9xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBpbnQgZ2VuZXJpY19OQ1I1MzgwX2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGdlbmVyaWNfTkNSNTM4MF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgZ2VuZXJpY19OQ1I1MzgwX2RldmljZV9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgY29uc3QgY2hhciogZ2VuZXJpY19OQ1I1MzgwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKKworI2lmbmRlZiBDTURfUEVSX0xVTgorI2RlZmluZSBDTURfUEVSX0xVTiAyCisjZW5kaWYKKworI2lmbmRlZiBDQU5fUVVFVUUKKyNkZWZpbmUgQ0FOX1FVRVVFIDE2CisjZW5kaWYKKworI2lmbmRlZiBIT1NUU19DCisKKyNkZWZpbmUgX19TVFJWQUwoeCkgI3gKKyNkZWZpbmUgU1RSVkFMKHgpIF9fU1RSVkFMKHgpCisKKyNpZm5kZWYgQ09ORklHX1NDU0lfR19OQ1I1MzgwX01FTQorCisjZGVmaW5lIE5DUjUzODBfbWFwX2NvbmZpZyBwb3J0CisjZGVmaW5lIE5DUjUzODBfbWFwX3R5cGUgaW50CisjZGVmaW5lIE5DUjUzODBfbWFwX25hbWUgcG9ydAorI2RlZmluZSBOQ1I1MzgwX2luc3RhbmNlX25hbWUgaW9fcG9ydAorI2RlZmluZSBOQ1I1M0M0MDBfcmVnaXN0ZXJfb2Zmc2V0IDAKKyNkZWZpbmUgTkNSNTNDNDAwX2FkZHJlc3NfYWRqdXN0IDgKKworI2lmZGVmIE5DUjUzQzQwMAorI2RlZmluZSBOQ1I1MzgwX3JlZ2lvbl9zaXplIDE2CisjZWxzZQorI2RlZmluZSBOQ1I1MzgwX3JlZ2lvbl9zaXplIDgKKyNlbmRpZgorCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIChpbmIoTkNSNTM4MF9tYXBfbmFtZSArIChyZWcpKSkKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSAob3V0YigodmFsdWUpLCAoTkNSNTM4MF9tYXBfbmFtZSArIChyZWcpKSkpCisKKyNlbHNlIAorLyogdGhlcmVmb3JlIENPTkZJR19TQ1NJX0dfTkNSNTM4MF9NRU0gKi8KKworI2RlZmluZSBOQ1I1MzgwX21hcF9jb25maWcgbWVtb3J5CisjZGVmaW5lIE5DUjUzODBfbWFwX3R5cGUgdW5zaWduZWQgbG9uZworI2RlZmluZSBOQ1I1MzgwX21hcF9uYW1lIGJhc2UKKyNkZWZpbmUgTkNSNTM4MF9pbnN0YW5jZV9uYW1lIGJhc2UKKyNkZWZpbmUgTkNSNTNDNDAwX3JlZ2lzdGVyX29mZnNldCAweDEwOAorI2RlZmluZSBOQ1I1M0M0MDBfYWRkcmVzc19hZGp1c3QgMAorI2RlZmluZSBOQ1I1M0M0MDBfbWVtX2Jhc2UgMHgzODgwCisjZGVmaW5lIE5DUjUzQzQwMF9ob3N0X2J1ZmZlciAweDM5MDAKKyNkZWZpbmUgTkNSNTM4MF9yZWdpb25fc2l6ZSAweDNhMDAKKworI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKSBpc2FfcmVhZGIoTkNSNTM4MF9tYXBfbmFtZSArIE5DUjUzQzQwMF9tZW1fYmFzZSArIChyZWcpKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIGlzYV93cml0ZWIodmFsdWUsIE5DUjUzODBfbWFwX25hbWUgKyBOQ1I1M0M0MDBfbWVtX2Jhc2UgKyAocmVnKSkKKyNlbmRpZgorCisjZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIFwKKyAgICBOQ1I1MzgwX21hcF90eXBlIE5DUjUzODBfbWFwX25hbWUKKworI2RlZmluZSBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKSBcCisgICAgcmVnaXN0ZXIgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMKKworI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKSBcCisgICAgTkNSNTM4MF9tYXBfbmFtZSA9IChOQ1I1MzgwX21hcF90eXBlKSgoaW5zdGFuY2UpLT5OQ1I1MzgwX2luc3RhbmNlX25hbWUpCisKKyNkZWZpbmUgTkNSNTM4MF9pbnRyIGdlbmVyaWNfTkNSNTM4MF9pbnRyCisjZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZCBnZW5lcmljX05DUjUzODBfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX2Fib3J0IGdlbmVyaWNfTkNSNTM4MF9hYm9ydAorI2RlZmluZSBOQ1I1MzgwX2J1c19yZXNldCBnZW5lcmljX05DUjUzODBfYnVzX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfZGV2aWNlX3Jlc2V0IGdlbmVyaWNfTkNSNTM4MF9kZXZpY2VfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9ob3N0X3Jlc2V0IGdlbmVyaWNfTkNSNTM4MF9ob3N0X3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfcHJlYWQgZ2VuZXJpY19OQ1I1MzgwX3ByZWFkCisjZGVmaW5lIE5DUjUzODBfcHdyaXRlIGdlbmVyaWNfTkNSNTM4MF9wd3JpdGUKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8gbm90eWV0X2dlbmVyaWNfcHJvY19pbmZvCisKKyNkZWZpbmUgQk9BUkRfTkNSNTM4MAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMEEgMgorI2RlZmluZSBCT0FSRF9EVEMzMTgxRQkzCisKKyNlbmRpZiAvKiBlbHNlIGRlZiBIT1NUU19DICovCisjZW5kaWYgLyogbmRlZiBBU00gKi8KKyNlbmRpZiAvKiBHRU5FUklDX05DUjUzODBfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwX21taW8uYyBiL2RyaXZlcnMvc2NzaS9nX05DUjUzODBfbW1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZGRlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ19OQ1I1MzgwX21taW8uYwpAQCAtMCwwICsxLDEwIEBACisvKgorICoJVGhlcmUgaXMgcHJvYmFibHkgYSBuaWNlciB3YXkgdG8gZG8gdGhpcyBidXQgdGhpcyBvbmUgbWFrZXMKKyAqCXByZXR0eSBvYnZpb3VzIHdoYXQgaXMgaGFwcGVuaW5nLiBXZSByZWJ1aWxkIHRoZSBzYW1lIGZpbGUgd2l0aAorICoJZGlmZmVyZW50IG9wdGlvbnMgZm9yIG1taW8gdmVyc3VzIHBpby4KKyAqLworCisjZGVmaW5lIFNDU0lfR19OQ1I1MzgwX01FTQorCisjaW5jbHVkZSAiZ19OQ1I1MzgwLmMiCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoLmMgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGNiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCkBAIC0wLDAgKzEsNTczOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggZHJpdmVyIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgKiBJQ1Agdm9ydGV4IEdtYkg6ICAgIEdEVCBJU0EvRUlTQS9QQ0kgRGlzayBBcnJheSBDb250cm9sbGVycyAgICAgICAgICAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbjogIFN0b3JhZ2UgUkFJRCBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBnZHRoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMDQgSUNQIHZvcnRleCBHbWJILCBBY2hpbSBMZXVibmVyICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMDQgSW50ZWwgQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMDQgQWRhcHRlYyBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA8YWNoaW1fbGV1Ym5lckBhZGFwdGVjLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBZGRpdGlvbnMvRml4ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBCb2ppIFRvbnkgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4gICAgICAgICAgICAgICAqCisgKiBKb2hhbm5lcyBEaW5uZXIgPGpvaGFubmVzX2Rpbm5lckBhZGFwdGVjLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCAgICAqCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCAgICAqCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMga2VybmVsOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBMaW51eCBrZXJuZWwgMi4yLngsIDIuNC54LCAyLjYueCBzdXBwb3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAkTG9nOiBnZHRoLmMsdiAkCisgKiBSZXZpc2lvbiAxLjczICAyMDA0LzAzLzMxIDEzOjMzOjAzICBhY2hpbQorICogU3BlY2lhbCBjb21tYW5kIDB4ZmQgaW1wbGVtZW50ZWQgdG8gZGV0ZWN0IDY0LWJpdCBETUEgc3VwcG9ydAorICoKKyAqIFJldmlzaW9uIDEuNzIgIDIwMDQvMDMvMTcgMDg6NTY6MDQgIGFjaGltCisgKiA2NC1iaXQgRE1BIG9ubHkgZW5hYmxlZCBpZiBGVyA+PSB4LjQzCisgKgorICogUmV2aXNpb24gMS43MSAgMjAwNC8wMy8wNSAxNTo1MToyOSAgYWNoaW0KKyAqIFNjcmVlbiBzZXJ2aWNlOiBzZXBhcmF0ZSBtZXNzYWdlIGJ1ZmZlciwgYnVnZml4ZXMKKyAqCisgKiBSZXZpc2lvbiAxLjcwICAyMDA0LzAyLzI3IDEyOjE5OjA3ICBhY2hpbQorICogQnVnZml4OiBSZXNldCBiaXQgaW4gY29uZmlnICgweGZlKSBjYWxsIHJlbW92ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjY5ICAyMDA0LzAyLzIwIDA5OjUwOjI0ICBhY2hpbQorICogQ29tcGF0aWJpbGl0eSBjaGFuZ2VzIGZvciBrZXJuZWxzIDwgMi40LjIwCisgKiBCdWdmaXggc2NyZWVuIHNlcnZpY2UgY29tbWFuZCBzaXplCisgKiBwY2lfc2V0X2RtYV9tYXNrKCkgZXJyb3IgaGFuZGxpbmcgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjY4ICAyMDA0LzAyLzE5IDE1OjQ2OjU0ICBhY2hpbQorICogNjQtYml0IERNQSBidWdmaXhlcworICogRHJpdmUgc2l6ZSBidWdmaXggZm9yIGRyaXZlcyA+IDFUQgorICoKKyAqIFJldmlzaW9uIDEuNjcgIDIwMDQvMDEvMTQgMTM6MTE6NTcgIGFjaGltCisgKiBUb29sIGFjY2VzcyBvdmVyIC9wcm9jIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyAqIEJ1Z2ZpeGVzIElPQ1RMcworICoKKyAqIFJldmlzaW9uIDEuNjYgIDIwMDMvMTIvMTkgMTU6MDQ6MDYgIGFjaGltCisgKiBCdWdmaXhlcyBzdXBwb3J0IGZvciBkcml2ZXMgPiAyVEIKKyAqCisgKiBSZXZpc2lvbiAxLjY1ICAyMDAzLzEyLzE1IDExOjIxOjU2ICBhY2hpbQorICogNjQtYml0IERNQSBzdXBwb3J0IGFkZGVkCisgKiBTdXBwb3J0IGZvciBkcml2ZXMgPiAyIFRCIGltcGxlbWVudGVkCisgKiBLZXJuZWxzIDIuMi54LCAyLjQueCwgMi42Lnggc3VwcG9ydGVkCisgKgorICogUmV2aXNpb24gMS42NCAgMjAwMy8wOS8xNyAwODozMDoyNiAgYWNoaW0KKyAqIEVJU0EvSVNBIGNvbnRyb2xsZXIgc2NhbiBkaXNhYmxlZAorICogQ29tbWFuZCBsaW5lIHN3aXRjaCBwcm9iZV9laXNhX2lzYSBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuNjMgIDIwMDMvMDcvMTIgMTQ6MDE6MDAgIERhbmllbGUgQmVsbHVjY2kgPGJlbGx1Y2RhQHRpc2NhbGkuaXQ+CisgKiBNaW5vciBjbGVhbnVwcyBpbiBnZHRoX2lvY3RsLgorICoKKyAqIFJldmlzaW9uIDEuNjIgIDIwMDMvMDIvMjcgMTU6MDE6NTkgIGFjaGltCisgKiBEeW5hbWljIERNQSBtYXBwaW5nIGltcGxlbWVudGVkCisgKiBOZXcgKGNoYXJhY3RlciBkZXZpY2UpIElPQ1RMIGludGVyZmFjZSBhZGRlZAorICogT3RoZXIgY29udHJvbGxlciByZWxhdGVkIGNoYW5nZXMgbWFkZQorICoKKyAqIFJldmlzaW9uIDEuNjEgIDIwMDIvMTEvMDggMTM6MDk6NTIgIGJvamkKKyAqIEFkZGVkIHN1cHBvcnQgZm9yIFhTQ0FMRSBiYXNlZCBSQUlEIENvbnRyb2xsZXJzCisgKiBGaXhlZCBTQ1JFRU5TRVJWSUNFIGluaXRpYWxpemF0aW9uIGluIFNNUCBjYXNlcworICogQWRkZWQgY2hlY2tzIGZvciBnZHRoX3BvbGxpbmcgYmVmb3JlIEdEVEhfSEFfTE9DSworICoKKyAqIFJldmlzaW9uIDEuNjAgIDIwMDIvMDIvMDUgMDk6MzU6MjIgIGFjaGltCisgKiBNT0RVTEVfTElDRU5TRSBvbmx5IGlmIGtlcm5lbCA+PSAyLjQuMTEKKyAqCisgKiBSZXZpc2lvbiAxLjU5ICAyMDAyLzAxLzMwIDA5OjQ2OjMzICBhY2hpbQorICogU21hbGwgY2hhbmdlcworICoKKyAqIFJldmlzaW9uIDEuNTggIDIwMDIvMDEvMjkgMTU6MzA6MDIgIGFjaGltCisgKiBTZXQgZGVmYXVsdCB2YWx1ZSBvZiBzaGFyZWRfYWNjZXNzIHRvIFkKKyAqIE5ldyBzdGF0dXMgU19DQUNIRV9SRVNFUlYgZm9yIGNsdXN0ZXJpbmcgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjU3ICAyMDAxLzA4LzIxIDExOjE2OjM1ICBhY2hpbQorICogQnVnZml4IGZyZWVfaXJxKCkKKyAqCisgKiBSZXZpc2lvbiAxLjU2ICAyMDAxLzA4LzA5IDExOjE5OjM5ICBhY2hpbQorICogU2NzaV9Ib3N0X1RlbXBsYXRlIGNoYW5nZXMKKyAqCisgKiBSZXZpc2lvbiAxLjU1ICAyMDAxLzA4LzA5IDEwOjExOjI4ICBhY2hpbQorICogQ29tbWFuZCBIT1NUX1VORlJFRVpFX0lPIGJlZm9yZSBjYWNoZSBzZXJ2aWNlIGluaXQuCisgKgorICogUmV2aXNpb24gMS41NCAgMjAwMS8wNy8yMCAxMzo0ODoxMiAgYWNoaW0KKyAqIEV4cGFuZDogZ2R0aF9hbmFseXNlX2hkcml2ZSgpIHJlbW92ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjUzICAyMDAxLzA3LzE3IDA5OjUyOjQ5ICBhY2hpbQorICogU21hbGwgT0VNIHJlbGF0ZWQgY2hhbmdlCisgKgorICogUmV2aXNpb24gMS41MiAgMjAwMS8wNi8xOSAxNTowNjoyMCAgYWNoaW0KKyAqIE5ldyBob3N0IGNvbW1hbmQgR0RUX1VORlJFRVpFX0lPIGFkZGVkCisgKgorICogUmV2aXNpb24gMS41MSAgMjAwMS8wNS8yMiAwNjo0MjozNyAgYWNoaW0KKyAqIFBDSTogU3ViZGV2aWNlIElEIGFkZGVkCisgKgorICogUmV2aXNpb24gMS41MCAgMjAwMS8wNS8xNyAxMzo0MjoxNiAgYWNoaW0KKyAqIFN1cHBvcnQgZm9yIEludGVsIFN0b3JhZ2UgUkFJRCBDb250cm9sbGVycyBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuNTAgIDIwMDEvMDUvMTcgMTI6MTI6MzQgIGFjaGltCisgKiBTdXBwb3J0IGZvciBJbnRlbCBTdG9yYWdlIFJBSUQgQ29udHJvbGxlcnMgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjQ5ICAyMDAxLzAzLzE1IDE1OjA3OjE3ICBhY2hpbQorICogTmV3IF9fc2V0dXAgaW50ZXJmYWNlIGZvciBib290IGNvbW1hbmQgbGluZSBvcHRpb25zIGFkZGVkCisgKgorICogUmV2aXNpb24gMS40OCAgMjAwMS8wMi8wNiAxMjozNjoyOCAgYWNoaW0KKyAqIEJ1Z2ZpeCBDbHVzdGVyIHByb3RvY29sCisgKgorICogUmV2aXNpb24gMS40NyAgMjAwMS8wMS8xMCAxNDo0MjowNiAgYWNoaW0KKyAqIE5ldyBzd2l0Y2ggc2hhcmVkX2FjY2VzcyBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuNDYgIDIwMDEvMDEvMDkgMDg6MTE6MzUgIGFjaGltCisgKiBnZHRoX2NvbW1hbmQoKSByZW1vdmVkCisgKiBtZWFuaW5nIG9mIFNjc2lfUG9pbnRlciBtZW1iZXJzIGNoYW5nZWQKKyAqCisgKiBSZXZpc2lvbiAxLjQ1ICAyMDAwLzExLzE2IDEyOjAyOjI0ICBhY2hpbQorICogQ2hhbmdlcyBmb3Iga2VybmVsIDIuNAorICoKKyAqIFJldmlzaW9uIDEuNDQgIDIwMDAvMTAvMTEgMDg6NDQ6MTAgIGFjaGltCisgKiBDbHVzdGVyaW5nIGNoYW5nZXM6IE5ldyBmbGFnIG1lZGlhX2NoYW5nZWQgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjQzICAyMDAwLzA5LzIwIDEyOjU5OjAxICBhY2hpbQorICogRFBNRU0gcmVtYXAgZnVuY3Rpb25zIGZvciBhbGwgUENJIGNvbnRyb2xsZXIgdHlwZXMgaW1wbGVtZW50ZWQKKyAqIFNtYWxsIGNoYW5nZXMgZm9yIGlhNjQgcGxhdGZvcm0KKyAqCisgKiBSZXZpc2lvbiAxLjQyICAyMDAwLzA3LzIwIDA5OjA0OjUwICBhY2hpbQorICogU21hbGwgY2hhbmdlcyBmb3Iga2VybmVsIDIuNAorICoKKyAqIFJldmlzaW9uIDEuNDEgIDIwMDAvMDcvMDQgMTQ6MTE6MTEgIGFjaGltCisgKiBnZHRoX2FuYWx5c2VfaGRyaXZlKCkgYWRkZWQgdG8gcmVzY2FuIGRyaXZlcyBhZnRlciBvbmxpbmUgZXhwYW5zaW9uCisgKgorICogUmV2aXNpb24gMS40MCAgMjAwMC8wNi8yNyAxMToyNDoxNiAgYWNoaW0KKyAqIENoYW5nZXMgQ2x1c3RlcmluZywgU2NyZWVuc2VydmljZQorICoKKyAqIFJldmlzaW9uIDEuMzkgIDIwMDAvMDYvMTUgMTM6MDk6MDQgIGFjaGltCisgKiBDaGFuZ2VzIGZvciBnZHRoX2RvX2NtZCgpCisgKgorICogUmV2aXNpb24gMS4zOCAgMjAwMC8wNi8xNSAxMjowODo0MyAgYWNoaW0KKyAqIEJ1Z2ZpeCBnZHRoX3N5bmNfZXZlbnQoKSwgc2VydmljZSBTQ1JFRU5TRVJWSUNFCisgKiBEYXRhIGRpcmVjdGlvbiBmb3IgY29tbWFuZCAweGMyIGNoYW5nZWQgdG8gRE9VCisgKgorICogUmV2aXNpb24gMS4zNyAgMjAwMC8wNS8yNSAxMzo1MDoxMCAgYWNoaW0KKyAqIE5ldyBkcml2ZXIgcGFyYW1ldGVyIHZpcnRfY3RyIGFkZGVkCisgKgorICogUmV2aXNpb24gMS4zNiAgMjAwMC8wNS8wNCAwODo1MDo0NiAgYWNoaW0KKyAqIEV2ZW50IGJ1ZmZlciBub3cgaW4gZ2R0aF9oYV9zdHIKKyAqCisgKiBSZXZpc2lvbiAxLjM1ICAyMDAwLzAzLzAzIDEwOjQ0OjA4ICBhY2hpbQorICogTmV3IGV2ZW50X3N0cmluZyBvbmx5IHZhbGlkIGZvciB0aGUgUlAgY29udHJvbGxlciBmYW1pbHkKKyAqCisgKiBSZXZpc2lvbiAxLjM0ICAyMDAwLzAzLzAyIDE0OjU1OjI5ICBhY2hpbQorICogTmV3IG1lY2hhbmlzbSBmb3IgYXN5bmMuIGV2ZW50IGhhbmRsaW5nIGltcGxlbWVudGVkCisgKgorICogUmV2aXNpb24gMS4zMyAgMjAwMC8wMi8yMSAxNTozNzozNyAgYWNoaW0KKyAqIEJ1Z2ZpeCBBbHBoYSBwbGF0Zm9ybSArIERQTUVNIGFib3ZlIDRHQgorICoKKyAqIFJldmlzaW9uIDEuMzIgIDIwMDAvMDIvMTQgMTY6MTc6MzcgIGFjaGltCisgKiBCdWdmaXggc2Vuc2VfYnVmZmVyW10gKyByYXcgZGV2aWNlcworICoKKyAqIFJldmlzaW9uIDEuMzEgIDIwMDAvMDIvMTAgMTA6Mjk6MDAgIGFjaGltCisgKiBEZWxldGUgc2Vuc2VfYnVmZmVyWzBdLCBpZiBjb21tYW5kIE9LCisgKgorICogUmV2aXNpb24gMS4zMCAgMTk5OS8xMS8wMiAxMzo0MjozOSAgYWNoaW0KKyAqIEFSUkFZX0RSVl9MSVNUMiBpbXBsZW1lbnRlZAorICogTm93IDI1NSBsb2cuIGFuZCAxMDAgaG9zdCBkcml2ZXMgc3VwcG9ydGVkCisgKgorICogUmV2aXNpb24gMS4yOSAgMTk5OS8xMC8wNSAxMzoyODo0NyAgYWNoaW0KKyAqIEdEVF9DTFVTVF9SRVNFVCBhZGRlZAorICoKKyAqIFJldmlzaW9uIDEuMjggIDE5OTkvMDgvMTIgMTM6NDQ6NTQgIGFjaGltCisgKiBNT1VOVEFMTCByZW1vdmVkCisgKiBDbHVzdGVyIGRyaXZlcyAtPiByZW1vdmVhYmxlIGRyaXZlcworICoKKyAqIFJldmlzaW9uIDEuMjcgIDE5OTkvMDYvMjIgMDc6MjI6MzggIGFjaGltCisgKiBTbWFsbCBjaGFuZ2VzCisgKgorICogUmV2aXNpb24gMS4yNiAgMTk5OS8wNi8xMCAxNjowOToxMiAgYWNoaW0KKyAqIENsdXN0ZXIgSG9zdCBEcml2ZSBzdXBwb3J0OiBCdWdmaXhlcworICoKKyAqIFJldmlzaW9uIDEuMjUgIDE5OTkvMDYvMDEgMTY6MDM6NTYgIGFjaGltCisgKiBnZHRoX2luaXRfcGNpKCk6IE1hbmlwdWxhdGUgY29uZmlnLiBzcGFjZSB0byBzdGFydCBSUCBjb250cm9sbGVyCisgKgorICogUmV2aXNpb24gMS4yNCAgMTk5OS8wNS8yNiAxMTo1MzowNiAgYWNoaW0KKyAqIENsdXN0ZXIgSG9zdCBEcml2ZSBzdXBwb3J0IGFkZGVkCisgKgorICogUmV2aXNpb24gMS4yMyAgMTk5OS8wMy8yNiAwOToxMjozMSAgYWNoaW0KKyAqIERlZmF1bHQgdmFsdWUgZm9yIGhkcl9jaGFubmVsIHNldCB0byAwCisgKgorICogUmV2aXNpb24gMS4yMiAgMTk5OS8wMy8yMiAxNjoyNzoxNiAgYWNoaW0KKyAqIEJ1Z2ZpeDogZ2R0aF9zdG9yZV9ldmVudCgpIG11c3Qgbm90IGJlIGxvY2tlZCB3aXRoIEdEVEhfTE9DS19IQSgpCisgKgorICogUmV2aXNpb24gMS4yMSAgMTk5OS8wMy8xNiAxMzo0MDozNCAgYWNoaW0KKyAqIFByb2JsZW1zIHdpdGggcmVzZXJ2ZWQgZHJpdmVzIHNvbHZlZAorICogZ2R0aF9laF9idXNfcmVzZXQoKSBpbXBsZW1lbnRlZAorICoKKyAqIFJldmlzaW9uIDEuMjAgIDE5OTkvMDMvMTAgMDk6MDg6MTMgIGFjaGltCisgKiBCdWdmaXg6IENvcnJlY3Rpb25zIGluIGdkdGhfZGlyZWN0aW9uX3RhYltdIG1hZGUKKyAqIEJ1Z2ZpeDogSW5jcmVhc2UgY29tbWFuZCB0aW1lb3V0IChnZHRoX3VwZGF0ZV90aW1lb3V0KCkpIE5PVCBpbiBnZHRoX3B1dHEoKQorICoKKyAqIFJldmlzaW9uIDEuMTkgIDE5OTkvMDMvMDUgMTQ6Mzg6MTYgIGFjaGltCisgKiBCdWdmaXg6IEhlYWRzL1NlY3RvcnMgbWFwcGluZyBmb3IgcmVzZXJ2ZWQgZGV2aWNlcyBwb3NzaWJseSB3cm9uZworICogLT4gZ2R0aF9ldmFsX21hcHBpbmcoKSBpbXBsZW1lbnRlZCwgY2hhbmdlcyBpbiBnZHRoX2Jpb3NfcGFyYW0oKQorICogSU5JVF9SRVRSSUVTIHNldCB0byAxMDBzIHRvIGF2b2lkIERFSU5JVC1UaW1lb3V0IGZvciBjb250cm9sbGVycworICogd2l0aCBCSU9TIGRpc2FibGVkIGFuZCBtZW1vcnkgdGVzdCBzZXQgdG8gSW50ZW5zaXZlCisgKiBFbmhhbmNlZCAvcHJvYyBzdXBwb3J0CisgKgorICogUmV2aXNpb24gMS4xOCAgMTk5OS8wMi8yNCAwOTo1NDozMyAgYWNoaW0KKyAqIENvbW1hbmQgbGluZSBwYXJhbWV0ZXIgaGRyX2NoYW5uZWwgaW1wbGVtZW50ZWQKKyAqIEJ1Z2ZpeCBmb3IgRUlTQSBjb250cm9sbGVycyArIExpbnV4IDIuMi54CisgKgorICogUmV2aXNpb24gMS4xNyAgMTk5OC8xMi8xNyAxNTo1ODoxMSAgYWNoaW0KKyAqIENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGltcGxlbWVudGVkCisgKiBDaGFuZ2VzIGZvciBBbHBoYSBwbGF0Zm9ybXMKKyAqIFBDSSBjb250cm9sbGVyIHNjYW4gY2hhbmdlZAorICogU01QIHN1cHBvcnQgaW1wcm92ZWQgKHNwaW5fbG9ja19pcnFzYXZlKCksLi4uKQorICogTmV3IGFzeW5jLiBldmVudHMsIG5ldyBzY2FuL3Jlc2VydmUgY29tbWFuZHMgaW5jbHVkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjE2ICAxOTk4LzA5LzI4IDE2OjA4OjQ2ICBhY2hpbQorICogR0RUX1BDSU1QUjogRFBNRU0gcmVtYXBwaW5nLCBpZiByZXF1aXJlZAorICogbWRlbGF5KCkgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjE1ICAxOTk4LzA2LzAzIDE0OjU0OjA2ICBhY2hpbQorICogZ2R0aF9kZWxheSgpLCBnZHRoX2ZsdXNoKCkgaW1wbGVtZW50ZWQKKyAqIEJ1Z2ZpeDogZ2R0aF9yZWxlYXNlKCkgY2hhbmdlZAorICoKKyAqIFJldmlzaW9uIDEuMTQgIDE5OTgvMDUvMjIgMTA6MDE6MTcgIGFjaGltCisgKiBtajogcGNpYmlvc19zdHJlcnJvcigpIHJlbW92ZWQKKyAqIEltcHJvdmVkIFNNUCBzdXBwb3J0IChpZiB2ZXJzaW9uID49IDIuMS45NSkKKyAqIGdkdGhfaGFsdCgpOiBoYWx0X2NhbGxlZCBmbGFnIGFkZGVkIChpZiB2ZXJzaW9uIDwgMi4xKQorICoKKyAqIFJldmlzaW9uIDEuMTMgIDE5OTgvMDQvMTYgMDk6MTQ6NTcgIGFjaGltCisgKiBSZXNlcnZlIGRyaXZlcyAoZm9yIHJhdyBzZXJ2aWNlKSBpbXBsZW1lbnRlZAorICogTmV3IGVycm9yIGhhbmRsaW5nIGNvZGUgZW5hYmxlZAorICogR2V0IGNvbnRyb2xsZXIgbmFtZSBmcm9tIGJvYXJkX2luZm8oKSBJT0NUTAorICogRmluYWwgcm91bmQgb2YgUENJIGRldmljZSBkcml2ZXIgcGF0Y2hlcyBieSBNYXJ0aW4gTWFyZXMKKyAqCisgKiBSZXZpc2lvbiAxLjEyICAxOTk4LzAzLzAzIDA5OjMyOjM3ICBhY2hpbQorICogRmlicmUgY2hhbm5lbCBjb250cm9sbGVyIHN1cHBvcnQgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjExICAxOTk4LzAxLzI3IDE2OjE5OjE0ICBhY2hpbQorICogU0FfU0hJUlEgYWRkZWQKKyAqIGFkZF90aW1lcigpL2RlbF90aW1lcigpIGluc3RlYWQgb2YgR0RUSF9USU1FUgorICogc2NzaV9hZGRfdGltZXIoKS9zY3NpX2RlbF90aW1lcigpIGluc3RlYWQgb2YgU0NTSV9USU1FUgorICogTmV3IGVycm9yIGhhbmRsaW5nIGluY2x1ZGVkCisgKgorICogUmV2aXNpb24gMS4xMCAgMTk5Ny8xMC8zMSAxMjoyOTo1NyAgYWNoaW0KKyAqIFJlYWQgaGVhZHMvc2VjdG9ycyBmcm9tIGhvc3QgZHJpdmUKKyAqCisgKiBSZXZpc2lvbiAxLjkgIDE5OTcvMDkvMDQgMTA6MDc6MjUgIGFjaGltCisgKiBJTy1tYXBwaW5nIHdpdGggdmlydF90b19idXMoKSwgZ2R0aF9yZWFkYigpLCBnZHRoX3dyaXRlYigpLCAuLi4KKyAqIHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigpIHRvIGdldCBhIG5vdGlmeSBvbiBzaHV0b3duIHVzZWQKKyAqCisgKiBSZXZpc2lvbiAxLjggIDE5OTcvMDQvMDIgMTI6MTQ6MzAgIGFjaGltCisgKiBWZXJzaW9uIDEuMDAgKHNlZSBnZHRoLmgpLCB0ZXN0ZWQgd2l0aCBrZXJuZWwgMi4wLjI5CisgKgorICogUmV2aXNpb24gMS43ICAxOTk3LzAzLzEyIDEzOjMzOjM3ICBhY2hpbQorICogZ2R0aF9yZXNldCgpIGNoYW5nZWQsIG5ldyBhc3luYy4gZXZlbnRzCisgKgorICogUmV2aXNpb24gMS42ICAxOTk3LzAzLzA0IDE0OjAxOjExICBhY2hpbQorICogU2h1dGRvd24gcm91dGluZSBnZHRoX2hhbHQoKSBpbXBsZW1lbnRlZAorICoKKyAqIFJldmlzaW9uIDEuNSAgMTk5Ny8wMi8yMSAwOTowODozNiAgYWNoaW0KKyAqIE5ldyBjb250cm9sbGVyIGluY2x1ZGVkIChSUCwgUlAxLCBSUDIgc2VyaWVzKQorICogSU9DVEwgaW50ZXJmYWNlIGltcGxlbWVudGVkCisgKgorICogUmV2aXNpb24gMS40ICAxOTk2LzA3LzA1IDEyOjQ4OjU1ICBhY2hpbQorICogRnVuY3Rpb24gZ2R0aF9iaW9zX3BhcmFtKCkgaW1wbGVtZW50ZWQKKyAqIE5ldyBjb25zdGFudCBHRFRIX01BWENfUF9MIGluc2VydGVkCisgKiBHRFRfV1JJVEVfVEhSLCBHRFRfRVhUX0lORk8gaW1wbGVtZW50ZWQKKyAqIEZ1bmN0aW9uIGdkdGhfcmVzZXQoKSBjaGFuZ2VkCisgKgorICogUmV2aXNpb24gMS4zICAxOTk2LzA1LzEwIDA5OjA0OjQxICBhY2hpbQorICogU21hbGwgY2hhbmdlcyBmb3IgTGludXggMS4yLjEzCisgKgorICogUmV2aXNpb24gMS4yICAxOTk2LzA1LzA5IDEyOjQ1OjI3ICBhY2hpbQorICogTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQgaW1wbGVtZW50ZWQKKyAqIC9wcm9jIHN1cHBvcnQgY29ycmVjdGlvbnMgbWFkZQorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5Ni8wNC8xMSAwNzozNTo1NyAgYWNoaW0KKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbGwgR0RUIERpc2sgQXJyYXkgQ29udHJvbGxlcnMgYXJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyAqIFRoaXMgaW5jbHVkZXMgdGhlIFBDSS9FSVNBL0lTQSBTQ1NJIERpc2sgQXJyYXkgQ29udHJvbGxlcnMgYW5kIHRoZQorICogUENJIEZpYnJlIENoYW5uZWwgRGlzayBBcnJheSBDb250cm9sbGVycy4gU2VlIGdkdGguaCBmb3IgYSBjb21wbGV0ZQorICogbGlzdCBvZiBhbGwgY29udHJvbGxlciB0eXBlcy4KKyAqIAorICogSWYgeW91IGhhdmUgb25lIG9yIG1vcmUgR0RUMzAwMC8zMDIwIEVJU0EgY29udHJvbGxlcnMgd2l0aCAKKyAqIGNvbnRyb2xsZXIgQklPUyBkaXNhYmxlZCwgeW91IGhhdmUgdG8gc2V0IHRoZSBJUlEgdmFsdWVzIHdpdGggdGhlIAorICogY29tbWFuZCBsaW5lIG9wdGlvbiAiZ2R0aD1pcnExLGlycTIsLi4uIiwgd2hlcmUgdGhlIGlycTEsaXJxMiwuLi4gYXJlCisgKiB0aGUgSVJRIHZhbHVlcyBmb3IgdGhlIEVJU0EgY29udHJvbGxlcnMuCisgKiAKKyAqIEFmdGVyIHRoZSBvcHRpb25hbCBsaXN0IG9mIElSUSB2YWx1ZXMsIG90aGVyIHBvc3NpYmxlIAorICogY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlOgorICogZGlzYWJsZTpZICAgICAgICAgICAgICAgICAgICBkaXNhYmxlIGRyaXZlcgorICogZGlzYWJsZTpOICAgICAgICAgICAgICAgICAgICBlbmFibGUgZHJpdmVyCisgKiByZXNlcnZlX21vZGU6MCAgICAgICAgICAgICAgIHJlc2VydmUgbm8gZHJpdmVzIGZvciB0aGUgcmF3IHNlcnZpY2UKKyAqIHJlc2VydmVfbW9kZToxICAgICAgICAgICAgICAgcmVzZXJ2ZSBhbGwgbm90IGluaXQuLCByZW1vdmFibGUgZHJpdmVzCisgKiByZXNlcnZlX21vZGU6MiAgICAgICAgICAgICAgIHJlc2VydmUgYWxsIG5vdCBpbml0LiBkcml2ZXMKKyAqIHJlc2VydmVfbGlzdDpoLGIsdCxsLGgsYix0LGwsLi4uICAgICByZXNlcnZlIHBhcnRpY3VsYXIgZHJpdmUocykgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0gY29udHJvbGxlciBuby4sIGItIGNoYW5uZWwgbm8uLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0gdGFyZ2V0IElELCBsLSBMVU4KKyAqIHJldmVyc2Vfc2NhbjpZICAgICAgICAgICAgICAgcmV2ZXJzZSBzY2FuIG9yZGVyIGZvciBQQ0kgY29udHJvbGxlcnMgICAgICAgICAKKyAqIHJldmVyc2Vfc2NhbjpOICAgICAgICAgICAgICAgc2NhbiBQQ0kgY29udHJvbGxlcnMgbGlrZSBCSU9TCisgKiBtYXhfaWRzOnggICAgICAgICAgICAgICAgICAgIHggLSB0YXJnZXQgSUQgY291bnQgcGVyIGNoYW5uZWwgKDEuLk1BWElEKQorICogcmVzY2FuOlkgICAgICAgICAgICAgICAgICAgICByZXNjYW4gYWxsIGNoYW5uZWxzL0lEcyAKKyAqIHJlc2NhbjpOICAgICAgICAgICAgICAgICAgICAgdXNlIGFsbCBkZXZpY2VzIGZvdW5kIHVudGlsIG5vdworICogdmlydF9jdHI6WSAgICAgICAgICAgICAgICAgICBtYXAgZXZlcnkgY2hhbm5lbCB0byBhIHZpcnR1YWwgY29udHJvbGxlciAKKyAqIHZpcnRfY3RyOk4gICAgICAgICAgICAgICAgICAgdXNlIG11bHRpIGNoYW5uZWwgc3VwcG9ydCAKKyAqIGhkcl9jaGFubmVsOnggICAgICAgICAgICAgICAgeCAtIG51bWJlciBvZiB2aXJ0dWFsIGJ1cyBmb3IgaG9zdCBkcml2ZXMKKyAqIHNoYXJlZF9hY2Nlc3M6WSAgICAgICAgICAgICAgZGlzYWJsZSBkcml2ZXIgcmVzZXJ2ZS9yZWxlYXNlIHByb3RvY29sIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgYSBzaGFyZWQgcmVzb3VyY2UgZnJvbSBzZXZlcmFsIG5vZGVzLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm9waWF0ZSBjb250cm9sbGVyIGZpcm13YXJlIHJlcXVpcmVkCisgKiBzaGFyZWRfYWNjZXNzOk4gICAgICAgICAgICAgIGVuYWJsZSBkcml2ZXIgcmVzZXJ2ZS9yZWxlYXNlIHByb3RvY29sCisgKiBwcm9iZV9laXNhX2lzYTpZICAgICAgICAgICAgIHNjYW4gZm9yIEVJU0EvSVNBIGNvbnRyb2xsZXJzCisgKiBwcm9iZV9laXNhX2lzYTpOICAgICAgICAgICAgIGRvIG5vdCBzY2FuIGZvciBFSVNBL0lTQSBjb250cm9sbGVycworICogZm9yY2VfZG1hMzI6WSAgICAgICAgICAgICAgICB1c2Ugb25seSAzMiBiaXQgRE1BIG1vZGUKKyAqIGZvcmNlX2RtYTMyOk4gICAgICAgICAgICAgICAgdXNlIDY0IGJpdCBETUEgbW9kZSwgaWYgc3VwcG9ydGVkCisgKgorICogVGhlIGRlZmF1bHQgdmFsdWVzIGFyZTogImdkdGg9ZGlzYWJsZTpOLHJlc2VydmVfbW9kZToxLHJldmVyc2Vfc2NhbjpOLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pZHM6MTI3LHJlc2NhbjpOLHZpcnRfY3RyOk4saGRyX2NoYW5uZWw6MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWNjZXNzOlkscHJvYmVfZWlzYV9pc2E6Tixmb3JjZV9kbWEzMjpOIi4KKyAqIEhlcmUgaXMgYW5vdGhlciBleGFtcGxlOiAiZ2R0aD1yZXNlcnZlX2xpc3Q6MCwxLDIsMCwwLDEsMywwLHJlc2NhbjpZIi4KKyAqIAorICogV2hlbiBsb2FkaW5nIHRoZSBnZHRoIGRyaXZlciBhcyBhIG1vZHVsZSwgdGhlIHNhbWUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLiAKKyAqIFlvdSBjYW4gc2V0IHRoZSBJUlFzIHdpdGggIklSUT0uLi4iLiBIb3dldmVyLCB0aGUgc3ludGF4IHRvIHNwZWNpZnkgdGhlCisgKiBvcHRpb25zIGNoYW5nZXMgc2xpZ2h0bHkuIFlvdSBtdXN0IHJlcGxhY2UgYWxsICcsJyBiZXR3ZWVuIG9wdGlvbnMgCisgKiB3aXRoICcgJyBhbmQgYWxsICc6JyB3aXRoICc9JyBhbmQgeW91IG11c3QgdXNlIAorICogJzEnIGluIHBsYWNlIG9mICdZJyBhbmQgJzAnIGluIHBsYWNlIG9mICdOJy4KKyAqIAorICogRGVmYXVsdDogIm1vZHByb2JlIGdkdGggZGlzYWJsZT0wIHJlc2VydmVfbW9kZT0xIHJldmVyc2Vfc2Nhbj0wCisgKiAgICAgICAgICAgbWF4X2lkcz0xMjcgcmVzY2FuPTAgdmlydF9jdHI9MCBoZHJfY2hhbm5lbD0wIHNoYXJlZF9hY2Nlc3M9MCAKKyAqICAgICAgICAgICBwcm9iZV9laXNhX2lzYT0wIGZvcmNlX2RtYTMyPTAiCisgKiBUaGUgb3RoZXIgZXhhbXBsZTogIm1vZHByb2JlIGdkdGggcmVzZXJ2ZV9saXN0PTAsMSwyLDAsMCwxLDMsMCByZXNjYW49MSIuCisgKi8KKworLyogVGhlIG1lYW5pbmcgb2YgdGhlIFNjc2lfUG9pbnRlciBtZW1iZXJzIGluIHRoaXMgZHJpdmVyIGlzIGFzIGZvbGxvd3M6CisgKiBwdHI6ICAgICAgICAgICAgICAgICAgICAgQ2hhaW5pbmcKKyAqIHRoaXNfcmVzaWR1YWw6ICAgICAgICAgICBDb21tYW5kIHByaW9yaXR5CisgKiBidWZmZXI6ICAgICAgICAgICAgICAgICAgcGh5cy4gRE1BIHNlbnNlIGJ1ZmZlciAKKyAqIGRtYV9oYW5kbGU6ICAgICAgICAgICAgICBwaHlzLiBETUEgYnVmZmVyIChrZXJuZWwgPj0gMi40LjApCisgKiBidWZmZXJzX3Jlc2lkdWFsOiAgICAgICAgVGltZW91dCB2YWx1ZQorICogU3RhdHVzOiAgICAgICAgICAgICAgICAgIENvbW1hbmQgc3RhdHVzIChnZHRoX2RvX2NtZCgpKSwgRE1BIG1lbS4gbWFwcGluZ3MKKyAqIE1lc3NhZ2U6ICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGluZm8gKGdkdGhfZG9fY21kKCkpLCBETUEgZGlyZWN0aW9uCisgKiBoYXZlX2RhdGFfaW46ICAgICAgICAgICAgRmxhZyBmb3IgZ2R0aF93YWl0X2NvbXBsZXRpb24oKQorICogc2VudF9jb21tYW5kOiAgICAgICAgICAgIE9wY29kZSBzcGVjaWFsIGNvbW1hbmQKKyAqIHBoYXNlOiAgICAgICAgICAgICAgICAgICBTZXJ2aWNlL3BhcmFtZXRlci9yZXR1cm4gY29kZSBzcGVjaWFsIGNvbW1hbmQKKyAqLworCisKKy8qIGludGVycnVwdCBjb2FsZXNjaW5nICovCisvKiAjZGVmaW5lIElOVF9DT0FMICovCisKKy8qIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgR0RUSF9TVEFUSVNUSUNTCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2lmZGVmIEdEVEhfUlRDCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9ibGsuaD4KKyNpbmNsdWRlICJzZC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJnZHRoLmgiCisjaW5jbHVkZSAiZ2R0aF9rY29tcGF0LmgiCisKK3N0YXRpYyB2b2lkIGdkdGhfZGVsYXkoaW50IG1pbGxpc2Vjb25kcyk7CitzdGF0aWMgdm9pZCBnZHRoX2V2YWxfbWFwcGluZyh1bG9uZzMyIHNpemUsIHVsb25nMzIgKmN5bHMsIGludCAqaGVhZHMsIGludCAqc2Vjcyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgZ2R0aF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGdkdGhfc3luY19ldmVudChpbnQgaGFudW0saW50IHNlcnZpY2UsdW5jaGFyIGluZGV4LFNjc2lfQ21uZCAqc2NwKTsKK3N0YXRpYyBpbnQgZ2R0aF9hc3luY19ldmVudChpbnQgaGFudW0pOworc3RhdGljIHZvaWQgZ2R0aF9sb2dfZXZlbnQoZ2R0aF9ldnRfZGF0YSAqZHZyLCBjaGFyICpidWZmZXIpOworCitzdGF0aWMgdm9pZCBnZHRoX3B1dHEoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLHVuY2hhciBwcmlvcml0eSk7CitzdGF0aWMgdm9pZCBnZHRoX25leHQoaW50IGhhbnVtKTsKK3N0YXRpYyBpbnQgZ2R0aF9maWxsX3Jhd19jbWQoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLHVuY2hhciBiKTsKK3N0YXRpYyBpbnQgZ2R0aF9zcGVjaWFsX2NtZChpbnQgaGFudW0sU2NzaV9DbW5kICpzY3ApOworc3RhdGljIGdkdGhfZXZ0X3N0ciAqZ2R0aF9zdG9yZV9ldmVudChnZHRoX2hhX3N0ciAqaGEsIHVzaG9ydCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBpZHgsIGdkdGhfZXZ0X2RhdGEgKmV2dCk7CitzdGF0aWMgaW50IGdkdGhfcmVhZF9ldmVudChnZHRoX2hhX3N0ciAqaGEsIGludCBoYW5kbGUsIGdkdGhfZXZ0X3N0ciAqZXN0cik7CitzdGF0aWMgdm9pZCBnZHRoX3JlYWRhcHBfZXZlbnQoZ2R0aF9oYV9zdHIgKmhhLCB1bmNoYXIgYXBwbGljYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkdGhfZXZ0X3N0ciAqZXN0cik7CitzdGF0aWMgdm9pZCBnZHRoX2NsZWFyX2V2ZW50cyh2b2lkKTsKKworc3RhdGljIHZvaWQgZ2R0aF9jb3B5X2ludGVybmFsX2RhdGEoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmZmVyLHVzaG9ydCBjb3VudCk7CitzdGF0aWMgaW50IGdkdGhfaW50ZXJuYWxfY2FjaGVfY21kKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCk7CitzdGF0aWMgaW50IGdkdGhfZmlsbF9jYWNoZV9jbWQoaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwLHVzaG9ydCBoZHJpdmUpOworCitzdGF0aWMgaW50IGdkdGhfc2VhcmNoX2Vpc2EodXNob3J0IGVpc2FfYWRyKTsKK3N0YXRpYyBpbnQgZ2R0aF9zZWFyY2hfaXNhKHVsb25nMzIgYmlvc19hZHIpOworc3RhdGljIGludCBnZHRoX3NlYXJjaF9wY2koZ2R0aF9wY2lfc3RyICpwY2lzdHIpOworc3RhdGljIHZvaWQgZ2R0aF9zZWFyY2hfZGV2KGdkdGhfcGNpX3N0ciAqcGNpc3RyLCB1c2hvcnQgKmNudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHZlbmRvciwgdXNob3J0IGRldik7CitzdGF0aWMgdm9pZCBnZHRoX3NvcnRfcGNpKGdkdGhfcGNpX3N0ciAqcGNpc3RyLCBpbnQgY250KTsKK3N0YXRpYyBpbnQgZ2R0aF9pbml0X2Vpc2EodXNob3J0IGVpc2FfYWRyLGdkdGhfaGFfc3RyICpoYSk7CitzdGF0aWMgaW50IGdkdGhfaW5pdF9pc2EodWxvbmczMiBiaW9zX2FkcixnZHRoX2hhX3N0ciAqaGEpOworc3RhdGljIGludCBnZHRoX2luaXRfcGNpKGdkdGhfcGNpX3N0ciAqcGNpc3RyLGdkdGhfaGFfc3RyICpoYSk7CisKK3N0YXRpYyB2b2lkIGdkdGhfZW5hYmxlX2ludChpbnQgaGFudW0pOworc3RhdGljIGludCBnZHRoX2dldF9zdGF0dXModW5jaGFyICpwSVN0YXR1cyxpbnQgaXJxKTsKK3N0YXRpYyBpbnQgZ2R0aF90ZXN0X2J1c3koaW50IGhhbnVtKTsKK3N0YXRpYyBpbnQgZ2R0aF9nZXRfY21kX2luZGV4KGludCBoYW51bSk7CitzdGF0aWMgdm9pZCBnZHRoX3JlbGVhc2VfZXZlbnQoaW50IGhhbnVtKTsKK3N0YXRpYyBpbnQgZ2R0aF93YWl0KGludCBoYW51bSxpbnQgaW5kZXgsdWxvbmczMiB0aW1lKTsKK3N0YXRpYyBpbnQgZ2R0aF9pbnRlcm5hbF9jbWQoaW50IGhhbnVtLHVuY2hhciBzZXJ2aWNlLHVzaG9ydCBvcGNvZGUsdWxvbmczMiBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmc2NCBwMix1bG9uZzY0IHAzKTsKK3N0YXRpYyBpbnQgZ2R0aF9zZWFyY2hfZHJpdmVzKGludCBoYW51bSk7CitzdGF0aWMgaW50IGdkdGhfYW5hbHlzZV9oZHJpdmUoaW50IGhhbnVtLCB1c2hvcnQgaGRyaXZlKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdkdGhfY3RyX25hbWUoaW50IGhhbnVtKTsKKworc3RhdGljIGludCBnZHRoX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgZ2R0aF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworc3RhdGljIGludCBnZHRoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyB2b2lkIGdkdGhfZmx1c2goaW50IGhhbnVtKTsKK3N0YXRpYyBpbnQgZ2R0aF9oYWx0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVsb25nIGV2ZW50LCB2b2lkICpidWYpOworCisjaWZkZWYgREVCVUdfR0RUSAorc3RhdGljIHVuY2hhciAgIERlYnVnU3RhdGUgPSBERUJVR19HRFRIOworCisjaWZkZWYgX19TRVJJQUxfXworI2RlZmluZSBNQVhfU0VSQlVGIDE2MAorc3RhdGljIHZvaWQgc2VyX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBzZXJfcHV0cyhjaGFyICpzdHIpOworc3RhdGljIHZvaWQgc2VyX3B1dGMoY2hhciBjKTsKK3N0YXRpYyBpbnQgIHNlcl9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIGNoYXIgc3RyYnVmW01BWF9TRVJCVUYrMV07CisjaWZkZWYgX19DT00yX18KKyNkZWZpbmUgQ09NX0JBU0UgMHgyZjgKKyNlbHNlCisjZGVmaW5lIENPTV9CQVNFIDB4M2Y4CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNlcl9pbml0KCkKK3sKKyAgICB1bnNpZ25lZCBwb3J0PUNPTV9CQVNFOworCisgICAgb3V0YigweDgwLHBvcnQrMyk7CisgICAgb3V0YigwLHBvcnQrMSk7CisgICAgLyogMTkyMDAgQmF1ZCwgaWYgOTYwMDogb3V0YigxMixwb3J0KSAqLworICAgIG91dGIoNiwgcG9ydCk7CisgICAgb3V0YigzLHBvcnQrMyk7CisgICAgb3V0YigwLHBvcnQrMSk7CisgICAgLyoKKyAgICBzZXJfcHV0YygnSScpOworICAgIHNlcl9wdXRjKCcgJyk7CisgICAgKi8KK30KKworc3RhdGljIHZvaWQgc2VyX3B1dHMoY2hhciAqc3RyKQoreworICAgIGNoYXIgKnB0cjsKKworICAgIHNlcl9pbml0KCk7CisgICAgZm9yIChwdHI9c3RyOypwdHI7KytwdHIpCisgICAgICAgIHNlcl9wdXRjKCpwdHIpOworfQorCitzdGF0aWMgdm9pZCBzZXJfcHV0YyhjaGFyIGMpCit7CisgICAgdW5zaWduZWQgcG9ydD1DT01fQkFTRTsKKworICAgIHdoaWxlICgoaW5iKHBvcnQrNSkgJiAweDIwKT09MCk7CisgICAgb3V0YihjLHBvcnQpOworICAgIGlmIChjPT0weDBhKQorICAgIHsKKyAgICAgICAgd2hpbGUgKChpbmIocG9ydCs1KSAmIDB4MjApPT0wKTsKKyAgICAgICAgb3V0YigweDBkLHBvcnQpOworICAgIH0KK30KKworc3RhdGljIGludCBzZXJfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgaTsKKworICAgIHZhX3N0YXJ0KGFyZ3MsZm10KTsKKyAgICBpID0gdnNwcmludGYoc3RyYnVmLGZtdCxhcmdzKTsKKyAgICBzZXJfcHV0cyhzdHJidWYpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm4gaTsKK30KKworI2RlZmluZSBUUkFDRShhKSAgICB7aWYgKERlYnVnU3RhdGU9PTEpIHtzZXJfcHJpbnRrIGE7fX0KKyNkZWZpbmUgVFJBQ0UyKGEpICAge2lmIChEZWJ1Z1N0YXRlPT0xIHx8IERlYnVnU3RhdGU9PTIpIHtzZXJfcHJpbnRrIGE7fX0KKyNkZWZpbmUgVFJBQ0UzKGEpICAge2lmIChEZWJ1Z1N0YXRlIT0wKSB7c2VyX3ByaW50ayBhO319CisKKyNlbHNlIC8qICFfX1NFUklBTF9fICovCisjZGVmaW5lIFRSQUNFKGEpICAgIHtpZiAoRGVidWdTdGF0ZT09MSkge3ByaW50ayBhO319CisjZGVmaW5lIFRSQUNFMihhKSAgIHtpZiAoRGVidWdTdGF0ZT09MSB8fCBEZWJ1Z1N0YXRlPT0yKSB7cHJpbnRrIGE7fX0KKyNkZWZpbmUgVFJBQ0UzKGEpICAge2lmIChEZWJ1Z1N0YXRlIT0wKSB7cHJpbnRrIGE7fX0KKyNlbmRpZgorCisjZWxzZSAvKiAhREVCVUcgKi8KKyNkZWZpbmUgVFJBQ0UoYSkKKyNkZWZpbmUgVFJBQ0UyKGEpCisjZGVmaW5lIFRSQUNFMyhhKQorI2VuZGlmCisKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKK3N0YXRpYyB1bG9uZzMyIG1heF9ycT0wLCBtYXhfaW5kZXg9MCwgbWF4X3NnPTA7CisjaWZkZWYgSU5UX0NPQUwKK3N0YXRpYyB1bG9uZzMyIG1heF9pbnRfY29hbD0wOworI2VuZGlmCitzdGF0aWMgdWxvbmczMiBhY3RfaW50cz0wLCBhY3RfaW9zPTAsIGFjdF9zdGF0cz0wLCBhY3RfcnE9MDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBnZHRoX3RpbWVyOworI2VuZGlmCisKKyNkZWZpbmUgUFRSMlVTSE9SVChhKSAgICh1c2hvcnQpKHVsb25nKShhKQorI2RlZmluZSBHRFRPRkZTT0YoYSxiKSAgKHNpemVfdCkmKCgoYSopMCktPmIpICAgCisjZGVmaW5lIElOREVYX09LKGksdCkgICAoKGkpPHNpemVvZih0KS9zaXplb2YoKHQpWzBdKSkKKworI2RlZmluZSBOVU1EQVRBKGEpICAgICAgKCAoZ2R0aF9udW1fc3RyICAqKSgoYSktPmhvc3RkYXRhKSkKKyNkZWZpbmUgSEFEQVRBKGEpICAgICAgICgmKChnZHRoX2V4dF9zdHIgKikoKGEpLT5ob3N0ZGF0YSkpLT5oYWV4dCkKKyNkZWZpbmUgQ01EREFUQShhKSAgICAgICgmKChnZHRoX2V4dF9zdHIgKikoKGEpLT5ob3N0ZGF0YSkpLT5jbWRleHQpCisKKyNkZWZpbmUgQlVTX0wyUChhLGIpICAgICgoYik+KGEpLT52aXJ0X2J1cyA/IChiLTEpOihiKSkKKworI2RlZmluZSBnZHRoX3JlYWRiKGFkZHIpICAgICAgICByZWFkYihhZGRyKQorI2RlZmluZSBnZHRoX3JlYWR3KGFkZHIpICAgICAgICByZWFkdyhhZGRyKQorI2RlZmluZSBnZHRoX3JlYWRsKGFkZHIpICAgICAgICByZWFkbChhZGRyKQorI2RlZmluZSBnZHRoX3dyaXRlYihiLGFkZHIpICAgICB3cml0ZWIoKGIpLChhZGRyKSkKKyNkZWZpbmUgZ2R0aF93cml0ZXcoYixhZGRyKSAgICAgd3JpdGV3KChiKSwoYWRkcikpCisjZGVmaW5lIGdkdGhfd3JpdGVsKGIsYWRkcikgICAgIHdyaXRlbCgoYiksKGFkZHIpKQorCitzdGF0aWMgdW5jaGFyICAgZ2R0aF9kcnFfdGFiWzRdID0gezUsNiw3LDd9OyAgICAgICAgICAgIC8qIERSUSB0YWJsZSAqLworc3RhdGljIHVuY2hhciAgIGdkdGhfaXJxX3RhYls2XSA9IHswLDEwLDExLDEyLDE0LDB9OyAgICAvKiBJUlEgdGFibGUgKi8KK3N0YXRpYyB1bmNoYXIgICBnZHRoX3BvbGxpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9sbGluZyBpZiBUUlVFICovCitzdGF0aWMgdW5jaGFyICAgZ2R0aF9mcm9tX3dhaXQgID0gRkFMU0U7ICAgICAgICAgICAgICAgIC8qIGdkdGhfd2FpdCgpICovCitzdGF0aWMgaW50ICAgICAgd2FpdF9pbmRleCx3YWl0X2hhbnVtOyAgICAgICAgICAgICAgICAgIC8qIGdkdGhfd2FpdCgpICovCitzdGF0aWMgaW50ICAgICAgZ2R0aF9jdHJfY291bnQgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgY291bnQgKi8KK3N0YXRpYyBpbnQgICAgICBnZHRoX2N0cl92Y291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogdmlydC4gY3RyLiBjb3VudCAqLworc3RhdGljIGludCAgICAgIGdkdGhfY3RyX3JlbGVhc2VkID0gMDsgICAgICAgICAgICAgICAgICAvKiBnZHRoX3JlbGVhc2UoKSAqLworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmdkdGhfY3RyX3RhYltNQVhIQV07ICAgICAgICAgICAvKiBjb250cm9sbGVyIHRhYmxlICovCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZ2R0aF9jdHJfdnRhYltNQVhIQSpNQVhCVVNdOyAgIC8qIHZpcnQuIGN0ci4gdGFibGUgKi8KK3N0YXRpYyB1bmNoYXIgICBnZHRoX3dyaXRlX3Rocm91Z2ggPSBGQUxTRTsgICAgICAgICAgICAgLyogd3JpdGUgdGhyb3VnaCAqLworc3RhdGljIGdkdGhfZXZ0X3N0ciBlYnVmZmVyW01BWF9FVkVOVFNdOyAgICAgICAgICAgICAgICAvKiBldmVudCBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZWxhc3RpZHg7CitzdGF0aWMgaW50IGVvbGRpZHg7CitzdGF0aWMgaW50IG1ham9yOworCisjZGVmaW5lIERJTiAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiBkYXRhIGRpcmVjdGlvbiAqLworI2RlZmluZSBET1UgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT1VUIGRhdGEgZGlyZWN0aW9uICovCisjZGVmaW5lIEROTyAgICAgRElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRyYW5zZmVyICovCisjZGVmaW5lIERVTiAgICAgRElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmtub3duIGRhdGEgZGlyZWN0aW9uICovCitzdGF0aWMgdW5jaGFyIGdkdGhfZGlyZWN0aW9uX3RhYlsweDEwMF0gPSB7CisgICAgRE5PLEROTyxESU4sRElOLERPVSxESU4sRElOLERPVSxESU4sRFVOLERPVSxET1UsRFVOLERVTixEVU4sRElOLAorICAgIEROTyxESU4sRElOLERPVSxESU4sRE9VLEROTyxETk8sRE9VLEROTyxESU4sRE5PLERJTixET1UsRE5PLERVTiwKKyAgICBESU4sRFVOLERJTixEVU4sRE9VLERJTixEVU4sRFVOLERJTixESU4sRE9VLEROTyxEVU4sRElOLERPVSxET1UsCisgICAgRE9VLERPVSxET1UsRE5PLERJTixETk8sRE5PLERJTixET1UsRE9VLERPVSxET1UsRElOLERPVSxESU4sRE9VLAorICAgIERPVSxET1UsRElOLERJTixESU4sRE5PLERVTixETk8sRE5PLEROTyxEVU4sRE5PLERPVSxESU4sRFVOLERVTiwKKyAgICBEVU4sRFVOLERVTixEVU4sRFVOLERPVSxEVU4sRFVOLERVTixEVU4sRElOLERVTixEVU4sRFVOLERVTixEVU4sCisgICAgRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLAorICAgIERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKyAgICBEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERJTixEVU4sRE9VLERVTixEVU4sRFVOLERVTixEVU4sCisgICAgRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixESU4sRFVOLAorICAgIERVTixEVU4sRFVOLERVTixEVU4sRE5PLEROTyxEVU4sRElOLEROTyxET1UsRFVOLEROTyxEVU4sRE9VLERPVSwKKyAgICBET1UsRE9VLERPVSxETk8sRFVOLERJTixET1UsRElOLERJTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sCisgICAgRFVOLERVTixET1UsRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLAorICAgIERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKyAgICBEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRE9VLERVTixEVU4sRFVOLERVTixEVU4sCisgICAgRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOCit9OworCisvKiBMSUxPIGFuZCBtb2Rwcm9iZS9pbnNtb2QgcGFyYW1ldGVycyAqLworLyogSVJRIGxpc3QgZm9yIEdEVDMwMDAvMzAyMCBFSVNBIGNvbnRyb2xsZXJzICovCitzdGF0aWMgaW50IGlycVtNQVhIQV0gX19pbml0ZGF0YSA9IAorezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKyAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworLyogZGlzYWJsZSBkcml2ZXIgZmxhZyAqLworc3RhdGljIGludCBkaXNhYmxlIF9faW5pdGRhdGEgPSAwOworLyogcmVzZXJ2ZSBmbGFnICovCitzdGF0aWMgaW50IHJlc2VydmVfbW9kZSA9IDE7ICAgICAgICAgICAgICAgICAgCisvKiByZXNlcnZlIGxpc3QgKi8KK3N0YXRpYyBpbnQgcmVzZXJ2ZV9saXN0W01BWF9SRVNfQVJHU10gPSAKK3sweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKy8qIHNjYW4gb3JkZXIgZm9yIFBDSSBjb250cm9sbGVycyAqLworc3RhdGljIGludCByZXZlcnNlX3NjYW4gPSAwOworLyogdmlydHVhbCBjaGFubmVsIGZvciB0aGUgaG9zdCBkcml2ZXMgKi8KK3N0YXRpYyBpbnQgaGRyX2NoYW5uZWwgPSAwOworLyogbWF4LiBJRHMgcGVyIGNoYW5uZWwgKi8KK3N0YXRpYyBpbnQgbWF4X2lkcyA9IE1BWElEOworLyogcmVzY2FuIGFsbCBJRHMgKi8KK3N0YXRpYyBpbnQgcmVzY2FuID0gMDsKKy8qIG1hcCBjaGFubmVscyB0byB2aXJ0dWFsIGNvbnRyb2xsZXJzICovCitzdGF0aWMgaW50IHZpcnRfY3RyID0gMDsKKy8qIHNoYXJlZCBhY2Nlc3MgKi8KK3N0YXRpYyBpbnQgc2hhcmVkX2FjY2VzcyA9IDE7CisvKiBlbmFibGUgc3VwcG9ydCBmb3IgRUlTQSBhbmQgSVNBIGNvbnRyb2xsZXJzICovCitzdGF0aWMgaW50IHByb2JlX2Vpc2FfaXNhID0gMDsKKy8qIDY0IGJpdCBETUEgbW9kZSwgc3VwcG9ydCBmb3IgZHJpdmVzID4gMiBUQiwgaWYgZm9yY2VfZG1hMzIgPSAwICovCitzdGF0aWMgaW50IGZvcmNlX2RtYTMyID0gMDsKKworLyogcGFyYW1ldGVycyBmb3IgbW9kcHJvYmUvaW5zbW9kICovCittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGRpc2FibGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmVzZXJ2ZV9tb2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHJlc2VydmVfbGlzdCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShyZXZlcnNlX3NjYW4sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaGRyX2NoYW5uZWwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X2lkcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyZXNjYW4sIGludCwgMCk7Cittb2R1bGVfcGFyYW0odmlydF9jdHIsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2hhcmVkX2FjY2VzcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwcm9iZV9laXNhX2lzYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmb3JjZV9kbWEzMiwgaW50LCAwKTsKK01PRFVMRV9BVVRIT1IoIkFjaGltIExldWJuZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogaW9jdGwgaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZHRoX2ZvcHMgPSB7CisgICAgLmlvY3RsICAgPSBnZHRoX2lvY3RsLAorICAgIC5vcGVuICAgID0gZ2R0aF9vcGVuLAorICAgIC5yZWxlYXNlID0gZ2R0aF9jbG9zZSwKK307CisKKyNpbmNsdWRlICJnZHRoX3Byb2MuaCIKKyNpbmNsdWRlICJnZHRoX3Byb2MuYyIKKworLyogbm90aWZpZXIgYmxvY2sgdG8gZ2V0IGEgbm90aWZ5IG9uIHN5c3RlbSBzaHV0ZG93bi9oYWx0L3JlYm9vdCAqLworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBnZHRoX25vdGlmaWVyID0geworICAgIGdkdGhfaGFsdCwgTlVMTCwgMAorfTsKKworCitzdGF0aWMgdm9pZCBnZHRoX2RlbGF5KGludCBtaWxsaXNlY29uZHMpCit7CisgICAgaWYgKG1pbGxpc2Vjb25kcyA9PSAwKSB7CisgICAgICAgIHVkZWxheSgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZGVsYXkobWlsbGlzZWNvbmRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdkdGhfZXZhbF9tYXBwaW5nKHVsb25nMzIgc2l6ZSwgdWxvbmczMiAqY3lscywgaW50ICpoZWFkcywgaW50ICpzZWNzKQoreworICAgICpjeWxzID0gc2l6ZSAvSEVBRFMvU0VDUzsKKyAgICBpZiAoKmN5bHMgPD0gTUFYQ1lMUykgeworICAgICAgICAqaGVhZHMgPSBIRUFEUzsKKyAgICAgICAgKnNlY3MgPSBTRUNTOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvbyBoaWdoIGZvciA2NCozMiAqLworICAgICAgICAqY3lscyA9IHNpemUgL01FREhFQURTL01FRFNFQ1M7CisgICAgICAgIGlmICgqY3lscyA8PSBNQVhDWUxTKSB7CisgICAgICAgICAgICAqaGVhZHMgPSBNRURIRUFEUzsKKyAgICAgICAgICAgICpzZWNzID0gTUVEU0VDUzsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gaGlnaCBmb3IgMTI3KjYzICovCisgICAgICAgICAgICAqY3lscyA9IHNpemUgL0JJR0hFQURTL0JJR1NFQ1M7CisgICAgICAgICAgICAqaGVhZHMgPSBCSUdIRUFEUzsKKyAgICAgICAgICAgICpzZWNzID0gQklHU0VDUzsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogY29udHJvbGxlciBzZWFyY2ggYW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IF9faW5pdCBnZHRoX3NlYXJjaF9laXNhKHVzaG9ydCBlaXNhX2FkcikKK3sKKyAgICB1bG9uZzMyIGlkOworICAgIAorICAgIFRSQUNFKCgiZ2R0aF9zZWFyY2hfZWlzYSgpIGFkci4gJXhcbiIsZWlzYV9hZHIpKTsKKyAgICBpZCA9IGlubChlaXNhX2FkcitJRDBSRUcpOworICAgIGlmIChpZCA9PSBHRFQzQV9JRCB8fCBpZCA9PSBHRFQzQl9JRCkgeyAgICAgLyogR0RUMzAwMEEgb3IgR0RUMzAwMEIgKi8KKyAgICAgICAgaWYgKChpbmIoZWlzYV9hZHIrRUlTQVJFRykgJiA4KSA9PSAwKSAgIAorICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IEVJU0EgY29uZmlndXJlZCAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGlkID09IEdEVDNfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHRFQzMDAwICovCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBnZHRoX3NlYXJjaF9pc2EodWxvbmczMiBiaW9zX2FkcikKK3sKKyAgICB2b2lkIF9faW9tZW0gKmFkZHI7CisgICAgdWxvbmczMiBpZDsKKworICAgIFRSQUNFKCgiZ2R0aF9zZWFyY2hfaXNhKCkgYmlvcyBhZHIuICV4XG4iLGJpb3NfYWRyKSk7CisgICAgaWYgKChhZGRyID0gaW9yZW1hcChiaW9zX2FkcitCSU9TX0lEX09GRlMsIHNpemVvZih1bG9uZzMyKSkpICE9IE5VTEwpIHsKKyAgICAgICAgaWQgPSBnZHRoX3JlYWRsKGFkZHIpOworICAgICAgICBpb3VubWFwKGFkZHIpOworICAgICAgICBpZiAoaWQgPT0gR0RUMl9JRCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdEVDIwMDAgKi8KKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBnZHRoX3NlYXJjaF9wY2koZ2R0aF9wY2lfc3RyICpwY2lzdHIpCit7CisgICAgdXNob3J0IGRldmljZSwgY250OworICAgIAorICAgIFRSQUNFKCgiZ2R0aF9zZWFyY2hfcGNpKClcbiIpKTsKKworICAgIGNudCA9IDA7CisgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPD0gUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1NTsgKytkZXZpY2UpCisgICAgICAgIGdkdGhfc2VhcmNoX2RldihwY2lzdHIsICZjbnQsIFBDSV9WRU5ET1JfSURfVk9SVEVYLCBkZXZpY2UpOworICAgIGZvciAoZGV2aWNlID0gUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JQOyAKKyAgICAgICAgIGRldmljZSA8PSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFRNQVhSUDsgKytkZXZpY2UpCisgICAgICAgIGdkdGhfc2VhcmNoX2RldihwY2lzdHIsICZjbnQsIFBDSV9WRU5ET1JfSURfVk9SVEVYLCBkZXZpY2UpOworICAgIGdkdGhfc2VhcmNoX2RldihwY2lzdHIsICZjbnQsIFBDSV9WRU5ET1JfSURfVk9SVEVYLCAKKyAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTkVXUlgpOworICAgIGdkdGhfc2VhcmNoX2RldihwY2lzdHIsICZjbnQsIFBDSV9WRU5ET1JfSURfVk9SVEVYLCAKKyAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTkVXUlgyKTsKKyAgICBnZHRoX3NlYXJjaF9kZXYocGNpc3RyLCAmY250LCBQQ0lfVkVORE9SX0lEX0lOVEVMLAorICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX1NSQyk7CisgICAgZ2R0aF9zZWFyY2hfZGV2KHBjaXN0ciwgJmNudCwgUENJX1ZFTkRPUl9JRF9JTlRFTCwKKyAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF9TUkNfWFNDQUxFKTsKKyAgICByZXR1cm4gY250OworfQorCisvKiBWb3J0ZXggb25seSBtYWtlcyBSQUlEIGNvbnRyb2xsZXJzLgorICogV2UgZG8gbm90IHJlYWxseSB3YW50IHRvIHNwZWNpZnkgYWxsIDU1MCBpZHMgaGVyZSwgc28gd2lsZGNhcmQgbWF0Y2guCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBnZHRodGFibGVbXSBfX2F0dHJpYnV0ZV91c2VkX18gPSB7CisgICAge1BDSV9WRU5ET1JfSURfVk9SVEVYLFBDSV9BTllfSUQsUENJX0FOWV9JRCwgUENJX0FOWV9JRH0sCisgICAge1BDSV9WRU5ET1JfSURfSU5URUwsUENJX0RFVklDRV9JRF9JTlRFTF9TUkMsUENJX0FOWV9JRCxQQ0lfQU5ZX0lEfSwgCisgICAge1BDSV9WRU5ET1JfSURfSU5URUwsUENJX0RFVklDRV9JRF9JTlRFTF9TUkNfWFNDQUxFLFBDSV9BTllfSUQsUENJX0FOWV9JRH0sIAorICAgIHswfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLGdkdGh0YWJsZSk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZHRoX3NlYXJjaF9kZXYoZ2R0aF9wY2lfc3RyICpwY2lzdHIsIHVzaG9ydCAqY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCB2ZW5kb3IsIHVzaG9ydCBkZXZpY2UpCit7CisgICAgdWxvbmcgYmFzZTAsIGJhc2UxLCBiYXNlMjsKKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKyAgICAKKyAgICBUUkFDRSgoImdkdGhfc2VhcmNoX2RldigpIGNudCAlZCB2ZW5kb3IgJXggZGV2aWNlICV4XG4iLAorICAgICAgICAgICpjbnQsIHZlbmRvciwgZGV2aWNlKSk7CisKKyAgICBwZGV2ID0gTlVMTDsKKyAgICB3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UodmVuZG9yLCBkZXZpY2UsIHBkZXYpKSAKKyAgICAgICAgICAgIT0gTlVMTCkgeworICAgICAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCpjbnQgPj0gTUFYSEEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8qIEdEVCBQQ0kgY29udHJvbGxlciBmb3VuZCwgcmVzb3VyY2VzIGFyZSBhbHJlYWR5IGluIHBkZXYgKi8KKyAgICAgICAgcGNpc3RyWypjbnRdLnBkZXYgPSBwZGV2OworICAgICAgICBwY2lzdHJbKmNudF0udmVuZG9yX2lkID0gdmVuZG9yOworICAgICAgICBwY2lzdHJbKmNudF0uZGV2aWNlX2lkID0gZGV2aWNlOworICAgICAgICBwY2lzdHJbKmNudF0uc3ViZGV2aWNlX2lkID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKKyAgICAgICAgcGNpc3RyWypjbnRdLmJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworICAgICAgICBwY2lzdHJbKmNudF0uZGV2aWNlX2ZuID0gcGRldi0+ZGV2Zm47CisgICAgICAgIHBjaXN0clsqY250XS5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgIGJhc2UwID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApOworICAgICAgICBiYXNlMSA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAxKTsKKyAgICAgICAgYmFzZTIgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMik7CisgICAgICAgIGlmIChkZXZpY2UgPD0gUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjAwMEIgfHwgICAvKiBHRFQ2MDAwL0IgKi8KKyAgICAgICAgICAgIGRldmljZSA+PSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UlApIHsgIC8qIE1QUiAqLworICAgICAgICAgICAgaWYgKCEoYmFzZTAgJiBJT1JFU09VUkNFX01FTSkpIAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcGNpc3RyWypjbnRdLmRwbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHRFQ2MTEwLCBHRFQ2MTIwLCAuLiAqLworICAgICAgICAgICAgaWYgKCEoYmFzZTAgJiBJT1JFU09VUkNFX01FTSkgfHwKKyAgICAgICAgICAgICAgICAhKGJhc2UyICYgSU9SRVNPVVJDRV9NRU0pIHx8CisgICAgICAgICAgICAgICAgIShiYXNlMSAmIElPUkVTT1VSQ0VfSU8pKSAKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHBjaXN0clsqY250XS5kcG1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKyAgICAgICAgICAgIHBjaXN0clsqY250XS5pb19tbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyAgICAgICAgICAgIHBjaXN0clsqY250XS5pbyAgICA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKyAgICAgICAgfQorICAgICAgICBUUkFDRTIoKCJDb250cm9sbGVyIGZvdW5kIGF0ICVkLyVkLCBpcnEgJWQsIGRwbWVtIDB4JWx4XG4iLAorICAgICAgICAgICAgICAgIHBjaXN0clsqY250XS5idXMsIFBDSV9TTE9UKHBjaXN0clsqY250XS5kZXZpY2VfZm4pLCAKKyAgICAgICAgICAgICAgICBwY2lzdHJbKmNudF0uaXJxLCBwY2lzdHJbKmNudF0uZHBtZW0pKTsKKyAgICAgICAgKCpjbnQpKys7CisgICAgfSAgICAgICAKK30gICAKKworCitzdGF0aWMgdm9pZCBfX2luaXQgZ2R0aF9zb3J0X3BjaShnZHRoX3BjaV9zdHIgKnBjaXN0ciwgaW50IGNudCkKK3sgICAgCisgICAgZ2R0aF9wY2lfc3RyIHRlbXA7CisgICAgaW50IGksIGNoYW5nZWQ7CisgICAgCisgICAgVFJBQ0UoKCJnZHRoX3NvcnRfcGNpKCkgY250ICVkXG4iLGNudCkpOworICAgIGlmIChjbnQgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZG8geworICAgICAgICBjaGFuZ2VkID0gRkFMU0U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQtMTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXJldmVyc2Vfc2NhbikgeworICAgICAgICAgICAgICAgIGlmICgocGNpc3RyW2ldLmJ1cyA+IHBjaXN0cltpKzFdLmJ1cykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBjaXN0cltpXS5idXMgPT0gcGNpc3RyW2krMV0uYnVzICYmCisgICAgICAgICAgICAgICAgICAgICBQQ0lfU0xPVChwY2lzdHJbaV0uZGV2aWNlX2ZuKSA+IAorICAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QocGNpc3RyW2krMV0uZGV2aWNlX2ZuKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHBjaXN0cltpXTsKKyAgICAgICAgICAgICAgICAgICAgcGNpc3RyW2ldID0gcGNpc3RyW2krMV07CisgICAgICAgICAgICAgICAgICAgIHBjaXN0cltpKzFdID0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBjaXN0cltpXS5idXMgPCBwY2lzdHJbaSsxXS5idXMpIHx8CisgICAgICAgICAgICAgICAgICAgIChwY2lzdHJbaV0uYnVzID09IHBjaXN0cltpKzFdLmJ1cyAmJgorICAgICAgICAgICAgICAgICAgICAgUENJX1NMT1QocGNpc3RyW2ldLmRldmljZV9mbikgPCAKKyAgICAgICAgICAgICAgICAgICAgIFBDSV9TTE9UKHBjaXN0cltpKzFdLmRldmljZV9mbikpKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBwY2lzdHJbaV07CisgICAgICAgICAgICAgICAgICAgIHBjaXN0cltpXSA9IHBjaXN0cltpKzFdOworICAgICAgICAgICAgICAgICAgICBwY2lzdHJbaSsxXSA9IHRlbXA7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGNoYW5nZWQpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGdkdGhfaW5pdF9laXNhKHVzaG9ydCBlaXNhX2FkcixnZHRoX2hhX3N0ciAqaGEpCit7CisgICAgdWxvbmczMiByZXRyaWVzLGlkOworICAgIHVuY2hhciBwcm90X3ZlcixlaXNhY2YsaSxpcnFfZm91bmQ7CisKKyAgICBUUkFDRSgoImdkdGhfaW5pdF9laXNhKCkgYWRyLiAleFxuIixlaXNhX2FkcikpOworICAgIAorICAgIC8qIGRpc2FibGUgYm9hcmQgaW50ZXJydXB0cywgZGVpbml0aWFsaXplIHNlcnZpY2VzICovCisgICAgb3V0YigweGZmLGVpc2FfYWRyK0VET09SUkVHKTsKKyAgICBvdXRiKDB4MDAsZWlzYV9hZHIrRURFTkFCUkVHKTsKKyAgICBvdXRiKDB4MDAsZWlzYV9hZHIrRUlOVEVOQUJSRUcpOworICAgIAorICAgIG91dGIoMHhmZixlaXNhX2FkcitMRE9PUlJFRyk7CisgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICBnZHRoX2RlbGF5KDIwKTsKKyAgICB3aGlsZSAoaW5iKGVpc2FfYWRyK0VET09SUkVHKSAhPSAweGZmKSB7CisgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtRUlTQTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERFSU5JVCBmYWlsZWQpXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIFRSQUNFMigoIndhaXQgZm9yIERFSU5JVDogcmV0cmllcz0lZFxuIixyZXRyaWVzKSk7CisgICAgfQorICAgIHByb3RfdmVyID0gaW5iKGVpc2FfYWRyK01BSUxCT1hSRUcpOworICAgIG91dGIoMHhmZixlaXNhX2FkcitFRE9PUlJFRyk7CisgICAgaWYgKHByb3RfdmVyICE9IFBST1RPQ09MX1ZFUlNJT04pIHsKKyAgICAgICAgcHJpbnRrKCJHRFQtRUlTQTogSWxsZWdhbCBwcm90b2NvbCB2ZXJzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGhhLT5ibWljID0gZWlzYV9hZHI7CisgICAgaGEtPmJyZF9waHlzID0gKHVsb25nMzIpZWlzYV9hZHIgPj4gMTI7CisKKyAgICBvdXRsKDAsZWlzYV9hZHIrTUFJTEJPWFJFRyk7CisgICAgb3V0bCgwLGVpc2FfYWRyK01BSUxCT1hSRUcrNCk7CisgICAgb3V0bCgwLGVpc2FfYWRyK01BSUxCT1hSRUcrOCk7CisgICAgb3V0bCgwLGVpc2FfYWRyK01BSUxCT1hSRUcrMTIpOworCisgICAgLyogZGV0ZWN0IElSUSAqLyAKKyAgICBpZiAoKGlkID0gaW5sKGVpc2FfYWRyK0lEMFJFRykpID09IEdEVDNfSUQpIHsKKyAgICAgICAgaGEtPm9lbV9pZCA9IE9FTV9JRF9JQ1A7CisgICAgICAgIGhhLT50eXBlID0gR0RUX0VJU0E7CisgICAgICAgIGhhLT5zdHlwZSA9IGlkOworICAgICAgICBvdXRsKDEsZWlzYV9hZHIrTUFJTEJPWFJFRys4KTsKKyAgICAgICAgb3V0YigweGZlLGVpc2FfYWRyK0xET09SUkVHKTsKKyAgICAgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIHdoaWxlIChpbmIoZWlzYV9hZHIrRURPT1JSRUcpICE9IDB4ZmUpIHsKKyAgICAgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULUVJU0E6IEluaXRpYWxpemF0aW9uIGVycm9yIChnZXQgSVJRIGZhaWxlZClcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICBoYS0+aXJxID0gaW5iKGVpc2FfYWRyK01BSUxCT1hSRUcpOworICAgICAgICBvdXRiKDB4ZmYsZWlzYV9hZHIrRURPT1JSRUcpOworICAgICAgICBUUkFDRTIoKCJHRFQzMDAwLzMwMjA6IElSUT0lZFxuIixoYS0+aXJxKSk7CisgICAgICAgIC8qIGNoZWNrIHRoZSByZXN1bHQgKi8KKyAgICAgICAgaWYgKGhhLT5pcnEgPT0gMCkgeworICAgICAgICAgICAgICAgIFRSQUNFMigoIlVua25vd24gSVJRLCB1c2UgSVJRIHRhYmxlIGZyb20gY21kIGxpbmUgIVxuIikpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGlycV9mb3VuZCA9IEZBTFNFOyAKKyAgICAgICAgICAgICAgICAgICAgIGkgPCBNQVhIQSAmJiBpcnFbaV0gIT0gMHhmZjsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlycVtpXT09MTAgfHwgaXJxW2ldPT0xMSB8fCBpcnFbaV09PTEyIHx8IGlycVtpXT09MTQpIHsKKyAgICAgICAgICAgICAgICAgICAgaXJxX2ZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpcnFfZm91bmQpIHsKKyAgICAgICAgICAgICAgICBoYS0+aXJxID0gaXJxW2ldOworICAgICAgICAgICAgICAgIGlycVtpXSA9IDA7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtRUlTQTogQ2FuIG5vdCBkZXRlY3QgY29udHJvbGxlciBJUlEsXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIlVzZSBJUlEgc2V0dGluZyBmcm9tIGNvbW1hbmQgbGluZSAoSVJRID0gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBoYS0+aXJxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtRUlTQTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKHVua25vd24gSVJRKSwgRW5hYmxlXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGsoInRoZSBjb250cm9sbGVyIEJJT1Mgb3IgdXNlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVpc2FjZiA9IGluYihlaXNhX2FkcitFSVNBUkVHKSAmIDc7CisgICAgICAgIGlmIChlaXNhY2YgPiA0KSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXZlbCB0cmlnZ2VyZWQgKi8KKyAgICAgICAgICAgIGVpc2FjZiAtPSA0OworICAgICAgICBoYS0+aXJxID0gZ2R0aF9pcnFfdGFiW2Vpc2FjZl07CisgICAgICAgIGhhLT5vZW1faWQgPSBPRU1fSURfSUNQOworICAgICAgICBoYS0+dHlwZSA9IEdEVF9FSVNBOworICAgICAgICBoYS0+c3R5cGUgPSBpZDsKKyAgICB9CisKKyAgICBoYS0+ZG1hNjRfc3VwcG9ydCA9IDA7CisgICAgcmV0dXJuIDE7Cit9CisKKyAgICAgICAKK3N0YXRpYyBpbnQgX19pbml0IGdkdGhfaW5pdF9pc2EodWxvbmczMiBiaW9zX2FkcixnZHRoX2hhX3N0ciAqaGEpCit7CisgICAgcmVnaXN0ZXIgZ2R0Ml9kcHJhbV9zdHIgX19pb21lbSAqZHAyX3B0cjsKKyAgICBpbnQgaTsKKyAgICB1bmNoYXIgaXJxX2RycSxwcm90X3ZlcjsKKyAgICB1bG9uZzMyIHJldHJpZXM7CisKKyAgICBUUkFDRSgoImdkdGhfaW5pdF9pc2EoKSBiaW9zIGFkci4gJXhcbiIsYmlvc19hZHIpKTsKKworICAgIGhhLT5icmQgPSBpb3JlbWFwKGJpb3NfYWRyLCBzaXplb2YoZ2R0Ml9kcHJhbV9zdHIpKTsKKyAgICBpZiAoaGEtPmJyZCA9PSBOVUxMKSB7CisgICAgICAgIHByaW50aygiR0RULUlTQTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBkcDJfcHRyID0gaGEtPmJyZDsKKyAgICBnZHRoX3dyaXRlYigxLCAmZHAyX3B0ci0+aW8ubWVtbG9jayk7IC8qIHN3aXRjaCBvZmYgd3JpdGUgcHJvdGVjdGlvbiAqLworICAgIC8qIHJlc2V0IGludGVyZmFjZSBhcmVhICovCisgICAgbWVtc2V0X2lvKCZkcDJfcHRyLT51LCAwLCBzaXplb2YoZHAyX3B0ci0+dSkpOworICAgIGlmIChnZHRoX3JlYWRsKCZkcDJfcHRyLT51KSAhPSAwKSB7CisgICAgICAgIHByaW50aygiR0RULUlTQTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHdyaXRlIGVycm9yKVxuIik7CisgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGRpc2FibGUgYm9hcmQgaW50ZXJydXB0cywgcmVhZCBEUlEgYW5kIElSUSAqLworICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDJfcHRyLT5pby5pcnFkZWwpOworICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDJfcHRyLT5pby5pcnFlbik7CisgICAgZ2R0aF93cml0ZWIoMHgwMCwgJmRwMl9wdHItPnUuaWMuU19TdGF0dXMpOworICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDJfcHRyLT51LmljLkNtZF9JbmRleCk7CisKKyAgICBpcnFfZHJxID0gZ2R0aF9yZWFkYigmZHAyX3B0ci0+aW8ucnEpOworICAgIGZvciAoaT0wOyBpPDM7ICsraSkgeworICAgICAgICBpZiAoKGlycV9kcnEgJiAxKT09MCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpcnFfZHJxID4+PSAxOworICAgIH0KKyAgICBoYS0+ZHJxID0gZ2R0aF9kcnFfdGFiW2ldOworCisgICAgaXJxX2RycSA9IGdkdGhfcmVhZGIoJmRwMl9wdHItPmlvLnJxKSA+PiAzOworICAgIGZvciAoaT0xOyBpPDU7ICsraSkgeworICAgICAgICBpZiAoKGlycV9kcnEgJiAxKT09MCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpcnFfZHJxID4+PSAxOworICAgIH0KKyAgICBoYS0+aXJxID0gZ2R0aF9pcnFfdGFiW2ldOworCisgICAgLyogZGVpbml0aWFsaXplIHNlcnZpY2VzICovCisgICAgZ2R0aF93cml0ZWwoYmlvc19hZHIsICZkcDJfcHRyLT51LmljLlNfSW5mb1swXSk7CisgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwMl9wdHItPnUuaWMuU19DbWRfSW5keCk7CisgICAgZ2R0aF93cml0ZWIoMCwgJmRwMl9wdHItPmlvLmV2ZW50KTsKKyAgICByZXRyaWVzID0gSU5JVF9SRVRSSUVTOworICAgIGdkdGhfZGVsYXkoMjApOworICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDJfcHRyLT51LmljLlNfU3RhdHVzKSAhPSAweGZmKSB7CisgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtSVNBOiBJbml0aWFsaXphdGlvbiBlcnJvciAoREVJTklUIGZhaWxlZClcbiIpOworICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgfQorICAgIHByb3RfdmVyID0gKHVuY2hhcilnZHRoX3JlYWRsKCZkcDJfcHRyLT51LmljLlNfSW5mb1swXSk7CisgICAgZ2R0aF93cml0ZWIoMCwgJmRwMl9wdHItPnUuaWMuU3RhdHVzKTsKKyAgICBnZHRoX3dyaXRlYigweGZmLCAmZHAyX3B0ci0+aW8uaXJxZGVsKTsKKyAgICBpZiAocHJvdF92ZXIgIT0gUFJPVE9DT0xfVkVSU0lPTikgeworICAgICAgICBwcmludGsoIkdEVC1JU0E6IElsbGVnYWwgcHJvdG9jb2wgdmVyc2lvblxuIik7CisgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGhhLT5vZW1faWQgPSBPRU1fSURfSUNQOworICAgIGhhLT50eXBlID0gR0RUX0lTQTsKKyAgICBoYS0+aWNfYWxsX3NpemUgPSBzaXplb2YoZHAyX3B0ci0+dSk7CisgICAgaGEtPnN0eXBlPSBHRFQyX0lEOworICAgIGhhLT5icmRfcGh5cyA9IGJpb3NfYWRyID4+IDQ7CisKKyAgICAvKiBzcGVjaWFsIHJlcXVlc3QgdG8gY29udHJvbGxlciBCSU9TICovCisgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwMl9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHAyX3B0ci0+dS5pYy5TX0luZm9bMV0pOworICAgIGdkdGhfd3JpdGVsKDB4MDEsICZkcDJfcHRyLT51LmljLlNfSW5mb1syXSk7CisgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwMl9wdHItPnUuaWMuU19JbmZvWzNdKTsKKyAgICBnZHRoX3dyaXRlYigweGZlLCAmZHAyX3B0ci0+dS5pYy5TX0NtZF9JbmR4KTsKKyAgICBnZHRoX3dyaXRlYigwLCAmZHAyX3B0ci0+aW8uZXZlbnQpOworICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgd2hpbGUgKGdkdGhfcmVhZGIoJmRwMl9wdHItPnUuaWMuU19TdGF0dXMpICE9IDB4ZmUpIHsKKyAgICAgICAgaWYgKC0tcmV0cmllcyA9PSAwKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1JU0E6IEluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgIH0KKyAgICBnZHRoX3dyaXRlYigwLCAmZHAyX3B0ci0+dS5pYy5TdGF0dXMpOworICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDJfcHRyLT5pby5pcnFkZWwpOworCisgICAgaGEtPmRtYTY0X3N1cHBvcnQgPSAwOworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGdkdGhfaW5pdF9wY2koZ2R0aF9wY2lfc3RyICpwY2lzdHIsZ2R0aF9oYV9zdHIgKmhhKQoreworICAgIHJlZ2lzdGVyIGdkdDZfZHByYW1fc3RyIF9faW9tZW0gKmRwNl9wdHI7CisgICAgcmVnaXN0ZXIgZ2R0NmNfZHByYW1fc3RyIF9faW9tZW0gKmRwNmNfcHRyOworICAgIHJlZ2lzdGVyIGdkdDZtX2RwcmFtX3N0ciBfX2lvbWVtICpkcDZtX3B0cjsKKyAgICB1bG9uZzMyIHJldHJpZXM7CisgICAgdW5jaGFyIHByb3RfdmVyOworICAgIHVzaG9ydCBjb21tYW5kOworICAgIGludCBpLCBmb3VuZCA9IEZBTFNFOworCisgICAgVFJBQ0UoKCJnZHRoX2luaXRfcGNpKClcbiIpKTsKKworICAgIGlmIChwY2lzdHItPnZlbmRvcl9pZCA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKQorICAgICAgICBoYS0+b2VtX2lkID0gT0VNX0lEX0lOVEVMOworICAgIGVsc2UKKyAgICAgICAgaGEtPm9lbV9pZCA9IE9FTV9JRF9JQ1A7CisgICAgaGEtPmJyZF9waHlzID0gKHBjaXN0ci0+YnVzIDw8IDgpIHwgKHBjaXN0ci0+ZGV2aWNlX2ZuICYgMHhmOCk7CisgICAgaGEtPnN0eXBlID0gKHVsb25nMzIpcGNpc3RyLT5kZXZpY2VfaWQ7CisgICAgaGEtPnN1YmRldmljZV9pZCA9IHBjaXN0ci0+c3ViZGV2aWNlX2lkOworICAgIGhhLT5pcnEgPSBwY2lzdHItPmlycTsKKyAgICBoYS0+cGRldiA9IHBjaXN0ci0+cGRldjsKKyAgICAKKyAgICBpZiAoaGEtPnN0eXBlIDw9IFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDYwMDBCKSB7ICAvKiBHRFQ2MDAwL0IgKi8KKyAgICAgICAgVFJBQ0UyKCgiaW5pdF9wY2koKSBkcG1lbSAlbHggaXJxICVkXG4iLHBjaXN0ci0+ZHBtZW0saGEtPmlycSkpOworICAgICAgICBoYS0+YnJkID0gaW9yZW1hcChwY2lzdHItPmRwbWVtLCBzaXplb2YoZ2R0Nl9kcHJhbV9zdHIpKTsKKyAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gcmVtYXAgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIGNoZWNrIGFuZCByZXNldCBpbnRlcmZhY2UgYXJlYSAqLworICAgICAgICBkcDZfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZWwoRFBNRU1fTUFHSUMsICZkcDZfcHRyLT51KTsKKyAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNl9wdHItPnUpICE9IERQTUVNX01BR0lDKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IENhbm5vdCBhY2Nlc3MgRFBNRU0gYXQgMHglbHggKHNoYWRvd2VkPylcbiIsIAorICAgICAgICAgICAgICAgICAgIHBjaXN0ci0+ZHBtZW0pOworICAgICAgICAgICAgZm91bmQgPSBGQUxTRTsKKyAgICAgICAgICAgIGZvciAoaSA9IDB4QzgwMDA7IGkgPCAweEU4MDAwOyBpICs9IDB4NDAwMCkgeworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgaGEtPmJyZCA9IGlvcmVtYXAoaSwgc2l6ZW9mKHVzaG9ydCkpOyAKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmJyZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZ2R0aF9yZWFkdyhoYS0+YnJkKSAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgiaW5pdF9wY2lfb2xkKCkgYWRkcmVzcyAweCV4IGJ1c3lcbiIsIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lzdHItPnBkZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0JBU0VfQUREUkVTU18wLCBpKTsKKyAgICAgICAgICAgICAgICBoYS0+YnJkID0gaW9yZW1hcChpLCBzaXplb2YoZ2R0Nl9kcHJhbV9zdHIpKTsgCisgICAgICAgICAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHA2X3B0ciA9IGhhLT5icmQ7CisgICAgICAgICAgICAgICAgZ2R0aF93cml0ZWwoRFBNRU1fTUFHSUMsICZkcDZfcHRyLT51KTsKKyAgICAgICAgICAgICAgICBpZiAoZ2R0aF9yZWFkbCgmZHA2X3B0ci0+dSkgPT0gRFBNRU1fTUFHSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBVc2UgZnJlZSBhZGRyZXNzIGF0IDB4JXhcbiIsIGkpOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IE5vIGZyZWUgYWRkcmVzcyBmb3VuZCFcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0X2lvKCZkcDZfcHRyLT51LCAwLCBzaXplb2YoZHA2X3B0ci0+dSkpOworICAgICAgICBpZiAoZ2R0aF9yZWFkbCgmZHA2X3B0ci0+dSkgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gd3JpdGUgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogZGlzYWJsZSBib2FyZCBpbnRlcnJ1cHRzLCBkZWluaXQgc2VydmljZXMgKi8KKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNl9wdHItPmlvLmlycWRlbCk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZfcHRyLT5pby5pcnFlbik7CisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZfcHRyLT51LmljLlNfU3RhdHVzKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHgwMCwgJmRwNl9wdHItPnUuaWMuQ21kX0luZGV4KTsKKworICAgICAgICBnZHRoX3dyaXRlbChwY2lzdHItPmRwbWVtLCAmZHA2X3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2X3B0ci0+dS5pYy5TX0NtZF9JbmR4KTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNl9wdHItPmlvLmV2ZW50KTsKKyAgICAgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDZfcHRyLT51LmljLlNfU3RhdHVzKSAhPSAweGZmKSB7CisgICAgICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChERUlOSVQgZmFpbGVkKVxuIik7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdF92ZXIgPSAodW5jaGFyKWdkdGhfcmVhZGwoJmRwNl9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNl9wdHItPnUuaWMuU19TdGF0dXMpOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2X3B0ci0+aW8uaXJxZGVsKTsKKyAgICAgICAgaWYgKHByb3RfdmVyICE9IFBST1RPQ09MX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSWxsZWdhbCBwcm90b2NvbCB2ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGhhLT50eXBlID0gR0RUX1BDSTsKKyAgICAgICAgaGEtPmljX2FsbF9zaXplID0gc2l6ZW9mKGRwNl9wdHItPnUpOworICAgICAgICAKKyAgICAgICAgLyogc3BlY2lhbCBjb21tYW5kIHRvIGNvbnRyb2xsZXIgQklPUyAqLworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2X3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2X3B0ci0+dS5pYy5TX0luZm9bMV0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2X3B0ci0+dS5pYy5TX0luZm9bMl0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2X3B0ci0+dS5pYy5TX0luZm9bM10pOworICAgICAgICBnZHRoX3dyaXRlYigweGZlLCAmZHA2X3B0ci0+dS5pYy5TX0NtZF9JbmR4KTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNl9wdHItPmlvLmV2ZW50KTsKKyAgICAgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDZfcHRyLT51LmljLlNfU3RhdHVzKSAhPSAweGZlKSB7CisgICAgICAgICAgICBpZiAoLS1yZXRyaWVzID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2X3B0ci0+dS5pYy5TX1N0YXR1cyk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDZfcHRyLT5pby5pcnFkZWwpOworCisgICAgICAgIGhhLT5kbWE2NF9zdXBwb3J0ID0gMDsKKworICAgIH0gZWxzZSBpZiAoaGEtPnN0eXBlIDw9IFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1NTUpIHsgLyogR0RUNjExMCwgLi4uICovCisgICAgICAgIGhhLT5wbHggPSAoZ2R0NmNfcGx4X3JlZ3MgKilwY2lzdHItPmlvOworICAgICAgICBUUkFDRTIoKCJpbml0X3BjaV9uZXcoKSBkcG1lbSAlbHggaXJxICVkXG4iLAorICAgICAgICAgICAgcGNpc3RyLT5kcG1lbSxoYS0+aXJxKSk7CisgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKHBjaXN0ci0+ZHBtZW0sIHNpemVvZihnZHQ2Y19kcHJhbV9zdHIpKTsKKyAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gcmVtYXAgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBjaGVjayBhbmQgcmVzZXQgaW50ZXJmYWNlIGFyZWEgKi8KKyAgICAgICAgZHA2Y19wdHIgPSBoYS0+YnJkOworICAgICAgICBnZHRoX3dyaXRlbChEUE1FTV9NQUdJQywgJmRwNmNfcHRyLT51KTsKKyAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNmNfcHRyLT51KSAhPSBEUE1FTV9NQUdJQykgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBDYW5ub3QgYWNjZXNzIERQTUVNIGF0IDB4JWx4IChzaGFkb3dlZD8pXG4iLCAKKyAgICAgICAgICAgICAgICAgICBwY2lzdHItPmRwbWVtKTsKKyAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICBmb3IgKGkgPSAweEM4MDAwOyBpIDwgMHhFODAwMDsgaSArPSAweDQwMDApIHsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKGksIHNpemVvZih1c2hvcnQpKTsgCisgICAgICAgICAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfcmVhZHcoaGEtPmJyZCkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoImluaXRfcGNpX3BseCgpIGFkZHJlc3MgMHgleCBidXN5XG4iLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpc3RyLT5wZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMiwgaSk7CisgICAgICAgICAgICAgICAgaGEtPmJyZCA9IGlvcmVtYXAoaSwgc2l6ZW9mKGdkdDZjX2RwcmFtX3N0cikpOyAKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmJyZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcDZjX3B0ciA9IGhhLT5icmQ7CisgICAgICAgICAgICAgICAgZ2R0aF93cml0ZWwoRFBNRU1fTUFHSUMsICZkcDZjX3B0ci0+dSk7CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNmNfcHRyLT51KSA9PSBEUE1FTV9NQUdJQykgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IFVzZSBmcmVlIGFkZHJlc3MgYXQgMHgleFxuIiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogTm8gZnJlZSBhZGRyZXNzIGZvdW5kIVxuIik7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1zZXRfaW8oJmRwNmNfcHRyLT51LCAwLCBzaXplb2YoZHA2Y19wdHItPnUpKTsKKyAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNmNfcHRyLT51KSAhPSAwKSB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSB3cml0ZSBlcnJvcilcbiIpOworICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBkaXNhYmxlIGJvYXJkIGludGVycnVwdHMsIGRlaW5pdCBzZXJ2aWNlcyAqLworICAgICAgICBvdXRiKDB4MDAsUFRSMlVTSE9SVCgmaGEtPnBseC0+Y29udHJvbDEpKTsKKyAgICAgICAgb3V0YigweGZmLFBUUjJVU0hPUlQoJmhhLT5wbHgtPmVkb29yX3JlZykpOworICAgICAgICAKKyAgICAgICAgZ2R0aF93cml0ZWIoMHgwMCwgJmRwNmNfcHRyLT51LmljLlNfU3RhdHVzKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHgwMCwgJmRwNmNfcHRyLT51LmljLkNtZF9JbmRleCk7CisKKyAgICAgICAgZ2R0aF93cml0ZWwocGNpc3RyLT5kcG1lbSwgJmRwNmNfcHRyLT51LmljLlNfSW5mb1swXSk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDZjX3B0ci0+dS5pYy5TX0NtZF9JbmR4KTsKKworICAgICAgICBvdXRiKDEsUFRSMlVTSE9SVCgmaGEtPnBseC0+bGRvb3JfcmVnKSk7CisKKyAgICAgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDZjX3B0ci0+dS5pYy5TX1N0YXR1cykgIT0gMHhmZikgeworICAgICAgICAgICAgaWYgKC0tcmV0cmllcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoREVJTklUIGZhaWxlZClcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIHByb3RfdmVyID0gKHVuY2hhcilnZHRoX3JlYWRsKCZkcDZjX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2Y19wdHItPnUuaWMuU3RhdHVzKTsKKyAgICAgICAgaWYgKHByb3RfdmVyICE9IFBST1RPQ09MX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSWxsZWdhbCBwcm90b2NvbCB2ZXJzaW9uXG4iKTsKKyAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGhhLT50eXBlID0gR0RUX1BDSU5FVzsKKyAgICAgICAgaGEtPmljX2FsbF9zaXplID0gc2l6ZW9mKGRwNmNfcHRyLT51KTsKKworICAgICAgICAvKiBzcGVjaWFsIGNvbW1hbmQgdG8gY29udHJvbGxlciBCSU9TICovCisgICAgICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDZjX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2Y19wdHItPnUuaWMuU19JbmZvWzFdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNmNfcHRyLT51LmljLlNfSW5mb1syXSk7CisgICAgICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDZjX3B0ci0+dS5pYy5TX0luZm9bM10pOworICAgICAgICBnZHRoX3dyaXRlYigweGZlLCAmZHA2Y19wdHItPnUuaWMuU19DbWRfSW5keCk7CisgICAgICAgIAorICAgICAgICBvdXRiKDEsUFRSMlVTSE9SVCgmaGEtPnBseC0+bGRvb3JfcmVnKSk7CisKKyAgICAgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDZjX3B0ci0+dS5pYy5TX1N0YXR1cykgIT0gMHhmZSkgeworICAgICAgICAgICAgaWYgKC0tcmV0cmllcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdkdGhfZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNmNfcHRyLT51LmljLlNfU3RhdHVzKTsKKworICAgICAgICBoYS0+ZG1hNjRfc3VwcG9ydCA9IDA7CisKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVBSICovCisgICAgICAgIFRSQUNFMigoImluaXRfcGNpX21wcigpIGRwbWVtICVseCBpcnEgJWRcbiIscGNpc3RyLT5kcG1lbSxoYS0+aXJxKSk7CisgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKHBjaXN0ci0+ZHBtZW0sIHNpemVvZihnZHQ2bV9kcHJhbV9zdHIpKTsKKyAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoRFBNRU0gcmVtYXAgZXJyb3IpXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogbWFuaXB1bGF0ZSBjb25maWcuIHNwYWNlIHRvIGVuYWJsZSBEUE1FTSwgc3RhcnQgUlAgY29udHJvbGxlciAqLworICAgICAgICBwY2lfcmVhZF9jb25maWdfd29yZChwY2lzdHItPnBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisgICAgICAgIGNvbW1hbmQgfD0gNjsKKyAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaXN0ci0+cGRldiwgUENJX0NPTU1BTkQsIGNvbW1hbmQpOworICAgICAgICBpZiAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaXN0ci0+cGRldiwgOCkgPT0gMVVMKQorICAgICAgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBjaXN0ci0+cGRldiwgOCkgPSAwVUw7CisgICAgICAgIGkgPSAweEZFRkYwMDAxVUw7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpc3RyLT5wZGV2LCBQQ0lfUk9NX0FERFJFU1MsIGkpOworICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaXN0ci0+cGRldiwgUENJX1JPTV9BRERSRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9zdGFydChwY2lzdHItPnBkZXYsIDgpKTsKKyAgICAgICAgCisgICAgICAgIGRwNm1fcHRyID0gaGEtPmJyZDsKKworICAgICAgICAvKiBFbnN1cmUgdGhhdCBpdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUgbm9uIEhXIHBvcnRpb25zIG9mIERQTUVNLgorICAgICAgICAgKiBBZGl0aW9uYWwgY2hlY2sgbmVlZGVkIGZvciBYc2NhbGUgYmFzZWQgUkFJRCBjb250cm9sbGVycyAqLworICAgICAgICB3aGlsZSggKChpbnQpZ2R0aF9yZWFkYigmZHA2bV9wdHItPmk5NjByLnNlbWEwX3JlZykgKSAmIDMgKQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgCisgICAgICAgIC8qIGNoZWNrIGFuZCByZXNldCBpbnRlcmZhY2UgYXJlYSAqLworICAgICAgICBnZHRoX3dyaXRlbChEUE1FTV9NQUdJQywgJmRwNm1fcHRyLT51KTsKKyAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNm1fcHRyLT51KSAhPSBEUE1FTV9NQUdJQykgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBDYW5ub3QgYWNjZXNzIERQTUVNIGF0IDB4JWx4IChzaGFkb3dlZD8pXG4iLCAKKyAgICAgICAgICAgICAgICAgICBwY2lzdHItPmRwbWVtKTsKKyAgICAgICAgICAgIGZvdW5kID0gRkFMU0U7CisgICAgICAgICAgICBmb3IgKGkgPSAweEM4MDAwOyBpIDwgMHhFODAwMDsgaSArPSAweDQwMDApIHsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIGhhLT5icmQgPSBpb3JlbWFwKGksIHNpemVvZih1c2hvcnQpKTsgCisgICAgICAgICAgICAgICAgaWYgKGhhLT5icmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IEluaXRpYWxpemF0aW9uIGVycm9yIChEUE1FTSByZW1hcCBlcnJvcilcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfcmVhZHcoaGEtPmJyZCkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoImluaXRfcGNpX21wcigpIGFkZHJlc3MgMHgleCBidXN5XG4iLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpc3RyLT5wZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMCwgaSk7CisgICAgICAgICAgICAgICAgaGEtPmJyZCA9IGlvcmVtYXAoaSwgc2l6ZW9mKGdkdDZtX2RwcmFtX3N0cikpOyAKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmJyZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERQTUVNIHJlbWFwIGVycm9yKVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcDZtX3B0ciA9IGhhLT5icmQ7CisgICAgICAgICAgICAgICAgZ2R0aF93cml0ZWwoRFBNRU1fTUFHSUMsICZkcDZtX3B0ci0+dSk7CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfcmVhZGwoJmRwNm1fcHRyLT51KSA9PSBEUE1FTV9NQUdJQykgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IFVzZSBmcmVlIGFkZHJlc3MgYXQgMHgleFxuIiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogTm8gZnJlZSBhZGRyZXNzIGZvdW5kIVxuIik7CisgICAgICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1zZXRfaW8oJmRwNm1fcHRyLT51LCAwLCBzaXplb2YoZHA2bV9wdHItPnUpKTsKKyAgICAgICAgCisgICAgICAgIC8qIGRpc2FibGUgYm9hcmQgaW50ZXJydXB0cywgZGVpbml0IHNlcnZpY2VzICovCisgICAgICAgIGdkdGhfd3JpdGViKGdkdGhfcmVhZGIoJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9lbl9yZWcpIHwgNCwKKyAgICAgICAgICAgICAgICAgICAgJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9lbl9yZWcpOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2bV9wdHItPmk5NjByLmVkb29yX3JlZyk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZtX3B0ci0+dS5pYy5TX1N0YXR1cyk7CisgICAgICAgIGdkdGhfd3JpdGViKDB4MDAsICZkcDZtX3B0ci0+dS5pYy5DbWRfSW5kZXgpOworCisgICAgICAgIGdkdGhfd3JpdGVsKHBjaXN0ci0+ZHBtZW0sICZkcDZtX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2bV9wdHItPnUuaWMuU19DbWRfSW5keCk7CisgICAgICAgIGdkdGhfd3JpdGViKDEsICZkcDZtX3B0ci0+aTk2MHIubGRvb3JfcmVnKTsKKyAgICAgICAgcmV0cmllcyA9IElOSVRfUkVUUklFUzsKKyAgICAgICAgZ2R0aF9kZWxheSgyMCk7CisgICAgICAgIHdoaWxlIChnZHRoX3JlYWRiKCZkcDZtX3B0ci0+dS5pYy5TX1N0YXR1cykgIT0gMHhmZikgeworICAgICAgICAgICAgaWYgKC0tcmV0cmllcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbml0aWFsaXphdGlvbiBlcnJvciAoREVJTklUIGZhaWxlZClcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIHByb3RfdmVyID0gKHVuY2hhcilnZHRoX3JlYWRsKCZkcDZtX3B0ci0+dS5pYy5TX0luZm9bMF0pOworICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpOworICAgICAgICBpZiAocHJvdF92ZXIgIT0gUFJPVE9DT0xfVkVSU0lPTikgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQtUENJOiBJbGxlZ2FsIHByb3RvY29sIHZlcnNpb25cbiIpOworICAgICAgICAgICAgaW91bm1hcChoYS0+YnJkKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaGEtPnR5cGUgPSBHRFRfUENJTVBSOworICAgICAgICBoYS0+aWNfYWxsX3NpemUgPSBzaXplb2YoZHA2bV9wdHItPnUpOworICAgICAgICAKKyAgICAgICAgLyogc3BlY2lhbCBjb21tYW5kIHRvIGNvbnRyb2xsZXIgQklPUyAqLworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2bV9wdHItPnUuaWMuU19JbmZvWzBdKTsKKyAgICAgICAgZ2R0aF93cml0ZWwoMHgwMCwgJmRwNm1fcHRyLT51LmljLlNfSW5mb1sxXSk7CisgICAgICAgIGdkdGhfd3JpdGVsKDB4MDAsICZkcDZtX3B0ci0+dS5pYy5TX0luZm9bMl0pOworICAgICAgICBnZHRoX3dyaXRlbCgweDAwLCAmZHA2bV9wdHItPnUuaWMuU19JbmZvWzNdKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZSwgJmRwNm1fcHRyLT51LmljLlNfQ21kX0luZHgpOworICAgICAgICBnZHRoX3dyaXRlYigxLCAmZHA2bV9wdHItPmk5NjByLmxkb29yX3JlZyk7CisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpICE9IDB4ZmUpIHsKKyAgICAgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIGlvdW5tYXAoaGEtPmJyZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICB9CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZtX3B0ci0+dS5pYy5TX1N0YXR1cyk7CisKKyAgICAgICAgLyogcmVhZCBGVyB2ZXJzaW9uIHRvIGRldGVjdCA2NC1iaXQgRE1BIHN1cHBvcnQgKi8KKyAgICAgICAgZ2R0aF93cml0ZWIoMHhmZCwgJmRwNm1fcHRyLT51LmljLlNfQ21kX0luZHgpOworICAgICAgICBnZHRoX3dyaXRlYigxLCAmZHA2bV9wdHItPmk5NjByLmxkb29yX3JlZyk7CisgICAgICAgIHJldHJpZXMgPSBJTklUX1JFVFJJRVM7CisgICAgICAgIGdkdGhfZGVsYXkoMjApOworICAgICAgICB3aGlsZSAoZ2R0aF9yZWFkYigmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpICE9IDB4ZmQpIHsKKyAgICAgICAgICAgIGlmICgtLXJldHJpZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSTogSW5pdGlhbGl6YXRpb24gZXJyb3IgKERFSU5JVCBmYWlsZWQpXG4iKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGhhLT5icmQpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2R0aF9kZWxheSgxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90X3ZlciA9ICh1bmNoYXIpKGdkdGhfcmVhZGwoJmRwNm1fcHRyLT51LmljLlNfSW5mb1swXSkgPj4gMTYpOworICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHA2bV9wdHItPnUuaWMuU19TdGF0dXMpOworICAgICAgICBpZiAocHJvdF92ZXIgPCAweDJiKSAgICAgIC8qIEZXIDwgeC40Mzogbm8gNjQtYml0IERNQSBzdXBwb3J0ICovCisgICAgICAgICAgICBoYS0+ZG1hNjRfc3VwcG9ydCA9IDA7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICBoYS0+ZG1hNjRfc3VwcG9ydCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworLyogY29udHJvbGxlciBwcm90b2NvbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGdkdGhfZW5hYmxlX2ludChpbnQgaGFudW0pCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKmRwMl9wdHI7CisgICAgZ2R0Nl9kcHJhbV9zdHIgX19pb21lbSAqZHA2X3B0cjsKKyAgICBnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqZHA2bV9wdHI7CisKKyAgICBUUkFDRSgoImdkdGhfZW5hYmxlX2ludCgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgaWYgKGhhLT50eXBlID09IEdEVF9FSVNBKSB7CisgICAgICAgIG91dGIoMHhmZiwgaGEtPmJtaWMgKyBFRE9PUlJFRyk7CisgICAgICAgIG91dGIoMHhmZiwgaGEtPmJtaWMgKyBFREVOQUJSRUcpOworICAgICAgICBvdXRiKDB4MDEsIGhhLT5ibWljICsgRUlOVEVOQUJSRUcpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkgeworICAgICAgICBkcDJfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJmRwMl9wdHItPmlvLmlycWRlbCk7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDJfcHRyLT51LmljLkNtZF9JbmRleCk7CisgICAgICAgIGdkdGhfd3JpdGViKDEsICZkcDJfcHRyLT5pby5pcnFlbik7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJKSB7CisgICAgICAgIGRwNl9wdHIgPSBoYS0+YnJkOworICAgICAgICBnZHRoX3dyaXRlYigxLCAmZHA2X3B0ci0+aW8uaXJxZGVsKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNl9wdHItPnUuaWMuQ21kX0luZGV4KTsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJmRwNl9wdHItPmlvLmlycWVuKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lORVcpIHsKKyAgICAgICAgb3V0YigweGZmLCBQVFIyVVNIT1JUKCZoYS0+cGx4LT5lZG9vcl9yZWcpKTsKKyAgICAgICAgb3V0YigweDAzLCBQVFIyVVNIT1JUKCZoYS0+cGx4LT5jb250cm9sMSkpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUikgeworICAgICAgICBkcDZtX3B0ciA9IGhhLT5icmQ7CisgICAgICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDZtX3B0ci0+aTk2MHIuZWRvb3JfcmVnKTsKKyAgICAgICAgZ2R0aF93cml0ZWIoZ2R0aF9yZWFkYigmZHA2bV9wdHItPmk5NjByLmVkb29yX2VuX3JlZykgJiB+NCwKKyAgICAgICAgICAgICAgICAgICAgJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9lbl9yZWcpOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IGdkdGhfZ2V0X3N0YXR1cyh1bmNoYXIgKnBJU3RhdHVzLGludCBpcnEpCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworICAgIGludCBpOworCisgICAgVFJBQ0UoKCJnZHRoX2dldF9zdGF0dXMoKSBpcnEgJWQgY3RyX2NvdW50ICVkXG4iLAorICAgICAgICAgICBpcnEsZ2R0aF9jdHJfY291bnQpKTsKKyAgICAKKyAgICAqcElTdGF0dXMgPSAwOworICAgIGZvciAoaT0wOyBpPGdkdGhfY3RyX2NvdW50OyArK2kpIHsKKyAgICAgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2ldKTsKKyAgICAgICAgaWYgKGhhLT5pcnEgIT0gKHVuY2hhcilpcnEpICAgICAgICAgICAgIC8qIGNoZWNrIElSUSAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkKKyAgICAgICAgICAgICpwSVN0YXR1cyA9IGluYigodXNob3J0KWhhLT5ibWljICsgRURPT1JSRUcpOworICAgICAgICBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfSVNBKQorICAgICAgICAgICAgKnBJU3RhdHVzID0KKyAgICAgICAgICAgICAgICBnZHRoX3JlYWRiKCYoKGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+dS5pYy5DbWRfSW5kZXgpOworICAgICAgICBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJKQorICAgICAgICAgICAgKnBJU3RhdHVzID0KKyAgICAgICAgICAgICAgICBnZHRoX3JlYWRiKCYoKGdkdDZfZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+dS5pYy5DbWRfSW5kZXgpOworICAgICAgICBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTkVXKSAKKyAgICAgICAgICAgICpwSVN0YXR1cyA9IGluYihQVFIyVVNIT1JUKCZoYS0+cGx4LT5lZG9vcl9yZWcpKTsKKyAgICAgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUikKKyAgICAgICAgICAgICpwSVN0YXR1cyA9CisgICAgICAgICAgICAgICAgZ2R0aF9yZWFkYigmKChnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT5pOTYwci5lZG9vcl9yZWcpOworICAgCisgICAgICAgIGlmICgqcElTdGF0dXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYm9hcmQgZm91bmQgKi8KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorICAgICAgICAgICAgICAgICAKKyAgICAKK3N0YXRpYyBpbnQgZ2R0aF90ZXN0X2J1c3koaW50IGhhbnVtKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICByZWdpc3RlciBpbnQgZ2R0c2VtYTAgPSAwOworCisgICAgVFJBQ0UoKCJnZHRoX3Rlc3RfYnVzeSgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisgICAgCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgaWYgKGhhLT50eXBlID09IEdEVF9FSVNBKQorICAgICAgICBnZHRzZW1hMCA9IChpbnQpaW5iKGhhLT5ibWljICsgU0VNQTBSRUcpOworICAgIGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9JU0EpCisgICAgICAgIGdkdHNlbWEwID0gKGludClnZHRoX3JlYWRiKCYoKGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+dS5pYy5TZW1hMCk7CisgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkKKyAgICAgICAgZ2R0c2VtYTAgPSAoaW50KWdkdGhfcmVhZGIoJigoZ2R0Nl9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT51LmljLlNlbWEwKTsKKyAgICBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTkVXKSAKKyAgICAgICAgZ2R0c2VtYTAgPSAoaW50KWluYihQVFIyVVNIT1JUKCZoYS0+cGx4LT5zZW1hMF9yZWcpKTsKKyAgICBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSKQorICAgICAgICBnZHRzZW1hMCA9IAorICAgICAgICAgICAgKGludClnZHRoX3JlYWRiKCYoKGdkdDZtX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPmk5NjByLnNlbWEwX3JlZyk7CisKKyAgICByZXR1cm4gKGdkdHNlbWEwICYgMSk7Cit9CisKKworc3RhdGljIGludCBnZHRoX2dldF9jbWRfaW5kZXgoaW50IGhhbnVtKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICBpbnQgaTsKKworICAgIFRSQUNFKCgiZ2R0aF9nZXRfY21kX2luZGV4KCkgaGFudW0gJWRcbiIsaGFudW0pKTsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGZvciAoaT0wOyBpPEdEVEhfTUFYQ01EUzsgKytpKSB7CisgICAgICAgIGlmIChoYS0+Y21kX3RhYltpXS5jbW5kID09IFVOVVNFRF9DTU5EKSB7CisgICAgICAgICAgICBoYS0+Y21kX3RhYltpXS5jbW5kID0gaGEtPnBjY2ItPlJlcXVlc3RCdWZmZXI7CisgICAgICAgICAgICBoYS0+Y21kX3RhYltpXS5zZXJ2aWNlID0gaGEtPnBjY2ItPlNlcnZpY2U7CisgICAgICAgICAgICBoYS0+cGNjYi0+Q29tbWFuZEluZGV4ID0gKHVsb25nMzIpaSsyOworICAgICAgICAgICAgcmV0dXJuIChpKzIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGdkdGhfc2V0X3NlbWEwKGludCBoYW51bSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisKKyAgICBUUkFDRSgoImdkdGhfc2V0X3NlbWEwKCkgaGFudW0gJWRcbiIsaGFudW0pKTsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkgeworICAgICAgICBvdXRiKDEsIGhhLT5ibWljICsgU0VNQTBSRUcpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkgeworICAgICAgICBnZHRoX3dyaXRlYigxLCAmKChnZHQyX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPnUuaWMuU2VtYTApOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkgeworICAgICAgICBnZHRoX3dyaXRlYigxLCAmKChnZHQ2X2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPnUuaWMuU2VtYTApOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU5FVykgeyAKKyAgICAgICAgb3V0YigxLCBQVFIyVVNIT1JUKCZoYS0+cGx4LT5zZW1hMF9yZWcpKTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lNUFIpIHsKKyAgICAgICAgZ2R0aF93cml0ZWIoMSwgJigoZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+aTk2MHIuc2VtYTBfcmVnKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZ2R0aF9jb3B5X2NvbW1hbmQoaW50IGhhbnVtKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICByZWdpc3RlciBnZHRoX2NtZF9zdHIgKmNtZF9wdHI7CisgICAgcmVnaXN0ZXIgZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKmRwNm1fcHRyOworICAgIHJlZ2lzdGVyIGdkdDZjX2RwcmFtX3N0ciBfX2lvbWVtICpkcDZjX3B0cjsKKyAgICBnZHQ2X2RwcmFtX3N0ciBfX2lvbWVtICpkcDZfcHRyOworICAgIGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKmRwMl9wdHI7CisgICAgdXNob3J0IGNwX2NvdW50LGRwX29mZnNldCxjbWRfbm87CisgICAgCisgICAgVFJBQ0UoKCJnZHRoX2NvcHlfY29tbWFuZCgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBjcF9jb3VudCA9IGhhLT5jbWRfbGVuOworICAgIGRwX29mZnNldD0gaGEtPmNtZF9vZmZzX2RwbWVtOworICAgIGNtZF9ubyAgID0gaGEtPmNtZF9jbnQ7CisgICAgY21kX3B0ciAgPSBoYS0+cGNjYjsKKworICAgICsraGEtPmNtZF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKGhhLT50eXBlID09IEdEVF9FSVNBKQorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gRFBNRU0sIG5vIGNvcHkgKi8KKworICAgIC8qIHNldCBjcGNvdW50IGR3b3JkIGFsaWduZWQgKi8KKyAgICBpZiAoY3BfY291bnQgJiAzKQorICAgICAgICBjcF9jb3VudCArPSAoNCAtIChjcF9jb3VudCAmIDMpKTsKKworICAgIGhhLT5jbWRfb2Zmc19kcG1lbSArPSBjcF9jb3VudDsKKyAgICAKKyAgICAvKiBzZXQgb2Zmc2V0IGFuZCBzZXJ2aWNlLCBjb3B5IGNvbW1hbmQgdG8gRFBNRU0gKi8KKyAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkgeworICAgICAgICBkcDJfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZXcoZHBfb2Zmc2V0ICsgRFBNRU1fQ09NTUFORF9PRkZTRVQsIAorICAgICAgICAgICAgICAgICAgICAmZHAyX3B0ci0+dS5pYy5jb21tX3F1ZXVlW2NtZF9ub10ub2Zmc2V0KTsKKyAgICAgICAgZ2R0aF93cml0ZXcoKHVzaG9ydCljbWRfcHRyLT5TZXJ2aWNlLCAKKyAgICAgICAgICAgICAgICAgICAgJmRwMl9wdHItPnUuaWMuY29tbV9xdWV1ZVtjbWRfbm9dLnNlcnZfaWQpOworICAgICAgICBtZW1jcHlfdG9pbygmZHAyX3B0ci0+dS5pYy5nZHRfZHByX2NtZFtkcF9vZmZzZXRdLGNtZF9wdHIsY3BfY291bnQpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkgeworICAgICAgICBkcDZfcHRyID0gaGEtPmJyZDsKKyAgICAgICAgZ2R0aF93cml0ZXcoZHBfb2Zmc2V0ICsgRFBNRU1fQ09NTUFORF9PRkZTRVQsIAorICAgICAgICAgICAgICAgICAgICAmZHA2X3B0ci0+dS5pYy5jb21tX3F1ZXVlW2NtZF9ub10ub2Zmc2V0KTsKKyAgICAgICAgZ2R0aF93cml0ZXcoKHVzaG9ydCljbWRfcHRyLT5TZXJ2aWNlLCAKKyAgICAgICAgICAgICAgICAgICAgJmRwNl9wdHItPnUuaWMuY29tbV9xdWV1ZVtjbWRfbm9dLnNlcnZfaWQpOworICAgICAgICBtZW1jcHlfdG9pbygmZHA2X3B0ci0+dS5pYy5nZHRfZHByX2NtZFtkcF9vZmZzZXRdLGNtZF9wdHIsY3BfY291bnQpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU5FVykgeworICAgICAgICBkcDZjX3B0ciA9IGhhLT5icmQ7CisgICAgICAgIGdkdGhfd3JpdGV3KGRwX29mZnNldCArIERQTUVNX0NPTU1BTkRfT0ZGU0VULCAKKyAgICAgICAgICAgICAgICAgICAgJmRwNmNfcHRyLT51LmljLmNvbW1fcXVldWVbY21kX25vXS5vZmZzZXQpOworICAgICAgICBnZHRoX3dyaXRldygodXNob3J0KWNtZF9wdHItPlNlcnZpY2UsIAorICAgICAgICAgICAgICAgICAgICAmZHA2Y19wdHItPnUuaWMuY29tbV9xdWV1ZVtjbWRfbm9dLnNlcnZfaWQpOworICAgICAgICBtZW1jcHlfdG9pbygmZHA2Y19wdHItPnUuaWMuZ2R0X2Rwcl9jbWRbZHBfb2Zmc2V0XSxjbWRfcHRyLGNwX2NvdW50KTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lNUFIpIHsKKyAgICAgICAgZHA2bV9wdHIgPSBoYS0+YnJkOworICAgICAgICBnZHRoX3dyaXRldyhkcF9vZmZzZXQgKyBEUE1FTV9DT01NQU5EX09GRlNFVCwgCisgICAgICAgICAgICAgICAgICAgICZkcDZtX3B0ci0+dS5pYy5jb21tX3F1ZXVlW2NtZF9ub10ub2Zmc2V0KTsKKyAgICAgICAgZ2R0aF93cml0ZXcoKHVzaG9ydCljbWRfcHRyLT5TZXJ2aWNlLCAKKyAgICAgICAgICAgICAgICAgICAgJmRwNm1fcHRyLT51LmljLmNvbW1fcXVldWVbY21kX25vXS5zZXJ2X2lkKTsKKyAgICAgICAgbWVtY3B5X3RvaW8oJmRwNm1fcHRyLT51LmljLmdkdF9kcHJfY21kW2RwX29mZnNldF0sY21kX3B0cixjcF9jb3VudCk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGdkdGhfcmVsZWFzZV9ldmVudChpbnQgaGFudW0pCit7CisgICAgcmVnaXN0ZXIgZ2R0aF9oYV9zdHIgKmhhOworCisgICAgVFJBQ0UoKCJnZHRoX3JlbGVhc2VfZXZlbnQoKSBoYW51bSAlZFxuIixoYW51bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCisgICAgeworICAgICAgICB1bG9uZzMyIGksajsKKyAgICAgICAgZm9yIChpPTAsaj0wOyBqPEdEVEhfTUFYQ01EUzsgKytqKSB7CisgICAgICAgICAgICBpZiAoaGEtPmNtZF90YWJbal0uY21uZCAhPSBVTlVTRURfQ01ORCkKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heF9pbmRleCA8IGkpIHsKKyAgICAgICAgICAgIG1heF9pbmRleCA9IGk7CisgICAgICAgICAgICBUUkFDRTMoKCJHRFQ6IG1heF9pbmRleCA9ICVkXG4iLCh1c2hvcnQpaSkpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoaGEtPnBjY2ItPk9wQ29kZSA9PSBHRFRfSU5JVCkKKyAgICAgICAgaGEtPnBjY2ItPlNlcnZpY2UgfD0gMHg4MDsKKworICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkgeworICAgICAgICBpZiAoaGEtPnBjY2ItPk9wQ29kZSA9PSBHRFRfSU5JVCkgICAgICAgICAgICAgICAvKiBzdG9yZSBETUEgYnVmZmVyICovCisgICAgICAgICAgICBvdXRsKGhhLT5jY2JfcGh5cywgaGEtPmJtaWMgKyBNQUlMQk9YUkVHKTsKKyAgICAgICAgb3V0YihoYS0+cGNjYi0+U2VydmljZSwgaGEtPmJtaWMgKyBMRE9PUlJFRyk7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfSVNBKSB7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICYoKGdkdDJfZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+aW8uZXZlbnQpOworICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkgeworICAgICAgICBnZHRoX3dyaXRlYigwLCAmKChnZHQ2X2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPmlvLmV2ZW50KTsKKyAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9QQ0lORVcpIHsgCisgICAgICAgIG91dGIoMSwgUFRSMlVTSE9SVCgmaGEtPnBseC0+bGRvb3JfcmVnKSk7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSKSB7CisgICAgICAgIGdkdGhfd3JpdGViKDEsICYoKGdkdDZtX2RwcmFtX3N0ciBfX2lvbWVtICopaGEtPmJyZCktPmk5NjByLmxkb29yX3JlZyk7CisgICAgfQorfQorCisgICAgCitzdGF0aWMgaW50IGdkdGhfd2FpdChpbnQgaGFudW0saW50IGluZGV4LHVsb25nMzIgdGltZSkKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgaW50IGFuc3dlcl9mb3VuZCA9IEZBTFNFOworCisgICAgVFJBQ0UoKCJnZHRoX3dhaXQoKSBoYW51bSAlZCBpbmRleCAlZCB0aW1lICVkXG4iLGhhbnVtLGluZGV4LHRpbWUpKTsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gd2FpdCByZXF1aXJlZCAqLworCisgICAgZ2R0aF9mcm9tX3dhaXQgPSBUUlVFOworICAgIGRvIHsKKyAgICAgICAgZ2R0aF9pbnRlcnJ1cHQoKGludCloYS0+aXJxLGhhLE5VTEwpOworICAgICAgICBpZiAod2FpdF9oYW51bT09aGFudW0gJiYgd2FpdF9pbmRleD09aW5kZXgpIHsKKyAgICAgICAgICAgIGFuc3dlcl9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgIH0gd2hpbGUgKC0tdGltZSk7CisgICAgZ2R0aF9mcm9tX3dhaXQgPSBGQUxTRTsKKyAgICAKKyAgICB3aGlsZSAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKQorICAgICAgICBnZHRoX2RlbGF5KDApOworCisgICAgcmV0dXJuIChhbnN3ZXJfZm91bmQpOworfQorCisKK3N0YXRpYyBpbnQgZ2R0aF9pbnRlcm5hbF9jbWQoaW50IGhhbnVtLHVuY2hhciBzZXJ2aWNlLHVzaG9ydCBvcGNvZGUsdWxvbmczMiBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxvbmc2NCBwMix1bG9uZzY0IHAzKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICByZWdpc3RlciBnZHRoX2NtZF9zdHIgKmNtZF9wdHI7CisgICAgaW50IHJldHJpZXMsaW5kZXg7CisKKyAgICBUUkFDRTIoKCJnZHRoX2ludGVybmFsX2NtZCgpIHNlcnZpY2UgJWQgb3Bjb2RlICVkXG4iLHNlcnZpY2Usb3Bjb2RlKSk7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBjbWRfcHRyID0gaGEtPnBjY2I7CisgICAgbWVtc2V0KChjaGFyKiljbWRfcHRyLDAsc2l6ZW9mKGdkdGhfY21kX3N0cikpOworCisgICAgLyogbWFrZSBjb21tYW5kICAqLworICAgIGZvciAocmV0cmllcyA9IElOSVRfUkVUUklFUzs7KSB7CisgICAgICAgIGNtZF9wdHItPlNlcnZpY2UgICAgICAgICAgPSBzZXJ2aWNlOworICAgICAgICBjbWRfcHRyLT5SZXF1ZXN0QnVmZmVyICAgID0gSU5URVJOQUxfQ01ORDsKKyAgICAgICAgaWYgKCEoaW5kZXg9Z2R0aF9nZXRfY21kX2luZGV4KGhhbnVtKSkpIHsKKyAgICAgICAgICAgIFRSQUNFKCgiR0RUOiBObyBmcmVlIGNvbW1hbmQgaW5kZXggZm91bmRcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGdkdGhfc2V0X3NlbWEwKGhhbnVtKTsKKyAgICAgICAgY21kX3B0ci0+T3BDb2RlICAgICAgICAgICA9IG9wY29kZTsKKyAgICAgICAgY21kX3B0ci0+Qm9hcmROb2RlICAgICAgICA9IExPQ0FMQk9BUkQ7CisgICAgICAgIGlmIChzZXJ2aWNlID09IENBQ0hFU0VSVklDRSkgeworICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBHRFRfSU9DVEwpIHsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmlvY3RsLnN1YmZ1bmMgPSBwMTsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmlvY3RsLmNoYW5uZWwgPSAodWxvbmczMilwMjsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmlvY3RsLnBhcmFtX3NpemUgPSAodXNob3J0KXAzOworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUuaW9jdGwucF9wYXJhbSA9IGhhLT5zY3JhdGNoX3BoeXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgeworICAgICAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmNhY2hlNjQuRGV2aWNlTm8gPSAodXNob3J0KXAxOworICAgICAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmNhY2hlNjQuQmxvY2tObyAgPSBwMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbWRfcHRyLT51LmNhY2hlLkRldmljZU5vID0gKHVzaG9ydClwMTsKKyAgICAgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5jYWNoZS5CbG9ja05vICA9ICh1bG9uZzMyKXAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlID09IFNDU0lSQVdTRVJWSUNFKSB7CisgICAgICAgICAgICBpZiAoaGEtPnJhd19mZWF0ICYgR0RUXzY0QklUKSB7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXc2NC5kaXJlY3Rpb24gID0gcDE7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXc2NC5idXMgICAgICAgID0gKHVuY2hhcilwMjsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LnJhdzY0LnRhcmdldCAgICAgPSAodW5jaGFyKXAzOworICAgICAgICAgICAgICAgIGNtZF9wdHItPnUucmF3NjQubHVuICAgICAgICA9ICh1bmNoYXIpKHAzID4+IDgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWRfcHRyLT51LnJhdy5kaXJlY3Rpb24gID0gcDE7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXcuYnVzICAgICAgICA9ICh1bmNoYXIpcDI7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXcudGFyZ2V0ICAgICA9ICh1bmNoYXIpcDM7CisgICAgICAgICAgICAgICAgY21kX3B0ci0+dS5yYXcubHVuICAgICAgICA9ICh1bmNoYXIpKHAzID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgPT0gU0NSRUVOU0VSVklDRSkgeworICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBHRFRfUkVBTFRJTUUpIHsKKyAgICAgICAgICAgICAgICAqKHVsb25nMzIgKikmY21kX3B0ci0+dS5zY3JlZW4uc3UuZGF0YVswXSA9IHAxOworICAgICAgICAgICAgICAgICoodWxvbmczMiAqKSZjbWRfcHRyLT51LnNjcmVlbi5zdS5kYXRhWzRdID0gKHVsb25nMzIpcDI7CisgICAgICAgICAgICAgICAgKih1bG9uZzMyICopJmNtZF9wdHItPnUuc2NyZWVuLnN1LmRhdGFbOF0gPSAodWxvbmczMilwMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBoYS0+Y21kX2xlbiAgICAgICAgICA9IHNpemVvZihnZHRoX2NtZF9zdHIpOworICAgICAgICBoYS0+Y21kX29mZnNfZHBtZW0gICA9IDA7CisgICAgICAgIGhhLT5jbWRfY250ICAgICAgICAgID0gMDsKKyAgICAgICAgZ2R0aF9jb3B5X2NvbW1hbmQoaGFudW0pOworICAgICAgICBnZHRoX3JlbGVhc2VfZXZlbnQoaGFudW0pOworICAgICAgICBnZHRoX2RlbGF5KDIwKTsKKyAgICAgICAgaWYgKCFnZHRoX3dhaXQoaGFudW0saW5kZXgsSU5JVF9USU1FT1VUKSkgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQ6IEluaXRpYWxpemF0aW9uIGVycm9yICh0aW1lb3V0IHNlcnZpY2UgJWQpXG4iLHNlcnZpY2UpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhLT5zdGF0dXMgIT0gU19CU1kgfHwgLS1yZXRyaWVzID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZ2R0aF9kZWxheSgxKTsgICAKKyAgICB9ICAgCisgICAgCisgICAgcmV0dXJuIChoYS0+c3RhdHVzICE9IFNfT0sgPyAwOjEpOworfQorICAgIAorCisvKiBzZWFyY2ggZm9yIGRldmljZXMgKi8KKworc3RhdGljIGludCBfX2luaXQgZ2R0aF9zZWFyY2hfZHJpdmVzKGludCBoYW51bSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgdXNob3J0IGNkZXZfY250LCBpOworICAgIGludCBvazsKKyAgICB1bG9uZzMyIGJ1c19ubywgZHJ2X2NudCwgZHJ2X25vLCBqOworICAgIGdkdGhfZ2V0Y2hfc3RyICpjaG47CisgICAgZ2R0aF9kcmxpc3Rfc3RyICpkcmw7CisgICAgZ2R0aF9pb2NoYW5fc3RyICppb2M7CisgICAgZ2R0aF9yYXdfaW9jaGFuX3N0ciAqaW9jcjsKKyAgICBnZHRoX2FyY2RsX3N0ciAqYWxzdDsKKyAgICBnZHRoX2FsaXN0X3N0ciAqYWxzdDI7CisgICAgZ2R0aF9vZW1fc3RyX2lvY3RsICpvZW1zdHI7CisjaWZkZWYgSU5UX0NPQUwKKyAgICBnZHRoX3BlcmZfbW9kZXMgKnBtb2Q7CisjZW5kaWYKKworI2lmZGVmIEdEVEhfUlRDCisgICAgdW5jaGFyIHJ0Y1sxMl07CisgICAgdWxvbmcgZmxhZ3M7CisjZW5kaWYgICAgIAorICAgCisgICAgVFJBQ0UoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKSBoYW51bSAlZFxuIixoYW51bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIG9rID0gMDsKKworICAgIC8qIGluaXRpYWxpemUgY29udHJvbGxlciBzZXJ2aWNlcywgYXQgZmlyc3Q6IHNjcmVlbiBzZXJ2aWNlICovCisgICAgaGEtPnNjcmVlbl9mZWF0ID0gMDsKKyAgICBpZiAoIWZvcmNlX2RtYTMyKSB7CisgICAgICAgIG9rID0gZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sU0NSRUVOU0VSVklDRSxHRFRfWF9JTklUX1NDUiwwLDAsMCk7CisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIGhhLT5zY3JlZW5fZmVhdCA9IEdEVF82NEJJVDsKKyAgICB9CisgICAgaWYgKGZvcmNlX2RtYTMyIHx8ICghb2sgJiYgaGEtPnN0YXR1cyA9PSAodXNob3J0KVNfTk9GVU5DKSkKKyAgICAgICAgb2sgPSBnZHRoX2ludGVybmFsX2NtZChoYW51bSxTQ1JFRU5TRVJWSUNFLEdEVF9JTklULDAsMCwwKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIHByaW50aygiR0RULUhBICVkOiBJbml0aWFsaXphdGlvbiBlcnJvciBzY3JlZW4gc2VydmljZSAoY29kZSAlZClcbiIsCisgICAgICAgICAgICAgICBoYW51bSwgaGEtPnN0YXR1cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogU0NSRUVOU0VSVklDRSBpbml0aWFsaXplZFxuIikpOworCisjaWZkZWYgR0RUSF9SVEMKKyAgICAvKiByZWFkIHJlYWx0aW1lIGNsb2NrIGluZm8sIHNlbmQgdG8gY29udHJvbGxlciAqLworICAgIC8qIDEuIHdhaXQgZm9yIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgdXBkYXRlIGZsYWcgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMTAwMDAwMDsgKytqKQorICAgICAgICBpZiAoQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiBSVENfVUlQKQorICAgICAgICAgICAgYnJlYWs7CisgICAgZm9yIChqID0gMDsgaiA8IDEwMDAwMDA7ICsraikKKyAgICAgICAgaWYgKCEoQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCkgJiBSVENfVUlQKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIC8qIDIuIHJlYWQgaW5mbyAqLworICAgIGRvIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyOyArK2opIAorICAgICAgICAgICAgcnRjW2pdID0gQ01PU19SRUFEKGopOworICAgIH0gd2hpbGUgKHJ0Y1swXSAhPSBDTU9TX1JFQUQoMCkpOworICAgIHNwaW5fbG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpOiBSVEM6ICV4LyV4LyV4XG4iLCoodWxvbmczMiAqKSZydGNbMF0sCisgICAgICAgICAgICAqKHVsb25nMzIgKikmcnRjWzRdLCAqKHVsb25nMzIgKikmcnRjWzhdKSk7CisgICAgLyogMy4gc2VuZCB0byBjb250cm9sbGVyIGZpcm13YXJlICovCisgICAgZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sU0NSRUVOU0VSVklDRSxHRFRfUkVBTFRJTUUsICoodWxvbmczMiAqKSZydGNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgKih1bG9uZzMyICopJnJ0Y1s0XSwgKih1bG9uZzMyICopJnJ0Y1s4XSk7CisjZW5kaWYgIAorIAorICAgIC8qIHVuZnJlZXplIGFsbCBJT3MgKi8KKyAgICBnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX1VORlJFRVpFX0lPLDAsMCwwKTsKKyAKKyAgICAvKiBpbml0aWFsaXplIGNhY2hlIHNlcnZpY2UgKi8KKyAgICBoYS0+Y2FjaGVfZmVhdCA9IDA7CisgICAgaWYgKCFmb3JjZV9kbWEzMikgeworICAgICAgICBvayA9IGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfWF9JTklUX0hPU1QsTElOVVhfT1MsMCwwKTsKKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgaGEtPmNhY2hlX2ZlYXQgPSBHRFRfNjRCSVQ7CisgICAgfQorICAgIGlmIChmb3JjZV9kbWEzMiB8fCAoIW9rICYmIGhhLT5zdGF0dXMgPT0gKHVzaG9ydClTX05PRlVOQykpCisgICAgICAgIG9rID0gZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JTklULExJTlVYX09TLDAsMCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogSW5pdGlhbGl6YXRpb24gZXJyb3IgY2FjaGUgc2VydmljZSAoY29kZSAlZClcbiIsCisgICAgICAgICAgICAgICBoYW51bSwgaGEtPnN0YXR1cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogQ0FDSEVTRVJWSUNFIGluaXRpYWxpemVkXG4iKSk7CisgICAgY2Rldl9jbnQgPSAodXNob3J0KWhhLT5pbmZvOworICAgIGhhLT5md192ZXJzID0gaGEtPnNlcnZpY2U7CisKKyNpZmRlZiBJTlRfQ09BTAorICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSKSB7CisgICAgICAgIC8qIHNldCBwZXJmLiBtb2RlcyAqLworICAgICAgICBwbW9kID0gKGdkdGhfcGVyZl9tb2RlcyAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgcG1vZC0+dmVyc2lvbiAgICAgICAgICA9IDE7CisgICAgICAgIHBtb2QtPnN0X21vZGUgICAgICAgICAgPSAxOyAgICAvKiBlbmFibGUgb25lIHN0YXR1cyBidWZmZXIgKi8KKyAgICAgICAgKigodWxvbmc2NCAqKSZwbW9kLT5zdF9idWZmX2FkZHIxKSA9IGhhLT5jb2FsX3N0YXRfcGh5czsKKyAgICAgICAgcG1vZC0+c3RfYnVmZl9pbmR4MSAgICA9IENPQUxJTkRFWDsKKyAgICAgICAgcG1vZC0+c3RfYnVmZl9hZGRyMiAgICA9IDA7CisgICAgICAgIHBtb2QtPnN0X2J1ZmZfdV9hZGRyMiAgPSAwOworICAgICAgICBwbW9kLT5zdF9idWZmX2luZHgyICAgID0gMDsKKyAgICAgICAgcG1vZC0+c3RfYnVmZl9zaXplICAgICA9IHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqIE1BWE9GRlNFVFM7CisgICAgICAgIHBtb2QtPmNtZF9tb2RlICAgICAgICAgPSAwOyAgICAvLyBkaXNhYmxlIGFsbCBjbWQgYnVmZmVycworICAgICAgICBwbW9kLT5jbWRfYnVmZl9hZGRyMSAgID0gMDsKKyAgICAgICAgcG1vZC0+Y21kX2J1ZmZfdV9hZGRyMSA9IDA7CisgICAgICAgIHBtb2QtPmNtZF9idWZmX2luZHgxICAgPSAwOworICAgICAgICBwbW9kLT5jbWRfYnVmZl9hZGRyMiAgID0gMDsKKyAgICAgICAgcG1vZC0+Y21kX2J1ZmZfdV9hZGRyMiA9IDA7CisgICAgICAgIHBtb2QtPmNtZF9idWZmX2luZHgyICAgPSAwOworICAgICAgICBwbW9kLT5jbWRfYnVmZl9zaXplICAgID0gMDsKKyAgICAgICAgcG1vZC0+cmVzZXJ2ZWQxICAgICAgICA9IDA7ICAgICAgICAgICAgCisgICAgICAgIHBtb2QtPnJlc2VydmVkMiAgICAgICAgPSAwOyAgICAgICAgICAgIAorICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCxTRVRfUEVSRl9NT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCxzaXplb2YoZ2R0aF9wZXJmX21vZGVzKSkpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULUhBICVkOiBJbnRlcnJ1cHQgY29hbGVzY2luZyBhY3RpdmF0ZWRcbiIsIGhhbnVtKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogZGV0ZWN0IG51bWJlciBvZiBidXNlcyAtIHRyeSBuZXcgSU9DVEwgKi8KKyAgICBpb2NyID0gKGdkdGhfcmF3X2lvY2hhbl9zdHIgKiloYS0+cHNjcmF0Y2g7CisgICAgaW9jci0+aGRyLnZlcnNpb24gICAgICAgID0gMHhmZmZmZmZmZjsKKyAgICBpb2NyLT5oZHIubGlzdF9lbnRyaWVzICAgPSBNQVhCVVM7CisgICAgaW9jci0+aGRyLmZpcnN0X2NoYW4gICAgID0gMDsKKyAgICBpb2NyLT5oZHIubGFzdF9jaGFuICAgICAgPSBNQVhCVVMtMTsKKyAgICBpb2NyLT5oZHIubGlzdF9vZmZzZXQgICAgPSBHRFRPRkZTT0YoZ2R0aF9yYXdfaW9jaGFuX3N0ciwgbGlzdFswXSk7CisgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsSU9DSEFOX1JBV19ERVNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NIQU5ORUwsc2l6ZW9mKGdkdGhfcmF3X2lvY2hhbl9zdHIpKSkgeworICAgICAgICBUUkFDRTIoKCJJT0NIQU5fUkFXX0RFU0Mgc3VwcG9ydGVkIVxuIikpOworICAgICAgICBoYS0+YnVzX2NudCA9IGlvY3ItPmhkci5jaGFuX2NvdW50OworICAgICAgICBmb3IgKGJ1c19ubyA9IDA7IGJ1c19ubyA8IGhhLT5idXNfY250OyArK2J1c19ubykgeworICAgICAgICAgICAgaWYgKGlvY3ItPmxpc3RbYnVzX25vXS5wcm9jX2lkIDwgTUFYSUQpCisgICAgICAgICAgICAgICAgaGEtPmJ1c19pZFtidXNfbm9dID0gaW9jci0+bGlzdFtidXNfbm9dLnByb2NfaWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaGEtPmJ1c19pZFtidXNfbm9dID0gMHhmZjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG9sZCBtZXRob2QgKi8KKyAgICAgICAgY2huID0gKGdkdGhfZ2V0Y2hfc3RyICopaGEtPnBzY3JhdGNoOworICAgICAgICBmb3IgKGJ1c19ubyA9IDA7IGJ1c19ubyA8IE1BWEJVUzsgKytidXNfbm8pIHsKKyAgICAgICAgICAgIGNobi0+Y2hhbm5lbF9ubyA9IGJ1c19ubzsKKyAgICAgICAgICAgIGlmICghZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSV9DSEFOX0NOVCB8IExfQ1RSTF9QQVRURVJOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT19DSEFOTkVMIHwgSU5WQUxJRF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2R0aF9nZXRjaF9zdHIpKSkgeworICAgICAgICAgICAgICAgIGlmIChidXNfbm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogRXJyb3IgZGV0ZWN0aW5nIGNoYW5uZWwgY291bnQgKDB4JXgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFudW0sIGhhLT5zdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2huLT5zaW9wX2lkIDwgTUFYSUQpCisgICAgICAgICAgICAgICAgaGEtPmJ1c19pZFtidXNfbm9dID0gY2huLT5zaW9wX2lkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGhhLT5idXNfaWRbYnVzX25vXSA9IDB4ZmY7CisgICAgICAgIH0gICAgICAgCisgICAgICAgIGhhLT5idXNfY250ID0gKHVuY2hhcilidXNfbm87CisgICAgfQorICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpICVkIGNoYW5uZWxzXG4iLGhhLT5idXNfY250KSk7CisKKyAgICAvKiByZWFkIGNhY2hlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpZiAoIWdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsQ0FDSEVfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCxzaXplb2YoZ2R0aF9jaW5mb19zdHIpKSkgeworICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogSW5pdGlhbGl6YXRpb24gZXJyb3IgY2FjaGUgc2VydmljZSAoY29kZSAlZClcbiIsCisgICAgICAgICAgICAgICBoYW51bSwgaGEtPnN0YXR1cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBoYS0+Y3BhciA9ICgoZ2R0aF9jaW5mb19zdHIgKiloYS0+cHNjcmF0Y2gpLT5jcGFyOworICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpIGNpbmZvOiB2cyAleCBzdGEgJWQgc3RyICVkIGR3ICVkIGIgJWRcbiIsCisgICAgICAgICAgICBoYS0+Y3Bhci52ZXJzaW9uLGhhLT5jcGFyLnN0YXRlLGhhLT5jcGFyLnN0cmF0ZWd5LAorICAgICAgICAgICAgaGEtPmNwYXIud3JpdGVfYmFjayxoYS0+Y3Bhci5ibG9ja19zaXplKSk7CisKKyAgICAvKiByZWFkIGJvYXJkIGluZm8gYW5kIGZlYXR1cmVzICovCisgICAgaGEtPm1vcmVfcHJvYyA9IEZBTFNFOworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLEJPQVJEX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCxzaXplb2YoZ2R0aF9iaW5mb19zdHIpKSkgeworICAgICAgICBtZW1jcHkoJmhhLT5iaW5mbywgKGdkdGhfYmluZm9fc3RyICopaGEtPnBzY3JhdGNoLAorICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfYmluZm9fc3RyKSk7CisgICAgICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLEJPQVJEX0ZFQVRVUkVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFOTkVMLHNpemVvZihnZHRoX2JmZWF0X3N0cikpKSB7CisgICAgICAgICAgICBUUkFDRTIoKCJCT0FSRF9JTkZPL0JPQVJEX0ZFQVRVUkVTIHN1cHBvcnRlZFxuIikpOworICAgICAgICAgICAgaGEtPmJmZWF0ID0gKihnZHRoX2JmZWF0X3N0ciAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgICAgIGhhLT5tb3JlX3Byb2MgPSBUUlVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgVFJBQ0UyKCgiQk9BUkRfSU5GTyByZXF1aXJlcyBmaXJtd2FyZSA+PSAxLjEwLzIuMDhcbiIpKTsKKyAgICAgICAgc3RyY3B5KGhhLT5iaW5mby50eXBlX3N0cmluZywgZ2R0aF9jdHJfbmFtZShoYW51bSkpOworICAgIH0KKyAgICBUUkFDRTIoKCJDb250cm9sbGVyIG5hbWU6ICVzXG4iLGhhLT5iaW5mby50eXBlX3N0cmluZykpOworCisgICAgLyogcmVhZCBtb3JlIGluZm9ybWF0aW9ucyAqLworICAgIGlmIChoYS0+bW9yZV9wcm9jKSB7CisgICAgICAgIC8qIHBoeXNpY2FsIGRyaXZlcywgY2hhbm5lbCBhZGRyZXNzZXMgKi8KKyAgICAgICAgaW9jID0gKGdkdGhfaW9jaGFuX3N0ciAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgaW9jLT5oZHIudmVyc2lvbiAgICAgICAgPSAweGZmZmZmZmZmOworICAgICAgICBpb2MtPmhkci5saXN0X2VudHJpZXMgICA9IE1BWEJVUzsKKyAgICAgICAgaW9jLT5oZHIuZmlyc3RfY2hhbiAgICAgPSAwOworICAgICAgICBpb2MtPmhkci5sYXN0X2NoYW4gICAgICA9IE1BWEJVUy0xOworICAgICAgICBpb2MtPmhkci5saXN0X29mZnNldCAgICA9IEdEVE9GRlNPRihnZHRoX2lvY2hhbl9zdHIsIGxpc3RbMF0pOworICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCxJT0NIQU5fREVTQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBTk5FTCxzaXplb2YoZ2R0aF9pb2NoYW5fc3RyKSkpIHsKKyAgICAgICAgICAgIGZvciAoYnVzX25vID0gMDsgYnVzX25vIDwgaGEtPmJ1c19jbnQ7ICsrYnVzX25vKSB7CisgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLmFkZHJlc3MgPSBpb2MtPmxpc3RbYnVzX25vXS5hZGRyZXNzOworICAgICAgICAgICAgICAgIGhhLT5yYXdbYnVzX25vXS5sb2NhbF9ubyA9IGlvYy0+bGlzdFtidXNfbm9dLmxvY2FsX25vOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChidXNfbm8gPSAwOyBidXNfbm8gPCBoYS0+YnVzX2NudDsgKytidXNfbm8pIHsKKyAgICAgICAgICAgICAgICBoYS0+cmF3W2J1c19ub10uYWRkcmVzcyA9IElPX0NIQU5ORUw7CisgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLmxvY2FsX25vID0gYnVzX25vOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoYnVzX25vID0gMDsgYnVzX25vIDwgaGEtPmJ1c19jbnQ7ICsrYnVzX25vKSB7CisgICAgICAgICAgICBjaG4gPSAoZ2R0aF9nZXRjaF9zdHIgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgICAgICBjaG4tPmNoYW5uZWxfbm8gPSBoYS0+cmF3W2J1c19ub10ubG9jYWxfbm87CisgICAgICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1NJX0NIQU5fQ05UIHwgTF9DVFJMX1BBVFRFUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLmFkZHJlc3MgfCBJTlZBTElEX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfZ2V0Y2hfc3RyKSkpIHsKKyAgICAgICAgICAgICAgICBoYS0+cmF3W2J1c19ub10ucGRldl9jbnQgPSBjaG4tPmRyaXZlX2NudDsKKyAgICAgICAgICAgICAgICBUUkFDRTIoKCJDaGFubmVsICVkOiAlZCBwaHlzLiBkcml2ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBidXNfbm8sY2huLT5kcml2ZV9jbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYS0+cmF3W2J1c19ub10ucGRldl9jbnQgPiAwKSB7CisgICAgICAgICAgICAgICAgZHJsID0gKGdkdGhfZHJsaXN0X3N0ciAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgICAgICAgICBkcmwtPnNjX25vID0gaGEtPnJhd1tidXNfbm9dLmxvY2FsX25vOworICAgICAgICAgICAgICAgIGRybC0+c2NfY250ID0gaGEtPnJhd1tidXNfbm9dLnBkZXZfY250OworICAgICAgICAgICAgICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1NJX0RSX0xJU1QgfCBMX0NUUkxfUEFUVEVSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLmFkZHJlc3MgfCBJTlZBTElEX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnZHRoX2RybGlzdF9zdHIpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGEtPnJhd1tidXNfbm9dLnBkZXZfY250OyArK2opIAorICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLmlkX2xpc3Rbal0gPSBkcmwtPnNjX2xpc3Rbal07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGEtPnJhd1tidXNfbm9dLnBkZXZfY250ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBsb2dpY2FsIGRyaXZlcyAqLworICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCxDQUNIRV9EUlZfQ05ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFOTkVMLHNpemVvZih1bG9uZzMyKSkpIHsKKyAgICAgICAgICAgIGRydl9jbnQgPSAqKHVsb25nMzIgKiloYS0+cHNjcmF0Y2g7CisgICAgICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9JT0NUTCxDQUNIRV9EUlZfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NIQU5ORUwsZHJ2X2NudCAqIHNpemVvZih1bG9uZzMyKSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZHJ2X2NudDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGRydl9ubyA9ICgodWxvbmczMiAqKWhhLT5wc2NyYXRjaClbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChkcnZfbm8gPCBNQVhfTERSSVZFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltkcnZfbm9dLmlzX2xvZ2RydiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRTIoKCJEcml2ZSAlZCBpcyBsb2cuIGRyaXZlXG4iLGRydl9ubykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxzdCA9IChnZHRoX2FyY2RsX3N0ciAqKWhhLT5wc2NyYXRjaDsKKyAgICAgICAgICAgIGFsc3QtPmVudHJpZXNfYXZhaWwgPSBNQVhfTERSSVZFUzsKKyAgICAgICAgICAgIGFsc3QtPmZpcnN0X2VudHJ5ID0gMDsKKyAgICAgICAgICAgIGFsc3QtPmxpc3Rfb2Zmc2V0ID0gR0RUT0ZGU09GKGdkdGhfYXJjZGxfc3RyLCBsaXN0WzBdKTsKKyAgICAgICAgICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX0RSVl9MSVNUMiB8IExBX0NUUkxfUEFUVEVSTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9DSEFOTkVMLCBzaXplb2YoZ2R0aF9hcmNkbF9zdHIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxzdC0+ZW50cmllc19hdmFpbC0xKSAqIHNpemVvZihnZHRoX2FsaXN0X3N0cikpKSB7IAorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBhbHN0LT5lbnRyaWVzX2luaXQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX2FycmF5ZHJ2ID0gYWxzdC0+bGlzdFtqXS5pc19hcnJheWQ7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0uaXNfbWFzdGVyID0gYWxzdC0+bGlzdFtqXS5pc19tYXN0ZXI7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0uaXNfcGFyaXR5ID0gYWxzdC0+bGlzdFtqXS5pc19wYXJpdHk7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0uaXNfaG90Zml4ID0gYWxzdC0+bGlzdFtqXS5pc19ob3RmaXg7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0ubWFzdGVyX25vID0gYWxzdC0+bGlzdFtqXS5jZF9oYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lPQ1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9EUlZfTElTVCB8IExBX0NUUkxfUEFUVEVSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMzUgKiBzaXplb2YoZ2R0aF9hbGlzdF9zdHIpKSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzNTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGFsc3QyID0gJigoZ2R0aF9hbGlzdF9zdHIgKiloYS0+cHNjcmF0Y2gpW2pdOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX2FycmF5ZHJ2ID0gYWxzdDItPmlzX2FycmF5ZDsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltqXS5pc19tYXN0ZXIgPSBhbHN0Mi0+aXNfbWFzdGVyOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2pdLmlzX3Bhcml0eSA9IGFsc3QyLT5pc19wYXJpdHk7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbal0uaXNfaG90Zml4ID0gYWxzdDItPmlzX2hvdGZpeDsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltqXS5tYXN0ZXJfbm8gPSBhbHN0Mi0+Y2RfaGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgLyogaW5pdGlhbGl6ZSByYXcgc2VydmljZSAqLworICAgIGhhLT5yYXdfZmVhdCA9IDA7CisgICAgaWYgKCFmb3JjZV9kbWEzMikgeworICAgICAgICBvayA9IGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDU0lSQVdTRVJWSUNFLEdEVF9YX0lOSVRfUkFXLDAsMCwwKTsKKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgaGEtPnJhd19mZWF0ID0gR0RUXzY0QklUOworICAgIH0KKyAgICBpZiAoZm9yY2VfZG1hMzIgfHwgKCFvayAmJiBoYS0+c3RhdHVzID09ICh1c2hvcnQpU19OT0ZVTkMpKQorICAgICAgICBvayA9IGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDU0lSQVdTRVJWSUNFLEdEVF9JTklULDAsMCwwKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIHByaW50aygiR0RULUhBICVkOiBJbml0aWFsaXphdGlvbiBlcnJvciByYXcgc2VydmljZSAoY29kZSAlZClcbiIsCisgICAgICAgICAgICAgICBoYW51bSwgaGEtPnN0YXR1cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogUkFXU0VSVklDRSBpbml0aWFsaXplZFxuIikpOworCisgICAgLyogc2V0L2dldCBmZWF0dXJlcyByYXcgc2VydmljZSAoc2NhdHRlci9nYXRoZXIpICovCisgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDU0lSQVdTRVJWSUNFLEdEVF9TRVRfRkVBVCxTQ0FUVEVSX0dBVEhFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwKSkgeworICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcml2ZXMoKTogc2V0IGZlYXR1cmVzIFJBV1NFUlZJQ0UgT0tcbiIpKTsKKyAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLFNDU0lSQVdTRVJWSUNFLEdEVF9HRVRfRkVBVCwwLDAsMCkpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyKCk6IGdldCBmZWF0IFJBV1NFUlZJQ0UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGhhLT5pbmZvKSk7CisgICAgICAgICAgICBoYS0+cmF3X2ZlYXQgfD0gKHVzaG9ydCloYS0+aW5mbzsKKyAgICAgICAgfQorICAgIH0gCisKKyAgICAvKiBzZXQvZ2V0IGZlYXR1cmVzIGNhY2hlIHNlcnZpY2UgKGVxdWFsIHRvIHJhdyBzZXJ2aWNlKSAqLworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX1NFVF9GRUFULDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQVRURVJfR0FUSEVSLDApKSB7CisgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpOiBzZXQgZmVhdHVyZXMgQ0FDSEVTRVJWSUNFIE9LXG4iKSk7CisgICAgICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0dFVF9GRUFULDAsMCwwKSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHIoKTogZ2V0IGZlYXQgQ0FDSEVTRVJWLiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaGEtPmluZm8pKTsKKyAgICAgICAgICAgIGhhLT5jYWNoZV9mZWF0IHw9ICh1c2hvcnQpaGEtPmluZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXNlcnZlIGRyaXZlcyBmb3IgcmF3IHNlcnZpY2UgKi8KKyAgICBpZiAocmVzZXJ2ZV9tb2RlICE9IDApIHsKKyAgICAgICAgZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sU0NTSVJBV1NFUlZJQ0UsR0RUX1JFU0VSVkVfQUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlX21vZGUgPT0gMSA/IDEgOiAzLCAwLCAwKTsKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCk6IFJFU0VSVkVfQUxMIGNvZGUgJWRcbiIsIAorICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMpKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRVNfQVJHUzsgaSArPSA0KSB7CisgICAgICAgIGlmIChyZXNlcnZlX2xpc3RbaV0gPT0gaGFudW0gJiYgcmVzZXJ2ZV9saXN0W2krMV0gPCBoYS0+YnVzX2NudCAmJiAKKyAgICAgICAgICAgIHJlc2VydmVfbGlzdFtpKzJdIDwgaGEtPnRpZF9jbnQgJiYgcmVzZXJ2ZV9saXN0W2krM10gPCBNQVhMVU4pIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpOiByZXNlcnZlIGhhICVkIGJ1cyAlZCBpZCAlZCBsdW4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHJlc2VydmVfbGlzdFtpXSwgcmVzZXJ2ZV9saXN0W2krMV0sCisgICAgICAgICAgICAgICAgICAgIHJlc2VydmVfbGlzdFtpKzJdLCByZXNlcnZlX2xpc3RbaSszXSkpOworICAgICAgICAgICAgaWYgKCFnZHRoX2ludGVybmFsX2NtZChoYW51bSxTQ1NJUkFXU0VSVklDRSxHRFRfUkVTRVJWRSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlX2xpc3RbaSsxXSwgcmVzZXJ2ZV9saXN0W2krMl0gfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc2VydmVfbGlzdFtpKzNdIDw8IDgpKSkgeworICAgICAgICAgICAgICAgIHByaW50aygiR0RULUhBICVkOiBFcnJvciByYXcgc2VydmljZSAoUkVTRVJWRSwgY29kZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhhbnVtLCBoYS0+c3RhdHVzKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZXRlcm1pbmUgT0VNIHN0cmluZyB1c2luZyBJT0NUTCAqLworICAgIG9lbXN0ciA9IChnZHRoX29lbV9zdHJfaW9jdGwgKiloYS0+cHNjcmF0Y2g7CisgICAgb2Vtc3RyLT5wYXJhbXMuY3RsX3ZlcnNpb24gPSAweDAxOworICAgIG9lbXN0ci0+cGFyYW1zLmJ1ZmZlcl9zaXplID0gc2l6ZW9mKG9lbXN0ci0+dGV4dCk7CisgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfSU9DVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX1JFQURfT0VNX1NUUklOR19SRUNPUkQsSU5WQUxJRF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2R0aF9vZW1fc3RyX2lvY3RsKSkpIHsKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCk6IENBQ0hFX1JFQURfT0VNX1NUUklOR19SRUNPUkQgT0tcbiIpKTsKKyAgICAgICAgcHJpbnRrKCJHRFQtSEEgJWQ6IFZlbmRvcjogJXMgTmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICBoYW51bSxvZW1zdHItPnRleHQub2VtX2NvbXBhbnlfbmFtZSxoYS0+YmluZm8udHlwZV9zdHJpbmcpOworICAgICAgICAvKiBTYXZlIHRoZSBIb3N0IERyaXZlIGlucXVpcnkgZGF0YSAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgc3RybGNweShoYS0+b2VtX25hbWUsb2Vtc3RyLT50ZXh0LnNjc2lfaG9zdF9kcml2ZV9pbnF1aXJ5X3ZlbmRvcl9pZCwKKyAgICAgICAgICAgICAgICBzaXplb2YoaGEtPm9lbV9uYW1lKSk7CisjZWxzZQorICAgICAgICBzdHJuY3B5KGhhLT5vZW1fbmFtZSxvZW1zdHItPnRleHQuc2NzaV9ob3N0X2RyaXZlX2lucXVpcnlfdmVuZG9yX2lkLDcpOworICAgICAgICBoYS0+b2VtX25hbWVbN10gPSAnXDAnOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogT2xkIG1ldGhvZCwgYmFzZWQgb24gUENJIElEICovCisgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyaXZlcygpOiBDQUNIRV9SRUFEX09FTV9TVFJJTkdfUkVDT1JEIGZhaWxlZFxuIikpOworICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogTmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICBoYW51bSxoYS0+YmluZm8udHlwZV9zdHJpbmcpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgaWYgKGhhLT5vZW1faWQgPT0gT0VNX0lEX0lOVEVMKQorICAgICAgICAgICAgc3RybGNweShoYS0+b2VtX25hbWUsIkludGVsICAiLCBzaXplb2YoaGEtPm9lbV9uYW1lKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmxjcHkoaGEtPm9lbV9uYW1lLCJJQ1AgICAgIiwgc2l6ZW9mKGhhLT5vZW1fbmFtZSkpOworI2Vsc2UgCisgICAgICAgIGlmIChoYS0+b2VtX2lkID09IE9FTV9JRF9JTlRFTCkKKyAgICAgICAgICAgIHN0cmNweShoYS0+b2VtX25hbWUsIkludGVsICAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyY3B5KGhhLT5vZW1fbmFtZSwiSUNQICAgICIpOworI2VuZGlmCisgICAgfQorCisgICAgLyogc2Nhbm5pbmcgZm9yIGhvc3QgZHJpdmVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGNkZXZfY250OyArK2kpIAorICAgICAgICBnZHRoX2FuYWx5c2VfaGRyaXZlKGhhbnVtLGkpOworICAgIAorICAgIFRSQUNFKCgiZ2R0aF9zZWFyY2hfZHJpdmVzKCkgT0tcbiIpKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZHRoX2FuYWx5c2VfaGRyaXZlKGludCBoYW51bSx1c2hvcnQgaGRyaXZlKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZzMyIGRydl9jeWxzOworICAgIGludCBkcnZfaGRzLCBkcnZfc2VjczsKKworICAgIFRSQUNFKCgiZ2R0aF9hbmFseXNlX2hkcml2ZSgpIGhhbnVtICVkIGRyaXZlICVkXG4iLGhhbnVtLGhkcml2ZSkpOworICAgIGlmIChoZHJpdmUgPj0gTUFYX0hEUklWRVMpCisgICAgICAgIHJldHVybiAwOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisgICAgaWYgKCFnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0lORk8saGRyaXZlLDAsMCkpIAorICAgICAgICByZXR1cm4gMDsKKyAgICBoYS0+aGRyW2hkcml2ZV0ucHJlc2VudCA9IFRSVUU7CisgICAgaGEtPmhkcltoZHJpdmVdLnNpemUgPSBoYS0+aW5mbzsKKyAgIAorICAgIC8qIGV2YWx1YXRlIG1hcHBpbmcgKHNlY3RvcnMgcGVyIGhlYWQsIGhlYWRzIHBlciBjeWxpbmRlcikgKi8KKyAgICBoYS0+aGRyW2hkcml2ZV0uc2l6ZSAmPSB+U0VDUzMyOworICAgIGlmIChoYS0+aW5mbzIgPT0gMCkgeworICAgICAgICBnZHRoX2V2YWxfbWFwcGluZyhoYS0+aGRyW2hkcml2ZV0uc2l6ZSwmZHJ2X2N5bHMsJmRydl9oZHMsJmRydl9zZWNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcnZfaGRzID0gaGEtPmluZm8yICYgMHhmZjsKKyAgICAgICAgZHJ2X3NlY3MgPSAoaGEtPmluZm8yID4+IDgpICYgMHhmZjsKKyAgICAgICAgZHJ2X2N5bHMgPSAodWxvbmczMiloYS0+aGRyW2hkcml2ZV0uc2l6ZSAvIGRydl9oZHMgLyBkcnZfc2VjczsKKyAgICB9CisgICAgaGEtPmhkcltoZHJpdmVdLmhlYWRzID0gKHVuY2hhcilkcnZfaGRzOworICAgIGhhLT5oZHJbaGRyaXZlXS5zZWNzICA9ICh1bmNoYXIpZHJ2X3NlY3M7CisgICAgLyogcm91bmQgc2l6ZSAqLworICAgIGhhLT5oZHJbaGRyaXZlXS5zaXplICA9IGRydl9jeWxzICogZHJ2X2hkcyAqIGRydl9zZWNzOworICAgIAorICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgeworICAgICAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9YX0lORk8saGRyaXZlLDAsMCkKKyAgICAgICAgICAgICYmIGhhLT5pbmZvMiAhPSAwKSB7CisgICAgICAgICAgICBoYS0+aGRyW2hkcml2ZV0uc2l6ZSA9ICgodWxvbmc2NCloYS0+aW5mbzIgPDwgMzIpIHwgaGEtPmluZm87CisgICAgICAgIH0KKyAgICB9CisgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHIoKSBjZHIuICVkIHNpemUgJWQgaGRzICVkIHNjcyAlZFxuIiwKKyAgICAgICAgICAgIGhkcml2ZSxoYS0+aGRyW2hkcml2ZV0uc2l6ZSxkcnZfaGRzLGRydl9zZWNzKSk7CisKKyAgICAvKiBnZXQgaW5mb3JtYXRpb25zIGFib3V0IGRldmljZSAqLworICAgIGlmIChnZHRoX2ludGVybmFsX2NtZChoYW51bSxDQUNIRVNFUlZJQ0UsR0RUX0RFVlRZUEUsaGRyaXZlLDAsMCkpIHsKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zZWFyY2hfZHIoKSBjYWNoZSBkcml2ZSAlZCBkZXZ0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgIGhkcml2ZSxoYS0+aW5mbykpOworICAgICAgICBoYS0+aGRyW2hkcml2ZV0uZGV2dHlwZSA9ICh1c2hvcnQpaGEtPmluZm87CisgICAgfQorCisgICAgLyogY2x1c3RlciBpbmZvICovCisgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLENBQ0hFU0VSVklDRSxHRFRfQ0xVU1RfSU5GTyxoZHJpdmUsMCwwKSkgeworICAgICAgICBUUkFDRTIoKCJnZHRoX3NlYXJjaF9kcigpIGNhY2hlIGRyaXZlICVkIGNsdXN0ZXIgaW5mbyAlZFxuIiwKKyAgICAgICAgICAgICAgICBoZHJpdmUsaGEtPmluZm8pKTsKKyAgICAgICAgaWYgKCFzaGFyZWRfYWNjZXNzKQorICAgICAgICAgICAgaGEtPmhkcltoZHJpdmVdLmNsdXN0ZXJfdHlwZSA9ICh1bmNoYXIpaGEtPmluZm87CisgICAgfQorCisgICAgLyogUi9XIGF0dHJpYnV0ZXMgKi8KKyAgICBpZiAoZ2R0aF9pbnRlcm5hbF9jbWQoaGFudW0sQ0FDSEVTRVJWSUNFLEdEVF9SV19BVFRSSUJTLGhkcml2ZSwwLDApKSB7CisgICAgICAgIFRSQUNFMigoImdkdGhfc2VhcmNoX2RyKCkgY2FjaGUgZHJpdmUgJWQgci93IGF0dHJpYi4gJWRcbiIsCisgICAgICAgICAgICAgICAgaGRyaXZlLGhhLT5pbmZvKSk7CisgICAgICAgIGhhLT5oZHJbaGRyaXZlXS5yd19hdHRyaWJzID0gKHVuY2hhciloYS0+aW5mbzsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKiBjb21tYW5kIHF1ZXVlaW5nL3NlbmRpbmcgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGdkdGhfcHV0cShpbnQgaGFudW0sU2NzaV9DbW5kICpzY3AsdW5jaGFyIHByaW9yaXR5KQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICByZWdpc3RlciBTY3NpX0NtbmQgKnBzY3A7CisgICAgcmVnaXN0ZXIgU2NzaV9DbW5kICpuc2NwOworICAgIHVsb25nIGZsYWdzOworICAgIHVuY2hhciBiLCB0OworCisgICAgVFJBQ0UoKCJnZHRoX3B1dHEoKSBwcmlvcml0eSAlZFxuIixwcmlvcml0eSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIHNjcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSAoaW50KXByaW9yaXR5OworICAgIGIgPSB2aXJ0X2N0ciA/IE5VTURBVEEoc2NwLT5kZXZpY2UtPmhvc3QpLT5idXNudW0gOiBzY3AtPmRldmljZS0+Y2hhbm5lbDsKKyAgICB0ID0gc2NwLT5kZXZpY2UtPmlkOworICAgIGlmIChwcmlvcml0eSA+PSBERUZBVUxUX1BSSSkgeworICAgICAgICBpZiAoKGIgIT0gaGEtPnZpcnRfYnVzICYmIGhhLT5yYXdbQlVTX0wyUChoYSxiKV0ubG9jaykgfHwKKyAgICAgICAgICAgIChiID09IGhhLT52aXJ0X2J1cyAmJiB0IDwgTUFYX0hEUklWRVMgJiYgaGEtPmhkclt0XS5sb2NrKSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9wdXRxKCk6IGxvY2tlZCBJTyAtPiB1cGRhdGVfdGltZW91dCgpXG4iKSk7CisgICAgICAgICAgICBzY3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gZ2R0aF91cGRhdGVfdGltZW91dChoYW51bSwgc2NwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoYS0+cmVxX2ZpcnN0PT1OVUxMKSB7CisgICAgICAgIGhhLT5yZXFfZmlyc3QgPSBzY3A7ICAgICAgICAgICAgICAgICAgICAvKiBxdWV1ZSB3YXMgZW1wdHkgKi8KKyAgICAgICAgc2NwLT5TQ3AucHRyID0gTlVMTDsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1ZXVlIG5vdCBlbXB0eSAqLworICAgICAgICBwc2NwID0gaGEtPnJlcV9maXJzdDsKKyAgICAgICAgbnNjcCA9IChTY3NpX0NtbmQgKilwc2NwLT5TQ3AucHRyOworICAgICAgICAvKiBwcmlvcml0eTogMC1oaWdoZXN0LC4uLDB4ZmYtbG93ZXN0ICovCisgICAgICAgIHdoaWxlIChuc2NwICYmICh1bmNoYXIpbnNjcC0+U0NwLnRoaXNfcmVzaWR1YWwgPD0gcHJpb3JpdHkpIHsKKyAgICAgICAgICAgIHBzY3AgPSBuc2NwOworICAgICAgICAgICAgbnNjcCA9IChTY3NpX0NtbmQgKilwc2NwLT5TQ3AucHRyOworICAgICAgICB9CisgICAgICAgIHBzY3AtPlNDcC5wdHIgPSAoY2hhciAqKXNjcDsKKyAgICAgICAgc2NwLT5TQ3AucHRyICA9IChjaGFyICopbnNjcDsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICBmbGFncyA9IDA7CisgICAgZm9yIChuc2NwPWhhLT5yZXFfZmlyc3Q7IG5zY3A7IG5zY3A9KFNjc2lfQ21uZCopbnNjcC0+U0NwLnB0cikKKyAgICAgICAgKytmbGFnczsKKyAgICBpZiAobWF4X3JxIDwgZmxhZ3MpIHsKKyAgICAgICAgbWF4X3JxID0gZmxhZ3M7CisgICAgICAgIFRSQUNFMygoIkdEVDogbWF4X3JxID0gJWRcbiIsKHVzaG9ydCltYXhfcnEpKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZ2R0aF9uZXh0KGludCBoYW51bSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgU2NzaV9DbW5kICpwc2NwOworICAgIHJlZ2lzdGVyIFNjc2lfQ21uZCAqbnNjcDsKKyAgICB1bmNoYXIgYiwgdCwgbCwgZmlyc3R0aW1lOworICAgIHVuY2hhciB0aGlzX2NtZCwgbmV4dF9jbWQ7CisgICAgdWxvbmcgZmxhZ3MgPSAwOworICAgIGludCBjbWRfaW5kZXg7CisKKyAgICBUUkFDRSgoImdkdGhfbmV4dCgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgaWYgKCFnZHRoX3BvbGxpbmcpIAorICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBoYS0+Y21kX2NudCA9IGhhLT5jbWRfb2Zmc19kcG1lbSA9IDA7CisgICAgdGhpc19jbWQgPSBmaXJzdHRpbWUgPSBUUlVFOworICAgIG5leHRfY21kID0gZ2R0aF9wb2xsaW5nID8gRkFMU0U6VFJVRTsKKyAgICBjbWRfaW5kZXggPSAwOworCisgICAgZm9yIChuc2NwID0gcHNjcCA9IGhhLT5yZXFfZmlyc3Q7IG5zY3A7IG5zY3AgPSAoU2NzaV9DbW5kICopbnNjcC0+U0NwLnB0cikgeworICAgICAgICBpZiAobnNjcCAhPSBwc2NwICYmIG5zY3AgIT0gKFNjc2lfQ21uZCAqKXBzY3AtPlNDcC5wdHIpCisgICAgICAgICAgICBwc2NwID0gKFNjc2lfQ21uZCAqKXBzY3AtPlNDcC5wdHI7CisgICAgICAgIGIgPSB2aXJ0X2N0ciA/IE5VTURBVEEobnNjcC0+ZGV2aWNlLT5ob3N0KS0+YnVzbnVtIDogbnNjcC0+ZGV2aWNlLT5jaGFubmVsOworICAgICAgICB0ID0gbnNjcC0+ZGV2aWNlLT5pZDsKKyAgICAgICAgbCA9IG5zY3AtPmRldmljZS0+bHVuOworICAgICAgICBpZiAobnNjcC0+U0NwLnRoaXNfcmVzaWR1YWwgPj0gREVGQVVMVF9QUkkpIHsKKyAgICAgICAgICAgIGlmICgoYiAhPSBoYS0+dmlydF9idXMgJiYgaGEtPnJhd1tCVVNfTDJQKGhhLGIpXS5sb2NrKSB8fAorICAgICAgICAgICAgICAgIChiID09IGhhLT52aXJ0X2J1cyAmJiB0IDwgTUFYX0hEUklWRVMgJiYgaGEtPmhkclt0XS5sb2NrKSkgCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlyc3R0aW1lKSB7CisgICAgICAgICAgICBpZiAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKSB7ICAgICAgICAvKiBjb250cm9sbGVyIGJ1c3kgPyAqLworICAgICAgICAgICAgICAgIFRSQUNFKCgiZ2R0aF9uZXh0KCkgY29udHJvbGxlciAlZCBidXN5ICFcbiIsaGFudW0pKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykgeworICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoZ2R0aF90ZXN0X2J1c3koaGFudW0pKQorICAgICAgICAgICAgICAgICAgICBnZHRoX2RlbGF5KDEpOworICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgZmlyc3R0aW1lID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnNjcC0+ZG9uZSAhPSBnZHRoX3Njc2lfZG9uZSB8fCBuc2NwLT5jbW5kWzBdICE9IDB4ZmYpIHsgICAgICAgIAorICAgICAgICBpZiAobnNjcC0+U0NwLnBoYXNlID09IC0xKSB7CisgICAgICAgICAgICBuc2NwLT5TQ3AucGhhc2UgPSBDQUNIRVNFUlZJQ0U7ICAgICAgICAgICAvKiBkZWZhdWx0OiBjYWNoZSBzdmMuICovIAorICAgICAgICAgICAgaWYgKG5zY3AtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZKSB7CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiVEVTVF9VTklUX1JFQURZIEJ1cyAlZCBJZCAlZCBMVU4gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgYiwgdCwgbCkpOworICAgICAgICAgICAgICAgIC8qIFRFU1RfVU5JVF9SRUFEWSAtPiBzZXQgc2NhbiBtb2RlICovCisgICAgICAgICAgICAgICAgaWYgKChoYS0+c2Nhbl9tb2RlICYgMHgwZikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSAwICYmIHQgPT0gMCAmJiBsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUgfD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoIlNjYW4gbW9kZTogMHgleFxuIiwgaGEtPnNjYW5fbW9kZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaGEtPnNjYW5fbW9kZSAmIDB4MGYpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gMCAmJiAoKHQgPT0gMCAmJiBsID09IDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHQgPT0gMSAmJiBsID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IEdEVF9TQ0FOX1NUQVJUOworICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+U0NwLnBoYXNlID0gKChoYS0+c2Nhbl9tb2RlICYgMHgxMCA/IDE6MCkgPDwgOCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTQ1NJUkFXU0VSVklDRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUgPSAweDEyOworICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgiU2NhbiBtb2RlOiAweCV4IChTQ0FOX1NUQVJUKVxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUgJj0gMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMigoIlNjYW4gbW9kZTogMHgleFxuIiwgaGEtPnNjYW5fbW9kZSkpOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGEtPnNjYW5fbW9kZSA9PSAweDEyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGhhLT5idXNfY250ICYmIHQgPT0gaGEtPnRpZF9jbnQtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+U0NwLnBoYXNlID0gU0NTSVJBV1NFUlZJQ0U7CisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gR0RUX1NDQU5fRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnNjYW5fbW9kZSAmPSAweDEwOworICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgiU2NhbiBtb2RlOiAweCV4IChTQ0FOX0VORClcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+c2Nhbl9tb2RlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYiA9PSBoYS0+dmlydF9idXMgJiYgbnNjcC0+Y21uZFswXSAhPSBJTlFVSVJZICYmCisgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFswXSAhPSBSRUFEX0NBUEFDSVRZICYmIG5zY3AtPmNtbmRbMF0gIT0gTU9ERV9TRU5TRSAmJgorICAgICAgICAgICAgICAgIChoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSAmIENMVVNURVJfRFJJVkUpKSB7CisgICAgICAgICAgICAgICAgLyogYWx3YXlzIEdEVF9DTFVTVF9JTkZPISAqLworICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBHRFRfQ0xVU1RfSU5GTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5zY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmICgobnNjcC0+U0NwLnBoYXNlICYgMHhmZikgPT0gQ0FDSEVTRVJWSUNFKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfZmlsbF9jYWNoZV9jbWQoaGFudW0sbnNjcCx0KSkpCisgICAgICAgICAgICAgICAgICAgIHRoaXNfY21kID0gRkFMU0U7CisgICAgICAgICAgICAgICAgbmV4dF9jbWQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG5zY3AtPlNDcC5waGFzZSAmIDB4ZmYpID09IFNDU0lSQVdTRVJWSUNFKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfZmlsbF9yYXdfY21kKGhhbnVtLG5zY3AsQlVTX0wyUChoYSxiKSkpKQorICAgICAgICAgICAgICAgICAgICB0aGlzX2NtZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIG5leHRfY21kID0gRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopbnNjcC0+c2Vuc2VfYnVmZmVyLDAsMTYpOworICAgICAgICAgICAgICAgIG5zY3AtPnNlbnNlX2J1ZmZlclswXSA9IDB4NzA7CisgICAgICAgICAgICAgICAgbnNjcC0+c2Vuc2VfYnVmZmVyWzJdID0gTk9UX1JFQURZOworICAgICAgICAgICAgICAgIG5zY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKENIRUNLX0NPTkRJVElPTiA8PCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoIW5zY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5oYXZlX2RhdGFfaW4rKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNjc2lfZG9uZShuc2NwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuc2NwLT5kb25lID09IGdkdGhfc2NzaV9kb25lICYmIG5zY3AtPmNtbmRbMF0gPT0gMHhmZikgeworICAgICAgICAgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfc3BlY2lhbF9jbWQoaGFudW0sbnNjcCkpKQorICAgICAgICAgICAgICAgIHRoaXNfY21kID0gRkFMU0U7CisgICAgICAgICAgICBuZXh0X2NtZCA9IEZBTFNFOworICAgICAgICB9IGVsc2UgaWYgKGIgIT0gaGEtPnZpcnRfYnVzKSB7CisgICAgICAgICAgICBpZiAoaGEtPnJhd1tCVVNfTDJQKGhhLGIpXS5pb19jbnRbdF0gPj0gR0RUSF9NQVhfUkFXIHx8CisgICAgICAgICAgICAgICAgIShjbWRfaW5kZXg9Z2R0aF9maWxsX3Jhd19jbWQoaGFudW0sbnNjcCxCVVNfTDJQKGhhLGIpKSkpIAorICAgICAgICAgICAgICAgIHRoaXNfY21kID0gRkFMU0U7CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIGhhLT5yYXdbQlVTX0wyUChoYSxiKV0uaW9fY250W3RdKys7CisgICAgICAgIH0gZWxzZSBpZiAodCA+PSBNQVhfSERSSVZFUyB8fCAhaGEtPmhkclt0XS5wcmVzZW50IHx8IGwgIT0gMCkgeworICAgICAgICAgICAgVFJBQ0UyKCgiQ29tbWFuZCAweCV4IHRvIGJ1cyAlZCBpZCAlZCBsdW4gJWQgLT4gSUdOT1JFXG4iLAorICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzBdLCBiLCB0LCBsKSk7CisgICAgICAgICAgICBuc2NwLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKyAgICAgICAgICAgIGlmICghbnNjcC0+U0NwLmhhdmVfZGF0YV9pbikKKyAgICAgICAgICAgICAgICBuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbnNjcC0+c2NzaV9kb25lKG5zY3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChuc2NwLT5jbW5kWzBdKSB7CisgICAgICAgICAgICAgIGNhc2UgVEVTVF9VTklUX1JFQURZOgorICAgICAgICAgICAgICBjYXNlIElOUVVJUlk6CisgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9TRU5TRToKKyAgICAgICAgICAgICAgY2FzZSBSRUFEX0NBUEFDSVRZOgorICAgICAgICAgICAgICBjYXNlIFZFUklGWToKKyAgICAgICAgICAgICAgY2FzZSBTVEFSVF9TVE9QOgorICAgICAgICAgICAgICBjYXNlIE1PREVfU0VOU0U6CisgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9BQ1RJT05fSU46CisgICAgICAgICAgICAgICAgVFJBQ0UoKCJjYWNoZSBjbWQgJXgvJXgvJXgvJXgvJXgvJXhcbiIsbnNjcC0+Y21uZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFsxXSxuc2NwLT5jbW5kWzJdLG5zY3AtPmNtbmRbM10sCisgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbNF0sbnNjcC0+Y21uZFs1XSkpOworICAgICAgICAgICAgICAgIGlmIChoYS0+aGRyW3RdLm1lZGlhX2NoYW5nZWQgJiYgbnNjcC0+Y21uZFswXSAhPSBJTlFVSVJZKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBVTklUX0FUVEVOVElPTiAqLworICAgICAgICAgICAgICAgICAgICBUUkFDRTIoKCJjbWQgMHgleCB0YXJnZXQgJWQ6IFVOSVRfQVRURU5USU9OXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzBdLCB0KSk7CisgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbdF0ubWVkaWFfY2hhbmdlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIqKW5zY3AtPnNlbnNlX2J1ZmZlciwwLDE2KTsKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+c2Vuc2VfYnVmZmVyWzBdID0gMHg3MDsKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+c2Vuc2VfYnVmZmVyWzJdID0gVU5JVF9BVFRFTlRJT047CisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKENIRUNLX0NPTkRJVElPTiA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKQorICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+U0NwLmhhdmVfZGF0YV9pbisrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5zY3NpX2RvbmUobnNjcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZHRoX2ludGVybmFsX2NhY2hlX2NtZChoYW51bSxuc2NwKSkKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+c2NzaV9kb25lKG5zY3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6CisgICAgICAgICAgICAgICAgVFJBQ0UoKCJjYWNoZSBjbWQgJXgvJXgvJXgvJXgvJXgvJXhcbiIsbnNjcC0+Y21uZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFsxXSxuc2NwLT5jbW5kWzJdLG5zY3AtPmNtbmRbM10sCisgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbNF0sbnNjcC0+Y21uZFs1XSkpOworICAgICAgICAgICAgICAgIGlmICggKG5zY3AtPmNtbmRbNF0mMSkgJiYgIShoYS0+aGRyW3RdLmRldnR5cGUmMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFKCgiUHJldmVudCByLiBub25yZW1vdi4gZHJpdmUtPmRvIG5vdGhpbmdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgbnNjcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworICAgICAgICAgICAgICAgICAgICBuc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5zY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNjc2lfZG9uZShuc2NwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzNdID0gKGhhLT5oZHJbdF0uZGV2dHlwZSYxKSA/IDE6MDsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UoKCJQcmV2ZW50L2FsbG93IHIuICVkIHJlbS4gZHJpdmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzRdLG5zY3AtPmNtbmRbM10pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfZmlsbF9jYWNoZV9jbWQoaGFudW0sbnNjcCx0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NtZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY2FzZSBSRVNFUlZFOgorICAgICAgICAgICAgICBjYXNlIFJFTEVBU0U6CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiY2FjaGUgY21kICVzXG4iLG5zY3AtPmNtbmRbMF0gPT0gUkVTRVJWRSA/CisgICAgICAgICAgICAgICAgICAgICAgICAiUkVTRVJWRSIgOiAiUkVMRUFTRSIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIShjbWRfaW5kZXg9Z2R0aF9maWxsX2NhY2hlX2NtZChoYW51bSxuc2NwLHQpKSkKKyAgICAgICAgICAgICAgICAgICAgdGhpc19jbWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY2FzZSBSRUFEXzY6CisgICAgICAgICAgICAgIGNhc2UgV1JJVEVfNjoKKyAgICAgICAgICAgICAgY2FzZSBSRUFEXzEwOgorICAgICAgICAgICAgICBjYXNlIFdSSVRFXzEwOgorICAgICAgICAgICAgICBjYXNlIFJFQURfMTY6CisgICAgICAgICAgICAgIGNhc2UgV1JJVEVfMTY6CisgICAgICAgICAgICAgICAgaWYgKGhhLT5oZHJbdF0ubWVkaWFfY2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gVU5JVF9BVFRFTlRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgiY21kIDB4JXggdGFyZ2V0ICVkOiBVTklUX0FUVEVOVElPTlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+Y21uZFswXSwgdCkpOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLm1lZGlhX2NoYW5nZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyKiluc2NwLT5zZW5zZV9idWZmZXIsMCwxNik7CisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNlbnNlX2J1ZmZlclswXSA9IDB4NzA7CisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNlbnNlX2J1ZmZlclsyXSA9IFVOSVRfQVRURU5USU9OOworICAgICAgICAgICAgICAgICAgICBuc2NwLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbnNjcC0+U0NwLmhhdmVfZGF0YV9pbikKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5oYXZlX2RhdGFfaW4rKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbnNjcC0+c2NzaV9kb25lKG5zY3ApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShjbWRfaW5kZXg9Z2R0aF9maWxsX2NhY2hlX2NtZChoYW51bSxuc2NwLHQpKSkKKyAgICAgICAgICAgICAgICAgICAgdGhpc19jbWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRSQUNFMigoImNhY2hlIGNtZCAleC8leC8leC8leC8leC8leCB1bmtub3duXG4iLG5zY3AtPmNtbmRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBuc2NwLT5jbW5kWzFdLG5zY3AtPmNtbmRbMl0sbnNjcC0+Y21uZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY3AtPmNtbmRbNF0sbnNjcC0+Y21uZFs1XSkpOworICAgICAgICAgICAgICAgIHByaW50aygiR0RULUhBICVkOiBVbmtub3duIFNDU0kgY29tbWFuZCAweCV4IHRvIGNhY2hlIHNlcnZpY2UgIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGFudW0sIG5zY3AtPmNtbmRbMF0pOworICAgICAgICAgICAgICAgIG5zY3AtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKyAgICAgICAgICAgICAgICBpZiAoIW5zY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgICAgICAgICAgICAgIG5zY3AtPlNDcC5oYXZlX2RhdGFfaW4rKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5zY3AtPnNjc2lfZG9uZShuc2NwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGhpc19jbWQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG5zY3AgPT0gaGEtPnJlcV9maXJzdCkKKyAgICAgICAgICAgIGhhLT5yZXFfZmlyc3QgPSBwc2NwID0gKFNjc2lfQ21uZCAqKW5zY3AtPlNDcC5wdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBzY3AtPlNDcC5wdHIgPSBuc2NwLT5TQ3AucHRyOworICAgICAgICBpZiAoIW5leHRfY21kKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGhhLT5jbWRfY250ID4gMCkgeworICAgICAgICBnZHRoX3JlbGVhc2VfZXZlbnQoaGFudW0pOworICAgIH0KKworICAgIGlmICghZ2R0aF9wb2xsaW5nKSAKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBpZiAoZ2R0aF9wb2xsaW5nICYmIGhhLT5jbWRfY250ID4gMCkgeworICAgICAgICBpZiAoIWdkdGhfd2FpdChoYW51bSxjbWRfaW5kZXgsUE9MTF9USU1FT1VUKSkKKyAgICAgICAgICAgIHByaW50aygiR0RULUhBICVkOiBDb21tYW5kICVkIHRpbWVkIG91dCAhXG4iLAorICAgICAgICAgICAgICAgICAgIGhhbnVtLGNtZF9pbmRleCk7CisgICAgfQorfQorICAgCitzdGF0aWMgdm9pZCBnZHRoX2NvcHlfaW50ZXJuYWxfZGF0YShpbnQgaGFudW0sU2NzaV9DbW5kICpzY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsdXNob3J0IGNvdW50KQoreworICAgIHVzaG9ydCBjcGNvdW50LGk7CisgICAgdXNob3J0IGNwc3VtLGNwbm93OworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2w7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIGNoYXIgKmFkZHJlc3M7CisKKyAgICBjcGNvdW50ID0gY291bnQ8PSh1c2hvcnQpc2NwLT5idWZmbGVuID8gY291bnQ6KHVzaG9ydClzY3AtPmJ1ZmZsZW47CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyAgICBpZiAoc2NwLT51c2Vfc2cpIHsKKyAgICAgICAgc2wgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKyAgICAgICAgZm9yIChpPTAsY3BzdW09MDsgaTxzY3AtPnVzZV9zZzsgKytpLCsrc2wpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgICAgIGNwbm93ID0gKHVzaG9ydClzbC0+bGVuZ3RoOworICAgICAgICAgICAgVFJBQ0UoKCJjb3B5X2ludGVybmFsKCkgbm93ICVkIHN1bSAlZCBjb3VudCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3Bub3csY3BzdW0sY3Bjb3VudCwodXNob3J0KXNjcC0+YnVmZmxlbikpOworICAgICAgICAgICAgaWYgKGNwc3VtK2Nwbm93ID4gY3Bjb3VudCkgCisgICAgICAgICAgICAgICAgY3Bub3cgPSBjcGNvdW50IC0gY3BzdW07CisgICAgICAgICAgICBjcHN1bSArPSBjcG5vdzsKKyAgICAgICAgICAgIGlmICghc2wtPnBhZ2UpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1IQSAlZDogaW52YWxpZCBzYy9ndCBlbGVtZW50IGluIGdkdGhfY29weV9pbnRlcm5hbF9kYXRhKClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhhbnVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkgICAgYWRkcmVzcyA9IGttYXBfYXRvbWljKHNsLT5wYWdlLCBLTV9CSU9fU1JDX0lSUSkgKyBzbC0+b2Zmc2V0OworICAgICAgICAgICAgbWVtY3B5KGFkZHJlc3MsYnVmZmVyLGNwbm93KTsKKwkgICAgZmx1c2hfZGNhY2hlX3BhZ2Uoc2wtPnBhZ2UpOworCSAgICBrdW5tYXBfYXRvbWljKGFkZHJlc3MsIEtNX0JJT19TUkNfSVJRKTsKKwkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgICAgICAgICAgaWYgKGNwc3VtID09IGNwY291bnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBidWZmZXIgKz0gY3Bub3c7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBUUkFDRSgoImNvcHlfaW50ZXJuYWwoKSBjb3VudCAlZFxuIixjcGNvdW50KSk7CisgICAgICAgIG1lbWNweSgoY2hhciopc2NwLT5yZXF1ZXN0X2J1ZmZlcixidWZmZXIsY3Bjb3VudCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdkdGhfaW50ZXJuYWxfY2FjaGVfY21kKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgdW5jaGFyIHQ7CisgICAgZ2R0aF9pbnFfZGF0YSBpbnE7CisgICAgZ2R0aF9yZGNhcF9kYXRhIHJkYzsKKyAgICBnZHRoX3NlbnNlX2RhdGEgc2Q7CisgICAgZ2R0aF9tb2RlcF9kYXRhIG1wZDsKKworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHQgID0gc2NwLT5kZXZpY2UtPmlkOworICAgIFRSQUNFKCgiZ2R0aF9pbnRlcm5hbF9jYWNoZV9jbWQoKSBjbWQgMHgleCBoZHJpdmUgJWRcbiIsCisgICAgICAgICAgIHNjcC0+Y21uZFswXSx0KSk7CisKKyAgICBzY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKyAgICBzY3AtPnNlbnNlX2J1ZmZlclswXSA9IDA7CisKKyAgICBzd2l0Y2ggKHNjcC0+Y21uZFswXSkgeworICAgICAgY2FzZSBURVNUX1VOSVRfUkVBRFk6CisgICAgICBjYXNlIFZFUklGWToKKyAgICAgIGNhc2UgU1RBUlRfU1RPUDoKKyAgICAgICAgVFJBQ0UyKCgiVGVzdC9WZXJpZnkvU3RhcnQgaGRyaXZlICVkXG4iLHQpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSU5RVUlSWToKKyAgICAgICAgVFJBQ0UyKCgiSW5xdWlyeSBoZHJpdmUgJWQgZGV2dHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICB0LGhhLT5oZHJbdF0uZGV2dHlwZSkpOworICAgICAgICBpbnEudHlwZV9xdWFsID0gKGhhLT5oZHJbdF0uZGV2dHlwZSY0KSA/IFRZUEVfUk9NOlRZUEVfRElTSzsKKyAgICAgICAgLyogeW91IGNhbiBoZXJlIHNldCBhbGwgZGlza3MgdG8gcmVtb3ZhYmxlLCBpZiB5b3Ugd2FudCB0byBkbworICAgICAgICAgICBhIGZsdXNoIHVzaW5nIHRoZSBBTExPV19NRURJVU1fUkVNT1ZBTCBjb21tYW5kICovCisgICAgICAgIGlucS5tb2RpZl9ybWIgPSAweDAwOworICAgICAgICBpZiAoKGhhLT5oZHJbdF0uZGV2dHlwZSAmIDEpIHx8CisgICAgICAgICAgICAoaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgJiBDTFVTVEVSX0RSSVZFKSkKKyAgICAgICAgICAgIGlucS5tb2RpZl9ybWIgPSAweDgwOworICAgICAgICBpbnEudmVyc2lvbiAgID0gMjsKKyAgICAgICAgaW5xLnJlc3BfYWVuYyA9IDI7CisgICAgICAgIGlucS5hZGRfbGVuZ3RoPSAzMjsKKyAgICAgICAgc3RyY3B5KGlucS52ZW5kb3IsaGEtPm9lbV9uYW1lKTsKKyAgICAgICAgc3ByaW50ZihpbnEucHJvZHVjdCwiSG9zdCBEcml2ZSAgIyUwMmQiLHQpOworICAgICAgICBzdHJjcHkoaW5xLnJldmlzaW9uLCIgICAiKTsKKyAgICAgICAgZ2R0aF9jb3B5X2ludGVybmFsX2RhdGEoaGFudW0sc2NwLChjaGFyKikmaW5xLHNpemVvZihnZHRoX2lucV9kYXRhKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJFUVVFU1RfU0VOU0U6CisgICAgICAgIFRSQUNFMigoIlJlcXVlc3Qgc2Vuc2UgaGRyaXZlICVkXG4iLHQpKTsKKyAgICAgICAgc2QuZXJyb3Jjb2RlID0gMHg3MDsKKyAgICAgICAgc2Quc2Vnbm8gICAgID0gMHgwMDsKKyAgICAgICAgc2Qua2V5ICAgICAgID0gTk9fU0VOU0U7CisgICAgICAgIHNkLmluZm8gICAgICA9IDA7CisgICAgICAgIHNkLmFkZF9sZW5ndGg9IDA7CisgICAgICAgIGdkdGhfY29weV9pbnRlcm5hbF9kYXRhKGhhbnVtLHNjcCwoY2hhciopJnNkLHNpemVvZihnZHRoX3NlbnNlX2RhdGEpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgTU9ERV9TRU5TRToKKyAgICAgICAgVFJBQ0UyKCgiTW9kZSBzZW5zZSBoZHJpdmUgJWRcbiIsdCkpOworICAgICAgICBtZW1zZXQoKGNoYXIqKSZtcGQsMCxzaXplb2YoZ2R0aF9tb2RlcF9kYXRhKSk7CisgICAgICAgIG1wZC5oZC5kYXRhX2xlbmd0aCA9IHNpemVvZihnZHRoX21vZGVwX2RhdGEpOworICAgICAgICBtcGQuaGQuZGV2X3BhciAgICAgPSAoaGEtPmhkclt0XS5kZXZ0eXBlJjIpID8gMHg4MDowOworICAgICAgICBtcGQuaGQuYmRfbGVuZ3RoICAgPSBzaXplb2YobXBkLmJkKTsKKyAgICAgICAgbXBkLmJkLmJsb2NrX2xlbmd0aFswXSA9IChTRUNUT1JfU0laRSAmIDB4MDBmZjAwMDApID4+IDE2OworICAgICAgICBtcGQuYmQuYmxvY2tfbGVuZ3RoWzFdID0gKFNFQ1RPUl9TSVpFICYgMHgwMDAwZmYwMCkgPj4gODsKKyAgICAgICAgbXBkLmJkLmJsb2NrX2xlbmd0aFsyXSA9IChTRUNUT1JfU0laRSAmIDB4MDAwMDAwZmYpOworICAgICAgICBnZHRoX2NvcHlfaW50ZXJuYWxfZGF0YShoYW51bSxzY3AsKGNoYXIqKSZtcGQsc2l6ZW9mKGdkdGhfbW9kZXBfZGF0YSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBSRUFEX0NBUEFDSVRZOgorICAgICAgICBUUkFDRTIoKCJSZWFkIGNhcGFjaXR5IGhkcml2ZSAlZFxuIix0KSk7CisgICAgICAgIGlmIChoYS0+aGRyW3RdLnNpemUgPiAodWxvbmc2NCkweGZmZmZmZmZmKQorICAgICAgICAgICAgcmRjLmxhc3RfYmxvY2tfbm8gPSAweGZmZmZmZmZmOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZGMubGFzdF9ibG9ja19ubyA9IGNwdV90b19iZTMyKGhhLT5oZHJbdF0uc2l6ZS0xKTsKKyAgICAgICAgcmRjLmJsb2NrX2xlbmd0aCAgPSBjcHVfdG9fYmUzMihTRUNUT1JfU0laRSk7CisgICAgICAgIGdkdGhfY29weV9pbnRlcm5hbF9kYXRhKGhhbnVtLHNjcCwoY2hhciopJnJkYyxzaXplb2YoZ2R0aF9yZGNhcF9kYXRhKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFNFUlZJQ0VfQUNUSU9OX0lOOgorICAgICAgICBpZiAoKHNjcC0+Y21uZFsxXSAmIDB4MWYpID09IFNBSV9SRUFEX0NBUEFDSVRZXzE2ICYmCisgICAgICAgICAgICAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpKSB7CisgICAgICAgICAgICBnZHRoX3JkY2FwMTZfZGF0YSByZGMxNjsKKworICAgICAgICAgICAgVFJBQ0UyKCgiUmVhZCBjYXBhY2l0eSAoMTYpIGhkcml2ZSAlZFxuIix0KSk7CisgICAgICAgICAgICByZGMxNi5sYXN0X2Jsb2NrX25vID0gY3B1X3RvX2JlNjQoaGEtPmhkclt0XS5zaXplLTEpOworICAgICAgICAgICAgcmRjMTYuYmxvY2tfbGVuZ3RoICA9IGNwdV90b19iZTMyKFNFQ1RPUl9TSVpFKTsKKyAgICAgICAgICAgIGdkdGhfY29weV9pbnRlcm5hbF9kYXRhKGhhbnVtLHNjcCwoY2hhciopJnJkYzE2LHNpemVvZihnZHRoX3JkY2FwMTZfZGF0YSkpOworICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBUUkFDRTIoKCJJbnRlcm5hbCBjYWNoZSBjbWQgMHgleCB1bmtub3duXG4iLHNjcC0+Y21uZFswXSkpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXNjcC0+U0NwLmhhdmVfZGF0YV9pbikKKyAgICAgICAgc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgZWxzZSAKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKyAgICAKK3N0YXRpYyBpbnQgZ2R0aF9maWxsX2NhY2hlX2NtZChpbnQgaGFudW0sU2NzaV9DbW5kICpzY3AsdXNob3J0IGhkcml2ZSkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgZ2R0aF9jbWRfc3RyICpjbWRwOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2w7CisgICAgdWxvbmczMiBjbnQsIGJsb2NrY250OworICAgIHVsb25nNjQgbm8sIGJsb2Nrbm87CisgICAgZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisgICAgaW50IGksIGNtZF9pbmRleCwgcmVhZF93cml0ZSwgc2djbnQsIG1vZGU2NDsKKyAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKKyAgICB1bG9uZyBvZmZzZXQ7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBjbWRwID0gaGEtPnBjY2I7CisgICAgVFJBQ0UoKCJnZHRoX2ZpbGxfY2FjaGVfY21kKCkgY21kIDB4JXggY21kc2l6ZSAlZCBoZHJpdmUgJWRcbiIsCisgICAgICAgICAgICAgICAgIHNjcC0+Y21uZFswXSxzY3AtPmNtZF9sZW4saGRyaXZlKSk7CisKKyAgICBpZiAoaGEtPnR5cGU9PUdEVF9FSVNBICYmIGhhLT5jbWRfY250PjApIAorICAgICAgICByZXR1cm4gMDsKKworICAgIG1vZGU2NCA9IChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgPyBUUlVFIDogRkFMU0U7CisgICAgLyogdGVzdCBmb3IgUkVBRF8xNiwgV1JJVEVfMTYgaWYgIW1vZGU2NCA/IC0tLQorICAgICAgIG5vdCByZXF1aXJlZCwgc2hvdWxkIG5vdCBvY2N1ciBkdWUgdG8gZXJyb3IgcmV0dXJuIG9uIAorICAgICAgIFJFQURfQ0FQQUNJVFlfMTYgKi8KKworICAgIGNtZHAtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgY21kcC0+UmVxdWVzdEJ1ZmZlciA9IHNjcDsKKyAgICAvKiBzZWFyY2ggZnJlZSBjb21tYW5kIGluZGV4ICovCisgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfZ2V0X2NtZF9pbmRleChoYW51bSkpKSB7CisgICAgICAgIFRSQUNFKCgiR0RUOiBObyBmcmVlIGNvbW1hbmQgaW5kZXggZm91bmRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIGlmIGl0J3MgdGhlIGZpcnN0IGNvbW1hbmQsIHNldCBjb21tYW5kIHNlbWFwaG9yZSAqLworICAgIGlmIChoYS0+Y21kX2NudCA9PSAwKQorICAgICAgICBnZHRoX3NldF9zZW1hMChoYW51bSk7CisKKyAgICAvKiBmaWxsIGNvbW1hbmQgKi8KKyAgICByZWFkX3dyaXRlID0gMDsKKyAgICBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IC0xKSAKKyAgICAgICAgY21kcC0+T3BDb2RlID0gc2NwLT5TQ3Auc2VudF9jb21tYW5kOyAgIC8qIHNwZWNpYWwgY2FjaGUgY21kLiAqLworICAgIGVsc2UgaWYgKHNjcC0+Y21uZFswXSA9PSBSRVNFUlZFKSAKKyAgICAgICAgY21kcC0+T3BDb2RlID0gR0RUX1JFU0VSVkVfRFJWOworICAgIGVsc2UgaWYgKHNjcC0+Y21uZFswXSA9PSBSRUxFQVNFKQorICAgICAgICBjbWRwLT5PcENvZGUgPSBHRFRfUkVMRUFTRV9EUlY7CisgICAgZWxzZSBpZiAoc2NwLT5jbW5kWzBdID09IEFMTE9XX01FRElVTV9SRU1PVkFMKSB7CisgICAgICAgIGlmIChzY3AtPmNtbmRbNF0gJiAxKSAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50ID8gKi8KKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSA9IEdEVF9NT1VOVDsKKyAgICAgICAgZWxzZSBpZiAoc2NwLT5jbW5kWzNdICYgMSkgICAgICAgICAgICAgIC8qIHJlbW92YWJsZSBkcml2ZSA/ICovCisgICAgICAgICAgICBjbWRwLT5PcENvZGUgPSBHRFRfVU5NT1VOVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY21kcC0+T3BDb2RlID0gR0RUX0ZMVVNIOworICAgIH0gZWxzZSBpZiAoc2NwLT5jbW5kWzBdID09IFdSSVRFXzYgfHwgc2NwLT5jbW5kWzBdID09IFdSSVRFXzEwIHx8CisgICAgICAgICAgICAgICBzY3AtPmNtbmRbMF0gPT0gV1JJVEVfMTIgfHwgc2NwLT5jbW5kWzBdID09IFdSSVRFXzE2CisgICAgKSB7CisgICAgICAgIHJlYWRfd3JpdGUgPSAxOworICAgICAgICBpZiAoZ2R0aF93cml0ZV90aHJvdWdoIHx8ICgoaGEtPmhkcltoZHJpdmVdLnJ3X2F0dHJpYnMgJiAxKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhLT5jYWNoZV9mZWF0ICYgR0RUX1dSX1RIUk9VR0gpKSkKKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSA9IEdEVF9XUklURV9USFI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSA9IEdEVF9XUklURTsKKyAgICB9IGVsc2UgeworICAgICAgICByZWFkX3dyaXRlID0gMjsKKyAgICAgICAgY21kcC0+T3BDb2RlID0gR0RUX1JFQUQ7CisgICAgfQorCisgICAgY21kcC0+Qm9hcmROb2RlID0gTE9DQUxCT0FSRDsKKyAgICBpZiAobW9kZTY0KSB7CisgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5EZXZpY2VObyA9IGhkcml2ZTsKKyAgICAgICAgY21kcC0+dS5jYWNoZTY0LkJsb2NrTm8gID0gMTsKKyAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2NhbnogID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBjbWRwLT51LmNhY2hlLkRldmljZU5vID0gaGRyaXZlOworICAgICAgICBjbWRwLT51LmNhY2hlLkJsb2NrTm8gID0gMTsKKyAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19jYW56ICA9IDA7CisgICAgfQorCisgICAgaWYgKHJlYWRfd3JpdGUpIHsKKyAgICAgICAgaWYgKHNjcC0+Y21kX2xlbiA9PSAxNikgeworICAgICAgICAgICAgbWVtY3B5KCZubywgJnNjcC0+Y21uZFsyXSwgc2l6ZW9mKHVsb25nNjQpKTsKKyAgICAgICAgICAgIGJsb2Nrbm8gPSBiZTY0X3RvX2NwdShubyk7CisgICAgICAgICAgICBtZW1jcHkoJmNudCwgJnNjcC0+Y21uZFsxMF0sIHNpemVvZih1bG9uZzMyKSk7CisgICAgICAgICAgICBibG9ja2NudCA9IGJlMzJfdG9fY3B1KGNudCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2NwLT5jbWRfbGVuID09IDEwKSB7CisgICAgICAgICAgICBtZW1jcHkoJm5vLCAmc2NwLT5jbW5kWzJdLCBzaXplb2YodWxvbmczMikpOworICAgICAgICAgICAgYmxvY2tubyA9IGJlMzJfdG9fY3B1KG5vKTsKKyAgICAgICAgICAgIG1lbWNweSgmY250LCAmc2NwLT5jbW5kWzddLCBzaXplb2YodXNob3J0KSk7CisgICAgICAgICAgICBibG9ja2NudCA9IGJlMTZfdG9fY3B1KGNudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoJm5vLCAmc2NwLT5jbW5kWzBdLCBzaXplb2YodWxvbmczMikpOworICAgICAgICAgICAgYmxvY2tubyA9IGJlMzJfdG9fY3B1KG5vKSAmIDB4MDAxZmZmZmZVTDsKKyAgICAgICAgICAgIGJsb2NrY250PSBzY3AtPmNtbmRbNF09PTAgPyAweDEwMCA6IHNjcC0+Y21uZFs0XTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZTY0KSB7CisgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuQmxvY2tObyA9IGJsb2Nrbm87CisgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuQmxvY2tDbnQgPSBibG9ja2NudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuQmxvY2tObyA9ICh1bG9uZzMyKWJsb2Nrbm87CisgICAgICAgICAgICBjbWRwLT51LmNhY2hlLkJsb2NrQ250ID0gYmxvY2tjbnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2NwLT51c2Vfc2cpIHsKKyAgICAgICAgICAgIHNsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgICAgICAgICBzZ2NudCA9IHNjcC0+dXNlX3NnOworICAgICAgICAgICAgc2NwLT5TQ3AuU3RhdHVzID0gR0RUSF9NQVBfU0c7CisgICAgICAgICAgICBzY3AtPlNDcC5NZXNzYWdlID0gKHJlYWRfd3JpdGUgPT0gMSA/IAorICAgICAgICAgICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UgOiBQQ0lfRE1BX0ZST01ERVZJQ0UpOyAgIAorICAgICAgICAgICAgc2djbnQgPSBwY2lfbWFwX3NnKGhhLT5wZGV2LHNsLHNjcC0+dXNlX3NnLHNjcC0+U0NwLk1lc3NhZ2UpOworICAgICAgICAgICAgaWYgKG1vZGU2NCkgeworICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5EZXN0QWRkcj0gKHVsb25nNjQpLTE7CisgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2NhbnogPSBzZ2NudDsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzZ2NudDsgKytpLCsrc2wpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2xzdFtpXS5zZ19wdHIgPSBzZ19kbWFfYWRkcmVzcyhzbCk7CisjaWZkZWYgR0RUSF9ETUFfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICBpZiAoY21kcC0+dS5jYWNoZTY0LnNnX2xzdFtpXS5zZ19wdHIgPiAodWxvbmc2NCkweGZmZmZmZmZmKQorICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmRtYTY0X2NudCsrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+ZG1hMzJfY250Kys7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2xzdFtpXS5zZ19sZW4gPSBzZ19kbWFfbGVuKHNsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuRGVzdEFkZHI9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19jYW56ID0gc2djbnQ7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8c2djbnQ7ICsraSwrK3NsKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGUuc2dfbHN0W2ldLnNnX3B0ciA9IHNnX2RtYV9hZGRyZXNzKHNsKTsKKyNpZmRlZiBHRFRIX0RNQV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIGhhLT5kbWEzMl9jbnQrKzsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLnNnX2xzdFtpXS5zZ19sZW4gPSBzZ19kbWFfbGVuKHNsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgIGlmIChtYXhfc2cgPCAodWxvbmczMilzZ2NudCkgeworICAgICAgICAgICAgICAgIG1heF9zZyA9ICh1bG9uZzMyKXNnY250OworICAgICAgICAgICAgICAgIFRSQUNFMygoIkdEVDogbWF4X3NnID0gJWRcbiIsbWF4X3NnKSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NwLT5TQ3AuU3RhdHVzID0gR0RUSF9NQVBfU0lOR0xFOworICAgICAgICAgICAgc2NwLT5TQ3AuTWVzc2FnZSA9IChyZWFkX3dyaXRlID09IDEgPyAKKyAgICAgICAgICAgICAgICBQQ0lfRE1BX1RPREVWSUNFIDogUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgICAgICAgICAgIHBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2NwLT5yZXF1ZXN0X2J1ZmZlcik7CisgICAgICAgICAgICBvZmZzZXQgPSAodWxvbmcpc2NwLT5yZXF1ZXN0X2J1ZmZlciAmIH5QQUdFX01BU0s7CisgICAgICAgICAgICBwaHlzX2FkZHIgPSBwY2lfbWFwX3BhZ2UoaGEtPnBkZXYscGFnZSxvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sc2NwLT5TQ3AuTWVzc2FnZSk7CisgICAgICAgICAgICBzY3AtPlNDcC5kbWFfaGFuZGxlID0gcGh5c19hZGRyOworICAgICAgICAgICAgaWYgKG1vZGU2NCkgeworICAgICAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5EZXN0QWRkciA9ICh1bG9uZzY0KS0xOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuc2dfY2FueiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19sc3RbMF0uc2dfcHRyID0gcGh5c19hZGRyOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuc2dfbHN0WzBdLnNnX2xlbiA9IHNjcC0+cmVxdWVzdF9idWZmbGVuOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlNjQuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LkRlc3RBZGRyICA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2Nhbno9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBTQ0FUVEVSX0dBVEhFUikgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLkRlc3RBZGRyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19jYW56ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19sc3RbMF0uc2dfcHRyID0gcGh5c19hZGRyOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLnNnX2xzdFswXS5zZ19sZW4gPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19sc3RbMV0uc2dfbGVuID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLkRlc3RBZGRyICA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5zZ19jYW56PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBldmFsdWF0ZSBjb21tYW5kIHNpemUsIGNoZWNrIHNwYWNlICovCisgICAgaWYgKG1vZGU2NCkgeworICAgICAgICBUUkFDRSgoImNhY2hlIGNtZDogYWRkci4gJXggc2dhbnogJXggc2dwdHIwICV4IHNnbGVuMCAleFxuIiwKKyAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5EZXN0QWRkcixjbWRwLT51LmNhY2hlNjQuc2dfY2FueiwKKyAgICAgICAgICAgICAgIGNtZHAtPnUuY2FjaGU2NC5zZ19sc3RbMF0uc2dfcHRyLAorICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZTY0LnNnX2xzdFswXS5zZ19sZW4pKTsKKyAgICAgICAgVFJBQ0UoKCJjYWNoZSBjbWQ6IGNtZCAlZCBibG9ja25vLiAlZCwgYmxvY2tjbnQgJWRcbiIsCisgICAgICAgICAgICAgICBjbWRwLT5PcENvZGUsY21kcC0+dS5jYWNoZTY0LkJsb2NrTm8sY21kcC0+dS5jYWNoZTY0LkJsb2NrQ250KSk7CisgICAgICAgIGhhLT5jbWRfbGVuID0gR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LmNhY2hlNjQuc2dfbHN0KSArCisgICAgICAgICAgICAodXNob3J0KWNtZHAtPnUuY2FjaGU2NC5zZ19jYW56ICogc2l6ZW9mKGdkdGhfc2c2NF9zdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRSQUNFKCgiY2FjaGUgY21kOiBhZGRyLiAleCBzZ2FueiAleCBzZ3B0cjAgJXggc2dsZW4wICV4XG4iLAorICAgICAgICAgICAgICAgY21kcC0+dS5jYWNoZS5EZXN0QWRkcixjbWRwLT51LmNhY2hlLnNnX2NhbnosCisgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLnNnX2xzdFswXS5zZ19wdHIsCisgICAgICAgICAgICAgICBjbWRwLT51LmNhY2hlLnNnX2xzdFswXS5zZ19sZW4pKTsKKyAgICAgICAgVFJBQ0UoKCJjYWNoZSBjbWQ6IGNtZCAlZCBibG9ja25vLiAlZCwgYmxvY2tjbnQgJWRcbiIsCisgICAgICAgICAgICAgICBjbWRwLT5PcENvZGUsY21kcC0+dS5jYWNoZS5CbG9ja05vLGNtZHAtPnUuY2FjaGUuQmxvY2tDbnQpKTsKKyAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUuY2FjaGUuc2dfbHN0KSArCisgICAgICAgICAgICAodXNob3J0KWNtZHAtPnUuY2FjaGUuc2dfY2FueiAqIHNpemVvZihnZHRoX3NnX3N0cik7CisgICAgfQorICAgIGlmIChoYS0+Y21kX2xlbiAmIDMpCisgICAgICAgIGhhLT5jbWRfbGVuICs9ICg0IC0gKGhhLT5jbWRfbGVuICYgMykpOworCisgICAgaWYgKGhhLT5jbWRfY250ID4gMCkgeworICAgICAgICBpZiAoKGhhLT5jbWRfb2Zmc19kcG1lbSArIGhhLT5jbWRfbGVuICsgRFBNRU1fQ09NTUFORF9PRkZTRVQpID4KKyAgICAgICAgICAgIGhhLT5pY19hbGxfc2l6ZSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9maWxsX2NhY2hlKCkgRFBNRU0gb3ZlcmZsb3dcbiIpKTsKKyAgICAgICAgICAgIGhhLT5jbWRfdGFiW2NtZF9pbmRleC0yXS5jbW5kID0gVU5VU0VEX0NNTkQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgY29tbWFuZCAqLworICAgIGdkdGhfY29weV9jb21tYW5kKGhhbnVtKTsKKyAgICByZXR1cm4gY21kX2luZGV4OworfQorCitzdGF0aWMgaW50IGdkdGhfZmlsbF9yYXdfY21kKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCx1bmNoYXIgYikKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgZ2R0aF9jbWRfc3RyICpjbWRwOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2w7CisgICAgdXNob3J0IGk7CisgICAgZG1hX2FkZHJfdCBwaHlzX2FkZHIsIHNlbnNlX3BhZGRyOworICAgIGludCBjbWRfaW5kZXgsIHNnY250LCBtb2RlNjQ7CisgICAgdW5jaGFyIHQsbDsKKyAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKKyAgICB1bG9uZyBvZmZzZXQ7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICB0ID0gc2NwLT5kZXZpY2UtPmlkOworICAgIGwgPSBzY3AtPmRldmljZS0+bHVuOworICAgIGNtZHAgPSBoYS0+cGNjYjsKKyAgICBUUkFDRSgoImdkdGhfZmlsbF9yYXdfY21kKCkgY21kIDB4JXggYnVzICVkIElEICVkIExVTiAlZFxuIiwKKyAgICAgICAgICAgc2NwLT5jbW5kWzBdLGIsdCxsKSk7CisKKyAgICBpZiAoaGEtPnR5cGU9PUdEVF9FSVNBICYmIGhhLT5jbWRfY250PjApIAorICAgICAgICByZXR1cm4gMDsKKworICAgIG1vZGU2NCA9IChoYS0+cmF3X2ZlYXQgJiBHRFRfNjRCSVQpID8gVFJVRSA6IEZBTFNFOworCisgICAgY21kcC0+U2VydmljZSA9IFNDU0lSQVdTRVJWSUNFOworICAgIGNtZHAtPlJlcXVlc3RCdWZmZXIgPSBzY3A7CisgICAgLyogc2VhcmNoIGZyZWUgY29tbWFuZCBpbmRleCAqLworICAgIGlmICghKGNtZF9pbmRleD1nZHRoX2dldF9jbWRfaW5kZXgoaGFudW0pKSkgeworICAgICAgICBUUkFDRSgoIkdEVDogTm8gZnJlZSBjb21tYW5kIGluZGV4IGZvdW5kXG4iKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBpZiBpdCdzIHRoZSBmaXJzdCBjb21tYW5kLCBzZXQgY29tbWFuZCBzZW1hcGhvcmUgKi8KKyAgICBpZiAoaGEtPmNtZF9jbnQgPT0gMCkKKyAgICAgICAgZ2R0aF9zZXRfc2VtYTAoaGFudW0pOworCisgICAgLyogZmlsbCBjb21tYW5kICovICAKKyAgICBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IC0xKSB7CisgICAgICAgIGNtZHAtPk9wQ29kZSAgICAgICAgICAgPSBzY3AtPlNDcC5zZW50X2NvbW1hbmQ7IC8qIHNwZWNpYWwgcmF3IGNtZC4gKi8KKyAgICAgICAgY21kcC0+Qm9hcmROb2RlICAgICAgICA9IExPQ0FMQk9BUkQ7CisgICAgICAgIGlmIChtb2RlNjQpIHsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuZGlyZWN0aW9uID0gKHNjcC0+U0NwLnBoYXNlID4+IDgpOworICAgICAgICAgICAgVFJBQ0UyKCgic3BlY2lhbCByYXcgY21kIDB4JXggcGFyYW0gMHgleFxuIiwgCisgICAgICAgICAgICAgICAgICAgIGNtZHAtPk9wQ29kZSwgY21kcC0+dS5yYXc2NC5kaXJlY3Rpb24pKTsKKyAgICAgICAgICAgIC8qIGV2YWx1YXRlIGNvbW1hbmQgc2l6ZSAqLworICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUucmF3NjQuc2dfbHN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LmRpcmVjdGlvbiAgPSAoc2NwLT5TQ3AucGhhc2UgPj4gOCk7CisgICAgICAgICAgICBUUkFDRTIoKCJzcGVjaWFsIHJhdyBjbWQgMHgleCBwYXJhbSAweCV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+T3BDb2RlLCBjbWRwLT51LnJhdy5kaXJlY3Rpb24pKTsKKyAgICAgICAgICAgIC8qIGV2YWx1YXRlIGNvbW1hbmQgc2l6ZSAqLworICAgICAgICAgICAgaGEtPmNtZF9sZW4gPSBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUucmF3LnNnX2xzdCk7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIHBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2NwLT5zZW5zZV9idWZmZXIpOworICAgICAgICBvZmZzZXQgPSAodWxvbmcpc2NwLT5zZW5zZV9idWZmZXIgJiB+UEFHRV9NQVNLOworICAgICAgICBzZW5zZV9wYWRkciA9IHBjaV9tYXBfcGFnZShoYS0+cGRldixwYWdlLG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgICAgICAgc2NwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSgodWxvbmczMilzZW5zZV9wYWRkcik7CisgICAgICAgIC8qIGhpZ2ggcGFydCwgaWYgNjRiaXQgKi8KKyAgICAgICAgc2NwLT5ob3N0X3NjcmliYmxlID0gKGNoYXIgKikodWxvbmczMikoKHVsb25nNjQpc2Vuc2VfcGFkZHIgPj4gMzIpOworICAgICAgICBjbWRwLT5PcENvZGUgICAgICAgICAgID0gR0RUX1dSSVRFOyAgICAgICAgICAgICAvKiBhbHdheXMgKi8KKyAgICAgICAgY21kcC0+Qm9hcmROb2RlICAgICAgICA9IExPQ0FMQk9BUkQ7CisgICAgICAgIGlmIChtb2RlNjQpIHsgCisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnJlc2VydmVkICAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5tZGlzY190aW1lID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQubWNvbl90aW1lICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LmNsZW4gICAgICAgPSBzY3AtPmNtZF9sZW47CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnRhcmdldCAgICAgPSB0OworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5sdW4gICAgICAgID0gbDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuYnVzICAgICAgICA9IGI7CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnByaW9yaXR5ICAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZGxlbiAgICAgID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNlbnNlX2xlbiAgPSAxNjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2Vuc2VfZGF0YSA9IHNlbnNlX3BhZGRyOworICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5kaXJlY3Rpb24gID0gCisgICAgICAgICAgICAgICAgZ2R0aF9kaXJlY3Rpb25fdGFiW3NjcC0+Y21uZFswXV09PURPVSA/IEdEVEhfREFUQV9PVVQ6R0RUSF9EQVRBX0lOOworICAgICAgICAgICAgbWVtY3B5KGNtZHAtPnUucmF3NjQuY21kLHNjcC0+Y21uZCwxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5yZXNlcnZlZCAgID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3Lm1kaXNjX3RpbWUgPSAwOworICAgICAgICAgICAgY21kcC0+dS5yYXcubWNvbl90aW1lICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5jbGVuICAgICAgID0gc2NwLT5jbWRfbGVuOworICAgICAgICAgICAgY21kcC0+dS5yYXcudGFyZ2V0ICAgICA9IHQ7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5sdW4gICAgICAgID0gbDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LmJ1cyAgICAgICAgPSBiOworICAgICAgICAgICAgY21kcC0+dS5yYXcucHJpb3JpdHkgICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnJhdy5saW5rX3AgICAgID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LnNkbGVuICAgICAgPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LnNlbnNlX2xlbiAgPSAxNjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LnNlbnNlX2RhdGEgPSBzZW5zZV9wYWRkcjsKKyAgICAgICAgICAgIGNtZHAtPnUucmF3LmRpcmVjdGlvbiAgPSAKKyAgICAgICAgICAgICAgICBnZHRoX2RpcmVjdGlvbl90YWJbc2NwLT5jbW5kWzBdXT09RE9VID8gR0RUSF9EQVRBX09VVDpHRFRIX0RBVEFfSU47CisgICAgICAgICAgICBtZW1jcHkoY21kcC0+dS5yYXcuY21kLHNjcC0+Y21uZCwxMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2NwLT51c2Vfc2cpIHsKKyAgICAgICAgICAgIHNsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisgICAgICAgICAgICBzZ2NudCA9IHNjcC0+dXNlX3NnOworICAgICAgICAgICAgc2NwLT5TQ3AuU3RhdHVzID0gR0RUSF9NQVBfU0c7CisgICAgICAgICAgICBzY3AtPlNDcC5NZXNzYWdlID0gUENJX0RNQV9CSURJUkVDVElPTkFMOyAKKyAgICAgICAgICAgIHNnY250ID0gcGNpX21hcF9zZyhoYS0+cGRldixzbCxzY3AtPnVzZV9zZyxzY3AtPlNDcC5NZXNzYWdlKTsKKyAgICAgICAgICAgIGlmIChtb2RlNjQpIHsKKyAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNkYXRhID0gKHVsb25nNjQpLTE7CisgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19yYW56ID0gc2djbnQ7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8c2djbnQ7ICsraSwrK3NsKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfbHN0W2ldLnNnX3B0ciA9IHNnX2RtYV9hZGRyZXNzKHNsKTsKKyNpZmRlZiBHRFRIX0RNQV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIGlmIChjbWRwLT51LnJhdzY0LnNnX2xzdFtpXS5zZ19wdHIgPiAodWxvbmc2NCkweGZmZmZmZmZmKQorICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmRtYTY0X2NudCsrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+ZG1hMzJfY250Kys7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19sc3RbaV0uc2dfbGVuID0gc2dfZG1hX2xlbihzbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZGF0YSA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2dfcmFueiA9IHNnY250OworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHNnY250OyArK2ksKytzbCkgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19sc3RbaV0uc2dfcHRyID0gc2dfZG1hX2FkZHJlc3Moc2wpOworI2lmZGVmIEdEVEhfRE1BX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgaGEtPmRtYTMyX2NudCsrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX2xzdFtpXS5zZ19sZW4gPSBzZ19kbWFfbGVuKHNsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgIGlmIChtYXhfc2cgPCBzZ2NudCkgeworICAgICAgICAgICAgICAgIG1heF9zZyA9IHNnY250OworICAgICAgICAgICAgICAgIFRSQUNFMygoIkdEVDogbWF4X3NnID0gJWRcbiIsc2djbnQpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY3AtPlNDcC5TdGF0dXMgPSBHRFRIX01BUF9TSU5HTEU7CisgICAgICAgICAgICBzY3AtPlNDcC5NZXNzYWdlID0gUENJX0RNQV9CSURJUkVDVElPTkFMOyAKKyAgICAgICAgICAgIHBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2NwLT5yZXF1ZXN0X2J1ZmZlcik7CisgICAgICAgICAgICBvZmZzZXQgPSAodWxvbmcpc2NwLT5yZXF1ZXN0X2J1ZmZlciAmIH5QQUdFX01BU0s7CisgICAgICAgICAgICBwaHlzX2FkZHIgPSBwY2lfbWFwX3BhZ2UoaGEtPnBkZXYscGFnZSxvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sc2NwLT5TQ3AuTWVzc2FnZSk7CisgICAgICAgICAgICBzY3AtPlNDcC5kbWFfaGFuZGxlID0gcGh5c19hZGRyOworCisgICAgICAgICAgICBpZiAobW9kZTY0KSB7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2RhdGEgID0gKHVsb25nNjQpLTE7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfcmFuej0gMTsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19sc3RbMF0uc2dfcHRyID0gcGh5c19hZGRyOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNnX2xzdFswXS5zZ19sZW4gPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19sc3RbMV0uc2dfbGVuID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdzY0LnNkYXRhICA9IHBoeXNfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19yYW56PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNkYXRhICA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX3Jhbno9IDE7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX2xzdFswXS5zZ19wdHIgPSBwaHlzX2FkZHI7CisgICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX2xzdFswXS5zZ19sZW4gPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2RhdGEgID0gcGh5c19hZGRyOworICAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZ19yYW56PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZTY0KSB7CisgICAgICAgICAgICBUUkFDRSgoInJhdyBjbWQ6IGFkZHIuICV4IHNnYW56ICV4IHNncHRyMCAleCBzZ2xlbjAgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZGF0YSxjbWRwLT51LnJhdzY0LnNnX3JhbnosCisgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXc2NC5zZ19sc3RbMF0uc2dfcHRyLAorICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3NjQuc2dfbHN0WzBdLnNnX2xlbikpOworICAgICAgICAgICAgLyogZXZhbHVhdGUgY29tbWFuZCBzaXplICovCisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5yYXc2NC5zZ19sc3QpICsKKyAgICAgICAgICAgICAgICAodXNob3J0KWNtZHAtPnUucmF3NjQuc2dfcmFueiAqIHNpemVvZihnZHRoX3NnNjRfc3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRSQUNFKCgicmF3IGNtZDogYWRkci4gJXggc2dhbnogJXggc2dwdHIwICV4IHNnbGVuMCAleFxuIiwKKyAgICAgICAgICAgICAgICAgICBjbWRwLT51LnJhdy5zZGF0YSxjbWRwLT51LnJhdy5zZ19yYW56LAorICAgICAgICAgICAgICAgICAgIGNtZHAtPnUucmF3LnNnX2xzdFswXS5zZ19wdHIsCisgICAgICAgICAgICAgICAgICAgY21kcC0+dS5yYXcuc2dfbHN0WzBdLnNnX2xlbikpOworICAgICAgICAgICAgLyogZXZhbHVhdGUgY29tbWFuZCBzaXplICovCisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5yYXcuc2dfbHN0KSArCisgICAgICAgICAgICAgICAgKHVzaG9ydCljbWRwLT51LnJhdy5zZ19yYW56ICogc2l6ZW9mKGdkdGhfc2dfc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBjaGVjayBzcGFjZSAqLworICAgIGlmIChoYS0+Y21kX2xlbiAmIDMpCisgICAgICAgIGhhLT5jbWRfbGVuICs9ICg0IC0gKGhhLT5jbWRfbGVuICYgMykpOworCisgICAgaWYgKGhhLT5jbWRfY250ID4gMCkgeworICAgICAgICBpZiAoKGhhLT5jbWRfb2Zmc19kcG1lbSArIGhhLT5jbWRfbGVuICsgRFBNRU1fQ09NTUFORF9PRkZTRVQpID4KKyAgICAgICAgICAgIGhhLT5pY19hbGxfc2l6ZSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9maWxsX3JhdygpIERQTUVNIG92ZXJmbG93XG4iKSk7CisgICAgICAgICAgICBoYS0+Y21kX3RhYltjbWRfaW5kZXgtMl0uY21uZCA9IFVOVVNFRF9DTU5EOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb3B5IGNvbW1hbmQgKi8KKyAgICBnZHRoX2NvcHlfY29tbWFuZChoYW51bSk7CisgICAgcmV0dXJuIGNtZF9pbmRleDsKK30KKworc3RhdGljIGludCBnZHRoX3NwZWNpYWxfY21kKGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICByZWdpc3RlciBnZHRoX2hhX3N0ciAqaGE7CisgICAgcmVnaXN0ZXIgZ2R0aF9jbWRfc3RyICpjbWRwOworICAgIGludCBjbWRfaW5kZXg7CisKKyAgICBoYSAgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgY21kcD0gaGEtPnBjY2I7CisgICAgVFJBQ0UyKCgiZ2R0aF9zcGVjaWFsX2NtZCgpOiAiKSk7CisKKyAgICBpZiAoaGEtPnR5cGU9PUdEVF9FSVNBICYmIGhhLT5jbWRfY250PjApIAorICAgICAgICByZXR1cm4gMDsKKworICAgIG1lbWNweSggY21kcCwgc2NwLT5yZXF1ZXN0X2J1ZmZlciwgc2l6ZW9mKGdkdGhfY21kX3N0cikpOworICAgIGNtZHAtPlJlcXVlc3RCdWZmZXIgPSBzY3A7CisKKyAgICAvKiBzZWFyY2ggZnJlZSBjb21tYW5kIGluZGV4ICovCisgICAgaWYgKCEoY21kX2luZGV4PWdkdGhfZ2V0X2NtZF9pbmRleChoYW51bSkpKSB7CisgICAgICAgIFRSQUNFKCgiR0RUOiBObyBmcmVlIGNvbW1hbmQgaW5kZXggZm91bmRcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogaWYgaXQncyB0aGUgZmlyc3QgY29tbWFuZCwgc2V0IGNvbW1hbmQgc2VtYXBob3JlICovCisgICAgaWYgKGhhLT5jbWRfY250ID09IDApCisgICAgICAgZ2R0aF9zZXRfc2VtYTAoaGFudW0pOworCisgICAgLyogZXZhbHVhdGUgY29tbWFuZCBzaXplLCBjaGVjayBzcGFjZSAqLworICAgIGlmIChjbWRwLT5PcENvZGUgPT0gR0RUX0lPQ1RMKSB7CisgICAgICAgIFRSQUNFMigoIklPQ1RMXG4iKSk7CisgICAgICAgIGhhLT5jbWRfbGVuID0gCisgICAgICAgICAgICBHRFRPRkZTT0YoZ2R0aF9jbWRfc3RyLHUuaW9jdGwucF9wYXJhbSkgKyBzaXplb2YodWxvbmc2NCk7CisgICAgfSBlbHNlIGlmIChjbWRwLT5TZXJ2aWNlID09IENBQ0hFU0VSVklDRSkgeworICAgICAgICBUUkFDRTIoKCJjYWNoZSBjb21tYW5kICVkXG4iLGNtZHAtPk9wQ29kZSkpOworICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpCisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IAorICAgICAgICAgICAgICAgIEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5jYWNoZTY0LnNnX2xzdCkgKyBzaXplb2YoZ2R0aF9zZzY0X3N0cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhhLT5jbWRfbGVuID0gCisgICAgICAgICAgICAgICAgR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LmNhY2hlLnNnX2xzdCkgKyBzaXplb2YoZ2R0aF9zZ19zdHIpOworICAgIH0gZWxzZSBpZiAoY21kcC0+U2VydmljZSA9PSBTQ1NJUkFXU0VSVklDRSkgeworICAgICAgICBUUkFDRTIoKCJyYXcgY29tbWFuZCAlZFxuIixjbWRwLT5PcENvZGUpKTsKKyAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIEdEVF82NEJJVCkKKyAgICAgICAgICAgIGhhLT5jbWRfbGVuID0gCisgICAgICAgICAgICAgICAgR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LnJhdzY0LnNnX2xzdCkgKyBzaXplb2YoZ2R0aF9zZzY0X3N0cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhhLT5jbWRfbGVuID0gCisgICAgICAgICAgICAgICAgR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LnJhdy5zZ19sc3QpICsgc2l6ZW9mKGdkdGhfc2dfc3RyKTsKKyAgICB9CisKKyAgICBpZiAoaGEtPmNtZF9sZW4gJiAzKQorICAgICAgICBoYS0+Y21kX2xlbiArPSAoNCAtIChoYS0+Y21kX2xlbiAmIDMpKTsKKworICAgIGlmIChoYS0+Y21kX2NudCA+IDApIHsKKyAgICAgICAgaWYgKChoYS0+Y21kX29mZnNfZHBtZW0gKyBoYS0+Y21kX2xlbiArIERQTUVNX0NPTU1BTkRfT0ZGU0VUKSA+CisgICAgICAgICAgICBoYS0+aWNfYWxsX3NpemUpIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc3BlY2lhbF9jbWQoKSBEUE1FTSBvdmVyZmxvd1xuIikpOworICAgICAgICAgICAgaGEtPmNtZF90YWJbY21kX2luZGV4LTJdLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBjb21tYW5kICovCisgICAgZ2R0aF9jb3B5X2NvbW1hbmQoaGFudW0pOworICAgIHJldHVybiBjbWRfaW5kZXg7Cit9ICAgIAorCisKKy8qIENvbnRyb2xsZXIgZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb25zICovCitzdGF0aWMgZ2R0aF9ldnRfc3RyICpnZHRoX3N0b3JlX2V2ZW50KGdkdGhfaGFfc3RyICpoYSwgdXNob3J0IHNvdXJjZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBpZHgsIGdkdGhfZXZ0X2RhdGEgKmV2dCkKK3sKKyAgICBnZHRoX2V2dF9zdHIgKmU7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICAvKiBubyBHRFRIX0xPQ0tfSEEoKSAhICovCisgICAgVFJBQ0UyKCgiZ2R0aF9zdG9yZV9ldmVudCgpIHNvdXJjZSAlZCBpZHggJWRcbiIsIHNvdXJjZSwgaWR4KSk7CisgICAgaWYgKHNvdXJjZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHNvdXJjZSAtPiBubyBldmVudCAqLworICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9zb3VyY2UgPT0gc291cmNlICYmCisgICAgICAgIGVidWZmZXJbZWxhc3RpZHhdLmV2ZW50X2lkeCA9PSBpZHggJiYKKyAgICAgICAgKChldnQtPnNpemUgIT0gMCAmJiBlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9kYXRhLnNpemUgIT0gMCAmJgorICAgICAgICAgICAgIW1lbWNtcCgoY2hhciAqKSZlYnVmZmVyW2VsYXN0aWR4XS5ldmVudF9kYXRhLmV1LAorICAgICAgICAgICAgKGNoYXIgKikmZXZ0LT5ldSwgZXZ0LT5zaXplKSkgfHwKKyAgICAgICAgKGV2dC0+c2l6ZSA9PSAwICYmIGVidWZmZXJbZWxhc3RpZHhdLmV2ZW50X2RhdGEuc2l6ZSA9PSAwICYmCisgICAgICAgICAgICAhc3RyY21wKChjaGFyICopJmVidWZmZXJbZWxhc3RpZHhdLmV2ZW50X2RhdGEuZXZlbnRfc3RyaW5nLAorICAgICAgICAgICAgKGNoYXIgKikmZXZ0LT5ldmVudF9zdHJpbmcpKSkpIHsgCisgICAgICAgIGUgPSAmZWJ1ZmZlcltlbGFzdGlkeF07CisgICAgICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOworICAgICAgICBlLT5sYXN0X3N0YW1wID0gdHYudHZfc2VjOworICAgICAgICArK2UtPnNhbWVfY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGVidWZmZXJbZWxhc3RpZHhdLmV2ZW50X3NvdXJjZSAhPSAwKSB7ICAvKiBlbnRyeSBub3QgZnJlZSA/ICovCisgICAgICAgICAgICArK2VsYXN0aWR4OworICAgICAgICAgICAgaWYgKGVsYXN0aWR4ID09IE1BWF9FVkVOVFMpCisgICAgICAgICAgICAgICAgZWxhc3RpZHggPSAwOworICAgICAgICAgICAgaWYgKGVsYXN0aWR4ID09IGVvbGRpZHgpIHsgICAgICAgICAgICAgIC8qIHJlYWNoZWQgbWFyayA/ICovCisgICAgICAgICAgICAgICAgKytlb2xkaWR4OworICAgICAgICAgICAgICAgIGlmIChlb2xkaWR4ID09IE1BWF9FVkVOVFMpCisgICAgICAgICAgICAgICAgICAgIGVvbGRpZHggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGUgPSAmZWJ1ZmZlcltlbGFzdGlkeF07CisgICAgICAgIGUtPmV2ZW50X3NvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgZS0+ZXZlbnRfaWR4ID0gaWR4OworICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICAgICAgZS0+Zmlyc3Rfc3RhbXAgPSBlLT5sYXN0X3N0YW1wID0gdHYudHZfc2VjOworICAgICAgICBlLT5zYW1lX2NvdW50ID0gMTsKKyAgICAgICAgZS0+ZXZlbnRfZGF0YSA9ICpldnQ7CisgICAgICAgIGUtPmFwcGxpY2F0aW9uID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBpbnQgZ2R0aF9yZWFkX2V2ZW50KGdkdGhfaGFfc3RyICpoYSwgaW50IGhhbmRsZSwgZ2R0aF9ldnRfc3RyICplc3RyKQoreworICAgIGdkdGhfZXZ0X3N0ciAqZTsKKyAgICBpbnQgZWluZGV4OworICAgIHVsb25nIGZsYWdzOworCisgICAgVFJBQ0UyKCgiZ2R0aF9yZWFkX2V2ZW50KCkgaGFuZGxlICVkXG4iLCBoYW5kbGUpKTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgaWYgKGhhbmRsZSA9PSAtMSkKKyAgICAgICAgZWluZGV4ID0gZW9sZGlkeDsKKyAgICBlbHNlCisgICAgICAgIGVpbmRleCA9IGhhbmRsZTsKKyAgICBlc3RyLT5ldmVudF9zb3VyY2UgPSAwOworCisgICAgaWYgKGVpbmRleCA+PSBNQVhfRVZFTlRTKSB7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gZWluZGV4OworICAgIH0KKyAgICBlID0gJmVidWZmZXJbZWluZGV4XTsKKyAgICBpZiAoZS0+ZXZlbnRfc291cmNlICE9IDApIHsKKyAgICAgICAgaWYgKGVpbmRleCAhPSBlbGFzdGlkeCkgeworICAgICAgICAgICAgaWYgKCsrZWluZGV4ID09IE1BWF9FVkVOVFMpCisgICAgICAgICAgICAgICAgZWluZGV4ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVpbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIG1lbWNweShlc3RyLCBlLCBzaXplb2YoZ2R0aF9ldnRfc3RyKSk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIHJldHVybiBlaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIGdkdGhfcmVhZGFwcF9ldmVudChnZHRoX2hhX3N0ciAqaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jaGFyIGFwcGxpY2F0aW9uLCBnZHRoX2V2dF9zdHIgKmVzdHIpCit7CisgICAgZ2R0aF9ldnRfc3RyICplOworICAgIGludCBlaW5kZXg7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgdW5jaGFyIGZvdW5kID0gRkFMU0U7CisKKyAgICBUUkFDRTIoKCJnZHRoX3JlYWRhcHBfZXZlbnQoKSBhcHAuICVkXG4iLCBhcHBsaWNhdGlvbikpOworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICBlaW5kZXggPSBlb2xkaWR4OworICAgIGZvciAoOzspIHsKKyAgICAgICAgZSA9ICZlYnVmZmVyW2VpbmRleF07CisgICAgICAgIGlmIChlLT5ldmVudF9zb3VyY2UgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKGUtPmFwcGxpY2F0aW9uICYgYXBwbGljYXRpb24pID09IDApIHsKKyAgICAgICAgICAgIGUtPmFwcGxpY2F0aW9uIHw9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVpbmRleCA9PSBlbGFzdGlkeCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKytlaW5kZXggPT0gTUFYX0VWRU5UUykKKyAgICAgICAgICAgIGVpbmRleCA9IDA7CisgICAgfQorICAgIGlmIChmb3VuZCkKKyAgICAgICAgbWVtY3B5KGVzdHIsIGUsIHNpemVvZihnZHRoX2V2dF9zdHIpKTsKKyAgICBlbHNlCisgICAgICAgIGVzdHItPmV2ZW50X3NvdXJjZSA9IDA7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdkdGhfY2xlYXJfZXZlbnRzKHZvaWQpCit7CisgICAgVFJBQ0UoKCJnZHRoX2NsZWFyX2V2ZW50cygpIikpOworCisgICAgZW9sZGlkeCA9IGVsYXN0aWR4ID0gMDsKKyAgICBlYnVmZmVyWzBdLmV2ZW50X3NvdXJjZSA9IDA7Cit9CisKKworLyogU0NTSSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBnZHRoX2ludGVycnVwdChpbnQgaXJxLHZvaWQgKmRldl9pZCxzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGEyID0gKGdkdGhfaGFfc3RyICopZGV2X2lkOworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICBnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqZHA2bV9wdHIgPSBOVUxMOworICAgIGdkdDZfZHByYW1fc3RyIF9faW9tZW0gKmRwNl9wdHI7CisgICAgZ2R0Ml9kcHJhbV9zdHIgX19pb21lbSAqZHAyX3B0cjsKKyAgICBTY3NpX0NtbmQgKnNjcDsKKyAgICBpbnQgaGFudW0sIHJ2YWwsIGk7CisgICAgdW5jaGFyIElTdGF0dXM7CisgICAgdXNob3J0IFNlcnZpY2U7CisgICAgdWxvbmcgZmxhZ3MgPSAwOworI2lmZGVmIElOVF9DT0FMCisgICAgaW50IGNvYWxlc2NlZCA9IEZBTFNFOworICAgIGludCBuZXh0ID0gRkFMU0U7CisgICAgZ2R0aF9jb2FsX3N0YXR1cyAqcGNzID0gTlVMTDsKKyAgICBpbnQgYWN0X2ludF9jb2FsID0gMDsgICAgICAgCisjZW5kaWYKKworICAgIFRSQUNFKCgiZ2R0aF9pbnRlcnJ1cHQoKSBJUlEgJWRcbiIsaXJxKSk7CisKKyAgICAvKiBpZiBwb2xsaW5nIGFuZCBub3QgZnJvbSBnZHRoX3dhaXQoKSAtPiByZXR1cm4gKi8KKyAgICBpZiAoZ2R0aF9wb2xsaW5nKSB7CisgICAgICAgIGlmICghZ2R0aF9mcm9tX3dhaXQpIHsKKyAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZ2R0aF9wb2xsaW5nKQorCXNwaW5fbG9ja19pcnFzYXZlKCZoYTItPnNtcF9sb2NrLCBmbGFncyk7CisgICAgd2FpdF9pbmRleCA9IDA7CisKKyAgICAvKiBzZWFyY2ggY29udHJvbGxlciAqLworICAgIGlmICgoaGFudW0gPSBnZHRoX2dldF9zdGF0dXMoJklTdGF0dXMsaXJxKSkgPT0gLTEpIHsKKyAgICAgICAgLyogc3B1cmlvdXMgaW50ZXJydXB0ICovCisgICAgICAgIGlmICghZ2R0aF9wb2xsaW5nKQorICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEyLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgIH0KKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKworI2lmZGVmIEdEVEhfU1RBVElTVElDUworICAgICsrYWN0X2ludHM7CisjZW5kaWYKKworI2lmZGVmIElOVF9DT0FMCisgICAgLyogU2VlIGlmIHRoZSBmdyBpcyByZXR1cm5pbmcgY29hbGVzY2VkIHN0YXR1cyAqLworICAgIGlmIChJU3RhdHVzID09IENPQUxJTkRFWCkgeworICAgICAgICAvKiBDb2FsZXNjZWQgc3RhdHVzLiAgU2V0dXAgdGhlIGluaXRpYWwgc3RhdHVzIAorICAgICAgICAgICBidWZmZXIgcG9pbnRlciBhbmQgZmxhZ3MgKi8KKyAgICAgICAgcGNzID0gaGEtPmNvYWxfc3RhdDsKKyAgICAgICAgY29hbGVzY2VkID0gVFJVRTsgICAgICAgIAorICAgICAgICBuZXh0ID0gVFJVRTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmIChjb2FsZXNjZWQpIHsKKyAgICAgICAgICAgIC8qIEZvciBjb2FsZXNjZWQgcmVxdWVzdHMgYWxsIHN0YXR1cworICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgZm91bmQgaW4gdGhlIHN0YXR1cyBidWZmZXIgKi8KKyAgICAgICAgICAgIElTdGF0dXMgPSAodW5jaGFyKShwY3MtPnN0YXR1cyAmIDB4ZmYpOworICAgICAgICB9CisjZW5kaWYKKyAgICAKKyAgICAgICAgaWYgKGhhLT50eXBlID09IEdEVF9FSVNBKSB7CisgICAgICAgICAgICBpZiAoSVN0YXR1cyAmIDB4ODApIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBJU3RhdHVzICY9IH4weDgwOworICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBpbncoaGEtPmJtaWMgKyBNQUlMQk9YUkVHKzgpOworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgZXJyb3IgJWQvJWRcbiIsSVN0YXR1cyxoYS0+c3RhdHVzKSk7CisgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yICovCisgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IFNfT0s7CisgICAgICAgICAgICBoYS0+aW5mbyA9IGlubChoYS0+Ym1pYyArIE1BSUxCT1hSRUcrMTIpOworICAgICAgICAgICAgaGEtPnNlcnZpY2UgPSBpbncoaGEtPmJtaWMgKyBNQUlMQk9YUkVHKzEwKTsKKyAgICAgICAgICAgIGhhLT5pbmZvMiA9IGlubChoYS0+Ym1pYyArIE1BSUxCT1hSRUcrNCk7CisKKyAgICAgICAgICAgIG91dGIoMHhmZiwgaGEtPmJtaWMgKyBFRE9PUlJFRyk7ICAgIC8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLworICAgICAgICAgICAgb3V0YigweDAwLCBoYS0+Ym1pYyArIFNFTUExUkVHKTsgICAgLyogcmVzZXQgc3RhdHVzIHNlbWFwaG9yZSAqLworICAgICAgICB9IGVsc2UgaWYgKGhhLT50eXBlID09IEdEVF9JU0EpIHsKKyAgICAgICAgICAgIGRwMl9wdHIgPSBoYS0+YnJkOworICAgICAgICAgICAgaWYgKElTdGF0dXMgJiAweDgwKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBmbGFnICovCisgICAgICAgICAgICAgICAgSVN0YXR1cyAmPSB+MHg4MDsKKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gZ2R0aF9yZWFkdygmZHAyX3B0ci0+dS5pYy5TdGF0dXMpOworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgZXJyb3IgJWQvJWRcbiIsSVN0YXR1cyxoYS0+c3RhdHVzKSk7CisgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVycm9yICovCisgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IFNfT0s7CisgICAgICAgICAgICBoYS0+aW5mbyA9IGdkdGhfcmVhZGwoJmRwMl9wdHItPnUuaWMuSW5mb1swXSk7CisgICAgICAgICAgICBoYS0+c2VydmljZSA9IGdkdGhfcmVhZHcoJmRwMl9wdHItPnUuaWMuU2VydmljZSk7CisgICAgICAgICAgICBoYS0+aW5mbzIgPSBnZHRoX3JlYWRsKCZkcDJfcHRyLT51LmljLkluZm9bMV0pOworCisgICAgICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHAyX3B0ci0+aW8uaXJxZGVsKTsgLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisgICAgICAgICAgICBnZHRoX3dyaXRlYigwLCAmZHAyX3B0ci0+dS5pYy5DbWRfSW5kZXgpOy8qIHJlc2V0IGNvbW1hbmQgaW5kZXggKi8KKyAgICAgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDJfcHRyLT5pby5TZW1hMSk7ICAgICAvKiByZXNldCBzdGF0dXMgc2VtYXBob3JlICovCisgICAgICAgIH0gZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSSkgeworICAgICAgICAgICAgZHA2X3B0ciA9IGhhLT5icmQ7CisgICAgICAgICAgICBpZiAoSVN0YXR1cyAmIDB4ODApIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBJU3RhdHVzICY9IH4weDgwOworICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBnZHRoX3JlYWR3KCZkcDZfcHRyLT51LmljLlN0YXR1cyk7CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9pbnRlcnJ1cHQoKSBlcnJvciAlZC8lZFxuIixJU3RhdHVzLGhhLT5zdGF0dXMpKTsKKyAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gU19PSzsKKyAgICAgICAgICAgIGhhLT5pbmZvID0gZ2R0aF9yZWFkbCgmZHA2X3B0ci0+dS5pYy5JbmZvWzBdKTsKKyAgICAgICAgICAgIGhhLT5zZXJ2aWNlID0gZ2R0aF9yZWFkdygmZHA2X3B0ci0+dS5pYy5TZXJ2aWNlKTsKKyAgICAgICAgICAgIGhhLT5pbmZvMiA9IGdkdGhfcmVhZGwoJmRwNl9wdHItPnUuaWMuSW5mb1sxXSk7CisKKyAgICAgICAgICAgIGdkdGhfd3JpdGViKDB4ZmYsICZkcDZfcHRyLT5pby5pcnFkZWwpOyAvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZfcHRyLT51LmljLkNtZF9JbmRleCk7LyogcmVzZXQgY29tbWFuZCBpbmRleCAqLworICAgICAgICAgICAgZ2R0aF93cml0ZWIoMCwgJmRwNl9wdHItPmlvLlNlbWExKTsgICAgIC8qIHJlc2V0IHN0YXR1cyBzZW1hcGhvcmUgKi8KKyAgICAgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTkVXKSB7CisgICAgICAgICAgICBpZiAoSVN0YXR1cyAmIDB4ODApIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBJU3RhdHVzICY9IH4weDgwOworICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBpbncoUFRSMlVTSE9SVCgmaGEtPnBseC0+c3RhdHVzKSk7CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9pbnRlcnJ1cHQoKSBlcnJvciAlZC8lZFxuIixJU3RhdHVzLGhhLT5zdGF0dXMpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBTX09LOworICAgICAgICAgICAgaGEtPmluZm8gPSBpbmwoUFRSMlVTSE9SVCgmaGEtPnBseC0+aW5mb1swXSkpOworICAgICAgICAgICAgaGEtPnNlcnZpY2UgPSBpbncoUFRSMlVTSE9SVCgmaGEtPnBseC0+c2VydmljZSkpOworICAgICAgICAgICAgaGEtPmluZm8yID0gaW5sKFBUUjJVU0hPUlQoJmhhLT5wbHgtPmluZm9bMV0pKTsKKworICAgICAgICAgICAgb3V0YigweGZmLCBQVFIyVVNIT1JUKCZoYS0+cGx4LT5lZG9vcl9yZWcpKTsgCisgICAgICAgICAgICBvdXRiKDB4MDAsIFBUUjJVU0hPUlQoJmhhLT5wbHgtPnNlbWExX3JlZykpOyAKKyAgICAgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSKSB7CisgICAgICAgICAgICBkcDZtX3B0ciA9IGhhLT5icmQ7CisgICAgICAgICAgICBpZiAoSVN0YXR1cyAmIDB4ODApIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBJU3RhdHVzICY9IH4weDgwOworI2lmZGVmIElOVF9DT0FMCisgICAgICAgICAgICAgICAgaWYgKGNvYWxlc2NlZCkKKyAgICAgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IHBjcy0+ZXh0X3N0YXR1cyAmJiAweGZmZmY7CisgICAgICAgICAgICAgICAgZWxzZSAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gZ2R0aF9yZWFkdygmZHA2bV9wdHItPmk5NjByLnN0YXR1cyk7CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9pbnRlcnJ1cHQoKSBlcnJvciAlZC8lZFxuIixJU3RhdHVzLGhhLT5zdGF0dXMpKTsKKyAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gU19PSzsKKyNpZmRlZiBJTlRfQ09BTAorICAgICAgICAgICAgLyogZ2V0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBpZiAoY29hbGVzY2VkKSB7ICAgIAorICAgICAgICAgICAgICAgIGhhLT5pbmZvID0gcGNzLT5pbmZvMDsKKyAgICAgICAgICAgICAgICBoYS0+aW5mbzIgPSBwY3MtPmluZm8xOworICAgICAgICAgICAgICAgIGhhLT5zZXJ2aWNlID0gKHBjcy0+ZXh0X3N0YXR1cyA+PiAxNikgJiYgMHhmZmZmOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYS0+aW5mbyA9IGdkdGhfcmVhZGwoJmRwNm1fcHRyLT5pOTYwci5pbmZvWzBdKTsKKyAgICAgICAgICAgICAgICBoYS0+c2VydmljZSA9IGdkdGhfcmVhZHcoJmRwNm1fcHRyLT5pOTYwci5zZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBoYS0+aW5mbzIgPSBnZHRoX3JlYWRsKCZkcDZtX3B0ci0+aTk2MHIuaW5mb1sxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBldmVudCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGlmIChJU3RhdHVzID09IEFTWU5DSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPnNlcnZpY2UgIT0gU0NSRUVOU0VSVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAoaGEtPmZ3X3ZlcnMgJiAweGZmKSA+PSAweDFhKSB7CisgICAgICAgICAgICAgICAgICAgIGhhLT5kdnIuc2V2ZXJpdHkgPSBnZHRoX3JlYWRiCisgICAgICAgICAgICAgICAgICAgICAgICAoJigoZ2R0Nm1fZHByYW1fc3RyIF9faW9tZW0gKiloYS0+YnJkKS0+aTk2MHIuc2V2ZXJpdHkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5kdnIuZXZlbnRfc3RyaW5nW2ldID0gZ2R0aF9yZWFkYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmKChnZHQ2bV9kcHJhbV9zdHIgX19pb21lbSAqKWhhLT5icmQpLT5pOTYwci5ldnRfc3RyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+ZHZyLmV2ZW50X3N0cmluZ1tpXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmZGVmIElOVF9DT0FMCisgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBub24gY29hbGVzY2VkIGludGVycnVwdHMgZ2V0IGNsZWFyZWQKKyAgICAgICAgICAgICAgIGJlZm9yZSBiZWluZyBoYW5kbGVkIGJ5IGdkdGhfYXN5bmNfZXZlbnQvZ2R0aF9zeW5jX2V2ZW50ICovCisgICAgICAgICAgICBpZiAoIWNvYWxlc2NlZCkKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2R0aF93cml0ZWIoMHhmZiwgJmRwNm1fcHRyLT5pOTYwci5lZG9vcl9yZWcpOworICAgICAgICAgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZtX3B0ci0+aTk2MHIuc2VtYTFfcmVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfaW50ZXJydXB0KCkgdW5rbm93biBjb250cm9sbGVyIHR5cGVcbiIpKTsKKyAgICAgICAgICAgIGlmICghZ2R0aF9wb2xsaW5nKQorICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhMi0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfQorCisgICAgICAgIFRSQUNFKCgiZ2R0aF9pbnRlcnJ1cHQoKSBpbmRleCAlZCBzdGF0ICVkIGluZm8gJWRcbiIsCisgICAgICAgICAgICAgICBJU3RhdHVzLGhhLT5zdGF0dXMsaGEtPmluZm8pKTsKKworICAgICAgICBpZiAoZ2R0aF9mcm9tX3dhaXQpIHsKKyAgICAgICAgICAgIHdhaXRfaGFudW0gPSBoYW51bTsKKyAgICAgICAgICAgIHdhaXRfaW5kZXggPSAoaW50KUlTdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoSVN0YXR1cyA9PSBBU1lOQ0lOREVYKSB7CisgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX2ludGVycnVwdCgpIGFzeW5jLiBldmVudFxuIikpOworICAgICAgICAgICAgZ2R0aF9hc3luY19ldmVudChoYW51bSk7CisgICAgICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYTItPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBnZHRoX25leHQoaGFudW0pOworICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgICB9IAorCisgICAgICAgIGlmIChJU3RhdHVzID09IFNQRVpJTkRFWCkgeworICAgICAgICAgICAgVFJBQ0UyKCgiU2VydmljZSB1bmtub3duIG9yIG5vdCBpbml0aWFsaXplZCAhXG4iKSk7CisgICAgICAgICAgICBoYS0+ZHZyLnNpemUgPSBzaXplb2YoaGEtPmR2ci5ldS5kcml2ZXIpOworICAgICAgICAgICAgaGEtPmR2ci5ldS5kcml2ZXIuaW9ub2RlID0gaGFudW07CisgICAgICAgICAgICBnZHRoX3N0b3JlX2V2ZW50KGhhLCBFU19EUklWRVIsIDQsICZoYS0+ZHZyKTsKKyAgICAgICAgICAgIGlmICghZ2R0aF9wb2xsaW5nKQorICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhMi0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfQorICAgICAgICBzY3AgICAgID0gaGEtPmNtZF90YWJbSVN0YXR1cy0yXS5jbW5kOworICAgICAgICBTZXJ2aWNlID0gaGEtPmNtZF90YWJbSVN0YXR1cy0yXS5zZXJ2aWNlOworICAgICAgICBoYS0+Y21kX3RhYltJU3RhdHVzLTJdLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICAgICAgaWYgKHNjcCA9PSBVTlVTRURfQ01ORCkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9pbnRlcnJ1cHQoKSBpbmRleCB0byB1bnVzZWQgY29tbWFuZCAoJWQpXG4iLElTdGF0dXMpKTsKKyAgICAgICAgICAgIGhhLT5kdnIuc2l6ZSA9IHNpemVvZihoYS0+ZHZyLmV1LmRyaXZlcik7CisgICAgICAgICAgICBoYS0+ZHZyLmV1LmRyaXZlci5pb25vZGUgPSBoYW51bTsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuZHJpdmVyLmluZGV4ID0gSVN0YXR1czsKKyAgICAgICAgICAgIGdkdGhfc3RvcmVfZXZlbnQoaGEsIEVTX0RSSVZFUiwgMSwgJmhhLT5kdnIpOworICAgICAgICAgICAgaWYgKCFnZHRoX3BvbGxpbmcpCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEyLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgICB9CisgICAgICAgIGlmIChzY3AgPT0gSU5URVJOQUxfQ01ORCkgeworICAgICAgICAgICAgVFJBQ0UoKCJnZHRoX2ludGVycnVwdCgpIGFuc3dlciB0byBpbnRlcm5hbCBjb21tYW5kXG4iKSk7CisgICAgICAgICAgICBpZiAoIWdkdGhfcG9sbGluZykKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYTItPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgIH0KKworICAgICAgICBUUkFDRSgoImdkdGhfaW50ZXJydXB0KCkgc3luYy4gc3RhdHVzXG4iKSk7CisgICAgICAgIHJ2YWwgPSBnZHRoX3N5bmNfZXZlbnQoaGFudW0sU2VydmljZSxJU3RhdHVzLHNjcCk7CisgICAgICAgIGlmICghZ2R0aF9wb2xsaW5nKQorICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEyLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICBpZiAocnZhbCA9PSAyKSB7CisgICAgICAgICAgICBnZHRoX3B1dHEoaGFudW0sc2NwLHNjcC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgICAgICB9IGVsc2UgaWYgKHJ2YWwgPT0gMSkgeworICAgICAgICAgICAgc2NwLT5zY3NpX2RvbmUoc2NwKTsKKyAgICAgICAgfQorCisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgaWYgKGNvYWxlc2NlZCkgeworICAgICAgICAgICAgLyogZ28gdG8gdGhlIG5leHQgc3RhdHVzIGluIHRoZSBzdGF0dXMgYnVmZmVyICovCisgICAgICAgICAgICArK3BjczsKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICsrYWN0X2ludF9jb2FsOworICAgICAgICAgICAgaWYgKGFjdF9pbnRfY29hbCA+IG1heF9pbnRfY29hbCkgeworICAgICAgICAgICAgICAgIG1heF9pbnRfY29hbCA9IGFjdF9pbnRfY29hbDsKKyAgICAgICAgICAgICAgICBwcmludGsoIkdEVDogbWF4X2ludF9jb2FsID0gJWRcbiIsKHVzaG9ydCltYXhfaW50X2NvYWwpOworICAgICAgICAgICAgfQorI2VuZGlmICAgICAgCisgICAgICAgICAgICAvKiBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBzdGF0dXMgKi8KKyAgICAgICAgICAgIGlmIChwY3MtPnN0YXR1cyA9PSAwKSAgICAKKyAgICAgICAgICAgICAgICAvKiBTdG9wIHRoZSBjb2FsZXNjZSBsb29wICovCisgICAgICAgICAgICAgICAgbmV4dCA9IEZBTFNFOworICAgICAgICB9CisgICAgfSB3aGlsZSAobmV4dCk7CisKKyAgICAvKiBjb2FsZXNjaW5nIG9ubHkgZm9yIG5ldyBHRFRfUENJTVBSIGNvbnRyb2xsZXJzIGF2YWlsYWJsZSAqLyAgICAgIAorICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJTVBSICYmIGNvYWxlc2NlZCkgeworICAgICAgICBnZHRoX3dyaXRlYigweGZmLCAmZHA2bV9wdHItPmk5NjByLmVkb29yX3JlZyk7CisgICAgICAgIGdkdGhfd3JpdGViKDAsICZkcDZtX3B0ci0+aTk2MHIuc2VtYTFfcmVnKTsKKyAgICB9CisjZW5kaWYKKworICAgIGdkdGhfbmV4dChoYW51bSk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGdkdGhfc3luY19ldmVudChpbnQgaGFudW0saW50IHNlcnZpY2UsdW5jaGFyIGluZGV4LFNjc2lfQ21uZCAqc2NwKQoreworICAgIHJlZ2lzdGVyIGdkdGhfaGFfc3RyICpoYTsKKyAgICBnZHRoX21zZ19zdHIgKm1zZzsKKyAgICBnZHRoX2NtZF9zdHIgKmNtZHA7CisgICAgdW5jaGFyIGIsIHQ7CisKKyAgICBoYSAgID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIGNtZHAgPSBoYS0+cGNjYjsKKyAgICBUUkFDRSgoImdkdGhfc3luY19ldmVudCgpIHNlcnYgJWQgc3RhdHVzICVkXG4iLAorICAgICAgICAgICBzZXJ2aWNlLGhhLT5zdGF0dXMpKTsKKworICAgIGlmIChzZXJ2aWNlID09IFNDUkVFTlNFUlZJQ0UpIHsKKyAgICAgICAgbXNnICA9IGhhLT5wbXNnOworICAgICAgICBUUkFDRSgoImxlbjogJWQsIGFuc3dlcjogJWQsIGV4dDogJWQsIGFsZW46ICVkXG4iLAorICAgICAgICAgICAgICAgbXNnLT5tc2dfbGVuLG1zZy0+bXNnX2Fuc3dlcixtc2ctPm1zZ19leHQsbXNnLT5tc2dfYWxlbikpOworICAgICAgICBpZiAobXNnLT5tc2dfbGVuID4gTVNHTEVOKzEpCisgICAgICAgICAgICBtc2ctPm1zZ19sZW4gPSBNU0dMRU4rMTsKKyAgICAgICAgaWYgKG1zZy0+bXNnX2xlbikKKyAgICAgICAgICAgIGlmICghKG1zZy0+bXNnX2Fuc3dlciAmJiBtc2ctPm1zZ19leHQpKSB7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfdGV4dFttc2ctPm1zZ19sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzIixtc2ctPm1zZ190ZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAobXNnLT5tc2dfZXh0ICYmICFtc2ctPm1zZ19hbnN3ZXIpIHsKKyAgICAgICAgICAgIHdoaWxlIChnZHRoX3Rlc3RfYnVzeShoYW51bSkpCisgICAgICAgICAgICAgICAgZ2R0aF9kZWxheSgwKTsKKyAgICAgICAgICAgIGNtZHAtPlNlcnZpY2UgICAgICAgPSBTQ1JFRU5TRVJWSUNFOworICAgICAgICAgICAgY21kcC0+UmVxdWVzdEJ1ZmZlciA9IFNDUkVFTl9DTU5EOworICAgICAgICAgICAgZ2R0aF9nZXRfY21kX2luZGV4KGhhbnVtKTsKKyAgICAgICAgICAgIGdkdGhfc2V0X3NlbWEwKGhhbnVtKTsKKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSAgICAgICAgPSBHRFRfUkVBRDsKKyAgICAgICAgICAgIGNtZHAtPkJvYXJkTm9kZSAgICAgPSBMT0NBTEJPQVJEOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4ucmVzZXJ2ZWQgID0gMDsKKyAgICAgICAgICAgIGNtZHAtPnUuc2NyZWVuLnN1Lm1zZy5tc2dfaGFuZGxlPSBtc2ctPm1zZ19oYW5kbGU7CisgICAgICAgICAgICBjbWRwLT51LnNjcmVlbi5zdS5tc2cubXNnX2FkZHIgID0gaGEtPm1zZ19waHlzOworICAgICAgICAgICAgaGEtPmNtZF9vZmZzX2RwbWVtID0gMDsKKyAgICAgICAgICAgIGhhLT5jbWRfbGVuID0gR0RUT0ZGU09GKGdkdGhfY21kX3N0cix1LnNjcmVlbi5zdS5tc2cubXNnX2FkZHIpIAorICAgICAgICAgICAgICAgICsgc2l6ZW9mKHVsb25nNjQpOworICAgICAgICAgICAgaGEtPmNtZF9jbnQgPSAwOworICAgICAgICAgICAgZ2R0aF9jb3B5X2NvbW1hbmQoaGFudW0pOworICAgICAgICAgICAgZ2R0aF9yZWxlYXNlX2V2ZW50KGhhbnVtKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZy0+bXNnX2Fuc3dlciAmJiBtc2ctPm1zZ19hbGVuKSB7CisgICAgICAgICAgICAvKiBkZWZhdWx0IGFuc3dlcnMgKGdldGNoYXIoKSBub3QgcG9zc2libGUpICovCisgICAgICAgICAgICBpZiAobXNnLT5tc2dfYWxlbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfYWxlbiA9IDA7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfbGVuID0gMTsKKyAgICAgICAgICAgICAgICBtc2ctPm1zZ190ZXh0WzBdID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfYWxlbiAtPSAyOworICAgICAgICAgICAgICAgIG1zZy0+bXNnX2xlbiA9IDI7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfdGV4dFswXSA9IDE7CisgICAgICAgICAgICAgICAgbXNnLT5tc2dfdGV4dFsxXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPm1zZ19leHQgICAgPSAwOworICAgICAgICAgICAgbXNnLT5tc2dfYW5zd2VyID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChnZHRoX3Rlc3RfYnVzeShoYW51bSkpCisgICAgICAgICAgICAgICAgZ2R0aF9kZWxheSgwKTsKKyAgICAgICAgICAgIGNtZHAtPlNlcnZpY2UgICAgICAgPSBTQ1JFRU5TRVJWSUNFOworICAgICAgICAgICAgY21kcC0+UmVxdWVzdEJ1ZmZlciA9IFNDUkVFTl9DTU5EOworICAgICAgICAgICAgZ2R0aF9nZXRfY21kX2luZGV4KGhhbnVtKTsKKyAgICAgICAgICAgIGdkdGhfc2V0X3NlbWEwKGhhbnVtKTsKKyAgICAgICAgICAgIGNtZHAtPk9wQ29kZSAgICAgICAgPSBHRFRfV1JJVEU7CisgICAgICAgICAgICBjbWRwLT5Cb2FyZE5vZGUgICAgID0gTE9DQUxCT0FSRDsKKyAgICAgICAgICAgIGNtZHAtPnUuc2NyZWVuLnJlc2VydmVkICA9IDA7CisgICAgICAgICAgICBjbWRwLT51LnNjcmVlbi5zdS5tc2cubXNnX2hhbmRsZT0gbXNnLT5tc2dfaGFuZGxlOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4uc3UubXNnLm1zZ19hZGRyICA9IGhhLT5tc2dfcGh5czsKKyAgICAgICAgICAgIGhhLT5jbWRfb2Zmc19kcG1lbSA9IDA7CisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5zY3JlZW4uc3UubXNnLm1zZ19hZGRyKSAKKyAgICAgICAgICAgICAgICArIHNpemVvZih1bG9uZzY0KTsKKyAgICAgICAgICAgIGhhLT5jbWRfY250ID0gMDsKKyAgICAgICAgICAgIGdkdGhfY29weV9jb21tYW5kKGhhbnVtKTsKKyAgICAgICAgICAgIGdkdGhfcmVsZWFzZV9ldmVudChoYW51bSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoIlxuIik7CisKKyAgICB9IGVsc2UgeworICAgICAgICBiID0gdmlydF9jdHIgPyBOVU1EQVRBKHNjcC0+ZGV2aWNlLT5ob3N0KS0+YnVzbnVtIDogc2NwLT5kZXZpY2UtPmNoYW5uZWw7CisgICAgICAgIHQgPSBzY3AtPmRldmljZS0+aWQ7CisgICAgICAgIGlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgPT0gLTEgJiYgYiAhPSBoYS0+dmlydF9idXMpIHsKKyAgICAgICAgICAgIGhhLT5yYXdbQlVTX0wyUChoYSxiKV0uaW9fY250W3RdLS07CisgICAgICAgIH0KKyAgICAgICAgLyogY2FjaGUgb3IgcmF3IHNlcnZpY2UgKi8KKyAgICAgICAgaWYgKGhhLT5zdGF0dXMgPT0gU19CU1kpIHsKKyAgICAgICAgICAgIFRSQUNFMigoIkNvbnRyb2xsZXIgYnVzeSAtPiByZXRyeSAhXG4iKSk7CisgICAgICAgICAgICBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kID09IEdEVF9NT1VOVCkKKyAgICAgICAgICAgICAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgPSBHRFRfQ0xVU1RfSU5GTzsKKyAgICAgICAgICAgIC8qIHJldHJ5ICovCisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzID09IEdEVEhfTUFQX1NHKSAKKyAgICAgICAgICAgIHBjaV91bm1hcF9zZyhoYS0+cGRldixzY3AtPnJlcXVlc3RfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjcC0+dXNlX3NnLHNjcC0+U0NwLk1lc3NhZ2UpOworICAgICAgICBlbHNlIGlmIChzY3AtPlNDcC5TdGF0dXMgPT0gR0RUSF9NQVBfU0lOR0xFKSAKKyAgICAgICAgICAgIHBjaV91bm1hcF9wYWdlKGhhLT5wZGV2LHNjcC0+U0NwLmRtYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPnJlcXVlc3RfYnVmZmxlbixzY3AtPlNDcC5NZXNzYWdlKTsKKyAgICAgICAgaWYgKHNjcC0+U0NwLmJ1ZmZlcikgeworICAgICAgICAgICAgZG1hX2FkZHJfdCBhZGRyOworICAgICAgICAgICAgYWRkciA9IChkbWFfYWRkcl90KSh1bG9uZzMyKXNjcC0+U0NwLmJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChzY3AtPmhvc3Rfc2NyaWJibGUpCisgICAgICAgICAgICAgICAgYWRkciArPSAoZG1hX2FkZHJfdCkoKHVsb25nNjQpKHVsb25nMzIpc2NwLT5ob3N0X3NjcmliYmxlIDw8IDMyKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBjaV91bm1hcF9wYWdlKGhhLT5wZGV2LGFkZHIsMTYsUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYS0+c3RhdHVzID09IFNfT0spIHsKKyAgICAgICAgICAgIHNjcC0+U0NwLlN0YXR1cyA9IFNfT0s7CisgICAgICAgICAgICBzY3AtPlNDcC5NZXNzYWdlID0gaGEtPmluZm87CisgICAgICAgICAgICBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IC0xKSB7CisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zeW5jX2V2ZW50KCk6IHNwZWNpYWwgY21kIDB4JXggT0tcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQpKTsKKyAgICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNvbW1hbmRzIEdEVF9DTFVTVF9JTkZPL0dEVF9NT1VOVCA/ICovCisgICAgICAgICAgICAgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9PSBHRFRfQ0xVU1RfSU5GTykgeworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSA9ICh1bmNoYXIpaGEtPmluZm87CisgICAgICAgICAgICAgICAgICAgIGlmICghKGhhLT5oZHJbdF0uY2x1c3Rlcl90eXBlICYgCisgICAgICAgICAgICAgICAgICAgICAgICBDTFVTVEVSX01PVU5URUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT1QgTU9VTlRFRCAtPiBNT1VOVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gR0RUX01PVU5UOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhLT5oZHJbdF0uY2x1c3Rlcl90eXBlICYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xVU1RFUl9SRVNFUlZFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsdXN0ZXIgZHJpdmUgUkVTRVJWRUQgKG9uIHRoZSBvdGhlciBub2RlKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnBoYXNlID0gLTI7ICAgICAgLyogcmVzZXJ2YXRpb24gY29uZmxpY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9PSBHRFRfTU9VTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbdF0uY2x1c3Rlcl90eXBlIHw9IENMVVNURVJfTU9VTlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5oZHJbdF0ubWVkaWFfY2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kID09IEdEVF9VTk1PVU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSAmPSB+Q0xVU1RFUl9NT1VOVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5tZWRpYV9jaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHJldHJ5ICovCisgICAgICAgICAgICAgICAgc2NwLT5TQ3AudGhpc19yZXNpZHVhbCA9IEhJR0hfUFJJOworICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBSRVNFUlZFL1JFTEVBU0UgPyAqLworICAgICAgICAgICAgICAgIGlmIChzY3AtPmNtbmRbMF0gPT0gUkVTRVJWRSkgeworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSB8PSBDTFVTVEVSX1JFU0VSVkVEOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NwLT5jbW5kWzBdID09IFJFTEVBU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgJj0gfkNMVVNURVJfUkVTRVJWRUQ7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisgICAgICAgICAgICAgICAgc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NwLT5TQ3AuU3RhdHVzID0gaGEtPnN0YXR1czsKKyAgICAgICAgICAgIHNjcC0+U0NwLk1lc3NhZ2UgPSBoYS0+aW5mbzsKKworICAgICAgICAgICAgaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIFRSQUNFMigoImdkdGhfc3luY19ldmVudCgpOiBzcGVjaWFsIGNtZCAweCV4IGVycm9yIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQsIGhhLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5TQ3Auc2VudF9jb21tYW5kID09IEdEVF9TQ0FOX1NUQVJUIHx8CisgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnNlbnRfY29tbWFuZCA9PSBHRFRfU0NBTl9FTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gLTE7CisgICAgICAgICAgICAgICAgICAgIC8qIHJldHJ5ICovCisgICAgICAgICAgICAgICAgICAgIHNjcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBISUdIX1BSSTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopc2NwLT5zZW5zZV9idWZmZXIsMCwxNik7CisgICAgICAgICAgICAgICAgc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworICAgICAgICAgICAgICAgIHNjcC0+c2Vuc2VfYnVmZmVyWzJdID0gTk9UX1JFQURZOworICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlID09IENBQ0hFU0VSVklDRSkgeworICAgICAgICAgICAgICAgIGlmIChoYS0+c3RhdHVzID09IFNfQ0FDSEVfVU5LTk9XTiAmJgorICAgICAgICAgICAgICAgICAgICAoaGEtPmhkclt0XS5jbHVzdGVyX3R5cGUgJiAKKyAgICAgICAgICAgICAgICAgICAgIENMVVNURVJfUkVTRVJWRV9TVEFURSkgPT0gQ0xVU1RFUl9SRVNFUlZFX1NUQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGJ1cyByZXNldCAtPiBmb3JjZSBHRFRfQ0xVU1RfSU5GTyAqLworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW3RdLmNsdXN0ZXJfdHlwZSAmPSB+Q0xVU1RFUl9SRVNFUlZFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyKilzY3AtPnNlbnNlX2J1ZmZlciwwLDE2KTsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPnN0YXR1cyA9PSAodXNob3J0KVNfQ0FDSEVfUkVTRVJWKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoUkVTRVJWQVRJT05fQ09ORkxJQ1QgPDwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworICAgICAgICAgICAgICAgICAgICBzY3AtPnNlbnNlX2J1ZmZlclsyXSA9IE5PVF9SRUFEWTsKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChDSEVDS19DT05ESVRJT04gPDwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY3AtPmRvbmUgIT0gZ2R0aF9zY3NpX2RvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmR2ci5zaXplID0gc2l6ZW9mKGhhLT5kdnIuZXUuc3luYyk7CisgICAgICAgICAgICAgICAgICAgIGhhLT5kdnIuZXUuc3luYy5pb25vZGUgID0gaGFudW07CisgICAgICAgICAgICAgICAgICAgIGhhLT5kdnIuZXUuc3luYy5zZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmR2ci5ldS5zeW5jLnN0YXR1cyAgPSBoYS0+c3RhdHVzOworICAgICAgICAgICAgICAgICAgICBoYS0+ZHZyLmV1LnN5bmMuaW5mbyAgICA9IGhhLT5pbmZvOworICAgICAgICAgICAgICAgICAgICBoYS0+ZHZyLmV1LnN5bmMuaG9zdGRyaXZlID0gdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhLT5zdGF0dXMgPj0gMHg4MDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2R0aF9zdG9yZV9ldmVudChoYSwgRVNfU1lOQywgMCwgJmhhLT5kdnIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnZHRoX3N0b3JlX2V2ZW50KGhhLCBFU19TWU5DLCBzZXJ2aWNlLCAmaGEtPmR2cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzZW5zZSBidWZmZXIgZmlsbGVkIGZyb20gY29udHJvbGxlciBmaXJtd2FyZSAoRE1BKSAqLworICAgICAgICAgICAgICAgIGlmIChoYS0+c3RhdHVzICE9IFNfUkFXX1NDU0kgfHwgaGEtPmluZm8gPj0gMHgxMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgaGEtPmluZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKQorICAgICAgICAgICAgc2NwLT5TQ3AuaGF2ZV9kYXRhX2luKys7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmFzeW5jX2NhY2hlX3RhYltdID0geworLyogMCovICAiXDAxMVwwMDBcMDAyXDAwMlwwMDJcMDA0XDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBzZXJ2aWNlICV1LCBhc3luYy4gc3RhdHVzICV1LyVsdSB1bmtub3duIiwKKy8qIDEqLyAgIlwwMTFcMDAwXDAwMlwwMDJcMDAyXDAwNFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgc2VydmljZSAldSwgYXN5bmMuIHN0YXR1cyAldS8lbHUgdW5rbm93biIsCisvKiAyKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBEcml2ZSAlbHUgbm90IHJlYWR5IiwKKy8qIDMqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IERyaXZlICVsdTogUkVBU1NJR04gbm90IHN1Y2Nlc3NmdWwgYW5kL29yIGRhdGEgZXJyb3Igb24gcmVhc3NpZ25lZCBibG9ja3MuIERyaXZlIG1heSBjcmFzaCBpbiB0aGUgZnV0dXJlIGFuZCBzaG91bGQgYmUgcmVwbGFjZWQiLAorLyogNCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIG1pcnJvciB1cGRhdGUgb24gSG9zdCBEcml2ZSAlbHUgZmFpbGVkIiwKKy8qIDUqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBNaXJyb3IgRHJpdmUgJWx1IGZhaWxlZCIsCisvKiA2Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgTWlycm9yIERyaXZlICVsdTogUkVBU1NJR04gbm90IHN1Y2Nlc3NmdWwgYW5kL29yIGRhdGEgZXJyb3Igb24gcmVhc3NpZ25lZCBibG9ja3MuIERyaXZlIG1heSBjcmFzaCBpbiB0aGUgZnV0dXJlIGFuZCBzaG91bGQgYmUgcmVwbGFjZWQiLAorLyogNyovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIEhvc3QgRHJpdmUgJWx1IHdyaXRlIHByb3RlY3RlZCIsCisvKiA4Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgbWVkaWEgY2hhbmdlZCBpbiBIb3N0IERyaXZlICVsdSIsCisvKiA5Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBEcml2ZSAlbHUgaXMgb2ZmbGluZSIsCisvKjEwKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgbWVkaWEgY2hhbmdlIG9mIE1pcnJvciBEcml2ZSAlbHUiLAorLyoxMSovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIE1pcnJvciBEcml2ZSAlbHUgaXMgd3JpdGUgcHJvdGVjdGVkIiwKKy8qMTIqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDA0IgorICAgICAgICAiR0RUIEhBICV1LCBnZW5lcmFsIGVycm9yIG9uIEhvc3QgRHJpdmUgJWx1LiBQbGVhc2UgY2hlY2sgdGhlIGRldmljZXMgb2YgdGhpcyBkcml2ZSEiLAorLyoxMyovICAiXDAwN1wwMDBcMDAyXDAwNlwwMDJcMDEwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IENhY2hlIERyaXZlICV1IGZhaWxlZCIsCisvKjE0Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IEZBSUwgc3RhdGUgZW50ZXJlZCIsCisvKjE1Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGVycm9yIiwKKy8qMTYqLyAgIlwwMDdcMDAwXDAwMlwwMDZcMDAyXDAxMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBmYWlsZWQgZHJpdmUgcmVwbGFjZWQgYnkgQ2FjaGUgRHJpdmUgJXUiLAorLyoxNyovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgYnVpbGQgZmFpbGVkIiwKKy8qMTgqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZHJpdmUgcmVidWlsZCBmYWlsZWQiLAorLyoxOSovICAiXDAwNVwwMDBcMDAyXDAxMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIFRlc3Qgb2YgSG90IEZpeCAldSBmYWlsZWQiLAorLyoyMCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBkcml2ZSBidWlsZCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkiLAorLyoyMSovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBkcml2ZSByZWJ1aWxkIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSIsCisvKjIyKi8gICJcMDA3XDAwMFwwMDJcMDA2XDAwMlwwMTBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogSG90IEZpeCAldSBhY3RpdmF0ZWQiLAorLyoyMyovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEhvc3QgRHJpdmUgJXU6IHByb2Nlc3Npbmcgb2YgaS9vIGFib3J0ZWQgZHVlIHRvIHNlcmlvdXMgZHJpdmUgZXJyb3IiLAorLyoyNCovICAiXDAwNVwwMDBcMDAyXDAxMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIG1pcnJvciB1cGRhdGUgb24gQ2FjaGUgRHJpdmUgJXUgY29tcGxldGVkIiwKKy8qMjUqLyAgIlwwMDVcMDAwXDAwMlwwMTBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBtaXJyb3IgdXBkYXRlIG9uIENhY2hlIERyaXZlICVsdSBmYWlsZWQiLAorLyoyNiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBkcml2ZSByZWJ1aWxkIHN0YXJ0ZWQiLAorLyoyNyovICAiXDAwNVwwMDBcMDAyXDAxMlwwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldTogU0hFTEYgT0sgZGV0ZWN0ZWQiLAorLyoyOCovICAiXDAwNVwwMDBcMDAyXDAxMlwwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldTogU0hFTEYgbm90IE9LIGRldGVjdGVkIiwKKy8qMjkqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IEF1dG8gSG90IFBsdWcgc3RhcnRlZCIsCisvKjMwKi8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBuZXcgZGlzayBkZXRlY3RlZCIsCisvKjMxKi8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBvbGQgZGlzayBkZXRlY3RlZCIsCisvKjMyKi8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBwbHVnZ2luZyBhbiBhY3RpdmUgZGlzayBpcyBpbnZhbGlkIiwKKy8qMzMqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IGludmFsaWQgZGV2aWNlIGRldGVjdGVkIiwKKy8qMzQqLyAgIlwwMTFcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDFcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogaW5zdWZmaWNpZW50IGRpc2sgY2FwYWNpdHkgKCVsdSBNQiByZXF1aXJlZCkiLAorLyozNSovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogZGlzayB3cml0ZSBwcm90ZWN0ZWQiLAorLyozNiovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogZGlzayBub3QgYXZhaWxhYmxlIiwKKy8qMzcqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAwNlwwMDQiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldTogc3dhcCBkZXRlY3RlZCAoJWx1KSIsCisvKjM4Ki8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBBdXRvIEhvdCBQbHVnIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSIsCisvKjM5Ki8gICJcMDA3XDAwMFwwMDJcMDEyXDAwMVwwMTNcMDAxIgorICAgICAgICAiR0RUIEhBICV1LCBGYXVsdCBidXMgJXUsIElEICV1OiBBdXRvIEhvdCBQbHVnIGFib3J0ZWQgZHVlIHRvIHVzZXIgSG90IFBsdWciLAorLyo0MCovICAiXDAwN1wwMDBcMDAyXDAxMlwwMDFcMDEzXDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgRmF1bHQgYnVzICV1LCBJRCAldTogQXV0byBIb3QgUGx1ZyBhYm9ydGVkIiwKKy8qNDEqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIEZhdWx0IGJ1cyAldSwgSUQgJXU6IEF1dG8gSG90IFBsdWcgZm9yIEhvdCBGaXggc3RhcnRlZCIsCisvKjQyKi8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGRyaXZlIGJ1aWxkIHN0YXJ0ZWQiLAorLyo0MyovICAiXDAwM1wwMDBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBEUkFNIHBhcml0eSBlcnJvciBkZXRlY3RlZCIsCisvKjQ0Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgTWlycm9yIERyaXZlICV1OiB1cGRhdGUgc3RhcnRlZCIsCisvKjQ1Ki8gICJcMDA3XDAwMFwwMDJcMDA2XDAwMlwwMTBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBNaXJyb3IgRHJpdmUgJXU6IEhvdCBGaXggJXUgYWN0aXZhdGVkIiwKKy8qNDYqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogbm8gbWF0Y2hpbmcgUG9vbCBIb3QgRml4IERyaXZlIGF2YWlsYWJsZSIsCisvKjQ3Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IFBvb2wgSG90IEZpeCBEcml2ZSBhdmFpbGFibGUiLAorLyo0OCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIE1pcnJvciBEcml2ZSAldTogbm8gbWF0Y2hpbmcgUG9vbCBIb3QgRml4IERyaXZlIGF2YWlsYWJsZSIsCisvKjQ5Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgTWlycm9yIERyaXZlICV1OiBQb29sIEhvdCBGaXggRHJpdmUgYXZhaWxhYmxlIiwKKy8qNTAqLyAgIlwwMDdcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDEiCisgICAgICAgICJHRFQgSEEgJXUsIFNDU0kgYnVzICV1LCBJRCAldTogSUdOT1JFX1dJREVfUkVTSURVRSBtZXNzYWdlIHJlY2VpdmVkIiwKKy8qNTEqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZXhwYW5kIHN0YXJ0ZWQiLAorLyo1MiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBleHBhbmQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IiwKKy8qNTMqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZXhwYW5kIGZhaWxlZCIsCisvKjU0Ki8gICJcMDAzXDAwMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIENQVSB0ZW1wZXJhdHVyZSBjcml0aWNhbCIsCisvKjU1Ki8gICJcMDAzXDAwMFwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIENQVSB0ZW1wZXJhdHVyZSBPSyIsCisvKjU2Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwNCIKKyAgICAgICAgIkdEVCBIQSAldSwgSG9zdCBkcml2ZSAlbHUgY3JlYXRlZCIsCisvKjU3Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IGV4cGFuZCByZXN0YXJ0ZWQiLAorLyo1OCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBleHBhbmQgc3RvcHBlZCIsCisvKjU5Ki8gICJcMDA1XDAwMFwwMDJcMDEwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgTWlycm9yIERyaXZlICV1OiBkcml2ZSBidWlsZCBxdWl0ZWQiLAorLyo2MCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgYnVpbGQgcXVpdGVkIiwKKy8qNjEqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBBcnJheSBEcml2ZSAldTogZHJpdmUgcmVidWlsZCBxdWl0ZWQiLAorLyo2MiovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgdmVyaWZ5IHN0YXJ0ZWQiLAorLyo2MyovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgdmVyaWZ5IGRvbmUiLAorLyo2NCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEFycmF5IERyaXZlICV1OiBwYXJpdHkgdmVyaWZ5IGZhaWxlZCIsCisvKjY1Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IHBhcml0eSBlcnJvciBkZXRlY3RlZCIsCisvKjY2Ki8gICJcMDA1XDAwMFwwMDJcMDA2XDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgQXJyYXkgRHJpdmUgJXU6IHBhcml0eSB2ZXJpZnkgcXVpdGVkIiwKKy8qNjcqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IERyaXZlICV1IHJlc2VydmVkIiwKKy8qNjgqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IERyaXZlICV1IG1vdW50ZWQgYW5kIHJlbGVhc2VkIiwKKy8qNjkqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IERyaXZlICV1IHJlbGVhc2VkIiwKKy8qNzAqLyAgIlwwMDNcMDAwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgRFJBTSBlcnJvciBkZXRlY3RlZCBhbmQgY29ycmVjdGVkIHdpdGggRUNDIiwKKy8qNzEqLyAgIlwwMDNcMDAwXDAwMiIKKyAgICAgICAgIkdEVCBIQSAldSwgVW5jb3JyZWN0YWJsZSBEUkFNIGVycm9yIGRldGVjdGVkIHdpdGggRUNDIiwKKy8qNzIqLyAgIlwwMTFcMDAwXDAwMlwwMTJcMDAxXDAxM1wwMDFcMDE0XDAwMSIKKyAgICAgICAgIkdEVCBIQSAldSwgU0NTSSBidXMgJXUsIElEICV1LCBMVU4gJXU6IHJlYXNzaWduaW5nIGJsb2NrIiwKKy8qNzMqLyAgIlwwMDVcMDAwXDAwMlwwMDZcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBIb3N0IGRyaXZlICV1IHJlc2V0dGVkIGxvY2FsbHkiLAorLyo3NCovICAiXDAwNVwwMDBcMDAyXDAwNlwwMDIiCisgICAgICAgICJHRFQgSEEgJXUsIEhvc3QgZHJpdmUgJXUgcmVzZXR0ZWQgcmVtb3RlbHkiLAorLyo3NSovICAiXDAwM1wwMDBcMDAyIgorICAgICAgICAiR0RUIEhBICV1LCBhc3luYy4gc3RhdHVzIDc1IHVua25vd24iLAorfTsKKworCitzdGF0aWMgaW50IGdkdGhfYXN5bmNfZXZlbnQoaW50IGhhbnVtKQoreworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICBnZHRoX2NtZF9zdHIgKmNtZHA7CisgICAgaW50IGNtZF9pbmRleDsKKworICAgIGhhICA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBjbWRwPSBoYS0+cGNjYjsKKyAgICBUUkFDRTIoKCJnZHRoX2FzeW5jX2V2ZW50KCkgaGEgJWQgc2VydiAlZFxuIiwKKyAgICAgICAgICAgIGhhbnVtLGhhLT5zZXJ2aWNlKSk7CisKKyAgICBpZiAoaGEtPnNlcnZpY2UgPT0gU0NSRUVOU0VSVklDRSkgeworICAgICAgICBpZiAoaGEtPnN0YXR1cyA9PSBNU0dfUkVRVUVTVCkgeworICAgICAgICAgICAgd2hpbGUgKGdkdGhfdGVzdF9idXN5KGhhbnVtKSkKKyAgICAgICAgICAgICAgICBnZHRoX2RlbGF5KDApOworICAgICAgICAgICAgY21kcC0+U2VydmljZSAgICAgICA9IFNDUkVFTlNFUlZJQ0U7CisgICAgICAgICAgICBjbWRwLT5SZXF1ZXN0QnVmZmVyID0gU0NSRUVOX0NNTkQ7CisgICAgICAgICAgICBjbWRfaW5kZXggPSBnZHRoX2dldF9jbWRfaW5kZXgoaGFudW0pOworICAgICAgICAgICAgZ2R0aF9zZXRfc2VtYTAoaGFudW0pOworICAgICAgICAgICAgY21kcC0+T3BDb2RlICAgICAgICA9IEdEVF9SRUFEOworICAgICAgICAgICAgY21kcC0+Qm9hcmROb2RlICAgICA9IExPQ0FMQk9BUkQ7CisgICAgICAgICAgICBjbWRwLT51LnNjcmVlbi5yZXNlcnZlZCAgPSAwOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4uc3UubXNnLm1zZ19oYW5kbGU9IE1TR19JTlZfSEFORExFOworICAgICAgICAgICAgY21kcC0+dS5zY3JlZW4uc3UubXNnLm1zZ19hZGRyICA9IGhhLT5tc2dfcGh5czsKKyAgICAgICAgICAgIGhhLT5jbWRfb2Zmc19kcG1lbSA9IDA7CisgICAgICAgICAgICBoYS0+Y21kX2xlbiA9IEdEVE9GRlNPRihnZHRoX2NtZF9zdHIsdS5zY3JlZW4uc3UubXNnLm1zZ19hZGRyKSAKKyAgICAgICAgICAgICAgICArIHNpemVvZih1bG9uZzY0KTsKKyAgICAgICAgICAgIGhhLT5jbWRfY250ID0gMDsKKyAgICAgICAgICAgIGdkdGhfY29weV9jb21tYW5kKGhhbnVtKTsKKyAgICAgICAgICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkKKyAgICAgICAgICAgICAgICBwcmludGsoIltFSVNBIHNsb3QgJWRdICIsKHVzaG9ydCloYS0+YnJkX3BoeXMpOworICAgICAgICAgICAgZWxzZSBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSkKKyAgICAgICAgICAgICAgICBwcmludGsoIltEUE1FTSAweCU0WF0gIiwodXNob3J0KWhhLT5icmRfcGh5cyk7CisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgIHByaW50aygiW1BDSSAlZC8lZF0gIiwodXNob3J0KShoYS0+YnJkX3BoeXM+PjgpLAorICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSgoaGEtPmJyZF9waHlzPj4zKSYweDFmKSk7CisgICAgICAgICAgICBnZHRoX3JlbGVhc2VfZXZlbnQoaGFudW0pOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX1BDSU1QUiAmJiAKKyAgICAgICAgICAgIChoYS0+ZndfdmVycyAmIDB4ZmYpID49IDB4MWEpIHsKKyAgICAgICAgICAgIGhhLT5kdnIuc2l6ZSA9IDA7CisgICAgICAgICAgICBoYS0+ZHZyLmV1LmFzeW5jLmlvbm9kZSA9IGhhbnVtOworICAgICAgICAgICAgaGEtPmR2ci5ldS5hc3luYy5zdGF0dXMgID0gaGEtPnN0YXR1czsKKyAgICAgICAgICAgIC8qIHNldmVyaXR5IGFuZCBldmVudF9zdHJpbmcgYWxyZWFkeSBzZXQhICovCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAKKyAgICAgICAgICAgIGhhLT5kdnIuc2l6ZSA9IHNpemVvZihoYS0+ZHZyLmV1LmFzeW5jKTsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuYXN5bmMuaW9ub2RlICAgPSBoYW51bTsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuYXN5bmMuc2VydmljZSA9IGhhLT5zZXJ2aWNlOworICAgICAgICAgICAgaGEtPmR2ci5ldS5hc3luYy5zdGF0dXMgID0gaGEtPnN0YXR1czsKKyAgICAgICAgICAgIGhhLT5kdnIuZXUuYXN5bmMuaW5mbyAgICA9IGhhLT5pbmZvOworICAgICAgICAgICAgKih1bG9uZzMyICopaGEtPmR2ci5ldS5hc3luYy5zY3NpX2Nvb3JkICA9IGhhLT5pbmZvMjsKKyAgICAgICAgfQorICAgICAgICBnZHRoX3N0b3JlX2V2ZW50KCBoYSwgRVNfQVNZTkMsIGhhLT5zZXJ2aWNlLCAmaGEtPmR2ciApOworICAgICAgICBnZHRoX2xvZ19ldmVudCggJmhhLT5kdnIsIE5VTEwgKTsKKyAgICAKKyAgICAgICAgLyogbmV3IGhvc3QgZHJpdmUgZnJvbSBleHBhbmQ/ICovCisgICAgICAgIGlmIChoYS0+c2VydmljZSA9PSBDQUNIRVNFUlZJQ0UgJiYgaGEtPnN0YXR1cyA9PSA1NikgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9hc3luY19ldmVudCgpOiBuZXcgaG9zdCBkcml2ZSAlZCBjcmVhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAodXNob3J0KWhhLT5pbmZvKSk7CisgICAgICAgICAgICAvKiBnZHRoX2FuYWx5c2VfaGRyaXZlKGhhbnVtLCAodXNob3J0KWhhLT5pbmZvKTsgKi8KKyAgICAgICAgfSAgIAorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZ2R0aF9sb2dfZXZlbnQoZ2R0aF9ldnRfZGF0YSAqZHZyLCBjaGFyICpidWZmZXIpCit7CisgICAgZ2R0aF9zdGFja2ZyYW1lIHN0YWNrOworICAgIGNoYXIgKmYgPSBOVUxMOworICAgIGludCBpLGo7CisKKyAgICBUUkFDRTIoKCJnZHRoX2xvZ19ldmVudCgpXG4iKSk7CisgICAgaWYgKGR2ci0+c2l6ZSA9PSAwKSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRrKCJBZGFwdGVyICVkOiAlc1xuIixkdnItPmV1LmFzeW5jLmlvbm9kZSxkdnItPmV2ZW50X3N0cmluZyk7IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsIkFkYXB0ZXIgJWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIGR2ci0+ZXUuYXN5bmMuaW9ub2RlLGR2ci0+ZXZlbnRfc3RyaW5nKTsgCisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGR2ci0+ZXUuYXN5bmMuc2VydmljZSA9PSBDQUNIRVNFUlZJQ0UgJiYgCisgICAgICAgIElOREVYX09LKGR2ci0+ZXUuYXN5bmMuc3RhdHVzLCBhc3luY19jYWNoZV90YWIpKSB7CisgICAgICAgIFRSQUNFMigoIkdEVDogQXN5bmMuIGV2ZW50IGNhY2hlIHNlcnZpY2UsIGV2ZW50IG5vLjogJWRcbiIsCisgICAgICAgICAgICAgICAgZHZyLT5ldS5hc3luYy5zdGF0dXMpKTsKKyAgICAgICAgCisgICAgICAgIGYgPSBhc3luY19jYWNoZV90YWJbZHZyLT5ldS5hc3luYy5zdGF0dXNdOworICAgICAgICAKKyAgICAgICAgLyogaTogcGFyYW1ldGVyIHRvIHB1c2gsIGo6IHN0YWNrIGVsZW1lbnQgdG8gZmlsbCAqLworICAgICAgICBmb3IgKGo9MCxpPTE7IGkgPCBmWzBdOyBpKz0yKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGZbaSsxXSkgeworICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgc3RhY2suYltqKytdID0gKih1bG9uZzMyKikmZHZyLT5ldS5zdHJlYW1bKGludClmW2ldXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN0YWNrLmJbaisrXSA9ICoodXNob3J0KikmZHZyLT5ldS5zdHJlYW1bKGludClmW2ldXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHN0YWNrLmJbaisrXSA9ICoodW5jaGFyKikmZHZyLT5ldS5zdHJlYW1bKGludClmW2ldXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBwcmludGsoJmZbKGludClmWzBdXSxzdGFjayk7IAorICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsJmZbKGludClmWzBdXSxzdGFjayk7IAorICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RUIEhBICV1LCBVbmtub3duIGFzeW5jLiBldmVudCBzZXJ2aWNlICVkIGV2ZW50IG5vLiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBkdnItPmV1LmFzeW5jLmlvbm9kZSxkdnItPmV1LmFzeW5jLnNlcnZpY2UsZHZyLT5ldS5hc3luYy5zdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsIkdEVCBIQSAldSwgVW5rbm93biBhc3luYy4gZXZlbnQgc2VydmljZSAlZCBldmVudCBuby4gJWQiLAorICAgICAgICAgICAgICAgICAgICBkdnItPmV1LmFzeW5jLmlvbm9kZSxkdnItPmV1LmFzeW5jLnNlcnZpY2UsZHZyLT5ldS5hc3luYy5zdGF0dXMpOworICAgICAgICB9CisgICAgfQorfQorCisjaWZkZWYgR0RUSF9TVEFUSVNUSUNTCit2b2lkIGdkdGhfdGltZW91dCh1bG9uZyBkYXRhKQoreworICAgIHVsb25nMzIgaTsKKyAgICBTY3NpX0NtbmQgKm5zY3A7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIGludCBoYW51bSA9IDA7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBmb3IgKGFjdF9zdGF0cz0wLGk9MDsgaTxHRFRIX01BWENNRFM7ICsraSkgCisgICAgICAgIGlmIChoYS0+Y21kX3RhYltpXS5jbW5kICE9IFVOVVNFRF9DTU5EKQorICAgICAgICAgICAgKythY3Rfc3RhdHM7CisKKyAgICBmb3IgKGFjdF9ycT0wLG5zY3A9aGEtPnJlcV9maXJzdDsgbnNjcDsgbnNjcD0oU2NzaV9DbW5kKiluc2NwLT5TQ3AucHRyKQorICAgICAgICArK2FjdF9ycTsKKworICAgIFRSQUNFMigoImdkdGhfdG8oKTogaW50cyAlZCwgaW9zICVkLCBhY3Rfc3RhdHMgJWQsIGFjdF9ycSAlZFxuIiwKKyAgICAgICAgICAgIGFjdF9pbnRzLCBhY3RfaW9zLCBhY3Rfc3RhdHMsIGFjdF9ycSkpOworICAgIGFjdF9pbnRzID0gYWN0X2lvcyA9IDA7CisKKyAgICBnZHRoX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMzAgKiBIWjsKKyAgICBhZGRfdGltZXIoJmdkdGhfdGltZXIpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IGludGVybmFsX3NldHVwKGNoYXIgKnN0cixpbnQgKmludHMpCit7CisgICAgaW50IGksIGFyZ2M7CisgICAgY2hhciAqY3VyX3N0ciwgKmFyZ3Y7CisKKyAgICBUUkFDRTIoKCJpbnRlcm5hbF9zZXR1cCgpIHN0ciAlcyBpbnRzWzBdICVkXG4iLCAKKyAgICAgICAgICAgIHN0ciA/IHN0cjoiTlVMTCIsIGludHMgPyBpbnRzWzBdOjApKTsKKworICAgIC8qIHJlYWQgaXJxW10gZnJvbSBpbnRzW10gKi8KKyAgICBpZiAoaW50cykgeworICAgICAgICBhcmdjID0gaW50c1swXTsKKyAgICAgICAgaWYgKGFyZ2MgPiAwKSB7CisgICAgICAgICAgICBpZiAoYXJnYyA+IE1BWEhBKQorICAgICAgICAgICAgICAgIGFyZ2MgPSBNQVhIQTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpCisgICAgICAgICAgICAgICAgaXJxW2ldID0gaW50c1tpKzFdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYW5hbHlzZSBzdHJpbmcgKi8KKyAgICBhcmd2ID0gc3RyOworICAgIHdoaWxlIChhcmd2ICYmIChjdXJfc3RyID0gc3RyY2hyKGFyZ3YsICc6JykpKSB7CisgICAgICAgIGludCB2YWwgPSAwLCBjID0gKisrY3VyX3N0cjsKKyAgICAgICAgCisgICAgICAgIGlmIChjID09ICduJyB8fCBjID09ICdOJykKKyAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorICAgICAgICAgICAgdmFsID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsID0gKGludClzaW1wbGVfc3RydG91bChjdXJfc3RyLCBOVUxMLCAwKTsKKworICAgICAgICBpZiAoIXN0cm5jbXAoYXJndiwgImRpc2FibGU6IiwgOCkpCisgICAgICAgICAgICBkaXNhYmxlID0gdmFsOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChhcmd2LCAicmVzZXJ2ZV9tb2RlOiIsIDEzKSkKKyAgICAgICAgICAgIHJlc2VydmVfbW9kZSA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInJldmVyc2Vfc2NhbjoiLCAxMykpCisgICAgICAgICAgICByZXZlcnNlX3NjYW4gPSB2YWw7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGFyZ3YsICJoZHJfY2hhbm5lbDoiLCAxMikpCisgICAgICAgICAgICBoZHJfY2hhbm5lbCA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgIm1heF9pZHM6IiwgOCkpCisgICAgICAgICAgICBtYXhfaWRzID0gdmFsOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChhcmd2LCAicmVzY2FuOiIsIDcpKQorICAgICAgICAgICAgcmVzY2FuID0gdmFsOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChhcmd2LCAidmlydF9jdHI6IiwgOSkpCisgICAgICAgICAgICB2aXJ0X2N0ciA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInNoYXJlZF9hY2Nlc3M6IiwgMTQpKQorICAgICAgICAgICAgc2hhcmVkX2FjY2VzcyA9IHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXJndiwgInByb2JlX2Vpc2FfaXNhOiIsIDE1KSkKKyAgICAgICAgICAgIHByb2JlX2Vpc2FfaXNhID0gdmFsOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChhcmd2LCAicmVzZXJ2ZV9saXN0OiIsIDEzKSkgeworICAgICAgICAgICAgcmVzZXJ2ZV9saXN0WzBdID0gdmFsOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9SRVNfQVJHUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3VyX3N0ciA9IHN0cmNocihjdXJfc3RyLCAnLCcpOworICAgICAgICAgICAgICAgIGlmICghY3VyX3N0cikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KChpbnQpKisrY3VyX3N0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgLS1jdXJfc3RyOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc2VydmVfbGlzdFtpXSA9IAorICAgICAgICAgICAgICAgICAgICAoaW50KXNpbXBsZV9zdHJ0b3VsKGN1cl9zdHIsIE5VTEwsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjdXJfc3RyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYXJndiA9ICsrY3VyX3N0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChhcmd2ID0gc3RyY2hyKGFyZ3YsICcsJykpKQorICAgICAgICAgICAgKythcmd2OworICAgIH0KK30KKworaW50IF9faW5pdCBvcHRpb25fc2V0dXAoY2hhciAqc3RyKQoreworICAgIGludCBpbnRzW01BWEhBXTsKKyAgICBjaGFyICpjdXIgPSBzdHI7CisgICAgaW50IGkgPSAxOworCisgICAgVFJBQ0UyKCgib3B0aW9uX3NldHVwKCkgc3RyICVzXG4iLCBzdHIgPyBzdHI6Ik5VTEwiKSk7IAorCisgICAgd2hpbGUgKGN1ciAmJiBpc2RpZ2l0KCpjdXIpICYmIGkgPD0gTUFYSEEpIHsKKyAgICAgICAgaW50c1tpKytdID0gc2ltcGxlX3N0cnRvdWwoY3VyLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSAhPSBOVUxMKSBjdXIrKzsKKyAgICB9CisKKyAgICBpbnRzWzBdID0gaSAtIDE7CisgICAgaW50ZXJuYWxfc2V0dXAoY3VyLCBpbnRzKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IF9faW5pdCBnZHRoX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnNodHApCit7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqc2hwOworICAgIGdkdGhfcGNpX3N0ciBwY2lzdHJbTUFYSEFdOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZzMyIGlzYV9iaW9zOworICAgIHVzaG9ydCBlaXNhX3Nsb3Q7CisgICAgaW50IGksaGFudW0sY250LGN0cixlcnI7CisgICAgdW5jaGFyIGI7CisgICAgCisgCisjaWZkZWYgREVCVUdfR0RUSAorICAgIHByaW50aygiR0RUOiBUaGlzIGRyaXZlciBjb250YWlucyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gISEgVHJhY2UgbGV2ZWwgPSAlZFxuIiwKKyAgICAgICAgRGVidWdTdGF0ZSk7CisgICAgcHJpbnRrKCIgICAgIERlc3RpbmF0aW9uIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjogIik7CisjaWZkZWYgX19TRVJJQUxfXworI2lmZGVmIF9fQ09NMl9fCisgICAgcHJpbnRrKCJTZXJpYWwgcG9ydCBDT00yXG4iKTsKKyNlbHNlCisgICAgcHJpbnRrKCJTZXJpYWwgcG9ydCBDT00xXG4iKTsKKyNlbmRpZgorI2Vsc2UKKyAgICBwcmludGsoIkNvbnNvbGVcbiIpOworI2VuZGlmCisgICAgZ2R0aF9kZWxheSgzMDAwKTsKKyNlbmRpZgorCisgICAgVFJBQ0UoKCJnZHRoX2RldGVjdCgpXG4iKSk7CisKKyAgICBpZiAoZGlzYWJsZSkgeworICAgICAgICBwcmludGsoIkdEVC1IQTogQ29udHJvbGxlciBkcml2ZXIgZGlzYWJsZWQgZnJvbSBjb21tYW5kIGxpbmUgIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaW50aygiR0RULUhBOiBTdG9yYWdlIFJBSUQgQ29udHJvbGxlciBEcml2ZXIuIFZlcnNpb246ICVzIFxuIixHRFRIX1ZFUlNJT05fU1RSKTsKKyAgICAvKiBpbml0aWFsaXphdGlvbnMgKi8KKyAgICBnZHRoX3BvbGxpbmcgPSBUUlVFOyBiID0gMDsKKyAgICBnZHRoX2NsZWFyX2V2ZW50cygpOworCisgICAgLyogQXMgZGVmYXVsdCB3ZSBkbyBub3QgcHJvYmUgZm9yIEVJU0Egb3IgSVNBIGNvbnRyb2xsZXJzICovCisgICAgaWYgKHByb2JlX2Vpc2FfaXNhKSB7ICAgIAorICAgICAgICAvKiBzY2FubmluZyBmb3IgY29udHJvbGxlcnMsIGF0IGZpcnN0OiBJU0EgY29udHJvbGxlciAqLworICAgICAgICBmb3IgKGlzYV9iaW9zPTB4YzgwMDBVTDsgaXNhX2Jpb3M8PTB4ZDgwMDBVTDsgaXNhX2Jpb3MrPTB4ODAwMFVMKSB7CisgICAgICAgICAgICBkbWFfYWRkcl90IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyAgICAgICAgICAgIHNjcmF0Y2hfZG1hX2hhbmRsZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChnZHRoX2N0cl9jb3VudCA+PSBNQVhIQSkgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoZ2R0aF9zZWFyY2hfaXNhKGlzYV9iaW9zKSkgeyAgICAgICAgLyogY29udHJvbGxlciBmb3VuZCAqLworICAgICAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIoc2h0cCxzaXplb2YoZ2R0aF9leHRfc3RyKSk7CisgICAgICAgICAgICAgICAgaWYgKHNocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIAorCisgICAgICAgICAgICAgICAgaGEgPSBIQURBVEEoc2hwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdkdGhfaW5pdF9pc2EoaXNhX2Jpb3MsaGEpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgX19pYTY0X18KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBmb3VuZCBhbmQgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgICAgICAgICBwcmludGsoIkNvbmZpZ3VyaW5nIEdEVC1JU0EgSEEgYXQgQklPUyAweCUwNVggSVJRICV1IERSUSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNhX2Jpb3MsaGEtPmlycSxoYS0+ZHJxKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0X2lycShoYS0+aXJxLGdkdGhfaW50ZXJydXB0LFNBX0lOVEVSUlVQVCwiZ2R0aCIsaGEpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULUlTQTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7CisgICAgICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RfZG1hKGhhLT5kcnEsImdkdGgiKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1JU0E6IFVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbFxuIik7CisgICAgICAgICAgICAgICAgICAgIGZyZWVfaXJxKGhhLT5pcnEsaGEpOworICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldF9kbWFfbW9kZShoYS0+ZHJxLERNQV9NT0RFX0NBU0NBREUpOworICAgICAgICAgICAgICAgIGVuYWJsZV9kbWEoaGEtPmRycSk7CisgICAgICAgICAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSA9IDE7CisgICAgICAgICAgICAgICAgc2hwLT5pcnEgPSBoYS0+aXJxOworICAgICAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSBoYS0+ZHJxOworICAgICAgICAgICAgICAgIGhhbnVtID0gZ2R0aF9jdHJfY291bnQ7ICAgICAgICAgCisgICAgICAgICAgICAgICAgZ2R0aF9jdHJfdGFiW2dkdGhfY3RyX2NvdW50KytdID0gc2hwOworICAgICAgICAgICAgICAgIGdkdGhfY3RyX3Z0YWJbZ2R0aF9jdHJfdmNvdW50KytdID0gc2hwOworCisgICAgICAgICAgICAgICAgTlVNREFUQShzaHApLT5oYW51bSA9ICh1c2hvcnQpaGFudW07CisgICAgICAgICAgICAgICAgTlVNREFUQShzaHApLT5idXNudW09IDA7CisKKyAgICAgICAgICAgICAgICBoYS0+cGNjYiA9IENNRERBVEEoc2hwKTsKKyAgICAgICAgICAgICAgICBoYS0+Y2NiX3BoeXMgPSAwTDsKKyAgICAgICAgICAgICAgICBoYS0+cGRldiA9IE5VTEw7CisgICAgICAgICAgICAgICAgaGEtPnBzY3JhdGNoID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIEdEVEhfU0NSQVRDSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2hfZG1hX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaGEtPnNjcmF0Y2hfcGh5cyA9IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyAgICAgICAgICAgICAgICBoYS0+cG1zZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9tc2dfc3RyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBoYS0+bXNnX3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgICAgICAgICBoYS0+Y29hbF9zdGF0ID0gKGdkdGhfY29hbF9zdGF0dXMgKikKKyAgICAgICAgICAgICAgICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBNQVhPRkZTRVRTLCAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBoYS0+Y29hbF9zdGF0X3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGhhLT5zY3JhdGNoX2J1c3kgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBoYS0+cmVxX2ZpcnN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBoYS0+dGlkX2NudCA9IE1BWF9IRFJJVkVTOworICAgICAgICAgICAgICAgIGlmIChtYXhfaWRzID4gMCAmJiBtYXhfaWRzIDwgaGEtPnRpZF9jbnQpCisgICAgICAgICAgICAgICAgICAgIGhhLT50aWRfY250ID0gbWF4X2lkczsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxHRFRIX01BWENNRFM7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaGEtPmNtZF90YWJbaV0uY21uZCA9IFVOVVNFRF9DTU5EOworICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUgPSByZXNjYW4gPyAweDEwIDogMDsKKworICAgICAgICAgICAgICAgIGlmIChoYS0+cHNjcmF0Y2ggPT0gTlVMTCB8fCBoYS0+cG1zZyA9PSBOVUxMIHx8IAorICAgICAgICAgICAgICAgICAgICAhZ2R0aF9zZWFyY2hfZHJpdmVzKGhhbnVtKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1JU0E6IEVycm9yIGR1cmluZyBkZXZpY2Ugc2NhblxuIik7CisgICAgICAgICAgICAgICAgICAgIC0tZ2R0aF9jdHJfY291bnQ7CisgICAgICAgICAgICAgICAgICAgIC0tZ2R0aF9jdHJfdmNvdW50OworCisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhLT5jb2FsX3N0YXQpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9jb2FsX3N0YXR1cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhPRkZTRVRTLCBoYS0+Y29hbF9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+Y29hbF9zdGF0X3BoeXMpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+cHNjcmF0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBHRFRIX1NDUkFUQ0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+cHNjcmF0Y2gsIGhhLT5zY3JhdGNoX3BoeXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGEtPnBtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9tc2dfc3RyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5wbXNnLCBoYS0+bXNnX3BoeXMpOworCisgICAgICAgICAgICAgICAgICAgIGZyZWVfaXJxKGhhLT5pcnEsaGEpOworICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZHJfY2hhbm5lbCA8IDAgfHwgaGRyX2NoYW5uZWwgPiBoYS0+YnVzX2NudCkKKyAgICAgICAgICAgICAgICAgICAgaGRyX2NoYW5uZWwgPSBoYS0+YnVzX2NudDsKKyAgICAgICAgICAgICAgICBoYS0+dmlydF9idXMgPSBoZHJfY2hhbm5lbDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjApICYmIFwKKyAgICBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgICAgICBzaHAtPmhpZ2htZW1faW8gID0gMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIGhhLT5yYXdfZmVhdCAmIGhhLT5zY3JlZW5fZmVhdCAmIEdEVF82NEJJVCkgCisgICAgICAgICAgICAgICAgICAgIHNocC0+bWF4X2NtZF9sZW4gPSAxNjsKKworICAgICAgICAgICAgICAgIHNocC0+bWF4X2lkICAgICAgPSBoYS0+dGlkX2NudDsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9sdW4gICAgID0gTUFYTFVOOworICAgICAgICAgICAgICAgIHNocC0+bWF4X2NoYW5uZWwgPSB2aXJ0X2N0ciA/IDAgOiBoYS0+YnVzX2NudDsKKyAgICAgICAgICAgICAgICBpZiAodmlydF9jdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlydF9jdHIgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciBhZGRpdC4gU0NTSSBjaGFubmVscyBhcyB2aXJ0dWFsIGNvbnRyb2xsZXJzICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDE7IGIgPCBoYS0+YnVzX2NudCArIDE7ICsrYikgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hwID0gc2NzaV9yZWdpc3RlcihzaHRwLHNpemVvZihnZHRoX251bV9zdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc2hwLT5pcnEgPSBoYS0+aXJxOworICAgICAgICAgICAgICAgICAgICAgICAgc2hwLT5kbWFfY2hhbm5lbCA9IGhhLT5kcnE7CisgICAgICAgICAgICAgICAgICAgICAgICBnZHRoX2N0cl92dGFiW2dkdGhfY3RyX3Zjb3VudCsrXSA9IHNocDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+aGFudW0gPSAodXNob3J0KWhhbnVtOworICAgICAgICAgICAgICAgICAgICAgICAgTlVNREFUQShzaHApLT5idXNudW0gPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAgCisKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaW5pdCgmaGEtPnNtcF9sb2NrKTsKKyAgICAgICAgICAgICAgICBnZHRoX2VuYWJsZV9pbnQoaGFudW0pOworI2VuZGlmIC8qICFfX2lhNjRfXyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc2Nhbm5pbmcgZm9yIEVJU0EgY29udHJvbGxlcnMgKi8KKyAgICAgICAgZm9yIChlaXNhX3Nsb3Q9MHgxMDAwOyBlaXNhX3Nsb3Q8PTB4ODAwMDsgZWlzYV9zbG90Kz0weDEwMDApIHsKKyAgICAgICAgICAgIGRtYV9hZGRyX3Qgc2NyYXRjaF9kbWFfaGFuZGxlOworICAgICAgICAgICAgc2NyYXRjaF9kbWFfaGFuZGxlID0gMDsKKworICAgICAgICAgICAgaWYgKGdkdGhfY3RyX2NvdW50ID49IE1BWEhBKSAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChnZHRoX3NlYXJjaF9laXNhKGVpc2Ffc2xvdCkpIHsgICAgICAvKiBjb250cm9sbGVyIGZvdW5kICovCisgICAgICAgICAgICAgICAgc2hwID0gc2NzaV9yZWdpc3RlcihzaHRwLHNpemVvZihnZHRoX2V4dF9zdHIpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgCisKKyAgICAgICAgICAgICAgICBoYSA9IEhBREFUQShzaHApOworICAgICAgICAgICAgICAgIGlmICghZ2R0aF9pbml0X2Vpc2EoZWlzYV9zbG90LGhhKSkgeworICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgZm91bmQgYW5kIGluaXRpYWxpemVkICovCisgICAgICAgICAgICAgICAgcHJpbnRrKCJDb25maWd1cmluZyBHRFQtRUlTQSBIQSBhdCBTbG90ICVkIElSUSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZWlzYV9zbG90Pj4xMixoYS0+aXJxKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0X2lycShoYS0+aXJxLGdkdGhfaW50ZXJydXB0LFNBX0lOVEVSUlVQVCwiZ2R0aCIsaGEpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULUVJU0E6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworICAgICAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEgPSAwOworICAgICAgICAgICAgICAgIHNocC0+aXJxID0gaGEtPmlycTsKKyAgICAgICAgICAgICAgICBzaHAtPmRtYV9jaGFubmVsID0gMHhmZjsKKyAgICAgICAgICAgICAgICBoYW51bSA9IGdkdGhfY3RyX2NvdW50OworICAgICAgICAgICAgICAgIGdkdGhfY3RyX3RhYltnZHRoX2N0cl9jb3VudCsrXSA9IHNocDsKKyAgICAgICAgICAgICAgICBnZHRoX2N0cl92dGFiW2dkdGhfY3RyX3Zjb3VudCsrXSA9IHNocDsKKworICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+aGFudW0gPSAodXNob3J0KWhhbnVtOworICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+YnVzbnVtPSAwOworICAgICAgICAgICAgICAgIFRSQUNFMigoIkVJU0EgZGV0ZWN0IEJ1cyAwOiBoYW51bSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+aGFudW0pKTsKKworICAgICAgICAgICAgICAgIGhhLT5wY2NiID0gQ01EREFUQShzaHApOworICAgICAgICAgICAgICAgIGhhLT5jY2JfcGh5cyA9IDBMOyAKKworICAgICAgICAgICAgICAgIGhhLT5wZGV2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBoYS0+cHNjcmF0Y2ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgR0RUSF9TQ1JBVENILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBoYS0+c2NyYXRjaF9waHlzID0gc2NyYXRjaF9kbWFfaGFuZGxlOworICAgICAgICAgICAgICAgIGhhLT5wbXNnID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX21zZ19zdHIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoX2RtYV9oYW5kbGUpOworICAgICAgICAgICAgICAgIGhhLT5tc2dfcGh5cyA9IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyNpZmRlZiBJTlRfQ09BTAorICAgICAgICAgICAgICAgIGhhLT5jb2FsX3N0YXQgPSAoZ2R0aF9jb2FsX3N0YXR1cyAqKQorICAgICAgICAgICAgICAgICAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfY29hbF9zdGF0dXMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYT0ZGU0VUUywgJnNjcmF0Y2hfZG1hX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaGEtPmNvYWxfc3RhdF9waHlzID0gc2NyYXRjaF9kbWFfaGFuZGxlOworI2VuZGlmCisgICAgICAgICAgICAgICAgaGEtPmNjYl9waHlzID0gCisgICAgICAgICAgICAgICAgICAgIHBjaV9tYXBfc2luZ2xlKGhhLT5wZGV2LGhhLT5wY2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2R0aF9jbWRfc3RyKSxQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworICAgICAgICAgICAgICAgIGhhLT5zY3JhdGNoX2J1c3kgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBoYS0+cmVxX2ZpcnN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBoYS0+dGlkX2NudCA9IE1BWF9IRFJJVkVTOworICAgICAgICAgICAgICAgIGlmIChtYXhfaWRzID4gMCAmJiBtYXhfaWRzIDwgaGEtPnRpZF9jbnQpCisgICAgICAgICAgICAgICAgICAgIGhhLT50aWRfY250ID0gbWF4X2lkczsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxHRFRIX01BWENNRFM7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaGEtPmNtZF90YWJbaV0uY21uZCA9IFVOVVNFRF9DTU5EOworICAgICAgICAgICAgICAgIGhhLT5zY2FuX21vZGUgPSByZXNjYW4gPyAweDEwIDogMDsKKworICAgICAgICAgICAgICAgIGlmIChoYS0+cHNjcmF0Y2ggPT0gTlVMTCB8fCBoYS0+cG1zZyA9PSBOVUxMIHx8IAorICAgICAgICAgICAgICAgICAgICAhZ2R0aF9zZWFyY2hfZHJpdmVzKGhhbnVtKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIkdEVC1FSVNBOiBFcnJvciBkdXJpbmcgZGV2aWNlIHNjYW5cbiIpOworICAgICAgICAgICAgICAgICAgICAtLWdkdGhfY3RyX2NvdW50OworICAgICAgICAgICAgICAgICAgICAtLWdkdGhfY3RyX3Zjb3VudDsKKyNpZmRlZiBJTlRfQ09BTAorICAgICAgICAgICAgICAgICAgICBpZiAoaGEtPmNvYWxfc3RhdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWE9GRlNFVFMsIGhhLT5jb2FsX3N0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5jb2FsX3N0YXRfcGh5cyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhLT5wc2NyYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIEdEVEhfU0NSQVRDSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5wc2NyYXRjaCwgaGEtPnNjcmF0Y2hfcGh5cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+cG1zZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX21zZ19zdHIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnBtc2csIGhhLT5tc2dfcGh5cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYS0+Y2NiX3BoeXMpCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKGhhLT5wZGV2LGhhLT5jY2JfcGh5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2R0aF9jbWRfc3RyKSxQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShoYS0+aXJxLGhhKTsKKyAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGRyX2NoYW5uZWwgPCAwIHx8IGhkcl9jaGFubmVsID4gaGEtPmJ1c19jbnQpCisgICAgICAgICAgICAgICAgICAgIGhkcl9jaGFubmVsID0gaGEtPmJ1c19jbnQ7CisgICAgICAgICAgICAgICAgaGEtPnZpcnRfYnVzID0gaGRyX2NoYW5uZWw7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSAmJiBcCisgICAgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICAgICAgc2hwLT5oaWdobWVtX2lvICA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBoYS0+cmF3X2ZlYXQgJiBoYS0+c2NyZWVuX2ZlYXQgJiBHRFRfNjRCSVQpIAorICAgICAgICAgICAgICAgICAgICBzaHAtPm1heF9jbWRfbGVuID0gMTY7CisKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9pZCAgICAgID0gaGEtPnRpZF9jbnQ7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfbHVuICAgICA9IE1BWExVTjsKKyAgICAgICAgICAgICAgICBzaHAtPm1heF9jaGFubmVsID0gdmlydF9jdHIgPyAwIDogaGEtPmJ1c19jbnQ7CisgICAgICAgICAgICAgICAgaWYgKHZpcnRfY3RyKSB7CisgICAgICAgICAgICAgICAgICAgIHZpcnRfY3RyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgYWRkaXQuIFNDU0kgY2hhbm5lbHMgYXMgdmlydHVhbCBjb250cm9sbGVycyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSAxOyBiIDwgaGEtPmJ1c19jbnQgKyAxOyArK2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIoc2h0cCxzaXplb2YoZ2R0aF9udW1fc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocC0+aXJxID0gaGEtPmlycTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgZ2R0aF9jdHJfdnRhYltnZHRoX2N0cl92Y291bnQrK10gPSBzaHA7CisgICAgICAgICAgICAgICAgICAgICAgICBOVU1EQVRBKHNocCktPmhhbnVtID0gKHVzaG9ydCloYW51bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+YnVzbnVtID0gYjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gIAorCisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmhhLT5zbXBfbG9jayk7CisgICAgICAgICAgICAgICAgZ2R0aF9lbmFibGVfaW50KGhhbnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNjYW5uaW5nIGZvciBQQ0kgY29udHJvbGxlcnMgKi8KKyAgICBjbnQgPSBnZHRoX3NlYXJjaF9wY2kocGNpc3RyKTsKKyAgICBwcmludGsoIkdEVC1IQTogRm91bmQgJWQgUENJIFN0b3JhZ2UgUkFJRCBDb250cm9sbGVyc1xuIixjbnQpOworICAgIGdkdGhfc29ydF9wY2kocGNpc3RyLGNudCk7CisgICAgZm9yIChjdHIgPSAwOyBjdHIgPCBjbnQ7ICsrY3RyKSB7CisgICAgICAgIGRtYV9hZGRyX3Qgc2NyYXRjaF9kbWFfaGFuZGxlOworICAgICAgICBzY3JhdGNoX2RtYV9oYW5kbGUgPSAwOworCisgICAgICAgIGlmIChnZHRoX2N0cl9jb3VudCA+PSBNQVhIQSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzaHAgPSBzY3NpX3JlZ2lzdGVyKHNodHAsc2l6ZW9mKGdkdGhfZXh0X3N0cikpOworICAgICAgICBpZiAoc2hwID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsgIAorCisgICAgICAgIGhhID0gSEFEQVRBKHNocCk7CisgICAgICAgIGlmICghZ2R0aF9pbml0X3BjaSgmcGNpc3RyW2N0cl0saGEpKSB7CisgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIGNvbnRyb2xsZXIgZm91bmQgYW5kIGluaXRpYWxpemVkICovCisgICAgICAgIHByaW50aygiQ29uZmlndXJpbmcgR0RULVBDSSBIQSBhdCAlZC8lZCBJUlEgJXVcbiIsCisgICAgICAgICAgICAgICBwY2lzdHJbY3RyXS5idXMsUENJX1NMT1QocGNpc3RyW2N0cl0uZGV2aWNlX2ZuKSxoYS0+aXJxKTsKKworICAgICAgICBpZiAocmVxdWVzdF9pcnEoaGEtPmlycSwgZ2R0aF9pbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgICAgICBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJnZHRoIiwgaGEpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkdEVC1QQ0k6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gMDsKKyAgICAgICAgc2hwLT5pcnEgPSBoYS0+aXJxOworICAgICAgICBzaHAtPmRtYV9jaGFubmVsID0gMHhmZjsKKyAgICAgICAgaGFudW0gPSBnZHRoX2N0cl9jb3VudDsKKyAgICAgICAgZ2R0aF9jdHJfdGFiW2dkdGhfY3RyX2NvdW50KytdID0gc2hwOworICAgICAgICBnZHRoX2N0cl92dGFiW2dkdGhfY3RyX3Zjb3VudCsrXSA9IHNocDsKKworICAgICAgICBOVU1EQVRBKHNocCktPmhhbnVtID0gKHVzaG9ydCloYW51bTsKKyAgICAgICAgTlVNREFUQShzaHApLT5idXNudW09IDA7CisKKyAgICAgICAgaGEtPnBjY2IgPSBDTUREQVRBKHNocCk7CisgICAgICAgIGhhLT5jY2JfcGh5cyA9IDBMOworCisgICAgICAgIGhhLT5wc2NyYXRjaCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LCBHRFRIX1NDUkFUQ0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9kbWFfaGFuZGxlKTsKKyAgICAgICAgaGEtPnNjcmF0Y2hfcGh5cyA9IHNjcmF0Y2hfZG1hX2hhbmRsZTsKKyAgICAgICAgaGEtPnBtc2cgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfbXNnX3N0ciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoX2RtYV9oYW5kbGUpOworICAgICAgICBoYS0+bXNnX3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgaGEtPmNvYWxfc3RhdCA9IChnZHRoX2NvYWxfc3RhdHVzICopCisgICAgICAgICAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZW9mKGdkdGhfY29hbF9zdGF0dXMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWE9GRlNFVFMsICZzY3JhdGNoX2RtYV9oYW5kbGUpOworICAgICAgICBoYS0+Y29hbF9zdGF0X3BoeXMgPSBzY3JhdGNoX2RtYV9oYW5kbGU7CisjZW5kaWYKKyAgICAgICAgaGEtPnNjcmF0Y2hfYnVzeSA9IEZBTFNFOworICAgICAgICBoYS0+cmVxX2ZpcnN0ID0gTlVMTDsKKyAgICAgICAgaGEtPnRpZF9jbnQgPSBwY2lzdHJbY3RyXS5kZXZpY2VfaWQgPj0gMHgyMDAgPyBNQVhJRCA6IE1BWF9IRFJJVkVTOworICAgICAgICBpZiAobWF4X2lkcyA+IDAgJiYgbWF4X2lkcyA8IGhhLT50aWRfY250KQorICAgICAgICAgICAgaGEtPnRpZF9jbnQgPSBtYXhfaWRzOworICAgICAgICBmb3IgKGk9MDsgaTxHRFRIX01BWENNRFM7ICsraSkKKyAgICAgICAgICAgIGhhLT5jbWRfdGFiW2ldLmNtbmQgPSBVTlVTRURfQ01ORDsKKyAgICAgICAgaGEtPnNjYW5fbW9kZSA9IHJlc2NhbiA/IDB4MTAgOiAwOworCisgICAgICAgIGVyciA9IEZBTFNFOworICAgICAgICBpZiAoaGEtPnBzY3JhdGNoID09IE5VTEwgfHwgaGEtPnBtc2cgPT0gTlVMTCB8fCAKKyAgICAgICAgICAgICFnZHRoX3NlYXJjaF9kcml2ZXMoaGFudW0pKSB7CisgICAgICAgICAgICBlcnIgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGhkcl9jaGFubmVsIDwgMCB8fCBoZHJfY2hhbm5lbCA+IGhhLT5idXNfY250KQorICAgICAgICAgICAgICAgIGhkcl9jaGFubmVsID0gaGEtPmJ1c19jbnQ7CisgICAgICAgICAgICBoYS0+dmlydF9idXMgPSBoZHJfY2hhbm5lbDsKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgc2NzaV9zZXRfZGV2aWNlKHNocCwgJnBjaXN0cltjdHJdLnBkZXYtPmRldik7CisjZWxzZQorICAgICAgICAgICAgc2NzaV9zZXRfcGNpX2RldmljZShzaHAsIHBjaXN0cltjdHJdLnBkZXYpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoIShoYS0+Y2FjaGVfZmVhdCAmIGhhLT5yYXdfZmVhdCAmIGhhLT5zY3JlZW5fZmVhdCAmR0RUXzY0QklUKXx8CisgICAgICAgICAgICAgICAgLyogNjQtYml0IERNQSBvbmx5IHN1cHBvcnRlZCBmcm9tIEZXID49IHguNDMgKi8KKyAgICAgICAgICAgICAgICAoIWhhLT5kbWE2NF9zdXBwb3J0KSkgeworICAgICAgICAgICAgICAgIGlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaXN0cltjdHJdLnBkZXYsIDB4ZmZmZmZmZmYpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkdEVC1QQ0kgJWQ6IFVuYWJsZSB0byBzZXQgMzItYml0IERNQVxuIiwgaGFudW0pOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hwLT5tYXhfY21kX2xlbiA9IDE2OworICAgICAgICAgICAgICAgIGlmICghcGNpX3NldF9kbWFfbWFzayhwY2lzdHJbY3RyXS5wZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiR0RULVBDSSAlZDogNjQtYml0IERNQSBlbmFibGVkXG4iLCBoYW51bSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaXN0cltjdHJdLnBkZXYsIDB4ZmZmZmZmZmYpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkdEVC1QQ0kgJWQ6IFVuYWJsZSB0byBzZXQgNjQvMzItYml0IERNQVxuIiwgaGFudW0pOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIHByaW50aygiR0RULVBDSSAlZDogRXJyb3IgZHVyaW5nIGRldmljZSBzY2FuXG4iLCBoYW51bSk7CisgICAgICAgICAgICAtLWdkdGhfY3RyX2NvdW50OworICAgICAgICAgICAgLS1nZHRoX2N0cl92Y291bnQ7CisjaWZkZWYgSU5UX0NPQUwKKyAgICAgICAgICAgIGlmIChoYS0+Y29hbF9zdGF0KQorICAgICAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhPRkZTRVRTLCBoYS0+Y29hbF9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPmNvYWxfc3RhdF9waHlzKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGhhLT5wc2NyYXRjaCkKKyAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBHRFRIX1NDUkFUQ0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnBzY3JhdGNoLCBoYS0+c2NyYXRjaF9waHlzKTsKKyAgICAgICAgICAgIGlmIChoYS0+cG1zZykKKyAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCBzaXplb2YoZ2R0aF9tc2dfc3RyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYS0+cG1zZywgaGEtPm1zZ19waHlzKTsKKyAgICAgICAgICAgIGZyZWVfaXJxKGhhLT5pcnEsaGEpOworICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNocC0+bWF4X2lkICAgICAgPSBoYS0+dGlkX2NudDsKKyAgICAgICAgc2hwLT5tYXhfbHVuICAgICA9IE1BWExVTjsKKyAgICAgICAgc2hwLT5tYXhfY2hhbm5lbCA9IHZpcnRfY3RyID8gMCA6IGhhLT5idXNfY250OworICAgICAgICBpZiAodmlydF9jdHIpIHsKKyAgICAgICAgICAgIHZpcnRfY3RyID0gMTsKKyAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGFkZGl0LiBTQ1NJIGNoYW5uZWxzIGFzIHZpcnR1YWwgY29udHJvbGxlcnMgKi8KKyAgICAgICAgICAgIGZvciAoYiA9IDE7IGIgPCBoYS0+YnVzX2NudCArIDE7ICsrYikgeworICAgICAgICAgICAgICAgIHNocCA9IHNjc2lfcmVnaXN0ZXIoc2h0cCxzaXplb2YoZ2R0aF9udW1fc3RyKSk7CisgICAgICAgICAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7CisgICAgICAgICAgICAgICAgc2hwLT5pcnEgPSBoYS0+aXJxOworICAgICAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSAweGZmOworICAgICAgICAgICAgICAgIGdkdGhfY3RyX3Z0YWJbZ2R0aF9jdHJfdmNvdW50KytdID0gc2hwOworICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+aGFudW0gPSAodXNob3J0KWhhbnVtOworICAgICAgICAgICAgICAgIE5VTURBVEEoc2hwKS0+YnVzbnVtID0gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgCisKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmhhLT5zbXBfbG9jayk7CisgICAgICAgIGdkdGhfZW5hYmxlX2ludChoYW51bSk7CisgICAgfQorICAgIAorICAgIFRSQUNFMigoImdkdGhfZGV0ZWN0KCkgJWQgY29udHJvbGxlciBkZXRlY3RlZFxuIixnZHRoX2N0cl9jb3VudCkpOworICAgIGlmIChnZHRoX2N0cl9jb3VudCA+IDApIHsKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9kZXRlY3QoKTogSW5pdGlhbGl6aW5nIHRpbWVyICFcbiIpKTsKKyAgICAgICAgaW5pdF90aW1lcigmZ2R0aF90aW1lcik7CisgICAgICAgIGdkdGhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICAgICAgZ2R0aF90aW1lci5kYXRhID0gMEw7CisgICAgICAgIGdkdGhfdGltZXIuZnVuY3Rpb24gPSBnZHRoX3RpbWVvdXQ7CisgICAgICAgIGFkZF90aW1lcigmZ2R0aF90aW1lcik7CisjZW5kaWYKKyAgICAgICAgbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwiZ2R0aCIsJmdkdGhfZm9wcyk7CisgICAgICAgIHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZ2R0aF9ub3RpZmllcik7CisgICAgfQorICAgIGdkdGhfcG9sbGluZyA9IEZBTFNFOworICAgIHJldHVybiBnZHRoX2N0cl92Y291bnQ7Cit9CisKKworaW50IGdkdGhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHApCit7CisgICAgaW50IGhhbnVtOworICAgIGdkdGhfaGFfc3RyICpoYTsKKworICAgIFRSQUNFMigoImdkdGhfcmVsZWFzZSgpXG4iKSk7CisgICAgaWYgKE5VTURBVEEoc2hwKS0+YnVzbnVtID09IDApIHsKKyAgICAgICAgaGFudW0gPSBOVU1EQVRBKHNocCktPmhhbnVtOworICAgICAgICBoYSAgICA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICAgICAgaWYgKGhhLT5zZGV2KSB7CisgICAgICAgICAgICBzY3NpX2ZyZWVfaG9zdF9kZXYoaGEtPnNkZXYpOworICAgICAgICAgICAgaGEtPnNkZXYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGdkdGhfZmx1c2goaGFudW0pOworCisgICAgICAgIGlmIChzaHAtPmlycSkgeworICAgICAgICAgICAgZnJlZV9pcnEoc2hwLT5pcnEsaGEpOworICAgICAgICB9CisjaWZuZGVmIF9faWE2NF9fCisgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IDB4ZmYpIHsKKyAgICAgICAgICAgIGZyZWVfZG1hKHNocC0+ZG1hX2NoYW5uZWwpOworICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBJTlRfQ09BTAorICAgICAgICBpZiAoaGEtPmNvYWxfc3RhdCkKKyAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX2NvYWxfc3RhdHVzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWE9GRlNFVFMsIGhhLT5jb2FsX3N0YXQsIGhhLT5jb2FsX3N0YXRfcGh5cyk7CisjZW5kaWYKKyAgICAgICAgaWYgKGhhLT5wc2NyYXRjaCkKKyAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIEdEVEhfU0NSQVRDSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhLT5wc2NyYXRjaCwgaGEtPnNjcmF0Y2hfcGh5cyk7CisgICAgICAgIGlmIChoYS0+cG1zZykKKyAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemVvZihnZHRoX21zZ19zdHIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnBtc2csIGhhLT5tc2dfcGh5cyk7CisgICAgICAgIGlmIChoYS0+Y2NiX3BoeXMpCisgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKGhhLT5wZGV2LGhhLT5jY2JfcGh5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdkdGhfY21kX3N0ciksUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKyAgICAgICAgZ2R0aF9jdHJfcmVsZWFzZWQrKzsKKyAgICAgICAgVFJBQ0UyKCgiZ2R0aF9yZWxlYXNlKCk6IEhBICVkIG9mICVkXG4iLCAKKyAgICAgICAgICAgICAgICBnZHRoX2N0cl9yZWxlYXNlZCwgZ2R0aF9jdHJfY291bnQpKTsKKworICAgICAgICBpZiAoZ2R0aF9jdHJfcmVsZWFzZWQgPT0gZ2R0aF9jdHJfY291bnQpIHsKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgIGRlbF90aW1lcigmZ2R0aF90aW1lcik7CisjZW5kaWYKKyAgICAgICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCJnZHRoIik7CisgICAgICAgICAgICB1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZ2R0aF9ub3RpZmllcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKKyAgICByZXR1cm4gMDsKK30KKyAgICAgICAgICAgIAorCitzdGF0aWMgY29uc3QgY2hhciAqZ2R0aF9jdHJfbmFtZShpbnQgaGFudW0pCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworCisgICAgVFJBQ0UyKCgiZ2R0aF9jdHJfbmFtZSgpXG4iKSk7CisKKyAgICBoYSAgICA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKworICAgIGlmIChoYS0+dHlwZSA9PSBHRFRfRUlTQSkgeworICAgICAgICBzd2l0Y2ggKGhhLT5zdHlwZSkgeworICAgICAgICAgIGNhc2UgR0RUM19JRDoKKyAgICAgICAgICAgIHJldHVybigiR0RUMzAwMC8zMDIwIik7CisgICAgICAgICAgY2FzZSBHRFQzQV9JRDoKKyAgICAgICAgICAgIHJldHVybigiR0RUMzAwMEEvMzAyMEEvMzA1MEEiKTsKKyAgICAgICAgICBjYXNlIEdEVDNCX0lEOgorICAgICAgICAgICAgcmV0dXJuKCJHRFQzMDAwQi8zMDEwQSIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfSVNBKSB7CisgICAgICAgIHJldHVybigiR0RUMjAwMC8yMDIwIik7CisgICAgfSBlbHNlIGlmIChoYS0+dHlwZSA9PSBHRFRfUENJKSB7CisgICAgICAgIHN3aXRjaCAoaGEtPnN0eXBlKSB7CisgICAgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2MHgwOgorICAgICAgICAgICAgcmV0dXJuKCJHRFQ2MDAwLzYwMjAvNjA1MCIpOworICAgICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjAwMEI6CisgICAgICAgICAgICByZXR1cm4oIkdEVDYwMDBCLzYwMTAiKTsKKyAgICAgICAgfQorICAgIH0gCisgICAgLyogbmV3IGNvbnRyb2xsZXJzIChHRFRfUENJTkVXLCBHRFRfUENJTVBSLCAuLikgdXNlIGJvYXJkX2luZm8gSU9DVEwhICovCisKKyAgICByZXR1cm4oIiIpOworfQorCitjb25zdCBjaGFyICpnZHRoX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwKQoreworICAgIGludCBoYW51bTsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisKKyAgICBUUkFDRTIoKCJnZHRoX2luZm8oKVxuIikpOworICAgIGhhbnVtID0gTlVNREFUQShzaHApLT5oYW51bTsKKyAgICBoYSAgICA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKworICAgIHJldHVybiAoKGNvbnN0IGNoYXIgKiloYS0+YmluZm8udHlwZV9zdHJpbmcpOworfQorCisvKiBuZXcgZXJyb3IgaGFuZGxpbmcgKi8KK2ludCBnZHRoX2VoX2Fib3J0KFNjc2lfQ21uZCAqc2NwKQoreworICAgIFRSQUNFMigoImdkdGhfZWhfYWJvcnQoKVxuIikpOworICAgIHJldHVybiBGQUlMRUQ7Cit9CisKK2ludCBnZHRoX2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKnNjcCkKK3sKKyAgICBUUkFDRTIoKCJnZHRoX2VoX2RldmljZV9yZXNldCgpXG4iKSk7CisgICAgcmV0dXJuIEZBSUxFRDsKK30KKworaW50IGdkdGhfZWhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqc2NwKQoreworICAgIGludCBpLCBoYW51bTsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgU2NzaV9DbW5kICpjbW5kOworICAgIHVuY2hhciBiOworCisgICAgVFJBQ0UyKCgiZ2R0aF9laF9idXNfcmVzZXQoKVxuIikpOworCisgICAgaGFudW0gPSBOVU1EQVRBKHNjcC0+ZGV2aWNlLT5ob3N0KS0+aGFudW07CisgICAgYiA9IHZpcnRfY3RyID8gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmJ1c251bSA6IHNjcC0+ZGV2aWNlLT5jaGFubmVsOworICAgIGhhICAgID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworCisgICAgLyogY2xlYXIgY29tbWFuZCB0YWIgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgZm9yIChpID0gMDsgaSA8IEdEVEhfTUFYQ01EUzsgKytpKSB7CisgICAgICAgIGNtbmQgPSBoYS0+Y21kX3RhYltpXS5jbW5kOworICAgICAgICBpZiAoIVNQRUNJQUxfU0NQKGNtbmQpICYmIGNtbmQtPmRldmljZS0+Y2hhbm5lbCA9PSBiKQorICAgICAgICAgICAgaGEtPmNtZF90YWJbaV0uY21uZCA9IFVOVVNFRF9DTU5EOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgIGlmIChiID09IGhhLT52aXJ0X2J1cykgeworICAgICAgICAvKiBob3N0IGRyaXZlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hEUklWRVM7ICsraSkgeworICAgICAgICAgICAgaWYgKGhhLT5oZHJbaV0ucHJlc2VudCkgeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBnZHRoX3BvbGxpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgIHdoaWxlIChnZHRoX3Rlc3RfYnVzeShoYW51bSkpCisgICAgICAgICAgICAgICAgICAgIGdkdGhfZGVsYXkoMCk7CisgICAgICAgICAgICAgICAgaWYgKGdkdGhfaW50ZXJuYWxfY21kKGhhbnVtLCBDQUNIRVNFUlZJQ0UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRFRfQ0xVU1RfUkVTRVQsIGksIDAsIDApKQorICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2ldLmNsdXN0ZXJfdHlwZSAmPSB+Q0xVU1RFUl9SRVNFUlZFRDsKKyAgICAgICAgICAgICAgICBnZHRoX3BvbGxpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHJhdyBkZXZpY2VzICovCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWElEOyArK2kpCisgICAgICAgICAgICBoYS0+cmF3W0JVU19MMlAoaGEsYildLmlvX2NudFtpXSA9IDA7CisgICAgICAgIGdkdGhfcG9sbGluZyA9IFRSVUU7CisgICAgICAgIHdoaWxlIChnZHRoX3Rlc3RfYnVzeShoYW51bSkpCisgICAgICAgICAgICBnZHRoX2RlbGF5KDApOworICAgICAgICBnZHRoX2ludGVybmFsX2NtZChoYW51bSwgU0NTSVJBV1NFUlZJQ0UsIEdEVF9SRVNFVF9CVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU19MMlAoaGEsYiksIDAsIDApOworICAgICAgICBnZHRoX3BvbGxpbmcgPSBGQUxTRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKK2ludCBnZHRoX2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpzY3ApCit7CisgICAgVFJBQ0UyKCgiZ2R0aF9laF9ob3N0X3Jlc2V0KClcbiIpKTsKKyAgICByZXR1cm4gRkFJTEVEOworfQorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCitpbnQgZ2R0aF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldixzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LHNlY3Rvcl90IGNhcCxpbnQgKmlwKQorI2Vsc2UKK2ludCBnZHRoX2Jpb3NfcGFyYW0oRGlzayAqZGlzayxrZGV2X3QgZGV2LGludCAqaXApCisjZW5kaWYKK3sKKyAgICB1bmNoYXIgYiwgdDsKKyAgICBpbnQgaGFudW07CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2Q7CisgICAgdW5zaWduZWQgY2FwYWNpdHk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2QgPSBzZGV2OworICAgIGNhcGFjaXR5ID0gY2FwOworI2Vsc2UKKyAgICBzZCA9IGRpc2stPmRldmljZTsKKyAgICBjYXBhY2l0eSA9IGRpc2stPmNhcGFjaXR5OworI2VuZGlmCisgICAgaGFudW0gPSBOVU1EQVRBKHNkLT5ob3N0KS0+aGFudW07CisgICAgYiA9IHZpcnRfY3RyID8gTlVNREFUQShzZC0+aG9zdCktPmJ1c251bSA6IHNkLT5jaGFubmVsOworICAgIHQgPSBzZC0+aWQ7CisgICAgVFJBQ0UyKCgiZ2R0aF9iaW9zX3BhcmFtKCkgaGEgJWQgYnVzICVkIHRhcmdldCAlZFxuIiwgaGFudW0sIGIsIHQpKTsgCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyAgICBpZiAoYiAhPSBoYS0+dmlydF9idXMgfHwgaGEtPmhkclt0XS5oZWFkcyA9PSAwKSB7CisgICAgICAgIC8qIHJhdyBkZXZpY2Ugb3IgaG9zdCBkcml2ZSB3aXRob3V0IG1hcHBpbmcgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgVFJBQ0UyKCgiRXZhbHVhdGUgbWFwcGluZ1xuIikpOworICAgICAgICBnZHRoX2V2YWxfbWFwcGluZyhjYXBhY2l0eSwmaXBbMl0sJmlwWzBdLCZpcFsxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXBbMF0gPSBoYS0+aGRyW3RdLmhlYWRzOworICAgICAgICBpcFsxXSA9IGhhLT5oZHJbdF0uc2VjczsKKyAgICAgICAgaXBbMl0gPSBjYXBhY2l0eSAvIGlwWzBdIC8gaXBbMV07CisgICAgfQorCisgICAgVFJBQ0UyKCgiZ2R0aF9iaW9zX3BhcmFtKCk6ICVkIGhlYWRzLCAlZCBzZWNzLCAlZCBjeWxzXG4iLAorICAgICAgICAgICAgaXBbMF0saXBbMV0saXBbMl0pKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgZ2R0aF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICpzY3Asdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyAgICBpbnQgaGFudW07CisgICAgaW50IHByaW9yaXR5OworCisgICAgVFJBQ0UoKCJnZHRoX3F1ZXVlY29tbWFuZCgpIGNtZCAweCV4XG4iLCBzY3AtPmNtbmRbMF0pKTsKKyAgICAKKyAgICBzY3AtPnNjc2lfZG9uZSA9ICh2b2lkICopZG9uZTsKKyAgICBzY3AtPlNDcC5oYXZlX2RhdGFfaW4gPSAxOworICAgIHNjcC0+U0NwLnBoYXNlID0gLTE7CisgICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gLTE7CisgICAgc2NwLT5TQ3AuU3RhdHVzID0gR0RUSF9NQVBfTk9ORTsKKyAgICBzY3AtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopTlVMTDsKKworICAgIGhhbnVtID0gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmhhbnVtOworI2lmZGVmIEdEVEhfU1RBVElTVElDUworICAgICsrYWN0X2lvczsKKyNlbmRpZgorCisgICAgcHJpb3JpdHkgPSBERUZBVUxUX1BSSTsKKyAgICBpZiAoc2NwLT5kb25lID09IGdkdGhfc2NzaV9kb25lKQorICAgICAgICBwcmlvcml0eSA9IHNjcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisgICAgZ2R0aF91cGRhdGVfdGltZW91dChoYW51bSwgc2NwLCBzY3AtPnRpbWVvdXRfcGVyX2NvbW1hbmQgKiA2KTsKKyAgICBnZHRoX3B1dHEoIGhhbnVtLCBzY3AsIHByaW9yaXR5ICk7CisgICAgZ2R0aF9uZXh0KCBoYW51bSApOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ2R0aF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2R0aF9jdHJfY291bnQ7IGkrKykgeworICAgICAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaV0pOworICAgICAgICBpZiAoIWhhLT5zZGV2KQorICAgICAgICAgICAgaGEtPnNkZXYgPSBzY3NpX2dldF9ob3N0X2RldihnZHRoX2N0cl90YWJbaV0pOworICAgIH0KKworICAgIFRSQUNFKCgiZ2R0aF9vcGVuKClcbiIpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZHRoX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKyAgICBUUkFDRSgoImdkdGhfY2xvc2UoKVxuIikpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvY19ldmVudCh2b2lkIF9fdXNlciAqYXJnKQoreworICAgIGdkdGhfaW9jdGxfZXZlbnQgZXZ0OworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICB1bG9uZyBmbGFnczsKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcigmZXZ0LCBhcmcsIHNpemVvZihnZHRoX2lvY3RsX2V2ZW50KSkgfHwKKyAgICAgICAgZXZ0Lmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2V2dC5pb25vZGVdKTsKKworICAgIGlmIChldnQuZXJhc2UgPT0gMHhmZikgeworICAgICAgICBpZiAoZXZ0LmV2ZW50LmV2ZW50X3NvdXJjZSA9PSBFU19URVNUKQorICAgICAgICAgICAgZXZ0LmV2ZW50LmV2ZW50X2RhdGEuc2l6ZT1zaXplb2YoZXZ0LmV2ZW50LmV2ZW50X2RhdGEuZXUudGVzdCk7IAorICAgICAgICBlbHNlIGlmIChldnQuZXZlbnQuZXZlbnRfc291cmNlID09IEVTX0RSSVZFUikKKyAgICAgICAgICAgIGV2dC5ldmVudC5ldmVudF9kYXRhLnNpemU9c2l6ZW9mKGV2dC5ldmVudC5ldmVudF9kYXRhLmV1LmRyaXZlcik7IAorICAgICAgICBlbHNlIGlmIChldnQuZXZlbnQuZXZlbnRfc291cmNlID09IEVTX1NZTkMpCisgICAgICAgICAgICBldnQuZXZlbnQuZXZlbnRfZGF0YS5zaXplPXNpemVvZihldnQuZXZlbnQuZXZlbnRfZGF0YS5ldS5zeW5jKTsgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2dC5ldmVudC5ldmVudF9kYXRhLnNpemU9c2l6ZW9mKGV2dC5ldmVudC5ldmVudF9kYXRhLmV1LmFzeW5jKTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICBnZHRoX3N0b3JlX2V2ZW50KGhhLCBldnQuZXZlbnQuZXZlbnRfc291cmNlLCBldnQuZXZlbnQuZXZlbnRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICZldnQuZXZlbnQuZXZlbnRfZGF0YSk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIH0gZWxzZSBpZiAoZXZ0LmVyYXNlID09IDB4ZmUpIHsKKyAgICAgICAgZ2R0aF9jbGVhcl9ldmVudHMoKTsKKyAgICB9IGVsc2UgaWYgKGV2dC5lcmFzZSA9PSAwKSB7CisgICAgICAgIGV2dC5oYW5kbGUgPSBnZHRoX3JlYWRfZXZlbnQoaGEsIGV2dC5oYW5kbGUsICZldnQuZXZlbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdkdGhfcmVhZGFwcF9ldmVudChoYSwgZXZ0LmVyYXNlLCAmZXZ0LmV2ZW50KTsKKyAgICB9ICAgICAKKyAgICBpZiAoY29weV90b191c2VyKGFyZywgJmV2dCwgc2l6ZW9mKGdkdGhfaW9jdGxfZXZlbnQpKSkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9jX2xvY2tkcnYodm9pZCBfX3VzZXIgKmFyZykKK3sKKyAgICBnZHRoX2lvY3RsX2xvY2tkcnYgbGRydjsKKyAgICB1bmNoYXIgaSwgajsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJmxkcnYsIGFyZywgc2l6ZW9mKGdkdGhfaW9jdGxfbG9ja2RydikpIHx8CisgICAgICAgIGxkcnYuaW9ub2RlID49IGdkdGhfY3RyX2NvdW50KQorICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbbGRydi5pb25vZGVdKTsKKyAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGRydi5kcml2ZV9jbnQgJiYgaSA8IE1BWF9IRFJJVkVTOyArK2kpIHsKKyAgICAgICAgaiA9IGxkcnYuZHJpdmVzW2ldOworICAgICAgICBpZiAoaiA+PSBNQVhfSERSSVZFUyB8fCAhaGEtPmhkcltqXS5wcmVzZW50KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChsZHJ2LmxvY2spIHsKKyAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIGhhLT5oZHJbal0ubG9jayA9IDE7CisgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIGdkdGhfd2FpdF9jb21wbGV0aW9uKGxkcnYuaW9ub2RlLCBoYS0+YnVzX2NudCwgaik7IAorICAgICAgICAgICAgZ2R0aF9zdG9wX3RpbWVvdXQobGRydi5pb25vZGUsIGhhLT5idXNfY250LCBqKTsgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBoYS0+aGRyW2pdLmxvY2sgPSAwOworICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBnZHRoX3N0YXJ0X3RpbWVvdXQobGRydi5pb25vZGUsIGhhLT5idXNfY250LCBqKTsgCisgICAgICAgICAgICBnZHRoX25leHQobGRydi5pb25vZGUpOyAKKyAgICAgICAgfQorICAgIH0gCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9jX3Jlc2V0ZHJ2KHZvaWQgX191c2VyICphcmcsIGNoYXIgKmNtbmQpCit7CisgICAgZ2R0aF9pb2N0bF9yZXNldCByZXM7CisgICAgZ2R0aF9jbWRfc3RyIGNtZDsKKyAgICBpbnQgaGFudW07CisgICAgZ2R0aF9oYV9zdHIgKmhhOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgKnNycDsKKyNlbHNlCisgICAgU2NzaV9DbW5kICpzY3A7CisjZW5kaWYKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcigmcmVzLCBhcmcsIHNpemVvZihnZHRoX2lvY3RsX3Jlc2V0KSkgfHwKKyAgICAgICAgcmVzLmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCB8fCByZXMubnVtYmVyID49IE1BWF9IRFJJVkVTKQorICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBoYW51bSA9IHJlcy5pb25vZGU7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgCisgICAgaWYgKCFoYS0+aGRyW3Jlcy5udW1iZXJdLnByZXNlbnQpCisgICAgICAgIHJldHVybiAwOworICAgIG1lbXNldCgmY21kLCAwLCBzaXplb2YoZ2R0aF9jbWRfc3RyKSk7CisgICAgY21kLlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgY21kLk9wQ29kZSA9IEdEVF9DTFVTVF9SRVNFVDsKKyAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpCisgICAgICAgIGNtZC51LmNhY2hlNjQuRGV2aWNlTm8gPSByZXMubnVtYmVyOworICAgIGVsc2UKKyAgICAgICAgY21kLnUuY2FjaGUuRGV2aWNlTm8gPSByZXMubnVtYmVyOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzcnAgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGhhLT5zZGV2LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXNycCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgc3JwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgc3JwLT5zcl91c2Vfc2cgPSAwOworICAgIGdkdGhfZG9fcmVxKHNycCwgJmNtZCwgY21uZCwgMzApOworICAgIHJlcy5zdGF0dXMgPSAodXNob3J0KXNycC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1czsKKyAgICBzY3NpX3JlbGVhc2VfcmVxdWVzdChzcnApOworI2Vsc2UKKyAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9kZXZpY2UoaGEtPnNkZXYsIDEsIEZBTFNFKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgc2NwLT51c2Vfc2cgPSAwOworICAgIGdkdGhfZG9fY21kKHNjcCwgJmNtZCwgY21uZCwgMzApOworICAgIHJlcy5zdGF0dXMgPSAodXNob3J0KXNjcC0+U0NwLlN0YXR1czsKKyAgICBzY3NpX3JlbGVhc2VfY29tbWFuZChzY3ApOworI2VuZGlmCisKKyAgICBpZiAoY29weV90b191c2VyKGFyZywgJnJlcywgc2l6ZW9mKGdkdGhfaW9jdGxfcmVzZXQpKSkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9jX2dlbmVyYWwodm9pZCBfX3VzZXIgKmFyZywgY2hhciAqY21uZCkKK3sKKyAgICBnZHRoX2lvY3RsX2dlbmVyYWwgZ2VuOworICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CisgICAgdWxvbmc2NCBwYWRkcjsgCisgICAgaW50IGhhbnVtOworICAgICAgICBnZHRoX2hhX3N0ciAqaGE7IAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgU2NzaV9SZXF1ZXN0ICpzcnA7CisjZWxzZQorICAgICAgICBTY3NpX0NtbmQgKnNjcDsKKyNlbmRpZgorICAgICAgICAKKyAgICBpZiAoY29weV9mcm9tX3VzZXIoJmdlbiwgYXJnLCBzaXplb2YoZ2R0aF9pb2N0bF9nZW5lcmFsKSkgfHwKKyAgICAgICAgZ2VuLmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgaGFudW0gPSBnZW4uaW9ub2RlOyAKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBpZiAoZ2VuLmRhdGFfbGVuICsgZ2VuLnNlbnNlX2xlbiAhPSAwKSB7CisgICAgICAgIGlmICghKGJ1ZiA9IGdkdGhfaW9jdGxfYWxsb2MoaGFudW0sIGdlbi5kYXRhX2xlbiArIGdlbi5zZW5zZV9sZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAmcGFkZHIpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBhcmcgKyBzaXplb2YoZ2R0aF9pb2N0bF9nZW5lcmFsKSwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLmRhdGFfbGVuICsgZ2VuLnNlbnNlX2xlbikpIHsKKyAgICAgICAgICAgIGdkdGhfaW9jdGxfZnJlZShoYW51bSwgZ2VuLmRhdGFfbGVuK2dlbi5zZW5zZV9sZW4sIGJ1ZiwgcGFkZHIpOworICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2VuLmNvbW1hbmQuT3BDb2RlID09IEdEVF9JT0NUTCkgeworICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5pb2N0bC5wX3BhcmFtID0gcGFkZHI7CisgICAgICAgIH0gZWxzZSBpZiAoZ2VuLmNvbW1hbmQuU2VydmljZSA9PSBDQUNIRVNFUlZJQ0UpIHsKKyAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgeworICAgICAgICAgICAgICAgIC8qIGNvcHkgZWxlbWVudHMgZnJvbSAzMi1iaXQgSU9DVEwgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZTY0LkJsb2NrQ250ID0gZ2VuLmNvbW1hbmQudS5jYWNoZS5CbG9ja0NudDsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuQmxvY2tObyA9IGdlbi5jb21tYW5kLnUuY2FjaGUuQmxvY2tObzsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuRGV2aWNlTm8gPSBnZW4uY29tbWFuZC51LmNhY2hlLkRldmljZU5vOworICAgICAgICAgICAgICAgIC8qIGFkZHJlc3NlcyAqLworICAgICAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGU2NC5EZXN0QWRkciA9ICh1bG9uZzY0KS0xOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuc2dfY2FueiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGU2NC5zZ19sc3RbMF0uc2dfcHRyID0gcGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGU2NC5zZ19sc3RbMF0uc2dfbGVuID0gZ2VuLmRhdGFfbGVuOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlNjQuc2dfbHN0WzFdLnNnX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZTY0LkRlc3RBZGRyID0gcGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGU2NC5zZ19jYW56ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGUuRGVzdEFkZHIgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlLnNnX2NhbnogPSAxOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlLnNnX2xzdFswXS5zZ19wdHIgPSAodWxvbmczMilwYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZS5zZ19sc3RbMF0uc2dfbGVuID0gZ2VuLmRhdGFfbGVuOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LmNhY2hlLnNnX2xzdFsxXS5zZ19sZW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUuY2FjaGUuRGVzdEFkZHIgPSBwYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5jYWNoZS5zZ19jYW56ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZ2VuLmNvbW1hbmQuU2VydmljZSA9PSBTQ1NJUkFXU0VSVklDRSkgeworICAgICAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIEdEVF82NEJJVCkgeworICAgICAgICAgICAgICAgIC8qIGNvcHkgZWxlbWVudHMgZnJvbSAzMi1iaXQgSU9DVEwgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgY2hhciBjbWRbMTZdOworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2Vuc2VfbGVuID0gZ2VuLmNvbW1hbmQudS5yYXcuc2Vuc2VfbGVuOworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuYnVzID0gZ2VuLmNvbW1hbmQudS5yYXcuYnVzOworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQubHVuID0gZ2VuLmNvbW1hbmQudS5yYXcubHVuOworICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQudGFyZ2V0ID0gZ2VuLmNvbW1hbmQudS5yYXcudGFyZ2V0OworICAgICAgICAgICAgICAgIG1lbWNweShjbWQsIGdlbi5jb21tYW5kLnUucmF3LmNtZCwgMTYpOworICAgICAgICAgICAgICAgIG1lbWNweShnZW4uY29tbWFuZC51LnJhdzY0LmNtZCwgY21kLCAxNik7CisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5jbGVuID0gZ2VuLmNvbW1hbmQudS5yYXcuY2xlbjsKKyAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNkbGVuID0gZ2VuLmNvbW1hbmQudS5yYXcuc2RsZW47CisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5kaXJlY3Rpb24gPSBnZW4uY29tbWFuZC51LnJhdy5kaXJlY3Rpb247CisgICAgICAgICAgICAgICAgLyogYWRkcmVzc2VzICovCisgICAgICAgICAgICAgICAgaWYgKGhhLT5yYXdfZmVhdCAmIFNDQVRURVJfR0FUSEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2RhdGEgPSAodWxvbmc2NCktMTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5zZ19yYW56ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5zZ19sc3RbMF0uc2dfcHRyID0gcGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2dfbHN0WzBdLnNnX2xlbiA9IGdlbi5kYXRhX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXc2NC5zZ19sc3RbMV0uc2dfbGVuID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdzY0LnNkYXRhID0gcGFkZHI7CisgICAgICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2dfcmFueiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbi5jb21tYW5kLnUucmF3NjQuc2Vuc2VfZGF0YSA9IHBhZGRyICsgZ2VuLmRhdGFfbGVuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPnJhd19mZWF0ICYgU0NBVFRFUl9HQVRIRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2RhdGEgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdy5zZ19yYW56ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2dfbHN0WzBdLnNnX3B0ciA9ICh1bG9uZzMyKXBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdy5zZ19sc3RbMF0uc2dfbGVuID0gZ2VuLmRhdGFfbGVuOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdy5zZ19sc3RbMV0uc2dfbGVuID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdy5zZGF0YSA9IHBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZW4uY29tbWFuZC51LnJhdy5zZ19yYW56ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuLmNvbW1hbmQudS5yYXcuc2Vuc2VfZGF0YSA9ICh1bG9uZzMyKXBhZGRyICsgZ2VuLmRhdGFfbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2R0aF9pb2N0bF9mcmVlKGhhbnVtLCBnZW4uZGF0YV9sZW4rZ2VuLnNlbnNlX2xlbiwgYnVmLCBwYWRkcik7CisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzcnAgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGhhLT5zZGV2LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXNycCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgc3JwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgc3JwLT5zcl91c2Vfc2cgPSAwOworICAgIGdkdGhfZG9fcmVxKHNycCwgJmdlbi5jb21tYW5kLCBjbW5kLCBnZW4udGltZW91dCk7CisgICAgZ2VuLnN0YXR1cyA9IHNycC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1czsKKyAgICBnZW4uaW5mbyA9IHNycC0+c3JfY29tbWFuZC0+U0NwLk1lc3NhZ2U7CisgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JwKTsKKyNlbHNlCisgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfZGV2aWNlKGhhLT5zZGV2LCAxLCBGQUxTRSk7CisgICAgaWYgKCFzY3ApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNjcC0+Y21kX2xlbiA9IDEyOworICAgIHNjcC0+dXNlX3NnID0gMDsKKyAgICBnZHRoX2RvX2NtZChzY3AsICZnZW4uY29tbWFuZCwgY21uZCwgZ2VuLnRpbWVvdXQpOworICAgIGdlbi5zdGF0dXMgPSBzY3AtPlNDcC5TdGF0dXM7CisgICAgZ2VuLmluZm8gPSBzY3AtPlNDcC5NZXNzYWdlOworICAgIHNjc2lfcmVsZWFzZV9jb21tYW5kKHNjcCk7CisjZW5kaWYKKworICAgIGlmIChjb3B5X3RvX3VzZXIoYXJnICsgc2l6ZW9mKGdkdGhfaW9jdGxfZ2VuZXJhbCksIGJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICBnZW4uZGF0YV9sZW4gKyBnZW4uc2Vuc2VfbGVuKSkgeworICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIGdlbi5kYXRhX2xlbitnZW4uc2Vuc2VfbGVuLCBidWYsIHBhZGRyKTsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7IAorICAgIH0gCisgICAgaWYgKGNvcHlfdG9fdXNlcihhcmcsICZnZW4sIAorICAgICAgICBzaXplb2YoZ2R0aF9pb2N0bF9nZW5lcmFsKSAtIHNpemVvZihnZHRoX2NtZF9zdHIpKSkgeworICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIGdlbi5kYXRhX2xlbitnZW4uc2Vuc2VfbGVuLCBidWYsIHBhZGRyKTsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorICAgIGdkdGhfaW9jdGxfZnJlZShoYW51bSwgZ2VuLmRhdGFfbGVuK2dlbi5zZW5zZV9sZW4sIGJ1ZiwgcGFkZHIpOworICAgIHJldHVybiAwOworfQorIAorc3RhdGljIGludCBpb2NfaGRybGlzdCh2b2lkIF9fdXNlciAqYXJnLCBjaGFyICpjbW5kKQoreworICAgIGdkdGhfaW9jdGxfcmVzY2FuICpyc2M7CisgICAgZ2R0aF9jbWRfc3RyICpjbWQ7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVuY2hhciBpOworICAgIGludCBoYW51bSwgcmMgPSAtRU5PTUVNOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgKnNycDsKKyNlbHNlCisgICAgU2NzaV9DbW5kICpzY3A7CisjZW5kaWYKKyAgICAgICAgCisgICAgcnNjID0ga21hbGxvYyhzaXplb2YoKnJzYyksIEdGUF9LRVJORUwpOworICAgIGNtZCA9IGttYWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXJzYyB8fCAhY21kKQorCWdvdG8gZnJlZV9mYWlsOworCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKHJzYywgYXJnLCBzaXplb2YoZ2R0aF9pb2N0bF9yZXNjYW4pKSB8fAorICAgICAgICByc2MtPmlvbm9kZSA+PSBnZHRoX2N0cl9jb3VudCkgeworICAgICAgICByYyA9IC1FRkFVTFQ7CisJZ290byBmcmVlX2ZhaWw7CisgICAgfQorICAgIGhhbnVtID0gcnNjLT5pb25vZGU7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGdkdGhfY21kX3N0cikpOworICAgCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNycCAgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoaGEtPnNkZXYsIEdGUF9LRVJORUwpOworICAgIGlmICghc3JwKQorICAgICAgICBnb3RvIGZyZWVfZmFpbDsKKyAgICBzcnAtPnNyX2NtZF9sZW4gPSAxMjsKKyAgICBzcnAtPnNyX3VzZV9zZyA9IDA7CisjZWxzZQorICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX2RldmljZShoYS0+c2RldiwgMSwgRkFMU0UpOworICAgIGlmICghc2NwKQorICAgICAgICBnb3RvIGZyZWVfZmFpbDsKKyAgICBzY3AtPmNtZF9sZW4gPSAxMjsKKyAgICBzY3AtPnVzZV9zZyA9IDA7CisjZW5kaWYKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfSERSSVZFUzsgKytpKSB7IAorICAgICAgICBpZiAoIWhhLT5oZHJbaV0ucHJlc2VudCkgeworICAgICAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5idXMgPSAweGZmOyAKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IAorICAgICAgICByc2MtPmhkcl9saXN0W2ldLmJ1cyA9IGhhLT52aXJ0X2J1czsKKyAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS50YXJnZXQgPSBpOworICAgICAgICByc2MtPmhkcl9saXN0W2ldLmx1biA9IDA7CisgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0uY2x1c3Rlcl90eXBlID0gaGEtPmhkcltpXS5jbHVzdGVyX3R5cGU7CisgICAgICAgIGlmIChoYS0+aGRyW2ldLmNsdXN0ZXJfdHlwZSAmIENMVVNURVJfRFJJVkUpIHsgCisgICAgICAgICAgICBjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgICAgICBjbWQtPk9wQ29kZSA9IEdEVF9DTFVTVF9JTkZPOworICAgICAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKQorICAgICAgICAgICAgICAgIGNtZC0+dS5jYWNoZTY0LkRldmljZU5vID0gaTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjbWQtPnUuY2FjaGUuRGV2aWNlTm8gPSBpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNycCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc3JwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzID09IFNfT0spCisgICAgICAgICAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5jbHVzdGVyX3R5cGUgPSBzcnAtPnNyX2NvbW1hbmQtPlNDcC5NZXNzYWdlOworI2Vsc2UKKyAgICAgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzID09IFNfT0spCisgICAgICAgICAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5jbHVzdGVyX3R5cGUgPSBzY3AtPlNDcC5NZXNzYWdlOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzY3NpX3JlbGVhc2VfcmVxdWVzdChzcnApOworI2Vsc2UKKyAgICBzY3NpX3JlbGVhc2VfY29tbWFuZChzY3ApOworI2VuZGlmICAgICAgIAorIAorICAgIGlmIChjb3B5X3RvX3VzZXIoYXJnLCByc2MsIHNpemVvZihnZHRoX2lvY3RsX3Jlc2NhbikpKQorICAgICAgICByYyA9IC1FRkFVTFQ7CisgICAgZWxzZQorCXJjID0gMDsKKworZnJlZV9mYWlsOgorICAgIGtmcmVlKHJzYyk7CisgICAga2ZyZWUoY21kKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaW9jX3Jlc2Nhbih2b2lkIF9fdXNlciAqYXJnLCBjaGFyICpjbW5kKQoreworICAgIGdkdGhfaW9jdGxfcmVzY2FuICpyc2M7CisgICAgZ2R0aF9jbWRfc3RyICpjbWQ7CisgICAgdXNob3J0IGksIHN0YXR1cywgaGRyX2NudDsKKyAgICB1bG9uZzMyIGluZm87CisgICAgaW50IGhhbnVtLCBjeWxzLCBoZHMsIHNlY3M7CisgICAgaW50IHJjID0gLUVOT01FTTsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBnZHRoX2hhX3N0ciAqaGE7IAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgKnNycDsKKyNlbHNlCisgICAgU2NzaV9DbW5kICpzY3A7CisjZW5kaWYKKworICAgIHJzYyA9IGttYWxsb2Moc2l6ZW9mKCpyc2MpLCBHRlBfS0VSTkVMKTsKKyAgICBjbWQgPSBrbWFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFjbWQgfHwgIXJzYykKKwlnb3RvIGZyZWVfZmFpbDsKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcihyc2MsIGFyZywgc2l6ZW9mKGdkdGhfaW9jdGxfcmVzY2FuKSkgfHwKKyAgICAgICAgcnNjLT5pb25vZGUgPj0gZ2R0aF9jdHJfY291bnQpIHsKKwlyYyA9IC1FRkFVTFQ7CisJZ290byBmcmVlX2ZhaWw7CisgICAgfQorICAgIGhhbnVtID0gcnNjLT5pb25vZGU7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGdkdGhfY21kX3N0cikpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNycCAgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoaGEtPnNkZXYsIEdGUF9LRVJORUwpOworICAgIGlmICghc3JwKQorICAgICAgICBnb3RvIGZyZWVfZmFpbDsKKyAgICBzcnAtPnNyX2NtZF9sZW4gPSAxMjsKKyAgICBzcnAtPnNyX3VzZV9zZyA9IDA7CisjZWxzZQorICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX2RldmljZShoYS0+c2RldiwgMSwgRkFMU0UpOworICAgIGlmICghc2NwKQorICAgICAgICBnb3RvIGZyZWVfZmFpbDsKKyAgICBzY3AtPmNtZF9sZW4gPSAxMjsKKyAgICBzY3AtPnVzZV9zZyA9IDA7CisjZW5kaWYKKyAgICAgCisgICAgaWYgKHJzYy0+ZmxhZyA9PSAwKSB7CisgICAgICAgIC8qIG9sZCBtZXRob2Q6IHJlLWluaXQuIGNhY2hlIHNlcnZpY2UgKi8KKyAgICAgICAgY21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIHsKKyAgICAgICAgICAgIGNtZC0+T3BDb2RlID0gR0RUX1hfSU5JVF9IT1NUOworICAgICAgICAgICAgY21kLT51LmNhY2hlNjQuRGV2aWNlTm8gPSBMSU5VWF9PUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZC0+T3BDb2RlID0gR0RUX0lOSVQ7CisgICAgICAgICAgICBjbWQtPnUuY2FjaGUuRGV2aWNlTm8gPSBMSU5VWF9PUzsKKyAgICAgICAgfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgZ2R0aF9kb19yZXEoc3JwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzcnAtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzcnAtPnNyX2NvbW1hbmQtPlNDcC5NZXNzYWdlOworI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQorICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGNtZCwgY21uZCwgMzApOworICAgICAgICBzdGF0dXMgPSAodXNob3J0KXNjcC0+U0NwLlN0YXR1czsKKyAgICAgICAgaW5mbyA9ICh1bG9uZzMyKXNjcC0+U0NwLk1lc3NhZ2U7CisjZWxzZQorICAgICAgICBnZHRoX2RvX2NtZCgmc2NwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzY3AuU0NwLlN0YXR1czsKKyAgICAgICAgaW5mbyA9ICh1bG9uZzMyKXNjcC5TQ3AuTWVzc2FnZTsKKyNlbmRpZgorICAgICAgICBpID0gMDsKKyAgICAgICAgaGRyX2NudCA9IChzdGF0dXMgPT0gU19PSyA/ICh1c2hvcnQpaW5mbyA6IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGkgPSByc2MtPmhkcl9ubzsKKyAgICAgICAgaGRyX2NudCA9IGkgKyAxOworICAgIH0KKworICAgIGZvciAoOyBpIDwgaGRyX2NudCAmJiBpIDwgTUFYX0hEUklWRVM7ICsraSkgeworICAgICAgICBjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgIGNtZC0+T3BDb2RlID0gR0RUX0lORk87CisgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgCisgICAgICAgICAgICBjbWQtPnUuY2FjaGU2NC5EZXZpY2VObyA9IGk7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICBjbWQtPnUuY2FjaGUuRGV2aWNlTm8gPSBpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgZ2R0aF9kb19yZXEoc3JwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzcnAtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzcnAtPnNyX2NvbW1hbmQtPlNDcC5NZXNzYWdlOworI2Vsc2UKKyAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzY3AtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzY3AtPlNDcC5NZXNzYWdlOworI2VuZGlmCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5idXMgPSBoYS0+dmlydF9idXM7CisgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0udGFyZ2V0ID0gaTsKKyAgICAgICAgcnNjLT5oZHJfbGlzdFtpXS5sdW4gPSAwOworICAgICAgICBpZiAoc3RhdHVzICE9IFNfT0spIHsKKyAgICAgICAgICAgIGhhLT5oZHJbaV0ucHJlc2VudCA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGEtPmhkcltpXS5wcmVzZW50ID0gVFJVRTsKKyAgICAgICAgICAgIGhhLT5oZHJbaV0uc2l6ZSA9IGluZm87CisgICAgICAgICAgICAvKiBldmFsdWF0ZSBtYXBwaW5nICovCisgICAgICAgICAgICBoYS0+aGRyW2ldLnNpemUgJj0gflNFQ1MzMjsKKyAgICAgICAgICAgIGdkdGhfZXZhbF9tYXBwaW5nKGhhLT5oZHJbaV0uc2l6ZSwmY3lscywmaGRzLCZzZWNzKTsgCisgICAgICAgICAgICBoYS0+aGRyW2ldLmhlYWRzID0gaGRzOworICAgICAgICAgICAgaGEtPmhkcltpXS5zZWNzID0gc2VjczsKKyAgICAgICAgICAgIC8qIHJvdW5kIHNpemUgKi8KKyAgICAgICAgICAgIGhhLT5oZHJbaV0uc2l6ZSA9IGN5bHMgKiBoZHMgKiBzZWNzOworICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IFNfT0spCisgICAgICAgICAgICBjb250aW51ZTsgCisgICAgICAgIAorICAgICAgICAvKiBleHRlbmRlZCBpbmZvLCBpZiBHRFRfNjRCSVQsIGZvciBkcml2ZXMgPiAyIFRCICovCisgICAgICAgIC8qIGJ1dCB3ZSBuZWVkIGhhLT5pbmZvMiwgbm90IHlldCBzdG9yZWQgaW4gc2NwLT5TQ3AgKi8KKworICAgICAgICAvKiBkZXZ0eXBlLCBjbHVzdGVyIGluZm8sIFIvVyBhdHRyaWJzICovCisgICAgICAgIGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgY21kLT5PcENvZGUgPSBHRFRfREVWVFlQRTsKKyAgICAgICAgaWYgKGhhLT5jYWNoZV9mZWF0ICYgR0RUXzY0QklUKSAKKyAgICAgICAgICAgIGNtZC0+dS5jYWNoZTY0LkRldmljZU5vID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY21kLT51LmNhY2hlLkRldmljZU5vID0gaTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgIGdkdGhfZG9fcmVxKHNycCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc3JwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc3JwLT5zcl9jb21tYW5kLT5TQ3AuTWVzc2FnZTsKKyNlbHNlCisgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgY21kLCBjbW5kLCAzMCk7CisgICAgICAgIHN0YXR1cyA9ICh1c2hvcnQpc2NwLT5TQ3AuU3RhdHVzOworICAgICAgICBpbmZvID0gKHVsb25nMzIpc2NwLT5TQ3AuTWVzc2FnZTsKKyNlbmRpZgorICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgIGhhLT5oZHJbaV0uZGV2dHlwZSA9IChzdGF0dXMgPT0gU19PSyA/ICh1c2hvcnQpaW5mbyA6IDApOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgICAgICBjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgIGNtZC0+T3BDb2RlID0gR0RUX0NMVVNUX0lORk87CisgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgCisgICAgICAgICAgICBjbWQtPnUuY2FjaGU2NC5EZXZpY2VObyA9IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNtZC0+dS5jYWNoZS5EZXZpY2VObyA9IGk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICBnZHRoX2RvX3JlcShzcnAsIGNtZCwgY21uZCwgMzApOworICAgICAgICBzdGF0dXMgPSAodXNob3J0KXNycC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1czsKKyAgICAgICAgaW5mbyA9ICh1bG9uZzMyKXNycC0+c3JfY29tbWFuZC0+U0NwLk1lc3NhZ2U7CisjZWxzZQorICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGNtZCwgY21uZCwgMzApOworICAgICAgICBzdGF0dXMgPSAodXNob3J0KXNjcC0+U0NwLlN0YXR1czsKKyAgICAgICAgaW5mbyA9ICh1bG9uZzMyKXNjcC0+U0NwLk1lc3NhZ2U7CisjZW5kaWYKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICBoYS0+aGRyW2ldLmNsdXN0ZXJfdHlwZSA9IAorICAgICAgICAgICAgKChzdGF0dXMgPT0gU19PSyAmJiAhc2hhcmVkX2FjY2VzcykgPyAodXNob3J0KWluZm8gOiAwKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgIHJzYy0+aGRyX2xpc3RbaV0uY2x1c3Rlcl90eXBlID0gaGEtPmhkcltpXS5jbHVzdGVyX3R5cGU7CisKKyAgICAgICAgY21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICBjbWQtPk9wQ29kZSA9IEdEVF9SV19BVFRSSUJTOworICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIAorICAgICAgICAgICAgY21kLT51LmNhY2hlNjQuRGV2aWNlTm8gPSBpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbWQtPnUuY2FjaGUuRGV2aWNlTm8gPSBpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgZ2R0aF9kb19yZXEoc3JwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzcnAtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzcnAtPnNyX2NvbW1hbmQtPlNDcC5NZXNzYWdlOworI2Vsc2UKKyAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gKHVzaG9ydClzY3AtPlNDcC5TdGF0dXM7CisgICAgICAgIGluZm8gPSAodWxvbmczMilzY3AtPlNDcC5NZXNzYWdlOworI2VuZGlmCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgaGEtPmhkcltpXS5yd19hdHRyaWJzID0gKHN0YXR1cyA9PSBTX09LID8gKHVzaG9ydClpbmZvIDogMCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgIH0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JwKTsKKyNlbHNlCisgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyNlbmRpZiAgICAgICAKKyAKKyAgICBpZiAoY29weV90b191c2VyKGFyZywgcnNjLCBzaXplb2YoZ2R0aF9pb2N0bF9yZXNjYW4pKSkKKyAgICAgICAgcmMgPSAtRUZBVUxUOworICAgIGVsc2UKKwlyYyA9IDA7CisKK2ZyZWVfZmFpbDoKKyAgICBrZnJlZShyc2MpOworICAgIGtmcmVlKGNtZCk7CisgICAgcmV0dXJuIHJjOworfQorICAKK3N0YXRpYyBpbnQgZ2R0aF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOyAKKyAgICBTY3NpX0NtbmQgKnNjcDsKKyAgICB1bG9uZyBmbGFnczsKKyAgICBjaGFyIGNtbmRbTUFYX0NPTU1BTkRfU0laRV07ICAgCisgICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyAgICBtZW1zZXQoY21uZCwgMHhmZiwgMTIpOworICAgIAorICAgIFRSQUNFKCgiZ2R0aF9pb2N0bCgpIGNtZCAweCV4XG4iLCBjbWQpKTsKKyAKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgY2FzZSBHRFRJT0NUTF9DVFJDTlQ6CisgICAgICB7IAorICAgICAgICBpbnQgY250ID0gZ2R0aF9jdHJfY291bnQ7CisgICAgICAgIGlmIChwdXRfdXNlcihjbnQsIChpbnQgX191c2VyICopYXJncCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdEVElPQ1RMX0RSVkVSUzoKKyAgICAgIHsgCisgICAgICAgIGludCB2ZXIgPSAoR0RUSF9WRVJTSU9OPDw4KSB8IEdEVEhfU1VCVkVSU0lPTjsKKyAgICAgICAgaWYgKHB1dF91c2VyKHZlciwgKGludCBfX3VzZXIgKilhcmdwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGNhc2UgR0RUSU9DVExfT1NWRVJTOgorICAgICAgeyAKKyAgICAgICAgZ2R0aF9pb2N0bF9vc3ZlcnMgb3N2OyAKKworICAgICAgICBvc3YudmVyc2lvbiA9ICh1bmNoYXIpKExJTlVYX1ZFUlNJT05fQ09ERSA+PiAxNik7CisgICAgICAgIG9zdi5zdWJ2ZXJzaW9uID0gKHVuY2hhcikoTElOVVhfVkVSU0lPTl9DT0RFID4+IDgpOworICAgICAgICBvc3YucmV2aXNpb24gPSAodXNob3J0KShMSU5VWF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmb3N2LCBzaXplb2YoZ2R0aF9pb2N0bF9vc3ZlcnMpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR0RUSU9DVExfQ1RSVFlQRToKKyAgICAgIHsgCisgICAgICAgIGdkdGhfaW9jdGxfY3RydHlwZSBjdHJ0OworICAgICAgICAKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZjdHJ0LCBhcmdwLCBzaXplb2YoZ2R0aF9pb2N0bF9jdHJ0eXBlKSkgfHwKKyAgICAgICAgICAgIGN0cnQuaW9ub2RlID49IGdkdGhfY3RyX2NvdW50KQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltjdHJ0Lmlvbm9kZV0pOworICAgICAgICBpZiAoaGEtPnR5cGUgPT0gR0RUX0lTQSB8fCBoYS0+dHlwZSA9PSBHRFRfRUlTQSkgeworICAgICAgICAgICAgY3RydC50eXBlID0gKHVuY2hhcikoKGhhLT5zdHlwZT4+MjApIC0gMHgxMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGEtPnR5cGUgIT0gR0RUX1BDSU1QUikgeworICAgICAgICAgICAgICAgIGN0cnQudHlwZSA9ICh1bmNoYXIpKChoYS0+c3R5cGU8PDQpICsgNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN0cnQudHlwZSA9IAorICAgICAgICAgICAgICAgICAgICAoaGEtPm9lbV9pZCA9PSBPRU1fSURfSU5URUwgPyAweGZkIDogMHhmZSk7CisgICAgICAgICAgICAgICAgaWYgKGhhLT5zdHlwZSA+PSAweDMwMCkKKyAgICAgICAgICAgICAgICAgICAgY3RydC5leHRfdHlwZSA9IDB4NjAwMCB8IGhhLT5zdWJkZXZpY2VfaWQ7CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgY3RydC5leHRfdHlwZSA9IDB4NjAwMCB8IGhhLT5zdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0cnQuZGV2aWNlX2lkID0gaGEtPnN0eXBlOworICAgICAgICAgICAgY3RydC5zdWJfZGV2aWNlX2lkID0gaGEtPnN1YmRldmljZV9pZDsKKyAgICAgICAgfQorICAgICAgICBjdHJ0LmluZm8gPSBoYS0+YnJkX3BoeXM7CisgICAgICAgIGN0cnQub2VtX2lkID0gaGEtPm9lbV9pZDsKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY3RydCwgc2l6ZW9mKGdkdGhfaW9jdGxfY3RydHlwZSkpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgICAKKyAgICAgIGNhc2UgR0RUSU9DVExfR0VORVJBTDoKKyAgICAgICAgcmV0dXJuIGlvY19nZW5lcmFsKGFyZ3AsIGNtbmQpOworCisgICAgICBjYXNlIEdEVElPQ1RMX0VWRU5UOgorICAgICAgICByZXR1cm4gaW9jX2V2ZW50KGFyZ3ApOworCisgICAgICBjYXNlIEdEVElPQ1RMX0xPQ0tEUlY6CisgICAgICAgIHJldHVybiBpb2NfbG9ja2RydihhcmdwKTsKKworICAgICAgY2FzZSBHRFRJT0NUTF9MT0NLQ0hOOgorICAgICAgeworICAgICAgICBnZHRoX2lvY3RsX2xvY2tjaG4gbGNobjsKKyAgICAgICAgdW5jaGFyIGksIGo7CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZsY2huLCBhcmdwLCBzaXplb2YoZ2R0aF9pb2N0bF9sb2NrY2huKSkgfHwKKyAgICAgICAgICAgIGxjaG4uaW9ub2RlID49IGdkdGhfY3RyX2NvdW50KQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltsY2huLmlvbm9kZV0pOworICAgICAgICAKKyAgICAgICAgaSA9IGxjaG4uY2hhbm5lbDsKKyAgICAgICAgaWYgKGkgPCBoYS0+YnVzX2NudCkgeworICAgICAgICAgICAgaWYgKGxjaG4ubG9jaykgeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBoYS0+cmF3W2ldLmxvY2sgPSAxOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYS0+dGlkX2NudDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGdkdGhfd2FpdF9jb21wbGV0aW9uKGxjaG4uaW9ub2RlLCBpLCBqKTsgCisgICAgICAgICAgICAgICAgICAgIGdkdGhfc3RvcF90aW1lb3V0KGxjaG4uaW9ub2RlLCBpLCBqKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaGEtPnJhd1tpXS5sb2NrID0gMDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGEtPnRpZF9jbnQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBnZHRoX3N0YXJ0X3RpbWVvdXQobGNobi5pb25vZGUsIGksIGopOyAKKyAgICAgICAgICAgICAgICAgICAgZ2R0aF9uZXh0KGxjaG4uaW9ub2RlKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHRFRJT0NUTF9SRVNDQU46CisgICAgICAgIHJldHVybiBpb2NfcmVzY2FuKGFyZ3AsIGNtbmQpOworCisgICAgICBjYXNlIEdEVElPQ1RMX0hEUkxJU1Q6CisgICAgICAgIHJldHVybiBpb2NfaGRybGlzdChhcmdwLCBjbW5kKTsKKworICAgICAgY2FzZSBHRFRJT0NUTF9SRVNFVF9CVVM6CisgICAgICB7CisgICAgICAgIGdkdGhfaW9jdGxfcmVzZXQgcmVzOworICAgICAgICBpbnQgaGFudW0sIHJ2YWw7CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZyZXMsIGFyZ3AsIHNpemVvZihnZHRoX2lvY3RsX3Jlc2V0KSkgfHwKKyAgICAgICAgICAgIHJlcy5pb25vZGUgPj0gZ2R0aF9jdHJfY291bnQpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgaGFudW0gPSByZXMuaW9ub2RlOyAKKyAgICAgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyAgICAgICAgLyogQmVjYXVzZSB3ZSBuZWVkIGEgU2NzaV9DbW5kIHN0cnVjdC4sIHdlIG1ha2UgYSBzY3NpX2FsbG9jYXRlIGRldmljZSBhbHNvIGZvciBrZXJuZWxzID49Mi42LnggKi8gICAgICAgIAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgc2NwICA9IHNjc2lfZ2V0X2NvbW1hbmQoaGEtPnNkZXYsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIXNjcCkKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICBzY3AtPmNtZF9sZW4gPSAxMjsKKyAgICAgICAgc2NwLT51c2Vfc2cgPSAwOworICAgICAgICBzY3AtPmRldmljZS0+Y2hhbm5lbCA9IHZpcnRfY3RyID8gMCA6IHJlcy5udW1iZXI7CisgICAgICAgIHJ2YWwgPSBnZHRoX2VoX2J1c19yZXNldChzY3ApOworICAgICAgICByZXMuc3RhdHVzID0gKHJ2YWwgPT0gU1VDQ0VTUyA/IFNfT0sgOiBTX0dFTkVSUik7CisgICAgICAgIHNjc2lfcHV0X2NvbW1hbmQoc2NwKTsKKyNlbHNlCisgICAgICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX2RldmljZShoYS0+c2RldiwgMSwgRkFMU0UpOworICAgICAgICBpZiAoIXNjcCkKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICBzY3AtPmNtZF9sZW4gPSAxMjsKKyAgICAgICAgc2NwLT51c2Vfc2cgPSAwOworICAgICAgICBzY3AtPmNoYW5uZWwgPSB2aXJ0X2N0ciA/IDAgOiByZXMubnVtYmVyOworICAgICAgICBydmFsID0gZ2R0aF9laF9idXNfcmVzZXQoc2NwKTsKKyAgICAgICAgcmVzLnN0YXR1cyA9IChydmFsID09IFNVQ0NFU1MgPyBTX09LIDogU19HRU5FUlIpOworICAgICAgICBzY3NpX3JlbGVhc2VfY29tbWFuZChzY3ApOworI2VuZGlmCisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJlcywgc2l6ZW9mKGdkdGhfaW9jdGxfcmVzZXQpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHRFRJT0NUTF9SRVNFVF9EUlY6CisgICAgICAgIHJldHVybiBpb2NfcmVzZXRkcnYoYXJncCwgY21uZCk7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOyAKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogZmx1c2ggcm91dGluZSAqLworc3RhdGljIHZvaWQgZ2R0aF9mbHVzaChpbnQgaGFudW0pCit7CisgICAgaW50ICAgICAgICAgICAgIGk7CisgICAgZ2R0aF9oYV9zdHIgICAgICpoYTsKKyAgICBnZHRoX2NtZF9zdHIgICAgZ2R0Y21kOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgICAgKnNycDsKKyNlbHNlCisgICAgU2NzaV9DbW5kICAgICAgICpzY3A7CisjZW5kaWYKKyAgICBTY3NpX0RldmljZSAgICAgKnNkZXY7CisgICAgY2hhciAgICAgICAgICAgIGNtbmRbTUFYX0NPTU1BTkRfU0laRV07ICAgCisgICAgbWVtc2V0KGNtbmQsIDB4ZmYsIE1BWF9DT01NQU5EX1NJWkUpOworCisgICAgVFJBQ0UyKCgiZ2R0aF9mbHVzaCgpIGhhbnVtICVkXG4iLGhhbnVtKSk7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIHNycCAgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzcnApCisgICAgICAgIHJldHVybjsKKyAgICBzcnAtPnNyX2NtZF9sZW4gPSAxMjsKKyAgICBzcnAtPnNyX3VzZV9zZyA9IDA7CisjZWxzZQorICAgIHNkZXYgPSBzY3NpX2dldF9ob3N0X2RldihnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9kZXZpY2Uoc2RldiwgMSwgRkFMU0UpOworICAgIGlmICghc2NwKQorICAgICAgICByZXR1cm47CisgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgc2NwLT51c2Vfc2cgPSAwOworI2VuZGlmCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hEUklWRVM7ICsraSkgeworICAgICAgICBpZiAoaGEtPmhkcltpXS5wcmVzZW50KSB7CisgICAgICAgICAgICBnZHRjbWQuQm9hcmROb2RlID0gTE9DQUxCT0FSRDsKKyAgICAgICAgICAgIGdkdGNtZC5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgZ2R0Y21kLk9wQ29kZSA9IEdEVF9GTFVTSDsKKyAgICAgICAgICAgIGlmIChoYS0+Y2FjaGVfZmVhdCAmIEdEVF82NEJJVCkgeyAKKyAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZTY0LkRldmljZU5vID0gaTsKKyAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZTY0LkJsb2NrTm8gPSAxOworICAgICAgICAgICAgICAgIGdkdGNtZC51LmNhY2hlNjQuc2dfY2FueiA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdkdGNtZC51LmNhY2hlLkRldmljZU5vID0gaTsKKyAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZS5CbG9ja05vID0gMTsKKyAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZS5zZ19jYW56ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRSQUNFMigoImdkdGhfZmx1c2goKTogZmx1c2ggaGEgJWQgZHJpdmUgJWRcbiIsIGhhbnVtLCBpKSk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgZ2R0aF9kb19yZXEoc3JwLCAmZ2R0Y21kLCBjbW5kLCAzMCk7CisjZWxzZQorICAgICAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCAmZ2R0Y21kLCBjbW5kLCAzMCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JwKTsKKyAgICBzY3NpX2ZyZWVfaG9zdF9kZXYoc2Rldik7CisjZWxzZQorICAgIHNjc2lfcmVsZWFzZV9jb21tYW5kKHNjcCk7CisgICAgc2NzaV9mcmVlX2hvc3RfZGV2KHNkZXYpOworI2VuZGlmCit9CisKKy8qIHNodXRkb3duIHJvdXRpbmUgKi8KK3N0YXRpYyBpbnQgZ2R0aF9oYWx0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVsb25nIGV2ZW50LCB2b2lkICpidWYpCit7CisgICAgaW50ICAgICAgICAgICAgIGhhbnVtOworI2lmbmRlZiBfX2FscGhhX18KKyAgICBnZHRoX2NtZF9zdHIgICAgZ2R0Y21kOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBTY3NpX1JlcXVlc3QgICAgKnNycDsKKyAgICBTY3NpX0RldmljZSAgICAgKnNkZXY7CisjZWxzZQorICAgIFNjc2lfQ21uZCAgICAgICAqc2NwOworICAgIFNjc2lfRGV2aWNlICAgICAqc2RldjsKKyNlbmRpZgorICAgIGNoYXIgICAgICAgICAgICBjbW5kW01BWF9DT01NQU5EX1NJWkVdOyAgIAorI2VuZGlmCisKKyAgICBUUkFDRTIoKCJnZHRoX2hhbHQoKSBldmVudCAlZFxuIiwoaW50KWV2ZW50KSk7CisgICAgaWYgKGV2ZW50ICE9IFNZU19SRVNUQVJUICYmIGV2ZW50ICE9IFNZU19IQUxUICYmIGV2ZW50ICE9IFNZU19QT1dFUl9PRkYpCisgICAgICAgIHJldHVybiBOT1RJRllfRE9ORTsKKworICAgIHByaW50aygiR0RULUhBOiBGbHVzaGluZyBhbGwgaG9zdCBkcml2ZXMgLi4gIik7CisgICAgZm9yIChoYW51bSA9IDA7IGhhbnVtIDwgZ2R0aF9jdHJfY291bnQ7ICsraGFudW0pIHsKKyAgICAgICAgZ2R0aF9mbHVzaChoYW51bSk7CisKKyNpZm5kZWYgX19hbHBoYV9fCisgICAgICAgIC8qIGNvbnRyb2xsZXIgcmVzZXQgKi8KKyAgICAgICAgbWVtc2V0KGNtbmQsIDB4ZmYsIE1BWF9DT01NQU5EX1NJWkUpOworICAgICAgICBnZHRjbWQuQm9hcmROb2RlID0gTE9DQUxCT0FSRDsKKyAgICAgICAgZ2R0Y21kLlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgIGdkdGNtZC5PcENvZGUgPSBHRFRfUkVTRVQ7CisgICAgICAgIFRSQUNFMigoImdkdGhfaGFsdCgpOiByZXNldCBjb250cm9sbGVyICVkXG4iLCBoYW51bSkpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgICAgICBzcnAgID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIXNycCkgeworICAgICAgICAgICAgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdkdGhfbm90aWZpZXIpOworICAgICAgICAgICAgcmV0dXJuIE5PVElGWV9PSzsKKyAgICAgICAgfQorICAgICAgICBzcnAtPnNyX2NtZF9sZW4gPSAxMjsKKyAgICAgICAgc3JwLT5zcl91c2Vfc2cgPSAwOworICAgICAgICBnZHRoX2RvX3JlcShzcnAsICZnZHRjbWQsIGNtbmQsIDEwKTsKKyAgICAgICAgc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JwKTsKKyAgICAgICAgc2NzaV9mcmVlX2hvc3RfZGV2KHNkZXYpOworI2Vsc2UKKyAgICAgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgICAgICBzY3AgID0gc2NzaV9hbGxvY2F0ZV9kZXZpY2Uoc2RldiwgMSwgRkFMU0UpOworICAgICAgICBpZiAoIXNjcCkgeworICAgICAgICAgICAgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdkdGhfbm90aWZpZXIpOworICAgICAgICAgICAgcmV0dXJuIE5PVElGWV9PSzsKKyAgICAgICAgfQorICAgICAgICBzY3AtPmNtZF9sZW4gPSAxMjsKKyAgICAgICAgc2NwLT51c2Vfc2cgPSAwOworICAgICAgICBnZHRoX2RvX2NtZChzY3AsICZnZHRjbWQsIGNtbmQsIDEwKTsKKyAgICAgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyAgICAgICAgc2NzaV9mcmVlX2hvc3RfZGV2KHNkZXYpOworI2VuZGlmCisjZW5kaWYKKyAgICB9CisgICAgcHJpbnRrKCJEb25lLlxuIik7CisKKyNpZmRlZiBHRFRIX1NUQVRJU1RJQ1MKKyAgICBkZWxfdGltZXIoJmdkdGhfdGltZXIpOworI2VuZGlmCisgICAgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmdkdGhfbm90aWZpZXIpOworICAgIHJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworICAgICAgICAucHJvY19uYW1lICAgICAgICAgICAgICA9ICJnZHRoIiwgCisgICAgICAgIC5wcm9jX2luZm8gICAgICAgICAgICAgID0gZ2R0aF9wcm9jX2luZm8sCisgICAgICAgIC5uYW1lICAgICAgICAgICAgICAgICAgID0gIkdEVCBTQ1NJIERpc2sgQXJyYXkgQ29udHJvbGxlciIsCisgICAgICAgIC5kZXRlY3QgICAgICAgICAgICAgICAgID0gZ2R0aF9kZXRlY3QsIAorICAgICAgICAucmVsZWFzZSAgICAgICAgICAgICAgICA9IGdkdGhfcmVsZWFzZSwKKyAgICAgICAgLmluZm8gICAgICAgICAgICAgICAgICAgPSBnZHRoX2luZm8sIAorICAgICAgICAucXVldWVjb21tYW5kICAgICAgICAgICA9IGdkdGhfcXVldWVjb21tYW5kLAorICAgICAgICAuZWhfYWJvcnRfaGFuZGxlciAgICAgICA9IGdkdGhfZWhfYWJvcnQsIAorICAgICAgICAuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBnZHRoX2VoX2RldmljZV9yZXNldCwKKyAgICAgICAgLmVoX2J1c19yZXNldF9oYW5kbGVyICAgPSBnZHRoX2VoX2J1c19yZXNldCwKKyAgICAgICAgLmVoX2hvc3RfcmVzZXRfaGFuZGxlciAgPSBnZHRoX2VoX2hvc3RfcmVzZXQsCisgICAgICAgIC5iaW9zX3BhcmFtICAgICAgICAgICAgID0gZ2R0aF9iaW9zX3BhcmFtLAorICAgICAgICAuY2FuX3F1ZXVlICAgICAgICAgICAgICA9IEdEVEhfTUFYQ01EUywKKyAgICAgICAgLnRoaXNfaWQgICAgICAgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnNnX3RhYmxlc2l6ZSAgICAgICAgICAgPSBHRFRIX01BWFNHLAorICAgICAgICAuY21kX3Blcl9sdW4gICAgICAgICAgICA9IEdEVEhfTUFYQ19QX0wsCisgICAgICAgIC51bmNoZWNrZWRfaXNhX2RtYSAgICAgID0gMSwKKyAgICAgICAgLnVzZV9jbHVzdGVyaW5nICAgICAgICAgPSBFTkFCTEVfQ0xVU1RFUklORywKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgLnVzZV9uZXdfZWhfY29kZSAgICAgICAgPSAxLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjApCisgICAgICAgIC5oaWdobWVtX2lvICAgICAgICAgICAgID0gMSwKKyNlbmRpZgorI2VuZGlmCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKyNpZm5kZWYgTU9EVUxFCitfX3NldHVwKCJnZHRoPSIsIG9wdGlvbl9zZXR1cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoLmggYi9kcml2ZXJzL3Njc2kvZ2R0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ2R0aC5oCkBAIC0wLDAgKzEsMTA3OSBAQAorI2lmbmRlZiBfR0RUSF9ICisjZGVmaW5lIF9HRFRIX0gKKworLyoKKyAqIEhlYWRlciBmaWxlIGZvciB0aGUgR0RUIERpc2sgQXJyYXkvU3RvcmFnZSBSQUlEIGNvbnRyb2xsZXJzIGRyaXZlciBmb3IgTGludXgKKyAqIAorICogZ2R0aC5oIENvcHlyaWdodCAoQykgMTk5NS0wMyBJQ1Agdm9ydGV4LCBBY2hpbSBMZXVibmVyCisgKiBTZWUgZ2R0aC5jIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9ucyBhbmQgCisgKiBiZWxvdyBmb3Igc3VwcG9ydGVkIGNvbnRyb2xsZXIgdHlwZXMKKyAqCisgKiA8YWNoaW1fbGV1Ym5lckBhZGFwdGVjLmNvbT4KKyAqCisgKiAkSWQ6IGdkdGguaCx2IDEuNTcgMjAwNC8wMy8zMSAxMTo1MjowOSBhY2hpbSBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisvKiBkZWZpbmVzLCBtYWNyb3MgKi8KKworLyogZHJpdmVyIHZlcnNpb24gKi8KKyNkZWZpbmUgR0RUSF9WRVJTSU9OX1NUUiAgICAgICAgIjMuMDQiCisjZGVmaW5lIEdEVEhfVkVSU0lPTiAgICAgICAgICAgIDMKKyNkZWZpbmUgR0RUSF9TVUJWRVJTSU9OICAgICAgICAgNAorCisvKiBwcm90b2NvbCB2ZXJzaW9uICovCisjZGVmaW5lIFBST1RPQ09MX1ZFUlNJT04gICAgICAgIDEKKworLyogT0VNIElEcyAqLworI2RlZmluZSBPRU1fSURfSUNQICAgICAgMHg5NDFjCisjZGVmaW5lIE9FTV9JRF9JTlRFTCAgICAweDgwMDAKKworLyogY29udHJvbGxlciBjbGFzc2VzICovCisjZGVmaW5lIEdEVF9JU0EgICAgICAgICAweDAxICAgICAgICAgICAgICAgICAgICAvKiBJU0EgY29udHJvbGxlciAqLworI2RlZmluZSBHRFRfRUlTQSAgICAgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgLyogRUlTQSBjb250cm9sbGVyICovCisjZGVmaW5lIEdEVF9QQ0kgICAgICAgICAweDAzICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgY29udHJvbGxlciAqLworI2RlZmluZSBHRFRfUENJTkVXICAgICAgMHgwNCAgICAgICAgICAgICAgICAgICAgLyogbmV3IFBDSSBjb250cm9sbGVyICovCisjZGVmaW5lIEdEVF9QQ0lNUFIgICAgICAweDA1ICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgTVBSIGNvbnRyb2xsZXIgKi8KKy8qIEdEVF9FSVNBLCBjb250cm9sbGVyIHN1YnR5cGVzIEVJU0EgKi8KKyNkZWZpbmUgR0RUM19JRCAgICAgICAgIDB4MDEzMDk0MWMgICAgICAgICAgICAgIC8qIEdEVDMwMDAvMzAyMCAqLworI2RlZmluZSBHRFQzQV9JRCAgICAgICAgMHgwMjMwOTQxYyAgICAgICAgICAgICAgLyogR0RUMzAwMEEvMzAyMEEvMzA1MEEgKi8KKyNkZWZpbmUgR0RUM0JfSUQgICAgICAgIDB4MDMzMDk0MWMgICAgICAgICAgICAgIC8qIEdEVDMwMDBCLzMwMTBBICovCisvKiBHRFRfSVNBICovCisjZGVmaW5lIEdEVDJfSUQgICAgICAgICAweDAxMjA5NDFjICAgICAgICAgICAgICAvKiBHRFQyMDAwLzIwMjAgKi8KKworLyogdmVuZG9yIElELCBkZXZpY2UgSURzIChQQ0kpICovCisvKiB0aGVzZSBkZWZpbmVzIHNob3VsZCBhbHJlYWR5IGV4aXN0IGluIDxsaW51eC9wY2kuaD4gKi8KKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9WT1JURVgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WT1JURVggICAgICAgICAgICAweDExMTkgIC8qIFBDSSBjb250cm9sbGVyIHZlbmRvciBJRCAqLworI2VuZGlmCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfSU5URUwKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFTCAgICAgICAgICAgICAweDgwODYgIAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjB4MAorLyogR0RUX1BDSSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2MHgwICAgIDAgICAgICAgLyogR0RUNjAwMC82MDIwLzYwNTAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjAwMEIgICAxICAgICAgIC8qIEdEVDYwMDBCLzYwMTAgKi8KKy8qIEdEVF9QQ0lORVcgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxMCAgICAyICAgICAgIC8qIEdEVDYxMTAvNjUxMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDIwICAgIDMgICAgICAgLyogR0RUNjEyMC82NTIwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1MzAgICAgNCAgICAgICAvKiBHRFQ2NTMwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1NTAgICAgNSAgICAgICAvKiBHRFQ2NTUwICovCisvKiBHRFRfUENJTkVXLCB3aWRlL3VsdHJhIFNDU0kgY29udHJvbGxlcnMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxNyAgICA2ICAgICAgIC8qIEdEVDYxMTcvNjUxNyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI3ICAgIDcgICAgICAgLyogR0RUNjEyNy82NTI3ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1MzcgICAgOCAgICAgICAvKiBHRFQ2NTM3ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1NTcgICAgOSAgICAgICAvKiBHRFQ2NTU3LzY1NTctRUNDICovCisvKiBHRFRfUENJTkVXLCB3aWRlIFNDU0kgY29udHJvbGxlcnMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxNSAgICAxMCAgICAgIC8qIEdEVDYxMTUvNjUxNSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDI1ICAgIDExICAgICAgLyogR0RUNjEyNS82NTI1ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1MzUgICAgMTIgICAgICAvKiBHRFQ2NTM1ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1NTUgICAgMTMgICAgICAvKiBHRFQ2NTU1LzY1NTUtRUNDICovCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDE3UlAKKy8qIEdEVF9NUFIsIFJQIHNlcmllcywgd2lkZS91bHRyYSBTQ1NJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTdSUCAgMHgxMDAgICAvKiBHRFQ2MTE3UlAvR0RUNjUxN1JQICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjdSUCAgMHgxMDEgICAvKiBHRFQ2MTI3UlAvR0RUNjUyN1JQICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDY1MzdSUCAgMHgxMDIgICAvKiBHRFQ2NTM3UlAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjU1N1JQICAweDEwMyAgIC8qIEdEVDY1NTdSUCAqLworLyogR0RUX01QUiwgUlAgc2VyaWVzLCBuYXJyb3cvdWx0cmEgU0NTSSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDExUlAgIDB4MTA0ICAgLyogR0RUNjExMVJQL0dEVDY1MTFSUCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2eDIxUlAgIDB4MTA1ICAgLyogR0RUNjEyMVJQL0dEVDY1MjFSUCAqLworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTdSRAorLyogR0RUX01QUiwgUkQgc2VyaWVzLCB3aWRlL3VsdHJhIFNDU0kgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxN1JEICAweDExMCAgIC8qIEdEVDYxMTdSRC9HRFQ2NTE3UkQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyN1JEICAweDExMSAgIC8qIEdEVDYxMjdSRC9HRFQ2NTI3UkQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNjUzN1JEICAweDExMiAgIC8qIEdEVDY1MzdSRCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFQ2NTU3UkQgIDB4MTEzICAgLyogR0RUNjU1N1JEICovCisvKiBHRFRfTVBSLCBSRCBzZXJpZXMsIG5hcnJvdy91bHRyYSBTQ1NJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTFSRCAgMHgxMTQgICAvKiBHRFQ2MTExUkQvR0RUNjUxMVJEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjFSRCAgMHgxMTUgICAvKiBHRFQ2MTIxUkQvR0RUNjUyMVJEICovCisvKiBHRFRfTVBSLCBSRCBzZXJpZXMsIHdpZGUvdWx0cmEyIFNDU0kgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngxOFJEICAweDExOCAgIC8qIEdEVDYxMThSRC9HRFQ2NTE4UkQvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRFQ2NjE4UkQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngyOFJEICAweDExOSAgIC8qIEdEVDYxMjhSRC9HRFQ2NTI4UkQvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRFQ2NjI4UkQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNngzOFJEICAweDExQSAgIC8qIEdEVDY1MzhSRC9HRFQ2NjM4UkQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUNng1OFJEICAweDExQiAgIC8qIEdEVDY1NThSRC9HRFQ2NjU4UkQgKi8KKy8qIEdEVF9NUFIsIFJOIHNlcmllcyAoNjQtYml0IFBDSSksIHdpZGUvdWx0cmEyIFNDU0kgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUN3gxOFJOICAweDE2OCAgIC8qIEdEVDcxMThSTi9HRFQ3NTE4Uk4vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRFQ3NjE4Uk4gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUN3gyOFJOICAweDE2OSAgIC8qIEdEVDcxMjhSTi9HRFQ3NTI4Uk4vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRFQ3NjI4Uk4gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUN3gzOFJOICAweDE2QSAgIC8qIEdEVDc1MzhSTi9HRFQ3NjM4Uk4gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUN3g1OFJOICAweDE2QiAgIC8qIEdEVDc1NThSTi9HRFQ3NjU4Uk4gKi8KKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTlSRAorLyogR0RUX01QUiwgUkQgc2VyaWVzLCBGaWJyZSBDaGFubmVsICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MTlSRCAgMHgyMTAgICAvKiBHRFQ2NTE5UkQvR0RUNjYxOVJEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDZ4MjlSRCAgMHgyMTEgICAvKiBHRFQ2NTI5UkQvR0RUNjYyOVJEICovCisvKiBHRFRfTVBSLCBSTiBzZXJpZXMgKDY0LWJpdCBQQ0kpLCBGaWJyZSBDaGFubmVsICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDd4MTlSTiAgMHgyNjAgICAvKiBHRFQ3NTE5Uk4vR0RUNzYxOVJOICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk9SVEVYX0dEVDd4MjlSTiAgMHgyNjEgICAvKiBHRFQ3NTI5Uk4vR0RUNzYyOVJOICovCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFRNQVhSUAorLyogR0RUX01QUiwgbGFzdCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTUFYUlAgICAweDJmZiAgIAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9WT1JURVhfR0RUTkVXUlgKKy8qIG5ldyBHRFQgUnggQ29udHJvbGxlciAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFRORVdSWCAgIDB4MzAwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFRORVdSWDIKKy8qIG5ldygyKSBHRFQgUnggQ29udHJvbGxlciAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZPUlRFWF9HRFRORVdSWDIgIDB4MzAxCisjZW5kaWYgICAgICAgIAorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfSU5URUxfU1JDCisvKiBJbnRlbCBTdG9yYWdlIFJBSUQgQ29udHJvbGxlciAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NSQyAgICAgICAgIDB4NjAwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0lOVEVMX1NSQ19YU0NBTEUKKy8qIEludGVsIFN0b3JhZ2UgUkFJRCBDb250cm9sbGVyICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU1JDX1hTQ0FMRSAgMHg2MDEKKyNlbmRpZgorCisvKiBsaW1pdHMgKi8KKyNkZWZpbmUgR0RUSF9TQ1JBVENIICAgIFBBR0VfU0laRSAgICAgICAgICAgICAgIC8qIDRLQiBzY3JhdGNoIGJ1ZmZlciAqLworI2RlZmluZSBHRFRIX01BWENNRFMgICAgMTIwCisjZGVmaW5lIEdEVEhfTUFYQ19QX0wgICAxNiAgICAgICAgICAgICAgICAgICAgICAvKiBtYXguIGNtZHMgcGVyIGx1biAqLworI2RlZmluZSBHRFRIX01BWF9SQVcgICAgMiAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4LiBjbWRzIHBlciByYXcgZGV2aWNlICovCisjZGVmaW5lIE1BWE9GRlNFVFMgICAgICAxMjgKKyNkZWZpbmUgTUFYSEEgICAgICAgICAgIDE2CisjZGVmaW5lIE1BWElEICAgICAgICAgICAxMjcKKyNkZWZpbmUgTUFYTFVOICAgICAgICAgIDgKKyNkZWZpbmUgTUFYQlVTICAgICAgICAgIDYKKyNkZWZpbmUgTUFYX0VWRU5UUyAgICAgIDEwMCAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50IGJ1ZmZlciBjb3VudCAqLworI2RlZmluZSBNQVhfUkVTX0FSR1MgICAgNDAgICAgICAgICAgICAgICAgICAgICAgLyogZGV2aWNlIHJlc2VydmF0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0ICovCisjZGVmaW5lIE1BWENZTFMgICAgICAgICAxMDI0CisjZGVmaW5lIEhFQURTICAgICAgICAgICA2NAorI2RlZmluZSBTRUNTICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgLyogbWFwcGluZyA2NCozMiAqLworI2RlZmluZSBNRURIRUFEUyAgICAgICAgMTI3CisjZGVmaW5lIE1FRFNFQ1MgICAgICAgICA2MyAgICAgICAgICAgICAgICAgICAgICAvKiBtYXBwaW5nIDEyNyo2MyAqLworI2RlZmluZSBCSUdIRUFEUyAgICAgICAgMjU1CisjZGVmaW5lIEJJR1NFQ1MgICAgICAgICA2MyAgICAgICAgICAgICAgICAgICAgICAvKiBtYXBwaW5nIDI1NSo2MyAqLworCisvKiBzcGVjaWFsIGNvbW1hbmQgcHRyLiAqLworI2RlZmluZSBVTlVTRURfQ01ORCAgICAgKChTY3NpX0NtbmQgKiktMSkKKyNkZWZpbmUgSU5URVJOQUxfQ01ORCAgICgoU2NzaV9DbW5kICopLTIpCisjZGVmaW5lIFNDUkVFTl9DTU5EICAgICAoKFNjc2lfQ21uZCAqKS0zKQorI2RlZmluZSBTUEVDSUFMX1NDUChwKSAgKHA9PVVOVVNFRF9DTU5EIHx8IHA9PUlOVEVSTkFMX0NNTkQgfHwgcD09U0NSRUVOX0NNTkQpCisKKy8qIGNvbnRyb2xsZXIgc2VydmljZXMgKi8KKyNkZWZpbmUgU0NTSVJBV1NFUlZJQ0UgIDMKKyNkZWZpbmUgQ0FDSEVTRVJWSUNFICAgIDkKKyNkZWZpbmUgU0NSRUVOU0VSVklDRSAgIDExCisKKy8qIHNjcmVlbnNlcnZpY2UgZGVmaW5lcyAqLworI2RlZmluZSBNU0dfSU5WX0hBTkRMRSAgLTEgICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBtZXNzYWdlIGhhbmRsZSAqLworI2RlZmluZSBNU0dMRU4gICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBtZXNzYWdlIHRleHQgKi8KKyNkZWZpbmUgTVNHX1NJWkUgICAgICAgIDM0ICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTVNHX1JFUVVFU1QgICAgIDAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzeW5jLiBldmVudDogbWVzc2FnZSAqLworCisvKiBjYWNoZXNlcnZpY2UgZGVmaW5lcyAqLworI2RlZmluZSBTRUNUT1JfU0laRSAgICAgMHgyMDAgICAgICAgICAgICAgICAgICAgLyogYWx3YXlzIDUxMiBieXRlcyBwZXIgc2VjLiAqLworCisvKiBEUE1FTSBjb25zdGFudHMgKi8KKyNkZWZpbmUgRFBNRU1fTUFHSUMgICAgIDB4QzBGRkVFMTEKKyNkZWZpbmUgSUNfSEVBREVSX0JZVEVTIDQ4CisjZGVmaW5lIElDX1FVRVVFX0JZVEVTICA0CisjZGVmaW5lIERQTUVNX0NPTU1BTkRfT0ZGU0VUICAgIElDX0hFQURFUl9CWVRFUytJQ19RVUVVRV9CWVRFUypNQVhPRkZTRVRTCisKKy8qIGNsdXN0ZXJfdHlwZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ0xVU1RFUl9EUklWRSAgICAgICAgIDEKKyNkZWZpbmUgQ0xVU1RFUl9NT1VOVEVEICAgICAgIDIKKyNkZWZpbmUgQ0xVU1RFUl9SRVNFUlZFRCAgICAgIDQKKyNkZWZpbmUgQ0xVU1RFUl9SRVNFUlZFX1NUQVRFIChDTFVTVEVSX0RSSVZFfENMVVNURVJfTU9VTlRFRHxDTFVTVEVSX1JFU0VSVkVEKQorCisvKiBjb21tYW5kcyBmb3IgYWxsIHNlcnZpY2VzLCBjYWNoZSBzZXJ2aWNlICovCisjZGVmaW5lIEdEVF9JTklUICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJ2aWNlIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEdEVF9SRUFEICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGNvbW1hbmQgKi8KKyNkZWZpbmUgR0RUX1dSSVRFICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGNvbW1hbmQgKi8KKyNkZWZpbmUgR0RUX0lORk8gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZm9ybWF0aW9uIGFib3V0IGRldmljZXMgKi8KKyNkZWZpbmUgR0RUX0ZMVVNIICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoIGRpcnR5IGNhY2hlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgR0RUX0lPQ1RMICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgIC8qIGlvY3RsIGNvbW1hbmQgKi8KKyNkZWZpbmUgR0RUX0RFVlRZUEUgICAgIDkgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgR0RUX01PVU5UICAgICAgIDEwICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdW50IGNhY2hlIGRldmljZSAqLworI2RlZmluZSBHRFRfVU5NT1VOVCAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgLyogdW5tb3VudCBjYWNoZSBkZXZpY2UgKi8KKyNkZWZpbmUgR0RUX1NFVF9GRUFUICAgIDEyICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBmZWF0LiAoc2NhdHRlci9nYXRoZXIpICovCisjZGVmaW5lIEdEVF9HRVRfRkVBVCAgICAxMyAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgZmVhdHVyZXMgKi8KKyNkZWZpbmUgR0RUX1dSSVRFX1RIUiAgIDE2ICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIHRocm91Z2ggKi8KKyNkZWZpbmUgR0RUX1JFQURfVEhSICAgIDE3ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQgdGhyb3VnaCAqLworI2RlZmluZSBHRFRfRVhUX0lORk8gICAgMTggICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgaW5mbyAqLworI2RlZmluZSBHRFRfUkVTRVQgICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSBHRFRfUkVTRVJWRV9EUlYgMjAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZSBob3N0IGRyaXZlICovCisjZGVmaW5lIEdEVF9SRUxFQVNFX0RSViAyMSAgICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlIGhvc3QgZHJpdmUgKi8KKyNkZWZpbmUgR0RUX0NMVVNUX0lORk8gIDIyICAgICAgICAgICAgICAgICAgICAgIC8qIGNsdXN0ZXIgaW5mbyAqLworI2RlZmluZSBHRFRfUldfQVRUUklCUyAgMjMgICAgICAgICAgICAgICAgICAgICAgLyogUi9XIGF0dHJpYnMgKHdyaXRlIHRocnUsLi4pKi8KKyNkZWZpbmUgR0RUX0NMVVNUX1JFU0VUIDI0ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbGVhc2VzIHRoZSBjbHVzdGVyIGRyaXZlcyovCisjZGVmaW5lIEdEVF9GUkVFWkVfSU8gICAyNSAgICAgICAgICAgICAgICAgICAgICAvKiBmcmVlemVzIGFsbCBJT3MgKi8KKyNkZWZpbmUgR0RUX1VORlJFRVpFX0lPIDI2ICAgICAgICAgICAgICAgICAgICAgIC8qIHVuZnJlZXplcyBhbGwgSU9zICovCisjZGVmaW5lIEdEVF9YX0lOSVRfSE9TVCAyOSAgICAgICAgICAgICAgICAgICAgICAvKiBleHQuIGluaXQ6IDY0IGJpdCBzdXBwb3J0ICovCisjZGVmaW5lIEdEVF9YX0lORk8gICAgICAzMCAgICAgICAgICAgICAgICAgICAgICAvKiBleHQuIGluZm8gZm9yIGRyaXZlcz4yVEIgKi8KKworLyogcmF3IHNlcnZpY2UgY29tbWFuZHMgKi8KKyNkZWZpbmUgR0RUX1JFU0VSVkUgICAgIDE0ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmUgZGV2LiB0byByYXcgc2Vydi4gKi8KKyNkZWZpbmUgR0RUX1JFTEVBU0UgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbGVhc2UgZGV2aWNlICovCisjZGVmaW5lIEdEVF9SRVNFUlZFX0FMTCAxNiAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlIGFsbCBkZXZpY2VzICovCisjZGVmaW5lIEdEVF9SRUxFQVNFX0FMTCAxNyAgICAgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlIGFsbCBkZXZpY2VzICovCisjZGVmaW5lIEdEVF9SRVNFVF9CVVMgICAxOCAgICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBidXMgKi8KKyNkZWZpbmUgR0RUX1NDQU5fU1RBUlQgIDE5ICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGRldmljZSBzY2FuICovCisjZGVmaW5lIEdEVF9TQ0FOX0VORCAgICAyMCAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9wIGRldmljZSBzY2FuICovICAKKyNkZWZpbmUgR0RUX1hfSU5JVF9SQVcgIDIxICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dC4gaW5pdDogNjQgYml0IHN1cHBvcnQgKi8KKworLyogc2NyZWVuIHNlcnZpY2UgY29tbWFuZHMgKi8KKyNkZWZpbmUgR0RUX1JFQUxUSU1FICAgIDMgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWx0aW1lIGNsb2NrIHRvIHNjcmVlbnMuICovCisjZGVmaW5lIEdEVF9YX0lOSVRfU0NSICA0ICAgICAgICAgICAgICAgICAgICAgICAvKiBleHQuIGluaXQ6IDY0IGJpdCBzdXBwb3J0ICovCisKKy8qIElPQ1RMIGNvbW1hbmQgZGVmaW5lcyAqLworI2RlZmluZSBTQ1NJX0RSX0lORk8gICAgMHgwMCAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBkcml2ZSBpbmZvICovICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBTQ1NJX0NIQU5fQ05UICAgMHgwNSAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBjaGFubmVsIGNvdW50ICovICAgCisjZGVmaW5lIFNDU0lfRFJfTElTVCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIGRyaXZlIGxpc3QgKi8KKyNkZWZpbmUgU0NTSV9ERUZfQ05UICAgIDB4MTUgICAgICAgICAgICAgICAgICAgIC8qIGdyb3duL3ByaW1hcnkgZGVmZWN0cyAqLworI2RlZmluZSBEU0tfU1RBVElTVElDUyAgMHg0YiAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBkaXNrIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgSU9DSEFOX0RFU0MgICAgIDB4NWQgICAgICAgICAgICAgICAgICAgIC8qIGRlc2NyaXB0aW9uIG9mIElPIGNoYW5uZWwgKi8KKyNkZWZpbmUgSU9DSEFOX1JBV19ERVNDIDB4NWUgICAgICAgICAgICAgICAgICAgIC8qIGRlc2NyaXB0aW9uIG9mIHJhdyBJTyBjaG4uICovCisjZGVmaW5lIExfQ1RSTF9QQVRURVJOICAweDIwMDAwMDAwTCAgICAgICAgICAgICAvKiBTQ1NJIElPQ1RMIG1hc2sgKi8KKyNkZWZpbmUgQVJSQVlfSU5GTyAgICAgIDB4MTIgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5IGRyaXZlIGluZm8gKi8KKyNkZWZpbmUgQVJSQVlfRFJWX0xJU1QgIDB4MGYgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5IGRyaXZlIGxpc3QgKi8KKyNkZWZpbmUgQVJSQVlfRFJWX0xJU1QyIDB4MzQgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5IGRyaXZlIGxpc3QgKG5ldykgKi8KKyNkZWZpbmUgTEFfQ1RSTF9QQVRURVJOIDB4MTAwMDAwMDBMICAgICAgICAgICAgIC8qIGFycmF5IElPQ1RMIG1hc2sgKi8KKyNkZWZpbmUgQ0FDSEVfRFJWX0NOVCAgIDB4MDEgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIGRyaXZlIGNvdW50ICovCisjZGVmaW5lIENBQ0hFX0RSVl9MSVNUICAweDAyICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBkcml2ZSBsaXN0ICovCisjZGVmaW5lIENBQ0hFX0lORk8gICAgICAweDA0ICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBpbmZvICovCisjZGVmaW5lIENBQ0hFX0NPTkZJRyAgICAweDA1ICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENBQ0hFX0RSVl9JTkZPICAweDA3ICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBkcml2ZSBpbmZvICovCisjZGVmaW5lIEJPQVJEX0ZFQVRVUkVTICAweDE1ICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGZlYXR1cmVzICovCisjZGVmaW5lIEJPQVJEX0lORk8gICAgICAweDI4ICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIGluZm8gKi8KKyNkZWZpbmUgU0VUX1BFUkZfTU9ERVMgIDB4ODIgICAgICAgICAgICAgICAgICAgIC8qIHNldCBtb2RlIChjb2FsZXNjaW5nLC4uKSAqLworI2RlZmluZSBHRVRfUEVSRl9NT0RFUyAgMHg4MyAgICAgICAgICAgICAgICAgICAgLyogZ2V0IG1vZGUgKi8KKyNkZWZpbmUgQ0FDSEVfUkVBRF9PRU1fU1RSSU5HX1JFQ09SRCAweDg0ICAgICAgIC8qIHJlYWQgT0VNIHN0cmluZyByZWNvcmQgKi8gCisjZGVmaW5lIEhPU1RfR0VUICAgICAgICAweDEwMDAxTCAgICAgICAgICAgICAgICAvKiBnZXQgaG9zdCBkcml2ZSBsaXN0ICovCisjZGVmaW5lIElPX0NIQU5ORUwgICAgICAweDAwMDIwMDAwTCAgICAgICAgICAgICAvKiBkZWZhdWx0IElPIGNoYW5uZWwgKi8KKyNkZWZpbmUgSU5WQUxJRF9DSEFOTkVMIDB4MDAwMGZmZmZMICAgICAgICAgICAgIC8qIGludmFsaWQgY2hhbm5lbCAqLworCisvKiBzZXJ2aWNlIGVycm9ycyAqLworI2RlZmluZSBTX09LICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgKi8KKyNkZWZpbmUgU19HRU5FUlIgICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgZXJyb3IgKi8KKyNkZWZpbmUgU19CU1kgICAgICAgICAgIDcgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgYnVzeSAqLworI2RlZmluZSBTX0NBQ0hFX1VOS05PV04gMTIgICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgc2Vydi46IGRyaXZlIHVua25vd24gKi8KKyNkZWZpbmUgU19SQVdfU0NTSSAgICAgIDEyICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBzZXJ2LjogdGFyZ2V0IGVycm9yICovCisjZGVmaW5lIFNfUkFXX0lMTCAgICAgICAweGZmICAgICAgICAgICAgICAgICAgICAvKiByYXcgc2Vydi46IGlsbGVnYWwgKi8KKyNkZWZpbmUgU19OT0ZVTkMgICAgICAgIC0yICAgICAgICAgICAgICAgICAgICAgIC8qIHVua25vd24gZnVuY3Rpb24gKi8KKyNkZWZpbmUgU19DQUNIRV9SRVNFUlYgIC0yNCAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlOiByZXNlcnYuIGNvbmZsaWN0ICovICAgCisKKy8qIHRpbWVvdXQgdmFsdWVzICovCisjZGVmaW5lIElOSVRfUkVUUklFUyAgICAxMDAwMDAgICAgICAgICAgICAgICAgICAvKiAxMDAwMDAgKiAxbXMgPSAxMDBzICovCisjZGVmaW5lIElOSVRfVElNRU9VVCAgICAxMDAwMDAgICAgICAgICAgICAgICAgICAvKiAxMDAwMDAgKiAxbXMgPSAxMDBzICovCisjZGVmaW5lIFBPTExfVElNRU9VVCAgICAxMDAwMCAgICAgICAgICAgICAgICAgICAvKiAxMDAwMCAqIDFtcyA9IDEwcyAqLworCisvKiBwcmlvcml0aWVzICovCisjZGVmaW5lIERFRkFVTFRfUFJJICAgICAweDIwCisjZGVmaW5lIElPQ1RMX1BSSSAgICAgICAweDEwCisjZGVmaW5lIEhJR0hfUFJJICAgICAgICAweDA4CisKKy8qIGRhdGEgZGlyZWN0aW9ucyAqLworI2RlZmluZSBHRFRIX0RBVEFfSU4gICAgMHgwMTAwMDAwMEwgICAgICAgICAgICAgLyogZGF0YSBmcm9tIHRhcmdldCAqLworI2RlZmluZSBHRFRIX0RBVEFfT1VUICAgMHgwMDAwMDAwMEwgICAgICAgICAgICAgLyogZGF0YSB0byB0YXJnZXQgKi8KKworLyogQk1JQyByZWdpc3RlcnMgKEVJU0EgY29udHJvbGxlcnMpICovCisjZGVmaW5lIElEMFJFRyAgICAgICAgICAweDBjODAgICAgICAgICAgICAgICAgICAvKiBib2FyZCBJRCAqLworI2RlZmluZSBFSU5URU5BQlJFRyAgICAgMHgwYzg5ICAgICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBTRU1BMFJFRyAgICAgICAgMHgwYzhhICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgU0VNQTFSRUcgICAgICAgIDB4MGM4YiAgICAgICAgICAgICAgICAgIC8qIHN0YXR1cyBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgTERPT1JSRUcgICAgICAgIDB4MGM4ZCAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIGRvb3JiZWxsICovCisjZGVmaW5lIEVERU5BQlJFRyAgICAgICAweDBjOGUgICAgICAgICAgICAgICAgICAvKiBFSVNBIHN5c3RlbSBkb29yYmVsbCBlbmFiLiAqLworI2RlZmluZSBFRE9PUlJFRyAgICAgICAgMHgwYzhmICAgICAgICAgICAgICAgICAgLyogRUlTQSBzeXN0ZW0gZG9vcmJlbGwgKi8KKyNkZWZpbmUgTUFJTEJPWFJFRyAgICAgIDB4MGM5MCAgICAgICAgICAgICAgICAgIC8qIG1haWxib3ggcmVnLiAoMTYgYnl0ZXMpICovCisjZGVmaW5lIEVJU0FSRUcgICAgICAgICAweDBjYzAgICAgICAgICAgICAgICAgICAvKiBFSVNBIGNvbmZpZ3VyYXRpb24gKi8KKworLyogRE1BIG1lbW9yeSBtYXBwaW5ncyAqLworI2RlZmluZSBHRFRIX01BUF9OT05FICAgMAorI2RlZmluZSBHRFRIX01BUF9TSU5HTEUgMQorI2RlZmluZSBHRFRIX01BUF9TRyAgICAgMgorI2RlZmluZSBHRFRIX01BUF9JT0NUTCAgMyAKKworLyogb3RoZXIgZGVmaW5lcyAqLworI2RlZmluZSBMSU5VWF9PUyAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZCBmb3IgY2FjaGUgb3B0aW0uICovCisjZGVmaW5lIFNDQVRURVJfR0FUSEVSICAxICAgICAgICAgICAgICAgICAgICAgICAvKiBzL2cgZmVhdHVyZSAqLworI2RlZmluZSBTRUNTMzIgICAgICAgICAgMHgxZiAgICAgICAgICAgICAgICAgICAgLyogcm91bmQgY2FwYWNpdHkgKi8KKyNkZWZpbmUgQklPU19JRF9PRkZTICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCBjb250ci1JRCBpbiBJU0FCSU9TICovCisjZGVmaW5lIExPQ0FMQk9BUkQgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBib2FyZCBub2RlIGFsd2F5cyAwICovCisjZGVmaW5lIEFTWU5DSU5ERVggICAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBjbWQgaW5kZXggYXN5bmMuIGV2ZW50ICovCisjZGVmaW5lIFNQRVpJTkRFWCAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAvKiBjbWQgaW5kZXggdW5rbm93biBzZXJ2aWNlICovCisjZGVmaW5lIENPQUxJTkRFWCAgICAgICAoR0RUSF9NQVhDTURTICsgMikKKworLyogZmVhdHVyZXMgKi8KKyNkZWZpbmUgU0NBVFRFUl9HQVRIRVIgIDEgICAgICAgICAgICAgICAgICAgICAgIC8qIHMvZyBmZWF0dXJlICovCisjZGVmaW5lIEdEVF9XUl9USFJPVUdIICAweDEwMCAgICAgICAgICAgICAgICAgICAvKiBXUklURV9USFJPVUdIIHN1cHBvcnRlZCAqLworI2RlZmluZSBHRFRfNjRCSVQgICAgICAgMHgyMDAgICAgICAgICAgICAgICAgICAgLyogNjRiaXQgLyBkcnY+MlRCIHN1cHBvcnQgKi8KKworI2luY2x1ZGUgImdkdGhfaW9jdGwuaCIKKworLyogc2NyZWVuc2VydmljZSBtZXNzYWdlICovCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHVsb25nMzIgICAgIG1zZ19oYW5kbGU7ICAgICAgICAgICAgICAgICAgICAgLyogbWVzc2FnZSBoYW5kbGUgKi8KKyAgICB1bG9uZzMyICAgICBtc2dfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgbWVzc2FnZSAqLworICAgIHVsb25nMzIgICAgIG1zZ19hbGVuOyAgICAgICAgICAgICAgICAgICAgICAgLyogYW5zd2VyIGxlbmd0aCAqLworICAgIHVuY2hhciAgICAgIG1zZ19hbnN3ZXI7ICAgICAgICAgICAgICAgICAgICAgLyogYW5zd2VyIGZsYWcgKi8KKyAgICB1bmNoYXIgICAgICBtc2dfZXh0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vcmUgbWVzc2FnZXMgKi8KKyAgICB1bmNoYXIgICAgICBtc2dfcmVzZXJ2ZWRbMl07CisgICAgY2hhciAgICAgICAgbXNnX3RleHRbTVNHTEVOKzJdOyAgICAgICAgICAgICAvKiB0aGUgbWVzc2FnZSB0ZXh0ICovCit9IFBBQ0tFRCBnZHRoX21zZ19zdHI7CisKKworLyogSU9DVEwgZGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qIFN0YXR1cyBjb2FsZXNjaW5nIGJ1ZmZlciBmb3IgcmV0dXJuaW5nIG11bHRpcGxlIHJlcXVlc3RzIHBlciBpbnRlcnJ1cHQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBzdGF0dXM7CisgICAgdWxvbmczMiAgICAgZXh0X3N0YXR1czsKKyAgICB1bG9uZzMyICAgICBpbmZvMDsKKyAgICB1bG9uZzMyICAgICBpbmZvMTsKK30gUEFDS0VEIGdkdGhfY29hbF9zdGF0dXM7CisKKy8qIHBlcmZvcm1hbmNlIG1vZGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICB2ZXJzaW9uOyAgICAgICAgICAgIC8qIFRoZSB2ZXJzaW9uIG9mIHRoaXMgSU9DVEwgc3RydWN0dXJlLiAqLworICAgIHVsb25nMzIgICAgIHN0X21vZGU7ICAgICAgICAgICAgLyogMD1kaXMuLCAxPXN0X2J1Zl9hZGRyMSB2YWxpZCwgMj1ib3RoICAqLworICAgIHVsb25nMzIgICAgIHN0X2J1ZmZfYWRkcjE7ICAgICAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBzdGF0dXMgYnVmZmVyIDEgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX3VfYWRkcjE7ICAgIC8qIHJlc2VydmVkIGZvciA2NCBiaXQgYWRkcmVzc2luZyAqLworICAgIHVsb25nMzIgICAgIHN0X2J1ZmZfaW5keDE7ICAgICAgLyogcmVzZXJ2ZWQgY29tbWFuZCBpZHguIGZvciB0aGlzIGJ1ZmZlciAqLworICAgIHVsb25nMzIgICAgIHN0X2J1ZmZfYWRkcjI7ICAgICAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBzdGF0dXMgYnVmZmVyIDEgKi8KKyAgICB1bG9uZzMyICAgICBzdF9idWZmX3VfYWRkcjI7ICAgIC8qIHJlc2VydmVkIGZvciA2NCBiaXQgYWRkcmVzc2luZyAqLworICAgIHVsb25nMzIgICAgIHN0X2J1ZmZfaW5keDI7ICAgICAgLyogcmVzZXJ2ZWQgY29tbWFuZCBpZHguIGZvciB0aGlzIGJ1ZmZlciAqLworICAgIHVsb25nMzIgICAgIHN0X2J1ZmZfc2l6ZTsgICAgICAgLyogc2l6ZSBvZiBlYWNoIGJ1ZmZlciBpbiBieXRlcyAqLworICAgIHVsb25nMzIgICAgIGNtZF9tb2RlOyAgICAgICAgICAgLyogMCA9IG1vZGUgZGlzYWJsZWQsIDEgPSBjbWRfYnVmZl9hZGRyMSAqLyAKKyAgICB1bG9uZzMyICAgICBjbWRfYnVmZl9hZGRyMTsgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgY21kIGJ1ZmZlciAxICovICAgCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfdV9hZGRyMTsgICAvKiByZXNlcnZlZCBmb3IgNjQgYml0IGFkZHJlc3NpbmcgKi8KKyAgICB1bG9uZzMyICAgICBjbWRfYnVmZl9pbmR4MTsgICAgIC8qIGNtZCBidWYgYWRkcjEgdW5pcXVlIGlkZW50aWZpZXIgKi8KKyAgICB1bG9uZzMyICAgICBjbWRfYnVmZl9hZGRyMjsgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgY21kIGJ1ZmZlciAxICovICAgCisgICAgdWxvbmczMiAgICAgY21kX2J1ZmZfdV9hZGRyMjsgICAvKiByZXNlcnZlZCBmb3IgNjQgYml0IGFkZHJlc3NpbmcgKi8KKyAgICB1bG9uZzMyICAgICBjbWRfYnVmZl9pbmR4MjsgICAgIC8qIGNtZCBidWYgYWRkcjEgdW5pcXVlIGlkZW50aWZpZXIgKi8KKyAgICB1bG9uZzMyICAgICBjbWRfYnVmZl9zaXplOyAgICAgIC8qIHNpemUgb2YgZWFjaCBjbWQgYnVmZXIgaW4gYnl0ZXMgKi8KKyAgICB1bG9uZzMyICAgICByZXNlcnZlZDE7CisgICAgdWxvbmczMiAgICAgcmVzZXJ2ZWQyOworfSBQQUNLRUQgZ2R0aF9wZXJmX21vZGVzOworCisvKiBTQ1NJIGRyaXZlIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICB2ZW5kb3JbOF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHZlbmRvciBzdHJpbmcgKi8KKyAgICB1bmNoYXIgICAgICBwcm9kdWN0WzE2XTsgICAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3Qgc3RyaW5nICovCisgICAgdW5jaGFyICAgICAgcmV2aXNpb25bNF07ICAgICAgICAgICAgICAgICAgICAvKiByZXZpc2lvbiAqLworICAgIHVsb25nMzIgICAgIHN5X3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCByYXRlIGZvciBzeW5jLiB0ci4gKi8KKyAgICB1bG9uZzMyICAgICBzeV9tYXhfcmF0ZTsgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gcmF0ZSBmb3Igc3luYy4gdHIuICovCisgICAgdWxvbmczMiAgICAgbm9fbGRyaXZlOyAgICAgICAgICAgICAgICAgICAgICAvKiBiZWxvbmdzIHRvIHRoaXMgbG9nLiBkcnYuKi8KKyAgICB1bG9uZzMyICAgICBibGtjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICB1c2hvcnQgICAgICBibGtzaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgYmxvY2sgaW4gYnl0ZXMgKi8KKyAgICB1bmNoYXIgICAgICBhdmFpbGFibGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IGFjY2VzcyBpcyBhdmFpbGFibGUgKi8KKyAgICB1bmNoYXIgICAgICBpbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lZGl1bSBpcyBpbml0aWFsaXplZCAqLworICAgIHVuY2hhciAgICAgIGRldnR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBkZXZpY2V0eXBlICovCisgICAgdW5jaGFyICAgICAgcm1fbWVkaXVtOyAgICAgICAgICAgICAgICAgICAgICAvKiBtZWRpdW0gaXMgcmVtb3ZhYmxlICovCisgICAgdW5jaGFyICAgICAgd3BfbWVkaXVtOyAgICAgICAgICAgICAgICAgICAgICAvKiBtZWRpdW0gaXMgd3JpdGUgcHJvdGVjdGVkICovCisgICAgdW5jaGFyICAgICAgYW5zaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIEkvSUkgb3IgSUlJPyAqLworICAgIHVuY2hhciAgICAgIHByb3RvY29sOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2FtZSBhcyBhbnNpICovCisgICAgdW5jaGFyICAgICAgc3luYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnOiBzeW5jLiB0cmFuc2ZlciBlbmFiLiAqLworICAgIHVuY2hhciAgICAgIGRpc2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZzogZGlzY29ubmVjdCBlbmFibGVkICovCisgICAgdW5jaGFyICAgICAgcXVldWVpbmc7ICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnOiBjb21tYW5kIHF1ZWluZyBlbmFiLiAqLworICAgIHVuY2hhciAgICAgIGNhY2hlZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZzogY2FjaGluZyBlbmFibGVkICovCisgICAgdW5jaGFyICAgICAgdGFyZ2V0X2lkOyAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgSUQgb2YgZGV2aWNlICovCisgICAgdW5jaGFyICAgICAgbHVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMVU4gaWQgb2YgZGV2aWNlICovCisgICAgdW5jaGFyICAgICAgb3JwaGFuOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnOiBkcml2ZSBmcmFnbWVudCAqLworICAgIHVsb25nMzIgICAgIGxhc3RfZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgLyogc2Vuc2Uga2V5IG9yIGRyaXZlIHN0YXRlICovCisgICAgdWxvbmczMiAgICAgbGFzdF9yZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXN1bHQgb2YgbGFzdCBjb21tYW5kICovCisgICAgdWxvbmczMiAgICAgY2hlY2tfZXJyb3JzOyAgICAgICAgICAgICAgICAgICAvKiBlcnIuIGluIGxhc3Qgc3VyZmFjZSBjaGVjayAqLworICAgIHVuY2hhciAgICAgIHBlcmNlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ3Jlc3MgZm9yIHN1cmZhY2UgY2hlY2sgKi8KKyAgICB1bmNoYXIgICAgICBsYXN0X2NoZWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIElPQ1RSTCBvcGVyYXRpb24gKi8KKyAgICB1bmNoYXIgICAgICByZXNbMl07CisgICAgdWxvbmczMiAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcm9tIDEuMTkvMi4xOTogcmF3IHJlc2Vydi4qLworICAgIHVuY2hhciAgICAgIG11bHRpX2J1czsgICAgICAgICAgICAgICAgICAgICAgLyogbXVsdGkgYnVzIGRldj8gKGZpYnJlIGNoLikgKi8KKyAgICB1bmNoYXIgICAgICBtYl9zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXR1czogYXZhaWxhYmxlPyAqLworICAgIHVuY2hhciAgICAgIHJlczJbMl07CisgICAgdW5jaGFyICAgICAgbWJfYWx0X3N0YXR1czsgICAgICAgICAgICAgICAgICAvKiBzdGF0dXMgb24gc2Vjb25kIGJ1cyAqLworICAgIHVuY2hhciAgICAgIG1iX2FsdF9iaWQ7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHNlY29uZCBidXMgKi8KKyAgICB1bmNoYXIgICAgICBtYl9hbHRfdGlkOyAgICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBpZCBvbiBzZWNvbmQgYnVzICovCisgICAgdW5jaGFyICAgICAgcmVzMzsKKyAgICB1bmNoYXIgICAgICBmY19mbGFnOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyb20gMS4yMi8yLjIyOiBpbmZvIHZhbGlkPyovCisgICAgdW5jaGFyICAgICAgcmVzNDsKKyAgICB1c2hvcnQgICAgICBmY19mcmFtZV9zaXplOyAgICAgICAgICAgICAgICAgIC8qIGZyYW1lIHNpemUgKGJ5dGVzKSAqLworICAgIGNoYXIgICAgICAgIHd3bls4XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29ybGQgd2lkZSBuYW1lICovCit9IFBBQ0tFRCBnZHRoX2Rpc2tpbmZvX3N0cjsKKworLyogZ2V0IFNDU0kgY2hhbm5lbCBjb3VudCAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBjaGFubmVsX25vOyAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVsICovCisgICAgdWxvbmczMiAgICAgZHJpdmVfY250OyAgICAgICAgICAgICAgICAgICAgICAvKiBkcml2ZSBjb3VudCAqLworICAgIHVuY2hhciAgICAgIHNpb3BfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBwcm9jZXNzb3IgSUQgKi8KKyAgICB1bmNoYXIgICAgICBzaW9wX3N0YXRlOyAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgcHJvY2Vzc29yIHN0YXRlICovIAorfSBQQUNLRUQgZ2R0aF9nZXRjaF9zdHI7CisKKy8qIGdldCBTQ1NJIGRyaXZlIG51bWJlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBzY19ubzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgY2hhbm5lbCAqLworICAgIHVsb25nMzIgICAgIHNjX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NfbGlzdFtdIGVsZW1lbnRzICovCisgICAgdWxvbmczMiAgICAgc2NfbGlzdFtNQVhJRF07ICAgICAgICAgICAgICAgICAvKiBtaW5vciBkZXZpY2UgbnVtYmVycyAqLworfSBQQUNLRUQgZ2R0aF9kcmxpc3Rfc3RyOworCisvKiBnZXQgZ3Jvd24vcHJpbWFyeSBkZWZlY3QgY291bnQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICBzZGRjX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDg6IGdyb3duLCAweDEwOiBwcmltLiAqLworICAgIHVuY2hhciAgICAgIHNkZGNfZm9ybWF0OyAgICAgICAgICAgICAgICAgICAgLyogbGlzdCBlbnRyeSBmb3JtYXQgKi8KKyAgICB1bmNoYXIgICAgICBzZGRjX2xlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpc3QgZW50cnkgbGVuZ3RoICovCisgICAgdW5jaGFyICAgICAgc2RkY19yZXM7CisgICAgdWxvbmczMiAgICAgc2RkY19jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBjb3VudCAqLworfSBQQUNLRUQgZ2R0aF9kZWZjbnRfc3RyOworCisvKiBkaXNrIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBiaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgY2hhbm5lbCAqLworICAgIHVsb25nMzIgICAgIGZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgU0NTSSBkaXNrICovCisgICAgdWxvbmczMiAgICAgZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgICB1bG9uZzMyICAgICBjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChSKSBudW1iZXIgb2YgaW5pdC4gZWwuICovCisgICAgdWxvbmczMiAgICAgbW9uX3RpbWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lIHN0YW1wICovCisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyICB0aWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBJRCAqLworICAgICAgICB1bmNoYXIgIGx1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFVOICovCisgICAgICAgIHVuY2hhciAgcmVzWzJdOworICAgICAgICB1bG9uZzMyIGJsa19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgLyogYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworICAgICAgICB1bG9uZzMyIHJkX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgcmVhZCAqLworICAgICAgICB1bG9uZzMyIHdyX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgd3JpdHRlbiAqLworICAgICAgICB1bG9uZzMyIHJkX2Jsa19jb3VudDsgICAgICAgICAgICAgICAgICAgLyogYmxvY2tzIHJlYWQgKi8KKyAgICAgICAgdWxvbmczMiB3cl9ibGtfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qIGJsb2NrcyB3cml0dGVuICovCisgICAgICAgIHVsb25nMzIgcmV0cmllczsgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWVzICovCisgICAgICAgIHVsb25nMzIgcmVhc3NpZ25zOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWFzc2lnbnMgKi8KKyAgICB9IFBBQ0tFRCBsaXN0WzFdOworfSBQQUNLRUQgZ2R0aF9kc2tzdGF0X3N0cjsKKworLyogSU8gY2hhbm5lbCBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gKC0xVUw6IG5ld2VzdCkgKi8KKyAgICB1bmNoYXIgICAgICBsaXN0X2VudHJpZXM7ICAgICAgICAgICAgICAgICAgIC8qIGxpc3QgZW50cnkgY291bnQgKi8KKyAgICB1bmNoYXIgICAgICBmaXJzdF9jaGFuOyAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGNoYW5uZWwgbnVtYmVyICovCisgICAgdW5jaGFyICAgICAgbGFzdF9jaGFuOyAgICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IGNoYW5uZWwgbnVtYmVyICovCisgICAgdW5jaGFyICAgICAgY2hhbl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKiAoUikgY2hhbm5lbCBjb3VudCAqLworICAgIHVsb25nMzIgICAgIGxpc3Rfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IG9mIGxpc3RbMF0gKi8KK30gUEFDS0VEIGdkdGhfaW9jaGFuX2hlYWRlcjsKKworLyogZ2V0IElPIGNoYW5uZWwgZGVzY3JpcHRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnZHRoX2lvY2hhbl9oZWFkZXIgIGhkcjsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bG9uZzMyICAgICAgICAgYWRkcmVzczsgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBhZGRyZXNzICovCisgICAgICAgIHVuY2hhciAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiB0eXBlIChTQ1NJLCBGQ0FMKSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgbG9jYWxfbm87ICAgICAgICAgICAgICAgLyogbG9jYWwgbnVtYmVyICovCisgICAgICAgIHVzaG9ydCAgICAgICAgICBmZWF0dXJlczsgICAgICAgICAgICAgICAvKiBjaGFubmVsIGZlYXR1cmVzICovCisgICAgfSBQQUNLRUQgbGlzdFtNQVhCVVNdOworfSBQQUNLRUQgZ2R0aF9pb2NoYW5fc3RyOworCisvKiBnZXQgcmF3IElPIGNoYW5uZWwgZGVzY3JpcHRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnZHRoX2lvY2hhbl9oZWFkZXIgIGhkcjsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bmNoYXIgICAgICBwcm9jX2lkOyAgICAgICAgICAgICAgICAgICAgLyogcHJvY2Vzc29yIGlkICovCisgICAgICAgIHVuY2hhciAgICAgIHByb2NfZGVmZWN0OyAgICAgICAgICAgICAgICAvKiBkZWZlY3QgPyAqLworICAgICAgICB1bmNoYXIgICAgICByZXNlcnZlZFsyXTsKKyAgICB9IFBBQ0tFRCBsaXN0W01BWEJVU107Cit9IFBBQ0tFRCBnZHRoX3Jhd19pb2NoYW5fc3RyOworCisvKiBhcnJheSBkcml2ZSBjb21wb25lbnQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBhbF9jb250cm9sbGVyOyAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgSUQgKi8KKyAgICB1bmNoYXIgICAgICBhbF9jYWNoZV9kcml2ZTsgICAgICAgICAgICAgICAgIC8qIGNhY2hlIGRyaXZlIG51bWJlciAqLworICAgIHVuY2hhciAgICAgIGFsX3N0YXR1czsgICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgZHJpdmUgc3RhdGUgKi8KKyAgICB1bmNoYXIgICAgICBhbF9yZXNbMl07ICAgICAKK30gUEFDS0VEIGdkdGhfYXJyYXljb21wX3N0cjsKKworLyogYXJyYXkgZHJpdmUgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICBhaV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5IHR5cGUgKFJBSUQwLDQsNSkgKi8KKyAgICB1bmNoYXIgICAgICBhaV9jYWNoZV9kcml2ZV9jbnQ7ICAgICAgICAgICAgIC8qIGFjdGl2ZSBjYWNoZWRyaXZlcyAqLworICAgIHVuY2hhciAgICAgIGFpX3N0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXkgZHJpdmUgc3RhdGUgKi8KKyAgICB1bmNoYXIgICAgICBhaV9tYXN0ZXJfY2Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hc3RlciBjYWNoZWRyaXZlICovCisgICAgdWxvbmczMiAgICAgYWlfbWFzdGVyX2NvbnRyb2xsZXI7ICAgICAgICAgICAvKiBJRCBvZiBtYXN0ZXIgY29udHJvbGxlciAqLworICAgIHVsb25nMzIgICAgIGFpX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlciBjYXBhY2l0eSBbc2VjdG9yc10gKi8KKyAgICB1bG9uZzMyICAgICBhaV9zdHJpcGluZ19zaXplOyAgICAgICAgICAgICAgIC8qIHN0cmlwaW5nIHNpemUgW3NlY3RvcnNdICovCisgICAgdWxvbmczMiAgICAgYWlfc2Vjc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKiBzZWN0b3Igc2l6ZSBbYnl0ZXNdICovCisgICAgdWxvbmczMiAgICAgYWlfZXJyX2luZm87ICAgICAgICAgICAgICAgICAgICAvKiBmYWlsZWQgY2FjaGUgZHJpdmUgKi8KKyAgICB1bmNoYXIgICAgICBhaV9uYW1lWzhdOyAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgdGhlIGFycmF5IGRyaXZlICovCisgICAgdW5jaGFyICAgICAgYWlfY29udHJvbGxlcl9jbnQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29udHJvbGxlcnMgKi8KKyAgICB1bmNoYXIgICAgICBhaV9yZW1vdmFibGU7ICAgICAgICAgICAgICAgICAgIC8qIGZsYWc6IHJlbW92YWJsZSAqLworICAgIHVuY2hhciAgICAgIGFpX3dyaXRlX3Byb3RlY3RlZDsgICAgICAgICAgICAgLyogZmxhZzogd3JpdGUgcHJvdGVjdGVkICovCisgICAgdW5jaGFyICAgICAgYWlfZGV2dHlwZTsgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlOiBhbHdheXMgZGlyZWN0IGFjY2VzcyAqLworICAgIGdkdGhfYXJyYXljb21wX3N0ciAgYWlfZHJpdmVzWzM1XTsgICAgICAgICAgLyogZHJpdmUgY29tcG9uZW50czogKi8KKyAgICB1bmNoYXIgICAgICBhaV9kcml2ZV9lbnRyaWVzOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkcml2ZSBjb21wb25lbnRzICovCisgICAgdW5jaGFyICAgICAgYWlfcHJvdGVjdGVkOyAgICAgICAgICAgICAgICAgICAvKiBwcm90ZWN0aW9uIGZsYWcgKi8KKyAgICB1bmNoYXIgICAgICBhaV92ZXJpZnlfc3RhdGU7ICAgICAgICAgICAgICAgIC8qIHN0YXRlIG9mIGEgcGFyaXR5IHZlcmlmeSAqLworICAgIHVuY2hhciAgICAgIGFpX2V4dF9zdGF0ZTsgICAgICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgYXJyYXkgZHJpdmUgc3RhdGUgKi8KKyAgICB1bmNoYXIgICAgICBhaV9leHBhbmRfc3RhdGU7ICAgICAgICAgICAgICAgIC8qIGFycmF5IGV4cGFuZCBzdGF0ZSAoPj0yLjE4KSovCisgICAgdW5jaGFyICAgICAgYWlfcmVzZXJ2ZWRbM107Cit9IFBBQ0tFRCBnZHRoX2FycmF5aW5mX3N0cjsKKworLyogZ2V0IGFycmF5IGRyaXZlIGxpc3QgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBjb250cm9sbGVyX25vOyAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgbm8uICovCisgICAgdW5jaGFyICAgICAgY2RfaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBtYXN0ZXIgY2FjaGVkcml2ZSAqLworICAgIHVuY2hhciAgICAgIGlzX2FycmF5ZDsgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZzogaXMgYXJyYXkgZHJpdmU/ICovCisgICAgdW5jaGFyICAgICAgaXNfbWFzdGVyOyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnOiBpcyBhcnJheSBtYXN0ZXI/ICovCisgICAgdW5jaGFyICAgICAgaXNfcGFyaXR5OyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnOiBpcyBwYXJpdHkgZHJpdmU/ICovCisgICAgdW5jaGFyICAgICAgaXNfaG90Zml4OyAgICAgICAgICAgICAgICAgICAgICAvKiBGbGFnOiBpcyBob3RmaXggZHJpdmU/ICovCisgICAgdW5jaGFyICAgICAgcmVzWzNdOworfSBQQUNLRUQgZ2R0aF9hbGlzdF9zdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBlbnRyaWVzX2F2YWlsOyAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBlbnRyaWVzICovCisgICAgdWxvbmczMiAgICAgZW50cmllc19pbml0OyAgICAgICAgICAgICAgICAgICAvKiByZXR1cm5lZCBlbnRyaWVzICovCisgICAgdWxvbmczMiAgICAgZmlyc3RfZW50cnk7ICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBlbnRyeSBudW1iZXIgKi8KKyAgICB1bG9uZzMyICAgICBsaXN0X29mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCBvZiBmb2xsb3dpbmcgbGlzdCAqLworICAgIGdkdGhfYWxpc3Rfc3RyIGxpc3RbMV07ICAgICAgICAgICAgICAgICAgICAgLyogbGlzdCAqLworfSBQQUNLRUQgZ2R0aF9hcmNkbF9zdHI7CisKKy8qIGNhY2hlIGluZm8vY29uZmlnIElPQ1RMICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgdXNob3J0ICAgICAgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBzdGF0ZSAob24vb2ZmKSAqLworICAgIHVzaG9ydCAgICAgIHN0cmF0ZWd5OyAgICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgc3RyYXRlZ3kgKi8KKyAgICB1c2hvcnQgICAgICB3cml0ZV9iYWNrOyAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGJhY2sgc3RhdGUgKG9uL29mZikgKi8KKyAgICB1c2hvcnQgICAgICBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIGJsb2NrIHNpemUgKi8KK30gUEFDS0VEIGdkdGhfY3Bhcl9zdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBjc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhY2hlIHNpemUgKi8KKyAgICB1bG9uZzMyICAgICByZWFkX2NudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQvd3JpdGUgY291bnRlciAqLworICAgIHVsb25nMzIgICAgIHdyaXRlX2NudDsKKyAgICB1bG9uZzMyICAgICB0cl9oaXRzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpdHMgKi8KKyAgICB1bG9uZzMyICAgICBzZWNfaGl0czsKKyAgICB1bG9uZzMyICAgICBzZWNfbWlzczsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pc3NlcyAqLworfSBQQUNLRUQgZ2R0aF9jc3RhdF9zdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnZHRoX2NwYXJfc3RyICAgY3BhcjsKKyAgICBnZHRoX2NzdGF0X3N0ciAgY3N0YXQ7Cit9IFBBQ0tFRCBnZHRoX2NpbmZvX3N0cjsKKworLyogY2FjaGUgZHJpdmUgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgIGNkX25hbWVbOF07ICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgZHJpdmUgbmFtZSAqLworICAgIHVsb25nMzIgICAgIGNkX2RldnR5cGU7ICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBkZXZpY2V0eXBlICovCisgICAgdWxvbmczMiAgICAgY2RfbGRjbnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbG9nLiBkcml2ZXMgKi8KKyAgICB1bG9uZzMyICAgICBjZF9sYXN0X2Vycm9yOyAgICAgICAgICAgICAgICAgIC8qIGxhc3QgZXJyb3IgKi8KKyAgICB1bmNoYXIgICAgICBjZF9pbml0aWFsaXplZDsgICAgICAgICAgICAgICAgIC8qIGRyaXZlIGlzIGluaXRpYWxpemVkICovCisgICAgdW5jaGFyICAgICAgY2RfcmVtb3ZhYmxlOyAgICAgICAgICAgICAgICAgICAvKiBtZWRpYSBpcyByZW1vdmFibGUgKi8KKyAgICB1bmNoYXIgICAgICBjZF93cml0ZV9wcm90ZWN0ZWQ7ICAgICAgICAgICAgIC8qIHdyaXRlIHByb3RlY3RlZCAqLworICAgIHVuY2hhciAgICAgIGNkX2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9vbCBIb3QgRml4PyAqLworICAgIHVsb25nMzIgICAgIGxkX2Jsa2NudDsgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyAqLworICAgIHVsb25nMzIgICAgIGxkX2Jsa3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyogYmxvY2tzaXplICovCisgICAgdWxvbmczMiAgICAgbGRfZGNudDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlza3MgKi8KKyAgICB1bG9uZzMyICAgICBsZF9zbGF2ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZy4gZHJpdmUgaW5kZXggKi8KKyAgICB1bG9uZzMyICAgICBsZF9kdHlwZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgbG9naWNhbCBkcml2ZSAqLworICAgIHVsb25nMzIgICAgIGxkX2xhc3RfZXJyb3I7ICAgICAgICAgICAgICAgICAgLyogbGFzdCBlcnJvciAqLworICAgIHVuY2hhciAgICAgIGxkX25hbWVbOF07ICAgICAgICAgICAgICAgICAgICAgLyogbG9nLiBkcml2ZSBuYW1lICovCisgICAgdW5jaGFyICAgICAgbGRfZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciAqLworfSBQQUNLRUQgZ2R0aF9jZHJpbmZvX3N0cjsKKworLyogT0VNIHN0cmluZyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIGN0bF92ZXJzaW9uOworICAgIHVsb25nMzIgICAgIGZpbGVfbWFqb3JfdmVyc2lvbjsKKyAgICB1bG9uZzMyICAgICBmaWxlX21pbm9yX3ZlcnNpb247CisgICAgdWxvbmczMiAgICAgYnVmZmVyX3NpemU7CisgICAgdWxvbmczMiAgICAgY3B5X2NvdW50OworICAgIHVsb25nMzIgICAgIGV4dF9lcnJvcjsKKyAgICB1bG9uZzMyICAgICBvZW1faWQ7CisgICAgdWxvbmczMiAgICAgYm9hcmRfaWQ7Cit9IFBBQ0tFRCBnZHRoX29lbV9zdHJfcGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgcHJvZHVjdF8wXzFfbmFtZVsxNl07CisgICAgdW5jaGFyICAgICAgcHJvZHVjdF80XzVfbmFtZVsxNl07CisgICAgdW5jaGFyICAgICAgcHJvZHVjdF9jbHVzdGVyX25hbWVbMTZdOworICAgIHVuY2hhciAgICAgIHByb2R1Y3RfcmVzZXJ2ZWRbMTZdOworICAgIHVuY2hhciAgICAgIHNjc2lfY2x1c3Rlcl90YXJnZXRfdmVuZG9yX2lkWzE2XTsKKyAgICB1bmNoYXIgICAgICBjbHVzdGVyX3JhaWRfZndfbmFtZVsxNl07CisgICAgdW5jaGFyICAgICAgb2VtX2JyYW5kX25hbWVbMTZdOworICAgIHVuY2hhciAgICAgIG9lbV9yYWlkX3R5cGVbMTZdOworICAgIHVuY2hhciAgICAgIGJpb3NfdHlwZVsxM107CisgICAgdW5jaGFyICAgICAgYmlvc190aXRsZVs1MF07CisgICAgdW5jaGFyICAgICAgb2VtX2NvbXBhbnlfbmFtZVszN107CisgICAgdWxvbmczMiAgICAgcGNpX2lkXzE7CisgICAgdWxvbmczMiAgICAgcGNpX2lkXzI7CisgICAgdW5jaGFyICAgICAgdmFsaWRhdGlvbl9zdGF0dXNbODBdOworICAgIHVuY2hhciAgICAgIHJlc2VydmVkXzFbNF07CisgICAgdW5jaGFyICAgICAgc2NzaV9ob3N0X2RyaXZlX2lucXVpcnlfdmVuZG9yX2lkWzE2XTsKKyAgICB1bmNoYXIgICAgICBsaWJyYXJ5X2ZpbGVfdGVtcGxhdGVbMTZdOworICAgIHVuY2hhciAgICAgIHJlc2VydmVkXzJbMTZdOworICAgIHVuY2hhciAgICAgIHRvb2xfbmFtZV8xWzMyXTsKKyAgICB1bmNoYXIgICAgICB0b29sX25hbWVfMlszMl07CisgICAgdW5jaGFyICAgICAgdG9vbF9uYW1lXzNbMzJdOworICAgIHVuY2hhciAgICAgIG9lbV9jb250YWN0XzFbODRdOworICAgIHVuY2hhciAgICAgIG9lbV9jb250YWN0XzJbODRdOworICAgIHVuY2hhciAgICAgIG9lbV9jb250YWN0XzNbODRdOworfSBQQUNLRUQgZ2R0aF9vZW1fc3RyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2R0aF9vZW1fc3RyX3BhcmFtcyBwYXJhbXM7CisgICAgZ2R0aF9vZW1fc3RyICAgICAgICB0ZXh0OworfSBQQUNLRUQgZ2R0aF9vZW1fc3RyX2lvY3RsOworCisvKiBib2FyZCBmZWF0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgIGNoYWluaW5nOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hhaW5pbmcgc3VwcG9ydGVkICovCisgICAgdW5jaGFyICAgICAgc3RyaXBpbmc7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpcGluZyAoUkFJRC0wKSBzdXBwLiAqLworICAgIHVuY2hhciAgICAgIG1pcnJvcmluZzsgICAgICAgICAgICAgICAgICAgICAgLyogTWlycm9yaW5nIChSQUlELTEpIHN1cHAuICovCisgICAgdW5jaGFyICAgICAgcmFpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSQUlELTQvNS8xMCBzdXBwb3J0ZWQgKi8KK30gUEFDS0VEIGdkdGhfYmZlYXRfc3RyOworCisvKiBib2FyZCBpbmZvIElPQ1RMICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgc2VyX25vOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWwgbm8uICovCisgICAgdW5jaGFyICAgICAgb2VtX2lkWzJdOyAgICAgICAgICAgICAgICAgICAgICAvKiBPRU0gSUQgKi8KKyAgICB1c2hvcnQgICAgICBlcF9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgIC8qIGVwcm9tIGZsYWdzICovCisgICAgdWxvbmczMiAgICAgcHJvY19pZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzb3IgSUQgKi8KKyAgICB1bG9uZzMyICAgICBtZW1zaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBzaXplIChieXRlcykgKi8KKyAgICB1bmNoYXIgICAgICBtZW1fYmFua3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBiYW5rcyAqLworICAgIHVuY2hhciAgICAgIGNoYW5fdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCB0eXBlICovCisgICAgdW5jaGFyICAgICAgY2hhbl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGNvdW50ICovCisgICAgdW5jaGFyICAgICAgcmRvbmdsZV9wcmVzOyAgICAgICAgICAgICAgICAgICAvKiBkb25nbGUgcHJlc2VudD8gKi8KKyAgICB1bG9uZzMyICAgICBlcHJfZndfdmVyOyAgICAgICAgICAgICAgICAgICAgIC8qIChlcHJvbSkgZmlybXdhcmUgdmVyc2lvbiAqLworICAgIHVsb25nMzIgICAgIHVwZF9md192ZXI7ICAgICAgICAgICAgICAgICAgICAgLyogKHVwZGF0ZSkgZmlybXdhcmUgdmVyc2lvbiAqLworICAgIHVsb25nMzIgICAgIHVwZF9yZXZpc2lvbjsgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHJldmlzaW9uICovCisgICAgY2hhciAgICAgICAgdHlwZV9zdHJpbmdbMTZdOyAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG5hbWUgKi8KKyAgICBjaGFyICAgICAgICByYWlkX3N0cmluZ1sxNl07ICAgICAgICAgICAgICAgIC8qIFJBSUQgZmlybXdhcmUgbmFtZSAqLworICAgIHVuY2hhciAgICAgIHVwZGF0ZV9wcmVzOyAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHByZXNlbnQ/ICovCisgICAgdW5jaGFyICAgICAgeG9yX3ByZXM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBYT1IgZW5naW5lIHByZXNlbnQ/ICovCisgICAgdW5jaGFyICAgICAgcHJvbV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAvKiBST00gdHlwZSAoZXByb20vZmxhc2gpICovCisgICAgdW5jaGFyICAgICAgcHJvbV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgUk9NIGRldmljZXMgKi8KKyAgICB1bG9uZzMyICAgICBkdXBfcHJlczsgICAgICAgICAgICAgICAgICAgICAgIC8qIGR1cGxleGluZyBtb2R1bGUgcHJlc2VudD8gKi8KKyAgICB1bG9uZzMyICAgICBjaGFuX3ByZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHBhbnNpb24gY2huLiAqLworICAgIHVsb25nMzIgICAgIG1lbV9wcmVzOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWVtb3J5IGV4cGFuc2lvbiBpbnN0LiA/ICovCisgICAgdW5jaGFyICAgICAgZnRfYnVzX3N5c3RlbTsgICAgICAgICAgICAgICAgICAvKiBmYXVsdCBidXMgc3VwcG9ydGVkPyAqLworICAgIHVuY2hhciAgICAgIHN1YnR5cGVfdmFsaWQ7ICAgICAgICAgICAgICAgICAgLyogYm9hcmRfc3VidHlwZSB2YWxpZD8gKi8KKyAgICB1bmNoYXIgICAgICBib2FyZF9zdWJ0eXBlOyAgICAgICAgICAgICAgICAgIC8qIHN1YnR5cGUvaGFyZHdhcmUgbGV2ZWwgKi8KKyAgICB1bmNoYXIgICAgICByYW1wYXJpdHlfcHJlczsgICAgICAgICAgICAgICAgIC8qIFJBTSBwYXJpdHkgY2hlY2sgaGFyZHdhcmU/ICovCit9IFBBQ0tFRCBnZHRoX2JpbmZvX3N0cjsgCisKKy8qIGdldCBob3N0IGRyaXZlIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICAgICAgICBuYW1lWzhdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgZHJpdmUgbmFtZSAqLworICAgIHVsb25nMzIgICAgIHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoc2VjdG9ycykgKi8KKyAgICB1bmNoYXIgICAgICBob3N0X2RyaXZlOyAgICAgICAgICAgICAgICAgICAgIC8qIGhvc3QgZHJpdmUgbnVtYmVyICovCisgICAgdW5jaGFyICAgICAgbG9nX2RyaXZlOyAgICAgICAgICAgICAgICAgICAgICAvKiBsb2cuIGRyaXZlIChtYXN0ZXIpICovCisgICAgdW5jaGFyICAgICAgcmVzZXJ2ZWQ7CisgICAgdW5jaGFyICAgICAgcndfYXR0cmliczsgICAgICAgICAgICAgICAgICAgICAvKiByL3cgYXR0cmlicyAqLworICAgIHVsb25nMzIgICAgIHN0YXJ0X3NlYzsgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgc2VjdG9yICovCit9IFBBQ0tFRCBnZHRoX2hlbnRyeV9zdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bG9uZzMyICAgICBlbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5IGNvdW50ICovCisgICAgdWxvbmczMiAgICAgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgb2YgZW50cmllcyAqLworICAgIHVuY2hhciAgICAgIHNlY3NfcF9oZWFkOyAgICAgICAgICAgICAgICAgICAgLyogc2VjdG9ycy9oZWFkICovCisgICAgdW5jaGFyICAgICAgaGVhZHNfcF9jeWw7ICAgICAgICAgICAgICAgICAgICAvKiBoZWFkcy9jeWxpbmRlciAqLworICAgIHVuY2hhciAgICAgIHJlc2VydmVkOworICAgIHVuY2hhciAgICAgIGNsdXN0X2RydnR5cGU7ICAgICAgICAgICAgICAgICAgLyogY2x1c3RlciBkcml2ZSB0eXBlICovCisgICAgdWxvbmczMiAgICAgbG9jYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIGdkdGhfaGVudHJ5X3N0ciBlbnRyeVtNQVhfSERSSVZFU107ICAgICAgICAgLyogZW50cmllcyAqLworfSBQQUNLRUQgZ2R0aF9oZ2V0X3N0cjsgICAgCisKKworLyogRFBSQU0gc3RydWN0dXJlcyAqLworCisvKiBpbnRlcmZhY2UgYXJlYSBJU0EvUENJICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgICAgICAgICBTX0NtZF9JbmR4OyAgICAgICAgICAgICAvKiBzcGVjaWFsIGNvbW1hbmQgKi8KKyAgICB1bmNoYXIgdm9sYXRpbGUgICAgIFNfU3RhdHVzOyAgICAgICAgICAgICAgIC8qIHN0YXR1cyBzcGVjaWFsIGNvbW1hbmQgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHJlc2VydmVkMTsKKyAgICB1bG9uZzMyICAgICAgICAgICAgIFNfSW5mb1s0XTsgICAgICAgICAgICAgIC8qIGFkZC4gaW5mbyBzcGVjaWFsIGNvbW1hbmQgKi8KKyAgICB1bmNoYXIgdm9sYXRpbGUgICAgIFNlbWEwOyAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc2VtYXBob3JlICovCisgICAgdW5jaGFyICAgICAgICAgICAgICByZXNlcnZlZDJbM107CisgICAgdW5jaGFyICAgICAgICAgICAgICBDbWRfSW5kZXg7ICAgICAgICAgICAgICAvKiBjb21tYW5kIG51bWJlciAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgcmVzZXJ2ZWQzWzNdOworICAgIHVzaG9ydCB2b2xhdGlsZSAgICAgU3RhdHVzOyAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBzdGF0dXMgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIFNlcnZpY2U7ICAgICAgICAgICAgICAgIC8qIHNlcnZpY2UoZm9yIGFzeW5jLmV2ZW50cykgKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgIEluZm9bMl07ICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgaW5mbyAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVzaG9ydCAgICAgICAgICBvZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIG9mZnMuIGluIHRoZSBEUFJBTSovCisgICAgICAgIHVzaG9ydCAgICAgICAgICBzZXJ2X2lkOyAgICAgICAgICAgICAgICAvKiBzZXJ2aWNlICovCisgICAgfSBQQUNLRUQgY29tbV9xdWV1ZVtNQVhPRkZTRVRTXTsgICAgICAgICAgICAvKiBjb21tYW5kIHF1ZXVlICovCisgICAgdWxvbmczMiAgICAgICAgICAgICBiaW9zX3Jlc2VydmVkWzJdOworICAgIHVuY2hhciAgICAgICAgICAgICAgZ2R0X2Rwcl9jbWRbMV07ICAgICAgICAgLyogY29tbWFuZHMgKi8KK30gUEFDS0VEIGdkdF9kcHJfaWY7CisKKy8qIFNSQU0gc3RydWN0dXJlIFBDSSBjb250cm9sbGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgIG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBJRCBmcm9tIEJJT1MgKi8KKyAgICB1c2hvcnQgICAgICBuZWVkX2RlaW5pdDsgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaCBiZXR3LiBCSU9TL2RyaXZlciAqLworICAgIHVuY2hhciAgICAgIHN3aXRjaF9zdXBwb3J0OyAgICAgICAgICAgICAgICAgLyogc2VlIG5lZWRfZGVpbml0ICovCisgICAgdW5jaGFyICAgICAgcGFkZGluZ1s5XTsKKyAgICB1bmNoYXIgICAgICBvc191c2VkWzE2XTsgICAgICAgICAgICAgICAgICAgIC8qIE9TIGNvZGUgcGVyIHNlcnZpY2UgKi8KKyAgICB1bmNoYXIgICAgICB1bnVzZWRbMjhdOworICAgIHVuY2hhciAgICAgIGZ3X21hZ2ljOyAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHIuIElEIGZyb20gZmlybXdhcmUgKi8KK30gUEFDS0VEIGdkdF9wY2lfc3JhbTsKKworLyogU1JBTSBzdHJ1Y3R1cmUgRUlTQSBjb250cm9sbGVycyAoYnV0IE5PVCBHRFQzMDAwLzMwMjApICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgb3NfdXNlZFsxNl07ICAgICAgICAgICAgICAgICAgICAvKiBPUyBjb2RlIHBlciBzZXJ2aWNlICovCisgICAgdXNob3J0ICAgICAgbmVlZF9kZWluaXQ7ICAgICAgICAgICAgICAgICAgICAvKiBzd2l0Y2ggYmV0dy4gQklPUy9kcml2ZXIgKi8KKyAgICB1bmNoYXIgICAgICBzd2l0Y2hfc3VwcG9ydDsgICAgICAgICAgICAgICAgIC8qIHNlZSBuZWVkX2RlaW5pdCAqLworICAgIHVuY2hhciAgICAgIHBhZGRpbmc7Cit9IFBBQ0tFRCBnZHRfZWlzYV9zcmFtOworCisKKy8qIERQUkFNIElTQSBjb250cm9sbGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuY2hhciAgICAgIGJpb3NfdXNlZFsweDNjMDAtMzJdOyAgIC8qIDE1S0IgLSAzMkJ5dGVzIEJJT1MgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIG1hZ2ljOyAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgKEVJU0EpIElEICovCisgICAgICAgICAgICB1c2hvcnQgICAgICBuZWVkX2RlaW5pdDsgICAgICAgICAgICAvKiBzd2l0Y2ggYmV0dy4gQklPUy9kcml2ZXIgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIHN3aXRjaF9zdXBwb3J0OyAgICAgICAgIC8qIHNlZSBuZWVkX2RlaW5pdCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgcGFkZGluZ1s5XTsKKyAgICAgICAgICAgIHVuY2hhciAgICAgIG9zX3VzZWRbMTZdOyAgICAgICAgICAgIC8qIE9TIGNvZGUgcGVyIHNlcnZpY2UgKi8KKyAgICAgICAgfSBQQUNLRUQgZHBfc3JhbTsKKyAgICAgICAgdW5jaGFyICAgICAgICAgIGJpb3NfYXJlYVsweDQwMDBdOyAgICAgIC8qIDE2S0IgcmVzZXJ2ZWQgZm9yIEJJT1MgKi8KKyAgICB9IGJ1OworICAgIHVuaW9uIHsKKyAgICAgICAgZ2R0X2Rwcl9pZiAgICAgIGljOyAgICAgICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBhcmVhICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBpZl9hcmVhWzB4MzAwMF07ICAgICAgICAvKiAxMktCIGZvciBpbnRlcmZhY2UgKi8KKyAgICB9IHU7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyICAgICAgICAgIG1lbWxvY2s7ICAgICAgICAgICAgICAgIC8qIHdyaXRlIHByb3RlY3Rpb24gRFBSQU0gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGV2ZW50OyAgICAgICAgICAgICAgICAgIC8qIHJlbGVhc2UgZXZlbnQgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlycWVuOyAgICAgICAgICAgICAgICAgIC8qIGJvYXJkIGludGVycnVwdHMgZW5hYmxlICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBpcnFkZWw7ICAgICAgICAgICAgICAgICAvKiBhY2tub3dsZWRnZSBib2FyZCBpbnQuICovCisgICAgICAgIHVuY2hhciB2b2xhdGlsZSBTZW1hMTsgICAgICAgICAgICAgICAgICAvKiBzdGF0dXMgc2VtYXBob3JlICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBycTsgICAgICAgICAgICAgICAgICAgICAvKiBJUlEvRFJRIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB9IFBBQ0tFRCBpbzsKK30gUEFDS0VEIGdkdDJfZHByYW1fc3RyOworCisvKiBEUFJBTSBQQ0kgY29udHJvbGxlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmlvbiB7CisgICAgICAgIGdkdF9kcHJfaWYgICAgICBpYzsgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgYXJlYSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaWZfYXJlYVsweGZmMC1zaXplb2YoZ2R0X3BjaV9zcmFtKV07CisgICAgfSB1OworICAgIGdkdF9wY2lfc3JhbSAgICAgICAgZ2R0NnNyOyAgICAgICAgICAgICAgICAgLyogU1JBTSBzdHJ1Y3R1cmUgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1bmNoYXIgICAgICAgICAgdW51c2VkMFsxXTsKKyAgICAgICAgdW5jaGFyIHZvbGF0aWxlIFNlbWExOyAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc2VtYXBob3JlICovCisgICAgICAgIHVuY2hhciAgICAgICAgICB1bnVzZWQxWzNdOworICAgICAgICB1bmNoYXIgICAgICAgICAgaXJxZW47ICAgICAgICAgICAgICAgICAgLyogYm9hcmQgaW50ZXJydXB0cyBlbmFibGUgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIHVudXNlZDJbMl07CisgICAgICAgIHVuY2hhciAgICAgICAgICBldmVudDsgICAgICAgICAgICAgICAgICAvKiByZWxlYXNlIGV2ZW50ICovCisgICAgICAgIHVuY2hhciAgICAgICAgICB1bnVzZWQzWzNdOworICAgICAgICB1bmNoYXIgICAgICAgICAgaXJxZGVsOyAgICAgICAgICAgICAgICAgLyogYWNrbm93bGVkZ2UgYm9hcmQgaW50LiAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgdW51c2VkNFszXTsKKyAgICB9IFBBQ0tFRCBpbzsKK30gUEFDS0VEIGdkdDZfZHByYW1fc3RyOworCisvKiBQTFggcmVnaXN0ZXIgc3RydWN0dXJlIChuZXcgUENJIGNvbnRyb2xsZXJzKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgICAgICAgICAgY2ZnX3JlZzsgICAgICAgIC8qIERQUkFNIGNmZy4oMjpiZWxvdyAxTUIsMDphbnl3aGVyZSkqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkMVsweDNmXTsKKyAgICB1bmNoYXIgdm9sYXRpbGUgICAgIHNlbWEwX3JlZzsgICAgICAgICAgICAgIC8qIGNvbW1hbmQgc2VtYXBob3JlICovCisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBzZW1hMV9yZWc7ICAgICAgICAgICAgICAvKiBzdGF0dXMgc2VtYXBob3JlICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB1bnVzZWQyWzJdOworICAgIHVzaG9ydCB2b2xhdGlsZSAgICAgc3RhdHVzOyAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBzdGF0dXMgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNlcnZpY2U7ICAgICAgICAgICAgICAgIC8qIHNlcnZpY2UgKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgIGluZm9bMl07ICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgaW5mbyAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkM1sweDEwXTsKKyAgICB1bmNoYXIgICAgICAgICAgICAgIGxkb29yX3JlZzsgICAgICAgICAgICAgIC8qIFBDSSB0byBsb2NhbCBkb29yYmVsbCAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkNFszXTsKKyAgICB1bmNoYXIgdm9sYXRpbGUgICAgIGVkb29yX3JlZzsgICAgICAgICAgICAgIC8qIGxvY2FsIHRvIFBDSSBkb29yYmVsbCAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkNVszXTsKKyAgICB1bmNoYXIgICAgICAgICAgICAgIGNvbnRyb2wwOyAgICAgICAgICAgICAgIC8qIGNvbnRyb2wwIHJlZ2lzdGVyKHVudXNlZCkgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGNvbnRyb2wxOyAgICAgICAgICAgICAgIC8qIGJvYXJkIGludGVycnVwdHMgZW5hYmxlICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB1bnVzZWQ2WzB4MTZdOworfSBQQUNLRUQgZ2R0NmNfcGx4X3JlZ3M7CisKKy8qIERQUkFNIG5ldyBQQ0kgY29udHJvbGxlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmlvbiB7CisgICAgICAgIGdkdF9kcHJfaWYgICAgICBpYzsgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgYXJlYSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaWZfYXJlYVsweDQwMDAtc2l6ZW9mKGdkdF9wY2lfc3JhbSldOworICAgIH0gdTsKKyAgICBnZHRfcGNpX3NyYW0gICAgICAgIGdkdDZzcjsgICAgICAgICAgICAgICAgIC8qIFNSQU0gc3RydWN0dXJlICovCit9IFBBQ0tFRCBnZHQ2Y19kcHJhbV9zdHI7CisKKy8qIGk5NjAgcmVnaXN0ZXIgc3RydWN0dXJlIChQQ0kgTVBSIGNvbnRyb2xsZXJzKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkMVsxNl07CisgICAgdW5jaGFyIHZvbGF0aWxlICAgICBzZW1hMF9yZWc7ICAgICAgICAgICAgICAvKiBjb21tYW5kIHNlbWFwaG9yZSAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdW51c2VkMjsKKyAgICB1bmNoYXIgdm9sYXRpbGUgICAgIHNlbWExX3JlZzsgICAgICAgICAgICAgIC8qIHN0YXR1cyBzZW1hcGhvcmUgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDM7CisgICAgdXNob3J0IHZvbGF0aWxlICAgICBzdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHN0YXR1cyAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2VydmljZTsgICAgICAgICAgICAgICAgLyogc2VydmljZSAqLworICAgIHVsb25nMzIgICAgICAgICAgICAgaW5mb1syXTsgICAgICAgICAgICAgICAgLyogYWRkaXRpb25hbCBpbmZvICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBsZG9vcl9yZWc7ICAgICAgICAgICAgICAvKiBQQ0kgdG8gbG9jYWwgZG9vcmJlbGwgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDRbMTFdOworICAgIHVuY2hhciB2b2xhdGlsZSAgICAgZWRvb3JfcmVnOyAgICAgICAgICAgICAgLyogbG9jYWwgdG8gUENJIGRvb3JiZWxsICovCisgICAgdW5jaGFyICAgICAgICAgICAgICB1bnVzZWQ1WzddOworICAgIHVuY2hhciAgICAgICAgICAgICAgZWRvb3JfZW5fcmVnOyAgICAgICAgICAgLyogYm9hcmQgaW50ZXJydXB0cyBlbmFibGUgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHVudXNlZDZbMjddOworICAgIHVsb25nMzIgICAgICAgICAgICAgdW51c2VkN1s5MzldOyAgICAgICAgIAorICAgIHVsb25nMzIgICAgICAgICAgICAgc2V2ZXJpdHk7ICAgICAgIAorICAgIGNoYXIgICAgICAgICAgICAgICAgZXZ0X3N0clsyNTZdOyAgICAgICAgICAgLyogZXZlbnQgc3RyaW5nICovCit9IFBBQ0tFRCBnZHQ2bV9pOTYwX3JlZ3M7CisKKy8qIERQUkFNIFBDSSBNUFIgY29udHJvbGxlcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnZHQ2bV9pOTYwX3JlZ3MgICAgIGk5NjByOyAgICAgICAgICAgICAgICAgIC8qIDRLQiBpOTYwIHJlZ2lzdGVycyAqLworICAgIHVuaW9uIHsKKyAgICAgICAgZ2R0X2Rwcl9pZiAgICAgIGljOyAgICAgICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBhcmVhICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBpZl9hcmVhWzB4MzAwMC1zaXplb2YoZ2R0X3BjaV9zcmFtKV07CisgICAgfSB1OworICAgIGdkdF9wY2lfc3JhbSAgICAgICAgZ2R0NnNyOyAgICAgICAgICAgICAgICAgLyogU1JBTSBzdHJ1Y3R1cmUgKi8KK30gUEFDS0VEIGdkdDZtX2RwcmFtX3N0cjsKKworCisvKiBQQ0kgcmVzb3VyY2VzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IHBjaV9kZXYgICAgICAqcGRldjsKKyAgICB1c2hvcnQgICAgICAgICAgICAgIHZlbmRvcl9pZDsgICAgICAgICAgICAgIC8qIHZlbmRvciAoSUNQLCBJbnRlbCwgLi4pICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBkZXZpY2VfaWQ7ICAgICAgICAgICAgICAvKiBkZXZpY2UgSUQgKDAsLi4sOSkgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHN1YmRldmljZV9pZDsgICAgICAgICAgIC8qIHN1YiBkZXZpY2UgSUQgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGJ1czsgICAgICAgICAgICAgICAgICAgIC8qIFBDSSBidXMgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGRldmljZV9mbjsgICAgICAgICAgICAgIC8qIFBDSSBkZXZpY2UvZnVuY3Rpb24gbm8uICovCisgICAgdWxvbmcgICAgICAgICAgICAgICBkcG1lbTsgICAgICAgICAgICAgICAgICAvKiBEUFJBTSBhZGRyZXNzICovCisgICAgdWxvbmcgICAgICAgICAgICAgICBpbzsgICAgICAgICAgICAgICAgICAgICAvKiBJTyBhZGRyZXNzICovCisgICAgdWxvbmcgICAgICAgICAgICAgICBpb19tbTsgICAgICAgICAgICAgICAgICAvKiBJTyBhZGRyZXNzIG1lbS4gbWFwcGVkICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBpcnE7ICAgICAgICAgICAgICAgICAgICAvKiBJUlEgKi8KK30gZ2R0aF9wY2lfc3RyOworCisKKy8qIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0ICAgICAgICAgICAgICBvZW1faWQ7ICAgICAgICAgICAgICAgICAvKiBPRU0gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgY2xhc3MgKi8KKyAgICB1bG9uZzMyICAgICAgICAgICAgIHN0eXBlOyAgICAgICAgICAgICAgICAgIC8qIHN1YnR5cGUgKFBDSTogZGV2aWNlIElEKSAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgc3ViZGV2aWNlX2lkOyAgICAgICAgICAgLyogc3ViIGRldmljZSBJRCAoUENJKSAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgZndfdmVyczsgICAgICAgICAgICAgICAgLyogZmlybXdhcmUgdmVyc2lvbiAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgY2FjaGVfZmVhdDsgICAgICAgICAgICAgLyogZmVhdC4gY2FjaGUgc2Vydi4gKHMvZywuLikqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgcmF3X2ZlYXQ7ICAgICAgICAgICAgICAgLyogZmVhdC4gcmF3IHNlcnZpY2UgKHMvZywuLikqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgc2NyZWVuX2ZlYXQ7ICAgICAgICAgICAgLyogZmVhdC4gcmF3IHNlcnZpY2UgKHMvZywuLikqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgYm1pYzsgICAgICAgICAgICAgICAgICAgLyogQk1JQyBhZGRyZXNzIChFSVNBKSAqLworICAgIHZvaWQgX19pb21lbSAgICAgICAgKmJyZDsgICAgICAgICAgICAgICAgICAgLyogRFBSQU0gYWRkcmVzcyAqLworICAgIHVsb25nMzIgICAgICAgICAgICAgYnJkX3BoeXM7ICAgICAgICAgICAgICAgLyogc2xvdCBudW1iZXIvQklPUyBhZGRyZXNzICovCisgICAgZ2R0NmNfcGx4X3JlZ3MgICAgICAqcGx4OyAgICAgICAgICAgICAgICAgICAvKiBQTFggcmVncyAobmV3IFBDSSBjb250ci4pICovCisgICAgZ2R0aF9jbWRfc3RyICAgICAgICAqcGNjYjsgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGNvbW1hbmQgc3RydWN0dXJlICovCisgICAgdWxvbmczMiAgICAgICAgICAgICBjY2JfcGh5czsgICAgICAgICAgICAgICAvKiBwaHlzLiBhZGRyZXNzICovCisjaWZkZWYgSU5UX0NPQUwKKyAgICBnZHRoX2NvYWxfc3RhdHVzICAgICpjb2FsX3N0YXQ7ICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgY29hbGVzY2luZyBpbnQuKi8KKyAgICB1bG9uZzY0ICAgICAgICAgICAgIGNvYWxfc3RhdF9waHlzOyAgICAgICAgIC8qIHBoeXMuIGFkZHJlc3MgKi8KKyNlbmRpZgorICAgIGNoYXIgICAgICAgICAgICAgICAgKnBzY3JhdGNoOyAgICAgICAgICAgICAgLyogc2NyYXRjaCAoRE1BKSBidWZmZXIgKi8KKyAgICB1bG9uZzY0ICAgICAgICAgICAgIHNjcmF0Y2hfcGh5czsgICAgICAgICAgIC8qIHBoeXMuIGFkZHJlc3MgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHNjcmF0Y2hfYnVzeTsgICAgICAgICAgIC8qIGluIHVzZT8gKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGRtYTY0X3N1cHBvcnQ7ICAgICAgICAgIC8qIDY0LWJpdCBETUEgc3VwcG9ydGVkPyAqLworICAgIGdkdGhfbXNnX3N0ciAgICAgICAgKnBtc2c7ICAgICAgICAgICAgICAgICAgLyogbWVzc2FnZSBidWZmZXIgKi8KKyAgICB1bG9uZzY0ICAgICAgICAgICAgIG1zZ19waHlzOyAgICAgICAgICAgICAgIC8qIHBoeXMuIGFkZHJlc3MgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHNjYW5fbW9kZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgc2NhbiBtb2RlICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBpcnE7ICAgICAgICAgICAgICAgICAgICAvKiBJUlEgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIGRycTsgICAgICAgICAgICAgICAgICAgIC8qIERSUSAoSVNBIGNvbnRyb2xsZXJzKSAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgc3RhdHVzOyAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBzdGF0dXMgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIHNlcnZpY2U7ICAgICAgICAgICAgICAgIC8qIHNlcnZpY2UvZmlybXdhcmUgdmVyLi8uLiAqLworICAgIHVsb25nMzIgICAgICAgICAgICAgaW5mbzsKKyAgICB1bG9uZzMyICAgICAgICAgICAgIGluZm8yOyAgICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgaW5mbyAqLworICAgIFNjc2lfQ21uZCAgICAgICAgICAgKnJlcV9maXJzdDsgICAgICAgICAgICAgLyogdG9wIG9mIHJlcXVlc3QgcXVldWUgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1bmNoYXIgICAgICAgICAgcHJlc2VudDsgICAgICAgICAgICAgICAgLyogRmxhZzogaG9zdCBkcml2ZSBwcmVzZW50PyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaXNfbG9nZHJ2OyAgICAgICAgICAgICAgLyogRmxhZzogbG9nLiBkcml2ZSAobWFzdGVyKT8gKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGlzX2FycmF5ZHJ2OyAgICAgICAgICAgIC8qIEZsYWc6IGFycmF5IGRyaXZlPyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaXNfbWFzdGVyOyAgICAgICAgICAgICAgLyogRmxhZzogYXJyYXkgZHJpdmUgbWFzdGVyPyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaXNfcGFyaXR5OyAgICAgICAgICAgICAgLyogRmxhZzogcGFyaXR5IGRyaXZlPyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaXNfaG90Zml4OyAgICAgICAgICAgICAgLyogRmxhZzogaG90Zml4IGRyaXZlPyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgbWFzdGVyX25vOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1hc3RlciBkcml2ZSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgbG9jazsgICAgICAgICAgICAgICAgICAgLyogZHJpdmUgbG9ja2VkPyAoaG90IHBsdWcpICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBoZWFkczsgICAgICAgICAgICAgICAgICAvKiBtYXBwaW5nICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBzZWNzOworICAgICAgICB1c2hvcnQgICAgICAgICAgZGV2dHlwZTsgICAgICAgICAgICAgICAgLyogZnVydGhlciBpbmZvcm1hdGlvbiAqLworICAgICAgICB1bG9uZzY0ICAgICAgICAgc2l6ZTsgICAgICAgICAgICAgICAgICAgLyogY2FwYWNpdHkgKi8KKyAgICAgICAgdW5jaGFyICAgICAgICAgIGxkcl9ubzsgICAgICAgICAgICAgICAgIC8qIGxvZy4gZHJpdmUgbm8uICovCisgICAgICAgIHVuY2hhciAgICAgICAgICByd19hdHRyaWJzOyAgICAgICAgICAgICAvKiByL3cgYXR0cmlidXRlcyAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgY2x1c3Rlcl90eXBlOyAgICAgICAgICAgLyogY2x1c3RlciBwcm9wZXJ0aWVzICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBtZWRpYV9jaGFuZ2VkOyAgICAgICAgICAvKiBGbGFnOk1PVU5UL1VOTU9VTlQgb2NjdXJlZCAqLworICAgICAgICB1bG9uZzMyICAgICAgICAgc3RhcnRfc2VjOyAgICAgICAgICAgICAgLyogc3RhcnQgc2VjdG9yICovCisgICAgfSBoZHJbTUFYX0xEUklWRVNdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3N0IGRyaXZlcyAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVuY2hhciAgICAgICAgICBsb2NrOyAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGxvY2tlZD8gKGhvdCBwbHVnKSAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgcGRldl9jbnQ7ICAgICAgICAgICAgICAgLyogcGh5c2ljYWwgZGV2aWNlIGNvdW50ICovCisgICAgICAgIHVuY2hhciAgICAgICAgICBsb2NhbF9ubzsgICAgICAgICAgICAgICAvKiBsb2NhbCBjaGFubmVsIG51bWJlciAqLworICAgICAgICB1bmNoYXIgICAgICAgICAgaW9fY250W01BWElEXTsgICAgICAgICAgLyogY3VycmVudCBJTyBjb3VudCAqLworICAgICAgICB1bG9uZzMyICAgICAgICAgYWRkcmVzczsgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBhZGRyZXNzICovCisgICAgICAgIHVsb25nMzIgICAgICAgICBpZF9saXN0W01BWElEXTsgICAgICAgICAvKiBJRHMgb2YgdGhlIHBoeXMuIGRldmljZXMgKi8KKyAgICB9IHJhd1tNQVhCVVNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgY2hhbm5lbHMgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBTY3NpX0NtbmQgICAgICAgKmNtbmQ7ICAgICAgICAgICAgICAgICAgLyogcGVuZGluZyByZXF1ZXN0ICovCisgICAgICAgIHVzaG9ydCAgICAgICAgICBzZXJ2aWNlOyAgICAgICAgICAgICAgICAvKiBzZXJ2aWNlICovCisgICAgfSBjbWRfdGFiW0dEVEhfTUFYQ01EU107ICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBvZiBwZW5kLiByZXF1ZXN0cyAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgYnVzX2NudDsgICAgICAgICAgICAgICAgLyogU0NTSSBidXMgY291bnQgKi8KKyAgICB1bmNoYXIgICAgICAgICAgICAgIHRpZF9jbnQ7ICAgICAgICAgICAgICAgIC8qIFRhcmdldCBJRCBjb3VudCAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgYnVzX2lkW01BWEJVU107ICAgICAgICAgLyogSU9QIElEcyAqLworICAgIHVuY2hhciAgICAgICAgICAgICAgdmlydF9idXM7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHZpcnR1YWwgYnVzICovCisgICAgdW5jaGFyICAgICAgICAgICAgICBtb3JlX3Byb2M7ICAgICAgICAgICAgICAvKiBtb3JlIC9wcm9jIGluZm8gc3VwcG9ydGVkICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBjbWRfY250OyAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGNvdW50IGluIERQUkFNICovCisgICAgdXNob3J0ICAgICAgICAgICAgICBjbWRfbGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgYWN0dWFsIGNvbW1hbmQgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIGNtZF9vZmZzX2RwbWVtOyAgICAgICAgIC8qIGFjdHVhbCBvZmZzZXQgaW4gRFBSQU0gKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgIGljX2FsbF9zaXplOyAgICAgICAgICAgIC8qIHNpemVvZiBEUFJBTSBpbnRlcmYuIGFyZWEgKi8KKyAgICBnZHRoX2NwYXJfc3RyICAgICAgIGNwYXI7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgY2FjaGUgcGFyLiAqLworICAgIGdkdGhfYmZlYXRfc3RyICAgICAgYmZlYXQ7ICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBmZWF0dXJlcyAqLworICAgIGdkdGhfYmluZm9fc3RyICAgICAgYmluZm87ICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciBpbmZvICovCisgICAgZ2R0aF9ldnRfZGF0YSAgICAgICBkdnI7ICAgICAgICAgICAgICAgICAgICAvKiBldmVudCBzdHJ1Y3R1cmUgKi8KKyAgICBzcGlubG9ja190ICAgICAgICAgIHNtcF9sb2NrOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKyAgICBzdHJ1Y3QgcGNpX2RldiAgICAgICpwZGV2OworI2VuZGlmCisgICAgY2hhciAgICAgICAgICAgICAgICBvZW1fbmFtZVs4XTsKKyNpZmRlZiBHRFRIX0RNQV9TVEFUSVNUSUNTCisgICAgdWxvbmcgICAgICAgICAgICAgICBkbWEzMl9jbnQsIGRtYTY0X2NudDsgICAvKiBzdGF0aXN0aWNzOiBETUEgYnVmZmVyICovCisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCisgICAgU2NzaV9EZXZpY2UgICAgICAgICAqc2RldjsKKyNlbHNlCisgICAgU2NzaV9EZXZpY2UgICAgICAgICBzZGV2OworI2VuZGlmCit9IGdkdGhfaGFfc3RyOworCisvKiBzdHJ1Y3R1cmUgZm9yIHNjc2lfcmVnaXN0ZXIoKSwgU0NTSSBidXMgIT0gMCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCAgICAgIGhhbnVtOworICAgIHVzaG9ydCAgICAgIGJ1c251bTsKK30gZ2R0aF9udW1fc3RyOworCisvKiBzdHJ1Y3R1cmUgZm9yIHNjc2lfcmVnaXN0ZXIoKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGdkdGhfbnVtX3N0ciAgICAgICAgbnVtZXh0OyAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCAqLworICAgIGdkdGhfaGFfc3RyICAgICAgICAgaGFleHQ7CisgICAgZ2R0aF9jbWRfc3RyICAgICAgICBjbWRleHQ7Cit9IGdkdGhfZXh0X3N0cjsKKworCisvKiBJTlFVSVJZIGRhdGEgZm9ybWF0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5jaGFyICAgICAgdHlwZV9xdWFsOworICAgIHVuY2hhciAgICAgIG1vZGlmX3JtYjsKKyAgICB1bmNoYXIgICAgICB2ZXJzaW9uOworICAgIHVuY2hhciAgICAgIHJlc3BfYWVuYzsKKyAgICB1bmNoYXIgICAgICBhZGRfbGVuZ3RoOworICAgIHVuY2hhciAgICAgIHJlc2VydmVkMTsKKyAgICB1bmNoYXIgICAgICByZXNlcnZlZDI7CisgICAgdW5jaGFyICAgICAgbWlzYzsKKyAgICB1bmNoYXIgICAgICB2ZW5kb3JbOF07CisgICAgdW5jaGFyICAgICAgcHJvZHVjdFsxNl07CisgICAgdW5jaGFyICAgICAgcmV2aXNpb25bNF07Cit9IFBBQ0tFRCBnZHRoX2lucV9kYXRhOworCisvKiBSRUFEX0NBUEFDSVRZIGRhdGEgZm9ybWF0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgbGFzdF9ibG9ja19ubzsKKyAgICB1bG9uZzMyICAgICBibG9ja19sZW5ndGg7Cit9IFBBQ0tFRCBnZHRoX3JkY2FwX2RhdGE7CisKKy8qIFJFQURfQ0FQQUNJVFkgKDE2KSBkYXRhIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nNjQgICAgIGxhc3RfYmxvY2tfbm87CisgICAgdWxvbmczMiAgICAgYmxvY2tfbGVuZ3RoOworfSBQQUNLRUQgZ2R0aF9yZGNhcDE2X2RhdGE7CisKKy8qIFJFUVVFU1RfU0VOU0UgZGF0YSBmb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgICAgICBlcnJvcmNvZGU7CisgICAgdW5jaGFyICAgICAgc2Vnbm87CisgICAgdW5jaGFyICAgICAga2V5OworICAgIHVsb25nMzIgICAgIGluZm87CisgICAgdW5jaGFyICAgICAgYWRkX2xlbmd0aDsKKyAgICB1bG9uZzMyICAgICBjbWRfaW5mbzsKKyAgICB1bmNoYXIgICAgICBhZHNjOworICAgIHVuY2hhciAgICAgIGFkc3E7CisgICAgdW5jaGFyICAgICAgZnJ1YzsKKyAgICB1bmNoYXIgICAgICBrZXlfc3BlY1szXTsKK30gUEFDS0VEIGdkdGhfc2Vuc2VfZGF0YTsKKworLyogTU9ERV9TRU5TRSBkYXRhIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0cnVjdCB7CisgICAgICAgIHVuY2hhciAgZGF0YV9sZW5ndGg7CisgICAgICAgIHVuY2hhciAgbWVkX3R5cGU7CisgICAgICAgIHVuY2hhciAgZGV2X3BhcjsKKyAgICAgICAgdW5jaGFyICBiZF9sZW5ndGg7CisgICAgfSBQQUNLRUQgaGQ7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5jaGFyICBkZW5zX2NvZGU7CisgICAgICAgIHVuY2hhciAgYmxvY2tfY291bnRbM107CisgICAgICAgIHVuY2hhciAgcmVzZXJ2ZWQ7CisgICAgICAgIHVuY2hhciAgYmxvY2tfbGVuZ3RoWzNdOworICAgIH0gUEFDS0VEIGJkOworfSBQQUNLRUQgZ2R0aF9tb2RlcF9kYXRhOworCisvKiBzdGFjayBmcmFtZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nICAgICAgIGJbMTBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIvNjQgYml0IGNvbXBpbGVyICEgKi8KK30gUEFDS0VEIGdkdGhfc3RhY2tmcmFtZTsKKworCisvKiBmdW5jdGlvbiBwcm90b3R5cGluZyAqLworCitpbnQgZ2R0aF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworaW50IGdkdGhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworaW50IGdkdGhfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworY29uc3QgY2hhciAqZ2R0aF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCitpbnQgZ2R0aF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLHN0cnVjdCBibG9ja19kZXZpY2UgKixzZWN0b3JfdCxpbnQgKik7CitpbnQgZ2R0aF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosY2hhciAqKixvZmZfdCxpbnQsaW50KTsKKyNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKK2ludCBnZHRoX2Jpb3NfcGFyYW0oRGlzayAqLGtkZXZfdCxpbnQgKik7CitpbnQgZ2R0aF9wcm9jX2luZm8oY2hhciAqLGNoYXIgKiosb2ZmX3QsaW50LGludCxpbnQpOworI2Vsc2UKK2ludCBnZHRoX2Jpb3NfcGFyYW0oRGlzayAqLGtkZXZfdCxpbnQgKik7CitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5IHByb2Nfc2NzaV9nZHRoOworaW50IGdkdGhfcHJvY19pbmZvKGNoYXIgKixjaGFyICoqLG9mZl90LGludCxpbnQsaW50KTsKK2ludCBnZHRoX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2ludCBnZHRoX3Jlc2V0KFNjc2lfQ21uZCAqLHVuc2lnbmVkIGludCk7IAorI2RlZmluZSBHRFRIIHsgcHJvY19kaXI6ICAgICAgICAmcHJvY19zY3NpX2dkdGgsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBwcm9jX2luZm86ICAgICAgIGdkdGhfcHJvY19pbmZvLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIG5hbWU6ICAgICAgICAgICAgIkdEVCBTQ1NJIERpc2sgQXJyYXkgQ29udHJvbGxlciIsXAorICAgICAgICAgICAgICAgZGV0ZWN0OiAgICAgICAgICBnZHRoX2RldGVjdCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICByZWxlYXNlOiAgICAgICAgIGdkdGhfcmVsZWFzZSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGluZm86ICAgICAgICAgICAgZ2R0aF9pbmZvLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgY29tbWFuZDogICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBxdWV1ZWNvbW1hbmQ6ICAgIGdkdGhfcXVldWVjb21tYW5kLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGVoX2Fib3J0X2hhbmRsZXI6IGdkdGhfZWhfYWJvcnQsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI6IGdkdGhfZWhfZGV2aWNlX3Jlc2V0LCAgICBcCisgICAgICAgICAgICAgICBlaF9idXNfcmVzZXRfaGFuZGxlcjogZ2R0aF9laF9idXNfcmVzZXQsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGVoX2hvc3RfcmVzZXRfaGFuZGxlcjogZ2R0aF9laF9ob3N0X3Jlc2V0LCAgICAgICAgXAorICAgICAgICAgICAgICAgYWJvcnQ6ICAgICAgICAgICBnZHRoX2Fib3J0LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICByZXNldDogICAgICAgICAgIGdkdGhfcmVzZXQsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGJpb3NfcGFyYW06ICAgICAgZ2R0aF9iaW9zX3BhcmFtLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgY2FuX3F1ZXVlOiAgICAgICBHRFRIX01BWENNRFMsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICB0aGlzX2lkOiAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHNnX3RhYmxlc2l6ZTogICAgR0RUSF9NQVhTRywgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgY21kX3Blcl9sdW46ICAgICBHRFRIX01BWENfUF9MLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBwcmVzZW50OiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHVuY2hlY2tlZF9pc2FfZG1hOiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgdXNlX2NsdXN0ZXJpbmc6ICBFTkFCTEVfQ0xVU1RFUklORywgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICB1c2VfbmV3X2VoX2NvZGU6IDEgICAgICAgLyogdXNlIG5ldyBlcnJvciBjb2RlICovIH0gICAgCisjZW5kaWYKKworaW50IGdkdGhfZWhfYWJvcnQoU2NzaV9DbW5kICpzY3ApOworaW50IGdkdGhfZWhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqc2NwKTsKK2ludCBnZHRoX2VoX2J1c19yZXNldChTY3NpX0NtbmQgKnNjcCk7CitpbnQgZ2R0aF9laF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqc2NwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aF9pb2N0bC5oIGIvZHJpdmVycy9zY3NpL2dkdGhfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODNmYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2dkdGhfaW9jdGwuaApAQCAtMCwwICsxLDM0NyBAQAorI2lmbmRlZiBfR0RUSF9JT0NUTF9ICisjZGVmaW5lIF9HRFRIX0lPQ1RMX0gKKworLyogZ2R0aF9pb2N0bC5oCisgKiAkSWQ6IGdkdGhfaW9jdGwuaCx2IDEuMTQgMjAwNC8wMi8xOSAxNTo0MzoxNSBhY2hpbSBFeHAgJAorICovCisKKy8qIElPQ1RMcyAqLworI2RlZmluZSBHRFRJT0NUTF9NQVNLICAgICAgICgnSic8PDgpCisjZGVmaW5lIEdEVElPQ1RMX0dFTkVSQUwgICAgKEdEVElPQ1RMX01BU0sgfCAwKSAvKiBnZW5lcmFsIElPQ1RMICovCisjZGVmaW5lIEdEVElPQ1RMX0RSVkVSUyAgICAgKEdEVElPQ1RMX01BU0sgfCAxKSAvKiBnZXQgZHJpdmVyIHZlcnNpb24gKi8KKyNkZWZpbmUgR0RUSU9DVExfQ1RSVFlQRSAgICAoR0RUSU9DVExfTUFTSyB8IDIpIC8qIGdldCBjb250cm9sbGVyIHR5cGUgKi8KKyNkZWZpbmUgR0RUSU9DVExfT1NWRVJTICAgICAoR0RUSU9DVExfTUFTSyB8IDMpIC8qIGdldCBPUyB2ZXJzaW9uICovCisjZGVmaW5lIEdEVElPQ1RMX0hEUkxJU1QgICAgKEdEVElPQ1RMX01BU0sgfCA0KSAvKiBnZXQgaG9zdCBkcml2ZSBsaXN0ICovCisjZGVmaW5lIEdEVElPQ1RMX0NUUkNOVCAgICAgKEdEVElPQ1RMX01BU0sgfCA1KSAvKiBnZXQgY29udHJvbGxlciBjb3VudCAqLworI2RlZmluZSBHRFRJT0NUTF9MT0NLRFJWICAgIChHRFRJT0NUTF9NQVNLIHwgNikgLyogbG9jayBob3N0IGRyaXZlICovCisjZGVmaW5lIEdEVElPQ1RMX0xPQ0tDSE4gICAgKEdEVElPQ1RMX01BU0sgfCA3KSAvKiBsb2NrIGNoYW5uZWwgKi8KKyNkZWZpbmUgR0RUSU9DVExfRVZFTlQgICAgICAoR0RUSU9DVExfTUFTSyB8IDgpIC8qIHJlYWQgY29udHJvbGxlciBldmVudHMgKi8KKyNkZWZpbmUgR0RUSU9DVExfU0NTSSAgICAgICAoR0RUSU9DVExfTUFTSyB8IDkpIC8qIFNDU0kgY29tbWFuZCAqLworI2RlZmluZSBHRFRJT0NUTF9SRVNFVF9CVVMgIChHRFRJT0NUTF9NQVNLIHwxMCkgLyogcmVzZXQgU0NTSSBidXMgKi8KKyNkZWZpbmUgR0RUSU9DVExfUkVTQ0FOICAgICAoR0RUSU9DVExfTUFTSyB8MTEpIC8qIHJlc2NhbiBob3N0IGRyaXZlcyAqLworI2RlZmluZSBHRFRJT0NUTF9SRVNFVF9EUlYgIChHRFRJT0NUTF9NQVNLIHwxMikgLyogcmVzZXQgKHJlbW90ZSkgZHJ2LiByZXMuICovCisKKyNkZWZpbmUgR0RUSU9DVExfTUFHSUMgIDB4YWZmZTAwMDQKKyNkZWZpbmUgRVZFTlRfU0laRSAgICAgIDI5NCAKKyNkZWZpbmUgR0RUSF9NQVhTRyAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gcy9nIGVsZW1lbnRzICovCisKKyNkZWZpbmUgTUFYX0xEUklWRVMgICAgIDI1NSAgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gbG9nLiBkcml2ZSBjb3VudCAqLworI2lmZGVmIEdEVEhfSU9DVExfUFJPQworI2RlZmluZSBNQVhfSERSSVZFUyAgICAgMTAwICAgICAgICAgICAgICAgICAgICAgLyogbWF4LiBob3N0IGRyaXZlIGNvdW50ICovCisjZWxzZQorI2RlZmluZSBNQVhfSERSSVZFUyAgICAgTUFYX0xEUklWRVMgICAgICAgICAgICAgLyogbWF4LiBob3N0IGRyaXZlIGNvdW50ICovCisjZW5kaWYKKworLyogdHlwZWRlZnMgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCit0eXBlZGVmIHUzMiAgICAgdWxvbmczMjsKK3R5cGVkZWYgdTY0ICAgICB1bG9uZzY0OworI2VuZGlmCisKKyNkZWZpbmUgUEFDS0VEICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorCisvKiBzY2F0dGVyL2dhdGhlciBlbGVtZW50ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgc2dfcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzICovCisgICAgdWxvbmczMiAgICAgc2dfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggKi8KK30gUEFDS0VEIGdkdGhfc2dfc3RyOworCisvKiBzY2F0dGVyL2dhdGhlciBlbGVtZW50IC0gNjRiaXQgYWRkcmVzc2VzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmc2NCAgICAgc2dfcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzICovCisgICAgdWxvbmczMiAgICAgc2dfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggKi8KK30gUEFDS0VEIGdkdGhfc2c2NF9zdHI7CisKKy8qIGNvbW1hbmQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgQm9hcmROb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiBib2FyZCBub2RlIChhbHdheXMgMCkgKi8KKyAgICB1bG9uZzMyICAgICBDb21tYW5kSW5kZXg7ICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgbnVtYmVyICovCisgICAgdXNob3J0ICAgICAgT3BDb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY29tbWFuZCAoUkVBRCwuLikgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICBEZXZpY2VObzsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY2FjaGUgZHJpdmUgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIEJsb2NrTm87ICAgICAgICAgICAgICAgIC8qIGJsb2NrIG51bWJlciAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgQmxvY2tDbnQ7ICAgICAgICAgICAgICAgLyogYmxvY2sgY291bnQgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIERlc3RBZGRyOyAgICAgICAgICAgICAgIC8qIGRlc3QuIGFkZHIuIChpZiBzL2c6IC0xKSAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgc2dfY2FuejsgICAgICAgICAgICAgICAgLyogcy9nIGVsZW1lbnQgY291bnQgKi8KKyAgICAgICAgICAgIGdkdGhfc2dfc3RyIHNnX2xzdFtHRFRIX01BWFNHXTsgICAgIC8qIHMvZyBsaXN0ICovCisgICAgICAgIH0gUEFDS0VEIGNhY2hlOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZSBzZXJ2aWNlIGNtZC4gc3RyLiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgRGV2aWNlTm87ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNhY2hlIGRyaXZlICovCisgICAgICAgICAgICB1bG9uZzY0ICAgICBCbG9ja05vOyAgICAgICAgICAgICAgICAvKiBibG9jayBudW1iZXIgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIEJsb2NrQ250OyAgICAgICAgICAgICAgIC8qIGJsb2NrIGNvdW50ICovCisgICAgICAgICAgICB1bG9uZzY0ICAgICBEZXN0QWRkcjsgICAgICAgICAgICAgICAvKiBkZXN0LiBhZGRyLiAoaWYgcy9nOiAtMSkgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNnX2Nhbno7ICAgICAgICAgICAgICAgIC8qIHMvZyBlbGVtZW50IGNvdW50ICovCisgICAgICAgICAgICBnZHRoX3NnNjRfc3RyIHNnX2xzdFtHRFRIX01BWFNHXTsgICAvKiBzL2cgbGlzdCAqLworICAgICAgICB9IFBBQ0tFRCBjYWNoZTY0OyAgICAgICAgICAgICAgICAgICAgICAgLyogY2FjaGUgc2VydmljZSBjbWQuIHN0ci4gKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgIHBhcmFtX3NpemU7ICAgICAgICAgICAgIC8qIHNpemUgb2YgcF9wYXJhbSBidWZmZXIgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHN1YmZ1bmM7ICAgICAgICAgICAgICAgIC8qIElPQ1RMIGZ1bmN0aW9uICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBjaGFubmVsOyAgICAgICAgICAgICAgICAvKiBkZXZpY2UgKi8KKyAgICAgICAgICAgIHVsb25nNjQgICAgIHBfcGFyYW07ICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciAqLworICAgICAgICB9IFBBQ0tFRCBpb2N0bDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU9DVEwgY29tbWFuZCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgIHJlc2VydmVkOworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVsb25nMzIgIG1zZ19oYW5kbGU7ICAgICAgICAvKiBtZXNzYWdlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICB1bG9uZzY0ICBtc2dfYWRkcjsgICAgICAgICAgLyogbWVzc2FnZSBidWZmZXIgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIH0gUEFDS0VEIG1zZzsKKyAgICAgICAgICAgICAgICB1bmNoYXIgICAgICAgZGF0YVsxMl07ICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcnRjIGRhdGEsIC4uLiAqLworICAgICAgICAgICAgfSBzdTsKKyAgICAgICAgfSBQQUNLRUQgc2NyZWVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjcmVlbiBzZXJ2aWNlIGNtZC4gc3RyLiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgcmVzZXJ2ZWQ7CisgICAgICAgICAgICB1bG9uZzMyICAgICBkaXJlY3Rpb247ICAgICAgICAgICAgICAvKiBkYXRhIGRpcmVjdGlvbiAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgbWRpc2NfdGltZTsgICAgICAgICAgICAgLyogZGlzYy4gdGltZSAoMDogbm8gdGltZW91dCkqLworICAgICAgICAgICAgdWxvbmczMiAgICAgbWNvbl90aW1lOyAgICAgICAgICAgICAgLyogY29ubmVjdCB0aW1lKDA6IG5vIHRvLikgKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNkYXRhOyAgICAgICAgICAgICAgICAgIC8qIGRlc3QuIGFkZHIuIChpZiBzL2c6IC0xKSAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgc2RsZW47ICAgICAgICAgICAgICAgICAgLyogZGF0YSBsZW5ndGggKGJ5dGVzKSAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgY2xlbjsgICAgICAgICAgICAgICAgICAgLyogU0NTSSBjbWQuIGxlbmd0aCg2LDEwLDEyKSAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgY21kWzEyXTsgICAgICAgICAgICAgICAgLyogU0NTSSBjb21tYW5kICovCisgICAgICAgICAgICB1bmNoYXIgICAgICB0YXJnZXQ7ICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgSUQgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIGx1bjsgICAgICAgICAgICAgICAgICAgIC8qIExVTiAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgYnVzOyAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBidXMgbnVtYmVyICovCisgICAgICAgICAgICB1bmNoYXIgICAgICBwcmlvcml0eTsgICAgICAgICAgICAgICAvKiBvbmx5IDAgdXNlZCAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgc2Vuc2VfbGVuOyAgICAgICAgICAgICAgLyogc2Vuc2UgZGF0YSBsZW5ndGggKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNlbnNlX2RhdGE7ICAgICAgICAgICAgIC8qIHNlbnNlIGRhdGEgYWRkci4gKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIGxpbmtfcDsgICAgICAgICAgICAgICAgIC8qIGxpbmtlZCBjbWRzIChub3Qgc3VwcC4pICovCisgICAgICAgICAgICB1bG9uZzMyICAgICBzZ19yYW56OyAgICAgICAgICAgICAgICAvKiBzL2cgZWxlbWVudCBjb3VudCAqLworICAgICAgICAgICAgZ2R0aF9zZ19zdHIgc2dfbHN0W0dEVEhfTUFYU0ddOyAgICAgLyogcy9nIGxpc3QgKi8KKyAgICAgICAgfSBQQUNLRUQgcmF3OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBzZXJ2aWNlIGNtZC4gc3RydWN0LiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgcmVzZXJ2ZWQ7CisgICAgICAgICAgICB1bG9uZzMyICAgICBkaXJlY3Rpb247ICAgICAgICAgICAgICAvKiBkYXRhIGRpcmVjdGlvbiAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgbWRpc2NfdGltZTsgICAgICAgICAgICAgLyogZGlzYy4gdGltZSAoMDogbm8gdGltZW91dCkqLworICAgICAgICAgICAgdWxvbmczMiAgICAgbWNvbl90aW1lOyAgICAgICAgICAgICAgLyogY29ubmVjdCB0aW1lKDA6IG5vIHRvLikgKi8KKyAgICAgICAgICAgIHVsb25nNjQgICAgIHNkYXRhOyAgICAgICAgICAgICAgICAgIC8qIGRlc3QuIGFkZHIuIChpZiBzL2c6IC0xKSAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgc2RsZW47ICAgICAgICAgICAgICAgICAgLyogZGF0YSBsZW5ndGggKGJ5dGVzKSAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgY2xlbjsgICAgICAgICAgICAgICAgICAgLyogU0NTSSBjbWQuIGxlbmd0aCg2LC4uLDE2KSAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgY21kWzE2XTsgICAgICAgICAgICAgICAgLyogU0NTSSBjb21tYW5kICovCisgICAgICAgICAgICB1bmNoYXIgICAgICB0YXJnZXQ7ICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgSUQgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgIGx1bjsgICAgICAgICAgICAgICAgICAgIC8qIExVTiAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgYnVzOyAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBidXMgbnVtYmVyICovCisgICAgICAgICAgICB1bmNoYXIgICAgICBwcmlvcml0eTsgICAgICAgICAgICAgICAvKiBvbmx5IDAgdXNlZCAqLworICAgICAgICAgICAgdWxvbmczMiAgICAgc2Vuc2VfbGVuOyAgICAgICAgICAgICAgLyogc2Vuc2UgZGF0YSBsZW5ndGggKi8KKyAgICAgICAgICAgIHVsb25nNjQgICAgIHNlbnNlX2RhdGE7ICAgICAgICAgICAgIC8qIHNlbnNlIGRhdGEgYWRkci4gKi8KKyAgICAgICAgICAgIHVsb25nMzIgICAgIHNnX3Jhbno7ICAgICAgICAgICAgICAgIC8qIHMvZyBlbGVtZW50IGNvdW50ICovCisgICAgICAgICAgICBnZHRoX3NnNjRfc3RyIHNnX2xzdFtHRFRIX01BWFNHXTsgICAvKiBzL2cgbGlzdCAqLworICAgICAgICB9IFBBQ0tFRCByYXc2NDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmF3IHNlcnZpY2UgY21kLiBzdHJ1Y3QuICovCisgICAgfSB1OworICAgIC8qIGFkZGl0aW9uYWwgdmFyaWFibGVzICovCisgICAgdW5jaGFyICAgICAgU2VydmljZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIHNlcnZpY2UgKi8KKyAgICB1bmNoYXIgICAgICByZXNlcnZlZDsKKyAgICB1c2hvcnQgICAgICBTdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgcmVzdWx0ICovCisgICAgdWxvbmczMiAgICAgSW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCisgICAgdm9pZCAgICAgICAgKlJlcXVlc3RCdWZmZXI7ICAgICAgICAgICAgICAgICAvKiByZXF1ZXN0IGJ1ZmZlciAqLworfSBQQUNLRUQgZ2R0aF9jbWRfc3RyOworCisvKiBjb250cm9sbGVyIGV2ZW50IHN0cnVjdHVyZSAqLworI2RlZmluZSBFU19BU1lOQyAgICAxCisjZGVmaW5lIEVTX0RSSVZFUiAgIDIKKyNkZWZpbmUgRVNfVEVTVCAgICAgMworI2RlZmluZSBFU19TWU5DICAgICA0Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgICAgICAvKiBzaXplIG9mIHN0cnVjdHVyZSAqLworICAgIHVuaW9uIHsKKyAgICAgICAgY2hhciAgICAgICAgICAgICAgICBzdHJlYW1bMTZdOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGlvbm9kZTsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBzZXJ2aWNlOworICAgICAgICAgICAgdWxvbmczMiAgICAgICAgIGluZGV4OworICAgICAgICB9IFBBQ0tFRCBkcml2ZXI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgaW9ub2RlOworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHNlcnZpY2U7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgc3RhdHVzOworICAgICAgICAgICAgdWxvbmczMiAgICAgICAgIGluZm87CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgc2NzaV9jb29yZFszXTsKKyAgICAgICAgfSBQQUNLRUQgYXN5bmM7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgaW9ub2RlOworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHNlcnZpY2U7CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgc3RhdHVzOworICAgICAgICAgICAgdWxvbmczMiAgICAgICAgIGluZm87CisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgaG9zdGRyaXZlOworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHNjc2lfY29vcmRbM107CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgc2Vuc2Vfa2V5OworICAgICAgICB9IFBBQ0tFRCBzeW5jOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWxvbmczMiAgICAgICAgIGwxLCBsMiwgbDMsIGw0OworICAgICAgICB9IFBBQ0tFRCB0ZXN0OworICAgIH0gZXU7CisgICAgdWxvbmczMiAgICAgICAgICAgICAgICAgc2V2ZXJpdHk7CisgICAgdW5jaGFyICAgICAgICAgICAgICAgICAgZXZlbnRfc3RyaW5nWzI1Nl07ICAgICAgICAgIAorfSBQQUNLRUQgZ2R0aF9ldnRfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgICAgICBmaXJzdF9zdGFtcDsKKyAgICB1bG9uZzMyICAgICAgICAgbGFzdF9zdGFtcDsKKyAgICB1c2hvcnQgICAgICAgICAgc2FtZV9jb3VudDsKKyAgICB1c2hvcnQgICAgICAgICAgZXZlbnRfc291cmNlOworICAgIHVzaG9ydCAgICAgICAgICBldmVudF9pZHg7CisgICAgdW5jaGFyICAgICAgICAgIGFwcGxpY2F0aW9uOworICAgIHVuY2hhciAgICAgICAgICByZXNlcnZlZDsKKyAgICBnZHRoX2V2dF9kYXRhICAgZXZlbnRfZGF0YTsKK30gUEFDS0VEIGdkdGhfZXZ0X3N0cjsKKworCisjaWZkZWYgR0RUSF9JT0NUTF9QUk9DCisvKiBJT0NUTCBzdHJ1Y3R1cmUgKHdyaXRlKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVsb25nMzIgICAgICAgICAgICAgICAgIG1hZ2ljOyAgICAgICAgICAgICAgLyogSU9DVEwgbWFnaWMgKi8KKyAgICB1c2hvcnQgICAgICAgICAgICAgICAgICBpb2N0bDsgICAgICAgICAgICAgIC8qIElPQ1RMICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgaW9ub2RlOyAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgIHNlcnZpY2U7ICAgICAgICAgICAgLyogY29udHJvbGxlciBzZXJ2aWNlICovCisgICAgdXNob3J0ICAgICAgICAgICAgICAgICAgdGltZW91dDsgICAgICAgICAgICAvKiB0aW1lb3V0ICovCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGNvbW1hbmRbNTEyXTsgICAgICAgLyogY29udHJvbGxlciBjb21tYW5kICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgZGF0YVsxXTsgICAgICAgICAgICAvKiBhZGQuIGRhdGEgKi8KKyAgICAgICAgfSBnZW5lcmFsOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGxvY2s7ICAgICAgICAgICAgICAgLyogbG9jay91bmxvY2sgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBkcml2ZV9jbnQ7ICAgICAgICAgIC8qIGRyaXZlIGNvdW50ICovCisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgZHJpdmVzW01BWF9IRFJJVkVTXTsvKiBkcml2ZXMgKi8KKyAgICAgICAgfSBsb2NrZHJ2OworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGxvY2s7ICAgICAgICAgICAgICAgLyogbG9jay91bmxvY2sgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBjaGFubmVsOyAgICAgICAgICAgIC8qIGNoYW5uZWwgKi8KKyAgICAgICAgfSBsb2NrY2huOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGVyYXNlOyAgICAgICAgICAgICAgLyogZXJhc2UgZXZlbnQgPyAqLworICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhhbmRsZTsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBldnRbRVZFTlRfU0laRV07ICAgIC8qIGV2ZW50IHN0cnVjdHVyZSAqLworICAgICAgICB9IGV2ZW50OworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGJ1czsgICAgICAgICAgICAgICAgLyogU0NTSSBidXMgKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICB0YXJnZXQ7ICAgICAgICAgICAgIC8qIHRhcmdldCBJRCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGx1bjsgICAgICAgICAgICAgICAgLyogTFVOICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgY21kX2xlbjsgICAgICAgICAgICAvKiBjb21tYW5kIGxlbmd0aCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGNtZFsxMl07ICAgICAgICAgICAgLyogU0NTSSBjb21tYW5kICovCisgICAgICAgIH0gc2NzaTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBoZHJfbm87ICAgICAgICAgICAgIC8qIGhvc3QgZHJpdmUgbnVtYmVyICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgZmxhZzsgICAgICAgICAgICAgICAvKiBvbGQgbWV0aC4vYWRkL3JlbW92ZSAqLworICAgICAgICB9IHJlc2NhbjsKKyAgICB9IGl1OworfSBnZHRoX2lvd3Jfc3RyOworCisvKiBJT0NUTCBzdHJ1Y3R1cmUgKHJlYWQpICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWxvbmczMiAgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgICAgICAvKiBidWZmZXIgc2l6ZSAqLworICAgIHVsb25nMzIgICAgICAgICAgICAgICAgIHN0YXR1czsgICAgICAgICAgICAgLyogSU9DVEwgZXJyb3IgY29kZSAqLworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBkYXRhWzFdOyAgICAgICAgICAgIC8qIGRhdGEgKi8KKyAgICAgICAgfSBnZW5lcmFsOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHZlcnNpb247ICAgICAgICAgICAgLyogZHJpdmVyIHZlcnNpb24gKi8KKyAgICAgICAgfSBkcnZlcnM7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgdHlwZTsgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIHR5cGUgKi8KKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBpbmZvOyAgICAgICAgICAgICAgIC8qIHNsb3QgZXRjLiAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIG9lbV9pZDsgICAgICAgICAgICAgLyogT0VNIElEICovCisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgYmlvc192ZXI7ICAgICAgICAgICAvKiBub3QgdXNlZCAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIGFjY2VzczsgICAgICAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBleHRfdHlwZTsgICAgICAgICAgIC8qIGV4dGVuZGVkIHR5cGUgKi8KKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBkZXZpY2VfaWQ7ICAgICAgICAgIC8qIGRldmljZSBJRCAqLworICAgICAgICAgICAgdXNob3J0ICAgICAgICAgIHN1Yl9kZXZpY2VfaWQ7ICAgICAgLyogc3ViIGRldmljZSBJRCAqLworICAgICAgICB9IGN0cnR5cGU7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgdmVyc2lvbjsgICAgICAgICAgICAvKiBPUyB2ZXJzaW9uICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgc3VidmVyc2lvbjsgICAgICAgICAvKiBPUyBzdWJ2ZXJzaW9uICovCisgICAgICAgICAgICB1c2hvcnQgICAgICAgICAgcmV2aXNpb247ICAgICAgICAgICAvKiByZXZpc2lvbiAqLworICAgICAgICB9IG9zdmVyczsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVzaG9ydCAgICAgICAgICBjb3VudDsgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgY291bnQgKi8KKyAgICAgICAgfSBjdHJjbnQ7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaGFuZGxlOworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIGV2dFtFVkVOVF9TSVpFXTsgICAgLyogZXZlbnQgc3RydWN0dXJlICovCisgICAgICAgIH0gZXZlbnQ7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgYnVzOyAgICAgICAgICAgICAgICAvKiBTQ1NJIGJ1cywgMHhmZjogaW52YWxpZCAqLworICAgICAgICAgICAgdW5jaGFyICAgICAgICAgIHRhcmdldDsgICAgICAgICAgICAgLyogdGFyZ2V0IElEICovCisgICAgICAgICAgICB1bmNoYXIgICAgICAgICAgbHVuOyAgICAgICAgICAgICAgICAvKiBMVU4gKi8KKyAgICAgICAgICAgIHVuY2hhciAgICAgICAgICBjbHVzdGVyX3R5cGU7ICAgICAgIC8qIGNsdXN0ZXIgcHJvcGVydGllcyAqLworICAgICAgICB9IGhkcl9saXN0W01BWF9IRFJJVkVTXTsgICAgICAgICAgICAgICAgLyogaW5kZXggaXMgaG9zdCBkcml2ZSBudW1iZXIgKi8KKyAgICB9IGl1OworfSBnZHRoX2lvcmRfc3RyOworI2VuZGlmCisKKy8qIEdEVElPQ1RMX0dFTkVSQUwgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1c2hvcnQgaW9ub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgbnVtYmVyICovCisgICAgdXNob3J0IHRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lb3V0ICovCisgICAgdWxvbmczMiBpbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBpbmZvICovIAorICAgIHVzaG9ydCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdHVzICovCisgICAgdWxvbmcgZGF0YV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkYXRhIGJ1ZmZlciBzaXplICovCisgICAgdWxvbmcgc2Vuc2VfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW5zZSBidWZmZXIgc2l6ZSAqLworICAgIGdkdGhfY21kX3N0ciBjb21tYW5kOyAgICAgICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCAqLyAgICAgICAgICAgICAgICAgICAKK30gZ2R0aF9pb2N0bF9nZW5lcmFsOworCisvKiBHRFRJT0NUTF9MT0NLRFJWICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0IGlvbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVuY2hhciBsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jay91bmxvY2sgKi8KKyAgICB1bmNoYXIgZHJpdmVfY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyaXZlIGNvdW50ICovCisgICAgdXNob3J0IGRyaXZlc1tNQVhfSERSSVZFU107ICAgICAgICAgICAgICAgICAvKiBkcml2ZXMgKi8KK30gZ2R0aF9pb2N0bF9sb2NrZHJ2OworCisvKiBHRFRJT0NUTF9MT0NLQ0hOICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0IGlvbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVuY2hhciBsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9jay91bmxvY2sgKi8KKyAgICB1bmNoYXIgY2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgKi8KK30gZ2R0aF9pb2N0bF9sb2NrY2huOworCisvKiBHRFRJT0NUTF9PU1ZFUlMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmNoYXIgdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9TIHZlcnNpb24gKi8KKyAgICB1bmNoYXIgc3VidmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9TIHN1YnZlcnNpb24gKi8KKyAgICB1c2hvcnQgcmV2aXNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldmlzaW9uICovCit9IGdkdGhfaW9jdGxfb3N2ZXJzOworCisvKiBHRFRJT0NUTF9DVFJUWVBFICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0IGlvbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVuY2hhciB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udHJvbGxlciB0eXBlICovCisgICAgdXNob3J0IGluZm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbG90IGV0Yy4gKi8KKyAgICB1c2hvcnQgb2VtX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9FTSBJRCAqLworICAgIHVzaG9ydCBiaW9zX3ZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICB1c2hvcnQgYWNjZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCB1c2VkICovCisgICAgdXNob3J0IGV4dF90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCB0eXBlICovCisgICAgdXNob3J0IGRldmljZV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXZpY2UgSUQgKi8KKyAgICB1c2hvcnQgc3ViX2RldmljZV9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YiBkZXZpY2UgSUQgKi8KK30gZ2R0aF9pb2N0bF9jdHJ0eXBlOworCisvKiBHRFRJT0NUTF9FVkVOVCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVzaG9ydCBpb25vZGU7CisgICAgaW50IGVyYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcmFzZSBldmVudD8gKi8KKyAgICBpbnQgaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW50IGhhbmRsZSAqLworICAgIGdkdGhfZXZ0X3N0ciBldmVudDsKK30gZ2R0aF9pb2N0bF9ldmVudDsKKworLyogR0RUSU9DVExfUkVTQ0FOL0dEVElPQ1RMX0hEUkxJU1QgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1c2hvcnQgaW9ub2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIgbnVtYmVyICovCisgICAgdW5jaGFyIGZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGQvcmVtb3ZlICovCisgICAgdXNob3J0IGhkcl9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcml2ZSBuby4gKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1bmNoYXIgYnVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBidXMgKi8KKyAgICAgICAgdW5jaGFyIHRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBJRCAqLworICAgICAgICB1bmNoYXIgbHVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFVOICovCisgICAgICAgIHVuY2hhciBjbHVzdGVyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAvKiBjbHVzdGVyIHByb3BlcnRpZXMgKi8KKyAgICB9IGhkcl9saXN0W01BWF9IRFJJVkVTXTsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGlzIGhvc3QgZHJpdmUgbnVtYmVyICovCit9IGdkdGhfaW9jdGxfcmVzY2FuOworCisvKiBHRFRJT0NUTF9SRVNFVF9CVVMvR0RUSU9DVExfUkVTRVRfRFJWICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdXNob3J0IGlvbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250cm9sbGVyIG51bWJlciAqLworICAgIHVzaG9ydCBudW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVzL2hvc3QgZHJpdmUgbnVtYmVyICovCisgICAgdXNob3J0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0dXMgKi8KK30gZ2R0aF9pb2N0bF9yZXNldDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aF9rY29tcGF0LmggYi9kcml2ZXJzL3Njc2kvZ2R0aF9rY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjZjBlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoX2tjb21wYXQuaApAQCAtMCwwICsxLDIxIEBACisKKworI2lmbmRlZiBJUlFfSEFORExFRAordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworI2RlZmluZSBJUlFfTk9ORQorI2RlZmluZSBJUlFfSEFORExFRAorI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFX0xJQ0VOU0UKKyNkZWZpbmUgTU9EVUxFX0xJQ0VOU0UoeCkKKyNlbmRpZgorCisjaWZuZGVmIFNFUlZJQ0VfQUNUSU9OX0lOCisjZGVmaW5lIFNFUlZJQ0VfQUNUSU9OX0lOCTB4OWUKKyNlbmRpZgorI2lmbmRlZiBSRUFEXzE2CisjZGVmaW5lIFJFQURfMTYJCQkweDg4CisjZW5kaWYKKyNpZm5kZWYgV1JJVEVfMTYKKyNkZWZpbmUgV1JJVEVfMTYJCTB4OGEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZDAyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmMKQEAgLTAsMCArMSwxMDMwIEBACisvKiBnZHRoX3Byb2MuYyAKKyAqICRJZDogZ2R0aF9wcm9jLmMsdiAxLjQyIDIwMDQvMDMvMDUgMTU6NTA6MjAgYWNoaW0gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQoraW50IGdkdGhfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlcixjaGFyICoqc3RhcnQsb2ZmX3Qgb2Zmc2V0LGludCBsZW5ndGgsICAgCisgICAgICAgICAgICAgICAgICAgaW50IGlub3V0KQoreworICAgIGludCBoYW51bSxidXNudW07CisKKyAgICBUUkFDRTIoKCJnZHRoX3Byb2NfaW5mbygpIGxlbmd0aCAlZCBvZmZzICVkIGlub3V0ICVkXG4iLAorICAgICAgICAgICAgbGVuZ3RoLChpbnQpb2Zmc2V0LGlub3V0KSk7CisKKyAgICBoYW51bSA9IE5VTURBVEEoaG9zdCktPmhhbnVtOworICAgIGJ1c251bT0gTlVNREFUQShob3N0KS0+YnVzbnVtOworCisgICAgaWYgKGlub3V0KQorICAgICAgICByZXR1cm4oZ2R0aF9zZXRfaW5mbyhidWZmZXIsbGVuZ3RoLGhvc3QsaGFudW0sYnVzbnVtKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oZ2R0aF9nZXRfaW5mbyhidWZmZXIsc3RhcnQsb2Zmc2V0LGxlbmd0aCxob3N0LGhhbnVtLGJ1c251bSkpOworfQorI2Vsc2UKK2ludCBnZHRoX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsY2hhciAqKnN0YXJ0LG9mZl90IG9mZnNldCxpbnQgbGVuZ3RoLGludCBob3N0bm8sICAgCisgICAgICAgICAgICAgICAgICAgaW50IGlub3V0KQoreworICAgIGludCBoYW51bSxidXNudW0saTsKKworICAgIFRSQUNFMigoImdkdGhfcHJvY19pbmZvKCkgbGVuZ3RoICVkIG9mZnMgJWQgaW5vdXQgJWRcbiIsCisgICAgICAgICAgICBsZW5ndGgsKGludClvZmZzZXQsaW5vdXQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnZHRoX2N0cl92Y291bnQ7ICsraSkgeworICAgICAgICBpZiAoZ2R0aF9jdHJfdnRhYltpXS0+aG9zdF9ubyA9PSBob3N0bm8pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gZ2R0aF9jdHJfdmNvdW50KQorICAgICAgICByZXR1cm4oLUVJTlZBTCk7CisKKyAgICBoYW51bSA9IE5VTURBVEEoZ2R0aF9jdHJfdnRhYltpXSktPmhhbnVtOworICAgIGJ1c251bT0gTlVNREFUQShnZHRoX2N0cl92dGFiW2ldKS0+YnVzbnVtOworCisgICAgaWYgKGlub3V0KQorICAgICAgICByZXR1cm4oZ2R0aF9zZXRfaW5mbyhidWZmZXIsbGVuZ3RoLGdkdGhfY3RyX3Z0YWJbaV0saGFudW0sYnVzbnVtKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oZ2R0aF9nZXRfaW5mbyhidWZmZXIsc3RhcnQsb2Zmc2V0LGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2R0aF9jdHJfdnRhYltpXSxoYW51bSxidXNudW0pKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdkdGhfc2V0X2luZm8oY2hhciAqYnVmZmVyLGludCBsZW5ndGgsc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFudW0saW50IGJ1c251bSkKK3sKKyAgICBpbnQgICAgICAgICAgICAgcmV0X3ZhbCA9IC1FSU5WQUw7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIFNjc2lfUmVxdWVzdCAgICAqc2NwOworICAgIFNjc2lfRGV2aWNlICAgICAqc2RldjsKKyNlbHNlCisgICAgU2NzaV9DbW5kICAgICAgICpzY3A7CisgICAgU2NzaV9EZXZpY2UgICAgICpzZGV2OworI2VuZGlmCisgICAgVFJBQ0UyKCgiZ2R0aF9zZXRfaW5mbygpIGhhICVkIGJ1cyAlZFxuIixoYW51bSxidXNudW0pKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzZGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYoaG9zdCk7CisgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZGV2LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgc2NwLT5zcl9jbWRfbGVuID0gMTI7CisgICAgc2NwLT5zcl91c2Vfc2cgPSAwOworI2Vsc2UKKyAgICBzZGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYoaG9zdCk7CisgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfZGV2aWNlKHNkZXYsIDEsIEZBTFNFKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgc2NwLT51c2Vfc2cgPSAwOworI2VuZGlmCisKKyAgICBpZiAobGVuZ3RoID49IDQpIHsKKyAgICAgICAgaWYgKHN0cm5jbXAoYnVmZmVyLCJnZHRoIiw0KSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXIgKz0gNTsKKyAgICAgICAgICAgIGxlbmd0aCAtPSA1OworICAgICAgICAgICAgcmV0X3ZhbCA9IGdkdGhfc2V0X2FzY19pbmZvKCBidWZmZXIsIGxlbmd0aCwgaGFudW0sIHNjcCApOworICAgICAgICB9CisgICAgfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzY3NpX3JlbGVhc2VfcmVxdWVzdChzY3ApOworICAgIHNjc2lfZnJlZV9ob3N0X2RldihzZGV2KTsKKyNlbHNlCisgICAgc2NzaV9yZWxlYXNlX2NvbW1hbmQoc2NwKTsKKyAgICBzY3NpX2ZyZWVfaG9zdF9kZXYoc2Rldik7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKyAgICAgICAgIAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKK3N0YXRpYyBpbnQgZ2R0aF9zZXRfYXNjX2luZm8oY2hhciAqYnVmZmVyLGludCBsZW5ndGgsaW50IGhhbnVtLFNjc2lfUmVxdWVzdCAqc2NwKQorI2Vsc2UKK3N0YXRpYyBpbnQgZ2R0aF9zZXRfYXNjX2luZm8oY2hhciAqYnVmZmVyLGludCBsZW5ndGgsaW50IGhhbnVtLFNjc2lfQ21uZCAqc2NwKQorI2VuZGlmCit7CisgICAgaW50ICAgICAgICAgICAgIG9yaWdfbGVuZ3RoLCBkcml2ZSwgd2JfbW9kZTsKKyAgICBpbnQgICAgICAgICAgICAgaSwgZm91bmQ7CisgICAgZ2R0aF9oYV9zdHIgICAgICpoYTsKKyAgICBnZHRoX2NtZF9zdHIgICAgZ2R0Y21kOworICAgIGdkdGhfY3Bhcl9zdHIgICAqcGNwYXI7CisgICAgdWxvbmc2NCAgICAgICAgIHBhZGRyOworCisgICAgY2hhciAgICAgICAgICAgIGNtbmRbTUFYX0NPTU1BTkRfU0laRV07CisgICAgbWVtc2V0KGNtbmQsIDB4ZmYsIDEyKTsKKyAgICBtZW1zZXQoJmdkdGNtZCwgMCwgc2l6ZW9mKGdkdGhfY21kX3N0cikpOworCisgICAgVFJBQ0UyKCgiZ2R0aF9zZXRfYXNjX2luZm8oKSBoYSAlZFxuIixoYW51bSkpOworICAgIGhhID0gSEFEQVRBKGdkdGhfY3RyX3RhYltoYW51bV0pOworICAgIG9yaWdfbGVuZ3RoID0gbGVuZ3RoICsgNTsKKyAgICBkcml2ZSA9IC0xOworICAgIHdiX21vZGUgPSAwOworICAgIGZvdW5kID0gRkFMU0U7CisKKyAgICBpZiAobGVuZ3RoID49IDUgJiYgc3RybmNtcChidWZmZXIsImZsdXNoIiw1KT09MCkgeworICAgICAgICBidWZmZXIgKz0gNjsKKyAgICAgICAgbGVuZ3RoIC09IDY7CisgICAgICAgIGlmIChsZW5ndGggJiYgKmJ1ZmZlcj49JzAnICYmICpidWZmZXI8PSc5JykgeworICAgICAgICAgICAgZHJpdmUgPSAoaW50KSgqYnVmZmVyLScwJyk7CisgICAgICAgICAgICArK2J1ZmZlcjsgLS1sZW5ndGg7CisgICAgICAgICAgICBpZiAobGVuZ3RoICYmICpidWZmZXI+PScwJyAmJiAqYnVmZmVyPD0nOScpIHsKKyAgICAgICAgICAgICAgICBkcml2ZSA9IGRyaXZlKjEwICsgKGludCkoKmJ1ZmZlci0nMCcpOworICAgICAgICAgICAgICAgICsrYnVmZmVyOyAtLWxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50aygiR0RUOiBGbHVzaGluZyBob3N0IGRyaXZlICVkIC4uICIsZHJpdmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRrKCJHRFQ6IEZsdXNoaW5nIGFsbCBob3N0IGRyaXZlcyAuLiAiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hEUklWRVM7ICsraSkgeworICAgICAgICAgICAgaWYgKGhhLT5oZHJbaV0ucHJlc2VudCkgeworICAgICAgICAgICAgICAgIGlmIChkcml2ZSAhPSAtMSAmJiBpICE9IGRyaXZlKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgZ2R0Y21kLlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgICAgICAgICAgZ2R0Y21kLk9wQ29kZSA9IEdEVF9GTFVTSDsKKyAgICAgICAgICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfNjRCSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGU2NC5EZXZpY2VObyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGdkdGNtZC51LmNhY2hlNjQuQmxvY2tObyA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2R0Y21kLnUuY2FjaGUuRGV2aWNlTm8gPSBpOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQudS5jYWNoZS5CbG9ja05vID0gMTsKKyAgICAgICAgICAgICAgICB9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgJmdkdGNtZCwgY21uZCwgMzApOworI2Vsc2UKKyAgICAgICAgICAgICAgICBnZHRoX2RvX2NtZChzY3AsICZnZHRjbWQsIGNtbmQsIDMwKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICBwcmludGsoIlxuTm8gaG9zdCBkcml2ZSBmb3VuZCAhXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRrKCJEb25lLlxuIik7CisgICAgICAgIHJldHVybihvcmlnX2xlbmd0aCk7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSA3ICYmIHN0cm5jbXAoYnVmZmVyLCJ3YnBfb2ZmIiw3KT09MCkgeworICAgICAgICBidWZmZXIgKz0gODsKKyAgICAgICAgbGVuZ3RoIC09IDg7CisgICAgICAgIHByaW50aygiR0RUOiBEaXNhYmxpbmcgd3JpdGUgYmFjayBwZXJtYW5lbnRseSAuLiAiKTsKKyAgICAgICAgd2JfbW9kZSA9IDE7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNiAmJiBzdHJuY21wKGJ1ZmZlciwid2JwX29uIiw2KT09MCkgeworICAgICAgICBidWZmZXIgKz0gNzsKKyAgICAgICAgbGVuZ3RoIC09IDc7CisgICAgICAgIHByaW50aygiR0RUOiBFbmFibGluZyB3cml0ZSBiYWNrIHBlcm1hbmVudGx5IC4uICIpOworICAgICAgICB3Yl9tb2RlID0gMjsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA2ICYmIHN0cm5jbXAoYnVmZmVyLCJ3Yl9vZmYiLDYpPT0wKSB7CisgICAgICAgIGJ1ZmZlciArPSA3OworICAgICAgICBsZW5ndGggLT0gNzsKKyAgICAgICAgcHJpbnRrKCJHRFQ6IERpc2FibGluZyB3cml0ZSBiYWNrIGNvbW1hbmRzIC4uICIpOworICAgICAgICBpZiAoaGEtPmNhY2hlX2ZlYXQgJiBHRFRfV1JfVEhST1VHSCkgeworICAgICAgICAgICAgZ2R0aF93cml0ZV90aHJvdWdoID0gVFJVRTsKKyAgICAgICAgICAgIHByaW50aygiRG9uZS5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRrKCJOb3Qgc3VwcG9ydGVkICFcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybihvcmlnX2xlbmd0aCk7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNSAmJiBzdHJuY21wKGJ1ZmZlciwid2Jfb24iLDUpPT0wKSB7CisgICAgICAgIGJ1ZmZlciArPSA2OworICAgICAgICBsZW5ndGggLT0gNjsKKyAgICAgICAgcHJpbnRrKCJHRFQ6IEVuYWJsaW5nIHdyaXRlIGJhY2sgY29tbWFuZHMgLi4gIik7CisgICAgICAgIGdkdGhfd3JpdGVfdGhyb3VnaCA9IEZBTFNFOworICAgICAgICBwcmludGsoIkRvbmUuXG4iKTsKKyAgICAgICAgcmV0dXJuKG9yaWdfbGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAod2JfbW9kZSkgeworICAgICAgICBpZiAoIWdkdGhfaW9jdGxfYWxsb2MoaGFudW0sIHNpemVvZihnZHRoX2NwYXJfc3RyKSwgVFJVRSwgJnBhZGRyKSkKKyAgICAgICAgICAgIHJldHVybigtRUJVU1kpOworICAgICAgICBwY3BhciA9IChnZHRoX2NwYXJfc3RyICopaGEtPnBzY3JhdGNoOworICAgICAgICBtZW1jcHkoIHBjcGFyLCAmaGEtPmNwYXIsIHNpemVvZihnZHRoX2NwYXJfc3RyKSApOworICAgICAgICBnZHRjbWQuU2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgZ2R0Y21kLk9wQ29kZSA9IEdEVF9JT0NUTDsKKyAgICAgICAgZ2R0Y21kLnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICBnZHRjbWQudS5pb2N0bC5wYXJhbV9zaXplID0gc2l6ZW9mKGdkdGhfY3Bhcl9zdHIpOworICAgICAgICBnZHRjbWQudS5pb2N0bC5zdWJmdW5jID0gQ0FDSEVfQ09ORklHOworICAgICAgICBnZHRjbWQudS5pb2N0bC5jaGFubmVsID0gSU5WQUxJRF9DSEFOTkVMOworICAgICAgICBwY3Bhci0+d3JpdGVfYmFjayA9IHdiX21vZGU9PTEgPyAwOjE7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICBnZHRoX2RvX3JlcShzY3AsICZnZHRjbWQsIGNtbmQsIDMwKTsKKyNlbHNlCisgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgJmdkdGNtZCwgY21uZCwgMzApOworI2VuZGlmCisgICAgICAgIGdkdGhfaW9jdGxfZnJlZShoYW51bSwgR0RUSF9TQ1JBVENILCBoYS0+cHNjcmF0Y2gsIHBhZGRyKTsKKyAgICAgICAgcHJpbnRrKCJEb25lLlxuIik7CisgICAgICAgIHJldHVybihvcmlnX2xlbmd0aCk7CisgICAgfQorCisgICAgcHJpbnRrKCJHRFQ6IFVua25vd24gY29tbWFuZDogJXMgIExlbmd0aDogJWRcbiIsYnVmZmVyLGxlbmd0aCk7CisgICAgcmV0dXJuKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW50IGdkdGhfZ2V0X2luZm8oY2hhciAqYnVmZmVyLGNoYXIgKipzdGFydCxvZmZfdCBvZmZzZXQsaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LGludCBoYW51bSxpbnQgYnVzbnVtKQoreworICAgIGludCBzaXplID0gMCxsZW4gPSAwOworICAgIG9mZl90IGJlZ2luID0gMCxwb3MgPSAwOworICAgIGdkdGhfaGFfc3RyICpoYTsKKyAgICBpbnQgaWQsIGksIGosIGssIHNlYywgZmxhZzsKKyAgICBpbnQgbm9fbWRydiA9IDAsIGRydl9ubywgaXNfbWlycjsKKyAgICB1bG9uZzMyIGNudDsKKyAgICB1bG9uZzY0IHBhZGRyOworICAgIGludCByYyA9IC1FTk9NRU07CisKKyAgICBnZHRoX2NtZF9zdHIgKmdkdGNtZDsKKyAgICBnZHRoX2V2dF9zdHIgKmVzdHI7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIFNjc2lfUmVxdWVzdCAqc2NwOworICAgIFNjc2lfRGV2aWNlICpzZGV2OyAKKyNlbHNlCisgICAgU2NzaV9DbW5kICpzY3A7CisgICAgU2NzaV9EZXZpY2UgKnNkZXY7CisjZW5kaWYKKyAgICBjaGFyIGhyZWNbMTYxXTsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgIGNoYXIgKmJ1ZjsKKyAgICBnZHRoX2Rza3N0YXRfc3RyICpwZHM7CisgICAgZ2R0aF9kaXNraW5mb19zdHIgKnBkaTsKKyAgICBnZHRoX2FycmF5aW5mX3N0ciAqcGFpOworICAgIGdkdGhfZGVmY250X3N0ciAqcGRlZjsKKyAgICBnZHRoX2NkcmluZm9fc3RyICpwY2RpOworICAgIGdkdGhfaGdldF9zdHIgKnBoZzsKKyAgICBjaGFyIGNtbmRbTUFYX0NPTU1BTkRfU0laRV07CisKKyAgICBnZHRjbWQgPSBrbWFsbG9jKHNpemVvZigqZ2R0Y21kKSwgR0ZQX0tFUk5FTCk7CisgICAgZXN0ciA9IGttYWxsb2Moc2l6ZW9mKCplc3RyKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFnZHRjbWQgfHwgIWVzdHIpCisJZ290byBmcmVlX2ZhaWw7CisKKyAgICBtZW1zZXQoY21uZCwgMHhmZiwgMTIpOworICAgIG1lbXNldChnZHRjbWQsIDAsIHNpemVvZihnZHRoX2NtZF9zdHIpKTsKKworICAgIFRSQUNFMigoImdkdGhfZ2V0X2luZm8oKSBoYSAlZCBidXMgJWRcbiIsaGFudW0sYnVzbnVtKSk7CisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgc2RldiA9IHNjc2lfZ2V0X2hvc3RfZGV2KGhvc3QpOworICAgIHNjcCAgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzY3ApCisgICAgICAgIGdvdG8gZnJlZV9mYWlsOworICAgIHNjcC0+c3JfY21kX2xlbiA9IDEyOworICAgIHNjcC0+c3JfdXNlX3NnID0gMDsKKyNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKyAgICBzZGV2ID0gc2NzaV9nZXRfaG9zdF9kZXYoaG9zdCk7CisgICAgc2NwICA9IHNjc2lfYWxsb2NhdGVfZGV2aWNlKHNkZXYsIDEsIEZBTFNFKTsKKyAgICBpZiAoIXNjcCkKKyAgICAgICAgZ290byBmcmVlX2ZhaWw7CisgICAgc2NwLT5jbWRfbGVuID0gMTI7CisgICAgc2NwLT51c2Vfc2cgPSAwOworI2Vsc2UKKyAgICBtZW1zZXQoJnNkZXYsMCxzaXplb2YoU2NzaV9EZXZpY2UpKTsKKyAgICBtZW1zZXQoJnNjcCwgMCxzaXplb2YoU2NzaV9DbW5kKSk7CisgICAgc2Rldi5ob3N0ID0gc2NwLmhvc3QgPSBob3N0OworICAgIHNkZXYuaWQgPSBzY3AudGFyZ2V0ID0gc2Rldi5ob3N0LT50aGlzX2lkOworICAgIHNjcC5kZXZpY2UgPSAmc2RldjsKKyNlbmRpZgorICAgIAorICAgIAorICAgIC8qIHJlcXVlc3QgaXMgaS5lLiAiY2F0IC9wcm9jL3Njc2kvZ2R0aC8wIiAqLyAKKyAgICAvKiBmb3JtYXQ6ICUtMTVzXHQlLTEwc1x0JS0xNXNcdCVzICovCisgICAgLyogZHJpdmVyIHBhcmFtZXRlcnMgKi8KKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCJEcml2ZXIgUGFyYW1ldGVyczpcbiIpOworICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgaWYgKHJlc2VydmVfbGlzdFswXSA9PSAweGZmKQorICAgICAgICBzdHJjcHkoaHJlYywgIi0tIik7CisgICAgZWxzZSB7CisgICAgICAgIHNwcmludGYoaHJlYywgIiVkIiwgcmVzZXJ2ZV9saXN0WzBdKTsKKyAgICAgICAgZm9yIChpID0gMTsgIGkgPCBNQVhfUkVTX0FSR1M7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlc2VydmVfbGlzdFtpXSA9PSAweGZmKSAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNwcmludGYoaHJlYywiJXMsJWQiLCBocmVjLCByZXNlcnZlX2xpc3RbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgIiByZXNlcnZlX21vZGU6IFx0JWQgICAgICAgICBcdHJlc2VydmVfbGlzdDogIFx0JXNcbiIsCisgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZV9tb2RlLCBocmVjKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgIiBtYXhfaWRzOiAgICAgIFx0JS0zZCAgICAgICBcdGhkcl9jaGFubmVsOiAgIFx0JWRcbiIsCisgICAgICAgICAgICAgICAgICAgbWF4X2lkcywgaGRyX2NoYW5uZWwpOworICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisKKyAgICAvKiBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiXG5EaXNrIEFycmF5IENvbnRyb2xsZXIgSW5mb3JtYXRpb246XG4iKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIGlmICh2aXJ0X2N0cikKKyAgICAgICAgc3ByaW50ZihocmVjLCAiJXMgKEJ1cyAlZCkiLCBoYS0+YmluZm8udHlwZV9zdHJpbmcsIGJ1c251bSk7CisgICAgZWxzZQorICAgICAgICBzdHJjcHkoaHJlYywgaGEtPmJpbmZvLnR5cGVfc3RyaW5nKTsKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICIgTnVtYmVyOiAgICAgICBcdCVkICAgICAgICAgXHROYW1lOiAgICAgICAgICBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgIGhhbnVtLCBocmVjKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworCisgICAgaWYgKGhhLT5tb3JlX3Byb2MpCisgICAgICAgIHNwcmludGYoaHJlYywgIiVkLiUwMmQuJTAyZC0lYyUwM1giLCAKKyAgICAgICAgICAgICAgICAodW5jaGFyKShoYS0+YmluZm8udXBkX2Z3X3Zlcj4+MjQpLAorICAgICAgICAgICAgICAgICh1bmNoYXIpKGhhLT5iaW5mby51cGRfZndfdmVyPj4xNiksCisgICAgICAgICAgICAgICAgKHVuY2hhcikoaGEtPmJpbmZvLnVwZF9md192ZXIpLAorICAgICAgICAgICAgICAgIGhhLT5iZmVhdC5yYWlkID8gJ1InOidOJywKKyAgICAgICAgICAgICAgICBoYS0+YmluZm8udXBkX3JldmlzaW9uKTsKKyAgICBlbHNlCisgICAgICAgIHNwcmludGYoaHJlYywgIiVkLiUwMmQiLCAodW5jaGFyKShoYS0+Y3Bhci52ZXJzaW9uPj44KSwKKyAgICAgICAgICAgICAgICAodW5jaGFyKShoYS0+Y3Bhci52ZXJzaW9uKSk7CisKKyAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICIgRHJpdmVyIFZlci46ICBcdCUtMTBzXHRGaXJtd2FyZSBWZXIuOiBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgIEdEVEhfVkVSU0lPTl9TVFIsIGhyZWMpOworICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgCisgICAgaWYgKGhhLT5tb3JlX3Byb2MpIHsKKyAgICAgICAgLyogbW9yZSBpbmZvcm1hdGlvbjogMS4gYWJvdXQgY29udHJvbGxlciAqLworICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAiIFNlcmlhbCBOby46ICAgXHQweCU4WFx0Q2FjaGUgUkFNIHNpemU6XHQlZCBLQlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGEtPmJpbmZvLnNlcl9ubywgaGEtPmJpbmZvLm1lbXNpemUgLyAxMDI0KTsKKyAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICB9CisKKyNpZmRlZiBHRFRIX0RNQV9TVEFUSVNUSUNTCisgICAgLyogY29udHJvbGxlciBzdGF0aXN0aWNzICovCisgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiXG5Db250cm9sbGVyIFN0YXRpc3RpY3M6XG4iKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgIiAzMi1iaXQgRE1BIGJ1ZmZlcjpcdCVsdVx0NjQtYml0IERNQSBidWZmZXI6XHQlbHVcbiIsCisgICAgICAgICAgICAgICAgICAgaGEtPmRtYTMyX2NudCwgaGEtPmRtYTY0X2NudCk7CisgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyNlbmRpZgorCisgICAgaWYgKHBvcyA8IG9mZnNldCkgeworICAgICAgICBsZW4gPSAwOworICAgICAgICBiZWdpbiA9IHBvczsKKyAgICB9CisgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgZ290byBzdG9wX291dHB1dDsKKworICAgIGlmIChoYS0+bW9yZV9wcm9jKSB7CisgICAgICAgIC8qIG1vcmUgaW5mb3JtYXRpb246IDIuIGFib3V0IHBoeXNpY2FsIGRldmljZXMgKi8KKyAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiXG5QaHlzaWNhbCBEZXZpY2VzOiIpOworICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICBmbGFnID0gRkFMU0U7CisgICAgICAgICAgICAKKyAgICAgICAgYnVmID0gZ2R0aF9pb2N0bF9hbGxvYyhoYW51bSwgR0RUSF9TQ1JBVENILCBGQUxTRSwgJnBhZGRyKTsKKyAgICAgICAgaWYgKCFidWYpIAorICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhhLT5idXNfY250OyArK2kpIHsKKyAgICAgICAgICAgIC8qIDIuYSBzdGF0aXN0aWNzIChhbmQgcmV0cmllcy9yZWFzc2lnbnMpICovCisgICAgICAgICAgICBUUkFDRTIoKCJwZHJfc3RhdGlzdGljcygpIGNobiAlZFxuIixpKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcGRzID0gKGdkdGhfZHNrc3RhdF9zdHIgKikoYnVmICsgR0RUSF9TQ1JBVENILzQpOworICAgICAgICAgICAgZ2R0Y21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgZ2R0Y21kLT5PcENvZGUgPSBHRFRfSU9DVEw7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyICsgR0RUSF9TQ1JBVENILzQ7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucGFyYW1fc2l6ZSA9IDMqR0RUSF9TQ1JBVENILzQ7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuc3ViZnVuYyA9IERTS19TVEFUSVNUSUNTIHwgTF9DVFJMX1BBVFRFUk47CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuY2hhbm5lbCA9IGhhLT5yYXdbaV0uYWRkcmVzcyB8IElOVkFMSURfQ0hBTk5FTDsKKyAgICAgICAgICAgIHBkcy0+YmlkID0gaGEtPnJhd1tpXS5sb2NhbF9ubzsKKyAgICAgICAgICAgIHBkcy0+Zmlyc3QgPSAwOworICAgICAgICAgICAgcGRzLT5lbnRyaWVzID0gaGEtPnJhd1tpXS5wZGV2X2NudDsKKyAgICAgICAgICAgIGNudCA9ICgzKkdEVEhfU0NSQVRDSC80IC0gNSAqIHNpemVvZih1bG9uZzMyKSkgLworICAgICAgICAgICAgICAgIHNpemVvZihwZHMtPmxpc3RbMF0pOworICAgICAgICAgICAgaWYgKHBkcy0+ZW50cmllcyA+IGNudCkKKyAgICAgICAgICAgICAgICBwZHMtPmVudHJpZXMgPSBjbnQ7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgZ2R0aF9kb19yZXEoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgIGlmIChzY3AtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXMgIT0gU19PSykgCisjZWxzZQorICAgICAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgIGlmIChzY3AtPlNDcC5TdGF0dXMgIT0gU19PSykgCisjZW5kaWYKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgcGRzLT5jb3VudCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG90aGVyIElPQ1RMcyBtdXN0IGZpdCBpbnRvIGFyZWEgR0RUSF9TQ1JBVENILzQgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYS0+cmF3W2ldLnBkZXZfY250OyArK2opIHsKKyAgICAgICAgICAgICAgICAvKiAyLmIgZHJpdmUgaW5mbyAqLworICAgICAgICAgICAgICAgIFRSQUNFMigoInNjc2lfZHJ2X2luZm8oKSBjaG4gJWQgZGV2ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBpLCBoYS0+cmF3W2ldLmlkX2xpc3Rbal0pKTsgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcGRpID0gKGdkdGhfZGlza2luZm9fc3RyICopYnVmOworICAgICAgICAgICAgICAgIGdkdGNtZC0+U2VydmljZSA9IENBQ0hFU0VSVklDRTsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPk9wQ29kZSA9IEdEVF9JT0NUTDsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5wYXJhbV9zaXplID0gc2l6ZW9mKGdkdGhfZGlza2luZm9fc3RyKTsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuc3ViZnVuYyA9IFNDU0lfRFJfSU5GTyB8IExfQ1RSTF9QQVRURVJOOworICAgICAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5jaGFubmVsID0gCisgICAgICAgICAgICAgICAgICAgIGhhLT5yYXdbaV0uYWRkcmVzcyB8IGhhLT5yYXdbaV0uaWRfbGlzdFtqXTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICAgICAgZ2R0aF9kb19yZXEoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzID09IFNfT0spIAorI2Vsc2UKKyAgICAgICAgICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGdkdGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgICAgIGlmIChzY3AtPlNDcC5TdGF0dXMgPT0gU19PSykgCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoaHJlYyxwZGktPnZlbmRvciw4KTsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweShocmVjKzgscGRpLT5wcm9kdWN0LDE2KTsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweShocmVjKzI0LHBkaS0+cmV2aXNpb24sNCk7CisgICAgICAgICAgICAgICAgICAgIGhyZWNbMjhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIENobi9JRC9MVU46ICAgXHQlYy8lMDJkLyVkICAgIFx0TmFtZTogICAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnK2kscGRpLT50YXJnZXRfaWQscGRpLT5sdW4saHJlYyk7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwZGktPm5vX2xkcml2ZSAmPSAweGZmZmY7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZGktPm5vX2xkcml2ZSA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywiLS0iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihocmVjLCIlZCIscGRpLT5ub19sZHJpdmUpOworICAgICAgICAgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENhcGFjaXR5IFtNQl06XHQlLTZkICAgIFx0VG8gTG9nLiBEcml2ZTogXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRpLT5ibGtjbnQvKDEwMjQqMTAyNC9wZGktPmJsa3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVjKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwZGktPmRldnR5cGUgPSAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHBkaS0+ZGV2dHlwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlYXJjaCByZXRyaWVzL3JlYXNzaWducyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcGRzLT5jb3VudDsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGRzLT5saXN0W2tdLnRpZCA9PSBwZGktPnRhcmdldF9pZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcy0+bGlzdFtrXS5sdW4gPT0gcGRpLT5sdW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUmV0cmllczogICAgICBcdCUtNmQgICAgXHRSZWFzc2lnbnM6ICAgICBcdCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcy0+bGlzdFtrXS5yZXRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcy0+bGlzdFtrXS5yZWFzc2lnbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogMi5jIGdyb3duIGRlZmVjdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UyKCgic2NzaV9kcnZfZGVmY250KCkgY2huICVkIGRldiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBoYS0+cmF3W2ldLmlkX2xpc3Rbal0pKTsgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBkZWYgPSAoZ2R0aF9kZWZjbnRfc3RyICopYnVmOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgICAgICAgICAgICAgIGdkdGNtZC0+T3BDb2RlID0gR0RUX0lPQ1RMOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucGFyYW1fc2l6ZSA9IHNpemVvZihnZHRoX2RlZmNudF9zdHIpOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuc3ViZnVuYyA9IFNDU0lfREVGX0NOVCB8IExfQ1RSTF9QQVRURVJOOworICAgICAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuY2hhbm5lbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgaGEtPnJhd1tpXS5hZGRyZXNzIHwgaGEtPnJhd1tpXS5pZF9saXN0W2pdOworICAgICAgICAgICAgICAgICAgICBwZGVmLT5zZGRjX3R5cGUgPSAweDA4OworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgICAgICAgICAgZ2R0aF9kb19yZXEoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjcC0+c3JfY29tbWFuZC0+U0NwLlN0YXR1cyA9PSBTX09LKSAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3AtPlNDcC5TdGF0dXMgPT0gU19PSykgCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgR3Jvd24gRGVmZWN0czpcdCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRlZi0+c2RkY19jbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdkdGhfaW9jdGxfZnJlZShoYW51bSwgR0RUSF9TQ1JBVENILCBidWYsIHBhZGRyKTsKKworICAgICAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcbiAtLVxuIik7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICB9CisKKyAgICAgICAgLyogMy4gYWJvdXQgbG9naWNhbCBkcml2ZXMgKi8KKyAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwiXG5Mb2dpY2FsIERyaXZlczoiKTsKKyAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgZmxhZyA9IEZBTFNFOworCisgICAgICAgIGJ1ZiA9IGdkdGhfaW9jdGxfYWxsb2MoaGFudW0sIEdEVEhfU0NSQVRDSCwgRkFMU0UsICZwYWRkcik7CisgICAgICAgIGlmICghYnVmKSAKKyAgICAgICAgICAgIGdvdG8gc3RvcF9vdXRwdXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTERSSVZFUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWhhLT5oZHJbaV0uaXNfbG9nZHJ2KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZHJ2X25vID0gaTsKKyAgICAgICAgICAgIGogPSBrID0gMDsKKyAgICAgICAgICAgIGlzX21pcnIgPSBGQUxTRTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAvKiAzLmEgbG9nLiBkcml2ZSBpbmZvICovCisgICAgICAgICAgICAgICAgVFJBQ0UyKCgiY2FjaGVfZHJ2X2luZm8oKSBkcml2ZSBubyAlZFxuIixkcnZfbm8pKTsKKyAgICAgICAgICAgICAgICBwY2RpID0gKGdkdGhfY2RyaW5mb19zdHIgKilidWY7CisgICAgICAgICAgICAgICAgZ2R0Y21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgICAgIGdkdGNtZC0+T3BDb2RlID0gR0RUX0lPQ1RMOworICAgICAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5wX3BhcmFtID0gcGFkZHI7CisgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBhcmFtX3NpemUgPSBzaXplb2YoZ2R0aF9jZHJpbmZvX3N0cik7CisgICAgICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnN1YmZ1bmMgPSBDQUNIRV9EUlZfSU5GTzsKKyAgICAgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuY2hhbm5lbCA9IGRydl9ubzsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgICAgICAgICAgICAgZ2R0aF9kb19yZXEoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2NwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzICE9IFNfT0spIAorI2Vsc2UKKyAgICAgICAgICAgICAgICBnZHRoX2RvX2NtZChzY3AsIGdkdGNtZCwgY21uZCwgMzApOworICAgICAgICAgICAgICAgIGlmIChzY3AtPlNDcC5TdGF0dXMgIT0gU19PSykKKyNlbmRpZgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBjZGktPmxkX2R0eXBlID4+PSAxNjsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgaWYgKHBjZGktPmxkX2R0eXBlID4gMikgeworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIm1pc3NpbmciKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBjZGktPmxkX2Vycm9yICYgMSkgeworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgImZhdWx0Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2RpLT5sZF9lcnJvciAmIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJpbnZhbGlkIik7CisgICAgICAgICAgICAgICAgICAgIGsrKzsgai0tOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAib2siKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChkcnZfbm8gPT0gaSkgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gTnVtYmVyOiAgICAgICBcdCUtMmQgICAgICAgIFx0U3RhdHVzOiAgICAgICAgXHQlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ2X25vLCBocmVjKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIG5vX21kcnYgPSBwY2RpLT5jZF9sZGNudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vX21kcnYgPiAxIHx8IHBjZGktPmxkX3NsYXZlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc19taXJyID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiUkFJRC0xIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGNkaS0+bGRfZHR5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJEaXNrIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGNkaS0+bGRfZHR5cGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJSQUlELTAiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2RpLT5sZF9kdHlwZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIkNoYWluIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIj8/PyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ2FwYWNpdHkgW01CXTpcdCUtNmQgICAgXHRUeXBlOiAgICAgICAgICBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2RpLT5sZF9ibGtjbnQvKDEwMjQqMTAyNC9wY2RpLT5sZF9ibGtzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlYyk7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBTbGF2ZSBOdW1iZXI6IFx0JS0yZCAgICAgICAgXHRTdGF0dXM6ICAgICAgICBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnZfbm8gJiAweDdmZmYsIGhyZWMpOworICAgICAgICAgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcnZfbm8gPSBwY2RpLT5sZF9zbGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICAgICAgfSB3aGlsZSAoZHJ2X25vICE9IC0xKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpc19taXJyKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE1pc3NpbmcgRHJ2LjogXHQlLTJkICAgICAgICBcdEludmFsaWQgRHJ2LjogIFx0JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fbWRydiAtIGogLSBrLCBrKTsKKyAgICAgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghaGEtPmhkcltpXS5pc19hcnJheWRydikKKyAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIi0tIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihocmVjLCAiJWQiLCBoYS0+aGRyW2ldLm1hc3Rlcl9ubyk7CisgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUbyBBcnJheSBEcnYuOlx0JXNcbiIsIGhyZWMpOworICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICB9ICAgICAgIAorICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIEdEVEhfU0NSQVRDSCwgYnVmLCBwYWRkcik7CisgICAgICAgIAorICAgICAgICBpZiAoIWZsYWcpIHsKKyAgICAgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcbiAtLVxuIik7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICB9ICAgCisKKyAgICAgICAgLyogNC4gYWJvdXQgYXJyYXkgZHJpdmVzICovCisgICAgICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlxuQXJyYXkgRHJpdmVzOiIpOworICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICBmbGFnID0gRkFMU0U7CisKKyAgICAgICAgYnVmID0gZ2R0aF9pb2N0bF9hbGxvYyhoYW51bSwgR0RUSF9TQ1JBVENILCBGQUxTRSwgJnBhZGRyKTsKKyAgICAgICAgaWYgKCFidWYpIAorICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MRFJJVkVTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghKGhhLT5oZHJbaV0uaXNfYXJyYXlkcnYgJiYgaGEtPmhkcltpXS5pc19tYXN0ZXIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLyogNC5hIGFycmF5IGRyaXZlIGluZm8gKi8KKyAgICAgICAgICAgIFRSQUNFMigoImFycmF5X2luZm8oKSBkcml2ZSBubyAlZFxuIixpKSk7CisgICAgICAgICAgICBwYWkgPSAoZ2R0aF9hcnJheWluZl9zdHIgKilidWY7CisgICAgICAgICAgICBnZHRjbWQtPlNlcnZpY2UgPSBDQUNIRVNFUlZJQ0U7CisgICAgICAgICAgICBnZHRjbWQtPk9wQ29kZSA9IEdEVF9JT0NUTDsKKyAgICAgICAgICAgIGdkdGNtZC0+dS5pb2N0bC5wX3BhcmFtID0gcGFkZHI7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucGFyYW1fc2l6ZSA9IHNpemVvZihnZHRoX2FycmF5aW5mX3N0cik7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuc3ViZnVuYyA9IEFSUkFZX0lORk8gfCBMQV9DVFJMX1BBVFRFUk47CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuY2hhbm5lbCA9IGk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgICAgICAgICAgZ2R0aF9kb19yZXEoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgIGlmIChzY3AtPnNyX2NvbW1hbmQtPlNDcC5TdGF0dXMgPT0gU19PSykgCisjZWxzZQorICAgICAgICAgICAgZ2R0aF9kb19jbWQoc2NwLCBnZHRjbWQsIGNtbmQsIDMwKTsKKyAgICAgICAgICAgIGlmIChzY3AtPlNDcC5TdGF0dXMgPT0gU19PSykgCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFpLT5haV9zdGF0ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgImlkbGUiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX3N0YXRlID09IDIpCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiYnVpbGQiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX3N0YXRlID09IDQpCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAicmVhZHkiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX3N0YXRlID09IDYpCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiZmFpbCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhaS0+YWlfc3RhdGUgPT0gOCB8fCBwYWktPmFpX3N0YXRlID09IDEwKQorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgInJlYnVpbGQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShocmVjLCAiZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBpZiAocGFpLT5haV9leHRfc3RhdGUgJiAweDEwKQorICAgICAgICAgICAgICAgICAgICBzdHJjYXQoaHJlYywgIi9leHBhbmQiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX2V4dF9zdGF0ZSAmIDB4MSkKKyAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGhyZWMsICIvcGF0Y2giKTsKKyAgICAgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiBOdW1iZXI6ICAgICAgIFx0JS0yZCAgICAgICAgXHRTdGF0dXM6ICAgICAgICBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksaHJlYyk7CisgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgICAgICBmbGFnID0gVFJVRTsKKworICAgICAgICAgICAgICAgIGlmIChwYWktPmFpX3R5cGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJSQUlELTAiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX3R5cGUgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJSQUlELTQiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWktPmFpX3R5cGUgPT0gNSkKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGhyZWMsICJSQUlELTUiKTsKKyAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICBzdHJjcHkoaHJlYywgIlJBSUQtMTAiKTsKKyAgICAgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ2FwYWNpdHkgW01CXTpcdCUtNmQgICAgXHRUeXBlOiAgICAgICAgICBcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfc2l6ZS8oMTAyNCoxMDI0L3BhaS0+YWlfc2Vjc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlYyk7CisgICAgICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdkdGhfaW9jdGxfZnJlZShoYW51bSwgR0RUSF9TQ1JBVENILCBidWYsIHBhZGRyKTsKKyAgICAgICAgCisgICAgICAgIGlmICghZmxhZykgeworICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwgIlxuIC0tXG4iKTsKKyAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgIH0KKworICAgICAgICAvKiA1LiBhYm91dCBob3N0IGRyaXZlcyAqLworICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCJcbkhvc3QgRHJpdmVzOiIpOworICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICBmbGFnID0gRkFMU0U7CisKKyAgICAgICAgYnVmID0gZ2R0aF9pb2N0bF9hbGxvYyhoYW51bSwgc2l6ZW9mKGdkdGhfaGdldF9zdHIpLCBGQUxTRSwgJnBhZGRyKTsKKyAgICAgICAgaWYgKCFidWYpIAorICAgICAgICAgICAgZ290byBzdG9wX291dHB1dDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MRFJJVkVTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghaGEtPmhkcltpXS5pc19sb2dkcnYgfHwgCisgICAgICAgICAgICAgICAgKGhhLT5oZHJbaV0uaXNfYXJyYXlkcnYgJiYgIWhhLT5oZHJbaV0uaXNfbWFzdGVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8qIDUuYSBnZXQgaG9zdCBkcml2ZSBsaXN0ICovCisgICAgICAgICAgICBUUkFDRTIoKCJob3N0X2dldCgpIGRydl9ubyAlZFxuIixpKSk7ICAgICAgICAgICAKKyAgICAgICAgICAgIHBoZyA9IChnZHRoX2hnZXRfc3RyICopYnVmOworICAgICAgICAgICAgZ2R0Y21kLT5TZXJ2aWNlID0gQ0FDSEVTRVJWSUNFOworICAgICAgICAgICAgZ2R0Y21kLT5PcENvZGUgPSBHRFRfSU9DVEw7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwucF9wYXJhbSA9IHBhZGRyOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLnBhcmFtX3NpemUgPSBzaXplb2YoZ2R0aF9oZ2V0X3N0cik7CisgICAgICAgICAgICBnZHRjbWQtPnUuaW9jdGwuc3ViZnVuYyA9IEhPU1RfR0VUIHwgTEFfQ1RSTF9QQVRURVJOOworICAgICAgICAgICAgZ2R0Y21kLT51LmlvY3RsLmNoYW5uZWwgPSBpOworICAgICAgICAgICAgcGhnLT5lbnRyaWVzID0gTUFYX0hEUklWRVM7CisgICAgICAgICAgICBwaGctPm9mZnNldCA9IEdEVE9GRlNPRihnZHRoX2hnZXRfc3RyLCBlbnRyeVswXSk7IAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAgICAgICAgIGdkdGhfZG9fcmVxKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5zcl9jb21tYW5kLT5TQ3AuU3RhdHVzICE9IFNfT0spIAorI2Vsc2UKKyAgICAgICAgICAgIGdkdGhfZG9fY21kKHNjcCwgZ2R0Y21kLCBjbW5kLCAzMCk7CisgICAgICAgICAgICBpZiAoc2NwLT5TQ3AuU3RhdHVzICE9IFNfT0spIAorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGEtPmhkcltpXS5sZHJfbm8gPSBpOworICAgICAgICAgICAgICAgIGhhLT5oZHJbaV0ucndfYXR0cmlicyA9IDA7CisgICAgICAgICAgICAgICAgaGEtPmhkcltpXS5zdGFydF9zZWMgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGhnLT5lbnRyaWVzOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgayA9IHBoZy0+ZW50cnlbal0uaG9zdF9kcml2ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgPj0gTUFYX0xEUklWRVMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltrXS5sZHJfbm8gPSBwaGctPmVudHJ5W2pdLmxvZ19kcml2ZTsKKyAgICAgICAgICAgICAgICAgICAgaGEtPmhkcltrXS5yd19hdHRyaWJzID0gcGhnLT5lbnRyeVtqXS5yd19hdHRyaWJzOworICAgICAgICAgICAgICAgICAgICBoYS0+aGRyW2tdLnN0YXJ0X3NlYyA9IHBoZy0+ZW50cnlbal0uc3RhcnRfc2VjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnZHRoX2lvY3RsX2ZyZWUoaGFudW0sIHNpemVvZihnZHRoX2hnZXRfc3RyKSwgYnVmLCBwYWRkcik7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9IRFJJVkVTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghKGhhLT5oZHJbaV0ucHJlc2VudCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiBOdW1iZXI6ICAgICAgIFx0JS0yZCAgICAgICAgXHRBcnIvTG9nLiBEcml2ZTpcdCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaGEtPmhkcltpXS5sZHJfbm8pOworICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgIGZsYWcgPSBUUlVFOworCisgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDYXBhY2l0eSBbTUJdOlx0JS02ZCAgICBcdFN0YXJ0IFNlY3RvcjogIFx0JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWxvbmczMikoaGEtPmhkcltpXS5zaXplLzIwNDgpLCBoYS0+aGRyW2ldLnN0YXJ0X3NlYyk7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgYmVnaW4gPSBwb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorICAgICAgICAgICAgICAgIGdvdG8gc3RvcF9vdXRwdXQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghZmxhZykgeworICAgICAgICAgICAgc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwgIlxuIC0tXG4iKTsKKyAgICAgICAgICAgIGxlbiArPSBzaXplOyAgcG9zID0gYmVnaW4gKyBsZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb250cm9sbGVyIGV2ZW50cyAqLworICAgIHNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlxuQ29udHJvbGxlciBFdmVudHM6XG4iKTsKKyAgICBsZW4gKz0gc2l6ZTsgIHBvcyA9IGJlZ2luICsgbGVuOworCisgICAgZm9yIChpZCA9IC0xOzspIHsKKyAgICAgICAgaWQgPSBnZHRoX3JlYWRfZXZlbnQoaGEsIGlkLCBlc3RyKTsKKyAgICAgICAgaWYgKGVzdHItPmV2ZW50X3NvdXJjZSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChlc3RyLT5ldmVudF9kYXRhLmV1LmRyaXZlci5pb25vZGUgPT0gaGFudW0gJiYKKyAgICAgICAgICAgIGVzdHItPmV2ZW50X3NvdXJjZSA9PSBFU19BU1lOQykgeyAKKyAgICAgICAgICAgIGdkdGhfbG9nX2V2ZW50KCZlc3RyLT5ldmVudF9kYXRhLCBocmVjKTsKKyAgICAgICAgICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOworICAgICAgICAgICAgc2VjID0gKGludCkodHYudHZfc2VjIC0gZXN0ci0+Zmlyc3Rfc3RhbXApOworICAgICAgICAgICAgaWYgKHNlYyA8IDApIHNlYyA9IDA7CisgICAgICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIrbGVuLCIgZGF0ZS0gJTAyZDolMDJkOiUwMmRcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjLzM2MDAsIHNlYyUzNjAwLzYwLCBzZWMlNjAsIGhyZWMpOworICAgICAgICAgICAgbGVuICs9IHNpemU7ICBwb3MgPSBiZWdpbiArIGxlbjsKKyAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgIGJlZ2luID0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+IG9mZnNldCArIGxlbmd0aCkKKyAgICAgICAgICAgICAgICBnb3RvIHN0b3Bfb3V0cHV0OworICAgICAgICB9CisgICAgICAgIGlmIChpZCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworc3RvcF9vdXRwdXQ6CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNjcCk7CisgICAgc2NzaV9mcmVlX2hvc3RfZGV2KHNkZXYpOworI2Vsc2UKKyAgICBzY3NpX3JlbGVhc2VfY29tbWFuZChzY3ApOworICAgIHNjc2lfZnJlZV9ob3N0X2RldihzZGV2KTsKKyNlbmRpZgorICAgICpzdGFydCA9IGJ1ZmZlciArKG9mZnNldC1iZWdpbik7CisgICAgbGVuIC09IChvZmZzZXQtYmVnaW4pOworICAgIGlmIChsZW4gPiBsZW5ndGgpCisgICAgICAgIGxlbiA9IGxlbmd0aDsKKyAgICBUUkFDRTIoKCJnZXRfaW5mbygpIGxlbiAlZCBwb3MgJWQgYmVnaW4gJWQgb2Zmc2V0ICVkIGxlbmd0aCAlZCBzaXplICVkXG4iLAorICAgICAgICAgICAgbGVuLChpbnQpcG9zLChpbnQpYmVnaW4sKGludClvZmZzZXQsbGVuZ3RoLHNpemUpKTsKKyAgICByYyA9IGxlbjsKKworZnJlZV9mYWlsOgorICAgIGtmcmVlKGdkdGNtZCk7CisgICAga2ZyZWUoZXN0cik7CisgICAgcmV0dXJuIHJjOworfQorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgdm9pZCBnZHRoX2RvX3JlcShTY3NpX1JlcXVlc3QgKnNjcCwgZ2R0aF9jbWRfc3RyICpnZHRjbWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21uZCwgaW50IHRpbWVvdXQpCit7CisgICAgdW5zaWduZWQgYnVmZmxlbjsKKyAgICBERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisKKyAgICBUUkFDRTIoKCJnZHRoX2RvX3JlcSgpXG4iKSk7CisgICAgaWYgKGdkdGNtZCAhPSBOVUxMKSB7IAorICAgICAgICBidWZmbGVuID0gc2l6ZW9mKGdkdGhfY21kX3N0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmxlbiA9IDA7CisgICAgfQorICAgIHNjcC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9CVVNZOworICAgIHNjcC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9ICZ3YWl0OworICAgIHNjc2lfZG9fcmVxKHNjcCwgY21uZCwgZ2R0Y21kLCBidWZmbGVuLCBnZHRoX3Njc2lfZG9uZSwgdGltZW91dCpIWiwgMSk7CisgICAgd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7Cit9CisKKyNlbHNlCitzdGF0aWMgdm9pZCBnZHRoX2RvX2NtZChTY3NpX0NtbmQgKnNjcCwgZ2R0aF9jbWRfc3RyICpnZHRjbWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21uZCwgaW50IHRpbWVvdXQpCit7CisgICAgdW5zaWduZWQgYnVmZmxlbjsKKyAgICBERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisKKyAgICBUUkFDRTIoKCJnZHRoX2RvX2NtZCgpXG4iKSk7CisgICAgaWYgKGdkdGNtZCAhPSBOVUxMKSB7IAorICAgICAgICBzY3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gSU9DVExfUFJJOworICAgICAgICBidWZmbGVuID0gc2l6ZW9mKGdkdGhfY21kX3N0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2NwLT5TQ3AudGhpc19yZXNpZHVhbCA9IERFRkFVTFRfUFJJOworICAgICAgICBidWZmbGVuID0gMDsKKyAgICB9CisKKyAgICBzY3AtPnJlcXVlc3QucnFfc3RhdHVzID0gUlFfU0NTSV9CVVNZOworICAgIHNjcC0+cmVxdWVzdC53YWl0aW5nID0gJndhaXQ7CisgICAgc2NzaV9kb19jbWQoc2NwLCBjbW5kLCBnZHRjbWQsIGJ1ZmZsZW4sIGdkdGhfc2NzaV9kb25lLCB0aW1lb3V0KkhaLCAxKTsKKyAgICB3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKK30KKyNlbmRpZgorCit2b2lkIGdkdGhfc2NzaV9kb25lKFNjc2lfQ21uZCAqc2NwKQoreworICAgIFRSQUNFMigoImdkdGhfc2NzaV9kb25lKClcbiIpKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICBzY3AtPnJlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfRE9ORTsKKyAgICBpZiAoc2NwLT5yZXF1ZXN0LT53YWl0aW5nICE9IE5VTEwpCisgICAgICAgIGNvbXBsZXRlKHNjcC0+cmVxdWVzdC0+d2FpdGluZyk7CisjZWxzZQorICAgIHNjcC0+cmVxdWVzdC5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CisgICAgaWYgKHNjcC0+cmVxdWVzdC53YWl0aW5nICE9IE5VTEwpCisgICAgICAgIGNvbXBsZXRlKHNjcC0+cmVxdWVzdC53YWl0aW5nKTsKKyNlbmRpZgorfQorCitzdGF0aWMgY2hhciAqZ2R0aF9pb2N0bF9hbGxvYyhpbnQgaGFudW0sIGludCBzaXplLCBpbnQgc2NyYXRjaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bG9uZzY0ICpwYWRkcikKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgY2hhciAqcmV0X3ZhbDsKKworICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgaWYgKCFoYS0+c2NyYXRjaF9idXN5ICYmIHNpemUgPD0gR0RUSF9TQ1JBVENIKSB7CisgICAgICAgIGhhLT5zY3JhdGNoX2J1c3kgPSBUUlVFOworICAgICAgICByZXRfdmFsID0gaGEtPnBzY3JhdGNoOworICAgICAgICAqcGFkZHIgPSBoYS0+c2NyYXRjaF9waHlzOworICAgIH0gZWxzZSBpZiAoc2NyYXRjaCkgeworICAgICAgICByZXRfdmFsID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBkbWFfYWRkcl90IGRtYV9hZGRyOworCisgICAgICAgIHJldF92YWwgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwgc2l6ZSwgJmRtYV9hZGRyKTsKKyAgICAgICAgKnBhZGRyID0gZG1hX2FkZHI7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyB2b2lkIGdkdGhfaW9jdGxfZnJlZShpbnQgaGFudW0sIGludCBzaXplLCBjaGFyICpidWYsIHVsb25nNjQgcGFkZHIpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgaWYgKGJ1ZiA9PSBoYS0+cHNjcmF0Y2gpIHsKKyAgICAgICAgaGEtPnNjcmF0Y2hfYnVzeSA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsIHNpemUsIGJ1ZiwgcGFkZHIpOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworfQorCisjaWZkZWYgR0RUSF9JT0NUTF9QUk9DCitzdGF0aWMgaW50IGdkdGhfaW9jdGxfY2hlY2tfYmluKGludCBoYW51bSwgdXNob3J0IHNpemUpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIGludCByZXRfdmFsOworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0X3ZhbCA9IEZBTFNFOworICAgIGlmIChoYS0+c2NyYXRjaF9idXN5KSB7CisgICAgICAgIGlmICgoKGdkdGhfaW9yZF9zdHIgKiloYS0+cHNjcmF0Y2gpLT5zaXplID09ICh1bG9uZzMyKXNpemUpCisgICAgICAgICAgICByZXRfdmFsID0gVFJVRTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIHJldF92YWw7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2R0aF93YWl0X2NvbXBsZXRpb24oaW50IGhhbnVtLCBpbnQgYnVzbnVtLCBpbnQgaWQpCit7CisgICAgZ2R0aF9oYV9zdHIgKmhhOworICAgIHVsb25nIGZsYWdzOworICAgIGludCBpOworICAgIFNjc2lfQ21uZCAqc2NwOworICAgIHVuY2hhciBiLCB0OworCisgICAgaGEgPSBIQURBVEEoZ2R0aF9jdHJfdGFiW2hhbnVtXSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdEVEhfTUFYQ01EUzsgKytpKSB7CisgICAgICAgIHNjcCA9IGhhLT5jbWRfdGFiW2ldLmNtbmQ7CisKKyAgICAgICAgYiA9IHZpcnRfY3RyID8gTlVNREFUQShzY3AtPmRldmljZS0+aG9zdCktPmJ1c251bSA6IHNjcC0+ZGV2aWNlLT5jaGFubmVsOworICAgICAgICB0ID0gc2NwLT5kZXZpY2UtPmlkOworICAgICAgICBpZiAoIVNQRUNJQUxfU0NQKHNjcCkgJiYgdCA9PSAodW5jaGFyKWlkICYmIAorICAgICAgICAgICAgYiA9PSAodW5jaGFyKWJ1c251bSkgeworICAgICAgICAgICAgc2NwLT5TQ3AuaGF2ZV9kYXRhX2luID0gMDsKKyAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgd2hpbGUgKCFzY3AtPlNDcC5oYXZlX2RhdGFfaW4pCisgICAgICAgICAgICAgICAgYmFycmllcigpOworICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBnZHRoX3N0b3BfdGltZW91dChpbnQgaGFudW0sIGludCBidXNudW0sIGludCBpZCkKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgU2NzaV9DbW5kICpzY3A7CisgICAgdW5jaGFyIGIsIHQ7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBmb3IgKHNjcCA9IGhhLT5yZXFfZmlyc3Q7IHNjcDsgc2NwID0gKFNjc2lfQ21uZCAqKXNjcC0+U0NwLnB0cikgeworICAgICAgICBiID0gdmlydF9jdHIgPyBOVU1EQVRBKHNjcC0+ZGV2aWNlLT5ob3N0KS0+YnVzbnVtIDogc2NwLT5kZXZpY2UtPmNoYW5uZWw7CisgICAgICAgIHQgPSBzY3AtPmRldmljZS0+aWQ7CisgICAgICAgIGlmICh0ID09ICh1bmNoYXIpaWQgJiYgYiA9PSAodW5jaGFyKWJ1c251bSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zdG9wX3RpbWVvdXQoKTogdXBkYXRlX3RpbWVvdXQoKVxuIikpOworICAgICAgICAgICAgc2NwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IGdkdGhfdXBkYXRlX3RpbWVvdXQoaGFudW0sIHNjcCwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdkdGhfc3RhcnRfdGltZW91dChpbnQgaGFudW0sIGludCBidXNudW0sIGludCBpZCkKK3sKKyAgICBnZHRoX2hhX3N0ciAqaGE7CisgICAgdWxvbmcgZmxhZ3M7CisgICAgU2NzaV9DbW5kICpzY3A7CisgICAgdW5jaGFyIGIsIHQ7CisKKyAgICBoYSA9IEhBREFUQShnZHRoX2N0cl90YWJbaGFudW1dKTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKyAgICBmb3IgKHNjcCA9IGhhLT5yZXFfZmlyc3Q7IHNjcDsgc2NwID0gKFNjc2lfQ21uZCAqKXNjcC0+U0NwLnB0cikgeworICAgICAgICBiID0gdmlydF9jdHIgPyBOVU1EQVRBKHNjcC0+ZGV2aWNlLT5ob3N0KS0+YnVzbnVtIDogc2NwLT5kZXZpY2UtPmNoYW5uZWw7CisgICAgICAgIHQgPSBzY3AtPmRldmljZS0+aWQ7CisgICAgICAgIGlmICh0ID09ICh1bmNoYXIpaWQgJiYgYiA9PSAodW5jaGFyKWJ1c251bSkgeworICAgICAgICAgICAgVFJBQ0UyKCgiZ2R0aF9zdGFydF90aW1lb3V0KCk6IHVwZGF0ZV90aW1lb3V0KClcbiIpKTsKKyAgICAgICAgICAgIGdkdGhfdXBkYXRlX3RpbWVvdXQoaGFudW0sIHNjcCwgc2NwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZ2R0aF91cGRhdGVfdGltZW91dChpbnQgaGFudW0sIFNjc2lfQ21uZCAqc2NwLCBpbnQgdGltZW91dCkKK3sKKyAgICBpbnQgb2xkdG87CisKKyAgICBvbGR0byA9IHNjcC0+dGltZW91dF9wZXJfY29tbWFuZDsKKyAgICBzY3AtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSB0aW1lb3V0OworCisgICAgaWYgKHRpbWVvdXQgPT0gMCkgeworICAgICAgICBkZWxfdGltZXIoJnNjcC0+ZWhfdGltZW91dCk7CisgICAgICAgIHNjcC0+ZWhfdGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIE5VTEw7CisgICAgICAgIHNjcC0+ZWhfdGltZW91dC5leHBpcmVzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2NwLT5laF90aW1lb3V0LmRhdGEgIT0gKHVuc2lnbmVkIGxvbmcpIE5VTEwpIAorICAgICAgICAgICAgZGVsX3RpbWVyKCZzY3AtPmVoX3RpbWVvdXQpOworICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY3A7CisgICAgICAgIHNjcC0+ZWhfdGltZW91dC5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisgICAgICAgIGFkZF90aW1lcigmc2NwLT5laF90aW1lb3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkdG87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmggYi9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1ZTgyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2MuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9HRFRIX1BST0NfSAorI2RlZmluZSBfR0RUSF9QUk9DX0gKKworLyogZ2R0aF9wcm9jLmggCisgKiAkSWQ6IGdkdGhfcHJvYy5oLHYgMS4xNiAyMDA0LzAxLzE0IDEzOjA5OjAxIGFjaGltIEV4cCAkCisgKi8KKworc3RhdGljIGludCBnZHRoX3NldF9pbmZvKGNoYXIgKmJ1ZmZlcixpbnQgbGVuZ3RoLHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbnVtLGludCBidXNudW0pOworc3RhdGljIGludCBnZHRoX2dldF9pbmZvKGNoYXIgKmJ1ZmZlcixjaGFyICoqc3RhcnQsb2ZmX3Qgb2Zmc2V0LGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCxpbnQgaGFudW0saW50IGJ1c251bSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgdm9pZCBnZHRoX2RvX3JlcShTY3NpX1JlcXVlc3QgKnNycCwgZ2R0aF9jbWRfc3RyICpjbWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqY21uZCwgaW50IHRpbWVvdXQpOworc3RhdGljIGludCBnZHRoX3NldF9hc2NfaW5mbyhjaGFyICpidWZmZXIsaW50IGxlbmd0aCxpbnQgaGFudW0sU2NzaV9SZXF1ZXN0ICpzY3ApOworI2Vsc2UKK3N0YXRpYyB2b2lkIGdkdGhfZG9fY21kKFNjc2lfQ21uZCAqc2NwLCBnZHRoX2NtZF9zdHIgKmNtZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjbW5kLCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW50IGdkdGhfc2V0X2FzY19pbmZvKGNoYXIgKmJ1ZmZlcixpbnQgbGVuZ3RoLGludCBoYW51bSxTY3NpX0NtbmQgKnNjcCk7CisjZW5kaWYKKworc3RhdGljIGNoYXIgKmdkdGhfaW9jdGxfYWxsb2MoaW50IGhhbnVtLCBpbnQgc2l6ZSwgaW50IHNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bG9uZzY0ICpwYWRkcik7ICAKK3N0YXRpYyB2b2lkIGdkdGhfaW9jdGxfZnJlZShpbnQgaGFudW0sIGludCBzaXplLCBjaGFyICpidWYsIHVsb25nNjQgcGFkZHIpOworc3RhdGljIHZvaWQgZ2R0aF93YWl0X2NvbXBsZXRpb24oaW50IGhhbnVtLCBpbnQgYnVzbnVtLCBpbnQgaWQpOworc3RhdGljIHZvaWQgZ2R0aF9zdG9wX3RpbWVvdXQoaW50IGhhbnVtLCBpbnQgYnVzbnVtLCBpbnQgaWQpOworc3RhdGljIHZvaWQgZ2R0aF9zdGFydF90aW1lb3V0KGludCBoYW51bSwgaW50IGJ1c251bSwgaW50IGlkKTsKK3N0YXRpYyBpbnQgZ2R0aF91cGRhdGVfdGltZW91dChpbnQgaGFudW0sIFNjc2lfQ21uZCAqc2NwLCBpbnQgdGltZW91dCk7CisKK3ZvaWQgZ2R0aF9zY3NpX2RvbmUoU2NzaV9DbW5kICpzY3ApOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2d2cDExLmMgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGNiZjczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2d2cDExLmMKQEAgLTAsMCArMSwzODcgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJ3ZDMzYzkzLmgiCisjaW5jbHVkZSAiZ3ZwMTEuaCIKKworI2luY2x1ZGU8bGludXgvc3RhdC5oPgorCisjZGVmaW5lIERNQShwdHIpICgoZ3ZwMTFfc2NzaXJlZ3MgKikoKHB0ciktPmJhc2UpKQorI2RlZmluZSBIREFUQShwdHIpICgoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikoKHB0ciktPmhvc3RkYXRhKSkKKworc3RhdGljIGlycXJldHVybl90IGd2cDExX2ludHIgKGludCBpcnEsIHZvaWQgKl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgdW5zaWduZWQgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopX2luc3RhbmNlOworCisgICAgc3RhdHVzID0gRE1BKGluc3RhbmNlKS0+Q05UUjsKKyAgICBpZiAoIShzdGF0dXMgJiBHVlAxMV9ETUFDX0lOVF9QRU5ESU5HKSkKKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgd2QzM2M5M19pbnRyKGluc3RhbmNlKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZ3ZwMTFfeGZlcl9tYXNrID0gMDsKKwordm9pZCBndnAxMV9zZXR1cCAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisgICAgZ3ZwMTFfeGZlcl9tYXNrID0gaW50c1sxXTsKK30KKworc3RhdGljIGludCBkbWFfc2V0dXAgKFNjc2lfQ21uZCAqY21kLCBpbnQgZGlyX2luKQoreworICAgIHVuc2lnbmVkIHNob3J0IGNudHIgPSBHVlAxMV9ETUFDX0lOVF9FTkFCTEU7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gdmlydF90b19idXMoY21kLT5TQ3AucHRyKTsKKyAgICBpbnQgYmFua19tYXNrOworICAgIHN0YXRpYyBpbnQgc2NzaV9hbGxvY19vdXRfb2ZfcmFuZ2UgPSAwOworCisgICAgLyogdXNlIGJvdW5jZSBidWZmZXIgaWYgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaXMgYmFkICovCisgICAgaWYgKGFkZHIgJiBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV94ZmVyX21hc2sgfHwKKwkoIWRpcl9pbiAmJiBtbV9lbmRfb2ZfY2h1bmsgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKSkKKyAgICB7CisJSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2xlbiA9IChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICsgNTExKQorCSAgICAmIH4weDFmZjsKKworIAlpZiggIXNjc2lfYWxsb2Nfb3V0X29mX3JhbmdlICkgeworCSAgICBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyID0KKwkJa21hbGxvYyAoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2xlbiwgR0ZQX0tFUk5FTCk7CisJICAgIEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2J1ZmZlcl9wb29sID0gQlVGX1NDU0lfQUxMT0NFRDsKKwl9CisKKwlpZiAoc2NzaV9hbGxvY19vdXRfb2ZfcmFuZ2UgfHwKKwkgICAgIUhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpIHsKKwkgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciA9CisJCWFtaWdhX2NoaXBfYWxsb2MoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2xlbiwKKwkJCQkgICAgICAgIkdWUCBJSSBTQ1NJIEJvdW5jZSBCdWZmZXIiKTsKKworCSAgICBpZighSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlcikKKwkgICAgeworCQlIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfbGVuID0gMDsKKwkJcmV0dXJuIDE7CisJICAgIH0KKworCSAgICBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9idWZmZXJfcG9vbCA9IEJVRl9DSElQX0FMTE9DRUQ7CisJfQorCisJLyogY2hlY2sgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGJvdW5jZSBidWZmZXIgaXMgT0sgKi8KKwlhZGRyID0gdmlydF90b19idXMoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisKKwlpZiAoYWRkciAmIEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX3hmZXJfbWFzaykgeworCSAgICAvKiBmYWxsIGJhY2sgdG8gQ2hpcCBSQU0gaWYgYWRkcmVzcyBvdXQgb2YgcmFuZ2UgKi8KKwkgICAgaWYoIEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2J1ZmZlcl9wb29sID09IEJVRl9TQ1NJX0FMTE9DRUQpIHsKKwkJa2ZyZWUgKEhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9idWZmZXIpOworCQlzY3NpX2FsbG9jX291dF9vZl9yYW5nZSA9IDE7CisJICAgIH0gZWxzZSB7CisJCWFtaWdhX2NoaXBfZnJlZSAoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisgICAgICAgICAgICB9CisJCQorCSAgICBIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyID0KKwkJYW1pZ2FfY2hpcF9hbGxvYyhIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfbGVuLAorCQkJCSAgICAgICAiR1ZQIElJIFNDU0kgQm91bmNlIEJ1ZmZlciIpOworCisJICAgIGlmKCFIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyKQorCSAgICB7CisJCUhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX2JvdW5jZV9sZW4gPSAwOworCQlyZXR1cm4gMTsKKwkgICAgfQorCisJICAgIGFkZHIgPSB2aXJ0X3RvX2J1cyhIREFUQShjbWQtPmRldmljZS0+aG9zdCktPmRtYV9ib3VuY2VfYnVmZmVyKTsKKwkgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYnVmZmVyX3Bvb2wgPSBCVUZfQ0hJUF9BTExPQ0VEOworCX0KKwkgICAgCisJaWYgKCFkaXJfaW4pIHsKKwkgICAgLyogY29weSB0byBib3VuY2UgYnVmZmVyIGZvciBhIHdyaXRlICovCisJICAgIG1lbWNweSAoSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfYm91bmNlX2J1ZmZlciwKKwkJICAgIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJfQorICAgIH0KKworICAgIC8qIHNldHVwIGRtYSBkaXJlY3Rpb24gKi8KKyAgICBpZiAoIWRpcl9pbikKKwljbnRyIHw9IEdWUDExX0RNQUNfRElSX1dSSVRFOworCisgICAgSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpLT5kbWFfZGlyID0gZGlyX2luOworICAgIERNQShjbWQtPmRldmljZS0+aG9zdCktPkNOVFIgPSBjbnRyOworCisgICAgLyogc2V0dXAgRE1BICpwaHlzaWNhbCogYWRkcmVzcyAqLworICAgIERNQShjbWQtPmRldmljZS0+aG9zdCktPkFDUiA9IGFkZHI7CisKKyAgICBpZiAoZGlyX2luKQorCS8qIGludmFsaWRhdGUgYW55IGNhY2hlICovCisJY2FjaGVfY2xlYXIgKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIGVsc2UKKwkvKiBwdXNoIGFueSBkaXJ0eSBjYWNoZSAqLworCWNhY2hlX3B1c2ggKGFkZHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCisgICAgaWYgKChiYW5rX21hc2sgPSAofkhEQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KS0+ZG1hX3hmZXJfbWFzayA+PiAxOCkgJiAweDAxYzApKQorCSAgICBETUEoY21kLT5kZXZpY2UtPmhvc3QpLT5CQU5LID0gYmFua19tYXNrICYgKGFkZHIgPj4gMTgpOworCisgICAgLyogc3RhcnQgRE1BICovCisgICAgRE1BKGNtZC0+ZGV2aWNlLT5ob3N0KS0+U1RfRE1BID0gMTsKKworICAgIC8qIHJldHVybiBzdWNjZXNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zdG9wIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpTQ3BudCwKKwkJICAgICAgaW50IHN0YXR1cykKK3sKKyAgICAvKiBzdG9wIERNQSAqLworICAgIERNQShpbnN0YW5jZSktPlNQX0RNQSA9IDE7CisgICAgLyogcmVtb3ZlIHdyaXRlIGJpdCBmcm9tIENPTlRST0wgYml0cyAqLworICAgIERNQShpbnN0YW5jZSktPkNOVFIgPSBHVlAxMV9ETUFDX0lOVF9FTkFCTEU7CisKKyAgICAvKiBjb3B5IGZyb20gYSBib3VuY2UgYnVmZmVyLCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoc3RhdHVzICYmIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIpIHsKKwlpZiAoSERBVEEoaW5zdGFuY2UpLT5kbWFfZGlyICYmIFNDcG50KQorCSAgICBtZW1jcHkgKFNDcG50LT5TQ3AucHRyLCAKKwkJICAgIEhEQVRBKGluc3RhbmNlKS0+ZG1hX2JvdW5jZV9idWZmZXIsCisJCSAgICBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCQorCWlmIChIREFUQShpbnN0YW5jZSktPmRtYV9idWZmZXJfcG9vbCA9PSBCVUZfU0NTSV9BTExPQ0VEKQorCSAgICBrZnJlZSAoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJZWxzZQorCSAgICBhbWlnYV9jaGlwX2ZyZWUoSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlcik7CisJCisJSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2J1ZmZlciA9IE5VTEw7CisJSERBVEEoaW5zdGFuY2UpLT5kbWFfYm91bmNlX2xlbiA9IDA7CisgICAgfQorfQorCisjZGVmaW5lIENIRUNLX1dEMzNDOTMKKworaW50IF9faW5pdCBndnAxMV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhbGxlZCA9IDA7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOworICAgIHVuc2lnbmVkIGludCBlcGM7CisgICAgc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfZG1hX3hmZXJfbWFzazsKKyAgICB3ZDMzYzkzX3JlZ3MgcmVnczsKKyAgICBpbnQgbnVtX2d2cDExID0gMDsKKyNpZmRlZiBDSEVDS19XRDMzQzkzCisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqc2Fzcl8zMzkzLCAqc2NtZF8zMzkzOworICAgIHVuc2lnbmVkIGNoYXIgc2F2ZV9zYXNyOworICAgIHVuc2lnbmVkIGNoYXIgcSwgcXE7CisjZW5kaWYKKworICAgIGlmICghTUFDSF9JU19BTUlHQSB8fCBjYWxsZWQpCisJcmV0dXJuIDA7CisgICAgY2FsbGVkID0gMTsKKworICAgIHRwbnQtPnByb2NfbmFtZSA9ICJHVlAxMSI7CisgICAgdHBudC0+cHJvY19pbmZvID0gJndkMzNjOTNfcHJvY19pbmZvOworCisgICAgd2hpbGUgKCh6ID0gem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fV0lMRENBUkQsIHopKSkgeworCS8qIAorCSAqIFRoaXMgc2hvdWxkIChob3BlZnVsbHkpIGJlIHRoZSBjb3JyZWN0IHdheSB0byBpZGVudGlmeQorCSAqIGFsbCB0aGUgZGlmZmVyZW50IEdWUCBTQ1NJIGNvbnRyb2xsZXJzIChleGNlcHQgZm9yIHRoZQorCSAqIFNFUklFUyBJIHRob3VnaCkuCisJICovCisKKwlpZiAoei0+aWQgPT0gWk9SUk9fUFJPRF9HVlBfQ09NQk9fMDMwX1IzX1NDU0kgfHwKKwkgICAgei0+aWQgPT0gWk9SUk9fUFJPRF9HVlBfU0VSSUVTX0lJKQorCSAgICBkZWZhdWx0X2RtYV94ZmVyX21hc2sgPSB+MHgwMGZmZmZmZjsKKwllbHNlIGlmICh6LT5pZCA9PSBaT1JST19QUk9EX0dWUF9HRk9SQ0VfMDMwX1NDU0kgfHwKKwkJIHotPmlkID09IFpPUlJPX1BST0RfR1ZQX0E1MzBfU0NTSSB8fAorCQkgei0+aWQgPT0gWk9SUk9fUFJPRF9HVlBfQ09NQk9fMDMwX1I0X1NDU0kpCisJICAgIGRlZmF1bHRfZG1hX3hmZXJfbWFzayA9IH4weDAxZmZmZmZmOworCWVsc2UgaWYgKHotPmlkID09IFpPUlJPX1BST0RfR1ZQX0ExMjkxIHx8CisJCSB6LT5pZCA9PSBaT1JST19QUk9EX0dWUF9HRk9SQ0VfMDQwX1NDU0lfMSkKKwkgICAgZGVmYXVsdF9kbWFfeGZlcl9tYXNrID0gfjB4MDdmZmZmZmY7CisJZWxzZQorCSAgICBjb250aW51ZTsKKworCS8qCisJICogUnVtb3JzIHN0YXRlIHRoYXQgc29tZSBHVlAgcmFtIGJvYXJkcyB1c2UgdGhlIHNhbWUgcHJvZHVjdAorCSAqIGNvZGUgYXMgdGhlIFNDU0kgY29udHJvbGxlcnMuIFRoZXJlZm9yZSBpZiB0aGUgYm9hcmQtc2l6ZQorCSAqIGlzIG5vdCA2NEtCIHdlIGFzdW1lIGl0IGlzIGEgcmFtIGJvYXJkIGFuZCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoei0+cmVzb3VyY2UuZW5kLXotPnJlc291cmNlLnN0YXJ0ICE9IDB4ZmZmZikKKwkJY29udGludWU7CisKKwlhZGRyZXNzID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYWRkcmVzcywgMjU2LCAid2QzM2M5MyIpKQorCSAgICBjb250aW51ZTsKKworI2lmZGVmIENIRUNLX1dEMzNDOTMKKworCS8qCisJICogVGhlc2UgZGFybiBHVlAgYm9hcmRzIGFyZSBhIHByb2JsZW0gLSBpdCBjYW4gYmUgdG91Z2ggdG8gdGVsbAorCSAqIHdoZXRoZXIgb3Igbm90IHRoZXkgaW5jbHVkZSBhIFNDU0kgY29udHJvbGxlci4gVGhpcyBpcyB0aGUKKwkgKiB1bHRpbWF0ZSBZZXQtQW5vdGhlci1HVlAtRGV0ZWN0aW9uLUhhY2sgaW4gdGhhdCBpdCBhY3R1YWxseQorCSAqIHByb2JlcyBmb3IgYSBXRDMzYzkzIGNoaXA6IElmIHdlIGZpbmQgb25lLCBpdCdzIGV4dHJlbWVseQorCSAqIGxpa2VseSB0aGF0IHRoaXMgY2FyZCBzdXBwb3J0cyBTQ1NJLCByZWdhcmRsZXNzIG9mIFByb2R1Y3RfCisJICogQ29kZSwgQm9hcmRfU2l6ZSwgZXRjLiAKKwkgKi8KKworICAgIC8qIEdldCBwb2ludGVycyB0byB0aGUgcHJlc3VtZWQgcmVnaXN0ZXIgbG9jYXRpb25zIGFuZCBzYXZlIGNvbnRlbnRzICovCisKKwlzYXNyXzMzOTMgPSAmKCgoZ3ZwMTFfc2NzaXJlZ3MgKikoWlRXT19WQUREUihhZGRyZXNzKSkpLT5TQVNSKTsKKwlzY21kXzMzOTMgPSAmKCgoZ3ZwMTFfc2NzaXJlZ3MgKikoWlRXT19WQUREUihhZGRyZXNzKSkpLT5TQ01EKTsKKwlzYXZlX3Nhc3IgPSAqc2Fzcl8zMzkzOworCisgICAgLyogRmlyc3QgdGVzdCB0aGUgQXV4U3RhdHVzIFJlZyAqLworCisJcSA9ICpzYXNyXzMzOTM7CQkvKiByZWFkIGl0ICovCisJaWYgKHEgJiAweDA4KQkJLyogYml0IDMgc2hvdWxkIGFsd2F5cyBiZSBjbGVhciAqLworCQlnb3RvIHJlbGVhc2U7CisJKnNhc3JfMzM5MyA9IFdEX0FVWElMSUFSWV9TVEFUVVM7CSAvKiBzZXR1cCBpbmRpcmVjdCBhZGRyZXNzICovCisJaWYgKCpzYXNyXzMzOTMgPT0gV0RfQVVYSUxJQVJZX1NUQVRVUykgeyAvKiBzaG91bGRuJ3QgcmV0YWluIHRoZSB3cml0ZSAqLworCQkqc2Fzcl8zMzkzID0gc2F2ZV9zYXNyOwkvKiBPb3BzIC0gcmVzdG9yZSB0aGlzIGJ5dGUgKi8KKwkJZ290byByZWxlYXNlOworCQl9CisJaWYgKCpzYXNyXzMzOTMgIT0gcSkgewkvKiBzaG91bGQgc3RpbGwgcmVhZCB0aGUgc2FtZSAqLworCQkqc2Fzcl8zMzkzID0gc2F2ZV9zYXNyOwkvKiBPb3BzIC0gcmVzdG9yZSB0aGlzIGJ5dGUgKi8KKwkJZ290byByZWxlYXNlOworCQl9CisJaWYgKCpzY21kXzMzOTMgIT0gcSkJLyogYW5kIHNvIHNob3VsZCB0aGUgaW1hZ2UgYXQgMHgxZiAqLworCQlnb3RvIHJlbGVhc2U7CisKKworICAgIC8qIE9rLCB3ZSBwcm9iYWJseSBoYXZlIGEgd2QzM2M5MywgYnV0IGxldCdzIGNoZWNrIGEgZmV3IG90aGVyIHBsYWNlcworICAgICAqIGZvciBnb29kIG1lYXN1cmUuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgd29ya3MgZm9yIGJvdGggJ0EgYW5kICdCICAgIAorICAgICAqIGNoaXAgdmVyc2lvbnMuCisgICAgICovCisKKwkqc2Fzcl8zMzkzID0gV0RfU0NTSV9TVEFUVVM7CisJcSA9ICpzY21kXzMzOTM7CisJKnNhc3JfMzM5MyA9IFdEX1NDU0lfU1RBVFVTOworCSpzY21kXzMzOTMgPSB+cTsKKwkqc2Fzcl8zMzkzID0gV0RfU0NTSV9TVEFUVVM7CisJcXEgPSAqc2NtZF8zMzkzOworCSpzYXNyXzMzOTMgPSBXRF9TQ1NJX1NUQVRVUzsKKwkqc2NtZF8zMzkzID0gcTsKKwlpZiAocXEgIT0gcSkJCQkvKiBzaG91bGQgYmUgcmVhZCBvbmx5ICovCisJCWdvdG8gcmVsZWFzZTsKKwkqc2Fzcl8zMzkzID0gMHgxZTsJLyogdGhpcyByZWdpc3RlciBpcyB1bmltcGxlbWVudGVkICovCisJcSA9ICpzY21kXzMzOTM7CisJKnNhc3JfMzM5MyA9IDB4MWU7CisJKnNjbWRfMzM5MyA9IH5xOworCSpzYXNyXzMzOTMgPSAweDFlOworCXFxID0gKnNjbWRfMzM5MzsKKwkqc2Fzcl8zMzkzID0gMHgxZTsKKwkqc2NtZF8zMzkzID0gcTsKKwlpZiAocXEgIT0gcSB8fCBxcSAhPSAweGZmKQkvKiBzaG91bGQgYmUgcmVhZCBvbmx5LCBhbGwgMSdzICovCisJCWdvdG8gcmVsZWFzZTsKKwkqc2Fzcl8zMzkzID0gV0RfVElNRU9VVF9QRVJJT0Q7CisJcSA9ICpzY21kXzMzOTM7CisJKnNhc3JfMzM5MyA9IFdEX1RJTUVPVVRfUEVSSU9EOworCSpzY21kXzMzOTMgPSB+cTsKKwkqc2Fzcl8zMzkzID0gV0RfVElNRU9VVF9QRVJJT0Q7CisJcXEgPSAqc2NtZF8zMzkzOworCSpzYXNyXzMzOTMgPSBXRF9USU1FT1VUX1BFUklPRDsKKwkqc2NtZF8zMzkzID0gcTsKKwlpZiAocXEgIT0gKH5xICYgMHhmZikpCQkvKiBzaG91bGQgYmUgcmVhZC93cml0ZSAqLworCQlnb3RvIHJlbGVhc2U7CisjZW5kaWYKKworCWluc3RhbmNlID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mIChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSkpOworCWlmKGluc3RhbmNlID09IE5VTEwpCisJCWdvdG8gcmVsZWFzZTsKKwlpbnN0YW5jZS0+YmFzZSA9IFpUV09fVkFERFIoYWRkcmVzcyk7CisJaW5zdGFuY2UtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKKwlpbnN0YW5jZS0+dW5pcXVlX2lkID0gei0+c2xvdGFkZHI7CisKKwlpZiAoZ3ZwMTFfeGZlcl9tYXNrKQorCQlIREFUQShpbnN0YW5jZSktPmRtYV94ZmVyX21hc2sgPSBndnAxMV94ZmVyX21hc2s7CisJZWxzZQorCQlIREFUQShpbnN0YW5jZSktPmRtYV94ZmVyX21hc2sgPSBkZWZhdWx0X2RtYV94ZmVyX21hc2s7CisKKworCURNQShpbnN0YW5jZSktPnNlY3JldDIgPSAxOworCURNQShpbnN0YW5jZSktPnNlY3JldDEgPSAwOworCURNQShpbnN0YW5jZSktPnNlY3JldDMgPSAxNTsKKwl3aGlsZSAoRE1BKGluc3RhbmNlKS0+Q05UUiAmIEdWUDExX0RNQUNfQlVTWSkgOworCURNQShpbnN0YW5jZSktPkNOVFIgPSAwOworCisJRE1BKGluc3RhbmNlKS0+QkFOSyA9IDA7CisKKwllcGMgPSAqKHVuc2lnbmVkIHNob3J0ICopKFpUV09fVkFERFIoYWRkcmVzcykgKyAweDgwMDApOworCisJLyoKKwkgKiBDaGVjayBmb3IgMTRNSHogU0NTSSBjbG9jaworCSAqLworCXJlZ3MuU0FTUiA9ICYoRE1BKGluc3RhbmNlKS0+U0FTUik7CisJcmVncy5TQ01EID0gJihETUEoaW5zdGFuY2UpLT5TQ01EKTsKKwl3ZDMzYzkzX2luaXQoaW5zdGFuY2UsIHJlZ3MsIGRtYV9zZXR1cCwgZG1hX3N0b3AsCisJCSAgICAgKGVwYyAmIEdWUF9TQ1NJQ0xLTUFTSykgPyBXRDMzQzkzX0ZTXzhfMTAKKwkJCQkJICAgICA6IFdEMzNDOTNfRlNfMTJfMTUpOworCisJcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBndnAxMV9pbnRyLCBTQV9TSElSUSwgIkdWUDExIFNDU0kiLAorCQkgICAgaW5zdGFuY2UpOworCURNQShpbnN0YW5jZSktPkNOVFIgPSBHVlAxMV9ETUFDX0lOVF9FTkFCTEU7CisJbnVtX2d2cDExKys7CisJY29udGludWU7CisKK3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1Nik7CisgICAgfQorCisgICAgcmV0dXJuIG51bV9ndnAxMTsKK30KKworc3RhdGljIGludCBndnAxMV9idXNfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJLyogRklYTUUgcGVyZm9ybSBidXMtc3BlY2lmaWMgcmVzZXQgKi8KKwl3ZDMzYzkzX2hvc3RfcmVzZXQoY21kKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisjZGVmaW5lIEhPU1RTX0MKKworI2luY2x1ZGUgImd2cDExLmgiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gIkdWUDExIiwKKwkubmFtZQkJCT0gIkdWUCBTZXJpZXMgSUkgU0NTSSIsCisJLmRldGVjdAkJCT0gZ3ZwMTFfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IGd2cDExX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZ3ZwMTFfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSB3ZDMzYzkzX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworaW50IGd2cDExX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisgICAgRE1BKGluc3RhbmNlKS0+Q05UUiA9IDA7CisgICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoaW5zdGFuY2UtPmJhc2UpLCAyNTYpOworICAgIGZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgaW5zdGFuY2UpOworICAgIHdkMzNjOTNfcmVsZWFzZSgpOworI2VuZGlmCisgICAgcmV0dXJuIDE7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ndnAxMS5oIGIvZHJpdmVycy9zY3NpL2d2cDExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0OGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9ndnAxMS5oCkBAIC0wLDAgKzEsNjMgQEAKKyNpZm5kZWYgR1ZQMTFfSAorCisvKiAkSWQ6IGd2cDExLmgsdiAxLjQgMTk5Ny8wMS8xOSAyMzowNzoxMiBkYXZlbSBFeHAgJAorICoKKyAqIEhlYWRlciBmaWxlIGZvciB0aGUgR1ZQIFNlcmllcyBJSSBTQ1NJIGNvbnRyb2xsZXIgZm9yIExpbnV4CisgKgorICogV3JpdHRlbiBhbmQgKEMpIDE5OTMsIFJhbGYgQmFlY2hsZSwgc2VlIGd2cDExLmMgZm9yIG1vcmUgaW5mbworICogYmFzZWQgb24gYTIwOTEuaCAoQykgMTk5MyBieSBIYW1pc2ggTWFjZG9uYWxkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgZ3ZwMTFfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBndnAxMV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICp3ZDMzYzkzX2luZm8odm9pZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IHdkMzNjOTNfYWJvcnQoU2NzaV9DbW5kICopOworaW50IHdkMzNjOTNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKyNpZm5kZWYgSE9TVFNfQworCisvKgorICogaWYgdGhlIHRyYW5zZmVyIGFkZHJlc3MgQU5EZWQgd2l0aCB0aGlzIHJlc3VsdHMgaW4gYSBub24temVybworICogcmVzdWx0LCB0aGVuIHdlIGNhbid0IHVzZSBETUEuCisgKi8KKyNkZWZpbmUgR1ZQMTFfWEZFUl9NQVNLICAoMHhmZjAwMDAwMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICBwYWQxWzY0XTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgQ05UUjsKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgcGFkMlszMV07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNBU1I7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDM7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgIFNDTUQ7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDRbNF07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIEJBTks7CisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgIHBhZDVbNl07CisgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAgICAgIEFDUjsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgc2VjcmV0MTsgLyogc3RvcmUgMCBoZXJlICovCisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgICAgIFNUX0RNQTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgU1BfRE1BOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICAgICBzZWNyZXQyOyAvKiBzdG9yZSAxIGhlcmUgKi8KKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAgICAgc2VjcmV0MzsgLyogc3RvcmUgMTUgaGVyZSAqLworfSBndnAxMV9zY3NpcmVnczsKKworLyogYml0cyBpbiBDTlRSICovCisjZGVmaW5lIEdWUDExX0RNQUNfQlVTWQkJKDE8PDApCisjZGVmaW5lIEdWUDExX0RNQUNfSU5UX1BFTkRJTkcJKDE8PDEpCisjZGVmaW5lIEdWUDExX0RNQUNfSU5UX0VOQUJMRQkoMTw8MykKKyNkZWZpbmUgR1ZQMTFfRE1BQ19ESVJfV1JJVEUJKDE8PDQpCisKKyNlbmRpZiAvKiBlbHNlIGRlZiBIT1NUU19DICovCisKKyNlbmRpZiAvKiBHVlAxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaG9zdHMuYyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzQ3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqICBob3N0cy5jIENvcHlyaWdodCAoQykgMTk5MiBEcmV3IEVja2hhcmR0CisgKiAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUgRXJpYyBZb3VuZ2RhbGUKKyAqICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIENocmlzdG9waCBIZWxsd2lnCisgKgorICogIG1pZCB0byBsb3dsZXZlbCBTQ1NJIGRyaXZlciBpbnRlcmZhY2UKKyAqICAgICAgSW5pdGlhbCB2ZXJzaW9uczogRHJldyBFY2toYXJkdAorICogICAgICBTdWJzZXF1ZW50IHJldmlzaW9uczogRXJpYyBZb3VuZ2RhbGUKKyAqCisgKiAgPGRyZXdAY29sb3JhZG8uZWR1PgorICoKKyAqICBKaWZmaWVzIHdyYXAgZml4ZXMgKGhvc3QtPnJlc2V0dGluZyksIDMgRGVjIDE5OTggQW5kcmVhIEFyY2FuZ2VsaQorICogIEFkZGVkIFFMT0dJQyBRTEExMjgwIFNDU0kgY29udHJvbGxlciBrZXJuZWwgaG9zdCBzdXBwb3J0LiAKKyAqICAgICBBdWd1c3QgNCwgMTk5OSBGcmVkIExld2lzLCBJbnRlbCBEdVBvbnQKKyAqCisgKiAgVXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgaW5pdGlhbGl6YXRpb24gc2NoZW1lIGZvciB0aGUgaGlnaGVyIAorICogIGxldmVsIG9mIHNjc2kgZHJpdmVycyAoc2Qvc3Ivc3QpCisgKiAgU2VwdGVtYmVyIDE3LCAyMDAwIFRvcmJlbiBNYXRoaWFzZW4gPHRtbUBpbWFnZS5kaz4KKyAqCisgKiAgUmVzdHJ1Y3R1cmVkIHNjc2lfaG9zdCBsaXN0cyBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbnMuCisgKiAgU2VwdGVtYmVyIDA0LCAyMDAyIE1pa2UgQW5kZXJzb24gKGFuZG1pa2VAdXMuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYW5zcG9ydF9jbGFzcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKworc3RhdGljIGludCBzY3NpX2hvc3RfbmV4dF9objsJCS8qIGhvc3Rfbm8gZm9yIG5leHQgbmV3IGhvc3QgKi8KKworCitzdGF0aWMgdm9pZCBzY3NpX2hvc3RfY2xzX3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCXB1dF9kZXZpY2UoJmNsYXNzX3RvX3Nob3N0KGNsYXNzX2RldiktPnNob3N0X2dlbmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Mgc2hvc3RfY2xhc3MgPSB7CisJLm5hbWUJCT0gInNjc2lfaG9zdCIsCisJLnJlbGVhc2UJPSBzY3NpX2hvc3RfY2xzX3JlbGVhc2UsCit9OworCisvKioKKyAqIHNjc2lfaG9zdF9jYW5jZWwgLSBjYW5jZWwgb3V0c3RhbmRpbmcgSU8gdG8gdGhpcyBob3N0CisgKiBAc2hvc3Q6CXBvaW50ZXIgdG8gc3RydWN0IFNjc2lfSG9zdAorICogcmVjb3Zlcnk6CXJlY292ZXJ5IHJlcXVlc3RlZCB0byBydW4uCisgKiovCit2b2lkIHNjc2lfaG9zdF9jYW5jZWwoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCByZWNvdmVyeSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlzZXRfYml0KFNIT1NUX0NBTkNFTCwgJnNob3N0LT5zaG9zdF9zdGF0ZSk7CisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7CisJCXNjc2lfZGV2aWNlX2NhbmNlbChzZGV2LCByZWNvdmVyeSk7CisJfQorCXdhaXRfZXZlbnQoc2hvc3QtPmhvc3Rfd2FpdCwgKCF0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwKKwkJCQkJCSZzaG9zdC0+c2hvc3Rfc3RhdGUpKSk7Cit9CisKKy8qKgorICogc2NzaV9yZW1vdmVfaG9zdCAtIHJlbW92ZSBhIHNjc2kgaG9zdAorICogQHNob3N0OglhIHBvaW50ZXIgdG8gYSBzY3NpIGhvc3QgdG8gcmVtb3ZlCisgKiovCit2b2lkIHNjc2lfcmVtb3ZlX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc2NzaV9mb3JnZXRfaG9zdChzaG9zdCk7CisJc2NzaV9ob3N0X2NhbmNlbChzaG9zdCwgMCk7CisJc2NzaV9wcm9jX2hvc3Rfcm0oc2hvc3QpOworCisJc2V0X2JpdChTSE9TVF9ERUwsICZzaG9zdC0+c2hvc3Rfc3RhdGUpOworCisJdHJhbnNwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3Rlcigmc2hvc3QtPnNob3N0X2NsYXNzZGV2KTsKKwlkZXZpY2VfZGVsKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9yZW1vdmVfaG9zdCk7CisKKy8qKgorICogc2NzaV9hZGRfaG9zdCAtIGFkZCBhIHNjc2kgaG9zdAorICogQHNob3N0OglzY3NpIGhvc3QgcG9pbnRlciB0byBhZGQKKyAqIEBkZXY6CWEgc3RydWN0IGRldmljZSBvZiB0eXBlIHNjc2kgY2xhc3MKKyAqCisgKiBSZXR1cm4gdmFsdWU6IAorICogCTAgb24gc3VjY2VzcyAvICE9IDAgZm9yIGVycm9yCisgKiovCitpbnQgc2NzaV9hZGRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNob3N0LT5ob3N0dDsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkIDogJXNcbiIsIHNob3N0LT5ob3N0X25vLAorCQkJc2h0LT5pbmZvID8gc2h0LT5pbmZvKHNob3N0KSA6IHNodC0+bmFtZSk7CisKKwlpZiAoIXNob3N0LT5jYW5fcXVldWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuX3F1ZXVlID0gMCBubyBsb25nZXIgc3VwcG9ydGVkXG4iLAorCQkJCXNodC0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc2hvc3QtPnNob3N0X2dlbmRldi5wYXJlbnQpCisJCXNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50ID0gZGV2ID8gZGV2IDogJnBsYXRmb3JtX2J1czsKKworCWVycm9yID0gZGV2aWNlX2FkZCgmc2hvc3QtPnNob3N0X2dlbmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCXNldF9iaXQoU0hPU1RfQURELCAmc2hvc3QtPnNob3N0X3N0YXRlKTsKKwlnZXRfZGV2aWNlKHNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50KTsKKworCWVycm9yID0gY2xhc3NfZGV2aWNlX2FkZCgmc2hvc3QtPnNob3N0X2NsYXNzZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2RlbF9nZW5kZXY7CisKKwlnZXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKworCWlmIChzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9zaXplICYmCisJICAgIChzaG9zdC0+c2hvc3RfZGF0YSA9IGttYWxsb2Moc2hvc3QtPnRyYW5zcG9ydHQtPmhvc3Rfc2l6ZSwKKwkJCQkJIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIG91dF9kZWxfY2xhc3NkZXY7CisKKwlpZiAoc2hvc3QtPnRyYW5zcG9ydHQtPmNyZWF0ZV93b3JrX3F1ZXVlKSB7CisJCXNucHJpbnRmKHNob3N0LT53b3JrX3FfbmFtZSwgS09CSl9OQU1FX0xFTiwgInNjc2lfd3FfJWQiLAorCQkJc2hvc3QtPmhvc3Rfbm8pOworCQlzaG9zdC0+d29ya19xID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCQkJCXNob3N0LT53b3JrX3FfbmFtZSk7CisJCWlmICghc2hvc3QtPndvcmtfcSkKKwkJCWdvdG8gb3V0X2ZyZWVfc2hvc3RfZGF0YTsKKwl9CisKKwllcnJvciA9IHNjc2lfc3lzZnNfYWRkX2hvc3Qoc2hvc3QpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZGVzdHJveV9ob3N0OworCisJc2NzaV9wcm9jX2hvc3RfYWRkKHNob3N0KTsKKwlyZXR1cm4gZXJyb3I7CisKKyBvdXRfZGVzdHJveV9ob3N0OgorCWlmIChzaG9zdC0+d29ya19xKQorCQlkZXN0cm95X3dvcmtxdWV1ZShzaG9zdC0+d29ya19xKTsKKyBvdXRfZnJlZV9zaG9zdF9kYXRhOgorCWtmcmVlKHNob3N0LT5zaG9zdF9kYXRhKTsKKyBvdXRfZGVsX2NsYXNzZGV2OgorCWNsYXNzX2RldmljZV9kZWwoJnNob3N0LT5zaG9zdF9jbGFzc2Rldik7Cisgb3V0X2RlbF9nZW5kZXY6CisJZGV2aWNlX2RlbCgmc2hvc3QtPnNob3N0X2dlbmRldik7Cisgb3V0OgorCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9hZGRfaG9zdCk7CisKK3N0YXRpYyB2b2lkIHNjc2lfaG9zdF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtPnBhcmVudDsKKworCWlmIChzaG9zdC0+ZWhhbmRsZXIpIHsKKwkJREVDTEFSRV9DT01QTEVUSU9OKHNlbSk7CisJCXNob3N0LT5laF9ub3RpZnkgPSAmc2VtOworCQlzaG9zdC0+ZWhfa2lsbCA9IDE7CisJCXVwKHNob3N0LT5laF93YWl0KTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmc2VtKTsKKwkJc2hvc3QtPmVoX25vdGlmeSA9IE5VTEw7CisJfQorCisJaWYgKHNob3N0LT53b3JrX3EpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKHNob3N0LT53b3JrX3EpOworCisJc2NzaV9wcm9jX2hvc3RkaXJfcm0oc2hvc3QtPmhvc3R0KTsKKwlzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzaG9zdCk7CisJa2ZyZWUoc2hvc3QtPnNob3N0X2RhdGEpOworCisJLyoKKwkgKiBTb21lIGRyaXZlcnMgKGVnIGFoYTE1NDIpIGRvIHNjc2lfcmVnaXN0ZXIoKS9zY3NpX3VucmVnaXN0ZXIoKQorCSAqIGR1cmluZyBwcm9iaW5nIHdpdGhvdXQgcGVyZm9ybWluZyBhIHNjc2lfc2V0X2RldmljZSgpIGluIGJldHdlZW4uCisJICogSW4gdGhpcyBjYXNlIGRldi0+cGFyZW50IGlzIE5VTEwuCisJICovCisJaWYgKHBhcmVudCkKKwkJcHV0X2RldmljZShwYXJlbnQpOworCWtmcmVlKHNob3N0KTsKK30KKworLyoqCisgKiBzY3NpX2hvc3RfYWxsb2MgLSByZWdpc3RlciBhIHNjc2kgaG9zdCBhZGFwdGVyIGluc3RhbmNlLgorICogQHNodDoJcG9pbnRlciB0byBzY3NpIGhvc3QgdGVtcGxhdGUKKyAqIEBwcml2c2l6ZToJZXh0cmEgYnl0ZXMgdG8gYWxsb2NhdGUgZm9yIGRyaXZlcgorICoKKyAqIE5vdGU6CisgKiAJQWxsb2NhdGUgYSBuZXcgU2NzaV9Ib3N0IGFuZCBwZXJmb3JtIGJhc2ljIGluaXRpYWxpemF0aW9uLgorICogCVRoZSBob3N0IGlzIG5vdCBwdWJsaXNoZWQgdG8gdGhlIHNjc2kgbWlkbGF5ZXIgdW50aWwgc2NzaV9hZGRfaG9zdAorICogCWlzIGNhbGxlZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJUG9pbnRlciB0byBhIG5ldyBTY3NpX0hvc3QKKyAqKi8KK3N0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9hbGxvYyhzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQsIGludCBwcml2c2l6ZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlpbnQgZ2ZwX21hc2sgPSBHRlBfS0VSTkVMLCBydmFsOworCURFQ0xBUkVfQ09NUExFVElPTihjb21wbGV0ZSk7CisKKwlpZiAoc2h0LT51bmNoZWNrZWRfaXNhX2RtYSAmJiBwcml2c2l6ZSkKKwkJZ2ZwX21hc2sgfD0gX19HRlBfRE1BOworCisgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGhvc3QgaGFzIGFueSBlcnJvciBoYW5kbGluZyBmYWNpbGl0aWVzICovCisgICAgICAgIGlmICghc2h0LT5laF9zdHJhdGVneV9oYW5kbGVyICYmICFzaHQtPmVoX2Fib3J0X2hhbmRsZXIgJiYKKwkgICAgIXNodC0+ZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgJiYgIXNodC0+ZWhfYnVzX3Jlc2V0X2hhbmRsZXIgJiYKKyAgICAgICAgICAgICFzaHQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlcikgeworCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBTQ1NJIGhvc3QgYCVzJyBoYXMgbm8gZXJyb3IgaGFuZGxpbmdcbiIKKwkJCQkiRVJST1I6IFRoaXMgaXMgbm90IGEgc2FmZSB3YXkgdG8gcnVuIHlvdXIgIgorCQkJCSAgICAgICAgIlNDU0kgaG9zdFxuIgorCQkJCSJFUlJPUjogVGhlIGVycm9yIGhhbmRsaW5nIG11c3QgYmUgYWRkZWQgdG8gIgorCQkJCSJ0aGlzIGRyaXZlclxuIiwgc2h0LT5wcm9jX25hbWUpOworCQlkdW1wX3N0YWNrKCk7CisgICAgICAgIH0KKworCXNob3N0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IFNjc2lfSG9zdCkgKyBwcml2c2l6ZSwgZ2ZwX21hc2spOworCWlmICghc2hvc3QpCisJCXJldHVybiBOVUxMOworCW1lbXNldChzaG9zdCwgMCwgc2l6ZW9mKHN0cnVjdCBTY3NpX0hvc3QpICsgcHJpdnNpemUpOworCisJc3Bpbl9sb2NrX2luaXQoJnNob3N0LT5kZWZhdWx0X2xvY2spOworCXNjc2lfYXNzaWduX2xvY2soc2hvc3QsICZzaG9zdC0+ZGVmYXVsdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPl9fZGV2aWNlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5fX3RhcmdldHMpOworCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+ZWhfY21kX3EpOworCUlOSVRfTElTVF9IRUFEKCZzaG9zdC0+c3RhcnZlZF9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzaG9zdC0+aG9zdF93YWl0KTsKKworCWluaXRfTVVURVgoJnNob3N0LT5zY2FuX211dGV4KTsKKworCXNob3N0LT5ob3N0X25vID0gc2NzaV9ob3N0X25leHRfaG4rKzsgLyogWFhYKGhjaCk6IHN0aWxsIHJhY3kgKi8KKwlzaG9zdC0+ZG1hX2NoYW5uZWwgPSAweGZmOworCisJLyogVGhlc2UgdGhyZWUgYXJlIGRlZmF1bHQgdmFsdWVzIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuICovCisJc2hvc3QtPm1heF9jaGFubmVsID0gMDsKKwlzaG9zdC0+bWF4X2lkID0gODsKKwlzaG9zdC0+bWF4X2x1biA9IDg7CisKKwkvKiBHaXZlIGVhY2ggc2hvc3QgYSBkZWZhdWx0IHRyYW5zcG9ydHQgKi8KKwlzaG9zdC0+dHJhbnNwb3J0dCA9ICZibGFua190cmFuc3BvcnRfdGVtcGxhdGU7CisKKwkvKgorCSAqIEFsbCBkcml2ZXJzIHJpZ2h0IG5vdyBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgMTIgYnl0ZQorCSAqIGNvbW1hbmRzLiAgRXZlcnkgc28gb2Z0ZW4gdGhlcmUgYXJlIHJlcXVlc3RzIGZvciAxNiBieXRlCisJICogY29tbWFuZHMsIGJ1dCBpbmRpdmlkdWFsIGxvdy1sZXZlbCBkcml2ZXJzIG5lZWQgdG8gY2VydGlmeSB0aGF0CisJICogdGhleSBhY3R1YWxseSBkbyBzb21ldGhpbmcgc2Vuc2libGUgd2l0aCBzdWNoIGNvbW1hbmRzLgorCSAqLworCXNob3N0LT5tYXhfY21kX2xlbiA9IDEyOworCXNob3N0LT5ob3N0dCA9IHNodDsKKwlzaG9zdC0+dGhpc19pZCA9IHNodC0+dGhpc19pZDsKKwlzaG9zdC0+Y2FuX3F1ZXVlID0gc2h0LT5jYW5fcXVldWU7CisJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IHNodC0+c2dfdGFibGVzaXplOworCXNob3N0LT5jbWRfcGVyX2x1biA9IHNodC0+Y21kX3Blcl9sdW47CisJc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID0gc2h0LT51bmNoZWNrZWRfaXNhX2RtYTsKKwlzaG9zdC0+dXNlX2NsdXN0ZXJpbmcgPSBzaHQtPnVzZV9jbHVzdGVyaW5nOworCXNob3N0LT5vcmRlcmVkX2ZsdXNoID0gc2h0LT5vcmRlcmVkX2ZsdXNoOworCXNob3N0LT5vcmRlcmVkX3RhZyA9IHNodC0+b3JkZXJlZF90YWc7CisKKwkvKgorCSAqIGhvc3RzL2RldmljZXMgdGhhdCBkbyBxdWV1ZWluZyBtdXN0IHN1cHBvcnQgb3JkZXJlZCB0YWdzCisJICovCisJaWYgKHNob3N0LT5jYW5fcXVldWUgPiAxICYmIHNob3N0LT5vcmRlcmVkX2ZsdXNoKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaTogb3JkZXJlZCBmbHVzaGVzIGRvbid0IHN1cHBvcnQgcXVldWVpbmdcbiIpOworCQlzaG9zdC0+b3JkZXJlZF9mbHVzaCA9IDA7CisJfQorCisJaWYgKHNodC0+bWF4X2hvc3RfYmxvY2tlZCkKKwkJc2hvc3QtPm1heF9ob3N0X2Jsb2NrZWQgPSBzaHQtPm1heF9ob3N0X2Jsb2NrZWQ7CisJZWxzZQorCQlzaG9zdC0+bWF4X2hvc3RfYmxvY2tlZCA9IFNDU0lfREVGQVVMVF9IT1NUX0JMT0NLRUQ7CisKKwkvKgorCSAqIElmIHRoZSBkcml2ZXIgaW1wb3NlcyBubyBoYXJkIHNlY3RvciB0cmFuc2ZlciBsaW1pdCwgc3RhcnQgYXQKKwkgKiBtYWNoaW5lIGluZmluaXR5IGluaXRpYWxseS4KKwkgKi8KKwlpZiAoc2h0LT5tYXhfc2VjdG9ycykKKwkJc2hvc3QtPm1heF9zZWN0b3JzID0gc2h0LT5tYXhfc2VjdG9yczsKKwllbHNlCisJCXNob3N0LT5tYXhfc2VjdG9ycyA9IFNDU0lfREVGQVVMVF9NQVhfU0VDVE9SUzsKKworCS8qCisJICogYXNzdW1lIGEgNEdCIGJvdW5kYXJ5LCBpZiBub3Qgc2V0CisJICovCisJaWYgKHNodC0+ZG1hX2JvdW5kYXJ5KQorCQlzaG9zdC0+ZG1hX2JvdW5kYXJ5ID0gc2h0LT5kbWFfYm91bmRhcnk7CisJZWxzZQorCQlzaG9zdC0+ZG1hX2JvdW5kYXJ5ID0gMHhmZmZmZmZmZjsKKworCXJ2YWwgPSBzY3NpX3NldHVwX2NvbW1hbmRfZnJlZWxpc3Qoc2hvc3QpOworCWlmIChydmFsKQorCQlnb3RvIGZhaWxfa2ZyZWU7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CisJc25wcmludGYoc2hvc3QtPnNob3N0X2dlbmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiaG9zdCVkIiwKKwkJc2hvc3QtPmhvc3Rfbm8pOworCXNob3N0LT5zaG9zdF9nZW5kZXYucmVsZWFzZSA9IHNjc2lfaG9zdF9kZXZfcmVsZWFzZTsKKworCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZzaG9zdC0+c2hvc3RfY2xhc3NkZXYpOworCXNob3N0LT5zaG9zdF9jbGFzc2Rldi5kZXYgPSAmc2hvc3QtPnNob3N0X2dlbmRldjsKKwlzaG9zdC0+c2hvc3RfY2xhc3NkZXYuY2xhc3MgPSAmc2hvc3RfY2xhc3M7CisJc25wcmludGYoc2hvc3QtPnNob3N0X2NsYXNzZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgImhvc3QlZCIsCisJCSAgc2hvc3QtPmhvc3Rfbm8pOworCisJc2hvc3QtPmVoX25vdGlmeSA9ICZjb21wbGV0ZTsKKwlydmFsID0ga2VybmVsX3RocmVhZChzY3NpX2Vycm9yX2hhbmRsZXIsIHNob3N0LCAwKTsKKwlpZiAocnZhbCA8IDApCisJCWdvdG8gZmFpbF9kZXN0cm95X2ZyZWVsaXN0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRlKTsKKwlzaG9zdC0+ZWhfbm90aWZ5ID0gTlVMTDsKKworCXNjc2lfcHJvY19ob3N0ZGlyX2FkZChzaG9zdC0+aG9zdHQpOworCXJldHVybiBzaG9zdDsKKworIGZhaWxfZGVzdHJveV9mcmVlbGlzdDoKKwlzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzaG9zdCk7CisgZmFpbF9rZnJlZToKKwlrZnJlZShzaG9zdCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaG9zdF9hbGxvYyk7CisKK3N0cnVjdCBTY3NpX0hvc3QgKnNjc2lfcmVnaXN0ZXIoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCBpbnQgcHJpdnNpemUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2Moc2h0LCBwcml2c2l6ZSk7CisKKwlpZiAoIXNodC0+ZGV0ZWN0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2lfcmVnaXN0ZXIoKSBjYWxsZWQgb24gbmV3LXN0eWxlICIKKwkJCQkgICAgInRlbXBsYXRlIGZvciBkcml2ZXIgJXNcbiIsIHNodC0+bmFtZSk7CisJCWR1bXBfc3RhY2soKTsKKwl9CisKKwlpZiAoc2hvc3QpCisJCWxpc3RfYWRkX3RhaWwoJnNob3N0LT5zaHRfbGVnYWN5X2xpc3QsICZzaHQtPmxlZ2FjeV9ob3N0cyk7CisJcmV0dXJuIHNob3N0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlZ2lzdGVyKTsKKwordm9pZCBzY3NpX3VucmVnaXN0ZXIoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJbGlzdF9kZWwoJnNob3N0LT5zaHRfbGVnYWN5X2xpc3QpOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3VucmVnaXN0ZXIpOworCisvKioKKyAqIHNjc2lfaG9zdF9sb29rdXAgLSBnZXQgYSByZWZlcmVuY2UgdG8gYSBTY3NpX0hvc3QgYnkgaG9zdCBubworICoKKyAqIEBob3N0bnVtOglob3N0IG51bWJlciB0byBsb2NhdGUKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKglBIHBvaW50ZXIgdG8gbG9jYXRlZCBTY3NpX0hvc3Qgb3IgTlVMTC4KKyAqKi8KK3N0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9sb29rdXAodW5zaWduZWQgc2hvcnQgaG9zdG51bSkKK3sKKwlzdHJ1Y3QgY2xhc3MgKmNsYXNzID0gJnNob3N0X2NsYXNzOworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBFUlJfUFRSKC1FTlhJTyksICpwOworCisJZG93bl9yZWFkKCZjbGFzcy0+c3Vic3lzLnJ3c2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkZXYsICZjbGFzcy0+Y2hpbGRyZW4sIG5vZGUpIHsKKwkJcCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCQlpZiAocC0+aG9zdF9ubyA9PSBob3N0bnVtKSB7CisJCQlzaG9zdCA9IHNjc2lfaG9zdF9nZXQocCk7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cF9yZWFkKCZjbGFzcy0+c3Vic3lzLnJ3c2VtKTsKKworCXJldHVybiBzaG9zdDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ob3N0X2xvb2t1cCk7CisKKy8qKgorICogc2NzaV9ob3N0X2dldCAtIGluYyBhIFNjc2lfSG9zdCByZWYgY291bnQKKyAqIEBzaG9zdDoJUG9pbnRlciB0byBTY3NpX0hvc3QgdG8gaW5jLgorICoqLworc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2dldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAodGVzdF9iaXQoU0hPU1RfREVMLCAmc2hvc3QtPnNob3N0X3N0YXRlKSB8fAorCQkhZ2V0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldikpCisJCXJldHVybiBOVUxMOworCXJldHVybiBzaG9zdDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ob3N0X2dldCk7CisKKy8qKgorICogc2NzaV9ob3N0X3B1dCAtIGRlYyBhIFNjc2lfSG9zdCByZWYgY291bnQKKyAqIEBzaG9zdDoJUG9pbnRlciB0byBTY3NpX0hvc3QgdG8gZGVjLgorICoqLwordm9pZCBzY3NpX2hvc3RfcHV0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXB1dF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2hvc3RfcHV0KTsKKworaW50IHNjc2lfaW5pdF9ob3N0cyh2b2lkKQoreworCXJldHVybiBjbGFzc19yZWdpc3Rlcigmc2hvc3RfY2xhc3MpOworfQorCit2b2lkIHNjc2lfZXhpdF9ob3N0cyh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJnNob3N0X2NsYXNzKTsKK30KKworaW50IHNjc2lfaXNfaG9zdF9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gc2NzaV9ob3N0X2Rldl9yZWxlYXNlOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2lzX2hvc3RfZGV2aWNlKTsKKworLyoqCisgKiBzY3NpX3F1ZXVlX3dvcmsgLSBRdWV1ZSB3b3JrIHRvIHRoZSBTY3NpX0hvc3Qgd29ya3F1ZXVlLgorICogQHNob3N0OglQb2ludGVyIHRvIFNjc2lfSG9zdC4KKyAqIEB3b3JrOglXb3JrIHRvIHF1ZXVlIGZvciBleGVjdXRpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvICE9IDAgZm9yIGVycm9yCisgKiovCitpbnQgc2NzaV9xdWV1ZV93b3JrKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaWYgKHVubGlrZWx5KCFzaG9zdC0+d29ya19xKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJFUlJPUjogU2NzaSBob3N0ICclcycgYXR0ZW1wdGVkIHRvIHF1ZXVlIHNjc2ktd29yaywgIgorCQkJIndoZW4gbm8gd29ya3F1ZXVlIGNyZWF0ZWQuXG4iLCBzaG9zdC0+aG9zdHQtPm5hbWUpOworCQlkdW1wX3N0YWNrKCk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHF1ZXVlX3dvcmsoc2hvc3QtPndvcmtfcSwgd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX3F1ZXVlX3dvcmspOworCisvKioKKyAqIHNjc2lfZmx1c2hfd29yayAtIEZsdXNoIGEgU2NzaV9Ib3N0J3Mgd29ya3F1ZXVlLgorICogQHNob3N0OglQb2ludGVyIHRvIFNjc2lfSG9zdC4KKyAqKi8KK3ZvaWQgc2NzaV9mbHVzaF93b3JrKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmICghc2hvc3QtPndvcmtfcSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJFUlJPUjogU2NzaSBob3N0ICclcycgYXR0ZW1wdGVkIHRvIGZsdXNoIHNjc2ktd29yaywgIgorCQkJIndoZW4gbm8gd29ya3F1ZXVlIGNyZWF0ZWQuXG4iLCBzaG9zdC0+aG9zdHQtPm5hbWUpOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybjsKKwl9CisKKwlmbHVzaF93b3JrcXVldWUoc2hvc3QtPndvcmtfcSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2ZsdXNoX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmggYi9kcml2ZXJzL3Njc2kvaG9zdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjcyNjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmgKQEAgLTAsMCArMSwyIEBACisjd2FybmluZyAiVGhpcyBmaWxlIGlzIG9ic29sZXRlLCBwbGVhc2UgdXNlIDxzY3NpL3Njc2lfaG9zdC5oPiBpbnN0ZWFkIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtbWNhLmMgYi9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmZGVhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuYwpAQCAtMCwwICsxLDI0OTEgQEAKKy8qCisgTG93IExldmVsIExpbnV4IERyaXZlciBmb3IgdGhlIElCTSBNaWNyb2NoYW5uZWwgU0NTSSBTdWJzeXN0ZW0gZm9yCisgTGludXggS2VybmVsID49IDIuNC4wLgorIENvcHlyaWdodCAoYykgMTk5NSBTdHJvbSBTeXN0ZW1zLCBJbmMuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gV3JpdHRlbiBieSBNYXJ0aW4gS29saW5laywgRGVjZW1iZXIgMTk5NS4KKyBGdXJ0aGVyIGRldmVsb3BtZW50IGJ5OiBDaHJpcyBCZWF1cmVnYXJkLCBLbGF1cyBLdWRpZWxrYSwgTWljaGFlbCBMYW5nCisgU2VlIHRoZSBmaWxlIERvY3VtZW50YXRpb24vc2NzaS9pYm1tY2EudHh0IGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCisgb2YgdGhpcyBkcml2ZXIsIHRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMgYW5kIHRoZSBoaXN0b3J5IG9mIGl0cworIGRldmVsb3BtZW50LgorIFNlZSB0aGUgV1dXLXBhZ2U6IGh0dHA6Ly93d3cudW5pLW1haW56LmRlL35sYW5nbTAwMC9saW51eC5odG1sIGZvciBsYXRlc3QKKyB1cGRhdGVzLCBpbmZvIGFuZCBBREYtZmlsZXMgZm9yIGFkYXB0ZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKworIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgVXBkYXRlZCBmb3IgTGludXggMi41LjQ1IHRvIHVzZSB0aGUgbmV3IGVycm9yIGhhbmRsZXIsIGNsZWFuZWQgdXAgdGhlCisgbG9jayBtYWNyb3MgYW5kIGRpZCBhIGZldyB1bmF2b2lkYWJsZSBsb2NraW5nIHR3ZWFrcywgcGx1cyBvbmUgbG9ja2luZworIGZpeCBpbiB0aGUgaXJxIGFuZCBjb21wbGV0aW9uIHBhdGguCisgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2lmbmRlZiBMSU5VWF9WRVJTSU9OX0NPREUKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNDUpCisjZXJyb3IgIlRoaXMgZHJpdmVyIHdvcmtzIG9ubHkgd2l0aCBrZXJuZWwgMi41LjQ1IG9yIGhpZ2hlciEiCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImlibW1jYS5oIgorCisvKiBjdXJyZW50IHZlcnNpb24gb2YgdGhpcyBkcml2ZXItc291cmNlOiAqLworI2RlZmluZSBJQk1NQ0FfU0NTSV9EUklWRVJfVkVSU0lPTiAiNC4wYi1hYyIKKworLyogZHJpdmVyIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSU1fTUFYX0hPU1RTICAgICA4CS8qIG1heGltdW0gbnVtYmVyIG9mIGhvc3QgYWRhcHRlcnMgKi8KKyNkZWZpbmUgSU1fUkVTRVRfREVMQVkJNjAJLyogc2Vjb25kcyBhbGxvd2VkIGZvciBhIHJlc2V0ICovCisKKy8qIGRyaXZlciBkZWJ1Z2dpbmcgLSAjdW5kZWYgYWxsIGZvciBub3JtYWwgb3BlcmF0aW9uICovCisvKiBpZiBkZWZpbmVkOiBjb3VudCBpbnRlcnJ1cHRzIGFuZCBpZ25vcmUgdGhpcyBzcGVjaWFsIG9uZTogKi8KKyN1bmRlZglJTV9ERUJVR19USU1FT1VUCS8vNTAKKyNkZWZpbmUgVElNRU9VVF9QVU4JMAorI2RlZmluZSBUSU1FT1VUX0xVTgkwCisvKiB2ZXJib3NlIGludGVycnVwdDogKi8KKyN1bmRlZiBJTV9ERUJVR19JTlQKKy8qIHZlcmJvc2UgcXVldWVjb21tYW5kOiAqLworI3VuZGVmIElNX0RFQlVHX0NNRAorLyogdmVyYm9zZSBxdWV1Y29tbWFuZCBmb3Igc3BlY2lmaWMgU0NTSS1kZXZpY2UgdHlwZTogKi8KKyN1bmRlZiBJTV9ERUJVR19DTURfU1BFQ19ERVYKKy8qIHZlcmJvc2UgZGV2aWNlIHByb2JpbmcgKi8KKyN1bmRlZiBJTV9ERUJVR19QUk9CRQorCisvKiBkZXZpY2UgdHlwZSB0aGF0IHNoYWxsIGJlIGRpc3BsYXllZCBvbiBzeXNsb2cgKG9ubHkgZHVyaW5nIGRlYnVnZ2luZyk6ICovCisjZGVmaW5lIElNX0RFQlVHX0NNRF9ERVZJQ0UJVFlQRV9UQVBFCisKKy8qIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiBoYXJkd2FyZSByZWdpc3RlcnMgb24gYSBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUgSU1fQ01EX1JFRyhoaSkJKGhvc3RzWyhoaSldLT5pb19wb3J0KQkvKkNvbW1hbmQgSW50ZXJmYWNlLCAoNCBieXRlcyBsb25nKSAqLworI2RlZmluZSBJTV9BVFROX1JFRyhoaSkJKGhvc3RzWyhoaSldLT5pb19wb3J0KzQpCS8qQXR0ZW50aW9uICgxIGJ5dGUpICovCisjZGVmaW5lIElNX0NUUl9SRUcoaGkpCShob3N0c1soaGkpXS0+aW9fcG9ydCs1KQkvKkJhc2ljIENvbnRyb2wgKDEgYnl0ZSkgKi8KKyNkZWZpbmUgSU1fSU5UUl9SRUcoaGkpCShob3N0c1soaGkpXS0+aW9fcG9ydCs2KQkvKkludGVycnVwdCBTdGF0dXMgKDEgYnl0ZSwgci9vKSAqLworI2RlZmluZSBJTV9TVEFUX1JFRyhoaSkJKGhvc3RzWyhoaSldLT5pb19wb3J0KzcpCS8qQmFzaWMgU3RhdHVzICgxIGJ5dGUsIHJlYWQgb25seSkgKi8KKworLyogYmFzaWMgSS9PLXBvcnQgb2YgZmlyc3QgYWRhcHRlciAqLworI2RlZmluZSBJTV9JT19QT1JUCTB4MzU0MAorLyogbWF4aW11bSBudW1iZXIgb2YgaG9zdHMgdGhhdCBjYW4gYmUgZm91bmQgKi8KKyNkZWZpbmUgSU1fTl9JT19QT1JUCTgKKworLypyZXF1ZXN0cyBnb2luZyBpbnRvIHRoZSB1cHBlciBuaWJibGUgb2YgdGhlIEF0dGVudGlvbiByZWdpc3RlciAqLworLypub3RlOiB0aGUgbG93ZXIgbmliYmxlIHNwZWNpZmllcyB0aGUgZGV2aWNlKDAtMTQpLCBvciBzdWJzeXN0ZW0oMTUpICovCisjZGVmaW5lIElNX0lNTV9DTUQJMHgxMAkvKmltbWVkaWF0ZSBjb21tYW5kICovCisjZGVmaW5lIElNX1NDQgkJMHgzMAkvKlN1YnN5c3RlbSBDb250cm9sIEJsb2NrIGNvbW1hbmQgKi8KKyNkZWZpbmUgSU1fTE9OR19TQ0IJMHg0MAkvKmxvbmcgU3Vic3lzdGVtIENvbnRyb2wgQmxvY2sgY29tbWFuZCAqLworI2RlZmluZSBJTV9FT0kJCTB4ZTAJLyplbmQtb2YtaW50ZXJydXB0IHJlcXVlc3QgKi8KKworLyp2YWx1ZXMgZm9yIGJpdHMgNywxLDAgb2YgQmFzaWMgQ29udHJvbCByZWcuIChiaXRzIDYtMiByZXNlcnZlZCkgKi8KKyNkZWZpbmUgSU1fSFdfUkVTRVQJMHg4MAkvKmhhcmR3YXJlIHJlc2V0ICovCisjZGVmaW5lIElNX0VOQUJMRV9ETUEJMHgwMgkvKmVuYWJsZSBzdWJzeXN0ZW0ncyBidXNtYXN0ZXIgRE1BICovCisjZGVmaW5lIElNX0VOQUJMRV9JTlRSCTB4MDEJLyplbmFibGUgaW50ZXJydXB0cyB0byB0aGUgc3lzdGVtICovCisKKy8qdG8gaW50ZXJwcmV0IHRoZSB1cHBlciBuaWJibGUgb2YgSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlciAqLworLypub3RlOiB0aGUgbG93ZXIgbmliYmxlIHNwZWNpZmllcyB0aGUgZGV2aWNlKDAtMTQpLCBvciBzdWJzeXN0ZW0oMTUpICovCisjZGVmaW5lIElNX1NDQl9DTURfQ09NUExFVEVECQkJMHgxMAorI2RlZmluZSBJTV9TQ0JfQ01EX0NPTVBMRVRFRF9XSVRIX1JFVFJJRVMJMHg1MAorI2RlZmluZSBJTV9MT09QX1NDQVRURVJfQlVGRkVSX0ZVTEwJCTB4NjAKKyNkZWZpbmUgSU1fQURBUFRFUl9IV19GQUlMVVJFCQkJMHg3MAorI2RlZmluZSBJTV9JTU1FRElBVEVfQ01EX0NPTVBMRVRFRAkJMHhhMAorI2RlZmluZSBJTV9DTURfQ09NUExFVEVEX1dJVEhfRkFJTFVSRQkJMHhjMAorI2RlZmluZSBJTV9DTURfRVJST1IJCQkJMHhlMAorI2RlZmluZSBJTV9TT0ZUV0FSRV9TRVFVRU5DSU5HX0VSUk9SCQkweGYwCisKKy8qdG8gaW50ZXJwcmV0IGJpdHMgMy0wIG9mIEJhc2ljIFN0YXR1cyByZWdpc3RlciAoYml0cyA3LTQgcmVzZXJ2ZWQpICovCisjZGVmaW5lIElNX0NNRF9SRUdfRlVMTAkJMHgwOAorI2RlZmluZSBJTV9DTURfUkVHX0VNUFRZCTB4MDQKKyNkZWZpbmUgSU1fSU5UUl9SRVFVRVNUCQkweDAyCisjZGVmaW5lIElNX0JVU1kJCQkweDAxCisKKy8qaW1tZWRpYXRlIGNvbW1hbmRzICh3b3JkIHdyaXR0ZW4gaW50byBsb3cgMiBieXRlcyBvZiBjb21tYW5kIHJlZykgKi8KKyNkZWZpbmUgSU1fUkVTRVRfSU1NX0NNRAkweDA0MDAKKyNkZWZpbmUgSU1fRkVBVFVSRV9DVFJfSU1NX0NNRAkweDA0MGMKKyNkZWZpbmUgSU1fRE1BX1BBQ0lOR19JTU1fQ01ECTB4MDQwZAorI2RlZmluZSBJTV9BU1NJR05fSU1NX0NNRAkweDA0MGUKKyNkZWZpbmUgSU1fQUJPUlRfSU1NX0NNRAkweDA0MGYKKyNkZWZpbmUgSU1fRk9STUFUX1BSRVBfSU1NX0NNRAkweDA0MTcKKworLypTQ0IgKFN1YnN5c3RlbSBDb250cm9sIEJsb2NrKSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpbV9zY2IgeworCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQ7CS8qY29tbWFuZCB3b3JkIChyZWFkLCBldGMuKSAqLworCXVuc2lnbmVkIHNob3J0IGVuYWJsZTsJLyplbmFibGUgd29yZCwgbW9kaWZpZXMgY21kICovCisJdW5pb24geworCQl1bnNpZ25lZCBsb25nIGxvZ19ibGtfYWRyOwkvKmJsb2NrIGFkZHJlc3Mgb24gU0NTSSBkZXZpY2UgKi8KKwkJdW5zaWduZWQgY2hhciBzY3NpX2NtZF9sZW5ndGg7CS8qNiwxMCwxMiwgZm9yIG90aGVyIHNjc2kgY21kICovCisJfSB1MTsKKwl1bnNpZ25lZCBsb25nIHN5c19idWZfYWRyOwkvKnBoeXNpY2FsIHN5c3RlbSBtZW1vcnkgYWRyICovCisJdW5zaWduZWQgbG9uZyBzeXNfYnVmX2xlbmd0aDsJLypzaXplIG9mIHN5cyBtZW0gYnVmZmVyICovCisJdW5zaWduZWQgbG9uZyB0c2JfYWRyOwkvKlRlcm1pbmF0aW9uIFN0YXR1cyBCbG9jayBhZHIgKi8KKwl1bnNpZ25lZCBsb25nIHNjYl9jaGFpbl9hZHI7CS8qb3B0aW9uYWwgU0NCIGNoYWluIGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBzaG9ydCBjb3VudDsJLypibG9jayBjb3VudCwgb24gU0NTSSBkZXZpY2UgKi8KKwkJCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsJLypibG9jayBsZW5ndGgsIG9uIFNDU0kgZGV2aWNlICovCisJCX0gYmxrOworCQl1bnNpZ25lZCBjaGFyIHNjc2lfY29tbWFuZFsxMl07CS8qb3RoZXIgc2NzaSBjb21tYW5kICovCisJfSB1MjsKK307CisKKy8qc3RydWN0dXJlIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnQgKGZvciBsaXN0IG9mIHN5c3RlbSBtZW1vcnkgYXJlYXMpICovCitzdHJ1Y3QgaW1fc2dlIHsKKwl2b2lkICphZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgYnl0ZV9sZW5ndGg7Cit9OworCisvKnN0cnVjdHVyZSByZXR1cm5lZCBieSBhIGdldF9wb3NfaW5mbyBjb21tYW5kOiAqLworc3RydWN0IGltX3Bvc19pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBwb3NfaWQ7CS8qIGFkYXB0ZXIgaWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc18zYTsJLyogcG9zIDMgKGlmIHBvcyA2ID0gMCkgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc18yOwkvKiBwb3MgMiAqLworCXVuc2lnbmVkIGNoYXIgaW50X2xldmVsOwkvKiBpbnRlcnJ1cHQgbGV2ZWwgSVJRIDExIG9yIDE0ICovCisJdW5zaWduZWQgY2hhciBwb3NfNGE7CS8qIHBvcyA0IChpZiBwb3MgNiA9IDApICovCisJdW5zaWduZWQgc2hvcnQgY29ubmVjdG9yX3NpemU7CS8qIE1DQSBjb25uZWN0b3Igc2l6ZTogMTYgb3IgMzIgQml0ICovCisJdW5zaWduZWQgY2hhciBudW1fbHVuczsJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBsdW5zIHBlciBkZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyIG51bV9wdW5zOwkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHB1bnMgKi8KKwl1bnNpZ25lZCBjaGFyIHBhY2luZ19mYWN0b3I7CS8qIHBhY2luZyBmYWN0b3IgKi8KKwl1bnNpZ25lZCBjaGFyIG51bV9sZG5zOwkvKiBudW1iZXIgb2YgbGRucyBhdmFpbGFibGUgKi8KKwl1bnNpZ25lZCBjaGFyIGVvaV9vZmY7CS8qIHRpbWUgRU9JIGFuZCBpbnRlcnJ1cHQgaW5hY3RpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIG1heF9idXN5OwkvKiB0aW1lIGJldHdlZW4gcmVzZXQgYW5kIGJ1c3kgb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBjYWNoZV9zdGF0OwkvKiBsZG4gY2FjaGVzdGF0LiBCaXQ9MSA9IG5vdCBjYWNoZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCByZXRyeV9zdGF0OwkvKiByZXRyeSBzdGF0dXMgb2YgbGRucy4gQml0PTE9ZGlzYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc180YjsJLyogcG9zIDQgKGlmIHBvcyA2ID0gMSkgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc18zYjsJLyogcG9zIDMgKGlmIHBvcyA2ID0gMSkgKi8KKwl1bnNpZ25lZCBjaGFyIHBvc182OwkvKiBwb3MgNiAqLworCXVuc2lnbmVkIGNoYXIgcG9zXzU7CS8qIHBvcyA1ICovCisJdW5zaWduZWQgc2hvcnQgbWF4X292ZXJsYXA7CS8qIG1heGltdW0gb3ZlcmxhcHBpbmcgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBudW1fYnVzOwkvKiBudW1iZXIgb2YgU0NTSS1idXNzZXMgKi8KK307CisKKy8qdmFsdWVzIGZvciBTQ0IgY29tbWFuZCB3b3JkICovCisjZGVmaW5lIElNX05PX1NZTkNIUk9OT1VTICAgICAgMHgwMDQwCS8qZmxhZyBmb3IgYW55IGNvbW1hbmQgKi8KKyNkZWZpbmUgSU1fTk9fRElTQ09OTkVDVCAgICAgICAweDAwODAJLypmbGFnIGZvciBhbnkgY29tbWFuZCAqLworI2RlZmluZSBJTV9SRUFEX0RBVEFfQ01EICAgICAgIDB4MWMwMQorI2RlZmluZSBJTV9XUklURV9EQVRBX0NNRCAgICAgIDB4MWMwMgorI2RlZmluZSBJTV9SRUFEX1ZFUklGWV9DTUQgICAgIDB4MWMwMworI2RlZmluZSBJTV9XUklURV9WRVJJRllfQ01EICAgIDB4MWMwNAorI2RlZmluZSBJTV9SRVFVRVNUX1NFTlNFX0NNRCAgIDB4MWMwOAorI2RlZmluZSBJTV9SRUFEX0NBUEFDSVRZX0NNRCAgIDB4MWMwOQorI2RlZmluZSBJTV9ERVZJQ0VfSU5RVUlSWV9DTUQgIDB4MWMwYgorI2RlZmluZSBJTV9SRUFEX0xPR0lDQUxfQ01EICAgIDB4MWMyYQorI2RlZmluZSBJTV9PVEhFUl9TQ1NJX0NNRF9DTUQgIDB4MjQxZgorCisvKiB1bnVzZWQsIGJ1dCBzdXBwb3J0ZWQsIFNDQiBjb21tYW5kcyAqLworI2RlZmluZSBJTV9HRVRfQ09NTUFORF9DT01QTEVURV9TVEFUVVNfQ01EICAgMHgxYzA3CS8qIGNvbW1hbmQgc3RhdHVzICovCisjZGVmaW5lIElNX0dFVF9QT1NfSU5GT19DTUQgICAgICAgICAgICAgICAgICAweDFjMGEJLyogcmV0dXJucyBuZWF0IHN0dWZmICovCisjZGVmaW5lIElNX1JFQURfUFJFRkVUQ0hfQ01EICAgICAgICAgICAgICAgICAweDFjMzEJLyogY2FjaGluZyBjb250cm9sbGVyIG9ubHkgKi8KKyNkZWZpbmUgSU1fRk9NQVRfVU5JVF9DTUQgICAgICAgICAgICAgICAgICAgIDB4MWMxNgkvKiBmb3JtYXQgdW5pdCAqLworI2RlZmluZSBJTV9SRUFTU0lHTl9CTE9DS19DTUQgICAgICAgICAgICAgICAgMHgxYzE4CS8qIGluIGNhc2Ugb2YgZXJyb3IgKi8KKworLyp2YWx1ZXMgdG8gc2V0IGJpdHMgaW4gdGhlIGVuYWJsZSB3b3JkIG9mIFNDQiAqLworI2RlZmluZSBJTV9SRUFEX0NPTlRST0wgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJTV9SRVBPUlRfVFNCX09OTFlfT05fRVJST1IgIDB4NDAwMAorI2RlZmluZSBJTV9SRVRSWV9FTkFCTEUgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBJTV9QT0lOVEVSX1RPX0xJU1QgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBJTV9TVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCAgIDB4MDQwMAorI2RlZmluZSBJTV9CWVBBU1NfQlVGRkVSICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJTV9DSEFJTl9PTl9OT19FUlJPUiAgICAgICAgIDB4MDAwMQorCisvKlRTQiAoVGVybWluYXRpb24gU3RhdHVzIEJsb2NrKSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpbV90c2IgeworCXVuc2lnbmVkIHNob3J0IGVuZF9zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQxOworCXVuc2lnbmVkIGxvbmcgcmVzaWR1YWxfYnl0ZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHNnX2xpc3RfZWxlbWVudF9hZHI7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIGRldl9zdGF0dXM7CisJdW5zaWduZWQgY2hhciBjbWRfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZGV2X2Vycm9yOworCXVuc2lnbmVkIGNoYXIgY21kX2Vycm9yOworCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkMjsKKwl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDM7CisJdW5zaWduZWQgc2hvcnQgbG93X29mX2xhc3Rfc2NiX2FkcjsKKwl1bnNpZ25lZCBzaG9ydCBoaWdoX29mX2xhc3Rfc2NiX2FkcjsKK307CisKKy8qc3Vic3lzdGVtIHVzZXMgaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgMTQgKi8KKyNkZWZpbmUgSU1fSVJRICAgICAxNAorLypTQ1NJLTIgRi9XIG1heSBldmFkZSB0byBpbnRlcnJ1cHQgMTEgKi8KKyNkZWZpbmUgSU1fSVJRX0ZXICAxMQorCisvKiBNb2RlbCA5NSBoYXMgYW4gYWRkaXRpb25hbCBhbHBoYW51bWVyaWMgZGlzcGxheSwgd2hpY2ggY2FuIGJlIHVzZWQKKyAgIHRvIGRpc3BsYXkgU0NTSS1hY3Rpdml0aWVzLiA4NTk1IG1vZGVscyBkbyBub3QgaGF2ZSBhbnkgZGlzayBsZWQsIHdoaWNoCisgICBtYWtlcyB0aGlzIGZlYXR1cmUgcXVpdGUgdXNlZnVsLgorICAgVGhlIHJlZ3VsYXIgUFMvMiBkaXNrIGxlZCBpcyB0dXJuZWQgb24vb2ZmIGJ5IGJpdHMgNiw3IG9mIHN5c3RlbQorICAgY29udHJvbCBwb3J0LiAqLworCisvKiBMRUQgZGlzcGxheS1wb3J0IChhY3R1YWxseSwgbGFzdCBMRUQgb24gZGlzcGxheSkgKi8KKyNkZWZpbmUgTU9EOTVfTEVEX1BPUlQJICAgMHgxMDgKKy8qIHN5c3RlbS1jb250cm9sLXJlZ2lzdGVyIG9mIFBTLzJzIHdpdGggZGlza2luZGljYXRvciAqLworI2RlZmluZSBQUzJfU1lTX0NUUiAgICAgICAgMHg5MgorLyogYWN0aXZpdHkgZGlzcGxheWluZyBtZXRob2RzICovCisjZGVmaW5lIExFRF9ESVNQICAgICAgICAgICAxCisjZGVmaW5lIExFRF9BRElTUCAgICAgICAgICAyCisjZGVmaW5lIExFRF9BQ1RJVklUWSAgICAgICA0CisvKiBmYWlsZWQgaW50ciAqLworI2RlZmluZSBDTURfRkFJTCAgICAgICAgICAgMjU1CisKKy8qIFRoZSBTQ1NJLUlEKCEpIG9mIHRoZSBhY2Nlc3NlZCBTQ1NJLWRldmljZSBpcyBzaG93biBvbiBQUy8yLTk1IG1hY2hpbmVzJyBMRUQKKyAgIGRpc3BsYXlzLiBsZG4gaXMgbm8gbG9uZ2VyIGRpc3BsYXllZCBoZXJlLCBiZWNhdXNlIHRoZSBsZG4gbWFwcGluZyBpcyBub3cgCisgICBkb25lIGR5bmFtaWNhbGx5IGFuZCB0aGUgbGRuIDwtPiBwdW4sbHVuIG1hcHMgY2FuIGJlIGxvb2tlZC11cCBhdCBib290dGltZSAKKyAgIG9yIGR1cmluZyB1cHRpbWUgaW4gL3Byb2Mvc2NzaS9pYm1tY2EvPGhvc3Rfbm8+IGluIGNhc2Ugb2YgdHJvdWJsZSwgCisgICBpbnRlcmVzdCwgZGVidWdnaW5nIG9yIGp1c3QgZm9yIGhhdmluZyBmdW4uIFRoZSBsZWZ0IG51bWJlciBnaXZlcyB0aGUKKyAgIGhvc3QtYWRhcHRlciBudW1iZXIgYW5kIHRoZSByaWdodCBzaG93cyB0aGUgYWNjZXNzZWQgU0NTSS1JRC4gKi8KKworLyogZGlzcGxheV9tb2RlIGlzIHNldCBieSB0aGUgaWJtbWNhc2NzaT0gY29tbWFuZCBsaW5lIGFyZyAqLworc3RhdGljIGludCBkaXNwbGF5X21vZGUgPSAwOworLyogc2V0IGRlZmF1bHQgYWRhcHRlciB0aW1lb3V0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFkYXB0ZXJfdGltZW91dCA9IDQ1OworLyogZm9yIHByb2Jpbmcgb24gZmVhdHVyZS1jb21tYW5kOiAqLworc3RhdGljIHVuc2lnbmVkIGludCBnbG9iYWxfY29tbWFuZF9lcnJvcl9leGN1c2UgPSAwOworLyogZ2xvYmFsIHNldHRpbmcgYnkgY29tbWFuZCBsaW5lIGZvciBhZGFwdGVyX3NwZWVkICovCitzdGF0aWMgaW50IGdsb2JhbF9hZGFwdGVyX3NwZWVkID0gMDsJLyogZnVsbCBzcGVlZCBieSBkZWZhdWx0ICovCisKKy8qIFBhbmVsIC8gTEVEIG9uLCBkbyBpdCByaWdodCBmb3IgRi9XIGFkZHJlc3NpbiwgdG9vLiBhZGlzcGxheSB3aWxsCisgKiBqdXN0IGlnbm9yZSBpZHM+NywgYXMgdGhlIHBhbmVsIGhhcyBvbmx5IDcgZGlnaXRzIGF2YWlsYWJsZSAqLworI2RlZmluZSBQUzJfRElTS19MRURfT04oYWQsaWQpIHsgaWYgKGRpc3BsYXlfbW9kZSAmIExFRF9ESVNQKSB7IGlmIChpZD45KSBcCisgICAgb3V0dygoYWQrNDgpfCgoaWQrNTUpPDw4KSwgTU9EOTVfTEVEX1BPUlQgKTsgZWxzZSBcCisgICAgb3V0dygoYWQrNDgpfCgoaWQrNDgpPDw4KSwgTU9EOTVfTEVEX1BPUlQgKTsgfSBlbHNlIFwKKyAgICBpZiAoZGlzcGxheV9tb2RlICYgTEVEX0FESVNQKSB7IGlmIChpZDw3KSBvdXRiKChjaGFyKShpZCs0OCksTU9EOTVfTEVEX1BPUlQrMStpZCk7IFwKKyAgICBvdXRiKChjaGFyKShhZCs0OCksIE1PRDk1X0xFRF9QT1JUKTsgfSBcCisgICAgaWYgKChkaXNwbGF5X21vZGUgJiBMRURfQUNUSVZJVFkpfHwoIWRpc3BsYXlfbW9kZSkpIFwKKyAgICBvdXRiKGluYihQUzJfU1lTX0NUUikgfCAweGMwLCBQUzJfU1lTX0NUUik7IH0KKworLyogUGFuZWwgLyBMRUQgb2ZmICovCisvKiBidWcgZml4ZWQsIERlYyAxNSwgMTk5Nywgd2hlcmUgfCB3YXMgcmVwbGFjZWQgYnkgJiBoZXJlICovCisjZGVmaW5lIFBTMl9ESVNLX0xFRF9PRkYoKSB7IGlmIChkaXNwbGF5X21vZGUgJiBMRURfRElTUCkgXAorICAgIG91dHcoMHgyMDIwLCBNT0Q5NV9MRURfUE9SVCApOyBlbHNlIGlmIChkaXNwbGF5X21vZGUgJiBMRURfQURJU1ApIHsgXAorICAgIG91dGwoMHgyMDIwMjAyMCxNT0Q5NV9MRURfUE9SVCk7IG91dGwoMHgyMDIwMjAyMCxNT0Q5NV9MRURfUE9SVCs0KTsgfSBcCisgICAgaWYgKChkaXNwbGF5X21vZGUgJiBMRURfQUNUSVZJVFkpfHwoIWRpc3BsYXlfbW9kZSkpIFwKKyAgICBvdXRiKGluYihQUzJfU1lTX0NUUikgJiAweDNmLCBQUzJfU1lTX0NUUik7IH0KKworLypsaXN0IG9mIHN1cHBvcnRlZCBzdWJzeXN0ZW1zICovCitzdHJ1Y3Qgc3Vic3lzX2xpc3Rfc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBtY2FfaWQ7CisJY2hhciAqZGVzY3JpcHRpb247Cit9OworCisvKiB0eXBlcyBvZiBkaWZmZXJlbnQgc3VwcG9ydGVkIGhhcmR3YXJlIHRoYXQgZ29lcyB0byBob3N0ZGF0YSBzcGVjaWFsICovCisjZGVmaW5lIElCTV9TQ1NJMl9GVyAgICAgMAorI2RlZmluZSBJQk1fNzU2OF9XQ0FDSEUgIDEKKyNkZWZpbmUgSUJNX0VYUF9VTklUICAgICAyCisjZGVmaW5lIElCTV9TQ1NJX1dDQUNIRSAgMworI2RlZmluZSBJQk1fU0NTSSAgICAgICAgIDQKKworLyogb3RoZXIgc3BlY2lhbCBmbGFncyBmb3IgaG9zdGRhdGEgc3RydWN0dXJlICovCisjZGVmaW5lIEZPUkNFRF9ERVRFQ1RJT04gICAgICAgICAxMDAKKyNkZWZpbmUgSU5URUdSQVRFRF9TQ1NJICAgICAgICAgIDEwMQorCisvKiBMaXN0IG9mIHBvc3NpYmxlIElCTS1TQ1NJLWFkYXB0ZXJzICovCitzdGF0aWMgc3RydWN0IHN1YnN5c19saXN0X3N0cnVjdCBzdWJzeXNfbGlzdFtdID0geworCXsweDhlZmMsICJJQk0gU0NTSS0yIEYvVyBBZGFwdGVyIn0sCS8qIHNwZWNpYWwgPSAwICovCisJezB4OGVmZCwgIklCTSA3NTY4IEluZHVzdHJpYWwgQ29tcHV0ZXIgU0NTSSBBZGFwdGVyIHcvQ2FjaGUifSwJLyogc3BlY2lhbCA9IDEgKi8KKwl7MHg4ZWY4LCAiSUJNIEV4cGFuc2lvbiBVbml0IFNDU0kgQ29udHJvbGxlciJ9LAkvKiBzcGVjaWFsID0gMiAqLworCXsweDhlZmYsICJJQk0gU0NTSSBBZGFwdGVyIHcvQ2FjaGUifSwJLyogc3BlY2lhbCA9IDMgKi8KKwl7MHg4ZWZlLCAiSUJNIFNDU0kgQWRhcHRlciJ9LAkvKiBzcGVjaWFsID0gNCAqLworfTsKKworLyogTWF4IG51bWJlciBvZiBsb2dpY2FsIGRldmljZXMgKGNhbiBiZSB1cCBmcm9tIDAgdG8gMTQpLiAgMTUgaXMgdGhlIGFkZHJlc3MKK29mIHRoZSBhZGFwdGVyIGl0c2VsZi4gKi8KKyNkZWZpbmUgTUFYX0xPR19ERVYgIDE1CisKKy8qbG9jYWwgZGF0YSBmb3IgYSBsb2dpY2FsIGRldmljZSAqLworc3RydWN0IGxvZ2ljYWxfZGV2aWNlIHsKKwlzdHJ1Y3QgaW1fc2NiIHNjYjsJLyogU0NTSS1zdWJzeXN0ZW0tY29udHJvbC1ibG9jayBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgaW1fdHNiIHRzYjsJLyogU0NTSSBjb21tYW5kIGNvbXBsZXRlIHN0YXR1cyBibG9jayBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgaW1fc2dlIHNnZVsxNl07CS8qIHNjYXR0ZXIgZ2F0aGVyIGxpc3Qgc3RydWN0dXJlICovCisJdW5zaWduZWQgY2hhciBidWZbMjU2XTsJLyogU0NTSSBjb21tYW5kIHJldHVybiBkYXRhIGJ1ZmZlciAqLworCVNjc2lfQ21uZCAqY21kOwkJLyogU0NTSS1jb21tYW5kIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzICovCisJaW50IGRldmljZV90eXBlOwkvKiB0eXBlIG9mIHRoZSBTQ1NJLWRldmljZS4gU2VlIGluY2x1ZGUvc2NzaS9zY3NpLmgKKwkJCQkgICBmb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBvc3NpYmxlIHZhbHVlcyAqLworCWludCBibG9ja19sZW5ndGg7CS8qIGJsb2Nrc2l6ZSBvZiBhIHBhcnRpY3VsYXIgbG9naWNhbCBTQ1NJLWRldmljZSAqLworCWludCBjYWNoZV9mbGFnOwkJLyogMSBpZiB0aGlzIGlzIHVuY2FjaGVkLCAwIGlmIGNhY2hlIGlzIHByZXNlbnQgZm9yIGxkbiAqLworCWludCByZXRyeV9mbGFnOwkJLyogMSBpZiBhZGFwdGVyIHJldHJ5IGlzIGRpc2FibGVkLCAwIGlmIGVuYWJsZWQgKi8KK307CisKKy8qIHN0YXRpc3RpY3Mgb2YgdGhlIGRyaXZlciBkdXJpbmcgb3BlcmF0aW9ucyAoZm9yIHByb2NfaW5mbykgKi8KK3N0cnVjdCBEcml2ZXJfU3RhdGlzdGljcyB7CisJLyogU0NTSSBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyICovCisJaW50IGxkbl9hY2Nlc3NbTUFYX0xPR19ERVYgKyAxXTsJLyogdG90YWwgYWNjZXNzZXMgb24gYSBsZG4gKi8KKwlpbnQgbGRuX3JlYWRfYWNjZXNzW01BWF9MT0dfREVWICsgMV07CS8qIHRvdGFsIHJlYWQtYWNjZXNzIG9uIGEgbGRuICovCisJaW50IGxkbl93cml0ZV9hY2Nlc3NbTUFYX0xPR19ERVYgKyAxXTsJLyogdG90YWwgd3JpdGUtYWNjZXNzIG9uIGEgbGRuICovCisJaW50IGxkbl9pbnF1aXJ5X2FjY2Vzc1tNQVhfTE9HX0RFViArIDFdOwkvKiB0b3RhbCBpbnF1aXJpZXMgb24gYSBsZG4gKi8KKwlpbnQgbGRuX21vZGVzZWxlY3RfYWNjZXNzW01BWF9MT0dfREVWICsgMV07CS8qIHRvdGFsIG1vZGUgc2VsZWN0cyBvbiBsZG4gKi8KKwlpbnQgc2NiczsJCS8qIHNob3J0IFNDQnMgcXVldWVkICovCisJaW50IGxvbmdfc2NiczsJCS8qIGxvbmcgU0NCcyBxdWV1ZWQgKi8KKwlpbnQgdG90YWxfYWNjZXNzZXM7CS8qIHRvdGFsIGFjY2Vzc2VzIG9uIGFsbCBsZG5zICovCisJaW50IHRvdGFsX2ludGVycnVwdHM7CS8qIHRvdGFsIGludGVycnVwdHMgKHNob3VsZCBiZQorCQkJCSAgIHNhbWUgYXMgdG90YWxfYWNjZXNzZXMpICovCisJaW50IHRvdGFsX2Vycm9yczsJLyogY29tbWFuZCBjb21wbGV0ZWQgd2l0aCBlcnJvciAqLworCS8qIGR5bmFtaWNhbCBhc3NpZ25tZW50IHN0YXRpc3RpY3MgKi8KKwlpbnQgdG90YWxfc2NzaV9kZXZpY2VzOwkvKiBudW1iZXIgb2YgcGh5c2ljYWwgcHVuLGx1biAqLworCWludCBkeW5fZmxhZzsJCS8qIGZsYWcgc2hvd2luZyBkeW5hbWljYWwgbW9kZSAqLworCWludCBkeW5hbWljYWxfYXNzaWdubWVudHM7CS8qIG51bWJlciBvZiByZW1hcHBpbmdzIG9mIGxkbnMgKi8KKwlpbnQgbGRuX2Fzc2lnbm1lbnRzW01BWF9MT0dfREVWICsgMV07CS8qIG51bWJlciBvZiByZW1hcHBpbmdzIG9mIGVhY2gKKwkJCQkJCSAgIGxkbiAqLworfTsKKworLyogZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggaG9zdCBhZGFwdGVyICovCitzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhIHsKKwkvKiBhcnJheSBvZiBsb2dpY2FsIGRldmljZXM6ICovCisJc3RydWN0IGxvZ2ljYWxfZGV2aWNlIF9sZFtNQVhfTE9HX0RFViArIDFdOworCS8qIGFycmF5IHRvIGNvbnZlcnQgKHB1biwgbHVuKSBpbnRvIGxvZ2ljYWwgZGV2aWNlIG51bWJlcjogKi8KKwl1bnNpZ25lZCBjaGFyIF9nZXRfbGRuWzE2XVs4XTsKKwkvKmFycmF5IHRoYXQgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaHlzaWNhbCBTQ1NJLWRldmljZXMKKwkgICBhdHRhY2hlZCB0byB0aGlzIGhvc3QgYWRhcHRlcjogKi8KKwl1bnNpZ25lZCBjaGFyIF9nZXRfc2NzaVsxNl1bOF07CisJLyogdXNlZCBvbmx5IHdoZW4gY2hlY2tpbmcgbG9naWNhbCBkZXZpY2VzOiAqLworCWludCBfbG9jYWxfY2hlY2tpbmdfcGhhc2VfZmxhZzsKKwkvKiByZXBvcnQgcmVjZWl2ZWQgaW50ZXJydXB0OiAqLworCWludCBfZ290X2ludGVycnVwdDsKKwkvKiByZXBvcnQgdGVybWluYXRpb24tc3RhdHVzIG9mIFNDU0ktY29tbWFuZDogKi8KKwlpbnQgX3N0YXRfcmVzdWx0OworCS8qIHJlc2V0IHN0YXR1cyAodXNlZCBvbmx5IHdoZW4gZG9pbmcgcmVzZXQpOiAqLworCWludCBfcmVzZXRfc3RhdHVzOworCS8qIGNvZGUgb2YgdGhlIGxhc3QgU0NTSSBjb21tYW5kIChuZWVkZWQgZm9yIHBhbmljIGluZm8pOiAqLworCWludCBfbGFzdF9zY3NpX2NvbW1hbmRbTUFYX0xPR19ERVYgKyAxXTsKKwkvKiBpZGVudGlmaWVyIG9mIHRoZSBsYXN0IFNDU0ktY29tbWFuZCB0eXBlICovCisJaW50IF9sYXN0X3Njc2lfdHlwZVtNQVhfTE9HX0RFViArIDFdOworCS8qIGxhc3QgYmxvY2tjb3VudCAqLworCWludCBfbGFzdF9zY3NpX2Jsb2NrY291bnRbTUFYX0xPR19ERVYgKyAxXTsKKwkvKiBsYXN0IGxvY2dpY2FsIGJsb2NrIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nIF9sYXN0X3Njc2lfbG9naWNhbF9ibG9ja1tNQVhfTE9HX0RFViArIDFdOworCS8qIENvdW50ZXIgdGhhdCBwb2ludHMgb24gdGhlIG5leHQgcmVhc3NpZ25hYmxlIGxkbiBmb3IgZHluYW1pY2FsCisJICAgcmVtYXBwaW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA3LCB0aGF0IGlzIHRoZSBmaXJzdCByZWFzc2lnbmFibGUKKwkgICBudW1iZXIgaW4gdGhlIGxpc3QgYXQgYm9vdHRpbWU6ICovCisJaW50IF9uZXh0X2xkbjsKKwkvKiBTdGF0aXN0aWNzLXN0cnVjdHVyZSBmb3IgdGhpcyBJQk0tU0NTSS1ob3N0OiAqLworCXN0cnVjdCBEcml2ZXJfU3RhdGlzdGljcyBfSUJNX0RTOworCS8qIFRoaXMgaG9zdGFkYXB0ZXJzIHBvcy1yZWdpc3RlcnMgcG9zMiB1bnRpbCBwb3M2ICovCisJdW5zaWduZWQgaW50IF9wb3NbOF07CisJLyogYXNzaWduIGEgc3BlY2lhbCB2YXJpYWJsZSwgdGhhdCBjb250YWlucyBkZWRpY2F0ZWQgaW5mbyBhYm91dCB0aGUKKwkgICBhZGFwdGVydHlwZSAqLworCWludCBfc3BlY2lhbDsKKwkvKiBjb25uZWN0b3Igc2l6ZSBvbiB0aGUgTUNBIGJ1cyAqLworCWludCBfY29ubmVjdG9yX3NpemU7CisJLyogc3luY2hyb25vdXMgU0NTSSB0cmFuc2ZlciByYXRlIGJpdHBhdHRlcm4gKi8KKwlpbnQgX2FkYXB0ZXJfc3BlZWQ7Cit9OworCisvKiBtYWNyb3MgdG8gYWNjZXNzIGhvc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgc3Vic3lzdGVtX3B1bihoaSkgKGhvc3RzWyhoaSldLT50aGlzX2lkKQorI2RlZmluZSBzdWJzeXN0ZW1fbWF4aWQoaGkpIChob3N0c1soaGkpXS0+bWF4X2lkKQorI2RlZmluZSBsZChoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fbGQpCisjZGVmaW5lIGdldF9sZG4oaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2dldF9sZG4pCisjZGVmaW5lIGdldF9zY3NpKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9nZXRfc2NzaSkKKyNkZWZpbmUgbG9jYWxfY2hlY2tpbmdfcGhhc2VfZmxhZyhoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fbG9jYWxfY2hlY2tpbmdfcGhhc2VfZmxhZykKKyNkZWZpbmUgZ290X2ludGVycnVwdChoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fZ290X2ludGVycnVwdCkKKyNkZWZpbmUgc3RhdF9yZXN1bHQoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3N0YXRfcmVzdWx0KQorI2RlZmluZSByZXNldF9zdGF0dXMoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3Jlc2V0X3N0YXR1cykKKyNkZWZpbmUgbGFzdF9zY3NpX2NvbW1hbmQoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2xhc3Rfc2NzaV9jb21tYW5kKQorI2RlZmluZSBsYXN0X3Njc2lfdHlwZShoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fbGFzdF9zY3NpX3R5cGUpCisjZGVmaW5lIGxhc3Rfc2NzaV9ibG9ja2NvdW50KGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9sYXN0X3Njc2lfYmxvY2tjb3VudCkKKyNkZWZpbmUgbGFzdF9zY3NpX2xvZ2ljYWxfYmxvY2soaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2xhc3Rfc2NzaV9sb2dpY2FsX2Jsb2NrKQorI2RlZmluZSBsYXN0X3Njc2lfdHlwZShoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fbGFzdF9zY3NpX3R5cGUpCisjZGVmaW5lIG5leHRfbGRuKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9uZXh0X2xkbikKKyNkZWZpbmUgSUJNX0RTKGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9JQk1fRFMpCisjZGVmaW5lIHNwZWNpYWwoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3NwZWNpYWwpCisjZGVmaW5lIHN1YnN5c3RlbV9jb25uZWN0b3Jfc2l6ZShoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fY29ubmVjdG9yX3NpemUpCisjZGVmaW5lIGFkYXB0ZXJfc3BlZWQoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X2FkYXB0ZXJfc3BlZWQpCisjZGVmaW5lIHBvczIoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3Bvc1syXSkKKyNkZWZpbmUgcG9zMyhoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fcG9zWzNdKQorI2RlZmluZSBwb3M0KGhpKSAoKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIGhvc3RzWyhoaSldLT5ob3N0ZGF0YSktPl9wb3NbNF0pCisjZGVmaW5lIHBvczUoaGkpICgoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgaG9zdHNbKGhpKV0tPmhvc3RkYXRhKS0+X3Bvc1s1XSkKKyNkZWZpbmUgcG9zNihoaSkgKCgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBob3N0c1soaGkpXS0+aG9zdGRhdGEpLT5fcG9zWzZdKQorCisvKiBEZWZpbmUgYSBhcmJpdHJhcnkgbnVtYmVyIGFzIHN1YnN5c3RlbS1tYXJrZXItdHlwZS4gVGhpcyBudW1iZXIgaXMsIGFzCisgICBkZXNjcmliZWQgaW4gdGhlIEFOU0ktU0NTSS1zdGFuZGFyZCwgbm90IG9jY3VwaWVkIGJ5IG90aGVyIGRldmljZS10eXBlcy4gKi8KKyNkZWZpbmUgVFlQRV9JQk1fU0NTSV9BREFQVEVSICAgMHgyRgorCisvKiBEZWZpbmUgMHhGRiBmb3Igbm8gZGV2aWNlIHR5cGUsIGJlY2F1c2UgdGhpcyB0eXBlIGlzIG5vdCBkZWZpbmVkIHdpdGhpbgorICAgdGhlIEFOU0ktU0NTSS1zdGFuZGFyZCwgdGhlcmVmb3JlLCBpdCBjYW4gYmUgdXNlZCBhbmQgc2hvdWxkIG5vdCBjYXVzZSBhbnkKKyAgIGhhcm0uICovCisjZGVmaW5lIFRZUEVfTk9fREVWSUNFICAgICAgICAgIDB4RkYKKworLyogZGVmaW5lIG1lZGl1bS1jaGFuZ2VyLiBJZiB0aGlzIGlzIG5vdCBkZWZpbmVkIHByZXZpb3VzbHksIGUuZy4gTGludXgKKyAgIDIuMC54LCBkZWZpbmUgdGhpcyB0eXBlIGhlcmUuICovCisjaWZuZGVmIFRZUEVfTUVESVVNX0NIQU5HRVIKKyNkZWZpbmUgVFlQRV9NRURJVU1fQ0hBTkdFUiAgICAgMHgwOAorI2VuZGlmCisKKy8qIGRlZmluZSBwb3NzaWJsZSBvcGVyYXRpb25zIGZvciB0aGUgaW1tZWRpYXRlX2Fzc2lnbiBjb21tYW5kICovCisjZGVmaW5lIFNFVF9MRE4gICAgICAgIDAKKyNkZWZpbmUgUkVNT1ZFX0xETiAgICAgMQorCisvKiBsZG4gd2hpY2ggaXMgdXNlZCB0byBwcm9iZSB0aGUgU0NTSSBkZXZpY2VzICovCisjZGVmaW5lIFBST0JFX0xETiAgICAgIDAKKworLyogcmVzZXQgc3RhdHVzIGZsYWcgY29udGVudHMgKi8KKyNkZWZpbmUgSU1fUkVTRVRfTk9UX0lOX1BST0dSRVNTICAgICAgICAgMAorI2RlZmluZSBJTV9SRVNFVF9JTl9QUk9HUkVTUyAgICAgICAgICAgICAxCisjZGVmaW5lIElNX1JFU0VUX0ZJTklTSEVEX09LICAgICAgICAgICAgIDIKKyNkZWZpbmUgSU1fUkVTRVRfRklOSVNIRURfRkFJTCAgICAgICAgICAgMworI2RlZmluZSBJTV9SRVNFVF9OT1RfSU5fUFJPR1JFU1NfTk9fSU5UICA0CisjZGVmaW5lIElNX1JFU0VUX0ZJTklTSEVEX09LX05PX0lOVCAgICAgIDUKKworLyogZGVmaW5lIHVuZGVmaW5lZCBTQ1NJLWNvbW1hbmQgKi8KKyNkZWZpbmUgTk9fU0NTSSAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogaWYgdGhpcyBpcyBub256ZXJvLCBpYm1tY2FzY3NpIG9wdGlvbiBoYXMgYmVlbiBwYXNzZWQgdG8gdGhlIGtlcm5lbCAqLworc3RhdGljIGludCBpb19wb3J0W0lNX01BWF9IT1NUU10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBpbnQgc2NzaV9pZFtJTV9NQVhfSE9TVFNdID0geyA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3IH07CisKKy8qIGZpbGwgbW9kdWxlLXBhcmFtZXRlcnMgb25seSwgd2hlbiB0aGlzIGRlZmluZSBpcyBwcmVzZW50LgorICAgKHRoYXQgaXMga2VybmVsIHZlcnNpb24gMi4xLngpICovCisjaWYgZGVmaW5lZChNT0RVTEUpCitzdGF0aWMgY2hhciAqYm9vdF9vcHRpb25zID0gTlVMTDsKK21vZHVsZV9wYXJhbShib290X29wdGlvbnMsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpb19wb3J0LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHNjc2lfaWQsIGludCwgTlVMTCwgMCk7CisKKyNpZiAwIC8qIEZJWE1FOiBObyBsb25nZXIgZXhpc3Q/IC0tUlIgKi8KK01PRFVMRV9QQVJNKGRpc3BsYXksICIxaSIpOworTU9EVUxFX1BBUk0oYWRpc3BsYXksICIxaSIpOworTU9EVUxFX1BBUk0obm9ybWFsLCAiMWkiKTsKK01PRFVMRV9QQVJNKGFuc2ksICIxaSIpOworI2VuZGlmCisjZW5kaWYKKy8qY291bnRlciBvZiBjb25jdXJyZW50IGRpc2sgcmVhZC93cml0ZXMsIHRvIHR1cm4gb24vb2ZmIGRpc2sgbGVkICovCitzdGF0aWMgaW50IGRpc2tfcndfaW5fcHJvZ3Jlc3MgPSAwOworCisvKiBob3N0IGluZm9ybWF0aW9uICovCitzdGF0aWMgaW50IGZvdW5kID0gMDsKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0c1tJTV9NQVhfSE9TVFMgKyAxXSA9IHsKKwlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9Oworc3RhdGljIHVuc2lnbmVkIGludCBwb3NbOF07CS8qIHdob2xlIHBvcyByZWdpc3Rlci1saW5lIGZvciBkaWFnbm9zaXMgKi8KKy8qIFRha2luZyBpbnRvIGFjY291bnQgdGhlIGFkZGl0aW9ucywgbWFkZSBieSBaUCBHdS4KKyAqIFRoaXMgc2VsZWN0cyBub3cgdGhlIHByZXNldCB2YWx1ZSBmcm9tIHRoZSBjb25maWdmaWxlIGFuZAorICogb2ZmZXJzIHRoZSAnbm9ybWFsJyBjb21tYW5kbGluZSBvcHRpb24gdG8gYmUgYWNjZXB0ZWQgKi8KKyNpZmRlZiBDT05GSUdfSUJNTUNBX1NDU0lfT1JERVJfU1RBTkRBUkQKK3N0YXRpYyBjaGFyIGlibV9hbnNpX29yZGVyID0gMTsKKyNlbHNlCitzdGF0aWMgY2hhciBpYm1fYW5zaV9vcmRlciA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQgaXNzdWVfY21kKGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgdm9pZCBpbnRlcm5hbF9kb25lKFNjc2lfQ21uZCAqIGNtZCk7CitzdGF0aWMgdm9pZCBjaGVja19kZXZpY2VzKGludCwgaW50KTsKK3N0YXRpYyBpbnQgaW1tZWRpYXRlX2Fzc2lnbihpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IGltbWVkaWF0ZV9mZWF0dXJlKGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworI2lmZGVmIENPTkZJR19JQk1NQ0FfU0NTSV9ERVZfUkVTRVQKK3N0YXRpYyBpbnQgaW1tZWRpYXRlX3Jlc2V0KGludCwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgorc3RhdGljIGludCBkZXZpY2VfaW5xdWlyeShpbnQsIGludCk7CitzdGF0aWMgaW50IHJlYWRfY2FwYWNpdHkoaW50LCBpbnQpOworc3RhdGljIGludCBnZXRfcG9zX2luZm8oaW50KTsKK3N0YXRpYyBjaGFyICp0aV9wKGludCk7CitzdGF0aWMgY2hhciAqdGlfbChpbnQpOworc3RhdGljIGNoYXIgKmlibXJhdGUodW5zaWduZWQgaW50LCBpbnQpOworc3RhdGljIGludCBwcm9iZV9kaXNwbGF5KGludCk7CitzdGF0aWMgaW50IHByb2JlX2J1c19tb2RlKGludCk7CitzdGF0aWMgaW50IGRldmljZV9leGlzdHMoaW50LCBpbnQsIGludCAqLCBpbnQgKik7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaWJtbWNhX3JlZ2lzdGVyKFNjc2lfSG9zdF9UZW1wbGF0ZSAqLCBpbnQsIGludCwgaW50LCBjaGFyICopOworc3RhdGljIGludCBvcHRpb25fc2V0dXAoY2hhciAqKTsKKy8qIGxvY2FsIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHByb2NfaW5mbyAqLworc3RhdGljIGludCBsZG5fYWNjZXNzX2xvYWQoaW50LCBpbnQpOworc3RhdGljIGludCBsZG5fYWNjZXNzX3RvdGFsX3JlYWRfd3JpdGUoaW50KTsKKworc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGhvc3RfaW5kZXgsIGlob3N0X2luZGV4OworCXVuc2lnbmVkIGludCBpbnRyX3JlZzsKKwl1bnNpZ25lZCBpbnQgY21kX3Jlc3VsdDsKKwl1bnNpZ25lZCBpbnQgbGRuOworCVNjc2lfQ21uZCAqY21kOworCWludCBsYXN0U0NTSTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisKKwlzcGluX2xvY2soZGV2LT5ob3N0X2xvY2spOworCSAgICAvKiBzZWFyY2ggZm9yIG9uZSBhZGFwdGVyLXJlc3BvbnNlIG9uIHNoYXJlZCBpbnRlcnJ1cHQgKi8KKwkgICAgZm9yIChob3N0X2luZGV4ID0gMDsgaG9zdHNbaG9zdF9pbmRleF0gJiYgIShpbmIoSU1fU1RBVF9SRUcoaG9zdF9pbmRleCkpICYgSU1fSU5UUl9SRVFVRVNUKTsgaG9zdF9pbmRleCsrKTsKKwkvKiByZXR1cm4gaWYgc29tZSBvdGhlciBkZXZpY2Ugb24gdGhpcyBJUlEgY2F1c2VkIHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAoIWhvc3RzW2hvc3RfaW5kZXhdKSB7CisJCXNwaW5fdW5sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIHRoZSByZXNldC1mdW5jdGlvbiBhbHJlYWR5IGRpZCBhbGwgdGhlIGpvYiwgZXZlbiBpbnRzIGdvdAorCSAgIHJlbmFibGVkIG9uIHRoZSBzdWJzeXN0ZW0sIHNvIGp1c3QgcmV0dXJuICovCisJaWYgKChyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPT0gSU1fUkVTRVRfTk9UX0lOX1BST0dSRVNTX05PX0lOVCkgfHwgKHJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9PSBJTV9SRVNFVF9GSU5JU0hFRF9PS19OT19JTlQpKSB7CisJCXJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9IElNX1JFU0VUX05PVF9JTl9QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2soZGV2LT5ob3N0X2xvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyptdXN0IHdhaXQgZm9yIGF0dGVudGlvbiByZWcgbm90IGJ1c3ksIHRoZW4gc2VuZCBFT0kgdG8gc3Vic3lzdGVtICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKCEoaW5iKElNX1NUQVRfUkVHKGhvc3RfaW5kZXgpKSAmIElNX0JVU1kpKQorCQkJYnJlYWs7CisJCWNwdV9yZWxheCgpOworCX0KKwlpaG9zdF9pbmRleCA9IGhvc3RfaW5kZXg7CisJLypnZXQgY29tbWFuZCByZXN1bHQgYW5kIGxvZ2ljYWwgZGV2aWNlICovCisJaW50cl9yZWcgPSAodW5zaWduZWQgY2hhcikgKGluYihJTV9JTlRSX1JFRyhpaG9zdF9pbmRleCkpKTsKKwljbWRfcmVzdWx0ID0gaW50cl9yZWcgJiAweGYwOworCWxkbiA9IGludHJfcmVnICYgMHgwZjsKKwkvKiBnZXQgdGhlIGxhc3Rfc2NzaV9jb21tYW5kIGhlcmUgKi8KKwlsYXN0U0NTSSA9IGxhc3Rfc2NzaV9jb21tYW5kKGlob3N0X2luZGV4KVtsZG5dOworCW91dGIoSU1fRU9JIHwgbGRuLCBJTV9BVFROX1JFRyhpaG9zdF9pbmRleCkpOworCQorCS8qdGhlc2Ugc2hvdWxkIG5ldmVyIGhhcHBlbiAoaHcgZmFpbHMsIG9yIGEgbG9jYWwgcHJvZ3JhbW1pbmcgYnVnKSAqLworCWlmICghZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlKSB7CisJCXN3aXRjaCAoY21kX3Jlc3VsdCkgeworCQkJLyogUHJldmVudCBmcm9tIE9vb3BzaW5nIG9uIGVycm9yIHRvIHNob3cgdGhlIHJlYWwgcmVhc29uICovCisJCWNhc2UgSU1fQURBUFRFUl9IV19GQUlMVVJFOgorCQljYXNlIElNX1NPRlRXQVJFX1NFUVVFTkNJTkdfRVJST1I6CisJCWNhc2UgSU1fQ01EX0VSUk9SOgorCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IEZhdGFsIFN1YnN5c3RlbSBFUlJPUiFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIExhc3QgY21kPTB4JXgsIGVuYT0leCwgbGVuPSIsIGxhc3RTQ1NJLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2IuZW5hYmxlKTsKKwkJCWlmIChsZChpaG9zdF9pbmRleClbbGRuXS5jbWQpCisJCQkJcHJpbnRrKCIlbGQvJWxkLCIsIChsb25nKSAobGQoaWhvc3RfaW5kZXgpW2xkbl0uY21kLT5yZXF1ZXN0X2J1ZmZsZW4pLCAobG9uZykgKGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi5zeXNfYnVmX2xlbmd0aCkpOworCQkJZWxzZQorCQkJCXByaW50aygibm9uZSwiKTsKKwkJCWlmIChsZChpaG9zdF9pbmRleClbbGRuXS5jbWQpCisJCQkJcHJpbnRrKCJCbG9ja3NpemU9JWQiLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2IudTIuYmxrLmxlbmd0aCk7CisJCQllbHNlCisJCQkJcHJpbnRrKCJCbG9ja3NpemU9bm9uZSIpOworCQkJcHJpbnRrKCIsIGhvc3Q9MHgleCwgbGRuPTB4JXhcbiIsIGlob3N0X2luZGV4LCBsZG4pOworCQkJaWYgKGxkKGlob3N0X2luZGV4KVtsZG5dLmNtZCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiQmxvY2tjb3VudD0lZC8lZFxuIiwgbGFzdF9zY3NpX2Jsb2NrY291bnQoaWhvc3RfaW5kZXgpW2xkbl0sIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi51Mi5ibGsuY291bnQpOworCQkJCXByaW50ayhLRVJOX0VSUiAiTG9naWNhbCBibG9jaz0lbHgvJWx4XG4iLCBsYXN0X3Njc2lfbG9naWNhbF9ibG9jayhpaG9zdF9pbmRleClbbGRuXSwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLnUxLmxvZ19ibGtfYWRyKTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0VSUiAiUmVhc29uIGdpdmVuOiAlc1xuIiwgKGNtZF9yZXN1bHQgPT0gSU1fQURBUFRFUl9IV19GQUlMVVJFKSA/ICJIQVJEV0FSRSBGQUlMVVJFIiA6IChjbWRfcmVzdWx0ID09IElNX1NPRlRXQVJFX1NFUVVFTkNJTkdfRVJST1IpID8gIlNPRlRXQVJFIFNFUVVFTkNJTkcgRVJST1IiIDogKGNtZF9yZXN1bHQgPT0gSU1fQ01EX0VSUk9SKSA/ICJDT01NQU5EIEVSUk9SIiA6ICJVTktOT1dOIik7CisJCQkvKiBpZiBlcnJvcnMgYXBwZWFyLCBlbnRlciB0aGlzIHNlY3Rpb24gdG8gZ2l2ZSBkZXRhaWxlZCBpbmZvICovCisJCQlwcmludGsoS0VSTl9FUlIgIklCTSBNQ0EgU0NTSTogU3Vic3lzdGVtIEVycm9yLVN0YXR1cyBmb2xsb3dzOlxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgQ29tbWFuZCBUeXBlLi4uLi4uLi4uLi4uLi4uLjogJXhcbiIsIGxhc3Rfc2NzaV90eXBlKGlob3N0X2luZGV4KVtsZG5dKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBBdHRlbnRpb24gUmVnaXN0ZXIuLi4uLi4uLi4uOiAleFxuIiwgaW5iKElNX0FUVE5fUkVHKGlob3N0X2luZGV4KSkpOworCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIEJhc2ljIENvbnRyb2wgUmVnaXN0ZXIuLi4uLi46ICV4XG4iLCBpbmIoSU1fQ1RSX1JFRyhpaG9zdF9pbmRleCkpKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyLi4uOiAleFxuIiwgaW50cl9yZWcpOworCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIEJhc2ljIFN0YXR1cyBSZWdpc3Rlci4uLi4uLi46ICV4XG4iLCBpbmIoSU1fU1RBVF9SRUcoaWhvc3RfaW5kZXgpKSk7CisJCQlpZiAoKGxhc3Rfc2NzaV90eXBlKGlob3N0X2luZGV4KVtsZG5dID09IElNX1NDQikgfHwgKGxhc3Rfc2NzaV90eXBlKGlob3N0X2luZGV4KVtsZG5dID09IElNX0xPTkdfU0NCKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0ItQ29tbWFuZC4uLi4uLi4uLi4uLi4uLi4uOiAleFxuIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLmNvbW1hbmQpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0ItRW5hYmxlLi4uLi4uLi4uLi4uLi4uLi4uOiAleFxuIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLmVuYWJsZSk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIFNDQi1sb2dpY2FsIGJsb2NrIGFkZHJlc3MuLi46ICVseFxuIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLnUxLmxvZ19ibGtfYWRyKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLXN5c3RlbSBidWZmZXIgYWRkcmVzcy4uLjogJWx4XG4iLCBsZChpaG9zdF9pbmRleClbbGRuXS5zY2Iuc3lzX2J1Zl9hZHIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0Itc3lzdGVtIGJ1ZmZlciBsZW5ndGguLi4uOiAlbHhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi5zeXNfYnVmX2xlbmd0aCk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIFNDQi10c2IgYWRkcmVzcy4uLi4uLi4uLi4uLi46ICVseFxuIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLnRzYl9hZHIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0ItQ2hhaW4gYWRkcmVzcy4uLi4uLi4uLi4uOiAlbHhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi5zY2JfY2hhaW5fYWRyKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgU0NCLWJsb2NrIGNvdW50Li4uLi4uLi4uLi4uLjogJXhcbiIsIGxkKGlob3N0X2luZGV4KVtsZG5dLnNjYi51Mi5ibGsuY291bnQpOworCQkJCXByaW50ayhLRVJOX0VSUiAiICAgICAgICAgICAgICBTQ0ItYmxvY2sgbGVuZ3RoLi4uLi4uLi4uLi4uOiAleFxuIiwgbGQoaWhvc3RfaW5kZXgpW2xkbl0uc2NiLnUyLmJsay5sZW5ndGgpOworCQkJfQorCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIFNlbmQgdGhpcyByZXBvcnQgdG8gdGhlIG1haW50YWluZXIuXG4iKTsKKwkJCXBhbmljKCJJQk0gTUNBIFNDU0k6IEZhdGFsIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgc3Vic3lzdGVtICgweCVYLDB4JVgpIVxuIiwgbGFzdFNDU0ksIGNtZF9yZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGUgY29tbWFuZCBlcnJvciBoYW5kbGluZyBpcyBtYWRlIHNpbGVudCwgYnV0IHdlIHRlbGwgdGhlCisJCSAqIGNhbGxpbmcgZnVuY3Rpb24sIHRoYXQgdGhlcmUgaXMgYSByZXBvcnRlZCBlcnJvciBmcm9tIHRoZQorCQkgKiBhZGFwdGVyLiAqLworCQlzd2l0Y2ggKGNtZF9yZXN1bHQpIHsKKwkJY2FzZSBJTV9BREFQVEVSX0hXX0ZBSUxVUkU6CisJCWNhc2UgSU1fU09GVFdBUkVfU0VRVUVOQ0lOR19FUlJPUjoKKwkJY2FzZSBJTV9DTURfRVJST1I6CisJCQlnbG9iYWxfY29tbWFuZF9lcnJvcl9leGN1c2UgPSBDTURfRkFJTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIGlmIG5vIHBhbmljIGFwcGVhcmVkLCBpbmNyZWFzZSB0aGUgaW50ZXJydXB0LWNvdW50ZXIgKi8KKwlJQk1fRFMoaWhvc3RfaW5kZXgpLnRvdGFsX2ludGVycnVwdHMrKzsKKwkvKm9ubHkgZm9yIGxvY2FsIGNoZWNraW5nIHBoYXNlICovCisJaWYgKGxvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcoaWhvc3RfaW5kZXgpKSB7CisJCXN0YXRfcmVzdWx0KGlob3N0X2luZGV4KSA9IGNtZF9yZXN1bHQ7CisJCWdvdF9pbnRlcnJ1cHQoaWhvc3RfaW5kZXgpID0gMTsKKwkJcmVzZXRfc3RhdHVzKGlob3N0X2luZGV4KSA9IElNX1JFU0VUX0ZJTklTSEVEX09LOworCQlsYXN0X3Njc2lfY29tbWFuZChpaG9zdF9pbmRleClbbGRuXSA9IE5PX1NDU0k7CisJCXNwaW5fdW5sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvKiBoYW5kbGluZyBvZiBjb21tYW5kcyBjb21pbmcgZnJvbSB1cHBlciBsZXZlbCBvZiBzY3NpIGRyaXZlciAqLworCWlmIChsYXN0X3Njc2lfdHlwZShpaG9zdF9pbmRleClbbGRuXSA9PSBJTV9JTU1fQ01EKSB7CisJCS8qIHZlcmlmeSBsZG4sIGFuZCBtYXkgaGFuZGxlIHJhcmUgcmVzZXQgaW1tZWRpYXRlIGNvbW1hbmQgKi8KKwkJaWYgKChyZXNldF9zdGF0dXMoaWhvc3RfaW5kZXgpID09IElNX1JFU0VUX0lOX1BST0dSRVNTKSAmJiAobGFzdF9zY3NpX2NvbW1hbmQoaWhvc3RfaW5kZXgpW2xkbl0gPT0gSU1fUkVTRVRfSU1NX0NNRCkpIHsKKwkJCWlmIChjbWRfcmVzdWx0ID09IElNX0NNRF9DT01QTEVURURfV0lUSF9GQUlMVVJFKSB7CisJCQkJZGlza19yd19pbl9wcm9ncmVzcyA9IDA7CisJCQkJUFMyX0RJU0tfTEVEX09GRigpOworCQkJCXJlc2V0X3N0YXR1cyhpaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9GSU5JU0hFRF9GQUlMOworCQkJfSBlbHNlIHsKKwkJCQkvKnJlc2V0IGRpc2sgbGVkIGNvdW50ZXIsIHR1cm4gb2ZmIGRpc2sgbGVkICovCisJCQkJZGlza19yd19pbl9wcm9ncmVzcyA9IDA7CisJCQkJUFMyX0RJU0tfTEVEX09GRigpOworCQkJCXJlc2V0X3N0YXR1cyhpaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9GSU5JU0hFRF9PSzsKKwkJCX0KKwkJCXN0YXRfcmVzdWx0KGlob3N0X2luZGV4KSA9IGNtZF9yZXN1bHQ7CisJCQlsYXN0X3Njc2lfY29tbWFuZChpaG9zdF9pbmRleClbbGRuXSA9IE5PX1NDU0k7CisJCQlsYXN0X3Njc2lfdHlwZShpaG9zdF9pbmRleClbbGRuXSA9IDA7CisJCQlzcGluX3VubG9jayhkZXYtPmhvc3RfbG9jayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0gZWxzZSBpZiAobGFzdF9zY3NpX2NvbW1hbmQoaWhvc3RfaW5kZXgpW2xkbl0gPT0gSU1fQUJPUlRfSU1NX0NNRCkgeworCQkJLyogcmVhY3Qgb24gU0NTSSBhYm9ydCBjb21tYW5kICovCisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBJbnRlcnJ1cHQgZnJvbSBTQ1NJLWFib3J0LlxuIik7CisjZW5kaWYKKwkJCWRpc2tfcndfaW5fcHJvZ3Jlc3MgPSAwOworCQkJUFMyX0RJU0tfTEVEX09GRigpOworCQkJY21kID0gbGQoaWhvc3RfaW5kZXgpW2xkbl0uY21kOworCQkJbGQoaWhvc3RfaW5kZXgpW2xkbl0uY21kID0gTlVMTDsKKwkJCWlmIChjbWRfcmVzdWx0ID09IElNX0NNRF9DT01QTEVURURfV0lUSF9GQUlMVVJFKQorCQkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQllbHNlCisJCQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlzdGF0X3Jlc3VsdChpaG9zdF9pbmRleCkgPSBjbWRfcmVzdWx0OworCQkJbGFzdF9zY3NpX2NvbW1hbmQoaWhvc3RfaW5kZXgpW2xkbl0gPSBOT19TQ1NJOworCQkJbGFzdF9zY3NpX3R5cGUoaWhvc3RfaW5kZXgpW2xkbl0gPSAwOworCQkJaWYgKGNtZC0+c2NzaV9kb25lKQorCQkJCShjbWQtPnNjc2lfZG9uZSkgKGNtZCk7CS8qIHNob3VsZCBiZSB0aGUgaW50ZXJuYWxfZG9uZSAqLworCQkJc3Bpbl91bmxvY2soZGV2LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IGVsc2UgeworCQkJZGlza19yd19pbl9wcm9ncmVzcyA9IDA7CisJCQlQUzJfRElTS19MRURfT0ZGKCk7CisJCQlyZXNldF9zdGF0dXMoaWhvc3RfaW5kZXgpID0gSU1fUkVTRVRfRklOSVNIRURfT0s7CisJCQlzdGF0X3Jlc3VsdChpaG9zdF9pbmRleCkgPSBjbWRfcmVzdWx0OworCQkJbGFzdF9zY3NpX2NvbW1hbmQoaWhvc3RfaW5kZXgpW2xkbl0gPSBOT19TQ1NJOworCQkJc3Bpbl91bmxvY2soZGV2LT5ob3N0X2xvY2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorCWxhc3Rfc2NzaV9jb21tYW5kKGlob3N0X2luZGV4KVtsZG5dID0gTk9fU0NTSTsKKwlsYXN0X3Njc2lfdHlwZShpaG9zdF9pbmRleClbbGRuXSA9IDA7CisJY21kID0gbGQoaWhvc3RfaW5kZXgpW2xkbl0uY21kOworCWxkKGlob3N0X2luZGV4KVtsZG5dLmNtZCA9IE5VTEw7CisjaWZkZWYgSU1fREVCVUdfVElNRU9VVAorCWlmIChjbWQpIHsKKwkJaWYgKChjbWQtPnRhcmdldCA9PSBUSU1FT1VUX1BVTikgJiYgKGNtZC0+ZGV2aWNlLT5sdW4gPT0gVElNRU9VVF9MVU4pKSB7CisJCQlwcmludGsoIklCTSBNQ0EgU0NTSTogSWdub3JpbmcgaW50ZXJydXB0IGZyb20gcHVuPSV4LCBsdW49JXguXG4iLCBjbWQtPnRhcmdldCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisjZW5kaWYKKwkvKmlmIG5vIGNvbW1hbmQgc3RydWN0dXJlLCBqdXN0IHJldHVybiwgZWxzZSBjbGVhciBjbWQgKi8KKwlpZiAoIWNtZCkKKwl7CisJCXNwaW5fdW5sb2NrKGRldi0+aG9zdF9sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworI2lmZGVmIElNX0RFQlVHX0lOVAorCXByaW50aygiY21kPSUwMnggaXJlZz0lMDJ4IGRzPSUwMnggY3M9JTAyeCBkZT0lMDJ4IGNlPSUwMnhcbiIsIGNtZC0+Y21uZFswXSwgaW50cl9yZWcsIGxkKGlob3N0X2luZGV4KVtsZG5dLnRzYi5kZXZfc3RhdHVzLCBsZChpaG9zdF9pbmRleClbbGRuXS50c2IuY21kX3N0YXR1cywgbGQoaWhvc3RfaW5kZXgpW2xkbl0udHNiLmRldl9lcnJvciwgbGQoaWhvc3RfaW5kZXgpW2xkbl0udHNiLmNtZF9lcnJvcik7CisjZW5kaWYKKwkvKmlmIHRoaXMgaXMgZW5kIG9mIG1lZGlhIHJlYWQvd3JpdGUsIG1heSB0dXJuIG9mZiBQUy8yIGRpc2sgbGVkICovCisJaWYgKChsZChpaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZSAhPSBUWVBFX05PX0xVTikgJiYgKGxkKGlob3N0X2luZGV4KVtsZG5dLmRldmljZV90eXBlICE9IFRZUEVfTk9fREVWSUNFKSkgeworCQkvKiBvbmx5IGFjY2VzcyB0aGlzLCBpZiB0aGVyZSB3YXMgYSB2YWxpZCBkZXZpY2UgYWRkcmVzc2VkICovCisJCWlmICgtLWRpc2tfcndfaW5fcHJvZ3Jlc3MgPT0gMCkKKwkJCVBTMl9ESVNLX0xFRF9PRkYoKTsKKwl9CisKKwkvKiBJQk0gZGVzY3JpYmVzIHRoZSBzdGF0dXMtbWFzayB0byBiZSAweDFlLCBidXQgdGhpcyBpcyBub3QgY29uZm9ybQorCSAqIHdpdGggU0NTSS1kZWZpbml0aW9uLCBJIHN1cHBvc2UsIHRoZSByZWFzb24gZm9yIGl0IGlzIHRoYXQgSUJNCisJICogYWRhcHRlcnMgZG8gbm90IHN1cHBvcnQgQ01EX1RFUk1JTkFURUQsIFRBU0tfU0VUX0ZVTEwgYW5kCisJICogQUNBX0FDVElWRSBhcyByZXR1cm5pbmcgc3RhdHVzYnl0ZSBpbmZvcm1hdGlvbi4gKE1MKSAqLworCWlmIChjbWRfcmVzdWx0ID09IElNX0NNRF9DT01QTEVURURfV0lUSF9GQUlMVVJFKSB7CisJCWNtZC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIpIChsZChpaG9zdF9pbmRleClbbGRuXS50c2IuZGV2X3N0YXR1cyAmIDB4MWUpOworCQlJQk1fRFMoaWhvc3RfaW5kZXgpLnRvdGFsX2Vycm9ycysrOworCX0gZWxzZQorCQljbWQtPnJlc3VsdCA9IDA7CisJLyogd3JpdGUgZGV2aWNlIHN0YXR1cyBpbnRvIGNtZC0+cmVzdWx0LCBhbmQgY2FsbCBkb25lIGZ1bmN0aW9uICovCisJaWYgKGxhc3RTQ1NJID09IE5PX1NDU0kpIHsJLyogdW5leHBlY3RlZCBpbnRlcnJ1cHQgOi0oICovCisJCWNtZC0+cmVzdWx0IHw9IERJRF9CQURfSU5UUiA8PCAxNjsKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IFdBUk5JTkcgLSBJbnRlcnJ1cHQgZnJvbSBub24tcGVuZGluZyBTQ1NJLWNvbW1hbmQhXG4iKTsKKwl9IGVsc2UJCQkvKiB0aGluZ3Mgd2VudCByaWdodCA6LSkgKi8KKwkJY21kLT5yZXN1bHQgfD0gRElEX09LIDw8IDE2OworCWlmIChjbWQtPnNjc2lfZG9uZSkKKwkJKGNtZC0+c2NzaV9kb25lKSAoY21kKTsKKwlzcGluX3VubG9jayhkZXYtPmhvc3RfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBpc3N1ZV9jbWQoaW50IGhvc3RfaW5kZXgsIHVuc2lnbmVkIGxvbmcgY21kX3JlZywgdW5zaWduZWQgY2hhciBhdHRuX3JlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIG11c3Qgd2FpdCBmb3IgYXR0ZW50aW9uIHJlZyBub3QgYnVzeSAqLworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKGhvc3RzW2hvc3RfaW5kZXhdLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKCEoaW5iKElNX1NUQVRfUkVHKGhvc3RfaW5kZXgpKSAmIElNX0JVU1kpKQorCQkJYnJlYWs7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdHNbaG9zdF9pbmRleF0tPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKwkvKiB3cml0ZSByZWdpc3RlcnMgYW5kIGVuYWJsZSBzeXN0ZW0gaW50ZXJydXB0cyAqLworCW91dGwoY21kX3JlZywgSU1fQ01EX1JFRyhob3N0X2luZGV4KSk7CisJb3V0YihhdHRuX3JlZywgSU1fQVRUTl9SRUcoaG9zdF9pbmRleCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdHNbaG9zdF9pbmRleF0tPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9kb25lKFNjc2lfQ21uZCAqIGNtZCkKK3sKKwljbWQtPlNDcC5TdGF0dXMrKzsKKwlyZXR1cm47Cit9CisKKy8qIFNDU0ktU0NCLWNvbW1hbmQgZm9yIGRldmljZV9pbnF1aXJ5ICovCitzdGF0aWMgaW50IGRldmljZV9pbnF1aXJ5KGludCBob3N0X2luZGV4LCBpbnQgbGRuKQoreworCWludCByZXRyOworCXN0cnVjdCBpbV9zY2IgKnNjYjsKKwlzdHJ1Y3QgaW1fdHNiICp0c2I7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJc2NiID0gJihsZChob3N0X2luZGV4KVtsZG5dLnNjYik7CisJdHNiID0gJihsZChob3N0X2luZGV4KVtsZG5dLnRzYik7CisJYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgKCYobGQoaG9zdF9pbmRleClbbGRuXS5idWYpKTsKKwlsZChob3N0X2luZGV4KVtsZG5dLnRzYi5kZXZfc3RhdHVzID0gMDsJLyogcHJlcGFyZSBzdGF0dXNibG9jayAqLworCWZvciAocmV0ciA9IDA7IHJldHIgPCAzOyByZXRyKyspIHsKKwkJLyogZmlsbCBzY2Igd2l0aCBpbnF1aXJ5IGNvbW1hbmQgKi8KKwkJc2NiLT5jb21tYW5kID0gSU1fREVWSUNFX0lOUVVJUllfQ01EIHwgSU1fTk9fRElTQ09OTkVDVDsKKwkJc2NiLT5lbmFibGUgPSBJTV9SRVBPUlRfVFNCX09OTFlfT05fRVJST1IgfCBJTV9SRUFEX0NPTlRST0wgfCBJTV9TVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCB8IElNX1JFVFJZX0VOQUJMRSB8IElNX0JZUEFTU19CVUZGRVI7CisJCWxhc3Rfc2NzaV9jb21tYW5kKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9ERVZJQ0VfSU5RVUlSWV9DTUQ7CisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9TQ0I7CisJCXNjYi0+c3lzX2J1Zl9hZHIgPSBpc2FfdmlydF90b19idXMoYnVmKTsKKwkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IDI1NTsJLyogbWF4aW11bSBidWZmZXJsZW5ndGggZ2l2ZXMgbWF4IGluZm8gKi8KKwkJc2NiLT50c2JfYWRyID0gaXNhX3ZpcnRfdG9fYnVzKHRzYik7CisJCS8qIGlzc3VlIHNjYiB0byBwYXNzZWQgbGRuLCBhbmQgYnVzeSB3YWl0IGZvciBpbnRlcnJ1cHQgKi8KKwkJZ290X2ludGVycnVwdChob3N0X2luZGV4KSA9IDA7CisJCWlzc3VlX2NtZChob3N0X2luZGV4LCBpc2FfdmlydF90b19idXMoc2NiKSwgSU1fU0NCIHwgbGRuKTsKKwkJd2hpbGUgKCFnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpKQorCQkJYmFycmllcigpOworCisJCS8qaWYgY29tbWFuZCBzdWNjZXNmdWwsIGJyZWFrICovCisJCWlmICgoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fU0NCX0NNRF9DT01QTEVURUQpIHx8IChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9TQ0JfQ01EX0NPTVBMRVRFRF9XSVRIX1JFVFJJRVMpKQorCQkJcmV0dXJuIDE7CisJfQorCS8qaWYgYWxsIHRocmVlIHJldHJpZXMgZmFpbGVkLCByZXR1cm4gIm5vIGRldmljZSBhdCB0aGlzIGxkbiIgKi8KKwlpZiAocmV0ciA+PSAzKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlYWRfY2FwYWNpdHkoaW50IGhvc3RfaW5kZXgsIGludCBsZG4pCit7CisJaW50IHJldHI7CisJc3RydWN0IGltX3NjYiAqc2NiOworCXN0cnVjdCBpbV90c2IgKnRzYjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlzY2IgPSAmKGxkKGhvc3RfaW5kZXgpW2xkbl0uc2NiKTsKKwl0c2IgPSAmKGxkKGhvc3RfaW5kZXgpW2xkbl0udHNiKTsKKwlidWYgPSAodW5zaWduZWQgY2hhciAqKSAoJihsZChob3N0X2luZGV4KVtsZG5dLmJ1ZikpOworCWxkKGhvc3RfaW5kZXgpW2xkbl0udHNiLmRldl9zdGF0dXMgPSAwOworCWZvciAocmV0ciA9IDA7IHJldHIgPCAzOyByZXRyKyspIHsKKwkJLypmaWxsIHNjYiB3aXRoIHJlYWQgY2FwYWNpdHkgY29tbWFuZCAqLworCQlzY2ItPmNvbW1hbmQgPSBJTV9SRUFEX0NBUEFDSVRZX0NNRDsKKwkJc2NiLT5lbmFibGUgPSBJTV9SRVBPUlRfVFNCX09OTFlfT05fRVJST1IgfCBJTV9SRUFEX0NPTlRST0wgfCBJTV9SRVRSWV9FTkFCTEUgfCBJTV9CWVBBU1NfQlVGRkVSOworCQlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtsZG5dID0gSU1fUkVBRF9DQVBBQ0lUWV9DTUQ7CisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPSBJTV9TQ0I7CisJCXNjYi0+c3lzX2J1Zl9hZHIgPSBpc2FfdmlydF90b19idXMoYnVmKTsKKwkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IDg7CisJCXNjYi0+dHNiX2FkciA9IGlzYV92aXJ0X3RvX2J1cyh0c2IpOworCQkvKmlzc3VlIHNjYiB0byBwYXNzZWQgbGRuLCBhbmQgYnVzeSB3YWl0IGZvciBpbnRlcnJ1cHQgKi8KKwkJZ290X2ludGVycnVwdChob3N0X2luZGV4KSA9IDA7CisJCWlzc3VlX2NtZChob3N0X2luZGV4LCBpc2FfdmlydF90b19idXMoc2NiKSwgSU1fU0NCIHwgbGRuKTsKKwkJd2hpbGUgKCFnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpKQorCQkJYmFycmllcigpOworCisJCS8qaWYgZ290IGNhcGFjaXR5LCBnZXQgYmxvY2sgbGVuZ3RoIGFuZCByZXR1cm4gb25lIGRldmljZSBmb3VuZCAqLworCQlpZiAoKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX1NDQl9DTURfQ09NUExFVEVEKSB8fCAoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fU0NCX0NNRF9DT01QTEVURURfV0lUSF9SRVRSSUVTKSkKKwkJCXJldHVybiAxOworCX0KKwkvKmlmIGFsbCB0aHJlZSByZXRyaWVzIGZhaWxlZCwgcmV0dXJuICJubyBkZXZpY2UgYXQgdGhpcyBsZG4iICovCisJaWYgKHJldHIgPj0gMykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZXRfcG9zX2luZm8oaW50IGhvc3RfaW5kZXgpCit7CisJaW50IHJldHI7CisJc3RydWN0IGltX3NjYiAqc2NiOworCXN0cnVjdCBpbV90c2IgKnRzYjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlzY2IgPSAmKGxkKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXS5zY2IpOworCXRzYiA9ICYobGQoaG9zdF9pbmRleClbTUFYX0xPR19ERVZdLnRzYik7CisJYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgKCYobGQoaG9zdF9pbmRleClbTUFYX0xPR19ERVZdLmJ1ZikpOworCWxkKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXS50c2IuZGV2X3N0YXR1cyA9IDA7CisJZm9yIChyZXRyID0gMDsgcmV0ciA8IDM7IHJldHIrKykgeworCQkvKmZpbGwgc2NiIHdpdGggZ2V0X3Bvc19pbmZvIGNvbW1hbmQgKi8KKwkJc2NiLT5jb21tYW5kID0gSU1fR0VUX1BPU19JTkZPX0NNRDsKKwkJc2NiLT5lbmFibGUgPSBJTV9SRUFEX0NPTlRST0wgfCBJTV9SRVBPUlRfVFNCX09OTFlfT05fRVJST1IgfCBJTV9SRVRSWV9FTkFCTEUgfCBJTV9CWVBBU1NfQlVGRkVSOworCQlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0gPSBJTV9HRVRfUE9TX0lORk9fQ01EOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtNQVhfTE9HX0RFVl0gPSBJTV9TQ0I7CisJCXNjYi0+c3lzX2J1Zl9hZHIgPSBpc2FfdmlydF90b19idXMoYnVmKTsKKwkJaWYgKHNwZWNpYWwoaG9zdF9pbmRleCkgPT0gSUJNX1NDU0kyX0ZXKQorCQkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IDI1NjsJLyogZ2V0IGFsbCBpbmZvIGZyb20gRi9XIGFkYXB0ZXIgKi8KKwkJZWxzZQorCQkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IDE4OwkvKiBnZXQgZXhhY3RseSAxOCBieXRlcyBmb3Igb3RoZXIgU0NTSSAqLworCQlzY2ItPnRzYl9hZHIgPSBpc2FfdmlydF90b19idXModHNiKTsKKwkJLyppc3N1ZSBzY2IgdG8gbGRuPTE1LCBhbmQgYnVzeSB3YWl0IGZvciBpbnRlcnJ1cHQgKi8KKwkJZ290X2ludGVycnVwdChob3N0X2luZGV4KSA9IDA7CisJCWlzc3VlX2NtZChob3N0X2luZGV4LCBpc2FfdmlydF90b19idXMoc2NiKSwgSU1fU0NCIHwgTUFYX0xPR19ERVYpOworCQkKKwkJLyogRklYTUU6IHRpbWVvdXQgKi8KKwkJd2hpbGUgKCFnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpKQorCQkJYmFycmllcigpOworCisJCS8qaWYgZ290IFBPUy1zdHVmZiwgZ2V0IGJsb2NrIGxlbmd0aCBhbmQgcmV0dXJuIG9uZSBkZXZpY2UgZm91bmQgKi8KKwkJaWYgKChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9TQ0JfQ01EX0NPTVBMRVRFRCkgfHwgKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX1NDQl9DTURfQ09NUExFVEVEX1dJVEhfUkVUUklFUykpCisJCQlyZXR1cm4gMTsKKwl9CisJLyogaWYgYWxsIHRocmVlIHJldHJpZXMgZmFpbGVkLCByZXR1cm4gIm5vIGRldmljZSBhdCB0aGlzIGxkbiIgKi8KKwlpZiAocmV0ciA+PSAzKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisvKiBTQ1NJLWltbWVkaWF0ZS1jb21tYW5kIGZvciBhc3NpZ24uIFRoaXMgZnVuY3Rpb25zIG1hcHMvdW5tYXBzIHNwZWNpZmljCisgbGRuLW51bWJlcnMgb24gU0NTSSAoUFVOLExVTikuIEl0IGlzIG5lZWRlZCBmb3IgcHJlc2V0dGluZyBvZiB0aGUKKyBzdWJzeXN0ZW0gYW5kIGZvciBkeW5hbWljYWwgcmVtYXBwaW5nIG9kIGxkbnMuICovCitzdGF0aWMgaW50IGltbWVkaWF0ZV9hc3NpZ24oaW50IGhvc3RfaW5kZXgsIHVuc2lnbmVkIGludCBwdW4sIHVuc2lnbmVkIGludCBsdW4sIHVuc2lnbmVkIGludCBsZG4sIHVuc2lnbmVkIGludCBvcGVyYXRpb24pCit7CisJaW50IHJldHI7CisJdW5zaWduZWQgbG9uZyBpbW1fY21kOworCisJZm9yIChyZXRyID0gMDsgcmV0ciA8IDM7IHJldHIrKykgeworCQkvKiBzZWxlY3QgbXV0YXRpb24gbGV2ZWwgb2YgdGhlIFNDU0ktYWRhcHRlciAqLworCQlzd2l0Y2ggKHNwZWNpYWwoaG9zdF9pbmRleCkpIHsKKwkJY2FzZSBJQk1fU0NTSTJfRlc6CisJCQlpbW1fY21kID0gKHVuc2lnbmVkIGxvbmcpIChJTV9BU1NJR05fSU1NX0NNRCk7CisJCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoKGx1biAmIDcpIDw8IDI0KTsKKwkJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgob3BlcmF0aW9uICYgMSkgPDwgMjMpOworCQkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKChwdW4gJiA3KSA8PCAyMCkgfCAoKHB1biAmIDgpIDw8IDI0KTsKKwkJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgobGRuICYgMTUpIDw8IDE2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW1tX2NtZCA9IGlubChJTV9DTURfUkVHKGhvc3RfaW5kZXgpKTsKKwkJCWltbV9jbWQgJj0gKHVuc2lnbmVkIGxvbmcpICgweEY4MDAwMDAwKTsJLyoga2VlcCByZXNlcnZlZCBiaXRzICovCisJCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoSU1fQVNTSUdOX0lNTV9DTUQpOworCQkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKChsdW4gJiA3KSA8PCAyNCk7CisJCQlpbW1fY21kIHw9ICh1bnNpZ25lZCBsb25nKSAoKG9wZXJhdGlvbiAmIDEpIDw8IDIzKTsKKwkJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgocHVuICYgNykgPDwgMjApOworCQkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKChsZG4gJiAxNSkgPDwgMTYpOworCQkJYnJlYWs7CisJCX0KKwkJbGFzdF9zY3NpX2NvbW1hbmQoaG9zdF9pbmRleClbTUFYX0xPR19ERVZdID0gSU1fQVNTSUdOX0lNTV9DTUQ7CisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXSA9IElNX0lNTV9DTUQ7CisJCWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkgPSAwOworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgKHVuc2lnbmVkIGxvbmcpIChpbW1fY21kKSwgSU1fSU1NX0NNRCB8IE1BWF9MT0dfREVWKTsKKwkJd2hpbGUgKCFnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpKQorCQkJYmFycmllcigpOworCisJCS8qaWYgY29tbWFuZCBzdWNjZXNmdWwsIGJyZWFrICovCisJCWlmIChzdGF0X3Jlc3VsdChob3N0X2luZGV4KSA9PSBJTV9JTU1FRElBVEVfQ01EX0NPTVBMRVRFRCkKKwkJCXJldHVybiAxOworCX0KKwlpZiAocmV0ciA+PSAzKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGltbWVkaWF0ZV9mZWF0dXJlKGludCBob3N0X2luZGV4LCB1bnNpZ25lZCBpbnQgc3BlZWQsIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCWludCByZXRyOworCXVuc2lnbmVkIGxvbmcgaW1tX2NtZDsKKworCWZvciAocmV0ciA9IDA7IHJldHIgPCAzOyByZXRyKyspIHsKKwkJLyogc2VsZWN0IG11dGF0aW9uIGxldmVsIG9mIHRoZSBTQ1NJLWFkYXB0ZXIgKi8KKwkJaW1tX2NtZCA9IElNX0ZFQVRVUkVfQ1RSX0lNTV9DTUQ7CisJCWltbV9jbWQgfD0gKHVuc2lnbmVkIGxvbmcpICgoc3BlZWQgJiAweDcpIDw8IDI5KTsKKwkJaW1tX2NtZCB8PSAodW5zaWduZWQgbG9uZykgKCh0aW1lb3V0ICYgMHgxZmZmKSA8PCAxNik7CisJCWxhc3Rfc2NzaV9jb21tYW5kKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXSA9IElNX0ZFQVRVUkVfQ1RSX0lNTV9DTUQ7CisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXSA9IElNX0lNTV9DTUQ7CisJCWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkgPSAwOworCQkvKiB3ZSBuZWVkIHRvIHJ1biBpbnRvIGNvbW1hbmQgZXJyb3JzIGluIG9yZGVyIHRvIHByb2JlIGZvciB0aGUKKwkJICogcmlnaHQgc3BlZWQhICovCisJCWdsb2JhbF9jb21tYW5kX2Vycm9yX2V4Y3VzZSA9IDE7CisJCWlzc3VlX2NtZChob3N0X2luZGV4LCAodW5zaWduZWQgbG9uZykgKGltbV9jbWQpLCBJTV9JTU1fQ01EIHwgTUFYX0xPR19ERVYpOworCQkKKwkJLyogRklYTUU6IHRpbWVvdXQgKi8KKwkJd2hpbGUgKCFnb3RfaW50ZXJydXB0KGhvc3RfaW5kZXgpKQorCQkJYmFycmllcigpOworCQlpZiAoZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID09IENNRF9GQUlMKSB7CisJCQlnbG9iYWxfY29tbWFuZF9lcnJvcl9leGN1c2UgPSAwOworCQkJcmV0dXJuIDI7CisJCX0gZWxzZQorCQkJZ2xvYmFsX2NvbW1hbmRfZXJyb3JfZXhjdXNlID0gMDsKKwkJLyppZiBjb21tYW5kIHN1Y2Nlc2Z1bCwgYnJlYWsgKi8KKwkJaWYgKHN0YXRfcmVzdWx0KGhvc3RfaW5kZXgpID09IElNX0lNTUVESUFURV9DTURfQ09NUExFVEVEKQorCQkJcmV0dXJuIDE7CisJfQorCWlmIChyZXRyID49IDMpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfSUJNTUNBX1NDU0lfREVWX1JFU0VUCitzdGF0aWMgaW50IGltbWVkaWF0ZV9yZXNldChpbnQgaG9zdF9pbmRleCwgdW5zaWduZWQgaW50IGxkbikKK3sKKwlpbnQgcmV0cmllczsKKwlpbnQgdGlja3M7CisJdW5zaWduZWQgbG9uZyBpbW1fY29tbWFuZDsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAzOyByZXRyaWVzKyspIHsKKwkJaW1tX2NvbW1hbmQgPSBpbmwoSU1fQ01EX1JFRyhob3N0X2luZGV4KSk7CisJCWltbV9jb21tYW5kICY9ICh1bnNpZ25lZCBsb25nKSAoMHhGRkZGMDAwMCk7CS8qIGtlZXAgcmVzZXJ2ZWQgYml0cyAqLworCQlpbW1fY29tbWFuZCB8PSAodW5zaWduZWQgbG9uZykgKElNX1JFU0VUX0lNTV9DTUQpOworCQlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtsZG5dID0gSU1fUkVTRVRfSU1NX0NNRDsKKwkJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX0lNTV9DTUQ7CisJCWdvdF9pbnRlcnJ1cHQoaG9zdF9pbmRleCkgPSAwOworCQlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9JTl9QUk9HUkVTUzsKKwkJaXNzdWVfY21kKGhvc3RfaW5kZXgsICh1bnNpZ25lZCBsb25nKSAoaW1tX2NvbW1hbmQpLCBJTV9JTU1fQ01EIHwgbGRuKTsKKwkJdGlja3MgPSBJTV9SRVNFVF9ERUxBWSAqIEhaOworCQl3aGlsZSAocmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID09IElNX1JFU0VUX0lOX1BST0dSRVNTICYmIC0tdGlja3MpIHsKKwkJCXVkZWxheSgoMSArIDk5OSAvIEhaKSAqIDEwMDApOworCQkJYmFycmllcigpOworCQl9CisJCS8qIGlmIHJlc2V0IGRpZCBub3QgY29tcGxldGUsIGp1c3QgY29tcGxhaW4gKi8KKwkJaWYgKCF0aWNrcykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IHJlc2V0IGRpZCBub3QgY29tcGxldGUgd2l0aGluICVkIHNlY29uZHMuXG4iLCBJTV9SRVNFVF9ERUxBWSk7CisJCQlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9GSU5JU0hFRF9PSzsKKwkJCS8qIGRpZCBub3Qgd29yaywgZmluaXNoICovCisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKmlmIGNvbW1hbmQgc3VjY2VzZnVsLCBicmVhayAqLworCQlpZiAoc3RhdF9yZXN1bHQoaG9zdF9pbmRleCkgPT0gSU1fSU1NRURJQVRFX0NNRF9DT01QTEVURUQpCisJCQlyZXR1cm4gMTsKKwl9CisJaWYgKHJldHJpZXMgPj0gMykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKiB0eXBlLWludGVycHJldGVyIGZvciBwaHlzaWNhbCBkZXZpY2UgbnVtYmVycyAqLworc3RhdGljIGNoYXIgKnRpX3AoaW50IGRldikKK3sKKwlzd2l0Y2ggKGRldikgeworCWNhc2UgVFlQRV9JQk1fU0NTSV9BREFQVEVSOgorCQlyZXR1cm4gKCJBIik7CisJY2FzZSBUWVBFX0RJU0s6CisJCXJldHVybiAoIkQiKTsKKwljYXNlIFRZUEVfVEFQRToKKwkJcmV0dXJuICgiVCIpOworCWNhc2UgVFlQRV9QUk9DRVNTT1I6CisJCXJldHVybiAoIlAiKTsKKwljYXNlIFRZUEVfV09STToKKwkJcmV0dXJuICgiVyIpOworCWNhc2UgVFlQRV9ST006CisJCXJldHVybiAoIlIiKTsKKwljYXNlIFRZUEVfU0NBTk5FUjoKKwkJcmV0dXJuICgiUyIpOworCWNhc2UgVFlQRV9NT0Q6CisJCXJldHVybiAoIk0iKTsKKwljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CisJCXJldHVybiAoIkMiKTsKKwljYXNlIFRZUEVfTk9fTFVOOgorCQlyZXR1cm4gKCIrIik7CS8qIHNob3cgTk9fTFVOICovCisJfQorCXJldHVybiAoIi0iKTsJCS8qIFRZUEVfTk9fREVWSUNFIGFuZCBvdGhlcnMgKi8KK30KKworLyogaW50ZXJwcmV0ZXIgZm9yIGxvZ2ljYWwgZGV2aWNlIG51bWJlcnMgKGxkbikgKi8KK3N0YXRpYyBjaGFyICp0aV9sKGludCB2YWwpCit7CisJY29uc3QgY2hhciBoZXhbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXN0YXRpYyBjaGFyIGFuc3dlclsyXTsKKworCWFuc3dlclsxXSA9IChjaGFyKSAoMHgwKTsKKwlpZiAodmFsIDw9IE1BWF9MT0dfREVWKQorCQlhbnN3ZXJbMF0gPSBoZXhbdmFsXTsKKwllbHNlCisJCWFuc3dlclswXSA9ICctJzsKKwlyZXR1cm4gKGNoYXIgKikgJmFuc3dlcjsKK30KKworLyogdHJhbnNmZXJzIGJpdHBhdHRlcm4gb2YgdGhlIGZlYXR1cmUgY29tbWFuZCB0byB2YWx1ZXMgaW4gTUh6ICovCitzdGF0aWMgY2hhciAqaWJtcmF0ZSh1bnNpZ25lZCBpbnQgc3BlZWQsIGludCBpKQoreworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDA6CisJCXJldHVybiBpID8gIjUuMDAiIDogIjEwLjAwIjsKKwljYXNlIDE6CisJCXJldHVybiBpID8gIjQuMDAiIDogIjguMDAiOworCWNhc2UgMjoKKwkJcmV0dXJuIGkgPyAiMy4zMyIgOiAiNi42NiI7CisJY2FzZSAzOgorCQlyZXR1cm4gaSA/ICIyLjg2IiA6ICI1LjAwIjsKKwljYXNlIDQ6CisJCXJldHVybiBpID8gIjIuNTAiIDogIjQuMDAiOworCWNhc2UgNToKKwkJcmV0dXJuIGkgPyAiMi4yMiIgOiAiMy4xMCI7CisJY2FzZSA2OgorCQlyZXR1cm4gaSA/ICIyLjAwIiA6ICIyLjUwIjsKKwljYXNlIDc6CisJCXJldHVybiBpID8gIjEuODIiIDogIjIuMDAiOworCX0KKwlyZXR1cm4gIi0tLSI7Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfZGlzcGxheShpbnQgd2hhdCkKK3sKKwlzdGF0aWMgaW50IHJvdGF0b3IgPSAwOworCWNvbnN0IGNoYXIgcm90b3JbXSA9ICJ8Ly1cXCI7CisKKwlpZiAoIShkaXNwbGF5X21vZGUgJiBMRURfRElTUCkpCisJCXJldHVybiAwOworCWlmICghd2hhdCkgeworCQlvdXRsKDB4MjAyMDIwMjAsIE1PRDk1X0xFRF9QT1JUKTsKKwkJb3V0bCgweDIwMjAyMDIwLCBNT0Q5NV9MRURfUE9SVCArIDQpOworCX0gZWxzZSB7CisJCW91dGIoJ1MnLCBNT0Q5NV9MRURfUE9SVCArIDcpOworCQlvdXRiKCdDJywgTU9EOTVfTEVEX1BPUlQgKyA2KTsKKwkJb3V0YignUycsIE1PRDk1X0xFRF9QT1JUICsgNSk7CisJCW91dGIoJ0knLCBNT0Q5NV9MRURfUE9SVCArIDQpOworCQlvdXRiKCdpJywgTU9EOTVfTEVEX1BPUlQgKyAzKTsKKwkJb3V0YignbicsIE1PRDk1X0xFRF9QT1JUICsgMik7CisJCW91dGIoJ2knLCBNT0Q5NV9MRURfUE9SVCArIDEpOworCQlvdXRiKChjaGFyKSAocm90b3Jbcm90YXRvcl0pLCBNT0Q5NV9MRURfUE9SVCk7CisJCXJvdGF0b3IrKzsKKwkJaWYgKHJvdGF0b3IgPiAzKQorCQkJcm90YXRvciA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX2J1c19tb2RlKGludCBob3N0X2luZGV4KQoreworCXN0cnVjdCBpbV9wb3NfaW5mbyAqaW5mbzsKKwlpbnQgbnVtX2J1cyA9IDA7CisJaW50IGxkbjsKKworCWluZm8gPSAoc3RydWN0IGltX3Bvc19pbmZvICopICgmKGxkKGhvc3RfaW5kZXgpW01BWF9MT0dfREVWXS5idWYpKTsKKwlpZiAoZ2V0X3Bvc19pbmZvKGhvc3RfaW5kZXgpKSB7CisJCWlmIChpbmZvLT5jb25uZWN0b3Jfc2l6ZSAmIDB4ZjAwMCkKKwkJCXN1YnN5c3RlbV9jb25uZWN0b3Jfc2l6ZShob3N0X2luZGV4KSA9IDE2OworCQllbHNlCisJCQlzdWJzeXN0ZW1fY29ubmVjdG9yX3NpemUoaG9zdF9pbmRleCkgPSAzMjsKKwkJbnVtX2J1cyB8PSAoaW5mby0+cG9zXzRiICYgOCkgPj4gMzsKKwkJZm9yIChsZG4gPSAwOyBsZG4gPD0gTUFYX0xPR19ERVY7IGxkbisrKSB7CisJCQlpZiAoKHNwZWNpYWwoaG9zdF9pbmRleCkgPT0gSUJNX1NDU0lfV0NBQ0hFKSB8fCAoc3BlY2lhbChob3N0X2luZGV4KSA9PSBJQk1fNzU2OF9XQ0FDSEUpKSB7CisJCQkJaWYgKCEoKGluZm8tPmNhY2hlX3N0YXQgPj4gbGRuKSAmIDEpKQorCQkJCQlsZChob3N0X2luZGV4KVtsZG5dLmNhY2hlX2ZsYWcgPSAwOworCQkJfQorCQkJaWYgKCEoKGluZm8tPnJldHJ5X3N0YXQgPj4gbGRuKSAmIDEpKQorCQkJCWxkKGhvc3RfaW5kZXgpW2xkbl0ucmV0cnlfZmxhZyA9IDA7CisJCX0KKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCQlwcmludGsoIklCTSBNQ0EgU0NTSTogU0NTSS1DYWNoZSBiaXRzOiAiKTsKKwkJZm9yIChsZG4gPSAwOyBsZG4gPD0gTUFYX0xPR19ERVY7IGxkbisrKSB7CisJCQlwcmludGsoIiVkIiwgbGQoaG9zdF9pbmRleClbbGRuXS5jYWNoZV9mbGFnKTsKKwkJfQorCQlwcmludGsoIlxuSUJNIE1DQSBTQ1NJOiBTQ1NJLVJldHJ5IGJpdHM6ICIpOworCQlmb3IgKGxkbiA9IDA7IGxkbiA8PSBNQVhfTE9HX0RFVjsgbGRuKyspIHsKKwkJCXByaW50aygiJWQiLCBsZChob3N0X2luZGV4KVtsZG5dLnJldHJ5X2ZsYWcpOworCQl9CisJCXByaW50aygiXG4iKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gbnVtX2J1czsKK30KKworLyogcHJvYmluZyBzY3NpIGRldmljZXMgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2RldmljZXMoaW50IGhvc3RfaW5kZXgsIGludCBhZGFwdGVydHlwZSkKK3sKKwlpbnQgaWQsIGx1biwgbGRuLCB0aWNrczsKKwlpbnQgY291bnRfZGV2aWNlczsJLyogbG9jYWwgY291bnRlciBmb3IgY29ubmVjdGVkIGRldmljZSAqLworCWludCBtYXhfcHVuOworCWludCBudW1fYnVzOworCWludCBzcGVlZHJ1bjsJCS8qIGxvY2FsIGFkYXB0ZXJfc3BlZWQgY2hlY2sgdmFyaWFibGUgKi8KKworCS8qIGFzc2lnbiBkZWZhdWx0IHZhbHVlcyB0byBjZXJ0YWluIHZhcmlhYmxlcyAqLworCXRpY2tzID0gMDsKKwljb3VudF9kZXZpY2VzID0gMDsKKwlJQk1fRFMoaG9zdF9pbmRleCkuZHluX2ZsYWcgPSAwOwkvKiBub3JtYWxseSBubyBuZWVkIGZvciBkeW5hbWljYWwgbGRuIG1hbmFnZW1lbnQgKi8KKwlJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfZXJyb3JzID0gMDsJLyogc2V0IGVycm9yY291bnRlciB0byAwICovCisJbmV4dF9sZG4oaG9zdF9pbmRleCkgPSA3OwkvKiBuZXh0IGxkbiB0byBiZSBhc3NpZ25lZCBpcyA3LCBiZWNhdXNlIDAtNiBpcyAnaGFyZHdpcmVkJyAqLworCisJLyogaW5pdGlhbGl6ZSB0aGUgdmVyeSBpbXBvcnRhbnQgZHJpdmVyLWluZm9ybWF0aW9uYWwgYXJyYXlzL3N0cnVjdHMgKi8KKwltZW1zZXQobGQoaG9zdF9pbmRleCksIDAsIHNpemVvZihsZChob3N0X2luZGV4KSkpOworCWZvciAobGRuID0gMDsgbGRuIDw9IE1BWF9MT0dfREVWOyBsZG4rKykgeworCQlsYXN0X3Njc2lfY29tbWFuZChob3N0X2luZGV4KVtsZG5dID0gTk9fU0NTSTsJLyogZW1wdGlmeSBsYXN0IFNDU0ktY29tbWFuZCBzdG9yYWdlICovCisJCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpW2xkbl0gPSAwOworCQlsZChob3N0X2luZGV4KVtsZG5dLmNhY2hlX2ZsYWcgPSAxOworCQlsZChob3N0X2luZGV4KVtsZG5dLnJldHJ5X2ZsYWcgPSAxOworCX0KKwltZW1zZXQoZ2V0X2xkbihob3N0X2luZGV4KSwgVFlQRV9OT19ERVZJQ0UsIHNpemVvZihnZXRfbGRuKGhvc3RfaW5kZXgpKSk7CS8qIHRoaXMgaXMgZXNzZW50aWFsICEgKi8KKwltZW1zZXQoZ2V0X3Njc2koaG9zdF9pbmRleCksIFRZUEVfTk9fREVWSUNFLCBzaXplb2YoZ2V0X3Njc2koaG9zdF9pbmRleCkpKTsJLyogdGhpcyBpcyBlc3NlbnRpYWwgISAqLworCWZvciAobHVuID0gMDsgbHVuIDwgODsgbHVuKyspIHsKKwkJLyogbWFyayB0aGUgYWRhcHRlciBhdCBpdHMgcHVuIG9uIGFsbCBsdW5zICovCisJCWdldF9zY3NpKGhvc3RfaW5kZXgpW3N1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCldW2x1bl0gPSBUWVBFX0lCTV9TQ1NJX0FEQVBURVI7CisJCWdldF9sZG4oaG9zdF9pbmRleClbc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KV1bbHVuXSA9IE1BWF9MT0dfREVWOwkvKiBtYWtlIHN1cmUsIHRoZSBzdWJzeXN0ZW0KKwkJCQkJCQkJCQkJICAgbGRuIGlzIGFjdGl2ZSBmb3IgYWxsCisJCQkJCQkJCQkJCSAgIGx1bnMuICovCisJfQorCXByb2JlX2Rpc3BsYXkoMCk7CS8qIFN1cGVyY29vbCBkaXNwbGF5IHVzYWdlIGR1cmluZyBTQ1NJLXByb2JpbmcuICovCisJLyogVGhpcyBtYWtlcyBzZW5zZSwgd2hlbiBib290aW5nIHdpdGhvdXQgYW55ICovCisJLyogbW9uaXRvciBjb25uZWN0ZWQgb24gbW9kZWwgWFg5NS4gKi8KKworCS8qIFNURVAgMTogKi8KKwlhZGFwdGVyX3NwZWVkKGhvc3RfaW5kZXgpID0gZ2xvYmFsX2FkYXB0ZXJfc3BlZWQ7CisJc3BlZWRydW4gPSBhZGFwdGVyX3NwZWVkKGhvc3RfaW5kZXgpOworCXdoaWxlIChpbW1lZGlhdGVfZmVhdHVyZShob3N0X2luZGV4LCBzcGVlZHJ1biwgYWRhcHRlcl90aW1lb3V0KSA9PSAyKSB7CisJCXByb2JlX2Rpc3BsYXkoMSk7CisJCWlmIChzcGVlZHJ1biA9PSA3KQorCQkJcGFuaWMoIklCTSBNQ0EgU0NTSTogQ2Fubm90IHNldCBTeW5jaHJvbm91cy1UcmFuc2Zlci1SYXRlIVxuIik7CisJCXNwZWVkcnVuKys7CisJCWlmIChzcGVlZHJ1biA+IDcpCisJCQlzcGVlZHJ1biA9IDc7CisJfQorCWFkYXB0ZXJfc3BlZWQoaG9zdF9pbmRleCkgPSBzcGVlZHJ1bjsKKwkvKiBHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgYWRhcHRlciwgbmVjZXNzYXJ5IGZvcgorCSAqIGRldmljZSBvcGVyYXRpb25zOiAqLworCW51bV9idXMgPSBwcm9iZV9idXNfbW9kZShob3N0X2luZGV4KTsKKworCS8qIG51bV9idXMgY29udGFpbnMgb25seSB2YWxpZCBkYXRhIGZvciB0aGUgRi9XIGFkYXB0ZXIhICovCisJaWYgKGFkYXB0ZXJ0eXBlID09IElCTV9TQ1NJMl9GVykgewkvKiBGL1cgU0NTSSBhZGFwdGVyOiAqLworCQkvKiBGL1cgYWRhcHRlciBQVU4tc3BhY2UgZXh0ZW5zaW9uIGV2YWx1YXRpb246ICovCisJCWlmIChudW1fYnVzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6IFNlcGFyYXRlIGJ1cyBtb2RlICh3aWRlLWFkZHJlc3NpbmcgZW5hYmxlZClcbiIpOworCQkJc3Vic3lzdGVtX21heGlkKGhvc3RfaW5kZXgpID0gMTY7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6IENvbWJpbmVkIGJ1cyBtb2RlICh3aWRlLWFkZHJlc3NpbmcgZGlzYWJsZWQpXG4iKTsKKwkJCXN1YnN5c3RlbV9tYXhpZChob3N0X2luZGV4KSA9IDg7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiSUJNIE1DQSBTQ1NJOiBTeW5jLi1SYXRlIChGL1c6IDIwLCBJbnQuOiAxMCwgRXh0LjogJXMpIE1CeXRlcy9zXG4iLCBpYm1yYXRlKHNwZWVkcnVuLCBhZGFwdGVydHlwZSkpOworCX0gZWxzZQkJCS8qIGFsbCBvdGhlciBJQk0gU0NTSSBhZGFwdGVyczogKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiSUJNIE1DQSBTQ1NJOiBTeW5jaHJvbm91cy1TQ1NJLVRyYW5zZmVyLVJhdGU6ICVzIE1CeXRlcy9zXG4iLCBpYm1yYXRlKHNwZWVkcnVuLCBhZGFwdGVydHlwZSkpOworCisJLyogYXNzaWduIGNvcnJlY3QgUFVOIGRldmljZSBzcGFjZSAqLworCW1heF9wdW4gPSBzdWJzeXN0ZW1fbWF4aWQoaG9zdF9pbmRleCk7CisKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCXByaW50aygiSUJNIE1DQSBTQ1NJOiBDdXJyZW50IFNDU0ktaG9zdCBpbmRleDogJWRcbiIsIGhvc3RfaW5kZXgpOworCXByaW50aygiSUJNIE1DQSBTQ1NJOiBSZW1vdmluZyBkZWZhdWx0IGxvZ2ljYWwgU0NTSS1kZXZpY2UgbWFwcGluZy4iKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAiSUJNIE1DQSBTQ1NJOiBEZXYuIE9yZGVyOiAlcywgTWFwcGluZyAodGFrZXMgPDJtaW4pOiAiLCAoaWJtX2Fuc2lfb3JkZXIpID8gIkFOU0kiIDogIk5ldyIpOworI2VuZGlmCisJZm9yIChsZG4gPSAwOyBsZG4gPCBNQVhfTE9HX0RFVjsgbGRuKyspIHsKKwkJcHJvYmVfZGlzcGxheSgxKTsKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCQlwcmludGsoIi4iKTsKKyNlbmRpZgorCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIDAsIDAsIGxkbiwgUkVNT1ZFX0xETik7CS8qIHJlbW92ZSBsZG4gKHdoZXJldmVyKSAqLworCX0KKwlsdW4gPSAwOwkJLyogZGVmYXVsdCBsdW4gaXMgMCAqLworI2lmbmRlZiBJTV9ERUJVR19QUk9CRQorCXByaW50aygiY2xlYXJlZCwiKTsKKyNlbmRpZgorCS8qIFNURVAgMjogKi8KKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCXByaW50aygiXG5JQk0gTUNBIFNDU0k6IFNjYW5uaW5nIFNDU0ktZGV2aWNlcy4iKTsKKyNlbmRpZgorCWZvciAoaWQgPSAwOyBpZCA8IG1heF9wdW47IGlkKyspCisjaWZkZWYgQ09ORklHX1NDU0lfTVVMVElfTFVOCisJCWZvciAobHVuID0gMDsgbHVuIDwgODsgbHVuKyspCisjZW5kaWYKKwkJeworCQkJcHJvYmVfZGlzcGxheSgxKTsKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCQkJcHJpbnRrKCIuIik7CisjZW5kaWYKKwkJCWlmIChpZCAhPSBzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpKSB7CisJCQkJLyogaWYgcHVuIGlzIG5vdCB0aGUgYWRhcHRlcjogKi8KKwkJCQkvKiBzZXQgbGRuPTAgdG8gcHVuLGx1biAqLworCQkJCWltbWVkaWF0ZV9hc3NpZ24oaG9zdF9pbmRleCwgaWQsIGx1biwgUFJPQkVfTEROLCBTRVRfTEROKTsKKwkJCQlpZiAoZGV2aWNlX2lucXVpcnkoaG9zdF9pbmRleCwgUFJPQkVfTEROKSkgewkvKiBwcm9iZSBkZXZpY2UgKi8KKwkJCQkJZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0gPSAodW5zaWduZWQgY2hhcikgKGxkKGhvc3RfaW5kZXgpW1BST0JFX0xETl0uYnVmWzBdKTsKKwkJCQkJLyogZW50cnksIGV2ZW4gZm9yIE5PX0xVTiAqLworCQkJCQlpZiAobGQoaG9zdF9pbmRleClbUFJPQkVfTEROXS5idWZbMF0gIT0gVFlQRV9OT19MVU4pCisJCQkJCQljb3VudF9kZXZpY2VzKys7CS8qIGEgZXhpc3RpbmcgZGV2aWNlIGlzIGZvdW5kICovCisJCQkJfQorCQkJCS8qIHJlbW92ZSBsZG4gKi8KKwkJCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIGlkLCBsdW4sIFBST0JFX0xETiwgUkVNT1ZFX0xETik7CisJCQl9CisJCX0KKyNpZm5kZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoInNjYW5uZWQsIik7CisjZW5kaWYKKwkvKiBTVEVQIDM6ICovCisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoIlxuSUJNIE1DQSBTQ1NJOiBNYXBwaW5nIFNDU0ktZGV2aWNlcy4iKTsKKyNlbmRpZgorCWxkbiA9IDA7CisJbHVuID0gMDsKKyNpZmRlZiBDT05GSUdfU0NTSV9NVUxUSV9MVU4KKwlmb3IgKGx1biA9IDA7IGx1biA8IDggJiYgbGRuIDwgTUFYX0xPR19ERVY7IGx1bisrKQorI2VuZGlmCisJCWZvciAoaWQgPSAwOyBpZCA8IG1heF9wdW4gJiYgbGRuIDwgTUFYX0xPR19ERVY7IGlkKyspIHsKKwkJCXByb2JlX2Rpc3BsYXkoMSk7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJCXByaW50aygiLiIpOworI2VuZGlmCisJCQlpZiAoaWQgIT0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkgeworCQkJCWlmIChnZXRfc2NzaShob3N0X2luZGV4KVtpZF1bbHVuXSAhPSBUWVBFX05PX0xVTiAmJiBnZXRfc2NzaShob3N0X2luZGV4KVtpZF1bbHVuXSAhPSBUWVBFX05PX0RFVklDRSkgeworCQkJCQkvKiBPbmx5IG1hcCBpZiBhY2NlcHRlZCB0eXBlLiBBbHdheXMgZW50ZXIgZm9yCisJCQkJCSAgIGx1biA9PSAwIHRvIGdldCBubyBnYXBzIGludG8gbGRuLW1hcHBpbmcgZm9yIGxkbjw3LiAqLworCQkJCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIGlkLCBsdW4sIGxkbiwgU0VUX0xETik7CisJCQkJCWdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0gPSBsZG47CS8qIG1hcCBsZG4gKi8KKwkJCQkJaWYgKGRldmljZV9leGlzdHMoaG9zdF9pbmRleCwgbGRuLCAmbGQoaG9zdF9pbmRleClbbGRuXS5ibG9ja19sZW5ndGgsICZsZChob3N0X2luZGV4KVtsZG5dLmRldmljZV90eXBlKSkgeworI2lmZGVmIENPTkZJR19JQk1NQ0FfU0NTSV9ERVZfUkVTRVQKKwkJCQkJCXByaW50aygicmVzZXR0aW5nIGRldmljZSBhdCBsZG49JXggLi4uICIsIGxkbik7CisJCQkJCQlpbW1lZGlhdGVfcmVzZXQoaG9zdF9pbmRleCwgbGRuKTsKKyNlbmRpZgorCQkJCQkJbGRuKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBkZXZpY2UgdmFuaXNoZWQsIHByb2JhYmx5IGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8KKwkJCQkJCSAqIGhhbmRsZSBpdCBvciBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyAqLworCQkJCQkJaWYgKGx1biA+IDApIHsKKwkJCQkJCQkvKiByZW1vdmUgbWFwcGluZyAqLworCQkJCQkJCWdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0gPSBUWVBFX05PX0RFVklDRTsKKwkJCQkJCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIDAsIDAsIGxkbiwgUkVNT1ZFX0xETik7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlsZG4rKzsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAobHVuID09IDApIHsKKwkJCQkJLyogbWFwIGx1biA9PSAwLCBldmVuIGlmIG5vIGRldmljZSBleGlzdHMgKi8KKwkJCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCBpZCwgbHVuLCBsZG4sIFNFVF9MRE4pOworCQkJCQlnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dID0gbGRuOwkvKiBtYXAgbGRuICovCisJCQkJCWxkbisrOworCQkJCX0KKwkJCX0KKwkJfQorCS8qIFNURVAgNDogKi8KKworCS8qIG1hcCByZW1haW5pbmcgbGRucyB0byBub24tZXhpc3RpbmcgZGV2aWNlcyAqLworCWZvciAobHVuID0gMTsgbHVuIDwgOCAmJiBsZG4gPCBNQVhfTE9HX0RFVjsgbHVuKyspCisJCWZvciAoaWQgPSAwOyBpZCA8IG1heF9wdW4gJiYgbGRuIDwgTUFYX0xPR19ERVY7IGlkKyspIHsKKwkJCWlmIChnZXRfc2NzaShob3N0X2luZGV4KVtpZF1bbHVuXSA9PSBUWVBFX05PX0xVTiB8fCBnZXRfc2NzaShob3N0X2luZGV4KVtpZF1bbHVuXSA9PSBUWVBFX05PX0RFVklDRSkgeworCQkJCXByb2JlX2Rpc3BsYXkoMSk7CisJCQkJLyogTWFwIHJlbWFpbmluZyBsZG5zIG9ubHkgdG8gTk9OLWV4aXN0aW5nIHB1bixsdW4KKwkJCQkgICBjb21iaW5hdGlvbnMgdG8gbWFrZSBzdXJlIGFuIGlucXVpcnkgd2lsbCBmYWlsLgorCQkJCSAgIEZvciBNVUxUSV9MVU4sIGl0IGlzIG5lZWRlZCB0byBhdm9pZCBhZGFwdGVyIGF1dG9ub21lCisJCQkJICAgU0NTSS1yZW1hcHBpbmcuICovCisJCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCBpZCwgbHVuLCBsZG4sIFNFVF9MRE4pOworCQkJCWdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0gPSBsZG47CisJCQkJbGRuKys7CisJCQl9CisJCX0KKyNpZm5kZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoIm1hcHBlZC4iKTsKKyNlbmRpZgorCXByaW50aygiXG4iKTsKKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCWlmIChpYm1fYW5zaV9vcmRlcikKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IERldmljZSBvcmRlcjogSUJNL0FOU0kgKHB1bj03IGlzIGZpcnN0KS5cbiIpOworCWVsc2UKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IERldmljZSBvcmRlcjogTmV3IEluZHVzdHJ5IFN0YW5kYXJkIChwdW49MCBpcyBmaXJzdCkuXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkvKiBTaG93IHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBtYXBwaW5nIGR1cmluZyBib290LiAqLworCXByaW50aygiSUJNIE1DQSBTQ1NJOiBEZXRlcm1pbmVkIFNDU0ktZGV2aWNlLW1hcHBpbmc6XG4iKTsKKwlwcmludGsoIiAgICBQaHlzaWNhbCBTQ1NJLURldmljZSBNYXAgICAgICAgICAgICAgICBMb2dpY2FsIFNDU0ktRGV2aWNlIE1hcFxuIik7CisJcHJpbnRrKCJJRFxcTFVOICAwICAxICAyICAzICA0ICA1ICA2ICA3ICAgICAgIElEXFxMVU4gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDdcbiIpOworCWZvciAoaWQgPSAwOyBpZCA8IG1heF9wdW47IGlkKyspIHsKKwkJcHJpbnRrKCIlMmQgICAgICIsIGlkKTsKKwkJZm9yIChsdW4gPSAwOyBsdW4gPCA4OyBsdW4rKykKKwkJCXByaW50aygiJTJzICIsIHRpX3AoZ2V0X3Njc2koaG9zdF9pbmRleClbaWRdW2x1bl0pKTsKKwkJcHJpbnRrKCIgICAgICAlMmQgICAgICIsIGlkKTsKKwkJZm9yIChsdW4gPSAwOyBsdW4gPCA4OyBsdW4rKykKKwkJCXByaW50aygiJTJzICIsIHRpX2woZ2V0X2xkbihob3N0X2luZGV4KVtpZF1bbHVuXSkpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwkvKiBhc3NpZ24gdG90YWwgbnVtYmVyIG9mIGZvdW5kIFNDU0ktZGV2aWNlcyB0byB0aGUgc3RhdGlzdGljcyBzdHJ1Y3QgKi8KKwlJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfc2NzaV9kZXZpY2VzID0gY291bnRfZGV2aWNlczsKKworCS8qIGRlY2lkZSBmb3Igb3V0cHV0IGluIC9wcm9jLWZpbGVzeXN0ZW0sIGlmIHRoZSBjb25maWd1cmF0aW9uIG9mCisJICAgU0NTSS1kZXZpY2VzIG1ha2VzIGR5bmFtaWNhbCByZWFzc2lnbm1lbnQgb2YgZGV2aWNlcyBuZWNlc3NhcnkgKi8KKwlpZiAoY291bnRfZGV2aWNlcyA+PSBNQVhfTE9HX0RFVikKKwkJSUJNX0RTKGhvc3RfaW5kZXgpLmR5bl9mbGFnID0gMTsJLyogZHluYW1pY2FsIGFzc2lnbm1lbnQgaXMgbmVjZXNzYXJ5ICovCisJZWxzZQorCQlJQk1fRFMoaG9zdF9pbmRleCkuZHluX2ZsYWcgPSAwOwkvKiBkeW5hbWljYWwgYXNzaWdubWVudCBpcyBub3QgbmVjZXNzYXJ5ICovCisKKwkvKiBJZiBubyBTQ1NJLWRldmljZXMgYXJlIGFzc2lnbmVkLCByZXR1cm4gMSBpbiBvcmRlciB0byBjYXVzZSBtZXNzYWdlLiAqLworCWlmIChsZG4gPT0gMCkKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IFdhcm5pbmc6IE5vIFNDU0ktZGV2aWNlcyBmb3VuZC9hc3NpZ25lZCFcbiIpOworCisJLyogcmVzZXQgdGhlIGNvdW50ZXJzIGZvciBzdGF0aXN0aWNzIG9uIHRoZSBjdXJyZW50IGFkYXB0ZXIgKi8KKwlJQk1fRFMoaG9zdF9pbmRleCkuc2NicyA9IDA7CisJSUJNX0RTKGhvc3RfaW5kZXgpLmxvbmdfc2NicyA9IDA7CisJSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX2FjY2Vzc2VzID0gMDsKKwlJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfaW50ZXJydXB0cyA9IDA7CisJSUJNX0RTKGhvc3RfaW5kZXgpLmR5bmFtaWNhbF9hc3NpZ25tZW50cyA9IDA7CisJbWVtc2V0KElCTV9EUyhob3N0X2luZGV4KS5sZG5fYWNjZXNzLCAweDAsIHNpemVvZihJQk1fRFMoaG9zdF9pbmRleCkubGRuX2FjY2VzcykpOworCW1lbXNldChJQk1fRFMoaG9zdF9pbmRleCkubGRuX3JlYWRfYWNjZXNzLCAweDAsIHNpemVvZihJQk1fRFMoaG9zdF9pbmRleCkubGRuX3JlYWRfYWNjZXNzKSk7CisJbWVtc2V0KElCTV9EUyhob3N0X2luZGV4KS5sZG5fd3JpdGVfYWNjZXNzLCAweDAsIHNpemVvZihJQk1fRFMoaG9zdF9pbmRleCkubGRuX3dyaXRlX2FjY2VzcykpOworCW1lbXNldChJQk1fRFMoaG9zdF9pbmRleCkubGRuX2lucXVpcnlfYWNjZXNzLCAweDAsIHNpemVvZihJQk1fRFMoaG9zdF9pbmRleCkubGRuX2lucXVpcnlfYWNjZXNzKSk7CisJbWVtc2V0KElCTV9EUyhob3N0X2luZGV4KS5sZG5fbW9kZXNlbGVjdF9hY2Nlc3MsIDB4MCwgc2l6ZW9mKElCTV9EUyhob3N0X2luZGV4KS5sZG5fbW9kZXNlbGVjdF9hY2Nlc3MpKTsKKwltZW1zZXQoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hc3NpZ25tZW50cywgMHgwLCBzaXplb2YoSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hc3NpZ25tZW50cykpOworCXByb2JlX2Rpc3BsYXkoMCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGRldmljZV9leGlzdHMoaW50IGhvc3RfaW5kZXgsIGludCBsZG4sIGludCAqYmxvY2tfbGVuZ3RoLCBpbnQgKmRldmljZV90eXBlKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwkvKiBpZiBubyB2YWxpZCBkZXZpY2UgZm91bmQsIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIDAgKi8KKwlpZiAoIShkZXZpY2VfaW5xdWlyeShob3N0X2luZGV4LCBsZG4pKSkKKwkJcmV0dXJuIDA7CisJYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgKCYobGQoaG9zdF9pbmRleClbbGRuXS5idWYpKTsKKwlpZiAoKmJ1ZiA9PSBUWVBFX1JPTSkgeworCQkqZGV2aWNlX3R5cGUgPSBUWVBFX1JPTTsKKwkJKmJsb2NrX2xlbmd0aCA9IDIwNDg7CS8qIChzdGFuZGFyZCBibG9ja3NpemUgZm9yIHllbGxvdy0vcmVkLWJvb2spICovCisJCXJldHVybiAxOworCX0KKwlpZiAoKmJ1ZiA9PSBUWVBFX1dPUk0pIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9XT1JNOworCQkqYmxvY2tfbGVuZ3RoID0gMjA0ODsKKwkJcmV0dXJuIDE7CisJfQorCWlmICgqYnVmID09IFRZUEVfRElTSykgeworCQkqZGV2aWNlX3R5cGUgPSBUWVBFX0RJU0s7CisJCWlmIChyZWFkX2NhcGFjaXR5KGhvc3RfaW5kZXgsIGxkbikpIHsKKwkJCSpibG9ja19sZW5ndGggPSAqKGJ1ZiArIDcpICsgKCooYnVmICsgNikgPDwgOCkgKyAoKihidWYgKyA1KSA8PCAxNikgKyAoKihidWYgKyA0KSA8PCAyNCk7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKCpidWYgPT0gVFlQRV9NT0QpIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9NT0Q7CisJCWlmIChyZWFkX2NhcGFjaXR5KGhvc3RfaW5kZXgsIGxkbikpIHsKKwkJCSpibG9ja19sZW5ndGggPSAqKGJ1ZiArIDcpICsgKCooYnVmICsgNikgPDwgOCkgKyAoKihidWYgKyA1KSA8PCAxNikgKyAoKihidWYgKyA0KSA8PCAyNCk7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKCpidWYgPT0gVFlQRV9UQVBFKSB7CisJCSpkZXZpY2VfdHlwZSA9IFRZUEVfVEFQRTsKKwkJKmJsb2NrX2xlbmd0aCA9IDA7CS8qIG5vdCBpbiB1c2UgKHNldHRpbmcgYnkgbXQgYW5kIG10c3QgaW4gb3AuKSAqLworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCpidWYgPT0gVFlQRV9QUk9DRVNTT1IpIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9QUk9DRVNTT1I7CisJCSpibG9ja19sZW5ndGggPSAwOwkvKiB0aGV5IHNldCB0aGVpciBzdHVmZiBvbiBkcml2ZXJzICovCisJCXJldHVybiAxOworCX0KKwlpZiAoKmJ1ZiA9PSBUWVBFX1NDQU5ORVIpIHsKKwkJKmRldmljZV90eXBlID0gVFlQRV9TQ0FOTkVSOworCQkqYmxvY2tfbGVuZ3RoID0gMDsJLyogdGhleSBzZXQgdGhlaXIgc3R1ZmYgb24gZHJpdmVycyAqLworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCpidWYgPT0gVFlQRV9NRURJVU1fQ0hBTkdFUikgeworCQkqZGV2aWNlX3R5cGUgPSBUWVBFX01FRElVTV9DSEFOR0VSOworCQkqYmxvY2tfbGVuZ3RoID0gMDsJLyogT25lIG5ldmVyIGtub3dzLCB3aGF0IHRvIGV4cGVjdCBvbiBhIG1lZGl1bQorCQkJCQkgICBjaGFuZ2VyIGRldmljZS4gKi8KKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9pYm1tY2Ffc2NzaV9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlpbnQgaSwgaiwgaW9fYmFzZSwgaWRfYmFzZTsKKwljaGFyICp0b2tlbjsKKworCWlvX2Jhc2UgPSAwOworCWlkX2Jhc2UgPSAwOworCWlmIChzdHIpIHsKKwkJaiA9IDA7CisJCXdoaWxlICgodG9rZW4gPSBzdHJzZXAoJnN0ciwgIiwiKSkgIT0gTlVMTCkgeworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJhY3Rpdml0eSIpKQorCQkJCWRpc3BsYXlfbW9kZSB8PSBMRURfQUNUSVZJVFk7CisJCQlpZiAoIXN0cmNtcCh0b2tlbiwgImRpc3BsYXkiKSkKKwkJCQlkaXNwbGF5X21vZGUgfD0gTEVEX0RJU1A7CisJCQlpZiAoIXN0cmNtcCh0b2tlbiwgImFkaXNwbGF5IikpCisJCQkJZGlzcGxheV9tb2RlIHw9IExFRF9BRElTUDsKKwkJCWlmICghc3RyY21wKHRva2VuLCAibm9ybWFsIikpCisJCQkJaWJtX2Fuc2lfb3JkZXIgPSAwOworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJhbnNpIikpCisJCQkJaWJtX2Fuc2lfb3JkZXIgPSAxOworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJmYXN0IikpCisJCQkJZ2xvYmFsX2FkYXB0ZXJfc3BlZWQgPSAwOworCQkJaWYgKCFzdHJjbXAodG9rZW4sICJtZWRpdW0iKSkKKwkJCQlnbG9iYWxfYWRhcHRlcl9zcGVlZCA9IDQ7CisJCQlpZiAoIXN0cmNtcCh0b2tlbiwgInNsb3ciKSkKKwkJCQlnbG9iYWxfYWRhcHRlcl9zcGVlZCA9IDc7CisJCQlpZiAoKCp0b2tlbiA9PSAnLScpIHx8IChpc2RpZ2l0KCp0b2tlbikpKSB7CisJCQkJaWYgKCEoaiAlIDIpICYmIChpb19iYXNlIDwgSU1fTUFYX0hPU1RTKSkKKwkJCQkJaW9fcG9ydFtpb19iYXNlKytdID0gc2ltcGxlX3N0cnRvdWwodG9rZW4sIE5VTEwsIDApOworCQkJCWlmICgoaiAlIDIpICYmIChpZF9iYXNlIDwgSU1fTUFYX0hPU1RTKSkKKwkJCQkJc2NzaV9pZFtpZF9iYXNlKytdID0gc2ltcGxlX3N0cnRvdWwodG9rZW4sIE5VTEwsIDApOworCQkJCWorKzsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoaW50cykgeworCQlmb3IgKGkgPSAwOyBpIDwgSU1fTUFYX0hPU1RTICYmIDIgKiBpICsgMiA8IGludHNbMF07IGkrKykgeworCQkJaW9fcG9ydFtpXSA9IGludHNbMiAqIGkgKyAyXTsKKwkJCXNjc2lfaWRbaV0gPSBpbnRzWzIgKiBpICsgMl07CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGlibW1jYV9nZXRpbmZvKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKwlpbnQgbGVuLCBzcGVjaWFsZSwgY29ubmVjdG9yZSwgazsKKwl1bnNpZ25lZCBpbnQgcG9zWzhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkKKwlzaHBudCA9IGRldjsJCS8qIGFzc2lnbiBob3N0LXN0cnVjdHVyZSB0byBsb2NhbCBwb2ludGVyICovCisJbGVuID0gMDsJCS8qIHNldCBmaWxsZWQgdGV4dC1idWZmZXIgaW5kZXggdG8gMCAqLworCS8qIGdldCB0aGUgX3NwZWNpYWwgY29udGVudHMgb2YgdGhlIGhvc3RkYXRhIHN0cnVjdHVyZSAqLworCXNwZWNpYWxlID0gKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSktPl9zcGVjaWFsOworCWNvbm5lY3RvcmUgPSAoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X2Nvbm5lY3Rvcl9zaXplOworCWZvciAoayA9IDI7IGsgPCA0OyBrKyspCisJCXBvc1trXSA9ICgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fcG9zW2tdOworCWlmIChzcGVjaWFsZSA9PSBGT1JDRURfREVURUNUSU9OKSB7CS8qIGZvcmNlZCBkZXRlY3Rpb24gKi8KKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLAorCQkJICAgICAgICJBZGFwdGVyIGNhdGVnb3J5OiBmb3JjZWQgZGV0ZWN0ZWRcbiIgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIiAiKioqICBGb3JjZWQgZGV0ZWN0ZWQgU0NTSSBBZGFwdGVyICAgKioqXG4iICIqKiogIE5vIGNoaXAtaW5mb3JtYXRpb24gYXZhaWxhYmxlICAqKipcbiIgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJfSBlbHNlIGlmIChzcGVjaWFsZSA9PSBJTlRFR1JBVEVEX1NDU0kpIHsKKwkJLyogaWYgdGhlIGludGVncmF0ZWQgc3Vic3lzdGVtIGhhcyBiZWVuIGZvdW5kIGF1dG9tYXRpY2FsbHk6ICovCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwKKwkJCSAgICAgICAiQWRhcHRlciBjYXRlZ29yeTogaW50ZWdyYXRlZFxuIiAiQ2hpcCByZXZpc2lvbiBsZXZlbDogJWRcbiIgIkNoaXAgc3RhdHVzOiAlc1xuIiAiOCBrQnl0ZSBOVlJBTSBzdGF0dXM6ICVzXG4iLCAoKHBvc1syXSAmIDB4ZjApID4+IDQpLCAocG9zWzJdICYgMSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCAocG9zWzJdICYgMikgPyAibG9ja2VkIiA6ICJhY2Nlc3NpYmxlIik7CisJfSBlbHNlIGlmICgoc3BlY2lhbGUgPj0gMCkgJiYgKHNwZWNpYWxlIDwgKHNpemVvZihzdWJzeXNfbGlzdCkgLyBzaXplb2Yoc3RydWN0IHN1YnN5c19saXN0X3N0cnVjdCkpKSkgeworCQkvKiBpZiB0aGUgc3Vic3lzdGVtIGlzIGEgc2xvdCBhZGFwdGVyICovCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkFkYXB0ZXIgY2F0ZWdvcnk6IHNsb3QtY2FyZFxuIiAiUk9NIFNlZ21lbnQgQWRkcmVzczogIik7CisJCWlmICgocG9zWzJdICYgMHhmMCkgPT0gMHhmMCkKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIm9mZlxuIik7CisJCWVsc2UKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIjB4JXhcbiIsICgocG9zWzJdICYgMHhmMCkgPDwgMTMpICsgMHhjMDAwMCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNoaXAgc3RhdHVzOiAlc1xuIiwgKHBvc1syXSAmIDEpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkFkYXB0ZXIgSS9PIE9mZnNldDogMHgleFxuIiwgKChwb3NbMl0gJiAweDBlKSA8PCAyKSk7CisJfSBlbHNlIHsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQWRhcHRlciBjYXRlZ29yeTogdW5rbm93blxuIik7CisJfQorCS8qIGNvbW1vbiBzdWJzeXN0ZW0gaW5mb3JtYXRpb24gdG8gd3JpdGUgdG8gdGhlIHNsb3RuIGZpbGUgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJTdWJzeXN0ZW0gUFVOOiAlZFxuIiwgc2hwbnQtPnRoaXNfaWQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkkvTyBiYXNlIGFkZHJlc3MgcmFuZ2U6IDB4JXgtMHgleFxuIiwgKHVuc2lnbmVkIGludCkgKHNocG50LT5pb19wb3J0KSwgKHVuc2lnbmVkIGludCkgKHNocG50LT5pb19wb3J0ICsgNykpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIk1DQS1zbG90IHNpemU6ICVkIGJpdHMiLCBjb25uZWN0b3JlKTsKKwkvKiBOb3cgbWFrZSBzdXJlLCB0aGUgYnVmZmVybGVuZ3RoIGlzIGRldmlkYWJsZSBieSA0IHRvIGF2b2lkCisJICogcGFnaW5nIHByb2JsZW1zIG9mIHRoZSBidWZmZXIuICovCisJd2hpbGUgKGxlbiAlIHNpemVvZihpbnQpICE9IChzaXplb2YoaW50KSAtIDEpKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIgIik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNocG50LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gbGVuOworfQorCitpbnQgaWJtbWNhX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiBzY3NpX3RlbXBsYXRlKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCWludCBwb3J0LCBpZCwgaSwgaiwgaywgbGlzdF9zaXplLCBzbG90OworCWludCBkZXZpY2VzX29uX2lycV8xMSA9IDA7CisJaW50IGRldmljZXNfb25faXJxXzE0ID0gMDsKKwlpbnQgSVJRMTRfcmVnaXN0ZXJlZCA9IDA7CisJaW50IElSUTExX3JlZ2lzdGVyZWQgPSAwOworCisJZm91bmQgPSAwOwkJLyogbWFrZSBhYnNvbHV0ZWx5IHN1cmUsIHRoYXQgZm91bmQgaXMgc2V0IHRvIDAgKi8KKworCS8qIEZpcnN0IG9mIGFsbCwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkcml2ZXIuIFRoaXMgaXMKKwkgKiBpbXBvcnRhbnQgdG8gYWxsb3cgYmV0dGVyIHVzZXIgYnVncmVwb3J0cyBpbiBjYXNlIG9mIGFscmVhZHkKKwkgKiBoYXZpbmcgcHJvYmxlbXMgd2l0aCB0aGUgTUNBX2J1cyBwcm9iaW5nLiAqLworCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogVmVyc2lvbiAlc1xuIiwgSUJNTUNBX1NDU0lfRFJJVkVSX1ZFUlNJT04pOworCS8qIGlmIHRoaXMgaXMgbm90IE1DQSBtYWNoaW5lLCByZXR1cm4gIm5vdGhpbmcgZm91bmQiICovCisJaWYgKCFNQ0FfYnVzKSB7CisJCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogIE5vIE1pY3JvY2hhbm5lbC1idXMgcHJlc2VudCAtLT4gQWJvcnRpbmcuXG4iICIgICAgICAJICAgICBUaGlzIG1hY2hpbmUgZG9lcyBub3QgaGF2ZSBhbnkgSUJNIE1DQS1idXNcbiIgIiAgICAJICAgICBvciB0aGUgTUNBLUtlcm5lbC1zdXBwb3J0IGlzIG5vdCBlbmFibGVkIVxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE1PRFVMRQorCS8qIElmIHRoZSBkcml2ZXIgaXMgcnVuIGFzIG1vZHVsZSwgcmVhZCBmcm9tIGNvbmYubW9kdWxlcyBvciBjbWQtbGluZSAqLworCWlmIChib290X29wdGlvbnMpCisJCW9wdGlvbl9zZXR1cChib290X29wdGlvbnMpOworI2VuZGlmCisKKwkvKiBnZXQgaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgKi8KKwlpZiAocmVxdWVzdF9pcnEoSU1fSVJRLCBpbnRlcnJ1cHRfaGFuZGxlciwgU0FfU0hJUlEsICJpYm1tY2FzY3NpIiwgaG9zdHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBVbmFibGUgdG8gZ2V0IHNoYXJlZCBJUlEgJWQuXG4iLCBJTV9JUlEpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJSVJRMTRfcmVnaXN0ZXJlZCsrOworCisJLyogaWYgaWJtbWNhc2NzaSBzZXR1cCBvcHRpb24gd2FzIHBhc3NlZCB0byBrZXJuZWwsIHJldHVybiAiZm91bmQiICovCisJZm9yIChpID0gMDsgaSA8IElNX01BWF9IT1NUUzsgaSsrKQorCQlpZiAoaW9fcG9ydFtpXSA+IDAgJiYgc2NzaV9pZFtpXSA+PSAwICYmIHNjc2lfaWRbaV0gPCA4KSB7CisJCQlwcmludGsoIklCTSBNQ0EgU0NTSTogZm9yY2VkIGRldGVjdGVkIFNDU0kgQWRhcHRlciwgaW89MHgleCwgc2NzaSBpZD0lZC5cbiIsIGlvX3BvcnRbaV0sIHNjc2lfaWRbaV0pOworCQkJaWYgKChzaHBudCA9IGlibW1jYV9yZWdpc3RlcihzY3NpX3RlbXBsYXRlLCBpb19wb3J0W2ldLCBzY3NpX2lkW2ldLCBGT1JDRURfREVURUNUSU9OLCAiZm9yY2VkIGRldGVjdGVkIFNDU0kgQWRhcHRlciIpKSkgeworCQkJCWZvciAoayA9IDI7IGsgPCA3OyBrKyspCisJCQkJCSgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fcG9zW2tdID0gMDsKKwkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3NwZWNpYWwgPSBGT1JDRURfREVURUNUSU9OOworCQkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKE1DQV9JTlRFR1NDU0ksICJmb3JjZWQgZGV0ZWN0ZWQgU0NTSSBBZGFwdGVyIik7CisJCQkJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihNQ0FfSU5URUdTQ1NJLCAoTUNBX1Byb2NGbikgaWJtbWNhX2dldGluZm8sIHNocG50KTsKKwkJCQltY2FfbWFya19hc191c2VkKE1DQV9JTlRFR1NDU0kpOworCQkJCWRldmljZXNfb25faXJxXzE0Kys7CisJCQl9CisJCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiBmb3VuZDsKKworCS8qIFRoZSBQT1MyLXJlZ2lzdGVyIG9mIGFsbCBQUy8yIG1vZGVsIFNDU0ktc3Vic3lzdGVtcyBoYXMgdGhlIGZvbGxvd2luZworCSAqIGludGVycHJldGF0aW9uIG9mIGJpdHM6CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCA3IC0gNCA6IENoaXAgUmV2aXNpb24gSUQgKFJlbGVhc2UpCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAzIC0gMiA6IFJlc2VydmVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAxICAgICA6IDhrIE5WUkFNIERpc2FibGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAwICAgICA6IENoaXAgRW5hYmxlIChFTi1TaWduYWwpCisJICogVGhlIFBPUzMtcmVnaXN0ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDcgLSA1IDogU0NTSSBJRAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNCAgICAgOiBSZXNlcnZlZCA9IDAKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDMgLSAwIDogUmVzZXJ2ZWQgPSAwCisJICogKHRha2VuIGZyb20gIklCTSwgUFMvMiBIYXJkd2FyZSBJbnRlcmZhY2UgVGVjaG5pY2FsIFJlZmVyZW5jZSwgQ29tbW9uCisJICogSW50ZXJmYWNlcyAoMTk5MSkiKS4KKwkgKiBJbiBzaG9ydCB3b3JkcywgdGhpcyBtZWFucywgdGhhdCBJQk0gUFMvMiBtYWNoaW5lcyBvbmx5IHN1cHBvcnQKKwkgKiAxIHNpbmdsZSBzdWJzeXN0ZW0gYnkgZGVmYXVsdC4gVGhlIHNsb3QtYWRhcHRlcnMgbXVzdCBoYXZlIGFub3RoZXIKKwkgKiBjb25maWd1cmF0aW9uIG9uIHBvczIuIEhlcmUsIG9uZSBoYXMgdG8gYXNzdW1lIHRoZSBmb2xsb3dpbmcKKwkgKiB0aGluZ3MgZm9yIFBPUzItcmVnaXN0ZXI6CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCA3IC0gNCA6IENoaXAgUmV2aXNpb24gSUQgKFJlbGVhc2UpCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAzIC0gMSA6IHBvcnQgb2Zmc2V0IGZhY3RvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMCAgICAgOiBDaGlwIEVuYWJsZSAoRU4tU2lnbmFsKQorCSAqIEFzIEkgZm91bmQgYSBwYXRjaCBoZXJlLCBzZXR0aW5nIHRoZSBJTy1yZWdpc3RlcnMgdG8gMHgzNTQwIGZvcmNlZCwKKwkgKiBhcyB0aGVyZSB3YXMgYSAweDA1IGluIFBPUzIgb24gYSBtb2RlbCA1NiwgSSBhc3N1bWUsIHRoYXQgdGhlCisJICogcG9ydCAweDM1NDAgbXVzdCBiZSBmaXggZm9yIGludGVncmF0ZWQgU0NTSS1jb250cm9sbGVycy4KKwkgKiBPaywgdGhpcyBkaXNjb3ZlcnkgbGVhZHMgdG8gdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbjogKE0uTGFuZykgKi8KKworCS8qIGZpcnN0IGxvb2sgZm9yIHRoZSBJQk0gU0NTSSBpbnRlZ3JhdGVkIHN1YnN5c3RlbSBvbiB0aGUgbW90aGVyYm9hcmQgKi8KKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKQkvKiByZWFkIHRoZSBwb3MtaW5mb3JtYXRpb24gKi8KKwkJcG9zW2pdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhNQ0FfSU5URUdTQ1NJLCBqKTsKKwkvKiBwb3MyID0gcG9zMyA9IDB4ZmYgaWYgdGhlcmUgaXMgbm8gaW50ZWdyYXRlZCBTQ1NJLXN1YnN5c3RlbSBwcmVzZW50LCBidXQKKwkgKiBpZiB3ZSBpZ25vcmUgdGhlIHNldHRpbmdzIG9mIGFsbCBzdXJyb3VuZGluZyBwb3MgcmVnaXN0ZXJzLCBpdCBpcyBub3QKKwkgKiBjb21wbGV0ZWx5IHN1ZmZpY2llbnQgdG8gb25seSBjaGVjayBwb3MyIGFuZCBwb3MzLiAqLworCS8qIFRoZXJlZm9yZSwgbm93IHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGlzIHVzZWQgdG8KKwkgKiBtYWtlIHN1cmUsIHdlIHNlZSBhIHJlYWwgaW50ZWdyYXRlZCBvbmJvYXJkIFNDU0ktaW50ZXJmYWNlIGFuZCBubworCSAqIGludGVybmFsIHN5c3RlbSBpbmZvcm1hdGlvbiwgd2hpY2ggZ2V0cyBtYXBwZWQgdG8gc29tZSBwb3MgcmVnaXN0ZXJzCisJICogb24gbW9kZWxzIDk1eHguICovCisJaWYgKCghcG9zWzBdICYmICFwb3NbMV0gJiYgcG9zWzJdID4gMCAmJiBwb3NbM10gPiAwICYmICFwb3NbNF0gJiYgIXBvc1s1XSAmJiAhcG9zWzZdICYmICFwb3NbN10pIHx8IChwb3NbMF0gPT0gMHhmZiAmJiBwb3NbMV0gPT0gMHhmZiAmJiBwb3NbMl0gPCAweGZmICYmIHBvc1szXSA8IDB4ZmYgJiYgcG9zWzRdID09IDB4ZmYgJiYgcG9zWzVdID09IDB4ZmYgJiYgcG9zWzZdID09IDB4ZmYgJiYgcG9zWzddID09IDB4ZmYpKSB7CisJCWlmICgocG9zWzJdICYgMSkgPT0gMSkJLyogaXMgdGhlIHN1YnN5c3RlbSBjaGlwIGVuYWJsZWQgPyAqLworCQkJcG9ydCA9IElNX0lPX1BPUlQ7CisJCWVsc2UgewkJLyogaWYgZGlzYWJsZWQsIG5vIElSUXMgd2lsbCBiZSBnZW5lcmF0ZWQsIGFzIHRoZSBjaGlwIHdvbid0CisJCQkJICogbGlzdGVuIHRvIHRoZSBpbmNvbWluZyBjb21tYW5kcyBhbmQgd2lsbCBkbyByZWFsbHkgbm90aGluZywKKwkJCQkgKiBleGNlcHQgZm9yIGxpc3RlbmluZyB0byB0aGUgcG9zLXJlZ2lzdGVyIHNldHRpbmdzLiBJZiB0aGlzCisJCQkJICogaGFwcGVucywgSSBuZWVkIHRvIGh1Z2VseSB0aGluayBhYm91dCBpdCwgYXMgb25lIGhhcyB0bworCQkJCSAqIHdyaXRlIHNvbWV0aGluZyB0byB0aGUgTUNBLUJ1cyBwb3MgcmVnaXN0ZXIgaW4gb3JkZXIgdG8KKwkJCQkgKiBlbmFibGUgdGhlIGNoaXAuIE5vcm1hbGx5LCBJQk0tU0NTSSB3b24ndCBwYXNzIHRoZSBQT1NULAorCQkJCSAqIHdoZW4gdGhlIGNoaXAgaXMgZGlzYWJsZWQgKHNlZSBJQk0gdGVjaC4gcmVmLikuICovCisJCQlwb3J0ID0gSU1fSU9fUE9SVDsJLyogYW55d2F5LCBzZXQgdGhlIHBvcnRudW1iZXIgYW5kIHdhcm4gKi8KKwkJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBXQVJOSU5HIC0gWW91ciBTQ1NJLXN1YnN5c3RlbSBpcyBkaXNhYmxlZCFcbiIgIiAgICAgICAgICAgICAgU0NTSS1vcGVyYXRpb25zIG1heSBub3Qgd29yay5cbiIpOworCQl9CisJCWlkID0gKHBvc1szXSAmIDB4ZTApID4+IDU7CS8qIHRoaXMgaXMgY29ycmVjdCBhbmQgcmVwcmVzZW50cyB0aGUgUFVOICovCisJCS8qIGdpdmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIHN1YnN5c3RlbS4gVGhpcyBoZWxwcyBtZQorCQkgKiBhZGRpdGlvbmFsbHkgZHVyaW5nIGRlYnVnZ2luZyBhbmQgYW5hbHl6aW5nIGJ1Zy1yZXBvcnRzLiAqLworCQlwcmludGsoS0VSTl9JTkZPICJJQk0gTUNBIFNDU0k6IElCTSBJbnRlZ3JhdGVkIFNDU0kgQ29udHJvbGxlciBmZm91bmQsIGlvPTB4JXgsIHNjc2kgaWQ9JWQsXG4iLCBwb3J0LCBpZCk7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgICAgICAgY2hpcCByZXYuPSVkLCA4SyBOVlJBTT0lcywgc3Vic3lzdGVtPSVzXG4iLCAoKHBvc1syXSAmIDB4ZjApID4+IDQpLCAocG9zWzJdICYgMikgPyAibG9ja2VkIiA6ICJhY2Nlc3NpYmxlIiwgKHBvc1syXSAmIDEpID8gImVuYWJsZWQuIiA6ICJkaXNhYmxlZC4iKTsKKworCQkvKiByZWdpc3RlciB0aGUgZm91bmQgaW50ZWdyYXRlZCBTQ1NJLXN1YnN5c3RlbSAqLworCQlpZiAoKHNocG50ID0gaWJtbWNhX3JlZ2lzdGVyKHNjc2lfdGVtcGxhdGUsIHBvcnQsIGlkLCBJTlRFR1JBVEVEX1NDU0ksICJJQk0gSW50ZWdyYXRlZCBTQ1NJIENvbnRyb2xsZXIiKSkpIAorCQl7CisJCQlmb3IgKGsgPSAyOyBrIDwgNzsgaysrKQorCQkJCSgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fcG9zW2tdID0gcG9zW2tdOworCQkJKChzdHJ1Y3QgaWJtbWNhX2hvc3RkYXRhICopIHNocG50LT5ob3N0ZGF0YSktPl9zcGVjaWFsID0gSU5URUdSQVRFRF9TQ1NJOworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoTUNBX0lOVEVHU0NTSSwgIklCTSBJbnRlZ3JhdGVkIFNDU0kgQ29udHJvbGxlciIpOworCQkJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihNQ0FfSU5URUdTQ1NJLCAoTUNBX1Byb2NGbikgaWJtbWNhX2dldGluZm8sIHNocG50KTsKKwkJCW1jYV9tYXJrX2FzX3VzZWQoTUNBX0lOVEVHU0NTSSk7CisJCQlkZXZpY2VzX29uX2lycV8xNCsrOworCQl9CisJfQorCisJLyogbm93IGxvb2sgZm9yIG90aGVyIGFkYXB0ZXJzIGluIE1DQSBzbG90cywgKi8KKwkvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBrbm93biBJQk0tU0NTSS1zdWJzeXN0ZW0gdHlwZXMgKi8KKwkvKiBzZWUgdGhlIHBvc1syXSBkZXBlbmRlbmNlIHRvIGdldCB0aGUgYWRhcHRlciBwb3J0LW9mZnNldC4gKi8KKwlsaXN0X3NpemUgPSBzaXplb2Yoc3Vic3lzX2xpc3QpIC8gc2l6ZW9mKHN0cnVjdCBzdWJzeXNfbGlzdF9zdHJ1Y3QpOworCWZvciAoaSA9IDA7IGkgPCBsaXN0X3NpemU7IGkrKykgeworCQkvKiBzY2FuIGVhY2ggc2xvdCBmb3IgYSBmaXR0aW5nIGFkYXB0ZXIgaWQgKi8KKwkJc2xvdCA9IDA7CS8qIHN0YXJ0IGF0IHNsb3QgMCAqLworCQl3aGlsZSAoKHNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKHN1YnN5c19saXN0W2ldLm1jYV9pZCwgc2xvdCkpCisJCSAgICAgICAhPSBNQ0FfTk9URk9VTkQpIHsJLyogc2NhbiB0aHJvdWdoIGFsbCBzbG90cyAqLworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykJLyogcmVhZCB0aGUgcG9zLWluZm9ybWF0aW9uICovCisJCQkJcG9zW2pdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCBqKTsKKwkJCWlmICgocG9zWzJdICYgMSkgPT0gMSkKKwkJCQkvKiBpcyB0aGUgc3Vic3lzdGVtIGNoaXAgZW5hYmxlZCA/ICovCisJCQkJLyogKGV4cGxhbmF0aW9ucyBzZWUgYWJvdmUpICovCisJCQkJcG9ydCA9IElNX0lPX1BPUlQgKyAoKHBvc1syXSAmIDB4MGUpIDw8IDIpOworCQkJZWxzZSB7CisJCQkJLyogYW55d2F5LCBzZXQgdGhlIHBvcnRudW1iZXIgYW5kIHdhcm4gKi8KKwkJCQlwb3J0ID0gSU1fSU9fUE9SVCArICgocG9zWzJdICYgMHgwZSkgPDwgMik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSUJNIE1DQSBTQ1NJOiBXQVJOSU5HIC0gWW91ciBTQ1NJLXN1YnN5c3RlbSBpcyBkaXNhYmxlZCFcbiIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgICAgICAgICAgU0NTSS1vcGVyYXRpb25zIG1heSBub3Qgd29yay5cbiIpOworCQkJfQorCQkJaWYgKChpID09IElCTV9TQ1NJMl9GVykgJiYgKHBvc1s2XSAhPSAwKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBFUlJPUiAtIFdyb25nIFBPUyg2KS1yZWdpc3RlciBzZXR0aW5nIVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIEltcG9zc2libGUgdG8gZGV0ZXJtaW5lIGFkYXB0ZXIgUFVOIVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIEd1ZXNzaW5nIGFkYXB0ZXIgUFVOID0gNy5cbiIpOworCQkJCWlkID0gNzsKKwkJCX0gZWxzZSB7CisJCQkJaWQgPSAocG9zWzNdICYgMHhlMCkgPj4gNTsJLyogZ2V0IHN1YnN5c3RlbSBQVU4gKi8KKwkJCQlpZiAoaSA9PSBJQk1fU0NTSTJfRlcpIHsKKwkJCQkJaWQgfD0gKHBvc1szXSAmIDB4MTApID4+IDE7CS8qIGdldCBzdWJzeXN0ZW0gUFVOIGhpZ2gtYml0CisJCQkJCQkJCQkgKiBmb3IgRi9XIGFkYXB0ZXJzICovCisJCQkJfQorCQkJfQorCQkJaWYgKChpID09IElCTV9TQ1NJMl9GVykgJiYgKHBvc1s0XSAmIDB4MDEpICYmIChwb3NbNl0gPT0gMCkpIHsKKwkJCQkvKiBJUlExMSBpcyB1c2VkIGJ5IFNDU0ktMiBGL1cgQWRhcHRlci9BICovCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklCTSBNQ0EgU0NTSTogU0NTSS0yIEYvVyBhZGFwdGVyIG5lZWRzIElSUSAxMS5cbiIpOworCQkJCS8qIGdldCBpbnRlcnJ1cHQgcmVxdWVzdCBsZXZlbCAqLworCQkJCWlmIChyZXF1ZXN0X2lycShJTV9JUlFfRlcsIGludGVycnVwdF9oYW5kbGVyLCBTQV9TSElSUSwgImlibW1jYXNjc2kiLCBob3N0cykpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IFVuYWJsZSB0byBnZXQgc2hhcmVkIElSUSAlZC5cbiIsIElNX0lSUV9GVyk7CisJCQkJfSBlbHNlCisJCQkJCUlSUTExX3JlZ2lzdGVyZWQrKzsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogJXMgZm91bmQgaW4gc2xvdCAlZCwgaW89MHgleCwgc2NzaSBpZD0lZCxcbiIsIHN1YnN5c19saXN0W2ldLmRlc2NyaXB0aW9uLCBzbG90ICsgMSwgcG9ydCwgaWQpOworCQkJaWYgKChwb3NbMl0gJiAweGYwKSA9PSAweGYwKQorCQkJCXByaW50ayhLRVJOX0RFQlVHIiAgICAgICAgICAgICAgUk9NIEFkZHIuPW9mZiwiKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICAgICAgICBST00gQWRkci49MHgleCwiLCAoKHBvc1syXSAmIDB4ZjApIDw8IDEzKSArIDB4YzAwMDApOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiBwb3J0LW9mZnNldD0weCV4LCBzdWJzeXN0ZW09JXNcbiIsICgocG9zWzJdICYgMHgwZSkgPDwgMiksIChwb3NbMl0gJiAxKSA/ICJlbmFibGVkLiIgOiAiZGlzYWJsZWQuIik7CisKKwkJCS8qIHJlZ2lzdGVyIHRoZSBob3N0YWRhcHRlciAqLworCQkJaWYgKChzaHBudCA9IGlibW1jYV9yZWdpc3RlcihzY3NpX3RlbXBsYXRlLCBwb3J0LCBpZCwgaSwgc3Vic3lzX2xpc3RbaV0uZGVzY3JpcHRpb24pKSkgeworCQkJCWZvciAoayA9IDI7IGsgPCA4OyBrKyspCisJCQkJCSgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fcG9zW2tdID0gcG9zW2tdOworCQkJCSgoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSAqKSBzaHBudC0+aG9zdGRhdGEpLT5fc3BlY2lhbCA9IGk7CisJCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgc3Vic3lzX2xpc3RbaV0uZGVzY3JpcHRpb24pOworCQkJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgKE1DQV9Qcm9jRm4pIGlibW1jYV9nZXRpbmZvLCBzaHBudCk7CisJCQkJbWNhX21hcmtfYXNfdXNlZChzbG90KTsKKwkJCQlpZiAoKGkgPT0gSUJNX1NDU0kyX0ZXKSAmJiAocG9zWzRdICYgMHgwMSkgJiYgKHBvc1s2XSA9PSAwKSkKKwkJCQkJZGV2aWNlc19vbl9pcnFfMTErKzsKKwkJCQllbHNlCisJCQkJCWRldmljZXNfb25faXJxXzE0Kys7CisJCQl9CisJCQlzbG90Kys7CS8qIGFkdmFuY2UgdG8gbmV4dCBzbG90ICovCisJCX0JCS8qIGFkdmFuY2UgdG8gbmV4dCBhZGFwdGVyIGlkIGluIHRoZSBsaXN0IG9mIElCTS1TQ1NJLXN1YnN5c3RlbXMgKi8KKwl9CisKKwkvKiBub3cgY2hlY2sgZm9yIFNDU0ktYWRhcHRlcnMsIG1hcHBlZCB0byB0aGUgaW50ZWdyYXRlZCBTQ1NJCisJICogYXJlYS4gRS5nLiBhIFcvQ2FjaGUgaW4gTUNBLXNsb3QgOSghKS4gRG8gdGhlIGNoZWNrIGNvcnJlY3QgaGVyZSwKKwkgKiBhcyB0aGlzIGlzIGEga25vd24gZWZmZWN0IG9uIHNvbWUgbW9kZWxzIDk1eHguICovCisJbGlzdF9zaXplID0gc2l6ZW9mKHN1YnN5c19saXN0KSAvIHNpemVvZihzdHJ1Y3Qgc3Vic3lzX2xpc3Rfc3RydWN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKKwkJLyogc2NhbiBlYWNoIHNsb3QgZm9yIGEgZml0dGluZyBhZGFwdGVyIGlkICovCisJCXNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKHN1YnN5c19saXN0W2ldLm1jYV9pZCwgTUNBX0lOVEVHU0NTSSk7CisJCWlmIChzbG90ICE9IE1DQV9OT1RGT1VORCkgewkvKiBzY2FuIHRocm91Z2ggYWxsIHNsb3RzICovCisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQkvKiByZWFkIHRoZSBwb3MtaW5mb3JtYXRpb24gKi8KKwkJCQlwb3Nbal0gPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIGopOworCQkJaWYgKChwb3NbMl0gJiAxKSA9PSAxKSB7CS8qIGlzIHRoZSBzdWJzeXN0ZW0gY2hpcCBlbmFibGVkID8gKi8KKwkJCQkvKiAoZXhwbGFuYXRpb25zIHNlZSBhYm92ZSkgKi8KKwkJCQlwb3J0ID0gSU1fSU9fUE9SVCArICgocG9zWzJdICYgMHgwZSkgPDwgMik7CisJCQl9IGVsc2UgewkvKiBhbnl3YXksIHNldCB0aGUgcG9ydG51bWJlciBhbmQgd2FybiAqLworCQkJCXBvcnQgPSBJTV9JT19QT1JUICsgKChwb3NbMl0gJiAweDBlKSA8PCAyKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJQk0gTUNBIFNDU0k6IFdBUk5JTkcgLSBZb3VyIFNDU0ktc3Vic3lzdGVtIGlzIGRpc2FibGVkIVxuIik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICAgICAgICAgICAgICBTQ1NJLW9wZXJhdGlvbnMgbWF5IG5vdCB3b3JrLlxuIik7CisJCQl9CisJCQlpZiAoKGkgPT0gSUJNX1NDU0kyX0ZXKSAmJiAocG9zWzZdICE9IDApKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IEVSUk9SIC0gV3JvbmcgUE9TKDYpLXJlZ2lzdGVyIHNldHRpbmchXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgICIgICAgICAgICAgICAgIEltcG9zc2libGUgdG8gZGV0ZXJtaW5lIGFkYXB0ZXIgUFVOIVxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICAgICAgICAgICAgIEd1ZXNzaW5nIGFkYXB0ZXIgUFVOID0gNy5cbiIpOworCQkJCWlkID0gNzsKKwkJCX0gZWxzZSB7CisJCQkJaWQgPSAocG9zWzNdICYgMHhlMCkgPj4gNTsJLyogZ2V0IHN1YnN5c3RlbSBQVU4gKi8KKwkJCQlpZiAoaSA9PSBJQk1fU0NTSTJfRlcpCisJCQkJCWlkIHw9IChwb3NbM10gJiAweDEwKSA+PiAxOwkvKiBnZXQgc3Vic3lzdGVtIFBVTiBoaWdoLWJpdAorCQkJCQkJCQkJICogZm9yIEYvVyBhZGFwdGVycyAqLworCQkJfQorCQkJaWYgKChpID09IElCTV9TQ1NJMl9GVykgJiYgKHBvc1s0XSAmIDB4MDEpICYmIChwb3NbNl0gPT0gMCkpIHsKKwkJCQkvKiBJUlExMSBpcyB1c2VkIGJ5IFNDU0ktMiBGL1cgQWRhcHRlci9BICovCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgICJJQk0gTUNBIFNDU0k6IFNDU0ktMiBGL1cgYWRhcHRlciBuZWVkcyBJUlEgMTEuXG4iKTsKKwkJCQkvKiBnZXQgaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgKi8KKwkJCQlpZiAocmVxdWVzdF9pcnEoSU1fSVJRX0ZXLCBpbnRlcnJ1cHRfaGFuZGxlciwgU0FfU0hJUlEsICJpYm1tY2FzY3NpIiwgaG9zdHMpKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIklCTSBNQ0EgU0NTSTogVW5hYmxlIHRvIGdldCBzaGFyZWQgSVJRICVkLlxuIiwgSU1fSVJRX0ZXKTsKKwkJCQllbHNlCisJCQkJCUlSUTExX3JlZ2lzdGVyZWQrKzsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogJXMgZm91bmQgaW4gc2xvdCAlZCwgaW89MHgleCwgc2NzaSBpZD0lZCxcbiIsIHN1YnN5c19saXN0W2ldLmRlc2NyaXB0aW9uLCBzbG90ICsgMSwgcG9ydCwgaWQpOworCQkJaWYgKChwb3NbMl0gJiAweGYwKSA9PSAweGYwKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgICAgICAgICAgICAgIFJPTSBBZGRyLj1vZmYsIik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICAgICAgICAgUk9NIEFkZHIuPTB4JXgsIiwgKChwb3NbMl0gJiAweGYwKSA8PCAxMykgKyAweGMwMDAwKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgcG9ydC1vZmZzZXQ9MHgleCwgc3Vic3lzdGVtPSVzXG4iLCAoKHBvc1syXSAmIDB4MGUpIDw8IDIpLCAocG9zWzJdICYgMSkgPyAiZW5hYmxlZC4iIDogImRpc2FibGVkLiIpOworCisJCQkvKiByZWdpc3RlciB0aGUgaG9zdGFkYXB0ZXIgKi8KKwkJCWlmICgoc2hwbnQgPSBpYm1tY2FfcmVnaXN0ZXIoc2NzaV90ZW1wbGF0ZSwgcG9ydCwgaWQsIGksIHN1YnN5c19saXN0W2ldLmRlc2NyaXB0aW9uKSkpIHsKKwkJCQlmb3IgKGsgPSAyOyBrIDwgNzsgaysrKQorCQkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3Bvc1trXSA9IHBvc1trXTsKKwkJCQkoKHN0cnVjdCBpYm1tY2FfaG9zdGRhdGEgKikgc2hwbnQtPmhvc3RkYXRhKS0+X3NwZWNpYWwgPSBpOworCQkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsIHN1YnN5c19saXN0W2ldLmRlc2NyaXB0aW9uKTsKKwkJCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIChNQ0FfUHJvY0ZuKSBpYm1tY2FfZ2V0aW5mbywgc2hwbnQpOworCQkJCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisJCQkJaWYgKChpID09IElCTV9TQ1NJMl9GVykgJiYgKHBvc1s0XSAmIDB4MDEpICYmIChwb3NbNl0gPT0gMCkpCisJCQkJCWRldmljZXNfb25faXJxXzExKys7CisJCQkJZWxzZQorCQkJCQlkZXZpY2VzX29uX2lycV8xNCsrOworCQkJfQorCQkJc2xvdCsrOwkvKiBhZHZhbmNlIHRvIG5leHQgc2xvdCAqLworCQl9CQkvKiBhZHZhbmNlIHRvIG5leHQgYWRhcHRlciBpZCBpbiB0aGUgbGlzdCBvZiBJQk0tU0NTSS1zdWJzeXN0ZW1zICovCisJfQorCWlmIChJUlExMV9yZWdpc3RlcmVkICYmICFkZXZpY2VzX29uX2lycV8xMSkKKwkJZnJlZV9pcnEoSU1fSVJRX0ZXLCBob3N0cyk7CS8qIG5vIGRldmljZXMgb24gSVJRIDExICovCisJaWYgKElSUTE0X3JlZ2lzdGVyZWQgJiYgIWRldmljZXNfb25faXJxXzE0KQorCQlmcmVlX2lycShJTV9JUlEsIGhvc3RzKTsJLyogbm8gZGV2aWNlcyBvbiBJUlEgMTQgKi8KKwlpZiAoIWRldmljZXNfb25faXJxXzExICYmICFkZXZpY2VzX29uX2lycV8xNCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSUJNIE1DQSBTQ1NJOiBObyBJQk0gU0NTSS1zdWJzeXN0ZW0gYWRhcHRlciBhdHRhY2hlZC5cbiIpOworCXJldHVybiBmb3VuZDsJCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIGZvdW5kIFNDU0kgaG9zdHMuIFNob3VsZCBiZSAxIG9yIDAuICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICppYm1tY2FfcmVnaXN0ZXIoU2NzaV9Ib3N0X1RlbXBsYXRlICogc2NzaV90ZW1wbGF0ZSwgaW50IHBvcnQsIGludCBpZCwgaW50IGFkYXB0ZXJ0eXBlLCBjaGFyICpob3N0bmFtZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKworCS8qIGNoZWNrIEkvTyByZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnQsIElNX05fSU9fUE9SVCwgaG9zdG5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSUJNIE1DQSBTQ1NJOiBVbmFibGUgdG8gZ2V0IEkvTyByZWdpb24gMHgleC0weCV4ICglZCBwb3J0cykuXG4iLCBwb3J0LCBwb3J0ICsgSU1fTl9JT19QT1JUIC0gMSwgSU1fTl9JT19QT1JUKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogcmVnaXN0ZXIgaG9zdCAqLworCXNocG50ID0gc2NzaV9yZWdpc3RlcihzY3NpX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGlibW1jYV9ob3N0ZGF0YSkpOworCWlmICghc2hwbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IFVuYWJsZSB0byByZWdpc3RlciBob3N0LlxuIik7CisJCXJlbGVhc2VfcmVnaW9uKHBvcnQsIElNX05fSU9fUE9SVCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHJlcXVlc3QgSS9PIHJlZ2lvbiAqLworCWhvc3RzW2ZvdW5kXSA9IHNocG50OwkvKiBhZGQgbmV3IGZvdW5kIGhvc3RhZGFwdGVyIHRvIHRoZSBsaXN0ICovCisJc3BlY2lhbChmb3VuZCkgPSBhZGFwdGVydHlwZTsJLyogaW1wb3J0YW50IGFzc2lnbm1lbnQgb3IgZWxzZSBjcmFzaCEgKi8KKwlzdWJzeXN0ZW1fY29ubmVjdG9yX3NpemUoZm91bmQpID0gMDsJLyogcHJlc2V0IHNsb3Qtc2l6ZSAqLworCXNocG50LT5pcnEgPSBJTV9JUlE7CS8qIGFzc2lnbiBuZWNlc3Nhcnkgc3R1ZmYgZm9yIHRoZSBhZGFwdGVyICovCisJc2hwbnQtPmlvX3BvcnQgPSBwb3J0OworCXNocG50LT5uX2lvX3BvcnQgPSBJTV9OX0lPX1BPUlQ7CisJc2hwbnQtPnRoaXNfaWQgPSBpZDsKKwlzaHBudC0+bWF4X2lkID0gODsJLyogOCBQVU5zIGFyZSBkZWZhdWx0ICovCisJLyogbm93LCB0aGUgU0NTSS1zdWJzeXN0ZW0gaXMgY29ubmVjdGVkIHRvIExpbnV4ICovCisKKwljdHJsID0gKHVuc2lnbmVkIGludCkgKGluYihJTV9DVFJfUkVHKGZvdW5kKSkpOwkvKiBnZXQgY29udHJvbC1yZWdpc3RlciBzdGF0dXMgKi8KKyNpZmRlZiBJTV9ERUJVR19QUk9CRQorCXByaW50aygiSUJNIE1DQSBTQ1NJOiBDb250cm9sIFJlZ2lzdGVyIGNvbnRlbnRzOiAleCwgc3RhdHVzOiAleFxuIiwgY3RybCwgaW5iKElNX1NUQVRfUkVHKGZvdW5kKSkpOworCXByaW50aygiSUJNIE1DQSBTQ1NJOiBUaGlzIGFkYXB0ZXJzJyBQT1MtcmVnaXN0ZXJzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlwcmludGsoIiV4ICIsIHBvc1tpXSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmVzZXRfc3RhdHVzKGZvdW5kKSA9IElNX1JFU0VUX05PVF9JTl9QUk9HUkVTUzsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQkvKiByZXNldCB0aGUgdGFibGVzICovCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlnZXRfbGRuKGZvdW5kKVtpXVtqXSA9IE1BWF9MT0dfREVWOworCisJLyogY2hlY2sgd2hpY2ggbG9naWNhbCBkZXZpY2VzIGV4aXN0ICovCisJLyogYWZ0ZXIgdGhpcyBsaW5lLCBsb2NhbCBpbnRlcnJ1cHRpbmcgaXMgcG9zc2libGU6ICovCisJbG9jYWxfY2hlY2tpbmdfcGhhc2VfZmxhZyhmb3VuZCkgPSAxOworCWNoZWNrX2RldmljZXMoZm91bmQsIGFkYXB0ZXJ0eXBlKTsJLyogY2FsbCBieSB2YWx1ZSwgdXNpbmcgdGhlIGdsb2JhbCB2YXJpYWJsZSBob3N0cyAqLworCWxvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcoZm91bmQpID0gMDsKKwlmb3VuZCsrOwkJLyogbm93IGluY3JlYXNlIGluZGV4IHRvIGJlIHByZXBhcmVkIGZvciBuZXh0IGZvdW5kIHN1YnN5c3RlbSAqLworCS8qIGFuIGlibSBtY2Egc3Vic3lzdGVtIGhhcyBiZWVuIGRldGVjdGVkICovCisJcmV0dXJuIHNocG50OworfQorCitzdGF0aWMgaW50IGlibW1jYV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBzaHBudC0+bl9pb19wb3J0KTsKKwlpZiAoISgtLWZvdW5kKSkKKwkJZnJlZV9pcnEoc2hwbnQtPmlycSwgaG9zdHMpOworCXJldHVybiAwOworfQorCisvKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgaXMgdGhlIFNDU0kgY29tbWFuZCBxdWV1ZSBmb3IgdGhlIG1pZGxldmVsIGRyaXZlciAqLworc3RhdGljIGludCBpYm1tY2FfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIGNtZCwgdm9pZCAoKmRvbmUpIChTY3NpX0NtbmQgKikpCit7CisJdW5zaWduZWQgaW50IGxkbjsKKwl1bnNpZ25lZCBpbnQgc2NzaV9jbWQ7CisJc3RydWN0IGltX3NjYiAqc2NiOworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCWludCBjdXJyZW50X2xkbjsKKwlpbnQgaWQsIGx1bjsKKwlpbnQgdGFyZ2V0OworCWludCBob3N0X2luZGV4OworCWludCBtYXhfcHVuOworCWludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2w7CisKKwlzaHBudCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCS8qIHNlYXJjaCBmb3IgdGhlIHJpZ2h0IGhvc3RhZGFwdGVyICovCisJZm9yIChob3N0X2luZGV4ID0gMDsgaG9zdHNbaG9zdF9pbmRleF0gJiYgaG9zdHNbaG9zdF9pbmRleF0tPmhvc3Rfbm8gIT0gc2hwbnQtPmhvc3Rfbm87IGhvc3RfaW5kZXgrKyk7CisKKwlpZiAoIWhvc3RzW2hvc3RfaW5kZXhdKSB7CS8qIGludmFsaWQgaG9zdGFkYXB0ZXIgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWlmIChkb25lKQorCQkJZG9uZShjbWQpOworCQlyZXR1cm4gMDsKKwl9CisJbWF4X3B1biA9IHN1YnN5c3RlbV9tYXhpZChob3N0X2luZGV4KTsKKwlpZiAoaWJtX2Fuc2lfb3JkZXIpIHsKKwkJdGFyZ2V0ID0gbWF4X3B1biAtIDEgLSBjbWQtPmRldmljZS0+aWQ7CisJCWlmICgodGFyZ2V0IDw9IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpICYmIChjbWQtPmRldmljZS0+aWQgPD0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkpCisJCQl0YXJnZXQtLTsKKwkJZWxzZSBpZiAoKHRhcmdldCA+PSBzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpKSAmJiAoY21kLT5kZXZpY2UtPmlkID49IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpKQorCQkJdGFyZ2V0Kys7CisJfSBlbHNlCisJCXRhcmdldCA9IGNtZC0+ZGV2aWNlLT5pZDsKKworCS8qIGlmICh0YXJnZXQsbHVuKSBpcyBOTyBMVU4gb3Igbm90IGV4aXN0aW5nIGF0IGFsbCwgcmV0dXJuIGVycm9yICovCisJaWYgKChnZXRfc2NzaShob3N0X2luZGV4KVt0YXJnZXRdW2NtZC0+ZGV2aWNlLT5sdW5dID09IFRZUEVfTk9fTFVOKSB8fCAoZ2V0X3Njc2koaG9zdF9pbmRleClbdGFyZ2V0XVtjbWQtPmRldmljZS0+bHVuXSA9PSBUWVBFX05PX0RFVklDRSkpIHsKKwkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJaWYgKGRvbmUpCisJCQlkb25lKGNtZCk7CisJCXJldHVybiAwOworCX0KKworCS8qaWYgKHRhcmdldCxsdW4pIHVuYXNzaWduZWQsIGRvIGZ1cnRoZXIgY2hlY2tzLi4uICovCisJbGRuID0gZ2V0X2xkbihob3N0X2luZGV4KVt0YXJnZXRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCWlmIChsZG4gPj0gTUFYX0xPR19ERVYpIHsJLyogb24gaW52YWxpZCBsZG4gZG8gc3BlY2lhbCBzdHVmZiAqLworCQlpZiAobGRuID4gTUFYX0xPR19ERVYpIHsJLyogZHluYW1pY2FsIHJlbWFwcGluZyBpZiBsZG4gdW5hc3NpZ25lZCAqLworCQkJY3VycmVudF9sZG4gPSBuZXh0X2xkbihob3N0X2luZGV4KTsJLyogc3RvcC12YWx1ZSBmb3Igb25lIGNpcmNsZSAqLworCQkJd2hpbGUgKGxkKGhvc3RfaW5kZXgpW25leHRfbGRuKGhvc3RfaW5kZXgpXS5jbWQpIHsJLyogc2VhcmNoIGZvciBhIG9jY3VwaWVkLCBidXQgbm90IGluICovCisJCQkJLyogY29tbWFuZC1wcm9jZXNzaW5nIGxkbi4gKi8KKwkJCQluZXh0X2xkbihob3N0X2luZGV4KSsrOworCQkJCWlmIChuZXh0X2xkbihob3N0X2luZGV4KSA+PSBNQVhfTE9HX0RFVikKKwkJCQkJbmV4dF9sZG4oaG9zdF9pbmRleCkgPSA3OworCQkJCWlmIChjdXJyZW50X2xkbiA9PSBuZXh0X2xkbihob3N0X2luZGV4KSkgewkvKiBPbmUgY2lyY2xlIGRvbmUgPyAqLworCQkJCQkvKiBubyBub24tcHJvY2Vzc2luZyBsZG4gZm91bmQgKi8KKwkJCQkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IENhbm5vdCBhc3NpZ24gU0NTSS1kZXZpY2UgZHluYW1pY2FsbHkhXG4iICIgICAgICAgICAgICAgIE9uIGxkbiA3LTE0IFNDU0ktY29tbWFuZHMgZXZlcnl3aGVyZSBpbiBwcm9ncmVzcy5cbiIgIiAgICAgICAgICAgICAgUmVwb3J0aW5nIERJRF9OT19DT05ORUNUIGZvciBkZXZpY2UgKCVkLCVkKS5cbiIsIHRhcmdldCwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CS8qIHJldHVybiBubyBjb25uZWN0ICovCisJCQkJCWlmIChkb25lKQorCQkJCQkJZG9uZShjbWQpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIHVubWFwIG5vbi1wcm9jZXNzaW5nIGxkbiAqLworCQkJZm9yIChpZCA9IDA7IGlkIDwgbWF4X3B1bjsgaWQrKykKKwkJCQlmb3IgKGx1biA9IDA7IGx1biA8IDg7IGx1bisrKSB7CisJCQkJCWlmIChnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dID09IG5leHRfbGRuKGhvc3RfaW5kZXgpKSB7CisJCQkJCQlnZXRfbGRuKGhvc3RfaW5kZXgpW2lkXVtsdW5dID0gVFlQRV9OT19ERVZJQ0U7CisJCQkJCQlnZXRfc2NzaShob3N0X2luZGV4KVtpZF1bbHVuXSA9IFRZUEVfTk9fREVWSUNFOworCQkJCQkJLyogdW5tYXAgZW50cnkgKi8KKwkJCQkJfQorCQkJCX0KKwkJCS8qIHNldCByZWR1Y2VkIGludGVycnVwdF9oYW5kbGVyLW1vZGUgZm9yIGNoZWNraW5nICovCisJCQlsb2NhbF9jaGVja2luZ19waGFzZV9mbGFnKGhvc3RfaW5kZXgpID0gMTsKKwkJCS8qIG1hcCBmb3VuZCBsZG4gdG8gcHVuLGx1biAqLworCQkJZ2V0X2xkbihob3N0X2luZGV4KVt0YXJnZXRdW2NtZC0+ZGV2aWNlLT5sdW5dID0gbmV4dF9sZG4oaG9zdF9pbmRleCk7CisJCQkvKiBjaGFuZ2UgbGRuIHRvIHRoZSByaWdodCB2YWx1ZSwgdGhhdCBpcyBub3cgbmV4dF9sZG4gKi8KKwkJCWxkbiA9IG5leHRfbGRuKGhvc3RfaW5kZXgpOworCQkJLyogdW5hc3NpZ24gYWxsIGxkbnMgKHB1bixsdW4sbGRuIGRvZXMgbm90IG1hdHRlciBmb3IgcmVtb3ZlKSAqLworCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCAwLCAwLCAwLCBSRU1PVkVfTEROKTsKKwkJCS8qIHNldCBvbmx5IExETiBmb3IgcmVtYXBwZWQgZGV2aWNlICovCisJCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIHRhcmdldCwgY21kLT5kZXZpY2UtPmx1biwgbGRuLCBTRVRfTEROKTsKKwkJCS8qIGdldCBkZXZpY2UgaW5mb3JtYXRpb24gZm9yIGxkW2xkbl0gKi8KKwkJCWlmIChkZXZpY2VfZXhpc3RzKGhvc3RfaW5kZXgsIGxkbiwgJmxkKGhvc3RfaW5kZXgpW2xkbl0uYmxvY2tfbGVuZ3RoLCAmbGQoaG9zdF9pbmRleClbbGRuXS5kZXZpY2VfdHlwZSkpIHsKKwkJCQlsZChob3N0X2luZGV4KVtsZG5dLmNtZCA9IE5VTEw7CS8qIFRvIHByZXZlbnQgcGFuaWMgc2V0IDAsIGJlY2F1c2UKKwkJCQkJCQkJICAgZGV2aWNlcyB0aGF0IHdlcmUgbm90IGFzc2lnbmVkLAorCQkJCQkJCQkgICBzaG91bGQgaGF2ZSBub3RoaW5nIGluIHByb2dyZXNzLiAqLworCQkJCWdldF9zY3NpKGhvc3RfaW5kZXgpW3RhcmdldF1bY21kLT5kZXZpY2UtPmx1bl0gPSBsZChob3N0X2luZGV4KVtsZG5dLmRldmljZV90eXBlOworCQkJCS8qIGluY3JlYXNlIGFzc2lnbm1lbnQgY291bnRlcnMgZm9yIHN0YXRpc3RpY3MgaW4gL3Byb2MgKi8KKwkJCQlJQk1fRFMoaG9zdF9pbmRleCkuZHluYW1pY2FsX2Fzc2lnbm1lbnRzKys7CisJCQkJSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hc3NpZ25tZW50c1tsZG5dKys7CisJCQl9IGVsc2UKKwkJCQkvKiBwYW5pYyBoZXJlLCBiZWNhdXNlIGEgZGV2aWNlLCBmb3VuZCBhdCBib290dGltZSBoYXMKKwkJCQkgICB2YW5pc2hlZCAqLworCQkJCXBhbmljKCJJQk0gTUNBIFNDU0k6IGxkbj0weCV4LCBTQ1NJLWRldmljZSBvbiAoJWQsJWQpIHZhbmlzaGVkIVxuIiwgbGRuLCB0YXJnZXQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJLyogdW5hc3NpZ24gYWdhaW4gYWxsIGxkbnMgKHB1bixsdW4sbGRuIGRvZXMgbm90IG1hdHRlciBmb3IgcmVtb3ZlKSAqLworCQkJaW1tZWRpYXRlX2Fzc2lnbihob3N0X2luZGV4LCAwLCAwLCAwLCBSRU1PVkVfTEROKTsKKwkJCS8qIHJlbWFwIGFsbCBsZG5zLCBhcyB3cml0dGVuIGluIHRoZSBwdW4vbHVuIHRhYmxlICovCisJCQlsdW4gPSAwOworI2lmZGVmIENPTkZJR19TQ1NJX01VTFRJX0xVTgorCQkJZm9yIChsdW4gPSAwOyBsdW4gPCA4OyBsdW4rKykKKyNlbmRpZgorCQkJCWZvciAoaWQgPSAwOyBpZCA8IG1heF9wdW47IGlkKyspIHsKKwkJCQkJaWYgKGdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0gPD0gTUFYX0xPR19ERVYpCisJCQkJCQlpbW1lZGlhdGVfYXNzaWduKGhvc3RfaW5kZXgsIGlkLCBsdW4sIGdldF9sZG4oaG9zdF9pbmRleClbaWRdW2x1bl0sIFNFVF9MRE4pOworCQkJCX0KKwkJCS8qIHNldCBiYWNrIHRvIG5vcm1hbCBpbnRlcnJ1cHRfaGFuZGxpbmcgKi8KKwkJCWxvY2FsX2NoZWNraW5nX3BoYXNlX2ZsYWcoaG9zdF9pbmRleCkgPSAwOworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJCQkvKiBJbmZvcm1hdGlvbiBvbiBzeXNsb2cgdGVybWluYWwgKi8KKwkJCXByaW50aygiSUJNIE1DQSBTQ1NJOiBsZG49MHgleCBkeW5hbWljYWxseSByZWFzc2lnbmVkIHRvICglZCwlZCkuXG4iLCBsZG4sIHRhcmdldCwgY21kLT5kZXZpY2UtPmx1bik7CisjZW5kaWYKKwkJCS8qIGluY3JlYXNlIG5leHRfbGRuIGZvciBuZXh0IGR5bmFtaWNhbCBhc3NpZ25tZW50ICovCisJCQluZXh0X2xkbihob3N0X2luZGV4KSsrOworCQkJaWYgKG5leHRfbGRuKGhvc3RfaW5kZXgpID49IE1BWF9MT0dfREVWKQorCQkJCW5leHRfbGRuKGhvc3RfaW5kZXgpID0gNzsKKwkJfSBlbHNlIHsJLyogd2FsbCBhZ2FpbnN0IExpbnV4IGFjY2Vzc2VzIHRvIHRoZSBzdWJzeXN0ZW0gYWRhcHRlciAqLworCQkJY21kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJCWlmIChkb25lKQorCQkJCWRvbmUoY21kKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyp2ZXJpZnkgdGhlcmUgaXMgbm8gY29tbWFuZCBhbHJlYWR5IGluIHByb2dyZXNzIGZvciB0aGlzIGxvZyBkZXYgKi8KKwlpZiAobGQoaG9zdF9pbmRleClbbGRuXS5jbWQpCisJCXBhbmljKCJJQk0gTUNBIFNDU0k6IGNtZCBhbHJlYWR5IGluIHByb2dyZXNzIGZvciB0aGlzIGxkbi5cbiIpOworCisJLypzYXZlIGRvbmUgaW4gY21kLCBhbmQgc2F2ZSBjbWQgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwlsZChob3N0X2luZGV4KVtsZG5dLmNtZCA9IGNtZDsKKworCS8qZmlsbCBzY2IgaW5mb3JtYXRpb24gaW5kZXBlbmRlbnQgb2YgdGhlIHNjc2kgY29tbWFuZCAqLworCXNjYiA9ICYobGQoaG9zdF9pbmRleClbbGRuXS5zY2IpOworCWxkKGhvc3RfaW5kZXgpW2xkbl0udHNiLmRldl9zdGF0dXMgPSAwOworCXNjYi0+ZW5hYmxlID0gSU1fUkVQT1JUX1RTQl9PTkxZX09OX0VSUk9SIHwgSU1fUkVUUllfRU5BQkxFOworCXNjYi0+dHNiX2FkciA9IGlzYV92aXJ0X3RvX2J1cygmKGxkKGhvc3RfaW5kZXgpW2xkbl0udHNiKSk7CisJc2NzaV9jbWQgPSBjbWQtPmNtbmRbMF07CisKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJaSA9IGNtZC0+dXNlX3NnOworCQlzbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgKGNtZC0+cmVxdWVzdF9idWZmZXIpOworCQlpZiAoaSA+IDE2KQorCQkJcGFuaWMoIklCTSBNQ0EgU0NTSTogc2NhdHRlci1nYXRoZXIgbGlzdCB0b28gbG9uZy5cbiIpOworCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCWxkKGhvc3RfaW5kZXgpW2xkbl0uc2dlW2ldLmFkZHJlc3MgPSAodm9pZCAqKSAoaXNhX3BhZ2VfdG9fYnVzKHNsW2ldLnBhZ2UpICsgc2xbaV0ub2Zmc2V0KTsKKwkJCWxkKGhvc3RfaW5kZXgpW2xkbl0uc2dlW2ldLmJ5dGVfbGVuZ3RoID0gc2xbaV0ubGVuZ3RoOworCQl9CisJCXNjYi0+ZW5hYmxlIHw9IElNX1BPSU5URVJfVE9fTElTVDsKKwkJc2NiLT5zeXNfYnVmX2FkciA9IGlzYV92aXJ0X3RvX2J1cygmKGxkKGhvc3RfaW5kZXgpW2xkbl0uc2dlWzBdKSk7CisJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSBjbWQtPnVzZV9zZyAqIHNpemVvZihzdHJ1Y3QgaW1fc2dlKTsKKwl9IGVsc2UgeworCQlzY2ItPnN5c19idWZfYWRyID0gaXNhX3ZpcnRfdG9fYnVzKGNtZC0+cmVxdWVzdF9idWZmZXIpOworCQkvKiByZWNlbnQgTGludXggbWlkbGV2ZWwgU0NTSSBwbGFjZXMgMTAyNCBieXRlIGZvciBpbnF1aXJ5CisJCSAqIGNvbW1hbmQuIEZhciB0b28gbXVjaCBmb3Igb2xkIFBTLzIgaGFyZHdhcmUuICovCisJCXN3aXRjaCAoc2NzaV9jbWQpIHsKKwkJCS8qIGF2b2lkIGNvbW1hbmQgZXJyb3JzIGJ5IHNldHRpbmcgYnVmZmVybGVuZ3RocyB0bworCQkJICogQU5TSS1zdGFuZGFyZC4gQmV3YXJlIG9mIGZvcmNpbmcgaXQgdG8gMjU1LAorCQkJICogdGhpcyBjb3VsZCBTRUdWIHRoZSBrZXJuZWwhISEgKi8KKwkJY2FzZSBJTlFVSVJZOgorCQljYXNlIFJFUVVFU1RfU0VOU0U6CisJCWNhc2UgTU9ERV9TRU5TRToKKwkJY2FzZSBNT0RFX1NFTEVDVDoKKwkJCWlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA+IDI1NSkKKwkJCQlzY2ItPnN5c19idWZfbGVuZ3RoID0gMjU1OworCQkJZWxzZQorCQkJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJCWJyZWFrOworCQljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJCXNjYi0+c3lzX2J1Zl9sZW5ndGggPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzY2ItPnN5c19idWZfbGVuZ3RoID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQlicmVhazsKKwkJfQorCX0KKwkvKmZpbGwgc2NiIGluZm9ybWF0aW9uIGRlcGVuZGVudCBvbiBzY3NpIGNvbW1hbmQgKi8KKworI2lmZGVmIElNX0RFQlVHX0NNRAorCXByaW50aygiaXNzdWUgc2NzaSBjbWQ9JTAyeCB0byBsZG49JWRcbiIsIHNjc2lfY21kLCBsZG4pOworI2VuZGlmCisKKwkvKiBmb3Igc3BlY2lmaWMgZGV2aWNlLXR5cGUgZGVidWdnaW5nOiAqLworI2lmZGVmIElNX0RFQlVHX0NNRF9TUEVDX0RFVgorCWlmIChsZChob3N0X2luZGV4KVtsZG5dLmRldmljZV90eXBlID09IElNX0RFQlVHX0NNRF9ERVZJQ0UpCisJCXByaW50aygiKFNDU0ktZGV2aWNlLXR5cGU9MHgleCkgaXNzdWUgc2NzaSBjbWQ9JTAyeCB0byBsZG49JWRcbiIsIGxkKGhvc3RfaW5kZXgpW2xkbl0uZGV2aWNlX3R5cGUsIHNjc2lfY21kLCBsZG4pOworI2VuZGlmCisKKwkvKiBmb3IgcG9zc2libGUgcGFuaWNzIHN0b3JlIGN1cnJlbnQgY29tbWFuZCAqLworCWxhc3Rfc2NzaV9jb21tYW5kKGhvc3RfaW5kZXgpW2xkbl0gPSBzY3NpX2NtZDsKKwlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gSU1fU0NCOworCS8qIHVwZGF0ZSBzdGF0aXN0aWNhbCBpbmZvICovCisJSUJNX0RTKGhvc3RfaW5kZXgpLnRvdGFsX2FjY2Vzc2VzKys7CisJSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hY2Nlc3NbbGRuXSsrOworCisJc3dpdGNoIChzY3NpX2NtZCkgeworCWNhc2UgUkVBRF82OgorCWNhc2UgV1JJVEVfNjoKKwljYXNlIFJFQURfMTA6CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFJFQURfMTI6CisJY2FzZSBXUklURV8xMjoKKwkJLyogRGlzdGluZ3Vpc2ggYmV0d2VlbiBkaXNrIGFuZCBvdGhlciBkZXZpY2VzLiBPbmx5IGRpc2tzICh0aGF0IGFyZSB0aGUKKwkJICAgbW9zdCBmcmVxdWVudGx5IGFjY2Vzc2VkIGRldmljZXMpIHNob3VsZCBiZSBzdXBwb3J0ZWQgYnkgdGhlCisJCSAgIElCTS1TQ1NJLVN1YnN5c3RlbSBjb21tYW5kcy4gKi8KKwkJc3dpdGNoIChsZChob3N0X2luZGV4KVtsZG5dLmRldmljZV90eXBlKSB7CisJCWNhc2UgVFlQRV9ESVNLOgkvKiBmb3IgaGFyZGRpc2tzIGVudGVyIGhlcmUgLi4uICovCisJCWNhc2UgVFlQRV9NT0Q6CS8qIC4uLiB0cnkgaXQgYWxzbyBmb3IgTU8tZHJpdmVzIChzZW5kIGZsYW1lcyBhcyAqLworCQkJLyogICAgIHlvdSBsaWtlLCBpZiB0aGlzIHdvbid0IHdvcmsuKSAqLworCQkJaWYgKHNjc2lfY21kID09IFJFQURfNiB8fCBzY3NpX2NtZCA9PSBSRUFEXzEwIHx8IHNjc2lfY21kID09IFJFQURfMTIpIHsKKwkJCQkvKiByZWFkIGNvbW1hbmQgcHJlcGFyYXRpb25zICovCisJCQkJc2NiLT5lbmFibGUgfD0gSU1fUkVBRF9DT05UUk9MOworCQkJCUlCTV9EUyhob3N0X2luZGV4KS5sZG5fcmVhZF9hY2Nlc3NbbGRuXSsrOwkvKiBpbmNyZWFzZSBSRUFELWFjY2VzcyBvbiBsZG4gc3RhdC4gKi8KKwkJCQlzY2ItPmNvbW1hbmQgPSBJTV9SRUFEX0RBVEFfQ01EIHwgSU1fTk9fRElTQ09OTkVDVDsKKwkJCX0gZWxzZSB7CS8qIHdyaXRlIGNvbW1hbmQgcHJlcGFyYXRpb25zICovCisJCQkJSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl93cml0ZV9hY2Nlc3NbbGRuXSsrOwkvKiBpbmNyZWFzZSB3cml0ZS1jb3VudCBvbiBsZG4gc3RhdC4gKi8KKwkJCQlzY2ItPmNvbW1hbmQgPSBJTV9XUklURV9EQVRBX0NNRCB8IElNX05PX0RJU0NPTk5FQ1Q7CisJCQl9CisJCQlpZiAoc2NzaV9jbWQgPT0gUkVBRF82IHx8IHNjc2lfY21kID09IFdSSVRFXzYpIHsKKwkJCQlzY2ItPnUxLmxvZ19ibGtfYWRyID0gKCgodW5zaWduZWQpIGNtZC0+Y21uZFszXSkgPDwgMCkgfCAoKCh1bnNpZ25lZCkgY21kLT5jbW5kWzJdKSA8PCA4KSB8ICgoKCh1bnNpZ25lZCkgY21kLT5jbW5kWzFdKSAmIDB4MWYpIDw8IDE2KTsKKwkJCQlzY2ItPnUyLmJsay5jb3VudCA9ICh1bnNpZ25lZCkgY21kLT5jbW5kWzRdOworCQkJfSBlbHNlIHsKKwkJCQlzY2ItPnUxLmxvZ19ibGtfYWRyID0gKCgodW5zaWduZWQpIGNtZC0+Y21uZFs1XSkgPDwgMCkgfCAoKCh1bnNpZ25lZCkgY21kLT5jbW5kWzRdKSA8PCA4KSB8ICgoKHVuc2lnbmVkKSBjbWQtPmNtbmRbM10pIDw8IDE2KSB8ICgoKHVuc2lnbmVkKSBjbWQtPmNtbmRbMl0pIDw8IDI0KTsKKwkJCQlzY2ItPnUyLmJsay5jb3VudCA9ICgoKHVuc2lnbmVkKSBjbWQtPmNtbmRbOF0pIDw8IDApIHwgKCgodW5zaWduZWQpIGNtZC0+Y21uZFs3XSkgPDwgOCk7CisJCQl9CisJCQlsYXN0X3Njc2lfbG9naWNhbF9ibG9jayhob3N0X2luZGV4KVtsZG5dID0gc2NiLT51MS5sb2dfYmxrX2FkcjsKKwkJCWxhc3Rfc2NzaV9ibG9ja2NvdW50KGhvc3RfaW5kZXgpW2xkbl0gPSBzY2ItPnUyLmJsay5jb3VudDsKKwkJCXNjYi0+dTIuYmxrLmxlbmd0aCA9IGxkKGhvc3RfaW5kZXgpW2xkbl0uYmxvY2tfbGVuZ3RoOworCQkJYnJlYWs7CisJCQkvKiBmb3Igb3RoZXIgZGV2aWNlcywgZW50ZXIgaGVyZS4gT3RoZXIgdHlwZXMgYXJlIG5vdCBrbm93biBieQorCQkJICAgTGludXghIFRZUEVfTk9fTFVOIGlzIGZvcmJpZGRlbiBhcyB2YWxpZCBkZXZpY2UuICovCisJCWNhc2UgVFlQRV9ST006CisJCWNhc2UgVFlQRV9UQVBFOgorCQljYXNlIFRZUEVfUFJPQ0VTU09SOgorCQljYXNlIFRZUEVfV09STToKKwkJY2FzZSBUWVBFX1NDQU5ORVI6CisJCWNhc2UgVFlQRV9NRURJVU1fQ0hBTkdFUjoKKwkJCS8qIElmIHRoZXJlIGlzIGEgc2VxdWVudGlhbC1kZXZpY2UsIElCTSByZWNvbW1lbmRzIHRvIHVzZQorCQkJICAgSU1fT1RIRVJfU0NTSV9DTURfQ01EIGluc3RlYWQgb2Ygc3Vic3lzdGVtIFJFQUQvV1JJVEUuCisJCQkgICBUaGlzIGluY2x1ZGVzIENELVJPTSBkZXZpY2VzLCB0b28sIGR1ZSB0byB0aGUgcGFydGlhbCBzZXF1ZW50aWFsCisJCQkgICByZWFkIGNhcGFiaWxpdGllcy4gKi8KKwkJCXNjYi0+Y29tbWFuZCA9IElNX09USEVSX1NDU0lfQ01EX0NNRDsKKwkJCWlmIChzY3NpX2NtZCA9PSBSRUFEXzYgfHwgc2NzaV9jbWQgPT0gUkVBRF8xMCB8fCBzY3NpX2NtZCA9PSBSRUFEXzEyKQorCQkJCS8qIGVuYWJsZSBSRUFEICovCisJCQkJc2NiLT5lbmFibGUgfD0gSU1fUkVBRF9DT05UUk9MOworCQkJc2NiLT5lbmFibGUgfD0gSU1fQllQQVNTX0JVRkZFUjsKKwkJCXNjYi0+dTEuc2NzaV9jbWRfbGVuZ3RoID0gY21kLT5jbWRfbGVuOworCQkJbWVtY3B5KHNjYi0+dTIuc2NzaV9jb21tYW5kLCBjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbik7CisJCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gSU1fTE9OR19TQ0I7CisJCQkvKiBSZWFkL3dyaXRlIG9uIHRoaXMgbm9uLWRpc2sgZGV2aWNlcyBpcyBhbHNvIGRpc3BsYXl3b3J0aHksCisJCQkgICBzbyBmbGFzaC11cCB0aGUgTEVEL2Rpc3BsYXkuICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElOUVVJUlk6CisJCUlCTV9EUyhob3N0X2luZGV4KS5sZG5faW5xdWlyeV9hY2Nlc3NbbGRuXSsrOworCQlzY2ItPmNvbW1hbmQgPSBJTV9ERVZJQ0VfSU5RVUlSWV9DTUQ7CisJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTCB8IElNX1NVUFJFU1NfRVhDRVBUSU9OX1NIT1JUIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJc2NiLT51MS5sb2dfYmxrX2FkciA9IDA7CisJCWJyZWFrOworCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQlzY2ItPmNvbW1hbmQgPSBJTV9PVEhFUl9TQ1NJX0NNRF9DTUQ7CisJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTCB8IElNX1NVUFJFU1NfRVhDRVBUSU9OX1NIT1JUIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJc2NiLT51MS5sb2dfYmxrX2FkciA9IDA7CisJCXNjYi0+dTEuc2NzaV9jbWRfbGVuZ3RoID0gNjsKKwkJbWVtY3B5KHNjYi0+dTIuc2NzaV9jb21tYW5kLCBjbWQtPmNtbmQsIDYpOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gSU1fTE9OR19TQ0I7CisJCWJyZWFrOworCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJLyogdGhlIGxlbmd0aCBvZiBzeXN0ZW0gbWVtb3J5IGJ1ZmZlciBtdXN0IGJlIGV4YWN0bHkgOCBieXRlcyAqLworCQlzY2ItPmNvbW1hbmQgPSBJTV9SRUFEX0NBUEFDSVRZX0NNRDsKKwkJc2NiLT5lbmFibGUgfD0gSU1fUkVBRF9DT05UUk9MIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJaWYgKHNjYi0+c3lzX2J1Zl9sZW5ndGggPiA4KQorCQkJc2NiLT5zeXNfYnVmX2xlbmd0aCA9IDg7CisJCWJyZWFrOworCQkvKiBDb21tYW5kcyB0aGF0IG5lZWQgcmVhZC1vbmx5LW1vZGUgKHN5c3RlbSA8LSBkZXZpY2UpOiAqLworCWNhc2UgUkVRVUVTVF9TRU5TRToKKwkJc2NiLT5jb21tYW5kID0gSU1fUkVRVUVTVF9TRU5TRV9DTUQ7CisJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTCB8IElNX1NVUFJFU1NfRVhDRVBUSU9OX1NIT1JUIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJYnJlYWs7CisJCS8qIENvbW1hbmRzIHRoYXQgbmVlZCB3cml0ZS1vbmx5LW1vZGUgKHN5c3RlbSAtPiBkZXZpY2UpOiAqLworCWNhc2UgTU9ERV9TRUxFQ1Q6CisJY2FzZSBNT0RFX1NFTEVDVF8xMDoKKwkJSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9tb2Rlc2VsZWN0X2FjY2Vzc1tsZG5dKys7CisJCXNjYi0+Y29tbWFuZCA9IElNX09USEVSX1NDU0lfQ01EX0NNRDsKKwkJc2NiLT5lbmFibGUgfD0gSU1fU1VQUkVTU19FWENFUFRJT05fU0hPUlQgfCBJTV9CWVBBU1NfQlVGRkVSOwkvKlNlbGVjdCBuZWVkcyBXUklURS1lbmFibGVkICovCisJCXNjYi0+dTEuc2NzaV9jbWRfbGVuZ3RoID0gY21kLT5jbWRfbGVuOworCQltZW1jcHkoc2NiLT51Mi5zY3NpX2NvbW1hbmQsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwkJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX0xPTkdfU0NCOworCQlicmVhazsKKwkJLyogRm9yIG90aGVyIGNvbW1hbmRzLCByZWFkLW9ubHkgaXMgdXNlZnVsLiBNb3N0IG90aGVyIGNvbW1hbmRzIGFyZQorCQkgICBydW5uaW5nIHdpdGhvdXQgYW4gaW5wdXQtZGF0YS1ibG9jay4gKi8KKwlkZWZhdWx0OgorCQlzY2ItPmNvbW1hbmQgPSBJTV9PVEhFUl9TQ1NJX0NNRF9DTUQ7CisJCXNjYi0+ZW5hYmxlIHw9IElNX1JFQURfQ09OVFJPTCB8IElNX1NVUFJFU1NfRVhDRVBUSU9OX1NIT1JUIHwgSU1fQllQQVNTX0JVRkZFUjsKKwkJc2NiLT51MS5zY3NpX2NtZF9sZW5ndGggPSBjbWQtPmNtZF9sZW47CisJCW1lbWNweShzY2ItPnUyLnNjc2lfY29tbWFuZCwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworCQlsYXN0X3Njc2lfdHlwZShob3N0X2luZGV4KVtsZG5dID0gSU1fTE9OR19TQ0I7CisJCWJyZWFrOworCX0KKwkvKmlzc3VlIHNjYiBjb21tYW5kLCBhbmQgcmV0dXJuICovCisJaWYgKCsrZGlza19yd19pbl9wcm9ncmVzcyA9PSAxKQorCQlQUzJfRElTS19MRURfT04oc2hwbnQtPmhvc3Rfbm8sIHRhcmdldCk7CisKKwlpZiAobGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9PSBJTV9MT05HX1NDQikgeworCQlpc3N1ZV9jbWQoaG9zdF9pbmRleCwgaXNhX3ZpcnRfdG9fYnVzKHNjYiksIElNX0xPTkdfU0NCIHwgbGRuKTsKKwkJSUJNX0RTKGhvc3RfaW5kZXgpLmxvbmdfc2NicysrOworCX0gZWxzZSB7CisJCWlzc3VlX2NtZChob3N0X2luZGV4LCBpc2FfdmlydF90b19idXMoc2NiKSwgSU1fU0NCIHwgbGRuKTsKKwkJSUJNX0RTKGhvc3RfaW5kZXgpLnNjYnMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWJtbWNhX2Fib3J0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwkvKiBBYm9ydCBkb2VzIG5vdCB3b3JrLCBhcyB0aGUgYWRhcHRlciBuZXZlciBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0IG9uCisJICogd2hhdGV2ZXIgc2l0dWF0aW9uIGlzIHNpbXVsYXRlZCwgZXZlbiB3aGVuIHJlYWxseSBwZW5kaW5nIGNvbW1hbmRzCisJICogYXJlIHJ1bm5pbmcgb24gdGhlIGFkYXB0ZXJzJyBoYXJkd2FyZSAhICovCisKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKwl1bnNpZ25lZCBpbnQgbGRuOworCXZvaWQgKCpzYXZlZF9kb25lKSAoU2NzaV9DbW5kICopOworCWludCB0YXJnZXQ7CisJaW50IGhvc3RfaW5kZXg7CisJaW50IG1heF9wdW47CisJdW5zaWduZWQgbG9uZyBpbW1fY29tbWFuZDsKKworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IEFib3J0IHN1YnJvdXRpbmUgY2FsbGVkLi4uXG4iKTsKKyNlbmRpZgorCisJc2hwbnQgPSBjbWQtPmRldmljZS0+aG9zdDsKKwkvKiBzZWFyY2ggZm9yIHRoZSByaWdodCBob3N0YWRhcHRlciAqLworCWZvciAoaG9zdF9pbmRleCA9IDA7IGhvc3RzW2hvc3RfaW5kZXhdICYmIGhvc3RzW2hvc3RfaW5kZXhdLT5ob3N0X25vICE9IHNocG50LT5ob3N0X25vOyBob3N0X2luZGV4KyspOworCisJaWYgKCFob3N0c1tob3N0X2luZGV4XSkgewkvKiBpbnZhbGlkIGhvc3RhZGFwdGVyIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlpZiAoY21kLT5zY3NpX2RvbmUpCisJCQkoY21kLT5zY3NpX2RvbmUpIChjbWQpOworCQlzaHBudCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJCXByaW50ayhLRVJOX0RFQlVHICJJQk0gTUNBIFNDU0k6IEFib3J0IGFkYXB0ZXIgc2VsZWN0aW9uIGZhaWxlZCFcbiIpOworI2VuZGlmCisJCXJldHVybiBTVUNDRVNTOworCX0KKwltYXhfcHVuID0gc3Vic3lzdGVtX21heGlkKGhvc3RfaW5kZXgpOworCWlmIChpYm1fYW5zaV9vcmRlcikgeworCQl0YXJnZXQgPSBtYXhfcHVuIC0gMSAtIGNtZC0+ZGV2aWNlLT5pZDsKKwkJaWYgKCh0YXJnZXQgPD0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkgJiYgKGNtZC0+ZGV2aWNlLT5pZCA8PSBzdWJzeXN0ZW1fcHVuKGhvc3RfaW5kZXgpKSkKKwkJCXRhcmdldC0tOworCQllbHNlIGlmICgodGFyZ2V0ID49IHN1YnN5c3RlbV9wdW4oaG9zdF9pbmRleCkpICYmIChjbWQtPmRldmljZS0+aWQgPj0gc3Vic3lzdGVtX3B1bihob3N0X2luZGV4KSkpCisJCQl0YXJnZXQrKzsKKwl9IGVsc2UKKwkJdGFyZ2V0ID0gY21kLT5kZXZpY2UtPmlkOworCisJLyogZ2V0IGxvZ2ljYWwgZGV2aWNlIG51bWJlciwgYW5kIGRpc2FibGUgc3lzdGVtIGludGVycnVwdHMgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJJQk0gTUNBIFNDU0k6IFNlbmRpbmcgYWJvcnQgdG8gZGV2aWNlIHB1bj0lZCwgbHVuPSVkLlxuIiwgdGFyZ2V0LCBjbWQtPmRldmljZS0+bHVuKTsKKwlsZG4gPSBnZXRfbGRuKGhvc3RfaW5kZXgpW3RhcmdldF1bY21kLT5kZXZpY2UtPmx1bl07CisKKwkvKmlmIGNtZCBmb3IgdGhpcyBsZG4gaGFzIGFscmVhZHkgZmluaXNoZWQsIG5vIG5lZWQgdG8gYWJvcnQgKi8KKwlpZiAoIWxkKGhvc3RfaW5kZXgpW2xkbl0uY21kKSB7CisJCSAgICByZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwkvKiBDbGVhciBsZC5jbWQsIHNhdmUgZG9uZSBmdW5jdGlvbiwgaW5zdGFsbCBpbnRlcm5hbCBkb25lLAorCSAqIHNlbmQgYWJvcnQgaW1tZWRpYXRlIGNvbW1hbmQgKHRoaXMgZW5hYmxlcyBzeXMuIGludGVycnVwdHMpLAorCSAqIGFuZCB3YWl0IHVudGlsIHRoZSBpbnRlcnJ1cHQgYXJyaXZlcy4KKwkgKi8KKwlzYXZlZF9kb25lID0gY21kLT5zY3NpX2RvbmU7CisJY21kLT5zY3NpX2RvbmUgPSBpbnRlcm5hbF9kb25lOworCWNtZC0+U0NwLlN0YXR1cyA9IDA7CisJbGFzdF9zY3NpX2NvbW1hbmQoaG9zdF9pbmRleClbbGRuXSA9IElNX0FCT1JUX0lNTV9DTUQ7CisJbGFzdF9zY3NpX3R5cGUoaG9zdF9pbmRleClbbGRuXSA9IElNX0lNTV9DTUQ7CisJaW1tX2NvbW1hbmQgPSBpbmwoSU1fQ01EX1JFRyhob3N0X2luZGV4KSk7CisJaW1tX2NvbW1hbmQgJj0gKHVuc2lnbmVkIGxvbmcpICgweGZmZmYwMDAwKTsJLyogbWFzayByZXNlcnZlZCBzdHVmZiAqLworCWltbV9jb21tYW5kIHw9ICh1bnNpZ25lZCBsb25nKSAoSU1fQUJPUlRfSU1NX0NNRCk7CisJLyogbXVzdCB3YWl0IGZvciBhdHRlbnRpb24gcmVnIG5vdCBidXN5ICovCisJLyogRklYTUUgLSB0aW1lb3V0LCBwb2xpdGVuZXNzICovCisJd2hpbGUgKDEpIHsKKwkJaWYgKCEoaW5iKElNX1NUQVRfUkVHKGhvc3RfaW5kZXgpKSAmIElNX0JVU1kpKQorCQkJYnJlYWs7CisJfQorCS8qIHdyaXRlIHJlZ2lzdGVycyBhbmQgZW5hYmxlIHN5c3RlbSBpbnRlcnJ1cHRzICovCisJb3V0bChpbW1fY29tbWFuZCwgSU1fQ01EX1JFRyhob3N0X2luZGV4KSk7CisJb3V0YihJTV9JTU1fQ01EIHwgbGRuLCBJTV9BVFROX1JFRyhob3N0X2luZGV4KSk7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwlwcmludGsoIklCTSBNQ0EgU0NTSTogQWJvcnQgcXVldWVkIHRvIGFkYXB0ZXIuLi5cbiIpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxKHNocG50LT5ob3N0X2xvY2spOworCXdoaWxlICghY21kLT5TQ3AuU3RhdHVzKQorCQl5aWVsZCgpOworCXNwaW5fbG9ja19pcnEoc2hwbnQtPmhvc3RfbG9jayk7CisJY21kLT5zY3NpX2RvbmUgPSBzYXZlZF9kb25lOworI2lmZGVmIElNX0RFQlVHX1BST0JFCisJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IEFib3J0IHJldHVybmVkIHdpdGggYWRhcHRlciByZXNwb25zZS4uLlxuIik7CisjZW5kaWYKKworCS8qaWYgYWJvcnQgd2VudCB3ZWxsLCBjYWxsIHNhdmVkIGRvbmUsIHRoZW4gcmV0dXJuIHN1Y2Nlc3Mgb3IgZXJyb3IgKi8KKwlpZiAoY21kLT5yZXN1bHQgPT0gKERJRF9BQk9SVCA8PCAxNikpIAorCXsKKwkJY21kLT5yZXN1bHQgfD0gRElEX0FCT1JUIDw8IDE2OworCQlpZiAoY21kLT5zY3NpX2RvbmUpCisJCQkoY21kLT5zY3NpX2RvbmUpIChjbWQpOworCQlsZChob3N0X2luZGV4KVtsZG5dLmNtZCA9IE5VTEw7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IEFib3J0IGZpbmlzaGVkIHdpdGggc3VjY2Vzcy5cbiIpOworI2VuZGlmCisJCXJldHVybiBTVUNDRVNTOworCX0gZWxzZSB7CisJCWNtZC0+cmVzdWx0IHw9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlpZiAoY21kLT5zY3NpX2RvbmUpCisJCQkoY21kLT5zY3NpX2RvbmUpIChjbWQpOworCQlsZChob3N0X2luZGV4KVtsZG5dLmNtZCA9IE5VTEw7CisjaWZkZWYgSU1fREVCVUdfUFJPQkUKKwkJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IEFib3J0IGZhaWxlZC5cbiIpOworI2VuZGlmCisJCXJldHVybiBGQUlMRUQ7CisJfQorfQorCitzdGF0aWMgaW50IGlibW1jYV9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKKwlTY3NpX0NtbmQgKmNtZF9haWQ7CisJaW50IHRpY2tzLCBpOworCWludCBob3N0X2luZGV4OworCXVuc2lnbmVkIGxvbmcgaW1tX2NvbW1hbmQ7CisKKwlpZiAoY21kID09IE5VTEwpCisJCUJVRygpOworCisJdGlja3MgPSBJTV9SRVNFVF9ERUxBWSAqIEhaOworCXNocG50ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJLyogc2VhcmNoIGZvciB0aGUgcmlnaHQgaG9zdGFkYXB0ZXIgKi8KKwlmb3IgKGhvc3RfaW5kZXggPSAwOyBob3N0c1tob3N0X2luZGV4XSAmJiBob3N0c1tob3N0X2luZGV4XS0+aG9zdF9ubyAhPSBzaHBudC0+aG9zdF9ubzsgaG9zdF9pbmRleCsrKTsKKworCWlmICghaG9zdHNbaG9zdF9pbmRleF0pCS8qIGludmFsaWQgaG9zdGFkYXB0ZXIgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCXJldHVybiBGQUlMRUQ7CisKKwlpZiAobG9jYWxfY2hlY2tpbmdfcGhhc2VfZmxhZyhob3N0X2luZGV4KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJQk0gTUNBIFNDU0k6IHVuYWJsZSB0byByZXNldCB3aGlsZSBjaGVja2luZyBkZXZpY2VzLlxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyogaXNzdWUgcmVzZXQgaW1tZWRpYXRlIGNvbW1hbmQgdG8gc3Vic3lzdGVtLCBhbmQgd2FpdCBmb3IgaW50ZXJydXB0ICovCisJcHJpbnRrKCJJQk0gTUNBIFNDU0k6IHJlc2V0dGluZyBhbGwgZGV2aWNlcy5cbiIpOworCXJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9IElNX1JFU0VUX0lOX1BST0dSRVNTOworCWxhc3Rfc2NzaV9jb21tYW5kKGhvc3RfaW5kZXgpWzB4Zl0gPSBJTV9SRVNFVF9JTU1fQ01EOworCWxhc3Rfc2NzaV90eXBlKGhvc3RfaW5kZXgpWzB4Zl0gPSBJTV9JTU1fQ01EOworCWltbV9jb21tYW5kID0gaW5sKElNX0NNRF9SRUcoaG9zdF9pbmRleCkpOworCWltbV9jb21tYW5kICY9ICh1bnNpZ25lZCBsb25nKSAoMHhmZmZmMDAwMCk7CS8qIG1hc2sgcmVzZXJ2ZWQgc3R1ZmYgKi8KKwlpbW1fY29tbWFuZCB8PSAodW5zaWduZWQgbG9uZykgKElNX1JFU0VUX0lNTV9DTUQpOworCS8qIG11c3Qgd2FpdCBmb3IgYXR0ZW50aW9uIHJlZyBub3QgYnVzeSAqLworCXdoaWxlICgxKSB7CisJCWlmICghKGluYihJTV9TVEFUX1JFRyhob3N0X2luZGV4KSkgJiBJTV9CVVNZKSkKKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnEoc2hwbnQtPmhvc3RfbG9jayk7CisJCXlpZWxkKCk7CisJCXNwaW5fbG9ja19pcnEoc2hwbnQtPmhvc3RfbG9jayk7CisJfQorCS8qd3JpdGUgcmVnaXN0ZXJzIGFuZCBlbmFibGUgc3lzdGVtIGludGVycnVwdHMgKi8KKwlvdXRsKGltbV9jb21tYW5kLCBJTV9DTURfUkVHKGhvc3RfaW5kZXgpKTsKKwlvdXRiKElNX0lNTV9DTUQgfCAweGYsIElNX0FUVE5fUkVHKGhvc3RfaW5kZXgpKTsKKwkvKiB3YWl0IGZvciBpbnRlcnJ1cHQgZmluaXNoZWQgb3IgaW50cl9zdGF0IHJlZ2lzdGVyIHRvIGJlIHNldCwgYXMgdGhlCisJICogaW50ZXJydXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCB3aGlsZSB3ZSBhcmUgaW4gaGVyZSEgKi8KKwkgCisJLyogRklYTUU6IFRoaXMgaXMgcmVhbGx5IHJlYWxseSBpY2t5IHdlIHNvIHdhbnQgYSBzbGVlcGluZyB2ZXJzaW9uIG9mIHRoaXMgISAqLworCXdoaWxlIChyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPT0gSU1fUkVTRVRfSU5fUFJPR1JFU1MgJiYgLS10aWNrcyAmJiAoKGluYihJTV9JTlRSX1JFRyhob3N0X2luZGV4KSkgJiAweDhmKSAhPSAweDhmKSkgeworCQl1ZGVsYXkoKDEgKyA5OTkgLyBIWikgKiAxMDAwKTsKKwkJYmFycmllcigpOworCX0KKwkvKiBpZiByZXNldCBkaWQgbm90IGNvbXBsZXRlLCBqdXN0IHJldHVybiBhbiBlcnJvciAqLworCWlmICghdGlja3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IHJlc2V0IGRpZCBub3QgY29tcGxldGUgd2l0aGluICVkIHNlY29uZHMuXG4iLCBJTV9SRVNFVF9ERUxBWSk7CisJCXJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9IElNX1JFU0VUX0ZJTklTSEVEX0ZBSUw7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKChpbmIoSU1fSU5UUl9SRUcoaG9zdF9pbmRleCkpICYgMHg4ZikgPT0gMHg4ZikgeworCQkvKiBhbmFseXNpcyBkb25lIGJ5IHRoaXMgcm91dGluZSBhbmQgbm90IGJ5IHRoZSBpbnRyLXJvdXRpbmUgKi8KKwkJaWYgKGluYihJTV9JTlRSX1JFRyhob3N0X2luZGV4KSkgPT0gMHhhZikKKwkJCXJlc2V0X3N0YXR1cyhob3N0X2luZGV4KSA9IElNX1JFU0VUX0ZJTklTSEVEX09LX05PX0lOVDsKKwkJZWxzZSBpZiAoaW5iKElNX0lOVFJfUkVHKGhvc3RfaW5kZXgpKSA9PSAweGNmKQorCQkJcmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID0gSU1fUkVTRVRfRklOSVNIRURfRkFJTDsKKwkJZWxzZQkJLyogZmFpbGVkLCA0Z2V0IGl0ICovCisJCQlyZXNldF9zdGF0dXMoaG9zdF9pbmRleCkgPSBJTV9SRVNFVF9OT1RfSU5fUFJPR1JFU1NfTk9fSU5UOworCQlvdXRiKElNX0VPSSB8IDB4ZiwgSU1fQVRUTl9SRUcoaG9zdF9pbmRleCkpOworCX0KKworCS8qIGlmIHJlc2V0IGZhaWxlZCwganVzdCByZXR1cm4gYW4gZXJyb3IgKi8KKwlpZiAocmVzZXRfc3RhdHVzKGhvc3RfaW5kZXgpID09IElNX1JFU0VUX0ZJTklTSEVEX0ZBSUwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJQk0gTUNBIFNDU0k6IHJlc2V0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qIHNvIHJlc2V0IGZpbmlzaGVkIG9rIC0gY2FsbCBvdXRzdGFuZGluZyBkb25lJ3MsIGFuZCByZXR1cm4gc3VjY2VzcyAqLworCXByaW50ayhLRVJOX0lORk8gIklCTSBNQ0EgU0NTSTogUmVzZXQgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HX0RFVjsgaSsrKSB7CisJCWNtZF9haWQgPSBsZChob3N0X2luZGV4KVtpXS5jbWQ7CisJCWlmIChjbWRfYWlkICYmIGNtZF9haWQtPnNjc2lfZG9uZSkgeworCQkJbGQoaG9zdF9pbmRleClbaV0uY21kID0gTlVMTDsKKwkJCWNtZF9haWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJfQorCX0KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBpYm1tY2FfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mbykKK3sKKwlpbnQgc2l6ZSA9IGNhcGFjaXR5OworCWluZm9bMF0gPSA2NDsKKwlpbmZvWzFdID0gMzI7CisJaW5mb1syXSA9IHNpemUgLyAoaW5mb1swXSAqIGluZm9bMV0pOworCWlmIChpbmZvWzJdID49IDEwMjQpIHsKKwkJaW5mb1swXSA9IDEyODsKKwkJaW5mb1sxXSA9IDYzOworCQlpbmZvWzJdID0gc2l6ZSAvIChpbmZvWzBdICogaW5mb1sxXSk7CisJCWlmIChpbmZvWzJdID49IDEwMjQpIHsKKwkJCWluZm9bMF0gPSAyNTU7CisJCQlpbmZvWzFdID0gNjM7CisJCQlpbmZvWzJdID0gc2l6ZSAvIChpbmZvWzBdICogaW5mb1sxXSk7CisJCQlpZiAoaW5mb1syXSA+PSAxMDI0KQorCQkJCWluZm9bMl0gPSAxMDIzOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBjYWxjdWxhdGUgcGVyY2VudGFnZSBvZiB0b3RhbCBhY2Nlc3NlcyBvbiBhIGxkbiAqLworc3RhdGljIGludCBsZG5fYWNjZXNzX2xvYWQoaW50IGhvc3RfaW5kZXgsIGludCBsZG4pCit7CisJaWYgKElCTV9EUyhob3N0X2luZGV4KS50b3RhbF9hY2Nlc3NlcyA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmIChJQk1fRFMoaG9zdF9pbmRleCkubGRuX2FjY2Vzc1tsZG5dID09IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChJQk1fRFMoaG9zdF9pbmRleCkubGRuX2FjY2Vzc1tsZG5dICogMTAwKSAvIElCTV9EUyhob3N0X2luZGV4KS50b3RhbF9hY2Nlc3NlczsKK30KKworLyogY2FsY3VsYXRlIHRvdGFsIGFtb3VudCBvZiByL3ctYWNjZXNzZXMgKi8KK3N0YXRpYyBpbnQgbGRuX2FjY2Vzc190b3RhbF9yZWFkX3dyaXRlKGludCBob3N0X2luZGV4KQoreworCWludCBhOworCWludCBpOworCisJYSA9IDA7CisJZm9yIChpID0gMDsgaSA8PSBNQVhfTE9HX0RFVjsgaSsrKQorCQlhICs9IElCTV9EUyhob3N0X2luZGV4KS5sZG5fcmVhZF9hY2Nlc3NbaV0gKyBJQk1fRFMoaG9zdF9pbmRleCkubGRuX3dyaXRlX2FjY2Vzc1tpXTsKKwlyZXR1cm4gKGEpOworfQorCitzdGF0aWMgaW50IGxkbl9hY2Nlc3NfdG90YWxfaW5xdWlyeShpbnQgaG9zdF9pbmRleCkKK3sKKwlpbnQgYTsKKwlpbnQgaTsKKworCWEgPSAwOworCWZvciAoaSA9IDA7IGkgPD0gTUFYX0xPR19ERVY7IGkrKykKKwkJYSArPSBJQk1fRFMoaG9zdF9pbmRleCkubGRuX2lucXVpcnlfYWNjZXNzW2ldOworCXJldHVybiAoYSk7Cit9CisKK3N0YXRpYyBpbnQgbGRuX2FjY2Vzc190b3RhbF9tb2Rlc2VsZWN0KGludCBob3N0X2luZGV4KQoreworCWludCBhOworCWludCBpOworCisJYSA9IDA7CisJZm9yIChpID0gMDsgaSA8PSBNQVhfTE9HX0RFVjsgaSsrKQorCQlhICs9IElCTV9EUyhob3N0X2luZGV4KS5sZG5fbW9kZXNlbGVjdF9hY2Nlc3NbaV07CisJcmV0dXJuIChhKTsKK30KKworLyogcm91dGluZSB0byBkaXNwbGF5IGluZm8gaW4gdGhlIHByb2MtZnMtc3RydWN0dXJlIChhIGRlbHV4ZSBmZWF0dXJlKSAqLworc3RhdGljIGludCBpYm1tY2FfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJaW50IGxlbiA9IDA7CisJaW50IGksIGlkLCBsdW4sIGhvc3RfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWF4X3B1bjsKKworCWZvciAoaSA9IDA7IGhvc3RzW2ldICYmIGhvc3RzW2ldICE9IHNocG50OyBpKyspOworCQorCXNwaW5fbG9ja19pcnFzYXZlKGhvc3RzW2ldLT5ob3N0X2xvY2ssIGZsYWdzKTsJLyogQ2hlY2sgaXQgKi8KKwlob3N0X2luZGV4ID0gaTsKKwlpZiAoIXNocG50KSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlxuSUJNIE1DQSBTQ1NJOiBDYW4ndCBmaW5kIGFkYXB0ZXIgZm9yIGhvc3QgbnVtYmVyICVkXG4iLAorCQkJCXNocG50LT5ob3N0X25vKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJbWF4X3B1biA9IHN1YnN5c3RlbV9tYXhpZChob3N0X2luZGV4KTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlxuICAgICAgICAgICAgIElCTS1TQ1NJLVN1YnN5c3RlbS1MaW51eC1Ecml2ZXIsIFZlcnNpb24gJXNcblxuXG4iLCBJQk1NQ0FfU0NTSV9EUklWRVJfVkVSU0lPTik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiIFNDU0kgQWNjZXNzLVN0YXRpc3RpY3M6XG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBEZXZpY2UgU2Nhbm5pbmcgT3JkZXIuLi4uOiAlc1xuIiwgKGlibV9hbnNpX29yZGVyKSA/ICJJQk0vQU5TSSIgOiAiTmV3IEluZHVzdHJ5IFN0YW5kYXJkIik7CisjaWZkZWYgQ09ORklHX1NDU0lfTVVMVElfTFVOCisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgTXVsdGlwbGUgTFVOIHByb2JpbmcuLi4uLjogWWVzXG4iKTsKKyNlbHNlCisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgTXVsdGlwbGUgTFVOIHByb2JpbmcuLi4uLjogTm9cbiIpOworI2VuZGlmCisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgVGhpcyBIb3N0bnVtYmVyLi4uLi4uLi4uLjogJWRcbiIsIHNocG50LT5ob3N0X25vKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBCYXNlIEkvTy1Qb3J0Li4uLi4uLi4uLi4uOiAweCV4XG4iLCAodW5zaWduZWQgaW50KSAoSU1fQ01EX1JFRyhob3N0X2luZGV4KSkpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIChTaGFyZWQpIElSUS4uLi4uLi4uLi4uLi46ICVkXG4iLCBJTV9JUlEpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICAgICAgIFRvdGFsIEludGVycnVwdHMuLi4uLi4uLi46ICVkXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfaW50ZXJydXB0cyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgVG90YWwgU0NTSSBBY2Nlc3Nlcy4uLi4uLjogJWRcbiIsIElCTV9EUyhob3N0X2luZGV4KS50b3RhbF9hY2Nlc3Nlcyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgVG90YWwgc2hvcnQgU0NCcy4uLi4uLi4uLjogJWRcbiIsIElCTV9EUyhob3N0X2luZGV4KS5zY2JzKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBUb3RhbCBsb25nIFNDQnMuLi4uLi4uLi4uOiAlZFxuIiwgSUJNX0RTKGhvc3RfaW5kZXgpLmxvbmdfc2Nicyk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgICBUb3RhbCBTQ1NJIFJFQUQvV1JJVEUuLjogJWRcbiIsIGxkbl9hY2Nlc3NfdG90YWxfcmVhZF93cml0ZShob3N0X2luZGV4KSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgICBUb3RhbCBTQ1NJIElucXVpcmllcy4uLjogJWRcbiIsIGxkbl9hY2Nlc3NfdG90YWxfaW5xdWlyeShob3N0X2luZGV4KSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgICBUb3RhbCBTQ1NJIE1vZGVzZWxlY3RzLjogJWRcbiIsIGxkbl9hY2Nlc3NfdG90YWxfbW9kZXNlbGVjdChob3N0X2luZGV4KSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgICAgICAgICBUb3RhbCBTQ1NJIG90aGVyIGNtZHMuLjogJWRcbiIsIElCTV9EUyhob3N0X2luZGV4KS50b3RhbF9hY2Nlc3NlcyAtIGxkbl9hY2Nlc3NfdG90YWxfcmVhZF93cml0ZShob3N0X2luZGV4KQorCQkgICAgICAgLSBsZG5fYWNjZXNzX3RvdGFsX21vZGVzZWxlY3QoaG9zdF9pbmRleCkKKwkJICAgICAgIC0gbGRuX2FjY2Vzc190b3RhbF9pbnF1aXJ5KGhvc3RfaW5kZXgpKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBUb3RhbCBTQ1NJIGNvbW1hbmQgZmFpbHMuOiAlZFxuXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfZXJyb3JzKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgTG9naWNhbC1EZXZpY2UtTnVtYmVyIChMRE4pIEFjY2Vzcy1TdGF0aXN0aWNzOlxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAgTEROIHwgQWNjZXNzZXMgWyUlXSB8ICAgUkVBRCAgICB8ICAgV1JJVEUgICB8IEFTU0lHTk1FTlRTXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgIC0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0dfREVWOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICAgICUyWCAgfCAgICAlM2QgICAgICAgfCAgJThkIHwgICU4ZCB8ICU4ZFxuIiwgaSwgbGRuX2FjY2Vzc19sb2FkKGhvc3RfaW5kZXgsIGkpLCBJQk1fRFMoaG9zdF9pbmRleCkubGRuX3JlYWRfYWNjZXNzW2ldLCBJQk1fRFMoaG9zdF9pbmRleCkubGRuX3dyaXRlX2FjY2Vzc1tpXSwgSUJNX0RTKGhvc3RfaW5kZXgpLmxkbl9hc3NpZ25tZW50c1tpXSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgRHluYW1pY2FsLUxETi1Bc3NpZ25tZW50LVN0YXRpc3RpY3M6XG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBOdW1iZXIgb2YgcGh5c2ljYWwgU0NTSS1kZXZpY2VzLi46ICVkICgrIEFkYXB0ZXIpXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkudG90YWxfc2NzaV9kZXZpY2VzKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBEeW5hbWljYWwgQXNzaWdubWVudCBuZWNlc3NhcnkuLi46ICVzXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkuZHluX2ZsYWcgPyAiWWVzIiA6ICJObyAiKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBOZXh0IExETiB0byBiZSBhc3NpZ25lZC4uLi4uLi4uLi46IDB4JXhcbiIsIG5leHRfbGRuKGhvc3RfaW5kZXgpKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgICAgICAgICBEeW5hbWljYWwgYXNzaWdubWVudHMgZG9uZSB5ZXQuLi46ICVkXG4iLCBJQk1fRFMoaG9zdF9pbmRleCkuZHluYW1pY2FsX2Fzc2lnbm1lbnRzKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJcbiBDdXJyZW50IFNDU0ktRGV2aWNlLU1hcHBpbmc6XG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgICAgIFBoeXNpY2FsIFNDU0ktRGV2aWNlIE1hcCAgICAgICAgICAgICAgIExvZ2ljYWwgU0NTSS1EZXZpY2UgTWFwXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgICAgSURcXExVTiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICBJRFxcTFVOICAwICAxICAyICAzICA0ICA1ICA2ICA3XG4iKTsKKwlmb3IgKGlkID0gMDsgaWQgPCBtYXhfcHVuOyBpZCsrKSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAlMmQgICAgICIsIGlkKTsKKwkJZm9yIChsdW4gPSAwOyBsdW4gPCA4OyBsdW4rKykKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiUycyAiLCB0aV9wKGdldF9zY3NpKGhvc3RfaW5kZXgpW2lkXVtsdW5dKSk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAgICAgICUyZCAgICAgIiwgaWQpOworCQlmb3IgKGx1biA9IDA7IGx1biA8IDg7IGx1bisrKQorCQkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiJTJzICIsIHRpX2woZ2V0X2xkbihob3N0X2luZGV4KVtpZF1bbHVuXSkpOworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJcbiIpOworCX0KKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIihBID0gSUJNLVN1YnN5c3RlbSwgRCA9IEhhcmRkaXNrLCBUID0gVGFwZWRyaXZlLCBQID0gUHJvY2Vzc29yLCBXID0gV09STSxcbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiBSID0gQ0QtUk9NLCBTID0gU2Nhbm5lciwgTSA9IE1PLURyaXZlLCBDID0gTWVkaXVtLUNoYW5nZXIsICsgPSB1bnByb3ZpZGVkIExVTixcbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAtID0gbm90aGluZyBmb3VuZCwgbm90aGluZyBhc3NpZ25lZCBvciB1bnByb2JlZCBMVU4pXG5cbiIpOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hwbnQtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgb3B0aW9uX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1tJTV9NQVhfSE9TVFNdOworCWNoYXIgKmN1ciA9IHN0cjsKKwlpbnQgaSA9IDE7CisKKwl3aGlsZSAoY3VyICYmIGlzZGlnaXQoKmN1cikgJiYgaSA8PSBJTV9NQVhfSE9TVFMpIHsKKwkJaW50c1tpKytdID0gc2ltcGxlX3N0cnRvdWwoY3VyLCBOVUxMLCAwKTsKKwkJaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSAhPSBOVUxMKQorCQkJY3VyKys7CisJfQorCWludHNbMF0gPSBpIC0gMTsKKwlpbnRlcm5hbF9pYm1tY2Ffc2NzaV9zZXR1cChjdXIsIGludHMpOworCXJldHVybiAwOworfQorCitfX3NldHVwKCJpYm1tY2FzY3NpPSIsIG9wdGlvbl9zZXR1cCk7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworICAgICAgICAgIC5wcm9jX25hbWUgICAgICA9ICJpYm1tY2EiLAorCSAgLnByb2NfaW5mbwkgID0gaWJtbWNhX3Byb2NfaW5mbywKKyAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSUJNIFNDU0ktU3Vic3lzdGVtIiwKKyAgICAgICAgICAuZGV0ZWN0ICAgICAgICAgPSBpYm1tY2FfZGV0ZWN0LAorICAgICAgICAgIC5yZWxlYXNlICAgICAgICA9IGlibW1jYV9yZWxlYXNlLAorICAgICAgICAgIC5xdWV1ZWNvbW1hbmQgICA9IGlibW1jYV9xdWV1ZWNvbW1hbmQsCisJICAuZWhfYWJvcnRfaGFuZGxlciA9IGlibW1jYV9hYm9ydCwKKwkgIC5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPSBpYm1tY2FfaG9zdF9yZXNldCwKKyAgICAgICAgICAuYmlvc19wYXJhbSAgICAgPSBpYm1tY2FfYmlvc3BhcmFtLAorICAgICAgICAgIC5jYW5fcXVldWUgICAgICA9IDE2LAorICAgICAgICAgIC50aGlzX2lkICAgICAgICA9IDcsCisgICAgICAgICAgLnNnX3RhYmxlc2l6ZSAgID0gMTYsCisgICAgICAgICAgLmNtZF9wZXJfbHVuICAgID0gMSwKKyAgICAgICAgICAudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm1tY2EuaCBiL2RyaXZlcnMvc2NzaS9pYm1tY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY4ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2libW1jYS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBMb3cgTGV2ZWwgRHJpdmVyIGZvciB0aGUgSUJNIE1pY3JvY2hhbm5lbCBTQ1NJIFN1YnN5c3RlbQorICogKEhlYWRlcmZpbGUsIHNlZSBEb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dCBmb3IgZGVzY3JpcHRpb24gb2YgdGhlCisgKiBJQk0gTUNBIFNDU0ktZHJpdmVyLgorICogRm9yIHVzZSB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2l0aGluIHRoZSBMaW51eC1rZXJuZWwgcHJvamVjdC4KKyAqIFRoaXMgaW5jbHVkZSBmaWxlIHdvcmtzIG9ubHkgY29ycmVjdGx5IHdpdGgga2VybmVsIDIuNC4wIG9yIGhpZ2hlciEhISAqLworCisjaWZuZGVmIF9JQk1NQ0FfSAorI2RlZmluZSBfSUJNTUNBX0gKKworLyogQ29tbW9uIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBhbGwgTGludXgtdmVyc2lvbnM6ICovCisKKy8qIEludGVyZmFjZXMgdG8gdGhlIG1pZGxldmVsIExpbnV4IFNDU0kgZHJpdmVyICovCitzdGF0aWMgaW50IGlibW1jYV9kZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgaWJtbWNhX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IGlibW1jYV9xdWV1ZWNvbW1hbmQgKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IGlibW1jYV9hYm9ydCAoU2NzaV9DbW5kICopOworc3RhdGljIGludCBpYm1tY2FfaG9zdF9yZXNldCAoU2NzaV9DbW5kICopOworc3RhdGljIGludCBpYm1tY2FfYmlvc3BhcmFtIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLCBzZWN0b3JfdCwgaW50ICopOworCisjZW5kaWYgLyogX0lCTU1DQV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNDdiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19TQ1NJX0lCTVZTQ1NJKQkrPSBpYm12c2NzaWMubworCitpYm12c2NzaWMteQkJCSs9IGlibXZzY3NpLm8KK2libXZzY3NpYy0kKENPTkZJR19QUENfSVNFUklFUykJKz0gaXNlcmllc192c2NzaS5vIAoraWJtdnNjc2ljLSQoQ09ORklHX1BQQ19QU0VSSUVTKQkrPSBycGFfdnNjc2kubyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5Zjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCkBAIC0wLDAgKzEsMTQ3MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpYm12c2NzaS5jCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAxOTk0LCAyMDA0CisgKiBBdXRob3JzOiBDb2xpbiBEZVZpbGJpc3MgKGRldmlsYmlzQHVzLmlibS5jb20pCisgKiAgICAgICAgICBTYW50aWFnbyBMZW9uIChzYW50aWxAdXMuaWJtLmNvbSkKKyAqICAgICAgICAgIERhdmUgQm91dGNoZXIgKHNsZWRkb2dAdXMuaWJtLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogVVNBCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbXVsYXRpb24gb2YgYSBTQ1NJIGhvc3QgYWRhcHRlciBmb3IgVmlydHVhbCBJL08gZGV2aWNlcworICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBTQ1NJIGFkYXB0ZXIgaW1wbGVtZW50ZWQgYnkgdGhlIElCTQorICogUG93ZXI1IGZpcm13YXJlLiAgVGhhdCBTQ1NJIGFkYXB0ZXIgaXMgbm90IGEgcGh5c2ljYWwgYWRhcHRlciwKKyAqIGJ1dCBhbGxvd3MgTGludXggU0NTSSBwZXJpcGhlcmFsIGRyaXZlcnMgdG8gZGlyZWN0bHkKKyAqIGFjY2VzcyBkZXZpY2VzIGluIGFub3RoZXIgbG9naWNhbCBwYXJ0aXRpb24gb24gdGhlIHBoeXNpY2FsIHN5c3RlbS4KKyAqCisgKiBUaGUgdmlydHVhbCBhZGFwdGVyKHMpIGFyZSBwcmVzZW50IGluIHRoZSBvcGVuIGZpcm13YXJlIGRldmljZQorICogdHJlZSBqdXN0IGxpa2UgcmVhbCBhZGFwdGVycy4KKyAqCisgKiBPbmUgb2YgdGhlIGNhcGFiaWxpdGllcyBwcm92aWRlZCBvbiB0aGVzZSBzeXN0ZW1zIGlzIHRoZSBhYmlsaXR5CisgKiB0byBETUEgYmV0d2VlbiBwYXJ0aXRpb25zLiAgVGhlIGFyY2hpdGVjdHVyZSBzdGF0ZXMgdGhhdCBmb3IgVlNDU0ksCisgKiB0aGUgc2VydmVyIHNpZGUgaXMgYWxsb3dlZCB0byBETUEgdG8gYW5kIGZyb20gdGhlIGNsaWVudC4gIFRoZSBjbGllbnQKKyAqIGlzIG5ldmVyIHRydXN0ZWQgdG8gRE1BIHRvIG9yIGZyb20gdGhlIHNlcnZlciBkaXJlY3RseS4KKyAqCisgKiBNZXNzYWdlcyBhcmUgc2VudCBiZXR3ZWVuIHBhcnRpdGlvbnMgb24gYSAiQ29tbWFuZC9SZXNwb25zZSBRdWV1ZSIgCisgKiAoQ1JRKSwgd2hpY2ggaXMganVzdCBhIGJ1ZmZlciBvZiAxNiBieXRlIGVudHJpZXMgaW4gdGhlIHJlY2VpdmVyJ3MgCisgKiBTZW5kZXJzIGNhbm5vdCBhY2Nlc3MgdGhlIGJ1ZmZlciBkaXJlY3RseSwgYnV0IHNlbmQgbWVzc2FnZXMgYnkKKyAqIG1ha2luZyBhIGh5cGVydmlzb3IgY2FsbCBhbmQgcGFzc2luZyBpbiB0aGUgMTYgYnl0ZXMuICBUaGUgaHlwZXJ2aXNvcgorICogcHV0cyB0aGUgbWVzc2FnZSBpbiB0aGUgbmV4dCAxNiBieXRlIHNwYWNlIGluIHJvdW5kLXJvYmJpbiBmYXNoaW9uLAorICogdHVybnMgb24gdGhlIGhpZ2ggb3JkZXIgYml0IG9mIHRoZSBtZXNzYWdlICh0aGUgdmFsaWQgYml0KSwgYW5kIAorICogZ2VuZXJhdGVzIGFuIGludGVycnVwdCB0byB0aGUgcmVjZWl2ZXIgKGlmIGludGVycnVwdHMgYXJlIHR1cm5lZCBvbi4pIAorICogVGhlIHJlY2VpdmVyIGp1c3QgdHVybnMgb2ZmIHRoZSB2YWxpZCBiaXQgd2hlbiB0aGV5IGhhdmUgY29waWVkIG91dAorICogdGhlIG1lc3NhZ2UuCisgKgorICogVGhlIFZTQ1NJIGNsaWVudCBidWlsZHMgYSBTQ1NJIFJlbW90ZSBQcm90b2NvbCAoU1JQKSBJbmZvcm1hdGlvbiBVbml0CisgKiAoSVUpIChhcyBkZWZpbmVkIGluIHRoZSBUMTAgc3RhbmRhcmQgYXZhaWxhYmxlIGF0IHd3dy50MTAub3JnKSwgZ2V0cyAKKyAqIGEgRE1BIGFkZHJlc3MgZm9yIHRoZSBtZXNzYWdlLCBhbmQgc2VuZHMgaXQgdG8gdGhlIHNlcnZlciBhcyB0aGUKKyAqIHBheWxvYWQgb2YgYSBDUlEgbWVzc2FnZS4gIFRoZSBzZXJ2ZXIgRE1BcyB0aGUgU1JQIElVIGFuZCBwcm9jZXNzZXMgaXQsCisgKiBpbmNsdWRpbmcgZG9pbmcgYW55IGFkZGl0aW9uYWwgZGF0YSB0cmFuc2ZlcnMuICBXaGVuIGl0IGlzIGRvbmUsIGl0CisgKiBETUFzIHRoZSBTUlAgcmVzcG9uc2UgYmFjayB0byB0aGUgc2FtZSBhZGRyZXNzIGFzIHRoZSByZXF1ZXN0IGNhbWUgZnJvbSwKKyAqIGFuZCBzZW5kcyBhIENSUSBtZXNzYWdlIGJhY2sgdG8gaW5mb3JtIHRoZSBjbGllbnQgdGhhdCB0aGUgcmVxdWVzdCBoYXMKKyAqIGNvbXBsZXRlZC4KKyAqCisgKiBOb3RlIHRoYXQgc29tZSBvZiB0aGUgdW5kZXJseWluZyBpbmZyYXN0cnVjdHVyZSBpcyBkaWZmZXJlbnQgYmV0d2VlbgorICogbWFjaGluZXMgY29uZm9ybWluZyB0byB0aGUgIlJTLzYwMDAgUGxhdGZvcm0gQXJjaGl0ZWN0dXJlIiAoUlBBKSBhbmQKKyAqIHRoZSBvbGRlciBpU2VyaWVzIGh5cGVydmlzb3IgbW9kZWxzLiAgVG8gc3VwcG9ydCBib3RoLCBzb21lIGxvdyBsZXZlbAorICogcm91dGluZXMgaGF2ZSBiZWVuIGJyb2tlbiBvdXQgaW50byBycGFfdnNjc2kuYyBhbmQgaXNlcmllc192c2NzaS5jLgorICogVGhlIE1ha2VmaWxlIHNob3VsZCBwaWNrIG9uZSwgbm90IHR3bywgbm90IHplcm8sIG9mIHRoZXNlLgorICoKKyAqIFRPRE86IFRoaXMgaXMgY3VycmVudGx5IHByZXR0eSB0aWVkIHRvIHRoZSBJQk0gaS9wU2VyaWVzIGh5cGVydmlzb3IKKyAqIGludGVyZmFjZXMuICBJdCB3b3VsZCBiZSByZWFsbHkgbmljZSB0byBhYnN0cmFjdCB0aGlzIGFib3ZlIGFuIFJETUEKKyAqIGxheWVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlICJpYm12c2NzaS5oIgorCisvKiBUaGUgdmFsdWVzIGJlbG93IGFyZSBzb21ld2hhdCBhcmJpdHJhcnkgZGVmYXVsdCB2YWx1ZXMsIGJ1dCAKKyAqIE9TLzQwMCB3aWxsIHVzZSAzIGJ1c3NlcyAoZGlza3MsIENEcywgdGFwZXMsIEkgdGhpbmsuKQorICogTm90ZSB0aGF0IHRoZXJlIGFyZSAzIGJpdHMgb2YgY2hhbm5lbCB2YWx1ZSwgNiBiaXRzIG9mIGlkLCBhbmQKKyAqIDUgYml0cyBvZiBMVU4uCisgKi8KK3N0YXRpYyBpbnQgbWF4X2lkID0gNjQ7CitzdGF0aWMgaW50IG1heF9jaGFubmVsID0gMzsKK3N0YXRpYyBpbnQgaW5pdF90aW1lb3V0ID0gNTsKK3N0YXRpYyBpbnQgbWF4X3JlcXVlc3RzID0gNTA7CisKKyNkZWZpbmUgSUJNVlNDU0lfVkVSU0lPTiAiMS41LjUiCisKK01PRFVMRV9ERVNDUklQVElPTigiSUJNIFZpcnR1YWwgU0NTSSIpOworTU9EVUxFX0FVVEhPUigiRGF2ZSBCb3V0Y2hlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oSUJNVlNDU0lfVkVSU0lPTik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfaWQsIG1heF9pZCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pZCwgIkxhcmdlc3QgSUQgdmFsdWUgZm9yIGVhY2ggY2hhbm5lbCIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1heF9jaGFubmVsLCBtYXhfY2hhbm5lbCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9jaGFubmVsLCAiTGFyZ2VzdCBjaGFubmVsIHZhbHVlIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaW5pdF90aW1lb3V0LCBpbml0X3RpbWVvdXQsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhpbml0X3RpbWVvdXQsICJJbml0aWFsaXphdGlvbiB0aW1lb3V0IGluIHNlY29uZHMiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfcmVxdWVzdHMsIG1heF9yZXF1ZXN0cywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9yZXF1ZXN0cywgIk1heGltdW0gcmVxdWVzdHMgZm9yIHRoaXMgYWRhcHRlciIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJvdXRpbmVzIGZvciB0aGUgZXZlbnQgcG9vbCBhbmQgZXZlbnQgc3RydWN0cworICovCisvKioKKyAqIGluaXRpYWxpemVfZXZlbnRfcG9vbDogLSBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBldmVudCBwb29sIGZvciBhIGhvc3QKKyAqIEBwb29sOglldmVudF9wb29sIHRvIGJlIGluaXRpYWxpemVkCisgKiBAc2l6ZToJTnVtYmVyIG9mIGV2ZW50cyBpbiBwb29sCisgKiBAaG9zdGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSB3aG8gb3ducyB0aGUgZXZlbnQgcG9vbAorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLgorKi8KK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9ldmVudF9wb29sKHN0cnVjdCBldmVudF9wb29sICpwb29sLAorCQkJCSBpbnQgc2l6ZSwgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7CisJaW50IGk7CisKKwlwb29sLT5zaXplID0gc2l6ZTsKKwlwb29sLT5uZXh0ID0gMDsKKwlwb29sLT5ldmVudHMgPSBrbWFsbG9jKHBvb2wtPnNpemUgKiBzaXplb2YoKnBvb2wtPmV2ZW50cyksIEdGUF9LRVJORUwpOworCWlmICghcG9vbC0+ZXZlbnRzKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocG9vbC0+ZXZlbnRzLCAweDAwLCBwb29sLT5zaXplICogc2l6ZW9mKCpwb29sLT5ldmVudHMpKTsKKworCXBvb2wtPml1X3N0b3JhZ2UgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoaG9zdGRhdGEtPmRldiwKKwkJCSAgICAgICBwb29sLT5zaXplICogc2l6ZW9mKCpwb29sLT5pdV9zdG9yYWdlKSwKKwkJCSAgICAgICAmcG9vbC0+aXVfdG9rZW4sIDApOworCWlmICghcG9vbC0+aXVfc3RvcmFnZSkgeworCQlrZnJlZShwb29sLT5ldmVudHMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+c2l6ZTsgKytpKSB7CisJCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnQgPSAmcG9vbC0+ZXZlbnRzW2ldOworCQltZW1zZXQoJmV2dC0+Y3JxLCAweDAwLCBzaXplb2YoZXZ0LT5jcnEpKTsKKwkJYXRvbWljX3NldCgmZXZ0LT5mcmVlLCAxKTsKKwkJZXZ0LT5jcnEudmFsaWQgPSAweDgwOworCQlldnQtPmNycS5JVV9sZW5ndGggPSBzaXplb2YoKmV2dC0+eGZlcl9pdSk7CisJCWV2dC0+Y3JxLklVX2RhdGFfcHRyID0gcG9vbC0+aXVfdG9rZW4gKyAKKwkJCXNpemVvZigqZXZ0LT54ZmVyX2l1KSAqIGk7CisJCWV2dC0+eGZlcl9pdSA9IHBvb2wtPml1X3N0b3JhZ2UgKyBpOworCQlldnQtPmhvc3RkYXRhID0gaG9zdGRhdGE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVsZWFzZV9ldmVudF9wb29sOiAtIEZyZWVzIG1lbW9yeSBvZiBhbiBldmVudCBwb29sIG9mIGEgaG9zdAorICogQHBvb2w6CWV2ZW50X3Bvb2wgdG8gYmUgcmVsZWFzZWQKKyAqIEBob3N0ZGF0YToJaWJtdnNjc2lfaG9zdF9kYXRhIHdobyBvd25zIHRoZSBldmVuIHBvb2wKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KKyovCitzdGF0aWMgdm9pZCByZWxlYXNlX2V2ZW50X3Bvb2woc3RydWN0IGV2ZW50X3Bvb2wgKnBvb2wsCisJCQkgICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7CisJaW50IGksIGluX3VzZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkKKwkJaWYgKGF0b21pY19yZWFkKCZwb29sLT5ldmVudHNbaV0uZnJlZSkgIT0gMSkKKwkJCSsraW5fdXNlOworCWlmIChpbl91c2UpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJpYm12c2NzaTogcmVsZWFzaW5nIGV2ZW50IHBvb2wgd2l0aCAlZCAiCisJCSAgICAgICAiZXZlbnRzIHN0aWxsIGluIHVzZT9cbiIsIGluX3VzZSk7CisJa2ZyZWUocG9vbC0+ZXZlbnRzKTsKKwlkbWFfZnJlZV9jb2hlcmVudChob3N0ZGF0YS0+ZGV2LAorCQkJICBwb29sLT5zaXplICogc2l6ZW9mKCpwb29sLT5pdV9zdG9yYWdlKSwKKwkJCSAgcG9vbC0+aXVfc3RvcmFnZSwgcG9vbC0+aXVfdG9rZW4pOworfQorCisvKioKKyAqIHZhbGlkX2V2ZW50X3N0cnVjdDogLSBEZXRlcm1pbmVzIGlmIGV2ZW50IGlzIHZhbGlkLgorICogQHBvb2w6CWV2ZW50X3Bvb2wgdGhhdCBjb250YWlucyB0aGUgZXZlbnQKKyAqIEBldnQ6CXNycF9ldmVudF9zdHJ1Y3QgdG8gYmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkKKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgZXZlbnQgaXMgaW52YWxpZCwgb25lIG90aGVyd2lzZS4KKyovCitzdGF0aWMgaW50IHZhbGlkX2V2ZW50X3N0cnVjdChzdHJ1Y3QgZXZlbnRfcG9vbCAqcG9vbCwKKwkJCQlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0KQoreworCWludCBpbmRleCA9IGV2dCAtIHBvb2wtPmV2ZW50czsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBvb2wtPnNpemUpCS8qIG91dHNpZGUgb2YgYm91bmRzICovCisJCXJldHVybiAwOworCWlmIChldnQgIT0gcG9vbC0+ZXZlbnRzICsgaW5kZXgpCS8qIHVuYWxpZ25lZCAqLworCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBpYm12c2NzaV9mcmVlLWV2ZW50X3N0cnVjdDogLSBDaGFuZ2VzIHN0YXR1cyBvZiBldmVudCB0byAiZnJlZSIKKyAqIEBwb29sOglldmVudF9wb29sIHRoYXQgY29udGFpbnMgdGhlIGV2ZW50CisgKiBAZXZ0OglzcnBfZXZlbnRfc3RydWN0IHRvIGJlIG1vZGlmaWVkCisgKgorKi8KK3N0YXRpYyB2b2lkIGZyZWVfZXZlbnRfc3RydWN0KHN0cnVjdCBldmVudF9wb29sICpwb29sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0KQoreworCWlmICghdmFsaWRfZXZlbnRfc3RydWN0KHBvb2wsIGV2dCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IEZyZWVpbmcgaW52YWxpZCBldmVudF9zdHJ1Y3QgJXAgIgorCQkgICAgICAgIihub3QgaW4gcG9vbCAlcClcbiIsIGV2dCwgcG9vbC0+ZXZlbnRzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJmV2dC0+ZnJlZSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogRnJlZWluZyBldmVudF9zdHJ1Y3QgJXAgIgorCQkgICAgICAgIndoaWNoIGlzIG5vdCBpbiB1c2UhXG4iLCBldnQpOworCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIGdldF9ldnRfc3RydWN0OiAtIEdldHMgdGhlIG5leHQgZnJlZSBldmVudCBpbiBwb29sCisgKiBAcG9vbDoJZXZlbnRfcG9vbCB0aGF0IGNvbnRhaW5zIHRoZSBldmVudHMgdG8gYmUgc2VhcmNoZWQKKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IGV2ZW50IGluICJmcmVlIiBzdGF0ZSwgYW5kIE5VTEwgaWYgbm9uZSBhcmUgZnJlZS4KKyAqIE5vdGUgdGhhdCBubyBzeW5jaHJvbml6YXRpb24gaXMgZG9uZSBoZXJlLCB3ZSBhc3N1bWUgdGhlIGhvc3RfbG9jaworICogd2lsbCBzeW5jcmhvbnplIHRoaW5ncy4KKyovCitzdGF0aWMgc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmdldF9ldmVudF9zdHJ1Y3Qoc3RydWN0IGV2ZW50X3Bvb2wgKnBvb2wpCit7CisJaW50IGk7CisJaW50IHBvb2xzaXplID0gcG9vbC0+c2l6ZTsKKwlpbnQgb2Zmc2V0ID0gcG9vbC0+bmV4dDsKKworCWZvciAoaSA9IDA7IGkgPCBwb29sc2l6ZTsgaSsrKSB7CisJCW9mZnNldCA9IChvZmZzZXQgKyAxKSAlIHBvb2xzaXplOworCQlpZiAoIWF0b21pY19kZWNfaWZfcG9zaXRpdmUoJnBvb2wtPmV2ZW50c1tvZmZzZXRdLmZyZWUpKSB7CisJCQlwb29sLT5uZXh0ID0gb2Zmc2V0OworCQkJcmV0dXJuICZwb29sLT5ldmVudHNbb2Zmc2V0XTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZvdW5kIG5vIGV2ZW50IHN0cnVjdCBpbiBwb29sIVxuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaW5pdF9ldmVudF9zdHJ1Y3Q6IEluaXRpYWxpemUgZmllbGRzIGluIGFuIGV2ZW50IHN0cnVjdCB0aGF0IGFyZSBhbHdheXMgCisgKiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQuCisgKiBAZXZ0OiAgICAgICAgVGhlIGV2ZW50CisgKiBAZG9uZTogICAgICAgUm91dGluZSB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHJlc3BvbmRlZCB0bworICogQGZvcm1hdDogICAgIFNSUCBvciBNQUQgZm9ybWF0CisgKiBAdGltZW91dDogICAgdGltZW91dCB2YWx1ZSBzZXQgaW4gdGhlIENSUQorICovCitzdGF0aWMgdm9pZCBpbml0X2V2ZW50X3N0cnVjdChzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCwKKwkJCSAgICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKiksCisJCQkgICAgICB1OCBmb3JtYXQsCisJCQkgICAgICBpbnQgdGltZW91dCkKK3sKKwlldnRfc3RydWN0LT5jbW5kID0gTlVMTDsKKwlldnRfc3RydWN0LT5jbW5kX2RvbmUgPSBOVUxMOworCWV2dF9zdHJ1Y3QtPnN5bmNfc3JwID0gTlVMTDsKKwlldnRfc3RydWN0LT5jcnEuZm9ybWF0ID0gZm9ybWF0OworCWV2dF9zdHJ1Y3QtPmNycS50aW1lb3V0ID0gdGltZW91dDsKKwlldnRfc3RydWN0LT5kb25lID0gZG9uZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3IgcmVjZWl2aW5nIFNDU0kgcmVzcG9uc2VzIGZyb20gdGhlIGhvc3RpbmcgcGFydGl0aW9uCisgKi8KKworLyoqCisgKiBzZXRfc3JwX2RpcmVjdGlvbjogU2V0IHRoZSBmaWVsZHMgaW4gdGhlIHNycCByZWxhdGVkIHRvIGRhdGEKKyAqICAgICBkaXJlY3Rpb24gYW5kIG51bWJlciBvZiBidWZmZXJzIGJhc2VkIG9uIHRoZSBkaXJlY3Rpb24gaW4KKyAqICAgICB0aGUgc2NzaV9jbW5kIGFuZCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMKKyAqLworc3RhdGljIHZvaWQgc2V0X3NycF9kaXJlY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgICAgc3RydWN0IHNycF9jbWQgKnNycF9jbWQsIAorCQkJICAgICAgaW50IG51bWJ1ZikKK3sKKwlpZiAobnVtYnVmID09IDApCisJCXJldHVybjsKKwkKKwlpZiAobnVtYnVmID09IDEpIHsKKwkJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJCXNycF9jbWQtPmRhdGFfb3V0X2Zvcm1hdCA9IFNSUF9ESVJFQ1RfQlVGRkVSOworCQllbHNlIAorCQkJc3JwX2NtZC0+ZGF0YV9pbl9mb3JtYXQgPSBTUlBfRElSRUNUX0JVRkZFUjsKKwl9IGVsc2UgeworCQlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQlzcnBfY21kLT5kYXRhX291dF9mb3JtYXQgPSBTUlBfSU5ESVJFQ1RfQlVGRkVSOworCQkJc3JwX2NtZC0+ZGF0YV9vdXRfY291bnQgPSBudW1idWY7CisJCX0gZWxzZSB7CisJCQlzcnBfY21kLT5kYXRhX2luX2Zvcm1hdCA9IFNSUF9JTkRJUkVDVF9CVUZGRVI7CisJCQlzcnBfY21kLT5kYXRhX2luX2NvdW50ID0gbnVtYnVmOworCQl9CisJfQorfQorCisvKioKKyAqIHVubWFwX2NtZF9kYXRhOiAtIFVubWFwIGRhdGEgcG9pbnRlZCBpbiBzcnBfY21kIGJhc2VkIG9uIHRoZSBmb3JtYXQKKyAqIEBjbWQ6CXNycF9jbWQgd2hvc2UgYWRkaXRpb25hbF9kYXRhIG1lbWJlciB3aWxsIGJlIHVubWFwcGVkCisgKiBAZGV2OglkZXZpY2UgZm9yIHdoaWNoIHRoZSBtZW1vcnkgaXMgbWFwcGVkCisgKgorKi8KK3N0YXRpYyB2b2lkIHVubWFwX2NtZF9kYXRhKHN0cnVjdCBzcnBfY21kICpjbWQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWlmICgoY21kLT5kYXRhX291dF9mb3JtYXQgPT0gU1JQX05PX0JVRkZFUikgJiYKKwkgICAgKGNtZC0+ZGF0YV9pbl9mb3JtYXQgPT0gU1JQX05PX0JVRkZFUikpCisJCXJldHVybjsKKwllbHNlIGlmICgoY21kLT5kYXRhX291dF9mb3JtYXQgPT0gU1JQX0RJUkVDVF9CVUZGRVIpIHx8CisJCSAoY21kLT5kYXRhX2luX2Zvcm1hdCA9PSBTUlBfRElSRUNUX0JVRkZFUikpIHsKKwkJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkYXRhID0KKwkJCShzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKiljbWQtPmFkZGl0aW9uYWxfZGF0YTsKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGRhdGEtPnZpcnR1YWxfYWRkcmVzcywgZGF0YS0+bGVuZ3RoLAorCQkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKmluZGlyZWN0ID0KKwkJCShzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqKWNtZC0+YWRkaXRpb25hbF9kYXRhOworCQlpbnQgbnVtX21hcHBlZCA9IGluZGlyZWN0LT5oZWFkLmxlbmd0aCAvIAorCQkJc2l6ZW9mKGluZGlyZWN0LT5saXN0WzBdKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9tYXBwZWQ7ICsraSkgeworCQkJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICpkYXRhID0gJmluZGlyZWN0LT5saXN0W2ldOworCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsCisJCQkJCSBkYXRhLT52aXJ0dWFsX2FkZHJlc3MsCisJCQkJCSBkYXRhLT5sZW5ndGgsIERNQV9CSURJUkVDVElPTkFMKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBtYXBfc2dfZGF0YTogLSBNYXBzIGRtYSBmb3IgYSBzY2F0dGVybGlzdCBhbmQgaW5pdGlhbGl6ZXMgZGVjcmlwdG9yIGZpZWxkcworICogQGNtZDoJU2NzaV9DbW5kIHdpdGggdGhlIHNjYXR0ZXJsaXN0CisgKiBAc3JwX2NtZDoJc3JwX2NtZCB0aGF0IGNvbnRhaW5zIHRoZSBtZW1vcnkgZGVzY3JpcHRvcgorICogQGRldjoJZGV2aWNlIGZvciB3aGljaCB0byBtYXAgZG1hIG1lbW9yeQorICoKKyAqIENhbGxlZCBieSBtYXBfZGF0YV9mb3Jfc3JwX2NtZCgpIHdoZW4gYnVpbGRpbmcgc3JwIGNtZCBmcm9tIHNjc2kgY21kLgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCisqLworc3RhdGljIGludCBtYXBfc2dfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCSAgICAgICBzdHJ1Y3Qgc3JwX2NtZCAqc3JwX2NtZCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCisJaW50IGksIHNnX21hcHBlZDsKKwl1NjQgdG90YWxfbGVuZ3RoID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRhdGEgPQorCSAgICAoc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICopc3JwX2NtZC0+YWRkaXRpb25hbF9kYXRhOworCXN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yICppbmRpcmVjdCA9CisJICAgIChzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqKWRhdGE7CisKKwlzZ19tYXBwZWQgPSBkbWFfbWFwX3NnKGRldiwgc2csIGNtZC0+dXNlX3NnLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAoc2dfbWFwcGVkID09IDApCisJCXJldHVybiAwOworCisJc2V0X3NycF9kaXJlY3Rpb24oY21kLCBzcnBfY21kLCBzZ19tYXBwZWQpOworCisJLyogc3BlY2lhbCBjYXNlOyB3ZSBjYW4gdXNlIGEgc2luZ2xlIGRpcmVjdCBkZXNjcmlwdG9yICovCisJaWYgKHNnX21hcHBlZCA9PSAxKSB7CisJCWRhdGEtPnZpcnR1YWxfYWRkcmVzcyA9IHNnX2RtYV9hZGRyZXNzKCZzZ1swXSk7CisJCWRhdGEtPmxlbmd0aCA9IHNnX2RtYV9sZW4oJnNnWzBdKTsKKwkJZGF0YS0+bWVtb3J5X2hhbmRsZSA9IDA7CisJCXJldHVybiAxOworCX0KKworCWlmIChzZ19tYXBwZWQgPiBNQVhfSU5ESVJFQ1RfQlVGUykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogTW9yZSB0aGFuICVkIG1hcHBlZCBzZyBlbnRyaWVzLCBnb3QgJWRcbiIsCisJCSAgICAgICBNQVhfSU5ESVJFQ1RfQlVGUywgc2dfbWFwcGVkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5kaXJlY3QtPmhlYWQudmlydHVhbF9hZGRyZXNzID0gMDsKKwlpbmRpcmVjdC0+aGVhZC5sZW5ndGggPSBzZ19tYXBwZWQgKiBzaXplb2YoaW5kaXJlY3QtPmxpc3RbMF0pOworCWluZGlyZWN0LT5oZWFkLm1lbW9yeV9oYW5kbGUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzZ19tYXBwZWQ7ICsraSkgeworCQlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRlc2NyID0gJmluZGlyZWN0LT5saXN0W2ldOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2VudHJ5ID0gJnNnW2ldOworCQlkZXNjci0+dmlydHVhbF9hZGRyZXNzID0gc2dfZG1hX2FkZHJlc3Moc2dfZW50cnkpOworCQlkZXNjci0+bGVuZ3RoID0gc2dfZG1hX2xlbihzZ19lbnRyeSk7CisJCWRlc2NyLT5tZW1vcnlfaGFuZGxlID0gMDsKKwkJdG90YWxfbGVuZ3RoICs9IHNnX2RtYV9sZW4oc2dfZW50cnkpOworCX0KKwlpbmRpcmVjdC0+dG90YWxfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogbWFwX3NpbmdsZV9kYXRhOiAtIE1hcHMgbWVtb3J5IGFuZCBpbml0aWFsaXplcyBtZW1vcnkgZGVjcmlwdG9yIGZpZWxkcworICogQGNtZDoJc3RydWN0IHNjc2lfY21uZCB3aXRoIHRoZSBtZW1vcnkgdG8gYmUgbWFwcGVkCisgKiBAc3JwX2NtZDoJc3JwX2NtZCB0aGF0IGNvbnRhaW5zIHRoZSBtZW1vcnkgZGVzY3JpcHRvcgorICogQGRldjoJZGV2aWNlIGZvciB3aGljaCB0byBtYXAgZG1hIG1lbW9yeQorICoKKyAqIENhbGxlZCBieSBtYXBfZGF0YV9mb3Jfc3JwX2NtZCgpIHdoZW4gYnVpbGRpbmcgc3JwIGNtZCBmcm9tIHNjc2kgY21kLgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCisqLworc3RhdGljIGludCBtYXBfc2luZ2xlX2RhdGEoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgc3RydWN0IHNycF9jbWQgKnNycF9jbWQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWVtb3J5X2Rlc2NyaXB0b3IgKmRhdGEgPQorCSAgICAoc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yICopc3JwX2NtZC0+YWRkaXRpb25hbF9kYXRhOworCisJZGF0YS0+dmlydHVhbF9hZGRyZXNzID0KKwkJZG1hX21hcF9zaW5nbGUoZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJICAgICAgIGNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGF0YS0+dmlydHVhbF9hZGRyZXNzKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogVW5hYmxlIHRvIG1hcCByZXF1ZXN0X2J1ZmZlciBmb3IgY29tbWFuZCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZGF0YS0+bGVuZ3RoID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJZGF0YS0+bWVtb3J5X2hhbmRsZSA9IDA7CisKKwlzZXRfc3JwX2RpcmVjdGlvbihjbWQsIHNycF9jbWQsIDEpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogbWFwX2RhdGFfZm9yX3NycF9jbWQ6IC0gQ2FsbHMgZnVuY3Rpb25zIHRvIG1hcCBkYXRhIGZvciBzcnAgY21kcworICogQGNtZDoJc3RydWN0IHNjc2lfY21uZCB3aXRoIHRoZSBtZW1vcnkgdG8gYmUgbWFwcGVkCisgKiBAc3JwX2NtZDoJc3JwX2NtZCB0aGF0IGNvbnRhaW5zIHRoZSBtZW1vcnkgZGVzY3JpcHRvcgorICogQGRldjoJZG1hIGRldmljZSBmb3Igd2hpY2ggdG8gbWFwIGRtYSBtZW1vcnkKKyAqCisgKiBDYWxsZWQgYnkgc2NzaV9jbWRfdG9fc3JwX2NtZCgpIHdoZW4gY29udmVydGluZyBzY3NpIGNtZHMgdG8gc3JwIGNtZHMgCisgKiBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KKyovCitzdGF0aWMgaW50IG1hcF9kYXRhX2Zvcl9zcnBfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQlzdHJ1Y3Qgc3JwX2NtZCAqc3JwX2NtZCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN3aXRjaCAoY21kLT5zY19kYXRhX2RpcmVjdGlvbikgeworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJYnJlYWs7CisJY2FzZSBETUFfTk9ORToKKwkJcmV0dXJuIDE7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IENhbid0IG1hcCBETUFfQklESVJFQ1RJT05BTCB0byByZWFkL3dyaXRlXG4iKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IFVua25vd24gZGF0YSBkaXJlY3Rpb24gMHglMDJ4OyBjYW4ndCBtYXAhXG4iLAorCQkgICAgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXJldHVybiAwOworCX0KKworCWlmICghY21kLT5yZXF1ZXN0X2J1ZmZlcikKKwkJcmV0dXJuIDE7CisJaWYgKGNtZC0+dXNlX3NnKQorCQlyZXR1cm4gbWFwX3NnX2RhdGEoY21kLCBzcnBfY21kLCBkZXYpOworCXJldHVybiBtYXBfc2luZ2xlX2RhdGEoY21kLCBzcnBfY21kLCBkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJvdXRpbmVzIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgU1JQcworICovCisvKioKKyAqIGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50OiAtIFRyYW5zZm9ybXMgZXZlbnQgdG8gdTY0IGFycmF5IGFuZCBjYWxscyBzZW5kX2NycSgpCisgKiBAZXZ0X3N0cnVjdDoJZXZ0X3N0cnVjdCB0byBiZSBzZW50CisgKiBAaG9zdGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0CisgKgorICogUmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBpYm12c2NzaV9zZW5kX2NycSgpLiAoWmVybyBmb3Igc3VjY2VzcykKKyAqIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGhvc3RfbG9jayBpcyBoZWxkIGZvciBzeW5jaHJvbml6YXRpb24KKyovCitzdGF0aWMgaW50IGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0LAorCQkJCSAgIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQ7CisJdTY0ICpjcnFfYXNfdTY0ID0gKHU2NCAqKSAmZXZ0X3N0cnVjdC0+Y3JxOworCWludCByYzsKKworCS8qIElmIHdlIGhhdmUgZXhoYXVzdGVkIG91ciByZXF1ZXN0IGxpbWl0LCBqdXN0IGZhaWwgdGhpcyByZXF1ZXN0LgorCSAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgcmFyZSBjYXNlcyBpbnZvbHZpbmcgZHJpdmVyIGdlbmVyYXRlZCByZXF1ZXN0cyAKKwkgKiAoc3VjaCBhcyB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMpIHRoYXQgdGhlIG1pZCBsYXllciBtYXkgdGhpbmsgd2UKKwkgKiBjYW4gaGFuZGxlIG1vcmUgcmVxdWVzdHMgKGNhbl9xdWV1ZSkgd2hlbiB3ZSBhY3R1YWxseSBjYW4ndAorCSAqLworCWlmICgoZXZ0X3N0cnVjdC0+Y3JxLmZvcm1hdCA9PSBWSU9TUlBfU1JQX0ZPUk1BVCkgJiYKKwkgICAgKGF0b21pY19kZWNfaWZfcG9zaXRpdmUoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KSA8IDApKSB7CisJCS8qIFNlZSBpZiB0aGUgYWRhcHRlciBpcyBkaXNhYmxlZCAqLworCQlpZiAoYXRvbWljX3JlYWQoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0KSA8IDApCisJCQlnb3RvIHNlbmRfZXJyb3I7CisJCisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSAgICAgICAiaWJtdnNjc2k6IFdhcm5pbmcsIHJlcXVlc3RfbGltaXQgZXhjZWVkZWRcbiIpOworCQl1bm1hcF9jbWRfZGF0YSgmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZCwKKwkJCSAgICAgICBob3N0ZGF0YS0+ZGV2KTsKKwkJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorCisJLyogQ29weSB0aGUgSVUgaW50byB0aGUgdHJhbnNmZXIgYXJlYSAqLworCSpldnRfc3RydWN0LT54ZmVyX2l1ID0gZXZ0X3N0cnVjdC0+aXU7CisJZXZ0X3N0cnVjdC0+eGZlcl9pdS0+c3JwLmdlbmVyaWMudGFnID0gKHU2NClldnRfc3RydWN0OworCisJLyogQWRkIHRoaXMgdG8gdGhlIHNlbnQgbGlzdC4gIFdlIG5lZWQgdG8gZG8gdGhpcyAKKwkgKiBiZWZvcmUgd2UgYWN0dWFsbHkgc2VuZCAKKwkgKiBpbiBjYXNlIGl0IGNvbWVzIGJhY2sgUkVBTExZIGZhc3QKKwkgKi8KKwlsaXN0X2FkZF90YWlsKCZldnRfc3RydWN0LT5saXN0LCAmaG9zdGRhdGEtPnNlbnQpOworCisJaWYgKChyYyA9CisJICAgICBpYm12c2NzaV9zZW5kX2NycShob3N0ZGF0YSwgY3JxX2FzX3U2NFswXSwgY3JxX2FzX3U2NFsxXSkpICE9IDApIHsKKwkJbGlzdF9kZWwoJmV2dF9zdHJ1Y3QtPmxpc3QpOworCisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZhaWxlZCB0byBzZW5kIGV2ZW50IHN0cnVjdCByYyAlZFxuIiwKKwkJICAgICAgIHJjKTsKKwkJZ290byBzZW5kX2Vycm9yOworCX0KKworCXJldHVybiAwOworCisgc2VuZF9lcnJvcjoKKwl1bm1hcF9jbWRfZGF0YSgmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZCwgaG9zdGRhdGEtPmRldik7CisKKwlpZiAoKGNtbmQgPSBldnRfc3RydWN0LT5jbW5kKSAhPSBOVUxMKSB7CisJCWNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJZXZ0X3N0cnVjdC0+Y21uZF9kb25lKGNtbmQpOworCX0gZWxzZSBpZiAoZXZ0X3N0cnVjdC0+ZG9uZSkKKwkJZXZ0X3N0cnVjdC0+ZG9uZShldnRfc3RydWN0KTsKKwkKKwlmcmVlX2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wsIGV2dF9zdHJ1Y3QpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGhhbmRsZV9jbWRfcnNwOiAtICBIYW5kbGUgcmVzcG9uc2VzIGZyb20gY29tbWFuZHMKKyAqIEBldnRfc3RydWN0OglzcnBfZXZlbnRfc3RydWN0IHRvIGJlIGhhbmRsZWQKKyAqCisgKiBVc2VkIGFzIGEgY2FsbGJhY2sgYnkgd2hlbiBzZW5kaW5nIHNjc2kgY21kcy4KKyAqIEdldHMgY2FsbGVkIGJ5IGlibXZzY3NpX2hhbmRsZV9jcnEoKQorKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9jbWRfcnNwKHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0KQoreworCXN0cnVjdCBzcnBfcnNwICpyc3AgPSAmZXZ0X3N0cnVjdC0+eGZlcl9pdS0+c3JwLnJzcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gZXZ0X3N0cnVjdC0+Y21uZDsKKworCWlmICh1bmxpa2VseShyc3AtPnR5cGUgIT0gU1JQX1JTUF9UWVBFKSkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSAgICAgICAiaWJtdnNjc2k6IGJhZCBTUlAgUlNQIHR5cGUgJWRcbiIsCisJCQkgICAgICAgcnNwLT50eXBlKTsKKwl9CisJCisJaWYgKGNtbmQpIHsKKwkJY21uZC0+cmVzdWx0ID0gcnNwLT5zdGF0dXM7CisJCWlmICgoKGNtbmQtPnJlc3VsdCA+PiAxKSAmIDB4MWYpID09IENIRUNLX0NPTkRJVElPTikKKwkJCW1lbWNweShjbW5kLT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgcnNwLT5zZW5zZV9hbmRfcmVzcG9uc2VfZGF0YSwKKwkJCSAgICAgICByc3AtPnNlbnNlX2RhdGFfbGlzdF9sZW5ndGgpOworCQl1bm1hcF9jbWRfZGF0YSgmZXZ0X3N0cnVjdC0+aXUuc3JwLmNtZCwgCisJCQkgICAgICAgZXZ0X3N0cnVjdC0+aG9zdGRhdGEtPmRldik7CisKKwkJaWYgKHJzcC0+ZG9vdmVyKQorCQkJY21uZC0+cmVzaWQgPSByc3AtPmRhdGFfb3V0X3Jlc2lkdWFsX2NvdW50OworCQllbHNlIGlmIChyc3AtPmRpb3ZlcikKKwkJCWNtbmQtPnJlc2lkID0gcnNwLT5kYXRhX2luX3Jlc2lkdWFsX2NvdW50OworCX0KKworCWlmIChldnRfc3RydWN0LT5jbW5kX2RvbmUpCisJCWV2dF9zdHJ1Y3QtPmNtbmRfZG9uZShjbW5kKTsKK30KKworLyoqCisgKiBsdW5fZnJvbV9kZXY6IC0gUmV0dXJucyB0aGUgbHVuIG9mIHRoZSBzY3NpIGRldmljZQorICogQGRldjoJc3RydWN0IHNjc2lfZGV2aWNlCisgKgorKi8KK3N0YXRpYyBpbmxpbmUgdTE2IGx1bl9mcm9tX2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKDB4MiA8PCAxNCkgfCAoZGV2LT5pZCA8PCA4KSB8IChkZXYtPmNoYW5uZWwgPDwgNSkgfCBkZXYtPmx1bjsKK30KKworLyoqCisgKiBpYm12c2NzaV9xdWV1ZTogLSBUaGUgcXVldWVjb21tYW5kIGZ1bmN0aW9uIG9mIHRoZSBzY3NpIHRlbXBsYXRlIAorICogQGNtZDoJc3RydWN0IHNjc2lfY21uZCB0byBiZSBleGVjdXRlZAorICogQGRvbmU6CUNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGNtZCBpcyBjb21wbGV0ZWQKKyovCitzdGF0aWMgaW50IGlibXZzY3NpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kLAorCQkJCSB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IHNycF9jbWQgKnNycF9jbWQ7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3Q7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPQorCQkoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKSZjbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXUxNiBsdW4gPSBsdW5fZnJvbV9kZXYoY21uZC0+ZGV2aWNlKTsKKworCWV2dF9zdHJ1Y3QgPSBnZXRfZXZlbnRfc3RydWN0KCZob3N0ZGF0YS0+cG9vbCk7CisJaWYgKCFldnRfc3RydWN0KQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCWluaXRfZXZlbnRfc3RydWN0KGV2dF9zdHJ1Y3QsCisJCQkgIGhhbmRsZV9jbWRfcnNwLAorCQkJICBWSU9TUlBfU1JQX0ZPUk1BVCwKKwkJCSAgY21uZC0+dGltZW91dCk7CisKKwlldnRfc3RydWN0LT5jbW5kID0gY21uZDsKKwlldnRfc3RydWN0LT5jbW5kX2RvbmUgPSBkb25lOworCisJLyogU2V0IHVwIHRoZSBhY3R1YWwgU1JQIElVICovCisJc3JwX2NtZCA9ICZldnRfc3RydWN0LT5pdS5zcnAuY21kOworCW1lbXNldChzcnBfY21kLCAweDAwLCBzaXplb2YoKnNycF9jbWQpKTsKKwlzcnBfY21kLT50eXBlID0gU1JQX0NNRF9UWVBFOworCW1lbWNweShzcnBfY21kLT5jZGIsIGNtbmQtPmNtbmQsIHNpemVvZihjbW5kLT5jbW5kKSk7CisJc3JwX2NtZC0+bHVuID0gKCh1NjQpIGx1bikgPDwgNDg7CisKKwlpZiAoIW1hcF9kYXRhX2Zvcl9zcnBfY21kKGNtbmQsIHNycF9jbWQsIGhvc3RkYXRhLT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGNvdWxkbid0IGNvbnZlcnQgY21kIHRvIHNycF9jbWRcbiIpOworCQlmcmVlX2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wsIGV2dF9zdHJ1Y3QpOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwl9CisKKwkvKiBGaXggdXAgZG1hIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBpdHNlbGYgKi8KKwlpZiAoKHNycF9jbWQtPmRhdGFfb3V0X2Zvcm1hdCA9PSBTUlBfSU5ESVJFQ1RfQlVGRkVSKSB8fAorCSAgICAoc3JwX2NtZC0+ZGF0YV9pbl9mb3JtYXQgPT0gU1JQX0lORElSRUNUX0JVRkZFUikpIHsKKwkJc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgKmluZGlyZWN0ID0KKwkJICAgIChzdHJ1Y3QgaW5kaXJlY3RfZGVzY3JpcHRvciAqKXNycF9jbWQtPmFkZGl0aW9uYWxfZGF0YTsKKwkJaW5kaXJlY3QtPmhlYWQudmlydHVhbF9hZGRyZXNzID0gZXZ0X3N0cnVjdC0+Y3JxLklVX2RhdGFfcHRyICsKKwkJICAgIG9mZnNldG9mKHN0cnVjdCBzcnBfY21kLCBhZGRpdGlvbmFsX2RhdGEpICsKKwkJICAgIG9mZnNldG9mKHN0cnVjdCBpbmRpcmVjdF9kZXNjcmlwdG9yLCBsaXN0KTsKKwl9CisKKwlyZXR1cm4gaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0X3N0cnVjdCwgaG9zdGRhdGEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJvdXRpbmVzIGZvciBkcml2ZXIgaW5pdGlhbGl6YXRpb24KKyAqLworLyoqCisgKiBhZGFwdGVyX2luZm9fcnNwOiAtIEhhbmRsZSByZXNwb25zZSB0byBNQUQgYWRhcHRlciBpbmZvIHJlcXVlc3QKKyAqIEBldnRfc3RydWN0OglzcnBfZXZlbnRfc3RydWN0IHdpdGggdGhlIHJlc3BvbnNlCisgKgorICogVXNlZCBhcyBhICJkb25lIiBjYWxsYmFjayBieSB3aGVuIHNlbmRpbmcgYWRhcHRlcl9pbmZvLiBHZXRzIGNhbGxlZAorICogYnkgaWJtdnNjc2lfaGFuZGxlX2NycSgpCisqLworc3RhdGljIHZvaWQgYWRhcHRlcl9pbmZvX3JzcChzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCkKK3sKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9IGV2dF9zdHJ1Y3QtPmhvc3RkYXRhOworCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwKKwkJCSBldnRfc3RydWN0LT5pdS5tYWQuYWRhcHRlcl9pbmZvLmJ1ZmZlciwKKwkJCSBldnRfc3RydWN0LT5pdS5tYWQuYWRhcHRlcl9pbmZvLmNvbW1vbi5sZW5ndGgsCisJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCisJaWYgKGV2dF9zdHJ1Y3QtPnhmZXJfaXUtPm1hZC5hZGFwdGVyX2luZm8uY29tbW9uLnN0YXR1cykgeworCQlwcmludGsoImlibXZzY3NpOiBlcnJvciAlZCBnZXR0aW5nIGFkYXB0ZXIgaW5mb1xuIiwKKwkJICAgICAgIGV2dF9zdHJ1Y3QtPnhmZXJfaXUtPm1hZC5hZGFwdGVyX2luZm8uY29tbW9uLnN0YXR1cyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJpYm12c2NzaTogaG9zdCBzcnAgdmVyc2lvbjogJXMsICIKKwkJICAgICAgICJob3N0IHBhcnRpdGlvbiAlcyAoJWQpLCBPUyAlZCwgbWF4IGlvICV1XG4iLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8uc3JwX3ZlcnNpb24sCisJCSAgICAgICBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5wYXJ0aXRpb25fbmFtZSwKKwkJICAgICAgIGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLnBhcnRpdGlvbl9udW1iZXIsCisJCSAgICAgICBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5vc190eXBlLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ucG9ydF9tYXhfdHh1WzBdKTsKKwkJCisJCWlmIChob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5wb3J0X21heF90eHVbMF0pIAorCQkJaG9zdGRhdGEtPmhvc3QtPm1heF9zZWN0b3JzID0gCisJCQkJaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ucG9ydF9tYXhfdHh1WzBdID4+IDk7CisJfQorfQorCisvKioKKyAqIHNlbmRfbWFkX2FkYXB0ZXJfaW5mbzogLSBTZW5kcyB0aGUgbWFkIGFkYXB0ZXIgaW5mbyByZXF1ZXN0CisgKiAgICAgIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBzbyBpdCBjYW4gYmUgcmV0cmlldmVkIHdpdGgKKyAqICAgICAgc3lzZnMuICBXZSBDT1VMRCBjb25zaWRlciBjYXVzaW5nIGEgZmFpbHVyZSBpZiB0aGUKKyAqICAgICAgcmV0dXJuZWQgU1JQIHZlcnNpb24gZG9lc24ndCBtYXRjaCBvdXJzLgorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICogCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bC4KKyovCitzdGF0aWMgdm9pZCBzZW5kX21hZF9hZGFwdGVyX2luZm8oc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7CisJc3RydWN0IHZpb3NycF9hZGFwdGVyX2luZm8gKnJlcTsKKwlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdDsKKwkKKwltZW1zZXQoJmhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLCAweDAwLCBzaXplb2YoaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8pKTsKKwkKKwlldnRfc3RydWN0ID0gZ2V0X2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wpOworCWlmICghZXZ0X3N0cnVjdCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBjb3VsZG4ndCBhbGxvY2F0ZSBhbiBldmVudCAiCisJCSAgICAgICAiZm9yIEFEQVBURVJfSU5GT19SRVEhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluaXRfZXZlbnRfc3RydWN0KGV2dF9zdHJ1Y3QsCisJCQkgIGFkYXB0ZXJfaW5mb19yc3AsCisJCQkgIFZJT1NSUF9NQURfRk9STUFULAorCQkJICBpbml0X3RpbWVvdXQgKiBIWik7CisJCisJcmVxID0gJmV2dF9zdHJ1Y3QtPml1Lm1hZC5hZGFwdGVyX2luZm87CisJbWVtc2V0KHJlcSwgMHgwMCwgc2l6ZW9mKCpyZXEpKTsKKwkKKwlyZXEtPmNvbW1vbi50eXBlID0gVklPU1JQX0FEQVBURVJfSU5GT19UWVBFOworCXJlcS0+Y29tbW9uLmxlbmd0aCA9IHNpemVvZihob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mbyk7CisJcmVxLT5idWZmZXIgPSBkbWFfbWFwX3NpbmdsZShob3N0ZGF0YS0+ZGV2LAorCQkJCSAgICAgJmhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLAorCQkJCSAgICAgc2l6ZW9mKGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvKSwKKwkJCQkgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmIChkbWFfbWFwcGluZ19lcnJvcihyZXEtPmJ1ZmZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IFVuYWJsZSB0byBtYXAgcmVxdWVzdF9idWZmZXIgIgorCQkgICAgICAgImZvciBhZGFwdGVyX2luZm8hXG4iKTsKKwkJZnJlZV9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0X3N0cnVjdCwgaG9zdGRhdGEpKQorCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBjb3VsZG4ndCBzZW5kIEFEQVBURVJfSU5GT19SRVEhXG4iKTsKK307CisKKy8qKgorICogbG9naW5fcnNwOiAtIEhhbmRsZSByZXNwb25zZSB0byBTUlAgbG9naW4gcmVxdWVzdAorICogQGV2dF9zdHJ1Y3Q6CXNycF9ldmVudF9zdHJ1Y3Qgd2l0aCB0aGUgcmVzcG9uc2UKKyAqCisgKiBVc2VkIGFzIGEgImRvbmUiIGNhbGxiYWNrIGJ5IHdoZW4gc2VuZGluZyBzcnBfbG9naW4uIEdldHMgY2FsbGVkCisgKiBieSBpYm12c2NzaV9oYW5kbGVfY3JxKCkKKyovCitzdGF0aWMgdm9pZCBsb2dpbl9yc3Aoc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3QpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPSBldnRfc3RydWN0LT5ob3N0ZGF0YTsKKwlzd2l0Y2ggKGV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5nZW5lcmljLnR5cGUpIHsKKwljYXNlIFNSUF9MT0dJTl9SU1BfVFlQRToJLyogaXQgd29ya2VkISAqLworCQlicmVhazsKKwljYXNlIFNSUF9MT0dJTl9SRUpfVFlQRToJLyogcmVmdXNlZCEgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWJtdnNjc2k6IFNSUF9MT0dJTl9SRVEgcmVqZWN0ZWRcbiIpOworCQkvKiBMb2dpbiBmYWlsZWQuICAqLworCQlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgLTEpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IEludmFsaWQgbG9naW4gcmVzcG9uc2UgdHlwZWNvZGUgMHglMDJ4IVxuIiwKKwkJICAgICAgIGV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5nZW5lcmljLnR5cGUpOworCQkvKiBMb2dpbiBmYWlsZWQuICAqLworCQlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgLTEpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaWJtdnNjc2k6IFNSUF9MT0dJTiBzdWNjZWVkZWRcbiIpOworCisJaWYgKGV2dF9zdHJ1Y3QtPnhmZXJfaXUtPnNycC5sb2dpbl9yc3AucmVxdWVzdF9saW1pdF9kZWx0YSA+CisJICAgIChtYXhfcmVxdWVzdHMgLSAyKSkKKwkJZXZ0X3N0cnVjdC0+eGZlcl9pdS0+c3JwLmxvZ2luX3JzcC5yZXF1ZXN0X2xpbWl0X2RlbHRhID0KKwkJICAgIG1heF9yZXF1ZXN0cyAtIDI7CisKKwkvKiBOb3cgd2Uga25vdyB3aGF0IHRoZSByZWFsIHJlcXVlc3QtbGltaXQgaXMgKi8KKwlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwKKwkJICAgZXZ0X3N0cnVjdC0+eGZlcl9pdS0+c3JwLmxvZ2luX3JzcC5yZXF1ZXN0X2xpbWl0X2RlbHRhKTsKKworCWhvc3RkYXRhLT5ob3N0LT5jYW5fcXVldWUgPQorCSAgICBldnRfc3RydWN0LT54ZmVyX2l1LT5zcnAubG9naW5fcnNwLnJlcXVlc3RfbGltaXRfZGVsdGEgLSAyOworCisJaWYgKGhvc3RkYXRhLT5ob3N0LT5jYW5fcXVldWUgPCAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IEludmFsaWQgcmVxdWVzdF9saW1pdF9kZWx0YVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZW5kX21hZF9hZGFwdGVyX2luZm8oaG9zdGRhdGEpOworCXJldHVybjsKK30KKworLyoqCisgKiBzZW5kX3NycF9sb2dpbjogLSBTZW5kcyB0aGUgc3JwIGxvZ2luCisgKiBAaG9zdGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0CisgKiAKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLgorKi8KK3N0YXRpYyBpbnQgc2VuZF9zcnBfbG9naW4oc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNycF9sb2dpbl9yZXEgKmxvZ2luOworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnRfc3RydWN0ID0gZ2V0X2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wpOworCWlmICghZXZ0X3N0cnVjdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogY291bGRuJ3QgYWxsb2NhdGUgYW4gZXZlbnQgZm9yIGxvZ2luIHJlcSFcbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWluaXRfZXZlbnRfc3RydWN0KGV2dF9zdHJ1Y3QsCisJCQkgIGxvZ2luX3JzcCwKKwkJCSAgVklPU1JQX1NSUF9GT1JNQVQsCisJCQkgIGluaXRfdGltZW91dCAqIEhaKTsKKworCWxvZ2luID0gJmV2dF9zdHJ1Y3QtPml1LnNycC5sb2dpbl9yZXE7CisJbG9naW4tPnR5cGUgPSBTUlBfTE9HSU5fUkVRX1RZUEU7CisJbG9naW4tPm1heF9yZXF1ZXN0ZWRfaW5pdGlhdG9yX3RvX3RhcmdldF9pdWxlbiA9IHNpemVvZih1bmlvbiBzcnBfaXUpOworCWxvZ2luLT5yZXF1aXJlZF9idWZmZXJfZm9ybWF0cyA9IDB4MDAwNjsKKwkKKwkvKiBTdGFydCBvdXQgd2l0aCBhIHJlcXVlc3QgbGltaXQgb2YgMSwgc2luY2UgdGhpcyBpcyBuZWdvdGlhdGVkIGluCisJICogdGhlIGxvZ2luIHJlcXVlc3Qgd2UgYXJlIGp1c3Qgc2VuZGluZworCSAqLworCWF0b21pY19zZXQoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0LCAxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyYyA9IGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dF9zdHJ1Y3QsIGhvc3RkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqIHN5bmNfY29tcGxldGlvbjogU2lnbmFsIHRoYXQgYSBzeW5jaHJvbm91cyBjb21tYW5kIGhhcyBjb21wbGV0ZWQKKyAqIE5vdGUgdGhhdCBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGlzIGNhbGwsIHRoZSBldnRfc3RydWN0IGlzIGZyZWVkLgorICogdGhlIGNhbGxlciB3YWl0aW5nIG9uIHRoaXMgY29tcGxldGlvbiBzaG91bGRuJ3QgdG91Y2ggdGhlIGV2dF9zdHJ1Y3QKKyAqIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBzeW5jX2NvbXBsZXRpb24oc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3QpCit7CisJLyogY29weSB0aGUgcmVzcG9uc2UgYmFjayAqLworCWlmIChldnRfc3RydWN0LT5zeW5jX3NycCkKKwkJKmV2dF9zdHJ1Y3QtPnN5bmNfc3JwID0gKmV2dF9zdHJ1Y3QtPnhmZXJfaXU7CisJCisJY29tcGxldGUoJmV2dF9zdHJ1Y3QtPmNvbXApOworfQorCisvKioKKyAqIGlibXZzY3NpX2Fib3J0OiBBYm9ydCBhIGNvbW1hbmQuLi5mcm9tIHNjc2kgaG9zdCB0ZW1wbGF0ZQorICogc2VuZCB0aGlzIG92ZXIgdG8gdGhlIHNlcnZlciBhbmQgd2FpdCBzeW5jaHJvbm91c2x5IGZvciB0aGUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBpYm12c2NzaV9laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBzcnBfdHNrX21nbXQgKnRza19tZ210OworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnQ7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKnRtcF9ldnQsICpmb3VuZF9ldnQ7CisJdW5pb24gdmlvc3JwX2l1IHNycF9yc3A7CisJaW50IHJzcF9yYzsKKwl1MTYgbHVuID0gbHVuX2Zyb21fZGV2KGNtZC0+ZGV2aWNlKTsKKworCS8qIEZpcnN0LCBmaW5kIHRoaXMgY29tbWFuZCBpbiBvdXIgc2VudCBsaXN0IHNvIHdlIGNhbiBmaWd1cmUKKwkgKiBvdXQgdGhlIGNvcnJlY3QgdGFnCisJICovCisJZm91bmRfZXZ0ID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9ldnQsICZob3N0ZGF0YS0+c2VudCwgbGlzdCkgeworCQlpZiAodG1wX2V2dC0+Y21uZCA9PSBjbWQpIHsKKwkJCWZvdW5kX2V2dCA9IHRtcF9ldnQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZm91bmRfZXZ0KSAKKwkJcmV0dXJuIEZBSUxFRDsKKworCWV2dCA9IGdldF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sKTsKKwlpZiAoZXZ0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIGFib3J0IGV2ZW50XG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJCisJaW5pdF9ldmVudF9zdHJ1Y3QoZXZ0LAorCQkJICBzeW5jX2NvbXBsZXRpb24sCisJCQkgIFZJT1NSUF9TUlBfRk9STUFULAorCQkJICBpbml0X3RpbWVvdXQgKiBIWik7CisKKwl0c2tfbWdtdCA9ICZldnQtPml1LnNycC50c2tfbWdtdDsKKwkKKwkvKiBTZXQgdXAgYW4gYWJvcnQgU1JQIGNvbW1hbmQgKi8KKwltZW1zZXQodHNrX21nbXQsIDB4MDAsIHNpemVvZigqdHNrX21nbXQpKTsKKwl0c2tfbWdtdC0+dHlwZSA9IFNSUF9UU0tfTUdNVF9UWVBFOworCXRza19tZ210LT5sdW4gPSAoKHU2NCkgbHVuKSA8PCA0ODsKKwl0c2tfbWdtdC0+dGFza19tZ210X2ZsYWdzID0gMHgwMTsJLyogQUJPUlQgVEFTSyAqLworCXRza19tZ210LT5tYW5hZ2VkX3Rhc2tfdGFnID0gKHU2NCkgZm91bmRfZXZ0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiaWJtdnNjc2k6IGFib3J0aW5nIGNvbW1hbmQuIGx1biAweCVseCwgdGFnIDB4JWx4XG4iLAorCSAgICAgICB0c2tfbWdtdC0+bHVuLCB0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyk7CisKKwlldnQtPnN5bmNfc3JwID0gJnNycF9yc3A7CisJaW5pdF9jb21wbGV0aW9uKCZldnQtPmNvbXApOworCWlmIChpYm12c2NzaV9zZW5kX3NycF9ldmVudChldnQsIGhvc3RkYXRhKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGZhaWxlZCB0byBzZW5kIGFib3J0KCkgZXZlbnRcbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXNwaW5fdW5sb2NrX2lycShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldnQtPmNvbXApOworCXNwaW5fbG9ja19pcnEoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKiBtYWtlIHN1cmUgd2UgZ290IGEgZ29vZCByZXNwb25zZSAqLworCWlmICh1bmxpa2VseShzcnBfcnNwLnNycC5nZW5lcmljLnR5cGUgIT0gU1JQX1JTUF9UWVBFKSkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSAgICAgICAiaWJtdnNjc2k6IGFib3J0IGJhZCBTUlAgUlNQIHR5cGUgJWRcbiIsCisJCQkgICAgICAgc3JwX3JzcC5zcnAuZ2VuZXJpYy50eXBlKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpZiAoc3JwX3JzcC5zcnAucnNwLnJzcHZhbGlkKQorCQlyc3BfcmMgPSAqKChpbnQgKilzcnBfcnNwLnNycC5yc3Auc2Vuc2VfYW5kX3Jlc3BvbnNlX2RhdGEpOworCWVsc2UKKwkJcnNwX3JjID0gc3JwX3JzcC5zcnAucnNwLnN0YXR1czsKKworCWlmIChyc3BfcmMpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSAgICAgICAiaWJtdnNjc2k6IGFib3J0IGNvZGUgJWQgZm9yIHRhc2sgdGFnIDB4JWx4XG4iLAorCQkJICAgICAgIHJzcF9yYywKKwkJCSAgICAgICB0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyogQmVjYXVzZSB3ZSBkcm9wcGVkIHRoZSBzcGlubG9jayBhYm92ZSwgaXQncyBwb3NzaWJsZQorCSAqIFRoZSBldmVudCBpcyBubyBsb25nZXIgaW4gb3VyIGxpc3QuICBNYWtlIHN1cmUgaXQgZGlkbid0CisJICogY29tcGxldGUgd2hpbGUgd2Ugd2VyZSBhYm9ydGluZworCSAqLworCWZvdW5kX2V2dCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfZXZ0LCAmaG9zdGRhdGEtPnNlbnQsIGxpc3QpIHsKKwkJaWYgKHRtcF9ldnQtPmNtbmQgPT0gY21kKSB7CisJCQlmb3VuZF9ldnQgPSB0bXBfZXZ0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZm91bmRfZXZ0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgImlibXZzY3NpOiBhYm9ydGVkIHRhc2sgdGFnIDB4JWx4IGNvbXBsZXRlZFxuIiwKKwkJICAgICAgIHRza19tZ210LT5tYW5hZ2VkX3Rhc2tfdGFnKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiaWJtdnNjc2k6IHN1Y2Nlc3NmdWxseSBhYm9ydGVkIHRhc2sgdGFnIDB4JWx4XG4iLAorCSAgICAgICB0c2tfbWdtdC0+bWFuYWdlZF90YXNrX3RhZyk7CisKKwljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCWxpc3RfZGVsKCZmb3VuZF9ldnQtPmxpc3QpOworCXVubWFwX2NtZF9kYXRhKCZmb3VuZF9ldnQtPml1LnNycC5jbWQsIGZvdW5kX2V2dC0+aG9zdGRhdGEtPmRldik7CisJZnJlZV9ldmVudF9zdHJ1Y3QoJmZvdW5kX2V2dC0+aG9zdGRhdGEtPnBvb2wsIGZvdW5kX2V2dCk7CisJYXRvbWljX2luYygmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAqIGlibXZzY3NpX2VoX2RldmljZV9yZXNldF9oYW5kbGVyOiBSZXNldCBhIHNpbmdsZSBMVU4uLi5mcm9tIHNjc2kgaG9zdCAKKyAqIHRlbXBsYXRlIHNlbmQgdGhpcyBvdmVyIHRvIHRoZSBzZXJ2ZXIgYW5kIHdhaXQgc3luY2hyb25vdXNseSBmb3IgdGhlIAorICogcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBpYm12c2NzaV9laF9kZXZpY2VfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPQorCSAgICAoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCXN0cnVjdCBzcnBfdHNrX21nbXQgKnRza19tZ210OworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICpldnQ7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKnRtcF9ldnQsICpwb3M7CisJdW5pb24gdmlvc3JwX2l1IHNycF9yc3A7CisJaW50IHJzcF9yYzsKKwl1MTYgbHVuID0gbHVuX2Zyb21fZGV2KGNtZC0+ZGV2aWNlKTsKKworCWV2dCA9IGdldF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sKTsKKwlpZiAoZXZ0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogZmFpbGVkIHRvIGFsbG9jYXRlIHJlc2V0IGV2ZW50XG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJCisJaW5pdF9ldmVudF9zdHJ1Y3QoZXZ0LAorCQkJICBzeW5jX2NvbXBsZXRpb24sCisJCQkgIFZJT1NSUF9TUlBfRk9STUFULAorCQkJICBpbml0X3RpbWVvdXQgKiBIWik7CisKKwl0c2tfbWdtdCA9ICZldnQtPml1LnNycC50c2tfbWdtdDsKKworCS8qIFNldCB1cCBhIGx1biByZXNldCBTUlAgY29tbWFuZCAqLworCW1lbXNldCh0c2tfbWdtdCwgMHgwMCwgc2l6ZW9mKCp0c2tfbWdtdCkpOworCXRza19tZ210LT50eXBlID0gU1JQX1RTS19NR01UX1RZUEU7CisJdHNrX21nbXQtPmx1biA9ICgodTY0KSBsdW4pIDw8IDQ4OworCXRza19tZ210LT50YXNrX21nbXRfZmxhZ3MgPSAweDA4OwkvKiBMVU4gUkVTRVQgKi8KKworCXByaW50ayhLRVJOX0lORk8gImlibXZzY3NpOiByZXNldHRpbmcgZGV2aWNlLiBsdW4gMHglbHhcbiIsCisJICAgICAgIHRza19tZ210LT5sdW4pOworCisJZXZ0LT5zeW5jX3NycCA9ICZzcnBfcnNwOworCWluaXRfY29tcGxldGlvbigmZXZ0LT5jb21wKTsKKwlpZiAoaWJtdnNjc2lfc2VuZF9zcnBfZXZlbnQoZXZ0LCBob3N0ZGF0YSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBmYWlsZWQgdG8gc2VuZCByZXNldCBldmVudFxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKGhvc3RkYXRhLT5ob3N0LT5ob3N0X2xvY2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmV2dC0+Y29tcCk7CisJc3Bpbl9sb2NrX2lycShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBnb3QgYSBnb29kIHJlc3BvbnNlICovCisJaWYgKHVubGlrZWx5KHNycF9yc3Auc3JwLmdlbmVyaWMudHlwZSAhPSBTUlBfUlNQX1RZUEUpKSB7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJICAgICAgICJpYm12c2NzaTogcmVzZXQgYmFkIFNSUCBSU1AgdHlwZSAlZFxuIiwKKwkJCSAgICAgICBzcnBfcnNwLnNycC5nZW5lcmljLnR5cGUpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWlmIChzcnBfcnNwLnNycC5yc3AucnNwdmFsaWQpCisJCXJzcF9yYyA9ICooKGludCAqKXNycF9yc3Auc3JwLnJzcC5zZW5zZV9hbmRfcmVzcG9uc2VfZGF0YSk7CisJZWxzZQorCQlyc3BfcmMgPSBzcnBfcnNwLnNycC5yc3Auc3RhdHVzOworCisJaWYgKHJzcF9yYykgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSAgICAgICAiaWJtdnNjc2k6IHJlc2V0IGNvZGUgJWQgZm9yIHRhc2sgdGFnIDB4JWx4XG4iLAorCQkgICAgICAgcnNwX3JjLAorCQkJICAgICAgIHRza19tZ210LT5tYW5hZ2VkX3Rhc2tfdGFnKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIGZpbmQgYWxsIGNvbW1hbmRzIGZvciB0aGlzIExVTiB0aGF0IGhhdmUgbm90IHlldCBiZWVuCisJICogcmVzcG9uZGVkIHRvLCBhbmQgZmFpbCB0aGVtIHdpdGggRElEX1JFU0VUCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcF9ldnQsIHBvcywgJmhvc3RkYXRhLT5zZW50LCBsaXN0KSB7CisJCWlmICgodG1wX2V2dC0+Y21uZCkgJiYgKHRtcF9ldnQtPmNtbmQtPmRldmljZSA9PSBjbWQtPmRldmljZSkpIHsKKwkJCWlmICh0bXBfZXZ0LT5jbW5kKQorCQkJCXRtcF9ldnQtPmNtbmQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJbGlzdF9kZWwoJnRtcF9ldnQtPmxpc3QpOworCQkJdW5tYXBfY21kX2RhdGEoJnRtcF9ldnQtPml1LnNycC5jbWQsIHRtcF9ldnQtPmhvc3RkYXRhLT5kZXYpOworCQkJZnJlZV9ldmVudF9zdHJ1Y3QoJnRtcF9ldnQtPmhvc3RkYXRhLT5wb29sLAorCQkJCQkJICAgdG1wX2V2dCk7CisJCQlhdG9taWNfaW5jKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCk7CisJCQlpZiAodG1wX2V2dC0+Y21uZF9kb25lKQorCQkJCXRtcF9ldnQtPmNtbmRfZG9uZSh0bXBfZXZ0LT5jbW5kKTsKKwkJCWVsc2UgaWYgKHRtcF9ldnQtPmRvbmUpCisJCQkJdG1wX2V2dC0+ZG9uZSh0bXBfZXZ0KTsKKwkJfQorCX0KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgKiBwdXJnZV9yZXF1ZXN0czogT3VyIHZpcnR1YWwgYWRhcHRlciBqdXN0IHNodXQgZG93bi4gIHB1cmdlIGFueSBzZW50IHJlcXVlc3RzCisgKiBAaG9zdGRhdGE6ICAgIHRoZSBhZGFwdGVyCisgKi8KK3N0YXRpYyB2b2lkIHB1cmdlX3JlcXVlc3RzKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhKQoreworCXN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICp0bXBfZXZ0LCAqcG9zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcF9ldnQsIHBvcywgJmhvc3RkYXRhLT5zZW50LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZ0bXBfZXZ0LT5saXN0KTsKKwkJaWYgKHRtcF9ldnQtPmNtbmQpIHsKKwkJCXRtcF9ldnQtPmNtbmQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJdW5tYXBfY21kX2RhdGEoJnRtcF9ldnQtPml1LnNycC5jbWQsIAorCQkJCSAgICAgICB0bXBfZXZ0LT5ob3N0ZGF0YS0+ZGV2KTsKKwkJCWlmICh0bXBfZXZ0LT5jbW5kX2RvbmUpCisJCQkJdG1wX2V2dC0+Y21uZF9kb25lKHRtcF9ldnQtPmNtbmQpOworCQl9IGVsc2UgeworCQkJaWYgKHRtcF9ldnQtPmRvbmUpIHsKKwkJCQl0bXBfZXZ0LT5kb25lKHRtcF9ldnQpOworCQkJfQorCQl9CisJCWZyZWVfZXZlbnRfc3RydWN0KCZ0bXBfZXZ0LT5ob3N0ZGF0YS0+cG9vbCwgdG1wX2V2dCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdGRhdGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGlibXZzY3NpX2hhbmRsZV9jcnE6IC0gSGFuZGxlcyBhbmQgZnJlZXMgcmVjZWl2ZWQgZXZlbnRzIGluIHRoZSBDUlEKKyAqIEBjcnE6CUNvbW1hbmQvUmVzcG9uc2UgcXVldWUKKyAqIEBob3N0ZGF0YToJaWJtdnNjc2lfaG9zdF9kYXRhIG9mIGhvc3QKKyAqCisqLwordm9pZCBpYm12c2NzaV9oYW5kbGVfY3JxKHN0cnVjdCB2aW9zcnBfY3JxICpjcnEsCisJCQkgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqZXZ0X3N0cnVjdCA9CisJICAgIChzdHJ1Y3Qgc3JwX2V2ZW50X3N0cnVjdCAqKWNycS0+SVVfZGF0YV9wdHI7CisJc3dpdGNoIChjcnEtPnZhbGlkKSB7CisJY2FzZSAweEMwOgkJLyogaW5pdGlhbGl6YXRpb24gKi8KKwkJc3dpdGNoIChjcnEtPmZvcm1hdCkgeworCQljYXNlIDB4MDE6CS8qIEluaXRpYWxpemF0aW9uIG1lc3NhZ2UgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gImlibXZzY3NpOiBwYXJ0bmVyIGluaXRpYWxpemVkXG4iKTsKKwkJCS8qIFNlbmQgYmFjayBhIHJlc3BvbnNlICovCisJCQlpZiAoaWJtdnNjc2lfc2VuZF9jcnEoaG9zdGRhdGEsCisJCQkJCSAgICAgIDB4QzAwMjAwMDAwMDAwMDAwMExMLCAwKSA9PSAwKSB7CisJCQkJLyogTm93IGxvZ2luICovCisJCQkJc2VuZF9zcnBfbG9naW4oaG9zdGRhdGEpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgImlibXZzY3NpOiBVbmFibGUgdG8gc2VuZCBpbml0IHJzcFxuIik7CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIDB4MDI6CS8qIEluaXRpYWxpemF0aW9uIHJlc3BvbnNlICovCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImlibXZzY3NpOiBwYXJ0bmVyIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlXG4iKTsKKworCQkJLyogTm93IGxvZ2luICovCisJCQlzZW5kX3NycF9sb2dpbihob3N0ZGF0YSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IHVua25vd24gY3JxIG1lc3NhZ2UgdHlwZVxuIik7CisJCX0KKwkJcmV0dXJuOworCWNhc2UgMHhGRjoJCS8qIEh5cGVydmlzb3IgdGVsbGluZyB1cyB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWJtdnNjc2k6IFZpcnR1YWwgYWRhcHRlciBmYWlsZWQhXG4iKTsKKworCQlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgLTEpOworCQlwdXJnZV9yZXF1ZXN0cyhob3N0ZGF0YSk7CisJCWlibXZzY3NpX3Jlc2V0X2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSk7CisJCXJldHVybjsKKwljYXNlIDB4ODA6CQkvKiByZWFsIHBheWxvYWQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IGdvdCBhbiBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAweCUwMnhcbiIsCisJCSAgICAgICBjcnEtPnZhbGlkKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZSBvbmx5IGtpbmQgb2YgcGF5bG9hZCBDUlFzIHdlIHNob3VsZCBnZXQgYXJlIHJlc3BvbnNlcyB0bworCSAqIHRoaW5ncyB3ZSBzZW5kLiBNYWtlIHN1cmUgdGhpcyByZXNwb25zZSBpcyB0byBzb21ldGhpbmcgd2UKKwkgKiBhY3R1YWxseSBzZW50CisJICovCisJaWYgKCF2YWxpZF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sLCBldnRfc3RydWN0KSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogcmV0dXJuZWQgY29ycmVsYXRpb25fdG9rZW4gMHglcCBpcyBpbnZhbGlkIVxuIiwKKwkJICAgICAgICh2b2lkICopY3JxLT5JVV9kYXRhX3B0cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmV2dF9zdHJ1Y3QtPmZyZWUpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiByZWNlaXZlZCBkdXBsaWNhdGUgIGNvcnJlbGF0aW9uX3Rva2VuIDB4JXAhXG4iLAorCQkgICAgICAgKHZvaWQgKiljcnEtPklVX2RhdGFfcHRyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjcnEtPmZvcm1hdCA9PSBWSU9TUlBfU1JQX0ZPUk1BVCkKKwkJYXRvbWljX2FkZChldnRfc3RydWN0LT54ZmVyX2l1LT5zcnAucnNwLnJlcXVlc3RfbGltaXRfZGVsdGEsCisJCQkgICAmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQpOworCisJaWYgKGV2dF9zdHJ1Y3QtPmRvbmUpCisJCWV2dF9zdHJ1Y3QtPmRvbmUoZXZ0X3N0cnVjdCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpYm12c2NzaTogcmV0dXJuZWQgZG9uZSgpIGlzIE5VTEw7IG5vdCBydW5uaW5nIGl0IVxuIik7CisKKwkvKgorCSAqIExvY2sgdGhlIGhvc3RfbG9jayBiZWZvcmUgbWVzc2luZyB3aXRoIHRoZXNlIHN0cnVjdHVyZXMsIHNpbmNlIHdlCisJICogYXJlIHJ1bm5pbmcgaW4gYSB0YXNrIGNvbnRleHQKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShldnRfc3RydWN0LT5ob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJmV2dF9zdHJ1Y3QtPmxpc3QpOworCWZyZWVfZXZlbnRfc3RydWN0KCZldnRfc3RydWN0LT5ob3N0ZGF0YS0+cG9vbCwgZXZ0X3N0cnVjdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShldnRfc3RydWN0LT5ob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogaWJtdnNjc2lfZ2V0X2hvc3RfY29uZmlnOiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgdG8gZ2V0IGhvc3QKKyAqIGNvbmZpZ3VyYXRpb24gZGF0YS4gIFRoZSBkYXRhIGlzIG9wYXF1ZSB0byB1cy4KKyAqLworc3RhdGljIGludCBpYm12c2NzaV9kb19ob3N0X2NvbmZpZyhzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwKKwkJCQkgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHZpb3NycF9ob3N0X2NvbmZpZyAqaG9zdF9jb25maWc7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2dF9zdHJ1Y3Q7CisJaW50IHJjOworCisJZXZ0X3N0cnVjdCA9IGdldF9ldmVudF9zdHJ1Y3QoJmhvc3RkYXRhLT5wb29sKTsKKwlpZiAoIWV2dF9zdHJ1Y3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IGNvdWxkJ3QgYWxsb2NhdGUgZXZlbnQgZm9yIEhPU1RfQ09ORklHIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpbml0X2V2ZW50X3N0cnVjdChldnRfc3RydWN0LAorCQkJICBzeW5jX2NvbXBsZXRpb24sCisJCQkgIFZJT1NSUF9NQURfRk9STUFULAorCQkJICBpbml0X3RpbWVvdXQgKiBIWik7CisKKwlob3N0X2NvbmZpZyA9ICZldnRfc3RydWN0LT5pdS5tYWQuaG9zdF9jb25maWc7CisKKwkvKiBTZXQgdXAgYSBsdW4gcmVzZXQgU1JQIGNvbW1hbmQgKi8KKwltZW1zZXQoaG9zdF9jb25maWcsIDB4MDAsIHNpemVvZigqaG9zdF9jb25maWcpKTsKKwlob3N0X2NvbmZpZy0+Y29tbW9uLnR5cGUgPSBWSU9TUlBfSE9TVF9DT05GSUdfVFlQRTsKKwlob3N0X2NvbmZpZy0+Y29tbW9uLmxlbmd0aCA9IGxlbmd0aDsKKwlob3N0X2NvbmZpZy0+YnVmZmVyID0gZG1hX21hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgYnVmZmVyLCBsZW5ndGgsCisJCQkJCSAgICBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoaG9zdF9jb25maWctPmJ1ZmZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaWJtdnNjc2k6IGRtYV9tYXBwaW5nIGVycm9yICIgImdldHRpbmcgaG9zdCBjb25maWdcbiIpOworCQlmcmVlX2V2ZW50X3N0cnVjdCgmaG9zdGRhdGEtPnBvb2wsIGV2dF9zdHJ1Y3QpOworCQlyZXR1cm4gLTE7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZldnRfc3RydWN0LT5jb21wKTsKKwlyYyA9IGlibXZzY3NpX3NlbmRfc3JwX2V2ZW50KGV2dF9zdHJ1Y3QsIGhvc3RkYXRhKTsKKwlpZiAocmMgPT0gMCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldnRfc3RydWN0LT5jb21wKTsKKwkJZG1hX3VubWFwX3NpbmdsZShob3N0ZGF0YS0+ZGV2LCBob3N0X2NvbmZpZy0+YnVmZmVyLAorCQkJCSBsZW5ndGgsIERNQV9CSURJUkVDVElPTkFMKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc3lzZnMgYXR0cmlidXRlcworICovCitzdGF0aWMgc3NpemVfdCBzaG93X2hvc3Rfc3JwX3ZlcnNpb24oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5zcnBfdmVyc2lvbik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGlibXZzY3NpX2hvc3Rfc3JwX3ZlcnNpb24gPSB7CisJLmF0dHIgPSB7CisJCSAubmFtZSA9ICJzcnBfdmVyc2lvbiIsCisJCSAubW9kZSA9IFNfSVJVR08sCisJCSB9LAorCS5zaG93ID0gc2hvd19ob3N0X3NycF92ZXJzaW9uLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19ob3N0X3BhcnRpdGlvbl9uYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkgICAgICAgaG9zdGRhdGEtPm1hZGFwdGVyX2luZm8ucGFydGl0aW9uX25hbWUpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpYm12c2NzaV9ob3N0X3BhcnRpdGlvbl9uYW1lID0geworCS5hdHRyID0geworCQkgLm5hbWUgPSAicGFydGl0aW9uX25hbWUiLAorCQkgLm1vZGUgPSBTX0lSVUdPLAorCQkgfSwKKwkuc2hvdyA9IHNob3dfaG9zdF9wYXJ0aXRpb25fbmFtZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaG9zdF9wYXJ0aXRpb25fbnVtYmVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKKwkJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5wYXJ0aXRpb25fbnVtYmVyKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaWJtdnNjc2lfaG9zdF9wYXJ0aXRpb25fbnVtYmVyID0geworCS5hdHRyID0geworCQkgLm5hbWUgPSAicGFydGl0aW9uX251bWJlciIsCisJCSAubW9kZSA9IFNfSVJVR08sCisJCSB9LAorCS5zaG93ID0gc2hvd19ob3N0X3BhcnRpdGlvbl9udW1iZXIsCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2hvc3RfbWFkX3ZlcnNpb24oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+bWFkYXB0ZXJfaW5mby5tYWRfdmVyc2lvbik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGlibXZzY3NpX2hvc3RfbWFkX3ZlcnNpb24gPSB7CisJLmF0dHIgPSB7CisJCSAubmFtZSA9ICJtYWRfdmVyc2lvbiIsCisJCSAubW9kZSA9IFNfSVJVR08sCisJCSB9LAorCS5zaG93ID0gc2hvd19ob3N0X21hZF92ZXJzaW9uLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19ob3N0X29zX3R5cGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGhvc3RkYXRhLT5tYWRhcHRlcl9pbmZvLm9zX3R5cGUpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpYm12c2NzaV9ob3N0X29zX3R5cGUgPSB7CisJLmF0dHIgPSB7CisJCSAubmFtZSA9ICJvc190eXBlIiwKKwkJIC5tb2RlID0gU19JUlVHTywKKwkJIH0sCisJLnNob3cgPSBzaG93X2hvc3Rfb3NfdHlwZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaG9zdF9jb25maWcoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisKKwkvKiByZXR1cm5zIG51bGwtdGVybWluYXRlZCBob3N0IGNvbmZpZyBkYXRhICovCisJaWYgKGlibXZzY3NpX2RvX2hvc3RfY29uZmlnKGhvc3RkYXRhLCBidWYsIFBBR0VfU0laRSkgPT0gMCkKKwkJcmV0dXJuIHN0cmxlbihidWYpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpYm12c2NzaV9ob3N0X2NvbmZpZyA9IHsKKwkuYXR0ciA9IHsKKwkJIC5uYW1lID0gImNvbmZpZyIsCisJCSAubW9kZSA9IFNfSVJVR08sCisJCSB9LAorCS5zaG93ID0gc2hvd19ob3N0X2NvbmZpZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqaWJtdnNjc2lfYXR0cnNbXSA9IHsKKwkmaWJtdnNjc2lfaG9zdF9zcnBfdmVyc2lvbiwKKwkmaWJtdnNjc2lfaG9zdF9wYXJ0aXRpb25fbmFtZSwKKwkmaWJtdnNjc2lfaG9zdF9wYXJ0aXRpb25fbnVtYmVyLAorCSZpYm12c2NzaV9ob3N0X21hZF92ZXJzaW9uLAorCSZpYm12c2NzaV9ob3N0X29zX3R5cGUsCisJJmlibXZzY3NpX2hvc3RfY29uZmlnLAorCU5VTEwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0NTSSBkcml2ZXIgcmVnaXN0cmF0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiSUJNIFBPV0VSIFZpcnR1YWwgU0NTSSBBZGFwdGVyICIgSUJNVlNDU0lfVkVSU0lPTiwKKwkucHJvY19uYW1lID0gImlibXZzY3NpIiwKKwkucXVldWVjb21tYW5kID0gaWJtdnNjc2lfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0gaWJtdnNjc2lfZWhfYWJvcnRfaGFuZGxlciwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBpYm12c2NzaV9laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKKwkuY21kX3Blcl9sdW4gPSAxNiwKKwkuY2FuX3F1ZXVlID0gMSwJCS8qIFVwZGF0ZWQgYWZ0ZXIgU1JQX0xPR0lOICovCisJLnRoaXNfaWQgPSAtMSwKKwkuc2dfdGFibGVzaXplID0gTUFYX0lORElSRUNUX0JVRlMsCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnNob3N0X2F0dHJzID0gaWJtdnNjc2lfYXR0cnMsCit9OworCisvKioKKyAqIENhbGxlZCBieSBidXMgY29kZSBmb3IgZWFjaCBhZGFwdGVyCisgKi8KK3N0YXRpYyBpbnQgaWJtdnNjc2lfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2ZGV2LT5kZXY7CisJdW5zaWduZWQgbG9uZyB3YWl0X3N3aXRjaCA9IDA7CisKKwl2ZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOworCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YoKmhvc3RkYXRhKSk7CisJaWYgKCFob3N0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6IGNvdWxkbid0IGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CisJCWdvdG8gc2NzaV9ob3N0X2FsbG9jX2ZhaWxlZDsKKwl9CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KGhvc3RkYXRhLCAweDAwLCBzaXplb2YoKmhvc3RkYXRhKSk7CisJSU5JVF9MSVNUX0hFQUQoJmhvc3RkYXRhLT5zZW50KTsKKwlob3N0ZGF0YS0+aG9zdCA9IGhvc3Q7CisJaG9zdGRhdGEtPmRldiA9IGRldjsKKwlhdG9taWNfc2V0KCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCwgLTEpOworCWhvc3RkYXRhLT5ob3N0LT5tYXhfc2VjdG9ycyA9IDMyICogODsgLyogZGVmYXVsdCBtYXggSS9PIDMyIHBhZ2VzICovCisKKwlpZiAoaWJtdnNjc2lfaW5pdF9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsCisJCQkJICAgIG1heF9yZXF1ZXN0cykgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBjb3VsZG4ndCBpbml0aWFsaXplIGNycVxuIik7CisJCWdvdG8gaW5pdF9jcnFfZmFpbGVkOworCX0KKwlpZiAoaW5pdGlhbGl6ZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgbWF4X3JlcXVlc3RzLCBob3N0ZGF0YSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlibXZzY3NpOiBjb3VsZG4ndCBpbml0aWFsaXplIGV2ZW50IHBvb2xcbiIpOworCQlnb3RvIGluaXRfcG9vbF9mYWlsZWQ7CisJfQorCisJaG9zdC0+bWF4X2x1biA9IDg7CisJaG9zdC0+bWF4X2lkID0gbWF4X2lkOworCWhvc3QtPm1heF9jaGFubmVsID0gbWF4X2NoYW5uZWw7CisKKwlpZiAoc2NzaV9hZGRfaG9zdChob3N0ZGF0YS0+aG9zdCwgaG9zdGRhdGEtPmRldikpCisJCWdvdG8gYWRkX2hvc3RfZmFpbGVkOworCisJLyogVHJ5IHRvIHNlbmQgYW4gaW5pdGlhbGl6YXRpb24gbWVzc2FnZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFsbG93ZWQKKwkgKiB0byBmYWlsIGlmIHRoZSBvdGhlciBlbmQgaXMgbm90IGFjaXZlLiAgSW4gdGhhdCBjYXNlIHdlIGRvbid0CisJICogd2FudCB0byBzY2FuCisJICovCisJaWYgKGlibXZzY3NpX3NlbmRfY3JxKGhvc3RkYXRhLCAweEMwMDEwMDAwMDAwMDAwMDBMTCwgMCkgPT0gMCkgeworCQkvKgorCQkgKiBXYWl0IGFyb3VuZCBtYXggaW5pdF90aW1lb3V0IHNlY3MgZm9yIHRoZSBhZGFwdGVyIHRvIGZpbmlzaAorCQkgKiBpbml0aWFsaXppbmcuIFdoZW4gd2UgYXJlIGRvbmUgaW5pdGlhbGl6aW5nLCB3ZSB3aWxsIGhhdmUgYQorCQkgKiB2YWxpZCByZXF1ZXN0X2xpbWl0LiAgV2UgZG9uJ3Qgd2FudCBMaW51eCBzY2FubmluZyBiZWZvcmUKKwkJICogd2UgYXJlIHJlYWR5LgorCQkgKi8KKwkJZm9yICh3YWl0X3N3aXRjaCA9IGppZmZpZXMgKyAoaW5pdF90aW1lb3V0ICogSFopOworCQkgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHdhaXRfc3dpdGNoKSAmJgorCQkgICAgIGF0b21pY19yZWFkKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCkgPCAyOykgeworCisJCQltc2xlZXAoMTApOworCQl9CisKKwkJLyogaWYgd2Ugbm93IGhhdmUgYSB2YWxpZCByZXF1ZXN0X2xpbWl0LCBpbml0aWF0ZSBhIHNjYW4gKi8KKwkJaWYgKGF0b21pY19yZWFkKCZob3N0ZGF0YS0+cmVxdWVzdF9saW1pdCkgPiAwKQorCQkJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisJfQorCisJdmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gaG9zdGRhdGE7CisJcmV0dXJuIDA7CisKKyAgICAgIGFkZF9ob3N0X2ZhaWxlZDoKKwlyZWxlYXNlX2V2ZW50X3Bvb2woJmhvc3RkYXRhLT5wb29sLCBob3N0ZGF0YSk7CisgICAgICBpbml0X3Bvb2xfZmFpbGVkOgorCWlibXZzY3NpX3JlbGVhc2VfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLCBtYXhfcmVxdWVzdHMpOworICAgICAgaW5pdF9jcnFfZmFpbGVkOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisgICAgICBzY3NpX2hvc3RfYWxsb2NfZmFpbGVkOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpYm12c2NzaV9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEgPSB2ZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisJcmVsZWFzZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgaG9zdGRhdGEpOworCWlibXZzY3NpX3JlbGVhc2VfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLAorCQkJCSAgIG1heF9yZXF1ZXN0cyk7CisJCisJc2NzaV9yZW1vdmVfaG9zdChob3N0ZGF0YS0+aG9zdCk7CisJc2NzaV9ob3N0X3B1dChob3N0ZGF0YS0+aG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpYm12c2NzaV9kZXZpY2VfdGFibGU6IFVzZWQgYnkgdmlvLmMgdG8gbWF0Y2ggZGV2aWNlcyBpbiB0aGUgZGV2aWNlIHRyZWUgd2UgCisgKiBzdXBwb3J0LgorICovCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgaWJtdnNjc2lfZGV2aWNlX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7InZzY3NpIiwgIklCTSx2LXNjc2kifSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaWJtdnNjc2lfZGV2aWNlX3RhYmxlKTsKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBpYm12c2NzaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiaWJtdnNjc2kiLAorCS5pZF90YWJsZSA9IGlibXZzY3NpX2RldmljZV90YWJsZSwKKwkucHJvYmUgPSBpYm12c2NzaV9wcm9iZSwKKwkucmVtb3ZlID0gaWJtdnNjc2lfcmVtb3ZlCit9OworCitpbnQgX19pbml0IGlibXZzY3NpX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHZpb19yZWdpc3Rlcl9kcml2ZXIoJmlibXZzY3NpX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IGlibXZzY3NpX21vZHVsZV9leGl0KHZvaWQpCit7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZpYm12c2NzaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpYm12c2NzaV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpYm12c2NzaV9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaCBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzBiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuaApAQCAtMCwwICsxLDEwOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpYm12c2NzaS5oCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAxOTk0LCAyMDAzCisgKiBBdXRob3JzOiBDb2xpbiBEZVZpbGJpc3MgKGRldmlsYmlzQHVzLmlibS5jb20pCisgKiAgICAgICAgICBTYW50aWFnbyBMZW9uIChzYW50aWxAdXMuaWJtLmNvbSkKKyAqICAgICAgICAgIERhdmUgQm91dGNoZXIgKHNsZWRkb2dAdXMuaWJtLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogVVNBCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbXVsYXRpb24gb2YgYSBTQ1NJIGhvc3QgYWRhcHRlciBmb3IgVmlydHVhbCBJL08gZGV2aWNlcworICoKKyAqIFRoaXMgZHJpdmVyIGFsbG93cyB0aGUgTGludXggU0NTSSBwZXJpcGhlcmFsIGRyaXZlcnMgdG8gZGlyZWN0bHkKKyAqIGFjY2VzcyBkZXZpY2VzIGluIHRoZSBob3N0aW5nIHBhcnRpdGlvbiwgZWl0aGVyIG9uIGFuIGlTZXJpZXMKKyAqIGh5cGVydmlzb3Igc3lzdGVtIG9yIGEgY29udmVyZ2VkIGh5cGVydmlzb3Igc3lzdGVtLgorICovCisjaWZuZGVmIElCTVZTQ1NJX0gKKyNkZWZpbmUgSUJNVlNDU0lfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJ2aW9zcnAuaCIKKworc3RydWN0IHNjc2lfY21uZDsKK3N0cnVjdCBTY3NpX0hvc3Q7CisKKy8qIE51bWJlciBvZiBpbmRpcmVjdCBidWZzLi4udGhlIGxpc3Qgb2YgdGhlc2UgaGFzIHRvIGZpdCBpbiB0aGUKKyAqIGFkZGl0aW9uYWwgZGF0YSBvZiB0aGUgc3JwX2NtZCBzdHJ1Y3QgYWxvbmcgd2l0aCB0aGUgaW5kaXJlY3QKKyAqIGRlc2NyaXB0b3IKKyAqLworI2RlZmluZSBNQVhfSU5ESVJFQ1RfQlVGUyAxMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERhdGEgU3RydWN0dXJlcworICovCisvKiBhbiBSUEEgY29tbWFuZC9yZXNwb25zZSB0cmFuc3BvcnQgcXVldWUgKi8KK3N0cnVjdCBjcnFfcXVldWUgeworCXN0cnVjdCB2aW9zcnBfY3JxICptc2dzOworCWludCBzaXplLCBjdXI7CisJZG1hX2FkZHJfdCBtc2dfdG9rZW47CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLyogYSB1bml0IG9mIHdvcmsgZm9yIHRoZSBob3N0aW5nIHBhcnRpdGlvbiAqLworc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgeworCXVuaW9uIHZpb3NycF9pdSAqeGZlcl9pdTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl2b2lkICgqZG9uZSkgKHN0cnVjdCBzcnBfZXZlbnRfc3RydWN0ICopOworCXN0cnVjdCB2aW9zcnBfY3JxIGNycTsKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YTsKKwlhdG9taWNfdCBmcmVlOworCXVuaW9uIHZpb3NycF9pdSBpdTsKKwl2b2lkICgqY21uZF9kb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworCXVuaW9uIHZpb3NycF9pdSAqc3luY19zcnA7Cit9OworCisvKiBhIHBvb2wgb2YgZXZlbnQgc3RydWN0cyBmb3IgdXNlICovCitzdHJ1Y3QgZXZlbnRfcG9vbCB7CisJc3RydWN0IHNycF9ldmVudF9zdHJ1Y3QgKmV2ZW50czsKKwl1MzIgc2l6ZTsKKwlpbnQgbmV4dDsKKwl1bmlvbiB2aW9zcnBfaXUgKml1X3N0b3JhZ2U7CisJZG1hX2FkZHJfdCBpdV90b2tlbjsKK307CisKKy8qIGFsbCBkcml2ZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBob3N0IGFkYXB0ZXIgKi8KK3N0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgeworCWF0b21pY190IHJlcXVlc3RfbGltaXQ7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBldmVudF9wb29sIHBvb2w7CisJc3RydWN0IGNycV9xdWV1ZSBxdWV1ZTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc3JwX3Rhc2s7CisJc3RydWN0IGxpc3RfaGVhZCBzZW50OworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IG1hZF9hZGFwdGVyX2luZm9fZGF0YSBtYWRhcHRlcl9pbmZvOworfTsKKworLyogcm91dGluZXMgZm9yIG1hbmFnaW5nIGEgY29tbWFuZC9yZXNwb25zZSBxdWV1ZSAqLworaW50IGlibXZzY3NpX2luaXRfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJICAgIHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLAorCQkJICAgIGludCBtYXhfcmVxdWVzdHMpOwordm9pZCBpYm12c2NzaV9yZWxlYXNlX2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKKwkJCQlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwKKwkJCQlpbnQgbWF4X3JlcXVlc3RzKTsKK3ZvaWQgaWJtdnNjc2lfcmVzZXRfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJICAgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpOworCit2b2lkIGlibXZzY3NpX2hhbmRsZV9jcnEoc3RydWN0IHZpb3NycF9jcnEgKmNycSwKKwkJCSBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSk7CitpbnQgaWJtdnNjc2lfc2VuZF9jcnEoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsCisJCSAgICAgIHU2NCB3b3JkMSwgdTY0IHdvcmQyKTsKKworI2VuZGlmCQkJCS8qIElCTVZTQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pc2VyaWVzX3ZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaXNlcmllc192c2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjAyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaXNlcmllc192c2NzaS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlTZXJpZXNfdnNjc2kuYworICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMTk5NCwgMjAwMworICogQXV0aG9yczogQ29saW4gRGVWaWxiaXNzIChkZXZpbGJpc0B1cy5pYm0uY29tKQorICogICAgICAgICAgU2FudGlhZ28gTGVvbiAoc2FudGlsQHVzLmlibS5jb20pCisgKiAgICAgICAgICBEYXZlIEJvdXRjaGVyIChzbGVkZG9nQHVzLmlibS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcKKyAqIFVTQQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaVNlcmllcy1zcGVjaWZpYyBmdW5jdGlvbnMgb2YgdGhlIFNDU0kgaG9zdCBhZGFwdGVyIGZvciBWaXJ0dWFsIEkvTyBkZXZpY2VzCisgKgorICogVGhpcyBkcml2ZXIgYWxsb3dzIHRoZSBMaW51eCBTQ1NJIHBlcmlwaGVyYWwgZHJpdmVycyB0byBkaXJlY3RseQorICogYWNjZXNzIGRldmljZXMgaW4gdGhlIGhvc3RpbmcgcGFydGl0aW9uLCBlaXRoZXIgb24gYW4gaVNlcmllcworICogaHlwZXJ2aXNvciBzeXN0ZW0gb3IgYSBjb252ZXJnZWQgaHlwZXJ2aXNvciBzeXN0ZW0uCisgKi8KKworI2luY2x1ZGUgPGFzbS9pU2VyaWVzL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2THBFdmVudC5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2VHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwQ29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImlibXZzY3NpLmgiCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpzaW5nbGVfaG9zdF9kYXRhOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJvdXRpbmVzIGZvciBkaXJlY3QgaW50ZXJwYXJ0aXRpb24gaW50ZXJhY3Rpb24KKyAqLworc3RydWN0IHNycF9scF9ldmVudCB7CisJc3RydWN0IEh2THBFdmVudCBscGV2dDsJLyogMHgwMC0weDE3ICAgICAgICAgICovCisJdTMyIHJlc2VydmVkMTsJCS8qIDB4MTgtMHgxQjsgdW51c2VkICAqLworCXUxNiB2ZXJzaW9uOwkJLyogMHgxQy0weDFEOyB1bnVzZWQgICovCisJdTE2IHN1YnR5cGVfcmM7CQkvKiAweDFFLTB4MUY7IHVudXNlZCAgKi8KKwlzdHJ1Y3Qgdmlvc3JwX2NycSBjcnE7CS8qIDB4MjAtMHgzRiAgICAgICAgICAqLworfTsKKworLyoqIAorICogc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBoYW5kbGluZyBsb2dpY2FsIHBhcnRpdGlvbiBldmVudHMuCisgKi8KK3N0YXRpYyB2b2lkIGlibXZzY3NpX2hhbmRsZV9ldmVudChzdHJ1Y3QgSHZMcEV2ZW50ICpscGV2dCkKK3sKKwlzdHJ1Y3Qgc3JwX2xwX2V2ZW50ICpldnQgPSAoc3RydWN0IHNycF9scF9ldmVudCAqKWxwZXZ0OworCisJaWYgKCFldnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogcmVjZWl2ZWQgbnVsbCBldmVudFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2luZ2xlX2hvc3RfZGF0YSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImlibXZzY3NpOiByZWNlaXZlZCBldmVudCwgbm8gYWRhcHRlciBwcmVzZW50XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlibXZzY3NpX2hhbmRsZV9jcnEoJmV2dC0+Y3JxLCBzaW5nbGVfaG9zdF9kYXRhKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3IgZHJpdmVyIGluaXRpYWxpemF0aW9uCisgKi8KK2ludCBpYm12c2NzaV9pbml0X2NycV9xdWV1ZShzdHJ1Y3QgY3JxX3F1ZXVlICpxdWV1ZSwKKwkJCSAgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSwKKwkJCSAgICBpbnQgbWF4X3JlcXVlc3RzKQoreworCWludCByYzsKKworCXNpbmdsZV9ob3N0X2RhdGEgPSBob3N0ZGF0YTsKKwlyYyA9IHZpb3BhdGhfb3Blbih2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX3Njc2ksIDApOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKCJ2aW9wYXRoX29wZW4gZmFpbGVkIHdpdGggcmMgJWQgaW4gb3Blbl9ldmVudF9wYXRoXG4iLAorCQkgICAgICAgcmMpOworCQlnb3RvIHZpb3BhdGhfb3Blbl9mYWlsZWQ7CisJfQorCisJcmMgPSB2aW9fc2V0SGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfc2NzaSwgaWJtdnNjc2lfaGFuZGxlX2V2ZW50KTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50aygidmlvX3NldEhhbmRsZXIgZmFpbGVkIHdpdGggcmMgJWQgaW4gb3Blbl9ldmVudF9wYXRoXG4iLAorCQkgICAgICAgcmMpOworCQlnb3RvIHZpb19zZXRIYW5kbGVyX2ZhaWxlZDsKKwl9CisJcmV0dXJuIDA7CisKKyAgICAgIHZpb19zZXRIYW5kbGVyX2ZhaWxlZDoKKwl2aW9wYXRoX2Nsb3NlKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfc2NzaSwgbWF4X3JlcXVlc3RzKTsKKyAgICAgIHZpb3BhdGhfb3Blbl9mYWlsZWQ6CisJcmV0dXJuIC0xOworfQorCit2b2lkIGlibXZzY3NpX3JlbGVhc2VfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLAorCQkJCWludCBtYXhfcmVxdWVzdHMpCit7CisJdmlvX2NsZWFySGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfc2NzaSk7CisJdmlvcGF0aF9jbG9zZSh2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX3Njc2ksIG1heF9yZXF1ZXN0cyk7Cit9CisKKy8qKgorICogcmVzZXRfY3JxX3F1ZXVlOiAtIHJlc2V0cyBhIGNycSBhZnRlciBhIGZhaWx1cmUKKyAqIEBxdWV1ZToJY3JxX3F1ZXVlIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyCisgKiBAaG9zdGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0CisgKgorICogbm8tb3AgZm9yIGlTZXJpZXMKKyAqLwordm9pZCBpYm12c2NzaV9yZXNldF9jcnFfcXVldWUoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUsCisJCQkgICAgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKK3sKK30KKworLyoqCisgKiBpYm12c2NzaV9zZW5kX2NycTogLSBTZW5kIGEgQ1JRCisgKiBAaG9zdGRhdGE6CXRoZSBhZGFwdGVyCisgKiBAd29yZDE6CXRoZSBmaXJzdCA2NCBiaXRzIG9mIHRoZSBkYXRhCisgKiBAd29yZDI6CXRoZSBzZWNvbmQgNjQgYml0cyBvZiB0aGUgZGF0YQorICovCitpbnQgaWJtdnNjc2lfc2VuZF9jcnEoc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsIHU2NCB3b3JkMSwgdTY0IHdvcmQyKQoreworCXNpbmdsZV9ob3N0X2RhdGEgPSBob3N0ZGF0YTsKKwlyZXR1cm4gSHZDYWxsRXZlbnRfc2lnbmFsTHBFdmVudEZhc3QodmlvcGF0aF9ob3N0THAsCisJCQkJCSAgICAgSHZMcEV2ZW50X1R5cGVfVmlydHVhbElvLAorCQkJCQkgICAgIHZpb21ham9yc3VidHlwZV9zY3NpLAorCQkJCQkgICAgIEh2THBFdmVudF9BY2tJbmRfTm9BY2ssCisJCQkJCSAgICAgSHZMcEV2ZW50X0Fja1R5cGVfSW1tZWRpYXRlQWNrLAorCQkJCQkgICAgIHZpb3BhdGhfc291cmNlaW5zdCh2aW9wYXRoX2hvc3RMcCksCisJCQkJCSAgICAgdmlvcGF0aF90YXJnZXRpbnN0KHZpb3BhdGhfaG9zdExwKSwKKwkJCQkJICAgICAwLAorCQkJCQkgICAgIFZJT1ZFUlNJT04gPDwgMTYsIHdvcmQxLCB3b3JkMiwgMCwKKwkJCQkJICAgICAwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9ycGFfdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9ycGFfdnNjc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNiOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL3JwYV92c2NzaS5jCkBAIC0wLDAgKzEsMjYwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJwYV92c2NzaS5jCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAxOTk0LCAyMDAzCisgKiBBdXRob3JzOiBDb2xpbiBEZVZpbGJpc3MgKGRldmlsYmlzQHVzLmlibS5jb20pCisgKiAgICAgICAgICBTYW50aWFnbyBMZW9uIChzYW50aWxAdXMuaWJtLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogVVNBCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSUEEtc3BlY2lmaWMgZnVuY3Rpb25zIG9mIHRoZSBTQ1NJIGhvc3QgYWRhcHRlciBmb3IgVmlydHVhbCBJL08gZGV2aWNlcworICoKKyAqIFRoaXMgZHJpdmVyIGFsbG93cyB0aGUgTGludXggU0NTSSBwZXJpcGhlcmFsIGRyaXZlcnMgdG8gZGlyZWN0bHkKKyAqIGFjY2VzcyBkZXZpY2VzIGluIHRoZSBob3N0aW5nIHBhcnRpdGlvbiwgZWl0aGVyIG9uIGFuIGlTZXJpZXMKKyAqIGh5cGVydmlzb3Igc3lzdGVtIG9yIGEgY29udmVyZ2VkIGh5cGVydmlzb3Igc3lzdGVtLgorICovCisKKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAiaWJtdnNjc2kuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSb3V0aW5lcyBmb3IgbWFuYWdpbmcgdGhlIGNvbW1hbmQvcmVzcG9uc2UgcXVldWUKKyAqLworLyoqCisgKiBpYm12c2NzaV9oYW5kbGVfZXZlbnQ6IC0gSW50ZXJydXB0IGhhbmRsZXIgZm9yIGNycSBldmVudHMKKyAqIEBpcnE6CW51bWJlciBvZiBpcnEgdG8gaGFuZGxlLCBub3QgdXNlZAorICogQGRldl9pbnN0YW5jZTogaWJtdnNjc2lfaG9zdF9kYXRhIG9mIGhvc3QgdGhhdCByZWNlaXZlZCBpbnRlcnJ1cHQKKyAqIEByZWdzOglwdF9yZWdzIHdpdGggcmVnaXN0ZXJzCisgKgorICogRGlzYWJsZXMgaW50ZXJydXB0cyBhbmQgc2NoZWR1bGVzIHNycF90YXNrCisgKiBBbHdheXMgcmV0dXJucyBJUlFfSEFORExFRAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaWJtdnNjc2lfaGFuZGxlX2V2ZW50KGludCBpcnEsCisJCQkJCSB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9CisJICAgIChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopZGV2X2luc3RhbmNlOworCXZpb19kaXNhYmxlX2ludGVycnVwdHModG9fdmlvX2Rldihob3N0ZGF0YS0+ZGV2KSk7CisJdGFza2xldF9zY2hlZHVsZSgmaG9zdGRhdGEtPnNycF90YXNrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogcmVsZWFzZV9jcnFfcXVldWU6IC0gRGVhbGxvY2F0ZXMgZGF0YSBhbmQgdW5yZWdpc3RlcnMgQ1JRCisgKiBAcXVldWU6CWNycV9xdWV1ZSB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlcgorICogQGhvc3RfZGF0YToJaWJtdnNjc2lfaG9zdF9kYXRhIG9mIGhvc3QKKyAqCisgKiBGcmVlcyBpcnEsIGRlYWxsb2NhdGVzIGEgcGFnZSBmb3IgbWVzc2FnZXMsIHVubWFwcyBkbWEsIGFuZCB1bnJlZ2lzdGVycworICogdGhlIGNycSB3aXRoIHRoZSBoeXBlcnZpc29yLgorICovCit2b2lkIGlibXZzY3NpX3JlbGVhc2VfY3JxX3F1ZXVlKHN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlLAorCQkJCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLAorCQkJCWludCBtYXhfcmVxdWVzdHMpCit7CisJbG9uZyByYzsKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldik7CisJZnJlZV9pcnEodmRldi0+aXJxLCAodm9pZCAqKWhvc3RkYXRhKTsKKwl0YXNrbGV0X2tpbGwoJmhvc3RkYXRhLT5zcnBfdGFzayk7CisJZG8geworCQlyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX0ZSRUVfQ1JRLCB2ZGV2LT51bml0X2FkZHJlc3MpOworCX0gd2hpbGUgKChyYyA9PSBIX0J1c3kpIHx8IChIX2lzTG9uZ0J1c3kocmMpKSk7CisJZG1hX3VubWFwX3NpbmdsZShob3N0ZGF0YS0+ZGV2LAorCQkJIHF1ZXVlLT5tc2dfdG9rZW4sCisJCQkgcXVldWUtPnNpemUgKiBzaXplb2YoKnF1ZXVlLT5tc2dzKSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylxdWV1ZS0+bXNncyk7Cit9CisKKy8qKgorICogY3JxX3F1ZXVlX25leHRfY3JxOiAtIFJldHVybnMgdGhlIG5leHQgZW50cnkgaW4gbWVzc2FnZSBxdWV1ZQorICogQHF1ZXVlOgljcnFfcXVldWUgdG8gdXNlCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIG5leHQgZW50cnkgaW4gcXVldWUsIG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG5ldyAKKyAqIGVudHJpZWQgaW4gdGhlIENSUS4KKyAqLworc3RhdGljIHN0cnVjdCB2aW9zcnBfY3JxICpjcnFfcXVldWVfbmV4dF9jcnEoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHZpb3NycF9jcnEgKmNycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBmbGFncyk7CisJY3JxID0gJnF1ZXVlLT5tc2dzW3F1ZXVlLT5jdXJdOworCWlmIChjcnEtPnZhbGlkICYgMHg4MCkgeworCQlpZiAoKytxdWV1ZS0+Y3VyID09IHF1ZXVlLT5zaXplKQorCQkJcXVldWUtPmN1ciA9IDA7CisJfSBlbHNlCisJCWNycSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBjcnE7Cit9CisKKy8qKgorICogaWJtdnNjc2lfc2VuZF9jcnE6IC0gU2VuZCBhIENSUQorICogQGhvc3RkYXRhOgl0aGUgYWRhcHRlcgorICogQHdvcmQxOgl0aGUgZmlyc3QgNjQgYml0cyBvZiB0aGUgZGF0YQorICogQHdvcmQyOgl0aGUgc2Vjb25kIDY0IGJpdHMgb2YgdGhlIGRhdGEKKyAqLworaW50IGlibXZzY3NpX3NlbmRfY3JxKHN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhLCB1NjQgd29yZDEsIHU2NCB3b3JkMikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldik7CisKKwlyZXR1cm4gcGxwYXJfaGNhbGxfbm9yZXRzKEhfU0VORF9DUlEsIHZkZXYtPnVuaXRfYWRkcmVzcywgd29yZDEsIHdvcmQyKTsKK30KKworLyoqCisgKiBpYm12c2NzaV90YXNrOiAtIFByb2Nlc3Mgc3JwcyBhc3luY2hyb25vdXNseQorICogQGRhdGE6CWlibXZzY3NpX2hvc3RfZGF0YSBvZiBob3N0CisgKi8KK3N0YXRpYyB2b2lkIGlibXZzY3NpX3Rhc2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICopZGF0YTsKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoaG9zdGRhdGEtPmRldik7CisJc3RydWN0IHZpb3NycF9jcnEgKmNycTsKKwlpbnQgZG9uZSA9IDA7CisKKwl3aGlsZSAoIWRvbmUpIHsKKwkJLyogUHVsbCBhbGwgdGhlIHZhbGlkIG1lc3NhZ2VzIG9mZiB0aGUgQ1JRICovCisJCXdoaWxlICgoY3JxID0gY3JxX3F1ZXVlX25leHRfY3JxKCZob3N0ZGF0YS0+cXVldWUpKSAhPSBOVUxMKSB7CisJCQlpYm12c2NzaV9oYW5kbGVfY3JxKGNycSwgaG9zdGRhdGEpOworCQkJY3JxLT52YWxpZCA9IDB4MDA7CisJCX0KKworCQl2aW9fZW5hYmxlX2ludGVycnVwdHModmRldik7CisJCWlmICgoY3JxID0gY3JxX3F1ZXVlX25leHRfY3JxKCZob3N0ZGF0YS0+cXVldWUpKSAhPSBOVUxMKSB7CisJCQl2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKHZkZXYpOworCQkJaWJtdnNjc2lfaGFuZGxlX2NycShjcnEsIGhvc3RkYXRhKTsKKwkJCWNycS0+dmFsaWQgPSAweDAwOworCQl9IGVsc2UgeworCQkJZG9uZSA9IDE7CisJCX0KKwl9Cit9CisKKy8qKgorICogaW5pdGlhbGl6ZV9jcnFfcXVldWU6IC0gSW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVycyBDUlEgd2l0aCBoeXBlcnZpc29yCisgKiBAcXVldWU6CWNycV9xdWV1ZSB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlcgorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICoKKyAqIEFsbG9jYXRlcyBhIHBhZ2UgZm9yIG1lc3NhZ2VzLCBtYXBzIGl0IGZvciBkbWEsIGFuZCByZWdpc3RlcnMKKyAqIHRoZSBjcnEgd2l0aCB0aGUgaHlwZXJ2aXNvci4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLgorICovCitpbnQgaWJtdnNjc2lfaW5pdF9jcnFfcXVldWUoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUsCisJCQkgICAgc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEsCisJCQkgICAgaW50IG1heF9yZXF1ZXN0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpOworCisJcXVldWUtPm1zZ3MgPSAoc3RydWN0IHZpb3NycF9jcnEgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXF1ZXVlLT5tc2dzKQorCQlnb3RvIG1hbGxvY19mYWlsZWQ7CisJcXVldWUtPnNpemUgPSBQQUdFX1NJWkUgLyBzaXplb2YoKnF1ZXVlLT5tc2dzKTsKKworCXF1ZXVlLT5tc2dfdG9rZW4gPSBkbWFfbWFwX3NpbmdsZShob3N0ZGF0YS0+ZGV2LCBxdWV1ZS0+bXNncywKKwkJCQkJICBxdWV1ZS0+c2l6ZSAqIHNpemVvZigqcXVldWUtPm1zZ3MpLAorCQkJCQkgIERNQV9CSURJUkVDVElPTkFMKTsKKworCWlmIChkbWFfbWFwcGluZ19lcnJvcihxdWV1ZS0+bXNnX3Rva2VuKSkKKwkJZ290byBtYXBfZmFpbGVkOworCisJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9SRUdfQ1JRLAorCQkJCXZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQlxdWV1ZS0+bXNnX3Rva2VuLCBQQUdFX1NJWkUpOworCWlmIChyYyA9PSAyKSB7CisJCS8qIEFkYXB0ZXIgaXMgZ29vZCwgYnV0IG90aGVyIGVuZCBpcyBub3QgcmVhZHkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWJtdnNjc2k6IFBhcnRuZXIgYWRhcHRlciBub3QgcmVhZHlcbiIpOworCX0gZWxzZSBpZiAocmMgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpYm12c2NzaTogRXJyb3IgJWQgb3BlbmluZyBhZGFwdGVyXG4iLCByYyk7CisJCWdvdG8gcmVnX2NycV9mYWlsZWQ7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHZkZXYtPmlycSwKKwkJCWlibXZzY3NpX2hhbmRsZV9ldmVudCwKKwkJCTAsICJpYm12c2NzaSIsICh2b2lkICopaG9zdGRhdGEpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpYm12c2NzaTogY291bGRuJ3QgcmVnaXN0ZXIgaXJxIDB4JXhcbiIsCisJCSAgICAgICB2ZGV2LT5pcnEpOworCQlnb3RvIHJlcV9pcnFfZmFpbGVkOworCX0KKworCXJjID0gdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHZkZXYpOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWJtdnNjc2k6ICBFcnJvciAlZCBlbmFibGluZyBpbnRlcnJ1cHRzISEhXG4iLAorCQkgICAgICAgcmMpOworCQlnb3RvIHJlcV9pcnFfZmFpbGVkOworCX0KKworCXF1ZXVlLT5jdXIgPSAwOworCXNwaW5fbG9ja19pbml0KCZxdWV1ZS0+bG9jayk7CisKKwl0YXNrbGV0X2luaXQoJmhvc3RkYXRhLT5zcnBfdGFzaywgKHZvaWQgKilpYm12c2NzaV90YXNrLAorCQkgICAgICh1bnNpZ25lZCBsb25nKWhvc3RkYXRhKTsKKworCXJldHVybiAwOworCisgICAgICByZXFfaXJxX2ZhaWxlZDoKKwlkbyB7CisJCXJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9DUlEsIHZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAoKHJjID09IEhfQnVzeSkgfHwgKEhfaXNMb25nQnVzeShyYykpKTsKKyAgICAgIHJlZ19jcnFfZmFpbGVkOgorCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwKKwkJCSBxdWV1ZS0+bXNnX3Rva2VuLAorCQkJIHF1ZXVlLT5zaXplICogc2l6ZW9mKCpxdWV1ZS0+bXNncyksIERNQV9CSURJUkVDVElPTkFMKTsKKyAgICAgIG1hcF9mYWlsZWQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXF1ZXVlLT5tc2dzKTsKKyAgICAgIG1hbGxvY19mYWlsZWQ6CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIHJlc2V0X2NycV9xdWV1ZTogLSByZXNldHMgYSBjcnEgYWZ0ZXIgYSBmYWlsdXJlCisgKiBAcXVldWU6CWNycV9xdWV1ZSB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlcgorICogQGhvc3RkYXRhOglpYm12c2NzaV9ob3N0X2RhdGEgb2YgaG9zdAorICoKKyAqLwordm9pZCBpYm12c2NzaV9yZXNldF9jcnFfcXVldWUoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUsCisJCQkgICAgICBzdHJ1Y3QgaWJtdnNjc2lfaG9zdF9kYXRhICpob3N0ZGF0YSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGhvc3RkYXRhLT5kZXYpOworCisJLyogQ2xvc2UgdGhlIENSUSAqLworCWRvIHsKKwkJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9GUkVFX0NSUSwgdmRldi0+dW5pdF9hZGRyZXNzKTsKKwl9IHdoaWxlICgocmMgPT0gSF9CdXN5KSB8fCAoSF9pc0xvbmdCdXN5KHJjKSkpOworCisJLyogQ2xlYW4gb3V0IHRoZSBxdWV1ZSAqLworCW1lbXNldChxdWV1ZS0+bXNncywgMHgwMCwgUEFHRV9TSVpFKTsKKwlxdWV1ZS0+Y3VyID0gMDsKKworCS8qIEFuZCByZS1vcGVuIGl0IGFnYWluICovCisJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9SRUdfQ1JRLAorCQkJCXZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQlxdWV1ZS0+bXNnX3Rva2VuLCBQQUdFX1NJWkUpOworCWlmIChyYyA9PSAyKSB7CisJCS8qIEFkYXB0ZXIgaXMgZ29vZCwgYnV0IG90aGVyIGVuZCBpcyBub3QgcmVhZHkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWJtdnNjc2k6IFBhcnRuZXIgYWRhcHRlciBub3QgcmVhZHlcbiIpOworCX0gZWxzZSBpZiAocmMgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiaWJtdnNjc2k6IGNvdWxkbid0IHJlZ2lzdGVyIGNycS0tcmMgMHgleFxuIiwgcmMpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9zcnAuaCBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9zcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTUyYzFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL3NycC5oCkBAIC0wLDAgKzEsMjI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzcnAuaCAtLSBTQ1NJIFJETUEgUHJvdG9jb2wgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXcml0dGVuIEJ5OiBDb2xpbiBEZXZpbGJpcywgSUJNIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICovCisvKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAgICovCisvKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICovCisvKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICovCisvKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgICovCisvKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgICovCisvKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgICovCisvKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZpbGUgY29udGFpbnMgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSBTQ1NJIFJETUEgUHJvdG9jb2wgICovCisvKiAoU1JQKSBhcyBkZWZpbmVkIGluIHRoZSBUMTAgc3RhbmRhcmQgYXZhaWxhYmxlIGF0IHd3dy50MTAub3JnLiAgVGhpcyAgICAgICovCisvKiBmaWxlIHdhcyBiYXNlZCBvbiB0aGUgMTZhIHZlcnNpb24gb2YgdGhlIHN0YW5kYXJkICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFNSUF9ICisjZGVmaW5lIFNSUF9ICisKKyNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisKK2VudW0gc3JwX3R5cGVzIHsKKwlTUlBfTE9HSU5fUkVRX1RZUEUgPSAweDAwLAorCVNSUF9MT0dJTl9SU1BfVFlQRSA9IDB4QzAsCisJU1JQX0xPR0lOX1JFSl9UWVBFID0gMHg4MCwKKwlTUlBfSV9MT0dPVVRfVFlQRSA9IDB4MDMsCisJU1JQX1RfTE9HT1VUX1RZUEUgPSAweDgwLAorCVNSUF9UU0tfTUdNVF9UWVBFID0gMHgwMSwKKwlTUlBfQ01EX1RZUEUgPSAweDAyLAorCVNSUF9SU1BfVFlQRSA9IDB4QzEsCisJU1JQX0NSRURfUkVRX1RZUEUgPSAweDgxLAorCVNSUF9DUkVEX1JTUF9UWVBFID0gMHg0MSwKKwlTUlBfQUVSX1JFUV9UWVBFID0gMHg4MiwKKwlTUlBfQUVSX1JTUF9UWVBFID0gMHg0MgorfTsKKworZW51bSBzcnBfZGVzY3JpcHRvcl9mb3JtYXRzIHsKKwlTUlBfTk9fQlVGRkVSID0gMHgwMCwKKwlTUlBfRElSRUNUX0JVRkZFUiA9IDB4MDEsCisJU1JQX0lORElSRUNUX0JVRkZFUiA9IDB4MDIKK307CisKK3N0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciB7CisJdTY0IHZpcnR1YWxfYWRkcmVzczsKKwl1MzIgbWVtb3J5X2hhbmRsZTsKKwl1MzIgbGVuZ3RoOworfTsKKworc3RydWN0IGluZGlyZWN0X2Rlc2NyaXB0b3IgeworCXN0cnVjdCBtZW1vcnlfZGVzY3JpcHRvciBoZWFkOworCXUzMiB0b3RhbF9sZW5ndGg7CisJc3RydWN0IG1lbW9yeV9kZXNjcmlwdG9yIGxpc3RbMV0gUEFDS0VEOworfTsKKworc3RydWN0IHNycF9nZW5lcmljIHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVs3XTsKKwl1NjQgdGFnOworfTsKKworc3RydWN0IHNycF9sb2dpbl9yZXEgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzddOworCXU2NCB0YWc7CisJdTMyIG1heF9yZXF1ZXN0ZWRfaW5pdGlhdG9yX3RvX3RhcmdldF9pdWxlbjsKKwl1MzIgcmVzZXJ2ZWQyOworCXUxNiByZXF1aXJlZF9idWZmZXJfZm9ybWF0czsKKwl1OCByZXNlcnZlZDM6NjsKKwl1OCBtdWx0aV9jaGFubmVsX2FjdGlvbjoyOworCXU4IHJlc2VydmVkNDsKKwl1MzIgcmVzZXJ2ZWQ1OworCXU4IGluaXRpYXRvcl9wb3J0X2lkZW50aWZpZXJbMTZdOworCXU4IHRhcmdldF9wb3J0X2lkZW50aWZpZXJbMTZdOworfTsKKworc3RydWN0IHNycF9sb2dpbl9yc3AgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByZXF1ZXN0X2xpbWl0X2RlbHRhOworCXU2NCB0YWc7CisJdTMyIG1heF9pbml0aWF0b3JfdG9fdGFyZ2V0X2l1bGVuOworCXUzMiBtYXhfdGFyZ2V0X3RvX2luaXRpYXRvcl9pdWxlbjsKKwl1MTYgc3VwcG9ydGVkX2J1ZmZlcl9mb3JtYXRzOworCXU4IHJlc2VydmVkMjo2OworCXU4IG11bHRpX2NoYW5uZWxfcmVzdWx0OjI7CisJdTggcmVzZXJ2ZWQzOworCXU4IHJlc2VydmVkNFsyNF07Cit9OworCitzdHJ1Y3Qgc3JwX2xvZ2luX3JlaiB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbM107CisJdTMyIHJlYXNvbjsKKwl1NjQgdGFnOworCXU2NCByZXNlcnZlZDI7CisJdTE2IHN1cHBvcnRlZF9idWZmZXJfZm9ybWF0czsKKwl1OCByZXNlcnZlZDNbNl07Cit9OworCitzdHJ1Y3Qgc3JwX2lfbG9nb3V0IHsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkMVs3XTsKKwl1NjQgdGFnOworfTsKKworc3RydWN0IHNycF90X2xvZ291dCB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbM107CisJdTMyIHJlYXNvbjsKKwl1NjQgdGFnOworfTsKKworc3RydWN0IHNycF90c2tfbWdtdCB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbN107CisJdTY0IHRhZzsKKwl1MzIgcmVzZXJ2ZWQyOworCXU2NCBsdW4gUEFDS0VEOworCXU4IHJlc2VydmVkMzsKKwl1OCByZXNlcnZlZDQ7CisJdTggdGFza19tZ210X2ZsYWdzOworCXU4IHJlc2VydmVkNTsKKwl1NjQgbWFuYWdlZF90YXNrX3RhZzsKKwl1NjQgcmVzZXJ2ZWQ2OworfTsKKworc3RydWN0IHNycF9jbWQgeworCXU4IHR5cGU7CisJdTMyIHJlc2VydmVkMSBQQUNLRUQ7CisJdTggZGF0YV9vdXRfZm9ybWF0OjQ7CisJdTggZGF0YV9pbl9mb3JtYXQ6NDsKKwl1OCBkYXRhX291dF9jb3VudDsKKwl1OCBkYXRhX2luX2NvdW50OworCXU2NCB0YWc7CisJdTMyIHJlc2VydmVkMjsKKwl1NjQgbHVuIFBBQ0tFRDsKKwl1OCByZXNlcnZlZDM7CisJdTggcmVzZXJ2ZWQ0OjU7CisJdTggdGFza19hdHRyaWJ1dGU6MzsKKwl1OCByZXNlcnZlZDU7CisJdTggYWRkaXRpb25hbF9jZGJfbGVuOworCXU4IGNkYlsxNl07CisJdTggYWRkaXRpb25hbF9kYXRhWzB4MTAwIC0gMHgzMF07Cit9OworCitzdHJ1Y3Qgc3JwX3JzcCB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbM107CisJdTMyIHJlcXVlc3RfbGltaXRfZGVsdGE7CisJdTY0IHRhZzsKKwl1MTYgcmVzZXJ2ZWQyOworCXU4IHJlc2VydmVkMzoyOworCXU4IGRpdW5kZXI6MTsKKwl1OCBkaW92ZXI6MTsKKwl1OCBkb3VuZGVyOjE7CisJdTggZG9vdmVyOjE7CisJdTggc25zdmFsaWQ6MTsKKwl1OCByc3B2YWxpZDoxOworCXU4IHN0YXR1czsKKwl1MzIgZGF0YV9pbl9yZXNpZHVhbF9jb3VudDsKKwl1MzIgZGF0YV9vdXRfcmVzaWR1YWxfY291bnQ7CisJdTMyIHNlbnNlX2RhdGFfbGlzdF9sZW5ndGg7CisJdTMyIHJlc3BvbnNlX2RhdGFfbGlzdF9sZW5ndGg7CisJdTggc2Vuc2VfYW5kX3Jlc3BvbnNlX2RhdGFbMThdOworfTsKKworc3RydWN0IHNycF9jcmVkX3JlcSB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbM107CisJdTMyIHJlcXVlc3RfbGltaXRfZGVsdGE7CisJdTY0IHRhZzsKK307CisKK3N0cnVjdCBzcnBfY3JlZF9yc3AgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzddOworCXU2NCB0YWc7Cit9OworCitzdHJ1Y3Qgc3JwX2Flcl9yZXEgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzNdOworCXUzMiByZXF1ZXN0X2xpbWl0X2RlbHRhOworCXU2NCB0YWc7CisJdTMyIHJlc2VydmVkMjsKKwl1NjQgbHVuOworCXUzMiBzZW5zZV9kYXRhX2xpc3RfbGVuZ3RoOworCXUzMiByZXNlcnZlZDM7CisJdTggc2Vuc2VfZGF0YVsyMF07Cit9OworCitzdHJ1Y3Qgc3JwX2Flcl9yc3AgeworCXU4IHR5cGU7CisJdTggcmVzZXJ2ZWQxWzddOworCXU2NCB0YWc7Cit9OworCit1bmlvbiBzcnBfaXUgeworCXN0cnVjdCBzcnBfZ2VuZXJpYyBnZW5lcmljOworCXN0cnVjdCBzcnBfbG9naW5fcmVxIGxvZ2luX3JlcTsKKwlzdHJ1Y3Qgc3JwX2xvZ2luX3JzcCBsb2dpbl9yc3A7CisJc3RydWN0IHNycF9sb2dpbl9yZWogbG9naW5fcmVqOworCXN0cnVjdCBzcnBfaV9sb2dvdXQgaV9sb2dvdXQ7CisJc3RydWN0IHNycF90X2xvZ291dCB0X2xvZ291dDsKKwlzdHJ1Y3Qgc3JwX3Rza19tZ210IHRza19tZ210OworCXN0cnVjdCBzcnBfY21kIGNtZDsKKwlzdHJ1Y3Qgc3JwX3JzcCByc3A7CisJc3RydWN0IHNycF9jcmVkX3JlcSBjcmVkX3JlcTsKKwlzdHJ1Y3Qgc3JwX2NyZWRfcnNwIGNyZWRfcnNwOworCXN0cnVjdCBzcnBfYWVyX3JlcSBhZXJfcmVxOworCXN0cnVjdCBzcnBfYWVyX3JzcCBhZXJfcnNwOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvdmlvc3JwLmggYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvdmlvc3JwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YmJhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS92aW9zcnAuaApAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3JwLmggLS0gU0NTSSBSRE1BIFByb3RvY29sIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV3JpdHRlbiBCeTogQ29saW4gRGV2aWxiaXMsIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChDKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgICAqLworLyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAqLworLyogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgICAqLworLyogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgICAqLworLyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAqLworLyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAqLworLyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICAqLworLyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAqLworLyogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciBJQk0gUlBBIChSUy82MDAwICAgICAgICAqLworLyogcGxhdGZvcm0gYXJjaGl0ZWN0dXJlKSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU1JQIChTQ1NJIFJETUEgUHJvdG9jb2wpICAgICAqLworLyogc3RhbmRhcmQuICBTUlAgaXMgdXNlZCBvbiBJQk0gaVNlcmllcyBhbmQgcFNlcmllcyBwbGF0Zm9ybXMgdG8gc2VuZCBTQ1NJICAqLworLyogY29tbWFuZHMgYmV0d2VlbiBsb2dpY2FsIHBhcnRpdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU1JQIEluZm9ybWF0aW9uIFVuaXRzIChJVXMpIGFyZSBzZW50IG9uIGEgIkNvbW1hbmQvUmVzcG9uc2UgUXVldWUiIChDUlEpICAqLworLyogYmV0d2VlbiBwYXJ0aXRpb25zLiAgVGhlIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSBhcmUgYXJjaGl0ZWN0ZWQsICAgICAgICAqLworLyogYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHZlcnNpb25zICAqLworLyogb2YgTGludXggYW5kIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIChBSVgsIE9TLzQwMCkgdGhhdCB0YWxrIHRoaXMgcHJvdG9jb2wqLworLyogYmV0d2VlbiBsb2dpY2FsIHBhcnRpdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBWSU9TUlBfSAorI2RlZmluZSBWSU9TUlBfSAorI2luY2x1ZGUgInNycC5oIgorCitlbnVtIHZpb3NycF9jcnFfZm9ybWF0cyB7CisJVklPU1JQX1NSUF9GT1JNQVQgPSAweDAxLAorCVZJT1NSUF9NQURfRk9STUFUID0gMHgwMiwKKwlWSU9TUlBfT1M0MDBfRk9STUFUID0gMHgwMywKKwlWSU9TUlBfQUlYX0ZPUk1BVCA9IDB4MDQsCisJVklPU1JQX0xJTlVYX0ZPUk1BVCA9IDB4MDYsCisJVklPU1JQX0lOTElORV9GT1JNQVQgPSAweDA3Cit9OworCitzdHJ1Y3Qgdmlvc3JwX2NycSB7CisJdTggdmFsaWQ7CQkvKiB1c2VkIGJ5IFJQQSAqLworCXU4IGZvcm1hdDsJCS8qIFNDU0kgdnMgb3V0LW9mLWJhbmQgKi8KKwl1OCByZXNlcnZlZDsKKwl1OCBzdGF0dXM7CQkvKiBub24tc2NzaSBmYWlsdXJlPyAoZS5nLiBETUEgZmFpbHVyZSkgKi8KKwl1MTYgdGltZW91dDsJCS8qIGluIHNlY29uZHMgKi8KKwl1MTYgSVVfbGVuZ3RoOwkJLyogaW4gYnl0ZXMgKi8KKwl1NjQgSVVfZGF0YV9wdHI7CS8qIHRoZSBUQ0UgZm9yIHRyYW5zZmVycmluZyBkYXRhICovCit9OworCisvKiBNQURzIGFyZSBNYW5hZ2VtZW50IHJlcXVlc3RzIGFib3ZlIGFuZCBiZXlvbmQgdGhlIElVcyBkZWZpbmVkIGluIHRoZSBTUlAKKyAqIHN0YW5kYXJkLiAgCisgKi8KK2VudW0gdmlvc3JwX21hZF90eXBlcyB7CisJVklPU1JQX0VNUFRZX0lVX1RZUEUgPSAweDAxLAorCVZJT1NSUF9FUlJPUl9MT0dfVFlQRSA9IDB4MDIsCisJVklPU1JQX0FEQVBURVJfSU5GT19UWVBFID0gMHgwMywKKwlWSU9TUlBfSE9TVF9DT05GSUdfVFlQRSA9IDB4MDQKK307CisKKy8qIAorICogQ29tbW9uIE1BRCBoZWFkZXIKKyAqLworc3RydWN0IG1hZF9jb21tb24geworCXUzMiB0eXBlOworCXUxNiBzdGF0dXM7CisJdTE2IGxlbmd0aDsKKwl1NjQgdGFnOworfTsKKworLyoKKyAqIEFsbCBTUlAgKGFuZCBNQUQpIHJlcXVlc3RzIG5vcm1hbGx5IGZsb3cgZnJvbSB0aGUKKyAqIGNsaWVudCB0byB0aGUgc2VydmVyLiAgVGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKKyAqIGFuIGFzeW5jaHJvbm91cyBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudC4gIFRoZSBFbXB0eSBJVSBpcyB1c2VkCisgKiB0byBoYW5nIG91dCBhIG1lYW5pbmdsZXNzIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBzbyB0aGF0IGl0IGNhbiByZXNwb25kCisgKiBhc3luY2hyb3VvdXNseSB3aXRoIHNvbWV0aGluZyBsaWtlIGEgU0NTSSBBRVIgCisgKi8KK3N0cnVjdCB2aW9zcnBfZW1wdHlfaXUgeworCXN0cnVjdCBtYWRfY29tbW9uIGNvbW1vbjsKKwl1NjQgYnVmZmVyOworCXUzMiBwb3J0OworfTsKKworc3RydWN0IHZpb3NycF9lcnJvcl9sb2cgeworCXN0cnVjdCBtYWRfY29tbW9uIGNvbW1vbjsKKwl1NjQgYnVmZmVyOworfTsKKworc3RydWN0IHZpb3NycF9hZGFwdGVyX2luZm8geworCXN0cnVjdCBtYWRfY29tbW9uIGNvbW1vbjsKKwl1NjQgYnVmZmVyOworfTsKKworc3RydWN0IHZpb3NycF9ob3N0X2NvbmZpZyB7CisJc3RydWN0IG1hZF9jb21tb24gY29tbW9uOworCXU2NCBidWZmZXI7Cit9OworCit1bmlvbiBtYWRfaXUgeworCXN0cnVjdCB2aW9zcnBfZW1wdHlfaXUgZW1wdHlfaXU7CisJc3RydWN0IHZpb3NycF9lcnJvcl9sb2cgZXJyb3JfbG9nOworCXN0cnVjdCB2aW9zcnBfYWRhcHRlcl9pbmZvIGFkYXB0ZXJfaW5mbzsKKwlzdHJ1Y3Qgdmlvc3JwX2hvc3RfY29uZmlnIGhvc3RfY29uZmlnOworfTsKKwordW5pb24gdmlvc3JwX2l1IHsKKwl1bmlvbiBzcnBfaXUgc3JwOworCXVuaW9uIG1hZF9pdSBtYWQ7Cit9OworCitzdHJ1Y3QgbWFkX2FkYXB0ZXJfaW5mb19kYXRhIHsKKwljaGFyIHNycF92ZXJzaW9uWzhdOworCWNoYXIgcGFydGl0aW9uX25hbWVbOTZdOworCXUzMiBwYXJ0aXRpb25fbnVtYmVyOworCXUzMiBtYWRfdmVyc2lvbjsKKwl1MzIgb3NfdHlwZTsKKwl1MzIgcG9ydF9tYXhfdHh1WzhdOwkvKiBwZXItcG9ydCBtYXhpbXVtIHRyYW5zZmVyICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jIGIvZHJpdmVycy9zY3NpL2lkZS1zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyNDg2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCkBAIC0wLDAgKzEsMTE3NCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCVZlcnNpb24gMC45CQlKdWwgICA0LCAxOTk5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IC0gMTk5OSBHYWRpIE94bWFuIDxnYWRpb0BuZXR2aXNpb24ubmV0LmlsPgorICovCisKKy8qCisgKiBFbXVsYXRpb24gb2YgYSBTQ1NJIGhvc3QgYWRhcHRlciBmb3IgSURFIEFUQVBJIGRldmljZXMuCisgKgorICogV2l0aCB0aGlzIGRyaXZlciwgb25lIGNhbiB1c2UgdGhlIExpbnV4IFNDU0kgZHJpdmVycyBpbnN0ZWFkIG9mIHRoZQorICogbmF0aXZlIElERSBBVEFQSSBkcml2ZXJzLgorICoKKyAqIFZlciAwLjEgICBEZWMgIDMgOTYgICBJbml0aWFsIHZlcnNpb24uCisgKiBWZXIgMC4yICAgSmFuIDI2IDk3ICAgRml4ZWQgYnVnIGluIGNsZWFudXBfbW9kdWxlKCkgYW5kIGFkZGVkIGVtdWxhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICBvZiBNT0RFX1NFTlNFXzYvTU9ERV9TRUxFQ1RfNiBmb3IgY2Ryb21zLiBUaGFua3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gSmFub3MgRmFya2FzIGZvciBwb2ludGluZyB0aGlzIG91dC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCB1c2luZyBiaXRmaWVsZHMgaW4gc3RydWN0dXJlcyBmb3IgbTY4ay4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBTY2F0dGVyL0dhdGhlciBhbmQgRE1BIHN1cHBvcnQuCisgKiBWZXIgMC40ICAgRGVjICA3IDk3ICAgQWRkIHN1cHBvcnQgZm9yIEFUQVBJIFBEL0NEIGRyaXZlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBVc2UgdmFyaWFibGUgdGltZW91dCBmb3IgZWFjaCBjb21tYW5kLgorICogVmVyIDAuNSAgIEphbiAgMiA5OCAgIEZpeCBwcmV2aW91cyBQRC9DRCBzdXBwb3J0LgorICogICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGRpc2FibGluZyBvZiBTQ1NJLTYgdG8gU0NTSS0xMCB0cmFuc2Zvcm1hdGlvbi4KKyAqIFZlciAwLjYgICBKYW4gMjcgOTggICBBbGxvdyBkaXNhYmxpbmcgb2YgU0NTSSBjb21tYW5kIHRyYW5zbGF0aW9uIGxheWVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhY2Nlc3MgdGhyb3VnaCAvZGV2L3NnLgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBNT0RFX1NFTlNFXzYvTU9ERV9TRUxFQ1RfNi9JTlFVSVJZIHRyYW5zbGF0aW9uLgorICogVmVyIDAuNyAgIERlYyAwNCA5OCAgIElnbm9yZSBjb21tYW5kcyB3aGVyZSBsdW4gIT0gMCB0byBhdm9pZCBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gb2YgZGV2aWNlcyB3aXRoIENPTkZJR19TQ1NJX01VTFRJX0xVTgorICogVmVyIDAuOCAgIEZlYiAwNSA5OSAgIE9wdGljYWwgbWVkaWEgbmVlZCB0cmFuc2xhdGlvbiB0b28uIFJldmVyc2UgMC43LgorICogVmVyIDAuOSAgIEp1bCAwNCA5OSAgIEZpeCBhIGJ1ZyBpbiBTR19TRVRfVFJBTlNGT1JNLgorICogVmVyIDAuOTEgIEp1biAxMCAwMiAgIEZpeCAib2ZmIGJ5IG9uZSIgZXJyb3IgaW4gdHJhbnNmb3JtcworICogVmVyIDAuOTIgIERlYyAzMSAwMiAgIEltcGxlbWVudCBuZXcgU0NTSSBtaWQgbGV2ZWwgQVBJCisgKi8KKworI2RlZmluZSBJREVTQ1NJX1ZFUlNJT04gIjAuOTIiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3NnLmg+CisKKyNkZWZpbmUgSURFU0NTSV9ERUJVR19MT0cJCTAKKwordHlwZWRlZiBzdHJ1Y3QgaWRlc2NzaV9wY19zIHsKKwl1OCBjWzEyXTsJCQkJLyogQWN0dWFsIHBhY2tldCBieXRlcyAqLworCWludCByZXF1ZXN0X3RyYW5zZmVyOwkJCS8qIEJ5dGVzIHRvIHRyYW5zZmVyICovCisJaW50IGFjdHVhbGx5X3RyYW5zZmVycmVkOwkJLyogQnl0ZXMgYWN0dWFsbHkgdHJhbnNmZXJyZWQgKi8KKwlpbnQgYnVmZmVyX3NpemU7CQkJLyogU2l6ZSBvZiBvdXIgZGF0YSBidWZmZXIgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CQkJLyogVGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCAqLworCXU4ICpidWZmZXI7CQkJCS8qIERhdGEgYnVmZmVyICovCisJdTggKmN1cnJlbnRfcG9zaXRpb247CQkJLyogUG9pbnRlciBpbnRvIHRoZSBhYm92ZSBidWZmZXIgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwkJCS8qIFNjYXR0ZXIgZ2F0aGVyIHRhYmxlICovCisJaW50IGJfY291bnQ7CQkJCS8qIEJ5dGVzIHRyYW5zZmVycmVkIGZyb20gY3VycmVudCBlbnRyeSAqLworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kOwkJLyogU0NTSSBjb21tYW5kICovCisJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKik7CS8qIFNjc2kgY29tcGxldGlvbiByb3V0aW5lICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkvKiBTdGF0dXMvQWN0aW9uIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwkJCS8qIENvbW1hbmQgdGltZW91dCAqLworfSBpZGVzY3NpX3BjX3Q7CisKKy8qCisgKglQYWNrZXQgY29tbWFuZCBzdGF0dXMgYml0cy4KKyAqLworI2RlZmluZSBQQ19ETUFfSU5fUFJPR1JFU1MJCTAJLyogMSB3aGlsZSBETUEgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgUENfV1JJVElORwkJCTEJLyogRGF0YSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgUENfVFJBTlNGT1JNCQkJMgkvKiB0cmFuc2Zvcm0gU0NTSSBjb21tYW5kcyAqLworI2RlZmluZSBQQ19USU1FRE9VVAkJCTMJLyogY29tbWFuZCB0aW1lZCBvdXQgKi8KKyNkZWZpbmUgUENfRE1BX09LCQkJNAkvKiBVc2UgRE1BICovCisKKy8qCisgKglTQ1NJIGNvbW1hbmQgdHJhbnNmb3JtYXRpb24gbGF5ZXIKKyAqLworI2RlZmluZSBJREVTQ1NJX1RSQU5TRk9STQkJMAkvKiBFbmFibGUvRGlzYWJsZSB0cmFuc2Zvcm1hdGlvbiAqLworI2RlZmluZSBJREVTQ1NJX1NHX1RSQU5TRk9STQkJMQkvKiAvZGV2L3NnIHRyYW5zZm9ybWF0aW9uICovCisKKy8qCisgKglMb2cgZmxhZ3MKKyAqLworI2RlZmluZSBJREVTQ1NJX0xPR19DTUQJCQkwCS8qIExvZyBTQ1NJIGNvbW1hbmRzICovCisKK3R5cGVkZWYgc3RydWN0IGlkZV9zY3NpX29iaiB7CisJaWRlX2RyaXZlX3QJCSpkcml2ZTsKKwlpZGVfZHJpdmVyX3QJCSpkcml2ZXI7CisJc3RydWN0IGdlbmRpc2sJCSpkaXNrOworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7CisKKwlpZGVzY3NpX3BjX3QgKnBjOwkJCS8qIEN1cnJlbnQgcGFja2V0IGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCS8qIFN0YXR1cy9BY3Rpb24gZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIHRyYW5zZm9ybTsJCS8qIFNDU0kgY21kIHRyYW5zbGF0aW9uIGxheWVyICovCisJdW5zaWduZWQgbG9uZyBsb2c7CQkJLyogbG9nIGZsYWdzICovCit9IGlkZXNjc2lfc2NzaV90OworCitzdGF0aWMgREVDTEFSRV9NVVRFWChpZGVzY3NpX3JlZl9zZW0pOworCisjZGVmaW5lIGlkZV9zY3NpX2coZGlzaykgXAorCWNvbnRhaW5lcl9vZigoZGlzayktPnByaXZhdGVfZGF0YSwgc3RydWN0IGlkZV9zY3NpX29iaiwgZHJpdmVyKQorCitzdGF0aWMgc3RydWN0IGlkZV9zY3NpX29iaiAqaWRlX3Njc2lfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBpZGVfc2NzaV9vYmogKnNjc2kgPSBOVUxMOworCisJZG93bigmaWRlc2NzaV9yZWZfc2VtKTsKKwlzY3NpID0gaWRlX3Njc2lfZyhkaXNrKTsKKwlpZiAoc2NzaSkKKwkJc2NzaV9ob3N0X2dldChzY3NpLT5ob3N0KTsKKwl1cCgmaWRlc2NzaV9yZWZfc2VtKTsKKwlyZXR1cm4gc2NzaTsKK30KKworc3RhdGljIHZvaWQgaWRlX3Njc2lfcHV0KHN0cnVjdCBpZGVfc2NzaV9vYmogKnNjc2kpCit7CisJZG93bigmaWRlc2NzaV9yZWZfc2VtKTsKKwlzY3NpX2hvc3RfcHV0KHNjc2ktPmhvc3QpOworCXVwKCZpZGVzY3NpX3JlZl9zZW0pOworfQorCitzdGF0aWMgaW5saW5lIGlkZXNjc2lfc2NzaV90ICpzY3NpaG9zdF90b19pZGVzY3NpKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuIChpZGVzY3NpX3Njc2lfdCopICgmaG9zdFsxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaWRlc2NzaV9zY3NpX3QgKmRyaXZlX3RvX2lkZXNjc2koaWRlX2RyaXZlX3QgKmlkZV9kcml2ZSkKK3sKKwlyZXR1cm4gc2NzaWhvc3RfdG9faWRlc2NzaShpZGVfZHJpdmUtPmRyaXZlcl9kYXRhKTsKK30KKworLyoKKyAqCVBlciBBVEFQSSBkZXZpY2Ugc3RhdHVzIGJpdHMuCisgKi8KKyNkZWZpbmUgSURFU0NTSV9EUlFfSU5URVJSVVBUCQkwCS8qIERSUSBpbnRlcnJ1cHQgZGV2aWNlICovCisKKy8qCisgKglpZGUtc2NzaSByZXF1ZXN0cy4KKyAqLworI2RlZmluZSBJREVTQ1NJX1BDX1JRCQkJOTAKKworc3RhdGljIHZvaWQgaWRlc2NzaV9kaXNjYXJkX2RhdGEgKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgaW50IGJjb3VudCkKK3sKKwl3aGlsZSAoYmNvdW50LS0pCisJCSh2b2lkKSBIV0lGKGRyaXZlKS0+SU5CKElERV9EQVRBX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGlkZXNjc2lfb3V0cHV0X3plcm9zIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBiY291bnQpCit7CisJd2hpbGUgKGJjb3VudC0tKQorCQlIV0lGKGRyaXZlKS0+T1VUQigwLCBJREVfREFUQV9SRUcpOworfQorCisvKgorICoJUElPIGRhdGEgdHJhbnNmZXIgcm91dGluZXMgdXNpbmcgdGhlIHNjYXR0ZXIgZ2F0aGVyIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBpZGVzY3NpX2lucHV0X2J1ZmZlcnMgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlc2NzaV9wY190ICpwYywgdW5zaWduZWQgaW50IGJjb3VudCkKK3sKKwlpbnQgY291bnQ7CisJY2hhciAqYnVmOworCisJd2hpbGUgKGJjb3VudCkgeworCQlpZiAocGMtPnNnIC0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBwYy0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyID4gcGMtPnNjc2lfY21kLT51c2Vfc2cpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgImlkZS1zY3NpOiBzY2F0dGVyIGdhdGhlciB0YWJsZSB0b28gc21hbGwsIGRpc2NhcmRpbmcgZGF0YVxuIik7CisJCQlpZGVzY3NpX2Rpc2NhcmRfZGF0YSAoZHJpdmUsIGJjb3VudCk7CisJCQlyZXR1cm47CisJCX0KKwkJY291bnQgPSBtaW4ocGMtPnNnLT5sZW5ndGggLSBwYy0+Yl9jb3VudCwgYmNvdW50KTsKKwkJYnVmID0gcGFnZV9hZGRyZXNzKHBjLT5zZy0+cGFnZSkgKyBwYy0+c2ctPm9mZnNldDsKKwkJZHJpdmUtPmh3aWYtPmF0YXBpX2lucHV0X2J5dGVzKGRyaXZlLCBidWYgKyBwYy0+Yl9jb3VudCwgY291bnQpOworCQliY291bnQgLT0gY291bnQ7IHBjLT5iX2NvdW50ICs9IGNvdW50OworCQlpZiAocGMtPmJfY291bnQgPT0gcGMtPnNnLT5sZW5ndGgpIHsKKwkJCXBjLT5zZysrOworCQkJcGMtPmJfY291bnQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpZGVzY3NpX291dHB1dF9idWZmZXJzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfcGNfdCAqcGMsIHVuc2lnbmVkIGludCBiY291bnQpCit7CisJaW50IGNvdW50OworCWNoYXIgKmJ1ZjsKKworCXdoaWxlIChiY291bnQpIHsKKwkJaWYgKHBjLT5zZyAtIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgcGMtPnNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlciA+IHBjLT5zY3NpX2NtZC0+dXNlX3NnKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJpZGUtc2NzaTogc2NhdHRlciBnYXRoZXIgdGFibGUgdG9vIHNtYWxsLCBwYWRkaW5nIHdpdGggemVyb3NcbiIpOworCQkJaWRlc2NzaV9vdXRwdXRfemVyb3MgKGRyaXZlLCBiY291bnQpOworCQkJcmV0dXJuOworCQl9CisJCWNvdW50ID0gbWluKHBjLT5zZy0+bGVuZ3RoIC0gcGMtPmJfY291bnQsIGJjb3VudCk7CisJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYy0+c2ctPnBhZ2UpICsgcGMtPnNnLT5vZmZzZXQ7CisJCWRyaXZlLT5od2lmLT5hdGFwaV9vdXRwdXRfYnl0ZXMoZHJpdmUsIGJ1ZiArIHBjLT5iX2NvdW50LCBjb3VudCk7CisJCWJjb3VudCAtPSBjb3VudDsgcGMtPmJfY291bnQgKz0gY291bnQ7CisJCWlmIChwYy0+Yl9jb3VudCA9PSBwYy0+c2ctPmxlbmd0aCkgeworCQkJcGMtPnNnKys7CisJCQlwYy0+Yl9jb3VudCA9IDA7CisJCX0KKwl9Cit9CisKKy8qCisgKglNb3N0IG9mIHRoZSBTQ1NJIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQgZGlyZWN0bHkgYnkgQVRBUEkgZGV2aWNlcy4KKyAqCWlkZXNjc2lfdHJhbnNmb3JtX3BjIGhhbmRsZXMgdGhlIGZldyBleGNlcHRpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlc2NzaV90cmFuc2Zvcm1fcGMxIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfcGNfdCAqcGMpCit7CisJdTggKmMgPSBwYy0+YywgKnNjc2lfYnVmID0gcGMtPmJ1ZmZlciwgKnNjID0gcGMtPnNjc2lfY21kLT5jbW5kOworCWNoYXIgKmF0YXBpX2J1ZjsKKworCWlmICghdGVzdF9iaXQoUENfVFJBTlNGT1JNLCAmcGMtPmZsYWdzKSkKKwkJcmV0dXJuOworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Nkcm9tIHx8IGRyaXZlLT5tZWRpYSA9PSBpZGVfb3B0aWNhbCkgeworCQlpZiAoY1swXSA9PSBSRUFEXzYgfHwgY1swXSA9PSBXUklURV82KSB7CisJCQljWzhdID0gY1s0XTsJCWNbNV0gPSBjWzNdOwkJY1s0XSA9IGNbMl07CisJCQljWzNdID0gY1sxXSAmIDB4MWY7CWNbMl0gPSAwOwkJY1sxXSAmPSAweGUwOworCQkJY1swXSArPSAoUkVBRF8xMCAtIFJFQURfNik7CisJCX0KKwkJaWYgKGNbMF0gPT0gTU9ERV9TRU5TRSB8fCBjWzBdID09IE1PREVfU0VMRUNUKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBuZXdfbGVuOworCQkJaWYgKCFzY3NpX2J1ZikKKwkJCQlyZXR1cm47CisJCQlpZiAoKGF0YXBpX2J1ZiA9IGttYWxsb2MocGMtPmJ1ZmZlcl9zaXplICsgNCwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCQkJcmV0dXJuOworCQkJbWVtc2V0KGF0YXBpX2J1ZiwgMCwgcGMtPmJ1ZmZlcl9zaXplICsgNCk7CisJCQltZW1zZXQgKGMsIDAsIDEyKTsKKwkJCWNbMF0gPSBzY1swXSB8IDB4NDA7CisJCQljWzFdID0gc2NbMV07CisJCQljWzJdID0gc2NbMl07CisJCQluZXdfbGVuID0gc2NbNF0gKyA0OworCQkJY1s4XSA9IG5ld19sZW47CisJCQljWzddID0gbmV3X2xlbiA+PiA4OworCQkJY1s5XSA9IHNjWzVdOworCQkJaWYgKGNbMF0gPT0gTU9ERV9TRUxFQ1RfMTApIHsKKwkJCQlhdGFwaV9idWZbMV0gPSBzY3NpX2J1ZlswXTsJLyogTW9kZSBkYXRhIGxlbmd0aCAqLworCQkJCWF0YXBpX2J1ZlsyXSA9IHNjc2lfYnVmWzFdOwkvKiBNZWRpdW0gdHlwZSAqLworCQkJCWF0YXBpX2J1ZlszXSA9IHNjc2lfYnVmWzJdOwkvKiBEZXZpY2Ugc3BlY2lmaWMgcGFyYW1ldGVyICovCisJCQkJYXRhcGlfYnVmWzddID0gc2NzaV9idWZbM107CS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoICovCisJCQkJbWVtY3B5KGF0YXBpX2J1ZiArIDgsIHNjc2lfYnVmICsgNCwgcGMtPmJ1ZmZlcl9zaXplIC0gNCk7CisJCQl9CisJCQlwYy0+YnVmZmVyID0gYXRhcGlfYnVmOworCQkJcGMtPnJlcXVlc3RfdHJhbnNmZXIgKz0gNDsKKwkJCXBjLT5idWZmZXJfc2l6ZSArPSA0OworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlc2NzaV90cmFuc2Zvcm1fcGMyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfcGNfdCAqcGMpCit7CisJdTggKmF0YXBpX2J1ZiA9IHBjLT5idWZmZXI7CisJdTggKnNjID0gcGMtPnNjc2lfY21kLT5jbW5kOworCXU4ICpzY3NpX2J1ZiA9IHBjLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXI7CisKKwlpZiAoIXRlc3RfYml0KFBDX1RSQU5TRk9STSwgJnBjLT5mbGFncykpCisJCXJldHVybjsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSB8fCBkcml2ZS0+bWVkaWEgPT0gaWRlX29wdGljYWwpIHsKKwkJaWYgKHBjLT5jWzBdID09IE1PREVfU0VOU0VfMTAgJiYgc2NbMF0gPT0gTU9ERV9TRU5TRSkgeworCQkJc2NzaV9idWZbMF0gPSBhdGFwaV9idWZbMV07CQkvKiBNb2RlIGRhdGEgbGVuZ3RoICovCisJCQlzY3NpX2J1ZlsxXSA9IGF0YXBpX2J1ZlsyXTsJCS8qIE1lZGl1bSB0eXBlICovCisJCQlzY3NpX2J1ZlsyXSA9IGF0YXBpX2J1ZlszXTsJCS8qIERldmljZSBzcGVjaWZpYyBwYXJhbWV0ZXIgKi8KKwkJCXNjc2lfYnVmWzNdID0gYXRhcGlfYnVmWzddOwkJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKi8KKwkJCW1lbWNweShzY3NpX2J1ZiArIDQsIGF0YXBpX2J1ZiArIDgsIHBjLT5yZXF1ZXN0X3RyYW5zZmVyIC0gOCk7CisJCX0KKwkJaWYgKHBjLT5jWzBdID09IElOUVVJUlkpIHsKKwkJCXNjc2lfYnVmWzJdIHw9IDI7CQkJLyogYW5zaV9yZXZpc2lvbiAqLworCQkJc2NzaV9idWZbM10gPSAoc2NzaV9idWZbM10gJiAweGYwKSB8IDI7CS8qIHJlc3BvbnNlIGRhdGEgZm9ybWF0ICovCisJCX0KKwl9CisJaWYgKGF0YXBpX2J1ZiAmJiBhdGFwaV9idWYgIT0gc2NzaV9idWYpCisJCWtmcmVlKGF0YXBpX2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGhleGR1bXAodTggKngsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlwcmludGsoIlsgIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGsoIiV4ICIsIHhbaV0pOworCXByaW50aygiXVxuIik7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9jaGVja19jb25kaXRpb24oaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqZmFpbGVkX2NvbW1hbmQpCit7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKwlpZGVzY3NpX3BjX3QgICAqcGM7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCXU4ICAgICAgICAgICAgICpidWY7CisKKwkvKiBzdHVmZiBhIHNlbnNlIHJlcXVlc3QgaW4gZnJvbnQgb2Ygb3VyIGN1cnJlbnQgcmVxdWVzdCAqLworCXBjID0ga21hbGxvYyAoc2l6ZW9mIChpZGVzY3NpX3BjX3QpLCBHRlBfQVRPTUlDKTsKKwlycSA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlcXVlc3QpLCBHRlBfQVRPTUlDKTsKKwlidWYgPSBrbWFsbG9jKFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKHBjID09IE5VTEwgfHwgcnEgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlpZiAocGMpIGtmcmVlKHBjKTsKKwkJaWYgKHJxKSBrZnJlZShycSk7CisJCWlmIChidWYpIGtmcmVlKGJ1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQgKHBjLCAwLCBzaXplb2YgKGlkZXNjc2lfcGNfdCkpOworCW1lbXNldCAoYnVmLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCWlkZV9pbml0X2RyaXZlX2NtZChycSk7CisJcnEtPnNwZWNpYWwgPSAoY2hhciAqKSBwYzsKKwlwYy0+cnEgPSBycTsKKwlwYy0+YnVmZmVyID0gYnVmOworCXBjLT5jWzBdID0gUkVRVUVTVF9TRU5TRTsKKwlwYy0+Y1s0XSA9IHBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gcGMtPmJ1ZmZlcl9zaXplID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCXJxLT5mbGFncyA9IFJFUV9TRU5TRTsKKwlwYy0+dGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1JFQURZOworCS8qIE5PVEUhIFNhdmUgdGhlIGZhaWxlZCBwYWNrZXQgY29tbWFuZCBpbiAicnEtPmJ1ZmZlciIgKi8KKwlycS0+YnVmZmVyID0gKHZvaWQgKikgZmFpbGVkX2NvbW1hbmQtPnNwZWNpYWw7CisJcGMtPnNjc2lfY21kID0gKChpZGVzY3NpX3BjX3QgKikgZmFpbGVkX2NvbW1hbmQtPnNwZWNpYWwpLT5zY3NpX2NtZDsKKwlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkgeworCQlwcmludGsgKCJpZGUtc2NzaTogJXM6IHF1ZXVlIGNtZCA9ICIsIGRyaXZlLT5uYW1lKTsKKwkJaGV4ZHVtcChwYy0+YywgNik7CisJfQorCXJxLT5ycV9kaXNrID0gc2NzaS0+ZGlzazsKKwlyZXR1cm4gaWRlX2RvX2RyaXZlX2NtZChkcml2ZSwgcnEsIGlkZV9wcmVlbXB0KTsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICosIGludCwgaW50KTsKKworc3RhdGljIGlkZV9zdGFydHN0b3BfdAoraWRlc2NzaV9hdGFwaV9lcnJvcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCwgdTggZXJyKQoreworCWlmIChIV0lGKGRyaXZlKS0+SU5CKElERV9TVEFUVVNfUkVHKSAmIChCVVNZX1NUQVR8RFJRX1NUQVQpKQorCQkvKiBmb3JjZSBhbiBhYm9ydCAqLworCQlIV0lGKGRyaXZlKS0+T1VUQihXSU5fSURMRUlNTUVESUFURSxJREVfQ09NTUFORF9SRUcpOworCisJcnEtPmVycm9ycysrOworCisJaWRlc2NzaV9lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CisKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QKK2lkZXNjc2lfYXRhcGlfYWJvcnQoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisjaWYgSURFU0NTSV9ERUJVR19MT0cKKwlwcmludGsoS0VSTl9XQVJOSU5HICJpZGVzY3NpX2F0YXBpX2Fib3J0IGNhbGxlZCBmb3IgJWx1XG4iLAorCQkJKChpZGVzY3NpX3BjX3QgKikgcnEtPnNwZWNpYWwpLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlcik7CisjZW5kaWYKKwlycS0+ZXJyb3JzIHw9IEVSUk9SX01BWDsKKworCWlkZXNjc2lfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOworCisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJzZWNzKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCWlkZXNjc2lfcGNfdCAqcGMgPSAoaWRlc2NzaV9wY190ICopIHJxLT5zcGVjaWFsOworCWludCBsb2cgPSB0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJdTggKnNjc2lfYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShycS0+ZmxhZ3MgJiAoUkVRX1NQRUNJQUx8UkVRX1NFTlNFKSkpIHsKKwkJaWRlX2VuZF9yZXF1ZXN0KGRyaXZlLCB1cHRvZGF0ZSwgbnJzZWNzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlkZV9lbmRfZHJpdmVfY21kIChkcml2ZSwgMCwgMCk7CisJaWYgKHJxLT5mbGFncyAmIFJFUV9TRU5TRSkgeworCQlpZGVzY3NpX3BjX3QgKm9wYyA9IChpZGVzY3NpX3BjX3QgKikgcnEtPmJ1ZmZlcjsKKwkJaWYgKGxvZykgeworCQkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiB3cmFwIHVwIGNoZWNrICVsdSwgcnN0ID0gIiwgZHJpdmUtPm5hbWUsIG9wYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIpOworCQkJaGV4ZHVtcChwYy0+YnVmZmVyLDE2KTsKKwkJfQorCQltZW1jcHkoKHZvaWQgKikgb3BjLT5zY3NpX2NtZC0+c2Vuc2VfYnVmZmVyLCBwYy0+YnVmZmVyLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCQlrZnJlZShwYy0+YnVmZmVyKTsKKwkJa2ZyZWUocGMpOworCQlrZnJlZShycSk7CisJCXBjID0gb3BjOworCQlycSA9IHBjLT5ycTsKKwkJcGMtPnNjc2lfY21kLT5yZXN1bHQgPSAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpIHwKKwkJCQkJKCh0ZXN0X2JpdChQQ19USU1FRE9VVCwgJnBjLT5mbGFncyk/RElEX1RJTUVfT1VUOkRJRF9PSykgPDwgMTYpOworCX0gZWxzZSBpZiAodGVzdF9iaXQoUENfVElNRURPVVQsICZwYy0+ZmxhZ3MpKSB7CisJCWlmIChsb2cpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6ICVzOiB0aW1lZCBvdXQgZm9yICVsdVxuIiwKKwkJCQkJZHJpdmUtPm5hbWUsIHBjLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlcik7CisJCXBjLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX1RJTUVfT1VUIDw8IDE2OworCX0gZWxzZSBpZiAocnEtPmVycm9ycyA+PSBFUlJPUl9NQVgpIHsKKwkJcGMtPnNjc2lfY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWlmIChsb2cpCisJCQlwcmludGsgKCJpZGUtc2NzaTogJXM6IEkvTyBlcnJvciBmb3IgJWx1XG4iLCBkcml2ZS0+bmFtZSwgcGMtPnNjc2lfY21kLT5zZXJpYWxfbnVtYmVyKTsKKwl9IGVsc2UgaWYgKHJxLT5lcnJvcnMpIHsKKwkJaWYgKGxvZykKKwkJCXByaW50ayAoImlkZS1zY3NpOiAlczogY2hlY2sgY29uZGl0aW9uIGZvciAlbHVcbiIsIGRyaXZlLT5uYW1lLCBwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIpOworCQlpZiAoIWlkZXNjc2lfY2hlY2tfY29uZGl0aW9uKGRyaXZlLCBycSkpCisJCQkvKiB3ZSBzdGFydGVkIGEgcmVxdWVzdCBzZW5zZSwgc28gd2UnbGwgYmUgYmFjaywgZXhpdCBmb3Igbm93ICovCisJCQlyZXR1cm4gMDsKKwkJcGMtPnNjc2lfY21kLT5yZXN1bHQgPSAoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpIHwgKERJRF9PSyA8PCAxNik7CisJfSBlbHNlIHsKKwkJcGMtPnNjc2lfY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCWlkZXNjc2lfdHJhbnNmb3JtX3BjMiAoZHJpdmUsIHBjKTsKKwkJaWYgKGxvZykgeworCQkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiBzdWMgJWx1IiwgZHJpdmUtPm5hbWUsIHBjLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlcik7CisJCQlpZiAoIXRlc3RfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpICYmIHBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCAmJiBwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQgPD0gMTAyNCAmJiBwYy0+YnVmZmVyKSB7CisJCQkJcHJpbnRrKCIsIHJzdCA9ICIpOworCQkJCXNjc2lfYnVmID0gcGMtPnNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCQloZXhkdW1wKHNjc2lfYnVmLCBtaW5fdCh1bnNpZ25lZCwgMTYsIHBjLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmbGVuKSk7CisJCQl9IGVsc2UgcHJpbnRrKCJcbiIpOworCQl9CisJfQorCWhvc3QgPSBwYy0+c2NzaV9jbWQtPmRldmljZS0+aG9zdDsKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlwYy0+ZG9uZShwYy0+c2NzaV9jbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJa2ZyZWUocGMpOworCWtmcmVlKHJxKTsKKwlzY3NpLT5wYyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdGltZW91dChpZGVzY3NpX3BjX3QgKnBjKQoreworCXJldHVybiBtYXhfdCh1bnNpZ25lZCBsb25nLCBXQUlUX0NNRCwgcGMtPnRpbWVvdXQgLSBqaWZmaWVzKTsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2V4cGlyeShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJaWRlc2NzaV9wY190ICAgKnBjICAgPSBzY3NpLT5wYzsKKworI2lmIElERVNDU0lfREVCVUdfTE9HCisJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlc2NzaV9leHBpcnkgY2FsbGVkIGZvciAlbHUgYXQgJWx1XG4iLCBwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIsIGppZmZpZXMpOworI2VuZGlmCisJc2V0X2JpdChQQ19USU1FRE9VVCwgJnBjLT5mbGFncyk7CisKKwlyZXR1cm4gMDsJCQkJCS8qIHdlIGRvIG5vdCB3YW50IHRoZSBpZGUgc3Vic3lzdGVtIHRvIHJldHJ5ICovCit9CisKKy8qCisgKglPdXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlc2NzaV9wY19pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKwlpZGVzY3NpX3BjX3QgKnBjPXNjc2ktPnBjOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IHBjLT5ycTsKKwlhdGFwaV9iY291bnRfdCBiY291bnQ7CisJYXRhcGlfc3RhdHVzX3Qgc3RhdHVzOworCWF0YXBpX2lyZWFzb25fdCBpcmVhc29uOworCWF0YXBpX2ZlYXR1cmVfdCBmZWF0dXJlOworCisJdW5zaWduZWQgaW50IHRlbXA7CisKKyNpZiBJREVTQ1NJX0RFQlVHX0xPRworCXByaW50ayAoS0VSTl9JTkZPICJpZGUtc2NzaTogUmVhY2hlZCBpZGVzY3NpX3BjX2ludHIgaW50ZXJydXB0IGhhbmRsZXJcbiIpOworI2VuZGlmIC8qIElERVNDU0lfREVCVUdfTE9HICovCisKKwlpZiAodGVzdF9iaXQoUENfVElNRURPVVQsICZwYy0+ZmxhZ3MpKXsKKyNpZiBJREVTQ1NJX0RFQlVHX0xPRworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGVzY3NpX3BjX2ludHI6IGdvdCB0aW1lZCBvdXQgcGFja2V0ICAlbHUgYXQgJWx1XG4iLAorCQkJCXBjLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlciwgamlmZmllcyk7CisjZW5kaWYKKwkJLyogZW5kIHRoaXMgcmVxdWVzdCBub3cgLSBzY3NpIHNob3VsZCByZXRyeSBpdCovCisJCWlkZXNjc2lfZW5kX3JlcXVlc3QgKGRyaXZlLCAxLCAwKTsKKwkJcmV0dXJuIGlkZV9zdG9wcGVkOworCX0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0IChQQ19ETUFfSU5fUFJPR1JFU1MsICZwYy0+ZmxhZ3MpKSB7CisjaWYgSURFU0NTSV9ERUJVR19MT0cKKwkJcHJpbnRrICgiaWRlLXNjc2k6ICVzOiBETUEgY29tcGxldGVcbiIsIGRyaXZlLT5uYW1lKTsKKyNlbmRpZiAvKiBJREVTQ1NJX0RFQlVHX0xPRyAqLworCQlwYy0+YWN0dWFsbHlfdHJhbnNmZXJyZWQ9cGMtPnJlcXVlc3RfdHJhbnNmZXI7CisJCSh2b2lkKSBIV0lGKGRyaXZlKS0+aWRlX2RtYV9lbmQoZHJpdmUpOworCX0KKworCWZlYXR1cmUuYWxsID0gMDsKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0ICovCisJc3RhdHVzLmFsbCA9IEhXSUYoZHJpdmUpLT5JTkIoSURFX1NUQVRVU19SRUcpOworCisJaWYgKCFzdGF0dXMuYi5kcnEpIHsKKwkJLyogTm8gbW9yZSBpbnRlcnJ1cHRzICovCisJCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQorCQkJcHJpbnRrIChLRVJOX0lORk8gIlBhY2tldCBjb21tYW5kIGNvbXBsZXRlZCwgJWQgYnl0ZXMgdHJhbnNmZXJyZWRcbiIsIHBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJaWYgKHN0YXR1cy5iLmNoZWNrKQorCQkJcnEtPmVycm9ycysrOworCQlpZGVzY3NpX2VuZF9yZXF1ZXN0IChkcml2ZSwgMSwgMCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CisJYmNvdW50LmIubG93CT0gSFdJRihkcml2ZSktPklOQihJREVfQkNPVU5UTF9SRUcpOworCWJjb3VudC5iLmhpZ2gJPSBIV0lGKGRyaXZlKS0+SU5CKElERV9CQ09VTlRIX1JFRyk7CisJaXJlYXNvbi5hbGwJPSBIV0lGKGRyaXZlKS0+SU5CKElERV9JUkVBU09OX1JFRyk7CisKKwlpZiAoaXJlYXNvbi5iLmNvZCkgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1zY3NpOiBDb0QgIT0gMCBpbiBpZGVzY3NpX3BjX2ludHJcbiIpOworCQlyZXR1cm4gaWRlX2RvX3Jlc2V0IChkcml2ZSk7CisJfQorCWlmIChpcmVhc29uLmIuaW8pIHsKKwkJdGVtcCA9IHBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCArIGJjb3VudC5hbGw7CisJCWlmICh0ZW1wID4gcGMtPnJlcXVlc3RfdHJhbnNmZXIpIHsKKwkJCWlmICh0ZW1wID4gcGMtPmJ1ZmZlcl9zaXplKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtc2NzaTogVGhlIHNjc2kgd2FudHMgdG8gIgorCQkJCQkic2VuZCB1cyBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCAiCisJCQkJCSItIGRpc2NhcmRpbmcgZGF0YVxuIik7CisJCQkJdGVtcCA9IHBjLT5idWZmZXJfc2l6ZSAtIHBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZDsKKwkJCQlpZiAodGVtcCkgeworCQkJCQljbGVhcl9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncyk7CisJCQkJCWlmIChwYy0+c2cpCisJCQkJCQlpZGVzY3NpX2lucHV0X2J1ZmZlcnMoZHJpdmUsIHBjLCB0ZW1wKTsKKwkJCQkJZWxzZQorCQkJCQkJZHJpdmUtPmh3aWYtPmF0YXBpX2lucHV0X2J5dGVzKGRyaXZlLCBwYy0+Y3VycmVudF9wb3NpdGlvbiwgdGVtcCk7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXNjc2k6IHRyYW5zZmVycmVkICVkIG9mICVkIGJ5dGVzXG4iLCB0ZW1wLCBiY291bnQuYWxsKTsKKwkJCQl9CisJCQkJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkICs9IHRlbXA7CisJCQkJcGMtPmN1cnJlbnRfcG9zaXRpb24gKz0gdGVtcDsKKwkJCQlpZGVzY3NpX2Rpc2NhcmRfZGF0YShkcml2ZSwgYmNvdW50LmFsbCAtIHRlbXApOworCQkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZXNjc2lfcGNfaW50ciwgZ2V0X3RpbWVvdXQocGMpLCBpZGVzY3NpX2V4cGlyeSk7CisJCQkJcmV0dXJuIGlkZV9zdGFydGVkOworCQkJfQorI2lmIElERVNDU0lfREVCVUdfTE9HCisJCQlwcmludGsgKEtFUk5fTk9USUNFICJpZGUtc2NzaTogVGhlIHNjc2kgd2FudHMgdG8gc2VuZCB1cyBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCAtIGFsbG93aW5nIHRyYW5zZmVyXG4iKTsKKyNlbmRpZiAvKiBJREVTQ1NJX0RFQlVHX0xPRyAqLworCQl9CisJfQorCWlmIChpcmVhc29uLmIuaW8pIHsKKwkJY2xlYXJfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCQlpZiAocGMtPnNnKQorCQkJaWRlc2NzaV9pbnB1dF9idWZmZXJzKGRyaXZlLCBwYywgYmNvdW50LmFsbCk7CisJCWVsc2UKKwkJCUhXSUYoZHJpdmUpLT5hdGFwaV9pbnB1dF9ieXRlcyhkcml2ZSwgcGMtPmN1cnJlbnRfcG9zaXRpb24sIGJjb3VudC5hbGwpOworCX0gZWxzZSB7CisJCXNldF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncyk7CisJCWlmIChwYy0+c2cpCisJCQlpZGVzY3NpX291dHB1dF9idWZmZXJzIChkcml2ZSwgcGMsIGJjb3VudC5hbGwpOworCQllbHNlCisJCQlIV0lGKGRyaXZlKS0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBwYy0+Y3VycmVudF9wb3NpdGlvbiwgYmNvdW50LmFsbCk7CisJfQorCS8qIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiAqLworCXBjLT5hY3R1YWxseV90cmFuc2ZlcnJlZCArPSBiY291bnQuYWxsOworCXBjLT5jdXJyZW50X3Bvc2l0aW9uICs9IGJjb3VudC5hbGw7CisKKwkvKiBBbmQgc2V0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhZ2FpbiAqLworCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZXNjc2lfcGNfaW50ciwgZ2V0X3RpbWVvdXQocGMpLCBpZGVzY3NpX2V4cGlyeSk7CisJcmV0dXJuIGlkZV9zdGFydGVkOworfQorCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXNjc2lfdHJhbnNmZXJfcGMoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSA9IGRyaXZlX3RvX2lkZXNjc2koZHJpdmUpOworCWlkZXNjc2lfcGNfdCAqcGMgPSBzY3NpLT5wYzsKKwlhdGFwaV9pcmVhc29uX3QgaXJlYXNvbjsKKwlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wOworCisJaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCxkcml2ZSxEUlFfU1RBVCxCVVNZX1NUQVQsV0FJVF9SRUFEWSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZGUtc2NzaTogU3RyYW5nZSwgcGFja2V0IGNvbW1hbmQgIgorCQkJImluaXRpYXRlZCB5ZXQgRFJRIGlzbid0IGFzc2VydGVkXG4iKTsKKwkJcmV0dXJuIHN0YXJ0c3RvcDsKKwl9CisJaXJlYXNvbi5hbGwJPSBIV0lGKGRyaXZlKS0+SU5CKElERV9JUkVBU09OX1JFRyk7CisJaWYgKCFpcmVhc29uLmIuY29kIHx8IGlyZWFzb24uYi5pbykgeworCQlwcmludGsoS0VSTl9FUlIgImlkZS1zY3NpOiAoSU8sQ29EKSAhPSAoMCwxKSB3aGlsZSAiCisJCQkJImlzc3VpbmcgYSBwYWNrZXQgY29tbWFuZFxuIik7CisJCXJldHVybiBpZGVfZG9fcmVzZXQgKGRyaXZlKTsKKwl9CisJaWYgKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpCisJCUJVRygpOworCS8qIFNldCB0aGUgaW50ZXJydXB0IHJvdXRpbmUgKi8KKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZpZGVzY3NpX3BjX2ludHIsIGdldF90aW1lb3V0KHBjKSwgaWRlc2NzaV9leHBpcnkpOworCS8qIFNlbmQgdGhlIGFjdHVhbCBwYWNrZXQgKi8KKwlkcml2ZS0+aHdpZi0+YXRhcGlfb3V0cHV0X2J5dGVzKGRyaXZlLCBzY3NpLT5wYy0+YywgMTIpOworCWlmICh0ZXN0X2JpdCAoUENfRE1BX09LLCAmcGMtPmZsYWdzKSkgeworCQlzZXRfYml0IChQQ19ETUFfSU5fUFJPR1JFU1MsICZwYy0+ZmxhZ3MpOworCQlod2lmLT5kbWFfc3RhcnQoZHJpdmUpOworCX0KKwlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlkZXNjc2lfc2V0X2RpcmVjdGlvbihpZGVzY3NpX3BjX3QgKnBjKQoreworCXN3aXRjaCAocGMtPmNbMF0pIHsKKwkJY2FzZSBSRUFEXzY6IGNhc2UgUkVBRF8xMDogY2FzZSBSRUFEXzEyOgorCQkJY2xlYXJfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgV1JJVEVfNjogY2FzZSBXUklURV8xMDogY2FzZSBXUklURV8xMjoKKwkJCXNldF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIGludCBpZGVzY3NpX21hcF9zZyhpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfcGNfdCAqcGMpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csICpzY3NpX3NnOworCWludCBzZWdtZW50czsKKworCWlmICghcGMtPnJlcXVlc3RfdHJhbnNmZXIgfHwgcGMtPnJlcXVlc3RfdHJhbnNmZXIgJSAxMDI0KQorCQlyZXR1cm4gMTsKKworCWlmIChpZGVzY3NpX3NldF9kaXJlY3Rpb24ocGMpKQorCQlyZXR1cm4gMTsKKworCXNnID0gaHdpZi0+c2dfdGFibGU7CisJc2NzaV9zZyA9IHBjLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXI7CisJc2VnbWVudHMgPSBwYy0+c2NzaV9jbWQtPnVzZV9zZzsKKworCWlmIChzZWdtZW50cyA+IGh3aWYtPnNnX21heF9uZW50cykKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXNlZ21lbnRzKSB7CisJCWh3aWYtPnNnX25lbnRzID0gMTsKKwkJc2dfaW5pdF9vbmUoc2csIHBjLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXIsIHBjLT5yZXF1ZXN0X3RyYW5zZmVyKTsKKwl9IGVsc2UgeworCQlod2lmLT5zZ19uZW50cyA9IHNlZ21lbnRzOworCQltZW1jcHkoc2csIHNjc2lfc2csIHNpemVvZigqc2cpICogc2VnbWVudHMpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJSXNzdWUgYSBwYWNrZXQgY29tbWFuZAorICovCitzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXNjc2lfaXNzdWVfcGMgKGlkZV9kcml2ZV90ICpkcml2ZSwgaWRlc2NzaV9wY190ICpwYykKK3sKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSA9IGRyaXZlX3RvX2lkZXNjc2koZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlhdGFwaV9mZWF0dXJlX3QgZmVhdHVyZTsKKwlhdGFwaV9iY291bnRfdCBiY291bnQ7CisKKwlzY3NpLT5wYz1wYzsJCQkJCQkJLyogU2V0IHRoZSBjdXJyZW50IHBhY2tldCBjb21tYW5kICovCisJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkPTA7CQkJCQkvKiBXZSBoYXZlbid0IHRyYW5zZmVycmVkIGFueSBkYXRhIHlldCAqLworCXBjLT5jdXJyZW50X3Bvc2l0aW9uPXBjLT5idWZmZXI7CisJYmNvdW50LmFsbCA9IG1pbihwYy0+cmVxdWVzdF90cmFuc2ZlciwgNjMgKiAxMDI0KTsJCS8qIFJlcXVlc3QgdG8gdHJhbnNmZXIgdGhlIGVudGlyZSBidWZmZXIgYXQgb25jZSAqLworCisJZmVhdHVyZS5hbGwgPSAwOworCWlmIChkcml2ZS0+dXNpbmdfZG1hICYmICFpZGVzY3NpX21hcF9zZyhkcml2ZSwgcGMpKSB7CisJCWh3aWYtPnNnX21hcHBlZCA9IDE7CisJCWZlYXR1cmUuYi5kbWEgPSAhaHdpZi0+ZG1hX3NldHVwKGRyaXZlKTsKKwkJaHdpZi0+c2dfbWFwcGVkID0gMDsKKwl9CisKKwlTRUxFQ1RfRFJJVkUoZHJpdmUpOworCWlmIChJREVfQ09OVFJPTF9SRUcpCisJCUhXSUYoZHJpdmUpLT5PVVRCKGRyaXZlLT5jdGwsIElERV9DT05UUk9MX1JFRyk7CisKKwlIV0lGKGRyaXZlKS0+T1VUQihmZWF0dXJlLmFsbCwgSURFX0ZFQVRVUkVfUkVHKTsKKwlIV0lGKGRyaXZlKS0+T1VUQihiY291bnQuYi5oaWdoLCBJREVfQkNPVU5USF9SRUcpOworCUhXSUYoZHJpdmUpLT5PVVRCKGJjb3VudC5iLmxvdywgSURFX0JDT1VOVExfUkVHKTsKKworCWlmIChmZWF0dXJlLmIuZG1hKQorCQlzZXRfYml0KFBDX0RNQV9PSywgJnBjLT5mbGFncyk7CisKKwlpZiAodGVzdF9iaXQoSURFU0NTSV9EUlFfSU5URVJSVVBULCAmc2NzaS0+ZmxhZ3MpKSB7CisJCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQorCQkJQlVHKCk7CisJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZXNjc2lfdHJhbnNmZXJfcGMsCisJCQkJZ2V0X3RpbWVvdXQocGMpLCBpZGVzY3NpX2V4cGlyeSk7CisJCS8qIElzc3VlIHRoZSBwYWNrZXQgY29tbWFuZCAqLworCQlIV0lGKGRyaXZlKS0+T1VUQihXSU5fUEFDS0VUQ01ELCBJREVfQ09NTUFORF9SRUcpOworCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgdGhlIHBhY2tldCBjb21tYW5kICovCisJCUhXSUYoZHJpdmUpLT5PVVRCKFdJTl9QQUNLRVRDTUQsIElERV9DT01NQU5EX1JFRyk7CisJCXJldHVybiBpZGVzY3NpX3RyYW5zZmVyX3BjKGRyaXZlKTsKKwl9Cit9CisKKy8qCisgKglpZGVzY3NpX2RvX3JlcXVlc3QgaXMgb3VyIHJlcXVlc3QgaGFuZGxpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlc2NzaV9kb19yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgc2VjdG9yX3QgYmxvY2spCit7CisjaWYgSURFU0NTSV9ERUJVR19MT0cKKwlwcmludGsgKEtFUk5fSU5GTyAicnFfc3RhdHVzOiAlZCwgZGV2OiAlcywgY21kOiAleCwgZXJyb3JzOiAlZFxuIixycS0+cnFfc3RhdHVzLCBycS0+cnFfZGlzay0+ZGlza19uYW1lLHJxLT5jbWRbMF0scnEtPmVycm9ycyk7CisJcHJpbnRrIChLRVJOX0lORk8gInNlY3RvcjogJWxkLCBucl9zZWN0b3JzOiAlbGQsIGN1cnJlbnRfbnJfc2VjdG9yczogJWRcbiIscnEtPnNlY3RvcixycS0+bnJfc2VjdG9ycyxycS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKKyNlbmRpZiAvKiBJREVTQ1NJX0RFQlVHX0xPRyAqLworCisJaWYgKHJxLT5mbGFncyAmIChSRVFfU1BFQ0lBTHxSRVFfU0VOU0UpKSB7CisJCXJldHVybiBpZGVzY3NpX2lzc3VlX3BjIChkcml2ZSwgKGlkZXNjc2lfcGNfdCAqKSBycS0+c3BlY2lhbCk7CisJfQorCWJsa19kdW1wX3JxX2ZsYWdzKHJxLCAiaWRlLXNjc2k6IHVuc3VwIGNvbW1hbmQiKTsKKwlpZGVzY3NpX2VuZF9yZXF1ZXN0IChkcml2ZSwgMCwgMCk7CisJcmV0dXJuIGlkZV9zdG9wcGVkOworfQorCitzdGF0aWMgdm9pZCBpZGVzY3NpX2FkZF9zZXR0aW5ncyhpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKKworLyoKKyAqCQkJZHJpdmUJc2V0dGluZyBuYW1lCXJlYWQvd3JpdGUJaW9jdGwJaW9jdGwJCWRhdGEgdHlwZQltaW4JbWF4CW11bF9mYWN0b3IJZGl2X2ZhY3RvcglkYXRhIHBvaW50ZXIJCXNldCBmdW5jdGlvbgorICovCisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiYmlvc19jeWwiLAlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0lOVCwJMCwJMTAyMywJMSwJCTEsCQkmZHJpdmUtPmJpb3NfY3lsLAlOVUxMKTsKKwlpZGVfYWRkX3NldHRpbmcoZHJpdmUsCSJiaW9zX2hlYWQiLAlTRVRUSU5HX1JXLAktMSwJLTEsCQlUWVBFX0JZVEUsCTAsCTI1NSwJMSwJCTEsCQkmZHJpdmUtPmJpb3NfaGVhZCwJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiYmlvc19zZWN0IiwJU0VUVElOR19SVywJLTEsCS0xLAkJVFlQRV9CWVRFLAkwLAk2MywJMSwJCTEsCQkmZHJpdmUtPmJpb3Nfc2VjdCwJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkidHJhbnNmb3JtIiwJU0VUVElOR19SVywJLTEsCS0xLAkJVFlQRV9JTlQsCTAsCTMsCTEsCQkxLAkJJnNjc2ktPnRyYW5zZm9ybSwJTlVMTCk7CisJaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkibG9nIiwJCVNFVFRJTkdfUlcsCS0xLAktMSwJCVRZUEVfSU5ULAkwLAkxLAkxLAkJMSwJCSZzY3NpLT5sb2csCQlOVUxMKTsKK30KKworLyoKKyAqCURyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaWRlc2NzaV9zZXR1cCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVzY3NpX3Njc2lfdCAqc2NzaSkKK3sKKwlEUklWRVIoZHJpdmUpLT5idXN5Kys7CisJaWYgKGRyaXZlLT5pZCAmJiAoZHJpdmUtPmlkLT5jb25maWcgJiAweDAwNjApID09IDB4MjApCisJCXNldF9iaXQgKElERVNDU0lfRFJRX0lOVEVSUlVQVCwgJnNjc2ktPmZsYWdzKTsKKwlzZXRfYml0KElERVNDU0lfVFJBTlNGT1JNLCAmc2NzaS0+dHJhbnNmb3JtKTsKKwljbGVhcl9iaXQoSURFU0NTSV9TR19UUkFOU0ZPUk0sICZzY3NpLT50cmFuc2Zvcm0pOworI2lmIElERVNDU0lfREVCVUdfTE9HCisJc2V0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpOworI2VuZGlmIC8qIElERVNDU0lfREVCVUdfTE9HICovCisJaWRlc2NzaV9hZGRfc2V0dGluZ3MoZHJpdmUpOworCURSSVZFUihkcml2ZSktPmJ1c3ktLTsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2NsZWFudXAgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaWRlX3Njc2lfb2JqICpzY3NpID0gc2NzaWhvc3RfdG9faWRlc2NzaShzY3NpaG9zdCk7CisJc3RydWN0IGdlbmRpc2sgKmcgPSBzY3NpLT5kaXNrOworCisJaWYgKGlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlcihkcml2ZSkpCisJCXJldHVybiAxOworCisJaWRlX3VucmVnaXN0ZXJfcmVnaW9uKGcpOworCisJZHJpdmUtPmRyaXZlcl9kYXRhID0gTlVMTDsKKwlnLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXB1dF9kaXNrKGcpOworCisJc2NzaV9yZW1vdmVfaG9zdChzY3NpaG9zdCk7CisJaWRlX3Njc2lfcHV0KHNjc2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9hdHRhY2goaWRlX2RyaXZlX3QgKmRyaXZlKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaWRlX3Byb2NfZW50cnlfdCBpZGVzY3NpX3Byb2NbXSA9IHsKKwl7ICJjYXBhY2l0eSIsIFNfSUZSRUd8U19JUlVHTywgcHJvY19pZGVfcmVhZF9jYXBhY2l0eSwgTlVMTCB9LAorCXsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Cit9OworI2Vsc2UKKyMgZGVmaW5lIGlkZXNjc2lfcHJvYwlOVUxMCisjZW5kaWYKKworLyoKKyAqCUlERSBzdWJkcml2ZXIgZnVuY3Rpb25zLCByZWdpc3RlcmVkIHdpdGggaWRlLmMKKyAqLworc3RhdGljIGlkZV9kcml2ZXJfdCBpZGVzY3NpX2RyaXZlciA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAiaWRlLXNjc2kiLAorCS52ZXJzaW9uCQk9IElERVNDU0lfVkVSU0lPTiwKKwkubWVkaWEJCQk9IGlkZV9zY3NpLAorCS5idXN5CQkJPSAwLAorCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcAk9IDAsCisJLnByb2MJCQk9IGlkZXNjc2lfcHJvYywKKwkuYXR0YWNoCQkJPSBpZGVzY3NpX2F0dGFjaCwKKwkuY2xlYW51cAkJPSBpZGVzY3NpX2NsZWFudXAsCisJLmRvX3JlcXVlc3QJCT0gaWRlc2NzaV9kb19yZXF1ZXN0LAorCS5lbmRfcmVxdWVzdAkJPSBpZGVzY3NpX2VuZF9yZXF1ZXN0LAorCS5lcnJvciAgICAgICAgICAgICAgICAgID0gaWRlc2NzaV9hdGFwaV9lcnJvciwKKwkuYWJvcnQgICAgICAgICAgICAgICAgICA9IGlkZXNjc2lfYXRhcGlfYWJvcnQsCisJLmRyaXZlcwkJCT0gTElTVF9IRUFEX0lOSVQoaWRlc2NzaV9kcml2ZXIuZHJpdmVzKSwKK307CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9pZGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IGlkZV9zY3NpX29iaiAqc2NzaTsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisKKwlpZiAoIShzY3NpID0gaWRlX3Njc2lfZ2V0KGRpc2spKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRyaXZlID0gc2NzaS0+ZHJpdmU7CisKKwlkcml2ZS0+dXNhZ2UrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfaWRlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBpZGVfc2NzaV9vYmogKnNjc2kgPSBpZGVfc2NzaV9nKGRpc2spOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHNjc2ktPmRyaXZlOworCisJZHJpdmUtPnVzYWdlLS07CisKKwlpZGVfc2NzaV9wdXQoc2NzaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVzY3NpX2lkZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBpbm9kZS0+aV9iZGV2OworCXN0cnVjdCBpZGVfc2NzaV9vYmogKnNjc2kgPSBpZGVfc2NzaV9nKGJkZXYtPmJkX2Rpc2spOworCXJldHVybiBnZW5lcmljX2lkZV9pb2N0bChzY3NpLT5kcml2ZSwgZmlsZSwgYmRldiwgY21kLCBhcmcpOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGlkZXNjc2lfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBpZGVzY3NpX2lkZV9vcGVuLAorCS5yZWxlYXNlCT0gaWRlc2NzaV9pZGVfcmVsZWFzZSwKKwkuaW9jdGwJCT0gaWRlc2NzaV9pZGVfaW9jdGwsCit9OworCitzdGF0aWMgaW50IGlkZXNjc2lfYXR0YWNoKGlkZV9kcml2ZV90ICpkcml2ZSk7CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICogc2RwKQoreworCS8qIENvbmZpZ3VyZSBkZXRlY3RlZCBkZXZpY2UgKi8KKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZHAsIE1TR19TSU1QTEVfVEFHLCBzZHAtPmhvc3QtPmNtZF9wZXJfbHVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlkZXNjc2lfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gIlNDU0kgaG9zdCBhZGFwdGVyIGVtdWxhdGlvbiBmb3IgSURFIEFUQVBJIGRldmljZXMiOworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfaW9jdGwgKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gc2NzaWhvc3RfdG9faWRlc2NzaShkZXYtPmhvc3QpOworCisJaWYgKGNtZCA9PSBTR19TRVRfVFJBTlNGT1JNKSB7CisJCWlmIChhcmcpCisJCQlzZXRfYml0KElERVNDU0lfU0dfVFJBTlNGT1JNLCAmc2NzaS0+dHJhbnNmb3JtKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KElERVNDU0lfU0dfVFJBTlNGT1JNLCAmc2NzaS0+dHJhbnNmb3JtKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChjbWQgPT0gU0dfR0VUX1RSQU5TRk9STSkKKwkJcmV0dXJuIHB1dF91c2VyKHRlc3RfYml0KElERVNDU0lfU0dfVFJBTlNGT1JNLCAmc2NzaS0+dHJhbnNmb3JtKSwgKGludCBfX3VzZXIgKikgYXJnKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX3RyYW5zZm9ybShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpZGVzY3NpX3Njc2lfdCAqc2NzaSA9IGRyaXZlX3RvX2lkZXNjc2koZHJpdmUpOworCisJLyogdGhpcyB3YXMgYSBsYXllcmluZyB2aW9sYXRpb24gYW5kIHdlIGNhbid0IHN1cHBvcnQgaXQKKwkgICBhbnltb3JlLCBzb3JyeS4gKi8KKyNpZiAwCisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBjbWQtPnJlcXVlc3QtPnJxX2Rpc2s7CisKKwlpZiAoZGlzaykgeworCQlzdHJ1Y3QgU2NzaV9EZXZpY2VfVGVtcGxhdGUgKipwID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCQlpZiAoc3RyY21wKCgqcCktPnNjc2lfZHJpdmVyZnNfZHJpdmVyLm5hbWUsICJzZyIpID09IDApCisJCQlyZXR1cm4gdGVzdF9iaXQoSURFU0NTSV9TR19UUkFOU0ZPUk0sICZzY3NpLT50cmFuc2Zvcm0pOworCX0KKyNlbmRpZgorCXJldHVybiB0ZXN0X2JpdChJREVTQ1NJX1RSQU5TRk9STSwgJnNjc2ktPnRyYW5zZm9ybSk7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9xdWV1ZSAoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBzY3NpaG9zdF90b19pZGVzY3NpKGhvc3QpOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IHNjc2ktPmRyaXZlOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IE5VTEw7CisJaWRlc2NzaV9wY190ICpwYyA9IE5VTEw7CisKKwlpZiAoIWRyaXZlKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImlkZS1zY3NpOiBkcml2ZSBpZCAlZCBub3QgcHJlc2VudFxuIiwgY21kLT5kZXZpY2UtPmlkKTsKKwkJZ290byBhYm9ydDsKKwl9CisJc2NzaSA9IGRyaXZlX3RvX2lkZXNjc2koZHJpdmUpOworCXBjID0ga21hbGxvYyAoc2l6ZW9mIChpZGVzY3NpX3BjX3QpLCBHRlBfQVRPTUlDKTsKKwlycSA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlcXVlc3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAocnEgPT0gTlVMTCB8fCBwYyA9PSBOVUxMKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImlkZS1zY3NpOiAlczogb3V0IG9mIG1lbW9yeVxuIiwgZHJpdmUtPm5hbWUpOworCQlnb3RvIGFib3J0OworCX0KKworCW1lbXNldCAocGMtPmMsIDAsIDEyKTsKKwlwYy0+ZmxhZ3MgPSAwOworCXBjLT5ycSA9IHJxOworCW1lbWNweSAocGMtPmMsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJcGMtPmJ1ZmZlciA9IE5VTEw7CisJCXBjLT5zZyA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJfSBlbHNlIHsKKwkJcGMtPmJ1ZmZlciA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXBjLT5zZyA9IE5VTEw7CisJfQorCXBjLT5iX2NvdW50ID0gMDsKKwlwYy0+cmVxdWVzdF90cmFuc2ZlciA9IHBjLT5idWZmZXJfc2l6ZSA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCXBjLT5zY3NpX2NtZCA9IGNtZDsKKwlwYy0+ZG9uZSA9IGRvbmU7CisJcGMtPnRpbWVvdXQgPSBqaWZmaWVzICsgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kOworCisJaWYgKHNob3VsZF90cmFuc2Zvcm0oZHJpdmUsIGNtZCkpCisJCXNldF9iaXQoUENfVFJBTlNGT1JNLCAmcGMtPmZsYWdzKTsKKwlpZGVzY3NpX3RyYW5zZm9ybV9wYzEgKGRyaXZlLCBwYyk7CisKKwlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkgeworCQlwcmludGsgKCJpZGUtc2NzaTogJXM6IHF1ZSAlbHUsIGNtZCA9ICIsIGRyaXZlLT5uYW1lLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCQloZXhkdW1wKGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKwkJaWYgKG1lbWNtcChwYy0+YywgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pKSB7CisJCQlwcmludGsgKCJpZGUtc2NzaTogJXM6IHF1ZSAlbHUsIHRzbCA9ICIsIGRyaXZlLT5uYW1lLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCQkJaGV4ZHVtcChwYy0+YywgMTIpOworCQl9CisJfQorCisJaWRlX2luaXRfZHJpdmVfY21kIChycSk7CisJcnEtPnNwZWNpYWwgPSAoY2hhciAqKSBwYzsKKwlycS0+ZmxhZ3MgPSBSRVFfU1BFQ0lBTDsKKwlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKwlycS0+cnFfZGlzayA9IHNjc2ktPmRpc2s7CisJKHZvaWQpIGlkZV9kb19kcml2ZV9jbWQgKGRyaXZlLCBycSwgaWRlX2VuZCk7CisJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCXJldHVybiAwOworYWJvcnQ6CisJaWYgKHBjKSBrZnJlZSAocGMpOworCWlmIChycSkga2ZyZWUgKHJxKTsKKwljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwlkb25lKGNtZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9laF9hYm9ydCAoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWlkZXNjc2lfc2NzaV90ICpzY3NpICA9IHNjc2lob3N0X3RvX2lkZXNjc2koY21kLT5kZXZpY2UtPmhvc3QpOworCWlkZV9kcml2ZV90ICAgICpkcml2ZSA9IHNjc2ktPmRyaXZlOworCWludAkJYnVzeTsKKwlpbnQgICAgICAgICAgICAgcmV0ICAgPSBGQUlMRUQ7CisKKwkvKiBJbiBpZGVzY3NpX2VoX2Fib3J0IHdlIHRyeSB0byBnZW50bHkgcHJ5IG91ciBjb21tYW5kIGZyb20gdGhlIGlkZSBzdWJzeXN0ZW0gKi8KKworCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IGFib3J0IGNhbGxlZCBmb3IgJWx1XG4iLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCisJaWYgKCFkcml2ZSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IERyaXZlIG5vdCBzZXQgaW4gaWRlc2NzaV9laF9hYm9ydFxuIik7CisJCVdBUk5fT04oMSk7CisJCWdvdG8gbm9fZHJpdmU7CisJfQorCisJLyogRmlyc3QgZ2l2ZSBpdCBzb21lIG1vcmUgdGltZSwgaG93IG11Y2ggaXMgInJpZ2h0IiBpcyBoYXJkIHRvIHNheSA6LSggKi8KKworCWJ1c3kgPSBpZGVfd2FpdF9ub3RfYnVzeShIV0lGKGRyaXZlKSwgMTAwKTsJLyogRklYTUUgLSB1c2VzIG1kZWxheSB3aGljaCBjYXVzZXMgbGF0ZW5jeT8gKi8KKwlpZiAodGVzdF9iaXQoSURFU0NTSV9MT0dfQ01ELCAmc2NzaS0+bG9nKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImlkZS1zY3NpOiBkcml2ZSBkaWQlcyBiZWNvbWUgcmVhZHlcbiIsIGJ1c3k/IiBub3QiOiIiKTsKKworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIHBjIHJ1bm5pbmcgd2UncmUgZG9uZSAob3VyIGludGVycnVwdCB0b29rIGNhcmUgb2YgaXQpICovCisJaWYgKCFzY3NpLT5wYykgeworCQlyZXQgPSBTVUNDRVNTOworCQlnb3RvIGlkZV91bmxvY2s7CisJfQorCisJLyogSXQncyBzb21ld2hlcmUgaW4gZmxpZ2h0LiBEb2VzIGlkZSBzdWJzeXN0ZW0gYWdyZWU/ICovCisJaWYgKHNjc2ktPnBjLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlciA9PSBjbWQtPnNlcmlhbF9udW1iZXIgJiYgIWJ1c3kgJiYKKwkgICAgZWx2X3F1ZXVlX2VtcHR5KGRyaXZlLT5xdWV1ZSkgJiYgSFdHUk9VUChkcml2ZSktPnJxICE9IHNjc2ktPnBjLT5ycSkgeworCQkvKgorCQkgKiBGSVhNRSAtIG5vdCBzdXJlIHRoaXMgY29uZGl0aW9uIGNhbiBldmVyIG9jY3VyCisJCSAqLworCQlwcmludGsgKEtFUk5fRVJSICJpZGUtc2NzaTogY21kIGFib3J0ZWQhXG4iKTsKKworCQlpZiAoc2NzaS0+cGMtPnJxLT5mbGFncyAmIFJFUV9TRU5TRSkKKwkJCWtmcmVlKHNjc2ktPnBjLT5idWZmZXIpOworCQlrZnJlZShzY3NpLT5wYy0+cnEpOworCQlrZnJlZShzY3NpLT5wYyk7CisJCXNjc2ktPnBjID0gTlVMTDsKKworCQlyZXQgPSBTVUNDRVNTOworCX0KKworaWRlX3VubG9jazoKKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKK25vX2RyaXZlOgorCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IGFib3J0IHJldHVybnMgJXNcbiIsIHJldCA9PSBTVUNDRVNTPyJzdWNjZXNzIjoiZmFpbGVkIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfZWhfcmVzZXQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCWlkZXNjc2lfc2NzaV90ICpzY3NpICA9IHNjc2lob3N0X3RvX2lkZXNjc2koY21kLT5kZXZpY2UtPmhvc3QpOworCWlkZV9kcml2ZV90ICAgICpkcml2ZSA9IHNjc2ktPmRyaXZlOworCWludCAgICAgICAgICAgICByZWFkeSA9IDA7CisJaW50ICAgICAgICAgICAgIHJldCAgID0gU1VDQ0VTUzsKKworCS8qIEluIGlkZXNjc2lfZWhfcmVzZXQgd2UgZm9yY2VmdWxseSByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSB0aGUgaWRlIHN1YnN5c3RlbSBhbmQgcmVzZXQgdGhlIGRldmljZS4gKi8KKworCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IHJlc2V0IGNhbGxlZCBmb3IgJWx1XG4iLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCisJaWYgKCFkcml2ZSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IERyaXZlIG5vdCBzZXQgaW4gaWRlc2NzaV9laF9yZXNldFxuIik7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCisJaWYgKCFzY3NpLT5wYyB8fCAocmVxID0gc2NzaS0+cGMtPnJxKSAhPSBIV0dST1VQKGRyaXZlKS0+cnEgfHwgIUhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJpZGUtc2NzaTogTm8gYWN0aXZlIHJlcXVlc3QgaW4gaWRlc2NzaV9laF9yZXNldFxuIik7CisJCXNwaW5fdW5sb2NrKCZpZGVfbG9jayk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyoga2lsbCBjdXJyZW50IHJlcXVlc3QgKi8KKwlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJlcSk7CisJaWYgKHJlcS0+ZmxhZ3MgJiBSRVFfU0VOU0UpCisJCWtmcmVlKHNjc2ktPnBjLT5idWZmZXIpOworCWtmcmVlKHNjc2ktPnBjKTsKKwlzY3NpLT5wYyA9IE5VTEw7CisJa2ZyZWUocmVxKTsKKworCS8qIG5vdyBudWtlIHRoZSBkcml2ZSBxdWV1ZSAqLworCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChkcml2ZS0+cXVldWUpKSkgeworCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCX0KKworCUhXR1JPVVAoZHJpdmUpLT5ycSA9IE5VTEw7CisJSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgPSBOVUxMOworCUhXR1JPVVAoZHJpdmUpLT5idXN5ID0gMTsJCS8qIHdpbGwgc2V0IHRoaXMgdG8gemVybyB3aGVuIGlkZSByZXNldCBmaW5pc2hlZCAqLworCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCisJaWRlX2RvX3Jlc2V0KGRyaXZlKTsKKworCS8qIGlkZV9kb19yZXNldCBzdGFydHMgYSBwb2xsaW5nIGhhbmRsZXIgd2hpY2ggcmVzdGFydHMgaXRzZWxmIGV2ZXJ5IDUwbXMgdW50aWwgdGhlIHJlc2V0IGZpbmlzaGVzICovCisKKwlkbyB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxKGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2spOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzIwKTsKKwkJc3Bpbl9sb2NrX2lycShjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKKwl9IHdoaWxlICggSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgKTsKKworCXJlYWR5ID0gZHJpdmVfaXNfcmVhZHkoZHJpdmUpOworCUhXR1JPVVAoZHJpdmUpLT5idXN5LS07CisJaWYgKCFyZWFkeSkgeworCQlwcmludGsgKEtFUk5fRVJSICJpZGUtc2NzaTogcmVzZXQgZmFpbGVkIVxuIik7CisJCXJldCA9IEZBSUxFRDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlkZXNjc2lfYmlvcyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKnBhcm0pCit7CisJaWRlc2NzaV9zY3NpX3QgKmlkZXNjc2kgPSBzY3NpaG9zdF90b19pZGVzY3NpKHNkZXYtPmhvc3QpOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGlkZXNjc2ktPmRyaXZlOworCisJaWYgKGRyaXZlLT5iaW9zX2N5bCAmJiBkcml2ZS0+Ymlvc19oZWFkICYmIGRyaXZlLT5iaW9zX3NlY3QpIHsKKwkJcGFybVswXSA9IGRyaXZlLT5iaW9zX2hlYWQ7CisJCXBhcm1bMV0gPSBkcml2ZS0+Ymlvc19zZWN0OworCQlwYXJtWzJdID0gZHJpdmUtPmJpb3NfY3lsOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaWRlc2NzaV90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImlkZXNjc2kiLAorCS5pbmZvCQkJPSBpZGVzY3NpX2luZm8sCisJLnNsYXZlX2NvbmZpZ3VyZSAgICAgICAgPSBpZGVzY3NpX3NsYXZlX2NvbmZpZ3VyZSwKKwkuaW9jdGwJCQk9IGlkZXNjc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBpZGVzY3NpX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gaWRlc2NzaV9laF9hYm9ydCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyICA9IGlkZXNjc2lfZWhfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gaWRlc2NzaV9iaW9zLAorCS5jYW5fcXVldWUJCT0gNDAsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSAyNTYsCisJLmNtZF9wZXJfbHVuCQk9IDUsCisJLm1heF9zZWN0b3JzCQk9IDEyOCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorCS5lbXVsYXRlZAkJPSAxLAorCS5wcm9jX25hbWUJCT0gImlkZS1zY3NpIiwKK307CisKK3N0YXRpYyBpbnQgaWRlc2NzaV9hdHRhY2goaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZXNjc2lfc2NzaV90ICppZGVzY3NpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGdlbmRpc2sgKmc7CisJc3RhdGljIGludCB3YXJuZWQ7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpZiAoIXdhcm5lZCAmJiBkcml2ZS0+bWVkaWEgPT0gaWRlX2Nkcm9tKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZS1zY3NpIGlzIGRlcHJlY2F0ZWQgZm9yIGNkIGJ1cm5pbmchIFVzZSBpZGUtY2QgYW5kIGdpdmUgZGV2PS9kZXYvaGRYIGFzIGRldmljZVxuIik7CisJCXdhcm5lZCA9IDE7CisJfQorCisJaWYgKCFzdHJzdHIoImlkZS1zY3NpIiwgZHJpdmUtPmRyaXZlcl9yZXEpIHx8CisJICAgICFkcml2ZS0+cHJlc2VudCB8fAorCSAgICBkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2sgfHwKKwkgICAgIShob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpZGVzY3NpX3RlbXBsYXRlLHNpemVvZihpZGVzY3NpX3Njc2lfdCkpKSkKKwkJcmV0dXJuIDE7CisKKwlnID0gYWxsb2NfZGlzaygxIDw8IFBBUlROX0JJVFMpOworCWlmICghZykKKwkJZ290byBvdXRfaG9zdF9wdXQ7CisKKwlpZGVfaW5pdF9kaXNrKGcsIGRyaXZlKTsKKworCWhvc3QtPm1heF9pZCA9IDE7CisKKyNpZiBJREVTQ1NJX0RFQlVHX0xPRworCWlmIChkcml2ZS0+aWQtPmxhc3RfbHVuKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBpZC0+bGFzdF9sdW49JXVcbiIsIGRyaXZlLT5uYW1lLCBkcml2ZS0+aWQtPmxhc3RfbHVuKTsKKyNlbmRpZgorCWlmICgoZHJpdmUtPmlkLT5sYXN0X2x1biAmIDB4NykgIT0gNykKKwkJaG9zdC0+bWF4X2x1biA9IChkcml2ZS0+aWQtPmxhc3RfbHVuICYgMHg3KSArIDE7CisJZWxzZQorCQlob3N0LT5tYXhfbHVuID0gMTsKKworCWRyaXZlLT5kcml2ZXJfZGF0YSA9IGhvc3Q7CisJaWRlc2NzaSA9IHNjc2lob3N0X3RvX2lkZXNjc2koaG9zdCk7CisJaWRlc2NzaS0+ZHJpdmUgPSBkcml2ZTsKKwlpZGVzY3NpLT5kcml2ZXIgPSAmaWRlc2NzaV9kcml2ZXI7CisJaWRlc2NzaS0+aG9zdCA9IGhvc3Q7CisJaWRlc2NzaS0+ZGlzayA9IGc7CisJZy0+cHJpdmF0ZV9kYXRhID0gJmlkZXNjc2ktPmRyaXZlcjsKKwllcnIgPSBpZGVfcmVnaXN0ZXJfc3ViZHJpdmVyKGRyaXZlLCAmaWRlc2NzaV9kcml2ZXIpOworCWlmICghZXJyKSB7CisJCWlkZXNjc2lfc2V0dXAgKGRyaXZlLCBpZGVzY3NpKTsKKwkJZy0+Zm9wcyA9ICZpZGVzY3NpX29wczsKKwkJaWRlX3JlZ2lzdGVyX3JlZ2lvbihnKTsKKwkJZXJyID0gc2NzaV9hZGRfaG9zdChob3N0LCAmZHJpdmUtPmdlbmRldik7CisJCWlmICghZXJyKSB7CisJCQlzY3NpX3NjYW5faG9zdChob3N0KTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCBvbiBlcnJvciAqLworCQlpZGVfdW5yZWdpc3Rlcl9yZWdpb24oZyk7CisJCWlkZV91bnJlZ2lzdGVyX3N1YmRyaXZlcihkcml2ZSk7CisJfQorCisJcHV0X2Rpc2soZyk7CitvdXRfaG9zdF9wdXQ6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2lkZXNjc2lfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGlkZV9yZWdpc3Rlcl9kcml2ZXIoJmlkZXNjc2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaWRlc2NzaV9tb2R1bGUodm9pZCkKK3sKKwlpZGVfdW5yZWdpc3Rlcl9kcml2ZXIoJmlkZXNjc2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9pZGVzY3NpX21vZHVsZSk7Cittb2R1bGVfZXhpdChleGl0X2lkZXNjc2lfbW9kdWxlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pbW0uYyBiL2RyaXZlcnMvc2NzaS9pbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdmMmNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2ltbS5jCkBAIC0wLDAgKzEsMTMwMCBAQAorLyogaW1tLmMgICAtLSAgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIElPTUVHQSBNYXRjaE1ha2VyCisgKiBwYXJhbGxlbCBwb3J0IFNDU0kgaG9zdCBhZGFwdGVyLgorICogCisgKiAoVGhlIElNTSBpcyB0aGUgZW1iZWRkZWQgY29udHJvbGxlciBpbiB0aGUgWklQIFBsdXMgZHJpdmUuKQorICogCisgKiBDdXJyZW50IE1haW50YWluZXI6IERhdmlkIENhbXBiZWxsIChQZXJ0aCwgV2VzdGVybiBBdXN0cmFsaWEpCisgKiAgICAgICAgICAgICAgICAgICAgIGNhbXBiZWxsQHRvcnF1ZS5uZXQKKyAqCisgKiBNeSB1bm9mZmljYWwgY29tcGFueSBhY3JvbnltIGxpc3QgaXMgMjEgcGFnZXMgbG9uZzoKKyAqICAgICAgRkxBOiAgICBGb3VyIGxldHRlciBhY3JvbnltIHdpdGggYnVpbHQgaW4gZmFjaWxpdHkgZm9yCisgKiAgICAgICAgICAgICAgZnV0dXJlIGV4cGFuc2lvbiB0byBmaXZlIGxldHRlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisvKiBUaGUgZm9sbG93aW5nICNkZWZpbmUgaXMgdG8gYXZvaWQgYSBjbGFzaCB3aXRoIGhvc3RzLmMgKi8KKyNkZWZpbmUgSU1NX1BST0JFX1NQUCAgIDB4MDAwMQorI2RlZmluZSBJTU1fUFJPQkVfUFMyICAgMHgwMDAyCisjZGVmaW5lIElNTV9QUk9CRV9FQ1IgICAweDAwMTAKKyNkZWZpbmUgSU1NX1BST0JFX0VQUDE3IDB4MDEwMAorI2RlZmluZSBJTU1fUFJPQkVfRVBQMTkgMHgwMjAwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBwYXJkZXZpY2UgKmRldjsJLyogUGFycG9ydCBkZXZpY2UgZW50cnkgICAgICAgICAqLworCWludCBiYXNlOwkJLyogQWN0dWFsIHBvcnQgYWRkcmVzcyAgICAgICAgICAqLworCWludCBiYXNlX2hpOwkJLyogSGkgQmFzZSBhZGRyZXNzIGZvciBFQ1AtSVNBIGNoaXBzZXQgKi8KKwlpbnQgbW9kZTsJCS8qIFRyYW5zZmVyIG1vZGUgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJfY21kOwkvKiBDdXJyZW50IHF1ZXVlZCBjb21tYW5kICAgICAgICovCisJc3RydWN0IHdvcmtfc3RydWN0IGltbV90cTsJLyogUG9sbGluZyBpbnRlcnJ1cHQgc3R1ZmYgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGpzdGFydDsJLyogSmlmZmllcyBhdCBzdGFydCAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGZhaWxlZDoxOwkvKiBGYWlsdXJlIGZsYWcgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgZHA6MTsJCS8qIERhdGEgcGhhc2UgcHJlc2VudCAgICAgICAgICAgKi8KKwl1bnNpZ25lZCByZDoxOwkJLyogUmVhZCBkYXRhIGluIGRhdGEgcGhhc2UgICAgICAqLworCXVuc2lnbmVkIHdhbnRlZDoxOwkvKiBQYXJwb3J0IHNoYXJpbmcgYnVzeSBmbGFnICAgICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgKndhaXRpbmc7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9IGltbV9zdHJ1Y3Q7CisKK3N0YXRpYyB2b2lkIGltbV9yZXNldF9wdWxzZSh1bnNpZ25lZCBpbnQgYmFzZSk7CitzdGF0aWMgaW50IGRldmljZV9jaGVjayhpbW1fc3RydWN0ICpkZXYpOworCisjaW5jbHVkZSAiaW1tLmgiCisKK3N0YXRpYyBpbmxpbmUgaW1tX3N0cnVjdCAqaW1tX2RldihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXJldHVybiAqKGltbV9zdHJ1Y3QgKiopJmhvc3QtPmhvc3RkYXRhOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFyYml0cmF0aW9uX2xvY2spOworCitzdGF0aWMgdm9pZCBnb3RfaXQoaW1tX3N0cnVjdCAqZGV2KQoreworCWRldi0+YmFzZSA9IGRldi0+ZGV2LT5wb3J0LT5iYXNlOworCWlmIChkZXYtPmN1cl9jbWQpCisJCWRldi0+Y3VyX2NtZC0+U0NwLnBoYXNlID0gMTsKKwllbHNlCisJCXdha2VfdXAoZGV2LT53YWl0aW5nKTsKK30KKworc3RhdGljIHZvaWQgaW1tX3dha2V1cCh2b2lkICpyZWYpCit7CisJaW1tX3N0cnVjdCAqZGV2ID0gKGltbV9zdHJ1Y3QgKikgcmVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCWlmIChkZXYtPndhbnRlZCkgeworCQlwYXJwb3J0X2NsYWltKGRldi0+ZGV2KTsKKwkJZ290X2l0KGRldik7CisJCWRldi0+d2FudGVkID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGltbV9wYl9jbGFpbShpbW1fc3RydWN0ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCWlmIChwYXJwb3J0X2NsYWltKGRldi0+ZGV2KSA9PSAwKSB7CisJCWdvdF9pdChkZXYpOworCQlyZXMgPSAwOworCX0KKwlkZXYtPndhbnRlZCA9IHJlczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgaW1tX3BiX2Rpc21pc3MoaW1tX3N0cnVjdCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdhbnRlZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXJiaXRyYXRpb25fbG9jaywgZmxhZ3MpOworCXdhbnRlZCA9IGRldi0+d2FudGVkOworCWRldi0+d2FudGVkID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJaWYgKCF3YW50ZWQpCisJCXBhcnBvcnRfcmVsZWFzZShkZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbW1fcGJfcmVsZWFzZShpbW1fc3RydWN0ICpkZXYpCit7CisJcGFycG9ydF9yZWxlYXNlKGRldi0+ZGV2KTsKK30KKworLyogVGhpcyBpcyB0byBnaXZlIHRoZSBpbW0gZHJpdmVyIGEgd2F5IHRvIG1vZGlmeSB0aGUgdGltaW5ncyAoYW5kIG90aGVyCisgKiBwYXJhbWV0ZXJzKSBieSB3cml0aW5nIHRvIHRoZSAvcHJvYy9zY3NpL2ltbS8wIGZpbGUuCisgKiBWZXJ5IHNpbXBsZSBtZXRob2QgcmVhbGx5Li4uIChUb28gc2ltcGxlLCBubyBlcnJvciBjaGVja2luZyA6KCApCisgKiBSZWFzb246IEtlcm5lbCBoYWNrZXJzIEhBVEUgaGF2aW5nIHRvIHVubG9hZCBhbmQgcmVsb2FkIG1vZHVsZXMgZm9yCisgKiB0ZXN0aW5nLi4uCisgKiBBbHNvIGdpdmVzIGEgbWV0aG9kIHRvIHVzZSBhIHNjcmlwdCB0byBvYnRhaW4gb3B0aW11bSB0aW1pbmdzIChUT0RPKQorICovCitzdGF0aWMgaW5saW5lIGludCBpbW1fcHJvY193cml0ZShpbW1fc3RydWN0ICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlpZiAoKGxlbmd0aCA+IDUpICYmIChzdHJuY21wKGJ1ZmZlciwgIm1vZGU9IiwgNSkgPT0gMCkpIHsKKwkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciArIDUsIE5VTEwsIDApOworCQlkZXYtPm1vZGUgPSB4OworCQlyZXR1cm4gbGVuZ3RoOworCX0KKwlwcmludGsoImltbSAvcHJvYzogaW52YWxpZCB2YXJpYWJsZVxuIik7CisJcmV0dXJuICgtRUlOVkFMKTsKK30KKworc3RhdGljIGludCBpbW1fcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAorCQkJb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJaW1tX3N0cnVjdCAqZGV2ID0gaW1tX2Rldihob3N0KTsKKwlpbnQgbGVuID0gMDsKKworCWlmIChpbm91dCkKKwkJcmV0dXJuIGltbV9wcm9jX3dyaXRlKGRldiwgYnVmZmVyLCBsZW5ndGgpOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiVmVyc2lvbiA6ICVzXG4iLCBJTU1fVkVSU0lPTik7CisJbGVuICs9CisJICAgIHNwcmludGYoYnVmZmVyICsgbGVuLCAiUGFycG9ydCA6ICVzXG4iLAorCQkgICAgZGV2LT5kZXYtPnBvcnQtPm5hbWUpOworCWxlbiArPQorCSAgICBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIk1vZGUgICAgOiAlc1xuIiwKKwkJICAgIElNTV9NT0RFX1NUUklOR1tkZXYtPm1vZGVdKTsKKworCS8qIFJlcXVlc3QgZm9yIGJleW9uZCBlbmQgb2YgYnVmZmVyICovCisJaWYgKG9mZnNldCA+IGxlbikKKwkJcmV0dXJuIDA7CisKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJcmV0dXJuIGxlbjsKK30KKworI2lmIElNTV9ERUJVRyA+IDAKKyNkZWZpbmUgaW1tX2ZhaWwoeCx5KSBwcmludGsoImltbTogaW1tX2ZhaWwoJWkpIGZyb20gJXMgYXQgbGluZSAlZFxuIixcCisJICAgeSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IGltbV9mYWlsX2Z1bmMoeCx5KTsKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW1tX2ZhaWxfZnVuYyhpbW1fc3RydWN0ICpkZXYsIGludCBlcnJvcl9jb2RlKQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW1tX2ZhaWwoaW1tX3N0cnVjdCAqZGV2LCBpbnQgZXJyb3JfY29kZSkKKyNlbmRpZgoreworCS8qIElmIHdlIGZhaWwgYSBkZXZpY2UgdGhlbiB3ZSB0cmFzaCBzdGF0dXMgLyBtZXNzYWdlIGJ5dGVzICovCisJaWYgKGRldi0+Y3VyX2NtZCkgeworCQlkZXYtPmN1cl9jbWQtPnJlc3VsdCA9IGVycm9yX2NvZGUgPDwgMTY7CisJCWRldi0+ZmFpbGVkID0gMTsKKwl9Cit9CisKKy8qCisgKiBXYWl0IGZvciB0aGUgaGlnaCBiaXQgdG8gYmUgc2V0LgorICogCisgKiBJbiBwcmluY2lwbGUsIHRoaXMgY291bGQgYmUgdGllZCB0byBhbiBpbnRlcnJ1cHQsIGJ1dCB0aGUgYWRhcHRlcgorICogZG9lc24ndCBhcHBlYXIgdG8gYmUgZGVzaWduZWQgdG8gc3VwcG9ydCBpbnRlcnJ1cHRzLiAgV2Ugc3BpbiBvbgorICogdGhlIDB4ODAgcmVhZHkgYml0LiAKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgaW1tX3dhaXQoaW1tX3N0cnVjdCAqZGV2KQoreworCWludCBrOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIHI7CisKKwl3X2N0cihwcGIsIDB4MGMpOworCisJayA9IElNTV9TUElOX1RNTzsKKwlkbyB7CisJCXIgPSByX3N0cihwcGIpOworCQlrLS07CisJCXVkZWxheSgxKTsKKwl9CisJd2hpbGUgKCEociAmIDB4ODApICYmIChrKSk7CisKKwkvKgorCSAqIFNUUiByZWdpc3RlciAoTFBUIGJhc2UrMSkgdG8gU0NTSSBtYXBwaW5nOgorCSAqCisJICogU1RSICAgICAgaW1tICAgICBpbW0KKwkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAqIDB4ODAgICAgIFNfUkVRICAgU19SRVEKKwkgKiAweDQwICAgICAhU19CU1kgICg/Pz8/KQorCSAqIDB4MjAgICAgICFTX0NEICAgIVNfQ0QKKwkgKiAweDEwICAgICAhU19JTyAgICFTX0lPCisJICogMHgwOCAgICAgKD8/Pz8pICAhU19CU1kKKwkgKgorCSAqIGltbSAgICAgIGltbSAgICAgbWVhbmluZworCSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgKiAweGYwICAgICAweGI4ICAgIEJpdCBtYXNrCisJICogMHhjMCAgICAgMHg4OCAgICBaSVAgd2FudHMgbW9yZSBkYXRhCisJICogMHhkMCAgICAgMHg5OCAgICBaSVAgd2FudHMgdG8gc2VuZCBtb3JlIGRhdGEKKwkgKiAweGUwICAgICAweGE4ICAgIFpJUCBpcyBleHBlY3RpbmcgU0NTSSBjb21tYW5kIGRhdGEKKwkgKiAweGYwICAgICAweGI4ICAgIGVuZCBvZiB0cmFuc2ZlciwgWklQIGlzIHNlbmRpbmcgc3RhdHVzCisJICovCisJd19jdHIocHBiLCAweDA0KTsKKwlpZiAoaykKKwkJcmV0dXJuIChyICYgMHhiOCk7CisKKwkvKiBDb3VudGVyIGV4cGlyZWQgLSBUaW1lIG91dCBvY2N1cnJlZCAqLworCWltbV9mYWlsKGRldiwgRElEX1RJTUVfT1VUKTsKKwlwcmludGsoImltbSB0aW1lb3V0IGluIGltbV93YWl0XG4iKTsKKwlyZXR1cm4gMDsJCS8qIGNvbW1hbmQgdGltZWQgb3V0ICovCit9CisKK3N0YXRpYyBpbnQgaW1tX25lZ290aWF0ZShpbW1fc3RydWN0ICogdG1wKQoreworCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBzdXBwb3NlZGx5IHRoZSBJRUVFIDEyODQtMTk5NCBuZWdvdGlhdGUKKwkgKiBzZXF1ZW5jZS4gSSBoYXZlIHlldCB0byBvYnRhaW4gYSBjb3B5IG9mIHRoZSBhYm92ZSBzdGFuZGFyZAorCSAqIHNvIHRoaXMgaXMgYSBiaXQgb2YgYSBndWVzcy4uLgorCSAqCisJICogQSBmYWlyIGNodW5rIG9mIHRoaXMgaXMgYmFzZWQgb24gdGhlIExpbnV4IHBhcnBvcnQgaW1wbGVtZW50YXRpb24KKwkgKiBvZiBJRUVFIDEyODQuCisJICoKKwkgKiBSZXR1cm4gMCBpZiBkYXRhIGF2YWlsYWJsZQorCSAqICAgICAgICAxIGlmIG5vIGRhdGEgYXZhaWxhYmxlCisJICovCisKKwl1bnNpZ25lZCBzaG9ydCBiYXNlID0gdG1wLT5iYXNlOworCXVuc2lnbmVkIGNoYXIgYSwgbW9kZTsKKworCXN3aXRjaCAodG1wLT5tb2RlKSB7CisJY2FzZSBJTU1fTklCQkxFOgorCQltb2RlID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBJTU1fUFMyOgorCQltb2RlID0gMHgwMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJd19jdHIoYmFzZSwgMHgwNCk7CisJdWRlbGF5KDUpOworCXdfZHRyKGJhc2UsIG1vZGUpOworCXVkZWxheSgxMDApOworCXdfY3RyKGJhc2UsIDB4MDYpOworCXVkZWxheSg1KTsKKwlhID0gKHJfc3RyKGJhc2UpICYgMHgyMCkgPyAwIDogMTsKKwl1ZGVsYXkoNSk7CisJd19jdHIoYmFzZSwgMHgwNyk7CisJdWRlbGF5KDUpOworCXdfY3RyKGJhc2UsIDB4MDYpOworCisJaWYgKGEpIHsKKwkJcHJpbnRrCisJCSAgICAoIklNTTogSUVFRTEyODQgbmVnb3RpYXRlIGluZGljYXRlcyBubyBkYXRhIGF2YWlsYWJsZS5cbiIpOworCQlpbW1fZmFpbCh0bXAsIERJRF9FUlJPUik7CisJfQorCXJldHVybiBhOworfQorCisvKiAKKyAqIENsZWFyIEVQUCB0aW1lb3V0IGJpdC4gCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlcHBfcmVzZXQodW5zaWduZWQgc2hvcnQgcHBiKQoreworCWludCBpOworCisJaSA9IHJfc3RyKHBwYik7CisJd19zdHIocHBiLCBpKTsKKwl3X3N0cihwcGIsIGkgJiAweGZlKTsKK30KKworLyogCisgKiBXYWl0IGZvciBlbXB0eSBFQ1AgZmlmbyAoaWYgd2UgYXJlIGluIEVDUCBmaWZvIG1vZGUgb25seSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVjcF9zeW5jKGltbV9zdHJ1Y3QgKmRldikKK3sKKwlpbnQgaSwgcHBiX2hpID0gZGV2LT5iYXNlX2hpOworCisJaWYgKHBwYl9oaSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoKHJfZWNyKHBwYl9oaSkgJiAweGUwKSA9PSAweDYwKSB7CS8qIG1vZGUgMDExID09IEVDUCBmaWZvIG1vZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAocl9lY3IocHBiX2hpKSAmIDB4MDEpCisJCQkJcmV0dXJuOworCQkJdWRlbGF5KDUpOworCQl9CisJCXByaW50aygiaW1tOiBFQ1Agc3luYyBmYWlsZWQgYXMgZGF0YSBzdGlsbCBwcmVzZW50IGluIEZJRk8uXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW1tX2J5dGVfb3V0KHVuc2lnbmVkIHNob3J0IGJhc2UsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXdfY3RyKGJhc2UsIDB4NCk7CS8qIGFwcGFyZW50bHkgYSBzYW5lIG1vZGUgKi8KKwlmb3IgKGkgPSBsZW4gPj4gMTsgaTsgaS0tKSB7CisJCXdfZHRyKGJhc2UsICpidWZmZXIrKyk7CisJCXdfY3RyKGJhc2UsIDB4NSk7CS8qIERyb3AgU1RST0JFIGxvdyAqLworCQl3X2R0cihiYXNlLCAqYnVmZmVyKyspOworCQl3X2N0cihiYXNlLCAweDApOwkvKiBTVFJPQkUgaGlnaCArIElOSVQgbG93ICovCisJfQorCXdfY3RyKGJhc2UsIDB4NCk7CS8qIGFwcGFyZW50bHkgYSBzYW5lIG1vZGUgKi8KKwlyZXR1cm4gMTsJCS8qIEFsbCB3ZW50IHdlbGwgLSB3ZSBob3BlISAqLworfQorCitzdGF0aWMgaW50IGltbV9uaWJibGVfaW4odW5zaWduZWQgc2hvcnQgYmFzZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgbDsKKwlpbnQgaTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBiYXNlZCBvbiBkb2N1bWVudGVkIHRpbWluZyBzaWduYWxzCisJICovCisJd19jdHIoYmFzZSwgMHg0KTsKKwlmb3IgKGkgPSBsZW47IGk7IGktLSkgeworCQl3X2N0cihiYXNlLCAweDYpOworCQlsID0gKHJfc3RyKGJhc2UpICYgMHhmMCkgPj4gNDsKKwkJd19jdHIoYmFzZSwgMHg1KTsKKwkJKmJ1ZmZlcisrID0gKHJfc3RyKGJhc2UpICYgMHhmMCkgfCBsOworCQl3X2N0cihiYXNlLCAweDQpOworCX0KKwlyZXR1cm4gMTsJCS8qIEFsbCB3ZW50IHdlbGwgLSB3ZSBob3BlISAqLworfQorCitzdGF0aWMgaW50IGltbV9ieXRlX2luKHVuc2lnbmVkIHNob3J0IGJhc2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBiYXNlZCBvbiBkb2N1bWVudGVkIHRpbWluZyBzaWduYWxzCisJICovCisJd19jdHIoYmFzZSwgMHg0KTsKKwlmb3IgKGkgPSBsZW47IGk7IGktLSkgeworCQl3X2N0cihiYXNlLCAweDI2KTsKKwkJKmJ1ZmZlcisrID0gcl9kdHIoYmFzZSk7CisJCXdfY3RyKGJhc2UsIDB4MjUpOworCX0KKwlyZXR1cm4gMTsJCS8qIEFsbCB3ZW50IHdlbGwgLSB3ZSBob3BlISAqLworfQorCitzdGF0aWMgaW50IGltbV9vdXQoaW1tX3N0cnVjdCAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCWludCByID0gaW1tX3dhaXQoZGV2KTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQ6CisJICogYSkgdGhlIFNDU0kgYnVzIGlzIEJVU1kgKGRldmljZSBzdGlsbCBsaXN0ZW5pbmcpCisJICogYikgdGhlIGRldmljZSBpcyBsaXN0ZW5pbmcKKwkgKi8KKwlpZiAoKHIgJiAweDE4KSAhPSAweDA4KSB7CisJCWltbV9mYWlsKGRldiwgRElEX0VSUk9SKTsKKwkJcHJpbnRrKCJJTU06IHJldHVybmVkIFNDU0kgc3RhdHVzICUyeFxuIiwgcik7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2ggKGRldi0+bW9kZSkgeworCWNhc2UgSU1NX0VQUF8zMjoKKwljYXNlIElNTV9FUFBfMTY6CisJY2FzZSBJTU1fRVBQXzg6CisJCWVwcF9yZXNldChwcGIpOworCQl3X2N0cihwcGIsIDB4NCk7CisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9FUFAxNgorCQlpZiAoISgoKGxvbmcpIGJ1ZmZlciB8IGxlbikgJiAweDAxKSkKKwkJCW91dHN3KHBwYiArIDQsIGJ1ZmZlciwgbGVuID4+IDEpOworI2Vsc2UKKwkJaWYgKCEoKChsb25nKSBidWZmZXIgfCBsZW4pICYgMHgwMykpCisJCQlvdXRzbChwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAyKTsKKyNlbmRpZgorCQllbHNlCisJCQlvdXRzYihwcGIgKyA0LCBidWZmZXIsIGxlbik7CisJCXdfY3RyKHBwYiwgMHhjKTsKKwkJciA9ICEocl9zdHIocHBiKSAmIDB4MDEpOworCQl3X2N0cihwcGIsIDB4Yyk7CisJCWVjcF9zeW5jKGRldik7CisJCWJyZWFrOworCisJY2FzZSBJTU1fTklCQkxFOgorCWNhc2UgSU1NX1BTMjoKKwkJLyogOCBiaXQgb3V0cHV0LCB3aXRoIGEgbG9vcCAqLworCQlyID0gaW1tX2J5dGVfb3V0KHBwYiwgYnVmZmVyLCBsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiSU1NOiBidWcgaW4gaW1tX291dCgpXG4iKTsKKwkJciA9IDA7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGltbV9pbihpbW1fc3RydWN0ICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisJaW50IHIgPSBpbW1fd2FpdChkZXYpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdDoKKwkgKiBhKSB0aGUgU0NTSSBidXMgaXMgQlVTWSAoZGV2aWNlIHN0aWxsIGxpc3RlbmluZykKKwkgKiBiKSB0aGUgZGV2aWNlIGlzIHNlbmRpbmcgZGF0YQorCSAqLworCWlmICgociAmIDB4MTgpICE9IDB4MTgpIHsKKwkJaW1tX2ZhaWwoZGV2LCBESURfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJc3dpdGNoIChkZXYtPm1vZGUpIHsKKwljYXNlIElNTV9OSUJCTEU6CisJCS8qIDQgYml0IGlucHV0LCB3aXRoIGEgbG9vcCAqLworCQlyID0gaW1tX25pYmJsZV9pbihwcGIsIGJ1ZmZlciwgbGVuKTsKKwkJd19jdHIocHBiLCAweGMpOworCQlicmVhazsKKworCWNhc2UgSU1NX1BTMjoKKwkJLyogOCBiaXQgaW5wdXQsIHdpdGggYSBsb29wICovCisJCXIgPSBpbW1fYnl0ZV9pbihwcGIsIGJ1ZmZlciwgbGVuKTsKKwkJd19jdHIocHBiLCAweGMpOworCQlicmVhazsKKworCWNhc2UgSU1NX0VQUF8zMjoKKwljYXNlIElNTV9FUFBfMTY6CisJY2FzZSBJTU1fRVBQXzg6CisJCWVwcF9yZXNldChwcGIpOworCQl3X2N0cihwcGIsIDB4MjQpOworI2lmZGVmIENPTkZJR19TQ1NJX0laSVBfRVBQMTYKKwkJaWYgKCEoKChsb25nKSBidWZmZXIgfCBsZW4pICYgMHgwMSkpCisJCQlpbnN3KHBwYiArIDQsIGJ1ZmZlciwgbGVuID4+IDEpOworI2Vsc2UKKwkJaWYgKCEoKChsb25nKSBidWZmZXIgfCBsZW4pICYgMHgwMykpCisJCQlpbnNsKHBwYiArIDQsIGJ1ZmZlciwgbGVuID4+IDIpOworI2VuZGlmCisJCWVsc2UKKwkJCWluc2IocHBiICsgNCwgYnVmZmVyLCBsZW4pOworCQl3X2N0cihwcGIsIDB4MmMpOworCQlyID0gIShyX3N0cihwcGIpICYgMHgwMSk7CisJCXdfY3RyKHBwYiwgMHgyYyk7CisJCWVjcF9zeW5jKGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJJTU06IGJ1ZyBpbiBpbW1faW5zKClcbiIpOworCQlyID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGltbV9jcHAodW5zaWduZWQgc2hvcnQgcHBiLCB1bnNpZ25lZCBjaGFyIGIpCit7CisJLyoKKwkgKiBDb21tZW50cyBvbiB1ZGVsYXkgdmFsdWVzIHJlZmVyIHRvIHRoZQorCSAqIENvbW1hbmQgUGFja2V0IFByb3RvY29sIChDUFApIHRpbWluZyBkaWFncmFtLgorCSAqLworCisJdW5zaWduZWQgY2hhciBzMSwgczIsIHMzOworCXdfY3RyKHBwYiwgMHgwYyk7CisJdWRlbGF5KDIpOwkJLyogMSB1c2VjIC0gaW5maW5pdGUgKi8KKwl3X2R0cihwcGIsIDB4YWEpOworCXVkZWxheSgxMCk7CQkvKiA3IHVzZWMgLSBpbmZpbml0ZSAqLworCXdfZHRyKHBwYiwgMHg1NSk7CisJdWRlbGF5KDEwKTsJCS8qIDcgdXNlYyAtIGluZmluaXRlICovCisJd19kdHIocHBiLCAweDAwKTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKwl3X2R0cihwcGIsIDB4ZmYpOworCXVkZWxheSgxMCk7CQkvKiA3IHVzZWMgLSBpbmZpbml0ZSAqLworCXMxID0gcl9zdHIocHBiKSAmIDB4Yjg7CisJd19kdHIocHBiLCAweDg3KTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKwlzMiA9IHJfc3RyKHBwYikgJiAweGI4OworCXdfZHRyKHBwYiwgMHg3OCk7CisJdWRlbGF5KDEwKTsJCS8qIDcgdXNlYyAtIGluZmluaXRlICovCisJczMgPSByX3N0cihwcGIpICYgMHgzODsKKwkvKgorCSAqIFZhbHVlcyBmb3IgYiBhcmU6CisJICogMDAwMCAwMGFhICAgIEFzc2lnbiBhZGRyZXNzIGFhIHRvIGN1cnJlbnQgZGV2aWNlCisJICogMDAxMCAwMGFhICAgIFNlbGVjdCBkZXZpY2UgYWEgaW4gRVBQIFdpbmJvbmQgbW9kZQorCSAqIDAwMTAgMTBhYSAgICBTZWxlY3QgZGV2aWNlIGFhIGluIEVQUCBtb2RlCisJICogMDAxMSB4eHh4ICAgIERlc2VsZWN0IGFsbCBkZXZpY2VzCisJICogMDExMCAwMGFhICAgIFRlc3QgZGV2aWNlIGFhCisJICogMTEwMSAwMGFhICAgIFNlbGVjdCBkZXZpY2UgYWEgaW4gRUNQIG1vZGUKKwkgKiAxMTEwIDAwYWEgICAgU2VsZWN0IGRldmljZSBhYSBpbiBDb21wYXRpYmxlIG1vZGUKKwkgKi8KKwl3X2R0cihwcGIsIGIpOworCXVkZWxheSgyKTsJCS8qIDEgdXNlYyAtIGluZmluaXRlICovCisJd19jdHIocHBiLCAweDBjKTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKwl3X2N0cihwcGIsIDB4MGQpOworCXVkZWxheSgyKTsJCS8qIDEgdXNlYyAtIGluZmluaXRlICovCisJd19jdHIocHBiLCAweDBjKTsKKwl1ZGVsYXkoMTApOwkJLyogNyB1c2VjIC0gaW5maW5pdGUgKi8KKwl3X2R0cihwcGIsIDB4ZmYpOworCXVkZWxheSgxMCk7CQkvKiA3IHVzZWMgLSBpbmZpbml0ZSAqLworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIGVsZWN0cmljYWwgcGluIHZhbHVlcy4KKwkgKiAoQlNZIGlzIGludmVydGVkIGF0IHRoZSBDVFIgcmVnaXN0ZXIpCisJICoKKwkgKiAgICAgICBCU1kgIEFDSyAgUE91dCBTRUwgIEZhdWx0CisJICogUzEgICAgMCAgICBYICAgIDEgICAgMSAgICAxCisJICogUzIgICAgMSAgICBYICAgIDAgICAgMSAgICAxCisJICogUzMgICAgTCAgICBYICAgIDEgICAgMSAgICBTCisJICoKKwkgKiBMID0+IExhc3QgZGV2aWNlIGluIGNoYWluCisJICogUyA9PiBTZWxlY3RlZAorCSAqCisJICogT2JzZXJ2ZXJlZCB2YWx1ZXMgZm9yIFMxLFMyLFMzIGFyZToKKwkgKiBEaXNjb25uZWN0ID0+IGY4LzU4Lzc4CisJICogQ29ubmVjdCAgICA9PiBmOC81OC83MAorCSAqLworCWlmICgoczEgPT0gMHhiOCkgJiYgKHMyID09IDB4MTgpICYmIChzMyA9PSAweDMwKSkKKwkJcmV0dXJuIDE7CS8qIENvbm5lY3RlZCAqLworCWlmICgoczEgPT0gMHhiOCkgJiYgKHMyID09IDB4MTgpICYmIChzMyA9PSAweDM4KSkKKwkJcmV0dXJuIDA7CS8qIERpc2Nvbm5lY3RlZCAqLworCisJcmV0dXJuIC0xOwkJLyogTm8gZGV2aWNlIHByZXNlbnQgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgaW1tX2Nvbm5lY3QoaW1tX3N0cnVjdCAqZGV2LCBpbnQgZmxhZykKK3sKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisKKwlpbW1fY3BwKHBwYiwgMHhlMCk7CS8qIFNlbGVjdCBkZXZpY2UgMCBpbiBjb21wYXRpYmxlIG1vZGUgKi8KKwlpbW1fY3BwKHBwYiwgMHgzMCk7CS8qIERpc2Nvbm5lY3QgYWxsIGRldmljZXMgKi8KKworCWlmICgoZGV2LT5tb2RlID09IElNTV9FUFBfOCkgfHwKKwkgICAgKGRldi0+bW9kZSA9PSBJTU1fRVBQXzE2KSB8fAorCSAgICAoZGV2LT5tb2RlID09IElNTV9FUFBfMzIpKQorCQlyZXR1cm4gaW1tX2NwcChwcGIsIDB4MjgpOwkvKiBTZWxlY3QgZGV2aWNlIDAgaW4gRVBQIG1vZGUgKi8KKwlyZXR1cm4gaW1tX2NwcChwcGIsIDB4ZTApOwkvKiBTZWxlY3QgZGV2aWNlIDAgaW4gY29tcGF0aWJsZSBtb2RlICovCit9CisKK3N0YXRpYyB2b2lkIGltbV9kaXNjb25uZWN0KGltbV9zdHJ1Y3QgKmRldikKK3sKKwlpbW1fY3BwKGRldi0+YmFzZSwgMHgzMCk7CS8qIERpc2Nvbm5lY3QgYWxsIGRldmljZXMgKi8KK30KKworc3RhdGljIGludCBpbW1fc2VsZWN0KGltbV9zdHJ1Y3QgKmRldiwgaW50IHRhcmdldCkKK3sKKwlpbnQgazsKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisKKwkvKgorCSAqIEZpcnN0bHkgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm90aGluZworCSAqIGhvbGRpbmcgb250byB0aGUgU0NTSSBidXMuCisJICovCisJd19jdHIocHBiLCAweGMpOworCisJayA9IElNTV9TRUxFQ1RfVE1POworCWRvIHsKKwkJay0tOworCX0gd2hpbGUgKChyX3N0cihwcGIpICYgMHgwOCkgJiYgKGspKTsKKworCWlmICghaykKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE5vdyBhc3NlcnQgdGhlIFNDU0kgSUQgKEhPU1QgYW5kIFRBUkdFVCkgb24gdGhlIGRhdGEgYnVzCisJICovCisJd19jdHIocHBiLCAweDQpOworCXdfZHRyKHBwYiwgMHg4MCB8ICgxIDw8IHRhcmdldCkpOworCXVkZWxheSgxKTsKKworCS8qCisJICogRGVhc3NlcnQgU0VMSU4gZmlyc3QgZm9sbG93ZWQgYnkgU1RST0JFCisJICovCisJd19jdHIocHBiLCAweGMpOworCXdfY3RyKHBwYiwgMHhkKTsKKworCS8qCisJICogQUNLIHNob3VsZCBkcm9wIGxvdyB3aGlsZSBTRUxJTiBpcyBkZWFzc2VydGVkLgorCSAqIEZBVUxUIHNob3VsZCBkcm9wIGxvdyB3aGVuIHRoZSBTQ1NJIGRldmljZSBsYXRjaGVzIHRoZSBidXMuCisJICovCisJayA9IElNTV9TRUxFQ1RfVE1POworCWRvIHsKKwkJay0tOworCX0KKwl3aGlsZSAoIShyX3N0cihwcGIpICYgMHgwOCkgJiYgKGspKTsKKworCS8qCisJICogUGxhY2UgdGhlIGludGVyZmFjZSBiYWNrIGludG8gYSBzYW5lIHN0YXRlIChzdGF0dXMgbW9kZSkKKwkgKi8KKwl3X2N0cihwcGIsIDB4Yyk7CisJcmV0dXJuIChrKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGltbV9pbml0KGltbV9zdHJ1Y3QgKmRldikKK3sKKwlpZiAoaW1tX2Nvbm5lY3QoZGV2LCAwKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKwlpbW1fcmVzZXRfcHVsc2UoZGV2LT5iYXNlKTsKKwl1ZGVsYXkoMTAwMCk7CS8qIERlbGF5IHRvIGFsbG93IGRldmljZXMgdG8gc2V0dGxlICovCisJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwl1ZGVsYXkoMTAwMCk7CS8qIEFub3RoZXIgZGVsYXkgdG8gYWxsb3cgZGV2aWNlcyB0byBzZXR0bGUgKi8KKwlyZXR1cm4gZGV2aWNlX2NoZWNrKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGltbV9zZW5kX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWltbV9zdHJ1Y3QgKmRldiA9IGltbV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCWludCBrOworCisJLyogTk9URTogSU1NIHVzZXMgYnl0ZSBwYWlycyAqLworCWZvciAoayA9IDA7IGsgPCBjbWQtPmNtZF9sZW47IGsgKz0gMikKKwkJaWYgKCFpbW1fb3V0KGRldiwgJmNtZC0+Y21uZFtrXSwgMikpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoZSBidWxrIGZsYWcgZW5hYmxlcyBzb21lIG9wdGltaXNhdGlvbnMgaW4gdGhlIGRhdGEgdHJhbnNmZXIgbG9vcHMsCisgKiBpdCBzaG91bGQgYmUgdHJ1ZSBmb3IgYW55IGNvbW1hbmQgdGhhdCB0cmFuc2ZlcnMgZGF0YSBpbiBpbnRlZ3JhbAorICogbnVtYmVycyBvZiBzZWN0b3JzLgorICogCisgKiBUaGUgZHJpdmVyIGFwcGVhcnMgdG8gcmVtYWluIHN0YWJsZSBpZiB3ZSBzcGVlZCB1cCB0aGUgcGFyYWxsZWwgcG9ydAorICogaS9vIGluIHRoaXMgZnVuY3Rpb24sIGJ1dCBub3QgZWxzZXdoZXJlLgorICovCitzdGF0aWMgaW50IGltbV9jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwkvKiBSZXR1cm4gY29kZXM6CisJICogLTEgICAgIEVycm9yCisJICogIDAgICAgIFRvbGQgdG8gc2NoZWR1bGUKKwkgKiAgMSAgICAgRmluaXNoZWQgZGF0YSB0cmFuc2ZlcgorCSAqLworCWltbV9zdHJ1Y3QgKmRldiA9IGltbV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJdW5zaWduZWQgY2hhciByLCB2OworCWludCBmYXN0LCBidWxrLCBzdGF0dXM7CisKKwl2ID0gY21kLT5jbW5kWzBdOworCWJ1bGsgPSAoKHYgPT0gUkVBRF82KSB8fAorCQkodiA9PSBSRUFEXzEwKSB8fCAodiA9PSBXUklURV82KSB8fCAodiA9PSBXUklURV8xMCkpOworCisJLyoKKwkgKiBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZSBkcml2ZSBpcyByZWFkeSB0byBjb211bmljYXRlLAorCSAqIGhlbmNlIG5vIG5lZWQgZm9yIGEgZnVsbCBpbW1fd2FpdC4KKwkgKi8KKwl3X2N0cihwcGIsIDB4MGMpOworCXIgPSAocl9zdHIocHBiKSAmIDB4YjgpOworCisJLyoKKwkgKiB3aGlsZSAoZGV2aWNlIGlzIG5vdCByZWFkeSB0byBzZW5kIHN0YXR1cyBieXRlKQorCSAqICAgICBsb29wOworCSAqLworCXdoaWxlIChyICE9ICh1bnNpZ25lZCBjaGFyKSAweGI4KSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYmVlbiBydW5uaW5nIGZvciBtb3JlIHRoYW4gYSBmdWxsIHRpbWVyIHRpY2sKKwkJICogdGhlbiB0YWtlIGEgcmVzdC4KKwkJICovCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0X2ppZmZpZXMgKyAxKSkKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIEZBSUwgaWY6CisJCSAqIGEpIERyaXZlIHN0YXR1cyBpcyBzY3Jld3kgKCFyZWFkeSAmJiAhcHJlc2VudCkKKwkJICogYikgRHJpdmUgaXMgcmVxdWVzdGluZy9zZW5kaW5nIG1vcmUgZGF0YSB0aGFuIGV4cGVjdGVkCisJCSAqLworCQlpZiAoKChyICYgMHg4OCkgIT0gMHg4OCkgfHwgKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPD0gMCkpIHsKKwkJCWltbV9mYWlsKGRldiwgRElEX0VSUk9SKTsKKwkJCXJldHVybiAtMTsJLyogRVJST1JfUkVUVVJOICovCisJCX0KKwkJLyogZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgYnVyc3QgSS9PICovCisJCWlmIChkZXYtPnJkID09IDApIHsKKwkJCWZhc3QgPSAoYnVsaworCQkJCSYmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID49CisJCQkJICAgIElNTV9CVVJTVF9TSVpFKSkgPyBJTU1fQlVSU1RfU0laRSA6IDI7CisJCQlzdGF0dXMgPSBpbW1fb3V0KGRldiwgY21kLT5TQ3AucHRyLCBmYXN0KTsKKwkJfSBlbHNlIHsKKwkJCWZhc3QgPSAoYnVsaworCQkJCSYmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID49CisJCQkJICAgIElNTV9CVVJTVF9TSVpFKSkgPyBJTU1fQlVSU1RfU0laRSA6IDE7CisJCQlzdGF0dXMgPSBpbW1faW4oZGV2LCBjbWQtPlNDcC5wdHIsIGZhc3QpOworCQl9CisKKwkJY21kLT5TQ3AucHRyICs9IGZhc3Q7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gZmFzdDsKKworCQlpZiAoIXN0YXR1cykgeworCQkJaW1tX2ZhaWwoZGV2LCBESURfQlVTX0JVU1kpOworCQkJcmV0dXJuIC0xOwkvKiBFUlJPUl9SRVRVUk4gKi8KKwkJfQorCQlpZiAoY21kLT5TQ3AuYnVmZmVyICYmICFjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKSB7CisJCQkvKiBpZiBzY2F0dGVyL2dhdGhlciwgYWR2YW5jZSB0byB0aGUgbmV4dCBzZWdtZW50ICovCisJCQlpZiAoY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbC0tKSB7CisJCQkJY21kLT5TQ3AuYnVmZmVyKys7CisJCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9CisJCQkJICAgIGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJCWNtZC0+U0NwLnB0ciA9CisJCQkJICAgIHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJCQkgICAgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisKKwkJCQkvKgorCQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIHRyYW5zZmVyIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCisJCQkJICogb3RoZXJ3aXNlIGl0IG1ha2VzIGltbV9ieXRlX291dCgpIG1lc3N5LgorCQkJCSAqLworCQkJCWlmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICYgMHgwMSkKKwkJCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCsrOworCQkJfQorCQl9CisJCS8qIE5vdyBjaGVjayB0byBzZWUgaWYgdGhlIGRyaXZlIGlzIHJlYWR5IHRvIGNvbXVuaWNhdGUgKi8KKwkJd19jdHIocHBiLCAweDBjKTsKKwkJciA9IChyX3N0cihwcGIpICYgMHhiOCk7CisKKwkJLyogSWYgbm90LCBkcm9wIGJhY2sgZG93biB0byB0aGUgc2NoZWR1bGVyIGFuZCB3YWl0IGEgdGltZXIgdGljayAqLworCQlpZiAoIShyICYgMHg4MCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CQkvKiBGSU5JU0hfUkVUVVJOICovCit9CisKKy8qCisgKiBTaW5jZSB0aGUgSU1NIGl0c2VsZiBkb2Vzbid0IGdlbmVyYXRlIGludGVycnVwdHMsIHdlIHVzZQorICogdGhlIHNjaGVkdWxlcidzIHRhc2sgcXVldWUgdG8gZ2VuZXJhdGUgYSBzdHJlYW0gb2YgY2FsbC1iYWNrcyBhbmQKKyAqIGNvbXBsZXRlIHRoZSByZXF1ZXN0IHdoZW4gdGhlIGRyaXZlIGlzIHJlYWR5LgorICovCitzdGF0aWMgdm9pZCBpbW1faW50ZXJydXB0KHZvaWQgKmRhdGEpCit7CisJaW1tX3N0cnVjdCAqZGV2ID0gKGltbV9zdHJ1Y3QgKikgZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBkZXYtPmN1cl9jbWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNtZCkgeworCQlwcmludGsoIklNTTogYnVnIGluIGltbV9pbnRlcnJ1cHRcbiIpOworCQlyZXR1cm47CisJfQorCWlmIChpbW1fZW5naW5lKGRldiwgY21kKSkgeworCQlJTklUX1dPUksoJmRldi0+aW1tX3RxLCBpbW1faW50ZXJydXB0LCAodm9pZCAqKSBkZXYpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+aW1tX3RxLCAxKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDb21tYW5kIG11c3Qgb2YgY29tcGxldGVkIGhlbmNlIGl0IGlzIHNhZmUgdG8gbGV0IGdvLi4uICovCisjaWYgSU1NX0RFQlVHID4gMAorCXN3aXRjaCAoKGNtZC0+cmVzdWx0ID4+IDE2KSAmIDB4ZmYpIHsKKwljYXNlIERJRF9PSzoKKwkJYnJlYWs7CisJY2FzZSBESURfTk9fQ09OTkVDVDoKKwkJcHJpbnRrKCJpbW06IG5vIGRldmljZSBhdCBTQ1NJIElEICVpXG4iLCBjbWQtPmRldmljZS0+aWQpOworCQlicmVhazsKKwljYXNlIERJRF9CVVNfQlVTWToKKwkJcHJpbnRrKCJpbW06IEJVUyBCVVNZIC0gRVBQIHRpbWVvdXQgZGV0ZWN0ZWRcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9USU1FX09VVDoKKwkJcHJpbnRrKCJpbW06IHVua25vd24gdGltZW91dFxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX0FCT1JUOgorCQlwcmludGsoImltbTogdG9sZCB0byBhYm9ydFxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX1BBUklUWToKKwkJcHJpbnRrKCJpbW06IHBhcml0eSBlcnJvciAoPz8/KVxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX0VSUk9SOgorCQlwcmludGsoImltbTogaW50ZXJuYWwgZHJpdmVyIGVycm9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESURfUkVTRVQ6CisJCXByaW50aygiaW1tOiB0b2xkIHRvIHJlc2V0IGRldmljZVxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX0JBRF9JTlRSOgorCQlwcmludGsoImltbTogYmFkIGludGVycnVwdCAoPz8/KVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiaW1tOiBiYWQgcmV0dXJuIGNvZGUgKCUwMngpXG4iLAorCQkgICAgICAgKGNtZC0+cmVzdWx0ID4+IDE2KSAmIDB4ZmYpOworCX0KKyNlbmRpZgorCisJaWYgKGNtZC0+U0NwLnBoYXNlID4gMSkKKwkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKworCWltbV9wYl9kaXNtaXNzKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlkZXYtPmN1cl9jbWQgPSBOVUxMOworCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgaW1tX2VuZ2luZShpbW1fc3RydWN0ICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisJdW5zaWduZWQgY2hhciBsID0gMCwgaCA9IDA7CisJaW50IHJldHYsIHg7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgYW55IGVycm9ycyB0aGF0IG1heSBoYXZlIG9jY3VycmVkCisJICogSGVyZSB3ZSBjaGVjayBmb3IgaW50ZXJuYWwgZXJyb3JzCisJICovCisJaWYgKGRldi0+ZmFpbGVkKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY21kLT5TQ3AucGhhc2UpIHsKKwljYXNlIDA6CQkvKiBQaGFzZSAwIC0gV2FpdGluZyBmb3IgcGFycG9ydCAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkZXYtPmpzdGFydCArIEhaKSkgeworCQkJLyoKKwkJCSAqIFdlIHdhaXRlZCBtb3JlIHRoYW4gYSBzZWNvbmQKKwkJCSAqIGZvciBwYXJwb3J0IHRvIGNhbGwgdXMKKwkJCSAqLworCQkJaW1tX2ZhaWwoZGV2LCBESURfQlVTX0JVU1kpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CS8qIHdhaXQgdW50aWwgaW1tX3dha2V1cCBjbGFpbXMgcGFycG9ydCAqLworCQkvKiBQaGFzZSAxIC0gQ29ubmVjdGVkICovCisJY2FzZSAxOgorCQlpbW1fY29ubmVjdChkZXYsIENPTk5FQ1RfRVBQX01BWUJFKTsKKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCQkvKiBQaGFzZSAyIC0gV2UgYXJlIG5vdyB0YWxraW5nIHRvIHRoZSBzY3NpIGJ1cyAqLworCWNhc2UgMjoKKwkJaWYgKCFpbW1fc2VsZWN0KGRldiwgY21kLT5kZXZpY2UtPmlkKSkgeworCQkJaW1tX2ZhaWwoZGV2LCBESURfTk9fQ09OTkVDVCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljbWQtPlNDcC5waGFzZSsrOworCisJCS8qIFBoYXNlIDMgLSBSZWFkeSB0byBhY2NlcHQgYSBjb21tYW5kICovCisJY2FzZSAzOgorCQl3X2N0cihwcGIsIDB4MGMpOworCQlpZiAoIShyX3N0cihwcGIpICYgMHg4MCkpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoIWltbV9zZW5kX2NvbW1hbmQoY21kKSkKKwkJCXJldHVybiAwOworCQljbWQtPlNDcC5waGFzZSsrOworCisJCS8qIFBoYXNlIDQgLSBTZXR1cCBzY2F0dGVyL2dhdGhlciBidWZmZXJzICovCisJY2FzZSA0OgorCQlpZiAoY21kLT51c2Vfc2cpIHsKKwkJCS8qIGlmIG1hbnkgYnVmZmVycyBhcmUgYXZhaWxhYmxlLCBzdGFydCBmaWxsaW5nIHRoZSBmaXJzdCAqLworCQkJY21kLT5TQ3AuYnVmZmVyID0KKwkJCSAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQljbWQtPlNDcC5wdHIgPQorCQkJICAgIHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJCSAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJfSBlbHNlIHsKKwkJCS8qIGVsc2UgZmlsbCB0aGUgb25seSBhdmFpbGFibGUgYnVmZmVyICovCisJCQljbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQkJY21kLT5TQ3AucHRyID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJfQorCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCQljbWQtPlNDcC5waGFzZSsrOworCQlpZiAoY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmIDB4MDEpCisJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsKys7CisJCS8qIFBoYXNlIDUgLSBQcmUtRGF0YSB0cmFuc2ZlciBzdGFnZSAqLworCWNhc2UgNToKKwkJLyogU3BpbiBsb2NrIGZvciBCVVNZICovCisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCWlmICghKHJfc3RyKHBwYikgJiAweDgwKSkKKwkJCXJldHVybiAxOworCisJCS8qIFJlcXVpcmUgbmVnb3RpYXRpb24gZm9yIHJlYWQgcmVxdWVzdHMgKi8KKwkJeCA9IChyX3N0cihwcGIpICYgMHhiOCk7CisJCWRldi0+cmQgPSAoeCAmIDB4MTApID8gMSA6IDA7CisJCWRldi0+ZHAgPSAoeCAmIDB4MjApID8gMCA6IDE7CisKKwkJaWYgKChkZXYtPmRwKSAmJiAoZGV2LT5yZCkpCisJCQlpZiAoaW1tX25lZ290aWF0ZShkZXYpKQorCQkJCXJldHVybiAwOworCQljbWQtPlNDcC5waGFzZSsrOworCisJCS8qIFBoYXNlIDYgLSBEYXRhIHRyYW5zZmVyIHN0YWdlICovCisJY2FzZSA2OgorCQkvKiBTcGluIGxvY2sgZm9yIEJVU1kgKi8KKwkJd19jdHIocHBiLCAweDBjKTsKKwkJaWYgKCEocl9zdHIocHBiKSAmIDB4ODApKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGRldi0+ZHApIHsKKwkJCXJldHYgPSBpbW1fY29tcGxldGlvbihjbWQpOworCQkJaWYgKHJldHYgPT0gLTEpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAocmV0diA9PSAwKQorCQkJCXJldHVybiAxOworCQl9CisJCWNtZC0+U0NwLnBoYXNlKys7CisKKwkJLyogUGhhc2UgNyAtIFBvc3QgZGF0YSB0cmFuc2ZlciBzdGFnZSAqLworCWNhc2UgNzoKKwkJaWYgKChkZXYtPmRwKSAmJiAoZGV2LT5yZCkpIHsKKwkJCWlmICgoZGV2LT5tb2RlID09IElNTV9OSUJCTEUpIHx8IChkZXYtPm1vZGUgPT0gSU1NX1BTMikpIHsKKwkJCQl3X2N0cihwcGIsIDB4NCk7CisJCQkJd19jdHIocHBiLCAweGMpOworCQkJCXdfY3RyKHBwYiwgMHhlKTsKKwkJCQl3X2N0cihwcGIsIDB4NCk7CisJCQl9CisJCX0KKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCQkvKiBQaGFzZSA4IC0gUmVhZCBzdGF0dXMvbWVzc2FnZSAqLworCWNhc2UgODoKKwkJLyogQ2hlY2sgZm9yIGRhdGEgb3ZlcnJ1biAqLworCQlpZiAoaW1tX3dhaXQoZGV2KSAhPSAodW5zaWduZWQgY2hhcikgMHhiOCkgeworCQkJaW1tX2ZhaWwoZGV2LCBESURfRVJST1IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGltbV9uZWdvdGlhdGUoZGV2KSkKKwkJCXJldHVybiAwOworCQlpZiAoaW1tX2luKGRldiwgJmwsIDEpKSB7CS8qIHJlYWQgc3RhdHVzIGJ5dGUgKi8KKwkJCS8qIENoZWNrIGZvciBvcHRpb25hbCBtZXNzYWdlIGJ5dGUgKi8KKwkJCWlmIChpbW1fd2FpdChkZXYpID09ICh1bnNpZ25lZCBjaGFyKSAweGI4KQorCQkJCWltbV9pbihkZXYsICZoLCAxKTsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgKyAobCAmIFNUQVRVU19NQVNLKTsKKwkJfQorCQlpZiAoKGRldi0+bW9kZSA9PSBJTU1fTklCQkxFKSB8fCAoZGV2LT5tb2RlID09IElNTV9QUzIpKSB7CisJCQl3X2N0cihwcGIsIDB4NCk7CisJCQl3X2N0cihwcGIsIDB4Yyk7CisJCQl3X2N0cihwcGIsIDB4ZSk7CisJCQl3X2N0cihwcGIsIDB4NCk7CisJCX0KKwkJcmV0dXJuIDA7CS8qIEZpbmlzaGVkICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpbW06IEludmFsaWQgc2NzaSBwaGFzZVxuIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltbV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlpbW1fc3RydWN0ICpkZXYgPSBpbW1fZGV2KGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworCWlmIChkZXYtPmN1cl9jbWQpIHsKKwkJcHJpbnRrKCJJTU06IGJ1ZyBpbiBpbW1fcXVldWVjb21tYW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWRldi0+ZmFpbGVkID0gMDsKKwlkZXYtPmpzdGFydCA9IGppZmZpZXM7CisJZGV2LT5jdXJfY21kID0gY21kOworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsJLyogZGVmYXVsdCByZXR1cm4gY29kZSAqLworCWNtZC0+U0NwLnBoYXNlID0gMDsJLyogYnVzIGZyZWUgKi8KKworCUlOSVRfV09SSygmZGV2LT5pbW1fdHEsIGltbV9pbnRlcnJ1cHQsIGRldik7CisJc2NoZWR1bGVfd29yaygmZGV2LT5pbW1fdHEpOworCisJaW1tX3BiX2NsYWltKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFwcGFyZW50bHkgdGhlIGRpc2stPmNhcGFjaXR5IGF0dHJpYnV0ZSBpcyBvZmYgYnkgMSBzZWN0b3IgCisgKiBmb3IgYWxsIGRpc2sgZHJpdmVzLiAgV2UgYWRkIHRoZSBvbmUgaGVyZSwgYnV0IGl0IHNob3VsZCByZWFsbHkKKyAqIGJlIGRvbmUgaW4gc2QuYy4gIEV2ZW4gaWYgaXQgZ2V0cyBmaXhlZCB0aGVyZSwgdGhpcyB3aWxsIHN0aWxsCisgKiB3b3JrLgorICovCitzdGF0aWMgaW50IGltbV9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQkgc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQoreworCWlwWzBdID0gMHg0MDsKKwlpcFsxXSA9IDB4MjA7CisJaXBbMl0gPSAoKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5ICsgMSkgLyAoaXBbMF0gKiBpcFsxXSk7CisJaWYgKGlwWzJdID4gMTAyNCkgeworCQlpcFswXSA9IDB4ZmY7CisJCWlwWzFdID0gMHgzZjsKKwkJaXBbMl0gPSAoKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5ICsgMSkgLyAoaXBbMF0gKiBpcFsxXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltbV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW1tX3N0cnVjdCAqZGV2ID0gaW1tX2RldihjbWQtPmRldmljZS0+aG9zdCk7CisJLyoKKwkgKiBUaGVyZSBpcyBubyBtZXRob2QgZm9yIGFib3J0aW5nIGNvbW1hbmRzIHNpbmNlIElvbWVnYQorCSAqIGhhdmUgdGllZCB0aGUgU0NTSV9NRVNTQUdFIGxpbmUgaGlnaCBpbiB0aGUgaW50ZXJmYWNlCisJICovCisKKwlzd2l0Y2ggKGNtZC0+U0NwLnBoYXNlKSB7CisJY2FzZSAwOgkJLyogRG8gbm90IGhhdmUgYWNjZXNzIHRvIHBhcnBvcnQgKi8KKwljYXNlIDE6CQkvKiBIYXZlIG5vdCBjb25uZWN0ZWQgdG8gaW50ZXJmYWNlICovCisJCWRldi0+Y3VyX2NtZCA9IE5VTEw7CS8qIEZvcmdldCB0aGUgcHJvYmxlbSAqLworCQlyZXR1cm4gU1VDQ0VTUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIFNDU0kgY29tbWFuZCBzZW50LCBjYW4gbm90IGFib3J0ICovCisJCXJldHVybiBGQUlMRUQ7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaW1tX3Jlc2V0X3B1bHNlKHVuc2lnbmVkIGludCBiYXNlKQoreworCXdfY3RyKGJhc2UsIDB4MDQpOworCXdfZHRyKGJhc2UsIDB4NDApOworCXVkZWxheSgxKTsKKwl3X2N0cihiYXNlLCAweDBjKTsKKwl3X2N0cihiYXNlLCAweDBkKTsKKwl1ZGVsYXkoNTApOworCXdfY3RyKGJhc2UsIDB4MGMpOworCXdfY3RyKGJhc2UsIDB4MDQpOworfQorCitzdGF0aWMgaW50IGltbV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW1tX3N0cnVjdCAqZGV2ID0gaW1tX2RldihjbWQtPmRldmljZS0+aG9zdCk7CisKKwlpZiAoY21kLT5TQ3AucGhhc2UpCisJCWltbV9kaXNjb25uZWN0KGRldik7CisJZGV2LT5jdXJfY21kID0gTlVMTDsJLyogRm9yZ2V0IHRoZSBwcm9ibGVtICovCisKKwlpbW1fY29ubmVjdChkZXYsIENPTk5FQ1RfTk9STUFMKTsKKwlpbW1fcmVzZXRfcHVsc2UoZGV2LT5iYXNlKTsKKwl1ZGVsYXkoMTAwMCk7CQkvKiBkZXZpY2Ugc2V0dGxlIGRlbGF5ICovCisJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwl1ZGVsYXkoMTAwMCk7CQkvKiBkZXZpY2Ugc2V0dGxlIGRlbGF5ICovCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX2NoZWNrKGltbV9zdHJ1Y3QgKmRldikKK3sKKwkvKiBUaGlzIHJvdXRpbmUgbG9va3MgZm9yIGEgZGV2aWNlIGFuZCB0aGVuIGF0dGVtcHRzIHRvIHVzZSBFUFAKKwkgICB0byBzZW5kIGEgY29tbWFuZC4gSWYgYWxsIGdvZXMgYXMgcGxhbm5lZCB0aGVuIEVQUCBpcyBhdmFpbGFibGUuICovCisKKwlzdGF0aWMgY2hhciBjbWRbNl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwlpbnQgbG9vcCwgb2xkX21vZGUsIHN0YXR1cywgaywgcHBiID0gZGV2LT5iYXNlOworCXVuc2lnbmVkIGNoYXIgbDsKKworCW9sZF9tb2RlID0gZGV2LT5tb2RlOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJLyogQXR0ZW1wdCB0byB1c2UgRVBQIGZvciBUZXN0IFVuaXQgUmVhZHkgKi8KKwkJaWYgKChwcGIgJiAweDAwMDcpID09IDB4MDAwMCkKKwkJCWRldi0+bW9kZSA9IElNTV9FUFBfMzI7CisKKwkgICAgICBzZWNvbmRfcGFzczoKKwkJaW1tX2Nvbm5lY3QoZGV2LCBDT05ORUNUX0VQUF9NQVlCRSk7CisJCS8qIFNlbGVjdCBTQ1NJIGRldmljZSAqLworCQlpZiAoIWltbV9zZWxlY3QoZGV2LCBsb29wKSkgeworCQkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50aygiaW1tOiBGb3VuZCBkZXZpY2UgYXQgSUQgJWksIEF0dGVtcHRpbmcgdG8gdXNlICVzXG4iLAorCQkgICAgICAgbG9vcCwgSU1NX01PREVfU1RSSU5HW2Rldi0+bW9kZV0pOworCisJCS8qIFNlbmQgU0NTSSBjb21tYW5kICovCisJCXN0YXR1cyA9IDE7CisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCWZvciAobCA9IDA7IChsIDwgMykgJiYgKHN0YXR1cyk7IGwrKykKKwkJCXN0YXR1cyA9IGltbV9vdXQoZGV2LCAmY21kW2wgPDwgMV0sIDIpOworCisJCWlmICghc3RhdHVzKSB7CisJCQlpbW1fZGlzY29ubmVjdChkZXYpOworCQkJaW1tX2Nvbm5lY3QoZGV2LCBDT05ORUNUX0VQUF9NQVlCRSk7CisJCQlpbW1fcmVzZXRfcHVsc2UoZGV2LT5iYXNlKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCWltbV9kaXNjb25uZWN0KGRldik7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlpZiAoZGV2LT5tb2RlID09IElNTV9FUFBfMzIpIHsKKwkJCQlkZXYtPm1vZGUgPSBvbGRfbW9kZTsKKwkJCQlnb3RvIHNlY29uZF9wYXNzOworCQkJfQorCQkJcHJpbnRrKCJpbW06IFVuYWJsZSB0byBlc3RhYmxpc2ggY29tbXVuaWNhdGlvblxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQl3X2N0cihwcGIsIDB4MGMpOworCisJCWsgPSAxMDAwMDAwOwkvKiAxIFNlY29uZCAqLworCQlkbyB7CisJCQlsID0gcl9zdHIocHBiKTsKKwkJCWstLTsKKwkJCXVkZWxheSgxKTsKKwkJfSB3aGlsZSAoIShsICYgMHg4MCkgJiYgKGspKTsKKworCQlsICY9IDB4Yjg7CisKKwkJaWYgKGwgIT0gMHhiOCkgeworCQkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJCWltbV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQkJaW1tX3Jlc2V0X3B1bHNlKGRldi0+YmFzZSk7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlpbW1fZGlzY29ubmVjdChkZXYpOworCQkJdWRlbGF5KDEwMDApOworCQkJaWYgKGRldi0+bW9kZSA9PSBJTU1fRVBQXzMyKSB7CisJCQkJZGV2LT5tb2RlID0gb2xkX21vZGU7CisJCQkJZ290byBzZWNvbmRfcGFzczsKKwkJCX0KKwkJCXByaW50aworCQkJICAgICgiaW1tOiBVbmFibGUgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb25cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaW1tX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJcHJpbnRrCisJCSAgICAoImltbTogQ29tbXVuaWNhdGlvbiBlc3RhYmxpc2hlZCBhdCAweCV4IHdpdGggSUQgJWkgdXNpbmcgJXNcbiIsCisJCSAgICAgcHBiLCBsb29wLCBJTU1fTU9ERV9TVFJJTkdbZGV2LT5tb2RlXSk7CisJCWltbV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQlpbW1fcmVzZXRfcHVsc2UoZGV2LT5iYXNlKTsKKwkJdWRlbGF5KDEwMDApOworCQlpbW1fZGlzY29ubmVjdChkZXYpOworCQl1ZGVsYXkoMTAwMCk7CisJCXJldHVybiAwOworCX0KKwlwcmludGsoImltbTogTm8gZGV2aWNlcyBmb3VuZFxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgaW1tX2FkanVzdF9xdWV1ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlibGtfcXVldWVfYm91bmNlX2xpbWl0KGRldmljZS0+cmVxdWVzdF9xdWV1ZSwgQkxLX0JPVU5DRV9ISUdIKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaW1tX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5wcm9jX25hbWUJCT0gImltbSIsCisJLnByb2NfaW5mbwkJPSBpbW1fcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiSW9tZWdhIFZQSTIgKGltbSkgaW50ZXJmYWNlIiwKKwkucXVldWVjb21tYW5kCQk9IGltbV9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBpbW1fYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gaW1tX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBpbW1fcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gaW1tX2Jpb3NwYXJhbSwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLnNsYXZlX2FsbG9jCQk9IGltbV9hZGp1c3RfcXVldWUsCisJLnVuY2hlY2tlZF9pc2FfZG1hCT0gMSwgLyogaW1tIGNhbm5vdCBkZWFsIHdpdGggaGlnaG1lbSwgc28KKwkJCQkgICAgICAqIHRoaXMgaXMgYW4gZWFzeSB0cmljayB0byBlbnN1cmUKKwkJCQkgICAgICAqIGFsbCBpbyBwYWdlcyBmb3IgdGhpcyBob3N0IHJlc2lkZQorCQkJCSAgICAgICogaW4gbG93IG1lbW9yeSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgUGFyYWxsZWwgcG9ydCBwcm9iaW5nIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIExJU1RfSEVBRChpbW1faG9zdHMpOworCitzdGF0aWMgaW50IF9faW1tX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlpbW1fc3RydWN0ICpkZXY7CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdGluZyk7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHBvcnRzOworCWludCBtb2RlcywgcHBiOworCWludCBlcnIgPSAtRU5PTUVNOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmd2FpdGluZyk7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihpbW1fc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKGltbV9zdHJ1Y3QpKTsKKworCWRldi0+YmFzZSA9IC0xOworCWRldi0+bW9kZSA9IElNTV9BVVRPREVURUNUOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpc3QpOworCisJZGV2LT5kZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwYiwgImltbSIsIE5VTEwsIGltbV93YWtldXAsCisJCQkJCQlOVUxMLCAwLCBkZXYpOworCisJaWYgKCFkZXYtPmRldikKKwkJZ290byBvdXQ7CisKKworCS8qIENsYWltIHRoZSBidXMgc28gaXQgcmVtZW1iZXJzIHdoYXQgd2UgZG8gdG8gdGhlIGNvbnRyb2wKKwkgKiByZWdpc3RlcnMuIFsgQ1RSIGFuZCBFQ1AgXQorCSAqLworCWVyciA9IC1FQlVTWTsKKwlkZXYtPndhaXRpbmcgPSAmd2FpdGluZzsKKwlwcmVwYXJlX3RvX3dhaXQoJndhaXRpbmcsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJaWYgKGltbV9wYl9jbGFpbShkZXYpKQorCQlzY2hlZHVsZV90aW1lb3V0KDMgKiBIWik7CisJaWYgKGRldi0+d2FudGVkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW1tJWQ6IGZhaWxlZCB0byBjbGFpbSBwYXJwb3J0IGJlY2F1c2UgIgorCQkJImEgcGFyZGV2aWNlIGlzIG93bmluZyB0aGUgcG9ydCBmb3IgdG9vIGxvbmcgIgorCQkJInRpbWUhXG4iLCBwYi0+bnVtYmVyKTsKKwkJaW1tX3BiX2Rpc21pc3MoZGV2KTsKKwkJZGV2LT53YWl0aW5nID0gTlVMTDsKKwkJZmluaXNoX3dhaXQoJndhaXRpbmcsICZ3YWl0KTsKKwkJZ290byBvdXQxOworCX0KKwlkZXYtPndhaXRpbmcgPSBOVUxMOworCWZpbmlzaF93YWl0KCZ3YWl0aW5nLCAmd2FpdCk7CisJcHBiID0gZGV2LT5iYXNlID0gZGV2LT5kZXYtPnBvcnQtPmJhc2U7CisJZGV2LT5iYXNlX2hpID0gZGV2LT5kZXYtPnBvcnQtPmJhc2VfaGk7CisJd19jdHIocHBiLCAweDBjKTsKKwltb2RlcyA9IGRldi0+ZGV2LT5wb3J0LT5tb2RlczsKKworCS8qIE1vZGUgZGV0ZWN0aW9uIHdvcmtzIHVwIHRoZSBjaGFpbiBvZiBzcGVlZAorCSAqIFRoaXMgYXZvaWRzIGEgbmFzdHkgaWYtdGhlbi1lbHNlLWlmLS4uLiB0cmVlCisJICovCisJZGV2LT5tb2RlID0gSU1NX05JQkJMRTsKKworCWlmIChtb2RlcyAmIFBBUlBPUlRfTU9ERV9UUklTVEFURSkKKwkJZGV2LT5tb2RlID0gSU1NX1BTMjsKKworCS8qIERvbmUgY29uZmlndXJhdGlvbiAqLworCisJZXJyID0gaW1tX2luaXQoZGV2KTsKKworCWltbV9wYl9yZWxlYXNlKGRldik7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKwkvKiBub3cgdGhlIGdsdWUgLi4uICovCisJaWYgKGRldi0+bW9kZSA9PSBJTU1fTklCQkxFIHx8IGRldi0+bW9kZSA9PSBJTU1fUFMyKQorCQlwb3J0cyA9IDM7CisJZWxzZQorCQlwb3J0cyA9IDg7CisKKwlJTklUX1dPUksoJmRldi0+aW1tX3RxLCBpbW1faW50ZXJydXB0LCBkZXYpOworCisJZXJyID0gLUVOT01FTTsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpbW1fdGVtcGxhdGUsIHNpemVvZihpbW1fc3RydWN0ICopKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0MTsKKwlob3N0LT5pb19wb3J0ID0gcGItPmJhc2U7CisJaG9zdC0+bl9pb19wb3J0ID0gcG9ydHM7CisJaG9zdC0+ZG1hX2NoYW5uZWwgPSAtMTsKKwlob3N0LT51bmlxdWVfaWQgPSBwYi0+bnVtYmVyOworCSooaW1tX3N0cnVjdCAqKikmaG9zdC0+aG9zdGRhdGEgPSBkZXY7CisJZGV2LT5ob3N0ID0gaG9zdDsKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmxpc3QsICZpbW1faG9zdHMpOworCWVyciA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgTlVMTCk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCXJldHVybiAwOworCitvdXQyOgorCWxpc3RfZGVsX2luaXQoJmRldi0+bGlzdCk7CisJc2NzaV9ob3N0X3B1dChob3N0KTsKK291dDE6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShkZXYtPmRldik7CitvdXQ6CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpbW1fYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwYikKK3sKKwlfX2ltbV9hdHRhY2gocGIpOworfQorCitzdGF0aWMgdm9pZCBpbW1fZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwYikKK3sKKwlpbW1fc3RydWN0ICpkZXY7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZpbW1faG9zdHMsIGxpc3QpIHsKKwkJaWYgKGRldi0+ZGV2LT5wb3J0ID09IHBiKSB7CisJCQlsaXN0X2RlbF9pbml0KCZkZXYtPmxpc3QpOworCQkJc2NzaV9yZW1vdmVfaG9zdChkZXYtPmhvc3QpOworCQkJc2NzaV9ob3N0X3B1dChkZXYtPmhvc3QpOworCQkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShkZXYtPmRldik7CisJCQlrZnJlZShkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgaW1tX2RyaXZlciA9IHsKKwkubmFtZQk9ICJpbW0iLAorCS5hdHRhY2gJPSBpbW1fYXR0YWNoLAorCS5kZXRhY2gJPSBpbW1fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW1tX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJpbW06IFZlcnNpb24gJXNcbiIsIElNTV9WRVJTSU9OKTsKKwlyZXR1cm4gcGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJmltbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW1tX2RyaXZlcl9leGl0KHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmaW1tX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGltbV9kcml2ZXJfaW5pdCk7Cittb2R1bGVfZXhpdChpbW1fZHJpdmVyX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW1tLmggYi9kcml2ZXJzL3Njc2kvaW1tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzYWViZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pbW0uaApAQCAtMCwwICsxLDE0NCBAQAorCisvKiAgRHJpdmVyIGZvciB0aGUgSW9tZWdhIE1hdGNoTWFrZXIgcGFyYWxsZWwgcG9ydCBTQ1NJIEhCQSBlbWJlZGRlZCBpbiAKKyAqIHRoZSBJb21lZ2EgWklQIFBsdXMgZHJpdmUKKyAqIAorICogKGMpIDE5OTggICAgIERhdmlkIENhbXBiZWxsICAgICBjYW1wYmVsbEB0b3JxdWUubmV0CisgKgorICogUGxlYXNlIG5vdGUgdGhhdCBJIGxpdmUgaW4gUGVydGgsIFdlc3Rlcm4gQXVzdHJhbGlhLiBHTVQrMDgwMAorICovCisKKyNpZm5kZWYgX0lNTV9ICisjZGVmaW5lIF9JTU1fSAorCisjZGVmaW5lICAgSU1NX1ZFUlNJT04gICAiMi4wNSAoZm9yIExpbnV4IDIuNC4wKSIKKworLyogCisgKiAxMCBBcHIgMTk5OCAoR29vZCBGcmlkYXkpIC0gUmVjZWl2ZWQgRU4xNDQzMDIgYnkgZW1haWwgZnJvbSBJb21lZ2EuCisgKiBTY2FycnkgdGhpbmcgaXMgdGhlIGxldmVsIG9mIHN1cHBvcnQgZnJvbSBvbmUgb2YgdGhlaXIgbWFuYWdlcnMuCisgKiBUaGUgb251cyBpcyBub3cgb24gdXMgKHRoZSBkZXZlbG9wZXJzKSB0byBzaHV0IHVwIGFuZCBzdGFydCBjb2RpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMUFwcjk4IFsgMC4xMCBdCisgKgorICogLS0tIFNOSVAgLS0tCisgKgorICogSXQgbWFuYWdlcyB0byBmaW5kIHRoZSBkcml2ZSB3aGljaCBpcyBhIGdvb2Qgc3RhcnQuIFdyaXRpbmcgZGF0YSBkdXJpbmcKKyAqIGRhdGEgcGhhc2UgaXMga25vd24gdG8gYmUgYnJva2VuIChkdWUgdG8gcmVxdWlyZW1lbnRzIG9mIHR3byBieXRlIHdyaXRlcykuCisgKiBSZW1vdmluZyAiUGhhc2UiIGRlYnVnIG1lc3NhZ2VzLgorICoKKyAqIFBTOiBUb29rIGZvdXIgaG91cnMgb2YgY29kaW5nIGFmdGVyIEkgYm91Z2h0IGEgZHJpdmUuCisgKiAgICAgIEFOWkFDIERheSAoQXVzICJXYXIgVmV0ZXJhbnMgSG9saWRheSIpICAyNUFwcjk4IFsgMC4xNCBdCisgKgorICogVGVuIG1pbnV0ZXMgbGF0ZXIgYWZ0ZXIgYSBmZXcgZml4ZXMuLi4uIChMSVRFUkFMTFkhISEpCisgKiBIYXZlIG1vdW50ZWQgZGlzaywgY29waWVkIGZpbGUsIGRpc21vdW50ZWQgZGlzaywgcmVtb3VudCBkaXNrLCBkaWZmIGZpbGUKKyAqICAgICAgICAgICAgICAgICAgICAtLS0tLSAgSXQgYWN0dWFsbHkgd29ya3MhISEgLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1QXByOTggWyAwLjE1IF0KKyAqCisgKiBUd2VudHkgbWludXRlcyBvZiBtdWNraW5nIGFyb3VuZCwgcmVhcmFuZ2VkIHRoZSBJRUVFIG5lZ290aWF0ZSBtZWNoYW5pc20uCisgKiBOb3cgaGF2ZSBieXRlIG1vZGUgd29ya2luZyAob25seSBFUFAgYW5kIEVDUCB0byBnbyBub3cuLi4gOj0pCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNkFwcjk4IFsgMC4xNiBdCisgKgorICogVGhpcnR5IG1pbnV0ZXMgb2YgZnVydGhlciBjb2RpbmcgcmVzdWx0cyBpbiBFUFAgd29ya2luZyBvbiBteSBtYWNoaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjdBcHI5OCBbIDAuMTcgXQorICoKKyAqIER1ZSB0byB3b3JrIGNvbW1pdG1lbnRzIGFuZCBpbmFiaWxpdHkgdG8gZ2V0IGEgInRydWUiIEVDUCBtb2RlIGZ1bmN0aW9uaW5nCisgKiBJIGhhdmUgZGVjaWRlZCB0byBjb2RlIHRoZSBwYXJwb3J0IHN1cHBvcnQgaW50byBpbW0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOUp1bjk4IFsgMC4xOCBdCisgKgorICogRHJpdmVyIGlzIG5vdyBvdXQgb2YgYmV0YSB0ZXN0aW5nLgorICogU3VwcG9ydCBmb3IgcGFycG9ydCBoYXMgYmVlbiBhZGRlZC4KKyAqIE5vdyBkaXN0cmlidXRlZCB3aXRoIHRoZSBwcGEgZHJpdmVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTJKdW45OCBbIDIuMDAgXQorICoKKyAqIEVyci4uIEl0IGFwcGVhcnMgdGhhdCBpbW0tMi4wMCB3YXMgYnJva2VuLi4uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMThKdW45OCBbIDIuMDEgXQorICoKKyAqIFBhdGNoIGFwcGxpZWQgdG8gc3luYyB0aGlzIGFnYWluc3QgdGhlIExpbnV4IDIuMS54IGtlcm5lbCBjb2RlCisgKiBJbmNsdWRlZCBxYm9vdF96aXAuc2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxSnVuOTggWyAyLjAyIF0KKyAqCisgKiBPdGhlciBjbGVhbiB1cHMgaW5jbHVkZSB0aGUgZm9sbG93IGNoYW5nZXM6CisgKiAgICBDT05GSUdfU0NTSV9QUEFfSEFWRV9QRURBTlRJQyA9PiBDT05GSUdfU0NTSV9JWklQX0VQUDE2CisgKiAgICBhZGRlZCBDT05GSUdfU0NTSV9JWklQX1NMT1dfQ1RSIG9wdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wM10KKyAqICBGaXgga2VybmVsIHBhbmljIG9uIHNjc2kgdGltZW91dC4JCTIwQXVnMDAgWzIuMDRdCisgKgorICogIEF2b2lkIGlvX3JlcXVlc3RfbG9jayBwcm9ibGVtcy4KKyAqICBKb2huIENhdmFuIDxqb2huY2F2YW5AaG9tZS5jb20+CQkxNk5vdjAwIFsyLjA1XQorICovCisvKiAtLS0tLS0gRU5EIE9GIFVTRVIgQ09ORklHVVJBQkxFIFBBUkFNRVRFUlMgLS0tLS0gKi8KKworI2luY2x1ZGUgIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSAgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlICA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSAgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlICA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlICA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICA8YXNtL2lvLmg+CisjaW5jbHVkZSAgPHNjc2kvc2NzaV9ob3N0Lmg+CisvKiBiYXR0ZXJpZXMgbm90IGluY2x1ZGVkIDotKSAqLworCisvKgorICogbW9kZXMgaW4gd2hpY2ggdGhlIGRyaXZlciBjYW4gb3BlcmF0ZSAKKyAqLworI2RlZmluZSAgIElNTV9BVVRPREVURUNUICAgICAgICAwCS8qIEF1dG9kZXRlY3QgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgIElNTV9OSUJCTEUgICAgICAgICAgICAxCS8qIHdvcmsgaW4gc3RhbmRhcmQgNCBiaXQgbW9kZSAgICAqLworI2RlZmluZSAgIElNTV9QUzIgICAgICAgICAgICAgICAyCS8qIFBTLzIgYnl0ZSBtb2RlICAgICAgICAgKi8KKyNkZWZpbmUgICBJTU1fRVBQXzggICAgICAgICAgICAgMwkvKiBFUFAgbW9kZSwgOCBiaXQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICBJTU1fRVBQXzE2ICAgICAgICAgICAgNAkvKiBFUFAgbW9kZSwgMTYgYml0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICBJTU1fRVBQXzMyICAgICAgICAgICAgNQkvKiBFUFAgbW9kZSwgMzIgYml0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICBJTU1fVU5LTk9XTiAgICAgICAgICAgNgkvKiBKdXN0IGluIGNhc2UuLi4gICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGNoYXIgKklNTV9NT0RFX1NUUklOR1tdID0KK3sKKwlbSU1NX0FVVE9ERVRFQ1RdID0gIkF1dG9kZXRlY3QiLAorCVtJTU1fTklCQkxFXQkgPSAiU1BQIiwKKwlbSU1NX1BTMl0JID0gIlBTLzIiLAorCVtJTU1fRVBQXzhdCSA9ICJFUFAgOCBiaXQiLAorCVtJTU1fRVBQXzE2XQkgPSAiRVBQIDE2IGJpdCIsCisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9FUFAxNgorCVtJTU1fRVBQXzMyXQkgPSAiRVBQIDE2IGJpdCIsCisjZWxzZQorCVtJTU1fRVBQXzMyXQkgPSAiRVBQIDMyIGJpdCIsCisjZW5kaWYKKwlbSU1NX1VOS05PV05dCSA9ICJVbmtub3duIiwKK307CisKKy8qIG90aGVyIG9wdGlvbnMgKi8KKyNkZWZpbmUgSU1NX0JVUlNUX1NJWkUJNTEyCS8qIGRhdGEgYnVyc3Qgc2l6ZSAqLworI2RlZmluZSBJTU1fU0VMRUNUX1RNTyAgNTAwCS8qIDUwMCBob3cgbG9uZyB0byB3YWl0IGZvciB0YXJnZXQgPyAqLworI2RlZmluZSBJTU1fU1BJTl9UTU8gICAgNTAwMAkvKiA1MDAwMCBpbW1fd2FpdCBsb29wIGxpbWl0ZXIgKi8KKyNkZWZpbmUgSU1NX0RFQlVHCTAJLyogZGVidWdnaW5nIG9wdGlvbiAqLworI2RlZmluZSBJTl9FUFBfTU9ERSh4KSAoeCA9PSBJTU1fRVBQXzggfHwgeCA9PSBJTU1fRVBQXzE2IHx8IHggPT0gSU1NX0VQUF8zMikKKworLyogYXJncyB0byBpbW1fY29ubmVjdCAqLworI2RlZmluZSBDT05ORUNUX0VQUF9NQVlCRSAxCisjZGVmaW5lIENPTk5FQ1RfTk9STUFMICAwCisKKyNkZWZpbmUgcl9kdHIoeCkgICAgICAgICh1bnNpZ25lZCBjaGFyKWluYigoeCkpCisjZGVmaW5lIHJfc3RyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzEpCisjZGVmaW5lIHJfY3RyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzIpCisjZGVmaW5lIHJfZXBwKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzQpCisjZGVmaW5lIHJfZmlmbyh4KSAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKSAgIC8qIHggbXVzdCBiZSBiYXNlX2hpICovCisJCQkJCS8qIE9uIFBDSSBpczogYmFzZSsweDQwMCAhPSBiYXNlX2hpICovCisjZGVmaW5lIHJfZWNyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzIpIC8qIHggbXVzdCBiZSBiYXNlX2hpICovCisKKyNkZWZpbmUgd19kdHIoeCx5KSAgICAgIG91dGIoeSwgKHgpKQorI2RlZmluZSB3X3N0cih4LHkpICAgICAgb3V0Yih5LCAoeCkrMSkKKyNkZWZpbmUgd19lcHAoeCx5KSAgICAgIG91dGIoeSwgKHgpKzQpCisjZGVmaW5lIHdfZmlmbyh4LHkpICAgICBvdXRiKHksICh4KSkgICAgIC8qIHggbXVzdCBiZSBiYXNlX2hpICovCisjZGVmaW5lIHdfZWNyKHgseSkgICAgICBvdXRiKHksICh4KSsweDIpIC8qIHggbXVzdCBiZSBiYXNlX2hpICovCisKKyNpZmRlZiBDT05GSUdfU0NTSV9JWklQX1NMT1dfQ1RSCisjZGVmaW5lIHdfY3RyKHgseSkgICAgICBvdXRiX3AoeSwgKHgpKzIpCisjZWxzZQorI2RlZmluZSB3X2N0cih4LHkpICAgICAgb3V0Yih5LCAoeCkrMikKKyNlbmRpZgorCitzdGF0aWMgaW50IGltbV9lbmdpbmUoaW1tX3N0cnVjdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOworCisjZW5kaWYJCQkJLyogX0lNTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW4yMDAwLmMgYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pbjIwMDAuYwpAQCAtMCwwICsxLDIzMjMgQEAKKy8qCisgKiAgICBpbjIwMDAuYyAtICBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgIEFsd2F5cyBJTjIwMDAgSVNBIFNDU0kgY2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCisgKiAgICBqb2huQGdlb2xvZy5jb20KKyAqICAgIGpzaGlmZmxlQG5ldGNvbS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqCisgKiBEcmV3IEVja2hhcmR0J3MgZXhjZWxsZW50ICdHZW5lcmljIE5DUjUzODAnIHNvdXJjZXMgcHJvdmlkZWQKKyAqIG11Y2ggb2YgdGhlIGluc3BpcmF0aW9uIGFuZCBzb21lIG9mIHRoZSBjb2RlIGZvciB0aGlzIGRyaXZlci4KKyAqIFRoZSBMaW51eCBJTjIwMDAgZHJpdmVyIGRpc3RyaWJ1dGVkIGluIHRoZSBMaW51eCBrZXJuZWxzIHRocm91Z2gKKyAqIHZlcnNpb24gMS4yLjEzIHdhcyBhbiBleHRyZW1lbHkgdmFsdWFibGUgcmVmZXJlbmNlIG9uIHRoZSBhcmNhbmUKKyAqIChhbmQgc3RpbGwgbXlzdGVyaW91cykgd29ya2luZ3Mgb2YgdGhlIElOMjAwMCdzIGZpZm8uIEl0IGFsc28KKyAqIGlzIHdoZXJlIEkgbGlmdGVkIGluMjAwMF9iaW9zcGFyYW0oKSwgdGhlIGdpc3Qgb2YgdGhlIGNhcmQKKyAqIGRldGVjdGlvbiBzY2hlbWUsIGFuZCBvdGhlciBiaXRzIG9mIGNvZGUuIE1hbnkgdGhhbmtzIHRvIHRoZQorICogdGFsZW50ZWQgYW5kIGNvdXJhZ2VvdXMgcGVvcGxlIHdobyB3cm90ZSwgY29udHJpYnV0ZWQgdG8sIGFuZAorICogbWFpbnRhaW5lZCB0aGF0IGRyaXZlciAoaW5jbHVkaW5nIEJyYWQgTWNMZWFuLCBTaGF1biBTYXZhZ2UsCisgKiBCaWxsIEVhcm5lc3QsIExhcnJ5IERvb2xpdHRsZSwgUm9nZXIgU3Vuc2hpbmUsIEpvaG4gTHVja2V5LAorICogTWF0dCBQb3N0aWZmLCBQZXRlciBMdSwgemVydWNoYUBzaGVsbC5wb3J0YWwuY29tLCBhbmQgRXJpYworICogWW91bmdkYWxlKS4gSSBzaG91bGQgYWxzbyBtZW50aW9uIHRoZSBkcml2ZXIgd3JpdHRlbiBieQorICogSGFtaXNoIE1hY2RvbmFsZCBmb3IgdGhlIChHQVNQISkgQW1pZ2EgQTIwOTEgY2FyZCwgaW5jbHVkZWQKKyAqIGluIHRoZSBMaW51eC1tNjhrIGRpc3RyaWJ1dGlvbjsgaXQgZ2F2ZSBtZSBhIGdvb2QgaW5pdGlhbAorICogdW5kZXJzdGFuZGluZyBvZiB0aGUgcHJvcGVyIHdheSB0byBydW4gYSBXRDMzYzkzIGNoaXAsIGFuZCBJCisgKiBlbmRlZCB1cCBzdGVhbGluZyBsb3RzIG9mIGNvZGUgZnJvbSBpdC4KKyAqCisgKiBfVGhpc18gZHJpdmVyIGlzIChJIGZlZWwpIGFuIGltcHJvdmVtZW50IG92ZXIgdGhlIG9sZCBvbmUgaW4KKyAqIHNldmVyYWwgcmVzcGVjdHM6CisgKiAgICAtICBBbGwgcHJvYmxlbXMgcmVsYXRpbmcgdG8gdGhlIGRhdGEgc2l6ZSBvZiBhIFNDU0kgcmVxdWVzdCBhcmUKKyAqICAgICAgICAgIGdvbmUgKGFzIGZhciBhcyBJIGtub3cpLiBUaGUgb2xkIGRyaXZlciBjb3VsZG4ndCBoYW5kbGUKKyAqICAgICAgICAgIHN3YXBwaW5nIHRvIHBhcnRpdGlvbnMgYmVjYXVzZSB0aGF0IGludm9sdmVkIDRrIGJsb2Nrcywgbm9yCisgKiAgICAgICAgICBjb3VsZCBpdCBkZWFsIHdpdGggdGhlIHN0LmMgdGFwZSBkcml2ZXIgdW5tb2RpZmllZCwgYmVjYXVzZQorICogICAgICAgICAgdGhhdCB1c3VhbGx5IGludm9sdmVkIDRrIC0gMzJrIGJsb2Nrcy4gVGhlIG9sZCBkcml2ZXIgbmV2ZXIKKyAqICAgICAgICAgIHF1aXRlIGdvdCBhd2F5IGZyb20gYSBtb3JiaWQgZGVwZW5kZW5jZSBvbiAyayBibG9jayBzaXplcyAtCisgKiAgICAgICAgICB3aGljaCBvZiBjb3Vyc2UgaXMgdGhlIHNpemUgb2YgdGhlIGNhcmQncyBmaWZvLgorICoKKyAqICAgIC0gIFRhcmdldCBEaXNjb25uZWN0aW9uL1JlY29ubmVjdGlvbiBpcyBub3cgc3VwcG9ydGVkLiBBbnkKKyAqICAgICAgICAgIHN5c3RlbSB3aXRoIG1vcmUgdGhhbiBvbmUgZGV2aWNlIGFjdGl2ZSBvbiB0aGUgU0NTSSBidXMKKyAqICAgICAgICAgIHdpbGwgYmVuZWZpdCBmcm9tIHRoaXMuIFRoZSBkcml2ZXIgZGVmYXVsdHMgdG8gd2hhdCBJJ20KKyAqICAgICAgICAgIGNhbGxpbmcgJ2FkYXB0aXZlIGRpc2Nvbm5lY3QnIC0gbWVhbmluZyB0aGF0IGVhY2ggY29tbWFuZAorICogICAgICAgICAgaXMgZXZhbHVhdGVkIGluZGl2aWR1YWxseSBhcyB0byB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQKKyAqICAgICAgICAgIGJlIHJ1biB3aXRoIHRoZSBvcHRpb24gdG8gZGlzY29ubmVjdC9yZXNlbGVjdCAoaWYgdGhlCisgKiAgICAgICAgICBkZXZpY2UgY2hvb3NlcyksIG9yIGFzIGEgIlNDU0ktYnVzLWhvZyIuCisgKgorICogICAgLSAgU3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMgYXJlIG5vdyBzdXBwb3J0ZWQuIEJlY2F1c2UgdGhlcmUKKyAqICAgICAgICAgIGFyZSBhIGZldyBkZXZpY2VzIChhbmQgbWFueSBpbXByb3Blcmx5IHRlcm1pbmF0ZWQgc3lzdGVtcykKKyAqICAgICAgICAgIHRoYXQgY2hva2Ugd2hlbiBkb2luZyBzeW5jLCB0aGUgZGVmYXVsdCBpcyBzeW5jIERJU0FCTEVECisgKiAgICAgICAgICBmb3IgYWxsIGRldmljZXMuIFRoaXMgZmFzdGVyIHByb3RvY29sIGNhbiAoYW5kIHNob3VsZCEpCisgKiAgICAgICAgICBiZSBlbmFibGVkIG9uIHNlbGVjdGVkIGRldmljZXMgdmlhIHRoZSBjb21tYW5kLWxpbmUuCisgKgorICogICAgLSAgUnVudGltZSBvcGVyYXRpbmcgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB0aHJvdWdoCisgKiAgICAgICBlaXRoZXIgdGhlIExJTE8gb3IgdGhlICdpbnNtb2QnIGNvbW1hbmQgbGluZS4gRm9yIExJTE8gZG86CisgKiAgICAgICAgICAiaW4yMDAwPWJsYWgsYmxhaCxibGFoIgorICogICAgICAgYW5kIHdpdGggaW5zbW9kIGdvIGxpa2U6CisgKiAgICAgICAgICAiaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvaW4yMDAwLm8gc2V0dXBfc3RyaW5ncz1ibGFoLGJsYWgiCisgKiAgICAgICBUaGUgZGVmYXVsdHMgc2hvdWxkIGJlIGdvb2QgZm9yIG1vc3QgcGVvcGxlLiBTZWUgdGhlIGNvbW1lbnQKKyAqICAgICAgIGZvciAnc2V0dXBfc3RyaW5ncycgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAtICBUaGUgb2xkIGRyaXZlciByZWxpZWQgZXhjbHVzaXZlbHkgb24gd2hhdCB0aGUgV2VzdGVybiBEaWdpdGFsCisgKiAgICAgICAgICBkb2NzIGNhbGwgIkNvbWJpbmF0aW9uIExldmVsIDIgQ29tbWFuZHMiLCB3aGljaCBhcmUgYSBncmVhdAorICogICAgICAgICAgaWRlYSBpbiB0aGF0IHRoZSBDUFUgaXMgcmVsaWV2ZWQgb2YgYSBsb3Qgb2YgaW50ZXJydXB0CisgKiAgICAgICAgICBvdmVyaGVhZC4gSG93ZXZlciwgYnkgYWNjZXB0aW5nIGEgY2VydGFpbiAodXNlci1zZXR0YWJsZSkKKyAqICAgICAgICAgIGFtb3VudCBvZiBhZGRpdGlvbmFsIGludGVycnVwdHMsIHRoaXMgZHJpdmVyIGFjaGlldmVzCisgKiAgICAgICAgICBiZXR0ZXIgY29udHJvbCBvdmVyIHRoZSBTQ1NJIGJ1cywgYW5kIGRhdGEgdHJhbnNmZXJzIGFyZQorICogICAgICAgICAgYWxtb3N0IGFzIGZhc3Qgd2hpbGUgYmVpbmcgbXVjaCBlYXNpZXIgdG8gZGVmaW5lLCB0cmFjaywKKyAqICAgICAgICAgIGFuZCBkZWJ1Zy4KKyAqCisgKiAgICAtICBZb3UgY2FuIGZvcmNlIGRldGVjdGlvbiBvZiBhIGNhcmQgd2hvc2UgQklPUyBoYXMgYmVlbiBkaXNhYmxlZC4KKyAqCisgKiAgICAtICBNdWx0aXBsZSBJTjIwMDAgY2FyZHMgbWlnaHQgYWxtb3N0IGJlIHN1cHBvcnRlZC4gSSd2ZSB0cmllZCB0bworICogICAgICAga2VlcCBpdCBpbiBtaW5kLCBidXQgaGF2ZSBubyB3YXkgdG8gdGVzdC4uLgorICoKKyAqCisgKiBUT0RPOgorICogICAgICAgdGFnZ2VkIHF1ZXVpbmcuIG11bHRpcGxlIGNhcmRzLgorICoKKyAqCisgKiBOT1RFOgorICogICAgICAgV2hlbiB1c2luZyB0aGlzIG9yIGFueSBvdGhlciBTQ1NJIGRyaXZlciBhcyBhIG1vZHVsZSwgeW91J2xsCisgKiAgICAgICBmaW5kIHRoYXQgd2l0aCB0aGUgc3RvY2sga2VybmVsLCBhdCBtb3N0IF90d29fIFNDU0kgaGFyZAorICogICAgICAgZHJpdmVzIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIGRldmljZSBsaXN0IChpZSwgdXNhYmxlKS4KKyAqICAgICAgIElmIHlvdXIgSU4yMDAwIGNhcmQgaGFzIG1vcmUgdGhhbiAyIGRpc2tzIG9uIGl0cyBidXMsIHlvdQorICogICAgICAgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlIGRlZmluZSBvZiAnU0RfRVhUUkFfREVWUycgaW4gdGhlCisgKiAgICAgICAnaG9zdHMuaCcgZmlsZSBmcm9tIDIgdG8gd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUuIEl0IHRvb2sKKyAqICAgICAgIG1lIGEgd2hpbGUgdG8gdHJhY2sgZG93biB0aGlzIHN1cnByaXNpbmdseSBvYnNjdXJlIGFuZAorICogICAgICAgdW5kb2N1bWVudGVkIGxpdHRsZSAiZmVhdHVyZSIuCisgKgorICoKKyAqIFBlb3BsZSB3aXRoIGJ1ZyByZXBvcnRzLCB3aXNoLWxpc3RzLCBjb21wbGFpbnRzLCBjb21tZW50cywKKyAqIG9yIGltcHJvdmVtZW50cyBhcmUgYXNrZWQgdG8gcGFoLWxlZWV6IGVtYWlsIG1lIChKb2huIFNoaWZmbGV0dCkKKyAqIGF0IGpvaG5AZ2VvbG9nLmNvbSBvciBqc2hpZmZsZUBuZXRjb20uY29tISBJJ20gYW54aW91cyB0byBnZXQKKyAqIHRoaXMgdGhpbmcgaW50byBhcyBnb29kIGEgc2hhcGUgYXMgcG9zc2libGUsIGFuZCBJJ20gcG9zaXRpdmUKKyAqIHRoZXJlIGFyZSBsb3RzIG9mIGx1cmtpbmcgYnVncyBhbmQgIlN0dXBpZCBQbGFjZXMiLgorICoKKyAqIFVwZGF0ZWQgZm9yIExpbnV4IDIuNSBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoJLSBVc2luZyBuZXdfZWggaGFuZGxlcgorICoJLSBIb3BlZnVsbHkgZ290IGFsbCB0aGUgbG9ja2luZyByaWdodCBhZ2FpbgorICoJU2VlICJGSVhNRSIgbm90ZXMgZm9yIGl0ZW1zIHRoYXQgY291bGQgZG8gd2l0aCBtb3JlIHdvcmsKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNkZWZpbmUgSU4yMDAwX1ZFUlNJT04gICAgIjEuMzMtMi41IgorI2RlZmluZSBJTjIwMDBfREFURSAgICAgICAiMjAwMi8xMS8wMyIKKworI2luY2x1ZGUgImluMjAwMC5oIgorCisKKy8qCisgKiAnc2V0dXBfc3RyaW5ncycgaXMgYSBzaW5nbGUgc3RyaW5nIHVzZWQgdG8gcGFzcyBvcGVyYXRpbmcgcGFyYW1ldGVycyBhbmQKKyAqIHNldHRpbmdzIGZyb20gdGhlIGtlcm5lbC9tb2R1bGUgY29tbWFuZC1saW5lIHRvIHRoZSBkcml2ZXIuICdzZXR1cF9hcmdzW10nCisgKiBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgZGVmaW5lIHRoZSBjb21waWxlLXRpbWUgZGVmYXVsdCB2YWx1ZXMgZm9yCisgKiB0aGVzZSBzZXR0aW5ncy4gSWYgTGludXggYm9vdHMgd2l0aCBhIExJTE8gb3IgaW5zbW9kIGNvbW1hbmQtbGluZSwgdGhvc2UKKyAqIHNldHRpbmdzIGFyZSBjb21iaW5lZCB3aXRoICdzZXR1cF9hcmdzW10nLiBOb3RlIHRoYXQgTElMTyBjb21tYW5kLWxpbmVzCisgKiBhcmUgcHJlZml4ZWQgd2l0aCAiaW4yMDAwPSIgd2hpbGUgaW5zbW9kIHVzZXMgYSAic2V0dXBfc3RyaW5ncz0iIHByZWZpeC4KKyAqIFRoZSBkcml2ZXIgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGtleXdvcmRzIChsb3dlciBjYXNlIHJlcXVpcmVkKSBhbmQKKyAqIGFyZ3VtZW50czoKKyAqCisgKiAtICBpb3BvcnQ6YWRkciAgICAtV2hlcmUgYWRkciBpcyBJTyBhZGRyZXNzIG9mIGEgKHVzdWFsbHkgUk9NLWxlc3MpIGNhcmQuCisgKiAtICBub3Jlc2V0ICAgICAgICAtTm8gb3B0aW9uYWwgYXJncy4gUHJldmVudHMgU0NTSSBidXMgcmVzZXQgYXQgYm9vdCB0aW1lLgorICogLSAgbm9zeW5jOnggICAgICAgLXggaXMgYSBiaXRtYXNrIHdoZXJlIHRoZSAxc3QgNyBiaXRzIGNvcnJlc3BvbmQgd2l0aAorICogICAgICAgICAgICAgICAgICAgIHRoZSA3IHBvc3NpYmxlIFNDU0kgZGV2aWNlcyAoYml0IDAgZm9yIGRldmljZSAjMCwgZXRjKS4KKyAqICAgICAgICAgICAgICAgICAgICBTZXQgYSBiaXQgdG8gUFJFVkVOVCBzeW5jIG5lZ290aWF0aW9uIG9uIHRoYXQgZGV2aWNlLgorICogICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgZGVmYXVsdCBpcyBzeW5jIERJU0FCTEVEIG9uIGFsbCBkZXZpY2VzLgorICogLSAgcGVyaW9kOm5zICAgICAgLW5zIGlzIHRoZSBtaW5pbXVtICMgb2YgbmFub3NlY29uZHMgaW4gYSBTQ1NJIGRhdGEgdHJhbnNmZXIKKyAqICAgICAgICAgICAgICAgICAgICBwZXJpb2QuIERlZmF1bHQgaXMgNTAwOyBhY2NlcHRhYmxlIHZhbHVlcyBhcmUgMjUwIC0gMTAwMC4KKyAqIC0gIGRpc2Nvbm5lY3Q6eCAgIC14ID0gMCB0byBuZXZlciBhbGxvdyBkaXNjb25uZWN0cywgMiB0byBhbHdheXMgYWxsb3cgdGhlbS4KKyAqICAgICAgICAgICAgICAgICAgICB4ID0gMSBkb2VzICdhZGFwdGl2ZScgZGlzY29ubmVjdHMsIHdoaWNoIGlzIHRoZSBkZWZhdWx0CisgKiAgICAgICAgICAgICAgICAgICAgYW5kIGdlbmVyYWxseSB0aGUgYmVzdCBjaG9pY2UuCisgKiAtICBkZWJ1Zzp4ICAgICAgICAtSWYgJ0RFQlVHR0lOR19PTicgaXMgZGVmaW5lZCwgeCBpcyBhIGJpdG1hc2sgdGhhdCBjYXVzZXMKKyAqICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIHR5cGVzIG9mIGRlYnVnIG91dHB1dCB0byBwcmludGVkIC0gc2VlIHRoZSBEQl94eHgKKyAqICAgICAgICAgICAgICAgICAgICBkZWZpbmVzIGluIGluMjAwMC5oCisgKiAtICBwcm9jOnggICAgICAgICAtSWYgJ1BST0NfSU5URVJGQUNFJyBpcyBkZWZpbmVkLCB4IGlzIGEgYml0bWFzayB0aGF0CisgKiAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyBob3cgdGhlIC9wcm9jIGludGVyZmFjZSB3b3JrcyBhbmQgd2hhdCBpdAorICogICAgICAgICAgICAgICAgICAgIGRvZXMgLSBzZWUgdGhlIFBSX3h4eCBkZWZpbmVzIGluIGluMjAwMC5oCisgKgorICogU3ludGF4IE5vdGVzOgorICogLSAgTnVtZXJpYyBhcmd1bWVudHMgY2FuIGJlIGRlY2ltYWwgb3IgdGhlICcweCcgZm9ybSBvZiBoZXggbm90YXRpb24uIFRoZXJlCisgKiAgICBfbXVzdF8gYmUgYSBjb2xvbiBiZXR3ZWVuIGEga2V5d29yZCBhbmQgaXRzIG51bWVyaWMgYXJndW1lbnQsIHdpdGggbm8KKyAqICAgIHNwYWNlcy4KKyAqIC0gIEtleXdvcmRzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIGluIHRoZSBzdGFuZGFyZCBrZXJuZWwKKyAqICAgIGNvbW1hbmQtbGluZSBtYW5uZXIuCisgKiAtICBBIGtleXdvcmQgaW4gdGhlICdudGgnIGNvbW1hLXNlcGFyYXRlZCBjb21tYW5kLWxpbmUgbWVtYmVyIHdpbGwgb3ZlcndyaXRlCisgKiAgICB0aGUgJ250aCcgZWxlbWVudCBvZiBzZXR1cF9hcmdzW10uIEEgYmxhbmsgY29tbWFuZC1saW5lIG1lbWJlciAoaW4KKyAqICAgIG90aGVyIHdvcmRzLCBhIGNvbW1hIHdpdGggbm8gcHJlY2VkaW5nIGtleXdvcmQpIHdpbGwgX25vdF8gb3ZlcndyaXRlCisgKiAgICB0aGUgY29ycmVzcG9uZGluZyBzZXR1cF9hcmdzW10gZWxlbWVudC4KKyAqCisgKiBBIGZldyBMSUxPIGV4YW1wbGVzIChmb3IgaW5zbW9kLCB1c2UgJ3NldHVwX3N0cmluZ3MnIGluc3RlYWQgb2YgJ2luMjAwMCcpOgorICogLSAgaW4yMDAwPWlvcG9ydDoweDIyMCxub3Jlc2V0CisgKiAtICBpbjIwMDA9cGVyaW9kOjI1MCxkaXNjb25uZWN0OjIsbm9zeW5jOjB4MDMKKyAqIC0gIGluMjAwMD1kZWJ1ZzoweDFlCisgKiAtICBpbjIwMDA9cHJvYzozCisgKi8KKworLyogTm9ybWFsbHksIG5vIGRlZmF1bHRzIGFyZSBzcGVjaWZpZWQuLi4gKi8KK3N0YXRpYyBjaGFyICpzZXR1cF9hcmdzW10gPSB7ICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIgfTsKKworLyogZmlsbGVkIGluIGJ5ICdpbnNtb2QnICovCitzdGF0aWMgY2hhciAqc2V0dXBfc3RyaW5nczsKKworbW9kdWxlX3BhcmFtKHNldHVwX3N0cmluZ3MsIGNoYXJwLCAwKTsKKworc3RhdGljIGlubGluZSB1Y2hhciByZWFkXzMzOTMoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEsIHVjaGFyIHJlZ19udW0pCit7CisJd3JpdGUxX2lvKHJlZ19udW0sIElPX1dEX0FERFIpOworCXJldHVybiByZWFkMV9pbyhJT19XRF9EQVRBKTsKK30KKworCisjZGVmaW5lIFJFQURfQVVYX1NUQVQoKSByZWFkMV9pbyhJT19XRF9BU1IpCisKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlXzMzOTMoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEsIHVjaGFyIHJlZ19udW0sIHVjaGFyIHZhbHVlKQoreworCXdyaXRlMV9pbyhyZWdfbnVtLCBJT19XRF9BRERSKTsKKwl3cml0ZTFfaW8odmFsdWUsIElPX1dEX0RBVEEpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV8zMzkzX2NtZChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YSwgdWNoYXIgY21kKQoreworLyogICB3aGlsZSAoUkVBRF9BVVhfU1RBVCgpICYgQVNSX0NJUCkKKyAgICAgIHByaW50aygifCIpOyovCisJd3JpdGUxX2lvKFdEX0NPTU1BTkQsIElPX1dEX0FERFIpOworCXdyaXRlMV9pbyhjbWQsIElPX1dEX0RBVEEpOworfQorCisKK3N0YXRpYyB1Y2hhciByZWFkXzFfYnl0ZShzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YSkKK3sKKwl1Y2hhciBhc3IsIHggPSAwOworCisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1RSQU5TX0lORk8gfCAweDgwKTsKKwlkbyB7CisJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKKwkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQl4ID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9EQVRBKTsKKwl9IHdoaWxlICghKGFzciAmIEFTUl9JTlQpKTsKKwlyZXR1cm4geDsKK30KKworCitzdGF0aWMgdm9pZCB3cml0ZV8zMzkzX2NvdW50KHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCXdyaXRlMV9pbyhXRF9UUkFOU0ZFUl9DT1VOVF9NU0IsIElPX1dEX0FERFIpOworCXdyaXRlMV9pbygodmFsdWUgPj4gMTYpLCBJT19XRF9EQVRBKTsKKwl3cml0ZTFfaW8oKHZhbHVlID4+IDgpLCBJT19XRF9EQVRBKTsKKwl3cml0ZTFfaW8odmFsdWUsIElPX1dEX0RBVEEpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfMzM5M19jb3VudChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJd3JpdGUxX2lvKFdEX1RSQU5TRkVSX0NPVU5UX01TQiwgSU9fV0RfQUREUik7CisJdmFsdWUgPSByZWFkMV9pbyhJT19XRF9EQVRBKSA8PCAxNjsKKwl2YWx1ZSB8PSByZWFkMV9pbyhJT19XRF9EQVRBKSA8PCA4OworCXZhbHVlIHw9IHJlYWQxX2lvKElPX1dEX0RBVEEpOworCXJldHVybiB2YWx1ZTsKK30KKworCisvKiBUaGUgMzNjOTMgbmVlZHMgdG8gYmUgdG9sZCB3aGljaCBkaXJlY3Rpb24gYSBjb21tYW5kIHRyYW5zZmVycyBpdHMKKyAqIGRhdGE7IHdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBpdCBvdXQuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZQorICogd2lsbCBiZSBhIERBVEFfT1VUIHBoYXNlIHdpdGggdGhpcyBjb21tYW5kLCBmYWxzZSBvdGhlcndpc2UuCisgKiAoVGhhbmtzIHRvIEpvZXJnIERvcmNoYWluIGZvciB0aGUgcmVzZWFyY2ggYW5kIHN1Z2dlc3Rpb24uKQorICovCitzdGF0aWMgaW50IGlzX2Rpcl9vdXQoU2NzaV9DbW5kICogY21kKQoreworCXN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CisJY2FzZSBXUklURV82OgorCWNhc2UgV1JJVEVfMTA6CisJY2FzZSBXUklURV8xMjoKKwljYXNlIFdSSVRFX0xPTkc6CisJY2FzZSBXUklURV9TQU1FOgorCWNhc2UgV1JJVEVfQlVGRkVSOgorCWNhc2UgV1JJVEVfVkVSSUZZOgorCWNhc2UgV1JJVEVfVkVSSUZZXzEyOgorCWNhc2UgQ09NUEFSRToKKwljYXNlIENPUFk6CisJY2FzZSBDT1BZX1ZFUklGWToKKwljYXNlIFNFQVJDSF9FUVVBTDoKKwljYXNlIFNFQVJDSF9ISUdIOgorCWNhc2UgU0VBUkNIX0xPVzoKKwljYXNlIFNFQVJDSF9FUVVBTF8xMjoKKwljYXNlIFNFQVJDSF9ISUdIXzEyOgorCWNhc2UgU0VBUkNIX0xPV18xMjoKKwljYXNlIEZPUk1BVF9VTklUOgorCWNhc2UgUkVBU1NJR05fQkxPQ0tTOgorCWNhc2UgUkVTRVJWRToKKwljYXNlIE1PREVfU0VMRUNUOgorCWNhc2UgTU9ERV9TRUxFQ1RfMTA6CisJY2FzZSBMT0dfU0VMRUNUOgorCWNhc2UgU0VORF9ESUFHTk9TVElDOgorCWNhc2UgQ0hBTkdFX0RFRklOSVRJT046CisJY2FzZSBVUERBVEVfQkxPQ0s6CisJY2FzZSBTRVRfV0lORE9XOgorCWNhc2UgTUVESVVNX1NDQU46CisJY2FzZSBTRU5EX1ZPTFVNRV9UQUc6CisJY2FzZSAweGVhOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKworCitzdGF0aWMgc3RydWN0IHN4X3BlcmlvZCBzeF90YWJsZVtdID0geworCXsxLCAweDIwfSwKKwl7MjUyLCAweDIwfSwKKwl7Mzc2LCAweDMwfSwKKwl7NTAwLCAweDQwfSwKKwl7NjI0LCAweDUwfSwKKwl7NzUyLCAweDYwfSwKKwl7ODc2LCAweDcwfSwKKwl7MTAwMCwgMHgwMH0sCisJezAsIDB9Cit9OworCitzdGF0aWMgaW50IHJvdW5kX3BlcmlvZCh1bnNpZ25lZCBpbnQgcGVyaW9kKQoreworCWludCB4OworCisJZm9yICh4ID0gMTsgc3hfdGFibGVbeF0ucGVyaW9kX25zOyB4KyspIHsKKwkJaWYgKChwZXJpb2QgPD0gc3hfdGFibGVbeCAtIDBdLnBlcmlvZF9ucykgJiYgKHBlcmlvZCA+IHN4X3RhYmxlW3ggLSAxXS5wZXJpb2RfbnMpKSB7CisJCQlyZXR1cm4geDsKKwkJfQorCX0KKwlyZXR1cm4gNzsKK30KKworc3RhdGljIHVjaGFyIGNhbGNfc3luY194ZmVyKHVuc2lnbmVkIGludCBwZXJpb2QsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJdWNoYXIgcmVzdWx0OworCisJcGVyaW9kICo9IDQ7CQkvKiBjb252ZXJ0IFNEVFIgY29kZSB0byBucyAqLworCXJlc3VsdCA9IHN4X3RhYmxlW3JvdW5kX3BlcmlvZChwZXJpb2QpXS5yZWdfdmFsdWU7CisJcmVzdWx0IHw9IChvZmZzZXQgPCBPUFRJTVVNX1NYX09GRikgPyBvZmZzZXQgOiBPUFRJTVVNX1NYX09GRjsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKworc3RhdGljIHZvaWQgaW4yMDAwX2V4ZWN1dGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOworCitzdGF0aWMgaW50IGluMjAwMF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlTY3NpX0NtbmQgKnRtcDsKKworCWluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwlEQihEQl9RVUVVRV9DT01NQU5ELCBwcmludGsoIlEtJWQtJTAyeC0lbGQoIiwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmNtbmRbMF0sIGNtZC0+cGlkKSkKKworLyogU2V0IHVwIGEgZmV3IGZpZWxkcyBpbiB0aGUgU2NzaV9DbW5kIHN0cnVjdHVyZSBmb3Igb3VyIG93biB1c2U6CisgKiAgLSBob3N0X3NjcmliYmxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGNtZCBpbiB0aGUgaW5wdXQgcXVldWUKKyAqICAtIHNjc2lfZG9uZSBwb2ludHMgdG8gdGhlIHJvdXRpbmUgd2UgY2FsbCB3aGVuIGEgY21kIGlzIGZpbmlzaGVkCisgKiAgLSByZXN1bHQgaXMgd2hhdCB5b3UnZCBleHBlY3QKKyAqLworCSAgICBjbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKy8qIFdlIHVzZSB0aGUgU2NzaV9Qb2ludGVyIHN0cnVjdHVyZSB0aGF0J3MgaW5jbHVkZWQgd2l0aCBlYWNoIGNvbW1hbmQKKyAqIGFzIGEgc2NyYXRjaHBhZCAoYXMgaXQncyBpbnRlbmRlZCB0byBiZSB1c2VkISkuIFRoZSBoYW5keSB0aGluZyBhYm91dAorICogdGhlIFNDcC54eHggZmllbGRzIGlzIHRoYXQgdGhleSdyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKyAqIGNtZCwgYW5kIGFyZSBwcmVzZXJ2ZWQgYWNyb3NzIGRpc2Nvbm5lY3QtcmVzZWxlY3QuIFRoaXMgbWVhbnMgd2UKKyAqIGNhbiBwcmV0dHkgbXVjaCBpZ25vcmUgU0FWRV9QT0lOVEVSUyBhbmQgUkVTVE9SRV9QT0lOVEVSUyBtZXNzYWdlcworICogaWYgd2Uga2VlcCBhbGwgdGhlIGNyaXRpY2FsIHBvaW50ZXJzIGFuZCBjb3VudGVycyBpbiBTQ3A6CisgKiAgLSBTQ3AucHRyIGlzIHRoZSBwb2ludGVyIGludG8gdGhlIFJBTSBidWZmZXIKKyAqICAtIFNDcC50aGlzX3Jlc2lkdWFsIGlzIHRoZSBzaXplIG9mIHRoYXQgYnVmZmVyCisgKiAgLSBTQ3AuYnVmZmVyIHBvaW50cyB0byB0aGUgY3VycmVudCBzY2F0dGVyLWdhdGhlciBidWZmZXIKKyAqICAtIFNDcC5idWZmZXJzX3Jlc2lkdWFsIHRlbGxzIHVzIGhvdyBtYW55IFMuRy4gYnVmZmVycyB0aGVyZSBhcmUKKyAqICAtIFNDcC5oYXZlX2RhdGFfaW4gaGVscHMga2VlcCB0cmFjayBvZiA+MjA0OCBieXRlIHRyYW5zZmVycworICogIC0gU0NwLnNlbnRfY29tbWFuZCBpcyBub3QgdXNlZAorICogIC0gU0NwLnBoYXNlIHJlY29yZHMgdGhpcyBjb21tYW5kJ3MgU1JDSURfRVIgYml0IHNldHRpbmcKKyAqLworCisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCWNtZC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5idWZmZXI7CisJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBjbWQtPnVzZV9zZyAtIDE7CisJCWNtZC0+U0NwLnB0ciA9IChjaGFyICopIHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsgY21kLT5TQ3AuYnVmZmVyLT5vZmZzZXQ7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwl9IGVsc2UgeworCQljbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwkJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCX0KKwljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSAwOworCisvKiBXZSBkb24ndCBzZXQgU0NwLnBoYXNlIGhlcmUgLSB0aGF0J3MgZG9uZSBpbiBpbjIwMDBfZXhlY3V0ZSgpICovCisKKy8qIFdEIGRvY3Mgc3RhdGUgdGhhdCBhdCB0aGUgY29uY2x1c2lvbiBvZiBhICJMRVZFTDIiIGNvbW1hbmQsIHRoZQorICogc3RhdHVzIGJ5dGUgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBMVU4gcmVnaXN0ZXIuIEFwcGFyZW50bHksCisgKiB0aGlzIGlzIHRoZSBjYXNlIG9ubHkgZm9yICp1bmludGVycnVwdGVkKiBMRVZFTDIgY29tbWFuZHMhIElmCisgKiB0aGVyZSBhcmUgYW55IHVuZXhwZWN0ZWQgcGhhc2VzIGVudGVyZWQsIGV2ZW4gaWYgdGhleSBhcmUgMTAwJQorICogbGVnYWwgKGRpZmZlcmVudCBkZXZpY2VzIG1heSBjaG9vc2UgdG8gZG8gdGhpbmdzIGRpZmZlcmVudGx5KSwKKyAqIHRoZSBMRVZFTDIgY29tbWFuZCBzZXF1ZW5jZSBpcyBleGl0ZWQuIFRoaXMgb2Z0ZW4gb2NjdXJzIHByaW9yCisgKiB0byByZWNlaXZpbmcgdGhlIHN0YXR1cyBieXRlLCBpbiB3aGljaCBjYXNlIHRoZSBkcml2ZXIgZG9lcyBhCisgKiBzdGF0dXMgcGhhc2UgaW50ZXJydXB0IGFuZCBnZXRzIHRoZSBzdGF0dXMgYnl0ZSBvbiBpdHMgb3duLgorICogV2hpbGUgc3VjaCBhIGNvbW1hbmQgY2FuIHRoZW4gYmUgInJlc3VtZWQiIChpZSByZXN0YXJ0ZWQgdG8KKyAqIGZpbmlzaCB1cCBhcyBhIExFVkVMMiBjb21tYW5kKSwgdGhlIExVTiByZWdpc3RlciB3aWxsIE5PVCBiZQorICogYSB2YWxpZCBzdGF0dXMgYnl0ZSBhdCB0aGUgY29tbWFuZCdzIGNvbmNsdXNpb24sIGFuZCB3ZSBtdXN0CisgKiB1c2UgdGhlIGJ5dGUgb2J0YWluZWQgZHVyaW5nIHRoZSBlYXJsaWVyIGludGVycnVwdC4gSGVyZSwgd2UKKyAqIHByZXNldCBTQ3AuU3RhdHVzIHRvIGFuIGlsbGVnYWwgdmFsdWUgKDB4ZmYpIHNvIHRoYXQgd2hlbgorICogdGhpcyBjb21tYW5kIGZpbmFsbHkgY29tcGxldGVzLCB3ZSBjYW4gdGVsbCB3aGVyZSB0aGUgYWN0dWFsCisgKiBzdGF0dXMgYnl0ZSBpcyBzdG9yZWQuCisgKi8KKworCWNtZC0+U0NwLlN0YXR1cyA9IElMTEVHQUxfU1RBVFVTX0JZVEU7CisKKy8qIFdlIG5lZWQgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGJlZm9yZSBtZXNzaW5nIHdpdGggdGhlIGlucHV0CisgKiBxdWV1ZSBhbmQgY2FsbGluZyBpbjIwMDBfZXhlY3V0ZSgpLgorICovCisKKwkvKgorCSAqIEFkZCB0aGUgY21kIHRvIHRoZSBlbmQgb2YgJ2lucHV0X1EnLiBOb3RlIHRoYXQgUkVRVUVTVF9TRU5TRQorCSAqIGNvbW1hbmRzIGFyZSBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUgc28gdGhhdCB0aGUgZGVzaXJlZAorCSAqIHNlbnNlIGRhdGEgaXMgbm90IGxvc3QgYmVmb3JlIFJFUVVFU1RfU0VOU0UgZXhlY3V0ZXMuCisJICovCisKKwlpZiAoIShob3N0ZGF0YS0+aW5wdXRfUSkgfHwgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSkgeworCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgaG9zdGRhdGEtPmlucHV0X1E7CisJCWhvc3RkYXRhLT5pbnB1dF9RID0gY21kOworCX0gZWxzZSB7CQkvKiBmaW5kIHRoZSBlbmQgb2YgdGhlIHF1ZXVlICovCisJCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsgdG1wLT5ob3N0X3NjcmliYmxlOyB0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZSk7CisJCXRtcC0+aG9zdF9zY3JpYmJsZSA9ICh1Y2hhciAqKSBjbWQ7CisJfQorCisvKiBXZSBrbm93IHRoYXQgdGhlcmUncyBhdCBsZWFzdCBvbmUgY29tbWFuZCBpbiAnaW5wdXRfUScgbm93LgorICogR28gc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBydW5uYWJsZSEKKyAqLworCisJaW4yMDAwX2V4ZWN1dGUoY21kLT5kZXZpY2UtPmhvc3QpOworCisJREIoREJfUVVFVUVfQ09NTUFORCwgcHJpbnRrKCIpUS0lbGQgIiwgY21kLT5waWQpKQorCSAgICByZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gc3RhcnQgYSBzY3NpIGNvbW1hbmQuIElmIHRoZSBob3N0X2NhcmQgaXMKKyAqIGFscmVhZHkgY29ubmVjdGVkLCB3ZSBnaXZlIHVwIGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsIGxvb2sgdGhyb3VnaAorICogdGhlIGlucHV0X1EsIHVzaW5nIHRoZSBmaXJzdCBjb21tYW5kIHdlIGZpbmQgdGhhdCdzIGludGVuZGVkCisgKiBmb3IgYSBjdXJyZW50bHkgbm9uLWJ1c3kgdGFyZ2V0L2x1bi4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGFscmVhZHkKKyAqIGRpc2FibGVkIChlaXRoZXIgZnJvbSBpbjIwMDBfcXVldWVjb21tYW5kKCkgb3IgaW4yMDAwX2ludHIoKSkuCisgKi8KK3N0YXRpYyB2b2lkIGluMjAwMF9leGVjdXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCVNjc2lfQ21uZCAqY21kLCAqcHJldjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqc3A7CisJdW5zaWduZWQgc2hvcnQgZjsKKwl1bnNpZ25lZCBzaG9ydCBmbHVzaGJ1ZlsxNl07CisKKworCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJREIoREJfRVhFQ1VURSwgcHJpbnRrKCJFWCgiKSkKKworCSAgICBpZiAoaG9zdGRhdGEtPnNlbGVjdGluZyB8fCBob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisKKwkJREIoREJfRVhFQ1VURSwgcHJpbnRrKCIpRVgtMCAiKSkKKworCQkgICAgcmV0dXJuOworCX0KKworCS8qCisJICogU2VhcmNoIHRocm91Z2ggdGhlIGlucHV0X1EgZm9yIGEgY29tbWFuZCBkZXN0aW5lZAorCSAqIGZvciBhbiBpZGxlIHRhcmdldC9sdW4uCisJICovCisKKwljbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROworCXByZXYgPSBOVUxMOworCXdoaWxlIChjbWQpIHsKKwkJaWYgKCEoaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKSkKKwkJCWJyZWFrOworCQlwcmV2ID0gY21kOworCQljbWQgPSAoU2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwl9CisKKwkvKiBxdWl0IGlmIHF1ZXVlIGVtcHR5IG9yIGFsbCBwb3NzaWJsZSB0YXJnZXRzIGFyZSBidXN5ICovCisKKwlpZiAoIWNtZCkgeworCisJCURCKERCX0VYRUNVVEUsIHByaW50aygiKUVYLTEgIikpCisKKwkJICAgIHJldHVybjsKKwl9CisKKwkvKiAgcmVtb3ZlIGNvbW1hbmQgZnJvbSBxdWV1ZSAqLworCisJaWYgKHByZXYpCisJCXByZXYtPmhvc3Rfc2NyaWJibGUgPSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJZWxzZQorCQlob3N0ZGF0YS0+aW5wdXRfUSA9IChTY3NpX0NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJaG9zdGRhdGEtPmNtZF9jbnRbY21kLT5kZXZpY2UtPmlkXSsrOworI2VuZGlmCisKKy8qCisgKiBTdGFydCB0aGUgc2VsZWN0aW9uIHByb2Nlc3MKKyAqLworCisJaWYgKGlzX2Rpcl9vdXQoY21kKSkKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfREVTVElOQVRJT05fSUQsIGNtZC0+ZGV2aWNlLT5pZCk7CisJZWxzZQorCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9ERVNUSU5BVElPTl9JRCwgY21kLT5kZXZpY2UtPmlkIHwgRFNUSURfRFBEKTsKKworLyogTm93IHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbW1hbmQgaXMgYSBnb29kCisgKiBjYW5kaWRhdGUgZm9yIGRpc2Nvbm5lY3QvcmVzZWxlY3QuIFdlIGd1ZXNzIHRvIHRoZSBiZXN0IG9mIG91cgorICogYWJpbGl0eSwgYmFzZWQgb24gYSBzZXQgb2YgaGllcmFyY2hpY2FsIHJ1bGVzLiBXaGVuIHNldmVyYWwKKyAqIGRldmljZXMgYXJlIG9wZXJhdGluZyBzaW11bHRhbmVvdXNseSwgZGlzY29ubmVjdHMgYXJlIHVzdWFsbHkKKyAqIGFuIGFkdmFudGFnZS4gSW4gYSBzaW5nbGUgZGV2aWNlIHN5c3RlbSwgb3IgaWYgb25seSAxIGRldmljZQorICogaXMgYmVpbmcgYWNjZXNzZWQsIHRyYW5zZmVycyB1c3VhbGx5IGdvIGZhc3RlciBpZiBkaXNjb25uZWN0cworICogYXJlIG5vdCBhbGxvd2VkOgorICoKKyAqICsgQ29tbWFuZHMgc2hvdWxkIE5FVkVSIGRpc2Nvbm5lY3QgaWYgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPQorICogICBESVNfTkVWRVIgKHRoaXMgaG9sZHMgZm9yIHRhcGUgZHJpdmVzIGFsc28pLCBhbmQgQUxXQVlTCisgKiAgIGRpc2Nvbm5lY3QgaWYgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSBESVNfQUxXQVlTLgorICogKyBUYXBlIGRyaXZlIGNvbW1hbmRzIHNob3VsZCBhbHdheXMgYmUgYWxsb3dlZCB0byBkaXNjb25uZWN0LgorICogKyBEaXNjb25uZWN0IHNob3VsZCBiZSBhbGxvd2VkIGlmIGRpc2Nvbm5lY3RlZF9RIGlzbid0IGVtcHR5LgorICogKyBDb21tYW5kcyBzaG91bGQgTk9UIGRpc2Nvbm5lY3QgaWYgaW5wdXRfUSBpcyBlbXB0eS4KKyAqICsgRGlzY29ubmVjdCBzaG91bGQgYmUgYWxsb3dlZCBpZiB0aGVyZSBhcmUgY29tbWFuZHMgaW4gaW5wdXRfUQorICogICBmb3IgYSBkaWZmZXJlbnQgdGFyZ2V0L2x1bi4gSW4gdGhpcyBjYXNlLCB0aGUgb3RoZXIgY29tbWFuZHMKKyAqICAgc2hvdWxkIGJlIG1hZGUgZGlzY29ubmVjdC1hYmxlLCBpZiBub3QgYWxyZWFkeS4KKyAqCisgKiBJIGtub3csIEkga25vdyAtIHRoaXMgY29kZSB3b3VsZCBmbHVuayBtZSBvdXQgb2YgYW55CisgKiAiQyBQcm9ncmFtbWluZyAxMDEiIGNsYXNzIGV2ZXIgb2ZmZXJlZC4gQnV0IGl0J3MgZWFzeQorICogdG8gY2hhbmdlIGFyb3VuZCBhbmQgZXhwZXJpbWVudCB3aXRoIGZvciBub3cuCisgKi8KKworCWNtZC0+U0NwLnBoYXNlID0gMDsJLyogYXNzdW1lIG5vIGRpc2Nvbm5lY3QgKi8KKwlpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPT0gRElTX05FVkVSKQorCQlnb3RvIG5vOworCWlmIChob3N0ZGF0YS0+ZGlzY29ubmVjdCA9PSBESVNfQUxXQVlTKQorCQlnb3RvIHllczsKKwlpZiAoY21kLT5kZXZpY2UtPnR5cGUgPT0gMSkJLyogdGFwZSBkcml2ZT8gKi8KKwkJZ290byB5ZXM7CisJaWYgKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSkJLyogb3RoZXIgY29tbWFuZHMgZGlzY29ubmVjdGVkPyAqLworCQlnb3RvIHllczsKKwlpZiAoIShob3N0ZGF0YS0+aW5wdXRfUSkpCS8qIGlucHV0X1EgZW1wdHk/ICovCisJCWdvdG8gbm87CisJZm9yIChwcmV2ID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsgcHJldjsgcHJldiA9IChTY3NpX0NtbmQgKikgcHJldi0+aG9zdF9zY3JpYmJsZSkgeworCQlpZiAoKHByZXYtPmRldmljZS0+aWQgIT0gY21kLT5kZXZpY2UtPmlkKSB8fCAocHJldi0+ZGV2aWNlLT5sdW4gIT0gY21kLT5kZXZpY2UtPmx1bikpIHsKKwkJCWZvciAocHJldiA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7IHByZXY7IHByZXYgPSAoU2NzaV9DbW5kICopIHByZXYtPmhvc3Rfc2NyaWJibGUpCisJCQkJcHJldi0+U0NwLnBoYXNlID0gMTsKKwkJCWdvdG8geWVzOworCQl9CisJfQorCWdvdG8gbm87CisKKyAgICAgIHllczoKKwljbWQtPlNDcC5waGFzZSA9IDE7CisKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlob3N0ZGF0YS0+ZGlzY19hbGxvd2VkX2NudFtjbWQtPmRldmljZS0+aWRdKys7CisjZW5kaWYKKworICAgICAgbm86CisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU09VUkNFX0lELCAoKGNtZC0+U0NwLnBoYXNlKSA/IFNSQ0lEX0VSIDogMCkpOworCisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfVEFSR0VUX0xVTiwgY21kLT5kZXZpY2UtPmx1bik7CisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU1lOQ0hST05PVVNfVFJBTlNGRVIsIGhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSk7CisJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKworCWlmICgoaG9zdGRhdGEtPmxldmVsMiA8PSBMMl9OT05FKSB8fCAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID09IFNTX1VOU0VUKSkgeworCisJCS8qCisJCSAqIERvIGEgJ1NlbGVjdC1XaXRoLUFUTicgY29tbWFuZC4gVGhpcyB3aWxsIGVuZCB3aXRoCisJCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVycnVwdHM6CisJCSAqICAgIENTUl9SRVNFTF9BTTogIGZhaWx1cmUgLSBjYW4gdHJ5IGFnYWluIGxhdGVyLgorCQkgKiAgICBDU1JfVElNRU9VVDogICBmYWlsdXJlIC0gZ2l2ZSB1cC4KKwkJICogICAgQ1NSX1NFTEVDVDogICAgc3VjY2VzcyAtIHByb2NlZWQuCisJCSAqLworCisJCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBjbWQ7CisKKy8qIEV2ZXJ5IHRhcmdldCBoYXMgaXRzIG93biBzeW5jaHJvbm91cyB0cmFuc2ZlciBzZXR0aW5nLCBrZXB0IGluCisgKiB0aGUgc3luY194ZmVyIGFycmF5LCBhbmQgYSBjb3JyZXNwb25kaW5nIHN0YXR1cyBieXRlIGluIHN5bmNfc3RhdFtdLgorICogRWFjaCB0YXJnZXQncyBzeW5jX3N0YXRbXSBlbnRyeSBpcyBpbml0aWFsaXplZCB0byBTU19VTlNFVCwgYW5kIGl0cworICogc3luY194ZmVyW10gZW50cnkgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQvc2FmZSB2YWx1ZS4gU1NfVU5TRVQKKyAqIG1lYW5zIHRoYXQgdGhlIHBhcmFtZXRlcnMgYXJlIHVuZGV0ZXJtaW5lZCBhcyB5ZXQsIGFuZCB0aGF0IHdlCisgKiBuZWVkIHRvIHNlbmQgYW4gU0RUUiBtZXNzYWdlIHRvIHRoaXMgZGV2aWNlIGFmdGVyIHNlbGVjdGlvbiBpcworICogY29tcGxldGUuIFdlIHNldCBTU19GSVJTVCB0byB0ZWxsIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB0byBkbyBzbywKKyAqIHVubGVzcyB3ZSBkb24ndCB3YW50IHRvIGV2ZW4gX3RyeV8gc3luY2hyb25vdXMgdHJhbnNmZXJzOiBJbiB0aGlzCisgKiBjYXNlIHdlIHNldCBTU19TRVQgdG8gbWFrZSB0aGUgZGVmYXVsdHMgZmluYWwuCisgKi8KKwkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19VTlNFVCkgeworCQkJaWYgKGhvc3RkYXRhLT5zeW5jX29mZiAmICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCkpCisJCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfU0VUOworCQkJZWxzZQorCQkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9IFNTX0ZJUlNUOworCQl9CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfU0VMRUNUSU5HOworCQl3cml0ZV8zMzkzX2NvdW50KGhvc3RkYXRhLCAwKTsJLyogdGhpcyBndWFyYW50ZWVzIGEgREFUQV9QSEFTRSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROKTsKKwl9CisKKwllbHNlIHsKKworCQkvKgorCQkgKiBEbyBhICdTZWxlY3QtV2l0aC1BVE4tWGZlcicgY29tbWFuZC4gVGhpcyB3aWxsIGVuZCB3aXRoCisJCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVycnVwdHM6CisJCSAqICAgIENTUl9SRVNFTF9BTTogIGZhaWx1cmUgLSBjYW4gdHJ5IGFnYWluIGxhdGVyLgorCQkgKiAgICBDU1JfVElNRU9VVDogICBmYWlsdXJlIC0gZ2l2ZSB1cC4KKwkJICogICAgYW55dGhpbmcgZWxzZTogc3VjY2VzcyAtIHByb2NlZWQuCisJCSAqLworCisJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDApOworCisJCS8qIGNvcHkgY29tbWFuZF9kZXNjcmlwdG9yX2Jsb2NrIGludG8gV0QgY2hpcAorCQkgKiAodGFrZSBhZHZhbnRhZ2Ugb2YgYXV0by1pbmNyZW1lbnRpbmcpCisJCSAqLworCisJCXdyaXRlMV9pbyhXRF9DREJfMSwgSU9fV0RfQUREUik7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykKKwkJCXdyaXRlMV9pbyhjbWQtPmNtbmRbaV0sIElPX1dEX0RBVEEpOworCisJCS8qIFRoZSB3ZDMzYzkzIG9ubHkga25vd3MgYWJvdXQgR3JvdXAgMCwgMSwgYW5kIDUgY29tbWFuZHMgd2hlbgorCQkgKiBpdCdzIGRvaW5nIGEgJ3NlbGVjdC1hbmQtdHJhbnNmZXInLiBUbyBiZSBzYWZlLCB3ZSB3cml0ZSB0aGUKKwkJICogc2l6ZSBvZiB0aGUgQ0RCIGludG8gdGhlIE9XTl9JRCByZWdpc3RlciBmb3IgZXZlcnkgY2FzZS4gVGhpcworCQkgKiB3YXkgdGhlcmUgd29uJ3QgYmUgcHJvYmxlbXMgd2l0aCB2ZW5kb3ItdW5pcXVlLCBhdWRpbywgZXRjLgorCQkgKi8KKworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9PV05fSUQsIGNtZC0+Y21kX2xlbik7CisKKwkJLyogV2hlbiBkb2luZyBhIG5vbi1kaXNjb25uZWN0IGNvbW1hbmQsIHdlIGNhbiBzYXZlIG91cnNlbHZlcyBhIERBVEEKKwkJICogcGhhc2UgaW50ZXJydXB0IGxhdGVyIGJ5IHNldHRpbmcgZXZlcnl0aGluZyB1cCBub3cuIFdpdGggd3JpdGVzIHdlCisJCSAqIG5lZWQgdG8gcHJlLWZpbGwgdGhlIGZpZm87IGlmIHRoZXJlJ3Mgcm9vbSBmb3IgdGhlIDMyIGZsdXNoIGJ5dGVzLAorCQkgKiBwdXQgdGhlbSBpbiB0aGVyZSB0b28gLSB0aGF0J2xsIGF2b2lkIGEgZmlmbyBpbnRlcnJ1cHQuIFJlYWRzIGFyZQorCQkgKiBzb21ld2hhdCBzaW1wbGVyLgorCQkgKiBLTFVER0UgTk9URTogSXQgc2VlbXMgdGhhdCB5b3UgY2FuJ3QgY29tcGxldGVseSBmaWxsIHRoZSBmaWZvIGhlcmU6CisJCSAqIFRoaXMgcmVzdWx0cyBpbiB0aGUgSU9fRklGT19DT1VOVCByZWdpc3RlciByb2xsaW5nIG92ZXIgdG8gemVybywKKwkJICogYW5kIGFwcGFyZW50bHkgdGhlIGdhdGUgYXJyYXkgbG9naWMgc2VlcyB0aGlzIGFzIGVtcHR5LCBub3QgZnVsbCwKKwkJICogc28gdGhlIDMzOTMgY2hpcCBpcyBuZXZlciBzaWduYWxsZWQgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZQorCQkgKiBmaWZvLiBPciBtYXliZSBpdCdzIHNlZW4gYXMgYSBwZXJtYW5lbnQgZmlmbyBpbnRlcnJ1cHQgY29uZGl0aW9uLgorCQkgKiBSZWdhcmRsZXNzLCB3ZSBmaXggdGhpcyBieSB0ZW1wb3JhcmlseSBwcmV0ZW5kaW5nIHRoYXQgdGhlIGZpZm8KKwkJICogaXMgMTYgYnl0ZXMgc21hbGxlci4gKEkgc2VlIG5vdyB0aGF0IHRoZSBvbGQgZHJpdmVyIGhhcyBhIGNvbW1lbnQKKwkJICogYWJvdXQgImRvbid0IGZpbGwgY29tcGxldGVseSIgaW4gYW4gYW5hbG9nb3VzIHBsYWNlIC0gbXVzdCBiZSB0aGUKKwkJICogc2FtZSBkZWFsLikgVGhpcyByZXN1bHRzIGluIENEUk9NLCBzd2FwIHBhcnRpdGlvbnMsIGFuZCB0YXBlIGRyaXZlcworCQkgKiBuZWVkaW5nIGFuIGV4dHJhIGludGVycnVwdCBwZXIgd3JpdGUgY29tbWFuZCAtIEkgdGhpbmsgd2UgY2FuIGxpdmUKKwkJICogd2l0aCB0aGF0IQorCQkgKi8KKworCQlpZiAoIShjbWQtPlNDcC5waGFzZSkpIHsKKwkJCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfQlVTKTsKKwkJCXdyaXRlMV9pbygwLCBJT19GSUZPX1dSSVRFKTsJLyogY2xlYXIgZmlmbyBjb3VudGVyLCB3cml0ZSBtb2RlICovCisKKwkJCWlmIChpc19kaXJfb3V0KGNtZCkpIHsKKwkJCQlob3N0ZGF0YS0+ZmlmbyA9IEZJX0ZJRk9fV1JJVElORzsKKwkJCQlpZiAoKGkgPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKSA+IChJTjIwMDBfRklGT19TSVpFIC0gMTYpKQorCQkJCQlpID0gSU4yMDAwX0ZJRk9fU0laRSAtIDE2OworCQkJCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IGk7CS8qIHRoaXMgbXVjaCBkYXRhIGluIGZpZm8gKi8KKwkJCQlpID4+PSAxOwkvKiBHdWxwLiBBc3N1bWluZyBtb2R1bG8gMi4gKi8KKwkJCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBjbWQtPlNDcC5wdHI7CisJCQkJZiA9IGhvc3RkYXRhLT5pb19iYXNlICsgSU9fRklGTzsKKworI2lmZGVmIEZBU1RfV1JJVEVfSU8KKworCQkJCUZBU1RfV1JJVEUyX0lPKCk7CisjZWxzZQorCQkJCXdoaWxlIChpLS0pCisJCQkJCXdyaXRlMl9pbygqc3ArKywgSU9fRklGTyk7CisKKyNlbmRpZgorCisJCQkJLyogSXMgdGhlcmUgcm9vbSBmb3IgdGhlIGZsdXNoIGJ5dGVzPyAqLworCisJCQkJaWYgKGNtZC0+U0NwLmhhdmVfZGF0YV9pbiA8PSAoKElOMjAwMF9GSUZPX1NJWkUgLSAxNikgLSAzMikpIHsKKwkJCQkJc3AgPSBmbHVzaGJ1ZjsKKwkJCQkJaSA9IDE2OworCisjaWZkZWYgRkFTVF9XUklURV9JTworCisJCQkJCUZBU1RfV1JJVEUyX0lPKCk7CisjZWxzZQorCQkJCQl3aGlsZSAoaS0tKQorCQkJCQkJd3JpdGUyX2lvKDAsIElPX0ZJRk8pOworCisjZW5kaWYKKworCQkJCX0KKwkJCX0KKworCQkJZWxzZSB7CisJCQkJd3JpdGUxX2lvKDAsIElPX0ZJRk9fUkVBRCk7CS8qIHB1dCBmaWZvIGluIHJlYWQgbW9kZSAqLworCQkJCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19SRUFESU5HOworCQkJCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiA9IDA7CS8qIG5vdGhpbmcgdHJhbnNmZXJyZWQgeWV0ICovCisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIDApOwkvKiB0aGlzIGd1YXJhbnRlZXMgYSBEQVRBX1BIQVNFIGludGVycnVwdCAqLworCQl9CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwl9CisKKwkvKgorCSAqIFNpbmNlIHRoZSBTQ1NJIGJ1cyBjYW4gaGFuZGxlIG9ubHkgMSBjb25uZWN0aW9uIGF0IGEgdGltZSwKKwkgKiB3ZSBnZXQgb3V0IG9mIGhlcmUgbm93LiBJZiB0aGUgc2VsZWN0aW9uIGZhaWxzLCBvciB3aGVuCisJICogdGhlIGNvbW1hbmQgZGlzY29ubmVjdHMsIHdlJ2xsIGNvbWUgYmFjayB0byB0aGlzIHJvdXRpbmUKKwkgKiB0byBzZWFyY2ggdGhlIGlucHV0X1EgYWdhaW4uLi4KKwkgKi8KKworCURCKERCX0VYRUNVVEUsIHByaW50aygiJXMlbGQpRVgtMiAiLCAoY21kLT5TQ3AucGhhc2UpID8gImQ6IiA6ICIiLCBjbWQtPnBpZCkpCisKK30KKworCisKK3N0YXRpYyB2b2lkIHRyYW5zZmVyX3Bpbyh1Y2hhciAqIGJ1ZiwgaW50IGNudCwgaW50IGRhdGFfaW5fZGlyLCBzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YSkKK3sKKwl1Y2hhciBhc3I7CisKKwlEQihEQl9UUkFOU0ZFUiwgcHJpbnRrKCIoJXAsJWQsJXMpIiwgYnVmLCBjbnQsIGRhdGFfaW5fZGlyID8gImluIiA6ICJvdXQiKSkKKworCSAgICB3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOworCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIGNudCk7CisJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9UUkFOU19JTkZPKTsKKwlpZiAoZGF0YV9pbl9kaXIpIHsKKwkJZG8geworCQkJYXNyID0gUkVBRF9BVVhfU1RBVCgpOworCQkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQkJKmJ1ZisrID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9EQVRBKTsKKwkJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7CisJfSBlbHNlIHsKKwkJZG8geworCQkJYXNyID0gUkVBRF9BVVhfU1RBVCgpOworCQkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSwgKmJ1ZisrKTsKKwkJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7CisJfQorCisJLyogTm90ZTogd2UgYXJlIHJldHVybmluZyB3aXRoIHRoZSBpbnRlcnJ1cHQgVU4tY2xlYXJlZC4KKwkgKiBTaW5jZSAocHJlc3VtYWJseSkgYW4gZW50aXJlIEkvTyBvcGVyYXRpb24gaGFzCisJICogY29tcGxldGVkLCB0aGUgYnVzIHBoYXNlIGlzIHByb2JhYmx5IGRpZmZlcmVudCwgYW5kCisJICogdGhlIGludGVycnVwdCByb3V0aW5lIHdpbGwgZGlzY292ZXIgdGhpcyB3aGVuIGl0CisJICogcmVzcG9uZHMgdG8gdGhlIHVuY2xlYXJlZCBpbnQuCisJICovCisKK30KKworCisKK3N0YXRpYyB2b2lkIHRyYW5zZmVyX2J5dGVzKFNjc2lfQ21uZCAqIGNtZCwgaW50IGRhdGFfaW5fZGlyKQoreworCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCXVuc2lnbmVkIHNob3J0ICpzcDsKKwl1bnNpZ25lZCBzaG9ydCBmOworCWludCBpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKy8qIE5vcm1hbGx5LCB5b3UnZCBleHBlY3QgJ3RoaXNfcmVzaWR1YWwnIHRvIGJlIG5vbi16ZXJvIGhlcmUuCisgKiBJbiBhIHNlcmllcyBvZiBzY2F0dGVyLWdhdGhlciB0cmFuc2ZlcnMsIGhvd2V2ZXIsIHRoaXMKKyAqIHJvdXRpbmUgd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCB3aXRoICd0aGlzX3Jlc2lkdWFsJyBlcXVhbAorICogdG8gMCBhbmQgJ2J1ZmZlcnNfcmVzaWR1YWwnIG5vbi16ZXJvLiBUaGlzIG1lYW5zIHRoYXQgYQorICogcHJldmlvdXMgdHJhbnNmZXIgY29tcGxldGVkLCBjbGVhcmluZyAndGhpc19yZXNpZHVhbCcsIGFuZAorICogbm93IHdlIG5lZWQgdG8gc2V0dXAgdGhlIG5leHQgc2NhdHRlci1nYXRoZXIgYnVmZmVyIGFzIHRoZQorICogc291cmNlIG9yIGRlc3RpbmF0aW9uIGZvciBUSElTIHRyYW5zZmVyLgorICovCisJaWYgKCFjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICYmIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkJKytjbWQtPlNDcC5idWZmZXI7CisJCS0tY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQljbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArIGNtZC0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCX0KKworLyogU2V0IHVwIGhhcmR3YXJlIHJlZ2lzdGVycyAqLworCisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU1lOQ0hST05PVVNfVFJBTlNGRVIsIGhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSk7CisJd3JpdGVfMzM5M19jb3VudChob3N0ZGF0YSwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfQlVTKTsKKwl3cml0ZTFfaW8oMCwgSU9fRklGT19XUklURSk7CS8qIHplcm8gY291bnRlciwgYXNzdW1lIHdyaXRlICovCisKKy8qIFJlYWRpbmcgaXMgZWFzeS4gSnVzdCBpc3N1ZSB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIC0gd2UnbGwKKyAqIGdldCBhbiBpbnRlcnJ1cHQgbGF0ZXIgd2hlbiB3ZSBoYXZlIGFjdHVhbCBkYXRhIHRvIHdvcnJ5IGFib3V0LgorICovCisKKwlpZiAoZGF0YV9pbl9kaXIpIHsKKwkJd3JpdGUxX2lvKDAsIElPX0ZJRk9fUkVBRCk7CisJCWlmICgoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9EQVRBKSB8fCAoaG9zdGRhdGEtPmxldmVsMiA9PSBMMl9CQVNJQyAmJiBjbWQtPlNDcC5waGFzZSA9PSAwKSkgeworCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSwgMHg0NSk7CisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQl9IGVsc2UKKwkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfVFJBTlNfSU5GTyk7CisJCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19SRUFESU5HOworCQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSAwOworCQlyZXR1cm47CisJfQorCisvKiBXcml0aW5nIGlzIG1vcmUgaW52b2x2ZWQgLSB3ZSdsbCBzdGFydCB0aGUgV0QgY2hpcCBhbmQgd3JpdGUgYXMKKyAqIG11Y2ggZGF0YSB0byB0aGUgZmlmbyBhcyB3ZSBjYW4gcmlnaHQgbm93LiBMYXRlciBpbnRlcnJ1cHRzIHdpbGwKKyAqIHdyaXRlIGFueSBieXRlcyB0aGF0IGRvbid0IG1ha2UgaXQgYXQgdGhpcyBzdGFnZS4KKyAqLworCisJaWYgKChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX0RBVEEpIHx8IChob3N0ZGF0YS0+bGV2ZWwyID09IEwyX0JBU0lDICYmIGNtZC0+U0NwLnBoYXNlID09IDApKSB7CisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOworCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJfSBlbHNlCisJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfVFJBTlNfSU5GTyk7CisJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1dSSVRJTkc7CisJc3AgPSAodW5zaWduZWQgc2hvcnQgKikgY21kLT5TQ3AucHRyOworCisJaWYgKChpID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCkgPiBJTjIwMDBfRklGT19TSVpFKQorCQlpID0gSU4yMDAwX0ZJRk9fU0laRTsKKwljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSBpOworCWkgPj49IDE7CQkvKiBHdWxwLiBXZSBhc3N1bWUgdGhpc19yZXNpZHVhbCBpcyBtb2R1bG8gMiAqLworCWYgPSBob3N0ZGF0YS0+aW9fYmFzZSArIElPX0ZJRk87CisKKyNpZmRlZiBGQVNUX1dSSVRFX0lPCisKKwlGQVNUX1dSSVRFMl9JTygpOworI2Vsc2UKKwl3aGlsZSAoaS0tKQorCQl3cml0ZTJfaW8oKnNwKyssIElPX0ZJRk8pOworCisjZW5kaWYKKworfQorCisKKy8qIFdlIG5lZWQgdG8gdXNlIHNwaW5fbG9ja19pcnFzYXZlKCkgJiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCkgaW4gdGhpcworICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gd29yayBpbiBhbiBTTVAgZW52aXJvbm1lbnQuIChJJ2QgYmUgc3VycHJpc2VkCisgKiBpZiB0aGUgZHJpdmVyIGlzIGV2ZXIgdXNlZCBieSBhbnlvbmUgb24gYSByZWFsIG11bHRpLUNQVSBtb3RoZXJib2FyZCwKKyAqIGJ1dCBpdCBfZG9lc18gbmVlZCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgYW5kIHJ1biBpbiBhbiBTTVAga2VybmVsLikKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaW4yMDAwX2ludHIoaW50IGlycW51bSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gZGV2X2lkOworCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCVNjc2lfQ21uZCAqcGF0Y2gsICpjbWQ7CisJdWNoYXIgYXNyLCBzciwgcGhzLCBpZCwgbHVuLCAqdWNwLCBtc2c7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJdW5zaWduZWQgc2hvcnQgKnNwOworCXVuc2lnbmVkIHNob3J0IGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisvKiBHZXQgdGhlIHNwaW5fbG9jayBhbmQgZGlzYWJsZSBmdXJ0aGVyIGludHMsIGZvciBTTVAgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworI2lmZGVmIFBST0NfU1RBVElTVElDUworCWhvc3RkYXRhLT5pbnRfY250Kys7CisjZW5kaWYKKworLyogVGhlIElOMjAwMCBjYXJkIGhhcyAyIGludGVycnVwdCBzb3VyY2VzIE9SJ2VkIG9udG8gaXRzIElSUSBsaW5lIC0gdGhlCisgKiBXRDMzOTMgY2hpcCBhbmQgdGhlIDJrIGZpZm8gKHdoaWNoIGlzIGFjdHVhbGx5IGEgZHVhbC1wb3J0IFJBTSBjb21iaW5lZAorICogd2l0aCBhIGJpZyBsb2dpYyBhcnJheSwgc28gaXQncyBhIGxpdHRsZSBkaWZmZXJlbnQgdGhhbiB3aGF0IHlvdSBtaWdodAorICogZXhwZWN0KS4gQXMgZmFyIGFzIEkga25vdywgdGhlcmUncyBubyByZWFzb24gdGhhdCBCT1RIIGNhbid0IGJlIGFjdGl2ZQorICogYXQgdGhlIHNhbWUgdGltZSwgYnV0IHRoZXJlJ3MgYSBwcm9ibGVtOiB3aGlsZSB3ZSBjYW4gcmVhZCB0aGUgMzM5MworICogdG8gdGVsbCBpZiBfaXRfIHdhbnRzIGFuIGludGVycnVwdCwgSSBkb24ndCBrbm93IG9mIGEgd2F5IHRvIGFzayB0aGUKKyAqIGZpZm8gdGhlIHNhbWUgcXVlc3Rpb24uIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyBjaGVjayB0aGUgMzM5MyBhbmQgaWYKKyAqIGl0IF9pc24ndF8gdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0LCB0aGVuIHdlIGNhbiBiZSBwcmV0dHkgc3VyZQorICogdGhhdCB0aGUgZmlmbyBpcyB0aGUgY3VscHJpdC4KKyAqICBVUERBVEU6IEkgaGF2ZSBpdCBvbiBnb29kIGF1dGhvcml0eSAoQmlsbCBFYXJuZXN0KSB0aGF0IGJpdCAwIG9mIHRoZQorICogICAgICAgICAgSU9fRklGT19DT1VOVCByZWdpc3RlciBtaXJyb3JzIHRoZSBmaWZvIGludGVycnVwdCBzdGF0ZS4gSQorICogICAgICAgICAgYXNzdW1lIHRoYXQgYml0IGNsZWFyIG1lYW5zIGludGVycnVwdCBhY3RpdmUuIEFzIGl0IHR1cm5zCisgKiAgICAgICAgICBvdXQsIHRoZSBkcml2ZXIgcmVhbGx5IGRvZXNuJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhpcyBhZnRlcgorICogICAgICAgICAgYWxsLCBzbyBteSByZW1hcmtzIGFib3ZlIGFib3V0IGEgJ3Byb2JsZW0nIGNhbiBzYWZlbHkgYmUKKyAqICAgICAgICAgIGlnbm9yZWQuIFRoZSB3YXkgdGhlIGxvZ2ljIGlzIHNldCB1cCwgdGhlcmUncyBubyBhZHZhbnRhZ2UKKyAqICAgICAgICAgICh0aGF0IEkgY2FuIHNlZSkgdG8gd29ycnlpbmcgYWJvdXQgaXQuCisgKgorICogSXQgc2VlbXMgdGhhdCB0aGUgZmlmbyBpbnRlcnJ1cHQgc2lnbmFsIGlzIG5lZ2F0ZWQgd2hlbiB3ZSBleHRyYWN0CisgKiBieXRlcyBkdXJpbmcgcmVhZCBvciB3cml0ZSBieXRlcyBkdXJpbmcgd3JpdGUuCisgKiAgLSBmaWZvIHdpbGwgaW50ZXJydXB0IHdoZW4gZGF0YSBpcyBtb3ZpbmcgZnJvbSBpdCB0byB0aGUgMzM5MywgYW5kCisgKiAgICB0aGVyZSBhcmUgMzEgKG9yIGxlc3M/KSBieXRlcyBsZWZ0IHRvIGdvLiBUaGlzIGlzIHNvcnQgb2Ygc2hvcnQtCisgKiAgICBzaWdodGVkOiB3aGF0IGlmIHlvdSBkb24ndCBXQU5UIHRvIGRvIG1vcmU/IEluIGFueSBjYXNlLCBvdXIKKyAqICAgIHJlc3BvbnNlIGlzIHRvIHB1c2ggbW9yZSBpbnRvIHRoZSBmaWZvIC0gZWl0aGVyIGFjdHVhbCBkYXRhIG9yCisgKiAgICBkdW1teSBieXRlcyBpZiBuZWVkIGJlLiBOb3RlIHRoYXQgd2UgYXBwYXJlbnRseSBoYXZlIHRvIHdyaXRlIGF0CisgKiAgICBsZWFzdCAzMiBhZGRpdGlvbmFsIGJ5dGVzIHRvIHRoZSBmaWZvIGFmdGVyIGFuIGludGVycnVwdCBpbiBvcmRlcgorICogICAgdG8gZ2V0IGl0IHRvIHJlbGVhc2UgdGhlIG9uZXMgaXQgd2FzIGhvbGRpbmcgb24gdG8gLSB3cml0aW5nIGZld2VyCisgKiAgICB0aGFuIDMyIHdpbGwgcmVzdWx0IGluIGFub3RoZXIgZmlmbyBpbnQuCisgKiAgVVBEQVRFOiBBZ2FpbiwgaW5mbyBmcm9tIEJpbGwgRWFybmVzdCBtYWtlcyB0aGlzIG1vcmUgdW5kZXJzdGFuZGFibGU6CisgKiAgICAgICAgICAzMiBieXRlcyA9IHR3byBjb3VudHMgb2YgdGhlIGZpZm8gY291bnRlciByZWdpc3Rlci4gSGUgdGVsbHMKKyAqICAgICAgICAgIG1lIHRoYXQgdGhlIGZpZm8gaW50ZXJydXB0IGlzIGEgbm9uLWxhdGNoaW5nIHNpZ25hbCBkZXJpdmVkCisgKiAgICAgICAgICBmcm9tIGEgc3RyYWlnaHRmb3J3YXJkIGJvb2xlYW4gaW50ZXJwcmV0YXRpb24gb2YgdGhlIDcKKyAqICAgICAgICAgIGhpZ2hlc3QgYml0cyBvZiB0aGUgZmlmbyBjb3VudGVyIGFuZCB0aGUgZmlmby1yZWFkL2ZpZm8td3JpdGUKKyAqICAgICAgICAgIHN0YXRlLiBXaG8nZCBhIHRob3VnaHQ/CisgKi8KKworCXdyaXRlMV9pbygwLCBJT19MRURfT04pOworCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKKwlpZiAoIShhc3IgJiBBU1JfSU5UKSkgewkvKiBubyBXRDMzYzkzIGludGVycnVwdD8gKi8KKworLyogT2suIFRoaXMgaXMgZGVmaW5pdGVseSBhIEZJRk8tb25seSBpbnRlcnJ1cHQuCisgKgorICogSWYgRklfRklGT19SRUFESU5HIGlzIHNldCwgdGhlcmUgYXJlIHVwIHRvIDIwNDggYnl0ZXMgd2FpdGluZyB0byBiZSByZWFkLAorICogbWF5YmUgbW9yZSB0byBjb21lIGZyb20gdGhlIFNDU0kgYnVzLiBSZWFkIGFzIG1hbnkgYXMgd2UgY2FuIG91dCBvZiB0aGUKKyAqIGZpZm8gYW5kIGludG8gbWVtb3J5IGF0IHRoZSBsb2NhdGlvbiBvZiBTQ3AucHRyW1NDcC5oYXZlX2RhdGFfaW5dLCBhbmQKKyAqIHVwZGF0ZSBoYXZlX2RhdGFfaW4gYWZ0ZXJ3YXJkcy4KKyAqCisgKiBJZiB3ZSBoYXZlIEZJX0ZJRk9fV1JJVElORywgdGhlIEZJRk8gaGFzIGFsbW9zdCBydW4gb3V0IG9mIGJ5dGVzIHRvIG1vdmUKKyAqIGludG8gdGhlIFdEMzM5MyBjaGlwIChJIHRoaW5rIHRoZSBpbnRlcnJ1cHQgaGFwcGVucyB3aGVuIHRoZXJlIGFyZSAzMQorICogYnl0ZXMgbGVmdCwgYnV0IGl0IG1heSBiZSBmZXdlci4uLikuIFRoZSAzMzkzIGlzIHN0aWxsIHdhaXRpbmcsIHNvIHdlCisgKiBzaG92ZSBzb21lIG1vcmUgaW50byB0aGUgZmlmbywgd2hpY2ggZ2V0cyB0aGluZ3MgbW92aW5nIGFnYWluLiBJZiB0aGUKKyAqIG9yaWdpbmFsIFNDU0kgY29tbWFuZCBzcGVjaWZpZWQgbW9yZSB0aGFuIDIwNDggYnl0ZXMsIHRoZXJlIG1heSBzdGlsbAorICogYmUgc29tZSBvZiB0aGF0IGRhdGEgbGVmdDogZmluZSAtIHVzZSBpdCAoZnJvbSBTQ3AucHRyW1NDcC5oYXZlX2RhdGFfaW5dKS4KKyAqIERvbid0IGZvcmdldCB0byB1cGRhdGUgaGF2ZV9kYXRhX2luLiBJZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZQorICogZW50aXJlIGJ1ZmZlciwgZmVlZCAzMiBkdW1teSBieXRlcyB0byB0aGUgZmlmbyAtIHRoZXkncmUgbmVlZGVkIHRvCisgKiBwdXNoIG91dCB0aGUgcmVtYWluaW5nIHJlYWwgZGF0YS4KKyAqICAgIChCaWcgdGhhbmtzIHRvIEJpbGwgRWFybmVzdCBmb3IgZ2V0dGluZyBtZSBvdXQgb2YgdGhlIG11ZCBpbiBoZXJlLikKKyAqLworCisJCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsJLyogYXNzdW1lIHdlJ3JlIGNvbm5lY3RlZCAqLworCQlDSEVDS19OVUxMKGNtZCwgImZpZm9faW50IikKKworCQkgICAgaWYgKGhvc3RkYXRhLT5maWZvID09IEZJX0ZJRk9fUkVBRElORykgeworCisJCQlEQihEQl9GSUZPLCBwcmludGsoIntSOiUwMnh9ICIsIHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpKSkKKworCQkJICAgIHNwID0gKHVuc2lnbmVkIHNob3J0ICopIChjbWQtPlNDcC5wdHIgKyBjbWQtPlNDcC5oYXZlX2RhdGFfaW4pOworCQkJaSA9IHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpICYgMHhmZTsKKwkJCWkgPDw9IDI7CS8qICMgb2Ygd29yZHMgd2FpdGluZyBpbiB0aGUgZmlmbyAqLworCQkJZiA9IGhvc3RkYXRhLT5pb19iYXNlICsgSU9fRklGTzsKKworI2lmZGVmIEZBU1RfUkVBRF9JTworCisJCQlGQVNUX1JFQUQyX0lPKCk7CisjZWxzZQorCQkJd2hpbGUgKGktLSkKKwkJCQkqc3ArKyA9IHJlYWQyX2lvKElPX0ZJRk8pOworCisjZW5kaWYKKworCQkJaSA9IHNwIC0gKHVuc2lnbmVkIHNob3J0ICopIChjbWQtPlNDcC5wdHIgKyBjbWQtPlNDcC5oYXZlX2RhdGFfaW4pOworCQkJaSA8PD0gMTsKKwkJCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiArPSBpOworCQl9CisKKwkJZWxzZSBpZiAoaG9zdGRhdGEtPmZpZm8gPT0gRklfRklGT19XUklUSU5HKSB7CisKKwkJCURCKERCX0ZJRk8sIHByaW50aygie1c6JTAyeH0gIiwgcmVhZDFfaW8oSU9fRklGT19DT1VOVCkpKQorCisvKiBJZiBhbGwgYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpZm8sIGZsdXNoIG91dCB0aGUgc3RyYWdnbGVycy4KKyAqIE5vdGUgdGhhdCB3aGlsZSB3cml0aW5nIDE2IGR1bW15IHdvcmRzIHNlZW1zIGFyYml0cmFyeSwgd2UgZG9uJ3QKKyAqIGhhdmUgYW5vdGhlciBjaG9pY2UgdGhhdCBJIGNhbiBzZWUuIFdoYXQgd2UgcmVhbGx5IHdhbnQgaXMgdG8gcmVhZAorICogdGhlIDMzOTMgdHJhbnNmZXIgY291bnQgcmVnaXN0ZXIgKHRoYXQgd291bGQgdGVsbCB1cyBob3cgbWFueSBieXRlcworICogbmVlZGVkIGZsdXNoaW5nKSwgYnV0IHRoZSBUUkFOU0ZFUl9JTkZPIGNvbW1hbmQgaGFzbid0IGNvbXBsZXRlZAorICogeWV0IChub3QgZW5vdWdoIGJ5dGVzISkgYW5kIHRoYXQgcmVnaXN0ZXIgd29uJ3QgYmUgYWNjZXNzaWJsZS4gU28sCisgKiB3ZSB1c2UgMTYgd29yZHMgLSBhIG51bWJlciBvYnRhaW5lZCB0aHJvdWdoIHRyaWFsIGFuZCBlcnJvci4KKyAqICBVUERBVEU6IEJpbGwgc2F5cyB0aGlzIGlzIGV4YWN0bHkgd2hhdCBBbHdheXMgZG9lcywgc28gdGhlcmUuCisgKiAgICAgICAgICBNb3JlIHRoYW5rcyBkdWUgaGltIGZvciBoZWxwIGluIHRoaXMgc2VjdGlvbi4KKyAqLworCQkJICAgIGlmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID09IGNtZC0+U0NwLmhhdmVfZGF0YV9pbikgeworCQkJCWkgPSAxNjsKKwkJCQl3aGlsZSAoaS0tKQkvKiB3cml0ZSAzMiBkdW1teSBieXRlcyAqLworCQkJCQl3cml0ZTJfaW8oMCwgSU9fRklGTyk7CisJCQl9CisKKy8qIElmIHRoZXJlIGFyZSBzdGlsbCBieXRlcyBsZWZ0IGluIHRoZSBTQ1NJIGJ1ZmZlciwgd3JpdGUgYXMgbWFueSBhcyB3ZQorICogY2FuIG91dCB0byB0aGUgZmlmby4KKyAqLworCisJCQllbHNlIHsKKwkJCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKKwkJCQlpID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtIGNtZC0+U0NwLmhhdmVfZGF0YV9pbjsJLyogYnl0ZXMgeWV0IHRvIGdvICovCisJCQkJaiA9IHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpICYgMHhmZTsKKwkJCQlqIDw8PSAyOwkvKiBob3cgbWFueSB3b3JkcyB0aGUgZmlmbyBoYXMgcm9vbSBmb3IgKi8KKwkJCQlpZiAoKGogPDwgMSkgPiBpKQorCQkJCQlqID0gKGkgPj4gMSk7CisJCQkJd2hpbGUgKGotLSkKKwkJCQkJd3JpdGUyX2lvKCpzcCsrLCBJT19GSUZPKTsKKworCQkJCWkgPSBzcCAtICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKKwkJCQlpIDw8PSAxOworCQkJCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiArPSBpOworCQkJfQorCQl9CisKKwkJZWxzZSB7CisJCQlwcmludGsoIioqKiBTcHVyaW91cyBGSUZPIGludGVycnVwdCAqKioiKTsKKwkJfQorCisJCXdyaXRlMV9pbygwLCBJT19MRURfT0ZGKTsKKworLyogcmVsZWFzZSB0aGUgU01QIHNwaW5fbG9jayBhbmQgcmVzdG9yZSBpcnEgc3RhdGUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKy8qIFRoaXMgaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIFdEMzNjOTMgY2hpcC4gVGhlIGZpZm8gaW50ZXJydXB0CisgKiBtYXkgYWxzbyBiZSBhc3NlcnRlZCwgYnV0IHdlIGRvbid0IGJvdGhlciB0byBjaGVjayBpdDogd2UgZ2V0IG1vcmUKKyAqIGRldGFpbGVkIGluZm8gZnJvbSBGSUZPX1JFQURJTkcgYW5kIEZJRk9fV1JJVElORyAoc2VlIGJlbG93KS4KKyAqLworCisJY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkOwkvKiBhc3N1bWUgd2UncmUgY29ubmVjdGVkICovCisJc3IgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLworCXBocyA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSk7CisKKwlpZiAoIWNtZCAmJiAoc3IgIT0gQ1NSX1JFU0VMX0FNICYmIHNyICE9IENTUl9USU1FT1VUICYmIHNyICE9IENTUl9TRUxFQ1QpKSB7CisJCXByaW50aygiXG5OUjp3ZC1pbnRyLTFcbiIpOworCQl3cml0ZTFfaW8oMCwgSU9fTEVEX09GRik7CisKKy8qIHJlbGVhc2UgdGhlIFNNUCBzcGluX2xvY2sgYW5kIHJlc3RvcmUgaXJxIHN0YXRlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJREIoREJfSU5UUiwgcHJpbnRrKCJ7JTAyeDolMDJ4LSIsIGFzciwgc3IpKQorCisvKiBBZnRlciBzdGFydGluZyBhIEZJRk8tYmFzZWQgdHJhbnNmZXIsIHRoZSBuZXh0IF9XRDMzOTNfIGludGVycnVwdCBpcworICogZ3VhcmFudGVlZCB0byBiZSBpbiByZXNwb25zZSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgdHJhbnNmZXIuCisgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcsIHRoZXJlJ3MgcHJvYmFibHkgZGF0YSBpbiB0aGUgZmlmbyB0aGF0IG5lZWRzCisgKiB0byBiZSBjb3BpZWQgaW50byBSQU0gLSBkbyB0aGF0IGhlcmUuIEFsc28sIHdlIGhhdmUgdG8gdXBkYXRlCisgKiAndGhpc19yZXNpZHVhbCcgYW5kICdwdHInIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUKKyAqIFRSQU5TRkVSX0NPVU5UIHJlZ2lzdGVyLCBpbiBjYXNlIHRoZSBkZXZpY2UgZGVjaWRlZCB0byBkbyBhbgorICogaW50ZXJtZWRpYXRlIGRpc2Nvbm5lY3QgKGEgZGV2aWNlIG1heSBkbyB0aGlzIGlmIGl0IGhhcyB0bworICogZG8gYSBzZWVrLCAgb3IganVzdCB0byBiZSBuaWNlIGFuZCBsZXQgb3RoZXIgZGV2aWNlcyBoYXZlCisgKiBzb21lIGJ1cyB0aW1lIGR1cmluZyBsb25nIHRyYW5zZmVycykuCisgKiBBZnRlciBkb2luZyB3aGF0ZXZlciBpcyBuZWNlc3Nhcnkgd2l0aCB0aGUgZmlmbywgd2UgZ28gb24gYW5kCisgKiBzZXJ2aWNlIHRoZSBXRDMzOTMgaW50ZXJydXB0IG5vcm1hbGx5LgorICovCisJICAgIGlmIChob3N0ZGF0YS0+ZmlmbyA9PSBGSV9GSUZPX1JFQURJTkcpIHsKKworLyogYnVmZmVyIGluZGV4ID0gc3RhcnQtb2YtYnVmZmVyICsgIy1vZi1ieXRlcy1hbHJlYWR5LXJlYWQgKi8KKworCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKKworLyogYnl0ZXMgcmVtYWluaW5nIGluIGZpZm8gPSAodG90YWwtd2FudGVkIC0gIy1ub3QtZ290KSAtICMtYWxyZWFkeS1yZWFkICovCisKKwkJaSA9IChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC0gcmVhZF8zMzkzX2NvdW50KGhvc3RkYXRhKSkgLSBjbWQtPlNDcC5oYXZlX2RhdGFfaW47CisJCWkgPj49IDE7CS8qIEd1bHAuIFdlIGFzc3VtZSB0aGlzIHdpbGwgYWx3YXlzIGJlIG1vZHVsbyAyICovCisJCWYgPSBob3N0ZGF0YS0+aW9fYmFzZSArIElPX0ZJRk87CisKKyNpZmRlZiBGQVNUX1JFQURfSU8KKworCQlGQVNUX1JFQUQyX0lPKCk7CisjZWxzZQorCQl3aGlsZSAoaS0tKQorCQkJKnNwKysgPSByZWFkMl9pbyhJT19GSUZPKTsKKworI2VuZGlmCisKKwkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1VOVVNFRDsKKwkJbGVuZ3RoID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSk7CisJCWNtZC0+U0NwLnB0ciArPSAobGVuZ3RoIC0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisKKwkJREIoREJfVFJBTlNGRVIsIHByaW50aygiKCVwLCVkKSIsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCkpCisKKwl9CisKKwllbHNlIGlmIChob3N0ZGF0YS0+ZmlmbyA9PSBGSV9GSUZPX1dSSVRJTkcpIHsKKwkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1VOVVNFRDsKKwkJbGVuZ3RoID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSk7CisJCWNtZC0+U0NwLnB0ciArPSAobGVuZ3RoIC0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisKKwkJREIoREJfVFJBTlNGRVIsIHByaW50aygiKCVwLCVkKSIsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCkpCisKKwl9CisKKy8qIFJlc3BvbmQgdG8gdGhlIHNwZWNpZmljIFdEMzM5MyBpbnRlcnJ1cHQgLSB0aGVyZSBhcmUgcXVpdGUgYSBmZXchICovCisKKwlzd2l0Y2ggKHNyKSB7CisKKwljYXNlIENTUl9USU1FT1VUOgorCQlEQihEQl9JTlRSLCBwcmludGsoIlRJTUVPVVQiKSkKKworCQkgICAgaWYgKGhvc3RkYXRhLT5zdGF0ZSA9PSBTX1JVTk5JTkdfTEVWRUwyKQorCQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCWVsc2UgeworCQkJY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOwkvKiBnZXQgYSB2YWxpZCBjbWQgKi8KKwkJCUNIRUNLX05VTEwoY21kLCAiY3NyX3RpbWVvdXQiKQorCQkJICAgIGhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCQl9CisKKwkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisKKy8qIFdlIGFyZSBub3QgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmIHRoZXJlCisgKiBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAqLworCisJCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKKwkJYnJlYWs7CisKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9TRUxFQ1Q6CisJCURCKERCX0lOVFIsIHByaW50aygiU0VMRUNUIikpCisJCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOworCQlDSEVDS19OVUxMKGNtZCwgImNzcl9zZWxlY3QiKQorCQkgICAgaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisKKwkJLyogY29uc3RydWN0IGFuIElERU5USUZZIG1lc3NhZ2Ugd2l0aCBjb3JyZWN0IGRpc2Nvbm5lY3QgYml0ICovCisKKwkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9ICgweDgwIHwgMHgwMCB8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQlpZiAoY21kLT5TQ3AucGhhc2UpCisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdIHw9IDB4NDA7CisKKwkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19GSVJTVCkgeworI2lmZGVmIFNZTkNfREVCVUcKKwkJCXByaW50aygiIHNlbmRpbmcgU0RUUiAiKTsKKyNlbmRpZgorCisJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19XQUlUSU5HOworCisJCQkvKiB0YWNrIG9uIGEgMm5kIG1lc3NhZ2UgdG8gYXNrIGFib3V0IHN5bmNocm9ub3VzIHRyYW5zZmVycyAqLworCisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzFdID0gRVhURU5ERURfTUVTU0FHRTsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMl0gPSAzOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1szXSA9IEVYVEVOREVEX1NEVFI7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzRdID0gT1BUSU1VTV9TWF9QRVIgLyA0OworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1s1XSA9IE9QVElNVU1fU1hfT0ZGOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDY7CisJCX0gZWxzZQorCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDE7CisKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCWJyZWFrOworCisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfREFUQV9JTjoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19EQVRBX0lOOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfREFUQV9JTjoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJJTi0lZC4lZCIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpKQorCQkgICAgdHJhbnNmZXJfYnl0ZXMoY21kLCBEQVRBX0lOX0RJUik7CisJCWlmIChob3N0ZGF0YS0+c3RhdGUgIT0gU19SVU5OSU5HX0xFVkVMMikKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlicmVhazsKKworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX0RBVEFfT1VUOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX0RBVEFfT1VUOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfREFUQV9PVVQ6CisJCURCKERCX0lOVFIsIHByaW50aygiT1VULSVkLiVkIiwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCwgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkpCisJCSAgICB0cmFuc2Zlcl9ieXRlcyhjbWQsIERBVEFfT1VUX0RJUik7CisJCWlmIChob3N0ZGF0YS0+c3RhdGUgIT0gU19SVU5OSU5HX0xFVkVMMikKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlicmVhazsKKworCisvKiBOb3RlOiB0aGlzIGludGVycnVwdCBzaG91bGQgbm90IG9jY3VyIGluIGEgTEVWRUwyIGNvbW1hbmQgKi8KKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19DT01NQU5EOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX0NPTU1BTkQ6CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19DT01NQU5EOgorCQlEQihEQl9JTlRSLCBwcmludGsoIkNNTkQtJTAyeCwlbGQiLCBjbWQtPmNtbmRbMF0sIGNtZC0+cGlkKSkKKwkJICAgIHRyYW5zZmVyX3BpbyhjbWQtPmNtbmQsIGNtZC0+Y21kX2xlbiwgREFUQV9PVVRfRElSLCBob3N0ZGF0YSk7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlicmVhazsKKworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX1NUQVRVUzoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19TVEFUVVM6CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19TVEFUVVM6CisJCURCKERCX0lOVFIsIHByaW50aygiU1RBVFVTPSIpKQorCisJCSAgICBjbWQtPlNDcC5TdGF0dXMgPSByZWFkXzFfYnl0ZShob3N0ZGF0YSk7CisJCURCKERCX0lOVFIsIHByaW50aygiJTAyeCIsIGNtZC0+U0NwLlN0YXR1cykpCisJCSAgICBpZiAoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9CQVNJQykgeworCQkJc3IgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgaW50ZXJydXB0ICovCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSwgMHg1MCk7CisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJCX0gZWxzZSB7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJfQorCQlicmVhazsKKworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX01FU1NfSU46CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfTUVTU19JTjoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX01FU1NfSU46CisJCURCKERCX0lOVFIsIHByaW50aygiTVNHX0lOPSIpKQorCisJCSAgICBtc2cgPSByZWFkXzFfYnl0ZShob3N0ZGF0YSk7CisJCXNyID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLworCisJCWhvc3RkYXRhLT5pbmNvbWluZ19tc2dbaG9zdGRhdGEtPmluY29taW5nX3B0cl0gPSBtc2c7CisJCWlmIChob3N0ZGF0YS0+aW5jb21pbmdfbXNnWzBdID09IEVYVEVOREVEX01FU1NBR0UpCisJCQltc2cgPSBFWFRFTkRFRF9NRVNTQUdFOworCQllbHNlCisJCQlob3N0ZGF0YS0+aW5jb21pbmdfcHRyID0gMDsKKworCQljbWQtPlNDcC5NZXNzYWdlID0gbXNnOworCQlzd2l0Y2ggKG1zZykgeworCisJCWNhc2UgQ09NTUFORF9DT01QTEVURToKKwkJCURCKERCX0lOVFIsIHByaW50aygiQ0NNUC0lbGQiLCBjbWQtPnBpZCkpCisJCQkgICAgd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUFJFX0NNUF9ESVNDOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJTRFAiKSkKKwkJCSAgICB3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQlicmVhazsKKworCQljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlJEUCIpKQorCQkJICAgIGlmIChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX0JBU0lDKSB7CisJCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSwgMHg0NSk7CisJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERJU0NPTk5FQ1Q6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIkRJUyIpKQorCQkJICAgIGNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ID0gMTsKKwkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1BSRV9UTVBfRElTQzsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlJFSiIpKQorI2lmZGVmIFNZTkNfREVCVUcKKwkJCSAgICBwcmludGsoIi1SRUotIik7CisjZW5kaWYKKwkJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfV0FJVElORykKKwkJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19TRVQ7CisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQlicmVhazsKKworCQljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIkVYVCIpKQorCisJCQkgICAgdWNwID0gaG9zdGRhdGEtPmluY29taW5nX21zZzsKKworI2lmZGVmIFNZTkNfREVCVUcKKwkJCXByaW50aygiJTAyeCIsIHVjcFtob3N0ZGF0YS0+aW5jb21pbmdfcHRyXSk7CisjZW5kaWYKKwkJCS8qIElzIHRoaXMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZXh0ZW5kZWQgbWVzc2FnZT8gKi8KKworCQkJaWYgKChob3N0ZGF0YS0+aW5jb21pbmdfcHRyID49IDIpICYmIChob3N0ZGF0YS0+aW5jb21pbmdfcHRyID09ICh1Y3BbMV0gKyAxKSkpIHsKKworCQkJCXN3aXRjaCAodWNwWzJdKSB7CS8qIHdoYXQncyB0aGUgRVhURU5ERUQgY29kZT8gKi8KKwkJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQkJCWlkID0gY2FsY19zeW5jX3hmZXIodWNwWzNdLCB1Y3BbNF0pOworCQkJCQlpZiAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdICE9IFNTX1dBSVRJTkcpIHsKKworLyogQSBkZXZpY2UgaGFzIHNlbnQgYW4gdW5zb2xpY2l0ZWQgU0RUUiBtZXNzYWdlOyByYXRoZXIgdGhhbiBnbworICogdGhyb3VnaCB0aGUgZWZmb3J0IG9mIGRlY29kaW5nIGl0IGFuZCB0aGVuIGZpZ3VyaW5nIG91dCB3aGF0CisgKiBvdXIgcmVwbHkgc2hvdWxkIGJlLCB3ZSdyZSBqdXN0IGdvbm5hIHNheSB0aGF0IHdlIGhhdmUgYQorICogc3luY2hyb25vdXMgZmlmbyBkZXB0aCBvZiAwLiBUaGlzIHdpbGwgcmVzdWx0IGluIGFzeW5jaHJvbm91cworICogdHJhbnNmZXJzIC0gbm90IGlkZWFsIGJ1dCBzbyBtdWNoIGVhc2llci4KKyAqIEFjdHVhbGx5LCB0aGlzIGlzIE9LIGJlY2F1c2UgaXQgYXNzdXJlcyB1cyB0aGF0IGlmIHdlIGRvbid0CisgKiBzcGVjaWZpY2FsbHkgYXNrIGZvciBzeW5jIHRyYW5zZmVycywgd2Ugd29uJ3QgZG8gYW55LgorICovCisKKwkJCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1sxXSA9IDM7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzJdID0gRVhURU5ERURfU0RUUjsKKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbM10gPSBob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgLyA0OworCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1s0XSA9IDA7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gNTsKKwkJCQkJCWhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSA9IGNhbGNfc3luY194ZmVyKGhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciAvIDQsIDApOworCQkJCQl9IGVsc2UgeworCQkJCQkJaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdID0gaWQ7CisJCQkJCX0KKyNpZmRlZiBTWU5DX0RFQlVHCisJCQkJCXByaW50aygic3luY194ZmVyPSUwMngiLCBob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0pOworI2VuZGlmCisJCQkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9IFNTX1NFVDsKKwkJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRVhURU5ERURfV0RUUjoKKwkJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9BU1NFUlRfQVROKTsJLyogd2FudCBNRVNTX09VVCAqLworCQkJCQlwcmludGsoInNlbmRpbmcgV0RUUiAiKTsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9IEVYVEVOREVEX01FU1NBR0U7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMV0gPSAyOworCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzJdID0gRVhURU5ERURfV0RUUjsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1szXSA9IDA7CS8qIDggYml0IHRyYW5zZmVyIHdpZHRoICovCisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSA0OworCQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9BU1NFUlRfQVROKTsJLyogd2FudCBNRVNTX09VVCAqLworCQkJCQlwcmludGsoIlJlamVjdGluZyBVbmtub3duIEV4dGVuZGVkIE1lc3NhZ2UoJTAyeCkuICIsIHVjcFsyXSk7CisJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDE7CisJCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7CisJCQl9CisKKwkJCS8qIFdlIG5lZWQgdG8gcmVhZCBtb3JlIE1FU1NfSU4gYnl0ZXMgZm9yIHRoZSBleHRlbmRlZCBtZXNzYWdlICovCisKKwkJCWVsc2UgeworCQkJCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIrKzsKKwkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiUmVqZWN0aW5nIFVua25vd24gTWVzc2FnZSglMDJ4KSAiLCBtc2cpOworCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9BU1NFUlRfQVROKTsJLyogd2FudCBNRVNTX09VVCAqLworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9IE1FU1NBR0VfUkVKRUNUOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDE7CisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCX0KKwkJYnJlYWs7CisKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgd2lsbCBvY2N1ciBvbmx5IGFmdGVyIGEgTEVWRUwyIGNvbW1hbmQgKi8KKworCWNhc2UgQ1NSX1NFTF9YRkVSX0RPTkU6CisKKy8qIE1ha2Ugc3VyZSB0aGF0IHJlc2VsZWN0aW9uIGlzIGVuYWJsZWQgYXQgdGhpcyBwb2ludCAtIGl0IG1heQorICogaGF2ZSBiZWVuIHR1cm5lZCBvZmYgZm9yIHRoZSBjb21tYW5kIHRoYXQganVzdCBjb21wbGV0ZWQuCisgKi8KKworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9TT1VSQ0VfSUQsIFNSQ0lEX0VSKTsKKwkJaWYgKHBocyA9PSAweDYwKSB7CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlNYLURPTkUtJWxkIiwgY21kLT5waWQpKQorCQkJICAgIGNtZC0+U0NwLk1lc3NhZ2UgPSBDT01NQU5EX0NPTVBMRVRFOworCQkJbHVuID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9UQVJHRVRfTFVOKTsKKwkJCURCKERCX0lOVFIsIHByaW50aygiOiVkLiVkIiwgY21kLT5TQ3AuU3RhdHVzLCBsdW4pKQorCQkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQkJaWYgKGNtZC0+U0NwLlN0YXR1cyA9PSBJTExFR0FMX1NUQVRVU19CWVRFKQorCQkJCWNtZC0+U0NwLlN0YXR1cyA9IGx1bjsKKwkJCWlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBjbWQtPlNDcC5TdGF0dXMgIT0gR09PRCkKKwkJCQljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOworCQkJZWxzZQorCQkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCisvKiBXZSBhcmUgbm8gbG9uZ2VyIGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZgorICogdGhlcmUgYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCisgKi8KKworCQkJaW4yMDAwX2V4ZWN1dGUoaW5zdGFuY2UpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlMDJ4OiUwMng6JTAyeC0lbGQ6IFVua25vd24gU0VMX1hGRVJfRE9ORSBwaGFzZSEhLS0tIiwgYXNyLCBzciwgcGhzLCBjbWQtPnBpZCk7CisJCX0KKwkJYnJlYWs7CisKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgd2lsbCBvY2N1ciBvbmx5IGFmdGVyIGEgTEVWRUwyIGNvbW1hbmQgKi8KKworCWNhc2UgQ1NSX1NEUDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJTRFAiKSkKKwkJICAgIGhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDEpOworCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJCWJyZWFrOworCisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfTUVTU19PVVQ6CisJY2FzZSBDU1JfVU5FWFAgfCBQSFNfTUVTU19PVVQ6CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19NRVNTX09VVDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJNU0dfT1VUPSIpKQorCisvKiBUbyBnZXQgaGVyZSwgd2UndmUgcHJvYmFibHkgcmVxdWVzdGVkIE1FU1NBR0VfT1VUIGFuZCBoYXZlCisgKiBhbHJlYWR5IHB1dCB0aGUgY29ycmVjdCBieXRlcyBpbiBvdXRnb2luZ19tc2dbXSBhbmQgZmlsbGVkCisgKiBpbiBvdXRnb2luZ19sZW4uIFdlIHNpbXBseSBzZW5kIHRoZW0gb3V0IHRvIHRoZSBTQ1NJIGJ1cy4KKyAqIFNvbWV0aW1lcyB3ZSBnZXQgTUVTU0FHRV9PVVQgcGhhc2Ugd2hlbiB3ZSdyZSBub3QgZXhwZWN0aW5nCisgKiBpdCAtIGxpa2Ugd2hlbiBvdXIgU0RUUiBtZXNzYWdlIGlzIHJlamVjdGVkIGJ5IGEgdGFyZ2V0LiBTb21lCisgKiB0YXJnZXRzIHNlbmQgdGhlIFJFSkVDVCBiZWZvcmUgcmVjZWl2aW5nIGFsbCBvZiB0aGUgZXh0ZW5kZWQKKyAqIG1lc3NhZ2UsIGFuZCB0aGVuIHNlZW0gdG8gZ28gYmFjayB0byBNRVNTQUdFX09VVCBmb3IgYSBieXRlCisgKiBvciB0d28uIE5vdCBzdXJlIHdoeSwgb3IgaWYgSSdtIGRvaW5nIHNvbWV0aGluZyB3cm9uZyB0bworICogY2F1c2UgdGhpcyB0byBoYXBwZW4uIFJlZ2FyZGxlc3MsIGl0IHNlZW1zIHRoYXQgc2VuZGluZworICogTk9QIG1lc3NhZ2VzIGluIHRoZXNlIHNpdHVhdGlvbnMgcmVzdWx0cyBpbiBubyBoYXJtIGFuZAorICogbWFrZXMgZXZlcnlvbmUgaGFwcHkuCisgKi8KKwkJICAgIGlmIChob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID09IDApIHsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9IE5PUDsKKwkJfQorCQl0cmFuc2Zlcl9waW8oaG9zdGRhdGEtPm91dGdvaW5nX21zZywgaG9zdGRhdGEtPm91dGdvaW5nX2xlbiwgREFUQV9PVVRfRElSLCBob3N0ZGF0YSk7CisJCURCKERCX0lOVFIsIHByaW50aygiJTAyeCIsIGhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0pKQorCQkgICAgaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDA7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlicmVhazsKKworCisJY2FzZSBDU1JfVU5FWFBfRElTQzoKKworLyogSSB0aGluayBJJ3ZlIHNlZW4gdGhpcyBhZnRlciBhIHJlcXVlc3Qtc2Vuc2UgdGhhdCB3YXMgaW4gcmVzcG9uc2UKKyAqIHRvIGFuIGVycm9yIGNvbmRpdGlvbiwgYnV0IG5vdCBzdXJlLiBXZSBjZXJ0YWlubHkgbmVlZCB0byBkbworICogc29tZXRoaW5nIHdoZW4gd2UgZ2V0IHRoaXMgaW50ZXJydXB0IC0gdGhlIHF1ZXN0aW9uIGlzICd3aGF0PycuCisgKiBMZXQncyB0aGluayBwb3NpdGl2ZWx5LCBhbmQgYXNzdW1lIHNvbWUgY29tbWFuZCBoYXMgZmluaXNoZWQKKyAqIGluIGEgbGVnYWwgbWFubmVyIChsaWtlIGEgY29tbWFuZCB0aGF0IHByb3Zva2VzIGEgcmVxdWVzdC1zZW5zZSksCisgKiBzbyB3ZSB0cmVhdCBpdCBhcyBhIG5vcm1hbCBjb21tYW5kLWNvbXBsZXRlLWRpc2Nvbm5lY3QuCisgKi8KKworCisvKiBNYWtlIHN1cmUgdGhhdCByZXNlbGVjdGlvbiBpcyBlbmFibGVkIGF0IHRoaXMgcG9pbnQgLSBpdCBtYXkKKyAqIGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGZvciB0aGUgY29tbWFuZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICovCisKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU09VUkNFX0lELCBTUkNJRF9FUik7CisJCWlmIChjbWQgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIgLSBBbHJlYWR5IGRpc2Nvbm5lY3RlZCEgIik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCisvKiByZWxlYXNlIHRoZSBTTVAgc3Bpbl9sb2NrIGFuZCByZXN0b3JlIGlycSBzdGF0ZSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJREIoREJfSU5UUiwgcHJpbnRrKCJVTkVYUF9ESVNDLSVsZCIsIGNtZC0+cGlkKSkKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJaWYgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFICYmIGNtZC0+U0NwLlN0YXR1cyAhPSBHT09EKQorCQkJY21kLT5yZXN1bHQgPSAoY21kLT5yZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJZWxzZQorCQkJY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKworLyogV2UgYXJlIG5vIGxvbmdlciBjb25uZWN0ZWQgdG8gYSB0YXJnZXQgLSBjaGVjayB0byBzZWUgaWYKKyAqIHRoZXJlIGFyZSBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICovCisKKwkJaW4yMDAwX2V4ZWN1dGUoaW5zdGFuY2UpOworCQlicmVhazsKKworCisJY2FzZSBDU1JfRElTQzoKKworLyogTWFrZSBzdXJlIHRoYXQgcmVzZWxlY3Rpb24gaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50IC0gaXQgbWF5CisgKiBoYXZlIGJlZW4gdHVybmVkIG9mZiBmb3IgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGNvbXBsZXRlZC4KKyAqLworCisJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCwgU1JDSURfRVIpOworCQlEQihEQl9JTlRSLCBwcmludGsoIkRJU0MtJWxkIiwgY21kLT5waWQpKQorCQkgICAgaWYgKGNtZCA9PSBOVUxMKSB7CisJCQlwcmludGsoIiAtIEFscmVhZHkgZGlzY29ubmVjdGVkISAiKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCX0KKwkJc3dpdGNoIChob3N0ZGF0YS0+c3RhdGUpIHsKKwkJY2FzZSBTX1BSRV9DTVBfRElTQzoKKwkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQkJREIoREJfSU5UUiwgcHJpbnRrKCI6JWQiLCBjbWQtPlNDcC5TdGF0dXMpKQorCQkJICAgIGlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBjbWQtPlNDcC5TdGF0dXMgIT0gR09PRCkKKwkJCQljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOworCQkJZWxzZQorCQkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgU19QUkVfVE1QX0RJU0M6CisJCWNhc2UgU19SVU5OSU5HX0xFVkVMMjoKKwkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1Y2hhciAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1E7CisJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1EgPSBjbWQ7CisJCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwkJCWhvc3RkYXRhLT5kaXNjX2RvbmVfY250W2NtZC0+ZGV2aWNlLT5pZF0rKzsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiKioqIFVuZXhwZWN0ZWQgRElTQ09OTkVDVCBpbnRlcnJ1cHQhICoqKiIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJfQorCisvKiBXZSBhcmUgbm8gbG9uZ2VyIGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZgorICogdGhlcmUgYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCisgKi8KKworCQlpbjIwMDBfZXhlY3V0ZShpbnN0YW5jZSk7CisJCWJyZWFrOworCisKKwljYXNlIENTUl9SRVNFTF9BTToKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJSRVNFTCIpKQorCisJCSAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGlzIHJlc2VsZWN0aW9uIGRpZG4ndCAqLworCQkgICAgLyogaGFwcGVuIGR1cmluZyBBcmJpdHJhdGlvbi9TZWxlY3Rpb24gb2Ygc29tZSBvdGhlciBkZXZpY2UuICovCisJCSAgICAvKiBJZiB5ZXMsIHB1dCBsb3NpbmcgY29tbWFuZCBiYWNrIG9uIHRvcCBvZiBpbnB1dF9RLiAqLworCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPD0gTDJfTk9ORSkgeworCisJCQlpZiAoaG9zdGRhdGEtPnNlbGVjdGluZykgeworCQkJCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPnNlbGVjdGluZzsKKwkJCQlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwkJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgaG9zdGRhdGEtPmlucHV0X1E7CisJCQkJaG9zdGRhdGEtPmlucHV0X1EgPSBjbWQ7CisJCQl9CisJCX0KKworCQllbHNlIHsKKworCQkJaWYgKGNtZCkgeworCQkJCWlmIChwaHMgPT0gMHgwMCkgeworCQkJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQkJCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoIi0tLSUwMng6JTAyeDolMDJ4LVRST1VCTEU6IEludHJ1c2l2ZSBSZVNlbGVjdCEtLS0iLCBhc3IsIHNyLCBwaHMpOworCQkJCQl3aGlsZSAoMSkKKwkJCQkJCXByaW50aygiXHIiKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCS8qIE9LIC0gZmluZCBvdXQgd2hpY2ggZGV2aWNlIHJlc2VsZWN0ZWQgdXMuICovCisKKwkJaWQgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCk7CisJCWlkICY9IFNSQ0lEX01BU0s7CisKKwkJLyogYW5kIGV4dHJhY3QgdGhlIGx1biBmcm9tIHRoZSBJRCBtZXNzYWdlLiAoTm90ZSB0aGF0IHdlIGRvbid0CisJCSAqIGJvdGhlciB0byBjaGVjayBmb3IgYSB2YWxpZCBtZXNzYWdlIGhlcmUgLSBJIGd1ZXNzIHRoaXMgaXMKKwkJICogbm90IHRoZSByaWdodCB3YXkgdG8gZ28sIGJ1dC4uLi4pCisJCSAqLworCisJCWx1biA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSk7CisJCWlmIChob3N0ZGF0YS0+bGV2ZWwyIDwgTDJfUkVTRUxFQ1QpCisJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOworCQlsdW4gJj0gNzsKKworCQkvKiBOb3cgd2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgdGhhdCdzIHJlY29ubmVjdGluZy4gKi8KKworCQljbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUTsKKwkJcGF0Y2ggPSBOVUxMOworCQl3aGlsZSAoY21kKSB7CisJCQlpZiAoaWQgPT0gY21kLT5kZXZpY2UtPmlkICYmIGx1biA9PSBjbWQtPmRldmljZS0+bHVuKQorCQkJCWJyZWFrOworCQkJcGF0Y2ggPSBjbWQ7CisJCQljbWQgPSAoU2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJfQorCisJCS8qIEhtbS4gQ291bGRuJ3QgZmluZCBhIHZhbGlkIGNvbW1hbmQuLi4uIFdoYXQgdG8gZG8/ICovCisKKwkJaWYgKCFjbWQpIHsKKwkJCXByaW50aygiLS0tVFJPVUJMRTogdGFyZ2V0ICVkLiVkIG5vdCBpbiBkaXNjb25uZWN0IHF1ZXVlLS0tIiwgaWQsIGx1bik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rLCBmb3VuZCB0aGUgY29tbWFuZCAtIG5vdyBzdGFydCBpdCB1cCBhZ2Fpbi4gKi8KKworCQlpZiAocGF0Y2gpCisJCQlwYXRjaC0+aG9zdF9zY3JpYmJsZSA9IGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJZWxzZQorCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisKKwkJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCAnaW5pdGlhbGl6ZV9TQ3AoKScgb3IgJ2hvc3RkYXRhLT5idXN5W10nCisJCSAqIGJlY2F1c2UgdGhlc2UgdGhpbmdzIGFyZSBwcmVzZXJ2ZWQgb3ZlciBhIGRpc2Nvbm5lY3QuCisJCSAqIEJ1dCB3ZSBETyBuZWVkIHRvIGZpeCB0aGUgRFBEIGJpdCBzbyBpdCdzIGNvcnJlY3QgZm9yIHRoaXMgY29tbWFuZC4KKwkJICovCisKKwkJaWYgKGlzX2Rpcl9vdXQoY21kKSkKKwkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQpOworCQllbHNlCisJCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9ERVNUSU5BVElPTl9JRCwgY21kLT5kZXZpY2UtPmlkIHwgRFNUSURfRFBEKTsKKwkJaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfUkVTRUxFQ1QpIHsKKwkJCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIDApOwkvKiB3ZSB3YW50IGEgREFUQV9QSEFTRSBpbnRlcnJ1cHQgKi8KKwkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOworCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJfSBlbHNlCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKworCQlEQihEQl9JTlRSLCBwcmludGsoIi0lbGQiLCBjbWQtPnBpZCkpCisJCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiLS1VTktOT1dOIElOVEVSUlVQVDolMDJ4OiUwMng6JTAyeC0tIiwgYXNyLCBzciwgcGhzKTsKKwl9CisKKwl3cml0ZTFfaW8oMCwgSU9fTEVEX09GRik7CisKKwlEQihEQl9JTlRSLCBwcmludGsoIn0gIikpCisKKy8qIHJlbGVhc2UgdGhlIFNNUCBzcGluX2xvY2sgYW5kIHJlc3RvcmUgaXJxIHN0YXRlICovCisJICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisKKyNkZWZpbmUgUkVTRVRfQ0FSRCAgICAgICAgIDAKKyNkZWZpbmUgUkVTRVRfQ0FSRF9BTkRfQlVTIDEKKyNkZWZpbmUgQl9GTEFHIDB4ODAKKworLyoKKyAqCUNhbGxlciBtdXN0IGhvbGQgaW5zdGFuY2UgbG9jayEKKyAqLworCitzdGF0aWMgaW50IHJlc2V0X2hhcmR3YXJlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlpbnQgcXQsIHg7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCXdyaXRlMV9pbygwLCBJT19MRURfT04pOworCWlmICh0eXBlID09IFJFU0VUX0NBUkRfQU5EX0JVUykgeworCQl3cml0ZTFfaW8oMCwgSU9fQ0FSRF9SRVNFVCk7CisJCXggPSByZWFkMV9pbyhJT19IQVJEV0FSRSk7CisJfQorCXggPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgYW55IFdEIGludHJwdCAqLworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX09XTl9JRCwgaW5zdGFuY2UtPnRoaXNfaWQgfCBPV05JRF9FQUYgfCBPV05JRF9SQUYgfCBPV05JRF9GU184KTsKKwl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NZTkNIUk9OT1VTX1RSQU5TRkVSLCBjYWxjX3N5bmNfeGZlcihob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgLyA0LCBERUZBVUxUX1NYX09GRikpOworCisJd3JpdGUxX2lvKDAsIElPX0ZJRk9fV1JJVEUpOwkvKiBjbGVhciBmaWZvIGNvdW50ZXIgKi8KKwl3cml0ZTFfaW8oMCwgSU9fRklGT19SRUFEKTsJLyogc3RhcnQgZmlmbyBvdXQgaW4gcmVhZCBtb2RlICovCisJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORCwgV0RfQ01EX1JFU0VUKTsKKwkvKiBGSVhNRTogdGltZW91dCA/PyAqLworCXdoaWxlICghKFJFQURfQVVYX1NUQVQoKSAmIEFTUl9JTlQpKQorCQljcHVfcmVsYXgoKTsJLyogd2FpdCBmb3IgUkVTRVQgdG8gY29tcGxldGUgKi8KKworCXggPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgaW50ZXJydXB0ICovCisKKwl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9RVUVVRV9UQUcsIDB4YTUpOwkvKiBhbnkgcmFuZG9tIG51bWJlciAqLworCXF0ID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9RVUVVRV9UQUcpOworCWlmIChxdCA9PSAweGE1KSB7CisJCXggfD0gQl9GTEFHOworCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9RVUVVRV9UQUcsIDApOworCX0KKwl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9USU1FT1VUX1BFUklPRCwgVElNRU9VVF9QRVJJT0RfVkFMVUUpOworCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7CisJd3JpdGUxX2lvKDAsIElPX0xFRF9PRkYpOworCXJldHVybiB4OworfQorCisKKworc3RhdGljIGludCBpbjIwMDBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlpbnQgeDsKKworCWluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IFJlc2V0LiAiLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisKKwkvKiBkbyBzY3NpLXJlc2V0IGhlcmUgKi8KKworCXJlc2V0X2hhcmR3YXJlKGluc3RhbmNlLCBSRVNFVF9DQVJEX0FORF9CVVMpOworCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJaG9zdGRhdGEtPmJ1c3lbeF0gPSAwOworCQlob3N0ZGF0YS0+c3luY194ZmVyW3hdID0gY2FsY19zeW5jX3hmZXIoREVGQVVMVF9TWF9QRVIgLyA0LCBERUZBVUxUX1NYX09GRik7CisJCWhvc3RkYXRhLT5zeW5jX3N0YXRbeF0gPSBTU19VTlNFVDsJLyogdXNpbmcgZGVmYXVsdCBzeW5jIHZhbHVlcyAqLworCX0KKwlob3N0ZGF0YS0+aW5wdXRfUSA9IE5VTEw7CisJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gTlVMTDsKKwlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19VTlVTRUQ7CisJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7CisJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDA7CisKKwljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBpbjIwMDBfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBjbWQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBpbjIwMDBfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCisKK3N0YXRpYyBpbnQgaW4yMDAwX2Fib3J0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlTY3NpX0NtbmQgKnRtcCwgKnByZXY7CisJdWNoYXIgc3IsIGFzcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogQWJvcnQtIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCXByaW50aygiKGFzcj0lMDJ4LGNvdW50PSVsZCxyZXNpZD0lZCxidWZfcmVzaWQ9JWQsaGF2ZV9kYXRhPSVkLEZDPSUwMngpLSAiLCBSRUFEX0FVWF9TVEFUKCksIHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSksIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwsIGNtZC0+U0NwLmhhdmVfZGF0YV9pbiwgcmVhZDFfaW8oSU9fRklGT19DT1VOVCkpOworCisvKgorICogQ2FzZSAxIDogSWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gaXNzdWVkIHlldCwgd2Ugc2ltcGx5IHJlbW92ZSBpdAorICogICAgIGZyb20gdGhlIGlub3V0X1EuCisgKi8KKworCXRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7CisJcHJldiA9IE5VTEw7CisJd2hpbGUgKHRtcCkgeworCQlpZiAodG1wID09IGNtZCkgeworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+aG9zdF9zY3JpYmJsZSA9IGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogQWJvcnQgLSByZW1vdmluZyBjb21tYW5kICVsZCBmcm9tIGlucHV0X1EuICIsIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPnBpZCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKwkJcHJldiA9IHRtcDsKKwkJdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGU7CisJfQorCisvKgorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaXMgY29ubmVjdGVkLCB3ZSdyZSBnb2luZyB0byBmYWlsIHRoZSBhYm9ydAorICogICAgIGFuZCBsZXQgdGhlIGhpZ2ggbGV2ZWwgU0NTSSBkcml2ZXIgcmV0cnkgYXQgYSBsYXRlciB0aW1lIG9yCisgKiAgICAgaXNzdWUgYSByZXNldC4KKyAqCisgKiAgICAgVGltZW91dHMsIGFuZCB0aGVyZWZvcmUgYWJvcnRlZCBjb21tYW5kcywgd2lsbCBiZSBoaWdobHkgdW5saWtlbHkKKyAqICAgICBhbmQgaGFuZGxpbmcgdGhlbSBjbGVhbmx5IGluIHRoaXMgc2l0dWF0aW9uIHdvdWxkIG1ha2UgdGhlIGNvbW1vbgorICogICAgIGNhc2Ugb2Ygbm9yZXNldHMgbGVzcyBlZmZpY2llbnQsIGFuZCB3b3VsZCBwb2xsdXRlIG91ciBjb2RlLiAgU28sCisgKiAgICAgd2UgZmFpbC4KKyAqLworCisJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgPT0gY21kKSB7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiBBYm9ydGluZyBjb25uZWN0ZWQgY29tbWFuZCAlbGQgLSAiLCBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5waWQpOworCisJCXByaW50aygic2VuZGluZyB3ZDMzYzkzIEFCT1JUIGNvbW1hbmQgLSAiKTsKKwkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9BQk9SVCk7CisKKy8qIE5vdyB3ZSBoYXZlIHRvIGF0dGVtcHQgdG8gZmx1c2ggb3V0IHRoZSBGSUZPLi4uICovCisKKwkJcHJpbnRrKCJmbHVzaGluZyBmaWZvIC0gIik7CisJCXRpbWVvdXQgPSAxMDAwMDAwOworCQlkbyB7CisJCQlhc3IgPSBSRUFEX0FVWF9TVEFUKCk7CisJCQlpZiAoYXNyICYgQVNSX0RCUikKKwkJCQlyZWFkXzMzOTMoaG9zdGRhdGEsIFdEX0RBVEEpOworCQl9IHdoaWxlICghKGFzciAmIEFTUl9JTlQpICYmIHRpbWVvdXQtLSA+IDApOworCQlzciA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfU0NTSV9TVEFUVVMpOworCQlwcmludGsoImFzcj0lMDJ4LCBzcj0lMDJ4LCAlbGQgYnl0ZXMgdW4tdHJhbnNmZXJyZWQgKHRpbWVvdXQ9JWxkKSAtICIsIGFzciwgc3IsIHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSksIHRpbWVvdXQpOworCisJCS8qCisJCSAqIEFib3J0IGNvbW1hbmQgcHJvY2Vzc2VkLgorCQkgKiBTdGlsbCBjb25uZWN0ZWQuCisJCSAqIFdlIG11c3QgZGlzY29ubmVjdC4KKwkJICovCisKKwkJcHJpbnRrKCJzZW5kaW5nIHdkMzNjOTMgRElTQ09OTkVDVCBjb21tYW5kIC0gIik7CisJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfRElTQ09OTkVDVCk7CisKKwkJdGltZW91dCA9IDEwMDAwMDA7CisJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKKwkJd2hpbGUgKChhc3IgJiBBU1JfQ0lQKSAmJiB0aW1lb3V0LS0gPiAwKQorCQkJYXNyID0gUkVBRF9BVVhfU1RBVCgpOworCQlzciA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfU0NTSV9TVEFUVVMpOworCQlwcmludGsoImFzcj0lMDJ4LCBzcj0lMDJ4LiIsIGFzciwgc3IpOworCisJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisKKwkJaW4yMDAwX2V4ZWN1dGUoaW5zdGFuY2UpOworCisJCXJldHVybiBTVUNDRVNTOworCX0KKworLyoKKyAqIENhc2UgMzogSWYgdGhlIGNvbW1hbmQgaXMgY3VycmVudGx5IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMsCisgKiB3ZSdyZSBub3QgZ29pbmcgdG8gZXhwZW5kIG11Y2ggZWZmb3J0IGhlcmU6IExldCdzIGp1c3QgcmV0dXJuCisgKiBhbiBBQk9SVF9TTk9PWkUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0Li4uCisgKi8KKworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1E7IHRtcDsgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpCisJCWlmIChjbWQgPT0gdG1wKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiB1bmFibGUgdG8gYWJvcnQgZGlzY29ubmVjdGVkIGNvbW1hbmQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisKKy8qCisgKiBDYXNlIDQgOiBJZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQgaW4gYW55IG9mCisgKiAgICAgdGhlIHF1ZXVlcy4KKyAqCisgKiBXZSBwcm9iYWJseSByZWFjaGVkIHRoaXMgcG9pbnQgYmVjYXVzZSBvZiBhbiB1bmxpa2VseSByYWNlIGNvbmRpdGlvbgorICogYmV0d2VlbiB0aGUgY29tbWFuZCBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGFib3J0aW9uIGNvZGUsCisgKiBzbyB3ZSB3b24ndCBwYW5pYywgYnV0IHdlIHdpbGwgbm90aWZ5IHRoZSB1c2VyIGluIGNhc2Ugc29tZXRoaW5nIHJlYWxseQorICogYnJva2UuCisgKi8KKworCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKKworCXByaW50aygic2NzaSVkOiB3YXJuaW5nIDogU0NTSSBjb21tYW5kIHByb2JhYmx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiICIgICAgICAgICBiZWZvcmUgYWJvcnRpb24uICIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisKKyNkZWZpbmUgTUFYX0lOMjAwMF9IT1NUUyAzCisjZGVmaW5lIE1BWF9TRVRVUF9BUkdTIChzaXplb2Yoc2V0dXBfYXJncykgLyBzaXplb2YoY2hhciAqKSkKKyNkZWZpbmUgU0VUVVBfQlVGRkVSX1NJWkUgMjAwCitzdGF0aWMgY2hhciBzZXR1cF9idWZmZXJbU0VUVVBfQlVGRkVSX1NJWkVdOworc3RhdGljIGNoYXIgc2V0dXBfdXNlZFtNQVhfU0VUVVBfQVJHU107CitzdGF0aWMgaW50IGRvbmVfc2V0dXAgPSAwOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW4yMDAwX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCWludCBpOworCWNoYXIgKnAxLCAqcDI7CisKKwlzdHJsY3B5KHNldHVwX2J1ZmZlciwgc3RyLCBTRVRVUF9CVUZGRVJfU0laRSk7CisJcDEgPSBzZXR1cF9idWZmZXI7CisJaSA9IDA7CisJd2hpbGUgKCpwMSAmJiAoaSA8IE1BWF9TRVRVUF9BUkdTKSkgeworCQlwMiA9IHN0cmNocihwMSwgJywnKTsKKwkJaWYgKHAyKSB7CisJCQkqcDIgPSAnXDAnOworCQkJaWYgKHAxICE9IHAyKQorCQkJCXNldHVwX2FyZ3NbaV0gPSBwMTsKKwkJCXAxID0gcDIgKyAxOworCQkJaSsrOworCQl9IGVsc2UgeworCQkJc2V0dXBfYXJnc1tpXSA9IHAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9TRVRVUF9BUkdTOyBpKyspCisJCXNldHVwX3VzZWRbaV0gPSAwOworCWRvbmVfc2V0dXAgPSAxOworfQorCisKKy8qIGNoZWNrX3NldHVwX2FyZ3MoKSByZXR1cm5zIGluZGV4IGlmIGtleSBmb3VuZCwgMCBpZiBub3QKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBjaGVja19zZXR1cF9hcmdzKGNoYXIgKmtleSwgaW50ICp2YWwsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgeDsKKwljaGFyICpjcDsKKworCWZvciAoeCA9IDA7IHggPCBNQVhfU0VUVVBfQVJHUzsgeCsrKSB7CisJCWlmIChzZXR1cF91c2VkW3hdKQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcChzZXR1cF9hcmdzW3hdLCBrZXksIHN0cmxlbihrZXkpKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoeCA9PSBNQVhfU0VUVVBfQVJHUykKKwkJcmV0dXJuIDA7CisJc2V0dXBfdXNlZFt4XSA9IDE7CisJY3AgPSBzZXR1cF9hcmdzW3hdICsgc3RybGVuKGtleSk7CisJKnZhbCA9IC0xOworCWlmICgqY3AgIT0gJzonKQorCQlyZXR1cm4gKyt4OworCWNwKys7CisJaWYgKCgqY3AgPj0gJzAnKSAmJiAoKmNwIDw9ICc5JykpIHsKKwkJKnZhbCA9IHNpbXBsZV9zdHJ0b3VsKGNwLCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuICsreDsKK30KKworCisKKy8qIFRoZSAiY29ycmVjdCIgKGllIHBvcnRhYmxlKSB3YXkgdG8gYWNjZXNzIG1lbW9yeS1tYXBwZWQgaGFyZHdhcmUKKyAqIHN1Y2ggYXMgdGhlIElOMjAwMCBFUFJPTSBhbmQgZGlwIHN3aXRjaCBpcyB0aHJvdWdoIHRoZSB1c2Ugb2YKKyAqIHNwZWNpYWwgbWFjcm9zIGRlY2xhcmVkIGluICdhc20vaW8uaCcuIFdlIHVzZSByZWFkYigpIGFuZCByZWFkbCgpCisgKiB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgY2FyZCdzIEJJT1MgYXJlYSBpbiBpbjIwMDBfZGV0ZWN0KCkuCisgKi8KK3N0YXRpYyB1MzIgYmlvc190YWJbXSBpbjIwMDBfX0lOSVREQVRBID0geworCTB4YzgwMDAsCisJMHhkMDAwMCwKKwkweGQ4MDAwLAorCTAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiYXNlX3RhYltdIGluMjAwMF9fSU5JVERBVEEgPSB7CisJMHgyMjAsCisJMHgyMDAsCisJMHgxMTAsCisJMHgxMDAsCit9OworCitzdGF0aWMgaW50IGludF90YWJbXSBpbjIwMDBfX0lOSVREQVRBID0geworCTE1LAorCTE0LAorCTExLAorCTEwCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluMjAwMF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlpbnQgZGV0ZWN0X2NvdW50OworCWludCBiaW9zOworCWludCB4OworCXVuc2lnbmVkIHNob3J0IGJhc2U7CisJdWNoYXIgc3dpdGNoZXM7CisJdWNoYXIgaHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2YWw7CisJY2hhciBidWZbMzJdOworCisvKiBUaGFua3MgdG8gaGVscCBmcm9tIEJpbGwgRWFybmVzdCwgcHJvYmluZyBmb3IgSU4yMDAwIGNhcmRzIGlzIGEKKyAqIHByZXR0eSBzdHJhaWdodGZvcndhcmQgYW5kIGZvb2wtcHJvb2Ygb3BlcmF0aW9uLiBUaGVyZSBhcmUgMworICogcG9zc2libGUgbG9jYXRpb25zIGZvciB0aGUgSU4yMDAwIEVQUk9NIGluIG1lbW9yeSBzcGFjZSAtIGlmIHdlCisgKiBmaW5kIGEgQklPUyBzaWduYXR1cmUsIHdlIGNhbiByZWFkIHRoZSBkaXAgc3dpdGNoIHNldHRpbmdzIGZyb20KKyAqIHRoZSBieXRlIGF0IEJJT1MrMzIgKHNoYWRvd2VkIGluIGJ5IGxvZ2ljIG9uIHRoZSBjYXJkKS4gRnJvbSAyCisgKiBvZiB0aGUgc3dpdGNoIGJpdHMgd2UgZ2V0IHRoZSBjYXJkJ3MgYWRkcmVzcyBpbiBJTyBzcGFjZS4gVGhlcmUncworICogYW4gaW1hZ2Ugb2YgdGhlIGRpcCBzd2l0Y2ggdGhlcmUsIGFsc28sIHNvIHdlIGhhdmUgYSB3YXkgdG8gYmFjay0KKyAqIGNoZWNrIHRoYXQgdGhpcyByZWFsbHkgaXMgYW4gSU4yMDAwIGNhcmQuIFZlcnkgbmlmdHkuIFVzZSB0aGUKKyAqICdpb3BvcnQ6eHgnIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXIgaWYgeW91ciBCSU9TIEVQUk9NIGlzIGFic2VudAorICogb3IgZGlzYWJsZWQuCisgKi8KKworCWlmICghZG9uZV9zZXR1cCAmJiBzZXR1cF9zdHJpbmdzKQorCQlpbjIwMDBfc2V0dXAoc2V0dXBfc3RyaW5ncywgTlVMTCk7CisKKwlkZXRlY3RfY291bnQgPSAwOworCWZvciAoYmlvcyA9IDA7IGJpb3NfdGFiW2Jpb3NdOyBiaW9zKyspIHsKKwkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImlvcG9ydCIsICZ2YWwsIGJ1ZikpIHsKKwkJCWJhc2UgPSB2YWw7CisJCQlzd2l0Y2hlcyA9IH5pbmIoYmFzZSArIElPX1NXSVRDSEVTKSAmIDB4ZmY7CisJCQlwcmludGsoIkZvcmNpbmcgSU4yMDAwIGRldGVjdGlvbiBhdCBJT3BvcnQgMHgleCAiLCBiYXNlKTsKKwkJCWJpb3MgPSAyOworCQl9CisvKgorICogVGhlcmUgaGF2ZSBiZWVuIGEgY291cGxlIG9mIEJJT1MgdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQgbGF5b3V0cworICogZm9yIHRoZSBvYnZpb3VzIElEIHN0cmluZ3MuIFdlIGxvb2sgZm9yIHRoZSAyIG1vc3QgY29tbW9uIG9uZXMgYW5kCisgKiBob3BlIHRoYXQgdGhleSBjb3ZlciBhbGwgdGhlIGNhc2VzLi4uCisgKi8KKwkJZWxzZSBpZiAoaXNhX3JlYWRsKGJpb3NfdGFiW2Jpb3NdICsgMHgxMCkgPT0gMHg0MTU2NGY0ZSB8fCBpc2FfcmVhZGwoYmlvc190YWJbYmlvc10gKyAweDMwKSA9PSAweDYxNzc2YzQxKSB7CisJCQlwcmludGsoIkZvdW5kIElOMjAwMCBCSU9TIGF0IDB4JXggIiwgKHVuc2lnbmVkIGludCkgYmlvc190YWJbYmlvc10pOworCisvKiBSZWFkIHRoZSBzd2l0Y2ggaW1hZ2UgdGhhdCdzIG1hcHBlZCBpbnRvIEVQUk9NIHNwYWNlICovCisKKwkJCXN3aXRjaGVzID0gfigoaXNhX3JlYWRiKGJpb3NfdGFiW2Jpb3NdICsgMHgyMCkgJiAweGZmKSk7CisKKy8qIEZpbmQgb3V0IHdoZXJlIHRoZSBJTyBzcGFjZSBpcyAqLworCisJCQl4ID0gc3dpdGNoZXMgJiAoU1dfQUREUjAgfCBTV19BRERSMSk7CisJCQliYXNlID0gYmFzZV90YWJbeF07CisKKy8qIENoZWNrIGZvciB0aGUgSU4yMDAwIHNpZ25hdHVyZSBpbiBJTyBzcGFjZS4gKi8KKworCQkJeCA9IH5pbmIoYmFzZSArIElPX1NXSVRDSEVTKSAmIDB4ZmY7CisJCQlpZiAoeCAhPSBzd2l0Y2hlcykgeworCQkJCXByaW50aygiQmFkIElPIHNpZ25hdHVyZTogJTAyeCB2cyAlMDJ4LlxuIiwgeCwgc3dpdGNoZXMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UKKwkJCWNvbnRpbnVlOworCisvKiBPSy4gV2UgaGF2ZSBhIGJhc2UgYWRkcmVzcyBmb3IgdGhlIElPIHBvcnRzIC0gcnVuIGEgZmV3IHNhZmV0eSBjaGVja3MgKi8KKworCQlpZiAoIShzd2l0Y2hlcyAmIFNXX0JJVDcpKSB7CS8qIEkgX3RoaW5rXyBhbGwgY2FyZHMgZG8gdGhpcyAqLworCQkJcHJpbnRrKCJUaGVyZSBpcyBubyBJTi0yMDAwIFNDU0kgY2FyZCBhdCBJT3BvcnQgMHglMDN4IVxuIiwgYmFzZSk7CisJCQljb250aW51ZTsKKwkJfQorCisvKiBMZXQncyBhc3N1bWUgYW55IGhhcmR3YXJlIHZlcnNpb24gd2lsbCB3b3JrLCBhbHRob3VnaCB0aGUgZHJpdmVyCisgKiBoYXMgb25seSBiZWVuIHRlc3RlZCBvbiAweDIxLCAweDIyLCAweDI1LCAweDI2LCBhbmQgMHgyNy4gV2UnbGwKKyAqIHByaW50IG91dCB0aGUgcmV2IG51bWJlciBmb3IgcmVmZXJlbmNlIGxhdGVyLCBidXQgYWNjZXB0IHRoZW0gYWxsLgorICovCisKKwkJaHJldiA9IGluYihiYXNlICsgSU9fSEFSRFdBUkUpOworCisJCS8qIEJpdCAyIHRlbGxzIHVzIGlmIGludGVycnVwdHMgYXJlIGRpc2FibGVkICovCisJCWlmIChzd2l0Y2hlcyAmIFNXX0RJU0lOVCkgeworCQkJcHJpbnRrKCJUaGUgSU4tMjAwMCBTQ1NJIGNhcmQgYXQgSU9wb3J0IDB4JTAzeCAiLCBiYXNlKTsKKwkJCXByaW50aygiaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGludGVycnVwdCBvcGVyYXRpb24hXG4iKTsKKwkJCXByaW50aygiVGhpcyBkcml2ZXIgcmVxdWlyZXMgYW4gaW50ZXJydXB0OiBjYW5jZWxsaW5nIGRldGVjdGlvbi5cbiIpOworCQkJY29udGludWU7CisJCX0KKworLyogT2suIFdlIGFjY2VwdCB0aGF0IHRoZXJlJ3MgYW4gSU4yMDAwIGF0IGlvYWRkciAnYmFzZScuIE5vdworICogaW5pdGlhbGl6ZSBpdC4KKyAqLworCisJCXRwbnQtPnByb2NfbmFtZSA9ICJpbjIwMDAiOworCQlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEpKTsKKwkJaWYgKGluc3RhbmNlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZGV0ZWN0X2NvdW50Kys7CisJCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCQlpbnN0YW5jZS0+aW9fcG9ydCA9IGhvc3RkYXRhLT5pb19iYXNlID0gYmFzZTsKKwkJaG9zdGRhdGEtPmRpcF9zd2l0Y2ggPSBzd2l0Y2hlczsKKwkJaG9zdGRhdGEtPmhyZXYgPSBocmV2OworCisJCXdyaXRlMV9pbygwLCBJT19GSUZPX1dSSVRFKTsJLyogY2xlYXIgZmlmbyBjb3VudGVyICovCisJCXdyaXRlMV9pbygwLCBJT19GSUZPX1JFQUQpOwkvKiBzdGFydCBmaWZvIG91dCBpbiByZWFkIG1vZGUgKi8KKwkJd3JpdGUxX2lvKDAsIElPX0lOVFJfTUFTSyk7CS8qIGFsbG93IGFsbCBpbnRzICovCisJCXggPSBpbnRfdGFiWyhzd2l0Y2hlcyAmIChTV19JTlQwIHwgU1dfSU5UMSkpID4+IFNXX0lOVF9TSElGVF07CisJCWlmIChyZXF1ZXN0X2lycSh4LCBpbjIwMDBfaW50ciwgU0FfSU5URVJSVVBULCAiaW4yMDAwIiwgaW5zdGFuY2UpKSB7CisJCQlwcmludGsoImluMjAwMF9kZXRlY3Q6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlEuXG4iKTsKKwkJCWRldGVjdF9jb3VudC0tOworCQkJY29udGludWU7CisJCX0KKwkJaW5zdGFuY2UtPmlycSA9IHg7CisJCWluc3RhbmNlLT5uX2lvX3BvcnQgPSAxMzsKKwkJcmVxdWVzdF9yZWdpb24oYmFzZSwgMTMsICJpbjIwMDAiKTsJLyogbG9jayBpbiB0aGlzIElPIHNwYWNlIGZvciBvdXIgdXNlICovCisKKwkJZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworCQkJaG9zdGRhdGEtPmJ1c3lbeF0gPSAwOworCQkJaG9zdGRhdGEtPnN5bmNfeGZlclt4XSA9IGNhbGNfc3luY194ZmVyKERFRkFVTFRfU1hfUEVSIC8gNCwgREVGQVVMVF9TWF9PRkYpOworCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFt4XSA9IFNTX1VOU0VUOwkvKiB1c2luZyBkZWZhdWx0IHN5bmMgdmFsdWVzICovCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJCQlob3N0ZGF0YS0+Y21kX2NudFt4XSA9IDA7CisJCQlob3N0ZGF0YS0+ZGlzY19hbGxvd2VkX2NudFt4XSA9IDA7CisJCQlob3N0ZGF0YS0+ZGlzY19kb25lX2NudFt4XSA9IDA7CisjZW5kaWYKKwkJfQorCQlob3N0ZGF0YS0+aW5wdXRfUSA9IE5VTEw7CisJCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gTlVMTDsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1VOVVNFRDsKKwkJaG9zdGRhdGEtPmxldmVsMiA9IEwyX0JBU0lDOworCQlob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IERJU19BREFQVElWRTsKKwkJaG9zdGRhdGEtPmFyZ3MgPSBERUJVR19ERUZBVUxUUzsKKwkJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7CisJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAwOworCQlob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgPSBERUZBVUxUX1NYX1BFUjsKKworLyogT2xkZXIgQklPUydzIGhhZCBhICdzeW5jIG9uL29mZicgc3dpdGNoIC0gdXNlIGl0cyBzZXR0aW5nICovCisKKwkJaWYgKGlzYV9yZWFkbChiaW9zX3RhYltiaW9zXSArIDB4MTApID09IDB4NDE1NjRmNGUgJiYgKHN3aXRjaGVzICYgU1dfU1lOQ19ET1M1KSkKKwkJCWhvc3RkYXRhLT5zeW5jX29mZiA9IDB4MDA7CS8qIHN5bmMgZGVmYXVsdHMgdG8gb24gKi8KKwkJZWxzZQorCQkJaG9zdGRhdGEtPnN5bmNfb2ZmID0gMHhmZjsJLyogc3luYyBkZWZhdWx0cyB0byBvZmYgKi8KKworI2lmZGVmIFBST0NfSU5URVJGQUNFCisJCWhvc3RkYXRhLT5wcm9jID0gUFJfVkVSU0lPTiB8IFBSX0lORk8gfCBQUl9TVEFUSVNUSUNTIHwgUFJfQ09OTkVDVEVEIHwgUFJfSU5QVVRRIHwgUFJfRElTQ1EgfCBQUl9TVE9QOworI2lmZGVmIFBST0NfU1RBVElTVElDUworCQlob3N0ZGF0YS0+aW50X2NudCA9IDA7CisjZW5kaWYKKyNlbmRpZgorCisJCWlmIChjaGVja19zZXR1cF9hcmdzKCJub3N5bmMiLCAmdmFsLCBidWYpKQorCQkJaG9zdGRhdGEtPnN5bmNfb2ZmID0gdmFsOworCisJCWlmIChjaGVja19zZXR1cF9hcmdzKCJwZXJpb2QiLCAmdmFsLCBidWYpKQorCQkJaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyID0gc3hfdGFibGVbcm91bmRfcGVyaW9kKCh1bnNpZ25lZCBpbnQpIHZhbCldLnBlcmlvZF9uczsKKworCQlpZiAoY2hlY2tfc2V0dXBfYXJncygiZGlzY29ubmVjdCIsICZ2YWwsIGJ1ZikpIHsKKwkJCWlmICgodmFsID49IERJU19ORVZFUikgJiYgKHZhbCA8PSBESVNfQUxXQVlTKSkKKwkJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IHZhbDsKKwkJCWVsc2UKKwkJCQlob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IERJU19BREFQVElWRTsKKwkJfQorCisJCWlmIChjaGVja19zZXR1cF9hcmdzKCJub3Jlc2V0IiwgJnZhbCwgYnVmKSkKKwkJCWhvc3RkYXRhLT5hcmdzIF49IEFfTk9fU0NTSV9SRVNFVDsKKworCQlpZiAoY2hlY2tfc2V0dXBfYXJncygibGV2ZWwyIiwgJnZhbCwgYnVmKSkKKwkJCWhvc3RkYXRhLT5sZXZlbDIgPSB2YWw7CisKKwkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImRlYnVnIiwgJnZhbCwgYnVmKSkKKwkJCWhvc3RkYXRhLT5hcmdzID0gKHZhbCAmIERCX01BU0spOworCisjaWZkZWYgUFJPQ19JTlRFUkZBQ0UKKwkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoInByb2MiLCAmdmFsLCBidWYpKQorCQkJaG9zdGRhdGEtPnByb2MgPSB2YWw7CisjZW5kaWYKKworCisJCS8qIEZJWE1FOiBub3Qgc3RyaWN0bHkgbmVlZGVkIEkgdGhpbmsgYnV0IHRoZSBjYWxsZWQgY29kZSBleHBlY3RzCisJCSAgIHRvIGJlIGxvY2tlZCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXggPSByZXNldF9oYXJkd2FyZShpbnN0YW5jZSwgKGhvc3RkYXRhLT5hcmdzICYgQV9OT19TQ1NJX1JFU0VUKSA/IFJFU0VUX0NBUkQgOiBSRVNFVF9DQVJEX0FORF9CVVMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCQlob3N0ZGF0YS0+bWljcm9jb2RlID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9DREJfMSk7CisJCWlmICh4ICYgMHgwMSkgeworCQkJaWYgKHggJiBCX0ZMQUcpCisJCQkJaG9zdGRhdGEtPmNoaXAgPSBDX1dEMzNDOTNCOworCQkJZWxzZQorCQkJCWhvc3RkYXRhLT5jaGlwID0gQ19XRDMzQzkzQTsKKwkJfSBlbHNlCisJCQlob3N0ZGF0YS0+Y2hpcCA9IENfV0QzM0M5MzsKKworCQlwcmludGsoImRpcF9zd2l0Y2g9JTAyeCBpcnE9JWQgaW9wb3J0PSUwMnggZmxvcHB5PSVzIHN5bmMvRE9TNT0lcyAiLCAoc3dpdGNoZXMgJiAweDdmKSwgaW5zdGFuY2UtPmlycSwgaG9zdGRhdGEtPmlvX2Jhc2UsIChzd2l0Y2hlcyAmIFNXX0ZMT1BQWSkgPyAiWWVzIiA6ICJObyIsIChzd2l0Y2hlcyAmIFNXX1NZTkNfRE9TNSkgPyAiWWVzIiA6ICJObyIpOworCQlwcmludGsoImhhcmR3YXJlX3Zlcj0lMDJ4IGNoaXA9JXMgbWljcm9jb2RlPSUwMnhcbiIsIGhyZXYsIChob3N0ZGF0YS0+Y2hpcCA9PSBDX1dEMzNDOTMpID8gIldEMzNjOTMiIDogKGhvc3RkYXRhLT5jaGlwID09IENfV0QzM0M5M0EpID8gIldEMzNjOTNBIiA6IChob3N0ZGF0YS0+Y2hpcCA9PSBDX1dEMzNDOTNCKSA/ICJXRDMzYzkzQiIgOiAidW5rbm93biIsIGhvc3RkYXRhLT5taWNyb2NvZGUpOworI2lmZGVmIERFQlVHR0lOR19PTgorCQlwcmludGsoInNldHVwX2FyZ3MgPSAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IE1BWF9TRVRVUF9BUkdTOyB4KyspCisJCQlwcmludGsoIiVzLCIsIHNldHVwX2FyZ3NbeF0pOworCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJaWYgKGhvc3RkYXRhLT5zeW5jX29mZiA9PSAweGZmKQorCQkJcHJpbnRrKCJTeW5jLXRyYW5zZmVyIERJU0FCTEVEIG9uIGFsbCBkZXZpY2VzOiBFTkFCTEUgZnJvbSBjb21tYW5kLWxpbmVcbiIpOworCQlwcmludGsoIklOMjAwMCBkcml2ZXIgdmVyc2lvbiAlcyAtICVzXG4iLCBJTjIwMDBfVkVSU0lPTiwgSU4yMDAwX0RBVEUpOworCX0KKworCXJldHVybiBkZXRlY3RfY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaW4yMDAwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXJldHVybiAwOworfQorCisvKiBOT1RFOiBJIGxpZnRlZCB0aGlzIGZ1bmN0aW9uIHN0cmFpZ2h0IG91dCBvZiB0aGUgb2xkIGRyaXZlciwKKyAqICAgICAgIGFuZCBoYXZlIG5vdCB0ZXN0ZWQgaXQuIFByZXN1bWFibHkgaXQgZG9lcyB3aGF0IGl0J3MKKyAqICAgICAgIHN1cHBvc2VkIHRvIGRvLi4uCisgKi8KKworc3RhdGljIGludCBpbjIwMDBfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaWluZm8pCit7CisJaW50IHNpemU7CisKKwlzaXplID0gY2FwYWNpdHk7CisJaWluZm9bMF0gPSA2NDsKKwlpaW5mb1sxXSA9IDMyOworCWlpbmZvWzJdID0gc2l6ZSA+PiAxMTsKKworLyogVGhpcyBzaG91bGQgYXBwcm94aW1hdGUgdGhlIGxhcmdlIGRyaXZlIGhhbmRsaW5nIHRoYXQgdGhlIERPUyBBU1BJIG1hbmFnZXIKKyAgIHVzZXMuICBEcml2ZXMgdmVyeSBuZWFyIHRoZSBib3VuZGFyaWVzIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkgKGkuZS4KKyAgIG5lYXIgMi4wIEdiIGFuZCA0LjAgR2IpICovCisKKwlpZiAoaWluZm9bMl0gPiAxMDI0KSB7CisJCWlpbmZvWzBdID0gNjQ7CisJCWlpbmZvWzFdID0gNjM7CisJCWlpbmZvWzJdID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKGlpbmZvWzBdICogaWluZm9bMV0pOworCX0KKwlpZiAoaWluZm9bMl0gPiAxMDI0KSB7CisJCWlpbmZvWzBdID0gMTI4OworCQlpaW5mb1sxXSA9IDYzOworCQlpaW5mb1syXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChpaW5mb1swXSAqIGlpbmZvWzFdKTsKKwl9CisJaWYgKGlpbmZvWzJdID4gMTAyNCkgeworCQlpaW5mb1swXSA9IDI1NTsKKwkJaWluZm9bMV0gPSA2MzsKKwkJaWluZm9bMl0gPSAodW5zaWduZWQgbG9uZykgY2FwYWNpdHkgLyAoaWluZm9bMF0gKiBpaW5mb1sxXSk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaW4yMDAwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGxlbiwgaW50IGluKQoreworCisjaWZkZWYgUFJPQ19JTlRFUkZBQ0UKKworCWNoYXIgKmJwOworCWNoYXIgdGJ1ZlsxMjhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaGQ7CisJU2NzaV9DbW5kICpjbWQ7CisJaW50IHgsIGk7CisJc3RhdGljIGludCBzdG9wID0gMDsKKworCWhkID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisvKiBJZiAnaW4nIGlzIFRSVUUgd2UgbmVlZCB0byBfcmVhZF8gdGhlIHByb2MgZmlsZS4gV2UgYWNjZXB0IHRoZSBmb2xsb3dpbmcKKyAqIGtleXdvcmRzIChzYW1lIGZvcm1hdCBhcyBjb21tYW5kLWxpbmUsIGJ1dCBvbmx5IE9ORSBwZXIgcmVhZCk6CisgKiAgICBkZWJ1ZworICogICAgZGlzY29ubmVjdAorICogICAgcGVyaW9kCisgKiAgICByZXN5bmMKKyAqICAgIHByb2MKKyAqLworCisJaWYgKGluKSB7CisJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJYnAgPSBidWY7CisJCWlmICghc3RybmNtcChicCwgImRlYnVnOiIsIDYpKSB7CisJCQlicCArPSA2OworCQkJaGQtPmFyZ3MgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCkgJiBEQl9NQVNLOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAiZGlzY29ubmVjdDoiLCAxMSkpIHsKKwkJCWJwICs9IDExOworCQkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJCWlmICh4IDwgRElTX05FVkVSIHx8IHggPiBESVNfQUxXQVlTKQorCQkJCXggPSBESVNfQURBUFRJVkU7CisJCQloZC0+ZGlzY29ubmVjdCA9IHg7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJwZXJpb2Q6IiwgNykpIHsKKwkJCWJwICs9IDc7CisJCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQkJaGQtPmRlZmF1bHRfc3hfcGVyID0gc3hfdGFibGVbcm91bmRfcGVyaW9kKCh1bnNpZ25lZCBpbnQpIHgpXS5wZXJpb2RfbnM7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJyZXN5bmM6IiwgNykpIHsKKwkJCWJwICs9IDc7CisJCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJCQlpZiAoeCAmICgxIDw8IGkpKQorCQkJCQloZC0+c3luY19zdGF0W2ldID0gU1NfVU5TRVQ7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJwcm9jOiIsIDUpKSB7CisJCQlicCArPSA1OworCQkJaGQtPnByb2MgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJsZXZlbDI6IiwgNykpIHsKKwkJCWJwICs9IDc7CisJCQloZC0+bGV2ZWwyID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQl9CisJCXJldHVybiBsZW47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworCWJwID0gYnVmOworCSpicCA9ICdcMCc7CisJaWYgKGhkLT5wcm9jICYgUFJfVkVSU0lPTikgeworCQlzcHJpbnRmKHRidWYsICJcblZlcnNpb24gJXMgLSAlcy4gQ29tcGlsZWQgJXMgJXMiLCBJTjIwMDBfVkVSU0lPTiwgSU4yMDAwX0RBVEUsIF9fREFURV9fLCBfX1RJTUVfXyk7CisJCXN0cmNhdChicCwgdGJ1Zik7CisJfQorCWlmIChoZC0+cHJvYyAmIFBSX0lORk8pIHsKKwkJc3ByaW50Zih0YnVmLCAiXG5kaXBfc3dpdGNoPSUwMng6IGlycT0lZCBpbz0lMDJ4IGZsb3BweT0lcyBzeW5jL0RPUzU9JXMiLCAoaGQtPmRpcF9zd2l0Y2ggJiAweDdmKSwgaW5zdGFuY2UtPmlycSwgaGQtPmlvX2Jhc2UsIChoZC0+ZGlwX3N3aXRjaCAmIDB4NDApID8gIlllcyIgOiAiTm8iLCAoaGQtPmRpcF9zd2l0Y2ggJiAweDIwKSA/ICJZZXMiIDogIk5vIik7CisJCXN0cmNhdChicCwgdGJ1Zik7CisJCXN0cmNhdChicCwgIlxuc3luY194ZmVyW10gPSAgICAgICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlMDJ4IiwgaGQtPnN5bmNfeGZlclt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXN0cmNhdChicCwgIlxuc3luY19zdGF0W10gPSAgICAgICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlMDJ4IiwgaGQtPnN5bmNfc3RhdFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJfQorI2lmZGVmIFBST0NfU1RBVElTVElDUworCWlmIChoZC0+cHJvYyAmIFBSX1NUQVRJU1RJQ1MpIHsKKwkJc3RyY2F0KGJwLCAiXG5jb21tYW5kcyBpc3N1ZWQ6ICAgICIpOworCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKSB7CisJCQlzcHJpbnRmKHRidWYsICJcdCVsZCIsIGhkLT5jbWRfY250W3hdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwkJc3RyY2F0KGJwLCAiXG5kaXNjb25uZWN0cyBhbGxvd2VkOiIpOworCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKSB7CisJCQlzcHJpbnRmKHRidWYsICJcdCVsZCIsIGhkLT5kaXNjX2FsbG93ZWRfY250W3hdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwkJc3RyY2F0KGJwLCAiXG5kaXNjb25uZWN0cyBkb25lOiAgICIpOworCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKSB7CisJCQlzcHJpbnRmKHRidWYsICJcdCVsZCIsIGhkLT5kaXNjX2RvbmVfY250W3hdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwkJc3ByaW50Zih0YnVmLCAiXG5pbnRlcnJ1cHRzOiAgICAgIFx0JWxkIiwgaGQtPmludF9jbnQpOworCQlzdHJjYXQoYnAsIHRidWYpOworCX0KKyNlbmRpZgorCWlmIChoZC0+cHJvYyAmIFBSX0NPTk5FQ1RFRCkgeworCQlzdHJjYXQoYnAsICJcbmNvbm5lY3RlZDogICAgICIpOworCQlpZiAoaGQtPmNvbm5lY3RlZCkgeworCQkJY21kID0gKFNjc2lfQ21uZCAqKSBoZC0+Y29ubmVjdGVkOworCQkJc3ByaW50Zih0YnVmLCAiICVsZC0lZDolZCglMDJ4KSIsIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+Y21uZFswXSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJfQorCWlmIChoZC0+cHJvYyAmIFBSX0lOUFVUUSkgeworCQlzdHJjYXQoYnAsICJcbmlucHV0X1E6ICAgICAgICIpOworCQljbWQgPSAoU2NzaV9DbW5kICopIGhkLT5pbnB1dF9ROworCQl3aGlsZSAoY21kKSB7CisJCQlzcHJpbnRmKHRidWYsICIgJWxkLSVkOiVkKCUwMngpIiwgY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5jbW5kWzBdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCQljbWQgPSAoU2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJfQorCX0KKwlpZiAoaGQtPnByb2MgJiBQUl9ESVNDUSkgeworCQlzdHJjYXQoYnAsICJcbmRpc2Nvbm5lY3RlZF9ROiIpOworCQljbWQgPSAoU2NzaV9DbW5kICopIGhkLT5kaXNjb25uZWN0ZWRfUTsKKwkJd2hpbGUgKGNtZCkgeworCQkJc3ByaW50Zih0YnVmLCAiICVsZC0lZDolZCglMDJ4KSIsIGNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+Y21uZFswXSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQkJY21kID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCX0KKwl9CisJaWYgKGhkLT5wcm9jICYgUFJfVEVTVCkgeworCQk7CQkvKiBpbnNlcnQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9uIGhlcmUgKi8KKwl9CisJc3RyY2F0KGJwLCAiXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkqc3RhcnQgPSBidWY7CisJaWYgKHN0b3ApIHsKKwkJc3RvcCA9IDA7CisJCXJldHVybiAwOwkvKiByZXR1cm4gMCB0byBzaWduYWwgZW5kLW9mLWZpbGUgKi8KKwl9CisJaWYgKG9mZiA+IDB4NDAwMDApCS8qIEFMV0FZUyBzdG9wIGFmdGVyIDI1NmsgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgKi8KKwkJc3RvcCA9IDE7CisJaWYgKGhkLT5wcm9jICYgUFJfU1RPUCkJLyogc3RvcCBldmVyeSBvdGhlciB0aW1lICovCisJCXN0b3AgPSAxOworCXJldHVybiBzdHJsZW4oYnApOworCisjZWxzZQkJCQkvKiBQUk9DX0lOVEVSRkFDRSAqLworCisJcmV0dXJuIDA7CisKKyNlbmRpZgkJCQkvKiBQUk9DX0lOVEVSRkFDRSAqLworCit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lICAgICAgIAkJPSAiaW4yMDAwIiwKKwkucHJvY19pbmZvICAgICAgIAkJPSBpbjIwMDBfcHJvY19pbmZvLAorCS5uYW1lICAgICAgICAgICAgCQk9ICJBbHdheXMgSU4yMDAwIiwKKwkuZGV0ZWN0ICAgICAgICAgIAkJPSBpbjIwMDBfZGV0ZWN0LCAKKwkucmVsZWFzZQkJCT0gaW4yMDAwX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZCAgICAJCT0gaW4yMDAwX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBpbjIwMDBfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCQk9IGluMjAwMF9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gaW4yMDAwX2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gaW4yMDAwX2hvc3RfcmVzZXQsIAorCS5iaW9zX3BhcmFtICAgICAgCQk9IGluMjAwMF9iaW9zcGFyYW0sIAorCS5jYW5fcXVldWUgICAgICAgCQk9IElOMjAwMF9DQU5fUSwKKwkudGhpc19pZCAgICAgICAgIAkJPSBJTjIwMDBfSE9TVF9JRCwKKwkuc2dfdGFibGVzaXplICAgIAkJPSBJTjIwMDBfU0csCisJLmNtZF9wZXJfbHVuICAgICAJCT0gSU4yMDAwX0NQTCwKKwkudXNlX2NsdXN0ZXJpbmcgIAkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW4yMDAwLmggYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5ZTQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pbjIwMDAuaApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqICAgIGluMjAwMC5oIC0gIExpbnV4IGRldmljZSBkcml2ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZQorICogICAgICAgICAgICAgICAgQWx3YXlzIElOMjAwMCBJU0EgU0NTSSBjYXJkLgorICoKKyAqICAgIElNUE9SVEFOVDogVGhpcyBmaWxlIGlzIGZvciB2ZXJzaW9uIDEuMzMgLSAyNi9BdWcvMTk5OAorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiBKb2huIFNoaWZmbGV0dCwgR2VvTG9nIENvbnN1bHRpbmcKKyAqICAgIGpvaG5AZ2VvbG9nLmNvbQorICogICAganNoaWZmbGVAbmV0Y29tLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBJTjIwMDBfSAorI2RlZmluZSBJTjIwMDBfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgUFJPQ19JTlRFUkZBQ0UgICAgIC8qIGFkZCBjb2RlIGZvciAvcHJvYy9zY3NpL2luMjAwMC94eHggaW50ZXJmYWNlICovCisjaWZkZWYgIFBST0NfSU5URVJGQUNFCisjZGVmaW5lIFBST0NfU1RBVElTVElDUyAgICAvKiBhZGQgY29kZSBmb3Iga2VlcGluZyB2YXJpb3VzIHJlYWwgdGltZSBzdGF0cyAqLworI2VuZGlmCisKKyNkZWZpbmUgU1lOQ19ERUJVRyAgICAgICAgIC8qIGV4dHJhIGluZm8gb24gc3luYyBuZWdvdGlhdGlvbiBwcmludGVkICovCisjZGVmaW5lIERFQlVHR0lOR19PTiAgICAgICAvKiBlbmFibGUgY29tbWFuZC1saW5lIGRlYnVnZ2luZyBiaXRtYXNrICovCisjZGVmaW5lIERFQlVHX0RFRkFVTFRTIDAgICAvKiBkZWZhdWx0IGJpdG1hc2sgLSBjaGFuZ2UgZnJvbSBjb21tYW5kLWxpbmUgKi8KKworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIEZBU1RfUkVBRF9JTyAgICAgICAvKiBObyBwcm9ibGVtcyB3aXRoIHRoZXNlIG9uIG15IG1hY2hpbmUgKi8KKyNkZWZpbmUgRkFTVF9XUklURV9JTworI2VuZGlmCisKKyNpZmRlZiBERUJVR0dJTkdfT04KKyNkZWZpbmUgREIoZixhKSBpZiAoaG9zdGRhdGEtPmFyZ3MgJiAoZikpIGE7CisjZGVmaW5lIENIRUNLX05VTEwocCxzKSAvKiBpZiAoIShwKSkge3ByaW50aygiXG4iKTsgd2hpbGUgKDEpIHByaW50aygiTlA6JXNcciIsKHMpKTt9ICovCisjZWxzZQorI2RlZmluZSBEQihmLGEpCisjZGVmaW5lIENIRUNLX05VTEwocCxzKQorI2VuZGlmCisKKyNkZWZpbmUgdWNoYXIgdW5zaWduZWQgY2hhcgorCisjZGVmaW5lIHJlYWQxX2lvKGEpICAgICAoaW5iKGhvc3RkYXRhLT5pb19iYXNlKyhhKSkpCisjZGVmaW5lIHJlYWQyX2lvKGEpICAgICAoaW53KGhvc3RkYXRhLT5pb19iYXNlKyhhKSkpCisjZGVmaW5lIHdyaXRlMV9pbyhiLGEpICAob3V0YigoYiksaG9zdGRhdGEtPmlvX2Jhc2UrKGEpKSkKKyNkZWZpbmUgd3JpdGUyX2lvKHcsYSkgIChvdXR3KCh3KSxob3N0ZGF0YS0+aW9fYmFzZSsoYSkpKQorCisjaWZkZWYgX19pMzg2X18KKy8qIFRoZXNlIGlubGluZSBhc3NlbWJseSBkZWZpbmVzIGFyZSBkZXJpdmVkIGZyb20gYSBwYXRjaAorICogc2VudCB0byBtZSBieSBCaWxsIEVhcm5lc3QuIEhlJ3MgZG9uZSBhIGxvdCBvZiB2ZXJ5CisgKiB2YWx1YWJsZSB0aGlua2luZywgdGVzdGluZywgYW5kIGNvZGluZyBkdXJpbmcgaGlzIGVmZm9ydAorICogdG8gc3F1ZWV6ZSBtb3JlIHNwZWVkIG91dCBvZiB0aGlzIGRyaXZlci4gSSByZWFsbHkgdGhpbmsKKyAqIHRoYXQgd2UgYXJlIGRvaW5nIElPIGF0IGNsb3NlIHRvIHRoZSBtYXhpbXVtIG5vdyB3aXRoCisgKiB0aGUgZmlmby4gKEFuZCB5ZXMsIGluc3cgdXNlcyAnZWRpJyB3aGlsZSBvdXRzdyB1c2VzCisgKiAnZXNpJy4gVGhhbmtzIEJpbGwhKQorICovCisKKyNkZWZpbmUgRkFTVF9SRUFEMl9JTygpICAgIFwKKyh7IFwKK2ludCBfX2R1bW15XzEsX19kdW1teV8yOyBcCisgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlxuIFwKKyAgIGNsZCAgICAgICAgICAgICAgICAgICAgXG4gXAorICAgb3JsICUlZWN4LCAlJWVjeCAgICAgICBcbiBcCisgICBqeiAxZiAgICAgICAgICAgICAgICAgIFxuIFwKKyAgIHJlcCAgICAgICAgICAgICAgICAgICAgXG4gXAorICAgaW5zdyAoJSVkeCksJSVlczooJSVlZGkpIFxuIFwKKzE6ICIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogIj1EIiAoc3ApICwiPWMiIChfX2R1bW15XzEpICwiPWQiIChfX2R1bW15XzIpICAvKiBvdXRwdXQgKi8gICBcCisgICA6ICIyIiAoZiksICIwIiAoc3ApLCAiMSIgKGkpICAvKiBpbnB1dCAqLyAgICBcCisgICApOyAgICAgICAvKiB0cmFzaGVkICovIFwKK30pCisKKyNkZWZpbmUgRkFTVF9XUklURTJfSU8oKSAgIFwKKyh7IFwKK2ludCBfX2R1bW15XzEsX19kdW1teV8yOyBcCisgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlxuIFwKKyAgIGNsZCAgICAgICAgICAgICAgICAgICAgXG4gXAorICAgb3JsICUlZWN4LCAlJWVjeCAgICAgICBcbiBcCisgICBqeiAxZiAgICAgICAgICAgICAgICAgIFxuIFwKKyAgIHJlcCAgICAgICAgICAgICAgICAgICAgXG4gXAorICAgb3V0c3cgJSVkczooJSVlc2kpLCglJWR4KSBcbiBcCisxOiAiICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6ICI9UyIgKHNwKSAsIj1jIiAoX19kdW1teV8xKSAsIj1kIiAoX19kdW1teV8yKS8qIG91dHB1dCAqLyAgIFwKKyAgIDogIjIiIChmKSwgIjAiIChzcCksICIxIiAoaSkgIC8qIGlucHV0ICovICAgIFwKKyAgICk7ICAgICAgIC8qIHRyYXNoZWQgKi8gXAorfSkKKyNlbmRpZgorCisvKiBJTjIwMDAgaW9fcG9ydCBvZmZzZXRzICovCisjZGVmaW5lIElPX1dEX0FTUiAgICAgICAweDAwICAgICAvKiBSIC0gMzM5MyBhdXhzdGF0IHJlZyAqLworI2RlZmluZSAgICAgQVNSX0lOVCAgICAgICAgMHg4MAorI2RlZmluZSAgICAgQVNSX0xDSSAgICAgICAgMHg0MAorI2RlZmluZSAgICAgQVNSX0JTWSAgICAgICAgMHgyMAorI2RlZmluZSAgICAgQVNSX0NJUCAgICAgICAgMHgxMAorI2RlZmluZSAgICAgQVNSX1BFICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgQVNSX0RCUiAgICAgICAgMHgwMQorI2RlZmluZSBJT19XRF9BRERSICAgICAgMHgwMCAgICAgLyogVyAtIDMzOTMgYWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgSU9fV0RfREFUQSAgICAgIDB4MDEgICAgIC8qIFIvVyAtIHJlc3Qgb2YgMzM5MyByZWdzICovCisjZGVmaW5lIElPX0ZJRk8gICAgICAgICAweDAyICAgICAvKiBSL1cgLSBpbjIwMDAgZHVhbC1wb3J0IGZpZm8gKDE2IGJpdHMpICovCisjZGVmaW5lIElOMjAwMF9GSUZPX1NJWkUgICAyMDQ4ICAvKiAgICBmaWZvIGNhcGFjaXR5IGluIGJ5dGVzICovCisjZGVmaW5lIElPX0NBUkRfUkVTRVQgICAweDAzICAgICAvKiBXIC0gaW4yMDAwIHN0YXJ0IG1hc3RlciByZXNldCAqLworI2RlZmluZSBJT19GSUZPX0NPVU5UICAgMHgwNCAgICAgLyogUiAtIGluMjAwMCBmaWZvIGNvdW50ZXIgKi8KKyNkZWZpbmUgSU9fRklGT19XUklURSAgIDB4MDUgICAgIC8qIFcgLSBjbGVhciBmaWZvIGNvdW50ZXIsIHN0YXJ0IHdyaXRlICovCisjZGVmaW5lIElPX0ZJRk9fUkVBRCAgICAweDA3ICAgICAvKiBXIC0gc3RhcnQgZmlmbyByZWFkICovCisjZGVmaW5lIElPX0xFRF9PRkYgICAgICAweDA4ICAgICAvKiBXIC0gdHVybiBvZmYgaW4yMDAwIGFjdGl2aXR5IExFRCAqLworI2RlZmluZSBJT19TV0lUQ0hFUyAgICAgMHgwOCAgICAgLyogUiAtIHJlYWQgaW4yMDAwIGRpcCBzd2l0Y2ggKi8KKyNkZWZpbmUgICAgIFNXX0FERFIwICAgICAgIDB4MDEgIC8qICAgIGJpdCAwID0gYml0IDAgb2YgaW5kZXggdG8gaW8gYWRkciAqLworI2RlZmluZSAgICAgU1dfQUREUjEgICAgICAgMHgwMiAgLyogICAgYml0IDEgPSBiaXQgMSBvZiBpbmRleCBpbyBhZGRyICovCisjZGVmaW5lICAgICBTV19ESVNJTlQgICAgICAweDA0ICAvKiAgICBiaXQgMiB0cnVlIGlmIGludHMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgICAgIFNXX0lOVDAgICAgICAgIDB4MDggIC8qICAgIGJpdCAzID0gYml0IDAgb2YgaW5kZXggdG8gaW50ZXJydXB0ICovCisjZGVmaW5lICAgICBTV19JTlQxICAgICAgICAweDEwICAvKiAgICBiaXQgNCA9IGJpdCAxIG9mIGluZGV4IHRvIGludGVycnVwdCAqLworI2RlZmluZSAgICAgU1dfSU5UX1NISUZUICAgMyAgICAgLyogICAgc2hpZnQgcmlnaHQgdGhpcyBhbW91bnQgdG8gcmlnaHQganVzdGlmeSBpbnQgYml0cyAqLworI2RlZmluZSAgICAgU1dfU1lOQ19ET1M1ICAgMHgyMCAgLyogICAgYml0IDUgdXNlZCBieSBBbHdheXMgQklPUyAqLworI2RlZmluZSAgICAgU1dfRkxPUFBZICAgICAgMHg0MCAgLyogICAgYml0IDYgdHJ1ZSBpZiBmbG9wcHkgZW5hYmxlZCAqLworI2RlZmluZSAgICAgU1dfQklUNyAgICAgICAgMHg4MCAgLyogICAgYml0IDcgaGFyZHdpcmVkIHRydWUgKGdyb3VuZCkgKi8KKyNkZWZpbmUgSU9fTEVEX09OICAgICAgIDB4MDkgICAgIC8qIFcgLSB0dXJuIG9uIGluMjAwMCBhY3Rpdml0eSBMRUQgKi8KKyNkZWZpbmUgSU9fSEFSRFdBUkUgICAgIDB4MGEgICAgIC8qIFIgLSByZWFkIGluMjAwMCBoYXJkd2FyZSByZXYsIHN0b3AgcmVzZXQgKi8KKyNkZWZpbmUgSU9fSU5UUl9NQVNLICAgIDB4MGMgICAgIC8qIFcgLSBpbjIwMDAgaW50ZXJydXB0IG1hc2sgcmVnICovCisjZGVmaW5lICAgICBJTUFTS19XRCAgICAgICAweDAxICAvKiAgICBXRDMzYzkzIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICAgICBJTUFTS19GSUZPICAgICAweDAyICAvKiAgICBGSUZPIGludGVycnVwdCBtYXNrICovCisKKy8qIHdkIHJlZ2lzdGVyIG5hbWVzICovCisjZGVmaW5lIFdEX09XTl9JRCAgICAweDAwCisjZGVmaW5lIFdEX0NPTlRST0wgICAweDAxCisjZGVmaW5lIFdEX1RJTUVPVVRfUEVSSU9EICAweDAyCisjZGVmaW5lIFdEX0NEQl8xICAgICAweDAzCisjZGVmaW5lIFdEX0NEQl8yICAgICAweDA0CisjZGVmaW5lIFdEX0NEQl8zICAgICAweDA1CisjZGVmaW5lIFdEX0NEQl80ICAgICAweDA2CisjZGVmaW5lIFdEX0NEQl81ICAgICAweDA3CisjZGVmaW5lIFdEX0NEQl82ICAgICAweDA4CisjZGVmaW5lIFdEX0NEQl83ICAgICAweDA5CisjZGVmaW5lIFdEX0NEQl84ICAgICAweDBhCisjZGVmaW5lIFdEX0NEQl85ICAgICAweDBiCisjZGVmaW5lIFdEX0NEQl8xMCAgICAweDBjCisjZGVmaW5lIFdEX0NEQl8xMSAgICAweDBkCisjZGVmaW5lIFdEX0NEQl8xMiAgICAweDBlCisjZGVmaW5lIFdEX1RBUkdFVF9MVU4gICAgICAweDBmCisjZGVmaW5lIFdEX0NPTU1BTkRfUEhBU0UgICAweDEwCisjZGVmaW5lIFdEX1NZTkNIUk9OT1VTX1RSQU5TRkVSICAweDExCisjZGVmaW5lIFdEX1RSQU5TRkVSX0NPVU5UX01TQiAweDEyCisjZGVmaW5lIFdEX1RSQU5TRkVSX0NPVU5UICAweDEzCisjZGVmaW5lIFdEX1RSQU5TRkVSX0NPVU5UX0xTQiAweDE0CisjZGVmaW5lIFdEX0RFU1RJTkFUSU9OX0lEICAweDE1CisjZGVmaW5lIFdEX1NPVVJDRV9JRCAgICAweDE2CisjZGVmaW5lIFdEX1NDU0lfU1RBVFVTICAgICAweDE3CisjZGVmaW5lIFdEX0NPTU1BTkQgICAgICAweDE4CisjZGVmaW5lIFdEX0RBVEEgICAgICAweDE5CisjZGVmaW5lIFdEX1FVRVVFX1RBRyAgICAweDFhCisjZGVmaW5lIFdEX0FVWElMSUFSWV9TVEFUVVMgICAweDFmCisKKy8qIFdEIGNvbW1hbmRzICovCisjZGVmaW5lIFdEX0NNRF9SRVNFVCAgICAweDAwCisjZGVmaW5lIFdEX0NNRF9BQk9SVCAgICAweDAxCisjZGVmaW5lIFdEX0NNRF9BU1NFUlRfQVROICAweDAyCisjZGVmaW5lIFdEX0NNRF9ORUdBVEVfQUNLICAweDAzCisjZGVmaW5lIFdEX0NNRF9ESVNDT05ORUNUICAweDA0CisjZGVmaW5lIFdEX0NNRF9SRVNFTEVDVCAgICAweDA1CisjZGVmaW5lIFdEX0NNRF9TRUxfQVROICAgICAweDA2CisjZGVmaW5lIFdEX0NNRF9TRUwgICAgICAweDA3CisjZGVmaW5lIFdEX0NNRF9TRUxfQVROX1hGRVIgICAweDA4CisjZGVmaW5lIFdEX0NNRF9TRUxfWEZFUiAgICAweDA5CisjZGVmaW5lIFdEX0NNRF9SRVNFTF9SRUNFSVZFICAweDBhCisjZGVmaW5lIFdEX0NNRF9SRVNFTF9TRU5EICAweDBiCisjZGVmaW5lIFdEX0NNRF9XQUlUX1NFTF9SRUNFSVZFIDB4MGMKKyNkZWZpbmUgV0RfQ01EX1RSQU5TX0FERFIgIDB4MTgKKyNkZWZpbmUgV0RfQ01EX1RSQU5TX0lORk8gIDB4MjAKKyNkZWZpbmUgV0RfQ01EX1RSQU5TRkVSX1BBRCAgIDB4MjEKKyNkZWZpbmUgV0RfQ01EX1NCVF9NT0RFICAgIDB4ODAKKworLyogU0NTSSBCdXMgUGhhc2VzICovCisjZGVmaW5lIFBIU19EQVRBX09VVCAgICAweDAwCisjZGVmaW5lIFBIU19EQVRBX0lOICAgICAweDAxCisjZGVmaW5lIFBIU19DT01NQU5EICAgICAweDAyCisjZGVmaW5lIFBIU19TVEFUVVMgICAgICAweDAzCisjZGVmaW5lIFBIU19NRVNTX09VVCAgICAweDA2CisjZGVmaW5lIFBIU19NRVNTX0lOICAgICAweDA3CisKKy8qIENvbW1hbmQgU3RhdHVzIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyAgLyogcmVzZXQgc3RhdGUgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfUkVTRVQgICAgMHgwMAorI2RlZmluZSBDU1JfUkVTRVRfQUYgICAgMHgwMQorCisgIC8qIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIENTUl9SRVNFTEVDVCAgICAweDEwCisjZGVmaW5lIENTUl9TRUxFQ1QgICAgICAweDExCisjZGVmaW5lIENTUl9TRUxfWEZFUl9ET05FICAweDE2CisjZGVmaW5lIENTUl9YRkVSX0RPTkUgICAgICAweDE4CisKKyAgLyogcGF1c2VkIG9yIGFib3J0ZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfTVNHSU4gICAgMHgyMAorI2RlZmluZSBDU1JfU0RQICAgICAgICAgMHgyMQorI2RlZmluZSBDU1JfU0VMX0FCT1JUICAgICAgMHgyMgorI2RlZmluZSBDU1JfUkVTRUxfQUJPUlQgICAgMHgyNQorI2RlZmluZSBDU1JfUkVTRUxfQUJPUlRfQU0gMHgyNworI2RlZmluZSBDU1JfQUJPUlQgICAgMHgyOAorCisgIC8qIHRlcm1pbmF0ZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfSU5WQUxJRCAgICAgMHg0MAorI2RlZmluZSBDU1JfVU5FWFBfRElTQyAgICAgMHg0MQorI2RlZmluZSBDU1JfVElNRU9VVCAgICAgMHg0MgorI2RlZmluZSBDU1JfUEFSSVRZICAgICAgMHg0MworI2RlZmluZSBDU1JfUEFSSVRZX0FUTiAgICAgMHg0NAorI2RlZmluZSBDU1JfQkFEX1NUQVRVUyAgICAgMHg0NQorI2RlZmluZSBDU1JfVU5FWFAgICAgMHg0OAorCisgIC8qIHNlcnZpY2UgcmVxdWlyZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfUkVTRUwgICAgMHg4MAorI2RlZmluZSBDU1JfUkVTRUxfQU0gICAgMHg4MQorI2RlZmluZSBDU1JfRElTQyAgICAgMHg4NQorI2RlZmluZSBDU1JfU1JWX1JFUSAgICAgMHg4OAorCisgICAvKiBPd24gSUQvQ0RCIFNpemUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT1dOSURfRUFGICAgIDB4MDgKKyNkZWZpbmUgT1dOSURfRUhQICAgIDB4MTAKKyNkZWZpbmUgT1dOSURfUkFGICAgIDB4MjAKKyNkZWZpbmUgT1dOSURfRlNfOCAgIDB4MDAKKyNkZWZpbmUgT1dOSURfRlNfMTIgIDB4NDAKKyNkZWZpbmUgT1dOSURfRlNfMTYgIDB4ODAKKworICAgLyogQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBDVFJMX0hTUCAgICAgMHgwMQorI2RlZmluZSBDVFJMX0hBICAgICAgMHgwMgorI2RlZmluZSBDVFJMX0lESSAgICAgMHgwNAorI2RlZmluZSBDVFJMX0VESSAgICAgMHgwOAorI2RlZmluZSBDVFJMX0hIUCAgICAgMHgxMAorI2RlZmluZSBDVFJMX1BPTExFRCAgMHgwMAorI2RlZmluZSBDVFJMX0JVUlNUICAgMHgyMAorI2RlZmluZSBDVFJMX0JVUyAgICAgMHg0MAorI2RlZmluZSBDVFJMX0RNQSAgICAgMHg4MAorCisgICAvKiBUaW1lb3V0IFBlcmlvZCByZWdpc3RlciAqLworI2RlZmluZSBUSU1FT1VUX1BFUklPRF9WQUxVRSAgMjAgICAgLyogcmVzdWx0cyBpbiAyMDAgbXMuICovCisKKyAgIC8qIFN5bmNocm9ub3VzIFRyYW5zZmVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFNUUl9GU1MgICAgICAweDgwCisKKyAgIC8qIERlc3RpbmF0aW9uIElEIHJlZ2lzdGVyICovCisjZGVmaW5lIERTVElEX0RQRCAgICAweDQwCisjZGVmaW5lIERBVEFfT1VUX0RJUiAwCisjZGVmaW5lIERBVEFfSU5fRElSICAxCisjZGVmaW5lIERTVElEX1NDQyAgICAweDgwCisKKyAgIC8qIFNvdXJjZSBJRCByZWdpc3RlciAqLworI2RlZmluZSBTUkNJRF9NQVNLICAgMHgwNworI2RlZmluZSBTUkNJRF9TSVYgICAgMHgwOAorI2RlZmluZSBTUkNJRF9EU1AgICAgMHgyMAorI2RlZmluZSBTUkNJRF9FUyAgICAgMHg0MAorI2RlZmluZSBTUkNJRF9FUiAgICAgMHg4MAorCisKKworI2RlZmluZSBJTExFR0FMX1NUQVRVU19CWVRFICAgMHhmZgorCisKKyNkZWZpbmUgREVGQVVMVF9TWF9QRVIgICAgIDUwMCAgIC8qIChucykgZmFpcmx5IHNhZmUgKi8KKyNkZWZpbmUgREVGQVVMVF9TWF9PRkYgICAgIDAgICAgIC8qIGFrYSBhc3luYyAqLworCisjZGVmaW5lIE9QVElNVU1fU1hfUEVSICAgICAyNTIgICAvKiAobnMpIGJlc3Qgd2UgY2FuIGRvIChtdWx0LW9mLTQpICovCisjZGVmaW5lIE9QVElNVU1fU1hfT0ZGICAgICAxMiAgICAvKiBzaXplIG9mIGluMjAwMCBmaWZvICovCisKK3N0cnVjdCBzeF9wZXJpb2QgeworICAgdW5zaWduZWQgaW50ICAgcGVyaW9kX25zOworICAgdWNoYXIgICAgICAgICAgcmVnX3ZhbHVlOworICAgfTsKKworCitzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhIHsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpuZXh0OworICAgIHVjaGFyICAgICAgICAgICAgY2hpcDsgICAgICAgICAgICAgLyogd2hhdCBraW5kIG9mIHdkMzNjOTMgY2hpcD8gKi8KKyAgICB1Y2hhciAgICAgICAgICAgIG1pY3JvY29kZTsgICAgICAgIC8qIG1pY3JvY29kZSByZXYgaWYgJ0InICovCisgICAgdW5zaWduZWQgc2hvcnQgICBpb19iYXNlOyAgICAgICAgICAvKiBJTyBwb3J0IGJhc2UgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIGRpcF9zd2l0Y2g7ICAgICAgIC8qIGRpcCBzd2l0Y2ggc2V0dGluZ3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIGhyZXY7ICAgICAgICAgICAgIC8qIGhhcmR3YXJlIHJldmlzaW9uIG9mIGNhcmQgKi8KKyAgICB2b2xhdGlsZSB1Y2hhciAgIGJ1c3lbOF07ICAgICAgICAgIC8qIGluZGV4ID0gdGFyZ2V0LCBiaXQgPSBsdW4gKi8KKyAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKmlucHV0X1E7ICAgICAgIC8qIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgc3RhcnRlZCAqLworICAgIHZvbGF0aWxlIFNjc2lfQ21uZCAqc2VsZWN0aW5nOyAgICAgLyogdHJ5aW5nIHRvIHNlbGVjdCB0aGlzIGNvbW1hbmQgKi8KKyAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKmNvbm5lY3RlZDsgICAgIC8qIGN1cnJlbnRseSBjb25uZWN0ZWQgY29tbWFuZCAqLworICAgIHZvbGF0aWxlIFNjc2lfQ21uZCAqZGlzY29ubmVjdGVkX1E7LyogY29tbWFuZHMgd2FpdGluZyBmb3IgcmVjb25uZWN0ICovCisgICAgdWNoYXIgICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgICAvKiB3aGF0IHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIGZpZm87ICAgICAgICAgICAgIC8qIHdoYXQgdGhlIEZJRk8gaXMgdXAgdG8gKi8KKyAgICB1Y2hhciAgICAgICAgICAgIGxldmVsMjsgICAgICAgICAgIC8qIGV4dGVudCB0byB3aGljaCBMZXZlbC0yIGNvbW1hbmRzIGFyZSB1c2VkICovCisgICAgdWNoYXIgICAgICAgICAgICBkaXNjb25uZWN0OyAgICAgICAvKiBkaXNjb25uZWN0L3Jlc2VsZWN0IHBvbGljeSAqLworICAgIHVuc2lnbmVkIGludCAgICAgYXJnczsgICAgICAgICAgICAgLyogc2V0IGZyb20gY29tbWFuZC1saW5lIGFyZ3VtZW50ICovCisgICAgdWNoYXIgICAgICAgICAgICBpbmNvbWluZ19tc2dbOF07ICAvKiBmaWxsZWQgZHVyaW5nIG1lc3NhZ2VfaW4gcGhhc2UgKi8KKyAgICBpbnQgICAgICAgICAgICAgIGluY29taW5nX3B0cjsgICAgIC8qIG1haW5seSB1c2VkIHdpdGggRVhURU5ERUQgbWVzc2FnZXMgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIG91dGdvaW5nX21zZ1s4XTsgIC8qIHNlbmQgdGhpcyBkdXJpbmcgbmV4dCBtZXNzYWdlX291dCAqLworICAgIGludCAgICAgICAgICAgICAgb3V0Z29pbmdfbGVuOyAgICAgLyogbGVuZ3RoIG9mIG91dGdvaW5nIG1lc3NhZ2UgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgIGRlZmF1bHRfc3hfcGVyOyAgIC8qIGRlZmF1bHQgdHJhbnNmZXIgcGVyaW9kIGZvciBTQ1NJIGJ1cyAqLworICAgIHVjaGFyICAgICAgICAgICAgc3luY194ZmVyWzhdOyAgICAgLyogc3luY194ZmVyIHJlZyBzZXR0aW5ncyBwZXIgdGFyZ2V0ICovCisgICAgdWNoYXIgICAgICAgICAgICBzeW5jX3N0YXRbOF07ICAgICAvKiBzdGF0dXMgb2Ygc3luYyBuZWdvdGlhdGlvbiBwZXIgdGFyZ2V0ICovCisgICAgdWNoYXIgICAgICAgICAgICBzeW5jX29mZjsgICAgICAgICAvKiBiaXQgbWFzazogZG9uJ3QgdXNlIHN5bmMgd2l0aCB0aGVzZSB0YXJnZXRzICovCisjaWZkZWYgUFJPQ19JTlRFUkZBQ0UKKyAgICB1Y2hhciAgICAgICAgICAgIHByb2M7ICAgICAgICAgICAgIC8qIGJpdCBtYXNrOiB3aGF0J3MgaW4gcHJvYyBvdXRwdXQgKi8KKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKyAgICB1bnNpZ25lZCBsb25nICAgIGNtZF9jbnRbOF07ICAgICAgIC8qICMgb2YgY29tbWFuZHMgaXNzdWVkIHBlciB0YXJnZXQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGludF9jbnQ7ICAgICAgICAgIC8qICMgb2YgaW50ZXJydXB0cyBzZXJ2aWNlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgZGlzY19hbGxvd2VkX2NudFs4XTsgLyogIyBvZiBkaXNjb25uZWN0cyBhbGxvd2VkIHBlciB0YXJnZXQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGRpc2NfZG9uZV9jbnRbOF07IC8qICMgb2YgZGlzY29ubmVjdHMgZG9uZSBwZXIgdGFyZ2V0Ki8KKyNlbmRpZgorI2VuZGlmCisgICAgfTsKKworCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+Y2hpcCAqLworCisjZGVmaW5lIENfV0QzM0M5MyAgICAgICAwCisjZGVmaW5lIENfV0QzM0M5M0EgICAgICAxCisjZGVmaW5lIENfV0QzM0M5M0IgICAgICAyCisjZGVmaW5lIENfVU5LTk9XTl9DSElQICAxMDAKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnN0YXRlICovCisKKyNkZWZpbmUgU19VTkNPTk5FQ1RFRCAgICAgICAgIDAKKyNkZWZpbmUgU19TRUxFQ1RJTkcgICAgICAgICAgIDEKKyNkZWZpbmUgU19SVU5OSU5HX0xFVkVMMiAgICAgIDIKKyNkZWZpbmUgU19DT05ORUNURUQgICAgICAgICAgIDMKKyNkZWZpbmUgU19QUkVfVE1QX0RJU0MgICAgICAgIDQKKyNkZWZpbmUgU19QUkVfQ01QX0RJU0MgICAgICAgIDUKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmZpZm8gKi8KKworI2RlZmluZSBGSV9GSUZPX1VOVVNFRCAgICAgICAgMAorI2RlZmluZSBGSV9GSUZPX1JFQURJTkcgICAgICAgMQorI2RlZmluZSBGSV9GSUZPX1dSSVRJTkcgICAgICAgMgorCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+bGV2ZWwyICovCisvKiBOT1RFOiBvbmx5IHRoZSBmaXJzdCAzIGFyZSB0cnVzdHdvcnRoeSBhdCB0aGlzIHBvaW50IC0KKyAqIGhhdmluZyB0cm91YmxlIHdoZW4gbW9yZSB0aGFuIDEgZGV2aWNlIGlzIHJlYWRpbmcvd3JpdGluZworICogYXQgdGhlIHNhbWUgdGltZS4uLgorICovCisKKyNkZWZpbmUgTDJfTk9ORSAgICAgIDAgIC8qIG5vIGNvbWJpbmF0aW9uIGNvbW1hbmRzIC0gd2UgZ2V0IGxvdHMgb2YgaW50cyAqLworI2RlZmluZSBMMl9TRUxFQ1QgICAgMSAgLyogc3RhcnQgd2l0aCBTRUxfQVROX1hGRVIsIGJ1dCBuZXZlciByZXN1bWUgaXQgKi8KKyNkZWZpbmUgTDJfQkFTSUMgICAgIDIgIC8qIHJlc3VtZSBhZnRlciBTVEFUVVMgaW50cyAmIFJEUCBtZXNzYWdlcyAqLworI2RlZmluZSBMMl9EQVRBICAgICAgMyAgLyogcmVzdW1lIGFmdGVyIERBVEFfSU4vT1VUIGludHMgKi8KKyNkZWZpbmUgTDJfTU9TVCAgICAgIDQgIC8qIHJlc3VtZSBhZnRlciBhbnl0aGluZyBleGNlcHQgYSBSRVNFTEVDVCBpbnQgKi8KKyNkZWZpbmUgTDJfUkVTRUxFQ1QgIDUgIC8qIHJlc3VtZSBhZnRlciBldmVyeXRoaW5nLCBpbmNsdWRpbmcgUkVTRUxFQ1QgaW50cyAqLworI2RlZmluZSBMMl9BTEwgICAgICAgNiAgLyogYWx3YXlzIHJlc3VtZSAqLworCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+ZGlzY29ubmVjdCAqLworCisjZGVmaW5lIERJU19ORVZFUiAgICAwCisjZGVmaW5lIERJU19BREFQVElWRSAxCisjZGVmaW5lIERJU19BTFdBWVMgICAyCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5hcmdzICovCisKKyNkZWZpbmUgREJfVEVTVCAgICAgICAgICAgICAgIDE8PDAKKyNkZWZpbmUgREJfRklGTyAgICAgICAgICAgICAgIDE8PDEKKyNkZWZpbmUgREJfUVVFVUVfQ09NTUFORCAgICAgIDE8PDIKKyNkZWZpbmUgREJfRVhFQ1VURSAgICAgICAgICAgIDE8PDMKKyNkZWZpbmUgREJfSU5UUiAgICAgICAgICAgICAgIDE8PDQKKyNkZWZpbmUgREJfVFJBTlNGRVIgICAgICAgICAgIDE8PDUKKyNkZWZpbmUgREJfTUFTSyAgICAgICAgICAgICAgIDB4M2YKKworI2RlZmluZSBBX05PX1NDU0lfUkVTRVQgICAgICAgMTw8MTUKKworCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+c3luY194ZmVyW10gKi8KKworI2RlZmluZSBTU19VTlNFVCAgICAgMAorI2RlZmluZSBTU19GSVJTVCAgICAgMQorI2RlZmluZSBTU19XQUlUSU5HICAgMgorI2RlZmluZSBTU19TRVQgICAgICAgMworCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+cHJvYyAqLworCisjZGVmaW5lIFBSX1ZFUlNJT04gICAxPDwwCisjZGVmaW5lIFBSX0lORk8gICAgICAxPDwxCisjZGVmaW5lIFBSX1NUQVRJU1RJQ1MgMTw8MgorI2RlZmluZSBQUl9DT05ORUNURUQgMTw8MworI2RlZmluZSBQUl9JTlBVVFEgICAgMTw8NAorI2RlZmluZSBQUl9ESVNDUSAgICAgMTw8NQorI2RlZmluZSBQUl9URVNUICAgICAgMTw8NgorI2RlZmluZSBQUl9TVE9QICAgICAgMTw8NworCisKKyMgaW5jbHVkZSA8bGludXgvaW5pdC5oPgorIyBpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorIyBkZWZpbmUgaW4yMDAwX19JTklURlVOQyhmdW5jdGlvbikgX19pbml0ZnVuYyhmdW5jdGlvbikKKyMgZGVmaW5lIGluMjAwMF9fSU5JVCBfX2luaXQKKyMgZGVmaW5lIGluMjAwMF9fSU5JVERBVEEgX19pbml0ZGF0YQorIyBkZWZpbmUgQ0xJU1BJTl9MT0NLKGhvc3QsZmxhZ3MpICAgc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncykKKyMgZGVmaW5lIENMSVNQSU5fVU5MT0NLKGhvc3QsZmxhZ3MpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBcCisJCQkJCQkJICAgZmxhZ3MpCisKK3N0YXRpYyBpbnQgaW4yMDAwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKikgaW4yMDAwX19JTklUOworc3RhdGljIGludCBpbjIwMDBfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBpbnQgaW4yMDAwX2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyB2b2lkIGluMjAwMF9zZXR1cChjaGFyICosIGludCAqKSBpbjIwMDBfX0lOSVQ7CitzdGF0aWMgaW50IGluMjAwMF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJc2VjdG9yX3QsIGludCAqKTsKK3N0YXRpYyBpbnQgaW4yMDAwX2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBpbjIwMDBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgaW4yMDAwX2RldmljZV9yZXNldChTY3NpX0NtbmQgKik7CisKKworI2RlZmluZSBJTjIwMDBfQ0FOX1EgICAgMTYKKyNkZWZpbmUgSU4yMDAwX1NHICAgICAgIFNHX0FMTAorI2RlZmluZSBJTjIwMDBfQ1BMICAgICAgMgorI2RlZmluZSBJTjIwMDBfSE9TVF9JRCAgNworCisjZW5kaWYgLyogSU4yMDAwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pbml0aW8uYyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I3NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2luaXRpby5jCkBAIC0wLDAgKzEsMzE4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0aW8gOTEwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OCBJbml0aW8gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMTk5OCBCYXMgVmVybWV1bGVuIDxidmVybWV1bEBibGFja3N0YXIueHM0YWxsLm5sPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFdoZXJlIHRoaXMgU29mdHdhcmUgaXMgY29tYmluZWQgd2l0aCBzb2Z0d2FyZSByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhbmQgdGhlIHRlcm1zIG9mIHRoZSBHUEwgd291bGQgcmVxdWlyZSB0aGUgCisgKiBjb21iaW5lZCB3b3JrIHRvIGFsc28gYmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwsIHRoZSB0ZXJtcworICogYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIHdpbGwgYXBwbHkgaW4gYWRkaXRpb24gdG8gdGhvc2Ugb2YgdGhlCisgKiBHUEwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB0aGF0CisgKiBjb25mbGljdCB3aXRoLCBvciBhcmUgZXhwcmVzc2x5IHByb2hpYml0ZWQgYnksIHRoZSBHUEwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFRoaXMgaXMgdGhlIExpbnV4IGxvdy1sZXZlbCBTQ1NJIGRyaXZlciBmb3IgSW5pdGlvIElOSS05WDAwVS9VVyBTQ1NJIGhvc3QKKyAqIGFkYXB0ZXJzCisgKgorICogMDgvMDYvOTcgaGMJLSB2MS4wMWgKKyAqCQktIFN1cHBvcnQgaW5pYy05NDAgYW5kIGluaWMtOTM1CisgKiAwOS8yNi85NyBoYwktIHYxLjAxaQorICoJCS0gTWFrZSBjb3JyZWN0aW9uIGZyb20gSi5XLiBTY2h1bHR6IHN1Z2dlc3Rpb24KKyAqIDEwLzEzLzk3IGhjCS0gU3VwcG9ydCByZXNldCBmdW5jdGlvbgorICogMTAvMjEvOTcgaGMJLSB2MS4wMWoKKyAqCQktIFN1cHBvcnQgMzIgTFVOIChTQ1NJIDMpCisgKiAwMS8xNC85OCBoYwktIHYxLjAxaworICoJCS0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0KKyAqIDAzLzA0Lzk4IGhjCS0gdjEuMDFsCisgKgkJLSBGaXggdGFwZSByZXdpbmQgd2hpY2ggd2lsbCBoYW5nIHRoZSBzeXN0ZW0gcHJvYmxlbQorICoJCS0gU2V0IGNhbl9xdWV1ZSB0byB0dWxfbnVtX3NjYgorICogMDYvMjUvOTggaGMJLSB2MS4wMW0KKyAqCQktIEdldCBpdCB3b3JrIGZvciBrZXJuZWwgdmVyc2lvbiA+PSAyLjEuNzUKKyAqCQktIER5bmFtaWMgYXNzaWduIFNDU0kgYnVzIHJlc2V0IGhvbGRpbmcgdGltZSBpbiBpbml0X3R1bGlwKCkKKyAqIDA3LzAyLzk4IGhjCS0gdjEuMDFuCisgKgkJLSBTdXBwb3J0IDAwMDIxMzRBCisgKiAwOC8wNy85OCBoYyAgLSB2MS4wMW8KKyAqCQktIENoYW5nZSB0aGUgdHVsX2Fib3J0X3NyYiByb3V0aW5lIHRvIHVzZSBzY3NpX2RvbmUuIDwwMT4KKyAqIDA5LzA3Lzk4IGhsICAtIHYxLjAyCisgKiAgICAgICAgICAgICAgLSBDaGFuZ2UgdGhlIElOSTkxMDBVIGRlZmluZSBhbmQgcHJvY19kaXJfZW50cnkgdG8KKyAqICAgICAgICAgICAgICAgIHJlZmxlY3QgdGhlIG5ld2VyIEtlcm5lbCAyLjEuMTE4LCBidXQgdGhlIHYxLm8xbworICogICAgICAgICAgICAgICAgc2hvdWxkIHdvcmsgd2l0aCBLZXJuZWwgMi4xLjExOC4KKyAqIDA5LzIwLzk4IHdoICAtIHYxLjAyYQorICogICAgICAgICAgICAgIC0gU3VwcG9ydCBBYm9ydCBjb21tYW5kLgorICogICAgICAgICAgICAgIC0gSGFuZGxlIHJlc2V0IHJvdXRpbmUuCisgKiAwOS8yMS85OCBobCAgLSB2MS4wMworICogICAgICAgICAgICAgIC0gcmVtb3ZlIGNvbW1lbnRzLgorICogMTIvMDkvOTggYnYJLSB2MS4wM2EKKyAqCQktIFJlbW92ZWQgdW51c2VkIGNvZGUKKyAqIDEyLzEzLzk4IGJ2CS0gdjEuMDNiCisgKgkJLSBSZW1vdmUgY2xpKCkgbG9ja2luZyBmb3Iga2VybmVscyA+PSAyLjEuOTUuIFRoaXMgdXNlcworICoJCSAgc3BpbmxvY2tzIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBTUkJfaGVhZCBhbmQKKyAqCQkgIHBTUkJfdGFpbCBtZW1iZXJzIG9mIHRoZSBIQ1Mgc3RydWN0dXJlLgorICogMDkvMDEvOTkgYnYJLSB2MS4wM2QKKyAqCQktIEZpeGVkIGEgZGVhZGxvY2sgcHJvYmxlbSBpbiBTTVAuCisgKiAyMS8wMS85OSBidgktIHYxLjAzZQorICoJCS0gQWRkIHN1cHBvcnQgZm9yIHRoZSBEb21leCAzMTkyVSBQQ0kgU0NTSQorICoJCSAgVGhpcyBpcyBhIHNsaWdodGx5IG1vZGlmaWVkIHBhdGNoIGJ5CisgKgkJICBCcmlhbiBNYWN5IDxibWFjeUBzdW5zaGluZWNvbXB1dGluZy5jb20+CisgKiAyMi8wMi85OSBidgktIHYxLjAzZgorICoJCS0gRGlkbid0IGRldGVjdCB0aGUgSU5JQy05NTAgaW4gMi4wLnggY29ycmVjdGx5LgorICoJCSAgTm93IGZpeGVkLgorICogMDUvMDcvOTkgYnYJLSB2MS4wM2cKKyAqCQktIENoYW5nZWQgdGhlIGFzc3VtcHRpb24gdGhhdCBIWiA9IDEwMAorICogMTAvMTcvMDMgbWMJLSB2MS4wNAorICoJCS0gYWRkZWQgbmV3IERNQSBBUEkgc3VwcG9ydAorICogMDYvMDEvMDQgam1kCS0gdjEuMDRhCisgKgkJLSBSZS1hZGQgcmVzZXRfYnVzIHN1cHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorCisjaW5jbHVkZSAiaW5pdGlvLmgiCisKKyNkZWZpbmUgU0VOU0VfU0laRQkJMTQKKworI2RlZmluZSBpOTF1X01BWFFVRVVFCQkyCisjZGVmaW5lIGk5MXVfUkVWSUQgIkluaXRpbyBJTkktOVgwMFUvVVcgU0NTSSBkZXZpY2UgZHJpdmVyOyBSZXZpc2lvbjogMS4wNGEiCisKKyNkZWZpbmUgSU5JX1ZFTkRPUl9JRCAgIDB4MTEwMQkvKiBJbml0aW8ncyBQQ0kgdmVuZG9yIElEICAgICAgICovCisjZGVmaW5lIERNWF9WRU5ET1JfSUQJMHgxMzRhCS8qIERvbWV4J3MgUENJIHZlbmRvciBJRAkqLworI2RlZmluZSBJOTUwX0RFVklDRV9JRAkweDk1MDAJLyogSW5pdGlvJ3MgaW5pYy05NTAgcHJvZHVjdCBJRCAgICovCisjZGVmaW5lIEk5NDBfREVWSUNFX0lECTB4OTQwMAkvKiBJbml0aW8ncyBpbmljLTk0MCBwcm9kdWN0IElEICAgKi8KKyNkZWZpbmUgSTkzNV9ERVZJQ0VfSUQJMHg5NDAxCS8qIEluaXRpbydzIGluaWMtOTM1IHByb2R1Y3QgSUQgICAqLworI2RlZmluZSBJOTIwX0RFVklDRV9JRAkweDAwMDIJLyogSW5pdGlvJ3Mgb3RoZXIgcHJvZHVjdCBJRCAgICAgICovCisKKyNpZmRlZiBERUJVR19pOTF1CitzdGF0aWMgdW5zaWduZWQgaW50IGk5MXVfZGVidWcgPSBERUJVR19ERUZBVUxUOworI2VuZGlmCisKKyNkZWZpbmUgVFVMU1ooc3opICAgICAoc2l6ZW9mKHN6KSAvIHNpemVvZihzelswXSkpCisjZGVmaW5lIFRVTF9SRFdPUkQoeCx5KSAgICAgICAgIChzaG9ydCkoaW5sKChpbnQpKChVTE9ORykoKFVMT05HKXgrKFVDSEFSKXkpKSApKQorCit0eXBlZGVmIHN0cnVjdCBQQ0lfSURfU3RydWMgeworCXVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7Cit9IFBDSV9JRDsKKworc3RhdGljIGludCB0dWxfbnVtX2NoID0gNDsJLyogTWF4aW11bSA0IGFkYXB0ZXJzICAgICAgICAgICAqLworc3RhdGljIGludCB0dWxfbnVtX3NjYjsKK3N0YXRpYyBpbnQgdHVsX3RhZ19lbmFibGUgPSAxOworc3RhdGljIFNDQiAqdHVsX3NjYjsKKworI2lmZGVmIERFQlVHX2k5MXUKK3N0YXRpYyBpbnQgc2V0dXBfZGVidWcgPSAwOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGk5MXVTQ0JQb3N0KEJZVEUgKiBwSGNiLCBCWVRFICogcFNjYik7CisKK3N0YXRpYyBjb25zdCBQQ0lfSUQgaTkxdV9wY2lfZGV2aWNlc1tdID0geworCXsgSU5JX1ZFTkRPUl9JRCwgSTk1MF9ERVZJQ0VfSUQgfSwKKwl7IElOSV9WRU5ET1JfSUQsIEk5NDBfREVWSUNFX0lEIH0sCisJeyBJTklfVkVORE9SX0lELCBJOTM1X0RFVklDRV9JRCB9LAorCXsgSU5JX1ZFTkRPUl9JRCwgSTkyMF9ERVZJQ0VfSUQgfSwKKwl7IERNWF9WRU5ET1JfSUQsIEk5MjBfREVWSUNFX0lEIH0sCit9OworCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVCAwCisjZGVmaW5lIERFQlVHX1FVRVVFICAgICAwCisjZGVmaW5lIERFQlVHX1NUQVRFICAgICAwCisjZGVmaW5lIElOVF9ESVNDCTAKKworLyotLS0gZXh0ZXJuYWwgZnVuY3Rpb25zIC0tKi8KK3N0YXRpYyB2b2lkIHR1bF9zZTJfd2FpdCh2b2lkKTsKKworLyotLS0gZm9yd2FyZCByZWZyZW5jZSAtLS0qLworc3RhdGljIFNDQiAqdHVsX2ZpbmRfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgV09SRCB0YXJsdW4pOworc3RhdGljIFNDQiAqdHVsX2ZpbmRfZG9uZV9zY2IoSENTICogcEN1ckhjYik7CisKK3N0YXRpYyBpbnQgdHVsaXBfbWFpbihIQ1MgKiBwQ3VySGNiKTsKKworc3RhdGljIGludCB0dWxfbmV4dF9zdGF0ZShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N0YXRlXzEoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9zdGF0ZV8yKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfc3RhdGVfMyhIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N0YXRlXzQoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9zdGF0ZV81KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfc3RhdGVfNihIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N0YXRlXzcoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF94ZmVyX2RhdGFfaW4oSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF94ZmVyX2RhdGFfb3V0KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfeHBhZF9pbihIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3hwYWRfb3V0KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfc3RhdHVzX21zZyhIQ1MgKiBwQ3VySGNiKTsKKworc3RhdGljIGludCB0dWxfbXNnaW4oSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF9tc2dpbl9zeW5jKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfbXNnaW5fYWNjZXB0KEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfbXNnb3V0X3JlamVjdChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX21zZ2luX2V4dGVuZChIQ1MgKiBwQ3VySGNiKTsKKworc3RhdGljIGludCB0dWxfbXNnb3V0X2lkZShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX21zZ291dF9hYm9ydF90YXJnKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfbXNnb3V0X2Fib3J0X3RhZyhIQ1MgKiBwQ3VySGNiKTsKKworc3RhdGljIGludCB0dWxfYnVzX2RldmljZV9yZXNldChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyB2b2lkIHR1bF9zZWxlY3RfYXRuKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpOworc3RhdGljIHZvaWQgdHVsX3NlbGVjdF9hdG4zKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpOworc3RhdGljIHZvaWQgdHVsX3NlbGVjdF9hdG5fc3RvcChIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKTsKK3N0YXRpYyBpbnQgaW50X3R1bF9idXNmcmVlKEhDUyAqIHBDdXJIY2IpOworaW50IGludF90dWxfc2NzaV9yc3QoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IGludF90dWxfYmFkX3NlcShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgaW50X3R1bF9yZXNlbChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgdHVsX3N5bmNfZG9uZShIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgd2R0cl9kb25lKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB3YWl0X3R1bGlwKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfd2FpdF9kb25lX2Rpc2MoSENTICogcEN1ckhjYik7CitzdGF0aWMgaW50IHR1bF93YWl0X2Rpc2MoSENTICogcEN1ckhjYik7CitzdGF0aWMgdm9pZCB0dWxpcF9zY3NpKEhDUyAqIHBDdXJIY2IpOworc3RhdGljIGludCB0dWxfcG9zdF9zY3NpX3JzdChIQ1MgKiBwQ3VySGNiKTsKKworc3RhdGljIHZvaWQgdHVsX3NlMl9ld19lbihXT1JEIEN1ckJhc2UpOworc3RhdGljIHZvaWQgdHVsX3NlMl9ld19kcyhXT1JEIEN1ckJhc2UpOworc3RhdGljIGludCB0dWxfc2UyX3JkX2FsbChXT1JEIEN1ckJhc2UpOworc3RhdGljIHZvaWQgdHVsX3NlMl91cGRhdGVfYWxsKFdPUkQgQ3VyQmFzZSk7CS8qIHNldHVwIGRlZmF1bHQgcGF0dGVybiAqLworc3RhdGljIHZvaWQgdHVsX3JlYWRfZWVwcm9tKFdPUkQgQ3VyQmFzZSk7CisKKwkJCQkvKiAtLS0tIEVYVEVSTkFMIFZBUklBQkxFUyAtLS0tICovCitIQ1MgdHVsX2hjc1tNQVhfU1VQUE9SVEVEX0FEQVBURVJTXTsKKwkJCQkvKiAtLS0tIElOVEVSTkFMIFZBUklBQkxFUyAtLS0tICovCitzdGF0aWMgSU5JX0FEUFRfU1RSVUNUIGk5MXVfYWRwdFtNQVhfU1VQUE9SVEVEX0FEQVBURVJTXTsKKworLypOVlJBTSBudnJhbSwgKm52cmFtcCA9ICZudnJhbTsgKi8KK3N0YXRpYyBOVlJBTSBpOTF1bnZyYW07CitzdGF0aWMgTlZSQU0gKmk5MXVudnJhbXA7CisKKworCitzdGF0aWMgVUNIQVIgaTkxdWRmdE52UmFtWzY0XSA9Cit7CisvKi0tLS0tLS0tLS0tIGhlYWRlciAtLS0tLS0tLS0tLSovCisJMHgyNSwgMHhjOSwJCS8qIFNpZ25hdHVyZSAgICAqLworCTB4NDAsCQkJLyogU2l6ZSAgICAgICAgICovCisJMHgwMSwJCQkvKiBSZXZpc2lvbiAgICAgKi8KKwkvKiAtLSBIb3N0IEFkYXB0ZXIgU3RydWN0dXJlIC0tICovCisJMHg5NSwJCQkvKiBNb2RlbEJ5dGUwICAgKi8KKwkweDAwLAkJCS8qIE1vZGVsQnl0ZTEgICAqLworCTB4MDAsCQkJLyogTW9kZWxJbmZvICAgICovCisJMHgwMSwJCQkvKiBOdW1PZkNoICAgICAgKi8KKwlOQkMxX0RFRkFVTFQsCQkvKiBCSU9TQ29uZmlnMSAgKi8KKwkwLAkJCS8qIEJJT1NDb25maWcyICAqLworCTAsCQkJLyogSEFDb25maWcxICAgICovCisJMCwJCQkvKiBIQUNvbmZpZzIgICAgKi8KKwkvKiBTQ1NJIGNoYW5uZWwgMCBhbmQgdGFyZ2V0IFN0cnVjdHVyZSAgKi8KKwk3LAkJCS8qIFNDU0lpZCAgICAgICAqLworCU5DQzFfREVGQVVMVCwJCS8qIFNDU0ljb25maWcxICAqLworCTAsCQkJLyogU0NTSWNvbmZpZzIgICovCisJMHgxMCwJCQkvKiBOdW1TQ1NJdGFyZ2V0ICovCisKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKwlOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwKKworCS8qIFNDU0kgY2hhbm5lbCAxIGFuZCB0YXJnZXQgU3RydWN0dXJlICAqLworCTcsCQkJLyogU0NTSWlkICAgICAgICovCisJTkNDMV9ERUZBVUxULAkJLyogU0NTSWNvbmZpZzEgICovCisJMCwJCQkvKiBTQ1NJY29uZmlnMiAgKi8KKwkweDEwLAkJCS8qIE51bVNDU0l0YXJnZXQgKi8KKworCU5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULAorCU5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULAorCU5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULAorCU5UQ19ERUZBVUxULCBOVENfREVGQVVMVCwgTlRDX0RFRkFVTFQsIE5UQ19ERUZBVUxULAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMH07CQkJLyogICAgICAtIENoZWNrU3VtIC0gICAgICAgICAgICAqLworCisKK3N0YXRpYyBVQ0hBUiB0dWxfcmF0ZV90YmxbOF0gPQkvKiBmYXN0IDIwICAgICAgKi8KK3sKKwkJCQkvKiBuYW5vc2Vjb25kIGRldmlkZSBieSA0ICovCisJMTIsCQkJLyogNTBucywgIDIwTSAgICovCisJMTgsCQkJLyogNzVucywgIDEzLjNNICovCisJMjUsCQkJLyogMTAwbnMsIDEwTSAgICovCisJMzEsCQkJLyogMTI1bnMsIDhNICAgICovCisJMzcsCQkJLyogMTUwbnMsIDYuNk0gICovCisJNDMsCQkJLyogMTc1bnMsIDUuN00gICovCisJNTAsCQkJLyogMjAwbnMsIDVNICAgICovCisJNjIJCQkvKiAyNTBucywgNE0gICAgKi8KK307CisKK3N0YXRpYyB2b2lkIHR1bF9kb19wYXVzZSh1bnNpZ25lZCBhbW91bnQpCit7CQkJCS8qIFBhdXNlIGZvciBhbW91bnQgamlmZmllcyAqLworCXVuc2lnbmVkIGxvbmcgdGhlX3RpbWUgPSBqaWZmaWVzICsgYW1vdW50OworCisJd2hpbGUgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHRoZV90aW1lKSk7Cit9CisKKy8qLS0gZm9yd2FyZCByZWZlcmVuY2UgLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVVzZSBtZW1lb3J5IHJlZnJlc2ggdGltZSAgICAgICAgfiAxNXVzICogMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9zZTJfd2FpdCh2b2lkKQoreworI2lmIDEKKwl1ZGVsYXkoMzApOworI2Vsc2UKKwlVQ0hBUiByZWFkQnl0ZTsKKworCXJlYWRCeXRlID0gVFVMX1JEKDAsIDB4NjEpOworCWlmICgocmVhZEJ5dGUgJiAweDEwKSA9PSAweDEwKSB7CisJCWZvciAoOzspIHsKKwkJCXJlYWRCeXRlID0gVFVMX1JEKDAsIDB4NjEpOworCQkJaWYgKChyZWFkQnl0ZSAmIDB4MTApID09IDB4MTApCisJCQkJYnJlYWs7CisJCX0KKwkJZm9yICg7OykgeworCQkJcmVhZEJ5dGUgPSBUVUxfUkQoMCwgMHg2MSk7CisJCQlpZiAoKHJlYWRCeXRlICYgMHgxMCkgIT0gMHgxMCkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoOzspIHsKKwkJCXJlYWRCeXRlID0gVFVMX1JEKDAsIDB4NjEpOworCQkJaWYgKChyZWFkQnl0ZSAmIDB4MTApID09IDB4MTApCisJCQkJYnJlYWs7CisJCX0KKwkJZm9yICg7OykgeworCQkJcmVhZEJ5dGUgPSBUVUxfUkQoMCwgMHg2MSk7CisJCQlpZiAoKHJlYWRCeXRlICYgMHgxMCkgIT0gMHgxMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbnB1dDogaW5zdHJ1Y3Rpb24gZm9yICBTZXJpYWwgRTJQUk9NCisKKyBFWDogc2UyX3JkKDAgY2FsbCBzZTJfaW5zdHIoKSB0byBzZW5kIGFkZHJlc3MgYW5kIHJlYWQgY29tbWFuZAorCisJIFN0YXJ0Qml0ICBPUF9Db2RlICAgQWRkcmVzcyAgICAgICAgICAgICAgICBEYXRhCisJIC0tLS0tLS0tLSAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tCisJIDEgICAgICAgICAxICwgMCAgICAgQTUsQTQsQTMsQTIsQTEsQTAgICAgICBEMTUtRDAKKworCQkgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSB8CisgQ1MgLS0tLS0rCisJCQkrLS0rICArLS0rICArLS0rICArLS0rICArLS0rCisJCQleICB8ICBeICB8ICBeICB8ICBeICB8ICBeICB8CisJCQl8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8CisgQ0xLIC0tLS0tLS0rICArLS0rICArLS0rICArLS0rICArLS0rICArLS0KKyAobGVhZGluZyBlZGdlIHRyaWdnZXIpCisKKwkJICstLTEtLS0tLTEtLSsKKwkJIHwgU0IgICAgT1AgIHwgIE9QICAgIEE1ICAgIEE0CisgREkgIC0tLS0rICAgICAgICAgICArLS0wLS0tLS0tLS0tLS0tLS0tLS0tCisgKGFkZHJlc3MgYW5kIGNtZCBzZW50IHRvIG52cmFtKQorCisJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCQkJCQkJCQkJCQl8CisgRE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tCisgKGRhdGEgc2VudCBmcm9tIG52cmFtKQorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlMl9pbnN0cihXT1JEIEN1ckJhc2UsIFVDSEFSIGluc3RyKQoreworCWludCBpOworCVVDSEFSIGI7CisKKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MgfCBTRTJETyk7CS8qIGNzK3N0YXJ0IGJpdCAqLworCXR1bF9zZTJfd2FpdCgpOworCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyB8IFNFMkNMSyB8IFNFMkRPKTsJLyogK0NMSyAqLworCXR1bF9zZTJfd2FpdCgpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoaW5zdHIgJiAweDgwKQorCQkJYiA9IFNFMkNTIHwgU0UyRE87CS8qIC1DTEsrZGF0YUJpdCAqLworCQllbHNlCisJCQliID0gU0UyQ1M7CS8qIC1DTEsgKi8KKwkJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIGIpOworCQl0dWxfc2UyX3dhaXQoKTsKKwkJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIGIgfCBTRTJDTEspOwkvKiArQ0xLICovCisJCXR1bF9zZTJfd2FpdCgpOworCQlpbnN0ciA8PD0gMTsKKwl9CisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIFNFMkNTKTsJLyogLUNMSyAqLworCXR1bF9zZTJfd2FpdCgpOworCXJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiB0dWxfc2UyX2V3X2VuCisgRGVzY3JpcHRpb24gICAgOiBFbmFibGUgZXJhc2Uvd3JpdGUgc3RhdGUgb2Ygc2VyaWFsIEVFUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfc2UyX2V3X2VuKFdPUkQgQ3VyQmFzZSkKK3sKKwl0dWxfc2UyX2luc3RyKEN1ckJhc2UsIDB4MzApOwkvKiBFV0VOICovCisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIDApOwkJLyogLUNTICAqLworCXR1bF9zZTJfd2FpdCgpOworCXJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRGlzYWJsZSBlcmFzZS93cml0ZSBzdGF0ZSBvZiBzZXJpYWwgRUVQUk9NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfc2UyX2V3X2RzKFdPUkQgQ3VyQmFzZSkKK3sKKwl0dWxfc2UyX2luc3RyKEN1ckJhc2UsIDApOwkvKiBFV0RTICovCisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIDApOwkJLyogLUNTICAqLworCXR1bF9zZTJfd2FpdCgpOworCXJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJSW5wdXQgIDphZGRyZXNzIG9mIFNlcmlhbCBFMlBST00KKwlPdXRwdXQgOnZhbHVlIHN0b3JlZCBpbiAgU2VyaWFsIEUyUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VTSE9SVCB0dWxfc2UyX3JkKFdPUkQgQ3VyQmFzZSwgVUxPTkcgYWRyKQoreworCVVDSEFSIGluc3RyLCByZWFkQnl0ZTsKKwlVU0hPUlQgcmVhZFdvcmQ7CisJaW50IGk7CisKKwlpbnN0ciA9IChVQ0hBUikgKGFkciB8IDB4ODApOworCXR1bF9zZTJfaW5zdHIoQ3VyQmFzZSwgaW5zdHIpOwkvKiBSRUFEIElOU1RSICovCisJcmVhZFdvcmQgPSAwOworCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyB8IFNFMkNMSyk7CS8qICtDTEsgKi8KKwkJdHVsX3NlMl93YWl0KCk7CisJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyk7CS8qIC1DTEsgKi8KKworCQkvKiBzYW1wbGUgZGF0YSBhZnRlciB0aGUgZm9sbG93aW5nIGVkZ2Ugb2YgY2xvY2sgICovCisJCXJlYWRCeXRlID0gVFVMX1JEKEN1ckJhc2UsIFRVTF9OVlJBTSk7CisJCXJlYWRCeXRlICY9IFNFMkRJOworCQlyZWFkV29yZCArPSAocmVhZEJ5dGUgPDwgaSk7CisJCXR1bF9zZTJfd2FpdCgpOwkvKiA2LzIwLzk1ICovCisJfQorCisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfTlZSQU0sIDApOwkJLyogbm8gY2hpcCBzZWxlY3QgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKwlyZXR1cm4gcmVhZFdvcmQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIElucHV0OiBuZXcgdmFsdWUgaW4gIFNlcmlhbCBFMlBST00sIGFkZHJlc3Mgb2YgU2VyaWFsIEUyUFJPTQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlMl93cihXT1JEIEN1ckJhc2UsIFVDSEFSIGFkciwgVVNIT1JUIHdyaXRlV29yZCkKK3sKKwlVQ0hBUiByZWFkQnl0ZTsKKwlVQ0hBUiBpbnN0cjsKKwlpbnQgaTsKKworCWluc3RyID0gKFVDSEFSKSAoYWRyIHwgMHg0MCk7CisJdHVsX3NlMl9pbnN0cihDdXJCYXNlLCBpbnN0cik7CS8qIFdSSVRFIElOU1RSICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWlmICh3cml0ZVdvcmQgJiAweDgwMDApCisJCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MgfCBTRTJETyk7CS8qIC1DTEsrZGF0YUJpdCAxICovCisJCWVsc2UKKwkJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyk7CS8qIC1DTEsrZGF0YUJpdCAwICovCisJCXR1bF9zZTJfd2FpdCgpOworCQlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MgfCBTRTJDTEspOwkvKiArQ0xLICovCisJCXR1bF9zZTJfd2FpdCgpOworCQl3cml0ZVdvcmQgPDw9IDE7CisJfQorCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyk7CS8qIC1DTEsgKi8KKwl0dWxfc2UyX3dhaXQoKTsKKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgMCk7CQkvKiAtQ1MgICovCisJdHVsX3NlMl93YWl0KCk7CisKKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgU0UyQ1MpOwkvKiArQ1MgICovCisJdHVsX3NlMl93YWl0KCk7CisKKwlmb3IgKDs7KSB7CisJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyB8IFNFMkNMSyk7CS8qICtDTEsgKi8KKwkJdHVsX3NlMl93YWl0KCk7CisJCVRVTF9XUihDdXJCYXNlICsgVFVMX05WUkFNLCBTRTJDUyk7CS8qIC1DTEsgKi8KKwkJdHVsX3NlMl93YWl0KCk7CisJCWlmICgocmVhZEJ5dGUgPSBUVUxfUkQoQ3VyQmFzZSwgVFVMX05WUkFNKSkgJiBTRTJESSkKKwkJCWJyZWFrOwkvKiB3cml0ZSBjb21wbGV0ZSAqLworCX0KKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9OVlJBTSwgMCk7CQkvKiAtQ1MgKi8KKwlyZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUmVhZCBTQ1NJIEgvQSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZnJvbSBzZXJpYWwgRUVQUk9NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX3NlMl9yZF9hbGwoV09SRCBDdXJCYXNlKQoreworCWludCBpOworCVVMT05HIGNoa3N1bSA9IDA7CisJVVNIT1JUICpucDsKKworCWk5MXVudnJhbXAgPSAmaTkxdW52cmFtOworCW5wID0gKFVTSE9SVCAqKSBpOTF1bnZyYW1wOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCSpucCsrID0gdHVsX3NlMl9yZChDdXJCYXNlLCBpKTsKKwl9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS1JcyBzaWduYXR1cmUgImluaSIgb2sgPyAtLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoaTkxdW52cmFtcC0+TlZNX1NpZ25hdHVyZSAhPSBJTklfU0lHTkFUVVJFKQorCQlyZXR1cm4gLTE7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSXMgY2tlY2tzdW0gb2sgPyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlucCA9IChVU0hPUlQgKikgaTkxdW52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKykKKwkJY2hrc3VtICs9ICpucCsrOworCWlmIChpOTF1bnZyYW1wLT5OVk1fQ2hlY2tTdW0gIT0gKFVTSE9SVCkgY2hrc3VtKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVXBkYXRlIFNDU0kgSC9BIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmcm9tIHNlcmlhbCBFRVBST00KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlMl91cGRhdGVfYWxsKFdPUkQgQ3VyQmFzZSkKK3sJCQkJLyogc2V0dXAgZGVmYXVsdCBwYXR0ZXJuICovCisJaW50IGk7CisJVUxPTkcgY2hrc3VtID0gMDsKKwlVU0hPUlQgKm5wLCAqbnAxOworCisJaTkxdW52cmFtcCA9ICZpOTF1bnZyYW07CisJLyogQ2FsY3VsYXRlIGNoZWNrc3VtIGZpcnN0ICovCisJbnAgPSAoVVNIT1JUICopIGk5MXVkZnROdlJhbTsKKwlmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKykKKwkJY2hrc3VtICs9ICpucCsrOworCSpucCA9IChVU0hPUlQpIGNoa3N1bTsKKwl0dWxfc2UyX2V3X2VuKEN1ckJhc2UpOwkvKiBFbmFibGUgd3JpdGUgICovCisKKwlucCA9IChVU0hPUlQgKikgaTkxdWRmdE52UmFtOworCW5wMSA9IChVU0hPUlQgKikgaTkxdW52cmFtcDsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgbnArKywgbnAxKyspIHsKKwkJaWYgKCpucCAhPSAqbnAxKSB7CisJCQl0dWxfc2UyX3dyKEN1ckJhc2UsIGksICpucCk7CisJCX0KKwl9CisKKwl0dWxfc2UyX2V3X2RzKEN1ckJhc2UpOwkvKiBEaXNhYmxlIHdyaXRlICAgKi8KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb24gbmFtZSAgOiByZWFkX2VlcHJvbQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9yZWFkX2VlcHJvbShXT1JEIEN1ckJhc2UpCit7CisJVUNIQVIgZ2N0cmw7CisKKwlpOTF1bnZyYW1wID0gJmk5MXVudnJhbTsKKy8qLS0tLS0tRW5hYmxlIEVFUHJvbSBwcm9ncmFtbWluZyAtLS0qLworCWdjdHJsID0gVFVMX1JEKEN1ckJhc2UsIFRVTF9HQ1RSTCk7CisJVFVMX1dSKEN1ckJhc2UgKyBUVUxfR0NUUkwsIGdjdHJsIHwgVFVMX0dDVFJMX0VFUFJPTV9CSVQpOworCWlmICh0dWxfc2UyX3JkX2FsbChDdXJCYXNlKSAhPSAxKSB7CisJCXR1bF9zZTJfdXBkYXRlX2FsbChDdXJCYXNlKTsJLyogc2V0dXAgZGVmYXVsdCBwYXR0ZXJuICovCisJCXR1bF9zZTJfcmRfYWxsKEN1ckJhc2UpOwkvKiBsb2FkIGFnYWluICAqLworCX0KKy8qLS0tLS0tIERpc2FibGUgRUVQcm9tIHByb2dyYW1taW5nIC0tLSovCisJZ2N0cmwgPSBUVUxfUkQoQ3VyQmFzZSwgVFVMX0dDVFJMKTsKKwlUVUxfV1IoQ3VyQmFzZSArIFRVTF9HQ1RSTCwgZ2N0cmwgJiB+VFVMX0dDVFJMX0VFUFJPTV9CSVQpOworfQkJCQkvKiByZWFkX2VlcHJvbSAqLworCitpbnQgQWRkaTkxdV9pbnRvX0FkYXB0ZXJfdGFibGUoV09SRCB3QklPUywgV09SRCB3QkFTRSwgQllURSBiSW50ZXJydXB0LAorCQkJICAgICAgIEJZVEUgYkJ1cywgQllURSBiRGV2aWNlKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9TVVBQT1JURURfQURBUFRFUlM7IGkrKykgeworCQlpZiAoaTkxdV9hZHB0W2ldLkFEUFRfQklPUyA8IHdCSU9TKQorCQkJY29udGludWU7CisJCWlmIChpOTF1X2FkcHRbaV0uQURQVF9CSU9TID09IHdCSU9TKSB7CisJCQlpZiAoaTkxdV9hZHB0W2ldLkFEUFRfQkFTRSA9PSB3QkFTRSkgeworCQkJCWlmIChpOTF1X2FkcHRbaV0uQURQVF9CdXMgIT0gMHhGRikKKwkJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgaWYgKGk5MXVfYWRwdFtpXS5BRFBUX0JBU0UgPCB3QkFTRSkKKwkJCQkJY29udGludWU7CisJCX0KKwkJZm9yIChqID0gTUFYX1NVUFBPUlRFRF9BREFQVEVSUyAtIDE7IGogPiBpOyBqLS0pIHsKKwkJCWk5MXVfYWRwdFtqXS5BRFBUX0JBU0UgPSBpOTF1X2FkcHRbaiAtIDFdLkFEUFRfQkFTRTsKKwkJCWk5MXVfYWRwdFtqXS5BRFBUX0lOVFIgPSBpOTF1X2FkcHRbaiAtIDFdLkFEUFRfSU5UUjsKKwkJCWk5MXVfYWRwdFtqXS5BRFBUX0JJT1MgPSBpOTF1X2FkcHRbaiAtIDFdLkFEUFRfQklPUzsKKwkJCWk5MXVfYWRwdFtqXS5BRFBUX0J1cyA9IGk5MXVfYWRwdFtqIC0gMV0uQURQVF9CdXM7CisJCQlpOTF1X2FkcHRbal0uQURQVF9EZXZpY2UgPSBpOTF1X2FkcHRbaiAtIDFdLkFEUFRfRGV2aWNlOworCQl9CisJCWk5MXVfYWRwdFtpXS5BRFBUX0JBU0UgPSB3QkFTRTsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfSU5UUiA9IGJJbnRlcnJ1cHQ7CisJCWk5MXVfYWRwdFtpXS5BRFBUX0JJT1MgPSB3QklPUzsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfQnVzID0gYkJ1czsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfRGV2aWNlID0gYkRldmljZTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIGluaXRfaTkxdUFkYXB0ZXJfdGFibGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1VQUE9SVEVEX0FEQVBURVJTOyBpKyspIHsJLyogSW5pdGlhbGl6ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLworCQlpOTF1X2FkcHRbaV0uQURQVF9CSU9TID0gMHhmZmZmOworCQlpOTF1X2FkcHRbaV0uQURQVF9CQVNFID0gMHhmZmZmOworCQlpOTF1X2FkcHRbaV0uQURQVF9JTlRSID0gMHhmZjsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfQnVzID0gMHhmZjsKKwkJaTkxdV9hZHB0W2ldLkFEUFRfRGV2aWNlID0gMHhmZjsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIHR1bF9zdG9wX2JtKEhDUyAqIHBDdXJIY2IpCit7CisKKwlpZiAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfWFN0YXR1cykgJiBYUEVORCkgewkvKiBpZiBETUEgeGZlciBpcyBwZW5kaW5nLCBhYm9ydCBETUEgeGZlciAqLworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENtZCwgVEFYX1hfQUJUIHwgVEFYX1hfQ0xSX0ZJRk8pOworCQkvKiB3YWl0IEFib3J0IERNQSB4ZmVyIGRvbmUgKi8KKwkJd2hpbGUgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9JbnQpICYgWEFCVCkgPT0gMCk7CisJfQorCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X3R1bGlwUENJQ29uZmlnKEhDUyAqIHBDdXJIY2IsIGludCBjaF9pZHgpCit7CisJcEN1ckhjYi0+SENTX0Jhc2UgPSBpOTF1X2FkcHRbY2hfaWR4XS5BRFBUX0JBU0U7CS8qIFN1cHBseSBiYXNlIGFkZHJlc3MgICovCisJcEN1ckhjYi0+SENTX0JJT1MgPSBpOTF1X2FkcHRbY2hfaWR4XS5BRFBUX0JJT1M7CS8qIFN1cHBseSBCSU9TIGFkZHJlc3MgICovCisJcEN1ckhjYi0+SENTX0ludHIgPSBpOTF1X2FkcHRbY2hfaWR4XS5BRFBUX0lOVFI7CS8qIFN1cHBseSBpbnRlcnJ1cHQgbGluZSAqLworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfcmVzZXRfc2NzaShIQ1MgKiBwQ3VySGNiLCBpbnQgc2Vjb25kcykKK3sKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfUlNUX0JVUyk7CisKKwl3aGlsZSAoISgocEN1ckhjYi0+SENTX0pTSW50ID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ludCkpICYgVFNTX1NDU0lSU1RfSU5UKSk7CisJLyogcmVzZXQgdHVsaXAgY2hpcCAqLworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsIDApOworCisJLyogU3RhbGwgZm9yIGEgd2hpbGUsIHdhaXQgZm9yIHRhcmdldCdzIGZpcm13YXJlIHJlYWR5LG1ha2UgaXQgMiBzZWMgISAqLworCS8qIFNPTlkgNTIwMCB0YXBlIGRyaXZlIHdvbid0IHdvcmsgaWYgb25seSBzdGFsbCBmb3IgMSBzZWMgKi8KKwl0dWxfZG9fcGF1c2Uoc2Vjb25kcyAqIEhaKTsKKworCVRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NJbnQpOworCisJcmV0dXJuIChTQ1NJX1JFU0VUX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGluaXRfdHVsaXAoSENTICogcEN1ckhjYiwgU0NCICogc2NicCwgaW50IHR1bF9udW1fc2NiLCBCWVRFICogcGJCaW9zQWRyLCBpbnQgc2Vjb25kcykKK3sKKwlpbnQgaTsKKwlCWVRFICpwd0ZsYWdzOworCUJZVEUgKnBiSGVhZHM7CisJU0NCICpwVG1wU2NiLCAqcFByZXZTY2IgPSBOVUxMOworCisJcEN1ckhjYi0+SENTX051bVNjYnMgPSB0dWxfbnVtX3NjYjsKKwlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmcEN1ckhjYi0+SENTX1NlbWFwaExvY2spOworCXBDdXJIY2ItPkhDU19KU1N0YXR1czAgPSAwOworCXBDdXJIY2ItPkhDU19TY2IgPSBzY2JwOworCXBDdXJIY2ItPkhDU19OeHRQZW5kID0gc2NicDsKKwlwQ3VySGNiLT5IQ1NfTnh0QXZhaWwgPSBzY2JwOworCWZvciAoaSA9IDAsIHBUbXBTY2IgPSBzY2JwOyBpIDwgdHVsX251bV9zY2I7IGkrKywgcFRtcFNjYisrKSB7CisJCXBUbXBTY2ItPlNDQl9UYWdJZCA9IGk7CisJCWlmIChpICE9IDApCisJCQlwUHJldlNjYi0+U0NCX054dFNjYiA9IHBUbXBTY2I7CisJCXBQcmV2U2NiID0gcFRtcFNjYjsKKwl9CisJcFByZXZTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCXBDdXJIY2ItPkhDU19TY2JFbmQgPSBwVG1wU2NiOworCXBDdXJIY2ItPkhDU19GaXJzdEF2YWlsID0gc2NicDsKKwlwQ3VySGNiLT5IQ1NfTGFzdEF2YWlsID0gcFByZXZTY2I7CisJc3Bpbl9sb2NrX2luaXQoJnBDdXJIY2ItPkhDU19BdmFpbExvY2spOworCXBDdXJIY2ItPkhDU19GaXJzdFBlbmQgPSBOVUxMOworCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0ZpcnN0QnVzeSA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0xhc3RCdXN5ID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfRmlyc3REb25lID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfTGFzdERvbmUgPSBOVUxMOworCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBOVUxMOworCXBDdXJIY2ItPkhDU19BY3RUY3MgPSBOVUxMOworCisJdHVsX3JlYWRfZWVwcm9tKHBDdXJIY2ItPkhDU19CYXNlKTsKKy8qLS0tLS0tLS0tLSBnZXQgSC9BIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLSovCisJaWYgKGk5MXVudnJhbXAtPk5WTV9TQ1NJSW5mb1swXS5OVk1fTnVtT2ZUYXJnID09IDgpCisJCXBDdXJIY2ItPkhDU19NYXhUYXIgPSA4OworCWVsc2UKKwkJcEN1ckhjYi0+SENTX01heFRhciA9IDE2OworCisJcEN1ckhjYi0+SENTX0NvbmZpZyA9IGk5MXVudnJhbXAtPk5WTV9TQ1NJSW5mb1swXS5OVk1fQ2hDb25maWcxOworCisJcEN1ckhjYi0+SENTX1NDU0lfSUQgPSBpOTF1bnZyYW1wLT5OVk1fU0NTSUluZm9bMF0uTlZNX0NoU0NTSUlEOworCXBDdXJIY2ItPkhDU19JZE1hc2sgPSB+KDEgPDwgcEN1ckhjYi0+SENTX1NDU0lfSUQpOworCisjaWYgQ0hLX1BBUklUWQorCS8qIEVuYWJsZSBwYXJpdHkgZXJyb3IgcmVzcG9uc2UgKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfUENNRCwgVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfUENNRCkgfCAweDQwKTsKKyNlbmRpZgorCisJLyogTWFzayBhbGwgdGhlIGludGVycnVwdCAgICAgICAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKworCXR1bF9zdG9wX2JtKHBDdXJIY2IpOworCS8qIC0tLSBJbml0aWFsaXplIHRoZSB0dWxpcCAtLS0gKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfUlNUX0NISVApOworCisJLyogcHJvZ3JhbSBIQkEncyBTQ1NJIElEICAgICAgICAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2NzaUlkLCBwQ3VySGNiLT5IQ1NfU0NTSV9JRCA8PCA0KTsKKworCS8qIEVuYWJsZSBJbml0aWF0b3IgTW9kZSAscGhhc2UgbGF0Y2gsYWx0ZXJuYXRlIHN5bmMgcGVyaW9kIG1vZGUsCisJICAgZGlzYWJsZSBTQ1NJIHJlc2V0ICovCisJaWYgKHBDdXJIY2ItPkhDU19Db25maWcgJiBIQ0NfRU5fUEFSKQorCQlwQ3VySGNiLT5IQ1NfU0NvbmYxID0gKFRTQ19JTklUREVGQVVMVCB8IFRTQ19FTl9TQ1NJX1BBUik7CisJZWxzZQorCQlwQ3VySGNiLT5IQ1NfU0NvbmYxID0gKFRTQ19JTklUREVGQVVMVCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIHBDdXJIY2ItPkhDU19TQ29uZjEpOworCisJLyogRW5hYmxlIEhXIHJlc2VsZWN0ICAgICAgICAgICAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDEsIFRTQ19IV19SRVNFTEVDVCk7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1BlcmlvZCwgMCk7CisKKwkvKiBzZWxlY3Rpb24gdGltZSBvdXQgPSAyNTAgbXMgKi8KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1RpbWVPdXQsIDE1Myk7CisKKy8qLS0tLS0tLS0tIEVuYWJsZSBTQ1NJIHRlcm1pbmF0b3IgLS0tLS0qLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ3RybCwgKHBDdXJIY2ItPkhDU19Db25maWcgJiAoSENDX0FDVF9URVJNMSB8IEhDQ19BQ1RfVEVSTTIpKSk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX0dDVFJMMSwKKwkgICAgICAgKChwQ3VySGNiLT5IQ1NfQ29uZmlnICYgSENDX0FVVE9fVEVSTSkgPj4gNCkgfCAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfR0NUUkwxKSAmIDB4RkUpKTsKKworCWZvciAoaSA9IDAsCisJICAgICBwd0ZsYWdzID0gJiAoaTkxdW52cmFtcC0+TlZNX1NDU0lJbmZvWzBdLk5WTV9UYXJnMENvbmZpZyksCisJICAgICBwYkhlYWRzID0gcGJCaW9zQWRyICsgMHgxODA7CisJICAgICBpIDwgcEN1ckhjYi0+SENTX01heFRhcjsKKwkgICAgIGkrKywgcHdGbGFncysrKSB7CisJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0ZsYWdzID0gKnB3RmxhZ3MgJiB+KFRDRl9TWU5DX0RPTkUgfCBUQ0ZfV0RUUl9ET05FKTsKKwkJaWYgKHBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0ZsYWdzICYgVENGX0VOXzI1NSkKKwkJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0RydkZsYWdzID0gVENGX0RSVl8yNTVfNjM7CisJCWVsc2UKKwkJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0RydkZsYWdzID0gMDsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfSlNfUGVyaW9kID0gMDsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfU0NvbmZpZzAgPSBwQ3VySGNiLT5IQ1NfU0NvbmYxOworCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19EcnZIZWFkID0gKnBiSGVhZHMrKzsKKwkJaWYgKHBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0RydkhlYWQgPT0gMjU1KQorCQkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRHJ2RmxhZ3MgPSBUQ0ZfRFJWXzI1NV82MzsKKwkJZWxzZQorCQkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRHJ2RmxhZ3MgPSAwOworCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19EcnZTZWN0b3IgPSAqcGJIZWFkcysrOworCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19GbGFncyAmPSB+VENGX0JVU1k7CisJCXBDdXJIY2ItPkhDU19BY3RUYWdzW2ldID0gMDsKKwkJcEN1ckhjYi0+SENTX01heFRhZ3NbaV0gPSAweEZGOworCX0JCQkvKiBmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcHJpbnRrKCJpOTF1OiBQQ0kgQmFzZT0weCUwNFgsIElSUT0lZCwgQklPUz0weCUwNFgwLCBTQ1NJIElEPSVkXG4iLAorCSAgICAgICBwQ3VySGNiLT5IQ1NfQmFzZSwgcEN1ckhjYi0+SENTX0ludHIsCisJICAgICAgIHBDdXJIY2ItPkhDU19CSU9TLCBwQ3VySGNiLT5IQ1NfU0NTSV9JRCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0gcmVzZXQgU0NTSSBCdXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAocEN1ckhjYi0+SENTX0NvbmZpZyAmIEhDQ19TQ1NJX1JFU0VUKSB7CisJCXByaW50aygiaTkxdTogUmVzZXQgU0NTSSBCdXMgLi4uIFxuIik7CisJCXR1bF9yZXNldF9zY3NpKHBDdXJIY2IsIHNlY29uZHMpOworCX0KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NGRzEsIDB4MTcpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TSW50RW5hYmxlLCAweEU5KTsKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworU0NCICp0dWxfYWxsb2Nfc2NiKEhDUyAqIGhjc3ApCit7CisJU0NCICpwVG1wU2NiOworCVVMT05HIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCYoaGNzcC0+SENTX0F2YWlsTG9jayksIGZsYWdzKTsKKwlpZiAoKHBUbXBTY2IgPSBoY3NwLT5IQ1NfRmlyc3RBdmFpbCkgIT0gTlVMTCkgeworI2lmIERFQlVHX1FVRVVFCisJCXByaW50aygiZmluZCBzY2IgYXQgJTA4bHhcbiIsIChVTE9ORykgcFRtcFNjYik7CisjZW5kaWYKKwkJaWYgKChoY3NwLT5IQ1NfRmlyc3RBdmFpbCA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQloY3NwLT5IQ1NfTGFzdEF2YWlsID0gTlVMTDsKKwkJcFRtcFNjYi0+U0NCX054dFNjYiA9IE5VTEw7CisJCXBUbXBTY2ItPlNDQl9TdGF0dXMgPSBTQ0JfUkVOVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGhjc3AtPkhDU19BdmFpbExvY2spLCBmbGFncyk7CisJcmV0dXJuIChwVG1wU2NiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3JlbGVhc2Vfc2NiKEhDUyAqIGhjc3AsIFNDQiAqIHNjYnApCit7CisJVUxPTkcgZmxhZ3M7CisKKyNpZiBERUJVR19RVUVVRQorCXByaW50aygiUmVsZWFzZSBTQ0IgJWx4OyAiLCAoVUxPTkcpIHNjYnApOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJihoY3NwLT5IQ1NfQXZhaWxMb2NrKSwgZmxhZ3MpOworCXNjYnAtPlNDQl9TcmIgPSBOVUxMOworCXNjYnAtPlNDQl9TdGF0dXMgPSAwOworCXNjYnAtPlNDQl9OeHRTY2IgPSBOVUxMOworCWlmIChoY3NwLT5IQ1NfTGFzdEF2YWlsICE9IE5VTEwpIHsKKwkJaGNzcC0+SENTX0xhc3RBdmFpbC0+U0NCX054dFNjYiA9IHNjYnA7CisJCWhjc3AtPkhDU19MYXN0QXZhaWwgPSBzY2JwOworCX0gZWxzZSB7CisJCWhjc3AtPkhDU19GaXJzdEF2YWlsID0gc2NicDsKKwkJaGNzcC0+SENTX0xhc3RBdmFpbCA9IHNjYnA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihoY3NwLT5IQ1NfQXZhaWxMb2NrKSwgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfYXBwZW5kX3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHNjYnApCit7CisKKyNpZiBERUJVR19RVUVVRQorCXByaW50aygiQXBwZW5kIHBlbmQgU0NCICVseDsgIiwgKFVMT05HKSBzY2JwKTsKKyNlbmRpZgorCXNjYnAtPlNDQl9TdGF0dXMgPSBTQ0JfUEVORDsKKwlzY2JwLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwlpZiAocEN1ckhjYi0+SENTX0xhc3RQZW5kICE9IE5VTEwpIHsKKwkJcEN1ckhjYi0+SENTX0xhc3RQZW5kLT5TQ0JfTnh0U2NiID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gc2NicDsKKwl9IGVsc2UgeworCQlwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gc2NicDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHR1bF9wdXNoX3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHNjYnApCit7CisKKyNpZiBERUJVR19RVUVVRQorCXByaW50aygiUHVzaCBwZW5kIFNDQiAlbHg7ICIsIChVTE9ORykgc2NicCk7CisjZW5kaWYKKwlzY2JwLT5TQ0JfU3RhdHVzID0gU0NCX1BFTkQ7CisJaWYgKChzY2JwLT5TQ0JfTnh0U2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0UGVuZCkgIT0gTlVMTCkgeworCQlwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gc2NicDsKKwl9IGVsc2UgeworCQlwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gc2NicDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQ0IgKnR1bF9maW5kX2ZpcnN0X3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwRmlyc3RQZW5kOworCisKKwlwRmlyc3RQZW5kID0gcEN1ckhjYi0+SENTX0ZpcnN0UGVuZDsKKwl3aGlsZSAocEZpcnN0UGVuZCAhPSBOVUxMKSB7CisJCWlmIChwRmlyc3RQZW5kLT5TQ0JfT3Bjb2RlICE9IEV4ZWNTQ1NJKSB7CisJCQlyZXR1cm4gKHBGaXJzdFBlbmQpOworCQl9CisJCWlmIChwRmlyc3RQZW5kLT5TQ0JfVGFnTXNnID09IDApIHsKKwkJCWlmICgocEN1ckhjYi0+SENTX0FjdFRhZ3NbcEZpcnN0UGVuZC0+U0NCX1RhcmdldF0gPT0gMCkgJiYKKwkJCSAgICAhKHBDdXJIY2ItPkhDU19UY3NbcEZpcnN0UGVuZC0+U0NCX1RhcmdldF0uVENTX0ZsYWdzICYgVENGX0JVU1kpKSB7CisJCQkJcmV0dXJuIChwRmlyc3RQZW5kKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgocEN1ckhjYi0+SENTX0FjdFRhZ3NbcEZpcnN0UGVuZC0+U0NCX1RhcmdldF0gPj0KKwkJCSAgcEN1ckhjYi0+SENTX01heFRhZ3NbcEZpcnN0UGVuZC0+U0NCX1RhcmdldF0pIHwKKwkJCSAgICAocEN1ckhjYi0+SENTX1Rjc1twRmlyc3RQZW5kLT5TQ0JfVGFyZ2V0XS5UQ1NfRmxhZ3MgJiBUQ0ZfQlVTWSkpIHsKKwkJCQlwRmlyc3RQZW5kID0gcEZpcnN0UGVuZC0+U0NCX054dFNjYjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAocEZpcnN0UGVuZCk7CisJCX0KKwkJcEZpcnN0UGVuZCA9IHBGaXJzdFBlbmQtPlNDQl9OeHRTY2I7CisJfQorCisKKwlyZXR1cm4gKHBGaXJzdFBlbmQpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NDQiAqdHVsX3BvcF9wZW5kX3NjYihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcFRtcFNjYjsKKworCWlmICgocFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdFBlbmQpICE9IE5VTEwpIHsKKwkJaWYgKChwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gcFRtcFNjYi0+U0NCX054dFNjYikgPT0gTlVMTCkKKwkJCXBDdXJIY2ItPkhDU19MYXN0UGVuZCA9IE5VTEw7CisJCXBUbXBTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCX0KKyNpZiBERUJVR19RVUVVRQorCXByaW50aygiUG9wIHBlbmQgU0NCICVseDsgIiwgKFVMT05HKSBwVG1wU2NiKTsKKyNlbmRpZgorCXJldHVybiAocFRtcFNjYik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3VubGlua19wZW5kX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKQoreworCVNDQiAqcFRtcFNjYiwgKnBQcmV2U2NiOworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoInVubGluayBwZW5kIFNDQiAlbHg7ICIsIChVTE9ORykgcEN1clNjYik7CisjZW5kaWYKKworCXBQcmV2U2NiID0gcFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdFBlbmQ7CisJd2hpbGUgKHBUbXBTY2IgIT0gTlVMTCkgeworCQlpZiAocEN1clNjYiA9PSBwVG1wU2NiKSB7CS8qIFVubGluayB0aGlzIFNDQiAgICAgICAgICAgICAgKi8KKwkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19GaXJzdFBlbmQpIHsKKwkJCQlpZiAoKHBDdXJIY2ItPkhDU19GaXJzdFBlbmQgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQorCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdFBlbmQgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlwUHJldlNjYi0+U0NCX054dFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0xhc3RQZW5kKQorCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdFBlbmQgPSBwUHJldlNjYjsKKwkJCX0KKwkJCXBUbXBTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJcFByZXZTY2IgPSBwVG1wU2NiOworCQlwVG1wU2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwl9CisJcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX2FwcGVuZF9idXN5X3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBzY2JwKQoreworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoImFwcGVuZCBidXN5IFNDQiAlbHg7ICIsIChVTE9ORykgc2NicCk7CisjZW5kaWYKKwlpZiAoc2NicC0+U0NCX1RhZ01zZykKKwkJcEN1ckhjYi0+SENTX0FjdFRhZ3Nbc2NicC0+U0NCX1RhcmdldF0rKzsKKwllbHNlCisJCXBDdXJIY2ItPkhDU19UY3Nbc2NicC0+U0NCX1RhcmdldF0uVENTX0ZsYWdzIHw9IFRDRl9CVVNZOworCXNjYnAtPlNDQl9TdGF0dXMgPSBTQ0JfQlVTWTsKKwlzY2JwLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwlpZiAocEN1ckhjYi0+SENTX0xhc3RCdXN5ICE9IE5VTEwpIHsKKwkJcEN1ckhjYi0+SENTX0xhc3RCdXN5LT5TQ0JfTnh0U2NiID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3RCdXN5ID0gc2NicDsKKwl9IGVsc2UgeworCQlwQ3VySGNiLT5IQ1NfRmlyc3RCdXN5ID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3RCdXN5ID0gc2NicDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQ0IgKnR1bF9wb3BfYnVzeV9zY2IoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBUbXBTY2I7CisKKworCWlmICgocFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3kpICE9IE5VTEwpIHsKKwkJaWYgKChwQ3VySGNiLT5IQ1NfRmlyc3RCdXN5ID0gcFRtcFNjYi0+U0NCX054dFNjYikgPT0gTlVMTCkKKwkJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IE5VTEw7CisJCXBUbXBTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCQlpZiAocFRtcFNjYi0+U0NCX1RhZ01zZykKKwkJCXBDdXJIY2ItPkhDU19BY3RUYWdzW3BUbXBTY2ItPlNDQl9UYXJnZXRdLS07CisJCWVsc2UKKwkJCXBDdXJIY2ItPkhDU19UY3NbcFRtcFNjYi0+U0NCX1RhcmdldF0uVENTX0ZsYWdzICY9IH5UQ0ZfQlVTWTsKKwl9CisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoIlBvcCBidXN5IFNDQiAlbHg7ICIsIChVTE9ORykgcFRtcFNjYik7CisjZW5kaWYKKwlyZXR1cm4gKHBUbXBTY2IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0dWxfdW5saW5rX2J1c3lfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCit7CisJU0NCICpwVG1wU2NiLCAqcFByZXZTY2I7CisKKyNpZiBERUJVR19RVUVVRQorCXByaW50aygidW5saW5rIGJ1c3kgU0NCICVseDsgIiwgKFVMT05HKSBwQ3VyU2NiKTsKKyNlbmRpZgorCisJcFByZXZTY2IgPSBwVG1wU2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeTsKKwl3aGlsZSAocFRtcFNjYiAhPSBOVUxMKSB7CisJCWlmIChwQ3VyU2NiID09IHBUbXBTY2IpIHsJLyogVW5saW5rIHRoaXMgU0NCICAgICAgICAgICAgICAqLworCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeSkgeworCQkJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0QnVzeSA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQkJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXBQcmV2U2NiLT5TQ0JfTnh0U2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwkJCQlpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kpCisJCQkJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IHBQcmV2U2NiOworCQkJfQorCQkJcFRtcFNjYi0+U0NCX054dFNjYiA9IE5VTEw7CisJCQlpZiAocFRtcFNjYi0+U0NCX1RhZ01zZykKKwkJCQlwQ3VySGNiLT5IQ1NfQWN0VGFnc1twVG1wU2NiLT5TQ0JfVGFyZ2V0XS0tOworCQkJZWxzZQorCQkJCXBDdXJIY2ItPkhDU19UY3NbcFRtcFNjYi0+U0NCX1RhcmdldF0uVENTX0ZsYWdzICY9IH5UQ0ZfQlVTWTsKKwkJCWJyZWFrOworCQl9CisJCXBQcmV2U2NiID0gcFRtcFNjYjsKKwkJcFRtcFNjYiA9IHBUbXBTY2ItPlNDQl9OeHRTY2I7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1NDQiAqdHVsX2ZpbmRfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgV09SRCB0YXJsdW4pCit7CisJU0NCICpwVG1wU2NiLCAqcFByZXZTY2I7CisJV09SRCBzY2JwX3Rhcmx1bjsKKworCisJcFByZXZTY2IgPSBwVG1wU2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeTsKKwl3aGlsZSAocFRtcFNjYiAhPSBOVUxMKSB7CisJCXNjYnBfdGFybHVuID0gKHBUbXBTY2ItPlNDQl9MdW4gPDwgOCkgfCAocFRtcFNjYi0+U0NCX1RhcmdldCk7CisJCWlmIChzY2JwX3Rhcmx1biA9PSB0YXJsdW4pIHsJLyogVW5saW5rIHRoaXMgU0NCICAgICAgICAgICAgICAqLworCQkJYnJlYWs7CisJCX0KKwkJcFByZXZTY2IgPSBwVG1wU2NiOworCQlwVG1wU2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwl9CisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoImZpbmQgYnVzeSBTQ0IgJWx4OyAiLCAoVUxPTkcpIHBUbXBTY2IpOworI2VuZGlmCisJcmV0dXJuIChwVG1wU2NiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX2FwcGVuZF9kb25lX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBzY2JwKQoreworCisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoImFwcGVuZCBkb25lIFNDQiAlbHg7ICIsIChVTE9ORykgc2NicCk7CisjZW5kaWYKKworCXNjYnAtPlNDQl9TdGF0dXMgPSBTQ0JfRE9ORTsKKwlzY2JwLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwlpZiAocEN1ckhjYi0+SENTX0xhc3REb25lICE9IE5VTEwpIHsKKwkJcEN1ckhjYi0+SENTX0xhc3REb25lLT5TQ0JfTnh0U2NiID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3REb25lID0gc2NicDsKKwl9IGVsc2UgeworCQlwQ3VySGNiLT5IQ1NfRmlyc3REb25lID0gc2NicDsKKwkJcEN1ckhjYi0+SENTX0xhc3REb25lID0gc2NicDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitTQ0IgKnR1bF9maW5kX2RvbmVfc2NiKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwVG1wU2NiOworCisKKwlpZiAoKHBUbXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3REb25lKSAhPSBOVUxMKSB7CisJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0RG9uZSA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQlwQ3VySGNiLT5IQ1NfTGFzdERvbmUgPSBOVUxMOworCQlwVG1wU2NiLT5TQ0JfTnh0U2NiID0gTlVMTDsKKwl9CisjaWYgREVCVUdfUVVFVUUKKwlwcmludGsoImZpbmQgZG9uZSBTQ0IgJWx4OyAiLCAoVUxPTkcpIHBUbXBTY2IpOworI2VuZGlmCisJcmV0dXJuIChwVG1wU2NiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfYWJvcnRfc3JiKEhDUyAqIHBDdXJIY2IsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYnApCit7CisJVUxPTkcgZmxhZ3M7CisJU0NCICpwVG1wU2NiLCAqcFByZXZTY2I7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJaWYgKChwQ3VySGNiLT5IQ1NfU2VtYXBoID09IDApICYmIChwQ3VySGNiLT5IQ1NfQWN0U2NiID09IE5VTEwpKSB7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKwkJLyogZGlzYWJsZSBKYXNtaW4gU0NTSSBJbnQgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJdHVsaXBfbWFpbihwQ3VySGNiKTsKKworICAgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCQlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX01hc2ssIDB4MEYpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCQlyZXR1cm4gU0NTSV9BQk9SVF9TTk9PWkU7CisJfQorCXBQcmV2U2NiID0gcFRtcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdFBlbmQ7CS8qIENoZWNrIFBlbmQgcXVldWUgKi8KKwl3aGlsZSAocFRtcFNjYiAhPSBOVUxMKSB7CisJCS8qIDA3LzI3Lzk4ICovCisJCWlmIChwVG1wU2NiLT5TQ0JfU3JiID09IHNyYnApIHsKKwkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19BY3RTY2IpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJCQkJcmV0dXJuIFNDU0lfQUJPUlRfQlVTWTsKKwkJCX0gZWxzZSBpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kKSB7CisJCQkJaWYgKChwQ3VySGNiLT5IQ1NfRmlyc3RQZW5kID0gcFRtcFNjYi0+U0NCX054dFNjYikgPT0gTlVMTCkKKwkJCQkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJcFByZXZTY2ItPlNDQl9OeHRTY2IgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiOworCQkJCWlmIChwVG1wU2NiID09IHBDdXJIY2ItPkhDU19MYXN0UGVuZCkKKwkJCQkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gcFByZXZTY2I7CisJCQl9CisJCQlwVG1wU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9BQk9SVEVEOworCQkJcFRtcFNjYi0+U0NCX0ZsYWdzIHw9IFNDRl9ET05FOworCQkJaWYgKHBUbXBTY2ItPlNDQl9GbGFncyAmIFNDRl9QT1NUKQorCQkJCSgqcFRtcFNjYi0+U0NCX1Bvc3QpICgoQllURSAqKSBwQ3VySGNiLCAoQllURSAqKSBwVG1wU2NiKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwkJCXJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJCX0KKwkJcFByZXZTY2IgPSBwVG1wU2NiOworCQlwVG1wU2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwl9CisKKwlwUHJldlNjYiA9IHBUbXBTY2IgPSBwQ3VySGNiLT5IQ1NfRmlyc3RCdXN5OwkvKiBDaGVjayBCdXN5IHF1ZXVlICovCisJd2hpbGUgKHBUbXBTY2IgIT0gTlVMTCkgeworCisJCWlmIChwVG1wU2NiLT5TQ0JfU3JiID09IHNyYnApIHsKKworCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0FjdFNjYikgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwkJCQlyZXR1cm4gU0NTSV9BQk9SVF9CVVNZOworCQkJfSBlbHNlIGlmIChwVG1wU2NiLT5TQ0JfVGFnTXNnID09IDApIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJCQkJcmV0dXJuIFNDU0lfQUJPUlRfQlVTWTsKKwkJCX0gZWxzZSB7CisJCQkJcEN1ckhjYi0+SENTX0FjdFRhZ3NbcFRtcFNjYi0+U0NCX1RhcmdldF0tLTsKKwkJCQlpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfRmlyc3RCdXN5KSB7CisJCQkJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0QnVzeSA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQkJCQlwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXBQcmV2U2NiLT5TQ0JfTnh0U2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwkJCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0xhc3RCdXN5KQorCQkJCQkJcEN1ckhjYi0+SENTX0xhc3RCdXN5ID0gcFByZXZTY2I7CisJCQkJfQorCQkJCXBUbXBTY2ItPlNDQl9OeHRTY2IgPSBOVUxMOworCisKKwkJCQlwVG1wU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9BQk9SVEVEOworCQkJCXBUbXBTY2ItPlNDQl9GbGFncyB8PSBTQ0ZfRE9ORTsKKwkJCQlpZiAocFRtcFNjYi0+U0NCX0ZsYWdzICYgU0NGX1BPU1QpCisJCQkJCSgqcFRtcFNjYi0+U0NCX1Bvc3QpICgoQllURSAqKSBwQ3VySGNiLCAoQllURSAqKSBwVG1wU2NiKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJCQkJcmV0dXJuIFNDU0lfQUJPUlRfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCQlwUHJldlNjYiA9IHBUbXBTY2I7CisJCXBUbXBTY2IgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJcmV0dXJuIChTQ1NJX0FCT1JUX05PVF9SVU5OSU5HKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfYmFkX3NlcShIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYjsKKworCXByaW50aygidHVsX2JhZF9zZWcgYz0lZFxuIiwgcEN1ckhjYi0+SENTX0luZGV4KTsKKworCWlmICgocEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2IpICE9IE5VTEwpIHsKKwkJdHVsX3VubGlua19idXN5X3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQkFEX1BIQVM7CisJCXBDdXJTY2ItPlNDQl9UYVN0YXQgPSAwOworCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCX0KKwl0dWxfc3RvcF9ibShwQ3VySGNiKTsKKworCXR1bF9yZXNldF9zY3NpKHBDdXJIY2IsIDgpOwkvKiA3LzI5Lzk4ICovCisKKwlyZXR1cm4gKHR1bF9wb3N0X3Njc2lfcnN0KHBDdXJIY2IpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfZGV2aWNlX3Jlc2V0KEhDUyAqIHBDdXJIY2IsIHN0cnVjdCBzY3NpX2NtbmQgKnBTcmIsCisJCXVuc2lnbmVkIGludCB0YXJnZXQsIHVuc2lnbmVkIGludCBSZXNldEZsYWdzKQoreworCVVMT05HIGZsYWdzOworCVNDQiAqcFNjYjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJaWYgKFJlc2V0RmxhZ3MgJiBTQ1NJX1JFU0VUX0FTWU5DSFJPTk9VUykgeworCisJCWlmICgocEN1ckhjYi0+SENTX1NlbWFwaCA9PSAwKSAmJiAocEN1ckhjYi0+SENTX0FjdFNjYiA9PSBOVUxMKSkgeworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX01hc2ssIDB4MUYpOworCQkJLyogZGlzYWJsZSBKYXNtaW4gU0NTSSBJbnQgICAgICAgICovCisKKyAgICAgICAgCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJCXR1bGlwX21haW4ocEN1ckhjYik7CisKKyAgICAgICAgCQlzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCQlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDBGKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCQlyZXR1cm4gU0NTSV9SRVNFVF9TTk9PWkU7CisJCX0KKwkJcFNjYiA9IHBDdXJIY2ItPkhDU19GaXJzdEJ1c3k7CS8qIENoZWNrIEJ1c3kgcXVldWUgKi8KKwkJd2hpbGUgKHBTY2IgIT0gTlVMTCkgeworCQkJaWYgKHBTY2ItPlNDQl9TcmIgPT0gcFNyYikKKwkJCQlicmVhazsKKwkJCXBTY2IgPSBwU2NiLT5TQ0JfTnh0U2NiOworCQl9CisJCWlmIChwU2NiID09IE5VTEwpIHsKKwkJCXByaW50aygiVW5hYmxlIHRvIFJlc2V0IC0gTm8gU0NCIEZvdW5kXG4iKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCQkJcmV0dXJuIFNDU0lfUkVTRVRfTk9UX1JVTk5JTkc7CisJCX0KKwl9CisJaWYgKChwU2NiID0gdHVsX2FsbG9jX3NjYihwQ3VySGNiKSkgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJCXJldHVybiBTQ1NJX1JFU0VUX05PVF9SVU5OSU5HOworCX0KKwlwU2NiLT5TQ0JfT3Bjb2RlID0gQnVzRGV2UnN0OworCXBTY2ItPlNDQl9GbGFncyA9IFNDRl9QT1NUOworCXBTY2ItPlNDQl9UYXJnZXQgPSB0YXJnZXQ7CisJcFNjYi0+U0NCX01vZGUgPSAwOworCisJcFNjYi0+U0NCX1NyYiA9IE5VTEw7CisJaWYgKFJlc2V0RmxhZ3MgJiBTQ1NJX1JFU0VUX1NZTkNIUk9OT1VTKSB7CisJCXBTY2ItPlNDQl9TcmIgPSBwU3JiOworCX0KKwl0dWxfcHVzaF9wZW5kX3NjYihwQ3VySGNiLCBwU2NiKTsJLyogcHVzaCB0aGlzIFNDQiB0byBQZW5kaW5nIHF1ZXVlICovCisKKwlpZiAocEN1ckhjYi0+SENTX1NlbWFwaCA9PSAxKSB7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKwkJLyogZGlzYWJsZSBKYXNtaW4gU0NTSSBJbnQgICAgICAgICovCisJCXBDdXJIY2ItPkhDU19TZW1hcGggPSAwOworCisgICAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJdHVsaXBfbWFpbihwQ3VySGNiKTsKKworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwkJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDE7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDBGKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCXJldHVybiBTQ1NJX1JFU0VUX1BFTkRJTkc7Cit9CisKK2ludCB0dWxfcmVzZXRfc2NzaV9idXMoSENTICogcEN1ckhjYikKK3sKKwlVTE9ORyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX01hc2ssIDB4MUYpOworCXBDdXJIY2ItPkhDU19TZW1hcGggPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJdHVsX3N0b3BfYm0ocEN1ckhjYik7CisKKwl0dWxfcmVzZXRfc2NzaShwQ3VySGNiLCAyKTsJLyogNy8yOS85OCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwl0dWxfcG9zdF9zY3NpX3JzdChwQ3VySGNiKTsKKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwl0dWxpcF9tYWluKHBDdXJIY2IpOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgwRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCXJldHVybiAoU0NTSV9SRVNFVF9TVUNDRVNTIHwgU0NTSV9SRVNFVF9IT1NUX1JFU0VUKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX2V4ZWNfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCit7CisJVUxPTkcgZmxhZ3M7CisKKwlwQ3VyU2NiLT5TQ0JfTW9kZSA9IDA7CisKKwlwQ3VyU2NiLT5TQ0JfU0dJZHggPSAwOworCXBDdXJTY2ItPlNDQl9TR01heCA9IHBDdXJTY2ItPlNDQl9TR0xlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYocEN1ckhjYi0+SENTX1NlbWFwaExvY2spLCBmbGFncyk7CisKKwl0dWxfYXBwZW5kX3BlbmRfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOwkvKiBBcHBlbmQgdGhpcyBTQ0IgdG8gUGVuZGluZyBxdWV1ZSAqLworCisvKiBWVlZWViAwNy8yMS85OCAqLworCWlmIChwQ3VySGNiLT5IQ1NfU2VtYXBoID09IDEpIHsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX01hc2ssIDB4MUYpOworCQkvKiBkaXNhYmxlIEphc21pbiBTQ1NJIEludCAgICAgICAgKi8KKwkJcEN1ckhjYi0+SENTX1NlbWFwaCA9IDA7CisKKyAgICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKworCQl0dWxpcF9tYWluKHBDdXJIY2IpOworCisgICAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmKHBDdXJIY2ItPkhDU19TZW1hcGhMb2NrKSwgZmxhZ3MpOworCisJCXBDdXJIY2ItPkhDU19TZW1hcGggPSAxOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfTWFzaywgMHgwRik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwQ3VySGNiLT5IQ1NfU2VtYXBoTG9jayksIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX2lzcihIQ1MgKiBwQ3VySGNiKQoreworCS8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gICAgICAgKi8KKworCWlmIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9JbnQpICYgVFNTX0lOVF9QRU5ESU5HKSB7CisJCWlmIChwQ3VySGNiLT5IQ1NfU2VtYXBoID09IDEpIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDFGKTsKKwkJCS8qIERpc2FibGUgVHVsaXAgU0NTSSBJbnQgKi8KKwkJCXBDdXJIY2ItPkhDU19TZW1hcGggPSAwOworCisJCQl0dWxpcF9tYWluKHBDdXJIY2IpOworCisJCQlwQ3VySGNiLT5IQ1NfU2VtYXBoID0gMTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9NYXNrLCAweDBGKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxpcF9tYWluKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiOworCisJZm9yICg7OykgeworCisJCXR1bGlwX3Njc2kocEN1ckhjYik7CS8qIENhbGwgdHVsaXBfc2NzaSAgICAgICAgICAgICAgKi8KKworCQl3aGlsZSAoKHBDdXJTY2IgPSB0dWxfZmluZF9kb25lX3NjYihwQ3VySGNiKSkgIT0gTlVMTCkgewkvKiBmaW5kIGRvbmUgZW50cnkgKi8KKwkJCWlmIChwQ3VyU2NiLT5TQ0JfVGFTdGF0ID09IElOSV9RVUVVRV9GVUxMKSB7CisJCQkJcEN1ckhjYi0+SENTX01heFRhZ3NbcEN1clNjYi0+U0NCX1RhcmdldF0gPQorCQkJCSAgICBwQ3VySGNiLT5IQ1NfQWN0VGFnc1twQ3VyU2NiLT5TQ0JfVGFyZ2V0XSAtIDE7CisJCQkJcEN1clNjYi0+U0NCX1RhU3RhdCA9IDA7CisJCQkJdHVsX2FwcGVuZF9wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghKHBDdXJTY2ItPlNDQl9Nb2RlICYgU0NNX1JTRU5TKSkgewkJLyogbm90IGluIGF1dG8gcmVxLiBzZW5zZSBtb2RlICovCisJCQkJaWYgKHBDdXJTY2ItPlNDQl9UYVN0YXQgPT0gMikgeworCisJCQkJCS8qIGNsciBzeW5jLiBuZWdvIGZsYWcgKi8KKworCQkJCQlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1NFTlNFKSB7CisJCQkJCQlCWVRFIGxlbjsKKwkJCQkJCWxlbiA9IHBDdXJTY2ItPlNDQl9TZW5zZUxlbjsKKwkJCQkJCWlmIChsZW4gPT0gMCkKKwkJCQkJCQlsZW4gPSAxOworCQkJCQkJcEN1clNjYi0+U0NCX0J1ZkxlbiA9IHBDdXJTY2ItPlNDQl9TZW5zZUxlbjsKKwkJCQkJCXBDdXJTY2ItPlNDQl9CdWZQdHIgPSBwQ3VyU2NiLT5TQ0JfU2Vuc2VQdHI7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfRmxhZ3MgJj0gfihTQ0ZfU0cgfCBTQ0ZfRElSKTsJLyogZm9yIHhmZXJfZGF0YV9pbiAqLworLyogICAgICAgICAgICAgICAgICAgICAgcEN1clNjYi0+U0NCX0ZsYWdzIHw9IFNDRl9OT19EQ0hLOyAgICAgICovCisJCQkJCQkvKiBzbywgd2Ugd29uJ3QgcmVwb3J0IHdvcm5nIGRpcmVjdGlvbiBpbiB4ZmVyX2RhdGFfaW4sCisJCQkJCQkgICBhbmQgd29uJ3QgcmVwb3J0IEhPU1RfRE9fRFUgaW4gc3RhdGVfNiAqLworCQkJCQkJcEN1clNjYi0+U0NCX01vZGUgPSBTQ01fUlNFTlM7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfSWRlbnQgJj0gMHhCRjsJLyogRGlzYWJsZSBEaXNjb25uZWN0ICovCisJCQkJCQlwQ3VyU2NiLT5TQ0JfVGFnTXNnID0gMDsKKwkJCQkJCXBDdXJTY2ItPlNDQl9UYVN0YXQgPSAwOworCQkJCQkJcEN1clNjYi0+U0NCX0NEQkxlbiA9IDY7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfQ0RCWzBdID0gU0NTSUNNRF9SZXF1ZXN0U2Vuc2U7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfQ0RCWzFdID0gMDsKKwkJCQkJCXBDdXJTY2ItPlNDQl9DREJbMl0gPSAwOworCQkJCQkJcEN1clNjYi0+U0NCX0NEQlszXSA9IDA7CisJCQkJCQlwQ3VyU2NiLT5TQ0JfQ0RCWzRdID0gbGVuOworCQkJCQkJcEN1clNjYi0+U0NCX0NEQls1XSA9IDA7CisJCQkJCQl0dWxfcHVzaF9wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsJLyogaW4gcmVxdWVzdCBzZW5zZSBtb2RlICovCisKKwkJCQlpZiAocEN1clNjYi0+U0NCX1RhU3RhdCA9PSAyKSB7CQkvKiBjaGVjayBjb250aXRpb24gc3RhdHVzIGFnYWluIGFmdGVyIHNlbmRpbmcKKwkJCQkJCQkJCSAgIHJlcXVzZXQgc2Vuc2UgY21kIDB4MyAqLworCQkJCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9CQURfUEhBUzsKKwkJCQl9CisJCQkJcEN1clNjYi0+U0NCX1RhU3RhdCA9IDI7CisJCQl9CisJCQlwQ3VyU2NiLT5TQ0JfRmxhZ3MgfD0gU0NGX0RPTkU7CisJCQlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1BPU1QpIHsKKwkJCQkoKnBDdXJTY2ItPlNDQl9Qb3N0KSAoKEJZVEUgKikgcEN1ckhjYiwgKEJZVEUgKikgcEN1clNjYik7CisJCQl9CisJCX0JCS8qIHdoaWxlICovCisKKwkJLyogZmluZF9hY3RpdmU6ICovCisJCWlmIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU3RhdHVzMCkgJiBUU1NfSU5UX1BFTkRJTkcpCisJCQljb250aW51ZTsKKworCQlpZiAocEN1ckhjYi0+SENTX0FjdFNjYikgewkvKiByZXR1cm4gdG8gT1MgYW5kIHdhaXQgZm9yIHhmZXJfZG9uZV9JU1IvU2VsZWN0ZWRfSVNSICovCisJCQlyZXR1cm4gMTsJLyogcmV0dXJuIHRvIE9TLCBlbmFibGUgaW50ZXJydXB0ICovCisJCX0KKwkJLyogQ2hlY2sgcGVuZGluZyBTQ0IgICAgICAgICAgICAqLworCQlpZiAodHVsX2ZpbmRfZmlyc3RfcGVuZF9zY2IocEN1ckhjYikgPT0gTlVMTCkgeworCQkJcmV0dXJuIDE7CS8qIHJldHVybiB0byBPUywgZW5hYmxlIGludGVycnVwdCAqLworCQl9CisJfQkJCS8qIEVuZCBvZiBmb3IgbG9vcCAqLworCS8qIHN0YXRlbWVudCB3b24ndCByZWFjaCBoZXJlICovCit9CisKKworCisKKy8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsaXBfc2NzaShIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYjsKKwlUQ1MgKnBDdXJUY2I7CisKKwkvKiBtYWtlIHN1cmUgdG8gc2VydmljZSBpbnRlcnJ1cHQgYXNhcCAqLworCisJaWYgKChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czApKSAmIFRTU19JTlRfUEVORElORykgeworCisJCXBDdXJIY2ItPkhDU19QaGFzZSA9IHBDdXJIY2ItPkhDU19KU1N0YXR1czAgJiBUU1NfUEhfTUFTSzsKKwkJcEN1ckhjYi0+SENTX0pTU3RhdHVzMSA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMxKTsKKwkJcEN1ckhjYi0+SENTX0pTSW50ID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ludCk7CisJCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfU0NTSVJTVF9JTlQpIHsJLyogU0NTSSBidXMgcmVzZXQgZGV0ZWN0ZWQgICAgICAqLworCQkJaW50X3R1bF9zY3NpX3JzdChwQ3VySGNiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX1JFU0VMX0lOVCkgewkvKiBpZiBzZWxlY3RlZC9yZXNlbGVjdGVkIGludGVycnVwdCAqLworCQkJaWYgKGludF90dWxfcmVzZWwocEN1ckhjYikgPT0gMCkKKwkJCQl0dWxfbmV4dF9zdGF0ZShwQ3VySGNiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX1NFTF9USU1FT1VUKSB7CisJCQlpbnRfdHVsX2J1c2ZyZWUocEN1ckhjYik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19ESVNDX0lOVCkgewkvKiBCVVMgZGlzY29ubmVjdGlvbiAgICAgICAgICAgICovCisJCQlpbnRfdHVsX2J1c2ZyZWUocEN1ckhjYik7CS8qIHVuZXhwZWN0ZWQgYnVzIGZyZWUgb3Igc2VsIHRpbWVvdXQgKi8KKwkJCXJldHVybjsKKwkJfQorCQlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgKFRTU19GVU5DX0NPTVAgfCBUU1NfQlVTX1NFUlYpKSB7CS8qIGZ1bmMgY29tcGxldGUgb3IgQnVzIHNlcnZpY2UgKi8KKwkJCWlmICgocEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2IpICE9IE5VTEwpCisJCQkJdHVsX25leHRfc3RhdGUocEN1ckhjYik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKHBDdXJIY2ItPkhDU19BY3RTY2IgIT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChwQ3VyU2NiID0gdHVsX2ZpbmRfZmlyc3RfcGVuZF9zY2IocEN1ckhjYikpID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIHByb2dyYW0gSEJBJ3MgU0NTSSBJRCAmIHRhcmdldCBTQ1NJIElEICovCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTY3NpSWQsCisJICAgICAocEN1ckhjYi0+SENTX1NDU0lfSUQgPDwgNCkgfCAocEN1clNjYi0+U0NCX1RhcmdldCAmIDB4MEYpKTsKKwlpZiAocEN1clNjYi0+U0NCX09wY29kZSA9PSBFeGVjU0NTSSkgeworCQlwQ3VyVGNiID0gJnBDdXJIY2ItPkhDU19UY3NbcEN1clNjYi0+U0NCX1RhcmdldF07CisKKwkJaWYgKHBDdXJTY2ItPlNDQl9UYWdNc2cpCisJCQlwQ3VyVGNiLT5UQ1NfRHJ2RmxhZ3MgfD0gVENGX0RSVl9FTl9UQUc7CisJCWVsc2UKKwkJCXBDdXJUY2ItPlRDU19EcnZGbGFncyAmPSB+VENGX0RSVl9FTl9UQUc7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NQZXJpb2QsIHBDdXJUY2ItPlRDU19KU19QZXJpb2QpOworCQlpZiAoKHBDdXJUY2ItPlRDU19GbGFncyAmIChUQ0ZfV0RUUl9ET05FIHwgVENGX05PX1dEVFIpKSA9PSAwKSB7CS8qIGRvIHdkdHIgbmVnb3RpYXRpb24gICAgICAgICAgKi8KKwkJCXR1bF9zZWxlY3RfYXRuX3N0b3AocEN1ckhjYiwgcEN1clNjYik7CisJCX0gZWxzZSB7CisJCQlpZiAoKHBDdXJUY2ItPlRDU19GbGFncyAmIChUQ0ZfU1lOQ19ET05FIHwgVENGX05PX1NZTkNfTkVHTykpID09IDApIHsJLyogZG8gc3luYyBuZWdvdGlhdGlvbiAgICAgICAgICAqLworCQkJCXR1bF9zZWxlY3RfYXRuX3N0b3AocEN1ckhjYiwgcEN1clNjYik7CisJCQl9IGVsc2UgeworCQkJCWlmIChwQ3VyU2NiLT5TQ0JfVGFnTXNnKQorCQkJCQl0dWxfc2VsZWN0X2F0bjMocEN1ckhjYiwgcEN1clNjYik7CisJCQkJZWxzZQorCQkJCQl0dWxfc2VsZWN0X2F0bihwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJCX0KKwkJfQorCQlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1BPTEwpIHsKKwkJCXdoaWxlICh3YWl0X3R1bGlwKHBDdXJIY2IpICE9IC0xKSB7CisJCQkJaWYgKHR1bF9uZXh0X3N0YXRlKHBDdXJIY2IpID09IC0xKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAocEN1clNjYi0+U0NCX09wY29kZSA9PSBCdXNEZXZSc3QpIHsKKwkJdHVsX3NlbGVjdF9hdG5fc3RvcChwQ3VySGNiLCBwQ3VyU2NiKTsKKwkJcEN1clNjYi0+U0NCX054dFN0YXQgPSA4OworCQlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1BPTEwpIHsKKwkJCXdoaWxlICh3YWl0X3R1bGlwKHBDdXJIY2IpICE9IC0xKSB7CisJCQkJaWYgKHR1bF9uZXh0X3N0YXRlKHBDdXJIY2IpID09IC0xKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAocEN1clNjYi0+U0NCX09wY29kZSA9PSBBYm9ydENtZCkgeworCQlpZiAodHVsX2Fib3J0X3NyYihwQ3VySGNiLCBwQ3VyU2NiLT5TQ0JfU3JiKSAhPSAwKSB7CisKKworCQkJdHVsX3VubGlua19wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKworCQkJdHVsX3JlbGVhc2Vfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCQl9IGVsc2UgeworCQkJcEN1clNjYi0+U0NCX09wY29kZSA9IEJ1c0RldlJzdDsKKwkJCXR1bF9zZWxlY3RfYXRuX3N0b3AocEN1ckhjYiwgcEN1clNjYik7CisJCQlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDg7CisJCX0KKworLyogMDgvMDMvOTggKi8KKwl9IGVsc2UgeworCQl0dWxfdW5saW5rX3BlbmRfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gMHgxNjsJLyogYmFkIGNvbW1hbmQgKi8KKwkJdHVsX2FwcGVuZF9kb25lX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwl9CisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX25leHRfc3RhdGUoSENTICogcEN1ckhjYikKK3sKKwlpbnQgbmV4dDsKKworCW5leHQgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiLT5TQ0JfTnh0U3RhdDsKKwlmb3IgKDs7KSB7CisJCXN3aXRjaCAobmV4dCkgeworCQljYXNlIDE6CisJCQluZXh0ID0gdHVsX3N0YXRlXzEocEN1ckhjYik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbmV4dCA9IHR1bF9zdGF0ZV8yKHBDdXJIY2IpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW5leHQgPSB0dWxfc3RhdGVfMyhwQ3VySGNiKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQluZXh0ID0gdHVsX3N0YXRlXzQocEN1ckhjYik7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJbmV4dCA9IHR1bF9zdGF0ZV81KHBDdXJIY2IpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCW5leHQgPSB0dWxfc3RhdGVfNihwQ3VySGNiKTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQluZXh0ID0gdHVsX3N0YXRlXzcocEN1ckhjYik7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJcmV0dXJuICh0dWxfYnVzX2RldmljZV9yZXNldChwQ3VySGNiKSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKKwkJfQorCQlpZiAobmV4dCA8PSAwKQorCQkJcmV0dXJuIG5leHQ7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzVGF0ZSBhZnRlciBzZWxlY3Rpb24gd2l0aCBhdHRlbnRpb24gJiBzdG9wICovCitpbnQgdHVsX3N0YXRlXzEoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCVRDUyAqcEN1clRjYiA9IHBDdXJIY2ItPkhDU19BY3RUY3M7CisjaWYgREVCVUdfU1RBVEUKKwlwcmludGsoIi1zMS0iKTsKKyNlbmRpZgorCisJdHVsX3VubGlua19wZW5kX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwl0dWxfYXBwZW5kX2J1c3lfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIHBDdXJUY2ItPlRDU19TQ29uZmlnMCk7CisJLyogQVROIG9uICovCisJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSA9PSBNU0dfT1VUKSB7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMSwgKFRTQ19FTl9CVVNfSU4gfCBUU0NfSFdfUkVTRUxFQ1QpKTsKKworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9JZGVudCk7CisKKwkJaWYgKHBDdXJTY2ItPlNDQl9UYWdNc2cpIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgcEN1clNjYi0+U0NCX1RhZ01zZyk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9UYWdJZCk7CisJCX0KKwkJaWYgKChwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiAoVENGX1dEVFJfRE9ORSB8IFRDRl9OT19XRFRSKSkgPT0gMCkgeworCisJCQlwQ3VyVGNiLT5UQ1NfRmxhZ3MgfD0gVENGX1dEVFJfRE9ORTsKKworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfRVhURU5EKTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgMik7CS8qIEV4dGVuZGVkIG1zZyBsZW5ndGggKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgMyk7CS8qIFN5bmMgcmVxdWVzdCAqLworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAxKTsJLyogU3RhcnQgZnJvbSAxNiBiaXRzICovCisJCX0gZWxzZSBpZiAoKHBDdXJUY2ItPlRDU19GbGFncyAmIChUQ0ZfU1lOQ19ET05FIHwgVENGX05PX1NZTkNfTkVHTykpID09IDApIHsKKworCQkJcEN1clRjYi0+VENTX0ZsYWdzIHw9IFRDRl9TWU5DX0RPTkU7CisKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX0VYVEVORCk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDMpOwkvKiBleHRlbmRlZCBtc2cgbGVuZ3RoICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDEpOwkvKiBzeW5jIHJlcXVlc3QgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgdHVsX3JhdGVfdGJsW3BDdXJUY2ItPlRDU19GbGFncyAmIFRDRl9TQ1NJX1JBVEVdKTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTUFYX09GRlNFVCk7CS8qIFJFUS9BQ0sgb2Zmc2V0ICovCisJCX0KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJcmV0dXJuICgtMSk7CisJfQorCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTaWduYWwpICYgKFRTQ19TRVRfQUNLIHwgNykpKTsKKwlyZXR1cm4gKDMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzdGF0ZSBhZnRlciBzZWxlY3Rpb24gd2l0aCBhdHRlbnRpb24gKi8KKy8qIHN0YXRlIGFmdGVyIHNlbGVjdGlvbiB3aXRoIGF0dGVudGlvbjMgKi8KK2ludCB0dWxfc3RhdGVfMihIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisJVENTICpwQ3VyVGNiID0gcEN1ckhjYi0+SENTX0FjdFRjczsKKyNpZiBERUJVR19TVEFURQorCXByaW50aygiLXMyLSIpOworI2VuZGlmCisKKwl0dWxfdW5saW5rX3BlbmRfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCXR1bF9hcHBlbmRfYnVzeV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NvbmZpZywgcEN1clRjYi0+VENTX1NDb25maWcwKTsKKworCWlmIChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMxICYgVFNTX0NNRF9QSF9DTVApIHsKKwkJcmV0dXJuICg0KTsKKwl9CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLCAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSkpOworCXJldHVybiAoMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzdGF0ZSBiZWZvcmUgQ0RCIHhmZXIgaXMgZG9uZSAqLworaW50IHR1bF9zdGF0ZV8zKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKwlUQ1MgKnBDdXJUY2IgPSBwQ3VySGNiLT5IQ1NfQWN0VGNzOworCWludCBpOworCisjaWYgREVCVUdfU1RBVEUKKwlwcmludGsoIi1zMy0iKTsKKyNlbmRpZgorCWZvciAoOzspIHsKKwkJc3dpdGNoIChwQ3VySGNiLT5IQ1NfUGhhc2UpIHsKKwkJY2FzZSBDTURfT1VUOgkvKiBDb21tYW5kIG91dCBwaGFzZSAgICAgICAgICAgICovCisJCQlmb3IgKGkgPSAwOyBpIDwgKGludCkgcEN1clNjYi0+U0NCX0NEQkxlbjsgaSsrKQorCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgcEN1clNjYi0+U0NCX0NEQltpXSk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSA9PSBDTURfT1VUKSB7CisJCQkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisJCQl9CisJCQlyZXR1cm4gKDQpOworCisJCWNhc2UgTVNHX0lOOgkvKiBNZXNzYWdlIGluIHBoYXNlICAgICAgICAgICAgICovCisJCQlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDM7CisJCQlpZiAodHVsX21zZ2luKHBDdXJIY2IpID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFUVVNfSU46CS8qIFN0YXR1cyBwaGFzZSAgICAgICAgICAgICAgICAgKi8KKwkJCWlmICh0dWxfc3RhdHVzX21zZyhwQ3VySGNiKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX09VVDoJLyogTWVzc2FnZSBvdXQgcGhhc2UgICAgICAgICAgICAqLworCQkJaWYgKHBDdXJUY2ItPlRDU19GbGFncyAmIChUQ0ZfU1lOQ19ET05FIHwgVENGX05PX1NZTkNfTkVHTykpIHsKKworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX05PUCk7CQkvKiBtc2cgbm9wICovCisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCQkJaWYgKHdhaXRfdHVsaXAocEN1ckhjYikgPT0gLTEpCisJCQkJCXJldHVybiAoLTEpOworCisJCQl9IGVsc2UgeworCQkJCXBDdXJUY2ItPlRDU19GbGFncyB8PSBUQ0ZfU1lOQ19ET05FOworCisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfRVhURU5EKTsKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDMpOwkvKiBleHQuIG1zZyBsZW4gKi8KKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDEpOwkvKiBzeW5jIHJlcXVlc3QgKi8KKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHR1bF9yYXRlX3RibFtwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiBUQ0ZfU0NTSV9SQVRFXSk7CisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNQVhfT0ZGU0VUKTsJLyogUkVRL0FDSyBvZmZzZXQgKi8KKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLCBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKTsKKworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX3N0YXRlXzQoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCisjaWYgREVCVUdfU1RBVEUKKwlwcmludGsoIi1zNC0iKTsKKyNlbmRpZgorCWlmICgocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX0RJUikgPT0gU0NGX05PX1hGKSB7CisJCXJldHVybiAoNik7CS8qIEdvIHRvIHN0YXRlIDYgICAgICAgICAgICAgICAgKi8KKwl9CisJZm9yICg7OykgeworCQlpZiAocEN1clNjYi0+U0NCX0J1ZkxlbiA9PSAwKQorCQkJcmV0dXJuICg2KTsJLyogR28gdG8gc3RhdGUgNiAgICAgICAgICAgICAgICAqLworCisJCXN3aXRjaCAocEN1ckhjYi0+SENTX1BoYXNlKSB7CisKKwkJY2FzZSBTVEFUVVNfSU46CS8qIFN0YXR1cyBwaGFzZSAgICAgICAgICAgICAgICAgKi8KKwkJCWlmICgocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX0RJUikgIT0gMCkgewkvKiBpZiBkaXJlY3Rpb24gYml0IHNldCB0aGVuIHJlcG9ydCBkYXRhIHVuZGVycnVuICovCisJCQkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfRE9fRFU7CisJCQl9CisJCQlpZiAoKHR1bF9zdGF0dXNfbXNnKHBDdXJIY2IpKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX0lOOgkvKiBNZXNzYWdlIGluIHBoYXNlICAgICAgICAgICAgICovCisJCQlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDB4NDsKKwkJCWlmICh0dWxfbXNnaW4ocEN1ckhjYikgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19PVVQ6CS8qIE1lc3NhZ2Ugb3V0IHBoYXNlICAgICAgICAgICAgKi8KKwkJCWlmIChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwICYgVFNTX1BBUl9FUlJPUikgeworCQkJCXBDdXJTY2ItPlNDQl9CdWZMZW4gPSAwOworCQkJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0RPX0RVOworCQkJCWlmICh0dWxfbXNnb3V0X2lkZShwQ3VySGNiKSA9PSAtMSkKKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJcmV0dXJuICg2KTsJLyogR28gdG8gc3RhdGUgNiAgICAgICAgICAgICAgICAqLworCQkJfSBlbHNlIHsKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19OT1ApOwkJLyogbXNnIG5vcCAqLworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCQkJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgREFUQV9JTjoJLyogRGF0YSBpbiBwaGFzZSAgICAgICAgICAgICAgICAqLworCQkJcmV0dXJuICh0dWxfeGZlcl9kYXRhX2luKHBDdXJIY2IpKTsKKworCQljYXNlIERBVEFfT1VUOgkvKiBEYXRhIG91dCBwaGFzZSAgICAgICAgICAgICAgICovCisJCQlyZXR1cm4gKHR1bF94ZmVyX2RhdGFfb3V0KHBDdXJIY2IpKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisJCX0KKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHN0YXRlIGFmdGVyIGRtYSB4ZmVyIGRvbmUgb3IgcGhhc2UgY2hhbmdlIGJlZm9yZSB4ZmVyIGRvbmUgKi8KK2ludCB0dWxfc3RhdGVfNShIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisJbG9uZyBjbnQsIHhjbnQ7CQkvKiBjYW5ub3QgdXNlIHVuc2lnbmVkICEhIGNvZGU6IGlmICh4Y250IDwgMCkgKi8KKworI2lmIERFQlVHX1NUQVRFCisJcHJpbnRrKCItczUtIik7CisjZW5kaWYKKy8qLS0tLS0tIGdldCByZW1haW5pbmcgY291bnQgLS0tLS0tLSovCisKKwljbnQgPSBUVUxfUkRMT05HKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0NudDApICYgMHgwRkZGRkZGOworCisJaWYgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hDbWQpICYgMHgyMCkgeworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEQVRBX0lOIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJCS8qIGNoZWNrIHNjc2kgcGFyaXR5IGVycm9yICovCisJCWlmIChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwICYgVFNTX1BBUl9FUlJPUikgeworCQkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfRE9fRFU7CisJCX0KKwkJaWYgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hTdGF0dXMpICYgWFBFTkQpIHsJLyogRE1BIHhmZXIgcGVuZGluZywgU2VuZCBTVE9QICAqLworCQkJLyogdGVsbCBIYXJkd2FyZSAgc2NzaSB4ZmVyIGhhcyBiZWVuIHRlcm1pbmF0ZWQgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ3RybCwgVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfWEN0cmwpIHwgMHg4MCk7CisJCQkvKiB3YWl0IHVudGlsIERNQSB4ZmVyIG5vdCBwZW5kaW5nICovCisJCQl3aGlsZSAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfWFN0YXR1cykgJiBYUEVORCk7CisJCX0KKwl9IGVsc2UgeworLyotLS0tLS0tLSBEQVRBIE9VVCAtLS0tLS0tLS0tLSovCisJCWlmICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czEpICYgVFNTX1hGRVJfQ01QKSA9PSAwKSB7CisJCQlpZiAocEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0pTX1BlcmlvZCAmIFRTQ19XSURFX1NDU0kpCisJCQkJY250ICs9IChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmb0NudCkgJiAweDFGKSA8PCAxOworCQkJZWxzZQorCQkJCWNudCArPSAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm9DbnQpICYgMHgxRik7CisJCX0KKwkJaWYgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hTdGF0dXMpICYgWFBFTkQpIHsJLyogaWYgRE1BIHhmZXIgaXMgcGVuZGluZywgYWJvcnQgRE1BIHhmZXIgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ21kLCBUQVhfWF9BQlQpOworCQkJLyogd2FpdCBBYm9ydCBETUEgeGZlciBkb25lICovCisJCQl3aGlsZSAoKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX0ludCkgJiBYQUJUKSA9PSAwKTsKKwkJfQorCQlpZiAoKGNudCA9PSAxKSAmJiAocEN1ckhjYi0+SENTX1BoYXNlID09IERBVEFfT1VUKSkgeworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCQlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkgeworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJY250ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czEpICYgVFNTX1hGRVJfQ01QKSA9PSAwKQorCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwkJfQorCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlwQ3VyU2NiLT5TQ0JfQnVmTGVuID0gMDsKKwkJcmV0dXJuICg2KTsJLyogR28gdG8gc3RhdGUgNiAgICAgICAgICAgICAgICAqLworCX0KKwkvKiBVcGRhdGUgYWN0aXZlIGRhdGEgcG9pbnRlciAqLworCXhjbnQgPSAobG9uZykgcEN1clNjYi0+U0NCX0J1ZkxlbiAtIGNudDsJLyogeGNudD09IGJ5dGVzIGFscmVhZHkgeGZlcnJlZCAqLworCXBDdXJTY2ItPlNDQl9CdWZMZW4gPSAoVTMyKSBjbnQ7CS8qIGNudCA9PSBieXRlcyBsZWZ0IHRvIGJlIHhmZXJyZWQgKi8KKwlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1NHKSB7CisJCXJlZ2lzdGVyIFNHICpzZ3A7CisJCVVMT05HIGk7CisKKwkJc2dwID0gJnBDdXJTY2ItPlNDQl9TR0xpc3RbcEN1clNjYi0+U0NCX1NHSWR4XTsKKwkJZm9yIChpID0gcEN1clNjYi0+U0NCX1NHSWR4OyBpIDwgcEN1clNjYi0+U0NCX1NHTWF4OyBzZ3ArKywgaSsrKSB7CisJCQl4Y250IC09IChsb25nKSBzZ3AtPlNHX0xlbjsKKwkJCWlmICh4Y250IDwgMCkgewkJLyogdGhpcyBzZ3AgeGZlciBoYWxmIGRvbmUgKi8KKwkJCQl4Y250ICs9IChsb25nKSBzZ3AtPlNHX0xlbjsJLyogeGNudCA9PSBieXRlcyB4ZmVycmVkIGluIHRoaXMgc2dwICovCisJCQkJc2dwLT5TR19QdHIgKz0gKFUzMikgeGNudDsJLyogbmV3IHB0ciB0byBiZSB4ZmVyICovCisJCQkJc2dwLT5TR19MZW4gLT0gKFUzMikgeGNudDsJLyogbmV3IGxlbiB0byBiZSB4ZmVyICovCisJCQkJcEN1clNjYi0+U0NCX0J1ZlB0ciArPSAoKFUzMikgKGkgLSBwQ3VyU2NiLT5TQ0JfU0dJZHgpIDw8IDMpOworCQkJCS8qIG5ldyBTRyB0YWJsZSBwdHIgKi8KKwkJCQlwQ3VyU2NiLT5TQ0JfU0dMZW4gPSAoQllURSkgKHBDdXJTY2ItPlNDQl9TR01heCAtIGkpOworCQkJCS8qIG5ldyBTRyB0YWJsZSBsZW4gKi8KKwkJCQlwQ3VyU2NiLT5TQ0JfU0dJZHggPSAoV09SRCkgaTsKKwkJCQkvKiBmb3IgbmV4dCBkaXNjIGFuZCBjb21lIGluIHRoaXMgbG9vcCAqLworCQkJCXJldHVybiAoNCk7CS8qIEdvIHRvIHN0YXRlIDQgICAgICAgICAgICAgICAgKi8KKwkJCX0KKwkJCS8qIGVsc2UgKHhjbnQgPj0gMCAsIGkuZS4gdGhpcyBzZ3AgYWxyZWFkeSB4ZmVycmVkICovCisJCX0JCS8qIGZvciAqLworCQlyZXR1cm4gKDYpOwkvKiBHbyB0byBzdGF0ZSA2ICAgICAgICAgICAgICAgICovCisJfSBlbHNlIHsKKwkJcEN1clNjYi0+U0NCX0J1ZlB0ciArPSAoVTMyKSB4Y250OworCX0KKwlyZXR1cm4gKDQpOwkJLyogR28gdG8gc3RhdGUgNCAgICAgICAgICAgICAgICAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RhdGUgYWZ0ZXIgRGF0YSBwaGFzZSAqLworaW50IHR1bF9zdGF0ZV82KEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKworI2lmIERFQlVHX1NUQVRFCisJcHJpbnRrKCItczYtIik7CisjZW5kaWYKKwlmb3IgKDs7KSB7CisJCXN3aXRjaCAocEN1ckhjYi0+SENTX1BoYXNlKSB7CisJCWNhc2UgU1RBVFVTX0lOOgkvKiBTdGF0dXMgcGhhc2UgICAgICAgICAgICAgICAgICovCisJCQlpZiAoKHR1bF9zdGF0dXNfbXNnKHBDdXJIY2IpKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX0lOOgkvKiBNZXNzYWdlIGluIHBoYXNlICAgICAgICAgICAgICovCisJCQlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDY7CisJCQlpZiAoKHR1bF9tc2dpbihwQ3VySGNiKSkgPT0gLTEpCisJCQkJcmV0dXJuICgtMSk7CisJCQlicmVhazsKKworCQljYXNlIE1TR19PVVQ6CS8qIE1lc3NhZ2Ugb3V0IHBoYXNlICAgICAgICAgICAgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX05PUCk7CQkvKiBtc2cgbm9wICovCisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJCXJldHVybiAoLTEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBEQVRBX0lOOgkvKiBEYXRhIGluIHBoYXNlICAgICAgICAgICAgICAgICovCisJCQlyZXR1cm4gKHR1bF94cGFkX2luKHBDdXJIY2IpKTsKKworCQljYXNlIERBVEFfT1VUOgkvKiBEYXRhIG91dCBwaGFzZSAgICAgICAgICAgICAgICovCisJCQlyZXR1cm4gKHR1bF94cGFkX291dChwQ3VySGNiKSk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9zdGF0ZV83KEhDUyAqIHBDdXJIY2IpCit7CisJaW50IGNudCwgaTsKKworI2lmIERFQlVHX1NUQVRFCisJcHJpbnRrKCItczctIik7CisjZW5kaWYKKwkvKiBmbHVzaCBTQ1NJIEZJRk8gKi8KKwljbnQgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmb0NudCkgJiAweDFGOworCWlmIChjbnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorCQkJVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOworCX0KKwlzd2l0Y2ggKHBDdXJIY2ItPkhDU19QaGFzZSkgeworCWNhc2UgREFUQV9JTjoJCS8qIERhdGEgaW4gcGhhc2UgICAgICAgICAgICAgICAgKi8KKwljYXNlIERBVEFfT1VUOgkJLyogRGF0YSBvdXQgcGhhc2UgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDYpOwkvKiBHbyB0byBzdGF0ZSA2ICAgICAgICAgICAgICAgICovCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF94ZmVyX2RhdGFfaW4oSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCisJaWYgKChwQ3VyU2NiLT5TQ0JfRmxhZ3MgJiBTQ0ZfRElSKSA9PSBTQ0ZfRE9VVCkgeworCQlyZXR1cm4gKDYpOwkvKiB3cm9uZyBkaXJlY3Rpb24gKi8KKwl9CisJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgcEN1clNjYi0+U0NCX0J1Zkxlbik7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0RNQV9JTik7CS8qIDcvMjUvOTUgKi8KKworCWlmIChwQ3VyU2NiLT5TQ0JfRmxhZ3MgJiBTQ0ZfU0cpIHsJLyogUy9HIHhmZXIgKi8KKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ250SCwgKChVTE9ORykgcEN1clNjYi0+U0NCX1NHTGVuKSA8PCAzKTsKKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQWRkSCwgcEN1clNjYi0+U0NCX0J1ZlB0cik7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ21kLCBUQVhfU0dfSU4pOworCX0gZWxzZSB7CisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENudEgsIHBDdXJTY2ItPlNDQl9CdWZMZW4pOworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hBZGRILCBwQ3VyU2NiLT5TQ0JfQnVmUHRyKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1hDbWQsIFRBWF9YX0lOKTsKKwl9CisJcEN1clNjYi0+U0NCX054dFN0YXQgPSAweDU7CisJcmV0dXJuICgwKTsJCS8qIHJldHVybiB0byBPUywgd2FpdCB4ZmVyIGRvbmUgLCBsZXQgamFzX2lzciBjb21lIGluICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfeGZlcl9kYXRhX291dChIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisKKwlpZiAoKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9ESVIpID09IFNDRl9ESU4pIHsKKwkJcmV0dXJuICg2KTsJLyogd3JvbmcgZGlyZWN0aW9uICovCisJfQorCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIHBDdXJTY2ItPlNDQl9CdWZMZW4pOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRE1BX09VVCk7CisKKwlpZiAocEN1clNjYi0+U0NCX0ZsYWdzICYgU0NGX1NHKSB7CS8qIFMvRyB4ZmVyICovCisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENudEgsICgoVUxPTkcpIHBDdXJTY2ItPlNDQl9TR0xlbikgPDwgMyk7CisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWEFkZEgsIHBDdXJTY2ItPlNDQl9CdWZQdHIpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENtZCwgVEFYX1NHX09VVCk7CisJfSBlbHNlIHsKKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9YQ250SCwgcEN1clNjYi0+U0NCX0J1Zkxlbik7CisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWEFkZEgsIHBDdXJTY2ItPlNDQl9CdWZQdHIpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENtZCwgVEFYX1hfT1VUKTsKKwl9CisKKwlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDB4NTsKKwlyZXR1cm4gKDApOwkJLyogcmV0dXJuIHRvIE9TLCB3YWl0IHhmZXIgZG9uZSAsIGxldCBqYXNfaXNyIGNvbWUgaW4gKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF94cGFkX2luKEhDUyAqIHBDdXJIY2IpCit7CisJU0NCICpwQ3VyU2NiID0gcEN1ckhjYi0+SENTX0FjdFNjYjsKKwlUQ1MgKnBDdXJUY2IgPSBwQ3VySGNiLT5IQ1NfQWN0VGNzOworCisJaWYgKChwQ3VyU2NiLT5TQ0JfRmxhZ3MgJiBTQ0ZfRElSKSAhPSBTQ0ZfTk9fRENISykgeworCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9ET19EVTsJLyogb3ZlciBydW4gICAgICAgICAgICAgKi8KKwl9CisJZm9yICg7OykgeworCQlpZiAocEN1clRjYi0+VENTX0pTX1BlcmlvZCAmIFRTQ19XSURFX1NDU0kpCisJCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCAyKTsKKwkJZWxzZQorCQkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMSk7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX0lOKTsKKwkJaWYgKCh3YWl0X3R1bGlwKHBDdXJIY2IpKSA9PSAtMSkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSAhPSBEQVRBX0lOKSB7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJCQlyZXR1cm4gKDYpOworCQl9CisJCVRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvKTsKKwl9Cit9CisKK2ludCB0dWxfeHBhZF9vdXQoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCVRDUyAqcEN1clRjYiA9IHBDdXJIY2ItPkhDU19BY3RUY3M7CisKKwlpZiAoKHBDdXJTY2ItPlNDQl9GbGFncyAmIFNDRl9ESVIpICE9IFNDRl9OT19EQ0hLKSB7CisJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0RPX0RVOwkvKiBvdmVyIHJ1biAgICAgICAgICAgICAqLworCX0KKwlmb3IgKDs7KSB7CisJCWlmIChwQ3VyVGNiLT5UQ1NfSlNfUGVyaW9kICYgVFNDX1dJREVfU0NTSSkKKwkJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIDIpOworCQllbHNlCisJCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCAxKTsKKworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDApOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJaWYgKCh3YWl0X3R1bGlwKHBDdXJIY2IpKSA9PSAtMSkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSAhPSBEQVRBX09VVCkgewkvKiBEaXNhYmxlIHdpZGUgQ1BVIHRvIGFsbG93IHJlYWQgMTYgYml0cyAqLworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMSwgVFNDX0hXX1JFU0VMRUNUKTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwkJCXJldHVybiAoNik7CisJCX0KKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfc3RhdHVzX21zZyhIQ1MgKiBwQ3VySGNiKQorewkJCQkvKiBzdGF0dXMgJiBNU0dfSU4gKi8KKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCUJZVEUgbXNnOworCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19DTURfQ09NUCk7CisJaWYgKCh3YWl0X3R1bGlwKHBDdXJIY2IpKSA9PSAtMSkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJLyogZ2V0IHN0YXR1cyAqLworCXBDdXJTY2ItPlNDQl9UYVN0YXQgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbyk7CisKKwlpZiAocEN1ckhjYi0+SENTX1BoYXNlID09IE1TR19PVVQpIHsKKwkJaWYgKHBDdXJIY2ItPkhDU19KU1N0YXR1czAgJiBUU1NfUEFSX0VSUk9SKSB7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19QQVJJVFkpOworCQl9IGVsc2UgeworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBNU0dfTk9QKTsKKwkJfQorCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJcmV0dXJuICh3YWl0X3R1bGlwKHBDdXJIY2IpKTsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSA9PSBNU0dfSU4pIHsKKwkJbXNnID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOworCQlpZiAocEN1ckhjYi0+SENTX0pTU3RhdHVzMCAmIFRTU19QQVJfRVJST1IpIHsJLyogUGFyaXR5IGVycm9yICAgICAgICAgICAgICAgICAqLworCQkJaWYgKCh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gTVNHX09VVCkKKwkJCQlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX1BBUklUWSk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKwkJCXJldHVybiAod2FpdF90dWxpcChwQ3VySGNiKSk7CisJCX0KKwkJaWYgKG1zZyA9PSAwKSB7CS8qIENvbW1hbmQgY29tcGxldGUgICAgICAgICAgICAgKi8KKworCQkJaWYgKChwQ3VyU2NiLT5TQ0JfVGFTdGF0ICYgMHgxOCkgPT0gMHgxMCkgewkvKiBObyBsaW5rIHN1cHBvcnQgICAgICAgICAgICAgICovCisJCQkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisJCQl9CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX01TR19BQ0NFUFQpOworCQkJcmV0dXJuIHR1bF93YWl0X2RvbmVfZGlzYyhwQ3VySGNiKTsKKworCQl9CisJCWlmICgobXNnID09IE1TR19MSU5LX0NPTVApIHx8IChtc2cgPT0gTVNHX0xJTktfRkxBRykpIHsKKwkJCWlmICgocEN1clNjYi0+U0NCX1RhU3RhdCAmIDB4MTgpID09IDB4MTApCisJCQkJcmV0dXJuICh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKTsKKwkJfQorCX0KKwlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc2NzaSBidXMgZnJlZSAqLworaW50IGludF90dWxfYnVzZnJlZShIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2I7CisKKwlpZiAocEN1clNjYiAhPSBOVUxMKSB7CisJCWlmIChwQ3VyU2NiLT5TQ0JfU3RhdHVzICYgU0NCX1NFTEVDVCkgewkJLyogc2VsZWN0aW9uIHRpbWVvdXQgKi8KKwkJCXR1bF91bmxpbmtfcGVuZF9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9TRUxfVE9VVDsKKwkJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCX0gZWxzZSB7CS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUgICAgICAgICAgKi8KKwkJCXR1bF91bmxpbmtfYnVzeV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9CVVNfRlJFRTsKKwkJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJCX0KKwkJcEN1ckhjYi0+SENTX0FjdFNjYiA9IE5VTEw7CisJCXBDdXJIY2ItPkhDU19BY3RUY3MgPSBOVUxMOworCX0KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CQkvKiBGbHVzaCBTQ1NJIEZJRk8gICovCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIFRTQ19JTklUREVGQVVMVCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMSwgVFNDX0hXX1JFU0VMRUNUKTsJLyogRW5hYmxlIEhXIHJlc2VsZWN0ICAgICAgICovCisJcmV0dXJuICgtMSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNjc2kgYnVzIHJlc2V0ICovCitpbnQgaW50X3R1bF9zY3NpX3JzdChIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYjsKKwlpbnQgaTsKKworCS8qIGlmIERNQSB4ZmVyIGlzIHBlbmRpbmcsIGFib3J0IERNQSB4ZmVyICovCisJaWYgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1hTdGF0dXMpICYgMHgwMSkgeworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfWENtZCwgVEFYX1hfQUJUIHwgVEFYX1hfQ0xSX0ZJRk8pOworCQkvKiB3YWl0IEFib3J0IERNQSB4ZmVyIGRvbmUgKi8KKwkJd2hpbGUgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9JbnQpICYgMHgwNCkgPT0gMCk7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwl9CisJLyogQWJvcnQgYWxsIGFjdGl2ZSAmIGRpc2Nvbm5lY3RlZCBzY2IgKi8KKwl3aGlsZSAoKHBDdXJTY2IgPSB0dWxfcG9wX2J1c3lfc2NiKHBDdXJIY2IpKSAhPSBOVUxMKSB7CisJCXBDdXJTY2ItPlNDQl9IYVN0YXQgPSBIT1NUX0JBRF9QSEFTOworCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCX0KKwlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gTlVMTDsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gTlVMTDsKKworCS8qIGNsciBzeW5jIG5lZ28uIGRvbmUgZmxhZyAqLworCWZvciAoaSA9IDA7IGkgPCBwQ3VySGNiLT5IQ1NfTWF4VGFyOyBpKyspIHsKKwkJcEN1ckhjYi0+SENTX1Rjc1tpXS5UQ1NfRmxhZ3MgJj0gfihUQ0ZfU1lOQ19ET05FIHwgVENGX1dEVFJfRE9ORSk7CisJfQorCXJldHVybiAoLTEpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzY3NpIHJlc2VsZWN0aW9uICovCitpbnQgaW50X3R1bF9yZXNlbChIQ1MgKiBwQ3VySGNiKQoreworCVNDQiAqcEN1clNjYjsKKwlUQ1MgKnBDdXJUY2I7CisJQllURSB0YWcsIG1zZyA9IDA7CisJQllURSB0YXIsIGx1bjsKKworCWlmICgocEN1clNjYiA9IHBDdXJIY2ItPkhDU19BY3RTY2IpICE9IE5VTEwpIHsKKwkJaWYgKHBDdXJTY2ItPlNDQl9TdGF0dXMgJiBTQ0JfU0VMRUNUKSB7CQkvKiBpZiB3YWl0aW5nIGZvciBzZWxlY3Rpb24gY29tcGxldGUgKi8KKwkJCXBDdXJTY2ItPlNDQl9TdGF0dXMgJj0gflNDQl9TRUxFQ1Q7CisJCX0KKwkJcEN1ckhjYi0+SENTX0FjdFNjYiA9IE5VTEw7CisJfQorCS8qIC0tLS0tLS0tLSBnZXQgdGFyZ2V0IGlkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXRhciA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NCdXNJZCk7CisJLyogLS0tLS0tIGdldCBMVU4gZnJvbSBJZGVudGlmeSBtZXNzYWdlLS0tLS0tLS0tLS0gKi8KKwlsdW4gPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TSWRlbnQpICYgMHgwRjsKKwkvKiAwNy8yMi85OCBmcm9tIDB4MUYgLT4gMHgwRiAqLworCXBDdXJUY2IgPSAmcEN1ckhjYi0+SENTX1Rjc1t0YXJdOworCXBDdXJIY2ItPkhDU19BY3RUY3MgPSBwQ3VyVGNiOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBwQ3VyVGNiLT5UQ1NfU0NvbmZpZzApOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TUGVyaW9kLCBwQ3VyVGNiLT5UQ1NfSlNfUGVyaW9kKTsKKworCisJLyogLS0tLS0tLS0tLS0tLSB0YWcgcXVldWVpbmcgPyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKHBDdXJUY2ItPlRDU19EcnZGbGFncyAmIFRDRl9EUlZfRU5fVEFHKSB7CisJCWlmICgodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSkgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwkJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSAhPSBNU0dfSU4pCisJCQlnb3RvIG5vX3RhZzsKKwkJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMSk7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19JTik7CisJCWlmICgod2FpdF90dWxpcChwQ3VySGNiKSkgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwkJbXNnID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOwkvKiBSZWFkIFRhZyBNZXNzYWdlICAgICovCisKKwkJaWYgKChtc2cgPCBNU0dfU1RBRykgfHwgKG1zZyA+IE1TR19PVEFHKSkJLyogSXMgc2ltcGxlIFRhZyAgICAgICovCisJCQlnb3RvIG5vX3RhZzsKKworCQlpZiAoKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikpID09IC0xKQorCQkJcmV0dXJuICgtMSk7CisKKwkJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSAhPSBNU0dfSU4pCisJCQlnb3RvIG5vX3RhZzsKKworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCAxKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX0lOKTsKKwkJaWYgKCh3YWl0X3R1bGlwKHBDdXJIY2IpKSA9PSAtMSkKKwkJCXJldHVybiAoLTEpOworCQl0YWcgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbyk7CS8qIFJlYWQgVGFnIElEICAgICAgICovCisJCXBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfU2NiICsgdGFnOworCQlpZiAoKHBDdXJTY2ItPlNDQl9UYXJnZXQgIT0gdGFyKSB8fCAocEN1clNjYi0+U0NCX0x1biAhPSBsdW4pKSB7CisJCQlyZXR1cm4gdHVsX21zZ291dF9hYm9ydF90YWcocEN1ckhjYik7CisJCX0KKwkJaWYgKHBDdXJTY2ItPlNDQl9TdGF0dXMgIT0gU0NCX0JVU1kpIHsJLyogMDMvMjQvOTUgICAgICAgICAgICAgKi8KKwkJCXJldHVybiB0dWxfbXNnb3V0X2Fib3J0X3RhZyhwQ3VySGNiKTsKKwkJfQorCQlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gcEN1clNjYjsKKwkJaWYgKCh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKSA9PSAtMSkKKwkJCXJldHVybiAoLTEpOworCX0gZWxzZSB7CQkvKiBObyB0YWcgICAgICAgICAgICAgICAqLworCSAgICAgIG5vX3RhZzoKKwkJaWYgKChwQ3VyU2NiID0gdHVsX2ZpbmRfYnVzeV9zY2IocEN1ckhjYiwgdGFyIHwgKGx1biA8PCA4KSkpID09IE5VTEwpIHsKKwkJCXJldHVybiB0dWxfbXNnb3V0X2Fib3J0X3RhcmcocEN1ckhjYik7CisJCX0KKwkJcEN1ckhjYi0+SENTX0FjdFNjYiA9IHBDdXJTY2I7CisJCWlmICghKHBDdXJUY2ItPlRDU19EcnZGbGFncyAmIFRDRl9EUlZfRU5fVEFHKSkgeworCQkJaWYgKCh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGludF90dWxfYmFkX3NlcShIQ1MgKiBwQ3VySGNiKQorewkJCQkvKiB0YXJnZXQgd3JvbmcgcGhhc2UgICAgICAgICAgICovCisJU0NCICpwQ3VyU2NiOworCWludCBpOworCisJdHVsX3Jlc2V0X3Njc2kocEN1ckhjYiwgMTApOworCisJd2hpbGUgKChwQ3VyU2NiID0gdHVsX3BvcF9idXN5X3NjYihwQ3VySGNiKSkgIT0gTlVMTCkgeworCQlwQ3VyU2NiLT5TQ0JfSGFTdGF0ID0gSE9TVF9CQURfUEhBUzsKKwkJdHVsX2FwcGVuZF9kb25lX3NjYihwQ3VySGNiLCBwQ3VyU2NiKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHBDdXJIY2ItPkhDU19NYXhUYXI7IGkrKykgeworCQlwQ3VySGNiLT5IQ1NfVGNzW2ldLlRDU19GbGFncyAmPSB+KFRDRl9TWU5DX0RPTkUgfCBUQ0ZfV0RUUl9ET05FKTsKKwl9CisJcmV0dXJuICgtMSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnb3V0X2Fib3J0X3RhcmcoSENTICogcEN1ckhjYikKK3sKKworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLCAoKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTaWduYWwpICYgKFRTQ19TRVRfQUNLIHwgNykpIHwgVFNDX1NFVF9BVE4pKTsKKwlpZiAodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKHBDdXJIY2ItPkhDU19QaGFzZSAhPSBNU0dfT1VUKQorCQlyZXR1cm4gKHR1bF9iYWRfc2VxKHBDdXJIY2IpKTsKKworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX0FCT1JUKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fT1VUKTsKKworCXJldHVybiB0dWxfd2FpdF9kaXNjKHBDdXJIY2IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9tc2dvdXRfYWJvcnRfdGFnKEhDUyAqIHBDdXJIY2IpCit7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSB8IFRTQ19TRVRfQVROKSk7CisJaWYgKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikgPT0gLTEpCisJCXJldHVybiAoLTEpOworCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gTVNHX09VVCkKKwkJcmV0dXJuICh0dWxfYmFkX3NlcShwQ3VySGNiKSk7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19BQk9SVF9UQUcpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCisJcmV0dXJuIHR1bF93YWl0X2Rpc2MocEN1ckhjYik7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnaW4oSENTICogcEN1ckhjYikKK3sKKwlUQ1MgKnBDdXJUY2I7CisKKwlmb3IgKDs7KSB7CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOworCisJCVRVTF9XUkxPTkcocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NudDAsIDEpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1hGX0ZJRk9fSU4pOworCQlpZiAoKHdhaXRfdHVsaXAocEN1ckhjYikpID09IC0xKQorCQkJcmV0dXJuICgtMSk7CisKKwkJc3dpdGNoIChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbykpIHsKKwkJY2FzZSBNU0dfRElTQzoJLyogRGlzY29ubmVjdCBtc2cgKi8KKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfTVNHX0FDQ0VQVCk7CisKKwkJCXJldHVybiB0dWxfd2FpdF9kaXNjKHBDdXJIY2IpOworCisJCWNhc2UgTVNHX1NEUDoKKwkJY2FzZSBNU0dfUkVTVE9SRToKKwkJY2FzZSBNU0dfTk9QOgorCQkJdHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX1JFSjoJLyogQ2xlYXIgQVROIGZpcnN0ICAgICAgICAgICAgICAqLworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsCisJCQkgICAgICAgKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTaWduYWwpICYgKFRTQ19TRVRfQUNLIHwgNykpKTsKKwkJCXBDdXJUY2IgPSBwQ3VySGNiLT5IQ1NfQWN0VGNzOworCQkJaWYgKChwQ3VyVGNiLT5UQ1NfRmxhZ3MgJiAoVENGX1NZTkNfRE9ORSB8IFRDRl9OT19TWU5DX05FR08pKSA9PSAwKSB7CS8qIGRvIHN5bmMgbmVnbyAqLworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TU2lnbmFsLCAoKFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTaWduYWwpICYgKFRTQ19TRVRfQUNLIHwgNykpIHwgVFNDX1NFVF9BVE4pKTsKKwkJCX0KKwkJCXR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYik7CisJCQlicmVhazsKKworCQljYXNlIE1TR19FWFRFTkQ6CS8qIGV4dGVuZGVkIG1zZyAqLworCQkJdHVsX21zZ2luX2V4dGVuZChwQ3VySGNiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVNHX0lHTk9SRVdJREU6CisJCQl0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpOworCQkJYnJlYWs7CisKKwkJCS8qIGdldCAqLworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX0lOKTsKKwkJCWlmICh3YWl0X3R1bGlwKHBDdXJIY2IpID09IC0xKQorCQkJCXJldHVybiAtMTsKKworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAwKTsJLyogcHV0IHBhZCAgKi8KKwkJCVRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NGaWZvKTsJLyogZ2V0IElHTk9SRSBmaWVsZCAqLworCQkJVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ZpZm8pOwkvKiBnZXQgcGFkICovCisKKwkJCXR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYik7CisJCQlicmVhazsKKworCQljYXNlIE1TR19DT01QOgorCQkJeworCQkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsKKwkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX01TR19BQ0NFUFQpOworCQkJCXJldHVybiB0dWxfd2FpdF9kb25lX2Rpc2MocEN1ckhjYik7CisJCQl9CisJCWRlZmF1bHQ6CisJCQl0dWxfbXNnb3V0X3JlamVjdChwQ3VySGNiKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgIT0gTVNHX0lOKQorCQkJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworCX0KKwkvKiBzdGF0ZW1lbnQgd29uJ3QgcmVhY2ggaGVyZSAqLworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9tc2dvdXRfcmVqZWN0KEhDUyAqIHBDdXJIY2IpCit7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSB8IFRTQ19TRVRfQVROKSk7CisKKwlpZiAoKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikpID09IC0xKQorCQlyZXR1cm4gKC0xKTsKKworCWlmIChwQ3VySGNiLT5IQ1NfUGhhc2UgPT0gTVNHX09VVCkgeworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19SRUopOwkJLyogTXNnIHJlamVjdCAgICAgICAgICAgKi8KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJCXJldHVybiAod2FpdF90dWxpcChwQ3VySGNiKSk7CisJfQorCXJldHVybiAocEN1ckhjYi0+SENTX1BoYXNlKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdHVsX21zZ291dF9pZGUoSENTICogcEN1ckhjYikKK3sKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19JREUpOwkJLyogSW5pdGlhdG9yIERldGVjdGVkIEVycm9yICovCisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJcmV0dXJuICh3YWl0X3R1bGlwKHBDdXJIY2IpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF9tc2dpbl9leHRlbmQoSENTICogcEN1ckhjYikKK3sKKwlCWVRFIGxlbiwgaWR4OworCisJaWYgKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikgIT0gTVNHX0lOKQorCQlyZXR1cm4gKHBDdXJIY2ItPkhDU19QaGFzZSk7CisKKwkvKiBHZXQgZXh0ZW5kZWQgbXNnIGxlbmd0aCAgICAgICovCisJVFVMX1dSTE9ORyhwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ250MCwgMSk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX0lOKTsKKwlpZiAod2FpdF90dWxpcChwQ3VySGNiKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisKKwlsZW4gPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbyk7CisJcEN1ckhjYi0+SENTX01zZ1swXSA9IGxlbjsKKwlmb3IgKGlkeCA9IDE7IGxlbiAhPSAwOyBsZW4tLSkgeworCisJCWlmICgodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSkgIT0gTVNHX0lOKQorCQkJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworCQlUVUxfV1JMT05HKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbnQwLCAxKTsKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX0lOKTsKKwkJaWYgKHdhaXRfdHVsaXAocEN1ckhjYikgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwkJcEN1ckhjYi0+SENTX01zZ1tpZHgrK10gPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TRmlmbyk7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzFdID09IDEpIHsJCS8qIGlmIGl0J3Mgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciByZXF1ZXN0ICovCisJCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzBdICE9IDMpCS8qIGlmIGxlbmd0aCBpcyBub3QgcmlnaHQgKi8KKwkJCXJldHVybiAodHVsX21zZ291dF9yZWplY3QocEN1ckhjYikpOworCQlpZiAocEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzICYgVENGX05PX1NZTkNfTkVHTykgewkvKiBTZXQgT0ZGU0VUPTAgdG8gZG8gYXN5bmMsIG5lZ28gYmFjayAqLworCQkJcEN1ckhjYi0+SENTX01zZ1szXSA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoKHR1bF9tc2dpbl9zeW5jKHBDdXJIY2IpID09IDApICYmCisJCQkgICAgKHBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19GbGFncyAmIFRDRl9TWU5DX0RPTkUpKSB7CisJCQkJdHVsX3N5bmNfZG9uZShwQ3VySGNiKTsKKwkJCQlyZXR1cm4gKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikpOworCQkJfQorCQl9CisKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NTaWduYWwsICgoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1NpZ25hbCkgJiAoVFNDX1NFVF9BQ0sgfCA3KSkgfCBUU0NfU0VUX0FUTikpOworCQlpZiAoKHR1bF9tc2dpbl9hY2NlcHQocEN1ckhjYikpICE9IE1TR19PVVQpCisJCQlyZXR1cm4gKHBDdXJIY2ItPkhDU19QaGFzZSk7CisJCS8qIHN5bmMgbXNnIG91dCAqLworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CisKKwkJdHVsX3N5bmNfZG9uZShwQ3VySGNiKTsKKworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19FWFRFTkQpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDMpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDEpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJIY2ItPkhDU19Nc2dbMl0pOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJIY2ItPkhDU19Nc2dbM10pOworCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCQlyZXR1cm4gKHdhaXRfdHVsaXAocEN1ckhjYikpOworCX0KKwlpZiAoKHBDdXJIY2ItPkhDU19Nc2dbMF0gIT0gMikgfHwgKHBDdXJIY2ItPkhDU19Nc2dbMV0gIT0gMykpCisJCXJldHVybiAodHVsX21zZ291dF9yZWplY3QocEN1ckhjYikpOworCS8qIGlmIGl0J3MgV0lERSBEQVRBIFhGRVIgUkVRICAgKi8KKwlpZiAocEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzICYgVENGX05PX1dEVFIpIHsKKwkJcEN1ckhjYi0+SENTX01zZ1syXSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHBDdXJIY2ItPkhDU19Nc2dbMl0gPiAyKQkvKiA+IDMyIGJpdHMgICAgICAgICAgICAqLworCQkJcmV0dXJuICh0dWxfbXNnb3V0X3JlamVjdChwQ3VySGNiKSk7CisJCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzJdID09IDIpIHsJCS8qID09IDMyICAgICAgICAgICAgICAgICovCisJCQlwQ3VySGNiLT5IQ1NfTXNnWzJdID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmICgocEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzICYgVENGX05PX1dEVFIpID09IDApIHsKKwkJCQl3ZHRyX2RvbmUocEN1ckhjYik7CisJCQkJaWYgKChwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfRmxhZ3MgJiAoVENGX1NZTkNfRE9ORSB8IFRDRl9OT19TWU5DX05FR08pKSA9PSAwKQorCQkJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSB8IFRTQ19TRVRfQVROKSk7CisJCQkJcmV0dXJuICh0dWxfbXNnaW5fYWNjZXB0KHBDdXJIY2IpKTsKKwkJCX0KKwkJfQorCX0KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1NpZ25hbCwgKChUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TU2lnbmFsKSAmIChUU0NfU0VUX0FDSyB8IDcpKSB8IFRTQ19TRVRfQVROKSk7CisKKwlpZiAodHVsX21zZ2luX2FjY2VwdChwQ3VySGNiKSAhPSBNU0dfT1VUKQorCQlyZXR1cm4gKHBDdXJIY2ItPkhDU19QaGFzZSk7CisJLyogV0RUUiBtc2cgb3V0ICAgICAgICAgICAgICAgICAqLworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgTVNHX0VYVEVORCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCAyKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIDMpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgcEN1ckhjYi0+SENTX01zZ1syXSk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19YRl9GSUZPX09VVCk7CisJcmV0dXJuICh3YWl0X3R1bGlwKHBDdXJIY2IpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnaW5fc3luYyhIQ1MgKiBwQ3VySGNiKQoreworCWNoYXIgZGVmYXVsdF9wZXJpb2Q7CisKKwlkZWZhdWx0X3BlcmlvZCA9IHR1bF9yYXRlX3RibFtwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfRmxhZ3MgJiBUQ0ZfU0NTSV9SQVRFXTsKKwlpZiAocEN1ckhjYi0+SENTX01zZ1szXSA+IE1BWF9PRkZTRVQpIHsKKwkJcEN1ckhjYi0+SENTX01zZ1szXSA9IE1BWF9PRkZTRVQ7CisJCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzJdIDwgZGVmYXVsdF9wZXJpb2QpIHsKKwkJCXBDdXJIY2ItPkhDU19Nc2dbMl0gPSBkZWZhdWx0X3BlcmlvZDsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzJdID49IDU5KSB7CS8qIENoYW5nZSB0byBhc3luYyAgICAgICAgICAgICAgKi8KKwkJCXBDdXJIY2ItPkhDU19Nc2dbM10gPSAwOworCQl9CisJCXJldHVybiAxOworCX0KKwkvKiBvZmZzZXQgcmVxdWVzdHMgYXN5bmNocm9ub3VzIHRyYW5zZmVycyA/ICovCisJaWYgKHBDdXJIY2ItPkhDU19Nc2dbM10gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19Nc2dbMl0gPCBkZWZhdWx0X3BlcmlvZCkgeworCQlwQ3VySGNiLT5IQ1NfTXNnWzJdID0gZGVmYXVsdF9wZXJpb2Q7CisJCXJldHVybiAxOworCX0KKwlpZiAocEN1ckhjYi0+SENTX01zZ1syXSA+PSA1OSkgeworCQlwQ3VySGNiLT5IQ1NfTXNnWzNdID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2R0cl9kb25lKEhDUyAqIHBDdXJIY2IpCit7CisJcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0ZsYWdzICY9IH5UQ0ZfU1lOQ19ET05FOworCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19GbGFncyB8PSBUQ0ZfV0RUUl9ET05FOworCisJcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0pTX1BlcmlvZCA9IDA7CisJaWYgKHBDdXJIY2ItPkhDU19Nc2dbMl0pIHsJLyogaWYgMTYgYml0ICovCisJCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QgfD0gVFNDX1dJREVfU0NTSTsKKwl9CisJcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX1NDb25maWcwICY9IH5UU0NfQUxUX1BFUklPRDsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NvbmZpZywgcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX1NDb25maWcwKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1BlcmlvZCwgcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0pTX1BlcmlvZCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfc3luY19kb25lKEhDUyAqIHBDdXJIY2IpCit7CisJaW50IGk7CisKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzLT5UQ1NfRmxhZ3MgfD0gVENGX1NZTkNfRE9ORTsKKworCWlmIChwQ3VySGNiLT5IQ1NfTXNnWzNdKSB7CisJCXBDdXJIY2ItPkhDU19BY3RUY3MtPlRDU19KU19QZXJpb2QgfD0gcEN1ckhjYi0+SENTX01zZ1szXTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJaWYgKHR1bF9yYXRlX3RibFtpXSA+PSBwQ3VySGNiLT5IQ1NfTXNnWzJdKQkvKiBwaWNrIHRoZSBiaWcgb25lICovCisJCQkJYnJlYWs7CisJCX0KKwkJcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0pTX1BlcmlvZCB8PSAoaSA8PCA0KTsKKwkJcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX1NDb25maWcwIHw9IFRTQ19BTFRfUEVSSU9EOworCX0KKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NvbmZpZywgcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX1NDb25maWcwKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU1BlcmlvZCwgcEN1ckhjYi0+SENTX0FjdFRjcy0+VENTX0pTX1BlcmlvZCk7CisKKwlyZXR1cm4gKC0xKTsKK30KKworCitpbnQgdHVsX3Bvc3Rfc2NzaV9yc3QoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2I7CisJVENTICpwQ3VyVGNiOworCWludCBpOworCisJcEN1ckhjYi0+SENTX0FjdFNjYiA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0FjdFRjcyA9IE5VTEw7CisJcEN1ckhjYi0+SENTX0ZsYWdzID0gMDsKKworCXdoaWxlICgocEN1clNjYiA9IHR1bF9wb3BfYnVzeV9zY2IocEN1ckhjYikpICE9IE5VTEwpIHsKKwkJcEN1clNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQkFEX1BIQVM7CisJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJfQorCS8qIGNsZWFyIHN5bmMgZG9uZSBmbGFnICAgICAgICAgKi8KKwlwQ3VyVGNiID0gJnBDdXJIY2ItPkhDU19UY3NbMF07CisJZm9yIChpID0gMDsgaSA8IHBDdXJIY2ItPkhDU19NYXhUYXI7IHBDdXJUY2IrKywgaSsrKSB7CisJCXBDdXJUY2ItPlRDU19GbGFncyAmPSB+KFRDRl9TWU5DX0RPTkUgfCBUQ0ZfV0RUUl9ET05FKTsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgc3luYy4geGZlciByZWdpc3RlciB2YWx1ZXMgdG8gYW4gYXN5biB4ZmVyICovCisJCXBDdXJUY2ItPlRDU19KU19QZXJpb2QgPSAwOworCQlwQ3VyVGNiLT5UQ1NfU0NvbmZpZzAgPSBwQ3VySGNiLT5IQ1NfU0NvbmYxOworCQlwQ3VySGNiLT5IQ1NfQWN0VGFnc1swXSA9IDA7CS8qIDA3LzIyLzk4ICovCisJCXBDdXJIY2ItPkhDU19UY3NbaV0uVENTX0ZsYWdzICY9IH5UQ0ZfQlVTWTsJLyogMDcvMjIvOTggKi8KKwl9CQkJLyogZm9yICovCisKKwlyZXR1cm4gKC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlbGVjdF9hdG5fc3RvcChIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKQoreworCXBDdXJTY2ItPlNDQl9TdGF0dXMgfD0gU0NCX1NFTEVDVDsKKwlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDB4MTsKKwlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gcEN1clNjYjsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gJnBDdXJIY2ItPkhDU19UY3NbcEN1clNjYi0+U0NCX1RhcmdldF07CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19TRUxBVE5TVE9QKTsKKwlyZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlbGVjdF9hdG4oSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYikKK3sKKwlpbnQgaTsKKworCXBDdXJTY2ItPlNDQl9TdGF0dXMgfD0gU0NCX1NFTEVDVDsKKwlwQ3VyU2NiLT5TQ0JfTnh0U3RhdCA9IDB4MjsKKworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TRmlmbywgcEN1clNjYi0+U0NCX0lkZW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgKGludCkgcEN1clNjYi0+U0NCX0NEQkxlbjsgaSsrKQorCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9DREJbaV0pOworCXBDdXJIY2ItPkhDU19BY3RUY3MgPSAmcEN1ckhjYi0+SENTX1Rjc1twQ3VyU2NiLT5TQ0JfVGFyZ2V0XTsKKwlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gcEN1clNjYjsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0NtZCwgVFNDX1NFTF9BVE4pOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHVsX3NlbGVjdF9hdG4zKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCit7CisJaW50IGk7CisKKwlwQ3VyU2NiLT5TQ0JfU3RhdHVzIHw9IFNDQl9TRUxFQ1Q7CisJcEN1clNjYi0+U0NCX054dFN0YXQgPSAweDI7CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9JZGVudCk7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfVGFnTXNnKTsKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIHBDdXJTY2ItPlNDQl9UYWdJZCk7CisJZm9yIChpID0gMDsgaSA8IChpbnQpIHBDdXJTY2ItPlNDQl9DREJMZW47IGkrKykKKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NGaWZvLCBwQ3VyU2NiLT5TQ0JfQ0RCW2ldKTsKKwlwQ3VySGNiLT5IQ1NfQWN0VGNzID0gJnBDdXJIY2ItPkhDU19UY3NbcEN1clNjYi0+U0NCX1RhcmdldF07CisJcEN1ckhjYi0+SENTX0FjdFNjYiA9IHBDdXJTY2I7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19TRUxfQVROMyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0NTSSBCdXMgRGV2aWNlIFJlc2V0ICovCitpbnQgdHVsX2J1c19kZXZpY2VfcmVzZXQoSENTICogcEN1ckhjYikKK3sKKwlTQ0IgKnBDdXJTY2IgPSBwQ3VySGNiLT5IQ1NfQWN0U2NiOworCVRDUyAqcEN1clRjYiA9IHBDdXJIY2ItPkhDU19BY3RUY3M7CisJU0NCICpwVG1wU2NiLCAqcFByZXZTY2I7CisJQllURSB0YXI7CisKKwlpZiAocEN1ckhjYi0+SENTX1BoYXNlICE9IE1TR19PVVQpIHsKKwkJcmV0dXJuIChpbnRfdHVsX2JhZF9zZXEocEN1ckhjYikpOwkvKiBVbmV4cGVjdGVkIHBoYXNlICAgICAgICAgICAgICovCisJfQorCXR1bF91bmxpbmtfcGVuZF9zY2IocEN1ckhjYiwgcEN1clNjYik7CisJdHVsX3JlbGVhc2Vfc2NiKHBDdXJIY2IsIHBDdXJTY2IpOworCisKKwl0YXIgPSBwQ3VyU2NiLT5TQ0JfVGFyZ2V0OwkvKiB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICovCisJcEN1clRjYi0+VENTX0ZsYWdzICY9IH4oVENGX1NZTkNfRE9ORSB8IFRDRl9XRFRSX0RPTkUgfCBUQ0ZfQlVTWSk7CisJLyogY2xyIHN5bmMuIG5lZ28gJiBXRFRSIGZsYWdzICAwNy8yMi85OCAqLworCisJLyogYWJvcnQgYWxsIFNDQiB3aXRoIHNhbWUgdGFyZ2V0ICovCisJcFByZXZTY2IgPSBwVG1wU2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeTsJLyogQ2hlY2sgQnVzeSBxdWV1ZSAqLworCXdoaWxlIChwVG1wU2NiICE9IE5VTEwpIHsKKworCQlpZiAocFRtcFNjYi0+U0NCX1RhcmdldCA9PSB0YXIpIHsKKwkJCS8qIHVubGluayBpdCAqLworCQkJaWYgKHBUbXBTY2IgPT0gcEN1ckhjYi0+SENTX0ZpcnN0QnVzeSkgeworCQkJCWlmICgocEN1ckhjYi0+SENTX0ZpcnN0QnVzeSA9IHBUbXBTY2ItPlNDQl9OeHRTY2IpID09IE5VTEwpCisJCQkJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXBQcmV2U2NiLT5TQ0JfTnh0U2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwkJCQlpZiAocFRtcFNjYiA9PSBwQ3VySGNiLT5IQ1NfTGFzdEJ1c3kpCisJCQkJCXBDdXJIY2ItPkhDU19MYXN0QnVzeSA9IHBQcmV2U2NiOworCQkJfQorCQkJcFRtcFNjYi0+U0NCX0hhU3RhdCA9IEhPU1RfQUJPUlRFRDsKKwkJCXR1bF9hcHBlbmRfZG9uZV9zY2IocEN1ckhjYiwgcFRtcFNjYik7CisJCX0KKwkJLyogUHJldmlvdXMgaGF2ZW4ndCBjaGFuZ2UgICAgICAqLworCQllbHNlIHsKKwkJCXBQcmV2U2NiID0gcFRtcFNjYjsKKwkJfQorCQlwVG1wU2NiID0gcFRtcFNjYi0+U0NCX054dFNjYjsKKwl9CisKKwlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0ZpZm8sIE1TR19ERVZSU1QpOworCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ21kLCBUU0NfWEZfRklGT19PVVQpOworCisJcmV0dXJuIHR1bF93YWl0X2Rpc2MocEN1ckhjYik7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0dWxfbXNnaW5fYWNjZXB0KEhDUyAqIHBDdXJIY2IpCit7CisJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDbWQsIFRTQ19NU0dfQUNDRVBUKTsKKwlyZXR1cm4gKHdhaXRfdHVsaXAocEN1ckhjYikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdhaXRfdHVsaXAoSENTICogcEN1ckhjYikKK3sKKworCXdoaWxlICghKChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czApKQorCQkgJiBUU1NfSU5UX1BFTkRJTkcpKTsKKworCXBDdXJIY2ItPkhDU19KU0ludCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NJbnQpOworCXBDdXJIY2ItPkhDU19QaGFzZSA9IHBDdXJIY2ItPkhDU19KU1N0YXR1czAgJiBUU1NfUEhfTUFTSzsKKwlwQ3VySGNiLT5IQ1NfSlNTdGF0dXMxID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czEpOworCisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19SRVNFTF9JTlQpIHsJLyogaWYgU0NTSSBidXMgcmVzZXQgZGV0ZWN0ZWQgICAqLworCQlyZXR1cm4gKGludF90dWxfcmVzZWwocEN1ckhjYikpOworCX0KKwlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX1NFTF9USU1FT1VUKSB7CS8qIGlmIHNlbGVjdGVkL3Jlc2VsZWN0ZWQgdGltZW91dCBpbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIChpbnRfdHVsX2J1c2ZyZWUocEN1ckhjYikpOworCX0KKwlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX1NDU0lSU1RfSU5UKSB7CS8qIGlmIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkICAgKi8KKwkJcmV0dXJuIChpbnRfdHVsX3Njc2lfcnN0KHBDdXJIY2IpKTsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19ESVNDX0lOVCkgewkvKiBCVVMgZGlzY29ubmVjdGlvbiAgICAgICAgICAgICovCisJCWlmIChwQ3VySGNiLT5IQ1NfRmxhZ3MgJiBIQ0ZfRVhQRUNUX0RPTkVfRElTQykgeworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX0ZMVVNIX0ZJRk8pOwkJLyogRmx1c2ggU0NTSSBGSUZPICAqLworCQkJdHVsX3VubGlua19idXN5X3NjYihwQ3VySGNiLCBwQ3VySGNiLT5IQ1NfQWN0U2NiKTsKKwkJCXBDdXJIY2ItPkhDU19BY3RTY2ItPlNDQl9IYVN0YXQgPSAwOworCQkJdHVsX2FwcGVuZF9kb25lX3NjYihwQ3VySGNiLCBwQ3VySGNiLT5IQ1NfQWN0U2NiKTsKKwkJCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBOVUxMOworCQkJcEN1ckhjYi0+SENTX0FjdFRjcyA9IE5VTEw7CisJCQlwQ3VySGNiLT5IQ1NfRmxhZ3MgJj0gfkhDRl9FWFBFQ1RfRE9ORV9ESVNDOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIFRTQ19JTklUREVGQVVMVCk7CisJCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwxLCBUU0NfSFdfUkVTRUxFQ1QpOwkvKiBFbmFibGUgSFcgcmVzZWxlY3QgICAgICAgKi8KKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChwQ3VySGNiLT5IQ1NfRmxhZ3MgJiBIQ0ZfRVhQRUNUX0RJU0MpIHsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsJCS8qIEZsdXNoIFNDU0kgRklGTyAgKi8KKwkJCXBDdXJIY2ItPkhDU19BY3RTY2IgPSBOVUxMOworCQkJcEN1ckhjYi0+SENTX0FjdFRjcyA9IE5VTEw7CisJCQlwQ3VySGNiLT5IQ1NfRmxhZ3MgJj0gfkhDRl9FWFBFQ1RfRElTQzsKKwkJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBUU0NfSU5JVERFRkFVTFQpOworCQkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMSwgVFNDX0hXX1JFU0VMRUNUKTsJLyogRW5hYmxlIEhXIHJlc2VsZWN0ICAgICAgICovCisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlyZXR1cm4gKGludF90dWxfYnVzZnJlZShwQ3VySGNiKSk7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiAoVFNTX0ZVTkNfQ09NUCB8IFRTU19CVVNfU0VSVikpIHsKKwkJcmV0dXJuIChwQ3VySGNiLT5IQ1NfUGhhc2UpOworCX0KKwlyZXR1cm4gKHBDdXJIY2ItPkhDU19QaGFzZSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF93YWl0X2Rpc2MoSENTICogcEN1ckhjYikKK3sKKworCXdoaWxlICghKChwQ3VySGNiLT5IQ1NfSlNTdGF0dXMwID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU1N0YXR1czApKQorCQkgJiBUU1NfSU5UX1BFTkRJTkcpKTsKKworCisJcEN1ckhjYi0+SENTX0pTSW50ID0gVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfU0ludCk7CisKKwlpZiAocEN1ckhjYi0+SENTX0pTSW50ICYgVFNTX1NDU0lSU1RfSU5UKSB7CS8qIGlmIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkICAgKi8KKwkJcmV0dXJuIChpbnRfdHVsX3Njc2lfcnN0KHBDdXJIY2IpKTsKKwl9CisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19ESVNDX0lOVCkgewkvKiBCVVMgZGlzY29ubmVjdGlvbiAgICAgICAgICAgICovCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDAsIFRTQ19GTFVTSF9GSUZPKTsJCS8qIEZsdXNoIFNDU0kgRklGTyAgKi8KKwkJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDb25maWcsIFRTQ19JTklUREVGQVVMVCk7CisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ3RybDEsIFRTQ19IV19SRVNFTEVDVCk7CS8qIEVuYWJsZSBIVyByZXNlbGVjdCAgICAgICAqLworCQlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gTlVMTDsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHR1bF93YWl0X2RvbmVfZGlzYyhIQ1MgKiBwQ3VySGNiKQoreworCisKKwl3aGlsZSAoISgocEN1ckhjYi0+SENTX0pTU3RhdHVzMCA9IFRVTF9SRChwQ3VySGNiLT5IQ1NfQmFzZSwgVFVMX1NTdGF0dXMwKSkKKwkJICYgVFNTX0lOVF9QRU5ESU5HKSk7CisKKwlwQ3VySGNiLT5IQ1NfSlNJbnQgPSBUVUxfUkQocEN1ckhjYi0+SENTX0Jhc2UsIFRVTF9TSW50KTsKKworCisJaWYgKHBDdXJIY2ItPkhDU19KU0ludCAmIFRTU19TQ1NJUlNUX0lOVCkgewkvKiBpZiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAgICovCisJCXJldHVybiAoaW50X3R1bF9zY3NpX3JzdChwQ3VySGNiKSk7CisJfQorCWlmIChwQ3VySGNiLT5IQ1NfSlNJbnQgJiBUU1NfRElTQ19JTlQpIHsJLyogQlVTIGRpc2Nvbm5lY3Rpb24gICAgICAgICAgICAqLworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwwLCBUU0NfRkxVU0hfRklGTyk7CQkvKiBGbHVzaCBTQ1NJIEZJRk8gICovCisJCVRVTF9XUihwQ3VySGNiLT5IQ1NfQmFzZSArIFRVTF9TQ29uZmlnLCBUU0NfSU5JVERFRkFVTFQpOworCQlUVUxfV1IocEN1ckhjYi0+SENTX0Jhc2UgKyBUVUxfU0N0cmwxLCBUU0NfSFdfUkVTRUxFQ1QpOwkvKiBFbmFibGUgSFcgcmVzZWxlY3QgICAgICAgKi8KKwkJdHVsX3VubGlua19idXN5X3NjYihwQ3VySGNiLCBwQ3VySGNiLT5IQ1NfQWN0U2NiKTsKKworCQl0dWxfYXBwZW5kX2RvbmVfc2NiKHBDdXJIY2IsIHBDdXJIY2ItPkhDU19BY3RTY2IpOworCQlwQ3VySGNiLT5IQ1NfQWN0U2NiID0gTlVMTDsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAodHVsX2JhZF9zZXEocEN1ckhjYikpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaTkxdV9pbnRyKGludCBpcnFubywgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpkZXYgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXR1bF9pc3IoKEhDUyAqKWRldi0+YmFzZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0dWxfTmV3UmV0dXJuTnVtYmVyT2ZBZGFwdGVycyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwRGV2ID0gTlVMTDsJLyogU3RhcnQgZnJvbSBub25lICAgICAgICAgICAgICAqLworCWludCBpQWRhcHRlcnMgPSAwOworCWxvbmcgZFJlZ1ZhbHVlOworCVdPUkQgd0JJT1M7CisJaW50IGkgPSAwOworCisJaW5pdF9pOTF1QWRhcHRlcl90YWJsZSgpOworCisJZm9yIChpID0gMDsgaSA8IFRVTFNaKGk5MXVfcGNpX2RldmljZXMpOyBpKyspCisJeworCQl3aGlsZSAoKHBEZXYgPSBwY2lfZmluZF9kZXZpY2UoaTkxdV9wY2lfZGV2aWNlc1tpXS52ZW5kb3JfaWQsIGk5MXVfcGNpX2RldmljZXNbaV0uZGV2aWNlX2lkLCBwRGV2KSkgIT0gTlVMTCkgeworCQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBEZXYpKQorCQkJCWNvbnRpbnVlOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBEZXYsIDB4NDQsICh1MzIgKikgJiBkUmVnVmFsdWUpOworCQkJd0JJT1MgPSAoVVdPUkQpIChkUmVnVmFsdWUgJiAweEZGKTsKKwkJCWlmICgoKGRSZWdWYWx1ZSAmIDB4RkYwMCkgPj4gOCkgPT0gMHhGRikKKwkJCQlkUmVnVmFsdWUgPSAwOworCQkJd0JJT1MgPSAod0JJT1MgPDwgOCkgKyAoKFVXT1JEKSAoKGRSZWdWYWx1ZSAmIDB4RkYwMCkgPj4gOCkpOworCQkJaWYgKHBjaV9zZXRfZG1hX21hc2socERldiwgMHhmZmZmZmZmZikpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCSAgICAgICAiaTkxdTogQ291bGQgbm90IHNldCAzMiBiaXQgRE1BIG1hc2tcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoQWRkaTkxdV9pbnRvX0FkYXB0ZXJfdGFibGUod0JJT1MsCisJCQkJCQkJKHBEZXYtPnJlc291cmNlWzBdLnN0YXJ0KSwKKwkJCQkJCSAgICAgICAJcERldi0+aXJxLAorCQkJCQkJICAgICAgIAlwRGV2LT5idXMtPm51bWJlciwKKwkJCQkJICAgICAgIAkJKHBEZXYtPmRldmZuID4+IDMpCisJCSAgICAJCSkgPT0gMCkKKwkJCQlpQWRhcHRlcnMrKzsKKwkJfQorCX0KKworCXJldHVybiAoaUFkYXB0ZXJzKTsKK30KKworc3RhdGljIGludCBpOTF1X2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKK3sKKwlIQ1MgKnBIQ0I7CisJc3RydWN0IFNjc2lfSG9zdCAqaHJlZzsKKwl1bnNpZ25lZCBsb25nIGk7CS8qIDAxLzE0Lzk4ICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgb2sgPSAwLCBpQWRhcHRlcnM7CisJVUxPTkcgZEJpb3NBZHI7CisJQllURSAqcGJCaW9zQWRyOworCisJLyogR2V0IHRvdGFsIG51bWJlciBvZiBhZGFwdGVycyBpbiB0aGUgbW90aGVyYm9hcmQgKi8KKwlpQWRhcHRlcnMgPSB0dWxfTmV3UmV0dXJuTnVtYmVyT2ZBZGFwdGVycygpOworCWlmIChpQWRhcHRlcnMgPT0gMCkJLyogSWYgbm8gdHVsaXAgZm91bmRlZCwgcmV0dXJuICovCisJCXJldHVybiAoMCk7CisKKwl0dWxfbnVtX2NoID0gKGlBZGFwdGVycyA+IHR1bF9udW1fY2gpID8gdHVsX251bV9jaCA6IGlBZGFwdGVyczsKKwkvKiBVcGRhdGUgYWN0dWFsbHkgY2hhbm5lbCBudW1iZXIgKi8KKwlpZiAodHVsX3RhZ19lbmFibGUpIHsJLyogMS4wMWkgICAgICAgICAgICAgICAgICAqLworCQl0dWxfbnVtX3NjYiA9IE1BWF9UQVJHRVRTICogaTkxdV9NQVhRVUVVRTsKKwl9IGVsc2UgeworCQl0dWxfbnVtX3NjYiA9IE1BWF9UQVJHRVRTICsgMzsJLyogMS10YXBlLCAxLUNEX1JPTSwgMS0gZXh0cmEgKi8KKwl9CQkJLyogVXBkYXRlIGFjdHVhbGx5IFNDQnMgcGVyIGFkYXB0ZXIgKi8KKworCS8qIEdldCB0b3RhbCBtZW1vcnkgbmVlZGVkIGZvciBIQ1MgKi8KKwlpID0gdHVsX251bV9jaCAqIHNpemVvZihIQ1MpOworCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSAmdHVsX2hjc1swXSwgMCwgaSk7CS8qIEluaXRpYWxpemUgdHVsX2hjcyAwICovCisJLyogR2V0IHRvdGFsIG1lbW9yeSBuZWVkZWQgZm9yIFNDQiAqLworCisJZm9yICg7IHR1bF9udW1fc2NiID49IE1BWF9UQVJHRVRTICsgMzsgdHVsX251bV9zY2ItLSkgeworCQlpID0gdHVsX251bV9jaCAqIHR1bF9udW1fc2NiICogc2l6ZW9mKFNDQik7CisJCWlmICgodHVsX3NjYiA9IChTQ0IgKikga21hbGxvYyhpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSkpICE9IE5VTEwpCisJCQlicmVhazsKKwl9CisJaWYgKHR1bF9zY2IgPT0gTlVMTCkgeworCQlwcmludGsoImk5MXU6IFNDQiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybiAoMCk7CisJfQorCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSB0dWxfc2NiLCAwLCBpKTsKKworCWZvciAoaSA9IDAsIHBIQ0IgPSAmdHVsX2hjc1swXTsJCS8qIEdldCBwb2ludGVyIGZvciBjb250cm9sIGJsb2NrICovCisJICAgICBpIDwgdHVsX251bV9jaDsKKwkgICAgIGkrKywgcEhDQisrKSB7CisJCWdldF90dWxpcFBDSUNvbmZpZyhwSENCLCBpKTsKKworCQlkQmlvc0FkciA9IHBIQ0ItPkhDU19CSU9TOworCQlkQmlvc0FkciA9IChkQmlvc0FkciA8PCA0KTsKKworCQlwYkJpb3NBZHIgPSBwaHlzX3RvX3ZpcnQoZEJpb3NBZHIpOworCisJCWluaXRfdHVsaXAocEhDQiwgdHVsX3NjYiArIChpICogdHVsX251bV9zY2IpLCB0dWxfbnVtX3NjYiwgcGJCaW9zQWRyLCAxMCk7CisJCXJlcXVlc3RfcmVnaW9uKHBIQ0ItPkhDU19CYXNlLCAyNTYsICJpOTF1Iik7IC8qIFJlZ2lzdGVyICovIAorCisJCXBIQ0ItPkhDU19JbmRleCA9IGk7CS8qIDcvMjkvOTggKi8KKwkJaHJlZyA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKEhDUykpOworCQlpZihocmVnID09IE5VTEwpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKHBIQ0ItPkhDU19CYXNlLCAyNTYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaHJlZy0+aW9fcG9ydCA9IHBIQ0ItPkhDU19CYXNlOworCQlocmVnLT5uX2lvX3BvcnQgPSAweGZmOworCQlocmVnLT5jYW5fcXVldWUgPSB0dWxfbnVtX3NjYjsJLyogMDMvMDUvOTggICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaHJlZy0+dW5pcXVlX2lkID0gcEhDQi0+SENTX0Jhc2U7CisJCWhyZWctPm1heF9pZCA9IHBIQ0ItPkhDU19NYXhUYXI7CisJCWhyZWctPm1heF9sdW4gPSAzMjsJLyogMTAvMjEvOTcgICAgICAgICAgICAgICAgICAgICAqLworCQlocmVnLT5pcnEgPSBwSENCLT5IQ1NfSW50cjsKKwkJaHJlZy0+dGhpc19pZCA9IHBIQ0ItPkhDU19TQ1NJX0lEOwkvKiBBc3NpZ24gSENTIGluZGV4ICAgICAgICAgICAqLworCQlocmVnLT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpcEhDQjsKKwkJaHJlZy0+c2dfdGFibGVzaXplID0gVE9UQUxfU0dfRU5UUlk7CS8qIE1heGltdW4gc3VwcG9ydCBpcyAzMiAqLworCisJCS8qIEluaXRpYWwgdHVsaXAgY2hpcCAgICAgICAgICAgKi8KKwkJb2sgPSByZXF1ZXN0X2lycShwSENCLT5IQ1NfSW50ciwgaTkxdV9pbnRyLCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwgImk5MXUiLCBocmVnKTsKKwkJaWYgKG9rIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTkxdTogdW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkXG5cbiIsIHBIQ0ItPkhDU19JbnRyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdHBudC0+dGhpc19pZCA9IC0xOworCXRwbnQtPmNhbl9xdWV1ZSA9IDE7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaTkxdUJ1aWxkU0NCKEhDUyAqIHBIQ0IsIFNDQiAqIHBTQ0IsIHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sJCQkJLyogQ3JlYXRlIGNvcnJlc3BvbmRpbmcgU0NCICAgICAqLworCXN0cnVjdCBzY2F0dGVybGlzdCAqcFNyYlNHOworCVNHICpwU0c7CQkvKiBQb2ludGVyIHRvIFNHIGxpc3QgICAgICAgICAgICovCisJaW50IGk7CisJbG9uZyBUb3RhbExlbjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJcFNDQi0+U0NCX1Bvc3QgPSBpOTF1U0NCUG9zdDsJLyogaTkxdSdzIGNhbGxiYWNrIHJvdXRpbmUgICAgICAqLworCXBTQ0ItPlNDQl9TcmIgPSBTQ3BudDsKKwlwU0NCLT5TQ0JfT3Bjb2RlID0gRXhlY1NDU0k7CisJcFNDQi0+U0NCX0ZsYWdzID0gU0NGX1BPU1Q7CS8qIEFmdGVyIFNDU0kgZG9uZSwgY2FsbCBwb3N0IHJvdXRpbmUgKi8KKwlwU0NCLT5TQ0JfVGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJcFNDQi0+U0NCX0x1biA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwlwU0NCLT5TQ0JfSWRlbnQgPSBTQ3BudC0+ZGV2aWNlLT5sdW4gfCBESVNDX0FMTE9XOworCisJcFNDQi0+U0NCX0ZsYWdzIHw9IFNDRl9TRU5TRTsJLyogVHVybiBvbiBhdXRvIHJlcXVlc3Qgc2Vuc2UgICAqLworCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJnBIQ0ItPnBjaV9kZXYtPmRldiwgU0NwbnQtPnNlbnNlX2J1ZmZlciwKKwkJCQkgIFNFTlNFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJcFNDQi0+U0NCX1NlbnNlUHRyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFfYWRkcik7CisJcFNDQi0+U0NCX1NlbnNlTGVuID0gY3B1X3RvX2xlMzIoU0VOU0VfU0laRSk7CisJU0NwbnQtPlNDcC5wdHIgPSAoY2hhciAqKSh1bnNpZ25lZCBsb25nKWRtYV9hZGRyOworCisJcFNDQi0+U0NCX0NEQkxlbiA9IFNDcG50LT5jbWRfbGVuOworCXBTQ0ItPlNDQl9IYVN0YXQgPSAwOworCXBTQ0ItPlNDQl9UYVN0YXQgPSAwOworCW1lbWNweSgmcFNDQi0+U0NCX0NEQlswXSwgJlNDcG50LT5jbW5kLCBTQ3BudC0+Y21kX2xlbik7CisKKwlpZiAoU0NwbnQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgewkvKiBUYWcgU3VwcG9ydCAgICAgICAgICAgICAgICAgICovCisJCXBTQ0ItPlNDQl9UYWdNc2cgPSBTSU1QTEVfUVVFVUVfVEFHOwkvKiBEbyBzaW1wbGUgdGFnIG9ubHkgICAqLworCX0gZWxzZSB7CisJCXBTQ0ItPlNDQl9UYWdNc2cgPSAwOwkvKiBObyB0YWcgc3VwcG9ydCAgICAgICAgICAgICAgICovCisJfQorCS8qIHRvZG8gaGFuZGxlIG1hcF9zZyBlcnJvciAqLworCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJnBIQ0ItPnBjaV9kZXYtPmRldiwgJnBTQ0ItPlNDQl9TR0xpc3RbMF0sCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBTR19TdHJ1YykgKiBUT1RBTF9TR19FTlRSWSwKKwkJCQkJICBETUFfQklESVJFQ1RJT05BTCk7CisJCXBTQ0ItPlNDQl9CdWZQdHIgPSBjcHVfdG9fbGUzMigodTMyKWRtYV9hZGRyKTsKKwkJU0NwbnQtPlNDcC5kbWFfaGFuZGxlID0gZG1hX2FkZHI7CisKKwkJcFNyYlNHID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCXBTQ0ItPlNDQl9TR0xlbiA9IGRtYV9tYXBfc2coJnBIQ0ItPnBjaV9kZXYtPmRldiwgcFNyYlNHLAorCQkJCQkgICAgIFNDcG50LT51c2Vfc2csIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJcFNDQi0+U0NCX0ZsYWdzIHw9IFNDRl9TRzsJLyogVHVybiBvbiBTRyBsaXN0IGZsYWcgICAgICAgKi8KKwkJZm9yIChpID0gMCwgVG90YWxMZW4gPSAwLCBwU0cgPSAmcFNDQi0+U0NCX1NHTGlzdFswXTsJLyogMS4wMWcgKi8KKwkJICAgICBpIDwgcFNDQi0+U0NCX1NHTGVuOyBpKyssIHBTRysrLCBwU3JiU0crKykgeworCQkJcFNHLT5TR19QdHIgPSBjcHVfdG9fbGUzMigodTMyKXNnX2RtYV9hZGRyZXNzKHBTcmJTRykpOworCQkJVG90YWxMZW4gKz0gcFNHLT5TR19MZW4gPSBjcHVfdG9fbGUzMigodTMyKXNnX2RtYV9sZW4ocFNyYlNHKSk7CisJCX0KKworCQlwU0NCLT5TQ0JfQnVmTGVuID0gKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPiBUb3RhbExlbikgPworCQkgICAgVG90YWxMZW4gOiBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCX0gZWxzZSBpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbikgewkJLyogTm9uIFNHICovCisJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJnBIQ0ItPnBjaV9kZXYtPmRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCSAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJU0NwbnQtPlNDcC5kbWFfaGFuZGxlID0gZG1hX2FkZHI7CisJCXBTQ0ItPlNDQl9CdWZQdHIgPSBjcHVfdG9fbGUzMigodTMyKWRtYV9hZGRyKTsKKwkJcFNDQi0+U0NCX0J1ZkxlbiA9IGNwdV90b19sZTMyKCh1MzIpU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisJCXBTQ0ItPlNDQl9TR0xlbiA9IDA7CisJfSBlbHNlIHsKKwkJcFNDQi0+U0NCX0J1ZkxlbiA9IDA7CisJCXBTQ0ItPlNDQl9TR0xlbiA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGk5MXVfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJSENTICpwSENCID0gKEhDUyAqKSBjbWQtPmRldmljZS0+aG9zdC0+YmFzZTsKKwlyZWdpc3RlciBTQ0IgKnBTQ0I7CisKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisKKwlwU0NCID0gdHVsX2FsbG9jX3NjYihwSENCKTsKKwlpZiAoIXBTQ0IpCisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCisJaTkxdUJ1aWxkU0NCKHBIQ0IsIHBTQ0IsIGNtZCk7CisJdHVsX2V4ZWNfc2NiKHBIQ0IsIHBTQ0IpOworCXJldHVybiAwOworfQorCisjaWYgMCAvKiBubyBuZXcgRUggeWV0ICovCisvKgorICogIEFib3J0IGEgcXVldWVkIGNvbW1hbmQKKyAqICAoY29tbWFuZHMgdGhhdCBhcmUgb24gdGhlIGJ1cyBjYW4ndCBiZSBhYm9ydGVkIGVhc2lseSkKKyAqLworc3RhdGljIGludCBpOTF1X2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlIQ1MgKnBIQ0I7CisKKwlwSENCID0gKEhDUyAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5iYXNlOworCXJldHVybiB0dWxfYWJvcnRfc3JiKHBIQ0IsIFNDcG50KTsKK30KKworLyoKKyAqICBSZXNldCByZWdpc3RlcnMsIHJlc2V0IGEgaGFuZ2luZyBidXMgYW5kCisgKiAga2lsbCBhY3RpdmUgYW5kIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBmb3IgdGFyZ2V0IHcvbyBzb2Z0IHJlc2V0CisgKi8KK3N0YXRpYyBpbnQgaTkxdV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIHVuc2lnbmVkIGludCByZXNldF9mbGFncykKK3sJCQkJLyogSSBuZWVkIEhvc3QgQ29udHJvbCBCbG9jayBJbmZvcm1hdGlvbiAqLworCUhDUyAqcEhDQjsKKworCXBIQ0IgPSAoSENTICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmJhc2U7CisKKwlpZiAocmVzZXRfZmxhZ3MgJiAoU0NTSV9SRVNFVF9TVUdHRVNUX0JVU19SRVNFVCB8IFNDU0lfUkVTRVRfU1VHR0VTVF9IT1NUX1JFU0VUKSkKKwkJcmV0dXJuIHR1bF9yZXNldF9zY3NpX2J1cyhwSENCKTsKKwllbHNlCisJCXJldHVybiB0dWxfZGV2aWNlX3Jlc2V0KHBIQ0IsIFNDcG50LCBTQ3BudC0+ZGV2aWNlLT5pZCwgcmVzZXRfZmxhZ3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaTkxdV9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCUhDUyAqcEhDQjsKKworCXBIQ0IgPSAoSENTICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmJhc2U7CisJdHVsX3Jlc2V0X3Njc2kocEhDQiwgMCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlICJsb2dpY2FsIGdlb21ldHJ5IgorICovCitzdGF0aWMgaW50IGk5MXVfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppbmZvX2FycmF5KQoreworCUhDUyAqcEhjYjsJCS8qIFBvaW50IHRvIEhvc3QgYWRhcHRlciBjb250cm9sIGJsb2NrICovCisJVENTICpwVGNiOworCisJcEhjYiA9IChIQ1MgKikgc2Rldi0+aG9zdC0+YmFzZTsKKwlwVGNiID0gJnBIY2ItPkhDU19UY3Nbc2Rldi0+aWRdOworCisJaWYgKHBUY2ItPlRDU19EcnZIZWFkKSB7CisJCWluZm9fYXJyYXlbMF0gPSBwVGNiLT5UQ1NfRHJ2SGVhZDsKKwkJaW5mb19hcnJheVsxXSA9IHBUY2ItPlRDU19EcnZTZWN0b3I7CisJCWluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIHBUY2ItPlRDU19EcnZIZWFkIC8gcFRjYi0+VENTX0RydlNlY3RvcjsKKwl9IGVsc2UgeworCQlpZiAocFRjYi0+VENTX0RydkZsYWdzICYgVENGX0RSVl8yNTVfNjMpIHsKKwkJCWluZm9fYXJyYXlbMF0gPSAyNTU7CisJCQlpbmZvX2FycmF5WzFdID0gNjM7CisJCQlpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAyNTUgLyA2MzsKKwkJfSBlbHNlIHsKKwkJCWluZm9fYXJyYXlbMF0gPSA2NDsKKwkJCWluZm9fYXJyYXlbMV0gPSAzMjsKKwkJCWluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSA+PiAxMTsKKwkJfQorCX0KKworI2lmIGRlZmluZWQoREVCVUdfQklPU1BBUkFNKQorCWlmIChpOTF1X2RlYnVnICYgZGVidWdfYmlvc3BhcmFtKSB7CisJCXByaW50aygiYmlvcyBnZW9tZXRyeTogaGVhZD0lZCwgc2VjPSVkLCBjeWw9JWRcbiIsCisJCSAgICAgICBpbmZvX2FycmF5WzBdLCBpbmZvX2FycmF5WzFdLCBpbmZvX2FycmF5WzJdKTsKKwkJcHJpbnRrKCJXQVJOSU5HOiBjaGVjaywgaWYgdGhlIGJpb3MgZ2VvbWV0cnkgaXMgY29ycmVjdC5cbiIpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGk5MXVfdW5tYXBfY21uZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IHNjc2lfY21uZCAqY21uZCkKK3sKKwkvKiBhdXRvIHNlbnNlIGJ1ZmZlciAqLworCWlmIChjbW5kLT5TQ3AucHRyKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoJnBjaV9kZXYtPmRldiwKKwkJCQkgKGRtYV9hZGRyX3QpKCh1bnNpZ25lZCBsb25nKWNtbmQtPlNDcC5wdHIpLAorCQkJCSBTRU5TRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQljbW5kLT5TQ3AucHRyID0gTlVMTDsKKwl9CisKKwkvKiByZXF1ZXN0IGJ1ZmZlciAqLworCWlmIChjbW5kLT51c2Vfc2cpIHsKKwkJZG1hX3VubWFwX3NpbmdsZSgmcGNpX2Rldi0+ZGV2LCBjbW5kLT5TQ3AuZG1hX2hhbmRsZSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBTR19TdHJ1YykgKiBUT1RBTF9TR19FTlRSWSwKKwkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCisJCWRtYV91bm1hcF9zZygmcGNpX2Rldi0+ZGV2LCBjbW5kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgY21uZC0+dXNlX3NnLAorCQkJICAgICBjbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfSBlbHNlIGlmIChjbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJZG1hX3VubWFwX3NpbmdsZSgmcGNpX2Rldi0+ZGV2LCBjbW5kLT5TQ3AuZG1hX2hhbmRsZSwKKwkJCQkgY21uZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBjbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbiBuYW1lICA6IGk5MXVTQ0JQb3N0CisgRGVzY3JpcHRpb24gICAgOiBUaGlzIGlzIGNhbGxiYWNrIHJvdXRpbmUgYmUgY2FsbGVkIHdoZW4gdHVsaXAgZmluaXNoIG9uZQorCQkJU0NTSSBjb21tYW5kLgorIElucHV0ICAgICAgICAgIDogcEhDQiAgLSAgICAgICBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBjb250cm9sIGJsb2NrLgorCQkgIHBTQ0IgIC0gICAgICAgUG9pbnRlciB0byBTQ1NJIGNvbnRyb2wgYmxvY2suCisgT3V0cHV0ICAgICAgICAgOiBOb25lLgorIFJldHVybiAgICAgICAgIDogTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaTkxdVNDQlBvc3QoQllURSAqIHBIY2IsIEJZVEUgKiBwU2NiKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnBTUkI7CS8qIFBvaW50ZXIgdG8gU0NTSSByZXF1ZXN0IGJsb2NrICovCisJSENTICpwSENCOworCVNDQiAqcFNDQjsKKworCXBIQ0IgPSAoSENTICopIHBIY2I7CisJcFNDQiA9IChTQ0IgKikgcFNjYjsKKwlpZiAoKHBTUkIgPSBwU0NCLT5TQ0JfU3JiKSA9PSAwKSB7CisJCXByaW50aygiaTkxdVNDQlBvc3Q6IFNSQiBwb2ludGVyIGlzIGVtcHR5XG4iKTsKKworCQl0dWxfcmVsZWFzZV9zY2IocEhDQiwgcFNDQik7CS8qIFJlbGVhc2UgU0NCIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHBTQ0ItPlNDQl9IYVN0YXQpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4YToJCS8qIExpbmtlZCBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgYW5kIGxpbmtlZCBub3JtYWxseSAqLworCWNhc2UgMHhiOgkJLyogTGlua2VkIGNvbW1hbmQgY29tcGxldGUgd2l0aG91dCBlcnJvciBpbnRlcnJ1cHQgZ2VuZXJhdGVkICovCisJCXBTQ0ItPlNDQl9IYVN0YXQgPSAwOworCQlicmVhazsKKworCWNhc2UgMHgxMToJCS8qIFNlbGVjdGlvbiB0aW1lIG91dC1UaGUgaW5pdGlhdG9yIHNlbGVjdGlvbiBvciB0YXJnZXQKKwkJCQkgICByZXNlbGVjdGlvbiB3YXMgbm90IGNvbXBsZXRlIHdpdGhpbiB0aGUgU0NTSSBUaW1lIG91dCBwZXJpb2QgKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9USU1FX09VVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTQ6CQkvKiBUYXJnZXQgYnVzIHBoYXNlIHNlcXVlbmNlIGZhaWx1cmUtQW4gaW52YWxpZCBidXMgcGhhc2Ugb3IgYnVzCisJCQkJICAgcGhhc2Ugc2VxdWVuY2Ugd2FzIHJlcXVlc3RlZCBieSB0aGUgdGFyZ2V0LiBUaGUgaG9zdCBhZGFwdGVyCisJCQkJICAgd2lsbCBnZW5lcmF0ZSBhIFNDU0kgUmVzZXQgQ29uZGl0aW9uLCBub3RpZnlpbmcgdGhlIGhvc3Qgd2l0aAorCQkJCSAgIGEgU0NSRCBpbnRlcnJ1cHQgKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MWE6CQkvKiBTQ0IgQWJvcnRlZC4gMDcvMjEvOTggKi8KKwkJcFNDQi0+U0NCX0hhU3RhdCA9IERJRF9BQk9SVDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTI6CQkvKiBEYXRhIG92ZXJydW4vdW5kZXJydW4tVGhlIHRhcmdldCBhdHRlbXB0ZWQgdG8gdHJhbnNmZXIgbW9yZSBkYXRhCisJCQkJICAgdGhhbiB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBEYXRhIExlbmd0aCBmaWVsZCBvciB0aGUgc3VtIG9mIHRoZQorCQkJCSAgIFNjYXR0ZXIgLyBHYXRoZXIgRGF0YSBMZW5ndGggZmllbGRzLiAqLworCWNhc2UgMHgxMzoJCS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUtVGhlIHRhcmdldCBkcm9wcGVkIHRoZSBTQ1NJIEJTWSBhdCBhbiB1bmV4cGVjdGVkIHRpbWUuICovCisJY2FzZSAweDE2OgkJLyogSW52YWxpZCBTQ0IgT3BlcmF0aW9uIENvZGUuICovCisKKwlkZWZhdWx0OgorCQlwcmludGsoImluaTkxMDB1OiAleCAleFxuIiwgcFNDQi0+U0NCX0hhU3RhdCwgcFNDQi0+U0NCX1RhU3RhdCk7CisJCXBTQ0ItPlNDQl9IYVN0YXQgPSBESURfRVJST1I7CS8qIENvdWxkbid0IGZpbmQgYW55IGJldHRlciAqLworCQlicmVhazsKKwl9CisKKwlwU1JCLT5yZXN1bHQgPSBwU0NCLT5TQ0JfVGFTdGF0IHwgKHBTQ0ItPlNDQl9IYVN0YXQgPDwgMTYpOworCisJaWYgKHBTUkIgPT0gTlVMTCkgeworCQlwcmludGsoInBTUkIgaXMgTlVMTFxuIik7CisJfQorCisJaTkxdV91bm1hcF9jbW5kKHBIQ0ItPnBjaV9kZXYsIHBTUkIpOworCXBTUkItPnNjc2lfZG9uZShwU1JCKTsJLyogTm90aWZ5IHN5c3RlbSBET05FICAgICAgICAgICAqLworCisJdHVsX3JlbGVhc2Vfc2NiKHBIQ0IsIHBTQ0IpOwkvKiBSZWxlYXNlIFNDQiBmb3IgY3VycmVudCBjaGFubmVsICovCit9CisKKy8qCisgKiBSZWxlYXNlIHJlc3NvdXJjZXMKKyAqLworc3RhdGljIGludCBpOTF1X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaHJlZykKK3sKKwlmcmVlX2lycShocmVnLT5pcnEsIGhyZWcpOworCXJlbGVhc2VfcmVnaW9uKGhyZWctPmlvX3BvcnQsIDI1Nik7CisJcmV0dXJuIDA7Cit9CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCT0gIklOSTkxMDBVIiwKKwkubmFtZQkJPSBpOTF1X1JFVklELAorCS5kZXRlY3QJCT0gaTkxdV9kZXRlY3QsCisJLnJlbGVhc2UJPSBpOTF1X3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAk9IGk5MXVfcXVldWVjb21tYW5kLAorLy8JLmFib3J0CQk9IGk5MXVfYWJvcnQsCisvLwkucmVzZXQJCT0gaTkxdV9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSBpOTF1X2J1c19yZXNldCwKKwkuYmlvc19wYXJhbQk9IGk5MXVfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUJPSAxLAorCS50aGlzX2lkCT0gMSwKKwkuc2dfdGFibGVzaXplCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1biAJPSAxLAorCS51c2VfY2x1c3RlcmluZwk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmggYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzZWQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uaApAQCAtMCwwICsxLDczOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0aW8gOTEwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OCBJbml0aW8gQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBXaGVyZSB0aGlzIFNvZnR3YXJlIGlzIGNvbWJpbmVkIHdpdGggc29mdHdhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYW5kIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIHdvdWxkIHJlcXVpcmUgdGhlIAorICogY29tYmluZWQgd29yayB0byBhbHNvIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMLCB0aGUgdGVybXMKKyAqIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IGluIGFkZGl0aW9uIHRvIHRob3NlIG9mIHRoZQorICogR1BMIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgdGhhdAorICogY29uZmxpY3Qgd2l0aCwgb3IgYXJlIGV4cHJlc3NseSBwcm9oaWJpdGVkIGJ5LCB0aGUgR1BMLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFVMT05HICAgdW5zaWduZWQgbG9uZworI2RlZmluZSBVU0hPUlQgIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIFVDSEFSICAgdW5zaWduZWQgY2hhcgorI2RlZmluZSBCWVRFICAgIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgV09SRCAgICB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSBEV09SRCAgIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgVUJZVEUgICB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIFVXT1JEICAgdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUgVURXT1JEICB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFUzMiAgICAgdTMyCisKKyNkZWZpbmUgVE9UQUxfU0dfRU5UUlkJCTMyCisjZGVmaW5lIE1BWF9TVVBQT1JURURfQURBUFRFUlMgIDgKKyNkZWZpbmUgTUFYX09GRlNFVAkJMTUKKyNkZWZpbmUgTUFYX1RBUkdFVFMJCTE2CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBiYXNlOworCXVuc2lnbmVkIHNob3J0IHZlYzsKK30gaTkxdV9jb25maWc7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgVHVsaXAgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBTZXQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRVTF9QVklEICAgICAgICAweDAwCS8qIFZlbmRvciBJRCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BESUQgICAgICAgIDB4MDIJLyogRGV2aWNlIElEICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUENNRCAgICAgICAgMHgwNAkvKiBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QU1RVUyAgICAgICAweDA2CS8qIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BSSUQgICAgICAgIDB4MDgJLyogUmV2aXNpb24gbnVtYmVyICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUFBJICAgICAgICAgMHgwOQkvKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UgICAgICAgICovCisjZGVmaW5lIFRVTF9QU0MgICAgICAgICAweDBBCS8qIFN1YiBDbGFzcyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BCQyAgICAgICAgIDB4MEIJLyogQmFzZSBDbGFzcyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUENMUyAgICAgICAgMHgwQwkvKiBDYWNoZSBsaW5lIHNpemUgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QTFRSICAgICAgICAweDBECS8qIExhdGVuY3kgdGltZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BIRFQgICAgICAgIDB4MEUJLyogSGVhZGVyIHR5cGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUEJJU1QgICAgICAgMHgwRgkvKiBCSVNUICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QQkFEICAgICAgICAweDEwCS8qIEJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BCQUQxICAgICAgIDB4MTQJLyogQmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUEJBRDIgICAgICAgMHgxOAkvKiBCYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QQkFEMyAgICAgICAweDFDCS8qIEJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BCQUQ0ICAgICAgIDB4MjAJLyogQmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUEJBRDUgICAgICAgMHgyNAkvKiBCYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QUlNWRCAgICAgICAweDI4CS8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BSU1ZEMSAgICAgIDB4MkMJLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUFJBRCAgICAgICAgMHgzMAkvKiBFeHBhbnNpb24gUk9NIGJhc2UgYWRkcmVzcyAgICovCisjZGVmaW5lIFRVTF9QUlNWRDIgICAgICAweDM0CS8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BSU1ZEMyAgICAgIDB4MzgJLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUElOVEwgICAgICAgMHgzQwkvKiBJbnRlcnJ1cHQgbGluZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9QSU5UUCAgICAgICAweDNECS8qIEludGVycnVwdCBwaW4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1BJR05UICAgICAgIDB4M0UJLyogTUlOX0dOVCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfUE1HTlQgICAgICAgMHgzRgkvKiBNQVhfR05UICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgSmFzbWluIFJlZ2lzdGVyIFNldCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFVMX0hBQ0ZHMCAgICAgIDB4NDAJLyogSC9BIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAgICAgICAgICovCisjZGVmaW5lIFRVTF9IQUNGRzEgICAgICAweDQxCS8qIEgvQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgICAgICAgICAqLworI2RlZmluZSBUVUxfSEFDRkcyICAgICAgMHg0MgkvKiBIL0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICAgICAgICAgKi8KKworI2RlZmluZSBUVUxfU0RDRkcwICAgICAgMHg0NAkvKiBTQ1NJIERldmljZSBDb25maWd1cmF0aW9uIDAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NEQ0ZHMSAgICAgIDB4NDUJLyogU0NTSSBEZXZpY2UgQ29uZmlndXJhdGlvbiAxICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TRENGRzIgICAgICAweDQ2CS8qIFNDU0kgRGV2aWNlIENvbmZpZ3VyYXRpb24gMiAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0RDRkczICAgICAgMHg0NwkvKiBTQ1NJIERldmljZSBDb25maWd1cmF0aW9uIDMgICAgICAgICAgKi8KKworI2RlZmluZSBUVUxfR0lOVFMgICAgICAgMHg1MAkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgVFVMX0dJTVNLICAgICAgIDB4NTIJLyogR2xvYmFsIEludGVycnVwdCBNQVNLIFJlZ2lzdGVyICAgICAgICovCisjZGVmaW5lIFRVTF9HQ1RSTCAgICAgICAweDU0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfR0NUUkxfRUVQUk9NX0JJVCAgICAweDA0CisjZGVmaW5lIFRVTF9HQ1RSTDEgICAgICAweDU1CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfRE1BQ0ZHICAgICAgMHg1QgkvKiBETUEgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX05WUkFNICAgICAgIDB4NUQJLyogTm9uLXZvbGF0aWxlIFJBTSBwb3J0ICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFVMX1NDbnQwICAgICAgIDB4ODAJLyogMDAgUi9XIFRyYW5zZmVyIENvdW50ZXIgTG93ICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TQ250MSAgICAgICAweDgxCS8qIDAxIFIvVyBUcmFuc2ZlciBDb3VudGVyIE1pZCAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0NudDIgICAgICAgMHg4MgkvKiAwMiBSL1cgVHJhbnNmZXIgQ291bnQgSGlnaCAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NGaWZvQ250ICAgIDB4ODMJLyogMDMgUiAgIEZJRk8gY291bnRlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TSW50RW5hYmxlICAweDg0CS8qIDAzIFcgICBJbnRlcnJ1cHQgZW5ibGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0ludCAgICAgICAgMHg4NAkvKiAwNCBSICAgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NDdHJsMCAgICAgIDB4ODUJLyogMDUgVyAgIENvbnRyb2wgMCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TU3RhdHVzMCAgICAweDg1CS8qIDA1IFIgICBTdGF0dXMgMCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0N0cmwxICAgICAgMHg4NgkvKiAwNiBXICAgQ29udHJvbCAxICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NTdGF0dXMxICAgIDB4ODYJLyogMDYgUiAgIFN0YXR1cyAxICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TQ29uZmlnICAgICAweDg3CS8qIDA3IFcgICBDb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU1N0YXR1czIgICAgMHg4NwkvKiAwNyBSICAgU3RhdHVzIDIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NQZXJpb2QgICAgIDB4ODgJLyogMDggVyAgIFN5bmMuIFRyYW5zZmVyIFBlcmlvZCAmIE9mZnNldCAqLworI2RlZmluZSBUVUxfU09mZnNldCAgICAgMHg4OAkvKiAwOCBSICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NTY3NpSWQgICAgIDB4ODkJLyogMDkgVyAgIFNDU0kgSUQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TQnVzSWQgICAgICAweDg5CS8qIDA5IFIgICBTQ1NJIEJVUyBJRCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU1RpbWVPdXQgICAgMHg4QQkvKiAwQSBXICAgU2VsL1Jlc2VsIFRpbWUgT3V0IFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgVFVMX1NJZGVudCAgICAgIDB4OEEJLyogMEEgUiAgIElkZW50aWZ5IE1lc3NhZ2UgUmVnaXN0ZXIgICAgICovCisjZGVmaW5lIFRVTF9TQXZhaWwgICAgICAweDhBCS8qIDBBIFIgICBBdmFpbGlhYmxlIENvdW50ZXIgUmVnaXN0ZXIgICAqLworI2RlZmluZSBUVUxfU0RhdGEgICAgICAgMHg4QgkvKiAwQiBSL1cgU0NTSSBkYXRhIGluL291dCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NGaWZvICAgICAgIDB4OEMJLyogMEMgUi9XIEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TU2lnbmFsICAgICAweDkwCS8qIDEwIFIvVyBTQ1NJIHNpZ25hbCBpbi9vdXQgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0NtZCAgICAgICAgMHg5MQkvKiAxMSBSL1cgQ29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1NUZXN0MCAgICAgIDB4OTIJLyogMTIgUi9XIFRlc3QwICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9TVGVzdDEgICAgICAweDkzCS8qIDEzIFIvVyBUZXN0MSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfU0NGRzEJMHg5NAkvKiAxNCBSL1cgQ29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUVUxfWEFkZEggICAgICAgMHhDMAkvKkRNQSBUcmFuc2ZlciBQaHlzaWNhbCBBZGRyZXNzICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1hBZGRXICAgICAgIDB4QzgJLypETUEgQ3VycmVudCBUcmFuc2ZlciBQaHlzaWNhbCBBZGRyZXNzICovCisjZGVmaW5lIFRVTF9YQ250SCAgICAgICAweEQwCS8qRE1BIFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfWENudFcgICAgICAgMHhENAkvKkRNQSBDdXJyZW50IFRyYW5zZmVyIENvdW50ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1hDbWQgICAgICAgIDB4RDgJLypETUEgQ29tbWFuZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9JbnQgICAgICAgICAweERDCS8qSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfWFN0YXR1cyAgICAgMHhERAkvKkRNQSBzdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX01hc2sgICAgICAgIDB4RTAJLypJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRVTF9YQ3RybCAgICAgICAweEU0CS8qRE1BIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVUxfWEN0cmwxICAgICAgMHhFNQkvKkRNQSBDb250cm9sIFJlZ2lzdGVyIDEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFVMX1hGaWZvICAgICAgIDB4RTgJLypETUEgRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFVMX1dDdHJsICAgICAgIDB4RjcJLypCdXMgbWFzdGVyIHdhaXQgc3RhdGUgY29udHJvbCAgICAgICAgICovCisjZGVmaW5lIFRVTF9EQ3RybCAgICAgICAweEZCCS8qRE1BIGRlbGF5IGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICBiaXQgZGVmaW5pdGlvbiBmb3IgQ29tbWFuZCByZWdpc3RlciBvZiBDb25maWd1cmF0aW9uIFNwYWNlIEhlYWRlciAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEJVU01TICAgICAgICAgICAweDA0CS8qIEJVUyBNQVNURVIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJT1NQQSAgICAgICAgICAgMHgwMQkvKiBJTyBTcGFjZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvbW1hbmQgQ29kZXMgb2YgVHVsaXAgU0NTSSBDb21tYW5kIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU0NfRU5fUkVTRUwgICAgMHg4MAkvKiBFbmFibGUgUmVzZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0NNRF9DT01QICAgIDB4ODQJLyogQ29tbWFuZCBDb21wbGV0ZSBTZXF1ZW5jZSAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19TRUwgICAgICAgICAweDAxCS8qIFNlbGVjdCBXaXRob3V0IEFUTiBTZXF1ZW5jZSAgICAgICAgICAqLworI2RlZmluZSBUU0NfU0VMX0FUTiAgICAgMHgxMQkvKiBTZWxlY3QgV2l0aCBBVE4gU2VxdWVuY2UgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1NFTF9BVE5fRE1BIDB4NTEJLyogU2VsZWN0IFdpdGggQVROIFNlcXVlbmNlIHdpdGggRE1BICAgICovCisjZGVmaW5lIFRTQ19TRUxfQVROMyAgICAweDMxCS8qIFNlbGVjdCBXaXRoIEFUTjMgU2VxdWVuY2UgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfU0VMX0FUTlNUT1AgMHgxMgkvKiBTZWxlY3QgV2l0aCBBVE4gYW5kIFN0b3AgU2VxdWVuY2UgICAgKi8KKyNkZWZpbmUgVFNDX1NFTEFUTlNUT1AgIDB4MUUJLyogU2VsZWN0IFdpdGggQVROIGFuZCBTdG9wIFNlcXVlbmNlICAgICovCisKKyNkZWZpbmUgVFNDX1NFTF9BVE5fRElSRUNUX0lOICAgMHg5NQkvKiBTZWxlY3QgV2l0aCBBVE4gU2VxdWVuY2UgICAgICovCisjZGVmaW5lIFRTQ19TRUxfQVROX0RJUkVDVF9PVVQgIDB4MTUJLyogU2VsZWN0IFdpdGggQVROIFNlcXVlbmNlICAgICAqLworI2RlZmluZSBUU0NfU0VMX0FUTjNfRElSRUNUX0lOICAweEI1CS8qIFNlbGVjdCBXaXRoIEFUTjMgU2VxdWVuY2UgICAgKi8KKyNkZWZpbmUgVFNDX1NFTF9BVE4zX0RJUkVDVF9PVVQgMHgzNQkvKiBTZWxlY3QgV2l0aCBBVE4zIFNlcXVlbmNlICAgICovCisjZGVmaW5lIFRTQ19YRl9ETUFfT1VUX0RJUkVDVCAgIDB4MDYJLyogRE1BIFhmZXIgSW5mb21hdGlvbiBvdXQgICAgICAqLworI2RlZmluZSBUU0NfWEZfRE1BX0lOX0RJUkVDVCAgICAweDg2CS8qIERNQSBYZmVyIEluZm9tYXRpb24gaW4gICAgICAgKi8KKworI2RlZmluZSBUU0NfWEZfRE1BX09VVCAgMHg0MwkvKiBETUEgWGZlciBJbmZvbWF0aW9uIG91dCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1hGX0RNQV9JTiAgIDB4QzMJLyogRE1BIFhmZXIgSW5mb21hdGlvbiBpbiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19YRl9GSUZPX09VVCAweDAzCS8qIEZJRk8gWGZlciBJbmZvbWF0aW9uIG91dCAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfWEZfRklGT19JTiAgMHg4MwkvKiBGSUZPIFhmZXIgSW5mb21hdGlvbiBpbiAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUU0NfTVNHX0FDQ0VQVCAgMHgwRgkvKiBNZXNzYWdlIEFjY2VwdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIENvbnRyb2wgMCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU0NfUlNUX1NFUSAgICAgMHgyMAkvKiBSZXNldCBzZXF1ZW5jZSBjb3VudGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0ZMVVNIX0ZJRk8gIDB4MTAJLyogRmx1c2ggRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19BQlRfQ01EICAgICAweDA0CS8qIEFib3J0IGNvbW1hbmQgKHNlcXVlbmNlKSAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfUlNUX0NISVAgICAgMHgwMgkvKiBSZXNldCBTQ1NJIENoaXAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1JTVF9CVVMgICAgIDB4MDEJLyogUmVzZXQgU0NTSSBCdXMgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBiaXQgZGVmaW5pdGlvbiBmb3IgVHVsaXAgU0NTSSBDb250cm9sIDEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVFNDX0VOX1NDQU0gICAgIDB4ODAJLyogRW5hYmxlIFNDQU0gICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19USU1FUiAgICAgICAweDQwCS8qIFNlbGVjdCB0aW1lb3V0IHVuaXQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfRU5fU0NTSTIgICAgMHgyMAkvKiBTQ1NJLTIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1BXRE4gICAgICAgIDB4MTAJLyogUG93ZXIgZG93biBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19XSURFX0NQVSAgICAweDA4CS8qIFdpZGUgQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfSFdfUkVTRUxFQ1QgMHgwNAkvKiBFbmFibGUgSFcgcmVzZWxlY3QgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0VOX0JVU19PVVQgIDB4MDIJLyogRW5hYmxlIFNDU0kgZGF0YSBidXMgb3V0IGxhdGNoICAgICAgICovCisjZGVmaW5lIFRTQ19FTl9CVVNfSU4gICAweDAxCS8qIEVuYWJsZSBTQ1NJIGRhdGEgYnVzIGluIGxhdGNoICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFR1bGlwIFNDU0kgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRTQ19FTl9MQVRDSCAgICAweDgwCS8qIEVuYWJsZSBwaGFzZSBsYXRjaCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfSU5JVElBVE9SICAgMHg0MAkvKiBJbml0aWF0b3IgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0VOX1NDU0lfUEFSIDB4MjAJLyogRW5hYmxlIFNDU0kgcGFyaXR5ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19ETUFfOEJJVCAgICAweDEwCS8qIEFsdGVybmF0ZSBkbWEgOC1iaXRzIG1vZGUgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfRE1BXzE2QklUICAgMHgwOAkvKiBBbHRlcm5hdGUgZG1hIDE2LWJpdHMgbW9kZSAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0VOX1dEQUNLICAgIDB4MDQJLyogRW5hYmxlIERBQ0sgd2hpbGUgd2lkZSBTQ1NJIHhmZXIgICAgICovCisjZGVmaW5lIFRTQ19BTFRfUEVSSU9EICAweDAyCS8qIEFsdGVybmF0ZSBzeW5jIHBlcmlvZCBtb2RlICAgICAgICAgICAqLworI2RlZmluZSBUU0NfRElTX1NDU0lSU1QgMHgwMQkvKiBEaXNhYmxlIFNDU0kgYnVzIHJlc2V0IHVzICAgICAgICAgICAgKi8KKworI2RlZmluZSBUU0NfSU5JVERFRkFVTFQgKFRTQ19JTklUSUFUT1IgfCBUU0NfRU5fTEFUQ0ggfCBUU0NfQUxUX1BFUklPRCB8IFRTQ19ESVNfU0NTSVJTVCkKKworI2RlZmluZSBUU0NfV0lERV9TQ1NJICAgMHg4MAkvKiBFbmFibGUgV2lkZSBTQ1NJICAgICAgICAgICAgICAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIHNpZ25hbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU0NfUlNUX0FDSyAgICAgMHgwMAkvKiBSZWxlYXNlIEFDSyBzaWduYWwgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX1JTVF9BVE4gICAgIDB4MDAJLyogUmVsZWFzZSBBVE4gc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19SU1RfQlNZICAgICAweDAwCS8qIFJlbGVhc2UgQlNZIHNpZ25hbCAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFRTQ19TRVRfQUNLICAgICAweDQwCS8qIEFDSyBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfU0VUX0FUTiAgICAgMHgwOAkvKiBBVE4gc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUU0NfUkVRSSAgICAgICAgMHg4MAkvKiBSRVEgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0FDS0kgICAgICAgIDB4NDAJLyogQUNLIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19CU1lJICAgICAgICAweDIwCS8qIEJTWSBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfU0VMSSAgICAgICAgMHgxMAkvKiBTRUwgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0FUTkkgICAgICAgIDB4MDgJLyogQVROIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTQ19NU0dJICAgICAgICAweDA0CS8qIE1TRyBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU0NfQ0RJICAgICAgICAgMHgwMgkvKiBDL0Qgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNDX0lPSSAgICAgICAgIDB4MDEJLyogSS9PIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGJpdCBkZWZpbml0aW9uIGZvciBUdWxpcCBTQ1NJIFN0YXR1cyAwIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBUU1NfSU5UX1BFTkRJTkcgMHg4MAkvKiBJbnRlcnJ1cHQgcGVuZGluZyAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19TRVFfQUNUSVZFICAweDQwCS8qIFNlcXVlbmNlciBhY3RpdmUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1hGRVJfQ05UICAgIDB4MjAJLyogVHJhbnNmZXIgY291bnRlciB6ZXJvICAgICAgICAqLworI2RlZmluZSBUU1NfRklGT19FTVBUWSAgMHgxMAkvKiBGSUZPIGVtcHR5ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19QQVJfRVJST1IgICAweDA4CS8qIFNDU0kgcGFyaXR5IGVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1BIX01BU0sgICAgIDB4MDcJLyogU0NTSSBwaGFzZSBtYXNrICAgICAgICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFR1bGlwIFNDU0kgU3RhdHVzIDEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRTU19TVEFUVVNfUkNWICAweDA4CS8qIFN0YXR1cyByZWNlaXZlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX01TR19TRU5EICAgIDB4NDAJLyogTWVzc2FnZSBzZW50ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfQ01EX1BIX0NNUCAgMHgyMAkvKiBjb21tYW5kIHBoYXNlIGRvbmUgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19EQVRBX1BIX0NNUCAweDEwCS8qIERhdGEgcGhhc2UgZG9uZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1NUQVRVU19TRU5EIDB4MDgJLyogU3RhdHVzIHNlbnQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfWEZFUl9DTVAgICAgMHgwNAkvKiBUcmFuc2ZlciBjb21wbGV0ZWQgICAgICAgICAgICovCisjZGVmaW5lIFRTU19TRUxfQ01QICAgICAweDAyCS8qIFNlbGVjdGlvbiBjb21wbGV0ZWQgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX0FSQl9DTVAgICAgIDB4MDEJLyogQXJiaXRyYXRpb24gY29tcGxldGVkICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFR1bGlwIFNDU0kgU3RhdHVzIDIgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRTU19DTURfQUJURUQgICAweDgwCS8qIENvbW1hbmQgYWJvcnRlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX09GRlNFVF8wICAgIDB4NDAJLyogT2Zmc2V0IGNvdW50ZXIgemVybyAgICAgICAgICAqLworI2RlZmluZSBUU1NfRklGT19GVUxMICAgMHgyMAkvKiBGSUZPIGZ1bGwgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19USU1FT1VUXzAgICAweDEwCS8qIFRpbWVvdXQgY291bnRlciB6ZXJvICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX0JVU1lfUkxTICAgIDB4MDgJLyogQnVzeSByZWxlYXNlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfUEhfTUlTTUFUQ0ggMHgwNAkvKiBQaGFzZSBtaXNtYXRjaCAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19TQ1NJX0JVU19FTiAweDAyCS8qIFNDU0kgZGF0YSBidXMgZW5hYmxlICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1NDU0lSU1QgICAgIDB4MDEJLyogU0NTSSBidXMgcmVzZXQgaW4gcHJvZ3Jlc3MgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFR1bGlwIFNDU0kgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFRTU19SRVNFTF9JTlQgICAweDgwCS8qIFJlc2VsZWN0ZWQgaW50ZXJydXB0ICAgICAgICAgKi8KKyNkZWZpbmUgVFNTX1NFTF9USU1FT1VUIDB4NDAJLyogU2VsZWN0ZWQvcmVzZWxlY3RlZCB0aW1lb3V0ICAqLworI2RlZmluZSBUU1NfQlVTX1NFUlYgICAgMHgyMAorI2RlZmluZSBUU1NfU0NTSVJTVF9JTlQgMHgxMAkvKiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAgICAgICovCisjZGVmaW5lIFRTU19ESVNDX0lOVCAgICAweDA4CS8qIERpc2Nvbm5lY3RlZCBpbnRlcnJ1cHQgICAgICAgKi8KKyNkZWZpbmUgVFNTX1NFTF9JTlQgICAgIDB4MDQJLyogU2VsZWN0IGludGVycnVwdCAgICAgICAgICAgICAqLworI2RlZmluZSBUU1NfU0NBTV9TRUwgICAgMHgwMgkvKiBTQ0FNIHNlbGVjdGVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRTU19GVU5DX0NPTVAgICAweDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTQ1NJIFBoYXNlIENvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgREFUQV9PVVQgICAgICAgIDAKKyNkZWZpbmUgREFUQV9JTiAgICAgICAgIDEJLyogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDTURfT1VUICAgICAgICAgMgorI2RlZmluZSBTVEFUVVNfSU4gICAgICAgMwkvKiA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1TR19PVVQgICAgICAgICA2CS8qIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVNHX0lOICAgICAgICAgIDcKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBDb21tYW5kIENvZGVzIG9mIFR1bGlwIHhmZXIgQ29tbWFuZCByZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgVEFYX1hfRk9SQyAgICAgIDB4MDIKKyNkZWZpbmUgVEFYX1hfQUJUICAgICAgIDB4MDQKKyNkZWZpbmUgVEFYX1hfQ0xSX0ZJRk8gIDB4MDgKKworI2RlZmluZSBUQVhfWF9JTiAgICAgICAgMHgyMQorI2RlZmluZSBUQVhfWF9PVVQgICAgICAgMHgwMQorI2RlZmluZSBUQVhfU0dfSU4gICAgICAgMHhBMQorI2RlZmluZSBUQVhfU0dfT1VUICAgICAgMHg4MQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVHVsaXAgSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFhDTVAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEZDTVAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFhBQlQgICAgICAgICAgICAweDA0CisjZGVmaW5lIFhFUlIgICAgICAgICAgICAweDA4CisjZGVmaW5lIFNDTVAgICAgICAgICAgICAweDEwCisjZGVmaW5lIElQRU5EICAgICAgICAgICAweDgwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUdWxpcCBETUEgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgWFBFTkQgICAgICAgICAgIDB4MDEJLyogVHJhbnNmZXIgcGVuZGluZyAgICAgICAgICAgICAqLworI2RlZmluZSBGRU1QVFkgICAgICAgICAgMHgwMgkvKiBGSUZPIGVtcHR5ICAgICAgICAgICAgICAgICAgICovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogYml0IGRlZmluaXRpb24gZm9yIFRVTF9HQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEVYVFNHICAgICAgICAgICAweDgwCisjZGVmaW5lIEVYVEFEICAgICAgICAgICAweDYwCisjZGVmaW5lIFNFRzRLICAgICAgICAgICAweDA4CisjZGVmaW5lIEVFUFJHICAgICAgICAgICAweDA0CisjZGVmaW5lIE1STVVMICAgICAgICAgICAweDAyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBiaXQgZGVmaW5pdGlvbiBmb3IgVFVMX05WUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU0UyQ1MgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0UyQ0xLICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0UyRE8gICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0UyREkgICAgICAgICAgIDB4MDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgIFNjYXR0ZXItR2F0aGVyIEVsZW1lbnQgU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBTR19TdHJ1YyB7CisJVTMyIFNHX1B0cjsJCS8qIERhdGEgUG9pbnRlciAqLworCVUzMiBTR19MZW47CQkvKiBEYXRhIExlbmd0aCAqLworfSBTRzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCVNDU0kgQ29udHJvbCBCbG9jaworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgU2NzaV9DdHJsX0JsayB7CisJc3RydWN0IFNjc2lfQ3RybF9CbGsgKlNDQl9OeHRTY2I7CisJVUJZVEUgU0NCX1N0YXR1czsJLyo0ICovCisJVUJZVEUgU0NCX054dFN0YXQ7CS8qNSAqLworCVVCWVRFIFNDQl9Nb2RlOwkJLyo2ICovCisJVUJZVEUgU0NCX01zZ2luOwkvKjcgU0NCX1JlczAgKi8KKwlVV09SRCBTQ0JfU0dJZHg7CS8qOCAqLworCVVXT1JEIFNDQl9TR01heDsJLypBICovCisjaWZkZWYgQUxQSEEKKwlVMzIgU0NCX1Jlc2VydmVkWzJdOwkvKkMgKi8KKyNlbHNlCisJVTMyIFNDQl9SZXNlcnZlZFszXTsJLypDICovCisjZW5kaWYKKworCVUzMiBTQ0JfWGZlckxlbjsJLyoxOCBDdXJyZW50IHhmZXIgbGVuICAgICAgICAgICAqLworCVUzMiBTQ0JfVG90WExlbjsJLyoxQyBUb3RhbCB4ZmVyIGxlbiAgICAgICAgICAgICAqLworCVUzMiBTQ0JfUEFkZHI7CQkvKjIwIFNDQiBwaHkuIEFkZHIuICovCisKKwlVQllURSBTQ0JfT3Bjb2RlOwkvKjI0IFNDQiBjb21tYW5kIGNvZGUgKi8KKwlVQllURSBTQ0JfRmxhZ3M7CS8qMjUgU0NCIEZsYWdzICovCisJVUJZVEUgU0NCX1RhcmdldDsJLyoyNiBUYXJnZXQgSWQgKi8KKwlVQllURSBTQ0JfTHVuOwkJLyoyNyBMdW4gKi8KKwlVMzIgU0NCX0J1ZlB0cjsJCS8qMjggRGF0YSBCdWZmZXIgUG9pbnRlciAqLworCVUzMiBTQ0JfQnVmTGVuOwkJLyoyQyBEYXRhIEFsbG9jYXRpb24gTGVuZ3RoICovCisJVUJZVEUgU0NCX1NHTGVuOwkvKjMwIFNHIGxpc3QgIyAqLworCVVCWVRFIFNDQl9TZW5zZUxlbjsJLyozMSBTZW5zZSBBbGxvY2F0aW9uIExlbmd0aCAqLworCVVCWVRFIFNDQl9IYVN0YXQ7CS8qMzIgKi8KKwlVQllURSBTQ0JfVGFTdGF0OwkvKjMzICovCisJVUJZVEUgU0NCX0NEQkxlbjsJLyozNCBDREIgTGVuZ3RoICovCisJVUJZVEUgU0NCX0lkZW50OwkvKjM1IElkZW50aWZ5ICovCisJVUJZVEUgU0NCX1RhZ01zZzsJLyozNiBUYWcgTWVzc2FnZSAqLworCVVCWVRFIFNDQl9UYWdJZDsJLyozNyBRdWV1ZSBUYWcgKi8KKwlVQllURSBTQ0JfQ0RCWzEyXTsJLyozOCAqLworCVUzMiBTQ0JfU0dQQWRkcjsJLyo0NCBTRyBMaXN0L1NlbnNlIEJ1ZiBwaHkuIEFkZHIuICovCisJVTMyIFNDQl9TZW5zZVB0cjsJLyo0OCBTZW5zZSBkYXRhIHBvaW50ZXIgKi8KKwl2b2lkICgqU0NCX1Bvc3QpIChCWVRFICosIEJZVEUgKik7CS8qNEMgUE9TVCByb3V0aW5lICovCisJc3RydWN0IHNjc2lfY21uZCAqU0NCX1NyYjsJLyo1MCBTUkIgUG9pbnRlciAqLworCVNHIFNDQl9TR0xpc3RbVE9UQUxfU0dfRU5UUlldOwkvKjU0IFN0YXJ0IG9mIFNHIGxpc3QgKi8KK30gU0NCOworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgU0NCX1N0YXR1cyAqLworI2RlZmluZSBTQ0JfUkVOVCAgICAgICAgMHgwMQorI2RlZmluZSBTQ0JfUEVORCAgICAgICAgMHgwMgorI2RlZmluZSBTQ0JfQ09OVElHICAgICAgMHgwNAkvKiBDb250aWdlbnQgQWxsZWdpYW5jZSAqLworI2RlZmluZSBTQ0JfU0VMRUNUICAgICAgMHgwOAorI2RlZmluZSBTQ0JfQlVTWSAgICAgICAgMHgxMAorI2RlZmluZSBTQ0JfRE9ORSAgICAgICAgMHgyMAorCisKKy8qIE9wY29kZXMgb2YgU0NCX09wY29kZSAqLworI2RlZmluZSBFeGVjU0NTSSAgICAgICAgMHgxCisjZGVmaW5lIEJ1c0RldlJzdCAgICAgICAweDIKKyNkZWZpbmUgQWJvcnRDbWQgICAgICAgIDB4MworCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBTQ0JfTW9kZSAqLworI2RlZmluZSBTQ01fUlNFTlMgICAgICAgMHgwMQkvKiByZXF1ZXN0IHNlbnNlIG1vZGUgKi8KKworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgU0NCX0ZsYWdzICovCisjZGVmaW5lIFNDRl9ET05FICAgICAgICAweDAxCisjZGVmaW5lIFNDRl9QT1NUICAgICAgICAweDAyCisjZGVmaW5lIFNDRl9TRU5TRSAgICAgICAweDA0CisjZGVmaW5lIFNDRl9ESVIgICAgICAgICAweDE4CisjZGVmaW5lIFNDRl9OT19EQ0hLICAgICAweDAwCisjZGVmaW5lIFNDRl9ESU4gICAgICAgICAweDA4CisjZGVmaW5lIFNDRl9ET1VUICAgICAgICAweDEwCisjZGVmaW5lIFNDRl9OT19YRiAgICAgICAweDE4CisjZGVmaW5lIFNDRl9XUl9WRiAgICAgICAweDIwCS8qIFdyaXRlIHZlcmlmeSB0dXJuIG9uICAgICAgICAgKi8KKyNkZWZpbmUgU0NGX1BPTEwgICAgICAgIDB4NDAKKyNkZWZpbmUgU0NGX1NHICAgICAgICAgIDB4ODAKKworLyogRXJyb3IgQ29kZXMgZm9yIFNDQl9IYVN0YXQgKi8KKyNkZWZpbmUgSE9TVF9TRUxfVE9VVCAgIDB4MTEKKyNkZWZpbmUgSE9TVF9ET19EVSAgICAgIDB4MTIKKyNkZWZpbmUgSE9TVF9CVVNfRlJFRSAgIDB4MTMKKyNkZWZpbmUgSE9TVF9CQURfUEhBUyAgIDB4MTQKKyNkZWZpbmUgSE9TVF9JTlZfQ01EICAgIDB4MTYKKyNkZWZpbmUgSE9TVF9BQk9SVEVEICAgIDB4MUEJLyogMDcvMjEvOTggKi8KKyNkZWZpbmUgSE9TVF9TQ1NJX1JTVCAgIDB4MUIKKyNkZWZpbmUgSE9TVF9ERVZfUlNUICAgIDB4MUMKKworLyogRXJyb3IgQ29kZXMgZm9yIFNDQl9UYVN0YXQgKi8KKyNkZWZpbmUgVEFSR0VUX0NIS0NPTkQgIDB4MDIKKyNkZWZpbmUgVEFSR0VUX0JVU1kgICAgIDB4MDgKKyNkZWZpbmUgSU5JX1FVRVVFX0ZVTEwJMHgyOAorCisvKiBTQ1NJIE1FU1NBR0UgKi8KKyNkZWZpbmUgTVNHX0NPTVAgICAgICAgIDB4MDAKKyNkZWZpbmUgTVNHX0VYVEVORCAgICAgIDB4MDEKKyNkZWZpbmUgTVNHX1NEUCAgICAgICAgIDB4MDIKKyNkZWZpbmUgTVNHX1JFU1RPUkUgICAgIDB4MDMKKyNkZWZpbmUgTVNHX0RJU0MgICAgICAgIDB4MDQKKyNkZWZpbmUgTVNHX0lERSAgICAgICAgIDB4MDUKKyNkZWZpbmUgTVNHX0FCT1JUICAgICAgIDB4MDYKKyNkZWZpbmUgTVNHX1JFSiAgICAgICAgIDB4MDcKKyNkZWZpbmUgTVNHX05PUCAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVNHX1BBUklUWSAgICAgIDB4MDkKKyNkZWZpbmUgTVNHX0xJTktfQ09NUCAgIDB4MEEKKyNkZWZpbmUgTVNHX0xJTktfRkxBRyAgIDB4MEIKKyNkZWZpbmUgTVNHX0RFVlJTVCAgICAgIDB4MEMKKyNkZWZpbmUgTVNHX0FCT1JUX1RBRyAgIDB4MEQKKworLyogUXVldWUgdGFnIG1zZzogU2ltcGxlX3F1cXVlX3RhZywgSGVhZF9vZl9xdWV1ZV90YWcsIE9yZGVyZWRfcXVldWVfdGFnICovCisjZGVmaW5lIE1TR19TVEFHICAgICAgICAweDIwCisjZGVmaW5lIE1TR19IVEFHICAgICAgICAweDIxCisjZGVmaW5lIE1TR19PVEFHICAgICAgICAweDIyCisKKyNkZWZpbmUgTVNHX0lHTk9SRVdJREUgIDB4MjMKKworI2RlZmluZSBNU0dfSURFTlQgICAweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQlUYXJnZXQgRGV2aWNlIENvbnRyb2wgU3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBUYXJfQ3RybF9TdHJ1YyB7CisJVVdPUkQgVENTX0ZsYWdzOwkvKiAwICovCisJVUJZVEUgVENTX0pTX1BlcmlvZDsJLyogMiAqLworCVVCWVRFIFRDU19TQ29uZmlnMDsJLyogMyAqLworCisJVVdPUkQgVENTX0RydkZsYWdzOwkvKiA0ICovCisJVUJZVEUgVENTX0RydkhlYWQ7CS8qIDYgKi8KKwlVQllURSBUQ1NfRHJ2U2VjdG9yOwkvKiA3ICovCit9IFRDUzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCVRhcmdldCBEZXZpY2UgQ29udHJvbCBTdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBUQ0ZfRmxhZ3MgKi8KKyNkZWZpbmUgVENGX1NDU0lfUkFURSAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIFRDRl9FTl9ESVNDICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBUQ0ZfTk9fU1lOQ19ORUdPICAgICAgICAweDAwMTAKKyNkZWZpbmUgVENGX05PX1dEVFIgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFRDRl9FTl8yNTUgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBUQ0ZfRU5fU1RBUlQgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgVENGX1dEVFJfRE9ORSAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFRDRl9TWU5DX0RPTkUgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBUQ0ZfQlVTWSAgICAgICAgICAgICAgICAweDA0MDAKKworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgVENGX0RydkZsYWdzICovCisjZGVmaW5lIFRDRl9EUlZfQlVTWSAgICAgICAgICAgIDB4MDEJLyogSW5kaWNhdGUgdGFyZ2V0IGJ1c3koZHJpdmVyKSAqLworI2RlZmluZSBUQ0ZfRFJWX0VOX1RBRyAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgVENGX0RSVl8yNTVfNjMgICAgICAgICAgMHgwNDAwCisKK3R5cGVkZWYgc3RydWN0IEk5MXVfQWRwdF9TdHJ1YyB7CisJVVdPUkQgQURQVF9CSU9TOwkvKiAwICovCisJVVdPUkQgQURQVF9CQVNFOwkvKiAxICovCisJVUJZVEUgQURQVF9CdXM7CQkvKiAyICovCisJVUJZVEUgQURQVF9EZXZpY2U7CS8qIDMgKi8KKwlVQllURSBBRFBUX0lOVFI7CS8qIDQgKi8KK30gSU5JX0FEUFRfU1RSVUNUOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAgICAgIEhvc3QgQWRhcHRlciBDb250cm9sIFN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgSGFfQ3RybF9TdHJ1YyB7CisJVVdPUkQgSENTX0Jhc2U7CQkvKiAwMCAqLworCVVXT1JEIEhDU19CSU9TOwkJLyogMDIgKi8KKwlVQllURSBIQ1NfSW50cjsJCS8qIDA0ICovCisJVUJZVEUgSENTX1NDU0lfSUQ7CS8qIDA1ICovCisJVUJZVEUgSENTX01heFRhcjsJLyogMDYgKi8KKwlVQllURSBIQ1NfTnVtU2NiczsJLyogMDcgKi8KKworCVVCWVRFIEhDU19GbGFnczsJLyogMDggKi8KKwlVQllURSBIQ1NfSW5kZXg7CS8qIDA5ICovCisJVUJZVEUgSENTX0hhSWQ7CQkvKiAwQSAqLworCVVCWVRFIEhDU19Db25maWc7CS8qIDBCICovCisJVVdPUkQgSENTX0lkTWFzazsJLyogMEMgKi8KKwlVQllURSBIQ1NfU2VtYXBoOwkvKiAwRSAqLworCVVCWVRFIEhDU19QaGFzZTsJLyogMEYgKi8KKwlVQllURSBIQ1NfSlNTdGF0dXMwOwkvKiAxMCAqLworCVVCWVRFIEhDU19KU0ludDsJLyogMTEgKi8KKwlVQllURSBIQ1NfSlNTdGF0dXMxOwkvKiAxMiAqLworCVVCWVRFIEhDU19TQ29uZjE7CS8qIDEzICovCisKKwlVQllURSBIQ1NfTXNnWzhdOwkvKiAxNCAqLworCVNDQiAqSENTX054dEF2YWlsOwkvKiAxQyAqLworCVNDQiAqSENTX1NjYjsJCS8qIDIwICovCisJU0NCICpIQ1NfU2NiRW5kOwkvKiAyNCAqLworCVNDQiAqSENTX054dFBlbmQ7CS8qIDI4ICovCisJU0NCICpIQ1NfTnh0Q29udGlnOwkvKiAyQyAqLworCVNDQiAqSENTX0FjdFNjYjsJLyogMzAgKi8KKwlUQ1MgKkhDU19BY3RUY3M7CS8qIDM0ICovCisKKwlTQ0IgKkhDU19GaXJzdEF2YWlsOwkvKiAzOCAqLworCVNDQiAqSENTX0xhc3RBdmFpbDsJLyogM0MgKi8KKwlTQ0IgKkhDU19GaXJzdFBlbmQ7CS8qIDQwICovCisJU0NCICpIQ1NfTGFzdFBlbmQ7CS8qIDQ0ICovCisJU0NCICpIQ1NfRmlyc3RCdXN5OwkvKiA0OCAqLworCVNDQiAqSENTX0xhc3RCdXN5OwkvKiA0QyAqLworCVNDQiAqSENTX0ZpcnN0RG9uZTsJLyogNTAgKi8KKwlTQ0IgKkhDU19MYXN0RG9uZTsJLyogNTQgKi8KKwlVQllURSBIQ1NfTWF4VGFnc1sxNl07CS8qIDU4ICovCisJVUJZVEUgSENTX0FjdFRhZ3NbMTZdOwkvKiA2OCAqLworCVRDUyBIQ1NfVGNzW01BWF9UQVJHRVRTXTsJLyogNzggKi8KKwlzcGlubG9ja190IEhDU19BdmFpbExvY2s7CisJc3BpbmxvY2tfdCBIQ1NfU2VtYXBoTG9jazsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKK30gSENTOworCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgSENCX0NvbmZpZyAqLworI2RlZmluZSBIQ0NfU0NTSV9SRVNFVCAgICAgICAgICAweDAxCisjZGVmaW5lIEhDQ19FTl9QQVIgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSENDX0FDVF9URVJNMSAgICAgICAgICAgMHgwNAorI2RlZmluZSBIQ0NfQUNUX1RFUk0yICAgICAgICAgICAweDA4CisjZGVmaW5lIEhDQ19BVVRPX1RFUk0gICAgICAgICAgIDB4MTAKKyNkZWZpbmUgSENDX0VOX1BXUiAgICAgICAgICAgICAgMHg4MAorCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgSENCX0ZsYWdzICovCisjZGVmaW5lIEhDRl9FWFBFQ1RfRElTQyAgICAgICAgIDB4MDEKKyNkZWZpbmUgSENGX0VYUEVDVF9TRUxFQ1QgICAgICAgMHgwMgorI2RlZmluZSBIQ0ZfRVhQRUNUX1JFU0VUICAgICAgICAweDEwCisjZGVmaW5lIEhDRl9FWFBFQ1RfRE9ORV9ESVNDICAgIDB4MjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVNlcmlhbCBFRVByb20KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9OVlJBTV9TQ1NJIHsJLyogU0NTSSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gICAqLworCVVDSEFSIE5WTV9DaFNDU0lJRDsJLyogMENoIC0+IENoYW5uZWwgU0NTSSBJRCAgICAgICAqLworCVVDSEFSIE5WTV9DaENvbmZpZzE7CS8qIDBEaCAtPiBDaGFubmVsIGNvbmZpZyAxICAgICAgKi8KKwlVQ0hBUiBOVk1fQ2hDb25maWcyOwkvKiAwRWggLT4gQ2hhbm5lbCBjb25maWcgMiAgICAgICovCisJVUNIQVIgTlZNX051bU9mVGFyZzsJLyogMEZoIC0+IE51bWJlciBvZiBTQ1NJIHRhcmdldCAqLworCS8qIFNDU0kgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gICAgKi8KKwlVQ0hBUiBOVk1fVGFyZzBDb25maWc7CS8qIDEwaCAtPiBUYXJnZXQgMCBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1RhcmcxQ29uZmlnOwkvKiAxMWggLT4gVGFyZ2V0IDEgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnMkNvbmZpZzsJLyogMTJoIC0+IFRhcmdldCAyIGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZzNDb25maWc7CS8qIDEzaCAtPiBUYXJnZXQgMyBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1Rhcmc0Q29uZmlnOwkvKiAxNGggLT4gVGFyZ2V0IDQgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnNUNvbmZpZzsJLyogMTVoIC0+IFRhcmdldCA1IGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZzZDb25maWc7CS8qIDE2aCAtPiBUYXJnZXQgNiBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1Rhcmc3Q29uZmlnOwkvKiAxN2ggLT4gVGFyZ2V0IDcgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnOENvbmZpZzsJLyogMThoIC0+IFRhcmdldCA4IGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZzlDb25maWc7CS8qIDE5aCAtPiBUYXJnZXQgOSBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1RhcmdBQ29uZmlnOwkvKiAxQWggLT4gVGFyZ2V0IEEgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnQkNvbmZpZzsJLyogMUJoIC0+IFRhcmdldCBCIGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZ0NDb25maWc7CS8qIDFDaCAtPiBUYXJnZXQgQyBjb25maWd1cmF0aW9uICovCisJVUNIQVIgTlZNX1RhcmdEQ29uZmlnOwkvKiAxRGggLT4gVGFyZ2V0IEQgY29uZmlndXJhdGlvbiAqLworCVVDSEFSIE5WTV9UYXJnRUNvbmZpZzsJLyogMUVoIC0+IFRhcmdldCBFIGNvbmZpZ3VyYXRpb24gKi8KKwlVQ0hBUiBOVk1fVGFyZ0ZDb25maWc7CS8qIDFGaCAtPiBUYXJnZXQgRiBjb25maWd1cmF0aW9uICovCit9IE5WUkFNX1NDU0k7CisKK3R5cGVkZWYgc3RydWN0IF9OVlJBTSB7CisvKi0tLS0tLS0tLS1oZWFkZXIgLS0tLS0tLS0tLS0tLS0tKi8KKwlVU0hPUlQgTlZNX1NpZ25hdHVyZTsJLyogMCwxOiBTaWduYXR1cmUgKi8KKwlVQ0hBUiBOVk1fU2l6ZTsJCS8qIDI6ICAgU2l6ZSBvZiBkYXRhIHN0cnVjdHVyZSAqLworCVVDSEFSIE5WTV9SZXZpc2lvbjsJLyogMzogICBSZXZpc2lvbiBvZiBkYXRhIHN0cnVjdHVyZSAqLworCS8qIC0tLS1Ib3N0IEFkYXB0ZXIgU3RydWN0dXJlIC0tLS0gKi8KKwlVQ0hBUiBOVk1fTW9kZWxCeXRlMDsJLyogNDogICBNb2RlbCBudW1iZXIgKGJ5dGUgMCkgKi8KKwlVQ0hBUiBOVk1fTW9kZWxCeXRlMTsJLyogNTogICBNb2RlbCBudW1iZXIgKGJ5dGUgMSkgKi8KKwlVQ0hBUiBOVk1fTW9kZWxJbmZvOwkvKiA2OiAgIE1vZGVsIGluZm9ybWF0aW9uICAgICAgICAgKi8KKwlVQ0hBUiBOVk1fTnVtT2ZDaDsJLyogNzogICBOdW1iZXIgb2YgU0NTSSBjaGFubmVsICovCisJVUNIQVIgTlZNX0JJT1NDb25maWcxOwkvKiA4OiAgIEJJT1MgY29uZmlndXJhdGlvbiAxICAqLworCVVDSEFSIE5WTV9CSU9TQ29uZmlnMjsJLyogOTogICBCSU9TIGNvbmZpZ3VyYXRpb24gMiAgKi8KKwlVQ0hBUiBOVk1fSEFDb25maWcxOwkvKiBBOiAgIEhvYXQgYWRhcHRlciBjb25maWd1cmF0aW9uIDEgKi8KKwlVQ0hBUiBOVk1fSEFDb25maWcyOwkvKiBCOiAgIEhvYXQgYWRhcHRlciBjb25maWd1cmF0aW9uIDIgKi8KKwlOVlJBTV9TQ1NJIE5WTV9TQ1NJSW5mb1syXTsKKwlVQ0hBUiBOVk1fcmVzZXJ2ZWRbMTBdOworCS8qIC0tLS0tLS0tLS0gQ2hlY2tTdW0gLS0tLS0tLS0tLSAgICAgICAqLworCVVTSE9SVCBOVk1fQ2hlY2tTdW07CS8qIDB4M0UsIDB4M0Y6IENoZWNrc3VtIG9mIE5WUmFtICAgICAgICAqLworfSBOVlJBTSwgKlBOVlJBTTsKKworLyogQmlvcyBDb25maWd1cmF0aW9uIGZvciBudnJhbS0+QklPU0NvbmZpZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkJDMV9FTkFCTEUgICAgICAgICAgICAgMHgwMQkvKiBCSU9TIGVuYWJsZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5CQzFfOERSSVZFICAgICAgICAgICAgIDB4MDIJLyogU3VwcG9ydCBtb3JlIHRoYW4gMiBkcml2ZXMgICAqLworI2RlZmluZSBOQkMxX1JFTU9WQUJMRSAgICAgICAgICAweDA0CS8qIFN1cHBvcnQgcmVtb3ZhYmxlIGRyaXZlICAgICAgKi8KKyNkZWZpbmUgTkJDMV9JTlQxOSAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcmNlcHQgaW50IDE5aCAgICAgICAgICAgICovCisjZGVmaW5lIE5CQzFfQklPU1NDQU4gICAgICAgICAgIDB4MTAJLyogRHluYW1pYyBCSU9TIHNjYW4gICAgICAgICAgICAqLworI2RlZmluZSBOQkMxX0xVTlNVUFBPUlQgICAgICAgICAweDQwCS8qIFN1cHBvcnQgTFVOICAgICAgICAgICAgICAgICAgKi8KKworLyogSEEgQ29uZmlndXJhdGlvbiBCeXRlIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkhDMV9CT09USURNQVNLIDB4MEYJLyogQm9vdCBJRCBudW1iZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBOSEMxX0xVTk1BU0sgICAgMHg3MAkvKiBCb290IExVTiBudW1iZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIE5IQzFfQ0hBTk1BU0sgICAweDgwCS8qIEJvb3QgQ2hhbm5lbCBudW1iZXIgICAgICAgICAgKi8KKworLyogQml0IGRlZmluaXRpb24gZm9yIG52cmFtLT5TQ1NJY29uZmlnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTkNDMV9CVVNSRVNFVCAgICAgICAgICAgMHgwMQkvKiBSZXNldCBTQ1NJIGJ1cyBhdCBwb3dlciB1cCAgICovCisjZGVmaW5lIE5DQzFfUEFSSVRZQ0hLICAgICAgICAgIDB4MDIJLyogU0NTSSBwYXJpdHkgZW5hYmxlICAgICAgICAgICAqLworI2RlZmluZSBOQ0MxX0FDVFRFUk0xICAgICAgICAgICAweDA0CS8qIEVuYWJsZSBhY3RpdmUgdGVybWluYXRvciAxICAgKi8KKyNkZWZpbmUgTkNDMV9BQ1RURVJNMiAgICAgICAgICAgMHgwOAkvKiBFbmFibGUgYWN0aXZlIHRlcm1pbmF0b3IgMiAgICovCisjZGVmaW5lIE5DQzFfQVVUT1RFUk0gICAgICAgICAgIDB4MTAJLyogRW5hYmxlIGF1dG8gdGVybWluYXRvciAgICAgICAqLworI2RlZmluZSBOQ0MxX1BXUk1HUiAgICAgICAgICAgICAweDgwCS8qIEVuYWJsZSBwb3dlciBtYW5hZ2VtZW50ICAgICAgKi8KKworLyogQml0IGRlZmluaXRpb24gZm9yIFNDU0kgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gYnl0ZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDX0RJU0NPTk5FQ1QgICAgICAgICAgMHgwOAkvKiBFbmFibGUgU0NTSSBkaXNjb25uZWN0ICAgICAgICovCisjZGVmaW5lIE5UQ19TWU5DICAgICAgICAgICAgICAgIDB4MTAJLyogU1lOQ19ORUdPICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOVENfTk9fV0RUUiAgICAgICAgICAgICAweDIwCS8qIFNZTkNfTkVHTyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlRDXzFHSUdBICAgICAgICAgICAgICAgMHg0MAkvKiAyNTUgaGVhZCAvIDYzIHNlY3RvcnMgKDY0LzMyKSAqLworI2RlZmluZSBOVENfU1BJTlVQICAgICAgICAgICAgICAweDgwCS8qIFN0YXJ0IGRpc2sgZHJpdmUgICAgICAgICAgICAgKi8KKworLyogICAgICBEZWZhdWx0IE5WUmFtIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSU5JX1NJR05BVFVSRSAgICAgICAgICAgMHhDOTI1CisjZGVmaW5lIE5CQzFfREVGQVVMVCAgICAgICAgICAgIChOQkMxX0VOQUJMRSkKKyNkZWZpbmUgTkNDMV9ERUZBVUxUICAgICAgICAgICAgKE5DQzFfQlVTUkVTRVQgfCBOQ0MxX0FVVE9URVJNIHwgTkNDMV9QQVJJVFlDSEspCisjZGVmaW5lIE5UQ19ERUZBVUxUICAgICAgICAgICAgIChOVENfTk9fV0RUUiB8IE5UQ18xR0lHQSB8IE5UQ19ESVNDT05ORUNUKQorCisvKiBTQ1NJIHJlbGF0ZWQgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBESVNDX05PVF9BTExPVyAgICAgICAgICAweDgwCS8qIERpc2Nvbm5lY3QgaXMgbm90IGFsbG93ZWQgICAgKi8KKyNkZWZpbmUgRElTQ19BTExPVyAgICAgICAgICAgICAgMHhDMAkvKiBEaXNjb25uZWN0IGlzIGFsbG93ZWQgICAgICAgICovCisjZGVmaW5lIFNDU0lDTURfUmVxdWVzdFNlbnNlICAgIDB4MDMKKwordHlwZWRlZiBzdHJ1Y3QgX0hDU2luZm8geworCVVMT05HIGJhc2U7CisJVUNIQVIgdmVjOworCVVDSEFSIGJpb3M7CQkvKiBIaWdoIGJ5dGUgb2YgQklPUyBhZGRyZXNzICovCisJVVNIT1JUIEJhc2VBbmRCaW9zOwkvKiBoaWdoIGJ5dGU6IHBIY3NJbmZvLT5iaW9zLGxvdyBieXRlOnBIY3NJbmZvLT5iYXNlICovCit9IEhDU0lORk87CisKKyNkZWZpbmUgVFVMX1JEKHgseSkgICAgICAgICAgICAgKFVDSEFSKShpbmIoICAoaW50KSgoVUxPTkcpKHgreSkpICkpCisjZGVmaW5lIFRVTF9SRExPTkcoeCx5KSAgICAgICAgIChVTE9ORykoaW5sKChpbnQpKChVTE9ORykoeCt5KSkgKSkKKyNkZWZpbmUgVFVMX1dSKCAgICAgYWRyLGRhdGEpICAgb3V0YiggKFVDSEFSKShkYXRhKSwgKGludCkoYWRyKSkKKyNkZWZpbmUgVFVMX1dSU0hPUlQoYWRyLGRhdGEpICAgb3V0dyggKFVXT1JEKShkYXRhKSwgKGludCkoYWRyKSkKKyNkZWZpbmUgVFVMX1dSTE9ORyggYWRyLGRhdGEpICAgb3V0bCggKFVMT05HKShkYXRhKSwgKGludCkoYWRyKSkKKworI2RlZmluZSBTQ1NJX0FCT1JUX1NOT09aRSAwCisjZGVmaW5lIFNDU0lfQUJPUlRfU1VDQ0VTUyAxCisjZGVmaW5lIFNDU0lfQUJPUlRfUEVORElORyAyCisjZGVmaW5lIFNDU0lfQUJPUlRfQlVTWSAzCisjZGVmaW5lIFNDU0lfQUJPUlRfTk9UX1JVTk5JTkcgNAorI2RlZmluZSBTQ1NJX0FCT1JUX0VSUk9SIDUKKworI2RlZmluZSBTQ1NJX1JFU0VUX1NOT09aRSAwCisjZGVmaW5lIFNDU0lfUkVTRVRfUFVOVCAxCisjZGVmaW5lIFNDU0lfUkVTRVRfU1VDQ0VTUyAyCisjZGVmaW5lIFNDU0lfUkVTRVRfUEVORElORyAzCisjZGVmaW5lIFNDU0lfUkVTRVRfV0FLRVVQIDQKKyNkZWZpbmUgU0NTSV9SRVNFVF9OT1RfUlVOTklORyA1CisjZGVmaW5lIFNDU0lfUkVTRVRfRVJST1IgNgorCisjZGVmaW5lIFNDU0lfUkVTRVRfU1lOQ0hST05PVVMJCTB4MDEKKyNkZWZpbmUgU0NTSV9SRVNFVF9BU1lOQ0hST05PVVMJCTB4MDIKKyNkZWZpbmUgU0NTSV9SRVNFVF9TVUdHRVNUX0JVU19SRVNFVAkweDA0CisjZGVmaW5lIFNDU0lfUkVTRVRfU1VHR0VTVF9IT1NUX1JFU0VUCTB4MDgKKworI2RlZmluZSBTQ1NJX1JFU0VUX0JVU19SRVNFVCAweDEwMAorI2RlZmluZSBTQ1NJX1JFU0VUX0hPU1RfUkVTRVQgMHgyMDAKKyNkZWZpbmUgU0NTSV9SRVNFVF9BQ1RJT04gICAweGZmCisKK2V4dGVybiB2b2lkIGluaXRfaTkxdUFkYXB0ZXJfdGFibGUodm9pZCk7CitleHRlcm4gaW50IEFkZGk5MXVfaW50b19BZGFwdGVyX3RhYmxlKFdPUkQsIFdPUkQsIEJZVEUsIEJZVEUsIEJZVEUpOworZXh0ZXJuIGludCB0dWxfUmV0dXJuTnVtYmVyT2ZBZGFwdGVycyh2b2lkKTsKK2V4dGVybiB2b2lkIGdldF90dWxpcFBDSUNvbmZpZyhIQ1MgKiBwSENCLCBpbnQgaUNoYW5uZWxfaW5kZXgpOworZXh0ZXJuIGludCBpbml0X3R1bGlwKEhDUyAqIHBIQ0IsIFNDQiAqIHBTQ0IsIGludCB0dWxfbnVtX3NjYiwgQllURSAqIHBiQmlvc0FkciwgaW50IHJlc2V0X3RpbWUpOworZXh0ZXJuIFNDQiAqdHVsX2FsbG9jX3NjYihIQ1MgKiBwSENCKTsKK2V4dGVybiBpbnQgdHVsX2Fib3J0X3NyYihIQ1MgKiBwSENCLCBzdHJ1Y3Qgc2NzaV9jbW5kICogcFNSQik7CitleHRlcm4gdm9pZCB0dWxfZXhlY19zY2IoSENTICogcEhDQiwgU0NCICogcFNDQik7CitleHRlcm4gdm9pZCB0dWxfcmVsZWFzZV9zY2IoSENTICogcEhDQiwgU0NCICogcFNDQik7CitleHRlcm4gdm9pZCB0dWxfc3RvcF9ibShIQ1MgKiBwSENCKTsKK2V4dGVybiBpbnQgdHVsX3Jlc2V0X3Njc2koSENTICogcEN1ckhjYiwgaW50IHNlY29uZHMpOworZXh0ZXJuIGludCB0dWxfaXNyKEhDUyAqIHBIQ0IpOworZXh0ZXJuIGludCB0dWxfcmVzZXQoSENTICogcEhDQiwgc3RydWN0IHNjc2lfY21uZCAqIHBTUkIsIHVuc2lnbmVkIGNoYXIgdGFyZ2V0KTsKK2V4dGVybiBpbnQgdHVsX3Jlc2V0X3Njc2lfYnVzKEhDUyAqIHBDdXJIY2IpOworZXh0ZXJuIGludCB0dWxfZGV2aWNlX3Jlc2V0KEhDUyAqIHBDdXJIY2IsIHN0cnVjdCBzY3NpX2NtbmQgKnBTcmIsCisJCXVuc2lnbmVkIGludCB0YXJnZXQsIHVuc2lnbmVkIGludCBSZXNldEZsYWdzKTsKKwkJCQkvKiAtLS0tIEVYVEVSTkFMIFZBUklBQkxFUyAtLS0tICovCitleHRlcm4gSENTIHR1bF9oY3NbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDQxNTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC0wLDAgKzEsNjA4MyBAQAorLyoKKyAqIGlwci5jIC0tIGRyaXZlciBmb3IgSUJNIFBvd2VyIExpbnV4IFJBSUQgYWRhcHRlcnMKKyAqCisgKiBXcml0dGVuIEJ5OiBCcmlhbiBLaW5nIDxicmtpbmdAdXMuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKy8qCisgKiBOb3RlczoKKyAqCisgKiBUaGlzIGRyaXZlciBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGZvbGxvd2luZyBTQ1NJIGFkYXB0ZXJzOgorICoKKyAqIElCTSBpU2VyaWVzOiA1NzAyLCA1NzAzLCAyNzgwLCA1NzA5LCA1NzBBLCA1NzBCCisgKgorICogSUJNIHBTZXJpZXM6IFBDSS1YIER1YWwgQ2hhbm5lbCBVbHRyYSAzMjAgU0NTSSBSQUlEIEFkYXB0ZXIKKyAqICAgICAgICAgICAgICBQQ0ktWCBEdWFsIENoYW5uZWwgVWx0cmEgMzIwIFNDU0kgQWRhcHRlcgorICogICAgICAgICAgICAgIFBDSS1YIER1YWwgQ2hhbm5lbCBVbHRyYSAzMjAgU0NTSSBSQUlEIEVuYWJsZW1lbnQgQ2FyZAorICogICAgICAgICAgICAgIEVtYmVkZGVkIFNDU0kgYWRhcHRlciBvbiBwNjE1IGFuZCBwNjU1IHN5c3RlbXMKKyAqCisgKiBTdXBwb3J0ZWQgSGFyZHdhcmUgRmVhdHVyZXM6CisgKgktIFVsdHJhIDMyMCBTQ1NJIGNvbnRyb2xsZXIKKyAqCS0gUENJLVggaG9zdCBpbnRlcmZhY2UKKyAqCS0gRW1iZWRkZWQgUG93ZXJQQyBSSVNDIFByb2Nlc3NvciBhbmQgSGFyZHdhcmUgWE9SIERNQSBFbmdpbmUKKyAqCS0gTm9uLVZvbGF0aWxlIFdyaXRlIENhY2hlCisgKgktIFN1cHBvcnRzIGF0dGFjaG1lbnQgb2Ygbm9uLVJBSUQgZGlza3MsIHRhcGUsIGFuZCBvcHRpY2FsIGRldmljZXMKKyAqCS0gUkFJRCBMZXZlbHMgMCwgNSwgMTAKKyAqCS0gSG90IHNwYXJlCisgKgktIEJhY2tncm91bmQgUGFyaXR5IENoZWNraW5nCisgKgktIEJhY2tncm91bmQgRGF0YSBTY3J1YmJpbmcKKyAqCS0gQWJpbGl0eSB0byBpbmNyZWFzZSB0aGUgY2FwYWNpdHkgb2YgYW4gZXhpc3RpbmcgUkFJRCA1IGRpc2sgYXJyYXkKKyAqCQlieSBhZGRpbmcgZGlza3MKKyAqCisgKiBEcml2ZXIgRmVhdHVyZXM6CisgKgktIFRhZ2dlZCBjb21tYW5kIHF1ZXVpbmcKKyAqCS0gQWRhcHRlciBtaWNyb2NvZGUgZG93bmxvYWQKKyAqCS0gUENJIGhvdCBwbHVnCisgKgktIFNDU0kgZGV2aWNlIGhvdCBwbHVnCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlICJpcHIuaCIKKworLyoKKyAqICAgR2xvYmFsIERhdGEKKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaXByX2lvYV9oZWFkID0gTElTVF9IRUFEX0lOSVQoaXByX2lvYV9oZWFkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXByX2xvZ19sZXZlbCA9IElQUl9ERUZBVUxUX0xPR19MRVZFTDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXByX21heF9zcGVlZCA9IDE7CitzdGF0aWMgaW50IGlwcl90ZXN0bW9kZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwcl9mYXN0ZmFpbCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwcl90cmFuc29wX3RpbWVvdXQgPSBJUFJfT1BFUkFUSU9OQUxfVElNRU9VVDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXByX2RyaXZlcl9sb2NrKTsKKworLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gRE1BIGNvbnRyb2xsZXIgY2hpcHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXByX2NoaXBfY2ZnX3QgaXByX2NoaXBfY2ZnW10gPSB7CisJeyAvKiBHZW1zdG9uZSBhbmQgQ2l0cmluZSAqLworCQkubWFpbGJveCA9IDB4MDA0MkMsCisJCS5jYWNoZV9saW5lX3NpemUgPSAweDIwLAorCQl7CisJCQkuc2V0X2ludGVycnVwdF9tYXNrX3JlZyA9IDB4MDAyMkMsCisJCQkuY2xyX2ludGVycnVwdF9tYXNrX3JlZyA9IDB4MDAyMzAsCisJCQkuc2Vuc2VfaW50ZXJydXB0X21hc2tfcmVnID0gMHgwMDIyQywKKwkJCS5jbHJfaW50ZXJydXB0X3JlZyA9IDB4MDAyMjgsCisJCQkuc2Vuc2VfaW50ZXJydXB0X3JlZyA9IDB4MDAyMjQsCisJCQkuaW9hcnJpbl9yZWcgPSAweDAwNDA0LAorCQkJLnNlbnNlX3Vwcm9jX2ludGVycnVwdF9yZWcgPSAweDAwMjE0LAorCQkJLnNldF91cHJvY19pbnRlcnJ1cHRfcmVnID0gMHgwMDIxNCwKKwkJCS5jbHJfdXByb2NfaW50ZXJydXB0X3JlZyA9IDB4MDAyMTgKKwkJfQorCX0sCisJeyAvKiBTbmlwZSBhbmQgU2NhbXAgKi8KKwkJLm1haWxib3ggPSAweDAwNTJDLAorCQkuY2FjaGVfbGluZV9zaXplID0gMHgyMCwKKwkJeworCQkJLnNldF9pbnRlcnJ1cHRfbWFza19yZWcgPSAweDAwMjg4LAorCQkJLmNscl9pbnRlcnJ1cHRfbWFza19yZWcgPSAweDAwMjhDLAorCQkJLnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZyA9IDB4MDAyODgsCisJCQkuY2xyX2ludGVycnVwdF9yZWcgPSAweDAwMjg0LAorCQkJLnNlbnNlX2ludGVycnVwdF9yZWcgPSAweDAwMjgwLAorCQkJLmlvYXJyaW5fcmVnID0gMHgwMDUwNCwKKwkJCS5zZW5zZV91cHJvY19pbnRlcnJ1cHRfcmVnID0gMHgwMDI5MCwKKwkJCS5zZXRfdXByb2NfaW50ZXJydXB0X3JlZyA9IDB4MDAyOTAsCisJCQkuY2xyX3Vwcm9jX2ludGVycnVwdF9yZWcgPSAweDAwMjk0CisJCX0KKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcHJfY2hpcF90IGlwcl9jaGlwW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX01ZTEVYLCBQQ0lfREVWSUNFX0lEX0lCTV9HRU1TVE9ORSwgJmlwcl9jaGlwX2NmZ1swXSB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NJVFJJTkUsICZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9TTklQRSwgJmlwcl9jaGlwX2NmZ1sxXSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9TQ0FNUCwgJmlwcl9jaGlwX2NmZ1sxXSB9Cit9OworCitzdGF0aWMgaW50IGlwcl9tYXhfYnVzX3NwZWVkcyBbXSA9IHsKKwlJUFJfODBNQnNfU0NTSV9SQVRFLCBJUFJfVTE2MF9TQ1NJX1JBVEUsIElQUl9VMzIwX1NDU0lfUkFURQorfTsKKworTU9EVUxFX0FVVEhPUigiQnJpYW4gS2luZyA8YnJraW5nQHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBQb3dlciBSQUlEIFNDU0kgQWRhcHRlciBEcml2ZXIiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfc3BlZWQsIGlwcl9tYXhfc3BlZWQsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc3BlZWQsICJNYXhpbXVtIGJ1cyBzcGVlZCAoMC0yKS4gRGVmYXVsdDogMT1VMTYwLiBTcGVlZHM6IDA9ODAgTUIvcywgMT1VMTYwLCAyPVUzMjAiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChsb2dfbGV2ZWwsIGlwcl9sb2dfbGV2ZWwsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhsb2dfbGV2ZWwsICJTZXQgdG8gMCAtIDQgZm9yIGluY3JlYXNpbmcgdmVyYm9zaXR5IG9mIGRldmljZSBkcml2ZXIiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0bW9kZSwgaXByX3Rlc3Rtb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0bW9kZSwgIkRBTkdFUk9VUyEhISBBbGxvd3MgdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChmYXN0ZmFpbCwgaXByX2Zhc3RmYWlsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYXN0ZmFpbCwgIlJlZHVjZSB0aW1lb3V0cyBhbmQgcmV0cmllcyIpOworbW9kdWxlX3BhcmFtX25hbWVkKHRyYW5zb3BfdGltZW91dCwgaXByX3RyYW5zb3BfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHJhbnNvcF90aW1lb3V0LCAiVGltZSBpbiBzZWNvbmRzIHRvIHdhaXQgZm9yIGFkYXB0ZXIgdG8gY29tZSBvcGVyYXRpb25hbCAoZGVmYXVsdDogMzAwKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oSVBSX0RSSVZFUl9WRVJTSU9OKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwcl9ncGRkX2Rldl9lbmRfc3RhdGVzW10gPSB7CisJIkNvbW1hbmQgY29tcGxldGUiLAorCSJUZXJtaW5hdGVkIGJ5IGhvc3QiLAorCSJUZXJtaW5hdGVkIGJ5IGRldmljZSByZXNldCIsCisJIlRlcm1pbmF0ZWQgYnkgYnVzIHJlc2V0IiwKKwkiVW5rbm93biIsCisJIkNvbW1hbmQgbm90IHN0YXJ0ZWQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXByX2dwZGRfZGV2X2J1c19waGFzZXNbXSA9IHsKKwkiQnVzIGZyZWUiLAorCSJBcmJpdHJhdGlvbiIsCisJIlNlbGVjdGlvbiIsCisJIk1lc3NhZ2Ugb3V0IiwKKwkiQ29tbWFuZCIsCisJIk1lc3NhZ2UgaW4iLAorCSJEYXRhIG91dCIsCisJIkRhdGEgaW4iLAorCSJTdGF0dXMiLAorCSJSZXNlbGVjdGlvbiIsCisJIlVua25vd24iCit9OworCisvKiAgQSBjb25zdGFudCBhcnJheSBvZiBJT0FTQ3MvVVJDcy9FcnJvciBNZXNzYWdlcyAqLworc3RhdGljIGNvbnN0CitzdHJ1Y3QgaXByX2Vycm9yX3RhYmxlX3QgaXByX2Vycm9yX3RhYmxlW10gPSB7CisJezB4MDAwMDAwMDAsIDEsIDEsCisJIjgxNTU6IEFuIHVua25vd24gZXJyb3Igd2FzIHJlY2VpdmVkIn0sCisJezB4MDAzMzAwMDAsIDAsIDAsCisJIlNvZnQgdW5kZXJsZW5ndGggZXJyb3IifSwKKwl7MHgwMDVBMDAwMCwgMCwgMCwKKwkiQ29tbWFuZCB0byBiZSBjYW5jZWxsZWQgbm90IGZvdW5kIn0sCisJezB4MDA4MDgwMDAsIDAsIDAsCisJIlF1YWxpZmllZCBzdWNjZXNzIn0sCisJezB4MDEwODAwMDAsIDEsIDEsCisJIkZGRkU6IFNvZnQgZGV2aWNlIGJ1cyBlcnJvciByZWNvdmVyZWQgYnkgdGhlIElPQSJ9LAorCXsweDAxMTcwNjAwLCAwLCAxLAorCSJGRkY5OiBEZXZpY2Ugc2VjdG9yIHJlYXNzaWduIHN1Y2Nlc3NmdWwifSwKKwl7MHgwMTE3MDkwMCwgMCwgMSwKKwkiRkZGNzogTWVkaWEgZXJyb3IgcmVjb3ZlcmVkIGJ5IGRldmljZSByZXdyaXRlIHByb2NlZHVyZXMifSwKKwl7MHgwMTE4MDIwMCwgMCwgMSwKKwkiNzAwMTogSU9BIHNlY3RvciByZWFzc2lnbm1lbnQgc3VjY2Vzc2Z1bCJ9LAorCXsweDAxMTgwNTAwLCAwLCAxLAorCSJGRkY5OiBTb2Z0IG1lZGlhIGVycm9yLiBTZWN0b3IgcmVhc3NpZ25tZW50IHJlY29tbWVuZGVkIn0sCisJezB4MDExODA2MDAsIDAsIDEsCisJIkZGRjc6IE1lZGlhIGVycm9yIHJlY292ZXJlZCBieSBJT0EgcmV3cml0ZSBwcm9jZWR1cmVzIn0sCisJezB4MDE0MTgwMDAsIDAsIDEsCisJIkZGM0Q6IFNvZnQgUENJIGJ1cyBlcnJvciByZWNvdmVyZWQgYnkgdGhlIElPQSJ9LAorCXsweDAxNDQwMDAwLCAxLCAxLAorCSJGRkY2OiBEZXZpY2UgaGFyZHdhcmUgZXJyb3IgcmVjb3ZlcmVkIGJ5IHRoZSBJT0EifSwKKwl7MHgwMTQ0ODEwMCwgMCwgMSwKKwkiRkZGNjogRGV2aWNlIGhhcmR3YXJlIGVycm9yIHJlY292ZXJlZCBieSB0aGUgZGV2aWNlIn0sCisJezB4MDE0NDgyMDAsIDEsIDEsCisJIkZGM0Q6IFNvZnQgSU9BIGVycm9yIHJlY292ZXJlZCBieSB0aGUgSU9BIn0sCisJezB4MDE0NDgzMDAsIDAsIDEsCisJIkZGRkE6IFVuZGVmaW5lZCBkZXZpY2UgcmVzcG9uc2UgcmVjb3ZlcmVkIGJ5IHRoZSBJT0EifSwKKwl7MHgwMTRBMDAwMCwgMSwgMSwKKwkiRkZGNjogRGV2aWNlIGJ1cyBlcnJvciwgbWVzc2FnZSBvciBjb21tYW5kIHBoYXNlIn0sCisJezB4MDE1RDAwMDAsIDAsIDEsCisJIkZGRjY6IEZhaWx1cmUgcHJlZGljdGlvbiB0aHJlc2hvbGQgZXhjZWVkZWQifSwKKwl7MHgwMTVEOTIwMCwgMCwgMSwKKwkiODAwOTogSW1wZW5kaW5nIGNhY2hlIGJhdHRlcnkgcGFjayBmYWlsdXJlIn0sCisJezB4MDIwNDA0MDAsIDAsIDAsCisJIjM0RkY6IERpc2sgZGV2aWNlIGZvcm1hdCBpbiBwcm9ncmVzcyJ9LAorCXsweDAyM0YwMDAwLCAwLCAwLAorCSJTeW5jaHJvbml6YXRpb24gcmVxdWlyZWQifSwKKwl7MHgwMjRFMDAwMCwgMCwgMCwKKwkiTm8gcmVhZHksIElPQSBzaHV0ZG93biJ9LAorCXsweDAyNUEwMDAwLCAwLCAwLAorCSJOb3QgcmVhZHksIElPQSBoYXMgYmVlbiBzaHV0ZG93biJ9LAorCXsweDAyNjcwMTAwLCAwLCAxLAorCSIzMDIwOiBTdG9yYWdlIHN1YnN5c3RlbSBjb25maWd1cmF0aW9uIGVycm9yIn0sCisJezB4MDMxMTBCMDAsIDAsIDAsCisJIkZGRjU6IE1lZGl1bSBlcnJvciwgZGF0YSB1bnJlYWRhYmxlLCByZWNvbW1lbmQgcmVhc3NpZ24ifSwKKwl7MHgwMzExMEMwMCwgMCwgMCwKKwkiNzAwMDogTWVkaXVtIGVycm9yLCBkYXRhIHVucmVhZGFibGUsIGRvIG5vdCByZWFzc2lnbiJ9LAorCXsweDAzMzEwMDAwLCAwLCAxLAorCSJGRkYzOiBEaXNrIG1lZGlhIGZvcm1hdCBiYWQifSwKKwl7MHgwNDA1MDAwMCwgMCwgMSwKKwkiMzAwMjogQWRkcmVzc2VkIGRldmljZSBmYWlsZWQgdG8gcmVzcG9uZCB0byBzZWxlY3Rpb24ifSwKKwl7MHgwNDA4MDAwMCwgMSwgMSwKKwkiMzEwMDogRGV2aWNlIGJ1cyBlcnJvciJ9LAorCXsweDA0MDgwMTAwLCAwLCAxLAorCSIzMTA5OiBJT0EgdGltZWQgb3V0IGEgZGV2aWNlIGNvbW1hbmQifSwKKwl7MHgwNDA4ODAwMCwgMCwgMCwKKwkiMzEyMDogU0NTSSBidXMgaXMgbm90IG9wZXJhdGlvbmFsIn0sCisJezB4MDQxMTgwMDAsIDAsIDEsCisJIjkwMDA6IElPQSByZXNlcnZlZCBhcmVhIGRhdGEgY2hlY2sifSwKKwl7MHgwNDExODEwMCwgMCwgMSwKKwkiOTAwMTogSU9BIHJlc2VydmVkIGFyZWEgaW52YWxpZCBkYXRhIHBhdHRlcm4ifSwKKwl7MHgwNDExODIwMCwgMCwgMSwKKwkiOTAwMjogSU9BIHJlc2VydmVkIGFyZWEgTFJDIGVycm9yIn0sCisJezB4MDQzMjAwMDAsIDAsIDEsCisJIjEwMkU6IE91dCBvZiBhbHRlcm5hdGUgc2VjdG9ycyBmb3IgZGlzayBzdG9yYWdlIn0sCisJezB4MDQzMzAwMDAsIDEsIDEsCisJIkZGRjQ6IERhdGEgdHJhbnNmZXIgdW5kZXJsZW5ndGggZXJyb3IifSwKKwl7MHgwNDMzODAwMCwgMSwgMSwKKwkiRkZGNDogRGF0YSB0cmFuc2ZlciBvdmVybGVuZ3RoIGVycm9yIn0sCisJezB4MDQzRTAxMDAsIDAsIDEsCisJIjM0MDA6IExvZ2ljYWwgdW5pdCBmYWlsdXJlIn0sCisJezB4MDQ0MDg1MDAsIDAsIDEsCisJIkZGRjQ6IERldmljZSBtaWNyb2NvZGUgaXMgY29ycnVwdCJ9LAorCXsweDA0NDE4MDAwLCAxLCAxLAorCSI4MTUwOiBQQ0kgYnVzIGVycm9yIn0sCisJezB4MDQ0MzAwMDAsIDEsIDAsCisJIlVuc3VwcG9ydGVkIGRldmljZSBidXMgbWVzc2FnZSByZWNlaXZlZCJ9LAorCXsweDA0NDQwMDAwLCAxLCAxLAorCSJGRkY0OiBEaXNrIGRldmljZSBwcm9ibGVtIn0sCisJezB4MDQ0NDgyMDAsIDEsIDEsCisJIjgxNTA6IFBlcm1hbmVudCBJT0EgZmFpbHVyZSJ9LAorCXsweDA0NDQ4MzAwLCAwLCAxLAorCSIzMDEwOiBEaXNrIGRldmljZSByZXR1cm5lZCB3cm9uZyByZXNwb25zZSB0byBJT0EifSwKKwl7MHgwNDQ0ODQwMCwgMCwgMSwKKwkiODE1MTogSU9BIG1pY3JvY29kZSBlcnJvciJ9LAorCXsweDA0NDQ4NTAwLCAwLCAwLAorCSJEZXZpY2UgYnVzIHN0YXR1cyBlcnJvciJ9LAorCXsweDA0NDQ4NjAwLCAwLCAxLAorCSI4MTU3OiBJT0EgZXJyb3IgcmVxdWlyaW5nIElPQSByZXNldCB0byByZWNvdmVyIn0sCisJezB4MDQ0OTAwMDAsIDAsIDAsCisJIk1lc3NhZ2UgcmVqZWN0IHJlY2VpdmVkIGZyb20gdGhlIGRldmljZSJ9LAorCXsweDA0NDQ5MjAwLCAwLCAxLAorCSI4MDA4OiBBIHBlcm1hbmVudCBjYWNoZSBiYXR0ZXJ5IHBhY2sgZmFpbHVyZSBvY2N1cnJlZCJ9LAorCXsweDA0NDRBMDAwLCAwLCAxLAorCSI5MDkwOiBEaXNrIHVuaXQgaGFzIGJlZW4gbW9kaWZpZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gc3RhdHVzIn0sCisJezB4MDQ0NEEyMDAsIDAsIDEsCisJIjkwODE6IElPQSBkZXRlY3RlZCBkZXZpY2UgZXJyb3IifSwKKwl7MHgwNDQ0QTMwMCwgMCwgMSwKKwkiOTA4MjogSU9BIGRldGVjdGVkIGRldmljZSBlcnJvciJ9LAorCXsweDA0NEEwMDAwLCAxLCAxLAorCSIzMTEwOiBEZXZpY2UgYnVzIGVycm9yLCBtZXNzYWdlIG9yIGNvbW1hbmQgcGhhc2UifSwKKwl7MHgwNDY3MDQwMCwgMCwgMSwKKwkiOTA5MTogSW5jb3JyZWN0IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGhhcyBiZWVuIGRldGVjdGVkIn0sCisJezB4MDQ2RTAwMDAsIDAsIDEsCisJIkZGRjQ6IENvbW1hbmQgdG8gbG9naWNhbCB1bml0IGZhaWxlZCJ9LAorCXsweDA1MjQwMDAwLCAxLCAwLAorCSJJbGxlZ2FsIHJlcXVlc3QsIGludmFsaWQgcmVxdWVzdCB0eXBlIG9yIHJlcXVlc3QgcGFja2V0In0sCisJezB4MDUyNTAwMDAsIDAsIDAsCisJIklsbGVnYWwgcmVxdWVzdCwgaW52YWxpZCByZXNvdXJjZSBoYW5kbGUifSwKKwl7MHgwNTI2MDAwMCwgMCwgMCwKKwkiSWxsZWdhbCByZXF1ZXN0LCBpbnZhbGlkIGZpZWxkIGluIHBhcmFtZXRlciBsaXN0In0sCisJezB4MDUyNjAxMDAsIDAsIDAsCisJIklsbGVnYWwgcmVxdWVzdCwgcGFyYW1ldGVyIG5vdCBzdXBwb3J0ZWQifSwKKwl7MHgwNTI2MDIwMCwgMCwgMCwKKwkiSWxsZWdhbCByZXF1ZXN0LCBwYXJhbWV0ZXIgdmFsdWUgaW52YWxpZCJ9LAorCXsweDA1MkMwMDAwLCAwLCAwLAorCSJJbGxlZ2FsIHJlcXVlc3QsIGNvbW1hbmQgc2VxdWVuY2UgZXJyb3IifSwKKwl7MHgwNjA0MDUwMCwgMCwgMSwKKwkiOTAzMTogQXJyYXkgcHJvdGVjdGlvbiB0ZW1wb3JhcmlseSBzdXNwZW5kZWQsIHByb3RlY3Rpb24gcmVzdW1pbmcifSwKKwl7MHgwNjA0MDYwMCwgMCwgMSwKKwkiOTA0MDogQXJyYXkgcHJvdGVjdGlvbiB0ZW1wb3JhcmlseSBzdXNwZW5kZWQsIHByb3RlY3Rpb24gcmVzdW1pbmcifSwKKwl7MHgwNjI5MDAwMCwgMCwgMSwKKwkiRkZGQjogU0NTSSBidXMgd2FzIHJlc2V0In0sCisJezB4MDYyOTA1MDAsIDAsIDAsCisJIkZGRkU6IFNDU0kgYnVzIHRyYW5zaXRpb24gdG8gc2luZ2xlIGVuZGVkIn0sCisJezB4MDYyOTA2MDAsIDAsIDAsCisJIkZGRkU6IFNDU0kgYnVzIHRyYW5zaXRpb24gdG8gTFZEIn0sCisJezB4MDYyOTgwMDAsIDAsIDEsCisJIkZGRkI6IFNDU0kgYnVzIHdhcyByZXNldCBieSBhbm90aGVyIGluaXRpYXRvciJ9LAorCXsweDA2M0YwMzAwLCAwLCAxLAorCSIzMDI5OiBBIGRldmljZSByZXBsYWNlbWVudCBoYXMgb2NjdXJyZWQifSwKKwl7MHgwNjRDODAwMCwgMCwgMSwKKwkiOTA1MTogSU9BIGNhY2hlIGRhdGEgZXhpc3RzIGZvciBhIG1pc3Npbmcgb3IgZmFpbGVkIGRldmljZSJ9LAorCXsweDA2NjcwMTAwLCAwLCAxLAorCSI5MDI1OiBEaXNrIHVuaXQgaXMgbm90IHN1cHBvcnRlZCBhdCBpdHMgcGh5c2ljYWwgbG9jYXRpb24ifSwKKwl7MHgwNjY3MDYwMCwgMCwgMSwKKwkiMzAyMDogSU9BIGRldGVjdGVkIGEgU0NTSSBidXMgY29uZmlndXJhdGlvbiBlcnJvciJ9LAorCXsweDA2Njc4MDAwLCAwLCAxLAorCSIzMTUwOiBTQ1NJIGJ1cyBjb25maWd1cmF0aW9uIGVycm9yIn0sCisJezB4MDY2OTAyMDAsIDAsIDEsCisJIjkwNDE6IEFycmF5IHByb3RlY3Rpb24gdGVtcG9yYXJpbHkgc3VzcGVuZGVkIn0sCisJezB4MDY2OTgyMDAsIDAsIDEsCisJIjkwNDI6IENvcnJ1cHQgYXJyYXkgcGFyaXR5IGRldGVjdGVkIG9uIHNwZWNpZmllZCBkZXZpY2UifSwKKwl7MHgwNjZCMDIwMCwgMCwgMSwKKwkiOTAzMDogQXJyYXkgbm8gbG9uZ2VyIHByb3RlY3RlZCBkdWUgdG8gbWlzc2luZyBvciBmYWlsZWQgZGlzayB1bml0In0sCisJezB4MDY2QjgyMDAsIDAsIDEsCisJIjkwMzI6IEFycmF5IGV4cG9zZWQgYnV0IHN0aWxsIHByb3RlY3RlZCJ9LAorCXsweDA3MjcwMDAwLCAwLCAwLAorCSJGYWlsdXJlIGR1ZSB0byBvdGhlciBkZXZpY2UifSwKKwl7MHgwNzI3ODAwMCwgMCwgMSwKKwkiOTAwODogSU9BIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb25zIGV4cGVjdGVkIGJ5IGRldmljZXMifSwKKwl7MHgwNzI3ODEwMCwgMCwgMSwKKwkiOTAxMDogQ2FjaGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYXR0YWNoZWQgZGV2aWNlcyBjYW5ub3QgYmUgZm91bmQifSwKKwl7MHgwNzI3ODIwMCwgMCwgMSwKKwkiOTAxMTogQ2FjaGUgZGF0YSBiZWxvbmdzIHRvIGRldmljZXMgb3RoZXIgdGhhbiB0aG9zZSBhdHRhY2hlZCJ9LAorCXsweDA3Mjc4NDAwLCAwLCAxLAorCSI5MDIwOiBBcnJheSBtaXNzaW5nIDIgb3IgbW9yZSBkZXZpY2VzIHdpdGggb25seSAxIGRldmljZSBwcmVzZW50In0sCisJezB4MDcyNzg1MDAsIDAsIDEsCisJIjkwMjE6IEFycmF5IG1pc3NpbmcgMiBvciBtb3JlIGRldmljZXMgd2l0aCAyIG9yIG1vcmUgZGV2aWNlcyBwcmVzZW50In0sCisJezB4MDcyNzg2MDAsIDAsIDEsCisJIjkwMjI6IEV4cG9zZWQgYXJyYXkgaXMgbWlzc2luZyBhIHJlcXVpcmVkIGRldmljZSJ9LAorCXsweDA3Mjc4NzAwLCAwLCAxLAorCSI5MDIzOiBBcnJheSBtZW1iZXIocykgbm90IGF0IHJlcXVpcmVkIHBoeXNpY2FsIGxvY2F0aW9ucyJ9LAorCXsweDA3Mjc4ODAwLCAwLCAxLAorCSI5MDI0OiBBcnJheSBub3QgZnVuY3Rpb25hbCBkdWUgdG8gcHJlc2VudCBoYXJkd2FyZSBjb25maWd1cmF0aW9uIn0sCisJezB4MDcyNzg5MDAsIDAsIDEsCisJIjkwMjY6IEFycmF5IG5vdCBmdW5jdGlvbmFsIGR1ZSB0byBwcmVzZW50IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24ifSwKKwl7MHgwNzI3OEEwMCwgMCwgMSwKKwkiOTAyNzogQXJyYXkgaXMgbWlzc2luZyBhIGRldmljZSBhbmQgcGFyaXR5IGlzIG91dCBvZiBzeW5jIn0sCisJezB4MDcyNzhCMDAsIDAsIDEsCisJIjkwMjg6IE1heGltdW0gbnVtYmVyIG9mIGFycmF5cyBhbHJlYWR5IGV4aXN0In0sCisJezB4MDcyNzhDMDAsIDAsIDEsCisJIjkwNTA6IFJlcXVpcmVkIGNhY2hlIGRhdGEgY2Fubm90IGJlIGxvY2F0ZWQgZm9yIGEgZGlzayB1bml0In0sCisJezB4MDcyNzhEMDAsIDAsIDEsCisJIjkwNTI6IENhY2hlIGRhdGEgZXhpc3RzIGZvciBhIGRldmljZSB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIn0sCisJezB4MDcyNzhGMDAsIDAsIDEsCisJIjkwNTQ6IElPQSByZXNvdXJjZXMgbm90IGF2YWlsYWJsZSBkdWUgdG8gcHJldmlvdXMgcHJvYmxlbXMifSwKKwl7MHgwNzI3OTEwMCwgMCwgMSwKKwkiOTA5MjogRGlzayB1bml0IHJlcXVpcmVzIGluaXRpYWxpemF0aW9uIGJlZm9yZSB1c2UifSwKKwl7MHgwNzI3OTIwMCwgMCwgMSwKKwkiOTAyOTogSW5jb3JyZWN0IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGhhcyBiZWVuIGRldGVjdGVkIn0sCisJezB4MDcyNzk2MDAsIDAsIDEsCisJIjkwNjA6IE9uZSBvciBtb3JlIGRpc2sgcGFpcnMgYXJlIG1pc3NpbmcgZnJvbSBhbiBhcnJheSJ9LAorCXsweDA3Mjc5NzAwLCAwLCAxLAorCSI5MDYxOiBPbmUgb3IgbW9yZSBkaXNrcyBhcmUgbWlzc2luZyBmcm9tIGFuIGFycmF5In0sCisJezB4MDcyNzk4MDAsIDAsIDEsCisJIjkwNjI6IE9uZSBvciBtb3JlIGRpc2tzIGFyZSBtaXNzaW5nIGZyb20gYW4gYXJyYXkifSwKKwl7MHgwNzI3OTkwMCwgMCwgMSwKKwkiOTA2MzogTWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb25hbCBhcnJheXMgaGFzIGJlZW4gZXhjZWVkZWQifSwKKwl7MHgwQjI2MDAwMCwgMCwgMCwKKwkiQWJvcnRlZCBjb21tYW5kLCBpbnZhbGlkIGRlc2NyaXB0b3IifSwKKwl7MHgwQjVBMDAwMCwgMCwgMCwKKwkiQ29tbWFuZCB0ZXJtaW5hdGVkIGJ5IGhvc3QifQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcHJfc2VzX3RhYmxlX2VudHJ5IGlwcl9zZXNfdGFibGVbXSA9IHsKKwl7ICIyMTA0LURMMSAgICAgICAgIiwgIlhYWFhYWFhYWFhYWFhYWFgiLCA4MCB9LAorCXsgIjIxMDQtVEwxICAgICAgICAiLCAiWFhYWFhYWFhYWFhYWFhYWCIsIDgwIH0sCisJeyAiSFNCUDA3TSBQIFUyU0NTSSIsICJYWFhYWFhYWFhYWFhYWFhYIiwgODAgfSwgLyogSGlkaXZlIDcgc2xvdCAqLworCXsgIkhTQlAwNU0gUCBVMlNDU0kiLCAiWFhYWFhYWFhYWFhYWFhYWCIsIDgwIH0sIC8qIEhpZGl2ZSA1IHNsb3QgKi8KKwl7ICJIU0JQMDVNIFMgVTJTQ1NJIiwgIlhYWFhYWFhYWFhYWFhYWFgiLCA4MCB9LCAvKiBCb3d0aWUgKi8KKwl7ICJIU0JQMDZFIEFTVTJTQ1NJIiwgIlhYWFhYWFhYWFhYWFhYWFgiLCA4MCB9LCAvKiBNYXJ0aW5GZW5uaW5nICovCisJeyAiMjEwNC1EVTMgICAgICAgICIsICJYWFhYWFhYWFhYWFhYWFhYIiwgMTYwIH0sCisJeyAiMjEwNC1UVTMgICAgICAgICIsICJYWFhYWFhYWFhYWFhYWFhYIiwgMTYwIH0sCisJeyAiSFNCUDA0QyBSU1UyU0NTSSIsICJYWFhYWFhYKlhYWFhYWFhYIiwgMTYwIH0sCisJeyAiSFNCUDA2RSBSU1UyU0NTSSIsICJYWFhYWFhYKlhYWFhYWFhYIiwgMTYwIH0sCisJeyAiU3QgIFYxUzIgICAgICAgICIsICJYWFhYWFhYWFhYWFhYWFhYIiwgMTYwIH0sCisJeyAiSFNCUEQ0TSAgUFUzU0NTSSIsICJYWFhYWFhYKlhYWFhYWFhYIiwgMTYwIH0sCisJeyAiVlNCUEQxSCAgIFUzU0NTSSIsICJYWFhYWFhYKlhYWFhYWFhYIiwgMTYwIH0KK307CisKKy8qCisgKiAgRnVuY3Rpb24gUHJvdG90eXBlcworICovCitzdGF0aWMgaW50IGlwcl9yZXNldF9hbGVydChzdHJ1Y3QgaXByX2NtbmQgKik7CitzdGF0aWMgdm9pZCBpcHJfcHJvY2Vzc19jY24oc3RydWN0IGlwcl9jbW5kICopOworc3RhdGljIHZvaWQgaXByX3Byb2Nlc3NfZXJyb3Ioc3RydWN0IGlwcl9jbW5kICopOworc3RhdGljIHZvaWQgaXByX3Jlc2V0X2lvYV9qb2Ioc3RydWN0IGlwcl9jbW5kICopOworc3RhdGljIHZvaWQgaXByX2luaXRpYXRlX2lvYV9yZXNldChzdHJ1Y3QgaXByX2lvYV9jZmcgKiwKKwkJCQkgICBlbnVtIGlwcl9zaHV0ZG93bl90eXBlKTsKKworI2lmZGVmIENPTkZJR19TQ1NJX0lQUl9UUkFDRQorLyoqCisgKiBpcHJfdHJjX2hvb2sgLSBBZGQgYSB0cmFjZSBlbnRyeSB0byB0aGUgZHJpdmVyIHRyYWNlCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKiBAdHlwZToJCXRyYWNlIHR5cGUKKyAqIEBhZGRfZGF0YToJYWRkaXRpb25hbCBkYXRhCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl90cmNfaG9vayhzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsCisJCQkgdTggdHlwZSwgdTMyIGFkZF9kYXRhKQoreworCXN0cnVjdCBpcHJfdHJhY2VfZW50cnkgKnRyYWNlX2VudHJ5OworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwl0cmFjZV9lbnRyeSA9ICZpb2FfY2ZnLT50cmFjZVtpb2FfY2ZnLT50cmFjZV9pbmRleCsrXTsKKwl0cmFjZV9lbnRyeS0+dGltZSA9IGppZmZpZXM7CisJdHJhY2VfZW50cnktPm9wX2NvZGUgPSBpcHJfY21kLT5pb2FyY2IuY21kX3BrdC5jZGJbMF07CisJdHJhY2VfZW50cnktPnR5cGUgPSB0eXBlOworCXRyYWNlX2VudHJ5LT5jbWRfaW5kZXggPSBpcHJfY21kLT5jbWRfaW5kZXg7CisJdHJhY2VfZW50cnktPnJlc19oYW5kbGUgPSBpcHJfY21kLT5pb2FyY2IucmVzX2hhbmRsZTsKKwl0cmFjZV9lbnRyeS0+dS5hZGRfZGF0YSA9IGFkZF9kYXRhOworfQorI2Vsc2UKKyNkZWZpbmUgaXByX3RyY19ob29rKGlwcl9jbWQsIHR5cGUsIGFkZF9kYXRhKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKioKKyAqIGlwcl9yZWluaXRfaXByX2NtbmQgLSBSZS1pbml0aWFsaXplIGFuIElQUiBDbW5kIGJsb2NrIGZvciByZXVzZQorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcmVpbml0X2lwcl9jbW5kKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKwlzdHJ1Y3QgaXByX2lvYXNhICppb2FzYSA9ICZpcHJfY21kLT5pb2FzYTsKKworCW1lbXNldCgmaW9hcmNiLT5jbWRfcGt0LCAwLCBzaXplb2Yoc3RydWN0IGlwcl9jbWRfcGt0KSk7CisJaW9hcmNiLT53cml0ZV9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IDA7CisJaW9hcmNiLT5yZWFkX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gMDsKKwlpb2FyY2ItPndyaXRlX2lvYWRsX2xlbiA9IDA7CisJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9IDA7CisJaW9hc2EtPmlvYXNjID0gMDsKKwlpb2FzYS0+cmVzaWR1YWxfZGF0YV9sZW4gPSAwOworCisJaXByX2NtZC0+c2NzaV9jbWQgPSBOVUxMOworCWlwcl9jbWQtPnNlbnNlX2J1ZmZlclswXSA9IDA7CisJaXByX2NtZC0+ZG1hX3VzZV9zZyA9IDA7Cit9CisKKy8qKgorICogaXByX2luaXRfaXByX2NtbmQgLSBJbml0aWFsaXplIGFuIElQUiBDbW5kIGJsb2NrCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0X2lwcl9jbW5kKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlpcHJfcmVpbml0X2lwcl9jbW5kKGlwcl9jbWQpOworCWlwcl9jbWQtPnUuc2NyYXRjaCA9IDA7CisJaXByX2NtZC0+c2libGluZyA9IE5VTEw7CisJaW5pdF90aW1lcigmaXByX2NtZC0+dGltZXIpOworfQorCisvKioKKyAqIGlwcl9nZXRfZnJlZV9pcHJfY21uZCAtIEdldCBhIGZyZWUgSVBSIENtbmQgYmxvY2sKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlwb2ludGVyIHRvIGlwciBjb21tYW5kIHN0cnVjdAorICoqLworc3RhdGljCitzdHJ1Y3QgaXByX2NtbmQgKmlwcl9nZXRfZnJlZV9pcHJfY21uZChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IGlwcl9jbW5kICppcHJfY21kOworCisJaXByX2NtZCA9IGxpc3RfZW50cnkoaW9hX2NmZy0+ZnJlZV9xLm5leHQsIHN0cnVjdCBpcHJfY21uZCwgcXVldWUpOworCWxpc3RfZGVsKCZpcHJfY21kLT5xdWV1ZSk7CisJaXByX2luaXRfaXByX2NtbmQoaXByX2NtZCk7CisKKwlyZXR1cm4gaXByX2NtZDsKK30KKworLyoqCisgKiBpcHJfdW5tYXBfc2dsaXN0IC0gVW5tYXAgc2NhdHRlcmxpc3QgaWYgbWFwcGVkCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX3VubWFwX3NnbGlzdChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkgICAgIHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCA9IGlwcl9jbWQtPnNjc2lfY21kOworCisJaWYgKGlwcl9jbWQtPmRtYV91c2Vfc2cpIHsKKwkJaWYgKHNjc2lfY21kLT51c2Vfc2cgPiAwKSB7CisJCQlwY2lfdW5tYXBfc2coaW9hX2NmZy0+cGRldiwgc2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSAgICAgc2NzaV9jbWQtPnVzZV9zZywKKwkJCQkgICAgIHNjc2lfY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGlvYV9jZmctPnBkZXYsIGlwcl9jbWQtPmRtYV9oYW5kbGUsCisJCQkJCSBzY3NpX2NtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkgc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBpcHJfbWFza19hbmRfY2xlYXJfaW50ZXJydXB0cyAtIE1hc2sgYWxsIGFuZCBjbGVhciBzcGVjaWZpZWQgaW50ZXJydXB0cworICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAY2xyX2ludHM6ICAgICBpbnRlcnJ1cHRzIHRvIGNsZWFyCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXNrcyBhbGwgaW50ZXJydXB0cyBvbiB0aGUgYWRhcHRlciwgdGhlbiBjbGVhcnMgdGhlCisgKiBpbnRlcnJ1cHRzIHNwZWNpZmllZCBpbiB0aGUgbWFzaworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfbWFza19hbmRfY2xlYXJfaW50ZXJydXB0cyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJCSAgdTMyIGNscl9pbnRzKQoreworCXZvbGF0aWxlIHUzMiBpbnRfcmVnOworCisJLyogU3RvcCBuZXcgaW50ZXJydXB0cyAqLworCWlvYV9jZmctPmFsbG93X2ludGVycnVwdHMgPSAwOworCisJLyogU2V0IGludGVycnVwdCBtYXNrIHRvIHN0b3AgYWxsIG5ldyBpbnRlcnJ1cHRzICovCisJd3JpdGVsKH4wLCBpb2FfY2ZnLT5yZWdzLnNldF9pbnRlcnJ1cHRfbWFza19yZWcpOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXdyaXRlbChjbHJfaW50cywgaW9hX2NmZy0+cmVncy5jbHJfaW50ZXJydXB0X3JlZyk7CisJaW50X3JlZyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X3JlZyk7Cit9CisKKy8qKgorICogaXByX3NhdmVfcGNpeF9jbWRfcmVnIC0gU2F2ZSBQQ0ktWCBjb21tYW5kIHJlZ2lzdGVyCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gLUVJTyBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl9zYXZlX3BjaXhfY21kX3JlZyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJaW50IHBjaXhfY21kX3JlZyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoaW9hX2NmZy0+cGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKKworCWlmIChwY2l4X2NtZF9yZWcgPT0gMCkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gc2F2ZSBQQ0ktWCBjb21tYW5kIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKGlvYV9jZmctPnBkZXYsIHBjaXhfY21kX3JlZyArIFBDSV9YX0NNRCwKKwkJCQkgJmlvYV9jZmctPnNhdmVkX3BjaXhfY21kX3JlZykgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSS1YIGNvbW1hbmQgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpb2FfY2ZnLT5zYXZlZF9wY2l4X2NtZF9yZWcgfD0gUENJX1hfQ01EX0RQRVJSX0UgfCBQQ0lfWF9DTURfRVJPOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9zZXRfcGNpeF9jbWRfcmVnIC0gU2V0dXAgUENJLVggY29tbWFuZCByZWdpc3RlcgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIC1FSU8gb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfc2V0X3BjaXhfY21kX3JlZyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJaW50IHBjaXhfY21kX3JlZyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoaW9hX2NmZy0+cGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKKworCWlmIChwY2l4X2NtZF9yZWcpIHsKKwkJaWYgKHBjaV93cml0ZV9jb25maWdfd29yZChpb2FfY2ZnLT5wZGV2LCBwY2l4X2NtZF9yZWcgKyBQQ0lfWF9DTUQsCisJCQkJCSAgaW9hX2NmZy0+c2F2ZWRfcGNpeF9jbWRfcmVnKSAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIkZhaWxlZCB0byBzZXR1cCBQQ0ktWCBjb21tYW5kIHJlZ2lzdGVyXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBzZXR1cCBQQ0ktWCBjb21tYW5kIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX3Njc2lfZWhfZG9uZSAtIG1pZC1sYXllciBkb25lIGZ1bmN0aW9uIGZvciBhYm9ydGVkIG9wcworICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yCisgKiBvcHMgZ2VuZXJhdGVkIGJ5IHRoZSBTQ1NJIG1pZC1sYXllciB3aGljaCBhcmUgYmVpbmcgYWJvcnRlZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Njc2lfZWhfZG9uZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCA9IGlwcl9jbWQtPnNjc2lfY21kOworCisJc2NzaV9jbWQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KTsKKworCWlwcl91bm1hcF9zZ2xpc3QoaW9hX2NmZywgaXByX2NtZCk7CisJc2NzaV9jbWQtPnNjc2lfZG9uZShzY3NpX2NtZCk7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworfQorCisvKioKKyAqIGlwcl9mYWlsX2FsbF9vcHMgLSBGYWlscyBhbGwgb3V0c3RhbmRpbmcgb3BzLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBmYWlscyBhbGwgb3V0c3RhbmRpbmcgb3BzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZmFpbF9hbGxfb3BzKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsICp0ZW1wOworCisJRU5URVI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlwcl9jbWQsIHRlbXAsICZpb2FfY2ZnLT5wZW5kaW5nX3EsIHF1ZXVlKSB7CisJCWxpc3RfZGVsKCZpcHJfY21kLT5xdWV1ZSk7CisKKwkJaXByX2NtZC0+aW9hc2EuaW9hc2MgPSBjcHVfdG9fYmUzMihJUFJfSU9BU0NfSU9BX1dBU19SRVNFVCk7CisJCWlwcl9jbWQtPmlvYXNhLmlsaWQgPSBjcHVfdG9fYmUzMihJUFJfRFJJVkVSX0lMSUQpOworCisJCWlmIChpcHJfY21kLT5zY3NpX2NtZCkKKwkJCWlwcl9jbWQtPmRvbmUgPSBpcHJfc2NzaV9laF9kb25lOworCisJCWlwcl90cmNfaG9vayhpcHJfY21kLCBJUFJfVFJBQ0VfRklOSVNILCBJUFJfSU9BU0NfSU9BX1dBU19SRVNFVCk7CisJCWRlbF90aW1lcigmaXByX2NtZC0+dGltZXIpOworCQlpcHJfY21kLT5kb25lKGlwcl9jbWQpOworCX0KKworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9kb19yZXEgLSAgU2VuZCBkcml2ZXIgaW5pdGlhdGVkIHJlcXVlc3RzLgorICogQGlwcl9jbWQ6CQlpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqIEBkb25lOgkJCWRvbmUgZnVuY3Rpb24KKyAqIEB0aW1lb3V0X2Z1bmM6CXRpbWVvdXQgZnVuY3Rpb24KKyAqIEB0aW1lb3V0OgkJdGltZW91dCB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvIHRoZSBhZGFwdGVyIHdpdGggdGhlCisgKiB0aW1lb3V0IGdpdmVuLiBUaGUgZG9uZSBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIGNvbW1hbmQgY29tcGxldGlvbi4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2RvX3JlcShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsCisJCSAgICAgICB2b2lkICgqZG9uZSkgKHN0cnVjdCBpcHJfY21uZCAqKSwKKwkJICAgICAgIHZvaWQgKCp0aW1lb3V0X2Z1bmMpIChzdHJ1Y3QgaXByX2NtbmQgKiksIHUzMiB0aW1lb3V0KQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPnBlbmRpbmdfcSk7CisKKwlpcHJfY21kLT5kb25lID0gZG9uZTsKKworCWlwcl9jbWQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaXByX2NtZDsKKwlpcHJfY21kLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisJaXByX2NtZC0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpdGltZW91dF9mdW5jOworCisJYWRkX3RpbWVyKCZpcHJfY21kLT50aW1lcik7CisKKwlpcHJfdHJjX2hvb2soaXByX2NtZCwgSVBSX1RSQUNFX1NUQVJULCAwKTsKKworCW1iKCk7CisJd3JpdGVsKGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXJjYi5pb2FyY2JfaG9zdF9wY2lfYWRkciksCisJICAgICAgIGlvYV9jZmctPnJlZ3MuaW9hcnJpbl9yZWcpOworfQorCisvKioKKyAqIGlwcl9pbnRlcm5hbF9jbWRfZG9uZSAtIE9wIGRvbmUgZnVuY3Rpb24gZm9yIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkIG9wLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wIGRvbmUgZnVuY3Rpb24gZm9yIGFuIGludGVybmFsbHkgZ2VuZXJhdGVkLAorICogYmxvY2tpbmcgb3AuIEl0IHNpbXBseSB3YWtlcyB0aGUgc2xlZXBpbmcgdGhyZWFkLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW50ZXJuYWxfY21kX2RvbmUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCWlmIChpcHJfY21kLT5zaWJsaW5nKQorCQlpcHJfY21kLT5zaWJsaW5nID0gTlVMTDsKKwllbHNlCisJCWNvbXBsZXRlKCZpcHJfY21kLT5jb21wbGV0aW9uKTsKK30KKworLyoqCisgKiBpcHJfc2VuZF9ibG9ja2luZ19jbWQgLSBTZW5kIGNvbW1hbmQgYW5kIHNsZWVwIG9uIGl0cyBjb21wbGV0aW9uLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICogQHRpbWVvdXRfZnVuYzoJZnVuY3Rpb24gdG8gaW52b2tlIGlmIGNvbW1hbmQgdGltZXMgb3V0CisgKiBAdGltZW91dDoJdGltZW91dAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2VuZF9ibG9ja2luZ19jbWQoc3RydWN0IGlwcl9jbW5kICppcHJfY21kLAorCQkJCSAgdm9pZCAoKnRpbWVvdXRfZnVuYykgKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCksCisJCQkJICB1MzIgdGltZW91dCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJaW5pdF9jb21wbGV0aW9uKCZpcHJfY21kLT5jb21wbGV0aW9uKTsKKwlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9pbnRlcm5hbF9jbWRfZG9uZSwgdGltZW91dF9mdW5jLCB0aW1lb3V0KTsKKworCXNwaW5fdW5sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlwcl9jbWQtPmNvbXBsZXRpb24pOworCXNwaW5fbG9ja19pcnEoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrKTsKK30KKworLyoqCisgKiBpcHJfc2VuZF9oY2FtIC0gU2VuZCBhbiBIQ0FNIHRvIHRoZSBhZGFwdGVyLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAdHlwZToJCUhDQU0gdHlwZQorICogQGhvc3RyY2I6CWhvc3RyY2Igc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHNlbmQgYSBIb3N0IENvbnRyb2xsZWQgQXN5bmMgY29tbWFuZCB0byB0aGUgYWRhcHRlci4KKyAqIElmIEhDQU1zIGFyZSBjdXJyZW50bHkgbm90IGFsbG93ZWQgdG8gYmUgaXNzdWVkIHRvIHRoZSBhZGFwdGVyLCBpdCB3aWxsCisgKiBwbGFjZSB0aGUgaG9zdHJjYiBvbiB0aGUgZnJlZSBxdWV1ZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3NlbmRfaGNhbShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsIHU4IHR5cGUsCisJCQkgIHN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYjsKKworCWlmIChpb2FfY2ZnLT5hbGxvd19jbWRzKSB7CisJCWlwcl9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CisJCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+cGVuZGluZ19xKTsKKwkJbGlzdF9hZGRfdGFpbCgmaG9zdHJjYi0+cXVldWUsICZpb2FfY2ZnLT5ob3N0cmNiX3BlbmRpbmdfcSk7CisKKwkJaXByX2NtZC0+dS5ob3N0cmNiID0gaG9zdHJjYjsKKwkJaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKworCQlpb2FyY2ItPnJlc19oYW5kbGUgPSBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpOworCQlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9IQ0FNOworCQlpb2FyY2ItPmNtZF9wa3QuY2RiWzBdID0gSVBSX0hPU1RfQ09OVFJPTExFRF9BU1lOQzsKKwkJaW9hcmNiLT5jbWRfcGt0LmNkYlsxXSA9IHR5cGU7CisJCWlvYXJjYi0+Y21kX3BrdC5jZGJbN10gPSAoc2l6ZW9mKGhvc3RyY2ItPmhjYW0pID4+IDgpICYgMHhmZjsKKwkJaW9hcmNiLT5jbWRfcGt0LmNkYls4XSA9IHNpemVvZihob3N0cmNiLT5oY2FtKSAmIDB4ZmY7CisKKwkJaW9hcmNiLT5yZWFkX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gY3B1X3RvX2JlMzIoc2l6ZW9mKGhvc3RyY2ItPmhjYW0pKTsKKwkJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwkJaXByX2NtZC0+aW9hZGxbMF0uZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19SRUFEX0xBU1QgfCBzaXplb2YoaG9zdHJjYi0+aGNhbSkpOworCQlpcHJfY21kLT5pb2FkbFswXS5hZGRyZXNzID0gY3B1X3RvX2JlMzIoaG9zdHJjYi0+aG9zdHJjYl9kbWEpOworCisJCWlmICh0eXBlID09IElQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UpCisJCQlpcHJfY21kLT5kb25lID0gaXByX3Byb2Nlc3NfY2NuOworCQllbHNlCisJCQlpcHJfY21kLT5kb25lID0gaXByX3Byb2Nlc3NfZXJyb3I7CisKKwkJaXByX3RyY19ob29rKGlwcl9jbWQsIElQUl9UUkFDRV9TVEFSVCwgSVBSX0lPQV9SRVNfQUREUik7CisKKwkJbWIoKTsKKwkJd3JpdGVsKGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXJjYi5pb2FyY2JfaG9zdF9wY2lfYWRkciksCisJCSAgICAgICBpb2FfY2ZnLT5yZWdzLmlvYXJyaW5fcmVnKTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZob3N0cmNiLT5xdWV1ZSwgJmlvYV9jZmctPmhvc3RyY2JfZnJlZV9xKTsKKwl9Cit9CisKKy8qKgorICogaXByX2luaXRfcmVzX2VudHJ5IC0gSW5pdGlhbGl6ZSBhIHJlc291cmNlIGVudHJ5IHN0cnVjdC4KKyAqIEByZXM6CXJlc291cmNlIGVudHJ5IHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW5pdF9yZXNfZW50cnkoc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzKQoreworCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJcmVzLT5pbl9lcnAgPSAwOworCXJlcy0+YWRkX3RvX21sID0gMDsKKwlyZXMtPmRlbF9mcm9tX21sID0gMDsKKwlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAwOworCXJlcy0+c2RldiA9IE5VTEw7Cit9CisKKy8qKgorICogaXByX2hhbmRsZV9jb25maWdfY2hhbmdlIC0gSGFuZGxlIGEgY29uZmlnIGNoYW5nZSBmcm9tIHRoZSBhZGFwdGVyCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBob3N0cmNiOglob3N0cmNiCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9oYW5kbGVfY29uZmlnX2NoYW5nZShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkgICAgICBzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IpCit7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzID0gTlVMTDsKKwlzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSAqY2ZndGU7CisJdTMyIGlzX25kbiA9IDE7CisKKwljZmd0ZSA9ICZob3N0cmNiLT5oY2FtLnUuY2NuLmNmZ3RlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZpb2FfY2ZnLT51c2VkX3Jlc19xLCBxdWV1ZSkgeworCQlpZiAoIW1lbWNtcCgmcmVzLT5jZmd0ZS5yZXNfYWRkciwgJmNmZ3RlLT5yZXNfYWRkciwKKwkJCSAgICBzaXplb2YoY2ZndGUtPnJlc19hZGRyKSkpIHsKKwkJCWlzX25kbiA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpc19uZG4pIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmlvYV9jZmctPmZyZWVfcmVzX3EpKSB7CisJCQlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsCisJCQkJICAgICAgSVBSX0hDQU1fQ0RCX09QX0NPREVfQ09ORklHX0NIQU5HRSwKKwkJCQkgICAgICBob3N0cmNiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlcyA9IGxpc3RfZW50cnkoaW9hX2NmZy0+ZnJlZV9yZXNfcS5uZXh0LAorCQkJCSBzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5LCBxdWV1ZSk7CisKKwkJbGlzdF9kZWwoJnJlcy0+cXVldWUpOworCQlpcHJfaW5pdF9yZXNfZW50cnkocmVzKTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVzLT5xdWV1ZSwgJmlvYV9jZmctPnVzZWRfcmVzX3EpOworCX0KKworCW1lbWNweSgmcmVzLT5jZmd0ZSwgY2ZndGUsIHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSkpOworCisJaWYgKGhvc3RyY2ItPmhjYW0ubm90aWZ5X3R5cGUgPT0gSVBSX0hPU1RfUkNCX05PVElGX1RZUEVfUkVNX0VOVFJZKSB7CisJCWlmIChyZXMtPnNkZXYpIHsKKwkJCXJlcy0+c2Rldi0+aG9zdGRhdGEgPSBOVUxMOworCQkJcmVzLT5kZWxfZnJvbV9tbCA9IDE7CisJCQlpZiAoaW9hX2NmZy0+YWxsb3dfbWxfYWRkX2RlbCkKKwkJCQlzY2hlZHVsZV93b3JrKCZpb2FfY2ZnLT53b3JrX3EpOworCQl9IGVsc2UKKwkJCWxpc3RfbW92ZV90YWlsKCZyZXMtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CisJfSBlbHNlIGlmICghcmVzLT5zZGV2KSB7CisJCXJlcy0+YWRkX3RvX21sID0gMTsKKwkJaWYgKGlvYV9jZmctPmFsbG93X21sX2FkZF9kZWwpCisJCQlzY2hlZHVsZV93b3JrKCZpb2FfY2ZnLT53b3JrX3EpOworCX0KKworCWlwcl9zZW5kX2hjYW0oaW9hX2NmZywgSVBSX0hDQU1fQ0RCX09QX0NPREVfQ09ORklHX0NIQU5HRSwgaG9zdHJjYik7Cit9CisKKy8qKgorICogaXByX3Byb2Nlc3NfY2NuIC0gT3AgZG9uZSBmdW5jdGlvbiBmb3IgYSBDQ04uCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb3AgZG9uZSBmdW5jdGlvbiBmb3IgYSBjb25maWd1cmF0aW9uCisgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGhvc3QgY29udHJvbGxlZCBhc3luYyBmcm9tIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcHJvY2Vzc19jY24oc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiID0gaXByX2NtZC0+dS5ob3N0cmNiOworCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCisJaWYgKGlvYXNjKSB7CisJCWlmIChpb2FzYyAhPSBJUFJfSU9BU0NfSU9BX1dBU19SRVNFVCkKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCQkiSG9zdCBSQ0IgZmFpbGVkIHdpdGggSU9BU0M6IDB4JTA4WFxuIiwgaW9hc2MpOworCisJCWlwcl9zZW5kX2hjYW0oaW9hX2NmZywgSVBSX0hDQU1fQ0RCX09QX0NPREVfQ09ORklHX0NIQU5HRSwgaG9zdHJjYik7CisJfSBlbHNlIHsKKwkJaXByX2hhbmRsZV9jb25maWdfY2hhbmdlKGlvYV9jZmcsIGhvc3RyY2IpOworCX0KK30KKworLyoqCisgKiBpcHJfbG9nX3ZwZCAtIExvZyB0aGUgcGFzc2VkIFZQRCB0byB0aGUgZXJyb3IgbG9nLgorICogQHZwaWRzOgkJCXZlbmRvci9wcm9kdWN0IGlkIHN0cnVjdAorICogQHNlcmlhbF9udW06CQlzZXJpYWwgbnVtYmVyIHN0cmluZworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfbG9nX3ZwZChzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgKnZwaWRzLCB1OCAqc2VyaWFsX251bSkKK3sKKwljaGFyIGJ1ZmZlcltJUFJfVkVORE9SX0lEX0xFTiArIElQUl9QUk9EX0lEX0xFTgorCQkgICAgKyBJUFJfU0VSSUFMX05VTV9MRU5dOworCisJbWVtY3B5KGJ1ZmZlciwgdnBpZHMtPnZlbmRvcl9pZCwgSVBSX1ZFTkRPUl9JRF9MRU4pOworCW1lbWNweShidWZmZXIgKyBJUFJfVkVORE9SX0lEX0xFTiwgdnBpZHMtPnByb2R1Y3RfaWQsCisJICAgICAgIElQUl9QUk9EX0lEX0xFTik7CisJYnVmZmVyW0lQUl9WRU5ET1JfSURfTEVOICsgSVBSX1BST0RfSURfTEVOXSA9ICdcMCc7CisJaXByX2VycigiVmVuZG9yL1Byb2R1Y3QgSUQ6ICVzXG4iLCBidWZmZXIpOworCisJbWVtY3B5KGJ1ZmZlciwgc2VyaWFsX251bSwgSVBSX1NFUklBTF9OVU1fTEVOKTsKKwlidWZmZXJbSVBSX1NFUklBTF9OVU1fTEVOXSA9ICdcMCc7CisJaXByX2VycigiICAgIFNlcmlhbCBOdW1iZXI6ICVzXG4iLCBidWZmZXIpOworfQorCisvKioKKyAqIGlwcl9sb2dfY2FjaGVfZXJyb3IgLSBMb2cgYSBjYWNoZSBlcnJvci4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3RyY2I6CWhvc3RyY2Igc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9sb2dfY2FjaGVfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKK3sKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wMl9lcnJvciAqZXJyb3IgPQorCQkmaG9zdHJjYi0+aGNhbS51LmVycm9yLnUudHlwZV8wMl9lcnJvcjsKKworCWlwcl9lcnIoIi0tLS0tQ3VycmVudCBDb25maWd1cmF0aW9uLS0tLS1cbiIpOworCWlwcl9lcnIoIkNhY2hlIERpcmVjdG9yeSBDYXJkIEluZm9ybWF0aW9uOlxuIik7CisJaXByX2xvZ192cGQoJmVycm9yLT5pb2FfdnBpZHMsIGVycm9yLT5pb2Ffc24pOworCWlwcl9lcnIoIkFkYXB0ZXIgQ2FyZCBJbmZvcm1hdGlvbjpcbiIpOworCWlwcl9sb2dfdnBkKCZlcnJvci0+Y2ZjX3ZwaWRzLCBlcnJvci0+Y2ZjX3NuKTsKKworCWlwcl9lcnIoIi0tLS0tRXhwZWN0ZWQgQ29uZmlndXJhdGlvbi0tLS0tXG4iKTsKKwlpcHJfZXJyKCJDYWNoZSBEaXJlY3RvcnkgQ2FyZCBJbmZvcm1hdGlvbjpcbiIpOworCWlwcl9sb2dfdnBkKCZlcnJvci0+aW9hX2xhc3RfYXR0YWNoZWRfdG9fY2ZjX3ZwaWRzLAorCQkgICAgZXJyb3ItPmlvYV9sYXN0X2F0dGFjaGVkX3RvX2NmY19zbik7CisJaXByX2VycigiQWRhcHRlciBDYXJkIEluZm9ybWF0aW9uOlxuIik7CisJaXByX2xvZ192cGQoJmVycm9yLT5jZmNfbGFzdF9hdHRhY2hlZF90b19pb2FfdnBpZHMsCisJCSAgICBlcnJvci0+Y2ZjX2xhc3RfYXR0YWNoZWRfdG9faW9hX3NuKTsKKworCWlwcl9lcnIoIkFkZGl0aW9uYWwgSU9BIERhdGE6ICUwOFggJTA4WCAlMDhYXG4iLAorCQkgICAgIGJlMzJfdG9fY3B1KGVycm9yLT5pb2FfZGF0YVswXSksCisJCSAgICAgYmUzMl90b19jcHUoZXJyb3ItPmlvYV9kYXRhWzFdKSwKKwkJICAgICBiZTMyX3RvX2NwdShlcnJvci0+aW9hX2RhdGFbMl0pKTsKK30KKworLyoqCisgKiBpcHJfbG9nX2NvbmZpZ19lcnJvciAtIExvZyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBob3N0cmNiOglob3N0cmNiIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfbG9nX2NvbmZpZ19lcnJvcihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJIHN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKK3sKKwlpbnQgZXJyb3JzX2xvZ2dlZCwgaTsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfZGV2aWNlX2RhdGFfZW50cnkgKmRldl9lbnRyeTsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wM19lcnJvciAqZXJyb3I7CisKKwllcnJvciA9ICZob3N0cmNiLT5oY2FtLnUuZXJyb3IudS50eXBlXzAzX2Vycm9yOworCWVycm9yc19sb2dnZWQgPSBiZTMyX3RvX2NwdShlcnJvci0+ZXJyb3JzX2xvZ2dlZCk7CisKKwlpcHJfZXJyKCJEZXZpY2UgRXJyb3JzIERldGVjdGVkL0xvZ2dlZDogJWQvJWRcbiIsCisJCWJlMzJfdG9fY3B1KGVycm9yLT5lcnJvcnNfZGV0ZWN0ZWQpLCBlcnJvcnNfbG9nZ2VkKTsKKworCWRldl9lbnRyeSA9IGVycm9yLT5kZXZfZW50cnk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXJyb3JzX2xvZ2dlZDsgaSsrLCBkZXZfZW50cnkrKykgeworCQlpcHJfZXJyX3NlcGFyYXRvcjsKKworCQlpZiAoZGV2X2VudHJ5LT5kZXZfcmVzX2FkZHIuYnVzID49IElQUl9NQVhfTlVNX0JVU0VTKSB7CisJCQlpcHJfZXJyKCJEZXZpY2UgJWQ6IG1pc3NpbmdcbiIsIGkgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCWlwcl9lcnIoIkRldmljZSAlZDogJWQ6JWQ6JWQ6JWRcbiIsIGkgKyAxLAorCQkJCWlvYV9jZmctPmhvc3QtPmhvc3Rfbm8sIGRldl9lbnRyeS0+ZGV2X3Jlc19hZGRyLmJ1cywKKwkJCQlkZXZfZW50cnktPmRldl9yZXNfYWRkci50YXJnZXQsIGRldl9lbnRyeS0+ZGV2X3Jlc19hZGRyLmx1bik7CisJCX0KKwkJaXByX2xvZ192cGQoJmRldl9lbnRyeS0+ZGV2X3ZwaWRzLCBkZXZfZW50cnktPmRldl9zbik7CisKKwkJaXByX2VycigiLS0tLS1OZXcgRGV2aWNlIEluZm9ybWF0aW9uLS0tLS1cbiIpOworCQlpcHJfbG9nX3ZwZCgmZGV2X2VudHJ5LT5uZXdfZGV2X3ZwaWRzLCBkZXZfZW50cnktPm5ld19kZXZfc24pOworCisJCWlwcl9lcnIoIkNhY2hlIERpcmVjdG9yeSBDYXJkIEluZm9ybWF0aW9uOlxuIik7CisJCWlwcl9sb2dfdnBkKCZkZXZfZW50cnktPmlvYV9sYXN0X3dpdGhfZGV2X3ZwaWRzLAorCQkJICAgIGRldl9lbnRyeS0+aW9hX2xhc3Rfd2l0aF9kZXZfc24pOworCisJCWlwcl9lcnIoIkFkYXB0ZXIgQ2FyZCBJbmZvcm1hdGlvbjpcbiIpOworCQlpcHJfbG9nX3ZwZCgmZGV2X2VudHJ5LT5jZmNfbGFzdF93aXRoX2Rldl92cGlkcywKKwkJCSAgICBkZXZfZW50cnktPmNmY19sYXN0X3dpdGhfZGV2X3NuKTsKKworCQlpcHJfZXJyKCJBZGRpdGlvbmFsIElPQSBEYXRhOiAlMDhYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQliZTMyX3RvX2NwdShkZXZfZW50cnktPmlvYV9kYXRhWzBdKSwKKwkJCWJlMzJfdG9fY3B1KGRldl9lbnRyeS0+aW9hX2RhdGFbMV0pLAorCQkJYmUzMl90b19jcHUoZGV2X2VudHJ5LT5pb2FfZGF0YVsyXSksCisJCQliZTMyX3RvX2NwdShkZXZfZW50cnktPmlvYV9kYXRhWzNdKSwKKwkJCWJlMzJfdG9fY3B1KGRldl9lbnRyeS0+aW9hX2RhdGFbNF0pKTsKKwl9Cit9CisKKy8qKgorICogaXByX2xvZ19hcnJheV9lcnJvciAtIExvZyBhbiBhcnJheSBjb25maWd1cmF0aW9uIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ19hcnJheV9lcnJvcihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiKQoreworCWludCBpOworCXN0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzA0X2Vycm9yICplcnJvcjsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfYXJyYXlfZGF0YV9lbnRyeSAqYXJyYXlfZW50cnk7CisJY29uc3QgdTggemVyb19zbltJUFJfU0VSSUFMX05VTV9MRU5dID0geyBbMCAuLi4gSVBSX1NFUklBTF9OVU1fTEVOLTFdID0gJzAnIH07CisKKwllcnJvciA9ICZob3N0cmNiLT5oY2FtLnUuZXJyb3IudS50eXBlXzA0X2Vycm9yOworCisJaXByX2Vycl9zZXBhcmF0b3I7CisKKwlpcHJfZXJyKCJSQUlEICVzIEFycmF5IENvbmZpZ3VyYXRpb246ICVkOiVkOiVkOiVkXG4iLAorCQllcnJvci0+cHJvdGVjdGlvbl9sZXZlbCwKKwkJaW9hX2NmZy0+aG9zdC0+aG9zdF9ubywKKwkJZXJyb3ItPmxhc3RfZnVuY192c2V0X3Jlc19hZGRyLmJ1cywKKwkJZXJyb3ItPmxhc3RfZnVuY192c2V0X3Jlc19hZGRyLnRhcmdldCwKKwkJZXJyb3ItPmxhc3RfZnVuY192c2V0X3Jlc19hZGRyLmx1bik7CisKKwlpcHJfZXJyX3NlcGFyYXRvcjsKKworCWFycmF5X2VudHJ5ID0gZXJyb3ItPmFycmF5X21lbWJlcjsKKworCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKSB7CisJCWlmICghbWVtY21wKGFycmF5X2VudHJ5LT5zZXJpYWxfbnVtLCB6ZXJvX3NuLCBJUFJfU0VSSUFMX05VTV9MRU4pKQorCQkJY29udGludWU7CisKKwkJaWYgKGJlMzJfdG9fY3B1KGVycm9yLT5leHBvc2VkX21vZGVfYWRuKSA9PSBpKSB7CisJCQlpcHJfZXJyKCJFeHBvc2VkIEFycmF5IE1lbWJlciAlZDpcbiIsIGkpOworCQl9IGVsc2UgeworCQkJaXByX2VycigiQXJyYXkgTWVtYmVyICVkOlxuIiwgaSk7CisJCX0KKworCQlpcHJfbG9nX3ZwZCgmYXJyYXlfZW50cnktPnZwaWRzLCBhcnJheV9lbnRyeS0+c2VyaWFsX251bSk7CisKKwkJaWYgKGFycmF5X2VudHJ5LT5kZXZfcmVzX2FkZHIuYnVzID49IElQUl9NQVhfTlVNX0JVU0VTKSB7CisJCQlpcHJfZXJyKCJDdXJyZW50IExvY2F0aW9uOiB1bmtub3duXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlwcl9lcnIoIkN1cnJlbnQgTG9jYXRpb246ICVkOiVkOiVkOiVkXG4iLAorCQkJCWlvYV9jZmctPmhvc3QtPmhvc3Rfbm8sCisJCQkJYXJyYXlfZW50cnktPmRldl9yZXNfYWRkci5idXMsCisJCQkJYXJyYXlfZW50cnktPmRldl9yZXNfYWRkci50YXJnZXQsCisJCQkJYXJyYXlfZW50cnktPmRldl9yZXNfYWRkci5sdW4pOworCQl9CisKKwkJaWYgKGFycmF5X2VudHJ5LT5kZXZfcmVzX2FkZHIuYnVzID49IElQUl9NQVhfTlVNX0JVU0VTKSB7CisJCQlpcHJfZXJyKCJFeHBlY3RlZCBMb2NhdGlvbjogdW5rbm93blxuIik7CisJCX0gZWxzZSB7CisJCQlpcHJfZXJyKCJFeHBlY3RlZCBMb2NhdGlvbjogJWQ6JWQ6JWQ6JWRcbiIsCisJCQkJaW9hX2NmZy0+aG9zdC0+aG9zdF9ubywKKwkJCQlhcnJheV9lbnRyeS0+ZXhwZWN0ZWRfZGV2X3Jlc19hZGRyLmJ1cywKKwkJCQlhcnJheV9lbnRyeS0+ZXhwZWN0ZWRfZGV2X3Jlc19hZGRyLnRhcmdldCwKKwkJCQlhcnJheV9lbnRyeS0+ZXhwZWN0ZWRfZGV2X3Jlc19hZGRyLmx1bik7CisJCX0KKworCQlpcHJfZXJyX3NlcGFyYXRvcjsKKworCQlpZiAoaSA9PSA5KQorCQkJYXJyYXlfZW50cnkgPSBlcnJvci0+YXJyYXlfbWVtYmVyMjsKKwkJZWxzZQorCQkJYXJyYXlfZW50cnkrKzsKKwl9Cit9CisKKy8qKgorICogaXByX2xvZ19nZW5lcmljX2Vycm9yIC0gTG9nIGFuIGFkYXB0ZXIgZXJyb3IuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBob3N0cmNiOglob3N0cmNiIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfbG9nX2dlbmVyaWNfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiKQoreworCWludCBpOworCWludCBpb2FfZGF0YV9sZW4gPSBiZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLmxlbmd0aCk7CisKKwlpZiAoaW9hX2RhdGFfbGVuID09IDApCisJCXJldHVybjsKKworCWlwcl9lcnIoIklPQSBFcnJvciBEYXRhOlxuIik7CisJaXByX2VycigiT2Zmc2V0ICAgIDAgMSAyIDMgIDQgNSA2IDcgIDggOSBBIEIgIEMgRCBFIEZcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGlvYV9kYXRhX2xlbiAvIDQ7IGkgKz0gNCkgeworCQlpcHJfZXJyKCIlMDhYOiAlMDhYICUwOFggJTA4WCAlMDhYXG4iLCBpKjQsCisJCQliZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLnUucmF3LmRhdGFbaV0pLAorCQkJYmUzMl90b19jcHUoaG9zdHJjYi0+aGNhbS51LnJhdy5kYXRhW2krMV0pLAorCQkJYmUzMl90b19jcHUoaG9zdHJjYi0+aGNhbS51LnJhdy5kYXRhW2krMl0pLAorCQkJYmUzMl90b19jcHUoaG9zdHJjYi0+aGNhbS51LnJhdy5kYXRhW2krM10pKTsKKwl9Cit9CisKKy8qKgorICogaXByX2dldF9lcnJvciAtIEZpbmQgdGhlIHNwZWNmaWVkIElPQVNDIGluIHRoZSBpcHJfZXJyb3JfdGFibGUuCisgKiBAaW9hc2M6CUlPQVNDCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaW5kZXggb2YgaW50byB0aGUgaXByX2Vycm9yX3RhYmxlCisgKiBmb3IgdGhlIHNwZWNpZmllZCBJT0FTQy4gSWYgdGhlIElPQVNDIGlzIG5vdCBpbiB0aGUgdGFibGUsCisgKiAwIHdpbGwgYmUgcmV0dXJuZWQsIHdoaWNoIHBvaW50cyB0byB0aGUgZW50cnkgdXNlZCBmb3IgdW5rbm93biBlcnJvcnMuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCWluZGV4IGludG8gdGhlIGlwcl9lcnJvcl90YWJsZQorICoqLworc3RhdGljIHUzMiBpcHJfZ2V0X2Vycm9yKHUzMiBpb2FzYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwcl9lcnJvcl90YWJsZSk7IGkrKykKKwkJaWYgKGlwcl9lcnJvcl90YWJsZVtpXS5pb2FzYyA9PSBpb2FzYykKKwkJCXJldHVybiBpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX2hhbmRsZV9sb2dfZGF0YSAtIExvZyBhbiBhZGFwdGVyIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvZ3MgYW4gYWRhcHRlciBlcnJvciB0byB0aGUgc3lzdGVtLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaGFuZGxlX2xvZ19kYXRhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQlzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IpCit7CisJdTMyIGlvYXNjOworCWludCBlcnJvcl9pbmRleDsKKworCWlmIChob3N0cmNiLT5oY2FtLm5vdGlmeV90eXBlICE9IElQUl9IT1NUX1JDQl9OT1RJRl9UWVBFX0VSUk9SX0xPR19FTlRSWSkKKwkJcmV0dXJuOworCisJaWYgKGhvc3RyY2ItPmhjYW0ubm90aWZpY2F0aW9uc19sb3N0ID09IElQUl9IT1NUX1JDQl9OT1RJRklDQVRJT05TX0xPU1QpCisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIkVycm9yIG5vdGlmaWNhdGlvbnMgbG9zdFxuIik7CisKKwlpb2FzYyA9IGJlMzJfdG9fY3B1KGhvc3RyY2ItPmhjYW0udS5lcnJvci5mYWlsaW5nX2Rldl9pb2FzYyk7CisKKwlpZiAoaW9hc2MgPT0gSVBSX0lPQVNDX0JVU19XQVNfUkVTRVQgfHwKKwkgICAgaW9hc2MgPT0gSVBSX0lPQVNDX0JVU19XQVNfUkVTRVRfQllfT1RIRVIpIHsKKwkJLyogVGVsbCB0aGUgbWlkbGF5ZXIgd2UgaGFkIGEgYnVzIHJlc2V0IHNvIGl0IHdpbGwgaGFuZGxlIHRoZSBVQSBwcm9wZXJseSAqLworCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoaW9hX2NmZy0+aG9zdCwKKwkJCQkgICAgICBob3N0cmNiLT5oY2FtLnUuZXJyb3IuZmFpbGluZ19kZXZfcmVzX2FkZHIuYnVzKTsKKwl9CisKKwllcnJvcl9pbmRleCA9IGlwcl9nZXRfZXJyb3IoaW9hc2MpOworCisJaWYgKCFpcHJfZXJyb3JfdGFibGVbZXJyb3JfaW5kZXhdLmxvZ19oY2FtKQorCQlyZXR1cm47CisKKwlpZiAoaXByX2lzX2RldmljZSgmaG9zdHJjYi0+aGNhbS51LmVycm9yLmZhaWxpbmdfZGV2X3Jlc19hZGRyKSkgeworCQlpcHJfcmVzX2Vycihpb2FfY2ZnLCBob3N0cmNiLT5oY2FtLnUuZXJyb3IuZmFpbGluZ19kZXZfcmVzX2FkZHIsCisJCQkgICAgIiVzXG4iLCBpcHJfZXJyb3JfdGFibGVbZXJyb3JfaW5kZXhdLmVycm9yKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICIlc1xuIiwKKwkJCWlwcl9lcnJvcl90YWJsZVtlcnJvcl9pbmRleF0uZXJyb3IpOworCX0KKworCS8qIFNldCBpbmRpY2F0aW9uIHdlIGhhdmUgbG9nZ2VkIGFuIGVycm9yICovCisJaW9hX2NmZy0+ZXJyb3JzX2xvZ2dlZCsrOworCisJaWYgKGlvYV9jZmctPmxvZ19sZXZlbCA8IElQUl9ERUZBVUxUX0xPR19MRVZFTCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChob3N0cmNiLT5oY2FtLm92ZXJsYXlfaWQpIHsKKwljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzE6CisJCWlwcl9sb2dfZ2VuZXJpY19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8yOgorCQlpcHJfbG9nX2NhY2hlX2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOworCQlicmVhazsKKwljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzM6CisJCWlwcl9sb2dfY29uZmlnX2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOworCQlicmVhazsKKwljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzQ6CisJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF82OgorCQlpcHJfbG9nX2FycmF5X2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOworCQlicmVhazsKKwljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEX0RFRkFVTFQ6CisJCWlwcl9sb2dfZ2VuZXJpY19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIlVua25vd24gZXJyb3IgcmVjZWl2ZWQuIE92ZXJsYXkgSUQ6ICVkXG4iLAorCQkJaG9zdHJjYi0+aGNhbS5vdmVybGF5X2lkKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGlwcl9wcm9jZXNzX2Vycm9yIC0gT3AgZG9uZSBmdW5jdGlvbiBmb3IgYW4gYWRhcHRlciBlcnJvciBsb2cuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb3AgZG9uZSBmdW5jdGlvbiBmb3IgYW4gZXJyb3IgbG9nIGhvc3QKKyAqIGNvbnRyb2xsZWQgYXN5bmMgZnJvbSB0aGUgYWRhcHRlci4gSXQgd2lsbCBsb2cgdGhlIGVycm9yIGFuZAorICogc2VuZCB0aGUgSENBTSBiYWNrIHRvIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcHJvY2Vzc19lcnJvcihzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IgPSBpcHJfY21kLT51Lmhvc3RyY2I7CisJdTMyIGlvYXNjID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EuaW9hc2MpOworCisJbGlzdF9kZWwoJmhvc3RyY2ItPnF1ZXVlKTsKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisKKwlpZiAoIWlvYXNjKSB7CisJCWlwcl9oYW5kbGVfbG9nX2RhdGEoaW9hX2NmZywgaG9zdHJjYik7CisJfSBlbHNlIGlmIChpb2FzYyAhPSBJUFJfSU9BU0NfSU9BX1dBU19SRVNFVCkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiSG9zdCBSQ0IgZmFpbGVkIHdpdGggSU9BU0M6IDB4JTA4WFxuIiwgaW9hc2MpOworCX0KKworCWlwcl9zZW5kX2hjYW0oaW9hX2NmZywgSVBSX0hDQU1fQ0RCX09QX0NPREVfTE9HX0RBVEEsIGhvc3RyY2IpOworfQorCisvKioKKyAqIGlwcl90aW1lb3V0IC0gIEFuIGludGVybmFsbHkgZ2VuZXJhdGVkIG9wIGhhcyB0aW1lZCBvdXQuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBibG9ja3MgaG9zdCByZXF1ZXN0cyBhbmQgaW5pdGlhdGVzIGFuCisgKiBhZGFwdGVyIHJlc2V0LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfdGltZW91dChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJRU5URVI7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlvYV9jZmctPmVycm9yc19sb2dnZWQrKzsKKwlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCSJBZGFwdGVyIGJlaW5nIHJlc2V0IGR1ZSB0byBjb21tYW5kIHRpbWVvdXQuXG4iKTsKKworCWlmIChXQUlUX0ZPUl9EVU1QID09IGlvYV9jZmctPnNkdF9zdGF0ZSkKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gR0VUX0RVTVA7CisKKwlpZiAoIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCB8fCBpb2FfY2ZnLT5yZXNldF9jbWQgPT0gaXByX2NtZCkKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX29wZXJfdGltZW91dCAtICBBZGFwdGVyIHRpbWVkIG91dCB0cmFuc2l0aW9uaW5nIHRvIG9wZXJhdGlvbmFsCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBibG9ja3MgaG9zdCByZXF1ZXN0cyBhbmQgaW5pdGlhdGVzIGFuCisgKiBhZGFwdGVyIHJlc2V0LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfb3Blcl90aW1lb3V0KHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwlFTlRFUjsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaW9hX2NmZy0+ZXJyb3JzX2xvZ2dlZCsrOworCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJIkFkYXB0ZXIgdGltZWQgb3V0IHRyYW5zaXRpb25pbmcgdG8gb3BlcmF0aW9uYWwuXG4iKTsKKworCWlmIChXQUlUX0ZPUl9EVU1QID09IGlvYV9jZmctPnNkdF9zdGF0ZSkKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gR0VUX0RVTVA7CisKKwlpZiAoIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCB8fCBpb2FfY2ZnLT5yZXNldF9jbWQgPT0gaXByX2NtZCkgeworCQlpZiAoaXByX2Zhc3RmYWlsKQorCQkJaW9hX2NmZy0+cmVzZXRfcmV0cmllcyArPSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTOworCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X3JlbG9hZCAtIFJlc2V0L1JlbG9hZCB0aGUgSU9BCisgKiBAaW9hX2NmZzoJCWlvYSBjb25maWcgc3RydWN0CisgKiBAc2h1dGRvd25fdHlwZToJc2h1dGRvd24gdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBhZGFwdGVyIGFuZCByZS1pbml0aWFsaXplcyBpdC4KKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGFsbCBuZXcgaG9zdCBjb21tYW5kcyBoYXZlIGJlZW4gc3RvcHBlZC4KKyAqIFJldHVybiB2YWx1ZToKKyAqIAlTVUNDRVNTIC8gRkFJTEVECisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF9yZWxvYWQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgIGVudW0gaXByX3NodXRkb3duX3R5cGUgc2h1dGRvd25fdHlwZSkKK3sKKwlpZiAoIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBzaHV0ZG93bl90eXBlKTsKKworCXNwaW5fdW5sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCXdhaXRfZXZlbnQoaW9hX2NmZy0+cmVzZXRfd2FpdF9xLCAhaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKTsKKwlzcGluX2xvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisKKwkvKiBJZiB3ZSBnb3QgaGl0IHdpdGggYSBob3N0IHJlc2V0IHdoaWxlIHdlIHdlcmUgYWxyZWFkeSByZXNldHRpbmcKKwkgdGhlIGFkYXB0ZXIgZm9yIHNvbWUgcmVhc29uLCBhbmQgdGhlIHJlc2V0IGZhaWxlZC4gKi8KKwlpZiAoaW9hX2NmZy0+aW9hX2lzX2RlYWQpIHsKKwkJaXByX3RyYWNlOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCisvKioKKyAqIGlwcl9maW5kX3Nlc19lbnRyeSAtIEZpbmQgbWF0Y2hpbmcgU0VTIGluIFNFUyB0YWJsZQorICogQHJlczoJcmVzb3VyY2UgZW50cnkgc3RydWN0IG9mIFNFUworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlwb2ludGVyIHRvIFNFUyB0YWJsZSBlbnRyeSAvIE5VTEwgb24gZmFpbHVyZQorICoqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpcHJfc2VzX3RhYmxlX2VudHJ5ICoKK2lwcl9maW5kX3Nlc19lbnRyeShzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMpCit7CisJaW50IGksIGosIG1hdGNoZXM7CisJY29uc3Qgc3RydWN0IGlwcl9zZXNfdGFibGVfZW50cnkgKnN0ZSA9IGlwcl9zZXNfdGFibGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcHJfc2VzX3RhYmxlKTsgaSsrLCBzdGUrKykgeworCQlmb3IgKGogPSAwLCBtYXRjaGVzID0gMDsgaiA8IElQUl9QUk9EX0lEX0xFTjsgaisrKSB7CisJCQlpZiAoc3RlLT5jb21wYXJlX3Byb2R1Y3RfaWRfYnl0ZVtqXSA9PSAnWCcpIHsKKwkJCQlpZiAocmVzLT5jZmd0ZS5zdGRfaW5xX2RhdGEudnBpZHMucHJvZHVjdF9pZFtqXSA9PSBzdGUtPnByb2R1Y3RfaWRbal0pCisJCQkJCW1hdGNoZXMrKzsKKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJbWF0Y2hlcysrOworCQl9CisKKwkJaWYgKG1hdGNoZXMgPT0gSVBSX1BST0RfSURfTEVOKQorCQkJcmV0dXJuIHN0ZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpcHJfZ2V0X21heF9zY3NpX3NwZWVkIC0gRGV0ZXJtaW5lIG1heCBTQ1NJIHNwZWVkIGZvciBhIGdpdmVuIGJ1cworICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAYnVzOgkJU0NTSSBidXMKKyAqIEBidXNfd2lkdGg6CWJ1cyB3aWR0aAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCVNDU0kgYnVzIHNwZWVkIGluIHVuaXRzIG9mIDEwMEtIeiwgMTYwMCBpcyAxNjAgTUh6CisgKglGb3IgYSAyLWJ5dGUgd2lkZSBTQ1NJIGJ1cywgdGhlIG1heGltdW0gdHJhbnNmZXIgc3BlZWQgaXMKKyAqCXR3aWNlIHRoZSBtYXhpbXVtIHRyYW5zZmVyIHJhdGUgKGUuZy4gZm9yIGEgd2lkZSBlbmFibGVkIGJ1cywKKyAqCW1heCAxNjBNSHogPSBtYXggMzIwTUIvc2VjKS4KKyAqKi8KK3N0YXRpYyB1MzIgaXByX2dldF9tYXhfc2NzaV9zcGVlZChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsIHU4IGJ1cywgdTggYnVzX3dpZHRoKQoreworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwljb25zdCBzdHJ1Y3QgaXByX3Nlc190YWJsZV9lbnRyeSAqc3RlOworCXUzMiBtYXhfeGZlcl9yYXRlID0gSVBSX01BWF9TQ1NJX1JBVEUoYnVzX3dpZHRoKTsKKworCS8qIExvb3AgdGhyb3VnaCBlYWNoIGNvbmZpZyB0YWJsZSBlbnRyeSBpbiB0aGUgY29uZmlnIHRhYmxlIGJ1ZmZlciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJaWYgKCEoSVBSX0lTX1NFU19ERVZJQ0UocmVzLT5jZmd0ZS5zdGRfaW5xX2RhdGEpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChidXMgIT0gcmVzLT5jZmd0ZS5yZXNfYWRkci5idXMpCisJCQljb250aW51ZTsKKworCQlpZiAoIShzdGUgPSBpcHJfZmluZF9zZXNfZW50cnkocmVzKSkpCisJCQljb250aW51ZTsKKworCQltYXhfeGZlcl9yYXRlID0gKHN0ZS0+bWF4X2J1c19zcGVlZF9saW1pdCAqIDEwKSAvIChidXNfd2lkdGggLyA4KTsKKwl9CisKKwlyZXR1cm4gbWF4X3hmZXJfcmF0ZTsKK30KKworLyoqCisgKiBpcHJfd2FpdF9pb2RiZ19hY2sgLSBXYWl0IGZvciBhbiBJT0RFQlVHIEFDSyBmcm9tIHRoZSBJT0EKKyAqIEBpb2FfY2ZnOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBtYXhfZGVsYXk6CQltYXggZGVsYXkgaW4gbWljcm8tc2Vjb25kcyB0byB3YWl0CisgKgorICogV2FpdHMgZm9yIGFuIElPREVCVUcgQUNLIGZyb20gdGhlIElPQSwgZG9pbmcgYnVzeSBsb29waW5nLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl93YWl0X2lvZGJnX2FjayhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsIGludCBtYXhfZGVsYXkpCit7CisJdm9sYXRpbGUgdTMyIHBjaWlfcmVnOworCWludCBkZWxheSA9IDE7CisKKwkvKiBSZWFkIGludGVycnVwdCByZWcgdW50aWwgSU9BIHNpZ25hbHMgSU8gRGVidWcgQWNrbm93bGVkZ2UgKi8KKwl3aGlsZSAoZGVsYXkgPCBtYXhfZGVsYXkpIHsKKwkJcGNpaV9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9yZWcpOworCisJCWlmIChwY2lpX3JlZyAmIElQUl9QQ0lJX0lPX0RFQlVHX0FDS05PV0xFREdFKQorCQkJcmV0dXJuIDA7CisKKwkJLyogdWRlbGF5IGNhbm5vdCBiZSB1c2VkIGlmIGRlbGF5IGlzIG1vcmUgdGhhbiBhIGZldyBtaWxsaXNlY29uZHMgKi8KKwkJaWYgKChkZWxheSAvIDEwMDApID4gTUFYX1VERUxBWV9NUykKKwkJCW1kZWxheShkZWxheSAvIDEwMDApOworCQllbHNlCisJCQl1ZGVsYXkoZGVsYXkpOworCisJCWRlbGF5ICs9IGRlbGF5OworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworLyoqCisgKiBpcHJfZ2V0X2xkdW1wX2RhdGFfc2VjdGlvbiAtIER1bXAgSU9BIG1lbW9yeQorICogQGlvYV9jZmc6CQkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBzdGFydF9hZGRyOgkJCWFkYXB0ZXIgYWRkcmVzcyB0byBkdW1wCisgKiBAZGVzdDoJCQkJZGVzdGluYXRpb24ga2VybmVsIGJ1ZmZlcgorICogQGxlbmd0aF9pbl93b3JkczoJbGVuZ3RoIHRvIGR1bXAgaW4gNCBieXRlIHdvcmRzCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIC1FSU8gb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfZ2V0X2xkdW1wX2RhdGFfc2VjdGlvbihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICAgICAgdTMyIHN0YXJ0X2FkZHIsCisJCQkJICAgICAgX19iZTMyICpkZXN0LCB1MzIgbGVuZ3RoX2luX3dvcmRzKQoreworCXZvbGF0aWxlIHUzMiB0ZW1wX3BjaWlfcmVnOworCWludCBpLCBkZWxheSA9IDA7CisKKwkvKiBXcml0ZSBJT0EgaW50ZXJydXB0IHJlZyBzdGFydGluZyBMRFVNUCBzdGF0ZSAgKi8KKwl3cml0ZWwoKElQUl9VUFJPQ0lfUkVTRVRfQUxFUlQgfCBJUFJfVVBST0NJX0lPX0RFQlVHX0FMRVJUKSwKKwkgICAgICAgaW9hX2NmZy0+cmVncy5zZXRfdXByb2NfaW50ZXJydXB0X3JlZyk7CisKKwkvKiBXYWl0IGZvciBJTyBkZWJ1ZyBhY2tub3dsZWRnZSAqLworCWlmIChpcHJfd2FpdF9pb2RiZ19hY2soaW9hX2NmZywKKwkJCSAgICAgICBJUFJfTERVTVBfTUFYX0xPTkdfQUNLX0RFTEFZX0lOX1VTRUMpKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJJT0EgZHVtcCBsb25nIGRhdGEgdHJhbnNmZXIgdGltZW91dFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFNpZ25hbCBMRFVNUCBpbnRlcmxvY2tlZCAtIGNsZWFyIElPIGRlYnVnIGFjayAqLworCXdyaXRlbChJUFJfUENJSV9JT19ERUJVR19BQ0tOT1dMRURHRSwKKwkgICAgICAgaW9hX2NmZy0+cmVncy5jbHJfaW50ZXJydXB0X3JlZyk7CisKKwkvKiBXcml0ZSBNYWlsYm94IHdpdGggc3RhcnRpbmcgYWRkcmVzcyAqLworCXdyaXRlbChzdGFydF9hZGRyLCBpb2FfY2ZnLT5pb2FfbWFpbGJveCk7CisKKwkvKiBTaWduYWwgYWRkcmVzcyB2YWxpZCAtIGNsZWFyIElPQSBSZXNldCBhbGVydCAqLworCXdyaXRlbChJUFJfVVBST0NJX1JFU0VUX0FMRVJULAorCSAgICAgICBpb2FfY2ZnLT5yZWdzLmNscl91cHJvY19pbnRlcnJ1cHRfcmVnKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGhfaW5fd29yZHM7IGkrKykgeworCQkvKiBXYWl0IGZvciBJTyBkZWJ1ZyBhY2tub3dsZWRnZSAqLworCQlpZiAoaXByX3dhaXRfaW9kYmdfYWNrKGlvYV9jZmcsCisJCQkJICAgICAgIElQUl9MRFVNUF9NQVhfU0hPUlRfQUNLX0RFTEFZX0lOX1VTRUMpKSB7CisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkJIklPQSBkdW1wIHNob3J0IGRhdGEgdHJhbnNmZXIgdGltZW91dFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIFJlYWQgZGF0YSBmcm9tIG1haWxib3ggYW5kIGluY3JlbWVudCBkZXN0aW5hdGlvbiBwb2ludGVyICovCisJCSpkZXN0ID0gY3B1X3RvX2JlMzIocmVhZGwoaW9hX2NmZy0+aW9hX21haWxib3gpKTsKKwkJZGVzdCsrOworCisJCS8qIEZvciBhbGwgYnV0IHRoZSBsYXN0IHdvcmQgb2YgZGF0YSwgc2lnbmFsIGRhdGEgcmVjZWl2ZWQgKi8KKwkJaWYgKGkgPCAobGVuZ3RoX2luX3dvcmRzIC0gMSkpIHsKKwkJCS8qIFNpZ25hbCBkdW1wIGRhdGEgcmVjZWl2ZWQgLSBDbGVhciBJTyBkZWJ1ZyBBY2sgKi8KKwkJCXdyaXRlbChJUFJfUENJSV9JT19ERUJVR19BQ0tOT1dMRURHRSwKKwkJCSAgICAgICBpb2FfY2ZnLT5yZWdzLmNscl9pbnRlcnJ1cHRfcmVnKTsKKwkJfQorCX0KKworCS8qIFNpZ25hbCBlbmQgb2YgYmxvY2sgdHJhbnNmZXIuIFNldCByZXNldCBhbGVydCB0aGVuIGNsZWFyIElPIGRlYnVnIGFjayAqLworCXdyaXRlbChJUFJfVVBST0NJX1JFU0VUX0FMRVJULAorCSAgICAgICBpb2FfY2ZnLT5yZWdzLnNldF91cHJvY19pbnRlcnJ1cHRfcmVnKTsKKworCXdyaXRlbChJUFJfVVBST0NJX0lPX0RFQlVHX0FMRVJULAorCSAgICAgICBpb2FfY2ZnLT5yZWdzLmNscl91cHJvY19pbnRlcnJ1cHRfcmVnKTsKKworCS8qIFNpZ25hbCBkdW1wIGRhdGEgcmVjZWl2ZWQgLSBDbGVhciBJTyBkZWJ1ZyBBY2sgKi8KKwl3cml0ZWwoSVBSX1BDSUlfSU9fREVCVUdfQUNLTk9XTEVER0UsCisJICAgICAgIGlvYV9jZmctPnJlZ3MuY2xyX2ludGVycnVwdF9yZWcpOworCisJLyogV2FpdCBmb3IgSU9BIHRvIHNpZ25hbCBMRFVNUCBleGl0IC0gSU9BIHJlc2V0IGFsZXJ0IHdpbGwgYmUgY2xlYXJlZCAqLworCXdoaWxlIChkZWxheSA8IElQUl9MRFVNUF9NQVhfU0hPUlRfQUNLX0RFTEFZX0lOX1VTRUMpIHsKKwkJdGVtcF9wY2lpX3JlZyA9CisJCSAgICByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX3Vwcm9jX2ludGVycnVwdF9yZWcpOworCisJCWlmICghKHRlbXBfcGNpaV9yZWcgJiBJUFJfVVBST0NJX1JFU0VUX0FMRVJUKSkKKwkJCXJldHVybiAwOworCisJCXVkZWxheSgxMCk7CisJCWRlbGF5ICs9IDEwOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1NDU0lfSVBSX0RVTVAKKy8qKgorICogaXByX3NkdF9jb3B5IC0gQ29weSBTbWFydCBEdW1wIFRhYmxlIHRvIGtlcm5lbCBidWZmZXIKKyAqIEBpb2FfY2ZnOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBwY2lfYWRkcmVzczoJYWRhcHRlciBhZGRyZXNzCisgKiBAbGVuZ3RoOgkJCWxlbmd0aCBvZiBkYXRhIHRvIGNvcHkKKyAqCisgKiBDb3B5IGRhdGEgZnJvbSBQQ0kgYWRhcHRlciB0byBrZXJuZWwgYnVmZmVyLgorICogTm90ZTogbGVuZ3RoIE1VU1QgYmUgYSA0IGJ5dGUgbXVsdGlwbGUKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl9zZHRfY29weShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQl1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzLCB1MzIgbGVuZ3RoKQoreworCWludCBieXRlc19jb3BpZWQgPSAwOworCWludCBjdXJfbGVuLCByYywgcmVtX2xlbiwgcmVtX3BhZ2VfbGVuOworCV9fYmUzMiAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCXN0cnVjdCBpcHJfaW9hX2R1bXAgKmlvYV9kdW1wID0gJmlvYV9jZmctPmR1bXAtPmlvYV9kdW1wOworCisJd2hpbGUgKGJ5dGVzX2NvcGllZCA8IGxlbmd0aCAmJgorCSAgICAgICAoaW9hX2R1bXAtPmhkci5sZW4gKyBieXRlc19jb3BpZWQpIDwgSVBSX01BWF9JT0FfRFVNUF9TSVpFKSB7CisJCWlmIChpb2FfZHVtcC0+cGFnZV9vZmZzZXQgPj0gUEFHRV9TSVpFIHx8CisJCSAgICBpb2FfZHVtcC0+cGFnZV9vZmZzZXQgPT0gMCkgeworCQkJcGFnZSA9IChfX2JlMzIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CisKKwkJCWlmICghcGFnZSkgeworCQkJCWlwcl90cmFjZTsKKwkJCQlyZXR1cm4gYnl0ZXNfY29waWVkOworCQkJfQorCisJCQlpb2FfZHVtcC0+cGFnZV9vZmZzZXQgPSAwOworCQkJaW9hX2R1bXAtPmlvYV9kYXRhW2lvYV9kdW1wLT5uZXh0X3BhZ2VfaW5kZXhdID0gcGFnZTsKKwkJCWlvYV9kdW1wLT5uZXh0X3BhZ2VfaW5kZXgrKzsKKwkJfSBlbHNlCisJCQlwYWdlID0gaW9hX2R1bXAtPmlvYV9kYXRhW2lvYV9kdW1wLT5uZXh0X3BhZ2VfaW5kZXggLSAxXTsKKworCQlyZW1fbGVuID0gbGVuZ3RoIC0gYnl0ZXNfY29waWVkOworCQlyZW1fcGFnZV9sZW4gPSBQQUdFX1NJWkUgLSBpb2FfZHVtcC0+cGFnZV9vZmZzZXQ7CisJCWN1cl9sZW4gPSBtaW4ocmVtX2xlbiwgcmVtX3BhZ2VfbGVuKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IEFCT1JUX0RVTVApIHsKKwkJCXJjID0gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCXJjID0gaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24oaW9hX2NmZywKKwkJCQkJCQlwY2lfYWRkcmVzcyArIGJ5dGVzX2NvcGllZCwKKwkJCQkJCQkmcGFnZVtpb2FfZHVtcC0+cGFnZV9vZmZzZXQgLyA0XSwKKwkJCQkJCQkoY3VyX2xlbiAvIHNpemVvZih1MzIpKSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJCWlmICghcmMpIHsKKwkJCWlvYV9kdW1wLT5wYWdlX29mZnNldCArPSBjdXJfbGVuOworCQkJYnl0ZXNfY29waWVkICs9IGN1cl9sZW47CisJCX0gZWxzZSB7CisJCQlpcHJfdHJhY2U7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKworCXJldHVybiBieXRlc19jb3BpZWQ7Cit9CisKKy8qKgorICogaXByX2luaXRfZHVtcF9lbnRyeV9oZHIgLSBJbml0aWFsaXplIGEgZHVtcCBlbnRyeSBoZWFkZXIuCisgKiBAaGRyOglkdW1wIGVudHJ5IGhlYWRlciBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2luaXRfZHVtcF9lbnRyeV9oZHIoc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlciAqaGRyKQoreworCWhkci0+ZXllX2NhdGNoZXIgPSBJUFJfRFVNUF9FWUVfQ0FUQ0hFUjsKKwloZHItPm51bV9lbGVtcyA9IDE7CisJaGRyLT5vZmZzZXQgPSBzaXplb2YoKmhkcik7CisJaGRyLT5zdGF0dXMgPSBJUFJfRFVNUF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgKiBpcHJfZHVtcF9pb2FfdHlwZV9kYXRhIC0gRmlsbCBpbiB0aGUgYWRhcHRlciB0eXBlIGluIHRoZSBkdW1wLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAZHJpdmVyX2R1bXA6CWRyaXZlciBkdW1wIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZHVtcF9pb2FfdHlwZV9kYXRhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgICBzdHJ1Y3QgaXByX2RyaXZlcl9kdW1wICpkcml2ZXJfZHVtcCkKK3sKKwlzdHJ1Y3QgaXByX2lucXVpcnlfcGFnZTMgKnVjb2RlX3ZwZCA9ICZpb2FfY2ZnLT52cGRfY2JzLT5wYWdlM19kYXRhOworCisJaXByX2luaXRfZHVtcF9lbnRyeV9oZHIoJmRyaXZlcl9kdW1wLT5pb2FfdHlwZV9lbnRyeS5oZHIpOworCWRyaXZlcl9kdW1wLT5pb2FfdHlwZV9lbnRyeS5oZHIubGVuID0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9pb2FfdHlwZV9lbnRyeSkgLQorCQlzaXplb2Yoc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlcik7CisJZHJpdmVyX2R1bXAtPmlvYV90eXBlX2VudHJ5Lmhkci5kYXRhX3R5cGUgPSBJUFJfRFVNUF9EQVRBX1RZUEVfQklOQVJZOworCWRyaXZlcl9kdW1wLT5pb2FfdHlwZV9lbnRyeS5oZHIuaWQgPSBJUFJfRFVNUF9EUklWRVJfVFlQRV9JRDsKKwlkcml2ZXJfZHVtcC0+aW9hX3R5cGVfZW50cnkudHlwZSA9IGlvYV9jZmctPnR5cGU7CisJZHJpdmVyX2R1bXAtPmlvYV90eXBlX2VudHJ5LmZ3X3ZlcnNpb24gPSAodWNvZGVfdnBkLT5tYWpvcl9yZWxlYXNlIDw8IDI0KSB8CisJCSh1Y29kZV92cGQtPmNhcmRfdHlwZSA8PCAxNikgfCAodWNvZGVfdnBkLT5taW5vcl9yZWxlYXNlWzBdIDw8IDgpIHwKKwkJdWNvZGVfdnBkLT5taW5vcl9yZWxlYXNlWzFdOworCWRyaXZlcl9kdW1wLT5oZHIubnVtX2VudHJpZXMrKzsKK30KKworLyoqCisgKiBpcHJfZHVtcF92ZXJzaW9uX2RhdGEgLSBGaWxsIGluIHRoZSBkcml2ZXIgdmVyc2lvbiBpbiB0aGUgZHVtcC4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGRyaXZlcl9kdW1wOglkcml2ZXIgZHVtcCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2R1bXBfdmVyc2lvbl9kYXRhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgIHN0cnVjdCBpcHJfZHJpdmVyX2R1bXAgKmRyaXZlcl9kdW1wKQoreworCWlwcl9pbml0X2R1bXBfZW50cnlfaGRyKCZkcml2ZXJfZHVtcC0+dmVyc2lvbl9lbnRyeS5oZHIpOworCWRyaXZlcl9kdW1wLT52ZXJzaW9uX2VudHJ5Lmhkci5sZW4gPQorCQlzaXplb2Yoc3RydWN0IGlwcl9kdW1wX3ZlcnNpb25fZW50cnkpIC0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIpOworCWRyaXZlcl9kdW1wLT52ZXJzaW9uX2VudHJ5Lmhkci5kYXRhX3R5cGUgPSBJUFJfRFVNUF9EQVRBX1RZUEVfQVNDSUk7CisJZHJpdmVyX2R1bXAtPnZlcnNpb25fZW50cnkuaGRyLmlkID0gSVBSX0RVTVBfRFJJVkVSX1ZFUlNJT05fSUQ7CisJc3RyY3B5KGRyaXZlcl9kdW1wLT52ZXJzaW9uX2VudHJ5LnZlcnNpb24sIElQUl9EUklWRVJfVkVSU0lPTik7CisJZHJpdmVyX2R1bXAtPmhkci5udW1fZW50cmllcysrOworfQorCisvKioKKyAqIGlwcl9kdW1wX3RyYWNlX2RhdGEgLSBGaWxsIGluIHRoZSBJT0EgdHJhY2UgaW4gdGhlIGR1bXAuCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBkcml2ZXJfZHVtcDoJZHJpdmVyIGR1bXAgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9kdW1wX3RyYWNlX2RhdGEoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgIHN0cnVjdCBpcHJfZHJpdmVyX2R1bXAgKmRyaXZlcl9kdW1wKQoreworCWlwcl9pbml0X2R1bXBfZW50cnlfaGRyKCZkcml2ZXJfZHVtcC0+dHJhY2VfZW50cnkuaGRyKTsKKwlkcml2ZXJfZHVtcC0+dHJhY2VfZW50cnkuaGRyLmxlbiA9CisJCXNpemVvZihzdHJ1Y3QgaXByX2R1bXBfdHJhY2VfZW50cnkpIC0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIpOworCWRyaXZlcl9kdW1wLT50cmFjZV9lbnRyeS5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0JJTkFSWTsKKwlkcml2ZXJfZHVtcC0+dHJhY2VfZW50cnkuaGRyLmlkID0gSVBSX0RVTVBfVFJBQ0VfSUQ7CisJbWVtY3B5KGRyaXZlcl9kdW1wLT50cmFjZV9lbnRyeS50cmFjZSwgaW9hX2NmZy0+dHJhY2UsIElQUl9UUkFDRV9TSVpFKTsKKwlkcml2ZXJfZHVtcC0+aGRyLm51bV9lbnRyaWVzKys7Cit9CisKKy8qKgorICogaXByX2R1bXBfbG9jYXRpb25fZGF0YSAtIEZpbGwgaW4gdGhlIElPQSBsb2NhdGlvbiBpbiB0aGUgZHVtcC4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGRyaXZlcl9kdW1wOglkcml2ZXIgZHVtcCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2R1bXBfbG9jYXRpb25fZGF0YShzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICAgc3RydWN0IGlwcl9kcml2ZXJfZHVtcCAqZHJpdmVyX2R1bXApCit7CisJaXByX2luaXRfZHVtcF9lbnRyeV9oZHIoJmRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIpOworCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIubGVuID0KKwkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9sb2NhdGlvbl9lbnRyeSkgLQorCQlzaXplb2Yoc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlcik7CisJZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5Lmhkci5kYXRhX3R5cGUgPSBJUFJfRFVNUF9EQVRBX1RZUEVfQVNDSUk7CisJZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5Lmhkci5pZCA9IElQUl9EVU1QX0xPQ0FUSU9OX0lEOworCXN0cmNweShkcml2ZXJfZHVtcC0+bG9jYXRpb25fZW50cnkubG9jYXRpb24sIGlvYV9jZmctPnBkZXYtPmRldi5idXNfaWQpOworCWRyaXZlcl9kdW1wLT5oZHIubnVtX2VudHJpZXMrKzsKK30KKworLyoqCisgKiBpcHJfZ2V0X2lvYV9kdW1wIC0gUGVyZm9ybSBhIGR1bXAgb2YgdGhlIGRyaXZlciBhbmQgYWRhcHRlci4KKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGR1bXA6CQlkdW1wIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZ2V0X2lvYV9kdW1wKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywgc3RydWN0IGlwcl9kdW1wICpkdW1wKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgc2R0X3dvcmQ7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaXByX2RyaXZlcl9kdW1wICpkcml2ZXJfZHVtcCA9ICZkdW1wLT5kcml2ZXJfZHVtcDsKKwlzdHJ1Y3QgaXByX2lvYV9kdW1wICppb2FfZHVtcCA9ICZkdW1wLT5pb2FfZHVtcDsKKwl1MzIgbnVtX2VudHJpZXMsIHN0YXJ0X29mZiwgZW5kX29mZjsKKwl1MzIgYnl0ZXNfdG9fY29weSwgYnl0ZXNfY29waWVkLCByYzsKKwlzdHJ1Y3QgaXByX3NkdCAqc2R0OworCWludCBpOworCisJRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSAhPSBHRVRfRFVNUCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlzdGFydF9hZGRyID0gcmVhZGwoaW9hX2NmZy0+aW9hX21haWxib3gpOworCisJaWYgKCFpcHJfc2R0X2lzX2ZtdDIoc3RhcnRfYWRkcikpIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIkludmFsaWQgZHVtcCB0YWJsZSBmb3JtYXQ6ICVseFxuIiwgc3RhcnRfYWRkcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIkR1bXAgb2YgSU9BIGluaXRpYXRlZFxuIik7CisKKwlkcml2ZXJfZHVtcC0+aGRyLmV5ZV9jYXRjaGVyID0gSVBSX0RVTVBfRVlFX0NBVENIRVI7CisKKwkvKiBJbml0aWFsaXplIHRoZSBvdmVyYWxsIGR1bXAgaGVhZGVyICovCisJZHJpdmVyX2R1bXAtPmhkci5sZW4gPSBzaXplb2Yoc3RydWN0IGlwcl9kcml2ZXJfZHVtcCk7CisJZHJpdmVyX2R1bXAtPmhkci5udW1fZW50cmllcyA9IDE7CisJZHJpdmVyX2R1bXAtPmhkci5maXJzdF9lbnRyeV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwcl9kdW1wX2hlYWRlcik7CisJZHJpdmVyX2R1bXAtPmhkci5zdGF0dXMgPSBJUFJfRFVNUF9TVEFUVVNfU1VDQ0VTUzsKKwlkcml2ZXJfZHVtcC0+aGRyLm9zID0gSVBSX0RVTVBfT1NfTElOVVg7CisJZHJpdmVyX2R1bXAtPmhkci5kcml2ZXJfbmFtZSA9IElQUl9EVU1QX0RSSVZFUl9OQU1FOworCisJaXByX2R1bXBfdmVyc2lvbl9kYXRhKGlvYV9jZmcsIGRyaXZlcl9kdW1wKTsKKwlpcHJfZHVtcF9sb2NhdGlvbl9kYXRhKGlvYV9jZmcsIGRyaXZlcl9kdW1wKTsKKwlpcHJfZHVtcF9pb2FfdHlwZV9kYXRhKGlvYV9jZmcsIGRyaXZlcl9kdW1wKTsKKwlpcHJfZHVtcF90cmFjZV9kYXRhKGlvYV9jZmcsIGRyaXZlcl9kdW1wKTsKKworCS8qIFVwZGF0ZSBkdW1wX2hlYWRlciAqLworCWRyaXZlcl9kdW1wLT5oZHIubGVuICs9IHNpemVvZihzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyKTsKKworCS8qIElPQSBEdW1wIGVudHJ5ICovCisJaXByX2luaXRfZHVtcF9lbnRyeV9oZHIoJmlvYV9kdW1wLT5oZHIpOworCWlvYV9kdW1wLT5mb3JtYXQgPSBJUFJfU0RUX0ZNVDI7CisJaW9hX2R1bXAtPmhkci5sZW4gPSAwOworCWlvYV9kdW1wLT5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0JJTkFSWTsKKwlpb2FfZHVtcC0+aGRyLmlkID0gSVBSX0RVTVBfSU9BX0RVTVBfSUQ7CisKKwkvKiBGaXJzdCBlbnRyaWVzIGluIHNkdCBhcmUgYWN0dWFsbHkgYSBsaXN0IG9mIGR1bXAgYWRkcmVzc2VzIGFuZAorCSBsZW5ndGhzIHRvIGdhdGhlciB0aGUgcmVhbCBkdW1wIGRhdGEuICBzZHQgcmVwcmVzZW50cyB0aGUgcG9pbnRlcgorCSB0byB0aGUgaW9hIGdlbmVyYXRlZCBkdW1wIHRhYmxlLiAgRHVtcCBkYXRhIHdpbGwgYmUgZXh0cmFjdGVkIGJhc2VkCisJIG9uIGVudHJpZXMgaW4gdGhpcyB0YWJsZSAqLworCXNkdCA9ICZpb2FfZHVtcC0+c2R0OworCisJcmMgPSBpcHJfZ2V0X2xkdW1wX2RhdGFfc2VjdGlvbihpb2FfY2ZnLCBzdGFydF9hZGRyLCAoX19iZTMyICopc2R0LAorCQkJCQlzaXplb2Yoc3RydWN0IGlwcl9zZHQpIC8gc2l6ZW9mKF9fYmUzMikpOworCisJLyogU21hcnQgRHVtcCB0YWJsZSBpcyByZWFkeSB0byB1c2UgYW5kIHRoZSBmaXJzdCBlbnRyeSBpcyB2YWxpZCAqLworCWlmIChyYyB8fCAoYmUzMl90b19jcHUoc2R0LT5oZHIuc3RhdGUpICE9IElQUl9GTVQyX1NEVF9SRUFEWV9UT19VU0UpKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJEdW1wIG9mIElPQSBmYWlsZWQuIER1bXAgdGFibGUgbm90IHZhbGlkOiAlZCwgJVguXG4iLAorCQkJcmMsIGJlMzJfdG9fY3B1KHNkdC0+aGRyLnN0YXRlKSk7CisJCWRyaXZlcl9kdW1wLT5oZHIuc3RhdHVzID0gSVBSX0RVTVBfU1RBVFVTX0ZBSUxFRDsKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gRFVNUF9PQlRBSU5FRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJbnVtX2VudHJpZXMgPSBiZTMyX3RvX2NwdShzZHQtPmhkci5udW1fZW50cmllc191c2VkKTsKKworCWlmIChudW1fZW50cmllcyA+IElQUl9OVU1fU0RUX0VOVFJJRVMpCisJCW51bV9lbnRyaWVzID0gSVBSX05VTV9TRFRfRU5UUklFUzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisJCWlmIChpb2FfZHVtcC0+aGRyLmxlbiA+IElQUl9NQVhfSU9BX0RVTVBfU0laRSkgeworCQkJZHJpdmVyX2R1bXAtPmhkci5zdGF0dXMgPSBJUFJfRFVNUF9TVEFUVVNfUVVBTF9TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2R0LT5lbnRyeVtpXS5mbGFncyAmIElQUl9TRFRfVkFMSURfRU5UUlkpIHsKKwkJCXNkdF93b3JkID0gYmUzMl90b19jcHUoc2R0LT5lbnRyeVtpXS5iYXJfc3RyX29mZnNldCk7CisJCQlzdGFydF9vZmYgPSBzZHRfd29yZCAmIElQUl9GTVQyX01CWF9BRERSX01BU0s7CisJCQllbmRfb2ZmID0gYmUzMl90b19jcHUoc2R0LT5lbnRyeVtpXS5lbmRfb2Zmc2V0KTsKKworCQkJaWYgKGlwcl9zZHRfaXNfZm10MihzZHRfd29yZCkgJiYgc2R0X3dvcmQpIHsKKwkJCQlieXRlc190b19jb3B5ID0gZW5kX29mZiAtIHN0YXJ0X29mZjsKKwkJCQlpZiAoYnl0ZXNfdG9fY29weSA+IElQUl9NQVhfSU9BX0RVTVBfU0laRSkgeworCQkJCQlzZHQtPmVudHJ5W2ldLmZsYWdzICY9IH5JUFJfU0RUX1ZBTElEX0VOVFJZOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiBDb3B5IGRhdGEgZnJvbSBhZGFwdGVyIHRvIGRyaXZlciBidWZmZXJzICovCisJCQkJYnl0ZXNfY29waWVkID0gaXByX3NkdF9jb3B5KGlvYV9jZmcsIHNkdF93b3JkLAorCQkJCQkJCSAgICBieXRlc190b19jb3B5KTsKKworCQkJCWlvYV9kdW1wLT5oZHIubGVuICs9IGJ5dGVzX2NvcGllZDsKKworCQkJCWlmIChieXRlc19jb3BpZWQgIT0gYnl0ZXNfdG9fY29weSkgeworCQkJCQlkcml2ZXJfZHVtcC0+aGRyLnN0YXR1cyA9IElQUl9EVU1QX1NUQVRVU19RVUFMX1NVQ0NFU1M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIkR1bXAgb2YgSU9BIGNvbXBsZXRlZC5cbiIpOworCisJLyogVXBkYXRlIGR1bXBfaGVhZGVyICovCisJZHJpdmVyX2R1bXAtPmhkci5sZW4gKz0gaW9hX2R1bXAtPmhkci5sZW47CisJd21iKCk7CisJaW9hX2NmZy0+c2R0X3N0YXRlID0gRFVNUF9PQlRBSU5FRDsKKwlMRUFWRTsKK30KKworI2Vsc2UKKyNkZWZpbmUgaXByX2dldF9pb2FfZHVtcChpb2FfY2ZnLCBkdW1wKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKioKKyAqIGlwcl9yZWxlYXNlX2R1bXAgLSBGcmVlIGFkYXB0ZXIgZHVtcCBtZW1vcnkKKyAqIEBrcmVmOglrcmVmIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9yZWxlYXNlX2R1bXAoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGlwcl9kdW1wICpkdW1wID0gY29udGFpbmVyX29mKGtyZWYsc3RydWN0IGlwcl9kdW1wLGtyZWYpOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGR1bXAtPmlvYV9jZmc7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKwlpbnQgaTsKKworCUVOVEVSOworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJaW9hX2NmZy0+ZHVtcCA9IE5VTEw7CisJaW9hX2NmZy0+c2R0X3N0YXRlID0gSU5BQ1RJVkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IGR1bXAtPmlvYV9kdW1wLm5leHRfcGFnZV9pbmRleDsgaSsrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGR1bXAtPmlvYV9kdW1wLmlvYV9kYXRhW2ldKTsKKworCWtmcmVlKGR1bXApOworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl93b3JrZXJfdGhyZWFkIC0gV29ya2VyIHRocmVhZAorICogQGRhdGE6CQlpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIENhbGxlZCBhdCB0YXNrIGxldmVsIGZyb20gYSB3b3JrIHRocmVhZC4gVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlCisgKiBvZiBhZGRpbmcgYW5kIHJlbW92aW5nIGRldmljZSBmcm9tIHRoZSBtaWQtbGF5ZXIgYXMgY29uZmlndXJhdGlvbgorICogY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgYnkgdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl93b3JrZXJfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IGlwcl9kdW1wICpkdW1wOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGRhdGE7CisJdTggYnVzLCB0YXJnZXQsIGx1bjsKKwlpbnQgZGlkX3dvcms7CisKKwlFTlRFUjsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBHRVRfRFVNUCkgeworCQlkdW1wID0gaW9hX2NmZy0+ZHVtcDsKKwkJaWYgKCFkdW1wKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJa3JlZl9nZXQoJmR1bXAtPmtyZWYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCWlwcl9nZXRfaW9hX2R1bXAoaW9hX2NmZywgZHVtcCk7CisJCWtyZWZfcHV0KCZkdW1wLT5rcmVmLCBpcHJfcmVsZWFzZV9kdW1wKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IERVTVBfT0JUQUlORUQpCisJCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT05FKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCityZXN0YXJ0OgorCWRvIHsKKwkJZGlkX3dvcmsgPSAwOworCQlpZiAoIWlvYV9jZmctPmFsbG93X2NtZHMgfHwgIWlvYV9jZmctPmFsbG93X21sX2FkZF9kZWwpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJCWlmIChyZXMtPmRlbF9mcm9tX21sICYmIHJlcy0+c2RldikgeworCQkJCWRpZF93b3JrID0gMTsKKwkJCQlzZGV2ID0gcmVzLT5zZGV2OworCQkJCWlmICghc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKSB7CisJCQkJCXJlcy0+c2RldiA9IE5VTEw7CisJCQkJCWxpc3RfbW92ZV90YWlsKCZyZXMtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOworCQkJCQlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZShkaWRfd29yayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJmlvYV9jZmctPnVzZWRfcmVzX3EsIHF1ZXVlKSB7CisJCWlmIChyZXMtPmFkZF90b19tbCkgeworCQkJYnVzID0gcmVzLT5jZmd0ZS5yZXNfYWRkci5idXM7CisJCQl0YXJnZXQgPSByZXMtPmNmZ3RlLnJlc19hZGRyLnRhcmdldDsKKwkJCWx1biA9IHJlcy0+Y2ZndGUucmVzX2FkZHIubHVuOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJc2NzaV9hZGRfZGV2aWNlKGlvYV9jZmctPmhvc3QsIGJ1cywgdGFyZ2V0LCBsdW4pOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlrb2JqZWN0X3VldmVudCgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfY2xhc3NkZXYua29iaiwgS09CSl9DSEFOR0UsIE5VTEwpOworCUxFQVZFOworfQorCisjaWZkZWYgQ09ORklHX1NDU0lfSVBSX1RSQUNFCisvKioKKyAqIGlwcl9yZWFkX3RyYWNlIC0gRHVtcCB0aGUgYWRhcHRlciB0cmFjZQorICogQGtvYmo6CQlrb2JqZWN0IHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICogQG9mZjoJCW9mZnNldAorICogQGNvdW50OgkJYnVmZmVyIHNpemUKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCB0byBidWZmZXIKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9yZWFkX3RyYWNlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkgICAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiA9IGNvbnRhaW5lcl9vZihrb2JqLHN0cnVjdCBjbGFzc19kZXZpY2Usa29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJaW50IHNpemUgPSBJUFJfVFJBQ0VfU0laRTsKKwljaGFyICpzcmMgPSAoY2hhciAqKWlvYV9jZmctPnRyYWNlOworCisJaWYgKG9mZiA+IHNpemUpCisJCXJldHVybiAwOworCWlmIChvZmYgKyBjb3VudCA+IHNpemUpIHsKKwkJc2l6ZSAtPSBvZmY7CisJCWNvdW50ID0gc2l6ZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCW1lbWNweShidWYsICZzcmNbb2ZmXSwgY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBpcHJfdHJhY2VfYXR0ciA9IHsKKwkuYXR0ciA9CXsKKwkJLm5hbWUgPSAidHJhY2UiLAorCQkubW9kZSA9IFNfSVJVR08sCisJfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBpcHJfcmVhZF90cmFjZSwKK307CisjZW5kaWYKKworLyoqCisgKiBpcHJfc2hvd19md192ZXJzaW9uIC0gU2hvdyB0aGUgZmlybXdhcmUgdmVyc2lvbgorICogQGNsYXNzX2RldjoJY2xhc3MgZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCW51bWJlciBvZiBieXRlcyBwcmludGVkIHRvIGJ1ZmZlcgorICoqLworc3RhdGljIHNzaXplX3QgaXByX3Nob3dfZndfdmVyc2lvbihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX2lucXVpcnlfcGFnZTMgKnVjb2RlX3ZwZCA9ICZpb2FfY2ZnLT52cGRfY2JzLT5wYWdlM19kYXRhOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJaW50IGxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDJYJTAyWCUwMlglMDJYXG4iLAorCQkgICAgICAgdWNvZGVfdnBkLT5tYWpvcl9yZWxlYXNlLCB1Y29kZV92cGQtPmNhcmRfdHlwZSwKKwkJICAgICAgIHVjb2RlX3ZwZC0+bWlub3JfcmVsZWFzZVswXSwKKwkJICAgICAgIHVjb2RlX3ZwZC0+bWlub3JfcmVsZWFzZVsxXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpcHJfZndfdmVyc2lvbl9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9CQkiZndfdmVyc2lvbiIsCisJCS5tb2RlID0JCVNfSVJVR08sCisJfSwKKwkuc2hvdyA9IGlwcl9zaG93X2Z3X3ZlcnNpb24sCit9OworCisvKioKKyAqIGlwcl9zaG93X2xvZ19sZXZlbCAtIFNob3cgdGhlIGFkYXB0ZXIncyBlcnJvciBsb2dnaW5nIGxldmVsCisgKiBAY2xhc3NfZGV2OgljbGFzcyBkZXZpY2Ugc3RydWN0CisgKiBAYnVmOgkJYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW51bWJlciBvZiBieXRlcyBwcmludGVkIHRvIGJ1ZmZlcgorICoqLworc3RhdGljIHNzaXplX3QgaXByX3Nob3dfbG9nX2xldmVsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJaW50IGxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaW9hX2NmZy0+bG9nX2xldmVsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBpcHJfc3RvcmVfbG9nX2xldmVsIC0gQ2hhbmdlIHRoZSBhZGFwdGVyJ3MgZXJyb3IgbG9nZ2luZyBsZXZlbAorICogQGNsYXNzX2RldjoJY2xhc3MgZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCB0byBidWZmZXIKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9zdG9yZV9sb2dfbGV2ZWwoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlvYV9jZmctPmxvZ19sZXZlbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpcHJfbG9nX2xldmVsX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0JCSJsb2dfbGV2ZWwiLAorCQkubW9kZSA9CQlTX0lSVUdPIHwgU19JV1VTUiwKKwl9LAorCS5zaG93ID0gaXByX3Nob3dfbG9nX2xldmVsLAorCS5zdG9yZSA9IGlwcl9zdG9yZV9sb2dfbGV2ZWwKK307CisKKy8qKgorICogaXByX3N0b3JlX2RpYWdub3N0aWNzIC0gSU9BIERpYWdub3N0aWNzIGludGVyZmFjZQorICogQGNsYXNzX2RldjoJY2xhc3NfZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICogQGNvdW50OgkJYnVmZmVyIHNpemUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIGFkYXB0ZXIgYW5kIHdhaXQgYSByZWFzb25hYmxlCisgKiBhbW91bnQgb2YgdGltZSBmb3IgYW55IGVycm9ycyB0aGF0IHRoZSBhZGFwdGVyIG1pZ2h0IGxvZy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJY291bnQgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9zdG9yZV9kaWFnbm9zdGljcyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCWludCByYyA9IGNvdW50OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXdhaXRfZXZlbnQoaW9hX2NmZy0+cmVzZXRfd2FpdF9xLCAhaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlvYV9jZmctPmVycm9yc19sb2dnZWQgPSAwOworCWlwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgSVBSX1NIVVRET1dOX05PUk1BTCk7CisKKwlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJd2FpdF9ldmVudChpb2FfY2ZnLT5yZXNldF93YWl0X3EsICFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpOworCisJCS8qIFdhaXQgZm9yIGEgc2Vjb25kIGZvciBhbnkgZXJyb3JzIHRvIGJlIGxvZ2dlZCAqLworCQltc2xlZXAoMTAwMCk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlmIChpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgfHwgaW9hX2NmZy0+ZXJyb3JzX2xvZ2dlZCkKKwkJcmMgPSAtRUlPOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGlwcl9kaWFnbm9zdGljc19hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9CQkicnVuX2RpYWdub3N0aWNzIiwKKwkJLm1vZGUgPQkJU19JV1VTUiwKKwl9LAorCS5zdG9yZSA9IGlwcl9zdG9yZV9kaWFnbm9zdGljcworfTsKKworLyoqCisgKiBpcHJfc3RvcmVfcmVzZXRfYWRhcHRlciAtIFJlc2V0IHRoZSBhZGFwdGVyCisgKiBAY2xhc3NfZGV2OgljbGFzc19kZXZpY2Ugc3RydWN0CisgKiBAYnVmOgkJYnVmZmVyCisgKiBAY291bnQ6CQlidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJY291bnQgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl9zdG9yZV9yZXNldF9hZGFwdGVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCWludCByZXN1bHQgPSBjb3VudDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlmICghaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKQorCQlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT1JNQUwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgaXByX2lvYV9yZXNldF9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9CQkicmVzZXRfaG9zdCIsCisJCS5tb2RlID0JCVNfSVdVU1IsCisJfSwKKwkuc3RvcmUgPSBpcHJfc3RvcmVfcmVzZXRfYWRhcHRlcgorfTsKKworLyoqCisgKiBpcHJfYWxsb2NfdWNvZGVfYnVmZmVyIC0gQWxsb2NhdGVzIGEgbWljcm9jb2RlIGRvd25sb2FkIGJ1ZmZlcgorICogQGJ1Zl9sZW46CQlidWZmZXIgbGVuZ3RoCisgKgorICogQWxsb2NhdGVzIGEgRE1BJ2FibGUgYnVmZmVyIGluIGNodW5rcyBhbmQgYXNzZW1ibGVzIGEgc2NhdHRlci9nYXRoZXIKKyAqIGxpc3QgdG8gdXNlIGZvciBtaWNyb2NvZGUgZG93bmxvYWQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJcG9pbnRlciB0byBzZ2xpc3QgLyBOVUxMIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBzdHJ1Y3QgaXByX3NnbGlzdCAqaXByX2FsbG9jX3Vjb2RlX2J1ZmZlcihpbnQgYnVmX2xlbikKK3sKKwlpbnQgc2dfc2l6ZSwgb3JkZXIsIGJzaXplX2VsZW0sIG51bV9lbGVtLCBpLCBqOworCXN0cnVjdCBpcHJfc2dsaXN0ICpzZ2xpc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2F0dGVybGlzdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCS8qIEdldCB0aGUgbWluaW11bSBzaXplIHBlciBzY2F0dGVyL2dhdGhlciBlbGVtZW50ICovCisJc2dfc2l6ZSA9IGJ1Zl9sZW4gLyAoSVBSX01BWF9TR0xJU1QgLSAxKTsKKworCS8qIEdldCB0aGUgYWN0dWFsIHNpemUgcGVyIGVsZW1lbnQgKi8KKwlvcmRlciA9IGdldF9vcmRlcihzZ19zaXplKTsKKworCS8qIERldGVybWluZSB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyBwZXIgZWxlbWVudCAqLworCWJzaXplX2VsZW0gPSBQQUdFX1NJWkUgKiAoMSA8PCBvcmRlcik7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCBudW1iZXIgb2Ygc2cgZW50cmllcyBuZWVkZWQgKi8KKwlpZiAoYnVmX2xlbiAlIGJzaXplX2VsZW0pCisJCW51bV9lbGVtID0gKGJ1Zl9sZW4gLyBic2l6ZV9lbGVtKSArIDE7CisJZWxzZQorCQludW1fZWxlbSA9IGJ1Zl9sZW4gLyBic2l6ZV9lbGVtOworCisJLyogQWxsb2NhdGUgYSBzY2F0dGVyL2dhdGhlciBsaXN0IGZvciB0aGUgRE1BICovCisJc2dsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcl9zZ2xpc3QpICsKKwkJCSAoc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKiAobnVtX2VsZW0gLSAxKSksCisJCQkgR0ZQX0tFUk5FTCk7CisKKwlpZiAoc2dsaXN0ID09IE5VTEwpIHsKKwkJaXByX3RyYWNlOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc2dsaXN0LCAwLCBzaXplb2Yoc3RydWN0IGlwcl9zZ2xpc3QpICsKKwkgICAgICAgKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICogKG51bV9lbGVtIC0gMSkpKTsKKworCXNjYXR0ZXJsaXN0ID0gc2dsaXN0LT5zY2F0dGVybGlzdDsKKworCXNnbGlzdC0+b3JkZXIgPSBvcmRlcjsKKwlzZ2xpc3QtPm51bV9zZyA9IG51bV9lbGVtOworCisJLyogQWxsb2NhdGUgYSBidW5jaCBvZiBzZyBlbGVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fZWxlbTsgaSsrKSB7CisJCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJCWlmICghcGFnZSkgeworCQkJaXByX3RyYWNlOworCisJCQkvKiBGcmVlIHVwIHdoYXQgd2UgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwkJCWZvciAoaiA9IGkgLSAxOyBqID49IDA7IGotLSkKKwkJCQlfX2ZyZWVfcGFnZXMoc2NhdHRlcmxpc3Rbal0ucGFnZSwgb3JkZXIpOworCQkJa2ZyZWUoc2dsaXN0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJc2NhdHRlcmxpc3RbaV0ucGFnZSA9IHBhZ2U7CisJfQorCisJcmV0dXJuIHNnbGlzdDsKK30KKworLyoqCisgKiBpcHJfZnJlZV91Y29kZV9idWZmZXIgLSBGcmVlcyBhIG1pY3JvY29kZSBkb3dubG9hZCBidWZmZXIKKyAqIEBwX2RubGQ6CQlzY2F0dGVyL2dhdGhlciBsaXN0IHBvaW50ZXIKKyAqCisgKiBGcmVlIGEgRE1BJ2FibGUgdWNvZGUgZG93bmxvYWQgYnVmZmVyIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGgKKyAqIGlwcl9hbGxvY191Y29kZV9idWZmZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2ZyZWVfdWNvZGVfYnVmZmVyKHN0cnVjdCBpcHJfc2dsaXN0ICpzZ2xpc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dsaXN0LT5udW1fc2c7IGkrKykKKwkJX19mcmVlX3BhZ2VzKHNnbGlzdC0+c2NhdHRlcmxpc3RbaV0ucGFnZSwgc2dsaXN0LT5vcmRlcik7CisKKwlrZnJlZShzZ2xpc3QpOworfQorCisvKioKKyAqIGlwcl9jb3B5X3Vjb2RlX2J1ZmZlciAtIENvcHkgdXNlciBidWZmZXIgdG8ga2VybmVsIGJ1ZmZlcgorICogQHNnbGlzdDoJCXNjYXR0ZXIvZ2F0aGVyIGxpc3QgcG9pbnRlcgorICogQGJ1ZmZlcjoJCWJ1ZmZlciBwb2ludGVyCisgKiBAbGVuOgkJYnVmZmVyIGxlbmd0aAorICoKKyAqIENvcHkgYSBtaWNyb2NvZGUgaW1hZ2UgZnJvbSBhIHVzZXIgYnVmZmVyIGludG8gYSBidWZmZXIgYWxsb2NhdGVkIGJ5CisgKiBpcHJfYWxsb2NfdWNvZGVfYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2NvcHlfdWNvZGVfYnVmZmVyKHN0cnVjdCBpcHJfc2dsaXN0ICpzZ2xpc3QsCisJCQkJIHU4ICpidWZmZXIsIHUzMiBsZW4pCit7CisJaW50IGJzaXplX2VsZW0sIGksIHJlc3VsdCA9IDA7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2F0dGVybGlzdDsKKwl2b2lkICprYWRkcjsKKworCS8qIERldGVybWluZSB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyBwZXIgZWxlbWVudCAqLworCWJzaXplX2VsZW0gPSBQQUdFX1NJWkUgKiAoMSA8PCBzZ2xpc3QtPm9yZGVyKTsKKworCXNjYXR0ZXJsaXN0ID0gc2dsaXN0LT5zY2F0dGVybGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCAobGVuIC8gYnNpemVfZWxlbSk7IGkrKywgYnVmZmVyICs9IGJzaXplX2VsZW0pIHsKKwkJa2FkZHIgPSBrbWFwKHNjYXR0ZXJsaXN0W2ldLnBhZ2UpOworCQltZW1jcHkoa2FkZHIsIGJ1ZmZlciwgYnNpemVfZWxlbSk7CisJCWt1bm1hcChzY2F0dGVybGlzdFtpXS5wYWdlKTsKKworCQlzY2F0dGVybGlzdFtpXS5sZW5ndGggPSBic2l6ZV9lbGVtOworCisJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJaXByX3RyYWNlOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKworCWlmIChsZW4gJSBic2l6ZV9lbGVtKSB7CisJCWthZGRyID0ga21hcChzY2F0dGVybGlzdFtpXS5wYWdlKTsKKwkJbWVtY3B5KGthZGRyLCBidWZmZXIsIGxlbiAlIGJzaXplX2VsZW0pOworCQlrdW5tYXAoc2NhdHRlcmxpc3RbaV0ucGFnZSk7CisKKwkJc2NhdHRlcmxpc3RbaV0ubGVuZ3RoID0gbGVuICUgYnNpemVfZWxlbTsKKwl9CisKKwlzZ2xpc3QtPmJ1ZmZlcl9sZW4gPSBsZW47CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBpcHJfbWFwX3Vjb2RlX2J1ZmZlciAtIE1hcCBhIG1pY3JvY29kZSBkb3dubG9hZCBidWZmZXIKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqIEBzZ2xpc3Q6CQlzY2F0dGVyL2dhdGhlciBsaXN0CisgKiBAbGVuOgkJdG90YWwgbGVuZ3RoIG9mIGRvd25sb2FkIGJ1ZmZlcgorICoKKyAqIE1hcHMgYSBtaWNyb2NvZGUgZG93bmxvYWQgc2NhdHRlci9nYXRoZXIgbGlzdCBmb3IgRE1BIGFuZAorICogYnVpbGRzIHRoZSBJT0FETC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gLUVJTyBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGlwcl9tYXBfdWNvZGVfYnVmZmVyKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCwKKwkJCQlzdHJ1Y3QgaXByX3NnbGlzdCAqc2dsaXN0LCBpbnQgbGVuKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJc3RydWN0IGlwcl9pb2FkbF9kZXNjICppb2FkbCA9IGlwcl9jbWQtPmlvYWRsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NhdHRlcmxpc3QgPSBzZ2xpc3QtPnNjYXR0ZXJsaXN0OworCWludCBpOworCisJaXByX2NtZC0+ZG1hX3VzZV9zZyA9IHBjaV9tYXBfc2coaW9hX2NmZy0+cGRldiwgc2NhdHRlcmxpc3QsCisJCQkJCSBzZ2xpc3QtPm51bV9zZywgRE1BX1RPX0RFVklDRSk7CisKKwlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX1dSSVRFX05PVF9SRUFEOworCWlvYXJjYi0+d3JpdGVfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMihsZW4pOworCWlvYXJjYi0+d3JpdGVfaW9hZGxfbGVuID0KKwkJY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykgKiBpcHJfY21kLT5kbWFfdXNlX3NnKTsKKworCWZvciAoaSA9IDA7IGkgPCBpcHJfY21kLT5kbWFfdXNlX3NnOyBpKyspIHsKKwkJaW9hZGxbaV0uZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19XUklURSB8IHNnX2RtYV9sZW4oJnNjYXR0ZXJsaXN0W2ldKSk7CisJCWlvYWRsW2ldLmFkZHJlc3MgPQorCQkJY3B1X3RvX2JlMzIoc2dfZG1hX2FkZHJlc3MoJnNjYXR0ZXJsaXN0W2ldKSk7CisJfQorCisJaWYgKGxpa2VseShpcHJfY21kLT5kbWFfdXNlX3NnKSkgeworCQlpb2FkbFtpLTFdLmZsYWdzX2FuZF9kYXRhX2xlbiB8PQorCQkJY3B1X3RvX2JlMzIoSVBSX0lPQURMX0ZMQUdTX0xBU1QpOworCX0KKwllbHNlIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAicGNpX21hcF9zZyBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX3N0b3JlX3VwZGF0ZV9mdyAtIFVwZGF0ZSB0aGUgZmlybXdhcmUgb24gdGhlIGFkYXB0ZXIKKyAqIEBjbGFzc19kZXY6CWNsYXNzX2RldmljZSBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqIEBjb3VudDoJCWJ1ZmZlciBzaXplCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSB0aGUgZmlybXdhcmUgb24gdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCWNvdW50IG9uIHN1Y2Nlc3MgLyBvdGhlciBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfc3RvcmVfdXBkYXRlX2Z3KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjbGFzc19kZXYpOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl91Y29kZV9pbWFnZV9oZWFkZXIgKmltYWdlX2hkcjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OworCXN0cnVjdCBpcHJfc2dsaXN0ICpzZ2xpc3Q7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCWNoYXIgZm5hbWVbMTAwXTsKKwljaGFyICpzcmM7CisJaW50IGxlbiwgcmVzdWx0LCBkbmxkX3NpemU7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCisJbGVuID0gc25wcmludGYoZm5hbWUsIDk5LCAiJXMiLCBidWYpOworCWZuYW1lW2xlbi0xXSA9ICdcMCc7CisKKwlpZihyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgZm5hbWUsICZpb2FfY2ZnLT5wZGV2LT5kZXYpKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgIkZpcm13YXJlIGZpbGUgJXMgbm90IGZvdW5kXG4iLCBmbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWltYWdlX2hkciA9IChzdHJ1Y3QgaXByX3Vjb2RlX2ltYWdlX2hlYWRlciAqKWZ3X2VudHJ5LT5kYXRhOworCisJaWYgKGJlMzJfdG9fY3B1KGltYWdlX2hkci0+aGVhZGVyX2xlbmd0aCkgPiBmd19lbnRyeS0+c2l6ZSB8fAorCSAgICAoaW9hX2NmZy0+dnBkX2Nicy0+cGFnZTNfZGF0YS5jYXJkX3R5cGUgJiYKKwkgICAgIGlvYV9jZmctPnZwZF9jYnMtPnBhZ2UzX2RhdGEuY2FyZF90eXBlICE9IGltYWdlX2hkci0+Y2FyZF90eXBlKSkgeworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJJbnZhbGlkIG1pY3JvY29kZSBidWZmZXJcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3JjID0gKHU4ICopaW1hZ2VfaGRyICsgYmUzMl90b19jcHUoaW1hZ2VfaGRyLT5oZWFkZXJfbGVuZ3RoKTsKKwlkbmxkX3NpemUgPSBmd19lbnRyeS0+c2l6ZSAtIGJlMzJfdG9fY3B1KGltYWdlX2hkci0+aGVhZGVyX2xlbmd0aCk7CisJc2dsaXN0ID0gaXByX2FsbG9jX3Vjb2RlX2J1ZmZlcihkbmxkX3NpemUpOworCisJaWYgKCFzZ2xpc3QpIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiTWljcm9jb2RlIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXN1bHQgPSBpcHJfY29weV91Y29kZV9idWZmZXIoc2dsaXN0LCBzcmMsIGRubGRfc2l6ZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJNaWNyb2NvZGUgYnVmZmVyIGNvcHkgdG8gRE1BIGJ1ZmZlciBmYWlsZWRcbiIpOworCQlpcHJfZnJlZV91Y29kZV9idWZmZXIoc2dsaXN0KTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChpb2FfY2ZnLT51Y29kZV9zZ2xpc3QpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiTWljcm9jb2RlIGRvd25sb2FkIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiIpOworCQlpcHJfZnJlZV91Y29kZV9idWZmZXIoc2dsaXN0KTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlvYV9jZmctPnVjb2RlX3NnbGlzdCA9IHNnbGlzdDsKKwlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIElQUl9TSFVURE9XTl9OT1JNQUwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlvYV9jZmctPnVjb2RlX3NnbGlzdCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaXByX2ZyZWVfdWNvZGVfYnVmZmVyKHNnbGlzdCk7CisJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBpcHJfdXBkYXRlX2Z3X2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0JCSJ1cGRhdGVfZnciLAorCQkubW9kZSA9CQlTX0lXVVNSLAorCX0sCisJLnN0b3JlID0gaXByX3N0b3JlX3VwZGF0ZV9mdworfTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICppcHJfaW9hX2F0dHJzW10gPSB7CisJJmlwcl9md192ZXJzaW9uX2F0dHIsCisJJmlwcl9sb2dfbGV2ZWxfYXR0ciwKKwkmaXByX2RpYWdub3N0aWNzX2F0dHIsCisJJmlwcl9pb2FfcmVzZXRfYXR0ciwKKwkmaXByX3VwZGF0ZV9md19hdHRyLAorCU5VTEwsCit9OworCisjaWZkZWYgQ09ORklHX1NDU0lfSVBSX0RVTVAKKy8qKgorICogaXByX3JlYWRfZHVtcCAtIER1bXAgdGhlIGFkYXB0ZXIKKyAqIEBrb2JqOgkJa29iamVjdCBzdHJ1Y3QKKyAqIEBidWY6CQlidWZmZXIKKyAqIEBvZmY6CQlvZmZzZXQKKyAqIEBjb3VudDoJCWJ1ZmZlciBzaXplCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgdG8gYnVmZmVyCisgKiovCitzdGF0aWMgc3NpemVfdCBpcHJfcmVhZF9kdW1wKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkgICAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiA9IGNvbnRhaW5lcl9vZihrb2JqLHN0cnVjdCBjbGFzc19kZXZpY2Usa29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfZHVtcCAqZHVtcDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCWNoYXIgKnNyYzsKKwlpbnQgbGVuOworCXNpemVfdCByYyA9IGNvdW50OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJZHVtcCA9IGlvYV9jZmctPmR1bXA7CisKKwlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlICE9IERVTVBfT0JUQUlORUQgfHwgIWR1bXApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJa3JlZl9nZXQoJmR1bXAtPmtyZWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChvZmYgPiBkdW1wLT5kcml2ZXJfZHVtcC5oZHIubGVuKSB7CisJCWtyZWZfcHV0KCZkdW1wLT5rcmVmLCBpcHJfcmVsZWFzZV9kdW1wKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9mZiArIGNvdW50ID4gZHVtcC0+ZHJpdmVyX2R1bXAuaGRyLmxlbikgeworCQljb3VudCA9IGR1bXAtPmRyaXZlcl9kdW1wLmhkci5sZW4gLSBvZmY7CisJCXJjID0gY291bnQ7CisJfQorCisJaWYgKGNvdW50ICYmIG9mZiA8IHNpemVvZihkdW1wLT5kcml2ZXJfZHVtcCkpIHsKKwkJaWYgKG9mZiArIGNvdW50ID4gc2l6ZW9mKGR1bXAtPmRyaXZlcl9kdW1wKSkKKwkJCWxlbiA9IHNpemVvZihkdW1wLT5kcml2ZXJfZHVtcCkgLSBvZmY7CisJCWVsc2UKKwkJCWxlbiA9IGNvdW50OworCQlzcmMgPSAodTggKikmZHVtcC0+ZHJpdmVyX2R1bXAgKyBvZmY7CisJCW1lbWNweShidWYsIHNyYywgbGVuKTsKKwkJYnVmICs9IGxlbjsKKwkJb2ZmICs9IGxlbjsKKwkJY291bnQgLT0gbGVuOworCX0KKworCW9mZiAtPSBzaXplb2YoZHVtcC0+ZHJpdmVyX2R1bXApOworCisJaWYgKGNvdW50ICYmIG9mZiA8IG9mZnNldG9mKHN0cnVjdCBpcHJfaW9hX2R1bXAsIGlvYV9kYXRhKSkgeworCQlpZiAob2ZmICsgY291bnQgPiBvZmZzZXRvZihzdHJ1Y3QgaXByX2lvYV9kdW1wLCBpb2FfZGF0YSkpCisJCQlsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaXByX2lvYV9kdW1wLCBpb2FfZGF0YSkgLSBvZmY7CisJCWVsc2UKKwkJCWxlbiA9IGNvdW50OworCQlzcmMgPSAodTggKikmZHVtcC0+aW9hX2R1bXAgKyBvZmY7CisJCW1lbWNweShidWYsIHNyYywgbGVuKTsKKwkJYnVmICs9IGxlbjsKKwkJb2ZmICs9IGxlbjsKKwkJY291bnQgLT0gbGVuOworCX0KKworCW9mZiAtPSBvZmZzZXRvZihzdHJ1Y3QgaXByX2lvYV9kdW1wLCBpb2FfZGF0YSk7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJaWYgKChvZmYgJiBQQUdFX01BU0spICE9ICgob2ZmICsgY291bnQpICYgUEFHRV9NQVNLKSkKKwkJCWxlbiA9IFBBR0VfQUxJR04ob2ZmKSAtIG9mZjsKKwkJZWxzZQorCQkJbGVuID0gY291bnQ7CisJCXNyYyA9ICh1OCAqKWR1bXAtPmlvYV9kdW1wLmlvYV9kYXRhWyhvZmYgJiBQQUdFX01BU0spID4+IFBBR0VfU0hJRlRdOworCQlzcmMgKz0gb2ZmICYgflBBR0VfTUFTSzsKKwkJbWVtY3B5KGJ1Ziwgc3JjLCBsZW4pOworCQlidWYgKz0gbGVuOworCQlvZmYgKz0gbGVuOworCQljb3VudCAtPSBsZW47CisJfQorCisJa3JlZl9wdXQoJmR1bXAtPmtyZWYsIGlwcl9yZWxlYXNlX2R1bXApOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfYWxsb2NfZHVtcCAtIFByZXBhcmUgZm9yIGFkYXB0ZXIgZHVtcAorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfYWxsb2NfZHVtcChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IGlwcl9kdW1wICpkdW1wOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlFTlRFUjsKKwlkdW1wID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcl9kdW1wKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWR1bXApIHsKKwkJaXByX2VycigiRHVtcCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoZHVtcCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcCkpOworCWtyZWZfaW5pdCgmZHVtcC0+a3JlZik7CisJZHVtcC0+aW9hX2NmZyA9IGlvYV9jZmc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKElOQUNUSVZFICE9IGlvYV9jZmctPnNkdF9zdGF0ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCWtmcmVlKGR1bXApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpb2FfY2ZnLT5kdW1wID0gZHVtcDsKKwlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBXQUlUX0ZPUl9EVU1QOworCWlmIChpb2FfY2ZnLT5pb2FfaXNfZGVhZCAmJiAhaW9hX2NmZy0+ZHVtcF90YWtlbikgeworCQlpb2FfY2ZnLT5kdW1wX3Rha2VuID0gMTsKKwkJc2NoZWR1bGVfd29yaygmaW9hX2NmZy0+d29ya19xKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJTEVBVkU7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX2ZyZWVfZHVtcCAtIEZyZWUgYWRhcHRlciBkdW1wIG1lbW9yeQorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCBvbiBzdWNjZXNzIC8gb3RoZXIgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpcHJfZnJlZV9kdW1wKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlzdHJ1Y3QgaXByX2R1bXAgKmR1bXA7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKworCUVOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlkdW1wID0gaW9hX2NmZy0+ZHVtcDsKKwlpZiAoIWR1bXApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpb2FfY2ZnLT5kdW1wID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwlrcmVmX3B1dCgmZHVtcC0+a3JlZiwgaXByX3JlbGVhc2VfZHVtcCk7CisKKwlMRUFWRTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfd3JpdGVfZHVtcCAtIFNldHVwIGR1bXAgc3RhdGUgb2YgYWRhcHRlcgorICogQGtvYmo6CQlrb2JqZWN0IHN0cnVjdAorICogQGJ1ZjoJCWJ1ZmZlcgorICogQG9mZjoJCW9mZnNldAorICogQGNvdW50OgkJYnVmZmVyIHNpemUKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgludW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCB0byBidWZmZXIKKyAqKi8KK3N0YXRpYyBzc2l6ZV90IGlwcl93cml0ZV9kdW1wKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkgICAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiA9IGNvbnRhaW5lcl9vZihrb2JqLHN0cnVjdCBjbGFzc19kZXZpY2Usa29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCWludCByYzsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoYnVmWzBdID09ICcxJykKKwkJcmMgPSBpcHJfYWxsb2NfZHVtcChpb2FfY2ZnKTsKKwllbHNlIGlmIChidWZbMF0gPT0gJzAnKQorCQlyYyA9IGlwcl9mcmVlX2R1bXAoaW9hX2NmZyk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWVsc2UKKwkJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgaXByX2R1bXBfYXR0ciA9IHsKKwkuYXR0ciA9CXsKKwkJLm5hbWUgPSAiZHVtcCIsCisJCS5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBpcHJfcmVhZF9kdW1wLAorCS53cml0ZSA9IGlwcl93cml0ZV9kdW1wCit9OworI2Vsc2UKK3N0YXRpYyBpbnQgaXByX2ZyZWVfZHVtcChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpIHsgcmV0dXJuIDA7IH07CisjZW5kaWYKKworLyoqCisgKiBpcHJfY2hhbmdlX3F1ZXVlX2RlcHRoIC0gQ2hhbmdlIHRoZSBkZXZpY2UncyBxdWV1ZSBkZXB0aAorICogQHNkZXY6CXNjc2kgZGV2aWNlIHN0cnVjdAorICogQHFkZXB0aDoJZGVwdGggdG8gc2V0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCWFjdHVhbCBkZXB0aCBzZXQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxZGVwdGgpCit7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksIHFkZXB0aCk7CisJcmV0dXJuIHNkZXYtPnF1ZXVlX2RlcHRoOworfQorCisvKioKKyAqIGlwcl9jaGFuZ2VfcXVldWVfdHlwZSAtIENoYW5nZSB0aGUgZGV2aWNlJ3MgcXVldWUgdHlwZQorICogQGRzZXY6CQlzY3NpIGRldmljZSBzdHJ1Y3QKKyAqIEB0YWdfdHlwZToJdHlwZSBvZiB0YWdzIHRvIHVzZQorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlhY3R1YWwgcXVldWUgdHlwZSBzZXQKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRhZ190eXBlKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmVzID0gKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKilzZGV2LT5ob3N0ZGF0YTsKKworCWlmIChyZXMpIHsKKwkJaWYgKGlwcl9pc19nc2NzaShyZXMpICYmIHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBib3RoZXIgcXVpZXNjaW5nIHRoZSBkZXZpY2UgaGVyZSBzaW5jZSB0aGUKKwkJCSAqIGFkYXB0ZXIgZmlybXdhcmUgZG9lcyBpdCBmb3IgdXMuCisJCQkgKi8KKwkJCXNjc2lfc2V0X3RhZ190eXBlKHNkZXYsIHRhZ190eXBlKTsKKworCQkJaWYgKHRhZ190eXBlKQorCQkJCXNjc2lfYWN0aXZhdGVfdGNxKHNkZXYsIHNkZXYtPnF1ZXVlX2RlcHRoKTsKKwkJCWVsc2UKKwkJCQlzY3NpX2RlYWN0aXZhdGVfdGNxKHNkZXYsIHNkZXYtPnF1ZXVlX2RlcHRoKTsKKwkJfSBlbHNlCisJCQl0YWdfdHlwZSA9IDA7CisJfSBlbHNlCisJCXRhZ190eXBlID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gdGFnX3R5cGU7Cit9CisKKy8qKgorICogaXByX3Nob3dfYWRhcHRlcl9oYW5kbGUgLSBTaG93IHRoZSBhZGFwdGVyJ3MgcmVzb3VyY2UgaGFuZGxlIGZvciB0aGlzIGRldmljZQorICogQGRldjoJZGV2aWNlIHN0cnVjdAorICogQGJ1ZjoJYnVmZmVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW51bWJlciBvZiBieXRlcyBwcmludGVkIHRvIGJ1ZmZlcgorICoqLworc3RhdGljIHNzaXplX3QgaXByX3Nob3dfYWRhcHRlcl9oYW5kbGUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJc3NpemVfdCBsZW4gPSAtRU5YSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXJlcyA9IChzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICopc2Rldi0+aG9zdGRhdGE7CisJaWYgKHJlcykKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDhYXG4iLCByZXMtPmNmZ3RlLnJlc19oYW5kbGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaXByX2FkYXB0ZXJfaGFuZGxlX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gCSJhZGFwdGVyX2hhbmRsZSIsCisJCS5tb2RlID0JCVNfSVJVU1IsCisJfSwKKwkuc2hvdyA9IGlwcl9zaG93X2FkYXB0ZXJfaGFuZGxlCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmlwcl9kZXZfYXR0cnNbXSA9IHsKKwkmaXByX2FkYXB0ZXJfaGFuZGxlX2F0dHIsCisJTlVMTCwKK307CisKKy8qKgorICogaXByX2Jpb3NwYXJhbSAtIFJldHVybiB0aGUgSFNDIG1hcHBpbmcKKyAqIEBzZGV2OgkJCXNjc2kgZGV2aWNlIHN0cnVjdAorICogQGJsb2NrX2RldmljZToJYmxvY2sgZGV2aWNlIHBvaW50ZXIKKyAqIEBjYXBhY2l0eToJCWNhcGFjaXR5IG9mIHRoZSBkZXZpY2UKKyAqIEBwYXJtOgkJCUFycmF5IGNvbnRhaW5pbmcgcmV0dXJuZWQgSFNDIHZhbHVlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgSFNDIHBhcm1zIHRoYXQgZmRpc2sgdXNlcy4KKyAqIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIHJldHVybiBzb21ldGhpbmcgdGhhdCBwbGFjZXMgcGFydGl0aW9ucworICogb24gNGsgYm91bmRhcmllcyBmb3IgYmVzdCBwZXJmb3JtYW5jZSB3aXRoIHRoZSBJT0EuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcworICoqLworc3RhdGljIGludCBpcHJfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCSBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibG9ja19kZXZpY2UsCisJCQkgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqcGFybSkKK3sKKwlpbnQgaGVhZHMsIHNlY3RvcnM7CisJc2VjdG9yX3QgY3lsaW5kZXJzOworCisJaGVhZHMgPSAxMjg7CisJc2VjdG9ycyA9IDMyOworCisJY3lsaW5kZXJzID0gY2FwYWNpdHk7CisJc2VjdG9yX2RpdihjeWxpbmRlcnMsICgxMjggKiAzMikpOworCisJLyogcmV0dXJuIHJlc3VsdCAqLworCXBhcm1bMF0gPSBoZWFkczsKKwlwYXJtWzFdID0gc2VjdG9yczsKKwlwYXJtWzJdID0gY3lsaW5kZXJzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX3NsYXZlX2Rlc3Ryb3kgLSBVbmNvbmZpZ3VyZSBhIFNDU0kgZGV2aWNlCisgKiBAc2RldjoJc2NzaSBkZXZpY2Ugc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlpb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKSBzZGV2LT5ob3N0LT5ob3N0ZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJcmVzID0gKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKikgc2Rldi0+aG9zdGRhdGE7CisJaWYgKHJlcykgeworCQlzZGV2LT5ob3N0ZGF0YSA9IE5VTEw7CisJCXJlcy0+c2RldiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyoqCisgKiBpcHJfc2xhdmVfY29uZmlndXJlIC0gQ29uZmlndXJlIGEgU0NTSSBkZXZpY2UKKyAqIEBzZGV2OglzY3NpIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHNwZWNpZmllZCBzY3NpIGRldmljZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50IGlwcl9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXJlcyA9IHNkZXYtPmhvc3RkYXRhOworCWlmIChyZXMpIHsKKwkJaWYgKGlwcl9pc19hZl9kYXNkX2RldmljZShyZXMpKQorCQkJc2Rldi0+dHlwZSA9IFRZUEVfUkFJRDsKKwkJaWYgKGlwcl9pc19hZl9kYXNkX2RldmljZShyZXMpIHx8IGlwcl9pc19pb2FfcmVzb3VyY2UocmVzKSkKKwkJCXNkZXYtPnNjc2lfbGV2ZWwgPSA0OworCQlpZiAoaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykpIHsKKwkJCXNkZXYtPnRpbWVvdXQgPSBJUFJfVlNFVF9SV19USU1FT1VUOworCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHNkZXYtPnJlcXVlc3RfcXVldWUsIElQUl9WU0VUX01BWF9TRUNUT1JTKTsKKwkJfQorCQlpZiAoSVBSX0lTX0RBU0RfREVWSUNFKHJlcy0+Y2ZndGUuc3RkX2lucV9kYXRhKSkKKwkJCXNkZXYtPmFsbG93X3Jlc3RhcnQgPSAxOworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwLCBzZGV2LT5ob3N0LT5jbWRfcGVyX2x1bik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfc2xhdmVfYWxsb2MgLSBQcmVwYXJlIGZvciBjb21tYW5kcyB0byBhIGRldmljZS4KKyAqIEBzZGV2OglzY3NpIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNhdmVzIGEgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UgZW50cnkKKyAqIGluIHRoZSBzY3NpIGRldmljZSBzdHJ1Y3QgaWYgdGhlIGRldmljZSBleGlzdHMuIFdlCisgKiBjYW4gdGhlbiB1c2UgdGhpcyBwb2ludGVyIGluIGlwcl9xdWV1ZWNvbW1hbmQgd2hlbgorICogaGFuZGxpbmcgbmV3IGNvbW1hbmRzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MKKyAqKi8KK3N0YXRpYyBpbnQgaXByX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisKKwlzZGV2LT5ob3N0ZGF0YSA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZpb2FfY2ZnLT51c2VkX3Jlc19xLCBxdWV1ZSkgeworCQlpZiAoKHJlcy0+Y2ZndGUucmVzX2FkZHIuYnVzID09IHNkZXYtPmNoYW5uZWwpICYmCisJCSAgICAocmVzLT5jZmd0ZS5yZXNfYWRkci50YXJnZXQgPT0gc2Rldi0+aWQpICYmCisJCSAgICAocmVzLT5jZmd0ZS5yZXNfYWRkci5sdW4gPT0gc2Rldi0+bHVuKSkgeworCQkJcmVzLT5zZGV2ID0gc2RldjsKKwkJCXJlcy0+YWRkX3RvX21sID0gMDsKKwkJCXJlcy0+aW5fZXJwID0gMDsKKwkJCXNkZXYtPmhvc3RkYXRhID0gcmVzOworCQkJcmVzLT5uZWVkc19zeW5jX2NvbXBsZXRlID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX2VoX2hvc3RfcmVzZXQgLSBSZXNldCB0aGUgaG9zdCBhZGFwdGVyCisgKiBAc2NzaV9jbWQ6CXNjc2kgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJU1VDQ0VTUyAvIEZBSUxFRAorICoqLworc3RhdGljIGludCBpcHJfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaV9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCWludCByYzsKKworCUVOVEVSOworCWlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopIHNjc2lfY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkiQWRhcHRlciBiZWluZyByZXNldCBhcyBhIHJlc3VsdCBvZiBlcnJvciByZWNvdmVyeS5cbiIpOworCisJaWYgKFdBSVRfRk9SX0RVTVAgPT0gaW9hX2NmZy0+c2R0X3N0YXRlKQorCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBHRVRfRFVNUDsKKworCXJjID0gaXByX3Jlc2V0X3JlbG9hZChpb2FfY2ZnLCBJUFJfU0hVVERPV05fQUJCUkVWKTsKKworCUxFQVZFOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfZWhfZGV2X3Jlc2V0IC0gUmVzZXQgdGhlIGRldmljZQorICogQHNjc2lfY21kOglzY3NpIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpc3N1ZXMgYSBkZXZpY2UgcmVzZXQgdG8gdGhlIGFmZmVjdGVkIGRldmljZS4KKyAqIEEgTFVOIHJlc2V0IHdpbGwgYmUgc2VudCB0byB0aGUgZGV2aWNlIGZpcnN0LiBJZiB0aGF0IGRvZXMKKyAqIG5vdCB3b3JrLCBhIHRhcmdldCByZXNldCB3aWxsIGJlIHNlbnQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJU1VDQ0VTUyAvIEZBSUxFRAorICoqLworc3RhdGljIGludCBpcHJfZWhfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwlzdHJ1Y3QgaXByX2NtZF9wa3QgKmNtZF9wa3Q7CisJdTMyIGlvYXNjOworCisJRU5URVI7CisJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKikgc2NzaV9jbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CisKKwlpZiAoIXJlcyB8fCAoIWlwcl9pc19nc2NzaShyZXMpICYmICFpcHJfaXNfdnNldF9kZXZpY2UocmVzKSkpCisJCXJldHVybiBGQUlMRUQ7CisKKwkvKgorCSAqIElmIHdlIGFyZSBjdXJyZW50bHkgZ29pbmcgdGhyb3VnaCByZXNldC9yZWxvYWQsIHJldHVybiBmYWlsZWQuIFRoaXMgd2lsbCBmb3JjZSB0aGUKKwkgKiBtaWQtbGF5ZXIgdG8gY2FsbCBpcHJfZWhfaG9zdF9yZXNldCwgd2hpY2ggd2lsbCB0aGVuIGdvIHRvIHNsZWVwIGFuZCB3YWl0IGZvciB0aGUKKwkgKiByZXNldCB0byBjb21wbGV0ZQorCSAqLworCWlmIChpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpCisJCXJldHVybiBGQUlMRUQ7CisJaWYgKGlvYV9jZmctPmlvYV9pc19kZWFkKQorCQlyZXR1cm4gRkFJTEVEOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpcHJfY21kLCAmaW9hX2NmZy0+cGVuZGluZ19xLCBxdWV1ZSkgeworCQlpZiAoaXByX2NtZC0+aW9hcmNiLnJlc19oYW5kbGUgPT0gcmVzLT5jZmd0ZS5yZXNfaGFuZGxlKSB7CisJCQlpZiAoaXByX2NtZC0+c2NzaV9jbWQpCisJCQkJaXByX2NtZC0+ZG9uZSA9IGlwcl9zY3NpX2VoX2RvbmU7CisJCX0KKwl9CisKKwlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAxOworCisJaXByX2NtZCA9IGlwcl9nZXRfZnJlZV9pcHJfY21uZChpb2FfY2ZnKTsKKworCWlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlID0gcmVzLT5jZmd0ZS5yZXNfaGFuZGxlOworCWNtZF9wa3QgPSAmaXByX2NtZC0+aW9hcmNiLmNtZF9wa3Q7CisJY21kX3BrdC0+cmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisJY21kX3BrdC0+Y2RiWzBdID0gSVBSX1JFU0VUX0RFVklDRTsKKworCWlwcl9zZGV2X2VycihzY3NpX2NtZC0+ZGV2aWNlLCAiUmVzZXR0aW5nIGRldmljZVxuIik7CisJaXByX3NlbmRfYmxvY2tpbmdfY21kKGlwcl9jbWQsIGlwcl90aW1lb3V0LCBJUFJfREVWSUNFX1JFU0VUX1RJTUVPVVQpOworCisJaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwlyZXMtPnJlc2V0dGluZ19kZXZpY2UgPSAwOworCisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCisJTEVBVkU7CisJcmV0dXJuIChJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA/IEZBSUxFRCA6IFNVQ0NFU1MpOworfQorCisvKioKKyAqIGlwcl9idXNfcmVzZXRfZG9uZSAtIE9wIGRvbmUgZnVuY3Rpb24gZm9yIGJ1cyByZXNldC4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvcCBkb25lIGZ1bmN0aW9uIGZvciBhIGJ1cyByZXNldAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfYnVzX3Jlc2V0X2RvbmUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOworCisJRU5URVI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZpb2FfY2ZnLT51c2VkX3Jlc19xLCBxdWV1ZSkgeworCQlpZiAoIW1lbWNtcCgmcmVzLT5jZmd0ZS5yZXNfaGFuZGxlLCAmaXByX2NtZC0+aW9hcmNiLnJlc19oYW5kbGUsCisJCQkgICAgc2l6ZW9mKHJlcy0+Y2ZndGUucmVzX2hhbmRsZSkpKSB7CisJCQlzY3NpX3JlcG9ydF9idXNfcmVzZXQoaW9hX2NmZy0+aG9zdCwgcmVzLT5jZmd0ZS5yZXNfYWRkci5idXMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIGFib3J0IGhhcyBub3QgY29tcGxldGVkLCBpbmRpY2F0ZSB0aGUgcmVzZXQgaGFzLCBlbHNlIGNhbGwgdGhlCisJICogYWJvcnQncyBkb25lIGZ1bmN0aW9uIHRvIHdha2UgdGhlIHNsZWVwaW5nIGVoIHRocmVhZAorCSAqLworCWlmIChpcHJfY21kLT5zaWJsaW5nLT5zaWJsaW5nKQorCQlpcHJfY21kLT5zaWJsaW5nLT5zaWJsaW5nID0gTlVMTDsKKwllbHNlCisJCWlwcl9jbWQtPnNpYmxpbmctPmRvbmUoaXByX2NtZC0+c2libGluZyk7CisKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX2Fib3J0X3RpbWVvdXQgLSBBbiBhYm9ydCB0YXNrIGhhcyB0aW1lZCBvdXQKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgd2hlbiBhbiBhYm9ydCB0YXNrIHRpbWVzIG91dC4gSWYgdGhpcworICogaGFwcGVucyB3ZSBpc3N1ZSBhIGJ1cyByZXNldCBzaW5jZSB3ZSBoYXZlIHJlc291cmNlcyB0aWVkCisgKiB1cCB0aGF0IG11c3QgYmUgZnJlZWQgYmVmb3JlIHJldHVybmluZyB0byB0aGUgbWlkbGF5ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2Fib3J0X3RpbWVvdXQoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfY21uZCAqcmVzZXRfY21kOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9jbWRfcGt0ICpjbWRfcGt0OworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlFTlRFUjsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWlmIChpcHJfY21kLT5jb21wbGV0aW9uLmRvbmUgfHwgaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlwcl9zZGV2X2VycihpcHJfY21kLT51LnNkZXYsICJBYm9ydCB0aW1lZCBvdXQuIFJlc2V0dGluZyBidXNcbiIpOworCXJlc2V0X2NtZCA9IGlwcl9nZXRfZnJlZV9pcHJfY21uZChpb2FfY2ZnKTsKKwlpcHJfY21kLT5zaWJsaW5nID0gcmVzZXRfY21kOworCXJlc2V0X2NtZC0+c2libGluZyA9IGlwcl9jbWQ7CisJcmVzZXRfY21kLT5pb2FyY2IucmVzX2hhbmRsZSA9IGlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlOworCWNtZF9wa3QgPSAmcmVzZXRfY21kLT5pb2FyY2IuY21kX3BrdDsKKwljbWRfcGt0LT5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX0lPQUNNRDsKKwljbWRfcGt0LT5jZGJbMF0gPSBJUFJfUkVTRVRfREVWSUNFOworCWNtZF9wa3QtPmNkYlsyXSA9IElQUl9SRVNFVF9UWVBFX1NFTEVDVCB8IElQUl9CVVNfUkVTRVQ7CisKKwlpcHJfZG9fcmVxKHJlc2V0X2NtZCwgaXByX2J1c19yZXNldF9kb25lLCBpcHJfdGltZW91dCwgSVBSX0RFVklDRV9SRVNFVF9USU1FT1VUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX2NhbmNlbF9vcCAtIENhbmNlbCBzcGVjaWZpZWQgb3AKKyAqIEBzY3NpX2NtZDoJc2NzaSBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuY2VscyBzcGVjaWZpZWQgb3AuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJU1VDQ0VTUyAvIEZBSUxFRAorICoqLworc3RhdGljIGludCBpcHJfY2FuY2VsX29wKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3NpX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwlzdHJ1Y3QgaXByX2NtZF9wa3QgKmNtZF9wa3Q7CisJdTMyIGlvYXNjOworCWludCBvcF9mb3VuZCA9IDA7CisKKwlFTlRFUjsKKwlpb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKXNjc2lfY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXJlcyA9IHNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJaWYgKCFyZXMgfHwgKCFpcHJfaXNfZ3Njc2kocmVzKSAmJiAhaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykpKQorCQlyZXR1cm4gRkFJTEVEOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpcHJfY21kLCAmaW9hX2NmZy0+cGVuZGluZ19xLCBxdWV1ZSkgeworCQlpZiAoaXByX2NtZC0+c2NzaV9jbWQgPT0gc2NzaV9jbWQpIHsKKwkJCWlwcl9jbWQtPmRvbmUgPSBpcHJfc2NzaV9laF9kb25lOworCQkJb3BfZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIW9wX2ZvdW5kKQorCQlyZXR1cm4gU1VDQ0VTUzsKKworCWlwcl9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CisJaXByX2NtZC0+aW9hcmNiLnJlc19oYW5kbGUgPSByZXMtPmNmZ3RlLnJlc19oYW5kbGU7CisJY21kX3BrdCA9ICZpcHJfY21kLT5pb2FyY2IuY21kX3BrdDsKKwljbWRfcGt0LT5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX0lPQUNNRDsKKwljbWRfcGt0LT5jZGJbMF0gPSBJUFJfQ0FOQ0VMX0FMTF9SRVFVRVNUUzsKKwlpcHJfY21kLT51LnNkZXYgPSBzY3NpX2NtZC0+ZGV2aWNlOworCisJaXByX3NkZXZfZXJyKHNjc2lfY21kLT5kZXZpY2UsICJBYm9ydGluZyBjb21tYW5kOiAlMDJYXG4iLCBzY3NpX2NtZC0+Y21uZFswXSk7CisJaXByX3NlbmRfYmxvY2tpbmdfY21kKGlwcl9jbWQsIGlwcl9hYm9ydF90aW1lb3V0LCBJUFJfQ0FOQ0VMX0FMTF9USU1FT1VUKTsKKwlpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCS8qCisJICogSWYgdGhlIGFib3J0IHRhc2sgdGltZWQgb3V0IGFuZCB3ZSBzZW50IGEgYnVzIHJlc2V0LCB3ZSB3aWxsIGdldAorCSAqIG9uZSB0aGUgZm9sbG93aW5nIHJlc3BvbnNlcyB0byB0aGUgYWJvcnQKKwkgKi8KKwlpZiAoaW9hc2MgPT0gSVBSX0lPQVNDX0JVU19XQVNfUkVTRVQgfHwgaW9hc2MgPT0gSVBSX0lPQVNDX1NZTkNfUkVRVUlSRUQpIHsKKwkJaW9hc2MgPSAwOworCQlpcHJfdHJhY2U7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisKKwlMRUFWRTsKKwlyZXR1cm4gKElQUl9JT0FTQ19TRU5TRV9LRVkoaW9hc2MpID8gRkFJTEVEIDogU1VDQ0VTUyk7Cit9CisKKy8qKgorICogaXByX2VoX2Fib3J0IC0gQWJvcnQgYSBzaW5nbGUgb3AKKyAqIEBzY3NpX2NtZDoJc2NzaSBjb21tYW5kIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlTVUNDRVNTIC8gRkFJTEVECisgKiovCitzdGF0aWMgaW50IGlwcl9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogc2NzaV9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOworCisJRU5URVI7CisJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKikgc2NzaV9jbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGdvaW5nIHRocm91Z2ggcmVzZXQvcmVsb2FkLCByZXR1cm4gZmFpbGVkLiBUaGlzIHdpbGwgZm9yY2UgdGhlCisJICAgbWlkLWxheWVyIHRvIGNhbGwgaXByX2VoX2hvc3RfcmVzZXQsIHdoaWNoIHdpbGwgdGhlbiBnbyB0byBzbGVlcCBhbmQgd2FpdCBmb3IgdGhlCisJICAgcmVzZXQgdG8gY29tcGxldGUgKi8KKwlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKQorCQlyZXR1cm4gRkFJTEVEOworCWlmIChpb2FfY2ZnLT5pb2FfaXNfZGVhZCkKKwkJcmV0dXJuIEZBSUxFRDsKKwlpZiAoIXNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhKQorCQlyZXR1cm4gRkFJTEVEOworCisJTEVBVkU7CisJcmV0dXJuIGlwcl9jYW5jZWxfb3Aoc2NzaV9jbWQpOworfQorCisvKioKKyAqIGlwcl9oYW5kbGVfb3RoZXJfaW50ZXJydXB0IC0gSGFuZGxlICJvdGhlciIgaW50ZXJydXB0cworICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaW50X3JlZzoJaW50ZXJydXB0IHJlZ2lzdGVyCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlSUV9OT05FIC8gSVJRX0hBTkRMRUQKKyAqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpcHJfaGFuZGxlX290aGVyX2ludGVycnVwdChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJCSAgICAgIHZvbGF0aWxlIHUzMiBpbnRfcmVnKQoreworCWlycXJldHVybl90IHJjID0gSVJRX0hBTkRMRUQ7CisKKwlpZiAoaW50X3JlZyAmIElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSKSB7CisJCS8qIE1hc2sgdGhlIGludGVycnVwdCAqLworCQl3cml0ZWwoSVBSX1BDSUlfSU9BX1RSQU5TX1RPX09QRVIsIGlvYV9jZmctPnJlZ3Muc2V0X2ludGVycnVwdF9tYXNrX3JlZyk7CisKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCQl3cml0ZWwoSVBSX1BDSUlfSU9BX1RSQU5TX1RPX09QRVIsIGlvYV9jZmctPnJlZ3MuY2xyX2ludGVycnVwdF9yZWcpOworCQlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKTsKKworCQlsaXN0X2RlbCgmaW9hX2NmZy0+cmVzZXRfY21kLT5xdWV1ZSk7CisJCWRlbF90aW1lcigmaW9hX2NmZy0+cmVzZXRfY21kLT50aW1lcik7CisJCWlwcl9yZXNldF9pb2Ffam9iKGlvYV9jZmctPnJlc2V0X2NtZCk7CisJfSBlbHNlIHsKKwkJaWYgKGludF9yZWcgJiBJUFJfUENJSV9JT0FfVU5JVF9DSEVDS0VEKQorCQkJaW9hX2NmZy0+aW9hX3VuaXRfY2hlY2tlZCA9IDE7CisJCWVsc2UKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCQkiUGVybWFuZW50IElPQSBmYWlsdXJlLiAweCUwOFhcbiIsIGludF9yZWcpOworCisJCWlmIChXQUlUX0ZPUl9EVU1QID09IGlvYV9jZmctPnNkdF9zdGF0ZSkKKwkJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEdFVF9EVU1QOworCisJCWlwcl9tYXNrX2FuZF9jbGVhcl9pbnRlcnJ1cHRzKGlvYV9jZmcsIH4wKTsKKwkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlwcl9pc3IgLSBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgKiBAaXJxOglpcnEgbnVtYmVyCisgKiBAZGV2cDoJcG9pbnRlciB0byBpb2EgY29uZmlnIHN0cnVjdAorICogQHJlZ3M6CXB0X3JlZ3Mgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlSUV9OT05FIC8gSVJRX0hBTkRMRUQKKyAqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpcHJfaXNyKGludCBpcnEsIHZvaWQgKmRldnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilkZXZwOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisJdm9sYXRpbGUgdTMyIGludF9yZWcsIGludF9tYXNrX3JlZzsKKwl1MzIgaW9hc2M7CisJdTE2IGNtZF9pbmRleDsKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisJaXJxcmV0dXJuX3QgcmMgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisKKwkvKiBJZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgaWdub3JlIHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAoIWlvYV9jZmctPmFsbG93X2ludGVycnVwdHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW50X21hc2tfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfbWFza19yZWcpOworCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9yZWcpICYgfmludF9tYXNrX3JlZzsKKworCS8qIElmIGFuIGludGVycnVwdCBvbiB0aGUgYWRhcHRlciBkaWQgbm90IG9jY3VyLCBpZ25vcmUgaXQgKi8KKwlpZiAodW5saWtlbHkoKGludF9yZWcgJiBJUFJfUENJSV9PUEVSX0lOVEVSUlVQVFMpID09IDApKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXdoaWxlICgxKSB7CisJCWlwcl9jbWQgPSBOVUxMOworCisJCXdoaWxlICgoYmUzMl90b19jcHUoKmlvYV9jZmctPmhycnFfY3VycikgJiBJUFJfSFJSUV9UT0dHTEVfQklUKSA9PQorCQkgICAgICAgaW9hX2NmZy0+dG9nZ2xlX2JpdCkgeworCisJCQljbWRfaW5kZXggPSAoYmUzMl90b19jcHUoKmlvYV9jZmctPmhycnFfY3VycikgJgorCQkJCSAgICAgSVBSX0hSUlFfUkVRX1JFU1BfSEFORExFX01BU0spID4+IElQUl9IUlJRX1JFUV9SRVNQX0hBTkRMRV9TSElGVDsKKworCQkJaWYgKHVubGlrZWx5KGNtZF9pbmRleCA+PSBJUFJfTlVNX0NNRF9CTEtTKSkgeworCQkJCWlvYV9jZmctPmVycm9yc19sb2dnZWQrKzsKKwkJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJJbnZhbGlkIHJlc3BvbnNlIGhhbmRsZSBmcm9tIElPQVxuIik7CisKKwkJCQlpZiAoV0FJVF9GT1JfRFVNUCA9PSBpb2FfY2ZnLT5zZHRfc3RhdGUpCisJCQkJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEdFVF9EVU1QOworCisJCQkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKworCQkJaXByX2NtZCA9IGlvYV9jZmctPmlwcl9jbW5kX2xpc3RbY21kX2luZGV4XTsKKworCQkJaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwkJCWlwcl90cmNfaG9vayhpcHJfY21kLCBJUFJfVFJBQ0VfRklOSVNILCBpb2FzYyk7CisKKwkJCWxpc3RfZGVsKCZpcHJfY21kLT5xdWV1ZSk7CisJCQlkZWxfdGltZXIoJmlwcl9jbWQtPnRpbWVyKTsKKwkJCWlwcl9jbWQtPmRvbmUoaXByX2NtZCk7CisKKwkJCXJjID0gSVJRX0hBTkRMRUQ7CisKKwkJCWlmIChpb2FfY2ZnLT5ocnJxX2N1cnIgPCBpb2FfY2ZnLT5ocnJxX2VuZCkgeworCQkJCWlvYV9jZmctPmhycnFfY3VycisrOworCQkJfSBlbHNlIHsKKwkJCQlpb2FfY2ZnLT5ocnJxX2N1cnIgPSBpb2FfY2ZnLT5ocnJxX3N0YXJ0OworCQkJCWlvYV9jZmctPnRvZ2dsZV9iaXQgXj0gMXU7CisJCQl9CisJCX0KKworCQlpZiAoaXByX2NtZCAhPSBOVUxMKSB7CisJCQkvKiBDbGVhciB0aGUgUENJIGludGVycnVwdCAqLworCQkJd3JpdGVsKElQUl9QQ0lJX0hSUlFfVVBEQVRFRCwgaW9hX2NmZy0+cmVncy5jbHJfaW50ZXJydXB0X3JlZyk7CisJCQlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfcmVnKSAmIH5pbnRfbWFza19yZWc7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKHVubGlrZWx5KHJjID09IElSUV9OT05FKSkKKwkJcmMgPSBpcHJfaGFuZGxlX290aGVyX2ludGVycnVwdChpb2FfY2ZnLCBpbnRfcmVnKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXByX2J1aWxkX2lvYWRsIC0gQnVpbGQgYSBzY2F0dGVyL2dhdGhlciBsaXN0IGFuZCBtYXAgdGhlIGJ1ZmZlcgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIC0xIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX2J1aWxkX2lvYWRsKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCSAgIHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdDsKKwl1MzIgbGVuZ3RoOworCXUzMiBpb2FkbF9mbGFncyA9IDA7CisJc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQgPSBpcHJfY21kLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKwlzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgKmlvYWRsID0gaXByX2NtZC0+aW9hZGw7CisKKwlsZW5ndGggPSBzY3NpX2NtZC0+cmVxdWVzdF9idWZmbGVuOworCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChzY3NpX2NtZC0+dXNlX3NnKSB7CisJCWlwcl9jbWQtPmRtYV91c2Vfc2cgPSBwY2lfbWFwX3NnKGlvYV9jZmctPnBkZXYsCisJCQkJCQkgc2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkJIHNjc2lfY21kLT51c2Vfc2csCisJCQkJCQkgc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlpZiAoc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCWlvYWRsX2ZsYWdzID0gSVBSX0lPQURMX0ZMQUdTX1dSSVRFOworCQkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9XUklURV9OT1RfUkVBRDsKKwkJCWlvYXJjYi0+d3JpdGVfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMihsZW5ndGgpOworCQkJaW9hcmNiLT53cml0ZV9pb2FkbF9sZW4gPQorCQkJCWNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpICogaXByX2NtZC0+ZG1hX3VzZV9zZyk7CisJCX0gZWxzZSBpZiAoc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJaW9hZGxfZmxhZ3MgPSBJUFJfSU9BRExfRkxBR1NfUkVBRDsKKwkJCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IGNwdV90b19iZTMyKGxlbmd0aCk7CisJCQlpb2FyY2ItPnJlYWRfaW9hZGxfbGVuID0KKwkJCQljcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSAqIGlwcl9jbWQtPmRtYV91c2Vfc2cpOworCQl9CisKKwkJc2dsaXN0ID0gc2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyOworCisJCWZvciAoaSA9IDA7IGkgPCBpcHJfY21kLT5kbWFfdXNlX3NnOyBpKyspIHsKKwkJCWlvYWRsW2ldLmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCQkJY3B1X3RvX2JlMzIoaW9hZGxfZmxhZ3MgfCBzZ19kbWFfbGVuKCZzZ2xpc3RbaV0pKTsKKwkJCWlvYWRsW2ldLmFkZHJlc3MgPQorCQkJCWNwdV90b19iZTMyKHNnX2RtYV9hZGRyZXNzKCZzZ2xpc3RbaV0pKTsKKwkJfQorCisJCWlmIChsaWtlbHkoaXByX2NtZC0+ZG1hX3VzZV9zZykpIHsKKwkJCWlvYWRsW2ktMV0uZmxhZ3NfYW5kX2RhdGFfbGVuIHw9CisJCQkJY3B1X3RvX2JlMzIoSVBSX0lPQURMX0ZMQUdTX0xBU1QpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAicGNpX21hcF9zZyBmYWlsZWQhXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCWlvYWRsX2ZsYWdzID0gSVBSX0lPQURMX0ZMQUdTX1dSSVRFOworCQkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9XUklURV9OT1RfUkVBRDsKKwkJCWlvYXJjYi0+d3JpdGVfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMihsZW5ndGgpOworCQkJaW9hcmNiLT53cml0ZV9pb2FkbF9sZW4gPSBjcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGlwcl9pb2FkbF9kZXNjKSk7CisJCX0gZWxzZSBpZiAoc2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJaW9hZGxfZmxhZ3MgPSBJUFJfSU9BRExfRkxBR1NfUkVBRDsKKwkJCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IGNwdV90b19iZTMyKGxlbmd0aCk7CisJCQlpb2FyY2ItPnJlYWRfaW9hZGxfbGVuID0gY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykpOworCQl9CisKKwkJaXByX2NtZC0+ZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKGlvYV9jZmctPnBkZXYsCisJCQkJCQkgICAgIHNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlciwgbGVuZ3RoLAorCQkJCQkJICAgICBzY3NpX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCWlmIChsaWtlbHkoIXBjaV9kbWFfbWFwcGluZ19lcnJvcihpcHJfY21kLT5kbWFfaGFuZGxlKSkpIHsKKwkJCWlwcl9jbWQtPmRtYV91c2Vfc2cgPSAxOworCQkJaW9hZGxbMF0uZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJCQljcHVfdG9fYmUzMihpb2FkbF9mbGFncyB8IGxlbmd0aCB8IElQUl9JT0FETF9GTEFHU19MQVNUKTsKKwkJCWlvYWRsWzBdLmFkZHJlc3MgPSBjcHVfdG9fYmUzMihpcHJfY21kLT5kbWFfaGFuZGxlKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwgInBjaV9tYXBfc2luZ2xlIGZhaWxlZCFcbiIpOworCX0KKworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBpcHJfZ2V0X3Rhc2tfYXR0cmlidXRlcyAtIFRyYW5zbGF0ZSBTUEkgUS1UYWcgdG8gdGFzayBhdHRyaWJ1dGVzCisgKiBAc2NzaV9jbWQ6CXNjc2kgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJdGFzayBhdHRyaWJ1dGVzCisgKiovCitzdGF0aWMgdTggaXByX2dldF90YXNrX2F0dHJpYnV0ZXMoc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQpCit7CisJdTggdGFnWzJdOworCXU4IHJjID0gSVBSX0ZMQUdTX0xPX1VOVEFHR0VEX1RBU0s7CisKKwlpZiAoc2NzaV9wb3B1bGF0ZV90YWdfbXNnKHNjc2lfY21kLCB0YWcpKSB7CisJCXN3aXRjaCAodGFnWzBdKSB7CisJCWNhc2UgTVNHX1NJTVBMRV9UQUc6CisJCQlyYyA9IElQUl9GTEFHU19MT19TSU1QTEVfVEFTSzsKKwkJCWJyZWFrOworCQljYXNlIE1TR19IRUFEX1RBRzoKKwkJCXJjID0gSVBSX0ZMQUdTX0xPX0hFQURfT0ZfUV9UQVNLOworCQkJYnJlYWs7CisJCWNhc2UgTVNHX09SREVSRURfVEFHOgorCQkJcmMgPSBJUFJfRkxBR1NfTE9fT1JERVJFRF9UQVNLOworCQkJYnJlYWs7CisJCX07CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlwcl9lcnBfZG9uZSAtIFByb2Nlc3MgY29tcGxldGlvbiBvZiBFUlAgZm9yIGEgZGV2aWNlCisgKiBAaXByX2NtZDoJCWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBzZW5zZSBidWZmZXIgaW50byB0aGUgc2NzaV9jbWQKKyAqIHN0cnVjdCBhbmQgcHVzaGVzIHRoZSBzY3NpX2RvbmUgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9lcnBfZG9uZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQgPSBpcHJfY21kLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMgPSBzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCWlmIChJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA+IDApIHsKKwkJc2NzaV9jbWQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJaXByX3NkZXZfZXJyKHNjc2lfY21kLT5kZXZpY2UsCisJCQkgICAgICJSZXF1ZXN0IFNlbnNlIGZhaWxlZCB3aXRoIElPQVNDOiAweCUwOFhcbiIsIGlvYXNjKTsKKwl9IGVsc2UgeworCQltZW1jcHkoc2NzaV9jbWQtPnNlbnNlX2J1ZmZlciwgaXByX2NtZC0+c2Vuc2VfYnVmZmVyLAorCQkgICAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwl9CisKKwlpZiAocmVzKSB7CisJCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJCXJlcy0+aW5fZXJwID0gMDsKKwl9CisJaXByX3VubWFwX3NnbGlzdChpb2FfY2ZnLCBpcHJfY21kKTsKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisJc2NzaV9jbWQtPnNjc2lfZG9uZShzY3NpX2NtZCk7Cit9CisKKy8qKgorICogaXByX3JlaW5pdF9pcHJfY21uZF9mb3JfZXJwIC0gUmUtaW5pdGlhbGl6ZSBhIGNtbmQgYmxvY2sgdG8gYmUgdXNlZCBmb3IgRVJQCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9yZWluaXRfaXByX2NtbmRfZm9yX2VycChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYjsKKwlzdHJ1Y3QgaXByX2lvYXNhICppb2FzYTsKKworCWlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJaW9hc2EgPSAmaXByX2NtZC0+aW9hc2E7CisKKwltZW1zZXQoJmlvYXJjYi0+Y21kX3BrdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfY21kX3BrdCkpOworCWlvYXJjYi0+d3JpdGVfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSAwOworCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IDA7CisJaW9hcmNiLT53cml0ZV9pb2FkbF9sZW4gPSAwOworCWlvYXJjYi0+cmVhZF9pb2FkbF9sZW4gPSAwOworCWlvYXNhLT5pb2FzYyA9IDA7CisJaW9hc2EtPnJlc2lkdWFsX2RhdGFfbGVuID0gMDsKK30KKworLyoqCisgKiBpcHJfZXJwX3JlcXVlc3Rfc2Vuc2UgLSBTZW5kIHJlcXVlc3Qgc2Vuc2UgdG8gYSBkZXZpY2UKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgcmVxdWVzdCBzZW5zZSB0byBhIGRldmljZSBhcyBhIHJlc3VsdAorICogb2YgYSBjaGVjayBjb25kaXRpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9lcnBfcmVxdWVzdF9zZW5zZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9jbWRfcGt0ICpjbWRfcGt0ID0gJmlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0OworCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPmlvYXNhLmlvYXNjKTsKKworCWlmIChJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA+IDApIHsKKwkJaXByX2VycF9kb25lKGlwcl9jbWQpOworCQlyZXR1cm47CisJfQorCisJaXByX3JlaW5pdF9pcHJfY21uZF9mb3JfZXJwKGlwcl9jbWQpOworCisJY21kX3BrdC0+cmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9TQ1NJQ0RCOworCWNtZF9wa3QtPmNkYlswXSA9IFJFUVVFU1RfU0VOU0U7CisJY21kX3BrdC0+Y2RiWzRdID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCWNtZF9wa3QtPmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9TWU5DX09WRVJSSURFOworCWNtZF9wa3QtPmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9OT19VTEVOX0NISzsKKwljbWRfcGt0LT50aW1lb3V0ID0gY3B1X3RvX2JlMTYoSVBSX1JFUVVFU1RfU0VOU0VfVElNRU9VVCAvIEhaKTsKKworCWlwcl9jbWQtPmlvYWRsWzBdLmZsYWdzX2FuZF9kYXRhX2xlbiA9CisJCWNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19SRUFEX0xBU1QgfCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCWlwcl9jbWQtPmlvYWRsWzBdLmFkZHJlc3MgPQorCQljcHVfdG9fYmUzMihpcHJfY21kLT5zZW5zZV9idWZmZXJfZG1hKTsKKworCWlwcl9jbWQtPmlvYXJjYi5yZWFkX2lvYWRsX2xlbiA9CisJCWNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwlpcHJfY21kLT5pb2FyY2IucmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9CisJCWNwdV90b19iZTMyKFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisKKwlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9lcnBfZG9uZSwgaXByX3RpbWVvdXQsCisJCSAgIElQUl9SRVFVRVNUX1NFTlNFX1RJTUVPVVQgKiAyKTsKK30KKworLyoqCisgKiBpcHJfZXJwX2NhbmNlbF9hbGwgLSBTZW5kIGNhbmNlbCBhbGwgdG8gYSBkZXZpY2UKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgY2FuY2VsIGFsbCB0byBhIGRldmljZSB0byBjbGVhciB0aGUKKyAqIHF1ZXVlLiBJZiB3ZSBhcmUgcnVubmluZyBUQ1Egb24gdGhlIGRldmljZSwgUUVSUiBpcyBzZXQgdG8gMSwKKyAqIHdoaWNoIG1lYW5zIGFsbCBvdXRzdGFuZGluZyBvcHMgaGF2ZSBiZWVuIGRyb3BwZWQgb24gdGhlIGZsb29yLgorICogQ2FuY2VsIGFsbCB3aWxsIHJldHVybiB0aGVtIHRvIHVzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZXJwX2NhbmNlbF9hbGwoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kID0gaXByX2NtZC0+c2NzaV9jbWQ7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGlwcl9jbWRfcGt0ICpjbWRfcGt0OworCisJcmVzLT5pbl9lcnAgPSAxOworCisJaXByX3JlaW5pdF9pcHJfY21uZF9mb3JfZXJwKGlwcl9jbWQpOworCisJaWYgKCFzY3NpX2dldF90YWdfdHlwZShzY3NpX2NtZC0+ZGV2aWNlKSkgeworCQlpcHJfZXJwX3JlcXVlc3Rfc2Vuc2UoaXByX2NtZCk7CisJCXJldHVybjsKKwl9CisKKwljbWRfcGt0ID0gJmlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0OworCWNtZF9wa3QtPnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfSU9BQ01EOworCWNtZF9wa3QtPmNkYlswXSA9IElQUl9DQU5DRUxfQUxMX1JFUVVFU1RTOworCisJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfZXJwX3JlcXVlc3Rfc2Vuc2UsIGlwcl90aW1lb3V0LAorCQkgICBJUFJfQ0FOQ0VMX0FMTF9USU1FT1VUKTsKK30KKworLyoqCisgKiBpcHJfZHVtcF9pb2FzYSAtIER1bXAgY29udGVudHMgb2YgSU9BU0EKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBvcHMKKyAqIGZhaWwuIEl0IHdpbGwgbG9nIHRoZSBJT0FTQSBpZiBhcHByb3ByaWF0ZS4gT25seSBjYWxsZWQKKyAqIGZvciBHUEREIG9wcy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2R1bXBfaW9hc2Eoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJICAgc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCWludCBpOworCXUxNiBkYXRhX2xlbjsKKwl1MzIgaW9hc2M7CisJc3RydWN0IGlwcl9pb2FzYSAqaW9hc2EgPSAmaXByX2NtZC0+aW9hc2E7CisJX19iZTMyICppb2FzYV9kYXRhID0gKF9fYmUzMiAqKWlvYXNhOworCWludCBlcnJvcl9pbmRleDsKKworCWlvYXNjID0gYmUzMl90b19jcHUoaW9hc2EtPmlvYXNjKSAmIElQUl9JT0FTQ19JT0FTQ19NQVNLOworCisJaWYgKDAgPT0gaW9hc2MpCisJCXJldHVybjsKKworCWlmIChpb2FfY2ZnLT5sb2dfbGV2ZWwgPCBJUFJfREVGQVVMVF9MT0dfTEVWRUwpCisJCXJldHVybjsKKworCWVycm9yX2luZGV4ID0gaXByX2dldF9lcnJvcihpb2FzYyk7CisKKwlpZiAoaW9hX2NmZy0+bG9nX2xldmVsIDwgSVBSX01BWF9MT0dfTEVWRUwpIHsKKwkJLyogRG9uJ3QgbG9nIGFuIGVycm9yIGlmIHRoZSBJT0EgYWxyZWFkeSBsb2dnZWQgb25lICovCisJCWlmIChpb2FzYS0+aWxpZCAhPSAwKQorCQkJcmV0dXJuOworCisJCWlmIChpcHJfZXJyb3JfdGFibGVbZXJyb3JfaW5kZXhdLmxvZ19pb2FzYSA9PSAwKQorCQkJcmV0dXJuOworCX0KKworCWlwcl9zZGV2X2VycihpcHJfY21kLT5zY3NpX2NtZC0+ZGV2aWNlLCAiJXNcbiIsCisJCSAgICAgaXByX2Vycm9yX3RhYmxlW2Vycm9yX2luZGV4XS5lcnJvcik7CisKKwlpZiAoKGlvYXNhLT51LmdwZGQuZW5kX3N0YXRlIDw9IEFSUkFZX1NJWkUoaXByX2dwZGRfZGV2X2VuZF9zdGF0ZXMpKSAmJgorCSAgICAoaW9hc2EtPnUuZ3BkZC5idXNfcGhhc2UgPD0gIEFSUkFZX1NJWkUoaXByX2dwZGRfZGV2X2J1c19waGFzZXMpKSkgeworCQlpcHJfc2Rldl9lcnIoaXByX2NtZC0+c2NzaV9jbWQtPmRldmljZSwKKwkJCSAgICAgIkRldmljZSBFbmQgc3RhdGU6ICVzIFBoYXNlOiAlc1xuIiwKKwkJCSAgICAgaXByX2dwZGRfZGV2X2VuZF9zdGF0ZXNbaW9hc2EtPnUuZ3BkZC5lbmRfc3RhdGVdLAorCQkJICAgICBpcHJfZ3BkZF9kZXZfYnVzX3BoYXNlc1tpb2FzYS0+dS5ncGRkLmJ1c19waGFzZV0pOworCX0KKworCWlmIChzaXplb2Yoc3RydWN0IGlwcl9pb2FzYSkgPCBiZTE2X3RvX2NwdShpb2FzYS0+cmV0X3N0YXRfbGVuKSkKKwkJZGF0YV9sZW4gPSBzaXplb2Yoc3RydWN0IGlwcl9pb2FzYSk7CisJZWxzZQorCQlkYXRhX2xlbiA9IGJlMTZfdG9fY3B1KGlvYXNhLT5yZXRfc3RhdF9sZW4pOworCisJaXByX2VycigiSU9BU0EgRHVtcDpcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGFfbGVuIC8gNDsgaSArPSA0KSB7CisJCWlwcl9lcnIoIiUwOFg6ICUwOFggJTA4WCAlMDhYICUwOFhcbiIsIGkqNCwKKwkJCWJlMzJfdG9fY3B1KGlvYXNhX2RhdGFbaV0pLAorCQkJYmUzMl90b19jcHUoaW9hc2FfZGF0YVtpKzFdKSwKKwkJCWJlMzJfdG9fY3B1KGlvYXNhX2RhdGFbaSsyXSksCisJCQliZTMyX3RvX2NwdShpb2FzYV9kYXRhW2krM10pKTsKKwl9Cit9CisKKy8qKgorICogaXByX2dlbl9zZW5zZSAtIEdlbmVyYXRlIFNDU0kgc2Vuc2UgZGF0YSBmcm9tIGFuIElPQVNBCisgKiBAaW9hc2E6CQlJT0FTQQorICogQHNlbnNlX2J1ZjoJc2Vuc2UgZGF0YSBidWZmZXIKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2dlbl9zZW5zZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJdTMyIGZhaWxpbmdfbGJhOworCXU4ICpzZW5zZV9idWYgPSBpcHJfY21kLT5zY3NpX2NtZC0+c2Vuc2VfYnVmZmVyOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlcyA9IGlwcl9jbWQtPnNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfaW9hc2EgKmlvYXNhID0gJmlwcl9jbWQtPmlvYXNhOworCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlvYXNhLT5pb2FzYyk7CisKKwltZW1zZXQoc2Vuc2VfYnVmLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCisJaWYgKGlvYXNjID49IElQUl9GSVJTVF9EUklWRVJfSU9BU0MpCisJCXJldHVybjsKKworCWlwcl9jbWQtPnNjc2lfY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisKKwlpZiAoaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykgJiYKKwkgICAgaW9hc2MgPT0gSVBSX0lPQVNDX01FRF9ET19OT1RfUkVBTExPQyAmJgorCSAgICBpb2FzYS0+dS52c2V0LmZhaWxpbmdfbGJhX2hpICE9IDApIHsKKwkJc2Vuc2VfYnVmWzBdID0gMHg3MjsKKwkJc2Vuc2VfYnVmWzFdID0gSVBSX0lPQVNDX1NFTlNFX0tFWShpb2FzYyk7CisJCXNlbnNlX2J1ZlsyXSA9IElQUl9JT0FTQ19TRU5TRV9DT0RFKGlvYXNjKTsKKwkJc2Vuc2VfYnVmWzNdID0gSVBSX0lPQVNDX1NFTlNFX1FVQUwoaW9hc2MpOworCisJCXNlbnNlX2J1Zls3XSA9IDEyOworCQlzZW5zZV9idWZbOF0gPSAwOworCQlzZW5zZV9idWZbOV0gPSAweDBBOworCQlzZW5zZV9idWZbMTBdID0gMHg4MDsKKworCQlmYWlsaW5nX2xiYSA9IGJlMzJfdG9fY3B1KGlvYXNhLT51LnZzZXQuZmFpbGluZ19sYmFfaGkpOworCisJCXNlbnNlX2J1ZlsxMl0gPSAoZmFpbGluZ19sYmEgJiAweGZmMDAwMDAwKSA+PiAyNDsKKwkJc2Vuc2VfYnVmWzEzXSA9IChmYWlsaW5nX2xiYSAmIDB4MDBmZjAwMDApID4+IDE2OworCQlzZW5zZV9idWZbMTRdID0gKGZhaWxpbmdfbGJhICYgMHgwMDAwZmYwMCkgPj4gODsKKwkJc2Vuc2VfYnVmWzE1XSA9IGZhaWxpbmdfbGJhICYgMHgwMDAwMDBmZjsKKworCQlmYWlsaW5nX2xiYSA9IGJlMzJfdG9fY3B1KGlvYXNhLT51LnZzZXQuZmFpbGluZ19sYmFfbG8pOworCisJCXNlbnNlX2J1ZlsxNl0gPSAoZmFpbGluZ19sYmEgJiAweGZmMDAwMDAwKSA+PiAyNDsKKwkJc2Vuc2VfYnVmWzE3XSA9IChmYWlsaW5nX2xiYSAmIDB4MDBmZjAwMDApID4+IDE2OworCQlzZW5zZV9idWZbMThdID0gKGZhaWxpbmdfbGJhICYgMHgwMDAwZmYwMCkgPj4gODsKKwkJc2Vuc2VfYnVmWzE5XSA9IGZhaWxpbmdfbGJhICYgMHgwMDAwMDBmZjsKKwl9IGVsc2UgeworCQlzZW5zZV9idWZbMF0gPSAweDcwOworCQlzZW5zZV9idWZbMl0gPSBJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKTsKKwkJc2Vuc2VfYnVmWzEyXSA9IElQUl9JT0FTQ19TRU5TRV9DT0RFKGlvYXNjKTsKKwkJc2Vuc2VfYnVmWzEzXSA9IElQUl9JT0FTQ19TRU5TRV9RVUFMKGlvYXNjKTsKKworCQkvKiBJbGxlZ2FsIHJlcXVlc3QgKi8KKwkJaWYgKChJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA9PSAweDA1KSAmJgorCQkgICAgKGJlMzJfdG9fY3B1KGlvYXNhLT5pb2FzY19zcGVjaWZpYykgJiBJUFJfRklFTERfUE9JTlRFUl9WQUxJRCkpIHsKKwkJCXNlbnNlX2J1Zls3XSA9IDEwOwkvKiBhZGRpdGlvbmFsIGxlbmd0aCAqLworCisJCQkvKiBJT0FSQ0Igd2FzIGluIGVycm9yICovCisJCQlpZiAoSVBSX0lPQVNDX1NFTlNFX0NPREUoaW9hc2MpID09IDB4MjQpCisJCQkJc2Vuc2VfYnVmWzE1XSA9IDB4QzA7CisJCQllbHNlCS8qIFBhcmFtZXRlciBkYXRhIHdhcyBpbnZhbGlkICovCisJCQkJc2Vuc2VfYnVmWzE1XSA9IDB4ODA7CisKKwkJCXNlbnNlX2J1ZlsxNl0gPQorCQkJICAgICgoSVBSX0ZJRUxEX1BPSU5URVJfTUFTSyAmCisJCQkgICAgICBiZTMyX3RvX2NwdShpb2FzYS0+aW9hc2Nfc3BlY2lmaWMpKSA+PiA4KSAmIDB4ZmY7CisJCQlzZW5zZV9idWZbMTddID0KKwkJCSAgICAoSVBSX0ZJRUxEX1BPSU5URVJfTUFTSyAmCisJCQkgICAgIGJlMzJfdG9fY3B1KGlvYXNhLT5pb2FzY19zcGVjaWZpYykpICYgMHhmZjsKKwkJfSBlbHNlIHsKKwkJCWlmIChpb2FzYyA9PSBJUFJfSU9BU0NfTUVEX0RPX05PVF9SRUFMTE9DKSB7CisJCQkJaWYgKGlwcl9pc192c2V0X2RldmljZShyZXMpKQorCQkJCQlmYWlsaW5nX2xiYSA9IGJlMzJfdG9fY3B1KGlvYXNhLT51LnZzZXQuZmFpbGluZ19sYmFfbG8pOworCQkJCWVsc2UKKwkJCQkJZmFpbGluZ19sYmEgPSBiZTMyX3RvX2NwdShpb2FzYS0+dS5kYXNkLmZhaWxpbmdfbGJhKTsKKworCQkJCXNlbnNlX2J1ZlswXSB8PSAweDgwOwkvKiBPciBpbiB0aGUgVmFsaWQgYml0ICovCisJCQkJc2Vuc2VfYnVmWzNdID0gKGZhaWxpbmdfbGJhICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCQkJc2Vuc2VfYnVmWzRdID0gKGZhaWxpbmdfbGJhICYgMHgwMGZmMDAwMCkgPj4gMTY7CisJCQkJc2Vuc2VfYnVmWzVdID0gKGZhaWxpbmdfbGJhICYgMHgwMDAwZmYwMCkgPj4gODsKKwkJCQlzZW5zZV9idWZbNl0gPSBmYWlsaW5nX2xiYSAmIDB4MDAwMDAwZmY7CisJCQl9CisKKwkJCXNlbnNlX2J1Zls3XSA9IDY7CS8qIGFkZGl0aW9uYWwgbGVuZ3RoICovCisJCX0KKwl9Cit9CisKKy8qKgorICogaXByX2VycF9zdGFydCAtIFByb2Nlc3MgYW4gZXJyb3IgcmVzcG9uc2UgZm9yIGEgU0NTSSBvcAorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGluaXRpYXRlIEVSUAorICogb24gdGhlIGFmZmVjdGVkIGRldmljZS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm90aGluZworICoqLworc3RhdGljIHZvaWQgaXByX2VycF9zdGFydChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkgICAgICBzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQgPSBpcHJfY21kLT5zY3NpX2NtZDsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMgPSBzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwl1MzIgaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5pb2FzYS5pb2FzYyk7CisKKwlpZiAoIXJlcykgeworCQlpcHJfc2NzaV9laF9kb25lKGlwcl9jbWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlwcl9pc19nc2NzaShyZXMpKQorCQlpcHJfZHVtcF9pb2FzYShpb2FfY2ZnLCBpcHJfY21kKTsKKwllbHNlCisJCWlwcl9nZW5fc2Vuc2UoaXByX2NtZCk7CisKKwlzd2l0Y2ggKGlvYXNjICYgSVBSX0lPQVNDX0lPQVNDX01BU0spIHsKKwljYXNlIElQUl9JT0FTQ19BQk9SVEVEX0NNRF9URVJNX0JZX0hPU1Q6CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9JTU1fUkVUUlkgPDwgMTYpOworCQlicmVhazsKKwljYXNlIElQUl9JT0FTQ19JUl9SRVNPVVJDRV9IQU5ETEU6CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfSFdfU0VMX1RJTUVPVVQ6CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJcmVzLT5uZWVkc19zeW5jX2NvbXBsZXRlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfU1lOQ19SRVFVSVJFRDoKKwkJaWYgKCFyZXMtPmluX2VycCkKKwkJCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gKERJRF9JTU1fUkVUUlkgPDwgMTYpOworCQlicmVhazsKKwljYXNlIElQUl9JT0FTQ19NRURfRE9fTk9UX1JFQUxMT0M6IC8qIHByZXZlbnQgcmV0cmllcyAqLworCQlzY3NpX2NtZC0+cmVzdWx0IHw9IChESURfUEFTU1RIUk9VR0ggPDwgMTYpOworCQlicmVhazsKKwljYXNlIElQUl9JT0FTQ19CVVNfV0FTX1JFU0VUOgorCWNhc2UgSVBSX0lPQVNDX0JVU19XQVNfUkVTRVRfQllfT1RIRVI6CisJCS8qCisJCSAqIFJlcG9ydCB0aGUgYnVzIHJlc2V0IGFuZCBhc2sgZm9yIGEgcmV0cnkuIFRoZSBkZXZpY2UKKwkJICogd2lsbCBnaXZlIENDL1VBIHRoZSBuZXh0IGNvbW1hbmQuCisJCSAqLworCQlpZiAoIXJlcy0+cmVzZXR0aW5nX2RldmljZSkKKwkJCXNjc2lfcmVwb3J0X2J1c19yZXNldChpb2FfY2ZnLT5ob3N0LCBzY3NpX2NtZC0+ZGV2aWNlLT5jaGFubmVsKTsKKwkJc2NzaV9jbWQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJcmVzLT5uZWVkc19zeW5jX2NvbXBsZXRlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJUFJfSU9BU0NfSFdfREVWX0JVU19TVEFUVVM6CisJCXNjc2lfY21kLT5yZXN1bHQgfD0gSVBSX0lPQVNDX1NFTlNFX1NUQVRVUyhpb2FzYyk7CisJCWlmIChJUFJfSU9BU0NfU0VOU0VfU1RBVFVTKGlvYXNjKSA9PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pIHsKKwkJCWlwcl9lcnBfY2FuY2VsX2FsbChpcHJfY21kKTsKKwkJCXJldHVybjsKKwkJfQorCQlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAxOworCQlicmVhazsKKwljYXNlIElQUl9JT0FTQ19OUl9JTklUX0NNRF9SRVFVSVJFRDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2NzaV9jbWQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJaWYgKCFpcHJfaXNfdnNldF9kZXZpY2UocmVzKSkKKwkJCXJlcy0+bmVlZHNfc3luY19jb21wbGV0ZSA9IDE7CisJCWJyZWFrOworCX0KKworCWlwcl91bm1hcF9zZ2xpc3QoaW9hX2NmZywgaXByX2NtZCk7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworfQorCisvKioKKyAqIGlwcl9zY3NpX2RvbmUgLSBtaWQtbGF5ZXIgZG9uZSBmdW5jdGlvbgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yCisgKiBvcHMgZ2VuZXJhdGVkIGJ5IHRoZSBTQ1NJIG1pZC1sYXllcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2NzaV9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kID0gaXByX2NtZC0+c2NzaV9jbWQ7CisJdTMyIGlvYXNjID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EuaW9hc2MpOworCisJc2NzaV9jbWQtPnJlc2lkID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EucmVzaWR1YWxfZGF0YV9sZW4pOworCisJaWYgKGxpa2VseShJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSA9PSAwKSkgeworCQlpcHJfdW5tYXBfc2dsaXN0KGlvYV9jZmcsIGlwcl9jbWQpOworCQlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisJCXNjc2lfY21kLT5zY3NpX2RvbmUoc2NzaV9jbWQpOworCX0gZWxzZQorCQlpcHJfZXJwX3N0YXJ0KGlvYV9jZmcsIGlwcl9jbWQpOworfQorCisvKioKKyAqIGlwcl9zYXZlX2lvYWZwX21vZGVfc2VsZWN0IC0gU2F2ZSBhZGFwdGVycyBtb2RlIHNlbGVjdCBkYXRhCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEBzY3NpX2NtZDoJc2NzaSBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2F2ZXMgbW9kZSBzZWxlY3QgZGF0YSBmb3IgdGhlIGFkYXB0ZXIgdG8KKyAqIHVzZSBmb2xsb3dpbmcgYW4gYWRhcHRlciByZXNldC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKgkwIG9uIHN1Y2Nlc3MgLyBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX3NhdmVfaW9hZnBfbW9kZV9zZWxlY3Qoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZCkKK3sKKwlpZiAoIWlvYV9jZmctPnNhdmVkX21vZGVfcGFnZXMpIHsKKwkJaW9hX2NmZy0+c2F2ZWRfbW9kZV9wYWdlcyAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXByX21vZGVfcGFnZXMpLAorCQkJCQkJICAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKCFpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VzKSB7CisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkJIklPQSBtb2RlIHNlbGVjdCBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCX0KKwl9CisKKwltZW1jcHkoaW9hX2NmZy0+c2F2ZWRfbW9kZV9wYWdlcywgc2NzaV9jbWQtPmJ1ZmZlciwgc2NzaV9jbWQtPmNtbmRbNF0pOworCWlvYV9jZmctPnNhdmVkX21vZGVfcGFnZV9sZW4gPSBzY3NpX2NtZC0+Y21uZFs0XTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcHJfcXVldWVjb21tYW5kIC0gUXVldWUgYSBtaWQtbGF5ZXIgcmVxdWVzdAorICogQHNjc2lfY21kOglzY3NpIGNvbW1hbmQgc3RydWN0CisgKiBAZG9uZToJCWRvbmUgZnVuY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyBhIHJlcXVlc3QgZ2VuZXJhdGVkIGJ5IHRoZSBtaWQtbGF5ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMCBvbiBzdWNjZXNzCisgKglTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kgaWYgZGV2aWNlIGlzIGJ1c3kKKyAqCVNDU0lfTUxRVUVVRV9IT1NUX0JVU1kgaWYgaG9zdCBpcyBidXN5CisgKiovCitzdGF0aWMgaW50IGlwcl9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQsCisJCQkgICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYjsKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisJaW50IHJjID0gMDsKKworCXNjc2lfY21kLT5zY3NpX2RvbmUgPSBkb25lOworCWlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2NzaV9jbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJcmVzID0gc2NzaV9jbWQtPmRldmljZS0+aG9zdGRhdGE7CisJc2NzaV9jbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCisJLyoKKwkgKiBXZSBhcmUgY3VycmVudGx5IGJsb2NraW5nIGFsbCBkZXZpY2VzIGR1ZSB0byBhIGhvc3QgcmVzZXQKKwkgKiBXZSBoYXZlIHRvbGQgdGhlIGhvc3QgdG8gc3RvcCBnaXZpbmcgdXMgbmV3IHJlcXVlc3RzLCBidXQKKwkgKiBFUlAgb3BzIGRvbid0IGNvdW50LiBGSVhNRQorCSAqLworCWlmICh1bmxpa2VseSghaW9hX2NmZy0+YWxsb3dfY21kcyAmJiAhaW9hX2NmZy0+aW9hX2lzX2RlYWQpKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCS8qCisJICogRklYTUUgLSBDcmVhdGUgc2NzaV9zZXRfaG9zdF9vZmZsaW5lIGludGVyZmFjZQorCSAqICBhbmQgdGhlIGlvYV9pc19kZWFkIGNoZWNrIGNhbiBiZSByZW1vdmVkCisJICovCisJaWYgKHVubGlrZWx5KGlvYV9jZmctPmlvYV9pc19kZWFkIHx8ICFyZXMpKSB7CisJCW1lbXNldChzY3NpX2NtZC0+c2Vuc2VfYnVmZmVyLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCQlzY3NpX2NtZC0+cmVzdWx0ID0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJc2NzaV9jbWQtPnNjc2lfZG9uZShzY3NpX2NtZCk7CisJCXJldHVybiAwOworCX0KKworCWlwcl9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CisJaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKwlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPnBlbmRpbmdfcSk7CisKKwltZW1jcHkoaW9hcmNiLT5jbWRfcGt0LmNkYiwgc2NzaV9jbWQtPmNtbmQsIHNjc2lfY21kLT5jbWRfbGVuKTsKKwlpcHJfY21kLT5zY3NpX2NtZCA9IHNjc2lfY21kOworCWlvYXJjYi0+cmVzX2hhbmRsZSA9IHJlcy0+Y2ZndGUucmVzX2hhbmRsZTsKKwlpcHJfY21kLT5kb25lID0gaXByX3Njc2lfZG9uZTsKKwlpcHJfdHJjX2hvb2soaXByX2NtZCwgSVBSX1RSQUNFX1NUQVJULCBJUFJfR0VUX1BIWVNfTE9DKHJlcy0+Y2ZndGUucmVzX2FkZHIpKTsKKworCWlmIChpcHJfaXNfZ3Njc2kocmVzKSB8fCBpcHJfaXNfdnNldF9kZXZpY2UocmVzKSkgeworCQlpZiAoc2NzaV9jbWQtPnVuZGVyZmxvdyA9PSAwKQorCQkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9OT19VTEVOX0NISzsKKworCQlpZiAocmVzLT5uZWVkc19zeW5jX2NvbXBsZXRlKSB7CisJCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfaGkgfD0gSVBSX0ZMQUdTX0hJX1NZTkNfQ09NUExFVEU7CisJCQlyZXMtPm5lZWRzX3N5bmNfY29tcGxldGUgPSAwOworCQl9CisKKwkJaW9hcmNiLT5jbWRfcGt0LmZsYWdzX2hpIHw9IElQUl9GTEFHU19ISV9OT19MSU5LX0RFU0M7CisJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19sbyB8PSBJUFJfRkxBR1NfTE9fREVMQVlfQUZURVJfUlNUOworCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfbG8gfD0gSVBSX0ZMQUdTX0xPX0FMSUdORURfQkZSOworCQlpb2FyY2ItPmNtZF9wa3QuZmxhZ3NfbG8gfD0gaXByX2dldF90YXNrX2F0dHJpYnV0ZXMoc2NzaV9jbWQpOworCX0KKworCWlmIChzY3NpX2NtZC0+Y21uZFswXSA+PSAweEMwICYmCisJICAgICghaXByX2lzX2dzY3NpKHJlcykgfHwgc2NzaV9jbWQtPmNtbmRbMF0gPT0gSVBSX1FVRVJZX1JTUkNfU1RBVEUpKQorCQlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisKKwlpZiAoaXByX2lzX2lvYV9yZXNvdXJjZShyZXMpICYmIHNjc2lfY21kLT5jbW5kWzBdID09IE1PREVfU0VMRUNUKQorCQlyYyA9IGlwcl9zYXZlX2lvYWZwX21vZGVfc2VsZWN0KGlvYV9jZmcsIHNjc2lfY21kKTsKKworCWlmIChsaWtlbHkocmMgPT0gMCkpCisJCXJjID0gaXByX2J1aWxkX2lvYWRsKGlvYV9jZmcsIGlwcl9jbWQpOworCisJaWYgKGxpa2VseShyYyA9PSAwKSkgeworCQltYigpOworCQl3cml0ZWwoYmUzMl90b19jcHUoaXByX2NtZC0+aW9hcmNiLmlvYXJjYl9ob3N0X3BjaV9hZGRyKSwKKwkJICAgICAgIGlvYV9jZmctPnJlZ3MuaW9hcnJpbl9yZWcpOworCX0gZWxzZSB7CisJCSBsaXN0X21vdmVfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCQkgcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX2luZm8gLSBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmQvZHJpdmVyCisgKiBAc2NzaV9ob3N0OglzY3NpIGhvc3Qgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCXBvaW50ZXIgdG8gYnVmZmVyIHdpdGggZGVzY3JpcHRpb24gc3RyaW5nCisgKiovCitzdGF0aWMgY29uc3QgY2hhciAqIGlwcl9pb2FfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlcls1MTJdOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXNwcmludGYoYnVmZmVyLCAiSUJNICVYIFN0b3JhZ2UgQWRhcHRlciIsIGlvYV9jZmctPnR5cGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiSVBSIiwKKwkuaW5mbyA9IGlwcl9pb2FfaW5mbywKKwkucXVldWVjb21tYW5kID0gaXByX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IGlwcl9laF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBpcHJfZWhfZGV2X3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPSBpcHJfZWhfaG9zdF9yZXNldCwKKwkuc2xhdmVfYWxsb2MgPSBpcHJfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2NvbmZpZ3VyZSA9IGlwcl9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kgPSBpcHJfc2xhdmVfZGVzdHJveSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoID0gaXByX2NoYW5nZV9xdWV1ZV9kZXB0aCwKKwkuY2hhbmdlX3F1ZXVlX3R5cGUgPSBpcHJfY2hhbmdlX3F1ZXVlX3R5cGUsCisJLmJpb3NfcGFyYW0gPSBpcHJfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgPSBJUFJfTUFYX0NPTU1BTkRTLAorCS50aGlzX2lkID0gLTEsCisJLnNnX3RhYmxlc2l6ZSA9IElQUl9NQVhfU0dMSVNULAorCS5tYXhfc2VjdG9ycyA9IElQUl9JT0FfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuID0gSVBSX01BWF9DTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2hvc3RfYXR0cnMgPSBpcHJfaW9hX2F0dHJzLAorCS5zZGV2X2F0dHJzID0gaXByX2Rldl9hdHRycywKKwkucHJvY19uYW1lID0gSVBSX05BTUUKK307CisKKyNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKK3N0YXRpYyBjb25zdCB1MTYgaXByX2Jsb2NrZWRfcHJvY2Vzc29yc1tdID0geworCVBWX05PUlRIU1RBUiwKKwlQVl9QVUxTQVIsCisJUFZfUE9XRVI0LAorCVBWX0lDRVNUQVIsCisJUFZfU1NUQVIsCisJUFZfUE9XRVI0cCwKKwlQVl82MzAsCisJUFZfNjMwcAorfTsKKworLyoqCisgKiBpcHJfaW52YWxpZF9hZGFwdGVyIC0gRGV0ZXJtaW5lIGlmIHRoaXMgYWRhcHRlciBpcyBzdXBwb3J0ZWQgb24gdGhpcyBoYXJkd2FyZQorICogQGlvYV9jZmc6CWlvYSBjZmcgc3RydWN0CisgKgorICogQWRhcHRlcnMgdGhhdCB1c2UgR2Vtc3RvbmUgcmV2aXNpb24gPCAzLjEgZG8gbm90IHdvcmsgcmVsaWFibHkgb24KKyAqIGNlcnRhaW4gcFNlcmllcyBoYXJkd2FyZS4gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBnaXZlbgorICogYWRhcHRlciBpcyBpbiBvbmUgb2YgdGhlc2UgY29uZmd1cmF0aW9ucyBvciBub3QuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTEgaWYgYWRhcHRlciBpcyBub3Qgc3VwcG9ydGVkIC8gMCBpZiBhZGFwdGVyIGlzIHN1cHBvcnRlZAorICoqLworc3RhdGljIGludCBpcHJfaW52YWxpZF9hZGFwdGVyKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwl1OCByZXZfaWQ7CisJaW50IGk7CisKKwlpZiAoaW9hX2NmZy0+dHlwZSA9PSAweDU3MDIpIHsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKGlvYV9jZmctPnBkZXYsIFBDSV9SRVZJU0lPTl9JRCwKKwkJCQkJICZyZXZfaWQpID09IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQkJaWYgKHJldl9pZCA8IDQpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcHJfYmxvY2tlZF9wcm9jZXNzb3JzKTsgaSsrKXsKKwkJCQkJaWYgKF9faXNfcHJvY2Vzc29yKGlwcl9ibG9ja2VkX3Byb2Nlc3NvcnNbaV0pKQorCQkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaXByX2ludmFsaWRfYWRhcHRlcihpb2FfY2ZnKSAwCisjZW5kaWYKKworLyoqCisgKiBpcHJfaW9hX2JyaW5nZG93bl9kb25lIC0gSU9BIGJyaW5nIGRvd24gY29tcGxldGlvbi4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgY29tcGxldGlvbiBvZiBhbiBhZGFwdGVyIGJyaW5nIGRvd24uCisgKiBJdCB3YWtlcyBhbnkgcmVzZXQgc2xlZXBlcnMuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FfYnJpbmdkb3duX2RvbmUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwlFTlRFUjsKKwlpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQgPSAwOworCWlvYV9jZmctPnJlc2V0X3JldHJpZXMgPSAwOworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwl3YWtlX3VwX2FsbCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKKworCXNwaW5fdW5sb2NrX2lycShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2spOworCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhpb2FfY2ZnLT5ob3N0KTsKKwlzcGluX2xvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisJTEVBVkU7CisKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX2lvYV9yZXNldF9kb25lIC0gSU9BIHJlc2V0IGNvbXBsZXRpb24uCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGNvbXBsZXRpb24gb2YgYW4gYWRhcHRlciByZXNldC4KKyAqIEl0IHNjaGVkdWxlcyBhbnkgbmVjZXNzYXJ5IG1pZC1sYXllciBhZGQvcmVtb3ZlcyBhbmQKKyAqIHdha2VzIGFueSByZXNldCBzbGVlcGVycy4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX2lvYV9yZXNldF9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwlzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IsICp0ZW1wOworCWludCBpID0gMDsKKworCUVOVEVSOworCWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCA9IDA7CisJaW9hX2NmZy0+YWxsb3dfY21kcyA9IDE7CisJaW9hX2NmZy0+cmVzZXRfY21kID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSwgcXVldWUpIHsKKwkJaWYgKGlvYV9jZmctPmFsbG93X21sX2FkZF9kZWwgJiYgKHJlcy0+YWRkX3RvX21sIHx8IHJlcy0+ZGVsX2Zyb21fbWwpKSB7CisJCQlpcHJfdHJhY2U7CisJCQlicmVhazsKKwkJfQorCX0KKwlzY2hlZHVsZV93b3JrKCZpb2FfY2ZnLT53b3JrX3EpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc3RyY2IsIHRlbXAsICZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSwgcXVldWUpIHsKKwkJbGlzdF9kZWwoJmhvc3RyY2ItPnF1ZXVlKTsKKwkJaWYgKGkrKyA8IElQUl9OVU1fTE9HX0hDQU1TKQorCQkJaXByX3NlbmRfaGNhbShpb2FfY2ZnLCBJUFJfSENBTV9DREJfT1BfQ09ERV9MT0dfREFUQSwgaG9zdHJjYik7CisJCWVsc2UKKwkJCWlwcl9zZW5kX2hjYW0oaW9hX2NmZywgSVBSX0hDQU1fQ0RCX09QX0NPREVfQ09ORklHX0NIQU5HRSwgaG9zdHJjYik7CisJfQorCisJZGV2X2luZm8oJmlvYV9jZmctPnBkZXYtPmRldiwgIklPQSBpbml0aWFsaXplZC5cbiIpOworCisJaW9hX2NmZy0+cmVzZXRfcmV0cmllcyA9IDA7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCXdha2VfdXBfYWxsKCZpb2FfY2ZnLT5yZXNldF93YWl0X3EpOworCisJc3Bpbl91bmxvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisJc2NzaV91bmJsb2NrX3JlcXVlc3RzKGlvYV9jZmctPmhvc3QpOworCXNwaW5fbG9ja19pcnEoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrKTsKKworCWlmICghaW9hX2NmZy0+YWxsb3dfY21kcykKKwkJc2NzaV9ibG9ja19yZXF1ZXN0cyhpb2FfY2ZnLT5ob3N0KTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfc2V0X3N1cF9kZXZfZGZsdCAtIEluaXRpYWxpemUgYSBTZXQgU3VwcG9ydGVkIERldmljZSBidWZmZXIKKyAqIEBzdXBwb3J0ZWRfZGV2OglzdXBwb3J0ZWQgZGV2aWNlIHN0cnVjdAorICogQHZwaWRzOgkJCXZlbmRvciBwcm9kdWN0IGlkIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2V0X3N1cF9kZXZfZGZsdChzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2UgKnN1cHBvcnRlZF9kZXYsCisJCQkJIHN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyAqdnBpZHMpCit7CisJbWVtc2V0KHN1cHBvcnRlZF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2UpKTsKKwltZW1jcHkoJnN1cHBvcnRlZF9kZXYtPnZwaWRzLCB2cGlkcywgc2l6ZW9mKHN0cnVjdCBpcHJfc3RkX2lucV92cGlkcykpOworCXN1cHBvcnRlZF9kZXYtPm51bV9yZWNvcmRzID0gMTsKKwlzdXBwb3J0ZWRfZGV2LT5kYXRhX2xlbmd0aCA9CisJCWNwdV90b19iZTE2KHNpemVvZihzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2UpKTsKKwlzdXBwb3J0ZWRfZGV2LT5yZXNlcnZlZCA9IDA7Cit9CisKKy8qKgorICogaXByX3NldF9zdXBwb3J0ZWRfZGV2cyAtIFNlbmQgU2V0IFN1cHBvcnRlZCBEZXZpY2VzIGZvciBhIGRldmljZQorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZCBhIFNldCBTdXBwb3J0ZWQgRGV2aWNlcyB0byB0aGUgYWRhcHRlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFIC8gSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX3NldF9zdXBwb3J0ZWRfZGV2cyhzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2UgKnN1cHBfZGV2ID0gJmlvYV9jZmctPnZwZF9jYnMtPnN1cHBfZGV2OworCXN0cnVjdCBpcHJfaW9hZGxfZGVzYyAqaW9hZGwgPSBpcHJfY21kLT5pb2FkbDsKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMgPSBpcHJfY21kLT51LnJlczsKKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2lvYV9yZXNldF9kb25lOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShyZXMsICZpb2FfY2ZnLT51c2VkX3Jlc19xLCBxdWV1ZSkgeworCQlpZiAoIWlwcl9pc19hZl9kYXNkX2RldmljZShyZXMpKQorCQkJY29udGludWU7CisKKwkJaXByX2NtZC0+dS5yZXMgPSByZXM7CisJCWlwcl9zZXRfc3VwX2Rldl9kZmx0KHN1cHBfZGV2LCAmcmVzLT5jZmd0ZS5zdGRfaW5xX2RhdGEudnBpZHMpOworCisJCWlvYXJjYi0+cmVzX2hhbmRsZSA9IGNwdV90b19iZTMyKElQUl9JT0FfUkVTX0hBTkRMRSk7CisJCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfV1JJVEVfTk9UX1JFQUQ7CisJCWlvYXJjYi0+Y21kX3BrdC5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX0lPQUNNRDsKKworCQlpb2FyY2ItPmNtZF9wa3QuY2RiWzBdID0gSVBSX1NFVF9TVVBQT1JURURfREVWSUNFUzsKKwkJaW9hcmNiLT5jbWRfcGt0LmNkYls3XSA9IChzaXplb2Yoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlKSA+PiA4KSAmIDB4ZmY7CisJCWlvYXJjYi0+Y21kX3BrdC5jZGJbOF0gPSBzaXplb2Yoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlKSAmIDB4ZmY7CisKKwkJaW9hZGwtPmZsYWdzX2FuZF9kYXRhX2xlbiA9IGNwdV90b19iZTMyKElQUl9JT0FETF9GTEFHU19XUklURV9MQVNUIHwKKwkJCQkJCQlzaXplb2Yoc3RydWN0IGlwcl9zdXBwb3J0ZWRfZGV2aWNlKSk7CisJCWlvYWRsLT5hZGRyZXNzID0gY3B1X3RvX2JlMzIoaW9hX2NmZy0+dnBkX2Nic19kbWEgKworCQkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpcHJfbWlzY19jYnMsIHN1cHBfZGV2KSk7CisJCWlvYXJjYi0+d3JpdGVfaW9hZGxfbGVuID0gY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykpOworCQlpb2FyY2ItPndyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0KKwkJCWNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2UpKTsKKworCQlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9yZXNldF9pb2Ffam9iLCBpcHJfdGltZW91dCwKKwkJCSAgIElQUl9TRVRfU1VQX0RFVklDRV9USU1FT1VUKTsKKworCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9zZXRfc3VwcG9ydGVkX2RldnM7CisJCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKKwl9CisKKwlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKK30KKworLyoqCisgKiBpcHJfZ2V0X21vZGVfcGFnZSAtIExvY2F0ZSBzcGVjaWZpZWQgbW9kZSBwYWdlCisgKiBAbW9kZV9wYWdlczoJbW9kZSBwYWdlIGJ1ZmZlcgorICogQHBhZ2VfY29kZToJcGFnZSBjb2RlIHRvIGZpbmQKKyAqIEBsZW46CQltaW5pbXVtIHJlcXVpcmVkIGxlbmd0aCBmb3IgbW9kZSBwYWdlCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCXBvaW50ZXIgdG8gbW9kZSBwYWdlIC8gTlVMTCBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgdm9pZCAqaXByX2dldF9tb2RlX3BhZ2Uoc3RydWN0IGlwcl9tb2RlX3BhZ2VzICptb2RlX3BhZ2VzLAorCQkJICAgICAgIHUzMiBwYWdlX2NvZGUsIHUzMiBsZW4pCit7CisJc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyICptb2RlX2hkcjsKKwl1MzIgcGFnZV9sZW5ndGg7CisJdTMyIGxlbmd0aDsKKworCWlmICghbW9kZV9wYWdlcyB8fCAobW9kZV9wYWdlcy0+aGRyLmxlbmd0aCA9PSAwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW5ndGggPSAobW9kZV9wYWdlcy0+aGRyLmxlbmd0aCArIDEpIC0gNCAtIG1vZGVfcGFnZXMtPmhkci5ibG9ja19kZXNjX2xlbjsKKwltb2RlX2hkciA9IChzdHJ1Y3QgaXByX21vZGVfcGFnZV9oZHIgKikKKwkJKG1vZGVfcGFnZXMtPmRhdGEgKyBtb2RlX3BhZ2VzLT5oZHIuYmxvY2tfZGVzY19sZW4pOworCisJd2hpbGUgKGxlbmd0aCkgeworCQlpZiAoSVBSX0dFVF9NT0RFX1BBR0VfQ09ERShtb2RlX2hkcikgPT0gcGFnZV9jb2RlKSB7CisJCQlpZiAobW9kZV9oZHItPnBhZ2VfbGVuZ3RoID49IChsZW4gLSBzaXplb2Yoc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyKSkpCisJCQkJcmV0dXJuIG1vZGVfaGRyOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwYWdlX2xlbmd0aCA9IChzaXplb2Yoc3RydWN0IGlwcl9tb2RlX3BhZ2VfaGRyKSArCisJCQkJICAgICAgIG1vZGVfaGRyLT5wYWdlX2xlbmd0aCk7CisJCQlsZW5ndGggLT0gcGFnZV9sZW5ndGg7CisJCQltb2RlX2hkciA9IChzdHJ1Y3QgaXByX21vZGVfcGFnZV9oZHIgKikKKwkJCQkoKHVuc2lnbmVkIGxvbmcpbW9kZV9oZHIgKyBwYWdlX2xlbmd0aCk7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaXByX2NoZWNrX3Rlcm1fcG93ZXIgLSBDaGVjayBmb3IgdGVybSBwb3dlciBlcnJvcnMKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQG1vZGVfcGFnZXM6CUlPQUZQIG1vZGUgcGFnZXMgYnVmZmVyCisgKgorICogQ2hlY2sgdGhlIElPQUZQJ3MgbW9kZSBwYWdlIDI4IGZvciB0ZXJtIHBvd2VyIGVycm9ycworICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfY2hlY2tfdGVybV9wb3dlcihzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJIHN0cnVjdCBpcHJfbW9kZV9wYWdlcyAqbW9kZV9wYWdlcykKK3sKKwlpbnQgaTsKKwlpbnQgZW50cnlfbGVuZ3RoOworCXN0cnVjdCBpcHJfZGV2X2J1c19lbnRyeSAqYnVzOworCXN0cnVjdCBpcHJfbW9kZV9wYWdlMjggKm1vZGVfcGFnZTsKKworCW1vZGVfcGFnZSA9IGlwcl9nZXRfbW9kZV9wYWdlKG1vZGVfcGFnZXMsIDB4MjgsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpcHJfbW9kZV9wYWdlMjgpKTsKKworCWVudHJ5X2xlbmd0aCA9IG1vZGVfcGFnZS0+ZW50cnlfbGVuZ3RoOworCisJYnVzID0gbW9kZV9wYWdlLT5idXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kZV9wYWdlLT5udW1fZW50cmllczsgaSsrKSB7CisJCWlmIChidXMtPmZsYWdzICYgSVBSX1NDU0lfQVRUUl9OT19URVJNX1BXUikgeworCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJCSJUZXJtIHBvd2VyIGlzIGFic2VudCBvbiBzY3NpIGJ1cyAlZFxuIiwKKwkJCQlidXMtPnJlc19hZGRyLmJ1cyk7CisJCX0KKworCQlidXMgPSAoc3RydWN0IGlwcl9kZXZfYnVzX2VudHJ5ICopKChjaGFyICopYnVzICsgZW50cnlfbGVuZ3RoKTsKKwl9Cit9CisKKy8qKgorICogaXByX3Njc2lfYnVzX3NwZWVkX2xpbWl0IC0gTGltaXQgdGhlIFNDU0kgc3BlZWQgYmFzZWQgb24gU0VTIHRhYmxlCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBMb29rcyB0aHJvdWdoIHRoZSBjb25maWcgdGFibGUgY2hlY2tpbmcgZm9yIFNFUyBkZXZpY2VzLiBJZgorICogdGhlIFNFUyBkZXZpY2UgaXMgaW4gdGhlIFNFUyB0YWJsZSBpbmRpY2F0aW5nIGEgbWF4aW11bSBTQ1NJCisgKiBidXMgc3BlZWQsIHRoZSBzcGVlZCBpcyBsaW1pdGVkIGZvciB0aGUgYnVzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfc2NzaV9idXNfc3BlZWRfbGltaXQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXUzMiBtYXhfeGZlcl9yYXRlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElQUl9NQVhfTlVNX0JVU0VTOyBpKyspIHsKKwkJbWF4X3hmZXJfcmF0ZSA9IGlwcl9nZXRfbWF4X3Njc2lfc3BlZWQoaW9hX2NmZywgaSwKKwkJCQkJCSAgICAgICBpb2FfY2ZnLT5idXNfYXR0cltpXS5idXNfd2lkdGgpOworCisJCWlmIChtYXhfeGZlcl9yYXRlIDwgaW9hX2NmZy0+YnVzX2F0dHJbaV0ubWF4X3hmZXJfcmF0ZSkKKwkJCWlvYV9jZmctPmJ1c19hdHRyW2ldLm1heF94ZmVyX3JhdGUgPSBtYXhfeGZlcl9yYXRlOworCX0KK30KKworLyoqCisgKiBpcHJfbW9kaWZ5X2lvYWZwX21vZGVfcGFnZV8yOCAtIE1vZGlmeSBJT0FGUCBNb2RlIFBhZ2UgMjgKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQG1vZGVfcGFnZXM6CW1vZGUgcGFnZSAyOCBidWZmZXIKKyAqCisgKiBVcGRhdGVzIG1vZGUgcGFnZSAyOCBiYXNlZCBvbiBkcml2ZXIgY29uZmlndXJhdGlvbgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfbW9kaWZ5X2lvYWZwX21vZGVfcGFnZV8yOChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJCSAgCXN0cnVjdCBpcHJfbW9kZV9wYWdlcyAqbW9kZV9wYWdlcykKK3sKKwlpbnQgaSwgZW50cnlfbGVuZ3RoOworCXN0cnVjdCBpcHJfZGV2X2J1c19lbnRyeSAqYnVzOworCXN0cnVjdCBpcHJfYnVzX2F0dHJpYnV0ZXMgKmJ1c19hdHRyOworCXN0cnVjdCBpcHJfbW9kZV9wYWdlMjggKm1vZGVfcGFnZTsKKworCW1vZGVfcGFnZSA9IGlwcl9nZXRfbW9kZV9wYWdlKG1vZGVfcGFnZXMsIDB4MjgsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpcHJfbW9kZV9wYWdlMjgpKTsKKworCWVudHJ5X2xlbmd0aCA9IG1vZGVfcGFnZS0+ZW50cnlfbGVuZ3RoOworCisJLyogTG9vcCBmb3IgZWFjaCBkZXZpY2UgYnVzIGVudHJ5ICovCisJZm9yIChpID0gMCwgYnVzID0gbW9kZV9wYWdlLT5idXM7CisJICAgICBpIDwgbW9kZV9wYWdlLT5udW1fZW50cmllczsKKwkgICAgIGkrKywgYnVzID0gKHN0cnVjdCBpcHJfZGV2X2J1c19lbnRyeSAqKSgodTggKilidXMgKyBlbnRyeV9sZW5ndGgpKSB7CisJCWlmIChidXMtPnJlc19hZGRyLmJ1cyA+IElQUl9NQVhfTlVNX0JVU0VTKSB7CisJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkJIkludmFsaWQgcmVzb3VyY2UgYWRkcmVzcyByZXBvcnRlZDogMHglMDhYXG4iLAorCQkJCUlQUl9HRVRfUEhZU19MT0MoYnVzLT5yZXNfYWRkcikpOworCQkJY29udGludWU7CisJCX0KKworCQlidXNfYXR0ciA9ICZpb2FfY2ZnLT5idXNfYXR0cltpXTsKKwkJYnVzLT5leHRlbmRlZF9yZXNldF9kZWxheSA9IElQUl9FWFRFTkRFRF9SRVNFVF9ERUxBWTsKKwkJYnVzLT5idXNfd2lkdGggPSBidXNfYXR0ci0+YnVzX3dpZHRoOworCQlidXMtPm1heF94ZmVyX3JhdGUgPSBjcHVfdG9fYmUzMihidXNfYXR0ci0+bWF4X3hmZXJfcmF0ZSk7CisJCWJ1cy0+ZmxhZ3MgJj0gfklQUl9TQ1NJX0FUVFJfUUFTX01BU0s7CisJCWlmIChidXNfYXR0ci0+cWFzX2VuYWJsZWQpCisJCQlidXMtPmZsYWdzIHw9IElQUl9TQ1NJX0FUVFJfRU5BQkxFX1FBUzsKKwkJZWxzZQorCQkJYnVzLT5mbGFncyB8PSBJUFJfU0NTSV9BVFRSX0RJU0FCTEVfUUFTOworCX0KK30KKworLyoqCisgKiBpcHJfYnVpbGRfbW9kZV9zZWxlY3QgLSBCdWlsZCBhIG1vZGUgc2VsZWN0IGNvbW1hbmQKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqIEByZXNfaGFuZGxlOglyZXNvdXJjZSBoYW5kbGUgdG8gc2VuZCBjb21tYW5kIHRvCisgKiBAcGFybToJCUJ5dGUgMiBvZiBNb2RlIFNlbnNlIGNvbW1hbmQKKyAqIEBkbWFfYWRkcjoJRE1BIGJ1ZmZlciBhZGRyZXNzCisgKiBAeGZlcl9sZW46CWRhdGEgdHJhbnNmZXIgbGVuZ3RoCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9idWlsZF9tb2RlX3NlbGVjdChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsCisJCQkJICBfX2JlMzIgcmVzX2hhbmRsZSwgdTggcGFybSwgdTMyIGRtYV9hZGRyLAorCQkJCSAgdTggeGZlcl9sZW4pCit7CisJc3RydWN0IGlwcl9pb2FkbF9kZXNjICppb2FkbCA9IGlwcl9jbWQtPmlvYWRsOworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2IgPSAmaXByX2NtZC0+aW9hcmNiOworCisJaW9hcmNiLT5yZXNfaGFuZGxlID0gcmVzX2hhbmRsZTsKKwlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9TQ1NJQ0RCOworCWlvYXJjYi0+Y21kX3BrdC5mbGFnc19oaSB8PSBJUFJfRkxBR1NfSElfV1JJVEVfTk9UX1JFQUQ7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlswXSA9IE1PREVfU0VMRUNUOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMV0gPSBwYXJtOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbNF0gPSB4ZmVyX2xlbjsKKworCWlvYWRsLT5mbGFnc19hbmRfZGF0YV9sZW4gPQorCQljcHVfdG9fYmUzMihJUFJfSU9BRExfRkxBR1NfV1JJVEVfTEFTVCB8IHhmZXJfbGVuKTsKKwlpb2FkbC0+YWRkcmVzcyA9IGNwdV90b19iZTMyKGRtYV9hZGRyKTsKKwlpb2FyY2ItPndyaXRlX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwlpb2FyY2ItPndyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoID0gY3B1X3RvX2JlMzIoeGZlcl9sZW4pOworfQorCisvKioKKyAqIGlwcl9pb2FmcF9tb2RlX3NlbGVjdF9wYWdlMjggLSBJc3N1ZSBNb2RlIFNlbGVjdCBQYWdlIDI4IHRvIElPQQorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgU0NTSSBidXMgYXR0cmlidXRlcyBhbmQgc2VuZHMKKyAqIGEgTW9kZSBTZWxlY3QgZm9yIFBhZ2UgMjggdG8gYWN0aXZhdGUgdGhlbS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX2lvYWZwX21vZGVfc2VsZWN0X3BhZ2UyOChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX21vZGVfcGFnZXMgKm1vZGVfcGFnZXMgPSAmaW9hX2NmZy0+dnBkX2Nicy0+bW9kZV9wYWdlczsKKwlpbnQgbGVuZ3RoOworCisJRU5URVI7CisJaWYgKGlvYV9jZmctPnNhdmVkX21vZGVfcGFnZXMpIHsKKwkJbWVtY3B5KG1vZGVfcGFnZXMsIGlvYV9jZmctPnNhdmVkX21vZGVfcGFnZXMsCisJCSAgICAgICBpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VfbGVuKTsKKwkJbGVuZ3RoID0gaW9hX2NmZy0+c2F2ZWRfbW9kZV9wYWdlX2xlbjsKKwl9IGVsc2UgeworCQlpcHJfc2NzaV9idXNfc3BlZWRfbGltaXQoaW9hX2NmZyk7CisJCWlwcl9jaGVja190ZXJtX3Bvd2VyKGlvYV9jZmcsIG1vZGVfcGFnZXMpOworCQlpcHJfbW9kaWZ5X2lvYWZwX21vZGVfcGFnZV8yOChpb2FfY2ZnLCBtb2RlX3BhZ2VzKTsKKwkJbGVuZ3RoID0gbW9kZV9wYWdlcy0+aGRyLmxlbmd0aCArIDE7CisJCW1vZGVfcGFnZXMtPmhkci5sZW5ndGggPSAwOworCX0KKworCWlwcl9idWlsZF9tb2RlX3NlbGVjdChpcHJfY21kLCBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpLCAweDExLAorCQkJICAgICAgaW9hX2NmZy0+dnBkX2Nic19kbWEgKyBvZmZzZXRvZihzdHJ1Y3QgaXByX21pc2NfY2JzLCBtb2RlX3BhZ2VzKSwKKwkJCSAgICAgIGxlbmd0aCk7CisKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9zZXRfc3VwcG9ydGVkX2RldnM7CisJaXByX2NtZC0+dS5yZXMgPSBsaXN0X2VudHJ5KGlvYV9jZmctPnVzZWRfcmVzX3EubmV4dCwKKwkJCQkgICAgc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSwgcXVldWUpOworCisJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfcmVzZXRfaW9hX2pvYiwgaXByX3RpbWVvdXQsIElQUl9JTlRFUk5BTF9USU1FT1VUKTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfYnVpbGRfbW9kZV9zZW5zZSAtIEJ1aWxkcyBhIG1vZGUgc2Vuc2UgY29tbWFuZAorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICogQHJlczoJCXJlc291cmNlIGVudHJ5IHN0cnVjdAorICogQHBhcm06CQlCeXRlIDIgb2YgbW9kZSBzZW5zZSBjb21tYW5kCisgKiBAZG1hX2FkZHI6CURNQSBhZGRyZXNzIG9mIG1vZGUgc2Vuc2UgYnVmZmVyCisgKiBAeGZlcl9sZW46CVNpemUgb2YgRE1BIGJ1ZmZlcgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfYnVpbGRfbW9kZV9zZW5zZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsCisJCQkJIF9fYmUzMiByZXNfaGFuZGxlLAorCQkJCSB1OCBwYXJtLCB1MzIgZG1hX2FkZHIsIHU4IHhmZXJfbGVuKQoreworCXN0cnVjdCBpcHJfaW9hZGxfZGVzYyAqaW9hZGwgPSBpcHJfY21kLT5pb2FkbDsKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKworCWlvYXJjYi0+cmVzX2hhbmRsZSA9IHJlc19oYW5kbGU7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlswXSA9IE1PREVfU0VOU0U7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlsyXSA9IHBhcm07CisJaW9hcmNiLT5jbWRfcGt0LmNkYls0XSA9IHhmZXJfbGVuOworCWlvYXJjYi0+Y21kX3BrdC5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX1NDU0lDREI7CisKKwlpb2FkbC0+ZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJY3B1X3RvX2JlMzIoSVBSX0lPQURMX0ZMQUdTX1JFQURfTEFTVCB8IHhmZXJfbGVuKTsKKwlpb2FkbC0+YWRkcmVzcyA9IGNwdV90b19iZTMyKGRtYV9hZGRyKTsKKwlpb2FyY2ItPnJlYWRfaW9hZGxfbGVuID0gY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykpOworCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IGNwdV90b19iZTMyKHhmZXJfbGVuKTsKK30KKworLyoqCisgKiBpcHJfaW9hZnBfbW9kZV9zZW5zZV9wYWdlMjggLSBJc3N1ZSBNb2RlIFNlbnNlIFBhZ2UgMjggdG8gSU9BCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kIGEgUGFnZSAyOCBtb2RlIHNlbnNlIHRvIHRoZSBJT0EgdG8KKyAqIHJldHJpZXZlIFNDU0kgYnVzIGF0dHJpYnV0ZXMuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FmcF9tb2RlX3NlbnNlX3BhZ2UyOChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKworCUVOVEVSOworCWlwcl9idWlsZF9tb2RlX3NlbnNlKGlwcl9jbWQsIGNwdV90b19iZTMyKElQUl9JT0FfUkVTX0hBTkRMRSksCisJCQkgICAgIDB4MjgsIGlvYV9jZmctPnZwZF9jYnNfZG1hICsKKwkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGlwcl9taXNjX2NicywgbW9kZV9wYWdlcyksCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXByX21vZGVfcGFnZXMpKTsKKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX2lvYWZwX21vZGVfc2VsZWN0X3BhZ2UyODsKKworCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX3Jlc2V0X2lvYV9qb2IsIGlwcl90aW1lb3V0LCBJUFJfSU5URVJOQUxfVElNRU9VVCk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX2luaXRfcmVzX3RhYmxlIC0gSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgdGFibGUKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHRocm91Z2ggdGhlIGV4aXN0aW5nIHJlc291cmNlIHRhYmxlLCBjb21wYXJpbmcKKyAqIGl0IHdpdGggdGhlIGNvbmZpZyB0YWJsZS4gVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgY2FyZSBvZiBvbGQvbmV3CisgKiBkZXZpY2VzIGFuZCBzY2hlZHVsZSBhZGRpbmcvcmVtb3ZpbmcgdGhlbSBmcm9tIHRoZSBtaWQtbGF5ZXIKKyAqIGFzIGFwcHJvcHJpYXRlLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFCisgKiovCitzdGF0aWMgaW50IGlwcl9pbml0X3Jlc190YWJsZShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMsICp0ZW1wOworCXN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2VudHJ5ICpjZmd0ZTsKKwlpbnQgZm91bmQsIGk7CisJTElTVF9IRUFEKG9sZF9yZXMpOworCisJRU5URVI7CisJaWYgKGlvYV9jZmctPmNmZ190YWJsZS0+aGRyLmZsYWdzICYgSVBSX1VDT0RFX0RPV05MT0FEX1JFUSkKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiTWljcm9jb2RlIGRvd25sb2FkIHJlcXVpcmVkXG4iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIHRlbXAsICZpb2FfY2ZnLT51c2VkX3Jlc19xLCBxdWV1ZSkKKwkJbGlzdF9tb3ZlX3RhaWwoJnJlcy0+cXVldWUsICZvbGRfcmVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb2FfY2ZnLT5jZmdfdGFibGUtPmhkci5udW1fZW50cmllczsgaSsrKSB7CisJCWNmZ3RlID0gJmlvYV9jZmctPmNmZ190YWJsZS0+ZGV2W2ldOworCQlmb3VuZCA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdGVtcCwgJm9sZF9yZXMsIHF1ZXVlKSB7CisJCQlpZiAoIW1lbWNtcCgmcmVzLT5jZmd0ZS5yZXNfYWRkciwKKwkJCQkgICAgJmNmZ3RlLT5yZXNfYWRkciwgc2l6ZW9mKGNmZ3RlLT5yZXNfYWRkcikpKSB7CisJCQkJbGlzdF9tb3ZlX3RhaWwoJnJlcy0+cXVldWUsICZpb2FfY2ZnLT51c2VkX3Jlc19xKTsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmaW9hX2NmZy0+ZnJlZV9yZXNfcSkpIHsKKwkJCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJUb28gbWFueSBkZXZpY2VzIGF0dGFjaGVkXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZm91bmQgPSAxOworCQkJcmVzID0gbGlzdF9lbnRyeShpb2FfY2ZnLT5mcmVlX3Jlc19xLm5leHQsCisJCQkJCSBzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5LCBxdWV1ZSk7CisJCQlsaXN0X21vdmVfdGFpbCgmcmVzLT5xdWV1ZSwgJmlvYV9jZmctPnVzZWRfcmVzX3EpOworCQkJaXByX2luaXRfcmVzX2VudHJ5KHJlcyk7CisJCQlyZXMtPmFkZF90b19tbCA9IDE7CisJCX0KKworCQlpZiAoZm91bmQpCisJCQltZW1jcHkoJnJlcy0+Y2ZndGUsIGNmZ3RlLCBzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkpKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCB0ZW1wLCAmb2xkX3JlcywgcXVldWUpIHsKKwkJaWYgKHJlcy0+c2RldikgeworCQkJcmVzLT5kZWxfZnJvbV9tbCA9IDE7CisJCQlyZXMtPnNkZXYtPmhvc3RkYXRhID0gTlVMTDsKKwkJCWxpc3RfbW92ZV90YWlsKCZyZXMtPnF1ZXVlLCAmaW9hX2NmZy0+dXNlZF9yZXNfcSk7CisJCX0gZWxzZSB7CisJCQlsaXN0X21vdmVfdGFpbCgmcmVzLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcmVzX3EpOworCQl9CisJfQorCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfbW9kZV9zZW5zZV9wYWdlMjg7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKK30KKworLyoqCisgKiBpcHJfaW9hZnBfcXVlcnlfaW9hX2NmZyAtIFNlbmQgYSBRdWVyeSBJT0EgQ29uZmlnIHRvIHRoZSBhZGFwdGVyLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBRdWVyeSBJT0EgQ29uZmlndXJhdGlvbiBjb21tYW5kCisgKiB0byB0aGUgYWRhcHRlciB0byByZXRyaWV2ZSB0aGUgSU9BIGNvbmZpZ3VyYXRpb24gdGFibGUuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FmcF9xdWVyeV9pb2FfY2ZnKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfaW9hcmNiICppb2FyY2IgPSAmaXByX2NtZC0+aW9hcmNiOworCXN0cnVjdCBpcHJfaW9hZGxfZGVzYyAqaW9hZGwgPSBpcHJfY21kLT5pb2FkbDsKKwlzdHJ1Y3QgaXByX2lucXVpcnlfcGFnZTMgKnVjb2RlX3ZwZCA9ICZpb2FfY2ZnLT52cGRfY2JzLT5wYWdlM19kYXRhOworCisJRU5URVI7CisJZGV2X2luZm8oJmlvYV9jZmctPnBkZXYtPmRldiwgIkFkYXB0ZXIgZmlybXdhcmUgdmVyc2lvbjogJTAyWCUwMlglMDJYJTAyWFxuIiwKKwkJIHVjb2RlX3ZwZC0+bWFqb3JfcmVsZWFzZSwgdWNvZGVfdnBkLT5jYXJkX3R5cGUsCisJCSB1Y29kZV92cGQtPm1pbm9yX3JlbGVhc2VbMF0sIHVjb2RlX3ZwZC0+bWlub3JfcmVsZWFzZVsxXSk7CisJaW9hcmNiLT5jbWRfcGt0LnJlcXVlc3RfdHlwZSA9IElQUl9SUVRZUEVfSU9BQ01EOworCWlvYXJjYi0+cmVzX2hhbmRsZSA9IGNwdV90b19iZTMyKElQUl9JT0FfUkVTX0hBTkRMRSk7CisKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzBdID0gSVBSX1FVRVJZX0lPQV9DT05GSUc7CisJaW9hcmNiLT5jbWRfcGt0LmNkYls3XSA9IChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGUpID4+IDgpICYgMHhmZjsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzhdID0gc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlKSAmIDB4ZmY7CisKKwlpb2FyY2ItPnJlYWRfaW9hZGxfbGVuID0gY3B1X3RvX2JlMzIoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hZGxfZGVzYykpOworCWlvYXJjYi0+cmVhZF9kYXRhX3RyYW5zZmVyX2xlbmd0aCA9CisJCWNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZSkpOworCisJaW9hZGwtPmFkZHJlc3MgPSBjcHVfdG9fYmUzMihpb2FfY2ZnLT5jZmdfdGFibGVfZG1hKTsKKwlpb2FkbC0+ZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJY3B1X3RvX2JlMzIoSVBSX0lPQURMX0ZMQUdTX1JFQURfTEFTVCB8IHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZSkpOworCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW5pdF9yZXNfdGFibGU7CisKKwlpcHJfZG9fcmVxKGlwcl9jbWQsIGlwcl9yZXNldF9pb2Ffam9iLCBpcHJfdGltZW91dCwgSVBSX0lOVEVSTkFMX1RJTUVPVVQpOworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9pb2FmcF9pbnF1aXJ5IC0gU2VuZCBhbiBJbnF1aXJ5IHRvIHRoZSBhZGFwdGVyLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBzZW5kcyBhbiBpbnF1aXJ5IHRvIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfaW9hZnBfaW5xdWlyeShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQsIHU4IGZsYWdzLCB1OCBwYWdlLAorCQkJICAgICAgdTMyIGRtYV9hZGRyLCB1OCB4ZmVyX2xlbikKK3sKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKwlzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgKmlvYWRsID0gaXByX2NtZC0+aW9hZGw7CisKKwlFTlRFUjsKKwlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9TQ1NJQ0RCOworCWlvYXJjYi0+cmVzX2hhbmRsZSA9IGNwdV90b19iZTMyKElQUl9JT0FfUkVTX0hBTkRMRSk7CisKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzBdID0gSU5RVUlSWTsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzFdID0gZmxhZ3M7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlsyXSA9IHBhZ2U7CisJaW9hcmNiLT5jbWRfcGt0LmNkYls0XSA9IHhmZXJfbGVuOworCisJaW9hcmNiLT5yZWFkX2lvYWRsX2xlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MpKTsKKwlpb2FyY2ItPnJlYWRfZGF0YV90cmFuc2Zlcl9sZW5ndGggPSBjcHVfdG9fYmUzMih4ZmVyX2xlbik7CisKKwlpb2FkbC0+YWRkcmVzcyA9IGNwdV90b19iZTMyKGRtYV9hZGRyKTsKKwlpb2FkbC0+ZmxhZ3NfYW5kX2RhdGFfbGVuID0KKwkJY3B1X3RvX2JlMzIoSVBSX0lPQURMX0ZMQUdTX1JFQURfTEFTVCB8IHhmZXJfbGVuKTsKKworCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX3Jlc2V0X2lvYV9qb2IsIGlwcl90aW1lb3V0LCBJUFJfSU5URVJOQUxfVElNRU9VVCk7CisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX2lvYWZwX3BhZ2UzX2lucXVpcnkgLSBTZW5kIGEgUGFnZSAzIElucXVpcnkgdG8gdGhlIGFkYXB0ZXIuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIFBhZ2UgMyBpbnF1aXJ5IHRvIHRoZSBhZGFwdGVyCisgKiB0byByZXRyaWV2ZSBzb2Z0d2FyZSBWUEQgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfQ09OVElOVUUgLyBJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfaW9hZnBfcGFnZTNfaW5xdWlyeShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwljaGFyIHR5cGVbNV07CisKKwlFTlRFUjsKKworCS8qIEdyYWIgdGhlIHR5cGUgb3V0IG9mIHRoZSBWUEQgYW5kIHN0b3JlIGl0IGF3YXkgKi8KKwltZW1jcHkodHlwZSwgaW9hX2NmZy0+dnBkX2Nicy0+aW9hX3ZwZC5zdGRfaW5xX2RhdGEudnBpZHMucHJvZHVjdF9pZCwgNCk7CisJdHlwZVs0XSA9ICdcMCc7CisJaW9hX2NmZy0+dHlwZSA9IHNpbXBsZV9zdHJ0b3VsKChjaGFyICopdHlwZSwgTlVMTCwgMTYpOworCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfcXVlcnlfaW9hX2NmZzsKKworCWlwcl9pb2FmcF9pbnF1aXJ5KGlwcl9jbWQsIDEsIDMsCisJCQkgIGlvYV9jZmctPnZwZF9jYnNfZG1hICsgb2Zmc2V0b2Yoc3RydWN0IGlwcl9taXNjX2NicywgcGFnZTNfZGF0YSksCisJCQkgIHNpemVvZihzdHJ1Y3QgaXByX2lucXVpcnlfcGFnZTMpKTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfaW9hZnBfc3RkX2lucXVpcnkgLSBTZW5kIGEgU3RhbmRhcmQgSW5xdWlyeSB0byB0aGUgYWRhcHRlci4KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc3RhbmRhcmQgaW5xdWlyeSB0byB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX2lvYWZwX3N0ZF9pbnF1aXJ5KHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCisJRU5URVI7CisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfcGFnZTNfaW5xdWlyeTsKKworCWlwcl9pb2FmcF9pbnF1aXJ5KGlwcl9jbWQsIDAsIDAsCisJCQkgIGlvYV9jZmctPnZwZF9jYnNfZG1hICsgb2Zmc2V0b2Yoc3RydWN0IGlwcl9taXNjX2NicywgaW9hX3ZwZCksCisJCQkgIHNpemVvZihzdHJ1Y3QgaXByX2lvYV92cGQpKTsKKworCUxFQVZFOworCXJldHVybiBJUFJfUkNfSk9CX1JFVFVSTjsKK30KKworLyoqCisgKiBpcHJfaW9hZnBfaW5kZW50aWZ5X2hycnEgLSBTZW5kIElkZW50aWZ5IEhvc3QgUlJRLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZCBhbiBJZGVudGlmeSBIb3N0IFJlcXVlc3QgUmVzcG9uc2UgUXVldWUKKyAqIGNvbW1hbmQgdG8gZXN0YWJsaXNoIHRoZSBIUlJRIHdpdGggdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9pb2FmcF9pbmRlbnRpZnlfaHJycShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwlzdHJ1Y3QgaXByX2lvYXJjYiAqaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKKworCUVOVEVSOworCWRldl9pbmZvKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJTdGFydGluZyBJT0EgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuXG4iKTsKKworCWlvYXJjYi0+Y21kX3BrdC5jZGJbMF0gPSBJUFJfSURfSE9TVF9SUl9ROworCWlvYXJjYi0+cmVzX2hhbmRsZSA9IGNwdV90b19iZTMyKElQUl9JT0FfUkVTX0hBTkRMRSk7CisKKwlpb2FyY2ItPmNtZF9wa3QucmVxdWVzdF90eXBlID0gSVBSX1JRVFlQRV9JT0FDTUQ7CisJaW9hcmNiLT5jbWRfcGt0LmNkYlsyXSA9CisJCSgodTMyKSBpb2FfY2ZnLT5ob3N0X3JycV9kbWEgPj4gMjQpICYgMHhmZjsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzNdID0KKwkJKCh1MzIpIGlvYV9jZmctPmhvc3RfcnJxX2RtYSA+PiAxNikgJiAweGZmOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbNF0gPQorCQkoKHUzMikgaW9hX2NmZy0+aG9zdF9ycnFfZG1hID4+IDgpICYgMHhmZjsKKwlpb2FyY2ItPmNtZF9wa3QuY2RiWzVdID0KKwkJKCh1MzIpIGlvYV9jZmctPmhvc3RfcnJxX2RtYSkgJiAweGZmOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbN10gPQorCQkoKHNpemVvZih1MzIpICogSVBSX05VTV9DTURfQkxLUykgPj4gOCkgJiAweGZmOworCWlvYXJjYi0+Y21kX3BrdC5jZGJbOF0gPQorCQkoc2l6ZW9mKHUzMikgKiBJUFJfTlVNX0NNRF9CTEtTKSAmIDB4ZmY7CisKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9pb2FmcF9zdGRfaW5xdWlyeTsKKworCWlwcl9kb19yZXEoaXByX2NtZCwgaXByX3Jlc2V0X2lvYV9qb2IsIGlwcl90aW1lb3V0LCBJUFJfSU5URVJOQUxfVElNRU9VVCk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX3Jlc2V0X3RpbWVyX2RvbmUgLSBBZGFwdGVyIHJlc2V0IHRpbWVyIGZ1bmN0aW9uCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBhZGFwdGVyIHJlc2V0IHByb2Nlc3NpbmcKKyAqIGZvciB0aW1pbmcgZXZlbnRzLiBJZiB0aGUgcmVzZXRfY21kIHBvaW50ZXIgaW4gdGhlIElPQQorICogY29uZmlnIHN0cnVjdCBpcyBub3QgdGhpcyBhZGFwdGVyJ3Mgd2UgYXJlIGRvaW5nIG5lc3RlZAorICogcmVzZXRzIGFuZCBmYWlsX2FsbF9vcHMgd2lsbCB0YWtlIGNhcmUgb2YgZnJlZWluZyB0aGUKKyAqIGNvbW1hbmQgYmxvY2suCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9yZXNldF90aW1lcl9kb25lKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCisJaWYgKGlvYV9jZmctPnJlc2V0X2NtZCA9PSBpcHJfY21kKSB7CisJCWxpc3RfZGVsKCZpcHJfY21kLT5xdWV1ZSk7CisJCWlwcl9jbWQtPmRvbmUoaXByX2NtZCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworfQorCisvKioKKyAqIGlwcl9yZXNldF9zdGFydF90aW1lciAtIFN0YXJ0IGEgdGltZXIgZm9yIGFkYXB0ZXIgcmVzZXQgam9iCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKiBAdGltZW91dDoJdGltZW91dCB2YWx1ZQorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gYWRhcHRlciByZXNldCBwcm9jZXNzaW5nCisgKiBmb3IgdGltaW5nIGV2ZW50cy4gSWYgdGhlIHJlc2V0X2NtZCBwb2ludGVyIGluIHRoZSBJT0EKKyAqIGNvbmZpZyBzdHJ1Y3QgaXMgbm90IHRoaXMgYWRhcHRlcidzIHdlIGFyZSBkb2luZyBuZXN0ZWQKKyAqIHJlc2V0cyBhbmQgZmFpbF9hbGxfb3BzIHdpbGwgdGFrZSBjYXJlIG9mIGZyZWVpbmcgdGhlCisgKiBjb21tYW5kIGJsb2NrLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcmVzZXRfc3RhcnRfdGltZXIoc3RydWN0IGlwcl9jbW5kICppcHJfY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaXByX2NtZC0+aW9hX2NmZy0+cGVuZGluZ19xKTsKKwlpcHJfY21kLT5kb25lID0gaXByX3Jlc2V0X2lvYV9qb2I7CisKKwlpcHJfY21kLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlwcl9jbWQ7CisJaXByX2NtZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWlwcl9jbWQtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWlwcl9yZXNldF90aW1lcl9kb25lOworCWFkZF90aW1lcigmaXByX2NtZC0+dGltZXIpOworfQorCisvKioKKyAqIGlwcl9pbml0X2lvYV9tZW0gLSBJbml0aWFsaXplIGlvYV9jZmcgY29udHJvbCBibG9jaworICogQGlvYV9jZmc6CWlvYSBjZmcgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0X2lvYV9tZW0oc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCW1lbXNldChpb2FfY2ZnLT5ob3N0X3JycSwgMCwgc2l6ZW9mKHUzMikgKiBJUFJfTlVNX0NNRF9CTEtTKTsKKworCS8qIEluaXRpYWxpemUgSG9zdCBSUlEgcG9pbnRlcnMgKi8KKwlpb2FfY2ZnLT5ocnJxX3N0YXJ0ID0gaW9hX2NmZy0+aG9zdF9ycnE7CisJaW9hX2NmZy0+aHJycV9lbmQgPSAmaW9hX2NmZy0+aG9zdF9ycnFbSVBSX05VTV9DTURfQkxLUyAtIDFdOworCWlvYV9jZmctPmhycnFfY3VyciA9IGlvYV9jZmctPmhycnFfc3RhcnQ7CisJaW9hX2NmZy0+dG9nZ2xlX2JpdCA9IDE7CisKKwkvKiBaZXJvIG91dCBjb25maWcgdGFibGUgKi8KKwltZW1zZXQoaW9hX2NmZy0+Y2ZnX3RhYmxlLCAwLCBzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGUpKTsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfZW5hYmxlX2lvYSAtIEVuYWJsZSB0aGUgSU9BIGZvbGxvd2luZyBhIHJlc2V0LgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVpbml0aWFsaXplcyBzb21lIGNvbnRyb2wgYmxvY2tzIGFuZAorICogZW5hYmxlcyBkZXN0cnVjdGl2ZSBkaWFnbm9zdGljcyBvbiB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X2VuYWJsZV9pb2Eoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJdm9sYXRpbGUgdTMyIGludF9yZWc7CisKKwlFTlRFUjsKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9pb2FmcF9pbmRlbnRpZnlfaHJycTsKKwlpcHJfaW5pdF9pb2FfbWVtKGlvYV9jZmcpOworCisJaW9hX2NmZy0+YWxsb3dfaW50ZXJydXB0cyA9IDE7CisJaW50X3JlZyA9IHJlYWRsKGlvYV9jZmctPnJlZ3Muc2Vuc2VfaW50ZXJydXB0X3JlZyk7CisKKwlpZiAoaW50X3JlZyAmIElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSKSB7CisJCXdyaXRlbCgoSVBSX1BDSUlfRVJST1JfSU5URVJSVVBUUyB8IElQUl9QQ0lJX0hSUlFfVVBEQVRFRCksCisJCSAgICAgICBpb2FfY2ZnLT5yZWdzLmNscl9pbnRlcnJ1cHRfbWFza19yZWcpOworCQlpbnRfcmVnID0gcmVhZGwoaW9hX2NmZy0+cmVncy5zZW5zZV9pbnRlcnJ1cHRfbWFza19yZWcpOworCQlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKKwl9CisKKwkvKiBFbmFibGUgZGVzdHJ1Y3RpdmUgZGlhZ25vc3RpY3Mgb24gSU9BICovCisJd3JpdGVsKElQUl9ET09SQkVMTCwgaW9hX2NmZy0+cmVncy5zZXRfdXByb2NfaW50ZXJydXB0X3JlZyk7CisKKwl3cml0ZWwoSVBSX1BDSUlfT1BFUl9JTlRFUlJVUFRTLCBpb2FfY2ZnLT5yZWdzLmNscl9pbnRlcnJ1cHRfbWFza19yZWcpOworCWludF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZyk7CisKKwlkZXZfaW5mbygmaW9hX2NmZy0+cGRldi0+ZGV2LCAiSW5pdGlhbGl6aW5nIElPQS5cbiIpOworCisJaXByX2NtZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpcHJfY21kOworCWlwcl9jbWQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKGlwcl90cmFuc29wX3RpbWVvdXQgKiBIWik7CisJaXByX2NtZC0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpaXByX29wZXJfdGltZW91dDsKKwlpcHJfY21kLT5kb25lID0gaXByX3Jlc2V0X2lvYV9qb2I7CisJYWRkX3RpbWVyKCZpcHJfY21kLT50aW1lcik7CisJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5wZW5kaW5nX3EpOworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9yZXNldF93YWl0X2Zvcl9kdW1wIC0gV2FpdCBmb3IgYSBkdW1wIHRvIHRpbWVvdXQuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gYW4gYWRhcHRlciBkdW1wIGhhcyBydW4gb3V0CisgKiBvZiBwcm9jZXNzaW5nIHRpbWUuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfQ09OVElOVUUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X3dhaXRfZm9yX2R1bXAoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IEdFVF9EVU1QKQorCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBBQk9SVF9EVU1QOworCisJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfYWxlcnQ7CisKKwlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKK30KKworLyoqCisgKiBpcHJfdW5pdF9jaGVja19ub19kYXRhIC0gTG9nIGEgdW5pdCBjaGVjay9ubyBkYXRhIGVycm9yIGxvZworICogQGlvYV9jZmc6CQlpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIExvZ3MgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGUgYWRhcHRlciB1bml0IGNoZWNrZWQsIGJ1dCBmb3Igc29tZQorICogcmVhc29uLCB3ZSB3ZXJlIHVuYWJsZSB0byBmZXRjaCB0aGUgdW5pdCBjaGVjayBidWZmZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl91bml0X2NoZWNrX25vX2RhdGEoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCWlvYV9jZmctPmVycm9yc19sb2dnZWQrKzsKKwlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJJT0EgdW5pdCBjaGVjayB3aXRoIG5vIGRhdGFcbiIpOworfQorCisvKioKKyAqIGlwcl9nZXRfdW5pdF9jaGVja19idWZmZXIgLSBHZXQgdGhlIHVuaXQgY2hlY2sgYnVmZmVyIGZyb20gdGhlIElPQQorICogQGlvYV9jZmc6CQlpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIEZldGNoZXMgdGhlIHVuaXQgY2hlY2sgYnVmZmVyIGZyb20gdGhlIGFkYXB0ZXIgYnkgY2xvY2tpbmcgdGhlIGRhdGEKKyAqIHRocm91Z2ggdGhlIG1haWxib3ggcmVnaXN0ZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vdGhpbmcKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9nZXRfdW5pdF9jaGVja19idWZmZXIoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXVuc2lnbmVkIGxvbmcgbWFpbGJveDsKKwlzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2I7CisJc3RydWN0IGlwcl91Y19zZHQgc2R0OworCWludCByYywgbGVuZ3RoOworCisJbWFpbGJveCA9IHJlYWRsKGlvYV9jZmctPmlvYV9tYWlsYm94KTsKKworCWlmICghaXByX3NkdF9pc19mbXQyKG1haWxib3gpKSB7CisJCWlwcl91bml0X2NoZWNrX25vX2RhdGEoaW9hX2NmZyk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoJnNkdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfdWNfc2R0KSk7CisJcmMgPSBpcHJfZ2V0X2xkdW1wX2RhdGFfc2VjdGlvbihpb2FfY2ZnLCBtYWlsYm94LCAoX19iZTMyICopICZzZHQsCisJCQkJCShzaXplb2Yoc3RydWN0IGlwcl91Y19zZHQpKSAvIHNpemVvZihfX2JlMzIpKTsKKworCWlmIChyYyB8fCAoYmUzMl90b19jcHUoc2R0Lmhkci5zdGF0ZSkgIT0gSVBSX0ZNVDJfU0RUX1JFQURZX1RPX1VTRSkgfHwKKwkgICAgIShzZHQuZW50cnlbMF0uZmxhZ3MgJiBJUFJfU0RUX1ZBTElEX0VOVFJZKSkgeworCQlpcHJfdW5pdF9jaGVja19ub19kYXRhKGlvYV9jZmcpOworCQlyZXR1cm47CisJfQorCisJLyogRmluZCBsZW5ndGggb2YgdGhlIGZpcnN0IHNkdCBlbnRyeSAoVUMgYnVmZmVyKSAqLworCWxlbmd0aCA9IChiZTMyX3RvX2NwdShzZHQuZW50cnlbMF0uZW5kX29mZnNldCkgLQorCQkgIGJlMzJfdG9fY3B1KHNkdC5lbnRyeVswXS5iYXJfc3RyX29mZnNldCkpICYgSVBSX0ZNVDJfTUJYX0FERFJfTUFTSzsKKworCWhvc3RyY2IgPSBsaXN0X2VudHJ5KGlvYV9jZmctPmhvc3RyY2JfZnJlZV9xLm5leHQsCisJCQkgICAgIHN0cnVjdCBpcHJfaG9zdHJjYiwgcXVldWUpOworCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7CisJbWVtc2V0KCZob3N0cmNiLT5oY2FtLCAwLCBzaXplb2YoaG9zdHJjYi0+aGNhbSkpOworCisJcmMgPSBpcHJfZ2V0X2xkdW1wX2RhdGFfc2VjdGlvbihpb2FfY2ZnLAorCQkJCQliZTMyX3RvX2NwdShzZHQuZW50cnlbMF0uYmFyX3N0cl9vZmZzZXQpLAorCQkJCQkoX19iZTMyICopJmhvc3RyY2ItPmhjYW0sCisJCQkJCW1pbihsZW5ndGgsIChpbnQpc2l6ZW9mKGhvc3RyY2ItPmhjYW0pKSAvIHNpemVvZihfX2JlMzIpKTsKKworCWlmICghcmMpCisJCWlwcl9oYW5kbGVfbG9nX2RhdGEoaW9hX2NmZywgaG9zdHJjYik7CisJZWxzZQorCQlpcHJfdW5pdF9jaGVja19ub19kYXRhKGlvYV9jZmcpOworCisJbGlzdF9hZGRfdGFpbCgmaG9zdHJjYi0+cXVldWUsICZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSk7Cit9CisKKy8qKgorICogaXByX3Jlc2V0X3Jlc3RvcmVfY2ZnX3NwYWNlIC0gUmVzdG9yZSBQQ0kgY29uZmlnIHNwYWNlLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBzYXZlZCBQQ0kgY29uZmlnIHNwYWNlIG9mCisgKiB0aGUgYWRhcHRlciwgZmFpbHMgYWxsIG91dHN0YW5kaW5nIG9wcyBiYWNrIHRvIHRoZSBjYWxsZXJzLCBhbmQKKyAqIGZldGNoZXMgdGhlIGR1bXAvdW5pdCBjaGVjayBpZiBhcHBsaWNhYmxlIHRvIHRoaXMgcmVzZXQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfQ09OVElOVUUgLyBJUFJfUkNfSk9CX1JFVFVSTgorICoqLworc3RhdGljIGludCBpcHJfcmVzZXRfcmVzdG9yZV9jZmdfc3BhY2Uoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJaW50IHJjOworCisJRU5URVI7CisJcmMgPSBwY2lfcmVzdG9yZV9zdGF0ZShpb2FfY2ZnLT5wZGV2KTsKKworCWlmIChyYyAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJaXByX2NtZC0+aW9hc2EuaW9hc2MgPSBjcHVfdG9fYmUzMihJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUik7CisJCXJldHVybiBJUFJfUkNfSk9CX0NPTlRJTlVFOworCX0KKworCWlmIChpcHJfc2V0X3BjaXhfY21kX3JlZyhpb2FfY2ZnKSkgeworCQlpcHJfY21kLT5pb2FzYS5pb2FzYyA9IGNwdV90b19iZTMyKElQUl9JT0FTQ19QQ0lfQUNDRVNTX0VSUk9SKTsKKwkJcmV0dXJuIElQUl9SQ19KT0JfQ09OVElOVUU7CisJfQorCisJaXByX2ZhaWxfYWxsX29wcyhpb2FfY2ZnKTsKKworCWlmIChpb2FfY2ZnLT5pb2FfdW5pdF9jaGVja2VkKSB7CisJCWlvYV9jZmctPmlvYV91bml0X2NoZWNrZWQgPSAwOworCQlpcHJfZ2V0X3VuaXRfY2hlY2tfYnVmZmVyKGlvYV9jZmcpOworCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9hbGVydDsKKwkJaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKGlwcl9jbWQsIDApOworCQlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47CisJfQorCisJaWYgKGlvYV9jZmctPmluX2lvYV9icmluZ2Rvd24pIHsKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hX2JyaW5nZG93bl9kb25lOworCX0gZWxzZSB7CisJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X2VuYWJsZV9pb2E7CisKKwkJaWYgKEdFVF9EVU1QID09IGlvYV9jZmctPnNkdF9zdGF0ZSkgeworCQkJaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKGlwcl9jbWQsIElQUl9EVU1QX1RJTUVPVVQpOworCQkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfd2FpdF9mb3JfZHVtcDsKKwkJCXNjaGVkdWxlX3dvcmsoJmlvYV9jZmctPndvcmtfcSk7CisJCQlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47CisJCX0KKwl9CisKKwlFTlRFUjsKKwlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfc3RhcnRfYmlzdCAtIFJ1biBCSVNUIG9uIHRoZSBhZGFwdGVyLgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJ1bnMgQklTVCBvbiB0aGUgYWRhcHRlciwgdGhlbiBkZWxheXMgMiBzZWNvbmRzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFIC8gSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X3N0YXJ0X2Jpc3Qoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJaW50IHJjOworCisJRU5URVI7CisJcmMgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoaW9hX2NmZy0+cGRldiwgUENJX0JJU1QsIFBDSV9CSVNUX1NUQVJUKTsKKworCWlmIChyYyAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJaXByX2NtZC0+aW9hc2EuaW9hc2MgPSBjcHVfdG9fYmUzMihJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUik7CisJCXJjID0gSVBSX1JDX0pPQl9DT05USU5VRTsKKwl9IGVsc2UgeworCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9yZXN0b3JlX2NmZ19zcGFjZTsKKwkJaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKGlwcl9jbWQsIElQUl9XQUlUX0ZPUl9CSVNUX1RJTUVPVVQpOworCQlyYyA9IElQUl9SQ19KT0JfUkVUVVJOOworCX0KKworCUxFQVZFOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfYWxsb3dlZCAtIFF1ZXJ5IHdoZXRoZXIgb3Igbm90IElPQSBjYW4gYmUgcmVzZXQKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIGlmIHJlc2V0IG5vdCBhbGxvd2VkIC8gbm9uLXplcm8gaWYgcmVzZXQgaXMgYWxsb3dlZAorICoqLworc3RhdGljIGludCBpcHJfcmVzZXRfYWxsb3dlZChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJdm9sYXRpbGUgdTMyIHRlbXBfcmVnOworCisJdGVtcF9yZWcgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX2ludGVycnVwdF9yZWcpOworCXJldHVybiAoKHRlbXBfcmVnICYgSVBSX1BDSUlfQ1JJVElDQUxfT1BFUkFUSU9OKSA9PSAwKTsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfd2FpdF90b19zdGFydF9iaXN0IC0gV2FpdCBmb3IgcGVybWlzc2lvbiB0byByZXNldCBJT0EuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGFkYXB0ZXIgcGVybWlzc2lvbiB0byBydW4gQklTVCwKKyAqIHRoZW4gcnVucyBCSVNULiBJZiB0aGUgYWRhcHRlciBkb2VzIG5vdCBnaXZlIHBlcm1pc3Npb24gYWZ0ZXIgYQorICogcmVhc29uYWJsZSB0aW1lLCB3ZSB3aWxsIHJlc2V0IHRoZSBhZGFwdGVyIGFueXdheS4gVGhlIGltcGFjdCBvZgorICogcmVzZXR0aW5nIHRoZSBhZGFwdGVyIHdpdGhvdXQgd2FybmluZyB0aGUgYWRhcHRlciBpcyB0aGUgcmlzayBvZgorICogbG9zaW5nIHRoZSBwZXJzaXN0ZW50IGVycm9yIGxvZyBvbiB0aGUgYWRhcHRlci4gSWYgdGhlIGFkYXB0ZXIgaXMKKyAqIHJlc2V0IHdoaWxlIGl0IGlzIHdyaXRpbmcgdG8gdGhlIGZsYXNoIG9uIHRoZSBhZGFwdGVyLCB0aGUgZmxhc2gKKyAqIHNlZ21lbnQgd2lsbCBoYXZlIGJhZCBFQ0MgYW5kIGJlIHplcm9lZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJSVBSX1JDX0pPQl9DT05USU5VRSAvIElQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF93YWl0X3RvX3N0YXJ0X2Jpc3Qoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJaW50IHJjID0gSVBSX1JDX0pPQl9SRVRVUk47CisKKwlpZiAoIWlwcl9yZXNldF9hbGxvd2VkKGlvYV9jZmcpICYmIGlwcl9jbWQtPnUudGltZV9sZWZ0KSB7CisJCWlwcl9jbWQtPnUudGltZV9sZWZ0IC09IElQUl9DSEVDS19GT1JfUkVTRVRfVElNRU9VVDsKKwkJaXByX3Jlc2V0X3N0YXJ0X3RpbWVyKGlwcl9jbWQsIElQUl9DSEVDS19GT1JfUkVTRVRfVElNRU9VVCk7CisJfSBlbHNlIHsKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfc3RhcnRfYmlzdDsKKwkJcmMgPSBJUFJfUkNfSk9CX0NPTlRJTlVFOworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfYWxlcnRfcGFydDIgLSBBbGVydCB0aGUgYWRhcHRlciBvZiBhIHBlbmRpbmcgcmVzZXQKKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBhbGVydHMgdGhlIGFkYXB0ZXIgdGhhdCBpdCB3aWxsIGJlIHJlc2V0LgorICogSWYgbWVtb3J5IHNwYWNlIGlzIG5vdCBjdXJyZW50bHkgZW5hYmxlZCwgcHJvY2VlZCBkaXJlY3RseQorICogdG8gcnVubmluZyBCSVNUIG9uIHRoZSBhZGFwdGVyLiBUaGUgdGltZXIgbXVzdCBhbHdheXMgYmUgc3RhcnRlZAorICogc28gd2UgZ3VhcmFudGVlIHdlIGRvIG5vdCBydW4gQklTVCBmcm9tIGlwcl9pc3IuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfUkVUVVJOCisgKiovCitzdGF0aWMgaW50IGlwcl9yZXNldF9hbGVydChzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwl1MTYgY21kX3JlZzsKKwlpbnQgcmM7CisKKwlFTlRFUjsKKwlyYyA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKGlvYV9jZmctPnBkZXYsIFBDSV9DT01NQU5ELCAmY21kX3JlZyk7CisKKwlpZiAoKHJjID09IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgJiYgKGNtZF9yZWcgJiBQQ0lfQ09NTUFORF9NRU1PUlkpKSB7CisJCWlwcl9tYXNrX2FuZF9jbGVhcl9pbnRlcnJ1cHRzKGlvYV9jZmcsIH4wKTsKKwkJd3JpdGVsKElQUl9VUFJPQ0lfUkVTRVRfQUxFUlQsIGlvYV9jZmctPnJlZ3Muc2V0X3Vwcm9jX2ludGVycnVwdF9yZWcpOworCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF93YWl0X3RvX3N0YXJ0X2Jpc3Q7CisJfSBlbHNlIHsKKwkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfc3RhcnRfYmlzdDsKKwl9CisKKwlpcHJfY21kLT51LnRpbWVfbGVmdCA9IElQUl9XQUlUX0ZPUl9SRVNFVF9USU1FT1VUOworCWlwcl9yZXNldF9zdGFydF90aW1lcihpcHJfY21kLCBJUFJfQ0hFQ0tfRk9SX1JFU0VUX1RJTUVPVVQpOworCisJTEVBVkU7CisJcmV0dXJuIElQUl9SQ19KT0JfUkVUVVJOOworfQorCisvKioKKyAqIGlwcl9yZXNldF91Y29kZV9kb3dubG9hZF9kb25lIC0gTWljcm9jb2RlIGRvd25sb2FkIGNvbXBsZXRpb24KKyAqIEBpcHJfY21kOglpcHIgY29tbWFuZCBzdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB1bm1hcHMgdGhlIG1pY3JvY29kZSBkb3dubG9hZCBidWZmZXIuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCUlQUl9SQ19KT0JfQ09OVElOVUUKKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X3Vjb2RlX2Rvd25sb2FkX2RvbmUoc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisJc3RydWN0IGlwcl9zZ2xpc3QgKnNnbGlzdCA9IGlvYV9jZmctPnVjb2RlX3NnbGlzdDsKKworCXBjaV91bm1hcF9zZyhpb2FfY2ZnLT5wZGV2LCBzZ2xpc3QtPnNjYXR0ZXJsaXN0LAorCQkgICAgIHNnbGlzdC0+bnVtX3NnLCBETUFfVE9fREVWSUNFKTsKKworCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X2FsZXJ0OworCXJldHVybiBJUFJfUkNfSk9CX0NPTlRJTlVFOworfQorCisvKioKKyAqIGlwcl9yZXNldF91Y29kZV9kb3dubG9hZCAtIERvd25sb2FkIG1pY3JvY29kZSB0byB0aGUgYWRhcHRlcgorICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgaXQgdGhlcmUgaXMgbWljcm9jb2RlCisgKiB0byBkb3dubG9hZCB0byB0aGUgYWRhcHRlci4gSWYgdGhlcmUgaXMsIGEgZG93bmxvYWQgaXMgcGVyZm9ybWVkLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFIC8gSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X3Vjb2RlX2Rvd25sb2FkKHN0cnVjdCBpcHJfY21uZCAqaXByX2NtZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOworCXN0cnVjdCBpcHJfc2dsaXN0ICpzZ2xpc3QgPSBpb2FfY2ZnLT51Y29kZV9zZ2xpc3Q7CisKKwlFTlRFUjsKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9hbGVydDsKKworCWlmICghc2dsaXN0KQorCQlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKKworCWlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlID0gY3B1X3RvX2JlMzIoSVBSX0lPQV9SRVNfSEFORExFKTsKKwlpcHJfY21kLT5pb2FyY2IuY21kX3BrdC5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX1NDU0lDREI7CisJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzBdID0gV1JJVEVfQlVGRkVSOworCWlwcl9jbWQtPmlvYXJjYi5jbWRfcGt0LmNkYlsxXSA9IElQUl9XUl9CVUZfRE9XTkxPQURfQU5EX1NBVkU7CisJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzZdID0gKHNnbGlzdC0+YnVmZmVyX2xlbiAmIDB4ZmYwMDAwKSA+PiAxNjsKKwlpcHJfY21kLT5pb2FyY2IuY21kX3BrdC5jZGJbN10gPSAoc2dsaXN0LT5idWZmZXJfbGVuICYgMHgwMGZmMDApID4+IDg7CisJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzhdID0gc2dsaXN0LT5idWZmZXJfbGVuICYgMHgwMDAwZmY7CisKKwlpZiAoaXByX21hcF91Y29kZV9idWZmZXIoaXByX2NtZCwgc2dsaXN0LCBzZ2xpc3QtPmJ1ZmZlcl9sZW4pKSB7CisJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gbWFwIG1pY3JvY29kZSBkb3dubG9hZCBidWZmZXJcbiIpOworCQlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKKwl9CisKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF91Y29kZV9kb3dubG9hZF9kb25lOworCisJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfcmVzZXRfaW9hX2pvYiwgaXByX3RpbWVvdXQsCisJCSAgIElQUl9XUklURV9CVUZGRVJfVElNRU9VVCk7CisKKwlMRUFWRTsKKwlyZXR1cm4gSVBSX1JDX0pPQl9SRVRVUk47Cit9CisKKy8qKgorICogaXByX3Jlc2V0X3NodXRkb3duX2lvYSAtIFNodXRkb3duIHRoZSBhZGFwdGVyCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXNzdWVzIGFuIGFkYXB0ZXIgc2h1dGRvd24gb2YgdGhlCisgKiBzcGVjaWZpZWQgdHlwZSB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgYXMgcGFydCBvZiB0aGUKKyAqIGFkYXB0ZXIgcmVzZXQgam9iLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlJUFJfUkNfSk9CX0NPTlRJTlVFIC8gSVBSX1JDX0pPQl9SRVRVUk4KKyAqKi8KK3N0YXRpYyBpbnQgaXByX3Jlc2V0X3NodXRkb3duX2lvYShzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gaXByX2NtZC0+aW9hX2NmZzsKKwllbnVtIGlwcl9zaHV0ZG93bl90eXBlIHNodXRkb3duX3R5cGUgPSBpcHJfY21kLT51LnNodXRkb3duX3R5cGU7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByYyA9IElQUl9SQ19KT0JfQ09OVElOVUU7CisKKwlFTlRFUjsKKwlpZiAoc2h1dGRvd25fdHlwZSAhPSBJUFJfU0hVVERPV05fTk9ORSAmJiAhaW9hX2NmZy0+aW9hX2lzX2RlYWQpIHsKKwkJaXByX2NtZC0+aW9hcmNiLnJlc19oYW5kbGUgPSBjcHVfdG9fYmUzMihJUFJfSU9BX1JFU19IQU5ETEUpOworCQlpcHJfY21kLT5pb2FyY2IuY21kX3BrdC5yZXF1ZXN0X3R5cGUgPSBJUFJfUlFUWVBFX0lPQUNNRDsKKwkJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzBdID0gSVBSX0lPQV9TSFVURE9XTjsKKwkJaXByX2NtZC0+aW9hcmNiLmNtZF9wa3QuY2RiWzFdID0gc2h1dGRvd25fdHlwZTsKKworCQlpZiAoc2h1dGRvd25fdHlwZSA9PSBJUFJfU0hVVERPV05fQUJCUkVWKQorCQkJdGltZW91dCA9IElQUl9BQkJSRVZfU0hVVERPV05fVElNRU9VVDsKKwkJZWxzZSBpZiAoc2h1dGRvd25fdHlwZSA9PSBJUFJfU0hVVERPV05fUFJFUEFSRV9GT1JfTk9STUFMKQorCQkJdGltZW91dCA9IElQUl9JTlRFUk5BTF9USU1FT1VUOworCQllbHNlCisJCQl0aW1lb3V0ID0gSVBSX1NIVVRET1dOX1RJTUVPVVQ7CisKKwkJaXByX2RvX3JlcShpcHJfY21kLCBpcHJfcmVzZXRfaW9hX2pvYiwgaXByX3RpbWVvdXQsIHRpbWVvdXQpOworCisJCXJjID0gSVBSX1JDX0pPQl9SRVRVUk47CisJCWlwcl9jbWQtPmpvYl9zdGVwID0gaXByX3Jlc2V0X3Vjb2RlX2Rvd25sb2FkOworCX0gZWxzZQorCQlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9hbGVydDsKKworCUxFQVZFOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpcHJfcmVzZXRfaW9hX2pvYiAtIEFkYXB0ZXIgcmVzZXQgam9iCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdGhlIGpvYiByb3V0ZXIgZm9yIHRoZSBhZGFwdGVyIHJlc2V0IGpvYi4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX3Jlc2V0X2lvYV9qb2Ioc3RydWN0IGlwcl9jbW5kICppcHJfY21kKQoreworCXUzMiByYywgaW9hc2M7CisJdW5zaWduZWQgbG9uZyBzY3JhdGNoID0gaXByX2NtZC0+dS5zY3JhdGNoOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CisKKwlkbyB7CisJCWlvYXNjID0gYmUzMl90b19jcHUoaXByX2NtZC0+aW9hc2EuaW9hc2MpOworCisJCWlmIChpb2FfY2ZnLT5yZXNldF9jbWQgIT0gaXByX2NtZCkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSBkb2luZyBuZXN0ZWQgYWRhcHRlciByZXNldHMgYW5kIHRoaXMgaXMKKwkJCSAqIG5vdCB0aGUgY3VycmVudCByZXNldCBqb2IuCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaW9hX2NmZy0+ZnJlZV9xKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChJUFJfSU9BU0NfU0VOU0VfS0VZKGlvYXNjKSkgeworCQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJCSIweCUwMlggZmFpbGVkIHdpdGggSU9BU0M6IDB4JTA4WFxuIiwKKwkJCQlpcHJfY21kLT5pb2FyY2IuY21kX3BrdC5jZGJbMF0sIGlvYXNjKTsKKworCQkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CisJCQlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlvYV9jZmctPmZyZWVfcSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpcHJfcmVpbml0X2lwcl9jbW5kKGlwcl9jbWQpOworCQlpcHJfY21kLT51LnNjcmF0Y2ggPSBzY3JhdGNoOworCQlyYyA9IGlwcl9jbWQtPmpvYl9zdGVwKGlwcl9jbWQpOworCX0gd2hpbGUocmMgPT0gSVBSX1JDX0pPQl9DT05USU5VRSk7Cit9CisKKy8qKgorICogX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQgLSBJbml0aWF0ZSBhbiBhZGFwdGVyIHJlc2V0CisgKiBAaW9hX2NmZzoJCWlvYSBjb25maWcgc3RydWN0CisgKiBAam9iX3N0ZXA6CQlmaXJzdCBqb2Igc3RlcCBvZiByZXNldCBqb2IKKyAqIEBzaHV0ZG93bl90eXBlOglzaHV0ZG93biB0eXBlCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWF0ZSB0aGUgcmVzZXQgb2YgdGhlIGdpdmVuIGFkYXB0ZXIKKyAqIHN0YXJ0aW5nIGF0IHRoZSBzZWxlY3RlZCBqb2Igc3RlcC4KKyAqIElmIHRoZSBjYWxsZXIgbmVlZHMgdG8gd2FpdCBvbiB0aGUgY29tcGxldGlvbiBvZiB0aGUgcmVzZXQsCisgKiB0aGUgY2FsbGVyIG11c3Qgc2xlZXAgb24gdGhlIHJlc2V0X3dhaXRfcS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSAgICBpbnQgKCpqb2Jfc3RlcCkgKHN0cnVjdCBpcHJfY21uZCAqKSwKKwkJCQkgICAgZW51bSBpcHJfc2h1dGRvd25fdHlwZSBzaHV0ZG93bl90eXBlKQoreworCXN0cnVjdCBpcHJfY21uZCAqaXByX2NtZDsKKworCWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCA9IDE7CisJaW9hX2NmZy0+YWxsb3dfY21kcyA9IDA7CisJc2NzaV9ibG9ja19yZXF1ZXN0cyhpb2FfY2ZnLT5ob3N0KTsKKworCWlwcl9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CisJaW9hX2NmZy0+cmVzZXRfY21kID0gaXByX2NtZDsKKwlpcHJfY21kLT5qb2Jfc3RlcCA9IGpvYl9zdGVwOworCWlwcl9jbWQtPnUuc2h1dGRvd25fdHlwZSA9IHNodXRkb3duX3R5cGU7CisKKwlpcHJfcmVzZXRfaW9hX2pvYihpcHJfY21kKTsKK30KKworLyoqCisgKiBpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0IC0gSW5pdGlhdGUgYW4gYWRhcHRlciByZXNldAorICogQGlvYV9jZmc6CQlpb2EgY29uZmlnIHN0cnVjdAorICogQHNodXRkb3duX3R5cGU6CXNodXRkb3duIHR5cGUKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYXRlIHRoZSByZXNldCBvZiB0aGUgZ2l2ZW4gYWRhcHRlci4KKyAqIElmIHRoZSBjYWxsZXIgbmVlZHMgdG8gd2FpdCBvbiB0aGUgY29tcGxldGlvbiBvZiB0aGUgcmVzZXQsCisgKiB0aGUgY2FsbGVyIG11c3Qgc2xlZXAgb24gdGhlIHJlc2V0X3dhaXRfcS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2luaXRpYXRlX2lvYV9yZXNldChzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcsCisJCQkJICAgZW51bSBpcHJfc2h1dGRvd25fdHlwZSBzaHV0ZG93bl90eXBlKQoreworCWlmIChpb2FfY2ZnLT5pb2FfaXNfZGVhZCkKKwkJcmV0dXJuOworCisJaWYgKGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCAmJiBpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gR0VUX0RVTVApCisJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CisKKwlpZiAoaW9hX2NmZy0+cmVzZXRfcmV0cmllcysrID49IElQUl9OVU1fUkVTRVRfUkVMT0FEX1JFVFJJRVMpIHsKKwkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LAorCQkJIklPQSB0YWtlbiBvZmZsaW5lIC0gZXJyb3IgcmVjb3ZlcnkgZmFpbGVkXG4iKTsKKworCQlpb2FfY2ZnLT5yZXNldF9yZXRyaWVzID0gMDsKKwkJaW9hX2NmZy0+aW9hX2lzX2RlYWQgPSAxOworCisJCWlmIChpb2FfY2ZnLT5pbl9pb2FfYnJpbmdkb3duKSB7CisJCQlpb2FfY2ZnLT5yZXNldF9jbWQgPSBOVUxMOworCQkJaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkID0gMDsKKwkJCWlwcl9mYWlsX2FsbF9vcHMoaW9hX2NmZyk7CisJCQl3YWtlX3VwX2FsbCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisJCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoaW9hX2NmZy0+aG9zdCk7CisJCQlzcGluX2xvY2tfaXJxKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jayk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpb2FfY2ZnLT5pbl9pb2FfYnJpbmdkb3duID0gMTsKKwkJCXNodXRkb3duX3R5cGUgPSBJUFJfU0hVVERPV05fTk9ORTsKKwkJfQorCX0KKworCV9pcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIGlwcl9yZXNldF9zaHV0ZG93bl9pb2EsCisJCQkJc2h1dGRvd25fdHlwZSk7Cit9CisKKy8qKgorICogaXByX3Byb2JlX2lvYV9wYXJ0MiAtIEluaXRpYWxpemVzIElPQXMgZm91bmQgaW4gaXByX3Byb2JlX2lvYSguLikKKyAqIEBpb2FfY2ZnOglpb2EgY2ZnIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBzZWNvbmQgcGhhc2Ugb2YgYWRhcHRlciBpbnRpYWxpemF0aW9uCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgaW5pdGlsaXppbmcgdGhlIGFkYXB0ZXIgdG8gdGhlIHBvaW50CisgKiB3aGVyZSBpdCBjYW4gYWNjZXB0IG5ldyBjb21tYW5kcy4KKworICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjZXNzIC8gLUVJTyBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpcHJfcHJvYmVfaW9hX3BhcnQyKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgaG9zdF9sb2NrX2ZsYWdzID0gMDsKKworCUVOVEVSOworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgaG9zdF9sb2NrX2ZsYWdzKTsKKwlkZXZfZGJnKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJpb2FfY2ZnIGFkeDogMHglcFxuIiwgaW9hX2NmZyk7CisJX2lwcl9pbml0aWF0ZV9pb2FfcmVzZXQoaW9hX2NmZywgaXByX3Jlc2V0X2VuYWJsZV9pb2EsIElQUl9TSFVURE9XTl9OT05FKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOworCXdhaXRfZXZlbnQoaW9hX2NmZy0+cmVzZXRfd2FpdF9xLCAhaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGhvc3RfbG9ja19mbGFncyk7CisKKwlpZiAoaW9hX2NmZy0+aW9hX2lzX2RlYWQpIHsKKwkJcmMgPSAtRUlPOworCX0gZWxzZSBpZiAoaXByX2ludmFsaWRfYWRhcHRlcihpb2FfY2ZnKSkgeworCQlpZiAoIWlwcl90ZXN0bW9kZSkKKwkJCXJjID0gLUVJTzsKKworCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsCisJCQkiQWRhcHRlciBub3Qgc3VwcG9ydGVkIGluIHRoaXMgaGFyZHdhcmUgY29uZmlndXJhdGlvbi5cbiIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOworCisJTEVBVkU7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlwcl9mcmVlX2NtZF9ibGtzIC0gRnJlZXMgY29tbWFuZCBibG9ja3MgYWxsb2NhdGVkIGZvciBhbiBhZGFwdGVyCisgKiBAaW9hX2NmZzoJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2ZyZWVfY21kX2Jsa3Moc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElQUl9OVU1fQ01EX0JMS1M7IGkrKykgeworCQlpZiAoaW9hX2NmZy0+aXByX2NtbmRfbGlzdFtpXSkKKwkJCXBjaV9wb29sX2ZyZWUoaW9hX2NmZy0+aXByX2NtZF9wb29sLAorCQkJCSAgICAgIGlvYV9jZmctPmlwcl9jbW5kX2xpc3RbaV0sCisJCQkJICAgICAgaW9hX2NmZy0+aXByX2NtbmRfbGlzdF9kbWFbaV0pOworCisJCWlvYV9jZmctPmlwcl9jbW5kX2xpc3RbaV0gPSBOVUxMOworCX0KKworCWlmIChpb2FfY2ZnLT5pcHJfY21kX3Bvb2wpCisJCXBjaV9wb29sX2Rlc3Ryb3kgKGlvYV9jZmctPmlwcl9jbWRfcG9vbCk7CisKKwlpb2FfY2ZnLT5pcHJfY21kX3Bvb2wgPSBOVUxMOworfQorCisvKioKKyAqIGlwcl9mcmVlX21lbSAtIEZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGFuIGFkYXB0ZXIKKyAqIEBpb2FfY2ZnOglpb2EgY2ZnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub3RoaW5nCisgKiovCitzdGF0aWMgdm9pZCBpcHJfZnJlZV9tZW0oc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCWludCBpOworCisJa2ZyZWUoaW9hX2NmZy0+cmVzX2VudHJpZXMpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9hX2NmZy0+cGRldiwgc2l6ZW9mKHN0cnVjdCBpcHJfbWlzY19jYnMpLAorCQkJICAgIGlvYV9jZmctPnZwZF9jYnMsIGlvYV9jZmctPnZwZF9jYnNfZG1hKTsKKwlpcHJfZnJlZV9jbWRfYmxrcyhpb2FfY2ZnKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYV9jZmctPnBkZXYsIHNpemVvZih1MzIpICogSVBSX05VTV9DTURfQkxLUywKKwkJCSAgICBpb2FfY2ZnLT5ob3N0X3JycSwgaW9hX2NmZy0+aG9zdF9ycnFfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYV9jZmctPnBkZXYsIHNpemVvZihzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZSksCisJCQkgICAgaW9hX2NmZy0+Y2ZnX3RhYmxlLAorCQkJICAgIGlvYV9jZmctPmNmZ190YWJsZV9kbWEpOworCisJZm9yIChpID0gMDsgaSA8IElQUl9OVU1fSENBTVM7IGkrKykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYV9jZmctPnBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXByX2hvc3RyY2IpLAorCQkJCSAgICBpb2FfY2ZnLT5ob3N0cmNiW2ldLAorCQkJCSAgICBpb2FfY2ZnLT5ob3N0cmNiX2RtYVtpXSk7CisJfQorCisJaXByX2ZyZWVfZHVtcChpb2FfY2ZnKTsKKwlrZnJlZShpb2FfY2ZnLT5zYXZlZF9tb2RlX3BhZ2VzKTsKKwlrZnJlZShpb2FfY2ZnLT50cmFjZSk7Cit9CisKKy8qKgorICogaXByX2ZyZWVfYWxsX3Jlc291cmNlcyAtIEZyZWUgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMgZm9yIGFuIGFkYXB0ZXIuCisgKiBAaXByX2NtZDoJaXByIGNvbW1hbmQgc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyBmb3IgdGhlCisgKiBzcGVjaWZpZWQgYWRhcHRlci4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2ZyZWVfYWxsX3Jlc291cmNlcyhzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpb2FfY2ZnLT5wZGV2OworCisJRU5URVI7CisJZnJlZV9pcnEocGRldi0+aXJxLCBpb2FfY2ZnKTsKKwlpb3VubWFwKGlvYV9jZmctPmhkd19kbWFfcmVncyk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlpcHJfZnJlZV9tZW0oaW9hX2NmZyk7CisJc2NzaV9ob3N0X3B1dChpb2FfY2ZnLT5ob3N0KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX2FsbG9jX2NtZF9ibGtzIC0gQWxsb2NhdGUgY29tbWFuZCBibG9ja3MgZm9yIGFuIGFkYXB0ZXIKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBfX2RldmluaXQgaXByX2FsbG9jX2NtZF9ibGtzKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbWQ7CisJc3RydWN0IGlwcl9pb2FyY2IgKmlvYXJjYjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBpOworCisJaW9hX2NmZy0+aXByX2NtZF9wb29sID0gcGNpX3Bvb2xfY3JlYXRlIChJUFJfTkFNRSwgaW9hX2NmZy0+cGRldiwKKwkJCQkJCSBzaXplb2Yoc3RydWN0IGlwcl9jbW5kKSwgOCwgMCk7CisKKwlpZiAoIWlvYV9jZmctPmlwcl9jbWRfcG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBSX05VTV9DTURfQkxLUzsgaSsrKSB7CisJCWlwcl9jbWQgPSBwY2lfcG9vbF9hbGxvYyAoaW9hX2NmZy0+aXByX2NtZF9wb29sLCBTTEFCX0tFUk5FTCwgJmRtYV9hZGRyKTsKKworCQlpZiAoIWlwcl9jbWQpIHsKKwkJCWlwcl9mcmVlX2NtZF9ibGtzKGlvYV9jZmcpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQltZW1zZXQoaXByX2NtZCwgMCwgc2l6ZW9mKCppcHJfY21kKSk7CisJCWlvYV9jZmctPmlwcl9jbW5kX2xpc3RbaV0gPSBpcHJfY21kOworCQlpb2FfY2ZnLT5pcHJfY21uZF9saXN0X2RtYVtpXSA9IGRtYV9hZGRyOworCisJCWlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CisJCWlvYXJjYi0+aW9hcmNiX2hvc3RfcGNpX2FkZHIgPSBjcHVfdG9fYmUzMihkbWFfYWRkcik7CisJCWlvYXJjYi0+aG9zdF9yZXNwb25zZV9oYW5kbGUgPSBjcHVfdG9fYmUzMihpIDw8IDIpOworCQlpb2FyY2ItPndyaXRlX2lvYWRsX2FkZHIgPQorCQkJY3B1X3RvX2JlMzIoZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgaXByX2NtbmQsIGlvYWRsKSk7CisJCWlvYXJjYi0+cmVhZF9pb2FkbF9hZGRyID0gaW9hcmNiLT53cml0ZV9pb2FkbF9hZGRyOworCQlpb2FyY2ItPmlvYXNhX2hvc3RfcGNpX2FkZHIgPQorCQkJY3B1X3RvX2JlMzIoZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgaXByX2NtbmQsIGlvYXNhKSk7CisJCWlvYXJjYi0+aW9hc2FfbGVuID0gY3B1X3RvX2JlMTYoc2l6ZW9mKHN0cnVjdCBpcHJfaW9hc2EpKTsKKwkJaXByX2NtZC0+Y21kX2luZGV4ID0gaTsKKwkJaXByX2NtZC0+aW9hX2NmZyA9IGlvYV9jZmc7CisJCWlwcl9jbWQtPnNlbnNlX2J1ZmZlcl9kbWEgPSBkbWFfYWRkciArCisJCQlvZmZzZXRvZihzdHJ1Y3QgaXByX2NtbmQsIHNlbnNlX2J1ZmZlcik7CisKKwkJbGlzdF9hZGRfdGFpbCgmaXByX2NtZC0+cXVldWUsICZpb2FfY2ZnLT5mcmVlX3EpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9hbGxvY19tZW0gLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFkYXB0ZXIKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkwIG9uIHN1Y2Nlc3MgLyBub24temVybyBmb3IgZXJyb3IKKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlwcl9hbGxvY19tZW0oc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaW9hX2NmZy0+cGRldjsKKwlpbnQgaSwgcmMgPSAtRU5PTUVNOworCisJRU5URVI7CisJaW9hX2NmZy0+cmVzX2VudHJpZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5KSAqCisJCQkJICAgICAgIElQUl9NQVhfUEhZU0lDQUxfREVWUywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWlvYV9jZmctPnJlc19lbnRyaWVzKQorCQlnb3RvIG91dDsKKworCW1lbXNldChpb2FfY2ZnLT5yZXNfZW50cmllcywgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkpICogSVBSX01BWF9QSFlTSUNBTF9ERVZTKTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFJfTUFYX1BIWVNJQ0FMX0RFVlM7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmaW9hX2NmZy0+cmVzX2VudHJpZXNbaV0ucXVldWUsICZpb2FfY2ZnLT5mcmVlX3Jlc19xKTsKKworCWlvYV9jZmctPnZwZF9jYnMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2FfY2ZnLT5wZGV2LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBpcHJfbWlzY19jYnMpLAorCQkJCQkJJmlvYV9jZmctPnZwZF9jYnNfZG1hKTsKKworCWlmICghaW9hX2NmZy0+dnBkX2NicykKKwkJZ290byBvdXRfZnJlZV9yZXNfZW50cmllczsKKworCWlmIChpcHJfYWxsb2NfY21kX2Jsa3MoaW9hX2NmZykpCisJCWdvdG8gb3V0X2ZyZWVfdnBkX2NiczsKKworCWlvYV9jZmctPmhvc3RfcnJxID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9hX2NmZy0+cGRldiwKKwkJCQkJCSBzaXplb2YodTMyKSAqIElQUl9OVU1fQ01EX0JMS1MsCisJCQkJCQkgJmlvYV9jZmctPmhvc3RfcnJxX2RtYSk7CisKKwlpZiAoIWlvYV9jZmctPmhvc3RfcnJxKQorCQlnb3RvIG91dF9pcHJfZnJlZV9jbWRfYmxvY2tzOworCisJaW9hX2NmZy0+Y2ZnX3RhYmxlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9hX2NmZy0+cGRldiwKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlKSwKKwkJCQkJCSAgJmlvYV9jZmctPmNmZ190YWJsZV9kbWEpOworCisJaWYgKCFpb2FfY2ZnLT5jZmdfdGFibGUpCisJCWdvdG8gb3V0X2ZyZWVfaG9zdF9ycnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBSX05VTV9IQ0FNUzsgaSsrKSB7CisJCWlvYV9jZmctPmhvc3RyY2JbaV0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2FfY2ZnLT5wZGV2LAorCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXByX2hvc3RyY2IpLAorCQkJCQkJCSAgICZpb2FfY2ZnLT5ob3N0cmNiX2RtYVtpXSk7CisKKwkJaWYgKCFpb2FfY2ZnLT5ob3N0cmNiW2ldKQorCQkJZ290byBvdXRfZnJlZV9ob3N0cmNiX2RtYTsKKworCQlpb2FfY2ZnLT5ob3N0cmNiW2ldLT5ob3N0cmNiX2RtYSA9CisJCQlpb2FfY2ZnLT5ob3N0cmNiX2RtYVtpXSArIG9mZnNldG9mKHN0cnVjdCBpcHJfaG9zdHJjYiwgaGNhbSk7CisJCWxpc3RfYWRkX3RhaWwoJmlvYV9jZmctPmhvc3RyY2JbaV0tPnF1ZXVlLCAmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EpOworCX0KKworCWlvYV9jZmctPnRyYWNlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcl90cmFjZV9lbnRyeSkgKgorCQkJCSBJUFJfTlVNX1RSQUNFX0VOVFJJRVMsIEdGUF9LRVJORUwpOworCisJaWYgKCFpb2FfY2ZnLT50cmFjZSkKKwkJZ290byBvdXRfZnJlZV9ob3N0cmNiX2RtYTsKKworCW1lbXNldChpb2FfY2ZnLT50cmFjZSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcHJfdHJhY2VfZW50cnkpICogSVBSX05VTV9UUkFDRV9FTlRSSUVTKTsKKworCXJjID0gMDsKK291dDoKKwlMRUFWRTsKKwlyZXR1cm4gcmM7CisKK291dF9mcmVlX2hvc3RyY2JfZG1hOgorCXdoaWxlIChpLS0gPiAwKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBpcHJfaG9zdHJjYiksCisJCQkJICAgIGlvYV9jZmctPmhvc3RyY2JbaV0sCisJCQkJICAgIGlvYV9jZmctPmhvc3RyY2JfZG1hW2ldKTsKKwl9CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGUpLAorCQkJICAgIGlvYV9jZmctPmNmZ190YWJsZSwgaW9hX2NmZy0+Y2ZnX3RhYmxlX2RtYSk7CitvdXRfZnJlZV9ob3N0X3JycToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpICogSVBSX05VTV9DTURfQkxLUywKKwkJCSAgICBpb2FfY2ZnLT5ob3N0X3JycSwgaW9hX2NmZy0+aG9zdF9ycnFfZG1hKTsKK291dF9pcHJfZnJlZV9jbWRfYmxvY2tzOgorCWlwcl9mcmVlX2NtZF9ibGtzKGlvYV9jZmcpOworb3V0X2ZyZWVfdnBkX2NiczoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgaXByX21pc2NfY2JzKSwKKwkJCSAgICBpb2FfY2ZnLT52cGRfY2JzLCBpb2FfY2ZnLT52cGRfY2JzX2RtYSk7CitvdXRfZnJlZV9yZXNfZW50cmllczoKKwlrZnJlZShpb2FfY2ZnLT5yZXNfZW50cmllcyk7CisJZ290byBvdXQ7Cit9CisKKy8qKgorICogaXByX2luaXRpYWxpemVfYnVzX2F0dHIgLSBJbml0aWFsaXplIFNDU0kgYnVzIGF0dHJpYnV0ZXMgdG8gZGVmYXVsdCB2YWx1ZXMKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaXByX2luaXRpYWxpemVfYnVzX2F0dHIoc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElQUl9NQVhfTlVNX0JVU0VTOyBpKyspIHsKKwkJaW9hX2NmZy0+YnVzX2F0dHJbaV0uYnVzID0gaTsKKwkJaW9hX2NmZy0+YnVzX2F0dHJbaV0ucWFzX2VuYWJsZWQgPSAwOworCQlpb2FfY2ZnLT5idXNfYXR0cltpXS5idXNfd2lkdGggPSBJUFJfREVGQVVMVF9CVVNfV0lEVEg7CisJCWlmIChpcHJfbWF4X3NwZWVkIDwgQVJSQVlfU0laRShpcHJfbWF4X2J1c19zcGVlZHMpKQorCQkJaW9hX2NmZy0+YnVzX2F0dHJbaV0ubWF4X3hmZXJfcmF0ZSA9IGlwcl9tYXhfYnVzX3NwZWVkc1tpcHJfbWF4X3NwZWVkXTsKKwkJZWxzZQorCQkJaW9hX2NmZy0+YnVzX2F0dHJbaV0ubWF4X3hmZXJfcmF0ZSA9IElQUl9VMTYwX1NDU0lfUkFURTsKKwl9Cit9CisKKy8qKgorICogaXByX2luaXRfaW9hX2NmZyAtIEluaXRpYWxpemUgSU9BIGNvbmZpZyBzdHJ1Y3QKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICogQGhvc3Q6CQlzY3NpIGhvc3Qgc3RydWN0CisgKiBAcGRldjoJCVBDSSBkZXYgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpcHJfaW5pdF9pb2FfY2ZnKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgICAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGlwcl9pbnRlcnJ1cHRfb2Zmc2V0cyAqcDsKKwlzdHJ1Y3QgaXByX2ludGVycnVwdHMgKnQ7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJaW9hX2NmZy0+aG9zdCA9IGhvc3Q7CisJaW9hX2NmZy0+cGRldiA9IHBkZXY7CisJaW9hX2NmZy0+bG9nX2xldmVsID0gaXByX2xvZ19sZXZlbDsKKwlzcHJpbnRmKGlvYV9jZmctPmV5ZV9jYXRjaGVyLCBJUFJfRVlFQ0FUQ0hFUik7CisJc3ByaW50Zihpb2FfY2ZnLT50cmFjZV9zdGFydCwgSVBSX1RSQUNFX1NUQVJUX0xBQkVMKTsKKwlzcHJpbnRmKGlvYV9jZmctPmlwcl9mcmVlX2xhYmVsLCBJUFJfRlJFRVFfTEFCRUwpOworCXNwcmludGYoaW9hX2NmZy0+aXByX3BlbmRpbmdfbGFiZWwsIElQUl9QRU5EUV9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5jZmdfdGFibGVfc3RhcnQsIElQUl9DRkdfVEJMX1NUQVJUKTsKKwlzcHJpbnRmKGlvYV9jZmctPnJlc291cmNlX3RhYmxlX2xhYmVsLCBJUFJfUkVTX1RBQkxFX0xBQkVMKTsKKwlzcHJpbnRmKGlvYV9jZmctPmlwcl9oY2FtX2xhYmVsLCBJUFJfSENBTV9MQUJFTCk7CisJc3ByaW50Zihpb2FfY2ZnLT5pcHJfY21kX2xhYmVsLCBJUFJfQ01EX0xBQkVMKTsKKworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5mcmVlX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5wZW5kaW5nX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX2ZyZWVfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfcGVuZGluZ19xKTsKKwlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPnVzZWRfcmVzX3EpOworCUlOSVRfV09SSygmaW9hX2NmZy0+d29ya19xLCBpcHJfd29ya2VyX3RocmVhZCwgaW9hX2NmZyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW9hX2NmZy0+cmVzZXRfd2FpdF9xKTsKKwlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBJTkFDVElWRTsKKworCWlwcl9pbml0aWFsaXplX2J1c19hdHRyKGlvYV9jZmcpOworCisJaG9zdC0+bWF4X2lkID0gSVBSX01BWF9OVU1fVEFSR0VUU19QRVJfQlVTOworCWhvc3QtPm1heF9sdW4gPSBJUFJfTUFYX05VTV9MVU5TX1BFUl9UQVJHRVQ7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSBJUFJfTUFYX0JVU19UT19TQ0FOOworCWhvc3QtPnVuaXF1ZV9pZCA9IGhvc3QtPmhvc3Rfbm87CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBJUFJfTUFYX0NEQl9MRU47CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGlvYV9jZmcpOworCisJcCA9ICZpb2FfY2ZnLT5jaGlwX2NmZy0+cmVnczsKKwl0ID0gJmlvYV9jZmctPnJlZ3M7CisJYmFzZSA9IGlvYV9jZmctPmhkd19kbWFfcmVnczsKKworCXQtPnNldF9pbnRlcnJ1cHRfbWFza19yZWcgPSBiYXNlICsgcC0+c2V0X2ludGVycnVwdF9tYXNrX3JlZzsKKwl0LT5jbHJfaW50ZXJydXB0X21hc2tfcmVnID0gYmFzZSArIHAtPmNscl9pbnRlcnJ1cHRfbWFza19yZWc7CisJdC0+c2Vuc2VfaW50ZXJydXB0X21hc2tfcmVnID0gYmFzZSArIHAtPnNlbnNlX2ludGVycnVwdF9tYXNrX3JlZzsKKwl0LT5jbHJfaW50ZXJydXB0X3JlZyA9IGJhc2UgKyBwLT5jbHJfaW50ZXJydXB0X3JlZzsKKwl0LT5zZW5zZV9pbnRlcnJ1cHRfcmVnID0gYmFzZSArIHAtPnNlbnNlX2ludGVycnVwdF9yZWc7CisJdC0+aW9hcnJpbl9yZWcgPSBiYXNlICsgcC0+aW9hcnJpbl9yZWc7CisJdC0+c2Vuc2VfdXByb2NfaW50ZXJydXB0X3JlZyA9IGJhc2UgKyBwLT5zZW5zZV91cHJvY19pbnRlcnJ1cHRfcmVnOworCXQtPnNldF91cHJvY19pbnRlcnJ1cHRfcmVnID0gYmFzZSArIHAtPnNldF91cHJvY19pbnRlcnJ1cHRfcmVnOworCXQtPmNscl91cHJvY19pbnRlcnJ1cHRfcmVnID0gYmFzZSArIHAtPmNscl91cHJvY19pbnRlcnJ1cHRfcmVnOworfQorCisvKioKKyAqIGlwcl9nZXRfY2hpcF9jZmcgLSBGaW5kIGFkYXB0ZXIgY2hpcCBjb25maWd1cmF0aW9uCisgKiBAZGV2X2lkOgkJUENJIGRldmljZSBpZCBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJcHRyIHRvIGNoaXAgY29uZmlnIG9uIHN1Y2Nlc3MgLyBOVUxMIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXByX2NoaXBfY2ZnX3QgKiBfX2RldmluaXQKK2lwcl9nZXRfY2hpcF9jZmcoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChkZXZfaWQtPmRyaXZlcl9kYXRhKQorCQlyZXR1cm4gKGNvbnN0IHN0cnVjdCBpcHJfY2hpcF9jZmdfdCAqKWRldl9pZC0+ZHJpdmVyX2RhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcHJfY2hpcCk7IGkrKykKKwkJaWYgKGlwcl9jaGlwW2ldLnZlbmRvciA9PSBkZXZfaWQtPnZlbmRvciAmJgorCQkgICAgaXByX2NoaXBbaV0uZGV2aWNlID09IGRldl9pZC0+ZGV2aWNlKQorCQkJcmV0dXJuIGlwcl9jaGlwW2ldLmNmZzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpcHJfcHJvYmVfaW9hIC0gQWxsb2NhdGVzIG1lbW9yeSBhbmQgZG9lcyBmaXJzdCBzdGFnZSBvZiBpbml0aWFsaXphdGlvbgorICogQHBkZXY6CQlQQ0kgZGV2aWNlIHN0cnVjdAorICogQGRldl9pZDoJCVBDSSBkZXZpY2UgaWQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlwcl9wcm9iZV9pb2Eoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmc7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl1bnNpZ25lZCBsb25nIGlwcl9yZWdzX3BjaTsKKwl2b2lkIF9faW9tZW0gKmlwcl9yZWdzOworCXUzMiByYyA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKworCUVOVEVSOworCisJaWYgKChyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZW5hYmxlIGFkYXB0ZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRm91bmQgSU9BIHdpdGggSVJROiAlZFxuIiwgcGRldi0+aXJxKTsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCppb2FfY2ZnKSk7CisKKwlpZiAoIWhvc3QpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FsbCB0byBzY3NpX2hvc3RfYWxsb2MgZmFpbGVkIVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwlpb2FfY2ZnID0gKHN0cnVjdCBpcHJfaW9hX2NmZyAqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChpb2FfY2ZnLCAwLCBzaXplb2Yoc3RydWN0IGlwcl9pb2FfY2ZnKSk7CisKKwlpb2FfY2ZnLT5jaGlwX2NmZyA9IGlwcl9nZXRfY2hpcF9jZmcoZGV2X2lkKTsKKworCWlmICghaW9hX2NmZy0+Y2hpcF9jZmcpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBhZGFwdGVyIGNoaXBzZXQgMHglMDRYIDB4JTA0WFxuIiwKKwkJCWRldl9pZC0+dmVuZG9yLCBkZXZfaWQtPmRldmljZSk7CisJCWdvdG8gb3V0X3Njc2lfaG9zdF9wdXQ7CisJfQorCisJaXByX3JlZ3NfcGNpID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIElQUl9OQU1FKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJDb3VsZG4ndCByZWdpc3RlciBtZW1vcnkgcmFuZ2Ugb2YgcmVnaXN0ZXJzXG4iKTsKKwkJZ290byBvdXRfc2NzaV9ob3N0X3B1dDsKKwl9CisKKwlpcHJfcmVncyA9IGlvcmVtYXAoaXByX3JlZ3NfcGNpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKworCWlmICghaXByX3JlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNvdWxkbid0IG1hcCBtZW1vcnkgcmFuZ2Ugb2YgcmVnaXN0ZXJzXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJaW9hX2NmZy0+aGR3X2RtYV9yZWdzID0gaXByX3JlZ3M7CisJaW9hX2NmZy0+aGR3X2RtYV9yZWdzX3BjaSA9IGlwcl9yZWdzX3BjaTsKKwlpb2FfY2ZnLT5pb2FfbWFpbGJveCA9IGlvYV9jZmctPmNoaXBfY2ZnLT5tYWlsYm94ICsgaXByX3JlZ3M7CisKKwlpcHJfaW5pdF9pb2FfY2ZnKGlvYV9jZmcsIGhvc3QsIHBkZXYpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQQ0kgRE1BIG1hc2tcbiIpOworCQlnb3RvIGNsZWFudXBfbm9tZW07CisJfQorCisJcmMgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwKKwkJCQkgICBpb2FfY2ZnLT5jaGlwX2NmZy0+Y2FjaGVfbGluZV9zaXplKTsKKworCWlmIChyYyAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiV3JpdGUgb2YgY2FjaGUgbGluZSBzaXplIGZhaWxlZFxuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBjbGVhbnVwX25vbWVtOworCX0KKworCS8qIFNhdmUgYXdheSBQQ0kgY29uZmlnIHNwYWNlIGZvciB1c2UgZm9sbG93aW5nIElPQSByZXNldCAqLworCXJjID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSSBjb25maWcgc3BhY2VcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gY2xlYW51cF9ub21lbTsKKwl9CisKKwlpZiAoKHJjID0gaXByX3NhdmVfcGNpeF9jbWRfcmVnKGlvYV9jZmcpKSkKKwkJZ290byBjbGVhbnVwX25vbWVtOworCisJaWYgKChyYyA9IGlwcl9zZXRfcGNpeF9jbWRfcmVnKGlvYV9jZmcpKSkKKwkJZ290byBjbGVhbnVwX25vbWVtOworCisJcmMgPSBpcHJfYWxsb2NfbWVtKGlvYV9jZmcpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNvdWxkbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGRldmljZSBkcml2ZXIhXG4iKTsKKwkJZ290byBjbGVhbnVwX25vbWVtOworCX0KKworCWlwcl9tYXNrX2FuZF9jbGVhcl9pbnRlcnJ1cHRzKGlvYV9jZmcsIH5JUFJfUENJSV9JT0FfVFJBTlNfVE9fT1BFUik7CisJcmMgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGlwcl9pc3IsIFNBX1NISVJRLCBJUFJfTkFNRSwgaW9hX2NmZyk7CisKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVnaXN0ZXIgSVJRICVkISByYz0lZFxuIiwKKwkJCXBkZXYtPmlycSwgcmMpOworCQlnb3RvIGNsZWFudXBfbm9sb2c7CisJfQorCisJc3Bpbl9sb2NrKCZpcHJfZHJpdmVyX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmlvYV9jZmctPnF1ZXVlLCAmaXByX2lvYV9oZWFkKTsKKwlzcGluX3VubG9jaygmaXByX2RyaXZlcl9sb2NrKTsKKworCUxFQVZFOworb3V0OgorCXJldHVybiByYzsKKworY2xlYW51cF9ub2xvZzoKKwlpcHJfZnJlZV9tZW0oaW9hX2NmZyk7CitjbGVhbnVwX25vbWVtOgorCWlvdW5tYXAoaXByX3JlZ3MpOworb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X3Njc2lfaG9zdF9wdXQ6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKK291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlnb3RvIG91dDsKK30KKworLyoqCisgKiBpcHJfc2Nhbl92c2V0cyAtIFNjYW5zIGZvciBWU0VUIGRldmljZXMKKyAqIEBpb2FfY2ZnOglpb2EgY29uZmlnIHN0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOiBTaW5jZSB0aGUgVlNFVCByZXNvdXJjZXMgZG8gbm90IGZvbGxvdyBTQU0gaW4gdGhhdCB3ZSBjYW4gaGF2ZQorICogc3BhcnNlIExVTnMgd2l0aCBubyBMVU4gMCwgd2UgaGF2ZSB0byBzY2FuIGZvciB0aGVzZSBvdXJzZWx2ZXMuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9zY2FuX3ZzZXRzKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZykKK3sKKwlpbnQgdGFyZ2V0LCBsdW47CisKKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IElQUl9NQVhfTlVNX1RBUkdFVFNfUEVSX0JVUzsgdGFyZ2V0KyspCisJCWZvciAobHVuID0gMDsgbHVuIDwgSVBSX01BWF9OVU1fVlNFVF9MVU5TX1BFUl9UQVJHRVQ7IGx1bisrICkKKwkJCXNjc2lfYWRkX2RldmljZShpb2FfY2ZnLT5ob3N0LCBJUFJfVlNFVF9CVVMsIHRhcmdldCwgbHVuKTsKK30KKworLyoqCisgKiBpcHJfaW5pdGlhdGVfaW9hX2JyaW5nZG93biAtIEJyaW5nIGRvd24gYW4gYWRhcHRlcgorICogQGlvYV9jZmc6CQlpb2EgY29uZmlnIHN0cnVjdAorICogQHNodXRkb3duX3R5cGU6CXNodXRkb3duIHR5cGUKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYXRlIGJyaW5naW5nIGRvd24gdGhlIGFkYXB0ZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIGlzc3VpbmcgYW4gSU9BIHNodXRkb3duIHRvIHRoZSBhZGFwdGVyCisgKiB0byBmbHVzaCB0aGUgY2FjaGUsIGFuZCBydW5uaW5nIEJJU1QuCisgKiBJZiB0aGUgY2FsbGVyIG5lZWRzIHRvIHdhaXQgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIHJlc2V0LAorICogdGhlIGNhbGxlciBtdXN0IHNsZWVwIG9uIHRoZSByZXNldF93YWl0X3EuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9pbml0aWF0ZV9pb2FfYnJpbmdkb3duKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKKwkJCQkgICAgICAgZW51bSBpcHJfc2h1dGRvd25fdHlwZSBzaHV0ZG93bl90eXBlKQoreworCUVOVEVSOworCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gV0FJVF9GT1JfRFVNUCkKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gQUJPUlRfRFVNUDsKKwlpb2FfY2ZnLT5yZXNldF9yZXRyaWVzID0gMDsKKwlpb2FfY2ZnLT5pbl9pb2FfYnJpbmdkb3duID0gMTsKKwlpcHJfaW5pdGlhdGVfaW9hX3Jlc2V0KGlvYV9jZmcsIHNodXRkb3duX3R5cGUpOworCUxFQVZFOworfQorCisvKioKKyAqIF9faXByX3JlbW92ZSAtIFJlbW92ZSBhIHNpbmdsZSBhZGFwdGVyCisgKiBAcGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBBZGFwdGVyIGhvdCBwbHVnIHJlbW92ZSBlbnRyeSBwb2ludC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgX19pcHJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaG9zdF9sb2NrX2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGhvc3RfbG9ja19mbGFncyk7CisJaXByX2luaXRpYXRlX2lvYV9icmluZ2Rvd24oaW9hX2NmZywgSVBSX1NIVVRET1dOX05PUk1BTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgaG9zdF9sb2NrX2ZsYWdzKTsKKwl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBob3N0X2xvY2tfZmxhZ3MpOworCisJc3Bpbl9sb2NrKCZpcHJfZHJpdmVyX2xvY2spOworCWxpc3RfZGVsKCZpb2FfY2ZnLT5xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmlwcl9kcml2ZXJfbG9jayk7CisKKwlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IEFCT1JUX0RVTVApCisJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IFdBSVRfRk9SX0RVTVA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGhvc3RfbG9ja19mbGFncyk7CisKKwlpcHJfZnJlZV9hbGxfcmVzb3VyY2VzKGlvYV9jZmcpOworCisJTEVBVkU7Cit9CisKKy8qKgorICogaXByX3JlbW92ZSAtIElPQSBob3QgcGx1ZyByZW1vdmUgZW50cnkgcG9pbnQKKyAqIEBwZGV2OglwY2kgZGV2aWNlIHN0cnVjdAorICoKKyAqIEFkYXB0ZXIgaG90IHBsdWcgcmVtb3ZlIGVudHJ5IHBvaW50LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAlub25lCisgKiovCitzdGF0aWMgdm9pZCBpcHJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCUVOVEVSOworCisJaW9hX2NmZy0+YWxsb3dfY21kcyA9IDA7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlpcHJfcmVtb3ZlX3RyYWNlX2ZpbGUoJmlvYV9jZmctPmhvc3QtPnNob3N0X2NsYXNzZGV2LmtvYmosCisJCQkgICAgICAmaXByX3RyYWNlX2F0dHIpOworCWlwcl9yZW1vdmVfZHVtcF9maWxlKCZpb2FfY2ZnLT5ob3N0LT5zaG9zdF9jbGFzc2Rldi5rb2JqLAorCQkJICAgICAmaXByX2R1bXBfYXR0cik7CisJc2NzaV9yZW1vdmVfaG9zdChpb2FfY2ZnLT5ob3N0KTsKKworCV9faXByX3JlbW92ZShwZGV2KTsKKworCUxFQVZFOworfQorCisvKioKKyAqIGlwcl9wcm9iZSAtIEFkYXB0ZXIgaG90IHBsdWcgYWRkIGVudHJ5IHBvaW50CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTAgb24gc3VjY2VzcyAvIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlwcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKKwlpbnQgcmM7CisKKwlyYyA9IGlwcl9wcm9iZV9pb2EocGRldiwgZGV2X2lkKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaW9hX2NmZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlyYyA9IGlwcl9wcm9iZV9pb2FfcGFydDIoaW9hX2NmZyk7CisKKwlpZiAocmMpIHsKKwkJX19pcHJfcmVtb3ZlKHBkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBzY3NpX2FkZF9ob3N0KGlvYV9jZmctPmhvc3QsICZwZGV2LT5kZXYpOworCisJaWYgKHJjKSB7CisJCV9faXByX3JlbW92ZShwZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gaXByX2NyZWF0ZV90cmFjZV9maWxlKCZpb2FfY2ZnLT5ob3N0LT5zaG9zdF9jbGFzc2Rldi5rb2JqLAorCQkJCSAgICZpcHJfdHJhY2VfYXR0cik7CisKKwlpZiAocmMpIHsKKwkJc2NzaV9yZW1vdmVfaG9zdChpb2FfY2ZnLT5ob3N0KTsKKwkJX19pcHJfcmVtb3ZlKHBkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBpcHJfY3JlYXRlX2R1bXBfZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfY2xhc3NkZXYua29iaiwKKwkJCQkgICAmaXByX2R1bXBfYXR0cik7CisKKwlpZiAocmMpIHsKKwkJaXByX3JlbW92ZV90cmFjZV9maWxlKCZpb2FfY2ZnLT5ob3N0LT5zaG9zdF9jbGFzc2Rldi5rb2JqLAorCQkJCSAgICAgICZpcHJfdHJhY2VfYXR0cik7CisJCXNjc2lfcmVtb3ZlX2hvc3QoaW9hX2NmZy0+aG9zdCk7CisJCV9faXByX3JlbW92ZShwZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNjc2lfc2Nhbl9ob3N0KGlvYV9jZmctPmhvc3QpOworCWlwcl9zY2FuX3ZzZXRzKGlvYV9jZmcpOworCXNjc2lfYWRkX2RldmljZShpb2FfY2ZnLT5ob3N0LCBJUFJfSU9BX0JVUywgSVBSX0lPQV9UQVJHRVQsIElQUl9JT0FfTFVOKTsKKwlpb2FfY2ZnLT5hbGxvd19tbF9hZGRfZGVsID0gMTsKKwlzY2hlZHVsZV93b3JrKCZpb2FfY2ZnLT53b3JrX3EpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9zaHV0ZG93biAtIFNodXRkb3duIGhhbmRsZXIuCisgKiBAZGV2OglkZXZpY2Ugc3RydWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHVwb24gc3lzdGVtIHNodXRkb3duL3JlYm9vdC4gSXQgd2lsbCBpc3N1ZQorICogYW4gYWRhcHRlciBzaHV0ZG93biB0byB0aGUgYWRhcHRlciB0byBmbHVzaCB0aGUgd3JpdGUgY2FjaGUuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJaXByX2luaXRpYXRlX2lvYV9icmluZ2Rvd24oaW9hX2NmZywgSVBSX1NIVVRET1dOX05PUk1BTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCXdhaXRfZXZlbnQoaW9hX2NmZy0+cmVzZXRfd2FpdF9xLCAhaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlwcl9wY2lfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9NWUxFWCwgUENJX0RFVklDRV9JRF9JQk1fR0VNU1RPTkUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTcwMiwKKwkJMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfTVlMRVgsIFBDSV9ERVZJQ0VfSURfSUJNX0dFTVNUT05FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MDMsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfTVlMRVgsIFBDSV9ERVZJQ0VfSURfSUJNX0dFTVNUT05FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3M0QsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfTVlMRVgsIFBDSV9ERVZJQ0VfSURfSUJNX0dFTVNUT05FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3M0UsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DSVRSSU5FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MUIsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DSVRSSU5FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MkUsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DSVRSSU5FLAorCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MUEsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9TTklQRSwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF8yNzgwLAorCQkwLCAwLCAoa2VybmVsX3Vsb25nX3QpJmlwcl9jaGlwX2NmZ1sxXSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9TQ0FNUCwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzFFLAorCQkwLCAwLCAoa2VybmVsX3Vsb25nX3QpJmlwcl9jaGlwX2NmZ1sxXSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpcHJfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlwcl9kcml2ZXIgPSB7CisJLm5hbWUgPSBJUFJfTkFNRSwKKwkuaWRfdGFibGUgPSBpcHJfcGNpX3RhYmxlLAorCS5wcm9iZSA9IGlwcl9wcm9iZSwKKwkucmVtb3ZlID0gaXByX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkuc2h1dGRvd24gPSBpcHJfc2h1dGRvd24sCisJfSwKK307CisKKy8qKgorICogaXByX2luaXQgLSBNb2R1bGUgZW50cnkgcG9pbnQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBzdWNjZXNzIC8gbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBfX2luaXQgaXByX2luaXQodm9pZCkKK3sKKwlpcHJfaW5mbygiSUJNIFBvd2VyIFJBSUQgU0NTSSBEZXZpY2UgRHJpdmVyIHZlcnNpb246ICVzICVzXG4iLAorCQkgSVBSX0RSSVZFUl9WRVJTSU9OLCBJUFJfRFJJVkVSX0RBVEUpOworCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaXByX2RyaXZlcik7Cit9CisKKy8qKgorICogaXByX2V4aXQgLSBNb2R1bGUgdW5sb2FkCisgKgorICogTW9kdWxlIHVubG9hZCBlbnRyeSBwb2ludC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgX19leGl0IGlwcl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcHJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXByX2luaXQpOworbW9kdWxlX2V4aXQoaXByX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5oIGIvZHJpdmVycy9zY3NpL2lwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NmY0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXByLmgKQEAgLTAsMCArMSwxMjYxIEBACisvKgorICogaXByLmggLS0gZHJpdmVyIGZvciBJQk0gUG93ZXIgTGludXggUkFJRCBhZGFwdGVycworICoKKyAqIFdyaXR0ZW4gQnk6IEJyaWFuIEtpbmcgPGJya2luZ0B1cy5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiAtIFJlbW92ZWQgc2V2ZXJhbCBjYXJlbGVzcyB1MzIvZG1hX2FkZHJfdCBlcnJvcnMKKyAqCQkJCXRoYXQgYnJva2UgNjRiaXQgcGxhdGZvcm1zLgorICovCisKKyNpZm5kZWYgX0lQUl9ICisjZGVmaW5lIF9JUFJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorCisvKgorICogTGl0ZXJhbHMKKyAqLworI2RlZmluZSBJUFJfRFJJVkVSX1ZFUlNJT04gIjIuMC4xMyIKKyNkZWZpbmUgSVBSX0RSSVZFUl9EQVRFICIoRmVicnVhcnkgMjEsIDIwMDUpIgorCisvKgorICogSVBSX0RCR19UUkFDRTogU2V0dGluZyB0aGlzIHRvIDEgd2lsbCB0dXJuIG9uIHNvbWUgZ2VuZXJhbCBmdW5jdGlvbiB0cmFjaW5nCisgKgkJCXJlc3VsdGluZyBpbiBhIGJ1bmNoIG9mIGV4dHJhIGRlYnVnZ2luZyBwcmludGtzIHRvIHRoZSBjb25zb2xlCisgKgorICogSVBSX0RFQlVHOglTZXR0aW5nIHRoaXMgdG8gMSB3aWxsIHR1cm4gb24gc29tZSBlcnJvciBwYXRoIHRyYWNpbmcuCisgKgkJCUVuYWJsZXMgdGhlIGlwcl90cmFjZSBtYWNyby4KKyAqLworI2lmZGVmIElQUl9ERUJVR19BTEwKKyNkZWZpbmUgSVBSX0RFQlVHCQkJCTEKKyNkZWZpbmUgSVBSX0RCR19UUkFDRQkJCTEKKyNlbHNlCisjZGVmaW5lIElQUl9ERUJVRwkJCQkwCisjZGVmaW5lIElQUl9EQkdfVFJBQ0UJCQkwCisjZW5kaWYKKworLyoKKyAqIElQUl9NQVhfQ01EX1BFUl9MVU46IFRoaXMgZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKKyAqCW9wcyBwZXIgZGV2aWNlIGZvciBkZXZpY2VzIG5vdCBydW5uaW5nIHRhZ2dlZCBjb21tYW5kIHF1ZXVpbmcuCisgKglUaGlzIGNhbiBiZSBhZGp1c3RlZCBhdCBydW50aW1lIHRocm91Z2ggc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXMuCisgKi8KKyNkZWZpbmUgSVBSX01BWF9DTURfUEVSX0xVTgkJCQk2CisKKy8qCisgKiBJUFJfTlVNX0JBU0VfQ01EX0JMS1M6IFRoaXMgZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAqCW9wcyB0aGUgbWlkLWxheWVyIGNhbiBzZW5kIHRvIHRoZSBhZGFwdGVyLgorICovCisjZGVmaW5lIElQUl9OVU1fQkFTRV9DTURfQkxLUwkJCQkxMDAKKworI2RlZmluZSBJUFJfU1VCU19ERVZfSURfMjc4MAkweDAyNjQKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MDIJMHgwMjY2CisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzAzCTB4MDI3OAorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcyRSAgMHgwMjhECisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzNFICAweDAyRDMKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3M0QgIDB4MDJENAorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcxQQkweDAyQzAKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MUIJMHgwMkJFCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzFFICAweDAyQkYKKworI2RlZmluZSBJUFJfTkFNRQkJCQkiaXByIgorCisvKgorICogUmV0dXJuIGNvZGVzCisgKi8KKyNkZWZpbmUgSVBSX1JDX0pPQl9DT05USU5VRQkJMQorI2RlZmluZSBJUFJfUkNfSk9CX1JFVFVSTgkJMgorCisvKgorICogSU9BU0NzCisgKi8KKyNkZWZpbmUgSVBSX0lPQVNDX05SX0lOSVRfQ01EX1JFUVVJUkVECQkweDAyMDQwMjAwCisjZGVmaW5lIElQUl9JT0FTQ19TWU5DX1JFUVVJUkVECQkJMHgwMjNmMDAwMAorI2RlZmluZSBJUFJfSU9BU0NfTUVEX0RPX05PVF9SRUFMTE9DCQkweDAzMTEwQzAwCisjZGVmaW5lIElQUl9JT0FTQ19IV19TRUxfVElNRU9VVAkJCTB4MDQwNTAwMDAKKyNkZWZpbmUgSVBSX0lPQVNDX0hXX0RFVl9CVVNfU1RBVFVTCQkJMHgwNDQ0ODUwMAorI2RlZmluZQlJUFJfSU9BU0NfSU9BU0NfTUFTSwkJCTB4RkZGRkZGMDAKKyNkZWZpbmUJSVBSX0lPQVNDX1NDU0lfU1RBVFVTX01BU0sJCTB4MDAwMDAwRkYKKyNkZWZpbmUgSVBSX0lPQVNDX0lSX1JFU09VUkNFX0hBTkRMRQkJMHgwNTI1MDAwMAorI2RlZmluZSBJUFJfSU9BU0NfQlVTX1dBU19SRVNFVAkJCTB4MDYyOTAwMDAKKyNkZWZpbmUgSVBSX0lPQVNDX0JVU19XQVNfUkVTRVRfQllfT1RIRVIJCTB4MDYyOTgwMDAKKyNkZWZpbmUgSVBSX0lPQVNDX0FCT1JURURfQ01EX1RFUk1fQllfSE9TVAkweDBCNUEwMDAwCisKKyNkZWZpbmUgSVBSX0ZJUlNUX0RSSVZFUl9JT0FTQwkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgSVBSX0lPQVNDX0lPQV9XQVNfUkVTRVQJCQkweDEwMDAwMDAxCisjZGVmaW5lIElQUl9JT0FTQ19QQ0lfQUNDRVNTX0VSUk9SCQkJMHgxMDAwMDAwMgorCisjZGVmaW5lIElQUl9OVU1fTE9HX0hDQU1TCQkJCTIKKyNkZWZpbmUgSVBSX05VTV9DRkdfQ0hHX0hDQU1TCQkJCTIKKyNkZWZpbmUgSVBSX05VTV9IQ0FNUwkoSVBSX05VTV9MT0dfSENBTVMgKyBJUFJfTlVNX0NGR19DSEdfSENBTVMpCisjZGVmaW5lIElQUl9NQVhfTlVNX1RBUkdFVFNfUEVSX0JVUwkJCTB4MTAKKyNkZWZpbmUgSVBSX01BWF9OVU1fTFVOU19QRVJfVEFSR0VUCQkJMjU2CisjZGVmaW5lIElQUl9NQVhfTlVNX1ZTRVRfTFVOU19QRVJfVEFSR0VUCTgKKyNkZWZpbmUgSVBSX1ZTRVRfQlVTCQkJCQkweGZmCisjZGVmaW5lIElQUl9JT0FfQlVTCQkJCQkJMHhmZgorI2RlZmluZSBJUFJfSU9BX1RBUkdFVAkJCQkJMHhmZgorI2RlZmluZSBJUFJfSU9BX0xVTgkJCQkJCTB4ZmYKKyNkZWZpbmUgSVBSX01BWF9OVU1fQlVTRVMJCQkJNAorI2RlZmluZSBJUFJfTUFYX0JVU19UT19TQ0FOCQkJCUlQUl9NQVhfTlVNX0JVU0VTCisKKyNkZWZpbmUgSVBSX05VTV9SRVNFVF9SRUxPQURfUkVUUklFUwkJMworCisvKiBXZSBuZWVkIHJlc291cmNlcyBmb3IgSENBTVMsIElPQSByZXNldCwgSU9BIGJyaW5nZG93biwgYW5kIEVSUCAqLworI2RlZmluZSBJUFJfTlVNX0lOVEVSTkFMX0NNRF9CTEtTCShJUFJfTlVNX0hDQU1TICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVBSX05VTV9SRVNFVF9SRUxPQURfUkVUUklFUyArIDEpICogMikgKyAzKQorCisjZGVmaW5lIElQUl9NQVhfQ09NTUFORFMJCUlQUl9OVU1fQkFTRV9DTURfQkxLUworI2RlZmluZSBJUFJfTlVNX0NNRF9CTEtTCQkoSVBSX05VTV9CQVNFX0NNRF9CTEtTICsgXAorCQkJCQkJSVBSX05VTV9JTlRFUk5BTF9DTURfQkxLUykKKworI2RlZmluZSBJUFJfTUFYX1BIWVNJQ0FMX0RFVlMJCQkJMTkyCisKKyNkZWZpbmUgSVBSX01BWF9TR0xJU1QJCQkJCTY0CisjZGVmaW5lIElQUl9JT0FfTUFYX1NFQ1RPUlMJCQkJMzI3NjcKKyNkZWZpbmUgSVBSX1ZTRVRfTUFYX1NFQ1RPUlMJCQkJNTEyCisjZGVmaW5lIElQUl9NQVhfQ0RCX0xFTgkJCQkJMTYKKworI2RlZmluZSBJUFJfREVGQVVMVF9CVVNfV0lEVEgJCQkJMTYKKyNkZWZpbmUgSVBSXzgwTUJzX1NDU0lfUkFURQkJKCg4MCAqIDEwKSAvIChJUFJfREVGQVVMVF9CVVNfV0lEVEggLyA4KSkKKyNkZWZpbmUgSVBSX1UxNjBfU0NTSV9SQVRFCSgoMTYwICogMTApIC8gKElQUl9ERUZBVUxUX0JVU19XSURUSCAvIDgpKQorI2RlZmluZSBJUFJfVTMyMF9TQ1NJX1JBVEUJKCgzMjAgKiAxMCkgLyAoSVBSX0RFRkFVTFRfQlVTX1dJRFRIIC8gOCkpCisjZGVmaW5lIElQUl9NQVhfU0NTSV9SQVRFKHdpZHRoKSAoKDMyMCAqIDEwKSAvICgod2lkdGgpIC8gOCkpCisKKyNkZWZpbmUgSVBSX0lPQV9SRVNfSEFORExFCQkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgSVBSX0lPQV9SRVNfQUREUgkJCQkweDAwZmZmZmZmCisKKy8qCisgKiBBZGFwdGVyIENvbW1hbmRzCisgKi8KKyNkZWZpbmUgSVBSX1FVRVJZX1JTUkNfU1RBVEUJCQkJMHhDMgorI2RlZmluZSBJUFJfUkVTRVRfREVWSUNFCQkJCTB4QzMKKyNkZWZpbmUJSVBSX1JFU0VUX1RZUEVfU0VMRUNUCQkJCTB4ODAKKyNkZWZpbmUJSVBSX0xVTl9SRVNFVAkJCQkJMHg0MAorI2RlZmluZQlJUFJfVEFSR0VUX1JFU0VUCQkJCQkweDIwCisjZGVmaW5lCUlQUl9CVVNfUkVTRVQJCQkJCTB4MTAKKyNkZWZpbmUgSVBSX0lEX0hPU1RfUlJfUQkJCQkweEM0CisjZGVmaW5lIElQUl9RVUVSWV9JT0FfQ09ORklHCQkJCTB4QzUKKyNkZWZpbmUgSVBSX0NBTkNFTF9BTExfUkVRVUVTVFMJCQkweENFCisjZGVmaW5lIElQUl9IT1NUX0NPTlRST0xMRURfQVNZTkMJCQkweENGCisjZGVmaW5lCUlQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UJMHgwMQorI2RlZmluZQlJUFJfSENBTV9DREJfT1BfQ09ERV9MT0dfREFUQQkJMHgwMgorI2RlZmluZSBJUFJfU0VUX1NVUFBPUlRFRF9ERVZJQ0VTCQkJMHhGQgorI2RlZmluZSBJUFJfSU9BX1NIVVRET1dOCQkJCTB4RjcKKyNkZWZpbmUJSVBSX1dSX0JVRl9ET1dOTE9BRF9BTkRfU0FWRQkJCTB4MDUKKworLyoKKyAqIFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgSVBSX1NIVVRET1dOX1RJTUVPVVQJCQkoaXByX2Zhc3RmYWlsID8gNjAgKiBIWiA6IDEwICogNjAgKiBIWikKKyNkZWZpbmUgSVBSX1ZTRVRfUldfVElNRU9VVAkJCShpcHJfZmFzdGZhaWwgPyAzMCAqIEhaIDogMiAqIDYwICogSFopCisjZGVmaW5lIElQUl9BQkJSRVZfU0hVVERPV05fVElNRU9VVAkJKDEwICogSFopCisjZGVmaW5lIElQUl9ERVZJQ0VfUkVTRVRfVElNRU9VVAkJKGlwcl9mYXN0ZmFpbCA/IDEwICogSFogOiAzMCAqIEhaKQorI2RlZmluZSBJUFJfQ0FOQ0VMX0FMTF9USU1FT1VUCQkoaXByX2Zhc3RmYWlsID8gMTAgKiBIWiA6IDMwICogSFopCisjZGVmaW5lIElQUl9BQk9SVF9UQVNLX1RJTUVPVVQJCShpcHJfZmFzdGZhaWwgPyAxMCAqIEhaIDogMzAgKiBIWikKKyNkZWZpbmUgSVBSX0lOVEVSTkFMX1RJTUVPVVQJCQkoaXByX2Zhc3RmYWlsID8gMTAgKiBIWiA6IDMwICogSFopCisjZGVmaW5lIElQUl9XUklURV9CVUZGRVJfVElNRU9VVAkJKDEwICogNjAgKiBIWikKKyNkZWZpbmUgSVBSX1NFVF9TVVBfREVWSUNFX1RJTUVPVVQJCSgyICogNjAgKiBIWikKKyNkZWZpbmUgSVBSX1JFUVVFU1RfU0VOU0VfVElNRU9VVAkJKDEwICogSFopCisjZGVmaW5lIElQUl9PUEVSQVRJT05BTF9USU1FT1VUCQkoNSAqIDYwKQorI2RlZmluZSBJUFJfV0FJVF9GT1JfUkVTRVRfVElNRU9VVAkJKDIgKiBIWikKKyNkZWZpbmUgSVBSX0NIRUNLX0ZPUl9SRVNFVF9USU1FT1VUCQkoSFogLyAxMCkKKyNkZWZpbmUgSVBSX1dBSVRfRk9SX0JJU1RfVElNRU9VVAkJKDIgKiBIWikKKyNkZWZpbmUgSVBSX0RVTVBfVElNRU9VVAkJCSgxNSAqIEhaKQorCisvKgorICogU0NTSSBMaXRlcmFscworICovCisjZGVmaW5lIElQUl9WRU5ET1JfSURfTEVOCQkJOAorI2RlZmluZSBJUFJfUFJPRF9JRF9MRU4JCQkJMTYKKyNkZWZpbmUgSVBSX1NFUklBTF9OVU1fTEVOCQkJOAorCisvKgorICogSGFyZHdhcmUgbGl0ZXJhbHMKKyAqLworI2RlZmluZSBJUFJfRk1UMl9NQlhfQUREUl9NQVNLCQkJCTB4MGZmZmZmZmYKKyNkZWZpbmUgSVBSX0ZNVDJfTUJYX0JBUl9TRUxfTUFTSwkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgSVBSX0ZNVDJfTUtSX0JBUl9TRUxfU0hJRlQJCQkyOAorI2RlZmluZSBJUFJfR0VUX0ZNVDJfQkFSX1NFTChtYngpIFwKKygoKG1ieCkgJiBJUFJfRk1UMl9NQlhfQkFSX1NFTF9NQVNLKSA+PiBJUFJfRk1UMl9NS1JfQkFSX1NFTF9TSElGVCkKKyNkZWZpbmUgSVBSX1NEVF9GTVQyX0JBUjBfU0VMCQkJCTB4MAorI2RlZmluZSBJUFJfU0RUX0ZNVDJfQkFSMV9TRUwJCQkJMHgxCisjZGVmaW5lIElQUl9TRFRfRk1UMl9CQVIyX1NFTAkJCQkweDIKKyNkZWZpbmUgSVBSX1NEVF9GTVQyX0JBUjNfU0VMCQkJCTB4MworI2RlZmluZSBJUFJfU0RUX0ZNVDJfQkFSNF9TRUwJCQkJMHg0CisjZGVmaW5lIElQUl9TRFRfRk1UMl9CQVI1X1NFTAkJCQkweDUKKyNkZWZpbmUgSVBSX1NEVF9GTVQyX0VYUF9ST01fU0VMCQkJMHg4CisjZGVmaW5lIElQUl9GTVQyX1NEVF9SRUFEWV9UT19VU0UJCQkweEM0RDRFM0YyCisjZGVmaW5lIElQUl9ET09SQkVMTAkJCQkJMHg4MjgwMDAwMAorCisjZGVmaW5lIElQUl9QQ0lJX0lPQV9UUkFOU19UT19PUEVSCQkJKDB4ODAwMDAwMDAgPj4gMCkKKyNkZWZpbmUgSVBSX1BDSUlfSU9BUkNCX1hGRVJfRkFJTEVECQkJKDB4ODAwMDAwMDAgPj4gMykKKyNkZWZpbmUgSVBSX1BDSUlfSU9BX1VOSVRfQ0hFQ0tFRAkJCSgweDgwMDAwMDAwID4+IDQpCisjZGVmaW5lIElQUl9QQ0lJX05PX0hPU1RfUlJRCQkJCSgweDgwMDAwMDAwID4+IDUpCisjZGVmaW5lIElQUl9QQ0lJX0NSSVRJQ0FMX09QRVJBVElPTgkJCSgweDgwMDAwMDAwID4+IDYpCisjZGVmaW5lIElQUl9QQ0lJX0lPX0RFQlVHX0FDS05PV0xFREdFCQkoMHg4MDAwMDAwMCA+PiA3KQorI2RlZmluZSBJUFJfUENJSV9JT0FSUklOX0xPU1QJCQkJKDB4ODAwMDAwMDAgPj4gMjcpCisjZGVmaW5lIElQUl9QQ0lJX01NSU9fRVJST1IJCQkJKDB4ODAwMDAwMDAgPj4gMjgpCisjZGVmaW5lIElQUl9QQ0lJX1BST0NfRVJSX1NUQVRFCQkJKDB4ODAwMDAwMDAgPj4gMjkpCisjZGVmaW5lIElQUl9QQ0lJX0hSUlFfVVBEQVRFRAkJCQkoMHg4MDAwMDAwMCA+PiAzMCkKKyNkZWZpbmUgSVBSX1BDSUlfQ09SRV9JU1NVRURfUlNUX1JFUQkJKDB4ODAwMDAwMDAgPj4gMzEpCisKKyNkZWZpbmUgSVBSX1BDSUlfRVJST1JfSU5URVJSVVBUUyBcCisoSVBSX1BDSUlfSU9BUkNCX1hGRVJfRkFJTEVEIHwgSVBSX1BDSUlfSU9BX1VOSVRfQ0hFQ0tFRCB8IFwKK0lQUl9QQ0lJX05PX0hPU1RfUlJRIHwgSVBSX1BDSUlfSU9BUlJJTl9MT1NUIHwgSVBSX1BDSUlfTU1JT19FUlJPUikKKworI2RlZmluZSBJUFJfUENJSV9PUEVSX0lOVEVSUlVQVFMgXAorKElQUl9QQ0lJX0VSUk9SX0lOVEVSUlVQVFMgfCBJUFJfUENJSV9IUlJRX1VQREFURUQgfCBJUFJfUENJSV9JT0FfVFJBTlNfVE9fT1BFUikKKworI2RlZmluZSBJUFJfVVBST0NJX1JFU0VUX0FMRVJUCQkJKDB4ODAwMDAwMDAgPj4gNykKKyNkZWZpbmUgSVBSX1VQUk9DSV9JT19ERUJVR19BTEVSVAkJCSgweDgwMDAwMDAwID4+IDkpCisKKyNkZWZpbmUgSVBSX0xEVU1QX01BWF9MT05HX0FDS19ERUxBWV9JTl9VU0VDCQkyMDAwMDAJLyogMjAwIG1zICovCisjZGVmaW5lIElQUl9MRFVNUF9NQVhfU0hPUlRfQUNLX0RFTEFZX0lOX1VTRUMJCTIwMDAwMAkvKiAyMDAgbXMgKi8KKworLyoKKyAqIER1bXAgbGl0ZXJhbHMKKyAqLworI2RlZmluZSBJUFJfTUFYX0lPQV9EVU1QX1NJWkUJCQkJKDQgKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgSVBSX05VTV9TRFRfRU5UUklFUwkJCQk1MTEKKyNkZWZpbmUgSVBSX01BWF9OVU1fRFVNUF9QQUdFUwkoKElQUl9NQVhfSU9BX0RVTVBfU0laRSAvIFBBR0VfU0laRSkgKyAxKQorCisvKgorICogTWlzYyBsaXRlcmFscworICovCisjZGVmaW5lIElQUl9OVU1fSU9BRExfRU5UUklFUwkJCUlQUl9NQVhfU0dMSVNUCisKKy8qCisgKiBBZGFwdGVyIGludGVyZmFjZSB0eXBlcworICovCisKK3N0cnVjdCBpcHJfcmVzX2FkZHIgeworCXU4IHJlc2VydmVkOworCXU4IGJ1czsKKwl1OCB0YXJnZXQ7CisJdTggbHVuOworI2RlZmluZSBJUFJfR0VUX1BIWVNfTE9DKHJlc19hZGRyKSBcCisJKCgocmVzX2FkZHIpLmJ1cyA8PCAxNikgfCAoKHJlc19hZGRyKS50YXJnZXQgPDwgOCkgfCAocmVzX2FkZHIpLmx1bikKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfc3RkX2lucV92cGlkcyB7CisJdTggdmVuZG9yX2lkW0lQUl9WRU5ET1JfSURfTEVOXTsKKwl1OCBwcm9kdWN0X2lkW0lQUl9QUk9EX0lEX0xFTl07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcHJfc3RkX2lucV9kYXRhIHsKKwl1OCBwZXJpX3F1YWxfZGV2X3R5cGU7CisjZGVmaW5lIElQUl9TVERfSU5RX1BFUklfUVVBTChwZXJpKSAoKHBlcmkpID4+IDUpCisjZGVmaW5lIElQUl9TVERfSU5RX1BFUklfREVWX1RZUEUocGVyaSkgKChwZXJpKSAmIDB4MUYpCisKKwl1OCByZW1vdmVhYmxlX21lZGl1bV9yc3ZkOworI2RlZmluZSBJUFJfU1REX0lOUV9SRU1PVkVBQkxFX01FRElVTSAweDgwCisKKyNkZWZpbmUgSVBSX0lTX0RBU0RfREVWSUNFKHN0ZF9pbnEpIFwKKygoSVBSX1NURF9JTlFfUEVSSV9ERVZfVFlQRSgoc3RkX2lucSkucGVyaV9xdWFsX2Rldl90eXBlKSA9PSBUWVBFX0RJU0spICYmIFwKKyEoKChzdGRfaW5xKS5yZW1vdmVhYmxlX21lZGl1bV9yc3ZkKSAmIElQUl9TVERfSU5RX1JFTU9WRUFCTEVfTUVESVVNKSkKKworI2RlZmluZSBJUFJfSVNfU0VTX0RFVklDRShzdGRfaW5xKSBcCisoSVBSX1NURF9JTlFfUEVSSV9ERVZfVFlQRSgoc3RkX2lucSkucGVyaV9xdWFsX2Rldl90eXBlKSA9PSBUWVBFX0VOQ0xPU1VSRSkKKworCXU4IHZlcnNpb247CisJdTggYWVuX25hY2FfZm10OworCXU4IGFkZGl0aW9uYWxfbGVuOworCXU4IHNjY3NfcnN2ZDsKKwl1OCBicV9lbmNfbXVsdGk7CisJdTggc3luY19jbWRxX2ZsYWdzOworCisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIHZwaWRzOworCisJdTggcm9zX3JzdmRfcmFtX3JzdmRbNF07CisKKwl1OCBzZXJpYWxfbnVtW0lQUl9TRVJJQUxfTlVNX0xFTl07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSB7CisJdTggc2VydmljZV9sZXZlbDsKKwl1OCBhcnJheV9pZDsKKwl1OCBmbGFnczsKKyNkZWZpbmUgSVBSX0lTX0lPQV9SRVNPVVJDRQkweDgwCisjZGVmaW5lIElQUl9JU19BUlJBWV9NRU1CRVIgMHgyMAorI2RlZmluZSBJUFJfSVNfSE9UX1NQQVJFCTB4MTAKKworCXU4IHJzdmRfc3VidHlwZTsKKyNkZWZpbmUgSVBSX1JFU19TVUJUWVBFKHJlcykgKCgocmVzKS0+Y2ZndGUucnN2ZF9zdWJ0eXBlKSAmIDB4MGYpCisjZGVmaW5lIElQUl9TVUJUWVBFX0FGX0RBU0QJCQkwCisjZGVmaW5lIElQUl9TVUJUWVBFX0dFTkVSSUNfU0NTSQkxCisjZGVmaW5lIElQUl9TVUJUWVBFX1ZPTFVNRV9TRVQJCTIKKworCXN0cnVjdCBpcHJfcmVzX2FkZHIgcmVzX2FkZHI7CisJX19iZTMyIHJlc19oYW5kbGU7CisJX19iZTMyIHJlc2VydmVkNFsyXTsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfZGF0YSBzdGRfaW5xX2RhdGE7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9jb25maWdfdGFibGVfaGRyIHsKKwl1OCBudW1fZW50cmllczsKKwl1OCBmbGFnczsKKyNkZWZpbmUgSVBSX1VDT0RFX0RPV05MT0FEX1JFUQkweDEwCisJX19iZTE2IHJlc2VydmVkOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9jb25maWdfdGFibGUgeworCXN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkciBoZHI7CisJc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkgZGV2W0lQUl9NQVhfUEhZU0lDQUxfREVWU107Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfY2ZnX2NoX25vdCB7CisJc3RydWN0IGlwcl9jb25maWdfdGFibGVfZW50cnkgY2ZndGU7CisJdTggcmVzZXJ2ZWRbOTM2XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfc3VwcG9ydGVkX2RldmljZSB7CisJX19iZTE2IGRhdGFfbGVuZ3RoOworCXU4IHJlc2VydmVkOworCXU4IG51bV9yZWNvcmRzOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyB2cGlkczsKKwl1OCByZXNlcnZlZDJbMTZdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworLyogQ29tbWFuZCBwYWNrZXQgc3RydWN0dXJlICovCitzdHJ1Y3QgaXByX2NtZF9wa3QgeworCV9fYmUxNiByZXNlcnZlZDsJCS8qIFJlc2VydmVkIGJ5IElPQSAqLworCXU4IHJlcXVlc3RfdHlwZTsKKyNkZWZpbmUgSVBSX1JRVFlQRV9TQ1NJQ0RCCQkweDAwCisjZGVmaW5lIElQUl9SUVRZUEVfSU9BQ01ECQkweDAxCisjZGVmaW5lIElQUl9SUVRZUEVfSENBTQkJCTB4MDIKKworCXU4IGx1bnRhcl9sdW50cm47CisKKwl1OCBmbGFnc19oaTsKKyNkZWZpbmUgSVBSX0ZMQUdTX0hJX1dSSVRFX05PVF9SRUFECQkweDgwCisjZGVmaW5lIElQUl9GTEFHU19ISV9OT19VTEVOX0NISwkJMHgyMAorI2RlZmluZSBJUFJfRkxBR1NfSElfU1lOQ19PVkVSUklERQkJMHgxMAorI2RlZmluZSBJUFJfRkxBR1NfSElfU1lOQ19DT01QTEVURQkJMHgwOAorI2RlZmluZSBJUFJfRkxBR1NfSElfTk9fTElOS19ERVNDCQkweDA0CisKKwl1OCBmbGFnc19sbzsKKyNkZWZpbmUgSVBSX0ZMQUdTX0xPX0FMSUdORURfQkZSCQkweDIwCisjZGVmaW5lIElQUl9GTEFHU19MT19ERUxBWV9BRlRFUl9SU1QJMHgxMAorI2RlZmluZSBJUFJfRkxBR1NfTE9fVU5UQUdHRURfVEFTSwkJMHgwMAorI2RlZmluZSBJUFJfRkxBR1NfTE9fU0lNUExFX1RBU0sJCTB4MDIKKyNkZWZpbmUgSVBSX0ZMQUdTX0xPX09SREVSRURfVEFTSwkJMHgwNAorI2RlZmluZSBJUFJfRkxBR1NfTE9fSEVBRF9PRl9RX1RBU0sJCTB4MDYKKyNkZWZpbmUgSVBSX0ZMQUdTX0xPX0FDQV9UQVNLCQkJMHgwOAorCisJdTggY2RiWzE2XTsKKwlfX2JlMTYgdGltZW91dDsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKy8qIElPQSBSZXF1ZXN0IENvbnRyb2wgQmxvY2sgICAgMTI4IGJ5dGVzICAqLworc3RydWN0IGlwcl9pb2FyY2IgeworCV9fYmUzMiBpb2FyY2JfaG9zdF9wY2lfYWRkcjsKKwlfX2JlMzIgcmVzZXJ2ZWQ7CisJX19iZTMyIHJlc19oYW5kbGU7CisJX19iZTMyIGhvc3RfcmVzcG9uc2VfaGFuZGxlOworCV9fYmUzMiByZXNlcnZlZDE7CisJX19iZTMyIHJlc2VydmVkMjsKKwlfX2JlMzIgcmVzZXJ2ZWQzOworCisJX19iZTMyIHdyaXRlX2RhdGFfdHJhbnNmZXJfbGVuZ3RoOworCV9fYmUzMiByZWFkX2RhdGFfdHJhbnNmZXJfbGVuZ3RoOworCV9fYmUzMiB3cml0ZV9pb2FkbF9hZGRyOworCV9fYmUzMiB3cml0ZV9pb2FkbF9sZW47CisJX19iZTMyIHJlYWRfaW9hZGxfYWRkcjsKKwlfX2JlMzIgcmVhZF9pb2FkbF9sZW47CisKKwlfX2JlMzIgaW9hc2FfaG9zdF9wY2lfYWRkcjsKKwlfX2JlMTYgaW9hc2FfbGVuOworCV9fYmUxNiByZXNlcnZlZDQ7CisKKwlzdHJ1Y3QgaXByX2NtZF9wa3QgY21kX3BrdDsKKworCV9fYmUzMiBhZGRfY21kX3Bhcm1zX2xlbjsKKwlfX2JlMzIgYWRkX2NtZF9wYXJtc1sxMF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgeworCV9fYmUzMiBmbGFnc19hbmRfZGF0YV9sZW47CisjZGVmaW5lIElQUl9JT0FETF9GTEFHU19NQVNLCQkweGZmMDAwMDAwCisjZGVmaW5lIElQUl9JT0FETF9HRVRfRkxBR1MoeCkgKGJlMzJfdG9fY3B1KHgpICYgSVBSX0lPQURMX0ZMQUdTX01BU0spCisjZGVmaW5lIElQUl9JT0FETF9EQVRBX0xFTl9NQVNLCQkweDAwZmZmZmZmCisjZGVmaW5lIElQUl9JT0FETF9HRVRfREFUQV9MRU4oeCkgKGJlMzJfdG9fY3B1KHgpICYgSVBSX0lPQURMX0RBVEFfTEVOX01BU0spCisjZGVmaW5lIElQUl9JT0FETF9GTEFHU19SRUFECQkweDQ4MDAwMDAwCisjZGVmaW5lIElQUl9JT0FETF9GTEFHU19SRUFEX0xBU1QJMHg0OTAwMDAwMAorI2RlZmluZSBJUFJfSU9BRExfRkxBR1NfV1JJVEUJCTB4NjgwMDAwMDAKKyNkZWZpbmUgSVBSX0lPQURMX0ZMQUdTX1dSSVRFX0xBU1QJMHg2OTAwMDAwMAorI2RlZmluZSBJUFJfSU9BRExfRkxBR1NfTEFTVAkJMHgwMTAwMDAwMAorCisJX19iZTMyIGFkZHJlc3M7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg4KSkpOworCitzdHJ1Y3QgaXByX2lvYXNhX3ZzZXQgeworCV9fYmUzMiBmYWlsaW5nX2xiYV9oaTsKKwlfX2JlMzIgZmFpbGluZ19sYmFfbG87CisJX19iZTMyIGlvYV9kYXRhWzIyXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaW9hc2FfYWZfZGFzZCB7CisJX19iZTMyIGZhaWxpbmdfbGJhOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9pb2FzYV9ncGRkIHsKKwl1OCBlbmRfc3RhdGU7CisJdTggYnVzX3BoYXNlOworCV9fYmUxNiByZXNlcnZlZDsKKwlfX2JlMzIgaW9hX2RhdGFbMjNdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9pb2FzYV9yYXcgeworCV9fYmUzMiBpb2FfZGF0YVsyNF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2lvYXNhIHsKKwlfX2JlMzIgaW9hc2M7CisjZGVmaW5lIElQUl9JT0FTQ19TRU5TRV9LRVkoaW9hc2MpICgoaW9hc2MpID4+IDI0KQorI2RlZmluZSBJUFJfSU9BU0NfU0VOU0VfQ09ERShpb2FzYykgKCgoaW9hc2MpICYgMHgwMGZmMDAwMCkgPj4gMTYpCisjZGVmaW5lIElQUl9JT0FTQ19TRU5TRV9RVUFMKGlvYXNjKSAoKChpb2FzYykgJiAweDAwMDBmZjAwKSA+PiA4KQorI2RlZmluZSBJUFJfSU9BU0NfU0VOU0VfU1RBVFVTKGlvYXNjKSAoKGlvYXNjKSAmIDB4MDAwMDAwZmYpCisKKwlfX2JlMTYgcmV0X3N0YXRfbGVuOwkvKiBMZW5ndGggb2YgdGhlIHJldHVybmVkIElPQVNBICovCisKKwlfX2JlMTYgYXZhaWxfc3RhdF9sZW47CS8qIFRvdGFsIExlbmd0aCBvZiBzdGF0dXMgYXZhaWxhYmxlLiAqLworCisJX19iZTMyIHJlc2lkdWFsX2RhdGFfbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGhvc3QgZGF0YSAqLworCS8qIGJ1ZmZlcnMgdGhhdCB3ZXJlIG5vdCB1c2VkIGJ5IHRoZSBJT0FSQ0IgY29tbWFuZC4gKi8KKworCV9fYmUzMiBpbGlkOworI2RlZmluZSBJUFJfTk9fSUxJRAkJCTAKKyNkZWZpbmUgSVBSX0RSSVZFUl9JTElECQkweGZmZmZmZmZmCisKKwlfX2JlMzIgZmRfaW9hc2M7CisKKwlfX2JlMzIgZmRfcGh5c19sb2NhdG9yOworCisJX19iZTMyIGZkX3Jlc19oYW5kbGU7CisKKwlfX2JlMzIgaW9hc2Nfc3BlY2lmaWM7CS8qIHN0YXR1cyBjb2RlIHNwZWNpZmljIGZpZWxkICovCisjZGVmaW5lIElQUl9JT0FTQ19TUEVDSUZJQ19NQVNLCQkweDAwZmZmZmZmCisjZGVmaW5lIElQUl9GSUVMRF9QT0lOVEVSX1ZBTElECQkoMHg4MDAwMDAwMCA+PiA4KQorI2RlZmluZSBJUFJfRklFTERfUE9JTlRFUl9NQVNLCQkweDAwMDBmZmZmCisKKwl1bmlvbiB7CisJCXN0cnVjdCBpcHJfaW9hc2FfdnNldCB2c2V0OworCQlzdHJ1Y3QgaXByX2lvYXNhX2FmX2Rhc2QgZGFzZDsKKwkJc3RydWN0IGlwcl9pb2FzYV9ncGRkIGdwZGQ7CisJCXN0cnVjdCBpcHJfaW9hc2FfcmF3IHJhdzsKKwl9IHU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX21vZGVfcGFybV9oZHIgeworCXU4IGxlbmd0aDsKKwl1OCBtZWRpdW1fdHlwZTsKKwl1OCBkZXZpY2Vfc3BlY19wYXJtczsKKwl1OCBibG9ja19kZXNjX2xlbjsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9tb2RlX3BhZ2VzIHsKKwlzdHJ1Y3QgaXByX21vZGVfcGFybV9oZHIgaGRyOworCXU4IGRhdGFbMjU1IC0gc2l6ZW9mKHN0cnVjdCBpcHJfbW9kZV9wYXJtX2hkcildOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX21vZGVfcGFnZV9oZHIgeworCXU4IHBzX3BhZ2VfY29kZTsKKyNkZWZpbmUgSVBSX01PREVfUEFHRV9QUwkweDgwCisjZGVmaW5lIElQUl9HRVRfTU9ERV9QQUdFX0NPREUoaGRyKSAoKGhkciktPnBzX3BhZ2VfY29kZSAmIDB4M0YpCisJdTggcGFnZV9sZW5ndGg7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX2Rldl9idXNfZW50cnkgeworCXN0cnVjdCBpcHJfcmVzX2FkZHIgcmVzX2FkZHI7CisJdTggZmxhZ3M7CisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfRU5BQkxFX1FBUwkJCTB4ODAKKyNkZWZpbmUgSVBSX1NDU0lfQVRUUl9ESVNBQkxFX1FBUwkJCTB4NDAKKyNkZWZpbmUgSVBSX1NDU0lfQVRUUl9RQVNfTUFTSwkJCQkweEMwCisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfRU5BQkxFX1RNCQkJCTB4MjAKKyNkZWZpbmUgSVBSX1NDU0lfQVRUUl9OT19URVJNX1BXUgkJCTB4MTAKKyNkZWZpbmUgSVBSX1NDU0lfQVRUUl9UTV9TVVBQT1JURUQJCQkweDA4CisjZGVmaW5lIElQUl9TQ1NJX0FUVFJfTFZEX1RPX1NFX05PVF9BTExPV0VECTB4MDQKKworCXU4IHNjc2lfaWQ7CisJdTggYnVzX3dpZHRoOworCXU4IGV4dGVuZGVkX3Jlc2V0X2RlbGF5OworI2RlZmluZSBJUFJfRVhURU5ERURfUkVTRVRfREVMQVkJNworCisJX19iZTMyIG1heF94ZmVyX3JhdGU7CisKKwl1OCBzcGludXBfZGVsYXk7CisJdTggcmVzZXJ2ZWQzOworCV9fYmUxNiByZXNlcnZlZDQ7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX21vZGVfcGFnZTI4IHsKKwlzdHJ1Y3QgaXByX21vZGVfcGFnZV9oZHIgaGRyOworCXU4IG51bV9lbnRyaWVzOworCXU4IGVudHJ5X2xlbmd0aDsKKwlzdHJ1Y3QgaXByX2Rldl9idXNfZW50cnkgYnVzWzBdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgaXByX2lvYV92cGQgeworCXN0cnVjdCBpcHJfc3RkX2lucV9kYXRhIHN0ZF9pbnFfZGF0YTsKKwl1OCBhc2NpaV9wYXJ0X251bVsxMl07CisJdTggcmVzZXJ2ZWRbNDBdOworCXU4IGFzY2lpX3BsYW50X2NvZGVbNF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcHJfaW5xdWlyeV9wYWdlMyB7CisJdTggcGVyaV9xdWFsX2Rldl90eXBlOworCXU4IHBhZ2VfY29kZTsKKwl1OCByZXNlcnZlZDE7CisJdTggcGFnZV9sZW5ndGg7CisJdTggYXNjaWlfbGVuOworCXU4IHJlc2VydmVkMlszXTsKKwl1OCBsb2FkX2lkWzRdOworCXU4IG1ham9yX3JlbGVhc2U7CisJdTggY2FyZF90eXBlOworCXU4IG1pbm9yX3JlbGVhc2VbMl07CisJdTggcHRmX251bWJlcls0XTsKKwl1OCBwYXRjaF9udW1iZXJbNF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcHJfaG9zdHJjYl9kZXZpY2VfZGF0YV9lbnRyeSB7CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGRldl92cGlkczsKKwl1OCBkZXZfc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlzdHJ1Y3QgaXByX3Jlc19hZGRyIGRldl9yZXNfYWRkcjsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgbmV3X2Rldl92cGlkczsKKwl1OCBuZXdfZGV2X3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGlvYV9sYXN0X3dpdGhfZGV2X3ZwaWRzOworCXU4IGlvYV9sYXN0X3dpdGhfZGV2X3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGNmY19sYXN0X3dpdGhfZGV2X3ZwaWRzOworCXU4IGNmY19sYXN0X3dpdGhfZGV2X3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJX19iZTMyIGlvYV9kYXRhWzVdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX2FycmF5X2RhdGFfZW50cnkgeworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyB2cGlkczsKKwl1OCBzZXJpYWxfbnVtW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9yZXNfYWRkciBleHBlY3RlZF9kZXZfcmVzX2FkZHI7CisJc3RydWN0IGlwcl9yZXNfYWRkciBkZXZfcmVzX2FkZHI7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV9mZl9lcnJvciB7CisJX19iZTMyIGlvYV9kYXRhWzI0Nl07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wMV9lcnJvciB7CisJX19iZTMyIHNlZWtfY291bnRlcjsKKwlfX2JlMzIgcmVhZF9jb3VudGVyOworCXU4IHNlbnNlX2RhdGFbMzJdOworCV9fYmUzMiBpb2FfZGF0YVsyMzZdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDJfZXJyb3IgeworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBpb2FfdnBpZHM7CisJdTggaW9hX3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGNmY192cGlkczsKKwl1OCBjZmNfc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgaW9hX2xhc3RfYXR0YWNoZWRfdG9fY2ZjX3ZwaWRzOworCXU4IGlvYV9sYXN0X2F0dGFjaGVkX3RvX2NmY19zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBjZmNfbGFzdF9hdHRhY2hlZF90b19pb2FfdnBpZHM7CisJdTggY2ZjX2xhc3RfYXR0YWNoZWRfdG9faW9hX3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJX19iZTMyIGlvYV9kYXRhWzNdOworCXU4IHJlc2VydmVkWzg0NF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wM19lcnJvciB7CisJc3RydWN0IGlwcl9zdGRfaW5xX3ZwaWRzIGlvYV92cGlkczsKKwl1OCBpb2Ffc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgY2ZjX3ZwaWRzOworCXU4IGNmY19zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCV9fYmUzMiBlcnJvcnNfZGV0ZWN0ZWQ7CisJX19iZTMyIGVycm9yc19sb2dnZWQ7CisJdTggaW9hX2RhdGFbMTJdOworCXN0cnVjdCBpcHJfaG9zdHJjYl9kZXZpY2VfZGF0YV9lbnRyeSBkZXZfZW50cnlbM107CisJdTggcmVzZXJ2ZWRbNDQ0XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaG9zdHJjYl90eXBlXzA0X2Vycm9yIHsKKwlzdHJ1Y3QgaXByX3N0ZF9pbnFfdnBpZHMgaW9hX3ZwaWRzOworCXU4IGlvYV9zbltJUFJfU0VSSUFMX05VTV9MRU5dOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBjZmNfdnBpZHM7CisJdTggY2ZjX3NuW0lQUl9TRVJJQUxfTlVNX0xFTl07CisJdTggaW9hX2RhdGFbMTJdOworCXN0cnVjdCBpcHJfaG9zdHJjYl9hcnJheV9kYXRhX2VudHJ5IGFycmF5X21lbWJlclsxMF07CisJX19iZTMyIGV4cG9zZWRfbW9kZV9hZG47CisJX19iZTMyIGFycmF5X2lkOworCXN0cnVjdCBpcHJfc3RkX2lucV92cGlkcyBpbmNvbXBfZGV2X3ZwaWRzOworCXU4IGluY29tcF9kZXZfc25bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwlfX2JlMzIgaW9hX2RhdGEyOworCXN0cnVjdCBpcHJfaG9zdHJjYl9hcnJheV9kYXRhX2VudHJ5IGFycmF5X21lbWJlcjJbOF07CisJc3RydWN0IGlwcl9yZXNfYWRkciBsYXN0X2Z1bmNfdnNldF9yZXNfYWRkcjsKKwl1OCB2c2V0X3NlcmlhbF9udW1bSVBSX1NFUklBTF9OVU1fTEVOXTsKKwl1OCBwcm90ZWN0aW9uX2xldmVsWzhdOworCXU4IHJlc2VydmVkWzEyNF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2hvc3RyY2JfZXJyb3IgeworCV9fYmUzMiBmYWlsaW5nX2Rldl9pb2FzYzsKKwlzdHJ1Y3QgaXByX3Jlc19hZGRyIGZhaWxpbmdfZGV2X3Jlc19hZGRyOworCV9fYmUzMiBmYWlsaW5nX2Rldl9yZXNfaGFuZGxlOworCV9fYmUzMiBwcmM7CisJdW5pb24geworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV9mZl9lcnJvciB0eXBlX2ZmX2Vycm9yOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wMV9lcnJvciB0eXBlXzAxX2Vycm9yOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wMl9lcnJvciB0eXBlXzAyX2Vycm9yOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wM19lcnJvciB0eXBlXzAzX2Vycm9yOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8wNF9lcnJvciB0eXBlXzA0X2Vycm9yOworCX0gdTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaG9zdHJjYl9yYXcgeworCV9fYmUzMiBkYXRhW3NpemVvZihzdHJ1Y3QgaXByX2hvc3RyY2JfZXJyb3IpL3NpemVvZihfX2JlMzIpXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaGNhbSB7CisJdTggb3BfY29kZTsKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09QX0NPREVfQ09ORklHX0NIQU5HRQkJCTB4RTEKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09QX0NPREVfTE9HX0RBVEEJCQkJMHhFMgorCisJdTggbm90aWZ5X3R5cGU7CisjZGVmaW5lIElQUl9IT1NUX1JDQl9OT1RJRl9UWVBFX0VYSVNUSU5HX0NIQU5HRUQJMHgwMAorI2RlZmluZSBJUFJfSE9TVF9SQ0JfTk9USUZfVFlQRV9ORVdfRU5UUlkJCQkweDAxCisjZGVmaW5lIElQUl9IT1NUX1JDQl9OT1RJRl9UWVBFX1JFTV9FTlRSWQkJCTB4MDIKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX05PVElGX1RZUEVfRVJST1JfTE9HX0VOVFJZCQkweDEwCisjZGVmaW5lIElQUl9IT1NUX1JDQl9OT1RJRl9UWVBFX0lORk9STUFUSU9OX0VOVFJZCTB4MTEKKworCXU4IG5vdGlmaWNhdGlvbnNfbG9zdDsKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX05PX05PVElGSUNBVElPTlNfTE9TVAkJCTAKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX05PVElGSUNBVElPTlNfTE9TVAkJCQkweDgwCisKKwl1OCBmbGFnczsKKyNkZWZpbmUgSVBSX0hPU1RSQ0JfSU5URVJOQUxfT1BFUgkweDgwCisjZGVmaW5lIElQUl9IT1NUUkNCX0VSUl9SRVNQX1NFTlQJMHg0MAorCisJdTggb3ZlcmxheV9pZDsKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMQkJCQkweDAxCisjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIJCQkJMHgwMgorI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8zCQkJCTB4MDMKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfNAkJCQkweDA0CisjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzYJCQkJMHgwNgorI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF9ERUZBVUxUCQkJMHhGRgorCisJdTggcmVzZXJ2ZWQxWzNdOworCV9fYmUzMiBpbGlkOworCV9fYmUzMiB0aW1lX3NpbmNlX2xhc3RfaW9hX3Jlc2V0OworCV9fYmUzMiByZXNlcnZlZDI7CisJX19iZTMyIGxlbmd0aDsKKworCXVuaW9uIHsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX2Vycm9yIGVycm9yOworCQlzdHJ1Y3QgaXByX2hvc3RyY2JfY2ZnX2NoX25vdCBjY247CisJCXN0cnVjdCBpcHJfaG9zdHJjYl9yYXcgcmF3OworCX0gdTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfaG9zdHJjYiB7CisJc3RydWN0IGlwcl9oY2FtIGhjYW07CisJZG1hX2FkZHJfdCBob3N0cmNiX2RtYTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworfTsKKworLyogSVBSIHNtYXJ0IGR1bXAgdGFibGUgc3RydWN0dXJlcyAqLworc3RydWN0IGlwcl9zZHRfZW50cnkgeworCV9fYmUzMiBiYXJfc3RyX29mZnNldDsKKwlfX2JlMzIgZW5kX29mZnNldDsKKwl1OCBlbnRyeV9ieXRlOworCXU4IHJlc2VydmVkWzNdOworCisJdTggZmxhZ3M7CisjZGVmaW5lIElQUl9TRFRfRU5ESUFOCQkweDgwCisjZGVmaW5lIElQUl9TRFRfVkFMSURfRU5UUlkJMHgyMAorCisJdTggcmVzdjsKKwlfX2JlMTYgcHJpb3JpdHk7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX3NkdF9oZWFkZXIgeworCV9fYmUzMiBzdGF0ZTsKKwlfX2JlMzIgbnVtX2VudHJpZXM7CisJX19iZTMyIG51bV9lbnRyaWVzX3VzZWQ7CisJX19iZTMyIGR1bXBfc2l6ZTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfc2R0IHsKKwlzdHJ1Y3QgaXByX3NkdF9oZWFkZXIgaGRyOworCXN0cnVjdCBpcHJfc2R0X2VudHJ5IGVudHJ5W0lQUl9OVU1fU0RUX0VOVFJJRVNdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl91Y19zZHQgeworCXN0cnVjdCBpcHJfc2R0X2hlYWRlciBoZHI7CisJc3RydWN0IGlwcl9zZHRfZW50cnkgZW50cnlbMV07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCisvKgorICogRHJpdmVyIHR5cGVzCisgKi8KK3N0cnVjdCBpcHJfYnVzX2F0dHJpYnV0ZXMgeworCXU4IGJ1czsKKwl1OCBxYXNfZW5hYmxlZDsKKwl1OCBidXNfd2lkdGg7CisJdTggcmVzZXJ2ZWQ7CisJdTMyIG1heF94ZmVyX3JhdGU7Cit9OworCitzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5IHsKKwlzdHJ1Y3QgaXByX2NvbmZpZ190YWJsZV9lbnRyeSBjZmd0ZTsKKwl1OCBuZWVkc19zeW5jX2NvbXBsZXRlOjE7CisJdTggaW5fZXJwOjE7CisJdTggYWRkX3RvX21sOjE7CisJdTggZGVsX2Zyb21fbWw6MTsKKwl1OCByZXNldHRpbmdfZGV2aWNlOjE7CisKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKK307CisKK3N0cnVjdCBpcHJfcmVzb3VyY2VfaGRyIHsKKwl1MTYgbnVtX2VudHJpZXM7CisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGlwcl9yZXNvdXJjZV90YWJsZSB7CisJc3RydWN0IGlwcl9yZXNvdXJjZV9oZHIgaGRyOworCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgZGV2W0lQUl9NQVhfUEhZU0lDQUxfREVWU107Cit9OworCitzdHJ1Y3QgaXByX21pc2NfY2JzIHsKKwlzdHJ1Y3QgaXByX2lvYV92cGQgaW9hX3ZwZDsKKwlzdHJ1Y3QgaXByX2lucXVpcnlfcGFnZTMgcGFnZTNfZGF0YTsKKwlzdHJ1Y3QgaXByX21vZGVfcGFnZXMgbW9kZV9wYWdlczsKKwlzdHJ1Y3QgaXByX3N1cHBvcnRlZF9kZXZpY2Ugc3VwcF9kZXY7Cit9OworCitzdHJ1Y3QgaXByX2ludGVycnVwdF9vZmZzZXRzIHsKKwl1bnNpZ25lZCBsb25nIHNldF9pbnRlcnJ1cHRfbWFza19yZWc7CisJdW5zaWduZWQgbG9uZyBjbHJfaW50ZXJydXB0X21hc2tfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Vuc2VfaW50ZXJydXB0X21hc2tfcmVnOworCXVuc2lnbmVkIGxvbmcgY2xyX2ludGVycnVwdF9yZWc7CisKKwl1bnNpZ25lZCBsb25nIHNlbnNlX2ludGVycnVwdF9yZWc7CisJdW5zaWduZWQgbG9uZyBpb2FycmluX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNlbnNlX3Vwcm9jX2ludGVycnVwdF9yZWc7CisJdW5zaWduZWQgbG9uZyBzZXRfdXByb2NfaW50ZXJydXB0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGNscl91cHJvY19pbnRlcnJ1cHRfcmVnOworfTsKKworc3RydWN0IGlwcl9pbnRlcnJ1cHRzIHsKKwl2b2lkIF9faW9tZW0gKnNldF9pbnRlcnJ1cHRfbWFza19yZWc7CisJdm9pZCBfX2lvbWVtICpjbHJfaW50ZXJydXB0X21hc2tfcmVnOworCXZvaWQgX19pb21lbSAqc2Vuc2VfaW50ZXJydXB0X21hc2tfcmVnOworCXZvaWQgX19pb21lbSAqY2xyX2ludGVycnVwdF9yZWc7CisKKwl2b2lkIF9faW9tZW0gKnNlbnNlX2ludGVycnVwdF9yZWc7CisJdm9pZCBfX2lvbWVtICppb2FycmluX3JlZzsKKwl2b2lkIF9faW9tZW0gKnNlbnNlX3Vwcm9jX2ludGVycnVwdF9yZWc7CisJdm9pZCBfX2lvbWVtICpzZXRfdXByb2NfaW50ZXJydXB0X3JlZzsKKwl2b2lkIF9faW9tZW0gKmNscl91cHJvY19pbnRlcnJ1cHRfcmVnOworfTsKKworc3RydWN0IGlwcl9jaGlwX2NmZ190IHsKKwl1MzIgbWFpbGJveDsKKwl1OCBjYWNoZV9saW5lX3NpemU7CisJc3RydWN0IGlwcl9pbnRlcnJ1cHRfb2Zmc2V0cyByZWdzOworfTsKKworc3RydWN0IGlwcl9jaGlwX3QgeworCXUxNiB2ZW5kb3I7CisJdTE2IGRldmljZTsKKwljb25zdCBzdHJ1Y3QgaXByX2NoaXBfY2ZnX3QgKmNmZzsKK307CisKK2VudW0gaXByX3NodXRkb3duX3R5cGUgeworCUlQUl9TSFVURE9XTl9OT1JNQUwgPSAweDAwLAorCUlQUl9TSFVURE9XTl9QUkVQQVJFX0ZPUl9OT1JNQUwgPSAweDQwLAorCUlQUl9TSFVURE9XTl9BQkJSRVYgPSAweDgwLAorCUlQUl9TSFVURE9XTl9OT05FID0gMHgxMDAKK307CisKK3N0cnVjdCBpcHJfdHJhY2VfZW50cnkgeworCXUzMiB0aW1lOworCisJdTggb3BfY29kZTsKKwl1OCB0eXBlOworI2RlZmluZSBJUFJfVFJBQ0VfU1RBUlQJCQkweDAwCisjZGVmaW5lIElQUl9UUkFDRV9GSU5JU0gJCTB4ZmYKKwl1MTYgY21kX2luZGV4OworCisJX19iZTMyIHJlc19oYW5kbGU7CisJdW5pb24geworCQl1MzIgaW9hc2M7CisJCXUzMiBhZGRfZGF0YTsKKwkJdTMyIHJlc19hZGRyOworCX0gdTsKK307CisKK3N0cnVjdCBpcHJfc2dsaXN0IHsKKwl1MzIgb3JkZXI7CisJdTMyIG51bV9zZzsKKwl1MzIgYnVmZmVyX2xlbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2NhdHRlcmxpc3RbMV07Cit9OworCitlbnVtIGlwcl9zZHRfc3RhdGUgeworCUlOQUNUSVZFLAorCVdBSVRfRk9SX0RVTVAsCisJR0VUX0RVTVAsCisJQUJPUlRfRFVNUCwKKwlEVU1QX09CVEFJTkVECit9OworCisvKiBQZXItY29udHJvbGxlciBkYXRhICovCitzdHJ1Y3QgaXByX2lvYV9jZmcgeworCWNoYXIgZXllX2NhdGNoZXJbOF07CisjZGVmaW5lIElQUl9FWUVDQVRDSEVSCQkJImlwcmNmZyIKKworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisKKwl1OCBhbGxvd19pbnRlcnJ1cHRzOjE7CisJdTggaW5fcmVzZXRfcmVsb2FkOjE7CisJdTggaW5faW9hX2JyaW5nZG93bjoxOworCXU4IGlvYV91bml0X2NoZWNrZWQ6MTsKKwl1OCBpb2FfaXNfZGVhZDoxOworCXU4IGR1bXBfdGFrZW46MTsKKwl1OCBhbGxvd19jbWRzOjE7CisJdTggYWxsb3dfbWxfYWRkX2RlbDoxOworCisJdTE2IHR5cGU7IC8qIENDSU4gb2YgdGhlIGNhcmQgKi8KKworCXU4IGxvZ19sZXZlbDsKKyNkZWZpbmUgSVBSX01BWF9MT0dfTEVWRUwJCQk0CisjZGVmaW5lIElQUl9ERUZBVUxUX0xPR19MRVZFTAkJMgorCisjZGVmaW5lIElQUl9OVU1fVFJBQ0VfSU5ERVhfQklUUwk4CisjZGVmaW5lIElQUl9OVU1fVFJBQ0VfRU5UUklFUwkJKDEgPDwgSVBSX05VTV9UUkFDRV9JTkRFWF9CSVRTKQorI2RlZmluZSBJUFJfVFJBQ0VfU0laRQkoc2l6ZW9mKHN0cnVjdCBpcHJfdHJhY2VfZW50cnkpICogSVBSX05VTV9UUkFDRV9FTlRSSUVTKQorCWNoYXIgdHJhY2Vfc3RhcnRbOF07CisjZGVmaW5lIElQUl9UUkFDRV9TVEFSVF9MQUJFTAkJCSJ0cmFjZSIKKwlzdHJ1Y3QgaXByX3RyYWNlX2VudHJ5ICp0cmFjZTsKKwl1MzIgdHJhY2VfaW5kZXg6SVBSX05VTV9UUkFDRV9JTkRFWF9CSVRTOworCisJLyoKKwkgKiBRdWV1ZSBmb3IgZnJlZSBjb21tYW5kIGJsb2NrcworCSAqLworCWNoYXIgaXByX2ZyZWVfbGFiZWxbOF07CisjZGVmaW5lIElQUl9GUkVFUV9MQUJFTAkJCSJmcmVlLXEiCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3E7CisKKwkvKgorCSAqIFF1ZXVlIGZvciBjb21tYW5kIGJsb2NrcyBvdXRzdGFuZGluZyB0byB0aGUgYWRhcHRlcgorCSAqLworCWNoYXIgaXByX3BlbmRpbmdfbGFiZWxbOF07CisjZGVmaW5lIElQUl9QRU5EUV9MQUJFTAkJCSJwZW5kLXEiCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX3E7CisKKwljaGFyIGNmZ190YWJsZV9zdGFydFs4XTsKKyNkZWZpbmUgSVBSX0NGR19UQkxfU1RBUlQJCSJjZmciCisJc3RydWN0IGlwcl9jb25maWdfdGFibGUgKmNmZ190YWJsZTsKKwlkbWFfYWRkcl90IGNmZ190YWJsZV9kbWE7CisKKwljaGFyIHJlc291cmNlX3RhYmxlX2xhYmVsWzhdOworI2RlZmluZSBJUFJfUkVTX1RBQkxFX0xBQkVMCQkicmVzX3RibCIKKwlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXNfZW50cmllczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfcmVzX3E7CisJc3RydWN0IGxpc3RfaGVhZCB1c2VkX3Jlc19xOworCisJY2hhciBpcHJfaGNhbV9sYWJlbFs4XTsKKyNkZWZpbmUgSVBSX0hDQU1fTEFCRUwJCQkiaGNhbXMiCisJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiW0lQUl9OVU1fSENBTVNdOworCWRtYV9hZGRyX3QgaG9zdHJjYl9kbWFbSVBSX05VTV9IQ0FNU107CisJc3RydWN0IGxpc3RfaGVhZCBob3N0cmNiX2ZyZWVfcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhvc3RyY2JfcGVuZGluZ19xOworCisJX19iZTMyICpob3N0X3JycTsKKwlkbWFfYWRkcl90IGhvc3RfcnJxX2RtYTsKKyNkZWZpbmUgSVBSX0hSUlFfUkVRX1JFU1BfSEFORExFX01BU0sJMHhmZmZmZmZmYworI2RlZmluZSBJUFJfSFJSUV9SRVNQX0JJVF9TRVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIElQUl9IUlJRX1RPR0dMRV9CSVQJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBJUFJfSFJSUV9SRVFfUkVTUF9IQU5ETEVfU0hJRlQJMgorCXZvbGF0aWxlIF9fYmUzMiAqaHJycV9zdGFydDsKKwl2b2xhdGlsZSBfX2JlMzIgKmhycnFfZW5kOworCXZvbGF0aWxlIF9fYmUzMiAqaHJycV9jdXJyOworCXZvbGF0aWxlIHUzMiB0b2dnbGVfYml0OworCisJc3RydWN0IGlwcl9idXNfYXR0cmlidXRlcyBidXNfYXR0cltJUFJfTUFYX05VTV9CVVNFU107CisKKwljb25zdCBzdHJ1Y3QgaXByX2NoaXBfY2ZnX3QgKmNoaXBfY2ZnOworCisJdm9pZCBfX2lvbWVtICpoZHdfZG1hX3JlZ3M7CS8qIGlvbWFwcGVkIFBDSSBtZW1vcnkgc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGhkd19kbWFfcmVnc19wY2k7CS8qIHJhdyBQQ0kgbWVtb3J5IHNwYWNlICovCisJdm9pZCBfX2lvbWVtICppb2FfbWFpbGJveDsKKwlzdHJ1Y3QgaXByX2ludGVycnVwdHMgcmVnczsKKworCXUxNiBzYXZlZF9wY2l4X2NtZF9yZWc7CisJdTE2IHJlc2V0X3JldHJpZXM7CisKKwl1MzIgZXJyb3JzX2xvZ2dlZDsKKworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IGlwcl9zZ2xpc3QgKnVjb2RlX3NnbGlzdDsKKwlzdHJ1Y3QgaXByX21vZGVfcGFnZXMgKnNhdmVkX21vZGVfcGFnZXM7CisJdTggc2F2ZWRfbW9kZV9wYWdlX2xlbjsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3E7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZXNldF93YWl0X3E7CisKKwlzdHJ1Y3QgaXByX2R1bXAgKmR1bXA7CisJZW51bSBpcHJfc2R0X3N0YXRlIHNkdF9zdGF0ZTsKKworCXN0cnVjdCBpcHJfbWlzY19jYnMgKnZwZF9jYnM7CisJZG1hX2FkZHJfdCB2cGRfY2JzX2RtYTsKKworCXN0cnVjdCBwY2lfcG9vbCAqaXByX2NtZF9wb29sOworCisJc3RydWN0IGlwcl9jbW5kICpyZXNldF9jbWQ7CisKKwljaGFyIGlwcl9jbWRfbGFiZWxbOF07CisjZGVmaW5lIElQUl9DTURfTEFCRUwJCSJpcHJfY21uZCIKKwlzdHJ1Y3QgaXByX2NtbmQgKmlwcl9jbW5kX2xpc3RbSVBSX05VTV9DTURfQkxLU107CisJdTMyIGlwcl9jbW5kX2xpc3RfZG1hW0lQUl9OVU1fQ01EX0JMS1NdOworfTsKKworc3RydWN0IGlwcl9jbW5kIHsKKwlzdHJ1Y3QgaXByX2lvYXJjYiBpb2FyY2I7CisJc3RydWN0IGlwcl9pb2FzYSBpb2FzYTsKKwlzdHJ1Y3QgaXByX2lvYWRsX2Rlc2MgaW9hZGxbSVBSX05VTV9JT0FETF9FTlRSSUVTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdm9pZCAoKmRvbmUpIChzdHJ1Y3QgaXByX2NtbmQgKik7CisJaW50ICgqam9iX3N0ZXApIChzdHJ1Y3QgaXByX2NtbmQgKik7CisJdTE2IGNtZF9pbmRleDsKKwl1OCBzZW5zZV9idWZmZXJbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKKwlkbWFfYWRkcl90IHNlbnNlX2J1ZmZlcl9kbWE7CisJdW5zaWduZWQgc2hvcnQgZG1hX3VzZV9zZzsKKwlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJc3RydWN0IGlwcl9jbW5kICpzaWJsaW5nOworCXVuaW9uIHsKKwkJZW51bSBpcHJfc2h1dGRvd25fdHlwZSBzaHV0ZG93bl90eXBlOworCQlzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2I7CisJCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OworCQl1bnNpZ25lZCBsb25nIHNjcmF0Y2g7CisJCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCX0gdTsKKworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKK307CisKK3N0cnVjdCBpcHJfc2VzX3RhYmxlX2VudHJ5IHsKKwljaGFyIHByb2R1Y3RfaWRbMTddOworCWNoYXIgY29tcGFyZV9wcm9kdWN0X2lkX2J5dGVbMTddOworCXUzMiBtYXhfYnVzX3NwZWVkX2xpbWl0OwkvKiBNQi9zZWMgbGltaXQgZm9yIHRoaXMgYmFja3BsYW5lICovCit9OworCitzdHJ1Y3QgaXByX2R1bXBfaGVhZGVyIHsKKwl1MzIgZXllX2NhdGNoZXI7CisjZGVmaW5lIElQUl9EVU1QX0VZRV9DQVRDSEVSCQkweEM1RDRFM0YyCisJdTMyIGxlbjsKKwl1MzIgbnVtX2VudHJpZXM7CisJdTMyIGZpcnN0X2VudHJ5X29mZnNldDsKKwl1MzIgc3RhdHVzOworI2RlZmluZSBJUFJfRFVNUF9TVEFUVVNfU1VDQ0VTUwkJCTAKKyNkZWZpbmUgSVBSX0RVTVBfU1RBVFVTX1FVQUxfU1VDQ0VTUwkJMgorI2RlZmluZSBJUFJfRFVNUF9TVEFUVVNfRkFJTEVECQkJMHhmZmZmZmZmZgorCXUzMiBvczsKKyNkZWZpbmUgSVBSX0RVTVBfT1NfTElOVVgJMHg0QzRFNTU1OAorCXUzMiBkcml2ZXJfbmFtZTsKKyNkZWZpbmUgSVBSX0RVTVBfRFJJVkVSX05BTUUJMHg0OTUwNTIzMgorfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlciB7CisJdTMyIGV5ZV9jYXRjaGVyOworI2RlZmluZSBJUFJfRFVNUF9FWUVfQ0FUQ0hFUgkJMHhDNUQ0RTNGMgorCXUzMiBsZW47CisJdTMyIG51bV9lbGVtczsKKwl1MzIgb2Zmc2V0OworCXUzMiBkYXRhX3R5cGU7CisjZGVmaW5lIElQUl9EVU1QX0RBVEFfVFlQRV9BU0NJSQkweDQxNTM0MzQ5CisjZGVmaW5lIElQUl9EVU1QX0RBVEFfVFlQRV9CSU5BUlkJMHg0MjQ5NEU0MQorCXUzMiBpZDsKKyNkZWZpbmUgSVBSX0RVTVBfSU9BX0RVTVBfSUQJCTB4NDk0RjQxMzEKKyNkZWZpbmUgSVBSX0RVTVBfTE9DQVRJT05fSUQJCTB4NEM0RjQzNDEKKyNkZWZpbmUgSVBSX0RVTVBfVFJBQ0VfSUQJCTB4NTQ1MjQxNDMKKyNkZWZpbmUgSVBSX0RVTVBfRFJJVkVSX1ZFUlNJT05fSUQJMHg0NDUyNTY1MgorI2RlZmluZSBJUFJfRFVNUF9EUklWRVJfVFlQRV9JRAkweDU0NTk1MDQ1CisjZGVmaW5lIElQUl9EVU1QX0lPQV9DVFJMX0JMSwkJMHg0OTRGNDM0MgorI2RlZmluZSBJUFJfRFVNUF9QRU5EX09QUwkJMHg0MTRGNTA1MworCXUzMiBzdGF0dXM7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2R1bXBfbG9jYXRpb25fZW50cnkgeworCXN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIgaGRyOworCXU4IGxvY2F0aW9uW0JVU19JRF9TSVpFXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9kdW1wX3RyYWNlX2VudHJ5IHsKKwlzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyIGhkcjsKKwl1MzIgdHJhY2VbSVBSX1RSQUNFX1NJWkUgLyBzaXplb2YodTMyKV07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCitzdHJ1Y3QgaXByX2R1bXBfdmVyc2lvbl9lbnRyeSB7CisJc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlciBoZHI7CisJdTggdmVyc2lvbltzaXplb2YoSVBSX0RSSVZFUl9WRVJTSU9OKV07Cit9OworCitzdHJ1Y3QgaXByX2R1bXBfaW9hX3R5cGVfZW50cnkgeworCXN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIgaGRyOworCXUzMiB0eXBlOworCXUzMiBmd192ZXJzaW9uOworfTsKKworc3RydWN0IGlwcl9kcml2ZXJfZHVtcCB7CisJc3RydWN0IGlwcl9kdW1wX2hlYWRlciBoZHI7CisJc3RydWN0IGlwcl9kdW1wX3ZlcnNpb25fZW50cnkgdmVyc2lvbl9lbnRyeTsKKwlzdHJ1Y3QgaXByX2R1bXBfbG9jYXRpb25fZW50cnkgbG9jYXRpb25fZW50cnk7CisJc3RydWN0IGlwcl9kdW1wX2lvYV90eXBlX2VudHJ5IGlvYV90eXBlX2VudHJ5OworCXN0cnVjdCBpcHJfZHVtcF90cmFjZV9lbnRyeSB0cmFjZV9lbnRyeTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwcl9pb2FfZHVtcCB7CisJc3RydWN0IGlwcl9kdW1wX2VudHJ5X2hlYWRlciBoZHI7CisJc3RydWN0IGlwcl9zZHQgc2R0OworCV9fYmUzMiAqaW9hX2RhdGFbSVBSX01BWF9OVU1fRFVNUF9QQUdFU107CisJdTMyIHJlc2VydmVkOworCXUzMiBuZXh0X3BhZ2VfaW5kZXg7CisJdTMyIHBhZ2Vfb2Zmc2V0OworCXUzMiBmb3JtYXQ7CisjZGVmaW5lIElQUl9TRFRfRk1UMgkJMgorI2RlZmluZSBJUFJfU0RUX1VOS05PV04JCTMKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfZHVtcCB7CisJc3RydWN0IGtyZWYga3JlZjsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmc7CisJc3RydWN0IGlwcl9kcml2ZXJfZHVtcCBkcml2ZXJfZHVtcDsKKwlzdHJ1Y3QgaXByX2lvYV9kdW1wIGlvYV9kdW1wOworfTsKKworc3RydWN0IGlwcl9lcnJvcl90YWJsZV90IHsKKwl1MzIgaW9hc2M7CisJaW50IGxvZ19pb2FzYTsKKwlpbnQgbG9nX2hjYW07CisJY2hhciAqZXJyb3I7Cit9OworCitzdHJ1Y3QgaXByX3NvZnR3YXJlX2lucV9saWRfaW5mbyB7CisJX19iZTMyIGxvYWRfaWQ7CisJX19iZTMyIHRpbWVzdGFtcFszXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKK3N0cnVjdCBpcHJfdWNvZGVfaW1hZ2VfaGVhZGVyIHsKKwlfX2JlMzIgaGVhZGVyX2xlbmd0aDsKKwlfX2JlMzIgbGlkX3RhYmxlX29mZnNldDsKKwl1OCBtYWpvcl9yZWxlYXNlOworCXU4IGNhcmRfdHlwZTsKKwl1OCBtaW5vcl9yZWxlYXNlWzJdOworCXU4IHJlc2VydmVkWzIwXTsKKwljaGFyIGV5ZWNhdGNoZXJbMTZdOworCV9fYmUzMiBudW1fbGlkczsKKwlzdHJ1Y3QgaXByX3NvZnR3YXJlX2lucV9saWRfaW5mbyBsaWRbMV07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOworCisvKgorICogTWFjcm9zCisgKi8KKyNpZiBJUFJfREVCVUcKKyNkZWZpbmUgSVBSX0RCR19DTUQoQ01EKSBkbyB7IENNRDsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIElQUl9EQkdfQ01EKENNRCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDU0lfSVBSX1RSQUNFCisjZGVmaW5lIGlwcl9jcmVhdGVfdHJhY2VfZmlsZShrb2JqLCBhdHRyKSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoa29iaiwgYXR0cikKKyNkZWZpbmUgaXByX3JlbW92ZV90cmFjZV9maWxlKGtvYmosIGF0dHIpIHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShrb2JqLCBhdHRyKQorI2Vsc2UKKyNkZWZpbmUgaXByX2NyZWF0ZV90cmFjZV9maWxlKGtvYmosIGF0dHIpIDAKKyNkZWZpbmUgaXByX3JlbW92ZV90cmFjZV9maWxlKGtvYmosIGF0dHIpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0NTSV9JUFJfRFVNUAorI2RlZmluZSBpcHJfY3JlYXRlX2R1bXBfZmlsZShrb2JqLCBhdHRyKSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoa29iaiwgYXR0cikKKyNkZWZpbmUgaXByX3JlbW92ZV9kdW1wX2ZpbGUoa29iaiwgYXR0cikgc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKGtvYmosIGF0dHIpCisjZWxzZQorI2RlZmluZSBpcHJfY3JlYXRlX2R1bXBfZmlsZShrb2JqLCBhdHRyKSAwCisjZGVmaW5lIGlwcl9yZW1vdmVfZHVtcF9maWxlKGtvYmosIGF0dHIpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qCisgKiBFcnJvciBsb2dnaW5nIG1hY3JvcworICovCisjZGVmaW5lIGlwcl9lcnIoLi4uKSBwcmludGsoS0VSTl9FUlIgSVBSX05BTUUgIjogIl9fVkFfQVJHU19fKQorI2RlZmluZSBpcHJfaW5mbyguLi4pIHByaW50ayhLRVJOX0lORk8gSVBSX05BTUUgIjogIl9fVkFfQVJHU19fKQorI2RlZmluZSBpcHJfY3JpdCguLi4pIHByaW50ayhLRVJOX0NSSVQgSVBSX05BTUUgIjogIl9fVkFfQVJHU19fKQorI2RlZmluZSBpcHJfd2FybiguLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgSVBSX05BTUUiOiAiX19WQV9BUkdTX18pCisjZGVmaW5lIGlwcl9kYmcoLi4uKSBJUFJfREJHX0NNRChwcmludGsoS0VSTl9JTkZPIElQUl9OQU1FICI6ICJfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgaXByX3NkZXZfcHJpbnRrKGxldmVsLCBzZGV2LCBmbXQsIC4uLikgXAorCXByaW50ayhsZXZlbCBJUFJfTkFNRSAiOiAlZDolZDolZDolZDogIiBmbXQsIHNkZXYtPmhvc3QtPmhvc3Rfbm8sIFwKKwkJc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1biwgIyNfX1ZBX0FSR1NfXykKKworI2RlZmluZSBpcHJfc2Rldl9lcnIoc2RldiwgZm10LCAuLi4pIFwKKwlpcHJfc2Rldl9wcmludGsoS0VSTl9FUlIsIHNkZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKworI2RlZmluZSBpcHJfc2Rldl9pbmZvKHNkZXYsIGZtdCwgLi4uKSBcCisJaXByX3NkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2RldiwgZm10LCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIGlwcl9zZGV2X2RiZyhzZGV2LCBmbXQsIC4uLikgXAorCUlQUl9EQkdfQ01EKGlwcl9zZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgaXByX3Jlc19wcmludGsobGV2ZWwsIGlvYV9jZmcsIHJlcywgZm10LCAuLi4pIFwKKwlwcmludGsobGV2ZWwgSVBSX05BTUUgIjogJWQ6JWQ6JWQ6JWQ6ICIgZm10LCBpb2FfY2ZnLT5ob3N0LT5ob3N0X25vLCBcCisJCXJlcy5idXMsIHJlcy50YXJnZXQsIHJlcy5sdW4sICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgaXByX3Jlc19lcnIoaW9hX2NmZywgcmVzLCBmbXQsIC4uLikgXAorCWlwcl9yZXNfcHJpbnRrKEtFUk5fRVJSLCBpb2FfY2ZnLCByZXMsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgaXByX3Jlc19kYmcoaW9hX2NmZywgcmVzLCBmbXQsIC4uLikgXAorCUlQUl9EQkdfQ01EKGlwcl9yZXNfcHJpbnRrKEtFUk5fSU5GTywgaW9hX2NmZywgcmVzLCBmbXQsICMjX19WQV9BUkdTX18pKQorCisjZGVmaW5lIGlwcl90cmFjZSBpcHJfZGJnKCIlczogJXM6IExpbmU6ICVkXG4iLFwKKwlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKworI2lmIElQUl9EQkdfVFJBQ0UKKyNkZWZpbmUgRU5URVIgcHJpbnRrKEtFUk5fSU5GTyBJUFJfTkFNRSI6IEVudGVyaW5nICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIExFQVZFIHByaW50ayhLRVJOX0lORk8gSVBSX05BTUUiOiBMZWF2aW5nICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSBFTlRFUgorI2RlZmluZSBMRUFWRQorI2VuZGlmCisKKyNkZWZpbmUgaXByX2Vycl9zZXBhcmF0b3IgXAoraXByX2VycigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKKworCisvKgorICogSW5saW5lcworICovCisKKy8qKgorICogaXByX2lzX2lvYV9yZXNvdXJjZSAtIERldGVybWluZSBpZiBhIHJlc291cmNlIGlzIHRoZSBJT0EKKyAqIEByZXM6CXJlc291cmNlIGVudHJ5IHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkxIGlmIElPQSAvIDAgaWYgbm90IElPQQorICoqLworc3RhdGljIGlubGluZSBpbnQgaXByX2lzX2lvYV9yZXNvdXJjZShzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMpCit7CisJcmV0dXJuIChyZXMtPmNmZ3RlLmZsYWdzICYgSVBSX0lTX0lPQV9SRVNPVVJDRSkgPyAxIDogMDsKK30KKworLyoqCisgKiBpcHJfaXNfYWZfZGFzZF9kZXZpY2UgLSBEZXRlcm1pbmUgaWYgYSByZXNvdXJjZSBpcyBhbiBBRiBEQVNECisgKiBAcmVzOglyZXNvdXJjZSBlbnRyeSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMSBpZiBBRiBEQVNEIC8gMCBpZiBub3QgQUYgREFTRAorICoqLworc3RhdGljIGlubGluZSBpbnQgaXByX2lzX2FmX2Rhc2RfZGV2aWNlKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlcykKK3sKKwlpZiAoSVBSX0lTX0RBU0RfREVWSUNFKHJlcy0+Y2ZndGUuc3RkX2lucV9kYXRhKSAmJgorCSAgICAhaXByX2lzX2lvYV9yZXNvdXJjZShyZXMpICYmCisJICAgIElQUl9SRVNfU1VCVFlQRShyZXMpID09IElQUl9TVUJUWVBFX0FGX0RBU0QpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX2lzX3ZzZXRfZGV2aWNlIC0gRGV0ZXJtaW5lIGlmIGEgcmVzb3VyY2UgaXMgYSBWU0VUCisgKiBAcmVzOglyZXNvdXJjZSBlbnRyeSBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMSBpZiBWU0VUIC8gMCBpZiBub3QgVlNFVAorICoqLworc3RhdGljIGlubGluZSBpbnQgaXByX2lzX3ZzZXRfZGV2aWNlKHN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlcykKK3sKKwlpZiAoSVBSX0lTX0RBU0RfREVWSUNFKHJlcy0+Y2ZndGUuc3RkX2lucV9kYXRhKSAmJgorCSAgICAhaXByX2lzX2lvYV9yZXNvdXJjZShyZXMpICYmCisJICAgIElQUl9SRVNfU1VCVFlQRShyZXMpID09IElQUl9TVUJUWVBFX1ZPTFVNRV9TRVQpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXByX2lzX2dzY3NpIC0gRGV0ZXJtaW5lIGlmIGEgcmVzb3VyY2UgaXMgYSBnZW5lcmljIHNjc2kgcmVzb3VyY2UKKyAqIEByZXM6CXJlc291cmNlIGVudHJ5IHN0cnVjdAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqIAkxIGlmIEdTQ1NJIC8gMCBpZiBub3QgR1NDU0kKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwcl9pc19nc2NzaShzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXMpCit7CisJaWYgKCFpcHJfaXNfaW9hX3Jlc291cmNlKHJlcykgJiYKKwkgICAgSVBSX1JFU19TVUJUWVBFKHJlcykgPT0gSVBSX1NVQlRZUEVfR0VORVJJQ19TQ1NJKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9pc19kZXZpY2UgLSBEZXRlcm1pbmUgaWYgcmVzb3VyY2UgYWRkcmVzcyBpcyB0aGF0IG9mIGEgZGV2aWNlCisgKiBAcmVzX2FkZHI6CXJlc291cmNlIGFkZHJlc3Mgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTEgaWYgQUYgLyAwIGlmIG5vdCBBRgorICoqLworc3RhdGljIGlubGluZSBpbnQgaXByX2lzX2RldmljZShzdHJ1Y3QgaXByX3Jlc19hZGRyICpyZXNfYWRkcikKK3sKKwlpZiAoKHJlc19hZGRyLT5idXMgPCBJUFJfTUFYX05VTV9CVVNFUykgJiYKKwkgICAgKHJlc19hZGRyLT50YXJnZXQgPCBJUFJfTUFYX05VTV9UQVJHRVRTX1BFUl9CVVMpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwcl9zZHRfaXNfZm10MiAtIERldGVybWluZSBpZiBhIFNEVCBhZGRyZXNzIGlzIGluIGZvcm1hdCAyCisgKiBAc2R0X3dvcmQ6CVNEVCBhZGRyZXNzCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCTEgaWYgZm9ybWF0IDIgLyAwIGlmIG5vdAorICoqLworc3RhdGljIGlubGluZSBpbnQgaXByX3NkdF9pc19mbXQyKHUzMiBzZHRfd29yZCkKK3sKKwl1MzIgYmFyX3NlbCA9IElQUl9HRVRfRk1UMl9CQVJfU0VMKHNkdF93b3JkKTsKKworCXN3aXRjaCAoYmFyX3NlbCkgeworCWNhc2UgSVBSX1NEVF9GTVQyX0JBUjBfU0VMOgorCWNhc2UgSVBSX1NEVF9GTVQyX0JBUjFfU0VMOgorCWNhc2UgSVBSX1NEVF9GTVQyX0JBUjJfU0VMOgorCWNhc2UgSVBSX1NEVF9GTVQyX0JBUjNfU0VMOgorCWNhc2UgSVBSX1NEVF9GTVQyX0JBUjRfU0VMOgorCWNhc2UgSVBSX1NEVF9GTVQyX0JBUjVfU0VMOgorCWNhc2UgSVBSX1NEVF9GTVQyX0VYUF9ST01fU0VMOgorCQlyZXR1cm4gMTsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwcy5jIGIvZHJpdmVycy9zY3NpL2lwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjA5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaXBzLmMKQEAgLTAsMCArMSw3NDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpcHMuYyAtLSBkcml2ZXIgZm9yIHRoZSBBZGFwdGVjIC8gSUJNIFNlcnZlUkFJRCBjb250cm9sbGVyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXcml0dGVuIEJ5OiBLZWl0aCBNaXRjaGVsbCwgSUJNIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBKYWNrIEhhbW1lciwgQWRhcHRlYywgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBEYXZpZCBKZWZmZXJ5LCBBZGFwdGVjLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDAgSUJNIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBBZGFwdGVjLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgICovCisvKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAgICovCisvKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAgICovCisvKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICovCisvKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICovCisvKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAgICovCisvKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOTyBXQVJSQU5UWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgICAgICAgICovCisvKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgICovCisvKiBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCAgICAgICovCisvKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzICAgICovCisvKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgICovCisvKiBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgICAgICAgICovCisvKiBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gICAgICovCisvKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgICovCisvKiBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSAgICovCisvKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgICAgICAgICovCisvKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCAgICovCisvKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgICAgICovCisvKiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFICAgICovCisvKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgICovCisvKiBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgICovCisvKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgICovCisvKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWdzL0NvbW1lbnRzL1N1Z2dlc3Rpb25zIGFib3V0IHRoaXMgZHJpdmVyIHNob3VsZCBiZSBtYWlsZWQgdG86ICAgICAgICAgICovCisvKiAgICAgIGlwc2xpbnV4QGFkYXB0ZWMuY29tICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGb3Igc3lzdGVtIHN1cHBvcnQgaXNzdWVzLCBjb250YWN0IHlvdXIgbG9jYWwgSUJNIEN1c3RvbWVyIHN1cHBvcnQuICAgICAgICovCisvKiBEaXJlY3Rpb25zIHRvIGZpbmQgSUJNIEN1c3RvbWVyIFN1cHBvcnQgZm9yIGVhY2ggY291bnRyeSBjYW4gYmUgZm91bmQgYXQ6ICovCisvKiAgICAgIGh0dHA6Ly93d3cuaWJtLmNvbS9wbGFuZXR3aWRlLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENoYW5nZSBMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDAuOTkuMDIgIC0gQnJlYWt1cCBjb21tYW5kcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiA4ICogdGhlIHN0cmlwZSBzaXplICAgICAgKi8KKy8qIDAuOTkuMDMgIC0gTWFrZSBpbnRlcnJ1cHQgcm91dGluZSBoYW5kbGUgYWxsIGNvbXBsZXRlZCByZXF1ZXN0IG9uIHRoZSAgICAgKi8KKy8qICAgICAgICAgICAgYWRhcHRlciBub3QganVzdCB0aGUgZmlyc3Qgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gTWFrZSBzdXJlIHBhc3N0aHJ1IGNvbW1hbmRzIGdldCB3b2tlbiB1cCBpZiB3ZSBydW4gb3V0IG9mICAgICAgKi8KKy8qICAgICAgICAgICAgU0NCcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gU2VuZCBhbGwgb2YgdGhlIGNvbW1hbmRzIG9uIHRoZSBxdWV1ZSBhdCBvbmNlIHJhdGhlciB0aGFuICAgICAgKi8KKy8qICAgICAgICAgICAgb25lIGF0IGEgdGltZSBzaW5jZSB0aGUgY2FyZCB3aWxsIHN1cHBvcnQgaXQuICAgICAgICAgICAgICAgICAgKi8KKy8qIDAuOTkuMDQgIC0gRml4IHJhY2UgY29uZGl0aW9uIGluIHRoZSBwYXNzdGhydSBtZWNoYW5pc20gLS0gdGhpcyByZXF1aXJlZCAgKi8KKy8qICAgICAgICAgICAgdGhlIGludGVyZmFjZSB0byB0aGUgdXRpbGl0aWVzIHRvIGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gRml4IGVycm9yIHJlY292ZXJ5IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDAuOTkuMDUgIC0gRml4IGFuIG9vcHMgd2hlbiB3ZSBnZXQgY2VydGFpbiBwYXNzdGhydSBjb21tYW5kcyAgICAgICAgICAgICAgKi8KKy8qIDEuMDAuMDAgIC0gSW5pdGlhbCBQdWJsaWMgUmVsZWFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gMC45OS4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDMuNjAuMDAgIC0gQnVtcCBtYXggY29tbWFuZHMgdG8gMTI4IGZvciB1c2Ugd2l0aCBmaXJtd2FyZSAzLjYwICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gQ2hhbmdlIHZlcnNpb24gdG8gMy42MCB0byBjb2luY2lkZSB3aXRoIHJlbGVhc2UgbnVtYmVyaW5nLiAgICAgKi8KKy8qIDMuNjAuMDEgIC0gUmVtb3ZlIGJvZ3VzIGVycm9yIGNoZWNrIGluIHBhc3N0aHJ1IHJvdXRpbmUgICAgICAgICAgICAgICAgICAgKi8KKy8qIDMuNjAuMDIgIC0gTWFrZSBEQ0RCIGRpcmVjdGlvbiBiYXNlZCBvbiBsb29rdXAgdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gT25seSBhbGxvdyBvbmUgRENEQiBjb21tYW5kIHRvIGEgU0NTSSBJRCBhdCBhIHRpbWUgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDAgIC0gQWRkIHN1cHBvcnQgZm9yIFNlcnZlUkFJRCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDEgIC0gQWRkIHN1cHBvcnQgZm9yIEZpcnN0IEZhaWx1cmUgRGF0YSBDYXB0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDIgIC0gRml4IHByb2JsZW0gd2l0aCBQVCBEQ0RCIHdpdGggbm8gYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDMgIC0gQWRkIGFsdGVybmF0aXZlIHBhc3N0aHJ1IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gQWRkIGFiaWxpdHkgdG8gZmxhc2ggQklPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDQgIC0gUmVuYW1lIHN0cnVjdHVyZXMvY29uc3RhbnRzIHRvIGJlIHByZWZpeGVkIHdpdGggSVBTXyAgICAgICAgICAgKi8KKy8qIDQuMDAuMDUgIC0gUmVtb3ZlIHdpc2hfYmxvY2sgZnJvbSBpbml0IHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gVXNlIGxpbnV4L3NwaW5sb2NrLmggaW5zdGVhZCBvZiBhc20vc3BpbmxvY2suaCBmb3Iga2VybmVscyAgICAgKi8KKy8qICAgICAgICAgICAgMi4zLjE4IGFuZCBsYXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gU3luYyB3aXRoIG90aGVyIGNoYW5nZXMgZnJvbSB0aGUgMi4zIGtlcm5lbHMgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDYgIC0gRml4IHRpbWVvdXQgd2l0aCBpbml0aWFsIEZGREMgY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMDAuMDZhIC0gUG9ydCB0byAyLjQgKHRyaXZpYWwpIC0tIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4gKi8KKy8qIDQuMTAuMDAgIC0gQWRkIHN1cHBvcnQgZm9yIFNlcnZlUkFJRCA0TS80TCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMTAuMTMgIC0gRml4IGZvciBkeW5hbWljIHVubG9hZCBhbmQgcHJvYyBmaWxlIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMjAuMDMgIC0gUmVuYW1lIHZlcnNpb24gdG8gY29pbmNpZGUgd2l0aCBuZXcgcmVsZWFzZSBzY2hlZHVsZXMgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgUGVyZm9ybWFuY2UgZml4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgRml4IHRydW5jYXRpb24gb2YgL3Byb2MgZmlsZXMgd2l0aCBjYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgTWVyZ2UgaW4gY2hhbmdlcyB0aHJvdWdoIGtlcm5lbCAyLjQuMHRlc3QxYWMyMSAgICAgICAgICAgICAgICAgKi8KKy8qIDQuMjAuMTMgIC0gRml4IHNvbWUgZmFpbHVyZSBjYXNlcyAvIHJlc2V0IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gSG9vayBpbnRvIHRoZSByZWJvb3Rfbm90aWZpZXIgdG8gZmx1c2ggdGhlIGNvbnRyb2xsZXIgY2FjaGUgICAgKi8KKy8qIDQuNTAuMDEgIC0gRml4IHByb2JsZW0gd2hlbiB0aGVyZSBpcyBhIGhvbGUgaW4gbG9naWNhbCBkcml2ZSBudW1iZXJpbmcgICAgKi8KKy8qIDQuNzAuMDkgIC0gVXNlIGEgQ29tbW9uICggTGFyZ2UgQnVmZmVyICkgZm9yIEZsYXNoaW5nIGZyb20gdGhlIEpDUk0gQ0QgICAgKi8KKy8qICAgICAgICAgIC0gQWRkIElQU1NFTkQgRmxhc2ggU3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gU2V0IFNlbnNlIERhdGEgZm9yIFVua25vd24gU0NTSSBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gVXNlIFNsb3QgTnVtYmVyIGZyb20gTlZSQU0gUGFnZSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gUmVzdG9yZSBjYWxsZXIncyBEQ0RCIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuNzAuMTIgIC0gQ29ycmVjdGl2ZSBhY3Rpb25zIGZvciBiYWQgY29udHJvbGxlciAoIGR1cmluZyBpbml0aWFsaXphdGlvbiApKi8KKy8qIDQuNzAuMTMgIC0gRG9uJ3QgU2VuZCBDREIncyBpZiB3ZSBhbHJlYWR5IGtub3cgdGhlIGRldmljZSBpcyBub3QgcHJlc2VudCAgKi8KKy8qICAgICAgICAgIC0gRG9uJ3QgcmVsZWFzZSBIQSBMb2NrIGluIGlwc19uZXh0KCkgdW50aWwgU0MgdGFrZW4gb2ZmIHF1ZXVlICAgKi8KKy8qICAgICAgICAgIC0gVW5yZWdpc3RlciBTQ1NJIGRldmljZSBpbiBpcHNfcmVsZWFzZSgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuNzAuMTUgIC0gRml4IEJyZWFrdXAgZm9yIHZlcnkgbGFyZ2UgKCBub24tU0cgKSByZXF1ZXN0cyBpbiBpcHNfZG9uZSgpICAgKi8KKy8qIDQuNzEuMDAgIC0gQ2hhbmdlIGFsbCBtZW1vcnkgYWxsb2NhdGlvbnMgdG8gbm90IHVzZSBHRlBfRE1BIGZsYWcgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgQ29kZSBDbGVhbi1VcCBmb3IgMi40Lngga2VybmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuNzIuMDAgIC0gQWxsb3cgZm9yIGEgU2NhdHRlci1HYXRoZXIgRWxlbWVudCB0byBleGNlZWQgTUFYX1hGRVIgU2l6ZSAgICAgKi8KKy8qIDQuNzIuMDEgIC0gSS9PIE1hcHBlZCBNZW1vcnkgcmVsZWFzZSAoIHNvICJpbnNtb2QgaXBzIiBkb2VzIG5vdCBGYWlsICkgICAgKi8KKy8qICAgICAgICAgIC0gRG9uJ3QgSXNzdWUgSW50ZXJuYWwgRkZEQyBDb21tYW5kIGlmIHRoZXJlIGFyZSBBY3RpdmUgQ29tbWFuZHMgKi8KKy8qICAgICAgICAgIC0gQ2xvc2UgV2luZG93IGZvciBnZXR0aW5nIHRvbyBtYW55IElPQ1RMJ3MgYWN0aXZlICAgICAgICAgICAgICAgKi8KKy8qIDQuODAuMDAgIC0gTWFrZSBpYTY0IFNhZmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuODAuMDQgIC0gRWxpbWluYXRlIGNhbGxzIHRvIHN0cnRvaygpIGlmIDIuNC54IG9yIGdyZWF0ZXIgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gQWRqdXN0bWVudHMgdG8gRGV2aWNlIFF1ZXVlIERlcHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuODAuMTQgIC0gVGFrZSBhbGwgc2VtYXBob3JlcyBvZmYgc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gQ2xlYW4gVXAgTmV3X0lPQ1RMIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuODAuMjAgIC0gU2V0IG1heF9zZWN0b3JzIGluIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgKCBpZiA+PSAyLjQuNyBrZXJuZWwgKSAgKi8KKy8qICAgICAgICAgIC0gNSBzZWNvbmQgZGVsYXkgbmVlZGVkIGFmdGVyIHJlc2V0dGluZyBhbiBpOTYwIGFkYXB0ZXIgICAgICAgICAgKi8KKy8qIDQuODAuMjYgIC0gQ2xlYW4gdXAgcG90ZW50aWFsIGNvZGUgcHJvYmxlbXMgKCBBcmphbidzIHJlY29tbWVuZGF0aW9ucyApICAgKi8KKy8qIDQuOTAuMDEgIC0gVmVyc2lvbiBNYXRjaGluZyBmb3IgRmlybVdhcmUsIEJJT1MsIGFuZCBEcml2ZXIgICAgICAgICAgICAgICAgKi8KKy8qIDQuOTAuMDUgIC0gVXNlIE5ldyBQQ0kgQXJjaGl0ZWN0dXJlIHRvIGZhY2lsaXRhdGUgSG90IFBsdWcgRGV2ZWxvcG1lbnQgICAgKi8KKy8qIDQuOTAuMDggIC0gSW5jcmVhc2UgRGVsYXlzIGluIEZsYXNoaW5nICggVHJvbWJvbmUgT25seSAtIDRIICkgICAgICAgICAgICAgKi8KKy8qIDQuOTAuMDggIC0gRGF0YSBDb3JydXB0aW9uIGlmIEZpcnN0IFNjYXR0ZXIgR2F0aGVyIEVsZW1lbnQgaXMgPiA2NEsgICAgICAgKi8KKy8qIDQuOTAuMTEgIC0gRG9uJ3QgYWN0dWFsbHkgUkVTRVQgdW5sZXNzIGl0J3MgcGh5c2ljYWxseSByZXF1aXJlZCAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gUmVtb3ZlIHVudXNlZCBjb21waWxlIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDUuMDAuMDEgIC0gU2FyYXNvdGEgKCA1aSApIGFkYXB0ZXJzIG11c3QgYWx3YXlzIGJlIHNjYW5uZWQgZmlyc3QgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gR2V0IHJpZCBvbiBJT0NUTF9ORVdfQ09NTUFORCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gQWRkIEV4dGVuZGVkIERDREIgQ29tbWFuZHMgZm9yIFRhcGUgU3VwcG9ydCBpbiA1SSAgICAgICAgICAgICAgKi8KKy8qIDUuMTAuMTIgIC0gdXNlIHBjaV9kbWEgaW50ZXJmYWNlcywgdXBkYXRlIGZvciAyLjUga2VybmVsIGNoYW5nZXMgICAgICAgICAgKi8KKy8qIDUuMTAuMTUgIC0gcmVtb3ZlIHVudXNlZCBjb2RlIChzZW0sIG1hY3JvcywgZXRjLikgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDUuMzAuMDAgIC0gdXNlIF9fZGV2ZXhpdF9wKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDYuMDAuMDAgIC0gQWRkIDZ4IEFkYXB0ZXJzIGFuZCBCYXR0ZXJ5IEZsYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDYuMTAuMDAgIC0gUmVtb3ZlIDFHIEFkZHJlc3NpbmcgTGltaXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDYuMTEueHggIC0gR2V0IFZlcnNpb25JbmZvIGJ1ZmZlciBvZmYgdGhlIHN0YWNrICEgICAgICAgICAgICAgIEREVFMgNjA0MDEgKi8KKy8qIDYuMTEueHggIC0gTWFrZSBMb2dpY2FsIERyaXZlIEluZm8gc3RydWN0dXJlIHNhZmUgZm9yIERNQSAgICAgIEREVFMgNjA2MzkgKi8KKy8qIDcuMTAueHggIC0gQWRkIGhpZ2htZW1faW8gZmxhZyBpbiBTQ1NJIFRlbXBsZXRlIGZvciAyLjQga2VybmVscyAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gRml4IHBhdGgvbmFtZSBmb3Igc2NzaV9ob3N0cy5oIGluY2x1ZGUgZm9yIDIuNiBrZXJuZWxzICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gRml4IHNvcnQgb3JkZXIgb2YgN2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIC0gUmVtb3ZlIDMgdW51c2VkICJpbmxpbmUiIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uIGRpcmVjdGl2ZXMgZm9yIHRoaXMgZHJpdmVyOgorICoKKyAqIElQU19ERUJVRyAgICAgICAgICAgIC0gVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbworICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZGVidWc6PG51bWJlcj4gICAgICAgLSBTZXQgZGVidWcgbGV2ZWwgdG8gPG51bWJlcj4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogb25seSB3b3JrcyB3aGVuIElQU19ERUJVRyBjb21waWxlIGRpcmVjdGl2ZSBpcyB1c2VkLgorICogICAgICAgMSAgICAgICAgICAgICAgLSBOb3JtYWwgZGVidWcgbWVzc2FnZXMKKyAqICAgICAgIDIgICAgICAgICAgICAgIC0gVmVyYm9zZSBkZWJ1ZyBtZXNzYWdlcworICogICAgICAgMTEgICAgICAgICAgICAgLSBNZXRob2QgdHJhY2UgKG5vbiBpbnRlcnJ1cHQpCisgKiAgICAgICAxMiAgICAgICAgICAgICAtIE1ldGhvZCB0cmFjZSAoaW5jbHVkZXMgaW50ZXJydXB0KQorICoKKyAqIG5vaTJvICAgICAgICAgICAgICAgIC0gRG9uJ3QgdXNlIEkyTyBRdWV1ZXMgKFNlcnZlUkFJRCA0IG9ubHkpCisgKiBub21tYXAgICAgICAgICAgICAgICAtIERvbid0IHVzZSBtZW1vcnkgbWFwcGVkIEkvTworICogaW9jdGxzaXplICAgICAgICAgICAgLSBJbml0aWFsIHNpemUgb2YgdGhlIElPQ1RMIGJ1ZmZlcgorICovCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2luY2x1ZGUgImhvc3RzLmgiCisjZWxzZQorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImlwcy5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqaXBzID0gTlVMTDsKK21vZHVsZV9wYXJhbShpcHMsIGNoYXJwLCAwKTsKKyNlbmRpZgorCisvKgorICogRFJJVkVSX1ZFUgorICovCisjZGVmaW5lIElQU19WRVJTSU9OX0hJR0ggICAgICAgICI3LjEwIgorI2RlZmluZSBJUFNfVkVSU0lPTl9MT1cgICAgICAgICAiLjE4ICIKKworI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX2lhNjRfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKKyN3YXJuaW5nICJUaGlzIGRyaXZlciBoYXMgb25seSBiZWVuIHRlc3RlZCBvbiB0aGUgeDg2L2lhNjQveDg2XzY0IHBsYXRmb3JtcyIKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2luY2x1ZGUgPGxpbnV4L2Jsay5oPgorI2luY2x1ZGUgInNkLmgiCisjZGVmaW5lIElQU19TR19BRERSRVNTKHNnKSAgICAgICAoKHNnKS0+YWRkcmVzcykKKyNkZWZpbmUgSVBTX0xPQ0tfU0FWRShsb2NrLGZsYWdzKSBzcGluX2xvY2tfaXJxc2F2ZSgmaW9fcmVxdWVzdF9sb2NrLGZsYWdzKQorI2RlZmluZSBJUFNfVU5MT0NLX1JFU1RPUkUobG9jayxmbGFncykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9fcmVxdWVzdF9sb2NrLGZsYWdzKQorI2lmbmRlZiBfX2RldmV4aXRfcAorI2RlZmluZSBfX2RldmV4aXRfcCh4KSB4CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIElQU19TR19BRERSRVNTKHNnKSAgICAgIChwYWdlX2FkZHJlc3MoKHNnKS0+cGFnZSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSsoc2cpLT5vZmZzZXQgOiBOVUxMKQorI2RlZmluZSBJUFNfTE9DS19TQVZFKGxvY2ssZmxhZ3MpIGRve3NwaW5fbG9jayhsb2NrKTsodm9pZClmbGFnczt9d2hpbGUoMCkKKyNkZWZpbmUgSVBTX1VOTE9DS19SRVNUT1JFKGxvY2ssZmxhZ3MpIGRve3NwaW5fdW5sb2NrKGxvY2spOyh2b2lkKWZsYWdzO313aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgSVBTX0RNQV9ESVIoc2NiKSAoKCFzY2ItPnNjc2lfY21kIHx8IGlwc19pc19wYXNzdGhydShzY2ItPnNjc2lfY21kKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSV9EQVRBX05PTkUgPT0gc2NiLT5zY3NpX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKHNjYi0+c2NzaV9jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSkKKworI2lmZGVmIElQU19ERUJVRworI2RlZmluZSBNRVRIT0RfVFJBQ0UocywgaSkgICAgaWYgKGlwc19kZWJ1ZyA+PSAoaSsxMCkpIHByaW50ayhLRVJOX05PVElDRSBzICJcbiIpOworI2RlZmluZSBERUJVRyhpLCBzKSAgICAgICAgICAgaWYgKGlwc19kZWJ1ZyA+PSBpKSBwcmludGsoS0VSTl9OT1RJQ0UgcyAiXG4iKTsKKyNkZWZpbmUgREVCVUdfVkFSKGksIHMsIHYuLi4pIGlmIChpcHNfZGVidWcgPj0gaSkgcHJpbnRrKEtFUk5fTk9USUNFIHMgIlxuIiwgdik7CisjZWxzZQorI2RlZmluZSBNRVRIT0RfVFJBQ0UocywgaSkKKyNkZWZpbmUgREVCVUcoaSwgcykKKyNkZWZpbmUgREVCVUdfVkFSKGksIHMsIHYuLi4pCisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBpcHNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBpbnQgaXBzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2VoX2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgaXBzX2VoX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgaXBzX3F1ZXVlKFNjc2lfQ21uZCAqLCB2b2lkICgqKShTY3NpX0NtbmQgKikpOworc3RhdGljIGNvbnN0IGNoYXIgKmlwc19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZG9faXBzaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW50IGlwc19oYWluaXQoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19tYXBfc3RhdHVzKGlwc19oYV90ICosIGlwc19zY2JfdCAqLCBpcHNfc3RhdF90ICopOworc3RhdGljIGludCBpcHNfc2VuZF93YWl0KGlwc19oYV90ICosIGlwc19zY2JfdCAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IGlwc19zZW5kX2NtZChpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19vbmxpbmUoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfaW5xdWlyeShpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19yZGNhcChpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19tc2Vuc2UoaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfcmVxc2VuKGlwc19oYV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2RlYWxsb2NhdGVzY2JzKGlwc19oYV90ICosIGludCk7CitzdGF0aWMgaW50IGlwc19hbGxvY2F0ZXNjYnMoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19yZXNldF9jb3BwZXJoZWFkKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfcmVzZXRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX3Jlc2V0X21vcnBoZXVzKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaXNzdWVfY29wcGVyaGVhZChpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19pc3N1ZV9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lzc3VlX2kybyhpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgaW50IGlwc19pc3N1ZV9pMm9fbWVtaW8oaXBzX2hhX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfaXNpbnRyX2NvcHBlcmhlYWQoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pc2ludHJfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lzaW50cl9tb3JwaGV1cyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX3dhaXQoaXBzX2hhX3QgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBpcHNfd3JpdGVfZHJpdmVyX3N0YXR1cyhpcHNfaGFfdCAqLCBpbnQpOworc3RhdGljIGludCBpcHNfcmVhZF9hZGFwdGVyX3N0YXR1cyhpcHNfaGFfdCAqLCBpbnQpOworc3RhdGljIGludCBpcHNfcmVhZF9zdWJzeXN0ZW1fcGFyYW1ldGVycyhpcHNfaGFfdCAqLCBpbnQpOworc3RhdGljIGludCBpcHNfcmVhZF9jb25maWcoaXBzX2hhX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX2NsZWFyX2FkYXB0ZXIoaXBzX2hhX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX3JlYWR3cml0ZV9wYWdlNShpcHNfaGFfdCAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IGlwc19pbml0X2NvcHBlcmhlYWQoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pbml0X2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pbml0X21vcnBoZXVzKGlwc19oYV90ICopOworc3RhdGljIGludCBpcHNfaXNpbml0X2NvcHBlcmhlYWQoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pc2luaXRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2lzaW5pdF9tb3JwaGV1cyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2VyYXNlX2Jpb3MoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19wcm9ncmFtX2Jpb3MoaXBzX2hhX3QgKiwgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QpOworc3RhdGljIGludCBpcHNfdmVyaWZ5X2Jpb3MoaXBzX2hhX3QgKiwgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QpOworc3RhdGljIGludCBpcHNfZXJhc2VfYmlvc19tZW1pbyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX3Byb2dyYW1fYmlvc19tZW1pbyhpcHNfaGFfdCAqLCBjaGFyICosIHVpbnQzMl90LCB1aW50MzJfdCk7CitzdGF0aWMgaW50IGlwc192ZXJpZnlfYmlvc19tZW1pbyhpcHNfaGFfdCAqLCBjaGFyICosIHVpbnQzMl90LCB1aW50MzJfdCk7CitzdGF0aWMgaW50IGlwc19mbGFzaF9jb3BwZXJoZWFkKGlwc19oYV90ICosIGlwc19wYXNzdGhydV90ICosIGlwc19zY2JfdCAqKTsKK3N0YXRpYyBpbnQgaXBzX2ZsYXNoX2Jpb3MoaXBzX2hhX3QgKiwgaXBzX3Bhc3N0aHJ1X3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIGludCBpcHNfZmxhc2hfZmlybXdhcmUoaXBzX2hhX3QgKiwgaXBzX3Bhc3N0aHJ1X3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX2ZyZWVfZmxhc2hfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKTsKK3N0YXRpYyB2b2lkIGlwc19nZXRfYmlvc192ZXJzaW9uKGlwc19oYV90ICosIGludCk7CitzdGF0aWMgdm9pZCBpcHNfaWRlbnRpZnlfY29udHJvbGxlcihpcHNfaGFfdCAqKTsKK3N0YXRpYyB2b2lkIGlwc19jaGtzdGF0dXMoaXBzX2hhX3QgKiwgSVBTX1NUQVRVUyAqKTsKK3N0YXRpYyB2b2lkIGlwc19lbmFibGVfaW50X2NvcHBlcmhlYWQoaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX2VuYWJsZV9pbnRfbW9ycGhldXMoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pbnRyX2NvcHBlcmhlYWQoaXBzX2hhX3QgKik7CitzdGF0aWMgaW50IGlwc19pbnRyX21vcnBoZXVzKGlwc19oYV90ICopOworc3RhdGljIHZvaWQgaXBzX25leHQoaXBzX2hhX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGlwc2ludHJfYmxvY2tpbmcoaXBzX2hhX3QgKiwgc3RydWN0IGlwc19zY2IgKik7CitzdGF0aWMgdm9pZCBpcHNpbnRyX2RvbmUoaXBzX2hhX3QgKiwgc3RydWN0IGlwc19zY2IgKik7CitzdGF0aWMgdm9pZCBpcHNfZG9uZShpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfZnJlZShpcHNfaGFfdCAqKTsKK3N0YXRpYyB2b2lkIGlwc19pbml0X3NjYihpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfZnJlZXNjYihpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfc2V0dXBfZnVuY2xpc3QoaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfc3RhdGluaXQoaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfc3RhdGluaXRfbWVtaW8oaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfZml4X2ZmZGNfdGltZShpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKiwgdGltZV90KTsKK3N0YXRpYyB2b2lkIGlwc19mZmRjX3Jlc2V0KGlwc19oYV90ICosIGludCk7CitzdGF0aWMgdm9pZCBpcHNfZmZkY190aW1lKGlwc19oYV90ICopOworc3RhdGljIHVpbnQzMl90IGlwc19zdGF0dXBkX2NvcHBlcmhlYWQoaXBzX2hhX3QgKik7CitzdGF0aWMgdWludDMyX3QgaXBzX3N0YXR1cGRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqKTsKK3N0YXRpYyB1aW50MzJfdCBpcHNfc3RhdHVwZF9tb3JwaGV1cyhpcHNfaGFfdCAqKTsKK3N0YXRpYyBpcHNfc2NiX3QgKmlwc19nZXRzY2IoaXBzX2hhX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfcHV0cV9zY2JfaGVhZChpcHNfc2NiX3F1ZXVlX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIHZvaWQgaXBzX3B1dHFfd2FpdF90YWlsKGlwc193YWl0X3F1ZXVlX3QgKiwgU2NzaV9DbW5kICopOworc3RhdGljIHZvaWQgaXBzX3B1dHFfY29wcF90YWlsKGlwc19jb3BwX3F1ZXVlX3QgKiwKKwkJCQkgICAgICBpcHNfY29wcF93YWl0X2l0ZW1fdCAqKTsKK3N0YXRpYyBpcHNfc2NiX3QgKmlwc19yZW1vdmVxX3NjYl9oZWFkKGlwc19zY2JfcXVldWVfdCAqKTsKK3N0YXRpYyBpcHNfc2NiX3QgKmlwc19yZW1vdmVxX3NjYihpcHNfc2NiX3F1ZXVlX3QgKiwgaXBzX3NjYl90ICopOworc3RhdGljIFNjc2lfQ21uZCAqaXBzX3JlbW92ZXFfd2FpdF9oZWFkKGlwc193YWl0X3F1ZXVlX3QgKik7CitzdGF0aWMgU2NzaV9DbW5kICppcHNfcmVtb3ZlcV93YWl0KGlwc193YWl0X3F1ZXVlX3QgKiwgU2NzaV9DbW5kICopOworc3RhdGljIGlwc19jb3BwX3dhaXRfaXRlbV90ICppcHNfcmVtb3ZlcV9jb3BwKGlwc19jb3BwX3F1ZXVlX3QgKiwKKwkJCQkJCSAgICAgaXBzX2NvcHBfd2FpdF9pdGVtX3QgKik7CitzdGF0aWMgaXBzX2NvcHBfd2FpdF9pdGVtX3QgKmlwc19yZW1vdmVxX2NvcHBfaGVhZChpcHNfY29wcF9xdWV1ZV90ICopOworCitzdGF0aWMgaW50IGlwc19pc19wYXNzdGhydShTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IGlwc19tYWtlX3Bhc3N0aHJ1KGlwc19oYV90ICosIFNjc2lfQ21uZCAqLCBpcHNfc2NiX3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaXBzX3VzcmNtZChpcHNfaGFfdCAqLCBpcHNfcGFzc3RocnVfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfY2xlYW51cF9wYXNzdGhydShpcHNfaGFfdCAqLCBpcHNfc2NiX3QgKik7CitzdGF0aWMgdm9pZCBpcHNfc2NtZF9idWZfd3JpdGUoU2NzaV9DbW5kICogc2NtZCwgdm9pZCAqZGF0YSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgaXBzX3NjbWRfYnVmX3JlYWQoU2NzaV9DbW5kICogc2NtZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKKworc3RhdGljIGludCBpcHNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQpOworc3RhdGljIGludCBpcHNfaG9zdF9pbmZvKGlwc19oYV90ICosIGNoYXIgKiwgb2ZmX3QsIGludCk7CitzdGF0aWMgdm9pZCBjb3B5X21lbV9pbmZvKElQU19JTkZPU1RSICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgY29weV9pbmZvKElQU19JTkZPU1RSICosIGNoYXIgKiwgLi4uKTsKK3N0YXRpYyBpbnQgaXBzX2dldF92ZXJzaW9uX2luZm8oaXBzX2hhX3QgKiBoYSwgZG1hX2FkZHJfdCwgaW50IGludHIpOworc3RhdGljIHZvaWQgaXBzX3ZlcnNpb25fY2hlY2soaXBzX2hhX3QgKiBoYSwgaW50IGludHIpOworc3RhdGljIGludCBpcHNfYWJvcnRfaW5pdChpcHNfaGFfdCAqIGhhLCBpbnQgaW5kZXgpOworc3RhdGljIGludCBpcHNfaW5pdF9waGFzZTIoaW50IGluZGV4KTsKKworc3RhdGljIGludCBpcHNfaW5pdF9waGFzZTEoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGludCAqaW5kZXhQdHIpOworc3RhdGljIGludCBpcHNfcmVnaXN0ZXJfc2NzaShpbnQgaW5kZXgpOworCisvKgorICogZ2xvYmFsIHZhcmlhYmxlcworICovCitzdGF0aWMgY29uc3QgY2hhciBpcHNfbmFtZVtdID0gImlwcyI7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqaXBzX3NoW0lQU19NQVhfQURBUFRFUlNdOwkvKiBBcnJheSBvZiBob3N0IGNvbnRyb2xsZXIgc3RydWN0dXJlcyAqLworc3RhdGljIGlwc19oYV90ICppcHNfaGFbSVBTX01BWF9BREFQVEVSU107CS8qIEFycmF5IG9mIEhBIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBzX25leHRfY29udHJvbGxlcjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBzX251bV9jb250cm9sbGVyczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBzX3JlbGVhc2VkX2NvbnRyb2xsZXJzOworc3RhdGljIGludCBpcHNfaG90cGx1ZzsKK3N0YXRpYyBpbnQgaXBzX2NtZF90aW1lb3V0ID0gNjA7CitzdGF0aWMgaW50IGlwc19yZXNldF90aW1lb3V0ID0gNjAgKiA1Oworc3RhdGljIGludCBpcHNfZm9yY2VfbWVtaW8gPSAxOwkJLyogQWx3YXlzIHVzZSBNZW1vcnkgTWFwcGVkIEkvTyAgICAqLworc3RhdGljIGludCBpcHNfZm9yY2VfaTJvID0gMTsJLyogQWx3YXlzIHVzZSBJMk8gY29tbWFuZCBkZWxpdmVyeSAqLworc3RhdGljIGludCBpcHNfaW9jdGxzaXplID0gSVBTX0lPQ1RMX1NJWkU7CS8qIFNpemUgb2YgdGhlIGlvY3RsIGJ1ZmZlciAgICAgICAgKi8KK3N0YXRpYyBpbnQgaXBzX2NkX2Jvb3Q7CQkJLyogQm9vdGluZyBmcm9tIE1hbmFnZXIgQ0QgICAgICAgICAqLworc3RhdGljIGNoYXIgKmlwc19GbGFzaERhdGEgPSBOVUxMOwkvKiBDRCBCb290IC0gRmxhc2ggRGF0YSBCdWZmZXIgICAgICAqLworc3RhdGljIGRtYV9hZGRyX3QgaXBzX2ZsYXNoYnVzYWRkcjsKK3N0YXRpYyBsb25nIGlwc19GbGFzaERhdGFJblVzZTsJCS8qIENEIEJvb3QgLSBGbGFzaCBEYXRhIEluIFVzZSBGbGFnICovCitzdGF0aWMgdWludDMyX3QgTWF4TGl0ZUNtZHMgPSAzMjsJLyogTWF4IEFjdGl2ZSBDbWRzIGZvciBhIExpdGUgQWRhcHRlciAqLworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBpcHNfZHJpdmVyX3RlbXBsYXRlID0geworCS5kZXRlY3QJCQk9IGlwc19kZXRlY3QsCisJLnJlbGVhc2UJCT0gaXBzX3JlbGVhc2UsCisJLmluZm8JCQk9IGlwc19pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gaXBzX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gaXBzX2VoX2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBpcHNfZWhfcmVzZXQsCisJLnByb2NfbmFtZQkJPSAiaXBzIiwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkucHJvY19pbmZvCQk9IGlwc19wcm9jX2luZm8sCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGlwc19zbGF2ZV9jb25maWd1cmUsCisjZWxzZQorCS5wcm9jX2luZm8JCT0gaXBzX3Byb2MyNF9pbmZvLAorCS5zZWxlY3RfcXVldWVfZGVwdGhzCT0gaXBzX3NlbGVjdF9xdWV1ZV9kZXB0aCwKKyNlbmRpZgorCS5iaW9zX3BhcmFtCQk9IGlwc19iaW9zcGFyYW0sCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBJUFNfTUFYX1NHLAorCS5jbWRfcGVyX2x1bgkJPSAzLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkudXNlX25ld19laF9jb2RlCT0gMSwKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjApICAmJiAgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgLmhpZ2htZW1faW8gICAgICAgICAgPSAxLCAgIAorI2VuZGlmCit9OworCitzdGF0aWMgSVBTX0RFRklORV9DT01QQVRfVEFCTEUoIENvbXBhdGFibGUgKTsJLyogVmVyc2lvbiBDb21wYXRhYmlsaXR5IFRhYmxlICAgICAgKi8KKworCisvKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgU2VydmVSQUlEIEFkYXB0ZXJzICovCitzdGF0aWMgc3RydWN0ICBwY2lfZGV2aWNlX2lkICBpcHNfcGNpX3RhYmxlW10gPSB7CisJeyAweDEwMTQsIDB4MDAyRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgMHgxMDE0LCAweDAxQkQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDB4OTAwNSwgMHgwMjUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKCBwY2ksIGlwc19wY2lfdGFibGUgKTsKKworc3RhdGljIGNoYXIgaXBzX2hvdF9wbHVnX25hbWVbXSA9ICJpcHMiOworICAgCitzdGF0aWMgaW50IF9fZGV2aW5pdCAgaXBzX2luc2VydF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGlwc19yZW1vdmVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKKyAgIAorc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlwc19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IGlwc19ob3RfcGx1Z19uYW1lLAorCS5pZF90YWJsZQk9IGlwc19wY2lfdGFibGUsCisJLnByb2JlCQk9IGlwc19pbnNlcnRfZGV2aWNlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaXBzX3JlbW92ZV9kZXZpY2UpLAorfTsKKyAgICAgICAgICAgCisKKy8qCisgKiBOZWNlc3NhcnkgZm9yd2FyZCBmdW5jdGlvbiBwcm90b3lwZXMKKyAqLworc3RhdGljIGludCBpcHNfaGFsdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bG9uZyBldmVudCwgdm9pZCAqYnVmKTsKKworI2RlZmluZSBNQVhfQURBUFRFUl9OQU1FIDE1CisKK3N0YXRpYyBjaGFyIGlwc19hZGFwdGVyX25hbWVbXVszMF0gPSB7CisJIlNlcnZlUkFJRCIsCisJIlNlcnZlUkFJRCBJSSIsCisJIlNlcnZlUkFJRCBvbiBtb3RoZXJib2FyZCIsCisJIlNlcnZlUkFJRCBvbiBtb3RoZXJib2FyZCIsCisJIlNlcnZlUkFJRCAzSCIsCisJIlNlcnZlUkFJRCAzTCIsCisJIlNlcnZlUkFJRCA0SCIsCisJIlNlcnZlUkFJRCA0TSIsCisJIlNlcnZlUkFJRCA0TCIsCisJIlNlcnZlUkFJRCA0TXgiLAorCSJTZXJ2ZVJBSUQgNEx4IiwKKwkiU2VydmVSQUlEIDVpIiwKKwkiU2VydmVSQUlEIDVpIiwKKwkiU2VydmVSQUlEIDZNIiwKKwkiU2VydmVSQUlEIDZpIiwKKwkiU2VydmVSQUlEIDd0IiwKKwkiU2VydmVSQUlEIDdrIiwKKwkiU2VydmVSQUlEIDdNIgorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpcHNfbm90aWZpZXIgPSB7CisJaXBzX2hhbHQsIE5VTEwsIDAKK307CisKKy8qCisgKiBEaXJlY3Rpb24gdGFibGUKKyAqLworc3RhdGljIGNoYXIgaXBzX2NvbW1hbmRfZGlyZWN0aW9uW10gPSB7CisJSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfSU4sIElQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsCisJSVBTX0RBVEFfSU4sIElQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX0lOLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfSU4sIElQU19EQVRBX05PTkUsIElQU19EQVRBX05PTkUsIElQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsCisJSVBTX0RBVEFfSU4sIElQU19EQVRBX09VVCwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX05PTkUsIElQU19EQVRBX0lOLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX05PTkUsIElQU19EQVRBX1VOSywgSVBTX0RBVEFfSU4sIElQU19EQVRBX1VOSywgSVBTX0RBVEFfSU4sCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX0lOLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9JTiwgSVBTX0RBVEFfSU4sIElQU19EQVRBX09VVCwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfVU5LLAorCUlQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsCisJSVBTX0RBVEFfT1VULCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfTk9ORSwKKwlJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULAorCUlQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX0lOLCBJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwKKwlJUFNfREFUQV9PVVQsIElQU19EQVRBX0lOLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfSU4sIElQU19EQVRBX05PTkUsCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfTk9ORSwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfT1VULCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfSU4sIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywKKwlJUFNfREFUQV9OT05FLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9VTkssIElQU19EQVRBX0lOLCBJUFNfREFUQV9OT05FLAorCUlQU19EQVRBX09VVCwgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9OT05FLCBJUFNfREFUQV9VTkssIElQU19EQVRBX09VVCwKKwlJUFNfREFUQV9PVVQsIElQU19EQVRBX09VVCwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9PVVQsIElQU19EQVRBX05PTkUsCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfT1VULCBJUFNfREFUQV9JTiwgSVBTX0RBVEFfSU4sCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9PVVQsCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssCisJSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTkssIElQU19EQVRBX1VOSywgSVBTX0RBVEFfVU5LLCBJUFNfREFUQV9VTksKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3NldHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBzZXR1cCBwYXJhbWV0ZXJzIHRvIHRoZSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3NldHVwKGNoYXIgKmlwc19zdHIpCit7CisKKwlpbnQgaTsKKwljaGFyICprZXk7CisJY2hhciAqdmFsdWU7CisJSVBTX09QVElPTiBvcHRpb25zW10gPSB7CisJCXsibm9pMm8iLCAmaXBzX2ZvcmNlX2kybywgMH0sCisJCXsibm9tbWFwIiwgJmlwc19mb3JjZV9tZW1pbywgMH0sCisJCXsiaW9jdGxzaXplIiwgJmlwc19pb2N0bHNpemUsIElQU19JT0NUTF9TSVpFfSwKKwkJeyJjZGJvb3QiLCAmaXBzX2NkX2Jvb3QsIDB9LAorCQl7Im1heGNtZHMiLCAmTWF4TGl0ZUNtZHMsIDMyfSwKKwl9OworCisJLyogRG9uJ3QgdXNlIHN0cnRvaygpIGFueW1vcmUgKCBpZiAyLjQgS2VybmVsIG9yIGJleW9uZCApICovCisJLyogU2VhcmNoIGZvciB2YWx1ZSAqLworCXdoaWxlICgoa2V5ID0gc3Ryc2VwKCZpcHNfc3RyLCAiLC4iKSkpIHsKKwkJaWYgKCEqa2V5KQorCQkJY29udGludWU7CisJCXZhbHVlID0gc3RyY2hyKGtleSwgJzonKTsKKwkJaWYgKHZhbHVlKQorCQkJKnZhbHVlKysgPSAnXDAnOworCQkvKgorCQkgKiBXZSBub3cgaGF2ZSBrZXkvdmFsdWUgcGFpcnMuCisJCSAqIFVwZGF0ZSB0aGUgdmFyaWFibGVzCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAob3B0aW9ucykgLyBzaXplb2YgKG9wdGlvbnNbMF0pKTsgaSsrKSB7CisJCQlpZiAoc3RybmljbXAKKwkJCSAgICAoa2V5LCBvcHRpb25zW2ldLm9wdGlvbl9uYW1lLAorCQkJICAgICBzdHJsZW4ob3B0aW9uc1tpXS5vcHRpb25fbmFtZSkpID09IDApIHsKKwkJCQlpZiAodmFsdWUpCisJCQkJCSpvcHRpb25zW2ldLm9wdGlvbl9mbGFnID0KKwkJCQkJICAgIHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCBOVUxMLCAwKTsKKwkJCQllbHNlCisJCQkJCSpvcHRpb25zW2ldLm9wdGlvbl9mbGFnID0KKwkJCQkJICAgIG9wdGlvbnNbaV0ub3B0aW9uX3ZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuICgxKTsKK30KKworX19zZXR1cCgiaXBzPSIsIGlwc19zZXR1cCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19kZXRlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRGV0ZWN0IGFuZCBpbml0aWFsaXplIHRoZSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFOiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHVuZGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgc3BpbmxvY2sgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIFNIVCkKK3sKKwlpbnQgaTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2RldGVjdCIsIDEpOworCisjaWZkZWYgTU9EVUxFCisJaWYgKGlwcykKKwkJaXBzX3NldHVwKGlwcyk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBpcHNfbnVtX2NvbnRyb2xsZXJzOyBpKyspIHsKKwkJaWYgKGlwc19yZWdpc3Rlcl9zY3NpKGkpKQorCQkJaXBzX2ZyZWUoaXBzX2hhW2ldKTsKKwkJaXBzX3JlbGVhc2VkX2NvbnRyb2xsZXJzKys7CisJfQorCWlwc19ob3RwbHVnID0gMTsKKwlyZXR1cm4gKGlwc19udW1fY29udHJvbGxlcnMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgY29uZmlndXJlIHRoZSBmdW5jdGlvbiBwb2ludGVycyB0byB1c2UgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgd29yayAgICAqLworLyogICB3aXRoIHRoZSBmb3VuZCB2ZXJzaW9uIG9mIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfc2V0dXBfZnVuY2xpc3QoaXBzX2hhX3QgKiBoYSkKK3sKKworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgKiBTZXR1cCBGdW5jdGlvbnMKKwkgKi8KKwlpZiAoSVBTX0lTX01PUlBIRVVTKGhhKSB8fCBJUFNfSVNfTUFSQ08oaGEpKSB7CisJCS8qIG1vcnBoZXVzIC8gbWFyY28gLyBzZWJyaW5nICovCisJCWhhLT5mdW5jLmlzaW50ciA9IGlwc19pc2ludHJfbW9ycGhldXM7CisJCWhhLT5mdW5jLmlzaW5pdCA9IGlwc19pc2luaXRfbW9ycGhldXM7CisJCWhhLT5mdW5jLmlzc3VlID0gaXBzX2lzc3VlX2kyb19tZW1pbzsKKwkJaGEtPmZ1bmMuaW5pdCA9IGlwc19pbml0X21vcnBoZXVzOworCQloYS0+ZnVuYy5zdGF0dXBkID0gaXBzX3N0YXR1cGRfbW9ycGhldXM7CisJCWhhLT5mdW5jLnJlc2V0ID0gaXBzX3Jlc2V0X21vcnBoZXVzOworCQloYS0+ZnVuYy5pbnRyID0gaXBzX2ludHJfbW9ycGhldXM7CisJCWhhLT5mdW5jLmVuYWJsZWludCA9IGlwc19lbmFibGVfaW50X21vcnBoZXVzOworCX0gZWxzZSBpZiAoSVBTX1VTRV9NRU1JTyhoYSkpIHsKKwkJLyogY29wcGVyaGVhZCB3L01FTUlPICovCisJCWhhLT5mdW5jLmlzaW50ciA9IGlwc19pc2ludHJfY29wcGVyaGVhZF9tZW1pbzsKKwkJaGEtPmZ1bmMuaXNpbml0ID0gaXBzX2lzaW5pdF9jb3BwZXJoZWFkX21lbWlvOworCQloYS0+ZnVuYy5pbml0ID0gaXBzX2luaXRfY29wcGVyaGVhZF9tZW1pbzsKKwkJaGEtPmZ1bmMuc3RhdHVwZCA9IGlwc19zdGF0dXBkX2NvcHBlcmhlYWRfbWVtaW87CisJCWhhLT5mdW5jLnN0YXRpbml0ID0gaXBzX3N0YXRpbml0X21lbWlvOworCQloYS0+ZnVuYy5yZXNldCA9IGlwc19yZXNldF9jb3BwZXJoZWFkX21lbWlvOworCQloYS0+ZnVuYy5pbnRyID0gaXBzX2ludHJfY29wcGVyaGVhZDsKKwkJaGEtPmZ1bmMuZXJhc2ViaW9zID0gaXBzX2VyYXNlX2Jpb3NfbWVtaW87CisJCWhhLT5mdW5jLnByb2dyYW1iaW9zID0gaXBzX3Byb2dyYW1fYmlvc19tZW1pbzsKKwkJaGEtPmZ1bmMudmVyaWZ5YmlvcyA9IGlwc192ZXJpZnlfYmlvc19tZW1pbzsKKwkJaGEtPmZ1bmMuZW5hYmxlaW50ID0gaXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZF9tZW1pbzsKKwkJaWYgKElQU19VU0VfSTJPX0RFTElWRVIoaGEpKQorCQkJaGEtPmZ1bmMuaXNzdWUgPSBpcHNfaXNzdWVfaTJvX21lbWlvOworCQllbHNlCisJCQloYS0+ZnVuYy5pc3N1ZSA9IGlwc19pc3N1ZV9jb3BwZXJoZWFkX21lbWlvOworCX0gZWxzZSB7CisJCS8qIGNvcHBlcmhlYWQgKi8KKwkJaGEtPmZ1bmMuaXNpbnRyID0gaXBzX2lzaW50cl9jb3BwZXJoZWFkOworCQloYS0+ZnVuYy5pc2luaXQgPSBpcHNfaXNpbml0X2NvcHBlcmhlYWQ7CisJCWhhLT5mdW5jLmluaXQgPSBpcHNfaW5pdF9jb3BwZXJoZWFkOworCQloYS0+ZnVuYy5zdGF0dXBkID0gaXBzX3N0YXR1cGRfY29wcGVyaGVhZDsKKwkJaGEtPmZ1bmMuc3RhdGluaXQgPSBpcHNfc3RhdGluaXQ7CisJCWhhLT5mdW5jLnJlc2V0ID0gaXBzX3Jlc2V0X2NvcHBlcmhlYWQ7CisJCWhhLT5mdW5jLmludHIgPSBpcHNfaW50cl9jb3BwZXJoZWFkOworCQloYS0+ZnVuYy5lcmFzZWJpb3MgPSBpcHNfZXJhc2VfYmlvczsKKwkJaGEtPmZ1bmMucHJvZ3JhbWJpb3MgPSBpcHNfcHJvZ3JhbV9iaW9zOworCQloYS0+ZnVuYy52ZXJpZnliaW9zID0gaXBzX3ZlcmlmeV9iaW9zOworCQloYS0+ZnVuYy5lbmFibGVpbnQgPSBpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkOworCisJCWlmIChJUFNfVVNFX0kyT19ERUxJVkVSKGhhKSkKKwkJCWhhLT5mdW5jLmlzc3VlID0gaXBzX2lzc3VlX2kybzsKKwkJZWxzZQorCQkJaGEtPmZ1bmMuaXNzdWUgPSBpcHNfaXNzdWVfY29wcGVyaGVhZDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZWxlYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIGEgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNoKQoreworCWlwc19zY2JfdCAqc2NiOworCWlwc19oYV90ICpoYTsKKwlpbnQgaTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbGVhc2UiLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBJUFNfTUFYX0FEQVBURVJTICYmIGlwc19zaFtpXSAhPSBzaDsgaSsrKSA7CisKKwlpZiAoaSA9PSBJUFNfTUFYX0FEQVBURVJTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIoJXMpIHJlbGVhc2UsIGludmFsaWQgU2NzaV9Ib3N0IHBvaW50ZXIuXG4iLCBpcHNfbmFtZSk7CisJCUJVRygpOworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwloYSA9IElQU19IQShzaCk7CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCS8qIGZsdXNoIHRoZSBjYWNoZSBvbiB0aGUgY29udHJvbGxlciAqLworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfRkxVU0g7CisKKwlzY2ItPmNtZC5mbHVzaF9jYWNoZS5vcF9jb2RlID0gSVBTX0NNRF9GTFVTSDsKKwlzY2ItPmNtZC5mbHVzaF9jYWNoZS5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQuZmx1c2hfY2FjaGUuc3RhdGUgPSBJUFNfTk9STV9TVEFURTsKKwlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZCA9IDA7CisJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQyID0gMDsKKwlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDMgPSAwOworCXNjYi0+Y21kLmZsdXNoX2NhY2hlLnJlc2VydmVkNCA9IDA7CisKKwlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwgIkZsdXNoaW5nIENhY2hlLlxuIik7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAoaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsIElQU19JTlRSX09OKSA9PSBJUFNfRkFJTFVSRSkKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsICJJbmNvbXBsZXRlIEZsdXNoLlxuIik7CisKKwlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwgIkZsdXNoaW5nIENvbXBsZXRlLlxuIik7CisKKwlpcHNfc2hbaV0gPSBOVUxMOworCWlwc19oYVtpXSA9IE5VTEw7CisKKwkvKiBmcmVlIGV4dHJhIG1lbW9yeSAqLworCWlwc19mcmVlKGhhKTsKKworCS8qIEZyZWUgSS9PIFJlZ2lvbiAqLworCWlmIChoYS0+aW9fYWRkcikKKwkJcmVsZWFzZV9yZWdpb24oaGEtPmlvX2FkZHIsIGhhLT5pb19sZW4pOworCisJLyogZnJlZSBJUlEgKi8KKwlmcmVlX2lycShoYS0+aXJxLCBoYSk7CisKKwlJUFNfUkVNT1ZFX0hPU1Qoc2gpOworCXNjc2lfaG9zdF9wdXQoc2gpOworCisJaXBzX3JlbGVhc2VkX2NvbnRyb2xsZXJzKys7CisKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2hhbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQZXJmb3JtIGNsZWFudXAgd2hlbiB0aGUgc3lzdGVtIHJlYm9vdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2hhbHQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdWxvbmcgZXZlbnQsIHZvaWQgKmJ1ZikKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKwlpcHNfaGFfdCAqaGE7CisJaW50IGk7CisKKwlpZiAoKGV2ZW50ICE9IFNZU19SRVNUQVJUKSAmJiAoZXZlbnQgIT0gU1lTX0hBTFQpICYmCisJICAgIChldmVudCAhPSBTWVNfUE9XRVJfT0ZGKSkKKwkJcmV0dXJuIChOT1RJRllfRE9ORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXBzX25leHRfY29udHJvbGxlcjsgaSsrKSB7CisJCWhhID0gKGlwc19oYV90ICopIGlwc19oYVtpXTsKKworCQlpZiAoIWhhKQorCQkJY29udGludWU7CisKKwkJaWYgKCFoYS0+YWN0aXZlKQorCQkJY29udGludWU7CisKKwkJLyogZmx1c2ggdGhlIGNhY2hlIG9uIHRoZSBjb250cm9sbGVyICovCisJCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCQlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwkJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCQlzY2ItPmNkYlswXSA9IElQU19DTURfRkxVU0g7CisKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUub3BfY29kZSA9IElQU19DTURfRkxVU0g7CisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUuc3RhdGUgPSBJUFNfTk9STV9TVEFURTsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQgPSAwOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDIgPSAwOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDMgPSAwOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDQgPSAwOworCisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LCAiRmx1c2hpbmcgQ2FjaGUuXG4iKTsKKworCQkvKiBzZW5kIGNvbW1hbmQgKi8KKwkJaWYgKGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBJUFNfSU5UUl9PTikgPT0KKwkJICAgIElQU19GQUlMVVJFKQorCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgIkluY29tcGxldGUgRmx1c2guXG4iKTsKKwkJZWxzZQorCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgIkZsdXNoaW5nIENvbXBsZXRlLlxuIik7CisJfQorCisJcmV0dXJuIChOT1RJRllfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZWhfYWJvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFib3J0IGEgY29tbWFuZCAodXNpbmcgdGhlIG5ldyBlcnJvciBjb2RlIHN0dWZmKSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vdGU6IHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdW5kZXIgdGhlIGlvX3JlcXVlc3RfbG9jayAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2lwc19laF9hYm9ydChTY3NpX0NtbmQgKiBTQykKK3sKKwlpcHNfaGFfdCAqaGE7CisJaXBzX2NvcHBfd2FpdF9pdGVtX3QgKml0ZW07CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2VoX2Fib3J0IiwgMSk7CisKKwlpZiAoIVNDKQorCQlyZXR1cm4gKEZBSUxFRCk7CisKKwloYSA9IChpcHNfaGFfdCAqKSBTQy0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmICghaGEpCisJCXJldHVybiAoRkFJTEVEKTsKKworCWlmICghaGEtPmFjdGl2ZSkKKwkJcmV0dXJuIChGQUlMRUQpOworCisJaWYgKFNDLT5zZXJpYWxfbnVtYmVyICE9IFNDLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQpIHsKKwkJLyogSE1NLCBsb29rcyBsaWtlIGEgYm9ndXMgY29tbWFuZCAqLworCQlERUJVRygxLCAiQWJvcnQgY2FsbGVkIHdpdGggYm9ndXMgc2NzaSBjb21tYW5kIik7CisKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKworCS8qIFNlZSBpZiB0aGUgY29tbWFuZCBpcyBvbiB0aGUgY29wcCBxdWV1ZSAqLworCWl0ZW0gPSBoYS0+Y29wcF93YWl0bGlzdC5oZWFkOworCXdoaWxlICgoaXRlbSkgJiYgKGl0ZW0tPnNjc2lfY21kICE9IFNDKSkKKwkJaXRlbSA9IGl0ZW0tPm5leHQ7CisKKwlpZiAoaXRlbSkgeworCQkvKiBGb3VuZCBpdCAqLworCQlpcHNfcmVtb3ZlcV9jb3BwKCZoYS0+Y29wcF93YWl0bGlzdCwgaXRlbSk7CisJCXJldCA9IChTVUNDRVNTKTsKKworCQkvKiBTZWUgaWYgdGhlIGNvbW1hbmQgaXMgb24gdGhlIHdhaXQgcXVldWUgKi8KKwl9IGVsc2UgaWYgKGlwc19yZW1vdmVxX3dhaXQoJmhhLT5zY2Jfd2FpdGxpc3QsIFNDKSkgeworCQkvKiBjb21tYW5kIG5vdCBzZW50IHlldCAqLworCQlyZXQgPSAoU1VDQ0VTUyk7CisJfSBlbHNlIHsKKwkJLyogY29tbWFuZCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQgKi8KKwkJcmV0ID0gKEZBSUxFRCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19laF9yZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVzZXQgdGhlIGNvbnRyb2xsZXIgKHdpdGggbmV3IGVoIGVycm9yIGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFOiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHVuZGVyIHRoZSBpb19yZXF1ZXN0X2xvY2sgc3BpbmxvY2sgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZWhfcmVzZXQoU2NzaV9DbW5kICogU0MpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlpcHNfaGFfdCAqaGE7CisJaXBzX3NjYl90ICpzY2I7CisJaXBzX2NvcHBfd2FpdF9pdGVtX3QgKml0ZW07CisKKwlNRVRIT0RfVFJBQ0UoImlwc19laF9yZXNldCIsIDEpOworCisjaWZkZWYgTk9fSVBTX1JFU0VUCisJcmV0dXJuIChGQUlMRUQpOworI2Vsc2UKKworCWlmICghU0MpIHsKKwkJREVCVUcoMSwgIlJlc2V0IGNhbGxlZCB3aXRoIE5VTEwgc2NzaSBjb21tYW5kIik7CisKKwkJcmV0dXJuIChGQUlMRUQpOworCX0KKworCWhhID0gKGlwc19oYV90ICopIFNDLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKCFoYSkgeworCQlERUJVRygxLCAiUmVzZXQgY2FsbGVkIHdpdGggTlVMTCBoYSBzdHJ1Y3QiKTsKKworCQlyZXR1cm4gKEZBSUxFRCk7CisJfQorCisJaWYgKCFoYS0+YWN0aXZlKQorCQlyZXR1cm4gKEZBSUxFRCk7CisKKwkvKiBTZWUgaWYgdGhlIGNvbW1hbmQgaXMgb24gdGhlIGNvcHAgcXVldWUgKi8KKwlpdGVtID0gaGEtPmNvcHBfd2FpdGxpc3QuaGVhZDsKKwl3aGlsZSAoKGl0ZW0pICYmIChpdGVtLT5zY3NpX2NtZCAhPSBTQykpCisJCWl0ZW0gPSBpdGVtLT5uZXh0OworCisJaWYgKGl0ZW0pIHsKKwkJLyogRm91bmQgaXQgKi8KKwkJaXBzX3JlbW92ZXFfY29wcCgmaGEtPmNvcHBfd2FpdGxpc3QsIGl0ZW0pOworCQlyZXR1cm4gKFNVQ0NFU1MpOworCX0KKworCS8qIFNlZSBpZiB0aGUgY29tbWFuZCBpcyBvbiB0aGUgd2FpdCBxdWV1ZSAqLworCWlmIChpcHNfcmVtb3ZlcV93YWl0KCZoYS0+c2NiX3dhaXRsaXN0LCBTQykpIHsKKwkJLyogY29tbWFuZCBub3Qgc2VudCB5ZXQgKi8KKwkJcmV0dXJuIChTVUNDRVNTKTsKKwl9CisKKwkvKiBBbiBleHBsYW5hdGlvbiBmb3IgdGhlIGNhc3VhbCBvYnNlcnZlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFBhcnQgb2YgdGhlIGZ1bmN0aW9uIG9mIGEgUkFJRCBjb250cm9sbGVyIGlzIGF1dG9tYXRpYyBlcnJvciAgICAgICAgICovCisJLyogZGV0ZWN0aW9uIGFuZCByZWNvdmVyeS4gIEFzIHN1Y2gsIHRoZSBvbmx5IHByb2JsZW0gdGhhdCBwaHlzaWNhbGx5ICAgKi8KKwkvKiByZXNldHRpbmcgYW4gYWRhcHRlciB3aWxsIGV2ZXIgZml4IGlzIHdoZW4sIGZvciBzb21lIHJlYXNvbiwgICAgICAgICAqLworCS8qIHRoZSBkcml2ZXIgaXMgbm90IHN1Y2Nlc3NmdWxseSBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGFkYXB0ZXIuICAgICAgICovCisJLyogVGhlcmVmb3JlLCB3ZSB3aWxsIGF0dGVtcHQgdG8gZmx1c2ggdGhpcyBhZGFwdGVyLiAgSWYgdGhhdCBzdWNjZWVkcywgKi8KKwkvKiB0aGVuIHRoZXJlJ3Mgbm8gcmVhbCBwdXJwb3NlIGluIGEgcGh5c2ljYWwgcmVzZXQuIFRoaXMgd2lsbCBjb21wbGV0ZSAqLworCS8qIG11Y2ggZmFzdGVyIGFuZCBhdm9pZHMgYW55IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUgY2F1c2VkIGJ5IGEgICAgICAgICovCisJLyogcGh5c2ljYWwgcmVzZXQgKCBzdWNoIGFzIGhhdmluZyB0byBmYWlsIGFsbCB0aGUgb3V0c3RhbmRpbmcgSS9PJ3MgKS4gKi8KKworCWlmIChoYS0+aW9jdGxfcmVzZXQgPT0gMCkgewkvKiBJRiBOb3QgYW4gSU9DVEwgUmVxdWVzdGVkIFJlc2V0ICovCisJCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCQlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwkJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCQlzY2ItPmNkYlswXSA9IElQU19DTURfRkxVU0g7CisKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUub3BfY29kZSA9IElQU19DTURfRkxVU0g7CisJCXNjYi0+Y21kLmZsdXNoX2NhY2hlLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUuc3RhdGUgPSBJUFNfTk9STV9TVEFURTsKKwkJc2NiLT5jbWQuZmx1c2hfY2FjaGUucmVzZXJ2ZWQgPSAwOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDIgPSAwOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDMgPSAwOworCQlzY2ItPmNtZC5mbHVzaF9jYWNoZS5yZXNlcnZlZDQgPSAwOworCisJCS8qIEF0dGVtcHQgdGhlIGZsdXNoIGNvbW1hbmQgKi8KKwkJcmV0ID0gaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsIElQU19JTlRSX0lPUkwpOworCQlpZiAocmV0ID09IElQU19TVUNDRVNTKSB7CisJCQlJUFNfUFJJTlRLKEtFUk5fTk9USUNFLCBoYS0+cGNpZGV2LAorCQkJCSAgICJSZXNldCBSZXF1ZXN0IC0gRmx1c2hlZCBDYWNoZVxuIik7CisJCQlyZXR1cm4gKFNVQ0NFU1MpOworCQl9CisJfQorCisJLyogRWl0aGVyIHdlIGNhbid0IGNvbW11bmljYXRlIHdpdGggdGhlIGFkYXB0ZXIgb3IgaXQncyBhbiBJT0NUTCByZXF1ZXN0ICovCisJLyogZnJvbSBhIHV0aWxpdHkuICBBIHBoeXNpY2FsIHJlc2V0IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LiAgICAgICAgICAgICovCisKKwloYS0+aW9jdGxfcmVzZXQgPSAwOwkvKiBSZXNldCB0aGUgSU9DVEwgUmVxdWVzdGVkIFJlc2V0IEZsYWcgKi8KKworCS8qCisJICogY29tbWFuZCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQKKwkgKiByZXNldCB0aGUgY29udHJvbGxlcgorCSAqLworCUlQU19QUklOVEsoS0VSTl9OT1RJQ0UsIGhhLT5wY2lkZXYsICJSZXNldHRpbmcgY29udHJvbGxlci5cbiIpOworCXJldCA9ICgqaGEtPmZ1bmMucmVzZXQpIChoYSk7CisKKwlpZiAoIXJldCkgeworCQlTY3NpX0NtbmQgKnNjc2lfY21kOworCisJCUlQU19QUklOVEsoS0VSTl9OT1RJQ0UsIGhhLT5wY2lkZXYsCisJCQkgICAiQ29udHJvbGxlciByZXNldCBmYWlsZWQgLSBjb250cm9sbGVyIG5vdyBvZmZsaW5lLlxuIik7CisKKwkJLyogTm93IGZhaWwgYWxsIG9mIHRoZSBhY3RpdmUgY29tbWFuZHMgKi8KKwkJREVCVUdfVkFSKDEsICIoJXMlZCkgRmFpbGluZyBhY3RpdmUgY29tbWFuZHMiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKworCQl3aGlsZSAoKHNjYiA9IGlwc19yZW1vdmVxX3NjYl9oZWFkKCZoYS0+c2NiX2FjdGl2ZWxpc3QpKSkgeworCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCX0KKworCQkvKiBOb3cgZmFpbCBhbGwgb2YgdGhlIHBlbmRpbmcgY29tbWFuZHMgKi8KKwkJREVCVUdfVkFSKDEsICIoJXMlZCkgRmFpbGluZyBwZW5kaW5nIGNvbW1hbmRzIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwkJd2hpbGUgKChzY3NpX2NtZCA9IGlwc19yZW1vdmVxX3dhaXRfaGVhZCgmaGEtPnNjYl93YWl0bGlzdCkpKSB7CisJCQlzY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SOworCQkJc2NzaV9jbWQtPnNjc2lfZG9uZShzY3NpX2NtZCk7CisJCX0KKworCQloYS0+YWN0aXZlID0gRkFMU0U7CisJCXJldHVybiAoRkFJTEVEKTsKKwl9CisKKwlpZiAoIWlwc19jbGVhcl9hZGFwdGVyKGhhLCBJUFNfSU5UUl9JT1JMKSkgeworCQlTY3NpX0NtbmQgKnNjc2lfY21kOworCisJCUlQU19QUklOVEsoS0VSTl9OT1RJQ0UsIGhhLT5wY2lkZXYsCisJCQkgICAiQ29udHJvbGxlciByZXNldCBmYWlsZWQgLSBjb250cm9sbGVyIG5vdyBvZmZsaW5lLlxuIik7CisKKwkJLyogTm93IGZhaWwgYWxsIG9mIHRoZSBhY3RpdmUgY29tbWFuZHMgKi8KKwkJREVCVUdfVkFSKDEsICIoJXMlZCkgRmFpbGluZyBhY3RpdmUgY29tbWFuZHMiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKworCQl3aGlsZSAoKHNjYiA9IGlwc19yZW1vdmVxX3NjYl9oZWFkKCZoYS0+c2NiX2FjdGl2ZWxpc3QpKSkgeworCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCX0KKworCQkvKiBOb3cgZmFpbCBhbGwgb2YgdGhlIHBlbmRpbmcgY29tbWFuZHMgKi8KKwkJREVCVUdfVkFSKDEsICIoJXMlZCkgRmFpbGluZyBwZW5kaW5nIGNvbW1hbmRzIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwkJd2hpbGUgKChzY3NpX2NtZCA9IGlwc19yZW1vdmVxX3dhaXRfaGVhZCgmaGEtPnNjYl93YWl0bGlzdCkpKSB7CisJCQlzY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJc2NzaV9jbWQtPnNjc2lfZG9uZShzY3NpX2NtZCk7CisJCX0KKworCQloYS0+YWN0aXZlID0gRkFMU0U7CisJCXJldHVybiAoRkFJTEVEKTsKKwl9CisKKwkvKiBGRkRDICovCisJaWYgKGxlMzJfdG9fY3B1KGhhLT5zdWJzeXMtPnBhcmFtWzNdKSAmIDB4MzAwMDAwKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQloYS0+bGFzdF9mZmRjID0gdHYudHZfc2VjOworCQloYS0+cmVzZXRfY291bnQrKzsKKwkJaXBzX2ZmZGNfcmVzZXQoaGEsIElQU19JTlRSX0lPUkwpOworCX0KKworCS8qIE5vdyBmYWlsIGFsbCBvZiB0aGUgYWN0aXZlIGNvbW1hbmRzICovCisJREVCVUdfVkFSKDEsICIoJXMlZCkgRmFpbGluZyBhY3RpdmUgY29tbWFuZHMiLCBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKworCXdoaWxlICgoc2NiID0gaXBzX3JlbW92ZXFfc2NiX2hlYWQoJmhhLT5zY2JfYWN0aXZlbGlzdCkpKSB7CisJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9CisJCSAgICAoRElEX1JFU0VUIDw8IDE2KSB8IChTVUdHRVNUX1JFVFJZIDw8IDI0KTsKKwkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwl9CisKKwkvKiBSZXNldCBEQ0RCIGFjdGl2ZSBjb21tYW5kIGJpdHMgKi8KKwlmb3IgKGkgPSAxOyBpIDwgaGEtPm5idXM7IGkrKykKKwkJaGEtPmRjZGJfYWN0aXZlW2kgLSAxXSA9IDA7CisKKwkvKiBSZXNldCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBJT0NUTHMgKi8KKwloYS0+bnVtX2lvY3RsID0gMDsKKworCWlwc19uZXh0KGhhLCBJUFNfSU5UUl9JT1JMKTsKKworCXJldHVybiAoU1VDQ0VTUyk7CisjZW5kaWYJCQkJLyogTk9fSVBTX1JFU0VUICovCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTGludXggb2J0YWlucyBpb19yZXF1ZXN0X2xvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3F1ZXVlKFNjc2lfQ21uZCAqIFNDLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlpcHNfaGFfdCAqaGE7CisJaXBzX3Bhc3N0aHJ1X3QgKnB0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfcXVldWUiLCAxKTsKKworCWhhID0gKGlwc19oYV90ICopIFNDLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKCFoYSkKKwkJcmV0dXJuICgxKTsKKworCWlmICghaGEtPmFjdGl2ZSkKKwkJcmV0dXJuIChESURfRVJST1IpOworCisJaWYgKGlwc19pc19wYXNzdGhydShTQykpIHsKKwkJaWYgKGhhLT5jb3BwX3dhaXRsaXN0LmNvdW50ID09IElQU19NQVhfSU9DVExfUVVFVUUpIHsKKwkJCVNDLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCQlkb25lKFNDKTsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSBpZiAoaGEtPnNjYl93YWl0bGlzdC5jb3VudCA9PSBJUFNfTUFYX1FVRVVFKSB7CisJCVNDLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCWRvbmUoU0MpOworCisJCXJldHVybiAoMCk7CisJfQorCisJU0MtPnNjc2lfZG9uZSA9IGRvbmU7CisKKwlERUJVR19WQVIoMiwgIiglcyVkKTogaXBzX3F1ZXVlOiBjbWQgMHglWCAoJWQgJWQgJWQpIiwKKwkJICBpcHNfbmFtZSwKKwkJICBoYS0+aG9zdF9udW0sCisJCSAgU0MtPmNtbmRbMF0sCisJCSAgU0MtPmRldmljZS0+Y2hhbm5lbCwgU0MtPmRldmljZS0+aWQsIFNDLT5kZXZpY2UtPmx1bik7CisKKwkvKiBDaGVjayBmb3IgY29tbWFuZCB0byBpbml0aWF0b3IgSURzICovCisJaWYgKChTQy0+ZGV2aWNlLT5jaGFubmVsID4gMCkKKwkgICAgJiYgKFNDLT5kZXZpY2UtPmlkID09IGhhLT5oYV9pZFtTQy0+ZGV2aWNlLT5jaGFubmVsXSkpIHsKKwkJU0MtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlkb25lKFNDKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChpcHNfaXNfcGFzc3RocnUoU0MpKSB7CisKKwkJaXBzX2NvcHBfd2FpdF9pdGVtX3QgKnNjcmF0Y2g7CisKKwkJLyogQSBSZXNldCBJT0NUTCBpcyBvbmx5IHNlbnQgYnkgdGhlIGJvb3QgQ0QgaW4gZXh0cmVtZSBjYXNlcy4gICAgICAgICAgICovCisJCS8qIFRoZXJlIGNhbiBuZXZlciBiZSBhbnkgc3lzdGVtIGFjdGl2aXR5ICggbmV0d29yayBvciBkaXNrICksIGJ1dCBjaGVjayAqLworCQkvKiBhbnl3YXkganVzdCBhcyBhIGdvb2QgcHJhY3RpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJcHQgPSAoaXBzX3Bhc3N0aHJ1X3QgKikgU0MtPnJlcXVlc3RfYnVmZmVyOworCQlpZiAoKHB0LT5Db3BwQ1AuY21kLnJlc2V0Lm9wX2NvZGUgPT0gSVBTX0NNRF9SRVNFVF9DSEFOTkVMKSAmJgorCQkgICAgKHB0LT5Db3BwQ1AuY21kLnJlc2V0LmFkYXB0ZXJfZmxhZyA9PSAxKSkgeworCQkJaWYgKGhhLT5zY2JfYWN0aXZlbGlzdC5jb3VudCAhPSAwKSB7CisJCQkJU0MtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCQlkb25lKFNDKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaGEtPmlvY3RsX3Jlc2V0ID0gMTsJLyogVGhpcyByZXNldCByZXF1ZXN0IGlzIGZyb20gYW4gSU9DVEwgKi8KKwkJCWlwc19laF9yZXNldChTQyk7CisJCQlTQy0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJU0MtPnNjc2lfZG9uZShTQyk7CisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJLyogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzY3JpYmJsZSAqLworCQlzY3JhdGNoID0ga21hbGxvYyhzaXplb2YgKGlwc19jb3BwX3dhaXRfaXRlbV90KSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFzY3JhdGNoKSB7CisJCQlTQy0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJZG9uZShTQyk7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQlzY3JhdGNoLT5zY3NpX2NtZCA9IFNDOworCQlzY3JhdGNoLT5uZXh0ID0gTlVMTDsKKworCQlpcHNfcHV0cV9jb3BwX3RhaWwoJmhhLT5jb3BwX3dhaXRsaXN0LCBzY3JhdGNoKTsKKwl9IGVsc2UgeworCQlpcHNfcHV0cV93YWl0X3RhaWwoJmhhLT5zY2Jfd2FpdGxpc3QsIFNDKTsKKwl9CisKKwlpcHNfbmV4dChoYSwgSVBTX0lOVFJfSU9STCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfYmlvc3BhcmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNldCBiaW9zIGdlb21ldHJ5IGZvciB0aGUgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCitpcHNfYmlvc3BhcmFtKERpc2sgKiBkaXNrLCBrZGV2X3QgZGV2LCBpbnQgZ2VvbVtdKQoreworCWlwc19oYV90ICpoYSA9IChpcHNfaGFfdCAqKSBkaXNrLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHkgPSBkaXNrLT5jYXBhY2l0eTsKKyNlbHNlCitpcHNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkgICAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKK3sKKwlpcHNfaGFfdCAqaGEgPSAoaXBzX2hhX3QgKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisjZW5kaWYKKwlpbnQgaGVhZHM7CisJaW50IHNlY3RvcnM7CisJaW50IGN5bGluZGVyczsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2Jpb3NwYXJhbSIsIDEpOworCisJaWYgKCFoYSkKKwkJLyogPyE/ISBob3N0IGFkYXRlciBpbmZvIGludmFsaWQgKi8KKwkJcmV0dXJuICgwKTsKKworCWlmICghaGEtPmFjdGl2ZSkKKwkJcmV0dXJuICgwKTsKKworCWlmICghaXBzX3JlYWRfYWRhcHRlcl9zdGF0dXMoaGEsIElQU19JTlRSX09OKSkKKwkJLyogPyE/ISBFbnF1aXJ5IGNvbW1hbmQgZmFpbGVkICovCisJCXJldHVybiAoMCk7CisKKwlpZiAoKGNhcGFjaXR5ID4gMHg0MDAwMDApICYmICgoaGEtPmVucS0+dWNNaXNjRmxhZyAmIDB4OCkgPT0gMCkpIHsKKwkJaGVhZHMgPSBJUFNfTk9STV9IRUFEUzsKKwkJc2VjdG9ycyA9IElQU19OT1JNX1NFQ1RPUlM7CisJfSBlbHNlIHsKKwkJaGVhZHMgPSBJUFNfQ09NUF9IRUFEUzsKKwkJc2VjdG9ycyA9IElQU19DT01QX1NFQ1RPUlM7CisJfQorCisJY3lsaW5kZXJzID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKGhlYWRzICogc2VjdG9ycyk7CisKKwlERUJVR19WQVIoMiwgIkdlb21ldHJ5OiBoZWFkczogJWQsIHNlY3RvcnM6ICVkLCBjeWxpbmRlcnM6ICVkIiwKKwkJICBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzKTsKKworCWdlb21bMF0gPSBoZWFkczsKKwlnZW9tWzFdID0gc2VjdG9yczsKKwlnZW9tWzJdID0gY3lsaW5kZXJzOworCisJcmV0dXJuICgwKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisvKiBpcHNfcHJvYzI0X2luZm8gaXMgYSB3cmFwcGVyIGFyb3VuZCBpcHNfcHJvY19pbmZvICoKKyAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIDIuNCBzY3NpIHBhcmFtZXRlcnMgICAgKi8KK3N0YXRpYyBpbnQKK2lwc19wcm9jMjRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgICAgICAgICAgIGludCBob3N0bm8sIGludCBmdW5jKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGlwc19uZXh0X2NvbnRyb2xsZXI7IGkrKykgeworCQlpZiAoaXBzX3NoW2ldICYmIGlwc19zaFtpXS0+aG9zdF9ubyA9PSBob3N0bm8pIHsKKwkJCXJldHVybiBpcHNfcHJvY19pbmZvKGlwc19zaFtpXSwgYnVmZmVyLCBzdGFydCwKKwkJCQkJICAgICBvZmZzZXQsIGxlbmd0aCwgZnVuYyk7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7CQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc2VsZWN0X3F1ZXVlX2RlcHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNlbGVjdCBxdWV1ZSBkZXB0aHMgZm9yIHRoZSBkZXZpY2VzIG9uIHRoZSBjb250b2xsZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3NlbGVjdF9xdWV1ZV9kZXB0aChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBTY3NpX0RldmljZSAqIHNjc2lfZGV2cykKK3sKKwlTY3NpX0RldmljZSAqZGV2aWNlOworCWlwc19oYV90ICpoYTsKKwlpbnQgY291bnQgPSAwOworCWludCBtaW47CisKKwloYSA9IElQU19IQShob3N0KTsKKwltaW4gPSBoYS0+bWF4X2NtZHMgLyA0OworCisJZm9yIChkZXZpY2UgPSBzY3NpX2RldnM7IGRldmljZTsgZGV2aWNlID0gZGV2aWNlLT5uZXh0KSB7CisJCWlmIChkZXZpY2UtPmhvc3QgPT0gaG9zdCkgeworCQkJaWYgKChkZXZpY2UtPmNoYW5uZWwgPT0gMCkgJiYgKGRldmljZS0+dHlwZSA9PSAwKSkKKwkJCQljb3VudCsrOworCQl9CisJfQorCisJZm9yIChkZXZpY2UgPSBzY3NpX2RldnM7IGRldmljZTsgZGV2aWNlID0gZGV2aWNlLT5uZXh0KSB7CisJCWlmIChkZXZpY2UtPmhvc3QgPT0gaG9zdCkgeworCQkJaWYgKChkZXZpY2UtPmNoYW5uZWwgPT0gMCkgJiYgKGRldmljZS0+dHlwZSA9PSAwKSkgeworCQkJCWRldmljZS0+cXVldWVfZGVwdGggPQorCQkJCSAgICAoaGEtPm1heF9jbWRzIC0gMSkgLyBjb3VudDsKKwkJCQlpZiAoZGV2aWNlLT5xdWV1ZV9kZXB0aCA8IG1pbikKKwkJCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IG1pbjsKKwkJCX0gZWxzZSB7CisJCQkJZGV2aWNlLT5xdWV1ZV9kZXB0aCA9IDI7CisJCQl9CisKKwkJCWlmIChkZXZpY2UtPnF1ZXVlX2RlcHRoIDwgMikKKwkJCQlkZXZpY2UtPnF1ZXVlX2RlcHRoID0gMjsKKwkJfQorCX0KK30KKworI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zbGF2ZV9jb25maWd1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgU2V0IHF1ZXVlIGRlcHRocyBvbiBkZXZpY2VzIG9uY2Ugc2NhbiBpcyBjb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19zbGF2ZV9jb25maWd1cmUoU2NzaV9EZXZpY2UgKiBTRHB0cikKK3sKKwlpcHNfaGFfdCAqaGE7CisJaW50IG1pbjsKKworCWhhID0gSVBTX0hBKFNEcHRyLT5ob3N0KTsKKwlpZiAoU0RwdHItPnRhZ2dlZF9zdXBwb3J0ZWQgJiYgU0RwdHItPnR5cGUgPT0gVFlQRV9ESVNLKSB7CisJCW1pbiA9IGhhLT5tYXhfY21kcyAvIDI7CisJCWlmIChoYS0+ZW5xLT51Y0xvZ0RyaXZlQ291bnQgPD0gMikKKwkJCW1pbiA9IGhhLT5tYXhfY21kcyAtIDE7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKFNEcHRyLCBNU0dfT1JERVJFRF9UQUcsIG1pbik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGRvX2lwc2ludHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV3JhcHBlciBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorZG9faXBzaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpcHNfaGFfdCAqaGE7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlpbnQgaXJxc3RhdHVzOworCisJTUVUSE9EX1RSQUNFKCJkb19pcHNpbnRyIiwgMik7CisKKwloYSA9IChpcHNfaGFfdCAqKSBkZXZfaWQ7CisJaWYgKCFoYSkKKwkJcmV0dXJuIElSUV9OT05FOworCWhvc3QgPSBpcHNfc2hbaGEtPmhvc3RfbnVtXTsKKwkvKiBpbnRlcnJ1cHQgZHVyaW5nIGluaXRpYWxpemF0aW9uICovCisJaWYgKCFob3N0KSB7CisJCSgqaGEtPmZ1bmMuaW50cikgKGhhKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCUlQU19MT0NLX1NBVkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCisJaWYgKCFoYS0+YWN0aXZlKSB7CisJCUlQU19VTkxPQ0tfUkVTVE9SRShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpcnFzdGF0dXMgPSAoKmhhLT5mdW5jLmludHIpIChoYSk7CisKKwlJUFNfVU5MT0NLX1JFU1RPUkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCisJLyogc3RhcnQgdGhlIG5leHQgY29tbWFuZCAqLworCWlwc19uZXh0KGhhLCBJUFNfSU5UUl9PTik7CisJcmV0dXJuIElSUV9SRVRWQUwoaXJxc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ludHJfY29wcGVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQb2xsaW5nIGludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQVNTVU1FUyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAoraXBzX2ludHJfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCWlwc19zdGF0X3QgKnNwOworCWlwc19zY2JfdCAqc2NiOworCUlQU19TVEFUVVMgY3N0YXR1czsKKwlpbnQgaW50cnN0YXR1czsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2ludHIiLCAyKTsKKworCWlmICghaGEpCisJCXJldHVybiAwOworCisJaWYgKCFoYS0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWludHJzdGF0dXMgPSAoKmhhLT5mdW5jLmlzaW50cikgKGhhKTsKKworCWlmICghaW50cnN0YXR1cykgeworCQkvKgorCQkgKiBVbmV4cGVjdGVkL1NoYXJlZCBpbnRlcnJ1cHQKKwkJICovCisKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKFRSVUUpIHsKKwkJc3AgPSAmaGEtPnNwOworCisJCWludHJzdGF0dXMgPSAoKmhhLT5mdW5jLmlzaW50cikgKGhhKTsKKworCQlpZiAoIWludHJzdGF0dXMpCisJCQlicmVhazsKKwkJZWxzZQorCQkJY3N0YXR1cy52YWx1ZSA9ICgqaGEtPmZ1bmMuc3RhdHVwZCkgKGhhKTsKKworCQlpZiAoY3N0YXR1cy5maWVsZHMuY29tbWFuZF9pZCA+IChJUFNfTUFYX0NNRFMgLSAxKSkgeworCQkJLyogU3B1cmlvdXMgSW50ZXJ1cHQgPyAqLworCQkJY29udGludWU7CisJCX0KKworCQlpcHNfY2hrc3RhdHVzKGhhLCAmY3N0YXR1cyk7CisJCXNjYiA9IChpcHNfc2NiX3QgKikgc3AtPnNjYl9hZGRyOworCisJCS8qCisJCSAqIHVzZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmluaXNoIHRoaW5ncyB1cAorCQkgKiBOT1RFOiBpbnRlcnJ1cHRzIGFyZSBPRkYgZm9yIHRoaXMKKwkJICovCisJCSgqc2NiLT5jYWxsYmFjaykgKGhhLCBzY2IpOworCX0JCQkvKiBlbmQgd2hpbGUgKi8KKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ludHJfbW9ycGhldXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQb2xsaW5nIGludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQVNTVU1FUyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAoraXBzX2ludHJfbW9ycGhldXMoaXBzX2hhX3QgKiBoYSkKK3sKKwlpcHNfc3RhdF90ICpzcDsKKwlpcHNfc2NiX3QgKnNjYjsKKwlJUFNfU1RBVFVTIGNzdGF0dXM7CisJaW50IGludHJzdGF0dXM7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbnRyX21vcnBoZXVzIiwgMik7CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gMDsKKworCWlmICghaGEtPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwlpbnRyc3RhdHVzID0gKCpoYS0+ZnVuYy5pc2ludHIpIChoYSk7CisKKwlpZiAoIWludHJzdGF0dXMpIHsKKwkJLyoKKwkJICogVW5leHBlY3RlZC9TaGFyZWQgaW50ZXJydXB0CisJCSAqLworCisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChUUlVFKSB7CisJCXNwID0gJmhhLT5zcDsKKworCQlpbnRyc3RhdHVzID0gKCpoYS0+ZnVuYy5pc2ludHIpIChoYSk7CisKKwkJaWYgKCFpbnRyc3RhdHVzKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWNzdGF0dXMudmFsdWUgPSAoKmhhLT5mdW5jLnN0YXR1cGQpIChoYSk7CisKKwkJaWYgKGNzdGF0dXMudmFsdWUgPT0gMHhmZmZmZmZmZikKKwkJCS8qIE5vIG1vcmUgdG8gcHJvY2VzcyAqLworCQkJYnJlYWs7CisKKwkJaWYgKGNzdGF0dXMuZmllbGRzLmNvbW1hbmRfaWQgPiAoSVBTX01BWF9DTURTIC0gMSkpIHsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJTcHVyaW91cyBpbnRlcnJ1cHQ7IG5vIGNjYi5cbiIpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlwc19jaGtzdGF0dXMoaGEsICZjc3RhdHVzKTsKKwkJc2NiID0gKGlwc19zY2JfdCAqKSBzcC0+c2NiX2FkZHI7CisKKwkJLyoKKwkJICogdXNlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBmaW5pc2ggdGhpbmdzIHVwCisJCSAqIE5PVEU6IGludGVycnVwdHMgYXJlIE9GRiBmb3IgdGhpcworCQkgKi8KKwkJKCpzY2ItPmNhbGxiYWNrKSAoaGEsIHNjYik7CisJfQkJCS8qIGVuZCB3aGlsZSAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJldHVybiBpbmZvIGFib3V0IHRoZSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgY2hhciAqCitpcHNfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpTSCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKKwljaGFyICpicDsKKwlpcHNfaGFfdCAqaGE7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pbmZvIiwgMSk7CisKKwloYSA9IElQU19IQShTSCk7CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gKE5VTEwpOworCisJYnAgPSAmYnVmZmVyWzBdOworCW1lbXNldChicCwgMCwgc2l6ZW9mIChidWZmZXIpKTsKKworCXNwcmludGYoYnAsICIlcyVzJXMgQnVpbGQgJWQiLCAiSUJNIFBDSSBTZXJ2ZVJBSUQgIiwKKwkJSVBTX1ZFUlNJT05fSElHSCwgSVBTX1ZFUlNJT05fTE9XLCBJUFNfQlVJTERfSURFTlQpOworCisJaWYgKGhhLT5hZF90eXBlID4gMCAmJiBoYS0+YWRfdHlwZSA8PSBNQVhfQURBUFRFUl9OQU1FKSB7CisJCXN0cmNhdChicCwgIiA8Iik7CisJCXN0cmNhdChicCwgaXBzX2FkYXB0ZXJfbmFtZVtoYS0+YWRfdHlwZSAtIDFdKTsKKwkJc3RyY2F0KGJwLCAiPiIpOworCX0KKworCXJldHVybiAoYnApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcHJvY19pbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSBwYXNzdGhydSBpbnRlcmZhY2UgZm9yIHRoZSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJICAgICAgaW50IGxlbmd0aCwgaW50IGZ1bmMpCit7CisJaW50IGk7CisJaW50IHJldDsKKwlpcHNfaGFfdCAqaGEgPSBOVUxMOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcHJvY19pbmZvIiwgMSk7CisKKwkvKiBGaW5kIG91ciBob3N0IHN0cnVjdHVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBpcHNfbmV4dF9jb250cm9sbGVyOyBpKyspIHsKKwkJaWYgKGlwc19zaFtpXSkgeworCQkJaWYgKGlwc19zaFtpXSA9PSBob3N0KSB7CisJCQkJaGEgPSAoaXBzX2hhX3QgKikgaXBzX3NoW2ldLT5ob3N0ZGF0YTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghaGEpCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwlpZiAoZnVuYykgeworCQkvKiB3cml0ZSAqLworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCS8qIHJlYWQgKi8KKwkJaWYgKHN0YXJ0KQorCQkJKnN0YXJ0ID0gYnVmZmVyOworCisJCXJldCA9IGlwc19ob3N0X2luZm8oaGEsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisJCXJldHVybiAocmV0KTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSGVscGVyIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzX3Bhc3N0aHJ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBTQ1NJIGNvbW1hbmQgaXMgcmVhbGx5IGEgcGFzc3RocnUgY29tbWFuZCAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzX3Bhc3N0aHJ1KFNjc2lfQ21uZCAqIFNDKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX2lzX3Bhc3N0aHJ1IiwgMSk7CisKKwlpZiAoIVNDKQorCQlyZXR1cm4gKDApOworCisJaWYgKChTQy0+Y21uZFswXSA9PSBJUFNfSU9DVExfQ09NTUFORCkgJiYKKwkgICAgKFNDLT5kZXZpY2UtPmNoYW5uZWwgPT0gMCkgJiYKKwkgICAgKFNDLT5kZXZpY2UtPmlkID09IElQU19BREFQVEVSX0lEKSAmJgorCSAgICAoU0MtPmRldmljZS0+bHVuID09IDApICYmIFNDLT5yZXF1ZXN0X2J1ZmZlcikgeworCQlpZiAoKCFTQy0+dXNlX3NnKSAmJiBTQy0+cmVxdWVzdF9idWZmbGVuICYmCisJCSAgICAoKChjaGFyICopIFNDLT5yZXF1ZXN0X2J1ZmZlcilbMF0gPT0gJ0MnKSAmJgorCQkgICAgKCgoY2hhciAqKSBTQy0+cmVxdWVzdF9idWZmZXIpWzFdID09ICdPJykgJiYKKwkJICAgICgoKGNoYXIgKikgU0MtPnJlcXVlc3RfYnVmZmVyKVsyXSA9PSAnUCcpICYmCisJCSAgICAoKChjaGFyICopIFNDLT5yZXF1ZXN0X2J1ZmZlcilbM10gPT0gJ1AnKSkKKwkJCXJldHVybiAxOworCQllbHNlIGlmIChTQy0+dXNlX3NnKSB7CisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gU0MtPnJlcXVlc3RfYnVmZmVyOworCQkJY2hhciAqYnVmZmVyID0gSVBTX1NHX0FERFJFU1Moc2cpOworCQkJaWYgKGJ1ZmZlciAmJiBidWZmZXJbMF0gPT0gJ0MnICYmIGJ1ZmZlclsxXSA9PSAnTycgJiYKKwkJCSAgICBidWZmZXJbMl0gPT0gJ1AnICYmIGJ1ZmZlclszXSA9PSAnUCcpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19hbGxvY19wYXNzdGhydV9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGFsbG9jYXRlIGEgYnVmZmVyIGxhcmdlIGVub3VnaCBmb3IgdGhlIGlvY3RsIGRhdGEgaWYgdGhlIGlvY3RsIGJ1ZmZlciAgKi8KKy8qICAgaXMgdG9vIHNtYWxsIG9yIGRvZXNuJ3QgZXhpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfYWxsb2NfcGFzc3RocnVfYnVmZmVyKGlwc19oYV90ICogaGEsIGludCBsZW5ndGgpCit7CisJdm9pZCAqYmlnZ2VyX2J1ZjsKKwlkbWFfYWRkcl90IGRtYV9idXNhZGRyOworCisJaWYgKGhhLT5pb2N0bF9kYXRhICYmIGxlbmd0aCA8PSBoYS0+aW9jdGxfbGVuKQorCQlyZXR1cm4gMDsKKwkvKiB0aGVyZSBpcyBubyBidWZmZXIgb3IgaXQncyBub3QgYmlnIGVub3VnaCwgYWxsb2NhdGUgYSBuZXcgb25lICovCisJYmlnZ2VyX2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wY2lkZXYsIGxlbmd0aCwgJmRtYV9idXNhZGRyKTsKKwlpZiAoYmlnZ2VyX2J1ZikgeworCQkvKiBmcmVlIHRoZSBvbGQgbWVtb3J5ICovCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwgaGEtPmlvY3RsX2xlbiwgaGEtPmlvY3RsX2RhdGEsCisJCQkJICAgIGhhLT5pb2N0bF9idXNhZGRyKTsKKwkJLyogdXNlIHRoZSBuZXcgbWVtb3J5ICovCisJCWhhLT5pb2N0bF9kYXRhID0gKGNoYXIgKikgYmlnZ2VyX2J1ZjsKKwkJaGEtPmlvY3RsX2xlbiA9IGxlbmd0aDsKKwkJaGEtPmlvY3RsX2J1c2FkZHIgPSBkbWFfYnVzYWRkcjsKKwl9IGVsc2UgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfbWFrZV9wYXNzdGhydSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIE1ha2UgYSBwYXNzdGhydSBjb21tYW5kIG91dCBvZiB0aGUgaW5mbyBpbiB0aGUgU2NzaSBibG9jayAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfbWFrZV9wYXNzdGhydShpcHNfaGFfdCAqIGhhLCBTY3NpX0NtbmQgKiBTQywgaXBzX3NjYl90ICogc2NiLCBpbnQgaW50cikKK3sKKwlpcHNfcGFzc3RocnVfdCAqcHQ7CisJaW50IGxlbmd0aCA9IDA7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX21ha2VfcGFzc3RocnUiLCAxKTsKKworCWlmICghU0MtPnVzZV9zZykgeworCQlsZW5ndGggPSBTQy0+cmVxdWVzdF9idWZmbGVuOworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBTQy0+cmVxdWVzdF9idWZmZXI7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgU0MtPnVzZV9zZzsgaSsrKQorCQkJbGVuZ3RoICs9IHNnW2ldLmxlbmd0aDsKKwl9CisJaWYgKGxlbmd0aCA8IHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpKSB7CisJCS8qIHdyb25nIHNpemUgKi8KKwkJREVCVUdfVkFSKDEsICIoJXMlZCkgUGFzc3RocnUgc3RydWN0dXJlIHdyb25nIHNpemUiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKwkJcmV0dXJuIChJUFNfRkFJTFVSRSk7CisJfQorCWlmIChpcHNfYWxsb2NfcGFzc3RocnVfYnVmZmVyKGhhLCBsZW5ndGgpKSB7CisJCS8qIGFsbG9jYXRpb24gZmFpbHVyZSEgIElmIGhhLT5pb2N0bF9kYXRhIGV4aXN0cywgdXNlIGl0IHRvIHJldHVybgorCQkgICBzb21lIGVycm9yIGNvZGVzLiAgUmV0dXJuIGEgZmFpbGVkIGNvbW1hbmQgdG8gdGhlIHNjc2kgbGF5ZXIuICovCisJCWlmIChoYS0+aW9jdGxfZGF0YSkgeworCQkJcHQgPSAoaXBzX3Bhc3N0aHJ1X3QgKikgaGEtPmlvY3RsX2RhdGE7CisJCQlpcHNfc2NtZF9idWZfcmVhZChTQywgcHQsIHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpKTsKKwkJCXB0LT5CYXNpY1N0YXR1cyA9IDB4MEI7CisJCQlwdC0+RXh0ZW5kZWRTdGF0dXMgPSAweDAwOworCQkJaXBzX3NjbWRfYnVmX3dyaXRlKFNDLCBwdCwgc2l6ZW9mIChpcHNfcGFzc3RocnVfdCkpOworCQl9CisJCXJldHVybiBJUFNfRkFJTFVSRTsKKwl9CisJaGEtPmlvY3RsX2RhdGFzaXplID0gbGVuZ3RoOworCisJaXBzX3NjbWRfYnVmX3JlYWQoU0MsIGhhLT5pb2N0bF9kYXRhLCBoYS0+aW9jdGxfZGF0YXNpemUpOworCXB0ID0gKGlwc19wYXNzdGhydV90ICopIGhhLT5pb2N0bF9kYXRhOworCisJLyoKKwkgKiBTb21lIG5vdGVzIGFib3V0IHRoZSBwYXNzdGhydSBpbnRlcmZhY2UgdXNlZAorCSAqCisJICogSUYgdGhlIHNjc2kgb3BfY29kZSA9PSAweDBkIHRoZW4gd2UgYXNzdW1lCisJICogdGhhdCB0aGUgZGF0YSBjYW1lIGFsb25nIHdpdGgvZ29lcyB3aXRoIHRoZQorCSAqIHBhY2tldCB3ZSByZWNlaXZlZCBmcm9tIHRoZSBzZyBkcml2ZXIuIEluIHRoaXMKKwkgKiBjYXNlIHRoZSBDbWRCU2l6ZSBmaWVsZCBvZiB0aGUgcHQgc3RydWN0dXJlIGlzCisJICogdXNlZCBmb3IgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKwkgKi8KKworCXN3aXRjaCAocHQtPkNvcHBDbWQpIHsKKwljYXNlIElQU19OVU1DVFJMUzoKKwkJbWVtY3B5KGhhLT5pb2N0bF9kYXRhICsgc2l6ZW9mIChpcHNfcGFzc3RocnVfdCksCisJCSAgICAgICAmaXBzX251bV9jb250cm9sbGVycywgc2l6ZW9mIChpbnQpKTsKKwkJaXBzX3NjbWRfYnVmX3dyaXRlKFNDLCBoYS0+aW9jdGxfZGF0YSwKKwkJCQkgICBzaXplb2YgKGlwc19wYXNzdGhydV90KSArIHNpemVvZiAoaW50KSk7CisJCVNDLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisKKwkJcmV0dXJuIChJUFNfU1VDQ0VTU19JTU0pOworCisJY2FzZSBJUFNfQ09QUFVTUkNNRDoKKwljYXNlIElQU19DT1BQSU9DQ01EOgorCQlpZiAoU0MtPmNtbmRbMF0gPT0gSVBTX0lPQ1RMX0NPTU1BTkQpIHsKKwkJCWlmIChsZW5ndGggPCAoc2l6ZW9mIChpcHNfcGFzc3RocnVfdCkgKyBwdC0+Q21kQlNpemUpKSB7CisJCQkJLyogd3Jvbmcgc2l6ZSAqLworCQkJCURFQlVHX1ZBUigxLAorCQkJCQkgICIoJXMlZCkgUGFzc3RocnUgc3RydWN0dXJlIHdyb25nIHNpemUiLAorCQkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCisJCQkJcmV0dXJuIChJUFNfRkFJTFVSRSk7CisJCQl9CisKKwkJCWlmIChoYS0+ZGV2aWNlX2lkID09IElQU19ERVZJQ0VJRF9DT1BQRVJIRUFEICYmCisJCQkgICAgcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5vcF9jb2RlID09CisJCQkgICAgSVBTX0NNRF9SV19CSU9TRlcpIHsKKwkJCQlyZXQgPSBpcHNfZmxhc2hfY29wcGVyaGVhZChoYSwgcHQsIHNjYik7CisJCQkJaXBzX3NjbWRfYnVmX3dyaXRlKFNDLCBoYS0+aW9jdGxfZGF0YSwKKwkJCQkJCSAgIHNpemVvZiAoaXBzX3Bhc3N0aHJ1X3QpKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKGlwc191c3JjbWQoaGEsIHB0LCBzY2IpKQorCQkJCXJldHVybiAoSVBTX1NVQ0NFU1MpOworCQkJZWxzZQorCQkJCXJldHVybiAoSVBTX0ZBSUxVUkUpOworCQl9CisKKwkJYnJlYWs7CisKKwl9CQkJLyogZW5kIHN3aXRjaCAqLworCisJcmV0dXJuIChJUFNfRkFJTFVSRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUm91dGluZSBOYW1lOiBpcHNfZmxhc2hfY29wcGVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRmxhc2ggdGhlIEJJT1MvRlcgb24gYSBDb3BwZXJoZWFkIHN0eWxlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZmxhc2hfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhLCBpcHNfcGFzc3RocnVfdCAqIHB0LCBpcHNfc2NiX3QgKiBzY2IpCit7CisJaW50IGRhdGFzaXplOworCisJLyogVHJvbWJvbmUgaXMgdGhlIG9ubHkgY29wcGVyaGVhZCB0aGF0IGNhbiBkbyBwYWNrZXQgZmxhc2gsIGJ1dCBvbmx5CisJICogZm9yIGZpcm13YXJlLiBObyBvbmUgc2FpZCBpdCBoYWQgdG8gbWFrZSBzZW5jZS4gKi8KKwlpZiAoSVBTX0lTX1RST01CT05FKGhhKSAmJiBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnR5cGUgPT0gSVBTX0ZXX0lNQUdFKSB7CisJCWlmIChpcHNfdXNyY21kKGhhLCBwdCwgc2NiKSkKKwkJCXJldHVybiBJUFNfU1VDQ0VTUzsKKwkJZWxzZQorCQkJcmV0dXJuIElQU19GQUlMVVJFOworCX0KKwlwdC0+QmFzaWNTdGF0dXMgPSAweDBCOworCXB0LT5FeHRlbmRlZFN0YXR1cyA9IDA7CisJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCS8qIElGIGl0J3MgT0sgdG8gVXNlIHRoZSAiQ0QgQk9PVCIgRmxhc2ggQnVmZmVyLCB0aGVuIHlvdSBjYW4gICAgICovCisJLyogYXZvaWQgYWxsb2NhdGluZyBhIGh1Z2UgYnVmZmVyIHBlciBhZGFwdGVyICggd2hpY2ggY2FuIGZhaWwgKS4gKi8KKwlpZiAocHQtPkNvcHBDUC5jbWQuZmxhc2hmdy50eXBlID09IElQU19CSU9TX0lNQUdFICYmCisJICAgIHB0LT5Db3BwQ1AuY21kLmZsYXNoZncuZGlyZWN0aW9uID09IElQU19FUkFTRV9CSU9TKSB7CisJCXB0LT5CYXNpY1N0YXR1cyA9IDA7CisJCXJldHVybiBpcHNfZmxhc2hfYmlvcyhoYSwgcHQsIHNjYik7CisJfSBlbHNlIGlmIChwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnBhY2tldF9udW0gPT0gMCkgeworCQlpZiAoaXBzX0ZsYXNoRGF0YSAmJiAhdGVzdF9hbmRfc2V0X2JpdCgwLCAmaXBzX0ZsYXNoRGF0YUluVXNlKSl7CisJCQloYS0+Zmxhc2hfZGF0YSA9IGlwc19GbGFzaERhdGE7CisJCQloYS0+Zmxhc2hfYnVzYWRkciA9IGlwc19mbGFzaGJ1c2FkZHI7CisJCQloYS0+Zmxhc2hfbGVuID0gUEFHRV9TSVpFIDw8IDc7CisJCQloYS0+Zmxhc2hfZGF0YXNpemUgPSAwOworCQl9IGVsc2UgaWYgKCFoYS0+Zmxhc2hfZGF0YSkgeworCQkJZGF0YXNpemUgPSBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnRvdGFsX3BhY2tldHMgKgorCQkJICAgIHB0LT5Db3BwQ1AuY21kLmZsYXNoZncuY291bnQ7CisJCQloYS0+Zmxhc2hfZGF0YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wY2lkZXYsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICBkYXRhc2l6ZSwKKwkJCQkJCQkgICAgICAmaGEtPmZsYXNoX2J1c2FkZHIpOworCQkJaWYgKCFoYS0+Zmxhc2hfZGF0YSl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGFsbG9jYXRlIGEgZmxhc2ggYnVmZmVyXG4iKTsKKwkJCQlyZXR1cm4gSVBTX0ZBSUxVUkU7CisJCQl9CisJCQloYS0+Zmxhc2hfZGF0YXNpemUgPSAwOworCQkJaGEtPmZsYXNoX2xlbiA9IGRhdGFzaXplOworCQl9IGVsc2UKKwkJCXJldHVybiBJUFNfRkFJTFVSRTsKKwl9IGVsc2UgeworCQlpZiAocHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5jb3VudCArIGhhLT5mbGFzaF9kYXRhc2l6ZSA+CisJCSAgICBoYS0+Zmxhc2hfbGVuKSB7CisJCQlpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkKGhhKTsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJmYWlsZWQgc2l6ZSBzYW5pdHkgY2hlY2tcbiIpOworCQkJcmV0dXJuIElQU19GQUlMVVJFOworCQl9CisJfQorCWlmICghaGEtPmZsYXNoX2RhdGEpCisJCXJldHVybiBJUFNfRkFJTFVSRTsKKwlwdC0+QmFzaWNTdGF0dXMgPSAwOworCW1lbWNweSgmaGEtPmZsYXNoX2RhdGFbaGEtPmZsYXNoX2RhdGFzaXplXSwgcHQgKyAxLAorCSAgICAgICBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LmNvdW50KTsKKwloYS0+Zmxhc2hfZGF0YXNpemUgKz0gcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5jb3VudDsKKwlpZiAocHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5wYWNrZXRfbnVtID09CisJICAgIHB0LT5Db3BwQ1AuY21kLmZsYXNoZncudG90YWxfcGFja2V0cyAtIDEpIHsKKwkJaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncudHlwZSA9PSBJUFNfQklPU19JTUFHRSkKKwkJCXJldHVybiBpcHNfZmxhc2hfYmlvcyhoYSwgcHQsIHNjYik7CisJCWVsc2UgaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncudHlwZSA9PSBJUFNfRldfSU1BR0UpCisJCQlyZXR1cm4gaXBzX2ZsYXNoX2Zpcm13YXJlKGhhLCBwdCwgc2NiKTsKKwl9CisJcmV0dXJuIElQU19TVUNDRVNTX0lNTTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mbGFzaF9iaW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBmbGFzaGVzIHRoZSBiaW9zIG9mIGEgY29wcGVyaGVhZCBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19mbGFzaF9iaW9zKGlwc19oYV90ICogaGEsIGlwc19wYXNzdGhydV90ICogcHQsIGlwc19zY2JfdCAqIHNjYikKK3sKKworCWlmIChwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LnR5cGUgPT0gSVBTX0JJT1NfSU1BR0UgJiYKKwkgICAgcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5kaXJlY3Rpb24gPT0gSVBTX1dSSVRFX0JJT1MpIHsKKwkJaWYgKCghaGEtPmZ1bmMucHJvZ3JhbWJpb3MpIHx8ICghaGEtPmZ1bmMuZXJhc2ViaW9zKSB8fAorCQkgICAgKCFoYS0+ZnVuYy52ZXJpZnliaW9zKSkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICgoKmhhLT5mdW5jLmVyYXNlYmlvcykgKGhhKSkgeworCQkJREVCVUdfVkFSKDEsCisJCQkJICAiKCVzJWQpIGZsYXNoIGJpb3MgZmFpbGVkIC0gdW5hYmxlIHRvIGVyYXNlIGZsYXNoIiwKKwkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlCisJCSAgICBpZiAoKCpoYS0+ZnVuYy5wcm9ncmFtYmlvcykgKGhhLAorCQkJCQkJIGhhLT5mbGFzaF9kYXRhICsKKwkJCQkJCSBJUFNfQklPU19IRUFERVIsCisJCQkJCQkgaGEtPmZsYXNoX2RhdGFzaXplIC0KKwkJCQkJCSBJUFNfQklPU19IRUFERVIsIDApKSB7CisJCQlERUJVR19WQVIoMSwKKwkJCQkgICIoJXMlZCkgZmxhc2ggYmlvcyBmYWlsZWQgLSB1bmFibGUgdG8gZmxhc2giLAorCQkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisJCQlnb3RvIGVycm9yOworCQl9IGVsc2UKKwkJICAgIGlmICgoKmhhLT5mdW5jLnZlcmlmeWJpb3MpIChoYSwKKwkJCQkJCWhhLT5mbGFzaF9kYXRhICsKKwkJCQkJCUlQU19CSU9TX0hFQURFUiwKKwkJCQkJCWhhLT5mbGFzaF9kYXRhc2l6ZSAtCisJCQkJCQlJUFNfQklPU19IRUFERVIsIDApKSB7CisJCQlERUJVR19WQVIoMSwKKwkJCQkgICIoJXMlZCkgZmxhc2ggYmlvcyBmYWlsZWQgLSB1bmFibGUgdG8gdmVyaWZ5IGZsYXNoIiwKKwkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkKGhhKTsKKwkJcmV0dXJuIElQU19TVUNDRVNTX0lNTTsKKwl9IGVsc2UgaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncudHlwZSA9PSBJUFNfQklPU19JTUFHRSAmJgorCQkgICBwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LmRpcmVjdGlvbiA9PSBJUFNfRVJBU0VfQklPUykgeworCQlpZiAoIWhhLT5mdW5jLmVyYXNlYmlvcykKKwkJCWdvdG8gZXJyb3I7CisJCWlmICgoKmhhLT5mdW5jLmVyYXNlYmlvcykgKGhhKSkgeworCQkJREVCVUdfVkFSKDEsCisJCQkJICAiKCVzJWQpIGZsYXNoIGJpb3MgZmFpbGVkIC0gdW5hYmxlIHRvIGVyYXNlIGZsYXNoIiwKKwkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0pOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlyZXR1cm4gSVBTX1NVQ0NFU1NfSU1NOworCX0KKyAgICAgIGVycm9yOgorCXB0LT5CYXNpY1N0YXR1cyA9IDB4MEI7CisJcHQtPkV4dGVuZGVkU3RhdHVzID0gMHgwMDsKKwlpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkKGhhKTsKKwlyZXR1cm4gSVBTX0ZBSUxVUkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19maWxsX3NjYl9zZ19zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZpbGwgaW4gYSBzaW5nbGUgc2NiIHNnX2xpc3QgZWxlbWVudCBmcm9tIGFuIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcmV0dXJuIGEgLTEgaWYgYSBicmVha3VwIG9jY3VycmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZmlsbF9zY2Jfc2dfc2luZ2xlKGlwc19oYV90ICogaGEsIGRtYV9hZGRyX3QgYnVzYWRkciwKKwkJICAgICAgIGlwc19zY2JfdCAqIHNjYiwgaW50IGluZHgsIHVuc2lnbmVkIGludCBlX2xlbikKK3sKKworCWludCByZXRfdmFsID0gMDsKKworCWlmICgoc2NiLT5kYXRhX2xlbiArIGVfbGVuKSA+IGhhLT5tYXhfeGZlcikgeworCQllX2xlbiA9IGhhLT5tYXhfeGZlciAtIHNjYi0+ZGF0YV9sZW47CisJCXNjYi0+YnJlYWt1cCA9IGluZHg7CisJCSsrc2NiLT5zZ19icmVhazsKKwkJcmV0X3ZhbCA9IC0xOworCX0gZWxzZSB7CisJCXNjYi0+YnJlYWt1cCA9IDA7CisJCXNjYi0+c2dfYnJlYWsgPSAwOworCX0KKwlpZiAoSVBTX1VTRV9FTkhfU0dMSVNUKGhhKSkgeworCQlzY2ItPnNnX2xpc3QuZW5oX2xpc3RbaW5keF0uYWRkcmVzc19sbyA9CisJCSAgICBjcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoYnVzYWRkcikpOworCQlzY2ItPnNnX2xpc3QuZW5oX2xpc3RbaW5keF0uYWRkcmVzc19oaSA9CisJCSAgICBjcHVfdG9fbGUzMihwY2lfZG1hX2hpMzIoYnVzYWRkcikpOworCQlzY2ItPnNnX2xpc3QuZW5oX2xpc3RbaW5keF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoZV9sZW4pOworCX0gZWxzZSB7CisJCXNjYi0+c2dfbGlzdC5zdGRfbGlzdFtpbmR4XS5hZGRyZXNzID0KKwkJICAgIGNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihidXNhZGRyKSk7CisJCXNjYi0+c2dfbGlzdC5zdGRfbGlzdFtpbmR4XS5sZW5ndGggPSBjcHVfdG9fbGUzMihlX2xlbik7CisJfQorCisJKytzY2ItPnNnX2xlbjsKKwlzY2ItPmRhdGFfbGVuICs9IGVfbGVuOworCXJldHVybiByZXRfdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ZsYXNoX2Zpcm13YXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGZsYXNoZXMgdGhlIGZpcm13YXJlIG9mIGEgY29wcGVyaGVhZCBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2ZsYXNoX2Zpcm13YXJlKGlwc19oYV90ICogaGEsIGlwc19wYXNzdGhydV90ICogcHQsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlJUFNfU0dfTElTVCBzZ19saXN0OworCXVpbnQzMl90IGNtZF9idXNhZGRyOworCisJaWYgKHB0LT5Db3BwQ1AuY21kLmZsYXNoZncudHlwZSA9PSBJUFNfRldfSU1BR0UgJiYKKwkgICAgcHQtPkNvcHBDUC5jbWQuZmxhc2hmdy5kaXJlY3Rpb24gPT0gSVBTX1dSSVRFX0ZXKSB7CisJCW1lbXNldCgmcHQtPkNvcHBDUC5jbWQsIDAsIHNpemVvZiAoSVBTX0hPU1RfQ09NTUFORCkpOworCQlwdC0+Q29wcENQLmNtZC5mbGFzaGZ3Lm9wX2NvZGUgPSBJUFNfQ01EX0RPV05MT0FEOworCQlwdC0+Q29wcENQLmNtZC5mbGFzaGZ3LmNvdW50ID0gY3B1X3RvX2xlMzIoaGEtPmZsYXNoX2RhdGFzaXplKTsKKwl9IGVsc2UgeworCQlwdC0+QmFzaWNTdGF0dXMgPSAweDBCOworCQlwdC0+RXh0ZW5kZWRTdGF0dXMgPSAweDAwOworCQlpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkKGhhKTsKKwkJcmV0dXJuIElQU19GQUlMVVJFOworCX0KKwkvKiBTYXZlIHRoZSBTL0cgbGlzdCBwb2ludGVyIHNvIGl0IGRvZXNuJ3QgZ2V0IGNsb2JiZXJlZCAqLworCXNnX2xpc3QubGlzdCA9IHNjYi0+c2dfbGlzdC5saXN0OworCWNtZF9idXNhZGRyID0gc2NiLT5zY2JfYnVzYWRkcjsKKwkvKiBjb3B5IGluIHRoZSBDUCAqLworCW1lbWNweSgmc2NiLT5jbWQsICZwdC0+Q29wcENQLmNtZCwgc2l6ZW9mIChJUFNfSU9DVExfQ01EKSk7CisJLyogRklYIHN0dWZmIHRoYXQgbWlnaHQgYmUgd3JvbmcgKi8KKwlzY2ItPnNnX2xpc3QubGlzdCA9IHNnX2xpc3QubGlzdDsKKwlzY2ItPnNjYl9idXNhZGRyID0gY21kX2J1c2FkZHI7CisJc2NiLT5idXMgPSBzY2ItPnNjc2lfY21kLT5kZXZpY2UtPmNoYW5uZWw7CisJc2NiLT50YXJnZXRfaWQgPSBzY2ItPnNjc2lfY21kLT5kZXZpY2UtPmlkOworCXNjYi0+bHVuID0gc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5sdW47CisJc2NiLT5zZ19sZW4gPSAwOworCXNjYi0+ZGF0YV9sZW4gPSAwOworCXNjYi0+ZmxhZ3MgPSAwOworCXNjYi0+b3BfY29kZSA9IDA7CisJc2NiLT5jYWxsYmFjayA9IGlwc2ludHJfZG9uZTsKKwlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisKKwlzY2ItPmRhdGFfbGVuID0gaGEtPmZsYXNoX2RhdGFzaXplOworCXNjYi0+ZGF0YV9idXNhZGRyID0KKwkgICAgcGNpX21hcF9zaW5nbGUoaGEtPnBjaWRldiwgaGEtPmZsYXNoX2RhdGEsIHNjYi0+ZGF0YV9sZW4sCisJCQkgICBJUFNfRE1BX0RJUihzY2IpKTsKKwlzY2ItPmZsYWdzIHw9IElQU19TQ0JfTUFQX1NJTkdMRTsKKwlzY2ItPmNtZC5mbGFzaGZ3LmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwlzY2ItPmNtZC5mbGFzaGZ3LmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlMzIoc2NiLT5kYXRhX2J1c2FkZHIpOworCWlmIChwdC0+VGltZU91dCkKKwkJc2NiLT50aW1lb3V0ID0gcHQtPlRpbWVPdXQ7CisJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCXJldHVybiBJUFNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mcmVlX2ZsYXNoX2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICByZWxlYXNlIHRoZSBtZW1vcnkgcmVzb3VyY2VzIHVzZWQgdG8gaG9sZCB0aGUgZmxhc2ggaW1hZ2UgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkKGlwc19oYV90ICogaGEpCit7CisJaWYgKGhhLT5mbGFzaF9kYXRhID09IGlwc19GbGFzaERhdGEpCisJCXRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmaXBzX0ZsYXNoRGF0YUluVXNlKTsKKwllbHNlIGlmIChoYS0+Zmxhc2hfZGF0YSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGNpZGV2LCBoYS0+Zmxhc2hfbGVuLCBoYS0+Zmxhc2hfZGF0YSwKKwkJCQkgICAgaGEtPmZsYXNoX2J1c2FkZHIpOworCWhhLT5mbGFzaF9kYXRhID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3VzcmNtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQcm9jZXNzIGEgdXNlciBjb21tYW5kIGFuZCBtYWtlIGl0IHJlYWR5IHRvIHNlbmQgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3VzcmNtZChpcHNfaGFfdCAqIGhhLCBpcHNfcGFzc3RocnVfdCAqIHB0LCBpcHNfc2NiX3QgKiBzY2IpCit7CisJSVBTX1NHX0xJU1Qgc2dfbGlzdDsKKwl1aW50MzJfdCBjbWRfYnVzYWRkcjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3VzcmNtZCIsIDEpOworCisJaWYgKCghc2NiKSB8fCAoIXB0KSB8fCAoIWhhKSkKKwkJcmV0dXJuICgwKTsKKworCS8qIFNhdmUgdGhlIFMvRyBsaXN0IHBvaW50ZXIgc28gaXQgZG9lc24ndCBnZXQgY2xvYmJlcmVkICovCisJc2dfbGlzdC5saXN0ID0gc2NiLT5zZ19saXN0Lmxpc3Q7CisJY21kX2J1c2FkZHIgPSBzY2ItPnNjYl9idXNhZGRyOworCS8qIGNvcHkgaW4gdGhlIENQICovCisJbWVtY3B5KCZzY2ItPmNtZCwgJnB0LT5Db3BwQ1AuY21kLCBzaXplb2YgKElQU19JT0NUTF9DTUQpKTsKKwltZW1jcHkoJnNjYi0+ZGNkYiwgJnB0LT5Db3BwQ1AuZGNkYiwgc2l6ZW9mIChJUFNfRENEQl9UQUJMRSkpOworCisJLyogRklYIHN0dWZmIHRoYXQgbWlnaHQgYmUgd3JvbmcgKi8KKwlzY2ItPnNnX2xpc3QubGlzdCA9IHNnX2xpc3QubGlzdDsKKwlzY2ItPnNjYl9idXNhZGRyID0gY21kX2J1c2FkZHI7CisJc2NiLT5idXMgPSBzY2ItPnNjc2lfY21kLT5kZXZpY2UtPmNoYW5uZWw7CisJc2NiLT50YXJnZXRfaWQgPSBzY2ItPnNjc2lfY21kLT5kZXZpY2UtPmlkOworCXNjYi0+bHVuID0gc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5sdW47CisJc2NiLT5zZ19sZW4gPSAwOworCXNjYi0+ZGF0YV9sZW4gPSAwOworCXNjYi0+ZmxhZ3MgPSAwOworCXNjYi0+b3BfY29kZSA9IDA7CisJc2NiLT5jYWxsYmFjayA9IGlwc2ludHJfZG9uZTsKKwlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisJc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCisJLyogd2UgZG9uJ3Qgc3VwcG9ydCBEQ0RCL1JFQUQvV1JJVEUgU2NhdHRlciBHYXRoZXIgKi8KKwlpZiAoKHNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPT0gSVBTX0NNRF9SRUFEX1NHKSB8fAorCSAgICAoc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9PSBJUFNfQ01EX1dSSVRFX1NHKSB8fAorCSAgICAoc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9PSBJUFNfQ01EX0RDREJfU0cpKQorCQlyZXR1cm4gKDApOworCisJaWYgKHB0LT5DbWRCU2l6ZSkgeworCQlzY2ItPmRhdGFfbGVuID0gcHQtPkNtZEJTaXplOworCQlzY2ItPmRhdGFfYnVzYWRkciA9IGhhLT5pb2N0bF9idXNhZGRyICsgc2l6ZW9mIChpcHNfcGFzc3RocnVfdCk7CisJfSBlbHNlIHsKKwkJc2NiLT5kYXRhX2J1c2FkZHIgPSAwTDsKKwl9CisKKwlpZiAoc2NiLT5jbWQuZGNkYi5vcF9jb2RlID09IElQU19DTURfRENEQikKKwkJc2NiLT5jbWQuZGNkYi5kY2RiX2FkZHJlc3MgPSBjcHVfdG9fbGUzMihzY2ItPnNjYl9idXNhZGRyICsKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpICZzY2ItPgorCQkJCQkJCSBkY2RiIC0KKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpIHNjYik7CisKKwlpZiAocHQtPkNtZEJTaXplKSB7CisJCWlmIChzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPT0gSVBTX0NNRF9EQ0RCKQorCQkJc2NiLT5kY2RiLmJ1ZmZlcl9wb2ludGVyID0KKwkJCSAgICBjcHVfdG9fbGUzMihzY2ItPmRhdGFfYnVzYWRkcik7CisJCWVsc2UKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2FkZHIgPQorCQkJICAgIGNwdV90b19sZTMyKHNjYi0+ZGF0YV9idXNhZGRyKTsKKwl9CisKKwkvKiBzZXQgdGltZW91dHMgKi8KKwlpZiAocHQtPlRpbWVPdXQpIHsKKwkJc2NiLT50aW1lb3V0ID0gcHQtPlRpbWVPdXQ7CisKKwkJaWYgKHB0LT5UaW1lT3V0IDw9IDEwKQorCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RJTUVPVVQxMDsKKwkJZWxzZSBpZiAocHQtPlRpbWVPdXQgPD0gNjApCisJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDYwOworCQllbHNlCisJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDIwTTsKKwl9CisKKwkvKiBhc3N1bWUgc3VjY2VzcyAqLworCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfY2xlYW51cF9wYXNzdGhydSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENsZWFudXAgYWZ0ZXIgYSBwYXNzdGhydSBjb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2NsZWFudXBfcGFzc3RocnUoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCWlwc19wYXNzdGhydV90ICpwdDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2NsZWFudXBfcGFzc3RocnUiLCAxKTsKKworCWlmICgoIXNjYikgfHwgKCFzY2ItPnNjc2lfY21kKSB8fCAoIXNjYi0+c2NzaV9jbWQtPnJlcXVlc3RfYnVmZmVyKSkgeworCQlERUJVR19WQVIoMSwgIiglcyVkKSBjb3VsZG4ndCBjbGVhbnVwIGFmdGVyIHBhc3N0aHJ1IiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSk7CisKKwkJcmV0dXJuOworCX0KKwlwdCA9IChpcHNfcGFzc3RocnVfdCAqKSBoYS0+aW9jdGxfZGF0YTsKKworCS8qIENvcHkgZGF0YSBiYWNrIHRvIHRoZSB1c2VyICovCisJaWYgKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PSBJUFNfQ01EX0RDREIpCS8qIENvcHkgRENEQiBCYWNrIHRvIENhbGxlcidzIEFyZWEgKi8KKwkJbWVtY3B5KCZwdC0+Q29wcENQLmRjZGIsICZzY2ItPmRjZGIsIHNpemVvZiAoSVBTX0RDREJfVEFCTEUpKTsKKworCXB0LT5CYXNpY1N0YXR1cyA9IHNjYi0+YmFzaWNfc3RhdHVzOworCXB0LT5FeHRlbmRlZFN0YXR1cyA9IHNjYi0+ZXh0ZW5kZWRfc3RhdHVzOworCXB0LT5BZGFwdGVyVHlwZSA9IGhhLT5hZF90eXBlOworCisJaWYgKGhhLT5kZXZpY2VfaWQgPT0gSVBTX0RFVklDRUlEX0NPUFBFUkhFQUQgJiYKKwkgICAgKHNjYi0+Y21kLmZsYXNoZncub3BfY29kZSA9PSBJUFNfQ01EX0RPV05MT0FEIHx8CisJICAgICBzY2ItPmNtZC5mbGFzaGZ3Lm9wX2NvZGUgPT0gSVBTX0NNRF9SV19CSU9TRlcpKQorCQlpcHNfZnJlZV9mbGFzaF9jb3BwZXJoZWFkKGhhKTsKKworCWlwc19zY21kX2J1Zl93cml0ZShzY2ItPnNjc2lfY21kLCBoYS0+aW9jdGxfZGF0YSwgaGEtPmlvY3RsX2RhdGFzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2hvc3RfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgcGFzc3RocnUgaW50ZXJmYWNlIGZvciB0aGUgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2hvc3RfaW5mbyhpcHNfaGFfdCAqIGhhLCBjaGFyICpwdHIsIG9mZl90IG9mZnNldCwgaW50IGxlbikKK3sKKwlJUFNfSU5GT1NUUiBpbmZvOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaG9zdF9pbmZvIiwgMSk7CisKKwlpbmZvLmJ1ZmZlciA9IHB0cjsKKwlpbmZvLmxlbmd0aCA9IGxlbjsKKwlpbmZvLm9mZnNldCA9IG9mZnNldDsKKwlpbmZvLnBvcyA9IDA7CisJaW5mby5sb2NhbHBvcyA9IDA7CisKKwljb3B5X2luZm8oJmluZm8sICJcbklCTSBTZXJ2ZVJBSUQgR2VuZXJhbCBJbmZvcm1hdGlvbjpcblxuIik7CisKKwlpZiAoKGxlMzJfdG9fY3B1KGhhLT5udnJhbS0+c2lnbmF0dXJlKSA9PSBJUFNfTlZSQU1fUDVfU0lHKSAmJgorCSAgICAobGUxNl90b19jcHUoaGEtPm52cmFtLT5hZGFwdGVyX3R5cGUpICE9IDApKQorCQljb3B5X2luZm8oJmluZm8sICJcdENvbnRyb2xsZXIgVHlwZSAgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorCQkJICBpcHNfYWRhcHRlcl9uYW1lW2hhLT5hZF90eXBlIC0gMV0pOworCWVsc2UKKwkJY29weV9pbmZvKCZpbmZvLAorCQkJICAiXHRDb250cm9sbGVyIFR5cGUgICAgICAgICAgICAgICAgICAgOiBVbmtub3duXG4iKTsKKworCWlmIChoYS0+aW9fYWRkcikKKwkJY29weV9pbmZvKCZpbmZvLAorCQkJICAiXHRJTyByZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgOiAweCVseCAoJWQgYnl0ZXMpXG4iLAorCQkJICBoYS0+aW9fYWRkciwgaGEtPmlvX2xlbik7CisKKwlpZiAoaGEtPm1lbV9hZGRyKSB7CisJCWNvcHlfaW5mbygmaW5mbywKKwkJCSAgIlx0TWVtb3J5IHJlZ2lvbiAgICAgICAgICAgICAgICAgICAgIDogMHglbHggKCVkIGJ5dGVzKVxuIiwKKwkJCSAgaGEtPm1lbV9hZGRyLCBoYS0+bWVtX2xlbik7CisJCWNvcHlfaW5mbygmaW5mbywKKwkJCSAgIlx0U2hhcmVkIG1lbW9yeSBhZGRyZXNzICAgICAgICAgICAgIDogMHglbHhcbiIsCisJCQkgIGhhLT5tZW1fcHRyKTsKKwl9CisKKwljb3B5X2luZm8oJmluZm8sICJcdElSUSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICA6ICVkXG4iLCBoYS0+aXJxKTsKKworICAgIC8qIEZvciB0aGUgTmV4dCAzIGxpbmVzIENoZWNrIGZvciBCaW5hcnkgMCBhdCB0aGUgZW5kIGFuZCBkb24ndCBpbmNsdWRlIGl0IGlmIGl0J3MgdGhlcmUuICovCisgICAgLyogVGhhdCBrZWVwcyBldmVyeXRoaW5nIGhhcHB5IGZvciAidGV4dCIgb3BlcmF0aW9ucyBvbiB0aGUgcHJvYyBmaWxlLiAgICAgICAgICAgICAgICAgICAgKi8KKworCWlmIChsZTMyX3RvX2NwdShoYS0+bnZyYW0tPnNpZ25hdHVyZSkgPT0gSVBTX05WUkFNX1A1X1NJRykgeworICAgICAgICBpZiAoaGEtPm52cmFtLT5iaW9zX2xvd1szXSA9PSAwKSB7IAorICAgICAgICAgICAgY29weV9pbmZvKCZpbmZvLAorCQkJICAgICAgICAgICJcdEJJT1MgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjXG4iLAorCQkJICAgICAgICAgIGhhLT5udnJhbS0+Ymlvc19oaWdoWzBdLCBoYS0+bnZyYW0tPmJpb3NfaGlnaFsxXSwKKwkJCSAgICAgICAgICBoYS0+bnZyYW0tPmJpb3NfaGlnaFsyXSwgaGEtPm52cmFtLT5iaW9zX2hpZ2hbM10sCisJCQkgICAgICAgICAgaGEtPm52cmFtLT5iaW9zX2xvd1swXSwgaGEtPm52cmFtLT5iaW9zX2xvd1sxXSwKKwkJCSAgICAgICAgICBoYS0+bnZyYW0tPmJpb3NfbG93WzJdKTsKKworICAgICAgICB9IGVsc2UgeworCQkgICAgY29weV9pbmZvKCZpbmZvLAorCQkJICAgICAgICAgICJcdEJJT1MgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICA6ICVjJWMlYyVjJWMlYyVjJWNcbiIsCisJCQkgICAgICAgICAgaGEtPm52cmFtLT5iaW9zX2hpZ2hbMF0sIGhhLT5udnJhbS0+Ymlvc19oaWdoWzFdLAorCQkJICAgICAgICAgIGhhLT5udnJhbS0+Ymlvc19oaWdoWzJdLCBoYS0+bnZyYW0tPmJpb3NfaGlnaFszXSwKKwkJCSAgICAgICAgICBoYS0+bnZyYW0tPmJpb3NfbG93WzBdLCBoYS0+bnZyYW0tPmJpb3NfbG93WzFdLAorCQkJICAgICAgICAgIGhhLT5udnJhbS0+Ymlvc19sb3dbMl0sIGhhLT5udnJhbS0+Ymlvc19sb3dbM10pOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAoaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bN10gPT0gMCkgeworICAgICAgICBjb3B5X2luZm8oJmluZm8sCisJCSAgICAgICAgICAiXHRGaXJtd2FyZSBWZXJzaW9uICAgICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlY1xuIiwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzBdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvblsxXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzJdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvblszXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzRdLCBoYS0+ZW5xLT5Db2RlQmxrVmVyc2lvbls1XSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzZdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5X2luZm8oJmluZm8sCisJCSAgICAgICAgICAiXHRGaXJtd2FyZSBWZXJzaW9uICAgICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkgICAgICAgICAgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bMF0sIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzFdLAorCQkgICAgICAgICAgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bMl0sIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzNdLAorCQkgICAgICAgICAgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bNF0sIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzVdLAorCQkgICAgICAgICAgaGEtPmVucS0+Q29kZUJsa1ZlcnNpb25bNl0sIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uWzddKTsKKyAgICB9CisKKyAgICBpZiAoaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bN10gPT0gMCkgeworICAgICAgICBjb3B5X2luZm8oJmluZm8sCisJCSAgICAgICAgICAiXHRCb290IEJsb2NrIFZlcnNpb24gICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlY1xuIiwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzBdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvblsxXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzJdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvblszXSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzRdLCBoYS0+ZW5xLT5Cb290QmxrVmVyc2lvbls1XSwKKwkJICAgICAgICAgIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzZdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5X2luZm8oJmluZm8sCisJCSAgICAgICAgICAiXHRCb290IEJsb2NrIFZlcnNpb24gICAgICAgICAgICAgICAgOiAlYyVjJWMlYyVjJWMlYyVjXG4iLAorCQkgICAgICAgICAgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bMF0sIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzFdLAorCQkgICAgICAgICAgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bMl0sIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzNdLAorCQkgICAgICAgICAgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bNF0sIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzVdLAorCQkgICAgICAgICAgaGEtPmVucS0+Qm9vdEJsa1ZlcnNpb25bNl0sIGhhLT5lbnEtPkJvb3RCbGtWZXJzaW9uWzddKTsKKyAgICB9CisKKwljb3B5X2luZm8oJmluZm8sICJcdERyaXZlciBWZXJzaW9uICAgICAgICAgICAgICAgICAgICA6ICVzJXNcbiIsCisJCSAgSVBTX1ZFUlNJT05fSElHSCwgSVBTX1ZFUlNJT05fTE9XKTsKKworCWNvcHlfaW5mbygmaW5mbywgIlx0RHJpdmVyIEJ1aWxkICAgICAgICAgICAgICAgICAgICAgIDogJWRcbiIsCisJCSAgSVBTX0JVSUxEX0lERU5UKTsKKworCWNvcHlfaW5mbygmaW5mbywgIlx0TWF4IFBoeXNpY2FsIERldmljZXMgICAgICAgICAgICAgIDogJWRcbiIsCisJCSAgaGEtPmVucS0+dWNNYXhQaHlzaWNhbERldmljZXMpOworCWNvcHlfaW5mbygmaW5mbywgIlx0TWF4IEFjdGl2ZSBDb21tYW5kcyAgICAgICAgICAgICAgIDogJWRcbiIsCisJCSAgaGEtPm1heF9jbWRzKTsKKwljb3B5X2luZm8oJmluZm8sICJcdEN1cnJlbnQgUXVldWVkIENvbW1hbmRzICAgICAgICAgICA6ICVkXG4iLAorCQkgIGhhLT5zY2Jfd2FpdGxpc3QuY291bnQpOworCWNvcHlfaW5mbygmaW5mbywgIlx0Q3VycmVudCBBY3RpdmUgQ29tbWFuZHMgICAgICAgICAgIDogJWRcbiIsCisJCSAgaGEtPnNjYl9hY3RpdmVsaXN0LmNvdW50IC0gaGEtPm51bV9pb2N0bCk7CisJY29weV9pbmZvKCZpbmZvLCAiXHRDdXJyZW50IFF1ZXVlZCBQVCBDb21tYW5kcyAgICAgICAgOiAlZFxuIiwKKwkJICBoYS0+Y29wcF93YWl0bGlzdC5jb3VudCk7CisJY29weV9pbmZvKCZpbmZvLCAiXHRDdXJyZW50IEFjdGl2ZSBQVCBDb21tYW5kcyAgICAgICAgOiAlZFxuIiwKKwkJICBoYS0+bnVtX2lvY3RsKTsKKworCWNvcHlfaW5mbygmaW5mbywgIlxuIik7CisKKwlyZXR1cm4gKGluZm8ubG9jYWxwb3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBjb3B5X21lbV9pbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENvcHkgZGF0YSBpbnRvIGFuIElQU19JTkZPU1RSIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorY29weV9tZW1faW5mbyhJUFNfSU5GT1NUUiAqIGluZm8sIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJTUVUSE9EX1RSQUNFKCJjb3B5X21lbV9pbmZvIiwgMSk7CisKKwlpZiAoaW5mby0+cG9zICsgbGVuIDwgaW5mby0+b2Zmc2V0KSB7CisJCWluZm8tPnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5mby0+cG9zIDwgaW5mby0+b2Zmc2V0KSB7CisJCWRhdGEgKz0gKGluZm8tPm9mZnNldCAtIGluZm8tPnBvcyk7CisJCWxlbiAtPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwkJaW5mby0+cG9zICs9IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOworCX0KKworCWlmIChpbmZvLT5sb2NhbHBvcyArIGxlbiA+IGluZm8tPmxlbmd0aCkKKwkJbGVuID0gaW5mby0+bGVuZ3RoIC0gaW5mby0+bG9jYWxwb3M7CisKKwlpZiAobGVuID4gMCkgeworCQltZW1jcHkoaW5mby0+YnVmZmVyICsgaW5mby0+bG9jYWxwb3MsIGRhdGEsIGxlbik7CisJCWluZm8tPnBvcyArPSBsZW47CisJCWluZm8tPmxvY2FscG9zICs9IGxlbjsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGNvcHlfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcHJpbnRmIHN0eWxlIHdyYXBwZXIgZm9yIGFuIGluZm8gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2NvcHlfaW5mbyhJUFNfSU5GT1NUUiAqIGluZm8sIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZlsxMjhdOworCWludCBsZW47CisKKwlNRVRIT0RfVFJBQ0UoImNvcHlfaW5mbyIsIDEpOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJY29weV9tZW1faW5mbyhpbmZvLCBidWYsIGxlbik7CisKKwlyZXR1cm4gKGxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pZGVudGlmeV9jb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgSWRlbnRpZnkgdGhpcyBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfaWRlbnRpZnlfY29udHJvbGxlcihpcHNfaGFfdCAqIGhhKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX2lkZW50aWZ5X2NvbnRyb2xsZXIiLCAxKTsKKworCXN3aXRjaCAoaGEtPmRldmljZV9pZCkgeworCWNhc2UgSVBTX0RFVklDRUlEX0NPUFBFUkhFQUQ6CisJCWlmIChoYS0+cmV2aXNpb25faWQgPD0gSVBTX1JFVklEX1NFUlZFUkFJRCkgeworCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDsKKwkJfSBlbHNlIGlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1NFUlZFUkFJRDIpIHsKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQyOworCQl9IGVsc2UgaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfTkFWQUpPKSB7CisJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfTkFWQUpPOworCQl9IGVsc2UgaWYgKChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1NFUlZFUkFJRDIpCisJCQkgICAmJiAoaGEtPnNsb3RfbnVtID09IDApKSB7CisJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfS0lPV0E7CisJCX0gZWxzZSBpZiAoKGhhLT5yZXZpc2lvbl9pZCA+PSBJUFNfUkVWSURfQ0xBUklORVRQMSkgJiYKKwkJCSAgIChoYS0+cmV2aXNpb25faWQgPD0gSVBTX1JFVklEX0NMQVJJTkVUUDMpKSB7CisJCQlpZiAoaGEtPmVucS0+dWNNYXhQaHlzaWNhbERldmljZXMgPT0gMTUpCisJCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDNMOworCQkJZWxzZQorCQkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQzOworCQl9IGVsc2UgaWYgKChoYS0+cmV2aXNpb25faWQgPj0gSVBTX1JFVklEX1RST01CT05FMzIpICYmCisJCQkgICAoaGEtPnJldmlzaW9uX2lkIDw9IElQU19SRVZJRF9UUk9NQk9ORTY0KSkgeworCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDRIOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJUFNfREVWSUNFSURfTU9SUEhFVVM6CisJCXN3aXRjaCAoaGEtPnN1YmRldmljZV9pZCkgeworCQljYXNlIElQU19TVUJERVZJQ0VJRF80TDoKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzRNOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDRNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFNfU1VCREVWSUNFSURfNE1YOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDRNWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzRMWDoKKwkJCWhhLT5hZF90eXBlID0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TFg7CisJCQlicmVhazsKKworCQljYXNlIElQU19TVUJERVZJQ0VJRF81STI6CisJCQloYS0+YWRfdHlwZSA9IElQU19BRFRZUEVfU0VSVkVSQUlENUkyOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFNfU1VCREVWSUNFSURfNUkxOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDVJMTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIElQU19ERVZJQ0VJRF9NQVJDTzoKKwkJc3dpdGNoIChoYS0+c3ViZGV2aWNlX2lkKSB7CisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzZNOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDZNOworCQkJYnJlYWs7CisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzZJOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDZJOworCQkJYnJlYWs7CisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzdrOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDdrOworCQkJYnJlYWs7CisJCWNhc2UgSVBTX1NVQkRFVklDRUlEXzdNOgorCQkJaGEtPmFkX3R5cGUgPSBJUFNfQURUWVBFX1NFUlZFUkFJRDdNOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZ2V0X2Jpb3NfdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEdldCB0aGUgQklPUyByZXZpc2lvbiBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2dldF9iaW9zX3ZlcnNpb24oaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IHJldDsKKwl1aW50OF90IG1ham9yOworCXVpbnQ4X3QgbWlub3I7CisJdWludDhfdCBzdWJtaW5vcjsKKwl1aW50OF90ICpidWZmZXI7CisJY2hhciBoZXhEaWdpdHNbXSA9CisJICAgIHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLAorICAgICAnRCcsICdFJywgJ0YnIH07CisKKwlNRVRIT0RfVFJBQ0UoImlwc19nZXRfYmlvc192ZXJzaW9uIiwgMSk7CisKKwltYWpvciA9IDA7CisJbWlub3IgPSAwOworCisJc3RybmNweShoYS0+Ymlvc192ZXJzaW9uLCAiICAgICAgID8iLCA4KTsKKworCWlmIChoYS0+ZGV2aWNlX2lkID09IElQU19ERVZJQ0VJRF9DT1BQRVJIRUFEKSB7CisJCWlmIChJUFNfVVNFX01FTUlPKGhhKSkgeworCQkJLyogTWVtb3J5IE1hcHBlZCBJL08gKi8KKworCQkJLyogdGVzdCAxc3QgYnl0ZSAqLworCQkJd3JpdGVsKDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJaWYgKHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKSAhPSAweDU1KQorCQkJCXJldHVybjsKKworCQkJd3JpdGVsKDEsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJaWYgKHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKSAhPSAweEFBKQorCQkJCXJldHVybjsKKworCQkJLyogR2V0IE1ham9yIHZlcnNpb24gKi8KKwkJCXdyaXRlbCgweDFGRiwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQltYWpvciA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKworCQkJLyogR2V0IE1pbm9yIHZlcnNpb24gKi8KKwkJCXdyaXRlbCgweDFGRSwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCQkJbWlub3IgPSByZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisKKwkJCS8qIEdldCBTdWJNaW5vciB2ZXJzaW9uICovCisJCQl3cml0ZWwoMHgxRkQsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwkJCXN1Ym1pbm9yID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCisJCX0gZWxzZSB7CisJCQkvKiBQcm9ncmFtbWVkIEkvTyAqLworCisJCQkvKiB0ZXN0IDFzdCBieXRlICovCisJCQlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJaWYgKGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCkgIT0gMHg1NSkKKwkJCQlyZXR1cm47CisKKwkJCW91dGwoY3B1X3RvX2xlMzIoMSksIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJaWYgKGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCkgIT0gMHhBQSkKKwkJCQlyZXR1cm47CisKKwkJCS8qIEdldCBNYWpvciB2ZXJzaW9uICovCisJCQlvdXRsKGNwdV90b19sZTMyKDB4MUZGKSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQltYWpvciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisKKwkJCS8qIEdldCBNaW5vciB2ZXJzaW9uICovCisJCQlvdXRsKGNwdV90b19sZTMyKDB4MUZFKSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQltaW5vciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisKKwkJCS8qIEdldCBTdWJNaW5vciB2ZXJzaW9uICovCisJCQlvdXRsKGNwdV90b19sZTMyKDB4MUZEKSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQlzdWJtaW5vciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisKKwkJfQorCX0gZWxzZSB7CisJCS8qIE1vcnBoZXVzIEZhbWlseSAtIFNlbmQgQ29tbWFuZCB0byB0aGUgY2FyZCAqLworCisJCWJ1ZmZlciA9IGhhLT5pb2N0bF9kYXRhOworCisJCW1lbXNldChidWZmZXIsIDAsIDB4MTAwMCk7CisKKwkJc2NiID0gJmhhLT5zY2JzW2hhLT5tYXhfY21kcyAtIDFdOworCisJCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCQlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisJCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9SV19CSU9TRlc7CisKKwkJc2NiLT5jbWQuZmxhc2hmdy5vcF9jb2RlID0gSVBTX0NNRF9SV19CSU9TRlc7CisJCXNjYi0+Y21kLmZsYXNoZncuY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCQlzY2ItPmNtZC5mbGFzaGZ3LnR5cGUgPSAxOworCQlzY2ItPmNtZC5mbGFzaGZ3LmRpcmVjdGlvbiA9IDA7CisJCXNjYi0+Y21kLmZsYXNoZncuY291bnQgPSBjcHVfdG9fbGUzMigweDgwMCk7CisJCXNjYi0+Y21kLmZsYXNoZncudG90YWxfcGFja2V0cyA9IDE7CisJCXNjYi0+Y21kLmZsYXNoZncucGFja2V0X251bSA9IDA7CisJCXNjYi0+ZGF0YV9sZW4gPSAweDEwMDA7CisJCXNjYi0+Y21kLmZsYXNoZncuYnVmZmVyX2FkZHIgPSBoYS0+aW9jdGxfYnVzYWRkcjsKKworCQkvKiBpc3N1ZSB0aGUgY29tbWFuZCAqLworCQlpZiAoKChyZXQgPQorCQkgICAgICBpcHNfc2VuZF93YWl0KGhhLCBzY2IsIGlwc19jbWRfdGltZW91dCwKKwkJCQkgICAgaW50cikpID09IElQU19GQUlMVVJFKQorCQkgICAgfHwgKHJldCA9PSBJUFNfU1VDQ0VTU19JTU0pCisJCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkgeworCQkJLyogRXJyb3Igb2NjdXJyZWQgKi8KKworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKChidWZmZXJbMHhDMF0gPT0gMHg1NSkgJiYgKGJ1ZmZlclsweEMxXSA9PSAweEFBKSkgeworCQkJbWFqb3IgPSBidWZmZXJbMHgxZmYgKyAweEMwXTsJLyogT2Zmc2V0IDB4MWZmIGFmdGVyIHRoZSBoZWFkZXIgKDB4YzApICovCisJCQltaW5vciA9IGJ1ZmZlclsweDFmZSArIDB4QzBdOwkvKiBPZmZzZXQgMHgxZmUgYWZ0ZXIgdGhlIGhlYWRlciAoMHhjMCkgKi8KKwkJCXN1Ym1pbm9yID0gYnVmZmVyWzB4MWZkICsgMHhDMF07CS8qIE9mZnNldCAweDFmZCBhZnRlciB0aGUgaGVhZGVyICgweGMwKSAqLworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJaGEtPmJpb3NfdmVyc2lvblswXSA9IGhleERpZ2l0c1sobWFqb3IgJiAweEYwKSA+PiA0XTsKKwloYS0+Ymlvc192ZXJzaW9uWzFdID0gJy4nOworCWhhLT5iaW9zX3ZlcnNpb25bMl0gPSBoZXhEaWdpdHNbbWFqb3IgJiAweDBGXTsKKwloYS0+Ymlvc192ZXJzaW9uWzNdID0gaGV4RGlnaXRzW3N1Ym1pbm9yXTsKKwloYS0+Ymlvc192ZXJzaW9uWzRdID0gJy4nOworCWhhLT5iaW9zX3ZlcnNpb25bNV0gPSBoZXhEaWdpdHNbKG1pbm9yICYgMHhGMCkgPj4gNF07CisJaGEtPmJpb3NfdmVyc2lvbls2XSA9IGhleERpZ2l0c1ttaW5vciAmIDB4MEZdOworCWhhLT5iaW9zX3ZlcnNpb25bN10gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaGFpbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluaXRpYWxpemUgdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URTogQXNzdW1lcyB0byBiZSBjYWxsZWQgZnJvbSB3aXRoIGEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2hhaW5pdChpcHNfaGFfdCAqIGhhKQoreworCWludCBpOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJTUVUSE9EX1RSQUNFKCJpcHNfaGFpbml0IiwgMSk7CisKKwlpZiAoIWhhKQorCQlyZXR1cm4gKDApOworCisJaWYgKGhhLT5mdW5jLnN0YXRpbml0KQorCQkoKmhhLT5mdW5jLnN0YXRpbml0KSAoaGEpOworCisJaWYgKGhhLT5mdW5jLmVuYWJsZWludCkKKwkJKCpoYS0+ZnVuYy5lbmFibGVpbnQpIChoYSk7CisKKwkvKiBTZW5kIEZGREMgKi8KKwloYS0+cmVzZXRfY291bnQgPSAxOworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWhhLT5sYXN0X2ZmZGMgPSB0di50dl9zZWM7CisJaXBzX2ZmZGNfcmVzZXQoaGEsIElQU19JTlRSX0lPUkwpOworCisJaWYgKCFpcHNfcmVhZF9jb25maWcoaGEsIElQU19JTlRSX0lPUkwpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgInVuYWJsZSB0byByZWFkIGNvbmZpZyBmcm9tIGNvbnRyb2xsZXIuXG4iKTsKKworCQlyZXR1cm4gKDApOworCX0KKwkvKiBlbmQgaWYgKi8KKwlpZiAoIWlwc19yZWFkX2FkYXB0ZXJfc3RhdHVzKGhhLCBJUFNfSU5UUl9JT1JMKSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJ1bmFibGUgdG8gcmVhZCBjb250cm9sbGVyIHN0YXR1cy5cbiIpOworCisJCXJldHVybiAoMCk7CisJfQorCisJLyogSWRlbnRpZnkgdGhpcyBjb250cm9sbGVyICovCisJaXBzX2lkZW50aWZ5X2NvbnRyb2xsZXIoaGEpOworCisJaWYgKCFpcHNfcmVhZF9zdWJzeXN0ZW1fcGFyYW1ldGVycyhoYSwgSVBTX0lOVFJfSU9STCkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidW5hYmxlIHRvIHJlYWQgc3Vic3lzdGVtIHBhcmFtZXRlcnMuXG4iKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCS8qIHdyaXRlIG52cmFtIHVzZXIgcGFnZSA1ICovCisJaWYgKCFpcHNfd3JpdGVfZHJpdmVyX3N0YXR1cyhoYSwgSVBTX0lOVFJfSU9STCkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidW5hYmxlIHRvIHdyaXRlIGRyaXZlciBpbmZvIHRvIGNvbnRyb2xsZXIuXG4iKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCS8qIElmIHRoZXJlIGFyZSBMb2dpY2FsIERyaXZlcyBhbmQgYSBSZXNldCBPY2N1cnJlZCwgdGhlbiBhbiBFcmFzZVN0cmlwZUxvY2sgaXMgTmVlZGVkICovCisJaWYgKChoYS0+Y29uZi0+dWNMb2dEcml2ZUNvdW50ID4gMCkgJiYgKGhhLT5yZXF1aXJlc19lc2wgPT0gMSkpCisJCWlwc19jbGVhcl9hZGFwdGVyKGhhLCBJUFNfSU5UUl9JT1JMKTsKKworCS8qIHNldCBsaW1pdHMgb24gU0lELCBMVU4sIEJVUyAqLworCWhhLT5udGFyZ2V0cyA9IElQU19NQVhfVEFSR0VUUyArIDE7CisJaGEtPm5sdW4gPSAxOworCWhhLT5uYnVzID0gKGhhLT5lbnEtPnVjTWF4UGh5c2ljYWxEZXZpY2VzIC8gSVBTX01BWF9UQVJHRVRTKSArIDE7CisKKwlzd2l0Y2ggKGhhLT5jb25mLT5sb2dpY2FsX2RyaXZlWzBdLnVjU3RyaXBlU2l6ZSkgeworCWNhc2UgNDoKKwkJaGEtPm1heF94ZmVyID0gMHgxMDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIDU6CisJCWhhLT5tYXhfeGZlciA9IDB4MjAwMDA7CisJCWJyZWFrOworCisJY2FzZSA2OgorCQloYS0+bWF4X3hmZXIgPSAweDQwMDAwOworCQlicmVhazsKKworCWNhc2UgNzoKKwlkZWZhdWx0OgorCQloYS0+bWF4X3hmZXIgPSAweDgwMDAwOworCQlicmVhazsKKwl9CisKKwkvKiBzZXR1cCBtYXggY29uY3VycmVudCBjb21tYW5kcyAqLworCWlmIChsZTMyX3RvX2NwdShoYS0+c3Vic3lzLT5wYXJhbVs0XSkgJiAweDEpIHsKKwkJLyogVXNlIHRoZSBuZXcgbWV0aG9kICovCisJCWhhLT5tYXhfY21kcyA9IGhhLT5lbnEtPnVjQ29uY3VycmVudENtZENvdW50OworCX0gZWxzZSB7CisJCS8qIHVzZSB0aGUgb2xkIG1ldGhvZCAqLworCQlzd2l0Y2ggKGhhLT5jb25mLT5sb2dpY2FsX2RyaXZlWzBdLnVjU3RyaXBlU2l6ZSkgeworCQljYXNlIDQ6CisJCQloYS0+bWF4X2NtZHMgPSAzMjsKKwkJCWJyZWFrOworCisJCWNhc2UgNToKKwkJCWhhLT5tYXhfY21kcyA9IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSA2OgorCQkJaGEtPm1heF9jbWRzID0gODsKKwkJCWJyZWFrOworCisJCWNhc2UgNzoKKwkJZGVmYXVsdDoKKwkJCWhhLT5tYXhfY21kcyA9IDQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIExpbWl0IHRoZSBBY3RpdmUgQ29tbWFuZHMgb24gYSBMaXRlIEFkYXB0ZXIgKi8KKwlpZiAoKGhhLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlEM0wpIHx8CisJICAgIChoYS0+YWRfdHlwZSA9PSBJUFNfQURUWVBFX1NFUlZFUkFJRDRMKSB8fAorCSAgICAoaGEtPmFkX3R5cGUgPT0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TFgpKSB7CisJCWlmICgoaGEtPm1heF9jbWRzID4gTWF4TGl0ZUNtZHMpICYmIChNYXhMaXRlQ21kcykpCisJCQloYS0+bWF4X2NtZHMgPSBNYXhMaXRlQ21kczsKKwl9CisKKwkvKiBzZXQgY29udHJvbGxlciBJRHMgKi8KKwloYS0+aGFfaWRbMF0gPSBJUFNfQURBUFRFUl9JRDsKKwlmb3IgKGkgPSAxOyBpIDwgaGEtPm5idXM7IGkrKykgeworCQloYS0+aGFfaWRbaV0gPSBoYS0+Y29uZi0+aW5pdF9pZFtpIC0gMV0gJiAweDFmOworCQloYS0+ZGNkYl9hY3RpdmVbaSAtIDFdID0gMDsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRha2UgdGhlIG5leHQgY29tbWFuZCBvZmYgdGhlIHF1ZXVlIGFuZCBzZW5kIGl0IHRvIHRoZSBjb250cm9sbGVyICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX25leHQoaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJU2NzaV9DbW5kICpTQzsKKwlTY3NpX0NtbmQgKnA7CisJU2NzaV9DbW5kICpxOworCWlwc19jb3BwX3dhaXRfaXRlbV90ICppdGVtOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJTUVUSE9EX1RSQUNFKCJpcHNfbmV4dCIsIDEpOworCisJaWYgKCFoYSkKKwkJcmV0dXJuOworCWhvc3QgPSBpcHNfc2hbaGEtPmhvc3RfbnVtXTsKKwkvKgorCSAqIEJsb2NrIGFjY2VzcyB0byB0aGUgcXVldWUgZnVuY3Rpb24gc28KKwkgKiB0aGlzIGNvbW1hbmQgd29uJ3QgdGltZSBvdXQKKwkgKi8KKwlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikKKwkJSVBTX0xPQ0tfU0FWRShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoKGhhLT5zdWJzeXMtPnBhcmFtWzNdICYgMHgzMDAwMDApCisJICAgICYmIChoYS0+c2NiX2FjdGl2ZWxpc3QuY291bnQgPT0gMCkpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisKKwkJaWYgKHR2LnR2X3NlYyAtIGhhLT5sYXN0X2ZmZGMgPiBJUFNfU0VDU184SE9VUlMpIHsKKwkJCWhhLT5sYXN0X2ZmZGMgPSB0di50dl9zZWM7CisJCQlpcHNfZmZkY190aW1lKGhhKTsKKwkJfQorCX0KKworCS8qCisJICogU2VuZCBwYXNzdGhydSBjb21tYW5kcworCSAqIFRoZXNlIGhhdmUgcHJpb3JpdHkgb3ZlciBub3JtYWwgSS9PCisJICogYnV0IHNob3VsZG4ndCBhZmZlY3QgcGVyZm9ybWFuY2UgdG9vIG11Y2gKKwkgKiBzaW5jZSB3ZSBsaW1pdCB0aGUgbnVtYmVyIHRoYXQgY2FuIGJlIGFjdGl2ZQorCSAqIG9uIHRoZSBjYXJkIGF0IGFueSBvbmUgdGltZQorCSAqLworCXdoaWxlICgoaGEtPm51bV9pb2N0bCA8IElQU19NQVhfSU9DVEwpICYmCisJICAgICAgIChoYS0+Y29wcF93YWl0bGlzdC5oZWFkKSAmJiAoc2NiID0gaXBzX2dldHNjYihoYSkpKSB7CisKKwkJaXRlbSA9IGlwc19yZW1vdmVxX2NvcHBfaGVhZCgmaGEtPmNvcHBfd2FpdGxpc3QpOworCQloYS0+bnVtX2lvY3RsKys7CisJCWlmIChpbnRyID09IElQU19JTlRSX09OKQorCQkJSVBTX1VOTE9DS19SRVNUT1JFKGhvc3QtPmhvc3RfbG9jaywgY3B1X2ZsYWdzKTsKKwkJc2NiLT5zY3NpX2NtZCA9IGl0ZW0tPnNjc2lfY21kOworCQlrZnJlZShpdGVtKTsKKworCQlyZXQgPSBpcHNfbWFrZV9wYXNzdGhydShoYSwgc2NiLT5zY3NpX2NtZCwgc2NiLCBpbnRyKTsKKworCQlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikKKwkJCUlQU19MT0NLX1NBVkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIElQU19GQUlMVVJFOgorCQkJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQkJfQorCisJCQlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwkJCWJyZWFrOworCQljYXNlIElQU19TVUNDRVNTX0lNTToKKwkJCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJCXNjYi0+c2NzaV9jbWQtPnNjc2lfZG9uZShzY2ItPnNjc2lfY21kKTsKKwkJCX0KKworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CQkvKiBlbmQgY2FzZSAqLworCisJCWlmIChyZXQgIT0gSVBTX1NVQ0NFU1MpIHsKKwkJCWhhLT5udW1faW9jdGwtLTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gaXBzX3NlbmRfY21kKGhhLCBzY2IpOworCisJCWlmIChyZXQgPT0gSVBTX1NVQ0NFU1MpCisJCQlpcHNfcHV0cV9zY2JfaGVhZCgmaGEtPnNjYl9hY3RpdmVsaXN0LCBzY2IpOworCQllbHNlCisJCQloYS0+bnVtX2lvY3RsLS07CisKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBJUFNfRkFJTFVSRToKKwkJCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJfQorCisJCQlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwkJCWJyZWFrOworCQljYXNlIElQU19TVUNDRVNTX0lNTToKKwkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQkJLyogZW5kIGNhc2UgKi8KKworCX0KKworCS8qCisJICogU2VuZCAiTm9ybWFsIiBJL08gY29tbWFuZHMKKwkgKi8KKworCXAgPSBoYS0+c2NiX3dhaXRsaXN0LmhlYWQ7CisJd2hpbGUgKChwKSAmJiAoc2NiID0gaXBzX2dldHNjYihoYSkpKSB7CisJCWlmICgocC0+ZGV2aWNlLT5jaGFubmVsID4gMCkKKwkJICAgICYmIChoYS0+CisJCQlkY2RiX2FjdGl2ZVtwLT5kZXZpY2UtPmNoYW5uZWwgLQorCQkJCSAgICAxXSAmICgxIDw8IHAtPmRldmljZS0+aWQpKSkgeworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQlwID0gKFNjc2lfQ21uZCAqKSBwLT5ob3N0X3NjcmliYmxlOworCQkJY29udGludWU7CisJCX0KKworCQlxID0gcDsKKwkJU0MgPSBpcHNfcmVtb3ZlcV93YWl0KCZoYS0+c2NiX3dhaXRsaXN0LCBxKTsKKworCQlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikKKwkJCUlQU19VTkxPQ0tfUkVTVE9SRShob3N0LT5ob3N0X2xvY2ssIGNwdV9mbGFncyk7CS8qIFVubG9jayBIQSBhZnRlciBjb21tYW5kIGlzIHRha2VuIG9mZiBxdWV1ZSAqLworCisJCVNDLT5yZXN1bHQgPSBESURfT0s7CisJCVNDLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCQltZW1zZXQoU0MtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mIChTQy0+c2Vuc2VfYnVmZmVyKSk7CisKKwkJc2NiLT50YXJnZXRfaWQgPSBTQy0+ZGV2aWNlLT5pZDsKKwkJc2NiLT5sdW4gPSBTQy0+ZGV2aWNlLT5sdW47CisJCXNjYi0+YnVzID0gU0MtPmRldmljZS0+Y2hhbm5lbDsKKwkJc2NiLT5zY3NpX2NtZCA9IFNDOworCQlzY2ItPmJyZWFrdXAgPSAwOworCQlzY2ItPmRhdGFfbGVuID0gMDsKKwkJc2NiLT5jYWxsYmFjayA9IGlwc2ludHJfZG9uZTsKKwkJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCQltZW1zZXQoJnNjYi0+Y21kLCAwLCAxNik7CisKKwkJLyogY29weSBpbiB0aGUgQ0RCICovCisJCW1lbWNweShzY2ItPmNkYiwgU0MtPmNtbmQsIFNDLT5jbWRfbGVuKTsKKworCQkvKiBOb3cgaGFuZGxlIHRoZSBkYXRhIGJ1ZmZlciAqLworCQlpZiAoU0MtPnVzZV9zZykgeworCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJCWludCBpOworCisJCQlzZyA9IFNDLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCXNjYi0+c2dfY291bnQgPSBwY2lfbWFwX3NnKGhhLT5wY2lkZXYsIHNnLCBTQy0+dXNlX3NnLAorCQkJCQkJICAgc2NzaV90b19wY2lfZG1hX2RpcihTQy0+CisJCQkJCQkJCSAgICAgICBzY19kYXRhX2RpcmVjdGlvbikpOworCQkJc2NiLT5mbGFncyB8PSBJUFNfU0NCX01BUF9TRzsKKwkJCWZvciAoaSA9IDA7IGkgPCBzY2ItPnNnX2NvdW50OyBpKyspIHsKKwkJCQlpZiAoaXBzX2ZpbGxfc2NiX3NnX3NpbmdsZQorCQkJCSAgICAoaGEsIHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSksIHNjYiwgaSwKKwkJCQkgICAgIHNnX2RtYV9sZW4oJnNnW2ldKSkgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSBzY2ItPmRhdGFfbGVuOworCQl9IGVsc2UgeworCQkJaWYgKFNDLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJCQlzY2ItPmRhdGFfYnVzYWRkciA9CisJCQkJICAgIHBjaV9tYXBfc2luZ2xlKGhhLT5wY2lkZXYsCisJCQkJCQkgICBTQy0+cmVxdWVzdF9idWZmZXIsCisJCQkJCQkgICBTQy0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJICAgc2NzaV90b19wY2lfZG1hX2RpcihTQy0+CisJCQkJCQkJCSAgICAgICBzY19kYXRhX2RpcmVjdGlvbikpOworCQkJCXNjYi0+ZmxhZ3MgfD0gSVBTX1NDQl9NQVBfU0lOR0xFOworCQkJCWlwc19maWxsX3NjYl9zZ19zaW5nbGUoaGEsIHNjYi0+ZGF0YV9idXNhZGRyLAorCQkJCQkJICAgICAgIHNjYiwgMCwKKwkJCQkJCSAgICAgICBTQy0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCQlzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoID0gc2NiLT5kYXRhX2xlbjsKKwkJCX0gZWxzZSB7CisJCQkJc2NiLT5kYXRhX2J1c2FkZHIgPSAwTDsKKwkJCQlzY2ItPnNnX2xlbiA9IDA7CisJCQkJc2NiLT5kYXRhX2xlbiA9IDA7CisJCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IDA7CisJCQl9CisKKwkJfQorCisJCXNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlID0KKwkJICAgIGlwc19jb21tYW5kX2RpcmVjdGlvbltzY2ItPnNjc2lfY21kLT5jbW5kWzBdXTsKKworICAgICAgICAvKiBBbGxvdyBhIFdSSVRFIEJVRkZFUiBDb21tYW5kIHRvIEhhdmUgbm8gRGF0YSAqLworICAgICAgICAvKiBUaGlzIGlzIFVzZWQgYnkgVGFwZSBGbGFzaCBVdGlsaXRlcyAgICAgICAgICAqLworICAgICAgICBpZiAoKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0gV1JJVEVfQlVGRkVSKSAmJiAoc2NiLT5kYXRhX2xlbiA9PSAwKSkgCisgICAgICAgICAgICBzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSA9IDA7ICAgICAgICAgICAgICAgICAgCisKKwkJaWYgKCEoc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgJiAweDMpKQorCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IDA7CisKKwkJaWYgKHNjYi0+ZGF0YV9sZW4gPj0gSVBTX01BWF9YRkVSKSB7CisJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfVFJBTlNGRVI2NEs7CisJCQlzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoID0gMDsKKwkJfQorCQlpZiAoaW50ciA9PSBJUFNfSU5UUl9PTikKKwkJCUlQU19MT0NLX1NBVkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworCisJCXJldCA9IGlwc19zZW5kX2NtZChoYSwgc2NiKTsKKworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIElQU19TVUNDRVNTOgorCQkJaXBzX3B1dHFfc2NiX2hlYWQoJmhhLT5zY2JfYWN0aXZlbGlzdCwgc2NiKTsKKwkJCWJyZWFrOworCQljYXNlIElQU19GQUlMVVJFOgorCQkJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQkJfQorCisJCQlpZiAoc2NiLT5idXMpCisJCQkJaGEtPmRjZGJfYWN0aXZlW3NjYi0+YnVzIC0gMV0gJj0KKwkJCQkgICAgfigxIDw8IHNjYi0+dGFyZ2V0X2lkKTsKKworCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQlicmVhazsKKwkJY2FzZSBJUFNfU1VDQ0VTU19JTU06CisJCQlpZiAoc2NiLT5zY3NpX2NtZCkKKwkJCQlzY2ItPnNjc2lfY21kLT5zY3NpX2RvbmUoc2NiLT5zY3NpX2NtZCk7CisKKwkJCWlmIChzY2ItPmJ1cykKKwkJCQloYS0+ZGNkYl9hY3RpdmVbc2NiLT5idXMgLSAxXSAmPQorCQkJCSAgICB+KDEgPDwgc2NiLT50YXJnZXRfaWQpOworCisJCQlpcHNfZnJlZXNjYihoYSwgc2NiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIGVuZCBjYXNlICovCisKKwkJcCA9IChTY3NpX0NtbmQgKikgcC0+aG9zdF9zY3JpYmJsZTsKKworCX0JCQkvKiBlbmQgd2hpbGUgKi8KKworCWlmIChpbnRyID09IElQU19JTlRSX09OKQorCQlJUFNfVU5MT0NLX1JFU1RPUkUoaG9zdC0+aG9zdF9sb2NrLCBjcHVfZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcHV0cV9zY2JfaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEFkZCBhbiBpdGVtIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19wdXRxX3NjYl9oZWFkKGlwc19zY2JfcXVldWVfdCAqIHF1ZXVlLCBpcHNfc2NiX3QgKiBpdGVtKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX3B1dHFfc2NiX2hlYWQiLCAxKTsKKworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJaXRlbS0+cV9uZXh0ID0gcXVldWUtPmhlYWQ7CisJcXVldWUtPmhlYWQgPSBpdGVtOworCisJaWYgKCFxdWV1ZS0+dGFpbCkKKwkJcXVldWUtPnRhaWwgPSBpdGVtOworCisJcXVldWUtPmNvdW50Kys7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZW1vdmVxX3NjYl9oZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXBzX3NjYl90ICoKK2lwc19yZW1vdmVxX3NjYl9oZWFkKGlwc19zY2JfcXVldWVfdCAqIHF1ZXVlKQoreworCWlwc19zY2JfdCAqaXRlbTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbW92ZXFfc2NiX2hlYWQiLCAxKTsKKworCWl0ZW0gPSBxdWV1ZS0+aGVhZDsKKworCWlmICghaXRlbSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXF1ZXVlLT5oZWFkID0gaXRlbS0+cV9uZXh0OworCWl0ZW0tPnFfbmV4dCA9IE5VTEw7CisKKwlpZiAocXVldWUtPnRhaWwgPT0gaXRlbSkKKwkJcXVldWUtPnRhaWwgPSBOVUxMOworCisJcXVldWUtPmNvdW50LS07CisKKwlyZXR1cm4gKGl0ZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVtb3ZlcV9zY2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSBhbiBpdGVtIGZyb20gYSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQVNTVU1FRCB0byBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEhBIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlwc19zY2JfdCAqCitpcHNfcmVtb3ZlcV9zY2IoaXBzX3NjYl9xdWV1ZV90ICogcXVldWUsIGlwc19zY2JfdCAqIGl0ZW0pCit7CisJaXBzX3NjYl90ICpwOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVtb3ZlcV9zY2IiLCAxKTsKKworCWlmICghaXRlbSkKKwkJcmV0dXJuIChOVUxMKTsKKworCWlmIChpdGVtID09IHF1ZXVlLT5oZWFkKSB7CisJCXJldHVybiAoaXBzX3JlbW92ZXFfc2NiX2hlYWQocXVldWUpKTsKKwl9CisKKwlwID0gcXVldWUtPmhlYWQ7CisKKwl3aGlsZSAoKHApICYmIChpdGVtICE9IHAtPnFfbmV4dCkpCisJCXAgPSBwLT5xX25leHQ7CisKKwlpZiAocCkgeworCQkvKiBmb3VuZCBhIG1hdGNoICovCisJCXAtPnFfbmV4dCA9IGl0ZW0tPnFfbmV4dDsKKworCQlpZiAoIWl0ZW0tPnFfbmV4dCkKKwkJCXF1ZXVlLT50YWlsID0gcDsKKworCQlpdGVtLT5xX25leHQgPSBOVUxMOworCQlxdWV1ZS0+Y291bnQtLTsKKworCQlyZXR1cm4gKGl0ZW0pOworCX0KKworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19wdXRxX3dhaXRfdGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQWRkIGFuIGl0ZW0gdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3B1dHFfd2FpdF90YWlsKGlwc193YWl0X3F1ZXVlX3QgKiBxdWV1ZSwgU2NzaV9DbW5kICogaXRlbSkKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19wdXRxX3dhaXRfdGFpbCIsIDEpOworCisJaWYgKCFpdGVtKQorCQlyZXR1cm47CisKKwlpdGVtLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCWlmIChxdWV1ZS0+dGFpbCkKKwkJcXVldWUtPnRhaWwtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKSBpdGVtOworCisJcXVldWUtPnRhaWwgPSBpdGVtOworCisJaWYgKCFxdWV1ZS0+aGVhZCkKKwkJcXVldWUtPmhlYWQgPSBpdGVtOworCisJcXVldWUtPmNvdW50Kys7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZW1vdmVxX3dhaXRfaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgU2NzaV9DbW5kICoKK2lwc19yZW1vdmVxX3dhaXRfaGVhZChpcHNfd2FpdF9xdWV1ZV90ICogcXVldWUpCit7CisJU2NzaV9DbW5kICppdGVtOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVtb3ZlcV93YWl0X2hlYWQiLCAxKTsKKworCWl0ZW0gPSBxdWV1ZS0+aGVhZDsKKworCWlmICghaXRlbSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXF1ZXVlLT5oZWFkID0gKFNjc2lfQ21uZCAqKSBpdGVtLT5ob3N0X3NjcmliYmxlOworCWl0ZW0tPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisJaWYgKHF1ZXVlLT50YWlsID09IGl0ZW0pCisJCXF1ZXVlLT50YWlsID0gTlVMTDsKKworCXF1ZXVlLT5jb3VudC0tOworCisJcmV0dXJuIChpdGVtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlbW92ZXFfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZW1vdmUgYW4gaXRlbSBmcm9tIGEgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFTU1VNRUQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBIQSBsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTY3NpX0NtbmQgKgoraXBzX3JlbW92ZXFfd2FpdChpcHNfd2FpdF9xdWV1ZV90ICogcXVldWUsIFNjc2lfQ21uZCAqIGl0ZW0pCit7CisJU2NzaV9DbW5kICpwOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVtb3ZlcV93YWl0IiwgMSk7CisKKwlpZiAoIWl0ZW0pCisJCXJldHVybiAoTlVMTCk7CisKKwlpZiAoaXRlbSA9PSBxdWV1ZS0+aGVhZCkgeworCQlyZXR1cm4gKGlwc19yZW1vdmVxX3dhaXRfaGVhZChxdWV1ZSkpOworCX0KKworCXAgPSBxdWV1ZS0+aGVhZDsKKworCXdoaWxlICgocCkgJiYgKGl0ZW0gIT0gKFNjc2lfQ21uZCAqKSBwLT5ob3N0X3NjcmliYmxlKSkKKwkJcCA9IChTY3NpX0NtbmQgKikgcC0+aG9zdF9zY3JpYmJsZTsKKworCWlmIChwKSB7CisJCS8qIGZvdW5kIGEgbWF0Y2ggKi8KKwkJcC0+aG9zdF9zY3JpYmJsZSA9IGl0ZW0tPmhvc3Rfc2NyaWJibGU7CisKKwkJaWYgKCFpdGVtLT5ob3N0X3NjcmliYmxlKQorCQkJcXVldWUtPnRhaWwgPSBwOworCisJCWl0ZW0tPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQlxdWV1ZS0+Y291bnQtLTsKKworCQlyZXR1cm4gKGl0ZW0pOworCX0KKworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19wdXRxX2NvcHBfdGFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQWRkIGFuIGl0ZW0gdG8gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3B1dHFfY29wcF90YWlsKGlwc19jb3BwX3F1ZXVlX3QgKiBxdWV1ZSwgaXBzX2NvcHBfd2FpdF9pdGVtX3QgKiBpdGVtKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX3B1dHFfY29wcF90YWlsIiwgMSk7CisKKwlpZiAoIWl0ZW0pCisJCXJldHVybjsKKworCWl0ZW0tPm5leHQgPSBOVUxMOworCisJaWYgKHF1ZXVlLT50YWlsKQorCQlxdWV1ZS0+dGFpbC0+bmV4dCA9IGl0ZW07CisKKwlxdWV1ZS0+dGFpbCA9IGl0ZW07CisKKwlpZiAoIXF1ZXVlLT5oZWFkKQorCQlxdWV1ZS0+aGVhZCA9IGl0ZW07CisKKwlxdWV1ZS0+Y291bnQrKzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlbW92ZXFfY29wcF9oZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZW1vdmUgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFTU1VNRUQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBIQSBsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcHNfY29wcF93YWl0X2l0ZW1fdCAqCitpcHNfcmVtb3ZlcV9jb3BwX2hlYWQoaXBzX2NvcHBfcXVldWVfdCAqIHF1ZXVlKQoreworCWlwc19jb3BwX3dhaXRfaXRlbV90ICppdGVtOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVtb3ZlcV9jb3BwX2hlYWQiLCAxKTsKKworCWl0ZW0gPSBxdWV1ZS0+aGVhZDsKKworCWlmICghaXRlbSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXF1ZXVlLT5oZWFkID0gaXRlbS0+bmV4dDsKKwlpdGVtLT5uZXh0ID0gTlVMTDsKKworCWlmIChxdWV1ZS0+dGFpbCA9PSBpdGVtKQorCQlxdWV1ZS0+dGFpbCA9IE5VTEw7CisKKwlxdWV1ZS0+Y291bnQtLTsKKworCXJldHVybiAoaXRlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZW1vdmVxX2NvcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXBzX2NvcHBfd2FpdF9pdGVtX3QgKgoraXBzX3JlbW92ZXFfY29wcChpcHNfY29wcF9xdWV1ZV90ICogcXVldWUsIGlwc19jb3BwX3dhaXRfaXRlbV90ICogaXRlbSkKK3sKKwlpcHNfY29wcF93YWl0X2l0ZW1fdCAqcDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlbW92ZXFfY29wcCIsIDEpOworCisJaWYgKCFpdGVtKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKGl0ZW0gPT0gcXVldWUtPmhlYWQpIHsKKwkJcmV0dXJuIChpcHNfcmVtb3ZlcV9jb3BwX2hlYWQocXVldWUpKTsKKwl9CisKKwlwID0gcXVldWUtPmhlYWQ7CisKKwl3aGlsZSAoKHApICYmIChpdGVtICE9IHAtPm5leHQpKQorCQlwID0gcC0+bmV4dDsKKworCWlmIChwKSB7CisJCS8qIGZvdW5kIGEgbWF0Y2ggKi8KKwkJcC0+bmV4dCA9IGl0ZW0tPm5leHQ7CisKKwkJaWYgKCFpdGVtLT5uZXh0KQorCQkJcXVldWUtPnRhaWwgPSBwOworCisJCWl0ZW0tPm5leHQgPSBOVUxMOworCQlxdWV1ZS0+Y291bnQtLTsKKworCQlyZXR1cm4gKGl0ZW0pOworCX0KKworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc2ludHJfYmxvY2tpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRmluYWxpemUgYW4gaW50ZXJydXB0IGZvciBpbnRlcm5hbCBjb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNpbnRyX2Jsb2NraW5nKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc2ludHJfYmxvY2tpbmciLCAyKTsKKworCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCWlmICgoaGEtPndhaXRmbGFnID09IFRSVUUpICYmIChoYS0+Y21kX2luX3Byb2dyZXNzID09IHNjYi0+Y2RiWzBdKSkgeworCQloYS0+d2FpdGZsYWcgPSBGQUxTRTsKKworCQlyZXR1cm47CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNpbnRyX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZpbmFsaXplIGFuIGludGVycnVwdCBmb3Igbm9uLWludGVybmFsIGNvbW1hbmRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzaW50cl9kb25lKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc2ludHJfZG9uZSIsIDIpOworCisJaWYgKCFzY2IpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAiU3B1cmlvdXMgaW50ZXJydXB0OyBzY2IgTlVMTC5cbiIpOworCisJCXJldHVybjsKKwl9CisKKwlpZiAoc2NiLT5zY3NpX2NtZCA9PSBOVUxMKSB7CisJCS8qIHVuZXhwZWN0ZWQgaW50ZXJydXB0ICovCisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIlNwdXJpb3VzIGludGVycnVwdDsgc2NzaV9jbWQgbm90IHNldC5cbiIpOworCisJCXJldHVybjsKKwl9CisKKwlpcHNfZG9uZShoYSwgc2NiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBEbyBob3VzZWtlZXBpbmcgb24gY29tcGxldGVkIGNvbW1hbmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQVNTVU1FRCB0byBiZSBjYWxsZWQgZm9ybSB3aXRoaW4gdGhlIHJlcXVlc3QgbG9jayAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19kb25lKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlpbnQgcmV0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfZG9uZSIsIDEpOworCisJaWYgKCFzY2IpCisJCXJldHVybjsKKworCWlmICgoc2NiLT5zY3NpX2NtZCkgJiYgKGlwc19pc19wYXNzdGhydShzY2ItPnNjc2lfY21kKSkpIHsKKwkJaXBzX2NsZWFudXBfcGFzc3RocnUoaGEsIHNjYik7CisJCWhhLT5udW1faW9jdGwtLTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBjb21tYW5kIGhhZCB0b28gbXVjaAorCQkgKiBkYXRhIGFuZCBoYWQgdG8gYmUgYnJva2UgdXAuICBJZiBzbywgcXVldWUKKwkJICogdGhlIHJlc3Qgb2YgdGhlIGRhdGEgYW5kIGNvbnRpbnVlLgorCQkgKi8KKwkJaWYgKChzY2ItPmJyZWFrdXApIHx8IChzY2ItPnNnX2JyZWFrKSkgeworCQkJLyogd2UgaGFkIGEgZGF0YSBicmVha3VwICovCisJCQlzY2ItPmRhdGFfbGVuID0gMDsKKworCQkJaWYgKHNjYi0+c2dfY291bnQpIHsKKwkJCQkvKiBTL0cgcmVxdWVzdCAqLworCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJCQkJaW50IGlwc19zZ19pbmRleCA9IDA7CisJCQkJaW50IHNnX2RtYV9pbmRleDsKKworCQkJCXNnID0gc2NiLT5zY3NpX2NtZC0+cmVxdWVzdF9idWZmZXI7CisKKwkJCQkvKiBTcGluIGZvcndhcmQgdG8gbGFzdCBkbWEgY2h1bmsgKi8KKwkJCQlzZ19kbWFfaW5kZXggPSBzY2ItPmJyZWFrdXA7CisKKwkJCQkvKiBUYWtlIGNhcmUgb2YgcG9zc2libGUgcGFydGlhbCBvbiBsYXN0IGNodW5rICovCisJCQkJaXBzX2ZpbGxfc2NiX3NnX3NpbmdsZShoYSwKKwkJCQkJCSAgICAgICBzZ19kbWFfYWRkcmVzcygmc2cKKwkJCQkJCQkJICAgICAgW3NnX2RtYV9pbmRleF0pLAorCQkJCQkJICAgICAgIHNjYiwgaXBzX3NnX2luZGV4KyssCisJCQkJCQkgICAgICAgc2dfZG1hX2xlbigmc2cKKwkJCQkJCQkJICBbc2dfZG1hX2luZGV4XSkpOworCisJCQkJZm9yICg7IHNnX2RtYV9pbmRleCA8IHNjYi0+c2dfY291bnQ7CisJCQkJICAgICBzZ19kbWFfaW5kZXgrKykgeworCQkJCQlpZiAoaXBzX2ZpbGxfc2NiX3NnX3NpbmdsZQorCQkJCQkgICAgKGhhLAorCQkJCQkgICAgIHNnX2RtYV9hZGRyZXNzKCZzZ1tzZ19kbWFfaW5kZXhdKSwKKwkJCQkJICAgICBzY2IsIGlwc19zZ19pbmRleCsrLAorCQkJCQkgICAgIHNnX2RtYV9sZW4oJnNnW3NnX2RtYV9pbmRleF0pKSA8IDApCisJCQkJCQlicmVhazsKKworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkvKiBOb24gUy9HIFJlcXVlc3QgKi8KKwkJCQkodm9pZCkgaXBzX2ZpbGxfc2NiX3NnX3NpbmdsZShoYSwKKwkJCQkJCQkgICAgICBzY2ItPgorCQkJCQkJCSAgICAgIGRhdGFfYnVzYWRkciArCisJCQkJCQkJICAgICAgKHNjYi0+c2dfYnJlYWsgKgorCQkJCQkJCSAgICAgICBoYS0+bWF4X3hmZXIpLAorCQkJCQkJCSAgICAgIHNjYiwgMCwKKwkJCQkJCQkgICAgICBzY2ItPnNjc2lfY21kLT4KKwkJCQkJCQkgICAgICByZXF1ZXN0X2J1ZmZsZW4gLQorCQkJCQkJCSAgICAgIChzY2ItPnNnX2JyZWFrICoKKwkJCQkJCQkgICAgICAgaGEtPm1heF94ZmVyKSk7CisJCQl9CisKKwkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSBzY2ItPmRhdGFfbGVuOworCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0KKwkJCSAgICBpcHNfY29tbWFuZF9kaXJlY3Rpb25bc2NiLT5zY3NpX2NtZC0+Y21uZFswXV07CisKKwkJCWlmICghKHNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlICYgMHgzKSkKKwkJCQlzY2ItPmRjZGIudHJhbnNmZXJfbGVuZ3RoID0gMDsKKworCQkJaWYgKHNjYi0+ZGF0YV9sZW4gPj0gSVBTX01BWF9YRkVSKSB7CisJCQkJc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgfD0gSVBTX1RSQU5TRkVSNjRLOworCQkJCXNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGggPSAwOworCQkJfQorCisJCQlyZXQgPSBpcHNfc2VuZF9jbWQoaGEsIHNjYik7CisKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIElQU19GQUlMVVJFOgorCQkJCWlmIChzY2ItPnNjc2lfY21kKSB7CisJCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCQkJc2NiLT5zY3NpX2NtZC0+c2NzaV9kb25lKHNjYi0+c2NzaV9jbWQpOworCQkJCX0KKworCQkJCWlwc19mcmVlc2NiKGhhLCBzY2IpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFNfU1VDQ0VTU19JTU06CisJCQkJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCQlzY2ItPnNjc2lfY21kLT5zY3NpX2RvbmUoc2NiLT5zY3NpX2NtZCk7CisJCQkJfQorCisJCQkJaXBzX2ZyZWVzY2IoaGEsIHNjYik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQkvKiBlbmQgY2FzZSAqLworCisJCQlyZXR1cm47CisJCX0KKwl9CQkJLyogZW5kIGlmIHBhc3N0aHJ1ICovCisKKwlpZiAoc2NiLT5idXMpIHsKKwkJaGEtPmRjZGJfYWN0aXZlW3NjYi0+YnVzIC0gMV0gJj0gfigxIDw8IHNjYi0+dGFyZ2V0X2lkKTsKKwl9CisKKwlzY2ItPnNjc2lfY21kLT5zY3NpX2RvbmUoc2NiLT5zY3NpX2NtZCk7CisKKwlpcHNfZnJlZXNjYihoYSwgc2NiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX21hcF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBNYXAgQ29udHJvbGxlciBFcnJvciBjb2RlcyB0byBMaW51eCBFcnJvciBDb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX21hcF9zdGF0dXMoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiLCBpcHNfc3RhdF90ICogc3ApCit7CisJaW50IGVycmNvZGU7CisJaW50IGRldmljZV9lcnJvcjsKKwl1aW50MzJfdCB0cmFuc2Zlcl9sZW47CisJSVBTX0RDREJfVEFCTEVfVEFQRSAqdGFwZURDREI7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19tYXBfc3RhdHVzIiwgMSk7CisKKwlpZiAoc2NiLT5idXMpIHsKKwkJREVCVUdfVkFSKDIsCisJCQkgICIoJXMlZCkgUGh5c2ljYWwgZGV2aWNlIGVycm9yICglZCAlZCAlZCk6ICV4ICV4LCBTZW5zZSBLZXk6ICV4LCBBU0M6ICV4LCBBU0NROiAleCIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sCisJCQkgIHNjYi0+c2NzaV9jbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkJCSAgc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5pZCwgc2NiLT5zY3NpX2NtZC0+ZGV2aWNlLT5sdW4sCisJCQkgIHNjYi0+YmFzaWNfc3RhdHVzLCBzY2ItPmV4dGVuZGVkX3N0YXR1cywKKwkJCSAgc2NiLT5leHRlbmRlZF9zdGF0dXMgPT0KKwkJCSAgSVBTX0VSUl9DS0NPTkQgPyBzY2ItPmRjZGIuc2Vuc2VfaW5mb1syXSAmIDB4ZiA6IDAsCisJCQkgIHNjYi0+ZXh0ZW5kZWRfc3RhdHVzID09CisJCQkgIElQU19FUlJfQ0tDT05EID8gc2NiLT5kY2RiLnNlbnNlX2luZm9bMTJdIDogMCwKKwkJCSAgc2NiLT5leHRlbmRlZF9zdGF0dXMgPT0KKwkJCSAgSVBTX0VSUl9DS0NPTkQgPyBzY2ItPmRjZGIuc2Vuc2VfaW5mb1sxM10gOiAwKTsKKwl9CisKKwkvKiBkZWZhdWx0IGRyaXZlciBlcnJvciAqLworCWVycmNvZGUgPSBESURfRVJST1I7CisJZGV2aWNlX2Vycm9yID0gMDsKKworCXN3aXRjaCAoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSB7CisJY2FzZSBJUFNfQ01EX1RJTUVPVVQ6CisJCWVycmNvZGUgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCisJY2FzZSBJUFNfSU5WQUxfT1BDTzoKKwljYXNlIElQU19JTlZBTF9DTURfQkxLOgorCWNhc2UgSVBTX0lOVkFMX1BBUk1fQkxLOgorCWNhc2UgSVBTX0xEX0VSUk9SOgorCWNhc2UgSVBTX0NNRF9DTVBMVF9XRVJST1I6CisJCWJyZWFrOworCisJY2FzZSBJUFNfUEhZU19EUlZfRVJST1I6CisJCXN3aXRjaCAoc2NiLT5leHRlbmRlZF9zdGF0dXMpIHsKKwkJY2FzZSBJUFNfRVJSX1NFTF9UTzoKKwkJCWlmIChzY2ItPmJ1cykKKwkJCQllcnJjb2RlID0gRElEX05PX0NPTk5FQ1Q7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX0VSUl9PVV9SVU46CisJCQlpZiAoKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PSBJUFNfQ01EX0VYVEVOREVEX0RDREIpIHx8CisJCQkgICAgKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PQorCQkJICAgICBJUFNfQ01EX0VYVEVOREVEX0RDREJfU0cpKSB7CisJCQkJdGFwZURDREIgPSAoSVBTX0RDREJfVEFCTEVfVEFQRSAqKSAmIHNjYi0+ZGNkYjsKKwkJCQl0cmFuc2Zlcl9sZW4gPSB0YXBlRENEQi0+dHJhbnNmZXJfbGVuZ3RoOworCQkJfSBlbHNlIHsKKwkJCQl0cmFuc2Zlcl9sZW4gPQorCQkJCSAgICAodWludDMyX3QpIHNjYi0+ZGNkYi50cmFuc2Zlcl9sZW5ndGg7CisJCQl9CisKKwkJCWlmICgoc2NiLT5idXMpICYmICh0cmFuc2Zlcl9sZW4gPCBzY2ItPmRhdGFfbGVuKSkgeworCQkJCS8qIFVuZGVycnVuIC0gc2V0IGRlZmF1bHQgdG8gbm8gZXJyb3IgKi8KKwkJCQllcnJjb2RlID0gRElEX09LOworCisJCQkJLyogUmVzdHJpY3QgYWNjZXNzIHRvIHBoeXNpY2FsIERBU0QgKi8KKwkJCQlpZiAoKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSkgJiYKKwkJCQkgICAgKCgoKGNoYXIgKikgc2NiLT5zY3NpX2NtZC0+CisJCQkJICAgICAgIGJ1ZmZlcilbMF0gJiAweDFmKSA9PSBUWVBFX0RJU0spKSB7CisJCQkJCS8qIHVuZGVyZmxvdyAtLSBubyBlcnJvciAgICAgICAgICAgICAgICovCisJCQkJCS8qIHJlc3RyaWN0IGFjY2VzcyB0byBwaHlzaWNhbCBEQVNEICAgICovCisJCQkJCWVycmNvZGUgPSBESURfVElNRV9PVVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWVycmNvZGUgPSBESURfRVJST1I7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX0VSUl9SRUNPVkVSWToKKwkJCS8qIGRvbid0IGZhaWwgcmVjb3ZlcmVkIGVycm9ycyAqLworCQkJaWYgKHNjYi0+YnVzKQorCQkJCWVycmNvZGUgPSBESURfT0s7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX0VSUl9IT1NUX1JFU0VUOgorCQljYXNlIElQU19FUlJfREVWX1JFU0VUOgorCQkJZXJyY29kZSA9IERJRF9SRVNFVDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBTX0VSUl9DS0NPTkQ6CisJCQlpZiAoc2NiLT5idXMpIHsKKwkJCQlpZiAoKHNjYi0+Y21kLmRjZGIub3BfY29kZSA9PQorCQkJCSAgICAgSVBTX0NNRF9FWFRFTkRFRF9EQ0RCKQorCQkJCSAgICB8fCAoc2NiLT5jbWQuZGNkYi5vcF9jb2RlID09CisJCQkJCUlQU19DTURfRVhURU5ERURfRENEQl9TRykpIHsKKwkJCQkJdGFwZURDREIgPQorCQkJCQkgICAgKElQU19EQ0RCX1RBQkxFX1RBUEUgKikgJiBzY2ItPmRjZGI7CisJCQkJCW1lbWNweShzY2ItPnNjc2lfY21kLT5zZW5zZV9idWZmZXIsCisJCQkJCSAgICAgICB0YXBlRENEQi0+c2Vuc2VfaW5mbywKKwkJCQkJICAgICAgIHNpemVvZiAoc2NiLT5zY3NpX2NtZC0+CisJCQkJCQkgICAgICAgc2Vuc2VfYnVmZmVyKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVtY3B5KHNjYi0+c2NzaV9jbWQtPnNlbnNlX2J1ZmZlciwKKwkJCQkJICAgICAgIHNjYi0+ZGNkYi5zZW5zZV9pbmZvLAorCQkJCQkgICAgICAgc2l6ZW9mIChzY2ItPnNjc2lfY21kLT4KKwkJCQkJCSAgICAgICBzZW5zZV9idWZmZXIpKTsKKwkJCQl9CisJCQkJZGV2aWNlX2Vycm9yID0gMjsJLyogY2hlY2sgY29uZGl0aW9uICovCisJCQl9CisKKwkJCWVycmNvZGUgPSBESURfT0s7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnJjb2RlID0gRElEX0VSUk9SOworCQkJYnJlYWs7CisKKwkJfQkJLyogZW5kIHN3aXRjaCAqLworCX0JCQkvKiBlbmQgc3dpdGNoICovCisKKwlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBkZXZpY2VfZXJyb3IgfCAoZXJyY29kZSA8PCAxNik7CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc2VuZF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyIGFuZCB3YWl0IGZvciBpdCB0byByZXR1cm4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgRkZEQyBUaW1lIFN0YW1wIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgY2FsbGJhY2ssIGJ1dCBkb2Vzbid0ICAgICovCisvKiAgIGFjdHVhbGx5IG5lZWQgdG8gd2FpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3NlbmRfd2FpdChpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IsIGludCB0aW1lb3V0LCBpbnQgaW50cikKK3sKKwlpbnQgcmV0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfc2VuZF93YWl0IiwgMSk7CisKKwlpZiAoaW50ciAhPSBJUFNfRkZEQykgewkvKiBXb24ndCBiZSBXYWl0aW5nIGlmIHRoaXMgaXMgYSBUaW1lIFN0YW1wICovCisJCWhhLT53YWl0ZmxhZyA9IFRSVUU7CisJCWhhLT5jbWRfaW5fcHJvZ3Jlc3MgPSBzY2ItPmNkYlswXTsKKwl9CisJc2NiLT5jYWxsYmFjayA9IGlwc2ludHJfYmxvY2tpbmc7CisJcmV0ID0gaXBzX3NlbmRfY21kKGhhLCBzY2IpOworCisJaWYgKChyZXQgPT0gSVBTX0ZBSUxVUkUpIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKSkKKwkJcmV0dXJuIChyZXQpOworCisJaWYgKGludHIgIT0gSVBTX0ZGREMpCS8qIERvbid0IFdhaXQgYXJvdW5kIGlmIHRoaXMgaXMgYSBUaW1lIFN0YW1wICovCisJCXJldCA9IGlwc193YWl0KGhhLCB0aW1lb3V0LCBpbnRyKTsKKworCXJldHVybiAocmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3NjbWRfYnVmX3dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXcml0ZSBkYXRhIHRvIFNjc2lfQ21uZCByZXF1ZXN0X2J1ZmZlciBhdCBwcm9wZXIgb2Zmc2V0cyAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3NjbWRfYnVmX3dyaXRlKFNjc2lfQ21uZCAqIHNjbWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkCisJCSAgIGludCBjb3VudCkKK3sKKwlpZiAoc2NtZC0+dXNlX3NnKSB7CisJCWludCBpOworCQl1bnNpZ25lZCBpbnQgbWluX2NudCwgeGZlcl9jbnQ7CisJCWNoYXIgKmNkYXRhID0gKGNoYXIgKikgZGF0YTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlmb3IgKGkgPSAwLCB4ZmVyX2NudCA9IDA7CisJCSAgICAgKGkgPCBzY21kLT51c2Vfc2cpICYmICh4ZmVyX2NudCA8IGNvdW50KTsgaSsrKSB7CisJCQlpZiAoIUlQU19TR19BRERSRVNTKCZzZ1tpXSkpCisJCQkJcmV0dXJuOworCQkJbWluX2NudCA9IG1pbihjb3VudCAtIHhmZXJfY250LCBzZ1tpXS5sZW5ndGgpOworCQkJbWVtY3B5KElQU19TR19BRERSRVNTKCZzZ1tpXSksICZjZGF0YVt4ZmVyX2NudF0sCisJCQkgICAgICAgbWluX2NudCk7CisJCQl4ZmVyX2NudCArPSBtaW5fY250OworCQl9CisKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgbWluX2NudCA9IG1pbihjb3VudCwgc2NtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJbWVtY3B5KHNjbWQtPnJlcXVlc3RfYnVmZmVyLCBkYXRhLCBtaW5fY250KTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zY21kX2J1Zl9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weSBkYXRhIGZyb20gYSBTY3NpX0NtbmQgdG8gYSBuZXcsIGxpbmVhciBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19zY21kX2J1Zl9yZWFkKFNjc2lfQ21uZCAqIHNjbWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkCisJCSAgaW50IGNvdW50KQoreworCWlmIChzY21kLT51c2Vfc2cpIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGludCBtaW5fY250LCB4ZmVyX2NudDsKKwkJY2hhciAqY2RhdGEgPSAoY2hhciAqKSBkYXRhOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NtZC0+cmVxdWVzdF9idWZmZXI7CisJCWZvciAoaSA9IDAsIHhmZXJfY250ID0gMDsKKwkJICAgICAoaSA8IHNjbWQtPnVzZV9zZykgJiYgKHhmZXJfY250IDwgY291bnQpOyBpKyspIHsKKwkJCWlmICghSVBTX1NHX0FERFJFU1MoJnNnW2ldKSkKKwkJCQlyZXR1cm47CisJCQltaW5fY250ID0gbWluKGNvdW50IC0geGZlcl9jbnQsIHNnW2ldLmxlbmd0aCk7CisJCQltZW1jcHkoJmNkYXRhW3hmZXJfY250XSwgSVBTX1NHX0FERFJFU1MoJnNnW2ldKSwKKwkJCSAgICAgICBtaW5fY250KTsKKwkJCXhmZXJfY250ICs9IG1pbl9jbnQ7CisJCX0KKworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBtaW5fY250ID0gbWluKGNvdW50LCBzY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQltZW1jcHkoZGF0YSwgc2NtZC0+cmVxdWVzdF9idWZmZXIsIG1pbl9jbnQpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3NlbmRfY21kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBNYXAgU0NTSSBjb21tYW5kcyB0byBTZXJ2ZVJBSUQgY29tbWFuZHMgZm9yIGxvZ2ljYWwgZHJpdmVzICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3NlbmRfY21kKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlpbnQgcmV0OworCWNoYXIgKnNwOworCWludCBkZXZpY2VfZXJyb3I7CisJSVBTX0RDREJfVEFCTEVfVEFQRSAqdGFwZURDREI7CisJaW50IFRpbWVPdXQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19zZW5kX2NtZCIsIDEpOworCisJcmV0ID0gSVBTX1NVQ0NFU1M7CisKKwlpZiAoIXNjYi0+c2NzaV9jbWQpIHsKKwkJLyogaW50ZXJuYWwgY29tbWFuZCAqLworCisJCWlmIChzY2ItPmJ1cyA+IDApIHsKKwkJCS8qIENvbnRyb2xsZXIgY29tbWFuZHMgY2FuJ3QgYmUgaXNzdWVkICovCisJCQkvKiB0byByZWFsIGRldmljZXMgLS0gZmFpbCB0aGVtICAgICAgICAqLworCQkJaWYgKChoYS0+d2FpdGZsYWcgPT0gVFJVRSkgJiYKKwkJCSAgICAoaGEtPmNtZF9pbl9wcm9ncmVzcyA9PSBzY2ItPmNkYlswXSkpIHsKKwkJCQloYS0+d2FpdGZsYWcgPSBGQUxTRTsKKwkJCX0KKworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0gZWxzZSBpZiAoKHNjYi0+YnVzID09IDApICYmICghaXBzX2lzX3Bhc3N0aHJ1KHNjYi0+c2NzaV9jbWQpKSkgeworCQkvKiBjb21tYW5kIHRvIGxvZ2ljYWwgYnVzIC0tIGludGVycHJldCAqLworCQlyZXQgPSBJUFNfU1VDQ0VTU19JTU07CisKKwkJc3dpdGNoIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdKSB7CisJCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6CisJCWNhc2UgUkVaRVJPX1VOSVQ6CisJCWNhc2UgRVJBU0U6CisJCWNhc2UgV1JJVEVfRklMRU1BUktTOgorCQljYXNlIFNQQUNFOgorCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFSVF9TVE9QOgorCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCisJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQljYXNlIElOUVVJUlk6CisJCQlpZiAoc2NiLT50YXJnZXRfaWQgPT0gSVBTX0FEQVBURVJfSUQpIHsKKwkJCQkvKgorCQkJCSAqIEVpdGhlciB3ZSBoYXZlIGEgVFVSCisJCQkJICogb3Igd2UgaGF2ZSBhIFNDU0kgaW5xdWlyeQorCQkJCSAqLworCQkJCWlmIChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSkKKwkJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCisJCQkJaWYgKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSkgeworCQkJCQlJUFNfU0NTSV9JTlFfREFUQSBpbnF1aXJ5OworCisJCQkJCW1lbXNldCgmaW5xdWlyeSwgMCwKKwkJCQkJICAgICAgIHNpemVvZiAoSVBTX1NDU0lfSU5RX0RBVEEpKTsKKworCQkJCQlpbnF1aXJ5LkRldmljZVR5cGUgPQorCQkJCQkgICAgSVBTX1NDU0lfSU5RX1RZUEVfUFJPQ0VTU09SOworCQkJCQlpbnF1aXJ5LkRldmljZVR5cGVRdWFsaWZpZXIgPQorCQkJCQkgICAgSVBTX1NDU0lfSU5RX0xVX0NPTk5FQ1RFRDsKKwkJCQkJaW5xdWlyeS5WZXJzaW9uID0gSVBTX1NDU0lfSU5RX1JFVjI7CisJCQkJCWlucXVpcnkuUmVzcG9uc2VEYXRhRm9ybWF0ID0KKwkJCQkJICAgIElQU19TQ1NJX0lOUV9SRF9SRVYyOworCQkJCQlpbnF1aXJ5LkFkZGl0aW9uYWxMZW5ndGggPSAzMTsKKwkJCQkJaW5xdWlyeS5GbGFnc1swXSA9CisJCQkJCSAgICBJUFNfU0NTSV9JTlFfQWRkcmVzczE2OworCQkJCQlpbnF1aXJ5LkZsYWdzWzFdID0KKwkJCQkJICAgIElQU19TQ1NJX0lOUV9XQnVzMTYgfAorCQkJCQkgICAgSVBTX1NDU0lfSU5RX1N5bmM7CisJCQkJCXN0cm5jcHkoaW5xdWlyeS5WZW5kb3JJZCwgIklCTSAgICAgIiwKKwkJCQkJCTgpOworCQkJCQlzdHJuY3B5KGlucXVpcnkuUHJvZHVjdElkLAorCQkJCQkJIlNFUlZFUkFJRCAgICAgICAiLCAxNik7CisJCQkJCXN0cm5jcHkoaW5xdWlyeS5Qcm9kdWN0UmV2aXNpb25MZXZlbCwKKwkJCQkJCSIxLjAwIiwgNCk7CisKKwkJCQkJaXBzX3NjbWRfYnVmX3dyaXRlKHNjYi0+c2NzaV9jbWQsCisJCQkJCQkJICAgJmlucXVpcnksCisJCQkJCQkJICAgc2l6ZW9mIChpbnF1aXJ5KSk7CisKKwkJCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLm9wX2NvZGUgPSBJUFNfQ01EX0dFVF9MRF9JTkZPOworCQkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLnJlc2VydmVkID0gMDsKKwkJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8ucmVzZXJ2ZWQyID0gMDsKKwkJCQlzY2ItPmRhdGFfbGVuID0gc2l6ZW9mIChJUFNfTERfSU5GTyk7CisJCQkJc2NiLT5kYXRhX2J1c2FkZHIgPSBoYS0+bG9naWNhbF9kcml2ZV9pbmZvX2RtYV9hZGRyOworCQkJCXNjYi0+ZmxhZ3MgPSAwOworCQkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5idWZmZXJfYWRkciA9IHNjYi0+ZGF0YV9idXNhZGRyOworCQkJCXJldCA9IElQU19TVUNDRVNTOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJFUVVFU1RfU0VOU0U6CisJCQlpcHNfcmVxc2VuKGhhLCBzY2IpOworCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUFEXzY6CisJCWNhc2UgV1JJVEVfNjoKKwkJCWlmICghc2NiLT5zZ19sZW4pIHsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0KKwkJCQkgICAgKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0KKwkJCQkgICAgIFJFQURfNikgPyBJUFNfQ01EX1JFQUQgOiBJUFNfQ01EX1dSSVRFOworCQkJCXNjYi0+Y21kLmJhc2ljX2lvLmVuaGFuY2VkX3NnID0gMDsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5kYXRhX2J1c2FkZHIpOworCQkJfSBlbHNlIHsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0KKwkJCQkgICAgKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0KKwkJCQkgICAgIFJFQURfNikgPyBJUFNfQ01EX1JFQURfU0cgOgorCQkJCSAgICBJUFNfQ01EX1dSSVRFX1NHOworCQkJCXNjYi0+Y21kLmJhc2ljX2lvLmVuaGFuY2VkX3NnID0KKwkJCQkgICAgSVBTX1VTRV9FTkhfU0dMSVNUKGhhKSA/IDB4RkYgOiAwOworCQkJCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2FkZHIgPQorCQkJCSAgICBjcHVfdG9fbGUzMihzY2ItPnNnX2J1c2FkZHIpOworCQkJfQorCisJCQlzY2ItPmNtZC5iYXNpY19pby5zZWdtZW50XzRHID0gMDsKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLmxvZ19kcnYgPSBzY2ItPnRhcmdldF9pZDsKKwkJCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2NvdW50ID0gc2NiLT5zZ19sZW47CisKKwkJCWlmIChzY2ItPmNtZC5iYXNpY19pby5sYmEpCisJCQkJc2NiLT5jbWQuYmFzaWNfaW8ubGJhID0KKwkJCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUKKwkJCQkJCShzY2ItPmNtZC5iYXNpY19pby5sYmEpICsKKwkJCQkJCWxlMTZfdG9fY3B1KHNjYi0+Y21kLmJhc2ljX2lvLgorCQkJCQkJCSAgICBzZWN0b3JfY291bnQpKTsKKwkJCWVsc2UKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5sYmEgPQorCQkJCSAgICAoKChzY2ItPnNjc2lfY21kLT4KKwkJCQkgICAgICAgY21uZFsxXSAmIDB4MWYpIDw8IDE2KSB8IChzY2ItPnNjc2lfY21kLT4KKwkJCQkJCQkJIGNtbmRbMl0gPDwgOCkgfAorCQkJCSAgICAgKHNjYi0+c2NzaV9jbWQtPmNtbmRbM10pKTsKKworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2VjdG9yX2NvdW50ID0KKwkJCSAgICBjcHVfdG9fbGUxNihzY2ItPmRhdGFfbGVuIC8gSVBTX0JMS1NJWkUpOworCisJCQlpZiAobGUxNl90b19jcHUoc2NiLT5jbWQuYmFzaWNfaW8uc2VjdG9yX2NvdW50KSA9PSAwKQorCQkJCXNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCA9CisJCQkJICAgIGNwdV90b19sZTE2KDI1Nik7CisKKwkJCXJldCA9IElQU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRUFEXzEwOgorCQljYXNlIFdSSVRFXzEwOgorCQkJaWYgKCFzY2ItPnNnX2xlbikgeworCQkJCXNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPQorCQkJCSAgICAoc2NiLT5zY3NpX2NtZC0+Y21uZFswXSA9PQorCQkJCSAgICAgUkVBRF8xMCkgPyBJUFNfQ01EX1JFQUQgOiBJUFNfQ01EX1dSSVRFOworCQkJCXNjYi0+Y21kLmJhc2ljX2lvLmVuaGFuY2VkX3NnID0gMDsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5kYXRhX2J1c2FkZHIpOworCQkJfSBlbHNlIHsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0KKwkJCQkgICAgKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0gPT0KKwkJCQkgICAgIFJFQURfMTApID8gSVBTX0NNRF9SRUFEX1NHIDoKKwkJCQkgICAgSVBTX0NNRF9XUklURV9TRzsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5lbmhhbmNlZF9zZyA9CisJCQkJICAgIElQU19VU0VfRU5IX1NHTElTVChoYSkgPyAweEZGIDogMDsKKwkJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2NiLT5zZ19idXNhZGRyKTsKKwkJCX0KKworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2VnbWVudF80RyA9IDA7CisJCQlzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJCQlzY2ItPmNtZC5iYXNpY19pby5sb2dfZHJ2ID0gc2NiLT50YXJnZXRfaWQ7CisJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19jb3VudCA9IHNjYi0+c2dfbGVuOworCisJCQlpZiAoc2NiLT5jbWQuYmFzaWNfaW8ubGJhKQorCQkJCXNjYi0+Y21kLmJhc2ljX2lvLmxiYSA9CisJCQkJICAgIGNwdV90b19sZTMyKGxlMzJfdG9fY3B1CisJCQkJCQkoc2NiLT5jbWQuYmFzaWNfaW8ubGJhKSArCisJCQkJCQlsZTE2X3RvX2NwdShzY2ItPmNtZC5iYXNpY19pby4KKwkJCQkJCQkgICAgc2VjdG9yX2NvdW50KSk7CisJCQllbHNlCisJCQkJc2NiLT5jbWQuYmFzaWNfaW8ubGJhID0KKwkJCQkgICAgKChzY2ItPnNjc2lfY21kLT5jbW5kWzJdIDw8IDI0KSB8IChzY2ItPgorCQkJCQkJCQkgICAgICAgc2NzaV9jbWQtPgorCQkJCQkJCQkgICAgICAgY21uZFszXQorCQkJCQkJCQkgICAgICAgPDwgMTYpIHwKKwkJCQkgICAgIChzY2ItPnNjc2lfY21kLT5jbW5kWzRdIDw8IDgpIHwgc2NiLT4KKwkJCQkgICAgIHNjc2lfY21kLT5jbW5kWzVdKTsKKworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2VjdG9yX2NvdW50ID0KKwkJCSAgICBjcHVfdG9fbGUxNihzY2ItPmRhdGFfbGVuIC8gSVBTX0JMS1NJWkUpOworCisJCQlpZiAoY3B1X3RvX2xlMTYoc2NiLT5jbWQuYmFzaWNfaW8uc2VjdG9yX2NvdW50KSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIGEgbnVsbCBjb25kaXRpb24KKwkJCQkgKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCisJCQkJICogc28ganVzdCByZXR1cm4KKwkJCQkgKi8KKwkJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQl9IGVsc2UKKwkJCQlyZXQgPSBJUFNfU1VDQ0VTUzsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNFUlZFOgorCQljYXNlIFJFTEVBU0U6CisJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VOU0U6CisJCQlzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlID0gSVBTX0NNRF9FTlFVSVJZOworCQkJc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCQkJc2NiLT5jbWQuYmFzaWNfaW8uc2VnbWVudF80RyA9IDA7CisJCQlzY2ItPmNtZC5iYXNpY19pby5lbmhhbmNlZF9zZyA9IDA7CisJCQlzY2ItPmRhdGFfbGVuID0gc2l6ZW9mICgqaGEtPmVucSk7CisJCQlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0gaGEtPmVucV9idXNhZGRyOworCQkJcmV0ID0gSVBTX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8ub3BfY29kZSA9IElQU19DTURfR0VUX0xEX0lORk87CisJCQlzY2ItPmNtZC5sb2dpY2FsX2luZm8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLnJlc2VydmVkID0gMDsKKwkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5yZXNlcnZlZDIgPSAwOworCQkJc2NiLT5jbWQubG9naWNhbF9pbmZvLnJlc2VydmVkMyA9IDA7CisJCQlzY2ItPmRhdGFfbGVuID0gc2l6ZW9mIChJUFNfTERfSU5GTyk7CisJCQlzY2ItPmRhdGFfYnVzYWRkciA9IGhhLT5sb2dpY2FsX2RyaXZlX2luZm9fZG1hX2FkZHI7CisJCQlzY2ItPmZsYWdzID0gMDsKKwkJCXNjYi0+Y21kLmxvZ2ljYWxfaW5mby5idWZmZXJfYWRkciA9IHNjYi0+ZGF0YV9idXNhZGRyOworCQkJcmV0ID0gSVBTX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIFNFTkRfRElBR05PU1RJQzoKKwkJY2FzZSBSRUFTU0lHTl9CTE9DS1M6CisJCWNhc2UgRk9STUFUX1VOSVQ6CisJCWNhc2UgU0VFS18xMDoKKwkJY2FzZSBWRVJJRlk6CisJCWNhc2UgUkVBRF9ERUZFQ1RfREFUQToKKwkJY2FzZSBSRUFEX0JVRkZFUjoKKwkJY2FzZSBXUklURV9CVUZGRVI6CisJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogU2V0IHRoZSBSZXR1cm4gSW5mbyB0byBhcHBlYXIgbGlrZSB0aGUgQ29tbWFuZCB3YXMgKi8KKwkJCS8qIGF0dGVtcHRlZCwgYSBDaGVjayBDb25kaXRpb24gb2NjdXJyZWQsIGFuZCBTZW5zZSAgICovCisJCQkvKiBEYXRhIGluZGljYXRpbmcgYW4gSW52YWxpZCBDREIgT3BDb2RlIGlzIHJldHVybmVkLiAqLworCQkJc3AgPSAoY2hhciAqKSBzY2ItPnNjc2lfY21kLT5zZW5zZV9idWZmZXI7CisJCQltZW1zZXQoc3AsIDAsIHNpemVvZiAoc2NiLT5zY3NpX2NtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwkJCXNwWzBdID0gMHg3MDsJLyogRXJyb3IgQ29kZSAgICAgICAgICAgICAgICovCisJCQlzcFsyXSA9IElMTEVHQUxfUkVRVUVTVDsJLyogU2Vuc2UgS2V5IDUgSWxsZWdhbCBSZXEuICovCisJCQlzcFs3XSA9IDB4MEE7CS8qIEFkZGl0aW9uYWwgU2Vuc2UgTGVuZ3RoICAqLworCQkJc3BbMTJdID0gMHgyMDsJLyogQVNDID0gSW52YWxpZCBPcENvZGUgICAgICovCisJCQlzcFsxM10gPSAweDAwOwkvKiBBU0NRICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkJZGV2aWNlX2Vycm9yID0gMjsJLyogSW5kaWNhdGUgQ2hlY2sgQ29uZGl0aW9uICovCisJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBkZXZpY2VfZXJyb3IgfCAoRElEX09LIDw8IDE2KTsKKwkJCWJyZWFrOworCQl9CQkvKiBlbmQgc3dpdGNoICovCisJfQorCS8qIGVuZCBpZiAqLworCWlmIChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCQlyZXR1cm4gKHJldCk7CisKKwkvKiBzZXR1cCBEQ0RCICovCisJaWYgKHNjYi0+YnVzID4gMCkgeworCisJCS8qIElmIHdlIGFscmVhZHkga25vdyB0aGUgRGV2aWNlIGlzIE5vdCB0aGVyZSwgbm8gbmVlZCB0byBhdHRlbXB0IGEgQ29tbWFuZCAgICovCisJCS8qIFRoaXMgYWxzbyBwcm90ZWN0cyBhbiBOVCBGYWlsT3ZlciBDb250cm9sbGVyIGZyb20gZ2V0dGluZyBDREIncyBzZW50IHRvIGl0ICovCisJCWlmIChoYS0+Y29uZi0+ZGV2W3NjYi0+YnVzIC0gMV1bc2NiLT50YXJnZXRfaWRdLnVjU3RhdGUgPT0gMCkgeworCQkJc2NiLT5zY3NpX2NtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCQlyZXR1cm4gKElQU19TVUNDRVNTX0lNTSk7CisJCX0KKworCQloYS0+ZGNkYl9hY3RpdmVbc2NiLT5idXMgLSAxXSB8PSAoMSA8PCBzY2ItPnRhcmdldF9pZCk7CisJCXNjYi0+Y21kLmRjZGIuY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCQlzY2ItPmNtZC5kY2RiLmRjZGJfYWRkcmVzcyA9IGNwdV90b19sZTMyKHNjYi0+c2NiX2J1c2FkZHIgKworCQkJCQkJCSAodW5zaWduZWQgbG9uZykgJnNjYi0+CisJCQkJCQkJIGRjZGIgLQorCQkJCQkJCSAodW5zaWduZWQgbG9uZykgc2NiKTsKKwkJc2NiLT5jbWQuZGNkYi5yZXNlcnZlZCA9IDA7CisJCXNjYi0+Y21kLmRjZGIucmVzZXJ2ZWQyID0gMDsKKwkJc2NiLT5jbWQuZGNkYi5yZXNlcnZlZDMgPSAwOworCQlzY2ItPmNtZC5kY2RiLnNlZ21lbnRfNEcgPSAwOworCQlzY2ItPmNtZC5kY2RiLmVuaGFuY2VkX3NnID0gMDsKKworCQlUaW1lT3V0ID0gc2NiLT5zY3NpX2NtZC0+dGltZW91dF9wZXJfY29tbWFuZDsKKworCQlpZiAoaGEtPnN1YnN5cy0+cGFyYW1bNF0gJiAweDAwMTAwMDAwKSB7CS8qIElmIE5FVyBUYXBlIERDREIgaXMgU3VwcG9ydGVkICovCisJCQlpZiAoIXNjYi0+c2dfbGVuKSB7CisJCQkJc2NiLT5jbWQuZGNkYi5vcF9jb2RlID0gSVBTX0NNRF9FWFRFTkRFRF9EQ0RCOworCQkJfSBlbHNlIHsKKwkJCQlzY2ItPmNtZC5kY2RiLm9wX2NvZGUgPQorCQkJCSAgICBJUFNfQ01EX0VYVEVOREVEX0RDREJfU0c7CisJCQkJc2NiLT5jbWQuZGNkYi5lbmhhbmNlZF9zZyA9CisJCQkJICAgIElQU19VU0VfRU5IX1NHTElTVChoYSkgPyAweEZGIDogMDsKKwkJCX0KKworCQkJdGFwZURDREIgPSAoSVBTX0RDREJfVEFCTEVfVEFQRSAqKSAmIHNjYi0+ZGNkYjsJLyogVXNlIFNhbWUgRGF0YSBBcmVhIGFzIE9sZCBEQ0RCIFN0cnVjdCAqLworCQkJdGFwZURDREItPmRldmljZV9hZGRyZXNzID0KKwkJCSAgICAoKHNjYi0+YnVzIC0gMSkgPDwgNCkgfCBzY2ItPnRhcmdldF9pZDsKKwkJCXRhcGVEQ0RCLT5jbWRfYXR0cmlidXRlIHw9IElQU19ESVNDT05ORUNUX0FMTE9XRUQ7CisJCQl0YXBlRENEQi0+Y21kX2F0dHJpYnV0ZSAmPSB+SVBTX1RSQU5TRkVSNjRLOwkvKiBBbHdheXMgVHVybiBPRkYgNjRLIFNpemUgRmxhZyAqLworCisJCQlpZiAoVGltZU91dCkgeworCQkJCWlmIChUaW1lT3V0IDwgKDEwICogSFopKQorCQkJCQl0YXBlRENEQi0+Y21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDEwOwkvKiBUaW1lT3V0IGlzIDEwIFNlY29uZHMgKi8KKwkJCQllbHNlIGlmIChUaW1lT3V0IDwgKDYwICogSFopKQorCQkJCQl0YXBlRENEQi0+Y21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDYwOwkvKiBUaW1lT3V0IGlzIDYwIFNlY29uZHMgKi8KKwkJCQllbHNlIGlmIChUaW1lT3V0IDwgKDEyMDAgKiBIWikpCisJCQkJCXRhcGVEQ0RCLT5jbWRfYXR0cmlidXRlIHw9IElQU19USU1FT1VUMjBNOwkvKiBUaW1lT3V0IGlzIDIwIE1pbnV0ZXMgKi8KKwkJCX0KKworCQkJdGFwZURDREItPmNkYl9sZW5ndGggPSBzY2ItPnNjc2lfY21kLT5jbWRfbGVuOworCQkJdGFwZURDREItPnJlc2VydmVkX2Zvcl9MVU4gPSAwOworCQkJdGFwZURDREItPnRyYW5zZmVyX2xlbmd0aCA9IHNjYi0+ZGF0YV9sZW47CisJCQlpZiAoc2NiLT5jbWQuZGNkYi5vcF9jb2RlID09IElQU19DTURfRVhURU5ERURfRENEQl9TRykKKwkJCQl0YXBlRENEQi0+YnVmZmVyX3BvaW50ZXIgPQorCQkJCSAgICBjcHVfdG9fbGUzMihzY2ItPnNnX2J1c2FkZHIpOworCQkJZWxzZQorCQkJCXRhcGVEQ0RCLT5idWZmZXJfcG9pbnRlciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNjYi0+ZGF0YV9idXNhZGRyKTsKKwkJCXRhcGVEQ0RCLT5zZ19jb3VudCA9IHNjYi0+c2dfbGVuOworCQkJdGFwZURDREItPnNlbnNlX2xlbmd0aCA9IHNpemVvZiAodGFwZURDREItPnNlbnNlX2luZm8pOworCQkJdGFwZURDREItPnNjc2lfc3RhdHVzID0gMDsKKwkJCXRhcGVEQ0RCLT5yZXNlcnZlZCA9IDA7CisJCQltZW1jcHkodGFwZURDREItPnNjc2lfY2RiLCBzY2ItPnNjc2lfY21kLT5jbW5kLAorCQkJICAgICAgIHNjYi0+c2NzaV9jbWQtPmNtZF9sZW4pOworCQl9IGVsc2UgeworCQkJaWYgKCFzY2ItPnNnX2xlbikgeworCQkJCXNjYi0+Y21kLmRjZGIub3BfY29kZSA9IElQU19DTURfRENEQjsKKwkJCX0gZWxzZSB7CisJCQkJc2NiLT5jbWQuZGNkYi5vcF9jb2RlID0gSVBTX0NNRF9EQ0RCX1NHOworCQkJCXNjYi0+Y21kLmRjZGIuZW5oYW5jZWRfc2cgPQorCQkJCSAgICBJUFNfVVNFX0VOSF9TR0xJU1QoaGEpID8gMHhGRiA6IDA7CisJCQl9CisKKwkJCXNjYi0+ZGNkYi5kZXZpY2VfYWRkcmVzcyA9CisJCQkgICAgKChzY2ItPmJ1cyAtIDEpIDw8IDQpIHwgc2NiLT50YXJnZXRfaWQ7CisJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfRElTQ09OTkVDVF9BTExPV0VEOworCisJCQlpZiAoVGltZU91dCkgeworCQkJCWlmIChUaW1lT3V0IDwgKDEwICogSFopKQorCQkJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDEwOwkvKiBUaW1lT3V0IGlzIDEwIFNlY29uZHMgKi8KKwkJCQllbHNlIGlmIChUaW1lT3V0IDwgKDYwICogSFopKQorCQkJCQlzY2ItPmRjZGIuY21kX2F0dHJpYnV0ZSB8PSBJUFNfVElNRU9VVDYwOwkvKiBUaW1lT3V0IGlzIDYwIFNlY29uZHMgKi8KKwkJCQllbHNlIGlmIChUaW1lT3V0IDwgKDEyMDAgKiBIWikpCisJCQkJCXNjYi0+ZGNkYi5jbWRfYXR0cmlidXRlIHw9IElQU19USU1FT1VUMjBNOwkvKiBUaW1lT3V0IGlzIDIwIE1pbnV0ZXMgKi8KKwkJCX0KKworCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IHNjYi0+ZGF0YV9sZW47CisJCQlpZiAoc2NiLT5kY2RiLmNtZF9hdHRyaWJ1dGUgJiBJUFNfVFJBTlNGRVI2NEspCisJCQkJc2NiLT5kY2RiLnRyYW5zZmVyX2xlbmd0aCA9IDA7CisJCQlpZiAoc2NiLT5jbWQuZGNkYi5vcF9jb2RlID09IElQU19DTURfRENEQl9TRykKKwkJCQlzY2ItPmRjZGIuYnVmZmVyX3BvaW50ZXIgPQorCQkJCSAgICBjcHVfdG9fbGUzMihzY2ItPnNnX2J1c2FkZHIpOworCQkJZWxzZQorCQkJCXNjYi0+ZGNkYi5idWZmZXJfcG9pbnRlciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNjYi0+ZGF0YV9idXNhZGRyKTsKKwkJCXNjYi0+ZGNkYi5jZGJfbGVuZ3RoID0gc2NiLT5zY3NpX2NtZC0+Y21kX2xlbjsKKwkJCXNjYi0+ZGNkYi5zZW5zZV9sZW5ndGggPSBzaXplb2YgKHNjYi0+ZGNkYi5zZW5zZV9pbmZvKTsKKwkJCXNjYi0+ZGNkYi5zZ19jb3VudCA9IHNjYi0+c2dfbGVuOworCQkJc2NiLT5kY2RiLnJlc2VydmVkID0gMDsKKwkJCW1lbWNweShzY2ItPmRjZGIuc2NzaV9jZGIsIHNjYi0+c2NzaV9jbWQtPmNtbmQsCisJCQkgICAgICAgc2NiLT5zY3NpX2NtZC0+Y21kX2xlbik7CisJCQlzY2ItPmRjZGIuc2NzaV9zdGF0dXMgPSAwOworCQkJc2NiLT5kY2RiLnJlc2VydmVkMlswXSA9IDA7CisJCQlzY2ItPmRjZGIucmVzZXJ2ZWQyWzFdID0gMDsKKwkJCXNjYi0+ZGNkYi5yZXNlcnZlZDJbMl0gPSAwOworCQl9CisJfQorCisJcmV0dXJuICgoKmhhLT5mdW5jLmlzc3VlKSAoaGEsIHNjYikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfY2hrX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENoZWNrIHRoZSBzdGF0dXMgb2YgY29tbWFuZHMgdG8gbG9naWNhbCBkcml2ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXNzdW1lZCB0byBiZSBjYWxsZWQgd2l0aCB0aGUgSEEgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2Noa3N0YXR1cyhpcHNfaGFfdCAqIGhhLCBJUFNfU1RBVFVTICogcHN0YXR1cykKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKwlpcHNfc3RhdF90ICpzcDsKKwl1aW50OF90IGJhc2ljX3N0YXR1czsKKwl1aW50OF90IGV4dF9zdGF0dXM7CisJaW50IGVycmNvZGU7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19jaGtzdGF0dXMiLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1twc3RhdHVzLT5maWVsZHMuY29tbWFuZF9pZF07CisJc2NiLT5iYXNpY19zdGF0dXMgPSBiYXNpY19zdGF0dXMgPQorCSAgICBwc3RhdHVzLT5maWVsZHMuYmFzaWNfc3RhdHVzICYgSVBTX0JBU0lDX1NUQVRVU19NQVNLOworCXNjYi0+ZXh0ZW5kZWRfc3RhdHVzID0gZXh0X3N0YXR1cyA9IHBzdGF0dXMtPmZpZWxkcy5leHRlbmRlZF9zdGF0dXM7CisKKwlzcCA9ICZoYS0+c3A7CisJc3AtPnJlc2lkdWVfbGVuID0gMDsKKwlzcC0+c2NiX2FkZHIgPSAodm9pZCAqKSBzY2I7CisKKwkvKiBSZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgYWN0aXZlIHF1ZXVlICovCisJaXBzX3JlbW92ZXFfc2NiKCZoYS0+c2NiX2FjdGl2ZWxpc3QsIHNjYik7CisKKwlpZiAoIXNjYi0+c2NzaV9jbWQpCisJCS8qIGludGVybmFsIGNvbW1hbmRzIGFyZSBoYW5kbGVkIGluIGRvX2lwc2ludHIgKi8KKwkJcmV0dXJuOworCisJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2Noa3N0YXR1czogY21kIDB4JVggaWQgJWQgKCVkICVkICVkKSIsCisJCSAgaXBzX25hbWUsCisJCSAgaGEtPmhvc3RfbnVtLAorCQkgIHNjYi0+Y2RiWzBdLAorCQkgIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQsCisJCSAgc2NiLT5idXMsIHNjYi0+dGFyZ2V0X2lkLCBzY2ItPmx1bik7CisKKwlpZiAoKHNjYi0+c2NzaV9jbWQpICYmIChpcHNfaXNfcGFzc3RocnUoc2NiLT5zY3NpX2NtZCkpKQorCQkvKiBwYXNzdGhydSAtIGp1c3QgcmV0dXJucyB0aGUgcmF3IHJlc3VsdCAqLworCQlyZXR1cm47CisKKwllcnJjb2RlID0gRElEX09LOworCisJaWYgKCgoYmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPT0gSVBTX0NNRF9TVUNDRVNTKSB8fAorCSAgICAoKGJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID09IElQU19DTURfUkVDT1ZFUkVEX0VSUk9SKSkgeworCisJCWlmIChzY2ItPmJ1cyA9PSAwKSB7CisJCQlpZiAoKGJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID09CisJCQkgICAgSVBTX0NNRF9SRUNPVkVSRURfRVJST1IpIHsKKwkJCQlERUJVR19WQVIoMSwKKwkJCQkJICAiKCVzJWQpIFJlY292ZXJlZCBMb2dpY2FsIERyaXZlIEVycm9yIE9wQ29kZTogJXgsIEJTQjogJXgsIEVTQjogJXgiLAorCQkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sCisJCQkJCSAgc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSwKKwkJCQkJICBiYXNpY19zdGF0dXMsIGV4dF9zdGF0dXMpOworCQkJfQorCisJCQlzd2l0Y2ggKHNjYi0+c2NzaV9jbWQtPmNtbmRbMF0pIHsKKwkJCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6CisJCQljYXNlIFJFWkVST19VTklUOgorCQkJY2FzZSBFUkFTRToKKwkJCWNhc2UgV1JJVEVfRklMRU1BUktTOgorCQkJY2FzZSBTUEFDRToKKwkJCQllcnJjb2RlID0gRElEX0VSUk9SOworCQkJCWJyZWFrOworCisJCQljYXNlIFNUQVJUX1NUT1A6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJCWlmICghaXBzX29ubGluZShoYSwgc2NiKSkgeworCQkJCQllcnJjb2RlID0gRElEX1RJTUVfT1VUOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJTlFVSVJZOgorCQkJCWlmIChpcHNfb25saW5lKGhhLCBzY2IpKSB7CisJCQkJCWlwc19pbnF1aXJ5KGhhLCBzY2IpOworCQkJCX0gZWxzZSB7CisJCQkJCWVycmNvZGUgPSBESURfVElNRV9PVVQ7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJFUVVFU1RfU0VOU0U6CisJCQkJaXBzX3JlcXNlbihoYSwgc2NiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUFEXzY6CisJCQljYXNlIFdSSVRFXzY6CisJCQljYXNlIFJFQURfMTA6CisJCQljYXNlIFdSSVRFXzEwOgorCQkJY2FzZSBSRVNFUlZFOgorCQkJY2FzZSBSRUxFQVNFOgorCQkJCWJyZWFrOworCisJCQljYXNlIE1PREVfU0VOU0U6CisJCQkJaWYgKCFpcHNfb25saW5lKGhhLCBzY2IpCisJCQkJICAgIHx8ICFpcHNfbXNlbnNlKGhhLCBzY2IpKSB7CisJCQkJCWVycmNvZGUgPSBESURfRVJST1I7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJFQURfQ0FQQUNJVFk6CisJCQkJaWYgKGlwc19vbmxpbmUoaGEsIHNjYikpCisJCQkJCWlwc19yZGNhcChoYSwgc2NiKTsKKwkJCQllbHNlIHsKKwkJCQkJZXJyY29kZSA9IERJRF9USU1FX09VVDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0VORF9ESUFHTk9TVElDOgorCQkJY2FzZSBSRUFTU0lHTl9CTE9DS1M6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRk9STUFUX1VOSVQ6CisJCQkJZXJyY29kZSA9IERJRF9FUlJPUjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTRUVLXzEwOgorCQkJY2FzZSBWRVJJRlk6CisJCQljYXNlIFJFQURfREVGRUNUX0RBVEE6CisJCQljYXNlIFJFQURfQlVGRkVSOgorCQkJY2FzZSBXUklURV9CVUZGRVI6CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZXJyY29kZSA9IERJRF9FUlJPUjsKKwkJCX0JLyogZW5kIHN3aXRjaCAqLworCisJCQlzY2ItPnNjc2lfY21kLT5yZXN1bHQgPSBlcnJjb2RlIDw8IDE2OworCQl9IGVsc2UgewkvKiBidXMgPT0gMCAqLworCQkJLyogcmVzdHJpY3QgYWNjZXNzIHRvIHBoeXNpY2FsIGRyaXZlcyAqLworCQkJaWYgKChzY2ItPnNjc2lfY21kLT5jbW5kWzBdID09IElOUVVJUlkpICYmCisJCQkgICAgKCgoKGNoYXIgKikgc2NiLT5zY3NpX2NtZC0+YnVmZmVyKVswXSAmIDB4MWYpID09CisJCQkgICAgIFRZUEVfRElTSykpIHsKKworCQkJCXNjYi0+c2NzaV9jbWQtPnJlc3VsdCA9IERJRF9USU1FX09VVCA8PCAxNjsKKwkJCX0KKwkJfQkJLyogZWxzZSAqLworCX0gZWxzZSB7CQkvKiByZWNvdmVyZWQgZXJyb3IgLyBzdWNjZXNzICovCisJCWlmIChzY2ItPmJ1cyA9PSAwKSB7CisJCQlERUJVR19WQVIoMSwKKwkJCQkgICIoJXMlZCkgVW5yZWNvdmVyZWQgTG9naWNhbCBEcml2ZSBFcnJvciBPcENvZGU6ICV4LCBCU0I6ICV4LCBFU0I6ICV4IiwKKwkJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sCisJCQkJICBzY2ItPmNtZC5iYXNpY19pby5vcF9jb2RlLCBiYXNpY19zdGF0dXMsCisJCQkJICBleHRfc3RhdHVzKTsKKwkJfQorCisJCWlwc19tYXBfc3RhdHVzKGhhLCBzY2IsIHNwKTsKKwl9CQkJLyogZWxzZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfb25saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIERldGVybWluZSBpZiBhIGxvZ2ljYWwgZHJpdmUgaXMgb25saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfb25saW5lKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19vbmxpbmUiLCAxKTsKKworCWlmIChzY2ItPnRhcmdldF9pZCA+PSBJUFNfTUFYX0xEKQorCQlyZXR1cm4gKDApOworCisJaWYgKChzY2ItPmJhc2ljX3N0YXR1cyAmIElQU19HU0NfU1RBVFVTX01BU0spID4gMSkgeworCQltZW1zZXQoaGEtPmxvZ2ljYWxfZHJpdmVfaW5mbywgMCwgc2l6ZW9mIChJUFNfTERfSU5GTykpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChoYS0+bG9naWNhbF9kcml2ZV9pbmZvLT5kcml2ZV9pbmZvW3NjYi0+dGFyZ2V0X2lkXS5zdGF0ZSAhPQorCSAgICBJUFNfTERfT0ZGTElORQorCSAgICAmJiBoYS0+bG9naWNhbF9kcml2ZV9pbmZvLT5kcml2ZV9pbmZvW3NjYi0+dGFyZ2V0X2lkXS5zdGF0ZSAhPQorCSAgICBJUFNfTERfRlJFRQorCSAgICAmJiBoYS0+bG9naWNhbF9kcml2ZV9pbmZvLT5kcml2ZV9pbmZvW3NjYi0+dGFyZ2V0X2lkXS5zdGF0ZSAhPQorCSAgICBJUFNfTERfQ1JTCisJICAgICYmIGhhLT5sb2dpY2FsX2RyaXZlX2luZm8tPmRyaXZlX2luZm9bc2NiLT50YXJnZXRfaWRdLnN0YXRlICE9CisJICAgIElQU19MRF9TWVMpCisJCXJldHVybiAoMSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaW5xdWlyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNpbXVsYXRlIGFuIGlucXVpcnkgY29tbWFuZCB0byBhIGxvZ2ljYWwgZHJpdmUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaW5xdWlyeShpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJSVBTX1NDU0lfSU5RX0RBVEEgaW5xdWlyeTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lucXVpcnkiLCAxKTsKKworCW1lbXNldCgmaW5xdWlyeSwgMCwgc2l6ZW9mIChJUFNfU0NTSV9JTlFfREFUQSkpOworCisJaW5xdWlyeS5EZXZpY2VUeXBlID0gSVBTX1NDU0lfSU5RX1RZUEVfREFTRDsKKwlpbnF1aXJ5LkRldmljZVR5cGVRdWFsaWZpZXIgPSBJUFNfU0NTSV9JTlFfTFVfQ09OTkVDVEVEOworCWlucXVpcnkuVmVyc2lvbiA9IElQU19TQ1NJX0lOUV9SRVYyOworCWlucXVpcnkuUmVzcG9uc2VEYXRhRm9ybWF0ID0gSVBTX1NDU0lfSU5RX1JEX1JFVjI7CisJaW5xdWlyeS5BZGRpdGlvbmFsTGVuZ3RoID0gMzE7CisJaW5xdWlyeS5GbGFnc1swXSA9IElQU19TQ1NJX0lOUV9BZGRyZXNzMTY7CisJaW5xdWlyeS5GbGFnc1sxXSA9CisJICAgIElQU19TQ1NJX0lOUV9XQnVzMTYgfCBJUFNfU0NTSV9JTlFfU3luYyB8IElQU19TQ1NJX0lOUV9DbWRRdWU7CisJc3RybmNweShpbnF1aXJ5LlZlbmRvcklkLCAiSUJNICAgICAiLCA4KTsKKwlzdHJuY3B5KGlucXVpcnkuUHJvZHVjdElkLCAiU0VSVkVSQUlEICAgICAgICIsIDE2KTsKKwlzdHJuY3B5KGlucXVpcnkuUHJvZHVjdFJldmlzaW9uTGV2ZWwsICIxLjAwIiwgNCk7CisKKwlpcHNfc2NtZF9idWZfd3JpdGUoc2NiLT5zY3NpX2NtZCwgJmlucXVpcnksIHNpemVvZiAoaW5xdWlyeSkpOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JkY2FwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTaW11bGF0ZSBhIHJlYWQgY2FwYWNpdHkgY29tbWFuZCB0byBhIGxvZ2ljYWwgZHJpdmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3JkY2FwKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlJUFNfU0NTSV9DQVBBQ0lUWSBjYXA7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZGNhcCIsIDEpOworCisJaWYgKHNjYi0+c2NzaV9jbWQtPmJ1ZmZsZW4gPCA4KQorCQlyZXR1cm4gKDApOworCisJY2FwLmxiYSA9CisJICAgIGNwdV90b19iZTMyKGxlMzJfdG9fY3B1CisJCQkoaGEtPmxvZ2ljYWxfZHJpdmVfaW5mby0+CisJCQkgZHJpdmVfaW5mb1tzY2ItPnRhcmdldF9pZF0uc2VjdG9yX2NvdW50KSAtIDEpOworCWNhcC5sZW4gPSBjcHVfdG9fYmUzMigodWludDMyX3QpIElQU19CTEtTSVpFKTsKKworCWlwc19zY21kX2J1Zl93cml0ZShzY2ItPnNjc2lfY21kLCAmY2FwLCBzaXplb2YgKGNhcCkpOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX21zZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTaW11bGF0ZSBhIG1vZGUgc2Vuc2UgY29tbWFuZCB0byBhIGxvZ2ljYWwgZHJpdmUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX21zZW5zZShpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJdWludDE2X3QgaGVhZHM7CisJdWludDE2X3Qgc2VjdG9yczsKKwl1aW50MzJfdCBjeWxpbmRlcnM7CisJSVBTX1NDU0lfTU9ERV9QQUdFX0RBVEEgbWRhdGE7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19tc2Vuc2UiLCAxKTsKKworCWlmIChsZTMyX3RvX2NwdShoYS0+ZW5xLT51bERyaXZlU2l6ZVtzY2ItPnRhcmdldF9pZF0pID4gMHg0MDAwMDAgJiYKKwkgICAgKGhhLT5lbnEtPnVjTWlzY0ZsYWcgJiAweDgpID09IDApIHsKKwkJaGVhZHMgPSBJUFNfTk9STV9IRUFEUzsKKwkJc2VjdG9ycyA9IElQU19OT1JNX1NFQ1RPUlM7CisJfSBlbHNlIHsKKwkJaGVhZHMgPSBJUFNfQ09NUF9IRUFEUzsKKwkJc2VjdG9ycyA9IElQU19DT01QX1NFQ1RPUlM7CisJfQorCisJY3lsaW5kZXJzID0KKwkgICAgKGxlMzJfdG9fY3B1KGhhLT5lbnEtPnVsRHJpdmVTaXplW3NjYi0+dGFyZ2V0X2lkXSkgLQorCSAgICAgMSkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKworCW1lbXNldCgmbWRhdGEsIDAsIHNpemVvZiAoSVBTX1NDU0lfTU9ERV9QQUdFX0RBVEEpKTsKKworCW1kYXRhLmhkci5CbG9ja0Rlc2NMZW5ndGggPSA4OworCisJc3dpdGNoIChzY2ItPnNjc2lfY21kLT5jbW5kWzJdICYgMHgzZikgeworCWNhc2UgMHgwMzoJCS8qIHBhZ2UgMyAqLworCQltZGF0YS5wZGF0YS5wZzMuUGFnZUNvZGUgPSAzOworCQltZGF0YS5wZGF0YS5wZzMuUGFnZUxlbmd0aCA9IHNpemVvZiAoSVBTX1NDU0lfTU9ERV9QQUdFMyk7CisJCW1kYXRhLmhkci5EYXRhTGVuZ3RoID0KKwkJICAgIDMgKyBtZGF0YS5oZHIuQmxvY2tEZXNjTGVuZ3RoICsgbWRhdGEucGRhdGEucGczLlBhZ2VMZW5ndGg7CisJCW1kYXRhLnBkYXRhLnBnMy5UcmFja3NQZXJab25lID0gMDsKKwkJbWRhdGEucGRhdGEucGczLkFsdFNlY3RvcnNQZXJab25lID0gMDsKKwkJbWRhdGEucGRhdGEucGczLkFsdFRyYWNrc1BlclpvbmUgPSAwOworCQltZGF0YS5wZGF0YS5wZzMuQWx0VHJhY2tzUGVyVm9sdW1lID0gMDsKKwkJbWRhdGEucGRhdGEucGczLlNlY3RvcnNQZXJUcmFjayA9IGNwdV90b19iZTE2KHNlY3RvcnMpOworCQltZGF0YS5wZGF0YS5wZzMuQnl0ZXNQZXJTZWN0b3IgPSBjcHVfdG9fYmUxNihJUFNfQkxLU0laRSk7CisJCW1kYXRhLnBkYXRhLnBnMy5JbnRlcmxlYXZlID0gY3B1X3RvX2JlMTYoMSk7CisJCW1kYXRhLnBkYXRhLnBnMy5UcmFja1NrZXcgPSAwOworCQltZGF0YS5wZGF0YS5wZzMuQ3lsaW5kZXJTa2V3ID0gMDsKKwkJbWRhdGEucGRhdGEucGczLmZsYWdzID0gSVBTX1NDU0lfTVAzX1NvZnRTZWN0b3I7CisJCWJyZWFrOworCisJY2FzZSAweDQ6CisJCW1kYXRhLnBkYXRhLnBnNC5QYWdlQ29kZSA9IDQ7CisJCW1kYXRhLnBkYXRhLnBnNC5QYWdlTGVuZ3RoID0gc2l6ZW9mIChJUFNfU0NTSV9NT0RFX1BBR0U0KTsKKwkJbWRhdGEuaGRyLkRhdGFMZW5ndGggPQorCQkgICAgMyArIG1kYXRhLmhkci5CbG9ja0Rlc2NMZW5ndGggKyBtZGF0YS5wZGF0YS5wZzQuUGFnZUxlbmd0aDsKKwkJbWRhdGEucGRhdGEucGc0LkN5bGluZGVyc0hpZ2ggPQorCQkgICAgY3B1X3RvX2JlMTYoKGN5bGluZGVycyA+PiA4KSAmIDB4RkZGRik7CisJCW1kYXRhLnBkYXRhLnBnNC5DeWxpbmRlcnNMb3cgPSAoY3lsaW5kZXJzICYgMHhGRik7CisJCW1kYXRhLnBkYXRhLnBnNC5IZWFkcyA9IGhlYWRzOworCQltZGF0YS5wZGF0YS5wZzQuV3JpdGVQcmVjb21wSGlnaCA9IDA7CisJCW1kYXRhLnBkYXRhLnBnNC5Xcml0ZVByZWNvbXBMb3cgPSAwOworCQltZGF0YS5wZGF0YS5wZzQuUmVkdWNlZFdyaXRlQ3VycmVudEhpZ2ggPSAwOworCQltZGF0YS5wZGF0YS5wZzQuUmVkdWNlZFdyaXRlQ3VycmVudExvdyA9IDA7CisJCW1kYXRhLnBkYXRhLnBnNC5TdGVwUmF0ZSA9IGNwdV90b19iZTE2KDEpOworCQltZGF0YS5wZGF0YS5wZzQuTGFuZGluZ1pvbmVIaWdoID0gMDsKKwkJbWRhdGEucGRhdGEucGc0LkxhbmRpbmdab25lTG93ID0gMDsKKwkJbWRhdGEucGRhdGEucGc0LmZsYWdzID0gMDsKKwkJbWRhdGEucGRhdGEucGc0LlJvdGF0aW9uYWxPZmZzZXQgPSAwOworCQltZGF0YS5wZGF0YS5wZzQuTWVkaXVtUm90YXRpb25SYXRlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDg6CisJCW1kYXRhLnBkYXRhLnBnOC5QYWdlQ29kZSA9IDg7CisJCW1kYXRhLnBkYXRhLnBnOC5QYWdlTGVuZ3RoID0gc2l6ZW9mIChJUFNfU0NTSV9NT0RFX1BBR0U4KTsKKwkJbWRhdGEuaGRyLkRhdGFMZW5ndGggPQorCQkgICAgMyArIG1kYXRhLmhkci5CbG9ja0Rlc2NMZW5ndGggKyBtZGF0YS5wZGF0YS5wZzguUGFnZUxlbmd0aDsKKwkJLyogZXZlcnl0aGluZyBlbHNlIGlzIGxlZnQgc2V0IHRvIDAgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDApOworCX0JCQkvKiBlbmQgc3dpdGNoICovCisKKwlpcHNfc2NtZF9idWZfd3JpdGUoc2NiLT5zY3NpX2NtZCwgJm1kYXRhLCBzaXplb2YgKG1kYXRhKSk7CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVxc2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNpbXVsYXRlIGEgcmVxdWVzdCBzZW5zZSBjb21tYW5kIHRvIGEgbG9naWNhbCBkcml2ZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVxc2VuKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlJUFNfU0NTSV9SRVFTRU4gcmVxc2VuOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVxc2VuIiwgMSk7CisKKwltZW1zZXQoJnJlcXNlbiwgMCwgc2l6ZW9mIChJUFNfU0NTSV9SRVFTRU4pKTsKKworCXJlcXNlbi5SZXNwb25zZUNvZGUgPQorCSAgICBJUFNfU0NTSV9SRVFTRU5fVkFMSUQgfCBJUFNfU0NTSV9SRVFTRU5fQ1VSUkVOVF9FUlI7CisJcmVxc2VuLkFkZGl0aW9uYWxMZW5ndGggPSAxMDsKKwlyZXFzZW4uQWRkaXRpb25hbFNlbnNlQ29kZSA9IElQU19TQ1NJX1JFUVNFTl9OT19TRU5TRTsKKwlyZXFzZW4uQWRkaXRpb25hbFNlbnNlQ29kZVF1YWwgPSBJUFNfU0NTSV9SRVFTRU5fTk9fU0VOU0U7CisKKwlpcHNfc2NtZF9idWZfd3JpdGUoc2NiLT5zY3NpX2NtZCwgJnJlcXNlbiwgc2l6ZW9mIChyZXFzZW4pKTsKKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRnJlZSBhbnkgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGlzIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZnJlZShpcHNfaGFfdCAqIGhhKQoreworCisJTUVUSE9EX1RSQUNFKCJpcHNfZnJlZSIsIDEpOworCisJaWYgKGhhKSB7CisJCWlmIChoYS0+ZW5xKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wY2lkZXYsIHNpemVvZihJUFNfRU5RKSwKKwkJCQkJICAgIGhhLT5lbnEsIGhhLT5lbnFfYnVzYWRkcik7CisJCQloYS0+ZW5xID0gTlVMTDsKKwkJfQorCisJCWlmIChoYS0+Y29uZikgeworCQkJa2ZyZWUoaGEtPmNvbmYpOworCQkJaGEtPmNvbmYgPSBOVUxMOworCQl9CisKKwkJaWYgKGhhLT5hZGFwdCkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGNpZGV2LAorCQkJCQkgICAgc2l6ZW9mIChJUFNfQURBUFRFUikgKworCQkJCQkgICAgc2l6ZW9mIChJUFNfSU9fQ01EKSwgaGEtPmFkYXB0LAorCQkJCQkgICAgaGEtPmFkYXB0LT5od19zdGF0dXNfc3RhcnQpOworCQkJaGEtPmFkYXB0ID0gTlVMTDsKKwkJfQorCisJCWlmIChoYS0+bG9naWNhbF9kcml2ZV9pbmZvKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wY2lkZXYsCisJCQkJCSAgICBzaXplb2YgKElQU19MRF9JTkZPKSwKKwkJCQkJICAgIGhhLT5sb2dpY2FsX2RyaXZlX2luZm8sCisJCQkJCSAgICBoYS0+bG9naWNhbF9kcml2ZV9pbmZvX2RtYV9hZGRyKTsKKwkJCWhhLT5sb2dpY2FsX2RyaXZlX2luZm8gPSBOVUxMOworCQl9CisKKwkJaWYgKGhhLT5udnJhbSkgeworCQkJa2ZyZWUoaGEtPm52cmFtKTsKKwkJCWhhLT5udnJhbSA9IE5VTEw7CisJCX0KKworCQlpZiAoaGEtPnN1YnN5cykgeworCQkJa2ZyZWUoaGEtPnN1YnN5cyk7CisJCQloYS0+c3Vic3lzID0gTlVMTDsKKwkJfQorCisJCWlmIChoYS0+aW9jdGxfZGF0YSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGNpZGV2LCBoYS0+aW9jdGxfbGVuLAorCQkJCQkgICAgaGEtPmlvY3RsX2RhdGEsIGhhLT5pb2N0bF9idXNhZGRyKTsKKwkJCWhhLT5pb2N0bF9kYXRhID0gTlVMTDsKKwkJCWhhLT5pb2N0bF9kYXRhc2l6ZSA9IDA7CisJCQloYS0+aW9jdGxfbGVuID0gMDsKKwkJfQorCQlpcHNfZGVhbGxvY2F0ZXNjYnMoaGEsIGhhLT5tYXhfY21kcyk7CisKKwkJLyogZnJlZSBtZW1vcnkgbWFwcGVkIChpZiBhcHBsaWNhYmxlKSAqLworCQlpZiAoaGEtPm1lbV9wdHIpIHsKKwkJCWlvdW5tYXAoaGEtPmlvcmVtYXBfcHRyKTsKKwkJCWhhLT5pb3JlbWFwX3B0ciA9IE5VTEw7CisJCQloYS0+bWVtX3B0ciA9IE5VTEw7CisJCX0KKworCQlpZiAoaGEtPm1lbV9hZGRyKQorCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGhhLT5tZW1fYWRkciwgaGEtPm1lbV9sZW4pOworCQloYS0+bWVtX2FkZHIgPSAwOworCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZGVhbGxvY2F0ZXNjYnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZyZWUgdGhlIGNvbW1hbmQgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZGVhbGxvY2F0ZXNjYnMoaXBzX2hhX3QgKiBoYSwgaW50IGNtZHMpCit7CisJaWYgKGhhLT5zY2JzKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwKKwkJCQkgICAgSVBTX1NHTElTVF9TSVpFKGhhKSAqIElQU19NQVhfU0cgKiBjbWRzLAorCQkJCSAgICBoYS0+c2Nicy0+c2dfbGlzdC5saXN0LAorCQkJCSAgICBoYS0+c2Nicy0+c2dfYnVzYWRkcik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBjaWRldiwgc2l6ZW9mIChpcHNfc2NiX3QpICogY21kcywKKwkJCQkgICAgaGEtPnNjYnMsIGhhLT5zY2JzLT5zY2JfYnVzYWRkcik7CisJCWhhLT5zY2JzID0gTlVMTDsKKwl9CQkJLyogZW5kIGlmICovCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19hbGxvY2F0ZXNjYnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQWxsb2NhdGUgdGhlIGNvbW1hbmQgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19hbGxvY2F0ZXNjYnMoaXBzX2hhX3QgKiBoYSkKK3sKKwlpcHNfc2NiX3QgKnNjYl9wOworCUlQU19TR19MSVNUIGlwc19zZzsKKwlpbnQgaTsKKwlkbWFfYWRkcl90IGNvbW1hbmRfZG1hLCBzZ19kbWE7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19hbGxvY2F0ZXNjYnMiLCAxKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFNDQnMgKi8KKwloYS0+c2NicyA9CisJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wY2lkZXYsIGhhLT5tYXhfY21kcyAqIHNpemVvZiAoaXBzX3NjYl90KSwKKwkJCQkgJmNvbW1hbmRfZG1hKTsKKwlpZiAoaGEtPnNjYnMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaXBzX3NnLmxpc3QgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGNpZGV2LAorCQkJCSBJUFNfU0dMSVNUX1NJWkUoaGEpICogSVBTX01BWF9TRyAqCisJCQkJIGhhLT5tYXhfY21kcywgJnNnX2RtYSk7CisJaWYgKGlwc19zZy5saXN0ID09IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGNpZGV2LAorCQkJCSAgICBoYS0+bWF4X2NtZHMgKiBzaXplb2YgKGlwc19zY2JfdCksIGhhLT5zY2JzLAorCQkJCSAgICBjb21tYW5kX2RtYSk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChoYS0+c2NicywgMCwgaGEtPm1heF9jbWRzICogc2l6ZW9mIChpcHNfc2NiX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBoYS0+bWF4X2NtZHM7IGkrKykgeworCQlzY2JfcCA9ICZoYS0+c2Nic1tpXTsKKwkJc2NiX3AtPnNjYl9idXNhZGRyID0gY29tbWFuZF9kbWEgKyBzaXplb2YgKGlwc19zY2JfdCkgKiBpOworCQkvKiBzZXQgdXAgUy9HIGxpc3QgKi8KKwkJaWYgKElQU19VU0VfRU5IX1NHTElTVChoYSkpIHsKKwkJCXNjYl9wLT5zZ19saXN0LmVuaF9saXN0ID0KKwkJCSAgICBpcHNfc2cuZW5oX2xpc3QgKyBpICogSVBTX01BWF9TRzsKKwkJCXNjYl9wLT5zZ19idXNhZGRyID0KKwkJCSAgICBzZ19kbWEgKyBJUFNfU0dMSVNUX1NJWkUoaGEpICogSVBTX01BWF9TRyAqIGk7CisJCX0gZWxzZSB7CisJCQlzY2JfcC0+c2dfbGlzdC5zdGRfbGlzdCA9CisJCQkgICAgaXBzX3NnLnN0ZF9saXN0ICsgaSAqIElQU19NQVhfU0c7CisJCQlzY2JfcC0+c2dfYnVzYWRkciA9CisJCQkgICAgc2dfZG1hICsgSVBTX1NHTElTVF9TSVpFKGhhKSAqIElQU19NQVhfU0cgKiBpOworCQl9CisKKwkJLyogYWRkIHRvIHRoZSBmcmVlIGxpc3QgKi8KKwkJaWYgKGkgPCBoYS0+bWF4X2NtZHMgLSAxKSB7CisJCQlzY2JfcC0+cV9uZXh0ID0gaGEtPnNjYl9mcmVlbGlzdDsKKwkJCWhhLT5zY2JfZnJlZWxpc3QgPSBzY2JfcDsKKwkJfQorCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaW5pdF9zY2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluaXRpYWxpemUgYSBDQ0IgdG8gZGVmYXVsdCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2luaXRfc2NiKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKwlJUFNfU0dfTElTVCBzZ19saXN0OworCXVpbnQzMl90IGNtZF9idXNhZGRyLCBzZ19idXNhZGRyOworCU1FVEhPRF9UUkFDRSgiaXBzX2luaXRfc2NiIiwgMSk7CisKKwlpZiAoc2NiID09IE5VTEwpCisJCXJldHVybjsKKworCXNnX2xpc3QubGlzdCA9IHNjYi0+c2dfbGlzdC5saXN0OworCWNtZF9idXNhZGRyID0gc2NiLT5zY2JfYnVzYWRkcjsKKwlzZ19idXNhZGRyID0gc2NiLT5zZ19idXNhZGRyOworCS8qIHplcm8gZmlsbCAqLworCW1lbXNldChzY2IsIDAsIHNpemVvZiAoaXBzX3NjYl90KSk7CisJbWVtc2V0KGhhLT5kdW1teSwgMCwgc2l6ZW9mIChJUFNfSU9fQ01EKSk7CisKKwkvKiBJbml0aWFsaXplIGR1bW15IGNvbW1hbmQgYnVja2V0ICovCisJaGEtPmR1bW15LT5vcF9jb2RlID0gMHhGRjsKKwloYS0+ZHVtbXktPmNjc2FyID0gY3B1X3RvX2xlMzIoaGEtPmFkYXB0LT5od19zdGF0dXNfc3RhcnQKKwkJCQkgICAgICAgKyBzaXplb2YgKElQU19BREFQVEVSKSk7CisJaGEtPmR1bW15LT5jb21tYW5kX2lkID0gSVBTX01BWF9DTURTOworCisJLyogc2V0IGJ1cyBhZGRyZXNzIG9mIHNjYiAqLworCXNjYi0+c2NiX2J1c2FkZHIgPSBjbWRfYnVzYWRkcjsKKwlzY2ItPnNnX2J1c2FkZHIgPSBzZ19idXNhZGRyOworCXNjYi0+c2dfbGlzdC5saXN0ID0gc2dfbGlzdC5saXN0OworCisJLyogTmVwdHVuZSBGaXggKi8KKwlzY2ItPmNtZC5iYXNpY19pby5jY2NyID0gY3B1X3RvX2xlMzIoKHVpbnQzMl90KSBJUFNfQklUX0lMRSk7CisJc2NiLT5jbWQuYmFzaWNfaW8uY2NzYXIgPSBjcHVfdG9fbGUzMihoYS0+YWRhcHQtPmh3X3N0YXR1c19zdGFydAorCQkJCQkgICAgICArIHNpemVvZiAoSVBTX0FEQVBURVIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2dldF9zY2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIGEgQ0NCIHRvIGRlZmF1bHQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFTU1VNRUQgdG8gYmUgY2FsbGxlZCBmcm9tIHdpdGhpbiBhIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcHNfc2NiX3QgKgoraXBzX2dldHNjYihpcHNfaGFfdCAqIGhhKQoreworCWlwc19zY2JfdCAqc2NiOworCisJTUVUSE9EX1RSQUNFKCJpcHNfZ2V0c2NiIiwgMSk7CisKKwlpZiAoKHNjYiA9IGhhLT5zY2JfZnJlZWxpc3QpID09IE5VTEwpIHsKKworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWhhLT5zY2JfZnJlZWxpc3QgPSBzY2ItPnFfbmV4dDsKKwlzY2ItPmZsYWdzID0gMDsKKwlzY2ItPnFfbmV4dCA9IE5VTEw7CisKKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlyZXR1cm4gKHNjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19mcmVlX3NjYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmV0dXJuIGFuIHVudXNlZCBDQ0IgYmFjayB0byB0aGUgZnJlZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBU1NVTUVEIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX2ZyZWVzY2IoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCisJTUVUSE9EX1RSQUNFKCJpcHNfZnJlZXNjYiIsIDEpOworCWlmIChzY2ItPmZsYWdzICYgSVBTX1NDQl9NQVBfU0cpCisJCXBjaV91bm1hcF9zZyhoYS0+cGNpZGV2LCBzY2ItPnNjc2lfY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCSAgICAgc2NiLT5zY3NpX2NtZC0+dXNlX3NnLCBJUFNfRE1BX0RJUihzY2IpKTsKKwllbHNlIGlmIChzY2ItPmZsYWdzICYgSVBTX1NDQl9NQVBfU0lOR0xFKQorCQlwY2lfdW5tYXBfc2luZ2xlKGhhLT5wY2lkZXYsIHNjYi0+ZGF0YV9idXNhZGRyLCBzY2ItPmRhdGFfbGVuLAorCQkJCSBJUFNfRE1BX0RJUihzY2IpKTsKKworCS8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIG5vdCBvdXIgInNwZWNpYWwiIHNjYiAqLworCWlmIChJUFNfQ09NTUFORF9JRChoYSwgc2NiKSA8IChoYS0+bWF4X2NtZHMgLSAxKSkgeworCQlzY2ItPnFfbmV4dCA9IGhhLT5zY2JfZnJlZWxpc3Q7CisJCWhhLT5zY2JfZnJlZWxpc3QgPSBzY2I7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNpbml0X2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIElzIGNvbnRyb2xsZXIgaW5pdGlhbGl6ZWQgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNpbml0X2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50OF90IHNjcHI7CisJdWludDhfdCBpc3I7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pc2luaXRfY29wcGVyaGVhZCIsIDEpOworCisJaXNyID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSKTsKKwlzY3ByID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19TQ1BSKTsKKworCWlmICgoKGlzciAmIElQU19CSVRfRUkpID09IDApICYmICgoc2NwciAmIElQU19CSVRfRUJNKSA9PSAwKSkKKwkJcmV0dXJuICgwKTsKKwllbHNlCisJCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pc2luaXRfY29wcGVyaGVhZF9tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgSXMgY29udHJvbGxlciBpbml0aWFsaXplZCA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pc2luaXRfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQ4X3QgaXNyID0gMDsKKwl1aW50OF90IHNjcHI7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pc19pbml0X2NvcHBlcmhlYWRfbWVtaW8iLCAxKTsKKworCWlzciA9IHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsKKwlzY3ByID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NDUFIpOworCisJaWYgKCgoaXNyICYgSVBTX0JJVF9FSSkgPT0gMCkgJiYgKChzY3ByICYgSVBTX0JJVF9FQk0pID09IDApKQorCQlyZXR1cm4gKDApOworCWVsc2UKKwkJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzaW5pdF9tb3JwaGV1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJcyBjb250cm9sbGVyIGluaXRpYWxpemVkID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzaW5pdF9tb3JwaGV1cyhpcHNfaGFfdCAqIGhhKQoreworCXVpbnQzMl90IHBvc3Q7CisJdWludDMyX3QgYml0czsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzX2luaXRfbW9ycGhldXMiLCAxKTsKKworCXBvc3QgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9NU0cwKTsKKwliaXRzID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19ISVIpOworCisJaWYgKHBvc3QgPT0gMCkKKwkJcmV0dXJuICgwKTsKKwllbHNlIGlmIChiaXRzICYgMHgzKQorCQlyZXR1cm4gKDApOworCWVsc2UKKwkJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2VuYWJsZV9pbnRfY29wcGVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVHVybiBvbiBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkKGlwc19oYV90ICogaGEpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkIiwgMSk7CisKKwlvdXRiKGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSLCBJUFNfQklUX0VJKTsKKwlpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0hJU1IpOwkvKkVuc3VyZSBQQ0kgUG9zdGluZyBDb21wbGV0ZXMqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZW5hYmxlX2ludF9jb3BwZXJoZWFkX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUdXJuIG9uIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19lbmFibGVfaW50X2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKiBoYSkKK3sKKwlNRVRIT0RfVFJBQ0UoImlwc19lbmFibGVfaW50X2NvcHBlcmhlYWRfbWVtaW8iLCAxKTsKKworCXdyaXRlYihJUFNfQklUX0VJLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisJcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0hJU1IpOwkvKkVuc3VyZSBQQ0kgUG9zdGluZyBDb21wbGV0ZXMqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfZW5hYmxlX2ludF9tb3JwaGV1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUdXJuIG9uIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19lbmFibGVfaW50X21vcnBoZXVzKGlwc19oYV90ICogaGEpCit7CisJdWludDMyX3QgT2ltcjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2VuYWJsZV9pbnRfbW9ycGhldXMiLCAxKTsKKworCU9pbXIgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9PSU1SKTsKKwlPaW1yICY9IH4weDA4OworCXdyaXRlbChPaW1yLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9PSU1SKTsKKwlyZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9PSU1SKTsJLypFbnN1cmUgUENJIFBvc3RpbmcgQ29tcGxldGVzKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2luaXRfY29wcGVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIGEgY29wcGVyaGVhZCBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2luaXRfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCXVpbnQ4X3QgSXNyOworCXVpbnQ4X3QgQ2JzcDsKKwl1aW50OF90IFBvc3RCeXRlW0lQU19NQVhfUE9TVF9CWVRFU107CisJdWludDhfdCBDb25maWdCeXRlW0lQU19NQVhfQ09ORklHX0JZVEVTXTsKKwlpbnQgaSwgajsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2luaXRfY29wcGVyaGVhZCIsIDEpOworCisJZm9yIChpID0gMDsgaSA8IElQU19NQVhfUE9TVF9CWVRFUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCA0NTsgaisrKSB7CisJCQlJc3IgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0hJU1IpOworCQkJaWYgKElzciAmIElQU19CSVRfR0hJKQorCQkJCWJyZWFrOworCisJCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJCU1ERUxBWShJUFNfT05FX1NFQyk7CisJCX0KKworCQlpZiAoaiA+PSA0NSkKKwkJCS8qIGVycm9yIG9jY3VycmVkICovCisJCQlyZXR1cm4gKDApOworCisJCVBvc3RCeXRlW2ldID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19JU1BSKTsKKwkJb3V0YihJc3IsIGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSKTsKKwl9CisKKwlpZiAoUG9zdEJ5dGVbMF0gPCBJUFNfR09PRF9QT1NUX1NUQVRVUykgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJyZXNldCBjb250cm9sbGVyIGZhaWxzIChwb3N0IHN0YXR1cyAleCAleCkuXG4iLAorCQkJICAgUG9zdEJ5dGVbMF0sIFBvc3RCeXRlWzFdKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBJUFNfTUFYX0NPTkZJR19CWVRFUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAyNDA7IGorKykgeworCQkJSXNyID0gaW5iKGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSKTsKKwkJCWlmIChJc3IgJiBJUFNfQklUX0dISSkKKwkJCQlicmVhazsKKworCQkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCQlNREVMQVkoSVBTX09ORV9TRUMpOworCQl9CisKKwkJaWYgKGogPj0gMjQwKQorCQkJLyogZXJyb3Igb2NjdXJyZWQgKi8KKwkJCXJldHVybiAoMCk7CisKKwkJQ29uZmlnQnl0ZVtpXSA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfSVNQUik7CisJCW91dGIoSXNyLCBoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI0MDsgaSsrKSB7CisJCUNic3AgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0NCU1ApOworCisJCWlmICgoQ2JzcCAmIElQU19CSVRfT1ApID09IDApCisJCQlicmVhazsKKworCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJTURFTEFZKElQU19PTkVfU0VDKTsKKwl9CisKKwlpZiAoaSA+PSAyNDApCisJCS8qIHJlc2V0IGZhaWxlZCAqLworCQlyZXR1cm4gKDApOworCisJLyogc2V0dXAgQ0NDUiAqLworCW91dGwoY3B1X3RvX2xlMzIoMHgxMDEwKSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0NDQ1IpOworCisJLyogRW5hYmxlIGJ1c21hc3RlcmluZyAqLworCW91dGIoSVBTX0JJVF9FQk0sIGhhLT5pb19hZGRyICsgSVBTX1JFR19TQ1BSKTsKKworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCS8qIGZpeCBmb3IgYW5hY29uZGE2NCAqLworCQlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19OREFFKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJb3V0YihJUFNfQklUX0VJLCBoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaW5pdF9jb3BwZXJoZWFkX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluaXRpYWxpemUgYSBjb3BwZXJoZWFkIGNvbnRyb2xsZXIgd2l0aCBtZW1vcnkgbWFwcGVkIEkvTyAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaW5pdF9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICogaGEpCit7CisJdWludDhfdCBJc3IgPSAwOworCXVpbnQ4X3QgQ2JzcDsKKwl1aW50OF90IFBvc3RCeXRlW0lQU19NQVhfUE9TVF9CWVRFU107CisJdWludDhfdCBDb25maWdCeXRlW0lQU19NQVhfQ09ORklHX0JZVEVTXTsKKwlpbnQgaSwgajsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2luaXRfY29wcGVyaGVhZF9tZW1pbyIsIDEpOworCisJZm9yIChpID0gMDsgaSA8IElQU19NQVhfUE9TVF9CWVRFUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCA0NTsgaisrKSB7CisJCQlJc3IgPSByZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisJCQlpZiAoSXNyICYgSVBTX0JJVF9HSEkpCisJCQkJYnJlYWs7CisKKwkJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQkJTURFTEFZKElQU19PTkVfU0VDKTsKKwkJfQorCisJCWlmIChqID49IDQ1KQorCQkJLyogZXJyb3Igb2NjdXJyZWQgKi8KKwkJCXJldHVybiAoMCk7CisKKwkJUG9zdEJ5dGVbaV0gPSByZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfSVNQUik7CisJCXdyaXRlYihJc3IsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsKKwl9CisKKwlpZiAoUG9zdEJ5dGVbMF0gPCBJUFNfR09PRF9QT1NUX1NUQVRVUykgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJyZXNldCBjb250cm9sbGVyIGZhaWxzIChwb3N0IHN0YXR1cyAleCAleCkuXG4iLAorCQkJICAgUG9zdEJ5dGVbMF0sIFBvc3RCeXRlWzFdKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBJUFNfTUFYX0NPTkZJR19CWVRFUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAyNDA7IGorKykgeworCQkJSXNyID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0hJU1IpOworCQkJaWYgKElzciAmIElQU19CSVRfR0hJKQorCQkJCWJyZWFrOworCisJCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KKwkJCU1ERUxBWShJUFNfT05FX1NFQyk7CisJCX0KKworCQlpZiAoaiA+PSAyNDApCisJCQkvKiBlcnJvciBvY2N1cnJlZCAqLworCQkJcmV0dXJuICgwKTsKKworCQlDb25maWdCeXRlW2ldID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0lTUFIpOworCQl3cml0ZWIoSXNyLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSElTUik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI0MDsgaSsrKSB7CisJCUNic3AgPSByZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfQ0JTUCk7CisKKwkJaWYgKChDYnNwICYgSVBTX0JJVF9PUCkgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCX0KKworCWlmIChpID49IDI0MCkKKwkJLyogZXJyb3Igb2NjdXJyZWQgKi8KKwkJcmV0dXJuICgwKTsKKworCS8qIHNldHVwIENDQ1IgKi8KKwl3cml0ZWwoMHgxMDEwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfQ0NDUik7CisKKwkvKiBFbmFibGUgYnVzbWFzdGVyaW5nICovCisJd3JpdGViKElQU19CSVRfRUJNLCBoYS0+bWVtX3B0ciArIElQU19SRUdfU0NQUik7CisKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkvKiBmaXggZm9yIGFuYWNvbmRhNjQgKi8KKwkJd3JpdGVsKDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19OREFFKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJd3JpdGViKElQU19CSVRfRUksIGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsKKworCS8qIGlmIHdlIGdldCBoZXJlIHRoZW4gZXZlcnl0aGluZyB3ZW50IE9LICovCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2luaXRfbW9ycGhldXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJbml0aWFsaXplIGEgbW9ycGhldXMgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2luaXRfbW9ycGhldXMoaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50MzJfdCBQb3N0OworCXVpbnQzMl90IENvbmZpZzsKKwl1aW50MzJfdCBJc3I7CisJdWludDMyX3QgT2ltcjsKKwlpbnQgaTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2luaXRfbW9ycGhldXMiLCAxKTsKKworCS8qIFdhaXQgdXAgdG8gNDUgc2VjcyBmb3IgUG9zdCAqLworCWZvciAoaSA9IDA7IGkgPCA0NTsgaSsrKSB7CisJCUlzciA9IHJlYWRsKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JMk9fSElSKTsKKworCQlpZiAoSXNyICYgSVBTX0JJVF9JOTYwX01TRzBJKQorCQkJYnJlYWs7CisKKwkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCU1ERUxBWShJUFNfT05FX1NFQyk7CisJfQorCisJaWYgKGkgPj0gNDUpIHsKKwkJLyogZXJyb3Igb2NjdXJyZWQgKi8KKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidGltZW91dCB3YWl0aW5nIGZvciBwb3N0LlxuIik7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlQb3N0ID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfTVNHMCk7CisKKwlpZiAoUG9zdCA9PSAweDRGMDApIHsJLyogSWYgRmxhc2hpbmcgdGhlIEJhdHRlcnkgUElDICAgICAgICAgKi8KKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAiRmxhc2hpbmcgQmF0dGVyeSBQSUMsIFBsZWFzZSB3YWl0IC4uLlxuIik7CisKKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCBiaXQgKi8KKwkJSXNyID0gKHVpbnQzMl90KSBJUFNfQklUX0k5NjBfTVNHMEk7CisJCXdyaXRlbChJc3IsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19JMk9fSElSKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTIwOyBpKyspIHsJLyogICAgV2FpdCBVcCB0byAyIE1pbi4gZm9yIENvbXBsZXRpb24gKi8KKwkJCVBvc3QgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9NU0cwKTsKKwkJCWlmIChQb3N0ICE9IDB4NEYwMCkKKwkJCQlicmVhazsKKwkJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQkJTURFTEFZKElQU19PTkVfU0VDKTsKKwkJfQorCisJCWlmIChpID49IDEyMCkgeworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgInRpbWVvdXQgd2FpdGluZyBmb3IgQmF0dGVyeSBQSUMgRmxhc2hcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJfQorCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCBiaXQgKi8KKwlJc3IgPSAodWludDMyX3QpIElQU19CSVRfSTk2MF9NU0cwSTsKKwl3cml0ZWwoSXNyLCBoYS0+bWVtX3B0ciArIElQU19SRUdfSTJPX0hJUik7CisKKwlpZiAoUG9zdCA8IChJUFNfR09PRF9QT1NUX1NUQVRVUyA8PCA4KSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJyZXNldCBjb250cm9sbGVyIGZhaWxzIChwb3N0IHN0YXR1cyAleCkuXG4iLCBQb3N0KTsKKworCQlyZXR1cm4gKDApOworCX0KKworCS8qIFdhaXQgdXAgdG8gMjQwIHNlY3MgZm9yIGNvbmZpZyBieXRlcyAqLworCWZvciAoaSA9IDA7IGkgPCAyNDA7IGkrKykgeworCQlJc3IgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTJPX0hJUik7CisKKwkJaWYgKElzciAmIElQU19CSVRfSTk2MF9NU0cxSSkKKwkJCWJyZWFrOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCX0KKworCWlmIChpID49IDI0MCkgeworCQkvKiBlcnJvciBvY2N1cnJlZCAqLworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGNvbmZpZy5cbiIpOworCisJCXJldHVybiAoMCk7CisJfQorCisJQ29uZmlnID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfTVNHMSk7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgYml0ICovCisJSXNyID0gKHVpbnQzMl90KSBJUFNfQklUX0k5NjBfTVNHMUk7CisJd3JpdGVsKElzciwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19ISVIpOworCisJLyogVHVybiBvbiB0aGUgaW50ZXJydXB0cyAqLworCU9pbXIgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTk2MF9PSU1SKTsKKwlPaW1yICY9IH4weDg7CisJd3JpdGVsKE9pbXIsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19JOTYwX09JTVIpOworCisJLyogaWYgd2UgZ2V0IGhlcmUgdGhlbiBldmVyeXRoaW5nIHdlbnQgT0sgKi8KKworCS8qIFNpbmNlIHdlIGRpZCBhIFJFU0VULCBhbiBFcmFzZVN0cmlwZUxvY2sgbWF5IGJlIG5lZWRlZCAqLworCWlmIChQb3N0ID09IDB4RUYxMCkgeworCQlpZiAoKENvbmZpZyA9PSAweDAwMEYpIHx8IChDb25maWcgPT0gMHgwMDA5KSkKKwkJCWhhLT5yZXF1aXJlc19lc2wgPSAxOworCX0KKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZXNldF9jb3BwZXJoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVzZXQgdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZXNldF9jb3BwZXJoZWFkKGlwc19oYV90ICogaGEpCit7CisJaW50IHJlc2V0X2NvdW50ZXI7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZXNldF9jb3BwZXJoZWFkIiwgMSk7CisKKwlERUJVR19WQVIoMSwgIiglcyVkKSBpcHNfcmVzZXRfY29wcGVyaGVhZDogaW8gYWRkcjogJXgsIGlycTogJWQiLAorCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sIGhhLT5pb19hZGRyLCBoYS0+aXJxKTsKKworCXJlc2V0X2NvdW50ZXIgPSAwOworCisJd2hpbGUgKHJlc2V0X2NvdW50ZXIgPCAyKSB7CisJCXJlc2V0X2NvdW50ZXIrKzsKKworCQlvdXRiKElQU19CSVRfUlNULCBoYS0+aW9fYWRkciArIElQU19SRUdfU0NQUik7CisKKwkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCU1ERUxBWShJUFNfT05FX1NFQyk7CisKKwkJb3V0YigwLCBoYS0+aW9fYWRkciArIElQU19SRUdfU0NQUik7CisKKwkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCU1ERUxBWShJUFNfT05FX1NFQyk7CisKKwkJaWYgKCgqaGEtPmZ1bmMuaW5pdCkgKGhhKSkKKwkJCWJyZWFrOworCQllbHNlIGlmIChyZXNldF9jb3VudGVyID49IDIpIHsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZXNldF9jb3BwZXJoZWFkX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVzZXQgdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZXNldF9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICogaGEpCit7CisJaW50IHJlc2V0X2NvdW50ZXI7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19yZXNldF9jb3BwZXJoZWFkX21lbWlvIiwgMSk7CisKKwlERUJVR19WQVIoMSwgIiglcyVkKSBpcHNfcmVzZXRfY29wcGVyaGVhZF9tZW1pbzogbWVtIGFkZHI6ICV4LCBpcnE6ICVkIiwKKwkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLCBoYS0+bWVtX2FkZHIsIGhhLT5pcnEpOworCisJcmVzZXRfY291bnRlciA9IDA7CisKKwl3aGlsZSAocmVzZXRfY291bnRlciA8IDIpIHsKKwkJcmVzZXRfY291bnRlcisrOworCisJCXdyaXRlYihJUFNfQklUX1JTVCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NDUFIpOworCisJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLworCQlNREVMQVkoSVBTX09ORV9TRUMpOworCisJCXdyaXRlYigwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfU0NQUik7CisKKwkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCisJCU1ERUxBWShJUFNfT05FX1NFQyk7CisKKwkJaWYgKCgqaGEtPmZ1bmMuaW5pdCkgKGhhKSkKKwkJCWJyZWFrOworCQllbHNlIGlmIChyZXNldF9jb3VudGVyID49IDIpIHsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19yZXNldF9tb3JwaGV1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVzZXQgdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZXNldF9tb3JwaGV1cyhpcHNfaGFfdCAqIGhhKQoreworCWludCByZXNldF9jb3VudGVyOworCXVpbnQ4X3QganVuazsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3Jlc2V0X21vcnBoZXVzIiwgMSk7CisKKwlERUJVR19WQVIoMSwgIiglcyVkKSBpcHNfcmVzZXRfbW9ycGhldXM6IG1lbSBhZGRyOiAleCwgaXJxOiAlZCIsCisJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSwgaGEtPm1lbV9hZGRyLCBoYS0+aXJxKTsKKworCXJlc2V0X2NvdW50ZXIgPSAwOworCisJd2hpbGUgKHJlc2V0X2NvdW50ZXIgPCAyKSB7CisJCXJlc2V0X2NvdW50ZXIrKzsKKworCQl3cml0ZWwoMHg4MDAwMDAwMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0k5NjBfSURSKTsKKworCQkvKiBEZWxheSBmb3IgNSBTZWNvbmRzICovCisJCU1ERUxBWSg1ICogSVBTX09ORV9TRUMpOworCisJCS8qIERvIGEgUENJIGNvbmZpZyByZWFkIHRvIHdhaXQgZm9yIGFkYXB0ZXIgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaGEtPnBjaWRldiwgNCwgJmp1bmspOworCisJCWlmICgoKmhhLT5mdW5jLmluaXQpIChoYSkpCisJCQlicmVhazsKKwkJZWxzZSBpZiAocmVzZXRfY291bnRlciA+PSAyKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc3RhdGluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluaXRpYWxpemUgdGhlIHN0YXR1cyBxdWV1ZXMgb24gdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3N0YXRpbml0KGlwc19oYV90ICogaGEpCit7CisJdWludDMyX3QgcGh5c19zdGF0dXNfc3RhcnQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19zdGF0aW5pdCIsIDEpOworCisJaGEtPmFkYXB0LT5wX3N0YXR1c19zdGFydCA9IGhhLT5hZGFwdC0+c3RhdHVzOworCWhhLT5hZGFwdC0+cF9zdGF0dXNfZW5kID0gaGEtPmFkYXB0LT5zdGF0dXMgKyBJUFNfTUFYX0NNRFM7CisJaGEtPmFkYXB0LT5wX3N0YXR1c190YWlsID0gaGEtPmFkYXB0LT5zdGF0dXM7CisKKwlwaHlzX3N0YXR1c19zdGFydCA9IGhhLT5hZGFwdC0+aHdfc3RhdHVzX3N0YXJ0OworCW91dGwoY3B1X3RvX2xlMzIocGh5c19zdGF0dXNfc3RhcnQpLCBoYS0+aW9fYWRkciArIElQU19SRUdfU1FTUik7CisJb3V0bChjcHVfdG9fbGUzMihwaHlzX3N0YXR1c19zdGFydCArIElQU19TVEFUVVNfUV9TSVpFKSwKKwkgICAgIGhhLT5pb19hZGRyICsgSVBTX1JFR19TUUVSKTsKKwlvdXRsKGNwdV90b19sZTMyKHBoeXNfc3RhdHVzX3N0YXJ0ICsgSVBTX1NUQVRVU19TSVpFKSwKKwkgICAgIGhhLT5pb19hZGRyICsgSVBTX1JFR19TUUhSKTsKKwlvdXRsKGNwdV90b19sZTMyKHBoeXNfc3RhdHVzX3N0YXJ0KSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX1NRVFIpOworCisJaGEtPmFkYXB0LT5od19zdGF0dXNfdGFpbCA9IHBoeXNfc3RhdHVzX3N0YXJ0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc3RhdGluaXRfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEluaXRpYWxpemUgdGhlIHN0YXR1cyBxdWV1ZXMgb24gdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3N0YXRpbml0X21lbWlvKGlwc19oYV90ICogaGEpCit7CisJdWludDMyX3QgcGh5c19zdGF0dXNfc3RhcnQ7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19zdGF0aW5pdF9tZW1pbyIsIDEpOworCisJaGEtPmFkYXB0LT5wX3N0YXR1c19zdGFydCA9IGhhLT5hZGFwdC0+c3RhdHVzOworCWhhLT5hZGFwdC0+cF9zdGF0dXNfZW5kID0gaGEtPmFkYXB0LT5zdGF0dXMgKyBJUFNfTUFYX0NNRFM7CisJaGEtPmFkYXB0LT5wX3N0YXR1c190YWlsID0gaGEtPmFkYXB0LT5zdGF0dXM7CisKKwlwaHlzX3N0YXR1c19zdGFydCA9IGhhLT5hZGFwdC0+aHdfc3RhdHVzX3N0YXJ0OworCXdyaXRlbChwaHlzX3N0YXR1c19zdGFydCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NRU1IpOworCXdyaXRlbChwaHlzX3N0YXR1c19zdGFydCArIElQU19TVEFUVVNfUV9TSVpFLAorCSAgICAgICBoYS0+bWVtX3B0ciArIElQU19SRUdfU1FFUik7CisJd3JpdGVsKHBoeXNfc3RhdHVzX3N0YXJ0ICsgSVBTX1NUQVRVU19TSVpFLCBoYS0+bWVtX3B0ciArIElQU19SRUdfU1FIUik7CisJd3JpdGVsKHBoeXNfc3RhdHVzX3N0YXJ0LCBoYS0+bWVtX3B0ciArIElQU19SRUdfU1FUUik7CisKKwloYS0+YWRhcHQtPmh3X3N0YXR1c190YWlsID0gcGh5c19zdGF0dXNfc3RhcnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19zdGF0dXBkX2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3RhdHVzIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MzJfdAoraXBzX3N0YXR1cGRfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCU1FVEhPRF9UUkFDRSgiaXBzX3N0YXR1cGRfY29wcGVyaGVhZCIsIDEpOworCisJaWYgKGhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCAhPSBoYS0+YWRhcHQtPnBfc3RhdHVzX2VuZCkgeworCQloYS0+YWRhcHQtPnBfc3RhdHVzX3RhaWwrKzsKKwkJaGEtPmFkYXB0LT5od19zdGF0dXNfdGFpbCArPSBzaXplb2YgKElQU19TVEFUVVMpOworCX0gZWxzZSB7CisJCWhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCA9IGhhLT5hZGFwdC0+cF9zdGF0dXNfc3RhcnQ7CisJCWhhLT5hZGFwdC0+aHdfc3RhdHVzX3RhaWwgPSBoYS0+YWRhcHQtPmh3X3N0YXR1c19zdGFydDsKKwl9CisKKwlvdXRsKGNwdV90b19sZTMyKGhhLT5hZGFwdC0+aHdfc3RhdHVzX3RhaWwpLAorCSAgICAgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX1NRVFIpOworCisJcmV0dXJuIChoYS0+YWRhcHQtPnBfc3RhdHVzX3RhaWwtPnZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3N0YXR1cGRfY29wcGVyaGVhZF9tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZW1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzdGF0dXMgcXVldWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQzMl90CitpcHNfc3RhdHVwZF9jb3BwZXJoZWFkX21lbWlvKGlwc19oYV90ICogaGEpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNfc3RhdHVwZF9jb3BwZXJoZWFkX21lbWlvIiwgMSk7CisKKwlpZiAoaGEtPmFkYXB0LT5wX3N0YXR1c190YWlsICE9IGhhLT5hZGFwdC0+cF9zdGF0dXNfZW5kKSB7CisJCWhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbCsrOworCQloYS0+YWRhcHQtPmh3X3N0YXR1c190YWlsICs9IHNpemVvZiAoSVBTX1NUQVRVUyk7CisJfSBlbHNlIHsKKwkJaGEtPmFkYXB0LT5wX3N0YXR1c190YWlsID0gaGEtPmFkYXB0LT5wX3N0YXR1c19zdGFydDsKKwkJaGEtPmFkYXB0LT5od19zdGF0dXNfdGFpbCA9IGhhLT5hZGFwdC0+aHdfc3RhdHVzX3N0YXJ0OworCX0KKworCXdyaXRlbChoYS0+YWRhcHQtPmh3X3N0YXR1c190YWlsLCBoYS0+bWVtX3B0ciArIElQU19SRUdfU1FUUik7CisKKwlyZXR1cm4gKGhhLT5hZGFwdC0+cF9zdGF0dXNfdGFpbC0+dmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfc3RhdHVwZF9tb3JwaGV1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlbW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHN0YXR1cyBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDMyX3QKK2lwc19zdGF0dXBkX21vcnBoZXVzKGlwc19oYV90ICogaGEpCit7CisJdWludDMyX3QgdmFsOworCisJTUVUSE9EX1RSQUNFKCJpcHNfc3RhdHVwZF9tb3JwaGV1cyIsIDEpOworCisJdmFsID0gcmVhZGwoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19PVVRNU0dRKTsKKworCXJldHVybiAodmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2lzc3VlX2NvcHBlcmhlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBTZW5kIGEgY29tbWFuZCBkb3duIHRvIHRoZSBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2lzc3VlX2NvcHBlcmhlYWQoaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCXVpbnQzMl90IFRpbWVPdXQ7CisJdWludDMyX3QgdmFsOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNzdWVfY29wcGVyaGVhZCIsIDEpOworCisJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2lzc3VlOiBjbWQgMHglWCBpZCAlZCAoJWQgJWQgJWQpIiwKKwkJCSAgaXBzX25hbWUsCisJCQkgIGhhLT5ob3N0X251bSwKKwkJCSAgc2NiLT5jZGJbMF0sCisJCQkgIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQsCisJCQkgIHNjYi0+YnVzLCBzY2ItPnRhcmdldF9pZCwgc2NiLT5sdW4pOworCX0gZWxzZSB7CisJCURFQlVHX1ZBUigyLCBLRVJOX05PVElDRSAiKCVzJWQpIGlwc19pc3N1ZTogbG9naWNhbCBjbWQgaWQgJWQiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLCBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkKTsKKwl9CisKKwlUaW1lT3V0ID0gMDsKKworCXdoaWxlICgodmFsID0KKwkJbGUzMl90b19jcHUoaW5sKGhhLT5pb19hZGRyICsgSVBTX1JFR19DQ0NSKSkpICYgSVBTX0JJVF9TRU0pIHsKKwkJdWRlbGF5KDEwMDApOworCisJCWlmICgrK1RpbWVPdXQgPj0gSVBTX1NFTV9USU1FT1VUKSB7CisJCQlpZiAoISh2YWwgJiBJUFNfQklUX1NUQVJUX1NUT1ApKQorCQkJCWJyZWFrOworCisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCQkgICAiaXBzX2lzc3VlIHZhbCBbMHgleF0uXG4iLCB2YWwpOworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgImlwc19pc3N1ZSBzZW1hcGhvcmUgY2hrIHRpbWVvdXQuXG4iKTsKKworCQkJcmV0dXJuIChJUFNfRkFJTFVSRSk7CisJCX0JCS8qIGVuZCBpZiAqLworCX0JCQkvKiBlbmQgd2hpbGUgKi8KKworCW91dGwoY3B1X3RvX2xlMzIoc2NiLT5zY2JfYnVzYWRkciksIGhhLT5pb19hZGRyICsgSVBTX1JFR19DQ1NBUik7CisJb3V0dyhjcHVfdG9fbGUzMihJUFNfQklUX1NUQVJUX0NNRCksIGhhLT5pb19hZGRyICsgSVBTX1JFR19DQ0NSKTsKKworCXJldHVybiAoSVBTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNzdWVfY29wcGVyaGVhZF9tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNlbmQgYSBjb21tYW5kIGRvd24gdG8gdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNzdWVfY29wcGVyaGVhZF9tZW1pbyhpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IpCit7CisJdWludDMyX3QgVGltZU91dDsKKwl1aW50MzJfdCB2YWw7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19pc3N1ZV9jb3BwZXJoZWFkX21lbWlvIiwgMSk7CisKKwlpZiAoc2NiLT5zY3NpX2NtZCkgeworCQlERUJVR19WQVIoMiwgIiglcyVkKSBpcHNfaXNzdWU6IGNtZCAweCVYIGlkICVkICglZCAlZCAlZCkiLAorCQkJICBpcHNfbmFtZSwKKwkJCSAgaGEtPmhvc3RfbnVtLAorCQkJICBzY2ItPmNkYlswXSwKKwkJCSAgc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCwKKwkJCSAgc2NiLT5idXMsIHNjYi0+dGFyZ2V0X2lkLCBzY2ItPmx1bik7CisJfSBlbHNlIHsKKwkJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2lzc3VlOiBsb2dpY2FsIGNtZCBpZCAlZCIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQpOworCX0KKworCVRpbWVPdXQgPSAwOworCisJd2hpbGUgKCh2YWwgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfQ0NDUikpICYgSVBTX0JJVF9TRU0pIHsKKwkJdWRlbGF5KDEwMDApOworCisJCWlmICgrK1RpbWVPdXQgPj0gSVBTX1NFTV9USU1FT1VUKSB7CisJCQlpZiAoISh2YWwgJiBJUFNfQklUX1NUQVJUX1NUT1ApKQorCQkJCWJyZWFrOworCisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCQkgICAiaXBzX2lzc3VlIHZhbCBbMHgleF0uXG4iLCB2YWwpOworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgImlwc19pc3N1ZSBzZW1hcGhvcmUgY2hrIHRpbWVvdXQuXG4iKTsKKworCQkJcmV0dXJuIChJUFNfRkFJTFVSRSk7CisJCX0JCS8qIGVuZCBpZiAqLworCX0JCQkvKiBlbmQgd2hpbGUgKi8KKworCXdyaXRlbChzY2ItPnNjYl9idXNhZGRyLCBoYS0+bWVtX3B0ciArIElQU19SRUdfQ0NTQVIpOworCXdyaXRlbChJUFNfQklUX1NUQVJUX0NNRCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0NDQ1IpOworCisJcmV0dXJuIChJUFNfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pc3N1ZV9pMm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgU2VuZCBhIGNvbW1hbmQgZG93biB0byB0aGUgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pc3N1ZV9pMm8oaXBzX2hhX3QgKiBoYSwgaXBzX3NjYl90ICogc2NiKQoreworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNzdWVfaTJvIiwgMSk7CisKKwlpZiAoc2NiLT5zY3NpX2NtZCkgeworCQlERUJVR19WQVIoMiwgIiglcyVkKSBpcHNfaXNzdWU6IGNtZCAweCVYIGlkICVkICglZCAlZCAlZCkiLAorCQkJICBpcHNfbmFtZSwKKwkJCSAgaGEtPmhvc3RfbnVtLAorCQkJICBzY2ItPmNkYlswXSwKKwkJCSAgc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCwKKwkJCSAgc2NiLT5idXMsIHNjYi0+dGFyZ2V0X2lkLCBzY2ItPmx1bik7CisJfSBlbHNlIHsKKwkJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2lzc3VlOiBsb2dpY2FsIGNtZCBpZCAlZCIsCisJCQkgIGlwc19uYW1lLCBoYS0+aG9zdF9udW0sIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQpOworCX0KKworCW91dGwoY3B1X3RvX2xlMzIoc2NiLT5zY2JfYnVzYWRkciksIGhhLT5pb19hZGRyICsgSVBTX1JFR19JMk9fSU5NU0dRKTsKKworCXJldHVybiAoSVBTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNzdWVfaTJvX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFNlbmQgYSBjb21tYW5kIGRvd24gdG8gdGhlIGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNzdWVfaTJvX21lbWlvKGlwc19oYV90ICogaGEsIGlwc19zY2JfdCAqIHNjYikKK3sKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzc3VlX2kyb19tZW1pbyIsIDEpOworCisJaWYgKHNjYi0+c2NzaV9jbWQpIHsKKwkJREVCVUdfVkFSKDIsICIoJXMlZCkgaXBzX2lzc3VlOiBjbWQgMHglWCBpZCAlZCAoJWQgJWQgJWQpIiwKKwkJCSAgaXBzX25hbWUsCisJCQkgIGhhLT5ob3N0X251bSwKKwkJCSAgc2NiLT5jZGJbMF0sCisJCQkgIHNjYi0+Y21kLmJhc2ljX2lvLmNvbW1hbmRfaWQsCisJCQkgIHNjYi0+YnVzLCBzY2ItPnRhcmdldF9pZCwgc2NiLT5sdW4pOworCX0gZWxzZSB7CisJCURFQlVHX1ZBUigyLCAiKCVzJWQpIGlwc19pc3N1ZTogbG9naWNhbCBjbWQgaWQgJWQiLAorCQkJICBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtLCBzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkKTsKKwl9CisKKwl3cml0ZWwoc2NiLT5zY2JfYnVzYWRkciwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0kyT19JTk1TR1EpOworCisJcmV0dXJuIChJUFNfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19pc2ludHJfY29wcGVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGVzdCB0byBzZWUgaWYgYW4gaW50ZXJydXB0IGlzIGZvciB1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19pc2ludHJfY29wcGVyaGVhZChpcHNfaGFfdCAqIGhhKQoreworCXVpbnQ4X3QgSXNyOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNpbnRyX2NvcHBlcmhlYWQiLCAyKTsKKworCUlzciA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfSElTUik7CisKKwlpZiAoSXNyID09IDB4RkYpCisJCS8qID8hPyEgTm90aGluZyByZWFsbHkgdGhlcmUgKi8KKwkJcmV0dXJuICgwKTsKKworCWlmIChJc3IgJiBJUFNfQklUX1NDRSkKKwkJcmV0dXJuICgxKTsKKwllbHNlIGlmIChJc3IgJiAoSVBTX0JJVF9TUU8gfCBJUFNfQklUX0dISSkpIHsKKwkJLyogc3RhdHVzIHF1ZXVlIG92ZXJmbG93IG9yIEdISSAqLworCQkvKiBqdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwkJb3V0YihJc3IsIGhhLT5pb19hZGRyICsgSVBTX1JFR19ISVNSKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNpbnRyX2NvcHBlcmhlYWRfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRlc3QgdG8gc2VlIGlmIGFuIGludGVycnVwdCBpcyBmb3IgdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNpbnRyX2NvcHBlcmhlYWRfbWVtaW8oaXBzX2hhX3QgKiBoYSkKK3sKKwl1aW50OF90IElzcjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2lzaW50cl9tZW1pbyIsIDIpOworCisJSXNyID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0hJU1IpOworCisJaWYgKElzciA9PSAweEZGKQorCQkvKiA/IT8hIE5vdGhpbmcgcmVhbGx5IHRoZXJlICovCisJCXJldHVybiAoMCk7CisKKwlpZiAoSXNyICYgSVBTX0JJVF9TQ0UpCisJCXJldHVybiAoMSk7CisJZWxzZSBpZiAoSXNyICYgKElQU19CSVRfU1FPIHwgSVBTX0JJVF9HSEkpKSB7CisJCS8qIHN0YXR1cyBxdWV1ZSBvdmVyZmxvdyBvciBHSEkgKi8KKwkJLyoganVzdCBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJCXdyaXRlYihJc3IsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19ISVNSKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfaXNpbnRyX21vcnBoZXVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRlc3QgdG8gc2VlIGlmIGFuIGludGVycnVwdCBpcyBmb3IgdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfaXNpbnRyX21vcnBoZXVzKGlwc19oYV90ICogaGEpCit7CisJdWludDMyX3QgSXNyOworCisJTUVUSE9EX1RSQUNFKCJpcHNfaXNpbnRyX21vcnBoZXVzIiwgMik7CisKKwlJc3IgPSByZWFkbChoYS0+bWVtX3B0ciArIElQU19SRUdfSTJPX0hJUik7CisKKwlpZiAoSXNyICYgSVBTX0JJVF9JMk9fT1BRSSkKKwkJcmV0dXJuICgxKTsKKwllbHNlCisJCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc193YWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgV2FpdCBmb3IgYSBjb21tYW5kIHRvIGNvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc193YWl0KGlwc19oYV90ICogaGEsIGludCB0aW1lLCBpbnQgaW50cikKK3sKKwlpbnQgcmV0OworCWludCBkb25lOworCisJTUVUSE9EX1RSQUNFKCJpcHNfd2FpdCIsIDEpOworCisJcmV0ID0gSVBTX0ZBSUxVUkU7CisJZG9uZSA9IEZBTFNFOworCisJdGltZSAqPSBJUFNfT05FX1NFQzsJLyogY29udmVydCBzZWNvbmRzICovCisKKwl3aGlsZSAoKHRpbWUgPiAwKSAmJiAoIWRvbmUpKSB7CisJCWlmIChpbnRyID09IElQU19JTlRSX09OKSB7CisJCQlpZiAoaGEtPndhaXRmbGFnID09IEZBTFNFKSB7CisJCQkJcmV0ID0gSVBTX1NVQ0NFU1M7CisJCQkJZG9uZSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoaW50ciA9PSBJUFNfSU5UUl9JT1JMKSB7CisJCQlpZiAoaGEtPndhaXRmbGFnID09IEZBTFNFKSB7CisJCQkJLyoKKwkJCQkgKiBjb250cm9sbGVyIGdlbmVyYXRlZCBhbiBpbnRlcnJ1cHQgdG8KKwkJCQkgKiBhY2tub3dsZWRnZSBjb21wbGV0aW9uIG9mIHRoZSBjb21tYW5kCisJCQkJICogYW5kIGlwc19pbnRyKCkgaGFzIHNlcnZpY2VkIHRoZSBpbnRlcnJ1cHQuCisJCQkJICovCisJCQkJcmV0ID0gSVBTX1NVQ0NFU1M7CisJCQkJZG9uZSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOT1RFOiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGlvX3JlcXVlc3RfbG9jayBzbworCQkJICogZXZlbiBpZiB3ZSBnZXQgYW4gaW50ZXJydXB0IGl0IHdvbid0IGdldCBzZXJ2aWNlZAorCQkJICogdW50aWwgYWZ0ZXIgd2UgZmluaXNoLgorCQkJICovCisKKwkJCSgqaGEtPmZ1bmMuaW50cikgKGhhKTsKKwkJfQorCisJCS8qIFRoaXMgbG9va3MgbGlrZSBhIHZlcnkgZXZpbCBsb29wLCBidXQgaXQgb25seSBkb2VzIHRoaXMgZHVyaW5nIHN0YXJ0LXVwICovCisJCXVkZWxheSgxMDAwKTsKKwkJdGltZS0tOworCX0KKworCXJldHVybiAocmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3dyaXRlX2RyaXZlcl9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBXcml0ZSBPUy9Ecml2ZXIgdmVyc2lvbiB0byBQYWdlIDUgb2YgdGhlIG52cmFtIG9uIHRoZSBjb250cm9sbGVyICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3dyaXRlX2RyaXZlcl9zdGF0dXMoaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJTUVUSE9EX1RSQUNFKCJpcHNfd3JpdGVfZHJpdmVyX3N0YXR1cyIsIDEpOworCisJaWYgKCFpcHNfcmVhZHdyaXRlX3BhZ2U1KGhhLCBGQUxTRSwgaW50cikpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidW5hYmxlIHRvIHJlYWQgTlZSQU0gcGFnZSA1LlxuIik7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKiBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHBhZ2UgaGFzIGEgdmFsaWQgKi8KKwkvKiBzaWduYXR1cmUgKi8KKwlpZiAobGUzMl90b19jcHUoaGEtPm52cmFtLT5zaWduYXR1cmUpICE9IElQU19OVlJBTV9QNV9TSUcpIHsKKwkJREVCVUdfVkFSKDEsCisJCQkgICIoJXMlZCkgTlZSQU0gcGFnZSA1IGhhcyBhbiBpbnZhbGlkIHNpZ25hdHVyZTogJVguIiwKKwkJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSwgaGEtPm52cmFtLT5zaWduYXR1cmUpOworCQloYS0+bnZyYW0tPnNpZ25hdHVyZSA9IElQU19OVlJBTV9QNV9TSUc7CisJfQorCisJREVCVUdfVkFSKDIsCisJCSAgIiglcyVkKSBBZCBUeXBlOiAlZCwgQWQgU2xvdDogJWQsIEJJT1M6ICVjJWMlYyVjICVjJWMlYyVjLiIsCisJCSAgaXBzX25hbWUsIGhhLT5ob3N0X251bSwgbGUxNl90b19jcHUoaGEtPm52cmFtLT5hZGFwdGVyX3R5cGUpLAorCQkgIGhhLT5udnJhbS0+YWRhcHRlcl9zbG90LCBoYS0+bnZyYW0tPmJpb3NfaGlnaFswXSwKKwkJICBoYS0+bnZyYW0tPmJpb3NfaGlnaFsxXSwgaGEtPm52cmFtLT5iaW9zX2hpZ2hbMl0sCisJCSAgaGEtPm52cmFtLT5iaW9zX2hpZ2hbM10sIGhhLT5udnJhbS0+Ymlvc19sb3dbMF0sCisJCSAgaGEtPm52cmFtLT5iaW9zX2xvd1sxXSwgaGEtPm52cmFtLT5iaW9zX2xvd1syXSwKKwkJICBoYS0+bnZyYW0tPmJpb3NfbG93WzNdKTsKKworCWlwc19nZXRfYmlvc192ZXJzaW9uKGhhLCBpbnRyKTsKKworCS8qIGNoYW5nZSB2YWx1ZXMgKGFzIG5lZWRlZCkgKi8KKwloYS0+bnZyYW0tPm9wZXJhdGluZ19zeXN0ZW0gPSBJUFNfT1NfTElOVVg7CisJaGEtPm52cmFtLT5hZGFwdGVyX3R5cGUgPSBoYS0+YWRfdHlwZTsKKwlzdHJuY3B5KChjaGFyICopIGhhLT5udnJhbS0+ZHJpdmVyX2hpZ2gsIElQU19WRVJTSU9OX0hJR0gsIDQpOworCXN0cm5jcHkoKGNoYXIgKikgaGEtPm52cmFtLT5kcml2ZXJfbG93LCBJUFNfVkVSU0lPTl9MT1csIDQpOworCXN0cm5jcHkoKGNoYXIgKikgaGEtPm52cmFtLT5iaW9zX2hpZ2gsIGhhLT5iaW9zX3ZlcnNpb24sIDQpOworCXN0cm5jcHkoKGNoYXIgKikgaGEtPm52cmFtLT5iaW9zX2xvdywgaGEtPmJpb3NfdmVyc2lvbiArIDQsIDQpOworCisJaXBzX3ZlcnNpb25fY2hlY2soaGEsIGludHIpOwkvKiBDaGVjayBCSU9TL0ZXL0RyaXZlciBWZXJzaW9ucyAqLworCisJLyogbm93IHVwZGF0ZSB0aGUgcGFnZSAqLworCWlmICghaXBzX3JlYWR3cml0ZV9wYWdlNShoYSwgVFJVRSwgaW50cikpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAidW5hYmxlIHRvIHdyaXRlIE5WUkFNIHBhZ2UgNS5cbiIpOworCisJCXJldHVybiAoMCk7CisJfQorCisJLyogSUYgTlZSQU0gUGFnZSA1IGlzIE9LLCBVc2UgaXQgZm9yIFNsb3QgTnVtYmVyIEluZm8gQmVjYXVzZSBMaW51eCBEb2Vzbid0IERvIFNsb3RzICovCisJaGEtPnNsb3RfbnVtID0gaGEtPm52cmFtLT5hZGFwdGVyX3Nsb3Q7CisKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVhZF9hZGFwdGVyX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIERvIGFuIElucXVpcnkgY29tbWFuZCB0byB0aGUgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVhZF9hZGFwdGVyX3N0YXR1cyhpcHNfaGFfdCAqIGhhLCBpbnQgaW50cikKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKwlpbnQgcmV0OworCisJTUVUSE9EX1RSQUNFKCJpcHNfcmVhZF9hZGFwdGVyX3N0YXR1cyIsIDEpOworCisJc2NiID0gJmhhLT5zY2JzW2hhLT5tYXhfY21kcyAtIDFdOworCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9FTlFVSVJZOworCisJc2NiLT5jbWQuYmFzaWNfaW8ub3BfY29kZSA9IElQU19DTURfRU5RVUlSWTsKKwlzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQuYmFzaWNfaW8uc2dfY291bnQgPSAwOworCXNjYi0+Y21kLmJhc2ljX2lvLmxiYSA9IDA7CisJc2NiLT5jbWQuYmFzaWNfaW8uc2VjdG9yX2NvdW50ID0gMDsKKwlzY2ItPmNtZC5iYXNpY19pby5sb2dfZHJ2ID0gMDsKKwlzY2ItPmRhdGFfbGVuID0gc2l6ZW9mICgqaGEtPmVucSk7CisJc2NiLT5jbWQuYmFzaWNfaW8uc2dfYWRkciA9IGhhLT5lbnFfYnVzYWRkcjsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmICgoKHJldCA9CisJICAgICAgaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsIGludHIpKSA9PSBJUFNfRkFJTFVSRSkKKwkgICAgfHwgKHJldCA9PSBJUFNfU1VDQ0VTU19JTU0pCisJICAgIHx8ICgoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA+IDEpKQorCQlyZXR1cm4gKDApOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3JlYWRfc3Vic3lzdGVtX3BhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBSZWFkIHN1YnN5c3RlbSBwYXJhbWV0ZXJzIGZyb20gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3JlYWRfc3Vic3lzdGVtX3BhcmFtZXRlcnMoaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlYWRfc3Vic3lzdGVtX3BhcmFtZXRlcnMiLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfR0VUX1NVQlNZUzsKKworCXNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPSBJUFNfQ01EX0dFVF9TVUJTWVM7CisJc2NiLT5jbWQuYmFzaWNfaW8uY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2NvdW50ID0gMDsKKwlzY2ItPmNtZC5iYXNpY19pby5sYmEgPSAwOworCXNjYi0+Y21kLmJhc2ljX2lvLnNlY3Rvcl9jb3VudCA9IDA7CisJc2NiLT5jbWQuYmFzaWNfaW8ubG9nX2RydiA9IDA7CisJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoKmhhLT5zdWJzeXMpOworCXNjYi0+Y21kLmJhc2ljX2lvLnNnX2FkZHIgPSBoYS0+aW9jdGxfYnVzYWRkcjsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmICgoKHJldCA9CisJICAgICAgaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsIGludHIpKSA9PSBJUFNfRkFJTFVSRSkKKwkgICAgfHwgKHJldCA9PSBJUFNfU1VDQ0VTU19JTU0pCisJICAgIHx8ICgoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA+IDEpKQorCQlyZXR1cm4gKDApOworCisJbWVtY3B5KGhhLT5zdWJzeXMsIGhhLT5pb2N0bF9kYXRhLCBzaXplb2YoKmhhLT5zdWJzeXMpKTsKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVhZF9jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gb24gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVhZF9jb25maWcoaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IGk7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlYWRfY29uZmlnIiwgMSk7CisKKwkvKiBzZXQgZGVmYXVsdHMgZm9yIGluaXRpYXRvciBJRHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQloYS0+Y29uZi0+aW5pdF9pZFtpXSA9IDc7CisKKwlzY2IgPSAmaGEtPnNjYnNbaGEtPm1heF9jbWRzIC0gMV07CisKKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlzY2ItPnRpbWVvdXQgPSBpcHNfY21kX3RpbWVvdXQ7CisJc2NiLT5jZGJbMF0gPSBJUFNfQ01EX1JFQURfQ09ORjsKKworCXNjYi0+Y21kLmJhc2ljX2lvLm9wX2NvZGUgPSBJUFNfQ01EX1JFQURfQ09ORjsKKwlzY2ItPmNtZC5iYXNpY19pby5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5kYXRhX2xlbiA9IHNpemVvZiAoKmhhLT5jb25mKTsKKwlzY2ItPmNtZC5iYXNpY19pby5zZ19hZGRyID0gaGEtPmlvY3RsX2J1c2FkZHI7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAoKChyZXQgPQorCSAgICAgIGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKSkgPT0gSVBTX0ZBSUxVUkUpCisJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkgeworCisJCW1lbXNldChoYS0+Y29uZiwgMCwgc2l6ZW9mIChJUFNfQ09ORikpOworCisJCS8qIHJlc2V0IGluaXRpYXRvciBJRHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWhhLT5jb25mLT5pbml0X2lkW2ldID0gNzsKKworCQkvKiBBbGxvdyBDb21wbGV0ZWQgd2l0aCBFcnJvcnMsIHNvIEpDUk0gY2FuIGFjY2VzcyB0aGUgQWRhcHRlciB0byBmaXggdGhlIHByb2JsZW1zICovCisJCWlmICgoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA9PQorCQkgICAgSVBTX0NNRF9DTVBMVF9XRVJST1IpCisJCQlyZXR1cm4gKDEpOworCisJCXJldHVybiAoMCk7CisJfQorCQorCW1lbWNweShoYS0+Y29uZiwgaGEtPmlvY3RsX2RhdGEsIHNpemVvZigqaGEtPmNvbmYpKTsKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVhZHdyaXRlX3BhZ2U1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJlYWQgbnZyYW0gcGFnZSA1IGZyb20gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcmVhZHdyaXRlX3BhZ2U1KGlwc19oYV90ICogaGEsIGludCB3cml0ZSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3JlYWR3cml0ZV9wYWdlNSIsIDEpOworCisJc2NiID0gJmhhLT5zY2JzW2hhLT5tYXhfY21kcyAtIDFdOworCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9SV19OVlJBTV9QQUdFOworCisJc2NiLT5jbWQubnZyYW0ub3BfY29kZSA9IElQU19DTURfUldfTlZSQU1fUEFHRTsKKwlzY2ItPmNtZC5udnJhbS5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQubnZyYW0ucGFnZSA9IDU7CisJc2NiLT5jbWQubnZyYW0ud3JpdGUgPSB3cml0ZTsKKwlzY2ItPmNtZC5udnJhbS5yZXNlcnZlZCA9IDA7CisJc2NiLT5jbWQubnZyYW0ucmVzZXJ2ZWQyID0gMDsKKwlzY2ItPmRhdGFfbGVuID0gc2l6ZW9mICgqaGEtPm52cmFtKTsKKwlzY2ItPmNtZC5udnJhbS5idWZmZXJfYWRkciA9IGhhLT5pb2N0bF9idXNhZGRyOworCWlmICh3cml0ZSkKKwkJbWVtY3B5KGhhLT5pb2N0bF9kYXRhLCBoYS0+bnZyYW0sIHNpemVvZigqaGEtPm52cmFtKSk7CisJCisJLyogaXNzdWUgdGhlIGNvbW1hbmQgKi8KKwlpZiAoKChyZXQgPQorCSAgICAgIGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKSkgPT0gSVBTX0ZBSUxVUkUpCisJICAgIHx8IChyZXQgPT0gSVBTX1NVQ0NFU1NfSU1NKQorCSAgICB8fCAoKHNjYi0+YmFzaWNfc3RhdHVzICYgSVBTX0dTQ19TVEFUVVNfTUFTSykgPiAxKSkgeworCisJCW1lbXNldChoYS0+bnZyYW0sIDAsIHNpemVvZiAoSVBTX05WUkFNX1A1KSk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKCF3cml0ZSkKKwkJbWVtY3B5KGhhLT5udnJhbSwgaGEtPmlvY3RsX2RhdGEsIHNpemVvZigqaGEtPm52cmFtKSk7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2NsZWFyX2FkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDbGVhciB0aGUgc3RyaXBlIGxvY2sgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX2NsZWFyX2FkYXB0ZXIoaXBzX2hhX3QgKiBoYSwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IHJldDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2NsZWFyX2FkYXB0ZXIiLCAxKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19yZXNldF90aW1lb3V0OworCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9DT05GSUdfU1lOQzsKKworCXNjYi0+Y21kLmNvbmZpZ19zeW5jLm9wX2NvZGUgPSBJUFNfQ01EX0NPTkZJR19TWU5DOworCXNjYi0+Y21kLmNvbmZpZ19zeW5jLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwlzY2ItPmNtZC5jb25maWdfc3luYy5jaGFubmVsID0gMDsKKwlzY2ItPmNtZC5jb25maWdfc3luYy5zb3VyY2VfdGFyZ2V0ID0gSVBTX1BPQ0w7CisJc2NiLT5jbWQuY29uZmlnX3N5bmMucmVzZXJ2ZWQgPSAwOworCXNjYi0+Y21kLmNvbmZpZ19zeW5jLnJlc2VydmVkMiA9IDA7CisJc2NiLT5jbWQuY29uZmlnX3N5bmMucmVzZXJ2ZWQzID0gMDsKKworCS8qIGlzc3VlIGNvbW1hbmQgKi8KKwlpZiAoKChyZXQgPQorCSAgICAgIGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX3Jlc2V0X3RpbWVvdXQsIGludHIpKSA9PSBJUFNfRkFJTFVSRSkKKwkgICAgfHwgKHJldCA9PSBJUFNfU1VDQ0VTU19JTU0pCisJICAgIHx8ICgoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA+IDEpKQorCQlyZXR1cm4gKDApOworCisJLyogc2VuZCB1bmxvY2sgc3RyaXBlIGNvbW1hbmQgKi8KKwlpcHNfaW5pdF9zY2IoaGEsIHNjYik7CisKKwlzY2ItPmNkYlswXSA9IElQU19DTURfRVJST1JfVEFCTEU7CisJc2NiLT50aW1lb3V0ID0gaXBzX3Jlc2V0X3RpbWVvdXQ7CisKKwlzY2ItPmNtZC51bmxvY2tfc3RyaXBlLm9wX2NvZGUgPSBJUFNfQ01EX0VSUk9SX1RBQkxFOworCXNjYi0+Y21kLnVubG9ja19zdHJpcGUuY29tbWFuZF9pZCA9IElQU19DT01NQU5EX0lEKGhhLCBzY2IpOworCXNjYi0+Y21kLnVubG9ja19zdHJpcGUubG9nX2RydiA9IDA7CisJc2NiLT5jbWQudW5sb2NrX3N0cmlwZS5jb250cm9sID0gSVBTX0NTTDsKKwlzY2ItPmNtZC51bmxvY2tfc3RyaXBlLnJlc2VydmVkID0gMDsKKwlzY2ItPmNtZC51bmxvY2tfc3RyaXBlLnJlc2VydmVkMiA9IDA7CisJc2NiLT5jbWQudW5sb2NrX3N0cmlwZS5yZXNlcnZlZDMgPSAwOworCisJLyogaXNzdWUgY29tbWFuZCAqLworCWlmICgoKHJldCA9CisJICAgICAgaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsIGludHIpKSA9PSBJUFNfRkFJTFVSRSkKKwkgICAgfHwgKHJldCA9PSBJUFNfU1VDQ0VTU19JTU0pCisJICAgIHx8ICgoc2NiLT5iYXNpY19zdGF0dXMgJiBJUFNfR1NDX1NUQVRVU19NQVNLKSA+IDEpKQorCQlyZXR1cm4gKDApOworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ZmZGNfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGRkRDOiB3cml0ZSByZXNldCBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19mZmRjX3Jlc2V0KGlwc19oYV90ICogaGEsIGludCBpbnRyKQoreworCWlwc19zY2JfdCAqc2NiOworCisJTUVUSE9EX1RSQUNFKCJpcHNfZmZkY19yZXNldCIsIDEpOworCisJc2NiID0gJmhhLT5zY2JzW2hhLT5tYXhfY21kcyAtIDFdOworCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9GRkRDOworCXNjYi0+Y21kLmZmZGMub3BfY29kZSA9IElQU19DTURfRkZEQzsKKwlzY2ItPmNtZC5mZmRjLmNvbW1hbmRfaWQgPSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKTsKKwlzY2ItPmNtZC5mZmRjLnJlc2V0X2NvdW50ID0gaGEtPnJlc2V0X2NvdW50OworCXNjYi0+Y21kLmZmZGMucmVzZXRfdHlwZSA9IDB4ODA7CisKKwkvKiBjb252ZXJ0IHRpbWUgdG8gd2hhdCB0aGUgY2FyZCB3YW50cyAqLworCWlwc19maXhfZmZkY190aW1lKGhhLCBzY2IsIGhhLT5sYXN0X2ZmZGMpOworCisJLyogaXNzdWUgY29tbWFuZCAqLworCWlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ZmZGNfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGRkRDOiB3cml0ZSB0aW1lIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2lwc19mZmRjX3RpbWUoaXBzX2hhX3QgKiBoYSkKK3sKKwlpcHNfc2NiX3QgKnNjYjsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2ZmZGNfdGltZSIsIDEpOworCisJREVCVUdfVkFSKDEsICIoJXMlZCkgU2VuZGluZyB0aW1lIHVwZGF0ZS4iLCBpcHNfbmFtZSwgaGEtPmhvc3RfbnVtKTsKKworCXNjYiA9ICZoYS0+c2Nic1toYS0+bWF4X2NtZHMgLSAxXTsKKworCWlwc19pbml0X3NjYihoYSwgc2NiKTsKKworCXNjYi0+dGltZW91dCA9IGlwc19jbWRfdGltZW91dDsKKwlzY2ItPmNkYlswXSA9IElQU19DTURfRkZEQzsKKwlzY2ItPmNtZC5mZmRjLm9wX2NvZGUgPSBJUFNfQ01EX0ZGREM7CisJc2NiLT5jbWQuZmZkYy5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQuZmZkYy5yZXNldF9jb3VudCA9IDA7CisJc2NiLT5jbWQuZmZkYy5yZXNldF90eXBlID0gMDsKKworCS8qIGNvbnZlcnQgdGltZSB0byB3aGF0IHRoZSBjYXJkIHdhbnRzICovCisJaXBzX2ZpeF9mZmRjX3RpbWUoaGEsIHNjYiwgaGEtPmxhc3RfZmZkYyk7CisKKwkvKiBpc3N1ZSBjb21tYW5kICovCisJaXBzX3NlbmRfd2FpdChoYSwgc2NiLCBpcHNfY21kX3RpbWVvdXQsIElQU19GRkRDKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2ZpeF9mZmRjX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQWRqdXN0IHRpbWVfdCB0byB3aGF0IHRoZSBjYXJkIHdhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfZml4X2ZmZGNfdGltZShpcHNfaGFfdCAqIGhhLCBpcHNfc2NiX3QgKiBzY2IsIHRpbWVfdCBjdXJyZW50X3RpbWUpCit7CisJbG9uZyBkYXlzOworCWxvbmcgcmVtOworCWludCBpOworCWludCB5ZWFyOworCWludCB5bGVhcDsKKwlpbnQgeWVhcl9sZW5ndGhzWzJdID0geyBJUFNfREFZU19OT1JNQUxfWUVBUiwgSVBTX0RBWVNfTEVBUF9ZRUFSIH07CisJaW50IG1vbnRoX2xlbmd0aHNbMTJdWzJdID0geyB7MzEsIDMxfSwKKwl7MjgsIDI5fSwKKwl7MzEsIDMxfSwKKwl7MzAsIDMwfSwKKwl7MzEsIDMxfSwKKwl7MzAsIDMwfSwKKwl7MzEsIDMxfSwKKwl7MzEsIDMxfSwKKwl7MzAsIDMwfSwKKwl7MzEsIDMxfSwKKwl7MzAsIDMwfSwKKwl7MzEsIDMxfQorCX07CisKKwlNRVRIT0RfVFJBQ0UoImlwc19maXhfZmZkY190aW1lIiwgMSk7CisKKwlkYXlzID0gY3VycmVudF90aW1lIC8gSVBTX1NFQ1NfREFZOworCXJlbSA9IGN1cnJlbnRfdGltZSAlIElQU19TRUNTX0RBWTsKKworCXNjYi0+Y21kLmZmZGMuaG91ciA9IChyZW0gLyBJUFNfU0VDU19IT1VSKTsKKwlyZW0gPSByZW0gJSBJUFNfU0VDU19IT1VSOworCXNjYi0+Y21kLmZmZGMubWludXRlID0gKHJlbSAvIElQU19TRUNTX01JTik7CisJc2NiLT5jbWQuZmZkYy5zZWNvbmQgPSAocmVtICUgSVBTX1NFQ1NfTUlOKTsKKworCXllYXIgPSBJUFNfRVBPQ0hfWUVBUjsKKwl3aGlsZSAoZGF5cyA8IDAgfHwgZGF5cyA+PSB5ZWFyX2xlbmd0aHNbeWxlYXAgPSBJUFNfSVNfTEVBUF9ZRUFSKHllYXIpXSkgeworCQlpbnQgbmV3eTsKKworCQluZXd5ID0geWVhciArIChkYXlzIC8gSVBTX0RBWVNfTk9STUFMX1lFQVIpOworCQlpZiAoZGF5cyA8IDApCisJCQktLW5ld3k7CisJCWRheXMgLT0gKG5ld3kgLSB5ZWFyKSAqIElQU19EQVlTX05PUk1BTF9ZRUFSICsKKwkJICAgIElQU19OVU1fTEVBUF9ZRUFSU19USFJPVUdIKG5ld3kgLSAxKSAtCisJCSAgICBJUFNfTlVNX0xFQVBfWUVBUlNfVEhST1VHSCh5ZWFyIC0gMSk7CisJCXllYXIgPSBuZXd5OworCX0KKworCXNjYi0+Y21kLmZmZGMueWVhckggPSB5ZWFyIC8gMTAwOworCXNjYi0+Y21kLmZmZGMueWVhckwgPSB5ZWFyICUgMTAwOworCisJZm9yIChpID0gMDsgZGF5cyA+PSBtb250aF9sZW5ndGhzW2ldW3lsZWFwXTsgKytpKQorCQlkYXlzIC09IG1vbnRoX2xlbmd0aHNbaV1beWxlYXBdOworCisJc2NiLT5jbWQuZmZkYy5tb250aCA9IGkgKyAxOworCXNjYi0+Y21kLmZmZGMuZGF5ID0gZGF5cyArIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCSU9TIEZsYXNoIFJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19lcmFzZV9iaW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEVyYXNlIHRoZSBCSU9TIG9uIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfZXJhc2VfYmlvcyhpcHNfaGFfdCAqIGhhKQoreworCWludCB0aW1lb3V0OworCXVpbnQ4X3Qgc3RhdHVzID0gMDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2VyYXNlX2Jpb3MiLCAxKTsKKworCXN0YXR1cyA9IDA7CisKKwkvKiBDbGVhciB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCW91dGIoMHg1MCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBFcmFzZSBTZXR1cCAqLworCW91dGIoMHgyMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBFcmFzZSBDb25maXJtICovCisJb3V0YigweEQwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCS8qIEVyYXNlIFN0YXR1cyAqLworCW91dGIoMHg3MCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwl0aW1lb3V0ID0gODAwMDA7CS8qIDgwIHNlY29uZHMgKi8KKworCXdoaWxlICh0aW1lb3V0ID4gMCkgeworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KSB7CisJCQlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisJCX0KKworCQlzdGF0dXMgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCisJCWlmIChzdGF0dXMgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJTURFTEFZKDEpOworCQl0aW1lb3V0LS07CisJfQorCisJLyogY2hlY2sgZm9yIHRpbWVvdXQgKi8KKwlpZiAodGltZW91dCA8PSAwKSB7CisJCS8qIHRpbWVvdXQgKi8KKworCQkvKiB0cnkgdG8gc3VzcGVuZCB0aGUgZXJhc2UgKi8KKwkJb3V0YigweEIwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCS8qIHdhaXQgZm9yIDEwIHNlY29uZHMgKi8KKwkJdGltZW91dCA9IDEwMDAwOworCQl3aGlsZSAodGltZW91dCA+IDApIHsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpIHsKKwkJCQlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCQkJfQorCisJCQlzdGF0dXMgPSBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQlpZiAoc3RhdHVzICYgMHhDMCkKKwkJCQlicmVhazsKKworCQkJTURFTEFZKDEpOworCQkJdGltZW91dC0tOworCQl9CisKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgVlBQICovCisJaWYgKHN0YXR1cyAmIDB4MDgpCisJCS8qIFZQUCBmYWlsdXJlICovCisJCXJldHVybiAoMSk7CisKKwkvKiBjaGVjayBmb3Igc3VjY2VzZnVsIGZsYXNoICovCisJaWYgKHN0YXR1cyAmIDB4MzApCisJCS8qIHNlcXVlbmNlIGVycm9yICovCisJCXJldHVybiAoMSk7CisKKwkvKiBPdGhlcndpc2UsIHdlIHdlcmUgc3VjY2Vzc2Z1bCAqLworCS8qIGNsZWFyIHN0YXR1cyAqLworCW91dGIoMHg1MCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkvKiBlbmFibGUgcmVhZHMgKi8KKwlvdXRiKDB4RkYsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2VyYXNlX2Jpb3NfbWVtaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRXJhc2UgdGhlIEJJT1Mgb24gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19lcmFzZV9iaW9zX21lbWlvKGlwc19oYV90ICogaGEpCit7CisJaW50IHRpbWVvdXQ7CisJdWludDhfdCBzdGF0dXM7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19lcmFzZV9iaW9zX21lbWlvIiwgMSk7CisKKwlzdGF0dXMgPSAwOworCisJLyogQ2xlYXIgdGhlIHN0YXR1cyByZWdpc3RlciAqLworCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCXdyaXRlYigweDUwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCS8qIEVyYXNlIFNldHVwICovCisJd3JpdGViKDB4MjAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJLyogRXJhc2UgQ29uZmlybSAqLworCXdyaXRlYigweEQwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCS8qIEVyYXNlIFN0YXR1cyAqLworCXdyaXRlYigweDcwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCXRpbWVvdXQgPSA4MDAwMDsJLyogODAgc2Vjb25kcyAqLworCisJd2hpbGUgKHRpbWVvdXQgPiAwKSB7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpIHsKKwkJCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCQl9CisKKwkJc3RhdHVzID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCisJCWlmIChzdGF0dXMgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJTURFTEFZKDEpOworCQl0aW1lb3V0LS07CisJfQorCisJLyogY2hlY2sgZm9yIHRpbWVvdXQgKi8KKwlpZiAodGltZW91dCA8PSAwKSB7CisJCS8qIHRpbWVvdXQgKi8KKworCQkvKiB0cnkgdG8gc3VzcGVuZCB0aGUgZXJhc2UgKi8KKwkJd3JpdGViKDB4QjAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJLyogd2FpdCBmb3IgMTAgc2Vjb25kcyAqLworCQl0aW1lb3V0ID0gMTAwMDA7CisJCXdoaWxlICh0aW1lb3V0ID4gMCkgeworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkgeworCQkJCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwkJCX0KKworCQkJc3RhdHVzID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQlpZiAoc3RhdHVzICYgMHhDMCkKKwkJCQlicmVhazsKKworCQkJTURFTEFZKDEpOworCQkJdGltZW91dC0tOworCQl9CisKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgVlBQICovCisJaWYgKHN0YXR1cyAmIDB4MDgpCisJCS8qIFZQUCBmYWlsdXJlICovCisJCXJldHVybiAoMSk7CisKKwkvKiBjaGVjayBmb3Igc3VjY2VzZnVsIGZsYXNoICovCisJaWYgKHN0YXR1cyAmIDB4MzApCisJCS8qIHNlcXVlbmNlIGVycm9yICovCisJCXJldHVybiAoMSk7CisKKwkvKiBPdGhlcndpc2UsIHdlIHdlcmUgc3VjY2Vzc2Z1bCAqLworCS8qIGNsZWFyIHN0YXR1cyAqLworCXdyaXRlYigweDUwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCS8qIGVuYWJsZSByZWFkcyAqLworCXdyaXRlYigweEZGLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19wcm9ncmFtX2Jpb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFByb2dyYW0gdGhlIEJJT1Mgb24gdGhlIGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfcHJvZ3JhbV9iaW9zKGlwc19oYV90ICogaGEsIGNoYXIgKmJ1ZmZlciwgdWludDMyX3QgYnVmZmVyc2l6ZSwKKwkJIHVpbnQzMl90IG9mZnNldCkKK3sKKwlpbnQgaTsKKwlpbnQgdGltZW91dDsKKwl1aW50OF90IHN0YXR1cyA9IDA7CisKKwlNRVRIT0RfVFJBQ0UoImlwc19wcm9ncmFtX2Jpb3MiLCAxKTsKKworCXN0YXR1cyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmZmVyc2l6ZTsgaSsrKSB7CisJCS8qIHdyaXRlIGEgYnl0ZSAqLworCQlvdXRsKGNwdV90b19sZTMyKGkgKyBvZmZzZXQpLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCW91dGIoMHg0MCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQlvdXRiKGJ1ZmZlcltpXSwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkvKiB3YWl0IHVwIHRvIG9uZSBzZWNvbmQgKi8KKwkJdGltZW91dCA9IDEwMDA7CisJCXdoaWxlICh0aW1lb3V0ID4gMCkgeworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkgeworCQkJCW91dGwoMCwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMQVApOworCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisJCQl9CisKKwkJCXN0YXR1cyA9IGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisKKwkJCWlmIChzdGF0dXMgJiAweDgwKQorCQkJCWJyZWFrOworCisJCQlNREVMQVkoMSk7CisJCQl0aW1lb3V0LS07CisJCX0KKworCQlpZiAodGltZW91dCA9PSAwKSB7CisJCQkvKiB0aW1lb3V0IGVycm9yICovCisJCQlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJb3V0YigweEZGLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCXJldHVybiAoMSk7CisJCX0KKworCQkvKiBjaGVjayB0aGUgc3RhdHVzICovCisJCWlmIChzdGF0dXMgJiAweDE4KSB7CisJCQkvKiBwcm9ncmFtbWluZyBlcnJvciAqLworCQkJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJCW91dGIoMHhGRiwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQlyZXR1cm4gKDEpOworCQl9CisJfQkJCS8qIGVuZCBmb3IgKi8KKworCS8qIEVuYWJsZSByZWFkaW5nICovCisJb3V0bCgwLCBoYS0+aW9fYWRkciArIElQU19SRUdfRkxBUCk7CisJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCW91dGIoMHhGRiwgaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcHJvZ3JhbV9iaW9zX21lbWlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQcm9ncmFtIHRoZSBCSU9TIG9uIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXBzX3Byb2dyYW1fYmlvc19tZW1pbyhpcHNfaGFfdCAqIGhhLCBjaGFyICpidWZmZXIsIHVpbnQzMl90IGJ1ZmZlcnNpemUsCisJCSAgICAgICB1aW50MzJfdCBvZmZzZXQpCit7CisJaW50IGk7CisJaW50IHRpbWVvdXQ7CisJdWludDhfdCBzdGF0dXMgPSAwOworCisJTUVUSE9EX1RSQUNFKCJpcHNfcHJvZ3JhbV9iaW9zX21lbWlvIiwgMSk7CisKKwlzdGF0dXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlcnNpemU7IGkrKykgeworCQkvKiB3cml0ZSBhIGJ5dGUgKi8KKwkJd3JpdGVsKGkgKyBvZmZzZXQsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJd3JpdGViKDB4NDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJd3JpdGViKGJ1ZmZlcltpXSwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCQlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkvKiB3YWl0IHVwIHRvIG9uZSBzZWNvbmQgKi8KKwkJdGltZW91dCA9IDEwMDA7CisJCXdoaWxlICh0aW1lb3V0ID4gMCkgeworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkgeworCQkJCXdyaXRlbCgwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfRkxBUCk7CisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKwkJCX0KKworCQkJc3RhdHVzID0gcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCisJCQlpZiAoc3RhdHVzICYgMHg4MCkKKwkJCQlicmVhazsKKworCQkJTURFTEFZKDEpOworCQkJdGltZW91dC0tOworCQl9CisKKwkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJLyogdGltZW91dCBlcnJvciAqLworCQkJd3JpdGVsKDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJd3JpdGViKDB4RkYsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwkJCWlmIChoYS0+cmV2aXNpb25faWQgPT0gSVBTX1JFVklEX1RST01CT05FNjQpCisJCQkJdWRlbGF5KDI1KTsJLyogMjUgdXMgKi8KKworCQkJcmV0dXJuICgxKTsKKwkJfQorCisJCS8qIGNoZWNrIHRoZSBzdGF0dXMgKi8KKwkJaWYgKHN0YXR1cyAmIDB4MTgpIHsKKwkJCS8qIHByb2dyYW1taW5nIGVycm9yICovCisJCQl3cml0ZWwoMCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMQVApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQl3cml0ZWIoMHhGRiwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCQkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJCQlyZXR1cm4gKDEpOworCQl9CisJfQkJCS8qIGVuZCBmb3IgKi8KKworCS8qIEVuYWJsZSByZWFkaW5nICovCisJd3JpdGVsKDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJd3JpdGViKDB4RkYsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3ZlcmlmeV9iaW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVmVyaWZ5IHRoZSBCSU9TIG9uIHRoZSBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc192ZXJpZnlfYmlvcyhpcHNfaGFfdCAqIGhhLCBjaGFyICpidWZmZXIsIHVpbnQzMl90IGJ1ZmZlcnNpemUsCisJCXVpbnQzMl90IG9mZnNldCkKK3sKKwl1aW50OF90IGNoZWNrc3VtOworCWludCBpOworCisJTUVUSE9EX1RSQUNFKCJpcHNfdmVyaWZ5X2Jpb3MiLCAxKTsKKworCS8qIHRlc3QgMXN0IGJ5dGUgKi8KKwlvdXRsKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJaWYgKGluYihoYS0+aW9fYWRkciArIElQU19SRUdfRkxEUCkgIT0gMHg1NSkKKwkJcmV0dXJuICgxKTsKKworCW91dGwoY3B1X3RvX2xlMzIoMSksIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCWlmIChpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApICE9IDB4QUEpCisJCXJldHVybiAoMSk7CisKKwljaGVja3N1bSA9IDB4ZmY7CisJZm9yIChpID0gMjsgaSA8IGJ1ZmZlcnNpemU7IGkrKykgeworCisJCW91dGwoY3B1X3RvX2xlMzIoaSArIG9mZnNldCksIGhhLT5pb19hZGRyICsgSVBTX1JFR19GTEFQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJY2hlY2tzdW0gPSAodWludDhfdCkgY2hlY2tzdW0gKyBpbmIoaGEtPmlvX2FkZHIgKyBJUFNfUkVHX0ZMRFApOworCX0KKworCWlmIChjaGVja3N1bSAhPSAwKQorCQkvKiBmYWlsdXJlICovCisJCXJldHVybiAoMSk7CisJZWxzZQorCQkvKiBzdWNjZXNzICovCisJCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc192ZXJpZnlfYmlvc19tZW1pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFZlcmlmeSB0aGUgQklPUyBvbiB0aGUgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfdmVyaWZ5X2Jpb3NfbWVtaW8oaXBzX2hhX3QgKiBoYSwgY2hhciAqYnVmZmVyLCB1aW50MzJfdCBidWZmZXJzaXplLAorCQkgICAgICB1aW50MzJfdCBvZmZzZXQpCit7CisJdWludDhfdCBjaGVja3N1bTsKKwlpbnQgaTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3ZlcmlmeV9iaW9zX21lbWlvIiwgMSk7CisKKwkvKiB0ZXN0IDFzdCBieXRlICovCisJd3JpdGVsKDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCisJaWYgKHJlYWRiKGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTERQKSAhPSAweDU1KQorCQlyZXR1cm4gKDEpOworCisJd3JpdGVsKDEsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwlpZiAoaGEtPnJldmlzaW9uX2lkID09IElQU19SRVZJRF9UUk9NQk9ORTY0KQorCQl1ZGVsYXkoMjUpOwkvKiAyNSB1cyAqLworCWlmIChyZWFkYihoYS0+bWVtX3B0ciArIElQU19SRUdfRkxEUCkgIT0gMHhBQSkKKwkJcmV0dXJuICgxKTsKKworCWNoZWNrc3VtID0gMHhmZjsKKwlmb3IgKGkgPSAyOyBpIDwgYnVmZmVyc2l6ZTsgaSsrKSB7CisKKwkJd3JpdGVsKGkgKyBvZmZzZXQsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19GTEFQKTsKKwkJaWYgKGhhLT5yZXZpc2lvbl9pZCA9PSBJUFNfUkVWSURfVFJPTUJPTkU2NCkKKwkJCXVkZWxheSgyNSk7CS8qIDI1IHVzICovCisKKwkJY2hlY2tzdW0gPQorCQkgICAgKHVpbnQ4X3QpIGNoZWNrc3VtICsgcmVhZGIoaGEtPm1lbV9wdHIgKyBJUFNfUkVHX0ZMRFApOworCX0KKworCWlmIChjaGVja3N1bSAhPSAwKQorCQkvKiBmYWlsdXJlICovCisJCXJldHVybiAoMSk7CisJZWxzZQorCQkvKiBzdWNjZXNzICovCisJCXJldHVybiAoMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgUm91dGluZSBOYW1lOiBpcHNfdmVyc2lvbl9jaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRGVwZW5kZW5jaWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBBc3N1bWVzIHRoYXQgaXBzX3JlYWRfYWRhcHRlcl9zdGF0dXMoKSBpcyBjYWxsZWQgZmlyc3QgZmlsbGluZyBpbiAgICAgKi8KKy8qICAgICB0aGUgZGF0YSBmb3IgU3ViU3lzdGVtIFBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBDYWxsZWQgZnJvbSBpcHNfd3JpdGVfZHJpdmVyX3N0YXR1cygpIHNvIGl0IGFsc28gYXNzdW1lcyBOVlJBTSBQYWdlIDUgKi8KKy8qICAgICBEYXRhIGlzIGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitpcHNfdmVyc2lvbl9jaGVjayhpcHNfaGFfdCAqIGhhLCBpbnQgaW50cikKK3sKKwlJUFNfVkVSU0lPTl9EQVRBICpWZXJzaW9uSW5mbzsKKwl1aW50OF90IEZpcm13YXJlVmVyc2lvbltJUFNfQ09NUEFUX0lEX0xFTkdUSCArIDFdOworCXVpbnQ4X3QgQmlvc1ZlcnNpb25bSVBTX0NPTVBBVF9JRF9MRU5HVEggKyAxXTsKKwlpbnQgTWF0Y2hFcnJvcjsKKwlpbnQgcmM7CisJY2hhciBCaW9zU3RyaW5nWzEwXTsKKwljaGFyIEZpcm13YXJlU3RyaW5nWzEwXTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX3ZlcnNpb25fY2hlY2siLCAxKTsKKworCVZlcnNpb25JbmZvID0gKCBJUFNfVkVSU0lPTl9EQVRBICogKSBoYS0+aW9jdGxfZGF0YTsKKworCW1lbXNldChGaXJtd2FyZVZlcnNpb24sIDAsIElQU19DT01QQVRfSURfTEVOR1RIICsgMSk7CisJbWVtc2V0KEJpb3NWZXJzaW9uLCAwLCBJUFNfQ09NUEFUX0lEX0xFTkdUSCArIDEpOworCisJLyogR2V0IHRoZSBDb21wYXRpYmxlIEJJT1MgVmVyc2lvbiBmcm9tIE5WUkFNIFBhZ2UgNSAqLworCW1lbWNweShCaW9zVmVyc2lvbiwgaGEtPm52cmFtLT5CaW9zQ29tcGF0aWJpbGl0eUlELAorCSAgICAgICBJUFNfQ09NUEFUX0lEX0xFTkdUSCk7CisKKwlyYyA9IElQU19GQUlMVVJFOworCWlmIChoYS0+c3Vic3lzLT5wYXJhbVs0XSAmIElQU19HRVRfVkVSU0lPTl9TVVBQT1JUKSB7CS8qIElmIFZlcnNpb25pbmcgaXMgU3VwcG9ydGVkICovCisJCS8qIEdldCB0aGUgVmVyc2lvbiBJbmZvIHdpdGggYSBHZXQgVmVyc2lvbiBDb21tYW5kICovCisJCW1lbXNldCggVmVyc2lvbkluZm8sIDAsIHNpemVvZiAoSVBTX1ZFUlNJT05fREFUQSkpOworCQlyYyA9IGlwc19nZXRfdmVyc2lvbl9pbmZvKGhhLCBoYS0+aW9jdGxfYnVzYWRkciwgaW50cik7CisJCWlmIChyYyA9PSBJUFNfU1VDQ0VTUykKKwkJCW1lbWNweShGaXJtd2FyZVZlcnNpb24sIFZlcnNpb25JbmZvLT5jb21wYXRpYmlsaXR5SWQsCisJCQkgICAgICAgSVBTX0NPTVBBVF9JRF9MRU5HVEgpOworCX0KKworCWlmIChyYyAhPSBJUFNfU1VDQ0VTUykgewkvKiBJZiBEYXRhIE5vdCBPYnRhaW5hYmxlIGZyb20gYSBHZXRWZXJzaW9uIENvbW1hbmQgKi8KKwkJLyogR2V0IHRoZSBGaXJtd2FyZSBWZXJzaW9uIGZyb20gRW5xdWlyeSBEYXRhICovCisJCW1lbWNweShGaXJtd2FyZVZlcnNpb24sIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uLAorCQkgICAgICAgSVBTX0NPTVBBVF9JRF9MRU5HVEgpOworCX0KKworCS8qIHByaW50ayhLRVJOX1dBUk5JTkcgIkFkYXB0ZXIncyBCSU9TIFZlcnNpb24gID0gJXNcbiIsIEJpb3NWZXJzaW9uKTsgICAgICAgICAgKi8KKwkvKiBwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIENvbXBhdGlibGUgVmVyc2lvbiA9ICVzXG4iLCBJUFNfQ09NUEFUX0JJT1MpOyAgICAgICovCisJLyogcHJpbnRrKEtFUk5fV0FSTklORyAiQWRhcHRlcidzIEZpcm13YXJlIFZlcnNpb24gID0gJXNcbiIsIEZpcm13YXJlVmVyc2lvbik7ICAqLworCS8qIHByaW50ayhLRVJOX1dBUk5JTkcgIkZpcm13YXJlIENvbXBhdGlibGUgVmVyc2lvbiA9ICVzIFxuIiwgQ29tcGF0YWJsZVsgaGEtPm52cmFtLT5hZGFwdGVyX3R5cGUgXSk7ICovCisKKwlNYXRjaEVycm9yID0gMDsKKworCWlmIChzdHJuY21wCisJICAgIChGaXJtd2FyZVZlcnNpb24sIENvbXBhdGFibGVbaGEtPm52cmFtLT5hZGFwdGVyX3R5cGVdLAorCSAgICAgSVBTX0NPTVBBVF9JRF9MRU5HVEgpICE9IDApCisJCU1hdGNoRXJyb3IgPSAxOworCisJaWYgKHN0cm5jbXAoQmlvc1ZlcnNpb24sIElQU19DT01QQVRfQklPUywgSVBTX0NPTVBBVF9JRF9MRU5HVEgpICE9IDApCisJCU1hdGNoRXJyb3IgPSAxOworCisJaGEtPm52cmFtLT52ZXJzaW9uaW5nID0gMTsJLyogSW5kaWNhdGUgdGhlIERyaXZlciBTdXBwb3J0cyBWZXJzaW9uaW5nICovCisKKwlpZiAoTWF0Y2hFcnJvcikgeworCQloYS0+bnZyYW0tPnZlcnNpb25fbWlzbWF0Y2ggPSAxOworCQlpZiAoaXBzX2NkX2Jvb3QgPT0gMCkgeworCQkJc3RybmNweSgmQmlvc1N0cmluZ1swXSwgaGEtPm52cmFtLT5iaW9zX2hpZ2gsIDQpOworCQkJc3RybmNweSgmQmlvc1N0cmluZ1s0XSwgaGEtPm52cmFtLT5iaW9zX2xvdywgNCk7CisJCQlCaW9zU3RyaW5nWzhdID0gMDsKKworCQkJc3RybmNweSgmRmlybXdhcmVTdHJpbmdbMF0sIGhhLT5lbnEtPkNvZGVCbGtWZXJzaW9uLCA4KTsKKwkJCUZpcm13YXJlU3RyaW5nWzhdID0gMDsKKworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgIldhcm5pbmcgISAhICEgU2VydmVSQUlEIFZlcnNpb24gTWlzbWF0Y2hcbiIpOworCQkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkJICAgIkJpb3MgPSAlcywgRmlybXdhcmUgPSAlcywgRGV2aWNlIERyaXZlciA9ICVzJXNcbiIsCisJCQkJICAgQmlvc1N0cmluZywgRmlybXdhcmVTdHJpbmcsIElQU19WRVJTSU9OX0hJR0gsCisJCQkJICAgSVBTX1ZFUlNJT05fTE9XKTsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJCSAgICJUaGVzZSBsZXZlbHMgc2hvdWxkIG1hdGNoIHRvIGF2b2lkIHBvc3NpYmxlIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCWhhLT5udnJhbS0+dmVyc2lvbl9taXNtYXRjaCA9IDA7CisJfQorCisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgIFJvdXRpbmUgTmFtZTogaXBzX2dldF92ZXJzaW9uX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgSXNzdWUgYW4gaW50ZXJuYWwgR0VUVkVSU0lPTiBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgMCBpZiBTdWNjZXNzZnVsLCBlbHNlIG5vbi16ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50CitpcHNfZ2V0X3ZlcnNpb25faW5mbyhpcHNfaGFfdCAqIGhhLCBkbWFfYWRkcl90IEJ1ZmZlciwgaW50IGludHIpCit7CisJaXBzX3NjYl90ICpzY2I7CisJaW50IHJjOworCisJTUVUSE9EX1RSQUNFKCJpcHNfZ2V0X3ZlcnNpb25faW5mbyIsIDEpOworCisJc2NiID0gJmhhLT5zY2JzW2hhLT5tYXhfY21kcyAtIDFdOworCisJaXBzX2luaXRfc2NiKGhhLCBzY2IpOworCisJc2NiLT50aW1lb3V0ID0gaXBzX2NtZF90aW1lb3V0OworCXNjYi0+Y2RiWzBdID0gSVBTX0NNRF9HRVRfVkVSU0lPTl9JTkZPOworCXNjYi0+Y21kLnZlcnNpb25faW5mby5vcF9jb2RlID0gSVBTX0NNRF9HRVRfVkVSU0lPTl9JTkZPOworCXNjYi0+Y21kLnZlcnNpb25faW5mby5jb21tYW5kX2lkID0gSVBTX0NPTU1BTkRfSUQoaGEsIHNjYik7CisJc2NiLT5jbWQudmVyc2lvbl9pbmZvLnJlc2VydmVkID0gMDsKKwlzY2ItPmNtZC52ZXJzaW9uX2luZm8uY291bnQgPSBzaXplb2YgKElQU19WRVJTSU9OX0RBVEEpOworCXNjYi0+Y21kLnZlcnNpb25faW5mby5yZXNlcnZlZDIgPSAwOworCXNjYi0+ZGF0YV9sZW4gPSBzaXplb2YgKElQU19WRVJTSU9OX0RBVEEpOworCXNjYi0+ZGF0YV9idXNhZGRyID0gQnVmZmVyOworCXNjYi0+Y21kLnZlcnNpb25faW5mby5idWZmZXJfYWRkciA9IEJ1ZmZlcjsKKwlzY2ItPmZsYWdzID0gMDsKKworCS8qIGlzc3VlIGNvbW1hbmQgKi8KKwlyYyA9IGlwc19zZW5kX3dhaXQoaGEsIHNjYiwgaXBzX2NtZF90aW1lb3V0LCBpbnRyKTsKKwlyZXR1cm4gKHJjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX2Fib3J0X2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgY2xlYW51cCByb3V0aW5lIGZvciBhIGZhaWxlZCBhZGFwdGVyIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitpcHNfYWJvcnRfaW5pdChpcHNfaGFfdCAqIGhhLCBpbnQgaW5kZXgpCit7CisJaGEtPmFjdGl2ZSA9IDA7CisJaXBzX2ZyZWUoaGEpOworCWlwc19oYVtpbmRleF0gPSBOVUxMOworCWlwc19zaFtpbmRleF0gPSBOVUxMOworCXJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgTmFtZTogaXBzX3NoaWZ0X2NvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgaGVscGVyIGZ1bmN0aW9uIGZvciBvcmRlcmluZyBhZGFwdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXBzX3NoaWZ0X2NvbnRyb2xsZXJzKGludCBsb3dpbmRleCwgaW50IGhpZ2hpbmRleCkKK3sKKwlpcHNfaGFfdCAqaGFfc2F2ID0gaXBzX2hhW2hpZ2hpbmRleF07CisJc3RydWN0IFNjc2lfSG9zdCAqc2hfc2F2ID0gaXBzX3NoW2hpZ2hpbmRleF07CisJaW50IGk7CisKKwlmb3IgKGkgPSBoaWdoaW5kZXg7IGkgPiBsb3dpbmRleDsgaS0tKSB7CisJCWlwc19oYVtpXSA9IGlwc19oYVtpIC0gMV07CisJCWlwc19zaFtpXSA9IGlwc19zaFtpIC0gMV07CisJCWlwc19oYVtpXS0+aG9zdF9udW0gPSBpOworCX0KKwloYV9zYXYtPmhvc3RfbnVtID0gbG93aW5kZXg7CisJaXBzX2hhW2xvd2luZGV4XSA9IGhhX3NhdjsKKwlpcHNfc2hbbG93aW5kZXhdID0gc2hfc2F2OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfb3JkZXJfY29udHJvbGxlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwbGFjZSBjb250cm9sbGVycyBpcyB0aGUgInByb3BlciIgYm9vdCBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpcHNfb3JkZXJfY29udHJvbGxlcnModm9pZCkKK3sKKwlpbnQgaSwgaiwgdG1wLCBwb3NpdGlvbiA9IDA7CisJSVBTX05WUkFNX1A1ICpudnJhbTsKKwlpZiAoIWlwc19oYVswXSkKKwkJcmV0dXJuOworCW52cmFtID0gaXBzX2hhWzBdLT5udnJhbTsKKworCWlmIChudnJhbS0+YWRhcHRlcl9vcmRlclswXSkgeworCQlmb3IgKGkgPSAxOyBpIDw9IG52cmFtLT5hZGFwdGVyX29yZGVyWzBdOyBpKyspIHsKKwkJCWZvciAoaiA9IHBvc2l0aW9uOyBqIDwgaXBzX251bV9jb250cm9sbGVyczsgaisrKSB7CisJCQkJc3dpdGNoIChpcHNfaGFbal0tPmFkX3R5cGUpIHsKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlENk06CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDdNOgorCQkJCQlpZiAobnZyYW0tPmFkYXB0ZXJfb3JkZXJbaV0gPT0gJ00nKSB7CisJCQkJCQlpcHNfc2hpZnRfY29udHJvbGxlcnMocG9zaXRpb24sCisJCQkJCQkJCSAgICAgIGopOworCQkJCQkJcG9zaXRpb24rKzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlENEw6CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDRNOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TVg6CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDRMWDoKKwkJCQkJaWYgKG52cmFtLT5hZGFwdGVyX29yZGVyW2ldID09ICdOJykgeworCQkJCQkJaXBzX3NoaWZ0X2NvbnRyb2xsZXJzKHBvc2l0aW9uLAorCQkJCQkJCQkgICAgICBqKTsKKwkJCQkJCXBvc2l0aW9uKys7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDZJOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ1STI6CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDVJMToKKwkJCQljYXNlIElQU19BRFRZUEVfU0VSVkVSQUlEN2s6CisJCQkJCWlmIChudnJhbS0+YWRhcHRlcl9vcmRlcltpXSA9PSAnUycpIHsKKwkJCQkJCWlwc19zaGlmdF9jb250cm9sbGVycyhwb3NpdGlvbiwKKwkJCQkJCQkJICAgICAgaik7CisJCQkJCQlwb3NpdGlvbisrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ6CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDI6CisJCQkJY2FzZSBJUFNfQURUWVBFX05BVkFKTzoKKwkJCQljYXNlIElQU19BRFRZUEVfS0lPV0E6CisJCQkJY2FzZSBJUFNfQURUWVBFX1NFUlZFUkFJRDNMOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQzOgorCQkJCWNhc2UgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0SDoKKwkJCQkJaWYgKG52cmFtLT5hZGFwdGVyX29yZGVyW2ldID09ICdBJykgeworCQkJCQkJaXBzX3NoaWZ0X2NvbnRyb2xsZXJzKHBvc2l0aW9uLAorCQkJCQkJCQkgICAgICBqKTsKKwkJCQkJCXBvc2l0aW9uKys7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIGlmIGFkYXB0ZXJfb3JkZXJbMF0sIHRoZW4gb3JkZXJpbmcgaXMgY29tcGxldGUgKi8KKwkJcmV0dXJuOworCX0KKwkvKiBvbGQgYmlvcywgdXNlIG9sZGVyIG9yZGVyaW5nICovCisJdG1wID0gMDsKKwlmb3IgKGkgPSBwb3NpdGlvbjsgaSA8IGlwc19udW1fY29udHJvbGxlcnM7IGkrKykgeworCQlpZiAoaXBzX2hhW2ldLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlENUkyIHx8CisJCSAgICBpcHNfaGFbaV0tPmFkX3R5cGUgPT0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ1STEpIHsKKwkJCWlwc19zaGlmdF9jb250cm9sbGVycyhwb3NpdGlvbiwgaSk7CisJCQlwb3NpdGlvbisrOworCQkJdG1wID0gMTsKKwkJfQorCX0KKwkvKiBpZiB0aGVyZSB3ZXJlIG5vIDVJIGNhcmRzLCB0aGVuIGRvbid0IGRvIGFueSBleHRyYSBvcmRlcmluZyAqLworCWlmICghdG1wKQorCQlyZXR1cm47CisJZm9yIChpID0gcG9zaXRpb247IGkgPCBpcHNfbnVtX2NvbnRyb2xsZXJzOyBpKyspIHsKKwkJaWYgKGlwc19oYVtpXS0+YWRfdHlwZSA9PSBJUFNfQURUWVBFX1NFUlZFUkFJRDRMIHx8CisJCSAgICBpcHNfaGFbaV0tPmFkX3R5cGUgPT0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TSB8fAorCQkgICAgaXBzX2hhW2ldLT5hZF90eXBlID09IElQU19BRFRZUEVfU0VSVkVSQUlENExYIHx8CisJCSAgICBpcHNfaGFbaV0tPmFkX3R5cGUgPT0gSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TVgpIHsKKwkJCWlwc19zaGlmdF9jb250cm9sbGVycyhwb3NpdGlvbiwgaSk7CisJCQlwb3NpdGlvbisrOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBOYW1lOiBpcHNfcmVnaXN0ZXJfc2NzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwZXJmb3JtIGFueSByZWdpc3RyYXRpb24gYW5kIHNldHVwIHdpdGggdGhlIHNjc2kgbGF5ZXIgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lwc19yZWdpc3Rlcl9zY3NpKGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaDsKKwlpcHNfaGFfdCAqaGEsICpvbGRoYSA9IGlwc19oYVtpbmRleF07CisJc2ggPSBzY3NpX2hvc3RfYWxsb2MoJmlwc19kcml2ZXJfdGVtcGxhdGUsIHNpemVvZiAoaXBzX2hhX3QpKTsKKwlpZiAoIXNoKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBvbGRoYS0+cGNpZGV2LAorCQkJICAgIlVuYWJsZSB0byByZWdpc3RlciBjb250cm9sbGVyIHdpdGggU0NTSSBzdWJzeXN0ZW1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWhhID0gSVBTX0hBKHNoKTsKKwltZW1jcHkoaGEsIG9sZGhhLCBzaXplb2YgKGlwc19oYV90KSk7CisJZnJlZV9pcnEob2xkaGEtPmlycSwgb2xkaGEpOworCS8qIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpdGggdGhlIG5ldyBoYSAqLworCWlmIChyZXF1ZXN0X2lycShoYS0+aXJxLCBkb19pcHNpbnRyLCBTQV9TSElSUSwgaXBzX25hbWUsIGhhKSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgaGEtPnBjaWRldiwKKwkJCSAgICJVbmFibGUgdG8gaW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxlclxuIik7CisJCXNjc2lfaG9zdF9wdXQoc2gpOworCQlyZXR1cm4gLTE7CisJfQorCisJa2ZyZWUob2xkaGEpOworCWlwc19zaFtpbmRleF0gPSBzaDsKKwlpcHNfaGFbaW5kZXhdID0gaGE7CisJSVBTX1NDU0lfU0VUX0RFVklDRShzaCwgaGEpOworCisJLyogU3RvcmUgYXdheSBuZWVkZWQgdmFsdWVzIGZvciBsYXRlciB1c2UgKi8KKwlzaC0+aW9fcG9ydCA9IGhhLT5pb19hZGRyOworCXNoLT5uX2lvX3BvcnQgPSBoYS0+aW9fYWRkciA/IDI1NSA6IDA7CisJc2gtPnVuaXF1ZV9pZCA9IChoYS0+aW9fYWRkcikgPyBoYS0+aW9fYWRkciA6IGhhLT5tZW1fYWRkcjsKKwlzaC0+aXJxID0gaGEtPmlycTsKKwlzaC0+c2dfdGFibGVzaXplID0gc2gtPmhvc3R0LT5zZ190YWJsZXNpemU7CisJc2gtPmNhbl9xdWV1ZSA9IHNoLT5ob3N0dC0+Y2FuX3F1ZXVlOworCXNoLT5jbWRfcGVyX2x1biA9IHNoLT5ob3N0dC0+Y21kX3Blcl9sdW47CisJc2gtPnVuY2hlY2tlZF9pc2FfZG1hID0gc2gtPmhvc3R0LT51bmNoZWNrZWRfaXNhX2RtYTsKKwlzaC0+dXNlX2NsdXN0ZXJpbmcgPSBzaC0+aG9zdHQtPnVzZV9jbHVzdGVyaW5nOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCw3KQorCXNoLT5tYXhfc2VjdG9ycyA9IDEyODsKKyNlbmRpZgorCisJc2gtPm1heF9pZCA9IGhhLT5udGFyZ2V0czsKKwlzaC0+bWF4X2x1biA9IGhhLT5ubHVuOworCXNoLT5tYXhfY2hhbm5lbCA9IGhhLT5uYnVzIC0gMTsKKwlzaC0+Y2FuX3F1ZXVlID0gaGEtPm1heF9jbWRzIC0gMTsKKworCUlQU19BRERfSE9TVChzaCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgUm91dGluZSBOYW1lOiBpcHNfcmVtb3ZlX2RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBSZW1vdmUgb25lIEFkYXB0ZXIgKCBIb3QgUGx1Z2dpbmcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAoraXBzX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJaW50IGk7CisJc3RydWN0IFNjc2lfSG9zdCAqc2g7CisJaXBzX2hhX3QgKmhhOworCisJZm9yIChpID0gMDsgaSA8IElQU19NQVhfQURBUFRFUlM7IGkrKykgeworCQloYSA9IGlwc19oYVtpXTsKKwkJaWYgKGhhKSB7CisJCQlpZiAoKHBjaV9kZXYtPmJ1cy0+bnVtYmVyID09IGhhLT5wY2lkZXYtPmJ1cy0+bnVtYmVyKSAmJgorCQkJICAgIChwY2lfZGV2LT5kZXZmbiA9PSBoYS0+cGNpZGV2LT5kZXZmbikpIHsKKwkJCQlzaCA9IGlwc19zaFtpXTsKKwkJCQlpcHNfcmVsZWFzZShzaCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19tb2R1bGVfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGZ1bmN0aW9uIGNhbGxlZCBvbiBtb2R1bGUgbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQKK2lwc19tb2R1bGVfaW5pdCh2b2lkKQoreworCWlmIChwY2lfbW9kdWxlX2luaXQoJmlwc19wY2lfZHJpdmVyKSA8IDApCisJCXJldHVybiAtRU5PREVWOworCWlwc19kcml2ZXJfdGVtcGxhdGUubW9kdWxlID0gVEhJU19NT0RVTEU7CisJaXBzX29yZGVyX2NvbnRyb2xsZXJzKCk7CisJaWYgKElQU19SRUdJU1RFUl9IT1NUUygmaXBzX2RyaXZlcl90ZW1wbGF0ZSkpIHsKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcHNfcGNpX2RyaXZlcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmlwc19ub3RpZmllcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSb3V0aW5lIE5hbWU6IGlwc19tb2R1bGVfZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUm91dGluZSBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGZ1bmN0aW9uIGNhbGxlZCBvbiBtb2R1bGUgdW5sb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19leGl0CitpcHNfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlJUFNfVU5SRUdJU1RFUl9IT1NUUygmaXBzX2RyaXZlcl90ZW1wbGF0ZSk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcHNfcGNpX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmlwc19ub3RpZmllcik7Cit9CisKK21vZHVsZV9pbml0KGlwc19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpcHNfbW9kdWxlX2V4aXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgIFJvdXRpbmUgTmFtZTogaXBzX2luc2VydF9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgQWRkIE9uZSBBZGFwdGVyICggSG90IFBsdWcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgMCBpZiBTdWNjZXNzZnVsLCBlbHNlIG5vbi16ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraXBzX2luc2VydF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGluZGV4OworCWludCByYzsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2luc2VydF9kZXZpY2UiLCAxKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJCXJldHVybiAtMTsKKworCXJjID0gaXBzX2luaXRfcGhhc2UxKHBjaV9kZXYsICZpbmRleCk7CisJaWYgKHJjID09IFNVQ0NFU1MpCisJCXJjID0gaXBzX2luaXRfcGhhc2UyKGluZGV4KTsKKworCWlmIChpcHNfaG90cGx1ZykKKwkJaWYgKGlwc19yZWdpc3Rlcl9zY3NpKGluZGV4KSkgeworCQkJaXBzX2ZyZWUoaXBzX2hhW2luZGV4XSk7CisJCQlyYyA9IC0xOworCQl9CisKKwlpZiAocmMgPT0gU1VDQ0VTUykKKwkJaXBzX251bV9jb250cm9sbGVycysrOworCisJaXBzX25leHRfY29udHJvbGxlciA9IGlwc19udW1fY29udHJvbGxlcnM7CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgIFJvdXRpbmUgTmFtZTogaXBzX2luaXRfcGhhc2UxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgQWRhcHRlciBJbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgMCBpZiBTdWNjZXNzZnVsLCBlbHNlIG5vbi16ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50CitpcHNfaW5pdF9waGFzZTEoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGludCAqaW5kZXhQdHIpCit7CisJaXBzX2hhX3QgKmhhOworCXVpbnQzMl90IGlvX2FkZHI7CisJdWludDMyX3QgbWVtX2FkZHI7CisJdWludDMyX3QgaW9fbGVuOworCXVpbnQzMl90IG1lbV9sZW47CisJdWludDhfdCByZXZpc2lvbl9pZDsKKwl1aW50OF90IGJ1czsKKwl1aW50OF90IGZ1bmM7CisJdWludDhfdCBpcnE7CisJdWludDE2X3Qgc3ViZGV2aWNlX2lkOworCWludCBqOworCWludCBpbmRleDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyZXNzOworCWNoYXIgX19pb21lbSAqaW9yZW1hcF9wdHI7CisJY2hhciBfX2lvbWVtICptZW1fcHRyOworCXVpbnQzMl90IElzRGVhZDsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2luaXRfcGhhc2UxIiwgMSk7CisJaW5kZXggPSBJUFNfTUFYX0FEQVBURVJTOworCWZvciAoaiA9IDA7IGogPCBJUFNfTUFYX0FEQVBURVJTOyBqKyspIHsKKwkJaWYgKGlwc19oYVtqXSA9PSAwKSB7CisJCQlpbmRleCA9IGo7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA+PSBJUFNfTUFYX0FEQVBURVJTKQorCQlyZXR1cm4gLTE7CisKKwkvKiBzdHVmZiB0aGF0IHdlIGdldCBpbiBkZXYgKi8KKwlpcnEgPSBwY2lfZGV2LT5pcnE7CisJYnVzID0gcGNpX2Rldi0+YnVzLT5udW1iZXI7CisJZnVuYyA9IHBjaV9kZXYtPmRldmZuOworCisJLyogSW5pdCBNRU0vSU8gYWRkcmVzc2VzIHRvIDAgKi8KKwltZW1fYWRkciA9IDA7CisJaW9fYWRkciA9IDA7CisJbWVtX2xlbiA9IDA7CisJaW9fbGVuID0gMDsKKworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJaWYgKCFwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgaikpCisJCQlicmVhazsKKworCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaV9kZXYsIGopICYgSU9SRVNPVVJDRV9JTykgeworCQkJaW9fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCBqKTsKKwkJCWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldiwgaik7CisJCX0gZWxzZSB7CisJCQltZW1fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCBqKTsKKwkJCW1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIGopOworCQl9CisJfQorCisJLyogc2V0dXAgbWVtb3J5IG1hcHBlZCBhcmVhIChpZiBhcHBsaWNhYmxlKSAqLworCWlmIChtZW1fYWRkcikgeworCQl1aW50MzJfdCBiYXNlOworCQl1aW50MzJfdCBvZmZzOworCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9hZGRyLCBtZW1fbGVuLCAiaXBzIikpIHsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJCSAgICJDb3VsZG4ndCBhbGxvY2F0ZSBJTyBNZW1vcnkgc3BhY2UgJXggbGVuICVkLlxuIiwKKwkJCQkgICBtZW1fYWRkciwgbWVtX2xlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQliYXNlID0gbWVtX2FkZHIgJiBQQUdFX01BU0s7CisJCW9mZnMgPSBtZW1fYWRkciAtIGJhc2U7CisJCWlvcmVtYXBfcHRyID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOworCQltZW1fcHRyID0gaW9yZW1hcF9wdHIgKyBvZmZzOworCX0gZWxzZSB7CisJCWlvcmVtYXBfcHRyID0gTlVMTDsKKwkJbWVtX3B0ciA9IE5VTEw7CisJfQorCisJLyogc2V0dXAgSS9PIG1hcHBlZCBhcmVhIChpZiBhcHBsaWNhYmxlKSAqLworCWlmIChpb19hZGRyKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oaW9fYWRkciwgaW9fbGVuLCAiaXBzIikpIHsKKwkJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJCSAgICJDb3VsZG4ndCBhbGxvY2F0ZSBJTyBzcGFjZSAleCBsZW4gJWQuXG4iLAorCQkJCSAgIGlvX2FkZHIsIGlvX2xlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBnZXQgdGhlIHJldmlzaW9uIElEICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uX2lkKSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwgIkNhbid0IGdldCByZXZpc2lvbiBpZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3ViZGV2aWNlX2lkID0gcGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZTsKKworCS8qIGZvdW5kIGEgY29udHJvbGxlciAqLworCWhhID0ga21hbGxvYyhzaXplb2YgKGlwc19oYV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhhID09IE5VTEwpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBoYSBzdHJ1Y3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KGhhLCAwLCBzaXplb2YgKGlwc19oYV90KSk7CisKKwlpcHNfc2hbaW5kZXhdID0gTlVMTDsKKwlpcHNfaGFbaW5kZXhdID0gaGE7CisJaGEtPmFjdGl2ZSA9IDE7CisKKwkvKiBTdG9yZSBpbmZvIGluIEhBIHN0cnVjdHVyZSAqLworCWhhLT5pcnEgPSBpcnE7CisJaGEtPmlvX2FkZHIgPSBpb19hZGRyOworCWhhLT5pb19sZW4gPSBpb19sZW47CisJaGEtPm1lbV9hZGRyID0gbWVtX2FkZHI7CisJaGEtPm1lbV9sZW4gPSBtZW1fbGVuOworCWhhLT5tZW1fcHRyID0gbWVtX3B0cjsKKwloYS0+aW9yZW1hcF9wdHIgPSBpb3JlbWFwX3B0cjsKKwloYS0+aG9zdF9udW0gPSAodWludDMyX3QpIGluZGV4OworCWhhLT5yZXZpc2lvbl9pZCA9IHJldmlzaW9uX2lkOworCWhhLT5zbG90X251bSA9IFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKTsKKwloYS0+ZGV2aWNlX2lkID0gcGNpX2Rldi0+ZGV2aWNlOworCWhhLT5zdWJkZXZpY2VfaWQgPSBzdWJkZXZpY2VfaWQ7CisJaGEtPnBjaWRldiA9IHBjaV9kZXY7CisKKwkvKgorCSAqIFNldCB0aGUgcGNpX2RldidzIGRtYV9tYXNrLiAgTm90IGFsbCBhZGFwdGVycyBzdXBwb3J0IDY0Yml0CisJICogYWRkcmVzc2luZyBzbyBkb24ndCBlbmFibGUgaXQgaWYgdGhlIGFkYXB0ZXIgY2FuJ3Qgc3VwcG9ydAorCSAqIGl0ISAgQWxzbywgZG9uJ3QgdXNlIDY0Yml0IGFkZHJlc3NpbmcgaWYgZG1hIGFkZHJlc3NlcworCSAqIGFyZSBndWFyYW50ZWVkIHRvIGJlIDwgNEcuCisJICovCisJaWYgKElQU19FTkFCTEVfRE1BNjQgJiYgSVBTX0hBU19FTkhfU0dMSVNUKGhhKSAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhoYS0+cGNpZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisJCShoYSktPmZsYWdzIHw9IElQU19IQV9FTkhfU0c7CisJfSBlbHNlIHsKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBjaWRldiwgMHhmZmZmZmZmZlVMTCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIHNldCBETUEgTWFza1xuIik7CisJCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwkJfQorCX0KKwlpZihpcHNfY2RfYm9vdCAmJiAhaXBzX0ZsYXNoRGF0YSl7CisJCWlwc19GbGFzaERhdGEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgNywKKwkJCQkJCSAgICAgJmlwc19mbGFzaGJ1c2FkZHIpOworCX0KKworCWhhLT5lbnEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YgKElQU19FTlEpLAorCQkJCSAgICAgICAmaGEtPmVucV9idXNhZGRyKTsKKwlpZiAoIWhhLT5lbnEpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGhvc3QgaW5xdWlyeSBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwloYS0+YWRhcHQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YgKElQU19BREFQVEVSKSArCisJCQkJCSBzaXplb2YgKElQU19JT19DTUQpLCAmZG1hX2FkZHJlc3MpOworCWlmICghaGEtPmFkYXB0KSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBob3N0IGFkYXB0ICYgZHVtbXkgc3RydWN0dXJlc1xuIik7CisJCXJldHVybiBpcHNfYWJvcnRfaW5pdChoYSwgaW5kZXgpOworCX0KKwloYS0+YWRhcHQtPmh3X3N0YXR1c19zdGFydCA9IGRtYV9hZGRyZXNzOworCWhhLT5kdW1teSA9ICh2b2lkICopIChoYS0+YWRhcHQgKyAxKTsKKworCisKKwloYS0+bG9naWNhbF9kcml2ZV9pbmZvID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mIChJUFNfTERfSU5GTyksICZkbWFfYWRkcmVzcyk7CisJaWYgKCFoYS0+bG9naWNhbF9kcml2ZV9pbmZvKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBwY2lfZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBsb2dpY2FsIGRyaXZlIGluZm8gc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCWhhLT5sb2dpY2FsX2RyaXZlX2luZm9fZG1hX2FkZHIgPSBkbWFfYWRkcmVzczsKKworCisJaGEtPmNvbmYgPSBrbWFsbG9jKHNpemVvZiAoSVBTX0NPTkYpLCBHRlBfS0VSTkVMKTsKKworCWlmICghaGEtPmNvbmYpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGhvc3QgY29uZiBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwloYS0+bnZyYW0gPSBrbWFsbG9jKHNpemVvZiAoSVBTX05WUkFNX1A1KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWhhLT5udnJhbSkgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgaG9zdCBOVlJBTSBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwloYS0+c3Vic3lzID0ga21hbGxvYyhzaXplb2YgKElQU19TVUJTWVMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghaGEtPnN1YnN5cykgeworCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgaG9zdCBzdWJzeXN0ZW0gc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIGlwc19hYm9ydF9pbml0KGhhLCBpbmRleCk7CisJfQorCisJLyogdGhlIGlvY3RsIGJ1ZmZlciBpcyBub3cgdXNlZCBkdXJpbmcgYWRhcHRlciBpbml0aWFsaXphdGlvbiwgc28gaXRzCisJICogc3VjY2Vzc2Z1bCBhbGxvY2F0aW9uIGlzIG5vdyByZXF1aXJlZCAqLworCWlmIChpcHNfaW9jdGxzaXplIDwgUEFHRV9TSVpFKQorCQlpcHNfaW9jdGxzaXplID0gUEFHRV9TSVpFOworCisJaGEtPmlvY3RsX2RhdGEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBpcHNfaW9jdGxzaXplLAorCQkJCQkgICAgICAmaGEtPmlvY3RsX2J1c2FkZHIpOworCWhhLT5pb2N0bF9sZW4gPSBpcHNfaW9jdGxzaXplOworCWlmICghaGEtPmlvY3RsX2RhdGEpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIHBjaV9kZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIElPQ1RMIGRhdGFcbiIpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwkvKgorCSAqIFNldHVwIEZ1bmN0aW9ucworCSAqLworCWlwc19zZXR1cF9mdW5jbGlzdChoYSk7CisKKwlpZiAoKElQU19JU19NT1JQSEVVUyhoYSkpIHx8IChJUFNfSVNfTUFSQ08oaGEpKSkgeworCQkvKiBJZiBNb3JwaGV1cyBhcHBlYXJzIGRlYWQsIHJlc2V0IGl0ICovCisJCUlzRGVhZCA9IHJlYWRsKGhhLT5tZW1fcHRyICsgSVBTX1JFR19JOTYwX01TRzEpOworCQlpZiAoSXNEZWFkID09IDB4REVBREJFRUYpIHsKKwkJCWlwc19yZXNldF9tb3JwaGV1cyhoYSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGNhcmQgaWYgaXQgaXNuJ3QgYWxyZWFkeQorCSAqLworCisJaWYgKCEoKmhhLT5mdW5jLmlzaW5pdCkgKGhhKSkgeworCQlpZiAoISgqaGEtPmZ1bmMuaW5pdCkgKGhhKSkgeworCQkJLyoKKwkJCSAqIEluaXRpYWxpemF0aW9uIGZhaWxlZAorCQkJICovCisJCQlJUFNfUFJJTlRLKEtFUk5fV0FSTklORywgcGNpX2RldiwKKwkJCQkgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgY29udHJvbGxlclxuIik7CisJCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwkJfQorCX0KKworCSppbmRleFB0ciA9IGluZGV4OworCXJldHVybiBTVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgIFJvdXRpbmUgTmFtZTogaXBzX2luaXRfcGhhc2UyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJvdXRpbmUgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgQWRhcHRlciBJbml0aWFsaXphdGlvbiBQaGFzZSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgMCBpZiBTdWNjZXNzZnVsLCBlbHNlIG5vbi16ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50CitpcHNfaW5pdF9waGFzZTIoaW50IGluZGV4KQoreworCWlwc19oYV90ICpoYTsKKworCWhhID0gaXBzX2hhW2luZGV4XTsKKworCU1FVEhPRF9UUkFDRSgiaXBzX2luaXRfcGhhc2UyIiwgMSk7CisJaWYgKCFoYS0+YWN0aXZlKSB7CisJCWlwc19oYVtpbmRleF0gPSBOVUxMOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEoaGEtPmlycSwgZG9faXBzaW50ciwgU0FfU0hJUlEsIGlwc19uYW1lLCBoYSkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAiVW5hYmxlIHRvIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IFNDQiBmb3IgaW5pdGlhbGl6YXRpb24KKwkgKi8KKwloYS0+bWF4X2NtZHMgPSAxOworCWlmICghaXBzX2FsbG9jYXRlc2NicyhoYSkpIHsKKwkJSVBTX1BSSU5USyhLRVJOX1dBUk5JTkcsIGhhLT5wY2lkZXYsCisJCQkgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGEgQ0NCXG4iKTsKKwkJZnJlZV9pcnEoaGEtPmlycSwgaGEpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwlpZiAoIWlwc19oYWluaXQoaGEpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIlVuYWJsZSB0byBpbml0aWFsaXplIGNvbnRyb2xsZXJcbiIpOworCQlmcmVlX2lycShoYS0+aXJxLCBoYSk7CisJCXJldHVybiBpcHNfYWJvcnRfaW5pdChoYSwgaW5kZXgpOworCX0KKwkvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgU0NCICovCisJaXBzX2RlYWxsb2NhdGVzY2JzKGhhLCAxKTsKKworCS8qIGFsbG9jYXRlIENDQnMgKi8KKwlpZiAoIWlwc19hbGxvY2F0ZXNjYnMoaGEpKSB7CisJCUlQU19QUklOVEsoS0VSTl9XQVJOSU5HLCBoYS0+cGNpZGV2LAorCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBDQ0JzXG4iKTsKKwkJZnJlZV9pcnEoaGEtPmlycSwgaGEpOworCQlyZXR1cm4gaXBzX2Fib3J0X2luaXQoaGEsIGluZGV4KTsKKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsOSkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgorCitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBTZXJ2ZVJBSUQgQWRhcHRlciBEcml2ZXIgIiBJUFNfVkVSX1NUUklORyk7CisKKyNpZmRlZiBNT0RVTEVfVkVSU0lPTgorTU9EVUxFX1ZFUlNJT04oSVBTX1ZFUl9TVFJJTkcpOworI2VuZGlmCisKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBhbG1vc3QgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiAyCisgKiBjLWJyYWNlLWltYWdpbmFyeS1vZmZzZXQ6IDAKKyAqIGMtYnJhY2Utb2Zmc2V0OiAtMgorICogYy1hcmdkZWNsLWluZGVudDogMgorICogYy1sYWJlbC1vZmZzZXQ6IC0yCisgKiBjLWNvbnRpbnVlZC1zdGF0ZW1lbnQtb2Zmc2V0OiAyCisgKiBjLWNvbnRpbnVlZC1icmFjZS1vZmZzZXQ6IDAKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHMuaCBiL2RyaXZlcnMvc2NzaS9pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZhNzYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2lwcy5oCkBAIC0wLDAgKzEsMTI5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaXBzLmggLS0gZHJpdmVyIGZvciB0aGUgQWRhcHRlYyAvIElCTSBTZXJ2ZVJBSUQgY29udHJvbGxlciAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV3JpdHRlbiBCeTogS2VpdGggTWl0Y2hlbGwsIElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgSmFjayBIYW1tZXIsIEFkYXB0ZWMsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgRGF2aWQgSmVmZmVyeSwgQWRhcHRlYywgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ29weXJpZ2h0IChDKSAyMDAzIEFkYXB0ZWMsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgKi8KKy8qIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICAgKi8KKy8qIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgKi8KKy8qIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgKi8KKy8qIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAgKi8KKy8qIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICAgKi8KKy8qIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PIFdBUlJBTlRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgKi8KKy8qIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUICAgICAgKi8KKy8qIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsICAgICAgKi8KKy8qIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgKi8KKy8qIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgICAgICAgKi8KKy8qIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyAgICAgICAgKi8KKy8qIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgKi8KKy8qIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsICAgICAgICAgKi8KKy8qIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERJU0NMQUlNRVIgT0YgTElBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZICAgKi8KKy8qIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgICAgICAgKi8KKy8qIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EICAgKi8KKy8qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAgICAgKi8KKy8qIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgICAgKi8KKy8qIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCAgKi8KKy8qIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICAgKi8KKy8qIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICAgKi8KKy8qIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1Z3MvQ29tbWVudHMvU3VnZ2VzdGlvbnMgc2hvdWxkIGJlIG1haWxlZCB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaXBzbGludXhAYWRhcHRlYy5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSVBTX0hfCisgICAjZGVmaW5lIF9JUFNfSF8KKworICAgI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisgICAjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyAgIC8qCisgICAgKiBTb21lIGhhbmR5IG1hY3JvcworICAgICovCisgICAjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkgfHwgZGVmaW5lZCBDT05GSUdfSElHSElPCisgICAgICAjZGVmaW5lIElQU19ISUdISU8KKyAgICNlbmRpZgorCisgICAjZGVmaW5lIElQU19IQSh4KSAgICAgICAgICAgICAgICAgICAoKGlwc19oYV90ICopIHgtPmhvc3RkYXRhKQorICAgI2RlZmluZSBJUFNfQ09NTUFORF9JRChoYSwgc2NiKSAgICAgKGludCkgKHNjYiAtIGhhLT5zY2JzKQorICAgI2RlZmluZSBJUFNfSVNfVFJPTUJPTkUoaGEpICAgICAgICAgKCgoaGEtPmRldmljZV9pZCA9PSBJUFNfREVWSUNFSURfQ09QUEVSSEVBRCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGEtPnJldmlzaW9uX2lkID49IElQU19SRVZJRF9UUk9NQk9ORTMyKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYS0+cmV2aXNpb25faWQgPD0gSVBTX1JFVklEX1RST01CT05FNjQpKSA/IDEgOiAwKQorICAgI2RlZmluZSBJUFNfSVNfQ0xBUklORVQoaGEpICAgICAgICAgKCgoaGEtPmRldmljZV9pZCA9PSBJUFNfREVWSUNFSURfQ09QUEVSSEVBRCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGEtPnJldmlzaW9uX2lkID49IElQU19SRVZJRF9DTEFSSU5FVFAxKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYS0+cmV2aXNpb25faWQgPD0gSVBTX1JFVklEX0NMQVJJTkVUUDMpKSA/IDEgOiAwKQorICAgI2RlZmluZSBJUFNfSVNfTU9SUEhFVVMoaGEpICAgICAgICAgKGhhLT5kZXZpY2VfaWQgPT0gSVBTX0RFVklDRUlEX01PUlBIRVVTKQorICAgI2RlZmluZSBJUFNfSVNfTUFSQ08oaGEpICAgICAgICAgICAgKGhhLT5kZXZpY2VfaWQgPT0gSVBTX0RFVklDRUlEX01BUkNPKQorICAgI2RlZmluZSBJUFNfVVNFX0kyT19ERUxJVkVSKGhhKSAgICAgKChJUFNfSVNfTU9SUEhFVVMoaGEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElQU19JU19UUk9NQk9ORShoYSkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwc19mb3JjZV9pMm8pKSkgPyAxIDogMCkKKyAgICNkZWZpbmUgSVBTX1VTRV9NRU1JTyhoYSkgICAgICAgICAgICgoSVBTX0lTX01PUlBIRVVTKGhhKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVBTX0lTX1RST01CT05FKGhhKSB8fCBJUFNfSVNfQ0xBUklORVQoaGEpKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXBzX2ZvcmNlX21lbWlvKSkpID8gMSA6IDApCisKKyAgICAjZGVmaW5lIElQU19IQVNfRU5IX1NHTElTVChoYSkgICAgKElQU19JU19NT1JQSEVVUyhoYSkgfHwgSVBTX0lTX01BUkNPKGhhKSkKKyAgICAjZGVmaW5lIElQU19VU0VfRU5IX1NHTElTVChoYSkgICAgKChoYSktPmZsYWdzICYgSVBTX0hBX0VOSF9TRykKKyAgICAjZGVmaW5lIElQU19TR0xJU1RfU0laRShoYSkgICAgICAgKElQU19VU0VfRU5IX1NHTElTVChoYSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJUFNfRU5IX1NHX0xJU1QpIDogc2l6ZW9mKElQU19TVERfU0dfTElTVCkpCisKKyAgICNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsNCkKKyAgICAgICNkZWZpbmUgcGNpX3NldF9kbWFfbWFzayhkZXYsbWFzaykgKCBtYXNrID4gMHhmZmZmZmZmZiA/IDE6MCApCisgICAgICAjZGVmaW5lIHNjc2lfc2V0X3BjaV9kZXZpY2Uoc2gsZGV2KSAoMCkKKyAgICNlbmRpZgorCisgICAjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAKKyAgICAgICNpZm5kZWYgaXJxcmV0dXJuX3QKKyAgICAgICAgIHR5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyAgICAgICNlbmRpZiAKKyAgICAgIAorICAgICAgI2RlZmluZSBJUlFfTk9ORQorICAgICAgI2RlZmluZSBJUlFfSEFORExFRAorICAgICAgI2RlZmluZSBJUlFfUkVUVkFMKHgpCisgICAgICAjZGVmaW5lIElQU19SRUdJU1RFUl9IT1NUUyhTSFQpICAgICAgc2NzaV9yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsU0hUKQorICAgICAgI2RlZmluZSBJUFNfVU5SRUdJU1RFUl9IT1NUUyhTSFQpICAgIHNjc2lfdW5yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsU0hUKQorICAgICAgI2RlZmluZSBJUFNfQUREX0hPU1Qoc2hvc3QsZGV2aWNlKQorICAgICAgI2RlZmluZSBJUFNfUkVNT1ZFX0hPU1Qoc2hvc3QpCisgICAgICAjZGVmaW5lIElQU19TQ1NJX1NFVF9ERVZJQ0Uoc2gsaGEpICAgc2NzaV9zZXRfcGNpX2RldmljZShzaCwgKGhhKS0+cGNpZGV2KQorICAgICAgI2RlZmluZSBJUFNfUFJJTlRLKGxldmVsLCBwY2lkZXYsIGZvcm1hdCwgYXJnLi4uKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHJpbnRrKGxldmVsICIlcyAlczoiIGZvcm1hdCAsICJpcHMiICwgICAgIFwKKyAgICAgICAgICAgIChwY2lkZXYpLT5zbG90X25hbWUgLCAjIyBhcmcpCisgICAgICAjZGVmaW5lIHNjc2lfaG9zdF9hbGxvYyhzaCxzaXplKSAgICAgICAgIHNjc2lfcmVnaXN0ZXIoc2gsc2l6ZSkKKyAgICAgICNkZWZpbmUgc2NzaV9ob3N0X3B1dChzaCkgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNoKQorICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgSVBTX1JFR0lTVEVSX0hPU1RTKFNIVCkgICAgICAoIWlwc19kZXRlY3QoU0hUKSkKKyAgICAgICNkZWZpbmUgSVBTX1VOUkVHSVNURVJfSE9TVFMoU0hUKQorICAgICAgI2RlZmluZSBJUFNfQUREX0hPU1Qoc2hvc3QsZGV2aWNlKSAgIGRvIHsgc2NzaV9hZGRfaG9zdChzaG9zdCxkZXZpY2UpOyBzY3NpX3NjYW5faG9zdChzaG9zdCk7IH0gd2hpbGUgKDApCisgICAgICAjZGVmaW5lIElQU19SRU1PVkVfSE9TVChzaG9zdCkgICAgICAgc2NzaV9yZW1vdmVfaG9zdChzaG9zdCkKKyAgICAgICNkZWZpbmUgSVBTX1NDU0lfU0VUX0RFVklDRShzaCxoYSkgICBzY3NpX3NldF9kZXZpY2Uoc2gsICYoaGEpLT5wY2lkZXYtPmRldikKKyAgICAgICNkZWZpbmUgSVBTX1BSSU5USyhsZXZlbCwgcGNpZGV2LCBmb3JtYXQsIGFyZy4uLikgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRldl9wcmludGsobGV2ZWwgLCAmKChwY2lkZXYpLT5kZXYpICwgZm9ybWF0ICwgIyMgYXJnKQorICAgI2VuZGlmCisKKyAgICNpZm5kZWYgTURFTEFZCisgICAgICAjZGVmaW5lIE1ERUxBWSBtZGVsYXkKKyAgICNlbmRpZgorCisgICAjaWZuZGVmIG1pbgorICAgICAgI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpID8geCA6IHkpCisgICAjZW5kaWYKKworICAgI2RlZmluZSBwY2lfZG1hX2hpMzIoYSkgICAgICAgICAoKGEgPj4gMTYpID4+IDE2KQorICAgI2RlZmluZSBwY2lfZG1hX2xvMzIoYSkgICAgICAgICAoYSAmIDB4ZmZmZmZmZmYpCisKKyAgICNpZiAoQklUU19QRVJfTE9ORyA+IDMyKSB8fCAoZGVmaW5lZCBDT05GSUdfSElHSE1FTTY0RyAmJiBkZWZpbmVkIElQU19ISUdISU8pCisgICAgICAjZGVmaW5lIElQU19FTkFCTEVfRE1BNjQgICAgICAgICgxKQorICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgSVBTX0VOQUJMRV9ETUE2NCAgICAgICAgKDApCisgICAjZW5kaWYKKworICAgLyoKKyAgICAqIEFkYXB0ZXIgYWRkcmVzcyBtYXAgZXF1YXRlcworICAgICovCisgICAjZGVmaW5lIElQU19SRUdfSElTUiAgICAgICAgICAgICAgICAgMHgwOCAgICAvKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19DQ1NBUiAgICAgICAgICAgICAgICAweDEwICAgIC8qIENtZCBDaGFubmVsIFN5c3RlbSBBZGRyIFJlZyAqLworICAgI2RlZmluZSBJUFNfUkVHX0NDQ1IgICAgICAgICAgICAgICAgIDB4MTQgICAgLyogQ21kIENoYW5uZWwgQ29udHJvbCBSZWcgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfU1FIUiAgICAgICAgICAgICAgICAgMHgyMCAgICAvKiBTdGF0dXMgUSBIZWFkIFJlZyAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19TUVRSICAgICAgICAgICAgICAgICAweDI0ICAgIC8qIFN0YXR1cyBRIFRhaWwgUmVnICAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX1NRRVIgICAgICAgICAgICAgICAgIDB4MjggICAgLyogU3RhdHVzIFEgRW5kIFJlZyAgICAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfU1FTUiAgICAgICAgICAgICAgICAgMHgyQyAgICAvKiBTdGF0dXMgUSBTdGFydCBSZWcgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19TQ1BSICAgICAgICAgICAgICAgICAweDA1ICAgIC8qIFN1YnN5c3RlbSBjb250cm9sIHBvcnQgcmVnICAqLworICAgI2RlZmluZSBJUFNfUkVHX0lTUFIgICAgICAgICAgICAgICAgIDB4MDYgICAgLyogaW50ZXJydXB0IHN0YXR1cyBwb3J0IHJlZyAgICovCisgICAjZGVmaW5lIElQU19SRUdfQ0JTUCAgICAgICAgICAgICAgICAgMHgwNyAgICAvKiBDQlNQIHJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19GTEFQICAgICAgICAgICAgICAgICAweDE4ICAgIC8qIEZsYXNoIGFkZHJlc3MgcG9ydCAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX0ZMRFAgICAgICAgICAgICAgICAgIDB4MUMgICAgLyogRmxhc2ggZGF0YSBwb3J0ICAgICAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfTkRBRSAgICAgICAgICAgICAgICAgMHgzOCAgICAvKiBBbmFjb25kYSA2NCBOREFFIFJlZ2lzdGVyICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19JMk9fSU5NU0dRICAgICAgICAgICAweDQwICAgIC8qIEkyTyBJbmJvdW5kIE1lc3NhZ2UgUXVldWUgICAqLworICAgI2RlZmluZSBJUFNfUkVHX0kyT19PVVRNU0dRICAgICAgICAgIDB4NDQgICAgLyogSTJPIE91dGJvdW5kIE1lc3NhZ2UgUXVldWUgICovCisgICAjZGVmaW5lIElQU19SRUdfSTJPX0hJUiAgICAgICAgICAgICAgMHgzMCAgICAvKiBJMk8gSW50ZXJydXB0IFN0YXR1cyAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19JOTYwX0lEUiAgICAgICAgICAgICAweDIwICAgIC8qIGk5NjAgSW5ib3VuZCBEb29yYmVsbCAgICAgICAqLworICAgI2RlZmluZSBJUFNfUkVHX0k5NjBfTVNHMCAgICAgICAgICAgIDB4MTggICAgLyogaTk2MCBPdXRib3VuZCBSZWcgMCAgICAgICAgICovCisgICAjZGVmaW5lIElQU19SRUdfSTk2MF9NU0cxICAgICAgICAgICAgMHgxQyAgICAvKiBpOTYwIE91dGJvdW5kIFJlZyAxICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX1JFR19JOTYwX09JTVIgICAgICAgICAgICAweDM0ICAgIC8qIGk5NjAgT3Vib3VuZCBJbnQgTWFzayBSZWcgICAqLworCisgICAvKgorICAgICogQWRhcHRlciByZWdpc3RlciBiaXQgZXF1YXRlcworICAgICovCisgICAjZGVmaW5lIElQU19CSVRfR0hJICAgICAgICAgICAgICAgICAgMHgwNCAgICAvKiBISVNSIEdlbmVyYWwgSG9zdCBJbnRlcnJ1cHQgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9TUU8gICAgICAgICAgICAgICAgICAweDAyICAgIC8qIEhJU1IgU3RhdHVzIFEgT3ZlcmZsb3cgICAgICAqLworICAgI2RlZmluZSBJUFNfQklUX1NDRSAgICAgICAgICAgICAgICAgIDB4MDEgICAgLyogSElTUiBTdGF0dXMgQ2hhbm5lbCBFbnF1ZXVlICovCisgICAjZGVmaW5lIElQU19CSVRfU0VNICAgICAgICAgICAgICAgICAgMHgwOCAgICAvKiBDQ0NSIFNlbWFwaG9yZSBCaXQgICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9JTEUgICAgICAgICAgICAgICAgICAweDEwICAgIC8qIENDQ1IgSUxFIEJpdCAgICAgICAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfQklUX1NUQVJUX0NNRCAgICAgICAgICAgIDB4MTAxQSAgLyogQ0NDUiBTdGFydCBDb21tYW5kIENoYW5uZWwgICovCisgICAjZGVmaW5lIElQU19CSVRfU1RBUlRfU1RPUCAgICAgICAgICAgMHgwMDAyICAvKiBDQ0NSIFN0YXJ0L1N0b3AgQml0ICAgICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9SU1QgICAgICAgICAgICAgICAgICAweDgwICAgIC8qIFNDUFIgUmVzZXQgQml0ICAgICAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfQklUX0VCTSAgICAgICAgICAgICAgICAgIDB4MDIgICAgLyogU0NQUiBFbmFibGUgQnVzIE1hc3RlciAgICAgICovCisgICAjZGVmaW5lIElQU19CSVRfRUkgICAgICAgICAgICAgICAgICAgMHg4MCAgICAvKiBISVNSIEVuYWJsZSBJbnRlcnJ1cHRzICAgICAgKi8KKyAgICNkZWZpbmUgSVBTX0JJVF9PUCAgICAgICAgICAgICAgICAgICAweDAxICAgIC8qIE9QIGJpdCBpbiBDQlNQICAgICAgICAgICAgICAqLworICAgI2RlZmluZSBJUFNfQklUX0kyT19PUFFJICAgICAgICAgICAgIDB4MDggICAgLyogR2VuZXJhbCBIb3N0IEludGVycnVwdCAgICAgICovCisgICAjZGVmaW5lIElQU19CSVRfSTk2MF9NU0cwSSAgICAgICAgICAgMHgwMSAgICAvKiBNZXNzYWdlIFJlZ2lzdGVyIDAgSW50ZXJydXB0Ki8KKyAgICNkZWZpbmUgSVBTX0JJVF9JOTYwX01TRzFJICAgICAgICAgICAweDAyICAgIC8qIE1lc3NhZ2UgUmVnaXN0ZXIgMSBJbnRlcnJ1cHQqLworCisgICAvKgorICAgICogQWRhcHRlciBDb21tYW5kIElEIEVxdWF0ZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfQ01EX0dFVF9MRF9JTkZPICAgICAgICAgIDB4MTkKKyAgICNkZWZpbmUgSVBTX0NNRF9HRVRfU1VCU1lTICAgICAgICAgICAweDQwCisgICAjZGVmaW5lIElQU19DTURfUkVBRF9DT05GICAgICAgICAgICAgMHgzOAorICAgI2RlZmluZSBJUFNfQ01EX1JXX05WUkFNX1BBR0UgICAgICAgIDB4QkMKKyAgICNkZWZpbmUgSVBTX0NNRF9SRUFEICAgICAgICAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19DTURfV1JJVEUgICAgICAgICAgICAgICAgMHgwMworICAgI2RlZmluZSBJUFNfQ01EX0ZGREMgICAgICAgICAgICAgICAgIDB4RDcKKyAgICNkZWZpbmUgSVBTX0NNRF9FTlFVSVJZICAgICAgICAgICAgICAweDA1CisgICAjZGVmaW5lIElQU19DTURfRkxVU0ggICAgICAgICAgICAgICAgMHgwQQorICAgI2RlZmluZSBJUFNfQ01EX1JFQURfU0cgICAgICAgICAgICAgIDB4ODIKKyAgICNkZWZpbmUgSVBTX0NNRF9XUklURV9TRyAgICAgICAgICAgICAweDgzCisgICAjZGVmaW5lIElQU19DTURfRENEQiAgICAgICAgICAgICAgICAgMHgwNAorICAgI2RlZmluZSBJUFNfQ01EX0RDREJfU0cgICAgICAgICAgICAgIDB4ODQKKyAgICNkZWZpbmUgSVBTX0NNRF9FWFRFTkRFRF9EQ0RCIAkgICAgMHg5NQorICAgI2RlZmluZSBJUFNfQ01EX0VYVEVOREVEX0RDREJfU0cJICAgIDB4OTYKKyAgICNkZWZpbmUgSVBTX0NNRF9DT05GSUdfU1lOQyAgICAgICAgICAweDU4CisgICAjZGVmaW5lIElQU19DTURfRVJST1JfVEFCTEUgICAgICAgICAgMHgxNworICAgI2RlZmluZSBJUFNfQ01EX0RPV05MT0FEICAgICAgICAgICAgIDB4MjAKKyAgICNkZWZpbmUgSVBTX0NNRF9SV19CSU9TRlcgICAgICAgICAgICAweDIyCisgICAjZGVmaW5lIElQU19DTURfR0VUX1ZFUlNJT05fSU5GTyAgICAgMHhDNgorICAgI2RlZmluZSBJUFNfQ01EX1JFU0VUX0NIQU5ORUwgICAgICAgIDB4MUEgIAorCisgICAvKgorICAgICogQWRhcHRlciBFcXVhdGVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0NTTCAgICAgICAgICAgICAgICAgICAgICAweEZGCisgICAjZGVmaW5lIElQU19QT0NMICAgICAgICAgICAgICAgICAgICAgMHgzMAorICAgI2RlZmluZSBJUFNfTk9STV9TVEFURSAgICAgICAgICAgICAgIDB4MDAKKyAgICNkZWZpbmUgSVBTX01BWF9BREFQVEVSX1RZUEVTICAgICAgICAzCisgICAjZGVmaW5lIElQU19NQVhfQURBUFRFUlMgICAgICAgICAgICAgMTYKKyAgICNkZWZpbmUgSVBTX01BWF9JT0NUTCAgICAgICAgICAgICAgICAxCisgICAjZGVmaW5lIElQU19NQVhfSU9DVExfUVVFVUUgICAgICAgICAgOAorICAgI2RlZmluZSBJUFNfTUFYX1FVRVVFICAgICAgICAgICAgICAgIDEyOAorICAgI2RlZmluZSBJUFNfQkxLU0laRSAgICAgICAgICAgICAgICAgIDUxMgorICAgI2RlZmluZSBJUFNfTUFYX1NHICAgICAgICAgICAgICAgICAgIDE3CisgICAjZGVmaW5lIElQU19NQVhfTEQgICAgICAgICAgICAgICAgICAgOAorICAgI2RlZmluZSBJUFNfTUFYX0NIQU5ORUxTICAgICAgICAgICAgIDQKKyAgICNkZWZpbmUgSVBTX01BWF9UQVJHRVRTICAgICAgICAgICAgICAxNQorICAgI2RlZmluZSBJUFNfTUFYX0NIVU5LUyAgICAgICAgICAgICAgIDE2CisgICAjZGVmaW5lIElQU19NQVhfQ01EUyAgICAgICAgICAgICAgICAgMTI4CisgICAjZGVmaW5lIElQU19NQVhfWEZFUiAgICAgICAgICAgICAgICAgMHgxMDAwMAorICAgI2RlZmluZSBJUFNfTlZSQU1fUDVfU0lHICAgICAgICAgICAgIDB4RkZEREJCOTkKKyAgICNkZWZpbmUgSVBTX01BWF9QT1NUX0JZVEVTICAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19NQVhfQ09ORklHX0JZVEVTICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfR09PRF9QT1NUX1NUQVRVUyAgICAgICAgIDB4ODAKKyAgICNkZWZpbmUgSVBTX1NFTV9USU1FT1VUICAgICAgICAgICAgICAyMDAwCisgICAjZGVmaW5lIElQU19JT0NUTF9DT01NQU5EICAgICAgICAgICAgMHgwRAorICAgI2RlZmluZSBJUFNfSU5UUl9PTiAgICAgICAgICAgICAgICAgIDAKKyAgICNkZWZpbmUgSVBTX0lOVFJfSU9STCAgICAgICAgICAgICAgICAxCisgICAjZGVmaW5lIElQU19GRkRDICAgICAgICAgICAgICAgICAgICAgOTkKKyAgICNkZWZpbmUgSVBTX0FEQVBURVJfSUQgICAgICAgICAgICAgICAweEYKKyAgICNkZWZpbmUgSVBTX1ZFTkRPUklEX0lCTSAgICAgICAgICAgICAweDEwMTQKKyAgICNkZWZpbmUgSVBTX1ZFTkRPUklEX0FEQVBURUMgICAgICAgICAweDkwMDUKKyAgICNkZWZpbmUgSVBTX0RFVklDRUlEX0NPUFBFUkhFQUQgICAgICAweDAwMkUKKyAgICNkZWZpbmUgSVBTX0RFVklDRUlEX01PUlBIRVVTICAgICAgICAweDAxQkQKKyAgICNkZWZpbmUgSVBTX0RFVklDRUlEX01BUkNPICAgICAgICAgICAweDAyNTAKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzRNICAgICAgICAgICAweDAxQkUKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzRMICAgICAgICAgICAweDAxQkYKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzRNWCAgICAgICAgICAweDAyMDgKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzRMWCAgICAgICAgICAweDAyMEUKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzVJMiAgICAgICAgICAweDAyNTkKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzVJMSAgICAgICAgICAweDAyNTgKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzZNICAgICAgICAgICAweDAyNzkKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzZJICAgICAgICAgICAweDAyOEMKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzdrICAgICAgICAgICAweDAyOEUKKyAgICNkZWZpbmUgSVBTX1NVQkRFVklDRUlEXzdNICAgICAgICAgICAweDAyOEYKKyAgICNkZWZpbmUgSVBTX0lPQ1RMX1NJWkUgICAgICAgICAgICAgICA4MTkyCisgICAjZGVmaW5lIElQU19TVEFUVVNfU0laRSAgICAgICAgICAgICAgNAorICAgI2RlZmluZSBJUFNfU1RBVFVTX1FfU0laRSAgICAgICAgICAgIChJUFNfTUFYX0NNRFMrMSkgKiBJUFNfU1RBVFVTX1NJWkUKKyAgICNkZWZpbmUgSVBTX0lNQUdFX1NJWkUgICAgICAgICAgICAgICA1MDAgKiAxMDI0CisgICAjZGVmaW5lIElQU19NRU1NQVBfU0laRSAgICAgICAgICAgICAgMTI4CisgICAjZGVmaW5lIElQU19PTkVfTVNFQyAgICAgICAgICAgICAgICAgMQorICAgI2RlZmluZSBJUFNfT05FX1NFQyAgICAgICAgICAgICAgICAgIDEwMDAKKworICAgLyoKKyAgICAqIEdlb21ldHJ5IFNldHRpbmdzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0NPTVBfSEVBRFMgICAgICAgICAgICAgICAxMjgKKyAgICNkZWZpbmUgSVBTX0NPTVBfU0VDVE9SUyAgICAgICAgICAgICAzMgorICAgI2RlZmluZSBJUFNfTk9STV9IRUFEUyAgICAgICAgICAgICAgIDI1NAorICAgI2RlZmluZSBJUFNfTk9STV9TRUNUT1JTICAgICAgICAgICAgIDYzCisKKyAgIC8qCisgICAgKiBBZGFwdGVyIEJhc2ljIFN0YXR1cyBDb2RlcworICAgICovCisgICAjZGVmaW5lIElQU19CQVNJQ19TVEFUVVNfTUFTSyAgICAgICAgMHhGRgorICAgI2RlZmluZSBJUFNfR1NDX1NUQVRVU19NQVNLICAgICAgICAgIDB4MEYKKyAgICNkZWZpbmUgSVBTX0NNRF9TVUNDRVNTICAgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19DTURfUkVDT1ZFUkVEX0VSUk9SICAgICAgMHgwMQorICAgI2RlZmluZSBJUFNfSU5WQUxfT1BDTyAgICAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX0lOVkFMX0NNRF9CTEsgICAgICAgICAgICAweDA0CisgICAjZGVmaW5lIElQU19JTlZBTF9QQVJNX0JMSyAgICAgICAgICAgMHgwNQorICAgI2RlZmluZSBJUFNfQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyAgICNkZWZpbmUgSVBTX0NNRF9DTVBMVF9XRVJST1IgICAgICAgICAweDBDCisgICAjZGVmaW5lIElQU19MRF9FUlJPUiAgICAgICAgICAgICAgICAgMHgwRAorICAgI2RlZmluZSBJUFNfQ01EX1RJTUVPVVQgICAgICAgICAgICAgIDB4MEUKKyAgICNkZWZpbmUgSVBTX1BIWVNfRFJWX0VSUk9SICAgICAgICAgICAweDBGCisKKyAgIC8qCisgICAgKiBBZGFwdGVyIEV4dGVuZGVkIFN0YXR1cyBFcXVhdGVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0VSUl9TRUxfVE8gICAgICAgICAgICAgICAweEYwCisgICAjZGVmaW5lIElQU19FUlJfT1VfUlVOICAgICAgICAgICAgICAgMHhGMgorICAgI2RlZmluZSBJUFNfRVJSX0hPU1RfUkVTRVQgICAgICAgICAgIDB4RjcKKyAgICNkZWZpbmUgSVBTX0VSUl9ERVZfUkVTRVQgICAgICAgICAgICAweEY4CisgICAjZGVmaW5lIElQU19FUlJfUkVDT1ZFUlkgICAgICAgICAgICAgMHhGQworICAgI2RlZmluZSBJUFNfRVJSX0NLQ09ORCAgICAgICAgICAgICAgIDB4RkYKKworICAgLyoKKyAgICAqIE9wZXJhdGluZyBTeXN0ZW0gRGVmaW5lcworICAgICovCisgICAjZGVmaW5lIElQU19PU19XSU5ET1dTX05UICAgICAgICAgICAgMHgwMQorICAgI2RlZmluZSBJUFNfT1NfTkVUV0FSRSAgICAgICAgICAgICAgIDB4MDIKKyAgICNkZWZpbmUgSVBTX09TX09QRU5TRVJWRVIgICAgICAgICAgICAweDAzCisgICAjZGVmaW5lIElQU19PU19VTklYV0FSRSAgICAgICAgICAgICAgMHgwNAorICAgI2RlZmluZSBJUFNfT1NfU09MQVJJUyAgICAgICAgICAgICAgIDB4MDUKKyAgICNkZWZpbmUgSVBTX09TX09TMiAgICAgICAgICAgICAgICAgICAweDA2CisgICAjZGVmaW5lIElQU19PU19MSU5VWCAgICAgICAgICAgICAgICAgMHgwNworICAgI2RlZmluZSBJUFNfT1NfRlJFRUJTRCAgICAgICAgICAgICAgIDB4MDgKKworICAgLyoKKyAgICAqIEFkYXB0ZXIgUmV2aXNpb24gSUQncworICAgICovCisgICAjZGVmaW5lIElQU19SRVZJRF9TRVJWRVJBSUQgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfUkVWSURfTkFWQUpPICAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX1JFVklEX1NFUlZFUkFJRDIgICAgICAgICAweDA0CisgICAjZGVmaW5lIElQU19SRVZJRF9DTEFSSU5FVFAxICAgICAgICAgMHgwNQorICAgI2RlZmluZSBJUFNfUkVWSURfQ0xBUklORVRQMiAgICAgICAgIDB4MDcKKyAgICNkZWZpbmUgSVBTX1JFVklEX0NMQVJJTkVUUDMgICAgICAgICAweDBECisgICAjZGVmaW5lIElQU19SRVZJRF9UUk9NQk9ORTMyICAgICAgICAgMHgwRgorICAgI2RlZmluZSBJUFNfUkVWSURfVFJPTUJPTkU2NCAgICAgICAgIDB4MTAKKworICAgLyoKKyAgICAqIE5WUkFNIFBhZ2UgNSBBZGFwdGVyIERlZmluZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRCAgICAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQyICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19BRFRZUEVfTkFWQUpPICAgICAgICAgICAgMHgwMworICAgI2RlZmluZSBJUFNfQURUWVBFX0tJT1dBICAgICAgICAgICAgIDB4MDQKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQzICAgICAgICAweDA1CisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlEM0wgICAgICAgMHgwNgorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDRIICAgICAgIDB4MDcKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TSAgICAgICAweDA4CisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlENEwgICAgICAgMHgwOQorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDRNWCAgICAgIDB4MEEKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ0TFggICAgICAweDBCCisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlENUkyICAgICAgMHgwQworICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDVJMSAgICAgIDB4MEQKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ2TSAgICAgICAweDBFCisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlENkkgICAgICAgMHgwRgorICAgI2RlZmluZSBJUFNfQURUWVBFX1NFUlZFUkFJRDd0ICAgICAgIDB4MTAKKyAgICNkZWZpbmUgSVBTX0FEVFlQRV9TRVJWRVJBSUQ3ayAgICAgICAweDExCisgICAjZGVmaW5lIElQU19BRFRZUEVfU0VSVkVSQUlEN00gICAgICAgMHgxMgorCisgICAvKgorICAgICogQWRhcHRlciBDb21tYW5kL1N0YXR1cyBQYWNrZXQgRGVmaW5pdGlvbnMKKyAgICAqLworICAgI2RlZmluZSBJUFNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgIDB4MDEgLyogU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAgICAgICAqLworICAgI2RlZmluZSBJUFNfU1VDQ0VTU19JTU0gICAgICAgICAgICAgIDB4MDIgLyogU3VjY2VzcyAtIEltbWVkaWF0ZWx5ICAgICAgICAqLworICAgI2RlZmluZSBJUFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgIDB4MDQgLyogQ29tcGxldGVkIHdpdGggRXJyb3IgICAgICAgICAqLworCisgICAvKgorICAgICogTG9naWNhbCBEcml2ZSBFcXVhdGVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX0xEX09GRkxJTkUgICAgICAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19MRF9PS0FZICAgICAgICAgICAgICAgICAgMHgwMworICAgI2RlZmluZSBJUFNfTERfRlJFRSAgICAgICAgICAgICAgICAgIDB4MDAKKyAgICNkZWZpbmUgSVBTX0xEX1NZUyAgICAgICAgICAgICAgICAgICAweDA2CisgICAjZGVmaW5lIElQU19MRF9DUlMgICAgICAgICAgICAgICAgICAgMHgyNAorCisgICAvKgorICAgICogRENEQiBUYWJsZSBFcXVhdGVzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX05PX0RJU0NPTk5FQ1QgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19ESVNDT05ORUNUX0FMTE9XRUQgICAgICAgMHg4MAorICAgI2RlZmluZSBJUFNfTk9fQVVUT19SRVFTRU4gICAgICAgICAgIDB4NDAKKyAgICNkZWZpbmUgSVBTX0RBVEFfTk9ORSAgICAgICAgICAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19EQVRBX1VOSyAgICAgICAgICAgICAgICAgMHgwMAorICAgI2RlZmluZSBJUFNfREFUQV9JTiAgICAgICAgICAgICAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX0RBVEFfT1VUICAgICAgICAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19UUkFOU0ZFUjY0SyAgICAgICAgICAgICAgMHgwOAorICAgI2RlZmluZSBJUFNfTk9USU1FT1VUICAgICAgICAgICAgICAgIDB4MDAKKyAgICNkZWZpbmUgSVBTX1RJTUVPVVQxMCAgICAgICAgICAgICAgICAweDEwCisgICAjZGVmaW5lIElQU19USU1FT1VUNjAgICAgICAgICAgICAgICAgMHgyMAorICAgI2RlZmluZSBJUFNfVElNRU9VVDIwTSAgICAgICAgICAgICAgIDB4MzAKKworICAgLyoKKyAgICAqIFNDU0kgSW5xdWlyeSBEYXRhIEZsYWdzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1RZUEVfREFTRCAgICAgICAweDAwCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9UWVBFX1BST0NFU1NPUiAgMHgwMworICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfTFVfQ09OTkVDVEVEICAgIDB4MDAKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1JEX1JFVjIgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9SRVYyICAgICAgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfUkVWMyAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX0FkZHJlc3MxNiAgICAgICAweDAxCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9BZGRyZXNzMzIgICAgICAgMHgwMgorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfTWVkQ2hhbmdlciAgICAgIDB4MDgKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX011bHRpUG9ydCAgICAgICAweDEwCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9FbmNTZXJ2ICAgICAgICAgMHg0MAorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfU29mdFJlc2V0ICAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX0NtZFF1ZSAgICAgICAgICAweDAyCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9MaW5rZWQgICAgICAgICAgMHgwOAorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfU3luYyAgICAgICAgICAgIDB4MTAKKyAgICNkZWZpbmUgSVBTX1NDU0lfSU5RX1dCdXMxNiAgICAgICAgICAweDIwCisgICAjZGVmaW5lIElQU19TQ1NJX0lOUV9XQnVzMzIgICAgICAgICAgMHg0MAorICAgI2RlZmluZSBJUFNfU0NTSV9JTlFfUmVsQWRyICAgICAgICAgIDB4ODAKKworICAgLyoKKyAgICAqIFNDU0kgUmVxdWVzdCBTZW5zZSBEYXRhIEZsYWdzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX1NDU0lfUkVRU0VOX1ZBTElEICAgICAgICAweDgwCisgICAjZGVmaW5lIElQU19TQ1NJX1JFUVNFTl9DVVJSRU5UX0VSUiAgMHg3MAorICAgI2RlZmluZSBJUFNfU0NTSV9SRVFTRU5fTk9fU0VOU0UgICAgIDB4MDAKKworICAgLyoKKyAgICAqIFNDU0kgTW9kZSBQYWdlIEVxdWF0ZXMKKyAgICAqLworICAgI2RlZmluZSBJUFNfU0NTSV9NUDNfU29mdFNlY3RvciAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX1NDU0lfTVAzX0hhcmRTZWN0b3IgICAgICAweDAyCisgICAjZGVmaW5lIElQU19TQ1NJX01QM19SZW1vdmVhYmxlICAgICAgMHgwNAorICAgI2RlZmluZSBJUFNfU0NTSV9NUDNfQWxsb2NhdGVTdXJmYWNlIDB4MDgKKworICAgLyoKKyAgICAqIEhBIEZsYWdzCisgICAgKi8KKworICAgI2RlZmluZSBJUFNfSEFfRU5IX1NHICAgICAgICAgICAgICAgIDB4MQorCisgICAvKgorICAgICogU0NCIEZsYWdzCisgICAgKi8KKyAgICNkZWZpbmUgSVBTX1NDQl9NQVBfU0cgICAgICAgICAgICAgICAweDAwMDA4CisgICAjZGVmaW5lIElQU19TQ0JfTUFQX1NJTkdMRSAgICAgICAgICAgMFgwMDAxMAorCisgICAvKgorICAgICogUGFzc3RocnUgc3R1ZmYKKyAgICAqLworICAgI2RlZmluZSBJUFNfQ09QUFVTUkNNRCAgICAgICAgICAgICAgKCgnQyc8PDgpIHwgNjUpCisgICAjZGVmaW5lIElQU19DT1BQSU9DQ01EICAgICAgICAgICAgICAoKCdDJzw8OCkgfCA2NikKKyAgICNkZWZpbmUgSVBTX05VTUNUUkxTICAgICAgICAgICAgICAgICgoJ0MnPDw4KSB8IDY4KQorICAgI2RlZmluZSBJUFNfQ1RSTElORk8gICAgICAgICAgICAgICAgKCgnQyc8PDgpIHwgNjkpCisKKyAgIC8qIGZsYXNoaW5nIGRlZmluZXMgKi8KKyAgICNkZWZpbmUgSVBTX0ZXX0lNQUdFICAgICAgICAgICAgICAgIDB4MDAKKyAgICNkZWZpbmUgSVBTX0JJT1NfSU1BR0UgICAgICAgICAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX1dSSVRFX0ZXICAgICAgICAgICAgICAgIDB4MDEKKyAgICNkZWZpbmUgSVBTX1dSSVRFX0JJT1MgICAgICAgICAgICAgIDB4MDIKKyAgICNkZWZpbmUgSVBTX0VSQVNFX0JJT1MgICAgICAgICAgICAgIDB4MDMKKyAgICNkZWZpbmUgSVBTX0JJT1NfSEVBREVSICAgICAgICAgICAgIDB4QzAKKworICAgLyogdGltZSBvcmllbnRlZCBzdHVmZiAqLworICAgI2RlZmluZSBJUFNfSVNfTEVBUF9ZRUFSKHkpICAgICAgICAgICAoKCh5ICUgNCA9PSAwKSAmJiAoKHkgJSAxMDAgIT0gMCkgfHwgKHkgJSA0MDAgPT0gMCkpKSA/IDEgOiAwKQorICAgI2RlZmluZSBJUFNfTlVNX0xFQVBfWUVBUlNfVEhST1VHSCh5KSAoKHkpIC8gNCAtICh5KSAvIDEwMCArICh5KSAvIDQwMCkKKworICAgI2RlZmluZSBJUFNfU0VDU19NSU4gICAgICAgICAgICAgICAgIDYwCisgICAjZGVmaW5lIElQU19TRUNTX0hPVVIgICAgICAgICAgICAgICAgMzYwMAorICAgI2RlZmluZSBJUFNfU0VDU184SE9VUlMgICAgICAgICAgICAgIDI4ODAwCisgICAjZGVmaW5lIElQU19TRUNTX0RBWSAgICAgICAgICAgICAgICAgODY0MDAKKyAgICNkZWZpbmUgSVBTX0RBWVNfTk9STUFMX1lFQVIgICAgICAgICAzNjUKKyAgICNkZWZpbmUgSVBTX0RBWVNfTEVBUF9ZRUFSICAgICAgICAgICAzNjYKKyAgICNkZWZpbmUgSVBTX0VQT0NIX1lFQVIgICAgICAgICAgICAgICAxOTcwCisKKyAgIC8qCisgICAgKiBTY3NpX0hvc3QgVGVtcGxhdGUKKyAgICAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgc3RhdGljIGludCBpcHNfcHJvYzI0X2luZm8oY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQsIGludCk7CisgICBzdGF0aWMgdm9pZCBpcHNfc2VsZWN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBTY3NpX0hvc3QgKiwgU2NzaV9EZXZpY2UgKik7CisgICBzdGF0aWMgaW50IGlwc19iaW9zcGFyYW0oRGlzayAqZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSk7CisjZWxzZQorICAgc3RhdGljIGludCBpcHNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQpOworICAgc3RhdGljIGludCBpcHNfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pOworICAgc3RhdGljIGludCBpcHNfc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICpTRHB0cik7CisjZW5kaWYKKworLyoKKyAqIFJhaWQgQ29tbWFuZCBGb3JtYXRzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgbG9nX2RydjsKKyAgIHVpbnQ4X3QgIHNnX2NvdW50OworICAgdWludDMyX3QgbGJhOworICAgdWludDMyX3Qgc2dfYWRkcjsKKyAgIHVpbnQxNl90IHNlY3Rvcl9jb3VudDsKKyAgIHVpbnQ4X3QgIHNlZ21lbnRfNEc7CisgICB1aW50OF90ICBlbmhhbmNlZF9zZzsKKyAgIHVpbnQzMl90IGNjc2FyOworICAgdWludDMyX3QgY2NjcjsKK30gSVBTX0lPX0NNRCwgKlBJUFNfSU9fQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQxNl90IHJlc2VydmVkOworICAgdWludDMyX3QgcmVzZXJ2ZWQyOworICAgdWludDMyX3QgYnVmZmVyX2FkZHI7CisgICB1aW50MzJfdCByZXNlcnZlZDM7CisgICB1aW50MzJfdCBjY3NhcjsKKyAgIHVpbnQzMl90IGNjY3I7Cit9IElQU19MRF9DTUQsICpQSVBTX0xEX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICByZXNlcnZlZDsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IHJlc2VydmVkMzsKKyAgIHVpbnQzMl90IGJ1ZmZlcl9hZGRyOworICAgdWludDMyX3QgcmVzZXJ2ZWQ0OworfSBJUFNfSU9DVExfQ01ELCAqUElQU19JT0NUTF9DTUQ7IAorCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQ4X3QgIGNoYW5uZWw7CisgICB1aW50OF90ICByZXNlcnZlZDM7CisgICB1aW50OF90ICByZXNlcnZlZDQ7CisgICB1aW50OF90ICByZXNlcnZlZDU7CisgICB1aW50OF90ICByZXNlcnZlZDY7CisgICB1aW50OF90ICByZXNlcnZlZDc7CisgICB1aW50OF90ICByZXNlcnZlZDg7CisgICB1aW50OF90ICByZXNlcnZlZDk7CisgICB1aW50OF90ICByZXNlcnZlZDEwOworICAgdWludDhfdCAgcmVzZXJ2ZWQxMTsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkMTI7CisgICB1aW50OF90ICByZXNlcnZlZDEzOworICAgdWludDhfdCAgcmVzZXJ2ZWQxNDsKKyAgIHVpbnQ4X3QgIGFkYXB0ZXJfZmxhZzsKK30gSVBTX1JFU0VUX0NNRCwgKlBJUFNfUkVTRVRfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQxNl90IHJlc2VydmVkOworICAgdWludDMyX3QgcmVzZXJ2ZWQyOworICAgdWludDMyX3QgZGNkYl9hZGRyZXNzOworICAgdWludDE2X3QgcmVzZXJ2ZWQzOworICAgdWludDhfdCAgc2VnbWVudF80RzsKKyAgIHVpbnQ4X3QgIGVuaGFuY2VkX3NnOworICAgdWludDMyX3QgY2NzYXI7CisgICB1aW50MzJfdCBjY2NyOworfSBJUFNfRENEQl9DTUQsICpQSVBTX0RDREJfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQ4X3QgIGNoYW5uZWw7CisgICB1aW50OF90ICBzb3VyY2VfdGFyZ2V0OworICAgdWludDMyX3QgcmVzZXJ2ZWQ7CisgICB1aW50MzJfdCByZXNlcnZlZDI7CisgICB1aW50MzJfdCByZXNlcnZlZDM7CisgICB1aW50MzJfdCBjY3NhcjsKKyAgIHVpbnQzMl90IGNjY3I7Cit9IElQU19DU19DTUQsICpQSVBTX0NTX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICBsb2dfZHJ2OworICAgdWludDhfdCAgY29udHJvbDsKKyAgIHVpbnQzMl90IHJlc2VydmVkOworICAgdWludDMyX3QgcmVzZXJ2ZWQyOworICAgdWludDMyX3QgcmVzZXJ2ZWQzOworICAgdWludDMyX3QgY2NzYXI7CisgICB1aW50MzJfdCBjY2NyOworfSBJUFNfVVNfQ01ELCAqUElQU19VU19DTUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICB1aW50OF90ICBjb21tYW5kX2lkOworICAgdWludDhfdCAgcmVzZXJ2ZWQ7CisgICB1aW50OF90ICBzdGF0ZTsKKyAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IHJlc2VydmVkMzsKKyAgIHVpbnQzMl90IHJlc2VydmVkNDsKKyAgIHVpbnQzMl90IGNjc2FyOworICAgdWludDMyX3QgY2NjcjsKK30gSVBTX0ZDX0NNRCwgKlBJUFNfRkNfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkOworICAgdWludDhfdCAgZGVzYzsKKyAgIHVpbnQzMl90IHJlc2VydmVkMjsKKyAgIHVpbnQzMl90IGJ1ZmZlcl9hZGRyOworICAgdWludDMyX3QgcmVzZXJ2ZWQzOworICAgdWludDMyX3QgY2NzYXI7CisgICB1aW50MzJfdCBjY2NyOworfSBJUFNfU1RBVFVTX0NNRCwgKlBJUFNfU1RBVFVTX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICBwYWdlOworICAgdWludDhfdCAgd3JpdGU7CisgICB1aW50MzJfdCByZXNlcnZlZDsKKyAgIHVpbnQzMl90IGJ1ZmZlcl9hZGRyOworICAgdWludDMyX3QgcmVzZXJ2ZWQyOworICAgdWludDMyX3QgY2NzYXI7CisgICB1aW50MzJfdCBjY2NyOworfSBJUFNfTlZSQU1fQ01ELCAqUElQU19OVlJBTV9DTUQ7CisKK3R5cGVkZWYgc3RydWN0IAoreworICAgIHVpbnQ4X3QgIG9wX2NvZGU7CisgICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgICB1aW50MTZfdCByZXNlcnZlZDsKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICB1aW50MzJfdCBidWZmZXJfYWRkcjsKKyAgICB1aW50MzJfdCByZXNlcnZlZDI7Cit9IElQU19WRVJTSU9OX0lORk8sICpQSVBTX1ZFUlNJT05fSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICByZXNldF9jb3VudDsKKyAgIHVpbnQ4X3QgIHJlc2V0X3R5cGU7CisgICB1aW50OF90ICBzZWNvbmQ7CisgICB1aW50OF90ICBtaW51dGU7CisgICB1aW50OF90ICBob3VyOworICAgdWludDhfdCAgZGF5OworICAgdWludDhfdCAgcmVzZXJ2ZWQxWzRdOworICAgdWludDhfdCAgbW9udGg7CisgICB1aW50OF90ICB5ZWFySDsKKyAgIHVpbnQ4X3QgIHllYXJMOworICAgdWludDhfdCAgcmVzZXJ2ZWQyOworfSBJUFNfRkZEQ19DTUQsICpQSVBTX0ZGRENfQ01EOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBvcF9jb2RlOworICAgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgIHVpbnQ4X3QgIHR5cGU7CisgICB1aW50OF90ICBkaXJlY3Rpb247CisgICB1aW50MzJfdCBjb3VudDsKKyAgIHVpbnQzMl90IGJ1ZmZlcl9hZGRyOworICAgdWludDhfdCAgdG90YWxfcGFja2V0czsKKyAgIHVpbnQ4X3QgIHBhY2tldF9udW07CisgICB1aW50MTZfdCByZXNlcnZlZDsKK30gSVBTX0ZMQVNIRldfQ01ELCAqUElQU19GTEFTSEZXX0NNRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgb3BfY29kZTsKKyAgIHVpbnQ4X3QgIGNvbW1hbmRfaWQ7CisgICB1aW50OF90ICB0eXBlOworICAgdWludDhfdCAgZGlyZWN0aW9uOworICAgdWludDMyX3QgY291bnQ7CisgICB1aW50MzJfdCBidWZmZXJfYWRkcjsKKyAgIHVpbnQzMl90IG9mZnNldDsKK30gSVBTX0ZMQVNIQklPU19DTUQsICpQSVBTX0ZMQVNIQklPU19DTUQ7CisKK3R5cGVkZWYgdW5pb24geworICAgSVBTX0lPX0NNRCAgICAgICAgIGJhc2ljX2lvOworICAgSVBTX0xEX0NNRCAgICAgICAgIGxvZ2ljYWxfaW5mbzsKKyAgIElQU19JT0NUTF9DTUQgICAgICBpb2N0bF9pbmZvOworICAgSVBTX0RDREJfQ01EICAgICAgIGRjZGI7CisgICBJUFNfQ1NfQ01EICAgICAgICAgY29uZmlnX3N5bmM7CisgICBJUFNfVVNfQ01EICAgICAgICAgdW5sb2NrX3N0cmlwZTsKKyAgIElQU19GQ19DTUQgICAgICAgICBmbHVzaF9jYWNoZTsKKyAgIElQU19TVEFUVVNfQ01EICAgICBzdGF0dXM7CisgICBJUFNfTlZSQU1fQ01EICAgICAgbnZyYW07CisgICBJUFNfRkZEQ19DTUQgICAgICAgZmZkYzsKKyAgIElQU19GTEFTSEZXX0NNRCAgICBmbGFzaGZ3OworICAgSVBTX0ZMQVNIQklPU19DTUQgIGZsYXNoYmlvczsKKyAgIElQU19WRVJTSU9OX0lORk8gICB2ZXJzaW9uX2luZm87CisgICBJUFNfUkVTRVRfQ01EICAgICAgcmVzZXQ7Cit9IElQU19IT1NUX0NPTU1BTkQsICpQSVBTX0hPU1RfQ09NTUFORDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgbG9naWNhbF9pZDsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkOworICAgdWludDhfdCAgcmFpZF9sZXZlbDsKKyAgIHVpbnQ4X3QgIHN0YXRlOworICAgdWludDMyX3Qgc2VjdG9yX2NvdW50OworfSBJUFNfRFJJVkVfSU5GTywgKlBJUFNfRFJJVkVfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgICAgICBub19vZl9sb2dfZHJpdmU7CisgICB1aW50OF90ICAgICAgIHJlc2VydmVkWzNdOworICAgSVBTX0RSSVZFX0lORk8gZHJpdmVfaW5mb1tJUFNfTUFYX0xEXTsKK30gSVBTX0xEX0lORk8sICpQSVBTX0xEX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgICBkZXZpY2VfYWRkcmVzczsKKyAgIHVpbnQ4X3QgICBjbWRfYXR0cmlidXRlOworICAgdWludDE2X3QgIHRyYW5zZmVyX2xlbmd0aDsKKyAgIHVpbnQzMl90ICBidWZmZXJfcG9pbnRlcjsKKyAgIHVpbnQ4X3QgICBjZGJfbGVuZ3RoOworICAgdWludDhfdCAgIHNlbnNlX2xlbmd0aDsKKyAgIHVpbnQ4X3QgICBzZ19jb3VudDsKKyAgIHVpbnQ4X3QgICByZXNlcnZlZDsKKyAgIHVpbnQ4X3QgICBzY3NpX2NkYlsxMl07CisgICB1aW50OF90ICAgc2Vuc2VfaW5mb1s2NF07CisgICB1aW50OF90ICAgc2NzaV9zdGF0dXM7CisgICB1aW50OF90ICAgcmVzZXJ2ZWQyWzNdOworfSBJUFNfRENEQl9UQUJMRSwgKlBJUFNfRENEQl9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgIGRldmljZV9hZGRyZXNzOworICAgdWludDhfdCAgIGNtZF9hdHRyaWJ1dGU7CisgICB1aW50OF90ICAgY2RiX2xlbmd0aDsKKyAgIHVpbnQ4X3QgICByZXNlcnZlZF9mb3JfTFVOOyAJIAorICAgdWludDMyX3QgIHRyYW5zZmVyX2xlbmd0aDsKKyAgIHVpbnQzMl90ICBidWZmZXJfcG9pbnRlcjsKKyAgIHVpbnQxNl90ICBzZ19jb3VudDsKKyAgIHVpbnQ4X3QgICBzZW5zZV9sZW5ndGg7CisgICB1aW50OF90ICAgc2NzaV9zdGF0dXM7CisgICB1aW50MzJfdCAgcmVzZXJ2ZWQ7CisgICB1aW50OF90ICAgc2NzaV9jZGJbMTZdOworICAgdWludDhfdCAgIHNlbnNlX2luZm9bNTZdOworfSBJUFNfRENEQl9UQUJMRV9UQVBFLCAqUElQU19EQ0RCX1RBQkxFX1RBUEU7CisKK3R5cGVkZWYgdW5pb24geworICAgc3RydWN0IHsKKyAgICAgIHZvbGF0aWxlIHVpbnQ4X3QgIHJlc2VydmVkOworICAgICAgdm9sYXRpbGUgdWludDhfdCAgY29tbWFuZF9pZDsKKyAgICAgIHZvbGF0aWxlIHVpbnQ4X3QgIGJhc2ljX3N0YXR1czsKKyAgICAgIHZvbGF0aWxlIHVpbnQ4X3QgIGV4dGVuZGVkX3N0YXR1czsKKyAgIH0gZmllbGRzOworCisgICB2b2xhdGlsZSB1aW50MzJfdCAgICB2YWx1ZTsKK30gSVBTX1NUQVRVUywgKlBJUFNfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBJUFNfU1RBVFVTICAgICAgICAgICBzdGF0dXNbSVBTX01BWF9DTURTICsgMV07CisgICB2b2xhdGlsZSBQSVBTX1NUQVRVUyBwX3N0YXR1c19zdGFydDsKKyAgIHZvbGF0aWxlIFBJUFNfU1RBVFVTIHBfc3RhdHVzX2VuZDsKKyAgIHZvbGF0aWxlIFBJUFNfU1RBVFVTIHBfc3RhdHVzX3RhaWw7CisgICB2b2xhdGlsZSB1aW50MzJfdCAgICBod19zdGF0dXNfc3RhcnQ7CisgICB2b2xhdGlsZSB1aW50MzJfdCAgICBod19zdGF0dXNfdGFpbDsKK30gSVBTX0FEQVBURVIsICpQSVBTX0FEQVBURVI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIHVjTG9nRHJpdmVDb3VudDsKKyAgIHVpbnQ4X3QgIHVjTWlzY0ZsYWc7CisgICB1aW50OF90ICB1Y1NMVEZsYWc7CisgICB1aW50OF90ICB1Y0JTVEZsYWc7CisgICB1aW50OF90ICB1Y1B3ckNoZ0NudDsKKyAgIHVpbnQ4X3QgIHVjV3JvbmdBZHJDbnQ7CisgICB1aW50OF90ICB1Y1VuaWRlbnRDbnQ7CisgICB1aW50OF90ICB1Y05WcmFtRGV2Q2hnQ250OworICAgdWludDhfdCAgQ29kZUJsa1ZlcnNpb25bOF07CisgICB1aW50OF90ICBCb290QmxrVmVyc2lvbls4XTsKKyAgIHVpbnQzMl90IHVsRHJpdmVTaXplW0lQU19NQVhfTERdOworICAgdWludDhfdCAgdWNDb25jdXJyZW50Q21kQ291bnQ7CisgICB1aW50OF90ICB1Y01heFBoeXNpY2FsRGV2aWNlczsKKyAgIHVpbnQxNl90IHVzRmxhc2hSZXBnbUNvdW50OworICAgdWludDhfdCAgdWNEZWZ1bmN0RGlza0NvdW50OworICAgdWludDhfdCAgdWNSZWJ1aWxkRmxhZzsKKyAgIHVpbnQ4X3QgIHVjT2ZmbGluZUxvZ0RydkNvdW50OworICAgdWludDhfdCAgdWNDcml0aWNhbERydkNvdW50OworICAgdWludDE2X3QgdXNDb25maWdVcGRhdGVDb3VudDsKKyAgIHVpbnQ4X3QgIHVjQmxrRmxhZzsKKyAgIHVpbnQ4X3QgIHJlc2VydmVkOworICAgdWludDE2X3QgdXNBZGRyRGVhZERpc2tbSVBTX01BWF9DSEFOTkVMUyAqIChJUFNfTUFYX1RBUkdFVFMgKyAxKV07Cit9IElQU19FTlEsICpQSVBTX0VOUTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgdWNJbml0aWF0b3I7CisgICB1aW50OF90ICB1Y1BhcmFtZXRlcnM7CisgICB1aW50OF90ICB1Y01pc2NGbGFnOworICAgdWludDhfdCAgdWNTdGF0ZTsKKyAgIHVpbnQzMl90IHVsQmxvY2tDb3VudDsKKyAgIHVpbnQ4X3QgIHVjRGV2aWNlSWRbMjhdOworfSBJUFNfREVWU1RBVEUsICpQSVBTX0RFVlNUQVRFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICB1Y0NobjsKKyAgIHVpbnQ4X3QgIHVjVGd0OworICAgdWludDE2X3QgdWNSZXNlcnZlZDsKKyAgIHVpbnQzMl90IHVsU3RhcnRTZWN0OworICAgdWludDMyX3QgdWxOb09mU2VjdHM7Cit9IElQU19DSFVOSywgKlBJUFNfQ0hVTks7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQxNl90IHVjVXNlckZpZWxkOworICAgdWludDhfdCAgdWNTdGF0ZTsKKyAgIHVpbnQ4X3QgIHVjUmFpZENhY2hlUGFyYW07CisgICB1aW50OF90ICB1Y05vT2ZDaHVua1VuaXRzOworICAgdWludDhfdCAgdWNTdHJpcGVTaXplOworICAgdWludDhfdCAgdWNQYXJhbXM7CisgICB1aW50OF90ICB1Y1Jlc2VydmVkOworICAgdWludDMyX3QgdWxMb2dEcnZTaXplOworICAgSVBTX0NIVU5LIGNodW5rW0lQU19NQVhfQ0hVTktTXTsKK30gSVBTX0xELCAqUElQU19MRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgYm9hcmRfZGlzY1s4XTsKKyAgIHVpbnQ4X3QgIHByb2Nlc3Nvcls4XTsKKyAgIHVpbnQ4X3QgIHVjTm9DaGFuVHlwZTsKKyAgIHVpbnQ4X3QgIHVjTm9Ib3N0SW50VHlwZTsKKyAgIHVpbnQ4X3QgIHVjQ29tcHJlc3Npb247CisgICB1aW50OF90ICB1Y052cmFtVHlwZTsKKyAgIHVpbnQzMl90IHVsTnZyYW1TaXplOworfSBJUFNfSEFSRFdBUkUsICpQSVBTX0hBUkRXQVJFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICAgICAgICB1Y0xvZ0RyaXZlQ291bnQ7CisgICB1aW50OF90ICAgICAgICB1Y0RhdGVEOworICAgdWludDhfdCAgICAgICAgdWNEYXRlTTsKKyAgIHVpbnQ4X3QgICAgICAgIHVjRGF0ZVk7CisgICB1aW50OF90ICAgICAgICBpbml0X2lkWzRdOworICAgdWludDhfdCAgICAgICAgaG9zdF9pZFsxMl07CisgICB1aW50OF90ICAgICAgICB0aW1lX3NpZ25bOF07CisgICB1aW50MzJfdCAgICAgICBVc2VyT3B0OworICAgdWludDE2X3QgICAgICAgdXNlcl9maWVsZDsKKyAgIHVpbnQ4X3QgICAgICAgIHVjUmVidWlsZFJhdGU7CisgICB1aW50OF90ICAgICAgICB1Y1Jlc2VydmU7CisgICBJUFNfSEFSRFdBUkUgICBoYXJkd2FyZV9kaXNjOworICAgSVBTX0xEICAgICAgICAgbG9naWNhbF9kcml2ZVtJUFNfTUFYX0xEXTsKKyAgIElQU19ERVZTVEFURSAgIGRldltJUFNfTUFYX0NIQU5ORUxTXVtJUFNfTUFYX1RBUkdFVFMrMV07CisgICB1aW50OF90ICAgICAgICByZXNlcnZlZFs1MTJdOworfSBJUFNfQ09ORiwgKlBJUFNfQ09ORjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDMyX3QgIHNpZ25hdHVyZTsKKyAgIHVpbnQ4X3QgICByZXNlcnZlZDE7CisgICB1aW50OF90ICAgYWRhcHRlcl9zbG90OworICAgdWludDE2X3QgIGFkYXB0ZXJfdHlwZTsKKyAgIHVpbnQ4X3QgICBjdHJsX2Jpb3NbOF07CisgICB1aW50OF90ICAgdmVyc2lvbmluZzsgICAgICAgICAgICAgICAgICAgLyogMSA9IFZlcnNpb25pbmcgU3VwcG9ydGVkLCBlbHNlIDAgKi8KKyAgIHVpbnQ4X3QgICB2ZXJzaW9uX21pc21hdGNoOyAgICAgICAgICAgICAvKiAxID0gVmVyc2lvbmluZyBNaXNNYXRjaCwgIGVsc2UgMCAqLworICAgdWludDhfdCAgIHJlc2VydmVkMjsKKyAgIHVpbnQ4X3QgICBvcGVyYXRpbmdfc3lzdGVtOworICAgdWludDhfdCAgIGRyaXZlcl9oaWdoWzRdOworICAgdWludDhfdCAgIGRyaXZlcl9sb3dbNF07CisgICB1aW50OF90ICAgQmlvc0NvbXBhdGliaWxpdHlJRFs4XTsKKyAgIHVpbnQ4X3QgICBSZXNlcnZlZEZvck9TMls4XTsKKyAgIHVpbnQ4X3QgICBiaW9zX2hpZ2hbNF07ICAgICAgICAgICAgICAgICAvKiBBZGFwdGVyJ3MgRmxhc2hlZCBCSU9TIFZlcnNpb24gICAqLworICAgdWludDhfdCAgIGJpb3NfbG93WzRdOworICAgdWludDhfdCAgIGFkYXB0ZXJfb3JkZXJbMTZdOyAgICAgICAgICAgIC8qIEJJT1MgVGVsbGluZyB1cyB0aGUgU29ydCBPcmRlciAgICovCisgICB1aW50OF90ICAgRmlsbGVyWzYwXTsKK30gSVBTX05WUkFNX1A1LCAqUElQU19OVlJBTV9QNTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBEYXRhIHJldHVybmVkIGZyb20gYSBHZXRWZXJzaW9uIENvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWJTeXN0ZW0gUGFyYW1ldGVyWzRdICAgICAgKi8KKyNkZWZpbmUgIElQU19HRVRfVkVSU0lPTl9TVVBQT1JUIDB4MDAwMTgwMDAgIC8qIE1hc2sgZm9yIFZlcnNpb25pbmcgU3VwcG9ydCAqLworCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgIHVpbnQzMl90ICByZXZpc2lvbjsKKyAgIHVpbnQ4X3QgICBib290QmxrVmVyc2lvblszMl07CisgICB1aW50OF90ICAgYm9vdEJsa0F0dHJpYnV0ZXNbNF07CisgICB1aW50OF90ICAgY29kZUJsa1ZlcnNpb25bMzJdOworICAgdWludDhfdCAgIGJpb3NWZXJzaW9uWzMyXTsKKyAgIHVpbnQ4X3QgICBiaW9zQXR0cmlidXRlc1s0XTsKKyAgIHVpbnQ4X3QgICBjb21wYXRpYmlsaXR5SWRbMzJdOworICAgdWludDhfdCAgIHJlc2VydmVkWzRdOworfSBJUFNfVkVSU0lPTl9EQVRBOworCisKK3R5cGVkZWYgc3RydWN0IF9JUFNfU1VCU1lTIHsKKyAgIHVpbnQzMl90ICBwYXJhbVsxMjhdOworfSBJUFNfU1VCU1lTLCAqUElQU19TVUJTWVM7CisKKy8qKgorICoqIFNDU0kgU3RydWN0dXJlcworICoqLworCisvKgorICogSW5xdWlyeSBEYXRhIEZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICAgRGV2aWNlVHlwZTsKKyAgIHVpbnQ4X3QgICBEZXZpY2VUeXBlUXVhbGlmaWVyOworICAgdWludDhfdCAgIFZlcnNpb247CisgICB1aW50OF90ICAgUmVzcG9uc2VEYXRhRm9ybWF0OworICAgdWludDhfdCAgIEFkZGl0aW9uYWxMZW5ndGg7CisgICB1aW50OF90ICAgUmVzZXJ2ZWQ7CisgICB1aW50OF90ICAgRmxhZ3NbMl07CisgICB1aW50OF90ICAgVmVuZG9ySWRbOF07CisgICB1aW50OF90ICAgUHJvZHVjdElkWzE2XTsKKyAgIHVpbnQ4X3QgICBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsKKyAgIHVpbnQ4X3QgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb3ZpZGVzIE5VTEwgdGVybWluYXRvciB0byBuYW1lICovCit9IElQU19TQ1NJX0lOUV9EQVRBLCAqUElQU19TQ1NJX0lOUV9EQVRBOworCisvKgorICogUmVhZCBDYXBhY2l0eSBEYXRhIEZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50MzJfdCBsYmE7CisgICB1aW50MzJfdCBsZW47Cit9IElQU19TQ1NJX0NBUEFDSVRZOworCisvKgorICogUmVxdWVzdCBTZW5zZSBEYXRhIEZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBSZXNwb25zZUNvZGU7CisgICB1aW50OF90ICBTZWdtZW50TnVtYmVyOworICAgdWludDhfdCAgRmxhZ3M7CisgICB1aW50OF90ICBJbmZvcm1hdGlvbls0XTsKKyAgIHVpbnQ4X3QgIEFkZGl0aW9uYWxMZW5ndGg7CisgICB1aW50OF90ICBDb21tYW5kU3BlY2lmaWNbNF07CisgICB1aW50OF90ICBBZGRpdGlvbmFsU2Vuc2VDb2RlOworICAgdWludDhfdCAgQWRkaXRpb25hbFNlbnNlQ29kZVF1YWw7CisgICB1aW50OF90ICBGUlVDb2RlOworICAgdWludDhfdCAgU2Vuc2VLZXlTcGVjaWZpY1szXTsKK30gSVBTX1NDU0lfUkVRU0VOOworCisvKgorICogU2Vuc2UgRGF0YSBGb3JtYXQgLSBQYWdlIDMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgUGFnZUNvZGU7CisgICB1aW50OF90ICBQYWdlTGVuZ3RoOworICAgdWludDE2X3QgVHJhY2tzUGVyWm9uZTsKKyAgIHVpbnQxNl90IEFsdFNlY3RvcnNQZXJab25lOworICAgdWludDE2X3QgQWx0VHJhY2tzUGVyWm9uZTsKKyAgIHVpbnQxNl90IEFsdFRyYWNrc1BlclZvbHVtZTsKKyAgIHVpbnQxNl90IFNlY3RvcnNQZXJUcmFjazsKKyAgIHVpbnQxNl90IEJ5dGVzUGVyU2VjdG9yOworICAgdWludDE2X3QgSW50ZXJsZWF2ZTsKKyAgIHVpbnQxNl90IFRyYWNrU2tldzsKKyAgIHVpbnQxNl90IEN5bGluZGVyU2tldzsKKyAgIHVpbnQ4X3QgIGZsYWdzOworICAgdWludDhfdCAgcmVzZXJ2ZWRbM107Cit9IElQU19TQ1NJX01PREVfUEFHRTM7CisKKy8qCisgKiBTZW5zZSBEYXRhIEZvcm1hdCAtIFBhZ2UgNAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50OF90ICBQYWdlQ29kZTsKKyAgIHVpbnQ4X3QgIFBhZ2VMZW5ndGg7CisgICB1aW50MTZfdCBDeWxpbmRlcnNIaWdoOworICAgdWludDhfdCAgQ3lsaW5kZXJzTG93OworICAgdWludDhfdCAgSGVhZHM7CisgICB1aW50MTZfdCBXcml0ZVByZWNvbXBIaWdoOworICAgdWludDhfdCAgV3JpdGVQcmVjb21wTG93OworICAgdWludDE2X3QgUmVkdWNlZFdyaXRlQ3VycmVudEhpZ2g7CisgICB1aW50OF90ICBSZWR1Y2VkV3JpdGVDdXJyZW50TG93OworICAgdWludDE2X3QgU3RlcFJhdGU7CisgICB1aW50MTZfdCBMYW5kaW5nWm9uZUhpZ2g7CisgICB1aW50OF90ICBMYW5kaW5nWm9uZUxvdzsKKyAgIHVpbnQ4X3QgIGZsYWdzOworICAgdWludDhfdCAgUm90YXRpb25hbE9mZnNldDsKKyAgIHVpbnQ4X3QgIFJlc2VydmVkOworICAgdWludDE2X3QgTWVkaXVtUm90YXRpb25SYXRlOworICAgdWludDhfdCAgUmVzZXJ2ZWQyWzJdOworfSBJUFNfU0NTSV9NT0RFX1BBR0U0OworCisvKgorICogU2Vuc2UgRGF0YSBGb3JtYXQgLSBQYWdlIDgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgUGFnZUNvZGU7CisgICB1aW50OF90ICBQYWdlTGVuZ3RoOworICAgdWludDhfdCAgZmxhZ3M7CisgICB1aW50OF90ICBSZXRlbnRQcmlvOworICAgdWludDE2X3QgRGlzUHJlZmV0Y2hMZW47CisgICB1aW50MTZfdCBNaW5QcmVmZXRjaExlbjsKKyAgIHVpbnQxNl90IE1heFByZWZldGNoTGVuOworICAgdWludDE2X3QgTWF4UHJlZmV0Y2hDZWlsaW5nOworfSBJUFNfU0NTSV9NT0RFX1BBR0U4OworCisvKgorICogU2Vuc2UgRGF0YSBGb3JtYXQgLSBCbG9jayBEZXNjcmlwdG9yIChEQVNEKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICB1aW50MzJfdCBOdW1iZXJPZkJsb2NrczsKKyAgIHVpbnQ4X3QgIERlbnNpdHlDb2RlOworICAgdWludDE2X3QgQmxvY2tMZW5ndGhIaWdoOworICAgdWludDhfdCAgQmxvY2tMZW5ndGhMb3c7Cit9IElQU19TQ1NJX01PREVfUEFHRV9CTEtERVNDOworCisvKgorICogU2Vuc2UgRGF0YSBGb3JtYXQgLSBNb2RlIFBhZ2UgSGVhZGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgIERhdGFMZW5ndGg7CisgICB1aW50OF90ICBNZWRpdW1UeXBlOworICAgdWludDhfdCAgUmVzZXJ2ZWQ7CisgICB1aW50OF90ICBCbG9ja0Rlc2NMZW5ndGg7Cit9IElQU19TQ1NJX01PREVfUEFHRV9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIElQU19TQ1NJX01PREVfUEFHRV9IRUFERVIgIGhkcjsKKyAgIElQU19TQ1NJX01PREVfUEFHRV9CTEtERVNDIGJsa2Rlc2M7CisKKyAgIHVuaW9uIHsKKyAgICAgIElQU19TQ1NJX01PREVfUEFHRTMgcGczOworICAgICAgSVBTX1NDU0lfTU9ERV9QQUdFNCBwZzQ7CisgICAgICBJUFNfU0NTSV9NT0RFX1BBR0U4IHBnODsKKyAgIH0gcGRhdGE7Cit9IElQU19TQ1NJX01PREVfUEFHRV9EQVRBOworCisvKgorICogU2NhdHRlciBHYXRoZXIgbGlzdCBmb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXBzX3NnbGlzdCB7CisgICB1aW50MzJfdCBhZGRyZXNzOworICAgdWludDMyX3QgbGVuZ3RoOworfSBJUFNfU1REX1NHX0xJU1Q7CisKK3R5cGVkZWYgc3RydWN0IGlwc19lbmhfc2dsaXN0IHsKKyAgIHVpbnQzMl90IGFkZHJlc3NfbG87CisgICB1aW50MzJfdCBhZGRyZXNzX2hpOworICAgdWludDMyX3QgbGVuZ3RoOworICAgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9IElQU19FTkhfU0dfTElTVDsKKwordHlwZWRlZiB1bmlvbiB7CisgICB2b2lkICAgICAgICAgICAgICpsaXN0OworICAgSVBTX1NURF9TR19MSVNUICAqc3RkX2xpc3Q7CisgICBJUFNfRU5IX1NHX0xJU1QgICplbmhfbGlzdDsKK30gSVBTX1NHX0xJU1Q7CisKK3R5cGVkZWYgc3RydWN0IF9JUFNfSU5GT1NUUiB7CisgICBjaGFyICpidWZmZXI7CisgICBpbnQgICBsZW5ndGg7CisgICBpbnQgICBvZmZzZXQ7CisgICBpbnQgICBwb3M7CisgICBpbnQgICBsb2NhbHBvczsKK30gSVBTX0lORk9TVFI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIGNoYXIgKm9wdGlvbl9uYW1lOworICAgaW50ICAqb3B0aW9uX2ZsYWc7CisgICBpbnQgICBvcHRpb25fdmFsdWU7Cit9IElQU19PUFRJT047CisKKy8qCisgKiBTdGF0dXMgSW5mbworICovCit0eXBlZGVmIHN0cnVjdCBpcHNfc3RhdCB7CisgICB1aW50MzJfdCByZXNpZHVlX2xlbjsKKyAgIHZvaWQgICAgICpzY2JfYWRkcjsKKyAgIHVpbnQ4X3QgIHBhZGRpbmdbMTIgLSBzaXplb2Yodm9pZCAqKV07Cit9IGlwc19zdGF0X3Q7CisKKy8qCisgKiBTQ0IgUXVldWUgRm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IGlwc19zY2JfcXVldWUgeworICAgc3RydWN0IGlwc19zY2IgKmhlYWQ7CisgICBzdHJ1Y3QgaXBzX3NjYiAqdGFpbDsKKyAgIGludCAgICAgICAgICAgICBjb3VudDsKK30gaXBzX3NjYl9xdWV1ZV90OworCisvKgorICogV2FpdCBxdWV1ZV9mb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXBzX3dhaXRfcXVldWUgeworICAgU2NzaV9DbW5kICAgICAgKmhlYWQ7CisgICBTY3NpX0NtbmQgICAgICAqdGFpbDsKKyAgIGludCAgICAgICAgICAgICBjb3VudDsKK30gaXBzX3dhaXRfcXVldWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaXBzX2NvcHBfd2FpdF9pdGVtIHsKKyAgIFNjc2lfQ21uZCAgICAgICAgICAgICAgICAgKnNjc2lfY21kOworICAgc3RydWN0IGlwc19jb3BwX3dhaXRfaXRlbSAqbmV4dDsKK30gaXBzX2NvcHBfd2FpdF9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlwc19jb3BwX3F1ZXVlIHsKKyAgIHN0cnVjdCBpcHNfY29wcF93YWl0X2l0ZW0gKmhlYWQ7CisgICBzdHJ1Y3QgaXBzX2NvcHBfd2FpdF9pdGVtICp0YWlsOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7Cit9IGlwc19jb3BwX3F1ZXVlX3Q7CisKKy8qIGZvcndhcmQgZGVjbCBmb3IgaG9zdCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpcHNfaGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIGludCAgICAgICAoKnJlc2V0KShzdHJ1Y3QgaXBzX2hhICopOworICAgaW50ICAgICAgICgqaXNzdWUpKHN0cnVjdCBpcHNfaGEgKiwgc3RydWN0IGlwc19zY2IgKik7CisgICBpbnQgICAgICAgKCppc2luaXQpKHN0cnVjdCBpcHNfaGEgKik7CisgICBpbnQgICAgICAgKCppc2ludHIpKHN0cnVjdCBpcHNfaGEgKik7CisgICBpbnQgICAgICAgKCppbml0KShzdHJ1Y3QgaXBzX2hhICopOworICAgaW50ICAgICAgICgqZXJhc2ViaW9zKShzdHJ1Y3QgaXBzX2hhICopOworICAgaW50ICAgICAgICgqcHJvZ3JhbWJpb3MpKHN0cnVjdCBpcHNfaGEgKiwgY2hhciAqLCB1aW50MzJfdCwgdWludDMyX3QpOworICAgaW50ICAgICAgICgqdmVyaWZ5Ymlvcykoc3RydWN0IGlwc19oYSAqLCBjaGFyICosIHVpbnQzMl90LCB1aW50MzJfdCk7CisgICB2b2lkICAgICAgKCpzdGF0aW5pdCkoc3RydWN0IGlwc19oYSAqKTsKKyAgIGludCAgICAgICAoKmludHIpKHN0cnVjdCBpcHNfaGEgKik7CisgICB2b2lkICAgICAgKCplbmFibGVpbnQpKHN0cnVjdCBpcHNfaGEgKik7CisgICB1aW50MzJfdCAoKnN0YXR1cGQpKHN0cnVjdCBpcHNfaGEgKik7Cit9IGlwc19od19mdW5jX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlwc19oYSB7CisgICB1aW50OF90ICAgICAgICAgICAgaGFfaWRbSVBTX01BWF9DSEFOTkVMUysxXTsKKyAgIHVpbnQzMl90ICAgICAgICAgICBkY2RiX2FjdGl2ZVtJUFNfTUFYX0NIQU5ORUxTXTsKKyAgIHVpbnQzMl90ICAgICAgICAgICBpb19hZGRyOyAgICAgICAgICAgIC8qIEJhc2UgSS9PIGFkZHJlc3MgICAgICAgICAgICovCisgICB1aW50OF90ICAgICAgICAgICAgaXJxOyAgICAgICAgICAgICAgICAvKiBJUlEgZm9yIGFkYXB0ZXIgICAgICAgICAgICAqLworICAgdWludDhfdCAgICAgICAgICAgIG50YXJnZXRzOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHRhcmdldHMgICAgICAgICAgKi8KKyAgIHVpbnQ4X3QgICAgICAgICAgICBuYnVzOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBidXNlcyAgICAgICAgICAgICovCisgICB1aW50OF90ICAgICAgICAgICAgbmx1bjsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgTHVucyAgICAgICAgICAgICAqLworICAgdWludDE2X3QgICAgICAgICAgIGFkX3R5cGU7ICAgICAgICAgICAgLyogQWRhcHRlciB0eXBlICAgICAgICAgICAgICAgKi8KKyAgIHVpbnQxNl90ICAgICAgICAgICBob3N0X251bTsgICAgICAgICAgIC8qIEFkYXB0ZXIgbnVtYmVyICAgICAgICAgICAgICovCisgICB1aW50MzJfdCAgICAgICAgICAgbWF4X3hmZXI7ICAgICAgICAgICAvKiBNYXhpbXVtIFhmZXIgc2l6ZSAgICAgICAgICAqLworICAgdWludDMyX3QgICAgICAgICAgIG1heF9jbWRzOyAgICAgICAgICAgLyogTWF4IGNvbmN1cnJlbnQgY29tbWFuZHMgICAgKi8KKyAgIHVpbnQzMl90ICAgICAgICAgICBudW1faW9jdGw7ICAgICAgICAgIC8qIE51bWJlciBvZiBJb2N0bHMgICAgICAgICAgICovCisgICBpcHNfc3RhdF90ICAgICAgICAgc3A7ICAgICAgICAgICAgICAgICAvKiBTdGF0dXMgcGFja2VyIHBvaW50ZXIgICAgICAqLworICAgc3RydWN0IGlwc19zY2IgICAgKnNjYnM7ICAgICAgICAgICAgICAgLyogQXJyYXkgb2YgYWxsIENDQlMgICAgICAgICAgKi8KKyAgIHN0cnVjdCBpcHNfc2NiICAgICpzY2JfZnJlZWxpc3Q7ICAgICAgIC8qIFNDQiBmcmVlIGxpc3QgICAgICAgICAgICAgICovCisgICBpcHNfd2FpdF9xdWV1ZV90ICAgc2NiX3dhaXRsaXN0OyAgICAgICAvKiBQZW5kaW5nIFNDQiBsaXN0ICAgICAgICAgICAqLworICAgaXBzX2NvcHBfcXVldWVfdCAgIGNvcHBfd2FpdGxpc3Q7ICAgICAgLyogUGVuZGluZyBQVCBsaXN0ICAgICAgICAgICAgKi8KKyAgIGlwc19zY2JfcXVldWVfdCAgICBzY2JfYWN0aXZlbGlzdDsgICAgIC8qIEFjdGl2ZSBTQ0IgbGlzdCAgICAgICAgICAgICovCisgICBJUFNfSU9fQ01EICAgICAgICAqZHVtbXk7ICAgICAgICAgICAgICAvKiBkdW1teSBjb21tYW5kICAgICAgICAgICAgICAqLworICAgSVBTX0FEQVBURVIgICAgICAgKmFkYXB0OyAgICAgICAgICAgICAgLyogQWRhcHRlciBzdGF0dXMgYXJlYSAgICAgICAgKi8KKyAgIElQU19MRF9JTkZPICAgICAgICpsb2dpY2FsX2RyaXZlX2luZm87IC8qIEFkYXB0ZXIgTG9naWNhbCBEcml2ZSBJbmZvICovCisgICBkbWFfYWRkcl90ICAgICAgICAgbG9naWNhbF9kcml2ZV9pbmZvX2RtYV9hZGRyOyAvKiBMb2dpY2FsIERyaXZlIEluZm8gRE1BIEFkZHJlc3MgKi8KKyAgIElQU19FTlEgICAgICAgICAgICplbnE7ICAgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgRW5xdWlyeSBkYXRhICAgICAgICovCisgICBJUFNfQ09ORiAgICAgICAgICAqY29uZjsgICAgICAgICAgICAgICAvKiBBZGFwdGVyIGNvbmZpZyBkYXRhICAgICAgICAqLworICAgSVBTX05WUkFNX1A1ICAgICAgKm52cmFtOyAgICAgICAgICAgICAgLyogTlZSQU0gcGFnZSA1IGRhdGEgICAgICAgICAgKi8KKyAgIElQU19TVUJTWVMgICAgICAgICpzdWJzeXM7ICAgICAgICAgICAgIC8qIFN1YnN5c3RlbSBwYXJhbWV0ZXJzICAgICAgICovCisgICBjaGFyICAgICAgICAgICAgICAqaW9jdGxfZGF0YTsgICAgICAgICAvKiBJT0NUTCBkYXRhIGFyZWEgICAgICAgICAgICAqLworICAgdWludDMyX3QgICAgICAgICAgIGlvY3RsX2RhdGFzaXplOyAgICAgLyogSU9DVEwgZGF0YSBzaXplICAgICAgICAgICAgKi8KKyAgIHVpbnQzMl90ICAgICAgICAgICBjbWRfaW5fcHJvZ3Jlc3M7ICAgIC8qIEN1cnJlbnQgY29tbWFuZCBpbiBwcm9ncmVzcyovCisgICBpbnQgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgdWludDhfdCAgICAgICAgICAgIHdhaXRmbGFnOyAgICAgICAgICAgLyogYXJlIHdlIHdhaXRpbmcgZm9yIGNtZCAgICAgKi8KKyAgIHVpbnQ4X3QgICAgICAgICAgICBhY3RpdmU7CisgICBpbnQgICAgICAgICAgICAgICAgaW9jdGxfcmVzZXQ7ICAgICAgICAvKiBJT0NUTCBSZXF1ZXN0ZWQgUmVzZXQgRmxhZyAqLworICAgdWludDE2X3QgICAgICAgICAgIHJlc2V0X2NvdW50OyAgICAgICAgLyogbnVtYmVyIG9mIHJlc2V0cyAgICAgICAgICAgKi8KKyAgIHRpbWVfdCAgICAgICAgICAgICBsYXN0X2ZmZGM7ICAgICAgICAgIC8qIGxhc3QgdGltZSB3ZSBzZW50IGZmZGMgaW5mbyovCisgICB1aW50OF90ICAgICAgICAgICAgcmV2aXNpb25faWQ7ICAgICAgICAvKiBSZXZpc2lvbiBsZXZlbCAgICAgICAgICAgICAqLworICAgdWludDE2X3QgICAgICAgICAgIGRldmljZV9pZDsgICAgICAgICAgLyogUENJIGRldmljZSBJRCAgICAgICAgICAgICAgKi8KKyAgIHVpbnQ4X3QgICAgICAgICAgICBzbG90X251bTsgICAgICAgICAgIC8qIFBDSSBTbG90IE51bWJlciAgICAgICAgICAgICovCisgICB1aW50MTZfdCAgICAgICAgICAgc3ViZGV2aWNlX2lkOyAgICAgICAvKiBTdWJzeXN0ZW0gZGV2aWNlIElEICAgICAgICAqLworICAgaW50ICAgICAgICAgICAgICAgIGlvY3RsX2xlbjsgICAgICAgICAgLyogc2l6ZSBvZiBpb2N0bCBidWZmZXIgICAgICAgKi8KKyAgIGRtYV9hZGRyX3QgICAgICAgICBpb2N0bF9idXNhZGRyOyAgICAgIC8qIGRtYSBhZGRyZXNzIG9mIGlvY3RsIGJ1ZmZlciovCisgICB1aW50OF90ICAgICAgICAgICAgYmlvc192ZXJzaW9uWzhdOyAgICAvKiBCSU9TIFJldmlzaW9uICAgICAgICAgICAgICAqLworICAgdWludDMyX3QgICAgICAgICAgIG1lbV9hZGRyOyAgICAgICAgICAgLyogTWVtb3J5IG1hcHBlZCBhZGRyZXNzICAgICAgKi8KKyAgIHVpbnQzMl90ICAgICAgICAgICBpb19sZW47ICAgICAgICAgICAgIC8qIFNpemUgb2YgSU8gQWRkcmVzcyAgICAgICAgICovCisgICB1aW50MzJfdCAgICAgICAgICAgbWVtX2xlbjsgICAgICAgICAgICAvKiBTaXplIG9mIG1lbW9yeSBhZGRyZXNzICAgICAqLworICAgY2hhciAgICAgICAgICAgICAgX19pb21lbSAqbWVtX3B0cjsgICAgLyogTWVtb3J5IG1hcHBlZCBQdHIgICAgICAgICAgKi8KKyAgIGNoYXIgICAgICAgICAgICAgIF9faW9tZW0gKmlvcmVtYXBfcHRyOy8qIGlvcmVtYXBwZWQgbWVtb3J5IHBvaW50ZXIgICovCisgICBpcHNfaHdfZnVuY190ICAgICAgZnVuYzsgICAgICAgICAgICAgICAvKiBodyBmdW5jdGlvbiBwb2ludGVycyAgICAgICAqLworICAgc3RydWN0IHBjaV9kZXYgICAgKnBjaWRldjsgICAgICAgICAgICAgLyogUENJIGRldmljZSBoYW5kbGUgICAgICAgICAgKi8KKyAgIGNoYXIgICAgICAgICAgICAgICpmbGFzaF9kYXRhOyAgICAgICAgIC8qIFNhdmUgQXJlYSBmb3IgZmxhc2ggZGF0YSAgICovCisgICBpbnQgICAgICAgICAgICAgICAgZmxhc2hfbGVuOyAgICAgICAgICAvKiBsZW5ndGggb2YgZmxhc2ggYnVmZmVyICAgICAqLworICAgdTMyICAgICAgICAgICAgICAgIGZsYXNoX2RhdGFzaXplOyAgICAgLyogU2F2ZSBBcmVhIGZvciBmbGFzaCBkYXRhIHNpemUgKi8KKyAgIGRtYV9hZGRyX3QgICAgICAgICBmbGFzaF9idXNhZGRyOyAgICAgIC8qIGRtYSBhZGRyZXNzIG9mIGZsYXNoIGJ1ZmZlciovCisgICBkbWFfYWRkcl90ICAgICAgICAgZW5xX2J1c2FkZHI7ICAgICAgICAvKiBkbWEgYWRkcmVzcyBvZiBlbnEgc3RydWN0ICAqLworICAgdWludDhfdCAgICAgICAgICAgIHJlcXVpcmVzX2VzbDsgICAgICAgLyogUmVxdWlyZXMgYW4gRXJhc2VTdHJpcGVMb2NrICovCit9IGlwc19oYV90OworCit0eXBlZGVmIHZvaWQgKCppcHNfc2NiX2NhbGxiYWNrKSAoaXBzX2hhX3QgKiwgc3RydWN0IGlwc19zY2IgKik7CisKKy8qCisgKiBTQ0IgRm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IGlwc19zY2IgeworICAgSVBTX0hPU1RfQ09NTUFORCAgY21kOworICAgSVBTX0RDREJfVEFCTEUgICAgZGNkYjsKKyAgIHVpbnQ4X3QgICAgICAgICAgIHRhcmdldF9pZDsKKyAgIHVpbnQ4X3QgICAgICAgICAgIGJ1czsKKyAgIHVpbnQ4X3QgICAgICAgICAgIGx1bjsKKyAgIHVpbnQ4X3QgICAgICAgICAgIGNkYlsxMl07CisgICB1aW50MzJfdCAgICAgICAgICBzY2JfYnVzYWRkcjsKKyAgIHVpbnQzMl90ICAgICAgICAgIG9sZF9kYXRhX2J1c2FkZHI7ICAvLyBPYnNvbGV0ZSwgYnV0IGtlcHQgZm9yIG9sZCB1dGlsaXR5IGNvbXBhdGliaWxpdHkKKyAgIHVpbnQzMl90ICAgICAgICAgIHRpbWVvdXQ7CisgICB1aW50OF90ICAgICAgICAgICBiYXNpY19zdGF0dXM7CisgICB1aW50OF90ICAgICAgICAgICBleHRlbmRlZF9zdGF0dXM7CisgICB1aW50OF90ICAgICAgICAgICBicmVha3VwOworICAgdWludDhfdCAgICAgICAgICAgc2dfYnJlYWs7CisgICB1aW50MzJfdCAgICAgICAgICBkYXRhX2xlbjsKKyAgIHVpbnQzMl90ICAgICAgICAgIHNnX2xlbjsKKyAgIHVpbnQzMl90ICAgICAgICAgIGZsYWdzOworICAgdWludDMyX3QgICAgICAgICAgb3BfY29kZTsKKyAgIElQU19TR19MSVNUICAgICAgIHNnX2xpc3Q7CisgICBTY3NpX0NtbmQgICAgICAgICpzY3NpX2NtZDsKKyAgIHN0cnVjdCBpcHNfc2NiICAgKnFfbmV4dDsKKyAgIGlwc19zY2JfY2FsbGJhY2sgIGNhbGxiYWNrOworICAgdWludDMyX3QgICAgICAgICAgc2dfYnVzYWRkcjsKKyAgIGludCAgICAgICAgICAgICAgIHNnX2NvdW50OworICAgZG1hX2FkZHJfdCAgICAgICAgZGF0YV9idXNhZGRyOworfSBpcHNfc2NiX3Q7CisKK3R5cGVkZWYgc3RydWN0IGlwc19zY2JfcHQgeworICAgSVBTX0hPU1RfQ09NTUFORCAgY21kOworICAgSVBTX0RDREJfVEFCTEUgICAgZGNkYjsKKyAgIHVpbnQ4X3QgICAgICAgICAgIHRhcmdldF9pZDsKKyAgIHVpbnQ4X3QgICAgICAgICAgIGJ1czsKKyAgIHVpbnQ4X3QgICAgICAgICAgIGx1bjsKKyAgIHVpbnQ4X3QgICAgICAgICAgIGNkYlsxMl07CisgICB1aW50MzJfdCAgICAgICAgICBzY2JfYnVzYWRkcjsKKyAgIHVpbnQzMl90ICAgICAgICAgIGRhdGFfYnVzYWRkcjsKKyAgIHVpbnQzMl90ICAgICAgICAgIHRpbWVvdXQ7CisgICB1aW50OF90ICAgICAgICAgICBiYXNpY19zdGF0dXM7CisgICB1aW50OF90ICAgICAgICAgICBleHRlbmRlZF9zdGF0dXM7CisgICB1aW50MTZfdCAgICAgICAgICBicmVha3VwOworICAgdWludDMyX3QgICAgICAgICAgZGF0YV9sZW47CisgICB1aW50MzJfdCAgICAgICAgICBzZ19sZW47CisgICB1aW50MzJfdCAgICAgICAgICBmbGFnczsKKyAgIHVpbnQzMl90ICAgICAgICAgIG9wX2NvZGU7CisgICBJUFNfU0dfTElTVCAgICAgICpzZ19saXN0OworICAgU2NzaV9DbW5kICAgICAgICAqc2NzaV9jbWQ7CisgICBzdHJ1Y3QgaXBzX3NjYiAgICpxX25leHQ7CisgICBpcHNfc2NiX2NhbGxiYWNrICBjYWxsYmFjazsKK30gaXBzX3NjYl9wdF90OworCisvKgorICogUGFzc3RocnUgQ29tbWFuZCBGb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDhfdCAgICAgICBDb3BwSURbNF07CisgICB1aW50MzJfdCAgICAgIENvcHBDbWQ7CisgICB1aW50MzJfdCAgICAgIFB0QnVmZmVyOworICAgdWludDhfdCAgICAgICpDbWRCdWZmZXI7CisgICB1aW50MzJfdCAgICAgIENtZEJTaXplOworICAgaXBzX3NjYl9wdF90ICBDb3BwQ1A7CisgICB1aW50MzJfdCAgICAgIFRpbWVPdXQ7CisgICB1aW50OF90ICAgICAgIEJhc2ljU3RhdHVzOworICAgdWludDhfdCAgICAgICBFeHRlbmRlZFN0YXR1czsKKyAgIHVpbnQ4X3QgICAgICAgQWRhcHRlclR5cGU7CisgICB1aW50OF90ICAgICAgIHJlc2VydmVkOworfSBpcHNfcGFzc3RocnVfdDsKKworI2VuZGlmCisKKy8qIFRoZSBWZXJzaW9uIEluZm9ybWF0aW9uIGJlbG93IGdldHMgY3JlYXRlZCBieSBTRUQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiAqLworLyogRG8gbm90IG1vZGlmeSB0aGUgbmV4dCBsaW5lOyBpdCdzIHdoYXQgU0VEIGlzIGxvb2tpbmcgZm9yIHRvIGRvIHRoZSBpbnNlcnQuICovCisvKiBWZXJzaW9uIEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFZFUlNJT04uSCAtLSB2ZXJzaW9uIG51bWJlcnMgYW5kIGNvcHlyaWdodCBub3RpY2VzIGluIHZhcmlvdXMgZm9ybWF0cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJUFNfVkVSX01BSk9SIDcKKyNkZWZpbmUgSVBTX1ZFUl9NQUpPUl9TVFJJTkcgIjciCisjZGVmaW5lIElQU19WRVJfTUlOT1IgMTAKKyNkZWZpbmUgSVBTX1ZFUl9NSU5PUl9TVFJJTkcgIjEwIgorI2RlZmluZSBJUFNfVkVSX0JVSUxEIDE4CisjZGVmaW5lIElQU19WRVJfQlVJTERfU1RSSU5HICIxOCIKKyNkZWZpbmUgSVBTX1ZFUl9TVFJJTkcgIjcuMTAuMTgiCisjZGVmaW5lIElQU19SRUxFQVNFX0lEIDB4MDAwMjAwMDAKKyNkZWZpbmUgSVBTX0JVSUxEX0lERU5UIDczMQorI2RlZmluZSBJUFNfTEVHQUxDT1BZUklHSFRfU1RSSU5HICIoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk0LCAyMDAyLiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyNkZWZpbmUgSVBTX0FEQVBURUNDT1BZUklHSFRfU1RSSU5HICIoYykgQ29weXJpZ2h0IEFkYXB0ZWMsIEluYy4gMjAwMiB0byAyMDA0LiBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyNkZWZpbmUgSVBTX0RFTExDT1BZUklHSFRfU1RSSU5HICIoYykgQ29weXJpZ2h0IERlbGwgMjAwNC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCisjZGVmaW5lIElQU19OVF9MRUdBTENPUFlSSUdIVF9TVFJJTkcgIihDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDE5OTQsIDIwMDIuIgorCisvKiBWZXJzaW9uIG51bWJlcnMgZm9yIHZhcmlvdXMgYWRhcHRlcnMgKi8KKyNkZWZpbmUgSVBTX1ZFUl9TRVJWRVJBSUQxICIyLjI1LjAxIgorI2RlZmluZSBJUFNfVkVSX1NFUlZFUkFJRDIgIjIuODguMTMiCisjZGVmaW5lIElQU19WRVJfTkFWQUpPICIyLjg4LjEzIgorI2RlZmluZSBJUFNfVkVSX1NFUlZFUkFJRDMgIjYuMTAuMjQiCisjZGVmaW5lIElQU19WRVJfU0VSVkVSQUlENEggIjcuMTAuMTEiCisjZGVmaW5lIElQU19WRVJfU0VSVkVSQUlENE1MeCAiNy4xMC4xOCIKKyNkZWZpbmUgSVBTX1ZFUl9TQVJBU09UQSAiNy4xMC4xOCIKKyNkZWZpbmUgSVBTX1ZFUl9NQVJDTyAiNy4xMC4xOCIKKyNkZWZpbmUgSVBTX1ZFUl9TRUJSSU5HICI3LjEwLjE4IgorI2RlZmluZSBJUFNfVkVSX0tFWVdFU1QgIjcuMTAuMTgiCisKKy8qIENvbXBhdGFiaWxpdHkgSURzIGZvciB2YXJpb3VzIGFkYXB0ZXJzICovCisjZGVmaW5lIElQU19DT01QQVRfVU5LTk9XTiAiIgorI2RlZmluZSBJUFNfQ09NUEFUX0NVUlJFTlQgIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDEgIjIuMjUuMDEiCisjZGVmaW5lIElQU19DT01QQVRfU0VSVkVSQUlEMiAiMi44OC4xMyIKKyNkZWZpbmUgSVBTX0NPTVBBVF9OQVZBSk8gICIyLjg4LjEzIgorI2RlZmluZSBJUFNfQ09NUEFUX0tJT1dBICIyLjg4LjEzIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDNIICAiU0I2MTAiCisjZGVmaW5lIElQU19DT01QQVRfU0VSVkVSQUlEM0wgICJTQjYxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0SCAgIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDRNICAiS1c3MTAiCisjZGVmaW5lIElQU19DT01QQVRfU0VSVkVSQUlENEwgICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0TXggIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFUlZFUkFJRDRMeCAiS1c3MTAiCisjZGVmaW5lIElQU19DT01QQVRfU0FSQVNPVEEgICAgICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9NQVJDTyAgICAgICAgIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX1NFQlJJTkcgICAgICAiS1c3MTAiCisjZGVmaW5lIElQU19DT01QQVRfVEFNUEEgICAgICAgICJLVzcxMCIKKyNkZWZpbmUgSVBTX0NPTVBBVF9LRVlXRVNUICAgICAgIktXNzEwIgorI2RlZmluZSBJUFNfQ09NUEFUX0JJT1MgIktXNzEwIgorCisjZGVmaW5lIElQU19DT01QQVRfTUFYX0FEQVBURVJfVFlQRSAxOAorI2RlZmluZSBJUFNfQ09NUEFUX0lEX0xFTkdUSCA4CisKKyNkZWZpbmUgSVBTX0RFRklORV9DT01QQVRfVEFCTEUodGFibGVuYW1lKSBcCisgICBjaGFyIHRhYmxlbmFtZVtJUFNfQ09NUEFUX01BWF9BREFQVEVSX1RZUEVdIFtJUFNfQ09NUEFUX0lEX0xFTkdUSF0gPSB7IFwKKyAgICAgIElQU19DT01QQVRfVU5LTk9XTiwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQxLCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDIsIFwKKyAgICAgIElQU19DT01QQVRfTkFWQUpPLCBcCisgICAgICBJUFNfQ09NUEFUX0tJT1dBLCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDNILCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDNMLCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDRILCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDRNLCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDRMLCBcCisgICAgICBJUFNfQ09NUEFUX1NFUlZFUkFJRDRNeCwgXAorICAgICAgSVBTX0NPTVBBVF9TRVJWRVJBSUQ0THgsIFwKKyAgICAgIElQU19DT01QQVRfU0FSQVNPVEEsICAgICAgICAgLyogb25lLWNoYW5uZWwgdmFyaWV0eSBvZiBTQVJBU09UQSAqLyAgXAorICAgICAgSVBTX0NPTVBBVF9TQVJBU09UQSwgICAgICAgICAvKiB0d28tY2hhbm5lbCB2YXJpZXR5IG9mIFNBUkFTT1RBICovICBcCisgICAgICBJUFNfQ09NUEFUX01BUkNPLCBcCisgICAgICBJUFNfQ09NUEFUX1NFQlJJTkcsIFwKKyAgICAgIElQU19DT01QQVRfVEFNUEEsIFwKKyAgICAgIElQU19DT01QQVRfS0VZV0VTVCBcCisgICB9CisKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBhbG1vc3QgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiAyCisgKiBjLWJyYWNlLWltYWdpbmFyeS1vZmZzZXQ6IDAKKyAqIGMtYnJhY2Utb2Zmc2V0OiAtMgorICogYy1hcmdkZWNsLWluZGVudDogMgorICogYy1sYWJlbC1vZmZzZXQ6IC0yCisgKiBjLWNvbnRpbnVlZC1zdGF0ZW1lbnQtb2Zmc2V0OiAyCisgKiBjLWNvbnRpbnVlZC1icmFjZS1vZmZzZXQ6IDAKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9qYXp6X2VzcC5jIGIvZHJpdmVycy9zY3NpL2phenpfZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0MmY3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9qYXp6X2VzcC5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogamF6el9lc3AuYzogRHJpdmVyIGZvciBTQ1NJIGNoaXAgb24gTWlwcyBNYWdudW0gQm9hcmRzIChKQVpaIGFyY2hpdGVjdHVyZSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZSkKKyAqCisgKiBqYXp6X2VzcCBpcyBiYXNlZCBvbiBEYXZpZCBTLiBNaWxsZXIncyBFU1AgZHJpdmVyIGFuZCBjeWJlcl9lc3AKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2phenouaD4KKyNpbmNsdWRlIDxhc20vamF6emRtYS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKK3N0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKK3N0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9vbmUgKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUgKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2cgKHN0cnVjdCBzY3NpX2NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICopOworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqKTsKKworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYXNmZXJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCitpbnQgamF6el9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCk7CitzdGF0aWMgaW50IGphenpfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOworCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gMHhmZikKKwkJZnJlZV9kbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImphenpfZXNwIiwKKwkucHJvY19pbmZvCQk9ICZlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiRVNQIDEwMC8xMDBhLzIwMCIsCisJLmRldGVjdAkJCT0gamF6el9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gamF6el9lc3BfcmVsZWFzZSwKKwkuaW5mbwkJCT0gZXNwX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLworc3RhdGljIGludCBqYXp6X2VzcF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKyAgICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOworICAgIHN0cnVjdCBDb25maWdEZXYgKmVzcF9kZXY7CisKKyAgICAvKgorICAgICAqIGZpcnN0IGFzc3VtcHRpb24gaXQgaXMgdGhlcmU6LSkKKyAgICAgKi8KKyAgICBpZiAoMSkgeworCWVzcF9kZXYgPSAwOworCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBlc3BfZGV2KTsKKwkKKwkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KKwllc3AtPmRvX3Bpb19jbWRzID0gMTsKKwkKKwkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwllc3AtPmRtYV9iYXJyaWVyID0gMDsKKwllc3AtPmRtYV9kcmFpbiA9IDA7CisJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7CisJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKKwllc3AtPmRtYV9pcnFfZXhpdCA9IDA7CisJZXNwLT5kbWFfcG9sbCA9IDA7CisJZXNwLT5kbWFfcmVzZXQgPSAwOworCWVzcC0+ZG1hX2xlZF9vZmYgPSAmZG1hX2xlZF9vZmY7CisJZXNwLT5kbWFfbGVkX29uID0gJmRtYV9sZWRfb247CisJCisJLyogdmlydHVhbCBETUEgZnVuY3Rpb25zICovCisJZXNwLT5kbWFfbW11X2dldF9zY3NpX29uZSA9ICZkbWFfbW11X2dldF9zY3NpX29uZTsKKwllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gJmRtYV9tbXVfZ2V0X3Njc2lfc2dsOworCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZTsKKwllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCA9ICZkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2w7CisJZXNwLT5kbWFfYWR2YW5jZV9zZyA9ICZkbWFfYWR2YW5jZV9zZzsKKworCisJLyogU0NTSSBjaGlwIHNwZWVkICovCisJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOworCisJLyogCisJICogd2UgZG9uJ3QgZ2l2ZSB0aGUgYWRkcmVzcyBvZiBETUEgY2hhbm5lbCwgYnV0IHRoZSBudW1iZXIKKwkgKiBvZiBETUEgY2hhbm5lbCwgc28gd2UgY2FuIHVzZSB0aGUgamF6eiBETUEgZnVuY3Rpb25zCisJICogCisJICovCisJZXNwLT5kcmVncyA9IEpBWlpfU0NTSV9ETUE7CisJCisJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KKwllc3AtPmVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShKQVpaX1NDU0lfQkFTRSk7CisJCisJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKWNtZF9idWZmZXI7CisJCisJLyogZ2V0IHZpcnR1YWwgZG1hIGFkZHJlc3MgZm9yIGNvbW1hbmQgYnVmZmVyICovCisJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmRtYV9hbGxvYyhDUEhZU0FERFIoY21kX2J1ZmZlciksIHNpemVvZiAoY21kX2J1ZmZlcikpOworCQorCWVzcC0+aXJxID0gSkFaWl9TQ1NJX0lSUTsKKwlyZXF1ZXN0X2lycShKQVpaX1NDU0lfSVJRLCBlc3BfaW50ciwgU0FfSU5URVJSVVBULCAiSkFaWiBTQ1NJIiwKKwkgICAgICAgICAgICBlc3AtPmVob3N0KTsKKworCS8qCisJICogRklYTUUsIGxvb2sgaWYgdGhlIHNjc2kgaWQgaXMgYXZhaWxhYmxlIGZyb20gTlZSQU0KKwkgKi8KKwllc3AtPnNjc2lfaWQgPSA3OworCQkKKwkvKiBDaGVjayBmb3IgZGlmZmVyZW50aWFsIFNDU0ktYnVzICovCisJLyogV2hhdCBpcyB0aGlzIHN0dWZmPyAqLworCWVzcC0+ZGlmZiA9IDA7CisKKwllc3BfaW5pdGlhbGl6ZShlc3ApOworCQorCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLGVzcHNfaW5fdXNlKTsKKwllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKKwlyZXR1cm4gZXNwc19pbl91c2U7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQoreworICAgIHJldHVybiBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisgICAgLyoKKyAgICAgKiBtYXhpbXVtIERNQSBzaXplIGlzIDFNQgorICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisgICAgaWYoc3ogPiAweDEwMDAwMCkKKwlzeiA9IDB4MTAwMDAwOworICAgIHJldHVybiBzejsKK30KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyAgICAKKyAgICBFU1BMT0coKCJlc3AlZDogZG1hIC0tIGVuYWJsZSA8JTA4eD4gcmVzaWR1ZSA8JTA4eFxuIiwKKwkgICAgZXNwLT5lc3BfaWQsIHZkbWFfZ2V0X2VuYWJsZSgoaW50KWVzcC0+ZHJlZ3MpLCB2ZG1hX2dldF9yZXNpZHVlKChpbnQpZXNwLT5kcmVncykpKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKyAgICBkbWFfY2FjaGVfd2JhY2tfaW52ICgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQodmRtYV9sb2cycGh5cyh2YWRkcmVzcykpLCBsZW5ndGgpOworICAgIHZkbWFfZGlzYWJsZSAoKGludCllc3AtPmRyZWdzKTsKKyAgICB2ZG1hX3NldF9tb2RlICgoaW50KWVzcC0+ZHJlZ3MsIERNQV9NT0RFX1JFQUQpOworICAgIHZkbWFfc2V0X2FkZHIgKChpbnQpZXNwLT5kcmVncywgdmFkZHJlc3MpOworICAgIHZkbWFfc2V0X2NvdW50ICgoaW50KWVzcC0+ZHJlZ3MsIGxlbmd0aCk7CisgICAgdmRtYV9lbmFibGUgKChpbnQpZXNwLT5kcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworICAgIGRtYV9jYWNoZV93YmFja19pbnYgKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydCh2ZG1hX2xvZzJwaHlzKHZhZGRyZXNzKSksIGxlbmd0aCk7ICAgIAorICAgIHZkbWFfZGlzYWJsZSAoKGludCllc3AtPmRyZWdzKTsgICAgCisgICAgdmRtYV9zZXRfbW9kZSAoKGludCllc3AtPmRyZWdzLCBETUFfTU9ERV9XUklURSk7CisgICAgdmRtYV9zZXRfYWRkciAoKGludCllc3AtPmRyZWdzLCB2YWRkcmVzcyk7CisgICAgdmRtYV9zZXRfY291bnQgKChpbnQpZXNwLT5kcmVncywgbGVuZ3RoKTsKKyAgICB2ZG1hX2VuYWJsZSAoKGludCllc3AtPmRyZWdzKTsgICAgCit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworICAgIGRpc2FibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyAgICBlbmFibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyAgICByZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKyAgICBpbnQgZW5hYmxlID0gdmRtYV9nZXRfZW5hYmxlKChpbnQpZXNwLT5kcmVncyk7CisgICAgCisgICAgcmV0dXJuIChlbmFibGUgJiBSNDAzMF9DSE5MX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKyAgICAvKiAKKyAgICAgKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKKyAgICAgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKKyAgICAgKi8KKyAgICBpZih3cml0ZSl7CisJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKKyAgICB9IGVsc2UgeworCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9vbmUgKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworICAgIHNwLT5TQ3AuaGF2ZV9kYXRhX2luID0gdmRtYV9hbGxvYyhDUEhZU0FERFIoc3AtPlNDcC5idWZmZXIpLCBzcC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIHNwLT5TQ3AucHRyID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5oYXZlX2RhdGFfaW4pOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCit7CisgICAgaW50IHN6ID0gc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNwLT5TQ3AuYnVmZmVyOworICAgIAorICAgIHdoaWxlIChzeiA+PSAwKSB7CisJc2dbc3pdLmRtYV9hZGRyZXNzID0gdmRtYV9hbGxvYyhDUEhZU0FERFIocGFnZV9hZGRyZXNzKHNnW3N6XS5wYWdlKSArIHNnW3N6XS5vZmZzZXQpLCBzZ1tzel0ubGVuZ3RoKTsKKwlzei0tOworICAgIH0KKyAgICBzcC0+U0NwLnB0cj0oY2hhciAqKShzcC0+U0NwLmJ1ZmZlci0+ZG1hX2FkZHJlc3MpOworfSAgICAKKworc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKK3sKKyAgICB2ZG1hX2ZyZWUoc3AtPlNDcC5oYXZlX2RhdGFfaW4pOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworICAgIGludCBzeiA9IHNwLT51c2Vfc2cgLSAxOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc3AtPmJ1ZmZlcjsKKwkJCQorICAgIHdoaWxlKHN6ID49IDApIHsKKwl2ZG1hX2ZyZWUoc2dbc3pdLmRtYV9hZGRyZXNzKTsKKwlzei0tOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2cgKHN0cnVjdCBzY3NpX2NtbmQgKnNwKQoreworICAgIHNwLT5TQ3AucHRyID0gKGNoYXIgKikoc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKK30KKworI2RlZmluZSBKQVpaX0hEQ19MRUQgICAweGUwMDBkMTAwIC8qIEZJWE1FLCBmaW5kIGNvcnJlY3QgYWRkcmVzcyAqLworCitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworI2lmIDAgICAgCisgICAgKih1bnNpZ25lZCBjaGFyICopSkFaWl9IRENfTEVEID0gMDsKKyNlbmRpZiAgICAKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreyAgICAKKyNpZiAwICAgIAorICAgICoodW5zaWduZWQgY2hhciAqKUpBWlpfSERDX0xFRCA9IDE7CisjZW5kaWYgICAgCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJqYXp6X2VzcCIsCisJLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiRVNQIDEwMC8xMDBhLzIwMCIsCisJLmRldGVjdAkJCT0gamF6el9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gamF6el9lc3BfcmVsZWFzZSwKKwkuaW5mbwkJCT0gZXNwX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGFzaTcwMC5jIGIvZHJpdmVycy9zY3NpL2xhc2k3MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWYyNTBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xhc2k3MDAuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4IC0qLSAqLworCisvKiBQQVJJU0MgTEFTSSBkcml2ZXIgZm9yIHRoZSA1M2M3MDAgY2hpcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKiAgCisqKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogTWFueSB0aGFua3MgdG8gUmljaGFyZCBIaXJzdCA8cmhpcnN0QGxpbnV4Y2FyZS5jb20+IGZvciBwYXRpZW50bHkKKyAqIGRlYnVnZ2luZyB0aGlzIGRyaXZlciBvbiB0aGUgcGFyaXNjIGFyY2hpdGVjdHVyZSBhbmQgc3VnZ2VzdGluZworICogbWFueSBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KKyAqCisgKiBUaGFua3MgYWxzbyBnbyB0byBMaW51eGNhcmUgSW5jLiBmb3IgcHJvdmlkaW5nIHNldmVyYWwgUEFSSVNDCisgKiBtYWNoaW5lcyBmb3IgbWUgdG8gZGVidWcgdGhlIGRyaXZlciBvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcGFyaXNjLWRldmljZS5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfc3BpLmg+CisKKyNpbmNsdWRlICI1M2M3MDAuaCIKKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQm90dG9tbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxhc2k3MDAgU0NTSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBMQVNJXzcwMF9TVkVSU0lPTiAweDAwMDcxCisjZGVmaW5lIExBU0lfNzEwX1NWRVJTSU9OIDB4MDAwODIKKworI2RlZmluZSBMQVNJNzAwX0lEX1RBQkxFIHsJCQlcCisJLmh3X3R5cGUJPSBIUEhXX0ZJTywJCVwKKwkuc3ZlcnNpb24JPSBMQVNJXzcwMF9TVkVSU0lPTiwJXAorCS5odmVyc2lvbgk9IEhWRVJTSU9OX0FOWV9JRCwJXAorCS5odmVyc2lvbl9yZXYJPSBIVkVSU0lPTl9SRVZfQU5ZX0lELAlcCit9CisKKyNkZWZpbmUgTEFTSTcxMF9JRF9UQUJMRSB7CQkJXAorCS5od190eXBlCT0gSFBIV19GSU8sCQlcCisJLnN2ZXJzaW9uCT0gTEFTSV83MTBfU1ZFUlNJT04sCVwKKwkuaHZlcnNpb24JPSBIVkVSU0lPTl9BTllfSUQsCVwKKwkuaHZlcnNpb25fcmV2CT0gSFZFUlNJT05fUkVWX0FOWV9JRCwJXAorfQorCisjZGVmaW5lIExBU0k3MDBfQ0xPQ0sJMjUKKyNkZWZpbmUgTEFTSTcxMF9DTE9DSwk0MAorI2RlZmluZSBMQVNJX1NDU0lfQ09SRV9PRkZTRVQgMHgxMDAKKworc3RhdGljIHN0cnVjdCBwYXJpc2NfZGV2aWNlX2lkIGxhc2k3MDBfaWRzW10gPSB7CisJTEFTSTcwMF9JRF9UQUJMRSwKKwlMQVNJNzEwX0lEX1RBQkxFLAorCXsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBsYXNpNzAwX3RlbXBsYXRlID0geworCS5uYW1lCQk9ICJMQVNJIFNDU0kgNTNjNzAwIiwKKwkucHJvY19uYW1lCT0gImxhc2k3MDAiLAorCS50aGlzX2lkCT0gNywKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGFyaXNjLCBsYXNpNzAwX2lkcyk7CisKK3N0YXRpYyBpbnQgX19pbml0CitsYXNpNzAwX3Byb2JlKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gZGV2LT5ocGEgKyBMQVNJX1NDU0lfQ09SRV9PRkZTRVQ7CisJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCisJaG9zdGRhdGEgPSBrbWFsbG9jKHNpemVvZigqaG9zdGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3RkYXRhKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IGRhdGFcbiIsCisJCSAgICAgICBkZXYtPmRldi5idXNfaWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGhvc3RkYXRhLCAwLCBzaXplb2Yoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzKSk7CisKKwlob3N0ZGF0YS0+ZGV2ID0gJmRldi0+ZGV2OworCWRtYV9zZXRfbWFzaygmZGV2LT5kZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlob3N0ZGF0YS0+YmFzZSA9IGlvcmVtYXAoYmFzZSwgMHgxMDApOworCWhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPSAwOworCisJaWYgKGRldi0+aWQuc3ZlcnNpb24gPT0gTEFTSV83MDBfU1ZFUlNJT04pIHsKKwkJaG9zdGRhdGEtPmNsb2NrID0gTEFTSTcwMF9DTE9DSzsKKwkJaG9zdGRhdGEtPmZvcmNlX2xlX29uX2JlID0gMTsKKwl9IGVsc2UgeworCQlob3N0ZGF0YS0+Y2xvY2sgPSBMQVNJNzEwX0NMT0NLOworCQlob3N0ZGF0YS0+Zm9yY2VfbGVfb25fYmUgPSAwOworCQlob3N0ZGF0YS0+Y2hpcDcxMCA9IDE7CisJCWhvc3RkYXRhLT5kbW9kZV9leHRyYSA9IERNT0RFX0ZDMjsKKwl9CisKKwlOQ1JfNzAwX3NldF9tZW1fbWFwcGVkKGhvc3RkYXRhKTsKKworCWhvc3QgPSBOQ1JfNzAwX2RldGVjdCgmbGFzaTcwMF90ZW1wbGF0ZSwgaG9zdGRhdGEsICZkZXYtPmRldik7CisJaWYgKCFob3N0KQorCQlnb3RvIG91dF9rZnJlZTsKKwlob3N0LT50aGlzX2lkID0gNzsKKwlob3N0LT5pcnEgPSBkZXYtPmlycTsKKwlpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgTkNSXzcwMF9pbnRyLCBTQV9TSElSUSwgImxhc2k3MDAiLCBob3N0KSkgeworCQlwcmludGsoS0VSTl9FUlIgImxhc2k3MDA6IHJlcXVlc3RfaXJxIGZhaWxlZCFcbiIpOworCQlnb3RvIG91dF9wdXRfaG9zdDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBob3N0KTsKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKworCXJldHVybiAwOworCisgb3V0X3B1dF9ob3N0OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0X2tmcmVlOgorCWlvdW5tYXAoaG9zdGRhdGEtPmJhc2UpOworCWtmcmVlKGhvc3RkYXRhKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2V4aXQKK2xhc2k3MDBfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0gCisJCShzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKilob3N0LT5ob3N0ZGF0YVswXTsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisJTkNSXzcwMF9yZWxlYXNlKGhvc3QpOworCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJaW91bm1hcChob3N0ZGF0YS0+YmFzZSk7CisJa2ZyZWUoaG9zdGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RyaXZlciBsYXNpNzAwX2RyaXZlciA9IHsKKwkubmFtZSA9CQkiTGFzaSBTQ1NJIiwKKwkuaWRfdGFibGUgPQlsYXNpNzAwX2lkcywKKwkucHJvYmUgPQlsYXNpNzAwX3Byb2JlLAorCS5yZW1vdmUgPQlfX2RldmV4aXRfcChsYXNpNzAwX2RyaXZlcl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2xhc2k3MDBfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9wYXJpc2NfZHJpdmVyKCZsYXNpNzAwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbGFzaTcwMF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9wYXJpc2NfZHJpdmVyKCZsYXNpNzAwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGxhc2k3MDBfaW5pdCk7Cittb2R1bGVfZXhpdChsYXNpNzAwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVkM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKQEAgLTAsMCArMSw0MDI0IEBACisvKgorICAgbGliYXRhLWNvcmUuYyAtIGhlbHBlciBsaWJyYXJ5IGZvciBBVEEKKworICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBKZWZmIEdhcnppaworCisgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAgIGJ5IHJlZmVyZW5jZS4KKworICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAgIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAgIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAibGliYXRhLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2J1c3lfc2xlZXAgKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdG1vdXRfcGF0LAorCQkJICAgIAkgICAgdW5zaWduZWQgbG9uZyB0bW91dCk7CitzdGF0aWMgdm9pZCBhdGFfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBhdGFfZGV2X3NldF94ZmVybW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2dldF9tb2RlX21hc2soc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHNoaWZ0KTsKK3N0YXRpYyBpbnQgZmdiKHUzMiBiaXRtYXApOworc3RhdGljIGludCBhdGFfY2hvb3NlX3hmZXJfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCXU4ICp4ZmVyX21vZGVfb3V0LAorCQkJCXVuc2lnbmVkIGludCAqeGZlcl9zaGlmdF9vdXQpOworc3RhdGljIGludCBhdGFfcWNfY29tcGxldGVfbm9vcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCBkcnZfc3RhdCk7CitzdGF0aWMgdm9pZCBfX2F0YV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfdW5pcXVlX2lkID0gMTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXRhX3dxOworCitNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaWJyYXJ5IG1vZHVsZSBmb3IgQVRBIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworLyoqCisgKglhdGFfdGZfbG9hZCAtIHNlbmQgdGFza2ZpbGUgcmVnaXN0ZXJzIHRvIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBQb3J0IHRvIHdoaWNoIG91dHB1dCBpcyBzZW50CisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKKyAqCisgKglPdXRwdXRzIEFUQSB0YXNrZmlsZSB0byBzdGFuZGFyZCBBVEEgaG9zdCBjb250cm9sbGVyLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKi8KKworc3RhdGljIHZvaWQgYXRhX3RmX2xvYWRfcGlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IGlzX2FkZHIgPSB0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfSVNBRERSOworCisJaWYgKHRmLT5jdGwgIT0gYXAtPmxhc3RfY3RsKSB7CisJCW91dGIodGYtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJCWFwLT5sYXN0X2N0bCA9IHRmLT5jdGw7CisJCWF0YV93YWl0X2lkbGUoYXApOworCX0KKworCWlmIChpc19hZGRyICYmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpKSB7CisJCW91dGIodGYtPmhvYl9mZWF0dXJlLCBpb2FkZHItPmZlYXR1cmVfYWRkcik7CisJCW91dGIodGYtPmhvYl9uc2VjdCwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJb3V0Yih0Zi0+aG9iX2xiYWwsIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJb3V0Yih0Zi0+aG9iX2xiYW0sIGlvYWRkci0+bGJhbV9hZGRyKTsKKwkJb3V0Yih0Zi0+aG9iX2xiYWgsIGlvYWRkci0+bGJhaF9hZGRyKTsKKwkJVlBSSU5USygiaG9iOiBmZWF0IDB4JVggbnNlY3QgMHglWCwgbGJhIDB4JVggMHglWCAweCVYXG4iLAorCQkJdGYtPmhvYl9mZWF0dXJlLAorCQkJdGYtPmhvYl9uc2VjdCwKKwkJCXRmLT5ob2JfbGJhbCwKKwkJCXRmLT5ob2JfbGJhbSwKKwkJCXRmLT5ob2JfbGJhaCk7CisJfQorCisJaWYgKGlzX2FkZHIpIHsKKwkJb3V0Yih0Zi0+ZmVhdHVyZSwgaW9hZGRyLT5mZWF0dXJlX2FkZHIpOworCQlvdXRiKHRmLT5uc2VjdCwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJb3V0Yih0Zi0+bGJhbCwgaW9hZGRyLT5sYmFsX2FkZHIpOworCQlvdXRiKHRmLT5sYmFtLCBpb2FkZHItPmxiYW1fYWRkcik7CisJCW91dGIodGYtPmxiYWgsIGlvYWRkci0+bGJhaF9hZGRyKTsKKwkJVlBSSU5USygiZmVhdCAweCVYIG5zZWN0IDB4JVggbGJhIDB4JVggMHglWCAweCVYXG4iLAorCQkJdGYtPmZlYXR1cmUsCisJCQl0Zi0+bnNlY3QsCisJCQl0Zi0+bGJhbCwKKwkJCXRmLT5sYmFtLAorCQkJdGYtPmxiYWgpOworCX0KKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfREVWSUNFKSB7CisJCW91dGIodGYtPmRldmljZSwgaW9hZGRyLT5kZXZpY2VfYWRkcik7CisJCVZQUklOVEsoImRldmljZSAweCVYXG4iLCB0Zi0+ZGV2aWNlKTsKKwl9CisKKwlhdGFfd2FpdF9pZGxlKGFwKTsKK30KKworLyoqCisgKglhdGFfdGZfbG9hZF9tbWlvIC0gc2VuZCB0YXNrZmlsZSByZWdpc3RlcnMgdG8gaG9zdCBjb250cm9sbGVyCisgKglAYXA6IFBvcnQgdG8gd2hpY2ggb3V0cHV0IGlzIHNlbnQKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldAorICoKKyAqCU91dHB1dHMgQVRBIHRhc2tmaWxlIHRvIHN0YW5kYXJkIEFUQSBob3N0IGNvbnRyb2xsZXIgdXNpbmcgTU1JTy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCisKK3N0YXRpYyB2b2lkIGF0YV90Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXNfYWRkciA9IHRmLT5mbGFncyAmIEFUQV9URkxBR19JU0FERFI7CisKKwlpZiAodGYtPmN0bCAhPSBhcC0+bGFzdF9jdGwpIHsKKwkJd3JpdGViKHRmLT5jdGwsICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jdGxfYWRkcik7CisJCWFwLT5sYXN0X2N0bCA9IHRmLT5jdGw7CisJCWF0YV93YWl0X2lkbGUoYXApOworCX0KKworCWlmIChpc19hZGRyICYmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpKSB7CisJCXdyaXRlYih0Zi0+aG9iX2ZlYXR1cmUsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5mZWF0dXJlX2FkZHIpOworCQl3cml0ZWIodGYtPmhvYl9uc2VjdCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPm5zZWN0X2FkZHIpOworCQl3cml0ZWIodGYtPmhvYl9sYmFsLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJd3JpdGViKHRmLT5ob2JfbGJhbSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYW1fYWRkcik7CisJCXdyaXRlYih0Zi0+aG9iX2xiYWgsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFoX2FkZHIpOworCQlWUFJJTlRLKCJob2I6IGZlYXQgMHglWCBuc2VjdCAweCVYLCBsYmEgMHglWCAweCVYIDB4JVhcbiIsCisJCQl0Zi0+aG9iX2ZlYXR1cmUsCisJCQl0Zi0+aG9iX25zZWN0LAorCQkJdGYtPmhvYl9sYmFsLAorCQkJdGYtPmhvYl9sYmFtLAorCQkJdGYtPmhvYl9sYmFoKTsKKwl9CisKKwlpZiAoaXNfYWRkcikgeworCQl3cml0ZWIodGYtPmZlYXR1cmUsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5mZWF0dXJlX2FkZHIpOworCQl3cml0ZWIodGYtPm5zZWN0LCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCXdyaXRlYih0Zi0+bGJhbCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWxfYWRkcik7CisJCXdyaXRlYih0Zi0+bGJhbSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYW1fYWRkcik7CisJCXdyaXRlYih0Zi0+bGJhaCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWhfYWRkcik7CisJCVZQUklOVEsoImZlYXQgMHglWCBuc2VjdCAweCVYIGxiYSAweCVYIDB4JVggMHglWFxuIiwKKwkJCXRmLT5mZWF0dXJlLAorCQkJdGYtPm5zZWN0LAorCQkJdGYtPmxiYWwsCisJCQl0Zi0+bGJhbSwKKwkJCXRmLT5sYmFoKTsKKwl9CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0RFVklDRSkgeworCQl3cml0ZWIodGYtPmRldmljZSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmRldmljZV9hZGRyKTsKKwkJVlBSSU5USygiZGV2aWNlIDB4JVhcbiIsIHRmLT5kZXZpY2UpOworCX0KKworCWF0YV93YWl0X2lkbGUoYXApOworfQorCit2b2lkIGF0YV90Zl9sb2FkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlhdGFfdGZfbG9hZF9tbWlvKGFwLCB0Zik7CisJZWxzZQorCQlhdGFfdGZfbG9hZF9waW8oYXAsIHRmKTsKK30KKworLyoqCisgKglhdGFfZXhlY19jb21tYW5kIC0gaXNzdWUgQVRBIGNvbW1hbmQgdG8gaG9zdCBjb250cm9sbGVyCisgKglAYXA6IHBvcnQgdG8gd2hpY2ggY29tbWFuZCBpcyBiZWluZyBpc3N1ZWQKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldAorICoKKyAqCUlzc3VlcyBQSU8vTU1JTyB3cml0ZSB0byBBVEEgY29tbWFuZCByZWdpc3Rlciwgd2l0aCBwcm9wZXIKKyAqCXN5bmNocm9uaXphdGlvbiB3aXRoIGludGVycnVwdCBoYW5kbGVyIC8gb3RoZXIgdGhyZWFkcy4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfZXhlY19jb21tYW5kX3BpbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlEUFJJTlRLKCJhdGEldTogY21kIDB4JVhcbiIsIGFwLT5pZCwgdGYtPmNvbW1hbmQpOworCisgICAgICAgCW91dGIodGYtPmNvbW1hbmQsIGFwLT5pb2FkZHIuY29tbWFuZF9hZGRyKTsKKwlhdGFfcGF1c2UoYXApOworfQorCisKKy8qKgorICoJYXRhX2V4ZWNfY29tbWFuZF9tbWlvIC0gaXNzdWUgQVRBIGNvbW1hbmQgdG8gaG9zdCBjb250cm9sbGVyCisgKglAYXA6IHBvcnQgdG8gd2hpY2ggY29tbWFuZCBpcyBiZWluZyBpc3N1ZWQKKyAqCUB0ZjogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldAorICoKKyAqCUlzc3VlcyBNTUlPIHdyaXRlIHRvIEFUQSBjb21tYW5kIHJlZ2lzdGVyLCB3aXRoIHByb3BlcgorICoJc3luY2hyb25pemF0aW9uIHdpdGggaW50ZXJydXB0IGhhbmRsZXIgLyBvdGhlciB0aHJlYWRzLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGF0YV9leGVjX2NvbW1hbmRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlEUFJJTlRLKCJhdGEldTogY21kIDB4JVhcbiIsIGFwLT5pZCwgdGYtPmNvbW1hbmQpOworCisgICAgICAgCXdyaXRlYih0Zi0+Y29tbWFuZCwgKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmNvbW1hbmRfYWRkcik7CisJYXRhX3BhdXNlKGFwKTsKK30KKwordm9pZCBhdGFfZXhlY19jb21tYW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlhdGFfZXhlY19jb21tYW5kX21taW8oYXAsIHRmKTsKKwllbHNlCisJCWF0YV9leGVjX2NvbW1hbmRfcGlvKGFwLCB0Zik7Cit9CisKKy8qKgorICoJYXRhX2V4ZWMgLSBpc3N1ZSBBVEEgY29tbWFuZCB0byBob3N0IGNvbnRyb2xsZXIKKyAqCUBhcDogcG9ydCB0byB3aGljaCBjb21tYW5kIGlzIGJlaW5nIGlzc3VlZAorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0CisgKgorICoJSXNzdWVzIFBJTy9NTUlPIHdyaXRlIHRvIEFUQSBjb21tYW5kIHJlZ2lzdGVyLCB3aXRoIHByb3BlcgorICoJc3luY2hyb25pemF0aW9uIHdpdGggaW50ZXJydXB0IGhhbmRsZXIgLyBvdGhlciB0aHJlYWRzLgorICoKKyAqCUxPQ0tJTkc6CisgKglPYnRhaW5zIGhvc3Rfc2V0IGxvY2suCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0YV9leGVjKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUFJJTlRLKCJhdGEldTogY21kIDB4JVhcbiIsIGFwLT5pZCwgdGYtPmNvbW1hbmQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKwlhcC0+b3BzLT5leGVjX2NvbW1hbmQoYXAsIHRmKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglhdGFfdGZfdG9faG9zdCAtIGlzc3VlIEFUQSB0YXNrZmlsZSB0byBob3N0IGNvbnRyb2xsZXIKKyAqCUBhcDogcG9ydCB0byB3aGljaCBjb21tYW5kIGlzIGJlaW5nIGlzc3VlZAorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0CisgKgorICoJSXNzdWVzIEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQgdG8gQVRBIGhvc3QgY29udHJvbGxlciwKKyAqCXdpdGggcHJvcGVyIHN5bmNocm9uaXphdGlvbiB3aXRoIGludGVycnVwdCBoYW5kbGVyIGFuZAorICoJb3RoZXIgdGhyZWFkcy4KKyAqCisgKglMT0NLSU5HOgorICoJT2J0YWlucyBob3N0X3NldCBsb2NrLgorICovCisKK3N0YXRpYyB2b2lkIGF0YV90Zl90b19ob3N0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCWFwLT5vcHMtPnRmX2xvYWQoYXAsIHRmKTsKKworCWF0YV9leGVjKGFwLCB0Zik7Cit9CisKKy8qKgorICoJYXRhX3RmX3RvX2hvc3Rfbm9sb2NrIC0gaXNzdWUgQVRBIHRhc2tmaWxlIHRvIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBwb3J0IHRvIHdoaWNoIGNvbW1hbmQgaXMgYmVpbmcgaXNzdWVkCisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKKyAqCisgKglJc3N1ZXMgQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIHNldCB0byBBVEEgaG9zdCBjb250cm9sbGVyLAorICoJd2l0aCBwcm9wZXIgc3luY2hyb25pemF0aW9uIHdpdGggaW50ZXJydXB0IGhhbmRsZXIgYW5kCisgKglvdGhlciB0aHJlYWRzLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3ZvaWQgYXRhX3RmX3RvX2hvc3Rfbm9sb2NrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCWFwLT5vcHMtPnRmX2xvYWQoYXAsIHRmKTsKKwlhcC0+b3BzLT5leGVjX2NvbW1hbmQoYXAsIHRmKTsKK30KKworLyoqCisgKglhdGFfdGZfcmVhZCAtIGlucHV0IGRldmljZSdzIEFUQSB0YXNrZmlsZSBzaGFkb3cgcmVnaXN0ZXJzCisgKglAYXA6IFBvcnQgZnJvbSB3aGljaCBpbnB1dCBpcyByZWFkCisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQgZm9yIHN0b3JpbmcgaW5wdXQKKyAqCisgKglSZWFkcyBBVEEgdGFza2ZpbGUgcmVnaXN0ZXJzIGZvciBjdXJyZW50bHktc2VsZWN0ZWQgZGV2aWNlCisgKglpbnRvIEB0Zi4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCisKK3N0YXRpYyB2b2lkIGF0YV90Zl9yZWFkX3BpbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCisJdGYtPm5zZWN0ID0gaW5iKGlvYWRkci0+bnNlY3RfYWRkcik7CisJdGYtPmxiYWwgPSBpbmIoaW9hZGRyLT5sYmFsX2FkZHIpOworCXRmLT5sYmFtID0gaW5iKGlvYWRkci0+bGJhbV9hZGRyKTsKKwl0Zi0+bGJhaCA9IGluYihpb2FkZHItPmxiYWhfYWRkcik7CisJdGYtPmRldmljZSA9IGluYihpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKKwkJb3V0Yih0Zi0+Y3RsIHwgQVRBX0hPQiwgaW9hZGRyLT5jdGxfYWRkcik7CisJCXRmLT5ob2JfZmVhdHVyZSA9IGluYihpb2FkZHItPmVycm9yX2FkZHIpOworCQl0Zi0+aG9iX25zZWN0ID0gaW5iKGlvYWRkci0+bnNlY3RfYWRkcik7CisJCXRmLT5ob2JfbGJhbCA9IGluYihpb2FkZHItPmxiYWxfYWRkcik7CisJCXRmLT5ob2JfbGJhbSA9IGluYihpb2FkZHItPmxiYW1fYWRkcik7CisJCXRmLT5ob2JfbGJhaCA9IGluYihpb2FkZHItPmxiYWhfYWRkcik7CisJfQorfQorCisvKioKKyAqCWF0YV90Zl9yZWFkX21taW8gLSBpbnB1dCBkZXZpY2UncyBBVEEgdGFza2ZpbGUgc2hhZG93IHJlZ2lzdGVycworICoJQGFwOiBQb3J0IGZyb20gd2hpY2ggaW5wdXQgaXMgcmVhZAorICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0IGZvciBzdG9yaW5nIGlucHV0CisgKgorICoJUmVhZHMgQVRBIHRhc2tmaWxlIHJlZ2lzdGVycyBmb3IgY3VycmVudGx5LXNlbGVjdGVkIGRldmljZQorICoJaW50byBAdGYgdmlhIE1NSU8uCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLworCitzdGF0aWMgdm9pZCBhdGFfdGZfcmVhZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisKKwl0Zi0+bnNlY3QgPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwl0Zi0+bGJhbCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmxiYWxfYWRkcik7CisJdGYtPmxiYW0gPSByZWFkYigodm9pZCBfX2lvbWVtICopaW9hZGRyLT5sYmFtX2FkZHIpOworCXRmLT5sYmFoID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKWlvYWRkci0+bGJhaF9hZGRyKTsKKwl0Zi0+ZGV2aWNlID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKWlvYWRkci0+ZGV2aWNlX2FkZHIpOworCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkgeworCQl3cml0ZWIodGYtPmN0bCB8IEFUQV9IT0IsICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jdGxfYWRkcik7CisJCXRmLT5ob2JfZmVhdHVyZSA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmVycm9yX2FkZHIpOworCQl0Zi0+aG9iX25zZWN0ID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKWlvYWRkci0+bnNlY3RfYWRkcik7CisJCXRmLT5ob2JfbGJhbCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmxiYWxfYWRkcik7CisJCXRmLT5ob2JfbGJhbSA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmxiYW1fYWRkcik7CisJCXRmLT5ob2JfbGJhaCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKilpb2FkZHItPmxiYWhfYWRkcik7CisJfQorfQorCit2b2lkIGF0YV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlhdGFfdGZfcmVhZF9tbWlvKGFwLCB0Zik7CisJZWxzZQorCQlhdGFfdGZfcmVhZF9waW8oYXAsIHRmKTsKK30KKworLyoqCisgKglhdGFfY2hlY2tfc3RhdHVzX3BpbyAtIFJlYWQgZGV2aWNlIHN0YXR1cyByZWcgJiBjbGVhciBpbnRlcnJ1cHQKKyAqCUBhcDogcG9ydCB3aGVyZSB0aGUgZGV2aWNlIGlzCisgKgorICoJUmVhZHMgQVRBIHRhc2tmaWxlIHN0YXR1cyByZWdpc3RlciBmb3IgY3VycmVudGx5LXNlbGVjdGVkIGRldmljZQorICoJYW5kIHJldHVybiBpdCdzIHZhbHVlLiBUaGlzIGFsc28gY2xlYXJzIHBlbmRpbmcgaW50ZXJydXB0cworICogICAgICBmcm9tIHRoaXMgZGV2aWNlCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLworc3RhdGljIHU4IGF0YV9jaGVja19zdGF0dXNfcGlvKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIGluYihhcC0+aW9hZGRyLnN0YXR1c19hZGRyKTsKK30KKworLyoqCisgKglhdGFfY2hlY2tfc3RhdHVzX21taW8gLSBSZWFkIGRldmljZSBzdGF0dXMgcmVnICYgY2xlYXIgaW50ZXJydXB0CisgKglAYXA6IHBvcnQgd2hlcmUgdGhlIGRldmljZSBpcworICoKKyAqCVJlYWRzIEFUQSB0YXNrZmlsZSBzdGF0dXMgcmVnaXN0ZXIgZm9yIGN1cnJlbnRseS1zZWxlY3RlZCBkZXZpY2UKKyAqCXZpYSBNTUlPIGFuZCByZXR1cm4gaXQncyB2YWx1ZS4gVGhpcyBhbHNvIGNsZWFycyBwZW5kaW5nIGludGVycnVwdHMKKyAqICAgICAgZnJvbSB0aGlzIGRldmljZQorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKi8KK3N0YXRpYyB1OCBhdGFfY2hlY2tfc3RhdHVzX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKyAgICAgICAJcmV0dXJuIHJlYWRiKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7Cit9CisKK3U4IGF0YV9jaGVja19zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJcmV0dXJuIGF0YV9jaGVja19zdGF0dXNfbW1pbyhhcCk7CisJcmV0dXJuIGF0YV9jaGVja19zdGF0dXNfcGlvKGFwKTsKK30KKwordTggYXRhX2FsdHN0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWlmIChhcC0+b3BzLT5jaGVja19hbHRzdGF0dXMpCisJCXJldHVybiBhcC0+b3BzLT5jaGVja19hbHRzdGF0dXMoYXApOworCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkcik7CisJcmV0dXJuIGluYihhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyKTsKK30KKwordTggYXRhX2Noa19lcnIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlpZiAoYXAtPm9wcy0+Y2hlY2tfZXJyKQorCQlyZXR1cm4gYXAtPm9wcy0+Y2hlY2tfZXJyKGFwKTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKSB7CisJCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuZXJyb3JfYWRkcik7CisJfQorCXJldHVybiBpbmIoYXAtPmlvYWRkci5lcnJvcl9hZGRyKTsKK30KKworLyoqCisgKglhdGFfdGZfdG9fZmlzIC0gQ29udmVydCBBVEEgdGFza2ZpbGUgdG8gU0FUQSBGSVMgc3RydWN0dXJlCisgKglAdGY6IFRhc2tmaWxlIHRvIGNvbnZlcnQKKyAqCUBmaXM6IEJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgd2lsbCBvdXRwdXQKKyAqCUBwbXA6IFBvcnQgbXVsdGlwbGllciBwb3J0CisgKgorICoJQ29udmVydHMgYSBzdGFuZGFyZCBBVEEgdGFza2ZpbGUgdG8gYSBTZXJpYWwgQVRBCisgKglGSVMgc3RydWN0dXJlIChSZWdpc3RlciAtIEhvc3QgdG8gRGV2aWNlKS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCisKK3ZvaWQgYXRhX3RmX3RvX2ZpcyhzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTggKmZpcywgdTggcG1wKQoreworCWZpc1swXSA9IDB4Mjc7CS8qIFJlZ2lzdGVyIC0gSG9zdCB0byBEZXZpY2UgRklTICovCisJZmlzWzFdID0gKHBtcCAmIDB4ZikgfCAoMSA8PCA3KTsgLyogUG9ydCBtdWx0aXBsaWVyIG51bWJlciwKKwkJCQkJICAgIGJpdCA3IGluZGljYXRlcyBDb21tYW5kIEZJUyAqLworCWZpc1syXSA9IHRmLT5jb21tYW5kOworCWZpc1szXSA9IHRmLT5mZWF0dXJlOworCisJZmlzWzRdID0gdGYtPmxiYWw7CisJZmlzWzVdID0gdGYtPmxiYW07CisJZmlzWzZdID0gdGYtPmxiYWg7CisJZmlzWzddID0gdGYtPmRldmljZTsKKworCWZpc1s4XSA9IHRmLT5ob2JfbGJhbDsKKwlmaXNbOV0gPSB0Zi0+aG9iX2xiYW07CisJZmlzWzEwXSA9IHRmLT5ob2JfbGJhaDsKKwlmaXNbMTFdID0gdGYtPmhvYl9mZWF0dXJlOworCisJZmlzWzEyXSA9IHRmLT5uc2VjdDsKKwlmaXNbMTNdID0gdGYtPmhvYl9uc2VjdDsKKwlmaXNbMTRdID0gMDsKKwlmaXNbMTVdID0gdGYtPmN0bDsKKworCWZpc1sxNl0gPSAwOworCWZpc1sxN10gPSAwOworCWZpc1sxOF0gPSAwOworCWZpc1sxOV0gPSAwOworfQorCisvKioKKyAqCWF0YV90Zl9mcm9tX2ZpcyAtIENvbnZlcnQgU0FUQSBGSVMgdG8gQVRBIHRhc2tmaWxlCisgKglAZmlzOiBCdWZmZXIgZnJvbSB3aGljaCBkYXRhIHdpbGwgYmUgaW5wdXQKKyAqCUB0ZjogVGFza2ZpbGUgdG8gb3V0cHV0CisgKgorICoJQ29udmVydHMgYSBzdGFuZGFyZCBBVEEgdGFza2ZpbGUgdG8gYSBTZXJpYWwgQVRBCisgKglGSVMgc3RydWN0dXJlIChSZWdpc3RlciAtIEhvc3QgdG8gRGV2aWNlKS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCisKK3ZvaWQgYXRhX3RmX2Zyb21fZmlzKHU4ICpmaXMsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXRmLT5jb21tYW5kCT0gZmlzWzJdOwkvKiBzdGF0dXMgKi8KKwl0Zi0+ZmVhdHVyZQk9IGZpc1szXTsJLyogZXJyb3IgKi8KKworCXRmLT5sYmFsCT0gZmlzWzRdOworCXRmLT5sYmFtCT0gZmlzWzVdOworCXRmLT5sYmFoCT0gZmlzWzZdOworCXRmLT5kZXZpY2UJPSBmaXNbN107CisKKwl0Zi0+aG9iX2xiYWwJPSBmaXNbOF07CisJdGYtPmhvYl9sYmFtCT0gZmlzWzldOworCXRmLT5ob2JfbGJhaAk9IGZpc1sxMF07CisKKwl0Zi0+bnNlY3QJPSBmaXNbMTJdOworCXRmLT5ob2JfbnNlY3QJPSBmaXNbMTNdOworfQorCisvKioKKyAqCWF0YV9wcm90X3RvX2NtZCAtIGRldGVybWluZSB3aGljaCByZWFkL3dyaXRlIG9wY29kZXMgdG8gdXNlCisgKglAcHJvdG9jb2w6IEFUQV9QUk9UX3h4eCB0YXNrZmlsZSBwcm90b2NvbAorICoJQGxiYTQ4OiB0cnVlIGlzIGxiYTQ4IGlzIHByZXNlbnQKKyAqCisgKglHaXZlbiBuZWNlc3NhcnkgaW5wdXQsIGRldGVybWluZSB3aGljaCByZWFkL3dyaXRlIGNvbW1hbmRzCisgKgl0byB1c2UgdG8gdHJhbnNmZXIgZGF0YS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLworc3RhdGljIGludCBhdGFfcHJvdF90b19jbWQoaW50IHByb3RvY29sLCBpbnQgbGJhNDgpCit7CisJaW50IHJjbWQgPSAwLCB3Y21kID0gMDsKKworCXN3aXRjaCAocHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX1BJTzoKKwkJaWYgKGxiYTQ4KSB7CisJCQlyY21kID0gQVRBX0NNRF9QSU9fUkVBRF9FWFQ7CisJCQl3Y21kID0gQVRBX0NNRF9QSU9fV1JJVEVfRVhUOworCQl9IGVsc2UgeworCQkJcmNtZCA9IEFUQV9DTURfUElPX1JFQUQ7CisJCQl3Y21kID0gQVRBX0NNRF9QSU9fV1JJVEU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX0RNQToKKwkJaWYgKGxiYTQ4KSB7CisJCQlyY21kID0gQVRBX0NNRF9SRUFEX0VYVDsKKwkJCXdjbWQgPSBBVEFfQ01EX1dSSVRFX0VYVDsKKwkJfSBlbHNlIHsKKwkJCXJjbWQgPSBBVEFfQ01EX1JFQUQ7CisJCQl3Y21kID0gQVRBX0NNRF9XUklURTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcmNtZCB8ICh3Y21kIDw8IDgpOworfQorCisvKioKKyAqCWF0YV9kZXZfc2V0X3Byb3RvY29sIC0gc2V0IHRhc2tmaWxlIHByb3RvY29sIGFuZCByL3cgY29tbWFuZHMKKyAqCUBkZXY6IGRldmljZSB0byBleGFtaW5lIGFuZCBjb25maWd1cmUKKyAqCisgKglFeGFtaW5lIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiwgYWZ0ZXIgd2UgaGF2ZQorICoJcmVhZCB0aGUgaWRlbnRpZnktZGV2aWNlIHBhZ2UgYW5kIGNvbmZpZ3VyZWQgdGhlCisgKglkYXRhIHRyYW5zZmVyIG1vZGUuICBTZXQgaW50ZXJuYWwgc3RhdGUgcmVsYXRlZCB0bworICoJdGhlIEFUQSB0YXNrZmlsZSBwcm90b2NvbCAocGlvLCBwaW8gbXVsdCwgZG1hLCBldGMuKQorICoJYW5kIGNhbGN1bGF0ZSB0aGUgcHJvcGVyIHJlYWQvd3JpdGUgY29tbWFuZHMgdG8gdXNlLgorICoKKyAqCUxPQ0tJTkc6CisgKgljYWxsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGF0YV9kZXZfc2V0X3Byb3RvY29sKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJaW50IHBpbyA9IChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTyk7CisJaW50IGxiYTQ4ID0gKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpOworCWludCBwcm90bywgY21kOworCisJaWYgKHBpbykKKwkJcHJvdG8gPSBkZXYtPnhmZXJfcHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87CisJZWxzZQorCQlwcm90byA9IGRldi0+eGZlcl9wcm90b2NvbCA9IEFUQV9QUk9UX0RNQTsKKworCWNtZCA9IGF0YV9wcm90X3RvX2NtZChwcm90bywgbGJhNDgpOworCWlmIChjbWQgPCAwKQorCQlCVUcoKTsKKworCWRldi0+cmVhZF9jbWQgPSBjbWQgJiAweGZmOworCWRldi0+d3JpdGVfY21kID0gKGNtZCA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogeGZlcl9tb2RlX3N0cltdID0geworCSJVRE1BLzE2IiwKKwkiVURNQS8yNSIsCisJIlVETUEvMzMiLAorCSJVRE1BLzQ0IiwKKwkiVURNQS82NiIsCisJIlVETUEvMTAwIiwKKwkiVURNQS8xMzMiLAorCSJVRE1BNyIsCisJIk1XRE1BMCIsCisJIk1XRE1BMSIsCisJIk1XRE1BMiIsCisJIlBJTzAiLAorCSJQSU8xIiwKKwkiUElPMiIsCisJIlBJTzMiLAorCSJQSU80IiwKK307CisKKy8qKgorICoJYXRhX3VkbWFfc3RyaW5nIC0gY29udmVydCBVRE1BIGJpdCBvZmZzZXQgdG8gc3RyaW5nCisgKglAbWFzazogbWFzayBvZiBiaXRzIHN1cHBvcnRlZDsgb25seSBoaWdoZXN0IGJpdCBjb3VudHMuCisgKgorICoJRGV0ZXJtaW5lIHN0cmluZyB3aGljaCByZXByZXNlbnRzIHRoZSBoaWdoZXN0IHNwZWVkCisgKgkoaGlnaGVzdCBiaXQgaW4gQHVkbWFfbWFzaykuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUkVUVVJOUzoKKyAqCUNvbnN0YW50IEMgc3RyaW5nIHJlcHJlc2VudGluZyBoaWdoZXN0IHNwZWVkIGxpc3RlZCBpbgorICoJQHVkbWFfbWFzaywgb3IgdGhlIGNvbnN0YW50IEMgc3RyaW5nICI8bi9hPiIuCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmF0YV9tb2RlX3N0cmluZyh1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKQorCQlpZiAobWFzayAmICgxIDw8IGkpKQorCQkJZ290byBvdXQ7CisJZm9yIChpID0gQVRBX1NISUZUX01XRE1BICsgMjsgaSA+PSBBVEFfU0hJRlRfTVdETUE7IGktLSkKKwkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKKwkJCWdvdG8gb3V0OworCWZvciAoaSA9IEFUQV9TSElGVF9QSU8gKyA0OyBpID49IEFUQV9TSElGVF9QSU87IGktLSkKKwkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKKwkJCWdvdG8gb3V0OworCisJcmV0dXJuICI8bi9hPiI7CisKK291dDoKKwlyZXR1cm4geGZlcl9tb2RlX3N0cltpXTsKK30KKworLyoqCisgKglhdGFfcGlvX2RldmNoayAtIFBBVEEgZGV2aWNlIHByZXNlbmNlIGRldGVjdGlvbgorICoJQGFwOiBBVEEgY2hhbm5lbCB0byBleGFtaW5lCisgKglAZGV2aWNlOiBEZXZpY2UgdG8gZXhhbWluZSAoc3RhcnRpbmcgYXQgemVybykKKyAqCisgKglUaGlzIHRlY2huaXF1ZSB3YXMgb3JpZ2luYWxseSBkZXNjcmliZWQgaW4KKyAqCUhhbGUgTGFuZGlzJ3MgQVRBRFJWUiAod3d3LmF0YS1hdGFwaS5jb20pLCBhbmQKKyAqCWxhdGVyIGZvdW5kIGl0cyB3YXkgaW50byB0aGUgQVRBL0FUQVBJIHNwZWMuCisgKgorICoJV3JpdGUgYSBwYXR0ZXJuIHRvIHRoZSBBVEEgc2hhZG93IHJlZ2lzdGVycywKKyAqCWFuZCBpZiBhIGRldmljZSBpcyBwcmVzZW50LCBpdCB3aWxsIHJlc3BvbmQgYnkKKyAqCWNvcnJlY3RseSBzdG9yaW5nIGFuZCBlY2hvaW5nIGJhY2sgdGhlCisgKglBVEEgc2hhZG93IHJlZ2lzdGVyIGNvbnRlbnRzLgorICoKKyAqCUxPQ0tJTkc6CisgKgljYWxsZXIuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfcGlvX2RldmNoayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgIHVuc2lnbmVkIGludCBkZXZpY2UpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1OCBuc2VjdCwgbGJhbDsKKworCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIGRldmljZSk7CisKKwlvdXRiKDB4NTUsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJb3V0YigweGFhLCBpb2FkZHItPmxiYWxfYWRkcik7CisKKwlvdXRiKDB4YWEsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJb3V0YigweDU1LCBpb2FkZHItPmxiYWxfYWRkcik7CisKKwlvdXRiKDB4NTUsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJb3V0YigweGFhLCBpb2FkZHItPmxiYWxfYWRkcik7CisKKwluc2VjdCA9IGluYihpb2FkZHItPm5zZWN0X2FkZHIpOworCWxiYWwgPSBpbmIoaW9hZGRyLT5sYmFsX2FkZHIpOworCisJaWYgKChuc2VjdCA9PSAweDU1KSAmJiAobGJhbCA9PSAweGFhKSkKKwkJcmV0dXJuIDE7CS8qIHdlIGZvdW5kIGEgZGV2aWNlICovCisKKwlyZXR1cm4gMDsJCS8qIG5vdGhpbmcgZm91bmQgKi8KK30KKworLyoqCisgKglhdGFfbW1pb19kZXZjaGsgLSBQQVRBIGRldmljZSBwcmVzZW5jZSBkZXRlY3Rpb24KKyAqCUBhcDogQVRBIGNoYW5uZWwgdG8gZXhhbWluZQorICoJQGRldmljZTogRGV2aWNlIHRvIGV4YW1pbmUgKHN0YXJ0aW5nIGF0IHplcm8pCisgKgorICoJVGhpcyB0ZWNobmlxdWUgd2FzIG9yaWdpbmFsbHkgZGVzY3JpYmVkIGluCisgKglIYWxlIExhbmRpcydzIEFUQURSVlIgKHd3dy5hdGEtYXRhcGkuY29tKSwgYW5kCisgKglsYXRlciBmb3VuZCBpdHMgd2F5IGludG8gdGhlIEFUQS9BVEFQSSBzcGVjLgorICoKKyAqCVdyaXRlIGEgcGF0dGVybiB0byB0aGUgQVRBIHNoYWRvdyByZWdpc3RlcnMsCisgKglhbmQgaWYgYSBkZXZpY2UgaXMgcHJlc2VudCwgaXQgd2lsbCByZXNwb25kIGJ5CisgKgljb3JyZWN0bHkgc3RvcmluZyBhbmQgZWNob2luZyBiYWNrIHRoZQorICoJQVRBIHNoYWRvdyByZWdpc3RlciBjb250ZW50cy4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX21taW9fZGV2Y2hrKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJICAgIHVuc2lnbmVkIGludCBkZXZpY2UpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1OCBuc2VjdCwgbGJhbDsKKworCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIGRldmljZSk7CisKKwl3cml0ZWIoMHg1NSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPm5zZWN0X2FkZHIpOworCXdyaXRlYigweGFhLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bGJhbF9hZGRyKTsKKworCXdyaXRlYigweGFhLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bnNlY3RfYWRkcik7CisJd3JpdGViKDB4NTUsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5sYmFsX2FkZHIpOworCisJd3JpdGViKDB4NTUsICh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwl3cml0ZWIoMHhhYSwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWxfYWRkcik7CisKKwluc2VjdCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlsYmFsID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmxiYWxfYWRkcik7CisKKwlpZiAoKG5zZWN0ID09IDB4NTUpICYmIChsYmFsID09IDB4YWEpKQorCQlyZXR1cm4gMTsJLyogd2UgZm91bmQgYSBkZXZpY2UgKi8KKworCXJldHVybiAwOwkJLyogbm90aGluZyBmb3VuZCAqLworfQorCisvKioKKyAqCWF0YV9kZXZjaGsgLSBQQVRBIGRldmljZSBwcmVzZW5jZSBkZXRlY3Rpb24KKyAqCUBhcDogQVRBIGNoYW5uZWwgdG8gZXhhbWluZQorICoJQGRldmljZTogRGV2aWNlIHRvIGV4YW1pbmUgKHN0YXJ0aW5nIGF0IHplcm8pCisgKgorICoJRGlzcGF0Y2ggQVRBIGRldmljZSBwcmVzZW5jZSBkZXRlY3Rpb24sIGRlcGVuZGluZworICoJb24gd2hldGhlciB3ZSBhcmUgdXNpbmcgUElPIG9yIE1NSU8gdG8gdGFsayB0byB0aGUKKyAqCUFUQSBzaGFkb3cgcmVnaXN0ZXJzLgorICoKKyAqCUxPQ0tJTkc6CisgKgljYWxsZXIuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZGV2Y2hrKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJICAgIHVuc2lnbmVkIGludCBkZXZpY2UpCit7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCXJldHVybiBhdGFfbW1pb19kZXZjaGsoYXAsIGRldmljZSk7CisJcmV0dXJuIGF0YV9waW9fZGV2Y2hrKGFwLCBkZXZpY2UpOworfQorCisvKioKKyAqCWF0YV9kZXZfY2xhc3NpZnkgLSBkZXRlcm1pbmUgZGV2aWNlIHR5cGUgYmFzZWQgb24gQVRBLXNwZWMgc2lnbmF0dXJlCisgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQgZm9yIGRldmljZSB0byBiZSBpZGVudGlmaWVkCisgKgorICoJRGV0ZXJtaW5lIGZyb20gdGFza2ZpbGUgcmVnaXN0ZXIgY29udGVudHMgd2hldGhlciBhIGRldmljZSBpcworICoJQVRBIG9yIEFUQVBJLCBhcyBwZXIgIlNpZ25hdHVyZSBhbmQgcGVyc2lzdGVuY2UiIHNlY3Rpb24KKyAqCW9mIEFUQS9QSSBzcGVjICh2b2x1bWUgMSwgc2VjdCA1LjE0KS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqCisgKglSRVRVUk5TOgorICoJRGV2aWNlIHR5cGUsICVBVEFfREVWX0FUQSwgJUFUQV9ERVZfQVRBUEksIG9yICVBVEFfREVWX1VOS05PV04KKyAqCXRoZSBldmVudCBvZiBmYWlsdXJlLgorICovCisKK3Vuc2lnbmVkIGludCBhdGFfZGV2X2NsYXNzaWZ5KHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCS8qIEFwcGxlJ3Mgb3BlbiBzb3VyY2UgRGFyd2luIGNvZGUgaGludHMgdGhhdCBzb21lIGRldmljZXMgb25seQorCSAqIHB1dCBhIHByb3BlciBzaWduYXR1cmUgaW50byB0aGUgTEJBIG1pZC9oaWdoIHJlZ2lzdGVycywKKwkgKiBTbywgd2Ugb25seSBjaGVjayB0aG9zZS4gIEl0J3Mgc3VmZmljaWVudCBmb3IgdW5pcXVlbmVzcy4KKwkgKi8KKworCWlmICgoKHRmLT5sYmFtID09IDApICYmICh0Zi0+bGJhaCA9PSAwKSkgfHwKKwkgICAgKCh0Zi0+bGJhbSA9PSAweDNjKSAmJiAodGYtPmxiYWggPT0gMHhjMykpKSB7CisJCURQUklOVEsoImZvdW5kIEFUQSBkZXZpY2UgYnkgc2lnXG4iKTsKKwkJcmV0dXJuIEFUQV9ERVZfQVRBOworCX0KKworCWlmICgoKHRmLT5sYmFtID09IDB4MTQpICYmICh0Zi0+bGJhaCA9PSAweGViKSkgfHwKKwkgICAgKCh0Zi0+bGJhbSA9PSAweDY5KSAmJiAodGYtPmxiYWggPT0gMHg5NikpKSB7CisJCURQUklOVEsoImZvdW5kIEFUQVBJIGRldmljZSBieSBzaWdcbiIpOworCQlyZXR1cm4gQVRBX0RFVl9BVEFQSTsKKwl9CisKKwlEUFJJTlRLKCJ1bmtub3duIGRldmljZVxuIik7CisJcmV0dXJuIEFUQV9ERVZfVU5LTk9XTjsKK30KKworLyoqCisgKglhdGFfZGV2X3RyeV9jbGFzc2lmeSAtIFBhcnNlIHJldHVybmVkIEFUQSBkZXZpY2Ugc2lnbmF0dXJlCisgKglAYXA6IEFUQSBjaGFubmVsIHRvIGV4YW1pbmUKKyAqCUBkZXZpY2U6IERldmljZSB0byBleGFtaW5lIChzdGFydGluZyBhdCB6ZXJvKQorICoKKyAqCUFmdGVyIGFuIGV2ZW50IC0tIFNSU1QsIEUuRC5ELiwgb3IgU0FUQSBDT01SRVNFVCAtLSBvY2N1cnMsCisgKglhbiBBVEEvQVRBUEktZGVmaW5lZCBzZXQgb2YgdmFsdWVzIGlzIHBsYWNlZCBpbiB0aGUgQVRBCisgKglzaGFkb3cgcmVnaXN0ZXJzLCBpbmRpY2F0aW5nIHRoZSByZXN1bHRzIG9mIGRldmljZSBkZXRlY3Rpb24KKyAqCWFuZCBkaWFnbm9zdGljcy4KKyAqCisgKglTZWxlY3QgdGhlIEFUQSBkZXZpY2UsIGFuZCByZWFkIHRoZSB2YWx1ZXMgZnJvbSB0aGUgQVRBIHNoYWRvdworICoJcmVnaXN0ZXJzLiAgVGhlbiBwYXJzZSBhY2NvcmRpbmcgdG8gdGhlIEVycm9yIHJlZ2lzdGVyIHZhbHVlLAorICoJYW5kIHRoZSBzcGVjLWRlZmluZWQgdmFsdWVzIGV4YW1pbmVkIGJ5IGF0YV9kZXZfY2xhc3NpZnkoKS4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3N0YXRpYyB1OCBhdGFfZGV2X3RyeV9jbGFzc2lmeShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlKQoreworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtkZXZpY2VdOworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisJdW5zaWduZWQgaW50IGNsYXNzOworCXU4IGVycjsKKworCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIGRldmljZSk7CisKKwltZW1zZXQoJnRmLCAwLCBzaXplb2YodGYpKTsKKworCWVyciA9IGF0YV9jaGtfZXJyKGFwKTsKKwlhcC0+b3BzLT50Zl9yZWFkKGFwLCAmdGYpOworCisJZGV2LT5jbGFzcyA9IEFUQV9ERVZfTk9ORTsKKworCS8qIHNlZSBpZiBkZXZpY2UgcGFzc2VkIGRpYWdzICovCisJaWYgKGVyciA9PSAxKQorCQkvKiBkbyBub3RoaW5nICovIDsKKwllbHNlIGlmICgoZGV2aWNlID09IDApICYmIChlcnIgPT0gMHg4MSkpCisJCS8qIGRvIG5vdGhpbmcgKi8gOworCWVsc2UKKwkJcmV0dXJuIGVycjsKKworCS8qIGRldGVybWluZSBpZiBkZXZpY2UgaWYgQVRBIG9yIEFUQVBJICovCisJY2xhc3MgPSBhdGFfZGV2X2NsYXNzaWZ5KCZ0Zik7CisJaWYgKGNsYXNzID09IEFUQV9ERVZfVU5LTk9XTikKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGNsYXNzID09IEFUQV9ERVZfQVRBKSAmJiAoYXRhX2Noa19zdGF0dXMoYXApID09IDApKQorCQlyZXR1cm4gZXJyOworCisJZGV2LT5jbGFzcyA9IGNsYXNzOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKglhdGFfZGV2X2lkX3N0cmluZyAtIENvbnZlcnQgSURFTlRJRlkgREVWSUNFIHBhZ2UgaW50byBzdHJpbmcKKyAqCUBpZDogSURFTlRJRlkgREVWSUNFIHJlc3VsdHMgd2Ugd2lsbCBleGFtaW5lCisgKglAczogc3RyaW5nIGludG8gd2hpY2ggZGF0YSBpcyBvdXRwdXQKKyAqCUBvZnM6IG9mZnNldCBpbnRvIGlkZW50aWZ5IGRldmljZSBwYWdlCisgKglAbGVuOiBsZW5ndGggb2Ygc3RyaW5nIHRvIHJldHVybi4gbXVzdCBiZSBhbiBldmVuIG51bWJlci4KKyAqCisgKglUaGUgc3RyaW5ncyBpbiB0aGUgSURFTlRJRlkgREVWSUNFIHBhZ2UgYXJlIGJyb2tlbiB1cCBpbnRvCisgKgkxNi1iaXQgY2h1bmtzLiAgUnVuIHRocm91Z2ggdGhlIHN0cmluZywgYW5kIG91dHB1dCBlYWNoCisgKgk4LWJpdCBjaHVuayBsaW5lYXJseSwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3ZvaWQgYXRhX2Rldl9pZF9zdHJpbmcodTE2ICppZCwgdW5zaWduZWQgY2hhciAqcywKKwkJICAgICAgIHVuc2lnbmVkIGludCBvZnMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGM7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQljID0gaWRbb2ZzXSA+PiA4OworCQkqcyA9IGM7CisJCXMrKzsKKworCQljID0gaWRbb2ZzXSAmIDB4ZmY7CisJCSpzID0gYzsKKwkJcysrOworCisJCW9mcysrOworCQlsZW4gLT0gMjsKKwl9Cit9CisKK3ZvaWQgYXRhX25vb3BfZGV2X3NlbGVjdCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSkKK3sKK30KKworLyoqCisgKglhdGFfc3RkX2Rldl9zZWxlY3QgLSBTZWxlY3QgZGV2aWNlIDAvMSBvbiBBVEEgYnVzCisgKglAYXA6IEFUQSBjaGFubmVsIHRvIG1hbmlwdWxhdGUKKyAqCUBkZXZpY2U6IEFUQSBkZXZpY2UgKG51bWJlcmVkIGZyb20gemVybykgdG8gc2VsZWN0CisgKgorICoJVXNlIHRoZSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgQVRBIHNwZWNpZmljYXRpb24gdG8KKyAqCW1ha2UgZWl0aGVyIGRldmljZSAwLCBvciBkZXZpY2UgMSwgYWN0aXZlIG9uIHRoZQorICoJQVRBIGNoYW5uZWwuCisgKgorICoJTE9DS0lORzoKKyAqCWNhbGxlci4KKyAqLworCit2b2lkIGF0YV9zdGRfZGV2X3NlbGVjdCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSkKK3sKKwl1OCB0bXA7CisKKwlpZiAoZGV2aWNlID09IDApCisJCXRtcCA9IEFUQV9ERVZJQ0VfT0JTOworCWVsc2UKKwkJdG1wID0gQVRBX0RFVklDRV9PQlMgfCBBVEFfREVWMTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKSB7CisJCXdyaXRlYih0bXAsICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5kZXZpY2VfYWRkcik7CisJfSBlbHNlIHsKKwkJb3V0Yih0bXAsIGFwLT5pb2FkZHIuZGV2aWNlX2FkZHIpOworCX0KKwlhdGFfcGF1c2UoYXApOwkJLyogbmVlZGVkOyBhbHNvIGZsdXNoZXMsIGZvciBtbWlvICovCit9CisKKy8qKgorICoJYXRhX2Rldl9zZWxlY3QgLSBTZWxlY3QgZGV2aWNlIDAvMSBvbiBBVEEgYnVzCisgKglAYXA6IEFUQSBjaGFubmVsIHRvIG1hbmlwdWxhdGUKKyAqCUBkZXZpY2U6IEFUQSBkZXZpY2UgKG51bWJlcmVkIGZyb20gemVybykgdG8gc2VsZWN0CisgKglAd2FpdDogbm9uLXplcm8gdG8gd2FpdCBmb3IgU3RhdHVzIHJlZ2lzdGVyIEJTWSBiaXQgdG8gY2xlYXIKKyAqCUBjYW5fc2xlZXA6IG5vbi16ZXJvIGlmIGNvbnRleHQgYWxsb3dzIHNsZWVwaW5nCisgKgorICoJVXNlIHRoZSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgQVRBIHNwZWNpZmljYXRpb24gdG8KKyAqCW1ha2UgZWl0aGVyIGRldmljZSAwLCBvciBkZXZpY2UgMSwgYWN0aXZlIG9uIHRoZQorICoJQVRBIGNoYW5uZWwuCisgKgorICoJVGhpcyBpcyBhIGhpZ2gtbGV2ZWwgdmVyc2lvbiBvZiBhdGFfc3RkX2Rldl9zZWxlY3QoKSwKKyAqCXdoaWNoIGFkZGl0aW9uYWxseSBwcm92aWRlcyB0aGUgc2VydmljZXMgb2YgaW5zZXJ0aW5nCisgKgl0aGUgcHJvcGVyIHBhdXNlcyBhbmQgc3RhdHVzIHBvbGxpbmcsIHdoZXJlIG5lZWRlZC4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3ZvaWQgYXRhX2Rldl9zZWxlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSwKKwkJCSAgIHVuc2lnbmVkIGludCB3YWl0LCB1bnNpZ25lZCBpbnQgY2FuX3NsZWVwKQoreworCVZQUklOVEsoIkVOVEVSLCBhdGEldTogZGV2aWNlICV1LCB3YWl0ICV1XG4iLAorCQlhcC0+aWQsIGRldmljZSwgd2FpdCk7CisKKwlpZiAod2FpdCkKKwkJYXRhX3dhaXRfaWRsZShhcCk7CisKKwlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCBkZXZpY2UpOworCisJaWYgKHdhaXQpIHsKKwkJaWYgKGNhbl9zbGVlcCAmJiBhcC0+ZGV2aWNlW2RldmljZV0uY2xhc3MgPT0gQVRBX0RFVl9BVEFQSSkKKwkJCW1zbGVlcCgxNTApOworCQlhdGFfd2FpdF9pZGxlKGFwKTsKKwl9Cit9CisKKy8qKgorICoJYXRhX2R1bXBfaWQgLSBJREVOVElGWSBERVZJQ0UgaW5mbyBkZWJ1Z2dpbmcgb3V0cHV0CisgKglAZGV2OiBEZXZpY2Ugd2hvc2UgSURFTlRJRlkgREVWSUNFIHBhZ2Ugd2Ugd2lsbCBkdW1wCisgKgorICoJRHVtcCBzZWxlY3RlZCAxNi1iaXQgd29yZHMgZnJvbSBhIGRldGVjdGVkIGRldmljZSdzCisgKglJREVOVElGWSBQQUdFIHBhZ2UuCisgKgorICoJTE9DS0lORzoKKyAqCWNhbGxlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX2R1bXBfaWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwlEUFJJTlRLKCI0OT09MHglMDR4ICAiCisJCSI1Mz09MHglMDR4ICAiCisJCSI2Mz09MHglMDR4ICAiCisJCSI2ND09MHglMDR4ICAiCisJCSI3NT09MHglMDR4ICBcbiIsCisJCWRldi0+aWRbNDldLAorCQlkZXYtPmlkWzUzXSwKKwkJZGV2LT5pZFs2M10sCisJCWRldi0+aWRbNjRdLAorCQlkZXYtPmlkWzc1XSk7CisJRFBSSU5USygiODA9PTB4JTA0eCAgIgorCQkiODE9PTB4JTA0eCAgIgorCQkiODI9PTB4JTA0eCAgIgorCQkiODM9PTB4JTA0eCAgIgorCQkiODQ9PTB4JTA0eCAgXG4iLAorCQlkZXYtPmlkWzgwXSwKKwkJZGV2LT5pZFs4MV0sCisJCWRldi0+aWRbODJdLAorCQlkZXYtPmlkWzgzXSwKKwkJZGV2LT5pZFs4NF0pOworCURQUklOVEsoIjg4PT0weCUwNHggICIKKwkJIjkzPT0weCUwNHhcbiIsCisJCWRldi0+aWRbODhdLAorCQlkZXYtPmlkWzkzXSk7Cit9CisKKy8qKgorICoJYXRhX2Rldl9pZGVudGlmeSAtIG9idGFpbiBJREVOVElGWSB4IERFVklDRSBwYWdlCisgKglAYXA6IHBvcnQgb24gd2hpY2ggZGV2aWNlIHdlIHdpc2ggdG8gcHJvYmUgcmVzaWRlcworICoJQGRldmljZTogZGV2aWNlIGJ1cyBhZGRyZXNzLCBzdGFydGluZyBhdCB6ZXJvCisgKgorICoJRm9sbG93aW5nIGJ1cyByZXNldCwgd2UgaXNzdWUgdGhlIElERU5USUZZIFtQQUNLRVRdIERFVklDRQorICoJY29tbWFuZCwgYW5kIHJlYWQgYmFjayB0aGUgNTEyLWJ5dGUgZGV2aWNlIGluZm9ybWF0aW9uIHBhZ2UuCisgKglUaGUgZGV2aWNlIGluZm9ybWF0aW9uIHBhZ2UgaXMgZmVkIHRvIHVzIHZpYSB0aGUgc3RhbmRhcmQKKyAqCVBJTy1JTiBwcm90b2NvbCwgYnV0IHdlIGhhbmQtY29kZSBpdCBoZXJlLiAoVE9ETzogaW52ZXN0aWdhdGUKKyAqCXVzaW5nIHN0YW5kYXJkIFBJTy1JTiBwYXRocykKKyAqCisgKglBZnRlciByZWFkaW5nIHRoZSBkZXZpY2UgaW5mb3JtYXRpb24gcGFnZSwgd2UgdXNlIHNldmVyYWwKKyAqCWJpdHMgb2YgaW5mb3JtYXRpb24gZnJvbSBpdCB0byBpbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcworICoJdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgYXRhX2RldmljZS4KKyAqCU90aGVyIGRhdGEgZnJvbSB0aGUgaW5mbyBwYWdlIGlzIHVzZWQgdG8gZGlzcXVhbGlmeSBjZXJ0YWluCisgKglvbGRlciBBVEEgZGV2aWNlcyB3ZSBkbyBub3Qgd2lzaCB0byBzdXBwb3J0LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuICBTb21lIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhpcyBmdW5jdGlvbgorICoJb2J0YWluIHRoZSBob3N0X3NldCBsb2NrLgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9kZXZfaWRlbnRpZnkoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSkKK3sKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbZGV2aWNlXTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MTYgdG1wOworCXVuc2lnbmVkIGxvbmcgeGZlcl9tb2RlczsKKwl1OCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHVzaW5nX2VkZDsKKwlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWlmICghYXRhX2Rldl9wcmVzZW50KGRldikpIHsKKwkJRFBSSU5USygiRU5URVIvRVhJVCAoaG9zdCAldSwgZGV2ICV1KSAtLSBub2RldlxuIiwKKwkJCWFwLT5pZCwgZGV2aWNlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhcC0+ZmxhZ3MgJiAoQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX1NBVEFfUkVTRVQpKQorCQl1c2luZ19lZGQgPSAwOworCWVsc2UKKwkJdXNpbmdfZWRkID0gMTsKKworCURQUklOVEsoIkVOVEVSLCBob3N0ICV1LCBkZXYgJXVcbiIsIGFwLT5pZCwgZGV2aWNlKTsKKworCWFzc2VydCAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSB8fCBkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBUEkgfHwKKwkJZGV2LT5jbGFzcyA9PSBBVEFfREVWX05PTkUpOworCisJYXRhX2Rldl9zZWxlY3QoYXAsIGRldmljZSwgMSwgMSk7IC8qIHNlbGVjdCBkZXZpY2UgMC8xICovCisKKwlxYyA9IGF0YV9xY19uZXdfaW5pdChhcCwgZGV2KTsKKwlCVUdfT04ocWMgPT0gTlVMTCk7CisKKwlhdGFfc2dfaW5pdF9vbmUocWMsIGRldi0+aWQsIHNpemVvZihkZXYtPmlkKSk7CisJcWMtPmRtYV9kaXIgPSBETUFfRlJPTV9ERVZJQ0U7CisJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfUElPOworCXFjLT5uc2VjdCA9IDE7CisKK3JldHJ5OgorCWlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBKSB7CisJCXFjLT50Zi5jb21tYW5kID0gQVRBX0NNRF9JRF9BVEE7CisJCURQUklOVEsoImRvIEFUQSBpZGVudGlmeVxuIik7CisJfSBlbHNlIHsKKwkJcWMtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0lEX0FUQVBJOworCQlEUFJJTlRLKCJkbyBBVEFQSSBpZGVudGlmeVxuIik7CisJfQorCisJcWMtPndhaXRpbmcgPSAmd2FpdDsKKwlxYy0+Y29tcGxldGVfZm4gPSBhdGFfcWNfY29tcGxldGVfbm9vcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IGF0YV9xY19pc3N1ZShxYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKwllbHNlCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCisJc3RhdHVzID0gYXRhX2Noa19zdGF0dXMoYXApOworCWlmIChzdGF0dXMgJiBBVEFfRVJSKSB7CisJCS8qCisJCSAqIGFyZyEgIEVERCB3b3JrcyBmb3IgYWxsIHRlc3QgY2FzZXMsIGJ1dCBzZWVtcyB0byByZXR1cm4KKwkJICogdGhlIEFUQSBzaWduYXR1cmUgZm9yIHNvbWUgQVRBUEkgZGV2aWNlcy4gIFVudGlsIHRoZQorCQkgKiByZWFzb24gZm9yIHRoaXMgaXMgZm91bmQgYW5kIGZpeGVkLCB3ZSBmaXggdXAgdGhlIG1lc3MKKwkJICogaGVyZS4gIElmIElERU5USUZZIERFVklDRSByZXR1cm5zIGNvbW1hbmQgYWJvcnRlZAorCQkgKiAoYXMgQVRBUEkgZGV2aWNlcyBkbyksIHRoZW4gd2UgaXNzdWUgYW4KKwkJICogSURFTlRJRlkgUEFDS0VUIERFVklDRS4KKwkJICoKKwkJICogQVRBIHNvZnR3YXJlIHJlc2V0IChTUlNULCB0aGUgZGVmYXVsdCkgZG9lcyBub3QgYXBwZWFyCisJCSAqIHRvIGhhdmUgdGhpcyBwcm9ibGVtLgorCQkgKi8KKwkJaWYgKCh1c2luZ19lZGQpICYmIChxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX0lEX0FUQSkpIHsKKwkJCXU4IGVyciA9IGF0YV9jaGtfZXJyKGFwKTsKKwkJCWlmIChlcnIgJiBBVEFfQUJPUlRFRCkgeworCQkJCWRldi0+Y2xhc3MgPSBBVEFfREVWX0FUQVBJOworCQkJCXFjLT5jdXJzZyA9IDA7CisJCQkJcWMtPmN1cnNnX29mcyA9IDA7CisJCQkJcWMtPmN1cnNlY3QgPSAwOworCQkJCXFjLT5uc2VjdCA9IDE7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCQlnb3RvIGVycl9vdXQ7CisJfQorCisJc3dhcF9idWZfbGUxNihkZXYtPmlkLCBBVEFfSURfV09SRFMpOworCisJLyogcHJpbnQgZGV2aWNlIGNhcGFiaWxpdGllcyAqLworCXByaW50ayhLRVJOX0RFQlVHICJhdGEldTogZGV2ICV1IGNmZyAiCisJICAgICAgICI0OTolMDR4IDgyOiUwNHggODM6JTA0eCA4NDolMDR4IDg1OiUwNHggODY6JTA0eCA4NzolMDR4IDg4OiUwNHhcbiIsCisJICAgICAgIGFwLT5pZCwgZGV2aWNlLCBkZXYtPmlkWzQ5XSwKKwkgICAgICAgZGV2LT5pZFs4Ml0sIGRldi0+aWRbODNdLCBkZXYtPmlkWzg0XSwKKwkgICAgICAgZGV2LT5pZFs4NV0sIGRldi0+aWRbODZdLCBkZXYtPmlkWzg3XSwKKwkgICAgICAgZGV2LT5pZFs4OF0pOworCisJLyoKKwkgKiBjb21tb24gQVRBLCBBVEFQSSBmZWF0dXJlIHRlc3RzCisJICovCisKKwkvKiB3ZSByZXF1aXJlIExCQSBhbmQgRE1BIHN1cHBvcnQgKGJpdHMgOCAmIDkgb2Ygd29yZCA0OSkgKi8KKwlpZiAoIWF0YV9pZF9oYXNfZG1hKGRldi0+aWQpIHx8ICFhdGFfaWRfaGFzX2xiYShkZXYtPmlkKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYXRhJXU6IG5vIGRtYS9sYmFcbiIsIGFwLT5pZCk7CisJCWdvdG8gZXJyX291dF9ub3N1cDsKKwl9CisKKwkvKiBxdWljay1uLWRpcnR5IGZpbmQgbWF4IHRyYW5zZmVyIG1vZGU7IGZvciBwcmludGsgb25seSAqLworCXhmZXJfbW9kZXMgPSBkZXYtPmlkW0FUQV9JRF9VRE1BX01PREVTXTsKKwlpZiAoIXhmZXJfbW9kZXMpCisJCXhmZXJfbW9kZXMgPSAoZGV2LT5pZFtBVEFfSURfTVdETUFfTU9ERVNdKSA8PCBBVEFfU0hJRlRfTVdETUE7CisJaWYgKCF4ZmVyX21vZGVzKSB7CisJCXhmZXJfbW9kZXMgPSAoZGV2LT5pZFtBVEFfSURfUElPX01PREVTXSkgPDwgKEFUQV9TSElGVF9QSU8gKyAzKTsKKwkJeGZlcl9tb2RlcyB8PSAoMHg3IDw8IEFUQV9TSElGVF9QSU8pOworCX0KKworCWF0YV9kdW1wX2lkKGRldik7CisKKwkvKiBBVEEtc3BlY2lmaWMgZmVhdHVyZSB0ZXN0cyAqLworCWlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBKSB7CisJCWlmICghYXRhX2lkX2lzX2F0YShkZXYtPmlkKSkJLyogc2FuaXR5IGNoZWNrICovCisJCQlnb3RvIGVycl9vdXRfbm9zdXA7CisKKwkJdG1wID0gZGV2LT5pZFtBVEFfSURfTUFKT1JfVkVSXTsKKwkJZm9yIChpID0gMTQ7IGkgPj0gMTsgaS0tKQorCQkJaWYgKHRtcCAmICgxIDw8IGkpKQorCQkJCWJyZWFrOworCisJCS8qIHdlIHJlcXVpcmUgYXQgbGVhc3QgQVRBLTMgKi8KKwkJaWYgKGkgPCAzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYXRhJXU6IG5vIEFUQS0zXG4iLCBhcC0+aWQpOworCQkJZ290byBlcnJfb3V0X25vc3VwOworCQl9CisKKwkJaWYgKGF0YV9pZF9oYXNfbGJhNDgoZGV2LT5pZCkpIHsKKwkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0xCQTQ4OworCQkJZGV2LT5uX3NlY3RvcnMgPSBhdGFfaWRfdTY0KGRldi0+aWQsIDEwMCk7CisJCX0gZWxzZSB7CisJCQlkZXYtPm5fc2VjdG9ycyA9IGF0YV9pZF91MzIoZGV2LT5pZCwgNjApOworCQl9CisKKwkJYXAtPmhvc3QtPm1heF9jbWRfbGVuID0gMTY7CisKKwkJLyogcHJpbnQgZGV2aWNlIGluZm8gdG8gZG1lc2cgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IGRldiAldSBBVEEsIG1heCAlcywgJUx1IHNlY3RvcnM6JXNcbiIsCisJCSAgICAgICBhcC0+aWQsIGRldmljZSwKKwkJICAgICAgIGF0YV9tb2RlX3N0cmluZyh4ZmVyX21vZGVzKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5uX3NlY3RvcnMsCisJCSAgICAgICBkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4ID8gIiBsYmE0OCIgOiAiIik7CisJfQorCisJLyogQVRBUEktc3BlY2lmaWMgZmVhdHVyZSB0ZXN0cyAqLworCWVsc2UgeworCQlpZiAoYXRhX2lkX2lzX2F0YShkZXYtPmlkKSkJCS8qIHNhbml0eSBjaGVjayAqLworCQkJZ290byBlcnJfb3V0X25vc3VwOworCisJCXJjID0gYXRhcGlfY2RiX2xlbihkZXYtPmlkKTsKKwkJaWYgKChyYyA8IDEyKSB8fCAocmMgPiBBVEFQSV9DREJfTEVOKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IHVuc3VwcG9ydGVkIENEQiBsZW5cbiIsIGFwLT5pZCk7CisJCQlnb3RvIGVycl9vdXRfbm9zdXA7CisJCX0KKwkJYXAtPmNkYl9sZW4gPSAodW5zaWduZWQgaW50KSByYzsKKwkJYXAtPmhvc3QtPm1heF9jbWRfbGVuID0gKHVuc2lnbmVkIGNoYXIpIGFwLT5jZGJfbGVuOworCisJCS8qIHByaW50IGRldmljZSBpbmZvIHRvIGRtZXNnICovCisJCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXUgQVRBUEksIG1heCAlc1xuIiwKKwkJICAgICAgIGFwLT5pZCwgZGV2aWNlLAorCQkgICAgICAgYXRhX21vZGVfc3RyaW5nKHhmZXJfbW9kZXMpKTsKKwl9CisKKwlEUFJJTlRLKCJFWElULCBkcnZfc3RhdCA9IDB4JXhcbiIsIGF0YV9jaGtfc3RhdHVzKGFwKSk7CisJcmV0dXJuOworCitlcnJfb3V0X25vc3VwOgorCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBkZXYgJXUgbm90IHN1cHBvcnRlZCwgaWdub3JpbmdcbiIsCisJICAgICAgIGFwLT5pZCwgZGV2aWNlKTsKK2Vycl9vdXQ6CisJZGV2LT5jbGFzcysrOwkvKiBjb252ZXJ0cyBBVEFfREVWX3h4eCBpbnRvIEFUQV9ERVZfeHh4X1VOU1VQICovCisJRFBSSU5USygiRVhJVCwgZXJyXG4iKTsKK30KKworLyoqCisgKglhdGFfYnVzX3Byb2JlIC0gUmVzZXQgYW5kIHByb2JlIEFUQSBidXMKKyAqCUBhcDogQnVzIHRvIHByb2JlCisgKgorICoJTE9DS0lORzoKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgaW50IGF0YV9idXNfcHJvYmUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgZm91bmQgPSAwOworCisJYXAtPm9wcy0+cGh5X3Jlc2V0KGFwKTsKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkKKwkJZ290byBlcnJfb3V0OworCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCWF0YV9kZXZfaWRlbnRpZnkoYXAsIGkpOworCQlpZiAoYXRhX2Rldl9wcmVzZW50KCZhcC0+ZGV2aWNlW2ldKSkgeworCQkJZm91bmQgPSAxOworCQkJaWYgKGFwLT5vcHMtPmRldl9jb25maWcpCisJCQkJYXAtPm9wcy0+ZGV2X2NvbmZpZyhhcCwgJmFwLT5kZXZpY2VbaV0pOworCQl9CisJfQorCisJaWYgKCghZm91bmQpIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSkKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisKKwlhdGFfc2V0X21vZGUoYXApOworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2Rpc2FibGU6CisJYXAtPm9wcy0+cG9ydF9kaXNhYmxlKGFwKTsKK2Vycl9vdXQ6CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqCWF0YV9wb3J0X3Byb2JlIC0KKyAqCUBhcDoKKyAqCisgKglMT0NLSU5HOgorICovCisKK3ZvaWQgYXRhX3BvcnRfcHJvYmUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlhcC0+ZmxhZ3MgJj0gfkFUQV9GTEFHX1BPUlRfRElTQUJMRUQ7Cit9CisKKy8qKgorICoJX19zYXRhX3BoeV9yZXNldCAtCisgKglAYXA6CisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KK3ZvaWQgX19zYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXUzMiBzc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAoSFogKiA1KTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBX1JFU0VUKSB7CisJCXNjcl93cml0ZShhcCwgU0NSX0NPTlRST0wsIDB4MzAxKTsgLyogaXNzdWUgcGh5IHdha2UvcmVzZXQgKi8KKwkJc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpOwkvKiBkdW1teSByZWFkOyBmbHVzaCAqLworCQl1ZGVsYXkoNDAwKTsJCQkvKiBGSVhNRTogYSBndWVzcyAqLworCX0KKwlzY3Jfd3JpdGUoYXAsIFNDUl9DT05UUk9MLCAweDMwMCk7CS8qIGlzc3VlIHBoeSB3YWtlL2NsZWFyIHJlc2V0ICovCisKKwkvKiB3YWl0IGZvciBwaHkgdG8gYmVjb21lIHJlYWR5LCBpZiBuZWNlc3NhcnkgKi8KKwlkbyB7CisJCW1zbGVlcCgyMDApOworCQlzc3RhdHVzID0gc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpOworCQlpZiAoKHNzdGF0dXMgJiAweGYpICE9IDEpCisJCQlicmVhazsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwkvKiBUT0RPOiBwaHkgbGF5ZXIgd2l0aCBwb2xsaW5nLCB0aW1lb3V0cywgZXRjLiAqLworCWlmIChzYXRhX2Rldl9wcmVzZW50KGFwKSkKKwkJYXRhX3BvcnRfcHJvYmUoYXApOworCWVsc2UgeworCQlzc3RhdHVzID0gc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpOworCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogbm8gZGV2aWNlIGZvdW5kIChwaHkgc3RhdCAlMDh4KVxuIiwKKwkJICAgICAgIGFwLT5pZCwgc3N0YXR1cyk7CisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCX0KKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKQorCQlyZXR1cm47CisKKwlpZiAoYXRhX2J1c3lfc2xlZXAoYXAsIEFUQV9UTU9VVF9CT09UX1FVSUNLLCBBVEFfVE1PVVRfQk9PVCkpIHsKKwkJYXRhX3BvcnRfZGlzYWJsZShhcCk7CisJCXJldHVybjsKKwl9CisKKwlhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOworfQorCisvKioKKyAqCV9fc2F0YV9waHlfcmVzZXQgLQorICoJQGFwOgorICoKKyAqCUxPQ0tJTkc6CisgKgorICovCit2b2lkIHNhdGFfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJX19zYXRhX3BoeV9yZXNldChhcCk7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpCisJCXJldHVybjsKKwlhdGFfYnVzX3Jlc2V0KGFwKTsKK30KKworLyoqCisgKglhdGFfcG9ydF9kaXNhYmxlIC0KKyAqCUBhcDoKKyAqCisgKglMT0NLSU5HOgorICovCisKK3ZvaWQgYXRhX3BvcnRfZGlzYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWFwLT5kZXZpY2VbMF0uY2xhc3MgPSBBVEFfREVWX05PTkU7CisJYXAtPmRldmljZVsxXS5jbGFzcyA9IEFUQV9ERVZfTk9ORTsKKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCXU4IGJhc2U7Cit9IHhmZXJfbW9kZV9jbGFzc2VzW10gPSB7CisJeyBBVEFfU0hJRlRfVURNQSwJWEZFUl9VRE1BXzAgfSwKKwl7IEFUQV9TSElGVF9NV0RNQSwJWEZFUl9NV19ETUFfMCB9LAorCXsgQVRBX1NISUZUX1BJTywJWEZFUl9QSU9fMCB9LAorfTsKKworc3RhdGljIGlubGluZSB1OCBiYXNlX2Zyb21fc2hpZnQodW5zaWduZWQgaW50IHNoaWZ0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeGZlcl9tb2RlX2NsYXNzZXMpOyBpKyspCisJCWlmICh4ZmVyX21vZGVfY2xhc3Nlc1tpXS5zaGlmdCA9PSBzaGlmdCkKKwkJCXJldHVybiB4ZmVyX21vZGVfY2xhc3Nlc1tpXS5iYXNlOworCisJcmV0dXJuIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9kZXZfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwlpbnQgb2ZzLCBpZHg7CisJdTggYmFzZTsKKworCWlmICghYXRhX2Rldl9wcmVzZW50KGRldikgfHwgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpKQorCQlyZXR1cm47CisKKwlpZiAoZGV2LT54ZmVyX3NoaWZ0ID09IEFUQV9TSElGVF9QSU8pCisJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX1BJTzsKKworCWF0YV9kZXZfc2V0X3hmZXJtb2RlKGFwLCBkZXYpOworCisJYmFzZSA9IGJhc2VfZnJvbV9zaGlmdChkZXYtPnhmZXJfc2hpZnQpOworCW9mcyA9IGRldi0+eGZlcl9tb2RlIC0gYmFzZTsKKwlpZHggPSBvZnMgKyBkZXYtPnhmZXJfc2hpZnQ7CisJV0FSTl9PTihpZHggPj0gQVJSQVlfU0laRSh4ZmVyX21vZGVfc3RyKSk7CisKKwlEUFJJTlRLKCJpZHg9JWQgeGZlcl9zaGlmdD0ldSwgeGZlcl9tb2RlPTB4JXgsIGJhc2U9MHgleCwgb2Zmc2V0PSVkXG4iLAorCQlpZHgsIGRldi0+eGZlcl9zaGlmdCwgKGludClkZXYtPnhmZXJfbW9kZSwgKGludCliYXNlLCBvZnMpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IGRldiAldSBjb25maWd1cmVkIGZvciAlc1xuIiwKKwkJYXAtPmlkLCBkZXYtPmRldm5vLCB4ZmVyX21vZGVfc3RyW2lkeF0pOworfQorCitzdGF0aWMgaW50IGF0YV9ob3N0X3NldF9waW8oc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlpbnQgeCwgaTsKKwl1OCBiYXNlLCB4ZmVyX21vZGU7CisKKwltYXNrID0gYXRhX2dldF9tb2RlX21hc2soYXAsIEFUQV9TSElGVF9QSU8pOworCXggPSBmZ2IobWFzayk7CisJaWYgKHggPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBubyBQSU8gc3VwcG9ydFxuIiwgYXAtPmlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJhc2UgPSBiYXNlX2Zyb21fc2hpZnQoQVRBX1NISUZUX1BJTyk7CisJeGZlcl9tb2RlID0gYmFzZSArIHg7CisKKwlEUFJJTlRLKCJiYXNlIDB4JXggeGZlcl9tb2RlIDB4JXggbWFzayAweCV4IHggJWRcbiIsCisJCShpbnQpYmFzZSwgKGludCl4ZmVyX21vZGUsIG1hc2ssIHgpOworCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJaWYgKGF0YV9kZXZfcHJlc2VudChkZXYpKSB7CisJCQlkZXYtPnBpb19tb2RlID0geGZlcl9tb2RlOworCQkJZGV2LT54ZmVyX21vZGUgPSB4ZmVyX21vZGU7CisJCQlkZXYtPnhmZXJfc2hpZnQgPSBBVEFfU0hJRlRfUElPOworCQkJaWYgKGFwLT5vcHMtPnNldF9waW9tb2RlKQorCQkJCWFwLT5vcHMtPnNldF9waW9tb2RlKGFwLCBkZXYpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9ob3N0X3NldF9kbWEoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggeGZlcl9tb2RlLAorCQkJICAgIHVuc2lnbmVkIGludCB4ZmVyX3NoaWZ0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJaWYgKGF0YV9kZXZfcHJlc2VudChkZXYpKSB7CisJCQlkZXYtPmRtYV9tb2RlID0geGZlcl9tb2RlOworCQkJZGV2LT54ZmVyX21vZGUgPSB4ZmVyX21vZGU7CisJCQlkZXYtPnhmZXJfc2hpZnQgPSB4ZmVyX3NoaWZ0OworCQkJaWYgKGFwLT5vcHMtPnNldF9kbWFtb2RlKQorCQkJCWFwLT5vcHMtPnNldF9kbWFtb2RlKGFwLCBkZXYpOworCQl9CisJfQorfQorCisvKioKKyAqCWF0YV9zZXRfbW9kZSAtIFByb2dyYW0gdGltaW5ncyBhbmQgaXNzdWUgU0VUIEZFQVRVUkVTIC0gWEZFUgorICoJQGFwOiBwb3J0IG9uIHdoaWNoIHRpbWluZ3Mgd2lsbCBiZSBwcm9ncmFtbWVkCisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGF0YV9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXVuc2lnbmVkIGludCBpLCB4ZmVyX3NoaWZ0OworCXU4IHhmZXJfbW9kZTsKKwlpbnQgcmM7CisKKwkvKiBzdGVwIDE6IGFsd2F5cyBzZXQgaG9zdCBQSU8gdGltaW5ncyAqLworCXJjID0gYXRhX2hvc3Rfc2V0X3BpbyhhcCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiBzdGVwIDI6IGNob29zZSB0aGUgYmVzdCBkYXRhIHhmZXIgbW9kZSAqLworCXhmZXJfbW9kZSA9IHhmZXJfc2hpZnQgPSAwOworCXJjID0gYXRhX2Nob29zZV94ZmVyX21vZGUoYXAsICZ4ZmVyX21vZGUsICZ4ZmVyX3NoaWZ0KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCS8qIHN0ZXAgMzogaWYgdGhhdCB4ZmVyIG1vZGUgaXNuJ3QgUElPLCBzZXQgaG9zdCBETUEgdGltaW5ncyAqLworCWlmICh4ZmVyX3NoaWZ0ICE9IEFUQV9TSElGVF9QSU8pCisJCWF0YV9ob3N0X3NldF9kbWEoYXAsIHhmZXJfbW9kZSwgeGZlcl9zaGlmdCk7CisKKwkvKiBzdGVwIDQ6IHVwZGF0ZSBkZXZpY2VzJyB4ZmVyIG1vZGUgKi8KKwlhdGFfZGV2X3NldF9tb2RlKGFwLCAmYXAtPmRldmljZVswXSk7CisJYXRhX2Rldl9zZXRfbW9kZShhcCwgJmFwLT5kZXZpY2VbMV0pOworCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpCisJCXJldHVybjsKKworCWlmIChhcC0+b3BzLT5wb3N0X3NldF9tb2RlKQorCQlhcC0+b3BzLT5wb3N0X3NldF9tb2RlKGFwKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOworCQlhdGFfZGV2X3NldF9wcm90b2NvbChkZXYpOworCX0KKworCXJldHVybjsKKworZXJyX291dDoKKwlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKK30KKworLyoqCisgKglhdGFfYnVzeV9zbGVlcCAtIHNsZWVwIHVudGlsIEJTWSBjbGVhcnMsIG9yIHRpbWVvdXQKKyAqCUBhcDogcG9ydCBjb250YWluaW5nIHN0YXR1cyByZWdpc3RlciB0byBiZSBwb2xsZWQKKyAqCUB0bW91dF9wYXQ6IGltcGF0aWVuY2UgdGltZW91dAorICoJQHRtb3V0OiBvdmVyYWxsIHRpbWVvdXQKKyAqCisgKglMT0NLSU5HOgorICoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9idXN5X3NsZWVwIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHRtb3V0X3BhdCwKKwkJCSAgICAJICAgIHVuc2lnbmVkIGxvbmcgdG1vdXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9zdGFydCwgdGltZW91dDsKKwl1OCBzdGF0dXM7CisKKwlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMzAwKTsKKwl0aW1lcl9zdGFydCA9IGppZmZpZXM7CisJdGltZW91dCA9IHRpbWVyX3N0YXJ0ICsgdG1vdXRfcGF0OworCXdoaWxlICgoc3RhdHVzICYgQVRBX0JVU1kpICYmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkpIHsKKwkJbXNsZWVwKDUwKTsKKwkJc3RhdHVzID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1ksIDMpOworCX0KKworCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXUgaXMgc2xvdyB0byByZXNwb25kLCAiCisJCSAgICAgICAicGxlYXNlIGJlIHBhdGllbnRcbiIsIGFwLT5pZCk7CisKKwl0aW1lb3V0ID0gdGltZXJfc3RhcnQgKyB0bW91dDsKKwl3aGlsZSAoKHN0YXR1cyAmIEFUQV9CVVNZKSAmJiAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpKSB7CisJCW1zbGVlcCg1MCk7CisJCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldSBmYWlsZWQgdG8gcmVzcG9uZCAoJWx1IHNlY3MpXG4iLAorCQkgICAgICAgYXAtPmlkLCB0bW91dCAvIEhaKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9idXNfcG9zdF9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2bWFzaykKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCXVuc2lnbmVkIGludCBkZXYwID0gZGV2bWFzayAmICgxIDw8IDApOworCXVuc2lnbmVkIGludCBkZXYxID0gZGV2bWFzayAmICgxIDw8IDEpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIGlmIGRldmljZSAwIHdhcyBmb3VuZCBpbiBhdGFfZGV2Y2hrLCB3YWl0IGZvciBpdHMKKwkgKiBCU1kgYml0IHRvIGNsZWFyCisJICovCisJaWYgKGRldjApCisJCWF0YV9idXN5X3NsZWVwKGFwLCBBVEFfVE1PVVRfQk9PVF9RVUlDSywgQVRBX1RNT1VUX0JPT1QpOworCisJLyogaWYgZGV2aWNlIDEgd2FzIGZvdW5kIGluIGF0YV9kZXZjaGssIHdhaXQgZm9yCisJICogcmVnaXN0ZXIgYWNjZXNzLCB0aGVuIHdhaXQgZm9yIEJTWSB0byBjbGVhcgorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgQVRBX1RNT1VUX0JPT1Q7CisJd2hpbGUgKGRldjEpIHsKKwkJdTggbnNlY3QsIGxiYWw7CisKKwkJYXAtPm9wcy0+ZGV2X3NlbGVjdChhcCwgMSk7CisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKSB7CisJCQluc2VjdCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJCWxiYWwgPSByZWFkYigodm9pZCBfX2lvbWVtICopIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCW5zZWN0ID0gaW5iKGlvYWRkci0+bnNlY3RfYWRkcik7CisJCQlsYmFsID0gaW5iKGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJfQorCQlpZiAoKG5zZWN0ID09IDEpICYmIChsYmFsID09IDEpKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXYxID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCg1MCk7CS8qIGdpdmUgZHJpdmUgYSBicmVhdGhlciAqLworCX0KKwlpZiAoZGV2MSkKKwkJYXRhX2J1c3lfc2xlZXAoYXAsIEFUQV9UTU9VVF9CT09UX1FVSUNLLCBBVEFfVE1PVVRfQk9PVCk7CisKKwkvKiBpcyBhbGwgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAqLworCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIDApOworCWlmIChkZXYxKQorCQlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCAxKTsKKwlpZiAoZGV2MCkKKwkJYXAtPm9wcy0+ZGV2X3NlbGVjdChhcCwgMCk7Cit9CisKKy8qKgorICoJYXRhX2J1c19lZGQgLQorICoJQGFwOgorICoKKyAqCUxPQ0tJTkc6CisgKgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2J1c19lZGQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOworCisJLyogc2V0IHVwIGV4ZWN1dGUtZGV2aWNlLWRpYWcgKGJ1cyByZXNldCkgdGFza2ZpbGUgKi8KKwkvKiBhbHNvLCB0YWtlIGludGVycnVwdHMgdG8gYSBrbm93biBzdGF0ZSAoZGlzYWJsZWQpICovCisJRFBSSU5USygiZXhlY3V0ZS1kZXZpY2UtZGlhZ1xuIik7CisJYXRhX3RmX2luaXQoYXAsICZ0ZiwgMCk7CisJdGYuY3RsIHw9IEFUQV9OSUVOOworCXRmLmNvbW1hbmQgPSBBVEFfQ01EX0VERDsKKwl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKKworCS8qIGRvIGJ1cyByZXNldCAqLworCWF0YV90Zl90b19ob3N0KGFwLCAmdGYpOworCisJLyogc3BlYyBzYXlzIGF0IGxlYXN0IDJtcy4gIGJ1dCB3aG8ga25vd3Mgd2l0aCB0aG9zZQorCSAqIGNyYXp5IEFUQVBJIGRldmljZXMuLi4KKwkgKi8KKwltc2xlZXAoMTUwKTsKKworCXJldHVybiBhdGFfYnVzeV9zbGVlcChhcCwgQVRBX1RNT1VUX0JPT1RfUVVJQ0ssIEFUQV9UTU9VVF9CT09UKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfYnVzX3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBkZXZtYXNrKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisKKwlEUFJJTlRLKCJhdGEldTogYnVzIHJlc2V0IHZpYSBTUlNUXG4iLCBhcC0+aWQpOworCisJLyogc29mdHdhcmUgcmVzZXQuICBjYXVzZXMgZGV2MCB0byBiZSBzZWxlY3RlZCAqLworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKSB7CisJCXdyaXRlYihhcC0+Y3RsLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+Y3RsX2FkZHIpOworCQl1ZGVsYXkoMjApOwkvKiBGSVhNRTogZmx1c2ggKi8KKwkJd3JpdGViKGFwLT5jdGwgfCBBVEFfU1JTVCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKKwkJdWRlbGF5KDIwKTsJLyogRklYTUU6IGZsdXNoICovCisJCXdyaXRlYihhcC0+Y3RsLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+Y3RsX2FkZHIpOworCX0gZWxzZSB7CisJCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJCXVkZWxheSgxMCk7CisJCW91dGIoYXAtPmN0bCB8IEFUQV9TUlNULCBpb2FkZHItPmN0bF9hZGRyKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3V0YihhcC0+Y3RsLCBpb2FkZHItPmN0bF9hZGRyKTsKKwl9CisKKwkvKiBzcGVjIG1hbmRhdGVzICI+PSAybXMiIGJlZm9yZSBjaGVja2luZyBzdGF0dXMuCisJICogV2Ugd2FpdCAxNTBtcywgYmVjYXVzZSB0aGF0IHdhcyB0aGUgbWFnaWMgZGVsYXkgdXNlZCBmb3IKKwkgKiBBVEFQSSBkZXZpY2VzIGluIEhhbGUgTGFuZGlzJ3MgQVRBRFJWUiwgZm9yIHRoZSBwZXJpb2Qgb2YgdGltZQorCSAqIGJldHdlZW4gd2hlbiB0aGUgQVRBIGNvbW1hbmQgcmVnaXN0ZXIgaXMgd3JpdHRlbiwgYW5kIHRoZW4KKwkgKiBzdGF0dXMgaXMgY2hlY2tlZC4gIEJlY2F1c2Ugd2FpdGluZyBmb3IgImEgd2hpbGUiIGJlZm9yZQorCSAqIGNoZWNraW5nIHN0YXR1cyBpcyBmaW5lLCBwb3N0IFNSU1QsIHdlIHBlcmZvcm0gdGhpcyBtYWdpYworCSAqIGRlbGF5IGhlcmUgYXMgd2VsbC4KKwkgKi8KKwltc2xlZXAoMTUwKTsKKworCWF0YV9idXNfcG9zdF9yZXNldChhcCwgZGV2bWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfYnVzX3Jlc2V0IC0gcmVzZXQgaG9zdCBwb3J0IGFuZCBhc3NvY2lhdGVkIEFUQSBjaGFubmVsCisgKglAYXA6IHBvcnQgdG8gcmVzZXQKKyAqCisgKglUaGlzIGlzIHR5cGljYWxseSB0aGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSBzdGFydCBpc3N1aW5nCisgKgljb21tYW5kcyB0byB0aGUgQVRBIGNoYW5uZWwuICBXZSB3YWl0IGZvciBCU1kgdG8gY2xlYXIsIHRoZW4KKyAqCWlzc3VlIEVYRUNVVEUgREVWSUNFIERJQUdOT1NUSUMgY29tbWFuZCwgcG9sbGluZyBmb3IgaXRzCisgKglyZXN1bHQuICBEZXRlcm1pbmUgd2hhdCBkZXZpY2VzLCBpZiBhbnksIGFyZSBvbiB0aGUgY2hhbm5lbAorICoJYnkgbG9va2luZyBhdCB0aGUgZGV2aWNlIDAvMSBlcnJvciByZWdpc3Rlci4gIExvb2sgYXQgdGhlIHNpZ25hdHVyZQorICoJc3RvcmVkIGluIGVhY2ggZGV2aWNlJ3MgdGFza2ZpbGUgcmVnaXN0ZXJzLCB0byBkZXRlcm1pbmUgaWYKKyAqCXRoZSBkZXZpY2UgaXMgQVRBIG9yIEFUQVBJLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuICBTb21lIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhpcyBmdW5jdGlvbgorICoJb2J0YWluIHRoZSBob3N0X3NldCBsb2NrLgorICoKKyAqCVNJREUgRUZGRUNUUzoKKyAqCVNldHMgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCBpZiBidXMgcmVzZXQgZmFpbHMuCisgKi8KKwordm9pZCBhdGFfYnVzX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2xhdmVfcG9zc2libGUgPSBhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TTEFWRV9QT1NTOworCXU4IGVycjsKKwl1bnNpZ25lZCBpbnQgZGV2MCwgZGV2MSA9IDAsIHJjID0gMCwgZGV2bWFzayA9IDA7CisKKwlEUFJJTlRLKCJFTlRFUiwgaG9zdCAldSwgcG9ydCAldVxuIiwgYXAtPmlkLCBhcC0+cG9ydF9ubyk7CisKKwkvKiBkZXRlcm1pbmUgaWYgZGV2aWNlIDAvMSBhcmUgcHJlc2VudCAqLworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBX1JFU0VUKQorCQlkZXYwID0gMTsKKwllbHNlIHsKKwkJZGV2MCA9IGF0YV9kZXZjaGsoYXAsIDApOworCQlpZiAoc2xhdmVfcG9zc2libGUpCisJCQlkZXYxID0gYXRhX2RldmNoayhhcCwgMSk7CisJfQorCisJaWYgKGRldjApCisJCWRldm1hc2sgfD0gKDEgPDwgMCk7CisJaWYgKGRldjEpCisJCWRldm1hc2sgfD0gKDEgPDwgMSk7CisKKwkvKiBzZWxlY3QgZGV2aWNlIDAgYWdhaW4gKi8KKwlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCAwKTsKKworCS8qIGlzc3VlIGJ1cyByZXNldCAqLworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TUlNUKQorCQlyYyA9IGF0YV9idXNfc29mdHJlc2V0KGFwLCBkZXZtYXNrKTsKKwllbHNlIGlmICgoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQV9SRVNFVCkgPT0gMCkgeworCQkvKiBzZXQgdXAgZGV2aWNlIGNvbnRyb2wgKi8KKwkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCQl3cml0ZWIoYXAtPmN0bCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKKwkJZWxzZQorCQkJb3V0YihhcC0+Y3RsLCBpb2FkZHItPmN0bF9hZGRyKTsKKwkJcmMgPSBhdGFfYnVzX2VkZChhcCk7CisJfQorCisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKgorCSAqIGRldGVybWluZSBieSBzaWduYXR1cmUgd2hldGhlciB3ZSBoYXZlIEFUQSBvciBBVEFQSSBkZXZpY2VzCisJICovCisJZXJyID0gYXRhX2Rldl90cnlfY2xhc3NpZnkoYXAsIDApOworCWlmICgoc2xhdmVfcG9zc2libGUpICYmIChlcnIgIT0gMHg4MSkpCisJCWF0YV9kZXZfdHJ5X2NsYXNzaWZ5KGFwLCAxKTsKKworCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisJaWYgKGFwLT5pb2FkZHIuY3RsX2FkZHIpCS8qIEZJWE1FOiBoYWNrLiBjcmVhdGUgYSBob29rIGluc3RlYWQgKi8KKwkJYXRhX2lycV9vbihhcCk7CisKKwkvKiBpcyBkb3VibGUtc2VsZWN0IHJlYWxseSBuZWNlc3Nhcnk/ICovCisJaWYgKGFwLT5kZXZpY2VbMV0uY2xhc3MgIT0gQVRBX0RFVl9OT05FKQorCQlhcC0+b3BzLT5kZXZfc2VsZWN0KGFwLCAxKTsKKwlpZiAoYXAtPmRldmljZVswXS5jbGFzcyAhPSBBVEFfREVWX05PTkUpCisJCWFwLT5vcHMtPmRldl9zZWxlY3QoYXAsIDApOworCisJLyogaWYgbm8gZGV2aWNlcyB3ZXJlIGRldGVjdGVkLCBkaXNhYmxlIHRoaXMgcG9ydCAqLworCWlmICgoYXAtPmRldmljZVswXS5jbGFzcyA9PSBBVEFfREVWX05PTkUpICYmCisJICAgIChhcC0+ZGV2aWNlWzFdLmNsYXNzID09IEFUQV9ERVZfTk9ORSkpCisJCWdvdG8gZXJyX291dDsKKworCWlmIChhcC0+ZmxhZ3MgJiAoQVRBX0ZMQUdfU0FUQV9SRVNFVCB8IEFUQV9GTEFHX1NSU1QpKSB7CisJCS8qIHNldCB1cCBkZXZpY2UgY29udHJvbCBmb3IgQVRBX0ZMQUdfU0FUQV9SRVNFVCAqLworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJCXdyaXRlYihhcC0+Y3RsLCAodm9pZCBfX2lvbWVtICopIGlvYWRkci0+Y3RsX2FkZHIpOworCQllbHNlCisJCQlvdXRiKGFwLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOworCX0KKworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybjsKKworZXJyX291dDoKKwlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBkaXNhYmxpbmcgcG9ydFxuIiwgYXAtPmlkKTsKKwlhcC0+b3BzLT5wb3J0X2Rpc2FibGUoYXApOworCisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9wcl9ibGFja2xpc3RlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBkZXYgJXUgaXMgb24gRE1BIGJsYWNrbGlzdCwgZGlzYWJsaW5nIERNQVxuIiwKKwkJYXAtPmlkLCBkZXYtPmRldm5vKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBhdGFfZG1hX2JsYWNrbGlzdCBbXSA9IHsKKwkiV0RDIEFDMTEwMDBIIiwKKwkiV0RDIEFDMjIxMDBIIiwKKwkiV0RDIEFDMzI1MDBIIiwKKwkiV0RDIEFDMzMxMDBIIiwKKwkiV0RDIEFDMzE2MDBIIiwKKwkiV0RDIEFDMzIxMDBIIiwKKwkiV0RDIEFDMjMyMDBMIiwKKwkiQ29tcGFxIENSRC04MjQxQiIsCisJIkNSRC04NDAwQiIsCisJIkNSRC04NDgwQiIsCisJIkNSRC04NDgyQiIsCisgCSJDUkQtODQiLAorCSJTYW5EaXNrIFNEUDNCIiwKKwkiU2FuRGlzayBTRFAzQi02NCIsCisJIlNBTllPIENELVJPTSBDUkQiLAorCSJISVRBQ0hJIENEUi04IiwKKwkiSElUQUNISSBDRFItODMzNSIsCisJIkhJVEFDSEkgQ0RSLTg0MzUiLAorCSJUb3NoaWJhIENELVJPTSBYTS02MjAyQiIsCisJIkNELTUzMkUtQSIsCisJIkUtSURFIENELVJPTSBDUi04NDAiLAorCSJDRC1ST00gRHJpdmUvRjVBIiwKKwkiV1BJIENERC04MjAiLAorCSJTQU1TVU5HIENELVJPTSBTQy0xNDhDIiwKKwkiU0FNU1VORyBDRC1ST00gU0MiLAorCSJTYW5EaXNrIFNEUDNCLTY0IiwKKwkiU0FNU1VORyBDRC1ST00gU04tMTI0IiwKKwkiQVRBUEkgQ0QtUk9NIERSSVZFIDQwWCBNQVhJTVVNIiwKKwkiX05FQyBEVjU4MDBBIiwKK307CisKK3N0YXRpYyBpbnQgYXRhX2RtYV9ibGFja2xpc3RlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtWzQwXTsKKwljaGFyICpzOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGk7CisKKwlhdGFfZGV2X2lkX3N0cmluZyhkZXYtPmlkLCBtb2RlbF9udW0sIEFUQV9JRF9QUk9EX09GUywKKwkJCSAgc2l6ZW9mKG1vZGVsX251bSkpOworCXMgPSAmbW9kZWxfbnVtWzBdOworCWxlbiA9IHN0cm5sZW4ocywgc2l6ZW9mKG1vZGVsX251bSkpOworCisJLyogQVRBUEkgc3BlY2lmaWVzIHRoYXQgZW1wdHkgc3BhY2UgaXMgYmxhbmstZmlsbGVkOyByZW1vdmUgYmxhbmtzICovCisJd2hpbGUgKChsZW4gPiAwKSAmJiAoc1tsZW4gLSAxXSA9PSAnICcpKSB7CisJCWxlbi0tOworCQlzW2xlbl0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0YV9kbWFfYmxhY2tsaXN0KTsgaSsrKQorCQlpZiAoIXN0cm5jbXAoYXRhX2RtYV9ibGFja2xpc3RbaV0sIHMsIGxlbikpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9nZXRfbW9kZV9tYXNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBzaGlmdCkKK3sKKwlzdHJ1Y3QgYXRhX2RldmljZSAqbWFzdGVyLCAqc2xhdmU7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwltYXN0ZXIgPSAmYXAtPmRldmljZVswXTsKKwlzbGF2ZSA9ICZhcC0+ZGV2aWNlWzFdOworCisJYXNzZXJ0IChhdGFfZGV2X3ByZXNlbnQobWFzdGVyKSB8fCBhdGFfZGV2X3ByZXNlbnQoc2xhdmUpKTsKKworCWlmIChzaGlmdCA9PSBBVEFfU0hJRlRfVURNQSkgeworCQltYXNrID0gYXAtPnVkbWFfbWFzazsKKwkJaWYgKGF0YV9kZXZfcHJlc2VudChtYXN0ZXIpKSB7CisJCQltYXNrICY9IChtYXN0ZXItPmlkW0FUQV9JRF9VRE1BX01PREVTXSAmIDB4ZmYpOworCQkJaWYgKGF0YV9kbWFfYmxhY2tsaXN0ZWQoYXAsIG1hc3RlcikpIHsKKwkJCQltYXNrID0gMDsKKwkJCQlhdGFfcHJfYmxhY2tsaXN0ZWQoYXAsIG1hc3Rlcik7CisJCQl9CisJCX0KKwkJaWYgKGF0YV9kZXZfcHJlc2VudChzbGF2ZSkpIHsKKwkJCW1hc2sgJj0gKHNsYXZlLT5pZFtBVEFfSURfVURNQV9NT0RFU10gJiAweGZmKTsKKwkJCWlmIChhdGFfZG1hX2JsYWNrbGlzdGVkKGFwLCBzbGF2ZSkpIHsKKwkJCQltYXNrID0gMDsKKwkJCQlhdGFfcHJfYmxhY2tsaXN0ZWQoYXAsIHNsYXZlKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmIChzaGlmdCA9PSBBVEFfU0hJRlRfTVdETUEpIHsKKwkJbWFzayA9IGFwLT5td2RtYV9tYXNrOworCQlpZiAoYXRhX2Rldl9wcmVzZW50KG1hc3RlcikpIHsKKwkJCW1hc2sgJj0gKG1hc3Rlci0+aWRbQVRBX0lEX01XRE1BX01PREVTXSAmIDB4MDcpOworCQkJaWYgKGF0YV9kbWFfYmxhY2tsaXN0ZWQoYXAsIG1hc3RlcikpIHsKKwkJCQltYXNrID0gMDsKKwkJCQlhdGFfcHJfYmxhY2tsaXN0ZWQoYXAsIG1hc3Rlcik7CisJCQl9CisJCX0KKwkJaWYgKGF0YV9kZXZfcHJlc2VudChzbGF2ZSkpIHsKKwkJCW1hc2sgJj0gKHNsYXZlLT5pZFtBVEFfSURfTVdETUFfTU9ERVNdICYgMHgwNyk7CisJCQlpZiAoYXRhX2RtYV9ibGFja2xpc3RlZChhcCwgc2xhdmUpKSB7CisJCQkJbWFzayA9IDA7CisJCQkJYXRhX3ByX2JsYWNrbGlzdGVkKGFwLCBzbGF2ZSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoc2hpZnQgPT0gQVRBX1NISUZUX1BJTykgeworCQltYXNrID0gYXAtPnBpb19tYXNrOworCQlpZiAoYXRhX2Rldl9wcmVzZW50KG1hc3RlcikpIHsKKwkJCS8qIHNwZWMgZG9lc24ndCByZXR1cm4gZXhwbGljaXQgc3VwcG9ydCBmb3IKKwkJCSAqIFBJTzAtMiwgc28gd2UgZmFrZSBpdAorCQkJICovCisJCQl1MTYgdG1wX21vZGUgPSBtYXN0ZXItPmlkW0FUQV9JRF9QSU9fTU9ERVNdICYgMHgwMzsKKwkJCXRtcF9tb2RlIDw8PSAzOworCQkJdG1wX21vZGUgfD0gMHg3OworCQkJbWFzayAmPSB0bXBfbW9kZTsKKwkJfQorCQlpZiAoYXRhX2Rldl9wcmVzZW50KHNsYXZlKSkgeworCQkJLyogc3BlYyBkb2Vzbid0IHJldHVybiBleHBsaWNpdCBzdXBwb3J0IGZvcgorCQkJICogUElPMC0yLCBzbyB3ZSBmYWtlIGl0CisJCQkgKi8KKwkJCXUxNiB0bXBfbW9kZSA9IHNsYXZlLT5pZFtBVEFfSURfUElPX01PREVTXSAmIDB4MDM7CisJCQl0bXBfbW9kZSA8PD0gMzsKKwkJCXRtcF9tb2RlIHw9IDB4NzsKKwkJCW1hc2sgJj0gdG1wX21vZGU7CisJCX0KKwl9CisJZWxzZSB7CisJCW1hc2sgPSAweGZmZmZmZmZmOyAvKiBzaHV0IHVwIGNvbXBpbGVyIHdhcm5pbmcgKi8KKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qIGZpbmQgZ3JlYXRlc3QgYml0ICovCitzdGF0aWMgaW50IGZnYih1MzIgYml0bWFwKQoreworCXVuc2lnbmVkIGludCBpOworCWludCB4ID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKGJpdG1hcCAmICgxIDw8IGkpKQorCQkJeCA9IGk7CisKKwlyZXR1cm4geDsKK30KKworLyoqCisgKglhdGFfY2hvb3NlX3hmZXJfbW9kZSAtIGF0dGVtcHQgdG8gZmluZCBiZXN0IHRyYW5zZmVyIG1vZGUKKyAqCUBhcDogUG9ydCBmb3Igd2hpY2ggYW4geGZlciBtb2RlIHdpbGwgYmUgc2VsZWN0ZWQKKyAqCUB4ZmVyX21vZGVfb3V0OiAob3V0cHV0KSBTRVQgRkVBVFVSRVMgLSBYRkVSIE1PREUgY29kZQorICoJQHhmZXJfc2hpZnRfb3V0OiAob3V0cHV0KSBiaXQgc2hpZnQgdGhhdCBzZWxlY3RzIHRoaXMgbW9kZQorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KKworc3RhdGljIGludCBhdGFfY2hvb3NlX3hmZXJfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCXU4ICp4ZmVyX21vZGVfb3V0LAorCQkJCXVuc2lnbmVkIGludCAqeGZlcl9zaGlmdF9vdXQpCit7CisJdW5zaWduZWQgaW50IG1hc2ssIHNoaWZ0OworCWludCB4LCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeGZlcl9tb2RlX2NsYXNzZXMpOyBpKyspIHsKKwkJc2hpZnQgPSB4ZmVyX21vZGVfY2xhc3Nlc1tpXS5zaGlmdDsKKwkJbWFzayA9IGF0YV9nZXRfbW9kZV9tYXNrKGFwLCBzaGlmdCk7CisKKwkJeCA9IGZnYihtYXNrKTsKKwkJaWYgKHggPj0gMCkgeworCQkJKnhmZXJfbW9kZV9vdXQgPSB4ZmVyX21vZGVfY2xhc3Nlc1tpXS5iYXNlICsgeDsKKwkJCSp4ZmVyX3NoaWZ0X291dCA9IHNoaWZ0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICoJYXRhX2Rldl9zZXRfeGZlcm1vZGUgLSBJc3N1ZSBTRVQgRkVBVFVSRVMgLSBYRkVSIE1PREUgY29tbWFuZAorICoJQGFwOiBQb3J0IGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UgQGRldgorICoJQGRldjogRGV2aWNlIHRvIHdoaWNoIGNvbW1hbmQgd2lsbCBiZSBzZW50CisgKgorICoJTE9DS0lORzoKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfZGV2X3NldF94ZmVybW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogc2V0IHVwIHNldC1mZWF0dXJlcyB0YXNrZmlsZSAqLworCURQUklOVEsoInNldCBmZWF0dXJlcyAtIHhmZXIgbW9kZVxuIik7CisKKwlxYyA9IGF0YV9xY19uZXdfaW5pdChhcCwgZGV2KTsKKwlCVUdfT04ocWMgPT0gTlVMTCk7CisKKwlxYy0+dGYuY29tbWFuZCA9IEFUQV9DTURfU0VUX0ZFQVRVUkVTOworCXFjLT50Zi5mZWF0dXJlID0gU0VURkVBVFVSRVNfWEZFUjsKKwlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfTk9EQVRBOworCXFjLT50Zi5uc2VjdCA9IGRldi0+eGZlcl9tb2RlOworCisJcWMtPndhaXRpbmcgPSAmd2FpdDsKKwlxYy0+Y29tcGxldGVfZm4gPSBhdGFfcWNfY29tcGxldGVfbm9vcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IGF0YV9xY19pc3N1ZShxYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmMpCisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCWVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfc2dfY2xlYW4gLQorICoJQHFjOgorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHZvaWQgYXRhX3NnX2NsZWFuKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcWMtPnNnOworCWludCBkaXIgPSBxYy0+ZG1hX2RpcjsKKworCWFzc2VydChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCk7CisJYXNzZXJ0KHNnICE9IE5VTEwpOworCisJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfU0lOR0xFKQorCQlhc3NlcnQocWMtPm5fZWxlbSA9PSAxKTsKKworCURQUklOVEsoInVubWFwcGluZyAldSBzZyBlbGVtZW50c1xuIiwgcWMtPm5fZWxlbSk7CisKKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19TRykKKwkJZG1hX3VubWFwX3NnKGFwLT5ob3N0X3NldC0+ZGV2LCBzZywgcWMtPm5fZWxlbSwgZGlyKTsKKwllbHNlCisJCWRtYV91bm1hcF9zaW5nbGUoYXAtPmhvc3Rfc2V0LT5kZXYsIHNnX2RtYV9hZGRyZXNzKCZzZ1swXSksCisJCQkJIHNnX2RtYV9sZW4oJnNnWzBdKSwgZGlyKTsKKworCXFjLT5mbGFncyAmPSB+QVRBX1FDRkxBR19ETUFNQVA7CisJcWMtPnNnID0gTlVMTDsKK30KKworLyoqCisgKglhdGFfZmlsbF9zZyAtIEZpbGwgUENJIElERSBQUkQgdGFibGUKKyAqCUBxYzogTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRhc2tmaWxlIHRvIGJlIHRyYW5zZmVycmVkCisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGF0YV9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXVuc2lnbmVkIGludCBpZHgsIG5lbGVtOworCisJYXNzZXJ0KHNnICE9IE5VTEwpOworCWFzc2VydChxYy0+bl9lbGVtID4gMCk7CisKKwlpZHggPSAwOworCWZvciAobmVsZW0gPSBxYy0+bl9lbGVtOyBuZWxlbTsgbmVsZW0tLSxzZysrKSB7CisJCXUzMiBhZGRyLCBvZmZzZXQ7CisJCXUzMiBzZ19sZW4sIGxlbjsKKworCQkvKiBkZXRlcm1pbmUgaWYgcGh5c2ljYWwgRE1BIGFkZHIgc3BhbnMgNjRLIGJvdW5kYXJ5LgorCQkgKiBOb3RlIGgvdyBkb2Vzbid0IHN1cHBvcnQgNjQtYml0LCBzbyB3ZSB1bmNvbmRpdGlvbmFsbHkKKwkJICogdHJ1bmNhdGUgZG1hX2FkZHJfdCB0byB1MzIuCisJCSAqLworCQlhZGRyID0gKHUzMikgc2dfZG1hX2FkZHJlc3Moc2cpOworCQlzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKworCQl3aGlsZSAoc2dfbGVuKSB7CisJCQlvZmZzZXQgPSBhZGRyICYgMHhmZmZmOworCQkJbGVuID0gc2dfbGVuOworCQkJaWYgKChvZmZzZXQgKyBzZ19sZW4pID4gMHgxMDAwMCkKKwkJCQlsZW4gPSAweDEwMDAwIC0gb2Zmc2V0OworCisJCQlhcC0+cHJkW2lkeF0uYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCQkJYXAtPnByZFtpZHhdLmZsYWdzX2xlbiA9IGNwdV90b19sZTMyKGxlbiAmIDB4ZmZmZik7CisJCQlWUFJJTlRLKCJQUkRbJXVdID0gKDB4JVgsIDB4JVgpXG4iLCBpZHgsIGFkZHIsIGxlbik7CisKKwkJCWlkeCsrOworCQkJc2dfbGVuIC09IGxlbjsKKwkJCWFkZHIgKz0gbGVuOworCQl9CisJfQorCisJaWYgKGlkeCkKKwkJYXAtPnByZFtpZHggLSAxXS5mbGFnc19sZW4gfD0gY3B1X3RvX2xlMzIoQVRBX1BSRF9FT1QpOworfQorLyoqCisgKglhdGFfY2hlY2tfYXRhcGlfZG1hIC0gQ2hlY2sgd2hldGhlciBBVEFQSSBETUEgY2FuIGJlIHN1cHBvcnRlZAorICoJQHFjOiBNZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGFza2ZpbGUgdG8gY2hlY2sKKyAqCisgKglMT0NLSU5HOgorICoJUkVUVVJOUzogMCB3aGVuIEFUQVBJIERNQSBjYW4gYmUgdXNlZAorICogICAgICAgICAgICAgICBub256ZXJvIG90aGVyd2lzZQorICovCitpbnQgYXRhX2NoZWNrX2F0YXBpX2RtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJaW50IHJjID0gMDsgLyogQXNzdW1lIEFUQVBJIERNQSBpcyBPSyBieSBkZWZhdWx0ICovCisKKwlpZiAoYXAtPm9wcy0+Y2hlY2tfYXRhcGlfZG1hKQorCQlyYyA9IGFwLT5vcHMtPmNoZWNrX2F0YXBpX2RtYShxYyk7CisKKwlyZXR1cm4gcmM7Cit9CisvKioKKyAqCWF0YV9xY19wcmVwIC0gUHJlcGFyZSB0YXNrZmlsZSBmb3Igc3VibWlzc2lvbgorICoJQHFjOiBNZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGFza2ZpbGUgdG8gYmUgcHJlcGFyZWQKKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLwordm9pZCBhdGFfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKSkKKwkJcmV0dXJuOworCisJYXRhX2ZpbGxfc2cocWMpOworfQorCit2b2lkIGF0YV9zZ19pbml0X29uZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX1NJTkdMRTsKKworCW1lbXNldCgmcWMtPnNnZW50LCAwLCBzaXplb2YocWMtPnNnZW50KSk7CisJcWMtPnNnID0gJnFjLT5zZ2VudDsKKwlxYy0+bl9lbGVtID0gMTsKKwlxYy0+YnVmX3ZpcnQgPSBidWY7CisKKwlzZyA9IHFjLT5zZzsKKwlzZy0+cGFnZSA9IHZpcnRfdG9fcGFnZShidWYpOworCXNnLT5vZmZzZXQgPSAodW5zaWduZWQgbG9uZykgYnVmICYgflBBR0VfTUFTSzsKKwlzZ19kbWFfbGVuKHNnKSA9IGJ1ZmxlbjsKK30KKwordm9pZCBhdGFfc2dfaW5pdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkgdW5zaWduZWQgaW50IG5fZWxlbSkKK3sKKwlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19TRzsKKwlxYy0+c2cgPSBzZzsKKwlxYy0+bl9lbGVtID0gbl9lbGVtOworfQorCisvKioKKyAqCWF0YV9zZ19zZXR1cF9vbmUgLQorICoJQHFjOgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK3N0YXRpYyBpbnQgYXRhX3NnX3NldHVwX29uZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJaW50IGRpciA9IHFjLT5kbWFfZGlyOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJZG1hX2FkZHJfdCBkbWFfYWRkcmVzczsKKworCWRtYV9hZGRyZXNzID0gZG1hX21hcF9zaW5nbGUoYXAtPmhvc3Rfc2V0LT5kZXYsIHFjLT5idWZfdmlydCwKKwkJCQkgICAgIHNnX2RtYV9sZW4oc2cpLCBkaXIpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcmVzcykpCisJCXJldHVybiAtMTsKKworCXNnX2RtYV9hZGRyZXNzKHNnKSA9IGRtYV9hZGRyZXNzOworCisJRFBSSU5USygibWFwcGVkIGJ1ZmZlciBvZiAlZCBieXRlcyBmb3IgJXNcbiIsIHNnX2RtYV9sZW4oc2cpLAorCQlxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUgPyAid3JpdGUiIDogInJlYWQiKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zZ19zZXR1cCAtCisgKglAcWM6CisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworc3RhdGljIGludCBhdGFfc2dfc2V0dXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJaW50IG5fZWxlbSwgZGlyOworCisJVlBSSU5USygiRU5URVIsIGF0YSV1XG4iLCBhcC0+aWQpOworCWFzc2VydChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NHKTsKKworCWRpciA9IHFjLT5kbWFfZGlyOworCW5fZWxlbSA9IGRtYV9tYXBfc2coYXAtPmhvc3Rfc2V0LT5kZXYsIHNnLCBxYy0+bl9lbGVtLCBkaXIpOworCWlmIChuX2VsZW0gPCAxKQorCQlyZXR1cm4gLTE7CisKKwlEUFJJTlRLKCIlZCBzZyBlbGVtZW50cyBtYXBwZWRcbiIsIG5fZWxlbSk7CisKKwlxYy0+bl9lbGVtID0gbl9lbGVtOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Bpb19wb2xsIC0KKyAqCUBhcDoKKyAqCisgKglMT0NLSU5HOgorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF0YV9waW9fcG9sbChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcG9sbF9zdGF0ZSA9IFBJT19TVF9VTktOT1dOOworCXVuc2lnbmVkIGludCByZWdfc3RhdGUgPSBQSU9fU1RfVU5LTk9XTjsKKwljb25zdCB1bnNpZ25lZCBpbnQgdG1vdXRfc3RhdGUgPSBQSU9fU1RfVE1PVVQ7CisKKwlzd2l0Y2ggKGFwLT5waW9fdGFza19zdGF0ZSkgeworCWNhc2UgUElPX1NUOgorCWNhc2UgUElPX1NUX1BPTEw6CisJCXBvbGxfc3RhdGUgPSBQSU9fU1RfUE9MTDsKKwkJcmVnX3N0YXRlID0gUElPX1NUOworCQlicmVhazsKKwljYXNlIFBJT19TVF9MQVNUOgorCWNhc2UgUElPX1NUX0xBU1RfUE9MTDoKKwkJcG9sbF9zdGF0ZSA9IFBJT19TVF9MQVNUX1BPTEw7CisJCXJlZ19zdGF0ZSA9IFBJT19TVF9MQVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisJc3RhdHVzID0gYXRhX2Noa19zdGF0dXMoYXApOworCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBhcC0+cGlvX3Rhc2tfdGltZW91dCkpIHsKKwkJCWFwLT5waW9fdGFza19zdGF0ZSA9IHRtb3V0X3N0YXRlOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYXAtPnBpb190YXNrX3N0YXRlID0gcG9sbF9zdGF0ZTsKKwkJcmV0dXJuIEFUQV9TSE9SVF9QQVVTRTsKKwl9CisKKwlhcC0+cGlvX3Rhc2tfc3RhdGUgPSByZWdfc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Bpb19jb21wbGV0ZSAtCisgKglAYXA6CisgKgorICoJTE9DS0lORzoKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfcGlvX2NvbXBsZXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTggZHJ2X3N0YXQ7CisKKwkvKgorCSAqIFRoaXMgaXMgcHVyZWx5IGh1ZXJpc3RpYy4gIFRoaXMgaXMgYSBmYXN0IHBhdGguCisJICogU29tZXRpbWVzIHdoZW4gd2UgZW50ZXIsIEJTWSB3aWxsIGJlIGNsZWFyZWQgaW4KKwkgKiBhIGNoay1zdGF0dXMgb3IgdHdvLiAgSWYgbm90LCB0aGUgZHJpdmUgaXMgcHJvYmFibHkgc2Vla2luZworCSAqIG9yIHNvbWV0aGluZy4gIFNub296ZSBmb3IgYSBjb3VwbGUgbXNlY3MsIHRoZW4KKwkgKiBjaGstc3RhdHVzIGFnYWluLiAgSWYgc3RpbGwgYnVzeSwgZmFsbCBiYWNrIHRvCisJICogUElPX1NUX1BPTEwgc3RhdGUuCisJICovCisJZHJ2X3N0YXQgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSB8IEFUQV9EUlEsIDEwKTsKKwlpZiAoZHJ2X3N0YXQgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgeworCQltc2xlZXAoMik7CisJCWRydl9zdGF0ID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1kgfCBBVEFfRFJRLCAxMCk7CisJCWlmIChkcnZfc3RhdCAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSB7CisJCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfTEFTVF9QT0xMOworCQkJYXAtPnBpb190YXNrX3RpbWVvdXQgPSBqaWZmaWVzICsgQVRBX1RNT1VUX1BJTzsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWRydl9zdGF0ID0gYXRhX3dhaXRfaWRsZShhcCk7CisJaWYgKCFhdGFfb2soZHJ2X3N0YXQpKSB7CisJCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9FUlI7CisJCXJldHVybjsKKwl9CisKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWFzc2VydChxYyAhPSBOVUxMKTsKKworCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9JRExFOworCisJYXRhX2lycV9vbihhcCk7CisKKwlhdGFfcWNfY29tcGxldGUocWMsIGRydl9zdGF0KTsKK30KKwordm9pZCBzd2FwX2J1Zl9sZTE2KHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX3dvcmRzKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zl93b3JkczsgaSsrKQorCQlidWZbaV0gPSBsZTE2X3RvX2NwdShidWZbaV0pOworI2VuZGlmIC8qIF9fQklHX0VORElBTiAqLworfQorCitzdGF0aWMgdm9pZCBhdGFfbW1pb19kYXRhX3hmZXIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4sIGludCB3cml0ZV9kYXRhKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCB3b3JkcyA9IGJ1ZmxlbiA+PiAxOworCXUxNiAqYnVmMTYgPSAodTE2ICopIGJ1ZjsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopYXAtPmlvYWRkci5kYXRhX2FkZHI7CisKKwlpZiAod3JpdGVfZGF0YSkgeworCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykKKwkJCXdyaXRldyhsZTE2X3RvX2NwdShidWYxNltpXSksIG1taW8pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKQorCQkJYnVmMTZbaV0gPSBjcHVfdG9fbGUxNihyZWFkdyhtbWlvKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGFfcGlvX2RhdGFfeGZlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgd3JpdGVfZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgZHdvcmRzID0gYnVmbGVuID4+IDE7CisKKwlpZiAod3JpdGVfZGF0YSkKKwkJb3V0c3coYXAtPmlvYWRkci5kYXRhX2FkZHIsIGJ1ZiwgZHdvcmRzKTsKKwllbHNlCisJCWluc3coYXAtPmlvYWRkci5kYXRhX2FkZHIsIGJ1ZiwgZHdvcmRzKTsKK30KKworc3RhdGljIHZvaWQgYXRhX2RhdGFfeGZlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgIHVuc2lnbmVkIGludCBidWZsZW4sIGludCBkb193cml0ZSkKK3sKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJYXRhX21taW9fZGF0YV94ZmVyKGFwLCBidWYsIGJ1ZmxlbiwgZG9fd3JpdGUpOworCWVsc2UKKwkJYXRhX3Bpb19kYXRhX3hmZXIoYXAsIGJ1ZiwgYnVmbGVuLCBkb193cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9waW9fc2VjdG9yKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJaW50IGRvX3dyaXRlID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJaWYgKHFjLT5jdXJzZWN0ID09IChxYy0+bnNlY3QgLSAxKSkKKwkJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUX0xBU1Q7CisKKwlwYWdlID0gc2dbcWMtPmN1cnNnXS5wYWdlOworCW9mZnNldCA9IHNnW3FjLT5jdXJzZ10ub2Zmc2V0ICsgcWMtPmN1cnNnX29mcyAqIEFUQV9TRUNUX1NJWkU7CisKKwkvKiBnZXQgdGhlIGN1cnJlbnQgcGFnZSBhbmQgb2Zmc2V0ICovCisJcGFnZSA9IG50aF9wYWdlKHBhZ2UsIChvZmZzZXQgPj4gUEFHRV9TSElGVCkpOworCW9mZnNldCAlPSBQQUdFX1NJWkU7CisKKwlidWYgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OworCisJcWMtPmN1cnNlY3QrKzsKKwlxYy0+Y3Vyc2dfb2ZzKys7CisKKwlpZiAoKHFjLT5jdXJzZ19vZnMgKiBBVEFfU0VDVF9TSVpFKSA9PSBzZ19kbWFfbGVuKCZzZ1txYy0+Y3Vyc2ddKSkgeworCQlxYy0+Y3Vyc2crKzsKKwkJcWMtPmN1cnNnX29mcyA9IDA7CisJfQorCisJRFBSSU5USygiZGF0YSAlc1xuIiwgcWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFID8gIndyaXRlIiA6ICJyZWFkIik7CisKKwkvKiBkbyB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgKi8KKwlkb193cml0ZSA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpOworCWF0YV9kYXRhX3hmZXIoYXAsIGJ1ZiwgQVRBX1NFQ1RfU0laRSwgZG9fd3JpdGUpOworCisJa3VubWFwKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBfX2F0YXBpX3Bpb19ieXRlcyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisJaW50IGRvX3dyaXRlID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBjb3VudDsKKworCWlmIChxYy0+Y3VyYnl0ZXMgPT0gcWMtPm5ieXRlcyAtIGJ5dGVzKQorCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfTEFTVDsKKworbmV4dF9zZzoKKwlzZyA9ICZxYy0+c2dbcWMtPmN1cnNnXTsKKworbmV4dF9wYWdlOgorCXBhZ2UgPSBzZy0+cGFnZTsKKwlvZmZzZXQgPSBzZy0+b2Zmc2V0ICsgcWMtPmN1cnNnX29mczsKKworCS8qIGdldCB0aGUgY3VycmVudCBwYWdlIGFuZCBvZmZzZXQgKi8KKwlwYWdlID0gbnRoX3BhZ2UocGFnZSwgKG9mZnNldCA+PiBQQUdFX1NISUZUKSk7CisJb2Zmc2V0ICU9IFBBR0VfU0laRTsKKworCWNvdW50ID0gbWluKHNnX2RtYV9sZW4oc2cpIC0gcWMtPmN1cnNnX29mcywgYnl0ZXMpOworCisJLyogZG9uJ3QgY3Jvc3MgcGFnZSBib3VuZGFyaWVzICovCisJY291bnQgPSBtaW4oY291bnQsICh1bnNpZ25lZCBpbnQpUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKworCWJ1ZiA9IGttYXAocGFnZSkgKyBvZmZzZXQ7CisKKwlieXRlcyAtPSBjb3VudDsKKwlxYy0+Y3VyYnl0ZXMgKz0gY291bnQ7CisJcWMtPmN1cnNnX29mcyArPSBjb3VudDsKKworCWlmIChxYy0+Y3Vyc2dfb2ZzID09IHNnX2RtYV9sZW4oc2cpKSB7CisJCXFjLT5jdXJzZysrOworCQlxYy0+Y3Vyc2dfb2ZzID0gMDsKKwl9CisKKwlEUFJJTlRLKCJkYXRhICVzXG4iLCBxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUgPyAid3JpdGUiIDogInJlYWQiKTsKKworCS8qIGRvIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciAqLworCWF0YV9kYXRhX3hmZXIoYXAsIGJ1ZiwgY291bnQsIGRvX3dyaXRlKTsKKworCWt1bm1hcChwYWdlKTsKKworCWlmIChieXRlcykgeworCQlpZiAocWMtPmN1cnNnX29mcyA8IHNnX2RtYV9sZW4oc2cpKQorCQkJZ290byBuZXh0X3BhZ2U7CisJCWdvdG8gbmV4dF9zZzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0YXBpX3Bpb19ieXRlcyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IHFjLT5kZXY7CisJdW5zaWduZWQgaW50IGlyZWFzb24sIGJjX2xvLCBiY19oaSwgYnl0ZXM7CisJaW50IGlfd3JpdGUsIGRvX3dyaXRlID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkgPyAxIDogMDsKKworCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZxYy0+dGYpOworCWlyZWFzb24gPSBxYy0+dGYubnNlY3Q7CisJYmNfbG8gPSBxYy0+dGYubGJhbTsKKwliY19oaSA9IHFjLT50Zi5sYmFoOworCWJ5dGVzID0gKGJjX2hpIDw8IDgpIHwgYmNfbG87CisKKwkvKiBzaGFsbCBiZSBjbGVhcmVkIHRvIHplcm8sIGluZGljYXRpbmcgeGZlciBvZiBkYXRhICovCisJaWYgKGlyZWFzb24gJiAoMSA8PCAwKSkKKwkJZ290byBlcnJfb3V0OworCisJLyogbWFrZSBzdXJlIHRyYW5zZmVyIGRpcmVjdGlvbiBtYXRjaGVzIGV4cGVjdGVkICovCisJaV93cml0ZSA9ICgoaXJlYXNvbiAmICgxIDw8IDEpKSA9PSAwKSA/IDEgOiAwOworCWlmIChkb193cml0ZSAhPSBpX3dyaXRlKQorCQlnb3RvIGVycl9vdXQ7CisKKwlfX2F0YXBpX3Bpb19ieXRlcyhxYywgYnl0ZXMpOworCisJcmV0dXJuOworCitlcnJfb3V0OgorCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXU6IEFUQVBJIGNoZWNrIGZhaWxlZFxuIiwKKwkgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8pOworCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9FUlI7Cit9CisKKy8qKgorICoJYXRhX3Bpb19zZWN0b3IgLQorICoJQGFwOgorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHZvaWQgYXRhX3Bpb19ibG9jayhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTggc3RhdHVzOworCisJLyoKKwkgKiBUaGlzIGlzIHB1cmVseSBodWVyaXN0aWMuICBUaGlzIGlzIGEgZmFzdCBwYXRoLgorCSAqIFNvbWV0aW1lcyB3aGVuIHdlIGVudGVyLCBCU1kgd2lsbCBiZSBjbGVhcmVkIGluCisJICogYSBjaGstc3RhdHVzIG9yIHR3by4gIElmIG5vdCwgdGhlIGRyaXZlIGlzIHByb2JhYmx5IHNlZWtpbmcKKwkgKiBvciBzb21ldGhpbmcuICBTbm9vemUgZm9yIGEgY291cGxlIG1zZWNzLCB0aGVuCisJICogY2hrLXN0YXR1cyBhZ2Fpbi4gIElmIHN0aWxsIGJ1c3ksIGZhbGwgYmFjayB0bworCSAqIFBJT19TVF9QT0xMIHN0YXRlLgorCSAqLworCXN0YXR1cyA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZLCA1KTsKKwlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKKwkJbXNsZWVwKDIpOworCQlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMTApOworCQlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKKwkJCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVF9QT0xMOworCQkJYXAtPnBpb190YXNrX3RpbWVvdXQgPSBqaWZmaWVzICsgQVRBX1RNT1VUX1BJTzsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJYXNzZXJ0KHFjICE9IE5VTEwpOworCisJaWYgKGlzX2F0YXBpX3Rhc2tmaWxlKCZxYy0+dGYpKSB7CisJCS8qIG5vIG1vcmUgZGF0YSB0byB0cmFuc2ZlciBvciB1bnN1cHBvcnRlZCBBVEFQSSBjb21tYW5kICovCisJCWlmICgoc3RhdHVzICYgQVRBX0RSUSkgPT0gMCkgeworCQkJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUX0lETEU7CisKKwkJCWF0YV9pcnFfb24oYXApOworCisJCQlhdGFfcWNfY29tcGxldGUocWMsIHN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKworCQlhdGFwaV9waW9fYnl0ZXMocWMpOworCX0gZWxzZSB7CisJCS8qIGhhbmRsZSBCU1k9MCwgRFJRPTAgYXMgZXJyb3IgKi8KKwkJaWYgKChzdGF0dXMgJiBBVEFfRFJRKSA9PSAwKSB7CisJCQlhcC0+cGlvX3Rhc2tfc3RhdGUgPSBQSU9fU1RfRVJSOworCQkJcmV0dXJuOworCQl9CisKKwkJYXRhX3Bpb19zZWN0b3IocWMpOworCX0KK30KKworc3RhdGljIHZvaWQgYXRhX3Bpb19lcnJvcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTggZHJ2X3N0YXQ7CisKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWFzc2VydChxYyAhPSBOVUxMKTsKKworCWRydl9zdGF0ID0gYXRhX2Noa19zdGF0dXMoYXApOworCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBQSU8gZXJyb3IsIGRydl9zdGF0IDB4JXhcbiIsCisJICAgICAgIGFwLT5pZCwgZHJ2X3N0YXQpOworCisJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUX0lETEU7CisKKwlhdGFfaXJxX29uKGFwKTsKKworCWF0YV9xY19jb21wbGV0ZShxYywgZHJ2X3N0YXQgfCBBVEFfRVJSKTsKK30KKworc3RhdGljIHZvaWQgYXRhX3Bpb190YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAwOworCisJc3dpdGNoIChhcC0+cGlvX3Rhc2tfc3RhdGUpIHsKKwljYXNlIFBJT19TVF9JRExFOgorCQlyZXR1cm47CisKKwljYXNlIFBJT19TVDoKKwkJYXRhX3Bpb19ibG9jayhhcCk7CisJCWJyZWFrOworCisJY2FzZSBQSU9fU1RfTEFTVDoKKwkJYXRhX3Bpb19jb21wbGV0ZShhcCk7CisJCWJyZWFrOworCisJY2FzZSBQSU9fU1RfUE9MTDoKKwljYXNlIFBJT19TVF9MQVNUX1BPTEw6CisJCXRpbWVvdXQgPSBhdGFfcGlvX3BvbGwoYXApOworCQlicmVhazsKKworCWNhc2UgUElPX1NUX1RNT1VUOgorCWNhc2UgUElPX1NUX0VSUjoKKwkJYXRhX3Bpb19lcnJvcihhcCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodGltZW91dCkKKwkJcXVldWVfZGVsYXllZF93b3JrKGF0YV93cSwgJmFwLT5waW9fdGFzaywKKwkJCQkgICB0aW1lb3V0KTsKKwllbHNlCisJCXF1ZXVlX3dvcmsoYXRhX3dxLCAmYXAtPnBpb190YXNrKTsKK30KKworc3RhdGljIHZvaWQgYXRhcGlfcmVxdWVzdF9zZW5zZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCURQUklOVEsoIkFUQVBJIHJlcXVlc3Qgc2Vuc2VcbiIpOworCisJcWMgPSBhdGFfcWNfbmV3X2luaXQoYXAsIGRldik7CisJQlVHX09OKHFjID09IE5VTEwpOworCisJLyogRklYTUU6IGlzIHRoaXMgbmVlZGVkPyAqLworCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwlhdGFfc2dfaW5pdF9vbmUocWMsIGNtZC0+c2Vuc2VfYnVmZmVyLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKwlxYy0+ZG1hX2RpciA9IERNQV9GUk9NX0RFVklDRTsKKworCW1lbXNldCgmcWMtPmNkYiwgMCwgc2l6ZW9mKGFwLT5jZGJfbGVuKSk7CisJcWMtPmNkYlswXSA9IFJFUVVFU1RfU0VOU0U7CisJcWMtPmNkYls0XSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKworCXFjLT50Zi5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwlxYy0+dGYuY29tbWFuZCA9IEFUQV9DTURfUEFDS0VUOworCisJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfQVRBUEk7CisJcWMtPnRmLmxiYW0gPSAoOCAqIDEwMjQpICYgMHhmZjsKKwlxYy0+dGYubGJhaCA9ICg4ICogMTAyNCkgPj4gODsKKwlxYy0+bmJ5dGVzID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCisJcWMtPndhaXRpbmcgPSAmd2FpdDsKKwlxYy0+Y29tcGxldGVfZm4gPSBhdGFfcWNfY29tcGxldGVfbm9vcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IGF0YV9xY19pc3N1ZShxYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmMpCisJCWF0YV9wb3J0X2Rpc2FibGUoYXApOworCWVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfcWNfdGltZW91dCAtIEhhbmRsZSB0aW1lb3V0IG9mIHF1ZXVlZCBjb21tYW5kCisgKglAcWM6IENvbW1hbmQgdGhhdCB0aW1lZCBvdXQKKyAqCisgKglTb21lIHBhcnQgb2YgdGhlIGtlcm5lbCAoY3VycmVudGx5LCBvbmx5IHRoZSBTQ1NJIGxheWVyKQorICoJaGFzIG5vdGljZWQgdGhhdCB0aGUgYWN0aXZlIGNvbW1hbmQgb24gcG9ydCBAYXAgaGFzIG5vdAorICoJY29tcGxldGVkIGFmdGVyIGEgc3BlY2lmaWVkIGxlbmd0aCBvZiB0aW1lLiAgSGFuZGxlIHRoaXMKKyAqCWNvbmRpdGlvbiBieSBkaXNhYmxpbmcgRE1BIChpZiBuZWNlc3NhcnkpIGFuZCBjb21wbGV0aW5nCisgKgl0cmFuc2FjdGlvbnMsIHdpdGggZXJyb3IgaWYgbmVjZXNzYXJ5LgorICoKKyAqCVRoaXMgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIG9mIHRoZSAibG9zdCBpbnRlcnJ1cHQiLCB3aGVyZQorICoJZm9yIHNvbWUgcmVhc29uIChwb3NzaWJseSBoYXJkd2FyZSBidWcsIHBvc3NpYmx5IGRyaXZlciBidWcpCisgKglhbiBpbnRlcnJ1cHQgd2FzIG5vdCBkZWxpdmVyZWQgdG8gdGhlIGRyaXZlciwgZXZlbiB0aG91Z2ggdGhlCisgKgl0cmFuc2FjdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHZvaWQgYXRhX3FjX3RpbWVvdXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OworCXU4IGhvc3Rfc3RhdCA9IDAsIGRydl9zdGF0OworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJLyogRklYTUU6IGRvZXNuJ3QgdGhpcyBjb25mbGljdCB3aXRoIHRpbWVvdXQgaGFuZGxpbmc/ICovCisJaWYgKHFjLT5kZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBUEkgJiYgcWMtPnNjc2ljbWQpIHsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CisKKwkJaWYgKCFzY3NpX2VoX2VmbGFnc19jaGsoY21kLCBTQ1NJX0VIX0NBTkNFTF9DTUQpKSB7CisKKwkJCS8qIGZpbmlzaCBjb21wbGV0aW5nIG9yaWdpbmFsIGNvbW1hbmQgKi8KKwkJCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKworCQkJYXRhcGlfcmVxdWVzdF9zZW5zZShhcCwgZGV2LCBjbWQpOworCisJCQljbWQtPnJlc3VsdCA9IChDSEVDS19DT05ESVRJT04gPDwgMSkgfCAoRElEX09LIDw8IDE2KTsKKwkJCXNjc2lfZmluaXNoX2NvbW1hbmQoY21kKTsKKworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBoYWNrIGFsZXJ0ISAgV2UgY2Fubm90IHVzZSB0aGUgc3VwcGxpZWQgY29tcGxldGlvbgorCSAqIGZ1bmN0aW9uIGZyb20gaW5zaWRlIHRoZSAtPmVoX3N0cmF0ZWd5X2hhbmRsZXIoKSB0aHJlYWQuCisJICogbGliYXRhIGlzIHRoZSBvbmx5IHVzZXIgb2YgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgaW4KKwkgKiBhbnkga2VybmVsLCBzbyB0aGUgZGVmYXVsdCBzY3NpX2RvbmUoKSBhc3N1bWVzIGl0IGlzCisJICogbm90IGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBTQ1NJIEVILgorCSAqLworCXFjLT5zY3NpZG9uZSA9IHNjc2lfZmluaXNoX2NvbW1hbmQ7CisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCWhvc3Rfc3RhdCA9IGFwLT5vcHMtPmJtZG1hX3N0YXR1cyhhcCk7CisKKwkJLyogYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UsIGNsZWFyIERNQS1TdGFydCBiaXQgKi8KKwkJYXAtPm9wcy0+Ym1kbWFfc3RvcChhcCk7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwlkZWZhdWx0OgorCQlhdGFfYWx0c3RhdHVzKGFwKTsKKwkJZHJ2X3N0YXQgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CisKKwkJLyogYWNrIGJtZG1hIGlycSBldmVudHMgKi8KKwkJYXAtPm9wcy0+aXJxX2NsZWFyKGFwKTsKKworCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBjb21tYW5kIDB4JXggdGltZW91dCwgc3RhdCAweCV4IGhvc3Rfc3RhdCAweCV4XG4iLAorCQkgICAgICAgYXAtPmlkLCBxYy0+dGYuY29tbWFuZCwgZHJ2X3N0YXQsIGhvc3Rfc3RhdCk7CisKKwkJLyogY29tcGxldGUgdGFza2ZpbGUgdHJhbnNhY3Rpb24gKi8KKwkJYXRhX3FjX2NvbXBsZXRlKHFjLCBkcnZfc3RhdCk7CisJCWJyZWFrOworCX0KK291dDoKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfZW5nX3RpbWVvdXQgLSBIYW5kbGUgdGltZW91dCBvZiBxdWV1ZWQgY29tbWFuZAorICoJQGFwOiBQb3J0IG9uIHdoaWNoIHRpbWVkLW91dCBjb21tYW5kIGlzIGFjdGl2ZQorICoKKyAqCVNvbWUgcGFydCBvZiB0aGUga2VybmVsIChjdXJyZW50bHksIG9ubHkgdGhlIFNDU0kgbGF5ZXIpCisgKgloYXMgbm90aWNlZCB0aGF0IHRoZSBhY3RpdmUgY29tbWFuZCBvbiBwb3J0IEBhcCBoYXMgbm90CisgKgljb21wbGV0ZWQgYWZ0ZXIgYSBzcGVjaWZpZWQgbGVuZ3RoIG9mIHRpbWUuICBIYW5kbGUgdGhpcworICoJY29uZGl0aW9uIGJ5IGRpc2FibGluZyBETUEgKGlmIG5lY2Vzc2FyeSkgYW5kIGNvbXBsZXRpbmcKKyAqCXRyYW5zYWN0aW9ucywgd2l0aCBlcnJvciBpZiBuZWNlc3NhcnkuCisgKgorICoJVGhpcyBhbHNvIGhhbmRsZXMgdGhlIGNhc2Ugb2YgdGhlICJsb3N0IGludGVycnVwdCIsIHdoZXJlCisgKglmb3Igc29tZSByZWFzb24gKHBvc3NpYmx5IGhhcmR3YXJlIGJ1ZywgcG9zc2libHkgZHJpdmVyIGJ1ZykKKyAqCWFuIGludGVycnVwdCB3YXMgbm90IGRlbGl2ZXJlZCB0byB0aGUgZHJpdmVyLCBldmVuIHRob3VnaCB0aGUKKyAqCXRyYW5zYWN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIFNDU0kgbGF5ZXIgKG5vbmUsIGNhbiBzbGVlcCkKKyAqLworCit2b2lkIGF0YV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWlmICghcWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogQlVHOiB0aW1lb3V0IHdpdGhvdXQgY29tbWFuZFxuIiwKKwkJICAgICAgIGFwLT5pZCk7CisJCWdvdG8gb3V0OworCX0KKworCWF0YV9xY190aW1lb3V0KHFjKTsKKworb3V0OgorCURQUklOVEsoIkVYSVRcbiIpOworfQorCisvKioKKyAqCWF0YV9xY19uZXcgLSBSZXF1ZXN0IGFuIGF2YWlsYWJsZSBBVEEgY29tbWFuZCwgZm9yIHF1ZXVlaW5nCisgKglAYXA6IFBvcnQgYXNzb2NpYXRlZCB3aXRoIGRldmljZSBAZGV2CisgKglAZGV2OiBEZXZpY2UgZnJvbSB3aG9tIHdlIHJlcXVlc3QgYW4gYXZhaWxhYmxlIGNvbW1hbmQgc3RydWN0dXJlCisgKgorICoJTE9DS0lORzoKKyAqLworCitzdGF0aWMgc3RydWN0IGF0YV9xdWV1ZWRfY21kICphdGFfcWNfbmV3KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IE5VTEw7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9RVUVVRTsgaSsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmFwLT5xYWN0aXZlKSkgeworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGkpOworCQkJYnJlYWs7CisJCX0KKworCWlmIChxYykKKwkJcWMtPnRhZyA9IGk7CisKKwlyZXR1cm4gcWM7Cit9CisKKy8qKgorICoJYXRhX3FjX25ld19pbml0IC0gUmVxdWVzdCBhbiBhdmFpbGFibGUgQVRBIGNvbW1hbmQsIGFuZCBpbml0aWFsaXplIGl0CisgKglAYXA6IFBvcnQgYXNzb2NpYXRlZCB3aXRoIGRldmljZSBAZGV2CisgKglAZGV2OiBEZXZpY2UgZnJvbSB3aG9tIHdlIHJlcXVlc3QgYW4gYXZhaWxhYmxlIGNvbW1hbmQgc3RydWN0dXJlCisgKgorICoJTE9DS0lORzoKKyAqLworCitzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICAgIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCXFjID0gYXRhX3FjX25ldyhhcCk7CisJaWYgKHFjKSB7CisJCXFjLT5zZyA9IE5VTEw7CisJCXFjLT5mbGFncyA9IDA7CisJCXFjLT5zY3NpY21kID0gTlVMTDsKKwkJcWMtPmFwID0gYXA7CisJCXFjLT5kZXYgPSBkZXY7CisJCXFjLT5jdXJzZWN0ID0gcWMtPmN1cnNnID0gcWMtPmN1cnNnX29mcyA9IDA7CisJCXFjLT5uc2VjdCA9IDA7CisJCXFjLT5uYnl0ZXMgPSBxYy0+Y3VyYnl0ZXMgPSAwOworCisJCWF0YV90Zl9pbml0KGFwLCAmcWMtPnRmLCBkZXYtPmRldm5vKTsKKworCQlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkE0OCkKKwkJCXFjLT50Zi5mbGFncyB8PSBBVEFfVEZMQUdfTEJBNDg7CisJfQorCisJcmV0dXJuIHFjOworfQorCitzdGF0aWMgaW50IGF0YV9xY19jb21wbGV0ZV9ub29wKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHU4IGRydl9zdGF0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2F0YV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdW5zaWduZWQgaW50IHRhZywgZG9fY2xlYXIgPSAwOworCisJcWMtPmZsYWdzID0gMDsKKwl0YWcgPSBxYy0+dGFnOworCWlmIChsaWtlbHkoYXRhX3RhZ192YWxpZCh0YWcpKSkgeworCQlpZiAodGFnID09IGFwLT5hY3RpdmVfdGFnKQorCQkJYXAtPmFjdGl2ZV90YWcgPSBBVEFfVEFHX1BPSVNPTjsKKwkJcWMtPnRhZyA9IEFUQV9UQUdfUE9JU09OOworCQlkb19jbGVhciA9IDE7CisJfQorCisJaWYgKHFjLT53YWl0aW5nKSB7CisJCXN0cnVjdCBjb21wbGV0aW9uICp3YWl0aW5nID0gcWMtPndhaXRpbmc7CisJCXFjLT53YWl0aW5nID0gTlVMTDsKKwkJY29tcGxldGUod2FpdGluZyk7CisJfQorCisJaWYgKGxpa2VseShkb19jbGVhcikpCisJCWNsZWFyX2JpdCh0YWcsICZhcC0+cWFjdGl2ZSk7Cit9CisKKy8qKgorICoJYXRhX3FjX2ZyZWUgLSBmcmVlIHVudXNlZCBhdGFfcXVldWVkX2NtZAorICoJQHFjOiBDb21tYW5kIHRvIGNvbXBsZXRlCisgKgorICoJRGVzaWduZWQgdG8gZnJlZSB1bnVzZWQgYXRhX3F1ZXVlZF9jbWQgb2JqZWN0CisgKglpbiBjYXNlIHNvbWV0aGluZyBwcmV2ZW50cyB1c2luZyBpdC4KKyAqCisgKglMT0NLSU5HOgorICoKKyAqLwordm9pZCBhdGFfcWNfZnJlZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWFzc2VydChxYyAhPSBOVUxMKTsJLyogYXRhX3FjX2Zyb21fdGFnIF9taWdodF8gcmV0dXJuIE5VTEwgKi8KKwlhc3NlcnQocWMtPndhaXRpbmcgPT0gTlVMTCk7CS8qIG5vdGhpbmcgc2hvdWxkIGJlIHdhaXRpbmcgKi8KKworCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKK30KKworLyoqCisgKglhdGFfcWNfY29tcGxldGUgLSBDb21wbGV0ZSBhbiBhY3RpdmUgQVRBIGNvbW1hbmQKKyAqCUBxYzogQ29tbWFuZCB0byBjb21wbGV0ZQorICoJQGRydl9zdGF0OiBBVEEgc3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzCisgKgorICoJTE9DS0lORzoKKyAqCisgKi8KKwordm9pZCBhdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggZHJ2X3N0YXQpCit7CisJaW50IHJjOworCisJYXNzZXJ0KHFjICE9IE5VTEwpOwkvKiBhdGFfcWNfZnJvbV90YWcgX21pZ2h0XyByZXR1cm4gTlVMTCAqLworCWFzc2VydChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0FDVElWRSk7CisKKwlpZiAobGlrZWx5KHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKSkKKwkJYXRhX3NnX2NsZWFuKHFjKTsKKworCS8qIGNhbGwgY29tcGxldGlvbiBjYWxsYmFjayAqLworCXJjID0gcWMtPmNvbXBsZXRlX2ZuKHFjLCBkcnZfc3RhdCk7CisKKwkvKiBpZiBjYWxsYmFjayBpbmRpY2F0ZXMgbm90IHRvIGNvbXBsZXRlIGNvbW1hbmQgKG5vbi16ZXJvKSwKKwkgKiByZXR1cm4gaW1tZWRpYXRlbHkKKwkgKi8KKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuOworCisJX19hdGFfcWNfY29tcGxldGUocWMpOworCisJVlBSSU5USygiRVhJVFxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9zaG91bGRfZG1hX21hcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCWNhc2UgQVRBX1BST1RfRE1BOgorCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgorCQlyZXR1cm4gMTsKKworCWNhc2UgQVRBX1BST1RfQVRBUEk6CisJY2FzZSBBVEFfUFJPVF9QSU86CisJY2FzZSBBVEFfUFJPVF9QSU9fTVVMVDoKKwkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BJT19ETUEpCisJCQlyZXR1cm4gMTsKKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCS8qIG5ldmVyIHJlYWNoZWQgKi8KK30KKworLyoqCisgKglhdGFfcWNfaXNzdWUgLSBpc3N1ZSB0YXNrZmlsZSB0byBkZXZpY2UKKyAqCUBxYzogY29tbWFuZCB0byBpc3N1ZSB0byBkZXZpY2UKKyAqCisgKglQcmVwYXJlIGFuIEFUQSBjb21tYW5kIHRvIHN1Ym1pc3Npb24gdG8gZGV2aWNlLgorICoJVGhpcyBpbmNsdWRlcyBtYXBwaW5nIHRoZSBkYXRhIGludG8gYSBETUEtYWJsZQorICoJYXJlYSwgZmlsbGluZyBpbiB0aGUgUy9HIHRhYmxlLCBhbmQgZmluYWxseQorICoJd3JpdGluZyB0aGUgdGFza2ZpbGUgdG8gaGFyZHdhcmUsIHN0YXJ0aW5nIHRoZSBjb21tYW5kLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLgorICovCisKK2ludCBhdGFfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCisJaWYgKGF0YV9zaG91bGRfZG1hX21hcChxYykpIHsKKwkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfU0cpIHsKKwkJCWlmIChhdGFfc2dfc2V0dXAocWMpKQorCQkJCWdvdG8gZXJyX291dDsKKwkJfSBlbHNlIGlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NJTkdMRSkgeworCQkJaWYgKGF0YV9zZ19zZXR1cF9vbmUocWMpKQorCQkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0gZWxzZSB7CisJCXFjLT5mbGFncyAmPSB+QVRBX1FDRkxBR19ETUFNQVA7CisJfQorCisJYXAtPm9wcy0+cWNfcHJlcChxYyk7CisKKwlxYy0+YXAtPmFjdGl2ZV90YWcgPSBxYy0+dGFnOworCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0FDVElWRTsKKworCXJldHVybiBhcC0+b3BzLT5xY19pc3N1ZShxYyk7CisKK2Vycl9vdXQ6CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqCWF0YV9xY19pc3N1ZV9wcm90IC0gaXNzdWUgdGFza2ZpbGUgdG8gZGV2aWNlIGluIHByb3RvLWRlcGVuZGVudCBtYW5uZXIKKyAqCUBxYzogY29tbWFuZCB0byBpc3N1ZSB0byBkZXZpY2UKKyAqCisgKglVc2luZyB2YXJpb3VzIGxpYmF0YSBmdW5jdGlvbnMgYW5kIGhvb2tzLCB0aGlzIGZ1bmN0aW9uCisgKglzdGFydHMgYW4gQVRBIGNvbW1hbmQuICBBVEEgY29tbWFuZHMgYXJlIGdyb3VwZWQgaW50bworICoJY2xhc3NlcyBjYWxsZWQgInByb3RvY29scyIsIGFuZCBpc3N1aW5nIGVhY2ggdHlwZSBvZiBwcm90b2NvbAorICoJaXMgc2xpZ2h0bHkgZGlmZmVyZW50LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLgorICovCisKK2ludCBhdGFfcWNfaXNzdWVfcHJvdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisKKwlhdGFfZGV2X3NlbGVjdChhcCwgcWMtPmRldi0+ZGV2bm8sIDEsIDApOworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJYXRhX3RmX3RvX2hvc3Rfbm9sb2NrKGFwLCAmcWMtPnRmKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX0RNQToKKwkJYXAtPm9wcy0+dGZfbG9hZChhcCwgJnFjLT50Zik7CSAvKiBsb2FkIHRmIHJlZ2lzdGVycyAqLworCQlhcC0+b3BzLT5ibWRtYV9zZXR1cChxYyk7CSAgICAvKiBzZXQgdXAgYm1kbWEgKi8KKwkJYXAtPm9wcy0+Ym1kbWFfc3RhcnQocWMpOwkgICAgLyogaW5pdGlhdGUgYm1kbWEgKi8KKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX1BJTzogLyogbG9hZCB0ZiByZWdpc3RlcnMsIGluaXRpYXRlIHBvbGxpbmcgcGlvICovCisJCWF0YV9xY19zZXRfcG9sbGluZyhxYyk7CisJCWF0YV90Zl90b19ob3N0X25vbG9jayhhcCwgJnFjLT50Zik7CisJCWFwLT5waW9fdGFza19zdGF0ZSA9IFBJT19TVDsKKwkJcXVldWVfd29yayhhdGFfd3EsICZhcC0+cGlvX3Rhc2spOworCQlicmVhazsKKworCWNhc2UgQVRBX1BST1RfQVRBUEk6CisJCWF0YV9xY19zZXRfcG9sbGluZyhxYyk7CisJCWF0YV90Zl90b19ob3N0X25vbG9jayhhcCwgJnFjLT50Zik7CisJCXF1ZXVlX3dvcmsoYXRhX3dxLCAmYXAtPnBhY2tldF90YXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX0FUQVBJX05PREFUQToKKwkJYXRhX3RmX3RvX2hvc3Rfbm9sb2NrKGFwLCAmcWMtPnRmKTsKKwkJcXVldWVfd29yayhhdGFfd3EsICZhcC0+cGFja2V0X3Rhc2spOworCQlicmVhazsKKworCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgorCQlhcC0+b3BzLT50Zl9sb2FkKGFwLCAmcWMtPnRmKTsJIC8qIGxvYWQgdGYgcmVnaXN0ZXJzICovCisJCWFwLT5vcHMtPmJtZG1hX3NldHVwKHFjKTsJICAgIC8qIHNldCB1cCBibWRtYSAqLworCQlxdWV1ZV93b3JrKGF0YV93cSwgJmFwLT5wYWNrZXRfdGFzayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9ibWRtYV9zZXR1cCAtIFNldCB1cCBQQ0kgSURFIEJNRE1BIHRyYW5zYWN0aW9uCisgKglAcWM6IEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVRBIHRyYW5zYWN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGF0YV9ibWRtYV9zZXR1cF9tbWlvIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdW5zaWduZWQgaW50IHJ3ID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7CisJdTggZG1hY3RsOworCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCisJLyogbG9hZCBQUkQgdGFibGUgYWRkci4gKi8KKwltYigpOwkvKiBtYWtlIHN1cmUgUFJEIHRhYmxlIHdyaXRlcyBhcmUgdmlzaWJsZSB0byBjb250cm9sbGVyICovCisJd3JpdGVsKGFwLT5wcmRfZG1hLCBtbWlvICsgQVRBX0RNQV9UQUJMRV9PRlMpOworCisJLyogc3BlY2lmeSBkYXRhIGRpcmVjdGlvbiwgdHJpcGxlLWNoZWNrIHN0YXJ0IGJpdCBpcyBjbGVhciAqLworCWRtYWN0bCA9IHJlYWRiKG1taW8gKyBBVEFfRE1BX0NNRCk7CisJZG1hY3RsICY9IH4oQVRBX0RNQV9XUiB8IEFUQV9ETUFfU1RBUlQpOworCWlmICghcncpCisJCWRtYWN0bCB8PSBBVEFfRE1BX1dSOworCXdyaXRlYihkbWFjdGwsIG1taW8gKyBBVEFfRE1BX0NNRCk7CisKKwkvKiBpc3N1ZSByL3cgY29tbWFuZCAqLworCWFwLT5vcHMtPmV4ZWNfY29tbWFuZChhcCwgJnFjLT50Zik7Cit9CisKKy8qKgorICoJYXRhX2JtZG1hX3N0YXJ0IC0gU3RhcnQgYSBQQ0kgSURFIEJNRE1BIHRyYW5zYWN0aW9uCisgKglAcWM6IEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVRBIHRyYW5zYWN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGF0YV9ibWRtYV9zdGFydF9tbWlvIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdm9pZCBfX2lvbWVtICptbWlvID0gKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmJtZG1hX2FkZHI7CisJdTggZG1hY3RsOworCisJLyogc3RhcnQgaG9zdCBETUEgdHJhbnNhY3Rpb24gKi8KKwlkbWFjdGwgPSByZWFkYihtbWlvICsgQVRBX0RNQV9DTUQpOworCXdyaXRlYihkbWFjdGwgfCBBVEFfRE1BX1NUQVJULCBtbWlvICsgQVRBX0RNQV9DTUQpOworCisJLyogU3RyaWN0bHksIG9uZSBtYXkgd2lzaCB0byBpc3N1ZSBhIHJlYWRiKCkgaGVyZSwgdG8KKwkgKiBmbHVzaCB0aGUgbW1pbyB3cml0ZS4gIEhvd2V2ZXIsIGNvbnRyb2wgYWxzbyBwYXNzZXMKKwkgKiB0byB0aGUgaGFyZHdhcmUgYXQgdGhpcyBwb2ludCwgYW5kIGl0IHdpbGwgaW50ZXJydXB0CisJICogdXMgd2hlbiB3ZSBhcmUgdG8gcmVzdW1lIGNvbnRyb2wuICBTbywgaW4gZWZmZWN0LAorCSAqIHdlIGRvbid0IGNhcmUgd2hlbiB0aGUgbW1pbyB3cml0ZSBmbHVzaGVzLgorCSAqIEZ1cnRoZXIsIGEgcmVhZCBvZiB0aGUgRE1BIHN0YXR1cyByZWdpc3RlciBfaW1tZWRpYXRlbHlfCisJICogZm9sbG93aW5nIHRoZSB3cml0ZSBtYXkgbm90IGJlIHdoYXQgY2VydGFpbiBmbGFreSBoYXJkd2FyZQorCSAqIGlzIGV4cGVjdGVkLCBzbyBJIHRoaW5rIGl0IGlzIGJlc3QgdG8gbm90IGFkZCBhIHJlYWRiKCkKKwkgKiB3aXRob3V0IGZpcnN0IGFsbCB0aGUgTU1JTyBBVEEgY2FyZHMvbW9ib3MuCisJICogT3IgbWF5YmUgSSdtIGp1c3QgYmVpbmcgcGFyYW5vaWQuCisJICovCit9CisKKy8qKgorICoJYXRhX2JtZG1hX3NldHVwX3BpbyAtIFNldCB1cCBQQ0kgSURFIEJNRE1BIHRyYW5zYWN0aW9uIChQSU8pCisgKglAcWM6IEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVRBIHRyYW5zYWN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGF0YV9ibWRtYV9zZXR1cF9waW8gKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl1bnNpZ25lZCBpbnQgcncgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKTsKKwl1OCBkbWFjdGw7CisKKwkvKiBsb2FkIFBSRCB0YWJsZSBhZGRyLiAqLworCW91dGwoYXAtPnByZF9kbWEsIGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfVEFCTEVfT0ZTKTsKKworCS8qIHNwZWNpZnkgZGF0YSBkaXJlY3Rpb24sIHRyaXBsZS1jaGVjayBzdGFydCBiaXQgaXMgY2xlYXIgKi8KKwlkbWFjdGwgPSBpbmIoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9DTUQpOworCWRtYWN0bCAmPSB+KEFUQV9ETUFfV1IgfCBBVEFfRE1BX1NUQVJUKTsKKwlpZiAoIXJ3KQorCQlkbWFjdGwgfD0gQVRBX0RNQV9XUjsKKwlvdXRiKGRtYWN0bCwgYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9DTUQpOworCisJLyogaXNzdWUgci93IGNvbW1hbmQgKi8KKwlhcC0+b3BzLT5leGVjX2NvbW1hbmQoYXAsICZxYy0+dGYpOworfQorCisvKioKKyAqCWF0YV9ibWRtYV9zdGFydF9waW8gLSBTdGFydCBhIFBDSSBJREUgQk1ETUEgdHJhbnNhY3Rpb24gKFBJTykKKyAqCUBxYzogSW5mbyBhc3NvY2lhdGVkIHdpdGggdGhpcyBBVEEgdHJhbnNhY3Rpb24uCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKworc3RhdGljIHZvaWQgYXRhX2JtZG1hX3N0YXJ0X3BpbyAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXU4IGRtYWN0bDsKKworCS8qIHN0YXJ0IGhvc3QgRE1BIHRyYW5zYWN0aW9uICovCisJZG1hY3RsID0gaW5iKGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKKwlvdXRiKGRtYWN0bCB8IEFUQV9ETUFfU1RBUlQsCisJICAgICBhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX0NNRCk7Cit9CisKK3ZvaWQgYXRhX2JtZG1hX3N0YXJ0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJaWYgKHFjLT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQlhdGFfYm1kbWFfc3RhcnRfbW1pbyhxYyk7CisJZWxzZQorCQlhdGFfYm1kbWFfc3RhcnRfcGlvKHFjKTsKK30KKwordm9pZCBhdGFfYm1kbWFfc2V0dXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlpZiAocWMtPmFwLT5mbGFncyAmIEFUQV9GTEFHX01NSU8pCisJCWF0YV9ibWRtYV9zZXR1cF9tbWlvKHFjKTsKKwllbHNlCisJCWF0YV9ibWRtYV9zZXR1cF9waW8ocWMpOworfQorCit2b2lkIGF0YV9ibWRtYV9pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKyAgICBpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworICAgICAgICB2b2lkIF9faW9tZW0gKm1taW8gPSAoKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmJtZG1hX2FkZHIpICsgQVRBX0RNQV9TVEFUVVM7CisgICAgICAgIHdyaXRlYihyZWFkYihtbWlvKSwgbW1pbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVM7CisgICAgICAgIG91dGIoaW5iKGFkZHIpLCBhZGRyKTsKKyAgICB9CisKK30KKwordTggYXRhX2JtZG1hX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IGhvc3Rfc3RhdDsKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworCQl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKwkJaG9zdF9zdGF0ID0gcmVhZGIobW1pbyArIEFUQV9ETUFfU1RBVFVTKTsKKwl9IGVsc2UKKwlob3N0X3N0YXQgPSBpbmIoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOworCXJldHVybiBob3N0X3N0YXQ7Cit9CisKK3ZvaWQgYXRhX2JtZG1hX3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykgeworCQl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKworCQkvKiBjbGVhciBzdGFydC9zdG9wIGJpdCAqLworCQl3cml0ZWIocmVhZGIobW1pbyArIEFUQV9ETUFfQ01EKSAmIH5BVEFfRE1BX1NUQVJULAorCQkJbW1pbyArIEFUQV9ETUFfQ01EKTsKKwl9IGVsc2UgeworCQkvKiBjbGVhciBzdGFydC9zdG9wIGJpdCAqLworCQlvdXRiKGluYihhcC0+aW9hZGRyLmJtZG1hX2FkZHIgKyBBVEFfRE1BX0NNRCkgJiB+QVRBX0RNQV9TVEFSVCwKKwkJCWFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfQ01EKTsKKwl9CisKKwkvKiBvbmUtUElPLWN5Y2xlIGd1YXJhbnRlZWQgd2FpdCwgcGVyIHNwZWMsIGZvciBIRE1BMTowIHRyYW5zaXRpb24gKi8KKwlhdGFfYWx0c3RhdHVzKGFwKTsgICAgICAgIC8qIGR1bW15IHJlYWQgKi8KK30KKworLyoqCisgKglhdGFfaG9zdF9pbnRyIC0gSGFuZGxlIGhvc3QgaW50ZXJydXB0IGZvciBnaXZlbiAocG9ydCwgdGFzaykKKyAqCUBhcDogUG9ydCBvbiB3aGljaCBpbnRlcnJ1cHQgYXJyaXZlZCAocG9zc2libHkuLi4pCisgKglAcWM6IFRhc2tmaWxlIGN1cnJlbnRseSBhY3RpdmUgaW4gZW5naW5lCisgKgorICoJSGFuZGxlIGhvc3QgaW50ZXJydXB0IGZvciBnaXZlbiBxdWV1ZWQgY29tbWFuZC4gIEN1cnJlbnRseSwKKyAqCW9ubHkgRE1BIGludGVycnVwdHMgYXJlIGhhbmRsZWQuICBBbGwgb3RoZXIgY29tbWFuZHMgYXJlCisgKgloYW5kbGVkIHZpYSBwb2xsaW5nIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAobklFTiBiaXQpLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglPbmUgaWYgaW50ZXJydXB0IHdhcyBoYW5kbGVkLCB6ZXJvIGlmIG5vdCAoc2hhcmVkIGlycSkuCisgKi8KKworaW5saW5lIHVuc2lnbmVkIGludCBhdGFfaG9zdF9pbnRyIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJdTggc3RhdHVzLCBob3N0X3N0YXQ7CisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCisJY2FzZSBBVEFfUFJPVF9ETUE6CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJY2FzZSBBVEFfUFJPVF9BVEFQSToKKwkJLyogY2hlY2sgc3RhdHVzIG9mIERNQSBlbmdpbmUgKi8KKwkJaG9zdF9zdGF0ID0gYXAtPm9wcy0+Ym1kbWFfc3RhdHVzKGFwKTsKKwkJVlBSSU5USygiYXRhJXU6IGhvc3Rfc3RhdCAweCVYXG4iLCBhcC0+aWQsIGhvc3Rfc3RhdCk7CisKKwkJLyogaWYgaXQncyBub3Qgb3VyIGlycS4uLiAqLworCQlpZiAoIShob3N0X3N0YXQgJiBBVEFfRE1BX0lOVFIpKQorCQkJZ290byBpZGxlX2lycTsKKworCQkvKiBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSwgY2xlYXIgRE1BLVN0YXJ0IGJpdCAqLworCQlhcC0+b3BzLT5ibWRtYV9zdG9wKGFwKTsKKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgQVRBX1BST1RfQVRBUElfTk9EQVRBOgorCWNhc2UgQVRBX1BST1RfTk9EQVRBOgorCQkvKiBjaGVjayBhbHRzdGF0dXMgKi8KKwkJc3RhdHVzID0gYXRhX2FsdHN0YXR1cyhhcCk7CisJCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkKKwkJCWdvdG8gaWRsZV9pcnE7CisKKwkJLyogY2hlY2sgbWFpbiBzdGF0dXMsIGNsZWFyaW5nIElOVFJRICovCisJCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIEFUQV9CVVNZKSkKKwkJCWdvdG8gaWRsZV9pcnE7CisJCURQUklOVEsoImF0YSV1OiBwcm90b2NvbCAlZCAoZGV2X3N0YXQgMHglWClcbiIsCisJCQlhcC0+aWQsIHFjLT50Zi5wcm90b2NvbCwgc3RhdHVzKTsKKworCQkvKiBhY2sgYm1kbWEgaXJxIGV2ZW50cyAqLworCQlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOworCisJCS8qIGNvbXBsZXRlIHRhc2tmaWxlIHRyYW5zYWN0aW9uICovCisJCWF0YV9xY19jb21wbGV0ZShxYywgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIGlkbGVfaXJxOworCX0KKworCXJldHVybiAxOwkvKiBpcnEgaGFuZGxlZCAqLworCitpZGxlX2lycToKKwlhcC0+c3RhdHMuaWRsZV9pcnErKzsKKworI2lmZGVmIEFUQV9JUlFfVFJBUAorCWlmICgoYXAtPnN0YXRzLmlkbGVfaXJxICUgMTAwMCkgPT0gMCkgeworCQloYW5kbGVkID0gMTsKKwkJYXRhX2lycV9hY2soYXAsIDApOyAvKiBkZWJ1ZyB0cmFwICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSVkOiBpcnEgdHJhcFxuIiwgYXAtPmlkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsJLyogaXJxIG5vdCBoYW5kbGVkICovCit9CisKKy8qKgorICoJYXRhX2ludGVycnVwdCAtIERlZmF1bHQgQVRBIGhvc3QgaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBpcnE6IGlycSBsaW5lCisgKglAZGV2X2luc3RhbmNlOiBwb2ludGVyIHRvIG91ciBob3N0IGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICoJQHJlZ3M6IHVudXNlZAorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworaXJxcmV0dXJuX3QgYXRhX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGRldl9pbnN0YW5jZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFRPRE86IG1ha2UgX2lycXNhdmUgY29uZGl0aW9uYWwgb24geDg2IFBDSSBJREUgbGVnYWN5IG1vZGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisKKwkJYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CisJCWlmIChhcCAmJiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSkpIHsKKwkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisKKwkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkpCisJCQkJaGFuZGxlZCB8PSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKgorICoJYXRhcGlfcGFja2V0X3Rhc2sgLSBXcml0ZSBDREIgYnl0ZXMgdG8gaGFyZHdhcmUKKyAqCUBfZGF0YTogUG9ydCB0byB3aGljaCBBVEFQSSBkZXZpY2UgaXMgYXR0YWNoZWQuCisgKgorICoJV2hlbiBkZXZpY2UgaGFzIGluZGljYXRlZCBpdHMgcmVhZGluZXNzIHRvIGFjY2VwdAorICoJYSBDREIsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgU2VuZCB0aGUgQ0RCLgorICoJSWYgRE1BIGlzIHRvIGJlIHBlcmZvcm1lZCwgZXhpdCBpbW1lZGlhdGVseS4KKyAqCU90aGVyd2lzZSwgd2UgYXJlIGluIHBvbGxpbmcgbW9kZSwgc28gcG9sbAorICoJc3RhdHVzIHVuZGVyIG9wZXJhdGlvbiBzdWNjZWVkcyBvciBmYWlscy4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCisgKi8KKworc3RhdGljIHZvaWQgYXRhcGlfcGFja2V0X3Rhc2sodm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IF9kYXRhOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTggc3RhdHVzOworCisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwlhc3NlcnQocWMgIT0gTlVMTCk7CisJYXNzZXJ0KHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFKTsKKworCS8qIHNsZWVwLXdhaXQgZm9yIEJTWSB0byBjbGVhciAqLworCURQUklOVEsoImJ1c3kgd2FpdFxuIik7CisJaWYgKGF0YV9idXN5X3NsZWVwKGFwLCBBVEFfVE1PVVRfQ0RCX1FVSUNLLCBBVEFfVE1PVVRfQ0RCKSkKKwkJZ290byBlcnJfb3V0OworCisJLyogbWFrZSBzdXJlIERSUSBpcyBzZXQgKi8KKwlzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CisJaWYgKChzdGF0dXMgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgIT0gQVRBX0RSUSkKKwkJZ290byBlcnJfb3V0OworCisJLyogc2VuZCBTQ1NJIGNkYiAqLworCURQUklOVEsoInNlbmQgY2RiXG4iKTsKKwlhc3NlcnQoYXAtPmNkYl9sZW4gPj0gMTIpOworCWF0YV9kYXRhX3hmZXIoYXAsIHFjLT5jZGIsIGFwLT5jZGJfbGVuLCAxKTsKKworCS8qIGlmIHdlIGFyZSBETUEnaW5nLCBpcnEgaGFuZGxlciB0YWtlcyBvdmVyIGZyb20gaGVyZSAqLworCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfQVRBUElfRE1BKQorCQlhcC0+b3BzLT5ibWRtYV9zdGFydChxYyk7CSAgICAvKiBpbml0aWF0ZSBibWRtYSAqLworCisJLyogbm9uLWRhdGEgY29tbWFuZHMgYXJlIGFsc28gaGFuZGxlZCB2aWEgaXJxICovCisJZWxzZSBpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX05PREFUQSkgeworCQkvKiBkbyBub3RoaW5nICovCisJfQorCisJLyogUElPIGNvbW1hbmRzIGFyZSBoYW5kbGVkIGJ5IHBvbGxpbmcgKi8KKwllbHNlIHsKKwkJYXAtPnBpb190YXNrX3N0YXRlID0gUElPX1NUOworCQlxdWV1ZV93b3JrKGF0YV93cSwgJmFwLT5waW9fdGFzayk7CisJfQorCisJcmV0dXJuOworCitlcnJfb3V0OgorCWF0YV9xY19jb21wbGV0ZShxYywgQVRBX0VSUik7Cit9CisKK2ludCBhdGFfcG9ydF9zdGFydCAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKworCWFwLT5wcmQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBBVEFfUFJEX1RCTF9TWiwgJmFwLT5wcmRfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFwLT5wcmQpCisJCXJldHVybiAtRU5PTUVNOworCisJRFBSSU5USygicHJkIGFsbG9jLCB2aXJ0ICVwLCBkbWEgJWxseFxuIiwgYXAtPnByZCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXAtPnByZF9kbWEpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXRhX3BvcnRfc3RvcCAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKworCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgQVRBX1BSRF9UQkxfU1osIGFwLT5wcmQsIGFwLT5wcmRfZG1hKTsKK30KKworLyoqCisgKglhdGFfaG9zdF9yZW1vdmUgLSBVbnJlZ2lzdGVyIFNDU0kgaG9zdCBzdHJ1Y3R1cmUgd2l0aCB1cHBlciBsYXllcnMKKyAqCUBhcDogUG9ydCB0byB1bnJlZ2lzdGVyCisgKglAZG9fdW5yZWdpc3RlcjogMSBpZiB3ZSBmdWxseSB1bnJlZ2lzdGVyLCAwIHRvIGp1c3Qgc3RvcCB0aGUgcG9ydAorICoKKyAqCUxPQ0tJTkc6CisgKi8KKworc3RhdGljIHZvaWQgYXRhX2hvc3RfcmVtb3ZlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkb191bnJlZ2lzdGVyKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNoID0gYXAtPmhvc3Q7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlpZiAoZG9fdW5yZWdpc3RlcikKKwkJc2NzaV9yZW1vdmVfaG9zdChzaCk7CisKKwlhcC0+b3BzLT5wb3J0X3N0b3AoYXApOworfQorCisvKioKKyAqCWF0YV9ob3N0X2luaXQgLSBJbml0aWFsaXplIGFuIGF0YV9wb3J0IHN0cnVjdHVyZQorICoJQGFwOiBTdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQorICoJQGhvc3Q6IGFzc29jaWF0ZWQgU0NTSSBtaWQtbGF5ZXIgc3RydWN0dXJlCisgKglAaG9zdF9zZXQ6IENvbGxlY3Rpb24gb2YgaG9zdHMgdG8gd2hpY2ggQGFwIGJlbG9uZ3MKKyAqCUBlbnQ6IFByb2JlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IGxvdy1sZXZlbCBkcml2ZXIKKyAqCUBwb3J0X25vOiBQb3J0IG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdGFfcG9ydAorICoKKyAqCUxPQ0tJTkc6CisgKgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9ob3N0X2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKwkJCSAgc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQsCisJCQkgIHN0cnVjdCBhdGFfcHJvYmVfZW50ICplbnQsIHVuc2lnbmVkIGludCBwb3J0X25vKQoreworCXVuc2lnbmVkIGludCBpOworCisJaG9zdC0+bWF4X2lkID0gMTY7CisJaG9zdC0+bWF4X2x1biA9IDE7CisJaG9zdC0+bWF4X2NoYW5uZWwgPSAxOworCWhvc3QtPnVuaXF1ZV9pZCA9IGF0YV91bmlxdWVfaWQrKzsKKwlob3N0LT5tYXhfY21kX2xlbiA9IDEyOworCXNjc2lfc2V0X2RldmljZShob3N0LCBlbnQtPmRldik7CisJc2NzaV9hc3NpZ25fbG9jayhob3N0LCAmaG9zdF9zZXQtPmxvY2spOworCisJYXAtPmZsYWdzID0gQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRDsKKwlhcC0+aWQgPSBob3N0LT51bmlxdWVfaWQ7CisJYXAtPmhvc3QgPSBob3N0OworCWFwLT5jdGwgPSBBVEFfREVWQ1RMX09CUzsKKwlhcC0+aG9zdF9zZXQgPSBob3N0X3NldDsKKwlhcC0+cG9ydF9ubyA9IHBvcnRfbm87CisJYXAtPmhhcmRfcG9ydF9ubyA9CisJCWVudC0+bGVnYWN5X21vZGUgPyBlbnQtPmhhcmRfcG9ydF9ubyA6IHBvcnRfbm87CisJYXAtPnBpb19tYXNrID0gZW50LT5waW9fbWFzazsKKwlhcC0+bXdkbWFfbWFzayA9IGVudC0+bXdkbWFfbWFzazsKKwlhcC0+dWRtYV9tYXNrID0gZW50LT51ZG1hX21hc2s7CisJYXAtPmZsYWdzIHw9IGVudC0+aG9zdF9mbGFnczsKKwlhcC0+b3BzID0gZW50LT5wb3J0X29wczsKKwlhcC0+Y2JsID0gQVRBX0NCTF9OT05FOworCWFwLT5hY3RpdmVfdGFnID0gQVRBX1RBR19QT0lTT047CisJYXAtPmxhc3RfY3RsID0gMHhGRjsKKworCUlOSVRfV09SSygmYXAtPnBhY2tldF90YXNrLCBhdGFwaV9wYWNrZXRfdGFzaywgYXApOworCUlOSVRfV09SSygmYXAtPnBpb190YXNrLCBhdGFfcGlvX3Rhc2ssIGFwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykKKwkJYXAtPmRldmljZVtpXS5kZXZubyA9IGk7CisKKyNpZmRlZiBBVEFfSVJRX1RSQVAKKwlhcC0+c3RhdHMudW5oYW5kbGVkX2lycSA9IDE7CisJYXAtPnN0YXRzLmlkbGVfaXJxID0gMTsKKyNlbmRpZgorCisJbWVtY3B5KCZhcC0+aW9hZGRyLCAmZW50LT5wb3J0W3BvcnRfbm9dLCBzaXplb2Yoc3RydWN0IGF0YV9pb3BvcnRzKSk7Cit9CisKKy8qKgorICoJYXRhX2hvc3RfYWRkIC0gQXR0YWNoIGxvdy1sZXZlbCBBVEEgZHJpdmVyIHRvIHN5c3RlbQorICoJQGVudDogSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgbG93LWxldmVsIGRyaXZlcgorICoJQGhvc3Rfc2V0OiBDb2xsZWN0aW9ucyBvZiBwb3J0cyB0byB3aGljaCB3ZSBhZGQKKyAqCUBwb3J0X25vOiBQb3J0IG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBob3N0CisgKgorICoJTE9DS0lORzoKKyAqCisgKglSRVRVUk5TOgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0ICogYXRhX2hvc3RfYWRkKHN0cnVjdCBhdGFfcHJvYmVfZW50ICplbnQsCisJCQkJICAgICAgc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnRfbm8pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCWludCByYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKGVudC0+c2h0LCBzaXplb2Yoc3RydWN0IGF0YV9wb3J0KSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmaG9zdC0+aG9zdGRhdGFbMF07CisKKwlhdGFfaG9zdF9pbml0KGFwLCBob3N0LCBob3N0X3NldCwgZW50LCBwb3J0X25vKTsKKworCXJjID0gYXAtPm9wcy0+cG9ydF9zdGFydChhcCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwlyZXR1cm4gYXA7CisKK2Vycl9vdXQ6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglhdGFfZGV2aWNlX2FkZCAtCisgKglAZW50OgorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworaW50IGF0YV9kZXZpY2VfYWRkKHN0cnVjdCBhdGFfcHJvYmVfZW50ICplbnQpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBlbnQtPmRldjsKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldDsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKwkvKiBhbGxvYyBhIGNvbnRhaW5lciBmb3Igb3VyIGxpc3Qgb2YgQVRBIHBvcnRzIChidXNlcykgKi8KKwlob3N0X3NldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGFfaG9zdF9zZXQpICsKKwkJCSAgIChlbnQtPm5fcG9ydHMgKiBzaXplb2Yodm9pZCAqKSksIEdGUF9LRVJORUwpOworCWlmICghaG9zdF9zZXQpCisJCXJldHVybiAwOworCW1lbXNldChob3N0X3NldCwgMCwgc2l6ZW9mKHN0cnVjdCBhdGFfaG9zdF9zZXQpICsgKGVudC0+bl9wb3J0cyAqIHNpemVvZih2b2lkICopKSk7CisJc3Bpbl9sb2NrX2luaXQoJmhvc3Rfc2V0LT5sb2NrKTsKKworCWhvc3Rfc2V0LT5kZXYgPSBkZXY7CisJaG9zdF9zZXQtPm5fcG9ydHMgPSBlbnQtPm5fcG9ydHM7CisJaG9zdF9zZXQtPmlycSA9IGVudC0+aXJxOworCWhvc3Rfc2V0LT5tbWlvX2Jhc2UgPSBlbnQtPm1taW9fYmFzZTsKKwlob3N0X3NldC0+cHJpdmF0ZV9kYXRhID0gZW50LT5wcml2YXRlX2RhdGE7CisJaG9zdF9zZXQtPm9wcyA9IGVudC0+cG9ydF9vcHM7CisKKwkvKiByZWdpc3RlciBlYWNoIHBvcnQgYm91bmQgdG8gdGhpcyBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcDsKKwkJdW5zaWduZWQgbG9uZyB4ZmVyX21vZGVfbWFzazsKKworCQlhcCA9IGF0YV9ob3N0X2FkZChlbnQsIGhvc3Rfc2V0LCBpKTsKKwkJaWYgKCFhcCkKKwkJCWdvdG8gZXJyX291dDsKKworCQlob3N0X3NldC0+cG9ydHNbaV0gPSBhcDsKKwkJeGZlcl9tb2RlX21hc2sgPShhcC0+dWRtYV9tYXNrIDw8IEFUQV9TSElGVF9VRE1BKSB8CisJCQkJKGFwLT5td2RtYV9tYXNrIDw8IEFUQV9TSElGVF9NV0RNQSkgfAorCQkJCShhcC0+cGlvX21hc2sgPDwgQVRBX1NISUZUX1BJTyk7CisKKwkJLyogcHJpbnQgcGVyLXBvcnQgaW5mbyB0byBkbWVzZyAqLworCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogJWNBVEEgbWF4ICVzIGNtZCAweCVsWCBjdGwgMHglbFggIgorCQkJCSAiYm1kbWEgMHglbFggaXJxICVsdVxuIiwKKwkJCWFwLT5pZCwKKwkJCWFwLT5mbGFncyAmIEFUQV9GTEFHX1NBVEEgPyAnUycgOiAnUCcsCisJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tb2RlX21hc2spLAorCSAgICAgICAJCWFwLT5pb2FkZHIuY21kX2FkZHIsCisJICAgICAgIAkJYXAtPmlvYWRkci5jdGxfYWRkciwKKwkgICAgICAgCQlhcC0+aW9hZGRyLmJtZG1hX2FkZHIsCisJICAgICAgIAkJZW50LT5pcnEpOworCisJCWF0YV9jaGtfc3RhdHVzKGFwKTsKKwkJaG9zdF9zZXQtPm9wcy0+aXJxX2NsZWFyKGFwKTsKKwkJY291bnQrKzsKKwl9CisKKwlpZiAoIWNvdW50KSB7CisJCWtmcmVlKGhvc3Rfc2V0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogb2J0YWluIGlycSwgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBjaGFubmVscyAqLworCWlmIChyZXF1ZXN0X2lycShlbnQtPmlycSwgZW50LT5wb3J0X29wcy0+aXJxX2hhbmRsZXIsIGVudC0+aXJxX2ZsYWdzLAorCQkJRFJWX05BTUUsIGhvc3Rfc2V0KSkKKwkJZ290byBlcnJfb3V0OworCisJLyogcGVyZm9ybSBlYWNoIHByb2JlIHN5bmNocm9ub3VzbHkgKi8KKwlEUFJJTlRLKCJwcm9iZSBiZWdpblxuIik7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcDsKKwkJaW50IHJjOworCisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCisJCURQUklOVEsoImF0YSV1OiBwcm9iZSBiZWdpblxuIiwgYXAtPmlkKTsKKwkJcmMgPSBhdGFfYnVzX3Byb2JlKGFwKTsKKwkJRFBSSU5USygiYXRhJXU6IHByb2JlIGVuZFxuIiwgYXAtPmlkKTsKKworCQlpZiAocmMpIHsKKwkJCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgdXNlZnVsIGhlcmU/CisJCQkgKiBDdXJyZW50IGxpYmF0YSBiZWhhdmlvciB3aWxsCisJCQkgKiB0ZWFyIGRvd24gZXZlcnl0aGluZyB3aGVuCisJCQkgKiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQKKwkJCSAqIG9yIHRoZSBoL3cgaXMgdW5wbHVnZ2VkLgorCQkJICovCisJCX0KKworCQlyYyA9IHNjc2lfYWRkX2hvc3QoYXAtPmhvc3QsIGRldik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIsCisJCQkgICAgICAgYXAtPmlkKTsKKwkJCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgdXNlZnVsIGhlcmUgKi8KKwkJCS8qIEZJWE1FOiBoYW5kbGUgdW5jb25kaXRpb25hbCBjYWxscyB0bworCQkJICogc2NzaV9zY2FuX2hvc3QgYW5kIGF0YV9ob3N0X3JlbW92ZSwgYmVsb3csCisJCQkgKiBhdCB0aGUgdmVyeSBsZWFzdAorCQkJICovCisJCX0KKwl9CisKKwkvKiBwcm9iZXMgYXJlIGRvbmUsIG5vdyBzY2FuIGVhY2ggcG9ydCdzIGRpc2socykgKi8KKwlEUFJJTlRLKCJwcm9iZSBiZWdpblxuIik7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKworCQlzY3NpX3NjYW5faG9zdChhcC0+aG9zdCk7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgaG9zdF9zZXQpOworCisJVlBSSU5USygiRVhJVCwgcmV0dXJuaW5nICV1XG4iLCBlbnQtPm5fcG9ydHMpOworCXJldHVybiBlbnQtPm5fcG9ydHM7IC8qIHN1Y2Nlc3MgKi8KKworZXJyX291dDoKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlhdGFfaG9zdF9yZW1vdmUoaG9zdF9zZXQtPnBvcnRzW2ldLCAxKTsKKwkJc2NzaV9ob3N0X3B1dChob3N0X3NldC0+cG9ydHNbaV0tPmhvc3QpOworCX0KKwlrZnJlZShob3N0X3NldCk7CisJVlBSSU5USygiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX3JlbGVhc2UgLSBTQ1NJIGxheWVyIGNhbGxiYWNrIGhvb2sgZm9yIGhvc3QgdW5sb2FkCisgKglAaG9zdDogbGliYXRhIGhvc3QgdG8gYmUgdW5sb2FkZWQKKyAqCisgKglQZXJmb3JtcyBhbGwgZHV0aWVzIG5lY2Vzc2FyeSB0byBzaHV0IGRvd24gYSBsaWJhdGEgcG9ydC4uLgorICoJS2lsbCBwb3J0IGt0aHJlYWQsIGRpc2FibGUgcG9ydCwgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBTQ1NJIGxheWVyLgorICoKKyAqCVJFVFVSTlM6CisgKglPbmUuCisgKi8KKworaW50IGF0YV9zY3NpX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmaG9zdC0+aG9zdGRhdGFbMF07CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlhcC0+b3BzLT5wb3J0X2Rpc2FibGUoYXApOworCWF0YV9ob3N0X3JlbW92ZShhcCwgMCk7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglhdGFfc3RkX3BvcnRzIC0gaW5pdGlhbGl6ZSBpb2FkZHIgd2l0aCBzdGFuZGFyZCBwb3J0IG9mZnNldHMuCisgKglAaW9hZGRyOiBJTyBhZGRyZXNzIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZAorICovCit2b2lkIGF0YV9zdGRfcG9ydHMoc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIpCit7CisJaW9hZGRyLT5kYXRhX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19EQVRBOworCWlvYWRkci0+ZXJyb3JfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0VSUjsKKwlpb2FkZHItPmZlYXR1cmVfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0ZFQVRVUkU7CisJaW9hZGRyLT5uc2VjdF9hZGRyID0gaW9hZGRyLT5jbWRfYWRkciArIEFUQV9SRUdfTlNFQ1Q7CisJaW9hZGRyLT5sYmFsX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19MQkFMOworCWlvYWRkci0+bGJhbV9hZGRyID0gaW9hZGRyLT5jbWRfYWRkciArIEFUQV9SRUdfTEJBTTsKKwlpb2FkZHItPmxiYWhfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0xCQUg7CisJaW9hZGRyLT5kZXZpY2VfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0RFVklDRTsKKwlpb2FkZHItPnN0YXR1c19hZGRyID0gaW9hZGRyLT5jbWRfYWRkciArIEFUQV9SRUdfU1RBVFVTOworCWlvYWRkci0+Y29tbWFuZF9hZGRyID0gaW9hZGRyLT5jbWRfYWRkciArIEFUQV9SRUdfQ01EOworfQorCitzdGF0aWMgc3RydWN0IGF0YV9wcm9iZV9lbnQgKgorYXRhX3Byb2JlX2VudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0KQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9iZV9lbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLAorCQkgICAgICAga29iamVjdF9uYW1lKCYoZGV2LT5rb2JqKSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YoKnByb2JlX2VudCkpOworCisJSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7CisJcHJvYmVfZW50LT5kZXYgPSBkZXY7CisKKwlwcm9iZV9lbnQtPnNodCA9IHBvcnQtPnNodDsKKwlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgPSBwb3J0LT5ob3N0X2ZsYWdzOworCXByb2JlX2VudC0+cGlvX21hc2sgPSBwb3J0LT5waW9fbWFzazsKKwlwcm9iZV9lbnQtPm13ZG1hX21hc2sgPSBwb3J0LT5td2RtYV9tYXNrOworCXByb2JlX2VudC0+dWRtYV9tYXNrID0gcG9ydC0+dWRtYV9tYXNrOworCXByb2JlX2VudC0+cG9ydF9vcHMgPSBwb3J0LT5wb3J0X29wczsKKworCXJldHVybiBwcm9iZV9lbnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCitzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqCithdGFfcGNpX2luaXRfbmF0aXZlX21vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhdGFfcG9ydF9pbmZvICoqcG9ydCkKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50ID0KKwkJYXRhX3Byb2JlX2VudF9hbGxvYyhwY2lfZGV2X3RvX2RldihwZGV2KSwgcG9ydFswXSk7CisJaWYgKCFwcm9iZV9lbnQpCisJCXJldHVybiBOVUxMOworCisJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKKwlwcm9iZV9lbnQtPmlycSA9IHBkZXYtPmlycTsKKwlwcm9iZV9lbnQtPmlycV9mbGFncyA9IFNBX1NISVJROworCisJcHJvYmVfZW50LT5wb3J0WzBdLmNtZF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXByb2JlX2VudC0+cG9ydFswXS5hbHRzdGF0dXNfYWRkciA9CisJcHJvYmVfZW50LT5wb3J0WzBdLmN0bF9hZGRyID0KKwkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpIHwgQVRBX1BDSV9DVExfT0ZTOworCXByb2JlX2VudC0+cG9ydFswXS5ibWRtYV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOworCisJcHJvYmVfZW50LT5wb3J0WzFdLmNtZF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCXByb2JlX2VudC0+cG9ydFsxXS5hbHRzdGF0dXNfYWRkciA9CisJcHJvYmVfZW50LT5wb3J0WzFdLmN0bF9hZGRyID0KKwkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpIHwgQVRBX1BDSV9DVExfT0ZTOworCXByb2JlX2VudC0+cG9ydFsxXS5ibWRtYV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpICsgODsKKworCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFswXSk7CisJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0WzFdKTsKKworCXJldHVybiBwcm9iZV9lbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqCithdGFfcGNpX2luaXRfbGVnYWN5X21vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhdGFfcG9ydF9pbmZvICoqcG9ydCwKKyAgICBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqKnBwZTIpCit7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCwgKnByb2JlX2VudDI7CisKKwlwcm9iZV9lbnQgPSBhdGFfcHJvYmVfZW50X2FsbG9jKHBjaV9kZXZfdG9fZGV2KHBkZXYpLCBwb3J0WzBdKTsKKwlpZiAoIXByb2JlX2VudCkKKwkJcmV0dXJuIE5VTEw7CisJcHJvYmVfZW50MiA9IGF0YV9wcm9iZV9lbnRfYWxsb2MocGNpX2Rldl90b19kZXYocGRldiksIHBvcnRbMV0pOworCWlmICghcHJvYmVfZW50MikgeworCQlrZnJlZShwcm9iZV9lbnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSAxOworCXByb2JlX2VudC0+aXJxID0gMTQ7CisKKwlwcm9iZV9lbnQtPmhhcmRfcG9ydF9ubyA9IDA7CisJcHJvYmVfZW50LT5sZWdhY3lfbW9kZSA9IDE7CisKKwlwcm9iZV9lbnQyLT5uX3BvcnRzID0gMTsKKwlwcm9iZV9lbnQyLT5pcnEgPSAxNTsKKworCXByb2JlX2VudDItPmhhcmRfcG9ydF9ubyA9IDE7CisJcHJvYmVfZW50Mi0+bGVnYWN5X21vZGUgPSAxOworCisJcHJvYmVfZW50LT5wb3J0WzBdLmNtZF9hZGRyID0gMHgxZjA7CisJcHJvYmVfZW50LT5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0KKwlwcm9iZV9lbnQtPnBvcnRbMF0uY3RsX2FkZHIgPSAweDNmNjsKKwlwcm9iZV9lbnQtPnBvcnRbMF0uYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKworCXByb2JlX2VudDItPnBvcnRbMF0uY21kX2FkZHIgPSAweDE3MDsKKwlwcm9iZV9lbnQyLT5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0KKwlwcm9iZV9lbnQyLT5wb3J0WzBdLmN0bF9hZGRyID0gMHgzNzY7CisJcHJvYmVfZW50Mi0+cG9ydFswXS5ibWRtYV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpKzg7CisKKwlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbMF0pOworCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudDItPnBvcnRbMF0pOworCisJKnBwZTIgPSBwcm9iZV9lbnQyOworCXJldHVybiBwcm9iZV9lbnQ7Cit9CisKKy8qKgorICoJYXRhX3BjaV9pbml0X29uZSAtIEluaXRpYWxpemUvcmVnaXN0ZXIgUENJIElERSBob3N0IGNvbnRyb2xsZXIKKyAqCUBwZGV2OiBDb250cm9sbGVyIHRvIGJlIGluaXRpYWxpemVkCisgKglAcG9ydF9pbmZvOiBJbmZvcm1hdGlvbiBmcm9tIGxvdy1sZXZlbCBob3N0IGRyaXZlcgorICoJQG5fcG9ydHM6IE51bWJlciBvZiBwb3J0cyBhdHRhY2hlZCB0byBob3N0IGNvbnRyb2xsZXIKKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gUENJIGxheWVyIChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgorICovCisKK2ludCBhdGFfcGNpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGF0YV9wb3J0X2luZm8gKipwb3J0X2luZm8sCisJCSAgICAgIHVuc2lnbmVkIGludCBuX3BvcnRzKQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQsICpwcm9iZV9lbnQyID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydFsyXTsKKwl1OCB0bXA4LCBtYXNrOworCXVuc2lnbmVkIGludCBsZWdhY3lfbW9kZSA9IDA7CisJaW50IGRpc2FibGVfZGV2X29uX2VyciA9IDE7CisJaW50IHJjOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJcG9ydFswXSA9IHBvcnRfaW5mb1swXTsKKwlpZiAobl9wb3J0cyA+IDEpCisJCXBvcnRbMV0gPSBwb3J0X2luZm9bMV07CisJZWxzZQorCQlwb3J0WzFdID0gcG9ydFswXTsKKworCWlmICgocG9ydFswXS0+aG9zdF9mbGFncyAmIEFUQV9GTEFHX05PX0xFR0FDWSkgPT0gMAorCSAgICAmJiAocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7CisJCS8qIFRPRE86IHN1cHBvcnQgdHJhbnNpdGlvbmluZyB0byBuYXRpdmUgbW9kZT8gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1BST0csICZ0bXA4KTsKKwkJbWFzayA9ICgxIDw8IDIpIHwgKDEgPDwgMCk7CisJCWlmICgodG1wOCAmIG1hc2spICE9IG1hc2spCisJCQlsZWdhY3lfbW9kZSA9ICgxIDw8IDMpOworCX0KKworCS8qIEZJWE1FLi4uICovCisJaWYgKCghbGVnYWN5X21vZGUpICYmIChuX3BvcnRzID4gMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGE6IEJVRzogbmF0aXZlIG1vZGUsIG5fcG9ydHMgPiAxXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCWRpc2FibGVfZGV2X29uX2VyciA9IDA7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAobGVnYWN5X21vZGUpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigweDFmMCwgOCwgImxpYmF0YSIpKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKmNvbmZsaWN0LCByZXM7CisJCQlyZXMuc3RhcnQgPSAweDFmMDsKKwkJCXJlcy5lbmQgPSAweDFmMCArIDggLSAxOworCQkJY29uZmxpY3QgPSBfX19fcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcmVzKTsKKwkJCWlmICghc3RyY21wKGNvbmZsaWN0LT5uYW1lLCAibGliYXRhIikpCisJCQkJbGVnYWN5X21vZGUgfD0gKDEgPDwgMCk7CisJCQllbHNlIHsKKwkJCQlkaXNhYmxlX2Rldl9vbl9lcnIgPSAwOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YTogMHgxZjAgSURFIHBvcnQgYnVzeVxuIik7CisJCQl9CisJCX0gZWxzZQorCQkJbGVnYWN5X21vZGUgfD0gKDEgPDwgMCk7CisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigweDE3MCwgOCwgImxpYmF0YSIpKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKmNvbmZsaWN0LCByZXM7CisJCQlyZXMuc3RhcnQgPSAweDE3MDsKKwkJCXJlcy5lbmQgPSAweDE3MCArIDggLSAxOworCQkJY29uZmxpY3QgPSBfX19fcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcmVzKTsKKwkJCWlmICghc3RyY21wKGNvbmZsaWN0LT5uYW1lLCAibGliYXRhIikpCisJCQkJbGVnYWN5X21vZGUgfD0gKDEgPDwgMSk7CisJCQllbHNlIHsKKwkJCQlkaXNhYmxlX2Rldl9vbl9lcnIgPSAwOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YTogMHgxNzAgSURFIHBvcnQgYnVzeVxuIik7CisJCQl9CisJCX0gZWxzZQorCQkJbGVnYWN5X21vZGUgfD0gKDEgPDwgMSk7CisJfQorCisJLyogd2UgaGF2ZSBsZWdhY3kgbW9kZSwgYnV0IGFsbCBwb3J0cyBhcmUgdW5hdmFpbGFibGUgKi8KKwlpZiAobGVnYWN5X21vZGUgPT0gKDEgPDwgMykpIHsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJaWYgKGxlZ2FjeV9tb2RlKSB7CisJCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9sZWdhY3lfbW9kZShwZGV2LCBwb3J0LCAmcHJvYmVfZW50Mik7CisJfSBlbHNlCisJCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwb3J0KTsKKwlpZiAoIXByb2JlX2VudCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiAqLworCWlmIChsZWdhY3lfbW9kZSkgeworCQlpZiAobGVnYWN5X21vZGUgJiAoMSA8PCAwKSkKKwkJCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJCWlmIChsZWdhY3lfbW9kZSAmICgxIDw8IDEpKQorCQkJYXRhX2RldmljZV9hZGQocHJvYmVfZW50Mik7CisJfSBlbHNlCisJCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisKKwlrZnJlZShwcm9iZV9lbnQpOworCWtmcmVlKHByb2JlX2VudDIpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfcmVnaW9uczoKKwlpZiAobGVnYWN5X21vZGUgJiAoMSA8PCAwKSkKKwkJcmVsZWFzZV9yZWdpb24oMHgxZjAsIDgpOworCWlmIChsZWdhY3lfbW9kZSAmICgxIDw8IDEpKQorCQlyZWxlYXNlX3JlZ2lvbigweDE3MCwgOCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJaWYgKGRpc2FibGVfZGV2X29uX2VycikKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworLyoqCisgKglhdGFfcGNpX3JlbW92ZV9vbmUgLSBQQ0kgbGF5ZXIgY2FsbGJhY2sgZm9yIGRldmljZSByZW1vdmFsCisgKglAcGRldjogUENJIGRldmljZSB0aGF0IHdhcyByZW1vdmVkCisgKgorICoJUENJIGxheWVyIGluZGljYXRlcyB0byBsaWJhdGEgdmlhIHRoaXMgaG9vayB0aGF0CisgKglob3QtdW5wbHVnIG9yIG1vZHVsZSB1bmxvYWQgZXZlbnQgaGFzIG9jY3VyZWQuCisgKglIYW5kbGUgdGhpcyBieSB1bnJlZ2lzdGVyaW5nIGFsbCBvYmplY3RzIGFzc29jaWF0ZWQKKyAqCXdpdGggdGhpcyBQQ0kgZGV2aWNlLiAgRnJlZSB0aG9zZSBvYmplY3RzLiAgVGhlbiBmaW5hbGx5CisgKglyZWxlYXNlIFBDSSByZXNvdXJjZXMgYW5kIGRpc2FibGUgZGV2aWNlLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBQQ0kgbGF5ZXIgKG1heSBzbGVlcCkuCisgKi8KKwordm9pZCBhdGFfcGNpX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCisJCXNjc2lfcmVtb3ZlX2hvc3QoYXAtPmhvc3QpOworCX0KKworCWZyZWVfaXJxKGhvc3Rfc2V0LT5pcnEsIGhvc3Rfc2V0KTsKKwlpZiAoaG9zdF9zZXQtPm9wcy0+aG9zdF9zdG9wKQorCQlob3N0X3NldC0+b3BzLT5ob3N0X3N0b3AoaG9zdF9zZXQpOworCWlmIChob3N0X3NldC0+bW1pb19iYXNlKQorCQlpb3VubWFwKGhvc3Rfc2V0LT5tbWlvX2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspIHsKKwkJYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CisKKwkJYXRhX3Njc2lfcmVsZWFzZShhcC0+aG9zdCk7CisKKwkJaWYgKChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19OT19MRUdBQ1kpID09IDApIHsKKwkJCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisKKwkJCWlmIChpb2FkZHItPmNtZF9hZGRyID09IDB4MWYwKQorCQkJCXJlbGVhc2VfcmVnaW9uKDB4MWYwLCA4KTsKKwkJCWVsc2UgaWYgKGlvYWRkci0+Y21kX2FkZHIgPT0gMHgxNzApCisJCQkJcmVsZWFzZV9yZWdpb24oMHgxNzAsIDgpOworCQl9CisKKwkJc2NzaV9ob3N0X3B1dChhcC0+aG9zdCk7CisJfQorCisJa2ZyZWUoaG9zdF9zZXQpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKKy8qIG1vdmUgdG8gUENJIHN1YnN5c3RlbSAqLworaW50IHBjaV90ZXN0X2NvbmZpZ19iaXRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcGNpX2JpdHMgKmJpdHMpCit7CisJdW5zaWduZWQgbG9uZyB0bXAgPSAwOworCisJc3dpdGNoIChiaXRzLT53aWR0aCkgeworCWNhc2UgMTogeworCQl1OCB0bXA4ID0gMDsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgYml0cy0+cmVnLCAmdG1wOCk7CisJCXRtcCA9IHRtcDg7CisJCWJyZWFrOworCX0KKwljYXNlIDI6IHsKKwkJdTE2IHRtcDE2ID0gMDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgYml0cy0+cmVnLCAmdG1wMTYpOworCQl0bXAgPSB0bXAxNjsKKwkJYnJlYWs7CisJfQorCWNhc2UgNDogeworCQl1MzIgdG1wMzIgPSAwOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYml0cy0+cmVnLCAmdG1wMzIpOworCQl0bXAgPSB0bXAzMjsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1wICY9IGJpdHMtPm1hc2s7CisKKwlyZXR1cm4gKHRtcCA9PSBiaXRzLT52YWwpID8gMSA6IDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisKKy8qKgorICoJYXRhX2luaXQgLQorICoKKyAqCUxPQ0tJTkc6CisgKgorICoJUkVUVVJOUzoKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYXRhX2luaXQodm9pZCkKK3sKKwlhdGFfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJhdGEiKTsKKwlpZiAoIWF0YV93cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcmludGsoS0VSTl9ERUJVRyAibGliYXRhIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiIGxvYWRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRhX2V4aXQodm9pZCkKK3sKKwlkZXN0cm95X3dvcmtxdWV1ZShhdGFfd3EpOworfQorCittb2R1bGVfaW5pdChhdGFfaW5pdCk7Cittb2R1bGVfZXhpdChhdGFfZXhpdCk7CisKKy8qCisgKiBsaWJhdGEgaXMgZXNzZW50aWFsbHkgYSBsaWJyYXJ5IG9mIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgZm9yCisgKiBsb3ctbGV2ZWwgQVRBIGhvc3QgY29udHJvbGxlciBkcml2ZXJzLiAgQXMgc3VjaCwgdGhlIEFQSS9BQkkgaXMKKyAqIGxpa2VseSB0byBjaGFuZ2UgYXMgbmV3IGRyaXZlcnMgYXJlIGFkZGVkIGFuZCB1cGRhdGVkLgorICogRG8gbm90IGRlcGVuZCBvbiBBQkkvQVBJIHN0YWJpbGl0eS4KKyAqLworCitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX2Jpb3NfcGFyYW0pOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9wb3J0cyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2aWNlX2FkZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2dfaW5pdCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2dfaW5pdF9vbmUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3FjX2NvbXBsZXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9xY19pc3N1ZV9wcm90KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9lbmdfdGltZW91dCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfdGZfbG9hZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfdGZfcmVhZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfbm9vcF9kZXZfc2VsZWN0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfZGV2X3NlbGVjdCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfdGZfdG9fZmlzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV90Zl9mcm9tX2Zpcyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfY2hlY2tfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9hbHRzdGF0dXMpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Noa19lcnIpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2V4ZWNfY29tbWFuZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcG9ydF9zdGFydCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcG9ydF9zdG9wKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9pbnRlcnJ1cHQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3FjX3ByZXApOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3NldHVwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGFydCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfaXJxX2NsZWFyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGF0dXMpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0b3ApOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfcHJvYmUpOworRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9waHlfcmVzZXQpOworRVhQT1JUX1NZTUJPTF9HUEwoX19zYXRhX3BoeV9yZXNldCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYnVzX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wb3J0X2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfaW9jdGwpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfcXVldWVjbWQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfZXJyb3IpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfc2xhdmVfY29uZmlnKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2hvc3RfaW50cik7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X2NsYXNzaWZ5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZfaWRfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NpbXVsYXRlKTsKKworI2lmZGVmIENPTkZJR19QQ0kKK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV90ZXN0X2NvbmZpZ19iaXRzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2luaXRfb25lKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfcmVtb3ZlX29uZSk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTVlNTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKQEAgLTAsMCArMSwxNTkzIEBACisvKgorICAgbGliYXRhLXNjc2kuYyAtIGhlbHBlciBsaWJyYXJ5IGZvciBBVEEKKworICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBKZWZmIEdhcnppaworCisgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAgIGJ5IHJlZmVyZW5jZS4KKworICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAgIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAgIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImxpYmF0YS5oIgorCit0eXBlZGVmIHVuc2lnbmVkIGludCAoKmF0YV94bGF0X2Z1bmNfdCkoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpOworc3RhdGljIHN0cnVjdCBhdGFfZGV2aWNlICoKK2F0YV9zY3NpX2ZpbmRfZGV2KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CisKKworLyoqCisgKglhdGFfc3RkX2Jpb3NfcGFyYW0gLSBnZW5lcmljIGJpb3MgaGVhZC9zZWN0b3IvY3lsaW5kZXIgY2FsY3VsYXRvciB1c2VkIGJ5IHNkLgorICoJQHNkZXY6IFNDU0kgZGV2aWNlIGZvciB3aGljaCBCSU9TIGdlb21ldHJ5IGlzIHRvIGJlIGRldGVybWluZWQKKyAqCUBiZGV2OiBibG9jayBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIEBzZGV2CisgKglAY2FwYWNpdHk6IGNhcGFjaXR5IG9mIFNDU0kgZGV2aWNlCisgKglAZ2VvbTogbG9jYXRpb24gdG8gd2hpY2ggZ2VvbWV0cnkgd2lsbCBiZSBvdXRwdXQKKyAqCisgKglHZW5lcmljIGJpb3MgaGVhZC9zZWN0b3IvY3lsaW5kZXIgY2FsY3VsYXRvcgorICoJdXNlZCBieSBzZC4gTW9zdCBCSU9TZXMgbm93YWRheXMgZXhwZWN0IGEgWFhYLzI1NS8xNiAgKENIUykKKyAqCW1hcHBpbmcuIFNvbWUgc2l0dWF0aW9ucyBtYXkgYXJpc2Ugd2hlcmUgdGhlIGRpc2sgaXMgbm90CisgKglib290YWJsZSBpZiB0aGlzIGlzIG5vdCB1c2VkLgorICoKKyAqCUxPQ0tJTkc6CisgKglEZWZpbmVkIGJ5IHRoZSBTQ1NJIGxheWVyLiAgV2UgZG9uJ3QgcmVhbGx5IGNhcmUuCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8uCisgKi8KK2ludCBhdGFfc3RkX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgICAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJZ2VvbVswXSA9IDI1NTsKKwlnZW9tWzFdID0gNjM7CisJc2VjdG9yX2RpdihjYXBhY2l0eSwgMjU1KjYzKTsKKwlnZW9tWzJdID0gY2FwYWNpdHk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF0YV9zY3NpX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJaW50IHZhbCA9IC1FSU5WQUwsIHJjID0gLUVJTlZBTDsKKworCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmc2NzaWRldi0+aG9zdC0+aG9zdGRhdGFbMF07CisJaWYgKCFhcCkKKwkJZ290byBvdXQ7CisKKwlkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2NzaWRldik7CisJaWYgKCFkZXYpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVRBX0lPQ19HRVRfSU8zMjoKKwkJdmFsID0gMDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ2YWwsIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBBVEFfSU9DX1NFVF9JTzMyOgorCQl2YWwgPSAodW5zaWduZWQgbG9uZykgYXJnOworCQlpZiAodmFsICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKglhdGFfc2NzaV9xY19uZXcgLSBhY3F1aXJlIG5ldyBhdGFfcXVldWVkX2NtZCByZWZlcmVuY2UKKyAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIG5ldyBjb21tYW5kIGlzIGF0dGFjaGVkCisgKglAZGV2OiBBVEEgZGV2aWNlIHRvIHdoaWNoIHRoZSBuZXcgY29tbWFuZCBpcyBhdHRhY2hlZAorICoJQGNtZDogU0NTSSBjb21tYW5kIHRoYXQgb3JpZ2luYXRlZCB0aGlzIEFUQSBjb21tYW5kCisgKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rpb24KKyAqCisgKglPYnRhaW4gYSByZWZlcmVuY2UgdG8gYW4gdW51c2VkIGF0YV9xdWV1ZWRfY21kIHN0cnVjdHVyZSwKKyAqCXdoaWNoIGlzIHRoZSBiYXNpYyBsaWJhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNpbmdsZQorICoJQVRBIGNvbW1hbmQgc2VudCB0byB0aGUgaGFyZHdhcmUuCisgKgorICoJSWYgYSBjb21tYW5kIHdhcyBhdmFpbGFibGUsIGZpbGwgaW4gdGhlIFNDU0ktc3BlY2lmaWMKKyAqCXBvcnRpb25zIG9mIHRoZSBzdHJ1Y3R1cmUgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGUKKyAqCWN1cnJlbnQgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJQ29tbWFuZCBhbGxvY2F0ZWQsIG9yICVOVUxMIGlmIG5vbmUgYXZhaWxhYmxlLgorICovCitzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9zY3NpX3FjX25ldyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCSAgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJICAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisKKwlxYyA9IGF0YV9xY19uZXdfaW5pdChhcCwgZGV2KTsKKwlpZiAocWMpIHsKKwkJcWMtPnNjc2ljbWQgPSBjbWQ7CisJCXFjLT5zY3NpZG9uZSA9IGRvbmU7CisKKwkJaWYgKGNtZC0+dXNlX3NnKSB7CisJCQlxYy0+c2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCQlxYy0+bl9lbGVtID0gY21kLT51c2Vfc2c7CisJCX0gZWxzZSB7CisJCQlxYy0+c2cgPSAmcWMtPnNnZW50OworCQkJcWMtPm5fZWxlbSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKFFVRVVFX0ZVTEwgPDwgMSk7CisJCWRvbmUoY21kKTsKKwl9CisKKwlyZXR1cm4gcWM7Cit9CisKKy8qKgorICoJYXRhX3RvX3NlbnNlX2Vycm9yIC0gY29udmVydCBBVEEgZXJyb3IgdG8gU0NTSSBlcnJvcgorICoJQHFjOiBDb21tYW5kIHRoYXQgd2UgYXJlIGVycm9yaW5nIG91dAorICoJQGRydl9zdGF0OiB2YWx1ZSBjb250YWluZWQgaW4gQVRBIHN0YXR1cyByZWdpc3RlcgorICoKKyAqCUNvbnZlcnRzIGFuIEFUQSBlcnJvciBpbnRvIGEgU0NTSSBlcnJvci4gV2hpbGUgd2UgYXJlIGF0IGl0CisgKgl3ZSBkZWNvZGUgYW5kIGR1bXAgdGhlIEFUQSBlcnJvciBmb3IgdGhlIHVzZXIgc28gdGhhdCB0aGV5CisgKgloYXZlIHNvbWUgaWRlYSB3aGF0IHJlYWxseSBoYXBwZW5lZCBhdCB0aGUgbm9uIG1ha2UtYmVsaWV2ZQorICoJbGF5ZXIuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordm9pZCBhdGFfdG9fc2Vuc2VfZXJyb3Ioc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggZHJ2X3N0YXQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CisJdTggZXJyID0gMDsKKwl1bnNpZ25lZCBjaGFyICpzYiA9IGNtZC0+c2Vuc2VfYnVmZmVyOworCS8qIEJhc2VkIG9uIHRoZSAzd2FyZSBkcml2ZXIgdHJhbnNsYXRpb24gdGFibGUgKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzZW5zZV90YWJsZVtdWzRdID0geworCQkvKiBCQkR8RUNDfElEfE1BUiAqLworCQl7MHhkMSwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4MDAsIDB4MDB9LCAJLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKKwkJLyogQkJEfEVDQ3xJRCAqLworCQl7MHhkMCwgIAlBQk9SVEVEX0NPTU1BTkQsIDB4MDAsIDB4MDB9LCAJLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKKwkJLyogRUNDfE1DfE1BUksgKi8KKwkJezB4NjEsIAkJSEFSRFdBUkVfRVJST1IsIDB4MDAsIDB4MDB9LCAJLy8gRGV2aWNlIGZhdWx0ICAgICAgICAgICAgICAgICBIYXJkd2FyZSBlcnJvcgorCQkvKiBJQ1JDfEFCUlQgKi8JCS8qIE5COiBJQ1JDICYgIUFCUlQgaXMgQkJEICovCisJCXsweDg0LCAJCUFCT1JURURfQ09NTUFORCwgMHg0NywgMHgwMH0sIAkvLyBEYXRhIENSQyBlcnJvciAgICAgICAgICAgICAgIFNDU0kgcGFyaXR5IGVycm9yCisJCS8qIE1DfElEfEFCUlR8VFJLMHxNQVJLICovCisJCXsweDM3LCAJCU5PVF9SRUFEWSwgMHgwNCwgMHgwMH0sIAkvLyBVbml0IG9mZmxpbmUgICAgICAgICAgICAgICAgIE5vdCByZWFkeQorCQkvKiBNQ1J8TUFSSyAqLworCQl7MHgwOSwgCQlOT1RfUkVBRFksIDB4MDQsIDB4MDB9LCAJLy8gVW5yZWNvdmVyZWQgZGlzayBlcnJvciAgICAgICBOb3QgcmVhZHkKKwkJLyogIEJhZCBhZGRyZXNzIG1hcmsgKi8KKwkJezB4MDEsIAkJTUVESVVNX0VSUk9SLCAweDEzLCAweDAwfSwgCS8vIEFkZHJlc3MgbWFyayBub3QgZm91bmQgICAgICAgQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCBmb3IgZGF0YSBmaWVsZAorCQkvKiBUUkswICovCisJCXsweDAyLCAJCUhBUkRXQVJFX0VSUk9SLCAweDAwLCAweDAwfSwgCS8vIFRyYWNrIDAgbm90IGZvdW5kCQkgIEhhcmR3YXJlIGVycm9yCisJCS8qIEFib3J0ICYgIUlDUkMgKi8KKwkJezB4MDQsIAkJQUJPUlRFRF9DT01NQU5ELCAweDAwLCAweDAwfSwgCS8vIEFib3J0ZWQgY29tbWFuZCAgICAgICAgICAgICAgQWJvcnRlZCBjb21tYW5kCisJCS8qIE1lZGlhIGNoYW5nZSByZXF1ZXN0ICovCisJCXsweDA4LCAJCU5PVF9SRUFEWSwgMHgwNCwgMHgwMH0sIAkvLyBNZWRpYSBjaGFuZ2UgcmVxdWVzdAkgIEZJWE1FOiBmYWtpbmcgb2ZmbGluZQorCQkvKiBTUlYgKi8KKwkJezB4MTAsIAkJQUJPUlRFRF9DT01NQU5ELCAweDE0LCAweDAwfSwgCS8vIElEIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgUmVjb3JkZWQgZW50aXR5IG5vdCBmb3VuZAorCQkvKiBNZWRpYSBjaGFuZ2UgKi8KKwkJezB4MDgsICAJTk9UX1JFQURZLCAweDA0LCAweDAwfSwgCS8vIE1lZGlhIGNoYW5nZQkJICBGSVhNRTogZmFraW5nIG9mZmxpbmUKKwkJLyogRUNDICovCisJCXsweDQwLCAJCU1FRElVTV9FUlJPUiwgMHgxMSwgMHgwNH0sIAkvLyBVbmNvcnJlY3RhYmxlIEVDQyBlcnJvciAgICAgIFVucmVjb3ZlcmVkIHJlYWQgZXJyb3IKKwkJLyogQkJEIC0gYmxvY2sgbWFya2VkIGJhZCAqLworCQl7MHg4MCwgCQlNRURJVU1fRVJST1IsIDB4MTEsIDB4MDR9LCAJLy8gQmxvY2sgbWFya2VkIGJhZAkJICBNZWRpdW0gZXJyb3IsIHVucmVjb3ZlcmVkIHJlYWQgZXJyb3IKKwkJezB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9LCAvLyBFTkQgbWFyaworCX07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RhdF90YWJsZVtdWzRdID0geworCQkvKiBNdXN0IGJlIGZpcnN0IGJlY2F1c2UgQlVTWSBtZWFucyBubyBvdGhlciBiaXRzIHZhbGlkICovCisJCXsweDgwLCAJCUFCT1JURURfQ09NTUFORCwgMHg0NywgMHgwMH0sCS8vIEJ1c3ksIGZha2UgcGFyaXR5IGZvciBub3cKKwkJezB4MjAsIAkJSEFSRFdBUkVfRVJST1IsICAweDAwLCAweDAwfSwgCS8vIERldmljZSBmYXVsdAorCQl7MHgwOCwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LAkvLyBUaW1lZCBvdXQgaW4geGZlciwgZmFrZSBwYXJpdHkgZm9yIG5vdworCQl7MHgwNCwgCQlSRUNPVkVSRURfRVJST1IsIDB4MTEsIDB4MDB9LAkvLyBSZWNvdmVyZWQgRUNDIGVycm9yCSAgTWVkaXVtIGVycm9yLCByZWNvdmVyZWQKKwkJezB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9LCAvLyBFTkQgbWFyaworCX07CisJaW50IGkgPSAwOworCisJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisKKwkvKgorCSAqCUlzIHRoaXMgYW4gZXJyb3Igd2UgY2FuIHByb2Nlc3MvcGFyc2UKKwkgKi8KKworCWlmKGRydl9zdGF0ICYgQVRBX0VSUikKKwkJLyogUmVhZCB0aGUgZXJyIGJpdHMgKi8KKwkJZXJyID0gYXRhX2Noa19lcnIocWMtPmFwKTsKKworCS8qIERpc3BsYXkgdGhlIEFUQSBsZXZlbCBlcnJvciBpbmZvICovCisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogc3RhdHVzPTB4JTAyeCB7ICIsIHFjLT5hcC0+aWQsIGRydl9zdGF0KTsKKwlpZihkcnZfc3RhdCAmIDB4ODApCisJeworCQlwcmludGsoIkJ1c3kgIik7CisJCWVyciA9IDA7CS8qIERhdGEgaXMgbm90IHZhbGlkIGluIHRoaXMgY2FzZSAqLworCX0KKwllbHNlIHsKKwkJaWYoZHJ2X3N0YXQgJiAweDQwKQlwcmludGsoIkRyaXZlUmVhZHkgIik7CisJCWlmKGRydl9zdGF0ICYgMHgyMCkJcHJpbnRrKCJEZXZpY2VGYXVsdCAiKTsKKwkJaWYoZHJ2X3N0YXQgJiAweDEwKQlwcmludGsoIlNlZWtDb21wbGV0ZSAiKTsKKwkJaWYoZHJ2X3N0YXQgJiAweDA4KQlwcmludGsoIkRhdGFSZXF1ZXN0ICIpOworCQlpZihkcnZfc3RhdCAmIDB4MDQpCXByaW50aygiQ29ycmVjdGVkRXJyb3IgIik7CisJCWlmKGRydl9zdGF0ICYgMHgwMikJcHJpbnRrKCJJbmRleCAiKTsKKwkJaWYoZHJ2X3N0YXQgJiAweDAxKQlwcmludGsoIkVycm9yICIpOworCX0KKwlwcmludGsoIn1cbiIpOworCisJaWYoZXJyKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IGVycm9yPTB4JTAyeCB7ICIsIHFjLT5hcC0+aWQsIGVycik7CisJCWlmKGVyciAmIDB4MDQpCQlwcmludGsoIkRyaXZlU3RhdHVzRXJyb3IgIik7CisJCWlmKGVyciAmIDB4ODApCisJCXsKKwkJCWlmKGVyciAmIDB4MDQpCisJCQkJcHJpbnRrKCJCYWRDUkMgIik7CisJCQllbHNlCisJCQkJcHJpbnRrKCJTZWN0b3IgIik7CisJCX0KKwkJaWYoZXJyICYgMHg0MCkJCXByaW50aygiVW5jb3JyZWN0YWJsZUVycm9yICIpOworCQlpZihlcnIgJiAweDEwKQkJcHJpbnRrKCJTZWN0b3JJZE5vdEZvdW5kICIpOworCQlpZihlcnIgJiAweDAyKQkJcHJpbnRrKCJUcmFja1plcm9Ob3RGb3VuZCAiKTsKKwkJaWYoZXJyICYgMHgwMSkJCXByaW50aygiQWRkck1hcmtOb3RGb3VuZCAiKTsKKwkJcHJpbnRrKCJ9XG4iKTsKKworCQkvKiBTaG91bGQgd2UgZHVtcCBzZWN0b3IgaW5mbyBoZXJlIHRvbyA/PyAqLworCX0KKworCisJLyogTG9vayBmb3IgZXJyICovCisJd2hpbGUoc2Vuc2VfdGFibGVbaV1bMF0gIT0gMHhGRikKKwl7CisJCS8qIExvb2sgZm9yIGJlc3QgbWF0Y2hlcyBmaXJzdCAqLworCQlpZigoc2Vuc2VfdGFibGVbaV1bMF0gJiBlcnIpID09IHNlbnNlX3RhYmxlW2ldWzBdKQorCQl7CisJCQlzYlswXSA9IDB4NzA7CisJCQlzYlsyXSA9IHNlbnNlX3RhYmxlW2ldWzFdOworCQkJc2JbN10gPSAweDBhOworCQkJc2JbMTJdID0gc2Vuc2VfdGFibGVbaV1bMl07CisJCQlzYlsxM10gPSBzZW5zZV90YWJsZVtpXVszXTsKKwkJCXJldHVybjsKKwkJfQorCQlpKys7CisJfQorCS8qIE5vIGltbWVkaWF0ZSBtYXRjaCAqLworCWlmKGVycikKKwkJcHJpbnRrKEtFUk5fREVCVUcgImF0YSV1OiBubyBzZW5zZSB0cmFuc2xhdGlvbiBmb3IgMHglMDJ4XG4iLCBxYy0+YXAtPmlkLCBlcnIpOworCisJaSA9IDA7CisJLyogRmFsbCBiYWNrIHRvIGludGVycHJldGluZyBzdGF0dXMgYml0cyAqLworCXdoaWxlKHN0YXRfdGFibGVbaV1bMF0gIT0gMHhGRikKKwl7CisJCWlmKHN0YXRfdGFibGVbaV1bMF0gJiBkcnZfc3RhdCkKKwkJeworCQkJc2JbMF0gPSAweDcwOworCQkJc2JbMl0gPSBzdGF0X3RhYmxlW2ldWzFdOworCQkJc2JbN10gPSAweDBhOworCQkJc2JbMTJdID0gc3RhdF90YWJsZVtpXVsyXTsKKwkJCXNiWzEzXSA9IHN0YXRfdGFibGVbaV1bM107CisJCQlyZXR1cm47CisJCX0KKwkJaSsrOworCX0KKwkvKiBObyBlcnJvciA/PyAqLworCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IGNhbGxlZCB3aXRoIG5vIGVycm9yICglMDJYKSFcbiIsIHFjLT5hcC0+aWQsIGRydl9zdGF0KTsKKwkvKiBhZGRpdGlvbmFsLXNlbnNlLWNvZGVbLXF1YWxpZmllcl0gKi8KKworCXNiWzBdID0gMHg3MDsKKwlzYlsyXSA9IE1FRElVTV9FUlJPUjsKKwlzYls3XSA9IDB4MEE7CisJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gU0NTSV9EQVRBX1JFQUQpIHsKKwkJc2JbMTJdID0gMHgxMTsgLyogInVucmVjb3ZlcmVkIHJlYWQgZXJyb3IiICovCisJCXNiWzEzXSA9IDB4MDQ7CisJfSBlbHNlIHsKKwkJc2JbMTJdID0gMHgwQzsgLyogIndyaXRlIGVycm9yIC0gICAgICAgICAgICAgKi8KKwkJc2JbMTNdID0gMHgwMjsgLyogIGF1dG8tcmVhbGxvY2F0aW9uIGZhaWxlZCIgKi8KKwl9Cit9CisKKy8qKgorICoJYXRhX3Njc2lfc2xhdmVfY29uZmlnIC0gU2V0IFNDU0kgZGV2aWNlIGF0dHJpYnV0ZXMKKyAqCUBzZGV2OiBTQ1NJIGRldmljZSB0byBleGFtaW5lCisgKgorICoJVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHdlIGFjdHVhbGx5IHN0YXJ0IHJlYWRpbmcKKyAqCWFuZCB3cml0aW5nIHRvIHRoZSBkZXZpY2UsIHRvIGNvbmZpZ3VyZSBjZXJ0YWluCisgKglTQ1NJIG1pZC1sYXllciBiZWhhdmlvcnMuCisgKgorICoJTE9DS0lORzoKKyAqCURlZmluZWQgYnkgU0NTSSBsYXllci4gIFdlIGRvbid0IHJlYWxseSBjYXJlLgorICovCisKK2ludCBhdGFfc2NzaV9zbGF2ZV9jb25maWcoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXNkZXYtPnVzZV8xMF9mb3JfcncgPSAxOworCXNkZXYtPnVzZV8xMF9mb3JfbXMgPSAxOworCisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHNkZXYtPnJlcXVlc3RfcXVldWUsIExJQkFUQV9NQVhfUFJEKTsKKworCWlmIChzZGV2LT5pZCA8IEFUQV9NQVhfREVWSUNFUykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCisJCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF07CisJCWRldiA9ICZhcC0+ZGV2aWNlW3NkZXYtPmlkXTsKKworCQkvKiBUT0RPOiAxMDI0IGlzIGFuIGFyYml0cmFyeSBudW1iZXIsIG5vdCB0aGUKKwkJICogaGFyZHdhcmUgbWF4aW11bS4gIFRoaXMgc2hvdWxkIGJlIGluY3JlYXNlZCB0bworCQkgKiA2NTUzNCB3aGVuIEplbnMgQXhib2UncyBwYXRjaCBmb3IgZHluYW1pY2FsbHkKKwkJICogZGV0ZXJtaW5pbmcgbWF4X3NlY3RvcnMgaXMgbWVyZ2VkLgorCQkgKi8KKwkJaWYgKChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4KSAmJgorCQkgICAgKChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xPQ0tfU0VDVE9SUykgPT0gMCkpIHsKKwkJCXNkZXYtPmhvc3QtPm1heF9zZWN0b3JzID0gMjA0ODsKKwkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAyMDQ4KTsKKwkJfQorCX0KKworCXJldHVybiAwOwkvKiBzY3NpIGxheWVyIGRvZXNuJ3QgY2hlY2sgcmV0dXJuIHZhbHVlLCBzaWdoICovCit9CisKKy8qKgorICoJYXRhX3Njc2lfZXJyb3IgLSBTQ1NJIGxheWVyIGVycm9yIGhhbmRsZXIgY2FsbGJhY2sKKyAqCUBob3N0OiBTQ1NJIGhvc3Qgb24gd2hpY2ggZXJyb3Igb2NjdXJyZWQKKyAqCisgKglIYW5kbGVzIFNDU0ktbGF5ZXItdGhyb3duIGVycm9yIGV2ZW50cy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gU0NTSSBsYXllciAobm9uZSwgY2FuIHNsZWVwKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvLgorICovCisKK2ludCBhdGFfc2NzaV9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJmhvc3QtPmhvc3RkYXRhWzBdOworCWFwLT5vcHMtPmVuZ190aW1lb3V0KGFwKTsKKworCS8qIFRPRE86IHRoaXMgaXMgcGVyLWNvbW1hbmQ7IHdoZW4gcXVldWVpbmcgaXMgc3VwcG9ydGVkCisJICogdGhpcyBjb2RlIHdpbGwgZWl0aGVyIGNoYW5nZSBvciBtb3ZlIHRvIGEgbW9yZQorCSAqIGFwcHJvcHJpYXRlIHBsYWNlCisJICovCisJaG9zdC0+aG9zdF9mYWlsZWQtLTsKKworCURQUklOVEsoIkVYSVRcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX2ZsdXNoX3hsYXQgLSBUcmFuc2xhdGUgU0NTSSBTWU5DSFJPTklaRSBDQUNIRSBjb21tYW5kCisgKglAcWM6IFN0b3JhZ2UgZm9yIHRyYW5zbGF0ZWQgQVRBIHRhc2tmaWxlCisgKglAc2NzaWNtZDogU0NTSSBjb21tYW5kIHRvIHRyYW5zbGF0ZSAoaWdub3JlZCkKKyAqCisgKglTZXRzIHVwIGFuIEFUQSB0YXNrZmlsZSB0byBpc3N1ZSBGTFVTSCBDQUNIRSBvcgorICoJRkxVU0ggQ0FDSEUgRVhULgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3Njc2lfZmx1c2hfeGxhdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCAqc2NzaWNtZCkKK3sKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiA9ICZxYy0+dGY7CisKKwl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi0+cHJvdG9jb2wgPSBBVEFfUFJPVF9OT0RBVEE7CisKKwlpZiAoKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkgJiYKKwkgICAgKGF0YV9pZF9oYXNfZmx1c2hfZXh0KHFjLT5kZXYtPmlkKSkpCisJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9GTFVTSF9FWFQ7CisJZWxzZQorCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRkxVU0g7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaV92ZXJpZnlfeGxhdCAtIFRyYW5zbGF0ZSBTQ1NJIFZFUklGWSBjb21tYW5kIGludG8gYW4gQVRBIG9uZQorICoJQHFjOiBTdG9yYWdlIGZvciB0cmFuc2xhdGVkIEFUQSB0YXNrZmlsZQorICoJQHNjc2ljbWQ6IFNDU0kgY29tbWFuZCB0byB0cmFuc2xhdGUKKyAqCisgKglDb252ZXJ0cyBTQ1NJIFZFUklGWSBjb21tYW5kIHRvIGFuIEFUQSBSRUFEIFZFUklGWSBjb21tYW5kLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX3Njc2lfdmVyaWZ5X3hsYXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpCit7CisJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnRmOworCXVuc2lnbmVkIGludCBsYmE0OCA9IHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0ODsKKwl1NjQgZGV2X3NlY3RvcnMgPSBxYy0+ZGV2LT5uX3NlY3RvcnM7CisJdTY0IHNlY3QgPSAwOworCXUzMiBuX3NlY3QgPSAwOworCisJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19JU0FERFIgfCBBVEFfVEZMQUdfREVWSUNFOworCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKKwl0Zi0+ZGV2aWNlIHw9IEFUQV9MQkE7CisKKwlpZiAoc2NzaWNtZFswXSA9PSBWRVJJRlkpIHsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzJdKSA8PCAyNDsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzNdKSA8PCAxNjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzRdKSA8PCA4OworCQlzZWN0IHw9ICgodTY0KXNjc2ljbWRbNV0pOworCisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21kWzddKSA8PCA4OworCQluX3NlY3QgfD0gKCh1MzIpc2NzaWNtZFs4XSk7CisJfQorCisJZWxzZSBpZiAoc2NzaWNtZFswXSA9PSBWRVJJRllfMTYpIHsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzJdKSA8PCA1NjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzNdKSA8PCA0ODsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzRdKSA8PCA0MDsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzVdKSA8PCAzMjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzZdKSA8PCAyNDsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzddKSA8PCAxNjsKKwkJc2VjdCB8PSAoKHU2NClzY3NpY21kWzhdKSA8PCA4OworCQlzZWN0IHw9ICgodTY0KXNjc2ljbWRbOV0pOworCisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21kWzEwXSkgPDwgMjQ7CisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21kWzExXSkgPDwgMTY7CisJCW5fc2VjdCB8PSAoKHUzMilzY3NpY21kWzEyXSkgPDwgODsKKwkJbl9zZWN0IHw9ICgodTMyKXNjc2ljbWRbMTNdKTsKKwl9CisKKwllbHNlCisJCXJldHVybiAxOworCisJaWYgKCFuX3NlY3QpCisJCXJldHVybiAxOworCWlmIChzZWN0ID49IGRldl9zZWN0b3JzKQorCQlyZXR1cm4gMTsKKwlpZiAoKHNlY3QgKyBuX3NlY3QpID4gZGV2X3NlY3RvcnMpCisJCXJldHVybiAxOworCWlmIChsYmE0OCkgeworCQlpZiAobl9zZWN0ID4gKDY0ICogMTAyNCkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAobl9zZWN0ID4gMjU2KQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKGxiYTQ4KSB7CisJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9WRVJJRllfRVhUOworCisJCXRmLT5ob2JfbnNlY3QgPSAobl9zZWN0ID4+IDgpICYgMHhmZjsKKworCQl0Zi0+aG9iX2xiYWggPSAoc2VjdCA+PiA0MCkgJiAweGZmOworCQl0Zi0+aG9iX2xiYW0gPSAoc2VjdCA+PiAzMikgJiAweGZmOworCQl0Zi0+aG9iX2xiYWwgPSAoc2VjdCA+PiAyNCkgJiAweGZmOworCX0gZWxzZSB7CisJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9WRVJJRlk7CisKKwkJdGYtPmRldmljZSB8PSAoc2VjdCA+PiAyNCkgJiAweGY7CisJfQorCisJdGYtPm5zZWN0ID0gbl9zZWN0ICYgMHhmZjsKKworCXRmLT5sYmFoID0gKHNlY3QgPj4gMTYpICYgMHhmZjsKKwl0Zi0+bGJhbSA9IChzZWN0ID4+IDgpICYgMHhmZjsKKwl0Zi0+bGJhbCA9IHNlY3QgJiAweGZmOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfcndfeGxhdCAtIFRyYW5zbGF0ZSBTQ1NJIHIvdyBjb21tYW5kIGludG8gYW4gQVRBIG9uZQorICoJQHFjOiBTdG9yYWdlIGZvciB0cmFuc2xhdGVkIEFUQSB0YXNrZmlsZQorICoJQHNjc2ljbWQ6IFNDU0kgY29tbWFuZCB0byB0cmFuc2xhdGUKKyAqCisgKglDb252ZXJ0cyBhbnkgb2Ygc2l4IFNDU0kgcmVhZC93cml0ZSBjb21tYW5kcyBpbnRvIHRoZQorICoJQVRBIGNvdW50ZXJwYXJ0LCBpbmNsdWRpbmcgc3RhcnRpbmcgc2VjdG9yIChMQkEpLAorICoJc2VjdG9yIGNvdW50LCBhbmQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgZGV2aWNlJ3MgTEJBNDgKKyAqCXN1cHBvcnQuCisgKgorICoJQ29tbWFuZHMgJVJFQURfNiwgJVJFQURfMTAsICVSRUFEXzE2LCAlV1JJVEVfNiwgJVdSSVRFXzEwLCBhbmQKKyAqCSVXUklURV8xNiBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJWmVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9zY3NpX3J3X3hsYXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpCit7CisJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnRmOworCXVuc2lnbmVkIGludCBsYmE0OCA9IHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0ODsKKworCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi0+cHJvdG9jb2wgPSBxYy0+ZGV2LT54ZmVyX3Byb3RvY29sOworCXRmLT5kZXZpY2UgfD0gQVRBX0xCQTsKKworCWlmIChzY3NpY21kWzBdID09IFJFQURfMTAgfHwgc2NzaWNtZFswXSA9PSBSRUFEXzYgfHwKKwkgICAgc2NzaWNtZFswXSA9PSBSRUFEXzE2KSB7CisJCXRmLT5jb21tYW5kID0gcWMtPmRldi0+cmVhZF9jbWQ7CisJfSBlbHNlIHsKKwkJdGYtPmNvbW1hbmQgPSBxYy0+ZGV2LT53cml0ZV9jbWQ7CisJCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfV1JJVEU7CisJfQorCisJaWYgKHNjc2ljbWRbMF0gPT0gUkVBRF8xMCB8fCBzY3NpY21kWzBdID09IFdSSVRFXzEwKSB7CisJCWlmIChsYmE0OCkgeworCQkJdGYtPmhvYl9uc2VjdCA9IHNjc2ljbWRbN107CisJCQl0Zi0+aG9iX2xiYWwgPSBzY3NpY21kWzJdOworCisJCQlxYy0+bnNlY3QgPSAoKHVuc2lnbmVkIGludClzY3NpY21kWzddIDw8IDgpIHwKKwkJCQkJc2NzaWNtZFs4XTsKKwkJfSBlbHNlIHsKKwkJCS8qIGlmIHdlIGRvbid0IHN1cHBvcnQgTEJBNDggYWRkcmVzc2luZywgdGhlIHJlcXVlc3QKKwkJCSAqIC1tYXktIGJlIHRvbyBsYXJnZS4gKi8KKwkJCWlmICgoc2NzaWNtZFsyXSAmIDB4ZjApIHx8IHNjc2ljbWRbN10pCisJCQkJcmV0dXJuIDE7CisKKwkJCS8qIHN0b3JlcyBMQkEyNzoyNCBpbiBsb3dlciA0IGJpdHMgb2YgZGV2aWNlIHJlZyAqLworCQkJdGYtPmRldmljZSB8PSBzY3NpY21kWzJdOworCisJCQlxYy0+bnNlY3QgPSBzY3NpY21kWzhdOworCQl9CisKKwkJdGYtPm5zZWN0ID0gc2NzaWNtZFs4XTsKKwkJdGYtPmxiYWwgPSBzY3NpY21kWzVdOworCQl0Zi0+bGJhbSA9IHNjc2ljbWRbNF07CisJCXRmLT5sYmFoID0gc2NzaWNtZFszXTsKKworCQlWUFJJTlRLKCJ0ZW4tYnl0ZSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNjc2ljbWRbMF0gPT0gUkVBRF82IHx8IHNjc2ljbWRbMF0gPT0gV1JJVEVfNikgeworCQlxYy0+bnNlY3QgPSB0Zi0+bnNlY3QgPSBzY3NpY21kWzRdOworCQl0Zi0+bGJhbCA9IHNjc2ljbWRbM107CisJCXRmLT5sYmFtID0gc2NzaWNtZFsyXTsKKwkJdGYtPmxiYWggPSBzY3NpY21kWzFdICYgMHgxZjsgLyogbWFzayBvdXQgcmVzZXJ2ZWQgYml0cyAqLworCisJCVZQUklOVEsoInNpeC1ieXRlIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2NzaWNtZFswXSA9PSBSRUFEXzE2IHx8IHNjc2ljbWRbMF0gPT0gV1JJVEVfMTYpIHsKKwkJLyogcnVsZSBvdXQgaW1wb3NzaWJsZSBMQkFzIGFuZCBzZWN0b3IgY291bnRzICovCisJCWlmIChzY3NpY21kWzJdIHx8IHNjc2ljbWRbM10gfHwgc2NzaWNtZFsxMF0gfHwgc2NzaWNtZFsxMV0pCisJCQlyZXR1cm4gMTsKKworCQlpZiAobGJhNDgpIHsKKwkJCXRmLT5ob2JfbnNlY3QgPSBzY3NpY21kWzEyXTsKKwkJCXRmLT5ob2JfbGJhbCA9IHNjc2ljbWRbNl07CisJCQl0Zi0+aG9iX2xiYW0gPSBzY3NpY21kWzVdOworCQkJdGYtPmhvYl9sYmFoID0gc2NzaWNtZFs0XTsKKworCQkJcWMtPm5zZWN0ID0gKCh1bnNpZ25lZCBpbnQpc2NzaWNtZFsxMl0gPDwgOCkgfAorCQkJCQlzY3NpY21kWzEzXTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uY2UgYWdhaW4sIGZpbHRlciBvdXQgaW1wb3NzaWJsZSBub24temVybyB2YWx1ZXMgKi8KKwkJCWlmIChzY3NpY21kWzRdIHx8IHNjc2ljbWRbNV0gfHwgc2NzaWNtZFsxMl0gfHwKKwkJCSAgICAoc2NzaWNtZFs2XSAmIDB4ZjApKQorCQkJCXJldHVybiAxOworCisJCQkvKiBzdG9yZXMgTEJBMjc6MjQgaW4gbG93ZXIgNCBiaXRzIG9mIGRldmljZSByZWcgKi8KKwkJCXRmLT5kZXZpY2UgfD0gc2NzaWNtZFs2XTsKKworCQkJcWMtPm5zZWN0ID0gc2NzaWNtZFsxM107CisJCX0KKworCQl0Zi0+bnNlY3QgPSBzY3NpY21kWzEzXTsKKwkJdGYtPmxiYWwgPSBzY3NpY21kWzldOworCQl0Zi0+bGJhbSA9IHNjc2ljbWRbOF07CisJCXRmLT5sYmFoID0gc2NzaWNtZFs3XTsKKworCQlWUFJJTlRLKCJzaXh0ZWVuLWJ5dGUgY29tbWFuZFxuIik7CisJCXJldHVybiAwOworCX0KKworCURQUklOVEsoIm5vLWJ5dGUgY29tbWFuZFxuIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYXRhX3Njc2lfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggZHJ2X3N0YXQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CisKKwlpZiAodW5saWtlbHkoZHJ2X3N0YXQgJiAoQVRBX0VSUiB8IEFUQV9CVVNZIHwgQVRBX0RSUSkpKQorCQlhdGFfdG9fc2Vuc2VfZXJyb3IocWMsIGRydl9zdGF0KTsKKwllbHNlCisJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKKworCXFjLT5zY3NpZG9uZShjbWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfdHJhbnNsYXRlIC0gVHJhbnNsYXRlIHRoZW4gaXNzdWUgU0NTSSBjb21tYW5kIHRvIEFUQSBkZXZpY2UKKyAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgYWRkcmVzc2VkCisgKglAZGV2OiBBVEEgZGV2aWNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGFkZHJlc3NlZAorICoJQGNtZDogU0NTSSBjb21tYW5kIHRvIGV4ZWN1dGUKKyAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbgorICoJQHhsYXRfZnVuYzogQWN0b3Igd2hpY2ggdHJhbnNsYXRlcyBAY21kIHRvIGFuIEFUQSB0YXNrZmlsZQorICoKKyAqCU91ciAtPnF1ZXVlY29tbWFuZCgpIGZ1bmN0aW9uIGhhcyBkZWNpZGVkIHRoYXQgdGhlIFNDU0kKKyAqCWNvbW1hbmQgaXNzdWVkIGNhbiBiZSBkaXJlY3RseSB0cmFuc2xhdGVkIGludG8gYW4gQVRBCisgKgljb21tYW5kLCByYXRoZXIgdGhhbiBoYW5kbGVkIGludGVybmFsbHkuCisgKgorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFuIGF0YV9xdWV1ZWRfY21kIHN0cnVjdHVyZSBmb3IgdGhlCisgKglTQ1NJIGNvbW1hbmQsIGFuZCBzZW5kcyB0aGF0IGF0YV9xdWV1ZWRfY21kIHRvIHRoZSBoYXJkd2FyZS4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCitzdGF0aWMgdm9pZCBhdGFfc2NzaV90cmFuc2xhdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAorCQkJICAgICAgYXRhX3hsYXRfZnVuY190IHhsYXRfZnVuYykKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXU4ICpzY3NpY21kID0gY21kLT5jbW5kOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJcWMgPSBhdGFfc2NzaV9xY19uZXcoYXAsIGRldiwgY21kLCBkb25lKTsKKwlpZiAoIXFjKQorCQlyZXR1cm47CisKKwkvKiBkYXRhIGlzIHByZXNlbnQ7IGRtYS1tYXAgaXQgKi8KKwlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBTQ1NJX0RBVEFfUkVBRCB8fAorCSAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IFNDU0lfREFUQV9XUklURSkgeworCQlpZiAodW5saWtlbHkoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPCAxKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXUoJXUpOiBXQVJOSU5HOiB6ZXJvIGxlbiByL3cgcmVxXG4iLAorCQkJICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubyk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQlpZiAoY21kLT51c2Vfc2cpCisJCQlhdGFfc2dfaW5pdChxYywgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT51c2Vfc2cpOworCQllbHNlCisJCQlhdGFfc2dfaW5pdF9vbmUocWMsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKworCQlxYy0+ZG1hX2RpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisJfQorCisJcWMtPmNvbXBsZXRlX2ZuID0gYXRhX3Njc2lfcWNfY29tcGxldGU7CisKKwlpZiAoeGxhdF9mdW5jKHFjLCBzY3NpY21kKSkKKwkJZ290byBlcnJfb3V0OworCisJLyogc2VsZWN0IGRldmljZSwgc2VuZCBjb21tYW5kIHRvIGhhcmR3YXJlICovCisJaWYgKGF0YV9xY19pc3N1ZShxYykpCisJCWdvdG8gZXJyX291dDsKKworCVZQUklOVEsoIkVYSVRcbiIpOworCXJldHVybjsKKworZXJyX291dDoKKwlhdGFfcWNfZnJlZShxYyk7CisJYXRhX2JhZF9jZGIoY21kLCBkb25lKTsKKwlEUFJJTlRLKCJFWElUIC0gYmFkY21kXG4iKTsKK30KKworLyoqCisgKglhdGFfc2NzaV9yYnVmX2dldCAtIE1hcCByZXNwb25zZSBidWZmZXIuCisgKglAY21kOiBTQ1NJIGNvbW1hbmQgY29udGFpbmluZyBidWZmZXIgdG8gYmUgbWFwcGVkLgorICoJQGJ1Zl9vdXQ6IFBvaW50ZXIgdG8gbWFwcGVkIGFyZWEuCisgKgorICoJTWFwcyBidWZmZXIgY29udGFpbmVkIHdpdGhpbiBTQ1NJIGNvbW1hbmQgQGNtZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJTGVuZ3RoIG9mIHJlc3BvbnNlIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9zY3NpX3JidWZfZ2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdTggKipidWZfb3V0KQoreworCXU4ICpidWY7CisJdW5zaWduZWQgaW50IGJ1ZmxlbjsKKworCWlmIChjbWQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlidWYgPSBrbWFwX2F0b21pYyhzZy0+cGFnZSwgS01fVVNFUjApICsgc2ctPm9mZnNldDsKKwkJYnVmbGVuID0gc2ctPmxlbmd0aDsKKwl9IGVsc2UgeworCQlidWYgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlidWZsZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwl9CisKKwkqYnVmX291dCA9IGJ1ZjsKKwlyZXR1cm4gYnVmbGVuOworfQorCisvKioKKyAqCWF0YV9zY3NpX3JidWZfcHV0IC0gVW5tYXAgcmVzcG9uc2UgYnVmZmVyLgorICoJQGNtZDogU0NTSSBjb21tYW5kIGNvbnRhaW5pbmcgYnVmZmVyIHRvIGJlIHVubWFwcGVkLgorICoJQGJ1ZjogYnVmZmVyIHRvIHVubWFwCisgKgorICoJVW5tYXBzIHJlc3BvbnNlIGJ1ZmZlciBjb250YWluZWQgd2l0aGluIEBjbWQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0YV9zY3NpX3JidWZfcHV0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdTggKmJ1ZikKK3sKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJa3VubWFwX2F0b21pYyhidWYgLSBzZy0+b2Zmc2V0LCBLTV9VU0VSMCk7CisJfQorfQorCisvKioKKyAqCWF0YV9zY3NpX3JidWZfZmlsbCAtIHdyYXBwZXIgZm9yIFNDU0kgY29tbWFuZCBzaW11bGF0b3JzCisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAYWN0b3I6IENhbGxiYWNrIGhvb2sgZm9yIGRlc2lyZWQgU0NTSSBjb21tYW5kIHNpbXVsYXRvcgorICoKKyAqCVRha2VzIGNhcmUgb2YgdGhlIGhhcmQgd29yayBvZiBzaW11bGF0aW5nIGEgU0NTSSBjb21tYW5kLi4uCisgKglNYXBwaW5nIHRoZSByZXNwb25zZSBidWZmZXIsIGNhbGxpbmcgdGhlIGNvbW1hbmQncyBoYW5kbGVyLAorICoJYW5kIGhhbmRsaW5nIHRoZSBoYW5kbGVyJ3MgcmV0dXJuIHZhbHVlLiAgVGhpcyByZXR1cm4gdmFsdWUKKyAqCWluZGljYXRlcyB3aGV0aGVyIHRoZSBoYW5kbGVyIHdpc2hlcyB0aGUgU0NTSSBjb21tYW5kIHRvIGJlCisgKgljb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvciBub3QuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordm9pZCBhdGFfc2NzaV9yYnVmX2ZpbGwoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsCisJCSAgICAgICAgdW5zaWduZWQgaW50ICgqYWN0b3IpIChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywKKwkJCSAgICAgCQkgICB1OCAqcmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikpCit7CisJdTggKnJidWY7CisJdW5zaWduZWQgaW50IGJ1ZmxlbiwgcmM7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gYXJncy0+Y21kOworCisJYnVmbGVuID0gYXRhX3Njc2lfcmJ1Zl9nZXQoY21kLCAmcmJ1Zik7CisJbWVtc2V0KHJidWYsIDAsIGJ1Zmxlbik7CisJcmMgPSBhY3RvcihhcmdzLCByYnVmLCBidWZsZW4pOworCWF0YV9zY3NpX3JidWZfcHV0KGNtZCwgcmJ1Zik7CisKKwlpZiAocmMpCisJCWF0YV9iYWRfY2RiKGNtZCwgYXJncy0+ZG9uZSk7CisJZWxzZSB7CisJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKKwkJYXJncy0+ZG9uZShjbWQpOworCX0KK30KKworLyoqCisgKglhdGFfc2NzaW9wX2lucV9zdGQgLSBTaW11bGF0ZSBJTlFVSVJZIGNvbW1hbmQKKyAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KKyAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KKyAqCUBidWZsZW46IFJlc3BvbnNlIGJ1ZmZlciBsZW5ndGguCisgKgorICoJUmV0dXJucyBzdGFuZGFyZCBkZXZpY2UgaWRlbnRpZmljYXRpb24gZGF0YSBhc3NvY2lhdGVkCisgKgl3aXRoIG5vbi1FVlBEIElOUVVJUlkgY29tbWFuZCBvdXRwdXQuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordW5zaWduZWQgaW50IGF0YV9zY3Npb3BfaW5xX3N0ZChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwl1OCBoZHJbXSA9IHsKKwkJVFlQRV9ESVNLLAorCQkwLAorCQkweDUsCS8qIGNsYWltIFNQQy0zIHZlcnNpb24gY29tcGF0aWJpbGl0eSAqLworCQkyLAorCQk5NSAtIDQKKwl9OworCisJLyogc2V0IHNjc2kgcmVtb3ZlYWJsZSAoUk1CKSBiaXQgcGVyIGF0YSBiaXQgKi8KKwlpZiAoYXRhX2lkX3JlbW92ZWFibGUoYXJncy0+aWQpKQorCQloZHJbMV0gfD0gKDEgPDwgNyk7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwltZW1jcHkocmJ1ZiwgaGRyLCBzaXplb2YoaGRyKSk7CisKKwlpZiAoYnVmbGVuID4gMzUpIHsKKwkJbWVtY3B5KCZyYnVmWzhdLCAiQVRBICAgICAiLCA4KTsKKwkJYXRhX2Rldl9pZF9zdHJpbmcoYXJncy0+aWQsICZyYnVmWzE2XSwgQVRBX0lEX1BST0RfT0ZTLCAxNik7CisJCWF0YV9kZXZfaWRfc3RyaW5nKGFyZ3MtPmlkLCAmcmJ1ZlszMl0sIEFUQV9JRF9GV19SRVZfT0ZTLCA0KTsKKwkJaWYgKHJidWZbMzJdID09IDAgfHwgcmJ1ZlszMl0gPT0gJyAnKQorCQkJbWVtY3B5KCZyYnVmWzMyXSwgIm4vYSAiLCA0KTsKKwl9CisKKwlpZiAoYnVmbGVuID4gNjMpIHsKKwkJY29uc3QgdTggdmVyc2lvbnNbXSA9IHsKKwkJCTB4NjAsCS8qIFNBTS0zIChubyB2ZXJzaW9uIGNsYWltZWQpICovCisKKwkJCTB4MDMsCisJCQkweDIwLAkvKiBTQkMtMiAobm8gdmVyc2lvbiBjbGFpbWVkKSAqLworCisJCQkweDAyLAorCQkJMHg2MAkvKiBTUEMtMyAobm8gdmVyc2lvbiBjbGFpbWVkKSAqLworCQl9OworCisJCW1lbWNweShyYnVmICsgNTksIHZlcnNpb25zLCBzaXplb2YodmVyc2lvbnMpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaW9wX2lucV8wMCAtIFNpbXVsYXRlIElOUVVJUlkgRVZQRCBwYWdlIDAsIGxpc3Qgb2YgcGFnZXMKKyAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KKyAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KKyAqCUBidWZsZW46IFJlc3BvbnNlIGJ1ZmZlciBsZW5ndGguCisgKgorICoJUmV0dXJucyBsaXN0IG9mIGlucXVpcnkgRVZQRCBwYWdlcyBhdmFpbGFibGUuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordW5zaWduZWQgaW50IGF0YV9zY3Npb3BfaW5xXzAwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJY29uc3QgdTggcGFnZXNbXSA9IHsKKwkJMHgwMCwJLyogcGFnZSAweDAwLCB0aGlzIHBhZ2UgKi8KKwkJMHg4MCwJLyogcGFnZSAweDgwLCB1bml0IHNlcmlhbCBubyBwYWdlICovCisJCTB4ODMJLyogcGFnZSAweDgzLCBkZXZpY2UgaWRlbnQgcGFnZSAqLworCX07CisJcmJ1ZlszXSA9IHNpemVvZihwYWdlcyk7CS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgRVZQRCBwYWdlcyAqLworCisJaWYgKGJ1ZmxlbiA+IDYpCisJCW1lbWNweShyYnVmICsgNCwgcGFnZXMsIHNpemVvZihwYWdlcykpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9pbnFfODAgLSBTaW11bGF0ZSBJTlFVSVJZIEVWUEQgcGFnZSA4MCwgZGV2aWNlIHNlcmlhbCBudW1iZXIKKyAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KKyAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KKyAqCUBidWZsZW46IFJlc3BvbnNlIGJ1ZmZlciBsZW5ndGguCisgKgorICoJUmV0dXJucyBBVEEgZGV2aWNlIHNlcmlhbCBudW1iZXIuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordW5zaWduZWQgaW50IGF0YV9zY3Npb3BfaW5xXzgwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJY29uc3QgdTggaGRyW10gPSB7CisJCTAsCisJCTB4ODAsCQkJLyogdGhpcyBwYWdlIGNvZGUgKi8KKwkJMCwKKwkJQVRBX1NFUk5PX0xFTiwJCS8qIHBhZ2UgbGVuICovCisJfTsKKwltZW1jcHkocmJ1ZiwgaGRyLCBzaXplb2YoaGRyKSk7CisKKwlpZiAoYnVmbGVuID4gKEFUQV9TRVJOT19MRU4gKyA0IC0gMSkpCisJCWF0YV9kZXZfaWRfc3RyaW5nKGFyZ3MtPmlkLCAodW5zaWduZWQgY2hhciAqKSAmcmJ1Zls0XSwKKwkJCQkgIEFUQV9JRF9TRVJOT19PRlMsIEFUQV9TRVJOT19MRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICppbnFfODNfc3RyID0gIkxpbnV4IEFUQS1TQ1NJIHNpbXVsYXRvciI7CisKKy8qKgorICoJYXRhX3Njc2lvcF9pbnFfODMgLSBTaW11bGF0ZSBJTlFVSVJZIEVWUEQgcGFnZSA4MywgZGV2aWNlIGlkZW50aXR5CisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCisgKglAYnVmbGVuOiBSZXNwb25zZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqCVJldHVybnMgZGV2aWNlIGlkZW50aWZpY2F0aW9uLiAgQ3VycmVudGx5IGhhcmRjb2RlZCB0bworICoJcmV0dXJuICJMaW51eCBBVEEtU0NTSSBzaW11bGF0b3IiLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV84MyhzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXJidWZbMV0gPSAweDgzOwkJCS8qIHRoaXMgcGFnZSBjb2RlICovCisJcmJ1ZlszXSA9IDQgKyBzdHJsZW4oaW5xXzgzX3N0cik7CS8qIHBhZ2UgbGVuICovCisKKwkvKiBvdXIgb25lIGFuZCBvbmx5IGlkZW50aWZpY2F0aW9uIGRlc2NyaXB0b3IgKHZlbmRvci1zcGVjaWZpYykgKi8KKwlpZiAoYnVmbGVuID4gKHN0cmxlbihpbnFfODNfc3RyKSArIDQgKyA0IC0gMSkpIHsKKwkJcmJ1Zls0ICsgMF0gPSAyOwkvKiBjb2RlIHNldDogQVNDSUkgKi8KKwkJcmJ1Zls0ICsgM10gPSBzdHJsZW4oaW5xXzgzX3N0cik7CisJCW1lbWNweShyYnVmICsgNCArIDQsIGlucV84M19zdHIsIHN0cmxlbihpbnFfODNfc3RyKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9ub29wIC0KKyAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KKyAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KKyAqCUBidWZsZW46IFJlc3BvbnNlIGJ1ZmZlciBsZW5ndGguCisgKgorICoJTm8gb3BlcmF0aW9uLiAgU2ltcGx5IHJldHVybnMgc3VjY2VzcyB0byBjYWxsZXIsIHRvIGluZGljYXRlCisgKgl0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZSB0aGlzIFNDU0kgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9ub29wKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCVZQUklOVEsoIkVOVEVSXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfbXNlbnNlX3B1c2ggLSBQdXNoIGRhdGEgb250byBNT0RFIFNFTlNFIGRhdGEgb3V0cHV0IGJ1ZmZlcgorICoJQHB0cl9pbzogKGlucHV0L291dHB1dCkgTG9jYXRpb24gdG8gc3RvcmUgbW9yZSBvdXRwdXQgZGF0YQorICoJQGxhc3Q6IEVuZCBvZiBvdXRwdXQgZGF0YSBidWZmZXIKKyAqCUBidWY6IFBvaW50ZXIgdG8gQkxPQiBiZWluZyBhZGRlZCB0byBvdXRwdXQgYnVmZmVyCisgKglAYnVmbGVuOiBMZW5ndGggb2YgQkxPQgorICoKKyAqCVN0b3JlIE1PREUgU0VOU0UgZGF0YSBvbiBhbiBvdXRwdXQgYnVmZmVyLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCisKK3N0YXRpYyB2b2lkIGF0YV9tc2Vuc2VfcHVzaCh1OCAqKnB0cl9pbywgY29uc3QgdTggKmxhc3QsCisJCQkgICAgY29uc3QgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwl1OCAqcHRyID0gKnB0cl9pbzsKKworCWlmICgocHRyICsgYnVmbGVuIC0gMSkgPiBsYXN0KQorCQlyZXR1cm47CisKKwltZW1jcHkocHRyLCBidWYsIGJ1Zmxlbik7CisKKwlwdHIgKz0gYnVmbGVuOworCisJKnB0cl9pbyA9IHB0cjsKK30KKworLyoqCisgKglhdGFfbXNlbnNlX2NhY2hpbmcgLSBTaW11bGF0ZSBNT0RFIFNFTlNFIGNhY2hpbmcgaW5mbyBwYWdlCisgKglAaWQ6IGRldmljZSBJREVOVElGWSBkYXRhCisgKglAcHRyX2lvOiAoaW5wdXQvb3V0cHV0KSBMb2NhdGlvbiB0byBzdG9yZSBtb3JlIG91dHB1dCBkYXRhCisgKglAbGFzdDogRW5kIG9mIG91dHB1dCBkYXRhIGJ1ZmZlcgorICoKKyAqCUdlbmVyYXRlIGEgY2FjaGluZyBpbmZvIHBhZ2UsIHdoaWNoIGNvbmRpdGlvbmFsbHkgaW5kaWNhdGVzCisgKgl3cml0ZSBjYWNoaW5nIHRvIHRoZSBTQ1NJIGxheWVyLCBkZXBlbmRpbmcgb24gZGV2aWNlCisgKgljYXBhYmlsaXRpZXMuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfbXNlbnNlX2NhY2hpbmcodTE2ICppZCwgdTggKipwdHJfaW8sCisJCQkJICAgICAgIGNvbnN0IHU4ICpsYXN0KQoreworCXU4IHBhZ2VbXSA9IHsKKwkJMHg4LAkJCQkvKiBwYWdlIGNvZGUgKi8KKwkJMHgxMiwJCQkJLyogcGFnZSBsZW5ndGggKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMTAgemVyb2VzICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAJCS8qIDggemVyb2VzICovCisJfTsKKworCWlmIChhdGFfaWRfd2NhY2hlX2VuYWJsZWQoaWQpKQorCQlwYWdlWzJdIHw9ICgxIDw8IDIpOwkvKiB3cml0ZSBjYWNoZSBlbmFibGUgKi8KKwlpZiAoIWF0YV9pZF9yYWhlYWRfZW5hYmxlZChpZCkpCisJCXBhZ2VbMTJdIHw9ICgxIDw8IDUpOwkvKiBkaXNhYmxlIHJlYWQgYWhlYWQgKi8KKworCWF0YV9tc2Vuc2VfcHVzaChwdHJfaW8sIGxhc3QsIHBhZ2UsIHNpemVvZihwYWdlKSk7CisJcmV0dXJuIHNpemVvZihwYWdlKTsKK30KKworLyoqCisgKglhdGFfbXNlbnNlX2N0bF9tb2RlIC0gU2ltdWxhdGUgTU9ERSBTRU5TRSBjb250cm9sIG1vZGUgcGFnZQorICoJQGRldjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1PREUgU0VOU0UgY29tbWFuZAorICoJQHB0cl9pbzogKGlucHV0L291dHB1dCkgTG9jYXRpb24gdG8gc3RvcmUgbW9yZSBvdXRwdXQgZGF0YQorICoJQGxhc3Q6IEVuZCBvZiBvdXRwdXQgZGF0YSBidWZmZXIKKyAqCisgKglHZW5lcmF0ZSBhIGdlbmVyaWMgTU9ERSBTRU5TRSBjb250cm9sIG1vZGUgcGFnZS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9tc2Vuc2VfY3RsX21vZGUodTggKipwdHJfaW8sIGNvbnN0IHU4ICpsYXN0KQoreworCWNvbnN0IHU4IHBhZ2VbXSA9IHsweGEsIDB4YSwgNiwgMCwgMCwgMCwgMCwgMCwgMHhmZiwgMHhmZiwgMCwgMzB9OworCisJLyogYnl0ZSAyOiBzZXQgdGhlIGRlc2NyaXB0b3IgZm9ybWF0IHNlbnNlIGRhdGEgYml0IChiaXQgMikKKwkgKiBzaW5jZSB3ZSBuZWVkIHRvIHN1cHBvcnQgcmV0dXJuaW5nIHRoaXMgZm9ybWF0IGZvciBTQVQKKwkgKiBjb21tYW5kcyBhbmQgYW55IFNDU0kgY29tbWFuZHMgYWdhaW5zdCBhIDQ4YiBMQkEgZGV2aWNlLgorCSAqLworCisJYXRhX21zZW5zZV9wdXNoKHB0cl9pbywgbGFzdCwgcGFnZSwgc2l6ZW9mKHBhZ2UpKTsKKwlyZXR1cm4gc2l6ZW9mKHBhZ2UpOworfQorCisvKioKKyAqCWF0YV9tc2Vuc2VfcndfcmVjb3ZlcnkgLSBTaW11bGF0ZSBNT0RFIFNFTlNFIHIvdyBlcnJvciByZWNvdmVyeSBwYWdlCisgKglAZGV2OiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTU9ERSBTRU5TRSBjb21tYW5kCisgKglAcHRyX2lvOiAoaW5wdXQvb3V0cHV0KSBMb2NhdGlvbiB0byBzdG9yZSBtb3JlIG91dHB1dCBkYXRhCisgKglAbGFzdDogRW5kIG9mIG91dHB1dCBkYXRhIGJ1ZmZlcgorICoKKyAqCUdlbmVyYXRlIGEgZ2VuZXJpYyBNT0RFIFNFTlNFIHIvdyBlcnJvciByZWNvdmVyeSBwYWdlLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX21zZW5zZV9yd19yZWNvdmVyeSh1OCAqKnB0cl9pbywgY29uc3QgdTggKmxhc3QpCit7CisJY29uc3QgdTggcGFnZVtdID0geworCQkweDEsCQkJICAvKiBwYWdlIGNvZGUgKi8KKwkJMHhhLAkJCSAgLyogcGFnZSBsZW5ndGggKi8KKwkJKDEgPDwgNykgfCAoMSA8PCA2KSwJICAvKiBub3RlIGF1dG8gci93IHJlYWxsb2NhdGlvbiAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIC8qIDkgemVyb2VzICovCisJfTsKKworCWF0YV9tc2Vuc2VfcHVzaChwdHJfaW8sIGxhc3QsIHBhZ2UsIHNpemVvZihwYWdlKSk7CisJcmV0dXJuIHNpemVvZihwYWdlKTsKK30KKworLyoqCisgKglhdGFfc2NzaW9wX21vZGVfc2Vuc2UgLSBTaW11bGF0ZSBNT0RFIFNFTlNFIDYsIDEwIGNvbW1hbmRzCisgKglAYXJnczogZGV2aWNlIElERU5USUZZIGRhdGEgLyBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QuCisgKglAcmJ1ZjogUmVzcG9uc2UgYnVmZmVyLCB0byB3aGljaCBzaW11bGF0ZWQgU0NTSSBjbWQgb3V0cHV0IGlzIHNlbnQuCisgKglAYnVmbGVuOiBSZXNwb25zZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqCVNpbXVsYXRlIE1PREUgU0VOU0UgY29tbWFuZHMuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKwordW5zaWduZWQgaW50IGF0YV9zY3Npb3BfbW9kZV9zZW5zZShzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkJICB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXU4ICpzY3NpY21kID0gYXJncy0+Y21kLT5jbW5kLCAqcCwgKmxhc3Q7CisJdW5zaWduZWQgaW50IHBhZ2VfY29udHJvbCwgc2l4X2J5dGUsIG91dHB1dF9sZW47CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlzaXhfYnl0ZSA9IChzY3NpY21kWzBdID09IE1PREVfU0VOU0UpOworCisJLyogd2Ugb25seSBzdXBwb3J0IHNhdmVkIGFuZCBjdXJyZW50IHZhbHVlcyAod2hpY2ggd2UgdHJlYXQKKwkgKiBpbiB0aGUgc2FtZSBtYW5uZXIpCisJICovCisJcGFnZV9jb250cm9sID0gc2NzaWNtZFsyXSA+PiA2OworCWlmICgocGFnZV9jb250cm9sICE9IDApICYmIChwYWdlX2NvbnRyb2wgIT0gMykpCisJCXJldHVybiAxOworCisJaWYgKHNpeF9ieXRlKQorCQlvdXRwdXRfbGVuID0gNDsKKwllbHNlCisJCW91dHB1dF9sZW4gPSA4OworCisJcCA9IHJidWYgKyBvdXRwdXRfbGVuOworCWxhc3QgPSByYnVmICsgYnVmbGVuIC0gMTsKKworCXN3aXRjaChzY3NpY21kWzJdICYgMHgzZikgeworCWNhc2UgMHgwMToJCS8qIHIvdyBlcnJvciByZWNvdmVyeSAqLworCQlvdXRwdXRfbGVuICs9IGF0YV9tc2Vuc2VfcndfcmVjb3ZlcnkoJnAsIGxhc3QpOworCQlicmVhazsKKworCWNhc2UgMHgwODoJCS8qIGNhY2hpbmcgKi8KKwkJb3V0cHV0X2xlbiArPSBhdGFfbXNlbnNlX2NhY2hpbmcoYXJncy0+aWQsICZwLCBsYXN0KTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MGE6IHsJCS8qIGNvbnRyb2wgbW9kZSAqLworCQlvdXRwdXRfbGVuICs9IGF0YV9tc2Vuc2VfY3RsX21vZGUoJnAsIGxhc3QpOworCQlicmVhazsKKwkJfQorCisJY2FzZSAweDNmOgkJLyogYWxsIHBhZ2VzICovCisJCW91dHB1dF9sZW4gKz0gYXRhX21zZW5zZV9yd19yZWNvdmVyeSgmcCwgbGFzdCk7CisJCW91dHB1dF9sZW4gKz0gYXRhX21zZW5zZV9jYWNoaW5nKGFyZ3MtPmlkLCAmcCwgbGFzdCk7CisJCW91dHB1dF9sZW4gKz0gYXRhX21zZW5zZV9jdGxfbW9kZSgmcCwgbGFzdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIGludmFsaWQgcGFnZSBjb2RlICovCisJCXJldHVybiAxOworCX0KKworCWlmIChzaXhfYnl0ZSkgeworCQlvdXRwdXRfbGVuLS07CisJCXJidWZbMF0gPSBvdXRwdXRfbGVuOworCX0gZWxzZSB7CisJCW91dHB1dF9sZW4gLT0gMjsKKwkJcmJ1ZlswXSA9IG91dHB1dF9sZW4gPj4gODsKKwkJcmJ1ZlsxXSA9IG91dHB1dF9sZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lvcF9yZWFkX2NhcCAtIFNpbXVsYXRlIFJFQUQgQ0FQQUNJVFlbIDE2XSBjb21tYW5kcworICoJQGFyZ3M6IGRldmljZSBJREVOVElGWSBkYXRhIC8gU0NTSSBjb21tYW5kIG9mIGludGVyZXN0LgorICoJQHJidWY6IFJlc3BvbnNlIGJ1ZmZlciwgdG8gd2hpY2ggc2ltdWxhdGVkIFNDU0kgY21kIG91dHB1dCBpcyBzZW50LgorICoJQGJ1ZmxlbjogUmVzcG9uc2UgYnVmZmVyIGxlbmd0aC4KKyAqCisgKglTaW11bGF0ZSBSRUFEIENBUEFDSVRZIGNvbW1hbmRzLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX3JlYWRfY2FwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwl1NjQgbl9zZWN0b3JzOworCXUzMiB0bXA7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlpZiAoYXRhX2lkX2hhc19sYmE0OChhcmdzLT5pZCkpCisJCW5fc2VjdG9ycyA9IGF0YV9pZF91NjQoYXJncy0+aWQsIDEwMCk7CisJZWxzZQorCQluX3NlY3RvcnMgPSBhdGFfaWRfdTMyKGFyZ3MtPmlkLCA2MCk7CisJbl9zZWN0b3JzLS07CQkvKiBBVEEgVG90YWxVc2VyU2VjdG9ycyAtIDEgKi8KKworCXRtcCA9IG5fc2VjdG9yczsJLyogbm90ZTogdHJ1bmNhdGVzLCBpZiBsYmE0OCAqLworCWlmIChhcmdzLT5jbWQtPmNtbmRbMF0gPT0gUkVBRF9DQVBBQ0lUWSkgeworCQkvKiBzZWN0b3IgY291bnQsIDMyLWJpdCAqLworCQlyYnVmWzBdID0gdG1wID4+ICg4ICogMyk7CisJCXJidWZbMV0gPSB0bXAgPj4gKDggKiAyKTsKKwkJcmJ1ZlsyXSA9IHRtcCA+PiAoOCAqIDEpOworCQlyYnVmWzNdID0gdG1wOworCisJCS8qIHNlY3RvciBzaXplICovCisJCXRtcCA9IEFUQV9TRUNUX1NJWkU7CisJCXJidWZbNl0gPSB0bXAgPj4gODsKKwkJcmJ1Zls3XSA9IHRtcDsKKworCX0gZWxzZSB7CisJCS8qIHNlY3RvciBjb3VudCwgNjQtYml0ICovCisJCXJidWZbMl0gPSBuX3NlY3RvcnMgPj4gKDggKiA3KTsKKwkJcmJ1ZlszXSA9IG5fc2VjdG9ycyA+PiAoOCAqIDYpOworCQlyYnVmWzRdID0gbl9zZWN0b3JzID4+ICg4ICogNSk7CisJCXJidWZbNV0gPSBuX3NlY3RvcnMgPj4gKDggKiA0KTsKKwkJcmJ1Zls2XSA9IHRtcCA+PiAoOCAqIDMpOworCQlyYnVmWzddID0gdG1wID4+ICg4ICogMik7CisJCXJidWZbOF0gPSB0bXAgPj4gKDggKiAxKTsKKwkJcmJ1Zls5XSA9IHRtcDsKKworCQkvKiBzZWN0b3Igc2l6ZSAqLworCQl0bXAgPSBBVEFfU0VDVF9TSVpFOworCQlyYnVmWzEyXSA9IHRtcCA+PiA4OworCQlyYnVmWzEzXSA9IHRtcDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaW9wX3JlcG9ydF9sdW5zIC0gU2ltdWxhdGUgUkVQT1JUIExVTlMgY29tbWFuZAorICoJQGFyZ3M6IGRldmljZSBJREVOVElGWSBkYXRhIC8gU0NTSSBjb21tYW5kIG9mIGludGVyZXN0LgorICoJQHJidWY6IFJlc3BvbnNlIGJ1ZmZlciwgdG8gd2hpY2ggc2ltdWxhdGVkIFNDU0kgY21kIG91dHB1dCBpcyBzZW50LgorICoJQGJ1ZmxlbjogUmVzcG9uc2UgYnVmZmVyIGxlbmd0aC4KKyAqCisgKglTaW11bGF0ZSBSRVBPUlQgTFVOUyBjb21tYW5kLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3Vuc2lnbmVkIGludCBhdGFfc2NzaW9wX3JlcG9ydF9sdW5zKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCVZQUklOVEsoIkVOVEVSXG4iKTsKKwlyYnVmWzNdID0gODsJLyoganVzdCBvbmUgbHVuLCBMVU4gMCwgc2l6ZSA4IGJ5dGVzICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfc2NzaV9iYWRjbWQgLSBFbmQgYSBTQ1NJIHJlcXVlc3Qgd2l0aCBhbiBlcnJvcgorICoJQGNtZDogU0NTSSByZXF1ZXN0IHRvIGJlIGhhbmRsZWQKKyAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbgorICoJQGFzYzogU0NTSS1kZWZpbmVkIGFkZGl0aW9uYWwgc2Vuc2UgY29kZQorICoJQGFzY3E6IFNDU0ktZGVmaW5lZCBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgcXVhbGlmaWVyCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIHRoYXQgY29tcGxldGVzIGEgU0NTSSBjb21tYW5kIHdpdGgKKyAqCSVTQU1fU1RBVF9DSEVDS19DT05ESVRJT04sIHdpdGggYSBzZW5zZSBrZXkgJUlMTEVHQUxfUkVRVUVTVAorICoJYW5kIHRoZSBzcGVjaWZpZWQgYWRkaXRpb25hbCBzZW5zZSBjb2Rlcy4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworCit2b2lkIGF0YV9zY3NpX2JhZGNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLCB1OCBhc2MsIHU4IGFzY3EpCit7CisJRFBSSU5USygiRU5URVJcbiIpOworCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisJY21kLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworCWNtZC0+c2Vuc2VfYnVmZmVyWzJdID0gSUxMRUdBTF9SRVFVRVNUOworCWNtZC0+c2Vuc2VfYnVmZmVyWzddID0gMTQgLSA4OwkvKiBhZGRubC4gc2Vuc2UgbGVuLiBGSVhNRTogY29ycmVjdD8gKi8KKwljbWQtPnNlbnNlX2J1ZmZlclsxMl0gPSBhc2M7CisJY21kLT5zZW5zZV9idWZmZXJbMTNdID0gYXNjcTsKKworCWRvbmUoY21kKTsKK30KKworc3RhdGljIGludCBhdGFwaV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCBkcnZfc3RhdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBxYy0+c2NzaWNtZDsKKworCWlmICh1bmxpa2VseShkcnZfc3RhdCAmIChBVEFfRVJSIHwgQVRBX0JVU1kgfCBBVEFfRFJRKSkpIHsKKwkJRFBSSU5USygicmVxdWVzdCBjaGVjayBjb25kaXRpb25cbiIpOworCisJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisJCXFjLT5zY3NpZG9uZShjbWQpOworCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXU4ICpzY3NpY21kID0gY21kLT5jbW5kOworCisJCWlmIChzY3NpY21kWzBdID09IElOUVVJUlkpIHsKKwkJCXU4ICpidWYgPSBOVUxMOworCQkJdW5zaWduZWQgaW50IGJ1ZmxlbjsKKworCQkJYnVmbGVuID0gYXRhX3Njc2lfcmJ1Zl9nZXQoY21kLCAmYnVmKTsKKwkJCWJ1ZlsyXSA9IDB4NTsKKwkJCWJ1ZlszXSA9IChidWZbM10gJiAweGYwKSB8IDI7CisJCQlhdGFfc2NzaV9yYnVmX3B1dChjbWQsIGJ1Zik7CisJCX0KKwkJY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCX0KKworCXFjLT5zY3NpZG9uZShjbWQpOworCisJcmV0dXJuIDA7Cit9CisvKioKKyAqCWF0YXBpX3hsYXQgLSBJbml0aWFsaXplIFBBQ0tFVCB0YXNrZmlsZQorICoJQHFjOiBjb21tYW5kIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZAorICoJQHNjc2ljbWQ6IFNDU0kgQ0RCIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBBQ0tFVCBjb21tYW5kCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YXBpX3hsYXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdTggKnNjc2ljbWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IHFjLT5kZXY7CisJaW50IHVzaW5nX3BpbyA9IChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTyk7CisJaW50IG5vZGF0YSA9IChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IFNDU0lfREFUQV9OT05FKTsKKworCWlmICghdXNpbmdfcGlvKQorCQkvKiBDaGVjayB3aGV0aGVyIEFUQVBJIERNQSBpcyBzYWZlICovCisJCWlmIChhdGFfY2hlY2tfYXRhcGlfZG1hKHFjKSkKKwkJCXVzaW5nX3BpbyA9IDE7CisKKwltZW1jcHkoJnFjLT5jZGIsIHNjc2ljbWQsIHFjLT5hcC0+Y2RiX2xlbik7CisKKwlxYy0+Y29tcGxldGVfZm4gPSBhdGFwaV9xY19jb21wbGV0ZTsKKworCXFjLT50Zi5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBTQ1NJX0RBVEFfV1JJVEUpIHsKKwkJcWMtPnRmLmZsYWdzIHw9IEFUQV9URkxBR19XUklURTsKKwkJRFBSSU5USygiZGlyZWN0aW9uOiB3cml0ZVxuIik7CisJfQorCisJcWMtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX1BBQ0tFVDsKKworCS8qIG5vIGRhdGEsIG9yIFBJTyBkYXRhIHhmZXIgKi8KKwlpZiAodXNpbmdfcGlvIHx8IG5vZGF0YSkgeworCQlpZiAobm9kYXRhKQorCQkJcWMtPnRmLnByb3RvY29sID0gQVRBX1BST1RfQVRBUElfTk9EQVRBOworCQllbHNlCisJCQlxYy0+dGYucHJvdG9jb2wgPSBBVEFfUFJPVF9BVEFQSTsKKwkJcWMtPnRmLmxiYW0gPSAoOCAqIDEwMjQpICYgMHhmZjsKKwkJcWMtPnRmLmxiYWggPSAoOCAqIDEwMjQpID4+IDg7CisJfQorCisJLyogRE1BIGRhdGEgeGZlciAqLworCWVsc2UgeworCQlxYy0+dGYucHJvdG9jb2wgPSBBVEFfUFJPVF9BVEFQSV9ETUE7CisJCXFjLT50Zi5mZWF0dXJlIHw9IEFUQVBJX1BLVF9ETUE7CisKKyNpZmRlZiBBVEFQSV9FTkFCTEVfRE1BRElSCisJCS8qIHNvbWUgU0FUQSBicmlkZ2VzIG5lZWQgdXMgdG8gaW5kaWNhdGUgZGF0YSB4ZmVyIGRpcmVjdGlvbiAqLworCQlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBTQ1NJX0RBVEFfV1JJVEUpCisJCQlxYy0+dGYuZmVhdHVyZSB8PSBBVEFQSV9ETUFESVI7CisjZW5kaWYKKwl9CisKKwlxYy0+bmJ5dGVzID0gY21kLT5idWZmbGVuOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfZmluZF9kZXYgLSBsb29rdXAgYXRhX2RldmljZSBmcm9tIHNjc2lfY21uZAorICoJQGFwOiBBVEEgcG9ydCB0byB3aGljaCB0aGUgZGV2aWNlIGlzIGF0dGFjaGVkCisgKglAc2NzaWRldjogU0NTSSBkZXZpY2UgZnJvbSB3aGljaCB3ZSBkZXJpdmUgdGhlIEFUQSBkZXZpY2UKKyAqCisgKglHaXZlbiB2YXJpb3VzIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHN0cnVjdCBzY3NpX2NtbmQsCisgKgltYXAgdGhhdCBvbnRvIGFuIEFUQSBidXMsIGFuZCB1c2luZyB0aGF0IG1hcHBpbmcKKyAqCWRldGVybWluZSB3aGljaCBhdGFfZGV2aWNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqCVNDU0kgY29tbWFuZCB0byBiZSBzZW50LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKglBc3NvY2lhdGVkIEFUQSBkZXZpY2UsIG9yICVOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IGF0YV9kZXZpY2UgKgorYXRhX3Njc2lfZmluZF9kZXYoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KQoreworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisKKwkvKiBza2lwIGNvbW1hbmRzIG5vdCBhZGRyZXNzZWQgdG8gdGFyZ2V0cyB3ZSBzaW11bGF0ZSAqLworCWlmIChsaWtlbHkoc2NzaWRldi0+aWQgPCBBVEFfTUFYX0RFVklDRVMpKQorCQlkZXYgPSAmYXAtPmRldmljZVtzY3NpZGV2LT5pZF07CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1bmxpa2VseSgoc2NzaWRldi0+Y2hhbm5lbCAhPSAwKSB8fAorCQkgICAgIChzY3NpZGV2LT5sdW4gIT0gMCkpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1bmxpa2VseSghYXRhX2Rldl9wcmVzZW50KGRldikpKQorCQlyZXR1cm4gTlVMTDsKKworI2lmbmRlZiBBVEFfRU5BQkxFX0FUQVBJCisJaWYgKHVubGlrZWx5KGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEFQSSkpCisJCXJldHVybiBOVUxMOworI2VuZGlmCisKKwlyZXR1cm4gZGV2OworfQorCisvKioKKyAqCWF0YV9nZXRfeGxhdF9mdW5jIC0gY2hlY2sgaWYgU0NTSSB0byBBVEEgdHJhbnNsYXRpb24gaXMgcG9zc2libGUKKyAqCUBkZXY6IEFUQSBkZXZpY2UKKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCBvcGNvZGUgdG8gY29uc2lkZXIKKyAqCisgKglMb29rIHVwIHRoZSBTQ1NJIGNvbW1hbmQgZ2l2ZW4sIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAqCVNDU0kgY29tbWFuZCBpcyB0byBiZSB0cmFuc2xhdGVkIG9yIHNpbXVsYXRlZC4KKyAqCisgKglSRVRVUk5TOgorICoJUG9pbnRlciB0byB0cmFuc2xhdGlvbiBmdW5jdGlvbiBpZiBwb3NzaWJsZSwgJU5VTEwgaWYgbm90LgorICovCisKK3N0YXRpYyBpbmxpbmUgYXRhX3hsYXRfZnVuY190IGF0YV9nZXRfeGxhdF9mdW5jKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU4IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkVBRF82OgorCWNhc2UgUkVBRF8xMDoKKwljYXNlIFJFQURfMTY6CisKKwljYXNlIFdSSVRFXzY6CisJY2FzZSBXUklURV8xMDoKKwljYXNlIFdSSVRFXzE2OgorCQlyZXR1cm4gYXRhX3Njc2lfcndfeGxhdDsKKworCWNhc2UgU1lOQ0hST05JWkVfQ0FDSEU6CisJCWlmIChhdGFfdHJ5X2ZsdXNoX2NhY2hlKGRldikpCisJCQlyZXR1cm4gYXRhX3Njc2lfZmx1c2hfeGxhdDsKKwkJYnJlYWs7CisKKwljYXNlIFZFUklGWToKKwljYXNlIFZFUklGWV8xNjoKKwkJcmV0dXJuIGF0YV9zY3NpX3ZlcmlmeV94bGF0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCWF0YV9zY3NpX2R1bXBfY2RiIC0gZHVtcCBTQ1NJIGNvbW1hbmQgY29udGVudHMgdG8gZG1lc2cKKyAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIGNvbW1hbmQgd2FzIGJlaW5nIHNlbnQKKyAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0byBkdW1wCisgKgorICoJUHJpbnRzIHRoZSBjb250ZW50cyBvZiBhIFNDU0kgY29tbWFuZCB2aWEgcHJpbnRrKCkuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0YV9zY3NpX2R1bXBfY2RiKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisjaWZkZWYgQVRBX0RFQlVHCisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2ID0gY21kLT5kZXZpY2U7CisJdTggKnNjc2ljbWQgPSBjbWQtPmNtbmQ7CisKKwlEUFJJTlRLKCJDREIgKCV1OiVkLCVkLCVkKSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJYXAtPmlkLAorCQlzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5pZCwgc2NzaWRldi0+bHVuLAorCQlzY3NpY21kWzBdLCBzY3NpY21kWzFdLCBzY3NpY21kWzJdLCBzY3NpY21kWzNdLAorCQlzY3NpY21kWzRdLCBzY3NpY21kWzVdLCBzY3NpY21kWzZdLCBzY3NpY21kWzddLAorCQlzY3NpY21kWzhdKTsKKyNlbmRpZgorfQorCisvKioKKyAqCWF0YV9zY3NpX3F1ZXVlY21kIC0gSXNzdWUgU0NTSSBjZGIgdG8gbGliYXRhLW1hbmFnZWQgZGV2aWNlCisgKglAY21kOiBTQ1NJIGNvbW1hbmQgdG8gYmUgc2VudAorICoJQGRvbmU6IENvbXBsZXRpb24gZnVuY3Rpb24sIGNhbGxlZCB3aGVuIGNvbW1hbmQgaXMgY29tcGxldGUKKyAqCisgKglJbiBzb21lIGNhc2VzLCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgU0NTSSBjb21tYW5kcyBpbnRvCisgKglBVEEgdGFza2ZpbGVzLCBhbmQgcXVldWVzIHRoZSB0YXNrZmlsZXMgdG8gYmUgc2VudCB0bworICoJaGFyZHdhcmUuICBJbiBvdGhlciBjYXNlcywgdGhpcyBmdW5jdGlvbiBzaW11bGF0ZXMgYQorICoJU0NTSSBkZXZpY2UgYnkgZXZhbHVhdGluZyBhbmQgcmVzcG9uZGluZyB0byBjZXJ0YWluCisgKglTQ1NJIGNvbW1hbmRzLiAgVGhpcyBjcmVhdGVzIHRoZSBvdmVyYWxsIGVmZmVjdCBvZgorICoJQVRBIGFuZCBBVEFQSSBkZXZpY2VzIGFwcGVhcmluZyBhcyBTQ1NJIGRldmljZXMuCisgKgorICoJTE9DS0lORzoKKyAqCVJlbGVhc2VzIHNjc2ktbGF5ZXItaGVsZCBsb2NrLCBhbmQgb2J0YWlucyBob3N0X3NldCBsb2NrLgorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvLgorICovCisKK2ludCBhdGFfc2NzaV9xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYgPSBjbWQtPmRldmljZTsKKworCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmc2NzaWRldi0+aG9zdC0+aG9zdGRhdGFbMF07CisKKwlhdGFfc2NzaV9kdW1wX2NkYihhcCwgY21kKTsKKworCWRldiA9IGF0YV9zY3NpX2ZpbmRfZGV2KGFwLCBzY3NpZGV2KTsKKwlpZiAodW5saWtlbHkoIWRldikpIHsKKwkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQlkb25lKGNtZCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkgeworCQlhdGFfeGxhdF9mdW5jX3QgeGxhdF9mdW5jID0gYXRhX2dldF94bGF0X2Z1bmMoZGV2LAorCQkJCQkJCSAgICAgIGNtZC0+Y21uZFswXSk7CisKKwkJaWYgKHhsYXRfZnVuYykKKwkJCWF0YV9zY3NpX3RyYW5zbGF0ZShhcCwgZGV2LCBjbWQsIGRvbmUsIHhsYXRfZnVuYyk7CisJCWVsc2UKKwkJCWF0YV9zY3NpX3NpbXVsYXRlKGRldi0+aWQsIGNtZCwgZG9uZSk7CisJfSBlbHNlCisJCWF0YV9zY3NpX3RyYW5zbGF0ZShhcCwgZGV2LCBjbWQsIGRvbmUsIGF0YXBpX3hsYXQpOworCitvdXRfdW5sb2NrOgorCXJldHVybiAwOworfQorCisvKioKKyAqCWF0YV9zY3NpX3NpbXVsYXRlIC0gc2ltdWxhdGUgU0NTSSBjb21tYW5kIG9uIEFUQSBkZXZpY2UKKyAqCUBpZDogY3VycmVudCBJREVOVElGWSBkYXRhIGZvciB0YXJnZXQgZGV2aWNlLgorICoJQGNtZDogU0NTSSBjb21tYW5kIGJlaW5nIHNlbnQgdG8gZGV2aWNlLgorICoJQGRvbmU6IFNDU0kgY29tbWFuZCBjb21wbGV0aW9uIGZ1bmN0aW9uLgorICoKKyAqCUludGVycHJldHMgYW5kIGRpcmVjdGx5IGV4ZWN1dGVzIGEgc2VsZWN0IGxpc3Qgb2YgU0NTSSBjb21tYW5kcworICoJdGhhdCBjYW4gYmUgaGFuZGxlZCBpbnRlcm5hbGx5LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3ZvaWQgYXRhX3Njc2lfc2ltdWxhdGUodTE2ICppZCwKKwkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgYXRhX3Njc2lfYXJncyBhcmdzOworCXU4ICpzY3NpY21kID0gY21kLT5jbW5kOworCisJYXJncy5pZCA9IGlkOworCWFyZ3MuY21kID0gY21kOworCWFyZ3MuZG9uZSA9IGRvbmU7CisKKwlzd2l0Y2goc2NzaWNtZFswXSkgeworCQkvKiBuby1vcCdzLCBjb21wbGV0ZSB3aXRoIHN1Y2Nlc3MgKi8KKwkJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJY2FzZSBSRVpFUk9fVU5JVDoKKwkJY2FzZSBTRUVLXzY6CisJCWNhc2UgU0VFS18xMDoKKwkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCWNhc2UgRk9STUFUX1VOSVQ6CQkvKiBGSVhNRTogY29ycmVjdD8gKi8KKwkJY2FzZSBTRU5EX0RJQUdOT1NUSUM6CQkvKiBGSVhNRTogY29ycmVjdD8gKi8KKwkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9ub29wKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU5RVUlSWToKKwkJCWlmIChzY3NpY21kWzFdICYgMikJICAgICAgICAgICAvKiBpcyBDbWREdCBzZXQ/ICAqLworCQkJCWF0YV9iYWRfY2RiKGNtZCwgZG9uZSk7CisJCQllbHNlIGlmICgoc2NzaWNtZFsxXSAmIDEpID09IDApICAgIC8qIGlzIEVWUEQgY2xlYXI/ICovCisJCQkJYXRhX3Njc2lfcmJ1Zl9maWxsKCZhcmdzLCBhdGFfc2NzaW9wX2lucV9zdGQpOworCQkJZWxzZSBpZiAoc2NzaWNtZFsyXSA9PSAweDAwKQorCQkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfMDApOworCQkJZWxzZSBpZiAoc2NzaWNtZFsyXSA9PSAweDgwKQorCQkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfODApOworCQkJZWxzZSBpZiAoc2NzaWNtZFsyXSA9PSAweDgzKQorCQkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfODMpOworCQkJZWxzZQorCQkJCWF0YV9iYWRfY2RiKGNtZCwgZG9uZSk7CisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VOU0U6CisJCWNhc2UgTU9ERV9TRU5TRV8xMDoKKwkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9tb2RlX3NlbnNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9TRUxFQ1Q6CS8qIHVuY29uZGl0aW9uYWxseSByZXR1cm4gKi8KKwkJY2FzZSBNT0RFX1NFTEVDVF8xMDoJLyogYmFkLWZpZWxkLWluLWNkYiAqLworCQkJYXRhX2JhZF9jZGIoY21kLCBkb25lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9yZWFkX2NhcCk7CisJCQlicmVhazsKKworCQljYXNlIFNFUlZJQ0VfQUNUSU9OX0lOOgorCQkJaWYgKChzY3NpY21kWzFdICYgMHgxZikgPT0gU0FJX1JFQURfQ0FQQUNJVFlfMTYpCisJCQkJYXRhX3Njc2lfcmJ1Zl9maWxsKCZhcmdzLCBhdGFfc2NzaW9wX3JlYWRfY2FwKTsKKwkJCWVsc2UKKwkJCQlhdGFfYmFkX2NkYihjbWQsIGRvbmUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVBPUlRfTFVOUzoKKwkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9yZXBvcnRfbHVucyk7CisJCQlicmVhazsKKworCQkvKiBtYW5kYW50b3J5IGNvbW1hbmRzIHdlIGhhdmVuJ3QgaW1wbGVtZW50ZWQgeWV0ICovCisJCWNhc2UgUkVRVUVTVF9TRU5TRToKKworCQkvKiBhbGwgb3RoZXIgY29tbWFuZHMgKi8KKwkJZGVmYXVsdDoKKwkJCWF0YV9iYWRfc2NzaW9wKGNtZCwgZG9uZSk7CisJCQlicmVhazsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEuaCBiL2RyaXZlcnMvc2NzaS9saWJhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE4MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgICBsaWJhdGEuaCAtIGhlbHBlciBsaWJyYXJ5IGZvciBBVEEKKworICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBKZWZmIEdhcnppaworCisgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAgIGJ5IHJlZmVyZW5jZS4KKworICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAgIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAgIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorCisgKi8KKworI2lmbmRlZiBfX0xJQkFUQV9IX18KKyNkZWZpbmUgX19MSUJBVEFfSF9fCisKKyNkZWZpbmUgRFJWX05BTUUJImxpYmF0YSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTAiCS8qIG11c3QgYmUgZXhhY3RseSBmb3VyIGNoYXJzICovCisKK3N0cnVjdCBhdGFfc2NzaV9hcmdzIHsKKwl1MTYJCQkqaWQ7CisJc3RydWN0IHNjc2lfY21uZAkqY21kOworCXZvaWQJCQkoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKik7Cit9OworCisvKiBsaWJhdGEtY29yZS5jICovCitleHRlcm4gc3RydWN0IGF0YV9xdWV1ZWRfY21kICphdGFfcWNfbmV3X2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGF0YV9xY19mcmVlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworZXh0ZXJuIGludCBhdGFfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitleHRlcm4gaW50IGF0YV9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitleHRlcm4gdm9pZCBhdGFfZGV2X3NlbGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHdhaXQsIHVuc2lnbmVkIGludCBjYW5fc2xlZXApOworZXh0ZXJuIHZvaWQgYXRhX3RmX3RvX2hvc3Rfbm9sb2NrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKK2V4dGVybiB2b2lkIHN3YXBfYnVmX2xlMTYodTE2ICpidWYsIHVuc2lnbmVkIGludCBidWZfd29yZHMpOworCisKKy8qIGxpYmF0YS1zY3NpLmMgKi8KK2V4dGVybiB2b2lkIGF0YV90b19zZW5zZV9lcnJvcihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCBkcnZfc3RhdCk7CitleHRlcm4gaW50IGF0YV9zY3NpX2Vycm9yKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV9zdGQoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pOworCitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3BfaW5xXzAwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pOworCitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3BfaW5xXzgwKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV84MyhzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9ub29wKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9zeW5jX2NhY2hlKHN0cnVjdCBhdGFfc2NzaV9hcmdzICphcmdzLCB1OCAqcmJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX21vZGVfc2Vuc2Uoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJCSAgdW5zaWduZWQgaW50IGJ1Zmxlbik7CitleHRlcm4gdW5zaWduZWQgaW50IGF0YV9zY3Npb3BfcmVhZF9jYXAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAorCQkJICAgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3Njc2lvcF9yZXBvcnRfbHVucyhzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywgdTggKnJidWYsCisJCQkJICAgdW5zaWduZWQgaW50IGJ1Zmxlbik7CitleHRlcm4gdm9pZCBhdGFfc2NzaV9iYWRjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAorCQkJICAgIHU4IGFzYywgdTggYXNjcSk7CitleHRlcm4gdm9pZCBhdGFfc2NzaV9yYnVmX2ZpbGwoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICgqYWN0b3IpIChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX2JhZF9zY3Npb3Aoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlhdGFfc2NzaV9iYWRjbWQoY21kLCBkb25lLCAweDIwLCAweDAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0YV9iYWRfY2RiKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJYXRhX3Njc2lfYmFkY21kKGNtZCwgZG9uZSwgMHgyNCwgMHgwMCk7Cit9CisKKyNlbmRpZiAvKiBfX0xJQkFUQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmMmExNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jCkBAIC0wLDAgKzEsNTgyIEBACisvKgorICogU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciB0aGUgNTNjOTQgU0NTSSBidXMgYWRhcHRvciBmb3VuZAorICogb24gUG93ZXIgTWFjaW50b3NoIGNvbXB1dGVycywgY29udHJvbGxpbmcgdGhlIGV4dGVybmFsIFNDU0kgY2hhaW4uCisgKiBXZSBhc3N1bWUgdGhlIDUzYzk0IGlzIGNvbm5lY3RlZCB0byBhIERCRE1BIChkZXNjcmlwdG9yLWJhc2VkIERNQSkKKyAqIGNvbnRyb2xsZXIuCisgKgorICogUGF1bCBNYWNrZXJyYXMsIEF1Z3VzdCAxOTk2LgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgIm1hYzUzYzk0LmgiCisKK2VudW0gZnNjX3BoYXNlIHsKKwlpZGxlLAorCXNlbGVjdGluZywKKwlkYXRhaW5nLAorCWNvbXBsZXRpbmcsCisJYnVzZnJlZWluZywKK307CisKK3N0cnVjdCBmc2Nfc3RhdGUgeworCXN0cnVjdAltYWM1M2M5NF9yZWdzIF9faW9tZW0gKnJlZ3M7CisJaW50CWludHI7CisJc3RydWN0CWRiZG1hX3JlZ3MgX19pb21lbSAqZG1hOworCWludAlkbWFpbnRyOworCWludAljbGtfZnJlcTsKKwlzdHJ1Y3QJU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBzY3NpX2NtbmQgKnJlcXVlc3RfcTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpyZXF1ZXN0X3F0YWlsOworCXN0cnVjdCBzY3NpX2NtbmQgKmN1cnJlbnRfcmVxOwkJLyogcmVxIHdlJ3JlIGN1cnJlbnRseSB3b3JraW5nIG9uICovCisJZW51bSBmc2NfcGhhc2UgcGhhc2U7CQkvKiB3aGF0IHdlJ3JlIGN1cnJlbnRseSB0cnlpbmcgdG8gZG8gKi8KKwlzdHJ1Y3QgZGJkbWFfY21kICpkbWFfY21kczsJLyogc3BhY2UgZm9yIGRiZG1hIGNvbW1hbmRzLCBhbGlnbmVkICovCisJdm9pZAkqZG1hX2NtZF9zcGFjZTsKKwlzdHJ1Y3QJcGNpX2RldiAqcGRldjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXN0cnVjdCBtYWNpb19kZXYgKm1kZXY7Cit9OworCitzdGF0aWMgdm9pZCBtYWM1M2M5NF9pbml0KHN0cnVjdCBmc2Nfc3RhdGUgKik7CitzdGF0aWMgdm9pZCBtYWM1M2M5NF9zdGFydChzdHJ1Y3QgZnNjX3N0YXRlICopOworc3RhdGljIHZvaWQgbWFjNTNjOTRfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19tYWM1M2M5NF9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgY21kX2RvbmUoc3RydWN0IGZzY19zdGF0ZSAqLCBpbnQgcmVzdWx0KTsKK3N0YXRpYyB2b2lkIHNldF9kbWFfY21kcyhzdHJ1Y3QgZnNjX3N0YXRlICosIHN0cnVjdCBzY3NpX2NtbmQgKik7CisKKworc3RhdGljIGludCBtYWM1M2M5NF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBmc2Nfc3RhdGUgKnN0YXRlOworCisjaWYgMAorCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICJtYWM1M2M5NF9xdWV1ZSAlcDogY29tbWFuZCBpcyIsIGNtZCk7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47ICsraSkKKwkJCXByaW50aygiICUuMngiLCBjbWQtPmNtbmRbaV0pOworCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHICJ1c2Vfc2c9JWQgcmVxdWVzdF9idWZmbGVuPSVkIHJlcXVlc3RfYnVmZmVyPSVwXG4iLAorCQkgICAgICAgY21kLT51c2Vfc2csIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwl9CisjZW5kaWYKKworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisJc3RhdGUgPSAoc3RydWN0IGZzY19zdGF0ZSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoc3RhdGUtPnJlcXVlc3RfcSA9PSBOVUxMKQorCQlzdGF0ZS0+cmVxdWVzdF9xID0gY21kOworCWVsc2UKKwkJc3RhdGUtPnJlcXVlc3RfcXRhaWwtPmhvc3Rfc2NyaWJibGUgPSAodm9pZCAqKSBjbWQ7CisJc3RhdGUtPnJlcXVlc3RfcXRhaWwgPSBjbWQ7CisKKwlpZiAoc3RhdGUtPnBoYXNlID09IGlkbGUpCisJCW1hYzUzYzk0X3N0YXJ0KHN0YXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hYzUzYzk0X2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgaW50IG1hYzUzYzk0X2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBmc2Nfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBmc2Nfc3RhdGUgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBtYWM1M2M5NF9yZWdzIF9faW9tZW0gKnJlZ3MgPSBzdGF0ZS0+cmVnczsKKwlzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWEgPSBzdGF0ZS0+ZG1hOworCisJd3JpdGVsKChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYsICZkbWEtPmNvbnRyb2wpOworCXdyaXRlYihDTURfU0NTSV9SRVNFVCwgJnJlZ3MtPmNvbW1hbmQpOwkvKiBhc3NlcnQgUlNUICovCisJdWRlbGF5KDEwMCk7CQkJLyogbGVhdmUgaXQgb24gZm9yIGEgd2hpbGUgKD49IDI1dXMpICovCisJd3JpdGViKENNRF9SRVNFVCwgJnJlZ3MtPmNvbW1hbmQpOworCXVkZWxheSgyMCk7CisJbWFjNTNjOTRfaW5pdChzdGF0ZSk7CisJd3JpdGViKENNRF9OT1AsICZyZWdzLT5jb21tYW5kKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWFjNTNjOTRfaW5pdChzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbWFjNTNjOTRfcmVncyBfX2lvbWVtICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hID0gc3RhdGUtPmRtYTsKKwlpbnQgeDsKKworCXdyaXRlYihzdGF0ZS0+aG9zdC0+dGhpc19pZCB8IENGMV9QQVJfRU5BQkxFLCAmcmVncy0+Y29uZmlnMSk7CisJd3JpdGViKFRJTU9fVkFMKDI1MCksICZyZWdzLT5zZWxfdGltZW91dCk7CS8qIDI1MG1zICovCisJd3JpdGViKENMS0ZfVkFMKHN0YXRlLT5jbGtfZnJlcSksICZyZWdzLT5jbGtfZmFjdG9yKTsKKwl3cml0ZWIoQ0YyX0ZFQVRVUkVfRU4sICZyZWdzLT5jb25maWcyKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPmNvbmZpZzMpOworCXdyaXRlYigwLCAmcmVncy0+c3luY19wZXJpb2QpOworCXdyaXRlYigwLCAmcmVncy0+c3luY19vZmZzZXQpOworCXggPSByZWFkYigmcmVncy0+aW50ZXJydXB0KTsKKwl3cml0ZWwoKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNiwgJmRtYS0+Y29udHJvbCk7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgbmV4dCBjb21tYW5kIGZvciBhIDUzQzk0LgorICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIG1hYzUzYzk0X3N0YXJ0KHN0cnVjdCBmc2Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgbWFjNTNjOTRfcmVncyBfX2lvbWVtICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJaW50IGk7CisKKwlpZiAoc3RhdGUtPnBoYXNlICE9IGlkbGUgfHwgc3RhdGUtPmN1cnJlbnRfcmVxICE9IE5VTEwpCisJCXBhbmljKCJpbmFwcHJvcHJpYXRlIG1hYzUzYzk0X3N0YXJ0IChzdGF0ZT0lcCkiLCBzdGF0ZSk7CisJaWYgKHN0YXRlLT5yZXF1ZXN0X3EgPT0gTlVMTCkKKwkJcmV0dXJuOworCXN0YXRlLT5jdXJyZW50X3JlcSA9IGNtZCA9IHN0YXRlLT5yZXF1ZXN0X3E7CisJc3RhdGUtPnJlcXVlc3RfcSA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKworCS8qIE9mZiB3ZSBnbyAqLworCXdyaXRlYigwLCAmcmVncy0+Y291bnRfbG8pOworCXdyaXRlYigwLCAmcmVncy0+Y291bnRfbWlkKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPmNvdW50X2hpKTsKKwl3cml0ZWIoQ01EX05PUCArIENNRF9ETUFfTU9ERSwgJnJlZ3MtPmNvbW1hbmQpOworCXVkZWxheSgxKTsKKwl3cml0ZWIoQ01EX0ZMVVNILCAmcmVncy0+Y29tbWFuZCk7CisJdWRlbGF5KDEpOworCXdyaXRlYihjbWQtPmRldmljZS0+aWQsICZyZWdzLT5kZXN0X2lkKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPnN5bmNfcGVyaW9kKTsKKwl3cml0ZWIoMCwgJnJlZ3MtPnN5bmNfb2Zmc2V0KTsKKworCS8qIGxvYWQgdGhlIGNvbW1hbmQgaW50byB0aGUgRklGTyAqLworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47ICsraSkKKwkJd3JpdGViKGNtZC0+Y21uZFtpXSwgJnJlZ3MtPmZpZm8pOworCisJLyogZG8gc2VsZWN0IHdpdGhvdXQgQVROIFhYWCAqLworCXdyaXRlYihDTURfU0VMRUNULCAmcmVncy0+Y29tbWFuZCk7CisJc3RhdGUtPnBoYXNlID0gc2VsZWN0aW5nOworCisJaWYgKGNtZC0+dXNlX3NnID4gMCB8fCBjbWQtPnJlcXVlc3RfYnVmZmxlbiAhPSAwKQorCQlzZXRfZG1hX2NtZHMoc3RhdGUsIGNtZCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19tYWM1M2M5NF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gKChzdHJ1Y3QgZnNjX3N0YXRlICopIGRldl9pZCktPmN1cnJlbnRfcmVxLT5kZXZpY2UtPmhvc3Q7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwltYWM1M2M5NF9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHB0cmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWFjNTNjOTRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwlzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZnNjX3N0YXRlICopIGRldl9pZDsKKwlzdHJ1Y3QgbWFjNTNjOTRfcmVncyBfX2lvbWVtICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hID0gc3RhdGUtPmRtYTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBzdGF0ZS0+Y3VycmVudF9yZXE7CisJaW50IG5iLCBzdGF0LCBzZXEsIGludHI7CisJc3RhdGljIGludCBtYWM1M2M5NF9lcnJvcnM7CisKKwkvKgorCSAqIEFwcGFyZW50bHksIHJlYWRpbmcgdGhlIGludGVycnVwdCByZWdpc3RlciB1bmxhdGNoZXMKKwkgKiB0aGUgc3RhdHVzIGFuZCBzZXF1ZW5jZSBzdGVwIHJlZ2lzdGVycy4KKwkgKi8KKwlzZXEgPSByZWFkYigmcmVncy0+c2Vxc3RlcCk7CisJc3RhdCA9IHJlYWRiKCZyZWdzLT5zdGF0dXMpOworCWludHIgPSByZWFkYigmcmVncy0+aW50ZXJydXB0KTsKKworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAibWFjNTNjOTRfaW50ciwgaW50cj0leCBzdGF0PSV4IHNlcT0leCBwaGFzZT0lZFxuIiwKKwkgICAgICAgaW50ciwgc3RhdCwgc2VxLCBzdGF0ZS0+cGhhc2UpOworI2VuZGlmCisKKwlpZiAoaW50ciAmIElOVFJfUkVTRVQpIHsKKwkJLyogU0NTSSBidXMgd2FzIHJlc2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gImV4dGVybmFsIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkXG4iKTsKKwkJd3JpdGViKENNRF9OT1AsICZyZWdzLT5jb21tYW5kKTsKKwkJd3JpdGVsKFJVTiA8PCAxNiwgJmRtYS0+Y29udHJvbCk7CS8qIHN0b3AgZG1hICovCisJCWNtZF9kb25lKHN0YXRlLCBESURfUkVTRVQgPDwgMTYpOworCQlyZXR1cm47CisJfQorCWlmIChpbnRyICYgSU5UUl9JTExfQ01EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiNTNjOTQ6IGludmFsaWQgY21kLCBpbnRyPSV4IHN0YXQ9JXggc2VxPSV4IHBoYXNlPSVkXG4iLAorCQkgICAgICAgaW50ciwgc3RhdCwgc2VxLCBzdGF0ZS0+cGhhc2UpOworCQljbWRfZG9uZShzdGF0ZSwgRElEX0VSUk9SIDw8IDE2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3RhdCAmIFNUQVRfRVJST1IpIHsKKyNpZiAwCisJCS8qIFhYWCB0aGVzZSBzZWVtIHRvIGJlIGhhcm1sZXNzPyAqLworCQlwcmludGsoIjUzYzk0OiBiYWQgZXJyb3IsIGludHI9JXggc3RhdD0leCBzZXE9JXggcGhhc2U9JWRcbiIsCisJCSAgICAgICBpbnRyLCBzdGF0LCBzZXEsIHN0YXRlLT5waGFzZSk7CisjZW5kaWYKKwkJKyttYWM1M2M5NF9lcnJvcnM7CisJCXdyaXRlYihDTURfTk9QICsgQ01EX0RNQV9NT0RFLCAmcmVncy0+Y29tbWFuZCk7CisJfQorCWlmIChjbWQgPT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiNTNjOTQ6IGludGVycnVwdCB3aXRoIG5vIGNvbW1hbmQgYWN0aXZlP1xuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXQgJiBTVEFUX1BBUklUWSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBwYXJpdHkgZXJyb3JcbiIpOworCQljbWRfZG9uZShzdGF0ZSwgRElEX1BBUklUWSA8PCAxNik7CisJCXJldHVybjsKKwl9CisJc3dpdGNoIChzdGF0ZS0+cGhhc2UpIHsKKwljYXNlIHNlbGVjdGluZzoKKwkJaWYgKGludHIgJiBJTlRSX0RJU0NPTk5FQ1QpIHsKKwkJCS8qIHNlbGVjdGlvbiB0aW1lZCBvdXQgKi8KKwkJCWNtZF9kb25lKHN0YXRlLCBESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGludHIgIT0gSU5UUl9CVVNfU0VSViArIElOVFJfRE9ORSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImdvdCBpbnRyICV4IGR1cmluZyBzZWxlY3Rpb25cbiIsIGludHIpOworCQkJY21kX2RvbmUoc3RhdGUsIERJRF9FUlJPUiA8PCAxNik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChzZXEgJiBTU19NQVNLKSAhPSBTU19ET05FKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2VxIHN0ZXAgJXggYWZ0ZXIgY29tbWFuZFxuIiwgc2VxKTsKKwkJCWNtZF9kb25lKHN0YXRlLCBESURfRVJST1IgPDwgMTYpOworCQkJcmV0dXJuOworCQl9CisJCXdyaXRlYihDTURfTk9QLCAmcmVncy0+Y29tbWFuZCk7CisJCS8qIHNldCBETUEgY29udHJvbGxlciBnb2luZyBpZiBhbnkgZGF0YSB0byB0cmFuc2ZlciAqLworCQlpZiAoKHN0YXQgJiAoU1RBVF9NU0d8U1RBVF9DRCkpID09IDAKKwkJICAgICYmIChjbWQtPnVzZV9zZyA+IDAgfHwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkpIHsKKwkJCW5iID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKKwkJCWlmIChuYiA+IDB4ZmZmMCkKKwkJCQluYiA9IDB4ZmZmMDsKKwkJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gbmI7CisJCQl3cml0ZWIobmIsICZyZWdzLT5jb3VudF9sbyk7CisJCQl3cml0ZWIobmIgPj4gOCwgJnJlZ3MtPmNvdW50X21pZCk7CisJCQl3cml0ZWIoQ01EX0RNQV9NT0RFICsgQ01EX05PUCwgJnJlZ3MtPmNvbW1hbmQpOworCQkJd3JpdGVsKHZpcnRfdG9fcGh5cyhzdGF0ZS0+ZG1hX2NtZHMpLCAmZG1hLT5jbWRwdHIpOworCQkJd3JpdGVsKChSVU4gPDwgMTYpIHwgUlVOLCAmZG1hLT5jb250cm9sKTsKKwkJCXdyaXRlYihDTURfRE1BX01PREUgKyBDTURfWEZFUl9EQVRBLCAmcmVncy0+Y29tbWFuZCk7CisJCQlzdGF0ZS0+cGhhc2UgPSBkYXRhaW5nOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKHN0YXQgJiBTVEFUX1BIQVNFKSA9PSBTVEFUX0NEICsgU1RBVF9JTykgeworCQkJLyogdXAgdG8gc3RhdHVzIHBoYXNlIGFscmVhZHkgKi8KKwkJCXdyaXRlYihDTURfSV9DT01QTEVURSwgJnJlZ3MtPmNvbW1hbmQpOworCQkJc3RhdGUtPnBoYXNlID0gY29tcGxldGluZzsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpbiB1bmV4cGVjdGVkIHBoYXNlICV4IGFmdGVyIGNtZFxuIiwKKwkJCSAgICAgICBzdGF0ICYgU1RBVF9QSEFTRSk7CisJCQljbWRfZG9uZShzdGF0ZSwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZGF0YWluZzoKKwkJaWYgKGludHIgIT0gSU5UUl9CVVNfU0VSVikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImdvdCBpbnRyICV4IGJlZm9yZSBzdGF0dXNcbiIsIGludHIpOworCQkJY21kX2RvbmUoc3RhdGUsIERJRF9FUlJPUiA8PCAxNik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgIT0gMAorCQkgICAgJiYgKHN0YXQgJiAoU1RBVF9NU0d8U1RBVF9DRCkpID09IDApIHsKKwkJCS8qIFNldCB1cCB0aGUgY291bnQgcmVncyB0byB0cmFuc2ZlciBtb3JlICovCisJCQluYiA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCQlpZiAobmIgPiAweGZmZjApCisJCQkJbmIgPSAweGZmZjA7CisJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IG5iOworCQkJd3JpdGViKG5iLCAmcmVncy0+Y291bnRfbG8pOworCQkJd3JpdGViKG5iID4+IDgsICZyZWdzLT5jb3VudF9taWQpOworCQkJd3JpdGViKENNRF9ETUFfTU9ERSArIENNRF9OT1AsICZyZWdzLT5jb21tYW5kKTsKKwkJCXdyaXRlYihDTURfRE1BX01PREUgKyBDTURfWEZFUl9EQVRBLCAmcmVncy0+Y29tbWFuZCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHN0YXQgJiBTVEFUX1BIQVNFKSAhPSBTVEFUX0NEICsgU1RBVF9JTykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImludHIgJXggYmVmb3JlIGRhdGEgeGZlciBjb21wbGV0ZVxuIiwgaW50cik7CisJCX0KKwkJd3JpdGVsKFJVTiA8PCAxNiwgJmRtYS0+Y29udHJvbCk7CS8qIHN0b3AgZG1hICovCisJCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCQlwY2lfdW5tYXBfc2coc3RhdGUtPnBkZXYsCisJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJY21kLT51c2Vfc2csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJcGNpX3VubWFwX3NpbmdsZShzdGF0ZS0+cGRldiwgc3RhdGUtPmRtYV9hZGRyLAorCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJfQorCQkvKiBzaG91bGQgY2hlY2sgZG1hIHN0YXR1cyAqLworCQl3cml0ZWIoQ01EX0lfQ09NUExFVEUsICZyZWdzLT5jb21tYW5kKTsKKwkJc3RhdGUtPnBoYXNlID0gY29tcGxldGluZzsKKwkJYnJlYWs7CisJY2FzZSBjb21wbGV0aW5nOgorCQlpZiAoaW50ciAhPSBJTlRSX0RPTkUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJnb3QgaW50ciAleCBvbiBjb21wbGV0aW9uXG4iLCBpbnRyKTsKKwkJCWNtZF9kb25lKHN0YXRlLCBESURfRVJST1IgPDwgMTYpOworCQkJcmV0dXJuOworCQl9CisJCWNtZC0+U0NwLlN0YXR1cyA9IHJlYWRiKCZyZWdzLT5maWZvKTsKKwkJY21kLT5TQ3AuTWVzc2FnZSA9IHJlYWRiKCZyZWdzLT5maWZvKTsKKwkJY21kLT5yZXN1bHQgPSBDTURfQUNDRVBUX01TRzsKKwkJd3JpdGViKENNRF9BQ0NFUFRfTVNHLCAmcmVncy0+Y29tbWFuZCk7CisJCXN0YXRlLT5waGFzZSA9IGJ1c2ZyZWVpbmc7CisJCWJyZWFrOworCWNhc2UgYnVzZnJlZWluZzoKKwkJaWYgKGludHIgIT0gSU5UUl9ESVNDT05ORUNUKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZ290IGludHIgJXggd2hlbiBleHBlY3RlZCBkaXNjb25uZWN0XG4iLCBpbnRyKTsKKwkJfQorCQljbWRfZG9uZShzdGF0ZSwgKERJRF9PSyA8PCAxNikgKyAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KQorCQkJICsgY21kLT5TQ3AuU3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgImRvbid0IGtub3cgYWJvdXQgcGhhc2UgJWRcbiIsIHN0YXRlLT5waGFzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbWRfZG9uZShzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZSwgaW50IHJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwljbWQgPSBzdGF0ZS0+Y3VycmVudF9yZXE7CisJaWYgKGNtZCAhPSAwKSB7CisJCWNtZC0+cmVzdWx0ID0gcmVzdWx0OworCQkoKmNtZC0+c2NzaV9kb25lKShjbWQpOworCQlzdGF0ZS0+Y3VycmVudF9yZXEgPSBOVUxMOworCX0KKwlzdGF0ZS0+cGhhc2UgPSBpZGxlOworCW1hYzUzYzk0X3N0YXJ0KHN0YXRlKTsKK30KKworLyoKKyAqIFNldCB1cCBETUEgY29tbWFuZHMgZm9yIHRyYW5zZmVycmluZyBkYXRhLgorICovCitzdGF0aWMgdm9pZCBzZXRfZG1hX2NtZHMoc3RydWN0IGZzY19zdGF0ZSAqc3RhdGUsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQgaSwgZG1hX2NtZCwgdG90YWw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2w7CisJc3RydWN0IGRiZG1hX2NtZCAqZGNtZHM7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1MzIgZG1hX2xlbjsKKworCWRtYV9jbWQgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UgPworCQkJT1VUUFVUX01PUkUgOiBJTlBVVF9NT1JFOworCWRjbWRzID0gc3RhdGUtPmRtYV9jbWRzOworCWlmIChjbWQtPnVzZV9zZyA+IDApIHsKKwkJaW50IG5zZWc7CisKKwkJdG90YWwgPSAwOworCQlzY2wgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+YnVmZmVyOworCQluc2VnID0gcGNpX21hcF9zZyhzdGF0ZS0+cGRldiwgc2NsLCBjbWQtPnVzZV9zZywKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJZm9yIChpID0gMDsgaSA8IG5zZWc7ICsraSkgeworCQkJZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzY2wpOworCQkJZG1hX2xlbiA9IHNnX2RtYV9sZW4oc2NsKTsKKwkJCWlmIChkbWFfbGVuID4gMHhmZmZmKQorCQkJCXBhbmljKCJtYWM1M2M5NDogc2NhdHRlcmxpc3QgZWxlbWVudCA+PSA2NGsiKTsKKwkJCXRvdGFsICs9IGRtYV9sZW47CisJCQlzdF9sZTE2KCZkY21kcy0+cmVxX2NvdW50LCBkbWFfbGVuKTsKKwkJCXN0X2xlMTYoJmRjbWRzLT5jb21tYW5kLCBkbWFfY21kKTsKKwkJCXN0X2xlMzIoJmRjbWRzLT5waHlfYWRkciwgZG1hX2FkZHIpOworCQkJZGNtZHMtPnhmZXJfc3RhdHVzID0gMDsKKwkJCSsrc2NsOworCQkJKytkY21kczsKKwkJfQorCX0gZWxzZSB7CisJCXRvdGFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWlmICh0b3RhbCA+IDB4ZmZmZikKKwkJCXBhbmljKCJtYWM1M2M5NDogdHJhbnNmZXIgc2l6ZSA+PSA2NGsiKTsKKwkJZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShzdGF0ZS0+cGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJICB0b3RhbCwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXN0YXRlLT5kbWFfYWRkciA9IGRtYV9hZGRyOworCQlzdF9sZTE2KCZkY21kcy0+cmVxX2NvdW50LCB0b3RhbCk7CisJCXN0X2xlMzIoJmRjbWRzLT5waHlfYWRkciwgZG1hX2FkZHIpOworCQlkY21kcy0+eGZlcl9zdGF0dXMgPSAwOworCQkrK2RjbWRzOworCX0KKwlkbWFfY21kICs9IE9VVFBVVF9MQVNUIC0gT1VUUFVUX01PUkU7CisJc3RfbGUxNigmZGNtZHNbLTFdLmNvbW1hbmQsIGRtYV9jbWQpOworCXN0X2xlMTYoJmRjbWRzLT5jb21tYW5kLCBEQkRNQV9TVE9QKTsKKwljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gdG90YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG1hYzUzYzk0X3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJPSAiNTNjOTQiLAorCS5uYW1lCQk9ICI1M0M5NCIsCisJLnF1ZXVlY29tbWFuZAk9IG1hYzUzYzk0X3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyID0gbWFjNTNjOTRfYWJvcnQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IG1hYzUzYzk0X2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQk9IDEsCisJLnRoaXNfaWQJPSA3LAorCS5zZ190YWJsZXNpemUJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCitzdGF0aWMgaW50IG1hYzUzYzk0X3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtYWNpb19nZXRfcGNpX2RldihtZGV2KTsKKwlzdHJ1Y3QgZnNjX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXZvaWQgKmRtYV9jbWRfc3BhY2U7CisJdW5zaWduZWQgY2hhciAqY2xrcHJvcDsKKwlpbnQgcHJvcGxlbjsKKworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSAhPSAyIHx8IG1hY2lvX2lycV9jb3VudChtZGV2KSAhPSAyKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWFjNTNjOTQ6IGV4cGVjdGVkIDIgYWRkcnMgYW5kIGludHJzIChnb3QgJWQvJWQpXG4iLAorCQkgICAgICAgbm9kZS0+bl9hZGRycywgbm9kZS0+bl9pbnRycyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlcyhtZGV2LCAibWFjNTNjOTQiKSAhPSAwKSB7CisgICAgICAgCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiB1bmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVzb3VyY2VzIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisgICAgICAgCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJm1hYzUzYzk0X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGZzY19zdGF0ZSkpOworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWM1M2M5NDogY291bGRuJ3QgcmVnaXN0ZXIgaG9zdCIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCXN0YXRlID0gKHN0cnVjdCBmc2Nfc3RhdGUgKikgaG9zdC0+aG9zdGRhdGE7CisJbWFjaW9fc2V0X2RydmRhdGEobWRldiwgc3RhdGUpOworCXN0YXRlLT5ob3N0ID0gaG9zdDsKKwlzdGF0ZS0+cGRldiA9IHBkZXY7CisJc3RhdGUtPm1kZXYgPSBtZGV2OworCisJc3RhdGUtPnJlZ3MgPSAoc3RydWN0IG1hYzUzYzk0X3JlZ3MgX19pb21lbSAqKQorCQlpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApLCAweDEwMDApOworCXN0YXRlLT5pbnRyID0gbWFjaW9faXJxKG1kZXYsIDApOworCXN0YXRlLT5kbWEgPSAoc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqKQorCQlpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDEpLCAweDEwMDApOworCXN0YXRlLT5kbWFpbnRyID0gbWFjaW9faXJxKG1kZXYsIDEpOworCWlmIChzdGF0ZS0+cmVncyA9PSBOVUxMIHx8IHN0YXRlLT5kbWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hYzUzYzk0OiBpb3JlbWFwIGZhaWxlZCBmb3IgJXNcbiIsCisJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworICAgICAgIAljbGtwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAmcHJvcGxlbik7CisgICAgICAgCWlmIChjbGtwcm9wID09IE5VTEwgfHwgcHJvcGxlbiAhPSBzaXplb2YoaW50KSkgeworICAgICAgIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IGNsb2NrIGZyZXF1ZW5jeSwgIgorICAgICAgIAkJICAgICAgICJhc3N1bWluZyAyNU1IelxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKyAgICAgICAJCXN0YXRlLT5jbGtfZnJlcSA9IDI1MDAwMDAwOworICAgICAgIAl9IGVsc2UKKyAgICAgICAJCXN0YXRlLT5jbGtfZnJlcSA9ICooaW50ICopY2xrcHJvcDsKKworICAgICAgIAkvKiBTcGFjZSBmb3IgZG1hIGNvbW1hbmQgbGlzdDogKzEgZm9yIHN0b3AgY29tbWFuZCwKKyAgICAgICAJICogKzEgdG8gYWxsb3cgZm9yIGFsaWduaW5nLgorCSAqIFhYWCBGSVhNRTogVXNlIERNQSBjb25zaXN0ZW50IHJvdXRpbmVzCisJICovCisgICAgICAgCWRtYV9jbWRfc3BhY2UgPSBrbWFsbG9jKChob3N0LT5zZ190YWJsZXNpemUgKyAyKSAqCisgICAgICAgCQkJCXNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgCWlmIChkbWFfY21kX3NwYWNlID09IDApIHsKKyAgICAgICAJCXByaW50ayhLRVJOX0VSUiAibWFjNTNjOTQ6IGNvdWxkbid0IGFsbG9jYXRlIGRtYSAiCisgICAgICAgCQkgICAgICAgImNvbW1hbmQgc3BhY2UgZm9yICVzXG4iLCBub2RlLT5mdWxsX25hbWUpOworICAgICAgIAkJZ290byBvdXRfZnJlZTsKKyAgICAgICAJfQorCXN0YXRlLT5kbWFfY21kcyA9IChzdHJ1Y3QgZGJkbWFfY21kICopREJETUFfQUxJR04oZG1hX2NtZF9zcGFjZSk7CisJbWVtc2V0KHN0YXRlLT5kbWFfY21kcywgMCwgKGhvc3QtPnNnX3RhYmxlc2l6ZSArIDEpCisJICAgICAgICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlzdGF0ZS0+ZG1hX2NtZF9zcGFjZSA9IGRtYV9jbWRfc3BhY2U7CisKKwltYWM1M2M5NF9pbml0KHN0YXRlKTsKKworCWlmIChyZXF1ZXN0X2lycShzdGF0ZS0+aW50ciwgZG9fbWFjNTNjOTRfaW50ZXJydXB0LCAwLCAiNTNDOTQiLCBzdGF0ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWM1M0M5NDogY2FuJ3QgZ2V0IGlycSAlZCBmb3IgJXNcbiIsCisJCSAgICAgICBzdGF0ZS0+aW50ciwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZ290byBvdXRfZnJlZV9kbWE7CisJfQorCisJLyogWFhYIEZJWE1FOiBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfYWRkX2hvc3QoaG9zdCwgJm1kZXYtPm9mZGV2LmRldik7CisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX2RtYToKKwlrZnJlZShzdGF0ZS0+ZG1hX2NtZF9zcGFjZSk7Cisgb3V0X2ZyZWU6CisJaWYgKHN0YXRlLT5kbWEgIT0gTlVMTCkKKwkJaW91bm1hcChzdGF0ZS0+ZG1hKTsKKwlpZiAoc3RhdGUtPnJlZ3MgIT0gTlVMTCkKKwkJaW91bm1hcChzdGF0ZS0+cmVncyk7CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKyBvdXRfcmVsZWFzZToKKwltYWNpb19yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKKworCXJldHVybiAgLUVOT0RFVjsKK30KKworc3RhdGljIGludCBtYWM1M2M5NF9yZW1vdmUoc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgZnNjX3N0YXRlICpmcCA9IChzdHJ1Y3QgZnNjX3N0YXRlICopbWFjaW9fZ2V0X2RydmRhdGEobWRldik7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGZwLT5ob3N0OworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKworCWZyZWVfaXJxKGZwLT5pbnRyLCBmcCk7CisKKwlpZiAoZnAtPnJlZ3MpCisJCWlvdW5tYXAoKHZvaWQgKikgZnAtPnJlZ3MpOworCWlmIChmcC0+ZG1hKQorCQlpb3VubWFwKCh2b2lkICopIGZwLT5kbWEpOworCWtmcmVlKGZwLT5kbWFfY21kX3NwYWNlKTsKKworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKKwltYWNpb19yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWFjNTNjOTRfbWF0Y2hbXSA9IAoreworCXsKKwkubmFtZSAJCT0gIjUzYzk0IiwKKwkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCisJLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgbWFjNTNjOTRfZHJpdmVyID0gCit7CisJLm5hbWUgCQk9ICJtYWM1M2M5NCIsCisJLm1hdGNoX3RhYmxlCT0gbWFjNTNjOTRfbWF0Y2gsCisJLnByb2JlCQk9IG1hYzUzYzk0X3Byb2JlLAorCS5yZW1vdmUJCT0gbWFjNTNjOTRfcmVtb3ZlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21hYzUzYzk0KHZvaWQpCit7CisJcmV0dXJuIG1hY2lvX3JlZ2lzdGVyX2RyaXZlcigmbWFjNTNjOTRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWFjNTNjOTQodm9pZCkKK3sKKwlyZXR1cm4gbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJm1hYzUzYzk0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWFjNTNjOTQpOworbW9kdWxlX2V4aXQoZXhpdF9tYWM1M2M5NCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXJNYWMgNTNjOTQgU0NTSSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hYzUzYzk0LmggYi9kcml2ZXJzL3Njc2kvbWFjNTNjOTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQyNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBtYWM1M2M5NC5oOiBkZWZpbml0aW9ucyBmb3IgdGhlIGRyaXZlciBmb3IgdGhlIDUzYzk0IFNDU0kgYnVzIGFkYXB0b3IKKyAqIGZvdW5kIG9uIFBvd2VyIE1hY2ludG9zaCBjb21wdXRlcnMsIGNvbnRyb2xsaW5nIHRoZSBleHRlcm5hbCBTQ1NJIGNoYWluLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KKyAqLworI2lmbmRlZiBfTUFDNTNDOTRfSAorI2RlZmluZSBfTUFDNTNDOTRfSAorCisvKgorICogUmVnaXN0ZXJzIGluIHRoZSA1M0M5NCBjb250cm9sbGVyLgorICovCisKK3N0cnVjdCBtYWM1M2M5NF9yZWdzIHsKKwl1bnNpZ25lZCBjaGFyCWNvdW50X2xvOworCWNoYXIgcGFkMFsxNV07CisJdW5zaWduZWQgY2hhcgljb3VudF9taWQ7CisJY2hhciBwYWQxWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWZpZm87CisJY2hhciBwYWQyWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNvbW1hbmQ7CisJY2hhciBwYWQzWzE1XTsKKwl1bnNpZ25lZCBjaGFyCXN0YXR1czsKKwljaGFyIHBhZDRbMTVdOworCXVuc2lnbmVkIGNoYXIJaW50ZXJydXB0OworCWNoYXIgcGFkNVsxNV07CisJdW5zaWduZWQgY2hhcglzZXFzdGVwOworCWNoYXIgcGFkNlsxNV07CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwljaGFyIHBhZDdbMTVdOworCXVuc2lnbmVkIGNoYXIJY29uZmlnMTsKKwljaGFyIHBhZDhbMTVdOworCXVuc2lnbmVkIGNoYXIJY2xrX2ZhY3RvcjsKKwljaGFyIHBhZDlbMTVdOworCXVuc2lnbmVkIGNoYXIJdGVzdDsKKwljaGFyIHBhZDEwWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNvbmZpZzI7CisJY2hhciBwYWQxMVsxNV07CisJdW5zaWduZWQgY2hhcgljb25maWczOworCWNoYXIgcGFkMTJbMTVdOworCXVuc2lnbmVkIGNoYXIJY29uZmlnNDsKKwljaGFyIHBhZDEzWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWNvdW50X2hpOworCWNoYXIgcGFkMTRbMTVdOworCXVuc2lnbmVkIGNoYXIJZmlmb19yZXM7CisJY2hhciBwYWQxNVsxNV07Cit9OworCisvKgorICogQWx0ZXJuYXRlIGZ1bmN0aW9ucyBmb3Igc29tZSByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgZGVzdF9pZAkJc3RhdHVzCisjZGVmaW5lIHNlbF90aW1lb3V0CWludGVycnVwdAorI2RlZmluZSBzeW5jX3BlcmlvZAlzZXFzdGVwCisjZGVmaW5lIHN5bmNfb2Zmc2V0CWZsYWdzCisKKy8qCisgKiBCaXRzIGluIGNvbW1hbmQgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ01EX0RNQV9NT0RFCTB4ODAKKyNkZWZpbmUgQ01EX01PREVfTUFTSwkweDcwCisjZGVmaW5lIENNRF9NT0RFX0lOSVQJMHgxMAorI2RlZmluZSBDTURfTU9ERV9UQVJHCTB4MjAKKyNkZWZpbmUgQ01EX01PREVfRElTQwkweDQwCisKKyNkZWZpbmUgQ01EX05PUAkJMAorI2RlZmluZSBDTURfRkxVU0gJMQorI2RlZmluZSBDTURfUkVTRVQJMgorI2RlZmluZSBDTURfU0NTSV9SRVNFVAkzCisKKyNkZWZpbmUgQ01EX1hGRVJfREFUQQkweDEwCisjZGVmaW5lIENNRF9JX0NPTVBMRVRFCTB4MTEKKyNkZWZpbmUgQ01EX0FDQ0VQVF9NU0cJMHgxMgorI2RlZmluZSBDTURfWEZFUl9QQUQJMHgxOAorI2RlZmluZSBDTURfU0VUX0FUTgkweDFhCisjZGVmaW5lIENNRF9DTFJfQVROCTB4MWIKKworI2RlZmluZSBDTURfU0VORF9NU0cJMHgyMAorI2RlZmluZSBDTURfU0VORF9TVEFUVVMJMHgyMQorI2RlZmluZSBDTURfU0VORF9EQVRBCTB4MjIKKyNkZWZpbmUgQ01EX0RJU0NfU0VRCTB4MjMKKyNkZWZpbmUgQ01EX1RFUk1JTkFURQkweDI0CisjZGVmaW5lIENNRF9UX0NPTVBMRVRFCTB4MjUKKyNkZWZpbmUgQ01EX0RJU0NPTk5FQ1QJMHgyNworI2RlZmluZSBDTURfUkVDVl9NU0cJMHgyOAorI2RlZmluZSBDTURfUkVDVl9DREIJMHgyOQorI2RlZmluZSBDTURfUkVDVl9EQVRBCTB4MmEKKyNkZWZpbmUgQ01EX1JFQ1ZfQ01ECTB4MmIKKyNkZWZpbmUgQ01EX0FCT1JUX0RNQQkweDA0CisKKyNkZWZpbmUgQ01EX1JFU0VMRUNUCTB4NDAKKyNkZWZpbmUgQ01EX1NFTEVDVAkweDQxCisjZGVmaW5lIENNRF9TRUxFQ1RfQVROCTB4NDIKKyNkZWZpbmUgQ01EX1NFTEFUTl9TVE9QCTB4NDMKKyNkZWZpbmUgQ01EX0VOQUJMRV9TRUwJMHg0NAorI2RlZmluZSBDTURfRElTQUJMRV9TRUwJMHg0NQorI2RlZmluZSBDTURfU0VMX0FUTjMJMHg0NgorI2RlZmluZSBDTURfUkVTRUxfQVROMwkweDQ3CisKKy8qCisgKiBCaXRzIGluIHN0YXR1cyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTVEFUX0lSUQkweDgwCisjZGVmaW5lIFNUQVRfRVJST1IJMHg0MAorI2RlZmluZSBTVEFUX1BBUklUWQkweDIwCisjZGVmaW5lIFNUQVRfVENfWkVSTwkweDEwCisjZGVmaW5lIFNUQVRfRE9ORQkweDA4CisjZGVmaW5lIFNUQVRfUEhBU0UJMHgwNworI2RlZmluZSBTVEFUX01TRwkweDA0CisjZGVmaW5lIFNUQVRfQ0QJCTB4MDIKKyNkZWZpbmUgU1RBVF9JTwkJMHgwMQorCisvKgorICogQml0cyBpbiBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSU5UUl9SRVNFVAkweDgwCS8qIFNDU0kgYnVzIHdhcyByZXNldCAqLworI2RlZmluZSBJTlRSX0lMTF9DTUQJMHg0MAkvKiBpbGxlZ2FsIGNvbW1hbmQgKi8KKyNkZWZpbmUgSU5UUl9ESVNDT05ORUNUCTB4MjAJLyogd2UgZ290IGRpc2Nvbm5lY3RlZCAqLworI2RlZmluZSBJTlRSX0JVU19TRVJWCTB4MTAJLyogYnVzIHNlcnZpY2UgcmVxdWVzdGVkICovCisjZGVmaW5lIElOVFJfRE9ORQkweDA4CS8qIGZ1bmN0aW9uIGNvbXBsZXRlZCAqLworI2RlZmluZSBJTlRSX1JFU0VMRUNURUQJMHgwNAkvKiB3ZSB3ZXJlIHJlc2VsZWN0ZWQgKi8KKyNkZWZpbmUgSU5UUl9TRUxfQVROCTB4MDIJLyogd2Ugd2VyZSBzZWxlY3RlZCwgQVROIGFzc2VydGVkICovCisjZGVmaW5lIElOVFJfU0VMRUNUCTB4MDEJLyogd2Ugd2VyZSBzZWxlY3RlZCwgQVROIG5lZ2F0ZWQgKi8KKworLyoKKyAqIEVuY29kaW5nIGZvciB0aGUgc2VsZWN0IHRpbWVvdXQuCisgKi8KKyNkZWZpbmUgVElNT19WQUwoeCkJKCh4KSAqIDUwMDAgLyA3NjgyKQorCisvKgorICogQml0cyBpbiBzZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNTX01BU0sJCTcKKyNkZWZpbmUgU1NfQVJCX1NFTAkwCS8qIFNlbGVjdGlvbiAmIGFyYml0cmF0aW9uIGNvbXBsZXRlICovCisjZGVmaW5lIFNTX01TR19TRU5UCTEJLyogT25lIG1lc3NhZ2UgYnl0ZSBzZW50ICovCisjZGVmaW5lIFNTX05PVF9DTUQJMgkvKiBOb3QgaW4gY29tbWFuZCBwaGFzZSAqLworI2RlZmluZSBTU19QSEFTRV9DSEcJMwkvKiBFYXJseSBwaGFzZSBjaGFuZ2UsIGNtZCBieXRlcyBsb3N0ICovCisjZGVmaW5lIFNTX0RPTkUJCTQJLyogQ29tbWFuZCB3YXMgc2VudCBPSyAqLworCisvKgorICogRW5jb2RpbmcgZm9yIHN5bmMgdHJhbnNmZXIgcGVyaW9kLgorICovCisjZGVmaW5lIFNZTkNQX01BU0sJMHgxZgorI2RlZmluZSBTWU5DUF9NSU4JNAorI2RlZmluZSBTWU5DUF9NQVgJMzEKKworLyoKKyAqIEJpdHMgaW4gZmxhZ3MgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRkxBR1NfRklGT19MRVYJMHgxZgorI2RlZmluZSBGTEFHU19TRVFfU1RFUAkweGUwCisKKy8qCisgKiBFbmNvZGluZyBmb3Igc3luYyBvZmZzZXQuCisgKi8KKyNkZWZpbmUgU1lOQ09fTUFTSwkweDBmCisjZGVmaW5lIFNZTkNPX0FTU19DVFJMCTB4MzAJLyogUkVRL0FDSyBhc3NlcnRpb24gY29udHJvbCAqLworI2RlZmluZSBTWU5DT19ORUdfQ1RSTAkweGMwCS8qIFJFUS9BQ0sgbmVnYXRpb24gY29udHJvbCAqLworCisvKgorICogQml0cyBpbiBjb25maWcxIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENGMV9TTE9XX0NBQkxFCTB4ODAJLyogU2xvdyBjYWJsZSBtb2RlICovCisjZGVmaW5lIENGMV9OT19SRVNfUkVQCTB4NDAJLyogRGlzYWJsZSBTQ1NJIHJlc2V0IHJlcG9ydHMgKi8KKyNkZWZpbmUgQ0YxX1BBUl9URVNUCTB4MjAJLyogUGFyaXR5IHRlc3QgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgQ0YxX1BBUl9FTkFCTEUJMHgxMAkvKiBFbmFibGUgcGFyaXR5IGNoZWNrcyAqLworI2RlZmluZSBDRjFfVEVTVAkweDA4CS8qIENoaXAgdGVzdHMgKi8KKyNkZWZpbmUgQ0YxX01ZX0lECTB4MDcJLyogQ29udHJvbGxlcidzIGFkZHJlc3Mgb24gYnVzICovCisKKy8qCisgKiBFbmNvZGluZyBmb3IgY2xrX2ZhY3RvciByZWdpc3Rlci4KKyAqLworI2RlZmluZSBDTEtGX01BU0sJNworI2RlZmluZSBDTEtGX1ZBTChmcmVxKQkoKCgoZnJlcSkgKyA0OTk5OTk5KSAvIDUwMDAwMDApICYgQ0xLRl9NQVNLKQorCisvKgorICogQml0cyBpbiB0ZXN0IG1vZGUgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgVEVTVF9UQVJHRVQJMQkvKiB0YXJnZXQgdGVzdCBtb2RlICovCisjZGVmaW5lIFRFU1RfSU5JVElBVE9SCTIJLyogaW5pdGlhdG9yIHRlc3QgbW9kZSAqLworI2RlZmluZSBURVNUX1RSSVNUQVRFCTQJLyogdHJpc3RhdGUgKGhpLXopIHRlc3QgbW9kZSAqLworCisvKgorICogQml0cyBpbiBjb25maWcyIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENGMl9SRkIJCTB4ODAKKyNkZWZpbmUgQ0YyX0ZFQVRVUkVfRU4JMHg0MAkvKiBlbmFibGUgZmVhdHVyZXMgLyBwaGFzZSBsYXRjaCAqLworI2RlZmluZSBDRjJfQllURUNUUkwJMHgyMAorI2RlZmluZSBDRjJfRFJFUV9ISVoJMHgxMAorI2RlZmluZSBDRjJfU0NTSTIJMHgwOAorI2RlZmluZSBDRjJfUEFSX0FCT1JUCTB4MDQJLyogYmFkIHBhcml0eSB0YXJnZXQgYWJvcnQgKi8KKyNkZWZpbmUgQ0YyX1JFR19QQVJFUlIJMHgwMgkvKiByZWdpc3RlciBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgQ0YyX0RNQV9QQVJFUlIJMHgwMQkvKiBETUEgcGFyaXR5IGVycm9yICovCisKKy8qCisgKiBCaXRzIGluIHRoZSBjb25maWczIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENGM19JRF9NU0dfQ0hLCTB4ODAKKyNkZWZpbmUgQ0YzXzNCX01TR1MJMHg0MAorI2RlZmluZSBDRjNfQ0RCMTAJMHgyMAorI2RlZmluZSBDRjNfRkFTVFNDU0kJMHgxMAkvKiBlbmFibGUgZmFzdCBTQ1NJIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ0YzX0ZBU1RDTE9DSwkweDA4CisjZGVmaW5lIENGM19TQVZFUkVTSUQJMHgwNAorI2RlZmluZSBDRjNfQUxUX0RNQQkweDAyCisjZGVmaW5lIENGM19USFJFU0hfOAkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBjb25maWc0IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIENGNF9FQU4JCTB4MDQKKyNkZWZpbmUgQ0Y0X1RFU1QJMHgwMgorI2RlZmluZSBDRjRfQkJURQkweDAxCisKKyNlbmRpZiAvKiBfTUFDNTNDOTRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hY19lc3AuYyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0YzhkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qCisgKiA2OGsgbWFjIDUzYzlbNDZdIHNjc2kgZHJpdmVyCisgKgorICogY29weXJpZ2h0IChjKSAxOTk4LCBEYXZpZCBXZWlzIHdlaXNkMzQ1OEB1bmkuZWR1CisgKgorICogZGVidWdnaW5nIG9uIFF1YWRyYSA4MDAgYW5kIDY2MEFWIE1pY2hhZWwgU2NobWl0eiwgRGF2ZSBLaWx6ZXIgNy85OAorICoKKyAqIGJhc2VkIGxvb3NlbHkgb24gY3liZXJfZXNwLmMKKyAqLworCisvKiB0aGVzZSBhcmUgdW51c2VkIGZvciBub3cgKi8KKyNkZWZpbmUgbXlyZWFkbChhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKQorI2RlZmluZSBteXdyaXRlbChiLCBhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgorI2luY2x1ZGUgPGFzbS9tYWNody5oPgorI2luY2x1ZGUgPGFzbS9tYWNfdmlhLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2ludG9zaC5oPgorCisvKiAjZGVmaW5lIERFQlVHX01BQ19FU1AgKi8KKworI2RlZmluZSBtYWNfdHVybm9uX2lycSh4KQltYWNfZW5hYmxlX2lycSh4KQorI2RlZmluZSBtYWNfdHVybm9mZl9pcnEoeCkJbWFjX2Rpc2FibGVfaXJxKHgpCisKK2V4dGVybiB2b2lkIGVzcF9oYW5kbGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitleHRlcm4gdm9pZCBtYWNfZXNwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpOworCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgaW50IGZpZm9fY291bnQpOworc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBjaGFyICogdmFkZHJlc3MsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKiBlc3AsIGNoYXIgKiB2YWRkcmVzcywgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKiBlc3ApOworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKiBlc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICogZXNwKTsKK3N0YXRpYyBpbnQgIGRtYV9pcnFfcF9xdWljayhzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKiBlc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cF9xdWljayhzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgaW50IGVzcF9kYWZiX2RtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcGRldik7CitzdGF0aWMgaW50IGVzcF9pb3NiX2RtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcGRldik7CisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbMTZdOworCQkJCS8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQKKwkJCQkgKiBiZWZvcmUgdGhleSBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIEVTUCBjaGlwCisJCQkJICogdmlhIFBJTy4KKwkJCQkgKi8KKworc3RhdGljIGludCBlc3BfaW5pdGlhbGl6ZWQgPSAwOworCitzdGF0aWMgaW50IHNldHVwX251bV9lc3BzID0gLTE7CitzdGF0aWMgaW50IHNldHVwX2Rpc2Nvbm5lY3QgPSAtMTsKK3N0YXRpYyBpbnQgc2V0dXBfbm9zeW5jID0gLTE7CitzdGF0aWMgaW50IHNldHVwX2Nhbl9xdWV1ZSA9IC0xOworc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOworc3RhdGljIGludCBzZXR1cF9zZ190YWJsZXNpemUgPSAtMTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKK3N0YXRpYyBpbnQgc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gLTE7CisjZW5kaWYKK3N0YXRpYyBpbnQgc2V0dXBfaG9zdGlkID0gLTE7CisKKy8qCisgKiBFeHBlcmltZW50YWwgRVNQIGludGhhbmRsZXI7IGNoZWNrIG1hY2ludHMuYyB0byBtYWtlIHN1cmUgZGV2X2lkIGlzIAorICogc2V0IHVwIHByb3Blcmx5IQorICovCisKK3ZvaWQgbWFjX2VzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgZGV2X2lkOworCWludCBpcnFfcCA9IDA7CisKKwkvKiBIYW5kbGUgdGhlIG9uZSBFU1AgaW50ZXJydXB0IHNob3dpbmcgYXQgdGhpcyBJUlEgbGV2ZWwuICovCisJaWYoKChlc3ApLT5pcnEgJiAweGZmKSA9PSBpcnEpIHsKKwkvKgorCSAqIERlYnVnIC4uCisJICovCisJCWlycV9wID0gZXNwLT5kbWFfaXJxX3AoZXNwKTsKKwkgCXByaW50aygibWFjX2VzcDogaXJxX3AgJXggY3VycmVudCAlcCBkaXNjb25uZWN0ZWQgJXBcbiIsCisJIAkJaXJxX3AsIGVzcC0+Y3VycmVudF9TQywgZXNwLT5kaXNjb25uZWN0ZWRfU0MpOworCSAJCQorCQkvKgorCQkgKiBNYWM6IGlmIHdlJ3JlIGhlcmUsIGl0J3MgYW4gRVNQIGludGVycnVwdCBmb3Igc3VyZSEKKwkJICovCisJCWlmKChlc3AtPmN1cnJlbnRfU0MgfHwgZXNwLT5kaXNjb25uZWN0ZWRfU0MpKSB7CisJCQllc3AtPmRtYV9pbnRzX29mZihlc3ApOworCisJCQlFU1BJUlEoKCJJJWQoIiwgZXNwLT5lc3BfaWQpKTsKKwkJCWVzcF9oYW5kbGUoZXNwKTsKKwkJCUVTUElSUSgoIikiKSk7CisKKwkJCWVzcC0+ZG1hX2ludHNfb24oZXNwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIERlYnVnIGhvb2tzOyB1c2UgZm9yIHBsYXlpbmcgd2l0aCB0aGUgaW50ZXJydXB0IGZsYWcgdGVzdGluZyBhbmQgaW50ZXJydXB0CisgKiBhY2tub3dsZWRnZSBvbiB0aGUgdmFyaW91cyBtYWNoaW5lcworICovCisKK3ZvaWQgc2NzaV9lc3BfcG9sbGVkKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCWlmIChlc3BfaW5pdGlhbGl6ZWQgPT0gMCkKKwkJcmV0dXJuOworCisJbWFjX2VzcF9pbnRyKGlycSwgZGV2X2lkLCBwcmVncyk7Cit9CisKK3ZvaWQgZmFrZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGdvdCBpcnFcbiIpOworI2VuZGlmCisKKwltYWNfZXNwX2ludHIoaXJxLCBkZXZfaWQsIHByZWdzKTsKK30KKworaXJxcmV0dXJuX3QgZmFrZV9kcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpCit7CisJcHJpbnRrKCJtYWNfZXNwOiBnb3QgZHJxXG4iKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNkZWZpbmUgRFJJVkVSX1NFVFVQCisKKy8qCisgKiBGdW5jdGlvbiA6IG1hY19lc3Bfc2V0dXAoY2hhciAqc3RyKQorICoKKyAqIFB1cnBvc2UgOiBib290ZXIgY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKgorICogSW5wdXRzIDogc3RyIC0gcGFyYW1ldGVycywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KKyAqCisgKiBDdXJyZW50bHkgdW51c2VkIGluIHRoZSBuZXcgZHJpdmVyOyBuZWVkIHRvIGFkZCBzZXR0YWJsZSBwYXJhbWV0ZXJzIHRvIHRoZSAKKyAqIGRldGVjdCBmdW5jdGlvbi4KKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbWFjX2VzcF9zZXR1cChjaGFyICpzdHIpIHsKKyNpZmRlZiBEUklWRVJfU0VUVVAKKwkvKiBGb3JtYXQgb2YgbWFjNTNjOXggcGFyYW1ldGVyIGlzOgorCSAqICAgbWFjNTNjOXg9PG51bV9lc3BzPiw8ZGlzY29ubmVjdD4sPG5vc3luYz4sPGNhbl9xdWV1ZT4sPGNtZF9wZXJfbHVuPiw8c2dfdGFibGVzaXplPiw8aG9zdGlkPiw8dXNlX3RhZ3M+CisJICogTmVnYXRpdmUgdmFsdWVzIG1lYW4gZG9uJ3QgY2hhbmdlLgorCSAqLworCQorCWNoYXIgKnRoaXNfb3B0OworCWxvbmcgb3B0OworCisJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7CisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKworCQlpZiAob3B0ID49IDAgJiYgb3B0IDw9IDIpCisJCQlzZXR1cF9udW1fZXNwcyA9IG9wdDsKKwkJZWxzZSBpZiAob3B0ID4gMikKKwkJCXByaW50ayggIm1hY19lc3Bfc2V0dXA6IGludmFsaWQgbnVtYmVyIG9mIGhvc3RzICVsZCAhXG4iLCBvcHQgKTsKKworCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKKwl9CisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKwkKKwkJaWYgKG9wdCA+IDApCisJCQlzZXR1cF9kaXNjb25uZWN0ID0gb3B0OworCisJCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOworCX0KKwlpZih0aGlzX29wdCkgeworCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOworCisJCWlmIChvcHQgPj0gMCkKKwkJCXNldHVwX25vc3luYyA9IG9wdDsKKworCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKKwl9CisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKworCQlpZiAob3B0ID4gMCkKKwkJCXNldHVwX2Nhbl9xdWV1ZSA9IG9wdDsKKworCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKKwl9CisJaWYodGhpc19vcHQpIHsKKwkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKKworCQlpZiAob3B0ID4gMCkKKwkJCXNldHVwX2NtZF9wZXJfbHVuID0gb3B0OworCisJCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOworCX0KKwlpZih0aGlzX29wdCkgeworCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOworCisJCWlmIChvcHQgPj0gMCkgeworCQkJc2V0dXBfc2dfdGFibGVzaXplID0gb3B0OworCQkJLyogTXVzdCBiZSA8PSBTR19BTEwgKDI1NSkgKi8KKwkJCWlmIChzZXR1cF9zZ190YWJsZXNpemUgPiBTR19BTEwpCisJCQkJc2V0dXBfc2dfdGFibGVzaXplID0gU0dfQUxMOworCQl9CisKKwkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7CisJfQorCWlmKHRoaXNfb3B0KSB7CisJCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7CisKKwkJLyogTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDcgKi8KKwkJaWYgKG9wdCA+PSAwICYmIG9wdCA8PSA3KQorCQkJc2V0dXBfaG9zdGlkID0gb3B0OworCQllbHNlIGlmIChvcHQgPiA3KQorCQkJcHJpbnRrKCAibWFjX2VzcF9zZXR1cDogaW52YWxpZCBob3N0IElEICVsZCAhXG4iLCBvcHQpOworCisJCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOworCX0KKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwlpZih0aGlzX29wdCkgeworCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOworCQlpZiAob3B0ID49IDApCisJCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSAhIW9wdDsKKwl9CisjZW5kaWYKKyNlbmRpZgorCXJldHVybiAxOyAKK30KKworX19zZXR1cCgibWFjNTNjOXg9IiwgbWFjX2VzcF9zZXR1cCk7CisKKworLyoKKyAqIEVTUCBhZGRyZXNzICdkZXRlY3Rpb24nCisgKi8KKwordW5zaWduZWQgbG9uZyBnZXRfYmFzZShpbnQgY2hpcF9udW0pCit7CisJLyoKKwkgKiB1c2luZyB0aGUgY2hpcF9udW0gYW5kIG1hYyBtb2RlbCwgZmlndXJlIG91dCB3aGVyZSB0aGUKKwkgKiBjaGlwcyBhcmUgbWFwcGVkCisJICovCisKKwl1bnNpZ25lZCBsb25nIGlvX2Jhc2UgPSAweDUwZjAwMDAwOworCXVuc2lnbmVkIGludCBzZWNvbmRfb2Zmc2V0ID0gMHg0MDI7CisJdW5zaWduZWQgbG9uZyBzY3NpX2xvYyA9IDA7CisKKwlzd2l0Y2ggKG1hY2ludG9zaF9jb25maWctPnNjc2lfdHlwZSkgeworCisJLyogOTUwLCA5MDAsIDcwMCAqLworCWNhc2UgTUFDX1NDU0lfUVVBRFJBMjoKKwkJc2NzaV9sb2MgPSAgaW9fYmFzZSArIDB4ZjAwMCArICgoY2hpcF9udW0gPT0gMCkgPyAwIDogc2Vjb25kX29mZnNldCk7CisJCWJyZWFrOworCisJLyogYXYncyAqLworCWNhc2UgTUFDX1NDU0lfUVVBRFJBMzoKKwkJc2NzaV9sb2MgPSBpb19iYXNlICsgMHgxODAwMCArICgoY2hpcF9udW0gPT0gMCkgPyAwIDogc2Vjb25kX29mZnNldCk7CisJCWJyZWFrOworCisJLyogbW9zdCBxdWFkcmEvY2VudHJpcyBtb2RlbHMgYXJlIGxpa2UgdGhpcyAqLwkKKwljYXNlIE1BQ19TQ1NJX1FVQURSQToKKwkJc2NzaV9sb2MgPSBpb19iYXNlICsgMHgxMDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIm1hY19lc3A6IGdldF9iYXNlOiBoaXQgZGVmYXVsdCFcbiIpOworCQlzY3NpX2xvYyA9IGlvX2Jhc2UgKyAweDEwMDAwOworCQlicmVhazsKKworCX0gLyogc3dpdGNoICovCisKKwlwcmludGsoIm1hY19lc3A6IGlvIGJhc2UgYXQgMHglbHhcbiIsIHNjc2lfbG9jKTsKKworCXJldHVybiBzY3NpX2xvYzsKK30KKworLyoKKyAqIE1vZGVsIGRlcGVuZGVudCBFU1Agc2V0dXAKKyAqLworCitpbnQgbWFjX2VzcF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwlpbnQgcXVpY2sgPSAwOworCWludCBjaGlwbnVtLCBjaGlwc3ByZXNlbnQgPSAwOworI2lmIDAKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisjZW5kaWYKKworCWlmIChlc3BfaW5pdGlhbGl6ZWQgPiAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHdoYXQgZG8gd2UgaGF2ZSBpbiB0aGlzIG1hY2hpbmUuLi4gKi8KKwlpZiAoTUFDSFdfUFJFU0VOVChNQUNfU0NTSV85NikpIHsKKwkJY2hpcHNwcmVzZW50ICsrOworCX0KKworCWlmIChNQUNIV19QUkVTRU5UKE1BQ19TQ1NJXzk2XzIpKSB7CisJCWNoaXBzcHJlc2VudCArKzsKKwl9CisKKwkvKiBudW1iZXIgb2YgRVNQcyBwcmVzZW50ID8gKi8KKwlpZiAoc2V0dXBfbnVtX2VzcHMgPj0gMCkgeworCSAgaWYgKGNoaXBzcHJlc2VudCA+PSBzZXR1cF9udW1fZXNwcykKKwkgICAgY2hpcHNwcmVzZW50ID0gc2V0dXBfbnVtX2VzcHM7CisJICBlbHNlCisJICAgIHByaW50aygibWFjX2VzcF9kZXRlY3Q6IG51bV9ob3N0cyBkZXRlY3RlZCAlZCBzZXR1cCAlZCBcbiIsCisJCSAgIGNoaXBzcHJlc2VudCwgc2V0dXBfbnVtX2VzcHMpOworCX0KKworCS8qIFRPRE86IGFkZCBkaXNjb25uZWN0IC8gbm9zeW5jIGZsYWdzICovCisKKwkvKiBzZXR1cCB2YXJpYWJsZXMgKi8KKwl0cG50LT5jYW5fcXVldWUgPQorCSAgKHNldHVwX2Nhbl9xdWV1ZSA+IDApID8gc2V0dXBfY2FuX3F1ZXVlIDogNzsKKwl0cG50LT5jbWRfcGVyX2x1biA9CisJICAoc2V0dXBfY21kX3Blcl9sdW4gPiAwKSA/IHNldHVwX2NtZF9wZXJfbHVuIDogMTsKKwl0cG50LT5zZ190YWJsZXNpemUgPSAKKwkgIChzZXR1cF9zZ190YWJsZXNpemUgPj0gMCkgPyBzZXR1cF9zZ190YWJsZXNpemUgOiBTR19BTEw7CisKKwlpZiAoc2V0dXBfaG9zdGlkID49IDApCisJICB0cG50LT50aGlzX2lkID0gc2V0dXBfaG9zdGlkOworCWVsc2UgeworCSAgLyogdXNlIDcgYXMgZGVmYXVsdCAqLworCSAgdHBudC0+dGhpc19pZCA9IDc7CisJfQorCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJaWYgKHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA8IDApCisJCXNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IERFRkFVTFRfVVNFX1RBR0dFRF9RVUVVSU5HOworI2VuZGlmCisKKwlmb3IgKGNoaXBudW0gPSAwOyBjaGlwbnVtIDwgY2hpcHNwcmVzZW50OyBjaGlwbnVtICsrKSB7CisJCXN0cnVjdCBOQ1JfRVNQICogZXNwOworCisJCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKSBOVUxMKTsKKwkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikgZ2V0X2Jhc2UoY2hpcG51bSk7CisKKwkJZXNwLT5kbWFfaXJxX3AgPSAmZXNwX2RhZmJfZG1hX2lycV9wOworCQlpZiAoY2hpcG51bSA9PSAwKSB7CisKKwkJCWlmIChtYWNpbnRvc2hfY29uZmlnLT5zY3NpX3R5cGUgPT0gTUFDX1NDU0lfUVVBRFJBKSB7CisJCQkJLyogbW9zdCBtYWNoaW5lcyBleGNlcHQgdGhvc2UgYmVsb3cgOi0pICovCisJCQkJcXVpY2sgPSAxOworCQkJCWVzcC0+ZG1hX2lycV9wID0gJmVzcF9pb3NiX2RtYV9pcnFfcDsKKwkJCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+c2NzaV90eXBlID09IE1BQ19TQ1NJX1FVQURSQTMpIHsKKwkJCQkvKiBtb3N0bHkgYXYncyAqLworCQkJCXF1aWNrID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogcTk1MCwgOTAwLCA3MDAgKi8KKwkJCQlxdWljayA9IDE7CisJCQkJb3V0X2JlMzIoMHhmOTgwMDAyNCwgMHgxZDEpOworCQkJCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKSAweGY5ODAwMDI0OworCQkJfQorCisJCX0gZWxzZSB7IC8qIGNoaXBudW0gKi8KKworCQkJcXVpY2sgPSAxOworCQkJb3V0X2JlMzIoMHhmOTgwMDAyOCwgMHgxZDEpOworCQkJZXNwLT5kcmVncyA9ICh2b2lkICopIDB4Zjk4MDAwMjg7CisKKwkJfSAvKiBjaGlwbnVtID09IDAgKi8KKworCQkvKiB1c2UgcGlvIGZvciBjb21tYW5kIGJ5dGVzOyBwaW8gZm9yIG1lc3NhZ2UvZGF0YTogVEJJICovCisJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKwkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikgY21kX2J1ZmZlcjsKKwkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gKF9fdTMyKSBjbWRfYnVmZmVyOworCisJCS8qIHZhcmlvdXMgZnVuY3Rpb25zICovCisJCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7CisJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOworCQllc3AtPmRtYV9pbml0X3JlYWQgPSBOVUxMOworCQllc3AtPmRtYV9pbml0X3dyaXRlID0gTlVMTDsKKwkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOworCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOworCisJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7CisKKworCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYmFycmllciA9IE5VTEw7CisJCWVzcC0+ZG1hX2RyYWluID0gTlVMTDsKKwkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IE5VTEw7CisJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IE5VTEw7CisJCWVzcC0+ZG1hX2lycV9leGl0ID0gTlVMTDsKKwkJZXNwLT5kbWFfbGVkX29uID0gTlVMTDsKKwkJZXNwLT5kbWFfbGVkX29mZiA9IE5VTEw7CisJCWVzcC0+ZG1hX3BvbGwgPSBOVUxMOworCQllc3AtPmRtYV9yZXNldCA9IE5VTEw7CisKKwkJLyogU0NTSSBjaGlwIHNwZWVkICovCisJCS8qIGJlbG93IGVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsgKi8KKworCisJCWlmIChxdWljaykgeworCQkJLyogJ3F1aWNrJyBtZWFucyB0aGVyZSdzIGhhbmRzaGFrZSBnbHVlIGxvZ2ljIGxpa2UgaW4gdGhlIDUzODAgY2FzZSAqLworCQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwX3F1aWNrOworCQl9IGVsc2UgeworCQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCQl9CisKKwkJaWYgKGNoaXBudW0gPT0gMCkgeworCisJCQllc3AtPmlycSA9IElSUV9NQUNfU0NTSTsKKworCQkJcmVxdWVzdF9pcnEoSVJRX01BQ19TQ1NJLCBlc3BfaW50ciwgMCwgIk1hYyBFU1AgU0NTSSIsIGVzcC0+ZWhvc3QpOworI2lmIDAJLyogY29uZmxpY3RzIHdpdGggSU9QIEFEQiAqLworCQkJcmVxdWVzdF9pcnEoSVJRX01BQ19TQ1NJRFJRLCBmYWtlX2RycSwgMCwgIk1hYyBFU1AgRFJRIiwgZXNwLT5laG9zdCk7CisjZW5kaWYKKworCQkJaWYgKG1hY2ludG9zaF9jb25maWctPnNjc2lfdHlwZSA9PSBNQUNfU0NTSV9RVUFEUkEpIHsKKwkJCQllc3AtPmNmcmVxID0gMTY1MDAwMDA7CisJCQl9IGVsc2UgeworCQkJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKKwkJCX0KKworCisJCX0gZWxzZSB7IC8qIGNoaXBudW0gPT0gMSAqLworCisJCQllc3AtPmlycSA9IElSUV9NQUNfU0NTSURSUTsKKyNpZiAwCS8qIGNvbmZsaWN0cyB3aXRoIElPUCBBREIgKi8KKwkJCXJlcXVlc3RfaXJxKElSUV9NQUNfU0NTSURSUSwgZXNwX2ludHIsIDAsICJNYWMgRVNQIFNDU0kgMiIsIGVzcC0+ZWhvc3QpOworI2VuZGlmCisKKwkJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKKworCQl9CisKKwkJaWYgKHF1aWNrKSB7CisJCQlwcmludGsoImVzcDogdXNpbmcgcXVpY2sgdmVyc2lvblxuIik7CisJCX0KKworCQlwcmludGsoImVzcDogYWRkciBhdCAweCVwXG4iLCBlc3AtPmVyZWdzKTsKKworCQllc3AtPnNjc2lfaWQgPSA3OworCQllc3AtPmRpZmYgPSAwOworCisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwl9IC8qIGZvciBjaGlwbnVtICovCisKKwlpZiAoY2hpcHNwcmVzZW50KQorCQlwcmludGsoIlxubWFjX2VzcDogJWQgZXNwIGNvbnRyb2xsZXJzIGZvdW5kXG4iLCBjaGlwc3ByZXNlbnQpOworCisJZXNwX2luaXRpYWxpemVkID0gY2hpcHNwcmVzZW50OworCisJcmV0dXJuIGNoaXBzcHJlc2VudDsKK30KKworc3RhdGljIGludCBtYWNfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEkndmUgYmVlbiB3b25kZXJpbmcgd2hhdCB0aGlzIGlzIHN1cHBvc2VkIHRvIGRvLCBmb3Igc29tZSB0aW1lLiBUYWxraW5nIAorICogdG8gQWxsZW4gQnJpZ2dzOiBUaGVzZSBtYWNoaW5lcyBoYXZlIGFuIGV4dHJhIHJlZ2lzdGVyIHNvbWVwbGFjZSB3aGVyZSB0aGUKKyAqIERSUSBwaW4gb2YgdGhlIEVTUCBjYW4gYmUgbW9uaXRvcmVkLiBUaGF0IGlzbid0IHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgCisgKiBhbnl0aGluZyBlbHNlIChzdWNoIGFzIHJlc2VsZWN0IGludGVycnVwdCBvciBvdGhlciBtYWdpYykgdGhvdWdoLiAKKyAqIE1heWJlIG1ha2UgdGhlIHNlbWFudGljcyBzaG91bGQgYmUgY2hhbmdlZCBsaWtlIAorICogaWYgKGVzcC0+Y3VycmVudF9TQykKKyAqCS4uLiBjaGVjayBEUlEgZmxhZyAuLi4KKyAqIGVsc2UgCisgKgkuLi4gZGlzY29ubmVjdGVkLCBjaGVjayBwZW5kaW5nIFZJQSBpbnRlcnJ1cHQgLi4uCisgKgorICogVGhlcmUncyBhIHByb2JsZW0gd2l0aCB1c2luZyB0aGUgZGFiZiBmbGFnIG9yIG1hY19pcnFfcGVuZGluZygpIGhlcmU6IGJvdGgKKyAqIHNlZW0gdG8gcmV0dXJuIDEgZXZlbiB0aG91Z2ggbm8gaW50ZXJydXB0IGlzIGN1cnJlbnRseSBwZW5kaW5nLCByZXN1bHRpbmcKKyAqIGluIGVzcF9leGVjX2NtZCgpIGhvbGRpbmcgb2ZmIHRoZSBuZXh0IGNvbW1hbmQsIGFuZCBwb3NzaWJseSBpbmZpbml0ZSBsb29wcworICogaW4gZXNwX2ludHIoKS4gCisgKiBTaG9ydCB0ZXJtIGZpeDoganVzdCB1c2UgZXNwX3N0YXR1cyAmIEVTUF9TVEFUX0lOVFIgaGVyZSwgYXMgbG9uZyBhcyB3ZQorICogdXNlIHNpbXBsZSBQSU8uIFRoZSBEUlEgc3RhdHVzIHdpbGwgYmUgaW1wb3J0YW50IHdoZW4gaW1wbGVtZW50aW5nIHBzZXVkbworICogRE1BIG1vZGUgKHNldCB1cCBFU1AgdHJhbnNmZXIgY291bnQsIHJldHVybiwgZG8gYSBiYXRjaCBvZiBieXRlcyBpbiBQSU8gb3IgCisgKiAnaGFyZHdhcmUgaGFuZHNoYWtlJyBtb2RlIHVwb24gRFJRKS4KKyAqIElmIHlvdSBwbGFuIG9uIGNoYW5naW5nIHRoaXMgKGkuZS4gdG8gc2F2ZSB0aGUgZXNwX3N0YXR1cyByZWdpc3RlciBhY2Nlc3MgaW4gCisgKiBmYXZvciBvZiBhIFZJQSByZWdpc3RlciBhY2Nlc3Mgb3IgYSBzaGFkb3cgcmVnaXN0ZXIgZm9yIHRoZSBJRlIpLCBtYWtlIHN1cmUKKyAqIHRvIHRyeSBhIGRlYnVnIHZlcnNpb24gb2YgdGhpcyBmaXJzdCB0byBtb25pdG9yIHdoYXQgcmVnaXN0ZXJzIHdvdWxkIGJlIGEgZ29vZAorICogaW5kaWNhdG9yIG9mIHRoZSBFU1AgaW50ZXJydXB0LgorICovCisKK3N0YXRpYyBpbnQgZXNwX2RhZmJfZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICogZXNwKQoreworCXVuc2lnbmVkIGludCByZXQ7CisJaW50IHNyZWcgPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKTsKKworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGVzcF9kYWZiX2RtYV9pcnFfcCBkYWZiICVkIGlycSAlZFxuIiwgCisJCXJlYWRsKGVzcC0+ZHJlZ3MpLCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSk7CisjZW5kaWYKKworCXNyZWcgJj0gRVNQX1NUQVRfSU5UUjsKKworCS8qCisJICogbWF5YmUgd29ya2luZzsgdGhpcyBpcyBlc3NlbnRpYWxseSB3aGF0J3MgdXNlZCBmb3IgaW9zYl9kbWFfaXJxX3AKKwkgKi8KKwlpZiAoc3JlZykKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKworCS8qCisJICogZGlkbid0IHdvcmsgLi4uCisJICovCisjaWYgMAorCWlmIChlc3AtPmN1cnJlbnRfU0MpCisJCXJldCA9IHJlYWRsKGVzcC0+ZHJlZ3MpICYgMHgyMDA7CisJZWxzZSBpZiAoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCisJCXJldCA9IDE7IC8qIHNyZWcgPz8gKi8KKwllbHNlCisJCXJldCA9IG1hY19pcnFfcGVuZGluZyhJUlFfTUFDX1NDU0kpOworCisJcmV0dXJuKHJldCk7CisjZW5kaWYKKworfQorCisvKgorICogU2VlIGFib3ZlOiB0ZXN0aW5nIG1hY19pcnFfcGVuZGluZyBhbHdheXMgcmV0dXJuZWQgOCAoU0NTSSBJUlEpIHJlZ2FyZGxlc3MgCisgKiBvZiB0aGUgYWN0dWFsIEVTUCBzdGF0dXMuCisgKi8KKworc3RhdGljIGludCBlc3BfaW9zYl9kbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisJaW50IHJldCAgPSBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSB8fCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKTsKKwlpbnQgc3JlZyA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpOworCisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX2lycV9wIGRycSAlZCBpcnEgJWQgc3JlZyAleCBjdXJyICVwIGRpc2MgJXBcbiIsIAorCQltYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKSwgbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSSksIAorCQlzcmVnLCBlc3AtPmN1cnJlbnRfU0MsIGVzcC0+ZGlzY29ubmVjdGVkX1NDKTsKKyNlbmRpZgorCisJc3JlZyAmPSBFU1BfU1RBVF9JTlRSOworCisJaWYgKHNyZWcpCisJCXJldHVybiAoc3JlZyk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgc2VlbXMgdG8gYmUgT0sgZm9yIFBJTyBhdCBsZWFzdCAuLi4gdXN1YWxseSAwIGFmdGVyIFBJTy4KKyAqLworCitzdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICogZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYSBieXRlcyBzZW50ID0gJXhcbiIsIGZpZm9fY291bnQpOworI2VuZGlmCisKKwlyZXR1cm4gZmlmb19jb3VudDsKK30KKworLyoKKyAqIGRtYV9jYW5fdHJhbnNmZXIgaXMgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBETUEgYW5kIFBJTywgaWYgRE1BIChwc2V1ZG8pCisgKiBpcyBldmVyIGltcGxlbWVudGVkLiBSZXR1cm5pbmcgMCBoZXJlIHdpbGwgdXNlIFBJTy4KKyAqLworCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKiBlc3AsIFNjc2lfQ21uZCAqIHNwKQoreworCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7CisjaWYgMAkvKiBubyBETUEgeWV0OyBtYWtlIGNvbmRpdGlvbmFsICovCisJaWYgKHN6ID4gMHgxMDAwMDAwMCkgeworCQlzeiA9IDB4MTAwMDAwMDA7CisJfQorCXByaW50aygibWFjX2VzcDogZG1hIGNhbiB0cmFuc2ZlciA9IDBseCV4XG4iLCBzeik7CisjZWxzZQorCisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogcGlvIHRvIHRyYW5zZmVyID0gJWxkXG4iLCBzeik7CisjZW5kaWYKKworCXN6ID0gMDsKKyNlbmRpZgorCXJldHVybiBzejsKK30KKworLyoKKyAqIE5vdCB5ZXQgLi4uCisgKi8KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX2R1bXBfc3RhdGU6IGNhbGxlZFxuIik7CisjZW5kaWYKKyNpZiAwCisJRVNQTE9HKCgiZXNwJWQ6IGRtYSAtLSBjb25kX3JlZzwlMDJ4PlxuIiwKKwkJZXNwLT5lc3BfaWQsICgoc3RydWN0IG1hY19kbWFfcmVnaXN0ZXJzICopCisJCShlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7CisjZW5kaWYKK30KKworLyoKKyAqIERNQSBzZXR1cDogc2hvdWxkIGJlIHVzZWQgdG8gc2V0IHVwIHRoZSBFU1AgdHJhbnNmZXIgY291bnQgZm9yIHBzZXVkbworICogRE1BIHRyYW5zZmVyczsgbmVlZCBhIERSUSB0cmFuc2ZlciBmdW5jdGlvbiB0byBkbyB0aGUgYWN0dWFsIHRyYW5zZmVyCisgKi8KKworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgY2hhciAqIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXByaW50aygibWFjX2VzcDogZG1hX2luaXRfcmVhZFxuIik7Cit9CisKKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKiBlc3AsIGNoYXIgKiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwlwcmludGsoIm1hY19lc3A6IGRtYV9pbml0X3dyaXRlXG4iKTsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKiBlc3ApCit7CisJbWFjX3R1cm5vZmZfaXJxKGVzcC0+aXJxKTsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKwltYWNfdHVybm9uX2lycShlc3AtPmlycSk7Cit9CisKKy8qCisgKiBnZW5lcmljIGRtYV9pcnFfcCgpLCB1bnVzZWQKKyAqLworCitzdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKwlpbnQgaSA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpOworCisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX2lycV9wIHN0YXR1cyAlZFxuIiwgaSk7CisjZW5kaWYKKworCXJldHVybiAoaSAmIEVTUF9TVEFUX0lOVFIpOworfQorCitzdGF0aWMgaW50IGRtYV9pcnFfcF9xdWljayhzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKwkvKgorCSAqIENvcGllZCBmcm9tIGlvc2JfZG1hX2lycV9wKCkKKwkgKi8KKwlpbnQgcmV0ICA9IG1hY19pcnFfcGVuZGluZyhJUlFfTUFDX1NDU0kpIHx8IG1hY19pcnFfcGVuZGluZyhJUlFfTUFDX1NDU0lEUlEpOworCWludCBzcmVnID0gZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cyk7CisKKyNpZmRlZiBERUJVR19NQUNfRVNQCisJcHJpbnRrKCJtYWNfZXNwOiBkbWFfaXJxX3AgZHJxICVkIGlycSAlZCBzcmVnICV4IGN1cnIgJXAgZGlzYyAlcFxuIiwgCisJCW1hY19pcnFfcGVuZGluZyhJUlFfTUFDX1NDU0lEUlEpLCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSwgCisJCXNyZWcsIGVzcC0+Y3VycmVudF9TQywgZXNwLT5kaXNjb25uZWN0ZWRfU0MpOworI2VuZGlmCisKKwlzcmVnICY9IEVTUF9TVEFUX0lOVFI7CisKKwlpZiAoc3JlZykKKwkJcmV0dXJuIChzcmVnKTsKKwllbHNlCisJCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICogZXNwKQoreworI2lmZGVmIERFQlVHX01BQ19FU1AKKwlwcmludGsoIm1hY19lc3A6IGRtYV9sZWRfb2ZmOiBjYWxsZWRcbiIpOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKyNpZmRlZiBERUJVR19NQUNfRVNQCisJcHJpbnRrKCJtYWNfZXNwOiBkbWFfbGVkX29uOiBjYWxsZWRcbiIpOworI2VuZGlmCit9CisKKworc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKiBlc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX3NldHVwXG4iKTsKKyNlbmRpZgorCisJaWYgKHdyaXRlKSB7CisJCWRtYV9pbml0X3JlYWQoZXNwLCAoY2hhciAqKSBhZGRyLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZG1hX2luaXRfd3JpdGUoZXNwLCAoY2hhciAqKSBhZGRyLCBjb3VudCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cF9xdWljayhzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisjaWZkZWYgREVCVUdfTUFDX0VTUAorCXByaW50aygibWFjX2VzcDogZG1hX3NldHVwX3F1aWNrXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJtYWNfZXNwIiwKKwkubmFtZQkJCT0gIk1hYyA1M0M5eCBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBtYWNfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IG1hY19lc3BfcmVsZWFzZSwKKwkuaW5mbwkJCT0gZXNwX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gNywKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL21hY19zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmZDE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tYWNfc2NzaS5jCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogR2VuZXJpYyBNYWNpbnRvc2ggTkNSNTM4MCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCwgTWljaGFlbCBTY2htaXR6IDxtc2NobWl0ekBsYmwuZ292PgorICoKKyAqIGRlcml2ZWQgaW4gcGFydCBmcm9tOgorICovCisvKgorICogR2VuZXJpYyBHZW5lcmljIE5DUjUzODAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTUsIFJ1c3NlbGwgS2luZworICoKKyAqIEFMUEhBIFJFTEVBU0UgMS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisvKgorICogJExvZzogbWFjX05DUjUzODAuYyx2ICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaW50b3NoLmg+CisjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHcuaD4KKyNpbmNsdWRlIDxhc20vbWFjX3ZpYS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAibWFjX3Njc2kuaCIKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisKKyNpZiAwCisjZGVmaW5lIE5ERUJVRyAoTkRFQlVHX0lOVFIgfCBOREVCVUdfUFNFVURPX0RNQSB8IE5ERUJVR19BUkJJVFJBVElPTiB8IE5ERUJVR19TRUxFQ1RJT04gfCBOREVCVUdfUkVTRUxFQ1RJT04pCisjZWxzZQorI2RlZmluZSBOREVCVUcgKE5ERUJVR19BQk9SVCkKKyNlbmRpZgorCisjZGVmaW5lIFJFU0VUX0JPT1QKKyNkZWZpbmUgRFJJVkVSX1NFVFVQCisKKyNkZWZpbmUJRU5BQkxFX0lSUSgpCW1hY19lbmFibGVfaXJxKCBJUlFfTUFDX1NDU0kgKTsgCisjZGVmaW5lCURJU0FCTEVfSVJRKCkJbWFjX2Rpc2FibGVfaXJxKCBJUlFfTUFDX1NDU0kgKTsKKworZXh0ZXJuIHZvaWQgdmlhX3Njc2lfY2xlYXIodm9pZCk7CisKKyNpZmRlZiBSRVNFVF9CT09UCitzdGF0aWMgdm9pZCBtYWNfc2NzaV9yZXNldF9ib290KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHNldHVwX2NhbGxlZCA9IDA7CitzdGF0aWMgaW50IHNldHVwX2Nhbl9xdWV1ZSA9IC0xOworc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOworc3RhdGljIGludCBzZXR1cF9zZ190YWJsZXNpemUgPSAtMTsKK3N0YXRpYyBpbnQgc2V0dXBfdXNlX3BkbWEgPSAtMTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKK3N0YXRpYyBpbnQgc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gLTE7CisjZW5kaWYKK3N0YXRpYyBpbnQgc2V0dXBfaG9zdGlkID0gLTE7CisKKy8qIFRpbWUgKGluIGppZmZpZXMpIHRvIHdhaXQgYWZ0ZXIgYSByZXNldDsgdGhlIFNDU0kgc3RhbmRhcmQgY2FsbHMgZm9yIDI1MG1zLAorICogd2UgdXN1YWxseSBkbyAwLjVzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuIEJ1dCBUb3NoaWJhIENELVJPTXMgb25jZSBtb3JlCisgKiBuZWVkIHRlbiB0aW1lcyB0aGUgc3RhbmRhcmQgdmFsdWUuLi4gKi8KKyNkZWZpbmUgVE9TSElCQV9ERUxBWQorCisjaWZkZWYgVE9TSElCQV9ERUxBWQorI2RlZmluZQlBRlRFUl9SRVNFVF9ERUxBWQkoNSpIWi8yKQorI2Vsc2UKKyNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCisjZW5kaWYKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm1hY19zY3NpX3JlZ3AgPSBOVUxMOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm1hY19zY3NpX2RycSAgPSBOVUxMOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm1hY19zY3NpX25vZHJxID0gTlVMTDsKKworCisvKgorICogTkNSIDUzODAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucworICovCisKKyNpZiAwCisvKiBEZWJ1ZyB2ZXJzaW9ucyAqLworI2RlZmluZSBDVFJMKHAsdikgKCpjdHJsID0gKHYpKQorCitzdGF0aWMgY2hhciBtYWNzY3NpX3JlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcpCit7CisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKyAgaW50IGk7CisgIGludCAqY3RybCA9ICYoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+Y3RybDsKKworICBDVFJMKGlvYmFzZSwgMCk7CisgIGkgPSBpbl84KGlvYmFzZSArIChyZWc8PDQpKTsKKyAgQ1RSTChpb2Jhc2UsIDB4NDApOworCisgIHJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBtYWNzY3NpX3dyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisgIGludCBpb2Jhc2UgPSBpbnN0YW5jZS0+aW9fcG9ydDsKKyAgaW50ICpjdHJsID0gJigoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5jdHJsOworCisgIENUUkwoaW9iYXNlLCAwKTsKKyAgb3V0XzgoaW9iYXNlICsgKHJlZzw8NCksIHZhbHVlKTsKKyAgQ1RSTChpb2Jhc2UsIDB4NDApOworfQorI2Vsc2UKKworLyogRmFzdCB2ZXJzaW9ucyAqLworc3RhdGljIF9faW5saW5lX18gY2hhciBtYWNzY3NpX3JlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcpCit7CisgIHJldHVybiBpbl84KGluc3RhbmNlLT5pb19wb3J0ICsgKHJlZzw8NCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1hY3Njc2lfd3JpdGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGludCByZWcsIGludCB2YWx1ZSkKK3sKKyAgb3V0XzgoaW5zdGFuY2UtPmlvX3BvcnQgKyAocmVnPDw0KSwgdmFsdWUpOworfQorI2VuZGlmCisKKworLyoKKyAqIEZ1bmN0aW9uIDogbWFjX3Njc2lfc2V0dXAoY2hhciAqc3RyKQorICoKKyAqIFB1cnBvc2UgOiBib290ZXIgY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKgorICogSW5wdXRzIDogc3RyIC0gY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2Ygb3B0aW9ucworICoKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBtYWNfc2NzaV9zZXR1cChjaGFyICpzdHIpIHsKKyNpZmRlZiBEUklWRVJfU0VUVVAJCisJaW50IGludHNbN107CisJCisJKHZvaWQpZ2V0X29wdGlvbnMoIHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaWYgKHNldHVwX2NhbGxlZCsrIHx8IGludHNbMF0gPCAxIHx8IGludHNbMF0gPiA2KSB7CisJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgInNjc2k6IDxtYWM1MzgwPiIKKwkJIiBVc2FnZTogbWFjNTM4MD08Y2FuX3F1ZXVlPlssPGNtZF9wZXJfbHVuPiw8c2dfdGFibGVzaXplPiw8aG9zdGlkPiw8dXNlX3RhZ3M+LDx1c2VfcGRtYT5dXG4iKTsKKwkgICAgcHJpbnRrKEtFUk5fQUxFUlQgInNjc2k6IDxtYWM1MzgwPiBCYWQgUGVuZ3VpbiBwYXJhbWV0ZXJzP1xuIik7CisJICAgIHJldHVybiAwOworCX0KKwkgICAgCisJaWYgKGludHNbMF0gPj0gMSkgeworCQlpZiAoaW50c1sxXSA+IDApCisJCQkvKiBubyBsaW1pdHMgb24gdGhpcywganVzdCA+IDAgKi8KKwkJCXNldHVwX2Nhbl9xdWV1ZSA9IGludHNbMV07CisJfQorCWlmIChpbnRzWzBdID49IDIpIHsKKwkJaWYgKGludHNbMl0gPiAwKQorCQkJc2V0dXBfY21kX3Blcl9sdW4gPSBpbnRzWzJdOworCX0KKwlpZiAoaW50c1swXSA+PSAzKSB7CisJCWlmIChpbnRzWzNdID49IDApIHsKKwkJCXNldHVwX3NnX3RhYmxlc2l6ZSA9IGludHNbM107CisJCQkvKiBNdXN0IGJlIDw9IFNHX0FMTCAoMjU1KSAqLworCQkJaWYgKHNldHVwX3NnX3RhYmxlc2l6ZSA+IFNHX0FMTCkKKwkJCQlzZXR1cF9zZ190YWJsZXNpemUgPSBTR19BTEw7CisJCX0KKwl9CisJaWYgKGludHNbMF0gPj0gNCkgeworCQkvKiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgNyAqLworCQlpZiAoaW50c1s0XSA+PSAwICYmIGludHNbNF0gPD0gNykKKwkJCXNldHVwX2hvc3RpZCA9IGludHNbNF07CisJCWVsc2UgaWYgKGludHNbNF0gPiA3KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFjX3Njc2lfc2V0dXA6IGludmFsaWQgaG9zdCBJRCAlZCAhXG4iLCBpbnRzWzRdICk7CisJfQorI2lmZGVmIFNVUFBPUlRfVEFHUwkKKwlpZiAoaW50c1swXSA+PSA1KSB7CisJCWlmIChpbnRzWzVdID49IDApCisJCQlzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgPSAhIWludHNbNV07CisJfQorCQorCWlmIChpbnRzWzBdID09IDYpIHsKKwkgICAgaWYgKGludHNbNl0gPj0gMCkKKwkJc2V0dXBfdXNlX3BkbWEgPSBpbnRzWzZdOworCX0KKyNlbHNlCisJaWYgKGludHNbMF0gPT0gNSkgeworCSAgICBpZiAoaW50c1s1XSA+PSAwKQorCQlzZXR1cF91c2VfcGRtYSA9IGludHNbNV07CisJfQorI2VuZGlmIC8qIFNVUFBPUlRfVEFHUyAqLworCQorI2VuZGlmIC8qIERSSVZFUl9TRVRVUCAqLworCXJldHVybiAxOworfQorCitfX3NldHVwKCJtYWM1MzgwPSIsIG1hY19zY3NpX3NldHVwKTsKKworLyoKKyAqIElmIHlvdSB3YW50IHRvIGZpbmQgdGhlIGluc3RhbmNlIHdpdGggKGspZ2RiIC4uLgorICovCisjaWYgTkRFQlVHCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqZGVmYXVsdF9pbnN0YW5jZTsKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gOiBpbnQgbWFjc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZXMgbWFjIE5DUjUzODAgZHJpdmVyIGJhc2VkIG9uIHRoZQorICoJY29tbWFuZCBsaW5lIC8gY29tcGlsZSB0aW1lIHBvcnQgYW5kIGlycSBkZWZpbml0aW9ucy4KKyAqCisgKiBJbnB1dHMgOiB0cG50IC0gdGVtcGxhdGUgZm9yIHRoaXMgU0NTSSBhZGFwdGVyLgorICoKKyAqIFJldHVybnMgOiAxIGlmIGEgaG9zdCBhZGFwdGVyIHdhcyBmb3VuZCwgMCBpZiBub3QuCisgKgorICovCisgCitpbnQgbWFjc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKyAgICBzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisgICAgaW50IGZsYWdzID0gMDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKworICAgIGlmICghTUFDSF9JU19NQUMgfHwgY2FsbGVkKQorCXJldHVybiggMCApOworCisgICAgaWYgKG1hY2ludG9zaF9jb25maWctPnNjc2lfdHlwZSAhPSBNQUNfU0NTSV9PTEQpCisJcmV0dXJuKCAwICk7CisKKyAgICAvKiBzZXR1cCB2YXJpYWJsZXMgKi8KKyAgICB0cG50LT5jYW5fcXVldWUgPQorCShzZXR1cF9jYW5fcXVldWUgPiAwKSA/IHNldHVwX2Nhbl9xdWV1ZSA6IENBTl9RVUVVRTsKKyAgICB0cG50LT5jbWRfcGVyX2x1biA9CisJKHNldHVwX2NtZF9wZXJfbHVuID4gMCkgPyBzZXR1cF9jbWRfcGVyX2x1biA6IENNRF9QRVJfTFVOOworICAgIHRwbnQtPnNnX3RhYmxlc2l6ZSA9IAorCShzZXR1cF9zZ190YWJsZXNpemUgPj0gMCkgPyBzZXR1cF9zZ190YWJsZXNpemUgOiBTR19UQUJMRVNJWkU7CisKKyAgICBpZiAoc2V0dXBfaG9zdGlkID49IDApCisJdHBudC0+dGhpc19pZCA9IHNldHVwX2hvc3RpZDsKKyAgICBlbHNlIHsKKwkvKiB1c2UgNyBhcyBkZWZhdWx0ICovCisJdHBudC0+dGhpc19pZCA9IDc7CisgICAgfQorCisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgaWYgKHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA8IDApCisJc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gVVNFX1RBR0dFRF9RVUVVSU5HOworI2VuZGlmCisKKyAgICAvKiBPbmNlIHdlIHN1cHBvcnQgbXVsdGlwbGUgNTM4MHMgKGUuZy4gRHVvRG9jaykgd2UnbGwgZG8KKyAgICAgICBzb21ldGhpbmcgZGlmZmVyZW50IGhlcmUgKi8KKyAgICBpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworI2lmIE5ERUJVRworICAgIGRlZmF1bHRfaW5zdGFuY2UgPSBpbnN0YW5jZTsKKyNlbmRpZgorICAgIAorICAgIGlmIChtYWNpbnRvc2hfY29uZmlnLT5pZGVudCA9PSBNQUNfTU9ERUxfSUlGWCkgeworCW1hY19zY3NpX3JlZ3AgID0gdmlhMSsweDgwMDA7CisJbWFjX3Njc2lfZHJxICAgPSB2aWExKzB4RTAwMDsKKwltYWNfc2NzaV9ub2RycSA9IHZpYTErMHhDMDAwOworCS8qIFRoZSBJSUZYIHNob3VsZCBiZSBhYmxlIHRvIGRvIHRydWUgRE1BLCBidXQgcHNldWRvLWRtYSBkb2Vzbid0IHdvcmsgKi8KKwlmbGFncyA9IEZMQUdfTk9fUFNFVURPX0RNQTsKKyAgICB9IGVsc2UgeworCW1hY19zY3NpX3JlZ3AgID0gdmlhMSsweDEwMDAwOworCW1hY19zY3NpX2RycSAgID0gdmlhMSsweDYwMDA7CisJbWFjX3Njc2lfbm9kcnEgPSB2aWExKzB4MTIwMDA7CisgICAgfQorCisgICAgaWYgKCEgc2V0dXBfdXNlX3BkbWEpCisJZmxhZ3MgPSBGTEFHX05PX1BTRVVET19ETUE7CisJCisgICAgaW5zdGFuY2UtPmlvX3BvcnQgPSAodW5zaWduZWQgbG9uZykgbWFjX3Njc2lfcmVncDsKKyAgICBpbnN0YW5jZS0+aXJxID0gSVJRX01BQ19TQ1NJOworCisjaWZkZWYgUkVTRVRfQk9PVCAgIAorICAgIG1hY19zY3NpX3Jlc2V0X2Jvb3QoaW5zdGFuY2UpOworI2VuZGlmCisgICAgCisgICAgTkNSNTM4MF9pbml0KGluc3RhbmNlLCBmbGFncyk7CisKKyAgICBpbnN0YW5jZS0+bl9pb19wb3J0ID0gMjU1OworCisgICAgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmN0cmwgPSAwOworCisgICAgaWYgKGluc3RhbmNlLT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgTkNSNTM4MF9pbnRyLCBJUlFfRkxHX1NMT1csIAorCQkibmNyNTM4MCIsIGluc3RhbmNlKSkgeworCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLAorCQkgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisJICAgIGluc3RhbmNlLT5pcnEgPSBTQ1NJX0lSUV9OT05FOworCX0KKworICAgIHByaW50ayhLRVJOX0lORk8gInNjc2klZDogZ2VuZXJpYyA1MzgwIGF0IHBvcnQgJWxYIGlycSIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aW9fcG9ydCk7CisgICAgaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkKKwlwcmludGsgKEtFUk5fSU5GTyAicyBkaXNhYmxlZCIpOworICAgIGVsc2UKKwlwcmludGsgKEtFUk5fSU5GTyAiICVkIiwgaW5zdGFuY2UtPmlycSk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiIG9wdGlvbnMgQ0FOX1FVRVVFPSVkIENNRF9QRVJfTFVOPSVkIHJlbGVhc2U9JWQiLAorCSAgIGluc3RhbmNlLT5jYW5fcXVldWUsIGluc3RhbmNlLT5jbWRfcGVyX2x1biwgTUFDU0NTSV9QVUJMSUNfUkVMRUFTRSk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5zY3NpJWQ6IiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworICAgIE5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisgICAgcHJpbnRrKCJcbiIpOworICAgIGNhbGxlZCA9IDE7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWNzY3NpX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmIChzaHBudC0+aXJxICE9IFNDU0lfSVJRX05PTkUpCisJCWZyZWVfaXJxIChzaHBudC0+aXJxLCBOQ1I1MzgwX2ludHIpOworCU5DUjUzODBfZXhpdChzaHBudCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFJFU0VUX0JPT1QKKy8qCisgKiBPdXIgJ2J1cyByZXNldCBvbiBib290JyBmdW5jdGlvbgorICovCisKK3N0YXRpYyB2b2lkIG1hY19zY3NpX3Jlc2V0X2Jvb3Qoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKwkKKwkvKgorCSAqIERvIGEgU0NTSSByZXNldCB0byBjbGVhbiB1cCB0aGUgYnVzIGR1cmluZyBpbml0aWFsaXphdGlvbi4gTm8gbWVzc2luZworCSAqIHdpdGggdGhlIHF1ZXVlcywgaW50ZXJydXB0cywgb3IgbG9ja3MgbmVjZXNzYXJ5IGhlcmUuCisJICovCisKKwlwcmludGsoS0VSTl9JTkZPICJNYWNpbnRvc2ggU0NTSTogcmVzZXR0aW5nIHRoZSBTQ1NJIGJ1cy4uLiIgKTsKKworCS8qIHN3aXRjaCBvZmYgU0NTSSBJUlEgLSBjYXRjaCBhbiBpbnRlcnJ1cHQgd2l0aG91dCBJUlEgYml0IHNldCBlbHNlICovCisJbWFjX2Rpc2FibGVfaXJxKElSUV9NQUNfU0NTSSk7CisKKwkvKiBnZXQgaW4gcGhhc2UgKi8KKwlOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCisJCSAgICAgIFBIQVNFX1NSX1RPX1RDUiggTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICkpOworCisJLyogYXNzZXJ0IFJTVCAqLworCU5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1JTVCApOworCS8qIFRoZSBtaW4uIHJlc2V0IGhvbGQgdGltZSBpcyAyNXVzLCBzbyA0MHVzIHNob3VsZCBiZSBlbm91Z2ggKi8KKwl1ZGVsYXkoIDUwICk7CisJLyogcmVzZXQgUlNUIGFuZCBpbnRlcnJ1cHQgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisJTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisJZm9yKCBlbmQgPSBqaWZmaWVzICsgQUZURVJfUkVTRVRfREVMQVk7IHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZCk7ICkKKwkJYmFycmllcigpOworCisJLyogc3dpdGNoIG9uIFNDU0kgSVJRIGFnYWluICovCisJbWFjX2VuYWJsZV9pcnEoSVJRX01BQ19TQ1NJKTsKKworCXByaW50ayhLRVJOX0lORk8gIiBkb25lXG4iICk7Cit9CisjZW5kaWYKKworY29uc3QgY2hhciAqIG1hY3Njc2lfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqc3BudCkgeworCXJldHVybiAiIjsKK30KKworLyogCisgICBQc2V1ZG8tRE1BOiAoT3ZlIEVkbHVuZCkKKyAgIFRoZSBjb2RlIGF0dGVtcHRzIHRvIGNhdGNoIGJ1cyBlcnJvcnMgdGhhdCBvY2N1ciBpZiBvbmUgZm9yIGV4YW1wbGUKKyAgICJ0cmlwcyBvdmVyIHRoZSBjYWJsZSIuCisgICBYWFg6IFNpbmNlIGJ1cyBlcnJvcnMgaW4gdGhlIFBETUEgcm91dGluZXMgbmV2ZXIgaGFwcGVuIG9uIG15IAorICAgY29tcHV0ZXIsIHRoZSBidXMgZXJyb3IgY29kZSBpcyB1bnRlc3RlZC4gCisgICBJZiB0aGUgY29kZSB3b3JrcyBhcyBpbnRlbmRlZCwgYSBidXMgZXJyb3IgcmVzdWx0cyBpbiBQc2V1ZG8tRE1BIAorICAgYmVlaW5nIGRpc2FibGVkLCBtZWFuaW5nIHRoYXQgdGhlIGRyaXZlciBzd2l0Y2hlcyB0byBzbG93IGhhbmRzaGFrZS4gCisgICBJZiBidXMgZXJyb3JzIGFyZSBOT1QgZXh0cmVtZWx5IHJhcmUsIHRoaXMgaGFzIHRvIGJlIGNoYW5nZWQuIAorKi8KKworI2RlZmluZSBDUF9JT19UT19NRU0ocyxkLGxlbikJCQkJXAorX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJCVwKKyAgICAoIiAgICBjbXAudyAgIzQsJTJcbiIJCQkJXAorICAgICAiICAgIGJscyAgICA4ZlxuIgkJCQkJXAorICAgICAiICAgIG1vdmUudyAlMSwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBuZWcuYiAgJSVkMFxuIgkJCQlcCisgICAgICIgICAgYW5kLncgICMzLCUlZDBcbiIJCQkJXAorICAgICAiICAgIHN1Yi53ICAlJWQwLCUyXG4iCQkJCVwKKyAgICAgIiAgICBicmEgICAgMmZcbiIJCQkJCVwKKyAgICAgIiAxOiBtb3ZlLmIgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIgMjogZGJmICAgICUlZDAsMWJcbiIJCQkJXAorICAgICAiICAgIG1vdmUudyAlMiwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBsc3IudyAgIzUsJSVkMFxuIgkJCQlcCisgICAgICIgICAgYnJhICAgIDRmXG4iCQkJCQlcCisgICAgICIgMzogbW92ZS5sICglMCksKCUxKStcbiIJCQkJXAorICAgICAiMzE6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIjMyOiBtb3ZlLmwgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIzMzogbW92ZS5sICglMCksKCUxKStcbiIJCQkJXAorICAgICAiMzQ6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIjM1OiBtb3ZlLmwgKCUwKSwoJTEpK1xuIgkJCQlcCisgICAgICIzNjogbW92ZS5sICglMCksKCUxKStcbiIJCQkJXAorICAgICAiMzc6IG1vdmUubCAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIiA0OiBkYmYgICAgJSVkMCwzYlxuIgkJCQlcCisgICAgICIgICAgbW92ZS53ICUyLCUlZDBcbiIJCQkJXAorICAgICAiICAgIGxzci53ICAjMiwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBhbmQudyAgIzcsJSVkMFxuIgkJCQlcCisgICAgICIgICAgYnJhICAgIDZmXG4iCQkJCQlcCisgICAgICIgNTogbW92ZS5sICglMCksKCUxKStcbiIJCQkJXAorICAgICAiIDY6IGRiZiAgICAlJWQwLDViXG4iCQkJCVwKKyAgICAgIiAgICBhbmQudyAgIzMsJTJcbiIJCQkJXAorICAgICAiICAgIGJyYSAgICA4ZlxuIgkJCQkJXAorICAgICAiIDc6IG1vdmUuYiAoJTApLCglMSkrXG4iCQkJCVwKKyAgICAgIiA4OiBkYmYgICAgJTIsN2JcbiIJCQkJXAorICAgICAiICAgIG1vdmVxLmwgIzAsICUyXG4iCQkJCVwKKyAgICAgIiA5OiBcbiIJCQkJCQlcCisgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKKyAgICAgIiAgICAuZXZlblxuIgkJCQkJXAorICAgICAiOTA6IG1vdmVxLmwgIzEsICUyXG4iCQkJCVwKKyAgICAgIiAgICBqcmEgOWJcbiIJCQkJCVwKKyAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAorICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCVwKKyAgICAgIiAgIC5hbGlnbiA0XG4iCQkJCQlcCisgICAgICIgICAubG9uZyAgMWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nICAzYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzFiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzMmIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDMzYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzRiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzNWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDM2Yiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzdiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAgNWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nICA3Yiw5MGJcbiIJCQkJXAorICAgICAiLnByZXZpb3VzIgkJCQkJXAorICAgICA6ICI9YSIocyksICI9YSIoZCksICI9ZCIobGVuKQkJCVwKKyAgICAgOiAiMCIocyksICIxIihkKSwgIjIiKGxlbikJCQkJXAorICAgICA6ICJkMCIpCisKKworc3RhdGljIGludCBtYWNzY3NpX3ByZWFkIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKKwkJCSAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKQoreworICAgdW5zaWduZWQgY2hhciAqZDsKKyAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnM7CisKKyAgIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworICAgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisKKyAgIHMgPSBtYWNfc2NzaV9kcnErMHg2MDsKKyAgIGQgPSBkc3Q7CisKKy8qIFRoZXNlIGNvbmRpdGlvbnMgYXJlIGRlcml2ZWQgZnJvbSBNYWNPUyAqLworCisgICB3aGlsZSAoIShOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIEJBU1JfRFJRKSAKKyAgICAgICAgICYmICEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSkKKyAgICAgIDsKKyAgIGlmICghKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9EUlEpIAorICAgICAgICAgJiYgKE5DUjUzODBfcmVhZChCVVNfQU5EX1NUQVRVU19SRUcpICYgQkFTUl9QSEFTRV9NQVRDSCkpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gbWFjc2NzaV9wcmVhZFxuIik7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKKyAgIENQX0lPX1RPX01FTShzLCBkLCBsZW4pOworICAgCisgICBpZiAobGVuICE9IDApIHsKKyAgICAgIHByaW50ayhLRVJOX05PVElDRSAiQnVzIGVycm9yIGluIG1hY3Njc2lfcHJlYWRcbiIpOworICAgICAgcmV0dXJuIC0xOworICAgfQorICAgCisgICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIENQX01FTV9UT19JTyhzLGQsbGVuKQkJCQlcCitfX2FzbV9fIF9fdm9sYXRpbGVfXwkJCQkJXAorICAgICgiICAgIGNtcC53ICAjNCwlMlxuIgkJCQlcCisgICAgICIgICAgYmxzICAgIDhmXG4iCQkJCQlcCisgICAgICIgICAgbW92ZS53ICUwLCUlZDBcbiIJCQkJXAorICAgICAiICAgIG5lZy5iICAlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBhbmQudyAgIzMsJSVkMFxuIgkJCQlcCisgICAgICIgICAgc3ViLncgICUlZDAsJTJcbiIJCQkJXAorICAgICAiICAgIGJyYSAgICAyZlxuIgkJCQkJXAorICAgICAiIDE6IG1vdmUuYiAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIiAyOiBkYmYgICAgJSVkMCwxYlxuIgkJCQlcCisgICAgICIgICAgbW92ZS53ICUyLCUlZDBcbiIJCQkJXAorICAgICAiICAgIGxzci53ICAjNSwlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBicmEgICAgNGZcbiIJCQkJCVwKKyAgICAgIiAzOiBtb3ZlLmwgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIzMTogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiMzI6IG1vdmUubCAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIjMzOiBtb3ZlLmwgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIzNDogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiMzU6IG1vdmUubCAoJTApKywoJTEpXG4iCQkJCVwKKyAgICAgIjM2OiBtb3ZlLmwgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIzNzogbW92ZS5sICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiIDQ6IGRiZiAgICAlJWQwLDNiXG4iCQkJCVwKKyAgICAgIiAgICBtb3ZlLncgJTIsJSVkMFxuIgkJCQlcCisgICAgICIgICAgbHNyLncgICMyLCUlZDBcbiIJCQkJXAorICAgICAiICAgIGFuZC53ICAjNywlJWQwXG4iCQkJCVwKKyAgICAgIiAgICBicmEgICAgNmZcbiIJCQkJCVwKKyAgICAgIiA1OiBtb3ZlLmwgKCUwKSssKCUxKVxuIgkJCQlcCisgICAgICIgNjogZGJmICAgICUlZDAsNWJcbiIJCQkJXAorICAgICAiICAgIGFuZC53ICAjMywlMlxuIgkJCQlcCisgICAgICIgICAgYnJhICAgIDhmXG4iCQkJCQlcCisgICAgICIgNzogbW92ZS5iICglMCkrLCglMSlcbiIJCQkJXAorICAgICAiIDg6IGRiZiAgICAlMiw3YlxuIgkJCQlcCisgICAgICIgICAgbW92ZXEubCAjMCwgJTJcbiIJCQkJXAorICAgICAiIDk6IFxuIgkJCQkJCVwKKyAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQkJXAorICAgICAiICAgIC5ldmVuXG4iCQkJCQlcCisgICAgICI5MDogbW92ZXEubCAjMSwgJTJcbiIJCQkJXAorICAgICAiICAgIGpyYSA5YlxuIgkJCQkJXAorICAgICAiLnByZXZpb3VzXG4iCQkJCQlcCisgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQkJXAorICAgICAiICAgLmFsaWduIDRcbiIJCQkJCVwKKyAgICAgIiAgIC5sb25nICAxYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgIDNiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzMWIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDMyYiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzNiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzNGIsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nIDM1Yiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgMzZiLDkwYlxuIgkJCQlcCisgICAgICIgICAubG9uZyAzN2IsOTBiXG4iCQkJCVwKKyAgICAgIiAgIC5sb25nICA1Yiw5MGJcbiIJCQkJXAorICAgICAiICAgLmxvbmcgIDdiLDkwYlxuIgkJCQlcCisgICAgICIucHJldmlvdXMiCQkJCQlcCisgICAgIDogIj1hIihzKSwgIj1hIihkKSwgIj1kIihsZW4pCQkJXAorICAgICA6ICIwIihzKSwgIjEiKGQpLCAiMiIobGVuKQkJCQlcCisgICAgIDogImQwIikKKworc3RhdGljIGludCBtYWNzY3NpX3B3cml0ZSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCisJCQkJICB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCit7CisgICB1bnNpZ25lZCBjaGFyICpzOworICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqZDsKKworICAgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisgICBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKworICAgcyA9IHNyYzsKKyAgIGQgPSBtYWNfc2NzaV9kcnE7CisgICAKKy8qIFRoZXNlIGNvbmRpdGlvbnMgYXJlIGRlcml2ZWQgZnJvbSBNYWNPUyAqLworCisgICB3aGlsZSAoIShOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSAmIEJBU1JfRFJRKSAKKyAgICAgICAgICYmICghKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSkgCisgICAgICAgICAgICB8fCAoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX1BIQVNFX01BVENIKSkpIAorICAgICAgOworICAgaWYgKCEoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiBCQVNSX0RSUSkpIHsKKyAgICAgIHByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW4gbWFjc2NzaV9wd3JpdGVcbiIpOworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICBDUF9NRU1fVE9fSU8ocywgZCwgbGVuKTsgICAKKworICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIkJ1cyBlcnJvciBpbiBtYWNzY3NpX3B3cml0ZVxuIik7CisgICAgICByZXR1cm4gLTE7CisgICB9CisgICAKKyAgIHJldHVybiAwOworfQorCisKKy8qIFRoZXNlIGNvbnRyb2wgdGhlIGJlaGF2aW91ciBvZiB0aGUgZ2VuZXJpYyA1MzgwIGNvcmUgKi8KKyNkZWZpbmUgQVVUT1NFTlNFCisjZGVmaW5lIFBTRVVET19ETUEKKworI2luY2x1ZGUgIk5DUjUzODAuYyIKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJCT0gIk1hYzUzODAiLAorCS5wcm9jX2luZm8JCQk9IG1hY3Njc2lfcHJvY19pbmZvLAorCS5uYW1lCQkJCT0gIk1hY2ludG9zaCBOQ1I1MzgwIFNDU0kiLAorCS5kZXRlY3QJCQkJPSBtYWNzY3NpX2RldGVjdCwKKwkucmVsZWFzZQkJCT0gbWFjc2NzaV9yZWxlYXNlLAorCS5pbmZvCQkJCT0gbWFjc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IG1hY3Njc2lfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgkJPSBtYWNzY3NpX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBtYWNzY3NpX2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBtYWNzY3NpX2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IG1hY3Njc2lfaG9zdF9yZXNldCwKKwkuY2FuX3F1ZXVlCQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gQ01EX1BFUl9MVU4sCisJLnVuY2hlY2tlZF9pc2FfZG1hCQk9IDAsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBESVNBQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9tYWNfc2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYWIyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ3VtYW5hIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIgZGVmaW5lcworICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBBTFBIQSBSRUxFQVNFIDEuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0CisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICRMb2c6IGN1bWFuYV9OQ1I1MzgwLmgsdiAkCisgKi8KKworI2lmbmRlZiBNQUNfTkNSNTM4MF9ICisjZGVmaW5lIE1BQ19OQ1I1MzgwX0gKKworI2RlZmluZSBNQUNTQ1NJX1BVQkxJQ19SRUxFQVNFIDIKKworI2lmbmRlZiBBU00KKworI2lmbmRlZiBDTURfUEVSX0xVTgorI2RlZmluZSBDTURfUEVSX0xVTiAyCisjZW5kaWYKKworI2lmbmRlZiBDQU5fUVVFVUUKKyNkZWZpbmUgQ0FOX1FVRVVFIDE2CisjZW5kaWYKKworI2lmbmRlZiBTR19UQUJMRVNJWkUKKyNkZWZpbmUgU0dfVEFCTEVTSVpFIFNHX05PTkUKKyNlbmRpZgorCisjaWZuZGVmIFVTRV9UQUdHRURfUVVFVUlORworI2RlZmluZQlVU0VfVEFHR0VEX1FVRVVJTkcgMAorI2VuZGlmCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2lmbmRlZiBIT1NUU19DCisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgXAorICAgIGludCBwb3J0LCBjdHJsCisKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkgXAorICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpfaW5zdGFuY2UKKworI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKSBcCisgICAgICAgIF9pbnN0YW5jZSA9IGluc3RhbmNlCisKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgbWFjc2NzaV9yZWFkKF9pbnN0YW5jZSwgcmVnKQorI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIG1hY3Njc2lfd3JpdGUoX2luc3RhbmNlLCByZWcsIHZhbHVlKQorCisjZGVmaW5lIE5DUjUzODBfcHJlYWQgCW1hY3Njc2lfcHJlYWQKKyNkZWZpbmUgTkNSNTM4MF9wd3JpdGUgCW1hY3Njc2lfcHdyaXRlCisJCisjZGVmaW5lIE5DUjUzODBfaW50ciBtYWNzY3NpX2ludHIKKyNkZWZpbmUgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIG1hY3Njc2lfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX2Fib3J0IG1hY3Njc2lfYWJvcnQKKyNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQgbWFjc2NzaV9idXNfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9kZXZpY2VfcmVzZXQgbWFjc2NzaV9kZXZpY2VfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9ob3N0X3Jlc2V0IG1hY3Njc2lfaG9zdF9yZXNldAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbyBtYWNzY3NpX3Byb2NfaW5mbworCisjZGVmaW5lIEJPQVJEX05PUk1BTAkwCisjZGVmaW5lIEJPQVJEX05DUjUzQzQwMAkxCisKKyNlbmRpZiAvKiBuZGVmIEhPU1RTX0MgKi8KKyNlbmRpZiAvKiBuZGVmIEFTTSAqLworI2VuZGlmIC8qIE1BQ19OQ1I1MzgwX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jIGIvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGM3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWNhXzUzYzl4LmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qIG1jYV81M2M5eC5jOiBEcml2ZXIgZm9yIHRoZSBTQ1NJIGFkYXB0ZXIgZm91bmQgb24gTkNSIDM1eHgKKyAqICAoYW5kIG1heWJlIHNvbWUgb3RoZXIpIE1pY3JvY2hhbm5lbCBtYWNoaW5lcworICoKKyAqIENvZGUgdGFrZW4gbW9zdGx5IGZyb20gQ3liZXJzdG9ybSBTQ1NJIGRyaXZlcnMKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCisgKgorICogSGFja2VkIHRvIHdvcmsgd2l0aCB0aGUgTkNSIE1DQSBzdHVmZiBieSBUeW1tIFR3aWxsbWFuICh0eW1tQGNvbXB1dGVyLm9yZykKKyAqCisgKiBUaGUgQ3liZXJTdG9ybSBTQ1NJIGRyaXZlciAoYW5kIHRoaXMgZHJpdmVyKSBpcyBiYXNlZCBvbiBEYXZpZCBTLiBNaWxsZXIncworICogICBFU1AgZHJpdmVyICAqIGZvciB0aGUgU3BhcmMgY29tcHV0ZXJzLiAKKyAqIAorICogU3BlY2lhbCB0aGFua3MgdG8gS2VuIFN0ZXdhcnQgYXQgU3ltYmlvcyAoTFNJKSBmb3IgaGVscGluZyB3aXRoIGluZm8gb24KKyAqICB0aGUgODZDMDEuICBJIHdhcyBvbiB0aGUgYnJpbmsgb2YgZ29pbmcgZ2EtZ2EuLi4KKyAqCisgKiBBbHNvIHRoYW5rcyB0byBKZXNwZXIgU2tvdiBmb3IgaGVscGluZyBtZSB3aXRoIGluZm8gb24gaG93IHRoZSBBbWlnYQorICogIGRvZXMgdGhpbmdzLi4uCisgKi8KKworLyoKKyAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc2V0IHVwIHRvIHVzZSBvbmUgNTNjOXggY2FyZCBhdCBhIHRpbWU7IGl0IGNvdWxkIGJlIAorICogIGNoYW5nZWQgZmFpcmx5IGVhc2lseSB0byBkZXRlY3QvdXNlIG1vcmUgdGhhbiBvbmUsIGJ1dCBJJ20gbm90IHRvbyBzdXJlIGhvdworICogIG1hbnkgY2FyZHMgdGhhdCB1c2UgdGhlIDUzYzl4IG9uIE1DQSBzeXN0ZW1zIHRoZXJlIGFyZSAoaWYsIGluIGZhY3QsIHRoZXJlCisgKiAgYXJlIGNhcmRzIHRoYXQgdXNlIHRoZW0sIG90aGVyIHRoYW4gdGhlIG9uZSBidWlsdCBpbnRvIHNvbWUgTkNSIHN5c3RlbXMpLi4uCisgKiAgSWYgYW55b25lIHJlcXVlc3RzIHRoaXMsIEknbGwgdGhyb3cgaXQgaW4sIG90aGVyd2lzZSBpdCdzIG5vdCB3b3J0aCB0aGUKKyAqICBlZmZvcnQuCisgKi8KKworLyoKKyAqIEluZm8gb24gdGhlIDg2QzAxIE1DQSBpbnRlcmZhY2UgY2hpcCBhdCB0aGUgYm90dG9tLCBpZiB5b3UgY2FyZSBlbm91Z2ggdG8KKyAqICBsb29rLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiTkNSNTNDOXguaCIKKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21jYV9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKgorICogRnJvbSBpYm1tY2EuYyAoSUJNIHNjc2kgY29udHJvbGxlciBjYXJkIGRyaXZlcikgLS0gdXNlZCBmb3IgdHVybmluZyBQUzIgZGlzaworICogIGFjdGl2aXR5IExFRCBvbiBhbmQgb2ZmCisgKi8KKworI2RlZmluZSBQUzJfU1lTX0NUUgkweDkyCisKKy8qIFBvcnRzIHRoZSBuY3IncyA1M2M5NCBjYW4gYmUgcHV0IGF0OyBpbmRleGVkIGJ5IHBvcyByZWdpc3RlciB2YWx1ZSAqLworCisjZGVmaW5lIE1DQV81M0M5WF9JT19QT1JUUyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAweDAyNDAsIDB4MDM0MCwgMHgwNDAwLCBcCisJICAgICAgICAgICAgICAgICAweDA0MjAsIDB4MzI0MCwgMHg4MjQwLCAweEEyNDAsIFwKKwkgICAgICAgICAgICAgICAgfQorCQkJCisvKgorICogU3VwcG9zZWRseSB0aGVyZSB3ZXJlIHNvbWUgY2FyZHMgcHV0IHRvZ2V0aGVyIHdpdGggdGhlICdjOXggYW5kIDg2YzAxLiAgSWYKKyAqICAgdGhleSBoYXZlIGRpZmZlcmVudCBJRCdzIGZyb20gdGhlIG9uZXMgb24gdGhlIDM1MDAgc2VyaWVzIG1hY2hpbmVzLCAKKyAqICAgeW91IGNhbiBhZGQgdGhlbSBoZXJlIGFuZCBob3BlZnVsbHkgdGhpbmdzIHdpbGwgd29yayBvdXQuCisgKi8KKwkJCQorI2RlZmluZSBNQ0FfNTNDOVhfSURTIHsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0Y0QywgXAorCQkJIDB4MDAwMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgfQorCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqLCBpbnQpOworc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqLCBTY3NpX0NtbmQgKik7CitzdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqLCBfX3UzMiwgaW50KTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICopOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICopOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKik7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKik7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqKTsKKworLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dCBiZWZvcmUgdGhleSBhcmUgdHJhc2ZlcmVkIHRvIHRoZSAKKyAqICA1M2M5eCB2aWEgUElPLgorICovCisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbMTZdOworCisvKgorICogV2Uga2VlcCB0aGUgc3RydWN0dXJlIHRoYXQgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycyBvbiB0aGUgNTNjOXgKKyAqICBoZXJlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgRVNQX3JlZ3MgZXJlZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KK3N0YXRpYyBpbnQgbWNhX2VzcF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworCXN0cnVjdCBOQ1JfRVNQICplc3A7CisJc3RhdGljIGludCBpb19wb3J0X2J5X3Bvc1tdID0gTUNBXzUzQzlYX0lPX1BPUlRTOworCWludCBtY2FfNTNjOXhfaWRzW10gPSBNQ0FfNTNDOVhfSURTOworCWludCAqaWRfdG9fY2hlY2sgPSBtY2FfNTNjOXhfaWRzOworCWludCBzbG90OworCWludCBwb3NbM107CisJdW5zaWduZWQgaW50IHRtcF9pb19hZGRyOworCXVuc2lnbmVkIGNoYXIgdG1wX2J5dGU7CisKKworCWlmICghTUNBX2J1cykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKmlkX3RvX2NoZWNrKSB7IAorCQlpZiAoKHNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKCppZF90b19jaGVjaywgMCkpICE9CisJCSAgTUNBX05PVEZPVU5EKSAKKwkJeworCQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopIE5VTEwpOworCisJCQlwb3NbMF0gPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCQkJcG9zWzFdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAzKTsKKwkJCXBvc1syXSA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgNCk7CisKKwkJCWVzcC0+ZXJlZ3MgPSAmZXJlZ3M7CisKKwkJCS8qCisJCQkgKiBJTyBwb3J0IGJhc2UgaXMgZ2l2ZW4gaW4gdGhlIGZpcnN0IChub24tSUQpIHBvcworCQkJICogIHJlZ2lzdGVyLCBsaWtlIHNvOgorCQkJICoKKwkJCSAqICBCaXRzIDMgIDIgIDEgICAgICAgSU8gYmFzZQorCQkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogICAgICAgMCAgMCAgMCAgICAgICA8ZGlzYWJsZWQ+CisJCQkgKiAgICAgICAwICAwICAxICAgICAgIDB4MDI0MAorCQkJICogICAgICAgMCAgMSAgMCAgICAgICAweDAzNDAKKwkJCSAqICAgICAgIDAgIDEgIDEgICAgICAgMHgwNDAwCisJCQkgKiAgICAgICAxICAwICAwICAgICAgIDB4MDQyMAorCQkJICogICAgICAgMSAgMCAgMSAgICAgICAweDMyNDAKKwkJCSAqICAgICAgIDEgIDEgIDAgICAgICAgMHg4MjQwCisJCQkgKiAgICAgICAxICAxICAxICAgICAgIDB4QTI0MAorCQkJICovCisKKwkJCXRtcF9pb19hZGRyID0KKwkJCSAgaW9fcG9ydF9ieV9wb3NbKHBvc1swXSAmIDB4MEUpID4+IDFdOworCisJCQllc3AtPmVyZWdzLT5pb19hZGRyID0gdG1wX2lvX2FkZHIgKyAweDEwOworCisgICAgICAJCQlpZiAoZXNwLT5lcmVncy0+aW9fYWRkciA9PSAweDAwMDApIHsgCisgICAgICAgIAkJCXByaW50aygiQWRhcHRlciBpcyBkaXNhYmxlZC5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogSVJRIGlzIHNwZWNpZmllZCBpbiBiaXRzIDQgYW5kIDU6CisJCQkgKgorCQkJICogIEJpdHMgIDQgIDUgICAgICAgIElSUQorCQkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgICAgICAwICAwICAgICAgICAgMworCQkJICogICAgICAgIDAgIDEgICAgICAgICA1CisJCQkgKiAgICAgICAgMSAgMCAgICAgICAgIDcKKwkJCSAqICAgICAgICAxICAxICAgICAgICAgOQorCQkJICovCisKKyAgICAgIAkJCWVzcC0+aXJxID0gKChwb3NbMF0gJiAweDMwKSA+PiAzKSArIDM7CisKKwkJCS8qCisJCQkgKiBETUEgY2hhbm5lbCBpcyBpbiB0aGUgbG93IDMgYml0cyBvZiB0aGUgc2Vjb25kCisJCQkgKiAgUE9TIHJlZ2lzdGVyCisJCQkgKi8KKworCQkJZXNwLT5kbWEgPSBwb3NbMV0gJiA3OworCQkJZXNwLT5zbG90ID0gc2xvdDsKKworCQkJaWYgKHJlcXVlc3RfaXJxKGVzcC0+aXJxLCBlc3BfaW50ciwgMCwKKwkJCSAiTkNSIDUzYzl4IFNDU0kiLCBlc3AtPmVob3N0KSkKKwkJCXsKKwkJCQlwcmludGsoIlVuYWJsZSB0byByZXF1ZXN0IElSUSAlZC5cbiIsIGVzcC0+aXJxKTsKKwkJCQllc3BfZGVhbGxvY2F0ZShlc3ApOworCQkJCXNjc2lfdW5yZWdpc3Rlcihlc3AtPmVob3N0KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworIAkJCWlmIChyZXF1ZXN0X2RtYShlc3AtPmRtYSwgIk5DUiA1M2M5eCBTQ1NJIikpIHsKKwkJCQlwcmludGsoIlVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsICVkLlxuIiwKKwkJCQkgZXNwLT5kbWEpOworCQkJCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3BfaW50cik7CisJCQkJZXNwX2RlYWxsb2NhdGUoZXNwKTsKKwkJCQlzY3NpX3VucmVnaXN0ZXIoZXNwLT5laG9zdCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXJlcXVlc3RfcmVnaW9uKHRtcF9pb19hZGRyLCAzMiwgIk5DUiA1M2M5eCBTQ1NJIik7CisKKwkJCS8qCisJCQkgKiA4NkMwMSBoYW5kbGVzIERNQSwgSU8gbW9kZSwgZnJvbSBhZGRyZXNzCisJCQkgKiAgKGJhc2UgKyAweDBhKQorCQkJICovCisKKwkJCW1jYV9kaXNhYmxlX2RtYShlc3AtPmRtYSk7CisJCQltY2Ffc2V0X2RtYV9pbyhlc3AtPmRtYSwgdG1wX2lvX2FkZHIgKyAweDBhKTsKKwkJCW1jYV9lbmFibGVfZG1hKGVzcC0+ZG1hKTsKKyAKKwkJCS8qIFRlbGwgdGhlIDg2QzAxIHRvIGdpdmUgdXMgaW50ZXJydXB0cyAqLworCisJCQl0bXBfYnl0ZSA9IGluYih0bXBfaW9fYWRkciArIDB4MDIpIHwgMHg0MDsKKwkJCW91dGIodG1wX2J5dGUsIHRtcF9pb19hZGRyICsgMHgwMik7IAorCisJCQkvKgorCQkJICogU2NzaSBJRCAtLSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIsIGhpCisJCQkgKiAgMiBiaXRzOyBhZGQgNCB0byB0aGlzIG51bWJlciB0byBnZXQgdGhlCisJCQkgKiAgSUQKKwkJCSAqLworCisJCQllc3AtPnNjc2lfaWQgPSAoKHBvc1syXSAmIDB4QzApID4+IDYpICsgNDsKKworCQkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCisKKwkJCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOworCisJCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKworCQkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwkJCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCQkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKKwkJCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCQkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwkJCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKKwkJCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOworCQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKworCQkJZXNwLT5kbWFfYmFycmllciA9IE5VTEw7CisJCQllc3AtPmRtYV9kcmFpbiA9IE5VTEw7CisJCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gTlVMTDsKKwkJCWVzcC0+ZG1hX2lycV9lbnRyeSA9IE5VTEw7CisJCQllc3AtPmRtYV9pcnFfZXhpdCA9IE5VTEw7CisJCQllc3AtPmRtYV9sZWRfb24gPSBkbWFfbGVkX29uOworCQkJZXNwLT5kbWFfbGVkX29mZiA9IGRtYV9sZWRfb2ZmOworCQkJZXNwLT5kbWFfcG9sbCA9IE5VTEw7CisJCQllc3AtPmRtYV9yZXNldCA9IE5VTEw7CisKKwkJCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KKworCQkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikKKwkJCSAgY21kX2J1ZmZlcjsKKwkgCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSBpc2FfdmlydF90b19idXMoY21kX2J1ZmZlcik7CisKKwkJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCisJCQllc3AtPmNmcmVxID0gMjUwMDAwMDA7CisKKwkJCS8qIERpZmZlcmVudGlhbCBTQ1NJPyBJIHRoaW5rIG5vdC4gKi8KKworCQkJZXNwLT5kaWZmID0gMDsKKworCQkJZXNwX2luaXRpYWxpemUoZXNwKTsKKworICAgICAgCQkJcHJpbnRrKCIgQWRhcHRlciBmb3VuZCBpbiBzbG90ICUyZDogaW8gcG9ydCAweCV4ICIKKwkJCSAgImlycSAlZCBkbWEgY2hhbm5lbCAlZFxuIiwgc2xvdCArIDEsIHRtcF9pb19hZGRyLAorCQkJICAgZXNwLT5pcnEsIGVzcC0+ZG1hKTsKKworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIk5DUiA1M0M5WCBTQ1NJIEFkYXB0ZXIiKTsKKwkJCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisKKwkJCWJyZWFrOworCQl9CisgICAgCisJCWlkX3RvX2NoZWNrKys7CisJfQorCisJcmV0dXJuIGVzcHNfaW5fdXNlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJlbGVhc2UgKi8KKworc3RhdGljIGludCBtY2FfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwID0gKHN0cnVjdCBOQ1JfRVNQICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciB0bXBfYnl0ZTsKKworCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJLyoKKwkgKiBUZWxsIHRoZSA4NkMwMSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cworCSAqLworCisJdG1wX2J5dGUgPSBpbmIoZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpOworCXRtcF9ieXRlICY9IH4weDQwOworCW91dGIodG1wX2J5dGUsIGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKTsKKworCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3BfaW50cik7CisJZnJlZV9kbWEoZXNwLT5kbWEpOworCisJbWNhX21hcmtfYXNfdW51c2VkKGVzcC0+c2xvdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKwkvKiBBc2sgdGhlIDUzYzl4LiAgSXQga25vd3MuICovCisKKwlyZXR1cm4gZmlmb19jb3VudDsKK30KKworc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisJLyogCisJICogVGhlIE1DQSBkbWEgY2hhbm5lbHMgY2FuIG9ubHkgZG8gdXAgdG8gMTI4SyBieXRlcyBhdCBhIHRpbWUuCisgICAgICAgICAqICAoMTYgYml0IG1vZGUpCisJICovCisKKwl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworCWlmKHN6ID4gMHgyMDAwMCkKKwkJc3ogPSAweDIwMDAwOworCXJldHVybiBzejsKK30KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkvKgorCSAqIERvZXNuJ3QgcXVpdGUgbWF0Y2ggdXAgdG8gdGhlIG90aGVyIGRyaXZlcnMsIGJ1dCB3ZSBkbyB3aGF0IHdlCisJICogIGNhbi4KKwkgKi8KKworCUVTUExPRygoImVzcCVkOiBkbWEgY2hhbm5lbCA8JWQ+XG4iLCBlc3AtPmVzcF9pZCwgZXNwLT5kbWEpKTsKKwlFU1BMT0coKCJieXRlcyBsZWZ0IHRvIGRtYTogJWRcbiIsIG1jYV9nZXRfZG1hX3Jlc2lkdWUoZXNwLT5kbWEpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCW1jYV9kaXNhYmxlX2RtYShlc3AtPmRtYSk7CisJbWNhX3NldF9kbWFfbW9kZShlc3AtPmRtYSwgTUNBX0RNQV9NT0RFX1hGRVIgfCBNQ0FfRE1BX01PREVfMTYgfAorCSAgTUNBX0RNQV9NT0RFX0lPKTsKKwltY2Ffc2V0X2RtYV9hZGRyKGVzcC0+ZG1hLCBhZGRyKTsKKwltY2Ffc2V0X2RtYV9jb3VudChlc3AtPmRtYSwgbGVuZ3RoIC8gMik7IC8qICEhISAqLworCW1jYV9lbmFibGVfZG1hKGVzcC0+ZG1hKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJbWNhX2Rpc2FibGVfZG1hKGVzcC0+ZG1hKTsKKwltY2Ffc2V0X2RtYV9tb2RlKGVzcC0+ZG1hLCBNQ0FfRE1BX01PREVfWEZFUiB8IE1DQV9ETUFfTU9ERV9XUklURSB8CisJICBNQ0FfRE1BX01PREVfMTYgfCBNQ0FfRE1BX01PREVfSU8pOworCW1jYV9zZXRfZG1hX2FkZHIoZXNwLT5kbWEsIGFkZHIpOworCW1jYV9zZXRfZG1hX2NvdW50KGVzcC0+ZG1hLCBsZW5ndGggLyAyKTsgLyogISEhICovCisJbWNhX2VuYWJsZV9kbWEoZXNwLT5kbWEpOworCisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCS8qCisJICogVGVsbCB0aGUgJ0MwMSB0byBzaHV0IHVwLiAgQWxsIGludGVycnVwdHMgYXJlIHJvdXRlZCB0aHJvdWdoIGl0LgorCSAqLworCisJb3V0YihpbmIoZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpICYgfjB4NDAsCisJIGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkvKgorCSAqIE9rLiAgWW91IGNhbiBzcGVhayBhZ2Fpbi4KKwkgKi8KKworCW91dGIoaW5iKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKSB8IDB4NDAsCisJIGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDBFKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkvKgorCSAqIERhdmVNIHNheXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSAieWVzIiBpZiB0aGVyZSBpcyBhbiBpbnRlcnJ1cHQKKwkgKiAgb3IgYSBETUEgZXJyb3Igb2NjdXJyZWQuICBJIGNvcGllZCB0aGUgQW1pZ2EgZHJpdmVyJ3Mgc2VtYW50aWNzLAorCSAqICB0aG91Z2gsIGJlY2F1c2UgaXQgc2VlbXMgdG8gd29yayBhbmQgd2UgY2FuJ3QgcmVhbGx5IHRlbGwgaWYKKwkgKiAgYSBETUEgZXJyb3IgaGFwcGVuZWQuICBUaGlzIGdpdmVzIHRoZSAieWVzIiBpZiB0aGUgc2NzaSBjaGlwCisJICogIGlzIHNlbmRpbmcgYW4gaW50ZXJydXB0IGFuZCBubyBETUEgYWN0aXZpdHkgaXMgdGFraW5nIHBsYWNlCisJICovCisKKwlyZXR1cm4gKCEoaW5iKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDA0KSAmIDEpICYmCisJICEoaW5iKGVzcC0+ZXJlZ3MtPmlvX2FkZHIgLSAweDA0KSAmIDIpICk7IAorfQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBvbiB0aGUgJ0MwMSAoaW4gY2FzZSBhYm9ydAorCSAqICBpcyBlbnRlcmVkIG11bHRpcGxlIHRpbWVzLCBzbyB3ZSBvbmx5IGRvIHRoZSBhYm9ydCBvbmNlKQorCSAqLworCisJcmV0dXJuIChpbmIoZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpICYgMHg0MCkgPyAxOjA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKK3sKKwlpZih3cml0ZSl7CisJCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworCX0gZWxzZSB7CisJCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7CisJfQorfQorCisvKgorICogVGhlc2Ugd2lsbCBub3QgcGxheSBuaWNlbHkgd2l0aCBvdGhlciBkaXNrIGNvbnRyb2xsZXJzIHRoYXQgdHJ5IHRvIHVzZSB0aGUKKyAqICBkaXNrIGFjdGl2ZSBMRUQuLi4gYnV0IHdoYXQgY2FuIHlvdSBkbz8gIERvbid0IGFuc3dlciB0aGF0LgorICoKKyAqIFN0b2xlbiBzaGFtZWxlc3NseSBmcm9tIGlibW1jYS5jIC0tIElCTSBNaWNyb2NoYW5uZWwgU0NTSSBhZGFwdGVyIGRyaXZlcgorICoKKyAqLworCitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJb3V0YihpbmIoUFMyX1NZU19DVFIpIHwgMHhjMCwgUFMyX1NZU19DVFIpOworfQorCitzdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCW91dGIoaW5iKFBTMl9TWVNfQ1RSKSAmIDB4M2YsIFBTMl9TWVNfQ1RSKTsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAibWNhXzUzYzl4IiwKKwkubmFtZQkJCT0gIk5DUiA1M2M5eCBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBtY2FfZXNwX2RldGVjdCwKKwkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAorCS5yZWxlYXNlCQk9IG1jYV9lc3BfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51bmNoZWNrZWRfaXNhX2RtYQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworLyoKKyAqIE9LLCBoZXJlJ3MgdGhlIGdvb2RzIEkgcHJvbWlzZWQuICBUaGUgTkNSIDg2QzAxIGlzIGFuIE1DQSBpbnRlcmZhY2UgY2hpcCAKKyAqICB0aGF0IGhhbmRsZXMgZW5hYmxpbmcvZGlhYmxpbmcgSVJRLCBkbWEgaW50ZXJmYWNpbmcsIElPIHBvcnQgc2VsZWN0aW9uCisgKiAgYW5kIG90aGVyIGZ1biBzdHVmZi4gIEl0IHRha2VzIHVwIDE2IGFkZHJlc3NlcywgYW5kIHRoZSBjaGlwIGl0IGlzCisgKiAgY29ubm5lY3RlZCB0byBnZXRzIHRoZSBmb2xsb3dpbmcgMTYuICBSZWdpc3RlcnMgYXJlIGFzIGZvbGxvd3M6CisgKgorICogT2Zmc2V0cyAwLTEgOiBDYXJkIElECisgKgorICogT2Zmc2V0ICAgIDIgOiBNb2RlIGVuYWJsZSByZWdpc3RlciAtLQorICogICAgICAgICAgICAgICAgQml0ICAgIDcgOiBEYXRhIFdvcmQgd2lkdGggKDEgPSAxNiwgMCA9IDgpCisgKgkJICBCaXQgICAgNiA6IElSUSBlbmFibGUgKDEgPSBlbmFibGVkKQorICogICAgICAgICAgICAgICAgQml0cyA1LDQgOiBJUlEgc2VsZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDAgOiBJUlEgMworICoJCQkgICAgICAgIDAgIDEgOiBJUlEgNQorICogCQkJCTEgIDAgOiBJUlEgNworICogIAkJCQkxICAxIDogSVJRIDkKKyAqICAgICAgICAgICAgICAgIEJpdHMgMy0xIDogQmFzZSBBZGRyZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDAgIDAgOiA8ZGlzYWJsZWQ+CisgKiAJCQkgICAgIDAgIDAgIDEgOiAweDAyNDAKKyAqICAgIAkJCSAgICAgMCAgMSAgMCA6IDB4MDM0MAorICogICAgIAkJCSAgICAgMCAgMSAgMSA6IDB4MDQwMAorICogCQkJICAgICAxICAwICAwIDogMHgwNDIwCisgKiAJCQkgICAgIDEgIDAgIDEgOiAweDMyNDAKKyAqIAkJCSAgICAgMSAgMSAgMCA6IDB4ODI0MAorICogCQkJICAgICAxICAxICAxIDogMHhBMjQwCisgKgkJICBCaXQgICAgMCA6IENhcmQgZW5hYmxlICgxID0gZW5hYmxlZCkKKyAqCisgKiBPZmZzZXQgICAgMyA6IERNQSBjb250cm9sIHJlZ2lzdGVyIC0tCisgKiAgICAgICAgICAgICAgICBCaXQgICAgNyA6IERNQSBlbmFibGUgKDEgPSBlbmFibGVkKQorICogICAgICAgICAgICAgICAgQml0cyA2LDUgOiBQcmVlbXQgQ291bnQgU2VsZWN0ICh0cmFuc2ZlcnMgdG8gY29tcGxldGUgYWZ0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMDEgaGFzIGJlZW4gcHJlZW1wdGVkIG9uIE1DQSBidXMpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDAgOiAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDEgOiAxCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDAgOiAzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDEgOiA3CisgKiAgKGFsbCB0aGVzZSB3YWNreSBudW1iZXJzOyBJJ20gc3VyZSB0aGVyZSdzIGEgcmVhc29uIHNvbWV3aGVyZSkKKyAqICAgICAgICAgICAgICAgIEJpdCAgICA0IDogRmFpcm5lc3MgZW5hYmxlICgxID0gZmFpciBidXMgcHJpb3JpdHkpCisgKiAgICAgICAgICAgICAgICBCaXRzIDMtMCA6IEFyYml0cmF0aW9uIGxldmVsICgwLTE1IGNvbnNlY3V0aXZlKQorICogCisgKiBPZmZzZXQgICAgNCA6IEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcgorICogICAgICAgICAgICAgICAgQml0cyA3LTMgOiBVc2VyIGRlZmluYWJsZSAoaGVyZSwgNyw2IGFyZSBTQ1NJIElEKQorICogICAgICAgICAgICAgICAgQml0cyAyLTAgOiByZXNlcnZlZAorICoKKyAqIE9mZnNldCAgIDEwIDogRE1BIGRlY29kZSByZWdpc3RlciAodXNlZCBmb3IgSU8gYmFzZWQgRE1BOyBhbHNvIGNhbiBkbworICogICAgICAgICAgICAgICAgUElPIHRocm91Z2ggdGhpcyBwb3J0KQorICoKKyAqIE9mZnNldCAgIDEyIDogU3RhdHVzCisgKiAgICAgICAgICAgICAgICBCaXRzIDctMiA6IHJlc2VydmVkCisgKiAgICAgICAgICAgICAgICBCaXQgICAgMSA6IERNQSBwZW5kaW5nICgxID0gcGVuZGluZykKKyAqICAgICAgICAgICAgICAgIEJpdCAgICAwIDogSVJRIHBlbmRpbmcgKDAgPSBwZW5kaW5nKQorICoKKyAqIEV4Y2l0aW5nLCBodWg/ICAKKyAqCisgKi8gICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzA3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwpAQCAtMCwwICsxLDUxMjIgQEAKKy8qCisgKgorICoJCQlMaW51eCBNZWdhUkFJRCBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IKkgMjAwMiAgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCSAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyICBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgkgIC0gZml4ZXMKKyAqCSAgLSBzcGVlZC11cHMgKGxpc3QgaGFuZGxpbmcgZml4ZXMsIGlzc3VlZF9saXN0LCBvcHRpbWl6YXRpb25zLikKKyAqCSAgLSBsb3RzIG9mIGNsZWFudXBzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAbHN0LmRlPgorICoJICAtIG5ldy1zdHlsZSwgaG90cGx1Zy1hd2FyZSBwY2kgcHJvYmluZyBhbmQgc2NzaSByZWdpc3RyYXRpb24KKyAqCisgKiBWZXJzaW9uIDogdjIuMDAuMyAoRmViIDE5LCAyMDAzKSAtIEF0dWwgTXVra2VyIDxBdHVsLk11a2tlckBsc2lsLmNvbT4KKyAqCisgKiBEZXNjcmlwdGlvbjogTGludXggZGV2aWNlIGRyaXZlciBmb3IgTFNJIExvZ2ljIE1lZ2FSQUlEIGNvbnRyb2xsZXIKKyAqCisgKiBTdXBwb3J0ZWQgY29udHJvbGxlcnM6IE1lZ2FSQUlEIDQxOCwgNDI4LCA0MzgsIDQ2NiwgNzYyLCA0NjcsIDQ3MSwgNDkwLCA0OTMKKyAqCQkJCQk1MTgsIDUyMCwgNTMxLCA1MzIKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBzdXBwb3J0ZWQgYnkgTFNJIExvZ2ljLCB3aXRoIGFzc2lzdGFuY2UgZnJvbSBSZWQgSGF0LCBEZWxsLAorICogYW5kIG90aGVycy4gUGxlYXNlIHNlbmQgdXBkYXRlcyB0byB0aGUgbWFpbGluZyBsaXN0CisgKiBsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZyAuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJtZWdhcmFpZC5oIgorCisjZGVmaW5lIE1FR0FSQUlEX01PRFVMRV9WRVJTSU9OICIyLjAwLjMiCisKK01PRFVMRV9BVVRIT1IgKCJMU0kgTG9naWMgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkxTSSBMb2dpYyBNZWdhUkFJRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihNRUdBUkFJRF9NT0RVTEVfVkVSU0lPTik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2NtZF9wZXJfbHVuID0gREVGX0NNRF9QRVJfTFVOOworbW9kdWxlX3BhcmFtKG1heF9jbWRfcGVyX2x1biwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9jbWRfcGVyX2x1biwgIk1heGltdW0gbnVtYmVyIG9mIGNvbW1hbmRzIHdoaWNoIGNhbiBiZSBpc3N1ZWQgdG8gYSBzaW5nbGUgTFVOIChkZWZhdWx0PURFRl9DTURfUEVSX0xVTj02MykiKTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGludCBtYXhfc2VjdG9yc19wZXJfaW8gPSBNQVhfU0VDVE9SU19QRVJfSU87Cittb2R1bGVfcGFyYW0obWF4X3NlY3RvcnNfcGVyX2lvLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2VjdG9yc19wZXJfaW8sICJNYXhpbXVtIG51bWJlciBvZiBzZWN0b3JzIHBlciBJL08gcmVxdWVzdCAoZGVmYXVsdD1NQVhfU0VDVE9SU19QRVJfSU89MTI4KSIpOworCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgbWF4X21ib3hfYnVzeV93YWl0ID0gTUJPWF9CVVNZX1dBSVQ7Cittb2R1bGVfcGFyYW0obWF4X21ib3hfYnVzeV93YWl0LCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfbWJveF9idXN5X3dhaXQsICJNYXhpbXVtIHdhaXQgZm9yIG1haWxib3ggaW4gbWljcm9zZWNvbmRzIGlmIGJ1c3kgKGRlZmF1bHQ9TUJPWF9CVVNZX1dBSVQ9MTApIik7CisKKyNkZWZpbmUgUkRJTkRPT1IoYWRhcHRlcikJCXJlYWRsKChhZGFwdGVyKS0+YmFzZSArIDB4MjApCisjZGVmaW5lIFJET1VURE9PUihhZGFwdGVyKQkJcmVhZGwoKGFkYXB0ZXIpLT5iYXNlICsgMHgyQykKKyNkZWZpbmUgV1JJTkRPT1IoYWRhcHRlcix2YWx1ZSkJCXdyaXRlbCh2YWx1ZSwgKGFkYXB0ZXIpLT5iYXNlICsgMHgyMCkKKyNkZWZpbmUgV1JPVVRET09SKGFkYXB0ZXIsdmFsdWUpCXdyaXRlbCh2YWx1ZSwgKGFkYXB0ZXIpLT5iYXNlICsgMHgyQykKKworLyoKKyAqIEdsb2JhbCB2YXJpYWJsZXMKKyAqLworCitzdGF0aWMgaW50IGhiYV9jb3VudDsKK3N0YXRpYyBhZGFwdGVyX3QgKmhiYV9zb2Z0X3N0YXRlW01BWF9DT05UUk9MTEVSU107CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICptZWdhX3Byb2NfZGlyX2VudHJ5OworCisvKiBGb3IgY29udHJvbGxlciByZS1vcmRlcmluZyAqLworc3RhdGljIHN0cnVjdCBtZWdhX2hiYXMgbWVnYV9oYmFzW01BWF9DT05UUk9MTEVSU107CisKKy8qCisgKiBUaGUgRmlsZSBPcGVyYXRpb25zIHN0cnVjdHVyZSBmb3IgdGhlIHNlcmlhbC9pb2N0bCBpbnRlcmZhY2Ugb2YgdGhlIGRyaXZlcgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZWdhZGV2X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBtZWdhZGV2X2lvY3RsLAorCS5vcGVuCQk9IG1lZ2FkZXZfb3BlbiwKK307CisKKy8qCisgKiBBcnJheSB0byBzdHJ1Y3R1cmVzIGZvciBzdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbGxlcnMuIFRoaXMKKyAqIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gdGhlIHVzZXIgbGV2ZWwgYXBwbGljYXRpb25zLCB3aGVuIHRoZXkgZG8gYW4gaW9jdGwKKyAqIGZvciB0aGlzIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IG1jb250cm9sbGVyIG1jb250cm9sbGVyW01BWF9DT05UUk9MTEVSU107CisKKy8qIFRoZSBjdXJyZW50IGRyaXZlciB2ZXJzaW9uICovCitzdGF0aWMgdTMyIGRyaXZlcl92ZXIgPSAweDAyMDAwMDAwOworCisvKiBtYWpvciBudW1iZXIgdXNlZCBieSB0aGUgZGV2aWNlIGZvciBjaGFyYWN0ZXIgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IG1ham9yOworCisjZGVmaW5lIElTX1JBSURfQ0goaGJhLCBjaCkJKCgoaGJhKS0+bWVnYV9jaF9jbGFzcyA+PiAoY2gpKSAmIDB4MDEpCisKKworLyoKKyAqIERlYnVnIHZhcmlhYmxlIHRvIHByaW50IHNvbWUgZGlhZ25vc3RpYyBtZXNzYWdlcworICovCitzdGF0aWMgaW50IHRyYWNlX2xldmVsOworCisvKioKKyAqIG1lZ2Ffc2V0dXBfbWFpbGJveCgpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBBbGxvY2F0ZXMgYSA4IGJ5dGUgYWxpZ25lZCBtZW1vcnkgZm9yIHRoZSBoYW5kc2hha2UgbWFpbGJveC4KKyAqLworc3RhdGljIGludAorbWVnYV9zZXR1cF9tYWlsYm94KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nCWFsaWduOworCisJYWRhcHRlci0+dW5hX21ib3g2NCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwKKwkJCXNpemVvZihtYm94NjRfdCksICZhZGFwdGVyLT51bmFfbWJveDY0X2RtYSk7CisKKwlpZiggIWFkYXB0ZXItPnVuYV9tYm94NjQgKSByZXR1cm4gLTE7CisJCQorCWFkYXB0ZXItPm1ib3ggPSAmYWRhcHRlci0+dW5hX21ib3g2NC0+bWJveDsKKworCWFkYXB0ZXItPm1ib3ggPSAobWJveF90ICopKCgoKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXItPm1ib3gpICsgMTUpICYKKwkJCSh+MFVMIF4gMHhGVUwpKTsKKworCWFkYXB0ZXItPm1ib3g2NCA9IChtYm94NjRfdCAqKSgoKHVuc2lnbmVkIGxvbmcpYWRhcHRlci0+bWJveCkgLSA4KTsKKworCWFsaWduID0gKCh2b2lkICopYWRhcHRlci0+bWJveCkgLSAoKHZvaWQgKikmYWRhcHRlci0+dW5hX21ib3g2NC0+bWJveCk7CisKKwlhZGFwdGVyLT5tYm94X2RtYSA9IGFkYXB0ZXItPnVuYV9tYm94NjRfZG1hICsgOCArIGFsaWduOworCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgbWFpbGJveCBpZiB0aGUgY29udHJvbGxlciBpcyBhbiBpby1tYXBwZWQgY29udHJvbGxlcgorCSAqLworCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfSU9NQVAgKSB7CisKKwkJb3V0Yl9wKGFkYXB0ZXItPm1ib3hfZG1hICYgMHhGRiwKKwkJCQlhZGFwdGVyLT5ob3N0LT5pb19wb3J0ICsgTUJPWF9QT1JUMCk7CisKKwkJb3V0Yl9wKChhZGFwdGVyLT5tYm94X2RtYSA+PiA4KSAmIDB4RkYsCisJCQkJYWRhcHRlci0+aG9zdC0+aW9fcG9ydCArIE1CT1hfUE9SVDEpOworCisJCW91dGJfcCgoYWRhcHRlci0+bWJveF9kbWEgPj4gMTYpICYgMHhGRiwKKwkJCQlhZGFwdGVyLT5ob3N0LT5pb19wb3J0ICsgTUJPWF9QT1JUMik7CisKKwkJb3V0Yl9wKChhZGFwdGVyLT5tYm94X2RtYSA+PiAyNCkgJiAweEZGLAorCQkJCWFkYXB0ZXItPmhvc3QtPmlvX3BvcnQgKyBNQk9YX1BPUlQzKTsKKworCQlvdXRiX3AoRU5BQkxFX01CT1hfQllURSwKKwkJCQlhZGFwdGVyLT5ob3N0LT5pb19wb3J0ICsgRU5BQkxFX01CT1hfUkVHSU9OKTsKKworCQlpcnFfYWNrKGFkYXB0ZXIpOworCisJCWlycV9lbmFibGUoYWRhcHRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIG1lZ2FfcXVlcnlfYWRhcHRlcigpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBJc3N1ZSB0aGUgYWRhcHRlciBpbnF1aXJ5IGNvbW1hbmRzIHRvIHRoZSBjb250cm9sbGVyIGFuZCBmaW5kIG91dAorICogaW5mb3JtYXRpb24gYW5kIHBhcmFtZXRlciBhYm91dCB0aGUgZGV2aWNlcyBhdHRhY2hlZAorICovCitzdGF0aWMgaW50CittZWdhX3F1ZXJ5X2FkYXB0ZXIoYWRhcHRlcl90ICphZGFwdGVyKQoreworCWRtYV9hZGRyX3QJcHJvZF9pbmZvX2RtYV9oYW5kbGU7CisJbWVnYV9pbnF1aXJ5MwkqaW5xdWlyeTM7CisJdTgJcmF3X21ib3hbc2l6ZW9mKHN0cnVjdCBtYm94X291dCldOworCW1ib3hfdAkqbWJveDsKKwlpbnQJcmV0dmFsOworCisJLyogSW5pdGlhbGl6ZSBhZGFwdGVyIGlucXVpcnkgbWFpbGJveCAqLworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPm1lZ2FfYnVmZmVyLCAwLCBNRUdBX0JVRkZFUl9TSVpFKTsKKwltZW1zZXQoJm1ib3gtPm1fb3V0LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKworCS8qCisJICogVHJ5IHRvIGlzc3VlIElucXVpcnkzIGNvbW1hbmQKKwkgKiBpZiBub3Qgc3VjY2VlZGVkLCB0aGVuIGlzc3VlIE1FR0FfTUJPWENNRF9BREFQVEVSSU5RIGNvbW1hbmQgYW5kCisJICogdXBkYXRlIGVucXVpcnkzIHN0cnVjdHVyZQorCSAqLworCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gKHUzMilhZGFwdGVyLT5idWZfZG1hX2hhbmRsZTsKKworCWlucXVpcnkzID0gKG1lZ2FfaW5xdWlyeTMgKilhZGFwdGVyLT5tZWdhX2J1ZmZlcjsKKworCXJhd19tYm94WzBdID0gRkNfTkVXX0NPTkZJRzsJCS8qIGkuZS4gbWJveC0+Y21kPTB4QTEgKi8KKwlyYXdfbWJveFsyXSA9IE5DX1NVQk9QX0VOUVVJUlkzOwkvKiBpLmUuIDB4MEYgKi8KKwlyYXdfbWJveFszXSA9IEVOUTNfR0VUX1NPTElDSVRFRF9GVUxMOwkvKiBpLmUuIDB4MDIgKi8KKworCS8qIElzc3VlIGEgYmxvY2tpbmcgY29tbWFuZCB0byB0aGUgY2FyZCAqLworCWlmICgocmV0dmFsID0gaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KSkpIHsKKwkJLyogdGhlIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCA0MGxkICovCisKKwkJbXJhaWRfZXh0X2lucXVpcnkJKmV4dF9pbnE7CisJCW1yYWlkX2lucXVpcnkJCSppbnE7CisJCWRtYV9hZGRyX3QJCWRtYV9oYW5kbGU7CisKKwkJZXh0X2lucSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwKKwkJCQlzaXplb2YobXJhaWRfZXh0X2lucXVpcnkpLCAmZG1hX2hhbmRsZSk7CisKKwkJaWYoIGV4dF9pbnEgPT0gTlVMTCApIHJldHVybiAtMTsKKworCQlpbnEgPSAmZXh0X2lucS0+cmFpZF9pbnE7CisKKwkJbWJveC0+bV9vdXQueGZlcmFkZHIgPSAodTMyKWRtYV9oYW5kbGU7CisKKwkJLyppc3N1ZSBvbGQgMHgwNCBjb21tYW5kIHRvIGFkYXB0ZXIgKi8KKwkJbWJveC0+bV9vdXQuY21kID0gTUVHQV9NQk9YQ01EX0FEUEVYVElOUTsKKworCQlpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpOworCisJCS8qCisJCSAqIHVwZGF0ZSBFbnF1aXJ5MyBhbmQgUHJvZHVjdEluZm8gc3RydWN0dXJlcyB3aXRoCisJCSAqIG1yYWlkX2lucXVpcnkgc3RydWN0dXJlCisJCSAqLworCQltZWdhXzhfdG9fNDBsZChpbnEsIGlucXVpcnkzLAorCQkJCShtZWdhX3Byb2R1Y3RfaW5mbyAqKSZhZGFwdGVyLT5wcm9kdWN0X2luZm8pOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LCBzaXplb2YobXJhaWRfZXh0X2lucXVpcnkpLAorCQkJCWV4dF9pbnEsIGRtYV9oYW5kbGUpOworCisJfSBlbHNlIHsJCS8qYWRhcHRlciBzdXBwb3J0cyA0MGxkICovCisJCWFkYXB0ZXItPmZsYWcgfD0gQk9BUkRfNDBMRDsKKworCQkvKgorCQkgKiBnZXQgcHJvZHVjdF9pbmZvLCB3aGljaCBpcyBzdGF0aWMgaW5mb3JtYXRpb24gYW5kIHdpbGwgYmUKKwkJICogdW5jaGFuZ2VkCisJCSAqLworCQlwcm9kX2luZm9fZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPmRldiwgKHZvaWQgKikKKwkJCQkmYWRhcHRlci0+cHJvZHVjdF9pbmZvLAorCQkJCXNpemVvZihtZWdhX3Byb2R1Y3RfaW5mbyksIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJbWJveC0+bV9vdXQueGZlcmFkZHIgPSBwcm9kX2luZm9fZG1hX2hhbmRsZTsKKworCQlyYXdfbWJveFswXSA9IEZDX05FV19DT05GSUc7CS8qIGkuZS4gbWJveC0+Y21kPTB4QTEgKi8KKwkJcmF3X21ib3hbMl0gPSBOQ19TVUJPUF9QUk9EVUNUX0lORk87CS8qIGkuZS4gMHgwRSAqLworCisJCWlmICgocmV0dmFsID0gaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IFByb2R1Y3RfaW5mbyBjbWQgZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLAorCQkJCXJldHZhbCk7CisKKwkJcGNpX3VubWFwX3NpbmdsZShhZGFwdGVyLT5kZXYsIHByb2RfaW5mb19kbWFfaGFuZGxlLAorCQkJCXNpemVvZihtZWdhX3Byb2R1Y3RfaW5mbyksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCisKKwkvKgorCSAqIGtlcm5lbCBzY2FucyB0aGUgY2hhbm5lbHMgZnJvbSAwIHRvIDw9IG1heF9jaGFubmVsCisJICovCisJYWRhcHRlci0+aG9zdC0+bWF4X2NoYW5uZWwgPQorCQlhZGFwdGVyLT5wcm9kdWN0X2luZm8ubmNoYW5uZWxzICsgTlZJUlRfQ0hBTiAtMTsKKworCWFkYXB0ZXItPmhvc3QtPm1heF9pZCA9IDE2OwkvKiBtYXggdGFyZ2V0cyBwZXIgY2hhbm5lbCAqLworCisJYWRhcHRlci0+aG9zdC0+bWF4X2x1biA9IDc7CS8qIFVwdG8gNyBsdW5zIGZvciBub24gZGlzayBkZXZpY2VzICovCisKKwlhZGFwdGVyLT5ob3N0LT5jbWRfcGVyX2x1biA9IG1heF9jbWRfcGVyX2x1bjsKKworCWFkYXB0ZXItPm51bWxkcnYgPSBpbnF1aXJ5My0+bnVtX2xkcnY7CisKKwlhZGFwdGVyLT5tYXhfY21kcyA9IGFkYXB0ZXItPnByb2R1Y3RfaW5mby5tYXhfY29tbWFuZHM7CisKKwlpZihhZGFwdGVyLT5tYXhfY21kcyA+IE1BWF9DT01NQU5EUykKKwkJYWRhcHRlci0+bWF4X2NtZHMgPSBNQVhfQ09NTUFORFM7CisKKwlhZGFwdGVyLT5ob3N0LT5jYW5fcXVldWUgPSBhZGFwdGVyLT5tYXhfY21kcyAtIDE7CisKKwkvKgorCSAqIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgc3VwcG9ydGVkIGJ5IHRoaXMKKwkgKiBmaXJtd2FyZQorCSAqLworCW1lZ2FfZ2V0X21heF9zZ2woYWRhcHRlcik7CisKKwlhZGFwdGVyLT5ob3N0LT5zZ190YWJsZXNpemUgPSBhZGFwdGVyLT5zZ2xlbjsKKworCisJLyogdXNlIEhQIGZpcm13YXJlIGFuZCBiaW9zIHZlcnNpb24gZW5jb2RpbmcgKi8KKwlpZiAoYWRhcHRlci0+cHJvZHVjdF9pbmZvLnN1YnN5c3ZpZCA9PSBIUF9TVUJTWVNfVklEKSB7CisJCXNwcmludGYgKGFkYXB0ZXItPmZ3X3ZlcnNpb24sICIlYyVkJWQuJWQlZCIsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmZ3X3ZlcnNpb25bMl0sCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmZ3X3ZlcnNpb25bMV0gPj4gOCwKKwkJCSBhZGFwdGVyLT5wcm9kdWN0X2luZm8uZndfdmVyc2lvblsxXSAmIDB4MGYsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmZ3X3ZlcnNpb25bMF0gPj4gOCwKKwkJCSBhZGFwdGVyLT5wcm9kdWN0X2luZm8uZndfdmVyc2lvblswXSAmIDB4MGYpOworCQlzcHJpbnRmIChhZGFwdGVyLT5iaW9zX3ZlcnNpb24sICIlYyVkJWQuJWQlZCIsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmJpb3NfdmVyc2lvblsyXSwKKwkJCSBhZGFwdGVyLT5wcm9kdWN0X2luZm8uYmlvc192ZXJzaW9uWzFdID4+IDgsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmJpb3NfdmVyc2lvblsxXSAmIDB4MGYsCisJCQkgYWRhcHRlci0+cHJvZHVjdF9pbmZvLmJpb3NfdmVyc2lvblswXSA+PiA4LAorCQkJIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5iaW9zX3ZlcnNpb25bMF0gJiAweDBmKTsKKwl9IGVsc2UgeworCQltZW1jcHkoYWRhcHRlci0+ZndfdmVyc2lvbiwKKwkJCQkoY2hhciAqKWFkYXB0ZXItPnByb2R1Y3RfaW5mby5md192ZXJzaW9uLCA0KTsKKwkJYWRhcHRlci0+ZndfdmVyc2lvbls0XSA9IDA7CisKKwkJbWVtY3B5KGFkYXB0ZXItPmJpb3NfdmVyc2lvbiwKKwkJCQkoY2hhciAqKWFkYXB0ZXItPnByb2R1Y3RfaW5mby5iaW9zX3ZlcnNpb24sIDQpOworCisJCWFkYXB0ZXItPmJpb3NfdmVyc2lvbls0XSA9IDA7CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICJtZWdhcmFpZDogWyVzOiVzXSBkZXRlY3RlZCAlZCBsb2dpY2FsIGRyaXZlcy5cbiIsCisJCWFkYXB0ZXItPmZ3X3ZlcnNpb24sIGFkYXB0ZXItPmJpb3NfdmVyc2lvbiwgYWRhcHRlci0+bnVtbGRydik7CisKKwkvKgorCSAqIERvIHdlIHN1cHBvcnQgZXh0ZW5kZWQgKD4xMCBieXRlcykgY2RicworCSAqLworCWFkYXB0ZXItPnN1cHBvcnRfZXh0X2NkYiA9IG1lZ2Ffc3VwcG9ydF9leHRfY2RiKGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5zdXBwb3J0X2V4dF9jZGIpCisJCXByaW50ayhLRVJOX05PVElDRSAibWVnYXJhaWQ6IHN1cHBvcnRzIGV4dGVuZGVkIENEQnMuXG4iKTsKKworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVnYV9ydW5wZW5kcSgpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBSdW5zIHRocm91Z2ggdGhlIGxpc3Qgb2YgcGVuZGluZyByZXF1ZXN0cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCittZWdhX3J1bnBlbmRxKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpZighbGlzdF9lbXB0eSgmYWRhcHRlci0+cGVuZGluZ19saXN0KSkKKwkJX19tZWdhX3J1bnBlbmRxKGFkYXB0ZXIpOworfQorCisvKgorICogbWVnYXJhaWRfcXVldWUoKQorICogQHNjbWQgLSBJc3N1ZSB0aGlzIHNjc2kgY29tbWFuZAorICogQGRvbmUgLSB0aGUgY2FsbGJhY2sgaG9vayBpbnRvIHRoZSBzY3NpIG1pZC1sYXllcgorICoKKyAqIFRoZSBjb21tYW5kIHF1ZXVpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBtaWQtbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX3F1ZXVlKFNjc2lfQ21uZCAqc2NtZCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisJc2NiX3QJKnNjYjsKKwlpbnQJYnVzeT0wOworCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKilzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJc2NtZC0+c2NzaV9kb25lID0gZG9uZTsKKworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgYnVpbGQgYSBTQ0IgcmVxdWVzdAorCSAqIGJ1c3kgZmxhZyB3aWxsIGJlIHNldCBpZiBtZWdhX2J1aWxkX2NtZCgpIGNvbW1hbmQgY291bGQgbm90CisJICogYWxsb2NhdGUgc2NiLiBXZSB3aWxsIHJldHVybiBub24temVybyBzdGF0dXMgaW4gdGhhdCBjYXNlLgorCSAqIE5PVEU6IHNjYiBjYW4gYmUgbnVsbCBldmVuIHRob3VnaCBjZXJ0YWluIGNvbW1hbmRzIGNvbXBsZXRlZAorCSAqIHN1Y2Nlc3NmdWxseSwgZS5nLiwgTU9ERV9TRU5TRSBhbmQgVEVTVF9VTklUX1JFQURZLCB3ZSB3b3VsZAorCSAqIHJldHVybiAwIGluIHRoYXQgY2FzZS4KKwkgKi8KKworCXNjYiA9IG1lZ2FfYnVpbGRfY21kKGFkYXB0ZXIsIHNjbWQsICZidXN5KTsKKworCWlmKHNjYikgeworCQlzY2ItPnN0YXRlIHw9IFNDQl9QRU5EUTsKKwkJbGlzdF9hZGRfdGFpbCgmc2NiLT5saXN0LCAmYWRhcHRlci0+cGVuZGluZ19saXN0KTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgSEJBIGlzIGluIHF1aWVzY2VudCBzdGF0ZSwgZS5nLiwgZHVyaW5nIGEKKwkJICogZGVsZXRlIGxvZ2ljYWwgZHJpdmUgb3BlcnRpb24uIElmIGl0IGlzLCBkb24ndCBydW4KKwkJICogdGhlIHBlbmRpbmdfbGlzdC4KKwkJICovCisJCWlmKGF0b21pY19yZWFkKCZhZGFwdGVyLT5xdWllc2NlbnQpID09IDApIHsKKwkJCW1lZ2FfcnVucGVuZHEoYWRhcHRlcik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGJ1c3k7Cit9CisKKy8qKgorICogbWVnYV9hbGxvY2F0ZV9zY2IoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAY21kIC0gc2NzaSBjb21tYW5kIGZyb20gdGhlIG1pZC1sYXllcgorICoKKyAqIEFsbG9jYXRlIGEgU0NCIHN0cnVjdHVyZS4gVGhpcyBpcyB0aGUgY2VudHJhbCBzdHJ1Y3R1cmUgZm9yIGNvbnRyb2xsZXIKKyAqIGNvbW1hbmRzLgorICovCitzdGF0aWMgaW5saW5lIHNjYl90ICoKK21lZ2FfYWxsb2NhdGVfc2NiKGFkYXB0ZXJfdCAqYWRhcHRlciwgU2NzaV9DbW5kICpjbWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZhZGFwdGVyLT5mcmVlX2xpc3Q7CisJc2NiX3QJKnNjYjsKKworCS8qIFVubGluayBjb21tYW5kIGZyb20gRnJlZSBMaXN0ICovCisJaWYoICFsaXN0X2VtcHR5KGhlYWQpICkgeworCisJCXNjYiA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc2NiX3QsIGxpc3QpOworCisJCWxpc3RfZGVsX2luaXQoaGVhZC0+bmV4dCk7CisKKwkJc2NiLT5zdGF0ZSA9IFNDQl9BQ1RJVkU7CisJCXNjYi0+Y21kID0gY21kOworCQlzY2ItPmRtYV90eXBlID0gTUVHQV9ETUFfVFlQRV9OT05FOworCisJCXJldHVybiBzY2I7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogbWVnYV9nZXRfbGRydl9udW0oKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAY21kIC0gc2NzaSBtaWQgbGF5ZXIgY29tbWFuZAorICogQGNoYW5uZWwgLSBjaGFubmVsIG9uIHRoZSBjb250cm9sbGVyCisgKgorICogQ2FsY3VsYXRlIHRoZSBsb2dpY2FsIGRyaXZlIG51bWJlciBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gc2NzaSBjb21tYW5kCisgKiBhbmQgdGhlIGNoYW5uZWwgbnVtYmVyLgorICovCitzdGF0aWMgaW5saW5lIGludAorbWVnYV9nZXRfbGRydl9udW0oYWRhcHRlcl90ICphZGFwdGVyLCBTY3NpX0NtbmQgKmNtZCwgaW50IGNoYW5uZWwpCit7CisJaW50CQl0Z3Q7CisJaW50CQlsZHJ2X251bTsKKworCXRndCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwkKKwlpZiAoIHRndCA+IGFkYXB0ZXItPnRoaXNfaWQgKQorCQl0Z3QtLTsJLyogd2UgZG8gbm90IGdldCBpbnF1aXJlcyBmb3IgaW5pdGlhdG9yIGlkICovCisKKwlsZHJ2X251bSA9IChjaGFubmVsICogMTUpICsgdGd0OworCisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSBsb2dpY2FsIGRyaXZlIHdpdGggYm9vdCBlbmFibGVkLCBwcm9qZWN0IGl0IGZpcnN0CisJICovCisJaWYoIGFkYXB0ZXItPmJvb3RfbGRydl9lbmFibGVkICkgeworCQlpZiggbGRydl9udW0gPT0gMCApIHsKKwkJCWxkcnZfbnVtID0gYWRhcHRlci0+Ym9vdF9sZHJ2OworCQl9CisJCWVsc2UgeworCQkJaWYoIGxkcnZfbnVtIDw9IGFkYXB0ZXItPmJvb3RfbGRydiApIHsKKwkJCQlsZHJ2X251bS0tOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiAiZGVsZXRlIGxvZ2ljYWwgZHJpdmUiIGZlYXR1cmUgaXMgZW5hYmxlZCBvbiB0aGlzIGNvbnRyb2xsZXIuCisJICogRG8gb25seSBpZiBhdCBsZWFzdCBvbmUgZGVsZXRlIGxvZ2ljYWwgZHJpdmUgb3BlcmF0aW9uIHdhcyBkb25lLgorCSAqCisJICogQWxzbywgYWZ0ZXIgbG9naWNhbCBkcml2ZSBkZWxldGlvbiwgaW5zdGVhZCBvZiBsb2dpY2FsIGRyaXZlIG51bWJlciwKKwkgKiB0aGUgdmFsdWUgcmV0dXJuZWQgc2hvdWxkIGJlIDB4ODArbG9naWNhbCBkcml2ZSBpZC4KKwkgKgorCSAqIFRoZXNlIGlzIHZhbGlkIG9ubHkgZm9yIElPIGNvbW1hbmRzLgorCSAqLworCisJaWYgKGFkYXB0ZXItPnN1cHBvcnRfcmFuZG9tX2RlbCAmJiBhZGFwdGVyLT5yZWFkX2xkaWRtYXAgKQorCQlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCQljYXNlIFJFQURfNjoJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgV1JJVEVfNjoJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgUkVBRF8xMDoJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgV1JJVEVfMTA6CisJCQlsZHJ2X251bSArPSAweDgwOworCQl9CisKKwlyZXR1cm4gbGRydl9udW07Cit9CisKKy8qKgorICogbWVnYV9idWlsZF9jbWQoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAY21kIC0gUHJlcGFyZSB1c2luZyB0aGlzIHNjc2kgY29tbWFuZAorICogQGJ1c3kgLSBidXN5IGZsYWcgaWYgbm8gcmVzb3VyY2VzCisgKgorICogUHJlcGFyZXMgYSBjb21tYW5kIGFuZCBzY2F0dGVyIGdhdGhlciBsaXN0IGZvciB0aGUgY29udHJvbGxlci4gVGhpcyByb3V0aW5lCisgKiBhbHNvIGZpbmRzIG91dCBpZiB0aGUgY29tbWFuZHMgaXMgaW50ZW5kZWQgZm9yIGEgbG9naWNhbCBkcml2ZSBvciBhCisgKiBwaHlzaWNhbCBkZXZpY2UgYW5kIHByZXBhcmVzIHRoZSBjb250cm9sbGVyIGNvbW1hbmQgYWNjb3JkaW5nbHkuCisgKgorICogV2UgYWxzbyByZS1vcmRlciB0aGUgbG9naWNhbCBkcml2ZXMgYW5kIHBoeXNpY2FsIGRldmljZXMgYmFzZWQgb24gdGhlaXIKKyAqIGJvb3Qgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyBzY2JfdCAqCittZWdhX2J1aWxkX2NtZChhZGFwdGVyX3QgKmFkYXB0ZXIsIFNjc2lfQ21uZCAqY21kLCBpbnQgKmJ1c3kpCit7CisJbWVnYV9leHRfcGFzc3RocnUJKmVwdGhydTsKKwltZWdhX3Bhc3N0aHJ1CSpwdGhydTsKKwlzY2JfdAkqc2NiOworCW1ib3hfdAkqbWJveDsKKwlsb25nCXNlZzsKKwljaGFyCWlzbG9naWNhbDsKKwlpbnQJbWF4X2xkcnZfbnVtOworCWludAljaGFubmVsID0gMDsKKwlpbnQJdGFyZ2V0ID0gMDsKKwlpbnQJbGRydl9udW0gPSAwOyAgIC8qIGxvZ2ljYWwgZHJpdmUgbnVtYmVyICovCisKKworCS8qCisJICogZmlsdGVyIHRoZSBpbnRlcm5hbCBhbmQgaW9jdGwgY29tbWFuZHMKKwkgKi8KKwlpZigoY21kLT5jbW5kWzBdID09IE1FR0FfSU5URVJOQUxfQ01EKSkgeworCQlyZXR1cm4gY21kLT5idWZmZXI7CisJfQorCisKKwkvKgorCSAqIFdlIGtub3cgd2hhdCBjaGFubmVscyBvdXIgbG9naWNhbCBkcml2ZXMgYXJlIG9uIC0gbWVnYV9maW5kX2NhcmQoKQorCSAqLworCWlzbG9naWNhbCA9IGFkYXB0ZXItPmxvZ2Rydl9jaGFuW2NtZC0+ZGV2aWNlLT5jaGFubmVsXTsKKworCS8qCisJICogVGhlIHRoZW9yeTogSWYgcGh5c2ljYWwgZHJpdmUgaXMgY2hvc2VuIGZvciBib290LCBhbGwgdGhlIHBoeXNpY2FsCisJICogZGV2aWNlcyBhcmUgZXhwb3J0ZWQgYmVmb3JlIHRoZSBsb2dpY2FsIGRyaXZlcywgb3RoZXJ3aXNlIHBoeXNpY2FsCisJICogZGV2aWNlcyBhcmUgcHVzaGVkIGFmdGVyIGxvZ2ljYWwgZHJpdmVzLCBpbiB3aGljaCBjYXNlIC0gS2VybmVsIHNlZXMKKwkgKiB0aGUgcGh5c2ljYWwgZGV2aWNlcyBvbiB2aXJ0dWFsIGNoYW5uZWwgd2hpY2ggaXMgb2J2aW91c2x5IGNvbnZlcnRlZAorCSAqIHRvIGFjdHVhbCBjaGFubmVsIG9uIHRoZSBIQkEuCisJICovCisJaWYoIGFkYXB0ZXItPmJvb3RfcGRydl9lbmFibGVkICkgeworCQlpZiggaXNsb2dpY2FsICkgeworCQkJLyogbG9naWNhbCBjaGFubmVsICovCisJCQljaGFubmVsID0gY21kLT5kZXZpY2UtPmNoYW5uZWwgLQorCQkJCWFkYXB0ZXItPnByb2R1Y3RfaW5mby5uY2hhbm5lbHM7CisJCX0KKwkJZWxzZSB7CisJCQkvKiB0aGlzIGlzIHBoeXNpY2FsIGNoYW5uZWwgKi8KKwkJCWNoYW5uZWwgPSBjbWQtPmRldmljZS0+Y2hhbm5lbDsgCisJCQl0YXJnZXQgPSBjbWQtPmRldmljZS0+aWQ7CisKKwkJCS8qCisJCQkgKiBib290IGZyb20gYSBwaHlzaWNhbCBkaXNrLCB0aGF0IGRpc2sgbmVlZHMgdG8gYmUKKwkJCSAqIGV4cG9zZWQgZmlyc3QgSUYgYm90aCB0aGUgY2hhbm5lbHMgYXJlIFNDU0ksIHRoZW4KKwkJCSAqIGJvb3RpbmcgZnJvbSB0aGUgc2Vjb25kIGNoYW5uZWwgaXMgbm90IGFsbG93ZWQuCisJCQkgKi8KKwkJCWlmKCB0YXJnZXQgPT0gMCApIHsKKwkJCQl0YXJnZXQgPSBhZGFwdGVyLT5ib290X3BkcnZfdGd0OworCQkJfQorCQkJZWxzZSBpZiggdGFyZ2V0ID09IGFkYXB0ZXItPmJvb3RfcGRydl90Z3QgKSB7CisJCQkJdGFyZ2V0ID0gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJaWYoIGlzbG9naWNhbCApIHsKKwkJCS8qIHRoaXMgaXMgdGhlIGxvZ2ljYWwgY2hhbm5lbCAqLworCQkJY2hhbm5lbCA9IGNtZC0+ZGV2aWNlLT5jaGFubmVsOwkKKwkJfQorCQllbHNlIHsKKwkJCS8qIHBoeXNpY2FsIGNoYW5uZWwgKi8KKwkJCWNoYW5uZWwgPSBjbWQtPmRldmljZS0+Y2hhbm5lbCAtIE5WSVJUX0NIQU47CQorCQkJdGFyZ2V0ID0gY21kLT5kZXZpY2UtPmlkOworCQl9CisJfQorCisKKwlpZihpc2xvZ2ljYWwpIHsKKworCQkvKiBoYXZlIGp1c3QgTFVOIDAgZm9yIGVhY2ggdGFyZ2V0IG9uIHZpcnR1YWwgY2hhbm5lbHMgKi8KKwkJaWYgKGNtZC0+ZGV2aWNlLT5sdW4pIHsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWxkcnZfbnVtID0gbWVnYV9nZXRfbGRydl9udW0oYWRhcHRlciwgY21kLCBjaGFubmVsKTsKKworCisJCW1heF9sZHJ2X251bSA9IChhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCkgPworCQkJTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQgOiBNQVhfTE9HSUNBTF9EUklWRVNfOExEOworCisJCS8qCisJCSAqIG1heF9sZHJ2X251bSBpbmNyZWFzZXMgYnkgMHg4MCBpZiBzb21lIGxvZ2ljYWwgZHJpdmUgd2FzCisJCSAqIGRlbGV0ZWQuCisJCSAqLworCQlpZihhZGFwdGVyLT5yZWFkX2xkaWRtYXApCisJCQltYXhfbGRydl9udW0gKz0gMHg4MDsKKworCQlpZihsZHJ2X251bSA+IG1heF9sZHJ2X251bSApIHsKKwkJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJfQorCWVsc2UgeworCQlpZiggY21kLT5kZXZpY2UtPmx1biA+IDcpIHsKKwkJCS8qCisJCQkgKiBEbyBub3Qgc3VwcG9ydCBsdW4gPjcgZm9yIHBoeXNpY2FsbHkgYWNjZXNzZWQKKwkJCSAqIGRldmljZXMKKwkJCSAqLworCQkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKgorCSAqIExvZ2ljYWwgZHJpdmUgY29tbWFuZHMKKwkgKgorCSAqLworCWlmKGlzbG9naWNhbCkgeworCQlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCQljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJCW1lbXNldChjbWQtPnJlcXVlc3RfYnVmZmVyLCAwLCBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisKKyNpZiBNRUdBX0hBVkVfQ0xVU1RFUklORworCQkJLyoKKwkJCSAqIERvIHdlIHN1cHBvcnQgY2x1c3RlcmluZyBhbmQgaXMgdGhlIHN1cHBvcnQgZW5hYmxlZAorCQkJICogSWYgbm8sIHJldHVybiBzdWNjZXNzIGFsd2F5cworCQkJICovCisJCQlpZiggIWFkYXB0ZXItPmhhc19jbHVzdGVyICkgeworCQkJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNik7CisJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJaWYoIShzY2IgPSBtZWdhX2FsbG9jYXRlX3NjYihhZGFwdGVyLCBjbWQpKSkgeworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJc2NiLT5yYXdfbWJveFswXSA9IE1FR0FfQ0xVU1RFUl9DTUQ7CisJCQlzY2ItPnJhd19tYm94WzJdID0gTUVHQV9SRVNFUlZBVElPTl9TVEFUVVM7CisJCQlzY2ItPnJhd19tYm94WzNdID0gbGRydl9udW07CisKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfTk9ORTsKKworCQkJcmV0dXJuIHNjYjsKKyNlbHNlCisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybiBOVUxMOworI2VuZGlmCisKKwkJY2FzZSBNT0RFX1NFTlNFOgorCQkJbWVtc2V0KGNtZC0+cmVxdWVzdF9idWZmZXIsIDAsIGNtZC0+Y21uZFs0XSk7CisJCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCXJldHVybiBOVUxMOworCisJCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJY2FzZSBJTlFVSVJZOgorCisJCQlpZighKGFkYXB0ZXItPmZsYWcgJiAoMUwgPDwgY21kLT5kZXZpY2UtPmNoYW5uZWwpKSkgeworCisJCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJCSJzY3NpJWQ6IHNjYW5uaW5nIHNjc2kgY2hhbm5lbCAlZCAiLAorCQkJCQkJYWRhcHRlci0+aG9zdC0+aG9zdF9ubywKKwkJCQkJCWNtZC0+ZGV2aWNlLT5jaGFubmVsKTsKKwkJCQlwcmludGsoImZvciBsb2dpY2FsIGRyaXZlcy5cbiIpOworCisJCQkJYWRhcHRlci0+ZmxhZyB8PSAoMUwgPDwgY21kLT5kZXZpY2UtPmNoYW5uZWwpOworCQkJfQorCisJCQkvKiBBbGxvY2F0ZSBhIFNDQiBhbmQgaW5pdGlhbGl6ZSBwYXNzdGhydSAqLworCQkJaWYoIShzY2IgPSBtZWdhX2FsbG9jYXRlX3NjYihhZGFwdGVyLCBjbWQpKSkgeworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXB0aHJ1ID0gc2NiLT5wdGhydTsKKworCQkJbWJveCA9IChtYm94X3QgKilzY2ItPnJhd19tYm94OworCQkJbWVtc2V0KG1ib3gsIDAsIHNpemVvZihzY2ItPnJhd19tYm94KSk7CisJCQltZW1zZXQocHRocnUsIDAsIHNpemVvZihtZWdhX3Bhc3N0aHJ1KSk7CisKKwkJCXB0aHJ1LT50aW1lb3V0ID0gMDsKKwkJCXB0aHJ1LT5hcnMgPSAxOworCQkJcHRocnUtPnJlcXNlbnNlbGVuID0gMTQ7CisJCQlwdGhydS0+aXNsb2dpY2FsID0gMTsKKwkJCXB0aHJ1LT5sb2dkcnYgPSBsZHJ2X251bTsKKwkJCXB0aHJ1LT5jZGJsZW4gPSBjbWQtPmNtZF9sZW47CisJCQltZW1jcHkocHRocnUtPmNkYiwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworCisJCQlpZiggYWRhcHRlci0+aGFzXzY0Yml0X2FkZHIgKSB7CisJCQkJbWJveC0+bV9vdXQuY21kID0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVNjQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQltYm94LT5tX291dC5jbWQgPSBNRUdBX01CT1hDTURfUEFTU1RIUlU7CisJCQl9CisKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKworCQkJcHRocnUtPm51bXNnZWxlbWVudHMgPSBtZWdhX2J1aWxkX3NnbGlzdChhZGFwdGVyLCBzY2IsCisJCQkJJnB0aHJ1LT5kYXRheGZlcmFkZHIsICZwdGhydS0+ZGF0YXhmZXJsZW4pOworCisJCQltYm94LT5tX291dC54ZmVyYWRkciA9IHNjYi0+cHRocnVfZG1hX2FkZHI7CisKKwkJCXJldHVybiBzY2I7CisKKwkJY2FzZSBSRUFEXzY6CisJCWNhc2UgV1JJVEVfNjoKKwkJY2FzZSBSRUFEXzEwOgorCQljYXNlIFdSSVRFXzEwOgorCQljYXNlIFJFQURfMTI6CisJCWNhc2UgV1JJVEVfMTI6CisKKwkJCS8qIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIG1haWxib3ggKi8KKwkJCWlmKCEoc2NiID0gbWVnYV9hbGxvY2F0ZV9zY2IoYWRhcHRlciwgY21kKSkpIHsKKwkJCQkqYnVzeSA9IDE7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQltYm94ID0gKG1ib3hfdCAqKXNjYi0+cmF3X21ib3g7CisKKwkJCW1lbXNldChtYm94LCAwLCBzaXplb2Yoc2NiLT5yYXdfbWJveCkpOworCQkJbWJveC0+bV9vdXQubG9nZHJ2ID0gbGRydl9udW07CisKKwkJCS8qCisJCQkgKiBBIGxpdHRsZSBoYWNrOiAybmQgYml0IGlzIHplcm8gZm9yIGFsbCBzY3NpIHJlYWQKKwkJCSAqIGNvbW1hbmRzIGFuZCBpcyBzZXQgZm9yIGFsbCBzY3NpIHdyaXRlIGNvbW1hbmRzCisJCQkgKi8KKwkJCWlmKCBhZGFwdGVyLT5oYXNfNjRiaXRfYWRkciApIHsKKwkJCQltYm94LT5tX291dC5jbWQgPSAoKmNtZC0+Y21uZCAmIDB4MDIpID8KKwkJCQkJTUVHQV9NQk9YQ01EX0xXUklURTY0OgorCQkJCQlNRUdBX01CT1hDTURfTFJFQUQ2NCA7CisJCQl9CisJCQllbHNlIHsKKwkJCQltYm94LT5tX291dC5jbWQgPSAoKmNtZC0+Y21uZCAmIDB4MDIpID8KKwkJCQkJTUVHQV9NQk9YQ01EX0xXUklURToKKwkJCQkJTUVHQV9NQk9YQ01EX0xSRUFEIDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIDYtYnl0ZSBSRUFEKDB4MDgpIG9yIFdSSVRFKDB4MEEpIGNkYgorCQkJICovCisJCQlpZiggY21kLT5jbWRfbGVuID09IDYgKSB7CisJCQkJbWJveC0+bV9vdXQubnVtc2VjdG9ycyA9ICh1MzIpIGNtZC0+Y21uZFs0XTsKKwkJCQltYm94LT5tX291dC5sYmEgPQorCQkJCQkoKHUzMiljbWQtPmNtbmRbMV0gPDwgMTYpIHwKKwkJCQkJKCh1MzIpY21kLT5jbW5kWzJdIDw8IDgpIHwKKwkJCQkJKHUzMiljbWQtPmNtbmRbM107CisKKwkJCQltYm94LT5tX291dC5sYmEgJj0gMHgxRkZGRkY7CisKKyNpZiBNRUdBX0hBVkVfU1RBVFMKKwkJCQkvKgorCQkJCSAqIFRha2UgbW9kdWxvIDB4ODAsIHNpbmNlIHRoZSBsb2dpY2FsIGRyaXZlCisJCQkJICogbnVtYmVyIGluY3JlYXNlcyBieSAweDgwIHdoZW4gYSBsb2dpY2FsCisJCQkJICogZHJpdmUgd2FzIGRlbGV0ZWQKKwkJCQkgKi8KKwkJCQlpZiAoKmNtZC0+Y21uZCA9PSBSRUFEXzYpIHsKKwkJCQkJYWRhcHRlci0+bnJlYWRzW2xkcnZfbnVtJTB4ODBdKys7CisJCQkJCWFkYXB0ZXItPm5yZWFkYmxvY2tzW2xkcnZfbnVtJTB4ODBdICs9CisJCQkJCQltYm94LT5tX291dC5udW1zZWN0b3JzOworCQkJCX0gZWxzZSB7CisJCQkJCWFkYXB0ZXItPm53cml0ZXNbbGRydl9udW0lMHg4MF0rKzsKKwkJCQkJYWRhcHRlci0+bndyaXRlYmxvY2tzW2xkcnZfbnVtJTB4ODBdICs9CisJCQkJCQltYm94LT5tX291dC5udW1zZWN0b3JzOworCQkJCX0KKyNlbmRpZgorCQkJfQorCisJCQkvKgorCQkJICogMTAtYnl0ZSBSRUFEKDB4MjgpIG9yIFdSSVRFKDB4MkEpIGNkYgorCQkJICovCisJCQlpZiggY21kLT5jbWRfbGVuID09IDEwICkgeworCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnMgPQorCQkJCQkodTMyKWNtZC0+Y21uZFs4XSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFs3XSA8PCA4KTsKKwkJCQltYm94LT5tX291dC5sYmEgPQorCQkJCQkoKHUzMiljbWQtPmNtbmRbMl0gPDwgMjQpIHwKKwkJCQkJKCh1MzIpY21kLT5jbW5kWzNdIDw8IDE2KSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFs0XSA8PCA4KSB8CisJCQkJCSh1MzIpY21kLT5jbW5kWzVdOworCisjaWYgTUVHQV9IQVZFX1NUQVRTCisJCQkJaWYgKCpjbWQtPmNtbmQgPT0gUkVBRF8xMCkgeworCQkJCQlhZGFwdGVyLT5ucmVhZHNbbGRydl9udW0lMHg4MF0rKzsKKwkJCQkJYWRhcHRlci0+bnJlYWRibG9ja3NbbGRydl9udW0lMHg4MF0gKz0KKwkJCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnM7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWRhcHRlci0+bndyaXRlc1tsZHJ2X251bSUweDgwXSsrOworCQkJCQlhZGFwdGVyLT5ud3JpdGVibG9ja3NbbGRydl9udW0lMHg4MF0gKz0KKwkJCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnM7CisJCQkJfQorI2VuZGlmCisJCQl9CisKKwkJCS8qCisJCQkgKiAxMi1ieXRlIFJFQUQoMHhBOCkgb3IgV1JJVEUoMHhBQSkgY2RiCisJCQkgKi8KKwkJCWlmKCBjbWQtPmNtZF9sZW4gPT0gMTIgKSB7CisJCQkJbWJveC0+bV9vdXQubGJhID0KKwkJCQkJKCh1MzIpY21kLT5jbW5kWzJdIDw8IDI0KSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFszXSA8PCAxNikgfAorCQkJCQkoKHUzMiljbWQtPmNtbmRbNF0gPDwgOCkgfAorCQkJCQkodTMyKWNtZC0+Y21uZFs1XTsKKworCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnMgPQorCQkJCQkoKHUzMiljbWQtPmNtbmRbNl0gPDwgMjQpIHwKKwkJCQkJKCh1MzIpY21kLT5jbW5kWzddIDw8IDE2KSB8CisJCQkJCSgodTMyKWNtZC0+Y21uZFs4XSA8PCA4KSB8CisJCQkJCSh1MzIpY21kLT5jbW5kWzldOworCisjaWYgTUVHQV9IQVZFX1NUQVRTCisJCQkJaWYgKCpjbWQtPmNtbmQgPT0gUkVBRF8xMikgeworCQkJCQlhZGFwdGVyLT5ucmVhZHNbbGRydl9udW0lMHg4MF0rKzsKKwkJCQkJYWRhcHRlci0+bnJlYWRibG9ja3NbbGRydl9udW0lMHg4MF0gKz0KKwkJCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnM7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWRhcHRlci0+bndyaXRlc1tsZHJ2X251bSUweDgwXSsrOworCQkJCQlhZGFwdGVyLT5ud3JpdGVibG9ja3NbbGRydl9udW0lMHg4MF0gKz0KKwkJCQkJCW1ib3gtPm1fb3V0Lm51bXNlY3RvcnM7CisJCQkJfQorI2VuZGlmCisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiBpdCBpcyBhIHJlYWQgY29tbWFuZAorCQkJICovCisJCQlpZiggKCpjbWQtPmNtbmQgJiAweDBGKSA9PSAweDA4ICkgeworCQkJCXNjYi0+ZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNjYi0+ZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CisJCQl9CisKKwkJCS8qIENhbGN1bGF0ZSBTY2F0dGVyLUdhdGhlciBpbmZvICovCisJCQltYm94LT5tX291dC5udW1zZ2VsZW1lbnRzID0gbWVnYV9idWlsZF9zZ2xpc3QoYWRhcHRlciwgc2NiLAorCQkJCQkodTMyICopJm1ib3gtPm1fb3V0LnhmZXJhZGRyLCAodTMyICopJnNlZyk7CisKKwkJCXJldHVybiBzY2I7CisKKyNpZiBNRUdBX0hBVkVfQ0xVU1RFUklORworCQljYXNlIFJFU0VSVkU6CS8qIEZhbGwgdGhyb3VnaCAqLworCQljYXNlIFJFTEVBU0U6CisKKwkJCS8qCisJCQkgKiBEbyB3ZSBzdXBwb3J0IGNsdXN0ZXJpbmcgYW5kIGlzIHRoZSBzdXBwb3J0IGVuYWJsZWQKKwkJCSAqLworCQkJaWYoICEgYWRhcHRlci0+aGFzX2NsdXN0ZXIgKSB7CisKKwkJCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJLyogQWxsb2NhdGUgYSBTQ0IgYW5kIGluaXRpYWxpemUgbWFpbGJveCAqLworCQkJaWYoIShzY2IgPSBtZWdhX2FsbG9jYXRlX3NjYihhZGFwdGVyLCBjbWQpKSkgeworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJc2NiLT5yYXdfbWJveFswXSA9IE1FR0FfQ0xVU1RFUl9DTUQ7CisJCQlzY2ItPnJhd19tYm94WzJdID0gKCAqY21kLT5jbW5kID09IFJFU0VSVkUgKSA/CisJCQkJTUVHQV9SRVNFUlZFX0xEIDogTUVHQV9SRUxFQVNFX0xEOworCisJCQlzY2ItPnJhd19tYm94WzNdID0gbGRydl9udW07CisKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfTk9ORTsKKworCQkJcmV0dXJuIHNjYjsKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisJCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwkvKgorCSAqIFBhc3N0aHJ1IGRyaXZlIGNvbW1hbmRzCisJICovCisJZWxzZSB7CisJCS8qIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIHBhc3N0aHJ1ICovCisJCWlmKCEoc2NiID0gbWVnYV9hbGxvY2F0ZV9zY2IoYWRhcHRlciwgY21kKSkpIHsKKwkJCSpidXN5ID0gMTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWJveCA9IChtYm94X3QgKilzY2ItPnJhd19tYm94OworCQltZW1zZXQobWJveCwgMCwgc2l6ZW9mKHNjYi0+cmF3X21ib3gpKTsKKworCQlpZiggYWRhcHRlci0+c3VwcG9ydF9leHRfY2RiICkgeworCisJCQllcHRocnUgPSBtZWdhX3ByZXBhcmVfZXh0cGFzc3RocnUoYWRhcHRlciwgc2NiLCBjbWQsCisJCQkJCWNoYW5uZWwsIHRhcmdldCk7CisKKwkJCW1ib3gtPm1fb3V0LmNtZCA9IE1FR0FfTUJPWENNRF9FWFRQVEhSVTsKKworCQkJbWJveC0+bV9vdXQueGZlcmFkZHIgPSBzY2ItPmVwdGhydV9kbWFfYWRkcjsKKworCQl9CisJCWVsc2UgeworCisJCQlwdGhydSA9IG1lZ2FfcHJlcGFyZV9wYXNzdGhydShhZGFwdGVyLCBzY2IsIGNtZCwKKwkJCQkJY2hhbm5lbCwgdGFyZ2V0KTsKKworCQkJLyogSW5pdGlhbGl6ZSBtYWlsYm94ICovCisJCQlpZiggYWRhcHRlci0+aGFzXzY0Yml0X2FkZHIgKSB7CisJCQkJbWJveC0+bV9vdXQuY21kID0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVNjQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQltYm94LT5tX291dC5jbWQgPSBNRUdBX01CT1hDTURfUEFTU1RIUlU7CisJCQl9CisKKwkJCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gc2NiLT5wdGhydV9kbWFfYWRkcjsKKworCQl9CisJCXJldHVybiBzY2I7CisJfQorCXJldHVybiBOVUxMOworfQorCisKKy8qKgorICogbWVnYV9wcmVwYXJlX3Bhc3N0aHJ1KCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHNjYiAtIG91ciBzY3NpIGNvbnRyb2wgYmxvY2sKKyAqIEBjbWQgLSBzY3NpIGNvbW1hbmQgZnJvbSB0aGUgbWlkLWxheWVyCisgKiBAY2hhbm5lbCAtIGFjdHVhbCBjaGFubmVsIG9uIHRoZSBjb250cm9sbGVyCisgKiBAdGFyZ2V0IC0gYWN0dWFsIGlkIG9uIHRoZSBjb250cm9sbGVyLgorICoKKyAqIHByZXBhcmUgYSBjb21tYW5kIGZvciB0aGUgc2NzaSBwaHlzaWNhbCBkZXZpY2VzLgorICovCitzdGF0aWMgbWVnYV9wYXNzdGhydSAqCittZWdhX3ByZXBhcmVfcGFzc3RocnUoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiLCBTY3NpX0NtbmQgKmNtZCwKKwkJaW50IGNoYW5uZWwsIGludCB0YXJnZXQpCit7CisJbWVnYV9wYXNzdGhydSAqcHRocnU7CisKKwlwdGhydSA9IHNjYi0+cHRocnU7CisJbWVtc2V0KHB0aHJ1LCAwLCBzaXplb2YgKG1lZ2FfcGFzc3RocnUpKTsKKworCS8qIDA9NnNlYy8xPTYwc2VjLzI9MTBtaW4vMz0zaHJzICovCisJcHRocnUtPnRpbWVvdXQgPSAyOworCisJcHRocnUtPmFycyA9IDE7CisJcHRocnUtPnJlcXNlbnNlbGVuID0gMTQ7CisJcHRocnUtPmlzbG9naWNhbCA9IDA7CisKKwlwdGhydS0+Y2hhbm5lbCA9IChhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCkgPyAwIDogY2hhbm5lbDsKKworCXB0aHJ1LT50YXJnZXQgPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8KKwkJKGNoYW5uZWwgPDwgNCkgfCB0YXJnZXQgOiB0YXJnZXQ7CisKKwlwdGhydS0+Y2RibGVuID0gY21kLT5jbWRfbGVuOworCXB0aHJ1LT5sb2dkcnYgPSBjbWQtPmRldmljZS0+bHVuOworCisJbWVtY3B5KHB0aHJ1LT5jZGIsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKworCS8qIE5vdCBzdXJlIGFib3V0IHRoZSBkaXJlY3Rpb24gKi8KKwlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7CisKKwkvKiBTcGVjaWFsIENvZGUgZm9yIEhhbmRsaW5nIFJFQURfQ0FQQS8gSU5RIHVzaW5nIGJvdW5jZSBidWZmZXJzICovCisJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKKwljYXNlIElOUVVJUlk6CisJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQlpZighKGFkYXB0ZXItPmZsYWcgJiAoMUwgPDwgY21kLT5kZXZpY2UtPmNoYW5uZWwpKSkgeworCisJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkic2NzaSVkOiBzY2FubmluZyBzY3NpIGNoYW5uZWwgJWQgW1AlZF0gIiwKKwkJCQkJYWRhcHRlci0+aG9zdC0+aG9zdF9ubywKKwkJCQkJY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNoYW5uZWwpOworCQkJcHJpbnRrKCJmb3IgcGh5c2ljYWwgZGV2aWNlcy5cbiIpOworCisJCQlhZGFwdGVyLT5mbGFnIHw9ICgxTCA8PCBjbWQtPmRldmljZS0+Y2hhbm5lbCk7CisJCX0KKwkJLyogRmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcHRocnUtPm51bXNnZWxlbWVudHMgPSBtZWdhX2J1aWxkX3NnbGlzdChhZGFwdGVyLCBzY2IsCisJCQkJJnB0aHJ1LT5kYXRheGZlcmFkZHIsICZwdGhydS0+ZGF0YXhmZXJsZW4pOworCQlicmVhazsKKwl9CisJcmV0dXJuIHB0aHJ1OworfQorCisKKy8qKgorICogbWVnYV9wcmVwYXJlX2V4dHBhc3N0aHJ1KCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHNjYiAtIG91ciBzY3NpIGNvbnRyb2wgYmxvY2sKKyAqIEBjbWQgLSBzY3NpIGNvbW1hbmQgZnJvbSB0aGUgbWlkLWxheWVyCisgKiBAY2hhbm5lbCAtIGFjdHVhbCBjaGFubmVsIG9uIHRoZSBjb250cm9sbGVyCisgKiBAdGFyZ2V0IC0gYWN0dWFsIGlkIG9uIHRoZSBjb250cm9sbGVyLgorICoKKyAqIHByZXBhcmUgYSBjb21tYW5kIGZvciB0aGUgc2NzaSBwaHlzaWNhbCBkZXZpY2VzLiBUaGlzIHJvdW50aW5lIHByZXBhcmVzCisgKiBjb21tYW5kcyBmb3IgZGV2aWNlcyB3aGljaCBjYW4gdGFrZSBleHRlbmRlZCBDREJzICg+MTAgYnl0ZXMpCisgKi8KK3N0YXRpYyBtZWdhX2V4dF9wYXNzdGhydSAqCittZWdhX3ByZXBhcmVfZXh0cGFzc3RocnUoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiLCBTY3NpX0NtbmQgKmNtZCwKKwkJaW50IGNoYW5uZWwsIGludCB0YXJnZXQpCit7CisJbWVnYV9leHRfcGFzc3RocnUJKmVwdGhydTsKKworCWVwdGhydSA9IHNjYi0+ZXB0aHJ1OworCW1lbXNldChlcHRocnUsIDAsIHNpemVvZihtZWdhX2V4dF9wYXNzdGhydSkpOworCisJLyogMD02c2VjLzE9NjBzZWMvMj0xMG1pbi8zPTNocnMgKi8KKwllcHRocnUtPnRpbWVvdXQgPSAyOworCisJZXB0aHJ1LT5hcnMgPSAxOworCWVwdGhydS0+cmVxc2Vuc2VsZW4gPSAxNDsKKwllcHRocnUtPmlzbG9naWNhbCA9IDA7CisKKwllcHRocnUtPmNoYW5uZWwgPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8gMCA6IGNoYW5uZWw7CisJZXB0aHJ1LT50YXJnZXQgPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8KKwkJKGNoYW5uZWwgPDwgNCkgfCB0YXJnZXQgOiB0YXJnZXQ7CisKKwllcHRocnUtPmNkYmxlbiA9IGNtZC0+Y21kX2xlbjsKKwllcHRocnUtPmxvZ2RydiA9IGNtZC0+ZGV2aWNlLT5sdW47CisKKwltZW1jcHkoZXB0aHJ1LT5jZGIsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKKworCS8qIE5vdCBzdXJlIGFib3V0IHRoZSBkaXJlY3Rpb24gKi8KKwlzY2ItPmRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7CisKKwlzd2l0Y2goY21kLT5jbW5kWzBdKSB7CisJY2FzZSBJTlFVSVJZOgorCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJaWYoIShhZGFwdGVyLT5mbGFnICYgKDFMIDw8IGNtZC0+ZGV2aWNlLT5jaGFubmVsKSkpIHsKKworCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJInNjc2klZDogc2Nhbm5pbmcgc2NzaSBjaGFubmVsICVkIFtQJWRdICIsCisJCQkJCWFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8sCisJCQkJCWNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjaGFubmVsKTsKKwkJCXByaW50aygiZm9yIHBoeXNpY2FsIGRldmljZXMuXG4iKTsKKworCQkJYWRhcHRlci0+ZmxhZyB8PSAoMUwgPDwgY21kLT5kZXZpY2UtPmNoYW5uZWwpOworCQl9CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCWVwdGhydS0+bnVtc2dlbGVtZW50cyA9IG1lZ2FfYnVpbGRfc2dsaXN0KGFkYXB0ZXIsIHNjYiwKKwkJCQkmZXB0aHJ1LT5kYXRheGZlcmFkZHIsICZlcHRocnUtPmRhdGF4ZmVybGVuKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVwdGhydTsKK30KKworc3RhdGljIHZvaWQKK19fbWVnYV9ydW5wZW5kcShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc2NiX3QgKnNjYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuZXh0OworCisJLyogSXNzdWUgYW55IHBlbmRpbmcgY29tbWFuZHMgdG8gdGhlIGNhcmQgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmYWRhcHRlci0+cGVuZGluZ19saXN0KSB7CisKKwkJc2NiID0gbGlzdF9lbnRyeShwb3MsIHNjYl90LCBsaXN0KTsKKworCQlpZiggIShzY2ItPnN0YXRlICYgU0NCX0lTU1VFRCkgKSB7CisKKwkJCWlmKCBpc3N1ZV9zY2IoYWRhcHRlciwgc2NiKSAhPSAwICkKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBpc3N1ZV9zY2IoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAc2NiIC0gc2NzaSBjb250cm9sIGJsb2NrCisgKgorICogUG9zdCBhIGNvbW1hbmQgdG8gdGhlIGNhcmQgaWYgdGhlIG1haWxib3ggaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgcmV0dXJuCisgKiBidXN5LiBXZSBhbHNvIHRha2UgdGhlIHNjYiBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgaWYgdGhlIG1haWxib3ggaXMKKyAqIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludAoraXNzdWVfc2NiKGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYikKK3sKKwl2b2xhdGlsZSBtYm94NjRfdAkqbWJveDY0ID0gYWRhcHRlci0+bWJveDY0OworCXZvbGF0aWxlIG1ib3hfdAkJKm1ib3ggPSBhZGFwdGVyLT5tYm94OworCXVuc2lnbmVkIGludAlpID0gMDsKKworCWlmKHVubGlrZWx5KG1ib3gtPm1faW4uYnVzeSkpIHsKKwkJZG8geworCQkJdWRlbGF5KDEpOworCQkJaSsrOworCQl9IHdoaWxlKCBtYm94LT5tX2luLmJ1c3kgJiYgKGkgPCBtYXhfbWJveF9idXN5X3dhaXQpICk7CisKKwkJaWYobWJveC0+bV9pbi5idXN5KSByZXR1cm4gLTE7CisJfQorCisJLyogQ29weSBtYWlsYm94IGRhdGEgaW50byBob3N0IHN0cnVjdHVyZSAqLworCW1lbWNweSgoY2hhciAqKSZtYm94LT5tX291dCwgKGNoYXIgKilzY2ItPnJhd19tYm94LCAKKwkJCXNpemVvZihzdHJ1Y3QgbWJveF9vdXQpKTsKKworCW1ib3gtPm1fb3V0LmNtZGlkID0gc2NiLT5pZHg7CS8qIFNldCBjbWRpZCAqLworCW1ib3gtPm1faW4uYnVzeSA9IDE7CQkvKiBTZXQgYnVzeSAqLworCisKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgcGVuZGluZyBxdWV1ZSBjb3VudGVyCisJICovCisJYXRvbWljX2luYygmYWRhcHRlci0+cGVuZF9jbWRzKTsKKworCXN3aXRjaCAobWJveC0+bV9vdXQuY21kKSB7CisJY2FzZSBNRUdBX01CT1hDTURfTFJFQUQ2NDoKKwljYXNlIE1FR0FfTUJPWENNRF9MV1JJVEU2NDoKKwljYXNlIE1FR0FfTUJPWENNRF9QQVNTVEhSVTY0OgorCWNhc2UgTUVHQV9NQk9YQ01EX0VYVFBUSFJVOgorCQltYm94NjQtPnhmZXJfc2VnbWVudF9sbyA9IG1ib3gtPm1fb3V0LnhmZXJhZGRyOworCQltYm94NjQtPnhmZXJfc2VnbWVudF9oaSA9IDA7CisJCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gMHhGRkZGRkZGRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWJveDY0LT54ZmVyX3NlZ21lbnRfbG8gPSAwOworCQltYm94NjQtPnhmZXJfc2VnbWVudF9oaSA9IDA7CisJfQorCisJLyoKKwkgKiBwb3N0IHRoZSBjb21tYW5kCisJICovCisJc2NiLT5zdGF0ZSB8PSBTQ0JfSVNTVUVEOworCisJaWYoIGxpa2VseShhZGFwdGVyLT5mbGFnICYgQk9BUkRfTUVNTUFQKSApIHsKKwkJbWJveC0+bV9pbi5wb2xsID0gMDsKKwkJbWJveC0+bV9pbi5hY2sgPSAwOworCQlXUklORE9PUihhZGFwdGVyLCBhZGFwdGVyLT5tYm94X2RtYSB8IDB4MSk7CisJfQorCWVsc2UgeworCQlpcnFfZW5hYmxlKGFkYXB0ZXIpOworCQlpc3N1ZV9jb21tYW5kKGFkYXB0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogV2FpdCB1bnRpbCB0aGUgY29udHJvbGxlcidzIG1haWxib3ggaXMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CittZWdhX2J1c3l3YWl0X21ib3ggKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+bWJveC0+bV9pbi5idXN5KQorCQlyZXR1cm4gX19tZWdhX2J1c3l3YWl0X21ib3goYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNzdWVfc2NiX2Jsb2NrKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHJhd19tYm94IC0gdGhlIG1haWxib3gKKyAqCisgKiBJc3N1ZSBhIHNjYiBpbiBzeW5jaHJvbm91cyBhbmQgbm9uLWludGVycnVwdCBtb2RlCisgKi8KK3N0YXRpYyBpbnQKK2lzc3VlX3NjYl9ibG9jayhhZGFwdGVyX3QgKmFkYXB0ZXIsIHVfY2hhciAqcmF3X21ib3gpCit7CisJdm9sYXRpbGUgbWJveDY0X3QgKm1ib3g2NCA9IGFkYXB0ZXItPm1ib3g2NDsKKwl2b2xhdGlsZSBtYm94X3QgKm1ib3ggPSBhZGFwdGVyLT5tYm94OworCXU4CWJ5dGU7CisKKwkvKiBXYWl0IHVudGlsIG1haWxib3ggaXMgZnJlZSAqLworCWlmKG1lZ2FfYnVzeXdhaXRfbWJveCAoYWRhcHRlcikpCisJCWdvdG8gYnVnX2Jsb2NrZWRfbWFpbGJveDsKKworCS8qIENvcHkgbWFpbGJveCBkYXRhIGludG8gaG9zdCBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkoKGNoYXIgKikgbWJveCwgcmF3X21ib3gsIHNpemVvZihzdHJ1Y3QgbWJveF9vdXQpKTsKKwltYm94LT5tX291dC5jbWRpZCA9IDB4RkU7CisJbWJveC0+bV9pbi5idXN5ID0gMTsKKworCXN3aXRjaCAocmF3X21ib3hbMF0pIHsKKwljYXNlIE1FR0FfTUJPWENNRF9MUkVBRDY0OgorCWNhc2UgTUVHQV9NQk9YQ01EX0xXUklURTY0OgorCWNhc2UgTUVHQV9NQk9YQ01EX1BBU1NUSFJVNjQ6CisJY2FzZSBNRUdBX01CT1hDTURfRVhUUFRIUlU6CisJCW1ib3g2NC0+eGZlcl9zZWdtZW50X2xvID0gbWJveC0+bV9vdXQueGZlcmFkZHI7CisJCW1ib3g2NC0+eGZlcl9zZWdtZW50X2hpID0gMDsKKwkJbWJveC0+bV9vdXQueGZlcmFkZHIgPSAweEZGRkZGRkZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYm94NjQtPnhmZXJfc2VnbWVudF9sbyA9IDA7CisJCW1ib3g2NC0+eGZlcl9zZWdtZW50X2hpID0gMDsKKwl9CisKKwlpZiggbGlrZWx5KGFkYXB0ZXItPmZsYWcgJiBCT0FSRF9NRU1NQVApICkgeworCQltYm94LT5tX2luLnBvbGwgPSAwOworCQltYm94LT5tX2luLmFjayA9IDA7CisJCW1ib3gtPm1faW4ubnVtc3RhdHVzID0gMHhGRjsKKwkJbWJveC0+bV9pbi5zdGF0dXMgPSAweEZGOworCQlXUklORE9PUihhZGFwdGVyLCBhZGFwdGVyLT5tYm94X2RtYSB8IDB4MSk7CisKKwkJd2hpbGUoKHZvbGF0aWxlIHU4KW1ib3gtPm1faW4ubnVtc3RhdHVzID09IDB4RkYpCisJCQljcHVfcmVsYXgoKTsKKworCQltYm94LT5tX2luLm51bXN0YXR1cyA9IDB4RkY7CisKKwkJd2hpbGUoICh2b2xhdGlsZSB1OCltYm94LT5tX2luLnBvbGwgIT0gMHg3NyApCisJCQljcHVfcmVsYXgoKTsKKworCQltYm94LT5tX2luLnBvbGwgPSAwOworCQltYm94LT5tX2luLmFjayA9IDB4Nzc7CisKKwkJV1JJTkRPT1IoYWRhcHRlciwgYWRhcHRlci0+bWJveF9kbWEgfCAweDIpOworCisJCXdoaWxlKFJESU5ET09SKGFkYXB0ZXIpICYgMHgyKQorCQkJY3B1X3JlbGF4KCk7CisJfQorCWVsc2UgeworCQlpcnFfZGlzYWJsZShhZGFwdGVyKTsKKwkJaXNzdWVfY29tbWFuZChhZGFwdGVyKTsKKworCQl3aGlsZSAoISgoYnl0ZSA9IGlycV9zdGF0ZShhZGFwdGVyKSkgJiBJTlRSX1ZBTElEKSkKKwkJCWNwdV9yZWxheCgpOworCisJCXNldF9pcnFfc3RhdGUoYWRhcHRlciwgYnl0ZSk7CisJCWlycV9lbmFibGUoYWRhcHRlcik7CisJCWlycV9hY2soYWRhcHRlcik7CisJfQorCisJcmV0dXJuIG1ib3gtPm1faW4uc3RhdHVzOworCitidWdfYmxvY2tlZF9tYWlsYm94OgorCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBCbG9ja2VkIG1haWxib3guLi4uLi4hIVxuIik7CisJdWRlbGF5ICgxMDAwKTsKKwlyZXR1cm4gLTE7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9pc3JfaW9tYXBwZWQoKQorICogQGlycSAtIGlycQorICogQGRldnAgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAcmVncyAtIHVudXNlZAorICoKKyAqIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGlvLW1hcHBlZCBjb250cm9sbGVycy4KKyAqIEZpbmQgb3V0IGlmIG91ciBkZXZpY2UgaXMgaW50ZXJydXB0aW5nLiBJZiB5ZXMsIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQKKyAqIGFuZCBzZXJ2aWNlIHRoZSBjb21wbGV0ZWQgY29tbWFuZHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorbWVnYXJhaWRfaXNyX2lvbWFwcGVkKGludCBpcnEsIHZvaWQgKmRldnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IGRldnA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1OAlzdGF0dXM7CisJdTgJbnN0YXR1czsKKwl1OAljb21wbGV0ZWRbTUFYX0ZJUk1XQVJFX1NUQVRVU107CisJdTgJYnl0ZTsKKwlpbnQJaGFuZGxlZCA9IDA7CisKKworCS8qCisJICogbG9vcCB0aWxsIEYvVyBoYXMgbW9yZSBjb21tYW5kcyBmb3IgdXMgdG8gY29tcGxldGUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCWRvIHsKKwkJLyogQ2hlY2sgaWYgYSB2YWxpZCBpbnRlcnJ1cHQgaXMgcGVuZGluZyAqLworCQlieXRlID0gaXJxX3N0YXRlKGFkYXB0ZXIpOworCQlpZiggKGJ5dGUgJiBWQUxJRF9JTlRSX0JZVEUpID09IDAgKSB7CisJCQkvKgorCQkJICogTm8gbW9yZSBwZW5kaW5nIGNvbW1hbmRzCisJCQkgKi8KKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlzZXRfaXJxX3N0YXRlKGFkYXB0ZXIsIGJ5dGUpOworCisJCXdoaWxlKChuc3RhdHVzID0gKHZvbGF0aWxlIHU4KWFkYXB0ZXItPm1ib3gtPm1faW4ubnVtc3RhdHVzKQorCQkJCT09IDB4RkYpCisJCQljcHVfcmVsYXgoKTsKKwkJYWRhcHRlci0+bWJveC0+bV9pbi5udW1zdGF0dXMgPSAweEZGOworCisJCXN0YXR1cyA9IGFkYXB0ZXItPm1ib3gtPm1faW4uc3RhdHVzOworCisJCS8qCisJCSAqIGRlY3JlbWVudCB0aGUgcGVuZGluZyBxdWV1ZSBjb3VudGVyCisJCSAqLworCQlhdG9taWNfc3ViKG5zdGF0dXMsICZhZGFwdGVyLT5wZW5kX2NtZHMpOworCisJCW1lbWNweShjb21wbGV0ZWQsICh2b2lkICopYWRhcHRlci0+bWJveC0+bV9pbi5jb21wbGV0ZWQsIAorCQkJCW5zdGF0dXMpOworCisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCAqLworCQlpcnFfYWNrKGFkYXB0ZXIpOworCisJCW1lZ2FfY21kX2RvbmUoYWRhcHRlciwgY29tcGxldGVkLCBuc3RhdHVzLCBzdGF0dXMpOworCisJCW1lZ2FfcnVuZG9uZXEoYWRhcHRlcik7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJLyogTG9vcCB0aHJvdWdoIGFueSBwZW5kaW5nIHJlcXVlc3RzICovCisJCWlmKGF0b21pY19yZWFkKCZhZGFwdGVyLT5xdWllc2NlbnQpID09IDApIHsKKwkJCW1lZ2FfcnVucGVuZHEoYWRhcHRlcik7CisJCX0KKworCX0gd2hpbGUoMSk7CisKKyBvdXRfdW5sb2NrOgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9pc3JfbWVtbWFwcGVkKCkKKyAqIEBpcnEgLSBpcnEKKyAqIEBkZXZwIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQHJlZ3MgLSB1bnVzZWQKKyAqCisgKiBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBtZW1vcnktbWFwcGVkIGNvbnRyb2xsZXJzLgorICogRmluZCBvdXQgaWYgb3VyIGRldmljZSBpcyBpbnRlcnJ1cHRpbmcuIElmIHllcywgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdAorICogYW5kIHNlcnZpY2UgdGhlIGNvbXBsZXRlZCBjb21tYW5kcy4KKyAqLworc3RhdGljIGlycXJldHVybl90CittZWdhcmFpZF9pc3JfbWVtbWFwcGVkKGludCBpcnEsIHZvaWQgKmRldnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IGRldnA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1OAlzdGF0dXM7CisJdTMyCWR3b3JkID0gMDsKKwl1OAluc3RhdHVzOworCXU4CWNvbXBsZXRlZFtNQVhfRklSTVdBUkVfU1RBVFVTXTsKKwlpbnQJaGFuZGxlZCA9IDA7CisKKworCS8qCisJICogbG9vcCB0aWxsIEYvVyBoYXMgbW9yZSBjb21tYW5kcyBmb3IgdXMgdG8gY29tcGxldGUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCWRvIHsKKwkJLyogQ2hlY2sgaWYgYSB2YWxpZCBpbnRlcnJ1cHQgaXMgcGVuZGluZyAqLworCQlkd29yZCA9IFJET1VURE9PUihhZGFwdGVyKTsKKwkJaWYoZHdvcmQgIT0gMHgxMDAwMTIzNCkgeworCQkJLyoKKwkJCSAqIE5vIG1vcmUgcGVuZGluZyBjb21tYW5kcworCQkJICovCisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJV1JPVVRET09SKGFkYXB0ZXIsIDB4MTAwMDEyMzQpOworCisJCXdoaWxlKChuc3RhdHVzID0gKHZvbGF0aWxlIHU4KWFkYXB0ZXItPm1ib3gtPm1faW4ubnVtc3RhdHVzKQorCQkJCT09IDB4RkYpIHsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJCWFkYXB0ZXItPm1ib3gtPm1faW4ubnVtc3RhdHVzID0gMHhGRjsKKworCQlzdGF0dXMgPSBhZGFwdGVyLT5tYm94LT5tX2luLnN0YXR1czsKKworCQkvKgorCQkgKiBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgcXVldWUgY291bnRlcgorCQkgKi8KKwkJYXRvbWljX3N1Yihuc3RhdHVzLCAmYWRhcHRlci0+cGVuZF9jbWRzKTsKKworCQltZW1jcHkoY29tcGxldGVkLCAodm9pZCAqKWFkYXB0ZXItPm1ib3gtPm1faW4uY29tcGxldGVkLCAKKwkJCQluc3RhdHVzKTsKKworCQkvKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwkJV1JJTkRPT1IoYWRhcHRlciwgMHgyKTsKKworCQloYW5kbGVkID0gMTsKKworCQl3aGlsZSggUkRJTkRPT1IoYWRhcHRlcikgJiAweDAyICkgY3B1X3JlbGF4KCk7CisKKwkJbWVnYV9jbWRfZG9uZShhZGFwdGVyLCBjb21wbGV0ZWQsIG5zdGF0dXMsIHN0YXR1cyk7CisKKwkJbWVnYV9ydW5kb25lcShhZGFwdGVyKTsKKworCQkvKiBMb29wIHRocm91Z2ggYW55IHBlbmRpbmcgcmVxdWVzdHMgKi8KKwkJaWYoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnF1aWVzY2VudCkgPT0gMCkgeworCQkJbWVnYV9ydW5wZW5kcShhZGFwdGVyKTsKKwkJfQorCisJfSB3aGlsZSgxKTsKKworIG91dF91bmxvY2s6CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKy8qKgorICogbWVnYV9jbWRfZG9uZSgpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEBjb21wbGV0ZWQgLSBhcnJheSBvZiBpZHMgb2YgY29tcGxldGVkIGNvbW1hbmRzCisgKiBAbnN0YXR1cyAtIG51bWJlciBvZiBjb21wbGV0ZWQgY29tbWFuZHMKKyAqIEBzdGF0dXMgLSBzdGF0dXMgb2YgdGhlIGxhc3QgY29tbWFuZCBjb21wbGV0ZWQKKyAqCisgKiBDb21wbGV0ZSB0aGUgY29tYW1uZHMgYW5kIGNhbGwgdGhlIHNjc2kgbWlkLWxheWVyIGNhbGxiYWNrIGhvb2tzLgorICovCitzdGF0aWMgdm9pZAorbWVnYV9jbWRfZG9uZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHU4IGNvbXBsZXRlZFtdLCBpbnQgbnN0YXR1cywgaW50IHN0YXR1cykKK3sKKwltZWdhX2V4dF9wYXNzdGhydQkqZXB0aHJ1ID0gTlVMTDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnbDsKKwlTY3NpX0NtbmQJKmNtZCA9IE5VTEw7CisJbWVnYV9wYXNzdGhydQkqcHRocnUgPSBOVUxMOworCW1ib3hfdAkqbWJveCA9IE5VTEw7CisJdTgJYzsKKwlzY2JfdAkqc2NiOworCWludAlpc2xvZ2ljYWw7CisJaW50CWNtZGlkOworCWludAlpOworCisJLyoKKwkgKiBmb3IgYWxsIHRoZSBjb21tYW5kcyBjb21wbGV0ZWQsIGNhbGwgdGhlIG1pZC1sYXllciBjYWxsYmFjayByb3V0aW5lCisJICogYW5kIGZyZWUgdGhlIHNjYi4KKwkgKi8KKwlmb3IoIGkgPSAwOyBpIDwgbnN0YXR1czsgaSsrICkgeworCisJCWNtZGlkID0gY29tcGxldGVkW2ldOworCisJCWlmKCBjbWRpZCA9PSBDTURJRF9JTlRfQ01EUyApIHsgLyogaW50ZXJuYWwgY29tbWFuZCAqLworCQkJc2NiID0gJmFkYXB0ZXItPmludF9zY2I7CisJCQljbWQgPSBzY2ItPmNtZDsKKwkJCW1ib3ggPSAobWJveF90ICopc2NiLT5yYXdfbWJveDsKKworCQkJLyoKKwkJCSAqIEludGVybmFsIGNvbW1hbmQgaW50ZXJmYWNlIGRvIG5vdCBmaXJlIHRoZSBleHRlbmRlZAorCQkJICogcGFzc3RocnUgb3IgNjQtYml0IHBhc3N0aHJ1CisJCQkgKi8KKwkJCXB0aHJ1ID0gc2NiLT5wdGhydTsKKworCQl9CisJCWVsc2UgeworCQkJc2NiID0gJmFkYXB0ZXItPnNjYl9saXN0W2NtZGlkXTsKKworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSBmL3cgaGFzIGNvbXBsZXRlZCBhIHZhbGlkIGNvbW1hbmQKKwkJCSAqLworCQkJaWYoICEoc2NiLT5zdGF0ZSAmIFNDQl9JU1NVRUQpIHx8IHNjYi0+Y21kID09IE5VTEwgKSB7CisJCQkJcHJpbnRrKEtFUk5fQ1JJVAorCQkJCQkibWVnYXJhaWQ6IGludmFsaWQgY29tbWFuZCAiKTsKKwkJCQlwcmludGsoIklkICVkLCBzY2ItPnN0YXRlOiV4LCBzY3NpIGNtZDolcFxuIiwKKwkJCQkJY21kaWQsIHNjYi0+c3RhdGUsIHNjYi0+Y21kKTsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogV2FzIGEgYWJvcnQgaXNzdWVkIGZvciB0aGlzIGNvbW1hbmQKKwkJCSAqLworCQkJaWYoIHNjYi0+c3RhdGUgJiBTQ0JfQUJPUlQgKSB7CisKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBhYm9ydGVkIGNtZCAlbHhbJXhdIGNvbXBsZXRlLlxuIiwKKwkJCQkJc2NiLT5jbWQtPnNlcmlhbF9udW1iZXIsIHNjYi0+aWR4KTsKKworCQkJCXNjYi0+Y21kLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KTsKKworCQkJCWxpc3RfYWRkX3RhaWwoU0NTSV9MSVNUKHNjYi0+Y21kKSwKKwkJCQkJCSZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCk7CisKKwkJCQltZWdhX2ZyZWVfc2NiKGFkYXB0ZXIsIHNjYik7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFdhcyBhIHJlc2V0IGlzc3VlZCBmb3IgdGhpcyBjb21tYW5kCisJCQkgKi8KKwkJCWlmKCBzY2ItPnN0YXRlICYgU0NCX1JFU0VUICkgeworCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZDogcmVzZXQgY21kICVseFsleF0gY29tcGxldGUuXG4iLAorCQkJCQlzY2ItPmNtZC0+c2VyaWFsX251bWJlciwgc2NiLT5pZHgpOworCisJCQkJc2NiLT5jbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCisJCQkJbGlzdF9hZGRfdGFpbChTQ1NJX0xJU1Qoc2NiLT5jbWQpLAorCQkJCQkJJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKKworCQkJCW1lZ2FfZnJlZV9zY2IgKGFkYXB0ZXIsIHNjYik7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY21kID0gc2NiLT5jbWQ7CisJCQlwdGhydSA9IHNjYi0+cHRocnU7CisJCQllcHRocnUgPSBzY2ItPmVwdGhydTsKKwkJCW1ib3ggPSAobWJveF90ICopc2NiLT5yYXdfbWJveDsKKworI2lmIE1FR0FfSEFWRV9TVEFUUworCQkJeworCisJCQlpbnQJbG9nZHJ2ID0gbWJveC0+bV9vdXQubG9nZHJ2OworCisJCQlpc2xvZ2ljYWwgPSBhZGFwdGVyLT5sb2dkcnZfY2hhbltjbWQtPmNoYW5uZWxdOworCQkJLyoKKwkJCSAqIE1haW50YWluIGFuIGVycm9yIGNvdW50ZXIgZm9yIHRoZSBsb2dpY2FsIGRyaXZlLgorCQkJICogU29tZSBhcHBsaWNhdGlvbiBsaWtlIFNOTVAgYWdlbnQgbmVlZCBzdWNoCisJCQkgKiBzdGF0aXN0aWNzCisJCQkgKi8KKwkJCWlmKCBzdGF0dXMgJiYgaXNsb2dpY2FsICYmIChjbWQtPmNtbmRbMF0gPT0gUkVBRF82IHx8CisJCQkJCQljbWQtPmNtbmRbMF0gPT0gUkVBRF8xMCB8fAorCQkJCQkJY21kLT5jbW5kWzBdID09IFJFQURfMTIpKSB7CisJCQkJLyoKKwkJCQkgKiBMb2dpY2FsIGRyaXZlIG51bWJlciBpbmNyZWFzZXMgYnkgMHg4MCB3aGVuCisJCQkJICogYSBsb2dpY2FsIGRyaXZlIGlzIGRlbGV0ZWQKKwkJCQkgKi8KKwkJCQlhZGFwdGVyLT5yZF9lcnJvcnNbbG9nZHJ2JTB4ODBdKys7CisJCQl9CisKKwkJCWlmKCBzdGF0dXMgJiYgaXNsb2dpY2FsICYmIChjbWQtPmNtbmRbMF0gPT0gV1JJVEVfNiB8fAorCQkJCQkJY21kLT5jbW5kWzBdID09IFdSSVRFXzEwIHx8CisJCQkJCQljbWQtPmNtbmRbMF0gPT0gV1JJVEVfMTIpKSB7CisJCQkJLyoKKwkJCQkgKiBMb2dpY2FsIGRyaXZlIG51bWJlciBpbmNyZWFzZXMgYnkgMHg4MCB3aGVuCisJCQkJICogYSBsb2dpY2FsIGRyaXZlIGlzIGRlbGV0ZWQKKwkJCQkgKi8KKwkJCQlhZGFwdGVyLT53cl9lcnJvcnNbbG9nZHJ2JTB4ODBdKys7CisJCQl9CisKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJLyoKKwkJICogRG8gbm90IHJldHVybiB0aGUgcHJlc2VuY2Ugb2YgaGFyZCBkaXNrIG9uIHRoZSBjaGFubmVsIHNvLAorCQkgKiBpbnF1aXJ5IHNlbnQsIGFuZCByZXR1cm5lZCBkYXRhPT1oYXJkIGRpc2sgb3IgcmVtb3ZhYmxlCisJCSAqIGhhcmQgZGlzayBhbmQgbm90IGxvZ2ljYWwsIHJlcXVlc3Qgc2hvdWxkIHJldHVybiBmYWlsdXJlISAtCisJCSAqIFBKCisJCSAqLworCQlpc2xvZ2ljYWwgPSBhZGFwdGVyLT5sb2dkcnZfY2hhbltjbWQtPmRldmljZS0+Y2hhbm5lbF07CisJCWlmKCBjbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSAmJiAhaXNsb2dpY2FsICkgeworCisJCQlpZiggY21kLT51c2Vfc2cgKSB7CisJCQkJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKQorCQkJCQljbWQtPnJlcXVlc3RfYnVmZmVyOworCisJCQkJaWYoIHNnbC0+cGFnZSApIHsKKwkJCQkJYyA9ICoodW5zaWduZWQgY2hhciAqKQorCQkJCQlwYWdlX2FkZHJlc3MoKCZzZ2xbMF0pLT5wYWdlKSArCisJCQkJCSgmc2dsWzBdKS0+b2Zmc2V0OyAKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJCSJtZWdhcmFpZDogaW52YWxpZCBzZy5cbiIpOworCQkJCQljID0gMDsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQljID0gKih1OCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCQl9CisKKwkJCWlmKElTX1JBSURfQ0goYWRhcHRlciwgY21kLT5kZXZpY2UtPmNoYW5uZWwpICYmCisJCQkJCSgoYyAmIDB4MUYgKSA9PSBUWVBFX0RJU0spKSB7CisJCQkJc3RhdHVzID0gMHhGMDsKKwkJCX0KKwkJfQorCisJCS8qIGNsZWFyIHJlc3VsdDsgb3RoZXJ3aXNlLCBzdWNjZXNzIHJldHVybnMgY29ycnVwdCB2YWx1ZSAqLworCQljbWQtPnJlc3VsdCA9IDA7CisKKwkJLyogQ29udmVydCBNZWdhUkFJRCBzdGF0dXMgdG8gTGludXggZXJyb3IgY29kZSAqLworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIDB4MDA6CS8qIFNVQ0NFU1MgLCBpLmUuIFNDU0lfU1RBVFVTX0dPT0QgKi8KKwkJCWNtZC0+cmVzdWx0IHw9IChESURfT0sgPDwgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAyOgkvKiBFUlJPUl9BQk9SVEVELCBpLmUuCisJCQkJICAgU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OICovCisKKwkJCS8qIHNldCBzZW5zZV9idWZmZXIgYW5kIHJlc3VsdCBmaWVsZHMgKi8KKwkJCWlmKCBtYm94LT5tX291dC5jbWQgPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVIHx8CisJCQkJbWJveC0+bV9vdXQuY21kID09IE1FR0FfTUJPWENNRF9QQVNTVEhSVTY0ICkgeworCisJCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCBwdGhydS0+cmVxc2Vuc2VhcmVhLAorCQkJCQkJMTQpOworCisJCQkJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8CisJCQkJCShESURfT0sgPDwgMTYpIHwKKwkJCQkJKENIRUNLX0NPTkRJVElPTiA8PCAxKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChtYm94LT5tX291dC5jbWQgPT0gTUVHQV9NQk9YQ01EX0VYVFBUSFJVKSB7CisKKwkJCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLAorCQkJCQkJZXB0aHJ1LT5yZXFzZW5zZWFyZWEsIDE0KTsKKworCQkJCQljbWQtPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpIHwKKwkJCQkJCShESURfT0sgPDwgMTYpIHwKKwkJCQkJCShDSEVDS19DT05ESVRJT04gPDwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY21kLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworCQkJCQljbWQtPnNlbnNlX2J1ZmZlclsyXSA9IEFCT1JURURfQ09NTUFORDsKKwkJCQkJY21kLT5yZXN1bHQgfD0gKENIRUNLX0NPTkRJVElPTiA8PCAxKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4MDg6CS8qIEVSUl9ERVNUX0RSSVZFX0ZBSUxFRCwgaS5lLgorCQkJCSAgIFNDU0lfU1RBVFVTX0JVU1kgKi8KKwkJCWNtZC0+cmVzdWx0IHw9IChESURfQlVTX0JVU1kgPDwgMTYpIHwgc3RhdHVzOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKyNpZiBNRUdBX0hBVkVfQ0xVU1RFUklORworCQkJLyoKKwkJCSAqIElmIFRFU1RfVU5JVF9SRUFEWSBmYWlscywgd2Uga25vdworCQkJICogTUVHQV9SRVNFUlZBVElPTl9TVEFUVVMgZmFpbGVkCisJCQkgKi8KKwkJCWlmKCBjbWQtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZICkgeworCQkJCWNtZC0+cmVzdWx0IHw9IChESURfRVJST1IgPDwgMTYpIHwKKwkJCQkJKFJFU0VSVkFUSU9OX0NPTkZMSUNUIDw8IDEpOworCQkJfQorCQkJZWxzZQorCQkJLyoKKwkJCSAqIEVycm9yIGNvZGUgcmV0dXJuZWQgaXMgMSBpZiBSZXNlcnZlIG9yIFJlbGVhc2UKKwkJCSAqIGZhaWxlZCBvciB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIGludmFsaWQKKwkJCSAqLworCQkJaWYoIHN0YXR1cyA9PSAxICYmCisJCQkJKGNtZC0+Y21uZFswXSA9PSBSRVNFUlZFIHx8CisJCQkJCSBjbWQtPmNtbmRbMF0gPT0gUkVMRUFTRSkgKSB7CisKKwkJCQljbWQtPnJlc3VsdCB8PSAoRElEX0VSUk9SIDw8IDE2KSB8CisJCQkJCShSRVNFUlZBVElPTl9DT05GTElDVCA8PCAxKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZgorCQkJCWNtZC0+cmVzdWx0IHw9IChESURfQkFEX1RBUkdFVCA8PCAxNil8c3RhdHVzOworCQl9CisKKwkJLyoKKwkJICogT25seSBmcmVlIFNDQnMgZm9yIHRoZSBjb21tYW5kcyBjb21pbmcgZG93biBmcm9tIHRoZQorCQkgKiBtaWQtbGF5ZXIsIG5vdCBmb3Igd2hpY2ggd2VyZSBpc3N1ZWQgaW50ZXJuYWxseQorCQkgKgorCQkgKiBGb3IgaW50ZXJuYWwgY29tbWFuZCwgcmVzdG9yZSB0aGUgc3RhdHVzIHJldHVybmVkIGJ5IHRoZQorCQkgKiBmaXJtd2FyZSBzbyB0aGF0IHVzZXIgY2FuIGludGVycHJldCBpdC4KKwkJICovCisJCWlmKCBjbWRpZCA9PSBDTURJRF9JTlRfQ01EUyApIHsgLyogaW50ZXJuYWwgY29tbWFuZCAqLworCQkJY21kLT5yZXN1bHQgPSBzdGF0dXM7CisKKwkJCS8qCisJCQkgKiBSZW1vdmUgdGhlIGludGVybmFsIGNvbW1hbmQgZnJvbSB0aGUgcGVuZGluZyBsaXN0CisJCQkgKi8KKwkJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisJCQlzY2ItPnN0YXRlID0gU0NCX0ZSRUU7CisJCX0KKwkJZWxzZSB7CisJCQltZWdhX2ZyZWVfc2NiKGFkYXB0ZXIsIHNjYik7CisJCX0KKworCQkvKiBBZGQgU2NzaV9Db21tYW5kIHRvIGVuZCBvZiBjb21wbGV0ZWQgcXVldWUgKi8KKwkJbGlzdF9hZGRfdGFpbChTQ1NJX0xJU1QoY21kKSwgJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKKwl9Cit9CisKKworLyoKKyAqIG1lZ2FfcnVucGVuZHEoKQorICoKKyAqIFJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIGNvbXBsZXRlZCByZXF1ZXN0cyBhbmQgZmluaXNoIGl0CisgKi8KK3N0YXRpYyB2b2lkCittZWdhX3J1bmRvbmVxIChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJU2NzaV9DbW5kICpjbWQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCkgeworCisJCVNjc2lfUG9pbnRlciogc3BvcyA9IChTY3NpX1BvaW50ZXIgKilwb3M7CisKKwkJY21kID0gbGlzdF9lbnRyeShzcG9zLCBTY3NpX0NtbmQsIFNDcCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKK30KKworCisvKgorICogRnJlZSBhIFNDQiBzdHJ1Y3R1cmUKKyAqIE5vdGU6IFdlIGFzc3VtZSB0aGUgc2NzaSBjb21tYW5kcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzY2IgaXMgbm90IGZyZWUgeWV0LgorICovCitzdGF0aWMgdm9pZAorbWVnYV9mcmVlX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCit7CisJc3dpdGNoKCBzY2ItPmRtYV90eXBlICkgeworCisJY2FzZSBNRUdBX0RNQV9UWVBFX05PTkU6CisJCWJyZWFrOworCisJY2FzZSBNRUdBX0JVTEtfREFUQToKKwkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+ZGV2LCBzY2ItPmRtYV9oX2J1bGtkYXRhLAorCQkJc2NiLT5jbWQtPnJlcXVlc3RfYnVmZmxlbiwgc2NiLT5kbWFfZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIE1FR0FfU0dMSVNUOgorCQlwY2lfdW5tYXBfc2coYWRhcHRlci0+ZGV2LCBzY2ItPmNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQlzY2ItPmNtZC0+dXNlX3NnLCBzY2ItPmRtYV9kaXJlY3Rpb24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJICogUmVtb3ZlIGZyb20gdGhlIHBlbmRpbmcgbGlzdAorCSAqLworCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisKKwkvKiBMaW5rIHRoZSBzY2IgYmFjayBpbnRvIGZyZWUgbGlzdCAqLworCXNjYi0+c3RhdGUgPSBTQ0JfRlJFRTsKKwlzY2ItPmNtZCA9IE5VTEw7CisKKwlsaXN0X2FkZCgmc2NiLT5saXN0LCAmYWRhcHRlci0+ZnJlZV9saXN0KTsKK30KKworCitzdGF0aWMgaW50CitfX21lZ2FfYnVzeXdhaXRfbWJveCAoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXZvbGF0aWxlIG1ib3hfdCAqbWJveCA9IGFkYXB0ZXItPm1ib3g7CisJbG9uZyBjb3VudGVyOworCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDEwMDAwOyBjb3VudGVyKyspIHsKKwkJaWYgKCFtYm94LT5tX2luLmJ1c3kpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEwMCk7IHlpZWxkKCk7CisJfQorCXJldHVybiAtMTsJCS8qIGdpdmUgdXAgYWZ0ZXIgMSBzZWNvbmQgKi8KK30KKworLyoKKyAqIENvcGllcyBkYXRhIHRvIFNHTElTVAorICogTm90ZTogRm9yIDY0IGJpdCBjYXJkcywgd2UgbmVlZCBhIG1pbmltdW0gb2Ygb25lIFNHIGVsZW1lbnQgZm9yIHJlYWQvd3JpdGUKKyAqLworc3RhdGljIGludAorbWVnYV9idWlsZF9zZ2xpc3QoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiLCB1MzIgKmJ1ZiwgdTMyICpsZW4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CisJc3RydWN0IHBhZ2UJKnBhZ2U7CisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CisJU2NzaV9DbW5kCSpjbWQ7CisJaW50CXNnY250OworCWludAlpZHg7CisKKwljbWQgPSBzY2ItPmNtZDsKKworCS8qIFNjYXR0ZXItZ2F0aGVyIG5vdCB1c2VkICovCisJaWYoICFjbWQtPnVzZV9zZyApIHsKKworCQlwYWdlID0gdmlydF90b19wYWdlKGNtZC0+cmVxdWVzdF9idWZmZXIpOworCQlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKworCQlzY2ItPmRtYV9oX2J1bGtkYXRhID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPmRldiwKKwkJCQkJCSAgcGFnZSwgb2Zmc2V0LAorCQkJCQkJICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCSAgc2NiLT5kbWFfZGlyZWN0aW9uKTsKKwkJc2NiLT5kbWFfdHlwZSA9IE1FR0FfQlVMS19EQVRBOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gaGFuZGxlIHNwZWNpYWwgNjQtYml0IGNvbW1hbmRzIHRoYXQgbmVlZCBhCisJCSAqIG1pbmltdW0gb2YgMSBTRworCQkgKi8KKwkJaWYoIGFkYXB0ZXItPmhhc182NGJpdF9hZGRyICkgeworCQkJc2NiLT5zZ2w2NFswXS5hZGRyZXNzID0gc2NiLT5kbWFfaF9idWxrZGF0YTsKKwkJCXNjYi0+c2dsNjRbMF0ubGVuZ3RoID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQkqYnVmID0gKHUzMilzY2ItPnNnbF9kbWFfYWRkcjsKKwkJCSpsZW4gPSAodTMyKWNtZC0+cmVxdWVzdF9idWZmbGVuOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZSB7CisJCQkqYnVmID0gKHUzMilzY2ItPmRtYV9oX2J1bGtkYXRhOworCQkJKmxlbiA9ICh1MzIpY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisKKwkvKgorCSAqIENvcHkgU2NhdHRlci1HYXRoZXIgbGlzdCBpbmZvIGludG8gY29udHJvbGxlciBzdHJ1Y3R1cmUuCisJICoKKwkgKiBUaGUgbnVtYmVyIG9mIHNnIGVsZW1lbnRzIHJldHVybmVkIG11c3Qgbm90IGV4Y2VlZCBvdXIgbGltaXQKKwkgKi8KKwlzZ2NudCA9IHBjaV9tYXBfc2coYWRhcHRlci0+ZGV2LCBzZ2wsIGNtZC0+dXNlX3NnLAorCQkJc2NiLT5kbWFfZGlyZWN0aW9uKTsKKworCXNjYi0+ZG1hX3R5cGUgPSBNRUdBX1NHTElTVDsKKworCWlmKCBzZ2NudCA+IGFkYXB0ZXItPnNnbGVuICkgQlVHKCk7CisKKwlmb3IoIGlkeCA9IDA7IGlkeCA8IHNnY250OyBpZHgrKywgc2dsKysgKSB7CisKKwkJaWYoIGFkYXB0ZXItPmhhc182NGJpdF9hZGRyICkgeworCQkJc2NiLT5zZ2w2NFtpZHhdLmFkZHJlc3MgPSBzZ19kbWFfYWRkcmVzcyhzZ2wpOworCQkJc2NiLT5zZ2w2NFtpZHhdLmxlbmd0aCA9IHNnX2RtYV9sZW4oc2dsKTsKKwkJfQorCQllbHNlIHsKKwkJCXNjYi0+c2dsW2lkeF0uYWRkcmVzcyA9IHNnX2RtYV9hZGRyZXNzKHNnbCk7CisJCQlzY2ItPnNnbFtpZHhdLmxlbmd0aCA9IHNnX2RtYV9sZW4oc2dsKTsKKwkJfQorCX0KKworCS8qIFJlc2V0IHBvaW50ZXIgYW5kIGxlbmd0aCBmaWVsZHMgKi8KKwkqYnVmID0gc2NiLT5zZ2xfZG1hX2FkZHI7CisKKwkvKgorCSAqIEZvciBwYXNzdGhydSBjb21tYW5kLCBkYXRheGZlcmxlbiBtdXN0IGJlIHNldCwgZXZlbiBmb3IgY29tbWFuZHMKKwkgKiB3aXRoIGEgc2cgbGlzdAorCSAqLworCSpsZW4gPSAodTMyKWNtZC0+cmVxdWVzdF9idWZmbGVuOworCisJLyogUmV0dXJuIGNvdW50IG9mIFNHIHJlcXVlc3RzICovCisJcmV0dXJuIHNnY250OworfQorCisKKy8qCisgKiBtZWdhXzhfdG9fNDBsZCgpCisgKgorICogdGFrZXMgYWxsIGluZm8gaW4gQWRhcHRlcklucXVpcnkgc3RydWN0dXJlIGFuZCBwdXRzIGl0IGludG8gUHJvZHVjdEluZm8gYW5kCisgKiBFbnF1aXJ5MyBzdHJ1Y3R1cmVzIGZvciBsYXRlciB1c2UKKyAqLworc3RhdGljIHZvaWQKK21lZ2FfOF90b180MGxkKG1yYWlkX2lucXVpcnkgKmlucXVpcnksIG1lZ2FfaW5xdWlyeTMgKmVucXVpcnkzLAorCQltZWdhX3Byb2R1Y3RfaW5mbyAqcHJvZHVjdF9pbmZvKQoreworCWludCBpOworCisJcHJvZHVjdF9pbmZvLT5tYXhfY29tbWFuZHMgPSBpbnF1aXJ5LT5hZGFwdGVyX2luZm8ubWF4X2NvbW1hbmRzOworCWVucXVpcnkzLT5yZWJ1aWxkX3JhdGUgPSBpbnF1aXJ5LT5hZGFwdGVyX2luZm8ucmVidWlsZF9yYXRlOworCXByb2R1Y3RfaW5mby0+bmNoYW5uZWxzID0gaW5xdWlyeS0+YWRhcHRlcl9pbmZvLm5jaGFubmVsczsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcHJvZHVjdF9pbmZvLT5md192ZXJzaW9uW2ldID0KKwkJCWlucXVpcnktPmFkYXB0ZXJfaW5mby5md192ZXJzaW9uW2ldOworCisJCXByb2R1Y3RfaW5mby0+Ymlvc192ZXJzaW9uW2ldID0KKwkJCWlucXVpcnktPmFkYXB0ZXJfaW5mby5iaW9zX3ZlcnNpb25baV07CisJfQorCWVucXVpcnkzLT5jYWNoZV9mbHVzaF9pbnRlcnZhbCA9CisJCWlucXVpcnktPmFkYXB0ZXJfaW5mby5jYWNoZV9mbHVzaF9pbnRlcnZhbDsKKworCXByb2R1Y3RfaW5mby0+ZHJhbV9zaXplID0gaW5xdWlyeS0+YWRhcHRlcl9pbmZvLmRyYW1fc2l6ZTsKKworCWVucXVpcnkzLT5udW1fbGRydiA9IGlucXVpcnktPmxvZ2Rydl9pbmZvLm51bV9sZHJ2OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0RSSVZFU184TEQ7IGkrKykgeworCQllbnF1aXJ5My0+bGRydl9zaXplW2ldID0gaW5xdWlyeS0+bG9nZHJ2X2luZm8ubGRydl9zaXplW2ldOworCQllbnF1aXJ5My0+bGRydl9wcm9wW2ldID0gaW5xdWlyeS0+bG9nZHJ2X2luZm8ubGRydl9wcm9wW2ldOworCQllbnF1aXJ5My0+bGRydl9zdGF0ZVtpXSA9IGlucXVpcnktPmxvZ2Rydl9pbmZvLmxkcnZfc3RhdGVbaV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IChNQVhfUEhZU0lDQUxfRFJJVkVTKTsgaSsrKQorCQllbnF1aXJ5My0+cGRydl9zdGF0ZVtpXSA9IGlucXVpcnktPnBkcnZfaW5mby5wZHJ2X3N0YXRlW2ldOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK21lZ2FfZnJlZV9zZ2woYWRhcHRlcl90ICphZGFwdGVyKQoreworCXNjYl90CSpzY2I7CisJaW50CWk7CisKKwlmb3IoaSA9IDA7IGkgPCBhZGFwdGVyLT5tYXhfY21kczsgaSsrKSB7CisKKwkJc2NiID0gJmFkYXB0ZXItPnNjYl9saXN0W2ldOworCisJCWlmKCBzY2ItPnNnbDY0ICkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJc2l6ZW9mKG1lZ2Ffc2dsNjQpICogYWRhcHRlci0+c2dsZW4sCisJCQkJc2NiLT5zZ2w2NCwKKwkJCQlzY2ItPnNnbF9kbWFfYWRkcik7CisKKwkJCXNjYi0+c2dsNjQgPSBOVUxMOworCQl9CisKKwkJaWYoIHNjYi0+cHRocnUgKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwgc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLAorCQkJCXNjYi0+cHRocnUsIHNjYi0+cHRocnVfZG1hX2FkZHIpOworCisJCQlzY2ItPnB0aHJ1ID0gTlVMTDsKKwkJfQorCisJCWlmKCBzY2ItPmVwdGhydSApIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LAorCQkJCXNpemVvZihtZWdhX2V4dF9wYXNzdGhydSksCisJCQkJc2NiLT5lcHRocnUsIHNjYi0+ZXB0aHJ1X2RtYV9hZGRyKTsKKworCQkJc2NiLT5lcHRocnUgPSBOVUxMOworCQl9CisKKwl9Cit9CisKKworLyoKKyAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZC9kcml2ZXIKKyAqLworY29uc3QgY2hhciAqCittZWdhcmFpZF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzUxMl07CisJYWRhcHRlcl90ICphZGFwdGVyOworCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKilob3N0LT5ob3N0ZGF0YTsKKworCXNwcmludGYgKGJ1ZmZlciwKKwkJICJMU0kgTG9naWMgTWVnYVJBSUQgJXMgJWQgY29tbWFuZHMgJWQgdGFyZ3MgJWQgY2hhbnMgJWQgbHVucyIsCisJCSBhZGFwdGVyLT5md192ZXJzaW9uLCBhZGFwdGVyLT5wcm9kdWN0X2luZm8ubWF4X2NvbW1hbmRzLAorCQkgYWRhcHRlci0+aG9zdC0+bWF4X2lkLCBhZGFwdGVyLT5ob3N0LT5tYXhfY2hhbm5lbCwKKwkJIGFkYXB0ZXItPmhvc3QtPm1heF9sdW4pOworCXJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBBYm9ydCBhIHByZXZpb3VzIFNDU0kgcmVxdWVzdC4gT25seSBjb21tYW5kcyBvbiB0aGUgcGVuZGluZyBsaXN0IGNhbiBiZQorICogYWJvcnRlZC4gQWxsIHRoZSBjb21tYW5kcyBpc3N1ZWQgdG8gdGhlIEYvVyBtdXN0IGNvbXBsZXRlLgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9hYm9ydChTY3NpX0NtbmQgKmNtZCkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisJaW50CQlydmFsOworCisJYWRhcHRlciA9IChhZGFwdGVyX3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlydmFsID0gIG1lZ2FyYWlkX2Fib3J0X2FuZF9yZXNldChhZGFwdGVyLCBjbWQsIFNDQl9BQk9SVCk7CisKKwkvKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgaGVyZSB0byBjb21wbGV0ZSBhbnkgY29tcGxldGVkIHJlcXVlc3RzCisJICogdG8gYmUgY29tbXVuaWNhdGVkIG92ZXIgdG8gdGhlIG1pZCBsYXllci4KKwkgKi8KKwltZWdhX3J1bmRvbmVxKGFkYXB0ZXIpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworc3RhdGljIGludAorbWVnYXJhaWRfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCW1lZ2FjbWRfdAltYzsKKwlpbnQJCXJ2YWw7CisKKwlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworI2lmIE1FR0FfSEFWRV9DTFVTVEVSSU5HCisJbWMuY21kID0gTUVHQV9DTFVTVEVSX0NNRDsKKwltYy5vcGNvZGUgPSBNRUdBX1JFU0VUX1JFU0VSVkFUSU9OUzsKKworCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+bG9jayk7CisJaWYoIG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBOVUxMKSAhPSAwICkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiByZXNlcnZhdGlvbiByZXNldCBmYWlsZWQuXG4iKTsKKwl9CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIm1lZ2FyYWlkOiByZXNlcnZhdGlvbiByZXNldC5cbiIpOworCX0KKwlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT5sb2NrKTsKKyNlbmRpZgorCisJcnZhbCA9ICBtZWdhcmFpZF9hYm9ydF9hbmRfcmVzZXQoYWRhcHRlciwgY21kLCBTQ0JfUkVTRVQpOworCisJLyoKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGhlcmUgdG8gY29tcGxldGUgYW55IGNvbXBsZXRlZCByZXF1ZXN0cworCSAqIHRvIGJlIGNvbW11bmljYXRlZCBvdmVyIHRvIHRoZSBtaWQgbGF5ZXIuCisJICovCisJbWVnYV9ydW5kb25lcShhZGFwdGVyKTsKKworCXJldHVybiBydmFsOworfQorCisKKworLyoqCisgKiBtZWdhcmFpZF9hYm9ydF9hbmRfcmVzZXQoKQorICogQGFkYXB0ZXIgLSBtZWdhcmFpZCBzb2Z0IHN0YXRlCisgKiBAY21kIC0gc2NzaSBjb21tYW5kIHRvIGJlIGFib3J0ZWQgb3IgcmVzZXQKKyAqIEBhb3IgLSBhYm9ydCBvciByZXNldCBmbGFnCisgKgorICogVHJ5IHRvIGxvY2F0ZSB0aGUgc2NzaSBjb21tYW5kIGluIHRoZSBwZW5kaW5nIHF1ZXVlLiBJZiBmb3VuZCBhbmQgaXMgbm90CisgKiBpc3N1ZWQgdG8gdGhlIGNvbnRyb2xsZXIsIGFib3J0L3Jlc2V0IGl0LiBPdGhlcndpc2UgcmV0dXJuIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfYWJvcnRfYW5kX3Jlc2V0KGFkYXB0ZXJfdCAqYWRhcHRlciwgU2NzaV9DbW5kICpjbWQsIGludCBhb3IpCit7CisJc3RydWN0IGxpc3RfaGVhZAkqcG9zLCAqbmV4dDsKKwlzY2JfdAkJCSpzY2I7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogJXMtJWx4IGNtZD0leCA8Yz0lZCB0PSVkIGw9JWQ+XG4iLAorCSAgICAgKGFvciA9PSBTQ0JfQUJPUlQpPyAiQUJPUlRJTkciOiJSRVNFVCIsIGNtZC0+c2VyaWFsX251bWJlciwKKwkgICAgIGNtZC0+Y21uZFswXSwgY21kLT5kZXZpY2UtPmNoYW5uZWwsIAorCSAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCWlmKGxpc3RfZW1wdHkoJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCkpCisJCXJldHVybiBGQUxTRTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsICZhZGFwdGVyLT5wZW5kaW5nX2xpc3QpIHsKKworCQlzY2IgPSBsaXN0X2VudHJ5KHBvcywgc2NiX3QsIGxpc3QpOworCisJCWlmIChzY2ItPmNtZCA9PSBjbWQpIHsgLyogRm91bmQgY29tbWFuZCAqLworCisJCQlzY2ItPnN0YXRlIHw9IGFvcjsKKworCQkJLyoKKwkJCSAqIENoZWNrIGlmIHRoaXMgY29tbWFuZCBoYXMgZmlybWFyZSBvd2VuZXJzaGlwLiBJZgorCQkJICogeWVzLCB3ZSBjYW5ub3QgcmVzZXQgdGhpcyBjb21tYW5kLiBXaGVuZXZlciwgZi93CisJCQkgKiBjb21wbGV0ZXMgdGhpcyBjb21tYW5kLCB3ZSB3aWxsIHJldHVybiBhcHByb3ByaWF0ZQorCQkJICogc3RhdHVzIGZyb20gSVNSLgorCQkJICovCisJCQlpZiggc2NiLT5zdGF0ZSAmIFNDQl9JU1NVRUQgKSB7CisKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSJtZWdhcmFpZDogJXMtJWx4WyV4XSwgZncgb3duZXIuXG4iLAorCQkJCQkoYW9yPT1TQ0JfQUJPUlQpID8gIkFCT1JUSU5HIjoiUkVTRVQiLAorCQkJCQljbWQtPnNlcmlhbF9udW1iZXIsIHNjYi0+aWR4KTsKKworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWVsc2UgeworCisJCQkJLyoKKwkJCQkgKiBOb3QgeWV0IGlzc3VlZCEgUmVtb3ZlIGZyb20gdGhlIHBlbmRpbmcKKwkJCQkgKiBsaXN0CisJCQkJICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkibWVnYXJhaWQ6ICVzLSVseFsleF0sIGRyaXZlciBvd25lci5cbiIsCisJCQkJCShhb3I9PVNDQl9BQk9SVCkgPyAiQUJPUlRJTkciOiJSRVNFVCIsCisJCQkJCWNtZC0+c2VyaWFsX251bWJlciwgc2NiLT5pZHgpOworCisJCQkJbWVnYV9mcmVlX3NjYihhZGFwdGVyLCBzY2IpOworCisJCQkJaWYoIGFvciA9PSBTQ0JfQUJPUlQgKSB7CisJCQkJCWNtZC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJCX0KKworCQkJCWxpc3RfYWRkX3RhaWwoU0NTSV9MSVNUKGNtZCksCisJCQkJCQkmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QpOworCisJCQkJcmV0dXJuIFRSVUU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittYWtlX2xvY2FsX3BkZXYoYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgcGNpX2RldiAqKnBkZXYpCit7CisJKnBkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2RldiksIEdGUF9LRVJORUwpOworCisJaWYoICpwZGV2ID09IE5VTEwgKSByZXR1cm4gLTE7CisKKwltZW1jcHkoKnBkZXYsIGFkYXB0ZXItPmRldiwgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2KSk7CisKKwlpZiggcGNpX3NldF9kbWFfbWFzaygqcGRldiwgMHhmZmZmZmZmZikgIT0gMCApIHsKKwkJa2ZyZWUoKnBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnJlZV9sb2NhbF9wZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWtmcmVlKHBkZXYpOworfQorCisvKioKKyAqIG1lZ2FfYWxsb2NhdGVfaW5xdWlyeSgpCisgKiBAZG1hX2hhbmRsZSAtIGhhbmRsZSByZXR1cm5lZCBmb3IgZG1hIGFkZHJlc3MKKyAqIEBwZGV2IC0gaGFuZGxlIHRvIHBjaSBkZXZpY2UKKyAqCisgKiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBpbnF1aXJ5IHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorbWVnYV9hbGxvY2F0ZV9pbnF1aXJ5KGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YobWVnYV9pbnF1aXJ5MyksIGRtYV9oYW5kbGUpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVnYV9mcmVlX2lucXVpcnkodm9pZCAqaW5xdWlyeSwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihtZWdhX2lucXVpcnkzKSwgaW5xdWlyeSwgZG1hX2hhbmRsZSk7Cit9CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiBGb2xsb3dpbmcgY29kZSBoYW5kbGVzIC9wcm9jIGZzICAqLworCisjZGVmaW5lIENSRUFURV9SRUFEX1BST0Moc3RyaW5nLCBmdW5jKQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KHN0cmluZywJXAorCQkJCQlTX0lSVVNSIHwgU19JRlJFRywJCVwKKwkJCQkJY29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSwJXAorCQkJCQlmdW5jLCBhZGFwdGVyKQorCisvKioKKyAqIG1lZ2FfY3JlYXRlX3Byb2NfZW50cnkoKQorICogQGluZGV4IC0gaW5kZXggaW4gc29mdCBzdGF0ZSBhcnJheQorICogQHBhcmVudCAtIHBhcmVudCBub2RlIGZvciB0aGlzIC9wcm9jIGVudHJ5CisgKgorICogQ3JlYXRlcyAvcHJvYyBlbnRyaWVzIGZvciBvdXIgY29udHJvbGxlcnMuCisgKi8KK3N0YXRpYyB2b2lkCittZWdhX2NyZWF0ZV9wcm9jX2VudHJ5KGludCBpbmRleCwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpjb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5ID0gTlVMTDsKKwl1OAkJc3RyaW5nWzY0XSA9IHsgMCB9OworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IGhiYV9zb2Z0X3N0YXRlW2luZGV4XTsKKworCXNwcmludGYoc3RyaW5nLCAiaGJhJWQiLCBhZGFwdGVyLT5ob3N0LT5ob3N0X25vKTsKKworCWNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkgPQorCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5ID0gcHJvY19ta2RpcihzdHJpbmcsIHBhcmVudCk7CisKKwlpZighY29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJcbm1lZ2FyYWlkOiBwcm9jX21rZGlyIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisJYWRhcHRlci0+cHJvY19yZWFkID0gQ1JFQVRFX1JFQURfUFJPQygiY29uZmlnIiwgcHJvY19yZWFkX2NvbmZpZyk7CisJYWRhcHRlci0+cHJvY19zdGF0ID0gQ1JFQVRFX1JFQURfUFJPQygic3RhdCIsIHByb2NfcmVhZF9zdGF0KTsKKwlhZGFwdGVyLT5wcm9jX21ib3ggPSBDUkVBVEVfUkVBRF9QUk9DKCJtYWlsYm94IiwgcHJvY19yZWFkX21ib3gpOworI2lmIE1FR0FfSEFWRV9FTkhfUFJPQworCWFkYXB0ZXItPnByb2NfcnIgPSBDUkVBVEVfUkVBRF9QUk9DKCJyZWJ1aWxkLXJhdGUiLCBwcm9jX3JlYnVpbGRfcmF0ZSk7CisJYWRhcHRlci0+cHJvY19iYXR0ZXJ5ID0gQ1JFQVRFX1JFQURfUFJPQygiYmF0dGVyeS1zdGF0dXMiLAorCQkJcHJvY19iYXR0ZXJ5KTsKKworCS8qCisJICogRGlzcGxheSBlYWNoIHBoeXNpY2FsIGRyaXZlIG9uIGl0cyBjaGFubmVsCisJICovCisJYWRhcHRlci0+cHJvY19wZHJ2c3RhdFswXSA9IENSRUFURV9SRUFEX1BST0MoImRpc2tkcml2ZXMtY2gwIiwKKwkJCQkJcHJvY19wZHJ2X2NoMCk7CisJYWRhcHRlci0+cHJvY19wZHJ2c3RhdFsxXSA9IENSRUFURV9SRUFEX1BST0MoImRpc2tkcml2ZXMtY2gxIiwKKwkJCQkJcHJvY19wZHJ2X2NoMSk7CisJYWRhcHRlci0+cHJvY19wZHJ2c3RhdFsyXSA9IENSRUFURV9SRUFEX1BST0MoImRpc2tkcml2ZXMtY2gyIiwKKwkJCQkJcHJvY19wZHJ2X2NoMik7CisJYWRhcHRlci0+cHJvY19wZHJ2c3RhdFszXSA9IENSRUFURV9SRUFEX1BST0MoImRpc2tkcml2ZXMtY2gzIiwKKwkJCQkJcHJvY19wZHJ2X2NoMyk7CisKKwkvKgorCSAqIERpc3BsYXkgYSBzZXQgb2YgdXAgdG8gMTAgbG9naWNhbCBkcml2ZSB0aHJvdWdoIGVhY2ggb2YgZm9sbG93aW5nCisJICogL3Byb2MgZW50cmllcworCSAqLworCWFkYXB0ZXItPnByb2NfcmRydnN0YXRbMF0gPSBDUkVBVEVfUkVBRF9QUk9DKCJyYWlkZHJpdmVzLTAtOSIsCisJCQkJCXByb2NfcmRydl8xMCk7CisJYWRhcHRlci0+cHJvY19yZHJ2c3RhdFsxXSA9IENSRUFURV9SRUFEX1BST0MoInJhaWRkcml2ZXMtMTAtMTkiLAorCQkJCQlwcm9jX3JkcnZfMjApOworCWFkYXB0ZXItPnByb2NfcmRydnN0YXRbMl0gPSBDUkVBVEVfUkVBRF9QUk9DKCJyYWlkZHJpdmVzLTIwLTI5IiwKKwkJCQkJcHJvY19yZHJ2XzMwKTsKKwlhZGFwdGVyLT5wcm9jX3JkcnZzdGF0WzNdID0gQ1JFQVRFX1JFQURfUFJPQygicmFpZGRyaXZlcy0zMC0zOSIsCisJCQkJCXByb2NfcmRydl80MCk7CisjZW5kaWYKK30KKworCisvKioKKyAqIHByb2NfcmVhZF9jb25maWcoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbGxlci4KKyAqLworc3RhdGljIGludAorcHJvY19yZWFkX2NvbmZpZyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyIsIE1FR0FSQUlEX1ZFUlNJT04pOworCisJaWYoYWRhcHRlci0+cHJvZHVjdF9pbmZvLnByb2R1Y3RfbmFtZVswXSkKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlc1xuIiwKKwkJCQlhZGFwdGVyLT5wcm9kdWN0X2luZm8ucHJvZHVjdF9uYW1lKTsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiQ29udHJvbGxlciBUeXBlOiAiKTsKKworCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfTUVNTUFQICkgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSI0MzgvNDY2LzQ2Ny80NzEvNDkzLzUxOC81MjAvNTMxLzUzMlxuIik7CisJfQorCWVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSI0MTgvNDI4LzQzNFxuIik7CisJfQorCisJaWYoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCQkJIkNvbnRyb2xsZXIgU3VwcG9ydHMgNDAgTG9naWNhbCBEcml2ZXNcbiIpOworCX0KKworCWlmKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF82NEJJVCkgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJIkNvbnRyb2xsZXIgY2FwYWJsZSBvZiA2NC1iaXQgbWVtb3J5IGFkZHJlc3NpbmdcbiIpOworCX0KKwlpZiggYWRhcHRlci0+aGFzXzY0Yml0X2FkZHIgKSB7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJIkNvbnRyb2xsZXIgdXNpbmcgNjQtYml0IG1lbW9yeSBhZGRyZXNzaW5nXG4iKTsKKwl9CisJZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJIkNvbnRyb2xsZXIgaXMgbm90IHVzaW5nIDY0LWJpdCBtZW1vcnkgYWRkcmVzc2luZ1xuIik7CisJfQorCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJCYXNlID0gJTA4bHgsIElycSA9ICVkLCAiLCBhZGFwdGVyLT5iYXNlLAorCQkJYWRhcHRlci0+aG9zdC0+aXJxKTsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiTG9naWNhbCBEcml2ZXMgPSAlZCwgQ2hhbm5lbHMgPSAlZFxuIiwKKwkJCWFkYXB0ZXItPm51bWxkcnYsIGFkYXB0ZXItPnByb2R1Y3RfaW5mby5uY2hhbm5lbHMpOworCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJWZXJzaW9uID0lczolcywgRFJBTSA9ICVkTWJcbiIsCisJCQlhZGFwdGVyLT5md192ZXJzaW9uLCBhZGFwdGVyLT5iaW9zX3ZlcnNpb24sCisJCQlhZGFwdGVyLT5wcm9kdWN0X2luZm8uZHJhbV9zaXplKTsKKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkiQ29udHJvbGxlciBRdWV1ZSBEZXB0aCA9ICVkLCBEcml2ZXIgUXVldWUgRGVwdGggPSAlZFxuIiwKKwkJYWRhcHRlci0+cHJvZHVjdF9pbmZvLm1heF9jb21tYW5kcywgYWRhcHRlci0+bWF4X2NtZHMpOworCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdXBwb3J0X2V4dF9jZGIgICAgPSAlZFxuIiwKKwkJCWFkYXB0ZXItPnN1cHBvcnRfZXh0X2NkYik7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdXBwb3J0X3JhbmRvbV9kZWwgPSAlZFxuIiwKKwkJCWFkYXB0ZXItPnN1cHBvcnRfcmFuZG9tX2RlbCk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJib290X2xkcnZfZW5hYmxlZCAgPSAlZFxuIiwKKwkJCWFkYXB0ZXItPmJvb3RfbGRydl9lbmFibGVkKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgImJvb3RfbGRydiAgICAgICAgICA9ICVkXG4iLAorCQkJYWRhcHRlci0+Ym9vdF9sZHJ2KTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgImJvb3RfcGRydl9lbmFibGVkICA9ICVkXG4iLAorCQkJYWRhcHRlci0+Ym9vdF9wZHJ2X2VuYWJsZWQpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiYm9vdF9wZHJ2X2NoICAgICAgID0gJWRcbiIsCisJCQlhZGFwdGVyLT5ib290X3BkcnZfY2gpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiYm9vdF9wZHJ2X3RndCAgICAgID0gJWRcbiIsCisJCQlhZGFwdGVyLT5ib290X3BkcnZfdGd0KTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgInF1aWVzY2VudCAgICAgICAgICA9ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJmFkYXB0ZXItPnF1aWVzY2VudCkpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiaGFzX2NsdXN0ZXIgICAgICAgID0gJWRcbiIsCisJCQlhZGFwdGVyLT5oYXNfY2x1c3Rlcik7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlxuTW9kdWxlIFBhcmFtZXRlcnM6XG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIm1heF9jbWRfcGVyX2x1biAgICA9ICVkXG4iLAorCQkJbWF4X2NtZF9wZXJfbHVuKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIm1heF9zZWN0b3JzX3Blcl9pbyA9ICVkXG4iLAorCQkJbWF4X3NlY3RvcnNfcGVyX2lvKTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIGxlbjsKK30KKworCisKKy8qKgorICogcHJvY19yZWFkX3N0YXQoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpYXBsYXkgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEkvTyBhY3Rpdml0eS4KKyAqLworc3RhdGljIGludAorcHJvY19yZWFkX3N0YXQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisJYWRhcHRlcl90CSphZGFwdGVyOworCWludAlsZW47CisJaW50CWk7CisKKwlpID0gMDsJLyogYXZvaWQgY29tcGlsYXRpb24gd2FybmluZ3MgKi8KKwlsZW4gPSAwOworCWFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIlN0YXRpc3RpY2FsIEluZm9ybWF0aW9uIGZvciB0aGlzIGNvbnRyb2xsZXJcbiIpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAicGVuZF9jbWRzID0gJWRcbiIsCisJCQlhdG9taWNfcmVhZCgmYWRhcHRlci0+cGVuZF9jbWRzKSk7CisjaWYgTUVHQV9IQVZFX1NUQVRTCisJZm9yKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtbGRydjsgaSsrKSB7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiTG9naWNhbCBEcml2ZSAlZDpcbiIsIGkpOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJIlx0UmVhZHMgSXNzdWVkID0gJWx1LCBXcml0ZXMgSXNzdWVkID0gJWx1XG4iLAorCQkJYWRhcHRlci0+bnJlYWRzW2ldLCBhZGFwdGVyLT5ud3JpdGVzW2ldKTsKKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSJcdFNlY3RvcnMgUmVhZCA9ICVsdSwgU2VjdG9ycyBXcml0dGVuID0gJWx1XG4iLAorCQkJYWRhcHRlci0+bnJlYWRibG9ja3NbaV0sIGFkYXB0ZXItPm53cml0ZWJsb2Nrc1tpXSk7CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJCQkiXHRSZWFkIGVycm9ycyA9ICVsdSwgV3JpdGUgZXJyb3JzID0gJWx1XG5cbiIsCisJCQlhZGFwdGVyLT5yZF9lcnJvcnNbaV0sIGFkYXB0ZXItPndyX2Vycm9yc1tpXSk7CisJfQorI2Vsc2UKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwKKwkJCSJJTyBhbmQgZXJyb3IgY291bnRlcnMgbm90IGNvbXBpbGVkIGluIGRyaXZlci5cbiIpOworI2VuZGlmCisKKwkqZW9mID0gMTsKKworCXJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBwcm9jX3JlYWRfbWJveCgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSBtYWlsYm94IGluZm9ybWF0aW9uIGZvciB0aGUgbGFzdCBjb21tYW5kIGlzc3VlZC4gVGhpcyBpbmZvcm1hdGlvbgorICogaXMgZ29vZCBmb3IgZGVidWdnaW5nLgorICovCitzdGF0aWMgaW50Citwcm9jX3JlYWRfbWJveChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCXZvbGF0aWxlIG1ib3hfdAkqbWJveCA9IGFkYXB0ZXItPm1ib3g7CisJaW50CWxlbiA9IDA7CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICJDb250ZW50cyBvZiBNYWlsIEJveCBTdHJ1Y3R1cmVcbiIpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiICBGdyBDb21tYW5kICAgPSAweCUwMnhcbiIsIAorCQkJbWJveC0+bV9vdXQuY21kKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgQ21kIFNlcXVlbmNlID0gMHglMDJ4XG4iLCAKKwkJCW1ib3gtPm1fb3V0LmNtZGlkKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgTm8gb2YgU2VjdG9ycz0gJTA0ZFxuIiwgCisJCQltYm94LT5tX291dC5udW1zZWN0b3JzKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgTEJBICAgICAgICAgID0gMHglMDJ4XG4iLCAKKwkJCW1ib3gtPm1fb3V0LmxiYSk7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIERUQSAgICAgICAgICA9IDB4JTA4eFxuIiwgCisJCQltYm94LT5tX291dC54ZmVyYWRkcik7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIgIExvZ2ljYWwgRHJpdmU9IDB4JTAyeFxuIiwgCisJCQltYm94LT5tX291dC5sb2dkcnYpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiICBObyBvZiBTRyBFbG10PSAweCUwMnhcbiIsCisJCQltYm94LT5tX291dC5udW1zZ2VsZW1lbnRzKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgQnVzeSAgICAgICAgID0gJTAxeFxuIiwgCisJCQltYm94LT5tX2luLmJ1c3kpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiICBTdGF0dXMgICAgICAgPSAweCUwMnhcbiIsIAorCQkJbWJveC0+bV9pbi5zdGF0dXMpOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gbGVuOworfQorCisKKy8qKgorICogcHJvY19yZWJ1aWxkX3JhdGUoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgY3VycmVudCByZWJ1aWxkIHJhdGUKKyAqLworc3RhdGljIGludAorcHJvY19yZWJ1aWxkX3JhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisJYWRhcHRlcl90CSphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRhdGE7CisJZG1hX2FkZHJfdAlkbWFfaGFuZGxlOworCWNhZGRyX3QJCWlucXVpcnk7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisJaW50CWxlbiA9IDA7CisKKwlpZiggbWFrZV9sb2NhbF9wZGV2KGFkYXB0ZXIsICZwZGV2KSAhPSAwICkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggKGlucXVpcnkgPSBtZWdhX2FsbG9jYXRlX2lucXVpcnkoJmRtYV9oYW5kbGUsIHBkZXYpKSA9PSBOVUxMICkgeworCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisJCSplb2YgPSAxOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmKCBtZWdhX2FkYXBpbnEoYWRhcHRlciwgZG1hX2hhbmRsZSkgIT0gMCApIHsKKworCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJBZGFwdGVyIGlucXVpcnkgZmFpbGVkLlxuIik7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IGlucXVpcnkgZmFpbGVkLlxuIik7CisKKwkJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCSplb2YgPSAxOworCisJCXJldHVybiBsZW47CisJfQorCisJaWYoIGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEICkgeworCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJSZWJ1aWxkIFJhdGU6IFslZCUlXVxuIiwKKwkJCSgobWVnYV9pbnF1aXJ5MyAqKWlucXVpcnkpLT5yZWJ1aWxkX3JhdGUpOworCX0KKwllbHNlIHsKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiUmVidWlsZCBSYXRlOiBbJWQlJV1cbiIsCisJCQkoKG1yYWlkX2V4dF9pbnF1aXJ5ICopCisJCQlpbnF1aXJ5KS0+cmFpZF9pbnEuYWRhcHRlcl9pbmZvLnJlYnVpbGRfcmF0ZSk7CisJfQorCisKKwltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKKworCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIGxlbjsKK30KKworCisvKioKKyAqIHByb2NfYmF0dGVyeSgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmF0dGVyeSBtb2R1bGUgb24gdGhlIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfYmF0dGVyeShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKwlkbWFfYWRkcl90CWRtYV9oYW5kbGU7CisJY2FkZHJfdAkJaW5xdWlyeTsKKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKwl1OAliYXR0ZXJ5X3N0YXR1cyA9IDA7CisJY2hhcglzdHJbMjU2XTsKKwlpbnQJbGVuID0gMDsKKworCWlmKCBtYWtlX2xvY2FsX3BkZXYoYWRhcHRlciwgJnBkZXYpICE9IDAgKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmKCAoaW5xdWlyeSA9IG1lZ2FfYWxsb2NhdGVfaW5xdWlyeSgmZG1hX2hhbmRsZSwgcGRldikpID09IE5VTEwgKSB7CisJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKwkJKmVvZiA9IDE7CisJCXJldHVybiBsZW47CisJfQorCisJaWYoIG1lZ2FfYWRhcGlucShhZGFwdGVyLCBkbWFfaGFuZGxlKSAhPSAwICkgeworCisJCWxlbiA9IHNwcmludGYocGFnZSwgIkFkYXB0ZXIgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogaW5xdWlyeSBmYWlsZWQuXG4iKTsKKworCQltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKKworCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJKmVvZiA9IDE7CisKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQgKSB7CisJCWJhdHRlcnlfc3RhdHVzID0gKChtZWdhX2lucXVpcnkzICopaW5xdWlyeSktPmJhdHRlcnlfc3RhdHVzOworCX0KKwllbHNlIHsKKwkJYmF0dGVyeV9zdGF0dXMgPSAoKG1yYWlkX2V4dF9pbnF1aXJ5ICopaW5xdWlyeSktPgorCQkJcmFpZF9pbnEuYWRhcHRlcl9pbmZvLmJhdHRlcnlfc3RhdHVzOworCX0KKworCS8qCisJICogRGVjb2RlIHRoZSBiYXR0ZXJ5IHN0YXR1cworCSAqLworCXNwcmludGYoc3RyLCAiQmF0dGVyeSBTdGF0dXM6WyVkXSIsIGJhdHRlcnlfc3RhdHVzKTsKKworCWlmKGJhdHRlcnlfc3RhdHVzID09IE1FR0FfQkFUVF9DSEFSR0VfRE9ORSkKKwkJc3RyY2F0KHN0ciwgIiBDaGFyZ2UgRG9uZSIpOworCisJaWYoYmF0dGVyeV9zdGF0dXMgJiBNRUdBX0JBVFRfTU9EVUxFX01JU1NJTkcpCisJCXN0cmNhdChzdHIsICIgTW9kdWxlIE1pc3NpbmciKTsKKwkKKwlpZihiYXR0ZXJ5X3N0YXR1cyAmIE1FR0FfQkFUVF9MT1dfVk9MVEFHRSkKKwkJc3RyY2F0KHN0ciwgIiBMb3cgVm9sdGFnZSIpOworCQorCWlmKGJhdHRlcnlfc3RhdHVzICYgTUVHQV9CQVRUX1RFTVBfSElHSCkKKwkJc3RyY2F0KHN0ciwgIiBUZW1wZXJhdHVyZSBIaWdoIik7CisJCisJaWYoYmF0dGVyeV9zdGF0dXMgJiBNRUdBX0JBVFRfUEFDS19NSVNTSU5HKQorCQlzdHJjYXQoc3RyLCAiIFBhY2sgTWlzc2luZyIpOworCQorCWlmKGJhdHRlcnlfc3RhdHVzICYgTUVHQV9CQVRUX0NIQVJHRV9JTlBST0cpCisJCXN0cmNhdChzdHIsICIgQ2hhcmdlIEluLXByb2dyZXNzIik7CisJCisJaWYoYmF0dGVyeV9zdGF0dXMgJiBNRUdBX0JBVFRfQ0hBUkdFX0ZBSUwpCisJCXN0cmNhdChzdHIsICIgQ2hhcmdlIEZhaWwiKTsKKwkKKwlpZihiYXR0ZXJ5X3N0YXR1cyAmIE1FR0FfQkFUVF9DWUNMRVNfRVhDRUVERUQpCisJCXN0cmNhdChzdHIsICIgQ3ljbGVzIEV4Y2VlZGVkIik7CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgc3RyKTsKKworCisJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkqZW9mID0gMTsKKworCXJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBwcm9jX3BkcnZfY2gwKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaHlzaWNhbCBkcml2ZXMgb24gcGh5c2ljYWwgY2hhbm5lbCAwLgorICovCitzdGF0aWMgaW50Citwcm9jX3BkcnZfY2gwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcGRydihhZGFwdGVyLCBwYWdlLCAwKSk7Cit9CisKKworLyoqCisgKiBwcm9jX3BkcnZfY2gxKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaHlzaWNhbCBkcml2ZXMgb24gcGh5c2ljYWwgY2hhbm5lbCAxLgorICovCitzdGF0aWMgaW50Citwcm9jX3BkcnZfY2gxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcGRydihhZGFwdGVyLCBwYWdlLCAxKSk7Cit9CisKKworLyoqCisgKiBwcm9jX3BkcnZfY2gyKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaHlzaWNhbCBkcml2ZXMgb24gcGh5c2ljYWwgY2hhbm5lbCAyLgorICovCitzdGF0aWMgaW50Citwcm9jX3BkcnZfY2gyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcGRydihhZGFwdGVyLCBwYWdlLCAyKSk7Cit9CisKKworLyoqCisgKiBwcm9jX3BkcnZfY2gzKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaHlzaWNhbCBkcml2ZXMgb24gcGh5c2ljYWwgY2hhbm5lbCAzLgorICovCitzdGF0aWMgaW50Citwcm9jX3BkcnZfY2gzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcGRydihhZGFwdGVyLCBwYWdlLCAzKSk7Cit9CisKKworLyoqCisgKiBwcm9jX3BkcnYoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBoeXNpY2FsIGRyaXZlcy4KKyAqLworc3RhdGljIGludAorcHJvY19wZHJ2KGFkYXB0ZXJfdCAqYWRhcHRlciwgY2hhciAqcGFnZSwgaW50IGNoYW5uZWwpCit7CisJZG1hX2FkZHJfdAlkbWFfaGFuZGxlOworCWNoYXIJCSpzY3NpX2lucTsKKwlkbWFfYWRkcl90CXNjc2lfaW5xX2RtYV9oYW5kbGU7CisJY2FkZHJfdAkJaW5xdWlyeTsKKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKwl1OAkqcGRydl9zdGF0ZTsKKwl1OAlzdGF0ZTsKKwlpbnQJdGd0OworCWludAltYXhfY2hhbm5lbHM7CisJaW50CWxlbiA9IDA7CisJY2hhcglzdHJbODBdOworCWludAlpOworCisJaWYoIG1ha2VfbG9jYWxfcGRldihhZGFwdGVyLCAmcGRldikgIT0gMCApIHsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggKGlucXVpcnkgPSBtZWdhX2FsbG9jYXRlX2lucXVpcnkoJmRtYV9oYW5kbGUsIHBkZXYpKSA9PSBOVUxMICkgeworCQlnb3RvIGZyZWVfcGRldjsKKwl9CisKKwlpZiggbWVnYV9hZGFwaW5xKGFkYXB0ZXIsIGRtYV9oYW5kbGUpICE9IDAgKSB7CisJCWxlbiA9IHNwcmludGYocGFnZSwgIkFkYXB0ZXIgaW5xdWlyeSBmYWlsZWQuXG4iKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogaW5xdWlyeSBmYWlsZWQuXG4iKTsKKworCQlnb3RvIGZyZWVfaW5xdWlyeTsKKwl9CisKKworCXNjc2lfaW5xID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgMjU2LCAmc2NzaV9pbnFfZG1hX2hhbmRsZSk7CisKKwlpZiggc2NzaV9pbnEgPT0gTlVMTCApIHsKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAibWVtb3J5IG5vdCBhdmFpbGFibGUgZm9yIHNjc2kgaW5xLlxuIik7CisKKwkJZ290byBmcmVlX2lucXVpcnk7CisJfQorCisJaWYoIGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEICkgeworCQlwZHJ2X3N0YXRlID0gKChtZWdhX2lucXVpcnkzICopaW5xdWlyeSktPnBkcnZfc3RhdGU7CisJfQorCWVsc2UgeworCQlwZHJ2X3N0YXRlID0gKChtcmFpZF9leHRfaW5xdWlyeSAqKWlucXVpcnkpLT4KKwkJCXJhaWRfaW5xLnBkcnZfaW5mby5wZHJ2X3N0YXRlOworCX0KKworCW1heF9jaGFubmVscyA9IGFkYXB0ZXItPnByb2R1Y3RfaW5mby5uY2hhbm5lbHM7CisKKwlpZiggY2hhbm5lbCA+PSBtYXhfY2hhbm5lbHMgKSB7CisJCWdvdG8gZnJlZV9wY2k7CisJfQorCisJZm9yKCB0Z3QgPSAwOyB0Z3QgPD0gTUFYX1RBUkdFVDsgdGd0KysgKSB7CisKKwkJaSA9IGNoYW5uZWwqMTYgKyB0Z3Q7CisKKwkJc3RhdGUgPSAqKHBkcnZfc3RhdGUgKyBpKTsKKworCQlzd2l0Y2goIHN0YXRlICYgMHgwRiApIHsKKworCQljYXNlIFBEUlZfT05MSU5FOgorCQkJc3ByaW50ZihzdHIsCisJCQkiQ2hhbm5lbDolMmQgSWQ6JTJkIFN0YXRlOiBPbmxpbmUiLAorCQkJCWNoYW5uZWwsIHRndCk7CisJCQlicmVhazsKKworCQljYXNlIFBEUlZfRkFJTEVEOgorCQkJc3ByaW50ZihzdHIsCisJCQkiQ2hhbm5lbDolMmQgSWQ6JTJkIFN0YXRlOiBGYWlsZWQiLAorCQkJCWNoYW5uZWwsIHRndCk7CisJCQlicmVhazsKKworCQljYXNlIFBEUlZfUkJMRDoKKwkJCXNwcmludGYoc3RyLAorCQkJIkNoYW5uZWw6JTJkIElkOiUyZCBTdGF0ZTogUmVidWlsZCIsCisJCQkJY2hhbm5lbCwgdGd0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUERSVl9IT1RTUEFSRToKKwkJCXNwcmludGYoc3RyLAorCQkJIkNoYW5uZWw6JTJkIElkOiUyZCBTdGF0ZTogSG90IHNwYXJlIiwKKwkJCQljaGFubmVsLCB0Z3QpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYoc3RyLAorCQkJIkNoYW5uZWw6JTJkIElkOiUyZCBTdGF0ZTogVW4tY29uZmlndXJlZCIsCisJCQkJY2hhbm5lbCwgdGd0KTsKKwkJCWJyZWFrOworCisJCX0KKworCQkvKgorCQkgKiBUaGlzIGludGVyZmFjZSBkaXNwbGF5cyBpbnF1aXJpZXMgZm9yIGRpc2sgZHJpdmVzCisJCSAqIG9ubHkuIElucXVyaWVzIGZvciBsb2dpY2FsIGRyaXZlcyBhbmQgbm9uLWRpc2sKKwkJICogZGV2aWNlcyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggL3Byb2Mvc2NzaS9zY3NpCisJCSAqLworCQltZW1zZXQoc2NzaV9pbnEsIDAsIDI1Nik7CisJCWlmKCBtZWdhX2ludGVybmFsX2Rldl9pbnF1aXJ5KGFkYXB0ZXIsIGNoYW5uZWwsIHRndCwKKwkJCQlzY3NpX2lucV9kbWFfaGFuZGxlKSB8fAorCQkJCShzY3NpX2lucVswXSAmIDB4MUYpICE9IFRZUEVfRElTSyApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIG92ZXJmbG93LiBXZSBwcmludCBsZXNzIHRoYW4gMjQwCisJCSAqIGNoYXJhY3RlcnMgZm9yIGlucXVpcnkKKwkJICovCisJCWlmKCAobGVuICsgMjQwKSA+PSBQQUdFX1NJWkUgKSBicmVhazsKKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVzLlxuIiwgc3RyKTsKKworCQlsZW4gKz0gbWVnYV9wcmludF9pbnF1aXJ5KHBhZ2UrbGVuLCBzY3NpX2lucSk7CisJfQorCitmcmVlX3BjaToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIDI1Niwgc2NzaV9pbnEsIHNjc2lfaW5xX2RtYV9oYW5kbGUpOworZnJlZV9pbnF1aXJ5OgorCW1lZ2FfZnJlZV9pbnF1aXJ5KGlucXVpcnksIGRtYV9oYW5kbGUsIHBkZXYpOworZnJlZV9wZGV2OgorCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCXJldHVybiBsZW47Cit9CisKKworLyoKKyAqIERpc3BsYXkgc2NzaSBpbnF1aXJ5CisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfcHJpbnRfaW5xdWlyeShjaGFyICpwYWdlLCBjaGFyICpzY3NpX2lucSkKK3sKKwlpbnQJbGVuID0gMDsKKwlpbnQJaTsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiAgVmVuZG9yOiAiKTsKKwlmb3IoIGkgPSA4OyBpIDwgMTY7IGkrKyApIHsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlYyIsIHNjc2lfaW5xW2ldKTsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgTW9kZWw6ICIpOworCisJZm9yKCBpID0gMTY7IGkgPCAzMjsgaSsrICkgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVjIiwgc2NzaV9pbnFbaV0pOworCX0KKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiICBSZXY6ICIpOworCisJZm9yKCBpID0gMzI7IGkgPCAzNjsgaSsrICkgeworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiVjIiwgc2NzaV9pbnFbaV0pOworCX0KKworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiXG4iKTsKKworCWkgPSBzY3NpX2lucVswXSAmIDB4MWY7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiAgVHlwZTogICAlcyAiLAorCQlpIDwgTUFYX1NDU0lfREVWSUNFX0NPREUgPyBzY3NpX2RldmljZV90eXBlc1tpXSA6CisJCSAgICJVbmtub3duICAgICAgICAgICIpOworCisJbGVuICs9IHNwcmludGYocGFnZStsZW4sCisJIiAgICAgICAgICAgICAgICAgQU5TSSBTQ1NJIHJldmlzaW9uOiAlMDJ4Iiwgc2NzaV9pbnFbMl0gJiAweDA3KTsKKworCWlmKCAoc2NzaV9pbnFbMl0gJiAweDA3KSA9PSAxICYmIChzY3NpX2lucVszXSAmIDB4MGYpID09IDEgKQorCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiBDQ1NcbiIpOworCWVsc2UKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworCisvKioKKyAqIHByb2NfcmRydl8xMCgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSByZWFsIHRpbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZ2ljYWwgZHJpdmVzIDAgdGhyb3VnaCA5LgorICovCitzdGF0aWMgaW50Citwcm9jX3JkcnZfMTAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisJYWRhcHRlcl90ICphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRhdGE7CisKKwkqZW9mID0gMTsKKworCXJldHVybiAocHJvY19yZHJ2KGFkYXB0ZXIsIHBhZ2UsIDAsIDkpKTsKK30KKworCisvKioKKyAqIHByb2NfcmRydl8yMCgpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQHN0YXJ0IC0gd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFnZQorICogQG9mZnNldCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGNvdW50IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAZW9mIC0gc2V0IGlmIG5vIG1vcmUgZGF0YSBuZWVkcyB0byBiZSByZXR1cm5lZAorICogQGRhdGEgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRGlzcGxheSByZWFsIHRpbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZ2ljYWwgZHJpdmVzIDAgdGhyb3VnaCA5LgorICovCitzdGF0aWMgaW50Citwcm9jX3JkcnZfMjAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50ICplb2YsCisJCXZvaWQgKmRhdGEpCit7CisJYWRhcHRlcl90ICphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRhdGE7CisKKwkqZW9mID0gMTsKKworCXJldHVybiAocHJvY19yZHJ2KGFkYXB0ZXIsIHBhZ2UsIDEwLCAxOSkpOworfQorCisKKy8qKgorICogcHJvY19yZHJ2XzMwKCkKKyAqIEBwYWdlIC0gYnVmZmVyIHRvIHdyaXRlIHRoZSBkYXRhIGluCisgKiBAc3RhcnQgLSB3aGVyZSB0aGUgYWN0dWFsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbiBwYWdlCisgKiBAb2Zmc2V0IC0gc2FtZSBtZWFuaW5nIGFzIHRoZSByZWFkIHN5c3RlbSBjYWxsCisgKiBAY291bnQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBlb2YgLSBzZXQgaWYgbm8gbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHJldHVybmVkCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBEaXNwbGF5IHJlYWwgdGltZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9naWNhbCBkcml2ZXMgMCB0aHJvdWdoIDkuCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcmRydl8zMChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGF0YTsKKworCSplb2YgPSAxOworCisJcmV0dXJuIChwcm9jX3JkcnYoYWRhcHRlciwgcGFnZSwgMjAsIDI5KSk7Cit9CisKKworLyoqCisgKiBwcm9jX3JkcnZfNDAoKQorICogQHBhZ2UgLSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgaW4KKyAqIEBzdGFydCAtIHdoZXJlIHRoZSBhY3R1YWwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGluIHBhZ2UKKyAqIEBvZmZzZXQgLSBzYW1lIG1lYW5pbmcgYXMgdGhlIHJlYWQgc3lzdGVtIGNhbGwKKyAqIEBjb3VudCAtIHNhbWUgbWVhbmluZyBhcyB0aGUgcmVhZCBzeXN0ZW0gY2FsbAorICogQGVvZiAtIHNldCBpZiBubyBtb3JlIGRhdGEgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqIEBkYXRhIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIERpc3BsYXkgcmVhbCB0aW1lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2dpY2FsIGRyaXZlcyAwIHRocm91Z2ggOS4KKyAqLworc3RhdGljIGludAorcHJvY19yZHJ2XzQwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludCAqZW9mLAorCQl2b2lkICpkYXRhKQoreworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilkYXRhOworCisJKmVvZiA9IDE7CisKKwlyZXR1cm4gKHByb2NfcmRydihhZGFwdGVyLCBwYWdlLCAzMCwgMzkpKTsKK30KKworCisvKioKKyAqIHByb2NfcmRydigpCisgKiBAcGFnZSAtIGJ1ZmZlciB0byB3cml0ZSB0aGUgZGF0YSBpbgorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAc3RhcnQgLSBzdGFydGluZyBsb2dpY2FsIGRyaXZlIHRvIGRpc3BsYXkKKyAqIEBlbmQgLSBlbmRpbmcgbG9naWNhbCBkcml2ZSB0byBkaXNwbGF5CisgKgorICogV2UgZG8gbm90IHByaW50IHRoZSBpbnF1aXJ5IGluZm9ybWF0aW9uIHNpbmNlIGl0cyBhbHJlYWR5IGF2YWlsYWJsZSB0aHJvdWdoCisgKiAvcHJvYy9zY3NpL3Njc2kgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQKK3Byb2NfcmRydihhZGFwdGVyX3QgKmFkYXB0ZXIsIGNoYXIgKnBhZ2UsIGludCBzdGFydCwgaW50IGVuZCApCit7CisJZG1hX2FkZHJfdAlkbWFfaGFuZGxlOworCWxvZ2Rydl9wYXJhbQkqbHBhcmFtOworCW1lZ2FjbWRfdAltYzsKKwljaGFyCQkqZGlza19hcnJheTsKKwlkbWFfYWRkcl90CWRpc2tfYXJyYXlfZG1hX2hhbmRsZTsKKwljYWRkcl90CQlpbnF1aXJ5OworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCXU4CSpyZHJ2X3N0YXRlOworCWludAludW1fbGRydjsKKwl1MzIJYXJyYXlfc3o7CisJaW50CWxlbiA9IDA7CisJaW50CWk7CisKKwlpZiggbWFrZV9sb2NhbF9wZGV2KGFkYXB0ZXIsICZwZGV2KSAhPSAwICkgeworCQlyZXR1cm4gbGVuOworCX0KKworCWlmKCAoaW5xdWlyeSA9IG1lZ2FfYWxsb2NhdGVfaW5xdWlyeSgmZG1hX2hhbmRsZSwgcGRldikpID09IE5VTEwgKSB7CisJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiggbWVnYV9hZGFwaW5xKGFkYXB0ZXIsIGRtYV9oYW5kbGUpICE9IDAgKSB7CisKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiQWRhcHRlciBpbnF1aXJ5IGZhaWxlZC5cbiIpOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBpbnF1aXJ5IGZhaWxlZC5cbiIpOworCisJCW1lZ2FfZnJlZV9pbnF1aXJ5KGlucXVpcnksIGRtYV9oYW5kbGUsIHBkZXYpOworCisJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQlyZXR1cm4gbGVuOworCX0KKworCW1lbXNldCgmbWMsIDAsIHNpemVvZihtZWdhY21kX3QpKTsKKworCWlmKCBhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCApIHsKKwkJYXJyYXlfc3ogPSBzaXplb2YoZGlza19hcnJheV80MGxkKTsKKworCQlyZHJ2X3N0YXRlID0gKChtZWdhX2lucXVpcnkzICopaW5xdWlyeSktPmxkcnZfc3RhdGU7CisKKwkJbnVtX2xkcnYgPSAoKG1lZ2FfaW5xdWlyeTMgKilpbnF1aXJ5KS0+bnVtX2xkcnY7CisJfQorCWVsc2UgeworCQlhcnJheV9zeiA9IHNpemVvZihkaXNrX2FycmF5XzhsZCk7CisKKwkJcmRydl9zdGF0ZSA9ICgobXJhaWRfZXh0X2lucXVpcnkgKilpbnF1aXJ5KS0+CisJCQlyYWlkX2lucS5sb2dkcnZfaW5mby5sZHJ2X3N0YXRlOworCisJCW51bV9sZHJ2ID0gKChtcmFpZF9leHRfaW5xdWlyeSAqKWlucXVpcnkpLT4KKwkJCXJhaWRfaW5xLmxvZ2Rydl9pbmZvLm51bV9sZHJ2OworCX0KKworCWRpc2tfYXJyYXkgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBhcnJheV9zeiwKKwkJCSZkaXNrX2FycmF5X2RtYV9oYW5kbGUpOworCisJaWYoIGRpc2tfYXJyYXkgPT0gTlVMTCApIHsKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAibWVtb3J5IG5vdCBhdmFpbGFibGUuXG4iKTsKKworCQltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKKworCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwltYy54ZmVyYWRkciA9ICh1MzIpZGlza19hcnJheV9kbWFfaGFuZGxlOworCisJaWYoIGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEICkgeworCQltYy5jbWQgPSBGQ19ORVdfQ09ORklHOworCQltYy5vcGNvZGUgPSBPUF9EQ01EX1JFQURfQ09ORklHOworCisJCWlmKCBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlciwgTE9DS19JTlQsICZtYywgTlVMTCkgKSB7CisKKwkJCWxlbiA9IHNwcmludGYocGFnZSwgIjQwTEQgcmVhZCBjb25maWcgZmFpbGVkLlxuIik7CisKKwkJCW1lZ2FfZnJlZV9pbnF1aXJ5KGlucXVpcnksIGRtYV9oYW5kbGUsIHBkZXYpOworCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIGFycmF5X3N6LCBkaXNrX2FycmF5LAorCQkJCQlkaXNrX2FycmF5X2RtYV9oYW5kbGUpOworCisJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJCXJldHVybiBsZW47CisJCX0KKworCX0KKwllbHNlIHsKKwkJbWMuY21kID0gTkVXX1JFQURfQ09ORklHXzhMRDsKKworCQlpZiggbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXIsIExPQ0tfSU5ULCAmbWMsIE5VTEwpICkgeworCisJCQltYy5jbWQgPSBSRUFEX0NPTkZJR184TEQ7CisKKwkJCWlmKCBtZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlciwgTE9DS19JTlQsICZtYywKKwkJCQkJCU5VTEwpICl7CisKKwkJCQlsZW4gPSBzcHJpbnRmKHBhZ2UsCisJCQkJCSI4TEQgcmVhZCBjb25maWcgZmFpbGVkLlxuIik7CisKKwkJCQltZWdhX2ZyZWVfaW5xdWlyeShpbnF1aXJ5LCBkbWFfaGFuZGxlLCBwZGV2KTsKKworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgYXJyYXlfc3osCisJCQkJCQlkaXNrX2FycmF5LAorCQkJCQkJZGlza19hcnJheV9kbWFfaGFuZGxlKTsKKworCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkJCXJldHVybiBsZW47CisJCQl9CisJCX0KKwl9CisKKwlmb3IoIGkgPSBzdGFydDsgaSA8ICggKGVuZCsxIDwgbnVtX2xkcnYpID8gZW5kKzEgOiBudW1fbGRydiApOyBpKysgKSB7CisKKwkJaWYoIGFkYXB0ZXItPmZsYWcgJiBCT0FSRF80MExEICkgeworCQkJbHBhcmFtID0KKwkJCSYoKGRpc2tfYXJyYXlfNDBsZCAqKWRpc2tfYXJyYXkpLT5sZHJ2W2ldLmxwYXJhbTsKKwkJfQorCQllbHNlIHsKKwkJCWxwYXJhbSA9CisJCQkmKChkaXNrX2FycmF5XzhsZCAqKWRpc2tfYXJyYXkpLT5sZHJ2W2ldLmxwYXJhbTsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIGZvciBvdmVyZmxvdy4gV2UgcHJpbnQgbGVzcyB0aGFuIDI0MCBjaGFyYWN0ZXJzIGZvcgorCQkgKiBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGxvZ2ljYWwgZHJpdmUuCisJCSAqLworCQlpZiggKGxlbiArIDI0MCkgPj0gUEFHRV9TSVpFICkgYnJlYWs7CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJMb2dpY2FsIGRyaXZlOiUyZDosICIsIGkpOworCisJCXN3aXRjaCggcmRydl9zdGF0ZVtpXSAmIDB4MEYgKSB7CisJCWNhc2UgUkRSVl9PRkZMSU5FOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdGF0ZTogb2ZmbGluZSIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRFJWX0RFR1JBREVEOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdGF0ZTogZGVncmFkZWQiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkRSVl9PUFRJTUFMOgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdGF0ZTogb3B0aW1hbCIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRFJWX0RFTEVURUQ6CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgInN0YXRlOiBkZWxldGVkIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJzdGF0ZTogdW5rbm93biIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBpZiBjaGVjayBjb25zaXN0ZW5jeSBvciBpbml0aWFsaXphdGlvbiBpcyBnb2luZyBvbgorCQkgKiBmb3IgdGhpcyBsb2dpY2FsIGRyaXZlLgorCQkgKi8KKwkJaWYoIChyZHJ2X3N0YXRlW2ldICYgMHhGMCkgPT0gMHgyMCApIHsKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJCQkiLCBjaGVjay1jb25zaXN0ZW5jeSBpbiBwcm9ncmVzcyIpOworCQl9CisJCWVsc2UgaWYoIChyZHJ2X3N0YXRlW2ldICYgMHhGMCkgPT0gMHgxMCApIHsKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLAorCQkJCQkiLCBpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcyIpOworCQl9CisJCQorCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlxuIik7CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJTcGFuIGRlcHRoOiUzZCwgIiwKKwkJCQlscGFyYW0tPnNwYW5fZGVwdGgpOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiUkFJRCBsZXZlbDolM2QsICIsCisJCQkJbHBhcmFtLT5sZXZlbCk7CisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJTdHJpcGUgc2l6ZTolM2QsICIsCisJCQkJbHBhcmFtLT5zdHJpcGVfc3ogPyBscGFyYW0tPnN0cmlwZV9zei8yOiAxMjgpOworCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiUm93IHNpemU6JTNkXG4iLAorCQkJCWxwYXJhbS0+cm93X3NpemUpOworCisKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJSZWFkIFBvbGljeTogIik7CisKKwkJc3dpdGNoKGxwYXJhbS0+cmVhZF9haGVhZCkgeworCisJCWNhc2UgTk9fUkVBRF9BSEVBRDoKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiTm8gcmVhZCBhaGVhZCwgIik7CisJCQlicmVhazsKKworCQljYXNlIFJFQURfQUhFQUQ6CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIlJlYWQgYWhlYWQsICIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBREFQX1JFQURfQUhFQUQ6CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkFkYXB0aXZlLCAiKTsKKwkJCWJyZWFrOworCisJCX0KKworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIldyaXRlIFBvbGljeTogIik7CisKKwkJc3dpdGNoKGxwYXJhbS0+d3JpdGVfbW9kZSkgeworCisJCWNhc2UgV1JNT0RFX1dSSVRFX1RIUlU6CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIldyaXRlIHRocnUsICIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXUk1PREVfV1JJVEVfQkFDSzoKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiV3JpdGUgYmFjaywgIik7CisJCQlicmVhazsKKwkJfQorCisJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiQ2FjaGUgUG9saWN5OiAiKTsKKworCQlzd2l0Y2gobHBhcmFtLT5kaXJlY3RfaW8pIHsKKworCQljYXNlIENBQ0hFRF9JTzoKKwkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiQ2FjaGVkIElPXG5cbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBESVJFQ1RfSU86CisJCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIkRpcmVjdCBJT1xuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbWVnYV9mcmVlX2lucXVpcnkoaW5xdWlyeSwgZG1hX2hhbmRsZSwgcGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIGFycmF5X3N6LCBkaXNrX2FycmF5LAorCQkJZGlza19hcnJheV9kbWFfaGFuZGxlKTsKKworCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCXJldHVybiBsZW47Cit9CisKKyNlbmRpZgorCisKKy8qKgorICogbWVnYXJhaWRfYmlvc3BhcmFtKCkKKyAqCisgKiBSZXR1cm4gdGhlIGRpc2sgZ2VvbWV0cnkgZm9yIGEgcGFydGljdWxhciBkaXNrCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisJdW5zaWduZWQgY2hhcgkqYmg7CisJaW50CWhlYWRzOworCWludAlzZWN0b3JzOworCWludAljeWxpbmRlcnM7CisJaW50CXJ2YWw7CisKKwkvKiBHZXQgcG9pbnRlciB0byBob3N0IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKwlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKElTX1JBSURfQ0goYWRhcHRlciwgc2Rldi0+Y2hhbm5lbCkpIHsKKwkJCS8qIERlZmF1bHQgaGVhZHMgKDY0KSAmIHNlY3RvcnMgKDMyKSAqLworCQkJaGVhZHMgPSA2NDsKKwkJCXNlY3RvcnMgPSAzMjsKKwkJCWN5bGluZGVycyA9ICh1bG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCisJCQkvKgorCQkJICogSGFuZGxlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIHNpemUgZm9yIGxvZ2ljYWwgZHJpdmVzCisJCQkgKiA+IDFHYgorCQkJICovCisJCQlpZiAoKHVsb25nKWNhcGFjaXR5ID49IDB4MjAwMDAwKSB7CisJCQkJaGVhZHMgPSAyNTU7CisJCQkJc2VjdG9ycyA9IDYzOworCQkJCWN5bGluZGVycyA9ICh1bG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCQkJfQorCisJCQkvKiByZXR1cm4gcmVzdWx0ICovCisJCQlnZW9tWzBdID0gaGVhZHM7CisJCQlnZW9tWzFdID0gc2VjdG9yczsKKwkJCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJfQorCWVsc2UgeworCQliaCA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7CisKKwkJaWYoIGJoICkgeworCQkJcnZhbCA9IHNjc2lfcGFydHNpemUoYmgsIGNhcGFjaXR5LAorCQkJCQkgICAgJmdlb21bMl0sICZnZW9tWzBdLCAmZ2VvbVsxXSk7CisJCQlrZnJlZShiaCk7CisJCQlpZiggcnZhbCAhPSAtMSApCisJCQkJcmV0dXJuIHJ2YWw7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPCisJCSJtZWdhcmFpZDogaW52YWxpZCBwYXJ0aXRpb24gb24gdGhpcyBkaXNrIG9uIGNoYW5uZWwgJWRcbiIsCisJCQkJc2Rldi0+Y2hhbm5lbCk7CisKKwkJLyogRGVmYXVsdCBoZWFkcyAoNjQpICYgc2VjdG9ycyAoMzIpICovCisJCWhlYWRzID0gNjQ7CisJCXNlY3RvcnMgPSAzMjsKKwkJY3lsaW5kZXJzID0gKHVsb25nKWNhcGFjaXR5IC8gKGhlYWRzICogc2VjdG9ycyk7CisKKwkJLyogSGFuZGxlIGV4dGVuZGVkIHRyYW5zbGF0aW9uIHNpemUgZm9yIGxvZ2ljYWwgZHJpdmVzID4gMUdiICovCisJCWlmICgodWxvbmcpY2FwYWNpdHkgPj0gMHgyMDAwMDApIHsKKwkJCWhlYWRzID0gMjU1OworCQkJc2VjdG9ycyA9IDYzOworCQkJY3lsaW5kZXJzID0gKHVsb25nKWNhcGFjaXR5IC8gKGhlYWRzICogc2VjdG9ycyk7CisJCX0KKworCQkvKiByZXR1cm4gcmVzdWx0ICovCisJCWdlb21bMF0gPSBoZWFkczsKKwkJZ2VvbVsxXSA9IHNlY3RvcnM7CisJCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVnYV9pbml0X3NjYigpCisgKiBAYWRhcHRlciAtIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB2YXJpb3VzIHBvaW50ZXJzIGluIHRoZSBzY2Igc3RydWN0dXJlczoKKyAqIHNjYXR0ZXItZ2F0aGVyIGxpc3QgcG9pbnRlciwgcGFzc3RocnUgYW5kIGV4dGVuZGVkIHBhc3N0aHJ1IHN0cnVjdHVyZQorICogcG9pbnRlcnMuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfaW5pdF9zY2IoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXNjYl90CSpzY2I7CisJaW50CWk7CisKKwlmb3IoIGkgPSAwOyBpIDwgYWRhcHRlci0+bWF4X2NtZHM7IGkrKyApIHsKKworCQlzY2IgPSAmYWRhcHRlci0+c2NiX2xpc3RbaV07CisKKwkJc2NiLT5zZ2w2NCA9IE5VTEw7CisJCXNjYi0+c2dsID0gTlVMTDsKKwkJc2NiLT5wdGhydSA9IE5VTEw7CisJCXNjYi0+ZXB0aHJ1ID0gTlVMTDsKKwl9CisKKwlmb3IoIGkgPSAwOyBpIDwgYWRhcHRlci0+bWF4X2NtZHM7IGkrKyApIHsKKworCQlzY2IgPSAmYWRhcHRlci0+c2NiX2xpc3RbaV07CisKKwkJc2NiLT5pZHggPSBpOworCisJCXNjYi0+c2dsNjQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJc2l6ZW9mKG1lZ2Ffc2dsNjQpICogYWRhcHRlci0+c2dsZW4sCisJCQkJJnNjYi0+c2dsX2RtYV9hZGRyKTsKKworCQlzY2ItPnNnbCA9IChtZWdhX3NnbGlzdCAqKXNjYi0+c2dsNjQ7CisKKwkJaWYoICFzY2ItPnNnbCApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJBSUQ6IENhbid0IGFsbG9jYXRlIHNnbGlzdC5cbiIpOworCQkJbWVnYV9mcmVlX3NnbChhZGFwdGVyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNjYi0+cHRocnUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsCisJCQkJc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLAorCQkJCSZzY2ItPnB0aHJ1X2RtYV9hZGRyKTsKKworCQlpZiggIXNjYi0+cHRocnUgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSQUlEOiBDYW4ndCBhbGxvY2F0ZSBwYXNzdGhydS5cbiIpOworCQkJbWVnYV9mcmVlX3NnbChhZGFwdGVyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNjYi0+ZXB0aHJ1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LAorCQkJCXNpemVvZihtZWdhX2V4dF9wYXNzdGhydSksCisJCQkJJnNjYi0+ZXB0aHJ1X2RtYV9hZGRyKTsKKworCQlpZiggIXNjYi0+ZXB0aHJ1ICkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJDYW4ndCBhbGxvY2F0ZSBleHRlbmRlZCBwYXNzdGhydS5cbiIpOworCQkJbWVnYV9mcmVlX3NnbChhZGFwdGVyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJc2NiLT5kbWFfdHlwZSA9IE1FR0FfRE1BX1RZUEVfTk9ORTsKKworCQkvKgorCQkgKiBMaW5rIHRvIGZyZWUgbGlzdAorCQkgKiBsb2NrIG5vdCByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgbG9hZGluZyB0aGUgZHJpdmVyLCBzbyBubworCQkgKiBjb21tYW5kcyBwb3NzaWJsZSByaWdodCBub3cuCisJCSAqLworCQlzY2ItPnN0YXRlID0gU0NCX0ZSRUU7CisJCXNjYi0+Y21kID0gTlVMTDsKKwkJbGlzdF9hZGQoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPmZyZWVfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBtZWdhZGV2X29wZW4oKQorICogQGlub2RlIC0gdW51c2VkCisgKiBAZmlsZXAgLSB1bnVzZWQKKyAqCisgKiBSb3V0aW5lcyBmb3IgdGhlIGNoYXJhY3Rlci9pb2N0bCBpbnRlcmZhY2UgdG8gdGhlIGRyaXZlci4gRmluZCBvdXQgaWYgdGhpcworICogaXMgYSB2YWxpZCBvcGVuLiBJZiB5ZXMsIGluY3JlbWVudCB0aGUgbW9kdWxlIHVzZSBjb3VudCBzbyB0aGF0IGl0IGNhbm5vdAorICogYmUgdW5sb2FkZWQuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FkZXZfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCS8qCisJICogT25seSBhbGxvdyBzdXBlcnVzZXIgdG8gYWNjZXNzIHByaXZhdGUgaW9jdGwgaW50ZXJmYWNlCisJICovCisJaWYoICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkgcmV0dXJuIC1FQUNDRVM7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG1lZ2FkZXZfaW9jdGwoKQorICogQGlub2RlIC0gT3VyIGRldmljZSBpbm9kZQorICogQGZpbGVwIC0gdW51c2VkCisgKiBAY21kIC0gaW9jdGwgY29tbWFuZAorICogQGFyZyAtIHVzZXIgYnVmZmVyCisgKgorICogaW9jdGwgZW50cnkgcG9pbnQgZm9yIG91ciBwcml2YXRlIGlvY3RsIGludGVyZmFjZS4gV2UgbW92ZSB0aGUgZGF0YSBpbiBmcm9tCisgKiB0aGUgdXNlciBzcGFjZSwgcHJlcGFyZSB0aGUgY29tbWFuZCAoaWYgbmVjZXNzYXJ5LCBjb252ZXJ0IHRoZSBvbGQgTUlNRAorICogaW9jdGwgdG8gbmV3IGlvY3RsIGNvbW1hbmQpLCBhbmQgaXNzdWUgYSBzeW5jaHJvbm91cyBjb21tYW5kIHRvIHRoZQorICogY29udHJvbGxlci4KKyAqLworc3RhdGljIGludAorbWVnYWRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlcjsKKwluaXRpb2N0bF90CXVpb2M7CisJaW50CQlhZGFwbm87CisJaW50CQlydmFsOworCW1lZ2FfcGFzc3RocnUJX191c2VyICp1cHRocnU7CS8qIHVzZXIgYWRkcmVzcyBmb3IgcGFzc3RocnUgKi8KKwltZWdhX3Bhc3N0aHJ1CSpwdGhydTsJCS8qIGNvcHkgdXNlciBwYXNzdGhydSBoZXJlICovCisJZG1hX2FkZHJfdAlwdGhydV9kbWFfaG5kbDsKKwl2b2lkCQkqZGF0YSA9IE5VTEw7CS8qIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgKi8KKwlkbWFfYWRkcl90CWRhdGFfZG1hX2huZGw7CS8qIGRtYSBoYW5kbGUgZm9yIGRhdGEgeGZlciBhcmVhICovCisJbWVnYWNtZF90CW1jOworCW1lZ2FzdGF0X3QJX191c2VyICp1c3RhdHM7CisJaW50CQludW1fbGRydjsKKwl1MzIJCXV4ZmVyYWRkciA9IDA7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisKKwl1c3RhdHMgPSBOVUxMOyAvKiBhdm9pZCBjb21waWxhdGlvbiB3YXJuaW5ncyAqLworCW51bV9sZHJ2ID0gMDsKKworCS8qCisJICogTWFrZSBzdXJlIG9ubHkgVVNDU0lDTUQgYXJlIGlzc3VlZCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgorCSAqIE1JTUQgYXBwbGljYXRpb24gd291bGQgc3RpbGwgZmlyZSBkaWZmZXJlbnQgY29tbWFuZC4KKwkgKi8KKwlpZiggKF9JT0NfVFlQRShjbWQpICE9IE1FR0FJT0NfTUFHSUMpICYmIChjbWQgIT0gVVNDU0lDTUQpICkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFuZCBjb252ZXJ0IGEgcG9zc2libGUgTUlNRCBjb21tYW5kIHRvIE5JVCBjb21tYW5kLgorCSAqIG1lZ2FfbV90b19uKCkgY29waWVzIHRoZSBkYXRhIGZyb20gdGhlIHVzZXIgc3BhY2UsIHNvIHdlIGRvIG5vdAorCSAqIGhhdmUgdG8gZG8gaXQgaGVyZS4KKwkgKiBOT1RFOiBXZSB3aWxsIG5lZWQgc29tZSB1c2VyIGFkZHJlc3MgdG8gY29weW91dCB0aGUgZGF0YSwgdGhlcmVmb3JlCisJICogdGhlIGludGVmYWNlIGxheWVyIHdpbGwgYWxzbyBwcm92aWRlIHVzIHdpdGggdGhlIHJlcXVpcmVkIHVzZXIKKwkgKiBhZGRyZXNzZXMuCisJICovCisJbWVtc2V0KCZ1aW9jLCAwLCBzaXplb2Yobml0aW9jdGxfdCkpOworCWlmKCAocnZhbCA9IG1lZ2FfbV90b19uKCAodm9pZCBfX3VzZXIgKilhcmcsICZ1aW9jKSkgIT0gMCApCisJCXJldHVybiBydmFsOworCisKKwlzd2l0Y2goIHVpb2Mub3Bjb2RlICkgeworCisJY2FzZSBHRVRfRFJJVkVSX1ZFUjoKKwkJaWYoIHB1dF91c2VyKGRyaXZlcl92ZXIsICh1MzIgX191c2VyICopdWlvYy51aW9jX3VhZGRyKSApCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCisJCWJyZWFrOworCisJY2FzZSBHRVRfTl9BREFQOgorCQlpZiggcHV0X3VzZXIoaGJhX2NvdW50LCAodTMyIF9fdXNlciAqKXVpb2MudWlvY191YWRkcikgKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQkvKgorCQkgKiBTaHVja3MuIE1JTUQgaW50ZXJmYWNlIHJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSBmb3IgbnVtYmVyCisJCSAqIG9mIGFkYXB0ZXJzLiBUT0RPOiBDaGFuZ2UgaXQgdG8gcmV0dXJuIDAgd2hlbiB0aGVyZSBpcyBubworCQkgKiBhcHBsaWNhdGlvIHVzaW5nIG1pbWQgaW50ZXJmYWNlLgorCQkgKi8KKwkJcmV0dXJuIGhiYV9jb3VudDsKKworCWNhc2UgR0VUX0FEQVBfSU5GTzoKKworCQkvKgorCQkgKiBXaGljaCBhZGFwdGVyCisJCSAqLworCQlpZiggKGFkYXBubyA9IEdFVEFEQVAodWlvYy5hZGFwbm8pKSA+PSBoYmFfY291bnQgKQorCQkJcmV0dXJuICgtRU5PREVWKTsKKworCQlpZiggY29weV90b191c2VyKHVpb2MudWlvY191YWRkciwgbWNvbnRyb2xsZXIrYWRhcG5vLAorCQkJCXNpemVvZihzdHJ1Y3QgbWNvbnRyb2xsZXIpKSApCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQlicmVhazsKKworI2lmIE1FR0FfSEFWRV9TVEFUUworCisJY2FzZSBHRVRfU1RBVFM6CisJCS8qCisJCSAqIFdoaWNoIGFkYXB0ZXIKKwkJICovCisJCWlmKCAoYWRhcG5vID0gR0VUQURBUCh1aW9jLmFkYXBubykpID49IGhiYV9jb3VudCApCisJCQlyZXR1cm4gKC1FTk9ERVYpOworCisJCWFkYXB0ZXIgPSBoYmFfc29mdF9zdGF0ZVthZGFwbm9dOworCisJCXVzdGF0cyA9IHVpb2MudWlvY191YWRkcjsKKworCQlpZiggY29weV9mcm9tX3VzZXIoJm51bV9sZHJ2LCAmdXN0YXRzLT5udW1fbGRydiwgc2l6ZW9mKGludCkpICkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgbG9naWNhbCBkcml2ZSBudW1iZXIKKwkJICovCisJCWlmKCBudW1fbGRydiA+PSBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRCApIHJldHVybiAtRUlOVkFMOworCisJCWlmKCBjb3B5X3RvX3VzZXIodXN0YXRzLT5ucmVhZHMsIGFkYXB0ZXItPm5yZWFkcywKKwkJCQkJbnVtX2xkcnYqc2l6ZW9mKHUzMikpICkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmKCBjb3B5X3RvX3VzZXIodXN0YXRzLT5ucmVhZGJsb2NrcywgYWRhcHRlci0+bnJlYWRibG9ja3MsCisJCQkJCW51bV9sZHJ2KnNpemVvZih1MzIpKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiggY29weV90b191c2VyKHVzdGF0cy0+bndyaXRlcywgYWRhcHRlci0+bndyaXRlcywKKwkJCQkJbnVtX2xkcnYqc2l6ZW9mKHUzMikpICkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmKCBjb3B5X3RvX3VzZXIodXN0YXRzLT5ud3JpdGVibG9ja3MsIGFkYXB0ZXItPm53cml0ZWJsb2NrcywKKwkJCQkJbnVtX2xkcnYqc2l6ZW9mKHUzMikpICkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmKCBjb3B5X3RvX3VzZXIodXN0YXRzLT5yZF9lcnJvcnMsIGFkYXB0ZXItPnJkX2Vycm9ycywKKwkJCQkJbnVtX2xkcnYqc2l6ZW9mKHUzMikpICkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmKCBjb3B5X3RvX3VzZXIodXN0YXRzLT53cl9lcnJvcnMsIGFkYXB0ZXItPndyX2Vycm9ycywKKwkJCQkJbnVtX2xkcnYqc2l6ZW9mKHUzMikpICkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCisjZW5kaWYKKwljYXNlIE1CT1hfQ01EOgorCisJCS8qCisJCSAqIFdoaWNoIGFkYXB0ZXIKKwkJICovCisJCWlmKCAoYWRhcG5vID0gR0VUQURBUCh1aW9jLmFkYXBubykpID49IGhiYV9jb3VudCApCisJCQlyZXR1cm4gKC1FTk9ERVYpOworCisJCWFkYXB0ZXIgPSBoYmFfc29mdF9zdGF0ZVthZGFwbm9dOworCisJCS8qCisJCSAqIERlbGV0aW9uIG9mIGxvZ2ljYWwgZHJpdmUgaXMgYSBzcGVjaWFsIGNhc2UuIFRoZSBhZGFwdGVyCisJCSAqIHNob3VsZCBiZSBxdWllc2NlbnQgYmVmb3JlIHRoaXMgY29tbWFuZCBpcyBpc3N1ZWQuCisJCSAqLworCQlpZiggdWlvYy51aW9jX3JtYm94WzBdID09IEZDX0RFTF9MT0dEUlYgJiYKKwkJCQl1aW9jLnVpb2Nfcm1ib3hbMl0gPT0gT1BfREVMX0xPR0RSViApIHsKKworCQkJLyoKKwkJCSAqIERvIHdlIHN1cHBvcnQgdGhpcyBmZWF0dXJlCisJCQkgKi8KKwkJCWlmKCAhYWRhcHRlci0+c3VwcG9ydF9yYW5kb21fZGVsICkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBsb2dkcnYgIik7CisJCQkJcHJpbnRrKCJkZWxldGUgb24gbm9uLXN1cHBvcnRpbmcgRi9XLlxuIik7CisKKwkJCQlyZXR1cm4gKC1FSU5WQUwpOworCQkJfQorCisJCQlydmFsID0gbWVnYV9kZWxfbG9nZHJ2KCBhZGFwdGVyLCB1aW9jLnVpb2Nfcm1ib3hbM10gKTsKKworCQkJaWYoIHJ2YWwgPT0gMCApIHsKKwkJCQltZW1zZXQoJm1jLCAwLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwkJCQltYy5zdGF0dXMgPSBydmFsOworCisJCQkJcnZhbCA9IG1lZ2Ffbl90b19tKCh2b2lkIF9fdXNlciAqKWFyZywgJm1jKTsKKwkJCX0KKworCQkJcmV0dXJuIHJ2YWw7CisJCX0KKwkJLyoKKwkJICogVGhpcyBpbnRlcmZhY2Ugb25seSBzdXBwb3J0IHRoZSByZWd1bGFyIHBhc3N0aHJ1IGNvbW1hbmRzLgorCQkgKiBSZWplY3QgZXh0ZW5kZWQgcGFzc3RocnUgYW5kIDY0LWJpdCBwYXNzdGhydQorCQkgKi8KKwkJaWYoIHVpb2MudWlvY19ybWJveFswXSA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlU2NCB8fAorCQkJdWlvYy51aW9jX3JtYm94WzBdID09IE1FR0FfTUJPWENNRF9FWFRQVEhSVSApIHsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IHJlamVjdGVkIHBhc3N0aHJ1LlxuIik7CisKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJCX0KKworCQkvKgorCQkgKiBGb3IgYWxsIGludGVybmFsIGNvbW1hbmRzLCB0aGUgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGluCisJCSAqIDw0R0IgYWRkcmVzcyByYW5nZQorCQkgKi8KKwkJaWYoIG1ha2VfbG9jYWxfcGRldihhZGFwdGVyLCAmcGRldikgIT0gMCApCisJCQlyZXR1cm4gLUVJTzsKKworCQkvKiBJcyBpdCBhIHBhc3N0aHJ1IGNvbW1hbmQgb3IgYSBEQ01EICovCisJCWlmKCB1aW9jLnVpb2Nfcm1ib3hbMF0gPT0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVICkgeworCQkJLyogUGFzc3RocnUgY29tbWFuZHMgKi8KKworCQkJcHRocnUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCQlzaXplb2YobWVnYV9wYXNzdGhydSksCisJCQkJCSZwdGhydV9kbWFfaG5kbCk7CisKKwkJCWlmKCBwdGhydSA9PSBOVUxMICkgeworCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKwkJCQlyZXR1cm4gKC1FTk9NRU0pOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIHVzZXIgcGFzc3RocnUgc3RydWN0dXJlCisJCQkgKi8KKwkJCXVwdGhydSA9IChtZWdhX3Bhc3N0aHJ1IF9fdXNlciAqKU1CT1godWlvYyktPnhmZXJhZGRyOworCisJCQkvKgorCQkJICogQ29weSBpbiB0aGUgdXNlciBwYXNzdGhydSBoZXJlLgorCQkJICovCisJCQlpZiggY29weV9mcm9tX3VzZXIocHRocnUsIHVwdGhydSwKKwkJCQkJCXNpemVvZihtZWdhX3Bhc3N0aHJ1KSkgKSB7CisKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsCisJCQkJCQlzaXplb2YobWVnYV9wYXNzdGhydSksIHB0aHJ1LAorCQkJCQkJcHRocnVfZG1hX2huZGwpOworCisJCQkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElzIHRoZXJlIGEgZGF0YSB0cmFuc2ZlcgorCQkJICovCisJCQlpZiggcHRocnUtPmRhdGF4ZmVybGVuICkgeworCQkJCWRhdGEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCQkJcHRocnUtPmRhdGF4ZmVybGVuLAorCQkJCQkJJmRhdGFfZG1hX2huZGwpOworCisJCQkJaWYoIGRhdGEgPT0gTlVMTCApIHsKKwkJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJCXNpemVvZihtZWdhX3Bhc3N0aHJ1KSwKKwkJCQkJCQlwdGhydSwKKwkJCQkJCQlwdGhydV9kbWFfaG5kbCk7CisKKwkJCQkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCQkJCXJldHVybiAoLUVOT01FTSk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBTYXZlIHRoZSB1c2VyIGFkZHJlc3MgYW5kIHBvaW50IHRoZSBrZXJuZWwKKwkJCQkgKiBhZGRyZXNzIGF0IGp1c3QgYWxsb2NhdGVkIG1lbW9yeQorCQkJCSAqLworCQkJCXV4ZmVyYWRkciA9IHB0aHJ1LT5kYXRheGZlcmFkZHI7CisJCQkJcHRocnUtPmRhdGF4ZmVyYWRkciA9IGRhdGFfZG1hX2huZGw7CisJCQl9CisKKworCQkJLyoKKwkJCSAqIElzIGRhdGEgY29taW5nIGRvd24tc3RyZWFtCisJCQkgKi8KKwkJCWlmKCBwdGhydS0+ZGF0YXhmZXJsZW4gJiYgKHVpb2MuZmxhZ3MgJiBVSU9DX1dSKSApIHsKKwkJCQkvKgorCQkJCSAqIEdldCB0aGUgdXNlciBkYXRhCisJCQkJICovCisJCQkJaWYoIGNvcHlfZnJvbV91c2VyKGRhdGEsIChjaGFyIF9fdXNlciAqKXV4ZmVyYWRkciwKKwkJCQkJCQlwdGhydS0+ZGF0YXhmZXJsZW4pICkgeworCQkJCQlydmFsID0gKC1FRkFVTFQpOworCQkJCQlnb3RvIGZyZWVtZW1fYW5kX3JldHVybjsKKwkJCQl9CisJCQl9CisKKwkJCW1lbXNldCgmbWMsIDAsIHNpemVvZihtZWdhY21kX3QpKTsKKworCQkJbWMuY21kID0gTUVHQV9NQk9YQ01EX1BBU1NUSFJVOworCQkJbWMueGZlcmFkZHIgPSAodTMyKXB0aHJ1X2RtYV9obmRsOworCisJCQkvKgorCQkJICogSXNzdWUgdGhlIGNvbW1hbmQKKwkJCSAqLworCQkJbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXIsIExPQ0tfSU5ULCAmbWMsIHB0aHJ1KTsKKworCQkJcnZhbCA9IG1lZ2Ffbl90b19tKCh2b2lkIF9fdXNlciAqKWFyZywgJm1jKTsKKworCQkJaWYoIHJ2YWwgKSBnb3RvIGZyZWVtZW1fYW5kX3JldHVybjsKKworCisJCQkvKgorCQkJICogSXMgZGF0YSBnb2luZyB1cC1zdHJlYW0KKwkJCSAqLworCQkJaWYoIHB0aHJ1LT5kYXRheGZlcmxlbiAmJiAodWlvYy5mbGFncyAmIFVJT0NfUkQpICkgeworCQkJCWlmKCBjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopdXhmZXJhZGRyLCBkYXRhLAorCQkJCQkJCXB0aHJ1LT5kYXRheGZlcmxlbikgKSB7CisJCQkJCXJ2YWwgPSAoLUVGQVVMVCk7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogU2VuZCB0aGUgcmVxdWVzdCBzZW5zZSBkYXRhIGFsc28sIGlycmVzcGVjdGl2ZSBvZgorCQkJICogd2hldGhlciB0aGUgdXNlciBoYXMgYXNrZWQgZm9yIGl0IG9yIG5vdC4KKwkJCSAqLworCQkJY29weV90b191c2VyKHVwdGhydS0+cmVxc2Vuc2VhcmVhLAorCQkJCQlwdGhydS0+cmVxc2Vuc2VhcmVhLCAxNCk7CisKK2ZyZWVtZW1fYW5kX3JldHVybjoKKwkJCWlmKCBwdGhydS0+ZGF0YXhmZXJsZW4gKSB7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJcHRocnUtPmRhdGF4ZmVybGVuLCBkYXRhLAorCQkJCQkJZGF0YV9kbWFfaG5kbCk7CisJCQl9CisKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLAorCQkJCQlwdGhydSwgcHRocnVfZG1hX2huZGwpOworCisJCQlmcmVlX2xvY2FsX3BkZXYocGRldik7CisKKwkJCXJldHVybiBydmFsOworCQl9CisJCWVsc2UgeworCQkJLyogRENNRCBjb21tYW5kcyAqLworCisJCQkvKgorCQkJICogSXMgdGhlcmUgYSBkYXRhIHRyYW5zZmVyCisJCQkgKi8KKwkJCWlmKCB1aW9jLnhmZXJsZW4gKSB7CisJCQkJZGF0YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCQl1aW9jLnhmZXJsZW4sICZkYXRhX2RtYV9obmRsKTsKKworCQkJCWlmKCBkYXRhID09IE5VTEwgKSB7CisJCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKwkJCQkJcmV0dXJuICgtRU5PTUVNKTsKKwkJCQl9CisKKwkJCQl1eGZlcmFkZHIgPSBNQk9YKHVpb2MpLT54ZmVyYWRkcjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElzIGRhdGEgY29taW5nIGRvd24tc3RyZWFtCisJCQkgKi8KKwkJCWlmKCB1aW9jLnhmZXJsZW4gJiYgKHVpb2MuZmxhZ3MgJiBVSU9DX1dSKSApIHsKKwkJCQkvKgorCQkJCSAqIEdldCB0aGUgdXNlciBkYXRhCisJCQkJICovCisJCQkJaWYoIGNvcHlfZnJvbV91c2VyKGRhdGEsIChjaGFyIF9fdXNlciAqKXV4ZmVyYWRkciwKKwkJCQkJCQl1aW9jLnhmZXJsZW4pICkgeworCisJCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCQl1aW9jLnhmZXJsZW4sCisJCQkJCQkJZGF0YSwgZGF0YV9kbWFfaG5kbCk7CisKKwkJCQkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJCQkJCXJldHVybiAoLUVGQVVMVCk7CisJCQkJfQorCQkJfQorCisJCQltZW1jcHkoJm1jLCBNQk9YKHVpb2MpLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwkJCW1jLnhmZXJhZGRyID0gKHUzMilkYXRhX2RtYV9obmRsOworCisJCQkvKgorCQkJICogSXNzdWUgdGhlIGNvbW1hbmQKKwkJCSAqLworCQkJbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXIsIExPQ0tfSU5ULCAmbWMsIE5VTEwpOworCisJCQlydmFsID0gbWVnYV9uX3RvX20oKHZvaWQgX191c2VyICopYXJnLCAmbWMpOworCisJCQlpZiggcnZhbCApIHsKKwkJCQlpZiggdWlvYy54ZmVybGVuICkgeworCQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsCisJCQkJCQkJdWlvYy54ZmVybGVuLCBkYXRhLAorCQkJCQkJCWRhdGFfZG1hX2huZGwpOworCQkJCX0KKworCQkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkJCXJldHVybiBydmFsOworCQkJfQorCisJCQkvKgorCQkJICogSXMgZGF0YSBnb2luZyB1cC1zdHJlYW0KKwkJCSAqLworCQkJaWYoIHVpb2MueGZlcmxlbiAmJiAodWlvYy5mbGFncyAmIFVJT0NfUkQpICkgeworCQkJCWlmKCBjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopdXhmZXJhZGRyLCBkYXRhLAorCQkJCQkJCXVpb2MueGZlcmxlbikgKSB7CisKKwkJCQkJcnZhbCA9ICgtRUZBVUxUKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCB1aW9jLnhmZXJsZW4gKSB7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJdWlvYy54ZmVybGVuLCBkYXRhLAorCQkJCQkJZGF0YV9kbWFfaG5kbCk7CisJCQl9CisKKwkJCWZyZWVfbG9jYWxfcGRldihwZGV2KTsKKworCQkJcmV0dXJuIHJ2YWw7CisJCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbWVnYV9tX3RvX24oKQorICogQGFyZyAtIHVzZXIgYWRkcmVzcworICogQHVpb2MgLSBuZXcgaW9jdGwgc3RydWN0dXJlCisgKgorICogQSB0aGluIGxheWVyIHRvIGNvbnZlcnQgb2xkZXIgbWltZCBpbnRlcmZhY2UgaW9jdGwgc3RydWN0dXJlIHRvIE5JVCBpb2N0bAorICogc3RydWN0dXJlCisgKgorICogQ29udmVydHMgdGhlIG9sZGVyIG1pbWQgaW9jdGwgc3RydWN0dXJlIHRvIG5ld2VyIE5JVCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGludAorbWVnYV9tX3RvX24odm9pZCBfX3VzZXIgKmFyZywgbml0aW9jdGxfdCAqdWlvYykKK3sKKwlzdHJ1Y3QgdWlvY3RsX3QJdWlvY19taW1kOworCWNoYXIJc2lnbmF0dXJlWzhdID0gezB9OworCXU4CW9wY29kZTsKKwl1OAlzdWJvcGNvZGU7CisKKworCS8qCisJICogY2hlY2sgaXMgdGhlIGFwcGxpY2F0aW9uIGNvbmZvcm1zIHRvIE5JVC4gV2UgZG8gbm90IGhhdmUgdG8gZG8gbXVjaAorCSAqIGluIHRoYXQgY2FzZS4KKwkgKiBXZSBleHBsb2l0IHRoZSBmYWN0IHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBzdG9yZWQgaW4gdGhlIHZlcnkKKwkgKiBiZWdpbmluZyBvZiB0aGUgc3RydWN0dXJlLgorCSAqLworCisJaWYoIGNvcHlfZnJvbV91c2VyKHNpZ25hdHVyZSwgYXJnLCA3KSApCisJCXJldHVybiAoLUVGQVVMVCk7CisKKwlpZiggbWVtY21wKHNpZ25hdHVyZSwgIk1FR0FOSVQiLCA3KSA9PSAwICkgeworCisJCS8qCisJCSAqIE5PVEUgTk9URTogVGhlIG5pdCBpb2N0bCBpcyBzdGlsbCB1bmRlciBmbHV4IGJlY2F1c2Ugb2YKKwkJICogY2hhbmdlIG9mIG1haWxib3ggZGVmaW5pdGlvbiwgaW4gSFBFLiBObyBhcHBsaWNhdGlvbnMgeWV0CisJCSAqIHVzZSB0aGlzIGludGVyZmFjZSBhbmQgbGV0J3Mgbm90IGhhdmUgYXBwbGljYXRpb25zIHVzZSB0aGlzCisJCSAqIGludGVyZmFjZSB0aWxsIHRoZSBuZXcgc3BlY2lmaXRpb25zIGFyZSBpbiBwbGFjZS4KKwkJICovCisJCXJldHVybiAtRUlOVkFMOworI2lmIDAKKwkJaWYoIGNvcHlfZnJvbV91c2VyKHVpb2MsIGFyZywgc2l6ZW9mKG5pdGlvY3RsX3QpKSApCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0KKworCS8qCisJICogRWxzZSBhc3N1bWUgd2UgaGF2ZSBtaW1kIHVpb2N0bF90IGFzIGFyZy4gQ29udmVydCB0byBuaXRpb2N0bF90CisJICoKKwkgKiBHZXQgdGhlIHVzZXIgaW9jdGwgc3RydWN0dXJlCisJICovCisJaWYoIGNvcHlfZnJvbV91c2VyKCZ1aW9jX21pbWQsIGFyZywgc2l6ZW9mKHN0cnVjdCB1aW9jdGxfdCkpICkKKwkJcmV0dXJuICgtRUZBVUxUKTsKKworCisJLyoKKwkgKiBHZXQgdGhlIG9wY29kZSBhbmQgc3Vib3Bjb2RlIGZvciB0aGUgY29tbWFuZHMKKwkgKi8KKwlvcGNvZGUgPSB1aW9jX21pbWQudWkuZmNzLm9wY29kZTsKKwlzdWJvcGNvZGUgPSB1aW9jX21pbWQudWkuZmNzLnN1Ym9wY29kZTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSAweDgyOgorCisJCXN3aXRjaCAoc3Vib3Bjb2RlKSB7CisKKwkJY2FzZSBNRUdBSU9DX1FEUlZSVkVSOgkvKiBRdWVyeSBkcml2ZXIgdmVyc2lvbiAqLworCQkJdWlvYy0+b3Bjb2RlID0gR0VUX0RSSVZFUl9WRVI7CisJCQl1aW9jLT51aW9jX3VhZGRyID0gdWlvY19taW1kLmRhdGE7CisJCQlicmVhazsKKworCQljYXNlIE1FR0FJT0NfUU5BREFQOgkvKiBHZXQgIyBvZiBhZGFwdGVycyAqLworCQkJdWlvYy0+b3Bjb2RlID0gR0VUX05fQURBUDsKKwkJCXVpb2MtPnVpb2NfdWFkZHIgPSB1aW9jX21pbWQuZGF0YTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVHQUlPQ19RQURBUElORk86CS8qIEdldCBhZGFwdGVyIGluZm9ybWF0aW9uICovCisJCQl1aW9jLT5vcGNvZGUgPSBHRVRfQURBUF9JTkZPOworCQkJdWlvYy0+YWRhcG5vID0gdWlvY19taW1kLnVpLmZjcy5hZGFwbm87CisJCQl1aW9jLT51aW9jX3VhZGRyID0gdWlvY19taW1kLmRhdGE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuKC1FSU5WQUwpOworCQl9CisKKwkJYnJlYWs7CisKKworCWNhc2UgMHg4MToKKworCQl1aW9jLT5vcGNvZGUgPSBNQk9YX0NNRDsKKwkJdWlvYy0+YWRhcG5vID0gdWlvY19taW1kLnVpLmZjcy5hZGFwbm87CisKKwkJbWVtY3B5KHVpb2MtPnVpb2Nfcm1ib3gsIHVpb2NfbWltZC5tYm94LCAxOCk7CisKKwkJdWlvYy0+eGZlcmxlbiA9IHVpb2NfbWltZC51aS5mY3MubGVuZ3RoOworCisJCWlmKCB1aW9jX21pbWQub3V0bGVuICkgdWlvYy0+ZmxhZ3MgPSBVSU9DX1JEOworCQlpZiggdWlvY19taW1kLmlubGVuICkgdWlvYy0+ZmxhZ3MgfD0gVUlPQ19XUjsKKworCQlicmVhazsKKworCWNhc2UgMHg4MDoKKworCQl1aW9jLT5vcGNvZGUgPSBNQk9YX0NNRDsKKwkJdWlvYy0+YWRhcG5vID0gdWlvY19taW1kLnVpLmZjcy5hZGFwbm87CisKKwkJbWVtY3B5KHVpb2MtPnVpb2Nfcm1ib3gsIHVpb2NfbWltZC5tYm94LCAxOCk7CisKKwkJLyoKKwkJICogQ2hvb3NlIHRoZSB4ZmVybGVuIGJpZ2dlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGRhdGEKKwkJICovCisJCXVpb2MtPnhmZXJsZW4gPSB1aW9jX21pbWQub3V0bGVuID4gdWlvY19taW1kLmlubGVuID8KKwkJCXVpb2NfbWltZC5vdXRsZW4gOiB1aW9jX21pbWQuaW5sZW47CisKKwkJaWYoIHVpb2NfbWltZC5vdXRsZW4gKSB1aW9jLT5mbGFncyA9IFVJT0NfUkQ7CisJCWlmKCB1aW9jX21pbWQuaW5sZW4gKSB1aW9jLT5mbGFncyB8PSBVSU9DX1dSOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogbWVnYV9uX3RvX20oKQorICogQGFyZyAtIHVzZXIgYWRkcmVzcworICogQG1jIC0gbWFpbGJveCBjb21tYW5kCisgKgorICogVXBkYXRlcyB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbiwgZGVwZW5kaW5nIG9uIGFwcGxpY2F0aW9uCisgKiBjb25mb3JtcyB0byBvbGRlciBtaW1kIGlvY3RsIGludGVyZmFjZSBvciBuZXdlciBOSVQgaW9jdGwgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2Ffbl90b19tKHZvaWQgX191c2VyICphcmcsIG1lZ2FjbWRfdCAqbWMpCit7CisJbml0aW9jdGxfdAlfX3VzZXIgKnVpb2NwOworCW1lZ2FjbWRfdAlfX3VzZXIgKnVtYzsKKwltZWdhX3Bhc3N0aHJ1CV9fdXNlciAqdXB0aHJ1OworCXN0cnVjdCB1aW9jdGxfdAlfX3VzZXIgKnVpb2NfbWltZDsKKwljaGFyCXNpZ25hdHVyZVs4XSA9IHswfTsKKworCS8qCisJICogY2hlY2sgaXMgdGhlIGFwcGxpY2F0aW9uIGNvbmZvcm1zIHRvIE5JVC4KKwkgKi8KKwlpZiggY29weV9mcm9tX3VzZXIoc2lnbmF0dXJlLCBhcmcsIDcpICkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiggbWVtY21wKHNpZ25hdHVyZSwgIk1FR0FOSVQiLCA3KSA9PSAwICkgeworCisJCXVpb2NwID0gYXJnOworCisJCWlmKCBwdXRfdXNlcihtYy0+c3RhdHVzLCAodTggX191c2VyICopJk1CT1hfUCh1aW9jcCktPnN0YXR1cykgKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQlpZiggbWMtPmNtZCA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlUgKSB7CisKKwkJCXVtYyA9IE1CT1hfUCh1aW9jcCk7CisKKwkJCWlmIChnZXRfdXNlcih1cHRocnUsIChtZWdhX3Bhc3N0aHJ1IF9fdXNlciAqIF9fdXNlciAqKSZ1bWMtPnhmZXJhZGRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYoIHB1dF91c2VyKG1jLT5zdGF0dXMsICh1OCBfX3VzZXIgKikmdXB0aHJ1LT5zY3Npc3RhdHVzKSkKKwkJCQlyZXR1cm4gKC1FRkFVTFQpOworCQl9CisJfQorCWVsc2UgeworCQl1aW9jX21pbWQgPSBhcmc7CisKKwkJaWYoIHB1dF91c2VyKG1jLT5zdGF0dXMsICh1OCBfX3VzZXIgKikmdWlvY19taW1kLT5tYm94WzE3XSkgKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQlpZiggbWMtPmNtZCA9PSBNRUdBX01CT1hDTURfUEFTU1RIUlUgKSB7CisKKwkJCXVtYyA9IChtZWdhY21kX3QgX191c2VyICopdWlvY19taW1kLT5tYm94OworCisJCQlpZiAoZ2V0X3VzZXIodXB0aHJ1LCAobWVnYV9wYXNzdGhydSBfX3VzZXIgKiBfX3VzZXIgKikmdW1jLT54ZmVyYWRkcikpCisJCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQkJaWYoIHB1dF91c2VyKG1jLT5zdGF0dXMsICh1OCBfX3VzZXIgKikmdXB0aHJ1LT5zY3Npc3RhdHVzKSApCisJCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBNRUdBUkFJRCAnRlcnIGNvbW1hbmRzLgorICovCisKKy8qKgorICogbWVnYV9pc19iaW9zX2VuYWJsZWQoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogaXNzdWUgY29tbWFuZCB0byBmaW5kIG91dCBpZiB0aGUgQklPUyBpcyBlbmFibGVkIGZvciB0aGlzIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIGludAorbWVnYV9pc19iaW9zX2VuYWJsZWQoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVuc2lnbmVkIGNoYXIJcmF3X21ib3hbc2l6ZW9mKHN0cnVjdCBtYm94X291dCldOworCW1ib3hfdAkqbWJveDsKKwlpbnQJcmV0OworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgmbWJveC0+bV9vdXQsIDAsIHNpemVvZihyYXdfbWJveCkpOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+bWVnYV9idWZmZXIsIDAsIE1FR0FfQlVGRkVSX1NJWkUpOworCisJbWJveC0+bV9vdXQueGZlcmFkZHIgPSAodTMyKWFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlOworCisJcmF3X21ib3hbMF0gPSBJU19CSU9TX0VOQUJMRUQ7CisJcmF3X21ib3hbMl0gPSBHRVRfQklPUzsKKworCisJcmV0ID0gaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KTsKKworCXJldHVybiAqKGNoYXIgKilhZGFwdGVyLT5tZWdhX2J1ZmZlcjsKK30KKworCisvKioKKyAqIG1lZ2FfZW51bV9yYWlkX3Njc2koKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRmluZCBvdXQgd2hhdCBjaGFubmVscyBhcmUgUkFJRC9TQ1NJLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8KKyAqIGRpZmZlcmVudGlhdGUgdGhlIHZpcnR1YWwgY2hhbm5lbHMgYW5kIHBoeXNpY2FsIGNoYW5uZWxzIGFuZCB0byBzdXBwb3J0CisgKiBST01CIGZlYXR1cmUgYW5kIG5vbi1kaXNrIGRldmljZXMuCisgKi8KK3N0YXRpYyB2b2lkCittZWdhX2VudW1fcmFpZF9zY3NpKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBjaGFyIHJhd19tYm94W3NpemVvZihzdHJ1Y3QgbWJveF9vdXQpXTsKKwltYm94X3QgKm1ib3g7CisJaW50IGk7CisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KCZtYm94LT5tX291dCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisKKwkvKgorCSAqIGlzc3VlIGNvbW1hbmQgdG8gZmluZCBvdXQgd2hhdCBjaGFubmVscyBhcmUgcmFpZC9zY3NpCisJICovCisJcmF3X21ib3hbMF0gPSBDSE5MX0NMQVNTOworCXJhd19tYm94WzJdID0gR0VUX0NITkxfQ0xBU1M7CisKKwltZW1zZXQoKHZvaWQgKilhZGFwdGVyLT5tZWdhX2J1ZmZlciwgMCwgTUVHQV9CVUZGRVJfU0laRSk7CisKKwltYm94LT5tX291dC54ZmVyYWRkciA9ICh1MzIpYWRhcHRlci0+YnVmX2RtYV9oYW5kbGU7CisKKwkvKgorCSAqIE5vbi1ST01CIGZpcm13YXJlIGZhaWwgdGhpcyBjb21tYW5kLCBzbyBhbGwgY2hhbm5lbHMKKwkgKiBtdXN0IGJlIHNob3duIFJBSUQKKwkgKi8KKwlhZGFwdGVyLT5tZWdhX2NoX2NsYXNzID0gMHhGRjsKKworCWlmKCFpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpKSB7CisJCWFkYXB0ZXItPm1lZ2FfY2hfY2xhc3MgPSAqKChjaGFyICopYWRhcHRlci0+bWVnYV9idWZmZXIpOworCisJfQorCisJZm9yKCBpID0gMDsgaSA8IGFkYXB0ZXItPnByb2R1Y3RfaW5mby5uY2hhbm5lbHM7IGkrKyApIHsgCisJCWlmKCAoYWRhcHRlci0+bWVnYV9jaF9jbGFzcyA+PiBpKSAmIDB4MDEgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtZWdhcmFpZDogY2hhbm5lbFslZF0gaXMgcmFpZC5cbiIsCisJCQkJCWkpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibWVnYXJhaWQ6IGNoYW5uZWxbJWRdIGlzIHNjc2kuXG4iLAorCQkJCQlpKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FfZ2V0X2Jvb3RfZHJ2KCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIEZpbmQgb3V0IHdoaWNoIGRldmljZSBpcyB0aGUgYm9vdCBkZXZpY2UuIE5vdGUsIGFueSBsb2dpY2FsIGRyaXZlIG9yIGFueQorICogcGh5aWNhbCBkZXZpY2UgKGUuZy4sIGEgQ0RST00pIGNhbiBiZSBkZXNpZ25hdGVkIGFzIGEgYm9vdCBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkCittZWdhX2dldF9ib290X2RydihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc3RydWN0IHByaXZhdGVfYmlvc19kYXRhCSpwcnZfYmlvc19kYXRhOworCXVuc2lnbmVkIGNoYXIJcmF3X21ib3hbc2l6ZW9mKHN0cnVjdCBtYm94X291dCldOworCW1ib3hfdAkqbWJveDsKKwl1MTYJY2tzdW0gPSAwOworCXU4CSpja3N1bV9wOworCXU4CWJvb3RfcGRydjsKKwlpbnQJaTsKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoJm1ib3gtPm1fb3V0LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKworCXJhd19tYm94WzBdID0gQklPU19QVlRfREFUQTsKKwlyYXdfbWJveFsyXSA9IEdFVF9CSU9TX1BWVF9EQVRBOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+bWVnYV9idWZmZXIsIDAsIE1FR0FfQlVGRkVSX1NJWkUpOworCisJbWJveC0+bV9vdXQueGZlcmFkZHIgPSAodTMyKWFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlOworCisJYWRhcHRlci0+Ym9vdF9sZHJ2X2VuYWJsZWQgPSAwOworCWFkYXB0ZXItPmJvb3RfbGRydiA9IDA7CisKKwlhZGFwdGVyLT5ib290X3BkcnZfZW5hYmxlZCA9IDA7CisJYWRhcHRlci0+Ym9vdF9wZHJ2X2NoID0gMDsKKwlhZGFwdGVyLT5ib290X3BkcnZfdGd0ID0gMDsKKworCWlmKGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCkgPT0gMCkgeworCQlwcnZfYmlvc19kYXRhID0KKwkJCShzdHJ1Y3QgcHJpdmF0ZV9iaW9zX2RhdGEgKilhZGFwdGVyLT5tZWdhX2J1ZmZlcjsKKworCQlja3N1bSA9IDA7CisJCWNrc3VtX3AgPSAoY2hhciAqKXBydl9iaW9zX2RhdGE7CisJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrICkgeworCQkJY2tzdW0gKz0gKHUxNikoKmNrc3VtX3ArKyk7CisJCX0KKworCQlpZiAocHJ2X2Jpb3NfZGF0YS0+Y2tzdW0gPT0gKHUxNikoMC1ja3N1bSkgKSB7CisKKwkJCS8qCisJCQkgKiBJZiBNU0IgaXMgc2V0LCBhIHBoeXNpY2FsIGRyaXZlIGlzIHNldCBhcyBib290CisJCQkgKiBkZXZpY2UKKwkJCSAqLworCQkJaWYoIHBydl9iaW9zX2RhdGEtPmJvb3RfZHJ2ICYgMHg4MCApIHsKKwkJCQlhZGFwdGVyLT5ib290X3BkcnZfZW5hYmxlZCA9IDE7CisJCQkJYm9vdF9wZHJ2ID0gcHJ2X2Jpb3NfZGF0YS0+Ym9vdF9kcnYgJiAweDdGOworCQkJCWFkYXB0ZXItPmJvb3RfcGRydl9jaCA9IGJvb3RfcGRydiAvIDE2OworCQkJCWFkYXB0ZXItPmJvb3RfcGRydl90Z3QgPSBib290X3BkcnYgJSAxNjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWFkYXB0ZXItPmJvb3RfbGRydl9lbmFibGVkID0gMTsKKwkJCQlhZGFwdGVyLT5ib290X2xkcnYgPSBwcnZfYmlvc19kYXRhLT5ib290X2RydjsKKwkJCX0KKwkJfQorCX0KKworfQorCisvKioKKyAqIG1lZ2Ffc3VwcG9ydF9yYW5kb21fZGVsKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIEZpbmQgb3V0IGlmIHRoaXMgY29udHJvbGxlciBzdXBwb3J0cyByYW5kb20gZGVsZXRpb24gYW5kIGFkZGl0aW9uIG9mCisgKiBsb2dpY2FsIGRyaXZlcworICovCitzdGF0aWMgaW50CittZWdhX3N1cHBvcnRfcmFuZG9tX2RlbChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgY2hhciByYXdfbWJveFtzaXplb2Yoc3RydWN0IG1ib3hfb3V0KV07CisJbWJveF90ICptYm94OworCWludCBydmFsOworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgmbWJveC0+bV9vdXQsIDAsIHNpemVvZihyYXdfbWJveCkpOworCisJLyoKKwkgKiBpc3N1ZSBjb21tYW5kCisJICovCisJcmF3X21ib3hbMF0gPSBGQ19ERUxfTE9HRFJWOworCXJhd19tYm94WzJdID0gT1BfU1VQX0RFTF9MT0dEUlY7CisKKwlydmFsID0gaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXIsIHJhd19tYm94KTsKKworCXJldHVybiAhcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2Ffc3VwcG9ydF9leHRfY2RiKCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICoKKyAqIEZpbmQgb3V0IGlmIHRoaXMgZmlybXdhcmUgc3VwcG9ydCBjZGJsZW4gPiAxMAorICovCitzdGF0aWMgaW50CittZWdhX3N1cHBvcnRfZXh0X2NkYihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgY2hhciByYXdfbWJveFtzaXplb2Yoc3RydWN0IG1ib3hfb3V0KV07CisJbWJveF90ICptYm94OworCWludCBydmFsOworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgmbWJveC0+bV9vdXQsIDAsIHNpemVvZihyYXdfbWJveCkpOworCS8qCisJICogaXNzdWUgY29tbWFuZCB0byBmaW5kIG91dCBpZiBjb250cm9sbGVyIHN1cHBvcnRzIGV4dGVuZGVkIENEQnMuCisJICovCisJcmF3X21ib3hbMF0gPSAweEE0OworCXJhd19tYm94WzJdID0gMHgxNjsKKworCXJ2YWwgPSBpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpOworCisJcmV0dXJuICFydmFsOworfQorCisKKy8qKgorICogbWVnYV9kZWxfbG9nZHJ2KCkKKyAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byBvdXIgc29mdCBzdGF0ZQorICogQGxvZ2RydiAtIGxvZ2ljYWwgZHJpdmUgdG8gYmUgZGVsZXRlZAorICoKKyAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgZHJpdmUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlcgorICogYXBwIHRvIGxldCB0aGUgT1Mga25vdyBhYm91dCB0aGlzIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIGludAorbWVnYV9kZWxfbG9nZHJ2KGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGxvZ2RydikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNjYl90ICpzY2I7CisJaW50IHJ2YWw7CisKKwkvKgorCSAqIFN0b3Agc2VuZGluZyBjb21tYW5kcyB0byB0aGUgY29udHJvbGxlciwgcXVldWUgdGhlbSBpbnRlcm5hbGx5LgorCSAqIFdoZW4gZGVsZXRpb24gaXMgY29tcGxldGUsIElTUiB3aWxsIGZsdXNoIHRoZSBxdWV1ZS4KKwkgKi8KKwlhdG9taWNfc2V0KCZhZGFwdGVyLT5xdWllc2NlbnQsIDEpOworCisJLyoKKwkgKiBXYWl0IHRpbGwgYWxsIHRoZSBpc3N1ZWQgY29tbWFuZHMgYXJlIGNvbXBsZXRlIGFuZCB0aGVyZSBhcmUgbm8KKwkgKiBjb21tYW5kcyBpbiB0aGUgcGVuZGluZyBxdWV1ZQorCSAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cGVuZF9jbWRzKSA+IDAgfHwKKwkgICAgICAgIWxpc3RfZW1wdHkoJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCkpCisJCW1zbGVlcCgxMDAwKTsJLyogc2xlZXAgZm9yIDFzICovCisKKwlydmFsID0gbWVnYV9kb19kZWxfbG9nZHJ2KGFkYXB0ZXIsIGxvZ2Rydik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiBkZWxldGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhZGQgMHg4MCB0byB0aGUgbG9naWNhbCBkcml2ZQorCSAqIGlkcyBmb3IgY29tbWFuZHMgaW4gdGhlIHBlbmRpbmcgcXVldWUuCisJICovCisJaWYgKGFkYXB0ZXItPnJlYWRfbGRpZG1hcCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJCWxpc3RfZm9yX2VhY2gocG9zLCAmYWRhcHRlci0+cGVuZGluZ19saXN0KSB7CisJCQlzY2IgPSBsaXN0X2VudHJ5KHBvcywgc2NiX3QsIGxpc3QpOworCQkJaWYgKHNjYi0+cHRocnUtPmxvZ2RydiA8IDB4ODAgKQorCQkJCXNjYi0+cHRocnUtPmxvZ2RydiArPSAweDgwOworCQl9CisJfQorCisJYXRvbWljX3NldCgmYWRhcHRlci0+cXVpZXNjZW50LCAwKTsKKworCW1lZ2FfcnVucGVuZHEoYWRhcHRlcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCitzdGF0aWMgaW50CittZWdhX2RvX2RlbF9sb2dkcnYoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgbG9nZHJ2KQoreworCW1lZ2FjbWRfdAltYzsKKwlpbnQJcnZhbDsKKworCW1lbXNldCggJm1jLCAwLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwltYy5jbWQgPSBGQ19ERUxfTE9HRFJWOworCW1jLm9wY29kZSA9IE9QX0RFTF9MT0dEUlY7CisJbWMuc3Vib3Bjb2RlID0gbG9nZHJ2OworCisJcnZhbCA9IG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBOVUxMKTsKKworCS8qIGxvZyB0aGlzIGV2ZW50ICovCisJaWYocnZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogRGVsZXRlIExELSVkIGZhaWxlZC4iLCBsb2dkcnYpOworCQlyZXR1cm4gcnZhbDsKKwl9CisKKwkvKgorCSAqIEFmdGVyIGRlbGV0aW5nIGZpcnN0IGxvZ2ljYWwgZHJpdmUsIHRoZSBsb2dpY2FsIGRyaXZlcyBtdXN0IGJlCisJICogYWRkcmVzc2VkIGJ5IGFkZGluZyAweDgwIHRvIHRoZSBsb2dpY2FsIGRyaXZlIGlkLgorCSAqLworCWFkYXB0ZXItPnJlYWRfbGRpZG1hcCA9IDE7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2FfZ2V0X21heF9zZ2woKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRmluZCBvdXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGlzCisgKiB2ZXJzaW9uIG9mIHRoZSBmaXJtd2FyZQorICovCitzdGF0aWMgdm9pZAorbWVnYV9nZXRfbWF4X3NnbChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgY2hhcglyYXdfbWJveFtzaXplb2Yoc3RydWN0IG1ib3hfb3V0KV07CisJbWJveF90CSptYm94OworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldChtYm94LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPm1lZ2FfYnVmZmVyLCAwLCBNRUdBX0JVRkZFUl9TSVpFKTsKKworCW1ib3gtPm1fb3V0LnhmZXJhZGRyID0gKHUzMilhZGFwdGVyLT5idWZfZG1hX2hhbmRsZTsKKworCXJhd19tYm94WzBdID0gTUFJTl9NSVNDX09QQ09ERTsKKwlyYXdfbWJveFsyXSA9IEdFVF9NQVhfU0dfU1VQUE9SVDsKKworCisJaWYoIGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCkgKSB7CisJCS8qCisJCSAqIGYvdyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29tbWFuZC4gQ2hvb3NlIHRoZSBkZWZhdWx0IHZhbHVlCisJCSAqLworCQlhZGFwdGVyLT5zZ2xlbiA9IE1JTl9TR0xJU1Q7CisJfQorCWVsc2UgeworCQlhZGFwdGVyLT5zZ2xlbiA9ICooKGNoYXIgKilhZGFwdGVyLT5tZWdhX2J1ZmZlcik7CisJCQorCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhpcyBpcyBub3QgbW9yZSB0aGFuIHRoZSByZXNvdXJjZXMgd2UgYXJlCisJCSAqIHBsYW5uaW5nIHRvIGFsbG9jYXRlCisJCSAqLworCQlpZiAoIGFkYXB0ZXItPnNnbGVuID4gTUFYX1NHTElTVCApCisJCQlhZGFwdGVyLT5zZ2xlbiA9IE1BWF9TR0xJU1Q7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYV9zdXBwb3J0X2NsdXN0ZXIoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKgorICogRmluZCBvdXQgaWYgdGhpcyBmaXJtd2FyZSBzdXBwb3J0IGNsdXN0ZXIgY2FsbHMuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2Ffc3VwcG9ydF9jbHVzdGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBjaGFyCXJhd19tYm94W3NpemVvZihzdHJ1Y3QgbWJveF9vdXQpXTsKKwltYm94X3QJKm1ib3g7CisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KG1ib3gsIDAsIHNpemVvZihyYXdfbWJveCkpOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+bWVnYV9idWZmZXIsIDAsIE1FR0FfQlVGRkVSX1NJWkUpOworCisJbWJveC0+bV9vdXQueGZlcmFkZHIgPSAodTMyKWFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlOworCisJLyoKKwkgKiBUcnkgdG8gZ2V0IHRoZSBpbml0aWF0b3IgaWQuIFRoaXMgY29tbWFuZCB3aWxsIHN1Y2NlZWQgaWZmIHRoZQorCSAqIGNsdXN0ZXJpbmcgaXMgYXZhaWxhYmxlIG9uIHRoaXMgSEJBLgorCSAqLworCXJhd19tYm94WzBdID0gTUVHQV9HRVRfVEFSR0VUX0lEOworCisJaWYoIGlzc3VlX3NjYl9ibG9jayhhZGFwdGVyLCByYXdfbWJveCkgPT0gMCApIHsKKworCQkvKgorCQkgKiBDbHVzdGVyIHN1cHBvcnQgYXZhaWxhYmxlLiBHZXQgdGhlIGluaXRpYXRvciB0YXJnZXQgaWQuCisJCSAqIFRlbGwgb3VyIGlkIHRvIG1pZC1sYXllciB0b28uCisJCSAqLworCQlhZGFwdGVyLT50aGlzX2lkID0gKih1MzIgKilhZGFwdGVyLT5tZWdhX2J1ZmZlcjsKKwkJYWRhcHRlci0+aG9zdC0+dGhpc19pZCA9IGFkYXB0ZXItPnRoaXNfaWQ7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBtZWdhX2FkYXBpbnEoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAZG1hX2hhbmRsZSAtIERNQSBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqCisgKiBJc3N1ZSBpbnRlcm5hbCBjb21hbW5kcyB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBhdmFpbGFibGUuCisgKiBXZSBvbmx5IGlzc3VlIGRpcmVjdCBtYWlsYm94IGNvbW1hbmRzIGZyb20gd2l0aGluIHRoZSBkcml2ZXIuIGlvY3RsKCkKKyAqIGludGVyZmFjZSB1c2luZyB0aGVzZSByb3V0aW5lcyBjYW4gaXNzdWUgcGFzc3RocnUgY29tbWFuZHMuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfYWRhcGlucShhZGFwdGVyX3QgKmFkYXB0ZXIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwltZWdhY21kX3QJbWM7CisKKwltZW1zZXQoJm1jLCAwLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwlpZiggYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQgKSB7CisJCW1jLmNtZCA9IEZDX05FV19DT05GSUc7CisJCW1jLm9wY29kZSA9IE5DX1NVQk9QX0VOUVVJUlkzOworCQltYy5zdWJvcGNvZGUgPSBFTlEzX0dFVF9TT0xJQ0lURURfRlVMTDsKKwl9CisJZWxzZSB7CisJCW1jLmNtZCA9IE1FR0FfTUJPWENNRF9BRFBFWFRJTlE7CisJfQorCisJbWMueGZlcmFkZHIgPSAodTMyKWRtYV9oYW5kbGU7CisKKwlpZiAoIG1lZ2FfaW50ZXJuYWxfY29tbWFuZChhZGFwdGVyLCBMT0NLX0lOVCwgJm1jLCBOVUxMKSAhPSAwICkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqIG1lZ2FfaW50ZXJuYWxfZGV2X2lucXVpcnkoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAY2ggLSBjaGFubmVsIGZvciB0aGlzIGRldmljZQorICogQHRndCAtIElEIG9mIHRoaXMgZGV2aWNlCisgKiBAYnVmX2RtYV9oYW5kbGUgLSBETUEgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisgKgorICogSXNzdWUgdGhlIHNjc2kgaW5xdWlyeSBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FfaW50ZXJuYWxfZGV2X2lucXVpcnkoYWRhcHRlcl90ICphZGFwdGVyLCB1OCBjaCwgdTggdGd0LAorCQlkbWFfYWRkcl90IGJ1Zl9kbWFfaGFuZGxlKQoreworCW1lZ2FfcGFzc3RocnUJKnB0aHJ1OworCWRtYV9hZGRyX3QJcHRocnVfZG1hX2hhbmRsZTsKKwltZWdhY21kX3QJbWM7CisJaW50CQlydmFsOworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCisKKwkvKgorCSAqIEZvciBhbGwgaW50ZXJuYWwgY29tbWFuZHMsIHRoZSBidWZmZXIgbXVzdCBiZSBhbGxvY2F0ZWQgaW4gPDRHQgorCSAqIGFkZHJlc3MgcmFuZ2UKKwkgKi8KKwlpZiggbWFrZV9sb2NhbF9wZGV2KGFkYXB0ZXIsICZwZGV2KSAhPSAwICkgcmV0dXJuIC0xOworCisJcHRocnUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YobWVnYV9wYXNzdGhydSksCisJCQkmcHRocnVfZG1hX2hhbmRsZSk7CisKKwlpZiggcHRocnUgPT0gTlVMTCApIHsKKwkJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHRocnUtPnRpbWVvdXQgPSAyOworCXB0aHJ1LT5hcnMgPSAxOworCXB0aHJ1LT5yZXFzZW5zZWxlbiA9IDE0OworCXB0aHJ1LT5pc2xvZ2ljYWwgPSAwOworCisJcHRocnUtPmNoYW5uZWwgPSAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzQwTEQpID8gMCA6IGNoOworCisJcHRocnUtPnRhcmdldCA9IChhZGFwdGVyLT5mbGFnICYgQk9BUkRfNDBMRCkgPyAoY2ggPDwgNCl8dGd0IDogdGd0OworCisJcHRocnUtPmNkYmxlbiA9IDY7CisKKwlwdGhydS0+Y2RiWzBdID0gSU5RVUlSWTsKKwlwdGhydS0+Y2RiWzFdID0gMDsKKwlwdGhydS0+Y2RiWzJdID0gMDsKKwlwdGhydS0+Y2RiWzNdID0gMDsKKwlwdGhydS0+Y2RiWzRdID0gMjU1OworCXB0aHJ1LT5jZGJbNV0gPSAwOworCisKKwlwdGhydS0+ZGF0YXhmZXJhZGRyID0gKHUzMilidWZfZG1hX2hhbmRsZTsKKwlwdGhydS0+ZGF0YXhmZXJsZW4gPSAyNTY7CisKKwltZW1zZXQoJm1jLCAwLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwltYy5jbWQgPSBNRUdBX01CT1hDTURfUEFTU1RIUlU7CisJbWMueGZlcmFkZHIgPSAodTMyKXB0aHJ1X2RtYV9oYW5kbGU7CisKKwlydmFsID0gbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXIsIExPQ0tfSU5ULCAmbWMsIHB0aHJ1KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKG1lZ2FfcGFzc3RocnUpLCBwdGhydSwKKwkJCXB0aHJ1X2RtYV9oYW5kbGUpOworCisJZnJlZV9sb2NhbF9wZGV2KHBkZXYpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhX2ludGVybmFsX2NvbW1hbmQoKQorICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIG91ciBzb2Z0IHN0YXRlCisgKiBAbHMgLSB0aGUgc2NvcGUgb2YgdGhlIGV4Y2x1c2lvbiBsb2NrLgorICogQG1jIC0gdGhlIG1haWxib3ggY29tbWFuZAorICogQHB0aHJ1IC0gUGFzc3RocnUgc3RydWN0dXJlIGZvciBEQ0RCIGNvbW1hbmRzCisgKgorICogSXNzdWUgdGhlIGludGVybmFsIGNvbW1hbmRzIGluIGludGVycnVwdCBtb2RlLgorICogVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHBhc3N0aHJ1IHN0cnVjdHVyZSBpZiB0aGUgY29tbWFuZAorICogdG8gYmUgZmlyZWQgaXMgYSBwYXNzdGhydSBjb21tYW5kCisgKgorICogbG9ja3Njb3BlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgYWNxdWlyZWQgdGhlIGxvY2suIE9mCisgKiBjb3Vyc2UsIHRoZSBjYWxsZXIgbXVzdCBrbm93IHdoaWNoIGxvY2sgd2UgYXJlIHRhbGtpbmcgYWJvdXQuCisgKgorICogTm90ZTogcGFyYW1ldGVyICdwdGhydScgaXMgbnVsbCBmb3Igbm9uLXBhc3N0aHJ1IGNvbW1hbmRzLgorICovCitzdGF0aWMgaW50CittZWdhX2ludGVybmFsX2NvbW1hbmQoYWRhcHRlcl90ICphZGFwdGVyLCBsb2Nrc2NvcGVfdCBscywgbWVnYWNtZF90ICptYywKKwkJbWVnYV9wYXNzdGhydSAqcHRocnUgKQoreworCVNjc2lfQ21uZAkqc2NtZDsKKwlzdHJ1Y3QJc2NzaV9kZXZpY2UgKnNkZXY7CisJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CisJc2NiX3QJKnNjYjsKKwlpbnQJcnZhbDsKKworCS8qCisJICogVGhlIGludGVybmFsIGNvbW1hbmRzIHNoYXJlIG9uZSBjb21tYW5kIGlkIGFuZCBoZW5jZSBhcmUKKwkgKiBzZXJpYWxpemVkLiBUaGlzIGlzIHNvIGJlY2F1c2Ugd2Ugd2FudCB0byByZXNlcnZlIG1heGltdW0gbnVtYmVyIG9mCisJICogYXZhaWxhYmxlIGNvbW1hbmQgaWRzIGZvciB0aGUgSS9PIGNvbW1hbmRzLgorCSAqLworCWRvd24oJmFkYXB0ZXItPmludF9tdHgpOworCisJc2NiID0gJmFkYXB0ZXItPmludF9zY2I7CisJbWVtc2V0KHNjYiwgMCwgc2l6ZW9mKHNjYl90KSk7CisKKwlzY21kID0gJmFkYXB0ZXItPmludF9zY21kOworCW1lbXNldChzY21kLCAwLCBzaXplb2YoU2NzaV9DbW5kKSk7CisKKwlzZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjc2lfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJbWVtc2V0KHNkZXYsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9kZXZpY2UpKTsKKwlzY21kLT5kZXZpY2UgPSBzZGV2OworCisJc2NtZC0+ZGV2aWNlLT5ob3N0ID0gYWRhcHRlci0+aG9zdDsKKwlzY21kLT5idWZmZXIgPSAodm9pZCAqKXNjYjsKKwlzY21kLT5jbW5kWzBdID0gTUVHQV9JTlRFUk5BTF9DTUQ7CisKKwlzY2ItPnN0YXRlIHw9IFNDQl9BQ1RJVkU7CisJc2NiLT5jbWQgPSBzY21kOworCisJbWVtY3B5KHNjYi0+cmF3X21ib3gsIG1jLCBzaXplb2YobWVnYWNtZF90KSk7CisKKwkvKgorCSAqIElzIGl0IGEgcGFzc3RocnUgY29tbWFuZAorCSAqLworCWlmKCBtYy0+Y21kID09IE1FR0FfTUJPWENNRF9QQVNTVEhSVSApIHsKKworCQlzY2ItPnB0aHJ1ID0gcHRocnU7CisJfQorCisJc2NiLT5pZHggPSBDTURJRF9JTlRfQ01EUzsKKworCXNjbWQtPnN0YXRlID0gMDsKKworCS8qCisJICogR2V0IHRoZSBsb2NrIG9ubHkgaWYgdGhlIGNhbGxlciBoYXMgbm90IGFjcXVpcmVkIGl0IGFscmVhZHkKKwkgKi8KKwlpZiggbHMgPT0gTE9DS19JTlQgKSBzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJbWVnYXJhaWRfcXVldWUoc2NtZCwgbWVnYV9pbnRlcm5hbF9kb25lKTsKKworCWlmKCBscyA9PSBMT0NLX0lOVCApIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogV2FpdCB0aWxsIHRoaXMgY29tbWFuZCBmaW5pc2hlcy4gRG8gbm90IHVzZQorCSAqIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLiBJdCBjYXVzZXMgcGFuaWMgaWYgQ1RSTC1DIGlzIGhpdCB3aGVuCisJICogZHVtcGluZyBlLmcuLCBwaHlzaWNhbCBkaXNrIGluZm9ybWF0aW9uIHRocm91Z2ggL3Byb2MgaW50ZXJmYWNlLgorCSAqLworI2lmIDAKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+aW50X3dhaXRxLCBzY21kLT5zdGF0ZSk7CisjZW5kaWYKKwl3YWl0X2V2ZW50KGFkYXB0ZXItPmludF93YWl0cSwgc2NtZC0+c3RhdGUpOworCisJcnZhbCA9IHNjbWQtPnJlc3VsdDsKKwltYy0+c3RhdHVzID0gc2NtZC0+cmVzdWx0OworCWtmcmVlKHNkZXYpOworCisJLyoKKwkgKiBQcmludCBhIGRlYnVnIG1lc3NhZ2UgZm9yIGFsbCBmYWlsZWQgY29tbWFuZHMuIEFwcGxpY2F0aW9ucyBjYW4gdXNlCisJICogdGhpcyBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiggc2NtZC0+cmVzdWx0ICYmIHRyYWNlX2xldmVsICkgeworCQlwcmludGsoIm1lZ2FyYWlkOiBjbWQgWyV4LCAleCwgJXhdIHN0YXR1czpbJXhdXG4iLAorCQkJbWMtPmNtZCwgbWMtPm9wY29kZSwgbWMtPnN1Ym9wY29kZSwgc2NtZC0+cmVzdWx0KTsKKwl9CisKKwl1cCgmYWRhcHRlci0+aW50X210eCk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2FfaW50ZXJuYWxfZG9uZSgpCisgKiBAc2NtZCAtIGludGVybmFsIHNjc2kgY29tbWFuZAorICoKKyAqIENhbGxiYWNrIHJvdXRpbmUgZm9yIGludGVybmFsIGNvbW1hbmRzLgorICovCitzdGF0aWMgdm9pZAorbWVnYV9pbnRlcm5hbF9kb25lKFNjc2lfQ21uZCAqc2NtZCkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisKKwlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlzY21kLT5zdGF0ZSA9IDE7IC8qIHRocmVhZCB3YWl0aW5nIGZvciBpdHMgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCisJLyoKKwkgKiBTZWUgY29tbWVudCBpbiBtZWdhX2ludGVybmFsX2NvbW1hbmQoKSByb3V0aW5lIGZvcgorCSAqIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpCisJICovCisjaWYgMAorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+aW50X3dhaXRxKTsKKyNlbmRpZgorCXdha2VfdXAoJmFkYXB0ZXItPmludF93YWl0cSk7CisKK30KKworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtZWdhcmFpZF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSAiTWVnYVJBSUQiLAorCS5wcm9jX25hbWUJCQk9ICJtZWdhcmFpZCIsCisJLmluZm8JCQkJPSBtZWdhcmFpZF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IG1lZ2FyYWlkX3F1ZXVlLAkKKwkuYmlvc19wYXJhbQkJCT0gbWVnYXJhaWRfYmlvc3BhcmFtLAorCS5tYXhfc2VjdG9ycwkJCT0gTUFYX1NFQ1RPUlNfUEVSX0lPLAorCS5jYW5fcXVldWUJCQk9IE1BWF9DT01NQU5EUywKKwkudGhpc19pZAkJCT0gREVGQVVMVF9JTklUSUFUT1JfSUQsCisJLnNnX3RhYmxlc2l6ZQkJCT0gTUFYX1NHTElTVCwKKwkuY21kX3Blcl9sdW4JCQk9IERFRl9DTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IG1lZ2FyYWlkX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IG1lZ2FyYWlkX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBtZWdhcmFpZF9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IG1lZ2FyYWlkX3Jlc2V0LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK21lZ2FyYWlkX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJYWRhcHRlcl90ICphZGFwdGVyOworCXVuc2lnbmVkIGxvbmcgbWVnYV9iYXNlcG9ydCwgdGJhc2UsIGZsYWcgPSAwOworCXUxNiBzdWJzeXNpZCwgc3Vic3lzdmlkOworCXU4IHBjaV9idXMsIHBjaV9kZXZfZnVuYzsKKwlpbnQgaXJxLCBpLCBqOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCWdvdG8gb3V0OworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGNpX2J1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCXBjaV9kZXZfZnVuYyA9IHBkZXYtPmRldmZuOworCisJLyoKKwkgKiBUaGUgbWVnYXJhaWQzIHN0dWZmIHJlcG9ydHMgdGhlIElEIG9mIHRoZSBJbnRlbCBwYXJ0IHdoaWNoIGlzIG5vdAorCSAqIHJlbW90ZWx5IHNwZWNpZmljIHRvIHRoZSBtZWdhcmFpZAorCSAqLworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkgeworCQl1MTYgbWFnaWM7CisJCS8qCisJCSAqIERvbid0IGZhbGwgb3ZlciB0aGUgQ29tcGFxIG1hbmFnZW1lbnQgY2FyZHMgdXNpbmcgdGhlIHNhbWUKKwkJICogUENJIGlkZW50aWZpZXIKKwkJICovCisJCWlmIChwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09NUEFRICYmCisJCSAgICBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4QzAwMCkKKwkJICAgCXJldHVybiAtRU5PREVWOworCQkvKiBOb3cgY2hlY2sgdGhlIG1hZ2ljIHNpZ25hdHVyZSBieXRlICovCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT05GX0FNSVNJRywgJm1hZ2ljKTsKKwkJaWYgKG1hZ2ljICE9IEhCQV9TSUdOQVRVUkVfNDcxICYmIG1hZ2ljICE9IEhCQV9TSUdOQVRVUkUpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJLyogT2sgaXQgaXMgcHJvYmFibHkgYSBtZWdhcmFpZCAqLworCX0KKworCS8qCisJICogRm9yIHRoZXNlIHZlbmRvciBhbmQgZGV2aWNlIGlkcywgc2lnbmF0dXJlIG9mZnNldHMgYXJlIG5vdAorCSAqIHZhbGlkIGFuZCA2NCBiaXQgaXMgaW1wbGljaXQKKwkgKi8KKwlpZiAoaWQtPmRyaXZlcl9kYXRhICYgQk9BUkRfNjRCSVQpCisJCWZsYWcgfD0gQk9BUkRfNjRCSVQ7CisJZWxzZSB7CisJCXUzMiBtYWdpYzY0OworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQ09ORl9BTUlTSUc2NCwgJm1hZ2ljNjQpOworCQlpZiAobWFnaWM2NCA9PSBIQkFfU0lHTkFUVVJFXzY0QklUKQorCQkJZmxhZyB8PSBCT0FSRF82NEJJVDsKKwl9CisKKwlzdWJzeXN2aWQgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCXN1YnN5c2lkID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKKworCXByaW50ayhLRVJOX05PVElDRSAibWVnYXJhaWQ6IGZvdW5kIDB4JTQuMDR4OjB4JTQuMDR4OmJ1cyAlZDoiLAorCQlpZC0+dmVuZG9yLCBpZC0+ZGV2aWNlLCBwY2lfYnVzKTsKKworCXByaW50aygic2xvdCAlZDpmdW5jICVkXG4iLAorCQlQQ0lfU0xPVChwY2lfZGV2X2Z1bmMpLCBQQ0lfRlVOQyhwY2lfZGV2X2Z1bmMpKTsKKworCS8qIFJlYWQgdGhlIGJhc2UgcG9ydCBhbmQgSVJRIGZyb20gUENJICovCisJbWVnYV9iYXNlcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwl0YmFzZSA9IG1lZ2FfYmFzZXBvcnQ7CisJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCWZsYWcgfD0gQk9BUkRfTUVNTUFQOworCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lZ2FfYmFzZXBvcnQsIDEyOCwgIm1lZ2FyYWlkIikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBtZW0gcmVnaW9uIGJ1c3khXG4iKTsKKwkJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCQl9CisKKwkJbWVnYV9iYXNlcG9ydCA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAobWVnYV9iYXNlcG9ydCwgMTI4KTsKKwkJaWYgKCFtZWdhX2Jhc2Vwb3J0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIm1lZ2FyYWlkOiBjb3VsZCBub3QgbWFwIGhiYSBtZW1vcnlcbiIpOworCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJCX0KKwl9IGVsc2UgeworCQlmbGFnIHw9IEJPQVJEX0lPTUFQOworCQltZWdhX2Jhc2Vwb3J0ICs9IDB4MTA7CisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihtZWdhX2Jhc2Vwb3J0LCAxNiwgIm1lZ2FyYWlkIikpCisJCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFNDU0kgSG9zdCBzdHJ1Y3R1cmUgKi8KKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtZWdhcmFpZF90ZW1wbGF0ZSwgc2l6ZW9mKGFkYXB0ZXJfdCkpOworCWlmICghaG9zdCkKKwkJZ290byBvdXRfaW91bm1hcDsKKworCWFkYXB0ZXIgPSAoYWRhcHRlcl90ICopaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZihhZGFwdGVyX3QpKTsKKworCXByaW50ayhLRVJOX05PVElDRQorCQkic2NzaSVkOkZvdW5kIE1lZ2FSQUlEIGNvbnRyb2xsZXIgYXQgMHglbHgsIElSUTolZFxuIiwKKwkJaG9zdC0+aG9zdF9ubywgbWVnYV9iYXNlcG9ydCwgaXJxKTsKKworCWFkYXB0ZXItPmJhc2UgPSBtZWdhX2Jhc2Vwb3J0OworCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmZyZWVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmNvbXBsZXRlZF9saXN0KTsKKworCWFkYXB0ZXItPmZsYWcgPSBmbGFnOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKKwlzY3NpX2Fzc2lnbl9sb2NrKGhvc3QsICZhZGFwdGVyLT5sb2NrKTsKKworCWhvc3QtPmNtZF9wZXJfbHVuID0gbWF4X2NtZF9wZXJfbHVuOworCWhvc3QtPm1heF9zZWN0b3JzID0gbWF4X3NlY3RvcnNfcGVyX2lvOworCisJYWRhcHRlci0+ZGV2ID0gcGRldjsKKwlhZGFwdGVyLT5ob3N0ID0gaG9zdDsKKworCWFkYXB0ZXItPmhvc3QtPmlycSA9IGlycTsKKworCWlmIChmbGFnICYgQk9BUkRfTUVNTUFQKQorCQlhZGFwdGVyLT5ob3N0LT5iYXNlID0gdGJhc2U7CisJZWxzZSB7CisJCWFkYXB0ZXItPmhvc3QtPmlvX3BvcnQgPSB0YmFzZTsKKwkJYWRhcHRlci0+aG9zdC0+bl9pb19wb3J0ID0gMTY7CisJfQorCisJYWRhcHRlci0+aG9zdC0+dW5pcXVlX2lkID0gKHBjaV9idXMgPDwgOCkgfCBwY2lfZGV2X2Z1bmM7CisKKwkvKgorCSAqIEFsbG9jYXRlIGJ1ZmZlciB0byBpc3N1ZSBpbnRlcm5hbCBjb21tYW5kcy4KKwkgKi8KKwlhZGFwdGVyLT5tZWdhX2J1ZmZlciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPmRldiwKKwkJTUVHQV9CVUZGRVJfU0laRSwgJmFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlKTsKKwlpZiAoIWFkYXB0ZXItPm1lZ2FfYnVmZmVyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBvdXQgb2YgUkFNLlxuIik7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKworCWFkYXB0ZXItPnNjYl9saXN0ID0ga21hbGxvYyhzaXplb2Yoc2NiX3QpICogTUFYX0NPTU1BTkRTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPnNjYl9saXN0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBvdXQgb2YgUkFNLlxuIik7CisJCWdvdG8gb3V0X2ZyZWVfY21kX2J1ZmZlcjsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCAoYWRhcHRlci0+ZmxhZyAmIEJPQVJEX01FTU1BUCkgPworCQkJCW1lZ2FyYWlkX2lzcl9tZW1tYXBwZWQgOiBtZWdhcmFpZF9pc3JfaW9tYXBwZWQsCisJCQkJCVNBX1NISVJRLCAibWVnYXJhaWQiLCBhZGFwdGVyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IENvdWxkbid0IHJlZ2lzdGVyIElSUSAlZCFcbiIsIGlycSk7CisJCWdvdG8gb3V0X2ZyZWVfc2NiX2xpc3Q7CisJfQorCisJaWYgKG1lZ2Ffc2V0dXBfbWFpbGJveChhZGFwdGVyKSkKKwkJZ290byBvdXRfZnJlZV9pcnE7CisKKwlpZiAobWVnYV9xdWVyeV9hZGFwdGVyKGFkYXB0ZXIpKQorCQlnb3RvIG91dF9mcmVlX21ib3g7CisKKwkvKgorCSAqIEhhdmUgY2hlY2tzIGZvciBzb21lIGJ1Z2d5IGYvdworCSAqLworCWlmICgoc3Vic3lzaWQgPT0gMHgxMTExKSAmJiAoc3Vic3lzdmlkID09IDB4MTExMSkpIHsKKwkJLyoKKwkJICogV2hpY2ggZmlybXdhcmUKKwkJICovCisJCWlmICghc3RyY21wKGFkYXB0ZXItPmZ3X3ZlcnNpb24sICIzLjAwIikgfHwKKwkJCQkhc3RyY21wKGFkYXB0ZXItPmZ3X3ZlcnNpb24sICIzLjAxIikpIHsKKworCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQ6IFlvdXIgIGNhcmQgaXMgYSBEZWxsIFBFUkMgIgorCQkJCSIyL1NDIFJBSUQgY29udHJvbGxlciB3aXRoICAiCisJCQkJImZpcm13YXJlXG5tZWdhcmFpZDogMy4wMCBvciAzLjAxLiAgIgorCQkJCSJUaGlzIGRyaXZlciBpcyBrbm93biB0byBoYXZlICIKKwkJCQkiY29ycnVwdGlvbiBpc3N1ZXNcbm1lZ2FyYWlkOiB3aXRoICIKKwkJCQkidGhvc2UgZmlybXdhcmUgdmVyc2lvbnMgb24gdGhpcyAiCisJCQkJInNwZWNpZmljIGNhcmQuICBJbiBvcmRlclxubWVnYXJhaWQ6ICIKKwkJCQkidG8gcHJvdGVjdCB5b3VyIGRhdGEsIHBsZWFzZSB1cGdyYWRlICIKKwkJCQkieW91ciBmaXJtd2FyZSB0byB2ZXJzaW9uXG5tZWdhcmFpZDogIgorCQkJCSIzLjEwIG9yIGxhdGVyLCBhdmFpbGFibGUgZnJvbSB0aGUgIgorCQkJCSJEZWxsIFRlY2huaWNhbCBTdXBwb3J0IHdlYlxuIgorCQkJCSJtZWdhcmFpZDogc2l0ZSBhdFxuaHR0cDovL3N1cHBvcnQuIgorCQkJCSJkZWxsLmNvbS91cy9lbi9maWxlbGliL2Rvd25sb2FkLyIKKwkJCQkiaW5kZXguYXNwP2ZpbGVpZD0yOTQwXG4iCisJCQkpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgSFAgMU0oMHg2MEU3KS8yTSgweDYwRTgpIGNvbnRyb2xsZXIgd2l0aAorCSAqIGZpcm13YXJlIEguMDEuMDcsIEguMDEuMDgsIGFuZCBILjAxLjA5IGRpc2FibGUgNjQgYml0CisJICogc3VwcG9ydCwgc2luY2UgdGhpcyBmaXJtd2FyZSBjYW5ub3QgaGFuZGxlIDY0IGJpdAorCSAqIGFkZHJlc3NpbmcKKwkgKi8KKwlpZiAoKHN1YnN5c3ZpZCA9PSBIUF9TVUJTWVNfVklEKSAmJgorCSAgICAoKHN1YnN5c2lkID09IDB4NjBFNykgfHwgKHN1YnN5c2lkID09IDB4NjBFOCkpKSB7CisJCS8qCisJCSAqIHdoaWNoIGZpcm13YXJlCisJCSAqLworCQlpZiAoIXN0cmNtcChhZGFwdGVyLT5md192ZXJzaW9uLCAiSDAxLjA3IikgfHwKKwkJICAgICFzdHJjbXAoYWRhcHRlci0+ZndfdmVyc2lvbiwgIkgwMS4wOCIpIHx8CisJCSAgICAhc3RyY21wKGFkYXB0ZXItPmZ3X3ZlcnNpb24sICJIMDEuMDkiKSApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQ6IEZpcm13YXJlIEguMDEuMDcsICIKKwkJCQkiSC4wMS4wOCwgYW5kIEguMDEuMDkgb24gMU0vMk0gIgorCQkJCSJjb250cm9sbGVyc1xuIgorCQkJCSJtZWdhcmFpZDogZG8gbm90IHN1cHBvcnQgNjQgYml0ICIKKwkJCQkiYWRkcmVzc2luZy5cbm1lZ2FyYWlkOiBESVNBQkxJTkcgIgorCQkJCSI2NCBiaXQgc3VwcG9ydC5cbiIpOworCQkJYWRhcHRlci0+ZmxhZyAmPSB+Qk9BUkRfNjRCSVQ7CisJCX0KKwl9CisKKwlpZiAobWVnYV9pc19iaW9zX2VuYWJsZWQoYWRhcHRlcikpCisJCW1lZ2FfaGJhc1toYmFfY291bnRdLmlzX2Jpb3NfZW5hYmxlZCA9IDE7CisJbWVnYV9oYmFzW2hiYV9jb3VudF0uaG9zdGRhdGFfYWRkciA9IGFkYXB0ZXI7CisKKwkvKgorCSAqIEZpbmQgb3V0IHdoaWNoIGNoYW5uZWwgaXMgcmFpZCBhbmQgd2hpY2ggaXMgc2NzaS4gVGhpcyBpcworCSAqIGZvciBST01CIHN1cHBvcnQuCisJICovCisJbWVnYV9lbnVtX3JhaWRfc2NzaShhZGFwdGVyKTsKKworCS8qCisJICogRmluZCBvdXQgaWYgYSBsb2dpY2FsIGRyaXZlIGlzIHNldCBhcyB0aGUgYm9vdCBkcml2ZS4gSWYKKwkgKiB0aGVyZSBpcyBvbmUsIHdpbGwgbWFrZSB0aGF0IGFzIHRoZSBmaXJzdCBsb2dpY2FsIGRyaXZlLgorCSAqIFJPTUI6IERvIHdlIGhhdmUgdG8gYm9vdCBmcm9tIGEgcGh5c2ljYWwgZHJpdmUuIFRoZW4gYWxsCisJICogdGhlIHBoeXNpY2FsIGRyaXZlcyB3b3VsZCBhcHBlYXIgYmVmb3JlIHRoZSBsb2dpY2FsIGRpc2tzLgorCSAqIEVsc2UsIGFsbCB0aGUgcGh5c2ljYWwgZHJpdmVzIHdvdWxkIGJlIGV4cG9ydGVkIHRvIHRoZSBtaWQKKwkgKiBsYXllciBhZnRlciBsb2dpY2FsIGRyaXZlcy4KKwkgKi8KKwltZWdhX2dldF9ib290X2RydihhZGFwdGVyKTsKKworCWlmIChhZGFwdGVyLT5ib290X3BkcnZfZW5hYmxlZCkgeworCQlqID0gYWRhcHRlci0+cHJvZHVjdF9pbmZvLm5jaGFubmVsczsKKwkJZm9yKCBpID0gMDsgaSA8IGo7IGkrKyApCisJCQlhZGFwdGVyLT5sb2dkcnZfY2hhbltpXSA9IDA7CisJCWZvciggaSA9IGo7IGkgPCBOVklSVF9DSEFOICsgajsgaSsrICkKKwkJCWFkYXB0ZXItPmxvZ2Rydl9jaGFuW2ldID0gMTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTlZJUlRfQ0hBTjsgaSsrKQorCQkJYWRhcHRlci0+bG9nZHJ2X2NoYW5baV0gPSAxOworCQlmb3IgKGkgPSBOVklSVF9DSEFOOyBpIDwgTUFYX0NIQU5ORUxTK05WSVJUX0NIQU47IGkrKykKKwkJCWFkYXB0ZXItPmxvZ2Rydl9jaGFuW2ldID0gMDsKKwkJYWRhcHRlci0+bWVnYV9jaF9jbGFzcyA8PD0gTlZJUlRfQ0hBTjsKKwl9CisKKwkvKgorCSAqIERvIHdlIHN1cHBvcnQgcmFuZG9tIGRlbGV0aW9uIGFuZCBhZGRpdGlvbiBvZiBsb2dpY2FsCisJICogZHJpdmVzCisJICovCisJYWRhcHRlci0+cmVhZF9sZGlkbWFwID0gMDsJLyogc2V0IGl0IGFmdGVyIGZpcnN0IGxvZ2RydgorCQkJCQkJICAgZGVsZXRlIGNtZCAqLworCWFkYXB0ZXItPnN1cHBvcnRfcmFuZG9tX2RlbCA9IG1lZ2Ffc3VwcG9ydF9yYW5kb21fZGVsKGFkYXB0ZXIpOworCisJLyogSW5pdGlhbGl6ZSBTQ0JzICovCisJaWYgKG1lZ2FfaW5pdF9zY2IoYWRhcHRlcikpCisJCWdvdG8gb3V0X2ZyZWVfbWJveDsKKworCS8qCisJICogUmVzZXQgdGhlIHBlbmRpbmcgY29tbWFuZHMgY291bnRlcgorCSAqLworCWF0b21pY19zZXQoJmFkYXB0ZXItPnBlbmRfY21kcywgMCk7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBhZGFwdGVyIHF1aWVzY2VudCBmbGFnCisJICovCisJYXRvbWljX3NldCgmYWRhcHRlci0+cXVpZXNjZW50LCAwKTsKKworCWhiYV9zb2Z0X3N0YXRlW2hiYV9jb3VudF0gPSBhZGFwdGVyOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggbmVlZHMgdG8gYmUgcGFzc2VkIGJhY2sgdG8gdGhlCisJICogYXBwbGljYXRpb24gd2hlbiBpdCBkb2VzIGFuIGlvY3RsKCkgZm9yIGNvbnRyb2xsZXIgcmVsYXRlZAorCSAqIGluZm9ybWF0aW9uLgorCSAqLworCWkgPSBoYmFfY291bnQ7CisKKwltY29udHJvbGxlcltpXS5iYXNlID0gbWVnYV9iYXNlcG9ydDsKKwltY29udHJvbGxlcltpXS5pcnEgPSBpcnE7CisJbWNvbnRyb2xsZXJbaV0ubnVtbGRydiA9IGFkYXB0ZXItPm51bWxkcnY7CisJbWNvbnRyb2xsZXJbaV0ucGNpYnVzID0gcGNpX2J1czsKKwltY29udHJvbGxlcltpXS5wY2lkZXYgPSBpZC0+ZGV2aWNlOworCW1jb250cm9sbGVyW2ldLnBjaWZ1biA9IFBDSV9GVU5DIChwY2lfZGV2X2Z1bmMpOworCW1jb250cm9sbGVyW2ldLnBjaWlkID0gLTE7CisJbWNvbnRyb2xsZXJbaV0ucGNpdmVuZG9yID0gaWQtPnZlbmRvcjsKKwltY29udHJvbGxlcltpXS5wY2lzbG90ID0gUENJX1NMT1QocGNpX2Rldl9mdW5jKTsKKwltY29udHJvbGxlcltpXS51aWQgPSAocGNpX2J1cyA8PCA4KSB8IHBjaV9kZXZfZnVuYzsKKworCisJLyogU2V0IHRoZSBNb2RlIG9mIGFkZHJlc3NpbmcgdG8gNjQgYml0IGlmIHdlIGNhbiAqLworCWlmICgoYWRhcHRlci0+ZmxhZyAmIEJPQVJEXzY0QklUKSAmJiAoc2l6ZW9mKGRtYV9hZGRyX3QpID09IDgpKSB7CisJCXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKTsKKwkJYWRhcHRlci0+aGFzXzY0Yml0X2FkZHIgPSAxOworCX0gZWxzZSAgeworCQlwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmYpOworCQlhZGFwdGVyLT5oYXNfNjRiaXRfYWRkciA9IDA7CisJfQorCQkKKwlpbml0X01VVEVYKCZhZGFwdGVyLT5pbnRfbXR4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhZGFwdGVyLT5pbnRfd2FpdHEpOworCisJYWRhcHRlci0+dGhpc19pZCA9IERFRkFVTFRfSU5JVElBVE9SX0lEOworCWFkYXB0ZXItPmhvc3QtPnRoaXNfaWQgPSBERUZBVUxUX0lOSVRJQVRPUl9JRDsKKworI2lmIE1FR0FfSEFWRV9DTFVTVEVSSU5HCisJLyoKKwkgKiBJcyBjbHVzdGVyIHN1cHBvcnQgZW5hYmxlZCBvbiB0aGlzIGNvbnRyb2xsZXIKKwkgKiBOb3RlOiBJbiBhIGNsdXN0ZXIgdGhlIEhCQXMgKCB0aGUgaW5pdGlhdG9ycyApIHdpbGwgaGF2ZQorCSAqIGRpZmZlcmVudCB0YXJnZXQgSURzIGFuZCB3ZSBjYW5ub3QgYXNzdW1lIGl0IHRvIGJlIDcuIENhbGwKKwkgKiB0byBtZWdhX3N1cHBvcnRfY2x1c3RlcigpIHdpbGwgZ2V0IHRoZSB0YXJnZXQgaWRzIGFsc28gaWYKKwkgKiB0aGUgY2x1c3RlciBzdXBwb3J0IGlzIGF2YWlsYWJsZQorCSAqLworCWFkYXB0ZXItPmhhc19jbHVzdGVyID0gbWVnYV9zdXBwb3J0X2NsdXN0ZXIoYWRhcHRlcik7CisJaWYgKGFkYXB0ZXItPmhhc19jbHVzdGVyKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJIm1lZ2FyYWlkOiBDbHVzdGVyIGRyaXZlciwgaW5pdGlhdG9yIGlkOiVkXG4iLAorCQkJYWRhcHRlci0+dGhpc19pZCk7CisJfQorI2VuZGlmCisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CisKKwltZWdhX2NyZWF0ZV9wcm9jX2VudHJ5KGhiYV9jb3VudCwgbWVnYV9wcm9jX2Rpcl9lbnRyeSk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9mcmVlX21ib3g7CisKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwloYmFfY291bnQrKzsKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlX21ib3g6CisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsIHNpemVvZihtYm94NjRfdCksCisJCQlhZGFwdGVyLT51bmFfbWJveDY0LCBhZGFwdGVyLT51bmFfbWJveDY0X2RtYSk7Cisgb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGFkYXB0ZXItPmhvc3QtPmlycSwgYWRhcHRlcik7Cisgb3V0X2ZyZWVfc2NiX2xpc3Q6CisJa2ZyZWUoYWRhcHRlci0+c2NiX2xpc3QpOworIG91dF9mcmVlX2NtZF9idWZmZXI6CisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsIE1FR0FfQlVGRkVSX1NJWkUsCisJCQlhZGFwdGVyLT5tZWdhX2J1ZmZlciwgYWRhcHRlci0+YnVmX2RtYV9oYW5kbGUpOworIG91dF9ob3N0X3B1dDoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworIG91dF9pb3VubWFwOgorCWlmIChmbGFnICYgQk9BUkRfTUVNTUFQKQorCQlpb3VubWFwKCh2b2lkICopbWVnYV9iYXNlcG9ydCk7Cisgb3V0X3JlbGVhc2VfcmVnaW9uOgorCWlmIChmbGFnICYgQk9BUkRfTUVNTUFQKQorCQlyZWxlYXNlX21lbV9yZWdpb24odGJhc2UsIDEyOCk7CisJZWxzZQorCQlyZWxlYXNlX3JlZ2lvbihtZWdhX2Jhc2Vwb3J0LCAxNik7Cisgb3V0X2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZAorX19tZWdhcmFpZF9zaHV0ZG93bihhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJdV9jaGFyCXJhd19tYm94W3NpemVvZihzdHJ1Y3QgbWJveF9vdXQpXTsKKwltYm94X3QJKm1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisJaW50CWk7CisKKwkvKiBGbHVzaCBhZGFwdGVyIGNhY2hlICovCisJbWVtc2V0KCZtYm94LT5tX291dCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisJcmF3X21ib3hbMF0gPSBGTFVTSF9BREFQVEVSOworCisJZnJlZV9pcnEoYWRhcHRlci0+aG9zdC0+aXJxLCBhZGFwdGVyKTsKKworCS8qIElzc3VlIGEgYmxvY2tpbmcgKGludGVycnVwdHMgZGlzYWJsZWQpIGNvbW1hbmQgdG8gdGhlIGNhcmQgKi8KKwlpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpOworCisJLyogRmx1c2ggZGlza3MgY2FjaGUgKi8KKwltZW1zZXQoJm1ib3gtPm1fb3V0LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKwlyYXdfbWJveFswXSA9IEZMVVNIX1NZU1RFTTsKKworCS8qIElzc3VlIGEgYmxvY2tpbmcgKGludGVycnVwdHMgZGlzYWJsZWQpIGNvbW1hbmQgdG8gdGhlIGNhcmQgKi8KKwlpc3N1ZV9zY2JfYmxvY2soYWRhcHRlciwgcmF3X21ib3gpOworCQorCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cGVuZF9jbWRzKSA+IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBwZW5kaW5nIGNvbW1hbmRzISFcbiIpOworCisJLyoKKwkgKiBIYXZlIGEgZGVsaWJyYXRlIGRlbGF5IHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGNhY2hlcyBhcmUKKwkgKiBhY3R1YWxseSBmbHVzaGVkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gMTA7IGkrKykKKwkJbWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IChhZGFwdGVyX3QgKilob3N0LT5ob3N0ZGF0YTsKKwljaGFyCWJ1ZlsxMl0gPSB7IDAgfTsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwlfX21lZ2FyYWlkX3NodXRkb3duKGFkYXB0ZXIpOworCisJLyogRnJlZSBvdXIgcmVzb3VyY2VzICovCisJaWYgKGFkYXB0ZXItPmZsYWcgJiBCT0FSRF9NRU1NQVApIHsKKwkJaW91bm1hcCgodm9pZCAqKWFkYXB0ZXItPmJhc2UpOworCQlyZWxlYXNlX21lbV9yZWdpb24oYWRhcHRlci0+aG9zdC0+YmFzZSwgMTI4KTsKKwl9IGVsc2UKKwkJcmVsZWFzZV9yZWdpb24oYWRhcHRlci0+YmFzZSwgMTYpOworCisJbWVnYV9mcmVlX3NnbChhZGFwdGVyKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYgKGFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXQiLCBhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImNvbmZpZyIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWlsYm94IiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKyNpZiBNRUdBX0hBVkVfRU5IX1BST0MKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlYnVpbGQtcmF0ZSIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJiYXR0ZXJ5LXN0YXR1cyIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRpc2tkcml2ZXMtY2gwIiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRpc2tkcml2ZXMtY2gxIiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRpc2tkcml2ZXMtY2gyIiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRpc2tkcml2ZXMtY2gzIiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKworCQlyZW1vdmVfcHJvY19lbnRyeSgicmFpZGRyaXZlcy0wLTkiLAorCQkJCWFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmFpZGRyaXZlcy0xMC0xOSIsCisJCQkJYWRhcHRlci0+Y29udHJvbGxlcl9wcm9jX2Rpcl9lbnRyeSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyYWlkZHJpdmVzLTIwLTI5IiwKKwkJCQlhZGFwdGVyLT5jb250cm9sbGVyX3Byb2NfZGlyX2VudHJ5KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJhaWRkcml2ZXMtMzAtMzkiLAorCQkJCWFkYXB0ZXItPmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnkpOworI2VuZGlmCisJCXNwcmludGYoYnVmLCAiaGJhJWQiLCBhZGFwdGVyLT5ob3N0LT5ob3N0X25vKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYnVmLCBtZWdhX3Byb2NfZGlyX2VudHJ5KTsKKwl9CisjZW5kaWYKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+ZGV2LCBNRUdBX0JVRkZFUl9TSVpFLAorCQkJYWRhcHRlci0+bWVnYV9idWZmZXIsIGFkYXB0ZXItPmJ1Zl9kbWFfaGFuZGxlKTsKKwlrZnJlZShhZGFwdGVyLT5zY2JfbGlzdCk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5kZXYsIHNpemVvZihtYm94NjRfdCksCisJCQlhZGFwdGVyLT51bmFfbWJveDY0LCBhZGFwdGVyLT51bmFfbWJveDY0X2RtYSk7CisKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWhiYV9jb3VudC0tOworfQorCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopaG9zdC0+aG9zdGRhdGE7CisKKwlfX21lZ2FyYWlkX3NodXRkb3duKGFkYXB0ZXIpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWVnYXJhaWRfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX0RFTEwsIFBDSV9ERVZJQ0VfSURfRElTQ09WRVJZLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9ERUxMLCBQQ0lfREVWSUNFX0lEX1BFUkM0X0RJLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCT0FSRF82NEJJVH0sCisJe1BDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX1BFUkM0X1FDX1ZFUkRFLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCT0FSRF82NEJJVH0sCisJe1BDSV9WRU5ET1JfSURfQU1JLCBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfQU1JLCBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0FNSSwgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtZWdhcmFpZF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG1lZ2FyYWlkX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm1lZ2FyYWlkIiwKKwkuaWRfdGFibGUJPSBtZWdhcmFpZF9wY2lfdGJsLAorCS5wcm9iZQkJPSBtZWdhcmFpZF9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtZWdhcmFpZF9yZW1vdmVfb25lKSwKKwkuZHJpdmVyCQk9IHsKKwkJLnNodXRkb3duID0gbWVnYXJhaWRfc2h1dGRvd24sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1lZ2FyYWlkX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoKG1heF9jbWRfcGVyX2x1biA8PSAwKSB8fCAobWF4X2NtZF9wZXJfbHVuID4gTUFYX0NNRF9QRVJfTFVOKSkKKwkJbWF4X2NtZF9wZXJfbHVuID0gTUFYX0NNRF9QRVJfTFVOOworCWlmIChtYXhfbWJveF9idXN5X3dhaXQgPiBNQk9YX0JVU1lfV0FJVCkKKwkJbWF4X21ib3hfYnVzeV93YWl0ID0gTUJPWF9CVVNZX1dBSVQ7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCW1lZ2FfcHJvY19kaXJfZW50cnkgPSBwcm9jX21rZGlyKCJtZWdhcmFpZCIsICZwcm9jX3Jvb3QpOworCWlmICghbWVnYV9wcm9jX2Rpcl9lbnRyeSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBmYWlsZWQgdG8gY3JlYXRlIG1lZ2FyYWlkIHJvb3RcbiIpOworCX0KKyNlbmRpZgorCWVycm9yID0gcGNpX21vZHVsZV9pbml0KCZtZWdhcmFpZF9wY2lfZHJpdmVyKTsKKwlpZiAoZXJyb3IpIHsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCQlyZW1vdmVfcHJvY19lbnRyeSgibWVnYXJhaWQiLCAmcHJvY19yb290KTsKKyNlbmRpZgorCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgZHJpdmVyIGFzIGEgY2hhcmFjdGVyIGRldmljZSwgZm9yIGFwcGxpY2F0aW9ucworCSAqIHRvIGFjY2VzcyBpdCBmb3IgaW9jdGxzLgorCSAqIEZpcnN0IGFyZ3VtZW50IChtYWpvcikgdG8gcmVnaXN0ZXJfY2hyZGV2IGltcGxpZXMgYSBkeW5hbWljCisJICogbWFqb3IgbnVtYmVyIGFsbG9jYXRpb24uCisJICovCisJbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgIm1lZ2FkZXYiLCAmbWVnYWRldl9mb3BzKTsKKwlpZiAoIW1ham9yKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQ6IGZhaWxlZCB0byByZWdpc3RlciBjaGFyIGRldmljZVxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZWdhcmFpZF9leGl0KHZvaWQpCit7CisJLyoKKwkgKiBVbnJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZSB0byB0aGUgZHJpdmVyLgorCSAqLworCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCAibWVnYWRldiIpOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtZWdhcmFpZF9wY2lfZHJpdmVyKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcmVtb3ZlX3Byb2NfZW50cnkoIm1lZ2FyYWlkIiwgJnByb2Nfcm9vdCk7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQobWVnYXJhaWRfaW5pdCk7Cittb2R1bGVfZXhpdChtZWdhcmFpZF9leGl0KTsKKworLyogdmk6IHNldCB0cz04IHN3PTggdHc9Nzg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWM0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaApAQCAtMCwwICsxLDEwNzEgQEAKKyNpZm5kZWYgX19NRUdBUkFJRF9IX18KKyNkZWZpbmUgX19NRUdBUkFJRF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKworI2RlZmluZSBNRUdBUkFJRF9WRVJTSU9OCVwKKwkidjIuMDAuMyAoUmVsZWFzZSBEYXRlOiBXZWQgRmViIDE5IDA4OjUxOjMwIEVTVCAyMDAzKVxuIgorCisvKgorICogRHJpdmVyIGZlYXR1cmVzIC0gY2hhbmdlIHRoZSB2YWx1ZXMgdG8gZW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZXMgaW4gdGhlCisgKiBkcml2ZXIuCisgKi8KKworLyoKKyAqIENvbWFuZCBjb2FsZXNjaW5nIC0gVGhpcyBmZWF0dXJlIGFsbG93cyB0aGUgZHJpdmVyIHRvIGJlIGFibGUgdG8gY29tYmluZQorICogdHdvIG9yIG1vcmUgY29tbWFuZHMgYW5kIGlzc3VlIGFzIG9uZSBjb21tYW5kIGluIG9yZGVyIHRvIGJvb3N0IEkvTworICogcGVyZm9ybWFuY2UuIFVzZWZ1bCBpZiB0aGUgbmF0dXJlIG9mIHRoZSBJL08gaXMgc2VxdWVudGlhbC4gSXQgaXMgbm90IHZlcnkKKyAqIHVzZWZ1bCBmb3IgcmFuZG9tIG5hdHVyZWQgSS9Pcy4KKyAqLworI2RlZmluZSBNRUdBX0hBVkVfQ09BTEVTQ0lORwkwCisKKy8qCisgKiBDbHVzdGVyaW5nIHN1cHBvcnQgLSBTZXQgdGhpcyBmbGFnIGlmIHlvdSBhcmUgcGxhbm5pbmcgdG8gdXNlIHRoZQorICogY2x1c3RlcmluZyBzZXJ2aWNlcyBwcm92aWRlZCBieSB0aGUgbWVnYXJhaWQgY29udHJvbGxlcnMgYW5kIHBsYW5uaW5nIHRvCisgKiBzZXR1cCBhIGNsdXN0ZXIKKyAqLworI2RlZmluZSBNRUdBX0hBVkVfQ0xVU1RFUklORwkxCisKKy8qCisgKiBEcml2ZXIgc3RhdGlzdGljcyAtIFNldCB0aGlzIGZsYWcgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHN0YXRpY3MgYWJvdXQKKyAqIG51bWJlciBvZiBJL08gY29tcGxldGVkIG9uIGVhY2ggbG9naWNhbCBkcml2ZSBhbmQgaG93IG1hbnkgaW50ZXJydXB0cworICogZ2VuZXJhdGVkLiBJZiBlbmFibGVkLCB0aGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0aHJvdWdoIC9wcm9jCisgKiBpbnRlcmZhY2UgYW5kIHRocm91Z2ggdGhlIHByaXZhdGUgaW9jdGwuIFNldHRpbmcgdGhpcyBmbGFnIGhhcyBhCisgKiBwZXJmb3JtYW5jZSBwZW5hbHR5LgorICovCisjZGVmaW5lIE1FR0FfSEFWRV9TVEFUUwkJMAorCisvKgorICogRW5oYW5jZWQgL3Byb2MgaW50ZXJmYWNlIC0gVGhpcyBmZWF0dXJlIHdpbGwgYWxsb3cgeW91IHRvIGhhdmUgYSBtb3JlCisgKiBkZXRhaWxlZCAvcHJvYyBpbnRlcmZhY2UgZm9yIG1lZ2FyYWlkIGRyaXZlci4gRS5nLiwgYSByZWFsIHRpbWUgdXBkYXRlIG9mCisgKiB0aGUgc3RhdHVzIG9mIHRoZSBsb2dpY2FsIGRyaXZlcywgYmF0dGVyeSBzdGF0dXMsIHBoeXNpY2FsIGRyaXZlcyBldGMuCisgKi8KKyNkZWZpbmUgTUVHQV9IQVZFX0VOSF9QUk9DCTEKKworI2RlZmluZSBNQVhfREVWX1RZUEUJMzIKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQwkJMHgxMDAwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FNSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNSQkJMHgxMDFFCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0RFTEwKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ERUxMCQkweDEwMjgKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfSU5URUwKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFTAkJMHg4MDg2CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRAkweDkwMTAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDIJMHg5MDYwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzCTB4MTk2MAorI2VuZGlmCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ESVNDT1ZFUlkJCTB4MDAwRQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0X0RJCQkweDAwMEYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNF9RQ19WRVJERQkweDA0MDcKKworLyogU3ViLVN5c3RlbSBWZW5kb3IgSURzICovCisjZGVmaW5lCUFNSV9TVUJTWVNfVklECQkJMHgxMDFFCisjZGVmaW5lIERFTExfU1VCU1lTX1ZJRAkJCTB4MTAyOAorI2RlZmluZQlIUF9TVUJTWVNfVklECQkJMHgxMDNDCisjZGVmaW5lIExTSV9TVUJTWVNfVklECQkJMHgxMDAwCisjZGVmaW5lIElOVEVMX1NVQlNZU19WSUQJCTB4ODA4NgorCisjZGVmaW5lIEhCQV9TSUdOQVRVUkUJICAgICAgCQkweDMzNDQKKyNkZWZpbmUgSEJBX1NJR05BVFVSRV80NzEJICAJMHhDQ0NDCisjZGVmaW5lIEhCQV9TSUdOQVRVUkVfNjRCSVQJCTB4MDI5OQorCisjZGVmaW5lIE1CT1hfQlVTWV9XQUlUCQkJMTAJLyogd2FpdCBmb3IgdXAgdG8gMTAgdXNlYyBmb3IKKwkJCQkJCSAgIG1haWxib3ggdG8gYmUgZnJlZSAqLworI2RlZmluZSBERUZBVUxUX0lOSVRJQVRPUl9JRAk3CisKKyNkZWZpbmUgTUFYX1NHTElTVAkJNjQJLyogbWF4IHN1cHBvcnRlZCBpbiBmL3cgKi8KKyNkZWZpbmUgTUlOX1NHTElTVAkJMjYJLyogZ3VhcmFudGVlZCB0byBzdXBwb3J0IHRoZXNlIG1hbnkgKi8KKyNkZWZpbmUgTUFYX0NPTU1BTkRTCQkxMjYKKyNkZWZpbmUgQ01ESURfSU5UX0NNRFMJCU1BWF9DT01NQU5EUysxCS8qIG1ha2Ugc3VyZSBDTURJRF9JTlRfQ01EUworCQkJCQkgCWlzIGxlc3MgdGhhbiBtYXggY29tbWFuZHMKKwkJCQkJCXN1cHBvcnRlZCBieSBhbnkgZi93ICovCisKKyNkZWZpbmUgTUFYX0NEQl9MRU4JICAgICAJMTAKKyNkZWZpbmUgTUFYX0VYVF9DREJfTEVOCQkxNgkvKiB3ZSBzdXBwb3J0IGNkYiBsZW5ndGggdXAgdG8gMTYgKi8KKworI2RlZmluZSBERUZfQ01EX1BFUl9MVU4JCTYzCisjZGVmaW5lIE1BWF9DTURfUEVSX0xVTgkJTUFYX0NPTU1BTkRTCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9TVEFUVVMJNDYKKyNkZWZpbmUgTUFYX1hGRVJfUEVSX0NNRAkoNjQqMTAyNCkKKyNkZWZpbmUgTUFYX1NFQ1RPUlNfUEVSX0lPCTEyOAorCisjZGVmaW5lIE1BWF9MT0dJQ0FMX0RSSVZFU180MExECQk0MAorI2RlZmluZSBGQ19NQVhfUEhZU0lDQUxfREVWSUNFUwkJMjU2CisjZGVmaW5lIE1BWF9MT0dJQ0FMX0RSSVZFU184TEQJCTgKKyNkZWZpbmUgTUFYX0NIQU5ORUxTCQkJNQorI2RlZmluZSBNQVhfVEFSR0VUCQkJMTUKKyNkZWZpbmUgTUFYX1BIWVNJQ0FMX0RSSVZFUwkJTUFYX0NIQU5ORUxTKk1BWF9UQVJHRVQKKyNkZWZpbmUgTUFYX1JPV19TSVpFXzQwTEQJCTMyCisjZGVmaW5lIE1BWF9ST1dfU0laRV84TEQJCTgKKyNkZWZpbmUgTUFYX1NQQU5fREVQVEgJCQk4CisKKyNkZWZpbmUgTlZJUlRfQ0hBTgkJNAkvKiAjIG9mIHZpcnR1YWwgY2hhbm5lbHMgdG8gcmVwcmVzZW50CisJCQkJCSAgIHVwIHRvIDYwIGxvZ2ljYWwgZHJpdmVzICovCitzdHJ1Y3QgbWJveF9vdXQgeworCS8qIDB4MCAqLyB1OCBjbWQ7CisJLyogMHgxICovIHU4IGNtZGlkOworCS8qIDB4MiAqLyB1MTYgbnVtc2VjdG9yczsKKwkvKiAweDQgKi8gdTMyIGxiYTsKKwkvKiAweDggKi8gdTMyIHhmZXJhZGRyOworCS8qIDB4QyAqLyB1OCBsb2dkcnY7CisJLyogMHhEICovIHU4IG51bXNnZWxlbWVudHM7CisJLyogMHhFICovIHU4IHJlc3ZkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtYm94X2luIHsKKwkvKiAweEYgKi8gdm9sYXRpbGUgdTggYnVzeTsKKwkvKiAweDEwICovIHZvbGF0aWxlIHU4IG51bXN0YXR1czsKKwkvKiAweDExICovIHZvbGF0aWxlIHU4IHN0YXR1czsKKwkvKiAweDEyICovIHZvbGF0aWxlIHU4IGNvbXBsZXRlZFtNQVhfRklSTVdBUkVfU1RBVFVTXTsKKwl2b2xhdGlsZSB1OCBwb2xsOworCXZvbGF0aWxlIHU4IGFjazsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IG1ib3hfb3V0CW1fb3V0OworCXN0cnVjdCBtYm94X2luCW1faW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtYm94X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgeGZlcl9zZWdtZW50X2xvOworCXUzMiB4ZmVyX3NlZ21lbnRfaGk7CisJbWJveF90IG1ib3g7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtYm94NjRfdDsKKworCisvKgorICogUGFzc3RocnUgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBNQVhfUkVRX1NFTlNFX0xFTiAgICAgICAweDIwCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCB0aW1lb3V0OjM7CQkvKiAwPTZzZWMvMT02MHNlYy8yPTEwbWluLzM9M2hycyAqLworCXU4IGFyczoxOworCXU4IHJlc2VydmVkOjM7CisJdTggaXNsb2dpY2FsOjE7CisJdTggbG9nZHJ2OwkJLyogaWYgaXNsb2dpY2FsID09IDEgKi8KKwl1OCBjaGFubmVsOwkJLyogaWYgaXNsb2dpY2FsID09IDAgKi8KKwl1OCB0YXJnZXQ7CQkvKiBpZiBpc2xvZ2ljYWwgPT0gMCAqLworCXU4IHF1ZXVldGFnOwkJLyogdW51c2VkICovCisJdTggcXVldWVhY3Rpb247CQkvKiB1bnVzZWQgKi8KKwl1OCBjZGJbTUFYX0NEQl9MRU5dOworCXU4IGNkYmxlbjsKKwl1OCByZXFzZW5zZWxlbjsKKwl1OCByZXFzZW5zZWFyZWFbTUFYX1JFUV9TRU5TRV9MRU5dOworCXU4IG51bXNnZWxlbWVudHM7CisJdTggc2NzaXN0YXR1czsKKwl1MzIgZGF0YXhmZXJhZGRyOworCXUzMiBkYXRheGZlcmxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FfcGFzc3RocnU7CisKKworLyoKKyAqIEV4dGVuZGVkIHBhc3N0aHJ1OiBzdXBwb3J0IENEQiA+IDEwIGJ5dGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCB0aW1lb3V0OjM7CQkvKiAwPTZzZWMvMT02MHNlYy8yPTEwbWluLzM9M2hycyAqLworCXU4IGFyczoxOworCXU4IHJzdmQxOjE7CisJdTggY2Rfcm9tOjE7CisJdTggcnN2ZDI6MTsKKwl1OCBpc2xvZ2ljYWw6MTsKKwl1OCBsb2dkcnY7CQkvKiBpZiBpc2xvZ2ljYWwgPT0gMSAqLworCXU4IGNoYW5uZWw7CQkvKiBpZiBpc2xvZ2ljYWwgPT0gMCAqLworCXU4IHRhcmdldDsJCS8qIGlmIGlzbG9naWNhbCA9PSAwICovCisJdTggcXVldWV0YWc7CQkvKiB1bnVzZWQgKi8KKwl1OCBxdWV1ZWFjdGlvbjsJCS8qIHVudXNlZCAqLworCXU4IGNkYmxlbjsKKwl1OCByc3ZkMzsKKwl1OCBjZGJbTUFYX0VYVF9DREJfTEVOXTsKKwl1OCBudW1zZ2VsZW1lbnRzOworCXU4IHN0YXR1czsKKwl1OCByZXFzZW5zZWxlbjsKKwl1OCByZXFzZW5zZWFyZWFbTUFYX1JFUV9TRU5TRV9MRU5dOworCXU4IHJzdmQ0OworCXUzMiBkYXRheGZlcmFkZHI7CisJdTMyIGRhdGF4ZmVybGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9leHRfcGFzc3RocnU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1NjQgYWRkcmVzczsKKwl1MzIgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9zZ2w2NDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBhZGRyZXNzOworCXUzMiBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhX3NnbGlzdDsKKworCisvKiBRdWV1ZWQgY29tbWFuZCBkYXRhICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CWlkeDsKKwl1MzIJc3RhdGU7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXU4CXJhd19tYm94WzY2XTsKKwl1MzIJZG1hX3R5cGU7CisJdTMyCWRtYV9kaXJlY3Rpb247CisKKwlTY3NpX0NtbmQJKmNtZDsKKwlkbWFfYWRkcl90CWRtYV9oX2J1bGtkYXRhOworCWRtYV9hZGRyX3QJZG1hX2hfc2dkYXRhOworCisJbWVnYV9zZ2xpc3QJKnNnbDsKKwltZWdhX3NnbDY0CSpzZ2w2NDsKKwlkbWFfYWRkcl90CXNnbF9kbWFfYWRkcjsKKworCW1lZ2FfcGFzc3RocnUJCSpwdGhydTsKKwlkbWFfYWRkcl90CQlwdGhydV9kbWFfYWRkcjsKKwltZWdhX2V4dF9wYXNzdGhydQkqZXB0aHJ1OworCWRtYV9hZGRyX3QJCWVwdGhydV9kbWFfYWRkcjsKK30gc2NiX3Q7CisKKy8qCisgKiBGbGFncyB0byBmb2xsb3cgdGhlIHNjYiBhcyBpdCB0cmFuc2l0aW9ucyBiZXR3ZWVuIHZhcmlvdXMgc3RhZ2VzCisgKi8KKyNkZWZpbmUgU0NCX0ZSRUUJMHgwMDAwCS8qIG9uIHRoZSBmcmVlIGxpc3QgKi8KKyNkZWZpbmUgU0NCX0FDVElWRQkweDAwMDEJLyogb2ZmIHRoZSBmcmVlIGxpc3QgKi8KKyNkZWZpbmUgU0NCX1BFTkRRCTB4MDAwMgkvKiBvbiB0aGUgcGVuZGluZyBxdWV1ZSAqLworI2RlZmluZSBTQ0JfSVNTVUVECTB4MDAwNAkvKiBpc3N1ZWQgLSBvd25lciBmL3cgKi8KKyNkZWZpbmUgU0NCX0FCT1JUCTB4MDAwOAkvKiBHb3QgYW4gYWJvcnQgZm9yIHRoaXMgb25lICovCisjZGVmaW5lIFNDQl9SRVNFVAkweDAwMTAJLyogR290IGEgcmVzZXQgZm9yIHRoaXMgb25lICovCisKKy8qCisgKiBVdGlsaXRpZXMgZGVjbGFyZSB0aGlzIHN0cmN0dXJlIHNpemUgYXMgMTAyNCBieXRlcy4gU28gbW9yZSBmaWVsZHMgY2FuCisgKiBiZSBhZGRlZCBpbiBmdXR1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIJZGF0YV9zaXplOyAvKiBjdXJyZW50IHNpemUgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgcmVzdmQpICovCisKKwl1MzIJY29uZmlnX3NpZ25hdHVyZTsKKwkJLyogQ3VycmVudCB2YWx1ZSBpcyAweDAwMjgyMDA4CisJCSAqIDB4Mjg9TUFYX0xPR0lDQUxfRFJJVkVTLAorCQkgKiAweDIwPU51bWJlciBvZiBzdHJpcGVzIGFuZAorCQkgKiAweDA4PU51bWJlciBvZiBzcGFucyAqLworCisJdTgJZndfdmVyc2lvblsxNl07CQkvKiBwcmludGFibGUgQVNDSSBzdHJpbmcgKi8KKwl1OAliaW9zX3ZlcnNpb25bMTZdOwkvKiBwcmludGFibGUgQVNDSSBzdHJpbmcgKi8KKwl1OAlwcm9kdWN0X25hbWVbODBdOwkvKiBwcmludGFibGUgQVNDSSBzdHJpbmcgKi8KKworCXU4CW1heF9jb21tYW5kczsJCS8qIE1heC4gY29uY3VycmVudCBjb21tYW5kcyBzdXBwb3J0ZWQgKi8KKwl1OAluY2hhbm5lbHM7CQkvKiBOdW1iZXIgb2YgU0NTSSBDaGFubmVscyBkZXRlY3RlZCAqLworCXU4CWZjX2xvb3BfcHJlc2VudDsJLyogTnVtYmVyIG9mIEZpYnJlIExvb3BzIGRldGVjdGVkICovCisJdTgJbWVtX3R5cGU7CQkvKiBFRE8sIEZQTSwgU0RSQU0gZXRjICovCisKKwl1MzIJc2lnbmF0dXJlOworCXUxNglkcmFtX3NpemU7CQkvKiBJbiB0ZXJtcyBvZiBNQiAqLworCXUxNglzdWJzeXNpZDsKKworCXUxNglzdWJzeXN2aWQ7CisJdTgJbm90aWZ5X2NvdW50ZXJzOworCXU4CXBhZDFrWzg4OV07CQkvKiAxMzUgKyA4ODkgcmVzdmQgPSAxMDI0IHRvdGFsIHNpemUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FfcHJvZHVjdF9pbmZvOworCitzdHJ1Y3Qgbm90aWZ5IHsKKwl1MzIgZ2xvYmFsX2NvdW50ZXI7CS8qIEFueSBjaGFuZ2UgaW5jcmVtZW50cyB0aGlzIGNvdW50ZXIgKi8KKworCXU4IHBhcmFtX2NvdW50ZXI7CS8qIEluZGljYXRlcyBhbnkgcGFyYW1zIGNoYW5nZWQgICovCisJdTggcGFyYW1faWQ7CQkvKiBQYXJhbSBtb2RpZmllZCAtIGRlZmluZWQgYmVsb3cgKi8KKwl1MTYgcGFyYW1fdmFsOwkJLyogTmV3IHZhbCBvZiBsYXN0IHBhcmFtIG1vZGlmaWVkICovCisKKwl1OCB3cml0ZV9jb25maWdfY291bnRlcjsJLyogd3JpdGUgY29uZmlnIG9jY3VycmVkICovCisJdTggd3JpdGVfY29uZmlnX3JzdmRbM107CisKKwl1OCBsZHJ2X29wX2NvdW50ZXI7CS8qIEluZGljYXRlcyBsZHJ2IG9wIHN0YXJ0ZWQvY29tcGxldGVkICovCisJdTggbGRydl9vcGlkOwkJLyogbGRydiBudW0gKi8KKwl1OCBsZHJ2X29wY21kOwkJLyogbGRydiBvcGVyYXRpb24gLSBkZWZpbmVkIGJlbG93ICovCisJdTggbGRydl9vcHN0YXR1czsJLyogc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24gKi8KKworCXU4IGxkcnZfc3RhdGVfY291bnRlcjsJLyogSW5kaWNhdGVzIGNoYW5nZSBvZiBsZHJ2IHN0YXRlICovCisJdTggbGRydl9zdGF0ZV9pZDsJCS8qIGxkcnYgbnVtICovCisJdTggbGRydl9zdGF0ZV9uZXc7CS8qIE5ldyBzdGF0ZSAqLworCXU4IGxkcnZfc3RhdGVfb2xkOwkvKiBvbGQgc3RhdGUgKi8KKworCXU4IHBkcnZfc3RhdGVfY291bnRlcjsJLyogSW5kaWNhdGVzIGNoYW5nZSBvZiBsZHJ2IHN0YXRlICovCisJdTggcGRydl9zdGF0ZV9pZDsJCS8qIHBkcnYgaWQgKi8KKwl1OCBwZHJ2X3N0YXRlX25ldzsJLyogTmV3IHN0YXRlICovCisJdTggcGRydl9zdGF0ZV9vbGQ7CS8qIG9sZCBzdGF0ZSAqLworCisJdTggcGRydl9mbXRfY291bnRlcjsJLyogSW5kaWNhdGVzIHBkcnYgZm9ybWF0IHN0YXJ0ZWQvb3ZlciAqLworCXU4IHBkcnZfZm10X2lkOwkJLyogcGRydiBpZCAqLworCXU4IHBkcnZfZm10X3ZhbDsJCS8qIGZvcm1hdCBzdGFydGVkL292ZXIgKi8KKwl1OCBwZHJ2X2ZtdF9yc3ZkOworCisJdTggdGFyZ194ZmVyX2NvdW50ZXI7CS8qIEluZGljYXRlcyBTQ1NJLTIgWGZlciByYXRlIGNoYW5nZSAqLworCXU4IHRhcmdfeGZlcl9pZDsJLyogcGRydiBJZCAgKi8KKwl1OCB0YXJnX3hmZXJfdmFsOwkJLyogbmV3IFhmZXIgcGFyYW1zIG9mIGxhc3QgcGRydiAqLworCXU4IHRhcmdfeGZlcl9yc3ZkOworCisJdTggZmNsb29wX2lkX2NoZ19jb3VudGVyOwkvKiBJbmRpY2F0ZXMgbG9vcGlkIGNoYW5nZWQgKi8KKwl1OCBmY2xvb3BpZF9wZHJ2aWQ7CQkvKiBwZHJ2IGlkICovCisJdTggZmNsb29wX2lkMDsJCQkvKiBsb29waWQgb24gZmMgbG9vcCAwICovCisJdTggZmNsb29wX2lkMTsJCQkvKiBsb29waWQgb24gZmMgbG9vcCAxICovCisKKwl1OCBmY2xvb3Bfc3RhdGVfY291bnRlcjsJLyogSW5kaWNhdGVzIGxvb3Agc3RhdGUgY2hhbmdlZCAqLworCXU4IGZjbG9vcF9zdGF0ZTA7CQkvKiBzdGF0ZSBvZiBmYyBsb29wIDAgKi8KKwl1OCBmY2xvb3Bfc3RhdGUxOwkJLyogc3RhdGUgb2YgZmMgbG9vcCAxICovCisJdTggZmNsb29wX3N0YXRlX3JzdmQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBNQVhfTk9USUZZX1NJWkUgICAgIDB4ODAKKyNkZWZpbmUgQ1VSX05PVElGWV9TSVpFICAgICBzaXplb2Yoc3RydWN0IG5vdGlmeSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMglkYXRhX3NpemU7IC8qIGN1cnJlbnQgc2l6ZSBpbiBieXRlcyAobm90IGluY2x1ZGluZyByZXN2ZCkgKi8KKworCXN0cnVjdCBub3RpZnkgbm90aWZ5OworCisJdTgJbm90aWZ5X3JzdmRbTUFYX05PVElGWV9TSVpFIC0gQ1VSX05PVElGWV9TSVpFXTsKKworCXU4CXJlYnVpbGRfcmF0ZTsJCS8qIFJlYnVpbGQgcmF0ZSAoMCUgLSAxMDAlKSAqLworCXU4CWNhY2hlX2ZsdXNoX2ludGVydmFsOwkvKiBJbiB0ZXJtcyBvZiBTZWNvbmRzICovCisJdTgJc2Vuc2VfYWxlcnQ7CisJdTgJZHJpdmVfaW5zZXJ0X2NvdW50OwkvKiBkcml2ZSBpbnNlcnRpb24gY291bnQgKi8KKworCXU4CWJhdHRlcnlfc3RhdHVzOworCXU4CW51bV9sZHJ2OwkJLyogTm8uIG9mIExvZyBEcml2ZXMgY29uZmlndXJlZCAqLworCXU4CXJlY29uX3N0YXRlW01BWF9MT0dJQ0FMX0RSSVZFU180MExEIC8gOF07CS8qIFN0YXRlIG9mCisJCQkJCQkJICAgcmVjb25zdHJ1Y3QgKi8KKwl1MTYJbGRydl9vcF9zdGF0dXNbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQgLyA4XTsgLyogbG9nZHJ2CisJCQkJCQkJCSBTdGF0dXMgKi8KKworCXUzMglsZHJ2X3NpemVbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOy8qIFNpemUgb2YgZWFjaCBsb2cgZHJ2ICovCisJdTgJbGRydl9wcm9wW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1OAlsZHJ2X3N0YXRlW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsvKiBTdGF0ZSBvZiBsb2cgZHJpdmVzICovCisJdTgJcGRydl9zdGF0ZVtGQ19NQVhfUEhZU0lDQUxfREVWSUNFU107LyogU3RhdGUgb2YgcGh5cyBkcnZzLiAqLworCXUxNglwZHJ2X2Zvcm1hdFtGQ19NQVhfUEhZU0lDQUxfREVWSUNFUyAvIDE2XTsKKworCXU4CXRhcmdfeGZlcls4MF07CS8qIHBoeXMgZGV2aWNlIHRyYW5zZmVyIHJhdGUgKi8KKwl1OAlwYWQxa1syNjNdOwkvKiA3NjEgKyAyNjNyZXNlcnZlZCA9IDEwMjQgYnl0ZXMgdG90YWwgc2l6ZSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9pbnF1aXJ5MzsKKworCisvKiBTdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTgJbWF4X2NvbW1hbmRzOwkvKiBNYXggY29uY3VycmVudCBjb21tYW5kcyBzdXBwb3J0ZWQgKi8KKwl1OAlyZWJ1aWxkX3JhdGU7CS8qIFJlYnVpbGQgcmF0ZSAtIDAlIHRocnUgMTAwJSAqLworCXU4CW1heF90YXJnX3Blcl9jaGFuOwkvKiBNYXggdGFyZyBwZXIgY2hhbm5lbCAqLworCXU4CW5jaGFubmVsczsJLyogTnVtYmVyIG9mIGNoYW5uZWxzIG9uIEhCQSAqLworCXU4CWZ3X3ZlcnNpb25bNF07CS8qIEZpcm13YXJlIHZlcnNpb24gKi8KKwl1MTYJYWdlX29mX2ZsYXNoOwkvKiBOdW1iZXIgb2YgdGltZXMgRlcgaGFzIGJlZW4gZmxhc2hlZCAqLworCXU4CWNoaXBfc2V0X3ZhbHVlOwkvKiBDb250ZW50cyBvZiAweEMwMDAwODMyICovCisJdTgJZHJhbV9zaXplOwkvKiBJbiBNQiAqLworCXU4CWNhY2hlX2ZsdXNoX2ludGVydmFsOwkvKiBpbiBzZWNvbmRzICovCisJdTgJYmlvc192ZXJzaW9uWzRdOworCXU4CWJvYXJkX3R5cGU7CisJdTgJc2Vuc2VfYWxlcnQ7CisJdTgJd3JpdGVfY29uZmlnX2NvdW50OwkvKiBJbmNyZWFzZSB3aXRoIGV2ZXJ5IGNvbmZpZ3VyYXRpb24KKwkJCQkJICAgY2hhbmdlICovCisJdTgJZHJpdmVfaW5zZXJ0ZWRfY291bnQ7CS8qIEluY3JlYXNlIHdpdGggZXZlcnkgZHJpdmUgaW5zZXJ0ZWQKKwkJCQkJICovCisJdTgJaW5zZXJ0ZWRfZHJpdmU7CS8qIENoYW5uZWw6SWQgb2YgaW5zZXJ0ZWQgZHJpdmUgKi8KKwl1OAliYXR0ZXJ5X3N0YXR1czsJLyoKKwkJCQkgKiBCSVQgMDogYmF0dGVyeSBtb2R1bGUgbWlzc2luZworCQkJCSAqIEJJVCAxOiBWQkFECisJCQkJICogQklUIDI6IHRlbXByYXR1cmUgaGlnaAorCQkJCSAqIEJJVCAzOiBiYXR0ZXJ5IHBhY2sgbWlzc2luZworCQkJCSAqIEJJVCA0LDU6CisJCQkJICogICAwMCAtIGNoYXJnZSBjb21wbGV0ZQorCQkJCSAqICAgMDEgLSBmYXN0IGNoYXJnZSBpbiBwcm9ncmVzcworCQkJCSAqICAgMTAgLSBmYXN0IGNoYXJnZSBmYWlsCisJCQkJICogICAxMSAtIHVuZGVmaW5lZAorCQkJCSAqIEJpdCA2OiBjb3VudGVyID4gMTAwMAorCQkJCSAqIEJpdCA3OiBVbmRlZmluZWQKKwkJCQkgKi8KKwl1OAlkZWNfZmF1bHRfYnVzX2luZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhX2FkcF9pbmZvOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OAludW1fbGRydjsJLyogTnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzIGNvbmZpZ3VyZWQgKi8KKwl1OAlyc3ZkWzNdOworCXUzMglsZHJ2X3NpemVbTUFYX0xPR0lDQUxfRFJJVkVTXzhMRF07CisJdTgJbGRydl9wcm9wW01BWF9MT0dJQ0FMX0RSSVZFU184TERdOworCXU4CWxkcnZfc3RhdGVbTUFYX0xPR0lDQUxfRFJJVkVTXzhMRF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtZWdhX2xkcnZfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CXBkcnZfc3RhdGVbTUFYX1BIWVNJQ0FMX0RSSVZFU107CisJdTgJcnN2ZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FfcGRydl9pbmZvOworCisvKiBSQUlEIGlucXVpcnk6IE1haWxib3ggY29tbWFuZCAweDA1Ki8KK3R5cGVkZWYgc3RydWN0IHsKKwltZWdhX2FkcF9pbmZvCWFkYXB0ZXJfaW5mbzsKKwltZWdhX2xkcnZfaW5mbwlsb2dkcnZfaW5mbzsKKwltZWdhX3BkcnZfaW5mbwlwZHJ2X2luZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9pbnF1aXJ5OworCisKKy8qIFJBSUQgZXh0ZW5kZWQgaW5xdWlyeTogTWFpbGJveCBjb21tYW5kIDB4MDQqLwordHlwZWRlZiBzdHJ1Y3QgeworCW1yYWlkX2lucXVpcnkJcmFpZF9pbnE7CisJdTE2CXBoeXNfZHJ2X2Zvcm1hdFtNQVhfQ0hBTk5FTFNdOworCXU4CXN0YWNrX2F0dG47CisJdTgJbW9kZW1fc3RhdHVzOworCXU4CXJzdmRbMl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9leHRfaW5xdWlyeTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJdTgJY2hhbm5lbDsKKwl1OAl0YXJnZXQ7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFkcF9kZXZpY2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIJCXN0YXJ0X2JsazsJLyogc3RhcnRpbmcgYmxvY2sgKi8KKwl1MzIJCW51bV9ibGtzOwkvKiAjIG9mIGJsb2NrcyAqLworCWFkcF9kZXZpY2UJZGV2aWNlW01BWF9ST1dfU0laRV80MExEXTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYWRwX3NwYW5fNDBsZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMgkJc3RhcnRfYmxrOwkvKiBzdGFydGluZyBibG9jayAqLworCXUzMgkJbnVtX2Jsa3M7CS8qICMgb2YgYmxvY2tzICovCisJYWRwX2RldmljZQlkZXZpY2VbTUFYX1JPV19TSVpFXzhMRF07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFkcF9zcGFuXzhsZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CXNwYW5fZGVwdGg7CS8qIFRvdGFsICMgb2Ygc3BhbnMgKi8KKwl1OAlsZXZlbDsJCS8qIFJBSUQgbGV2ZWwgKi8KKwl1OAlyZWFkX2FoZWFkOwkvKiByZWFkIGFoZWFkLCBubyByZWFkIGFoZWFkLCBhZGFwdGl2ZSByZWFkCisJCQkJICAgYWhlYWQgKi8KKwl1OAlzdHJpcGVfc3o7CS8qIEVuY29kZWQgc3RyaXBlIHNpemUgKi8KKwl1OAlzdGF0dXM7CQkvKiBTdGF0dXMgb2YgdGhlIGxvZ2ljYWwgZHJpdmUgKi8KKwl1OAl3cml0ZV9tb2RlOwkvKiB3cml0ZSBtb2RlLCB3cml0ZV90aHJvdWdoL3dyaXRlX2JhY2sgKi8KKwl1OAlkaXJlY3RfaW87CS8qIGRpcmVjdCBpbyBvciB0aHJvdWdoIGNhY2hlICovCisJdTgJcm93X3NpemU7CS8qIE51bWJlciBvZiBzdHJpcGVzIGluIGEgcm93ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb2dkcnZfcGFyYW07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlsb2dkcnZfcGFyYW0JbHBhcmFtOworCWFkcF9zcGFuXzQwbGQJc3BhbltNQVhfU1BBTl9ERVBUSF07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxvZ2Rydl80MGxkOworCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nZHJ2X3BhcmFtCWxwYXJhbTsKKwlhZHBfc3Bhbl84bGQJc3BhbltNQVhfU1BBTl9ERVBUSF07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxvZ2Rydl84bGQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OAl0eXBlOwkJLyogVHlwZSBvZiB0aGUgZGV2aWNlICovCisJdTgJY3VyX3N0YXR1czsJLyogY3VycmVudCBzdGF0dXMgb2YgdGhlIGRldmljZSAqLworCXU4CXRhZ19kZXB0aDsJLyogTGV2ZWwgb2YgdGFnZ2luZyAqLworCXU4CXN5bmNfbmVnOwkvKiBzeW5jIG5lZ290aWF0aW9uIC0gRU5BQkxFIG9yIERJU0JBTEUgKi8KKwl1MzIJc2l6ZTsJCS8qIGNvbmZpZ3VyYWJsZSBzaXplIGluIHRlcm1zIG9mIDUxMiBieXRlCisJCQkJICAgYmxvY2tzICovCit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBoeXNfZHJ2OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTgJCW5sb2dfZHJpdmVzOwkJLyogbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzICovCisJdTgJCXJlc3ZkWzNdOworCWxvZ2Rydl80MGxkCWxkcnZbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOworCXBoeXNfZHJ2CXBkcnZbTUFYX1BIWVNJQ0FMX0RSSVZFU107Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRpc2tfYXJyYXlfNDBsZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CQlubG9nX2RyaXZlczsJLyogbnVtYmVyIG9mIGxvZ2ljYWwgZHJpdmVzICovCisJdTgJCXJlc3ZkWzNdOworCWxvZ2Rydl84bGQJbGRydltNQVhfTE9HSUNBTF9EUklWRVNfOExEXTsKKwlwaHlzX2RydglwZHJ2W01BWF9QSFlTSUNBTF9EUklWRVNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkaXNrX2FycmF5XzhsZDsKKworCisvKgorICogVXNlciBpb2N0bCBzdHJ1Y3R1cmUuCisgKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIHVzZWQgZm9yIFRyYWRpdGlvbmFsIE1ldGhvZCBpb2N0bCBpbnRlcmZhY2UKKyAqIGNvbW1hbmRzICgweDgwKSxBbHRlcm5hdGUgQnVmZmVyIE1ldGhvZCAoMHg4MSkgaW9jdGwgY29tbWFuZHMgYW5kIHRoZQorICogRHJpdmVyIGlvY3Rscy4KKyAqIFRoZSBEcml2ZXIgaW9jdGwgaW50ZXJmYWNlIGhhbmRsZXMgdGhlIGNvbW1hbmRzIGF0IHRoZSBkcml2ZXIgbGV2ZWwsCisgKiB3aXRob3V0IGJlaW5nIHNlbnQgdG8gdGhlIGNhcmQuCisgKi8KKy8qIHN5c3RlbSBjYWxsIGltcG9zZWQgbGltaXQuIENoYW5nZSBhY2NvcmRpbmdseSAqLworI2RlZmluZSBJT0NUTF9NQVhfREFUQUxFTiAgICAgICA0MDk2CisKK3N0cnVjdCB1aW9jdGxfdCB7CisJdTMyIGlubGVuOworCXUzMiBvdXRsZW47CisJdW5pb24geworCQl1OCBmY2FbMTZdOworCQlzdHJ1Y3QgeworCQkJdTggb3Bjb2RlOworCQkJdTggc3Vib3Bjb2RlOworCQkJdTE2IGFkYXBubzsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCQl1OCAqYnVmZmVyOworCQkJdTggcGFkWzRdOworI2VuZGlmCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCQkJdTggKmJ1ZmZlcjsKKyNlbmRpZgorCQkJdTMyIGxlbmd0aDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZmNzOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVpOworCXU4IG1ib3hbMThdOwkJLyogMTYgYnl0ZXMgKyAyIHN0YXR1cyBieXRlcyAqLworCW1lZ2FfcGFzc3RocnUgcHRocnU7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCWNoYXIgX191c2VyICpkYXRhOwkJLyogYnVmZmVyIDw9IDQwOTYgZm9yIDB4ODAgY29tbWFuZHMgKi8KKwljaGFyIHBhZFs0XTsKKyNlbmRpZgorI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwljaGFyIF9fdXNlciAqZGF0YTsKKyNlbmRpZgorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBzdHJ1Y3QgbWNvbnRyb2xsZXIgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cm9sbGVycyBpbiB0aGUKKyAqIHN5c3RlbS4gSXRzIHVwdG8gdGhlIGFwcGxpY2F0aW9uIGhvdyB0byB1c2UgdGhlIGluZm9ybWF0aW9uLiBXZSBhcmUgcGFzc2luZworICogYXMgbXVjaCBpbmZvIGFib3V0IHRoZSBjYXJkcyBhcyBwb3NzaWJsZSBhbmQgdXNlZnVsLiBCZWZvcmUgaXNzdWluZyB0aGUKKyAqIGNhbGwgdG8gZmluZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZHMsIHRoZSBhcHBsaWNhaXRvbiBuZWVkcyB0byBpc3N1ZSBhCisgKiBpb2N0bCBmaXJzdCB0byBmaW5kIG91dCB0aGUgbnVtYmVyIG9mIGNvbnRyb2xsZXJzIGluIHRoZSBzeXN0ZW0uCisgKi8KKyNkZWZpbmUgTUFYX0NPTlRST0xMRVJTIDMyCisKK3N0cnVjdCBtY29udHJvbGxlciB7CisJdTY0IGJhc2U7CisJdTggaXJxOworCXU4IG51bWxkcnY7CisJdTggcGNpYnVzOworCXUxNiBwY2lkZXY7CisJdTggcGNpZnVuOworCXUxNiBwY2lpZDsKKwl1MTYgcGNpdmVuZG9yOworCXU4IHBjaXNsb3Q7CisJdTMyIHVpZDsKK307CisKKy8qCisgKiBtYWlsYm94IHN0cnVjdHVyZSB1c2VkIGZvciBpbnRlcm5hbCBjb21tYW5kcworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTgJY21kOworCXU4CWNtZGlkOworCXU4CW9wY29kZTsKKwl1OAlzdWJvcGNvZGU7CisJdTMyCWxiYTsKKwl1MzIJeGZlcmFkZHI7CisJdTgJbG9nZHJ2OworCXU4CXJzdmRbM107CisJdTgJbnVtc3RhdHVzOworCXU4CXN0YXR1czsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1lZ2FjbWRfdDsKKworLyoKKyAqIERlZmluZXMgZm9yIERyaXZlciBJT0NUTCBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBNRUdBSU9DX01BR0lDICAJJ20nCisKKyNkZWZpbmUgTUVHQUlPQ19RTkFEQVAJCSdtJwkvKiBRdWVyeSAjIG9mIGFkYXB0ZXJzICovCisjZGVmaW5lIE1FR0FJT0NfUURSVlJWRVIJJ2UnCS8qIFF1ZXJ5IGRyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIE1FR0FJT0NfUUFEQVBJTkZPICAgCSdnJwkvKiBRdWVyeSBhZGFwdGVyIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE1LQURBUChhZGFwbm8pCSAgCShNRUdBSU9DX01BR0lDIDw8IDggfCAoYWRhcG5vKSApCisjZGVmaW5lIEdFVEFEQVAobWthZGFwKQkgCSggKG1rYWRhcCkgXiBNRUdBSU9DX01BR0lDIDw8IDggKQorCisvKgorICogRGVmaW5pdGlvbiBmb3IgdGhlIG5ldyBpb2N0bCBpbnRlcmZhY2UgKE5JVCkKKyAqLworCisvKgorICogVmVuZG9yIHNwZWNpZmljIEdyb3VwLTcgY29tbWFuZHMKKyAqLworI2RlZmluZSBWRU5ET1JfU1BFQ0lGSUNfQ09NTUFORFMJMHhFMAorI2RlZmluZSBNRUdBX0lOVEVSTkFMX0NNRAkJVkVORE9SX1NQRUNJRklDX0NPTU1BTkRTICsgMHgwMQorCisvKgorICogVGhlIGlvY3RsIGNvbW1hbmQuIE5vIG90aGVyIGNvbW1hbmQgc2hhbGwgYmUgdXNlZCBmb3IgdGhpcyBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBVU0NTSUNNRAlWRU5ET1JfU1BFQ0lGSUNfQ09NTUFORFMKKworLyoKKyAqIERhdGEgZGlyZWN0aW9uIGZsYWdzCisgKi8KKyNkZWZpbmUgVUlPQ19SRAkJMHgwMDAwMQorI2RlZmluZSBVSU9DX1dSCQkweDAwMDAyCisKKy8qCisgKiBpb2N0bCBvcGNvZGVzCisgKi8KKyNkZWZpbmUgTUJPWF9DTUQJMHgwMDAwMAkvKiBEQ01EIG9yIHBhc3N0aHJ1IGNvbW1hbmQgKi8KKyNkZWZpbmUgR0VUX0RSSVZFUl9WRVIJMHgxMDAwMAkvKiBHZXQgZHJpdmVyIHZlcnNpb24gKi8KKyNkZWZpbmUgR0VUX05fQURBUAkweDIwMDAwCS8qIEdldCBudW1iZXIgb2YgYWRhcHRlcnMgKi8KKyNkZWZpbmUgR0VUX0FEQVBfSU5GTwkweDMwMDAwCS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGFkYXB0ZXIgKi8KKyNkZWZpbmUgR0VUX0NBUAkJMHg0MDAwMAkvKiBHZXQgaW9jdGwgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIEdFVF9TVEFUUwkweDUwMDAwCS8qIEdldCBzdGF0aXN0aWNzLCBpbmNsdWRpbmcgZXJyb3IgaW5mbyAqLworCisKKy8qCisgKiBUaGUgaW9jdGwgc3RydWN0dXJlLgorICogTUJPWCBtYWNybyBjb252ZXJ0cyBhIG5pdGlvY3RsX3Qgc3RydWN0dXJlIHRvIG1lZ2FjbWRfdCBwb2ludGVyIGFuZAorICogTUJPWF9QIG1hY3JvIGNvbnZlcnRzIGEgbml0aW9jdGxfdCBwb2ludGVyIHRvIG1lZ2FjbWRfdCBwb2ludGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhcgkJc2lnbmF0dXJlWzhdOwkvKiBNdXN0IGNvbnRhaW4gIk1FR0FOSVQiICovCisJdTMyCQlvcGNvZGU7CQkvKiBvcGNvZGUgZm9yIHRoZSBjb21tYW5kICovCisJdTMyCQlhZGFwbm87CQkvKiBhZGFwdGVyIG51bWJlciAqLworCXVuaW9uIHsKKwkJdTgJX19yYXdfbWJveFsxOF07CisJCXZvaWQgX191c2VyICpfX3VhZGRyOyAvKiB4ZmVyYWRkciBmb3Igbm9uLW1ib3ggY21kcyAqLworCX1fX3VhOworCisjZGVmaW5lIHVpb2Nfcm1ib3gJX191YS5fX3Jhd19tYm94CisjZGVmaW5lIE1CT1godWlvYykJKChtZWdhY21kX3QgKikmKCh1aW9jKS5fX3VhLl9fcmF3X21ib3hbMF0pKQorI2RlZmluZSBNQk9YX1AodWlvYykJKChtZWdhY21kX3QgX191c2VyICopJigodWlvYyktPl9fdWEuX19yYXdfbWJveFswXSkpCisjZGVmaW5lIHVpb2NfdWFkZHIJX191YS5fX3VhZGRyCisKKwl1MzIJCXhmZXJsZW47CS8qIHhmZXJsZW4gZm9yIERDTUQgYW5kIG5vbi1tYm94CisJCQkJCSAgIGNvbW1hbmRzICovCisJdTMyCQlmbGFnczsJCS8qIGRhdGEgZGlyZWN0aW9uIGZsYWdzICovCit9bml0aW9jdGxfdDsKKworCisvKgorICogSS9PIHN0YXRpc3RpY3MgZm9yIHNvbWUgYXBwbGljYXRpb25zIGxpa2UgU05NUCBhZ2VudC4gVGhlIGNhbGxlciBtdXN0CisgKiBwcm92aWRlIHRoZSBudW1iZXIgb2YgbG9naWNhbCBkcml2ZXMgZm9yIHdoaWNoIHN0YXR1cyBzaG91bGQgYmUgcmVwb3J0ZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJbnVtX2xkcnY7CS8qIE51bWJlciBmb3IgbG9naWNhbCBkcml2ZXMgZm9yIHdoaWNoIHRoZQorCQkJCSAgIHN0YXR1cyBzaG91bGQgYmUgcmVwb3J0ZWQuICovCisJdTMyCW5yZWFkc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CS8qIG51bWJlciBvZiByZWFkcyBmb3IKKwkJCQkJCQllYWNoIGxvZ2ljYWwgZHJpdmUgKi8KKwl1MzIJbnJlYWRibG9ja3NbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOwkvKiBudW1iZXIgb2YgYmxvY2tzCisJCQkJCQkJcmVhZCBmb3IgZWFjaCBsb2dpY2FsCisJCQkJCQkJZHJpdmUgKi8KKwl1MzIJbndyaXRlc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CS8qIG51bWJlciBvZiB3cml0ZXMKKwkJCQkJCQlmb3IgZWFjaCBsb2dpY2FsCisJCQkJCQkJZHJpdmUgKi8KKwl1MzIJbndyaXRlYmxvY2tzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsJLyogbnVtYmVyIG9mIGJsb2NrcworCQkJCQkJCXdyaXRlcyBmb3IgZWFjaAorCQkJCQkJCWxvZ2ljYWwgZHJpdmUgKi8KKwl1MzIJcmRfZXJyb3JzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsJLyogbnVtYmVyIG9mIHJlYWQKKwkJCQkJCQkgICBlcnJvcnMgZm9yIGVhY2gKKwkJCQkJCQkgICBsb2dpY2FsIGRyaXZlICovCisJdTMyCXdyX2Vycm9yc1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRF07CS8qIG51bWJlciBvZiB3cml0ZQorCQkJCQkJCSAgIGVycm9ycyBmb3IgZWFjaAorCQkJCQkJCSAgIGxvZ2ljYWwgZHJpdmUgKi8KK31tZWdhc3RhdF90OworCisKK3N0cnVjdCBwcml2YXRlX2Jpb3NfZGF0YSB7CisJdTgJZ2VvbWV0cnk6NDsJLyoKKwkJCQkgKiBiaXRzIDAtMyAtIEJJT1MgZ2VvbWV0cnkKKwkJCQkgKiAweDAwMDEgLSAxR0IKKwkJCQkgKiAweDAwMTAgLSAyR0IKKwkJCQkgKiAweDEwMDAgLSA4R0IKKwkJCQkgKiBPdGhlcnMgdmFsdWVzIGFyZSBpbnZhbGlkCisJCQkJCQkJICovCisJdTgJdW51c2VkOjQ7CS8qIGJpdHMgNC03IGFyZSB1bnVzZWQgKi8KKwl1OAlib290X2RydjsJLyoKKwkJCQkgKiBsb2dpY2FsIGRyaXZlIHNldCBhcyBib290IGRyaXZlCisJCQkJICogMC4uNyAtIGZvciA4TEQgY2FyZHMKKwkJCQkgKiAwLi4zOSAtIGZvciA0MExEIGNhcmRzCisJCQkJICovCisJdTgJcnN2ZFsxMl07CisJdTE2CWNrc3VtOwkvKiAwLShzdW0gb2YgZmlyc3QgMTMgYnl0ZXMgb2YgdGhpcyBzdHJ1Y3R1cmUpICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisKKworLyoKKyAqIE1haWxib3ggYW5kIGZpcm13YXJlIGNvbW1hbmRzIGFuZCBzdWJvcGNvZGVzIHVzZWQgaW4gdGhpcyBkcml2ZXIuCisgKi8KKworI2RlZmluZSBNRUdBX01CT1hDTURfTFJFQUQJMHgwMQorI2RlZmluZSBNRUdBX01CT1hDTURfTFdSSVRFCTB4MDIKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX1BBU1NUSFJVCTB4MDMKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX0FEUEVYVElOUQkweDA0CisjZGVmaW5lIE1FR0FfTUJPWENNRF9BREFQVEVSSU5RCTB4MDUKKyNkZWZpbmUgTUVHQV9NQk9YQ01EX0xSRUFENjQJMHhBNworI2RlZmluZSBNRUdBX01CT1hDTURfTFdSSVRFNjQJMHhBOAorI2RlZmluZSBNRUdBX01CT1hDTURfUEFTU1RIUlU2NAkweEMzCisjZGVmaW5lIE1FR0FfTUJPWENNRF9FWFRQVEhSVQkweEUzCisKKyNkZWZpbmUgTUFJTl9NSVNDX09QQ09ERQkweEE0CS8qIGYvdyBtaXNjIG9wY29kZSAqLworI2RlZmluZSBHRVRfTUFYX1NHX1NVUFBPUlQJMHgwMQkvKiBnZXQgbWF4IHNnIGxlbiBzdXBwb3J0ZWQgYnkgZi93ICovCisKKyNkZWZpbmUgRkNfTkVXX0NPTkZJRwkJMHhBMQorI2RlZmluZSBOQ19TVUJPUF9QUk9EVUNUX0lORk8JMHgwRQorI2RlZmluZSBOQ19TVUJPUF9FTlFVSVJZMwkweDBGCisjZGVmaW5lIEVOUTNfR0VUX1NPTElDSVRFRF9GVUxMCTB4MDIKKyNkZWZpbmUgT1BfRENNRF9SRUFEX0NPTkZJRwkweDA0CisjZGVmaW5lIE5FV19SRUFEX0NPTkZJR184TEQJMHg2NworI2RlZmluZSBSRUFEX0NPTkZJR184TEQJCTB4MDcKKyNkZWZpbmUgRkxVU0hfQURBUFRFUgkJMHgwQQorI2RlZmluZSBGTFVTSF9TWVNURU0JCTB4RkUKKworLyoKKyAqIENvbW1hbmQgZm9yIHJhbmRvbSBkZWxldGlvbiBvZiBsb2dpY2FsIGRyaXZlcworICovCisjZGVmaW5lCUZDX0RFTF9MT0dEUlYJCTB4QTQJLyogZi93IGNvbW1hbmQgKi8KKyNkZWZpbmUJT1BfU1VQX0RFTF9MT0dEUlYJMHgyQQkvKiBpcyBmZWF0dXJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBPUF9HRVRfTERJRF9NQVAJCTB4MTgJLyogZ2V0IGxkaWQgYW5kIGxvZ2RydiBudW1iZXIgbWFwICovCisjZGVmaW5lIE9QX0RFTF9MT0dEUlYJCTB4MUMJLyogZGVsZXRlIGxvZ2ljYWwgZHJpdmUgKi8KKworLyoKKyAqIEJJT1MgY29tbWFuZHMKKyAqLworI2RlZmluZSBJU19CSU9TX0VOQUJMRUQJCTB4NjIKKyNkZWZpbmUgR0VUX0JJT1MJCTB4MDEKKyNkZWZpbmUgQ0hOTF9DTEFTUwkJMHhBOQorI2RlZmluZSBHRVRfQ0hOTF9DTEFTUwkJMHgwMAorI2RlZmluZSBTRVRfQ0hOTF9DTEFTUwkJMHgwMQorI2RlZmluZSBDSF9SQUlECQkJMHgwMQorI2RlZmluZSBDSF9TQ1NJCQkJMHgwMAorI2RlZmluZSBCSU9TX1BWVF9EQVRBCQkweDQwCisjZGVmaW5lIEdFVF9CSU9TX1BWVF9EQVRBCTB4MDAKKworCisvKgorICogQ29tbWFuZHMgdG8gc3VwcG9ydCBjbHVzdGVyaW5nCisgKi8KKyNkZWZpbmUgTUVHQV9HRVRfVEFSR0VUX0lECTB4N0QKKyNkZWZpbmUgTUVHQV9DTFVTVEVSX09QCQkweDcwCisjZGVmaW5lIE1FR0FfR0VUX0NMVVNURVJfTU9ERQkweDAyCisjZGVmaW5lIE1FR0FfQ0xVU1RFUl9DTUQJMHg2RQorI2RlZmluZSBNRUdBX1JFU0VSVkVfTEQJCTB4MDEKKyNkZWZpbmUgTUVHQV9SRUxFQVNFX0xECQkweDAyCisjZGVmaW5lIE1FR0FfUkVTRVRfUkVTRVJWQVRJT05TCTB4MDMKKyNkZWZpbmUgTUVHQV9SRVNFUlZBVElPTl9TVEFUVVMJMHgwNAorI2RlZmluZSBNRUdBX1JFU0VSVkVfUEQJCTB4MDUKKyNkZWZpbmUgTUVHQV9SRUxFQVNFX1BECQkweDA2CisKKworLyoKKyAqIE1vZHVsZSBiYXR0ZXJ5IHN0YXR1cworICovCisjZGVmaW5lIE1FR0FfQkFUVF9NT0RVTEVfTUlTU0lORwkweDAxCisjZGVmaW5lIE1FR0FfQkFUVF9MT1dfVk9MVEFHRQkJMHgwMgorI2RlZmluZSBNRUdBX0JBVFRfVEVNUF9ISUdICQkweDA0CisjZGVmaW5lIE1FR0FfQkFUVF9QQUNLX01JU1NJTkcJCTB4MDgKKyNkZWZpbmUgTUVHQV9CQVRUX0NIQVJHRV9NQVNLCQkweDMwCisjZGVmaW5lIE1FR0FfQkFUVF9DSEFSR0VfRE9ORQkJMHgwMAorI2RlZmluZSBNRUdBX0JBVFRfQ0hBUkdFX0lOUFJPRwkJMHgxMAorI2RlZmluZSBNRUdBX0JBVFRfQ0hBUkdFX0ZBSUwJCTB4MjAKKyNkZWZpbmUgTUVHQV9CQVRUX0NZQ0xFU19FWENFRURFRAkweDQwCisKKy8qCisgKiBQaHlzaWNhbCBkcml2ZSBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgUERSVl9VTkNORgkwCisjZGVmaW5lIFBEUlZfT05MSU5FCTMKKyNkZWZpbmUgUERSVl9GQUlMRUQJNAorI2RlZmluZSBQRFJWX1JCTEQJNQorI2RlZmluZSBQRFJWX0hPVFNQQVJFCTYKKworCisvKgorICogUmFpZCBsb2dpY2FsIGRyaXZlIHN0YXRlcy4KKyAqLworI2RlZmluZSBSRFJWX09GRkxJTkUJMAorI2RlZmluZSBSRFJWX0RFR1JBREVECTEKKyNkZWZpbmUgUkRSVl9PUFRJTUFMCTIKKyNkZWZpbmUgUkRSVl9ERUxFVEVECTMKKworLyoKKyAqIFJlYWQsIHdyaXRlIGFuZCBjYWNoZSBwb2xpY2llcworICovCisjZGVmaW5lIE5PX1JFQURfQUhFQUQJCTAKKyNkZWZpbmUgUkVBRF9BSEVBRAkJMQorI2RlZmluZSBBREFQX1JFQURfQUhFQUQJCTIKKyNkZWZpbmUgV1JNT0RFX1dSSVRFX1RIUlUJMAorI2RlZmluZSBXUk1PREVfV1JJVEVfQkFDSwkxCisjZGVmaW5lIENBQ0hFRF9JTwkJMAorI2RlZmluZSBESVJFQ1RfSU8JCTEKKworCisjZGVmaW5lIFNDU0lfTElTVChzY3ApICgoc3RydWN0IGxpc3RfaGVhZCAqKSgmKHNjcCktPlNDcCkpCisKKy8qCisgKiBFYWNoIGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJdGhpc19pZDsJLyogb3VyIGlkLCBtYXkgc2V0IHRvIGRpZmZlcmVudCB0aGFuIDcgaWYKKwkJCQkgICBjbHVzdGVyaW5nIGlzIGF2YWlsYWJsZSAqLworCXUzMglmbGFnOworCisJdW5zaWduZWQgbG9uZwliYXNlOworCisJLyogbWJveDY0IHdpdGggbWJveCBub3QgYWxpZ25lZCBvbiAxNi1ieXRlIGJvdW5kcnkgKi8KKwltYm94NjRfdAkqdW5hX21ib3g2NDsKKwlkbWFfYWRkcl90CXVuYV9tYm94NjRfZG1hOworCisJdm9sYXRpbGUgbWJveDY0X3QJKm1ib3g2NDsvKiBwdHIgdG8gNjQtYml0IG1haWxib3ggKi8KKwl2b2xhdGlsZSBtYm94X3QJCSptYm94OwkvKiBwdHIgdG8gc3RhbmRhcmQgbWFpbGJveCAqLworCWRtYV9hZGRyX3QJCW1ib3hfZG1hOworCisJc3RydWN0IHBjaV9kZXYJKmRldjsKKworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZGluZ19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJY29tcGxldGVkX2xpc3Q7CisKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCisjZGVmaW5lIE1FR0FfQlVGRkVSX1NJWkUgKDIqMTAyNCkKKwl1OAkJKm1lZ2FfYnVmZmVyOworCWRtYV9hZGRyX3QJYnVmX2RtYV9oYW5kbGU7CisKKwltZWdhX3Byb2R1Y3RfaW5mbwlwcm9kdWN0X2luZm87CisKKwl1OAkJbWF4X2NtZHM7CisJc2NiX3QJCSpzY2JfbGlzdDsKKworCWF0b21pY190CXBlbmRfY21kczsJLyogbWFpbnRhaW4gYSBjb3VudGVyIGZvciBwZW5kaW5nCisJCQkJCSAgIGNvbW1hbmRzIGluIGZpcm13YXJlICovCisKKyNpZiBNRUdBX0hBVkVfU1RBVFMKKwl1MzIJbnJlYWRzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1MzIJbnJlYWRibG9ja3NbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOworCXUzMglud3JpdGVzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1MzIJbndyaXRlYmxvY2tzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1MzIJcmRfZXJyb3JzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1MzIJd3JfZXJyb3JzW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKyNlbmRpZgorCisJLyogSG9zdCBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl1OAludW1sZHJ2OworCXU4CWZ3X3ZlcnNpb25bN107CisJdTgJYmlvc192ZXJzaW9uWzddOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmNvbnRyb2xsZXJfcHJvY19kaXJfZW50cnk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX3JlYWQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX3N0YXQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX21ib3g7CisKKyNpZiBNRUdBX0hBVkVfRU5IX1BST0MKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfcnI7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX2JhdHRlcnk7CisjZGVmaW5lIE1BWF9QUk9DX0NIQU5ORUxTCTQKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfcGRydnN0YXRbTUFYX1BST0NfQ0hBTk5FTFNdOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19yZHJ2c3RhdFtNQVhfUFJPQ19DSEFOTkVMU107CisjZW5kaWYKKworI2VuZGlmCisKKwlpbnQJaGFzXzY0Yml0X2FkZHI7CQkvKiBhcmUgd2UgdXNpbmcgNjQtYml0IGFkZHJlc3NpbmcgKi8KKwlpbnQJc3VwcG9ydF9leHRfY2RiOworCWludAlib290X2xkcnZfZW5hYmxlZDsKKwlpbnQJYm9vdF9sZHJ2OworCWludAlib290X3BkcnZfZW5hYmxlZDsJLyogYm9vdCBmcm9tIHBoeXNpY2FsIGRyaXZlICovCisJaW50CWJvb3RfcGRydl9jaDsJCS8qIGJvb3QgcGh5c2ljYWwgZHJpdmUgY2hhbm5lbCAqLworCWludAlib290X3BkcnZfdGd0OwkJLyogYm9vdCBwaHlzaWNhbCBkcml2ZSB0YXJnZXQgKi8KKworCisJaW50CXN1cHBvcnRfcmFuZG9tX2RlbDsJLyogRG8gd2Ugc3VwcG9ydCByYW5kb20gZGVsZXRpb24gb2YKKwkJCQkJICAgbG9nZHJ2cyAqLworCWludAlyZWFkX2xkaWRtYXA7CS8qIHNldCBhZnRlciBsb2dpY2FsIGRyaXZlIGRlbHRpb24uIFRoZQorCQkJCSAgIGxvZ2ljYWwgZHJpdmUgbnVtYmVyIG11c3QgYmUgcmVhZCBmcm9tIHRoZQorCQkJCSAgIG1hcCAqLworCWF0b21pY190CXF1aWVzY2VudDsJLyogYSBzdGFnZSByZWFjaGVkIHdoZW4gZGVsZXRlIGxvZ2ljYWwKKwkJCQkJICAgZHJpdmUgbmVlZHMgdG8gYmUgZG9uZS4gU3RvcAorCQkJCQkgICBzZW5kaW5nIHJlcXVlc3RzIHRvIHRoZSBoYmEgdGlsbAorCQkJCQkgICBkZWxldGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCAqLworCXNwaW5sb2NrX3QJbG9jazsKKworCXU4CWxvZ2Rydl9jaGFuW01BWF9DSEFOTkVMUytOVklSVF9DSEFOXTsgLyogbG9naWNhbCBkcml2ZSBhcmUgb24KKwkJCQkJCQl3aGF0IGNoYW5uZWxzLiAqLworCWludAltZWdhX2NoX2NsYXNzOworCisJdTgJc2dsZW47CS8qIGYvdyBzdXBwb3J0ZWQgc2NhdHRlci1nYXRoZXIgbGlzdCBsZW5ndGggKi8KKworCXNjYl90CQkJaW50X3NjYjsKKwlTY3NpX0NtbmQJCWludF9zY21kOworCXN0cnVjdCBzZW1hcGhvcmUJaW50X210eDsJLyogVG8gc3luY2hyb25pemUgdGhlIGludGVybmFsCisJCQkJCQljb21tYW5kcyAqLworCXdhaXRfcXVldWVfaGVhZF90CWludF93YWl0cTsJLyogd2FpdCBxdWV1ZSBmb3IgaW50ZXJuYWwKKwkJCQkJCSBjbWRzICovCisKKwlpbnQJaGFzX2NsdXN0ZXI7CS8qIGNsdXN0ZXIgc3VwcG9ydCBvbiB0aGlzIEhCQSAqLworfWFkYXB0ZXJfdDsKKworCitzdHJ1Y3QgbWVnYV9oYmFzIHsKKwlpbnQgaXNfYmlvc19lbmFibGVkOworCWFkYXB0ZXJfdCAqaG9zdGRhdGFfYWRkcjsKK307CisKKworLyoKKyAqIEZvciBzdGF0ZSBmbGFnLiBEbyBub3QgdXNlIExTQig4IGJpdHMpIHdoaWNoIGFyZQorICogcmVzZXJ2ZWQgZm9yIHN0b3JpbmcgaW5mbyBhYm91dCBjaGFubmVscy4KKyAqLworI2RlZmluZSBJTl9BQk9SVAkweDgwMDAwMDAwTAorI2RlZmluZSBJTl9SRVNFVAkweDQwMDAwMDAwTAorI2RlZmluZSBCT0FSRF9NRU1NQVAJMHgyMDAwMDAwMEwKKyNkZWZpbmUgQk9BUkRfSU9NQVAJMHgxMDAwMDAwMEwKKyNkZWZpbmUgQk9BUkRfNDBMRCAgIAkweDA4MDAwMDAwTAorI2RlZmluZSBCT0FSRF82NEJJVAkweDA0MDAwMDAwTAorCisjZGVmaW5lIElOVFJfVkFMSUQJCQkweDQwCisKKyNkZWZpbmUgUENJX0NPTkZfQU1JU0lHCQkJMHhhMAorI2RlZmluZSBQQ0lfQ09ORl9BTUlTSUc2NAkJMHhhNAorCisKKyNkZWZpbmUgTUVHQV9ETUFfVFlQRV9OT05FCQkweEZGRkYKKyNkZWZpbmUgTUVHQV9CVUxLX0RBVEEJCQkweDAwMDEKKyNkZWZpbmUgTUVHQV9TR0xJU1QJCQkweDAwMDIKKworLyoKKyAqIGxvY2tzY29wZSBkZWZpbml0aW9ucywgY2FsbGVycyBjYW4gc3BlY2lmeSB0aGUgbG9jayBzY29wZSB3aXRoIHRoaXMgZGF0YQorICogdHlwZS4gTE9DS19JTlQgd291bGQgbWVhbiB0aGUgY2FsbGVyIGhhcyBub3QgYWNxdWlyZWQgdGhlIGxvY2sgYmVmb3JlCisgKiBtYWtpbmcgdGhlIGNhbGwgYW5kIExPQ0tfRVhUIHdvdWxkIG1lYW4gb3RoZXJ3aXNlLgorICovCit0eXBlZGVmIGVudW0geyBMT0NLX0lOVCwgTE9DS19FWFQgfSBsb2Nrc2NvcGVfdDsKKworLyoKKyAqIFBhcmFtZXRlcnMgZm9yIHRoZSBpby1tYXBwZWQgY29udHJvbGxlcnMKKyAqLworCisvKiBJL08gUG9ydCBvZmZzZXRzICovCisjZGVmaW5lIENNRF9QT1JUCSAJMHgwMAorI2RlZmluZSBBQ0tfUE9SVAkgCTB4MDAKKyNkZWZpbmUgVE9HR0xFX1BPUlQJCTB4MDEKKyNkZWZpbmUgSU5UUl9QT1JUCSAgCTB4MGEKKworI2RlZmluZSBNQk9YX0JVU1lfUE9SVCAgICAgCTB4MDAKKyNkZWZpbmUgTUJPWF9QT1JUMAkgCTB4MDQKKyNkZWZpbmUgTUJPWF9QT1JUMQkgCTB4MDUKKyNkZWZpbmUgTUJPWF9QT1JUMgkgCTB4MDYKKyNkZWZpbmUgTUJPWF9QT1JUMwkgCTB4MDcKKyNkZWZpbmUgRU5BQkxFX01CT1hfUkVHSU9OIAkweDBCCisKKy8qIEkvTyBQb3J0IFZhbHVlcyAqLworI2RlZmluZSBJU1NVRV9CWVRFCSAJMHgxMAorI2RlZmluZSBBQ0tfQllURQkgICAJMHgwOAorI2RlZmluZSBFTkFCTEVfSU5UUl9CWVRFICAgCTB4YzAKKyNkZWZpbmUgRElTQUJMRV9JTlRSX0JZVEUgIAkweDAwCisjZGVmaW5lIFZBTElEX0lOVFJfQllURSAgICAJMHg0MAorI2RlZmluZSBNQk9YX0JVU1lfQllURSAgICAgCTB4MTAKKyNkZWZpbmUgRU5BQkxFX01CT1hfQllURSAgIAkweDAwCisKKworLyogU2V0dXAgc29tZSBwb3J0IG1hY3JvcyBoZXJlICovCisjZGVmaW5lIGlzc3VlX2NvbW1hbmQoYWRhcHRlcikJXAorCQlvdXRiX3AoSVNTVUVfQllURSwgKGFkYXB0ZXIpLT5iYXNlICsgQ01EX1BPUlQpCisKKyNkZWZpbmUgaXJxX3N0YXRlKGFkYXB0ZXIpCWluYl9wKChhZGFwdGVyKS0+YmFzZSArIElOVFJfUE9SVCkKKworI2RlZmluZSBzZXRfaXJxX3N0YXRlKGFkYXB0ZXIsIHZhbHVlKQlcCisJCW91dGJfcCgodmFsdWUpLCAoYWRhcHRlciktPmJhc2UgKyBJTlRSX1BPUlQpCisKKyNkZWZpbmUgaXJxX2FjayhhZGFwdGVyKQlcCisJCW91dGJfcChBQ0tfQllURSwgKGFkYXB0ZXIpLT5iYXNlICsgQUNLX1BPUlQpCisKKyNkZWZpbmUgaXJxX2VuYWJsZShhZGFwdGVyKQlcCisJb3V0Yl9wKEVOQUJMRV9JTlRSX0JZVEUsIChhZGFwdGVyKS0+YmFzZSArIFRPR0dMRV9QT1JUKQorCisjZGVmaW5lIGlycV9kaXNhYmxlKGFkYXB0ZXIpCVwKKwlvdXRiX3AoRElTQUJMRV9JTlRSX0JZVEUsIChhZGFwdGVyKS0+YmFzZSArIFRPR0dMRV9QT1JUKQorCisKKy8qCisgKiBUaGlzIGlzIG91ciBTWVNERVAgYXJlYS4gQWxsIGtlcm5lbCBzcGVjaWZpYyBkZXRhaWwgc2hvdWxkIGJlIHBsYWNlZCBoZXJlIC0KKyAqIGFzIG11Y2ggYXMgcG9zc2libGUKKyAqLworCisvKgorICogRW5kIG9mIFNZU0RFUCBhcmVhCisgKi8KKworY29uc3QgY2hhciAqbWVnYXJhaWRfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqKTsKKworc3RhdGljIGludCBtZWdhX3F1ZXJ5X2FkYXB0ZXIoYWRhcHRlcl90ICopOworc3RhdGljIGludCBpc3N1ZV9zY2IoYWRhcHRlcl90ICosIHNjYl90ICopOworc3RhdGljIGludCBtZWdhX3NldHVwX21haWxib3goYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX3F1ZXVlIChTY3NpX0NtbmQgKiwgdm9pZCAoKikoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBzY2JfdCAqIG1lZ2FfYnVpbGRfY21kKGFkYXB0ZXJfdCAqLCBTY3NpX0NtbmQgKiwgaW50ICopOworc3RhdGljIHZvaWQgX19tZWdhX3J1bnBlbmRxKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgaXNzdWVfc2NiX2Jsb2NrKGFkYXB0ZXJfdCAqLCB1X2NoYXIgKik7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZWdhcmFpZF9pc3JfbWVtbWFwcGVkKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZWdhcmFpZF9pc3JfaW9tYXBwZWQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCitzdGF0aWMgdm9pZCBtZWdhX2ZyZWVfc2NiKGFkYXB0ZXJfdCAqLCBzY2JfdCAqKTsKKworc3RhdGljIGludCBtZWdhcmFpZF9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IG1lZ2FyYWlkX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfYWJvcnRfYW5kX3Jlc2V0KGFkYXB0ZXJfdCAqLCBTY3NpX0NtbmQgKiwgaW50KTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCXNlY3Rvcl90LCBpbnQgW10pOworc3RhdGljIGludCBtZWdhX3ByaW50X2lucXVpcnkoY2hhciAqLCBjaGFyICopOworCitzdGF0aWMgaW50IG1lZ2FfYnVpbGRfc2dsaXN0IChhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IsCisJCQkgICAgICB1MzIgKmJ1ZmZlciwgdTMyICpsZW5ndGgpOworc3RhdGljIGludCBfX21lZ2FfYnVzeXdhaXRfbWJveCAoYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYV9ydW5kb25lcSAoYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYV9jbWRfZG9uZShhZGFwdGVyX3QgKiwgdTggW10sIGludCwgaW50KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZWdhX2ZyZWVfc2dsIChhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgbWVnYV84X3RvXzQwbGQgKG1yYWlkX2lucXVpcnkgKmlucXVpcnksCisJCW1lZ2FfaW5xdWlyeTMgKmVucXVpcnkzLCBtZWdhX3Byb2R1Y3RfaW5mbyAqKTsKKworc3RhdGljIGludCBtZWdhZGV2X29wZW4gKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbWVnYWRldl9pb2N0bCAoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKKwkJdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IG1lZ2FfbV90b19uKHZvaWQgX191c2VyICosIG5pdGlvY3RsX3QgKik7CitzdGF0aWMgaW50IG1lZ2Ffbl90b19tKHZvaWQgX191c2VyICosIG1lZ2FjbWRfdCAqKTsKKworc3RhdGljIGludCBtZWdhX2luaXRfc2NiIChhZGFwdGVyX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYV9pc19iaW9zX2VuYWJsZWQgKGFkYXB0ZXJfdCAqKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCBtZWdhX2NyZWF0ZV9wcm9jX2VudHJ5KGludCwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICopOworc3RhdGljIGludCBwcm9jX3JlYWRfY29uZmlnKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcmVhZF9zdGF0KGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcmVhZF9tYm94KGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcmVidWlsZF9yYXRlKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfYmF0dGVyeShjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3BkcnZfY2gwKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcGRydl9jaDEoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgcHJvY19wZHJ2X2NoMihjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3BkcnZfY2gzKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcGRydihhZGFwdGVyX3QgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBwcm9jX3JkcnZfMTAoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgcHJvY19yZHJ2XzIwKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50ICosIHZvaWQgKik7CitzdGF0aWMgaW50IHByb2NfcmRydl8zMChjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOworc3RhdGljIGludCBwcm9jX3JkcnZfNDAoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgcHJvY19yZHJ2KGFkYXB0ZXJfdCAqLCBjaGFyICosIGludCwgaW50KTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG1lZ2FfYWRhcGlucShhZGFwdGVyX3QgKiwgZG1hX2FkZHJfdCk7CitzdGF0aWMgaW50IG1lZ2FfaW50ZXJuYWxfZGV2X2lucXVpcnkoYWRhcHRlcl90ICosIHU4LCB1OCwgZG1hX2FkZHJfdCk7CisKK3N0YXRpYyBpbnQgbWVnYV9zdXBwb3J0X2V4dF9jZGIoYWRhcHRlcl90ICopOworc3RhdGljIG1lZ2FfcGFzc3RocnUqIG1lZ2FfcHJlcGFyZV9wYXNzdGhydShhZGFwdGVyX3QgKiwgc2NiX3QgKiwKKwkJU2NzaV9DbW5kICosIGludCwgaW50KTsKK3N0YXRpYyBtZWdhX2V4dF9wYXNzdGhydSogbWVnYV9wcmVwYXJlX2V4dHBhc3N0aHJ1KGFkYXB0ZXJfdCAqLAorCQlzY2JfdCAqLCBTY3NpX0NtbmQgKiwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgbWVnYV9lbnVtX3JhaWRfc2NzaShhZGFwdGVyX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhX2dldF9ib290X2RydihhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IG1lZ2Ffc3VwcG9ydF9yYW5kb21fZGVsKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYV9kZWxfbG9nZHJ2KGFkYXB0ZXJfdCAqLCBpbnQpOworc3RhdGljIGludCBtZWdhX2RvX2RlbF9sb2dkcnYoYWRhcHRlcl90ICosIGludCk7CitzdGF0aWMgdm9pZCBtZWdhX2dldF9tYXhfc2dsKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYV9pbnRlcm5hbF9jb21tYW5kKGFkYXB0ZXJfdCAqLCBsb2Nrc2NvcGVfdCwgbWVnYWNtZF90ICosCisJCW1lZ2FfcGFzc3RocnUgKik7CitzdGF0aWMgdm9pZCBtZWdhX2ludGVybmFsX2RvbmUoU2NzaV9DbW5kICopOworc3RhdGljIGludCBtZWdhX3N1cHBvcnRfY2x1c3RlcihhZGFwdGVyX3QgKik7CisjZW5kaWYKKworLyogdmk6IHNldCB0cz04IHN3PTggdHc9Nzg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvS2NvbmZpZy5tZWdhcmFpZCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9LY29uZmlnLm1lZ2FyYWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2Q1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvS2NvbmZpZy5tZWdhcmFpZApAQCAtMCwwICsxLDc4IEBACitjb25maWcgTUVHQVJBSURfTkVXR0VOCisJYm9vbCAiTFNJIExvZ2ljIE5ldyBHZW5lcmF0aW9uIFJBSUQgRGV2aWNlIERyaXZlcnMiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWhlbHAKKwlMU0kgTG9naWMgUkFJRCBEZXZpY2UgRHJpdmVycworCitjb25maWcgTUVHQVJBSURfTU0KKwl0cmlzdGF0ZSAiTFNJIExvZ2ljIE1hbmFnZW1lbnQgTW9kdWxlIChOZXcgRHJpdmVyKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIE1FR0FSQUlEX05FV0dFTgorCWhlbHAKKwlNYW5hZ2VtZW50IE1vZHVsZSBwcm92aWRlcyBpb2N0bCwgc3lzZnMgc3VwcG9ydCBmb3IgTFNJIExvZ2ljCisJUkFJRCBjb250cm9sbGVycy4KKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWVnYXJhaWRfbW0KKworCitjb25maWcgTUVHQVJBSURfTUFJTEJPWAorCXRyaXN0YXRlICJMU0kgTG9naWMgTWVnYVJBSUQgRHJpdmVyIChOZXcgRHJpdmVyKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIE1FR0FSQUlEX01NCisJaGVscAorCUxpc3Qgb2Ygc3VwcG9ydGVkIGNvbnRyb2xsZXJzCisKKwlPRU0JUHJvZHVjdCBOYW1lCQlWSUQgOkRJRCA6U1ZJRDpTU0lECisJLS0tCS0tLS0tLS0tLS0tLQkJLS0tLSAtLS0tIC0tLS0gLS0tLQorCURlbGwgUEVSQzMvUUMJCQkxMDFFOjE5NjA6MTAyODowNDcxCisJRGVsbCBQRVJDMy9EQwkJCTEwMUU6MTk2MDoxMDI4OjA0OTMKKwlEZWxsIFBFUkMzL1NDCQkJMTAxRToxOTYwOjEwMjg6MDQ3NQorCURlbGwgUEVSQzMvRGkJCQkxMDI4OjAwMEU6MTAyODowMTIzCisJRGVsbCBQRVJDNC9TQwkJCTEwMDA6MTk2MDoxMDI4OjA1MjAKKwlEZWxsIFBFUkM0L0RDCQkJMTAwMDoxOTYwOjEwMjg6MDUxOAorCURlbGwgUEVSQzQvUUMJCQkxMDAwOjA0MDc6MTAyODowNTMxCisJRGVsbCBQRVJDNC9EaQkJCTEwMjg6MDAwRjoxMDI4OjAxNEEKKwlEZWxsIFBFUkMgNGUvU2kJCQkxMDI4OjAwMTM6MTAyODowMTZjCisJRGVsbCBQRVJDIDRlL0RpCQkJMTAyODowMDEzOjEwMjg6MDE2ZAorCURlbGwgUEVSQyA0ZS9EaQkJCTEwMjg6MDAxMzoxMDI4OjAxNmUKKwlEZWxsIFBFUkMgNGUvRGkJCQkxMDI4OjAwMTM6MTAyODowMTZmCisJRGVsbCBQRVJDIDRlL0RpCQkJMTAyODowMDEzOjEwMjg6MDE3MAorCURlbGwgUEVSQyA0ZS9EQwkJCTEwMDA6MDQwODoxMDI4OjAwMDIKKwlEZWxsIFBFUkMgNGUvU0MJCQkxMDAwOjA0MDg6MTAyODowMDAxCisJTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTAJCTEwMDA6MTk2MDoxMDAwOkE1MjAKKwlMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMQkJMTAwMDoxOTYwOjEwMDA6MDUyMAorCUxTSSBNZWdhUkFJRCBTQ1NJIDMyMC0yCQkxMDAwOjE5NjA6MTAwMDowNTE4CisJTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTBYCTEwMDA6MDQwNzoxMDAwOjA1MzAKKwlMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMlgJMTAwMDowNDA3OjEwMDA6MDUzMgorCUxTSSBNZWdhUkFJRCBTQ1NJIDMyMC00WAkxMDAwOjA0MDc6MTAwMDowNTMxCisJTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTFFCTEwMDA6MDQwODoxMDAwOjAwMDEKKwlMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMkUJMTAwMDowNDA4OjEwMDA6MDAwMgorCUxTSSBNZWdhUkFJRCBTQVRBIDE1MC00CQkxMDAwOjE5NjA6MTAwMDo0NTIzCisJTFNJIE1lZ2FSQUlEIFNBVEEgMTUwLTYJCTEwMDA6MTk2MDoxMDAwOjA1MjMKKwlMU0kgTWVnYVJBSUQgU0FUQSAzMDAtNFgJMTAwMDowNDA5OjEwMDA6MzAwNAorCUxTSSBNZWdhUkFJRCBTQVRBIDMwMC04WAkxMDAwOjA0MDk6MTAwMDozMDA4CisJSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1U0MlgJMTAwMDowNDA3OjgwODY6MDUzMgorCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUkNTMTYJMTAwMDoxOTYwOjgwODY6MDUyMworCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUkNVNDJFCTEwMDA6MDQwODo4MDg2OjAwMDIKKwlJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDWkNSWAkxMDAwOjA0MDc6ODA4NjowNTMwCisJSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1MyOFgJMTAwMDowNDA5OjgwODY6MzAwOAorCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUk9NQlU0MkUJMTAwMDowNDA4OjgwODY6MzQzMQorCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUk9NQlU0MkUJMTAwMDowNDA4OjgwODY6MzQ5OQorCUlOVEVMIFJBSUQgQ29udHJvbGxlciBTUkNVNTFMCTEwMDA6MTk2MDo4MDg2OjA1MjAKKwlGU0MgTWVnYVJBSUQgUENJIEV4cHJlc3MgUk9NQgkxMDAwOjA0MDg6MTczNDoxMDY1CisJQUNFUiBNZWdhUkFJRCBST01CLTJFCQkxMDAwOjA0MDg6MTAyNTowMDRECisJTkVDIE1lZ2FSQUlEIFBDSSBFeHByZXNzIFJPTUIJMTAwMDowNDA4OjEwMzM6ODI4NworCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1lZ2FyYWlkX21ib3gKKworaWYgTUVHQVJBSURfTkVXR0VOPW4KK2NvbmZpZyBNRUdBUkFJRF9MRUdBQ1kKKwl0cmlzdGF0ZSAiTFNJIExvZ2ljIExlZ2FjeSBNZWdhUkFJRCBEcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kgJiYgU0NTSQorCWhlbHAKKwlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTFNJIE1lZ2FSQUlEIDQxOCwgNDI4LCA0MzgsIDQ2NiwgNzYyLCA0OTAKKwlhbmQgNDY3IFNDU0kgaG9zdCBhZGFwdGVycy4gVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0IHRoZSBhbGwgVTMyMAorCVJBSUQgY29udHJvbGxlcnMKKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtZWdhcmFpZAorZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ5OWYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX01FR0FSQUlEX01NKQkrPSBtZWdhcmFpZF9tbS5vCitvYmotJChDT05GSUdfTUVHQVJBSURfTUFJTEJPWCkJKz0gbWVnYXJhaWRfbWJveC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWJveF9kZWZzLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWJveF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1Mjg2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tYm94X2RlZnMuaApAQCAtMCwwICsxLDc5MCBAQAorLyoKKyAqCisgKgkJCUxpbnV4IE1lZ2FSQUlEIFVuaWZpZWQgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0ICBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoJICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGSUxFCQk6IG1ib3hfZGVmcy5oCisgKgorICovCisjaWZuZGVmIF9NUkFJRF9NQk9YX0RFRlNfSF8KKyNkZWZpbmUgX01SQUlEX01CT1hfREVGU19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIENvbW1hbmRzIGFuZCBzdGF0ZXMgZm9yIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqLworCisjZGVmaW5lIE1CT1hDTURfTFJFQUQJCTB4MDEKKyNkZWZpbmUgTUJPWENNRF9MV1JJVEUJCTB4MDIKKyNkZWZpbmUgTUJPWENNRF9QQVNTVEhSVQkweDAzCisjZGVmaW5lIE1CT1hDTURfQURQRVhUSU5RCTB4MDQKKyNkZWZpbmUgTUJPWENNRF9BREFQVEVSSU5RCTB4MDUKKyNkZWZpbmUgTUJPWENNRF9MUkVBRDY0CQkweEE3CisjZGVmaW5lIE1CT1hDTURfTFdSSVRFNjQJMHhBOAorI2RlZmluZSBNQk9YQ01EX1BBU1NUSFJVNjQJMHhDMworI2RlZmluZSBNQk9YQ01EX0VYVFBUSFJVCTB4RTMKKworI2RlZmluZSBNQUlOX01JU0NfT1BDT0RFCTB4QTQKKyNkZWZpbmUgR0VUX01BWF9TR19TVVBQT1JUCTB4MDEKKyNkZWZpbmUgU1VQUE9SVF9FWFRfQ0RCCQkweDE2CisKKyNkZWZpbmUgRkNfTkVXX0NPTkZJRwkJMHhBMQorI2RlZmluZSBOQ19TVUJPUF9QUk9EVUNUX0lORk8JMHgwRQorI2RlZmluZSBOQ19TVUJPUF9FTlFVSVJZMwkweDBGCisjZGVmaW5lIEVOUTNfR0VUX1NPTElDSVRFRF9GVUxMCTB4MDIKKyNkZWZpbmUgT1BfRENNRF9SRUFEX0NPTkZJRwkweDA0CisjZGVmaW5lIE5FV19SRUFEX0NPTkZJR184TEQJMHg2NworI2RlZmluZSBSRUFEX0NPTkZJR184TEQJCTB4MDcKKyNkZWZpbmUgRkxVU0hfQURBUFRFUgkJMHgwQQorI2RlZmluZSBGTFVTSF9TWVNURU0JCTB4RkUKKworLyoKKyAqIENvbW1hbmQgZm9yIHJhbmRvbSBkZWxldGlvbiBvZiBsb2dpY2FsIGRyaXZlcworICovCisjZGVmaW5lCUZDX0RFTF9MT0dEUlYJCTB4QTQKKyNkZWZpbmUJT1BfU1VQX0RFTF9MT0dEUlYJMHgyQQorI2RlZmluZSBPUF9HRVRfTERJRF9NQVAJCTB4MTgKKyNkZWZpbmUgT1BfREVMX0xPR0RSVgkJMHgxQworCisvKgorICogQklPUyBjb21tYW5kcworICovCisjZGVmaW5lIElTX0JJT1NfRU5BQkxFRAkJMHg2MgorI2RlZmluZSBHRVRfQklPUwkJMHgwMQorI2RlZmluZSBDSE5MX0NMQVNTCQkweEE5CisjZGVmaW5lIEdFVF9DSE5MX0NMQVNTCQkweDAwCisjZGVmaW5lIFNFVF9DSE5MX0NMQVNTCQkweDAxCisjZGVmaW5lIENIX1JBSUQJCQkweDAxCisjZGVmaW5lIENIX1NDU0kJCQkweDAwCisjZGVmaW5lIEJJT1NfUFZUX0RBVEEJCTB4NDAKKyNkZWZpbmUgR0VUX0JJT1NfUFZUX0RBVEEJMHgwMAorCisKKy8qCisgKiBDb21tYW5kcyB0byBzdXBwb3J0IGNsdXN0ZXJpbmcKKyAqLworI2RlZmluZSBHRVRfVEFSR0VUX0lECQkweDdECisjZGVmaW5lIENMVVNURVJfT1AJCTB4NzAKKyNkZWZpbmUgR0VUX0NMVVNURVJfTU9ERQkweDAyCisjZGVmaW5lIENMVVNURVJfQ01ECQkweDZFCisjZGVmaW5lIFJFU0VSVkVfTEQJCTB4MDEKKyNkZWZpbmUgUkVMRUFTRV9MRAkJMHgwMgorI2RlZmluZSBSRVNFVF9SRVNFUlZBVElPTlMJMHgwMworI2RlZmluZSBSRVNFUlZBVElPTl9TVEFUVVMJMHgwNAorI2RlZmluZSBSRVNFUlZFX1BECQkweDA1CisjZGVmaW5lIFJFTEVBU0VfUEQJCTB4MDYKKworCisvKgorICogTW9kdWxlIGJhdHRlcnkgc3RhdHVzCisgKi8KKyNkZWZpbmUgQkFUVEVSWV9NT0RVTEVfTUlTU0lORwkJMHgwMQorI2RlZmluZSBCQVRURVJZX0xPV19WT0xUQUdFCQkweDAyCisjZGVmaW5lIEJBVFRFUllfVEVNUF9ISUdICQkweDA0CisjZGVmaW5lIEJBVFRFUllfUEFDS19NSVNTSU5HCQkweDA4CisjZGVmaW5lIEJBVFRFUllfQ0hBUkdFX01BU0sJCTB4MzAKKyNkZWZpbmUgQkFUVEVSWV9DSEFSR0VfRE9ORQkJMHgwMAorI2RlZmluZSBCQVRURVJZX0NIQVJHRV9JTlBST0cJCTB4MTAKKyNkZWZpbmUgQkFUVEVSWV9DSEFSR0VfRkFJTAkJMHgyMAorI2RlZmluZSBCQVRURVJZX0NZQ0xFU19FWENFRURFRAkJMHg0MAorCisvKgorICogUGh5c2ljYWwgZHJpdmUgc3RhdGVzLgorICovCisjZGVmaW5lIFBEUlZfVU5DTkYJMAorI2RlZmluZSBQRFJWX09OTElORQkzCisjZGVmaW5lIFBEUlZfRkFJTEVECTQKKyNkZWZpbmUgUERSVl9SQkxECTUKKyNkZWZpbmUgUERSVl9IT1RTUEFSRQk2CisKKworLyoKKyAqIFJhaWQgbG9naWNhbCBkcml2ZSBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgUkRSVl9PRkZMSU5FCTAKKyNkZWZpbmUgUkRSVl9ERUdSQURFRAkxCisjZGVmaW5lIFJEUlZfT1BUSU1BTAkyCisjZGVmaW5lIFJEUlZfREVMRVRFRAkzCisKKy8qCisgKiBSZWFkLCB3cml0ZSBhbmQgY2FjaGUgcG9saWNpZXMKKyAqLworI2RlZmluZSBOT19SRUFEX0FIRUFECQkwCisjZGVmaW5lIFJFQURfQUhFQUQJCTEKKyNkZWZpbmUgQURBUF9SRUFEX0FIRUFECQkyCisjZGVmaW5lIFdSTU9ERV9XUklURV9USFJVCTAKKyNkZWZpbmUgV1JNT0RFX1dSSVRFX0JBQ0sJMQorI2RlZmluZSBDQUNIRURfSU8JCTAKKyNkZWZpbmUgRElSRUNUX0lPCQkxCisKKyNkZWZpbmUgTUFYX0xPR0lDQUxfRFJJVkVTXzhMRAkJOAorI2RlZmluZSBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRAkJNDAKKyNkZWZpbmUgRkNfTUFYX1BIWVNJQ0FMX0RFVklDRVMJCTI1NgorI2RlZmluZSBNQVhfTUJPWF9DSEFOTkVMUwkJNQorI2RlZmluZSBNQVhfTUJPWF9UQVJHRVQJCQkxNQorI2RlZmluZSBNQk9YX01BWF9QSFlTSUNBTF9EUklWRVMJTUFYX01CT1hfQ0hBTk5FTFMqTUFYX01CT1hfVEFSR0VUCisjZGVmaW5lIE1BWF9ST1dfU0laRV80MExECQkzMgorI2RlZmluZSBNQVhfUk9XX1NJWkVfOExECQk4CisjZGVmaW5lIFNQQU5fREVQVEhfOF9TUEFOUwkJOAorI2RlZmluZSBTUEFOX0RFUFRIXzRfU1BBTlMJCTQKKyNkZWZpbmUgTUFYX1JFUV9TRU5TRV9MRU4JCTB4MjAKKworCisKKy8qKgorICogc3RydWN0IG1ib3hfdCAtIERyaXZlciBhbmQgZi93IGhhbmRzaGFrZSBzdHJ1Y3R1cmUuCisgKiBAY21kCQk6IGZpcm13YXJlIGNvbW1hbmQKKyAqIEBjbWRpZAk6IGNvbW1hbmQgaWQKKyAqIEBudW1zZWN0b3JzCTogbnVtYmVyIG9mIHNlY3RvcnMgdG8gYmUgdHJhbnNmZXJyZWQKKyAqIEBsYmEJCTogTG9naWNhbCBCbG9jayBBZGRyZXNzIG9uIExECisgKiBAeGZlcmFkZHIJOiBETUEgYWRkcmVzcyBmb3IgZGF0YSB0cmFuc2ZlcgorICogQGxvZ2Rydgk6IGxvZ2ljYWwgZHJpdmUgbnVtYmVyCisgKiBAbnVtc2dlCTogbnVtYmVyIG9mIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzIGluIHNnIGxpc3QKKyAqIEByZXN2ZAk6IHJlc2VydmVkCisgKiBAYnVzeQk6IGYvdyBidXN5LCBtdXN0IHdhaXQgdG8gaXNzdWUgbW9yZSBjb21tYW5kcy4KKyAqIEBudW1zdGF0dXMJOiBudW1iZXIgb2YgY29tbWFuZHMgY29tcGxldGVkLgorICogQHN0YXR1cwk6IHN0YXR1cyBvZiB0aGUgY29tbWFuZHMgY29tcGxldGVkCisgKiBAY29tcGxldGVkCTogYXJyYXkgb2YgY29tcGxldGVkIGNvbW1hbmQgaWRzLgorICogQHBvbGwJOiBwb2xsIGFuZCBhY2sgc2VxdWVuY2UKKyAqIEBhY2sJCTogcG9sbCBhbmQgYWNrIHNlcXVlbmNlCisgKgorICogVGhlIGNlbnRyYWwgaGFuZHNoYWtlIHN0cnVjdHVyZSBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSBmaXJtd2FyZS4gVGhpcworICogc3RydWN0dXJlIG11c3QgYmUgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIgYW5kIGFsaWduZWQgYXQgOC1ieXRlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIE1CT1hfTUFYX0ZJUk1XQVJFX1NUQVRVUwk0NgordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCWNtZDsKKwl1aW50OF90CQljbWRpZDsKKwl1aW50MTZfdAludW1zZWN0b3JzOworCXVpbnQzMl90CWxiYTsKKwl1aW50MzJfdAl4ZmVyYWRkcjsKKwl1aW50OF90CQlsb2dkcnY7CisJdWludDhfdAkJbnVtc2dlOworCXVpbnQ4X3QJCXJlc3ZkOworCXVpbnQ4X3QJCWJ1c3k7CisJdWludDhfdAkJbnVtc3RhdHVzOworCXVpbnQ4X3QJCXN0YXR1czsKKwl1aW50OF90CQljb21wbGV0ZWRbTUJPWF9NQVhfRklSTVdBUkVfU1RBVFVTXTsKKwl1aW50OF90CQlwb2xsOworCXVpbnQ4X3QJCWFjazsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1ib3hfdDsKKworCisvKioKKyAqIG1ib3g2NF90IC0gNjQtYml0IGV4dGVuc2lvbiBmb3IgdGhlIG1haWxib3gKKyAqIEBzZWdtZW50X2xvCTogdGhlIGxvdyAzMi1iaXRzIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0CisgKiBAc2VnbWVudF9oaQk6IHRoZSB1cHBlciAzMi1iaXRzIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0CisgKiBAbWJveAk6IDMyLWJpdCBtYWlsYm94LCB3aG9zZSB4ZmVyYWRkZXIgZmllbGQgbXVzdCBiZSBzZXQgdG8KKyAqCQkweEZGRkZGRkZGCisgKgorICogVGhpcyBpcyB0aGUgZXh0ZW5zaW9uIG9mIHRoZSAzMi1iaXQgbWFpbGJveCB0byBiZSBhYmxlIHRvIHBlcmZvcm0gRE1BCisgKiBiZXlvbmQgNEdCIGFkZHJlc3MgcmFuZ2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAl4ZmVyYWRkcl9sbzsKKwl1aW50MzJfdAl4ZmVyYWRkcl9oaTsKKwltYm94X3QJCW1ib3gzMjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1ib3g2NF90OworCisvKgorICogbWFpbGJveCBzdHJ1Y3R1cmUgdXNlZCBmb3IgaW50ZXJuYWwgY29tbWFuZHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4CWNtZDsKKwl1OAljbWRpZDsKKwl1OAlvcGNvZGU7CisJdTgJc3Vib3Bjb2RlOworCXUzMglsYmE7CisJdTMyCXhmZXJhZGRyOworCXU4CWxvZ2RydjsKKwl1OAlyc3ZkWzNdOworCXU4CW51bXN0YXR1czsKKwl1OAlzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpbnRfbWJveF90OworCisvKioKKyAqIG1yYWlkX3Bhc3N0aHJ1X3QgLSBwYXNzdGhydSBzdHJ1Y3R1cmUgdG8gaXNzdWUgY29tbWFuZHMgdG8gcGh5c2ljYWwgZGV2aWNlcworICogQHRpbWVvdXQJCTogY29tbWFuZCB0aW1lb3V0LCAwPTZzZWMsIDE9NjBzZWMsIDI9MTBtaW4sIDM9M2hyCisgKiBAYXJzCQkJOiBzZXQgaWYgQVJTIHJlcXVpcmVkIGFmdGVyIGNoZWNrIGNvbmRpdGlvbgorICogQGlzbG9naWNhbAkJOiBzZXQgaWYgY29tbWFuZCBtZWFudCBmb3IgbG9naWNhbCBkZXZpY2VzCisgKiBAbG9nZHJ2CQk6IGxvZ2ljYWwgZHJpdmUgbnVtYmVyIGlmIGNvbW1hbmQgZm9yIExECisgKiBAY2hhbm5lbAkJOiBDaGFubmVsIG9uIHdoaWNoIHBoeXNpY2FsIGRldmljZSBpcyBsb2NhdGVkCisgKiBAdGFyZ2V0CQk6IFNDU0kgdGFyZ2V0IG9mIHRoZSBkZXZpY2UKKyAqIEBxdWV1ZXRhZwkJOiB1bnVzZWQKKyAqIEBxdWV1ZWFjdGlvbgkJOiB1bnVzZWQKKyAqIEBjZGIJCQk6IFNDU0kgQ0RCCisgKiBAY2RibGVuCQk6IGxlbmd0aCBvZiB0aGUgQ0RCCisgKiBAcmVxc2Vuc2VsZW4JCTogYW1vdW50IG9mIHJlcXVlc3Qgc2Vuc2UgZGF0YSB0byBiZSByZXR1cm5lZAorICogQHJlcXNlbnNlYXJlYQk6IFNlbnNlIGluZm9ybWF0aW9uIGJ1ZmZlcgorICogQG51bXNnZQkJOiBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgaW4gdGhlIHNnIGxpc3QKKyAqIEBzY3Npc3RhdHVzCQk6IFNDU0kgc3RhdHVzIG9mIHRoZSBjb21tYW5kIGNvbXBsZXRlZC4KKyAqIEBkYXRheGZlcmFkZHIJOiBETUEgZGF0YSB0cmFuc2ZlciBhZGRyZXNzCisgKiBAZGF0YXhmZXJsZW4JCTogYW1vdW50IG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJdGltZW91dAkJOjM7CisJdWludDhfdAkJYXJzCQk6MTsKKwl1aW50OF90CQlyZXNlcnZlZAk6MzsKKwl1aW50OF90CQlpc2xvZ2ljYWwJOjE7CisJdWludDhfdAkJbG9nZHJ2OworCXVpbnQ4X3QJCWNoYW5uZWw7CisJdWludDhfdAkJdGFyZ2V0OworCXVpbnQ4X3QJCXF1ZXVldGFnOworCXVpbnQ4X3QJCXF1ZXVlYWN0aW9uOworCXVpbnQ4X3QJCWNkYlsxMF07CisJdWludDhfdAkJY2RibGVuOworCXVpbnQ4X3QJCXJlcXNlbnNlbGVuOworCXVpbnQ4X3QJCXJlcXNlbnNlYXJlYVtNQVhfUkVRX1NFTlNFX0xFTl07CisJdWludDhfdAkJbnVtc2dlOworCXVpbnQ4X3QJCXNjc2lzdGF0dXM7CisJdWludDMyX3QJZGF0YXhmZXJhZGRyOworCXVpbnQzMl90CWRhdGF4ZmVybGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfcGFzc3RocnVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisJdWludDMyX3QJCWRhdGF4ZmVyYWRkcl9sbzsKKwl1aW50MzJfdAkJZGF0YXhmZXJhZGRyX2hpOworCW1yYWlkX3Bhc3N0aHJ1X3QJcHRocnUzMjsKKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWVnYV9wYXNzdGhydTY0X3Q7CisKKy8qKgorICogbXJhaWRfZXBhc3N0aHJ1X3QgLSBwYXNzdGhydSBzdHJ1Y3R1cmUgdG8gaXNzdWUgY29tbWFuZHMgdG8gcGh5c2ljYWwgZGV2aWNlcworICogQHRpbWVvdXQJCTogY29tbWFuZCB0aW1lb3V0LCAwPTZzZWMsIDE9NjBzZWMsIDI9MTBtaW4sIDM9M2hyCisgKiBAYXJzCQkJOiBzZXQgaWYgQVJTIHJlcXVpcmVkIGFmdGVyIGNoZWNrIGNvbmRpdGlvbgorICogQHJzdmQxCQk6IHJlc2VydmVkIGZpZWxkCisgKiBAY2Rfcm9tCQk6ICg/KQorICogQHJzdmQyCQk6IHJlc2VydmVkIGZpZWxkCisgKiBAaXNsb2dpY2FsCQk6IHNldCBpZiBjb21tYW5kIG1lYW50IGZvciBsb2dpY2FsIGRldmljZXMKKyAqIEBsb2dkcnYJCTogbG9naWNhbCBkcml2ZSBudW1iZXIgaWYgY29tbWFuZCBmb3IgTEQKKyAqIEBjaGFubmVsCQk6IENoYW5uZWwgb24gd2hpY2ggcGh5c2ljYWwgZGV2aWNlIGlzIGxvY2F0ZWQKKyAqIEB0YXJnZXQJCTogU0NTSSB0YXJnZXQgb2YgdGhlIGRldmljZQorICogQHF1ZXVldGFnCQk6IHVudXNlZAorICogQHF1ZXVlYWN0aW9uCQk6IHVudXNlZAorICogQGNkYmxlbgkJOiBsZW5ndGggb2YgdGhlIENEQgorICogQHJzdmQzCQk6IHJlc2VydmVkIGZpZWxkCisgKiBAY2RiCQkJOiBTQ1NJIENEQgorICogQG51bXNnZQkJOiBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgaW4gdGhlIHNnIGxpc3QKKyAqIEBzdGF0dXMJCTogU0NTSSBzdGF0dXMgb2YgdGhlIGNvbW1hbmQgY29tcGxldGVkLgorICogQHJlcXNlbnNlbGVuCQk6IGFtb3VudCBvZiByZXF1ZXN0IHNlbnNlIGRhdGEgdG8gYmUgcmV0dXJuZWQKKyAqIEByZXFzZW5zZWFyZWEJOiBTZW5zZSBpbmZvcm1hdGlvbiBidWZmZXIKKyAqIEByc3ZkNAkJOiByZXNlcnZlZCBmaWVsZAorICogQGRhdGF4ZmVyYWRkcgk6IERNQSBkYXRhIHRyYW5zZmVyIGFkZHJlc3MKKyAqIEBkYXRheGZlcmxlbgkJOiBhbW91bnQgb2YgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90CQl0aW1lb3V0CQk6MzsKKwl1aW50OF90CQlhcnMJCToxOworCXVpbnQ4X3QJCXJzdmQxCQk6MTsKKwl1aW50OF90CQljZF9yb20JCToxOworCXVpbnQ4X3QJCXJzdmQyCQk6MTsKKwl1aW50OF90CQlpc2xvZ2ljYWwJOjE7CisJdWludDhfdAkJbG9nZHJ2OworCXVpbnQ4X3QJCWNoYW5uZWw7CisJdWludDhfdAkJdGFyZ2V0OworCXVpbnQ4X3QJCXF1ZXVldGFnOworCXVpbnQ4X3QJCXF1ZXVlYWN0aW9uOworCXVpbnQ4X3QJCWNkYmxlbjsKKwl1aW50OF90CQlyc3ZkMzsKKwl1aW50OF90CQljZGJbMTZdOworCXVpbnQ4X3QJCW51bXNnZTsKKwl1aW50OF90CQlzdGF0dXM7CisJdWludDhfdAkJcmVxc2Vuc2VsZW47CisJdWludDhfdAkJcmVxc2Vuc2VhcmVhW01BWF9SRVFfU0VOU0VfTEVOXTsKKwl1aW50OF90CQlyc3ZkNDsKKwl1aW50MzJfdAlkYXRheGZlcmFkZHI7CisJdWludDMyX3QJZGF0YXhmZXJsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9lcGFzc3RocnVfdDsKKworCisvKioKKyAqIG1yYWlkX3BpbmZvX3QgLSBwcm9kdWN0IGluZm8sIHN0YXRpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbGxlcgorICogQGRhdGFfc2l6ZQkJOiBjdXJyZW50IHNpemUgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgcmVzdmQpCisgKiBAY29uZmlnX3NpZ25hdHVyZQk6IEN1cnJlbnQgdmFsdWUgaXMgMHgwMDI4MjAwOAorICogQGZ3X3ZlcnNpb24JCTogRmlybXdhcmUgdmVyc2lvbgorICogQGJpb3NfdmVyc2lvbgk6IHZlcnNpb24gb2YgdGhlIEJJT1MKKyAqIEBwcm9kdWN0X25hbWUJOiBOYW1lIGdpdmVuIHRvIHRoZSBjb250cm9sbGVyCisgKiBAbWF4X2NvbW1hbmRzCTogTWF4aW11bSBjb25jdXJyZW50IGNvbW1hbmRzIHN1cHBvcnRlZAorICogQG5jaGFubmVscwkJOiBOdW1iZXIgb2YgU0NTSSBDaGFubmVscyBkZXRlY3RlZAorICogQGZjX2xvb3BfcHJlc2VudAk6IE51bWJlciBvZiBGaWJyZSBMb29wcyBkZXRlY3RlZAorICogQG1lbV90eXBlCQk6IEVETywgRlBNLCBTRFJBTSBldGMKKyAqIEBzaWduYXR1cmUJCToKKyAqIEBkcmFtX3NpemUJCTogSW4gdGVybXMgb2YgTUIKKyAqIEBzdWJzeXNpZAkJOiBkZXZpY2UgUENJIHN1YnN5c3RlbSBJRAorICogQHN1YnN5c3ZpZAkJOiBkZXZpY2UgUENJIHN1YnN5c3RlbSB2ZW5kb3IgSUQKKyAqIEBub3RpZnlfY291bnRlcnMJOgorICogQHBhZDFrCQk6IDEzNSArIDg4OSByZXN2ZCA9IDEwMjQgdG90YWwgc2l6ZQorICoKKyAqIFRoaXMgc3RydWN0dXJlcyBob2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2xsZXIgd2hpY2ggaXMgbm90CisgKiBleHBlY3RlZCB0byBjaGFuZ2UgZHluYW1pY2FsbHkuCisgKgorICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgY29uZmlnIHNpZ25hdHVyZSBpcyAweDAwMjgyMDA4OgorICogMHgyOCA9IE1BWF9MT0dJQ0FMX0RSSVZFUywKKyAqIDB4MjAgPSBOdW1iZXIgb2Ygc3RyaXBlcyBhbmQKKyAqIDB4MDggPSBOdW1iZXIgb2Ygc3BhbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CWRhdGFfc2l6ZTsKKwl1aW50MzJfdAljb25maWdfc2lnbmF0dXJlOworCXVpbnQ4X3QJCWZ3X3ZlcnNpb25bMTZdOworCXVpbnQ4X3QJCWJpb3NfdmVyc2lvblsxNl07CisJdWludDhfdAkJcHJvZHVjdF9uYW1lWzgwXTsKKwl1aW50OF90CQltYXhfY29tbWFuZHM7CisJdWludDhfdAkJbmNoYW5uZWxzOworCXVpbnQ4X3QJCWZjX2xvb3BfcHJlc2VudDsKKwl1aW50OF90CQltZW1fdHlwZTsKKwl1aW50MzJfdAlzaWduYXR1cmU7CisJdWludDE2X3QJZHJhbV9zaXplOworCXVpbnQxNl90CXN1YnN5c2lkOworCXVpbnQxNl90CXN1YnN5c3ZpZDsKKwl1aW50OF90CQlub3RpZnlfY291bnRlcnM7CisJdWludDhfdAkJcGFkMWtbODg5XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX3BpbmZvX3Q7CisKKworLyoqCisgKiBtcmFpZF9ub3RpZnlfdCAtIHRoZSBub3RpZmljYXRpb24gc3RydWN0dXJlCisgKiBAZ2xvYmFsX2NvdW50ZXIJCTogQW55IGNoYW5nZSBpbmNyZW1lbnRzIHRoaXMgY291bnRlcgorICogQHBhcmFtX2NvdW50ZXIJCTogSW5kaWNhdGVzIGFueSBwYXJhbXMgY2hhbmdlZAorICogQHBhcmFtX2lkCQkJOiBQYXJhbSBtb2RpZmllZCAtIGRlZmluZWQgYmVsb3cKKyAqIEBwYXJhbV92YWwJCQk6IE5ldyB2YWwgb2YgbGFzdCBwYXJhbSBtb2RpZmllZAorICogQHdyaXRlX2NvbmZpZ19jb3VudGVyCTogd3JpdGUgY29uZmlnIG9jY3VycmVkCisgKiBAd3JpdGVfY29uZmlnX3JzdmQJCToKKyAqIEBsZHJ2X29wX2NvdW50ZXIJCTogSW5kaWNhdGVzIGxkcnYgb3Agc3RhcnRlZC9jb21wbGV0ZWQKKyAqIEBsZHJ2X29waWQJCQk6IGxkcnYgbnVtCisgKiBAbGRydl9vcGNtZAkJCTogbGRydiBvcGVyYXRpb24gLSBkZWZpbmVkIGJlbG93CisgKiBAbGRydl9vcHN0YXR1cwkJOiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgorICogQGxkcnZfc3RhdGVfY291bnRlcgkJOiBJbmRpY2F0ZXMgY2hhbmdlIG9mIGxkcnYgc3RhdGUKKyAqIEBsZHJ2X3N0YXRlX2lkCQk6IGxkcnYgbnVtCisgKiBAbGRydl9zdGF0ZV9uZXcJCTogTmV3IHN0YXRlCisgKiBAbGRydl9zdGF0ZV9vbGQJCTogb2xkIHN0YXRlCisgKiBAcGRydl9zdGF0ZV9jb3VudGVyCQk6IEluZGljYXRlcyBjaGFuZ2Ugb2YgbGRydiBzdGF0ZQorICogQHBkcnZfc3RhdGVfaWQJCTogcGRydiBpZAorICogQHBkcnZfc3RhdGVfbmV3CQk6IE5ldyBzdGF0ZQorICogQHBkcnZfc3RhdGVfb2xkCQk6IG9sZCBzdGF0ZQorICogQHBkcnZfZm10X2NvdW50ZXIJCTogSW5kaWNhdGVzIHBkcnYgZm9ybWF0IHN0YXJ0ZWQvb3ZlcgorICogQHBkcnZfZm10X2lkCQkJOiBwZHJ2IGlkCisgKiBAcGRydl9mbXRfdmFsCQk6IGZvcm1hdCBzdGFydGVkL292ZXIKKyAqIEBwZHJ2X2ZtdF9yc3ZkCQk6CisgKiBAdGFyZ194ZmVyX2NvdW50ZXIJCTogSW5kaWNhdGVzIFNDU0ktMiBYZmVyIHJhdGUgY2hhbmdlCisgKiBAdGFyZ194ZmVyX2lkCQk6IHBkcnYgSWQKKyAqIEB0YXJnX3hmZXJfdmFsCQk6IG5ldyBYZmVyIHBhcmFtcyBvZiBsYXN0IHBkcnYKKyAqIEB0YXJnX3hmZXJfcnN2ZAkJOgorICogQGZjbG9vcF9pZF9jaGdfY291bnRlcgk6IEluZGljYXRlcyBsb29waWQgY2hhbmdlZAorICogQGZjbG9vcGlkX3BkcnZpZAkJOiBwZHJ2IGlkCisgKiBAZmNsb29wX2lkMAkJCTogbG9vcGlkIG9uIGZjIGxvb3AgMAorICogQGZjbG9vcF9pZDEJCQk6IGxvb3BpZCBvbiBmYyBsb29wIDEKKyAqIEBmY2xvb3Bfc3RhdGVfY291bnRlcgk6IEluZGljYXRlcyBsb29wIHN0YXRlIGNoYW5nZWQKKyAqIEBmY2xvb3Bfc3RhdGUwCQk6IHN0YXRlIG9mIGZjIGxvb3AgMAorICogQGZjbG9vcF9zdGF0ZTEJCTogc3RhdGUgb2YgZmMgbG9vcCAxCisgKiBAZmNsb29wX3N0YXRlX3JzdmQJCToKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CWdsb2JhbF9jb3VudGVyOworCXVpbnQ4X3QJCXBhcmFtX2NvdW50ZXI7CisJdWludDhfdAkJcGFyYW1faWQ7CisJdWludDE2X3QJcGFyYW1fdmFsOworCXVpbnQ4X3QJCXdyaXRlX2NvbmZpZ19jb3VudGVyOworCXVpbnQ4X3QJCXdyaXRlX2NvbmZpZ19yc3ZkWzNdOworCXVpbnQ4X3QJCWxkcnZfb3BfY291bnRlcjsKKwl1aW50OF90CQlsZHJ2X29waWQ7CisJdWludDhfdAkJbGRydl9vcGNtZDsKKwl1aW50OF90CQlsZHJ2X29wc3RhdHVzOworCXVpbnQ4X3QJCWxkcnZfc3RhdGVfY291bnRlcjsKKwl1aW50OF90CQlsZHJ2X3N0YXRlX2lkOworCXVpbnQ4X3QJCWxkcnZfc3RhdGVfbmV3OworCXVpbnQ4X3QJCWxkcnZfc3RhdGVfb2xkOworCXVpbnQ4X3QJCXBkcnZfc3RhdGVfY291bnRlcjsKKwl1aW50OF90CQlwZHJ2X3N0YXRlX2lkOworCXVpbnQ4X3QJCXBkcnZfc3RhdGVfbmV3OworCXVpbnQ4X3QJCXBkcnZfc3RhdGVfb2xkOworCXVpbnQ4X3QJCXBkcnZfZm10X2NvdW50ZXI7CisJdWludDhfdAkJcGRydl9mbXRfaWQ7CisJdWludDhfdAkJcGRydl9mbXRfdmFsOworCXVpbnQ4X3QJCXBkcnZfZm10X3JzdmQ7CisJdWludDhfdAkJdGFyZ194ZmVyX2NvdW50ZXI7CisJdWludDhfdAkJdGFyZ194ZmVyX2lkOworCXVpbnQ4X3QJCXRhcmdfeGZlcl92YWw7CisJdWludDhfdAkJdGFyZ194ZmVyX3JzdmQ7CisJdWludDhfdAkJZmNsb29wX2lkX2NoZ19jb3VudGVyOworCXVpbnQ4X3QJCWZjbG9vcGlkX3BkcnZpZDsKKwl1aW50OF90CQlmY2xvb3BfaWQwOworCXVpbnQ4X3QJCWZjbG9vcF9pZDE7CisJdWludDhfdAkJZmNsb29wX3N0YXRlX2NvdW50ZXI7CisJdWludDhfdAkJZmNsb29wX3N0YXRlMDsKKwl1aW50OF90CQlmY2xvb3Bfc3RhdGUxOworCXVpbnQ4X3QJCWZjbG9vcF9zdGF0ZV9yc3ZkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfbm90aWZ5X3Q7CisKKworLyoqCisgKiBtcmFpZF9pbnF1aXJ5M190IC0gZW5xdWlyeSBmb3IgZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogQGRhdGFfc2l6ZQkJOiBjdXJyZW50IHNpemUgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgcmVzdmQpCisgKiBAbm90aWZ5CQk6CisgKiBAbm90aWZ5X3JzdmQJCToKKyAqIEByZWJ1aWxkX3JhdGUJOiByZWJ1aWxkIHJhdGUgKDAlIC0gMTAwJSkKKyAqIEBjYWNoZV9mbHVzaF9pbnQJOiBjYWNoZSBmbHVzaCBpbnRlcnZhbCBpbiBzZWNvbmRzCisgKiBAc2Vuc2VfYWxlcnQJCToKKyAqIEBkcml2ZV9pbnNlcnRfY291bnQJOiBkcml2ZSBpbnNlcnRpb24gY291bnQKKyAqIEBiYXR0ZXJ5X3N0YXR1cwk6CisgKiBAbnVtX2xkcnYJCTogbm8uIG9mIExvZyBEcml2ZXMgY29uZmlndXJlZAorICogQHJlY29uX3N0YXRlCQk6IHN0YXRlIG9mIHJlY29uc3RydWN0CisgKiBAbGRydl9vcF9zdGF0dXMJOiBsb2dkcnYgU3RhdHVzCisgKiBAbGRydl9zaXplCQk6IHNpemUgb2YgZWFjaCBsb2cgZHJ2CisgKiBAbGRydl9wcm9wCQk6CisgKiBAbGRydl9zdGF0ZQkJOiBzdGF0ZSBvZiBsb2cgZHJpdmVzCisgKiBAcGRydl9zdGF0ZQkJOiBzdGF0ZSBvZiBwaHlzIGRydnMuCisgKiBAcGRydl9mb3JtYXQJCToKKyAqIEB0YXJnX3hmZXIJCTogcGh5cyBkZXZpY2UgdHJhbnNmZXIgcmF0ZQorICogQHBhZDFrCQk6IDc2MSArIDI2M3Jlc2VydmVkID0gMTAyNCBieXRlcyB0b3RhbCBzaXplCisgKi8KKyNkZWZpbmUgTUFYX05PVElGWV9TSVpFCQkweDgwCisjZGVmaW5lIENVUl9OT1RJRllfU0laRQkJc2l6ZW9mKG1yYWlkX25vdGlmeV90KQorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QJZGF0YV9zaXplOworCisJbXJhaWRfbm90aWZ5X3QJbm90aWZ5OworCisJdWludDhfdAkJbm90aWZ5X3JzdmRbTUFYX05PVElGWV9TSVpFIC0gQ1VSX05PVElGWV9TSVpFXTsKKworCXVpbnQ4X3QJCXJlYnVpbGRfcmF0ZTsKKwl1aW50OF90CQljYWNoZV9mbHVzaF9pbnQ7CisJdWludDhfdAkJc2Vuc2VfYWxlcnQ7CisJdWludDhfdAkJZHJpdmVfaW5zZXJ0X2NvdW50OworCisJdWludDhfdAkJYmF0dGVyeV9zdGF0dXM7CisJdWludDhfdAkJbnVtX2xkcnY7CisJdWludDhfdAkJcmVjb25fc3RhdGVbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTEQgLyA4XTsKKwl1aW50MTZfdAlsZHJ2X29wX3N0YXR1c1tNQVhfTE9HSUNBTF9EUklWRVNfNDBMRCAvIDhdOworCisJdWludDMyX3QJbGRydl9zaXplW01BWF9MT0dJQ0FMX0RSSVZFU180MExEXTsKKwl1aW50OF90CQlsZHJ2X3Byb3BbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOworCXVpbnQ4X3QJCWxkcnZfc3RhdGVbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOworCXVpbnQ4X3QJCXBkcnZfc3RhdGVbRkNfTUFYX1BIWVNJQ0FMX0RFVklDRVNdOworCXVpbnQxNl90CXBkcnZfZm9ybWF0W0ZDX01BWF9QSFlTSUNBTF9ERVZJQ0VTIC8gMTZdOworCisJdWludDhfdAkJdGFyZ194ZmVyWzgwXTsKKwl1aW50OF90CQlwYWQxa1syNjNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfaW5xdWlyeTNfdDsKKworCisvKioKKyAqIG1yYWlkX2FkYXBpbmZvX3QgLSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWRhcHRlcgorICogQG1heF9jb21tYW5kcwkJOiBtYXggY29uY3VycmVudCBjb21tYW5kcyBzdXBwb3J0ZWQKKyAqIEByZWJ1aWxkX3JhdGUJCTogcmVidWlsZCByYXRlIC0gMCUgdGhydSAxMDAlCisgKiBAbWF4X3RhcmdfcGVyX2NoYW4JCTogbWF4IHRhcmcgcGVyIGNoYW5uZWwKKyAqIEBuY2hhbm5lbHMJCQk6IG51bWJlciBvZiBjaGFubmVscyBvbiBIQkEKKyAqIEBmd192ZXJzaW9uCQkJOiBmaXJtd2FyZSB2ZXJzaW9uCisgKiBAYWdlX29mX2ZsYXNoCQk6IG51bWJlciBvZiB0aW1lcyBGVyBoYXMgYmVlbiBmbGFzaGVkCisgKiBAY2hpcF9zZXRfdmFsdWUJCTogY29udGVudHMgb2YgMHhDMDAwMDgzMgorICogQGRyYW1fc2l6ZQkJCTogaW4gTUIKKyAqIEBjYWNoZV9mbHVzaF9pbnRlcnZhbAk6IGluIHNlY29uZHMKKyAqIEBiaW9zX3ZlcnNpb24JCToKKyAqIEBib2FyZF90eXBlCQkJOgorICogQHNlbnNlX2FsZXJ0CQkJOgorICogQHdyaXRlX2NvbmZpZ19jb3VudAkJOiBpbmNyZWFzZSB3aXRoIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gY2hhbmdlCisgKiBAZHJpdmVfaW5zZXJ0ZWRfY291bnQJOiBpbmNyZWFzZSB3aXRoIGV2ZXJ5IGRyaXZlIGluc2VydGVkCisgKiBAaW5zZXJ0ZWRfZHJpdmUJCTogY2hhbm5lbDpJZCBvZiBpbnNlcnRlZCBkcml2ZQorICogQGJhdHRlcnlfc3RhdHVzCQk6IGJpdCAwOiBiYXR0ZXJ5IG1vZHVsZSBtaXNzaW5nCisgKgkJCQliaXQgMTogVkJBRAorICoJCQkJYml0IDI6IHRlbXByYXR1cmUgaGlnaAorICoJCQkJYml0IDM6IGJhdHRlcnkgcGFjayBtaXNzaW5nCisgKgkJCQliaXQgNCw1OgorICoJCQkJCTAwIC0gY2hhcmdlIGNvbXBsZXRlCisgKgkJCQkJMDEgLSBmYXN0IGNoYXJnZSBpbiBwcm9ncmVzcworICoJCQkJCTEwIC0gZmFzdCBjaGFyZ2UgZmFpbAorICoJCQkJCTExIC0gdW5kZWZpbmVkCisgKgkJCQliaXQgNjogY291bnRlciA+IDEwMDAKKyAqCQkJCWJpdCA3OiBVbmRlZmluZWQKKyAqIEBkZWNfZmF1bHRfYnVzX2luZm8JCToKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCW1heF9jb21tYW5kczsKKwl1aW50OF90CQlyZWJ1aWxkX3JhdGU7CisJdWludDhfdAkJbWF4X3RhcmdfcGVyX2NoYW47CisJdWludDhfdAkJbmNoYW5uZWxzOworCXVpbnQ4X3QJCWZ3X3ZlcnNpb25bNF07CisJdWludDE2X3QJYWdlX29mX2ZsYXNoOworCXVpbnQ4X3QJCWNoaXBfc2V0X3ZhbHVlOworCXVpbnQ4X3QJCWRyYW1fc2l6ZTsKKwl1aW50OF90CQljYWNoZV9mbHVzaF9pbnRlcnZhbDsKKwl1aW50OF90CQliaW9zX3ZlcnNpb25bNF07CisJdWludDhfdAkJYm9hcmRfdHlwZTsKKwl1aW50OF90CQlzZW5zZV9hbGVydDsKKwl1aW50OF90CQl3cml0ZV9jb25maWdfY291bnQ7CisJdWludDhfdAkJYmF0dGVyeV9zdGF0dXM7CisJdWludDhfdAkJZGVjX2ZhdWx0X2J1c19pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfYWRhcGluZm9fdDsKKworCisvKioKKyAqIG1yYWlkX2xkcnZfaW5mb190IC0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZ2ljYWwgZHJpdmVzCisgKiBAbmxkcnYJOiBOdW1iZXIgb2YgbG9naWNhbCBkcml2ZXMgY29uZmlndXJlZAorICogQHJzdmQJOgorICogQHNpemUJOiBzaXplIG9mIGVhY2ggbG9naWNhbCBkcml2ZQorICogQHByb3AJOgorICogQHN0YXRlCTogc3RhdGUgb2YgZWFjaCBsb2dpY2FsIGRyaXZlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90CQlubGRydjsKKwl1aW50OF90CQlyc3ZkWzNdOworCXVpbnQzMl90CXNpemVbTUFYX0xPR0lDQUxfRFJJVkVTXzhMRF07CisJdWludDhfdAkJcHJvcFtNQVhfTE9HSUNBTF9EUklWRVNfOExEXTsKKwl1aW50OF90CQlzdGF0ZVtNQVhfTE9HSUNBTF9EUklWRVNfOExEXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX2xkcnZfaW5mb190OworCisKKy8qKgorICogbXJhaWRfcGRydl9pbmZvX3QgLSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGh5c2ljYWwgZHJpdmVzCisgKiBAcGRydl9zdGF0ZQk6IHN0YXRlIG9mIGVhY2ggcGh5c2ljYWwgZHJpdmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QJCXBkcnZfc3RhdGVbTUJPWF9NQVhfUEhZU0lDQUxfRFJJVkVTXTsKKwl1aW50OF90CQlyc3ZkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbXJhaWRfcGRydl9pbmZvX3Q7CisKKworLyoqCisgKiBtcmFpZF9pbnF1aXJ5X3QgLSBSQUlEIGlucXVpcnksIG1haWxib3ggY29tbWFuZCAweDA1CisgKiBAbXJhaWRfYWRhcGluZm9fdAk6IGFkYXB0ZXIgaW5mb3JtYXRpb24KKyAqIEBtcmFpZF9sZHJ2X2luZm9fdAk6IGxvZ2ljYWwgZHJpdmVzIGluZm9ybWF0aW9uCisgKiBAbXJhaWRfcGRydl9pbmZvX3QJOiBwaHlzaWNhbCBkcml2ZXMgaW5mb3JtYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCW1yYWlkX2FkYXBpbmZvX3QJYWRhcHRlcl9pbmZvOworCW1yYWlkX2xkcnZfaW5mb190CWxvZ2Rydl9pbmZvOworCW1yYWlkX3BkcnZfaW5mb190CXBkcnZfaW5mbzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIG1yYWlkX2lucXVpcnlfdDsKKworCisvKioKKyAqIG1yYWlkX2V4dGlucV90IC0gUkFJRCBleHRlbmRlZCBpbnF1aXJ5LCBtYWlsYm94IGNvbW1hbmQgMHgwNAorICoKKyAqIEByYWlkX2lucQkJOiByYWlkIGlucXVpcnkKKyAqIEBwaHlzX2Rydl9mb3JtYXQJOgorICogQHN0YWNrX2F0dG4JCToKKyAqIEBtb2RlbV9zdGF0dXMJOgorICogQHJzdmQJCToKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCW1yYWlkX2lucXVpcnlfdAlyYWlkX2lucTsKKwl1aW50MTZfdAlwaHlzX2Rydl9mb3JtYXRbTUFYX01CT1hfQ0hBTk5FTFNdOworCXVpbnQ4X3QJCXN0YWNrX2F0dG47CisJdWludDhfdAkJbW9kZW1fc3RhdHVzOworCXVpbnQ4X3QJCXJzdmRbMl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtcmFpZF9leHRpbnFfdDsKKworCisvKioKKyAqIGFkYXBfZGV2aWNlX3QgLSBkZXZpY2UgaW5mb3JtYXRpb24KKyAqIEBjaGFubmVsCTogY2hhbm5lbCBmcG9yIHRoZSBkZXZpY2UKKyAqIEB0YXJnZXQJOiB0YXJnZXQgSUQgb2YgdGhlIGRldmljZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJY2hhbm5lbDsKKwl1aW50OF90CQl0YXJnZXQ7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFkYXBfZGV2aWNlX3Q7CisKKworLyoqCisgKiBhZGFwX3NwYW5fNDBsZF90IC0gNDBMRCBzcGFuCisgKiBAc3RhcnRfYmxrCTogc3RhcnRpbmcgYmxvY2sKKyAqIEBudW1fYmxrcwk6IG51bWJlciBvZiBibG9ja3MKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CXN0YXJ0X2JsazsKKwl1aW50MzJfdAludW1fYmxrczsKKwlhZGFwX2RldmljZV90CWRldmljZVtNQVhfUk9XX1NJWkVfNDBMRF07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFkYXBfc3Bhbl80MGxkX3Q7CisKKworLyoqCisgKiBhZGFwX3NwYW5fOGxkX3QgLSA4TEQgc3BhbgorICogQHN0YXJ0X2Jsawk6IHN0YXJ0aW5nIGJsb2NrCisgKiBAbnVtX2Jsa3MJOiBudW1iZXIgb2YgYmxvY2tzCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAlzdGFydF9ibGs7CisJdWludDMyX3QJbnVtX2Jsa3M7CisJYWRhcF9kZXZpY2VfdAlkZXZpY2VbTUFYX1JPV19TSVpFXzhMRF07Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFkYXBfc3Bhbl84bGRfdDsKKworCisvKioKKyAqIGxvZ2Rydl9wYXJhbV90IC0gbG9naWNhbCBkcml2ZXMgcGFyYW1ldGVycworICoKKyAqIEBzcGFuX2RlcHRoCTogdG90YWwgbnVtYmVyIG9mIHNwYW5zCisgKiBAbGV2ZWwJOiBSQUlEIGxldmVsCisgKiBAcmVhZF9haGVhZAk6IHJlYWQgYWhlYWQsIG5vIHJlYWQgYWhlYWQsIGFkYXB0aXZlIHJlYWQgYWhlYWQKKyAqIEBzdHJpcGVfc3oJOiBlbmNvZGVkIHN0cmlwZSBzaXplCisgKiBAc3RhdHVzCTogc3RhdHVzIG9mIHRoZSBsb2dpY2FsIGRyaXZlCisgKiBAd3JpdGVfbW9kZQk6IHdyaXRlIG1vZGUsIHdyaXRlX3Rocm91Z2gvd3JpdGVfYmFjaworICogQGRpcmVjdF9pbwk6IGRpcmVjdCBpbyBvciB0aHJvdWdoIGNhY2hlCisgKiBAcm93X3NpemUJOiBudW1iZXIgb2Ygc3RyaXBlcyBpbiBhIHJvdworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJc3Bhbl9kZXB0aDsKKwl1aW50OF90CQlsZXZlbDsKKwl1aW50OF90CQlyZWFkX2FoZWFkOworCXVpbnQ4X3QJCXN0cmlwZV9zejsKKwl1aW50OF90CQlzdGF0dXM7CisJdWludDhfdAkJd3JpdGVfbW9kZTsKKwl1aW50OF90CQlkaXJlY3RfaW87CisJdWludDhfdAkJcm93X3NpemU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb2dkcnZfcGFyYW1fdDsKKworCisvKioKKyAqIGxvZ2Rydl80MGxkX3QgLSBsb2dpY2FsIGRyaXZlIGRlZmluaXRpb24gZm9yIDQwTEQgY29udHJvbGxlcnMKKyAqIEBscGFyYW0JOiBsb2dpY2FsIGRyaXZlcyBwYXJhbWV0ZXJzCisgKiBAc3Bhbgk6IHNwYW4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxvZ2Rydl9wYXJhbV90CQlscGFyYW07CisJYWRhcF9zcGFuXzQwbGRfdAlzcGFuW1NQQU5fREVQVEhfOF9TUEFOU107Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxvZ2Rydl80MGxkX3Q7CisKKworLyoqCisgKiBsb2dkcnZfOGxkX3NwYW44X3QgLSBsb2dpY2FsIGRyaXZlIGRlZmluaXRpb24gZm9yIDhMRCBjb250cm9sbGVycworICogQGxwYXJhbQk6IGxvZ2ljYWwgZHJpdmVzIHBhcmFtZXRlcnMKKyAqIEBzcGFuCTogc3BhbgorICoKKyAqIDgtTEQgbG9naWNhbCBkcml2ZSB3aXRoIHVwdG8gOCBzcGFucworICovCit0eXBlZGVmIHN0cnVjdCB7CisJbG9nZHJ2X3BhcmFtX3QJbHBhcmFtOworCWFkYXBfc3Bhbl84bGRfdAlzcGFuW1NQQU5fREVQVEhfOF9TUEFOU107Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxvZ2Rydl84bGRfc3BhbjhfdDsKKworCisvKioKKyAqIGxvZ2Rydl84bGRfc3BhbjRfdCAtIGxvZ2ljYWwgZHJpdmUgZGVmaW5pdGlvbiBmb3IgOExEIGNvbnRyb2xsZXJzCisgKiBAbHBhcmFtCTogbG9naWNhbCBkcml2ZXMgcGFyYW1ldGVycworICogQHNwYW4JOiBzcGFuCisgKgorICogOC1MRCBsb2dpY2FsIGRyaXZlIHdpdGggdXB0byA0IHNwYW5zCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsb2dkcnZfcGFyYW1fdAlscGFyYW07CisJYWRhcF9zcGFuXzhsZF90CXNwYW5bU1BBTl9ERVBUSF80X1NQQU5TXTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbG9nZHJ2XzhsZF9zcGFuNF90OworCisKKy8qKgorICogcGh5c19kcml2ZV90IC0gcGh5c2ljYWwgZGV2aWNlIGluZm9ybWF0aW9uCisgKiBAdHlwZQk6IFR5cGUgb2YgdGhlIGRldmljZQorICogQGN1cl9zdGF0dXMJOiBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZGV2aWNlCisgKiBAdGFnX2RlcHRoCTogTGV2ZWwgb2YgdGFnZ2luZworICogQHN5bmNfbmVnCTogc3luYyBuZWdvdGlhdGlvbiAtIEVOQUJMRSBvciBESVNCQUxFCisgKiBAc2l6ZQk6IGNvbmZpZ3VyYWJsZSBzaXplIGluIHRlcm1zIG9mIDUxMiBieXRlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90CQl0eXBlOworCXVpbnQ4X3QJCWN1cl9zdGF0dXM7CisJdWludDhfdAkJdGFnX2RlcHRoOworCXVpbnQ4X3QJCXN5bmNfbmVnOworCXVpbnQzMl90CXNpemU7Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBoeXNfZHJpdmVfdDsKKworCisvKioKKyAqIGRpc2tfYXJyYXlfNDBsZF90IC0gZGlzayBhcnJheSBmb3IgNDBMRCBjb250cm9sbGVycworICogQG51bWxkcnYJOiBudW1iZXIgb2YgbG9naWNhbCBkcml2ZXMKKyAqIEByZXN2ZAk6CisgKiBAbGRydgk6IGxvZ2ljYWwgZHJpdmVzIGluZm9ybWF0aW9uCisgKiBAcGRydgk6IHBoeXNpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJbnVtbGRydjsKKwl1aW50OF90CQlyZXN2ZFszXTsKKwlsb2dkcnZfNDBsZF90CWxkcnZbTUFYX0xPR0lDQUxfRFJJVkVTXzQwTERdOworCXBoeXNfZHJpdmVfdAlwZHJ2W01CT1hfTUFYX1BIWVNJQ0FMX0RSSVZFU107Cit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRpc2tfYXJyYXlfNDBsZF90OworCisKKy8qKgorICogZGlza19hcnJheV84bGRfc3BhbjhfdCAtIGRpc2sgYXJyYXkgZm9yIDhMRCBjb250cm9sbGVycworICogQG51bWxkcnYJOiBudW1iZXIgb2YgbG9naWNhbCBkcml2ZXMKKyAqIEByZXN2ZAk6CisgKiBAbGRydgk6IGxvZ2ljYWwgZHJpdmVzIGluZm9ybWF0aW9uCisgKiBAcGRydgk6IHBoeXNpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICoKKyAqIERpc2sgYXJyYXkgZm9yIDhMRCBsb2dpY2FsIGRyaXZlcyB3aXRoIHVwdG8gOCBzcGFucworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJCW51bWxkcnY7CisJdWludDhfdAkJCXJlc3ZkWzNdOworCWxvZ2Rydl84bGRfc3BhbjhfdAlsZHJ2W01BWF9MT0dJQ0FMX0RSSVZFU184TERdOworCXBoeXNfZHJpdmVfdAkJcGRydltNQk9YX01BWF9QSFlTSUNBTF9EUklWRVNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkaXNrX2FycmF5XzhsZF9zcGFuOF90OworCisKKy8qKgorICogZGlza19hcnJheV84bGRfc3BhbjRfdCAtIGRpc2sgYXJyYXkgZm9yIDhMRCBjb250cm9sbGVycworICogQG51bWxkcnYJOiBudW1iZXIgb2YgbG9naWNhbCBkcml2ZXMKKyAqIEByZXN2ZAk6CisgKiBAbGRydgk6IGxvZ2ljYWwgZHJpdmVzIGluZm9ybWF0aW9uCisgKiBAcGRydgk6IHBoeXNpY2FsIGRyaXZlcyBpbmZvcm1hdGlvbgorICoKKyAqIERpc2sgYXJyYXkgZm9yIDhMRCBsb2dpY2FsIGRyaXZlcyB3aXRoIHVwdG8gNCBzcGFucworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJCW51bWxkcnY7CisJdWludDhfdAkJCXJlc3ZkWzNdOworCWxvZ2Rydl84bGRfc3BhbjRfdAlsZHJ2W01BWF9MT0dJQ0FMX0RSSVZFU184TERdOworCXBoeXNfZHJpdmVfdAkJcGRydltNQk9YX01BWF9QSFlTSUNBTF9EUklWRVNdOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBkaXNrX2FycmF5XzhsZF9zcGFuNF90OworCisKKy8qKgorICogcHJpdmF0ZV9iaW9zX2RhdGEgLSBiaW9zIHByaXZhdGUgZGF0YSBmb3IgYm9vdCBkZXZpY2VzCisgKiBAZ2VvbWV0cnkJOiBiaXRzIDAtMyAtIEJJT1MgZ2VvbWV0cnksIDB4MDAwMSAtIDFHQiwgMHgwMDEwIC0gMkdCLAorICoJCTB4MTAwMCAtIDhHQiwgT3RoZXJzIHZhbHVlcyBhcmUgaW52YWxpZAorICogQHVudXNlZAk6IGJpdHMgNC03IGFyZSB1bnVzZWQKKyAqIEBib290X2Rydgk6IGxvZ2ljYWwgZHJpdmUgc2V0IGFzIGJvb3QgZHJpdmUsIDAuLjcgLSBmb3IgOExEIGNhcmRzLAorICogCQkwLi4zOSAtIGZvciA0MExEIGNhcmRzCisgKiBAY2tzdW0JOiAwLShzdW0gb2YgZmlyc3QgMTMgYnl0ZXMgb2YgdGhpcyBzdHJ1Y3R1cmUpCisgKi8KK3N0cnVjdCBwcml2YXRlX2Jpb3NfZGF0YSB7CisJdWludDhfdAkJZ2VvbWV0cnkJOjQ7CisJdWludDhfdAkJdW51c2VkCQk6NDsKKwl1aW50OF90CQlib290X2RydjsKKwl1aW50OF90CQlyc3ZkWzEyXTsKKwl1aW50MTZfdAlja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qKgorICogbWJveF9zZ2w2NCAtIDY0LWJpdCBzY2F0dGVyIGxpc3QgZm9yIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqIEBhZGRyZXNzCTogYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisgKiBAbGVuZ3RoCTogZGF0YSB0cmFuc2ZlciBsZW5ndGgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ2NF90CWFkZHJlc3M7CisJdWludDMyX3QJbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWJveF9zZ2w2NDsKKworLyoqCisgKiBtYm94X3NnbDMyIC0gMzItYml0IHNjYXR0ZXIgbGlzdCBmb3IgbWFpbGJveCBiYXNlZCBjb250cm9sbGVycworICogQGFkZHJlc3MJOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqIEBsZW5ndGgJOiBkYXRhIHRyYW5zZmVyIGxlbmd0aAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QJYWRkcmVzczsKKwl1aW50MzJfdAlsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBtYm94X3NnbDMyOworCisjZW5kaWYJCS8vIF9NUkFJRF9NQk9YX0RFRlNfSF8KKworLyogdmltOiBzZXQgdHM9OCBzdz04IHR3PTc4OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FfY29tbW9uLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk2OWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FfY29tbW9uLmgKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKgorICoJCQlMaW51eCBNZWdhUkFJRCBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgkgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZJTEUJCTogbWVnYV9jb21tb24uaAorICoKKyAqIExpYmFyYXkgb2YgY29tbW9uIHJvdXRpbmUgdXNlZCBieSBhbGwgbG93LWxldmVsIG1lZ2FyYWlkIGRyaXZlcnMKKyAqLworCisjaWZuZGVmIF9NRUdBX0NPTU1PTl9IXworI2RlZmluZSBfTUVHQV9DT01NT05fSF8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworCisjZGVmaW5lIExTSV9NQVhfQ0hBTk5FTFMJCTE2CisjZGVmaW5lIExTSV9NQVhfTE9HSUNBTF9EUklWRVNfNjRMRAkoNjQrMSkKKworCisvKioKKyAqIHNjYl90IC0gc2NzaSBjb21tYW5kIGNvbnRyb2wgYmxvY2sKKyAqIEBwYXJhbSBjY2IJCTogY29tbWFuZCBjb250cm9sIGJsb2NrIGZvciBpbmRpdmlkdWFsIGRyaXZlcgorICogQHBhcmFtIGxpc3QJCTogbGlzdCBvZiBjb250cm9sIGJsb2NrcworICogQHBhcmFtIGdwCQk6IGdlbmVyYWwgcHVycG9zZSBmaWVsZCBmb3IgTExEcworICogQHBhcmFtIHNubwkJOiBhbGwgU0NCcyBoYXZlIGEgc2VyaWFsIG51bWJlcgorICogQHBhcmFtIHNjcAkJOiBhc3NvY2lhdGVkIHNjc2kgY29tbWFuZAorICogQHBhcmFtIHN0YXRlCQk6IGN1cnJlbnQgc3RhdGUgb2Ygc2NiCisgKiBAcGFyYW0gZG1hX2Rpcgk6IGRpcmVjdGlvbiBvZiBkYXRhIHRyYW5zZmVyCisgKiBAcGFyYW0gZG1hX3R5cGUJOiB0cmFuc2ZlciB3aXRoIHNnIGxpc3QsIGJ1ZmZlciwgb3Igbm8gZGF0YSB0cmFuc2ZlcgorICogQHBhcmFtIGRldl9jaGFubmVsCTogYWN0dWFsIGNoYW5uZWwgb24gdGhlIGRldmljZQorICogQHBhcmFtIGRldl90YXJnZXQJOiBhY3R1YWwgdGFyZ2V0IG9uIHRoZSBkZXZpY2UKKyAqIEBwYXJhbSBzdGF0dXMJOiBjb21wbGV0aW9uIHN0YXR1cworICoKKyAqIFRoaXMgaXMgb3VyIGNlbnRyYWwgZGF0YSBzdHJ1Y3R1cmUgdG8gaXNzdWUgY29tbWFuZHMgdGhlIGVhY2ggZHJpdmVyLgorICogRHJpdmVyIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgY2NiIGZpZWxkLgorICogc2NiIHByb3ZpZGVzIGEgZmllbGQgJ2dwJywgd2hpY2ggY2FuIGJlIHVzZWQgYnkgTExEIGZvciBpdHMgb3duIHB1cnBvc2VzCisgKgorICogZGV2X2NoYW5uZWwgYW5kIGRldl90YXJnZXQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBhY3R1YWwgY2hhbm5lbCBhbmQKKyAqIHRhcmdldCBvbiB0aGUgY29udHJvbGxlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNhZGRyX3QJCQljY2I7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXVuc2lnbmVkIGxvbmcJCWdwOworCXVuc2lnbmVkIGludAkJc25vOworCXN0cnVjdCBzY3NpX2NtbmQJKnNjcDsKKwl1aW50MzJfdAkJc3RhdGU7CisJdWludDMyX3QJCWRtYV9kaXJlY3Rpb247CisJdWludDMyX3QJCWRtYV90eXBlOworCXVpbnQxNl90CQlkZXZfY2hhbm5lbDsKKwl1aW50MTZfdAkJZGV2X3RhcmdldDsKKwl1aW50MzJfdAkJc3RhdHVzOworfSBzY2JfdDsKKworLyoKKyAqIFNDQiBzdGF0ZXMgYXMgaXQgdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlcgorICovCisjZGVmaW5lIFNDQl9GUkVFCTB4MDAwMAkvKiBvbiB0aGUgZnJlZSBsaXN0ICovCisjZGVmaW5lIFNDQl9BQ1RJVkUJMHgwMDAxCS8qIG9mZiB0aGUgZnJlZSBsaXN0ICovCisjZGVmaW5lIFNDQl9QRU5EUQkweDAwMDIJLyogb24gdGhlIHBlbmRpbmcgcXVldWUgKi8KKyNkZWZpbmUgU0NCX0lTU1VFRAkweDAwMDQJLyogaXNzdWVkIC0gb3duZXIgZi93ICovCisjZGVmaW5lIFNDQl9BQk9SVAkweDAwMDgJLyogR290IGFuIGFib3J0IGZvciB0aGlzIG9uZSAqLworI2RlZmluZSBTQ0JfUkVTRVQJMHgwMDEwCS8qIEdvdCBhIHJlc2V0IGZvciB0aGlzIG9uZSAqLworCisvKgorICogRE1BIHR5cGVzIGZvciBzY2IKKyAqLworI2RlZmluZSBNUkFJRF9ETUFfTk9ORQkweDAwMDAJLyogbm8gZGF0YSB0cmFuc2ZlciBmb3IgdGhpcyBjb21tYW5kICovCisjZGVmaW5lIE1SQUlEX0RNQV9XU0cJMHgwMDAxCS8qIGRhdGEgdHJhbnNmZXIgdXNpbmcgYSBzZyBsaXN0ICovCisjZGVmaW5lIE1SQUlEX0RNQV9XQlVGCTB4MDAwMgkvKiBkYXRhIHRyYW5zZmVyIHVzaW5nIGEgY29udGlndW91cyBidWZmZXIgKi8KKworCisvKioKKyAqIHN0cnVjdCBhZGFwdGVyX3QgLSBkcml2ZXIncyBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBkcGNfaAkJCTogdGFza2xldCBoYW5kbGUKKyAqIEBwYXJhbSBwZGV2CQkJOiBwY2kgY29uZmlndXJhdGlvbiBwb2ludGVyIGZvciBrZXJuZWwKKyAqIEBwYXJhbSBob3N0CQkJOiBwb2ludGVyIHRvIGhvc3Qgc3RydWN0dXJlIG9mIG1pZC1sYXllcgorICogQHBhcmFtIGhvc3RfbG9jawkJOiBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIGxvY2sKKyAqIEBwYXJhbSBsb2NrCQkJOiBzeW5jaHJvbml6YXRpb24gbG9jayBmb3IgbWlkLWxheWVyIGFuZCBkcml2ZXIKKyAqIEBwYXJhbSBxdWllc2NlbnQJCTogZHJpdmVyIGlzIHF1aWVzY2VudCBmb3Igbm93LgorICogQHBhcmFtIG91dHN0YW5kaW5nX2NtZHMJOiBudW1iZXIgb2YgY29tbWFuZHMgcGVuZGluZyBpbiB0aGUgZHJpdmVyCisgKiBAcGFyYW0ga3NjYl9saXN0CQk6IHBvaW50ZXIgdG8gdGhlIGJ1bGsgb2YgU0NCcyBwb2ludGVycyBmb3IgSU8KKyAqIEBwYXJhbSBrc2NiX3Bvb2wJCTogcG9vbCBvZiBmcmVlIHNjYnMgZm9yIElPCisgKiBAcGFyYW0ga3NjYl9wb29sX2xvY2sJOiBsb2NrIGZvciBwb29sIG9mIGZyZWUgc2NicworICogQHBhcmFtIHBlbmRfbGlzdAkJOiBwZW5kaW5nIGNvbW1hbmRzIGxpc3QKKyAqIEBwYXJhbSBwZW5kX2xpc3RfbG9jawk6IGV4bHVzaW9uIGxvY2sgZm9yIHBlbmRpbmcgY29tbWFuZHMgbGlzdAorICogQHBhcmFtIGNvbXBsZXRlZF9saXN0CTogbGlzdCBvZiBjb21wbGV0ZWQgY29tbWFuZHMKKyAqIEBwYXJhbSBjb21wbGV0ZWRfbGlzdF9sb2NrCTogZXhjbHVzaW9uIGxvY2sgZm9yIGxpc3Qgb2YgY29tcGxldGVkIGNvbW1hbmRzCisgKiBAcGFyYW0gc2dsZW4JCQk6IG1heCBzZyBlbGVtZW50cyBzdXBwb3J0ZWQKKyAqIEBwYXJhbSBkZXZpY2VfaWRzCQk6IHRvIGNvbnZlcnQga2VybmVsIGRldmljZSBhZGRyIHRvIG91ciBkZXZpY2VzLgorICogQHBhcmFtIHJhaWRfZGV2aWNlCQk6IHJhaWQgYWRhcHRlciBzcGVjaWZpYyBwb2ludGVyCisgKiBAcGFyYW0gbWF4X2NoYW5uZWwJCTogbWF4aW11bSBjaGFubmVsIG51bWJlciBzdXBwb3J0ZWQgLSBpbmNsdXNpdmUKKyAqIEBwYXJhbSBtYXhfdGFyZ2V0CQk6IG1heCB0YXJnZXQgc3VwcG9ydGVkIC0gaW5jbHVzaXZlCisgKiBAcGFyYW0gbWF4X2x1bgkJOiBtYXggbHVuIHN1cHBvcnRlZCAtIGluY2x1c2l2ZQorICogQHBhcmFtIHVuaXF1ZV9pZAkJOiB1bmlxdWUgaWRlbnRpZmllciBmb3IgZWFjaCBhZGFwdGVyCisgKiBAcGFyYW0gaXJxCQkJOiBJUlEgZm9yIHRoaXMgYWRhcHRlcgorICogQHBhcmFtIGl0bwkJCTogaW50ZXJuYWwgdGltZW91dCB2YWx1ZSwgKC0xKSBtZWFucyBubyB0aW1lb3V0CisgKiBAcGFyYW0gaWJ1ZgkJCTogYnVmZmVyIHRvIGlzc3VlIGludGVybmFsIGNvbW1hbmRzCisgKiBAcGFyYW0gaWJ1Zl9kbWFfaAkJOiBkbWEgaGFuZGxlIGZvciB0aGUgYWJvdmUgYnVmZmVyCisgKiBAcGFyYW0gdXNjYl9saXN0CQk6IFNDQiBwb2ludGVycyBmb3IgdXNlciBjbWRzLCBjb21tb24gbWdtdCBtb2R1bGUKKyAqIEBwYXJhbSB1c2NiX3Bvb2wJCTogcG9vbCBvZiBTQ0JzIGZvciB1c2VyIGNvbW1hbmRzCisgKiBAcGFyYW0gdXNjYl9wb29sX2xvY2sJOiBleGNsdXNpb24gbG9jayBmb3IgdGhlc2UgU0NCcworICogQHBhcmFtIG1heF9jbWRzCQk6IG1heCBvdXRzdGFuZGluZyBjb21tYW5kcworICogQHBhcmFtIGZ3X3ZlcnNpb24JCTogZmlybXdhcmUgdmVyc2lvbgorICogQHBhcmFtIGJpb3NfdmVyc2lvbgkJOiBiaW9zIHZlcnNpb24KKyAqIEBwYXJhbSBtYXhfY2RiX3N6CQk6IGJpZ2dlc3QgQ0RCIHNpemUgc3VwcG9ydGVkLgorICogQHBhcmFtIGhhCQkJOiBpcyBoaWdoIGF2YWlsYWJpbGl0eSBwcmVzZW50IC0gY2x1c3RlcmluZworICogQHBhcmFtIGluaXRfaWQJCTogaW5pdGlhdG9yIElELCB0aGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgNworICogQHBhcmFtIG1heF9zZWN0b3JzCQk6IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0CisgKiBAcGFyYW0gY21kX3Blcl9sdW4JCTogbWF4IG91dHN0YW5kaW5nIGNvbW1hbmRzIHBlciBMVU4KKyAqIEBwYXJhbSBiZWluZ19kZXRhY2hlZAk6IHNldCB3aGVuIHVubG9hZGluZywgbm8gbW9yZSBtZ210IGNhbGxzCisgKgorICoKKyAqIG1yYWlkX3NldHVwX2RldmljZV9tYXAoKSBjYW4gYmUgY2FsbGVkIGFueXRpbWUgYWZ0ZXIgdGhlIGRldmljZSBtYXAgaXMKKyAqIGF2YWlsYWJsZSBhbmQgTVJBSURfR0VUX0RFVklDRV9NQVAoKSBjYW4gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtYXBwaW5nIGlzCisgKiByZXF1aXJlZCwgdXN1YWxseSBmcm9tIExMRCdzIHF1ZXVlIGVudHJ5IHBvaW50LiBUaGUgZm9ybWFyIEFQSSBzZXRzIHVwIHRoZQorICogTVJBSURfSVNfTE9HSUNBTChhZGFwdGVyX3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKSB0byBmaW5kIG91dCBpZiB0aGUKKyAqIGRldmljZSBpbiBxdWVzdGlvbiBpcyBhIGxvZ2ljYWwgZHJpdmUuCisgKgorICogcXVpZXNjZW50IGZsYWcgc2hvdWxkIGJlIHNldCBieSB0aGUgZHJpdmVyIGlmIGl0IGlzIG5vdCBhY2NlcHRpbmcgbW9yZQorICogY29tbWFuZHMKKyAqCisgKiBOT1RFOiBUaGUgZmllbGRzIG9mIHRoaXMgc3RydWN0dXJlcyBhcmUgcGxhY2VkIHRvIG1pbmltaXplIGNhY2hlIG1pc3NlcworICovCisKKy8vIGFtb3VudCBvZiBzcGFjZSByZXF1aXJlZCB0byBzdG9yZSB0aGUgYmlvcyBhbmQgZmlybXdhcmUgdmVyc2lvbiBzdHJpbmdzCisjZGVmaW5lIFZFUlNJT05fU0laRQkxNgorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWRwY19oOworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCXNwaW5sb2NrX3QJCSpob3N0X2xvY2s7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1aW50OF90CQkJcXVpZXNjZW50OworCWludAkJCW91dHN0YW5kaW5nX2NtZHM7CisJc2NiX3QJCQkqa3NjYl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJa3NjYl9wb29sOworCXNwaW5sb2NrX3QJCWtzY2JfcG9vbF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZF9saXN0OworCXNwaW5sb2NrX3QJCXBlbmRfbGlzdF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJY29tcGxldGVkX2xpc3Q7CisJc3BpbmxvY2tfdAkJY29tcGxldGVkX2xpc3RfbG9jazsKKwl1aW50MTZfdAkJc2dsZW47CisJaW50CQkJZGV2aWNlX2lkc1tMU0lfTUFYX0NIQU5ORUxTXQorCQkJCQlbTFNJX01BWF9MT0dJQ0FMX0RSSVZFU182NExEXTsKKwljYWRkcl90CQkJcmFpZF9kZXZpY2U7CisJdWludDhfdAkJCW1heF9jaGFubmVsOworCXVpbnQxNl90CQltYXhfdGFyZ2V0OworCXVpbnQ4X3QJCQltYXhfbHVuOworCisJdWludDMyX3QJCXVuaXF1ZV9pZDsKKwl1aW50OF90CQkJaXJxOworCXVpbnQ4X3QJCQlpdG87CisJY2FkZHJfdAkJCWlidWY7CisJZG1hX2FkZHJfdAkJaWJ1Zl9kbWFfaDsKKwlzY2JfdAkJCSp1c2NiX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAl1c2NiX3Bvb2w7CisJc3BpbmxvY2tfdAkJdXNjYl9wb29sX2xvY2s7CisJaW50CQkJbWF4X2NtZHM7CisJdWludDhfdAkJCWZ3X3ZlcnNpb25bVkVSU0lPTl9TSVpFXTsKKwl1aW50OF90CQkJYmlvc192ZXJzaW9uW1ZFUlNJT05fU0laRV07CisJdWludDhfdAkJCW1heF9jZGJfc3o7CisJdWludDhfdAkJCWhhOworCXVpbnQxNl90CQlpbml0X2lkOworCXVpbnQxNl90CQltYXhfc2VjdG9yczsKKwl1aW50MTZfdAkJY21kX3Blcl9sdW47CisJYXRvbWljX3QJCWJlaW5nX2RldGFjaGVkOworfSBhZGFwdGVyX3Q7CisKKyNkZWZpbmUgU0NTSV9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKQkoJmFkYXB0ZXItPmtzY2JfcG9vbF9sb2NrKQorI2RlZmluZSBVU0VSX0ZSRUVfTElTVF9MT0NLKGFkYXB0ZXIpCSgmYWRhcHRlci0+dXNjYl9wb29sX2xvY2spCisjZGVmaW5lIFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpCSgmYWRhcHRlci0+cGVuZF9saXN0X2xvY2spCisjZGVmaW5lIENPTVBMRVRFRF9MSVNUX0xPQ0soYWRhcHRlcikJKCZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdF9sb2NrKQorCisKKy8vIGNvbnZlcnNpb24gZnJvbSBzY3NpIGNvbW1hbmQKKyNkZWZpbmUgU0NQMkhPU1Qoc2NwKQkJCShzY3ApLT5kZXZpY2UtPmhvc3QJLy8gdG8gaG9zdAorI2RlZmluZSBTQ1AySE9TVERBVEEoc2NwKQkJU0NQMkhPU1Qoc2NwKS0+aG9zdGRhdGEJLy8gdG8gc29mdCBzdGF0ZQorI2RlZmluZSBTQ1AyQ0hBTk5FTChzY3ApCQkoc2NwKS0+ZGV2aWNlLT5jaGFubmVsCS8vIHRvIGNoYW5uZWwKKyNkZWZpbmUgU0NQMlRBUkdFVChzY3ApCQkJKHNjcCktPmRldmljZS0+aWQJLy8gdG8gdGFyZ2V0CisjZGVmaW5lIFNDUDJMVU4oc2NwKQkJCShzY3ApLT5kZXZpY2UtPmx1bgkvLyB0byBMVU4KKworLy8gZ2VuZXJpYyBtYWNybyB0byBjb252ZXJ0IHNjc2kgY29tbWFuZCBhbmQgaG9zdCB0byBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorI2RlZmluZSBTQ1NJSE9TVDJBREFQKGhvc3QpCSgoKGNhZGRyX3QgKikoaG9zdC0+aG9zdGRhdGEpKVswXSkKKyNkZWZpbmUgU0NQMkFEQVBURVIoc2NwKQkoYWRhcHRlcl90ICopU0NTSUhPU1QyQURBUChTQ1AySE9TVChzY3ApKQorCisKKy8qKgorICogTVJBSURfR0VUX0RFVklDRV9NQVAgLSBkZXZpY2UgaWRzCisgKiBAcGFyYW0gYWRwCQktIEFkYXB0ZXIncyBzb2Z0IHN0YXRlCisgKiBAcGFyYW0gc2NwCQktIG1pZC1sYXllciBzY3NpIGNvbW1hbmQgcG9pbnRlcgorICogQHBhcmFtIHBfY2hhbgktIHBoeXNpY2FsIGNoYW5uZWwgb24gdGhlIGNvbnRyb2xsZXIKKyAqIEBwYXJhbSB0YXJnZXQJLSB0YXJnZXQgaWQgb2YgdGhlIGRldmljZSBvciBsb2dpY2FsIGRyaXZlIG51bWJlcgorICogQHBhcmFtIGlzbG9naWNhbAktIHNldCBpZiB0aGUgY29tbWFuZCBpcyBmb3IgdGhlIGxvZ2ljYWwgZHJpdmUKKyAqCisgKiBNYWNybyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBkZXZpY2UgY2xhc3MsIGxvZ2ljYWwgb3IgcGh5c2ljYWwgYW5kCisgKiB0aGUgY29ycmVzcG9uZGluZyBwaHlzaWNhbCBjaGFubmVsIGFuZCB0YXJnZXQgb3IgbG9naWNhbCBkcml2ZSBudW1iZXIKKyAqKi8KKyNkZWZpbmUgTVJBSURfSVNfTE9HSUNBTChhZHAsIHNjcCkJXAorCShTQ1AyQ0hBTk5FTChzY3ApID09IChhZHApLT5tYXhfY2hhbm5lbCkgPyAxIDogMAorCisjZGVmaW5lIE1SQUlEX0lTX0xPR0lDQUxfU0RFVihhZHAsIHNkZXYpCVwKKwkoc2Rldi0+Y2hhbm5lbCA9PSAoYWRwKS0+bWF4X2NoYW5uZWwpID8gMSA6IDAKKworI2RlZmluZSBNUkFJRF9HRVRfREVWSUNFX01BUChhZHAsIHNjcCwgcF9jaGFuLCB0YXJnZXQsIGlzbG9naWNhbCkJXAorCS8qCQkJCQkJCQlcCisJICogSXMgdGhlIHJlcXVlc3QgY29taW5nIGZvciB0aGUgdmlydHVhbCBjaGFubmVsCQlcCisJICovCQkJCQkJCQlcCisJaXNsb2dpY2FsID0gTVJBSURfSVNfTE9HSUNBTChhZHAsIHNjcCk7CQkJCVwKKwkJCQkJCQkJCVwKKwkvKgkJCQkJCQkJXAorCSAqIEdldCBhbiBpbmRleCBpbnRvIG91ciB0YWJsZSBvZiBkcml2ZSBpZHMgbWFwcGluZwkJXAorCSAqLwkJCQkJCQkJXAorCWlmIChpc2xvZ2ljYWwpIHsJCQkJCQlcCisJCXBfY2hhbiA9IDB4RkY7CQkJCQkJXAorCQl0YXJnZXQgPQkJCQkJCVwKKwkJKGFkcCktPmRldmljZV9pZHNbKGFkcCktPm1heF9jaGFubmVsXVtTQ1AyVEFSR0VUKHNjcCldOwlcCisJfQkJCQkJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQlwX2NoYW4gPSAoKGFkcCktPmRldmljZV9pZHNbU0NQMkNIQU5ORUwoc2NwKV0JCVwKKwkJCQkJW1NDUDJUQVJHRVQoc2NwKV0gPj4gOCkgJiAweEZGOwlcCisJCXRhcmdldCA9ICgoYWRwKS0+ZGV2aWNlX2lkc1tTQ1AyQ0hBTk5FTChzY3ApXQkJXAorCQkJCQlbU0NQMlRBUkdFVChzY3ApXSAmIDB4RkYpOwlcCisJfQorCisvKgorICogIyMjIEhlbHBlciByb3V0aW5lcyAjIyMKKyAqLworI2RlZmluZSBMU0lfREJHTFZMIG1yYWlkX2RlYnVnX2xldmVsCS8vIGVhY2ggTExEIG11c3QgZGVmaW5lIGEgZ2xvYmFsCisgCQkJCQkvLyBtcmFpZF9kZWJ1Z19sZXZlbAorCisjaWZkZWYgREVCVUcKKyNpZiBkZWZpbmVkIChfQVNTRVJUX1BBTklDKQorI2RlZmluZSBBU1NFUlRfQUNUSU9OCXBhbmljCisjZWxzZQorI2RlZmluZSBBU1NFUlRfQUNUSU9OCXByaW50aworI2VuZGlmCisKKyNkZWZpbmUgQVNTRVJUKGV4cHJlc3Npb24pCQkJCQkJXAorCWlmICghKGV4cHJlc3Npb24pKSB7CQkJCQkJXAorCUFTU0VSVF9BQ1RJT04oImFzc2VydGlvbiBmYWlsZWQ6KCVzKSwgZmlsZTogJXMsIGxpbmU6ICVkOiVzXG4iLAlcCisJCQkjZXhwcmVzc2lvbiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwlcCisJfQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cHJlc3Npb24pCisjZW5kaWYKKworLyoKKyAqIHN0cnVjdCBtcmFpZF9wY2lfYmxrIC0gc3RydWN0dXJlIGhvbGRzIERNQSBtZW1vcnkgYmxvY2sgaW5mbworICogQHBhcmFtIHZhZGRyCQk6IHZpcnR1YWwgYWRkcmVzcyB0byBhIG1lbW9yeSBibG9jaworICogQHBhcmFtIGRtYV9hZGRyCTogRE1BIGhhbmRsZSB0byBhIG1lbW9yeSBibG9jaworICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCB1cCBmb3IgdGhlIGNhbGxlci4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsdHkgb2YgdGhlCisgKiBjYWxsZXIgdG8gYWxsb2NhdGUgdGhpcyBhcnJheSBiaWcgZW5vdWdoIHRvIHN0b3JlIGFkZHJlc3NlcyBmb3IgYWxsCisgKiByZXF1ZXN0ZWQgZWxlbWVudHMKKyAqLworc3RydWN0IG1yYWlkX3BjaV9ibGsgeworCWNhZGRyX3QJCXZhZGRyOworCWRtYV9hZGRyX3QJZG1hX2FkZHI7Cit9OworCisjZW5kaWYgLy8gX01FR0FfQ09NTU9OX0hfCisKKy8vIHZpbTogc2V0IHRzPTggc3c9OCB0dz03ODoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9pb2N0bC5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZWUxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9pb2N0bC5oCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICoKKyAqCQkJTGludXggTWVnYVJBSUQgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0ICBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoJICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGSUxFCQk6IG1lZ2FyYWlkX2lvY3RsLmgKKyAqCisgKiBEZWZpbml0aW9ucyB0byBpbnRlcmZhY2Ugd2l0aCB1c2VyIGxldmVsIGFwcGxpY2F0aW9ucworICovCisKKyNpZm5kZWYgX01FR0FSQUlEX0lPQ1RMX0hfCisjZGVmaW5lIF9NRUdBUkFJRF9JT0NUTF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJtYm94X2RlZnMuaCIKKworLyoqCisgKiBjb25fbG9nKCkgLSBjb25zb2xlIGxvZyByb3V0aW5lCisgKiBAcGFyYW0gbGV2ZWwJCTogaW5kaWNhdGVzIHRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KKyAqIEBmcGFyYW0gbXQJCTogZm9ybWF0IHN0cmluZworICoKKyAqIGNvbl9sb2cgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIG9uIHRoZSBjb25zb2xlIGJhc2VkIG9uIHRoZSBjdXJyZW50CisgKiBkZWJ1ZyBsZXZlbC4gQWxzbyBpdCBhdHRhY2hlcyB0aGUgYXBwcm9wcmlhdGUga2VybmVsIHNldmVyaXR5IGxldmVsIHdpdGgKKyAqIHRoZSBtZXNzYWdlLgorICoKKyAqCisgKiBjb25zb2xnZSBtZXNzYWdlcyBkZWJ1ZyBsZXZlbHMKKyAqLworI2RlZmluZQlDTF9BTk4JCTAJLyogcHJpbnQgdW5jb25kaXRpb25hbGx5LCBhbm5vdW5jZW1lbnRzICovCisjZGVmaW5lIENMX0RMRVZFTDEJMQkvKiBkZWJ1ZyBsZXZlbCAxLCBpbmZvcm1hdGl2ZSAqLworI2RlZmluZSBDTF9ETEVWRUwyCTIJLyogZGVidWcgbGV2ZWwgMiwgdmVyYm9zZSAqLworI2RlZmluZSBDTF9ETEVWRUwzCTMJLyogZGVidWcgbGV2ZWwgMywgdmVyeSB2ZXJib3NlICovCisKKyNkZWZpbmUJY29uX2xvZyhsZXZlbCwgZm10KSBpZiAoTFNJX0RCR0xWTCA+PSBsZXZlbCkgcHJpbnRrIGZtdDsKKworLyoKKyAqIERlZmluaXRpb25zICYgRGVjbGFyYXRpb25zIG5lZWRlZCB0byB1c2UgY29tbW9uIG1hbmFnZW1lbnQgbW9kdWxlCisgKi8KKworI2RlZmluZSBNRUdBSU9DX01BR0lDCQknbScKKyNkZWZpbmUgTUVHQUlPQ0NNRAkJX0lPV1IoTUVHQUlPQ19NQUdJQywgMCwgbWltZF90KQorCisjZGVmaW5lIE1FR0FJT0NfUU5BREFQCQknbScJLyogUXVlcnkgIyBvZiBhZGFwdGVycwkJKi8KKyNkZWZpbmUgTUVHQUlPQ19RRFJWUlZFUgknZScJLyogUXVlcnkgZHJpdmVyIHZlcnNpb24JCSovCisjZGVmaW5lIE1FR0FJT0NfUUFEQVBJTkZPICAgCSdnJwkvKiBRdWVyeSBhZGFwdGVyIGluZm9ybWF0aW9uCSovCisKKyNkZWZpbmUgVVNDU0lDTUQJCTB4ODAKKyNkZWZpbmUgVUlPQ19SRAkJCTB4MDAwMDEKKyNkZWZpbmUgVUlPQ19XUgkJCTB4MDAwMDIKKworI2RlZmluZSBNQk9YX0NNRAkJMHgwMDAwMAorI2RlZmluZSBHRVRfRFJJVkVSX1ZFUgkJMHgxMDAwMAorI2RlZmluZSBHRVRfTl9BREFQCQkweDIwMDAwCisjZGVmaW5lIEdFVF9BREFQX0lORk8JCTB4MzAwMDAKKyNkZWZpbmUgR0VUX0NBUAkJCTB4NDAwMDAKKyNkZWZpbmUgR0VUX1NUQVRTCQkweDUwMDAwCisjZGVmaW5lIEdFVF9JT0NUTF9WRVJTSU9OCTB4MDEKKworI2RlZmluZSBFWFRfSU9DVExfU0lHTl9TWgkxNgorI2RlZmluZSBFWFRfSU9DVExfU0lHTgkJIiQkX0VYVERfSU9DVExfJCQiCisKKyNkZWZpbmUJTUJPWF9MRUdBQ1kJCTB4MDAJCS8qIGlvY3RsIGhhcyBsZWdhY3kgbWJveCovCisjZGVmaW5lIE1CT1hfSFBFCQkweDAxCQkvKiBpb2N0bCBoYXMgaHBlIG1ib3gJKi8KKworI2RlZmluZQlBUFBUWVBFX01JTUQJCTB4MDAJCS8qIG9sZCBleGlzdGluZyBhcHBzCSovCisjZGVmaW5lIEFQUFRZUEVfVUlPQwkJMHgwMQkJLyogbmV3IGFwcHMgdXNpbmcgdWlvYwkqLworCisjZGVmaW5lIElPQ1RMX0lTU1VFCQkweDAwMDAwMDAxCS8qIElzc3VlIGlvY3RsCQkqLworI2RlZmluZSBJT0NUTF9BQk9SVAkJMHgwMDAwMDAwMgkvKiBBYm9ydCBwcmV2aW91cyBpb2N0bAkqLworCisjZGVmaW5lIERSVlJUWVBFX01CT1gJCTB4MDAwMDAwMDEJLyogcmVndWxhciBtYm94IGRyaXZlcgkqLworI2RlZmluZSBEUlZSVFlQRV9IUEUJCTB4MDAwMDAwMDIJLyogbmV3IGhwZSBkcml2ZXIJKi8KKworI2RlZmluZSBNS0FEQVAoYWRhcG5vKQkoTUVHQUlPQ19NQUdJQyA8PCA4IHwgKGFkYXBubykgKQorI2RlZmluZSBHRVRBREFQKG1rYWRhcCkJKChta2FkYXApIF4gTUVHQUlPQ19NQUdJQyA8PCA4KQorCisjZGVmaW5lIE1BWF9ETUFfUE9PTFMJCTUJCS8qIDRrLCA4aywgMTZrLCAzMmssIDY0ayovCisKKworLyoqCisgKiBzdHJ1Y3QgdWlvY190IC0gdGhlIGNvbW1vbiBpb2N0bCBwYWNrZXQgc3RydWN0dXJlCisgKgorICogQHNpZ25hdHVyZQk6IE11c3QgYmUgIiQkX0VYVERfSU9DVExfJCQiCisgKiBAbWJfdHlwZQk6IFR5cGUgb2YgdGhlIG1haWwgYm94IChNQl9MRUdBQ1kgb3IgTUJfSFBFKQorICogQGFwcF90eXBlCTogVHlwZSBvZiB0aGUgaXNzdWluZyBhcHBsaWNhdGlvbiAoZXhpc3Rpbmcgb3IgbmV3KQorICogQG9wY29kZQk6IE9wY29kZSBvZiB0aGUgY29tbWFuZAorICogQGFkYXBubwk6IEFkYXB0ZXIgbnVtYmVyCisgKiBAY21kYnVmCTogUG9pbnRlciB0byBidWZmZXIgLSBjYW4gcG9pbnQgdG8gbWJveCBvciBwbGFpbiBkYXRhIGJ1ZmZlcgorICogQHhmZXJsZW4JOiB4ZmVybGVuIGZvciBEQ01EIGFuZCBub24gbWFpbGJveCBjb21tYW5kcworICogQGRhdGFfZGlyCTogRGlyZWN0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCisgKiBAc3RhdHVzCTogU3RhdHVzIGZyb20gdGhlIGRyaXZlcgorICogQHJlc2VydmVkCTogcmVzZXJ2ZWQgYnl0ZXMgZm9yIGZ1dHVyZSBleHBhbnNpb24KKyAqCisgKiBAdXNlcl9kYXRhCTogdXNlciBkYXRhIHRyYW5zZmVyIGFkZHJlc3MgaXMgc2F2ZWQgaW4gdGhpcworICogQHVzZXJfZGF0YV9sZW46IGxlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgc2VudCBieSB1c2VyIGFwcAorICogQHVzZXJfcHRocnUJOiB1c2VyIHBhc3N0aHJ1IGFkZHJlc3MgaXMgc2F2ZXMgaW4gdGhpcyAobnVsbCBpZiBEQ01EKQorICogQHB0aHJ1MzIJOiBrZXJuZWwgYWRkcmVzcyBwYXNzdGhydSAoYWxsb2NhdGVkIHBlciBraW9jKQorICogQHB0aHJ1MzJfaAk6IHBoeXNpY2FsbCBhZGRyZXNzIG9mIEBwdGhydTMyCisgKiBAbGlzdAk6IGZvciBraW9jIGZyZWUgcG9vbCBsaXN0IG1haW50ZW5hbmNlCisgKiBAZG9uZQk6IGNhbGwgYmFjayByb3V0aW5lIGZvciBsbGRzIHRvIGNhbGwgd2hlbiBraW9jIGlzIGNvbXBsZXRlZAorICogQGJ1Zl92YWRkcgk6IGRtYSBwb29sIGJ1ZmZlciBhdHRhY2hlZCB0byBraW9jIGZvciBkYXRhIHRyYW5zZmVyCisgKiBAYnVmX3BhZGRyCTogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZG1hIHBvb2wgYnVmZmVyCisgKiBAcG9vbF9pbmRleAk6IGluZGV4IG9mIHRoZSBkbWEgcG9vbCB0aGF0IEBidWZfdmFkZHIgaXMgdGFrZW4gZnJvbQorICogQGZyZWVfYnVmCTogaW5kaWNhdGVzIGlmIGJ1ZmZlciBuZWVkcyB0byBiZSBmcmVlZCBhZnRlciBraW9jIGNvbXBsZXRlcworICoKKyAqIE5vdGUJCTogQWxsIExTSSBkcml2ZXJzIHVuZGVyc3RhbmQgb25seSB0aGlzIHBhY2tldC4gQW55IG90aGVyCisgKgkJOiBmb3JtYXQgc2VudCBieSBhcHBsaWNhdGlvbnMgd291bGQgYmUgY29udmVydGVkIHRvIHRoaXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHVpb2MgeworCisvKiBVc2VyIEFwcHM6ICovCisKKwl1aW50OF90CQkJc2lnbmF0dXJlW0VYVF9JT0NUTF9TSUdOX1NaXTsKKwl1aW50MTZfdAkJbWJfdHlwZTsKKwl1aW50MTZfdAkJYXBwX3R5cGU7CisJdWludDMyX3QJCW9wY29kZTsKKwl1aW50MzJfdAkJYWRhcG5vOworCXVpbnQ2NF90CQljbWRidWY7CisJdWludDMyX3QJCXhmZXJsZW47CisJdWludDMyX3QJCWRhdGFfZGlyOworCWludDMyX3QJCQlzdGF0dXM7CisJdWludDhfdAkJCXJlc2VydmVkWzEyOF07CisKKy8qIERyaXZlciBEYXRhOiAqLworCXZvaWQgX191c2VyICoJCXVzZXJfZGF0YTsKKwl1aW50MzJfdAkJdXNlcl9kYXRhX2xlbjsKKwltcmFpZF9wYXNzdGhydV90CV9fdXNlciAqdXNlcl9wdGhydTsKKworCW1yYWlkX3Bhc3N0aHJ1X3QJKnB0aHJ1MzI7CisJZG1hX2FkZHJfdAkJcHRocnUzMl9oOworCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXZvaWQJCQkoKmRvbmUpKHN0cnVjdCB1aW9jKik7CisKKwljYWRkcl90CQkJYnVmX3ZhZGRyOworCWRtYV9hZGRyX3QJCWJ1Zl9wYWRkcjsKKwlpbnQ4X3QJCQlwb29sX2luZGV4OworCXVpbnQ4X3QJCQlmcmVlX2J1ZjsKKworCXVpbnQ4X3QJCQl0aW1lZG91dDsKKworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxMDI0KSxwYWNrZWQpKSB1aW9jX3Q7CisKKworLyoqCisgKiBzdHJ1Y3QgbXJhaWRfaGJhX2luZm8gLSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbGxlcgorICoKKyAqIEBwYXJhbSBwY2lfdmVuZG9yX2lkCQk6IFBDSSB2ZW5kb3IgaWQKKyAqIEBwYXJhbSBwY2lfZGV2aWNlX2lkCQk6IFBDSSBkZXZpY2UgaWQKKyAqIEBwYXJhbSBzdWJzeXN0ZW1fdmVuZG9yX2lkCTogUENJIHN1YnN5c3RlbSB2ZW5kb3IgaWQKKyAqIEBwYXJhbSBzdWJzeXN0ZW1fZGV2aWNlX2lkCTogUENJIHN1YnN5c3RlbSBkZXZpY2UgaWQKKyAqIEBwYXJhbSBiYXNlcG9ydAkJOiBiYXNlIHBvcnQgb2YgaGJhIG1lbW9yeQorICogQHBhcmFtIHBjaV9idXMJCTogUENJIGJ1cworICogQHBhcmFtIHBjaV9kZXZfZm4JCTogUENJIGRldmljZS9mdW5jdGlvbiB2YWx1ZXMKKyAqIEBwYXJhbSBpcnEJCQk6IGludGVycnVwdCB2ZWN0b3IgZm9yIHRoZSBkZXZpY2UKKyAqCisgKiBFeHRlbmRlZCBpbmZvcm1hdGlvbiBvZiAyNTYgYnl0ZXMgYWJvdXQgdGhlIGNvbnRyb2xsZXIuIEFsaWduIG9uIHRoZSBzaW5nbGUKKyAqIGJ5dGUgYm91bmRhcnkgc28gdGhhdCAzMi1iaXQgYXBwbGljYXRpb25zIGNhbiBiZSBydW4gb24gNjQtYml0IHBsYXRmb3JtCisgKiBkcml2ZXJzIHdpdGhvdWcgcmUtY29tcGlsYXRpb24uCisgKiBOT1RFOiByZWR1Y2UgdGhlIG51bWJlciBvZiByZXNlcnZlZCBieXRlcyB3aGVuZXZlciBuZXcgZmllbGQgYXJlIGFkZGVkLCBzbworICogdGhhdCB0b3RhbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgcmVtYWlucyAyNTYgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1yYWlkX2hiYV9pbmZvIHsKKworCXVpbnQxNl90CXBjaV92ZW5kb3JfaWQ7CisJdWludDE2X3QJcGNpX2RldmljZV9pZDsKKwl1aW50MTZfdAlzdWJzeXNfdmVuZG9yX2lkOworCXVpbnQxNl90CXN1YnN5c19kZXZpY2VfaWQ7CisKKwl1aW50NjRfdAliYXNlcG9ydDsKKwl1aW50OF90CQlwY2lfYnVzOworCXVpbnQ4X3QJCXBjaV9kZXZfZm47CisJdWludDhfdAkJcGNpX3Nsb3Q7CisJdWludDhfdAkJaXJxOworCisJdWludDMyX3QJdW5pcXVlX2lkOworCXVpbnQzMl90CWhvc3Rfbm87CisKKwl1aW50OF90CQludW1fbGRydjsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMjU2KSwgcGFja2VkKSkgbXJhaWRfaGJhX2luZm9fdDsKKworCisvKioKKyAqIG1jb250cm9sbGVyCTogYWRhcHRlciBpbmZvIHN0cnVjdHVyZSBmb3Igb2xkIG1pbWRfdCBhcHBzCisgKgorICogQGJhc2UJOiBiYXNlIGFkZHJlc3MKKyAqIEBpcnEJCTogaXJxIG51bWJlcgorICogQG51bWxkcnYJOiBudW1iZXIgb2YgbG9naWNhbCBkcml2ZXMKKyAqIEBwY2lidXMJOiBwY2kgYnVzCisgKiBAcGNpZGV2CTogcGNpIGRldmljZQorICogQHBjaWZ1bgk6IHBjaSBmdW5jdGlvbgorICogQHBjaWlkCTogcGNpIGlkCisgKiBAcGNpdmVuZG9yCTogdmVuZG9yIGlkCisgKiBAcGNpc2xvdAk6IHNsb3QgbnVtYmVyCisgKiBAdWlkCQk6IHVuaXF1ZSBpZAorICovCit0eXBlZGVmIHN0cnVjdCBtY29udHJvbGxlciB7CisKKwl1aW50NjRfdAliYXNlOworCXVpbnQ4X3QJCWlycTsKKwl1aW50OF90CQludW1sZHJ2OworCXVpbnQ4X3QJCXBjaWJ1czsKKwl1aW50MTZfdAlwY2lkZXY7CisJdWludDhfdAkJcGNpZnVuOworCXVpbnQxNl90CXBjaWlkOworCXVpbnQxNl90CXBjaXZlbmRvcjsKKwl1aW50OF90CQlwY2lzbG90OworCXVpbnQzMl90CXVpZDsKKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbWNvbnRyb2xsZXJfdDsKKworCisvKioKKyAqIG1tX2RtYXBvb2xfdAk6IFJlcHJlc2VudHMgb25lIGRtYSBwb29sIHdpdGgganVzdCBvbmUgYnVmZmVyCisgKgorICogQHZhZGRyCTogVmlydHVhbCBhZGRyZXNzCisgKiBAcGFkZHIJOiBETUEgcGh5c2ljYWxsIGFkZHJlc3MKKyAqIEBidWZzaXplCTogSW4gS0IgLSA0ID0gNGssIDggPSA4ayBldGMuCisgKiBAaGFuZGxlCTogSGFuZGxlIHRvIHRoZSBkbWEgcG9vbAorICogQGxvY2sJOiBsb2NrIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgcG9vbAorICogQGluX3VzZQk6IElmIHBvb2wgYWxyZWFkeSBpbiB1c2UsIGF0dGFjaCBuZXcgYmxvY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1fZG1hcG9vbCB7CisJY2FkZHJfdAkJdmFkZHI7CisJZG1hX2FkZHJfdAlwYWRkcjsKKwl1aW50MzJfdAlidWZfc2l6ZTsKKwlzdHJ1Y3QgZG1hX3Bvb2wJKmhhbmRsZTsKKwlzcGlubG9ja190CWxvY2s7CisJdWludDhfdAkJaW5fdXNlOworfSBtbV9kbWFwb29sX3Q7CisKKworLyoqCisgKiBtcmFpZF9tbWFkcF90OiBTdHJ1Y3R1cmUgdGhhdCBkcml2ZXJzIHBhc3MgZHVyaW5nICh1bilyZWdpc3RyYXRpb24KKyAqCisgKiBAdW5pcXVlX2lkCQk6IEFueSB1bmlxdWUgaWQgKHVzdWFsbHkgUENJIGJ1cytkZXYrZm4pCisgKiBAZHJ2cl90eXBlCQk6IG1lZ2FyYWlkIG9yIGhwZSAoRFJWUlRZUEVfTUJPWCBvciBEUlZSVFlQRV9IUEUpCisgKiBAZHJ2X2RhdGEJCTogRHJpdmVyIHNwZWNpZmljOyBub3QgdG91Y2hlZCBieSB0aGUgY29tbW9uIG1vZHVsZQorICogQHRpbWVvdXQJCTogdGltZW91dCBmb3IgaXNzdWVkIGtpb2NzCisgKiBAbWF4X2tpb2MJCTogTWF4aW11bSBpb2N0bCBwYWNrZXRzIGFjY2VwdGFibGUgYnkgdGhlIGxsZAorICogQHBkZXYJCTogcGNpIGRldjsgdXNlZCBmb3IgYWxsb2NhdGluZyBkbWEnYmxlIG1lbW9yeQorICogQGlzc3VlX3Vpb2MJCTogRHJpdmVyIHN1cHBsaWVkIHJvdXRpbmUgdG8gaXNzdWUgdWlvY190IGNvbW1hbmRzCisgKgkJCTogaXNzdWVfdWlvYyhkcnZyX2RhdGEsIGtpb2MsIElTU1VFL0FCT1JULCB1aW9jX2RvbmUpCisgKiBAcXVpZXNjZW50CQk6IGZsYWcgdG8gaW5kaWNhdGUgaWYgaW9jdGwgY2FuIGJlIGlzc3VlZCB0byB0aGlzIGFkcAorICogQGxpc3QJCTogYXR0YWNoIHdpdGggdGhlIGdsb2JhbCBsaXN0IG9mIGFkYXB0ZXJzCisgKiBAa2lvY19saXN0CQk6IGJsb2NrIG9mIG1lbSBmb3IgQG1heF9raW9jIG51bWJlciBvZiBraW9jcworICogQGtpb2NfcG9vbAkJOiBwb29sIG9mIGZyZWUga2lvY3MKKyAqIEBraW9jX3Bvb2xfbG9jawk6IHByb3RlY3Rpb24gZm9yIGZyZWUgcG9vbAorICogQGtpb2Nfc2VtYXBob3JlCTogc28gYXMgbm90IHRvIGV4Y2VlZCBAbWF4X2tpb2MgcGFyYWxsZWwgaW9jdGxzCisgKiBAbWJveF9saXN0CQk6IGJsb2NrIG9mIG1lbSBmb3IgQG1heF9raW9jIG51bWJlciBvZiBtYm94ZXMKKyAqIEBwdGhydV9kbWFfcG9vbAk6IERNQSBwb29sIHRvIGFsbG9jYXRlIHBhc3N0aHJ1IHBhY2tldHMKKyAqIEBkbWFfcG9vbF9saXN0CTogYXJyYXkgb2YgZG1hIHBvb2xzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbXJhaWRfbW1hZHAgeworCisvKiBGaWxsZWQgYnkgZHJpdmVyICovCisKKwl1aW50MzJfdAkJdW5pcXVlX2lkOworCXVpbnQzMl90CQlkcnZyX3R5cGU7CisJdW5zaWduZWQgbG9uZwkJZHJ2cl9kYXRhOworCXVpbnQxNl90CQl0aW1lb3V0OworCXVpbnQ4X3QJCQltYXhfa2lvYzsKKworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKworCWludCgqaXNzdWVfdWlvYykodW5zaWduZWQgbG9uZywgdWlvY190ICosIHVpbnQzMl90KTsKKworLyogTWFpbnRhaW5lZCBieSBjb21tb24gbW9kdWxlICovCisJdWludDMyX3QJCXF1aWVzY2VudDsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1aW9jX3QJCQkqa2lvY19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJa2lvY19wb29sOworCXNwaW5sb2NrX3QJCWtpb2NfcG9vbF9sb2NrOworCXN0cnVjdCBzZW1hcGhvcmUJa2lvY19zZW1hcGhvcmU7CisKKwltYm94NjRfdAkJKm1ib3hfbGlzdDsKKwlzdHJ1Y3QgZG1hX3Bvb2wJCSpwdGhydV9kbWFfcG9vbDsKKwltbV9kbWFwb29sX3QJCWRtYV9wb29sX2xpc3RbTUFYX0RNQV9QT09MU107CisKK30gbXJhaWRfbW1hZHBfdDsKKworaW50IG1yYWlkX21tX3JlZ2lzdGVyX2FkcChtcmFpZF9tbWFkcF90ICopOworaW50IG1yYWlkX21tX3VucmVnaXN0ZXJfYWRwKHVpbnQzMl90KTsKK3VpbnQzMl90IG1yYWlkX21tX2FkYXB0ZXJfYXBwX2hhbmRsZSh1aW50MzJfdCk7CisKKyNlbmRpZiAvKiBfTUVHQVJBSURfSU9DVExfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGZhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCkBAIC0wLDAgKzEsNDI3NiBAQAorLyoKKyAqCisgKgkJCUxpbnV4IE1lZ2FSQUlEIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCAgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCSAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRklMRQkJOiBtZWdhcmFpZF9tYm94LmMKKyAqIFZlcnNpb24JOiB2Mi4yMC40LjUgKEZlYiAwMyAyMDA1KQorICoKKyAqIEF1dGhvcnM6CisgKiAJQXR1bCBNdWtrZXIJCTxBdHVsLk11a2tlckBsc2lsLmNvbT4KKyAqIAlTcmVlbml2YXMgQmFnYWxrb3RlCTxTcmVlbml2YXMuQmFnYWxrb3RlQGxzaWwuY29tPgorICogCU1hbm9qIEpvc2UJCTxNYW5vai5Kb3NlQGxzaWwuY29tPgorICoKKyAqIExpc3Qgb2Ygc3VwcG9ydGVkIGNvbnRyb2xsZXJzCisgKgorICogT0VNCVByb2R1Y3QgTmFtZQkJCVZJRAlESUQJU1NWSUQJU1NJRAorICogLS0tCS0tLS0tLS0tLS0tLQkJCS0tLQktLS0JLS0tLQktLS0tCisgKiBEZWxsIFBFUkMzL1FDCQkJMTAxRQkxOTYwCTEwMjgJMDQ3MQorICogRGVsbCBQRVJDMy9EQwkJCTEwMUUJMTk2MAkxMDI4CTA0OTMKKyAqIERlbGwgUEVSQzMvU0MJCQkxMDFFCTE5NjAJMTAyOAkwNDc1CisgKiBEZWxsIFBFUkMzL0RpCQkJMTAyOAkxOTYwCTEwMjgJMDEyMworICogRGVsbCBQRVJDNC9TQwkJCTEwMDAJMTk2MAkxMDI4CTA1MjAKKyAqIERlbGwgUEVSQzQvREMJCQkxMDAwCTE5NjAJMTAyOAkwNTE4CisgKiBEZWxsIFBFUkM0L1FDCQkJMTAwMAkwNDA3CTEwMjgJMDUzMQorICogRGVsbCBQRVJDNC9EaQkJCTEwMjgJMDAwRgkxMDI4CTAxNEEKKyAqIERlbGwgUEVSQyA0ZS9TaQkJCTEwMjgJMDAxMwkxMDI4CTAxNmMKKyAqIERlbGwgUEVSQyA0ZS9EaQkJCTEwMjgJMDAxMwkxMDI4CTAxNmQKKyAqIERlbGwgUEVSQyA0ZS9EaQkJCTEwMjgJMDAxMwkxMDI4CTAxNmUKKyAqIERlbGwgUEVSQyA0ZS9EaQkJCTEwMjgJMDAxMwkxMDI4CTAxNmYKKyAqIERlbGwgUEVSQyA0ZS9EaQkJCTEwMjgJMDAxMwkxMDI4CTAxNzAKKyAqIERlbGwgUEVSQyA0ZS9EQwkJCTEwMDAJMDQwOAkxMDI4CTAwMDIKKyAqIERlbGwgUEVSQyA0ZS9TQwkJCTEwMDAJMDQwOAkxMDI4CTAwMDEKKyAqCisgKgorICogTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTAJCTEwMDAJMTk2MAkxMDAwCUE1MjAKKyAqIExTSSBNZWdhUkFJRCBTQ1NJIDMyMC0xCQkxMDAwCTE5NjAJMTAwMAkwNTIwCisgKiBMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMgkJMTAwMAkxOTYwCTEwMDAJMDUxOAorICogTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTBYCQkxMDAwCTA0MDcJMTAwMAkwNTMwCisgKiBMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMlgJCTEwMDAJMDQwNwkxMDAwCTA1MzIKKyAqIExTSSBNZWdhUkFJRCBTQ1NJIDMyMC00WAkJMTAwMAkwNDA3CTEwMDAJMDUzMQorICogTFNJIE1lZ2FSQUlEIFNDU0kgMzIwLTFFCQkxMDAwCTA0MDgJMTAwMAkwMDAxCisgKiBMU0kgTWVnYVJBSUQgU0NTSSAzMjAtMkUJCTEwMDAJMDQwOAkxMDAwCTAwMDIKKyAqIExTSSBNZWdhUkFJRCBTQVRBIDE1MC00CQkxMDAwCTE5NjAJMTAwMAk0NTIzCisgKiBMU0kgTWVnYVJBSUQgU0FUQSAxNTAtNgkJMTAwMAkxOTYwCTEwMDAJMDUyMworICogTFNJIE1lZ2FSQUlEIFNBVEEgMzAwLTRYCQkxMDAwCTA0MDkJMTAwMAkzMDA0CisgKiBMU0kgTWVnYVJBSUQgU0FUQSAzMDAtOFgJCTEwMDAJMDQwOQkxMDAwCTMwMDgKKyAqCisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDVTQyWAkxMDAwCTA0MDcJODA4NgkwNTMyCisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDUzE2CQkxMDAwCTE5NjAJODA4NgkwNTIzCisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDVTQyRQkxMDAwCTA0MDgJODA4NgkwMDAyCisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDWkNSWAkxMDAwCTA0MDcJODA4NgkwNTMwCisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JDUzI4WAkxMDAwCTA0MDkJODA4NgkzMDA4CisgKiBJTlRFTCBSQUlEIENvbnRyb2xsZXIgU1JPTUJVNDJFCTEwMDAJMDQwOAk4MDg2CTM0MzEKKyAqIElOVEVMIFJBSUQgQ29udHJvbGxlciBTUk9NQlU0MkUJMTAwMAkwNDA4CTgwODYJMzQ5OQorICogSU5URUwgUkFJRCBDb250cm9sbGVyIFNSQ1U1MUwJMTAwMAkxOTYwCTgwODYJMDUyMAorICoKKyAqIEZTQwlNZWdhUkFJRCBQQ0kgRXhwcmVzcyBST01CCTEwMDAJMDQwOAkxNzM0CTEwNjUKKyAqCisgKiBBQ0VSCU1lZ2FSQUlEIFJPTUItMkUJCTEwMDAJMDQwOAkxMDI1CTAwNEQKKyAqCisgKiBORUMJTWVnYVJBSUQgUENJIEV4cHJlc3MgUk9NQgkxMDAwCTA0MDgJMTAzMwk4Mjg3CisgKgorICogRm9yIGhpc3Rvcnkgb2YgY2hhbmdlcywgc2VlIERvY3VtZW50YXRpb24vQ2hhbmdlTG9nLm1lZ2FyYWlkCisgKi8KKworI2luY2x1ZGUgIm1lZ2FyYWlkX21ib3guaCIKKworc3RhdGljIGludCBtZWdhcmFpZF9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgbWVnYXJhaWRfZXhpdCh2b2lkKTsKKworc3RhdGljIGludCBtZWdhcmFpZF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX2RldGFjaF9vbmUoc3RydWN0IHBjaV9kZXYgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9tYm94X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfaW9fYXR0YWNoKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX2lvX2RldGFjaChhZGFwdGVyX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfaW5pdF9tYm94KGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyB2b2lkIG1lZ2FyYWlkX2ZpbmlfbWJveChhZGFwdGVyX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfYWxsb2NfY21kX3BhY2tldHMoYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfZnJlZV9jbWRfcGFja2V0cyhhZGFwdGVyX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9zZXR1cF9kbWFfcG9vbHMoYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF90ZWFyZG93bl9kbWFfcG9vbHMoYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX3N5c2ZzX2FsbG9jX3Jlc291cmNlcyhhZGFwdGVyX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9zeXNmc19mcmVlX3Jlc291cmNlcyhhZGFwdGVyX3QgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfYWJvcnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBtZWdhcmFpZF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKik7CisKK3N0YXRpYyBpbnQgbWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXJfdCAqLCB1aW50OF90IFtdKTsKK3N0YXRpYyBpbnQgbWJveF9wb3N0X3N5bmNfY21kX2Zhc3QoYWRhcHRlcl90ICosIHVpbnQ4X3QgW10pOworc3RhdGljIGludCBtZWdhcmFpZF9idXN5d2FpdF9tYm94KG1yYWlkX2RldmljZV90ICopOworc3RhdGljIGludCBtZWdhcmFpZF9tYm94X3Byb2R1Y3RfaW5mbyhhZGFwdGVyX3QgKik7CitzdGF0aWMgaW50IG1lZ2FyYWlkX21ib3hfZXh0ZW5kZWRfY2RiKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9zdXBwb3J0X2hhKGFkYXB0ZXJfdCAqLCB1aW50MTZfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9zdXBwb3J0X3JhbmRvbV9kZWwoYWRhcHRlcl90ICopOworc3RhdGljIGludCBtZWdhcmFpZF9tYm94X2dldF9tYXhfc2coYWRhcHRlcl90ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9lbnVtX3JhaWRfc2NzaShhZGFwdGVyX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9tYm94X2ZsdXNoX2NhY2hlKGFkYXB0ZXJfdCAqKTsKKworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9kaXNwbGF5X3NjYihhZGFwdGVyX3QgKiwgc2NiX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9tYm94X3NldHVwX2RldmljZV9tYXAoYWRhcHRlcl90ICopOworCitzdGF0aWMgaW50IG1lZ2FyYWlkX3F1ZXVlX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLAorCQl2b2lkICgqKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBzY2JfdCAqbWVnYXJhaWRfbWJveF9idWlsZF9jbWQoYWRhcHRlcl90ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50ICopOworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9ydW5wZW5kcShhZGFwdGVyX3QgKiwgc2NiX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9tYm94X3ByZXBhcmVfcHRocnUoYWRhcHRlcl90ICosIHNjYl90ICosCisJCXN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9tYm94X3ByZXBhcmVfZXB0aHJ1KGFkYXB0ZXJfdCAqLCBzY2JfdCAqLAorCQlzdHJ1Y3Qgc2NzaV9jbW5kICopOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWVnYXJhaWRfaXNyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworc3RhdGljIHZvaWQgbWVnYXJhaWRfbWJveF9kcGModW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzc2l6ZV90IG1lZ2FyYWlkX3N5c2ZzX3Nob3dfYXBwX2huZGwoc3RydWN0IGNsYXNzX2RldmljZSAqLCBjaGFyICopOworc3RhdGljIHNzaXplX3QgbWVnYXJhaWRfc3lzZnNfc2hvd19sZG51bShzdHJ1Y3QgZGV2aWNlICosIGNoYXIgKik7CisKK3N0YXRpYyBpbnQgbWVnYXJhaWRfY21tX3JlZ2lzdGVyKGFkYXB0ZXJfdCAqKTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfY21tX3VucmVnaXN0ZXIoYWRhcHRlcl90ICopOworc3RhdGljIGludCBtZWdhcmFpZF9tYm94X21tX2hhbmRsZXIodW5zaWduZWQgbG9uZywgdWlvY190ICosIHVpbnQzMl90KTsKK3N0YXRpYyBpbnQgbWVnYXJhaWRfbWJveF9tbV9jb21tYW5kKGFkYXB0ZXJfdCAqLCB1aW9jX3QgKik7CitzdGF0aWMgdm9pZCBtZWdhcmFpZF9tYm94X21tX2RvbmUoYWRhcHRlcl90ICosIHNjYl90ICopOworc3RhdGljIGludCBnYXRoZXJfaGJhaW5mbyhhZGFwdGVyX3QgKiwgbXJhaWRfaGJhX2luZm9fdCAqKTsKK3N0YXRpYyBpbnQgd2FpdF90aWxsX2Z3X2VtcHR5KGFkYXB0ZXJfdCAqKTsKKworCisKK01PRFVMRV9BVVRIT1IoIkxTSSBMb2dpYyBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMU0kgTG9naWMgTWVnYVJBSUQgTWFpbGJveCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKE1FR0FSQUlEX1ZFUlNJT04pOworCisvKgorICogIyMjIG1vZHVsZXMgcGFyYW1ldGVycyBmb3IgZHJpdmVyICMjIworICovCisKKy8qKgorICogU2V0IHRvIGVuYWJsZSBkcml2ZXIgdG8gZXhwb3NlIHVuY29uZmlndXJlZCBkaXNrIHRvIGtlcm5lbAorICovCitzdGF0aWMgaW50IG1lZ2FyYWlkX2V4cG9zZV91bmNvbmZfZGlza3MgPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKHVuY29uZl9kaXNrcywgbWVnYXJhaWRfZXhwb3NlX3VuY29uZl9kaXNrcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModW5jb25mX2Rpc2tzLAorCSJTZXQgdG8gZXhwb3NlIHVuY29uZmlndXJlZCBkaXNrcyB0byBrZXJuZWwgKGRlZmF1bHQ9MCkiKTsKKworLyoqCisgKiBkcml2ZXIgd2FpdCB0aW1lIGlmIHRoZSBhZGFwdGVyJ3MgbWFpbGJveCBpcyBidXN5CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X21ib3hfYnVzeV93YWl0ID0gTUJPWF9CVVNZX1dBSVQ7Cittb2R1bGVfcGFyYW1fbmFtZWQoYnVzeV93YWl0LCBtYXhfbWJveF9idXN5X3dhaXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1c3lfd2FpdCwKKwkiTWF4IHdhaXQgZm9yIG1haWxib3ggaW4gbWljcm9zZWNvbmRzIGlmIGJ1c3kgKGRlZmF1bHQ9MTApIik7CisKKy8qKgorICogbnVtYmVyIG9mIHNlY3RvcnMgcGVyIElPIGNvbW1hbmQKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtZWdhcmFpZF9tYXhfc2VjdG9ycyA9IE1CT1hfTUFYX1NFQ1RPUlM7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X3NlY3RvcnMsIG1lZ2FyYWlkX21heF9zZWN0b3JzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2VjdG9ycywKKwkiTWF4aW11bSBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgSU8gY29tbWFuZCAoZGVmYXVsdD0xMjgpIik7CisKKy8qKgorICogbnVtYmVyIG9mIGNvbW1hbmRzIHBlciBsb2dpY2FsIHVuaXQKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtZWdhcmFpZF9jbWRfcGVyX2x1biA9IE1CT1hfREVGX0NNRF9QRVJfTFVOOworbW9kdWxlX3BhcmFtX25hbWVkKGNtZF9wZXJfbHVuLCBtZWdhcmFpZF9jbWRfcGVyX2x1biwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY21kX3Blcl9sdW4sCisJIk1heGltdW0gbnVtYmVyIG9mIGNvbW1hbmRzIHBlciBsb2dpY2FsIHVuaXQgKGRlZmF1bHQ9NjQpIik7CisKKworLyoqCisgKiBGYXN0IGRyaXZlciBsb2FkIG9wdGlvbiwgc2tpcCBzY2FubmluZyBmb3IgcGh5c2ljYWwgZGV2aWNlcyBkdXJpbmcgbG9hZC4KKyAqIFRoaXMgd291bGQgcmVzdWx0IGluIG5vbi1kaXNrIGRldmljZXMgYmVpbmcgc2tpcHBlZCBkdXJpbmcgZHJpdmVyIGxvYWQKKyAqIHRpbWUuIFRoZXNlIGNhbiBiZSBsYXRlciBhZGRlZCB0aG91Z2gsIHVzaW5nIC9wcm9jL3Njc2kvc2NzaQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1lZ2FyYWlkX2Zhc3RfbG9hZCA9IDA7Cittb2R1bGVfcGFyYW1fbmFtZWQoZmFzdF9sb2FkLCBtZWdhcmFpZF9mYXN0X2xvYWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3RfbG9hZCwKKwkiRmFzdGVyIGxvYWRpbmcgb2YgdGhlIGRyaXZlciwgc2tpcHMgcGh5c2ljYWwgZGV2aWNlcyEgKGRlZmF1bHQ9MCkiKTsKKworCisvKioKKyAqIG1yYWlkX2RlYnVnIGxldmVsIC0gdGhyZXNob2xkIGZvciBhbW91bnQgb2YgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkIGJ5CisgKiB0aGUgZHJpdmVyLiBUaGlzIGxldmVsIGNhbiBiZSBjaGFuZ2VkIHRocm91Z2ggbW9kdWxlcyBwYXJhbWV0ZXJzLCBpb2N0bCBvcgorICogc3lzZnMvcHJvYyBpbnRlcmZhY2UuIEJ5IGRlZmF1bHQsIHByaW50IHRoZSBhbm5vdW5jZW1lbnQgbWVzc2FnZXMgb25seS4KKyAqLworaW50IG1yYWlkX2RlYnVnX2xldmVsID0gQ0xfQU5OOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2xldmVsLCBtcmFpZF9kZWJ1Z19sZXZlbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfbGV2ZWwsICJEZWJ1ZyBsZXZlbCBmb3IgZHJpdmVyIChkZWZhdWx0PTApIik7CisKKy8qCisgKiAjIyMgZ2xvYmFsIGRhdGEgIyMjCisgKi8KK3N0YXRpYyB1aW50OF90IG1lZ2FyYWlkX21ib3hfdmVyc2lvbls4XSA9CisJeyAweDAyLCAweDIwLCAweDA0LCAweDA1LCAyLCAzLCAyMCwgNSB9OworCisKKy8qCisgKiBQQ0kgdGFibGUgZm9yIGFsbCBzdXBwb3J0ZWQgY29udHJvbGxlcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRfdGFibGVfZ1tdID0gIHsKKwl7CisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX0RFVklDRV9JRF9QRVJDNF9ESV9ESVNDT1ZFUlksCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDNF9ESV9ESVNDT1ZFUlksCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX1BFUkM0X1NDLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRfU0MsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX1BFUkM0X0RDLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRfREMsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX1BFUkM0X1FDLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRfUUMsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX0RFVklDRV9JRF9QRVJDNF9ESV9FVkVSR0xBREVTLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRfRElfRVZFUkdMQURFUywKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfREVWSUNFX0lEX1BFUkM0RV9TSV9CSUdCRU5ELAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRFX1NJX0JJR0JFTkQsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX0RFVklDRV9JRF9QRVJDNEVfRElfS09CVUssCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDNEVfRElfS09CVUssCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX0RFVklDRV9JRF9QRVJDNEVfRElfQ09SVkVUVEUsCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDNEVfRElfQ09SVkVUVEUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX0RFVklDRV9JRF9QRVJDNEVfRElfRVhQRURJVElPTiwKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0RV9ESV9FWFBFRElUSU9OLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0dVQURBTFVQRSwKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkM0RV9ESV9HVUFEQUxVUEUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX1BFUkM0RV9EQ18zMjBfMkUsCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDNEVfRENfMzIwXzJFLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9QRVJDNEVfU0NfMzIwXzFFLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzRFX1NDXzMyMF8xRSwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9BTUksCisJCVBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMywKKwkJUENJX1ZFTkRPUl9JRF9ERUxMLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkMzX1FDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0FNSSwKKwkJUENJX0RFVklDRV9JRF9BTUlfTUVHQVJBSUQzLAorCQlQQ0lfVkVORE9SX0lEX0RFTEwsCisJCVBDSV9TVUJTWVNfSURfUEVSQzNfREMsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfQU1JLAorCQlQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDMsCisJCVBDSV9WRU5ET1JfSURfREVMTCwKKwkJUENJX1NVQlNZU19JRF9QRVJDM19TQywKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9BTUksCisJCVBDSV9ERVZJQ0VfSURfQU1JX01FR0FSQUlEMywKKwkJUENJX1ZFTkRPUl9JRF9BTUksCisJCVBDSV9TVUJTWVNfSURfUEVSQzNfU0MsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfQU1JLAorCQlQQ0lfREVWSUNFX0lEX0FNSV9NRUdBUkFJRDMsCisJCVBDSV9WRU5ET1JfSURfQU1JLAorCQlQQ0lfU1VCU1lTX0lEX1BFUkMzX0RDLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8wLAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8wLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8xLAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8xLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yLAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8weCwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMHgsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzJ4LAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yeCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfNHgsCisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzR4LAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8xRSwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMUUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzJFLAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yRSwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfSTRfMTMzX1JBSUQsCisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX0k0XzEzM19SQUlELAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQVRBXzE1MF80LAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzE1MF80LAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQVRBXzE1MF82LAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzE1MF82LAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQVRBXzMwMF80eCwKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8zMDBfNHgsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NBVEFfMzAwXzh4LAorCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzMwMF84eCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfSU5URUxfUkFJRF9TUkNVNDJYLAorCQlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQlQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDVTQyWCwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfSU5URUxfUkFJRF9TUkNTMTYsCisJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCVBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNTMTYsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDVTQyRSwKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NSQ1U0MkUsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDWkNSWCwKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NSQ1pDUlgsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDUzI4WCwKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NSQ1MyOFgsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JPTUJVNDJFX0FMSUVGLAorCQlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQlQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JPTUJVNDJFX0FMSUVGLAorCX0sCisJeworCQlQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywKKwkJUENJX0RFVklDRV9JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9IQVJXSUNILAorCQlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQlQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JPTUJVNDJFX0hBUldJQ0gsCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDVTQxTF9MQUtFX1NIRVRFSywKKwkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NSQ1U0MUxfTEFLRV9TSEVURUssCisJfSwKKwl7CisJCVBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLAorCQlQQ0lfREVWSUNFX0lEX0ZTQ19NRUdBUkFJRF9QQ0lfRVhQUkVTU19ST01CLAorCQlQQ0lfU1VCU1lTX0lEX0ZTQywKKwkJUENJX1NVQlNZU19JRF9GU0NfTUVHQVJBSURfUENJX0VYUFJFU1NfUk9NQiwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfQUNFUl9ST01CXzJFLAorCQlQQ0lfVkVORE9SX0lEX0FJLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX0FDRVJfUk9NQl8yRSwKKwl9LAorCXsKKwkJUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsCisJCVBDSV9ERVZJQ0VfSURfTUVHQVJBSURfTkVDX1JPTUJfMkUsCisJCVBDSV9WRU5ET1JfSURfTkVDLAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX05FQ19ST01CXzJFLAorCX0sCisJezB9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZF90YWJsZV9nKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbWVnYXJhaWRfcGNpX2RyaXZlcl9nID0geworCS5uYW1lCQk9ICJtZWdhcmFpZCIsCisJLmlkX3RhYmxlCT0gcGNpX2lkX3RhYmxlX2csCisJLnByb2JlCQk9IG1lZ2FyYWlkX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1lZ2FyYWlkX2RldGFjaF9vbmUpLAorCS5kcml2ZXIJCT0geworCQkuc2h1dGRvd24JPSBtZWdhcmFpZF9tYm94X3NodXRkb3duLAorCX0KK307CisKKworCisvLyBkZWZpbml0aW9ucyBmb3IgdGhlIGRldmljZSBhdHRyaWJ1dGVzIGZvciBleHBvcnRpbmcgbG9naWNhbCBkcml2ZSBudW1iZXIKKy8vIGZvciBhIHNjc2kgYWRkcmVzcyAoSG9zdCwgQ2hhbm5lbCwgSWQsIEx1bikKKworQ0xBU1NfREVWSUNFX0FUVFIobWVnYXJhaWRfbWJveF9hcHBfaG5kbCwgU19JUlVTUiwgbWVnYXJhaWRfc3lzZnNfc2hvd19hcHBfaG5kbCwKKwkJTlVMTCk7CisKKy8vIEhvc3QgdGVtcGxhdGUgaW5pdGlhbGl6ZXIgZm9yIG1lZ2FyYWlkIG1ib3ggc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXMKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqbWVnYXJhaWRfc2hvc3RfYXR0cnNbXSA9IHsKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbWVnYXJhaWRfbWJveF9hcHBfaG5kbCwKKwlOVUxMLAorfTsKKworCitERVZJQ0VfQVRUUihtZWdhcmFpZF9tYm94X2xkLCBTX0lSVVNSLCBtZWdhcmFpZF9zeXNmc19zaG93X2xkbnVtLCBOVUxMKTsKKworLy8gSG9zdCB0ZW1wbGF0ZSBpbml0aWFsaXplciBmb3IgbWVnYXJhaWQgbWJveCBzeXNmcyBkZXZpY2UgYXR0cmlidXRlcworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptZWdhcmFpZF9zZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX21lZ2FyYWlkX21ib3hfbGQsCisJTlVMTCwKK307CisKKworLyoKKyAqIFNjc2kgaG9zdCB0ZW1wbGF0ZSBmb3IgbWVnYXJhaWQgdW5pZmllZCBkcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbWVnYXJhaWRfdGVtcGxhdGVfZyA9IHsKKwkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSAiTFNJIExvZ2ljIE1lZ2FSQUlEIGRyaXZlciIsCisJLnByb2NfbmFtZQkJCT0gIm1lZ2FyYWlkIiwKKwkucXVldWVjb21tYW5kCQkJPSBtZWdhcmFpZF9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IG1lZ2FyYWlkX2Fib3J0X2hhbmRsZXIsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gbWVnYXJhaWRfcmVzZXRfaGFuZGxlciwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gbWVnYXJhaWRfcmVzZXRfaGFuZGxlciwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IG1lZ2FyYWlkX3Jlc2V0X2hhbmRsZXIsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuc2Rldl9hdHRycwkJCT0gbWVnYXJhaWRfc2Rldl9hdHRycywKKwkuc2hvc3RfYXR0cnMJCQk9IG1lZ2FyYWlkX3Nob3N0X2F0dHJzLAorfTsKKworCisvKioKKyAqIG1lZ2FyYWlkX2luaXQgLSBtb2R1bGUgbG9hZCBob29rCisgKgorICogV2UgcmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGhvdHBsdWcgZW5hYmxlZCBtb2R1bGUgYW5kIGxldCBQQ0kgc3Vic3lzdGVtCisgKiBkaXNjb3ZlciBvdXIgYWRhdGVycworICoqLworc3RhdGljIGludCBfX2luaXQKK21lZ2FyYWlkX2luaXQodm9pZCkKK3sKKwlpbnQJcnZhbDsKKworCS8vIEFubm91bmNlIHRoZSBkcml2ZXIgdmVyc2lvbgorCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPICJtZWdhcmFpZDogJXMgJXNcbiIsIE1FR0FSQUlEX1ZFUlNJT04sCisJCU1FR0FSQUlEX0VYVF9WRVJTSU9OKSk7CisKKwkvLyBjaGVjayB2YWxpZGl0eSBvZiBtb2R1bGUgcGFyYW1ldGVycworCWlmIChtZWdhcmFpZF9jbWRfcGVyX2x1biA+IE1CT1hfTUFYX1NDU0lfQ01EUykgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgbWFpbGJveDogbWF4IGNvbW1hbmRzIHBlciBsdW4gcmVzZXQgdG8gJWRcbiIsCisJCQlNQk9YX01BWF9TQ1NJX0NNRFMpKTsKKworCQltZWdhcmFpZF9jbWRfcGVyX2x1biA9IE1CT1hfTUFYX1NDU0lfQ01EUzsKKwl9CisKKworCS8vIHJlZ2lzdGVyIGFzIGEgUENJIGhvdC1wbHVnIGRyaXZlciBtb2R1bGUKKwlpZiAoKHJ2YWwgPSBwY2lfbW9kdWxlX2luaXQoJm1lZ2FyYWlkX3BjaV9kcml2ZXJfZykpKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IGNvdWxkIG5vdCByZWdpc3RlciBob3RwbHVnIHN1cHBvcnQuXG4iKSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9leGl0IC0gZHJpdmVyIHVubG9hZCBlbnRyeSBwb2ludAorICoKKyAqIFdlIHNpbXBseSB1bndyYXAgdGhlIG1lZ2FyYWlkX2luaXQgcm91dGluZSBoZXJlCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdAorbWVnYXJhaWRfZXhpdCh2b2lkKQoreworCWNvbl9sb2coQ0xfRExFVkVMMSwgKEtFUk5fTk9USUNFICJtZWdhcmFpZDogdW5sb2FkaW5nIGZyYW1ld29ya1xuIikpOworCisJLy8gdW5yZWdpc3RlciBhcyBQQ0kgaG90cGx1ZyBkcml2ZXIKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1lZ2FyYWlkX3BjaV9kcml2ZXJfZyk7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9wcm9iZV9vbmUgLSBQQ0kgaG90cGx1ZyBlbnRyeSBwb2ludAorICogQHBhcmFtIHBkZXYJOiBoYW5kbGUgdG8gdGhpcyBjb250cm9sbGVyJ3MgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEBwYXJhbSBpZAk6IHBjaSBkZXZpY2UgaWQgb2YgdGhlIGNsYXNzIG9mIGNvbnRyb2xsZXJzCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBuZXcgYWRhcHRlciBpcyBkZXRlY3RlZCBieSB0aGUKKyAqIFBDSSBob3RwbHVnIHN1c2JzeXRlbS4KKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CittZWdhcmFpZF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisKKworCS8vIGRldGVjdGVkIGEgbmV3IGNvbnRyb2xsZXIKKwljb25fbG9nKENMX0FOTiwgKEtFUk5fSU5GTworCQkibWVnYXJhaWQ6IHByb2JlIG5ldyBkZXZpY2UgJSM0LjA0eDolIzQuMDR4OiUjNC4wNHg6JSM0LjA0eDogIiwKKwkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCisJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpKTsKKworCWNvbl9sb2coQ0xfQU5OLCAoImJ1cyAlZDpzbG90ICVkOmZ1bmMgJWRcbiIsIHBkZXYtPmJ1cy0+bnVtYmVyLAorCQlQQ0lfU0xPVChwZGV2LT5kZXZmbiksIFBDSV9GVU5DKHBkZXYtPmRldmZuKSkpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpKTsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvLyBFbmFibGUgYnVzLW1hc3RlcmluZyBvbiB0aGlzIGNvbnRyb2xsZXIKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8vIEFsbG9jYXRlIHRoZSBwZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZQorCWFkYXB0ZXIgPSBrbWFsbG9jKHNpemVvZihhZGFwdGVyX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmIChhZGFwdGVyID09IE5VTEwpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJIm1lZ2FyYWlkOiBvdXQgb2YgbWVtb3J5LCAlcyAlZC5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKKworCQlnb3RvIG91dF9wcm9iZV9vbmU7CisJfQorCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2YoYWRhcHRlcl90KSk7CisKKworCS8vIHNldCB1cCBQQ0kgcmVsYXRlZCBzb2Z0IHN0YXRlIGFuZCBvdGhlciBwcmUta25vd24gcGFyYW1ldGVycworCWFkYXB0ZXItPnVuaXF1ZV9pZAk9IHBkZXYtPmJ1cy0+bnVtYmVyIDw8IDggfCBwZGV2LT5kZXZmbjsKKwlhZGFwdGVyLT5pcnEJCT0gcGRldi0+aXJxOworCWFkYXB0ZXItPnBkZXYJCT0gcGRldjsKKworCWF0b21pY19zZXQoJmFkYXB0ZXItPmJlaW5nX2RldGFjaGVkLCAwKTsKKworCS8vIFNldHVwIHRoZSBkZWZhdWx0IERNQSBtYXNrLiBUaGlzIHdvdWxkIGJlIGNoYW5nZWQgbGF0ZXIgb24KKwkvLyBkZXBlbmRpbmcgb24gaGFyZHdhcmUgY2FwYWJpbGl0aWVzCisJaWYgKHBjaV9zZXRfZG1hX21hc2soYWRhcHRlci0+cGRldiwgMHhGRkZGRkZGRikgIT0gMCkgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IHBjaV9zZXRfZG1hX21hc2sgZmFpbGVkOiVkXG4iLCBfX0xJTkVfXykpOworCisJCWdvdG8gb3V0X2ZyZWVfYWRhcHRlcjsKKwl9CisKKworCS8vIEluaXRpYWxpemUgdGhlIHN5bmNocm9uaXphdGlvbiBsb2NrIGZvciBrZXJuZWwgYW5kIExMRAorCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKKwlhZGFwdGVyLT5ob3N0X2xvY2sgPSAmYWRhcHRlci0+bG9jazsKKworCisJLy8gSW5pdGlhbGl6ZSB0aGUgY29tbWFuZCBxdWV1ZXM6IHRoZSBsaXN0IG9mIGZyZWUgU0NCcyBhbmQgdGhlIGxpc3QKKwkvLyBvZiBwZW5kaW5nIFNDQnMuCisJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmtzY2JfcG9vbCk7CisJc3Bpbl9sb2NrX2luaXQoU0NTSV9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSk7CisKKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+cGVuZF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdChQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSk7CisKKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QpOworCXNwaW5fbG9ja19pbml0KENPTVBMRVRFRF9MSVNUX0xPQ0soYWRhcHRlcikpOworCisKKwkvLyBTdGFydCB0aGUgbWFpbGJveCBiYXNlZCBjb250cm9sbGVyCisJaWYgKG1lZ2FyYWlkX2luaXRfbWJveChhZGFwdGVyKSAhPSAwKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IG1haWJveCBhZGFwdGVyIGRpZCBub3QgaW5pdGlhbGl6ZVxuIikpOworCisJCWdvdG8gb3V0X2ZyZWVfYWRhcHRlcjsKKwl9CisKKwkvLyBSZWdpc3RlciB3aXRoIExTSSBDb21tb24gTWFuYWdlbWVudCBNb2R1bGUKKwlpZiAobWVnYXJhaWRfY21tX3JlZ2lzdGVyKGFkYXB0ZXIpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkibWVnYXJhaWQ6IGNvdWxkIG5vdCByZWdpc3RlciB3aXRoIG1hbmFnZW1lbnQgbW9kdWxlXG4iKSk7CisKKwkJZ290byBvdXRfZmluaV9tYm94OworCX0KKworCS8vIHNldHVwIGFkYXB0ZXIgaGFuZGxlIGluIFBDSSBzb2Z0IHN0YXRlCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCisJLy8gYXR0YWNoIHdpdGggc2NzaSBtaWQtbGF5ZXIKKwlpZiAobWVnYXJhaWRfaW9fYXR0YWNoKGFkYXB0ZXIpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IGlvIGF0dGFjaCBmYWlsZWRcbiIpKTsKKworCQlnb3RvIG91dF9jbW1fdW5yZWc7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9jbW1fdW5yZWc6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCW1lZ2FyYWlkX2NtbV91bnJlZ2lzdGVyKGFkYXB0ZXIpOworb3V0X2ZpbmlfbWJveDoKKwltZWdhcmFpZF9maW5pX21ib3goYWRhcHRlcik7CitvdXRfZnJlZV9hZGFwdGVyOgorCWtmcmVlKGFkYXB0ZXIpOworb3V0X3Byb2JlX29uZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2RldGFjaF9vbmUgLSByZWxlYXNlIHRoZSBmcmFtZXdvcmsgcmVzb3VyY2VzIGFuZCBjYWxsIExMRCByZWxlYXNlCisgKiByb3V0aW5lCisgKiBAcGFyYW0gcGRldgk6IGhhbmRsZSBmb3Igb3VyIFBDSSBjb2ZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGR1cmluZyBkcml2ZXIgdW5sb2FkLiBXZSBmcmVlIGFsbCB0aGUgYWxsb2NhdGVkCisgKiByZXNvdXJjZXMgYW5kIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgTExEIHNvIHRoYXQgaXQgY2FuIGFsc28gcmVsZWFzZSBhbGwKKyAqIGl0cyByZXNvdXJjZXMuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGFsc28gY2FsbGVkIGZyb20gdGhlIFBDSSBob3RwbHVnIHN5c3RlbQorICoqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX2RldGFjaF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJYWRhcHRlcl90CQkqYWRhcHRlcjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCisKKwkvLyBTdGFydCBhIHJvbGxiYWNrIG9uIHRoaXMgYWRhcHRlcgorCWFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX0NSSVQKKwkJIm1lZ2FyYWlkOiBJbnZhbGlkIGRldGFjaCBvbiAlIzQuMDR4OiUjNC4wNHg6JSM0LjA0eDolIzQuMDR4XG4iLAorCQkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCisJCQlwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSk7CisKKwkJcmV0dXJuOworCX0KKwllbHNlIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkibWVnYXJhaWQ6IGRldGFjaGluZyBkZXZpY2UgJSM0LjA0eDolIzQuMDR4OiUjNC4wNHg6JSM0LjA0eFxuIiwKKwkJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJcGRldi0+c3Vic3lzdGVtX2RldmljZSkpOworCX0KKworCisJaG9zdCA9IGFkYXB0ZXItPmhvc3Q7CisKKwkvLyBkbyBub3QgYWxsb3cgYW55IG1vcmUgcmVxdWVzdHMgZnJvbSB0aGUgbWFuYWdlbWVudCBtb2R1bGUgZm9yIHRoaXMKKwkvLyBhZGFwdGVyLgorCS8vIEZJWE1FOiBIb3cgZG8gd2UgYWNjb3VudCBmb3IgdGhlIHJlcXVlc3Qgd2hpY2ggbWlnaHQgc3RpbGwgYmUKKwkvLyBwZW5kaW5nIHdpdGggdXM/CisJYXRvbWljX3NldCgmYWRhcHRlci0+YmVpbmdfZGV0YWNoZWQsIDEpOworCisJLy8gZGV0YWNoIGZyb20gdGhlIElPIHN1Yi1zeXN0ZW0KKwltZWdhcmFpZF9pb19kZXRhY2goYWRhcHRlcik7CisKKwkvLyByZXNldCB0aGUgZGV2aWNlIHN0YXRlIGluIHRoZSBQQ0kgc3RydWN0dXJlLiBXZSBjaGVjayB0aGlzCisJLy8gY29uZGl0aW9uIHdoZW4gd2UgZW50ZXIgaGVyZS4gSWYgdGhlIGRldmljZSBzdGF0ZSBpcyBOVUxMLAorCS8vIHRoYXQgd291bGQgbWVhbiB0aGUgZGV2aWNlIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZAorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCS8vIFVucmVnaXN0ZXIgZnJvbSBjb21tb24gbWFuYWdlbWVudCBtb2R1bGUKKwkvLworCS8vIEZJWE1FOiB0aGlzIG11c3QgcmV0dXJuIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBmb3IgY29uZGl0aW9ucyBpZiB0aGVyZQorCS8vIGlzIGEgY29tbWFuZCBwZW5kaW5nIHdpdGggTExEIG9yIG5vdC4KKwltZWdhcmFpZF9jbW1fdW5yZWdpc3RlcihhZGFwdGVyKTsKKworCS8vIGZpbmFsaXplIHRoZSBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXIgYW5kIHJlbGVhc2UgYWxsIHJlc291cmNlcworCW1lZ2FyYWlkX2ZpbmlfbWJveChhZGFwdGVyKTsKKworCWtmcmVlKGFkYXB0ZXIpOworCisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfc2h1dGRvd24gLSBQQ0kgc2h1dGRvd24gZm9yIG1lZ2FyYWlkIEhCQQorICogQHBhcmFtIGRldmljZQk6IGdlbmVyaWNlIGRyaXZlciBtb2RlbCBkZXZpY2UKKyAqCisgKiBTaHV0ZG93biBub3RpZmljYXRpb24sIHBlcmZvcm0gZmx1c2ggY2FjaGUKKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWFkYXB0ZXJfdAkJKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXZpY2UpKTsKKwlzdGF0aWMgaW50CQljb3VudGVyOworCisJaWYgKCFhZGFwdGVyKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IG51bGwgZGV2aWNlIGluIHNodXRkb3duXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBmbHVzaCBjYWNoZXMgbm93CisJY29uX2xvZyhDTF9BTk4sIChLRVJOX0lORk8gIm1lZ2FyYWlkOiBmbHVzaGluZyBhZGFwdGVyICVkLi4uIiwKKwkJY291bnRlcisrKSk7CisKKwltZWdhcmFpZF9tYm94X2ZsdXNoX2NhY2hlKGFkYXB0ZXIpOworCisJY29uX2xvZyhDTF9BTk4sICgiZG9uZVxuIikpOworfQorCisKKy8qKgorICogbWVnYXJhaWRfaW9fYXR0YWNoIC0gYXR0YWNoIGEgZGV2aWNlIHdpdGggdGhlIElPIHN1YnN5c3RlbQorICogQHBhcmFtIGFkYXB0ZXIJOiBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICoKKyAqIEF0dGFjaCB0aGlzIGRldmljZSB3aXRoIHRoZSBJTyBzdWJzeXN0ZW0KKyAqKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2lvX2F0dGFjaChhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKworCS8vIEluaXRpYWxpemUgU0NTSSBIb3N0IHN0cnVjdHVyZQorCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJm1lZ2FyYWlkX3RlbXBsYXRlX2csIDgpOworCWlmICghaG9zdCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIG1ib3g6IHNjc2lfcmVnaXN0ZXIgZmFpbGVkXG4iKSk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCVNDU0lIT1NUMkFEQVAoaG9zdCkJPSAoY2FkZHJfdClhZGFwdGVyOworCWFkYXB0ZXItPmhvc3QJCT0gaG9zdDsKKworCS8vIGV4cG9ydCB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCBieSB0aGUgbWlkLWxheWVyCisJc2NzaV9hc3NpZ25fbG9jayhob3N0LCBhZGFwdGVyLT5ob3N0X2xvY2spOworCXNjc2lfc2V0X2RldmljZShob3N0LCAmYWRhcHRlci0+cGRldi0+ZGV2KTsKKworCWhvc3QtPmlycQkJPSBhZGFwdGVyLT5pcnE7CisJaG9zdC0+dW5pcXVlX2lkCQk9IGFkYXB0ZXItPnVuaXF1ZV9pZDsKKwlob3N0LT5jYW5fcXVldWUJCT0gYWRhcHRlci0+bWF4X2NtZHM7CisJaG9zdC0+dGhpc19pZAkJPSBhZGFwdGVyLT5pbml0X2lkOworCWhvc3QtPnNnX3RhYmxlc2l6ZQk9IGFkYXB0ZXItPnNnbGVuOworCWhvc3QtPm1heF9zZWN0b3JzCT0gYWRhcHRlci0+bWF4X3NlY3RvcnM7CisJaG9zdC0+Y21kX3Blcl9sdW4JPSBhZGFwdGVyLT5jbWRfcGVyX2x1bjsKKwlob3N0LT5tYXhfY2hhbm5lbAk9IGFkYXB0ZXItPm1heF9jaGFubmVsOworCWhvc3QtPm1heF9pZAkJPSBhZGFwdGVyLT5tYXhfdGFyZ2V0OworCWhvc3QtPm1heF9sdW4JCT0gYWRhcHRlci0+bWF4X2x1bjsKKworCisJLy8gbm90aWZ5IG1pZC1sYXllciBhYm91dCB0aGUgbmV3IGNvbnRyb2xsZXIKKwlpZiAoc2NzaV9hZGRfaG9zdChob3N0LCAmYWRhcHRlci0+cGRldi0+ZGV2KSkgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgbWJveDogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpKTsKKworCQlzY3NpX2hvc3RfcHV0KGhvc3QpOworCisJCXJldHVybiAtMTsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbWVnYXJhaWRfaW9fZGV0YWNoIC0gZGV0YWNoIGEgZGV2aWNlIGZyb20gdGhlIElPIHN1YnN5c3RlbQorICogQHBhcmFtIGFkYXB0ZXIJOiBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICoKKyAqIERldGFjaCB0aGlzIGRldmljZSBmcm9tIHRoZSBJTyBzdWJzeXN0ZW0KKyAqKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9pb19kZXRhY2goYWRhcHRlcl90ICphZGFwdGVyKQoreworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7CisKKwljb25fbG9nKENMX0RMRVZFTDEsIChLRVJOX0lORk8gIm1lZ2FyYWlkOiBpbyBkZXRhY2hcbiIpKTsKKworCWhvc3QgPSBhZGFwdGVyLT5ob3N0OworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKworCXJldHVybjsKK30KKworCisvKgorICogU1RBUlQ6IE1haWxib3ggTG93IExldmVsIERyaXZlcgorICoKKyAqIFRoaXMgaXMgc2VjdGlvbiBzcGVjaWZpYyB0byB0aGUgc2luZ2xlIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqLworCisvKioKKyAqIG1lZ2FyYWlkX2luaXRfbWJveCAtIGluaXRpYWxpemUgY29udHJvbGxlcgorICogQHBhcmFtIGFkYXB0ZXIJLSBvdXIgc29mdCBzdGF0ZQorICoKKyAqIC4gQWxsb2NhdGUgMTYtYnl0ZSBhbGlnbmVkIG1haWxib3ggbWVtb3J5IGZvciBmaXJtd2FyZSBoYW5kc2hha2UKKyAqIC4gQWxsb2NhdGUgY29udHJvbGxlcidzIG1lbW9yeSByZXNvdXJjZXMKKyAqIC4gRmluZCBvdXQgYWxsIGluaXRpYWxpemF0aW9uIGRhdGEKKyAqIC4gQWxsb2NhdGUgbWVtb3J5IHJlcXVpcmVkIGZvciBhbGwgdGhlIGNvbW1hbmRzCisgKiAuIFVzZSBpbnRlcm5hbCBsaWJyYXJ5IG9mIEZXIHJvdXRpbmVzLCBidWlsZCB1cCBjb21wbGV0ZSBzb2Z0IHN0YXRlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CittZWdhcmFpZF9pbml0X21ib3goYWRhcHRlcl90ICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwltcmFpZF9kZXZpY2VfdAkJKnJhaWRfZGV2OworCWludAkJCWk7CisKKworCWFkYXB0ZXItPml0bwk9IE1CT1hfVElNRU9VVDsKKwlwZGV2CQk9IGFkYXB0ZXItPnBkZXY7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbml0IGRhdGEgc3RydWN0dXJlIGZvciBtYWlsYm94CisJICogY29udHJvbGxlcnMKKwkgKi8KKwlyYWlkX2RldiA9IGttYWxsb2Moc2l6ZW9mKG1yYWlkX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJhaWRfZGV2ID09IE5VTEwpIHJldHVybiAtMTsKKworCW1lbXNldChyYWlkX2RldiwgMCwgc2l6ZW9mKG1yYWlkX2RldmljZV90KSk7CisKKwkvKgorCSAqIEF0dGFjaCB0aGUgYWRhcHRlciBzb2Z0IHN0YXRlIHRvIHJhaWQgZGV2aWNlIHNvZnQgc3RhdGUKKwkgKi8KKwlhZGFwdGVyLT5yYWlkX2RldmljZQk9IChjYWRkcl90KXJhaWRfZGV2OworCXJhaWRfZGV2LT5mYXN0X2xvYWQJPSBtZWdhcmFpZF9mYXN0X2xvYWQ7CisKKworCS8vIG91ciBiYXNlcG9ydAorCXJhaWRfZGV2LT5iYXNlcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJNZWdhUkFJRDogTFNJIExvZ2ljIENvcnBvcmF0aW9uIikgIT0gMCkgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiBtZW0gcmVnaW9uIGJ1c3lcbiIpKTsKKworCQlnb3RvIG91dF9mcmVlX3JhaWRfZGV2OworCX0KKworCXJhaWRfZGV2LT5iYXNlYWRkciA9IGlvcmVtYXBfbm9jYWNoZShyYWlkX2Rldi0+YmFzZXBvcnQsIDEyOCk7CisKKwlpZiAoIXJhaWRfZGV2LT5iYXNlYWRkcikgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IGNvdWxkIG5vdCBtYXAgaGJhIG1lbW9yeVxuIikgKTsKKworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJLy8KKwkvLyBTZXR1cCB0aGUgcmVzdCBvZiB0aGUgc29mdCBzdGF0ZSB1c2luZyB0aGUgbGlicmFyeSBvZiBGVyByb3V0aW5lcworCS8vCisKKwkvLyByZXF1ZXN0IElSUSBhbmQgcmVnaXN0ZXIgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKwlpZiAocmVxdWVzdF9pcnEoYWRhcHRlci0+aXJxLCBtZWdhcmFpZF9pc3IsIFNBX1NISVJRLCAibWVnYXJhaWQiLAorCQlhZGFwdGVyKSkgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IENvdWxkbid0IHJlZ2lzdGVyIElSUSAlZCFcbiIsIGFkYXB0ZXItPmlycSkpOworCisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCisKKwkvLyBpbml0aWFsaXplIHRoZSBtdXR1YWwgZXhjbHVzaW9uIGxvY2sgZm9yIHRoZSBtYWlsYm94CisJc3Bpbl9sb2NrX2luaXQoJnJhaWRfZGV2LT5tYWlsYm94X2xvY2spOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHJlcXVpcmVkIGZvciBjb21tYW5kcworCWlmIChtZWdhcmFpZF9hbGxvY19jbWRfcGFja2V0cyhhZGFwdGVyKSAhPSAwKSB7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKworCS8vIFByb2R1Y3QgaW5mbworCWlmIChtZWdhcmFpZF9tYm94X3Byb2R1Y3RfaW5mbyhhZGFwdGVyKSAhPSAwKSB7CisJCWdvdG8gb3V0X2FsbG9jX2NtZHM7CisJfQorCisJLy8gRG8gd2Ugc3VwcG9ydCBleHRlbmRlZCBDREJzCisJYWRhcHRlci0+bWF4X2NkYl9zeiA9IDEwOworCWlmIChtZWdhcmFpZF9tYm94X2V4dGVuZGVkX2NkYihhZGFwdGVyKSA9PSAwKSB7CisJCWFkYXB0ZXItPm1heF9jZGJfc3ogPSAxNjsKKwl9CisKKwkvKgorCSAqIERvIHdlIHN1cHBvcnQgY2x1c3RlciBlbnZpcm9ubWVudCwgaWYgd2UgZG8sIHdoYXQgaXMgdGhlIGluaXRpYXRvcgorCSAqIGlkLgorCSAqIE5PVEU6IEluIGEgbm9uLWNsdXN0ZXIgYXdhcmUgZmlybXdhcmUgZW52aXJvbm1lbnQsIHRoZSBMTEQgc2hvdWxkCisJICogcmV0dXJuIDcgYXMgaW5pdGlhdG9yIGlkLgorCSAqLworCWFkYXB0ZXItPmhhCQk9IDA7CisJYWRhcHRlci0+aW5pdF9pZAk9IC0xOworCWlmIChtZWdhcmFpZF9tYm94X3N1cHBvcnRfaGEoYWRhcHRlciwgJmFkYXB0ZXItPmluaXRfaWQpID09IDApIHsKKwkJYWRhcHRlci0+aGEgPSAxOworCX0KKworCS8qCisJICogUHJlcGFyZSB0aGUgZGV2aWNlIGlkcyBhcnJheSB0byBoYXZlIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIGtlcm5lbAorCSAqIGRldmljZSBhZGRyZXNzIGFuZCBtZWdhcmFpZCBkZXZpY2UgYWRkcmVzcy4KKwkgKiBXZSBleHBvcnQgdGhlIHBoeXNpY2FsIGRldmljZXMgb24gdGhlaXIgYWN0dWFsIGFkZHJlc3Nlcy4gVGhlCisJICogbG9naWNhbCBkcml2ZXMgYXJlIGV4cG9ydGVkIG9uIGEgdmlydHVhbCBTQ1NJIGNoYW5uZWwKKwkgKi8KKwltZWdhcmFpZF9tYm94X3NldHVwX2RldmljZV9tYXAoYWRhcHRlcik7CisKKwkvLyBJZiB0aGUgZmlybXdhcmUgc3VwcG9ydHMgcmFuZG9tIGRlbGV0aW9uLCB1cGRhdGUgdGhlIGRldmljZSBpZCBtYXAKKwlpZiAobWVnYXJhaWRfbWJveF9zdXBwb3J0X3JhbmRvbV9kZWwoYWRhcHRlcikpIHsKKworCQkvLyBDaGFuZ2UgdGhlIGxvZ2ljYWwgZHJpdmVzIG51bWJlcnMgaW4gZGV2aWNlX2lkcyBhcnJheSBvbmUKKwkJLy8gc2xvdCBpbiBkZXZpY2VfaWRzIGlzIHJlc2VydmVkIGZvciB0YXJnZXQgaWQsIHRoYXQncyB3aHkKKwkJLy8gIjw9IiBiZWxvdworCQlmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0dJQ0FMX0RSSVZFU180MExEOyBpKyspIHsKKwkJCWFkYXB0ZXItPmRldmljZV9pZHNbYWRhcHRlci0+bWF4X2NoYW5uZWxdW2ldICs9IDB4ODA7CisJCX0KKwkJYWRhcHRlci0+ZGV2aWNlX2lkc1thZGFwdGVyLT5tYXhfY2hhbm5lbF1bYWRhcHRlci0+aW5pdF9pZF0gPQorCQkJMHhGRjsKKworCQlyYWlkX2Rldi0+cmFuZG9tX2RlbF9zdXBwb3J0ZWQgPSAxOworCX0KKworCS8qCisJICogZmluZCBvdXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIHN1cHBvcnRlZCBieQorCSAqIHRoaXMgZmlybXdhcmUKKwkgKi8KKwlhZGFwdGVyLT5zZ2xlbiA9IG1lZ2FyYWlkX21ib3hfZ2V0X21heF9zZyhhZGFwdGVyKTsKKworCS8vIGVudW1lcmF0ZSBSQUlEIGFuZCBTQ1NJIGNoYW5uZWxzIHNvIHRoYXQgYWxsIGRldmljZXMgb24gU0NTSQorCS8vIGNoYW5uZWxzIGNhbiBsYXRlciBiZSBleHBvcnRlZCwgaW5jbHVkaW5nIGRpc2sgZGV2aWNlcworCW1lZ2FyYWlkX21ib3hfZW51bV9yYWlkX3Njc2koYWRhcHRlcik7CisKKwkvKgorCSAqIE90aGVyIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgdXBwZXIgbGF5ZXIKKwkgKgorCSAqIG1heGltdW0gbnVtYmVyIG9mIHNlY3RvcnMgcGVyIElPIGNvbW1hbmQKKwkgKi8KKwlhZGFwdGVyLT5tYXhfc2VjdG9ycyA9IG1lZ2FyYWlkX21heF9zZWN0b3JzOworCisJLyoKKwkgKiBudW1iZXIgb2YgcXVldWVkIGNvbW1hbmRzIHBlciBMVU4uCisJICovCisJYWRhcHRlci0+Y21kX3Blcl9sdW4gPSBtZWdhcmFpZF9jbWRfcGVyX2x1bjsKKworCS8qCisJICogQWxsb2NhdGUgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIGlzc3VlIEZXIGNhbGxzLCB3aGVuIHN5c2ZzIGlzCisJICogYWNjZXNzZWQKKwkgKi8KKwlpZiAobWVnYXJhaWRfc3lzZnNfYWxsb2NfcmVzb3VyY2VzKGFkYXB0ZXIpICE9IDApIHsKKwkJZ290byBvdXRfYWxsb2NfY21kczsKKwl9CisKKwkvLyBTZXQgdGhlIERNQSBtYXNrIHRvIDY0LWJpdC4gQWxsIHN1cHBvcnRlZCBjb250cm9sbGVycyBhcyBjYXBhYmxlIG9mCisJLy8gRE1BIGluIHRoaXMgcmFuZ2UKKwlpZiAocGNpX3NldF9kbWFfbWFzayhhZGFwdGVyLT5wZGV2LCAweEZGRkZGRkZGRkZGRkZGRkZVTEwpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBjb3VsZCBub3Qgc2V0IERNQSBtYXNrIGZvciA2NC1iaXQuXG4iKSk7CisKKwkJZ290byBvdXRfZnJlZV9zeXNmc19yZXM7CisJfQorCisJLy8gc2V0dXAgdGFza2xldCBmb3IgRFBDCisJdGFza2xldF9pbml0KCZhZGFwdGVyLT5kcGNfaCwgbWVnYXJhaWRfbWJveF9kcGMsCisJCQkodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKworCWNvbl9sb2coQ0xfRExFVkVMMSwgKEtFUk5fSU5GTworCQkibWVnYXJhaWQgbWJveCBoYmEgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkXG4iKSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfc3lzZnNfcmVzOgorCW1lZ2FyYWlkX3N5c2ZzX2ZyZWVfcmVzb3VyY2VzKGFkYXB0ZXIpOworb3V0X2FsbG9jX2NtZHM6CisJbWVnYXJhaWRfZnJlZV9jbWRfcGFja2V0cyhhZGFwdGVyKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShhZGFwdGVyLT5pcnEsIGFkYXB0ZXIpOworb3V0X2lvdW5tYXA6CisJaW91bm1hcChyYWlkX2Rldi0+YmFzZWFkZHIpOworb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X2ZyZWVfcmFpZF9kZXY6CisJa2ZyZWUocmFpZF9kZXYpOworCisJcmV0dXJuIC0xOworfQorCisKKy8qKgorICogbWVnYXJhaWRfZmluaV9tYm94IC0gdW5kbyBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uCisgKiBAcGFyYW0gYWRhcHRlcgk6IG91ciBzb2Z0IHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9maW5pX21ib3goYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90ICpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKworCS8vIGZsdXNoIGFsbCBjYWNoZXMKKwltZWdhcmFpZF9tYm94X2ZsdXNoX2NhY2hlKGFkYXB0ZXIpOworCisJdGFza2xldF9raWxsKCZhZGFwdGVyLT5kcGNfaCk7CisKKwltZWdhcmFpZF9zeXNmc19mcmVlX3Jlc291cmNlcyhhZGFwdGVyKTsKKworCW1lZ2FyYWlkX2ZyZWVfY21kX3BhY2tldHMoYWRhcHRlcik7CisKKwlmcmVlX2lycShhZGFwdGVyLT5pcnEsIGFkYXB0ZXIpOworCisJaW91bm1hcChyYWlkX2Rldi0+YmFzZWFkZHIpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhhZGFwdGVyLT5wZGV2KTsKKworCWtmcmVlKHJhaWRfZGV2KTsKKworCXJldHVybjsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2FsbG9jX2NtZF9wYWNrZXRzIC0gYWxsb2NhdGUgc2hhcmVkIG1haWxib3gKKyAqIEBwYXJhbSBhZGFwdGVyCTogc29mdCBzdGF0ZSBvZiB0aGUgcmFpZCBjb250cm9sbGVyCisgKgorICogQWxsb2NhdGUgYW5kIGFsaWduIHRoZSBzaGFyZWQgbWFpbGJveC4gVGhpcyBtYWlib3ggaXMgdXNlZCB0byBpc3N1ZQorICogYWxsIHRoZSBjb21tYW5kcy4gRm9yIElPIGJhc2VkIGNvbnRyb2xsZXJzLCB0aGUgbWFpbGJveCBpcyBhbHNvIHJlZ3NpdGVyZWQKKyAqIHdpdGggdGhlIEZXLiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBjb21tYW5kcyBhcyB3ZWxsLgorICogVGhpcyBpcyBvdXIgYmlnIGFsbG9jYXRvcgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9hbGxvY19jbWRfcGFja2V0cyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJdW5zaWduZWQgbG9uZwkJYWxpZ247CisJc2NiX3QJCQkqc2NiOworCW1ib3hfY2NiX3QJCSpjY2I7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKmVwdGhydV9wY2lfYmxrOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSpzZ19wY2lfYmxrOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCSptYm94X3BjaV9ibGs7CisJaW50CQkJaTsKKworCXBkZXYgPSBhZGFwdGVyLT5wZGV2OworCisJLyoKKwkgKiBTZXR1cCB0aGUgbWFpbGJveAorCSAqIEFsbG9jYXRlIHRoZSBjb21tb24gMTYtYnl0ZSBhbGlnbmVkIG1lbW9yeSBmb3IgdGhlIGhhbmRzaGFrZQorCSAqIG1haWxib3guCisJICovCisJcmFpZF9kZXYtPnVuYV9tYm94NjQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAorCQkJc2l6ZW9mKG1ib3g2NF90KSwgJnJhaWRfZGV2LT51bmFfbWJveDY0X2RtYSk7CisKKwlpZiAoIXJhaWRfZGV2LT51bmFfbWJveDY0KSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IG91dCBvZiBtZW1vcnksICVzICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlfX0xJTkVfXykpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChyYWlkX2Rldi0+dW5hX21ib3g2NCwgMCwgc2l6ZW9mKG1ib3g2NF90KSk7CisKKwkvKgorCSAqIEFsaWduIHRoZSBtYWlsYm94IGF0IDE2LWJ5dGUgYm91bmRhcnkKKwkgKi8KKwlyYWlkX2Rldi0+bWJveAk9ICZyYWlkX2Rldi0+dW5hX21ib3g2NC0+bWJveDMyOworCisJcmFpZF9kZXYtPm1ib3gJPSAobWJveF90ICopKCgoKHVuc2lnbmVkIGxvbmcpcmFpZF9kZXYtPm1ib3gpICsgMTUpICYKKwkJCQkofjBVTCBeIDB4RlVMKSk7CisKKwlyYWlkX2Rldi0+bWJveDY0ID0gKG1ib3g2NF90ICopKCgodW5zaWduZWQgbG9uZylyYWlkX2Rldi0+bWJveCkgLSA4KTsKKworCWFsaWduID0gKCh2b2lkICopcmFpZF9kZXYtPm1ib3ggLQorCQkJKCh2b2lkICopJnJhaWRfZGV2LT51bmFfbWJveDY0LT5tYm94MzIpKTsKKworCXJhaWRfZGV2LT5tYm94X2RtYSA9ICh1bnNpZ25lZCBsb25nKXJhaWRfZGV2LT51bmFfbWJveDY0X2RtYSArIDggKworCQkJYWxpZ247CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbW1hbmRzIGlzc3VlZCBpbnRlcm5hbGx5CisJYWRhcHRlci0+aWJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIE1CT1hfSUJVRl9TSVpFLAorCQkJCSZhZGFwdGVyLT5pYnVmX2RtYV9oKTsKKwlpZiAoIWFkYXB0ZXItPmlidWYpIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJX19MSU5FX18pKTsKKworCQlnb3RvIG91dF9mcmVlX2NvbW1vbl9tYm94OworCX0KKwltZW1zZXQoYWRhcHRlci0+aWJ1ZiwgMCwgTUJPWF9JQlVGX1NJWkUpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgU0NTSSBDb21tYW5kIEJsb2NrcyBhbmQgdGhlaXIgYXNzb2NpYXRlZAorCS8vIG1lbW9yeQorCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBiYXNlIGxpc3Qgb2Ygc2NiLiBMYXRlciBhbGxvY2F0ZSBtZW1vcnkgZm9yCisJICogQ0NCcyBhbmQgZW1iZWRkZWQgY29tcG9uZW50cyBvZiBlYWNoIENDQiBhbmQgcG9pbnQgdGhlIHBvaW50ZXJzIGluCisJICogc2NiIHRvIHRoZSBhbGxvY2F0ZWQgY29tcG9uZW50cworCSAqIE5PVEU6IFRoZSBjb2RlIHRvIGFsbG9jYXRlIFNDQiB3aWxsIGJlIGR1cGxpY2F0ZWQgaW4gYWxsIHRoZSBMTEQKKwkgKiBzaW5jZSB0aGUgY2FsbGluZyByb3V0aW5lIGRvZXMgbm90IHlldCBrbm93IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisJICogY29tbWFuZHMuCisJICovCisJYWRhcHRlci0+a3NjYl9saXN0ID0ga21hbGxvYyhzaXplb2Yoc2NiX3QpICogTUJPWF9NQVhfU0NTSV9DTURTLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoYWRhcHRlci0+a3NjYl9saXN0ID09IE5VTEwpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogb3V0IG9mIG1lbW9yeSwgJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCV9fTElORV9fKSk7CisJCWdvdG8gb3V0X2ZyZWVfaWJ1ZjsKKwl9CisJbWVtc2V0KGFkYXB0ZXItPmtzY2JfbGlzdCwgMCwgc2l6ZW9mKHNjYl90KSAqIE1CT1hfTUFYX1NDU0lfQ01EUyk7CisKKwkvLyBtZW1vcnkgYWxsb2NhdGlvbiBmb3Igb3VyIGNvbW1hbmQgcGFja2V0cworCWlmIChtZWdhcmFpZF9tYm94X3NldHVwX2RtYV9wb29scyhhZGFwdGVyKSAhPSAwKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6IG91dCBvZiBtZW1vcnksICVzICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlfX0xJTkVfXykpOworCQlnb3RvIG91dF9mcmVlX3NjYl9saXN0OworCX0KKworCS8vIEFkanVzdCB0aGUgc2NiIHBvaW50ZXJzIGFuZCBsaW5rIGluIHRoZSBmcmVlIHBvb2wKKwllcHRocnVfcGNpX2Jsawk9IHJhaWRfZGV2LT5lcHRocnVfcG9vbDsKKwlzZ19wY2lfYmxrCT0gcmFpZF9kZXYtPnNnX3Bvb2w7CisJbWJveF9wY2lfYmxrCT0gcmFpZF9kZXYtPm1ib3hfcG9vbDsKKworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9TQ1NJX0NNRFM7IGkrKykgeworCQlzY2IJCQk9IGFkYXB0ZXItPmtzY2JfbGlzdCArIGk7CisJCWNjYgkJCT0gcmFpZF9kZXYtPmNjYl9saXN0ICsgaTsKKworCQljY2ItPm1ib3gJPSAobWJveF90ICopKG1ib3hfcGNpX2Jsa1tpXS52YWRkciArIDE2KTsKKwkJY2NiLT5yYXdfbWJveAk9ICh1aW50OF90ICopY2NiLT5tYm94OworCQljY2ItPm1ib3g2NAk9IChtYm94NjRfdCAqKShtYm94X3BjaV9ibGtbaV0udmFkZHIgKyA4KTsKKwkJY2NiLT5tYm94X2RtYV9oCT0gKHVuc2lnbmVkIGxvbmcpbWJveF9wY2lfYmxrW2ldLmRtYV9hZGRyICsgMTY7CisKKwkJLy8gbWFrZSBzdXJlIHRoZSBtYWlsYm94IGlzIGFsaWduZWQgcHJvcGVybHkKKwkJaWYgKGNjYi0+bWJveF9kbWFfaCAmIDB4MEYpIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9DUklUCisJCQkJIm1lZ2FyYWlkIG1ib3g6IG5vdCBhbGlnbmVkIG9uIDE2LWJ5dGVzXG4iKSk7CisKKwkJCWdvdG8gb3V0X3RlYXJkb3duX2RtYV9wb29sczsKKwkJfQorCisJCWNjYi0+ZXB0aHJ1CQk9IChtcmFpZF9lcGFzc3RocnVfdCAqKQorCQkJCQkJZXB0aHJ1X3BjaV9ibGtbaV0udmFkZHI7CisJCWNjYi0+ZXB0aHJ1X2RtYV9oCT0gZXB0aHJ1X3BjaV9ibGtbaV0uZG1hX2FkZHI7CisJCWNjYi0+cHRocnUJCT0gKG1yYWlkX3Bhc3N0aHJ1X3QgKiljY2ItPmVwdGhydTsKKwkJY2NiLT5wdGhydV9kbWFfaAk9IGNjYi0+ZXB0aHJ1X2RtYV9oOworCisKKwkJY2NiLT5zZ2w2NAkJPSAobWJveF9zZ2w2NCAqKXNnX3BjaV9ibGtbaV0udmFkZHI7CisJCWNjYi0+c2dsX2RtYV9oCQk9IHNnX3BjaV9ibGtbaV0uZG1hX2FkZHI7CisJCWNjYi0+c2dsMzIJCT0gKG1ib3hfc2dsMzIgKiljY2ItPnNnbDY0OworCisJCXNjYi0+Y2NiCQk9IChjYWRkcl90KWNjYjsKKwkJc2NiLT5ncAkJCT0gMDsKKworCQlzY2ItPnNubwkJPSBpOwkvLyBjb21tYW5kIGluZGV4CisKKwkJc2NiLT5zY3AJCT0gTlVMTDsKKwkJc2NiLT5zdGF0ZQkJPSBTQ0JfRlJFRTsKKwkJc2NiLT5kbWFfZGlyZWN0aW9uCT0gUENJX0RNQV9OT05FOworCQlzY2ItPmRtYV90eXBlCQk9IE1SQUlEX0RNQV9OT05FOworCQlzY2ItPmRldl9jaGFubmVsCT0gLTE7CisJCXNjYi0+ZGV2X3RhcmdldAkJPSAtMTsKKworCQkvLyBwdXQgc2NiIGluIHRoZSBmcmVlIHBvb2wKKwkJbGlzdF9hZGRfdGFpbCgmc2NiLT5saXN0LCAmYWRhcHRlci0+a3NjYl9wb29sKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3RlYXJkb3duX2RtYV9wb29sczoKKwltZWdhcmFpZF9tYm94X3RlYXJkb3duX2RtYV9wb29scyhhZGFwdGVyKTsKK291dF9mcmVlX3NjYl9saXN0OgorCWtmcmVlKGFkYXB0ZXItPmtzY2JfbGlzdCk7CitvdXRfZnJlZV9pYnVmOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgTUJPWF9JQlVGX1NJWkUsICh2b2lkICopYWRhcHRlci0+aWJ1ZiwKKwkJYWRhcHRlci0+aWJ1Zl9kbWFfaCk7CitvdXRfZnJlZV9jb21tb25fbWJveDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHNpemVvZihtYm94NjRfdCksCisJCShjYWRkcl90KXJhaWRfZGV2LT51bmFfbWJveDY0LCByYWlkX2Rldi0+dW5hX21ib3g2NF9kbWEpOworCisJcmV0dXJuIC0xOworfQorCisKKy8qKgorICogbWVnYXJhaWRfZnJlZV9jbWRfcGFja2V0cyAtIGZyZWUgbWVtb3J5CisgKiBAcGFyYW0gYWRhcHRlcgk6IHNvZnQgc3RhdGUgb2YgdGhlIHJhaWQgY29udHJvbGxlcgorICoKKyAqIFJlbGVhc2UgbWVtb3J5IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGNvbW1hbmRzCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9mcmVlX2NtZF9wYWNrZXRzKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltcmFpZF9kZXZpY2VfdCAqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwltZWdhcmFpZF9tYm94X3RlYXJkb3duX2RtYV9wb29scyhhZGFwdGVyKTsKKworCWtmcmVlKGFkYXB0ZXItPmtzY2JfbGlzdCk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIE1CT1hfSUJVRl9TSVpFLAorCQkodm9pZCAqKWFkYXB0ZXItPmlidWYsIGFkYXB0ZXItPmlidWZfZG1hX2gpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzaXplb2YobWJveDY0X3QpLAorCQkoY2FkZHJfdClyYWlkX2Rldi0+dW5hX21ib3g2NCwgcmFpZF9kZXYtPnVuYV9tYm94NjRfZG1hKTsKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X3NldHVwX2RtYV9wb29scyAtIHNldHVwIGRtYSBwb29sIGZvciBjb21tYW5kIHBhY2tldHMKKyAqIEBwYXJhbSBhZGFwdGVyCTogSEJBIHNvZnQgc3RhdGUKKyAqCisgKiBzZXR1cCB0aGUgZG1hIHBvb2xzIGZvciBtYWlsYm94LCBwYXNzdGhydSBhbmQgZXh0ZW5kZWQgcGFzc3RocnUgc3RydWN0dXJlcywKKyAqIGFuZCBzY2F0dGVyLWdhdGhlciBsaXN0cworICovCitzdGF0aWMgaW50CittZWdhcmFpZF9tYm94X3NldHVwX2RtYV9wb29scyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwlzdHJ1Y3QgbXJhaWRfcGNpX2JsawkqZXB0aHJ1X3BjaV9ibGs7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKnNnX3BjaV9ibGs7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKm1ib3hfcGNpX2JsazsKKwlpbnQJCQlpOworCisKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgMTYtYnl0ZXMgYWxpZ25lZCBtYWlsYm94ZXMKKwlyYWlkX2Rldi0+bWJveF9wb29sX2hhbmRsZSA9IHBjaV9wb29sX2NyZWF0ZSgibWVnYXJhaWQgbWJveCBwb29sIiwKKwkJCQkJCWFkYXB0ZXItPnBkZXYsCisJCQkJCQlzaXplb2YobWJveDY0X3QpICsgMTYsCisJCQkJCQkxNiwgMCk7CisKKwlpZiAocmFpZF9kZXYtPm1ib3hfcG9vbF9oYW5kbGUgPT0gTlVMTCkgeworCQlnb3RvIGZhaWxfc2V0dXBfZG1hX3Bvb2w7CisJfQorCisJbWJveF9wY2lfYmxrID0gcmFpZF9kZXYtPm1ib3hfcG9vbDsKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfU0NTSV9DTURTOyBpKyspIHsKKwkJbWJveF9wY2lfYmxrW2ldLnZhZGRyID0gcGNpX3Bvb2xfYWxsb2MoCisJCQkJCQlyYWlkX2Rldi0+bWJveF9wb29sX2hhbmRsZSwKKwkJCQkJCUdGUF9LRVJORUwsCisJCQkJCQkmbWJveF9wY2lfYmxrW2ldLmRtYV9hZGRyKTsKKwkJaWYgKCFtYm94X3BjaV9ibGtbaV0udmFkZHIpIHsKKwkJCWdvdG8gZmFpbF9zZXR1cF9kbWFfcG9vbDsKKwkJfQorCX0KKworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IGZvciBlYWNoIGVtYmVkZGVkIHBhc3N0aHJ1IHN0cnVjdXR1cmUgcG9pbnRlcgorCSAqIFJlcXVlc3QgZm9yIGEgMTI4IGJ5dGVzIGFsaWduZWQgc3RydWN0dXJlIGZvciBlYWNoIHBhc3N0aHJ1IGNvbW1hbmQKKwkgKiBzdHJ1Y3R1cmUKKwkgKiBTaW5jZSBwYXNzdGhydSBhbmQgZXh0ZW5kZWQgcGFzc3RocnUgY29tbWFuZHMgYXJlIGV4Y2x1c2l2ZSwgdGhleQorCSAqIHNoYXJlIGNvbW1vbiBtZW1vcnkgcG9vbC4gUGFzc3RocnUgc3RydWN0dXJlcyBwaWdneWJhY2sgb24gbWVtb3J5CisJICogYWxsb2N0ZWQgdG8gZXh0ZW5kZWQgcGFzc3RocnUgc2luY2UgcGFzc3RocnUgaXMgc21hbGxlciBvZiB0aGUgdHdvCisJICovCisJcmFpZF9kZXYtPmVwdGhydV9wb29sX2hhbmRsZSA9IHBjaV9wb29sX2NyZWF0ZSgibWVnYXJhaWQgbWJveCBwdGhydSIsCisJCQlhZGFwdGVyLT5wZGV2LCBzaXplb2YobXJhaWRfZXBhc3N0aHJ1X3QpLCAxMjgsIDApOworCisJaWYgKHJhaWRfZGV2LT5lcHRocnVfcG9vbF9oYW5kbGUgPT0gTlVMTCkgeworCQlnb3RvIGZhaWxfc2V0dXBfZG1hX3Bvb2w7CisJfQorCisJZXB0aHJ1X3BjaV9ibGsgPSByYWlkX2Rldi0+ZXB0aHJ1X3Bvb2w7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1NDU0lfQ01EUzsgaSsrKSB7CisJCWVwdGhydV9wY2lfYmxrW2ldLnZhZGRyID0gcGNpX3Bvb2xfYWxsb2MoCisJCQkJCQlyYWlkX2Rldi0+ZXB0aHJ1X3Bvb2xfaGFuZGxlLAorCQkJCQkJR0ZQX0tFUk5FTCwKKwkJCQkJCSZlcHRocnVfcGNpX2Jsa1tpXS5kbWFfYWRkcik7CisJCWlmICghZXB0aHJ1X3BjaV9ibGtbaV0udmFkZHIpIHsKKwkJCWdvdG8gZmFpbF9zZXR1cF9kbWFfcG9vbDsKKwkJfQorCX0KKworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBlYWNoIHNjYXR0ZXItZ2F0aGVyIGxpc3QuIFJlcXVlc3QgZm9yIDUxMiBieXRlcworCS8vIGFsaWdubWVudCBmb3IgZWFjaCBzZyBsaXN0CisJcmFpZF9kZXYtPnNnX3Bvb2xfaGFuZGxlID0gcGNpX3Bvb2xfY3JlYXRlKCJtZWdhcmFpZCBtYm94IHNnIiwKKwkJCQkJYWRhcHRlci0+cGRldiwKKwkJCQkJc2l6ZW9mKG1ib3hfc2dsNjQpICogTUJPWF9NQVhfU0dfU0laRSwKKwkJCQkJNTEyLCAwKTsKKworCWlmIChyYWlkX2Rldi0+c2dfcG9vbF9oYW5kbGUgPT0gTlVMTCkgeworCQlnb3RvIGZhaWxfc2V0dXBfZG1hX3Bvb2w7CisJfQorCisJc2dfcGNpX2JsayA9IHJhaWRfZGV2LT5zZ19wb29sOworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9TQ1NJX0NNRFM7IGkrKykgeworCQlzZ19wY2lfYmxrW2ldLnZhZGRyID0gcGNpX3Bvb2xfYWxsb2MoCisJCQkJCQlyYWlkX2Rldi0+c2dfcG9vbF9oYW5kbGUsCisJCQkJCQlHRlBfS0VSTkVMLAorCQkJCQkJJnNnX3BjaV9ibGtbaV0uZG1hX2FkZHIpOworCQlpZiAoIXNnX3BjaV9ibGtbaV0udmFkZHIpIHsKKwkJCWdvdG8gZmFpbF9zZXR1cF9kbWFfcG9vbDsKKwkJfQorCX0KKworCXJldHVybiAwOworCitmYWlsX3NldHVwX2RtYV9wb29sOgorCW1lZ2FyYWlkX21ib3hfdGVhcmRvd25fZG1hX3Bvb2xzKGFkYXB0ZXIpOworCXJldHVybiAtMTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfdGVhcmRvd25fZG1hX3Bvb2xzIC0gdGVhcmRvd24gZG1hIHBvb2xzIGZvciBjb21tYW5kIHBhY2tldHMKKyAqIEBwYXJhbSBhZGFwdGVyCTogSEJBIHNvZnQgc3RhdGUKKyAqCisgKiB0ZWFyZG93biB0aGUgZG1hIHBvb2wgZm9yIG1haWxib3gsIHBhc3N0aHJ1IGFuZCBleHRlbmRlZCBwYXNzdGhydQorICogc3RydWN0dXJlcywgYW5kIHNjYXR0ZXItZ2F0aGVyIGxpc3RzCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9tYm94X3RlYXJkb3duX2RtYV9wb29scyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwlzdHJ1Y3QgbXJhaWRfcGNpX2JsawkqZXB0aHJ1X3BjaV9ibGs7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKnNnX3BjaV9ibGs7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJKm1ib3hfcGNpX2JsazsKKwlpbnQJCQlpOworCisKKwlzZ19wY2lfYmxrID0gcmFpZF9kZXYtPnNnX3Bvb2w7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1NDU0lfQ01EUyAmJiBzZ19wY2lfYmxrW2ldLnZhZGRyOyBpKyspIHsKKwkJcGNpX3Bvb2xfZnJlZShyYWlkX2Rldi0+c2dfcG9vbF9oYW5kbGUsIHNnX3BjaV9ibGtbaV0udmFkZHIsCisJCQlzZ19wY2lfYmxrW2ldLmRtYV9hZGRyKTsKKwl9CisJaWYgKHJhaWRfZGV2LT5zZ19wb29sX2hhbmRsZSkKKwkJcGNpX3Bvb2xfZGVzdHJveShyYWlkX2Rldi0+c2dfcG9vbF9oYW5kbGUpOworCisKKwllcHRocnVfcGNpX2JsayA9IHJhaWRfZGV2LT5lcHRocnVfcG9vbDsKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfU0NTSV9DTURTICYmIGVwdGhydV9wY2lfYmxrW2ldLnZhZGRyOyBpKyspIHsKKwkJcGNpX3Bvb2xfZnJlZShyYWlkX2Rldi0+ZXB0aHJ1X3Bvb2xfaGFuZGxlLAorCQkJZXB0aHJ1X3BjaV9ibGtbaV0udmFkZHIsIGVwdGhydV9wY2lfYmxrW2ldLmRtYV9hZGRyKTsKKwl9CisJaWYgKHJhaWRfZGV2LT5lcHRocnVfcG9vbF9oYW5kbGUpCisJCXBjaV9wb29sX2Rlc3Ryb3kocmFpZF9kZXYtPmVwdGhydV9wb29sX2hhbmRsZSk7CisKKworCW1ib3hfcGNpX2JsayA9IHJhaWRfZGV2LT5tYm94X3Bvb2w7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX1NDU0lfQ01EUyAmJiBtYm94X3BjaV9ibGtbaV0udmFkZHI7IGkrKykgeworCQlwY2lfcG9vbF9mcmVlKHJhaWRfZGV2LT5tYm94X3Bvb2xfaGFuZGxlLAorCQkJbWJveF9wY2lfYmxrW2ldLnZhZGRyLCBtYm94X3BjaV9ibGtbaV0uZG1hX2FkZHIpOworCX0KKwlpZiAocmFpZF9kZXYtPm1ib3hfcG9vbF9oYW5kbGUpCisJCXBjaV9wb29sX2Rlc3Ryb3kocmFpZF9kZXYtPm1ib3hfcG9vbF9oYW5kbGUpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfYWxsb2Nfc2NiIC0gZGV0YWNoIGFuZCByZXR1cm4gYSBzY2IgZnJvbSB0aGUgZnJlZSBsaXN0CisgKiBAYWRhcHRlcgk6IGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKgorICogcmV0dXJuIHRoZSBzY2IgZnJvbSB0aGUgaGVhZCBvZiB0aGUgZnJlZSBsaXN0LiBOVUxMIGlmIHRoZXJlIGFyZSBub25lCisgKiBhdmFpbGFibGUKKyAqKi8KK3N0YXRpYyBpbmxpbmUgc2NiX3QgKgorbWVnYXJhaWRfYWxsb2Nfc2NiKGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNjc2lfY21uZCAqc2NwKQoreworCXN0cnVjdCBsaXN0X2hlYWQJKmhlYWQgPSAmYWRhcHRlci0+a3NjYl9wb29sOworCXNjYl90CQkJKnNjYiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkvLyBkZXRhY2ggc2NiIGZyb20gZnJlZSBwb29sCisJc3Bpbl9sb2NrX2lycXNhdmUoU0NTSV9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShTQ1NJX0ZSRUVfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNjYiA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc2NiX3QsIGxpc3QpOworCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFNDU0lfRlJFRV9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCXNjYi0+c3RhdGUJPSBTQ0JfQUNUSVZFOworCXNjYi0+c2NwCT0gc2NwOworCXNjYi0+ZG1hX3R5cGUJPSBNUkFJRF9ETUFfTk9ORTsKKworCXJldHVybiBzY2I7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9kZWFsbG9jX3NjYiAtIHJldHVybiB0aGUgc2NiIHRvIHRoZSBmcmVlIHBvb2wKKyAqIEBhZGFwdGVyCTogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY2IJCTogc2NiIHRvIGJlIGZyZWVkCisgKgorICogcmV0dXJuIHRoZSBzY2IgYmFjayB0byB0aGUgZnJlZSBsaXN0IG9mIHNjYnMuIFRoZSBjYWxsZXIgbXVzdCAnZmx1c2gnIHRoZQorICogU0NCIGJlZm9yZSBjYWxsaW5nIHVzLiBFLmcuLCBwZXJmb3JtaW5nIHBjaV91bmFtcCBhbmQvb3IgcGNpX3N5bmMgZXRjLgorICogTk9URSBOT1RFOiBNYWtlIHN1cmUgdGhlIHNjYiBpcyBub3Qgb24gYW55IGxpc3QgYmVmb3JlIGNhbGxpbmcgdGhpcworICogcm91dGluZS4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVnYXJhaWRfZGVhbGxvY19zY2IoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQoreworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJLy8gcHV0IHNjYiBpbiB0aGUgZnJlZSBwb29sCisJc2NiLT5zdGF0ZQk9IFNDQl9GUkVFOworCXNjYi0+c2NwCT0gTlVMTDsKKwlzcGluX2xvY2tfaXJxc2F2ZShTQ1NJX0ZSRUVfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwlsaXN0X2FkZCgmc2NiLT5saXN0LCAmYWRhcHRlci0+a3NjYl9wb29sKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoU0NTSV9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9ta3NnbCAtIG1ha2UgdGhlIHNjYXR0ZXItZ2F0aGVyIGxpc3QKKyAqIEBhZGFwdGVyCS0gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY2IJCS0gc2NzaSBjb250cm9sIGJsb2NrCisgKgorICogcHJlcGFyZSB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdAorICovCitzdGF0aWMgaW5saW5lIGludAorbWVnYXJhaWRfbWJveF9ta3NnbChhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CisJbWJveF9jY2JfdAkJKmNjYjsKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisJdW5zaWduZWQgbG9uZwkJb2Zmc2V0OworCXN0cnVjdCBzY3NpX2NtbmQJKnNjcDsKKwlpbnQJCQlzZ2NudDsKKwlpbnQJCQlpOworCisKKwlzY3AJPSBzY2ItPnNjcDsKKwljY2IJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCisJLy8gbm8gbWFwcGluZyByZXF1aXJlZCBpZiBubyBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCisJaWYgKCFzY3AtPnJlcXVlc3RfYnVmZmVyIHx8ICFzY3AtPnJlcXVlc3RfYnVmZmxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNjcC0+dXNlX3NnKSB7CS8qIHNjYXR0ZXItZ2F0aGVyIGxpc3Qgbm90IHVzZWQgKi8KKworCQlwYWdlID0gdmlydF90b19wYWdlKHNjcC0+cmVxdWVzdF9idWZmZXIpOworCisJCW9mZnNldCA9ICgodW5zaWduZWQgbG9uZylzY3AtPnJlcXVlc3RfYnVmZmVyICYgflBBR0VfTUFTSyk7CisKKwkJY2NiLT5idWZfZG1hX2ggPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcGFnZSwgb2Zmc2V0LAorCQkJCQkJICBzY3AtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCSAgc2NiLT5kbWFfZGlyZWN0aW9uKTsKKwkJc2NiLT5kbWFfdHlwZSA9IE1SQUlEX0RNQV9XQlVGOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gaGFuZGxlIHNwZWNpYWwgNjQtYml0IGNvbW1hbmRzIHRoYXQgbmVlZCBhCisJCSAqIG1pbmltdW0gb2YgMSBTRworCQkgKi8KKwkJc2djbnQgPSAxOworCQljY2ItPnNnbDY0WzBdLmFkZHJlc3MJPSBjY2ItPmJ1Zl9kbWFfaDsKKwkJY2NiLT5zZ2w2NFswXS5sZW5ndGgJPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKworCQlyZXR1cm4gc2djbnQ7CisJfQorCisJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisKKwkvLyBUaGUgbnVtYmVyIG9mIHNnIGVsZW1lbnRzIHJldHVybmVkIG11c3Qgbm90IGV4Y2VlZCBvdXIgbGltaXQKKwlzZ2NudCA9IHBjaV9tYXBfc2coYWRhcHRlci0+cGRldiwgc2dsLCBzY3AtPnVzZV9zZywKKwkJCXNjYi0+ZG1hX2RpcmVjdGlvbik7CisKKwlpZiAoc2djbnQgPiBhZGFwdGVyLT5zZ2xlbikgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fQ1JJVAorCQkJIm1lZ2FyYWlkIGNyaXRpY2FsOiB0b28gbWFueSBzZyBlbGVtZW50czolZFxuIiwKKwkJCXNnY250KSk7CisJCUJVRygpOworCX0KKworCXNjYi0+ZG1hX3R5cGUgPSBNUkFJRF9ETUFfV1NHOworCisJZm9yIChpID0gMDsgaSA8IHNnY250OyBpKyssIHNnbCsrKSB7CisJCWNjYi0+c2dsNjRbaV0uYWRkcmVzcwk9IHNnX2RtYV9hZGRyZXNzKHNnbCk7CisJCWNjYi0+c2dsNjRbaV0ubGVuZ3RoCT0gc2dfZG1hX2xlbihzZ2wpOworCX0KKworCS8vIFJldHVybiBjb3VudCBvZiBTRyBub2RlcworCXJldHVybiBzZ2NudDsKK30KKworCisvKioKKyAqIG1ib3hfcG9zdF9jbWQgLSBpc3N1ZSBhIG1haWxib3ggY29tbWFuZAorICogQGFkYXB0ZXIJLSBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICogQHNjYgkJLSBjb21tYW5kIHRvIGJlIGlzc3VlZAorICoKKyAqIHBvc3QgdGhlIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIgaWYgbWFpbGJveCBpcyBhdmFpbGJsZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK21ib3hfcG9zdF9jbWQoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiKQoreworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwltYm94NjRfdAkqbWJveDY0OworCW1ib3hfdAkJKm1ib3g7CisJbWJveF9jY2JfdAkqY2NiOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWkgPSAwOworCisKKwljY2IJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCW1ib3gJPSByYWlkX2Rldi0+bWJveDsKKwltYm94NjQJPSByYWlkX2Rldi0+bWJveDY0OworCisJLyoKKwkgKiBDaGVjayBmb3IgYnVzeSBtYWlsYm94LiBJZiBpdCBpcywgcmV0dXJuIGZhaWx1cmUgLSB0aGUgY2FsbGVyCisJICogc2hvdWxkIHJldHJ5IGxhdGVyLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKE1BSUxCT1hfTE9DSyhyYWlkX2RldiksIGZsYWdzKTsKKworCWlmICh1bmxpa2VseShtYm94LT5idXN5KSkgeworCQlkbyB7CisJCQl1ZGVsYXkoMSk7CisJCQlpKys7CisJCQlybWIoKTsKKwkJfSB3aGlsZShtYm94LT5idXN5ICYmIChpIDwgbWF4X21ib3hfYnVzeV93YWl0KSk7CisKKwkJaWYgKG1ib3gtPmJ1c3kpIHsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShNQUlMQk9YX0xPQ0socmFpZF9kZXYpLCBmbGFncyk7CisKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCisJLy8gQ29weSB0aGlzIGNvbW1hbmQncyBtYWlsYm94IGRhdGEgaW50byAiYWRhcHRlcidzIiBtYWlsYm94CisJbWVtY3B5KChjYWRkcl90KW1ib3g2NCwgKGNhZGRyX3QpY2NiLT5tYm94NjQsIDIyKTsKKwltYm94LT5jbWRpZCA9IHNjYi0+c25vOworCisJYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kcysrOworCisJaWYgKHNjYi0+ZG1hX2RpcmVjdGlvbiA9PSBQQ0lfRE1BX1RPREVWSUNFKSB7CisJCWlmICghc2NiLT5zY3AtPnVzZV9zZykgewkvLyBzZyBsaXN0IG5vdCB1c2VkCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoYWRhcHRlci0+cGRldiwKKwkJCQkJY2NiLT5idWZfZG1hX2gsCisJCQkJCXNjYi0+c2NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisJCWVsc2UgeworCQkJcGNpX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoYWRhcHRlci0+cGRldiwKKwkJCQlzY2ItPnNjcC0+cmVxdWVzdF9idWZmZXIsCisJCQkJc2NiLT5zY3AtPnVzZV9zZywgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKwl9CisKKwltYm94LT5idXN5CT0gMTsJLy8gU2V0IGJ1c3kKKwltYm94LT5wb2xsCT0gMDsKKwltYm94LT5hY2sJPSAwOworCXdtYigpOworCisJV1JJTkRPT1IocmFpZF9kZXYsIHJhaWRfZGV2LT5tYm94X2RtYSB8IDB4MSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKE1BSUxCT1hfTE9DSyhyYWlkX2RldiksIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbWVnYXJhaWRfcXVldWVfY29tbWFuZCAtIGdlbmVyaWMgcXVldWUgZW50cnkgcG9pbnQgZm9yIGFsbCBMTERzCisgKiBAc2NwCQk6IHBvaW50ZXIgdG8gdGhlIHNjc2kgY29tbWFuZCB0byBiZSBleGVjdXRlZAorICogQGRvbmUJOiBjYWxsYmFjayByb3V0aW5lIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgY21kIGhhcyBiZSBjb21wbGV0ZWQKKyAqCisgKiBRdWV1ZSBlbnRyeSBwb2ludCBmb3IgbWFpbGJveCBiYXNlZCBjb250cm9sbGVycy4KKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfcXVldWVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsIHZvaWQgKCogZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXI7CisJc2NiX3QJCSpzY2I7CisJaW50CQlpZl9idXN5OworCisJYWRhcHRlcgkJPSBTQ1AyQURBUFRFUihzY3ApOworCXNjcC0+c2NzaV9kb25lCT0gZG9uZTsKKwlzY3AtPnJlc3VsdAk9IDA7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoYWRhcHRlci0+aG9zdF9sb2NrKTsKKworCXNwaW5fdW5sb2NrKGFkYXB0ZXItPmhvc3RfbG9jayk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBidWlsZCBhIFNDQiByZXF1ZXN0CisJICogaWZfYnVzeSBmbGFnIHdpbGwgYmUgc2V0IGlmIG1lZ2FyYWlkX21ib3hfYnVpbGRfY21kKCkgY29tbWFuZCBjb3VsZAorCSAqIG5vdCBhbGxvY2F0ZSBzY2IuIFdlIHdpbGwgcmV0dXJuIG5vbi16ZXJvIHN0YXR1cyBpbiB0aGF0IGNhc2UuCisJICogTk9URTogc2NiIGNhbiBiZSBudWxsIGV2ZW4gdGhvdWdoIGNlcnRhaW4gY29tbWFuZHMgY29tcGxldGVkCisJICogc3VjY2Vzc2Z1bGx5LCBlLmcuLCBNT0RFX1NFTlNFIGFuZCBURVNUX1VOSVRfUkVBRFksIGl0IHdvdWxkCisJICogcmV0dXJuIDAgaW4gdGhhdCBjYXNlLCBhbmQgd2Ugd291bGQgZG8gdGhlIGNhbGxiYWNrIHJpZ2h0IGF3YXkuCisJICovCisJaWZfYnVzeQk9IDA7CisJc2NiCT0gbWVnYXJhaWRfbWJveF9idWlsZF9jbWQoYWRhcHRlciwgc2NwLCAmaWZfYnVzeSk7CisKKwlpZiAoc2NiKSB7CisJCW1lZ2FyYWlkX21ib3hfcnVucGVuZHEoYWRhcHRlciwgc2NiKTsKKwl9CisKKwlzcGluX2xvY2soYWRhcHRlci0+aG9zdF9sb2NrKTsKKworCWlmICghc2NiKSB7CS8vIGNvbW1hbmQgYWxyZWFkeSBjb21wbGV0ZWQKKwkJZG9uZShzY3ApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gaWZfYnVzeTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfYnVpbGRfY21kIC0gdHJhbnNmb3JtIHRoZSBtaWQtbGF5ZXIgc2NzaSBjb21tYW5kIHRvIG1lZ2FyYWlkCisgKiBmaXJtd2FyZSBsaW5ndWEKKyAqIEBhZGFwdGVyCS0gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY3AJCS0gbWlkLWxheWVyIHNjc2kgY29tbWFuZCBwb2ludGVyCisgKiBAYnVzeQktIHNldCBpZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSBvZiBsYWNrIG9mCisgKgkJcmVzb3VyY2VzCisgKgorICogY29udmVydCB0aGUgY29tbWFuZCBpc3N1ZWQgYnkgbWlkLWxheWVyIHRvIGZvcm1hdCB1bmRlcnN0b29kIGJ5IG1lZ2FyYWlkCisgKiBmaXJtd2FyZS4gV2UgYWxzbyBjb21wbGV0ZSBjZXJ0YWluIGNvbW1hbmQgd2l0aG91dCBzZW5kaW5nIHRoZW0gdG8gZmlybXdhcmUKKyAqLworc3RhdGljIHNjYl90ICoKK21lZ2FyYWlkX21ib3hfYnVpbGRfY21kKGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNjc2lfY21uZCAqc2NwLCBpbnQgKmJ1c3kpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCWludAkJCWNoYW5uZWw7CisJaW50CQkJdGFyZ2V0OworCWludAkJCWlzbG9naWNhbDsKKwltYm94X2NjYl90CQkqY2NiOworCW1yYWlkX3Bhc3N0aHJ1X3QJKnB0aHJ1OworCW1ib3g2NF90CQkqbWJveDY0OworCW1ib3hfdAkJCSptYm94OworCXNjYl90CQkJKnNjYjsKKwljaGFyCQkJc2tpcFtdID0gInNraXBwaW5nIjsKKwljaGFyCQkJc2NhbltdID0gInNjYW5uaW5nIjsKKwljaGFyCQkJKnNzOworCisKKwkvKgorCSAqIEdldCB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIG1hcCBmb3IgdGhlIGRldmljZSB0aGlzIGNvbW1hbmQgaXMKKwkgKiBpbnRlbmRlZCBmb3IKKwkgKi8KKwlNUkFJRF9HRVRfREVWSUNFX01BUChhZGFwdGVyLCBzY3AsIGNoYW5uZWwsIHRhcmdldCwgaXNsb2dpY2FsKTsKKworCS8qCisJICogTG9naWNhbCBkcml2ZSBjb21tYW5kcworCSAqLworCWlmIChpc2xvZ2ljYWwpIHsKKwkJc3dpdGNoIChzY3AtPmNtbmRbMF0pIHsKKwkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCQkvKgorCQkJICogRG8gd2Ugc3VwcG9ydCBjbHVzdGVyaW5nIGFuZCBpcyB0aGUgc3VwcG9ydCBlbmFibGVkCisJCQkgKiBJZiBubywgcmV0dXJuIHN1Y2Nlc3MgYWx3YXlzCisJCQkgKi8KKwkJCWlmICghYWRhcHRlci0+aGEpIHsKKwkJCQlzY3AtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQlpZiAoIShzY2IgPSBtZWdhcmFpZF9hbGxvY19zY2IoYWRhcHRlciwgc2NwKSkpIHsKKwkJCQlzY3AtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJc2NiLT5kbWFfZGlyZWN0aW9uCT0gc2NwLT5zY19kYXRhX2RpcmVjdGlvbjsKKwkJCXNjYi0+ZGV2X2NoYW5uZWwJPSAweEZGOworCQkJc2NiLT5kZXZfdGFyZ2V0CQk9IHRhcmdldDsKKwkJCWNjYgkJCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKworCQkJLyoKKwkJCSAqIFRoZSBjb21tYW5kIGlkIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIGNvbW1hbmQKKwkJCSAqIGlzc3VhbmNlIHJvdXRpbmUKKwkJCSAqLworCQkJY2NiLT5yYXdfbWJveFswXQk9IENMVVNURVJfQ01EOworCQkJY2NiLT5yYXdfbWJveFsyXQk9IFJFU0VSVkFUSU9OX1NUQVRVUzsKKwkJCWNjYi0+cmF3X21ib3hbM10JPSB0YXJnZXQ7CisKKwkJCXJldHVybiBzY2I7CisKKwkJY2FzZSBNT0RFX1NFTlNFOgorCQkJaWYgKHNjcC0+dXNlX3NnKSB7CisJCQkJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CisJCQkJY2FkZHJfdAkJCXZhZGRyOworCisJCQkJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisJCQkJaWYgKHNnbC0+cGFnZSkgeworCQkJCQl2YWRkciA9IChjYWRkcl90KQorCQkJCQkJKHBhZ2VfYWRkcmVzcygoJnNnbFswXSktPnBhZ2UpCisJCQkJCQkrICgmc2dsWzBdKS0+b2Zmc2V0KTsKKworCQkJCQltZW1zZXQodmFkZHIsIDAsIHNjcC0+Y21uZFs0XSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCQkibWVnYXJhaWQgbWFpbGJveDogaW52YWxpZCBzZzolZFxuIiwKKwkJCQkJX19MSU5FX18pKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQltZW1zZXQoc2NwLT5yZXF1ZXN0X2J1ZmZlciwgMCwgc2NwLT5jbW5kWzRdKTsKKwkJCX0KKwkJCXNjcC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNik7CisJCQlyZXR1cm4gTlVMTDsKKworCQljYXNlIElOUVVJUlk6CisJCQkvKgorCQkJICogRGlzcGxheSB0aGUgY2hhbm5lbCBzY2FuIGZvciBsb2dpY2FsIGRyaXZlcworCQkJICogRG8gbm90IGRpc3BsYXkgc2NhbiBmb3IgYSBjaGFubmVsIGlmIGFscmVhZHkgZG9uZS4KKwkJCSAqLworCQkJaWYgKCEocmRldi0+bGFzdF9kaXNwICYgKDFMIDw8IFNDUDJDSEFOTkVMKHNjcCkpKSkgeworCisJCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX0lORk8KKwkJCQkJInNjc2lbJWRdOiBzY2FubmluZyBzY3NpIGNoYW5uZWwgJWQiLAorCQkJCQlhZGFwdGVyLT5ob3N0LT5ob3N0X25vLAorCQkJCQlTQ1AyQ0hBTk5FTChzY3ApKSk7CisKKwkJCQljb25fbG9nKENMX0FOTiwgKAorCQkJCQkiIFt2aXJ0dWFsXSBmb3IgbG9naWNhbCBkcml2ZXNcbiIpKTsKKworCQkJCXJkZXYtPmxhc3RfZGlzcCB8PSAoMUwgPDwgU0NQMkNIQU5ORUwoc2NwKSk7CisJCQl9CisKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJCS8qCisJCQkgKiBEbyBub3QgYWxsb3cgTFVOID4gMCBmb3IgbG9naWNhbCBkcml2ZXMgYW5kCisJCQkgKiByZXF1ZXN0cyBmb3IgbW9yZSB0aGFuIDQwIGxvZ2ljYWwgZHJpdmVzCisJCQkgKi8KKwkJCWlmIChTQ1AyTFVOKHNjcCkpIHsKKwkJCQlzY3AtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpZiAoKHRhcmdldCAlIDB4ODApID49IE1BWF9MT0dJQ0FMX0RSSVZFU180MExEKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisKKwkJCS8qIEFsbG9jYXRlIGEgU0NCIGFuZCBpbml0aWFsaXplIHBhc3N0aHJ1ICovCisJCQlpZiAoIShzY2IgPSBtZWdhcmFpZF9hbGxvY19zY2IoYWRhcHRlciwgc2NwKSkpIHsKKwkJCQlzY3AtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJY2NiCQkJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCQkJc2NiLT5kZXZfY2hhbm5lbAk9IDB4RkY7CisJCQlzY2ItPmRldl90YXJnZXQJCT0gdGFyZ2V0OworCQkJcHRocnUJCQk9IGNjYi0+cHRocnU7CisJCQltYm94CQkJPSBjY2ItPm1ib3g7CisJCQltYm94NjQJCQk9IGNjYi0+bWJveDY0OworCisJCQlwdGhydS0+dGltZW91dAkJPSAwOworCQkJcHRocnUtPmFycwkJPSAxOworCQkJcHRocnUtPnJlcXNlbnNlbGVuCT0gMTQ7CisJCQlwdGhydS0+aXNsb2dpY2FsCT0gMTsKKwkJCXB0aHJ1LT5sb2dkcnYJCT0gdGFyZ2V0OworCQkJcHRocnUtPmNkYmxlbgkJPSBzY3AtPmNtZF9sZW47CisJCQltZW1jcHkocHRocnUtPmNkYiwgc2NwLT5jbW5kLCBzY3AtPmNtZF9sZW4pOworCisJCQltYm94LT5jbWQJCT0gTUJPWENNRF9QQVNTVEhSVTY0OworCQkJc2NiLT5kbWFfZGlyZWN0aW9uCT0gc2NwLT5zY19kYXRhX2RpcmVjdGlvbjsKKworCQkJcHRocnUtPmRhdGF4ZmVybGVuCT0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisJCQlwdGhydS0+ZGF0YXhmZXJhZGRyCT0gY2NiLT5zZ2xfZG1hX2g7CisJCQlwdGhydS0+bnVtc2dlCQk9IG1lZ2FyYWlkX21ib3hfbWtzZ2woYWRhcHRlciwKKwkJCQkJCQlzY2IpOworCisJCQltYm94LT54ZmVyYWRkcgkJPSAweEZGRkZGRkZGOworCQkJbWJveDY0LT54ZmVyYWRkcl9sbwk9ICh1aW50MzJfdCApY2NiLT5wdGhydV9kbWFfaDsKKwkJCW1ib3g2NC0+eGZlcmFkZHJfaGkJPSAwOworCisJCQlyZXR1cm4gc2NiOworCisJCWNhc2UgUkVBRF82OgorCQljYXNlIFdSSVRFXzY6CisJCWNhc2UgUkVBRF8xMDoKKwkJY2FzZSBXUklURV8xMDoKKwkJY2FzZSBSRUFEXzEyOgorCQljYXNlIFdSSVRFXzEyOgorCisJCQkvKgorCQkJICogQWxsb2NhdGUgYSBTQ0IgYW5kIGluaXRpYWxpemUgbWFpbGJveAorCQkJICovCisJCQlpZiAoIShzY2IgPSBtZWdhcmFpZF9hbGxvY19zY2IoYWRhcHRlciwgc2NwKSkpIHsKKwkJCQlzY3AtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWNjYgkJCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwkJCXNjYi0+ZGV2X2NoYW5uZWwJPSAweEZGOworCQkJc2NiLT5kZXZfdGFyZ2V0CQk9IHRhcmdldDsKKwkJCW1ib3gJCQk9IGNjYi0+bWJveDsKKwkJCW1ib3g2NAkJCT0gY2NiLT5tYm94NjQ7CisJCQltYm94LT5sb2dkcnYJCT0gdGFyZ2V0OworCisJCQkvKgorCQkJICogQSBsaXR0bGUgSEFDSzogMm5kIGJpdCBpcyB6ZXJvIGZvciBhbGwgc2NzaSByZWFkCisJCQkgKiBjb21tYW5kcyBhbmQgaXMgc2V0IGZvciBhbGwgc2NzaSB3cml0ZSBjb21tYW5kcworCQkJICovCisJCQltYm94LT5jbWQgPSAoc2NwLT5jbW5kWzBdICYgMHgwMikgPyAgTUJPWENNRF9MV1JJVEU2NDoKKwkJCQkJTUJPWENNRF9MUkVBRDY0IDsKKworCQkJLyoKKwkJCSAqIDYtYnl0ZSBSRUFEKDB4MDgpIG9yIFdSSVRFKDB4MEEpIGNkYgorCQkJICovCisJCQlpZiAoc2NwLT5jbWRfbGVuID09IDYpIHsKKwkJCQltYm94LT5udW1zZWN0b3JzID0gKHVpbnQzMl90KXNjcC0+Y21uZFs0XTsKKwkJCQltYm94LT5sYmEgPQorCQkJCQkoKHVpbnQzMl90KXNjcC0+Y21uZFsxXSA8PCAxNikJfAorCQkJCQkoKHVpbnQzMl90KXNjcC0+Y21uZFsyXSA8PCA4KQl8CisJCQkJCSh1aW50MzJfdClzY3AtPmNtbmRbM107CisKKwkJCQltYm94LT5sYmEgJj0gMHgxRkZGRkY7CisJCQl9CisKKwkJCS8qCisJCQkgKiAxMC1ieXRlIFJFQUQoMHgyOCkgb3IgV1JJVEUoMHgyQSkgY2RiCisJCQkgKi8KKwkJCWVsc2UgaWYgKHNjcC0+Y21kX2xlbiA9PSAxMCkgeworCQkJCW1ib3gtPm51bXNlY3RvcnMgPQorCQkJCQkodWludDMyX3Qpc2NwLT5jbW5kWzhdIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbN10gPDwgOCk7CisJCQkJbWJveC0+bGJhID0KKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbMl0gPDwgMjQpIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbM10gPDwgMTYpIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbNF0gPDwgOCkgfAorCQkJCQkodWludDMyX3Qpc2NwLT5jbW5kWzVdOworCQkJfQorCisJCQkvKgorCQkJICogMTItYnl0ZSBSRUFEKDB4QTgpIG9yIFdSSVRFKDB4QUEpIGNkYgorCQkJICovCisJCQllbHNlIGlmIChzY3AtPmNtZF9sZW4gPT0gMTIpIHsKKwkJCQltYm94LT5sYmEgPQorCQkJCQkoKHVpbnQzMl90KXNjcC0+Y21uZFsyXSA8PCAyNCkgfAorCQkJCQkoKHVpbnQzMl90KXNjcC0+Y21uZFszXSA8PCAxNikgfAorCQkJCQkoKHVpbnQzMl90KXNjcC0+Y21uZFs0XSA8PCA4KSB8CisJCQkJCSh1aW50MzJfdClzY3AtPmNtbmRbNV07CisKKwkJCQltYm94LT5udW1zZWN0b3JzID0KKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbNl0gPDwgMjQpIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbN10gPDwgMTYpIHwKKwkJCQkJKCh1aW50MzJfdClzY3AtPmNtbmRbOF0gPDwgOCkgfAorCQkJCQkodWludDMyX3Qpc2NwLT5jbW5kWzldOworCQkJfQorCQkJZWxzZSB7CisJCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCQkJIm1lZ2FyYWlkOiB1bnN1cHBvcnRlZCBDREIgbGVuZ3RoXG4iKSk7CisKKwkJCQltZWdhcmFpZF9kZWFsbG9jX3NjYihhZGFwdGVyLCBzY2IpOworCisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJc2NiLT5kbWFfZGlyZWN0aW9uID0gc2NwLT5zY19kYXRhX2RpcmVjdGlvbjsKKworCQkJLy8gQ2FsY3VsYXRlIFNjYXR0ZXItR2F0aGVyIGluZm8KKwkJCW1ib3g2NC0+eGZlcmFkZHJfbG8JPSAodWludDMyX3QgKWNjYi0+c2dsX2RtYV9oOworCQkJbWJveC0+bnVtc2dlCQk9IG1lZ2FyYWlkX21ib3hfbWtzZ2woYWRhcHRlciwKKwkJCQkJCQlzY2IpOworCQkJbWJveC0+eGZlcmFkZHIJCT0gMHhGRkZGRkZGRjsKKwkJCW1ib3g2NC0+eGZlcmFkZHJfaGkJPSAwOworCisJCQlyZXR1cm4gc2NiOworCisJCWNhc2UgUkVTRVJWRToKKwkJY2FzZSBSRUxFQVNFOgorCQkJLyoKKwkJCSAqIERvIHdlIHN1cHBvcnQgY2x1c3RlcmluZyBhbmQgaXMgdGhlIHN1cHBvcnQgZW5hYmxlZAorCQkJICovCisJCQlpZiAoIWFkYXB0ZXItPmhhKSB7CisJCQkJc2NwLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQkvKgorCQkJICogQWxsb2NhdGUgYSBTQ0IgYW5kIGluaXRpYWxpemUgbWFpbGJveAorCQkJICovCisJCQlpZiAoIShzY2IgPSBtZWdhcmFpZF9hbGxvY19zY2IoYWRhcHRlciwgc2NwKSkpIHsKKwkJCQlzY3AtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJCSpidXN5ID0gMTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJY2NiCQkJPSAobWJveF9jY2JfdCAqKXNjYi0+Y2NiOworCQkJc2NiLT5kZXZfY2hhbm5lbAk9IDB4RkY7CisJCQlzY2ItPmRldl90YXJnZXQJCT0gdGFyZ2V0OworCQkJY2NiLT5yYXdfbWJveFswXQk9IENMVVNURVJfQ01EOworCQkJY2NiLT5yYXdfbWJveFsyXQk9ICAoc2NwLT5jbW5kWzBdID09IFJFU0VSVkUpID8KKwkJCQkJCVJFU0VSVkVfTEQgOiBSRUxFQVNFX0xEOworCisJCQljY2ItPnJhd19tYm94WzNdCT0gdGFyZ2V0OworCQkJc2NiLT5kbWFfZGlyZWN0aW9uCT0gc2NwLT5zY19kYXRhX2RpcmVjdGlvbjsKKworCQkJcmV0dXJuIHNjYjsKKworCQlkZWZhdWx0OgorCQkJc2NwLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZWxzZSB7IC8vIFBhc3N0aHJ1IGRldmljZSBjb21tYW5kcworCisJCS8vIERvIG5vdCBhbGxvdyBhY2Nlc3MgdG8gdGFyZ2V0IGlkID4gMTUgb3IgTFVOID4gNworCQlpZiAodGFyZ2V0ID4gMTUgfHwgU0NQMkxVTihzY3ApID4gNykgeworCQkJc2NwLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvLyBpZiBmYXN0IGxvYWQgb3B0aW9uIHdhcyBzZXQgYW5kIHNjYW4gZm9yIGxhc3QgZGV2aWNlIGlzCisJCS8vIG92ZXIsIHJlc2V0IHRoZSBmYXN0X2xvYWQgZmxhZyBzbyB0aGF0IGR1cmluZyBhIHBvc3NpYmxlCisJCS8vIG5leHQgc2NhbiwgZGV2aWNlcyBjYW4gYmUgbWFkZSBhdmFpbGFibGUKKwkJaWYgKHJkZXYtPmZhc3RfbG9hZCAmJiAodGFyZ2V0ID09IDE1KSAmJgorCQkJKFNDUDJDSEFOTkVMKHNjcCkgPT0gYWRhcHRlci0+bWF4X2NoYW5uZWwgLTEpKSB7CisKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPCisJCQkibWVnYXJhaWRbJWRdOiBwaHlzaWNhbCBkZXZpY2Ugc2NhbiByZS1lbmFibGVkXG4iLAorCQkJCWFkYXB0ZXItPmhvc3QtPmhvc3Rfbm8pKTsKKwkJCXJkZXYtPmZhc3RfbG9hZCA9IDA7CisJCX0KKworCQkvKgorCQkgKiBEaXNwbGF5IHRoZSBjaGFubmVsIHNjYW4gZm9yIHBoeXNpY2FsIGRldmljZXMKKwkJICovCisJCWlmICghKHJkZXYtPmxhc3RfZGlzcCAmICgxTCA8PCBTQ1AyQ0hBTk5FTChzY3ApKSkpIHsKKworCQkJc3MgPSByZGV2LT5mYXN0X2xvYWQgPyBza2lwIDogc2NhbjsKKworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX0lORk8KKwkJCQkic2NzaVslZF06ICVzIHNjc2kgY2hhbm5lbCAlZCBbUGh5ICVkXSIsCisJCQkJYWRhcHRlci0+aG9zdC0+aG9zdF9ubywgc3MsIFNDUDJDSEFOTkVMKHNjcCksCisJCQkJY2hhbm5lbCkpOworCisJCQljb25fbG9nKENMX0FOTiwgKAorCQkJCSIgZm9yIG5vbi1yYWlkIGRldmljZXNcbiIpKTsKKworCQkJcmRldi0+bGFzdF9kaXNwIHw9ICgxTCA8PCBTQ1AyQ0hBTk5FTChzY3ApKTsKKwkJfQorCisJCS8vIGRpc2FibGUgY2hhbm5lbCBzd2VlcCBpZiBmYXN0IGxvYWQgb3B0aW9uIGdpdmVuCisJCWlmIChyZGV2LT5mYXN0X2xvYWQpIHsKKwkJCXNjcC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLy8gQWxsb2NhdGUgYSBTQ0IgYW5kIGluaXRpYWxpemUgcGFzc3RocnUKKwkJaWYgKCEoc2NiID0gbWVnYXJhaWRfYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjcCkpKSB7CisJCQlzY3AtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJKmJ1c3kgPSAxOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQljY2IJCQk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJCXNjYi0+ZGV2X2NoYW5uZWwJPSBjaGFubmVsOworCQlzY2ItPmRldl90YXJnZXQJCT0gdGFyZ2V0OworCQlzY2ItPmRtYV9kaXJlY3Rpb24JPSBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uOworCQltYm94CQkJPSBjY2ItPm1ib3g7CisJCW1ib3g2NAkJCT0gY2NiLT5tYm94NjQ7CisKKwkJLy8gRG9lcyB0aGlzIGZpcm13YXJlIHN1cHBvcnQgZXh0ZW5kZWQgQ0RCcworCQlpZiAoYWRhcHRlci0+bWF4X2NkYl9zeiA9PSAxNikgeworCQkJbWJveC0+Y21kCQk9IE1CT1hDTURfRVhUUFRIUlU7CisKKwkJCW1lZ2FyYWlkX21ib3hfcHJlcGFyZV9lcHRocnUoYWRhcHRlciwgc2NiLCBzY3ApOworCisJCQltYm94NjQtPnhmZXJhZGRyX2xvCT0gKHVpbnQzMl90KWNjYi0+ZXB0aHJ1X2RtYV9oOworCQkJbWJveDY0LT54ZmVyYWRkcl9oaQk9IDA7CisJCQltYm94LT54ZmVyYWRkcgkJPSAweEZGRkZGRkZGOworCQl9CisJCWVsc2UgeworCQkJbWJveC0+Y21kID0gTUJPWENNRF9QQVNTVEhSVTY0OworCisJCQltZWdhcmFpZF9tYm94X3ByZXBhcmVfcHRocnUoYWRhcHRlciwgc2NiLCBzY3ApOworCisJCQltYm94NjQtPnhmZXJhZGRyX2xvCT0gKHVpbnQzMl90KWNjYi0+cHRocnVfZG1hX2g7CisJCQltYm94NjQtPnhmZXJhZGRyX2hpCT0gMDsKKwkJCW1ib3gtPnhmZXJhZGRyCQk9IDB4RkZGRkZGRkY7CisJCX0KKwkJcmV0dXJuIHNjYjsKKwl9CisKKwkvLyBOT1QgUkVBQ0hFRAorfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9ydW5wZW5kcSAtIGV4ZWN1dGUgY29tbWFuZHMgcXVldWVkIGluIHRoZSBwZW5kaW5nIHF1ZXVlCisgKiBAYWRhcHRlcgk6IGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAc2NiCQk6IFNDQiB0byBiZSBxdWV1ZWQgaW4gdGhlIHBlbmRpbmcgbGlzdAorICoKKyAqIHNjYW4gdGhlIHBlbmRpbmcgbGlzdCBmb3IgY29tbWFuZHMgd2hpY2ggYXJlIG5vdCB5ZXQgaXNzdWVkIGFuZCB0cnkgdG8KKyAqIHBvc3QgdG8gdGhlIGNvbnRyb2xsZXIuIFRoZSBTQ0IgY2FuIGJlIGEgbnVsbCBwb2ludGVyLCB3aGljaCB3b3VsZCBpbmRpY2F0ZQorICogbm8gU0NCIHRvIGJlIHF1ZXVlLCBqdXN0IHRyeSB0byBleGVjdXRlIHRoZSBvbmVzIGluIHRoZSBwZW5kaW5nIGxpc3QuCisgKgorICogTk9URTogV2UgZG8gbm90IGFjdHVhbGx5IHRyYXZlcnNlIHRoZSBwZW5kaW5nIGxpc3QuIFRoZSBTQ0JzIGFyZSBwbHVja2VkCisgKiBvdXQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgcGVuZGluZyBsaXN0LiBJZiBpdCBpcyBzdWNjZXNzZnVsbHkgaXNzdWVkLCB0aGUKKyAqIG5leHQgU0NCIGlzIGF0IHRoZSBoZWFkIG5vdy4KKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX21ib3hfcnVucGVuZHEoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiX3EpCit7CisJc2NiX3QJCQkqc2NiOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCWlmIChzY2JfcSkgeworCQlzY2JfcS0+c3RhdGUgPSBTQ0JfUEVORFE7CisJCWxpc3RfYWRkX3RhaWwoJnNjYl9xLT5saXN0LCAmYWRhcHRlci0+cGVuZF9saXN0KTsKKwl9CisKKwkvLyBpZiB0aGUgYWRhcHRlciBpbiBub3QgaW4gcXVpZXNjZW50IG1vZGUsIHBvc3QgdGhlIGNvbW1hbmRzIHRvIEZXCisJaWYgKGFkYXB0ZXItPnF1aWVzY2VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmFkYXB0ZXItPnBlbmRfbGlzdCkpIHsKKworCQlhc3NlcnRfc3Bpbl9sb2NrZWQoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlcikpOworCisJCXNjYiA9IGxpc3RfZW50cnkoYWRhcHRlci0+cGVuZF9saXN0Lm5leHQsIHNjYl90LCBsaXN0KTsKKworCQkvLyByZW1vdmUgdGhlIHNjYiBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgYW5kIHRyeSB0bworCQkvLyBpc3N1ZS4gSWYgd2UgYXJlIHVuYWJsZSB0byBpc3N1ZSBpdCwgcHV0IGJhY2sgaW4KKwkJLy8gdGhlIHBlbmRpbmcgbGlzdCBhbmQgcmV0dXJuCisKKwkJbGlzdF9kZWxfaW5pdCgmc2NiLT5saXN0KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwkJLy8gaWYgbWFpbGJveCB3YXMgYnVzeSwgcmV0dXJuIFNDQiBiYWNrIHRvIHBlbmRpbmcKKwkJLy8gbGlzdC4gTWFrZSBzdXJlIHRvIGFkZCBhdCB0aGUgaGVhZCwgc2luY2UgdGhhdCdzCisJCS8vIHdoZXJlIGl0IHdvdWxkIGhhdmUgYmVlbiByZW1vdmVkIGZyb20KKworCQlzY2ItPnN0YXRlID0gU0NCX0lTU1VFRDsKKworCQlpZiAobWJveF9wb3N0X2NtZChhZGFwdGVyLCBzY2IpICE9IDApIHsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCQkJc2NiLT5zdGF0ZSA9IFNDQl9QRU5EUTsKKworCQkJbGlzdF9hZGQoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPnBlbmRfbGlzdCk7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksCisJCQkJZmxhZ3MpOworCisJCQlyZXR1cm47CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZShQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9wcmVwYXJlX3B0aHJ1IC0gcHJlcGFyZSBhIGNvbW1hbmQgZm9yIHBoeXNpY2FsIGRldmljZXMKKyAqIEBhZGFwdGVyCS0gcG9pbnRlciB0byBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICogQHNjYgkJLSBzY3NpIGNvbnRyb2wgYmxvY2sKKyAqIEBzY3AJCS0gc2NzaSBjb21tYW5kIGZyb20gdGhlIG1pZC1sYXllcgorICoKKyAqIHByZXBhcmUgYSBjb21tYW5kIGZvciB0aGUgc2NzaSBwaHlzaWNhbCBkZXZpY2VzCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9tYm94X3ByZXBhcmVfcHRocnUoYWRhcHRlcl90ICphZGFwdGVyLCBzY2JfdCAqc2NiLAorCQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCit7CisJbWJveF9jY2JfdAkJKmNjYjsKKwltcmFpZF9wYXNzdGhydV90CSpwdGhydTsKKwl1aW50OF90CQkJY2hhbm5lbDsKKwl1aW50OF90CQkJdGFyZ2V0OworCisJY2NiCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwlwdGhydQk9IGNjYi0+cHRocnU7CisJY2hhbm5lbAk9IHNjYi0+ZGV2X2NoYW5uZWw7CisJdGFyZ2V0CT0gc2NiLT5kZXZfdGFyZ2V0OworCisJLy8gMD02c2VjLCAxPTYwc2VjLCAyPTEwbWluLCAzPTNocnMsIDQ9Tk8gdGltZW91dAorCXB0aHJ1LT50aW1lb3V0CQk9IDQ7CQorCXB0aHJ1LT5hcnMJCT0gMTsKKwlwdGhydS0+aXNsb2dpY2FsCT0gMDsKKwlwdGhydS0+Y2hhbm5lbAkJPSAwOworCXB0aHJ1LT50YXJnZXQJCT0gKGNoYW5uZWwgPDwgNCkgfCB0YXJnZXQ7CisJcHRocnUtPmxvZ2RydgkJPSBTQ1AyTFVOKHNjcCk7CisJcHRocnUtPnJlcXNlbnNlbGVuCT0gMTQ7CisJcHRocnUtPmNkYmxlbgkJPSBzY3AtPmNtZF9sZW47CisKKwltZW1jcHkocHRocnUtPmNkYiwgc2NwLT5jbW5kLCBzY3AtPmNtZF9sZW4pOworCisJaWYgKHNjcC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCXB0aHJ1LT5kYXRheGZlcmxlbgk9IHNjcC0+cmVxdWVzdF9idWZmbGVuOworCQlwdGhydS0+ZGF0YXhmZXJhZGRyCT0gY2NiLT5zZ2xfZG1hX2g7CisJCXB0aHJ1LT5udW1zZ2UJCT0gbWVnYXJhaWRfbWJveF9ta3NnbChhZGFwdGVyLCBzY2IpOworCX0KKwllbHNlIHsKKwkJcHRocnUtPmRhdGF4ZmVyYWRkcgk9IDA7CisJCXB0aHJ1LT5kYXRheGZlcmxlbgk9IDA7CisJCXB0aHJ1LT5udW1zZ2UJCT0gMDsKKwl9CisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9wcmVwYXJlX2VwdGhydSAtIHByZXBhcmUgYSBjb21tYW5kIGZvciBwaHlzaWNhbCBkZXZpY2VzCisgKiBAYWRhcHRlcgktIHBvaW50ZXIgdG8gY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY2IJCS0gc2NzaSBjb250cm9sIGJsb2NrCisgKiBAc2NwCQktIHNjc2kgY29tbWFuZCBmcm9tIHRoZSBtaWQtbGF5ZXIKKyAqCisgKiBwcmVwYXJlIGEgY29tbWFuZCBmb3IgdGhlIHNjc2kgcGh5c2ljYWwgZGV2aWNlcy4gVGhpcyByb3VudGluZSBwcmVwYXJlcworICogY29tbWFuZHMgZm9yIGRldmljZXMgd2hpY2ggY2FuIHRha2UgZXh0ZW5kZWQgQ0RCcyAoPjEwIGJ5dGVzKQorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9wcmVwYXJlX2VwdGhydShhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IsCisJCXN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3sKKwltYm94X2NjYl90CQkqY2NiOworCW1yYWlkX2VwYXNzdGhydV90CSplcHRocnU7CisJdWludDhfdAkJCWNoYW5uZWw7CisJdWludDhfdAkJCXRhcmdldDsKKworCWNjYgk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJZXB0aHJ1CT0gY2NiLT5lcHRocnU7CisJY2hhbm5lbAk9IHNjYi0+ZGV2X2NoYW5uZWw7CisJdGFyZ2V0CT0gc2NiLT5kZXZfdGFyZ2V0OworCisJLy8gMD02c2VjLCAxPTYwc2VjLCAyPTEwbWluLCAzPTNocnMsIDQ9Tk8gdGltZW91dAorCWVwdGhydS0+dGltZW91dAkJPSA0OwkKKwllcHRocnUtPmFycwkJPSAxOworCWVwdGhydS0+aXNsb2dpY2FsCT0gMDsKKwllcHRocnUtPmNoYW5uZWwJCT0gMDsKKwllcHRocnUtPnRhcmdldAkJPSAoY2hhbm5lbCA8PCA0KSB8IHRhcmdldDsKKwllcHRocnUtPmxvZ2RydgkJPSBTQ1AyTFVOKHNjcCk7CisJZXB0aHJ1LT5yZXFzZW5zZWxlbgk9IDE0OworCWVwdGhydS0+Y2RibGVuCQk9IHNjcC0+Y21kX2xlbjsKKworCW1lbWNweShlcHRocnUtPmNkYiwgc2NwLT5jbW5kLCBzY3AtPmNtZF9sZW4pOworCisJaWYgKHNjcC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCWVwdGhydS0+ZGF0YXhmZXJsZW4JPSBzY3AtPnJlcXVlc3RfYnVmZmxlbjsKKwkJZXB0aHJ1LT5kYXRheGZlcmFkZHIJPSBjY2ItPnNnbF9kbWFfaDsKKwkJZXB0aHJ1LT5udW1zZ2UJCT0gbWVnYXJhaWRfbWJveF9ta3NnbChhZGFwdGVyLCBzY2IpOworCX0KKwllbHNlIHsKKwkJZXB0aHJ1LT5kYXRheGZlcmFkZHIJPSAwOworCQllcHRocnUtPmRhdGF4ZmVybGVuCT0gMDsKKwkJZXB0aHJ1LT5udW1zZ2UJCT0gMDsKKwl9CisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfYWNrX3NlcXVlbmNlIC0gaW50ZXJydXB0IGFjayBzZXF1ZW5jZSBmb3IgbWVtb3J5IG1hcHBlZCBIQkFzCisgKiBAYWRhcHRlcgktIGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKgorICogSW50ZXJydXB0IGFja3Jvd2xlZGdlbWVudCBzZXF1ZW5jZSBmb3IgbWVtb3J5IG1hcHBlZCBIQkFzLiBGaW5kIG91dCB0aGUKKyAqIGNvbXBsZXRlZCBjb21tYW5kIGFuZCBwdXQgdGhlbSBvbiB0aGUgY29tcGxldGVkIGxpc3QgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKgorICogUmV0dXJuczoJMSBpZiB0aGUgaW50ZXJydXB0IGlzIHZhbGlkLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGludAorbWVnYXJhaWRfYWNrX3NlcXVlbmNlKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltcmFpZF9kZXZpY2VfdAkJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCW1ib3hfdAkJCSptYm94OworCXNjYl90CQkJKnNjYjsKKwl1aW50OF90CQkJbnN0YXR1czsKKwl1aW50OF90CQkJY29tcGxldGVkW01CT1hfTUFYX0ZJUk1XQVJFX1NUQVRVU107CisJc3RydWN0IGxpc3RfaGVhZAljbGlzdDsKKwlpbnQJCQloYW5kbGVkOworCXVpbnQzMl90CQlkd29yZDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlpLCBqOworCisKKwltYm94CT0gcmFpZF9kZXYtPm1ib3g7CisKKwkvLyBtb3ZlIHRoZSBTQ0JzIGZyb20gdGhlIGZpcm13YXJlIGNvbXBsZXRlZCBhcnJheSB0byBvdXIgbG9jYWwgbGlzdAorCUlOSVRfTElTVF9IRUFEKCZjbGlzdCk7CisKKwkvLyBsb29wIHRpbGwgRi9XIGhhcyBtb3JlIGNvbW1hbmRzIGZvciB1cyB0byBjb21wbGV0ZQorCWhhbmRsZWQgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKE1BSUxCT1hfTE9DSyhyYWlkX2RldiksIGZsYWdzKTsKKwlkbyB7CisJCS8qCisJCSAqIENoZWNrIGlmIGEgdmFsaWQgaW50ZXJydXB0IGlzIHBlbmRpbmcuIElmIGZvdW5kLCBmb3JjZSB0aGUKKwkJICogaW50ZXJydXB0IGxpbmUgbG93LgorCQkgKi8KKwkJZHdvcmQgPSBSRE9VVERPT1IocmFpZF9kZXYpOworCQlpZiAoZHdvcmQgIT0gMHgxMDAwMTIzNCkgYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJV1JPVVRET09SKHJhaWRfZGV2LCAweDEwMDAxMjM0KTsKKworCQluc3RhdHVzID0gMDsKKwkJLy8gd2FpdCBmb3IgdmFsaWQgbnVtc3RhdHVzIHRvIHBvc3QKKwkJZm9yIChpID0gMDsgaSA8IDB4RkZGRkY7IGkrKykgeworCQkJaWYgKG1ib3gtPm51bXN0YXR1cyAhPSAweEZGKSB7CisJCQkJbnN0YXR1cyA9IG1ib3gtPm51bXN0YXR1czsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJtYigpOworCQl9CisJCW1ib3gtPm51bXN0YXR1cyA9IDB4RkY7CisKKwkJYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kcyAtPSBuc3RhdHVzOworCisJCWZvciAoaSA9IDA7IGkgPCBuc3RhdHVzOyBpKyspIHsKKworCQkJLy8gd2FpdCBmb3IgdmFsaWQgY29tbWFuZCBpbmRleCB0byBwb3N0CisJCQlmb3IgKGogPSAwOyBqIDwgMHhGRkZGRjsgaisrKSB7CisJCQkJaWYgKG1ib3gtPmNvbXBsZXRlZFtpXSAhPSAweEZGKSBicmVhazsKKwkJCQlybWIoKTsKKwkJCX0KKwkJCWNvbXBsZXRlZFtpXQkJPSBtYm94LT5jb21wbGV0ZWRbaV07CisJCQltYm94LT5jb21wbGV0ZWRbaV0JPSAweEZGOworCisJCQlpZiAoY29tcGxldGVkW2ldID09IDB4RkYpIHsKKwkJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fQ1JJVAorCQkJCSJtZWdhcmFpZDogY29tbWFuZCBwb3N0aW5nIHRpbWVkIG91dFxuIikpOworCisJCQkJQlVHKCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIEdldCBTQ0IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tbWFuZCBpZAorCQkJaWYgKGNvbXBsZXRlZFtpXSA+PSBNQk9YX01BWF9TQ1NJX0NNRFMpIHsKKwkJCQkvLyBhIGNtbSBjb21tYW5kCisJCQkJc2NiID0gYWRhcHRlci0+dXNjYl9saXN0ICsgKGNvbXBsZXRlZFtpXSAtCisJCQkJCQlNQk9YX01BWF9TQ1NJX0NNRFMpOworCQkJfQorCQkJZWxzZSB7CisJCQkJLy8gYW4gb3MgY29tbWFuZAorCQkJCXNjYiA9IGFkYXB0ZXItPmtzY2JfbGlzdCArIGNvbXBsZXRlZFtpXTsKKwkJCX0KKworCQkJc2NiLT5zdGF0dXMgPSBtYm94LT5zdGF0dXM7CisJCQlsaXN0X2FkZF90YWlsKCZzY2ItPmxpc3QsICZjbGlzdCk7CisJCX0KKworCQkvLyBBY2tub3dsZWRnZSBpbnRlcnJ1cHQKKwkJV1JJTkRPT1IocmFpZF9kZXYsIDB4MDIpOworCisJfSB3aGlsZSgxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoTUFJTEJPWF9MT0NLKHJhaWRfZGV2KSwgZmxhZ3MpOworCisKKwkvLyBwdXQgdGhlIGNvbXBsZXRlZCBjb21tYW5kcyBpbiB0aGUgY29tcGxldGVkIGxpc3QuIERQQyB3b3VsZAorCS8vIGNvbXBsZXRlIHRoZXNlIGNvbW1hbmRzIGxhdGVyCisJc3Bpbl9sb2NrX2lycXNhdmUoQ09NUExFVEVEX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJbGlzdF9zcGxpY2UoJmNsaXN0LCAmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKworCS8vIHNjaGVkdWxlIHRoZSBEUEMgaWYgdGhlcmUgaXMgc29tZSB3b3JrIGZvciBpdAorCWlmIChoYW5kbGVkKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZhZGFwdGVyLT5kcGNfaCk7CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX2lzciAtIGlzciBmb3IgbWVtb3J5IGJhc2VkIG1haWxib3ggYmFzZWQgY29udHJvbGxlcnMKKyAqIEBpcnEJCS0gaXJxCisgKiBAZGV2cAktIHBvaW50ZXIgdG8gb3VyIHNvZnQgc3RhdGUKKyAqIEByZWdzCS0gdW51c2VkCisgKgorICogSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgbWVtb3J5LW1hcHBlZCBtYWlsYm94IGNvbnRyb2xsZXJzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK21lZ2FyYWlkX2lzcihpbnQgaXJxLCB2b2lkICpkZXZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSBkZXZwOworCWludAkJaGFuZGxlZDsKKworCWhhbmRsZWQgPSBtZWdhcmFpZF9hY2tfc2VxdWVuY2UoYWRhcHRlcik7CisKKwkvKiBMb29wIHRocm91Z2ggYW55IHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlpZiAoIWFkYXB0ZXItPnF1aWVzY2VudCkgeworCQltZWdhcmFpZF9tYm94X3J1bnBlbmRxKGFkYXB0ZXIsIE5VTEwpOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9zeW5jX3NjYiAtIHN5bmMga2VybmVsIGJ1ZmZlcnMKKyAqIEBhZGFwdGVyCTogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqIEBzY2IJCTogcG9pbnRlciB0byB0aGUgcmVzb3VyY2UgcGFja2V0CisgKgorICogRE1BIHN5bmMgaWYgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVnYXJhaWRfbWJveF9zeW5jX3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCit7CisJbWJveF9jY2JfdAkqY2NiOworCisJY2NiCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKworCXN3aXRjaCAoc2NiLT5kbWFfdHlwZSkgeworCisJY2FzZSBNUkFJRF9ETUFfV0JVRjoKKwkJaWYgKHNjYi0+ZG1hX2RpcmVjdGlvbiA9PSBQQ0lfRE1BX0ZST01ERVZJQ0UpIHsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShhZGFwdGVyLT5wZGV2LAorCQkJCQljY2ItPmJ1Zl9kbWFfaCwKKwkJCQkJc2NiLT5zY3AtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIGNjYi0+YnVmX2RtYV9oLAorCQkJc2NiLT5zY3AtPnJlcXVlc3RfYnVmZmxlbiwgc2NiLT5kbWFfZGlyZWN0aW9uKTsKKworCQlicmVhazsKKworCWNhc2UgTVJBSURfRE1BX1dTRzoKKwkJaWYgKHNjYi0+ZG1hX2RpcmVjdGlvbiA9PSBQQ0lfRE1BX0ZST01ERVZJQ0UpIHsKKwkJCXBjaV9kbWFfc3luY19zZ19mb3JfY3B1KGFkYXB0ZXItPnBkZXYsCisJCQkJCXNjYi0+c2NwLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJc2NiLT5zY3AtPnVzZV9zZywgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCXBjaV91bm1hcF9zZyhhZGFwdGVyLT5wZGV2LCBzY2ItPnNjcC0+cmVxdWVzdF9idWZmZXIsCisJCQlzY2ItPnNjcC0+dXNlX3NnLCBzY2ItPmRtYV9kaXJlY3Rpb24pOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9kcGMgLSB0aGUgdGFza2xldCB0byBjb21wbGV0ZSB0aGUgY29tbWFuZHMgZnJvbSBjb21wbGV0ZWQgbGlzdAorICogQGRldnAJOiBwb2ludGVyIHRvIEhCQSBzb2Z0IHN0YXRlCisgKgorICogUGljayB1cCB0aGUgY29tbWFuZHMgZnJvbSB0aGUgY29tcGxldGVkIGxpc3QgYW5kIHNlbmQgYmFjayB0byB0aGUgb3duZXJzLgorICogVGhpcyBpcyBhIHJlZW50cmFudCBmdW5jdGlvbiBhbmQgZG9lcyBub3QgYXNzdW1lIGFueSBsb2NrcyBhcmUgaGVsZCB3aGlsZQorICogaXQgaXMgYmVpbmcgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9kcGModW5zaWduZWQgbG9uZyBkZXZwKQoreworCWFkYXB0ZXJfdAkJKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopZGV2cDsKKwltcmFpZF9kZXZpY2VfdAkJKnJhaWRfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQJY2xpc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2w7CisJc2NiX3QJCQkqc2NiOworCXNjYl90CQkJKnRtcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpzY3A7CisJbXJhaWRfcGFzc3RocnVfdAkqcHRocnU7CisJbXJhaWRfZXBhc3N0aHJ1X3QJKmVwdGhydTsKKwltYm94X2NjYl90CQkqY2NiOworCWludAkJCWlzbG9naWNhbDsKKwlpbnQJCQlwZGV2X2luZGV4OworCWludAkJCXBkZXZfc3RhdGU7CisJbWJveF90CQkJKm1ib3g7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdWludDhfdAkJCWM7CisJaW50CQkJc3RhdHVzOworCisKKwlpZiAoIWFkYXB0ZXIpIHJldHVybjsKKworCXJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCisJLy8gbW92ZSB0aGUgU0NCcyBmcm9tIHRoZSBjb21wbGV0ZWQgbGlzdCB0byBvdXIgbG9jYWwgbGlzdAorCUlOSVRfTElTVF9IRUFEKCZjbGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwlsaXN0X3NwbGljZV9pbml0KCZhZGFwdGVyLT5jb21wbGV0ZWRfbGlzdCwgJmNsaXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ09NUExFVEVEX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2NiLCB0bXAsICZjbGlzdCwgbGlzdCkgeworCisJCXN0YXR1cwkJPSBzY2ItPnN0YXR1czsKKwkJc2NwCQk9IHNjYi0+c2NwOworCQljY2IJCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwkJcHRocnUJCT0gY2NiLT5wdGhydTsKKwkJZXB0aHJ1CQk9IGNjYi0+ZXB0aHJ1OworCQltYm94CQk9IGNjYi0+bWJveDsKKworCQkvLyBNYWtlIHN1cmUgZi93IGhhcyBjb21wbGV0ZWQgYSB2YWxpZCBjb21tYW5kCisJCWlmIChzY2ItPnN0YXRlICE9IFNDQl9JU1NVRUQpIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9DUklUCisJCQkibWVnYXJhaWQgY3JpdGljYWwgZXJyOiBpbnZhbGlkIGNvbW1hbmQgJWQ6JWQ6JXBcbiIsCisJCQkJc2NiLT5zbm8sIHNjYi0+c3RhdGUsIHNjcCkpOworCQkJQlVHKCk7CisJCQljb250aW51ZTsJLy8gTXVzdCBuZXZlciBoYXBwZW4hCisJCX0KKworCQkvLyBjaGVjayBmb3IgdGhlIG1hbmFnZW1lbnQgY29tbWFuZCBhbmQgY29tcGxldGUgaXQgcmlnaHQgYXdheQorCQlpZiAoc2NiLT5zbm8gPj0gTUJPWF9NQVhfU0NTSV9DTURTKSB7CisJCQlzY2ItPnN0YXRlCT0gU0NCX0ZSRUU7CisJCQlzY2ItPnN0YXR1cwk9IHN0YXR1czsKKworCQkJLy8gcmVtb3ZlIGZyb20gbG9jYWwgY2xpc3QKKwkJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisKKwkJCW1lZ2FyYWlkX21ib3hfbW1fZG9uZShhZGFwdGVyLCBzY2IpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIFdhcyBhbiBhYm9ydCBpc3N1ZWQgZm9yIHRoaXMgY29tbWFuZCBlYXJsaWVyCisJCWlmIChzY2ItPnN0YXRlICYgU0NCX0FCT1JUKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkibWVnYXJhaWQ6IGFib3J0ZWQgY21kICVseFsleF0gY29tcGxldGVkXG4iLAorCQkJCXNjcC0+c2VyaWFsX251bWJlciwgc2NiLT5zbm8pKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBpbnF1aXJ5IGNhbWUgb2YgYSBkaXNrIGRyaXZlIHdoaWNoIGlzIG5vdCBwYXJ0IG9mCisJCSAqIGFueSBSQUlEIGFycmF5LCBleHBvc2UgaXQgdG8gdGhlIGtlcm5lbC4gRm9yIHRoaXMgdG8gYmUKKwkJICogZW5hYmxlZCwgdXNlciBtdXN0IHNldCB0aGUgIm1lZ2FyYWlkX2V4cG9zZV91bmNvbmZfZGlza3MiCisJCSAqIGZsYWcgdG8gMSBieSBzcGVjaWZ5aW5nIGl0IG9uIG1vZHVsZSBwYXJhbWV0ZXIgbGlzdC4KKwkJICogVGhpcyB3b3VsZCBlbmFibGUgZGF0YSBtaWdyYXRpb24gb2ZmIGRyaXZlcyBmcm9tIG90aGVyCisJCSAqIGNvbmZpZ3VyYXRpb25zLgorCQkgKi8KKwkJaXNsb2dpY2FsID0gTVJBSURfSVNfTE9HSUNBTChhZGFwdGVyLCBzY3ApOworCQlpZiAoc2NwLT5jbW5kWzBdID09IElOUVVJUlkgJiYgc3RhdHVzID09IDAgJiYgaXNsb2dpY2FsID09IDAKKwkJCQkmJiBJU19SQUlEX0NIKHJhaWRfZGV2LCBzY2ItPmRldl9jaGFubmVsKSkgeworCisJCQlpZiAoc2NwLT51c2Vfc2cpIHsKKwkJCQlzZ2wgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopCisJCQkJCXNjcC0+cmVxdWVzdF9idWZmZXI7CisKKwkJCQlpZiAoc2dsLT5wYWdlKSB7CisJCQkJCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJKHBhZ2VfYWRkcmVzcygoJnNnbFswXSktPnBhZ2UpICsKKwkJCQkJCSgmc2dsWzBdKS0+b2Zmc2V0KTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJCSJtZWdhcmFpZCBtYWlsYm94OiBpbnZhbGlkIHNnOiVkXG4iLAorCQkJCQlfX0xJTkVfXykpOworCQkJCQljID0gMDsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQljID0gKih1aW50OF90ICopc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCX0KKworCQkJaWYgKChjICYgMHgxRiApID09IFRZUEVfRElTSykgeworCQkJCXBkZXZfaW5kZXggPSAoc2NiLT5kZXZfY2hhbm5lbCAqIDE2KSArCisJCQkJCXNjYi0+ZGV2X3RhcmdldDsKKwkJCQlwZGV2X3N0YXRlID0KKwkJCQkJcmFpZF9kZXYtPnBkcnZfc3RhdGVbcGRldl9pbmRleF0gJiAweDBGOworCisJCQkJaWYgKHBkZXZfc3RhdGUgPT0gUERSVl9PTkxJTkUJCXx8CisJCQkJCXBkZXZfc3RhdGUgPT0gUERSVl9GQUlMRUQJfHwKKwkJCQkJcGRldl9zdGF0ZSA9PSBQRFJWX1JCTEQJCXx8CisJCQkJCXBkZXZfc3RhdGUgPT0gUERSVl9IT1RTUEFSRQl8fAorCQkJCQltZWdhcmFpZF9leHBvc2VfdW5jb25mX2Rpc2tzID09IDApIHsKKworCQkJCQlzdGF0dXMgPSAweEYwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIENvbnZlcnQgTWVnYVJBSUQgc3RhdHVzIHRvIExpbnV4IGVycm9yIGNvZGUKKwkJc3dpdGNoIChzdGF0dXMpIHsKKworCQljYXNlIDB4MDA6CisKKwkJCXNjcC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNik7CisJCQlicmVhazsKKworCQljYXNlIDB4MDI6CisKKwkJCS8qIHNldCBzZW5zZV9idWZmZXIgYW5kIHJlc3VsdCBmaWVsZHMgKi8KKwkJCWlmIChtYm94LT5jbWQgPT0gTUJPWENNRF9QQVNTVEhSVSB8fAorCQkJCW1ib3gtPmNtZCA9PSBNQk9YQ01EX1BBU1NUSFJVNjQpIHsKKworCQkJCW1lbWNweShzY3AtPnNlbnNlX2J1ZmZlciwgcHRocnUtPnJlcXNlbnNlYXJlYSwKKwkJCQkJCTE0KTsKKworCQkJCXNjcC0+cmVzdWx0ID0gRFJJVkVSX1NFTlNFIDw8IDI0IHwKKwkJCQkJRElEX09LIDw8IDE2IHwgQ0hFQ0tfQ09ORElUSU9OIDw8IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAobWJveC0+Y21kID09IE1CT1hDTURfRVhUUFRIUlUpIHsKKworCQkJCQltZW1jcHkoc2NwLT5zZW5zZV9idWZmZXIsCisJCQkJCQllcHRocnUtPnJlcXNlbnNlYXJlYSwgMTQpOworCisJCQkJCXNjcC0+cmVzdWx0ID0gRFJJVkVSX1NFTlNFIDw8IDI0IHwKKwkJCQkJCURJRF9PSyA8PCAxNiB8CisJCQkJCQlDSEVDS19DT05ESVRJT04gPDwgMTsKKwkJCQl9IGVsc2UgeworCQkJCQlzY3AtPnNlbnNlX2J1ZmZlclswXSA9IDB4NzA7CisJCQkJCXNjcC0+c2Vuc2VfYnVmZmVyWzJdID0gQUJPUlRFRF9DT01NQU5EOworCQkJCQlzY3AtPnJlc3VsdCA9IENIRUNLX0NPTkRJVElPTiA8PCAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMHgwODoKKworCQkJc2NwLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTYgfCBzdGF0dXM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQkvKgorCQkJICogSWYgVEVTVF9VTklUX1JFQURZIGZhaWxzLCB3ZSBrbm93IFJFU0VSVkFUSU9OX1NUQVRVUworCQkJICogZmFpbGVkCisJCQkgKi8KKwkJCWlmIChzY3AtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZKSB7CisJCQkJc2NwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfAorCQkJCQlSRVNFUlZBVElPTl9DT05GTElDVCA8PCAxOworCQkJfQorCQkJZWxzZQorCQkJLyoKKwkJCSAqIEVycm9yIGNvZGUgcmV0dXJuZWQgaXMgMSBpZiBSZXNlcnZlIG9yIFJlbGVhc2UKKwkJCSAqIGZhaWxlZCBvciB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIGludmFsaWQKKwkJCSAqLworCQkJaWYgKHN0YXR1cyA9PSAxICYmIChzY3AtPmNtbmRbMF0gPT0gUkVTRVJWRSB8fAorCQkJCQkgc2NwLT5jbW5kWzBdID09IFJFTEVBU0UpKSB7CisKKwkJCQlzY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNiB8CisJCQkJCVJFU0VSVkFUSU9OX0NPTkZMSUNUIDw8IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlzY3AtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2IHwgc3RhdHVzOworCQkJfQorCQl9CisKKwkJLy8gcHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIGZvciBhbGwgZmFpbGVkIGNvbW1hbmRzCisJCWlmIChzdGF0dXMpIHsKKwkJCW1lZ2FyYWlkX21ib3hfZGlzcGxheV9zY2IoYWRhcHRlciwgc2NiKTsKKwkJfQorCisJCS8vIEZyZWUgb3VyIGludGVybmFsIHJlc291cmNlcyBhbmQgY2FsbCB0aGUgbWlkLWxheWVyIGNhbGxiYWNrCisJCS8vIHJvdXRpbmUKKwkJbWVnYXJhaWRfbWJveF9zeW5jX3NjYihhZGFwdGVyLCBzY2IpOworCisJCS8vIHJlbW92ZSBmcm9tIGxvY2FsIGNsaXN0CisJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CisKKwkJLy8gcHV0IGJhY2sgaW4gZnJlZSBsaXN0CisJCW1lZ2FyYWlkX2RlYWxsb2Nfc2NiKGFkYXB0ZXIsIHNjYik7CisKKwkJLy8gc2VuZCB0aGUgc2NzaSBwYWNrZXQgYmFjayB0byBrZXJuZWwKKwkJc3Bpbl9sb2NrKGFkYXB0ZXItPmhvc3RfbG9jayk7CisJCXNjcC0+c2NzaV9kb25lKHNjcCk7CisJCXNwaW5fdW5sb2NrKGFkYXB0ZXItPmhvc3RfbG9jayk7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfYWJvcnRfaGFuZGxlciAtIGFib3J0IHRoZSBzY3NpIGNvbW1hbmQKKyAqIEBzY3AJCTogY29tbWFuZCB0byBiZSBhYm9ydGVkCisgKgorICogQWJvcnQgYSBwcmV2aW91cyBTQ1NJIHJlcXVlc3QuIE9ubHkgY29tbWFuZHMgb24gdGhlIHBlbmRpbmcgbGlzdCBjYW4gYmUKKyAqIGFib3J0ZWQuIEFsbCB0aGUgY29tbWFuZHMgaXNzdWVkIHRvIHRoZSBGL1cgbXVzdCBjb21wbGV0ZS4KKyAqKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2Fib3J0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NwKQoreworCWFkYXB0ZXJfdAkJKmFkYXB0ZXI7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldjsKKwlzY2JfdAkJCSpzY2I7CisJc2NiX3QJCQkqdG1wOworCWludAkJCWZvdW5kOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCWk7CisKKworCWFkYXB0ZXIJCT0gU0NQMkFEQVBURVIoc2NwKTsKKwlyYWlkX2Rldgk9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKworCWFzc2VydF9zcGluX2xvY2tlZChhZGFwdGVyLT5ob3N0X2xvY2spOworCisJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJIm1lZ2FyYWlkOiBhYm9ydGluZy0lbGQgY21kPSV4IDxjPSVkIHQ9JWQgbD0lZD5cbiIsCisJCXNjcC0+c2VyaWFsX251bWJlciwgc2NwLT5jbW5kWzBdLCBTQ1AyQ0hBTk5FTChzY3ApLAorCQlTQ1AyVEFSR0VUKHNjcCksIFNDUDJMVU4oc2NwKSkpOworCisJLy8gSWYgRlcgaGFzIHN0b3BwZWQgcmVzcG9uZGluZywgc2ltcGx5IHJldHVybiBmYWlsdXJlCisJaWYgKHJhaWRfZGV2LT5od19lcnJvcikgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkibWVnYXJhaWQ6IGh3IGVycm9yLCBub3QgYWJvcnRpbmdcbiIpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvLyBUaGVyZSBtaWdodCBhIHJhY2UgaGVyZSwgd2hlcmUgdGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCBieSB0aGUKKwkvLyBmaXJtd2FyZSBhbmQgbm93IGl0IGlzIG9uIHRoZSBjb21wbGV0ZWQgbGlzdC4gQmVmb3JlIHdlIGNvdWxkCisJLy8gY29tcGxldGUgdGhlIGNvbW1hbmQgdG8gdGhlIGtlcm5lbCBpbiBkcGMsIHRoZSBhYm9ydCBjYW1lLgorCS8vIEZpbmQgb3V0IGlmIHRoaXMgaXMgdGhlIGNhc2UgdG8gYXZvaWQgdGhlIHJhY2UuCisJc2NiID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxc2F2ZShDT01QTEVURURfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNjYiwgdG1wLCAmYWRhcHRlci0+Y29tcGxldGVkX2xpc3QsIGxpc3QpIHsKKworCQlpZiAoc2NiLT5zY3AgPT0gc2NwKSB7CS8vIEZvdW5kIGNvbW1hbmQKKworCQkJbGlzdF9kZWxfaW5pdCgmc2NiLT5saXN0KTsJLy8gZnJvbSBjb21wbGV0ZWQgbGlzdAorCisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiAlbGQ6JWRbJWQ6JWRdLCBhYm9ydCBmcm9tIGNvbXBsZXRlZCBsaXN0XG4iLAorCQkJCXNjcC0+c2VyaWFsX251bWJlciwgc2NiLT5zbm8sCisJCQkJc2NiLT5kZXZfY2hhbm5lbCwgc2NiLT5kZXZfdGFyZ2V0KSk7CisKKwkJCXNjcC0+cmVzdWx0ID0gKERJRF9BQk9SVCA8PCAxNik7CisJCQlzY3AtPnNjc2lfZG9uZShzY3ApOworCisJCQltZWdhcmFpZF9kZWFsbG9jX3NjYihhZGFwdGVyLCBzY2IpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENPTVBMRVRFRF9MSVNUX0xPQ0soYWRhcHRlciksCisJCQkJZmxhZ3MpOworCisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKENPTVBMRVRFRF9MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCisJLy8gRmluZCBvdXQgaWYgdGhpcyBjb21tYW5kIGlzIHN0aWxsIG9uIHRoZSBwZW5kaW5nIGxpc3QuIElmIGl0IGlzIGFuZAorCS8vIHdhcyBuZXZlciBpc3N1ZWQsIGFib3J0IGFuZCByZXR1cm4gc3VjY2Vzcy4gSWYgdGhlIGNvbW1hbmQgaXMgb3duZWQKKwkvLyBieSB0aGUgZmlybXdhcmUsIHdlIG11c3Qgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgYnkgdGhlIEZXLgorCXNwaW5fbG9ja19pcnFzYXZlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNjYiwgdG1wLCAmYWRhcHRlci0+cGVuZF9saXN0LCBsaXN0KSB7CisKKwkJaWYgKHNjYi0+c2NwID09IHNjcCkgewkvLyBGb3VuZCBjb21tYW5kCisKKwkJCWxpc3RfZGVsX2luaXQoJnNjYi0+bGlzdCk7CS8vIGZyb20gcGVuZGluZyBsaXN0CisKKwkJCUFTU0VSVCghKHNjYi0+c3RhdGUgJiBTQ0JfSVNTVUVEKSk7CisKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkIGFib3J0OiAlbGRbJWQ6JWRdLCBkcml2ZXIgb3duZXJcbiIsCisJCQkJc2NwLT5zZXJpYWxfbnVtYmVyLCBzY2ItPmRldl9jaGFubmVsLAorCQkJCXNjYi0+ZGV2X3RhcmdldCkpOworCisJCQlzY3AtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOworCQkJc2NwLT5zY3NpX2RvbmUoc2NwKTsKKworCQkJbWVnYXJhaWRfZGVhbGxvY19zY2IoYWRhcHRlciwgc2NiKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShQRU5ESU5HX0xJU1RfTE9DSyhhZGFwdGVyKSwKKwkJCQlmbGFncyk7CisKKwkJCXJldHVybiBTVUNDRVNTOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKworCisJLy8gQ2hlY2sgZG8gd2UgZXZlbiBvd24gdGhpcyBjb21tYW5kLCBpbiB3aGljaCBjYXNlIHRoaXMgd291bGQgYmUKKwkvLyBvd25lZCBieSB0aGUgZmlybXdhcmUuIFRoZSBvbmx5IHdheSB0byBsb2NhdGUgdGhlIEZXIHNjYiBpcyB0bworCS8vIHRyYXZlcnNlIHRocm91Z2ggdGhlIGxpc3Qgb2YgYWxsIFNDQiwgc2luY2UgZHJpdmVyIGRvZXMgbm90CisJLy8gbWFpbnRhaW4gdGhlc2UgU0NCcyBvbiBhbnkgbGlzdAorCWZvdW5kID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfU0NTSV9DTURTOyBpKyspIHsKKwkJc2NiID0gYWRhcHRlci0+a3NjYl9saXN0ICsgaTsKKworCQlpZiAoc2NiLT5zY3AgPT0gc2NwKSB7CisKKwkJCWZvdW5kID0gMTsKKworCQkJaWYgKCEoc2NiLT5zdGF0ZSAmIFNDQl9JU1NVRUQpKSB7CisJCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQgYWJvcnQ6ICVsZCVkWyVkOiVkXSwgaW52YWxpZCBzdGF0ZVxuIiwKKwkJCQlzY3AtPnNlcmlhbF9udW1iZXIsIHNjYi0+c25vLCBzY2ItPmRldl9jaGFubmVsLAorCQkJCXNjYi0+ZGV2X3RhcmdldCkpOworCQkJCUJVRygpOworCQkJfQorCQkJZWxzZSB7CisJCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCQkibWVnYXJhaWQgYWJvcnQ6ICVsZDolZFslZDolZF0sIGZ3IG93bmVyXG4iLAorCQkJCXNjcC0+c2VyaWFsX251bWJlciwgc2NiLT5zbm8sIHNjYi0+ZGV2X2NoYW5uZWwsCisJCQkJc2NiLT5kZXZfdGFyZ2V0KSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgYWJvcnQ6IHNjc2kgY21kOiVsZCwgZG8gbm93IG93blxuIiwKKwkJCXNjcC0+c2VyaWFsX251bWJlcikpOworCisJCS8vIEZJWE1FOiBTaG91bGQgdGhlcmUgYmUgYSBjYWxsYmFjayBmb3IgdGhpcyBjb21tYW5kPworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwkvLyBXZSBjYW5ub3QgYWN0dWFsbHkgYWJvcnQgYSBjb21tYW5kIG93bmVkIGJ5IGZpcm13YXJlLCByZXR1cm4KKwkvLyBmYWlsdXJlIGFuZCB3YWl0IGZvciByZXNldC4gSW4gaG9zdCByZXNldCBoYW5kbGVyLCB3ZSB3aWxsIGZpbmQgb3V0CisJLy8gaWYgdGhlIEhCQSBpcyBzdGlsbCBsaXZlCisJcmV0dXJuIEZBSUxFRDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX3Jlc2V0X2hhbmRsZXIgLSBkZXZpY2UgcmVzZXQgaGFkbGVyIGZvciBtYWlsYm94IGJhc2VkIGRyaXZlcgorICogQHNjcAkJOiByZWZlcmVuY2UgY29tbWFuZAorICoKKyAqIFJlc2V0IGhhbmRsZXIgZm9yIHRoZSBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXIuIEZpcnN0IHRyeSB0byBmaW5kIG91dCBpZgorICogdGhlIEZXIGlzIHN0aWxsIGxpdmUsIGluIHdoaWNoIGNhc2UgdGhlIG91dHN0YW5kaW5nIGNvbW1hbmRzIGNvdW50ZXIgbXV0IGdvCisgKiBkb3duIHRvIDAuIElmIHRoYXQgaGFwcGVucywgYWxzbyBpc3N1ZSB0aGUgcmVzZXJ2YXRpb24gcmVzZXQgY29tbWFuZCB0bworICogcmVsaW5xdWlzaCAocG9zc2libGUpIHJlc2VydmF0aW9ucyBvbiB0aGUgbG9naWNhbCBkcml2ZXMgY29ubmVjdGVkIHRvIHRoaXMKKyAqIGhvc3QKKyAqKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NwKQoreworCWFkYXB0ZXJfdAkqYWRhcHRlcjsKKwlzY2JfdAkJKnNjYjsKKwlzY2JfdAkJKnRtcDsKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1aW50OF90CQlyYXdfbWJveFtzaXplb2YobWJveF90KV07CisJaW50CQlydmFsOworCWludAkJcmVjb3Zlcnlfd2luZG93OworCWludAkJcmVjb3ZlcmluZzsKKwlpbnQJCWk7CisKKwlhZGFwdGVyCQk9IFNDUDJBREFQVEVSKHNjcCk7CisJcmFpZF9kZXYJPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoYWRhcHRlci0+aG9zdF9sb2NrKTsKKworCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HICJtZWdhcmFpZDogcmVzZXRpbmcgdGhlIGhvc3QuLi5cbiIpKTsKKworCS8vIHJldHVybiBmYWlsdXJlIGlmIGFkYXB0ZXIgaXMgbm90IHJlc3BvbmRpbmcKKwlpZiAocmFpZF9kZXYtPmh3X2Vycm9yKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKKwkJCSJtZWdhcmFpZDogaHcgZXJyb3IsIGNhbm5vdCByZXNldFxuIikpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCisJLy8gVW5kZXIgZXhjZXB0aW9uYWwgY29uZGl0aW9ucywgRlcgY2FuIHRha2UgdXAgdG8gMyBtaW51dGVzIHRvCisJLy8gY29tcGxldGUgY29tbWFuZCBwcm9jZXNzaW5nLiBXYWl0IGZvciBhZGRpdGlvbmFsIDIgbWludXRlcyBmb3IgdGhlCisJLy8gcGVuZGluZyBjb21tYW5kcyBjb3VudGVyIHRvIGdvIGRvd24gdG8gMC4gSWYgaXQgZG9lc24ndCwgbGV0IHRoZQorCS8vIGNvbnRyb2xsZXIgYmUgbWFya2VkIG9mZmxpbmUKKwkvLyBBbHNvLCByZXNldCBhbGwgdGhlIGNvbW1hbmRzIGN1cnJlbnRseSBvd25lZCBieSB0aGUgZHJpdmVyCisJc3Bpbl9sb2NrX2lycXNhdmUoUEVORElOR19MSVNUX0xPQ0soYWRhcHRlciksIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2NiLCB0bXAsICZhZGFwdGVyLT5wZW5kX2xpc3QsIGxpc3QpIHsKKworCQlsaXN0X2RlbF9pbml0KCZzY2ItPmxpc3QpOwkvLyBmcm9tIHBlbmRpbmcgbGlzdAorCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQ6ICVsZDolZFslZDolZF0sIHJlc2V0IGZyb20gcGVuZGluZyBsaXN0XG4iLAorCQkJCXNjcC0+c2VyaWFsX251bWJlciwgc2NiLT5zbm8sCisJCQkJc2NiLT5kZXZfY2hhbm5lbCwgc2NiLT5kZXZfdGFyZ2V0KSk7CisKKwkJc2NwLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKKwkJc2NwLT5zY3NpX2RvbmUoc2NwKTsKKworCQltZWdhcmFpZF9kZWFsbG9jX3NjYihhZGFwdGVyLCBzY2IpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKFBFTkRJTkdfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwlpZiAoYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kcykgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkibWVnYXJhaWQ6ICVkIG91dHN0YW5kaW5nIGNvbW1hbmRzLiBNYXggd2FpdCAlZCBzZWNcbiIsCisJCQlhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzLCBNQk9YX1JFU0VUX1dBSVQpKTsKKwl9CisKKwlzcGluX3VubG9jayhhZGFwdGVyLT5ob3N0X2xvY2spOworCisJcmVjb3Zlcnlfd2luZG93ID0gTUJPWF9SRVNFVF9XQUlUICsgTUJPWF9SRVNFVF9FWFRfV0FJVDsKKworCXJlY292ZXJpbmcgPSBhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzOworCisJZm9yIChpID0gMDsgaSA8IHJlY292ZXJ5X3dpbmRvdyAmJiBhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzOyBpKyspIHsKKworCQltZWdhcmFpZF9hY2tfc2VxdWVuY2UoYWRhcHRlcik7CisKKwkJLy8gcHJpbnQgYSBtZXNzYWdlIG9uY2UgZXZlcnkgNSBzZWNvbmRzIG9ubHkKKwkJaWYgKCEoaSAlIDUpKSB7CisJCQljb25fbG9nKENMX0FOTiwgKAorCQkJIm1lZ2FyYWlkIG1ib3g6IFdhaXQgZm9yICVkIGNvbW1hbmRzIHRvIGNvbXBsZXRlOiVkXG4iLAorCQkJCWFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHMsCisJCQkJTUJPWF9SRVNFVF9XQUlUIC0gaSkpOworCQl9CisKKwkJLy8gYmFpbG91dCBpZiBubyByZWNvdmVyeSBoYXBwZW5kZWQgaW4gcmVzZXQgdGltZQorCQlpZiAoKGkgPT0gTUJPWF9SRVNFVF9XQUlUKSAmJgorCQkJKHJlY292ZXJpbmcgPT0gYWRhcHRlci0+b3V0c3RhbmRpbmdfY21kcykpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNsZWVwKDEwMDApOworCX0KKworCXNwaW5fbG9jayhhZGFwdGVyLT5ob3N0X2xvY2spOworCisJLy8gSWYgc3RpbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMsIGJhaWwgb3V0CisJaWYgKGFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHMpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZCBtYm94OiBjcml0aWNhbCBoYXJkd2FyZSBlcnJvciFcbiIpKTsKKworCQlyYWlkX2Rldi0+aHdfZXJyb3IgPSAxOworCisJCXJldHVybiBGQUlMRUQ7CisJfQorCWVsc2UgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCSJtZWdhcmFpZCBtYm94OiByZXNldCBzZXF1ZW5jZSBjb21wbGV0ZWQgc3VjZXNzZnVsbHlcbiIpKTsKKwl9CisKKworCS8vIElmIHRoZSBjb250cm9sbGVyIHN1cHBvcnRzIGNsdXN0ZXJpbmcsIHJlc2V0IHJlc2VydmF0aW9ucworCWlmICghYWRhcHRlci0+aGEpIHJldHVybiBTVUNDRVNTOworCisJLy8gY2xlYXIgcmVzZXJ2YXRpb25zIGlmIGFueQorCXJhd19tYm94WzBdID0gQ0xVU1RFUl9DTUQ7CisJcmF3X21ib3hbMl0gPSBSRVNFVF9SRVNFUlZBVElPTlM7CisKKwlydmFsID0gU1VDQ0VTUzsKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kX2Zhc3QoYWRhcHRlciwgcmF3X21ib3gpID09IDApIHsKKwkJY29uX2xvZyhDTF9BTk4sCisJCQkoS0VSTl9JTkZPICJtZWdhcmFpZDogcmVzZXJ2YXRpb24gcmVzZXRcbiIpKTsKKwl9CisJZWxzZSB7CisJCXJ2YWwgPSBGQUlMRUQ7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkOiByZXNlcnZhdGlvbiByZXNldCBmYWlsZWRcbiIpKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisvKgorICogU1RBUlQ6IGludGVybmFsIGNvbW1hbmRzIGxpYnJhcnkKKyAqCisgKiBUaGlzIHNlY3Rpb24gb2YgdGhlIGRyaXZlciBoYXMgdGhlIGNvbW1vbiByb3V0aW5lIHVzZWQgYnkgdGhlIGRyaXZlciBhbmQKKyAqIGFsc28gaGFzIGFsbCB0aGUgRlcgcm91dGluZXMKKyAqLworCisvKioKKyAqIG1ib3hfcG9zdF9zeW5jX2NtZCgpIC0gYmxvY2tpbmcgY29tbWFuZCB0byB0aGUgbWFpbGJveCBiYXNlZCBjb250cm9sbGVycworICogQGFkYXB0ZXIJLSBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICogQHJhd19tYm94CS0gdGhlIG1haWxib3gKKyAqCisgKiBJc3N1ZSBhIHNjYiBpbiBzeW5jaHJvbm91cyBhbmQgbm9uLWludGVycnVwdCBtb2RlIGZvciBtYWlsYm94IGJhc2VkCisgKiBjb250cm9sbGVycworICovCitzdGF0aWMgaW50CittYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlcl90ICphZGFwdGVyLCB1aW50OF90IHJhd19tYm94W10pCit7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCW1ib3g2NF90CSptYm94NjQ7CisJbWJveF90CQkqbWJveDsKKwl1aW50OF90CQlzdGF0dXM7CisJaW50CQlpOworCisKKwltYm94NjQJPSByYWlkX2Rldi0+bWJveDY0OworCW1ib3gJPSByYWlkX2Rldi0+bWJveDsKKworCS8qCisJICogV2FpdCB1bnRpbCBtYWlsYm94IGlzIGZyZWUKKwkgKi8KKwlpZiAobWVnYXJhaWRfYnVzeXdhaXRfbWJveChyYWlkX2RldikgIT0gMCkKKwkJZ290byBibG9ja2VkX21haWxib3g7CisKKwkvKgorCSAqIENvcHkgbWFpbGJveCBkYXRhIGludG8gaG9zdCBzdHJ1Y3R1cmUKKwkgKi8KKwltZW1jcHkoKGNhZGRyX3QpbWJveCwgKGNhZGRyX3QpcmF3X21ib3gsIDE2KTsKKwltYm94LT5jbWRpZAkJPSAweEZFOworCW1ib3gtPmJ1c3kJCT0gMTsKKwltYm94LT5wb2xsCQk9IDA7CisJbWJveC0+YWNrCQk9IDA7CisJbWJveC0+bnVtc3RhdHVzCQk9IDB4RkY7CisJbWJveC0+c3RhdHVzCQk9IDB4RkY7CisKKwl3bWIoKTsKKwlXUklORE9PUihyYWlkX2RldiwgcmFpZF9kZXYtPm1ib3hfZG1hIHwgMHgxKTsKKworCS8vIHdhaXQgZm9yIG1heGltdW0gMSBzZWNvbmQgZm9yIHN0YXR1cyB0byBwb3N0LiBJZiB0aGUgc3RhdHVzIGlzIG5vdAorCS8vIGF2YWlsYWJsZSB3aXRoaW4gMSBzZWNvbmQsIGFzc3VtZSBGVyBpcyBpbml0aWFsaXppbmcgYW5kIHdhaXQKKwkvLyBmb3IgYW4gZXh0ZW5kZWQgYW1vdW50IG9mIHRpbWUKKwlpZiAobWJveC0+bnVtc3RhdHVzID09IDB4RkYpIHsJLy8gc3RhdHVzIG5vdCB5ZXQgYXZhaWxhYmxlCisJCXVkZWxheSgyNSk7OworCisJCWZvciAoaSA9IDA7IG1ib3gtPm51bXN0YXR1cyA9PSAweEZGICYmIGkgPCAxMDAwOyBpKyspIHsKKwkJCXJtYigpOworCQkJbXNsZWVwKDEpOworCQl9CisKKworCQlpZiAoaSA9PSAxMDAwKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkJIm1lZ2FyYWlkIG1haWxib3g6IHdhaXQgZm9yIEZXIHRvIGJvb3QgICAgICAiKSk7CisKKwkJCWZvciAoaSA9IDA7IChtYm94LT5udW1zdGF0dXMgPT0gMHhGRikgJiYKKwkJCQkJKGkgPCBNQk9YX1JFU0VUX1dBSVQpOyBpKyspIHsKKwkJCQlybWIoKTsKKwkJCQljb25fbG9nKENMX0FOTiwgKCJcYlxiXGJcYlxiWyUwM2RdIiwKKwkJCQkJCQlNQk9YX1JFU0VUX1dBSVQgLSBpKSk7CisJCQkJbXNsZWVwKDEwMDApOworCQkJfQorCisJCQlpZiAoaSA9PSBNQk9YX1JFU0VUX1dBSVQpIHsKKworCQkJCWNvbl9sb2coQ0xfQU5OLCAoCisJCQkJIlxubWVnYXJhaWQgbWFpbGJveDogc3RhdHVzIG5vdCBhdmFpbGFibGVcbiIpKTsKKworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNvbl9sb2coQ0xfQU5OLCAoIlxiXGJcYlxiXGJbb2tdIFxuIikpOworCQl9CisJfQorCisJLy8gd2FpdCBmb3IgbWF4aW11bSAxIHNlY29uZCBmb3IgcG9sbCBzZW1hcGhvcmUKKwlpZiAobWJveC0+cG9sbCAhPSAweDc3KSB7CisJCXVkZWxheSgyNSk7CisKKwkJZm9yIChpID0gMDsgKG1ib3gtPnBvbGwgIT0gMHg3NykgJiYgKGkgPCAxMDAwKTsgaSsrKSB7CisJCQlybWIoKTsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCisJCWlmIChpID09IDEwMDApIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgbWFpbGJveDogY291bGQgbm90IGdldCBwb2xsIHNlbWFwaG9yZVxuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJV1JJTkRPT1IocmFpZF9kZXYsIHJhaWRfZGV2LT5tYm94X2RtYSB8IDB4Mik7CisJd21iKCk7CisKKwkvLyB3YWl0IGZvciBtYXhpbXVtIDEgc2Vjb25kIGZvciBhY2tub3dsZWRnZW1lbnQKKwlpZiAoUkRJTkRPT1IocmFpZF9kZXYpICYgMHgyKSB7CisJCXVkZWxheSgyNSk7CisKKwkJZm9yIChpID0gMDsgKFJESU5ET09SKHJhaWRfZGV2KSAmIDB4MikgJiYgKGkgPCAxMDAwKTsgaSsrKSB7CisJCQlybWIoKTsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCisJCWlmIChpID09IDEwMDApIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkJIm1lZ2FyYWlkIG1haWxib3g6IGNvdWxkIG5vdCBhY2tub3dsZWRnZVxuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCW1ib3gtPnBvbGwJPSAwOworCW1ib3gtPmFjawk9IDB4Nzc7CisKKwlzdGF0dXMgPSBtYm94LT5zdGF0dXM7CisKKwkvLyBpbnZhbGlkYXRlIHRoZSBjb21wbGV0ZWQgY29tbWFuZCBpZCBhcnJheS4gQWZ0ZXIgY29tbWFuZAorCS8vIGNvbXBsZXRpb24sIGZpcm13YXJlIHdvdWxkIHdyaXRlIHRoZSB2YWxpZCBpZC4KKwltYm94LT5udW1zdGF0dXMJPSAweEZGOworCW1ib3gtPnN0YXR1cwk9IDB4RkY7CisJZm9yIChpID0gMDsgaSA8IE1CT1hfTUFYX0ZJUk1XQVJFX1NUQVRVUzsgaSsrKSB7CisJCW1ib3gtPmNvbXBsZXRlZFtpXSA9IDB4RkY7CisJfQorCisJcmV0dXJuIHN0YXR1czsKKworYmxvY2tlZF9tYWlsYm94OgorCisJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkOiBibG9ja2VkIG1haWxib3hcbiIpICk7CisJcmV0dXJuIC0xOworfQorCisKKy8qKgorICogbWJveF9wb3N0X3N5bmNfY21kX2Zhc3QgLSBibG9ja2luZyBjb21tYW5kIHRvIHRoZSBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXJzCisgKiBAYWRhcHRlcgktIGNvbnRyb2xsZXIncyBzb2Z0IHN0YXRlCisgKiBAcmF3X21ib3gJLSB0aGUgbWFpbGJveAorICoKKyAqIElzc3VlIGEgc2NiIGluIHN5bmNocm9ub3VzIGFuZCBub24taW50ZXJydXB0IG1vZGUgZm9yIG1haWxib3ggYmFzZWQKKyAqIGNvbnRyb2xsZXJzLiBUaGlzIGlzIGEgZmFzdGVyIHZlcnNpb24gb2YgdGhlIHN5bmNocm9ub3VzIGNvbW1hbmQgYW5kCisgKiB0aGVyZWZvcmUgY2FuIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQtY29udGV4dCBhcyB3ZWxsCisgKi8KK3N0YXRpYyBpbnQKK21ib3hfcG9zdF9zeW5jX2NtZF9mYXN0KGFkYXB0ZXJfdCAqYWRhcHRlciwgdWludDhfdCByYXdfbWJveFtdKQoreworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwltYm94X3QJCSptYm94OworCWxvbmcJCWk7CisKKworCW1ib3gJPSByYWlkX2Rldi0+bWJveDsKKworCS8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgbWFpbGJveCBpcyBidXN5CisJaWYgKG1ib3gtPmJ1c3kpIHJldHVybiAtMTsKKworCS8vIENvcHkgbWFpbGJveCBkYXRhIGludG8gaG9zdCBzdHJ1Y3R1cmUKKwltZW1jcHkoKGNhZGRyX3QpbWJveCwgKGNhZGRyX3QpcmF3X21ib3gsIDE0KTsKKwltYm94LT5jbWRpZAkJPSAweEZFOworCW1ib3gtPmJ1c3kJCT0gMTsKKwltYm94LT5wb2xsCQk9IDA7CisJbWJveC0+YWNrCQk9IDA7CisJbWJveC0+bnVtc3RhdHVzCQk9IDB4RkY7CisJbWJveC0+c3RhdHVzCQk9IDB4RkY7CisKKwl3bWIoKTsKKwlXUklORE9PUihyYWlkX2RldiwgcmFpZF9kZXYtPm1ib3hfZG1hIHwgMHgxKTsKKworCWZvciAoaSA9IDA7IGkgPCAweEZGRkZGOyBpKyspIHsKKwkJaWYgKG1ib3gtPm51bXN0YXR1cyAhPSAweEZGKSBicmVhazsKKwl9CisKKwlpZiAoaSA9PSAweEZGRkZGKSB7CisJCS8vIFdlIG1heSBuZWVkIHRvIHJlLWNhbGlicmF0ZSB0aGUgY291bnRlcgorCQljb25fbG9nKENMX0FOTiwgKEtFUk5fQ1JJVAorCQkJIm1lZ2FyYWlkOiBmYXN0IHN5bmMgY29tbWFuZCB0aW1lZCBvdXRcbiIpKTsKKwl9CisKKwlXUklORE9PUihyYWlkX2RldiwgcmFpZF9kZXYtPm1ib3hfZG1hIHwgMHgyKTsKKwl3bWIoKTsKKworCXJldHVybiBtYm94LT5zdGF0dXM7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9idXN5d2FpdF9tYm94KCkgLSBXYWl0IHVudGlsIHRoZSBjb250cm9sbGVyJ3MgbWFpbGJveCBpcyBhdmFpbGFibGUKKyAqIEByYWlkX2RldgktIFJBSUQgZGV2aWNlIChIQkEpIHNvZnQgc3RhdGUKKyAqCisgKiB3YWl0IHVudGlsIHRoZSBjb250cm9sbGVyJ3MgbWFpbGJveCBpcyBhdmFpbGFibGUgdG8gYWNjZXB0IG1vcmUgY29tbWFuZHMuCisgKiB3YWl0IGZvciBhdCBtb3N0IDEgc2Vjb25kCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX2J1c3l3YWl0X21ib3gobXJhaWRfZGV2aWNlX3QgKnJhaWRfZGV2KQoreworCW1ib3hfdAkqbWJveCA9IHJhaWRfZGV2LT5tYm94OworCWludAlpID0gMDsKKworCWlmIChtYm94LT5idXN5KSB7CisJCXVkZWxheSgyNSk7CisJCWZvciAoaSA9IDA7IG1ib3gtPmJ1c3kgJiYgaSA8IDEwMDA7IGkrKykKKwkJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaSA8IDEwMDApIHJldHVybiAwOworCWVsc2UgcmV0dXJuIC0xOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9wcm9kdWN0X2luZm8gLSBzb21lIHN0YXRpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbGxlcgorICogQGFkYXB0ZXIJLSBvdXIgc29mdCBzdGF0ZQorICoKKyAqIGlzc3VlIGNvbW1hbmRzIHRvIHRoZSBjb250cm9sbGVyIHRvIGdyYWIgc29tZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IG91cgorICogY2FsbGVyLgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9tYm94X3Byb2R1Y3RfaW5mbyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJCSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwltYm94X3QJCQkqbWJveDsKKwl1aW50OF90CQkJcmF3X21ib3hbc2l6ZW9mKG1ib3hfdCldOworCW1yYWlkX3BpbmZvX3QJCSpwaW5mbzsKKwlkbWFfYWRkcl90CQlwaW5mb19kbWFfaDsKKwltcmFpZF9pbnF1aXJ5M190CSptcmFpZF9pbnEzOworCWludAkJCWk7CisKKworCW1lbXNldCgoY2FkZHJfdClyYXdfbWJveCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCS8qCisJICogSXNzdWUgYW4gRU5RVUlSWTMgY29tbWFuZCB0byBmaW5kIG91dCBjZXJ0YWluIGFkYXB0ZXIgcGFyYW1ldGVycywKKwkgKiBlLmcuLCBtYXggY2hhbm5lbHMsIG1heCBjb21tYW5kcyBldGMuCisJICovCisJcGluZm8gPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzaXplb2YobXJhaWRfcGluZm9fdCksCisJCQkmcGluZm9fZG1hX2gpOworCisJaWYgKHBpbmZvID09IE5VTEwpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZDogb3V0IG9mIG1lbW9yeSwgJXMgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCV9fTElORV9fKSk7CisKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocGluZm8sIDAsIHNpemVvZihtcmFpZF9waW5mb190KSk7CisKKwltYm94LT54ZmVyYWRkciA9ICh1aW50MzJfdClhZGFwdGVyLT5pYnVmX2RtYV9oOworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPmlidWYsIDAsIE1CT1hfSUJVRl9TSVpFKTsKKworCXJhd19tYm94WzBdID0gRkNfTkVXX0NPTkZJRzsKKwlyYXdfbWJveFsyXSA9IE5DX1NVQk9QX0VOUVVJUlkzOworCXJhd19tYm94WzNdID0gRU5RM19HRVRfU09MSUNJVEVEX0ZVTEw7CisKKwkvLyBJc3N1ZSB0aGUgY29tbWFuZAorCWlmIChtYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlciwgcmF3X21ib3gpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORyAibWVnYXJhaWQ6IElucXVpcnkzIGZhaWxlZFxuIikpOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKG1yYWlkX3BpbmZvX3QpLAorCQkJcGluZm8sIHBpbmZvX2RtYV9oKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHN0YXRlIG9mIGVhY2ggcGh5c2ljYWwgZHJpdmUKKwkgKiBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4gV2Ugd2lsbCBleHBvc2UgYWxsIHRoZSBkaXNrcworCSAqIHdoaWNoIGFyZSBub3QgcGFydCBvZiBSQUlECisJICovCisJbXJhaWRfaW5xMyA9IChtcmFpZF9pbnF1aXJ5M190ICopYWRhcHRlci0+aWJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgTUJPWF9NQVhfUEhZU0lDQUxfRFJJVkVTOyBpKyspIHsKKwkJcmFpZF9kZXYtPnBkcnZfc3RhdGVbaV0gPSBtcmFpZF9pbnEzLT5wZHJ2X3N0YXRlW2ldOworCX0KKworCS8qCisJICogR2V0IHByb2R1Y3QgaW5mbyBmb3IgaW5mb3JtYXRpb24gbGlrZSBudW1iZXIgb2YgY2hhbm5lbHMsCisJICogbWF4aW11bSBjb21tYW5kcyBzdXBwb3J0ZWQuCisJICovCisJbWVtc2V0KChjYWRkcl90KXJhd19tYm94LCAwLCBzaXplb2YocmF3X21ib3gpKTsKKwltYm94LT54ZmVyYWRkciA9ICh1aW50MzJfdClwaW5mb19kbWFfaDsKKworCXJhd19tYm94WzBdID0gRkNfTkVXX0NPTkZJRzsKKwlyYXdfbWJveFsyXSA9IE5DX1NVQk9QX1BST0RVQ1RfSU5GTzsKKworCWlmIChtYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlciwgcmF3X21ib3gpICE9IDApIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBwcm9kdWN0IGluZm8gZmFpbGVkXG4iKSk7CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBzaXplb2YobXJhaWRfcGluZm9fdCksCisJCQlwaW5mbywgcGluZm9fZG1hX2gpOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFNldHVwIHNvbWUgcGFyYW1ldGVycyBmb3IgaG9zdCwgYXMgcmVxdWlyZWQgYnkgb3VyIGNhbGxlcgorCSAqLworCWFkYXB0ZXItPm1heF9jaGFubmVsID0gcGluZm8tPm5jaGFubmVsczsKKworCS8qCisJICogd2Ugd2lsbCBleHBvcnQgYWxsIHRoZSBsb2dpY2FsIGRyaXZlcyBvbiBhIHNpbmdsZSBjaGFubmVsLgorCSAqIEFkZCAxIHNpbmNlIGlucXVpcmVzIGRvIG5vdCBjb21lIGZvciBpbml0aXRvciBJRAorCSAqLworCWFkYXB0ZXItPm1heF90YXJnZXQJPSBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRCArIDE7CisJYWRhcHRlci0+bWF4X2x1bgk9IDg7CS8vIHVwIHRvIDggTFVOcyBmb3Igbm9uLWRpc2sgZGV2aWNlcworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGhlIG1heGltdW0gb3V0c3RhbmRpbmcgY29tbWFuZHMgZm9yIHRoZSBzY3NpLWxheWVyCisJICovCisJYWRhcHRlci0+bWF4X2NtZHMJPSBNQk9YX01BWF9TQ1NJX0NNRFM7CisKKwltZW1zZXQoYWRhcHRlci0+ZndfdmVyc2lvbiwgMCwgVkVSU0lPTl9TSVpFKTsKKwltZW1zZXQoYWRhcHRlci0+Ymlvc192ZXJzaW9uLCAwLCBWRVJTSU9OX1NJWkUpOworCisJbWVtY3B5KGFkYXB0ZXItPmZ3X3ZlcnNpb24sIHBpbmZvLT5md192ZXJzaW9uLCA0KTsKKwlhZGFwdGVyLT5md192ZXJzaW9uWzRdID0gMDsKKworCW1lbWNweShhZGFwdGVyLT5iaW9zX3ZlcnNpb24sIHBpbmZvLT5iaW9zX3ZlcnNpb24sIDQpOworCWFkYXB0ZXItPmJpb3NfdmVyc2lvbls0XSA9IDA7CisKKwljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCSJtZWdhcmFpZDogZncgdmVyc2lvbjpbJXNdIGJpb3MgdmVyc2lvbjpbJXNdXG4iLAorCQlhZGFwdGVyLT5md192ZXJzaW9uLCBhZGFwdGVyLT5iaW9zX3ZlcnNpb24pKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgc2l6ZW9mKG1yYWlkX3BpbmZvX3QpLCBwaW5mbywKKwkJCXBpbmZvX2RtYV9oKTsKKworCXJldHVybiAwOworfQorCisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X2V4dGVuZGVkX2NkYiAtIGNoZWNrIGZvciBzdXBwb3J0IGZvciBleHRlbmRlZCBDREJzCisgKiBAYWRhcHRlcgktIHNvZnQgc3RhdGUgZm9yIHRoZSBjb250cm9sbGVyCisgKgorICogdGhpcyByb3V0aW5lIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaW4gcXVlc3Rpb24gc3VwcG9ydHMgZXh0ZW5kZWQKKyAqICggPiAxMCBieXRlcyApIENEQnMKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfbWJveF9leHRlbmRlZF9jZGIoYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1ib3hfdAkJKm1ib3g7CisJdWludDhfdAkJcmF3X21ib3hbc2l6ZW9mKG1ib3hfdCldOworCWludAkJcnZhbDsKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoKGNhZGRyX3QpcmF3X21ib3gsIDAsIHNpemVvZihyYXdfbWJveCkpOworCW1ib3gtPnhmZXJhZGRyCT0gKHVpbnQzMl90KWFkYXB0ZXItPmlidWZfZG1hX2g7CisKKwltZW1zZXQoKHZvaWQgKilhZGFwdGVyLT5pYnVmLCAwLCBNQk9YX0lCVUZfU0laRSk7CisKKwlyYXdfbWJveFswXSA9IE1BSU5fTUlTQ19PUENPREU7CisJcmF3X21ib3hbMl0gPSBTVVBQT1JUX0VYVF9DREI7CisKKwkvKgorCSAqIElzc3VlIHRoZSBjb21tYW5kCisJICovCisJcnZhbCA9IDA7CisJaWYgKG1ib3hfcG9zdF9zeW5jX2NtZChhZGFwdGVyLCByYXdfbWJveCkgIT0gMCkgeworCQlydmFsID0gLTE7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X3N1cHBvcnRfaGEgLSBEbyB3ZSBzdXBwb3J0IGNsdXN0ZXJpbmcKKyAqIEBhZGFwdGVyCS0gc29mdCBzdGF0ZSBmb3IgdGhlIGNvbnRyb2xsZXIKKyAqIEBpbml0X2lkCS0gSUQgb2YgdGhlIGluaXRpYXRvcgorICoKKyAqIERldGVybWluZSBpZiB0aGUgZmlybXdhcmUgc3VwcG9ydHMgY2x1c3RlcmluZyBhbmQgdGhlIElEIG9mIHRoZSBpbml0aWF0b3IuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX21ib3hfc3VwcG9ydF9oYShhZGFwdGVyX3QgKmFkYXB0ZXIsIHVpbnQxNl90ICppbml0X2lkKQoreworCW1ib3hfdAkJKm1ib3g7CisJdWludDhfdAkJcmF3X21ib3hbc2l6ZW9mKG1ib3hfdCldOworCWludAkJcnZhbDsKKworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgoY2FkZHJfdClyYXdfbWJveCwgMCwgc2l6ZW9mKHJhd19tYm94KSk7CisKKwltYm94LT54ZmVyYWRkciA9ICh1aW50MzJfdClhZGFwdGVyLT5pYnVmX2RtYV9oOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+aWJ1ZiwgMCwgTUJPWF9JQlVGX1NJWkUpOworCisJcmF3X21ib3hbMF0gPSBHRVRfVEFSR0VUX0lEOworCisJLy8gSXNzdWUgdGhlIGNvbW1hbmQKKwkqaW5pdF9pZCA9IDc7CisJcnZhbCA9ICAtMTsKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSA9PSAwKSB7CisKKwkJKmluaXRfaWQgPSAqKHVpbnQ4X3QgKilhZGFwdGVyLT5pYnVmOworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPCisJCQkibWVnYXJhaWQ6IGNsdXN0ZXIgZmlybXdhcmUsIGluaXRpYXRvciBJRDogJWRcbiIsCisJCQkqaW5pdF9pZCkpOworCisJCXJ2YWwgPSAgMDsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfc3VwcG9ydF9yYW5kb21fZGVsIC0gRG8gd2Ugc3VwcG9ydCByYW5kb20gZGVsZXRpb24KKyAqIEBhZGFwdGVyCS0gc29mdCBzdGF0ZSBmb3IgdGhlIGNvbnRyb2xsZXIKKyAqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGZpcm13YXJlIHN1cHBvcnRzIHJhbmRvbSBkZWxldGlvbgorICogUmV0dXJuOgkxIGlzIG9wZXJhdGlvbiBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX21ib3hfc3VwcG9ydF9yYW5kb21fZGVsKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltYm94X3QJCSptYm94OworCXVpbnQ4X3QJCXJhd19tYm94W3NpemVvZihtYm94X3QpXTsKKwlpbnQJCXJ2YWw7CisKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoKGNhZGRyX3QpcmF3X21ib3gsIDAsIHNpemVvZihtYm94X3QpKTsKKworCXJhd19tYm94WzBdID0gRkNfREVMX0xPR0RSVjsKKwlyYXdfbWJveFsyXSA9IE9QX1NVUF9ERUxfTE9HRFJWOworCisJLy8gSXNzdWUgdGhlIGNvbW1hbmQKKwlydmFsID0gMDsKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSA9PSAwKSB7CisKKwkJY29uX2xvZyhDTF9ETEVWRUwxLCAoIm1lZ2FyYWlkOiBzdXBwb3J0cyByYW5kb20gZGVsZXRpb25cbiIpKTsKKworCQlydmFsID0gIDE7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X2dldF9tYXhfc2cgLSBtYXhpbXVtIHNnIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGUgZmlybXdhcmUKKyAqIEBhZGFwdGVyCS0gc29mdCBzdGF0ZSBmb3IgdGhlIGNvbnRyb2xsZXIKKyAqCisgKiBGaW5kIG91dCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgc3VwcG9ydGVkIGJ5IHRoZQorICogZmlybXdhcmUKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfbWJveF9nZXRfbWF4X3NnKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltYm94X3QJCSptYm94OworCXVpbnQ4X3QJCXJhd19tYm94W3NpemVvZihtYm94X3QpXTsKKwlpbnQJCW5zZzsKKworCisJbWJveCA9IChtYm94X3QgKilyYXdfbWJveDsKKworCW1lbXNldCgoY2FkZHJfdClyYXdfbWJveCwgMCwgc2l6ZW9mKG1ib3hfdCkpOworCisJbWJveC0+eGZlcmFkZHIgPSAodWludDMyX3QpYWRhcHRlci0+aWJ1Zl9kbWFfaDsKKworCW1lbXNldCgodm9pZCAqKWFkYXB0ZXItPmlidWYsIDAsIE1CT1hfSUJVRl9TSVpFKTsKKworCXJhd19tYm94WzBdID0gTUFJTl9NSVNDX09QQ09ERTsKKwlyYXdfbWJveFsyXSA9IEdFVF9NQVhfU0dfU1VQUE9SVDsKKworCS8vIElzc3VlIHRoZSBjb21tYW5kCisJaWYgKG1ib3hfcG9zdF9zeW5jX2NtZChhZGFwdGVyLCByYXdfbWJveCkgPT0gMCkgeworCQluc2cgPSAgKih1aW50OF90ICopYWRhcHRlci0+aWJ1ZjsKKwl9CisJZWxzZSB7CisJCW5zZyA9ICBNQk9YX0RFRkFVTFRfU0dfU0laRTsKKwl9CisKKwlpZiAobnNnID4gTUJPWF9NQVhfU0dfU0laRSkgbnNnID0gTUJPWF9NQVhfU0dfU0laRTsKKworCXJldHVybiBuc2c7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X2VudW1fcmFpZF9zY3NpIC0gZW51bWVyYXRlIHRoZSBSQUlEIGFuZCBTQ1NJIGNoYW5uZWxzCisgKiBAYWRhcHRlcgktIHNvZnQgc3RhdGUgZm9yIHRoZSBjb250cm9sbGVyCisgKgorICogRW51bWVyYXRlIHRoZSBSQUlEIGFuZCBTQ1NJIGNoYW5uZWxzIGZvciBST01CIHBsYXRvZm9ybXMgc28gdGhhdCBjaGFubmVscworICogY2FuIGJlIGV4cG9ydGVkIGFzIHJlZ3VsYXIgU0NTSSBjaGFubmVscworICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9lbnVtX3JhaWRfc2NzaShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCW1ib3hfdAkJKm1ib3g7CisJdWludDhfdAkJcmF3X21ib3hbc2l6ZW9mKG1ib3hfdCldOworCisKKwltYm94ID0gKG1ib3hfdCAqKXJhd19tYm94OworCisJbWVtc2V0KChjYWRkcl90KXJhd19tYm94LCAwLCBzaXplb2YobWJveF90KSk7CisKKwltYm94LT54ZmVyYWRkciA9ICh1aW50MzJfdClhZGFwdGVyLT5pYnVmX2RtYV9oOworCisJbWVtc2V0KCh2b2lkICopYWRhcHRlci0+aWJ1ZiwgMCwgTUJPWF9JQlVGX1NJWkUpOworCisJcmF3X21ib3hbMF0gPSBDSE5MX0NMQVNTOworCXJhd19tYm94WzJdID0gR0VUX0NITkxfQ0xBU1M7CisKKwkvLyBJc3N1ZSB0aGUgY29tbWFuZC4gSWYgdGhlIGNvbW1hbmQgZmFpbHMsIGFsbCBjaGFubmVscyBhcmUgUkFJRAorCS8vIGNoYW5uZWxzCisJcmFpZF9kZXYtPmNoYW5uZWxfY2xhc3MgPSAweEZGOworCWlmIChtYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlciwgcmF3X21ib3gpID09IDApIHsKKwkJcmFpZF9kZXYtPmNoYW5uZWxfY2xhc3MgPSAgKih1aW50OF90ICopYWRhcHRlci0+aWJ1ZjsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X2ZsdXNoX2NhY2hlIC0gZmx1c2ggYWRhcHRlciBhbmQgZGlza3MgY2FjaGUKKyAqIEBwYXJhbSBhZGFwdGVyCTogc29mdCBzdGF0ZSBmb3IgdGhlIGNvbnRyb2xsZXIKKyAqCisgKiBGbHVzaCBhZGFwdGVyIGNhY2hlIGZvbGxvd2VkIGJ5IGRpc2tzIGNhY2hlCisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9tYm94X2ZsdXNoX2NhY2hlKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltYm94X3QJKm1ib3g7CisJdWludDhfdAlyYXdfbWJveFtzaXplb2YobWJveF90KV07CisKKworCW1ib3ggPSAobWJveF90ICopcmF3X21ib3g7CisKKwltZW1zZXQoKGNhZGRyX3QpcmF3X21ib3gsIDAsIHNpemVvZihtYm94X3QpKTsKKworCXJhd19tYm94WzBdID0gRkxVU0hfQURBUFRFUjsKKworCWlmIChtYm94X3Bvc3Rfc3luY19jbWQoYWRhcHRlciwgcmF3X21ib3gpICE9IDApIHsKKwkJY29uX2xvZyhDTF9BTk4sICgibWVnYXJhaWQ6IGZsdXNoIGFkYXB0ZXIgZmFpbGVkXG4iKSk7CisJfQorCisJcmF3X21ib3hbMF0gPSBGTFVTSF9TWVNURU07CisKKwlpZiAobWJveF9wb3N0X3N5bmNfY21kKGFkYXB0ZXIsIHJhd19tYm94KSAhPSAwKSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoIm1lZ2FyYWlkOiBmbHVzaCBkaXNrcyBjYWNoZSBmYWlsZWRcbiIpKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9tYm94X2Rpc3BsYXlfc2NiIC0gZGlzcGxheSBTQ0IgaW5mb3JtYXRpb24sIG1vc3RseSBkZWJ1ZyBwdXJwb3NlcworICogQHBhcmFtIGFkYXB0ZXIJOiBjb250cm9sbGVycycgc29mdCBzdGF0ZQorICogQHBhcmFtIHNjYgkJOiBTQ0IgdG8gYmUgZGlzcGxheWVkCisgKiBAcGFyYW0gbGV2ZWwJOiBkZWJ1ZyBsZXZlbCBmb3IgY29uc29sZSBwcmludAorICoKKyAqIERpcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gU0NCIGlmZiB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbCBpcworICogdmVyYm9zZQorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9kaXNwbGF5X3NjYihhZGFwdGVyX3QgKmFkYXB0ZXIsIHNjYl90ICpzY2IpCit7CisJbWJveF9jY2JfdAkJKmNjYjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpzY3A7CisJbWJveF90CQkJKm1ib3g7CisJaW50CQkJbGV2ZWw7CisJaW50CQkJaTsKKworCisJY2NiCT0gKG1ib3hfY2NiX3QgKilzY2ItPmNjYjsKKwlzY3AJPSBzY2ItPnNjcDsKKwltYm94CT0gY2NiLT5tYm94OworCisJbGV2ZWwgPSBDTF9ETEVWRUwzOworCisJY29uX2xvZyhsZXZlbCwgKEtFUk5fTk9USUNFCisJCSJtZWdhcmFpZCBtYWlsYm94OiBzdGF0dXM6JSN4IGNtZDolI3ggaWQ6JSN4ICIsIHNjYi0+c3RhdHVzLAorCQltYm94LT5jbWQsIHNjYi0+c25vKSk7CisKKwljb25fbG9nKGxldmVsLCAoInNlYzolI3ggbGJhOiUjeCBhZGRyOiUjeCBsZDolZCBzZzolZFxuIiwKKwkJbWJveC0+bnVtc2VjdG9ycywgbWJveC0+bGJhLCBtYm94LT54ZmVyYWRkciwgbWJveC0+bG9nZHJ2LAorCQltYm94LT5udW1zZ2UpKTsKKworCWlmICghc2NwKSByZXR1cm47CisKKwljb25fbG9nKGxldmVsLCAoS0VSTl9OT1RJQ0UgInNjc2kgY21uZDogIikpOworCisJZm9yIChpID0gMDsgaSA8IHNjcC0+Y21kX2xlbjsgaSsrKSB7CisJCWNvbl9sb2cobGV2ZWwsICgiJSMyLjAyeCAiLCBzY3AtPmNtbmRbaV0pKTsKKwl9CisKKwljb25fbG9nKGxldmVsLCAoIlxuIikpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9zZXR1cF9kZXZpY2VfbWFwIC0gbWFuYWdlIGRldmljZSBpZHMKKyAqIEBhZGFwdGVyCTogRHJpdmVyJ3Mgc29mdCBzdGF0ZQorICoKKyAqIE1hbmFuZ2UgdGhlIGRldmljZSBpZHMgdG8gaGF2ZSBhbiBhcHByb3ByYWl0ZSBtYXBwaW5nIGJldHdlZW4gdGhlIGtlcm5lbAorICogc2NzaSBhZGRyZXNzZXMgYW5kIG1lZ2FyYWlkIHNjc2kgYW5kIGxvZ2ljYWwgZHJpdmUgYWRkcmVzc2VzLiBXZSBleHBvcnQKKyAqIHNjc2kgZGV2aWNlcyBvbiB0aGVpciBhY3R1YWwgYWRkcmVzc2VzLCB3aGVyZWFzIHRoZSBsb2dpY2FsIGRyaXZlcyBhcmUKKyAqIGV4cG9ydGVkIG9uIGEgdmlydHVhbCBzY3NpIGNoYW5uZWwuCisgKiovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9zZXR1cF9kZXZpY2VfbWFwKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1aW50OF90CQljOworCXVpbnQ4X3QJCXQ7CisKKwkvKgorCSAqIEZpcnN0IGZpbGwgdGhlIHZhbHVlcyBvbiB0aGUgbG9naWNhbCBkcml2ZSBjaGFubmVsCisJICovCisJZm9yICh0ID0gMDsgdCA8IExTSV9NQVhfTE9HSUNBTF9EUklWRVNfNjRMRDsgdCsrKQorCQlhZGFwdGVyLT5kZXZpY2VfaWRzW2FkYXB0ZXItPm1heF9jaGFubmVsXVt0XSA9CisJCQkodCA8IGFkYXB0ZXItPmluaXRfaWQpID8gIHQgOiB0IC0gMTsKKworCWFkYXB0ZXItPmRldmljZV9pZHNbYWRhcHRlci0+bWF4X2NoYW5uZWxdW2FkYXB0ZXItPmluaXRfaWRdID0gMHhGRjsKKworCS8qCisJICogRmlsbCB0aGUgdmFsdWVzIG9uIHRoZSBwaHlzaWNhbCBkZXZpY2VzIGNoYW5uZWxzCisJICovCisJZm9yIChjID0gMDsgYyA8IGFkYXB0ZXItPm1heF9jaGFubmVsOyBjKyspCisJCWZvciAodCA9IDA7IHQgPCBMU0lfTUFYX0xPR0lDQUxfRFJJVkVTXzY0TEQ7IHQrKykKKwkJCWFkYXB0ZXItPmRldmljZV9pZHNbY11bdF0gPSAoYyA8PCA4KSB8IHQ7Cit9CisKKworLyoKKyAqIEVORDogaW50ZXJuYWwgY29tbWFuZHMgbGlicmFyeQorICovCisKKy8qCisgKiBTVEFSVDogSW50ZXJmYWNlIGZvciB0aGUgY29tbW9uIG1hbmFnZW1lbnQgbW9kdWxlCisgKgorICogVGhpcyBpcyB0aGUgbW9kdWxlLCB3aGljaCBpbnRlcmZhY2VzIHdpdGggdGhlIGNvbW1vbiBtYW5nZW1lbnQgbW9kdWxlIHRvCisgKiBwcm92aWRlIHN1cHBvcnQgZm9yIGlvY3RsIGFuZCBzeXNmcworICovCisKKy8qKgorICogbWVnYXJhaWRfY21tX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgd2l0aCB0aGUgbWFuZ2VtZW50IG1vZHVsZQorICogQHBhcmFtIGFkYXB0ZXIJOiBIQkEgc29mdCBzdGF0ZQorICoKKyAqIFJlZ2lzdGVyIHdpdGggdGhlIG1hbmFnZW1lbnQgbW9kdWxlLCB3aGljaCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGlzc3VlCisgKiBpb2N0bCBjYWxscyB0byB0aGUgZHJpdmVycy4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgbWFuYWdlbWVudCBtb2R1bGUKKyAqIHRvIHNldHVwIHN5c2ZzIHN1cHBvcnQgYXMgd2VsbC4KKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfY21tX3JlZ2lzdGVyKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisJbXJhaWRfbW1hZHBfdAlhZHA7CisJc2NiX3QJCSpzY2I7CisJbWJveF9jY2JfdAkqY2NiOworCWludAkJcnZhbDsKKwlpbnQJCWk7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBiYXNlIGxpc3Qgb2Ygc2NiIGZvciBtYW5hZ2VtZW50IG1vZHVsZS4KKwlhZGFwdGVyLT51c2NiX2xpc3QgPSBrbWFsbG9jKHNpemVvZihzY2JfdCkgKiBNQk9YX01BWF9VU0VSX0NNRFMsCisJCQlHRlBfS0VSTkVMKTsKKworCWlmIChhZGFwdGVyLT51c2NiX2xpc3QgPT0gTlVMTCkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJX19MSU5FX18pKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoYWRhcHRlci0+dXNjYl9saXN0LCAwLCBzaXplb2Yoc2NiX3QpICogTUJPWF9NQVhfVVNFUl9DTURTKTsKKworCisJLy8gSW5pdGlhbGl6ZSB0aGUgc3luY2hyb25pemF0aW9uIHBhcmFtZXRlcnMgZm9yIHJlc291cmNlcyBmb3IKKwkvLyBjb21tYW5kcyBmb3IgbWFuYWdlbWVudCBtb2R1bGUKKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+dXNjYl9wb29sKTsKKworCXNwaW5fbG9ja19pbml0KFVTRVJfRlJFRV9MSVNUX0xPQ0soYWRhcHRlcikpOworCisKKworCS8vIGxpbmsgYWxsIHRoZSBwYWNrZXRzLiBOb3RlLCBDQ0IgZm9yIGNvbW1hbmRzLCBjb21pbmcgZnJvbSB0aGUKKwkvLyBjb21tb20gbWFuYWdlbWVudCBtb2R1bGUsIG1haWxib3ggcGh5c2ljYWwgYWRkcmVzcyBhcmUgYWxyZWFkeQorCS8vIHNldHVwIGJ5IGl0LiBXZSBqdXN0IG5lZWQgcGxhY2Vob2xkZXIgZm9yIHRoYXQgaW4gb3VyIGxvY2FsIGNvbW1hbmQKKwkvLyBjb250cm9sIGJsb2NrcworCWZvciAoaSA9IDA7IGkgPCBNQk9YX01BWF9VU0VSX0NNRFM7IGkrKykgeworCisJCXNjYgkJCT0gYWRhcHRlci0+dXNjYl9saXN0ICsgaTsKKwkJY2NiCQkJPSByYWlkX2Rldi0+dWNjYl9saXN0ICsgaTsKKworCQlzY2ItPmNjYgkJPSAoY2FkZHJfdCljY2I7CisJCWNjYi0+bWJveDY0CQk9IHJhaWRfZGV2LT51bWJveDY0ICsgaTsKKwkJY2NiLT5tYm94CQk9ICZjY2ItPm1ib3g2NC0+bWJveDMyOworCQljY2ItPnJhd19tYm94CQk9ICh1aW50OF90ICopY2NiLT5tYm94OworCisJCXNjYi0+Z3AJCQk9IDA7CisKKwkJLy8gQ09NTUFORCBJRCAwIC0gKE1CT1hfTUFYX1NDU0lfQ01EUy0xKSBBUkUgUkVTRVJWRUQgRk9SCisJCS8vIENPTU1BTkRTIENPTUlORyBGUk9NIElPIFNVQlNZU1RFTSAoTUlELUxBWUVSKQorCQlzY2ItPnNubwkJPSBpICsgTUJPWF9NQVhfU0NTSV9DTURTOworCisJCXNjYi0+c2NwCQk9IE5VTEw7CisJCXNjYi0+c3RhdGUJCT0gU0NCX0ZSRUU7CisJCXNjYi0+ZG1hX2RpcmVjdGlvbgk9IFBDSV9ETUFfTk9ORTsKKwkJc2NiLT5kbWFfdHlwZQkJPSBNUkFJRF9ETUFfTk9ORTsKKwkJc2NiLT5kZXZfY2hhbm5lbAk9IC0xOworCQlzY2ItPmRldl90YXJnZXQJCT0gLTE7CisKKwkJLy8gcHV0IHNjYiBpbiB0aGUgZnJlZSBwb29sCisJCWxpc3RfYWRkX3RhaWwoJnNjYi0+bGlzdCwgJmFkYXB0ZXItPnVzY2JfcG9vbCk7CisJfQorCisJYWRwLnVuaXF1ZV9pZAkJPSBhZGFwdGVyLT51bmlxdWVfaWQ7CisJYWRwLmRydnJfdHlwZQkJPSBEUlZSVFlQRV9NQk9YOworCWFkcC5kcnZyX2RhdGEJCT0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKKwlhZHAucGRldgkJPSBhZGFwdGVyLT5wZGV2OworCWFkcC5pc3N1ZV91aW9jCQk9IG1lZ2FyYWlkX21ib3hfbW1faGFuZGxlcjsKKwlhZHAudGltZW91dAkJPSAzMDA7CisJYWRwLm1heF9raW9jCQk9IE1CT1hfTUFYX1VTRVJfQ01EUzsKKworCWlmICgocnZhbCA9IG1yYWlkX21tX3JlZ2lzdGVyX2FkcCgmYWRwKSkgIT0gMCkgeworCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgbWJveDogZGlkIG5vdCByZWdpc3RlciB3aXRoIENNTVxuIikpOworCisJCWtmcmVlKGFkYXB0ZXItPnVzY2JfbGlzdCk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9jbW1fdW5yZWdpc3RlciAtIHVuLXJlZ2lzdGVyIHdpdGggdGhlIG1hbmdlbWVudCBtb2R1bGUKKyAqIEBwYXJhbSBhZGFwdGVyCTogSEJBIHNvZnQgc3RhdGUKKyAqCisgKiBVbi1yZWdpc3RlciB3aXRoIHRoZSBtYW5hZ2VtZW50IG1vZHVsZS4KKyAqIEZJWE1FOiBtZ210IG1vZHVsZSBtdXN0IHJldHVybiBmYWlsdXJlIGZvciB1bnJlZ2lzdGVyIGlmIGl0IGhhcyBwZW5kaW5nCisgKiBjb21tYW5kcyBpbiBMTEQKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfY21tX3VucmVnaXN0ZXIoYWRhcHRlcl90ICphZGFwdGVyKQoreworCWtmcmVlKGFkYXB0ZXItPnVzY2JfbGlzdCk7CisJbXJhaWRfbW1fdW5yZWdpc3Rlcl9hZHAoYWRhcHRlci0+dW5pcXVlX2lkKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX21ib3hfbW1faGFuZGxlciAtIGludGVyZmFjZSBmb3IgQ01NIHRvIGlzc3VlIGNvbW1hbmRzIHRvIExMRAorICogQHBhcmFtIGRydnJfZGF0YQk6IExMRCBzcGVjaWZpYyBkYXRhCisgKiBAcGFyYW0ga2lvYwkJOiBDTU0gaW50ZXJmYWNlIHBhY2tldAorICogQHBhcmFtIGFjdGlvbgk6IGNvbW1hbmQgYWN0aW9uCisgKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgd2hlbmV2ZXIgdGhlIENvbW1vbiBNYW5nZW1lbnQgTW9kdWxlIChDTU0pIGhhcyBhCisgKiBjb21tYW5kIGZvciB1cy4gVGhlICdhY3Rpb24nIHBhcmFtZXRlciBzcGVjaWZpZXMgaWYgdGhpcyBpcyBhIG5ldyBjb21tYW5kCisgKiBvciBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX21ib3hfbW1faGFuZGxlcih1bnNpZ25lZCBsb25nIGRydnJfZGF0YSwgdWlvY190ICpraW9jLCB1aW50MzJfdCBhY3Rpb24pCit7CisJYWRhcHRlcl90ICphZGFwdGVyOworCisJaWYgKGFjdGlvbiAhPSBJT0NUTF9JU1NVRSkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiB1bnN1cHBvcnRlZCBtYW5hZ2VtZW50IGFjdGlvbjolIzJ4XG4iLAorCQkJYWN0aW9uKSk7CisJCXJldHVybiAoLUVOT1RTVVBQKTsKKwl9CisKKwlhZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWRydnJfZGF0YTsKKworCS8vIG1ha2Ugc3VyZSB0aGlzIGFkYXB0ZXIgaXMgbm90IGJlaW5nIGRldGFjaGVkIHJpZ2h0IG5vdy4KKwlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPmJlaW5nX2RldGFjaGVkKSkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiByZWplY3QgbWFuYWdlbWVudCByZXF1ZXN0LCBkZXRhY2hpbmdcbiIpKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisKKwlzd2l0Y2ggKGtpb2MtPm9wY29kZSkgeworCisJY2FzZSBHRVRfQURBUF9JTkZPOgorCisJCWtpb2MtPnN0YXR1cyA9ICBnYXRoZXJfaGJhaW5mbyhhZGFwdGVyLCAobXJhaWRfaGJhX2luZm9fdCAqKQorCQkJCQkodW5zaWduZWQgbG9uZylraW9jLT5idWZfdmFkZHIpOworCisJCWtpb2MtPmRvbmUoa2lvYyk7CisKKwkJcmV0dXJuIGtpb2MtPnN0YXR1czsKKworCWNhc2UgTUJPWF9DTUQ6CisKKwkJcmV0dXJuIG1lZ2FyYWlkX21ib3hfbW1fY29tbWFuZChhZGFwdGVyLCBraW9jKTsKKworCWRlZmF1bHQ6CisJCWtpb2MtPnN0YXR1cyA9ICgtRUlOVkFMKTsKKwkJa2lvYy0+ZG9uZShraW9jKTsKKwkJcmV0dXJuICgtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsJLy8gbm90IHJlYWNoZWQKK30KKworLyoqCisgKiBtZWdhcmFpZF9tYm94X21tX2NvbW1hbmQgLSBpc3N1ZXMgY29tbWFuZHMgcm91dGVkIHRocm91Z2ggQ01NCisgKiBAcGFyYW0gYWRhcHRlcgk6IEhCQSBzb2Z0IHN0YXRlCisgKiBAcGFyYW0ga2lvYwkJOiBtYW5hZ2VtZW50IGNvbW1hbmQgcGFja2V0CisgKgorICogSXNzdWVzIGNvbW1hbmRzLCB3aGljaCBhcmUgcm91dGVkIHRocm91Z2ggdGhlIG1hbmFnZW1lbnQgbW9kdWxlLgorICovCitzdGF0aWMgaW50CittZWdhcmFpZF9tYm94X21tX2NvbW1hbmQoYWRhcHRlcl90ICphZGFwdGVyLCB1aW9jX3QgKmtpb2MpCit7CisJc3RydWN0IGxpc3RfaGVhZAkqaGVhZCA9ICZhZGFwdGVyLT51c2NiX3Bvb2w7CisJbWJveDY0X3QJCSptYm94NjQ7CisJdWludDhfdAkJCSpyYXdfbWJveDsKKwlzY2JfdAkJCSpzY2I7CisJbWJveF9jY2JfdAkJKmNjYjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCS8vIGRldGFjaCBvbmUgc2NiIGZyb20gZnJlZSBwb29sCisJc3Bpbl9sb2NrX2lycXNhdmUoVVNFUl9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoaGVhZCkpIHsJLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIG9mIENNTQorCisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgbWJveDogYnVnIGluIGNtbSBoYW5kbGVyLCBsb3N0IHJlc291cmNlc1xuIikpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoVVNFUl9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCisJc2NiID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzY2JfdCwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmc2NiLT5saXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoVVNFUl9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJc2NiLT5zdGF0ZQkJPSBTQ0JfQUNUSVZFOworCXNjYi0+ZG1hX3R5cGUJCT0gTVJBSURfRE1BX05PTkU7CisJc2NiLT5kbWFfZGlyZWN0aW9uCT0gUENJX0RNQV9OT05FOworCisJY2NiCQk9IChtYm94X2NjYl90ICopc2NiLT5jY2I7CisJbWJveDY0CQk9IChtYm94NjRfdCAqKSh1bnNpZ25lZCBsb25nKWtpb2MtPmNtZGJ1ZjsKKwlyYXdfbWJveAk9ICh1aW50OF90ICopJm1ib3g2NC0+bWJveDMyOworCisJbWVtY3B5KGNjYi0+bWJveDY0LCBtYm94NjQsIHNpemVvZihtYm94NjRfdCkpOworCisJc2NiLT5ncAkJPSAodW5zaWduZWQgbG9uZylraW9jOworCisJLyoKKwkgKiBJZiBpdCBpcyBhIGxvZ2RydiByYW5kb20gZGVsZXRlIG9wZXJhdGlvbiwgd2UgaGF2ZSB0byB3YWl0IHRpbGwKKwkgKiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgY21kcyBhdCB0aGUgZncgYW5kIHRoZW4gaXNzdWUgaXQgZGlyZWN0bHkKKwkgKi8KKwlpZiAocmF3X21ib3hbMF0gPT0gRkNfREVMX0xPR0RSViAmJiByYXdfbWJveFsyXSA9PSBPUF9ERUxfTE9HRFJWKSB7CisKKwkJaWYgKHdhaXRfdGlsbF9md19lbXB0eShhZGFwdGVyKSkgeworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX05PVElDRQorCQkJCSJtZWdhcmFpZCBtYm94OiBMRCBkZWxldGUsIHRpbWVkIG91dFxuIikpOworCisJCQlraW9jLT5zdGF0dXMgPSAtRVRJTUU7CisKKwkJCXNjYi0+c3RhdHVzID0gLTE7CisKKwkJCW1lZ2FyYWlkX21ib3hfbW1fZG9uZShhZGFwdGVyLCBzY2IpOworCisJCQlyZXR1cm4gKC1FVElNRSk7CisJCX0KKworCQlJTklUX0xJU1RfSEVBRCgmc2NiLT5saXN0KTsKKworCQlzY2ItPnN0YXRlID0gU0NCX0lTU1VFRDsKKwkJaWYgKG1ib3hfcG9zdF9jbWQoYWRhcHRlciwgc2NiKSAhPSAwKSB7CisKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKKwkJCQkibWVnYXJhaWQgbWJveDogTEQgZGVsZXRlLCBtYWlsYm94IGJ1c3lcbiIpKTsKKworCQkJa2lvYy0+c3RhdHVzID0gLUVCVVNZOworCisJCQlzY2ItPnN0YXR1cyA9IC0xOworCisJCQltZWdhcmFpZF9tYm94X21tX2RvbmUoYWRhcHRlciwgc2NiKTsKKworCQkJcmV0dXJuICgtRUJVU1kpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJLy8gcHV0IHRoZSBjb21tYW5kIG9uIHRoZSBwZW5kaW5nIGxpc3QgYW5kIGV4ZWN1dGUKKwltZWdhcmFpZF9tYm94X3J1bnBlbmRxKGFkYXB0ZXIsIHNjYik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50Cit3YWl0X3RpbGxfZndfZW1wdHkoYWRhcHRlcl90ICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCWludAkJaTsKKworCisJLyoKKwkgKiBTZXQgdGhlIHF1aWVzY2VudCBmbGFnIHRvIHN0b3AgaXNzdWluZyBjbWRzIHRvIEZXLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGFkYXB0ZXItPmhvc3RfbG9jaywgZmxhZ3MpOworCWFkYXB0ZXItPnF1aWVzY2VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYWRhcHRlci0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFdhaXQgdGlsbCB0aGVyZSBhcmUgbm8gbW9yZSBjbWRzIG91dHN0YW5kaW5nIGF0IEZXLiBUcnkgZm9yIGF0IG1vc3QKKwkgKiA2MCBzZWNvbmRzCisJICovCisJZm9yIChpID0gMDsgaSA8IDYwICYmIGFkYXB0ZXItPm91dHN0YW5kaW5nX2NtZHM7IGkrKykgeworCQljb25fbG9nKENMX0RMRVZFTDEsIChLRVJOX0lORk8KKwkJCSJtZWdhcmFpZDogRlcgaGFzICVkIHBlbmRpbmcgY29tbWFuZHNcbiIsCisJCQlhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzKSk7CisKKwkJbXNsZWVwKDEwMDApOworCX0KKworCXJldHVybiBhZGFwdGVyLT5vdXRzdGFuZGluZ19jbWRzOworfQorCisKKy8qKgorICogbWVnYXJhaWRfbWJveF9tbV9kb25lIC0gY2FsbGJhY2sgZm9yIENNTSBjb21tYW5kcworICogQGFkYXB0ZXIJOiBIQkEgc29mdCBzdGF0ZQorICogQHNjYgkJOiBjb21wbGV0ZWQgY29tbWFuZAorICoKKyAqIENhbGxiYWNrIHJvdXRpbmUgZm9yIGludGVybmFsIGNvbW1hbmRzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgbWFuYWdlbWVudAorICogbW9kdWxlLgorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfbWJveF9tbV9kb25lKGFkYXB0ZXJfdCAqYWRhcHRlciwgc2NiX3QgKnNjYikKK3sKKwl1aW9jX3QJCQkqa2lvYzsKKwltYm94NjRfdAkJKm1ib3g2NDsKKwl1aW50OF90CQkJKnJhd19tYm94OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJa2lvYwkJCT0gKHVpb2NfdCAqKXNjYi0+Z3A7CisJa2lvYy0+c3RhdHVzCQk9IDA7CisJbWJveDY0CQkJPSAobWJveDY0X3QgKikodW5zaWduZWQgbG9uZylraW9jLT5jbWRidWY7CisJbWJveDY0LT5tYm94MzIuc3RhdHVzCT0gc2NiLT5zdGF0dXM7CisJcmF3X21ib3gJCT0gKHVpbnQ4X3QgKikmbWJveDY0LT5tYm94MzI7CisKKworCS8vIHB1dCBzY2IgaW4gdGhlIGZyZWUgcG9vbAorCXNjYi0+c3RhdGUJPSBTQ0JfRlJFRTsKKwlzY2ItPnNjcAk9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShVU0VSX0ZSRUVfTElTVF9MT0NLKGFkYXB0ZXIpLCBmbGFncyk7CisKKwlsaXN0X2FkZCgmc2NiLT5saXN0LCAmYWRhcHRlci0+dXNjYl9wb29sKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoVVNFUl9GUkVFX0xJU1RfTE9DSyhhZGFwdGVyKSwgZmxhZ3MpOworCisJLy8gaWYgYSBkZWxldGUgbG9naWNhbCBkcml2ZSBvcGVyYXRpb24gc3VjY2VlZGVkLCByZXN0YXJ0IHRoZQorCS8vIGNvbnRyb2xsZXIKKwlpZiAocmF3X21ib3hbMF0gPT0gRkNfREVMX0xPR0RSViAmJiByYXdfbWJveFsyXSA9PSBPUF9ERUxfTE9HRFJWKSB7CisKKwkJYWRhcHRlci0+cXVpZXNjZW50LS07CisKKwkJbWVnYXJhaWRfbWJveF9ydW5wZW5kcShhZGFwdGVyLCBOVUxMKTsKKwl9CisKKwlraW9jLT5kb25lKGtpb2MpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogZ2F0aGVyX2hiYWluZm8gLSBIQkEgY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgYXBwbGljYXRpb25zCisgKiBAcGFyYW0gYWRhcHRlcgk6IEhCQSBzb2Z0IHN0YXRlCisgKiBAcGFyYW0gaGluZm8JCTogcG9pbnRlciB0byB0aGUgY2FsbGVyJ3MgaG9zdCBpbmZvIHN0cnVjdXR1cmUKKyAqLworc3RhdGljIGludAorZ2F0aGVyX2hiYWluZm8oYWRhcHRlcl90ICphZGFwdGVyLCBtcmFpZF9oYmFfaW5mb190ICpoaW5mbykKK3sKKwl1aW50OF90CWRtYWpvcjsKKworCWRtYWpvcgkJCT0gbWVnYXJhaWRfbWJveF92ZXJzaW9uWzBdOworCisJaGluZm8tPnBjaV92ZW5kb3JfaWQJPSBhZGFwdGVyLT5wZGV2LT52ZW5kb3I7CisJaGluZm8tPnBjaV9kZXZpY2VfaWQJPSBhZGFwdGVyLT5wZGV2LT5kZXZpY2U7CisJaGluZm8tPnN1YnN5c192ZW5kb3JfaWQJPSBhZGFwdGVyLT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCWhpbmZvLT5zdWJzeXNfZGV2aWNlX2lkCT0gYWRhcHRlci0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKworCWhpbmZvLT5wY2lfYnVzCQk9IGFkYXB0ZXItPnBkZXYtPmJ1cy0+bnVtYmVyOworCWhpbmZvLT5wY2lfZGV2X2ZuCT0gYWRhcHRlci0+cGRldi0+ZGV2Zm47CisJaGluZm8tPnBjaV9zbG90CQk9IFBDSV9TTE9UKGFkYXB0ZXItPnBkZXYtPmRldmZuKTsKKwloaW5mby0+aXJxCQk9IGFkYXB0ZXItPmhvc3QtPmlycTsKKwloaW5mby0+YmFzZXBvcnQJCT0gQURBUDJSQUlEREVWKGFkYXB0ZXIpLT5iYXNlcG9ydDsKKworCWhpbmZvLT51bmlxdWVfaWQJPSAoaGluZm8tPnBjaV9idXMgPDwgOCkgfCBhZGFwdGVyLT5wZGV2LT5kZXZmbjsKKwloaW5mby0+aG9zdF9ubwkJPSBhZGFwdGVyLT5ob3N0LT5ob3N0X25vOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFTkQ6IEludGVyZmFjZSBmb3IgdGhlIGNvbW1vbiBtYW5hZ2VtZW50IG1vZHVsZQorICovCisKKworCisvKioKKyAqIG1lZ2FyYWlkX3N5c2ZzX2FsbG9jX3Jlc291cmNlcyAtIGFsbG9jYXRlIHN5c2ZzIHJlbGF0ZWQgcmVzb3VyY2VzCisgKgorICogQWxsb2NhdGUgcGFja2V0cyByZXF1aXJlZCB0byBpc3N1ZSBGVyBjYWxscyB3aGVuZXZlciB0aGUgc3lzZnMgYXR0cmlidXRlcworICogYXJlIHJlYWQuIFRoZXNlIGF0dHJpYnV0ZXMgd291bGQgcmVxdWlyZSB1cC10by1kYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKiBGVy4gQWxzbyBzZXQgdXAgcmVzb3VyY2VzIGZvciBtdXR1YWwgZXhjbHVzaW9uIHRvIHNoYXJlIHRoZXNlIHJlc291cmNlcyBhbmQKKyAqIHRoZSB3YWl0IHF1ZXVlLgorICoKKyAqIEBwYXJhbSBhZGFwdGVyIDogY29udHJvbGxlcidzIHNvZnQgc3RhdGUKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcworICogQHJldHVybiAtRVJST1JfQ09ERSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK21lZ2FyYWlkX3N5c2ZzX2FsbG9jX3Jlc291cmNlcyhhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisJbXJhaWRfZGV2aWNlX3QJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCWludAkJcnZhbCA9IDA7CisKKwlyYWlkX2Rldi0+c3lzZnNfdWlvYyA9IGttYWxsb2Moc2l6ZW9mKHVpb2NfdCksIEdGUF9LRVJORUwpOworCisJcmFpZF9kZXYtPnN5c2ZzX21ib3g2NCA9IGttYWxsb2Moc2l6ZW9mKG1ib3g2NF90KSwgR0ZQX0tFUk5FTCk7CisKKwlyYWlkX2Rldi0+c3lzZnNfYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKKwkJCVBBR0VfU0laRSwgJnJhaWRfZGV2LT5zeXNmc19idWZmZXJfZG1hKTsKKworCWlmICghcmFpZF9kZXYtPnN5c2ZzX3Vpb2MgfHwgIXJhaWRfZGV2LT5zeXNmc19tYm94NjQgfHwKKwkJIXJhaWRfZGV2LT5zeXNmc19idWZmZXIpIHsKKworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkOiBvdXQgb2YgbWVtb3J5LCAlcyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJX19MSU5FX18pKTsKKworCQlydmFsID0gLUVOT01FTTsKKworCQltZWdhcmFpZF9zeXNmc19mcmVlX3Jlc291cmNlcyhhZGFwdGVyKTsKKwl9CisKKwlzZW1hX2luaXQoJnJhaWRfZGV2LT5zeXNmc19zZW0sIDEpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcmFpZF9kZXYtPnN5c2ZzX3dhaXRfcSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX3N5c2ZzX2ZyZWVfcmVzb3VyY2VzIC0gZnJlZSBzeXNmcyByZWxhdGVkIHJlc291cmNlcworICoKKyAqIEZyZWUgcGFja2V0cyBhbGxvY2F0ZWQgZm9yIHN5c2ZzIEZXIGNvbW1hbmRzCisgKgorICogQHBhcmFtIGFkYXB0ZXIgOiBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICovCitzdGF0aWMgdm9pZAorbWVnYXJhaWRfc3lzZnNfZnJlZV9yZXNvdXJjZXMoYWRhcHRlcl90ICphZGFwdGVyKQoreworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKworCWlmIChyYWlkX2Rldi0+c3lzZnNfdWlvYykga2ZyZWUocmFpZF9kZXYtPnN5c2ZzX3Vpb2MpOworCisJaWYgKHJhaWRfZGV2LT5zeXNmc19tYm94NjQpIGtmcmVlKHJhaWRfZGV2LT5zeXNmc19tYm94NjQpOworCisJaWYgKHJhaWRfZGV2LT5zeXNmc19idWZmZXIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBQQUdFX1NJWkUsCisJCQlyYWlkX2Rldi0+c3lzZnNfYnVmZmVyLCByYWlkX2Rldi0+c3lzZnNfYnVmZmVyX2RtYSk7CisJfQorfQorCisKKy8qKgorICogbWVnYXJhaWRfc3lzZnNfZ2V0X2xkbWFwX2RvbmUgLSBjYWxsYmFjayBmb3IgZ2V0IGxkbWFwCisgKgorICogQ2FsbGJhY2sgcm91dGluZSBjYWxsZWQgaW4gdGhlIElTUi90YXNrbGV0IGNvbnRleHQgZm9yIGdldCBsZG1hcCBjYWxsCisgKgorICogQHBhcmFtIHVpb2MgOiBjb21wbGV0ZWQgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkCittZWdhcmFpZF9zeXNmc19nZXRfbGRtYXBfZG9uZSh1aW9jX3QgKnVpb2MpCit7CisJYWRhcHRlcl90CSphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKXVpb2MtPmJ1Zl92YWRkcjsKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwl1aW9jLT5zdGF0dXMgPSAwOworCisJd2FrZV91cCgmcmFpZF9kZXYtPnN5c2ZzX3dhaXRfcSk7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9zeXNmc19nZXRfbGRtYXBfdGltZW91dCAtIHRpbWVvdXQgaGFuZGxpbmcgZm9yIGdldCBsZG1hcAorICoKKyAqIFRpbWVvdXQgcm91dGluZSB0byByZWNvdmVyIGFuZCByZXR1cm4gdG8gYXBwbGljYXRpb24sIGluIGNhc2UgdGhlIGFkYXB0ZXIKKyAqIGhhcyBzdG9wcGVkIHJlc3BvbmRpbmcuIEEgdGltZW91dCBvZiA2MCBzZWNvbmRzIGZvciB0aGlzIGNvbW1hbmQgc2VlbSBsaWtlCisgKiBhIGdvb2QgdmFsdWUKKyAqCisgKiBAcGFyYW0gdWlvYyA6IHRpbWVkIG91dCBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQKK21lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1aW9jX3QJCSp1aW9jID0gKHVpb2NfdCAqKWRhdGE7CisJYWRhcHRlcl90CSphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKXVpb2MtPmJ1Zl92YWRkcjsKKwltcmFpZF9kZXZpY2VfdAkqcmFpZF9kZXYgPSBBREFQMlJBSURERVYoYWRhcHRlcik7CisKKwl1aW9jLT5zdGF0dXMgPSAtRVRJTUU7CisKKwl3YWtlX3VwKCZyYWlkX2Rldi0+c3lzZnNfd2FpdF9xKTsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcCAtIGdldCB1cGRhdGUgbG9naWNhbCBkcml2ZSBtYXAKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdXNlciByZWFkcyB0aGUgbG9naWNhbCBkcml2ZQorICogYXR0cmlidXRlcywgZ28gZ2V0IHRoZSBjdXJyZW50IGxvZ2ljYWwgZHJpdmUgbWFwcGluZyB0YWJsZSBmcm9tIHRoZQorICogZmlybXdhcmUuIFdlIHVzZSB0aGUgbWFuYWdtZW50IEFQSSdzIHRvIGlzc3VlIGNvbW1hbmRzIHRvIHRoZSBjb250cm9sbGVyLgorICoKKyAqIE5PVEU6IFRoZSBjb21tYW5kcyBpc3N1YW5jZSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBnZW5lcmFsaXplZCBhbmQKKyAqIGltcGxlbWVudGVkIGluIGNvbnRleHQgb2YgImdldCBsZCBtYXAiIGNvbW1hbmQgb25seS4gSWYgcmVxdWlyZWQsIHRoZQorICogY29tbWFuZCBpc3N1YW5jZSBsb2dpY2FsIGNhbiBiZSB0cml2aWFsbHkgcHVsbGVkIG91dCBhbmQgaW1wbGVtZW50ZWQgYXMgYQorICogc3RhbmRhbG9uZSBsaWJhcnkuIEZvciBub3csIHRoaXMgc2hvdWxkIHN1ZmZpY2Ugc2luY2UgdGhlcmUgaXMgbm8gb3RoZXIKKyAqIHVzZXIgb2YgdGhpcyBpbnRlcmZhY2UuCisgKgorICogQHBhcmFtIGFkYXB0ZXIgOiBjb250cm9sbGVyJ3Mgc29mdCBzdGF0ZQorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCisgKiBAcmV0dXJuIC0xIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorbWVnYXJhaWRfc3lzZnNfZ2V0X2xkbWFwKGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwltcmFpZF9kZXZpY2VfdAkJKnJhaWRfZGV2ID0gQURBUDJSQUlEREVWKGFkYXB0ZXIpOworCXVpb2NfdAkJCSp1aW9jOworCW1ib3g2NF90CQkqbWJveDY0OworCW1ib3hfdAkJCSptYm94OworCWNoYXIJCQkqcmF3X21ib3g7CisJc3RydWN0IHRpbWVyX2xpc3QJc3lzZnNfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJKnRpbWVycDsKKwljYWRkcl90CQkJbGRtYXA7CisJaW50CQkJcnZhbCA9IDA7CisKKwkvKgorCSAqIEFsbG93IG9ubHkgb25lIHJlYWQgYXQgYSB0aW1lIHRvIGdvIHRocm91Z2ggdGhlIHN5c2ZzIGF0dHJpYnV0ZXMKKwkgKi8KKwlkb3duKCZyYWlkX2Rldi0+c3lzZnNfc2VtKTsKKworCXVpb2MJPSByYWlkX2Rldi0+c3lzZnNfdWlvYzsKKwltYm94NjQJPSByYWlkX2Rldi0+c3lzZnNfbWJveDY0OworCWxkbWFwCT0gcmFpZF9kZXYtPnN5c2ZzX2J1ZmZlcjsKKworCW1lbXNldCh1aW9jLCAwLCBzaXplb2YodWlvY190KSk7CisJbWVtc2V0KG1ib3g2NCwgMCwgc2l6ZW9mKG1ib3g2NF90KSk7CisJbWVtc2V0KGxkbWFwLCAwLCBzaXplb2YocmFpZF9kZXYtPmN1cnJfbGRtYXApKTsKKworCW1ib3gJCT0gJm1ib3g2NC0+bWJveDMyOworCXJhd19tYm94CT0gKGNoYXIgKiltYm94OworCXVpb2MtPmNtZGJ1ZiAgICA9ICh1aW50NjRfdCkodW5zaWduZWQgbG9uZyltYm94NjQ7CisJdWlvYy0+YnVmX3ZhZGRyCT0gKGNhZGRyX3QpYWRhcHRlcjsKKwl1aW9jLT5zdGF0dXMJPSAtRU5PREFUQTsKKwl1aW9jLT5kb25lCT0gbWVnYXJhaWRfc3lzZnNfZ2V0X2xkbWFwX2RvbmU7CisKKwkvKgorCSAqIFByZXBhcmUgdGhlIG1haWxib3ggcGFja2V0IHRvIGdldCB0aGUgY3VycmVudCBsb2dpY2FsIGRyaXZlIG1hcHBpbmcKKwkgKiB0YWJsZQorCSAqLworCW1ib3gtPnhmZXJhZGRyID0gKHVpbnQzMl90KXJhaWRfZGV2LT5zeXNmc19idWZmZXJfZG1hOworCisJcmF3X21ib3hbMF0gPSBGQ19ERUxfTE9HRFJWOworCXJhd19tYm94WzJdID0gT1BfR0VUX0xESURfTUFQOworCisJLyoKKwkgKiBTZXR1cCBhIHRpbWVyIHRvIHJlY292ZXIgZnJvbSBhIG5vbi1yZXNwb25kaW5nIGNvbnRyb2xsZXIKKwkgKi8KKwl0aW1lcnAJPSAmc3lzZnNfdGltZXI7CisJaW5pdF90aW1lcih0aW1lcnApOworCisJdGltZXJwLT5mdW5jdGlvbgk9IG1lZ2FyYWlkX3N5c2ZzX2dldF9sZG1hcF90aW1lb3V0OworCXRpbWVycC0+ZGF0YQkJPSAodW5zaWduZWQgbG9uZyl1aW9jOworCXRpbWVycC0+ZXhwaXJlcwkJPSBqaWZmaWVzICsgNjAgKiBIWjsKKworCWFkZF90aW1lcih0aW1lcnApOworCisJLyoKKwkgKiBTZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBmaXJtd2FyZQorCSAqLworCXJ2YWwgPSBtZWdhcmFpZF9tYm94X21tX2NvbW1hbmQoYWRhcHRlciwgdWlvYyk7CisKKwlpZiAocnZhbCA9PSAwKSB7CS8vIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGlzc3VlZAorCQl3YWl0X2V2ZW50KHJhaWRfZGV2LT5zeXNmc193YWl0X3EsICh1aW9jLT5zdGF0dXMgIT0gLUVOT0RBVEEpKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgY29tbWFuZCB0aW1lZCBvdXQKKwkJICovCisJCWlmICh1aW9jLT5zdGF0dXMgPT0gLUVUSU1FKSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkJIm1lZ2FyYWlkOiBzeXNmcyBnZXQgbGQgbWFwIHRpbWVkIG91dFxuIikpOworCisJCQlydmFsID0gLUVUSU1FOworCQl9CisJCWVsc2UgeworCQkJcnZhbCA9IG1ib3gtPnN0YXR1czsKKwkJfQorCisJCWlmIChydmFsID09IDApIHsKKwkJCW1lbWNweShyYWlkX2Rldi0+Y3Vycl9sZG1hcCwgbGRtYXAsCisJCQkJc2l6ZW9mKHJhaWRfZGV2LT5jdXJyX2xkbWFwKSk7CisJCX0KKwkJZWxzZSB7CisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fTk9USUNFCisJCQkJIm1lZ2FyYWlkOiBnZXQgbGQgbWFwIGZhaWxlZCB3aXRoICV4XG4iLCBydmFsKSk7CisJCX0KKwl9CisJZWxzZSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKKwkJCSJtZWdhcmFpZDogY291bGQgbm90IGlzc3VlIGxkbWFwIGNvbW1hbmQ6JXhcbiIsIHJ2YWwpKTsKKwl9CisKKworCWRlbF90aW1lcl9zeW5jKHRpbWVycCk7CisKKwl1cCgmcmFpZF9kZXYtPnN5c2ZzX3NlbSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworCisvKioKKyAqIG1lZ2FyYWlkX3N5c2ZzX3Nob3dfYXBwX2huZGwgLSBkaXNwbGF5IGFwcGxpY2F0aW9uIGhhbmRsZSBmb3IgdGhpcyBhZGFwdGVyCisgKgorICogRGlzcGxheSB0aGUgaGFuZGxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9ucyB3aGlsZSBleGVjdXRpbmcgbWFuYWdlbWVudAorICogdGFza3Mgb24gdGhlIGFkYXB0ZXIuIFdlIGludm9rZSBhIG1hbmFnZW1lbnQgbW9kdWxlIEFQSSB0byBnZXQgdGhlIGFkYXB0ZXIKKyAqIGhhbmRsZSwgc2luY2Ugd2UgZG8gbm90IGludGVyZmFjZSB3aXRoIGFwcGxpY2F0aW9ucyBkaXJlY3RseS4KKyAqCisgKiBAcGFyYW0gY2Rldgk6IGNsYXNzIGRldmljZSBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBob3N0CisgKiBAcGFyYW0gYnVmCTogYnVmZmVyIHRvIHNlbmQgZGF0YSB0bworICovCitzdGF0aWMgc3NpemVfdAorbWVnYXJhaWRfc3lzZnNfc2hvd19hcHBfaG5kbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlhZGFwdGVyX3QJKmFkYXB0ZXIgPSAoYWRhcHRlcl90ICopU0NTSUhPU1QyQURBUChzaG9zdCk7CisJdWludDMyX3QJYXBwX2huZGw7CisKKwlhcHBfaG5kbCA9IG1yYWlkX21tX2FkYXB0ZXJfYXBwX2hhbmRsZShhZGFwdGVyLT51bmlxdWVfaWQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgOCwgIiV1XG4iLCBhcHBfaG5kbCk7Cit9CisKKworLyoqCisgKiBtZWdhcmFpZF9zeXNmc19zaG93X2xkbnVtIC0gZGlzcGxheSB0aGUgbG9naWNhbCBkcml2ZSBudW1iZXIgZm9yIHRoaXMgZGV2aWNlCisgKgorICogRGlzcGxheSB0aGUgbG9naWNhbCBkcml2ZSBudW1iZXIgZm9yIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24sIGlmIGl0IGEgdmFsaWQKKyAqIGxvZ2ljYWwgZHJpdmUuIEZvciBwaHlzaWNhbCBkZXZpY2VzLCAiLTEiIGlzIHJldHVybmVkCisgKiBUaGUgbG9naWNhbCBkcml2ZSBudW1iZXIgaXMgZGlzcGxheWVkIGluIGZvbGxvd2luZyBmb3JtYXQKKyAqCisgKiA8U0NTSSBJRD4gPExEIE5VTT4gPExEIFNUSUNLWSBJRD4gPEFQUCBBREFQVEVSIEhBTkRMRT4KKyAqICAgPGludD4gICAgIDxpbnQ+ICAgICAgIDxpbnQ+ICAgICAgICAgICAgPGludD4KKyAqCisgKiBAcGFyYW0gZGV2CTogZGV2aWNlIG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHNjc2kgZGV2aWNlCisgKiBAcGFyYW0gYnVmCTogYnVmZmVyIHRvIHNlbmQgZGF0YSB0bworICovCitzdGF0aWMgc3NpemVfdAorbWVnYXJhaWRfc3lzZnNfc2hvd19sZG51bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCWFkYXB0ZXJfdAkqYWRhcHRlciA9IChhZGFwdGVyX3QgKilTQ1NJSE9TVDJBREFQKHNkZXYtPmhvc3QpOworCW1yYWlkX2RldmljZV90CSpyYWlkX2RldiA9IEFEQVAyUkFJRERFVihhZGFwdGVyKTsKKwlpbnQJCXNjc2lfaWQgPSAtMTsKKwlpbnQJCWxvZ2ljYWxfZHJ2ID0gLTE7CisJaW50CQlsZGlkX21hcCA9IC0xOworCXVpbnQzMl90CWFwcF9obmRsID0gMDsKKwlpbnQJCW1hcHBlZF9zZGV2X2lkOworCWludAkJcnZhbDsKKwlpbnQJCWk7CisKKwlpZiAocmFpZF9kZXYtPnJhbmRvbV9kZWxfc3VwcG9ydGVkICYmCisJCQlNUkFJRF9JU19MT0dJQ0FMX1NERVYoYWRhcHRlciwgc2RldikpIHsKKworCQlydmFsID0gbWVnYXJhaWRfc3lzZnNfZ2V0X2xkbWFwKGFkYXB0ZXIpOworCQlpZiAocnZhbCA9PSAwKSB7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9EUklWRVNfNDBMRDsgaSsrKSB7CisKKwkJCQltYXBwZWRfc2Rldl9pZCA9IHNkZXYtPmlkOworCisJCQkJaWYgKHNkZXYtPmlkID4gYWRhcHRlci0+aW5pdF9pZCkgeworCQkJCQltYXBwZWRfc2Rldl9pZCAtPSAxOworCQkJCX0KKworCQkJCWlmIChyYWlkX2Rldi0+Y3Vycl9sZG1hcFtpXSA9PSBtYXBwZWRfc2Rldl9pZCkgeworCisJCQkJCXNjc2lfaWQgPSBzZGV2LT5pZDsKKworCQkJCQlsb2dpY2FsX2RydiA9IGk7CisKKwkJCQkJbGRpZF9tYXAgPSByYWlkX2Rldi0+Y3Vycl9sZG1hcFtpXTsKKworCQkJCQlhcHBfaG5kbCA9IG1yYWlkX21tX2FkYXB0ZXJfYXBwX2hhbmRsZSgKKwkJCQkJCQlhZGFwdGVyLT51bmlxdWVfaWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9OT1RJQ0UKKwkJCQkibWVnYXJhaWQ6IHN5c2ZzIGdldCBsZCBtYXAgZmFpbGVkOiAleFxuIiwKKwkJCQlydmFsKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAzNiwgIiVkICVkICVkICVkXG4iLCBzY3NpX2lkLCBsb2dpY2FsX2RydiwKKwkJCWxkaWRfbWFwLCBhcHBfaG5kbCk7Cit9CisKKworLyoKKyAqIEVORDogTWFpbGJveCBMb3cgTGV2ZWwgRHJpdmVyCisgKi8KK21vZHVsZV9pbml0KG1lZ2FyYWlkX2luaXQpOworbW9kdWxlX2V4aXQobWVnYXJhaWRfZXhpdCk7CisKKy8qIHZpbTogc2V0IHRzPTggc3c9OCB0dz03OCBhaSBzaTogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTEwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5oCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICoKKyAqCQkJTGludXggTWVnYVJBSUQgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0ICBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoJICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCSAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGSUxFCQk6IG1lZ2FyYWlkX21ib3guaAorICovCisKKyNpZm5kZWYgX01FR0FSQUlEX0hfCisjZGVmaW5lIF9NRUdBUkFJRF9IXworCisKKyNpbmNsdWRlICJtZWdhX2NvbW1vbi5oIgorI2luY2x1ZGUgIm1ib3hfZGVmcy5oIgorI2luY2x1ZGUgIm1lZ2FyYWlkX2lvY3RsLmgiCisKKworI2RlZmluZSBNRUdBUkFJRF9WRVJTSU9OCSIyLjIwLjQuNSIKKyNkZWZpbmUgTUVHQVJBSURfRVhUX1ZFUlNJT04JIihSZWxlYXNlIERhdGU6IFRodSBGZWIgMDMgMTI6Mjc6MjIgRVNUIDIwMDUpIgorCisKKy8qCisgKiBEZWZpbmUgc29tZSBQQ0kgdmFsdWVzIGhlcmUgdW50aWwgdGhleSBhcmUgcHV0IGluIHRoZSBrZXJuZWwKKyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0X0RJX0RJU0NPVkVSWQkJMHgwMDBFCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRfRElfRElTQ09WRVJZCQkweDAxMjMKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0X1NDCQkJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0X1NDCQkJCTB4MDUyMAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRfREMJCQkJMHgxOTYwCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRfREMJCQkJMHgwNTE4CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNF9RQwkJCQkweDA0MDcKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9QRVJDNF9RQwkJCQkweDA1MzEKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUkM0X0RJX0VWRVJHTEFERVMJCTB4MDAwRgorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0X0RJX0VWRVJHTEFERVMJCTB4MDE0QQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX1NJX0JJR0JFTkQJCQkweDAwMTMKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9QRVJDNEVfU0lfQklHQkVORAkJCTB4MDE2YworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0tPQlVLCQkJMHgwMDEzCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRFX0RJX0tPQlVLCQkJMHgwMTZkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNEVfRElfQ09SVkVUVEUJCTB4MDAxMworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0RV9ESV9DT1JWRVRURQkJMHgwMTZlCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNEVfRElfRVhQRURJVElPTgkJMHgwMDEzCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRFX0RJX0VYUEVESVRJT04JCTB4MDE2ZgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX0RJX0dVQURBTFVQRQkJMHgwMDEzCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRFX0RJX0dVQURBTFVQRQkJMHgwMTcwCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJDNEVfRENfMzIwXzJFCQkJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzRFX0RDXzMyMF8yRQkJCTB4MDAwMgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSQzRFX1NDXzMyMF8xRQkJCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX1BFUkM0RV9TQ18zMjBfMUUJCQkweDAwMDEKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzAJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzAJCTB4QTUyMAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfMQkJMHgxOTYwCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMQkJMHgwNTIwCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yCQkweDE5NjAKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yCQkweDA1MTgKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzB4CQkweDA0MDcKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8weAkJMHgwNTMwCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yeAkJMHgwNDA3CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMngJCTB4MDUzMgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0NTSV8zMjBfNHgJCTB4MDQwNworI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NDU0lfMzIwXzR4CQkweDA1MzEKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NDU0lfMzIwXzFFCQkweDA0MDgKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQ1NJXzMyMF8xRQkJMHgwMDAxCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQ1NJXzMyMF8yRQkJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0NTSV8zMjBfMkUJCTB4MDAwMgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfSTRfMTMzX1JBSUQJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX0k0XzEzM19SQUlECQkweDA1MjIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FR0FSQUlEX1NBVEFfMTUwXzQJCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMTUwXzQJCTB4NDUyMworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0FUQV8xNTBfNgkJMHgxOTYwCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8xNTBfNgkJMHgwNTIzCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9TQVRBXzMwMF80eAkJMHgwNDA5CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8zMDBfNHgJCTB4MzAwNAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfU0FUQV8zMDBfOHgJCTB4MDQwOQorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMzAwXzh4CQkweDMwMDgKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDVTQyWAkJMHgwNDA3CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNVNDJYCQkweDA1MzIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDUzE2CQkJMHgxOTYwCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNTMTYJCQkweDA1MjMKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDVTQyRQkJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNVNDJFCQkweDAwMDIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDWkNSWAkJMHgwNDA3CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNaQ1JYCQkweDA1MzAKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JDUzI4WAkJMHgwNDA5CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfSU5URUxfUkFJRF9TUkNTMjhYCQkweDMwMDgKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1JBSURfU1JPTUJVNDJFX0FMSUVGCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JPTUJVNDJFX0FMSUVGCTB4MzQzMQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUkFJRF9TUk9NQlU0MkVfSEFSV0lDSAkweDA0MDgKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9JTlRFTF9SQUlEX1NST01CVTQyRV9IQVJXSUNICTB4MzQ5OQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUkFJRF9TUkNVNDFMX0xBS0VfU0hFVEVLCTB4MTk2MAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0lOVEVMX1JBSURfU1JDVTQxTF9MQUtFX1NIRVRFSwkweDA1MjAKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZTQ19NRUdBUkFJRF9QQ0lfRVhQUkVTU19ST01CCTB4MDQwOAorI2RlZmluZSBQQ0lfU1VCU1lTX0lEX0ZTQ19NRUdBUkFJRF9QQ0lfRVhQUkVTU19ST01CCTB4MTA2NQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVHQVJBSURfQUNFUl9ST01CXzJFCQkweDA0MDgKKyNkZWZpbmUgUENJX1NVQlNZU19JRF9NRUdBUkFJRF9BQ0VSX1JPTUJfMkUJCTB4MDA0RAorCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzNfUUMJCQkJMHgwNDcxCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzNfREMJCQkJMHgwNDkzCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfUEVSQzNfU0MJCQkJMHgwNDc1CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUdBUkFJRF9ORUNfUk9NQl8yRQkJMHgwNDA4CisjZGVmaW5lIFBDSV9TVUJTWVNfSURfTUVHQVJBSURfTkVDX1JPTUJfMkUJCTB4ODI4NworCisjaWZuZGVmIFBDSV9TVUJTWVNfSURfRlNDCisjZGVmaW5lIFBDSV9TVUJTWVNfSURfRlNDCQkJCTB4MTczNAorI2VuZGlmCisKKyNkZWZpbmUgTUJPWF9NQVhfU0NTSV9DTURTCTEyOAkvLyBudW1iZXIgb2YgY21kcyByZXNlcnZlZCBmb3Iga2VybmVsCisjZGVmaW5lIE1CT1hfTUFYX1VTRVJfQ01EUwkzMgkvLyBudW1iZXIgb2YgY21kcyBmb3IgYXBwbGljYXRpb25zCisjZGVmaW5lIE1CT1hfREVGX0NNRF9QRVJfTFVOCTY0CS8vIGRlZmF1bHQgY29tbWFuZHMgcGVyIGx1bgorI2RlZmluZSBNQk9YX0RFRkFVTFRfU0dfU0laRQkyNgkvLyBkZWZhdWx0IHNnIHNpemUgc3VwcG9ydGVkIGJ5IGFsbCBmdworI2RlZmluZSBNQk9YX01BWF9TR19TSVpFCTMyCS8vIG1heGltdW0gc2NhdHRlci1nYXRoZXIgbGlzdCBzaXplCisjZGVmaW5lIE1CT1hfTUFYX1NFQ1RPUlMJMTI4CS8vIG1heGltdW0gc2VjdG9ycyBwZXIgSU8KKyNkZWZpbmUgTUJPWF9USU1FT1VUCQkzMAkvLyB0aW1lb3V0IHZhbHVlIGZvciBpbnRlcm5hbCBjbWRzCisjZGVmaW5lIE1CT1hfQlVTWV9XQUlUCQkxMAkvLyBtYXggdXNlYyB0byB3YWl0IGZvciBidXN5IG1haWxib3gKKyNkZWZpbmUgTUJPWF9SRVNFVF9XQUlUCQkxODAJLy8gd2FpdCB0aGVzZSBtYW55IHNlY29uZHMgaW4gcmVzZXQKKyNkZWZpbmUgTUJPWF9SRVNFVF9FWFRfV0FJVAkxMjAJLy8gZXh0ZW5kZWQgd2FpdCByZXNldAorCisvKgorICogbWF4aW11bSB0cmFuc2ZlciB0aGF0IGNhbiBoYXBwZW4gdGhyb3VnaCB0aGUgZmlybXdhcmUgY29tbWFuZHMgaXNzdWVkCisgKiBpbnRlcm5uYWx5IGZyb20gdGhlIGRyaXZlci4KKyAqLworI2RlZmluZSBNQk9YX0lCVUZfU0laRQkJNDA5NgorCisKKy8qKgorICogbWJveF9jY2JfdCAtIGNvbW1hbmQgY29udHJvbCBibG9jayBzcGVjaWZpYyB0byBtYWlsYm94IGJhc2VkIGNvbnRyb2xsZXJzCisgKiBAcmF3X21ib3gJCTogcmF3IG1haWxib3ggcG9pbnRlcgorICogQG1ib3gJCTogbWFpbGJveAorICogQG1ib3g2NAkJOiBleHRlbmRlZCBtYWlsYm94CisgKiBAbWJveF9kbWFfaAkJOiBtYWlib3ggZG1hIGFkZHJlc3MKKyAqIEBzZ2w2NAkJOiA2NC1iaXQgc2NhdHRlci1nYXRoZXIgbGlzdAorICogQHNnbDMyCQk6IDMyLWJpdCBzY2F0dGVyLWdhdGhlciBsaXN0CisgKiBAc2dsX2RtYV9oCQk6IGRtYSBoYW5kbGUgZm9yIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0CisgKiBAcHRocnUJCTogcGFzc3RocnUgc3RydWN0dXJlCisgKiBAcHRocnVfZG1hX2gJCTogZG1hIGhhbmRsZSBmb3IgdGhlIHBhc3N0aHJ1IHN0cnVjdHVyZQorICogQGVwdGhydQkJOiBleHRlbmRlZCBwYXNzdGhydSBzdHJ1Y3R1cmUKKyAqIEBlcHRocnVfZG1hX2gJOiBkbWEgaGFuZGxlIGZvciBleHRlbmRlZCBwYXNzdGhydSBzdHJ1Y3R1cmUKKyAqIEBidWZfZG1hX2gJCTogZG1hIGhhbmRsZSBmb3IgYnVmZmVycyB3L28gc2cgbGlzdAorICoKKyAqIGNvbW1hbmQgY29udHJvbCBibG9jayBzcGVjaWZpYyB0byB0aGUgbWFpbGJveCBiYXNlZCBjb250cm9sbGVycworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJCSpyYXdfbWJveDsKKwltYm94X3QJCQkqbWJveDsKKwltYm94NjRfdAkJKm1ib3g2NDsKKwlkbWFfYWRkcl90CQltYm94X2RtYV9oOworCW1ib3hfc2dsNjQJCSpzZ2w2NDsKKwltYm94X3NnbDMyCQkqc2dsMzI7CisJZG1hX2FkZHJfdAkJc2dsX2RtYV9oOworCW1yYWlkX3Bhc3N0aHJ1X3QJKnB0aHJ1OworCWRtYV9hZGRyX3QJCXB0aHJ1X2RtYV9oOworCW1yYWlkX2VwYXNzdGhydV90CSplcHRocnU7CisJZG1hX2FkZHJfdAkJZXB0aHJ1X2RtYV9oOworCWRtYV9hZGRyX3QJCWJ1Zl9kbWFfaDsKK30gbWJveF9jY2JfdDsKKworCisvKioKKyAqIG1yYWlkX2RldmljZV90IC0gYWRhcHRlciBzb2Z0IHN0YXRlIHN0cnVjdHVyZSBmb3IgbWFpbGJveCBjb250cm9sbGVycworICogQHBhcmFtIHVuYV9tYm94NjQJCTogNjQtYml0IG1ib3ggLSB1bmFsaWduZWQKKyAqIEBwYXJhbSB1bmFfbWJveDY0X2RtYQk6IG1ib3ggZG1hIGFkZHIgLSB1bmFsaWduZWQKKyAqIEBwYXJhbSBtYm94CQkJOiAzMi1iaXQgbWJveCAtIGFsaWduZWQKKyAqIEBwYXJhbSBtYm94NjQJCTogNjQtYml0IG1ib3ggLSBhbGlnbmVkCisgKiBAcGFyYW0gbWJveF9kbWEJCTogbWJveCBkbWEgYWRkciAtIGFsaWduZWQKKyAqIEBwYXJhbSBtYWlsYm94X2xvY2sJCTogZXhjbHVzaW9uIGxvY2sgZm9yIHRoZSBtYWlsYm94CisgKiBAcGFyYW0gYmFzZXBvcnQJCTogYmFzZSBwb3J0IG9mIGhiYSBtZW1vcnkKKyAqIEBwYXJhbSBiYXNlYWRkcgkJOiBtYXBwZWQgYWRkciBvZiBoYmEgbWVtb3J5CisgKiBAcGFyYW0gbWJveF9wb29sCQk6IHBvb2wgb2YgbWFpbGJveGVzCisgKiBAcGFyYW0gbWJveF9wb29sX2hhbmRsZQk6IGhhbmRsZSBmb3IgdGhlIG1haWxib3ggcG9vbCBtZW1vcnkKKyAqIEBwYXJhbSBlcHRocnVfcG9vbAkJOiBhIHBvb2wgZm9yIGV4dGVuZGVkIHBhc3N0aHJ1IGNvbW1hbmRzCisgKiBAcGFyYW0gZXB0aHJ1X3Bvb2xfaGFuZGxlCTogaGFuZGxlIHRvIHRoZSBwb29sIGFib3ZlCisgKiBAcGFyYW0gc2dfcG9vbAkJOiBwb29sIG9mIHNjYXR0ZXItZ2F0aGVyIGxpc3RzIGZvciB0aGlzIGRyaXZlcgorICogQHBhcmFtIHNnX3Bvb2xfaGFuZGxlCTogaGFuZGxlIHRvIHRoZSBwb29sIGFib3ZlCisgKiBAcGFyYW0gY2NiX2xpc3QJCTogbGlzdCBvZiBvdXIgY29tbWFuZCBjb250cm9sIGJsb2NrcworICogQHBhcmFtIHVjY2JfbGlzdAkJOiBsaXN0IG9mIGNtZCBjb250cm9sIGJsb2NrcyBmb3IgbWdtdCBtb2R1bGUKKyAqIEBwYXJhbSB1bWJveDY0CQk6IGFycmF5IG9mIG1haWxib3ggZm9yIHVzZXIgY29tbWFuZHMgKGNtbSkKKyAqIEBwYXJhbSBwZHJ2X3N0YXRlCQk6IGFycmF5IGZvciBzdGF0ZSBvZiBlYWNoIHBoeXNpY2FsIGRyaXZlLgorICogQHBhcmFtIGxhc3RfZGlzcAkJOiBmbGFnIHVzZWQgdG8gc2hvdyBkZXZpY2Ugc2Nhbm5pbmcKKyAqIEBwYXJhbSBod19lcnJvcgkJOiBzZXQgaWYgRlcgbm90IHJlc3BvbmRpbmcKKyAqIEBwYXJhbSBmYXN0X2xvYWQJCTogSWYgc2V0LCBza2lwIHBoeXNpY2FsIGRldmljZSBzY2FubmluZworICogQGNoYW5uZWxfY2xhc3MJCTogY2hhbm5lbCBjbGFzcywgUkFJRCBvciBTQ1NJCisgKiBAc3lzZnNfc2VtCQkJOiBzZW1hcGhvcmUgdG8gc2VyaWFsaXplIGFjY2VzcyB0byBzeXNmcyByZXMuCisgKiBAc3lzZnNfdWlvYwkJCTogbWFuYWdlbWVudCBwYWNrZXQgdG8gaXNzdWUgRlcgY2FsbHMgZnJvbSBzeXNmcworICogQHN5c2ZzX21ib3g2NAkJOiBtYWlsYm94IHBhY2tldCB0byBpc3N1ZSBGVyBjYWxscyBmcm9tIHN5c2ZzCisgKiBAc3lzZnNfYnVmZmVyCQk6IGRhdGEgYnVmZmVyIGZvciBGVyBjb21tYW5kcyBpc3N1ZWQgZnJvbSBzeXNmcworICogQHN5c2ZzX2J1ZmZlcl9kbWEJCTogRE1BIGJ1ZmZlciBmb3IgRlcgY29tbWFuZHMgaXNzdWVkIGZyb20gc3lzZnMKKyAqIEBzeXNmc193YWl0X3EJCTogd2FpdCBxdWV1ZSBmb3Igc3lzZnMgb3BlcmF0aW9ucworICogQHJhbmRvbV9kZWxfc3VwcG9ydGVkCTogc2V0IGlmIHRoZSByYW5kb20gZGVsZXRpb24gaXMgc3VwcG9ydGVkCisgKiBAY3Vycl9sZG1hcAkJCTogY3VycmVudCBMRElEIG1hcAorICoKKyAqIEluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSBmb3IgbWFpbGJveCBjb250cm9sbGVyczogbWVtb3J5IGJhc2VkIGFuZCBJTyBiYXNlZAorICogQWxsIHRoZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIExMRCBzcGVjaWZpYyBhbmQgbWF5IGJlIGRpc2NvdmVyZWQgYXQKKyAqIGluaXQoKSBvciBzdGFydCgpIHRpbWUuCisgKgorICogTk9URTogVGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZXMgYXJlIHBsYWNlZCB0byBtaW5pbWl6ZSBjYWNoZSBtaXNzZXMKKyAqLworI2RlZmluZSBNQVhfTERfRVhURU5ERUQ2NAk2NAordHlwZWRlZiBzdHJ1Y3QgeworCW1ib3g2NF90CQkJKnVuYV9tYm94NjQ7CisJZG1hX2FkZHJfdAkJCXVuYV9tYm94NjRfZG1hOworCW1ib3hfdAkJCQkqbWJveDsKKwltYm94NjRfdAkJCSptYm94NjQ7CisJZG1hX2FkZHJfdAkJCW1ib3hfZG1hOworCXNwaW5sb2NrX3QJCQltYWlsYm94X2xvY2s7CisJdW5zaWduZWQgbG9uZwkJCWJhc2Vwb3J0OworCXZvaWQgX19pb21lbSAqCQkJYmFzZWFkZHI7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJCW1ib3hfcG9vbFtNQk9YX01BWF9TQ1NJX0NNRFNdOworCXN0cnVjdCBkbWFfcG9vbAkJCSptYm94X3Bvb2xfaGFuZGxlOworCXN0cnVjdCBtcmFpZF9wY2lfYmxrCQllcHRocnVfcG9vbFtNQk9YX01BWF9TQ1NJX0NNRFNdOworCXN0cnVjdCBkbWFfcG9vbAkJCSplcHRocnVfcG9vbF9oYW5kbGU7CisJc3RydWN0IG1yYWlkX3BjaV9ibGsJCXNnX3Bvb2xbTUJPWF9NQVhfU0NTSV9DTURTXTsKKwlzdHJ1Y3QgZG1hX3Bvb2wJCQkqc2dfcG9vbF9oYW5kbGU7CisJbWJveF9jY2JfdAkJCWNjYl9saXN0W01CT1hfTUFYX1NDU0lfQ01EU107CisJbWJveF9jY2JfdAkJCXVjY2JfbGlzdFtNQk9YX01BWF9VU0VSX0NNRFNdOworCW1ib3g2NF90CQkJdW1ib3g2NFtNQk9YX01BWF9VU0VSX0NNRFNdOworCisJdWludDhfdAkJCQlwZHJ2X3N0YXRlW01CT1hfTUFYX1BIWVNJQ0FMX0RSSVZFU107CisJdWludDMyX3QJCQlsYXN0X2Rpc3A7CisJaW50CQkJCWh3X2Vycm9yOworCWludAkJCQlmYXN0X2xvYWQ7CisJdWludDhfdAkJCQljaGFubmVsX2NsYXNzOworCXN0cnVjdCBzZW1hcGhvcmUJCXN5c2ZzX3NlbTsKKwl1aW9jX3QJCQkJKnN5c2ZzX3Vpb2M7CisJbWJveDY0X3QJCQkqc3lzZnNfbWJveDY0OworCWNhZGRyX3QJCQkJc3lzZnNfYnVmZmVyOworCWRtYV9hZGRyX3QJCQlzeXNmc19idWZmZXJfZG1hOworCXdhaXRfcXVldWVfaGVhZF90CQlzeXNmc193YWl0X3E7CisJaW50CQkJCXJhbmRvbV9kZWxfc3VwcG9ydGVkOworCXVpbnQxNl90CQkJY3Vycl9sZG1hcFtNQVhfTERfRVhURU5ERUQ2NF07Cit9IG1yYWlkX2RldmljZV90OworCisvLyByb3V0ZSB0byByYWlkIGRldmljZSBmcm9tIGFkYXB0ZXIKKyNkZWZpbmUgQURBUDJSQUlEREVWKGFkcCkJKChtcmFpZF9kZXZpY2VfdCAqKSgoYWRwKS0+cmFpZF9kZXZpY2UpKQorCisjZGVmaW5lIE1BSUxCT1hfTE9DSyhyZGV2KQkoJihyZGV2KS0+bWFpbGJveF9sb2NrKQorCisvLyBGaW5kIG91dCBpZiB0aGlzIGNoYW5uZWwgaXMgYSBSQUlEIG9yIFNDU0kKKyNkZWZpbmUgSVNfUkFJRF9DSChyZGV2LCBjaCkJKCgocmRldiktPmNoYW5uZWxfY2xhc3MgPj4gKGNoKSkgJiAweDAxKQorCisKKyNkZWZpbmUgUkRJTkRPT1IocmRldikJCXJlYWRsKChyZGV2KS0+YmFzZWFkZHIgKyAweDIwKQorI2RlZmluZSBSRE9VVERPT1IocmRldikJCXJlYWRsKChyZGV2KS0+YmFzZWFkZHIgKyAweDJDKQorI2RlZmluZSBXUklORE9PUihyZGV2LCB2YWx1ZSkJd3JpdGVsKHZhbHVlLCAocmRldiktPmJhc2VhZGRyICsgMHgyMCkKKyNkZWZpbmUgV1JPVVRET09SKHJkZXYsIHZhbHVlKQl3cml0ZWwodmFsdWUsIChyZGV2KS0+YmFzZWFkZHIgKyAweDJDKQorCisjZW5kaWYgLy8gX01FR0FSQUlEX0hfCisKKy8vIHZpbTogc2V0IHRzPTggc3c9OCB0dz03ODoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxYjU1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tbS5jCkBAIC0wLDAgKzEsMTI1NSBAQAorLyoKKyAqCisgKgkJCUxpbnV4IE1lZ2FSQUlEIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCAgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCSAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRklMRQkJOiBtZWdhcmFpZF9tbS5jCisgKiBWZXJzaW9uCTogdjIuMjAuMi41IChKYW4gMjEgMjAwNSkKKyAqCisgKiBDb21tb24gbWFuYWdlbWVudCBtb2R1bGUKKyAqLworCisjaW5jbHVkZSAibWVnYXJhaWRfbW0uaCIKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisKKy8vIEVudHJ5IHBvaW50cyBmb3IgY2hhciBub2RlIGRyaXZlcgorc3RhdGljIGludCBtcmFpZF9tbV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbXJhaWRfbW1faW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVpbnQsIHVuc2lnbmVkIGxvbmcpOworCisKKy8vIHJvdXRpbmVzIHRvIGNvbnZlcnQgdG8gYW5kIGZyb20gdGhlIG9sZCB0aGUgZm9ybWF0CitzdGF0aWMgaW50IG1pbWRfdG9fa2lvYyhtaW1kX3QgX191c2VyICosIG1yYWlkX21tYWRwX3QgKiwgdWlvY190ICopOworc3RhdGljIGludCBraW9jX3RvX21pbWQodWlvY190ICosIG1pbWRfdCBfX3VzZXIgKik7CisKKworLy8gSGVscGVyIGZ1bmN0aW9ucworc3RhdGljIGludCBoYW5kbGVfZHJ2cmNtZCh2b2lkIF9fdXNlciAqLCB1aW50OF90LCBpbnQgKik7CitzdGF0aWMgaW50IGxsZF9pb2N0bChtcmFpZF9tbWFkcF90ICosIHVpb2NfdCAqKTsKK3N0YXRpYyB2b2lkIGlvY3RsX2RvbmUodWlvY190ICopOworc3RhdGljIHZvaWQgbGxkX3RpbWVkb3V0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgaGluZm9fdG9fY2luZm8obXJhaWRfaGJhX2luZm9fdCAqLCBtY29udHJvbGxlcl90ICopOworc3RhdGljIG1yYWlkX21tYWRwX3QgKm1yYWlkX21tX2dldF9hZGFwdGVyKG1pbWRfdCBfX3VzZXIgKiwgaW50ICopOworc3RhdGljIHVpb2NfdCAqbXJhaWRfbW1fYWxsb2Nfa2lvYyhtcmFpZF9tbWFkcF90ICopOworc3RhdGljIHZvaWQgbXJhaWRfbW1fZGVhbGxvY19raW9jKG1yYWlkX21tYWRwX3QgKiwgdWlvY190ICopOworc3RhdGljIGludCBtcmFpZF9tbV9hdHRhY2hfYnVmKG1yYWlkX21tYWRwX3QgKiwgdWlvY190ICosIGludCk7CitzdGF0aWMgaW50IG1yYWlkX21tX3NldHVwX2RtYV9wb29scyhtcmFpZF9tbWFkcF90ICopOworc3RhdGljIHZvaWQgbXJhaWRfbW1fZnJlZV9hZHBfcmVzb3VyY2VzKG1yYWlkX21tYWRwX3QgKik7CitzdGF0aWMgdm9pZCBtcmFpZF9tbV90ZWFyZG93bl9kbWFfcG9vbHMobXJhaWRfbW1hZHBfdCAqKTsKKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIG1yYWlkX21tX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIkxTSSBMb2dpYyBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMU0kgTG9naWMgTWFuYWdlbWVudCBNb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKExTSV9DT01NT05fTU9EX1ZFUlNJT04pOworCitzdGF0aWMgaW50IGRiZ2xldmVsID0gQ0xfQU5OOworbW9kdWxlX3BhcmFtX25hbWVkKGRsZXZlbCwgZGJnbGV2ZWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRsZXZlbCwgIkRlYnVnIGxldmVsIChkZWZhdWx0PTApIik7CisKK0VYUE9SVF9TWU1CT0wobXJhaWRfbW1fcmVnaXN0ZXJfYWRwKTsKK0VYUE9SVF9TWU1CT0wobXJhaWRfbW1fdW5yZWdpc3Rlcl9hZHApOworRVhQT1JUX1NZTUJPTChtcmFpZF9tbV9hZGFwdGVyX2FwcF9oYW5kbGUpOworCitzdGF0aWMgaW50IG1ham9ybm87CitzdGF0aWMgdWludDMyX3QgZHJ2cl92ZXIJPSAweDAyMjAwMjAxOworCitzdGF0aWMgaW50IGFkYXB0ZXJzX2NvdW50X2c7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhZGFwdGVyc19saXN0X2c7CisKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxzaV9mb3BzID0geworCS5vcGVuCT0gbXJhaWRfbW1fb3BlbiwKKwkuaW9jdGwJPSBtcmFpZF9tbV9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IG1yYWlkX21tX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworLyoqCisgKiBtcmFpZF9tbV9vcGVuIC0gb3BlbiByb3V0aW5lIGZvciBjaGFyIG5vZGUgaW50ZXJmYWNlCisgKiBAaW5vZAk6IHVudXNlZAorICogQGZpbGVwCTogdW51c2VkCisgKgorICogYWxsb3cgaW9jdGwgb3BlcmF0aW9ucyBieSBhcHBzIG9ubHkgaWYgdGhleSBzdXBlcnVzZXIgcHJpdmlsZWdlCisgKi8KK3N0YXRpYyBpbnQKK21yYWlkX21tX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCS8qCisJICogT25seSBhbGxvdyBzdXBlcnVzZXIgdG8gYWNjZXNzIHByaXZhdGUgaW9jdGwgaW50ZXJmYWNlCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSByZXR1cm4gKC1FQUNDRVMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXJhaWRfbW1faW9jdGwgLSBtb2R1bGUgZW50cnktcG9pbnQgZm9yIGlvY3RscworICogQGlub2RlCTogaW5vZGUgKGlnbm9yZWQpCisgKiBAZmlsZXAJOiBmaWxlIG9wZXJhdGlvbnMgcG9pbnRlciAoaWdub3JlZCkKKyAqIEBjbWQJCTogaW9jdGwgY29tbWFuZAorICogQGFyZwkJOiB1c2VyIGlvY3RsIHBhY2tldAorICovCitzdGF0aWMgaW50CittcmFpZF9tbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdWlvY190CQkqa2lvYzsKKwljaGFyCQlzaWduYXR1cmVbRVhUX0lPQ1RMX1NJR05fU1pdCT0gezB9OworCWludAkJcnZhbDsKKwltcmFpZF9tbWFkcF90CSphZHA7CisJdWludDhfdAkJb2xkX2lvY3RsOworCWludAkJZHJ2cmNtZF9ydmFsOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJLyoKKwkgKiBNYWtlIHN1cmUgb25seSBVU0NTSUNNRCBhcmUgaXNzdWVkIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCisJICogTUlNRCBhcHBsaWNhdGlvbiB3b3VsZCBzdGlsbCBmaXJlIGRpZmZlcmVudCBjb21tYW5kLgorCSAqLworCisJaWYgKChfSU9DX1RZUEUoY21kKSAhPSBNRUdBSU9DX01BR0lDKSAmJiAoY21kICE9IFVTQ1NJQ01EKSkgeworCQlyZXR1cm4gKC1FSU5WQUwpOworCX0KKworCS8qCisJICogTG9vayBmb3Igc2lnbmF0dXJlIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBuZXcgb3Igb2xkIGlvY3RsIGZvcm1hdC4KKwkgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoc2lnbmF0dXJlLCBhcmdwLCBFWFRfSU9DVExfU0lHTl9TWikpIHsKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZCBjbW06IGNvcHkgZnJvbSB1c3IgYWRkciBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuICgtRUZBVUxUKTsKKwl9CisKKwlpZiAobWVtY21wKHNpZ25hdHVyZSwgRVhUX0lPQ1RMX1NJR04sIEVYVF9JT0NUTF9TSUdOX1NaKSA9PSAwKQorCQlvbGRfaW9jdGwgPSAwOworCWVsc2UKKwkJb2xkX2lvY3RsID0gMTsKKworCS8qCisJICogQXQgcHJlc2VudCwgd2UgZG9uJ3Qgc3VwcG9ydCB0aGUgbmV3IGlvY3RsIHBhY2tldAorCSAqLworCWlmICghb2xkX2lvY3RsICkKKwkJcmV0dXJuICgtRUlOVkFMKTsKKworCS8qCisJICogSWYgaXQgaXMgYSBkcml2ZXIgaW9jdGwgKGFzIG9wcG9zZWQgdG8gZncgaW9jdGxzKSwgdGhlbiB3ZSBjYW4KKwkgKiBoYW5kbGUgdGhlIGNvbW1hbmQgbG9jYWxseS4gcnZhbCA+IDAgbWVhbnMgaXQgaXMgbm90IGEgZHJ2ciBjbWQKKwkgKi8KKwlydmFsID0gaGFuZGxlX2RydnJjbWQoYXJncCwgb2xkX2lvY3RsLCAmZHJ2cmNtZF9ydmFsKTsKKworCWlmIChydmFsIDwgMCkKKwkJcmV0dXJuIHJ2YWw7CisJZWxzZSBpZiAocnZhbCA9PSAwKQorCQlyZXR1cm4gZHJ2cmNtZF9ydmFsOworCisJcnZhbCA9IDA7CisJaWYgKChhZHAgPSBtcmFpZF9tbV9nZXRfYWRhcHRlcihhcmdwLCAmcnZhbCkpID09IE5VTEwpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBhZGFwdGVyIGNhbiBhY2NlcHQgaW9jdGwuIFdlIG1heSBoYXZlIG1hcmtlZCBpdCBvZmZsaW5lCisJICogaWYgYW55IHByZXZpb3VzIGtpb2MgaGFkIHRpbWVkb3V0IG9uIHRoaXMgY29udHJvbGxlci4KKwkgKi8KKwlpZiAoIWFkcC0+cXVpZXNjZW50KSB7CisJCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9XQVJOSU5HCisJCQkibWVnYXJhaWQgY21tOiBjb250cm9sbGVyIGNhbm5vdCBhY2NlcHQgY21kcyBkdWUgdG8gIgorCQkJImVhcmxpZXIgZXJyb3JzXG4iICkpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgY2FsbCB3aWxsIGJsb2NrIHRpbGwgYSBraW9jIGlzIGF2YWlsYWJsZQorCSAqLworCWtpb2MgPSBtcmFpZF9tbV9hbGxvY19raW9jKGFkcCk7CisKKwkvKgorCSAqIFVzZXIgc2VudCB0aGUgb2xkIG1pbWRfdCBpb2N0bCBwYWNrZXQuIENvbnZlcnQgaXQgdG8gdWlvY190LgorCSAqLworCWlmICgocnZhbCA9IG1pbWRfdG9fa2lvYyhhcmdwLCBhZHAsIGtpb2MpKSkgeworCQltcmFpZF9tbV9kZWFsbG9jX2tpb2MoYWRwLCBraW9jKTsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJa2lvYy0+ZG9uZSA9IGlvY3RsX2RvbmU7CisKKwkvKgorCSAqIElzc3VlIHRoZSBJT0NUTCB0byB0aGUgbG93IGxldmVsIGRyaXZlci4gQWZ0ZXIgdGhlIElPQ1RMIGNvbXBsZXRlcworCSAqIHJlbGVhc2UgdGhlIGtpb2MgaWYgYW5kIG9ubHkgaWYgaXQgd2FzIF9ub3RfIHRpbWVkb3V0LiBJZiBpdCB3YXMKKwkgKiB0aW1lZG91dCwgdGhhdCBtZWFucyB0aGF0IHJlc291cmNlcyBhcmUgc3RpbGwgd2l0aCBsb3cgbGV2ZWwgZHJpdmVyLgorCSAqLworCWlmICgocnZhbCA9IGxsZF9pb2N0bChhZHAsIGtpb2MpKSkgeworCisJCWlmICgha2lvYy0+dGltZWRvdXQpCisJCQltcmFpZF9tbV9kZWFsbG9jX2tpb2MoYWRwLCBraW9jKTsKKworCQlyZXR1cm4gcnZhbDsKKwl9CisKKwkvKgorCSAqIENvbnZlcnQgdGhlIGtpb2MgYmFjayB0byB1c2VyIHNwYWNlCisJICovCisJcnZhbCA9IGtpb2NfdG9fbWltZChraW9jLCBhcmdwKTsKKworCS8qCisJICogUmV0dXJuIHRoZSBraW9jIHRvIGZyZWUgcG9vbAorCSAqLworCW1yYWlkX21tX2RlYWxsb2Nfa2lvYyhhZHAsIGtpb2MpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtcmFpZF9tbV9nZXRfYWRhcHRlciAtIFJldHVybnMgY29ycmVzcG9uZGluZyBhZGFwdGVycyBmb3IgdGhlIG1pbWQgcGFja2V0CisgKiBAdW1pbWQJOiBVc2VyIHNwYWNlIG1pbWRfdCBpb2N0bCBwYWNrZXQKKyAqIEBhZGFwdGVyCTogcG9pbnRlciB0byB0aGUgYWRhcHRlciAoT1VUKQorICovCitzdGF0aWMgbXJhaWRfbW1hZHBfdCAqCittcmFpZF9tbV9nZXRfYWRhcHRlcihtaW1kX3QgX191c2VyICp1bWltZCwgaW50ICpydmFsKQoreworCW1yYWlkX21tYWRwX3QJKmFkYXB0ZXI7CisJbWltZF90CQltaW1kOworCXVpbnQzMl90CWFkYXBubzsKKwlpbnQJCWl0ZXJhdG9yOworCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm1pbWQsIHVtaW1kLCBzaXplb2YobWltZF90KSkpIHsKKwkJKnJ2YWwgPSAtRUZBVUxUOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlhZGFwbm8gPSBHRVRBREFQKG1pbWQudWkuZmNzLmFkYXBubyk7CisKKwlpZiAoYWRhcG5vID49IGFkYXB0ZXJzX2NvdW50X2cpIHsKKwkJKnJ2YWwgPSAtRU5PREVWOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlhZGFwdGVyID0gTlVMTDsKKwlpdGVyYXRvciA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXB0ZXIsICZhZGFwdGVyc19saXN0X2csIGxpc3QpIHsKKwkJaWYgKGl0ZXJhdG9yKysgPT0gYWRhcG5vKSBicmVhazsKKwl9CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJKnJ2YWwgPSAtRU5PREVWOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYWRhcHRlcjsKK30KKworLyoKKyAqIGhhbmRsZV9kcnZyY21kIC0gVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGUgb3Bjb2RlIGlzIGEgZHJpdmVyCisgKiAJCQkgIGNtZCBhbmQgaWYgaXQgaXMsIGhhbmRsZXMgaXQuCisgKiBAYXJnCQk6IHBhY2tldCBzZW50IGJ5IHRoZSB1c2VyIGFwcAorICogQG9sZF9pb2N0bAk6IG1pbWQgaWYgMTsgdWlvYyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludAoraGFuZGxlX2RydnJjbWQodm9pZCBfX3VzZXIgKmFyZywgdWludDhfdCBvbGRfaW9jdGwsIGludCAqcnZhbCkKK3sKKwltaW1kX3QJCV9fdXNlciAqdW1pbWQ7CisJbWltZF90CQlrbWltZDsKKwl1aW50OF90CQlvcGNvZGU7CisJdWludDhfdAkJc3Vib3Bjb2RlOworCisJaWYgKG9sZF9pb2N0bCkKKwkJZ290byBvbGRfcGFja2V0OworCWVsc2UKKwkJZ290byBuZXdfcGFja2V0OworCituZXdfcGFja2V0OgorCXJldHVybiAoLUVOT1RTVVBQKTsKKworb2xkX3BhY2tldDoKKwkqcnZhbCA9IDA7CisJdW1pbWQgPSBhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmttaW1kLCB1bWltZCwgc2l6ZW9mKG1pbWRfdCkpKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCisJb3Bjb2RlCQk9IGttaW1kLnVpLmZjcy5vcGNvZGU7CisJc3Vib3Bjb2RlCT0ga21pbWQudWkuZmNzLnN1Ym9wY29kZTsKKworCS8qCisJICogSWYgdGhlIG9wY29kZSBpcyAweDgyIGFuZCB0aGUgc3Vib3Bjb2RlIGlzIGVpdGhlciBHRVRfRFJWUlZFUiBvcgorCSAqIEdFVF9OVU1BRFAsIHRoZW4gd2UgY2FuIGhhbmRsZS4gT3RoZXJ3aXNlIHdlIHNob3VsZCByZXR1cm4gMSB0bworCSAqIGluZGljYXRlIHRoYXQgd2UgY2Fubm90IGhhbmRsZSB0aGlzLgorCSAqLworCWlmIChvcGNvZGUgIT0gMHg4MikKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKHN1Ym9wY29kZSkgeworCisJY2FzZSBNRUdBSU9DX1FEUlZSVkVSOgorCisJCWlmIChjb3B5X3RvX3VzZXIoa21pbWQuZGF0YSwgJmRydnJfdmVyLCBzaXplb2YodWludDMyX3QpKSkKKwkJCXJldHVybiAoLUVGQVVMVCk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIE1FR0FJT0NfUU5BREFQOgorCisJCSpydmFsID0gYWRhcHRlcnNfY291bnRfZzsKKworCQlpZiAoY29weV90b191c2VyKGttaW1kLmRhdGEsICZhZGFwdGVyc19jb3VudF9nLAorCQkJCXNpemVvZih1aW50MzJfdCkpKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCS8qIGNhbm5vdCBoYW5kbGUgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBtaW1kX3RvX2tpb2MJLSBDb252ZXJ0ZXIgZnJvbSBvbGQgdG8gbmV3IGlvY3RsIGZvcm1hdAorICoKKyAqIEB1bWltZAk6IHVzZXIgc3BhY2Ugb2xkIE1JTUQgSU9DVEwKKyAqIEBraW9jCToga2VybmVsIHNwYWNlIG5ldyBmb3JtYXQgSU9DVEwKKyAqCisgKiBSb3V0aW5lIHRvIGNvbnZlcnQgTUlNRCBpbnRlcmZhY2UgSU9DVEwgdG8gbmV3IGludGVyZmFjZSBJT0NUTCBwYWNrZXQuIFRoZQorICogbmV3IHBhY2tldCBpcyBpbiBrZXJuZWwgc3BhY2Ugc28gdGhhdCBkcml2ZXIgY2FuIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBpdAorICogZnJlZWx5LgorICovCisKK3N0YXRpYyBpbnQKK21pbWRfdG9fa2lvYyhtaW1kX3QgX191c2VyICp1bWltZCwgbXJhaWRfbW1hZHBfdCAqYWRwLCB1aW9jX3QgKmtpb2MpCit7CisJbWJveDY0X3QJCSptYm94NjQ7CisJbWJveF90CQkJKm1ib3g7CisJbXJhaWRfcGFzc3RocnVfdAkqcHRocnUzMjsKKwl1aW50MzJfdAkJYWRhcG5vOworCXVpbnQ4X3QJCQlvcGNvZGU7CisJdWludDhfdAkJCXN1Ym9wY29kZTsKKwltaW1kX3QJCQltaW1kOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtaW1kLCB1bWltZCwgc2l6ZW9mKG1pbWRfdCkpKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCisJLyoKKwkgKiBBcHBsaWNhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNlbmQgZXh0ZCBwdGhydQorCSAqLworCWlmICgobWltZC5tYm94WzBdID09IE1CT1hDTURfUEFTU1RIUlU2NCkgfHwKKwkJCShtaW1kLm1ib3hbMF0gPT0gTUJPWENNRF9FWFRQVEhSVSkpCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwlvcGNvZGUJCT0gbWltZC51aS5mY3Mub3Bjb2RlOworCXN1Ym9wY29kZQk9IG1pbWQudWkuZmNzLnN1Ym9wY29kZTsKKwlhZGFwbm8JCT0gR0VUQURBUChtaW1kLnVpLmZjcy5hZGFwbm8pOworCisJaWYgKGFkYXBubyA+PSBhZGFwdGVyc19jb3VudF9nKQorCQlyZXR1cm4gKC1FTk9ERVYpOworCisJa2lvYy0+YWRhcG5vCT0gYWRhcG5vOworCWtpb2MtPm1iX3R5cGUJPSBNQk9YX0xFR0FDWTsKKwlraW9jLT5hcHBfdHlwZQk9IEFQUFRZUEVfTUlNRDsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisKKwljYXNlIDB4ODI6CisKKwkJaWYgKHN1Ym9wY29kZSA9PSBNRUdBSU9DX1FBREFQSU5GTykgeworCisJCQlraW9jLT5vcGNvZGUJPSBHRVRfQURBUF9JTkZPOworCQkJa2lvYy0+ZGF0YV9kaXIJPSBVSU9DX1JEOworCQkJa2lvYy0+eGZlcmxlbgk9IHNpemVvZihtcmFpZF9oYmFfaW5mb190KTsKKworCQkJaWYgKG1yYWlkX21tX2F0dGFjaF9idWYoYWRwLCBraW9jLCBraW9jLT54ZmVybGVuKSkKKwkJCQlyZXR1cm4gKC1FTk9NRU0pOworCQl9CisJCWVsc2UgeworCQkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCQkJIm1lZ2FyYWlkIGNtbTogSW52YWxpZCBzdWJvcFxuIikpOworCQkJcmV0dXJuICgtRUlOVkFMKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSAweDgxOgorCisJCWtpb2MtPm9wY29kZQkJPSBNQk9YX0NNRDsKKwkJa2lvYy0+eGZlcmxlbgkJPSBtaW1kLnVpLmZjcy5sZW5ndGg7CisJCWtpb2MtPnVzZXJfZGF0YV9sZW4JPSBraW9jLT54ZmVybGVuOworCQlraW9jLT51c2VyX2RhdGEJCT0gbWltZC51aS5mY3MuYnVmZmVyOworCisJCWlmIChtcmFpZF9tbV9hdHRhY2hfYnVmKGFkcCwga2lvYywga2lvYy0+eGZlcmxlbikpCisJCQlyZXR1cm4gKC1FTk9NRU0pOworCisJCWlmIChtaW1kLm91dGxlbikga2lvYy0+ZGF0YV9kaXIgID0gVUlPQ19SRDsKKwkJaWYgKG1pbWQuaW5sZW4pIGtpb2MtPmRhdGFfZGlyIHw9IFVJT0NfV1I7CisKKwkJYnJlYWs7CisKKwljYXNlIDB4ODA6CisKKwkJa2lvYy0+b3Bjb2RlCQk9IE1CT1hfQ01EOworCQlraW9jLT54ZmVybGVuCQk9IChtaW1kLm91dGxlbiA+IG1pbWQuaW5sZW4pID8KKwkJCQkJCW1pbWQub3V0bGVuIDogbWltZC5pbmxlbjsKKwkJa2lvYy0+dXNlcl9kYXRhX2xlbgk9IGtpb2MtPnhmZXJsZW47CisJCWtpb2MtPnVzZXJfZGF0YQkJPSBtaW1kLmRhdGE7CisKKwkJaWYgKG1yYWlkX21tX2F0dGFjaF9idWYoYWRwLCBraW9jLCBraW9jLT54ZmVybGVuKSkKKwkJCXJldHVybiAoLUVOT01FTSk7CisKKwkJaWYgKG1pbWQub3V0bGVuKSBraW9jLT5kYXRhX2RpciAgPSBVSU9DX1JEOworCQlpZiAobWltZC5pbmxlbikga2lvYy0+ZGF0YV9kaXIgfD0gVUlPQ19XUjsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoLUVJTlZBTCk7CisJfQorCisJLyoKKwkgKiBJZiBkcml2ZXIgY29tbWFuZCwgbm90aGluZyBlbHNlIHRvIGRvCisJICovCisJaWYgKG9wY29kZSA9PSAweDgyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhpcyBpcyBhIG1haWxib3ggY21kOyBjb3B5IHRoZSBtYWlsYm94IGZyb20gbWltZAorCSAqLworCW1ib3g2NAk9IChtYm94NjRfdCAqKSgodW5zaWduZWQgbG9uZylraW9jLT5jbWRidWYpOworCW1ib3gJPSAmbWJveDY0LT5tYm94MzI7CisJbWVtY3B5KG1ib3gsIG1pbWQubWJveCwgMTQpOworCisJaWYgKG1ib3gtPmNtZCAhPSBNQk9YQ01EX1BBU1NUSFJVKSB7CS8vIHJlZ3VsYXIgRENNRAorCisJCW1ib3gtPnhmZXJhZGRyCT0gKHVpbnQzMl90KWtpb2MtPmJ1Zl9wYWRkcjsKKworCQlpZiAoa2lvYy0+ZGF0YV9kaXIgJiBVSU9DX1dSKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoa2lvYy0+YnVmX3ZhZGRyLCBraW9jLT51c2VyX2RhdGEsCisJCQkJCQkJa2lvYy0+eGZlcmxlbikpIHsKKwkJCQlyZXR1cm4gKC1FRkFVTFQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGlzIGlzIGEgcmVndWxhciAzMi1iaXQgcHRocnUgY21kOyBtYm94IHBvaW50cyB0byBwdGhydSBzdHJ1Y3QuCisJICogSnVzdCBsaWtlIGluIGFib3ZlIGNhc2UsIHRoZSBiZWdpbm5pbmcgZm9yIG1lbWJsayBpcyB0cmVhdGVkIGFzCisJICogYSBtYWlsYm94LiBUaGUgcGFzc3RocnUgd2lsbCBiZWdpbiBhdCBuZXh0IDFLIGJvdW5kYXJ5LiBBbmQgdGhlCisJICogZGF0YSB3aWxsIHN0YXJ0IDFLIGFmdGVyIHRoYXQuCisJICovCisJcHRocnUzMgkJCT0ga2lvYy0+cHRocnUzMjsKKwlraW9jLT51c2VyX3B0aHJ1CT0gJnVtaW1kLT5wdGhydTsKKwltYm94LT54ZmVyYWRkcgkJPSAodWludDMyX3Qpa2lvYy0+cHRocnUzMl9oOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHB0aHJ1MzIsIGtpb2MtPnVzZXJfcHRocnUsCisJCQlzaXplb2YobXJhaWRfcGFzc3RocnVfdCkpKSB7CisJCXJldHVybiAoLUVGQVVMVCk7CisJfQorCisJcHRocnUzMi0+ZGF0YXhmZXJhZGRyCT0ga2lvYy0+YnVmX3BhZGRyOworCWlmIChraW9jLT5kYXRhX2RpciAmIFVJT0NfV1IpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGtpb2MtPmJ1Zl92YWRkciwga2lvYy0+dXNlcl9kYXRhLAorCQkJCQkJcHRocnUzMi0+ZGF0YXhmZXJsZW4pKSB7CisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXJhaWRfbW1fYXR0Y2hfYnVmIC0gQXR0YWNoIGEgZnJlZSBkbWEgYnVmZmVyIGZvciByZXF1aXJlZCBzaXplCisgKgorICogQGFkcAkJOiBBZGFwdGVyIHNvZnRzdGF0ZQorICogQGtpb2MJOiBraW9jIHRoYXQgdGhlIGJ1ZmZlciBuZWVkcyB0byBiZSBhdHRhY2hlZCB0bworICogQHhmZXJsZW4JOiByZXF1aXJlZCBsZW5ndGggZm9yIGJ1ZmZlcgorICoKKyAqIEZpcnN0IHdlIHNlYXJjaCBmb3IgYSBwb29sIHdpdGggc21hbGxlc3QgYnVmZmVyIHRoYXQgaXMgPj0gQHhmZXJsZW4uIElmCisgKiB0aGF0IHBvb2wgaGFzIG5vIGZyZWUgYnVmZmVyLCB3ZSB3aWxsIHRyeSBmb3IgdGhlIG5leHQgYmlnZ2VyIHNpemUuIElmIG5vbmUKKyAqIGlzIGF2YWlsYWJsZSwgd2Ugd2lsbCB0cnkgdG8gYWxsb2NhdGUgdGhlIHNtYWxsZXN0IGJ1ZmZlciB0aGF0IGlzID49CisgKiBAeGZlcmxlbiBhbmQgYXR0YWNoIGl0IHRoZSBwb29sLgorICovCitzdGF0aWMgaW50CittcmFpZF9tbV9hdHRhY2hfYnVmKG1yYWlkX21tYWRwX3QgKmFkcCwgdWlvY190ICpraW9jLCBpbnQgeGZlcmxlbikKK3sKKwltbV9kbWFwb29sX3QJKnBvb2w7CisJaW50CQlyaWdodF9wb29sID0gLTE7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCWk7CisKKwlraW9jLT5wb29sX2luZGV4CT0gLTE7CisJa2lvYy0+YnVmX3ZhZGRyCQk9IE5VTEw7CisJa2lvYy0+YnVmX3BhZGRyCQk9IDA7CisJa2lvYy0+ZnJlZV9idWYJCT0gMDsKKworCS8qCisJICogV2UgbmVlZCB4ZmVybGVuIGFtb3VudCBvZiBtZW1vcnkuIFNlZSBpZiB3ZSBjYW4gZ2V0IGl0IGZyb20gb3VyCisJICogZG1hIHBvb2xzLiBJZiB3ZSBkb24ndCBnZXQgZXhhY3Qgc2l6ZSwgd2Ugd2lsbCB0cnkgYmlnZ2VyIGJ1ZmZlcgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfUE9PTFM7IGkrKykgeworCisJCXBvb2wgPSAmYWRwLT5kbWFfcG9vbF9saXN0W2ldOworCisJCWlmICh4ZmVybGVuID4gcG9vbC0+YnVmX3NpemUpCisJCQljb250aW51ZTsKKworCQlpZiAocmlnaHRfcG9vbCA9PSAtMSkKKwkJCXJpZ2h0X3Bvb2wgPSBpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKCFwb29sLT5pbl91c2UpIHsKKworCQkJcG9vbC0+aW5fdXNlCQk9IDE7CisJCQlraW9jLT5wb29sX2luZGV4CT0gaTsKKwkJCWtpb2MtPmJ1Zl92YWRkcgkJPSBwb29sLT52YWRkcjsKKwkJCWtpb2MtPmJ1Zl9wYWRkcgkJPSBwb29sLT5wYWRkcjsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCS8qCisJICogSWYgeGZlcmxlbiBkb2Vzbid0IG1hdGNoIGFueSBvZiBvdXIgcG9vbHMsIHJldHVybiBlcnJvcgorCSAqLworCWlmIChyaWdodF9wb29sID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogV2UgZGlkIG5vdCBnZXQgYW55IGJ1ZmZlciBmcm9tIHRoZSBwcmVhbGxvY2F0ZWQgcG9vbC4gTGV0IHVzIHRyeQorCSAqIHRvIGFsbG9jYXRlIG9uZSBuZXcgYnVmZmVyLiBOT1RFOiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KKwkgKi8KKwlwb29sID0gJmFkcC0+ZG1hX3Bvb2xfbGlzdFtyaWdodF9wb29sXTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwlraW9jLT5wb29sX2luZGV4CT0gcmlnaHRfcG9vbDsKKwlraW9jLT5mcmVlX2J1ZgkJPSAxOworCWtpb2MtPmJ1Zl92YWRkciAJPSBwY2lfcG9vbF9hbGxvYyhwb29sLT5oYW5kbGUsIEdGUF9LRVJORUwsCisJCQkJCQkJJmtpb2MtPmJ1Zl9wYWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFraW9jLT5idWZfdmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXJhaWRfbW1fYWxsb2Nfa2lvYyAtIFJldHVybnMgYSB1aW9jX3QgZnJvbSBmcmVlIGxpc3QKKyAqIEBhZHAJOiBBZGFwdGVyIHNvZnRzdGF0ZSBmb3IgdGhpcyBtb2R1bGUKKyAqCisgKiBUaGUga2lvY19zZW1hcGhvcmUgaXMgaW5pdGlhbGl6ZWQgd2l0aCBudW1iZXIgb2Yga2lvYyBub2RlcyBpbiB0aGUKKyAqIGZyZWUga2lvYyBwb29sLiBJZiB0aGUga2lvYyBwb29sIGlzIGVtcHR5LCB0aGlzIGZ1bmN0aW9uIGJsb2NrcyB0aWxsCisgKiBhIGtpb2MgYmVjb21lcyBmcmVlLgorICovCitzdGF0aWMgdWlvY190ICoKK21yYWlkX21tX2FsbG9jX2tpb2MobXJhaWRfbW1hZHBfdCAqYWRwKQoreworCXVpb2NfdAkJCSpraW9jOworCXN0cnVjdCBsaXN0X2hlYWQqCWhlYWQ7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlkb3duKCZhZHAtPmtpb2Nfc2VtYXBob3JlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZHAtPmtpb2NfcG9vbF9sb2NrLCBmbGFncyk7CisKKwloZWFkID0gJmFkcC0+a2lvY19wb29sOworCisJaWYgKGxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJdXAoJmFkcC0+a2lvY19zZW1hcGhvcmUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHAtPmtpb2NfcG9vbF9sb2NrLCBmbGFncyk7CisKKwkJY29uX2xvZyhDTF9BTk4sICgibWVnYXJhaWQgY21tOiBraW9jIGxpc3QgZW1wdHkhXG4iKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWtpb2MgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHVpb2NfdCwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgma2lvYy0+bGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHAtPmtpb2NfcG9vbF9sb2NrLCBmbGFncyk7CisKKwltZW1zZXQoKGNhZGRyX3QpKHVuc2lnbmVkIGxvbmcpa2lvYy0+Y21kYnVmLCAwLCBzaXplb2YobWJveDY0X3QpKTsKKwltZW1zZXQoKGNhZGRyX3QpIGtpb2MtPnB0aHJ1MzIsIDAsIHNpemVvZihtcmFpZF9wYXNzdGhydV90KSk7CisKKwlraW9jLT5idWZfdmFkZHIJCT0gTlVMTDsKKwlraW9jLT5idWZfcGFkZHIJCT0gMDsKKwlraW9jLT5wb29sX2luZGV4CT0tMTsKKwlraW9jLT5mcmVlX2J1ZgkJPSAwOworCWtpb2MtPnVzZXJfZGF0YQkJPSBOVUxMOworCWtpb2MtPnVzZXJfZGF0YV9sZW4JPSAwOworCWtpb2MtPnVzZXJfcHRocnUJPSBOVUxMOworCWtpb2MtPnRpbWVkb3V0CQk9IDA7CisKKwlyZXR1cm4ga2lvYzsKK30KKworLyoqCisgKiBtcmFpZF9tbV9kZWFsbG9jX2tpb2MgLSBSZXR1cm4ga2lvYyB0byBmcmVlIHBvb2wKKyAqCisgKiBAYWRwCQk6IEFkYXB0ZXIgc29mdHN0YXRlCisgKiBAa2lvYwk6IHVpb2NfdCBub2RlIHRvIGJlIHJldHVybmVkIHRvIGZyZWUgcG9vbAorICovCitzdGF0aWMgdm9pZAorbXJhaWRfbW1fZGVhbGxvY19raW9jKG1yYWlkX21tYWRwX3QgKmFkcCwgdWlvY190ICpraW9jKQoreworCW1tX2RtYXBvb2xfdAkqcG9vbDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGtpb2MtPnBvb2xfaW5kZXggIT0gLTEpIHsKKwkJcG9vbCA9ICZhZHAtPmRtYV9wb29sX2xpc3Rba2lvYy0+cG9vbF9pbmRleF07CisKKwkJLyogVGhpcyByb3V0aW5lIG1heSBiZSBjYWxsZWQgaW4gbm9uLWlzciBjb250ZXh0IGFsc28gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBXaGlsZSBhdHRhY2hpbmcgdGhlIGRtYSBidWZmZXIsIGlmIHdlIGRpZG4ndCBnZXQgdGhlIAorCQkgKiByZXF1aXJlZCBidWZmZXIgZnJvbSB0aGUgcG9vbCwgd2Ugd291bGQgaGF2ZSBhbGxvY2F0ZWQgCisJCSAqIGl0IGF0IHRoZSBydW4gdGltZSBhbmQgc2V0IHRoZSBmcmVlX2J1ZiBmbGFnLiBXZSBtdXN0IAorCQkgKiBmcmVlIHRoYXQgYnVmZmVyLiBPdGhlcndpc2UsIGp1c3QgbWFyayB0aGF0IHRoZSBidWZmZXIgaXMgCisJCSAqIG5vdCBpbiB1c2UKKwkJICovCisJCWlmIChraW9jLT5mcmVlX2J1ZiA9PSAxKQorCQkJcGNpX3Bvb2xfZnJlZShwb29sLT5oYW5kbGUsIGtpb2MtPmJ1Zl92YWRkciwgCisJCQkJCQkJa2lvYy0+YnVmX3BhZGRyKTsKKwkJZWxzZQorCQkJcG9vbC0+aW5fdXNlID0gMDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJfQorCisJLyogUmV0dXJuIHRoZSBraW9jIHRvIHRoZSBmcmVlIHBvb2wgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRwLT5raW9jX3Bvb2xfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZraW9jLT5saXN0LCAmYWRwLT5raW9jX3Bvb2wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkcC0+a2lvY19wb29sX2xvY2ssIGZsYWdzKTsKKworCS8qIGluY3JlbWVudCB0aGUgZnJlZSBraW9jIGNvdW50ICovCisJdXAoJmFkcC0+a2lvY19zZW1hcGhvcmUpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIGxsZF9pb2N0bCAtIFJvdXRpbmUgdG8gaXNzdWUgaW9jdGwgdG8gbG93IGxldmVsIGRydnIKKyAqCisgKiBAYWRwCQk6IFRoZSBhZGFwdGVyIGhhbmRsZQorICogQGtpb2MJOiBUaGUgaW9jdGwgcGFja2V0IHdpdGgga2VybmVsIGFkZHJlc3NlcworICovCitzdGF0aWMgaW50CitsbGRfaW9jdGwobXJhaWRfbW1hZHBfdCAqYWRwLCB1aW9jX3QgKmtpb2MpCit7CisJaW50CQkJcnZhbDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkqdHAgPSBOVUxMOworCisJa2lvYy0+c3RhdHVzCT0gLUVOT0RBVEE7CisJcnZhbAkJPSBhZHAtPmlzc3VlX3Vpb2MoYWRwLT5kcnZyX2RhdGEsIGtpb2MsIElPQ1RMX0lTU1VFKTsKKworCWlmIChydmFsKSByZXR1cm4gcnZhbDsKKworCS8qCisJICogU3RhcnQgdGhlIHRpbWVyCisJICovCisJaWYgKGFkcC0+dGltZW91dCA+IDApIHsKKwkJdHAJCT0gJnRpbWVyOworCQlpbml0X3RpbWVyKHRwKTsKKworCQl0cC0+ZnVuY3Rpb24JPSBsbGRfdGltZWRvdXQ7CisJCXRwLT5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpa2lvYzsKKwkJdHAtPmV4cGlyZXMJPSBqaWZmaWVzICsgYWRwLT50aW1lb3V0ICogSFo7CisKKwkJYWRkX3RpbWVyKHRwKTsKKwl9CisKKwkvKgorCSAqIFdhaXQgdGlsbCB0aGUgbG93IGxldmVsIGRyaXZlciBjb21wbGV0ZXMgdGhlIGlvY3RsLiBBZnRlciB0aGlzCisJICogY2FsbCwgdGhlIGlvY3RsIGVpdGhlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IG9yIHRpbWVkb3V0LgorCSAqLworCXdhaXRfZXZlbnQod2FpdF9xLCAoa2lvYy0+c3RhdHVzICE9IC1FTk9EQVRBKSk7CisJaWYgKHRwKSB7CisJCWRlbF90aW1lcl9zeW5jKHRwKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBjb21tYW5kIGhhZCB0aW1lZG91dCwgd2UgbWFyayB0aGUgY29udHJvbGxlciBvZmZsaW5lCisJICogYmVmb3JlIHJldHVybmluZworCSAqLworCWlmIChraW9jLT50aW1lZG91dCkgeworCQlhZHAtPnF1aWVzY2VudCA9IDA7CisJfQorCisJcmV0dXJuIGtpb2MtPnN0YXR1czsKK30KKworCisvKioKKyAqIGlvY3RsX2RvbmUgLSBjYWxsYmFjayBmcm9tIHRoZSBsb3cgbGV2ZWwgZHJpdmVyCisgKgorICogQGtpb2MJOiBjb21wbGV0ZWQgaW9jdGwgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkCitpb2N0bF9kb25lKHVpb2NfdCAqa2lvYykKK3sKKwl1aW50MzJfdAlhZGFwbm87CisJaW50CQlpdGVyYXRvcjsKKwltcmFpZF9tbWFkcF90KglhZGFwdGVyOworCisJLyoKKwkgKiBXaGVuIHRoZSBraW9jIHJldHVybnMgZnJvbSBkcml2ZXIsIG1ha2Ugc3VyZSBpdCBzdGlsbCBkb2Vzbid0CisJICogaGF2ZSBFTk9EQVRBIGluIHN0YXR1cy4gT3RoZXJ3aXNlLCBkcml2ZXIgd2lsbCBoYW5nIG9uIHdhaXRfZXZlbnQKKwkgKiBmb3JldmVyCisJICovCisJaWYgKGtpb2MtPnN0YXR1cyA9PSAtRU5PREFUQSkgeworCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJIm1lZ2FyYWlkIGNtbTogbGxkIGRpZG4ndCBjaGFuZ2Ugc3RhdHVzIVxuIikpOworCisJCWtpb2MtPnN0YXR1cyA9IC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIGtpb2Mgd2FzIHRpbWVkb3V0IGJlZm9yZS4gSWYgc28sIG5vYm9keSBpcyB3YWl0aW5nCisJICogb24gdGhpcyBraW9jLiBXZSBkb24ndCBoYXZlIHRvIHdha2UgdXAgYW55Ym9keS4gSW5zdGVhZCwgd2UganVzdAorCSAqIGhhdmUgdG8gZnJlZSB0aGUga2lvYworCSAqLworCWlmIChraW9jLT50aW1lZG91dCkgeworCQlpdGVyYXRvcgk9IDA7CisJCWFkYXB0ZXIJCT0gTlVMTDsKKwkJYWRhcG5vCQk9IGtpb2MtPmFkYXBubzsKKworCQljb25fbG9nKENMX0FOTiwgKCBLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkIGNtbTogY29tcGxldGVkICIKKwkJCQkJImlvY3RsIHRoYXQgd2FzIHRpbWVkb3V0IGJlZm9yZVxuIikpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcHRlciwgJmFkYXB0ZXJzX2xpc3RfZywgbGlzdCkgeworCQkJaWYgKGl0ZXJhdG9yKysgPT0gYWRhcG5vKSBicmVhazsKKwkJfQorCisJCWtpb2MtPnRpbWVkb3V0ID0gMDsKKworCQlpZiAoYWRhcHRlcikgeworCQkJbXJhaWRfbW1fZGVhbGxvY19raW9jKCBhZGFwdGVyLCBraW9jICk7CisJCX0KKwl9CisJZWxzZSB7CisJCXdha2VfdXAoJndhaXRfcSk7CisJfQorfQorCisKKy8qCisgKiBsbGRfdGltZWRvdXQJOiBjYWxsYmFjayBmcm9tIHRoZSBleHBpcmVkIHRpbWVyCisgKgorICogQHB0cgkJOiBpb2N0bCBwYWNrZXQgdGhhdCB0aW1lZCBvdXQKKyAqLworc3RhdGljIHZvaWQKK2xsZF90aW1lZG91dCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwl1aW9jX3QgKmtpb2MJPSAodWlvY190ICopcHRyOworCisJa2lvYy0+c3RhdHVzIAk9IC1FVElNRTsKKwlraW9jLT50aW1lZG91dAk9IDE7CisKKwljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORyAibWVnYXJhaWQgY21tOiBpb2N0bCB0aW1lZCBvdXRcbiIpKTsKKworCXdha2VfdXAoJndhaXRfcSk7Cit9CisKKworLyoqCisgKiBraW9jX3RvX21pbWQJOiBDb252ZXJ0ZXIgZnJvbSBuZXcgYmFjayB0byBvbGQgZm9ybWF0CisgKgorICogQGtpb2MJOiBLZXJuZWwgc3BhY2UgSU9DVEwgcGFja2V0IChzdWNjZXNzZnVsbHkgaXNzdWVkKQorICogQG1pbWQJOiBVc2VyIHNwYWNlIE1JTUQgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQKK2tpb2NfdG9fbWltZCh1aW9jX3QgKmtpb2MsIG1pbWRfdCBfX3VzZXIgKm1pbWQpCit7CisJbWltZF90CQkJa21pbWQ7CisJdWludDhfdAkJCW9wY29kZTsKKwl1aW50OF90CQkJc3Vib3Bjb2RlOworCisJbWJveDY0X3QJCSptYm94NjQ7CisJbXJhaWRfcGFzc3RocnVfdAlfX3VzZXIgKnVwdGhydTMyOworCW1yYWlkX3Bhc3N0aHJ1X3QJKmtwdGhydTMyOworCW1jb250cm9sbGVyX3QJCWNpbmZvOworCW1yYWlkX2hiYV9pbmZvX3QJKmhpbmZvOworCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmttaW1kLCBtaW1kLCBzaXplb2YobWltZF90KSkpCisJCXJldHVybiAoLUVGQVVMVCk7CisKKwlvcGNvZGUJCT0ga21pbWQudWkuZmNzLm9wY29kZTsKKwlzdWJvcGNvZGUJPSBrbWltZC51aS5mY3Muc3Vib3Bjb2RlOworCisJaWYgKG9wY29kZSA9PSAweDgyKSB7CisJCXN3aXRjaCAoc3Vib3Bjb2RlKSB7CisKKwkJY2FzZSBNRUdBSU9DX1FBREFQSU5GTzoKKworCQkJaGluZm8gPSAobXJhaWRfaGJhX2luZm9fdCAqKSh1bnNpZ25lZCBsb25nKQorCQkJCQlraW9jLT5idWZfdmFkZHI7CisKKwkJCWhpbmZvX3RvX2NpbmZvKGhpbmZvLCAmY2luZm8pOworCisJCQlpZiAoY29weV90b191c2VyKGttaW1kLmRhdGEsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQkJcmV0dXJuICgtRUZBVUxUKTsKKworCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwltYm94NjQgPSAobWJveDY0X3QgKikodW5zaWduZWQgbG9uZylraW9jLT5jbWRidWY7CisKKwlpZiAoa2lvYy0+dXNlcl9wdGhydSkgeworCisJCXVwdGhydTMyID0ga2lvYy0+dXNlcl9wdGhydTsKKwkJa3B0aHJ1MzIgPSBraW9jLT5wdGhydTMyOworCisJCWlmIChjb3B5X3RvX3VzZXIoJnVwdGhydTMyLT5zY3Npc3RhdHVzLAorCQkJCQkma3B0aHJ1MzItPnNjc2lzdGF0dXMsCisJCQkJCXNpemVvZih1aW50OF90KSkpIHsKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCX0KKwl9CisKKwlpZiAoa2lvYy0+dXNlcl9kYXRhKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoa2lvYy0+dXNlcl9kYXRhLCBraW9jLT5idWZfdmFkZHIsCisJCQkJCWtpb2MtPnVzZXJfZGF0YV9sZW4pKSB7CisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQl9CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcigmbWltZC0+bWJveFsxN10sCisJCQkmbWJveDY0LT5tYm94MzIuc3RhdHVzLCBzaXplb2YodWludDhfdCkpKSB7CisJCXJldHVybiAoLUVGQVVMVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBoaW5mb190b19jaW5mbyAtIENvbnZlcnQgbmV3IGZvcm1hdCBoYmEgaW5mbyBpbnRvIG9sZCBmb3JtYXQKKyAqCisgKiBAaGluZm8JOiBOZXcgZm9ybWF0LCBtb3JlIGNvbXByZWhlbnNpdmUgYWRhcHRlciBpbmZvCisgKiBAY2luZm8JOiBPbGQgZm9ybWF0IGFkYXB0ZXIgaW5mbyB0byBzdXBwb3J0IG1pbWRfdCBhcHBzCisgKi8KK3N0YXRpYyB2b2lkCitoaW5mb190b19jaW5mbyhtcmFpZF9oYmFfaW5mb190ICpoaW5mbywgbWNvbnRyb2xsZXJfdCAqY2luZm8pCit7CisJaWYgKCFoaW5mbyB8fCAhY2luZm8pCisJCXJldHVybjsKKworCWNpbmZvLT5iYXNlCQk9IGhpbmZvLT5iYXNlcG9ydDsKKwljaW5mby0+aXJxCQk9IGhpbmZvLT5pcnE7CisJY2luZm8tPm51bWxkcnYJCT0gaGluZm8tPm51bV9sZHJ2OworCWNpbmZvLT5wY2lidXMJCT0gaGluZm8tPnBjaV9idXM7CisJY2luZm8tPnBjaWRldgkJPSBoaW5mby0+cGNpX3Nsb3Q7CisJY2luZm8tPnBjaWZ1bgkJPSBQQ0lfRlVOQyhoaW5mby0+cGNpX2Rldl9mbik7CisJY2luZm8tPnBjaWlkCQk9IGhpbmZvLT5wY2lfZGV2aWNlX2lkOworCWNpbmZvLT5wY2l2ZW5kb3IJPSBoaW5mby0+cGNpX3ZlbmRvcl9pZDsKKwljaW5mby0+cGNpc2xvdAkJPSBoaW5mby0+cGNpX3Nsb3Q7CisJY2luZm8tPnVpZAkJPSBoaW5mby0+dW5pcXVlX2lkOworfQorCisKKy8qCisgKiBtcmFpZF9tbV9yZWdpc3Rlcl9hZHAgLSBSZWdpc3RyYXRpb24gcm91dGluZSBmb3IgbG93IGxldmVsIGRydnJzCisgKgorICogQGFkcAk6IEFkYXB0ZXIgb2JqZWpjdAorICovCitpbnQKK21yYWlkX21tX3JlZ2lzdGVyX2FkcChtcmFpZF9tbWFkcF90ICpsbGRfYWRwKQoreworCW1yYWlkX21tYWRwX3QJKmFkYXB0ZXI7CisJbWJveDY0X3QJKm1ib3hfbGlzdDsKKwl1aW9jX3QJCSpraW9jOworCXVpbnQzMl90CXJ2YWw7CisJaW50CQlpOworCisKKwlpZiAobGxkX2FkcC0+ZHJ2cl90eXBlICE9IERSVlJUWVBFX01CT1gpCisJCXJldHVybiAoLUVJTlZBTCk7CisKKwlhZGFwdGVyID0ga21hbGxvYyhzaXplb2YobXJhaWRfbW1hZHBfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFhZGFwdGVyKSB7CisJCXJ2YWwgPSAtRU5PTUVNOworCQlnb3RvIG1lbWFsbG9jX2Vycm9yOworCX0KKworCW1lbXNldChhZGFwdGVyLCAwLCBzaXplb2YobXJhaWRfbW1hZHBfdCkpOworCisJYWRhcHRlci0+dW5pcXVlX2lkCT0gbGxkX2FkcC0+dW5pcXVlX2lkOworCWFkYXB0ZXItPmRydnJfdHlwZQk9IGxsZF9hZHAtPmRydnJfdHlwZTsKKwlhZGFwdGVyLT5kcnZyX2RhdGEJPSBsbGRfYWRwLT5kcnZyX2RhdGE7CisJYWRhcHRlci0+cGRldgkJPSBsbGRfYWRwLT5wZGV2OworCWFkYXB0ZXItPmlzc3VlX3Vpb2MJPSBsbGRfYWRwLT5pc3N1ZV91aW9jOworCWFkYXB0ZXItPnRpbWVvdXQJPSBsbGRfYWRwLT50aW1lb3V0OworCWFkYXB0ZXItPm1heF9raW9jCT0gbGxkX2FkcC0+bWF4X2tpb2M7CisJYWRhcHRlci0+cXVpZXNjZW50CT0gMTsKKworCS8qCisJICogQWxsb2NhdGUgc2luZ2xlIGJsb2NrcyBvZiBtZW1vcnkgZm9yIGFsbCByZXF1aXJlZCBraW9jcywKKwkgKiBtYWlsYm94ZXMgYW5kIHBhc3N0aHJ1IHN0cnVjdHVyZXMuCisJICovCisJYWRhcHRlci0+a2lvY19saXN0CT0ga21hbGxvYyhzaXplb2YodWlvY190KSAqIGxsZF9hZHAtPm1heF9raW9jLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJYWRhcHRlci0+bWJveF9saXN0CT0ga21hbGxvYyhzaXplb2YobWJveDY0X3QpICogbGxkX2FkcC0+bWF4X2tpb2MsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlhZGFwdGVyLT5wdGhydV9kbWFfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZSgibWVnYXJhaWQgbW0gcHRocnUgcG9vbCIsCisJCQkJCQlhZGFwdGVyLT5wZGV2LAorCQkJCQkJc2l6ZW9mKG1yYWlkX3Bhc3N0aHJ1X3QpLAorCQkJCQkJMTYsIDApOworCisJaWYgKCFhZGFwdGVyLT5raW9jX2xpc3QgfHwgIWFkYXB0ZXItPm1ib3hfbGlzdCB8fAorCQkJIWFkYXB0ZXItPnB0aHJ1X2RtYV9wb29sKSB7CisKKwkJY29uX2xvZyhDTF9BTk4sIChLRVJOX1dBUk5JTkcKKwkJCSJtZWdhcmFpZCBjbW06IG91dCBvZiBtZW1vcnksICVzICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlfX0xJTkVfXykpOworCisJCXJ2YWwgPSAoLUVOT01FTSk7CisKKwkJZ290byBtZW1hbGxvY19lcnJvcjsKKwl9CisKKwkvKgorCSAqIFNsaWNlIGtpb2NfbGlzdCBhbmQgbWFrZSBhIGtpb2NfcG9vbCB3aXRoIHRoZSBpbmRpdmlkaXVhbCBraW9jcworCSAqLworCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5raW9jX3Bvb2wpOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5raW9jX3Bvb2xfbG9jayk7CisJc2VtYV9pbml0KCZhZGFwdGVyLT5raW9jX3NlbWFwaG9yZSwgbGxkX2FkcC0+bWF4X2tpb2MpOworCisJbWJveF9saXN0CT0gKG1ib3g2NF90ICopYWRhcHRlci0+bWJveF9saXN0OworCisJZm9yIChpID0gMDsgaSA8IGxsZF9hZHAtPm1heF9raW9jOyBpKyspIHsKKworCQlraW9jCQk9IGFkYXB0ZXItPmtpb2NfbGlzdCArIGk7CisJCWtpb2MtPmNtZGJ1Zgk9ICh1aW50NjRfdCkodW5zaWduZWQgbG9uZykobWJveF9saXN0ICsgaSk7CisJCWtpb2MtPnB0aHJ1MzIJPSBwY2lfcG9vbF9hbGxvYyhhZGFwdGVyLT5wdGhydV9kbWFfcG9vbCwKKwkJCQkJCUdGUF9LRVJORUwsICZraW9jLT5wdGhydTMyX2gpOworCisJCWlmICgha2lvYy0+cHRocnUzMikgeworCisJCQljb25fbG9nKENMX0FOTiwgKEtFUk5fV0FSTklORworCQkJCSJtZWdhcmFpZCBjbW06IG91dCBvZiBtZW1vcnksICVzICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CisKKwkJCXJ2YWwgPSAoLUVOT01FTSk7CisKKwkJCWdvdG8gcHRocnVfZG1hX3Bvb2xfZXJyb3I7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZraW9jLT5saXN0LCAmYWRhcHRlci0+a2lvY19wb29sKTsKKwl9CisKKwkvLyBTZXR1cCB0aGUgZG1hIHBvb2xzIGZvciBkYXRhIGJ1ZmZlcnMKKwlpZiAoKHJ2YWwgPSBtcmFpZF9tbV9zZXR1cF9kbWFfcG9vbHMoYWRhcHRlcikpICE9IDApIHsKKwkJZ290byBkbWFfcG9vbF9lcnJvcjsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZhZGFwdGVyLT5saXN0LCAmYWRhcHRlcnNfbGlzdF9nKTsKKworCWFkYXB0ZXJzX2NvdW50X2crKzsKKworCXJldHVybiAwOworCitkbWFfcG9vbF9lcnJvcjoKKwkvKiBEbyBub3RoaW5nICovCisKK3B0aHJ1X2RtYV9wb29sX2Vycm9yOgorCisJZm9yIChpID0gMDsgaSA8IGxsZF9hZHAtPm1heF9raW9jOyBpKyspIHsKKwkJa2lvYyA9IGFkYXB0ZXItPmtpb2NfbGlzdCArIGk7CisJCWlmIChraW9jLT5wdGhydTMyKSB7CisJCQlwY2lfcG9vbF9mcmVlKGFkYXB0ZXItPnB0aHJ1X2RtYV9wb29sLCBraW9jLT5wdGhydTMyLAorCQkJCWtpb2MtPnB0aHJ1MzJfaCk7CisJCX0KKwl9CisKK21lbWFsbG9jX2Vycm9yOgorCisJaWYgKGFkYXB0ZXItPmtpb2NfbGlzdCkKKwkJa2ZyZWUoYWRhcHRlci0+a2lvY19saXN0KTsKKworCWlmIChhZGFwdGVyLT5tYm94X2xpc3QpCisJCWtmcmVlKGFkYXB0ZXItPm1ib3hfbGlzdCk7CisKKwlpZiAoYWRhcHRlci0+cHRocnVfZG1hX3Bvb2wpCisJCXBjaV9wb29sX2Rlc3Ryb3koYWRhcHRlci0+cHRocnVfZG1hX3Bvb2wpOworCisJaWYgKGFkYXB0ZXIpCisJCWtmcmVlKGFkYXB0ZXIpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoqCisgKiBtcmFpZF9tbV9hZGFwdGVyX2FwcF9oYW5kbGUgLSByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIGhhbmRsZSBmb3IgdGhpcyBhZGFwdGVyCisgKgorICogRm9yIHRoZSBnaXZlbiBkcml2ZXIgZGF0YSwgbG9jYXRlIHRoZSBhZGFkcHRlciBpbiBvdXIgZ2xvYmFsIGxpc3QgYW5kCisgKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlLCB3aGljaCBpcyBhbHNvIHVzZWQgYnkgYXBwbGljYXRpb25zIHRvCisgKiB1bmlxdWVseSBpZGVudGlmeSBhbiBhZGFwdGVyLgorICoKKyAqIEBwYXJhbSB1bmlxdWVfaWQgOiBhZGFwdGVyIHVuaXF1ZSBpZGVudGlmaWVyCisgKgorICogQHJldHVybiBhZGFwdGVyIGhhbmRsZSBpZiBmb3VuZCBpbiB0aGUgbGlzdAorICogQHJldHVybiAwIGlmIGFkYXB0ZXIgY291bGQgbm90IGJlIGxvY2F0ZWQsIHNob3VsZCBuZXZlciBoYXBwZW4gdGhvdWdoCisgKi8KK3VpbnQzMl90CittcmFpZF9tbV9hZGFwdGVyX2FwcF9oYW5kbGUodWludDMyX3QgdW5pcXVlX2lkKQoreworCW1yYWlkX21tYWRwX3QJKmFkYXB0ZXI7CisJbXJhaWRfbW1hZHBfdAkqdG1wOworCWludAkJaW5kZXggPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFkYXB0ZXIsIHRtcCwgJmFkYXB0ZXJzX2xpc3RfZywgbGlzdCkgeworCisJCWlmIChhZGFwdGVyLT51bmlxdWVfaWQgPT0gdW5pcXVlX2lkKSB7CisKKwkJCXJldHVybiBNS0FEQVAoaW5kZXgpOworCQl9CisKKwkJaW5kZXgrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIG1yYWlkX21tX3NldHVwX2RtYV9wb29scyAtIFNldCB1cCBkbWEgYnVmZmVyIHBvb2xzIHBlciBhZGFwdGVyCisgKgorICogQGFkcAk6IEFkYXB0ZXIgc29mdHN0YXRlCisgKgorICogV2UgbWFpbnRhaW4gYSBwb29sIG9mIGRtYSBidWZmZXJzIHBlciBlYWNoIGFkYXB0ZXIuIEVhY2ggcG9vbCBoYXMgb25lCisgKiBidWZmZXIuIEUuZywgd2UgbWF5IGhhdmUgNSBkbWEgcG9vbHMgLSBvbmUgZWFjaCBmb3IgNGssIDhrIC4uLiA2NGsgYnVmZmVycy4KKyAqIFdlIGhhdmUganVzdCBvbmUgNGsgYnVmZmVyIGluIDRrIHBvb2wsIG9uZSA4ayBidWZmZXIgaW4gOGsgcG9vbCBldGMuIFdlCisgKiBkb250JyB3YW50IHRvIHdhc3RlIHRvbyBtdWNoIG1lbW9yeSBieSBhbGxvY2F0aW5nIG1vcmUgYnVmZmVycyBwZXIgZWFjaAorICogcG9vbC4KKyAqLworc3RhdGljIGludAorbXJhaWRfbW1fc2V0dXBfZG1hX3Bvb2xzKG1yYWlkX21tYWRwX3QgKmFkcCkKK3sKKwltbV9kbWFwb29sX3QJKnBvb2w7CisJaW50CQlidWZzaXplOworCWludAkJaTsKKworCS8qCisJICogQ3JlYXRlIE1BWF9ETUFfUE9PTFMgbnVtYmVyIG9mIHBvb2xzCisJICovCisJYnVmc2l6ZSA9IE1SQUlEX01NX0lOSVRfQlVGRl9TSVpFOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfUE9PTFM7IGkrKyl7CisKKwkJcG9vbCA9ICZhZHAtPmRtYV9wb29sX2xpc3RbaV07CisKKwkJcG9vbC0+YnVmX3NpemUgPSBidWZzaXplOworCQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CisKKwkJcG9vbC0+aGFuZGxlID0gcGNpX3Bvb2xfY3JlYXRlKCJtZWdhcmFpZCBtbSBkYXRhIGJ1ZmZlciIsCisJCQkJCQlhZHAtPnBkZXYsIGJ1ZnNpemUsIDE2LCAwKTsKKworCQlpZiAoIXBvb2wtPmhhbmRsZSkgeworCQkJZ290byBkbWFfcG9vbF9zZXR1cF9lcnJvcjsKKwkJfQorCisJCXBvb2wtPnZhZGRyID0gcGNpX3Bvb2xfYWxsb2MocG9vbC0+aGFuZGxlLCBHRlBfS0VSTkVMLAorCQkJCQkJCSZwb29sLT5wYWRkcik7CisKKwkJaWYgKCFwb29sLT52YWRkcikKKwkJCWdvdG8gZG1hX3Bvb2xfc2V0dXBfZXJyb3I7CisKKwkJYnVmc2l6ZSA9IGJ1ZnNpemUgKiAyOworCX0KKworCXJldHVybiAwOworCitkbWFfcG9vbF9zZXR1cF9lcnJvcjoKKworCW1yYWlkX21tX3RlYXJkb3duX2RtYV9wb29scyhhZHApOworCXJldHVybiAoLUVOT01FTSk7Cit9CisKKworLyoKKyAqIG1yYWlkX21tX3VucmVnaXN0ZXJfYWRwIC0gVW5yZWdpc3RlciByb3V0aW5lIGZvciBsb3cgbGV2ZWwgZHJpdmVycworICoJCQkJICBBc3N1bWUgbm8gb3V0c3RhbmRpbmcgaW9jdGxzIHRvIGxsZHMuCisgKgorICogQHVuaXF1ZV9pZAk6IFVJRCBvZiB0aGUgYWRwYXRlcgorICovCitpbnQKK21yYWlkX21tX3VucmVnaXN0ZXJfYWRwKHVpbnQzMl90IHVuaXF1ZV9pZCkKK3sKKwltcmFpZF9tbWFkcF90CSphZGFwdGVyOworCW1yYWlkX21tYWRwX3QJKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhZGFwdGVyLCB0bXAsICZhZGFwdGVyc19saXN0X2csIGxpc3QpIHsKKworCisJCWlmIChhZGFwdGVyLT51bmlxdWVfaWQgPT0gdW5pcXVlX2lkKSB7CisKKwkJCWFkYXB0ZXJzX2NvdW50X2ctLTsKKworCQkJbGlzdF9kZWxfaW5pdCgmYWRhcHRlci0+bGlzdCk7CisKKwkJCW1yYWlkX21tX2ZyZWVfYWRwX3Jlc291cmNlcyhhZGFwdGVyKTsKKworCQkJa2ZyZWUoYWRhcHRlcik7CisKKwkJCWNvbl9sb2coQ0xfQU5OLCAoCisJCQkJIm1lZ2FyYWlkIGNtbTogVW5yZWdpc3RlcmVkIG9uZSBhZGFwdGVyOiUjeFxuIiwKKwkJCQl1bmlxdWVfaWQpKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gKC1FTk9ERVYpOworfQorCisvKioKKyAqIG1yYWlkX21tX2ZyZWVfYWRwX3Jlc291cmNlcyAtIEZyZWUgYWRhcHRlciBzb2Z0c3RhdGUKKyAqCisgKiBAYWRwCTogQWRhcHRlciBzb2Z0c3RhdGUKKyAqLworc3RhdGljIHZvaWQKK21yYWlkX21tX2ZyZWVfYWRwX3Jlc291cmNlcyhtcmFpZF9tbWFkcF90ICphZHApCit7CisJdWlvY190CSpraW9jOworCWludAlpOworCisJbXJhaWRfbW1fdGVhcmRvd25fZG1hX3Bvb2xzKGFkcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRwLT5tYXhfa2lvYzsgaSsrKSB7CisKKwkJa2lvYyA9IGFkcC0+a2lvY19saXN0ICsgaTsKKworCQlwY2lfcG9vbF9mcmVlKGFkcC0+cHRocnVfZG1hX3Bvb2wsIGtpb2MtPnB0aHJ1MzIsCisJCQkJa2lvYy0+cHRocnUzMl9oKTsKKwl9CisKKwlrZnJlZShhZHAtPmtpb2NfbGlzdCk7CisKKwlrZnJlZShhZHAtPm1ib3hfbGlzdCk7CisKKwlwY2lfcG9vbF9kZXN0cm95KGFkcC0+cHRocnVfZG1hX3Bvb2wpOworCisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBtcmFpZF9tbV90ZWFyZG93bl9kbWFfcG9vbHMgLSBGcmVlIGFsbCBwZXIgYWRhcHRlciBkbWEgYnVmZmVycworICoKKyAqIEBhZHAJOiBBZGFwdGVyIHNvZnRzdGF0ZQorICovCitzdGF0aWMgdm9pZAorbXJhaWRfbW1fdGVhcmRvd25fZG1hX3Bvb2xzKG1yYWlkX21tYWRwX3QgKmFkcCkKK3sKKwlpbnQJCWk7CisJbW1fZG1hcG9vbF90CSpwb29sOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfUE9PTFM7IGkrKykgeworCisJCXBvb2wgPSAmYWRwLT5kbWFfcG9vbF9saXN0W2ldOworCisJCWlmIChwb29sLT5oYW5kbGUpIHsKKworCQkJaWYgKHBvb2wtPnZhZGRyKQorCQkJCXBjaV9wb29sX2ZyZWUocG9vbC0+aGFuZGxlLCBwb29sLT52YWRkciwKKwkJCQkJCQlwb29sLT5wYWRkcik7CisKKwkJCXBjaV9wb29sX2Rlc3Ryb3kocG9vbC0+aGFuZGxlKTsKKwkJCXBvb2wtPmhhbmRsZSA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogbXJhaWRfbW1faW5pdAk6IE1vZHVsZSBlbnRyeSBwb2ludAorICovCitzdGF0aWMgaW50IF9faW5pdAorbXJhaWRfbW1faW5pdCh2b2lkKQoreworCS8vIEFubm91bmNlIHRoZSBkcml2ZXIgdmVyc2lvbgorCWNvbl9sb2coQ0xfQU5OLCAoS0VSTl9JTkZPICJtZWdhcmFpZCBjbW06ICVzICVzXG4iLAorCQlMU0lfQ09NTU9OX01PRF9WRVJTSU9OLCBMU0lfQ09NTU9OX01PRF9FWFRfVkVSU0lPTikpOworCisJbWFqb3JubyA9IHJlZ2lzdGVyX2NocmRldigwLCAibWVnYWRldiIsICZsc2lfZm9wcyk7CisKKwlpZiAobWFqb3JubyA8IDApIHsKKwkJY29uX2xvZyhDTF9BTk4sICgibWVnYXJhaWQgY21tOiBjYW5ub3QgZ2V0IG1ham9yXG4iKSk7CisJCXJldHVybiBtYWpvcm5vOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRfcSk7CisKKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlcnNfbGlzdF9nKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbXJhaWRfbW1fY29tcGF0X2lvY3RsCTogMzJiaXQgdG8gNjRiaXQgaW9jdGwgY29udmVyc2lvbiByb3V0aW5lCisgKi8KKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZworbXJhaWRfbW1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKwlsb2NrX2tlcm5lbCgpOworCWVyciA9IG1yYWlkX21tX2lvY3RsKE5VTEwsIGZpbGVwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworLyoqCisgKiBtcmFpZF9tbV9leGl0CTogTW9kdWxlIGV4aXQgcG9pbnQKKyAqLworc3RhdGljIHZvaWQgX19leGl0CittcmFpZF9tbV9leGl0KHZvaWQpCit7CisJY29uX2xvZyhDTF9ETEVWRUwxICwgKCJleGl0aW5nIGNvbW1vbiBtb2RcbiIpKTsKKworCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9ybm8sICJtZWdhZGV2Iik7Cit9CisKK21vZHVsZV9pbml0KG1yYWlkX21tX2luaXQpOworbW9kdWxlX2V4aXQobXJhaWRfbW1fZXhpdCk7CisKKy8qIHZpOiBzZXQgdHM9OCBzdz04IHR3PTc4OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhhMDAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKgorICoJCQlMaW51eCBNZWdhUkFJRCBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgkgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZJTEUJCTogbWVnYXJhaWRfbW0uaAorICovCisKKyNpZm5kZWYgTUVHQVJBSURfTU1fSAorI2RlZmluZSBNRUdBUkFJRF9NTV9ICisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCisjaW5jbHVkZSAibWJveF9kZWZzLmgiCisjaW5jbHVkZSAibWVnYXJhaWRfaW9jdGwuaCIKKworCisjZGVmaW5lIExTSV9DT01NT05fTU9EX1ZFUlNJT04JIjIuMjAuMi41IgorI2RlZmluZSBMU0lfQ09NTU9OX01PRF9FWFRfVkVSU0lPTglcCisJCSIoUmVsZWFzZSBEYXRlOiBGcmkgSmFuIDIxIDAwOjAxOjAzIEVTVCAyMDA1KSIKKworCisjZGVmaW5lIExTSV9EQkdMVkwJCQlkYmdsZXZlbAorCisvLyBUaGUgc21hbGxlc3QgZG1hIHBvb2wKKyNkZWZpbmUgTVJBSURfTU1fSU5JVF9CVUZGX1NJWkUJCTQwOTYKKworLyoqCisgKiBtaW1kX3QJOiBPbGQgc3R5bGUgaW9jdGwgcGFja2V0IHN0cnVjdHVyZSAoZGVwcmVjYXRlZCkKKyAqCisgKiBAaW5sZW4JOgorICogQG91dGxlbgk6CisgKiBAZmNhCQk6CisgKiBAb3Bjb2RlCToKKyAqIEBzdWJvcGNvZGUJOgorICogQGFkYXBubwk6CisgKiBAYnVmZmVyCToKKyAqIEBwYWQJCToKKyAqIEBsZW5ndGgJOgorICogQG1ib3gJOgorICogQHB0aHJ1CToKKyAqIEBkYXRhCToKKyAqIEBwYWQJCToKKyAqCisgKiBOb3RlCQk6IFRoaXMgc3RydWN0dXJlIGlzIERFUFJFQ0FURUQuIE5ldyBhcHBsaWNhdGlvbnMgbXVzdCB1c2UKKyAqCQk6IHVpb2NfdCBzdHJ1Y3R1cmUgaW5zdGVhZC4gQWxsIG5ldyBoYmEgZHJpdmVycyB1c2UgdGhlIG5ldworICoJCTogZm9ybWF0LiBJZiB3ZSBnZXQgdGhpcyBtaW1kIHBhY2tldCwgd2Ugd2lsbCBjb252ZXJ0IGl0IGludG8KKyAqCQk6IG5ldyB1aW9jX3QgZm9ybWF0IGFuZCBzZW5kIGl0IHRvIHRoZSBoYmEgZHJpdmVycy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBtaW1kIHsKKworCXVpbnQzMl90IGlubGVuOworCXVpbnQzMl90IG91dGxlbjsKKworCXVuaW9uIHsKKwkJdWludDhfdCBmY2FbMTZdOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBvcGNvZGU7CisJCQl1aW50OF90IHN1Ym9wY29kZTsKKwkJCXVpbnQxNl90IGFkYXBubzsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCQl1aW50OF90IF9fdXNlciAqYnVmZmVyOworCQkJdWludDhfdCBwYWRbNF07CisjZW5kaWYKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisJCQl1aW50OF90IF9fdXNlciAqYnVmZmVyOworI2VuZGlmCisJCQl1aW50MzJfdCBsZW5ndGg7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZjczsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1aTsKKworCXVpbnQ4X3QgbWJveFsxOF07CQkvKiAxNiBieXRlcyArIDIgc3RhdHVzIGJ5dGVzICovCisJbXJhaWRfcGFzc3RocnVfdCBwdGhydTsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwljaGFyIF9fdXNlciAqZGF0YTsJCS8qIGJ1ZmZlciA8PSA0MDk2IGZvciAweDgwIGNvbW1hbmRzICovCisJY2hhciBwYWRbNF07CisjZW5kaWYKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisJY2hhciBfX3VzZXIgKmRhdGE7CisjZW5kaWYKKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSltaW1kX3Q7CisKKyNlbmRpZiAvLyBNRUdBUkFJRF9NTV9ICisKKy8vIHZpOiBzZXQgdHM9OCBzdz04IHR3PTc4OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lc2guYyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmM2E3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKQEAgLTAsMCArMSwyMDYyIEBACisvKgorICogU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciB0aGUgTUVTSCAoTWFjaW50b3NoIEVuaGFuY2VkIFNDU0kgSGFyZHdhcmUpCisgKiBidXMgYWRhcHRvciBmb3VuZCBvbiBQb3dlciBNYWNpbnRvc2ggY29tcHV0ZXJzLgorICogV2UgYXNzdW1lIHRoZSBNRVNIIGlzIGNvbm5lY3RlZCB0byBhIERCRE1BIChkZXNjcmlwdG9yLWJhc2VkIERNQSkKKyAqIGNvbnRyb2xsZXIuCisgKgorICogUGF1bCBNYWNrZXJyYXMsIEF1Z3VzdCAxOTk2LgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICoKKyAqIEFwci4gMjEgMjAwMiAgLSBCZW5ICQlSZXdvcmsgYnVzIHJlc2V0IGNvZGUgZm9yIG5ldyBlcnJvciBoYW5kbGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBkZWxheSBhZnRlciBpbml0aWFsIGJ1cyByZXNldAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgbW9kdWxlIHBhcmFtZXRlcnMKKyAqCisgKiBTZXAuIDI3IDIwMDMgIC0gQmVuSAkJTW92ZSB0byBuZXcgZHJpdmVyIG1vZGVsLCBmaXggc29tZSB3cml0ZSBwb3N0aW5nCisgKgkJCQlpc3N1ZXMKKyAqIFRvIGRvOgorICogLSBoYW5kbGUgYWJvcnRzIGNvcnJlY3RseQorICogLSByZXRyeSBhcmJpdHJhdGlvbiBpZiBsb3N0ICh1bmxlc3MgaGlnaGVyIGxldmVscyBkbyB0aGlzIGZvciB1cykKKyAqIC0gcG93ZXIgZG93biB0aGUgY2hpcCB3aGVuIG5vIGRldmljZSBpcyBkZXRlY3RlZAorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2h5ZHJhLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAibWVzaC5oIgorCisjaWYgMQorI3VuZGVmIEtFUk5fREVCVUcKKyNkZWZpbmUgS0VSTl9ERUJVRyBLRVJOX1dBUk5JTkcKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJQYXVsIE1hY2tlcnJhcyAocGF1bHVzQHNhbWJhLm9yZykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXJNYWMgTUVTSCBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IHN5bmNfcmF0ZSA9IENPTkZJR19TQ1NJX01FU0hfU1lOQ19SQVRFOworc3RhdGljIGludCBzeW5jX3RhcmdldHMgPSAweGZmOworc3RhdGljIGludCByZXNlbF90YXJnZXRzID0gMHhmZjsKK3N0YXRpYyBpbnQgZGVidWdfdGFyZ2V0cyA9IDA7CS8qIHByaW50IGRlYnVnIGZvciB0aGVzZSB0YXJnZXRzICovCitzdGF0aWMgaW50IGluaXRfcmVzZXRfZGVsYXkgPSBDT05GSUdfU0NTSV9NRVNIX1JFU0VUX0RFTEFZX01TOworCittb2R1bGVfcGFyYW0oc3luY19yYXRlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzeW5jX3JhdGUsICJTeW5jaHJvbm91cyByYXRlICgwLi4xMCwgMD1hc3luYykiKTsKK21vZHVsZV9wYXJhbShzeW5jX3RhcmdldHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHN5bmNfdGFyZ2V0cywgIkJpdG1hc2sgb2YgdGFyZ2V0cyBhbGxvd2VkIHRvIHNldCBzeW5jaHJvbm91cyIpOworbW9kdWxlX3BhcmFtKHJlc2VsX3RhcmdldHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc2VsX3RhcmdldHMsICJCaXRtYXNrIG9mIHRhcmdldHMgYWxsb3dlZCB0byBzZXQgZGlzY29ubmVjdCIpOworbW9kdWxlX3BhcmFtKGRlYnVnX3RhcmdldHMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX3RhcmdldHMsICJCaXRtYXNrIG9mIGRlYnVnZ2VkIHRhcmdldHMiKTsKK21vZHVsZV9wYXJhbShpbml0X3Jlc2V0X2RlbGF5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0X3Jlc2V0X2RlbGF5LCAiSW5pdGlhbCBidXMgcmVzZXQgZGVsYXkgKDA9bm8gcmVzZXQpIik7CisKK3N0YXRpYyBpbnQgbWVzaF9zeW5jX3BlcmlvZCA9IDEwMDsKK3N0YXRpYyBpbnQgbWVzaF9zeW5jX29mZnNldCA9IDA7CitzdGF0aWMgdW5zaWduZWQgY2hhciB1c2VfYWN0aXZlX25lZyA9IDA7ICAvKiBiaXQgbWFzayBmb3IgU0VRX0FDVElWRV9ORUcgaWYgdXNlZCAqLworCisjZGVmaW5lIEFMTE9XX1NZTkModGd0KQkJKChzeW5jX3RhcmdldHMgPj4gKHRndCkpICYgMSkKKyNkZWZpbmUgQUxMT1dfUkVTRUwodGd0KQkoKHJlc2VsX3RhcmdldHMgPj4gKHRndCkpICYgMSkKKyNkZWZpbmUgQUxMT1dfREVCVUcodGd0KQkoKGRlYnVnX3RhcmdldHMgPj4gKHRndCkpICYgMSkKKyNkZWZpbmUgREVCVUdfVEFSR0VUKGNtZCkJKChjbWQpICYmIEFMTE9XX0RFQlVHKChjbWQpLT5kZXZpY2UtPmlkKSkKKworI3VuZGVmIE1FU0hfREJHCisjZGVmaW5lIE5fREJHX0xPRwk1MAorI2RlZmluZSBOX0RCR19TTE9HCTIwCisjZGVmaW5lIE5VTV9EQkdfRVZFTlRTCTEzCisjdW5kZWYJREJHX1VTRV9UQgkJLyogYm9tYnMgb24gNjAxICovCisKK3N0cnVjdCBkYmdsb2cgeworCWNoYXIJKmZtdDsKKwl1MzIJdGI7CisJdTgJcGhhc2U7CisJdTgJYnMwOworCXU4CWJzMTsKKwl1OAl0Z3Q7CisJaW50CWQ7Cit9OworCitlbnVtIG1lc2hfcGhhc2UgeworCWlkbGUsCisJYXJiaXRyYXRpbmcsCisJc2VsZWN0aW5nLAorCWNvbW1hbmRpbmcsCisJZGF0YWluZywKKwlzdGF0dXNpbmcsCisJYnVzZnJlZWluZywKKwlkaXNjb25uZWN0aW5nLAorCXJlc2VsZWN0aW5nLAorCXNsZWVwaW5nCit9OworCitlbnVtIG1zZ19waGFzZSB7CisJbXNnX25vbmUsCisJbXNnX291dCwKKwltc2dfb3V0X3h4eCwKKwltc2dfb3V0X2xhc3QsCisJbXNnX2luLAorCW1zZ19pbl9iYWQsCit9OworCitlbnVtIHNkdHJfcGhhc2UgeworCWRvX3NkdHIsCisJc2R0cl9zZW50LAorCXNkdHJfZG9uZQorfTsKKworc3RydWN0IG1lc2hfdGFyZ2V0IHsKKwllbnVtIHNkdHJfcGhhc2Ugc2R0cl9zdGF0ZTsKKwlpbnQJc3luY19wYXJhbXM7CisJaW50CWRhdGFfZ29lc19vdXQ7CQkvKiBndWVzcyBhcyB0byBkYXRhIGRpcmVjdGlvbiAqLworCXN0cnVjdCBzY3NpX2NtbmQgKmN1cnJlbnRfcmVxOworCXUzMglzYXZlZF9wdHI7CisjaWZkZWYgTUVTSF9EQkcKKwlpbnQJbG9nX2l4OworCWludAluX2xvZzsKKwlzdHJ1Y3QgZGJnbG9nIGxvZ1tOX0RCR19MT0ddOworI2VuZGlmCit9OworCitzdHJ1Y3QgbWVzaF9zdGF0ZSB7CisJdm9sYXRpbGUgc3RydWN0CW1lc2hfcmVncyBfX2lvbWVtICptZXNoOworCWludAltZXNoaW50cjsKKwl2b2xhdGlsZSBzdHJ1Y3QJZGJkbWFfcmVncyBfX2lvbWVtICpkbWE7CisJaW50CWRtYWludHI7CisJc3RydWN0CVNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QJbWVzaF9zdGF0ZSAqbmV4dDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpyZXF1ZXN0X3E7CisJc3RydWN0IHNjc2lfY21uZCAqcmVxdWVzdF9xdGFpbDsKKwllbnVtIG1lc2hfcGhhc2UgcGhhc2U7CQkvKiB3aGF0IHdlJ3JlIGN1cnJlbnRseSB0cnlpbmcgdG8gZG8gKi8KKwllbnVtIG1zZ19waGFzZSBtc2dwaGFzZTsKKwlpbnQJY29ubl90Z3Q7CQkvKiB0YXJnZXQgd2UncmUgY29ubmVjdGVkIHRvICovCisJc3RydWN0IHNjc2lfY21uZCAqY3VycmVudF9yZXE7CQkvKiByZXEgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgb24gKi8KKwlpbnQJZGF0YV9wdHI7CisJaW50CWRtYV9zdGFydGVkOworCWludAlkbWFfY291bnQ7CisJaW50CXN0YXQ7CisJaW50CWFib3J0aW5nOworCWludAlleHBlY3RfcmVwbHk7CisJaW50CW5fbXNnaW47CisJdTgJbXNnaW5bMTZdOworCWludAluX21zZ291dDsKKwlpbnQJbGFzdF9uX21zZ291dDsKKwl1OAltc2dvdXRbMTZdOworCXN0cnVjdCBkYmRtYV9jbWQgKmRtYV9jbWRzOwkvKiBzcGFjZSBmb3IgZGJkbWEgY29tbWFuZHMsIGFsaWduZWQgKi8KKwlkbWFfYWRkcl90IGRtYV9jbWRfYnVzOworCXZvaWQJKmRtYV9jbWRfc3BhY2U7CisJaW50CWRtYV9jbWRfc2l6ZTsKKwlpbnQJY2xrX2ZyZXE7CisJc3RydWN0IG1lc2hfdGFyZ2V0IHRndHNbOF07CisJc3RydWN0IG1hY2lvX2RldiAqbWRldjsKKwlzdHJ1Y3QgcGNpX2RldiogcGRldjsKKyNpZmRlZiBNRVNIX0RCRworCWludAlsb2dfaXg7CisJaW50CW5fbG9nOworCXN0cnVjdCBkYmdsb2cgbG9nW05fREJHX1NMT0ddOworI2VuZGlmCit9OworCisvKgorICogRHJpdmVyIGlzIHRvbyBtZXNzeSwgd2UgbmVlZCBhIGZldyBwcm90b3R5cGVzLi4uCisgKi8KK3N0YXRpYyB2b2lkIG1lc2hfZG9uZShzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIGludCBzdGFydF9uZXh0KTsKK3N0YXRpYyB2b2lkIG1lc2hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncyk7CitzdGF0aWMgdm9pZCBjbWRfY29tcGxldGUoc3RydWN0IG1lc2hfc3RhdGUgKm1zKTsKK3N0YXRpYyB2b2lkIHNldF9kbWFfY21kcyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitzdGF0aWMgdm9pZCBoYWx0X2RtYShzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpOworc3RhdGljIHZvaWQgcGhhc2VfbWlzbWF0Y2goc3RydWN0IG1lc2hfc3RhdGUgKm1zKTsKKworCisvKgorICogU29tZSBkZWJ1Z2dpbmcgJiBsb2dnaW5nIHJvdXRpbmVzCisgKi8KKworI2lmZGVmIE1FU0hfREJHCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWR0Yih2b2lkKQoreworCXUzMiB0YjsKKworI2lmZGVmIERCR19VU0VfVEIKKwkvKiBCZXdhcmU6IGlmIHlvdSBlbmFibGUgdGhpcywgaXQgd2lsbCBjcmFzaCBvbiA2MDFzLiAqLworCWFzbSAoIm1mdGIgJTAiIDogIj1yIiAodGIpIDogKTsKKyNlbHNlCisJdGIgPSAwOworI2VuZGlmCisJcmV0dXJuIHRiOworfQorCitzdGF0aWMgdm9pZCBkbG9nKHN0cnVjdCBtZXNoX3N0YXRlICptcywgY2hhciAqZm10LCBpbnQgYSkKK3sKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwID0gJm1zLT50Z3RzW21zLT5jb25uX3RndF07CisJc3RydWN0IGRiZ2xvZyAqdGxwLCAqc2xwOworCisJdGxwID0gJnRwLT5sb2dbdHAtPmxvZ19peF07CisJc2xwID0gJm1zLT5sb2dbbXMtPmxvZ19peF07CisJdGxwLT5mbXQgPSBmbXQ7CisJdGxwLT50YiA9IHJlYWR0YigpOworCXRscC0+cGhhc2UgPSAobXMtPm1zZ3BoYXNlIDw8IDQpICsgbXMtPnBoYXNlOworCXRscC0+YnMwID0gbXMtPm1lc2gtPmJ1c19zdGF0dXMwOworCXRscC0+YnMxID0gbXMtPm1lc2gtPmJ1c19zdGF0dXMxOworCXRscC0+dGd0ID0gbXMtPmNvbm5fdGd0OworCXRscC0+ZCA9IGE7CisJKnNscCA9ICp0bHA7CisJaWYgKCsrdHAtPmxvZ19peCA+PSBOX0RCR19MT0cpCisJCXRwLT5sb2dfaXggPSAwOworCWlmICh0cC0+bl9sb2cgPCBOX0RCR19MT0cpCisJCSsrdHAtPm5fbG9nOworCWlmICgrK21zLT5sb2dfaXggPj0gTl9EQkdfU0xPRykKKwkJbXMtPmxvZ19peCA9IDA7CisJaWYgKG1zLT5uX2xvZyA8IE5fREJHX1NMT0cpCisJCSsrbXMtPm5fbG9nOworfQorCitzdGF0aWMgdm9pZCBkdW1wbG9nKHN0cnVjdCBtZXNoX3N0YXRlICptcywgaW50IHQpCit7CisJc3RydWN0IG1lc2hfdGFyZ2V0ICp0cCA9ICZtcy0+dGd0c1t0XTsKKwlzdHJ1Y3QgZGJnbG9nICpscDsKKwlpbnQgaTsKKworCWlmICh0cC0+bl9sb2cgPT0gMCkKKwkJcmV0dXJuOworCWkgPSB0cC0+bG9nX2l4IC0gdHAtPm5fbG9nOworCWlmIChpIDwgMCkKKwkJaSArPSBOX0RCR19MT0c7CisJdHAtPm5fbG9nID0gMDsKKwlkbyB7CisJCWxwID0gJnRwLT5sb2dbaV07CisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoIGxvZyAlZDogYnM9JS4yeCUuMnggcGg9JS4yeCAiLAorCQkgICAgICAgdCwgbHAtPmJzMSwgbHAtPmJzMCwgbHAtPnBoYXNlKTsKKyNpZmRlZiBEQkdfVVNFX1RCCisJCXByaW50aygidGI9JTEwdSAiLCBscC0+dGIpOworI2VuZGlmCisJCXByaW50ayhscC0+Zm10LCBscC0+ZCk7CisJCXByaW50aygiXG4iKTsKKwkJaWYgKCsraSA+PSBOX0RCR19MT0cpCisJCQlpID0gMDsKKwl9IHdoaWxlIChpICE9IHRwLT5sb2dfaXgpOworfQorCitzdGF0aWMgdm9pZCBkdW1wc2xvZyhzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJc3RydWN0IGRiZ2xvZyAqbHA7CisJaW50IGk7CisKKwlpZiAobXMtPm5fbG9nID09IDApCisJCXJldHVybjsKKwlpID0gbXMtPmxvZ19peCAtIG1zLT5uX2xvZzsKKwlpZiAoaSA8IDApCisJCWkgKz0gTl9EQkdfU0xPRzsKKwltcy0+bl9sb2cgPSAwOworCWRvIHsKKwkJbHAgPSAmbXMtPmxvZ1tpXTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2ggbG9nOiBicz0lLjJ4JS4yeCBwaD0lLjJ4IHQlZCAiLAorCQkgICAgICAgbHAtPmJzMSwgbHAtPmJzMCwgbHAtPnBoYXNlLCBscC0+dGd0KTsKKyNpZmRlZiBEQkdfVVNFX1RCCisJCXByaW50aygidGI9JTEwdSAiLCBscC0+dGIpOworI2VuZGlmCisJCXByaW50ayhscC0+Zm10LCBscC0+ZCk7CisJCXByaW50aygiXG4iKTsKKwkJaWYgKCsraSA+PSBOX0RCR19TTE9HKQorCQkJaSA9IDA7CisJfSB3aGlsZSAoaSAhPSBtcy0+bG9nX2l4KTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGRsb2coc3RydWN0IG1lc2hfc3RhdGUgKm1zLCBjaGFyICpmbXQsIGludCBhKQore30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wbG9nKHN0cnVjdCBtZXNoX3N0YXRlICptcywgaW50IHRndCkKK3t9CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcHNsb2coc3RydWN0IG1lc2hfc3RhdGUgKm1zKQore30KKworI2VuZGlmIC8qIE1FU0hfREJHICovCisKKyNkZWZpbmUgTUtXT1JEKGEsIGIsIGMsIGQpCSgoKGEpIDw8IDI0KSArICgoYikgPDwgMTYpICsgKChjKSA8PCA4KSArIChkKSkKKworc3RhdGljIHZvaWQKK21lc2hfZHVtcF9yZWdzKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqbWQgPSBtcy0+ZG1hOworCWludCB0OworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHA7CisKKwlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogc3RhdGUgYXQgJXAsIHJlZ3MgYXQgJXAsIGRtYSBhdCAlcFxuIiwKKwkgICAgICAgbXMsIG1yLCBtZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgICBjdD0lNHggc2VxPSUyeCBicz0lNHggZmM9JTJ4ICIKKwkgICAgICAgImV4Yz0lMnggZXJyPSUyeCBpbT0lMnggaW50PSUyeCBzcD0lMnhcbiIsCisJICAgICAgIChtci0+Y291bnRfaGkgPDwgOCkgKyBtci0+Y291bnRfbG8sIG1yLT5zZXF1ZW5jZSwKKwkgICAgICAgKG1yLT5idXNfc3RhdHVzMSA8PCA4KSArIG1yLT5idXNfc3RhdHVzMCwgbXItPmZpZm9fY291bnQsCisJICAgICAgIG1yLT5leGNlcHRpb24sIG1yLT5lcnJvciwgbXItPmludHJfbWFzaywgbXItPmludGVycnVwdCwKKwkgICAgICAgbXItPnN5bmNfcGFyYW1zKTsKKwl3aGlsZShpbl84KCZtci0+Zmlmb19jb3VudCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIgZmlmbyBkYXRhPSUuMnhcbiIsaW5fOCgmbXItPmZpZm8pKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICAgIGRtYSBzdGF0PSV4IGNtZHB0cj0leFxuIiwKKwkgICAgICAgaW5fbGUzMigmbWQtPnN0YXR1cyksIGluX2xlMzIoJm1kLT5jbWRwdHIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICAgIHBoYXNlPSVkIG1zZ3BoYXNlPSVkIGNvbm5fdGd0PSVkIGRhdGFfcHRyPSVkXG4iLAorCSAgICAgICBtcy0+cGhhc2UsIG1zLT5tc2dwaGFzZSwgbXMtPmNvbm5fdGd0LCBtcy0+ZGF0YV9wdHIpOworCXByaW50ayhLRVJOX0RFQlVHICIgICAgZG1hX3N0PSVkIGRtYV9jdD0lZCBuX21zZ291dD0lZFxuIiwKKwkgICAgICAgbXMtPmRtYV9zdGFydGVkLCBtcy0+ZG1hX2NvdW50LCBtcy0+bl9tc2dvdXQpOworCWZvciAodCA9IDA7IHQgPCA4OyArK3QpIHsKKwkJdHAgPSAmbXMtPnRndHNbdF07CisJCWlmICh0cC0+Y3VycmVudF9yZXEgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoS0VSTl9ERUJVRyAiICAgIHRhcmdldCAlZDogcmVxPSVwIGdvZXNfb3V0PSVkIHNhdmVkX3B0cj0lZFxuIiwKKwkJICAgICAgIHQsIHRwLT5jdXJyZW50X3JlcSwgdHAtPmRhdGFfZ29lc19vdXQsIHRwLT5zYXZlZF9wdHIpOworCX0KK30KKworCisvKgorICogRmx1c2ggd3JpdGUgYnVmZmVycyBvbiB0aGUgYnVzIHBhdGggdG8gdGhlIG1lc2gKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1lc2hfZmx1c2hfaW8odm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptcikKK3sKKwkodm9pZClpbl84KCZtci0+bWVzaF9pZCk7Cit9CisKKworLyoKKyAqIENvbXBsZXRlIGEgU0NTSSBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkIG1lc2hfY29tcGxldGVkKHN0cnVjdCBtZXNoX3N0YXRlICptcywgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCSgqY21kLT5zY3NpX2RvbmUpKGNtZCk7Cit9CisKKworLyogQ2FsbGVkIHdpdGggIG1lc2hpbnRlcnJ1cHQgZGlzYWJsZWQsIGluaXRpYWxpemUgdGhlIGNoaXBzZXQKKyAqIGFuZCBldmVudHVhbGx5IGRvIHRoZSBpbml0aWFsIGJ1cyByZXNldC4gVGhlIGxvY2sgbXVzdCBub3QgYmUKKyAqIGhlbGQgc2luY2Ugd2UgY2FuIHNjaGVkdWxlLgorICovCitzdGF0aWMgdm9pZCBtZXNoX2luaXQoc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICptZCA9IG1zLT5kbWE7CisKKwltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMTAwKTsKKworCS8qIFJlc2V0IGNvbnRyb2xsZXIgKi8KKwlvdXRfbGUzMigmbWQtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOwkvKiBzdG9wIGRtYSAqLworCW91dF84KCZtci0+ZXhjZXB0aW9uLCAweGZmKTsJLyogY2xlYXIgYWxsIGV4Y2VwdGlvbiBiaXRzICovCisJb3V0XzgoJm1yLT5lcnJvciwgMHhmZik7CS8qIGNsZWFyIGFsbCBlcnJvciBiaXRzICovCisJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX1JFU0VUTUVTSCk7CisJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDEwKTsKKwlvdXRfOCgmbXItPmludHJfbWFzaywgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwlvdXRfOCgmbXItPnNvdXJjZV9pZCwgbXMtPmhvc3QtPnRoaXNfaWQpOworCW91dF84KCZtci0+c2VsX3RpbWVvdXQsIDI1KTsJLyogMjUwbXMgKi8KKwlvdXRfOCgmbXItPnN5bmNfcGFyYW1zLCBBU1lOQ19QQVJBTVMpOworCisJaWYgKGluaXRfcmVzZXRfZGVsYXkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWVzaDogcGVyZm9ybWluZyBpbml0aWFsIGJ1cyByZXNldC4uLlxuIik7CisJCQorCQkvKiBSZXNldCBidXMgKi8KKwkJb3V0XzgoJm1yLT5idXNfc3RhdHVzMSwgQlMxX1JTVCk7CS8qIGFzc2VydCBSU1QgKi8KKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCXVkZWxheSgzMCk7CQkJLyogbGVhdmUgaXQgb24gZm9yID49IDI1dXMgKi8KKwkJb3V0XzgoJm1yLT5idXNfc3RhdHVzMSwgMCk7CS8qIG5lZ2F0ZSBSU1QgKi8KKwkJbWVzaF9mbHVzaF9pbyhtcik7CisKKwkJLyogV2FpdCBmb3IgYnVzIHRvIGNvbWUgYmFjayAqLworCQltc2xlZXAoaW5pdF9yZXNldF9kZWxheSk7CisJfQorCQorCS8qIFJlY29uZmlndXJlIGNvbnRyb2xsZXIgKi8KKwlvdXRfOCgmbXItPmludGVycnVwdCwgMHhmZik7CS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgYml0cyAqLworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9GTFVTSEZJRk8pOworCW1lc2hfZmx1c2hfaW8obXIpOworCXVkZWxheSgxKTsKKwlvdXRfOCgmbXItPnN5bmNfcGFyYW1zLCBBU1lOQ19QQVJBTVMpOworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9FTkJSRVNFTCk7CisKKwltcy0+cGhhc2UgPSBpZGxlOworCW1zLT5tc2dwaGFzZSA9IG1zZ19ub25lOworfQorCisKK3N0YXRpYyB2b2lkIG1lc2hfc3RhcnRfY21kKHN0cnVjdCBtZXNoX3N0YXRlICptcywgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwlpbnQgdCwgaWQ7CisKKwlpZCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwltcy0+Y3VycmVudF9yZXEgPSBjbWQ7CisJbXMtPnRndHNbaWRdLmRhdGFfZ29lc19vdXQgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0U7CisJbXMtPnRndHNbaWRdLmN1cnJlbnRfcmVxID0gY21kOworCisjaWYgMQorCWlmIChERUJVR19UQVJHRVQoY21kKSkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2hfc3RhcnQ6ICVwIHNlcj0lbHUgdGd0PSVkIGNtZD0iLAorCQkgICAgICAgY21kLCBjbWQtPnNlcmlhbF9udW1iZXIsIGlkKTsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgKytpKQorCQkJcHJpbnRrKCIgJXgiLCBjbWQtPmNtbmRbaV0pOworCQlwcmludGsoIiB1c2Vfc2c9JWQgYnVmZmVyPSVwIGJ1ZmZsZW49JXVcbiIsCisJCSAgICAgICBjbWQtPnVzZV9zZywgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCX0KKyNlbmRpZgorCWlmIChtcy0+ZG1hX3N0YXJ0ZWQpCisJCXBhbmljKCJtZXNoOiBkb3VibGUgRE1BIHN0YXJ0ICFcbiIpOworCisJbXMtPnBoYXNlID0gYXJiaXRyYXRpbmc7CisJbXMtPm1zZ3BoYXNlID0gbXNnX25vbmU7CisJbXMtPmRhdGFfcHRyID0gMDsKKwltcy0+ZG1hX3N0YXJ0ZWQgPSAwOworCW1zLT5uX21zZ291dCA9IDA7CisJbXMtPmxhc3Rfbl9tc2dvdXQgPSAwOworCW1zLT5leHBlY3RfcmVwbHkgPSAwOworCW1zLT5jb25uX3RndCA9IGlkOworCW1zLT50Z3RzW2lkXS5zYXZlZF9wdHIgPSAwOworCW1zLT5zdGF0ID0gRElEX09LOworCW1zLT5hYm9ydGluZyA9IDA7CisjaWZkZWYgTUVTSF9EQkcKKwltcy0+dGd0c1tpZF0ubl9sb2cgPSAwOworCWRsb2cobXMsICJzdGFydCBjbWQ9JXgiLCAoaW50KSBjbWQpOworI2VuZGlmCisKKwkvKiBPZmYgd2UgZ28gKi8KKwlkbG9nKG1zLCAiYWJvdXQgdG8gYXJiLCBpbnRyL2V4Yy9lcnIvZmM9JS44eCIsCisJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwgbXItPmVycm9yLCBtci0+Zmlmb19jb3VudCkpOworCW91dF84KCZtci0+aW50ZXJydXB0LCBJTlRfQ01ERE9ORSk7CisJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0VOQlJFU0VMKTsKKwltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMSk7CisKKwlpZiAoaW5fOCgmbXItPmJ1c19zdGF0dXMxKSAmIChCUzFfQlNZIHwgQlMxX1NFTCkpIHsKKwkJLyoKKwkJICogU29tZSBvdGhlciBkZXZpY2UgaGFzIHRoZSBidXMgb3IgaXMgYXJiaXRyYXRpbmcgZm9yIGl0IC0KKwkJICogcHJvYmFibHkgYSB0YXJnZXQgd2hpY2ggaXMgYWJvdXQgdG8gcmVzZWxlY3QgdXMuCisJCSAqLworCQlkbG9nKG1zLCAiYnVzeSBiNCBhcmIsIGludHIvZXhjL2Vyci9mYz0lLjh4IiwKKwkJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwKKwkJCSAgICBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisJCWZvciAodCA9IDEwMDsgdCA+IDA7IC0tdCkgeworCQkJaWYgKChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgKEJTMV9CU1kgfCBCUzFfU0VMKSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChpbl84KCZtci0+aW50ZXJydXB0KSAhPSAwKSB7CisJCQkJZGxvZyhtcywgImludHIgYjQgYXJiLCBpbnRyL2V4Yy9lcnIvZmM9JS44eCIsCisJCQkJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwKKwkJCQkJICAgIG1yLT5lcnJvciwgbXItPmZpZm9fY291bnQpKTsKKwkJCQltZXNoX2ludGVycnVwdCgwLCAodm9pZCAqKW1zLCBOVUxMKTsKKwkJCQlpZiAobXMtPnBoYXNlICE9IGFyYml0cmF0aW5nKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCX0KKwkJaWYgKGluXzgoJm1yLT5idXNfc3RhdHVzMSkgJiAoQlMxX0JTWSB8IEJTMV9TRUwpKSB7CisJCQkvKiBYWFggc2hvdWxkIHRyeSBhZ2FpbiBpbiBhIGxpdHRsZSB3aGlsZSAqLworCQkJbXMtPnN0YXQgPSBESURfQlVTX0JVU1k7CisJCQltcy0+cGhhc2UgPSBpZGxlOworCQkJbWVzaF9kb25lKG1zLCAwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qCisJICogQXBwYXJlbnRseSB0aGUgbWVzaCBoYXMgYSBidWcgd2hlcmUgaXQgd2lsbCBhc3NlcnQgYm90aCBpdHMKKwkgKiBvd24gYml0IGFuZCB0aGUgdGFyZ2V0J3MgYml0IG9uIHRoZSBidXMgZHVyaW5nIGFyYml0cmF0aW9uLgorCSAqLworCW91dF84KCZtci0+ZGVzdF9pZCwgbXItPnNvdXJjZV9pZCk7CisKKwkvKgorCSAqIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSByYWNlIHdpdGggcmVzZWxlY3Rpb24gc29tZXRpbWVzLAorCSAqIHdoZXJlIGEgdGFyZ2V0IHJlc2VsZWN0cyB1cyBqdXN0IGFzIHdlIGlzc3VlIHRoZQorCSAqIGFyYml0cmF0ZSBjb21tYW5kLiAgSXQgc2VlbXMgdGhhdCB0aGVuIHRoZSBhcmJpdHJhdGUKKwkgKiBjb21tYW5kIGp1c3QgaGFuZ3Mgd2FpdGluZyBmb3IgdGhlIGJ1cyB0byBiZSBmcmVlCisJICogd2l0aG91dCBnaXZpbmcgdXMgYSByZXNlbGVjdGlvbiBleGNlcHRpb24uCisJICogVGhlIG9ubHkgd2F5IEkgaGF2ZSBmb3VuZCB0byBnZXQgaXQgdG8gcmVzcG9uZCBjb3JyZWN0bHkKKwkgKiBpcyB0aGlzOiBkaXNhYmxlIHJlc2VsZWN0aW9uIGJlZm9yZSBpc3N1aW5nIHRoZSBhcmJpdHJhdGUKKwkgKiBjb21tYW5kLCB0aGVuIGFmdGVyIGlzc3VpbmcgaXQsIGlmIGl0IGxvb2tzIGxpa2UgYSB0YXJnZXQKKwkgKiBpcyB0cnlpbmcgdG8gcmVzZWxlY3QgdXMsIHJlc2V0IHRoZSBtZXNoIGFuZCB0aGVuIGVuYWJsZQorCSAqIHJlc2VsZWN0aW9uLgorCSAqLworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9ESVNSRVNFTCk7CisJaWYgKGluXzgoJm1yLT5pbnRlcnJ1cHQpICE9IDApIHsKKwkJZGxvZyhtcywgImludHIgYWZ0ZXIgZGlzcmVzZWwsIGludHIvZXhjL2Vyci9mYz0lLjh4IiwKKwkJICAgICBNS1dPUkQobXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwKKwkJCSAgICBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisJCW1lc2hfaW50ZXJydXB0KDAsICh2b2lkICopbXMsIE5VTEwpOworCQlpZiAobXMtPnBoYXNlICE9IGFyYml0cmF0aW5nKQorCQkJcmV0dXJuOworCQlkbG9nKG1zLCAiYWZ0ZXIgaW50ciBhZnRlciBkaXNyZXNlbCwgaW50ci9leGMvZXJyL2ZjPSUuOHgiLAorCQkgICAgIE1LV09SRChtci0+aW50ZXJydXB0LCBtci0+ZXhjZXB0aW9uLAorCQkJICAgIG1yLT5lcnJvciwgbXItPmZpZm9fY291bnQpKTsKKwl9CisKKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfQVJCSVRSQVRFKTsKKworCWZvciAodCA9IDIzMDsgdCA+IDA7IC0tdCkgeworCQlpZiAoaW5fOCgmbXItPmludGVycnVwdCkgIT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWRsb2cobXMsICJhZnRlciBhcmIsIGludHIvZXhjL2Vyci9mYz0lLjh4IiwKKwkgICAgIE1LV09SRChtci0+aW50ZXJydXB0LCBtci0+ZXhjZXB0aW9uLCBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisJaWYgKGluXzgoJm1yLT5pbnRlcnJ1cHQpID09IDAgJiYgKGluXzgoJm1yLT5idXNfc3RhdHVzMSkgJiBCUzFfU0VMKQorCSAgICAmJiAoaW5fOCgmbXItPmJ1c19zdGF0dXMwKSAmIEJTMF9JTykpIHsKKwkJLyogbG9va3MgbGlrZSBhIHJlc2VsZWN0aW9uIC0gdHJ5IHJlc2V0dGluZyB0aGUgbWVzaCAqLworCQlkbG9nKG1zLCAicmVzZWw/IGFmdGVyIGFyYiwgaW50ci9leGMvZXJyL2ZjPSUuOHgiLAorCQkgICAgIE1LV09SRChtci0+aW50ZXJydXB0LCBtci0+ZXhjZXB0aW9uLCBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9SRVNFVE1FU0gpOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJdWRlbGF5KDEwKTsKKwkJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJCW91dF84KCZtci0+aW50cl9tYXNrLCBJTlRfRVJST1IgfCBJTlRfRVhDRVBUSU9OIHwgSU5UX0NNRERPTkUpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRU5CUkVTRUwpOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJZm9yICh0ID0gMTA7IHQgPiAwICYmIGluXzgoJm1yLT5pbnRlcnJ1cHQpID09IDA7IC0tdCkKKwkJCXVkZWxheSgxKTsKKwkJZGxvZyhtcywgInRyaWVkIHJlc2V0IGFmdGVyIGFyYiwgaW50ci9leGMvZXJyL2ZjPSUuOHgiLAorCQkgICAgIE1LV09SRChtci0+aW50ZXJydXB0LCBtci0+ZXhjZXB0aW9uLCBtci0+ZXJyb3IsIG1yLT5maWZvX2NvdW50KSk7CisjaWZuZGVmIE1FU0hfTVVMVElQTEVfSE9TVFMKKwkJaWYgKGluXzgoJm1yLT5pbnRlcnJ1cHQpID09IDAgJiYgKGluXzgoJm1yLT5idXNfc3RhdHVzMSkgJiBCUzFfU0VMKQorCQkgICAgJiYgKGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfSU8pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGNvbnRyb2xsZXIgbm90IHJlc3BvbmRpbmciCisJCQkgICAgICAgIiB0byByZXNlbGVjdGlvbiFcbiIpOworCQkJLyoKKwkJCSAqIElmIHRoaXMgaXMgYSB0YXJnZXQgcmVzZWxlY3RpbmcgdXMsIGFuZCB0aGUKKwkJCSAqIG1lc2ggaXNuJ3QgcmVzcG9uZGluZywgdGhlIGhpZ2hlciBsZXZlbHMgb2YKKwkJCSAqIHRoZSBzY3NpIGNvZGUgd2lsbCBldmVudHVhbGx5IHRpbWUgb3V0IGFuZAorCQkJICogcmVzZXQgdGhlIGJ1cy4KKwkJCSAqLworCQl9CisjZW5kaWYKKwl9Cit9CisKKy8qCisgKiBTdGFydCB0aGUgbmV4dCBjb21tYW5kIGZvciBhIE1FU0guCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgbWVzaF9zdGFydChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kLCAqcHJldiwgKm5leHQ7CisKKwlpZiAobXMtPnBoYXNlICE9IGlkbGUgfHwgbXMtPmN1cnJlbnRfcmVxICE9IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbmFwcHJvcHJpYXRlIG1lc2hfc3RhcnQgKHBoYXNlPSVkLCBtcz0lcCkiLAorCQkgICAgICAgbXMtPnBoYXNlLCBtcyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAobXMtPnBoYXNlID09IGlkbGUpIHsKKwkJcHJldiA9IE5VTEw7CisJCWZvciAoY21kID0gbXMtPnJlcXVlc3RfcTsgOyBjbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGUpIHsKKwkJCWlmIChjbWQgPT0gTlVMTCkKKwkJCQlyZXR1cm47CisJCQlpZiAobXMtPnRndHNbY21kLT5kZXZpY2UtPmlkXS5jdXJyZW50X3JlcSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJcHJldiA9IGNtZDsKKwkJfQorCQluZXh0ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQlpZiAocHJldiA9PSBOVUxMKQorCQkJbXMtPnJlcXVlc3RfcSA9IG5leHQ7CisJCWVsc2UKKwkJCXByZXYtPmhvc3Rfc2NyaWJibGUgPSAodm9pZCAqKSBuZXh0OworCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJbXMtPnJlcXVlc3RfcXRhaWwgPSBwcmV2OworCisJCW1lc2hfc3RhcnRfY21kKG1zLCBjbWQpOworCX0KK30KKworc3RhdGljIHZvaWQgbWVzaF9kb25lKHN0cnVjdCBtZXNoX3N0YXRlICptcywgaW50IHN0YXJ0X25leHQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHAgPSAmbXMtPnRndHNbbXMtPmNvbm5fdGd0XTsKKworCWNtZCA9IG1zLT5jdXJyZW50X3JlcTsKKwltcy0+Y3VycmVudF9yZXEgPSBOVUxMOworCXRwLT5jdXJyZW50X3JlcSA9IE5VTEw7CisJaWYgKGNtZCkgeworCQljbWQtPnJlc3VsdCA9IChtcy0+c3RhdCA8PCAxNikgKyBjbWQtPlNDcC5TdGF0dXM7CisJCWlmIChtcy0+c3RhdCA9PSBESURfT0spCisJCQljbWQtPnJlc3VsdCArPSAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsKKwkJaWYgKERFQlVHX1RBUkdFVChjbWQpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaF9kb25lOiByZXN1bHQgPSAleCwgZGF0YV9wdHI9JWQsIGJ1Zmxlbj0lZFxuIiwKKwkJCSAgICAgICBjbWQtPnJlc3VsdCwgbXMtPmRhdGFfcHRyLCBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQlpZiAoKGNtZC0+Y21uZFswXSA9PSAwIHx8IGNtZC0+Y21uZFswXSA9PSAweDEyIHx8IGNtZC0+Y21uZFswXSA9PSAzKQorCQkJICAgICYmIGNtZC0+cmVxdWVzdF9idWZmZXIgIT0gMCkgeworCQkJCXVuc2lnbmVkIGNoYXIgKmIgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJidWZmZXIgPSAleCAleCAleCAleCAleCAleCAleCAleFxuIiwKKwkJCQkgICAgICAgYlswXSwgYlsxXSwgYlsyXSwgYlszXSwgYls0XSwgYls1XSwgYls2XSwgYls3XSk7CisJCQl9CisJCX0KKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtPSBtcy0+ZGF0YV9wdHI7CisJCW1lc2hfY29tcGxldGVkKG1zLCBjbWQpOworCX0KKwlpZiAoc3RhcnRfbmV4dCkgeworCQlvdXRfOCgmbXMtPm1lc2gtPnNlcXVlbmNlLCBTRVFfRU5CUkVTRUwpOworCQltZXNoX2ZsdXNoX2lvKG1zLT5tZXNoKTsKKwkJdWRlbGF5KDEpOworCQltcy0+cGhhc2UgPSBpZGxlOworCQltZXNoX3N0YXJ0KG1zKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfc2R0cl9tc2coc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCWludCBpID0gbXMtPm5fbXNnb3V0OworCisJbXMtPm1zZ291dFtpXSA9IEVYVEVOREVEX01FU1NBR0U7CisJbXMtPm1zZ291dFtpKzFdID0gMzsKKwltcy0+bXNnb3V0W2krMl0gPSBFWFRFTkRFRF9TRFRSOworCW1zLT5tc2dvdXRbaSszXSA9IG1lc2hfc3luY19wZXJpb2QvNDsKKwltcy0+bXNnb3V0W2krNF0gPSAoQUxMT1dfU1lOQyhtcy0+Y29ubl90Z3QpPyBtZXNoX3N5bmNfb2Zmc2V0OiAwKTsKKwltcy0+bl9tc2dvdXQgPSBpICsgNTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NkdHIoc3RydWN0IG1lc2hfc3RhdGUgKm1zLCBpbnQgcGVyaW9kLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHAgPSAmbXMtPnRndHNbbXMtPmNvbm5fdGd0XTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJaW50IHYsIHRyOworCisJdHAtPnNkdHJfc3RhdGUgPSBzZHRyX2RvbmU7CisJaWYgKG9mZnNldCA9PSAwKSB7CisJCS8qIGFzeW5jaHJvbm91cyAqLworCQlpZiAoU1lOQ19PRkYodHAtPnN5bmNfcGFyYW1zKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIm1lc2g6IHRhcmdldCAlZCBub3cgYXN5bmNocm9ub3VzXG4iLAorCQkJICAgICAgIG1zLT5jb25uX3RndCk7CisJCXRwLT5zeW5jX3BhcmFtcyA9IEFTWU5DX1BBUkFNUzsKKwkJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgQVNZTkNfUEFSQU1TKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFdlIG5lZWQgdG8gY29tcHV0ZSBjZWlsKGNsa19mcmVxICogcGVyaW9kIC8gNTAwZTYpIC0gMgorCSAqIHdpdGhvdXQgaW5jdXJyaW5nIG92ZXJmbG93LgorCSAqLworCXYgPSAobXMtPmNsa19mcmVxIC8gNTAwMCkgKiBwZXJpb2Q7CisJaWYgKHYgPD0gMjUwMDAwKSB7CisJCS8qIHNwZWNpYWwgY2FzZTogc3luY19wZXJpb2QgPT0gNSAqIGNsa19wZXJpb2QgKi8KKwkJdiA9IDA7CisJCS8qIHVuaXRzIG9mIHRyIGFyZSAxMDBrQi9zICovCisJCXRyID0gKG1zLT5jbGtfZnJlcSArIDI1MDAwMCkgLyA1MDAwMDA7CisJfSBlbHNlIHsKKwkJLyogc3luY19wZXJpb2QgPT0gKHYgKyAyKSAqIDIgKiBjbGtfcGVyaW9kICovCisJCXYgPSAodiArIDk5OTk5KSAvIDEwMDAwMCAtIDI7CisJCWlmICh2ID4gMTUpCisJCQl2ID0gMTU7CS8qIG9vcHMgKi8KKwkJdHIgPSAoKG1zLT5jbGtfZnJlcSAvICh2ICsgMikpICsgMTk5OTk5KSAvIDIwMDAwMDsKKwl9CisJaWYgKG9mZnNldCA+IDE1KQorCQlvZmZzZXQgPSAxNTsJLyogY2FuJ3QgaGFwcGVuICovCisJdHAtPnN5bmNfcGFyYW1zID0gU1lOQ19QQVJBTVMob2Zmc2V0LCB2KTsKKwlvdXRfOCgmbXItPnN5bmNfcGFyYW1zLCB0cC0+c3luY19wYXJhbXMpOworCXByaW50ayhLRVJOX0lORk8gIm1lc2g6IHRhcmdldCAlZCBzeW5jaHJvbm91cyBhdCAlZC4lZCBNQi9zXG4iLAorCSAgICAgICBtcy0+Y29ubl90Z3QsIHRyLzEwLCB0ciUxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3BoYXNlKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwlpbnQgaSwgc2VxLCBuYjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqbWQgPSBtcy0+ZG1hOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IG1zLT5jdXJyZW50X3JlcTsKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwID0gJm1zLT50Z3RzW21zLT5jb25uX3RndF07CisKKwlkbG9nKG1zLCAic3RhcnRfcGhhc2Ugbm1vL2V4Yy9mYy9zZXEgPSAlLjh4IiwKKwkgICAgIE1LV09SRChtcy0+bl9tc2dvdXQsIG1yLT5leGNlcHRpb24sIG1yLT5maWZvX2NvdW50LCBtci0+c2VxdWVuY2UpKTsKKwlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwlzZXEgPSB1c2VfYWN0aXZlX25lZyArIChtcy0+bl9tc2dvdXQ/IFNFUV9BVE46IDApOworCXN3aXRjaCAobXMtPm1zZ3BoYXNlKSB7CisJY2FzZSBtc2dfbm9uZToKKwkJYnJlYWs7CisKKwljYXNlIG1zZ19pbjoKKwkJb3V0XzgoJm1yLT5jb3VudF9oaSwgMCk7CisJCW91dF84KCZtci0+Y291bnRfbG8sIDEpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfTVNHSU4gKyBzZXEpOworCQltcy0+bl9tc2dpbiA9IDA7CisJCXJldHVybjsKKworCWNhc2UgbXNnX291dDoKKwkJLyoKKwkJICogVG8gbWFrZSBzdXJlIEFUTiBkcm9wcyBiZWZvcmUgd2UgYXNzZXJ0IEFDSyBmb3IKKwkJICogdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSwgd2UgaGF2ZSB0byBkbyB0aGUKKwkJICogbGFzdCBieXRlIHNwZWNpYWxseS4KKwkJICovCisJCWlmIChtcy0+bl9tc2dvdXQgPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBtc2dfb3V0IGJ1dCBuX21zZ291dD0lZFxuIiwKKwkJCSAgICAgICBtcy0+bl9tc2dvdXQpOworCQkJbWVzaF9kdW1wX3JlZ3MobXMpOworCQkJbXMtPm1zZ3BoYXNlID0gbXNnX25vbmU7CisJCQlicmVhazsKKwkJfQorCQlpZiAoQUxMT1dfREVCVUcobXMtPmNvbm5fdGd0KSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2g6IHNlbmRpbmcgJWQgbXNnIGJ5dGVzOiIsCisJCQkgICAgICAgbXMtPm5fbXNnb3V0KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBtcy0+bl9tc2dvdXQ7ICsraSkKKwkJCQlwcmludGsoIiAleCIsIG1zLT5tc2dvdXRbaV0pOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisJCWRsb2cobXMsICJtc2dvdXQgbXNnPSUuOHgiLCBNS1dPUkQobXMtPm5fbXNnb3V0LCBtcy0+bXNnb3V0WzBdLAorCQkJCQkJbXMtPm1zZ291dFsxXSwgbXMtPm1zZ291dFsyXSkpOworCQlvdXRfOCgmbXItPmNvdW50X2hpLCAwKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0ZMVVNIRklGTyk7CisJCW1lc2hfZmx1c2hfaW8obXIpOworCQl1ZGVsYXkoMSk7CisJCS8qCisJCSAqIElmIEFUTiBpcyBub3QgYWxyZWFkeSBhc3NlcnRlZCwgd2UgYXNzZXJ0IGl0LCB0aGVuCisJCSAqIGlzc3VlIGEgU0VRX01TR09VVCB0byBnZXQgdGhlIG1lc2ggdG8gZHJvcCBBQ0suCisJCSAqLworCQlpZiAoKGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfQVROKSA9PSAwKSB7CisJCQlkbG9nKG1zLCAiYnVzMCB3YXMgJS4yeCBleHBsaWN0bHkgYXNzZXJ0aW5nIEFUTiIsIG1yLT5idXNfc3RhdHVzMCk7CisJCQlvdXRfOCgmbXItPmJ1c19zdGF0dXMwLCBCUzBfQVROKTsgLyogZXhwbGljaXQgQVROICovCisJCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJCXVkZWxheSgxKTsKKwkJCW91dF84KCZtci0+Y291bnRfbG8sIDEpOworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR09VVCArIHNlcSk7CisJCQlvdXRfOCgmbXItPmJ1c19zdGF0dXMwLCAwKTsgLyogcmVsZWFzZSBleHBsaWNpdCBBVE4gKi8KKwkJCWRsb2cobXMsImhhY2U6IGFmdGVyIGV4cGxpY2l0IEFUTiBidXMwPSUuMngiLG1yLT5idXNfc3RhdHVzMCk7CisJCX0KKwkJaWYgKG1zLT5uX21zZ291dCA9PSAxKSB7CisJCQkvKgorCQkJICogV2UgY2FuJ3QgaXNzdWUgdGhlIFNFUV9NU0dPVVQgd2l0aG91dCBBVE4KKwkJCSAqIHVudGlsIHRoZSB0YXJnZXQgaGFzIGFzc2VydGVkIFJFUS4gIFRoZSBsb2dpYworCQkJICogaW4gY21kX2NvbXBsZXRlIGhhbmRsZXMgYm90aCBzaXR1YXRpb25zOgorCQkJICogUkVRIGFscmVhZHkgYXNzZXJ0ZWQgb3Igbm90LgorCQkJICovCisJCQljbWRfY29tcGxldGUobXMpOworCQl9IGVsc2UgeworCQkJb3V0XzgoJm1yLT5jb3VudF9sbywgbXMtPm5fbXNnb3V0IC0gMSk7CisJCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfTVNHT1VUICsgc2VxKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBtcy0+bl9tc2dvdXQgLSAxOyArK2kpCisJCQkJb3V0XzgoJm1yLT5maWZvLCBtcy0+bXNnb3V0W2ldKTsKKwkJfQorCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm1lc2ggYnVnOiBzdGFydF9waGFzZSBtc2dwaGFzZT0lZFxuIiwKKwkJICAgICAgIG1zLT5tc2dwaGFzZSk7CisJfQorCisJc3dpdGNoIChtcy0+cGhhc2UpIHsKKwljYXNlIHNlbGVjdGluZzoKKwkJb3V0XzgoJm1yLT5kZXN0X2lkLCBtcy0+Y29ubl90Z3QpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfU0VMRUNUICsgU0VRX0FUTik7CisJCWJyZWFrOworCWNhc2UgY29tbWFuZGluZzoKKwkJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgdHAtPnN5bmNfcGFyYW1zKTsKKwkJb3V0XzgoJm1yLT5jb3VudF9oaSwgMCk7CisJCWlmIChjbWQpIHsKKwkJCW91dF84KCZtci0+Y291bnRfbG8sIGNtZC0+Y21kX2xlbik7CisJCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfQ09NTUFORCArIHNlcSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyArK2kpCisJCQkJb3V0XzgoJm1yLT5maWZvLCBjbWQtPmNtbmRbaV0pOworCQl9IGVsc2UgeworCQkJb3V0XzgoJm1yLT5jb3VudF9sbywgNik7CisJCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfQ09NTUFORCArIHNlcSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKQorCQkJCW91dF84KCZtci0+ZmlmbywgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkYXRhaW5nOgorCQkvKiB0cmFuc2ZlciBkYXRhLCBpZiBhbnkgKi8KKwkJaWYgKCFtcy0+ZG1hX3N0YXJ0ZWQpIHsKKwkJCXNldF9kbWFfY21kcyhtcywgY21kKTsKKwkJCW91dF9sZTMyKCZtZC0+Y21kcHRyLCB2aXJ0X3RvX3BoeXMobXMtPmRtYV9jbWRzKSk7CisJCQlvdXRfbGUzMigmbWQtPmNvbnRyb2wsIChSVU4gPDwgMTYpIHwgUlVOKTsKKwkJCW1zLT5kbWFfc3RhcnRlZCA9IDE7CisJCX0KKwkJbmIgPSBtcy0+ZG1hX2NvdW50OworCQlpZiAobmIgPiAweGZmZjApCisJCQluYiA9IDB4ZmZmMDsKKwkJbXMtPmRtYV9jb3VudCAtPSBuYjsKKwkJbXMtPmRhdGFfcHRyICs9IG5iOworCQlvdXRfOCgmbXItPmNvdW50X2xvLCBuYik7CisJCW91dF84KCZtci0+Y291bnRfaGksIG5iID4+IDgpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCAodHAtPmRhdGFfZ29lc19vdXQ/CisJCQkJU0VRX0RBVEFPVVQ6IFNFUV9EQVRBSU4pICsgU0VRX0RNQV9NT0RFICsgc2VxKTsKKwkJYnJlYWs7CisJY2FzZSBzdGF0dXNpbmc6CisJCW91dF84KCZtci0+Y291bnRfaGksIDApOworCQlvdXRfOCgmbXItPmNvdW50X2xvLCAxKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX1NUQVRVUyArIHNlcSk7CisJCWJyZWFrOworCWNhc2UgYnVzZnJlZWluZzoKKwljYXNlIGRpc2Nvbm5lY3Rpbmc6CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9FTkJSRVNFTCk7CisJCW1lc2hfZmx1c2hfaW8obXIpOworCQl1ZGVsYXkoMSk7CisJCWRsb2cobXMsICJlbmJyZXNlbCBpbnRyL2V4Yy9lcnIvZmM9JS44eCIsCisJCSAgICAgTUtXT1JEKG1yLT5pbnRlcnJ1cHQsIG1yLT5leGNlcHRpb24sIG1yLT5lcnJvciwKKwkJCSAgICBtci0+Zmlmb19jb3VudCkpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfQlVTRlJFRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogc3RhcnRfcGhhc2UgY2FsbGVkIHdpdGggcGhhc2U9JWRcbiIsCisJCSAgICAgICBtcy0+cGhhc2UpOworCQlkdW1wc2xvZyhtcyk7CisJfQorCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbXNnaW4oc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwlpbnQgaSwgbjsKKworCW4gPSBtci0+Zmlmb19jb3VudDsKKwlpZiAobiAhPSAwKSB7CisJCWkgPSBtcy0+bl9tc2dpbjsKKwkJbXMtPm5fbXNnaW4gPSBpICsgbjsKKwkJZm9yICg7IG4gPiAwOyAtLW4pCisJCQltcy0+bXNnaW5baSsrXSA9IGluXzgoJm1yLT5maWZvKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zZ2luX2xlbmd0aChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJaW50IGIsIG47CisKKwluID0gMTsKKwlpZiAobXMtPm5fbXNnaW4gPiAwKSB7CisJCWIgPSBtcy0+bXNnaW5bMF07CisJCWlmIChiID09IDEpIHsKKwkJCS8qIGV4dGVuZGVkIG1lc3NhZ2UgKi8KKwkJCW4gPSBtcy0+bl9tc2dpbiA8IDI/IDI6IG1zLT5tc2dpblsxXSArIDI7CisJCX0gZWxzZSBpZiAoMHgyMCA8PSBiICYmIGIgPD0gMHgyZikgeworCQkJLyogMi1ieXRlIG1lc3NhZ2UgKi8KKwkJCW4gPSAyOworCQl9CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCByZXNlbGVjdGVkKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWVzaF9yZWdzIF9faW9tZW0gKm1yID0gbXMtPm1lc2g7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHA7CisJaW50IGIsIHQsIHByZXY7CisKKwlzd2l0Y2ggKG1zLT5waGFzZSkgeworCWNhc2UgaWRsZToKKwkJYnJlYWs7CisJY2FzZSBhcmJpdHJhdGluZzoKKwkJaWYgKChjbWQgPSBtcy0+Y3VycmVudF9yZXEpICE9IE5VTEwpIHsKKwkJCS8qIHB1dCB0aGUgY29tbWFuZCBiYWNrIG9uIHRoZSBxdWV1ZSAqLworCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikgbXMtPnJlcXVlc3RfcTsKKwkJCWlmIChtcy0+cmVxdWVzdF9xID09IE5VTEwpCisJCQkJbXMtPnJlcXVlc3RfcXRhaWwgPSBjbWQ7CisJCQltcy0+cmVxdWVzdF9xID0gY21kOworCQkJdHAgPSAmbXMtPnRndHNbY21kLT5kZXZpY2UtPmlkXTsKKwkJCXRwLT5jdXJyZW50X3JlcSA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBidXNmcmVlaW5nOgorCQltcy0+cGhhc2UgPSByZXNlbGVjdGluZzsKKwkJbWVzaF9kb25lKG1zLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBkaXNjb25uZWN0aW5nOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHJlc2VsZWN0ZWQgaW4gcGhhc2UgJWQvJWQgdGd0ICVkXG4iLAorCQkgICAgICAgbXMtPm1zZ3BoYXNlLCBtcy0+cGhhc2UsIG1zLT5jb25uX3RndCk7CisJCWR1bXBsb2cobXMsIG1zLT5jb25uX3RndCk7CisJCWR1bXBzbG9nKG1zKTsKKwl9CisKKwlpZiAobXMtPmRtYV9zdGFydGVkKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogcmVzZWxlY3RlZCB3aXRoIERNQSBzdGFydGVkICFcbiIpOworCQloYWx0X2RtYShtcyk7CisJfQorCW1zLT5jdXJyZW50X3JlcSA9IE5VTEw7CisJbXMtPnBoYXNlID0gZGF0YWluZzsKKwltcy0+bXNncGhhc2UgPSBtc2dfaW47CisJbXMtPm5fbXNnb3V0ID0gMDsKKwltcy0+bGFzdF9uX21zZ291dCA9IDA7CisJcHJldiA9IG1zLT5jb25uX3RndDsKKworCS8qCisJICogV2Ugc2VlbSB0byBnZXQgYWJvcnRpdmUgcmVzZWxlY3Rpb25zIHNvbWV0aW1lcy4KKwkgKi8KKwl3aGlsZSAoKGluXzgoJm1yLT5idXNfc3RhdHVzMSkgJiBCUzFfQlNZKSA9PSAwKSB7CisJCXN0YXRpYyBpbnQgbWVzaF9hYm9ydGVkX3Jlc2VsczsKKwkJbWVzaF9hYm9ydGVkX3Jlc2VscysrOworCQlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCXVkZWxheSgxKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0VOQlJFU0VMKTsKKwkJbWVzaF9mbHVzaF9pbyhtcik7CisJCXVkZWxheSg1KTsKKwkJZGxvZyhtcywgImV4dHJhIHJlc2VsIGVyci9leGMvZmMgPSAlLjZ4IiwKKwkJICAgICBNS1dPUkQoMCwgbXItPmVycm9yLCBtci0+ZXhjZXB0aW9uLCBtci0+Zmlmb19jb3VudCkpOworCX0KKwlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKyAgICAgICAJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDEpOworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9FTkJSRVNFTCk7CisgICAgICAgCW1lc2hfZmx1c2hfaW8obXIpOworCXVkZWxheSgxKTsKKwlvdXRfOCgmbXItPnN5bmNfcGFyYW1zLCBBU1lOQ19QQVJBTVMpOworCisJLyoKKwkgKiBGaW5kIG91dCB3aG8gcmVzZWxlY3RlZCB1cy4KKwkgKi8KKwlpZiAoaW5fOCgmbXItPmZpZm9fY291bnQpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiByZXNlbGVjdGlvbiBidXQgbm90aGluZyBpbiBmaWZvP1xuIik7CisJCW1zLT5jb25uX3RndCA9IG1zLT5ob3N0LT50aGlzX2lkOworCQlnb3RvIGJvZ3VzOworCX0KKwkvKiBnZXQgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgZmlmbyAqLworCWRvIHsKKwkJYiA9IGluXzgoJm1yLT5maWZvKTsKKwkJZGxvZyhtcywgInJlc2VsZGF0YSAleCIsIGIpOworCX0gd2hpbGUgKGluXzgoJm1yLT5maWZvX2NvdW50KSk7CisJZm9yICh0ID0gMDsgdCA8IDg7ICsrdCkKKwkJaWYgKChiICYgKDEgPDwgdCkpICE9IDAgJiYgdCAhPSBtcy0+aG9zdC0+dGhpc19pZCkKKwkJCWJyZWFrOworCWlmIChiICE9ICgxIDw8IHQpICsgKDEgPDwgbXMtPmhvc3QtPnRoaXNfaWQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogYmFkIHJlc2VsZWN0aW9uIGRhdGEgJXhcbiIsIGIpOworCQltcy0+Y29ubl90Z3QgPSBtcy0+aG9zdC0+dGhpc19pZDsKKwkJZ290byBib2d1czsKKwl9CisKKworCS8qCisJICogU2V0IHVwIHRvIGNvbnRpbnVlIHdpdGggdGhhdCB0YXJnZXQncyB0cmFuc2Zlci4KKwkgKi8KKwltcy0+Y29ubl90Z3QgPSB0OworCXRwID0gJm1zLT50Z3RzW3RdOworCW91dF84KCZtci0+c3luY19wYXJhbXMsIHRwLT5zeW5jX3BhcmFtcyk7CisJaWYgKEFMTE9XX0RFQlVHKHQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoOiByZXNlbGVjdGVkIGJ5IHRhcmdldCAlZFxuIiwgdCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoOiBzYXZlZF9wdHI9JXggZ29lc19vdXQ9JWQgY21kPSVwXG4iLAorCQkgICAgICAgdHAtPnNhdmVkX3B0ciwgdHAtPmRhdGFfZ29lc19vdXQsIHRwLT5jdXJyZW50X3JlcSk7CisJfQorCW1zLT5jdXJyZW50X3JlcSA9IHRwLT5jdXJyZW50X3JlcTsKKwlpZiAodHAtPmN1cnJlbnRfcmVxID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiByZXNlbGVjdGVkIGJ5IHRndCAlZCBidXQgbm8gY21kIVxuIiwgdCk7CisJCWdvdG8gYm9ndXM7CisJfQorCW1zLT5kYXRhX3B0ciA9IHRwLT5zYXZlZF9wdHI7CisJZGxvZyhtcywgInJlc2VsIHByZXYgdGd0PSVkIiwgcHJldik7CisJZGxvZyhtcywgInJlc2VsIGVyci9leGM9JS40eCIsIE1LV09SRCgwLCAwLCBtci0+ZXJyb3IsIG1yLT5leGNlcHRpb24pKTsKKwlzdGFydF9waGFzZShtcyk7CisJcmV0dXJuOworCitib2d1czoKKwlkdW1wbG9nKG1zLCBtcy0+Y29ubl90Z3QpOworCWR1bXBzbG9nKG1zKTsKKwltcy0+ZGF0YV9wdHIgPSAwOworCW1zLT5hYm9ydGluZyA9IDE7CisJc3RhcnRfcGhhc2UobXMpOworfQorCitzdGF0aWMgdm9pZCBkb19hYm9ydChzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJbXMtPm1zZ291dFswXSA9IEFCT1JUOworCW1zLT5uX21zZ291dCA9IDE7CisJbXMtPmFib3J0aW5nID0gMTsKKwltcy0+c3RhdCA9IERJRF9BQk9SVDsKKwlkbG9nKG1zLCAiYWJvcnQiLCAwKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3Jlc2V0KHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwlpbnQgdGd0OworCXN0cnVjdCBtZXNoX3RhcmdldCAqdHA7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKworCWZvciAodGd0ID0gMDsgdGd0IDwgODsgKyt0Z3QpIHsKKwkJdHAgPSAmbXMtPnRndHNbdGd0XTsKKwkJaWYgKChjbWQgPSB0cC0+Y3VycmVudF9yZXEpICE9IE5VTEwpIHsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJdHAtPmN1cnJlbnRfcmVxID0gTlVMTDsKKwkJCW1lc2hfY29tcGxldGVkKG1zLCBjbWQpOworCQl9CisJCW1zLT50Z3RzW3RndF0uc2R0cl9zdGF0ZSA9IGRvX3NkdHI7CisJCW1zLT50Z3RzW3RndF0uc3luY19wYXJhbXMgPSBBU1lOQ19QQVJBTVM7CisJfQorCW1zLT5jdXJyZW50X3JlcSA9IE5VTEw7CisJd2hpbGUgKChjbWQgPSBtcy0+cmVxdWVzdF9xKSAhPSBOVUxMKSB7CisJCW1zLT5yZXF1ZXN0X3EgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCWNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQltZXNoX2NvbXBsZXRlZChtcywgY21kKTsKKwl9CisJbXMtPnBoYXNlID0gaWRsZTsKKwltcy0+bXNncGhhc2UgPSBtc2dfbm9uZTsKKwlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfRkxVU0hGSUZPKTsKKyAgICAgICAJbWVzaF9mbHVzaF9pbyhtcik7CisJdWRlbGF5KDEpOworCW91dF84KCZtci0+c3luY19wYXJhbXMsIEFTWU5DX1BBUkFNUyk7CisJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0VOQlJFU0VMKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRvX21lc2hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9ICgoc3RydWN0IG1lc2hfc3RhdGUgKilkZXZfaWQpLT5ob3N0OworCQorCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJbWVzaF9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHB0cmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2Vycm9yKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwlpbnQgZXJyLCBleGMsIGNvdW50OworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKworCWVyciA9IGluXzgoJm1yLT5lcnJvcik7CisJZXhjID0gaW5fOCgmbXItPmV4Y2VwdGlvbik7CisJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJZGxvZyhtcywgImVycm9yIGVyci9leGMvZmMvY2w9JS44eCIsCisJICAgICBNS1dPUkQoZXJyLCBleGMsIG1yLT5maWZvX2NvdW50LCBtci0+Y291bnRfbG8pKTsKKwlpZiAoZXJyICYgRVJSX1NDU0lSRVNFVCkgeworCQkvKiBTQ1NJIGJ1cyB3YXMgcmVzZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAibWVzaDogU0NTSSBidXMgcmVzZXQgZGV0ZWN0ZWQ6ICIKKwkJICAgICAgICJ3YWl0aW5nIGZvciBlbmQuLi4iKTsKKwkJd2hpbGUgKChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgQlMxX1JTVCkgIT0gMCkKKwkJCXVkZWxheSgxKTsKKwkJcHJpbnRrKCJkb25lXG4iKTsKKwkJaGFuZGxlX3Jlc2V0KG1zKTsKKwkJLyogcmVxdWVzdF9xIGlzIGVtcHR5LCBubyBwb2ludCBpbiBtZXNoX3N0YXJ0KCkgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAoZXJyICYgRVJSX1VORVhQRElTQykgeworCQkvKiBVbmV4cGVjdGVkIGRpc2Nvbm5lY3QgKi8KKwkJaWYgKGV4YyAmIEVYQ19SRVNFTEVDVEVEKSB7CisJCQlyZXNlbGVjdGVkKG1zKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIW1zLT5hYm9ydGluZykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVzaDogdGFyZ2V0ICVkIGFib3J0ZWRcbiIsCisJCQkgICAgICAgbXMtPmNvbm5fdGd0KTsKKwkJCWR1bXBsb2cobXMsIG1zLT5jb25uX3RndCk7CisJCQlkdW1wc2xvZyhtcyk7CisJCX0KKwkJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9DTURET05FKTsKKwkJbXMtPnN0YXQgPSBESURfQUJPUlQ7CisJCW1lc2hfZG9uZShtcywgMSk7CisJCXJldHVybjsKKwl9CisJaWYgKGVyciAmIEVSUl9QQVJJVFkpIHsKKwkJaWYgKG1zLT5tc2dwaGFzZSA9PSBtc2dfaW4pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWVzaDogbXNnIHBhcml0eSBlcnJvciwgdGFyZ2V0ICVkXG4iLAorCQkJICAgICAgIG1zLT5jb25uX3RndCk7CisJCQltcy0+bXNnb3V0WzBdID0gTVNHX1BBUklUWV9FUlJPUjsKKwkJCW1zLT5uX21zZ291dCA9IDE7CisJCQltcy0+bXNncGhhc2UgPSBtc2dfaW5fYmFkOworCQkJY21kX2NvbXBsZXRlKG1zKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobXMtPnN0YXQgPT0gRElEX09LKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IHBhcml0eSBlcnJvciwgdGFyZ2V0ICVkXG4iLAorCQkJICAgICAgIG1zLT5jb25uX3RndCk7CisJCQltcy0+c3RhdCA9IERJRF9QQVJJVFk7CisJCX0KKwkJY291bnQgPSAobXItPmNvdW50X2hpIDw8IDgpICsgbXItPmNvdW50X2xvOworCQlpZiAoY291bnQgPT0gMCkgeworCQkJY21kX2NvbXBsZXRlKG1zKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlaXNzdWUgdGhlIGRhdGEgdHJhbnNmZXIgY29tbWFuZCAqLworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgbXItPnNlcXVlbmNlKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmIChlcnIgJiBFUlJfU0VRRVJSKSB7CisJCWlmIChleGMgJiBFWENfUkVTRUxFQ1RFRCkgeworCQkJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHdlIGlzc3VlIGEgY29tbWFuZCB0bworCQkJICAgZ2V0IHRoZSBidXMganVzdCBhZnRlciB0aGUgdGFyZ2V0IHJlc2VsZWN0cyB1cy4gKi8KKwkJCXN0YXRpYyBpbnQgbWVzaF9yZXNlbF9zZXFlcnI7CisJCQltZXNoX3Jlc2VsX3NlcWVycisrOworCQkJcmVzZWxlY3RlZChtcyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGV4YyA9PSBFWENfUEhBU0VNTSkgeworCQkJc3RhdGljIGludCBtZXNoX3BoYXNlbW1fc2VxZXJyOworCQkJbWVzaF9waGFzZW1tX3NlcWVycisrOworCQkJcGhhc2VfbWlzbWF0Y2gobXMpOworCQkJcmV0dXJuOworCQl9CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogc2VxdWVuY2UgZXJyb3IgKGVycj0leCBleGM9JXgpXG4iLAorCQkgICAgICAgZXJyLCBleGMpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogdW5rbm93biBlcnJvciAleCAoZXhjPSV4KVxuIiwgZXJyLCBleGMpOworCX0KKwltZXNoX2R1bXBfcmVncyhtcyk7CisJZHVtcGxvZyhtcywgbXMtPmNvbm5fdGd0KTsKKwlpZiAobXMtPnBoYXNlID4gc2VsZWN0aW5nICYmIChpbl84KCZtci0+YnVzX3N0YXR1czEpICYgQlMxX0JTWSkpIHsKKwkJLyogdHJ5IHRvIGRvIHdoYXQgdGhlIHRhcmdldCB3YW50cyAqLworCQlkb19hYm9ydChtcyk7CisJCXBoYXNlX21pc21hdGNoKG1zKTsKKwkJcmV0dXJuOworCX0KKwltcy0+c3RhdCA9IERJRF9FUlJPUjsKKwltZXNoX2RvbmUobXMsIDEpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZXhjZXB0aW9uKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwlpbnQgZXhjOworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKworCWV4YyA9IGluXzgoJm1yLT5leGNlcHRpb24pOworCW91dF84KCZtci0+aW50ZXJydXB0LCBJTlRfRVhDRVBUSU9OIHwgSU5UX0NNRERPTkUpOworCWlmIChleGMgJiBFWENfUkVTRUxFQ1RFRCkgeworCQlzdGF0aWMgaW50IG1lc2hfcmVzZWxfZXhjOworCQltZXNoX3Jlc2VsX2V4YysrOworCQlyZXNlbGVjdGVkKG1zKTsKKwl9IGVsc2UgaWYgKGV4YyA9PSBFWENfQVJCTE9TVCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogbG9zdCBhcmJpdHJhdGlvblxuIik7CisJCW1zLT5zdGF0ID0gRElEX0JVU19CVVNZOworCQltZXNoX2RvbmUobXMsIDEpOworCX0gZWxzZSBpZiAoZXhjID09IEVYQ19TRUxUTykgeworCQkvKiBzZWxlY3Rpb24gdGltZWQgb3V0ICovCisJCW1zLT5zdGF0ID0gRElEX0JBRF9UQVJHRVQ7CisJCW1lc2hfZG9uZShtcywgMSk7CisJfSBlbHNlIGlmIChleGMgPT0gRVhDX1BIQVNFTU0pIHsKKwkJLyogdGFyZ2V0IHdhbnRzIHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQ6CisJCSAgIGZpbmQgb3V0IHdoYXQgaXQgd2FudHMgYW5kIGRvIGl0LiAqLworCQlwaGFzZV9taXNtYXRjaChtcyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBjYW4ndCBjb3BlIHdpdGggZXhjZXB0aW9uICV4XG4iLCBleGMpOworCQltZXNoX2R1bXBfcmVncyhtcyk7CisJCWR1bXBsb2cobXMsIG1zLT5jb25uX3RndCk7CisJCWRvX2Fib3J0KG1zKTsKKwkJcGhhc2VfbWlzbWF0Y2gobXMpOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX21zZ2luKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwlpbnQgaSwgY29kZTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBtcy0+Y3VycmVudF9yZXE7CisJc3RydWN0IG1lc2hfdGFyZ2V0ICp0cCA9ICZtcy0+dGd0c1ttcy0+Y29ubl90Z3RdOworCisJaWYgKG1zLT5uX21zZ2luID09IDApCisJCXJldHVybjsKKwljb2RlID0gbXMtPm1zZ2luWzBdOworCWlmIChBTExPV19ERUJVRyhtcy0+Y29ubl90Z3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJnb3QgJWQgbWVzc2FnZSBieXRlczoiLCBtcy0+bl9tc2dpbik7CisJCWZvciAoaSA9IDA7IGkgPCBtcy0+bl9tc2dpbjsgKytpKQorCQkJcHJpbnRrKCIgJXgiLCBtcy0+bXNnaW5baV0pOworCQlwcmludGsoIlxuIik7CisJfQorCWRsb2cobXMsICJtc2dpbiBtc2c9JS44eCIsCisJICAgICBNS1dPUkQobXMtPm5fbXNnaW4sIGNvZGUsIG1zLT5tc2dpblsxXSwgbXMtPm1zZ2luWzJdKSk7CisKKwltcy0+ZXhwZWN0X3JlcGx5ID0gMDsKKwltcy0+bl9tc2dvdXQgPSAwOworCWlmIChtcy0+bl9tc2dpbiA8IG1zZ2luX2xlbmd0aChtcykpCisJCWdvdG8gcmVqZWN0OworCWlmIChjbWQpCisJCWNtZC0+U0NwLk1lc3NhZ2UgPSBjb2RlOworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQ09NTUFORF9DT01QTEVURToKKwkJYnJlYWs7CisJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQlzd2l0Y2ggKG1zLT5tc2dpblsyXSkgeworCQljYXNlIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVI6CisJCQltcy0+ZGF0YV9wdHIgKz0gKG1zLT5tc2dpblszXSA8PCAyNCkgKyBtcy0+bXNnaW5bNl0KKwkJCQkrIChtcy0+bXNnaW5bNF0gPDwgMTYpICsgKG1zLT5tc2dpbls1XSA8PCA4KTsKKwkJCWJyZWFrOworCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQlpZiAodHAtPnNkdHJfc3RhdGUgIT0gc2R0cl9zZW50KSB7CisJCQkJLyogcmVwbHkgd2l0aCBhbiBTRFRSICovCisJCQkJYWRkX3NkdHJfbXNnKG1zKTsKKwkJCQkvKiBsaW1pdCBwZXJpb2QgdG8gYXQgbGVhc3QgaGlzIHZhbHVlLAorCQkJCSAgIG9mZnNldCB0byBubyBtb3JlIHRoYW4gaGlzICovCisJCQkJaWYgKG1zLT5tc2dvdXRbM10gPCBtcy0+bXNnaW5bM10pCisJCQkJCW1zLT5tc2dvdXRbM10gPSBtcy0+bXNnaW5bM107CisJCQkJaWYgKG1zLT5tc2dvdXRbNF0gPiBtcy0+bXNnaW5bNF0pCisJCQkJCW1zLT5tc2dvdXRbNF0gPSBtcy0+bXNnaW5bNF07CisJCQkJc2V0X3NkdHIobXMsIG1zLT5tc2dvdXRbM10sIG1zLT5tc2dvdXRbNF0pOworCQkJCW1zLT5tc2dwaGFzZSA9IG1zZ19vdXQ7CisJCQl9IGVsc2UgeworCQkJCXNldF9zZHRyKG1zLCBtcy0+bXNnaW5bM10sIG1zLT5tc2dpbls0XSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcmVqZWN0OworCQl9CisJCWJyZWFrOworCWNhc2UgU0FWRV9QT0lOVEVSUzoKKwkJdHAtPnNhdmVkX3B0ciA9IG1zLT5kYXRhX3B0cjsKKwkJYnJlYWs7CisJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQltcy0+ZGF0YV9wdHIgPSB0cC0+c2F2ZWRfcHRyOworCQlicmVhazsKKwljYXNlIERJU0NPTk5FQ1Q6CisJCW1zLT5waGFzZSA9IGRpc2Nvbm5lY3Rpbmc7CisJCWJyZWFrOworCWNhc2UgQUJPUlQ6CisJCWJyZWFrOworCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCWlmICh0cC0+c2R0cl9zdGF0ZSA9PSBzZHRyX3NlbnQpCisJCQlzZXRfc2R0cihtcywgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgTk9QOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoSURFTlRJRllfQkFTRSA8PSBjb2RlICYmIGNvZGUgPD0gSURFTlRJRllfQkFTRSArIDcpIHsKKwkJCWlmIChjbWQgPT0gTlVMTCkgeworCQkJCWRvX2Fib3J0KG1zKTsKKwkJCQltcy0+bXNncGhhc2UgPSBtc2dfb3V0OworCQkJfSBlbHNlIGlmIChjb2RlICE9IGNtZC0+ZGV2aWNlLT5sdW4gKyBJREVOVElGWV9CQVNFKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVzaDogbHVuIG1pc21hdGNoICIKKwkJCQkgICAgICAgIiglZCAhPSAlZCkgb24gcmVzZWxlY3Rpb24gZnJvbSAiCisJCQkJICAgICAgICJ0YXJnZXQgJWRcbiIsIGNvZGUgLSBJREVOVElGWV9CQVNFLAorCQkJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCBtcy0+Y29ubl90Z3QpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJZ290byByZWplY3Q7CisJfQorCXJldHVybjsKKworIHJlamVjdDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJtZXNoOiByZWplY3RpbmcgbWVzc2FnZSBmcm9tIHRhcmdldCAlZDoiLAorCSAgICAgICBtcy0+Y29ubl90Z3QpOworCWZvciAoaSA9IDA7IGkgPCBtcy0+bl9tc2dpbjsgKytpKQorCQlwcmludGsoIiAleCIsIG1zLT5tc2dpbltpXSk7CisJcHJpbnRrKCJcbiIpOworCW1zLT5tc2dvdXRbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwltcy0+bl9tc2dvdXQgPSAxOworCW1zLT5tc2dwaGFzZSA9IG1zZ19vdXQ7Cit9CisKKy8qCisgKiBTZXQgdXAgRE1BIGNvbW1hbmRzIGZvciB0cmFuc2ZlcnJpbmcgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgc2V0X2RtYV9jbWRzKHN0cnVjdCBtZXNoX3N0YXRlICptcywgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludCBpLCBkbWFfY21kLCB0b3RhbCwgb2ZmLCBkdG90OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NsOworCXN0cnVjdCBkYmRtYV9jbWQgKmRjbWRzOworCisJZG1hX2NtZCA9IG1zLT50Z3RzW21zLT5jb25uX3RndF0uZGF0YV9nb2VzX291dD8KKwkJT1VUUFVUX01PUkU6IElOUFVUX01PUkU7CisJZGNtZHMgPSBtcy0+ZG1hX2NtZHM7CisJZHRvdCA9IDA7CisJaWYgKGNtZCkgeworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWlmIChjbWQtPnVzZV9zZyA+IDApIHsKKwkJCWludCBuc2VnOworCQkJdG90YWwgPSAwOworCQkJc2NsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPmJ1ZmZlcjsKKwkJCW9mZiA9IG1zLT5kYXRhX3B0cjsKKwkJCW5zZWcgPSBwY2lfbWFwX3NnKG1zLT5wZGV2LCBzY2wsIGNtZC0+dXNlX3NnLAorCQkJCQkgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJZm9yIChpID0gMDsgaSA8bnNlZzsgKytpLCArK3NjbCkgeworCQkJCXUzMiBkbWFfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNjbCk7CisJCQkJdTMyIGRtYV9sZW4gPSBzZ19kbWFfbGVuKHNjbCk7CisJCQkJCisJCQkJdG90YWwgKz0gc2NsLT5sZW5ndGg7CisJCQkJaWYgKG9mZiA+PSBkbWFfbGVuKSB7CisJCQkJCW9mZiAtPSBkbWFfbGVuOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGRtYV9sZW4gPiAweGZmZmYpCisJCQkJCXBhbmljKCJtZXNoOiBzY2F0dGVybGlzdCBlbGVtZW50ID49IDY0ayIpOworCQkJCXN0X2xlMTYoJmRjbWRzLT5yZXFfY291bnQsIGRtYV9sZW4gLSBvZmYpOworCQkJCXN0X2xlMTYoJmRjbWRzLT5jb21tYW5kLCBkbWFfY21kKTsKKwkJCQlzdF9sZTMyKCZkY21kcy0+cGh5X2FkZHIsIGRtYV9hZGRyICsgb2ZmKTsKKwkJCQlkY21kcy0+eGZlcl9zdGF0dXMgPSAwOworCQkJCSsrZGNtZHM7CisJCQkJZHRvdCArPSBkbWFfbGVuIC0gb2ZmOworCQkJCW9mZiA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAobXMtPmRhdGFfcHRyIDwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJCWR0b3QgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbiAtIG1zLT5kYXRhX3B0cjsKKwkJCWlmIChkdG90ID4gMHhmZmZmKQorCQkJCXBhbmljKCJtZXNoOiB0cmFuc2ZlciBzaXplID49IDY0ayIpOworCQkJc3RfbGUxNigmZGNtZHMtPnJlcV9jb3VudCwgZHRvdCk7CisJCQkvKiBYWFggVXNlIHBjaSBETUEgQVBJIGhlcmUgLi4uICovCisJCQlzdF9sZTMyKCZkY21kcy0+cGh5X2FkZHIsCisJCQkJdmlydF90b19waHlzKGNtZC0+cmVxdWVzdF9idWZmZXIpICsgbXMtPmRhdGFfcHRyKTsKKwkJCWRjbWRzLT54ZmVyX3N0YXR1cyA9IDA7CisJCQkrK2RjbWRzOworCQl9CisJfQorCWlmIChkdG90ID09IDApIHsKKwkJLyogRWl0aGVyIHRoZSB0YXJnZXQgaGFzIG92ZXJydW4gb3VyIGJ1ZmZlciwKKwkJICAgb3IgdGhlIGNhbGxlciBkaWRuJ3QgcHJvdmlkZSBhIGJ1ZmZlci4gKi8KKwkJc3RhdGljIGNoYXIgbWVzaF9leHRyYV9idWZbNjRdOworCisJCWR0b3QgPSBzaXplb2YobWVzaF9leHRyYV9idWYpOworCQlzdF9sZTE2KCZkY21kcy0+cmVxX2NvdW50LCBkdG90KTsKKwkJc3RfbGUzMigmZGNtZHMtPnBoeV9hZGRyLCB2aXJ0X3RvX3BoeXMobWVzaF9leHRyYV9idWYpKTsKKwkJZGNtZHMtPnhmZXJfc3RhdHVzID0gMDsKKwkJKytkY21kczsKKwl9CisJZG1hX2NtZCArPSBPVVRQVVRfTEFTVCAtIE9VVFBVVF9NT1JFOworCXN0X2xlMTYoJmRjbWRzWy0xXS5jb21tYW5kLCBkbWFfY21kKTsKKwltZW1zZXQoZGNtZHMsIDAsIHNpemVvZigqZGNtZHMpKTsKKwlzdF9sZTE2KCZkY21kcy0+Y29tbWFuZCwgREJETUFfU1RPUCk7CisJbXMtPmRtYV9jb3VudCA9IGR0b3Q7Cit9CisKK3N0YXRpYyB2b2lkIGhhbHRfZG1hKHN0cnVjdCBtZXNoX3N0YXRlICptcykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICptZCA9IG1zLT5kbWE7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IG1zLT5jdXJyZW50X3JlcTsKKwlpbnQgdCwgbmI7CisKKwlpZiAoIW1zLT50Z3RzW21zLT5jb25uX3RndF0uZGF0YV9nb2VzX291dCkgeworCQkvKiB3YWl0IGEgbGl0dGxlIHdoaWxlIHVudGlsIHRoZSBmaWZvIGRyYWlucyAqLworCQl0ID0gNTA7CisJCXdoaWxlICh0ID4gMCAmJiBpbl84KCZtci0+Zmlmb19jb3VudCkgIT0gMAorCQkgICAgICAgJiYgKGluX2xlMzIoJm1kLT5zdGF0dXMpICYgQUNUSVZFKSAhPSAwKSB7CisJCQktLXQ7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9CisJb3V0X2xlMzIoJm1kLT5jb250cm9sLCBSVU4gPDwgMTYpOwkvKiB0dXJuIG9mZiBSVU4gYml0ICovCisJbmIgPSAobXItPmNvdW50X2hpIDw8IDgpICsgbXItPmNvdW50X2xvOworCWRsb2cobXMsICJoYWx0X2RtYSBmYy9jb3VudD0lLjZ4IiwKKwkgICAgIE1LV09SRCgwLCBtci0+Zmlmb19jb3VudCwgMCwgbmIpKTsKKwlpZiAobXMtPnRndHNbbXMtPmNvbm5fdGd0XS5kYXRhX2dvZXNfb3V0KQorCQluYiArPSBtci0+Zmlmb19jb3VudDsKKwkvKiBuYiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5vdCB5ZXQgdHJhbnNmZXJyZWQKKwkgICB0by9mcm9tIHRoZSB0YXJnZXQuICovCisJbXMtPmRhdGFfcHRyIC09IG5iOworCWRsb2cobXMsICJkYXRhX3B0ciAleCIsIG1zLT5kYXRhX3B0cik7CisJaWYgKG1zLT5kYXRhX3B0ciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBoYWx0X2RtYTogZGF0YV9wdHI9JWQgKG5iPSVkLCBtcz0lcClcbiIsCisJCSAgICAgICBtcy0+ZGF0YV9wdHIsIG5iLCBtcyk7CisJCW1zLT5kYXRhX3B0ciA9IDA7CisjaWZkZWYgTUVTSF9EQkcKKwkJZHVtcGxvZyhtcywgbXMtPmNvbm5fdGd0KTsKKwkJZHVtcHNsb2cobXMpOworI2VuZGlmIC8qIE1FU0hfREJHICovCisJfSBlbHNlIGlmIChjbWQgJiYgY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCAmJgorCQkgICBtcy0+ZGF0YV9wdHIgPiBjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogdGFyZ2V0ICVkIG92ZXJydW4sICIKKwkJICAgICAgICJkYXRhX3B0cj0leCB0b3RhbD0leCBnb2VzX291dD0lZFxuIiwKKwkJICAgICAgIG1zLT5jb25uX3RndCwgbXMtPmRhdGFfcHRyLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJICAgICAgIG1zLT50Z3RzW21zLT5jb25uX3RndF0uZGF0YV9nb2VzX291dCk7CisJfQorCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXBjaV91bm1hcF9zZyhtcy0+cGRldiwgc2csIGNtZC0+dXNlX3NnLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9CisJbXMtPmRtYV9zdGFydGVkID0gMDsKK30KKworc3RhdGljIHZvaWQgcGhhc2VfbWlzbWF0Y2goc3RydWN0IG1lc2hfc3RhdGUgKm1zKQoreworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwlpbnQgcGhhc2U7CisKKwlkbG9nKG1zLCAicGhhc2VtbSBjaC9jbC9zZXEvZmM9JS44eCIsCisJICAgICBNS1dPUkQobXItPmNvdW50X2hpLCBtci0+Y291bnRfbG8sIG1yLT5zZXF1ZW5jZSwgbXItPmZpZm9fY291bnQpKTsKKwlwaGFzZSA9IGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfUEhBU0U7CisJaWYgKG1zLT5tc2dwaGFzZSA9PSBtc2dfb3V0X3h4eCAmJiBwaGFzZSA9PSBCUF9NU0dPVVQpIHsKKwkJLyogb3V0cHV0IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UsIHdpdGhvdXQgQVROICovCisJCW91dF84KCZtci0+Y291bnRfbG8sIDEpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfTVNHT1VUICsgdXNlX2FjdGl2ZV9uZWcpOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJdWRlbGF5KDEpOworCQlvdXRfOCgmbXItPmZpZm8sIG1zLT5tc2dvdXRbbXMtPm5fbXNnb3V0LTFdKTsKKwkJbXMtPm1zZ3BoYXNlID0gbXNnX291dF9sYXN0OworCQlyZXR1cm47CisJfQorCisJaWYgKG1zLT5tc2dwaGFzZSA9PSBtc2dfaW4pIHsKKwkJZ2V0X21zZ2luKG1zKTsKKwkJaWYgKG1zLT5uX21zZ2luKQorCQkJaGFuZGxlX21zZ2luKG1zKTsKKwl9CisKKwlpZiAobXMtPmRtYV9zdGFydGVkKQorCQloYWx0X2RtYShtcyk7CisJaWYgKG1yLT5maWZvX2NvdW50KSB7CisJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9GTFVTSEZJRk8pOworCQltZXNoX2ZsdXNoX2lvKG1yKTsKKwkJdWRlbGF5KDEpOworCX0KKworCW1zLT5tc2dwaGFzZSA9IG1zZ19ub25lOworCXN3aXRjaCAocGhhc2UpIHsKKwljYXNlIEJQX0RBVEFJTjoKKwkJbXMtPnRndHNbbXMtPmNvbm5fdGd0XS5kYXRhX2dvZXNfb3V0ID0gMDsKKwkJbXMtPnBoYXNlID0gZGF0YWluZzsKKwkJYnJlYWs7CisJY2FzZSBCUF9EQVRBT1VUOgorCQltcy0+dGd0c1ttcy0+Y29ubl90Z3RdLmRhdGFfZ29lc19vdXQgPSAxOworCQltcy0+cGhhc2UgPSBkYXRhaW5nOworCQlicmVhazsKKwljYXNlIEJQX0NPTU1BTkQ6CisJCW1zLT5waGFzZSA9IGNvbW1hbmRpbmc7CisJCWJyZWFrOworCWNhc2UgQlBfU1RBVFVTOgorCQltcy0+cGhhc2UgPSBzdGF0dXNpbmc7CisJCWJyZWFrOworCWNhc2UgQlBfTVNHSU46CisJCW1zLT5tc2dwaGFzZSA9IG1zZ19pbjsKKwkJbXMtPm5fbXNnaW4gPSAwOworCQlicmVhazsKKwljYXNlIEJQX01TR09VVDoKKwkJbXMtPm1zZ3BoYXNlID0gbXNnX291dDsKKwkJaWYgKG1zLT5uX21zZ291dCA9PSAwKSB7CisJCQlpZiAobXMtPmFib3J0aW5nKSB7CisJCQkJZG9fYWJvcnQobXMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobXMtPmxhc3Rfbl9tc2dvdXQgPT0gMCkgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgIm1lc2g6IG5vIG1zZyB0byByZXBlYXRcbiIpOworCQkJCQltcy0+bXNnb3V0WzBdID0gTk9QOworCQkJCQltcy0+bGFzdF9uX21zZ291dCA9IDE7CisJCQkJfQorCQkJCW1zLT5uX21zZ291dCA9IG1zLT5sYXN0X25fbXNnb3V0OworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoOiB1bmtub3duIHNjc2kgcGhhc2UgJXhcbiIsIHBoYXNlKTsKKwkJbXMtPnN0YXQgPSBESURfRVJST1I7CisJCW1lc2hfZG9uZShtcywgMSk7CisJCXJldHVybjsKKwl9CisKKwlzdGFydF9waGFzZShtcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9jb21wbGV0ZShzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMpCit7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IG1zLT5jdXJyZW50X3JlcTsKKwlzdHJ1Y3QgbWVzaF90YXJnZXQgKnRwID0gJm1zLT50Z3RzW21zLT5jb25uX3RndF07CisJaW50IHNlcSwgbiwgdDsKKworCWRsb2cobXMsICJjbWRfY29tcGxldGUgZmM9JXgiLCBtci0+Zmlmb19jb3VudCk7CisJc2VxID0gdXNlX2FjdGl2ZV9uZWcgKyAobXMtPm5fbXNnb3V0PyBTRVFfQVROOiAwKTsKKwlzd2l0Y2ggKG1zLT5tc2dwaGFzZSkgeworCWNhc2UgbXNnX291dF94eHg6CisJCS8qIGh1aD8gIHdlIGV4cGVjdGVkIGEgcGhhc2UgbWlzbWF0Y2ggKi8KKwkJbXMtPm5fbXNnaW4gPSAwOworCQltcy0+bXNncGhhc2UgPSBtc2dfaW47CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBtc2dfaW46CisJCS8qIHNob3VsZCBoYXZlIHNvbWUgbWVzc2FnZSBieXRlcyBpbiBmaWZvICovCisJCWdldF9tc2dpbihtcyk7CisJCW4gPSBtc2dpbl9sZW5ndGgobXMpOworCQlpZiAobXMtPm5fbXNnaW4gPCBuKSB7CisJCQlvdXRfOCgmbXItPmNvdW50X2xvLCBuIC0gbXMtPm5fbXNnaW4pOworCQkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR0lOICsgc2VxKTsKKwkJfSBlbHNlIHsKKwkJCW1zLT5tc2dwaGFzZSA9IG1zZ19ub25lOworCQkJaGFuZGxlX21zZ2luKG1zKTsKKwkJCXN0YXJ0X3BoYXNlKG1zKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgbXNnX2luX2JhZDoKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX0ZMVVNIRklGTyk7CisJCW1lc2hfZmx1c2hfaW8obXIpOworCQl1ZGVsYXkoMSk7CisJCW91dF84KCZtci0+Y291bnRfbG8sIDEpOworCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfTVNHSU4gKyBTRVFfQVROICsgdXNlX2FjdGl2ZV9uZWcpOworCQlicmVhazsKKworCWNhc2UgbXNnX291dDoKKwkJLyoKKwkJICogVG8gZ2V0IHRoZSByaWdodCB0aW1pbmcgb24gQVROIHdydCBBQ0ssIHdlIGhhdmUKKwkJICogdG8gZ2V0IHRoZSBNRVNIIHRvIGRyb3AgQUNLLCB3YWl0IHVudGlsIFJFUSBnZXRzCisJCSAqIGFzc2VydGVkLCB0aGVuIGRyb3AgQVROLiAgVG8gZG8gdGhpcyB3ZSBmaXJzdAorCQkgKiBpc3N1ZSBhIFNFUV9NU0dPVVQgd2l0aCBBVE4gYW5kIHdhaXQgZm9yIFJFUSwKKwkJICogdGhlbiBjaGFuZ2UgdGhlIGNvbW1hbmQgdG8gYSBTRVFfTVNHT1VUIHcvbyBBVE4uCisJCSAqIElmIHdlIGRvbid0IHNlZSBSRVEgaW4gYSByZWFzb25hYmxlIHRpbWUsIHdlCisJCSAqIGNoYW5nZSB0aGUgY29tbWFuZCB0byBTRVFfTVNHSU4gd2l0aCBBVE4sCisJCSAqIHdhaXQgZm9yIHRoZSBwaGFzZSBtaXNtYXRjaCBpbnRlcnJ1cHQsIHRoZW4KKwkJICogaXNzdWUgdGhlIFNFUV9NU0dPVVQgd2l0aG91dCBBVE4uCisJCSAqLworCQlvdXRfOCgmbXItPmNvdW50X2xvLCAxKTsKKwkJb3V0XzgoJm1yLT5zZXF1ZW5jZSwgU0VRX01TR09VVCArIHVzZV9hY3RpdmVfbmVnICsgU0VRX0FUTik7CisJCXQgPSAzMDsJCS8qIHdhaXQgdXAgdG8gMzB1cyAqLworCQl3aGlsZSAoKGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfUkVRKSA9PSAwICYmIC0tdCA+PSAwKQorCQkJdWRlbGF5KDEpOworCQlkbG9nKG1zLCAibGFzdF9tYnl0ZSBlcnIvZXhjL2ZjL2NsPSUuOHgiLAorCQkgICAgIE1LV09SRChtci0+ZXJyb3IsIG1yLT5leGNlcHRpb24sCisJCQkgICAgbXItPmZpZm9fY291bnQsIG1yLT5jb3VudF9sbykpOworCQlpZiAoaW5fOCgmbXItPmludGVycnVwdCkgJiAoSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTikpIHsKKwkJCS8qIHdob29wcywgdGFyZ2V0IGRpZG4ndCBkbyB3aGF0IHdlIGV4cGVjdGVkICovCisJCQltcy0+bGFzdF9uX21zZ291dCA9IG1zLT5uX21zZ291dDsKKwkJCW1zLT5uX21zZ291dCA9IDA7CisJCQlpZiAoaW5fOCgmbXItPmludGVycnVwdCkgJiBJTlRfRVJST1IpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGVycm9yICV4IGluIG1zZ19vdXRcbiIsCisJCQkJICAgICAgIGluXzgoJm1yLT5lcnJvcikpOworCQkJCWhhbmRsZV9lcnJvcihtcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGluXzgoJm1yLT5leGNlcHRpb24pICE9IEVYQ19QSEFTRU1NKQorCQkJCXByaW50ayhLRVJOX0VSUiAibWVzaDogZXhjICV4IGluIG1zZ19vdXRcbiIsCisJCQkJICAgICAgIGluXzgoJm1yLT5leGNlcHRpb24pKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibWVzaDogYnMwPSV4IGluIG1zZ19vdXRcbiIsCisJCQkJICAgICAgIGluXzgoJm1yLT5idXNfc3RhdHVzMCkpOworCQkJaGFuZGxlX2V4Y2VwdGlvbihtcyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfUkVRKSB7CisJCQlvdXRfOCgmbXItPnNlcXVlbmNlLCBTRVFfTVNHT1VUICsgdXNlX2FjdGl2ZV9uZWcpOworCQkJbWVzaF9mbHVzaF9pbyhtcik7CisJCQl1ZGVsYXkoMSk7CisJCQlvdXRfOCgmbXItPmZpZm8sIG1zLT5tc2dvdXRbbXMtPm5fbXNnb3V0LTFdKTsKKwkJCW1zLT5tc2dwaGFzZSA9IG1zZ19vdXRfbGFzdDsKKwkJfSBlbHNlIHsKKwkJCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9NU0dJTiArIHVzZV9hY3RpdmVfbmVnICsgU0VRX0FUTik7CisJCQltcy0+bXNncGhhc2UgPSBtc2dfb3V0X3h4eDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgbXNnX291dF9sYXN0OgorCQltcy0+bGFzdF9uX21zZ291dCA9IG1zLT5uX21zZ291dDsKKwkJbXMtPm5fbXNnb3V0ID0gMDsKKwkJbXMtPm1zZ3BoYXNlID0gbXMtPmV4cGVjdF9yZXBseT8gbXNnX2luOiBtc2dfbm9uZTsKKwkJc3RhcnRfcGhhc2UobXMpOworCQlicmVhazsKKworCWNhc2UgbXNnX25vbmU6CisJCXN3aXRjaCAobXMtPnBoYXNlKSB7CisJCWNhc2UgaWRsZToKKwkJCXByaW50ayhLRVJOX0VSUiAibWVzaDogaW50ZXJydXB0IGluIGlkbGUgcGhhc2U/XG4iKTsKKwkJCWR1bXBzbG9nKG1zKTsKKwkJCXJldHVybjsKKwkJY2FzZSBzZWxlY3Rpbmc6CisJCQlkbG9nKG1zLCAiU2VsZWN0aW5nIHBoYXNlIGF0IGNvbW1hbmQgY29tcGxldGlvbiIsMCk7CisJCQltcy0+bXNnb3V0WzBdID0gSURFTlRJRlkoQUxMT1dfUkVTRUwobXMtPmNvbm5fdGd0KSwKKwkJCQkJCSAoY21kPyBjbWQtPmRldmljZS0+bHVuOiAwKSk7CisJCQltcy0+bl9tc2dvdXQgPSAxOworCQkJbXMtPmV4cGVjdF9yZXBseSA9IDA7CisJCQlpZiAobXMtPmFib3J0aW5nKSB7CisJCQkJbXMtPm1zZ291dFswXSA9IEFCT1JUOworCQkJCW1zLT5uX21zZ291dCsrOworCQkJfSBlbHNlIGlmICh0cC0+c2R0cl9zdGF0ZSA9PSBkb19zZHRyKSB7CisJCQkJLyogYWRkIFNEVFIgbWVzc2FnZSAqLworCQkJCWFkZF9zZHRyX21zZyhtcyk7CisJCQkJbXMtPmV4cGVjdF9yZXBseSA9IDE7CisJCQkJdHAtPnNkdHJfc3RhdGUgPSBzZHRyX3NlbnQ7CisJCQl9CisJCQltcy0+bXNncGhhc2UgPSBtc2dfb3V0OworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gd2FpdCBmb3IgUkVRIGJlZm9yZSBkcm9wcGluZyBBVE4uCisJCQkgKiBXZSB3YWl0IGZvciBhdCBtb3N0IDMwdXMsIHRoZW4gZmFsbCBiYWNrIHRvCisJCQkgKiBhIHNjaGVtZSB3aGVyZSB3ZSBpc3N1ZSBhIFNFUV9DT01NQU5EIHdpdGggQVROLAorCQkJICogd2hpY2ggd2lsbCBnaXZlIHVzIGEgcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0CisJCQkgKiB3aGVuIFJFUSBkb2VzIGNvbWUsIGFuZCB0aGVuIHdlIHNlbmQgdGhlIG1lc3NhZ2UuCisJCQkgKi8KKwkJCXQgPSAyMzA7CQkvKiB3YWl0IHVwIHRvIDIzMHVzICovCisJCQl3aGlsZSAoKGluXzgoJm1yLT5idXNfc3RhdHVzMCkgJiBCUzBfUkVRKSA9PSAwKSB7CisJCQkJaWYgKC0tdCA8IDApIHsKKwkJCQkJZGxvZyhtcywgImltcGF0aWVudCBmb3IgcmVxIiwgbXMtPm5fbXNnb3V0KTsKKwkJCQkJbXMtPm1zZ3BoYXNlID0gbXNnX25vbmU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBkYXRhaW5nOgorCQkJaWYgKG1zLT5kbWFfY291bnQgIT0gMCkgeworCQkJCXN0YXJ0X3BoYXNlKG1zKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKgorCQkJICogV2UgY2FuIGdldCBhIHBoYXNlIG1pc21hdGNoIGhlcmUgaWYgdGhlIHRhcmdldAorCQkJICogY2hhbmdlcyB0byB0aGUgc3RhdHVzIHBoYXNlLCBldmVuIHRob3VnaCB3ZSBoYXZlCisJCQkgKiBoYWQgYSBjb21tYW5kIGNvbXBsZXRlIGludGVycnVwdC4gIFRoZW4sIGlmIHdlCisJCQkgKiBpc3N1ZSB0aGUgU0VRX1NUQVRVUyBjb21tYW5kLCB3ZSdsbCBnZXQgYSBzZXF1ZW5jZQorCQkJICogZXJyb3IgaW50ZXJydXB0LiAgV2hpY2ggaXNuJ3Qgc28gYmFkIGV4Y2VwdCB0aGF0CisJCQkgKiBvY2Nhc2lvbmFsbHkgdGhlIG1lc2ggYWN0dWFsbHkgZXhlY3V0ZXMgdGhlCisJCQkgKiBTRVFfU1RBVFVTICphcyB3ZWxsIGFzKiBnaXZpbmcgdXMgdGhlIHNlcXVlbmNlCisJCQkgKiBlcnJvciBhbmQgcGhhc2UgbWlzbWF0Y2ggZXhjZXB0aW9uLgorCQkJICovCisJCQlvdXRfOCgmbXItPnNlcXVlbmNlLCAwKTsKKwkJCW91dF84KCZtci0+aW50ZXJydXB0LAorCQkJICAgICAgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwkJCWhhbHRfZG1hKG1zKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXR1c2luZzoKKwkJCWlmIChjbWQpIHsKKwkJCQljbWQtPlNDcC5TdGF0dXMgPSBtci0+ZmlmbzsKKwkJCQlpZiAoREVCVUdfVEFSR0VUKGNtZCkpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJtZXNoOiBzdGF0dXMgaXMgJXhcbiIsCisJCQkJCSAgICAgICBjbWQtPlNDcC5TdGF0dXMpOworCQkJfQorCQkJbXMtPm1zZ3BoYXNlID0gbXNnX2luOworCQkJYnJlYWs7CisJCWNhc2UgYnVzZnJlZWluZzoKKwkJCW1lc2hfZG9uZShtcywgMSk7CisJCQlyZXR1cm47CisJCWNhc2UgZGlzY29ubmVjdGluZzoKKwkJCW1zLT5jdXJyZW50X3JlcSA9IE5VTEw7CisJCQltcy0+cGhhc2UgPSBpZGxlOworCQkJbWVzaF9zdGFydChtcyk7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQkrK21zLT5waGFzZTsKKwkJc3RhcnRfcGhhc2UobXMpOworCQlicmVhazsKKwl9Cit9CisKKworLyoKKyAqIENhbGxlZCBieSBtaWRsYXllciB3aXRoIGhvc3QgbG9ja2VkIHRvIHF1ZXVlIGEgbmV3CisgKiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbWVzaF9xdWV1ZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBtZXNoX3N0YXRlICptczsKKworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisJbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKG1zLT5yZXF1ZXN0X3EgPT0gTlVMTCkKKwkJbXMtPnJlcXVlc3RfcSA9IGNtZDsKKwllbHNlCisJCW1zLT5yZXF1ZXN0X3F0YWlsLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikgY21kOworCW1zLT5yZXF1ZXN0X3F0YWlsID0gY21kOworCisJaWYgKG1zLT5waGFzZSA9PSBpZGxlKQorCQltZXNoX3N0YXJ0KG1zKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsbGVkIHRvIGhhbmRsZSBpbnRlcnJ1cHRzLCBlaXRoZXIgY2FsbCBieSB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIChkb19tZXNoX2ludGVycnVwdCkgb3IgYnkgb3RoZXIgZnVuY3Rpb25zIGluCisgKiBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzCisgKi8KK3N0YXRpYyB2b2lkIG1lc2hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKikgZGV2X2lkOworCXZvbGF0aWxlIHN0cnVjdCBtZXNoX3JlZ3MgX19pb21lbSAqbXIgPSBtcy0+bWVzaDsKKwlpbnQgaW50cjsKKworI2lmIDAKKwlpZiAoQUxMT1dfREVCVUcobXMtPmNvbm5fdGd0KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1lc2hfaW50ciwgYnMwPSV4IGludD0leCBleGM9JXggZXJyPSV4ICIKKwkJICAgICAgICJwaGFzZT0lZCBtc2dwaGFzZT0lZFxuIiwgbXItPmJ1c19zdGF0dXMwLAorCQkgICAgICAgbXItPmludGVycnVwdCwgbXItPmV4Y2VwdGlvbiwgbXItPmVycm9yLAorCQkgICAgICAgbXMtPnBoYXNlLCBtcy0+bXNncGhhc2UpOworI2VuZGlmCisJd2hpbGUgKChpbnRyID0gaW5fOCgmbXItPmludGVycnVwdCkpICE9IDApIHsKKwkJZGxvZyhtcywgImludGVycnVwdCBpbnRyL2Vyci9leGMvc2VxPSUuOHgiLCAKKwkJICAgICBNS1dPUkQoaW50ciwgbXItPmVycm9yLCBtci0+ZXhjZXB0aW9uLCBtci0+c2VxdWVuY2UpKTsKKwkJaWYgKGludHIgJiBJTlRfRVJST1IpIHsKKwkJCWhhbmRsZV9lcnJvcihtcyk7CisJCX0gZWxzZSBpZiAoaW50ciAmIElOVF9FWENFUFRJT04pIHsKKwkJCWhhbmRsZV9leGNlcHRpb24obXMpOworCQl9IGVsc2UgaWYgKGludHIgJiBJTlRfQ01ERE9ORSkgeworCQkJb3V0XzgoJm1yLT5pbnRlcnJ1cHQsIElOVF9DTURET05FKTsKKwkJCWNtZF9jb21wbGV0ZShtcyk7CisJCX0KKwl9Cit9CisKKy8qIFRvZG86IGhlcmUgd2UgY2FuIGF0IGxlYXN0IHRyeSB0byByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSB0aGUKKyAqIHF1ZXVlIGlmIGl0IGlzbid0IGNvbm5lY3RlZCB5ZXQsIGFuZCBmb3IgcGVuZGluZyBjb21tYW5kLCBhc3NlcnQKKyAqIEFUTiB1bnRpbCB0aGUgYnVzIGdldHMgZnJlZWQuCisgKi8KK3N0YXRpYyBpbnQgbWVzaF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IG1lc2hfc3RhdGUgKm1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCXByaW50ayhLRVJOX0RFQlVHICJtZXNoX2Fib3J0KCVwKVxuIiwgY21kKTsKKwltZXNoX2R1bXBfcmVncyhtcyk7CisJZHVtcGxvZyhtcywgY21kLT5kZXZpY2UtPmlkKTsKKwlkdW1wc2xvZyhtcyk7CisJcmV0dXJuIEZBSUxFRDsKK30KKworLyoKKyAqIENhbGxlZCBieSB0aGUgbWlkbGF5ZXIgd2l0aCB0aGUgbG9jayBoZWxkIHRvIHJlc2V0IHRoZQorICogU0NTSSBob3N0IGFuZCBidXMuCisgKiBUaGUgbWlkbGF5ZXIgd2lsbCB3YWl0IGZvciBkZXZpY2VzIHRvIGNvbWUgYmFjaywgd2UgZG9uJ3QgbmVlZAorICogdG8gZG8gdGhhdCBvdXJzZWx2ZXMKKyAqLworc3RhdGljIGludCBtZXNoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBtZXNoX3N0YXRlICptcyA9IChzdHJ1Y3QgbWVzaF9zdGF0ZSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptciA9IG1zLT5tZXNoOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKm1kID0gbXMtPmRtYTsKKworCXByaW50ayhLRVJOX0RFQlVHICJtZXNoX2hvc3RfcmVzZXRcbiIpOworCisJLyogUmVzZXQgdGhlIGNvbnRyb2xsZXIgJiBkYmRtYSBjaGFubmVsICovCisJb3V0X2xlMzIoJm1kLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsJLyogc3RvcCBkbWEgKi8KKwlvdXRfOCgmbXItPmV4Y2VwdGlvbiwgMHhmZik7CS8qIGNsZWFyIGFsbCBleGNlcHRpb24gYml0cyAqLworCW91dF84KCZtci0+ZXJyb3IsIDB4ZmYpOwkvKiBjbGVhciBhbGwgZXJyb3IgYml0cyAqLworCW91dF84KCZtci0+c2VxdWVuY2UsIFNFUV9SRVNFVE1FU0gpOworICAgICAgIAltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMSk7CisJb3V0XzgoJm1yLT5pbnRyX21hc2ssIElOVF9FUlJPUiB8IElOVF9FWENFUFRJT04gfCBJTlRfQ01ERE9ORSk7CisJb3V0XzgoJm1yLT5zb3VyY2VfaWQsIG1zLT5ob3N0LT50aGlzX2lkKTsKKwlvdXRfOCgmbXItPnNlbF90aW1lb3V0LCAyNSk7CS8qIDI1MG1zICovCisJb3V0XzgoJm1yLT5zeW5jX3BhcmFtcywgQVNZTkNfUEFSQU1TKTsKKworCS8qIFJlc2V0IHRoZSBidXMgKi8KKwlvdXRfOCgmbXItPmJ1c19zdGF0dXMxLCBCUzFfUlNUKTsJLyogYXNzZXJ0IFJTVCAqLworICAgICAgIAltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMzApOwkJCS8qIGxlYXZlIGl0IG9uIGZvciA+PSAyNXVzICovCisJb3V0XzgoJm1yLT5idXNfc3RhdHVzMSwgMCk7CS8qIG5lZ2F0ZSBSU1QgKi8KKworCS8qIENvbXBsZXRlIHBlbmRpbmcgY29tbWFuZHMgKi8KKwloYW5kbGVfcmVzZXQobXMpOworCQorCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzZXRfbWVzaF9wb3dlcihzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMsIGludCBzdGF0ZSkKK3sKKwlpZiAoX21hY2hpbmUgIT0gX01BQ0hfUG1hYykKKwkJcmV0dXJuOworCWlmIChzdGF0ZSkgeworCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9NRVNIX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobXMtPm1kZXYpLCAwLCAxKTsKKwkJbXNsZWVwKDIwMCk7CisJfSBlbHNlIHsKKwkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfTUVTSF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1zLT5tZGV2KSwgMCwgMCk7CisJCW1zbGVlcCgxMCk7CisJfQorfQkJCQorCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbWVzaF9zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbWVzaF9zdGF0ZSAqbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKiltYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHN0YXRlID09IG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSB8fCBzdGF0ZSA8IDIpCisJCXJldHVybiAwOworCisJc2NzaV9ibG9ja19yZXF1ZXN0cyhtcy0+aG9zdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXdoaWxlKG1zLT5waGFzZSAhPSBpZGxlKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTApOworCQlzcGluX2xvY2tfaXJxc2F2ZShtcy0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJfQorCW1zLT5waGFzZSA9IHNsZWVwaW5nOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWRpc2FibGVfaXJxKG1zLT5tZXNoaW50cik7CisJc2V0X21lc2hfcG93ZXIobXMsIDApOworCisJbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZXNoX3Jlc3VtZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBtZXNoX3N0YXRlICptcyA9IChzdHJ1Y3QgbWVzaF9zdGF0ZSAqKW1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID09IDApCisJCXJldHVybiAwOworCisJc2V0X21lc2hfcG93ZXIobXMsIDEpOworCW1lc2hfaW5pdChtcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCW1lc2hfc3RhcnQobXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWVuYWJsZV9pcnEobXMtPm1lc2hpbnRyKTsKKwlzY3NpX3VuYmxvY2tfcmVxdWVzdHMobXMtPmhvc3QpOworCisJbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gMDsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKy8qCisgKiBJZiB3ZSBsZWF2ZSBkcml2ZXMgc2V0IGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgKGVzcGVjaWFsbHkKKyAqIENEUk9NcyksIGFuZCByZWJvb3QgdG8gTWFjT1MsIGl0IGdldHMgY29uZnVzZWQsIHBvb3IgdGhpbmcuCisgKiBTbywgb24gcmVib290IHdlIHJlc2V0IHRoZSBTQ1NJIGJ1cy4KKyAqLworc3RhdGljIGludCBtZXNoX3NodXRkb3duKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG1lc2hfc3RhdGUgKm1zID0gKHN0cnVjdCBtZXNoX3N0YXRlICopbWFjaW9fZ2V0X2RydmRhdGEobWRldik7CisJdm9sYXRpbGUgc3RydWN0IG1lc2hfcmVncyBfX2lvbWVtICptcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgCXByaW50ayhLRVJOX0lORk8gInJlc2V0dGluZyBNRVNIIHNjc2kgYnVzKGVzKVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworICAgICAgIAltciA9IG1zLT5tZXNoOworCW91dF84KCZtci0+aW50cl9tYXNrLCAwKTsKKwlvdXRfOCgmbXItPmludGVycnVwdCwgSU5UX0VSUk9SIHwgSU5UX0VYQ0VQVElPTiB8IElOVF9DTURET05FKTsKKwlvdXRfOCgmbXItPmJ1c19zdGF0dXMxLCBCUzFfUlNUKTsKKwltZXNoX2ZsdXNoX2lvKG1yKTsKKwl1ZGVsYXkoMzApOworCW91dF84KCZtci0+YnVzX3N0YXR1czEsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobXMtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG1lc2hfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJCT0gIm1lc2giLAorCS5uYW1lCQkJCT0gIk1FU0giLAorCS5xdWV1ZWNvbW1hbmQJCQk9IG1lc2hfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gbWVzaF9hYm9ydCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IG1lc2hfaG9zdF9yZXNldCwKKwkuY2FuX3F1ZXVlCQkJPSAyMCwKKwkudGhpc19pZAkJCT0gNywKKwkuc2dfdGFibGVzaXplCQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQkJPSAyLAorCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworc3RhdGljIGludCBtZXNoX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGRldmljZV9ub2RlICptZXNoID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CisJc3RydWN0IHBjaV9kZXYqIHBkZXYgPSBtYWNpb19nZXRfcGNpX2RldihtZGV2KTsKKwlpbnQgdGd0LCAqY2ZwLCBtaW5wZXI7CisJc3RydWN0IG1lc2hfc3RhdGUgKm1zOworCXN0cnVjdCBTY3NpX0hvc3QgKm1lc2hfaG9zdDsKKwl2b2lkICpkbWFfY21kX3NwYWNlOworCWRtYV9hZGRyX3QgZG1hX2NtZF9idXM7CisKKwlzd2l0Y2ggKG1kZXYtPmJ1cy0+Y2hpcC0+dHlwZSkgeworCWNhc2UgbWFjaW9faGVhdGhyb3c6CisJY2FzZSBtYWNpb19nYXR3aWNrOgorCWNhc2UgbWFjaW9fcGFkZGluZ3RvbjoKKwkJdXNlX2FjdGl2ZV9uZWcgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1c2VfYWN0aXZlX25lZyA9IFNFUV9BQ1RJVkVfTkVHOworCX0KKworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSAhPSAyIHx8IG1hY2lvX2lycV9jb3VudChtZGV2KSAhPSAyKSB7CisgICAgICAgCQlwcmludGsoS0VSTl9FUlIgIm1lc2g6IGV4cGVjdGVkIDIgYWRkcnMgYW5kIDIgaW50cnMiCisJICAgICAgIAkgICAgICAgIiAoZ290ICVkLCVkKVxuIiwgbWVzaC0+bl9hZGRycywgbWVzaC0+bl9pbnRycyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlcyhtZGV2LCAibWVzaCIpICE9IDApIHsKKyAgICAgICAJCXByaW50ayhLRVJOX0VSUiAibWVzaDogdW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlc291cmNlcyIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyAgICAgICAJbWVzaF9ob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtZXNoX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IG1lc2hfc3RhdGUpKTsKKwlpZiAobWVzaF9ob3N0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBjb3VsZG4ndCByZWdpc3RlciBob3N0Iik7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCQorCS8qIE9sZCBqdW5rIGZvciByb290IGRpc2NvdmVyeSwgdGhhdCB3aWxsIGRpZSB1bHRpbWF0ZWx5ICovCisjaWYgIWRlZmluZWQoTU9EVUxFKQorICAgICAgIAlub3RlX3Njc2lfaG9zdChtZXNoLCBtZXNoX2hvc3QpOworI2VuZGlmCisKKwltZXNoX2hvc3QtPmJhc2UgPSBtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKTsKKwltZXNoX2hvc3QtPmlycSA9IG1hY2lvX2lycShtZGV2LCAwKTsKKyAgICAgICAJbXMgPSAoc3RydWN0IG1lc2hfc3RhdGUgKikgbWVzaF9ob3N0LT5ob3N0ZGF0YTsKKwltYWNpb19zZXRfZHJ2ZGF0YShtZGV2LCBtcyk7CisJbXMtPmhvc3QgPSBtZXNoX2hvc3Q7CisJbXMtPm1kZXYgPSBtZGV2OworCW1zLT5wZGV2ID0gcGRldjsKKwkKKwltcy0+bWVzaCA9IGlvcmVtYXAobWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMCksIDB4MTAwMCk7CisJaWYgKG1zLT5tZXNoID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZXNoOiBjYW4ndCBtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CQkKKwltcy0+ZG1hID0gaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKSwgMHgxMDAwKTsKKwlpZiAobXMtPmRtYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogY2FuJ3QgbWFwIHJlZ2lzdGVyc1xuIik7CisJCWlvdW5tYXAobXMtPm1lc2gpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworICAgICAgIAltcy0+bWVzaGludHIgPSBtYWNpb19pcnEobWRldiwgMCk7CisgICAgICAgCW1zLT5kbWFpbnRyID0gbWFjaW9faXJxKG1kZXYsIDEpOworCisgICAgICAgCS8qIFNwYWNlIGZvciBkbWEgY29tbWFuZCBsaXN0OiArMSBmb3Igc3RvcCBjb21tYW5kLAorICAgICAgIAkgKiArMSB0byBhbGxvdyBmb3IgYWxpZ25pbmcuCisJICovCisJbXMtPmRtYV9jbWRfc2l6ZSA9IChtZXNoX2hvc3QtPnNnX3RhYmxlc2l6ZSArIDIpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpOworCisJLyogV2UgdXNlIHRoZSBQQ0kgQVBJcyBmb3Igbm93IHVudGlsIHRoZSBnZW5lcmljIG9uZSBnZXRzIGZpeGVkCisJICogZW5vdWdoIG9yIHVudGlsIHdlIGdldCBzb21lIG1hY2lvLXNwZWNpZmljIHZlcnNpb25zCisJICovCisJZG1hX2NtZF9zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG1hY2lvX2dldF9wY2lfZGV2KG1kZXYpLAorCQkJCQkgICAgIG1zLT5kbWFfY21kX3NpemUsCisJCQkJCSAgICAgJmRtYV9jbWRfYnVzKTsKKwlpZiAoZG1hX2NtZF9zcGFjZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWVzaDogY2FuJ3QgYWxsb2NhdGUgRE1BIHRhYmxlXG4iKTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCW1lbXNldChkbWFfY21kX3NwYWNlLCAwLCBtcy0+ZG1hX2NtZF9zaXplKTsKKworCW1zLT5kbWFfY21kcyA9IChzdHJ1Y3QgZGJkbWFfY21kICopIERCRE1BX0FMSUdOKGRtYV9jbWRfc3BhY2UpOworICAgICAgIAltcy0+ZG1hX2NtZF9zcGFjZSA9IGRtYV9jbWRfc3BhY2U7CisJbXMtPmRtYV9jbWRfYnVzID0gZG1hX2NtZF9idXMgKyAoKHVuc2lnbmVkIGxvbmcpbXMtPmRtYV9jbWRzKQorCQktICh1bnNpZ25lZCBsb25nKWRtYV9jbWRfc3BhY2U7CisJbXMtPmN1cnJlbnRfcmVxID0gTlVMTDsKKyAgICAgICAJZm9yICh0Z3QgPSAwOyB0Z3QgPCA4OyArK3RndCkgeworCSAgICAgICAJbXMtPnRndHNbdGd0XS5zZHRyX3N0YXRlID0gZG9fc2R0cjsKKwkgICAgICAgCW1zLT50Z3RzW3RndF0uc3luY19wYXJhbXMgPSBBU1lOQ19QQVJBTVM7CisJICAgICAgIAltcy0+dGd0c1t0Z3RdLmN1cnJlbnRfcmVxID0gTlVMTDsKKyAgICAgICAJfQorCisJaWYgKChjZnAgPSAoaW50ICopIGdldF9wcm9wZXJ0eShtZXNoLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCkpKQorICAgICAgIAkJbXMtPmNsa19mcmVxID0gKmNmcDsKKwllbHNlIHsKKyAgICAgICAJCXByaW50ayhLRVJOX0lORk8gIm1lc2g6IGFzc3VtaW5nIDUwTUh6IGNsb2NrIGZyZXF1ZW5jeVxuIik7CisJICAgICAgIAltcy0+Y2xrX2ZyZXEgPSA1MDAwMDAwMDsKKyAgICAgICAJfQorCisgICAgICAgCS8qIFRoZSBtYXhpbXVtIHN5bmMgcmF0ZSBpcyBjbG9jayAvIDU7IGluY3JlYXNlCisgICAgICAgCSAqIG1lc2hfc3luY19wZXJpb2QgaWYgbmVjZXNzYXJ5LgorCSAqLworCW1pbnBlciA9IDEwMDAwMDAwMDAgLyAobXMtPmNsa19mcmVxIC8gNSk7IC8qIG5zICovCisJaWYgKG1lc2hfc3luY19wZXJpb2QgPCBtaW5wZXIpCisJCW1lc2hfc3luY19wZXJpb2QgPSBtaW5wZXI7CisKKwkvKiBQb3dlciB1cCB0aGUgY2hpcCAqLworCXNldF9tZXNoX3Bvd2VyKG1zLCAxKTsKKworCS8qIFNldCBpdCB1cCAqLworICAgICAgIAltZXNoX2luaXQobXMpOworCisJLyogWFhYIEZJWE1FOiBlcnJvciBzaG91bGQgYmUgZmF0YWwgKi8KKyAgICAgICAJaWYgKHJlcXVlc3RfaXJxKG1zLT5tZXNoaW50ciwgZG9fbWVzaF9pbnRlcnJ1cHQsIDAsICJNRVNIIiwgbXMpKQorCSAgICAgICAJcHJpbnRrKEtFUk5fRVJSICJNRVNIOiBjYW4ndCBnZXQgaXJxICVkXG4iLCBtcy0+bWVzaGludHIpOworCisJLyogWFhYIEZJWE1FOiBoYW5kbGUgZmFpbHVyZSAqLworCXNjc2lfYWRkX2hvc3QobWVzaF9ob3N0LCAmbWRldi0+b2ZkZXYuZGV2KTsKKwlzY3NpX3NjYW5faG9zdChtZXNoX2hvc3QpOworCisJcmV0dXJuIDA7CisKK291dF91bm1hcDoKKwlpb3VubWFwKG1zLT5kbWEpOworCWlvdW5tYXAobXMtPm1lc2gpOworb3V0X2ZyZWU6CisJc2NzaV9ob3N0X3B1dChtZXNoX2hvc3QpOworb3V0X3JlbGVhc2U6CisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBtZXNoX3JlbW92ZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBtZXNoX3N0YXRlICptcyA9IChzdHJ1Y3QgbWVzaF9zdGF0ZSAqKW1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKm1lc2hfaG9zdCA9IG1zLT5ob3N0OworCisJc2NzaV9yZW1vdmVfaG9zdChtZXNoX2hvc3QpOworCisJZnJlZV9pcnEobXMtPm1lc2hpbnRyLCBtcyk7CisKKwkvKiBSZXNldCBzY3NpIGJ1cyAqLworCW1lc2hfc2h1dGRvd24obWRldik7CisKKwkvKiBTaHV0IGRvd24gY2hpcCAmIHRlcm1pbmF0aW9uICovCisJc2V0X21lc2hfcG93ZXIobXMsIDApOworCisJLyogVW5tYXAgcmVnaXN0ZXJzICYgZG1hIGNvbnRyb2xsZXIgKi8KKwlpb3VubWFwKG1zLT5tZXNoKTsKKyAgICAgICAJaW91bm1hcChtcy0+ZG1hKTsKKworCS8qIEZyZWUgRE1BIGNvbW1hbmRzIG1lbW9yeSAqLworCXBjaV9mcmVlX2NvbnNpc3RlbnQobWFjaW9fZ2V0X3BjaV9kZXYobWRldiksIG1zLT5kbWFfY21kX3NpemUsCisJCQkgIG1zLT5kbWFfY21kX3NwYWNlLCBtcy0+ZG1hX2NtZF9idXMpOworCisJLyogUmVsZWFzZSBtZW1vcnkgcmVzb3VyY2VzICovCisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlzY3NpX2hvc3RfcHV0KG1lc2hfaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG9mX21hdGNoIG1lc2hfbWF0Y2hbXSA9IAoreworCXsKKwkubmFtZSAJCT0gIm1lc2giLAorCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKKwkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAorCX0sCisJeworCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCisJLnR5cGUJCT0gInNjc2kiLAorCS5jb21wYXRpYmxlCT0gImNocnAsbWVzaDAiCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIG1lc2hfZHJpdmVyID0gCit7CisJLm5hbWUgCQk9ICJtZXNoIiwKKwkubWF0Y2hfdGFibGUJPSBtZXNoX21hdGNoLAorCS5wcm9iZQkJPSBtZXNoX3Byb2JlLAorCS5yZW1vdmUJCT0gbWVzaF9yZW1vdmUsCisJLnNodXRkb3duCT0gbWVzaF9zaHV0ZG93biwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IG1lc2hfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1lc2hfcmVzdW1lLAorI2VuZGlmCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbWVzaCh2b2lkKQoreworCisJLyogQ2FsY3VsYXRlIHN5bmMgcmF0ZSBmcm9tIG1vZHVsZSBwYXJhbWV0ZXJzICovCisJaWYgKHN5bmNfcmF0ZSA+IDEwKQorCQlzeW5jX3JhdGUgPSAxMDsKKwlpZiAoc3luY19yYXRlID4gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJtZXNoOiBjb25maWd1cmVkIGZvciBzeW5jaHJvbm91cyAlZCBNQi9zXG4iLCBzeW5jX3JhdGUpOworCQltZXNoX3N5bmNfcGVyaW9kID0gMTAwMCAvIHN5bmNfcmF0ZTsJLyogbnMgKi8KKwkJbWVzaF9zeW5jX29mZnNldCA9IDE1OworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJtZXNoOiBjb25maWd1cmVkIGZvciBhc3luY2hyb25vdXNcbiIpOworCisJcmV0dXJuIG1hY2lvX3JlZ2lzdGVyX2RyaXZlcigmbWVzaF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tZXNoKHZvaWQpCit7CisJcmV0dXJuIG1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZtZXNoX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWVzaCk7Cittb2R1bGVfZXhpdChleGl0X21lc2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lc2guaCBiL2RyaXZlcnMvc2NzaS9tZXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkYjgxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tZXNoLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBtZXNoLmg6IGRlZmluaXRpb25zIGZvciB0aGUgZHJpdmVyIGZvciB0aGUgTUVTSCBTQ1NJIGJ1cyBhZGFwdG9yCisgKiAoTWFjaW50b3NoIEVuaGFuY2VkIFNDU0kgSGFyZHdhcmUpIGZvdW5kIG9uIFBvd2VyIE1hY2ludG9zaCBjb21wdXRlcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICovCisjaWZuZGVmIF9NRVNIX0gKKyNkZWZpbmUgX01FU0hfSAorCisvKgorICogUmVnaXN0ZXJzIGluIHRoZSBNRVNIIGNvbnRyb2xsZXIuCisgKi8KKworc3RydWN0IG1lc2hfcmVncyB7CisJdW5zaWduZWQgY2hhcgljb3VudF9sbzsKKwljaGFyIHBhZDBbMTVdOworCXVuc2lnbmVkIGNoYXIJY291bnRfaGk7CisJY2hhciBwYWQxWzE1XTsKKwl1bnNpZ25lZCBjaGFyCWZpZm87CisJY2hhciBwYWQyWzE1XTsKKwl1bnNpZ25lZCBjaGFyCXNlcXVlbmNlOworCWNoYXIgcGFkM1sxNV07CisJdW5zaWduZWQgY2hhcglidXNfc3RhdHVzMDsKKwljaGFyIHBhZDRbMTVdOworCXVuc2lnbmVkIGNoYXIJYnVzX3N0YXR1czE7CisJY2hhciBwYWQ1WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWZpZm9fY291bnQ7CisJY2hhciBwYWQ2WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWV4Y2VwdGlvbjsKKwljaGFyIHBhZDdbMTVdOworCXVuc2lnbmVkIGNoYXIJZXJyb3I7CisJY2hhciBwYWQ4WzE1XTsKKwl1bnNpZ25lZCBjaGFyCWludHJfbWFzazsKKwljaGFyIHBhZDlbMTVdOworCXVuc2lnbmVkIGNoYXIJaW50ZXJydXB0OworCWNoYXIgcGFkMTBbMTVdOworCXVuc2lnbmVkIGNoYXIJc291cmNlX2lkOworCWNoYXIgcGFkMTFbMTVdOworCXVuc2lnbmVkIGNoYXIJZGVzdF9pZDsKKwljaGFyIHBhZDEyWzE1XTsKKwl1bnNpZ25lZCBjaGFyCXN5bmNfcGFyYW1zOworCWNoYXIgcGFkMTNbMTVdOworCXVuc2lnbmVkIGNoYXIJbWVzaF9pZDsKKwljaGFyIHBhZDE0WzE1XTsKKwl1bnNpZ25lZCBjaGFyCXNlbF90aW1lb3V0OworCWNoYXIgcGFkMTVbMTVdOworfTsKKworLyogQml0cyBpbiB0aGUgc2VxdWVuY2UgcmVnaXN0ZXIuICovCisjZGVmaW5lIFNFUV9ETUFfTU9ERQkweDgwCS8qIHVzZSBETUEgZm9yIGRhdGEgdHJhbnNmZXIgKi8KKyNkZWZpbmUgU0VRX1RBUkdFVAkweDQwCS8qIHB1dCB0aGUgY29udHJvbGxlciBpbnRvIHRhcmdldCBtb2RlICovCisjZGVmaW5lIFNFUV9BVE4JCTB4MjAJLyogYXNzZXJ0IEFUTiBzaWduYWwgKi8KKyNkZWZpbmUgU0VRX0FDVElWRV9ORUcJMHgxMAkvKiB1c2UgYWN0aXZlIG5lZ2F0aW9uIG9uIFJFUS9BQ0sgKi8KKyNkZWZpbmUgU0VRX0NNRAkJMHgwZgkvKiBjb21tYW5kIGJpdHM6ICovCisjZGVmaW5lIFNFUV9BUkJJVFJBVEUJMQkvKiAgZ2V0IHRoZSBidXMgKi8KKyNkZWZpbmUgU0VRX1NFTEVDVAkyCS8qICBzZWxlY3QgYSB0YXJnZXQgKi8KKyNkZWZpbmUgU0VRX0NPTU1BTkQJMwkvKiAgc2VuZCBhIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0VRX1NUQVRVUwk0CS8qICByZWNlaXZlIHN0YXR1cyAqLworI2RlZmluZSBTRVFfREFUQU9VVAk1CS8qICBzZW5kIGRhdGEgKi8KKyNkZWZpbmUgU0VRX0RBVEFJTgk2CS8qICByZWNlaXZlIGRhdGEgKi8KKyNkZWZpbmUgU0VRX01TR09VVAk3CS8qICBzZW5kIGEgbWVzc2FnZSAqLworI2RlZmluZSBTRVFfTVNHSU4JOAkvKiAgcmVjZWl2ZSBhIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0VRX0JVU0ZSRUUJOQkvKiAgbG9vayBmb3IgYnVzIGZyZWUgKi8KKyNkZWZpbmUgU0VRX0VOQlBBUklUWQkweDBhCS8qICBlbmFibGUgcGFyaXR5IGNoZWNraW5nICovCisjZGVmaW5lIFNFUV9ESVNQQVJJVFkJMHgwYgkvKiAgZGlzYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKyNkZWZpbmUgU0VRX0VOQlJFU0VMCTB4MGMJLyogIGVuYWJsZSByZXNlbGVjdGlvbiAqLworI2RlZmluZSBTRVFfRElTUkVTRUwJMHgwZAkvKiAgZGlzYWJsZSByZXNlbGVjdGlvbiAqLworI2RlZmluZSBTRVFfUkVTRVRNRVNICTB4MGUJLyogIHJlc2V0IHRoZSBjb250cm9sbGVyICovCisjZGVmaW5lIFNFUV9GTFVTSEZJRk8JMHgwZgkvKiAgY2xlYXIgb3V0IHRoZSBGSUZPICovCisKKy8qIEJpdHMgaW4gdGhlIGJ1c19zdGF0dXMwIGFuZCBidXNfc3RhdHVzMSByZWdpc3RlcnM6CisgICB0aGVzZSBjb3JyZXNwb25kIGRpcmVjdGx5IHRvIHRoZSBTQ1NJIGJ1cyBjb250cm9sIHNpZ25hbHMuICovCisjZGVmaW5lIEJTMF9SRVEJCTB4MjAKKyNkZWZpbmUgQlMwX0FDSwkJMHgxMAorI2RlZmluZSBCUzBfQVROCQkweDA4CisjZGVmaW5lIEJTMF9NU0cJCTB4MDQKKyNkZWZpbmUgQlMwX0NECQkweDAyCisjZGVmaW5lIEJTMF9JTwkJMHgwMQorI2RlZmluZSBCUzFfUlNUCQkweDgwCisjZGVmaW5lIEJTMV9CU1kJCTB4NDAKKyNkZWZpbmUgQlMxX1NFTAkJMHgyMAorCisvKiBCdXMgcGhhc2VzIGRlZmluZWQgYnkgdGhlIGJpdHMgaW4gYnVzX3N0YXR1czAgKi8KKyNkZWZpbmUgQlMwX1BIQVNFCShCUzBfTVNHK0JTMF9DRCtCUzBfSU8pCisjZGVmaW5lIEJQX0RBVEFPVVQJMAorI2RlZmluZSBCUF9EQVRBSU4JQlMwX0lPCisjZGVmaW5lIEJQX0NPTU1BTkQJQlMwX0NECisjZGVmaW5lIEJQX1NUQVRVUwkoQlMwX0NEK0JTMF9JTykKKyNkZWZpbmUgQlBfTVNHT1VUCShCUzBfTVNHK0JTMF9DRCkKKyNkZWZpbmUgQlBfTVNHSU4JKEJTMF9NU0crQlMwX0NEK0JTMF9JTykKKworLyogQml0cyBpbiB0aGUgZXhjZXB0aW9uIHJlZ2lzdGVyLiAqLworI2RlZmluZSBFWENfU0VMV0FUTgkweDIwCS8qIChhcyB0YXJnZXQpIHdlIHdlcmUgc2VsZWN0ZWQgd2l0aCBBVE4gKi8KKyNkZWZpbmUgRVhDX1NFTEVDVEVECTB4MTAJLyogKGFzIHRhcmdldCkgd2Ugd2VyZSBzZWxlY3RlZCB3L28gQVROICovCisjZGVmaW5lIEVYQ19SRVNFTEVDVEVECTB4MDgJLyogKGFzIGluaXRpYXRvcikgd2Ugd2VyZSByZXNlbGVjdGVkICovCisjZGVmaW5lIEVYQ19BUkJMT1NUCTB4MDQJLyogd2UgbG9zdCBhcmJpdHJhdGlvbiAqLworI2RlZmluZSBFWENfUEhBU0VNTQkweDAyCS8qIFNDU0kgcGhhc2UgbWlzbWF0Y2ggKi8KKyNkZWZpbmUgRVhDX1NFTFRPCTB4MDEJLyogc2VsZWN0aW9uIHRpbWVvdXQgKi8KKworLyogQml0cyBpbiB0aGUgZXJyb3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVJSX1VORVhQRElTQwkweDQwCS8qIHRhcmdldCB1bmV4cGVjdGVkbHkgZGlzY29ubmVjdGVkICovCisjZGVmaW5lIEVSUl9TQ1NJUkVTRVQJMHgyMAkvKiBTQ1NJIGJ1cyBnb3QgcmVzZXQgb24gdXMgKi8KKyNkZWZpbmUgRVJSX1NFUUVSUgkweDEwCS8qIHdlIGRpZCBzb21ldGhpbmcgdGhlIGNoaXAgZGlkbid0IGxpa2UgKi8KKyNkZWZpbmUgRVJSX1BBUklUWQkweDAxCS8qIHBhcml0eSBlcnJvciB3YXMgZGV0ZWN0ZWQgKi8KKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IGFuZCBpbnRyX21hc2sgcmVnaXN0ZXJzICovCisjZGVmaW5lIElOVF9FUlJPUgkweDA0CS8qIGVycm9yIGludGVycnVwdCAqLworI2RlZmluZSBJTlRfRVhDRVBUSU9OCTB4MDIJLyogZXhjZXB0aW9uIGludGVycnVwdCAqLworI2RlZmluZSBJTlRfQ01ERE9ORQkweDAxCS8qIGNvbW1hbmQgZG9uZSBpbnRlcnJ1cHQgKi8KKworLyogRmllbGRzIGluIHRoZSBzeW5jX3BhcmFtcyByZWdpc3RlciAqLworI2RlZmluZSBTWU5DX09GRih4KQkoKHgpID4+IDQpCS8qIG9mZnNldCBmaWVsZCAqLworI2RlZmluZSBTWU5DX1BFUih4KQkoKHgpICYgMHhmKQkvKiBwZXJpb2QgZmllbGQgKi8KKyNkZWZpbmUgU1lOQ19QQVJBTVMobywgcCkJKCgobykgPDwgNCkgfCAocCkpCisjZGVmaW5lIEFTWU5DX1BBUkFNUwkyCS8qIHN5bmNfcGFyYW1zIHZhbHVlIGZvciBhc3luYyB4ZmVycyAqLworCisvKgorICogQXNzdW1pbmcgYSBjbG9jayBmcmVxdWVuY3kgb2YgNTBNSHo6CisgKgorICogVGhlIHRyYW5zZmVyIHBlcmlvZCB3aXRoIFNZTkNfUEVSKHN5bmNfcGFyYW1zKSA9PSB4CisgKiBpcyAoeCArIDIpICogNDBucywgZXhjZXB0IHRoYXQgeCA9PSAwIGdpdmVzIDEwMG5zLgorICoKKyAqIFRoZSB1bml0cyBvZiB0aGUgc2VsX3RpbWVvdXQgcmVnaXN0ZXIgYXJlIDEwbXMuCisgKi8KKworCisjZW5kaWYgLyogX01FU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212bWUxNDcuYyBiL2RyaXZlcnMvc2NzaS9tdm1lMTQ3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczYjMzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tdm1lMTQ3LmMKQEAgLTAsMCArMSwxNTUgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL212bWUxNDdody5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIndkMzNjOTMuaCIKKyNpbmNsdWRlICJtdm1lMTQ3LmgiCisKKyNpbmNsdWRlPGxpbnV4L3N0YXQuaD4KKworI2RlZmluZSBIREFUQShwdHIpICgoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikoKHB0ciktPmhvc3RkYXRhKSkKKworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKm12bWUxNDdfaG9zdCA9IE5VTEw7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtdm1lMTQ3X2ludHIgKGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgaWYgKGlycSA9PSBNVk1FMTQ3X0lSUV9TQ1NJX1BPUlQpCisJd2QzM2M5M19pbnRyIChtdm1lMTQ3X2hvc3QpOworICAgIGVsc2UKKwltMTQ3X3BjYy0+ZG1hX2ludHIgPSAweDg5OwkvKiBBY2sgYW5kIGVuYWJsZSBpbnRzICovCisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGRtYV9zZXR1cCAoU2NzaV9DbW5kICpjbWQsIGludCBkaXJfaW4pCit7CisgICAgdW5zaWduZWQgY2hhciBmbGFncyA9IDB4MDE7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gdmlydF90b19idXMoY21kLT5TQ3AucHRyKTsKKworICAgIC8qIHNldHVwIGRtYSBkaXJlY3Rpb24gKi8KKyAgICBpZiAoIWRpcl9pbikKKwlmbGFncyB8PSAweDA0OworCisgICAgLyogcmVtZW1iZXIgZGlyZWN0aW9uICovCisgICAgSERBVEEobXZtZTE0N19ob3N0KS0+ZG1hX2RpciA9IGRpcl9pbjsKKworICAgIGlmIChkaXJfaW4pCisgIAkvKiBpbnZhbGlkYXRlIGFueSBjYWNoZSAqLworCWNhY2hlX2NsZWFyIChhZGRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyAgICBlbHNlCisJLyogcHVzaCBhbnkgZGlydHkgY2FjaGUgKi8KKwljYWNoZV9wdXNoIChhZGRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKworICAgIC8qIHN0YXJ0IERNQSAqLworICAgIG0xNDdfcGNjLT5kbWFfYmNyICAgPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsIHwgKDE8PDI0KTsKKyAgICBtMTQ3X3BjYy0+ZG1hX2RhZHIgID0gYWRkcjsKKyAgICBtMTQ3X3BjYy0+ZG1hX2NudHJsID0gZmxhZ3M7CisKKyAgICAvKiByZXR1cm4gc3VjY2VzcyAqLworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbWFfc3RvcCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIFNjc2lfQ21uZCAqU0NwbnQsCisJCSAgICAgIGludCBzdGF0dXMpCit7CisgICAgbTE0N19wY2MtPmRtYV9jbnRybCA9IDA7Cit9CisKK2ludCBtdm1lMTQ3X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnRwbnQpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FsbGVkID0gMDsKKyAgICB3ZDMzYzkzX3JlZ3MgcmVnczsKKworICAgIGlmICghTUFDSF9JU19NVk1FMTQ3IHx8IGNhbGxlZCkKKwlyZXR1cm4gMDsKKyAgICBjYWxsZWQrKzsKKworICAgIHRwbnQtPnByb2NfbmFtZSA9ICJNVk1FMTQ3IjsKKyAgICB0cG50LT5wcm9jX2luZm8gPSAmd2QzM2M5M19wcm9jX2luZm87CisKKyAgICBtdm1lMTQ3X2hvc3QgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKKyAgICBpZiAoIW12bWUxNDdfaG9zdCkKKwkgICAgZ290byBlcnJfb3V0OworCisgICAgbXZtZTE0N19ob3N0LT5iYXNlID0gMHhmZmZlNDAwMDsKKyAgICBtdm1lMTQ3X2hvc3QtPmlycSA9IE1WTUUxNDdfSVJRX1NDU0lfUE9SVDsKKyAgICByZWdzLlNBU1IgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4ZmZmZTQwMDA7CisgICAgcmVncy5TQ01EID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweGZmZmU0MDAxOworICAgIHdkMzNjOTNfaW5pdChtdm1lMTQ3X2hvc3QsIHJlZ3MsIGRtYV9zZXR1cCwgZG1hX3N0b3AsIFdEMzNDOTNfRlNfOF8xMCk7CisKKyAgICBpZiAocmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NTSV9QT1JULCBtdm1lMTQ3X2ludHIsIDAsICJNVk1FMTQ3IFNDU0kgUE9SVCIsIG12bWUxNDdfaW50cikpCisJICAgIGdvdG8gZXJyX3VucmVnaXN0ZXI7CisgICAgaWYgKHJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDU0lfRE1BLCBtdm1lMTQ3X2ludHIsIDAsICJNVk1FMTQ3IFNDU0kgRE1BIiwgbXZtZTE0N19pbnRyKSkKKwkgICAgZ290byBlcnJfZnJlZV9pcnE7CisjaWYgMAkvKiBEaXNhYmxlZDsgY2F1c2VzIHByb2JsZW1zIGJvb3RpbmcgKi8KKyAgICBtMTQ3X3BjYy0+c2NzaV9pbnRlcnJ1cHQgPSAweDEwOwkvKiBBc3NlcnQgU0NTSSBidXMgcmVzZXQgKi8KKyAgICB1ZGVsYXkoMTAwKTsKKyAgICBtMTQ3X3BjYy0+c2NzaV9pbnRlcnJ1cHQgPSAweDAwOwkvKiBOZWdhdGUgU0NTSSBidXMgcmVzZXQgKi8KKyAgICB1ZGVsYXkoMjAwMCk7CisgICAgbTE0N19wY2MtPnNjc2lfaW50ZXJydXB0ID0gMHg0MDsJLyogQ2xlYXIgYnVzIHJlc2V0IGludGVycnVwdCAqLworI2VuZGlmCisgICAgbTE0N19wY2MtPnNjc2lfaW50ZXJydXB0ID0gMHgwOTsJLyogRW5hYmxlIGludGVycnVwdCAqLworCisgICAgbTE0N19wY2MtPmRtYV9jbnRybCA9IDB4MDA7CQkvKiBlbnN1cmUgRE1BIGlzIHN0b3BwZWQgKi8KKyAgICBtMTQ3X3BjYy0+ZG1hX2ludHIgPSAweDg5OwkJLyogQWNrIGFuZCBlbmFibGUgaW50cyAqLworCisgICAgcmV0dXJuIDE7CisKKyBlcnJfZnJlZV9pcnE6CisgICAgZnJlZV9pcnEoTVZNRTE0N19JUlFfU0NTSV9QT1JULCBtdm1lMTQ3X2ludHIpOworIGVycl91bnJlZ2lzdGVyOgorICAgIHdkMzNjOTNfcmVsZWFzZSgpOworICAgIHNjc2lfdW5yZWdpc3Rlcihtdm1lMTQ3X2hvc3QpOworIGVycl9vdXQ6CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZtZTE0N19idXNfcmVzZXQoU2NzaV9DbW5kICpjbWQpCit7CisJLyogRklYTUUgcGVyZm9ybSBidXMtc3BlY2lmaWMgcmVzZXQgKi8KKwl3ZDMzYzkzX2hvc3RfcmVzZXQoY21kKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworI2RlZmluZSBIT1NUU19DCisKKyNpbmNsdWRlICJtdm1lMTQ3LmgiCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gIk1WTUUxNDciLAorCS5uYW1lCQkJPSAiTVZNRTE0NyBidWlsdC1pbiBTQ1NJIiwKKwkuZGV0ZWN0CQkJPSBtdm1lMTQ3X2RldGVjdCwKKwkucmVsZWFzZQkJPSBtdm1lMTQ3X3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSB3ZDMzYzkzX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHdkMzNjOTNfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gbXZtZTE0N19idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHdkMzNjOTNfaG9zdF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IENBTl9RVUVVRSwKKwkudGhpc19pZAkJPSA3LAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSBDTURfUEVSX0xVTiwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK2ludCBtdm1lMTQ3X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisgICAgLyogWFhYIE1ha2Ugc3VyZSBETUEgaXMgc3RvcHBlZCEgKi8KKyAgICB3ZDMzYzkzX3JlbGVhc2UoKTsKKyAgICBmcmVlX2lycShNVk1FMTQ3X0lSUV9TQ1NJX1BPUlQsIG12bWUxNDdfaW50cik7CisgICAgZnJlZV9pcnEoTVZNRTE0N19JUlFfU0NTSV9ETUEsIG12bWUxNDdfaW50cik7CisjZW5kaWYKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdm1lMTQ3LmggYi9kcml2ZXJzL3Njc2kvbXZtZTE0Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTAzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbXZtZTE0Ny5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgTVZNRTE0N19ICisKKy8qICRJZDogbXZtZTE0Ny5oLHYgMS40IDE5OTcvMDEvMTkgMjM6MDc6MTAgZGF2ZW0gRXhwICQKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIE1WTUUxNDcgYnVpbHQtaW4gU0NTSSBjb250cm9sbGVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYW5kIChDKSAxOTkzLCBIYW1pc2ggTWFjZG9uYWxkLCBzZWUgbXZtZTE0Ny5jIGZvciBtb3JlIGluZm8KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2ludCBtdm1lMTQ3X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitpbnQgbXZtZTE0N19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKik7Citjb25zdCBjaGFyICp3ZDMzYzkzX2luZm8odm9pZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IHdkMzNjOTNfYWJvcnQoU2NzaV9DbW5kICopOworaW50IHdkMzNjOTNfcmVzZXQoU2NzaV9DbW5kICosIHVuc2lnbmVkIGludCk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAxNgorI2VuZGlmCisKKyNlbmRpZiAvKiBNVk1FMTQ3X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdm1lMTZ4LmMgYi9kcml2ZXJzL3Njc2kvbXZtZTE2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDhkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbXZtZTE2eC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIE5DUjUzYzcxMCBiYXNlZCBNVk1FMTZ4IFNDU0kgQ29udHJvbGxlcnMgZm9yIExpbnV4LgorICoKKyAqIEJhc2VkIG9uIHdvcmsgYnkgQWxhbiBIb3VyaWhhbmUKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbXZtZTE2eGh3Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiNTNjN3h4LmgiCisjaW5jbHVkZSAibXZtZTE2eC5oIgorCisjaW5jbHVkZTxsaW51eC9zdGF0Lmg+CisKKworaW50IG12bWUxNnhfc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhbGxlZCA9IDA7CisgICAgaW50IGNsb2NrOworICAgIGxvbmcgbG9uZyBvcHRpb25zOworCisgICAgaWYgKCFNQUNIX0lTX01WTUUxNngpCisJCXJldHVybiAwOworICAgIGlmIChtdm1lMTZ4X2NvbmZpZyAmIE1WTUUxNnhfQ09ORklHX05PX1NDU0lDSElQKSB7CisJcHJpbnRrICgiU0NTSSBkZXRlY3Rpb24gZGlzYWJsZWQsIFNDU0kgY2hpcCBub3QgcHJlc2VudFxuIik7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjYWxsZWQpCisJcmV0dXJuIDA7CisKKyAgICB0cG50LT5wcm9jX25hbWUgPSAiTVZNRTE2eCI7CisKKyAgICBvcHRpb25zID0gT1BUSU9OX01FTU9SWV9NQVBQRUR8T1BUSU9OX0RFQlVHX1RFU1QxfE9QVElPTl9JTlRGTFl8T1BUSU9OX1NZTkNIUk9OT1VTfE9QVElPTl9BTFdBWVNfU1lOQ0hST05PVVN8T1BUSU9OX0RJU0NPTk5FQ1Q7CisKKyAgICBjbG9jayA9IDY2MDAwMDAwOwkvKiA2Nk1IeiBTQ1NJIENsb2NrICovCisKKyAgICBuY3I1M2M3eHhfaW5pdCh0cG50LCAwLCA3MTAsICh1bnNpZ25lZCBsb25nKTB4ZmZmNDcwMDAsCisJCQkwLCBNVk1FMTZ4X0lSUV9TQ1NJLCBETUFfTk9ORSwKKwkJCW9wdGlvbnMsIGNsb2NrKTsKKyAgICBjYWxsZWQgPSAxOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IG12bWUxNnhfc2NzaV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCT0gIk1WTUUxNnggTkNSNTNjNzEwIFNDU0kiLAorCS5kZXRlY3QJCQk9IG12bWUxNnhfc2NzaV9kZXRlY3QsCisJLnJlbGVhc2UJCT0gbXZtZTE2eF9zY3NpX3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBOQ1I1M2M3eHhfcXVldWVfY29tbWFuZCwKKwkuYWJvcnQJCQk9IE5DUjUzYzd4eF9hYm9ydCwKKwkucmVzZXQJCQk9IE5DUjUzYzd4eF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDI0LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSA2MywKKwkuY21kX3Blcl9sdW4JCT0gMywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212bWUxNnguaCBiL2RyaXZlcnMvc2NzaS9tdm1lMTZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxNzNjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tdm1lMTZ4LmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBNVk1FMTZ4X1NDU0lfSAorI2RlZmluZSBNVk1FMTZ4X1NDU0lfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworaW50IG12bWUxNnhfc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworY29uc3QgY2hhciAqTkNSNTNjN3gwX2luZm8odm9pZCk7CitpbnQgTkNSNTNjN3h4X3F1ZXVlX2NvbW1hbmQoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOworaW50IE5DUjUzYzd4eF9hYm9ydChTY3NpX0NtbmQgKik7CitpbnQgTkNSNTNjN3gwX3JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKik7CitpbnQgTkNSNTNjN3h4X3Jlc2V0KFNjc2lfQ21uZCAqLCB1bnNpZ25lZCBpbnQpOwordm9pZCBOQ1I1M2M3eDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMworI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAyNAorI2VuZGlmCisKKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworI2VuZGlmIC8qIE1WTUUxNnhfU0NTSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlMTMyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguYwpAQCAtMCwwICsxLDc5ODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBEZXZpY2UgZHJpdmVyIGZvciB0aGUgUENJLVNDU0kgTkNSNTM4WFggY29udHJvbGxlciBmYW1pbHkuCisqKgorKiogIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gcG9ydGVkIHRvIExpbnV4IGZyb20gdGhlIEZyZWVCU0QgTkNSNTNDOFhYIGRyaXZlcgorKiogIGFuZCBpcyBjdXJyZW50bHkgbWFpbnRhaW5lZCBieQorKioKKyoqICAgICAgICAgIEdlcmFyZCBSb3VkaWVyICAgICAgICAgICAgICA8Z3JvdWRpZXJAZnJlZS5mcj4KKyoqCisqKiAgQmVpbmcgZ2l2ZW4gdGhhdCB0aGlzIGRyaXZlciBvcmlnaW5hdGVzIGZyb20gdGhlIEZyZWVCU0QgdmVyc2lvbiwgYW5kCisqKiAgaW4gb3JkZXIgdG8ga2VlcCBzeW5lcmd5IG9uIGJvdGgsIGFueSBzdWdnZXN0ZWQgZW5oYW5jZW1lbnRzIGFuZCBjb3JyZWN0aW9ucworKiogIHJlY2VpdmVkIG9uIExpbnV4IGFyZSBhdXRvbWF0aWNhbGx5IGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBmb3IgdGhlIEZyZWVCU0QgCisqKiAgdmVyc2lvbi4KKyoqCisqKiAgVGhlIG9yaWdpbmFsIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyoqICAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorKiogICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisqKgorKiogIEFuZCBoYXMgYmVlbiBwb3J0ZWQgdG8gTmV0QlNEIGJ5CisqKiAgICAgICAgICBDaGFybGVzIE0uIEhhbm51bSAgICAgICAgICAgPG15Y3JvZnRAZ251LmFpLm1pdC5lZHU+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICAgICAgICAgICAgICAgICAgICAgQnJpZWYgaGlzdG9yeQorKioKKyoqICBEZWNlbWJlciAxMCAxOTk1IGJ5IEdlcmFyZCBSb3VkaWVyOgorKiogICAgIEluaXRpYWwgcG9ydCB0byBMaW51eC4KKyoqCisqKiAgSnVuZSAyMyAxOTk2IGJ5IEdlcmFyZCBSb3VkaWVyOgorKiogICAgIFN1cHBvcnQgZm9yIDY0IGJpdHMgYXJjaGl0ZWN0dXJlcyAoQWxwaGEpLgorKioKKyoqICBOb3ZlbWJlciAzMCAxOTk2IGJ5IEdlcmFyZCBSb3VkaWVyOgorKiogICAgIFN1cHBvcnQgZm9yIEZhc3QtMjAgc2NzaS4KKyoqICAgICBTdXBwb3J0IGZvciBsYXJnZSBETUEgZmlmbyBhbmQgMTI4IGR3b3JkcyBidXJzdGluZy4KKyoqCisqKiAgRmVicnVhcnkgMjcgMTk5NyBieSBHZXJhcmQgUm91ZGllcjoKKyoqICAgICBTdXBwb3J0IGZvciBGYXN0LTQwIHNjc2kuCisqKiAgICAgU3VwcG9ydCBmb3Igb24tQm9hcmQgUkFNLgorKioKKyoqICBNYXkgMyAxOTk3IGJ5IEdlcmFyZCBSb3VkaWVyOgorKiogICAgIEZ1bGwgc3VwcG9ydCBmb3Igc2NzaSBzY3JpcHRzIGluc3RydWN0aW9ucyBwcmUtZmV0Y2hpbmcuCisqKgorKiogIE1heSAxOSAxOTk3IGJ5IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+OgorKiogICAgIFN1cHBvcnQgZm9yIE52UkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyoqCisqKiAgQXVndXN0IDE4IDE5OTcgYnkgQ29ydCA8Y29ydEBjcy5ubXQuZWR1PjoKKyoqICAgICBTdXBwb3J0IGZvciBQb3dlci9QQyAoQmlnIEVuZGlhbikuCisqKgorKiogIEp1bmUgMjAgMTk5OCBieSBHZXJhcmQgUm91ZGllcgorKiogICAgIFN1cHBvcnQgZm9yIHVwIHRvIDY0IHRhZ3MgcGVyIGx1bi4KKyoqICAgICBPKDEpIGV2ZXJ5d2hlcmUgKEMgYW5kIFNDUklQVFMpIGZvciBub3JtYWwgY2FzZXMuCisqKiAgICAgTG93IFBDSSB0cmFmZmljIGZvciBjb21tYW5kIGhhbmRsaW5nIHdoZW4gb24tY2hpcCBSQU0gaXMgcHJlc2VudC4KKyoqICAgICBBZ2dyZXNzaXZlIFNDU0kgU0NSSVBUUyBvcHRpbWl6YXRpb25zLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisqKglTdXBwb3J0ZWQgU0NTSS1JSSBmZWF0dXJlczoKKyoqCSAgICBTeW5jaHJvbm91cyBuZWdvdGlhdGlvbgorKioJICAgIFdpZGUgbmVnb3RpYXRpb24gICAgICAgIChkZXBlbmRzIG9uIHRoZSBOQ1IgQ2hpcCkKKyoqCSAgICBFbmFibGUgZGlzY29ubmVjdGlvbgorKioJICAgIFRhZ2dlZCBjb21tYW5kIHF1ZXVpbmcKKyoqCSAgICBQYXJpdHkgY2hlY2tpbmcKKyoqCSAgICBFdGMuLi4KKyoqCisqKglTdXBwb3J0ZWQgTkNSL1NZTUJJT1MgY2hpcHM6CisqKgkJNTNDNzIwCQkoV2lkZSwgICBGYXN0IFNDU0ktMiwgaW50Zmx5IHByb2JsZW1zKQorKi8KKworLyogTmFtZSBhbmQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyICovCisjZGVmaW5lIFNDU0lfTkNSX0RSSVZFUl9OQU1FCSJuY3I1M2M4eHgtMy40LjNnIgorCisjZGVmaW5lIFNDU0lfTkNSX0RFQlVHX0ZMQUdTCSgwKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKiAgICAgIEluY2x1ZGUgZmlsZXMKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjaW5jbHVkZSAibmNyNTNjOHh4LmgiCisKKyNkZWZpbmUgTkFNRTUzQwkJCSJuY3I1M2MiCisjZGVmaW5lIE5BTUU1M0M4WFgJCSJuY3I1M2M4eHgiCisKKyNpbmNsdWRlICJzeW01M2M4eHhfY29tbS5oIgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVRoZSBDQ0IgZG9uZSBxdWV1ZSB1c2VzIGFuIGFycmF5IG9mIENDQiB2aXJ0dWFsIAorKioJYWRkcmVzc2VzLiBFbXB0eSBlbnRyaWVzIGFyZSBmbGFnZ2VkIHVzaW5nIHRoZSBib2d1cyAKKyoqCXZpcnR1YWwgYWRkcmVzcyAweGZmZmZmZmZmLgorKioKKyoqCVNpbmNlIFBDSSBlbnN1cmVzIHRoYXQgb25seSBhbGlnbmVkIERXT1JEcyBhcmUgYWNjZXNzZWQgCisqKglhdG9taWNhbGx5LCA2NCBiaXQgbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmUgcmVxdWlyZXMgCisqKgl0byB0ZXN0IHRoZSBoaWdoIG9yZGVyIERXT1JEIG9mIHRoZSBlbnRyeSB0byBkZXRlcm1pbmUgCisqKglpZiBpdCBpcyBlbXB0eSBvciB2YWxpZC4KKyoqCisqKglCVFcsIEkgd2lsbCBtYWtlIHRoaW5ncyBkaWZmZXJlbnRseSBhcyBzb29uIGFzIEkgd2lsbCAKKyoqCWhhdmUgYSBiZXR0ZXIgaWRlYSwgYnV0IHRoaXMgaXMgc2ltcGxlIGFuZCBzaG91bGQgd29yay4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisgCisjZGVmaW5lIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKyNpZmRlZiAgU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVAorCisjZGVmaW5lIE1BWF9ET05FIDI0CisjZGVmaW5lIENDQl9ET05FX0VNUFRZIDB4ZmZmZmZmZmZVTAorCisvKiBBbGwgMzIgYml0IGFyY2hpdGVjdHVyZXMgKi8KKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisjZGVmaW5lIENDQl9ET05FX1ZBTElEKGNwKSAgKCgodV9sb25nKSBjcCkgIT0gQ0NCX0RPTkVfRU1QVFkpCisKKy8qIEFsbCA+IDMyIGJpdCAoNjQgYml0KSBhcmNoaXRlY3R1cmVzIHJlZ2FyZGxlc3MgZW5kaWFuLW5lc3MgKi8KKyNlbHNlCisjZGVmaW5lIENDQl9ET05FX1ZBTElEKGNwKSAgXAorCSgoKCh1X2xvbmcpIGNwKSAmIDB4ZmZmZmZmZmYwMDAwMDAwMHVsKSAmJiAJXAorCSAoKCh1X2xvbmcpIGNwKSAmIDB4ZmZmZmZmZmZ1bCkgIT0gQ0NCX0RPTkVfRU1QVFkpCisjZW5kaWYKKworI2VuZGlmIC8qIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJQ29uZmlndXJhdGlvbiBhbmQgRGVidWdnaW5nCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogICAgU0NTSSBhZGRyZXNzIG9mIHRoaXMgZGV2aWNlLgorKiogICAgVGhlIGJvb3Qgcm91dGluZXMgc2hvdWxkIGhhdmUgc2V0IGl0LgorKiogICAgSWYgbm90LCB1c2UgdGhpcy4KKyovCisKKyNpZm5kZWYgU0NTSV9OQ1JfTVlBRERSCisjZGVmaW5lIFNDU0lfTkNSX01ZQUREUiAgICAgICg3KQorI2VuZGlmCisKKy8qCisqKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFncyBwZXIgbG9naWMgdW5pdC4KKyoqICAgIFVzZWQgb25seSBmb3IgZGlzayBkZXZpY2VzIHRoYXQgc3VwcG9ydCB0YWdzLgorKi8KKworI2lmbmRlZiBTQ1NJX05DUl9NQVhfVEFHUworI2RlZmluZSBTQ1NJX05DUl9NQVhfVEFHUyAgICAoOCkKKyNlbmRpZgorCisvKgorKiogICAgVEFHUyBhcmUgYWN0dWFsbHkgbGltaXRlZCB0byA2NCB0YWdzL2x1bi4KKyoqICAgIFdlIG5lZWQgdG8gZGVhbCB3aXRoIHBvd2VyIG9mIDIsIGZvciBhbGlnbm1lbnQgY29uc3RyYWludHMuCisqLworI2lmCVNDU0lfTkNSX01BWF9UQUdTID4gNjQKKyNkZWZpbmUJTUFYX1RBR1MgKDY0KQorI2Vsc2UKKyNkZWZpbmUJTUFYX1RBR1MgU0NTSV9OQ1JfTUFYX1RBR1MKKyNlbmRpZgorCisjZGVmaW5lIE5PX1RBRwkoMjU1KQorCisvKgorKioJQ2hvb3NlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRhZyBiaXRtYXAuCisqLworI2lmCU1BWF9UQUdTID4gMzIKK3R5cGVkZWYgdTY0IHRhZ21hcF90OworI2Vsc2UKK3R5cGVkZWYgdTMyIHRhZ21hcF90OworI2VuZGlmCisKKy8qCisqKiAgICBOdW1iZXIgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlci4KKyoqICAgIG4gcGVybWl0cyB0YXJnZXQgbnVtYmVycyAwLi5uLTEuCisqKiAgICBEZWZhdWx0IGlzIDE2LCBtZWFuaW5nIHRhcmdldHMgIzAuLiMxNS4KKyoqICAgICM3IC4uIGlzIG15c2VsZi4KKyovCisKKyNpZmRlZiBTQ1NJX05DUl9NQVhfVEFSR0VUCisjZGVmaW5lIE1BWF9UQVJHRVQgIChTQ1NJX05DUl9NQVhfVEFSR0VUKQorI2Vsc2UKKyNkZWZpbmUgTUFYX1RBUkdFVCAgKDE2KQorI2VuZGlmCisKKy8qCisqKiAgICBOdW1iZXIgb2YgbG9naWMgdW5pdHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCisqKiAgICBuIGVuYWJsZXMgbG9naWMgdW5pdCBudW1iZXJzIDAuLm4tMS4KKyoqICAgIFRoZSBjb21tb24gU0NTSSBkZXZpY2VzIHJlcXVpcmUgb25seQorKiogICAgb25lIGx1biwgc28gdGFrZSAxIGFzIHRoZSBkZWZhdWx0LgorKi8KKworI2lmZGVmIFNDU0lfTkNSX01BWF9MVU4KKyNkZWZpbmUgTUFYX0xVTiAgICBTQ1NJX05DUl9NQVhfTFVOCisjZWxzZQorI2RlZmluZSBNQVhfTFVOICAgICgxKQorI2VuZGlmCisKKy8qCisqKiAgICBBc3luY2hyb25vdXMgcHJlLXNjYWxlciAobnMpLiBTaGFsbCBiZSA0MAorKi8KKyAKKyNpZm5kZWYgU0NTSV9OQ1JfTUlOX0FTWU5DCisjZGVmaW5lIFNDU0lfTkNSX01JTl9BU1lOQyAoNDApCisjZW5kaWYKKworLyoKKyoqICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBqb2JzIHNjaGVkdWxlZCBmb3Igc3RhcnRpbmcuCisqKiAgICBUaGVyZSBzaG91bGQgYmUgb25lIHNsb3QgcGVyIHRhcmdldCwgYW5kIG9uZSBzbG90CisqKiAgICBmb3IgZWFjaCB0YWcgb2YgZWFjaCB0YXJnZXQgaW4gdXNlLgorKiogICAgVGhlIGNhbGN1bGF0aW9uIGJlbG93IGlzIGFjdHVhbGx5IHF1aXRlIHNpbGx5IC4uLgorKi8KKworI2lmZGVmIFNDU0lfTkNSX0NBTl9RVUVVRQorI2RlZmluZSBNQVhfU1RBUlQgICAoU0NTSV9OQ1JfQ0FOX1FVRVVFICsgNCkKKyNlbHNlCisjZGVmaW5lIE1BWF9TVEFSVCAgIChNQVhfVEFSR0VUICsgNyAqIE1BWF9UQUdTKQorI2VuZGlmCisKKy8qCisqKiAgIFdlIGxpbWl0IHRoZSBtYXggbnVtYmVyIG9mIHBlbmRpbmcgSU8gdG8gMjUwLgorKiogICBzaW5jZSB3ZSBkb25ub3Qgd2FudCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gMSAKKyoqICAgUEFHRSBmb3IgJ3NjcmlwdGgnLgorKi8KKyNpZglNQVhfU1RBUlQgPiAyNTAKKyN1bmRlZglNQVhfU1RBUlQKKyNkZWZpbmUJTUFYX1NUQVJUIDI1MAorI2VuZGlmCisKKy8qCisqKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMgYSB0cmFuc2ZlciBpcyBzcGxpdCBpbnRvLgorKiogICAgV2Ugc3VwcG9ydCB1cCB0byAxMjcgc2VnbWVudHMgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUuCisqKiAgICBUaGUgZGF0YSBzY3JpcHRzIGFyZSBicm9rZW4gaW50byAyIHN1Yi1zY3JpcHRzLgorKiogICAgODAgKE1BWF9TQ0FUVEVSTCkgc2VnbWVudHMgYXJlIG1vdmVkIGZyb20gYSBzdWItc2NyaXB0CisqKiAgICBpbiBvbi1jaGlwIFJBTS4gVGhpcyBtYWtlcyBkYXRhIHRyYW5zZmVycyBzaG9ydGVyIHRoYW4gCisqKiAgICA4MGsgKGFzc3VtaW5nIDFrIGZzKSBhcyBmYXN0IGFzIHBvc3NpYmxlLgorKi8KKworI2RlZmluZSBNQVhfU0NBVFRFUiAoU0NTSV9OQ1JfTUFYX1NDQVRURVIpCisKKyNpZiAoTUFYX1NDQVRURVIgPiA4MCkKKyNkZWZpbmUgTUFYX1NDQVRURVJMCTgwCisjZGVmaW5lCU1BWF9TQ0FUVEVSSAkoTUFYX1NDQVRURVIgLSBNQVhfU0NBVFRFUkwpCisjZWxzZQorI2RlZmluZSBNQVhfU0NBVFRFUkwJKE1BWF9TQ0FUVEVSLTEpCisjZGVmaW5lCU1BWF9TQ0FUVEVSSAkxCisjZW5kaWYKKworLyoKKyoqCW90aGVyCisqLworCisjZGVmaW5lIE5DUl9TTk9PUF9USU1FT1VUICgxMDAwMDAwKQorCisvKgorKioJT3RoZXIgZGVmaW5pdGlvbnMKKyovCisKKyNkZWZpbmUgU2NzaVJlc3VsdChob3N0X2NvZGUsIHNjc2lfY29kZSkgKCgoaG9zdF9jb2RlKSA8PCAxNikgKyAoKHNjc2lfY29kZSkgJiAweDdmKSkKKworI2RlZmluZSBpbml0dmVyYm9zZSAoZHJpdmVyX3NldHVwLnZlcmJvc2UpCisjZGVmaW5lIGJvb3R2ZXJib3NlIChucC0+dmVyYm9zZSkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJQ29tbWFuZCBjb250cm9sIGJsb2NrIHN0YXRlcy4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNkZWZpbmUgSFNfSURMRQkJKDApCisjZGVmaW5lIEhTX0JVU1kJCSgxKQorI2RlZmluZSBIU19ORUdPVElBVEUJKDIpCS8qIHN5bmMvd2lkZSBkYXRhIHRyYW5zZmVyKi8KKyNkZWZpbmUgSFNfRElTQ09OTkVDVAkoMykJLyogRGlzY29ubmVjdGVkIGJ5IHRhcmdldCAqLworCisjZGVmaW5lIEhTX0RPTkVNQVNLCSgweDgwKQorI2RlZmluZSBIU19DT01QTEVURQkoNHxIU19ET05FTUFTSykKKyNkZWZpbmUgSFNfU0VMX1RJTUVPVVQJKDV8SFNfRE9ORU1BU0spCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICAgICAgKi8KKyNkZWZpbmUgSFNfUkVTRVQJKDZ8SFNfRE9ORU1BU0spCS8qIFNDU0kgcmVzZXQJICAgICAgICAgICovCisjZGVmaW5lIEhTX0FCT1JURUQJKDd8SFNfRE9ORU1BU0spCS8qIFRyYW5zZmVyIGFib3J0ZWQgICAgICAgKi8KKyNkZWZpbmUgSFNfVElNRU9VVAkoOHxIU19ET05FTUFTSykJLyogU29mdHdhcmUgdGltZW91dCAgICAgICAqLworI2RlZmluZSBIU19GQUlMCQkoOXxIU19ET05FTUFTSykJLyogU0NTSSBvciBQQ0kgYnVzIGVycm9ycyAqLworI2RlZmluZSBIU19VTkVYUEVDVEVECSgxMHxIU19ET05FTUFTSykvKiBVbmV4cGVjdGVkIGRpc2Nvbm5lY3QgICovCisKKy8qCisqKglJbnZhbGlkIGhvc3Qgc3RhdHVzIHZhbHVlcyB1c2VkIGJ5IHRoZSBTQ1JJUFRTIHByb2Nlc3NvciAKKyoqCXdoZW4gdGhlIG5leHVzIGlzIG5vdCBmdWxseSBpZGVudGlmaWVkLgorKioJU2hhbGwgbmV2ZXIgYXBwZWFyIGluIGEgQ0NCLgorKi8KKworI2RlZmluZSBIU19JTlZBTE1BU0sJKDB4NDApCisjZGVmaW5lCUhTX1NFTEVDVElORwkoMHxIU19JTlZBTE1BU0spCisjZGVmaW5lCUhTX0lOX1JFU0VMRUNUCSgxfEhTX0lOVkFMTUFTSykKKyNkZWZpbmUJSFNfU1RBUlRJTkcJKDJ8SFNfSU5WQUxNQVNLKQorCisvKgorKioJRmxhZ3Mgc2V0IGJ5IHRoZSBTQ1JJUFQgcHJvY2Vzc29yIGZvciBjb21tYW5kcyAKKyoqCXRoYXQgaGF2ZSBiZWVuIHNraXBwZWQuCisqLworI2RlZmluZSBIU19TS0lQTUFTSwkoMHgyMCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJU29mdHdhcmUgSW50ZXJydXB0IENvZGVzCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lCVNJUl9CQURfU1RBVFVTCQkoMSkKKyNkZWZpbmUJU0lSX1hYWFhYWFhYWFgJCSgyKQorI2RlZmluZQlTSVJfTkVHT19TWU5DCQkoMykKKyNkZWZpbmUJU0lSX05FR09fV0lERQkJKDQpCisjZGVmaW5lCVNJUl9ORUdPX0ZBSUxFRAkJKDUpCisjZGVmaW5lCVNJUl9ORUdPX1BST1RPCQkoNikKKyNkZWZpbmUJU0lSX1JFSkVDVF9SRUNFSVZFRAkoNykKKyNkZWZpbmUJU0lSX1JFSkVDVF9TRU5UCQkoOCkKKyNkZWZpbmUJU0lSX0lHTl9SRVNJRFVFCQkoOSkKKyNkZWZpbmUJU0lSX01JU1NJTkdfU0FWRQkoMTApCisjZGVmaW5lCVNJUl9SRVNFTF9OT19NU0dfSU4JKDExKQorI2RlZmluZQlTSVJfUkVTRUxfTk9fSURFTlRJRlkJKDEyKQorI2RlZmluZQlTSVJfUkVTRUxfQkFEX0xVTgkoMTMpCisjZGVmaW5lCVNJUl9SRVNFTF9CQURfVEFSR0VUCSgxNCkKKyNkZWZpbmUJU0lSX1JFU0VMX0JBRF9JX1RfTAkoMTUpCisjZGVmaW5lCVNJUl9SRVNFTF9CQURfSV9UX0xfUQkoMTYpCisjZGVmaW5lCVNJUl9ET05FX09WRVJGTE9XCSgxNykKKyNkZWZpbmUJU0lSX0lOVEZMWQkJKDE4KQorI2RlZmluZQlTSVJfTUFYCQkJKDE4KQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglFeHRlbmRlZCBlcnJvciBjb2Rlcy4KKyoqCXhlcnJfc3RhdHVzIGZpZWxkIG9mIHN0cnVjdCBjY2IuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lCVhFX09LCQkoMCkKKyNkZWZpbmUJWEVfRVhUUkFfREFUQQkoMSkJLyogdW5leHBlY3RlZCBkYXRhIHBoYXNlICovCisjZGVmaW5lCVhFX0JBRF9QSEFTRQkoMikJLyogaWxsZWdhbCBwaGFzZSAoNC81KSAgICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCU5lZ290aWF0aW9uIHN0YXR1cy4KKyoqCW5lZ29fc3RhdHVzIGZpZWxkCW9mIHN0cnVjdCBjY2IuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIE5TX05PQ0hBTkdFCSgwKQorI2RlZmluZSBOU19TWU5DCQkoMSkKKyNkZWZpbmUgTlNfV0lERQkJKDIpCisjZGVmaW5lIE5TX1BQUgkJKDQpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCU1pc2MuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIENDQl9NQUdJQwkoMHhmMjY5MWFkMikKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRGVjbGFyYXRpb24gb2Ygc3RydWN0cy4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKm5jcjUzYzh4eF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOworCitzdHJ1Y3QgdGNiOworc3RydWN0IGxjYjsKK3N0cnVjdCBjY2I7CitzdHJ1Y3QgbmNiOworc3RydWN0IHNjcmlwdDsKKworc3RydWN0IGxpbmsgeworCW5jcmNtZAlsX2NtZDsKKwluY3JjbWQJbF9wYWRkcjsKK307CisKK3N0cnVjdAl1c3JjbWQgeworCXVfbG9uZwl0YXJnZXQ7CisJdV9sb25nCWx1bjsKKwl1X2xvbmcJZGF0YTsKKwl1X2xvbmcJY21kOworfTsKKworI2RlZmluZSBVQ19TRVRTWU5DICAgICAgMTAKKyNkZWZpbmUgVUNfU0VUVEFHUwkxMQorI2RlZmluZSBVQ19TRVRERUJVRwkxMgorI2RlZmluZSBVQ19TRVRPUkRFUgkxMworI2RlZmluZSBVQ19TRVRXSURFCTE0CisjZGVmaW5lIFVDX1NFVEZMQUcJMTUKKyNkZWZpbmUgVUNfU0VUVkVSQk9TRQkxNworCisjZGVmaW5lCVVGX1RSQUNFCSgweDAxKQorI2RlZmluZQlVRl9OT0RJU0MJKDB4MDIpCisjZGVmaW5lCVVGX05PU0NBTgkoMHgwNCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglEZWNsYXJhdGlvbiBvZiBzdHJ1Y3RzOgkJdGFyZ2V0IGNvbnRyb2wgYmxvY2sKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCB0Y2IgeworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUR1cmluZyByZXNlbGVjdGlvbiB0aGUgbmNyIGp1bXBzIHRvIHRoaXMgcG9pbnQgd2l0aCBTRkJSIAorCSoqCXNldCB0byB0aGUgZW5jb2RlZCB0YXJnZXQgbnVtYmVyIHdpdGggYml0IDcgc2V0LgorCSoqCWlmIGl0J3Mgbm90IHRoaXMgdGFyZ2V0LCBqdW1wIHRvIHRoZSBuZXh0LgorCSoqCisJKioJSlVNUCAgSUYgKFNGQlIgIT0gI3RhcmdldCMpLCBAKG5leHQgdGNiKQorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IGxpbmsgICBqdW1wX3RjYjsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUxvYWQgdGhlIGFjdHVhbCB2YWx1ZXMgZm9yIHRoZSBzeGZlciBhbmQgdGhlIHNjbnRsMworCSoqCXJlZ2lzdGVyIChzeW5jL3dpZGUgbW9kZSkuCisJKioKKwkqKglTQ1JfQ09QWSAoMSksIEAoc3ZhbCBmaWVsZCBvZiB0aGlzIHRjYiksIEAoc3hmZXIgIHJlZ2lzdGVyKQorCSoqCVNDUl9DT1BZICgxKSwgQCh3dmFsIGZpZWxkIG9mIHRoaXMgdGNiKSwgQChzY250bDMgcmVnaXN0ZXIpCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwluY3JjbWQJZ2V0c2NyWzZdOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJR2V0IHRoZSBJREVOVElGWSBtZXNzYWdlIGFuZCBsb2FkIHRoZSBMVU4gdG8gU0ZCUi4KKwkqKgorCSoqCUNBTEwsIDxSRVNFTF9MVU4+CisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbGluayAgIGNhbGxfbHVuOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJTm93IGxvb2sgZm9yIHRoZSByaWdodCBsdW4uCisJKioKKwkqKglGb3IgaSA9IDAgdG8gMworCSoqCQlTQ1JfSlVNUCBeIElGVFJVRShNQVNLKGksIDMpKSwgQChmaXJzdCBsY2IgbW9kLiBpKQorCSoqCisJKioJUmVjZW50IGNoaXBzIHdpbGwgcHJlZmV0Y2ggdGhlIDQgSlVNUFMgdXNpbmcgb25seSAxIGJ1cnN0LgorCSoqCUl0IGlzIGtpbmQgb2YgaGFzaGNvZGluZy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBsaW5rICAgICBqdW1wX2xjYls0XTsJLyogSlVNUHMgZm9yIHJlc2VsZWN0aW9uCSovCisJc3RydWN0IGxjYiAqCWxwW01BWF9MVU5dOwkvKiBUaGUgbGNiJ3Mgb2YgdGhpcyB0Y2IJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVBvaW50ZXIgdG8gdGhlIGNjYiB1c2VkIGZvciBuZWdvdGlhdGlvbi4KKwkqKglQcmV2ZW50IGZyb20gc3RhcnRpbmcgYSBuZWdvdGlhdGlvbiBmb3IgYWxsIHF1ZXVlZCBjb21tYW5kcyAKKwkqKgl3aGVuIHRhZ2dlZCBjb21tYW5kIHF1ZXVpbmcgaXMgZW5hYmxlZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBjY2IgKiAgIG5lZ29fY3A7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglzdGF0aXN0aWNhbCBkYXRhCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1X2xvbmcJdHJhbnNmZXJzOworCXVfbG9uZwlieXRlczsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCW5lZ290aWF0aW9uIG9mIHdpZGUgYW5kIHN5bmNoIHRyYW5zZmVyIGFuZCBkZXZpY2UgcXVpcmtzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisjaWZkZWYgU0NTSV9OQ1JfQklHX0VORElBTgorLyowKi8JdTE2CXBlcmlvZDsKKy8qMiovCXVfY2hhcglzdmFsOworLyozKi8JdV9jaGFyCW1pbnN5bmM7CisvKjAqLwl1X2NoYXIJd3ZhbDsKKy8qMSovCXVfY2hhcgl3aWRlZG9uZTsKKy8qMiovCXVfY2hhcglxdWlya3M7CisvKjMqLwl1X2NoYXIJbWF4b2ZmczsKKyNlbHNlCisvKjAqLwl1X2NoYXIJbWluc3luYzsKKy8qMSovCXVfY2hhcglzdmFsOworLyoyKi8JdTE2CXBlcmlvZDsKKy8qMCovCXVfY2hhcgltYXhvZmZzOworLyoxKi8JdV9jaGFyCXF1aXJrczsKKy8qMiovCXVfY2hhcgl3aWRlZG9uZTsKKy8qMyovCXVfY2hhcgl3dmFsOworI2VuZGlmCisKKwkvKiBVc2VyIHNldHRhYmxlIGxpbWl0cyBhbmQgb3B0aW9ucy4gICovCisJdV9jaGFyCXVzcnN5bmM7CisJdV9jaGFyCXVzcndpZGU7CisJdV9jaGFyCXVzcnRhZ3M7CisJdV9jaGFyCXVzcmZsYWc7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglEZWNsYXJhdGlvbiBvZiBzdHJ1Y3RzOgkJbHVuIGNvbnRyb2wgYmxvY2sKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBsY2IgeworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUR1cmluZyByZXNlbGVjdGlvbiB0aGUgbmNyIGp1bXBzIHRvIHRoaXMgcG9pbnQKKwkqKgl3aXRoIFNGQlIgc2V0IHRvIHRoZSAiSWRlbnRpZnkiIG1lc3NhZ2UuCisJKioJaWYgaXQncyBub3QgdGhpcyBsdW4sIGp1bXAgdG8gdGhlIG5leHQuCisJKioKKwkqKglKVU1QICBJRiAoU0ZCUiAhPSAjbHVuIyksIEAobmV4dCBsY2Igb2YgdGhpcyB0YXJnZXQpCisJKioKKwkqKglJdCBpcyB0aGlzIGx1bi4gTG9hZCBURU1QIHdpdGggdGhlIG5leHVzIGp1bXBzIHRhYmxlIAorCSoqCWFkZHJlc3MgYW5kIGp1bXAgdG8gUkVTRUxfVEFHIChvciBSRVNFTF9OT1RBRykuCisJKioKKwkqKgkJU0NSX0NPUFkgKDQpLCBwX2p1bXBfY2NiLCBURU1QLAorCSoqCQlTQ1JfSlVNUCwgPFJFU0VMX1RBRz4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBsaW5rCWp1bXBfbGNiOworCW5jcmNtZAkJbG9hZF9qdW1wX2NjYlszXTsKKwlzdHJ1Y3QgbGluawlqdW1wX3RhZzsKKwluY3JjbWQJCXBfanVtcF9jY2I7CS8qIEp1bXAgdGFibGUgYnVzIGFkZHJlc3MJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUp1bXAgdGFibGUgdXNlZCBieSB0aGUgc2NyaXB0IHByb2Nlc3NvciB0byBkaXJlY3RseSBqdW1wIAorCSoqCXRvIHRoZSBDQ0IgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzZWxlY3RlZCBuZXh1cy4KKwkqKglBZGRyZXNzIGlzIGFsbG9jYXRlZCBvbiAyNTYgYnl0ZXMgYm91bmRhcnkgaW4gb3JkZXIgdG8gCisJKioJYWxsb3cgOCBiaXQgY2FsY3VsYXRpb24gb2YgdGhlIHRhZyBqdW1wIGVudHJ5IGZvciB1cCB0byAKKwkqKgk2NCBwb3NzaWJsZSB0YWdzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdTMyCQlqdW1wX2NjYl8wOwkvKiBEZWZhdWx0IHRhYmxlIGlmIG5vIHRhZ3MJKi8KKwl1MzIJCSpqdW1wX2NjYjsJLyogVmlydHVhbCBhZGRyZXNzCQkqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJQ0NCIHF1ZXVlIG1hbmFnZW1lbnQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfY2NicTsJLyogUXVldWUgb2YgYXZhaWxhYmxlIENDQnMJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c3lfY2NicTsJLyogUXVldWUgb2YgYnVzeSBDQ0JzCQkqLworCXN0cnVjdCBsaXN0X2hlYWQgd2FpdF9jY2JxOwkvKiBRdWV1ZSBvZiB3YWl0aW5nIGZvciBJTyBDQ0JzCSovCisJc3RydWN0IGxpc3RfaGVhZCBza2lwX2NjYnE7CS8qIFF1ZXVlIG9mIHNraXBwZWQgQ0NCcwkqLworCXVfY2hhcgkJYWN0Y2NiczsJLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBDQ0JzCSovCisJdV9jaGFyCQlidXN5Y2NiczsJLyogQ0NCcyBidXN5IGZvciB0aGlzIGx1bgkqLworCXVfY2hhcgkJcXVldWVkY2NiczsJLyogQ0NCcyBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIqLworCXVfY2hhcgkJcXVldWVkZXB0aDsJLyogUXVldWUgZGVwdGggZm9yIHRoaXMgbHVuCSovCisJdV9jaGFyCQlzY2Rldl9kZXB0aDsJLyogU0NTSSBkZXZpY2UgcXVldWUgZGVwdGgJKi8KKwl1X2NoYXIJCW1heG54czsJCS8qIE1heCBwb3NzaWJsZSBuZXh1c2VzCQkqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJQ29udHJvbCBvZiB0YWdnZWQgY29tbWFuZCBxdWV1aW5nLgorCSoqCVRhZ3MgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgYSBjaXJjdWxhciBidWZmZXIuCisJKioJVGhpcyBhdm9pZHMgdXNpbmcgYSBsb29wIGZvciB0YWcgYWxsb2NhdGlvbi4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXVfY2hhcgkJaWFfdGFnOwkJLyogQWxsb2NhdGlvbiBpbmRleAkJKi8KKwl1X2NoYXIJCWlmX3RhZzsJCS8qIEZyZWVpbmcgaW5kZXgJCSovCisJdV9jaGFyIGNiX3RhZ3NbTUFYX1RBR1NdOwkvKiBDaXJjdWxhciB0YWdzIGJ1ZmZlcgkqLworCXVfY2hhcgkJdXNldGFnczsJLyogQ29tbWFuZCBxdWV1aW5nIGlzIGFjdGl2ZQkqLworCXVfY2hhcgkJbWF4dGFnczsJLyogTWF4IG5yIG9mIHRhZ3MgYXNrZWQgYnkgdXNlcgkqLworCXVfY2hhcgkJbnVtdGFnczsJLyogQ3VycmVudCBudW1iZXIgb2YgdGFncwkqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJUVVFVUUgRlVMTCBjb250cm9sIGFuZCBPUkRFUkVEIHRhZyBjb250cm9sLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJUVVFVUUgRlVMTCBhbmQgT1JERVJFRCB0YWcgY29udHJvbC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXUxNgkJbnVtX2dvb2Q7CS8qIE5yIG9mIEdPT0Qgc2luY2UgUVVFVUUgRlVMTAkqLworCXRhZ21hcF90CXRhZ3NfdW1hcDsJLyogVXNlZCB0YWdzIGJpdG1hcAkJKi8KKwl0YWdtYXBfdAl0YWdzX3NtYXA7CS8qIFRhZ3MgaW4gdXNlIGF0ICd0YWdfc3RpbWUnCSovCisJdV9sb25nCQl0YWdzX3N0aW1lOwkvKiBMYXN0IHRpbWUgd2Ugc2V0IHNtYXA9dW1hcAkqLworCXN0cnVjdCBjY2IgKgloZWxkX2NjYjsJLyogQ0NCIGhlbGQgZm9yIFFVRVVFIEZVTEwJKi8KK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiogICAgICBEZWNsYXJhdGlvbiBvZiBzdHJ1Y3RzOiAgICAgdGhlIGxhdW5jaCBzY3JpcHQuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglJdCBpcyBwYXJ0IG9mIHRoZSBDQ0IgYW5kIGlzIGNhbGxlZCBieSB0aGUgc2NyaXB0cyBwcm9jZXNzb3IgdG8gCisqKglzdGFydCBvciByZXN0YXJ0IHRoZSBkYXRhIHN0cnVjdHVyZSAobmV4dXMpLgorKioJVGhpcyA2IERXT1JEcyBtaW5pIHNjcmlwdCBtYWtlcyB1c2Ugb2YgcHJlZmV0Y2hpbmcuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdHJ1Y3QgbGF1bmNoIHsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglTQ1JfQ09QWSg0KSwJQChwX3BoeXMpLCBAKGRzYSByZWdpc3RlcikKKwkqKglTQ1JfSlVNUCwJQChzY2hlZHVsZXJfcG9pbnQpCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwluY3JjbWQJCXNldHVwX2RzYVszXTsJLyogQ29weSAncGh5cycgYWRkcmVzcyB0byBkc2EJKi8KKwlzdHJ1Y3QgbGluawlzY2hlZHVsZTsJLyogSnVtcCB0byBzY2hlZHVsZXIgcG9pbnQJKi8KKwluY3JjbWQJCXBfcGh5czsJCS8qICdwaHlzJyBoZWFkZXIgYnVzIGFkZHJlc3MJKi8KK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiogICAgICBEZWNsYXJhdGlvbiBvZiBzdHJ1Y3RzOiAgICAgZ2xvYmFsIEhFQURFUi4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVRoaXMgc3Vic3RydWN0dXJlIGlzIGNvcGllZCBmcm9tIHRoZSBjY2IgdG8gYSBnbG9iYWwgYWRkcmVzcyBhZnRlciAKKyoqCXNlbGVjdGlvbiAob3IgcmVzZWxlY3Rpb24pIGFuZCBjb3BpZWQgYmFjayBiZWZvcmUgZGlzY29ubmVjdC4KKyoqCisqKglUaGVzZSBmaWVsZHMgYXJlIGFjY2Vzc2libGUgdG8gdGhlIHNjcmlwdCBwcm9jZXNzb3IuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0cnVjdCBoZWFkIHsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglTYXZlZCBkYXRhIHBvaW50ZXIuCisJKioJUG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgc2NyaXB0IHJlc3BvbnNpYmxlIGZvciB0aGUKKwkqKglhY3R1YWwgdHJhbnNmZXIgdHJhbnNmZXIgb2YgZGF0YS4KKwkqKglJdCdzIHdyaXR0ZW4gYWZ0ZXIgcmVjZXB0aW9uIG9mIGEgU0FWRV9EQVRBX1BPSU5URVIgbWVzc2FnZS4KKwkqKglUaGUgZ29hbHBvaW50ZXIgcG9pbnRzIGFmdGVyIHRoZSBsYXN0IHRyYW5zZmVyIGNvbW1hbmQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1MzIJCXNhdmVwOworCXUzMgkJbGFzdHA7CisJdTMyCQlnb2FscDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUFsdGVybmF0ZSBkYXRhIHBvaW50ZXIuCisJKioJVGhleSBhcmUgY29waWVkIGJhY2sgdG8gc2F2ZXAvbGFzdHAvZ29hbHAgYnkgdGhlIFNDUklQVFMgCisJKioJd2hlbiB0aGUgZGlyZWN0aW9uIGlzIHVua25vd24gYW5kIHRoZSBkZXZpY2UgY2xhaW1zIGRhdGEgb3V0LgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdTMyCQl3bGFzdHA7CisJdTMyCQl3Z29hbHA7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglUaGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBjY2IgY29udGFpbmluZyB0aGlzIGhlYWRlci4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBjY2IgKgljcDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVN0YXR1cyBmaWVsZHMuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1X2NoYXIJCXNjcl9zdFs0XTsJLyogc2NyaXB0IHN0YXR1cwkJKi8KKwl1X2NoYXIJCXN0YXR1c1s0XTsJLyogaG9zdCBzdGF0dXMuIG11c3QgYmUgdGhlIAkqLworCQkJCQkvKiAgbGFzdCBEV09SRCBvZiB0aGUgaGVhZGVyLgkqLworfTsKKworLyoKKyoqCVRoZSBzdGF0dXMgYnl0ZXMgYXJlIHVzZWQgYnkgdGhlIGhvc3QgYW5kIHRoZSBzY3JpcHQgcHJvY2Vzc29yLgorKioKKyoqCVRoZSBieXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhvc3Rfc3RhdHVzIG11c3QgYmUgc3RvcmVkIGluIHRoZSAKKyoqCWxhc3QgRFdPUkQgb2YgdGhlIENDQiBoZWFkZXIgc2luY2UgaXQgaXMgdXNlZCBmb3IgY29tbWFuZCAKKyoqCWNvbXBsZXRpb24gKG5jcl93YWtldXAoKSkuIERvaW5nIHNvLCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBoZWFkZXIgCisqKgloYXMgYmVlbiBlbnRpcmVseSBjb3BpZWQgYmFjayB0byB0aGUgQ0NCIHdoZW4gdGhlIGhvc3Rfc3RhdHVzIGlzIAorKioJc2VlbiBjb21wbGV0ZSBieSB0aGUgQ1BVLgorKioKKyoqCVRoZSBsYXN0IGZvdXIgYnl0ZXMgKHN0YXR1c1s0XSkgYXJlIGNvcGllZCB0byB0aGUgc2NyYXRjaGIgcmVnaXN0ZXIKKyoqCShkZWNsYXJlZCBhcyBzY3IwLi5zY3IzIGluIG5jcl9yZWcuaCkganVzdCBhZnRlciB0aGUgc2VsZWN0L3Jlc2VsZWN0LAorKioJYW5kIGNvcGllZCBiYWNrIGp1c3QgYWZ0ZXIgZGlzY29ubmVjdGluZy4KKyoqCUluc2lkZSB0aGUgc2NyaXB0IHRoZSBYWF9SRUcgYXJlIHVzZWQuCisqKgorKioJVGhlIGZpcnN0IGZvdXIgYnl0ZXMgKHNjcl9zdFs0XSkgYXJlIHVzZWQgaW5zaWRlIHRoZSBzY3JpcHQgYnkgCisqKgkiQ09QWSIgY29tbWFuZHMuCisqKglCZWNhdXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdCBoYXZlIHRoZSBzYW1lIGFsaWdubWVudAorKioJaW4gYSBEV09SRCwgdGhlIGZpZWxkcyBIQVZFIHRvIGJlIGF0IHRoZSBjaG9vc2VuIG9mZnNldHMuCisqKgkJeGVycl9zdAkJMAkoMHgzNCkJc2NyYXRjaGEKKyoqCQlzeW5jX3N0CQkxCSgweDA1KQlzeGZlcgorKioJCXdpZGVfc3QJCTMJKDB4MDMpCXNjbnRsMworKi8KKworLyoKKyoqCUxhc3QgZm91ciBieXRlcyAoc2NyaXB0KQorKi8KKyNkZWZpbmUgIFFVX1JFRwlzY3IwCisjZGVmaW5lICBIU19SRUcJc2NyMQorI2RlZmluZSAgSFNfUFJUCW5jX3NjcjEKKyNkZWZpbmUgIFNTX1JFRwlzY3IyCisjZGVmaW5lICBTU19QUlQJbmNfc2NyMgorI2RlZmluZSAgUFNfUkVHCXNjcjMKKworLyoKKyoqCUxhc3QgZm91ciBieXRlcyAoaG9zdCkKKyovCisjaWZkZWYgU0NTSV9OQ1JfQklHX0VORElBTgorI2RlZmluZSAgYWN0dWFscXVpcmtzICBwaHlzLmhlYWRlci5zdGF0dXNbM10KKyNkZWZpbmUgIGhvc3Rfc3RhdHVzICAgcGh5cy5oZWFkZXIuc3RhdHVzWzJdCisjZGVmaW5lICBzY3NpX3N0YXR1cyAgIHBoeXMuaGVhZGVyLnN0YXR1c1sxXQorI2RlZmluZSAgcGFyaXR5X3N0YXR1cyBwaHlzLmhlYWRlci5zdGF0dXNbMF0KKyNlbHNlCisjZGVmaW5lICBhY3R1YWxxdWlya3MgIHBoeXMuaGVhZGVyLnN0YXR1c1swXQorI2RlZmluZSAgaG9zdF9zdGF0dXMgICBwaHlzLmhlYWRlci5zdGF0dXNbMV0KKyNkZWZpbmUgIHNjc2lfc3RhdHVzICAgcGh5cy5oZWFkZXIuc3RhdHVzWzJdCisjZGVmaW5lICBwYXJpdHlfc3RhdHVzIHBoeXMuaGVhZGVyLnN0YXR1c1szXQorI2VuZGlmCisKKy8qCisqKglGaXJzdCBmb3VyIGJ5dGVzIChzY3JpcHQpCisqLworI2RlZmluZSAgeGVycl9zdCAgICAgICBoZWFkZXIuc2NyX3N0WzBdCisjZGVmaW5lICBzeW5jX3N0ICAgICAgIGhlYWRlci5zY3Jfc3RbMV0KKyNkZWZpbmUgIG5lZ29fc3QgICAgICAgaGVhZGVyLnNjcl9zdFsyXQorI2RlZmluZSAgd2lkZV9zdCAgICAgICBoZWFkZXIuc2NyX3N0WzNdCisKKy8qCisqKglGaXJzdCBmb3VyIGJ5dGVzIChob3N0KQorKi8KKyNkZWZpbmUgIHhlcnJfc3RhdHVzICAgcGh5cy54ZXJyX3N0CisjZGVmaW5lICBuZWdvX3N0YXR1cyAgIHBoeXMubmVnb19zdAorCisjaWYgMAorI2RlZmluZSAgc3luY19zdGF0dXMgICBwaHlzLnN5bmNfc3QKKyNkZWZpbmUgIHdpZGVfc3RhdHVzICAgcGh5cy53aWRlX3N0CisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiogICAgICBEZWNsYXJhdGlvbiBvZiBzdHJ1Y3RzOiAgICAgRGF0YSBzdHJ1Y3R1cmUgYmxvY2sKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglEdXJpbmcgZXhlY3V0aW9uIG9mIGEgY2NiIGJ5IHRoZSBzY3JpcHQgcHJvY2Vzc29yLAorKioJdGhlIERTQSAoZGF0YSBzdHJ1Y3R1cmUgYWRkcmVzcykgcmVnaXN0ZXIgcG9pbnRzCisqKgl0byB0aGlzIHN1YnN0cnVjdHVyZSBvZiB0aGUgY2NiLgorKioJVGhpcyBzdWJzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGhlYWRlciB3aXRoCisqKgl0aGUgc2NyaXB0LXByb2Nlc3Nvci1jaGFuZ2FibGUgZGF0YSBhbmQKKyoqCWRhdGEgYmxvY2tzIGZvciB0aGUgaW5kaXJlY3QgbW92ZSBjb21tYW5kcy4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0cnVjdCBkc2IgeworCisJLyoKKwkqKglIZWFkZXIuCisJKi8KKworCXN0cnVjdCBoZWFkCWhlYWRlcjsKKworCS8qCisJKioJVGFibGUgZGF0YSBmb3IgU2NyaXB0CisJKi8KKworCXN0cnVjdCBzY3JfdGJsc2VsICBzZWxlY3Q7CisJc3RydWN0IHNjcl90Ymxtb3ZlIHNtc2cgIDsKKwlzdHJ1Y3Qgc2NyX3RibG1vdmUgY21kICAgOworCXN0cnVjdCBzY3JfdGJsbW92ZSBzZW5zZSA7CisJc3RydWN0IHNjcl90Ymxtb3ZlIGRhdGFbTUFYX1NDQVRURVJdOworfTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqICAgICAgRGVjbGFyYXRpb24gb2Ygc3RydWN0czogICAgIENvbW1hbmQgY29udHJvbCBibG9jay4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBjY2IgeworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIHBvaW50ZWQgYnkgdGhlIERTQSAKKwkqKglyZWdpc3RlciB3aGVuIGl0IGlzIGV4ZWN1dGVkIGJ5IHRoZSBzY3JpcHQgcHJvY2Vzc29yLgorCSoqCUl0IG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIGhlYWRlciAKKwkqKglhcyBmaXJzdCBlbnRyeSB0aGF0IG11c3QgYmUgY2FjaGUgbGluZSBhbGlnbmVkLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IGRzYglwaHlzOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJTWluaS1zY3JpcHQgdXNlZCBhdCBDQ0IgZXhlY3V0aW9uIHN0YXJ0LXVwLgorCSoqCUxvYWQgdGhlIERTQSB3aXRoIHRoZSBkYXRhIHN0cnVjdHVyZSBhZGRyZXNzIChwaHlzKSBhbmQgCisJKioJanVtcCB0byBTRUxFQ1QuIEp1bXAgdG8gQ0FOQ0VMIGlmIENDQiBpcyB0byBiZSBjYW5jZWxlZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBsYXVuY2gJc3RhcnQ7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglNaW5pLXNjcmlwdCB1c2VkIGF0IENDQiByZWxlY3Rpb24gdG8gcmVzdGFydCB0aGUgbmV4dXMuCisJKioJTG9hZCB0aGUgRFNBIHdpdGggdGhlIGRhdGEgc3RydWN0dXJlIGFkZHJlc3MgKHBoeXMpIGFuZCAKKwkqKglqdW1wIHRvIFJFU0VMX0RTQS4gSnVtcCB0byBBQk9SVCBpZiBDQ0IgaXMgdG8gYmUgYWJvcnRlZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBsYXVuY2gJcmVzdGFydDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUlmIGEgZGF0YSB0cmFuc2ZlciBwaGFzZSBpcyB0ZXJtaW5hdGVkIHRvbyBlYXJseQorCSoqCShhZnRlciByZWNlcHRpb24gb2YgYSBtZXNzYWdlIChpLmUuIERJU0NPTk5FQ1QpKSwKKwkqKgl3ZSBoYXZlIHRvIHByZXBhcmUgYSBtaW5pIHNjcmlwdCB0byB0cmFuc2ZlcgorCSoqCXRoZSByZXN0IG9mIHRoZSBkYXRhLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJbmNyY21kCQlwYXRjaFs4XTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVRoZSBnZW5lcmFsIFNDU0kgZHJpdmVyIHByb3ZpZGVzIGEKKwkqKglwb2ludGVyIHRvIGEgY29udHJvbCBibG9jay4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBzY3NpX2NtbmQJKmNtZDsJCS8qIFNDU0kgY29tbWFuZCAJCSovCisJdV9jaGFyCQljZGJfYnVmWzE2XTsJLyogQ29weSBvZiBDREIJCQkqLworCXVfY2hhcgkJc2Vuc2VfYnVmWzY0XTsKKwlpbnQJCWRhdGFfbGVuOwkvKiBUb3RhbCBkYXRhIGxlbmd0aAkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCU1lc3NhZ2UgYXJlYXMuCisJKioJV2UgcHJlcGFyZSBhIG1lc3NhZ2UgdG8gYmUgc2VudCBhZnRlciBzZWxlY3Rpb24uCisJKioJV2UgbWF5IHVzZSBhIHNlY29uZCBvbmUgaWYgdGhlIGNvbW1hbmQgaXMgcmVzY2hlZHVsZWQgCisJKioJZHVlIHRvIEdFVENDIG9yIFFGVUxMLgorCSoqICAgICAgQ29udGVudHMgYXJlIElERU5USUZZIGFuZCBTSU1QTEVfVEFHLgorCSoqCVdoaWxlIG5lZ290aWF0aW5nIHN5bmMgb3Igd2lkZSB0cmFuc2ZlciwKKwkqKglhIFNEVFIgb3IgV0RUUiBtZXNzYWdlIGlzIGFwcGVuZGVkLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9jaGFyCQlzY3NpX3Ntc2cgWzhdOworCXVfY2hhcgkJc2NzaV9zbXNnMls4XTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCU90aGVyIGZpZWxkcy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXVfbG9uZwkJcF9jY2I7CQkvKiBCVVMgYWRkcmVzcyBvZiB0aGlzIENDQgkqLworCXVfY2hhcgkJc2Vuc2VjbWRbNl07CS8qIFNlbnNlIGNvbW1hbmQJCSovCisJdV9jaGFyCQl0YWc7CQkvKiBUYWcgZm9yIHRoaXMgdHJhbnNmZXIJKi8KKwkJCQkJLyogIDI1NSBtZWFucyBubyB0YWcJCSovCisJdV9jaGFyCQl0YXJnZXQ7CisJdV9jaGFyCQlsdW47CisJdV9jaGFyCQlxdWV1ZWQ7CisJdV9jaGFyCQlhdXRvX3NlbnNlOworCXN0cnVjdCBjY2IgKglsaW5rX2NjYjsJLyogSG9zdCBhZGFwdGVyIENDQiBjaGFpbgkqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlua19jY2JxOwkvKiBMaW5rIHRvIHVuaXQgQ0NCIHF1ZXVlCSovCisJdTMyCQlzdGFydHA7CQkvKiBJbml0aWFsIGRhdGEgcG9pbnRlcgkJKi8KKwl1X2xvbmcJCW1hZ2ljOwkJLyogRnJlZSAvIGJ1c3kgIENDQiBmbGFnCSovCit9OworCisjZGVmaW5lIENDQl9QSFlTKGNwLGxibCkJKGNwLT5wX2NjYiArIG9mZnNldG9mKHN0cnVjdCBjY2IsIGxibCkpCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKiAgICAgIERlY2xhcmF0aW9uIG9mIHN0cnVjdHM6ICAgICBOQ1IgZGV2aWNlIGRlc2NyaXB0b3IKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBuY2IgeworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVRoZSBnbG9iYWwgaGVhZGVyLgorCSoqCUl0IGlzIGFjY2Vzc2libGUgdG8gYm90aCB0aGUgaG9zdCBhbmQgdGhlIHNjcmlwdCBwcm9jZXNzb3IuCisJKioJTXVzdCBiZSBjYWNoZSBsaW5lIHNpemUgYWxpZ25lZCAoMzIgZm9yIHg4NikgaW4gb3JkZXIgdG8gCisJKioJYWxsb3cgY2FjaGUgbGluZSBidXJzdGluZyB3aGVuIGl0IGlzIGNvcGllZCB0by9mcm9tIENDQi4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBoZWFkICAgICBoZWFkZXI7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglDQ0JzIG1hbmFnZW1lbnQgcXVldWVzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IHNjc2lfY21uZAkqd2FpdGluZ19saXN0OwkvKiBDb21tYW5kcyB3YWl0aW5nIGZvciBhIENDQgkqLworCQkJCQkvKiAgd2hlbiBsY2IgaXMgbm90IGFsbG9jYXRlZC4JKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpkb25lX2xpc3Q7CS8qIENvbW1hbmRzIHdhaXRpbmcgZm9yIGRvbmUoKSAgKi8KKwkJCQkJLyogY2FsbGJhY2sgdG8gYmUgaW52b2tlZC4gICAgICAqLyAKKwlzcGlubG9ja190CXNtcF9sb2NrOwkvKiBMb2NrIGZvciBTTVAgdGhyZWFkaW5nICAgICAgICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglDaGlwIGFuZCBjb250cm9sbGVyIGluZGVudGlmaWNhdGlvbi4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCWludAkJdW5pdDsJCS8qIFVuaXQgbnVtYmVyCQkJKi8KKwljaGFyCQlpbnN0X25hbWVbMTZdOwkvKiBuY2IgaW5zdGFuY2UgbmFtZQkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUluaXRpYWwgdmFsdWUgb2Ygc29tZSBJTyByZWdpc3RlciBiaXRzLgorCSoqCVRoZXNlIHZhbHVlcyBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gc2V0IGJ5IEJJT1MsIGFuZCBtYXkgCisJKioJYmUgdXNlZCBmb3IgcHJvYmluZyBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9jaGFyCXN2X3NjbnRsMCwgc3Zfc2NudGwzLCBzdl9kbW9kZSwgc3ZfZGNudGwsIHN2X2N0ZXN0MCwgc3ZfY3Rlc3QzLAorCQlzdl9jdGVzdDQsIHN2X2N0ZXN0NSwgc3ZfZ3BjbnRsLCBzdl9zdGVzdDIsIHN2X3N0ZXN0NDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUFjdHVhbCBpbml0aWFsIHZhbHVlIG9mIElPIHJlZ2lzdGVyIGJpdHMgdXNlZCBieSB0aGUgCisJKioJZHJpdmVyLiBUaGV5IGFyZSBsb2FkZWQgYXQgaW5pdGlhbGlzYXRpb24gYWNjb3JkaW5nIHRvICAKKwkqKglmZWF0dXJlcyB0aGF0IGFyZSB0byBiZSBlbmFibGVkLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdV9jaGFyCXJ2X3NjbnRsMCwgcnZfc2NudGwzLCBydl9kbW9kZSwgcnZfZGNudGwsIHJ2X2N0ZXN0MCwgcnZfY3Rlc3QzLAorCQlydl9jdGVzdDQsIHJ2X2N0ZXN0NSwgcnZfc3Rlc3QyOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJVGFyZ2V0cyBtYW5hZ2VtZW50LgorCSoqCUR1cmluZyByZXNlbGVjdGlvbiB0aGUgbmNyIGp1bXBzIHRvIGp1bXBfdGNiLgorCSoqCVRoZSBTRkJSIHJlZ2lzdGVyIGlzIGxvYWRlZCB3aXRoIHRoZSBlbmNvZGVkIHRhcmdldCBpZC4KKwkqKglGb3IgaSA9IDAgdG8gMworCSoqCQlTQ1JfSlVNUCBeIElGVFJVRShNQVNLKGksIDMpKSwgQChuZXh0IHRjYiBtb2QuIGkpCisJKioKKwkqKglSZWNlbnQgY2hpcHMgd2lsbCBwcmVmZXRjaCB0aGUgNCBKVU1QUyB1c2luZyBvbmx5IDEgYnVyc3QuCisJKioJSXQgaXMga2luZCBvZiBoYXNoY29kaW5nLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IGxpbmsgICAgIGp1bXBfdGNiWzRdOwkvKiBKVU1QcyBmb3IgcmVzZWxlY3Rpb24JKi8KKwlzdHJ1Y3QgdGNiICB0YXJnZXRbTUFYX1RBUkdFVF07CS8qIFRhcmdldCBkYXRhCQkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVZpcnR1YWwgYW5kIHBoeXNpY2FsIGJ1cyBhZGRyZXNzZXMgb2YgdGhlIGNoaXAuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl2b2lkIF9faW9tZW0gKnZhZGRyOwkJLyogVmlydHVhbCBhbmQgYnVzIGFkZHJlc3Mgb2YJKi8KKwl1bnNpZ25lZCBsb25nCXBhZGRyOwkJLyogIGNoaXAncyBJTyByZWdpc3RlcnMuCSovCisJdW5zaWduZWQgbG9uZwlwYWRkcjI7CQkvKiBPbi1jaGlwIFJBTSBidXMgYWRkcmVzcy4JKi8KKwl2b2xhdGlsZQkJCS8qIFBvaW50ZXIgdG8gdm9sYXRpbGUgZm9yIAkqLworCXN0cnVjdCBuY3JfcmVnCV9faW9tZW0gKnJlZzsJLyogIG1lbW9yeSBtYXBwZWQgSU8uCQkqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJU0NSSVBUUyB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBidXMgYWRkcmVzc2VzLgorCSoqCSdzY3JpcHQnICBpcyBsb2FkZWQgaW4gdGhlIG9uLWNoaXAgUkFNIGlmIHByZXNlbnQuCisJKioJJ3NjcmlwdGgnIHN0YXlzIGluIG1haW4gbWVtb3J5LgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IHNjcmlwdAkqc2NyaXB0MDsJLyogQ29waWVzIG9mIHNjcmlwdCBhbmQgc2NyaXB0aAkqLworCXN0cnVjdCBzY3JpcHRoCSpzY3JpcHRoMDsJLyogIHJlbG9jYXRlZCBmb3IgdGhpcyBuY2IuCSovCisJc3RydWN0IHNjcmlwdGgJKnNjcmlwdGg7CS8qIEFjdHVhbCBzY3JpcHRoIHZpcnQuIGFkZHJlc3MJKi8KKwl1X2xvbmcJCXBfc2NyaXB0OwkvKiBBY3R1YWwgc2NyaXB0IGFuZCBzY3JpcHRoCSovCisJdV9sb25nCQlwX3NjcmlwdGg7CS8qICBidXMgYWRkcmVzc2VzLgkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUdlbmVyYWwgY29udHJvbGxlciBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJc3RydWN0IGRldmljZQkqZGV2OworCXVfY2hhcgkJcmV2aXNpb25faWQ7CS8qIFBDSSBkZXZpY2UgcmV2aXNpb24gaWQJKi8KKwl1MzIJCWlycTsJCS8qIElSUSBsZXZlbAkJCSovCisJdTMyCQlmZWF0dXJlczsJLyogQ2hpcCBmZWF0dXJlcyBtYXAJCSovCisJdV9jaGFyCQlteWFkZHI7CQkvKiBTQ1NJIGlkIG9mIHRoZSBhZGFwdGVyCSovCisJdV9jaGFyCQltYXhidXJzdDsJLyogbG9nIGJhc2UgMiBvZiBkd29yZHMgYnVyc3QJKi8KKwl1X2NoYXIJCW1heHdpZGU7CS8qIE1heGltdW0gdHJhbnNmZXIgd2lkdGgJKi8KKwl1X2NoYXIJCW1pbnN5bmM7CS8qIE1pbmltdW0gc3luYyBwZXJpb2QgZmFjdG9yCSovCisJdV9jaGFyCQltYXhzeW5jOwkvKiBNYXhpbXVtIHN5bmMgcGVyaW9kIGZhY3RvcgkqLworCXVfY2hhcgkJbWF4b2ZmczsJLyogTWF4IHNjc2kgb2Zmc2V0CQkqLworCXVfY2hhcgkJbXVsdGlwbGllcjsJLyogQ2xvY2sgbXVsdGlwbGllciAoMSwyLDQpCSovCisJdV9jaGFyCQljbG9ja19kaXZuOwkvKiBOdW1iZXIgb2YgY2xvY2sgZGl2aXNvcnMJKi8KKwl1X2xvbmcJCWNsb2NrX2toejsJLyogU0NTSSBjbG9jayBmcmVxdWVuY3kgaW4gS0h6CSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglTdGFydCBxdWV1ZSBtYW5hZ2VtZW50LgorCSoqCUl0IGlzIGZpbGxlZCB1cCBieSB0aGUgaG9zdCBwcm9jZXNzb3IgYW5kIGFjY2Vzc2VkIGJ5IHRoZSAKKwkqKglTQ1JJUFRTIHByb2Nlc3NvciBpbiBvcmRlciB0byBzdGFydCBTQ1NJIGNvbW1hbmRzLgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJdTE2CQlzcXVldWVwdXQ7CS8qIE5leHQgZnJlZSBzbG90IG9mIHRoZSBxdWV1ZQkqLworCXUxNgkJYWN0Y2NiczsJLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBDQ0JzCSovCisJdTE2CQlxdWV1ZWRjY2JzOwkvKiBOdW1iZXIgb2YgQ0NCcyBpbiBzdGFydCBxdWV1ZSovCisJdTE2CQlxdWV1ZWRlcHRoOwkvKiBTdGFydCBxdWV1ZSBkZXB0aAkJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCVRpbWVvdXQgaGFuZGxlci4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBUaW1lciBoYW5kbGVyIGxpbmsgaGVhZGVyCSovCisJdV9sb25nCQlsYXN0dGltZTsKKwl1X2xvbmcJCXNldHRsZV90aW1lOwkvKiBSZXNldHRpbmcgdGhlIFNDU0kgQlVTCSovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKglEZWJ1Z2dpbmcgYW5kIHByb2ZpbGluZy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBuY3JfcmVnCXJlZ2R1bXA7CS8qIFJlZ2lzdGVyIGR1bXAJCSovCisJdV9sb25nCQlyZWd0aW1lOwkvKiBUaW1lIGl0IGhhcyBiZWVuIGRvbmUJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCU1pc2NlbGxhbmVvdXMgYnVmZmVycyBhY2Nlc3NlZCBieSB0aGUgc2NyaXB0cy1wcm9jZXNzb3IuCisJKioJVGhleSBzaGFsbCBiZSBEV09SRCBhbGlnbmVkLCBiZWNhdXNlIHRoZXkgbWF5IGJlIHJlYWQgb3IgCisJKioJd3JpdHRlbiB3aXRoIGEgU0NSX0NPUFkgc2NyaXB0IGNvbW1hbmQuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1X2NoYXIJCW1zZ291dFs4XTsJLyogQnVmZmVyIGZvciBNRVNTQUdFIE9VVCAJKi8KKwl1X2NoYXIJCW1zZ2luIFs4XTsJLyogQnVmZmVyIGZvciBNRVNTQUdFIElOCSovCisJdTMyCQlsYXN0bXNnOwkvKiBMYXN0IFNDU0kgbWVzc2FnZSBzZW50CSovCisJdV9jaGFyCQlzY3JhdGNoOwkvKiBTY3JhdGNoIGZvciBTQ1NJIHJlY2VpdmUJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCU1pc2NlbGxhbmVvdXMgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzIHBhcmFtZXRlcnMuCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwl1X2NoYXIJCWRpc2M7CQkvKiBEaWNvbm5lY3Rpb24gYWxsb3dlZAkJKi8KKwl1X2NoYXIJCXNjc2lfbW9kZTsJLyogQ3VycmVudCBTQ1NJIEJVUyBtb2RlCSovCisJdV9jaGFyCQlvcmRlcjsJCS8qIFRhZyBvcmRlciB0byB1c2UJCSovCisJdV9jaGFyCQl2ZXJib3NlOwkvKiBWZXJib3NpdHkgZm9yIHRoaXMgY29udHJvbGxlciovCisJaW50CQluY3JfY2FjaGU7CS8qIFVzZWQgZm9yIGNhY2hlIHRlc3QgYXQgaW5pdC4JKi8KKwl1X2xvbmcJCXBfbmNiOwkJLyogQlVTIGFkZHJlc3Mgb2YgdGhpcyBOQ0IJKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCUNvbW1hbmQgY29tcGxldGlvbiBoYW5kbGluZy4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworI2lmZGVmIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKwlzdHJ1Y3QgY2NiCSooY2NiX2RvbmVbTUFYX0RPTkVdKTsKKwlpbnQJCWNjYl9kb25lX2ljOworI2VuZGlmCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioJRmllbGRzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgb3IgY2hhbmdlZC4KKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCXN0cnVjdCBjY2IJKmNjYjsJCS8qIEdsb2JhbCBDQ0IJCQkqLworCXN0cnVjdCB1c3JjbWQJdXNlcjsJCS8qIENvbW1hbmQgZnJvbSB1c2VyCQkqLworCXZvbGF0aWxlIHVfY2hhcglyZWxlYXNlX3N0YWdlOwkvKiBTeW5jaHJvbmlzYXRpb24gc3RhZ2Ugb24gcmVsZWFzZSAgKi8KK307CisKKyNkZWZpbmUgTkNCX1NDUklQVF9QSFlTKG5wLGxibCkJIChucC0+cF9zY3JpcHQgICsgb2Zmc2V0b2YgKHN0cnVjdCBzY3JpcHQsIGxibCkpCisjZGVmaW5lIE5DQl9TQ1JJUFRIX1BIWVMobnAsbGJsKSAobnAtPnBfc2NyaXB0aCArIG9mZnNldG9mIChzdHJ1Y3Qgc2NyaXB0aCxsYmwpKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKiogICAgICBTY3JpcHQgZm9yIE5DUi1Qcm9jZXNzb3IuCisqKgorKioJVXNlIG5jcl9zY3JpcHRfZmlsbCgpIHRvIGNyZWF0ZSB0aGUgdmFyaWFibGUgcGFydHMuCisqKglVc2UgbmNyX3NjcmlwdF9jb3B5X2FuZF9iaW5kKCkgdG8gbWFrZSBhIGNvcHkgYW5kCisqKgliaW5kIHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJV2UgaGF2ZSB0byBrbm93IHRoZSBvZmZzZXRzIG9mIGFsbCBsYWJlbHMgYmVmb3JlCisqKgl3ZSByZWFjaCB0aGVtIChmb3IgZm9yd2FyZCBqdW1wcykuCisqKglUaGVyZWZvcmUgd2UgZGVjbGFyZSBhIHN0cnVjdCBoZXJlLgorKioJSWYgeW91IG1ha2UgY2hhbmdlcyBpbnNpZGUgdGhlIHNjcmlwdCwKKyoqCURPTlQgRk9SR0VUIFRPIENIQU5HRSBUSEUgTEVOR1RIUyBIRVJFIQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyoqCUZvciBIUCBaYWxvbi81M2M3MjAgc3lzdGVtcywgdGhlIFphbG9uIGludGVyZmFjZQorKioJYmV0d2VlbiBDUFUgYW5kIDUzYzcyMCBkb2VzIHByZWZldGNoZXMsIHdoaWNoIGNhdXNlcworKioJcHJvYmxlbXMgd2l0aCBzZWxmIG1vZGlmeWluZyBzY3JpcHRzLiAgVGhlIHByb2JsZW0KKyoqCWlzIG92ZXJjb21lIGJ5IGNhbGxpbmcgYSBkdW1teSBzdWJyb3V0aW5lIGFmdGVyIGVhY2gKKyoqCW1vZGlmaWNhdGlvbiwgdG8gZm9yY2UgYSByZWZldGNoIG9mIHRoZSBzY3JpcHQgb24KKyoqCXJldHVybiBmcm9tIHRoZSBzdWJyb3V0aW5lLgorKi8KKworI2lmZGVmIENPTkZJR19OQ1I1M0M4WFhfUFJFRkVUQ0gKKyNkZWZpbmUgUFJFRkVUQ0hfRkxVU0hfQ05UCTIKKyNkZWZpbmUgUFJFRkVUQ0hfRkxVU0gJCVNDUl9DQUxMLCBQQUREUkggKHdhaXRfZG1hKSwKKyNlbHNlCisjZGVmaW5lIFBSRUZFVENIX0ZMVVNIX0NOVAkwCisjZGVmaW5lIFBSRUZFVENIX0ZMVVNICisjZW5kaWYKKworLyoKKyoqCVNjcmlwdCBmcmFnbWVudHMgd2hpY2ggYXJlIGxvYWRlZCBpbnRvIHRoZSBvbi1jaGlwIFJBTSAKKyoqCW9mIDgyNUEsIDg3NSBhbmQgODk1IGNoaXBzLgorKi8KK3N0cnVjdCBzY3JpcHQgeworCW5jcmNtZAlzdGFydAkJWyAgNV07CisJbmNyY21kICBzdGFydHBvcwlbICAxXTsKKwluY3JjbWQJc2VsZWN0CQlbICA2XTsKKwluY3JjbWQJc2VsZWN0MgkJWyAgOSArIFBSRUZFVENIX0ZMVVNIX0NOVF07CisJbmNyY21kCWxvYWRwb3MJCVsgIDRdOworCW5jcmNtZAlzZW5kX2lkZW50CVsgIDldOworCW5jcmNtZAlwcmVwYXJlCQlbICA2XTsKKwluY3JjbWQJcHJlcGFyZTIJWyAgN107CisJbmNyY21kICBjb21tYW5kCQlbICA2XTsKKwluY3JjbWQgIGRpc3BhdGNoCVsgMzJdOworCW5jcmNtZCAgY2xyYWNrCQlbICA0XTsKKwluY3JjbWQJbm9fZGF0YQkJWyAxN107CisJbmNyY21kICBzdGF0dXMJCVsgIDhdOworCW5jcmNtZCAgbXNnX2luCQlbICAyXTsKKwluY3JjbWQgIG1zZ19pbjIJCVsgMTZdOworCW5jcmNtZCAgbXNnX2JhZAkJWyAgNF07CisJbmNyY21kCXNldG1zZwkJWyAgN107CisJbmNyY21kCWNsZWFudXAJCVsgIDZdOworCW5jcmNtZCAgY29tcGxldGUJWyAgOV07CisJbmNyY21kCWNsZWFudXBfb2sJWyAgOCArIFBSRUZFVENIX0ZMVVNIX0NOVF07CisJbmNyY21kCWNsZWFudXAwCVsgIDFdOworI2lmbmRlZiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisJbmNyY21kCXNpZ25hbAkJWyAxMl07CisjZWxzZQorCW5jcmNtZAlzaWduYWwJCVsgIDldOworCW5jcmNtZAlkb25lX3BvcwlbICAxXTsKKwluY3JjbWQJZG9uZV9wbHVnCVsgIDJdOworCW5jcmNtZAlkb25lX2VuZAlbICA3XTsKKyNlbmRpZgorCW5jcmNtZCAgc2F2ZV9kcAkJWyAgN107CisJbmNyY21kICByZXN0b3JlX2RwCVsgIDVdOworCW5jcmNtZCAgZGlzY29ubmVjdAlbIDEwXTsKKwluY3JjbWQJbXNnX291dAkJWyAgOV07CisJbmNyY21kCW1zZ19vdXRfZG9uZQlbICA3XTsKKwluY3JjbWQgIGlkbGUJCVsgIDJdOworCW5jcmNtZAlyZXNlbGVjdAlbICA4XTsKKwluY3JjbWQJcmVzZWxlY3RlZAlbICA4XTsKKwluY3JjbWQJcmVzZWxfZHNhCVsgIDYgKyBQUkVGRVRDSF9GTFVTSF9DTlRdOworCW5jcmNtZAlsb2FkcG9zMQlbICA0XTsKKwluY3JjbWQgIHJlc2VsX2x1bglbICA2XTsKKwluY3JjbWQJcmVzZWxfdGFnCVsgIDZdOworCW5jcmNtZAlqdW1wX3RvX25leHVzCVsgIDQgKyBQUkVGRVRDSF9GTFVTSF9DTlRdOworCW5jcmNtZAluZXh1c19pbmRpcmVjdAlbICA0XTsKKwluY3JjbWQJcmVzZWxfbm90YWcJWyAgNF07CisJbmNyY21kICBkYXRhX2luCQlbTUFYX1NDQVRURVJMICogNF07CisJbmNyY21kICBkYXRhX2luMglbICA0XTsKKwluY3JjbWQgIGRhdGFfb3V0CVtNQVhfU0NBVFRFUkwgKiA0XTsKKwluY3JjbWQgIGRhdGFfb3V0MglbICA0XTsKK307CisKKy8qCisqKglTY3JpcHQgZnJhZ21lbnRzIHdoaWNoIHN0YXkgaW4gbWFpbiBtZW1vcnkgZm9yIGFsbCBjaGlwcy4KKyovCitzdHJ1Y3Qgc2NyaXB0aCB7CisJbmNyY21kICB0cnlsb29wCQlbTUFYX1NUQVJUKjJdOworCW5jcmNtZCAgdHJ5bG9vcDIJWyAgMl07CisjaWZkZWYgU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVAorCW5jcmNtZCAgZG9uZV9xdWV1ZQlbTUFYX0RPTkUqNV07CisJbmNyY21kICBkb25lX3F1ZXVlMglbICAyXTsKKyNlbmRpZgorCW5jcmNtZAlzZWxlY3Rfbm9fYXRuCVsgIDhdOworCW5jcmNtZAljYW5jZWwJCVsgIDRdOworCW5jcmNtZAlza2lwCQlbICA5ICsgUFJFRkVUQ0hfRkxVU0hfQ05UXTsKKwluY3JjbWQJc2tpcDIJCVsgMTldOworCW5jcmNtZAlwYXJfZXJyX2RhdGFfaW4JWyAgNl07CisJbmNyY21kCXBhcl9lcnJfb3RoZXIJWyAgNF07CisJbmNyY21kCW1zZ19yZWplY3QJWyAgOF07CisJbmNyY21kCW1zZ19pZ25fcmVzaWR1ZQlbIDI0XTsKKwluY3JjbWQgIG1zZ19leHRlbmRlZAlbIDEwXTsKKwluY3JjbWQgIG1zZ19leHRfMglbIDEwXTsKKwluY3JjbWQJbXNnX3dkdHIJWyAxNF07CisJbmNyY21kCXNlbmRfd2R0cglbICA3XTsKKwluY3JjbWQgIG1zZ19leHRfMwlbIDEwXTsKKwluY3JjbWQJbXNnX3NkdHIJWyAxNF07CisJbmNyY21kCXNlbmRfc2R0cglbICA3XTsKKwluY3JjbWQJbmVnb19iYWRfcGhhc2UJWyAgNF07CisJbmNyY21kCW1zZ19vdXRfYWJvcnQJWyAxMF07CisJbmNyY21kICBoZGF0YV9pbglbTUFYX1NDQVRURVJIICogNF07CisJbmNyY21kICBoZGF0YV9pbjIJWyAgMl07CisJbmNyY21kICBoZGF0YV9vdXQJW01BWF9TQ0FUVEVSSCAqIDRdOworCW5jcmNtZCAgaGRhdGFfb3V0MglbICAyXTsKKwluY3JjbWQJcmVzZXQJCVsgIDRdOworCW5jcmNtZAlhYm9ydHRhZwlbICA0XTsKKwluY3JjbWQJYWJvcnQJCVsgIDJdOworCW5jcmNtZAlhYm9ydF9yZXNlbAlbIDIwXTsKKwluY3JjbWQJcmVzZW5kX2lkZW50CVsgIDRdOworCW5jcmNtZAljbHJhdG5fZ29fb24JWyAgM107CisJbmNyY21kCW54dGRzcF9nb19vbglbICAxXTsKKwluY3JjbWQJc2RhdGFfaW4JWyAgOF07CisJbmNyY21kICBkYXRhX2lvCQlbIDE4XTsKKwluY3JjbWQJYmFkX2lkZW50aWZ5CVsgMTJdOworCW5jcmNtZAliYWRfaV90X2wJWyAgNF07CisJbmNyY21kCWJhZF9pX3RfbF9xCVsgIDRdOworCW5jcmNtZAliYWRfdGFyZ2V0CVsgIDhdOworCW5jcmNtZAliYWRfc3RhdHVzCVsgIDhdOworCW5jcmNtZAlzdGFydF9yYW0JWyAgNCArIFBSRUZFVENIX0ZMVVNIX0NOVF07CisJbmNyY21kCXN0YXJ0X3JhbTAJWyAgNF07CisJbmNyY21kCXN0b19yZXN0YXJ0CVsgIDVdOworCW5jcmNtZAl3YWl0X2RtYQlbICAyXTsKKwluY3JjbWQJc25vb3B0ZXN0CVsgIDldOworCW5jcmNtZAlzbm9vcGVuZAlbICAyXTsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKiAgICAgIEZ1bmN0aW9uIGhlYWRlcnMuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljCXZvaWQJbmNyX2FsbG9jX2NjYgkoc3RydWN0IG5jYiAqbnAsIHVfY2hhciB0biwgdV9jaGFyIGxuKTsKK3N0YXRpYwl2b2lkCW5jcl9jb21wbGV0ZQkoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKTsKK3N0YXRpYwl2b2lkCW5jcl9leGNlcHRpb24JKHN0cnVjdCBuY2IgKm5wKTsKK3N0YXRpYwl2b2lkCW5jcl9mcmVlX2NjYgkoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKTsKK3N0YXRpYwl2b2lkCW5jcl9pbml0X2NjYgkoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKTsKK3N0YXRpYwl2b2lkCW5jcl9pbml0X3RjYgkoc3RydWN0IG5jYiAqbnAsIHVfY2hhciB0bik7CitzdGF0aWMJc3RydWN0IGxjYiAqCW5jcl9hbGxvY19sY2IJKHN0cnVjdCBuY2IgKm5wLCB1X2NoYXIgdG4sIHVfY2hhciBsbik7CitzdGF0aWMJc3RydWN0IGxjYiAqCW5jcl9zZXR1cF9sY2IJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworc3RhdGljCXZvaWQJbmNyX2dldGNsb2NrCShzdHJ1Y3QgbmNiICpucCwgaW50IG11bHQpOworc3RhdGljCXZvaWQJbmNyX3NlbGVjdGNsb2NrCShzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHNjbnRsMyk7CitzdGF0aWMJc3RydWN0IGNjYiAqbmNyX2dldF9jY2IJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworc3RhdGljCXZvaWQJbmNyX2NoaXBfcmVzZXQJKHN0cnVjdCBuY2IgKm5wLCBpbnQgZGVsYXkpOworc3RhdGljCXZvaWQJbmNyX2luaXQJKHN0cnVjdCBuY2IgKm5wLCBpbnQgcmVzZXQsIGNoYXIgKiBtc2csIHVfbG9uZyBjb2RlKTsKK3N0YXRpYwlpbnQJbmNyX2ludF9zYm1jCShzdHJ1Y3QgbmNiICpucCk7CitzdGF0aWMJaW50CW5jcl9pbnRfcGFyCShzdHJ1Y3QgbmNiICpucCk7CitzdGF0aWMJdm9pZAluY3JfaW50X21hCShzdHJ1Y3QgbmNiICpucCk7CitzdGF0aWMJdm9pZAluY3JfaW50X3Npcgkoc3RydWN0IG5jYiAqbnApOworc3RhdGljICB2b2lkICAgIG5jcl9pbnRfc3RvICAgICAoc3RydWN0IG5jYiAqbnApOworc3RhdGljCXZvaWQJbmNyX25lZ290aWF0ZQkoc3RydWN0IG5jYiogbnAsIHN0cnVjdCB0Y2IqIHRwKTsKK3N0YXRpYwlpbnQJbmNyX3ByZXBhcmVfbmVnbyhzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3AsIHVfY2hhciAqbXNncHRyKTsKKworc3RhdGljCXZvaWQJbmNyX3NjcmlwdF9jb3B5X2FuZF9iaW5kCisJCQkJKHN0cnVjdCBuY2IgKm5wLCBuY3JjbWQgKnNyYywgbmNyY21kICpkc3QsIGludCBsZW4pOworc3RhdGljICB2b2lkICAgIG5jcl9zY3JpcHRfZmlsbCAoc3RydWN0IHNjcmlwdCAqIHNjciwgc3RydWN0IHNjcmlwdGggKiBzY3JpcHRoKTsKK3N0YXRpYwlpbnQJbmNyX3NjYXR0ZXIJKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCwgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYwl2b2lkCW5jcl9nZXRzeW5jCShzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHNmYWMsIHVfY2hhciAqZmFrcCwgdV9jaGFyICpzY250bDNwKTsKK3N0YXRpYwl2b2lkCW5jcl9zZXRzeW5jCShzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3AsIHVfY2hhciBzY250bDMsIHVfY2hhciBzeGZlcik7CitzdGF0aWMJdm9pZAluY3Jfc2V0dXBfdGFncwkoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CitzdGF0aWMJdm9pZAluY3Jfc2V0d2lkZQkoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwLCB1X2NoYXIgd2lkZSwgdV9jaGFyIGFjayk7CitzdGF0aWMJaW50CW5jcl9zbm9vcHRlc3QJKHN0cnVjdCBuY2IgKm5wKTsKK3N0YXRpYwl2b2lkCW5jcl90aW1lb3V0CShzdHJ1Y3QgbmNiICpucCk7CitzdGF0aWMgIHZvaWQgICAgbmNyX3dha2V1cCAgICAgIChzdHJ1Y3QgbmNiICpucCwgdV9sb25nIGNvZGUpOworc3RhdGljICB2b2lkICAgIG5jcl93YWtldXBfZG9uZSAoc3RydWN0IG5jYiAqbnApOworc3RhdGljCXZvaWQJbmNyX3N0YXJ0X25leHRfY2NiIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGxjYiAqIGxwLCBpbnQgbWF4bik7CitzdGF0aWMJdm9pZAluY3JfcHV0X3N0YXJ0X3F1ZXVlKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCk7CisKK3N0YXRpYyB2b2lkIGluc2VydF9pbnRvX3dhaXRpbmdfbGlzdChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9jbW5kICpyZXRyaWV2ZV9mcm9tX3dhaXRpbmdfbGlzdChpbnQgdG9fcmVtb3ZlLCBzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfd2FpdGluZ19saXN0KHN0cnVjdCBuY2IgKm5wLCBpbnQgc3RzKTsKKworI2RlZmluZSByZW1vdmVfZnJvbV93YWl0aW5nX2xpc3QobnAsIGNtZCkgXAorCQlyZXRyaWV2ZV9mcm9tX3dhaXRpbmdfbGlzdCgxLCAobnApLCAoY21kKSkKKyNkZWZpbmUgcmVxdWV1ZV93YWl0aW5nX2xpc3QobnApIHByb2Nlc3Nfd2FpdGluZ19saXN0KChucCksIERJRF9PSykKKyNkZWZpbmUgcmVzZXRfd2FpdGluZ19saXN0KG5wKSBwcm9jZXNzX3dhaXRpbmdfbGlzdCgobnApLCBESURfUkVTRVQpCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqbmNyX25hbWUgKHN0cnVjdCBuY2IgKm5wKQoreworCXJldHVybiBucC0+aW5zdF9uYW1lOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKiAgICAgIFNjcmlwdHMgZm9yIE5DUi1Qcm9jZXNzb3IuCisqKgorKiogICAgICBVc2UgbmNyX3NjcmlwdF9iaW5kIGZvciBiaW5kaW5nIHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJTkFERFIgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGEgZmllbGQgb2YgdGhlIGNvbnRyb2xsZXIgZGF0YS4KKyoqCVBBRERSIGdlbmVyYXRlcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIHBhcnQgb2YgdGhlIHNjcmlwdC4KKyoqCVJBRERSIGdlbmVyYXRlcyBhIHJlZmVyZW5jZSB0byBhIHNjcmlwdCBwcm9jZXNzb3IgcmVnaXN0ZXIuCisqKglGQUREUiBnZW5lcmF0ZXMgYSByZWZlcmVuY2UgdG8gYSBzY3JpcHQgcHJvY2Vzc29yIHJlZ2lzdGVyCisqKgkJd2l0aCBvZmZzZXQuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lCVJFTE9DX1NPRlRDCTB4NDAwMDAwMDAKKyNkZWZpbmUJUkVMT0NfTEFCRUwJMHg1MDAwMDAwMAorI2RlZmluZQlSRUxPQ19SRUdJU1RFUgkweDYwMDAwMDAwCisjaWYgMAorI2RlZmluZQlSRUxPQ19LVkFSCTB4NzAwMDAwMDAKKyNlbmRpZgorI2RlZmluZQlSRUxPQ19MQUJFTEgJMHg4MDAwMDAwMAorI2RlZmluZQlSRUxPQ19NQVNLCTB4ZjAwMDAwMDAKKworI2RlZmluZQlOQUREUihsYWJlbCkJKFJFTE9DX1NPRlRDIHwgb2Zmc2V0b2Yoc3RydWN0IG5jYiwgbGFiZWwpKQorI2RlZmluZSBQQUREUihsYWJlbCkgICAgKFJFTE9DX0xBQkVMIHwgb2Zmc2V0b2Yoc3RydWN0IHNjcmlwdCwgbGFiZWwpKQorI2RlZmluZSBQQUREUkgobGFiZWwpICAgKFJFTE9DX0xBQkVMSCB8IG9mZnNldG9mKHN0cnVjdCBzY3JpcHRoLCBsYWJlbCkpCisjZGVmaW5lCVJBRERSKGxhYmVsKQkoUkVMT0NfUkVHSVNURVIgfCBSRUcobGFiZWwpKQorI2RlZmluZQlGQUREUihsYWJlbCxvZnMpKFJFTE9DX1JFR0lTVEVSIHwgKChSRUcobGFiZWwpKSsob2ZzKSkpCisjaWYgMAorI2RlZmluZQlLVkFSKHdoaWNoKQkoUkVMT0NfS1ZBUiB8ICh3aGljaCkpCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUJU0NSSVBUX0tWQVJfSklGRklFUwkoMCkKKyNkZWZpbmUJU0NSSVBUX0tWQVJfRklSU1QJCVNDUklQVF9LVkFSX0pJRkZJRVMKKyNkZWZpbmUJU0NSSVBUX0tWQVJfTEFTVAkJU0NSSVBUX0tWQVJfSklGRklFUworLyoKKyAqIEtlcm5lbCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBpbiB0aGUgc2NyaXB0cy4KKyAqIFRIRVNFIE1VU1QgQUxMIEJFIEFMSUdORUQgVE8gQSA0LUJZVEUgQk9VTkRBUlkuCisgKi8KK3N0YXRpYyB2b2lkICpzY3JpcHRfa3ZhcnNbXSBfX2luaXRkYXRhID0KKwl7ICh2b2lkICopJmppZmZpZXMgfTsKKyNlbmRpZgorCitzdGF0aWMJc3RydWN0IHNjcmlwdCBzY3JpcHQwIF9faW5pdGRhdGEgPSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFSVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyB7CisJLyoKKwkqKglUaGlzIE5PUCB3aWxsIGJlIHBhdGNoZWQgd2l0aCBMRUQgT04KKwkqKglTQ1JfUkVHX1JFRyAoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpCisJKi8KKwlTQ1JfTk9fT1AsCisJCTAsCisJLyoKKwkqKiAgICAgIENsZWFyIFNJR1AuCisJKi8KKwlTQ1JfRlJPTV9SRUcgKGN0ZXN0MiksCisJCTAsCisJLyoKKwkqKglUaGVuIGp1bXAgdG8gYSBjZXJ0YWluIHBvaW50IGluIHRyeWxvb3AuCisJKioJRHVlIHRvIHRoZSBsYWNrIG9mIGluZGlyZWN0IGFkZHJlc3NpbmcgdGhlIGNvZGUKKwkqKglpcyBzZWxmIG1vZGlmeWluZyBoZXJlLgorCSovCisJU0NSX0pVTVAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFSVFBPUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCVBBRERSSCh0cnlsb29wKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMRUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJRFNBCWNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIGEgc2NoZWR1bGVkCisJKioJCWRhdGEgc3RydWN0dXJlLgorCSoqCisJKioJU0NSQVRDSEEgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNjcmlwdCwKKwkqKgkJd2hpY2ggc3RhcnRzIHRoZSBuZXh0IGVudHJ5LgorCSoqCisJKioJU2V0IEluaXRpYXRvciBtb2RlLgorCSoqCisJKioJKFRhcmdldCBtb2RlIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIpCisJKi8KKworCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19TRUxFQ1RJTkcpLAorCQkwLAorCisJLyoKKwkqKiAgICAgIEFuZCB0cnkgdG8gc2VsZWN0IHRoaXMgdGFyZ2V0LgorCSovCisJU0NSX1NFTF9UQkxfQVROIF4gb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIHNlbGVjdCksCisJCVBBRERSIChyZXNlbGVjdCksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTEVDVDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglOb3cgdGhlcmUgYXJlIDQgcG9zc2liaWxpdGllczoKKwkqKgorCSoqCSgxKSBUaGUgbmNyIGxvc2VzIGFyYml0cmF0aW9uLgorCSoqCVRoaXMgaXMgb2ssIGJlY2F1c2UgaXQgd2lsbCB0cnkgYWdhaW4sCisJKioJd2hlbiB0aGUgYnVzIGJlY29tZXMgaWRsZS4KKwkqKgkoQnV0IGJld2FyZSBvZiB0aGUgdGltZW91dCBmdW5jdGlvbiEpCisJKioKKwkqKgkoMikgVGhlIG5jciBpcyByZXNlbGVjdGVkLgorCSoqCVRoZW4gdGhlIHNjcmlwdCBwcm9jZXNzb3IgdGFrZXMgdGhlIGp1bXAKKwkqKgl0byB0aGUgUkVTRUxFQ1QgbGFiZWwuCisJKioKKwkqKgkoMykgVGhlIG5jciB3aW5zIGFyYml0cmF0aW9uLgorCSoqCVRoZW4gaXQgd2lsbCBleGVjdXRlIFNDUklQVFMgaW5zdHJ1Y3Rpb24gdW50aWwgCisJKioJdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdGhhdCBjaGVja3MgU0NTSSBwaGFzZS4KKwkqKglUaGVuIHdpbGwgc3RvcCBhbmQgd2FpdCBmb3Igc2VsZWN0aW9uIHRvIGJlIAorCSoqCWNvbXBsZXRlIG9yIHNlbGVjdGlvbiB0aW1lLW91dCB0byBvY2N1ci4KKwkqKglBcyBhIHJlc3VsdCB0aGUgU0NSSVBUUyBpbnN0cnVjdGlvbnMgdW50aWwgCisJKioJTE9BRFBPUyArIDIgc2hvdWxkIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGggCisJKioJdGhlIFNDU0kgY29yZSBwZXJmb3JtaW5nIHNlbGVjdGlvbi4KKwkqLworCisJLyoKKwkqKglUaGUgTV9SRUpFQ1QgcHJvYmxlbSBzZWVtcyB0byBiZSBkdWUgdG8gYSBzZWxlY3Rpb24gCisJKioJdGltaW5nIHByb2JsZW0uCisJKioJV2FpdCBpbW1lZGlhdGVseSBmb3IgdGhlIHNlbGVjdGlvbiB0byBjb21wbGV0ZS4gCisJKioJKDIuNXggYmVoYXZlcyBzbykKKwkqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCTAsCisKKwkvKgorCSoqCU5leHQgdGltZSB1c2UgdGhlIG5leHQgc2xvdC4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHRlbXApLAorCQlQQUREUiAoc3RhcnRwb3MpLAorCS8qCisJKiogICAgICBUaGUgbmNyIGRvZXNuJ3QgaGF2ZSBhbiBpbmRpcmVjdCBsb2FkCisJKioJb3Igc3RvcmUgY29tbWFuZC4gU28gd2UgaGF2ZSB0bworCSoqCWNvcHkgcGFydCBvZiB0aGUgY29udHJvbCBibG9jayB0byBhCisJKioJZml4ZWQgcGxhY2UsIHdoZXJlIHdlIGNhbiBhY2Nlc3MgaXQuCisJKioKKwkqKglXZSBwYXRjaCB0aGUgYWRkcmVzcyBwYXJ0IG9mIGEKKwkqKglDT1BZIGNvbW1hbmQgd2l0aCB0aGUgRFNBLXJlZ2lzdGVyLgorCSovCisJU0NSX0NPUFlfRiAoNCksCisJCVJBRERSIChkc2EpLAorCQlQQUREUiAobG9hZHBvcyksCisJLyoKKwkqKglGbHVzaCBzY3JpcHQgcHJlZmV0Y2ggaWYgcmVxdWlyZWQKKwkqLworCVBSRUZFVENIX0ZMVVNICisJLyoKKwkqKgl0aGVuIHdlIGRvIHRoZSBhY3R1YWwgY29weS4KKwkqLworCVNDUl9DT1BZIChzaXplb2YgKHN0cnVjdCBoZWFkKSksCisJLyoKKwkqKgljb250aW51ZWQgYWZ0ZXIgdGhlIG5leHQgbGFiZWwgLi4uCisJKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IExPQURQT1MgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJTkFERFIgKGhlYWRlciksCisJLyoKKwkqKglXYWl0IGZvciB0aGUgbmV4dCBwaGFzZSBvciB0aGUgc2VsZWN0aW9uCisJKioJdG8gY29tcGxldGUgb3IgdGltZS1vdXQuCisJKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSIChwcmVwYXJlKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VORF9JREVOVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVNlbGVjdGlvbiBjb21wbGV0ZS4KKwkqKglTZW5kIHRoZSBJREVOVElGWSBhbmQgU0lNUExFX1RBRyBtZXNzYWdlcworCSoqCShhbmQgdGhlIE1fWF9TWU5DX1JFUSBtZXNzYWdlKQorCSovCisJU0NSX01PVkVfVEJMIF4gU0NSX01TR19PVVQsCisJCW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBzbXNnKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJIIChyZXNlbmRfaWRlbnQpLAorCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIDB4ODApLAorCQkwLAorCVNDUl9DT1BZICgxKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKGxhc3Rtc2cpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUFJFUEFSRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqICAgICAgbG9hZCB0aGUgc2F2ZXAgKHNhdmVkIHBvaW50ZXIpIGludG8KKwkqKiAgICAgIHRoZSBURU1QIHJlZ2lzdGVyIChhY3R1YWwgcG9pbnRlcikKKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci5zYXZlcCksCisJCVJBRERSICh0ZW1wKSwKKwkvKgorCSoqICAgICAgSW5pdGlhbGl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVycworCSovCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUiAoaGVhZGVyLnN0YXR1cyksCisJCVJBRERSIChzY3IwKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBSRVBBUkUyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglJbml0aWFsaXplIHRoZSBtc2dvdXQgYnVmZmVyIHdpdGggYSBOT09QIG1lc3NhZ2UuCisJKi8KKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBNX05PT1ApLAorCQkwLAorCVNDUl9DT1BZICgxKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKG1zZ291dCksCisjaWYgMAorCVNDUl9DT1BZICgxKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKG1zZ2luKSwKKyNlbmRpZgorCS8qCisJKioJQW50aWNpcGF0ZSB0aGUgQ09NTUFORCBwaGFzZS4KKwkqKglUaGlzIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgaW5pdGlhbCBzZWxlY3Rpb24uCisJKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9DT01NQU5EKSksCisJCVBBRERSIChkaXNwYXRjaCksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENPTU1BTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJLi4uIGFuZCBzZW5kIHRoZSBjb21tYW5kCisJKi8KKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfQ09NTUFORCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGNtZCksCisJLyoKKwkqKglJZiBzdGF0dXMgaXMgc3RpbGwgSFNfTkVHT1RJQVRFLCBuZWdvdGlhdGlvbiBmYWlsZWQuCisJKioJV2UgY2hlY2sgdGhpcyBoZXJlLCBzaW5jZSB3ZSB3YW50IHRvIGRvIHRoYXQgCisJKioJb25seSBvbmNlLgorCSovCisJU0NSX0ZST01fUkVHIChIU19SRUcpLAorCQkwLAorCVNDUl9JTlQgXiBJRlRSVUUgKERBVEEgKEhTX05FR09USUFURSkpLAorCQlTSVJfTkVHT19GQUlMRUQsCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBESVNQQVRDSCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCU1TR19JTiBpcyB0aGUgb25seSBwaGFzZSB0aGF0IHNoYWxsIGJlIAorCSoqCWVudGVyZWQgYXQgbGVhc3Qgb25jZSBmb3IgZWFjaCAocmUpc2VsZWN0aW9uLgorCSoqCVNvIHdlIHRlc3QgaXQgZmlyc3QuCisJKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUiAobXNnX2luKSwKKworCVNDUl9SRVRVUk4gXiBJRlRSVUUgKElGIChTQ1JfREFUQV9PVVQpKSwKKwkJMCwKKwkvKgorCSoqCURFTCAzOTcgLSA1M0M4NzUgUmV2IDMgLSBQYXJ0IE51bWJlciA2MDktMDM5MjQxMCAtIElURU0gNC4KKwkqKglQb3NzaWJsZSBkYXRhIGNvcnJ1cHRpb24gZHVyaW5nIE1lbW9yeSBXcml0ZSBhbmQgSW52YWxpZGF0ZS4KKwkqKglUaGlzIHdvcmstYXJvdW5kIHJlc2V0cyB0aGUgYWRkcmVzc2luZyBsb2dpYyBwcmlvciB0byB0aGUgCisJKioJc3RhcnQgb2YgdGhlIGZpcnN0IE1PVkUgb2YgYSBEQVRBIElOIHBoYXNlLgorCSoqCShTZWUgRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24pCisJKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChJRiAoU0NSX0RBVEFfSU4pKSwKKwkJMjAsCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUiAoc2NyYXRjaGEpLAorCQlSQUREUiAoc2NyYXRjaGEpLAorCVNDUl9SRVRVUk4sCisgCQkwLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX1NUQVRVUykpLAorCQlQQUREUiAoc3RhdHVzKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9DT01NQU5EKSksCisJCVBBRERSIChjb21tYW5kKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9NU0dfT1VUKSksCisJCVBBRERSIChtc2dfb3V0KSwKKwkvKgorCSoqICAgICAgRGlzY2FyZCBvbmUgaWxsZWdhbCBwaGFzZSBieXRlLCBpZiByZXF1aXJlZC4KKwkqLworCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIFhFX0JBRF9QSEFTRSksCisJCTAsCisJU0NSX0NPUFkgKDEpLAorCQlSQUREUiAoc2NyYXRjaGEpLAorCQlOQUREUiAoeGVycl9zdCksCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoSUYgKFNDUl9JTEdfT1VUKSksCisJCTgsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9JTEdfT1VULAorCQlOQUREUiAoc2NyYXRjaCksCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoSUYgKFNDUl9JTEdfSU4pKSwKKwkJOCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX0lMR19JTiwKKwkJTkFERFIgKHNjcmF0Y2gpLAorCVNDUl9KVU1QLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDTFJBQ0sgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglUZXJtaW5hdGUgcG9zc2libGUgcGVuZGluZyBtZXNzYWdlIHBoYXNlLgorCSovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSIChkaXNwYXRjaCksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5PX0RBVEEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGhlIHRhcmdldCB3YW50cyB0byB0cmFuZmVyIHRvbyBtdWNoIGRhdGEKKwkqKglvciBpbiB0aGUgd3JvbmcgZGlyZWN0aW9uLgorCSoqICAgICAgUmVtZW1iZXIgdGhhdCBpbiBleHRlbmRlZCBlcnJvci4KKwkqLworCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIFhFX0VYVFJBX0RBVEEpLAorCQkwLAorCVNDUl9DT1BZICgxKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKHhlcnJfc3QpLAorCS8qCisJKiogICAgICBEaXNjYXJkIG9uZSBkYXRhIGJ5dGUsIGlmIHJlcXVpcmVkLgorCSovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisJCTgsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9EQVRBX09VVCwKKwkJTkFERFIgKHNjcmF0Y2gpLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKElGIChTQ1JfREFUQV9JTikpLAorCQk4LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfREFUQV9JTiwKKwkJTkFERFIgKHNjcmF0Y2gpLAorCS8qCisJKiogICAgICAuLiBhbmQgcmVwZWF0IGFzIHJlcXVpcmVkLgorCSovCisJU0NSX0NBTEwsCisJCVBBRERSIChkaXNwYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSIChub19kYXRhKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBVFVTID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCWdldCB0aGUgc3RhdHVzCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX1NUQVRVUywKKwkJTkFERFIgKHNjcmF0Y2gpLAorCS8qCisJKioJc2F2ZSBzdGF0dXMgdG8gc2NzaV9zdGF0dXMuCisJKioJbWFyayBhcyBjb21wbGV0ZS4KKwkqLworCVNDUl9UT19SRUcgKFNTX1JFRyksCisJCTAsCisJU0NSX0xPQURfUkVHIChIU19SRUcsIEhTX0NPTVBMRVRFKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglHZXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UKKwkqKglhbmQgc2F2ZSBpdCB0byBTQ1JBVENIQS4KKwkqKgorCSoqCVRoZSBzY3JpcHQgcHJvY2Vzc29yIGRvZXNuJ3QgbmVnYXRlIHRoZQorCSoqCUFDSyBzaWduYWwgYWZ0ZXIgdGhpcyB0cmFuc2Zlci4KKwkqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW5bMF0pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lOMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglIYW5kbGUgdGhpcyBtZXNzYWdlLgorCSovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fQ09NUExFVEUpKSwKKwkJUEFERFIgKGNvbXBsZXRlKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9ESVNDT05ORUNUKSksCisJCVBBRERSIChkaXNjb25uZWN0KSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9TQVZFX0RQKSksCisJCVBBRERSIChzYXZlX2RwKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9SRVNUT1JFX0RQKSksCisJCVBBRERSIChyZXN0b3JlX2RwKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9FWFRFTkRFRCkpLAorCQlQQUREUkggKG1zZ19leHRlbmRlZCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fTk9PUCkpLAorCQlQQUREUiAoY2xyYWNrKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9SRUpFQ1QpKSwKKwkJUEFERFJIIChtc2dfcmVqZWN0KSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9JR05fUkVTSURVRSkpLAorCQlQQUREUkggKG1zZ19pZ25fcmVzaWR1ZSksCisJLyoKKwkqKglSZXN0IG9mIHRoZSBtZXNzYWdlcyBsZWZ0IGFzCisJKioJYW4gZXhlcmNpc2UgLi4uCisJKioKKwkqKglVbmltcGxlbWVudGVkIG1lc3NhZ2VzOgorCSoqCWZhbGwgdGhyb3VnaCB0byBNU0dfQkFELgorCSovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfQkFEID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKgl1bmltcGxlbWVudGVkIG1lc3NhZ2UgLSByZWplY3QgaXQuCisJKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVKRUNUX1NFTlQsCisJU0NSX0xPQURfUkVHIChzY3JhdGNoYSwgTV9SRUpFQ1QpLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VUTVNHID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DT1BZICgxKSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKG1zZ291dCksCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSIChjbHJhY2spLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0xFQU5VUCA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqICAgICAgZHNhOiAgICBQb2ludGVyIHRvIGNjYgorCSoqCSAgICAgIG9yIHh4eHh4eEZGIChubyBjY2IpCisJKioKKwkqKiAgICAgIEhTX1JFRzogICBIb3N0LVN0YXR1cyAoPD4wISkKKwkqLworCVNDUl9GUk9NX1JFRyAoZHNhKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoMHhmZikpLAorCQlQQUREUiAoc3RhcnQpLAorCS8qCisJKiogICAgICBkc2EgaXMgdmFsaWQuCisJKioJY29tcGxldGUgdGhlIGNsZWFudXAuCisJKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGNsZWFudXBfb2spLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01QTEVURSA+LS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglDb21wbGV0ZSBtZXNzYWdlLgorCSoqCisJKioJQ29weSBURU1QIHJlZ2lzdGVyIHRvIExBU1RQIGluIGhlYWRlci4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHRlbXApLAorCQlOQUREUiAoaGVhZGVyLmxhc3RwKSwKKwkvKgorCSoqCVdoZW4gd2UgdGVybWluYXRlIHRoZSBjeWNsZSBieSBjbGVhcmluZyBBQ0ssCisJKioJdGhlIHRhcmdldCBtYXkgZGlzY29ubmVjdCBpbW1lZGlhdGVseS4KKwkqKgorCSoqCVdlIGRvbid0IHdhbnQgdG8gYmUgdG9sZCBvZiBhbgorCSoqCSJ1bmV4cGVjdGVkIGRpc2Nvbm5lY3QiLAorCSoqCXNvIHdlIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorCSovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJLyoKKwkqKglUZXJtaW5hdGUgY3ljbGUgLi4uCisJKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCS8qCisJKioJLi4uIGFuZCB3YWl0IGZvciB0aGUgZGlzY29ubmVjdC4KKwkqLworCVNDUl9XQUlUX0RJU0MsCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDTEVBTlVQX09LID4tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJU2F2ZSBob3N0IHN0YXR1cyB0byBoZWFkZXIuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSIChzY3IwKSwKKwkJTkFERFIgKGhlYWRlci5zdGF0dXMpLAorCS8qCisJKioJYW5kIGNvcHkgYmFjayB0aGUgaGVhZGVyIHRvIHRoZSBjY2IuCisJKi8KKwlTQ1JfQ09QWV9GICg0KSwKKwkJUkFERFIgKGRzYSksCisJCVBBRERSIChjbGVhbnVwMCksCisJLyoKKwkqKglGbHVzaCBzY3JpcHQgcHJlZmV0Y2ggaWYgcmVxdWlyZWQKKwkqLworCVBSRUZFVENIX0ZMVVNICisJU0NSX0NPUFkgKHNpemVvZiAoc3RydWN0IGhlYWQpKSwKKwkJTkFERFIgKGhlYWRlciksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDTEVBTlVQMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTSUdOQUwgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglpZiBqb2Igbm90IGNvbXBsZXRlZCAuLi4KKwkqLworCVNDUl9GUk9NX1JFRyAoSFNfUkVHKSwKKwkJMCwKKwkvKgorCSoqCS4uLiBzdGFydCB0aGUgbmV4dCBjb21tYW5kLgorCSovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDAsIChIU19ET05FTUFTS3xIU19TS0lQTUFTSykpKSwKKwkJUEFERFIoc3RhcnQpLAorCS8qCisJKioJSWYgY29tbWFuZCByZXN1bHRlZCBpbiBub3QgR09PRCBzdGF0dXMsCisJKioJY2FsbCB0aGUgQyBjb2RlIGlmIG5lZWRlZC4KKwkqLworCVNDUl9GUk9NX1JFRyAoU1NfUkVHKSwKKwkJMCwKKwlTQ1JfQ0FMTCBeIElGRkFMU0UgKERBVEEgKFNfR09PRCkpLAorCQlQQUREUkggKGJhZF9zdGF0dXMpLAorCisjaWZuZGVmCVNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKworCS8qCisJKioJLi4uIHNpZ25hbCBjb21wbGV0aW9uIHRvIHRoZSBob3N0CisJKi8KKwlTQ1JfSU5ULAorCQlTSVJfSU5URkxZLAorCS8qCisJKioJQXVmIHp1IG5ldWVuIFNjaGFuZHRhdGVuIQorCSovCisJU0NSX0pVTVAsCisJCVBBRERSKHN0YXJ0KSwKKworI2Vsc2UJLyogZGVmaW5lZCBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUICovCisKKwkvKgorCSoqCS4uLiBzaWduYWwgY29tcGxldGlvbiB0byB0aGUgaG9zdAorCSovCisJU0NSX0pVTVAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfUE9TID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCVBBRERSSCAoZG9uZV9xdWV1ZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfUExVRyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0lOVCwKKwkJU0lSX0RPTkVfT1ZFUkZMT1csCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0lOVCwKKwkJU0lSX0lOVEZMWSwKKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSICh0ZW1wKSwKKwkJUEFERFIgKGRvbmVfcG9zKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKHN0YXJ0KSwKKworI2VuZGlmCS8qIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQgKi8KKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0FWRV9EUCA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJU0FWRV9EUCBtZXNzYWdlOgorCSoqCUNvcHkgVEVNUCByZWdpc3RlciB0byBTQVZFUCBpbiBoZWFkZXIuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSICh0ZW1wKSwKKwkJTkFERFIgKGhlYWRlci5zYXZlcCksCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNUT1JFX0RQID4tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglSRVNUT1JFX0RQIG1lc3NhZ2U6CisJKioJQ29weSBTQVZFUCBpbiBoZWFkZXIgdG8gVEVNUCByZWdpc3Rlci4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci5zYXZlcCksCisJCVJBRERSICh0ZW1wKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGNscmFjayksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERJU0NPTk5FQ1QgPi0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCURJU0NPTk5FQ1RpbmcgIC4uLgorCSoqCisJKioJZGlzYWJsZSB0aGUgInVuZXhwZWN0ZWQgZGlzY29ubmVjdCIgZmVhdHVyZSwKKwkqKglhbmQgcmVtb3ZlIHRoZSBBQ0sgc2lnbmFsLgorCSovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwkvKgorCSoqCVdhaXQgZm9yIHRoZSBkaXNjb25uZWN0LgorCSovCisJU0NSX1dBSVRfRElTQywKKwkJMCwKKwkvKgorCSoqCVN0YXR1cyBpczogRElTQ09OTkVDVEVELgorCSovCisJU0NSX0xPQURfUkVHIChIU19SRUcsIEhTX0RJU0NPTk5FQ1QpLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xlYW51cF9vayksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglUaGUgdGFyZ2V0IHJlcXVlc3RzIGEgbWVzc2FnZS4KKwkqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX09VVCwKKwkJTkFERFIgKG1zZ291dCksCisJU0NSX0NPUFkgKDEpLAorCQlOQUREUiAobXNnb3V0KSwKKwkJTkFERFIgKGxhc3Rtc2cpLAorCS8qCisJKioJSWYgaXQgd2FzIG5vIEFCT1JUIG1lc3NhZ2UgLi4uCisJKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9BQk9SVCkpLAorCQlQQUREUkggKG1zZ19vdXRfYWJvcnQpLAorCS8qCisJKioJLi4uIHdhaXQgZm9yIHRoZSBuZXh0IHBoYXNlCisJKioJaWYgaXQncyBhIG1lc3NhZ2Ugb3V0LCBzZW5kIGl0IGFnYWluLCAuLi4KKwkqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUiAobXNnX291dCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfT1VUX0RPTkUgPi0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJLi4uIGVsc2UgY2xlYXIgdGhlIG1lc3NhZ2UgLi4uCisJKi8KKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBNX05PT1ApLAorCQkwLAorCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJTkFERFIgKG1zZ291dCksCisJLyoKKwkqKgkuLi4gYW5kIHByb2Nlc3MgdGhlIG5leHQgcGhhc2UKKwkqLworCVNDUl9KVU1QLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSURMRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJTm90aGluZyB0byBkbz8KKwkqKglXYWl0IGZvciByZXNlbGVjdC4KKwkqKglUaGlzIE5PUCB3aWxsIGJlIHBhdGNoZWQgd2l0aCBMRUQgT0ZGCisJKioJU0NSX1JFR19SRUcgKGdwcmVnLCBTQ1JfT1IsIDB4MDEpCisJKi8KKwlTQ1JfTk9fT1AsCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTEVDVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKgltYWtlIHRoZSBEU0EgaW52YWxpZC4KKwkqLworCVNDUl9MT0FEX1JFRyAoZHNhLCAweGZmKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfVFJHKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUcgKEhTX1JFRywgSFNfSU5fUkVTRUxFQ1QpLAorCQkwLAorCS8qCisJKioJU2xlZXAgd2FpdGluZyBmb3IgYSByZXNlbGVjdGlvbi4KKwkqKglJZiBTSUdQIGlzIHNldCwgc3BlY2lhbCB0cmVhdG1lbnQuCisJKioKKwkqKgladSBhbGxlbSBiZXJlaXQgLi4KKwkqLworCVNDUl9XQUlUX1JFU0VMLAorCQlQQUREUihzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTEVDVEVEID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglUaGlzIE5PUCB3aWxsIGJlIHBhdGNoZWQgd2l0aCBMRUQgT04KKwkqKglTQ1JfUkVHX1JFRyAoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpCisJKi8KKwlTQ1JfTk9fT1AsCisJCTAsCisJLyoKKwkqKgkuLi4genUgbmljaHRzIHp1IGdlYnJhdWNoZW4gPworCSoqCisJKiogICAgICBsb2FkIHRoZSB0YXJnZXQgaWQgaW50byB0aGUgU0ZCUgorCSoqCWFuZCBqdW1wIHRvIHRoZSBjb250cm9sIGJsb2NrLgorCSoqCisJKioJTG9vayBhdCB0aGUgZGVjbGFyYXRpb25zIG9mCisJKioJLSBzdHJ1Y3QgbmNiCisJKioJLSBzdHJ1Y3QgdGNiCisJKioJLSBzdHJ1Y3QgbGNiCisJKioJLSBzdHJ1Y3QgY2NiCisJKioJdG8gdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uCisJKi8KKwlTQ1JfUkVHX1NGQlIgKHNzaWQsIFNDUl9BTkQsIDB4OEYpLAorCQkwLAorCVNDUl9UT19SRUcgKHNkaWQpLAorCQkwLAorCVNDUl9KVU1QLAorCQlOQUREUiAoanVtcF90Y2IpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9EU0EgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglBY2sgdGhlIElERU5USUZZIG9yIFRBRyBwcmV2aW91c2x5IHJlY2VpdmVkLgorCSovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkqKiAgICAgIFRoZSBuY3IgZG9lc24ndCBoYXZlIGFuIGluZGlyZWN0IGxvYWQKKwkqKglvciBzdG9yZSBjb21tYW5kLiBTbyB3ZSBoYXZlIHRvCisJKioJY29weSBwYXJ0IG9mIHRoZSBjb250cm9sIGJsb2NrIHRvIGEKKwkqKglmaXhlZCBwbGFjZSwgd2hlcmUgd2UgY2FuIGFjY2VzcyBpdC4KKwkqKgorCSoqCVdlIHBhdGNoIHRoZSBhZGRyZXNzIHBhcnQgb2YgYQorCSoqCUNPUFkgY29tbWFuZCB3aXRoIHRoZSBEU0EtcmVnaXN0ZXIuCisJKi8KKwlTQ1JfQ09QWV9GICg0KSwKKwkJUkFERFIgKGRzYSksCisJCVBBRERSIChsb2FkcG9zMSksCisJLyoKKwkqKglGbHVzaCBzY3JpcHQgcHJlZmV0Y2ggaWYgcmVxdWlyZWQKKwkqLworCVBSRUZFVENIX0ZMVVNICisJLyoKKwkqKgl0aGVuIHdlIGRvIHRoZSBhY3R1YWwgY29weS4KKwkqLworCVNDUl9DT1BZIChzaXplb2YgKHN0cnVjdCBoZWFkKSksCisJLyoKKwkqKgljb250aW51ZWQgYWZ0ZXIgdGhlIG5leHQgbGFiZWwgLi4uCisJKi8KKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTE9BRFBPUzEgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCU5BRERSIChoZWFkZXIpLAorCS8qCisJKioJVGhlIERTQSBjb250YWlucyB0aGUgZGF0YSBzdHJ1Y3R1cmUgYWRkcmVzcy4KKwkqLworCVNDUl9KVU1QLAorCQlQQUREUiAocHJlcGFyZSksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0xVTiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCWNvbWUgYmFjayB0byB0aGlzIHBvaW50CisJKioJdG8gZ2V0IGFuIElERU5USUZZIG1lc3NhZ2UKKwkqKglXYWl0IGZvciBhIG1zZ19pbiBwaGFzZS4KKwkqLworCVNDUl9JTlQgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVNJUl9SRVNFTF9OT19NU0dfSU4sCisJLyoKKwkqKgltZXNzYWdlIHBoYXNlLgorCSoqCVJlYWQgdGhlIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgQlVTIERBVEEgbGluZXMuCisJKioJVGhpcyBoZWxwcyB0byBzdXBwb3J0IHZlcnkgb2xkIFNDU0kgZGV2aWNlcyB0aGF0IAorCSoqCW1heSByZXNlbGVjdCB3aXRob3V0IHNlbmRpbmcgYW4gSURFTlRJRlkuCisJKi8KKwlTQ1JfRlJPTV9SRUcgKHNiZGwpLAorCQkwLAorCS8qCisJKioJSXQgc2hvdWxkIGJlIGFuIElkZW50aWZ5IG1lc3NhZ2UuCisJKi8KKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfVEFHID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJUmVhZCBJREVOVElGWSArIFNJTVBMRSArIFRBRyB1c2luZyBhIHNpbmdsZSBNT1ZFLgorCSoqCUFncmVzc2l2ZSBvcHRpbWl6YXRpb24sIGlzJ250IGl0PworCSoqCU5vIG5lZWQgdG8gdGVzdCB0aGUgU0lNUExFIFRBRyBtZXNzYWdlLCBzaW5jZSB0aGUgCisJKioJZHJpdmVyIG9ubHkgc3VwcG9ydHMgY29uZm9ybWFudCBkZXZpY2VzIGZvciB0YWdzLiA7LSkKKwkqLworCVNDUl9NT1ZFX0FCUyAoMykgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW4pLAorCS8qCisJKioJUmVhZCB0aGUgVEFHIGZyb20gdGhlIFNJREwuCisJKioJU3RpbGwgYW4gYWdncmVzc2l2ZSBvcHRpbWl6YXRpb24uIDstKQorCSoqCUNvbXB1dGUgdGhlIENDQiBpbmRpcmVjdCBqdW1wIGFkZHJlc3Mgd2hpY2ggCisJKioJaXMgKCNUQUcqMiAmIDB4ZmMpIGR1ZSB0byB0YWcgbnVtYmVyaW5nIHVzaW5nIAorCSoqCTEsMyw1Li5NQVhUQUdTKjIrMSBhY3R1YWwgdmFsdWVzLgorCSovCisJU0NSX1JFR19TRkJSIChzaWRsLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfU0ZCUl9SRUcgKHRlbXAsIFNDUl9BTkQsIDB4ZmMpLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSlVNUF9UT19ORVhVUyA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ09QWV9GICg0KSwKKwkJUkFERFIgKHRlbXApLAorCQlQQUREUiAobmV4dXNfaW5kaXJlY3QpLAorCS8qCisJKioJRmx1c2ggc2NyaXB0IHByZWZldGNoIGlmIHJlcXVpcmVkCisJKi8KKwlQUkVGRVRDSF9GTFVTSAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5FWFVTX0lORElSRUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUiAodGVtcCksCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX05PVEFHID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJTm8gdGFnIGV4cGVjdGVkLgorCSoqCVJlYWQgYW4gdGhyb3cgYXdheSB0aGUgSURFTlRJRlkuCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKGp1bXBfdG9fbmV4dXMpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisvKgorKioJQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorKioJI2RlZmluZSBNQVhfU0NBVFRFUkwgcGFyYW1ldGVyLAorKioJaXQgaXMgZmlsbGVkIGluIGF0IHJ1bnRpbWUuCisqKgorKiogICMjPT09PT09PT09PT08IGk9MDsgaTxNQVhfU0NBVFRFUkwgPj09PT09PT09PQorKiogIHx8CVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKyoqICB8fAkJUEFERFIgKGRpc3BhdGNoKSwKKyoqICB8fAlTQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9JTiwKKyoqICB8fAkJb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGRhdGFbIGldKSwKKyoqICAjIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworMAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JTjIgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NBTEwsCisJCVBBRERSIChkaXNwYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSIChub19kYXRhKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisqKglCZWNhdXNlIHRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisqKgkjZGVmaW5lIE1BWF9TQ0FUVEVSTCBwYXJhbWV0ZXIsCisqKglpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyoqCisqKiAgIyM9PT09PT09PT09PTwgaT0wOyBpPE1BWF9TQ0FUVEVSTCA+PT09PT09PT09CisqKiAgfHwJU0NSX0NBTEwgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9PVVQpKSwKKyoqICB8fAkJUEFERFIgKGRpc3BhdGNoKSwKKyoqICB8fAlTQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9PVVQsCisqKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhWyBpXSksCisqKiAgIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1VUMiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0FMTCwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKG5vX2RhdGEpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworfTsKKworc3RhdGljCXN0cnVjdCBzY3JpcHRoIHNjcmlwdGgwIF9faW5pdGRhdGEgPSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFRSWUxPT1AgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSoveworLyoKKyoqCVN0YXJ0IHRoZSBuZXh0IGVudHJ5LgorKioJQ2FsbGVkIGFkZHJlc3NlcyBwb2ludCB0byB0aGUgbGF1bmNoIHNjcmlwdCBpbiB0aGUgQ0NCLgorKioJVGhleSBhcmUgcGF0Y2hlZCBieSB0aGUgbWFpbiBwcm9jZXNzb3IuCisqKgorKioJQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorKioJI2RlZmluZSBNQVhfU1RBUlQgcGFyYW1ldGVyLCBpdCBpcyBmaWxsZWQKKyoqCWluIGF0IHJ1bnRpbWUuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICAjIz09PT09PT09PT09PCBJPTA7IGk8TUFYX1NUQVJUID49PT09PT09PT09PQorKiogIHx8CVNDUl9DQUxMLAorKiogIHx8CQlQQUREUiAoaWRsZSksCisqKiAgIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworMAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBUUllMT09QMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9KVU1QLAorCQlQQUREUkgodHJ5bG9vcCksCisKKyNpZmRlZiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRE9ORV9RVUVVRSA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisqKglDb3B5IHRoZSBDQ0IgYWRkcmVzcyB0byB0aGUgbmV4dCBkb25lIGVudHJ5LgorKioJQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorKioJI2RlZmluZSBNQVhfRE9ORSBwYXJhbWV0ZXIsIGl0IGlzIGZpbGxlZAorKioJaW4gYXQgcnVudGltZS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogICMjPT09PT09PT09PT08IEk9MDsgaTxNQVhfRE9ORSA+PT09PT09PT09PT0KKyoqICB8fAlTQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBjY2IgKiksCisqKiAgfHwJCU5BRERSIChoZWFkZXIuY3ApLAorKiogIHx8CQlOQUREUiAoY2NiX2RvbmVbaV0pLAorKiogIHx8CVNDUl9DQUxMLAorKiogIHx8CQlQQUREUiAoZG9uZV9lbmQpLAorKiogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRE9ORV9RVUVVRTIgPi0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfSlVNUCwKKwkJUEFERFJIIChkb25lX3F1ZXVlKSwKKworI2VuZGlmIC8qIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMRUNUX05PX0FUTiA+LS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglTZXQgSW5pdGlhdG9yIG1vZGUuCisJKiogICAgICBBbmQgdHJ5IHRvIHNlbGVjdCB0aGlzIHRhcmdldCB3aXRob3V0IEFUTi4KKwkqLworCisJU0NSX0NMUiAoU0NSX1RSRyksCisJCTAsCisJU0NSX0xPQURfUkVHIChIU19SRUcsIEhTX1NFTEVDVElORyksCisJCTAsCisJU0NSX1NFTF9UQkwgXiBvZmZzZXRvZiAoc3RydWN0IGRzYiwgc2VsZWN0KSwKKwkJUEFERFIgKHJlc2VsZWN0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKHNlbGVjdDIpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDQU5DRUwgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKworCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIEhTX0FCT1JURUQpLAorCQkwLAorCVNDUl9KVU1QUiwKKwkJOCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNLSVAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCAwKSwKKwkJMCwKKwkvKgorCSoqCVRoaXMgZW50cnkgaGFzIGJlZW4gY2FuY2VsZWQuCisJKioJTmV4dCB0aW1lIHVzZSB0aGUgbmV4dCBzbG90LgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUiAodGVtcCksCisJCVBBRERSIChzdGFydHBvcyksCisJLyoKKwkqKiAgICAgIFRoZSBuY3IgZG9lc24ndCBoYXZlIGFuIGluZGlyZWN0IGxvYWQKKwkqKglvciBzdG9yZSBjb21tYW5kLiBTbyB3ZSBoYXZlIHRvCisJKioJY29weSBwYXJ0IG9mIHRoZSBjb250cm9sIGJsb2NrIHRvIGEKKwkqKglmaXhlZCBwbGFjZSwgd2hlcmUgd2UgY2FuIGFjY2VzcyBpdC4KKwkqKgorCSoqCVdlIHBhdGNoIHRoZSBhZGRyZXNzIHBhcnQgb2YgYQorCSoqCUNPUFkgY29tbWFuZCB3aXRoIHRoZSBEU0EtcmVnaXN0ZXIuCisJKi8KKwlTQ1JfQ09QWV9GICg0KSwKKwkJUkFERFIgKGRzYSksCisJCVBBRERSSCAoc2tpcDIpLAorCS8qCisJKioJRmx1c2ggc2NyaXB0IHByZWZldGNoIGlmIHJlcXVpcmVkCisJKi8KKwlQUkVGRVRDSF9GTFVTSAorCS8qCisJKioJdGhlbiB3ZSBkbyB0aGUgYWN0dWFsIGNvcHkuCisJKi8KKwlTQ1JfQ09QWSAoc2l6ZW9mIChzdHJ1Y3QgaGVhZCkpLAorCS8qCisJKioJY29udGludWVkIGFmdGVyIHRoZSBuZXh0IGxhYmVsIC4uLgorCSovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTS0lQMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlOQUREUiAoaGVhZGVyKSwKKwkvKgorCSoqICAgICAgSW5pdGlhbGl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVycworCSovCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUiAoaGVhZGVyLnN0YXR1cyksCisJCVJBRERSIChzY3IwKSwKKwkvKgorCSoqCUZvcmNlIGhvc3Qgc3RhdHVzLgorCSovCisJU0NSX0ZST01fUkVHIChzY3JhdGNoYSksCisJCTAsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoTUFTSyAoMCwgSFNfRE9ORU1BU0spKSwKKwkJMTYsCisJU0NSX1JFR19SRUcgKEhTX1JFRywgU0NSX09SLCBIU19TS0lQTUFTSyksCisJCTAsCisJU0NSX0pVTVBSLAorCQk4LAorCVNDUl9UT19SRUcgKEhTX1JFRyksCisJCTAsCisJU0NSX0xPQURfUkVHIChTU19SRUcsIFNfR09PRCksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSIChjbGVhbnVwX29rKSwKKworfSwvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBBUl9FUlJfREFUQV9JTiA+LS0tLS0tLS0tLS0tLS0tKi97CisJLyoKKwkqKglJZ25vcmUgYWxsIGRhdGEgaW4gYnl0ZSwgdW50aWwgbmV4dCBwaGFzZQorCSovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQlQQUREUkggKHBhcl9lcnJfb3RoZXIpLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfREFUQV9JTiwKKwkJTkFERFIgKHNjcmF0Y2gpLAorCVNDUl9KVU1QUiwKKwkJLTI0LAorfSwvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBBUl9FUlJfT1RIRVIgPi0tLS0tLS0tLS0tLS0tLS0tLSoveworCS8qCisJKioJY291bnQgaXQuCisJKi8KKwlTQ1JfUkVHX1JFRyAoUFNfUkVHLCBTQ1JfQURELCAweDAxKSwKKwkJMCwKKwkvKgorCSoqCWp1bXAgdG8gZGlzcGF0Y2hlci4KKwkqLworCVNDUl9KVU1QLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1JFSkVDVCA+LS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJSWYgYSBuZWdvdGlhdGlvbiB3YXMgaW4gcHJvZ3Jlc3MsCisJKioJbmVnb3RpYXRpb24gZmFpbGVkLgorCSoqCU90aGVyd2lzZSwgbGV0IHRoZSBDIGNvZGUgcHJpbnQgCisJKioJc29tZSBtZXNzYWdlLgorCSovCisJU0NSX0ZST01fUkVHIChIU19SRUcpLAorCQkwLAorCVNDUl9JTlQgXiBJRkZBTFNFIChEQVRBIChIU19ORUdPVElBVEUpKSwKKwkJU0lSX1JFSkVDVF9SRUNFSVZFRCwKKwlTQ1JfSU5UIF4gSUZUUlVFIChEQVRBIChIU19ORUdPVElBVEUpKSwKKwkJU0lSX05FR09fRkFJTEVELAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xyYWNrKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lHTl9SRVNJRFVFID4tLS0tLS0tLS0tKi8seworCS8qCisJKioJVGVybWluYXRlIGN5Y2xlCisJKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKwkvKgorCSoqCWdldCByZXNpZHVlIHNpemUuCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luWzFdKSwKKwkvKgorCSoqCVNpemUgaXMgMCAuLiBpZ25vcmUgbWVzc2FnZS4KKwkqLworCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBICgwKSksCisJCVBBRERSIChjbHJhY2spLAorCS8qCisJKioJU2l6ZSBpcyBub3QgMSAuLiBoYXZlIHRvIGludGVycnVwdC4KKwkqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKERBVEEgKDEpKSwKKwkJNDAsCisJLyoKKwkqKglDaGVjayBmb3IgcmVzaWR1ZSBieXRlIGluIHN3aWRlIHJlZ2lzdGVyCisJKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoTUFTSyAoV1NSLCBXU1IpKSwKKwkJMTYsCisJLyoKKwkqKglUaGVyZSBJUyBkYXRhIGluIHRoZSBzd2lkZSByZWdpc3Rlci4KKwkqKglEaXNjYXJkIGl0LgorCSovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX09SLCBXU1IpLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xyYWNrKSwKKwkvKgorCSoqCUxvYWQgYWdhaW4gdGhlIHNpemUgdG8gdGhlIHNmYnIgcmVnaXN0ZXIuCisJKi8KKwlTQ1JfRlJPTV9SRUcgKHNjcmF0Y2hhKSwKKwkJMCwKKwlTQ1JfSU5ULAorCQlTSVJfSUdOX1JFU0lEVUUsCisJU0NSX0pVTVAsCisJCVBBRERSIChjbHJhY2spLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfRVhURU5ERUQgPi0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglUZXJtaW5hdGUgY3ljbGUKKwkqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCS8qCisJKioJZ2V0IGxlbmd0aC4KKwkqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW5bMV0pLAorCS8qCisJKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoMykpLAorCQlQQUREUkggKG1zZ19leHRfMyksCisJU0NSX0pVTVAgXiBJRkZBTFNFIChEQVRBICgyKSksCisJCVBBRERSIChtc2dfYmFkKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19FWFRfMiA+LS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFIgKGRpc3BhdGNoKSwKKwkvKgorCSoqCWdldCBleHRlbmRlZCBtZXNzYWdlIGNvZGUuCisJKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJTkFERFIgKG1zZ2luWzJdKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9YX1dJREVfUkVRKSksCisJCVBBRERSSCAobXNnX3dkdHIpLAorCS8qCisJKioJdW5rbm93biBleHRlbmRlZCBtZXNzYWdlCisJKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFIgKG1zZ19iYWQpCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfV0RUUiA+LS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSIChkaXNwYXRjaCksCisJLyoKKwkqKglnZXQgZGF0YSBidXMgd2lkdGgKKwkqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW5bM10pLAorCS8qCisJKioJbGV0IHRoZSBob3N0IGRvIHRoZSByZWFsIHdvcmsuCisJKi8KKwlTQ1JfSU5ULAorCQlTSVJfTkVHT19XSURFLAorCS8qCisJKioJbGV0IHRoZSB0YXJnZXQgZmV0Y2ggb3VyIGFuc3dlci4KKwkqLworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJIIChuZWdvX2JhZF9waGFzZSksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfV0RUUiA+LS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVNlbmQgdGhlIE1fWF9XSURFX1JFUQorCSovCisJU0NSX01PVkVfQUJTICg0KSBeIFNDUl9NU0dfT1VULAorCQlOQUREUiAobXNnb3V0KSwKKwlTQ1JfQ09QWSAoMSksCisJCU5BRERSIChtc2dvdXQpLAorCQlOQUREUiAobGFzdG1zZyksCisJU0NSX0pVTVAsCisJCVBBRERSIChtc2dfb3V0X2RvbmUpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfRVhUXzMgPi0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSIChkaXNwYXRjaCksCisJLyoKKwkqKglnZXQgZXh0ZW5kZWQgbWVzc2FnZSBjb2RlLgorCSovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCU5BRERSIChtc2dpblsyXSksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fWF9TWU5DX1JFUSkpLAorCQlQQUREUkggKG1zZ19zZHRyKSwKKwkvKgorCSoqCXVua25vd24gZXh0ZW5kZWQgbWVzc2FnZQorCSovCisJU0NSX0pVTVAsCisJCVBBRERSIChtc2dfYmFkKQorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfU0RUUiA+LS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSIChkaXNwYXRjaCksCisJLyoKKwkqKglnZXQgcGVyaW9kIGFuZCBvZmZzZXQKKwkqLworCVNDUl9NT1ZFX0FCUyAoMikgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW5bM10pLAorCS8qCisJKioJbGV0IHRoZSBob3N0IGRvIHRoZSByZWFsIHdvcmsuCisJKi8KKwlTQ1JfSU5ULAorCQlTSVJfTkVHT19TWU5DLAorCS8qCisJKioJbGV0IHRoZSB0YXJnZXQgZmV0Y2ggb3VyIGFuc3dlci4KKwkqLworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJIIChuZWdvX2JhZF9waGFzZSksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfU0RUUiA+LS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVNlbmQgdGhlIE1fWF9TWU5DX1JFUQorCSovCisJU0NSX01PVkVfQUJTICg1KSBeIFNDUl9NU0dfT1VULAorCQlOQUREUiAobXNnb3V0KSwKKwlTQ1JfQ09QWSAoMSksCisJCU5BRERSIChtc2dvdXQpLAorCQlOQUREUiAobGFzdG1zZyksCisJU0NSX0pVTVAsCisJCVBBRERSIChtc2dfb3V0X2RvbmUpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBORUdPX0JBRF9QSEFTRSA+LS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQsCisJCVNJUl9ORUdPX1BST1RPLAorCVNDUl9KVU1QLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfT1VUX0FCT1JUID4tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJQWZ0ZXIgQUJPUlQgbWVzc2FnZSwKKwkqKgorCSoqCWV4cGVjdCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdCwgLi4uCisJKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfQU5ELCAweDdmKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJLyoKKwkqKgkuLi4gYW5kIHNldCB0aGUgc3RhdHVzIHRvICJBQk9SVEVEIgorCSovCisJU0NSX0xPQURfUkVHIChIU19SRUcsIEhTX0FCT1JURUQpLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUiAoY2xlYW51cCksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEhEQVRBX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworLyoKKyoqCUJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyoqCSNkZWZpbmUgTUFYX1NDQVRURVJIIHBhcmFtZXRlciwKKyoqCWl0IGlzIGZpbGxlZCBpbiBhdCBydW50aW1lLgorKioKKyoqICAjIz09PCBpPU1BWF9TQ0FUVEVSTDsgaTxNQVhfU0NBVFRFUkwrTUFYX1NDQVRURVJIID49PQorKiogIHx8CVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKyoqICB8fAkJUEFERFIgKGRpc3BhdGNoKSwKKyoqICB8fAlTQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9JTiwKKyoqICB8fAkJb2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGRhdGFbIGldKSwKKyoqICAjIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworMAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSERBVEFfSU4yID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0pVTVAsCisJCVBBRERSIChkYXRhX2luKSwKKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSERBVEFfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworLyoKKyoqCUJlY2F1c2UgdGhlIHNpemUgZGVwZW5kcyBvbiB0aGUKKyoqCSNkZWZpbmUgTUFYX1NDQVRURVJIIHBhcmFtZXRlciwKKyoqCWl0IGlzIGZpbGxlZCBpbiBhdCBydW50aW1lLgorKioKKyoqICAjIz09PCBpPU1BWF9TQ0FUVEVSTDsgaTxNQVhfU0NBVFRFUkwrTUFYX1NDQVRURVJIID49PQorKiogIHx8CVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisqKiAgfHwJCVBBRERSIChkaXNwYXRjaCksCisqKiAgfHwJU0NSX01PVkVfVEJMIF4gU0NSX0RBVEFfT1VULAorKiogIHx8CQlvZmZzZXRvZiAoc3RydWN0IGRzYiwgZGF0YVsgaV0pLAorKiogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCiswCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBIREFUQV9PVVQyID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0pVTVAsCisJCVBBRERSIChkYXRhX291dCksCisKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKiogICAgICBTZW5kIGEgTV9SRVNFVCBtZXNzYWdlIGlmIGJhZCBJREVOVElGWSAKKwkqKglyZWNlaXZlZCBvbiByZXNlbGVjdGlvbi4KKwkqLworCVNDUl9MT0FEX1JFRyAoc2NyYXRjaGEsIE1fQUJPUlRfVEFHKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJIIChhYm9ydF9yZXNlbCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBBQk9SVFRBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqICAgICAgQWJvcnQgYSB3cm9uZyB0YWcgcmVjZWl2ZWQgb24gcmVzZWxlY3Rpb24uCisJKi8KKwlTQ1JfTE9BRF9SRUcgKHNjcmF0Y2hhLCBNX0FCT1JUX1RBRyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSSCAoYWJvcnRfcmVzZWwpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQUJPUlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKiAgICAgIEFib3J0IGEgcmVzZWxlY3Rpb24gd2hlbiBubyBhY3RpdmUgQ0NCLgorCSovCisJU0NSX0xPQURfUkVHIChzY3JhdGNoYSwgTV9BQk9SVCksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBBQk9SVF9SRVNFTCA+LS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ09QWSAoMSksCisJCVJBRERSIChzY3JhdGNoYSksCisJCU5BRERSIChtc2dvdXQpLAorCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCS8qCisJKioJYW5kIHNlbmQgaXQuCisJKioJd2UgZXhwZWN0IGFuIGltbWVkaWF0ZSBkaXNjb25uZWN0CisJKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfQU5ELCAweDdmKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19PVVQsCisJCU5BRERSIChtc2dvdXQpLAorCVNDUl9DT1BZICgxKSwKKwkJTkFERFIgKG1zZ291dCksCisJCU5BRERSIChsYXN0bXNnKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTkRfSURFTlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglUaGUgdGFyZ2V0IHN0YXlzIGluIE1TRyBPVVQgcGhhc2UgYWZ0ZXIgaGF2aW5nIGFja2VkIAorCSoqCUlkZW50aWZ5IFsrIFRhZyBbKyBFeHRlbmRlZCBtZXNzYWdlIF1dLiBUYXJnZXRzIHNoYWxsCisJKioJYmVoYXZlIHRoaXMgd2F5IG9uIHBhcml0eSBlcnJvci4KKwkqKglXZSBtdXN0IHNlbmQgaXQgYWdhaW4gYWxsIHRoZSBtZXNzYWdlcy4KKwkqLworCVNDUl9TRVQgKFNDUl9BVE4pLCAvKiBTaGFsbCBiZSBhc3NlcnRlZCAyIGRlc2tldyBkZWxheXMgYmVmb3JlIHRoZSAgKi8KKwkJMCwgICAgICAgICAvKiAxcnN0IEFDSyA9IDkwIG5zLiBIb3BlIHRoZSBOQ1IgaXMnbnQgdG9vIGZhc3QgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFIgKHNlbmRfaWRlbnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0xSQVROX0dPX09OID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DTFIgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9KVU1QLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTlhURFNQX0dPX09OID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0RBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NBTEwgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCVNDUl9NT1ZFX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IGRzYiwgc2Vuc2UpLAorCVNDUl9DQUxMLAorCQlQQUREUiAoZGlzcGF0Y2gpLAorCVNDUl9KVU1QLAorCQlQQUREUiAobm9fZGF0YSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lPID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVdlIGp1bXAgaGVyZSBpZiB0aGUgZGF0YSBkaXJlY3Rpb24gd2FzIHVua25vd24gYXQgdGhlIAorCSoqCXRpbWUgd2UgaGFkIHRvIHF1ZXVlIHRoZSBjb21tYW5kIHRvIHRoZSBzY3JpcHRzIHByb2Nlc3Nvci4KKwkqKglQb2ludGVycyBoYWQgYmVlbiBzZXQgYXMgZm9sbG93IGluIHRoaXMgc2l0dWF0aW9uOgorCSoqCSAgc2F2ZXAgICAtLT4gICBEQVRBX0lPCisJKioJICBsYXN0cCAgIC0tPiAgIHN0YXJ0IHBvaW50ZXIgd2hlbiBEQVRBX0lOCisJKioJICBnb2FscCAgIC0tPiAgIGdvYWwgIHBvaW50ZXIgd2hlbiBEQVRBX0lOCisJKioJICB3bGFzdHAgIC0tPiAgIHN0YXJ0IHBvaW50ZXIgd2hlbiBEQVRBX09VVAorCSoqCSAgd2dvYWxwICAtLT4gICBnb2FsICBwb2ludGVyIHdoZW4gREFUQV9PVVQKKwkqKglUaGlzIHNjcmlwdCBzZXRzIHNhdmVwL2xhc3RwL2dvYWxwIGFjY29yZGluZyB0byB0aGUgCisJKioJZGlyZWN0aW9uIGNob3NlbiBieSB0aGUgdGFyZ2V0LgorCSovCisJU0NSX0pVTVBSIF4gSUZUUlVFIChXSEVOIChTQ1JfREFUQV9PVVQpKSwKKwkJMzIsCisJLyoKKwkqKglEaXJlY3Rpb24gaXMgREFUQSBJTi4KKwkqKglXYXJuaW5nOiB3ZSBqdW1wIGhlcmUsIGV2ZW4gd2hlbiBwaGFzZSBpcyBEQVRBIE9VVC4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJTkFERFIgKGhlYWRlci5sYXN0cCksCisJCU5BRERSIChoZWFkZXIuc2F2ZXApLAorCisJLyoKKwkqKglKdW1wIHRvIHRoZSBTQ1JJUFRTIGFjY29yZGluZyB0byBhY3R1YWwgZGlyZWN0aW9uLgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUiAoaGVhZGVyLnNhdmVwKSwKKwkJUkFERFIgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCisJLyoKKwkqKglEaXJlY3Rpb24gaXMgREFUQSBPVVQuCisJKi8KKwlTQ1JfQ09QWSAoNCksCisJCU5BRERSIChoZWFkZXIud2xhc3RwKSwKKwkJTkFERFIgKGhlYWRlci5sYXN0cCksCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUiAoaGVhZGVyLndnb2FscCksCisJCU5BRERSIChoZWFkZXIuZ29hbHApLAorCVNDUl9KVU1QUiwKKwkJLTY0LAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX0lERU5USUZZID4tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglJZiBtZXNzYWdlIHBoYXNlIGJ1dCBub3QgYW4gSURFTlRJRlksCisJKioJZ2V0IHNvbWUgaGVscCBmcm9tIHRoZSBDIGNvZGUuCisJKioJT2xkIFNDU0kgZGV2aWNlIG1heSBiZWhhdmUgc28uCisJKi8KKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKE1BU0sgKDB4ODAsIDB4ODApKSwKKwkJMTYsCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX05PX0lERU5USUZZLAorCVNDUl9KVU1QLAorCQlQQUREUkggKHJlc2V0KSwKKwkvKgorCSoqCU1lc3NhZ2UgaXMgYW4gSURFTlRJRlksIGJ1dCBsdW4gaXMgdW5rbm93bi4KKwkqKglSZWFkIHRoZSBtZXNzYWdlLCBzaW5jZSB3ZSBnb3QgaXQgZGlyZWN0bHkgCisJKioJZnJvbSB0aGUgU0NTSSBCVVMgZGF0YSBsaW5lcy4KKwkqKglTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSoqCVNlbmQgYSBNX0FCT1JUIHRvIGNsZWFyIGFsbCBwZW5kaW5nIHRhc2tzLgorCSovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9MVU4sCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCU5BRERSIChtc2dpbiksCisJU0NSX0pVTVAsCisJCVBBRERSSCAoYWJvcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX0lfVF9MID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglXZSBkb25ub3QgaGF2ZSBhIHRhc2sgZm9yIHRoYXQgSV9UX0wuCisJKioJU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkqKglTZW5kIGEgTV9BQk9SVCBtZXNzYWdlLgorCSovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9JX1RfTCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJIIChhYm9ydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBCQURfSV9UX0xfUSA+LS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVdlIGRvbm5vdCBoYXZlIGEgdGFzayB0aGF0IG1hdGNoZXMgdGhlIHRhZy4KKwkqKglTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSoqCVNlbmQgYSBNX0FCT1JUVEFHIG1lc3NhZ2UuCisJKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQkFEX0lfVF9MX1EsCisJU0NSX0pVTVAsCisJCVBBRERSSCAoYWJvcnR0YWcpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX1RBUkdFVCA+LS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglXZSBkb25ub3Qga25vdyB0aGUgdGFyZ2V0IHRoYXQgcmVzZWxlY3RlZCB1cy4KKwkqKglHcmFiIHRoZSBmaXJzdCBtZXNzYWdlIGlmIGFueSAoSURFTlRJRlkpLgorCSoqCVNpZ25hbCBwcm9ibGVtIHRvIEMgY29kZSBmb3IgbG9nZ2luZyB0aGUgZXZlbnQuCisJKioJTV9SRVNFVCBtZXNzYWdlLgorCSovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9UQVJHRVQsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQk4LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlOQUREUiAobXNnaW4pLAorCVNDUl9KVU1QLAorCQlQQUREUkggKHJlc2V0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9TVEFUVVMgPi0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioJSWYgY29tbWFuZCByZXN1bHRlZCBpbiBlaXRoZXIgUVVFVUUgRlVMTCwKKwkqKglDSEVDSyBDT05ESVRJT04gb3IgQ09NTUFORCBURVJNSU5BVEVELAorCSoqCWNhbGwgdGhlIEMgY29kZS4KKwkqLworCVNDUl9JTlQgXiBJRlRSVUUgKERBVEEgKFNfUVVFVUVfRlVMTCkpLAorCQlTSVJfQkFEX1NUQVRVUywKKwlTQ1JfSU5UIF4gSUZUUlVFIChEQVRBIChTX0NIRUNLX0NPTkQpKSwKKwkJU0lSX0JBRF9TVEFUVVMsCisJU0NSX0lOVCBeIElGVFJVRSAoREFUQSAoU19URVJNSU5BVEVEKSksCisJCVNJUl9CQURfU1RBVFVTLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFSVF9SQU0gPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglMb2FkIHRoZSBzY3JpcHQgaW50byBvbi1jaGlwIFJBTSwgCisJKioJYW5kIGp1bXAgdG8gc3RhcnQgcG9pbnQuCisJKi8KKwlTQ1JfQ09QWV9GICg0KSwKKwkJUkFERFIgKHNjcmF0Y2hhKSwKKwkJUEFERFJIIChzdGFydF9yYW0wKSwKKwkvKgorCSoqCUZsdXNoIHNjcmlwdCBwcmVmZXRjaCBpZiByZXF1aXJlZAorCSovCisJUFJFRkVUQ0hfRkxVU0gKKwlTQ1JfQ09QWSAoc2l6ZW9mIChzdHJ1Y3Qgc2NyaXB0KSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFSVF9SQU0wID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUEFERFIgKHN0YXJ0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFIgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUT19SRVNUQVJUID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJKioKKwkqKglSZXBhaXIgc3RhcnQgcXVldWUgKGUuZy4gbmV4dCB0aW1lIHVzZSB0aGUgbmV4dCBzbG90KSAKKwkqKglhbmQganVtcCB0byBzdGFydCBwb2ludC4KKwkqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFIgKHRlbXApLAorCQlQQUREUiAoc3RhcnRwb3MpLAorCVNDUl9KVU1QLAorCQlQQUREUiAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgV0FJVF9ETUEgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkqKglGb3IgSFAgWmFsb24vNTNjNzIwIHN5c3RlbXMsIHRoZSBaYWxvbiBpbnRlcmZhY2UKKwkqKgliZXR3ZWVuIENQVSBhbmQgNTNjNzIwIGRvZXMgcHJlZmV0Y2hlcywgd2hpY2ggY2F1c2VzCisJKioJcHJvYmxlbXMgd2l0aCBzZWxmIG1vZGlmeWluZyBzY3JpcHRzLiAgVGhlIHByb2JsZW0KKwkqKglpcyBvdmVyY29tZSBieSBjYWxsaW5nIGEgZHVtbXkgc3Vicm91dGluZSBhZnRlciBlYWNoCisJKioJbW9kaWZpY2F0aW9uLCB0byBmb3JjZSBhIHJlZmV0Y2ggb2YgdGhlIHNjcmlwdCBvbgorCSoqCXJldHVybiBmcm9tIHRoZSBzdWJyb3V0aW5lLgorCSovCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNOT09QVEVTVCA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCVJlYWQgdGhlIHZhcmlhYmxlLgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUihuY3JfY2FjaGUpLAorCQlSQUREUiAoc2NyYXRjaGEpLAorCS8qCisJKioJV3JpdGUgdGhlIHZhcmlhYmxlLgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUiAodGVtcCksCisJCU5BRERSKG5jcl9jYWNoZSksCisJLyoKKwkqKglSZWFkIGJhY2sgdGhlIHZhcmlhYmxlLgorCSovCisJU0NSX0NPUFkgKDQpLAorCQlOQUREUihuY3JfY2FjaGUpLAorCQlSQUREUiAodGVtcCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTTk9PUEVORCA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSoqCUFuZCBzdG9wLgorCSovCisJU0NSX0lOVCwKKwkJOTksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJRmlsbCBpbiAjZGVmaW5lIGRlcGVuZGVudCBwYXJ0cyBvZiB0aGUgc2NyaXB0CisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordm9pZCBfX2luaXQgbmNyX3NjcmlwdF9maWxsIChzdHJ1Y3Qgc2NyaXB0ICogc2NyLCBzdHJ1Y3Qgc2NyaXB0aCAqIHNjcmgpCit7CisJaW50CWk7CisJbmNyY21kCSpwOworCisJcCA9IHNjcmgtPnRyeWxvb3A7CisJZm9yIChpPTA7IGk8TUFYX1NUQVJUOyBpKyspIHsKKwkJKnArKyA9U0NSX0NBTEw7CisJCSpwKysgPVBBRERSIChpZGxlKTsKKwl9CisKKwlCVUdfT04oKHVfbG9uZylwICE9ICh1X2xvbmcpJnNjcmgtPnRyeWxvb3AgKyBzaXplb2YgKHNjcmgtPnRyeWxvb3ApKTsKKworI2lmZGVmIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKworCXAgPSBzY3JoLT5kb25lX3F1ZXVlOworCWZvciAoaSA9IDA7IGk8TUFYX0RPTkU7IGkrKykgeworCQkqcCsrID1TQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBjY2IgKikpOworCQkqcCsrID1OQUREUiAoaGVhZGVyLmNwKTsKKwkJKnArKyA9TkFERFIgKGNjYl9kb25lW2ldKTsKKwkJKnArKyA9U0NSX0NBTEw7CisJCSpwKysgPVBBRERSIChkb25lX2VuZCk7CisJfQorCisJQlVHX09OKCh1X2xvbmcpcCAhPSAodV9sb25nKSZzY3JoLT5kb25lX3F1ZXVlK3NpemVvZihzY3JoLT5kb25lX3F1ZXVlKSk7CisKKyNlbmRpZiAvKiBTQ1NJX05DUl9DQ0JfRE9ORV9TVVBQT1JUICovCisKKwlwID0gc2NyaC0+aGRhdGFfaW47CisJZm9yIChpPTA7IGk8TUFYX1NDQVRURVJIOyBpKyspIHsKKwkJKnArKyA9U0NSX0NBTEwgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpOworCQkqcCsrID1QQUREUiAoZGlzcGF0Y2gpOworCQkqcCsrID1TQ1JfTU9WRV9UQkwgXiBTQ1JfREFUQV9JTjsKKwkJKnArKyA9b2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGRhdGFbaV0pOworCX0KKworCUJVR19PTigodV9sb25nKXAgIT0gKHVfbG9uZykmc2NyaC0+aGRhdGFfaW4gKyBzaXplb2YgKHNjcmgtPmhkYXRhX2luKSk7CisKKwlwID0gc2NyLT5kYXRhX2luOworCWZvciAoaT1NQVhfU0NBVFRFUkg7IGk8TUFYX1NDQVRURVJIK01BWF9TQ0FUVEVSTDsgaSsrKSB7CisJCSpwKysgPVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKTsKKwkJKnArKyA9UEFERFIgKGRpc3BhdGNoKTsKKwkJKnArKyA9U0NSX01PVkVfVEJMIF4gU0NSX0RBVEFfSU47CisJCSpwKysgPW9mZnNldG9mIChzdHJ1Y3QgZHNiLCBkYXRhW2ldKTsKKwl9CisKKwlCVUdfT04oKHVfbG9uZylwICE9ICh1X2xvbmcpJnNjci0+ZGF0YV9pbiArIHNpemVvZiAoc2NyLT5kYXRhX2luKSk7CisKKwlwID0gc2NyaC0+aGRhdGFfb3V0OworCWZvciAoaT0wOyBpPE1BWF9TQ0FUVEVSSDsgaSsrKSB7CisJCSpwKysgPVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSk7CisJCSpwKysgPVBBRERSIChkaXNwYXRjaCk7CisJCSpwKysgPVNDUl9NT1ZFX1RCTCBeIFNDUl9EQVRBX09VVDsKKwkJKnArKyA9b2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGRhdGFbaV0pOworCX0KKworCUJVR19PTigodV9sb25nKXAgIT0gKHVfbG9uZykmc2NyaC0+aGRhdGFfb3V0ICsgc2l6ZW9mIChzY3JoLT5oZGF0YV9vdXQpKTsKKworCXAgPSBzY3ItPmRhdGFfb3V0OworCWZvciAoaT1NQVhfU0NBVFRFUkg7IGk8TUFYX1NDQVRURVJIK01BWF9TQ0FUVEVSTDsgaSsrKSB7CisJCSpwKysgPVNDUl9DQUxMIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSk7CisJCSpwKysgPVBBRERSIChkaXNwYXRjaCk7CisJCSpwKysgPVNDUl9NT1ZFX1RCTCBeIFNDUl9EQVRBX09VVDsKKwkJKnArKyA9b2Zmc2V0b2YgKHN0cnVjdCBkc2IsIGRhdGFbaV0pOworCX0KKworCUJVR19PTigodV9sb25nKSBwICE9ICh1X2xvbmcpJnNjci0+ZGF0YV9vdXQgKyBzaXplb2YgKHNjci0+ZGF0YV9vdXQpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCUNvcHkgYW5kIHJlYmluZCBhIHNjcmlwdC4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBfX2luaXQgCituY3Jfc2NyaXB0X2NvcHlfYW5kX2JpbmQgKHN0cnVjdCBuY2IgKm5wLCBuY3JjbWQgKnNyYywgbmNyY21kICpkc3QsIGludCBsZW4pCit7CisJbmNyY21kICBvcGNvZGUsIG5ldywgb2xkLCB0bXAxLCB0bXAyOworCW5jcmNtZAkqc3RhcnQsICplbmQ7CisJaW50IHJlbG9jczsKKwlpbnQgb3BjaGFuZ2VkID0gMDsKKworCXN0YXJ0ID0gc3JjOworCWVuZCA9IHNyYyArIGxlbi80OworCisJd2hpbGUgKHNyYyA8IGVuZCkgeworCisJCW9wY29kZSA9ICpzcmMrKzsKKwkJKmRzdCsrID0gY3B1X3RvX3NjcihvcGNvZGUpOworCisJCS8qCisJCSoqCUlmIHdlIGZvcmdldCB0byBjaGFuZ2UgdGhlIGxlbmd0aAorCQkqKglpbiBzdHJ1Y3Qgc2NyaXB0LCBhIGZpZWxkIHdpbGwgYmUKKwkJKioJcGFkZGVkIHdpdGggMC4gVGhpcyBpcyBhbiBpbGxlZ2FsCisJCSoqCWNvbW1hbmQuCisJCSovCisKKwkJaWYgKG9wY29kZSA9PSAwKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICIlczogRVJST1IwIElOIFNDUklQVCBhdCAlZC5cbiIsCisJCQkJbmNyX25hbWUobnApLCAoaW50KSAoc3JjLXN0YXJ0LTEpKTsKKwkJCW1kZWxheSgxMDAwKTsKKwkJfQorCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1NDUklQVCkKKwkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXA6ICA8JXg+XG4iLAorCQkJCShzcmMtMSksICh1bnNpZ25lZClvcGNvZGUpOworCisJCS8qCisJCSoqCVdlIGRvbid0IGhhdmUgdG8gZGVjb2RlIEFMTCBjb21tYW5kcworCQkqLworCQlzd2l0Y2ggKG9wY29kZSA+PiAyOCkgeworCisJCWNhc2UgMHhjOgorCQkJLyoKKwkJCSoqCUNPUFkgaGFzIFRXTyBhcmd1bWVudHMuCisJCQkqLworCQkJcmVsb2NzID0gMjsKKwkJCXRtcDEgPSBzcmNbMF07CisjaWZkZWYJUkVMT0NfS1ZBUgorCQkJaWYgKCh0bXAxICYgUkVMT0NfTUFTSykgPT0gUkVMT0NfS1ZBUikKKwkJCQl0bXAxID0gMDsKKyNlbmRpZgorCQkJdG1wMiA9IHNyY1sxXTsKKyNpZmRlZglSRUxPQ19LVkFSCisJCQlpZiAoKHRtcDIgJiBSRUxPQ19NQVNLKSA9PSBSRUxPQ19LVkFSKQorCQkJCXRtcDIgPSAwOworI2VuZGlmCisJCQlpZiAoKHRtcDEgXiB0bXAyKSAmIDMpIHsKKwkJCQlwcmludGsgKEtFUk5fRVJSIiVzOiBFUlJPUjEgSU4gU0NSSVBUIGF0ICVkLlxuIiwKKwkJCQkJbmNyX25hbWUobnApLCAoaW50KSAoc3JjLXN0YXJ0LTEpKTsKKwkJCQltZGVsYXkoMTAwMCk7CisJCQl9CisJCQkvKgorCQkJKioJSWYgUFJFRkVUQ0ggZmVhdHVyZSBub3QgZW5hYmxlZCwgcmVtb3ZlIAorCQkJKioJdGhlIE5PIEZMVVNIIGJpdCBpZiBwcmVzZW50LgorCQkJKi8KKwkJCWlmICgob3Bjb2RlICYgU0NSX05PX0ZMVVNIKSAmJiAhKG5wLT5mZWF0dXJlcyAmIEZFX1BGRU4pKSB7CisJCQkJZHN0Wy0xXSA9IGNwdV90b19zY3Iob3Bjb2RlICYgflNDUl9OT19GTFVTSCk7CisJCQkJKytvcGNoYW5nZWQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4MDoKKwkJCS8qCisJCQkqKglNT1ZFIChhYnNvbHV0ZSBhZGRyZXNzKQorCQkJKi8KKwkJCXJlbG9jcyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIDB4ODoKKwkJCS8qCisJCQkqKglKVU1QIC8gQ0FMTAorCQkJKioJZG9uJ3QgcmVsb2NhdGUgaWYgcmVsYXRpdmUgOi0pCisJCQkqLworCQkJaWYgKG9wY29kZSAmIDB4MDA4MDAwMDApCisJCQkJcmVsb2NzID0gMDsKKwkJCWVsc2UKKwkJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDQ6CisJCWNhc2UgMHg1OgorCQljYXNlIDB4NjoKKwkJY2FzZSAweDc6CisJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJlbG9jcyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZWxvY3MpIHsKKwkJCXdoaWxlIChyZWxvY3MtLSkgeworCQkJCW9sZCA9ICpzcmMrKzsKKworCQkJCXN3aXRjaCAob2xkICYgUkVMT0NfTUFTSykgeworCQkJCWNhc2UgUkVMT0NfUkVHSVNURVI6CisJCQkJCW5ldyA9IChvbGQgJiB+UkVMT0NfTUFTSykgKyBucC0+cGFkZHI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVMT0NfTEFCRUw6CisJCQkJCW5ldyA9IChvbGQgJiB+UkVMT0NfTUFTSykgKyBucC0+cF9zY3JpcHQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVMT0NfTEFCRUxIOgorCQkJCQluZXcgPSAob2xkICYgflJFTE9DX01BU0spICsgbnAtPnBfc2NyaXB0aDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRUxPQ19TT0ZUQzoKKwkJCQkJbmV3ID0gKG9sZCAmIH5SRUxPQ19NQVNLKSArIG5wLT5wX25jYjsKKwkJCQkJYnJlYWs7CisjaWZkZWYJUkVMT0NfS1ZBUgorCQkJCWNhc2UgUkVMT0NfS1ZBUjoKKwkJCQkJaWYgKCgob2xkICYgflJFTE9DX01BU0spIDwKKwkJCQkJICAgICBTQ1JJUFRfS1ZBUl9GSVJTVCkgfHwKKwkJCQkJICAgICgob2xkICYgflJFTE9DX01BU0spID4KKwkJCQkJICAgICBTQ1JJUFRfS1ZBUl9MQVNUKSkKKwkJCQkJCXBhbmljKCJuY3IgS1ZBUiBvdXQgb2YgcmFuZ2UiKTsKKwkJCQkJbmV3ID0gdnRvcGh5cyhzY3JpcHRfa3ZhcnNbb2xkICYKKwkJCQkJICAgIH5SRUxPQ19NQVNLXSk7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSAwOgorCQkJCQkvKiBEb24ndCByZWxvY2F0ZSBhIDAgYWRkcmVzcy4gKi8KKwkJCQkJaWYgKG9sZCA9PSAwKSB7CisJCQkJCQluZXcgPSBvbGQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCQlkZWZhdWx0OgorCQkJCQlwYW5pYygibmNyX3NjcmlwdF9jb3B5X2FuZF9iaW5kOiB3ZWlyZCByZWxvY2F0aW9uICV4XG4iLCBvbGQpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkqZHN0KysgPSBjcHVfdG9fc2NyKG5ldyk7CisJCQl9CisJCX0gZWxzZQorCQkJKmRzdCsrID0gY3B1X3RvX3Njcigqc3JjKyspOworCisJfQorfQorCisvKgorKioJTGludXggaG9zdCBkYXRhIHN0cnVjdHVyZQorKi8KKworc3RydWN0IGhvc3RfZGF0YSB7CisgICAgIHN0cnVjdCBuY2IgKm5jYjsKK307CisKKyNkZWZpbmUgUFJJTlRfQUREUihjbWQsIGFyZy4uLikgZGV2X2luZm8oJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiAsICMjIGFyZykKKworc3RhdGljIHZvaWQgbmNyX3ByaW50X21zZyhzdHJ1Y3QgY2NiICpjcCwgY2hhciAqbGFiZWwsIHVfY2hhciAqbXNnKQoreworCWludCBpOworCVBSSU5UX0FERFIoY3AtPmNtZCwgIiVzOiAiLCBsYWJlbCk7CisKKwlwcmludGsgKCIleCIsKm1zZyk7CisJaWYgKCptc2cgPT0gTV9FWFRFTkRFRCkgeworCQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoaSAtIDEgPiBtc2dbMV0pCisJCQkJYnJlYWs7CisJCQlwcmludGsgKCItJXgiLG1zZ1tpXSk7CisJCX0KKwl9IGVsc2UgaWYgKCgqbXNnICYgMHhmMCkgPT0gMHgyMCkgeworCQlwcmludGsgKCItJXgiLG1zZ1sxXSk7CisJfQorCisJcHJpbnRrKCIuXG4iKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJTkNSIGNoaXAgY2xvY2sgZGl2aXNvciB0YWJsZS4KKyoqCURpdmlzb3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDEwLDAwMCwwMDAgaW4gb3JkZXIgdG8gbWFrZSAKKyoqCWNhbGN1bGF0aW9ucyBtb3JlIHNpbXBsZS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNkZWZpbmUgXzVNIDUwMDAwMDAKK3N0YXRpYyB1X2xvbmcgZGl2XzEwTVtdID0KKwl7MipfNU0sIDMqXzVNLCA0Kl81TSwgNipfNU0sIDgqXzVNLCAxMipfNU0sIDE2Kl81TX07CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglQcmVwYXJlIGlvIHJlZ2lzdGVyIHZhbHVlcyB1c2VkIGJ5IG5jcl9pbml0KCkgYWNjb3JkaW5nIAorKioJdG8gc2VsZWN0ZWQgYW5kIHN1cHBvcnRlZCBmZWF0dXJlcy4KKyoqCisqKglOQ1IgY2hpcHMgYWxsb3cgYnVyc3QgbGVuZ3RocyBvZiAyLCA0LCA4LCAxNiwgMzIsIDY0LCAxMjggCisqKgl0cmFuc2ZlcnMuIDMyLDY0LDEyOCBhcmUgb25seSBzdXBwb3J0ZWQgYnkgODc1IGFuZCA4OTUgY2hpcHMuCisqKglXZSB1c2UgbG9nIGJhc2UgMiAoYnVyc3QgbGVuZ3RoKSBhcyBpbnRlcm5hbCBjb2RlLCB3aXRoIAorKioJdmFsdWUgMCBtZWFuaW5nICJidXJzdCBkaXNhYmxlZCIuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qCisgKglCdXJzdCBsZW5ndGggZnJvbSBidXJzdCBjb2RlLgorICovCisjZGVmaW5lIGJ1cnN0X2xlbmd0aChiYykgKCEoYmMpKT8gMCA6IDEgPDwgKGJjKQorCisvKgorICoJQnVyc3QgY29kZSBmcm9tIGlvIHJlZ2lzdGVyIGJpdHMuICBCdXJzdCBlbmFibGUgaXMgY3Rlc3QwIGZvciBjNzIwCisgKi8KKyNkZWZpbmUgYnVyc3RfY29kZShkbW9kZSwgY3Rlc3QwKSBcCisJKGN0ZXN0MCkgJiAweDgwID8gMCA6ICgoKGRtb2RlKSAmIDB4YzApID4+IDYpICsgMQorCisvKgorICoJU2V0IGluaXRpYWwgaW8gcmVnaXN0ZXIgYml0cyBmcm9tIGJ1cnN0IGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuY3JfaW5pdF9idXJzdChzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIGJjKQoreworCXVfY2hhciAqYmUgPSAmbnAtPnJ2X2N0ZXN0MDsKKwkqYmUJCSY9IH4weDgwOworCW5wLT5ydl9kbW9kZQkmPSB+KDB4MyA8PCA2KTsKKwlucC0+cnZfY3Rlc3Q1CSY9IH4weDQ7CisKKwlpZiAoIWJjKSB7CisJCSpiZQkJfD0gMHg4MDsKKwl9IGVsc2UgeworCQktLWJjOworCQlucC0+cnZfZG1vZGUJfD0gKChiYyAmIDB4MykgPDwgNik7CisJCW5wLT5ydl9jdGVzdDUJfD0gKGJjICYgMHg0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBuY3JfcHJlcGFyZV9zZXR0aW5nKHN0cnVjdCBuY2IgKm5wKQoreworCXVfY2hhcglidXJzdF9tYXg7CisJdV9sb25nCXBlcmlvZDsKKwlpbnQgaTsKKworCS8qCisJKioJU2F2ZSBhc3N1bWVkIEJJT1Mgc2V0dGluZworCSovCisKKwlucC0+c3Zfc2NudGwwCT0gSU5CKG5jX3NjbnRsMCkgJiAweDBhOworCW5wLT5zdl9zY250bDMJPSBJTkIobmNfc2NudGwzKSAmIDB4MDc7CisJbnAtPnN2X2Rtb2RlCT0gSU5CKG5jX2Rtb2RlKSAgJiAweGNlOworCW5wLT5zdl9kY250bAk9IElOQihuY19kY250bCkgICYgMHhhODsKKwlucC0+c3ZfY3Rlc3QwCT0gSU5CKG5jX2N0ZXN0MCkgJiAweDg0OworCW5wLT5zdl9jdGVzdDMJPSBJTkIobmNfY3Rlc3QzKSAmIDB4MDE7CisJbnAtPnN2X2N0ZXN0NAk9IElOQihuY19jdGVzdDQpICYgMHg4MDsKKwlucC0+c3ZfY3Rlc3Q1CT0gSU5CKG5jX2N0ZXN0NSkgJiAweDI0OworCW5wLT5zdl9ncGNudGwJPSBJTkIobmNfZ3BjbnRsKTsKKwlucC0+c3Zfc3Rlc3QyCT0gSU5CKG5jX3N0ZXN0MikgJiAweDIwOworCW5wLT5zdl9zdGVzdDQJPSBJTkIobmNfc3Rlc3Q0KTsKKworCS8qCisJKioJV2lkZSA/CisJKi8KKworCW5wLT5tYXh3aWRlCT0gKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpPyAxIDogMDsKKworIAkvKgorCSAqICBHdWVzcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjaGlwJ3MgY2xvY2suCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX1VMVFJBKQorCQlucC0+Y2xvY2tfa2h6ID0gODAwMDA7CisJZWxzZQorCQlucC0+Y2xvY2tfa2h6ID0gNDAwMDA7CisKKwkvKgorCSAqICBHZXQgdGhlIGNsb2NrIG11bHRpcGxpZXIgZmFjdG9yLgorIAkgKi8KKwlpZgkobnAtPmZlYXR1cmVzICYgRkVfUVVBRCkKKwkJbnAtPm11bHRpcGxpZXIJPSA0OworCWVsc2UgaWYJKG5wLT5mZWF0dXJlcyAmIEZFX0RCTFIpCisJCW5wLT5tdWx0aXBsaWVyCT0gMjsKKwllbHNlCisJCW5wLT5tdWx0aXBsaWVyCT0gMTsKKworCS8qCisJICogIE1lYXN1cmUgU0NTSSBjbG9jayBmcmVxdWVuY3kgZm9yIGNoaXBzIAorCSAqICBpdCBtYXkgdmFyeSBmcm9tIGFzc3VtZWQgb25lLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9WQVJDTEspCisJCW5jcl9nZXRjbG9jayhucCwgbnAtPm11bHRpcGxpZXIpOworCisJLyoKKwkgKiBEaXZpc29yIHRvIGJlIHVzZWQgZm9yIGFzeW5jICh0aW1lciBwcmUtc2NhbGVyKS4KKwkgKi8KKwlpID0gbnAtPmNsb2NrX2Rpdm4gLSAxOworCXdoaWxlICgtLWkgPj0gMCkgeworCQlpZiAoMTB1bCAqIFNDU0lfTkNSX01JTl9BU1lOQyAqIG5wLT5jbG9ja19raHogPiBkaXZfMTBNW2ldKSB7CisJCQkrK2k7CisJCQlicmVhazsKKwkJfQorCX0KKwlucC0+cnZfc2NudGwzID0gaSsxOworCisJLyoKKwkgKiBNaW5pbXVtIHN5bmNocm9ub3VzIHBlcmlvZCBmYWN0b3Igc3VwcG9ydGVkIGJ5IHRoZSBjaGlwLgorCSAqIEJ0dywgJ3BlcmlvZCcgaXMgaW4gdGVudGhzIG9mIG5hbm9zZWNvbmRzLgorCSAqLworCisJcGVyaW9kID0gKDQgKiBkaXZfMTBNWzBdICsgbnAtPmNsb2NrX2toeiAtIDEpIC8gbnAtPmNsb2NrX2toejsKKwlpZgkocGVyaW9kIDw9IDI1MCkJCW5wLT5taW5zeW5jID0gMTA7CisJZWxzZSBpZgkocGVyaW9kIDw9IDMwMykJCW5wLT5taW5zeW5jID0gMTE7CisJZWxzZSBpZgkocGVyaW9kIDw9IDUwMCkJCW5wLT5taW5zeW5jID0gMTI7CisJZWxzZQkJCQlucC0+bWluc3luYyA9IChwZXJpb2QgKyA0MCAtIDEpIC8gNDA7CisKKwkvKgorCSAqIENoZWNrIGFnYWluc3QgY2hpcCBTQ1NJIHN0YW5kYXJkIHN1cHBvcnQgKFNDU0ktMixVTFRSQSxVTFRSQTIpLgorCSAqLworCisJaWYJKG5wLT5taW5zeW5jIDwgMjUgJiYgIShucC0+ZmVhdHVyZXMgJiBGRV9VTFRSQSkpCisJCW5wLT5taW5zeW5jID0gMjU7CisKKwkvKgorCSAqIE1heGltdW0gc3luY2hyb25vdXMgcGVyaW9kIGZhY3RvciBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAuCisJICovCisKKwlwZXJpb2QgPSAoMTEgKiBkaXZfMTBNW25wLT5jbG9ja19kaXZuIC0gMV0pIC8gKDQgKiBucC0+Y2xvY2tfa2h6KTsKKwlucC0+bWF4c3luYyA9IHBlcmlvZCA+IDI1NDAgPyAyNTQgOiBwZXJpb2QgLyAxMDsKKworCS8qCisJKioJUHJlcGFyZSBpbml0aWFsIHZhbHVlIG9mIG90aGVyIElPIHJlZ2lzdGVycworCSovCisjaWYgZGVmaW5lZCBTQ1NJX05DUl9UUlVTVF9CSU9TX1NFVFRJTkcKKwlucC0+cnZfc2NudGwwCT0gbnAtPnN2X3NjbnRsMDsKKwlucC0+cnZfZG1vZGUJPSBucC0+c3ZfZG1vZGU7CisJbnAtPnJ2X2RjbnRsCT0gbnAtPnN2X2RjbnRsOworCW5wLT5ydl9jdGVzdDAJPSBucC0+c3ZfY3Rlc3QwOworCW5wLT5ydl9jdGVzdDMJPSBucC0+c3ZfY3Rlc3QzOworCW5wLT5ydl9jdGVzdDQJPSBucC0+c3ZfY3Rlc3Q0OworCW5wLT5ydl9jdGVzdDUJPSBucC0+c3ZfY3Rlc3Q1OworCWJ1cnN0X21heAk9IGJ1cnN0X2NvZGUobnAtPnN2X2Rtb2RlLCBucC0+c3ZfY3Rlc3QwKTsKKyNlbHNlCisKKwkvKgorCSoqCVNlbGVjdCBidXJzdCBsZW5ndGggKGR3b3JkcykKKwkqLworCWJ1cnN0X21heAk9IGRyaXZlcl9zZXR1cC5idXJzdF9tYXg7CisJaWYgKGJ1cnN0X21heCA9PSAyNTUpCisJCWJ1cnN0X21heCA9IGJ1cnN0X2NvZGUobnAtPnN2X2Rtb2RlLCBucC0+c3ZfY3Rlc3QwKTsKKwlpZiAoYnVyc3RfbWF4ID4gNykKKwkJYnVyc3RfbWF4ID0gNzsKKwlpZiAoYnVyc3RfbWF4ID4gbnAtPm1heGJ1cnN0KQorCQlidXJzdF9tYXggPSBucC0+bWF4YnVyc3Q7CisKKwkvKgorCSoqCVNlbGVjdCBhbGwgc3VwcG9ydGVkIHNwZWNpYWwgZmVhdHVyZXMKKwkqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9FUkwpCisJCW5wLT5ydl9kbW9kZQl8PSBFUkw7CQkvKiBFbmFibGUgUmVhZCBMaW5lICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0JPRikKKwkJbnAtPnJ2X2Rtb2RlCXw9IEJPRjsJCS8qIEJ1cnN0IE9wY29kZSBGZXRjaCAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9FUk1QKQorCQlucC0+cnZfZG1vZGUJfD0gRVJNUDsJLyogRW5hYmxlIFJlYWQgTXVsdGlwbGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfUEZFTikKKwkJbnAtPnJ2X2RjbnRsCXw9IFBGRU47CS8qIFByZWZldGNoIEVuYWJsZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DTFNFKQorCQlucC0+cnZfZGNudGwJfD0gQ0xTRTsJLyogQ2FjaGUgTGluZSBTaXplIEVuYWJsZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9XUklFKQorCQlucC0+cnZfY3Rlc3QzCXw9IFdSSUU7CS8qIFdyaXRlIGFuZCBJbnZhbGlkYXRlICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0RGUykKKwkJbnAtPnJ2X2N0ZXN0NQl8PSBERlM7CQkvKiBEbWEgRmlmbyBTaXplICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX01VWCkKKwkJbnAtPnJ2X2N0ZXN0NAl8PSBNVVg7CQkvKiBIb3N0IGJ1cyBtdWx0aXBsZXggbW9kZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9FQSkKKwkJbnAtPnJ2X2RjbnRsCXw9IEVBOwkJLyogRW5hYmxlIEFDSyAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9FSFApCisJCW5wLT5ydl9jdGVzdDAJfD0gRUhQOwkJLyogRXZlbiBob3N0IHBhcml0eSAqLworCisJLyoKKwkqKglTZWxlY3Qgc29tZSBvdGhlcgorCSovCisJaWYgKGRyaXZlcl9zZXR1cC5tYXN0ZXJfcGFyaXR5KQorCQlucC0+cnZfY3Rlc3Q0CXw9IE1QRUU7CS8qIE1hc3RlciBwYXJpdHkgY2hlY2tpbmcgKi8KKwlpZiAoZHJpdmVyX3NldHVwLnNjc2lfcGFyaXR5KQorCQlucC0+cnZfc2NudGwwCXw9IDB4MGE7CS8qICBmdWxsIGFyYi4sIGVuYSBwYXJpdHksIHBhci0+QVROICAqLworCisJLyoKKwkqKiAgR2V0IFNDU0kgYWRkciBvZiBob3N0IGFkYXB0ZXIgKHNldCBieSBiaW9zPykuCisJKi8KKwlpZiAobnAtPm15YWRkciA9PSAyNTUpIHsKKwkJbnAtPm15YWRkciA9IElOQihuY19zY2lkKSAmIDB4MDc7CisJCWlmICghbnAtPm15YWRkcikKKwkJCW5wLT5teWFkZHIgPSBTQ1NJX05DUl9NWUFERFI7CisJfQorCisjZW5kaWYgLyogU0NTSV9OQ1JfVFJVU1RfQklPU19TRVRUSU5HICovCisKKwkvKgorCSAqCVByZXBhcmUgaW5pdGlhbCBpbyByZWdpc3RlciBiaXRzIGZvciBidXJzdCBsZW5ndGgKKwkgKi8KKwluY3JfaW5pdF9idXJzdChucCwgYnVyc3RfbWF4KTsKKworCS8qCisJKioJU2V0IFNDU0kgQlVTIG1vZGUuCisJKioKKwkqKgktIFVMVFJBMiBjaGlwcyAoODk1Lzg5NUEvODk2KSByZXBvcnQgdGhlIGN1cnJlbnQgCisJKioJICBCVVMgbW9kZSB0aHJvdWdoIHRoZSBTVEVTVDQgSU8gcmVnaXN0ZXIuCisJKioJLSBGb3IgcHJldmlvdXMgZ2VuZXJhdGlvbiBjaGlwcyAoODI1LzgyNUEvODc1KSwgCisJKioJICB1c2VyIGhhcyB0byB0ZWxsIHVzIGhvdyB0byBjaGVjayBhZ2FpbnN0IEhWRCwgCisJKioJICBzaW5jZSBhIDEwMCUgc2FmZSBhbGdvcml0aG0gaXMgbm90IHBvc3NpYmxlLgorCSovCisJbnAtPnNjc2lfbW9kZSA9IFNNT0RFX1NFOworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9ESUZGKSB7CisJCXN3aXRjaChkcml2ZXJfc2V0dXAuZGlmZl9zdXBwb3J0KSB7CisJCWNhc2UgNDoJLyogVHJ1c3QgcHJldmlvdXMgc2V0dGluZ3MgaWYgcHJlc2VudCwgdGhlbiBHUElPMyAqLworCQkJaWYgKG5wLT5zdl9zY250bDMpIHsKKwkJCQlpZiAobnAtPnN2X3N0ZXN0MiAmIDB4MjApCisJCQkJCW5wLT5zY3NpX21vZGUgPSBTTU9ERV9IVkQ7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgMzoJLyogU1lNQklPUyBjb250cm9sbGVycyByZXBvcnQgSFZEIHRocm91Z2ggR1BJTzMgKi8KKwkJCWlmIChJTkIobmNfZ3ByZWcpICYgMHgwOCkKKwkJCQlicmVhazsKKwkJY2FzZSAyOgkvKiBTZXQgSFZEIHVuY29uZGl0aW9uYWxseSAqLworCQkJbnAtPnNjc2lfbW9kZSA9IFNNT0RFX0hWRDsKKwkJY2FzZSAxOgkvKiBUcnVzdCBwcmV2aW91cyBzZXR0aW5ncyBmb3IgSFZEICovCisJCQlpZiAobnAtPnN2X3N0ZXN0MiAmIDB4MjApCisJCQkJbnAtPnNjc2lfbW9kZSA9IFNNT0RFX0hWRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0Oi8qIERvbid0IGNhcmUgYWJvdXQgSFZEICovCQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG5wLT5zY3NpX21vZGUgPT0gU01PREVfSFZEKQorCQlucC0+cnZfc3Rlc3QyIHw9IDB4MjA7CisKKwkvKgorCSoqCVNldCBMRUQgc3VwcG9ydCBmcm9tIFNDUklQVFMuCisJKioJSWdub3JlIHRoaXMgZmVhdHVyZSBmb3IgYm9hcmRzIGtub3duIHRvIHVzZSBhIAorCSoqCXNwZWNpZmljIEdQSU8gd2lyaW5nIGFuZCBmb3IgdGhlIDg5NUEgb3IgODk2IAorCSoqCXRoYXQgZHJpdmUgdGhlIExFRCBkaXJlY3RseS4KKwkqKglBbHNvIHByb2JlIGluaXRpYWwgc2V0dGluZyBvZiBHUElPMCBhcyBvdXRwdXQuCisJKi8KKwlpZiAoKGRyaXZlcl9zZXR1cC5sZWRfcGluKSAmJgorCSAgICAhKG5wLT5mZWF0dXJlcyAmIEZFX0xFREMpICYmICEobnAtPnN2X2dwY250bCAmIDB4MDEpKQorCQlucC0+ZmVhdHVyZXMgfD0gRkVfTEVEMDsKKworCS8qCisJKioJU2V0IGlycSBtb2RlLgorCSovCisJc3dpdGNoKGRyaXZlcl9zZXR1cC5pcnFtICYgMykgeworCWNhc2UgMjoKKwkJbnAtPnJ2X2RjbnRsCXw9IElSUU07CisJCWJyZWFrOworCWNhc2UgMToKKwkJbnAtPnJ2X2RjbnRsCXw9IChucC0+c3ZfZGNudGwgJiBJUlFNKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkqKglDb25maWd1cmUgdGFyZ2V0cyBhY2NvcmRpbmcgdG8gZHJpdmVyIHNldHVwLgorCSoqCUFsbG93IHRvIG92ZXJyaWRlIHN5bmMsIHdpZGUgYW5kIE5PU0NBTiBmcm9tIAorCSoqCWJvb3QgY29tbWFuZCBsaW5lLgorCSovCisJZm9yIChpID0gMCA7IGkgPCBNQVhfVEFSR0VUIDsgaSsrKSB7CisJCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbaV07CisKKwkJdHAtPnVzcnN5bmMgPSBkcml2ZXJfc2V0dXAuZGVmYXVsdF9zeW5jOworCQl0cC0+dXNyd2lkZSA9IGRyaXZlcl9zZXR1cC5tYXhfd2lkZTsKKwkJdHAtPnVzcnRhZ3MgPSBNQVhfVEFHUzsKKwkJdHAtPnBlcmlvZCA9IDB4ZmZmZjsKKwkJaWYgKCFkcml2ZXJfc2V0dXAuZGlzY29ubmVjdGlvbikKKwkJCW5wLT50YXJnZXRbaV0udXNyZmxhZyA9IFVGX05PRElTQzsKKwl9CisKKwkvKgorCSoqCUFubm91bmNlIGFsbCB0aGF0IHN0dWZmIHRvIHVzZXIuCisJKi8KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCAlZCwgRmFzdC0lZCVzJXNcbiIsIG5jcl9uYW1lKG5wKSwKKwkJbnAtPm15YWRkciwKKwkJbnAtPm1pbnN5bmMgPCAxMiA/IDQwIDogKG5wLT5taW5zeW5jIDwgMjUgPyAyMCA6IDEwKSwKKwkJKG5wLT5ydl9zY250bDAgJiAweGEpCT8gIiwgUGFyaXR5IENoZWNraW5nIgk6ICIsIE5PIFBhcml0eSIsCisJCShucC0+cnZfc3Rlc3QyICYgMHgyMCkJPyAiLCBEaWZmZXJlbnRpYWwiCTogIiIpOworCisJaWYgKGJvb3R2ZXJib3NlID4gMSkgeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IGluaXRpYWwgU0NOVEwzL0RNT0RFL0RDTlRML0NURVNUMy80LzUgPSAiCisJCQkiKGhleCkgJTAyeC8lMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMnhcbiIsCisJCQluY3JfbmFtZShucCksIG5wLT5zdl9zY250bDMsIG5wLT5zdl9kbW9kZSwgbnAtPnN2X2RjbnRsLAorCQkJbnAtPnN2X2N0ZXN0MywgbnAtPnN2X2N0ZXN0NCwgbnAtPnN2X2N0ZXN0NSk7CisKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBmaW5hbCAgIFNDTlRMMy9ETU9ERS9EQ05UTC9DVEVTVDMvNC81ID0gIgorCQkJIihoZXgpICUwMngvJTAyeC8lMDJ4LyUwMngvJTAyeC8lMDJ4XG4iLAorCQkJbmNyX25hbWUobnApLCBucC0+cnZfc2NudGwzLCBucC0+cnZfZG1vZGUsIG5wLT5ydl9kY250bCwKKwkJCW5wLT5ydl9jdGVzdDMsIG5wLT5ydl9jdGVzdDQsIG5wLT5ydl9jdGVzdDUpOworCX0KKworCWlmIChib290dmVyYm9zZSAmJiBucC0+cGFkZHIyKQorCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IG9uLWNoaXAgUkFNIGF0IDB4JWx4XG4iLAorCQkJbmNyX25hbWUobnApLCBucC0+cGFkZHIyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCURvbmUgU0NTSSBjb21tYW5kcyBsaXN0IG1hbmFnZW1lbnQuCisqKgorKioJV2UgZG9ubm90IGVudGVyIHRoZSBzY3NpX2RvbmUoKSBjYWxsYmFjayBpbW1lZGlhdGVseSAKKyoqCWFmdGVyIGEgY29tbWFuZCBoYXMgYmVlbiBzZWVuIGFzIGNvbXBsZXRlZCBidXQgd2UgCisqKglpbnNlcnQgaXQgaW50byBhIGxpc3Qgd2hpY2ggaXMgZmx1c2hlZCBvdXRzaWRlIGFueSBraW5kIAorKioJb2YgZHJpdmVyIGNyaXRpY2FsIHNlY3Rpb24uCisqKglUaGlzIGFsbG93cyB0byBkbyBtaW5pbWFsIHN0dWZmIHVuZGVyIGludGVycnVwdCBhbmQgCisqKglpbnNpZGUgY3JpdGljYWwgc2VjdGlvbnMgYW5kIHRvIGFsc28gYXZvaWQgbG9ja2luZyB1cCAKKyoqCW9uIHJlY3Vyc2l2ZSBjYWxscyB0byBkcml2ZXIgZW50cnkgcG9pbnRzIHVuZGVyIFNNUC4KKyoqCUluIGZhY3QsIHRoZSBvbmx5IGtlcm5lbCBwb2ludCB3aGljaCBpcyBlbnRlcmVkIGJ5IHRoZSAKKyoqCWRyaXZlciB3aXRoIGEgZHJpdmVyIGxvY2sgc2V0IGlzIGttYWxsb2MoR0ZQX0FUT01JQykgCisqKgl0aGF0IHNoYWxsIG5vdCByZWVudGVyIHRoZSBkcml2ZXIgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsCisqKglBRkFJSy4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIHZvaWQgbmNyX3F1ZXVlX2RvbmVfY21kKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdW5tYXBfc2NzaV9kYXRhKG5wLCBjbWQpOworCWNtZC0+aG9zdF9zY3JpYmJsZSA9IChjaGFyICopIG5wLT5kb25lX2xpc3Q7CisJbnAtPmRvbmVfbGlzdCA9IGNtZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcl9mbHVzaF9kb25lX2NtZHMoc3RydWN0IHNjc2lfY21uZCAqbGNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwl3aGlsZSAobGNtZCkgeworCQljbWQgPSBsY21kOworCQlsY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCVByZXBhcmUgdGhlIG5leHQgbmVnb3RpYXRpb24gbWVzc2FnZSBpZiBuZWVkZWQuCisqKgorKioJRmlsbCBpbiB0aGUgcGFydCBvZiBtZXNzYWdlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSAKKyoqCW5lZ290aWF0aW9uIGFuZCB0aGUgbmVnb19zdGF0dXMgZmllbGQgb2YgdGhlIENDQi4KKyoqCVJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaW4gYnl0ZXMuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCitzdGF0aWMgaW50IG5jcl9wcmVwYXJlX25lZ28oc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwLCB1X2NoYXIgKm1zZ3B0cikKK3sKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W2NwLT50YXJnZXRdOworCWludCBtc2dsZW4gPSAwOworCWludCBuZWdvID0gMDsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cC0+c3RhcmdldDsKKworCS8qIG5lZ290aWF0ZSB3aWRlIHRyYW5zZmVycyA/ICAqLworCWlmICghdHAtPndpZGVkb25lKSB7CisJCWlmIChzcGlfc3VwcG9ydF93aWRlKHN0YXJnZXQpKSB7CisJCQluZWdvID0gTlNfV0lERTsKKwkJfSBlbHNlCisJCQl0cC0+d2lkZWRvbmU9MTsKKwl9CisKKwkvKiBuZWdvdGlhdGUgc3luY2hyb25vdXMgdHJhbnNmZXJzPyAgKi8KKwlpZiAoIW5lZ28gJiYgIXRwLT5wZXJpb2QpIHsKKwkJaWYgKHNwaV9zdXBwb3J0X3N5bmMoc3RhcmdldCkpIHsKKwkJCW5lZ28gPSBOU19TWU5DOworCQl9IGVsc2UgeworCQkJdHAtPnBlcmlvZCAgPTB4ZmZmZjsKKwkJCWRldl9pbmZvKCZzdGFyZ2V0LT5kZXYsICJ0YXJnZXQgZGlkIG5vdCByZXBvcnQgU1lOQy5cbiIpOworCQl9CisJfQorCisJc3dpdGNoIChuZWdvKSB7CisJY2FzZSBOU19TWU5DOgorCQltc2dwdHJbbXNnbGVuKytdID0gTV9FWFRFTkRFRDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IDM7CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX1hfU1lOQ19SRVE7CisJCW1zZ3B0clttc2dsZW4rK10gPSB0cC0+bWF4b2ZmcyA/IHRwLT5taW5zeW5jIDogMDsKKwkJbXNncHRyW21zZ2xlbisrXSA9IHRwLT5tYXhvZmZzOworCQlicmVhazsKKwljYXNlIE5TX1dJREU6CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX0VYVEVOREVEOworCQltc2dwdHJbbXNnbGVuKytdID0gMjsKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fWF9XSURFX1JFUTsKKwkJbXNncHRyW21zZ2xlbisrXSA9IHRwLT51c3J3aWRlOworCQlicmVhazsKKwl9CisKKwljcC0+bmVnb19zdGF0dXMgPSBuZWdvOworCisJaWYgKG5lZ28pIHsKKwkJdHAtPm5lZ29fY3AgPSBjcDsKKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQkJbmNyX3ByaW50X21zZyhjcCwgbmVnbyA9PSBOU19XSURFID8KKwkJCQkJICAid2lkZSBtc2dvdXQiOiJzeW5jX21zZ291dCIsIG1zZ3B0cik7CisJCX0KKwl9CisKKwlyZXR1cm4gbXNnbGVuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCVN0YXJ0IGV4ZWN1dGlvbiBvZiBhIFNDU0kgY29tbWFuZC4KKyoqCVRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGdlbmVyaWMgU0NTSSBkcml2ZXIuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgbmNyX3F1ZXVlX2NvbW1hbmQgKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtzZGV2LT5pZF07CisJc3RydWN0IGxjYiAqbHAgPSB0cC0+bHBbc2Rldi0+bHVuXTsKKwlzdHJ1Y3QgY2NiICpjcDsKKworCWludAlzZWdtZW50czsKKwl1X2NoYXIJaWRtc2csICptc2dwdHI7CisJdTMyCW1zZ2xlbjsKKwlpbnQJZGlyZWN0aW9uOworCXUzMglsYXN0cCwgZ29hbHA7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCisJKiogICAgICBTb21lIHNob3J0Y3V0cyAuLi4KKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlpZiAoKHNkZXYtPmlkID09IG5wLT5teWFkZHIJICApIHx8CisJCShzZGV2LT5pZCA+PSBNQVhfVEFSR0VUKSB8fAorCQkoc2Rldi0+bHVuICAgID49IE1BWF9MVU4gICApKSB7CisJCXJldHVybihESURfQkFEX1RBUkdFVCk7CisJfQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCUNvbXBsZXRlIHRoZSAxc3QgVEVTVCBVTklUIFJFQURZIGNvbW1hbmQKKwkqKgl3aXRoIGVycm9yIGNvbmRpdGlvbiBpZiB0aGUgZGV2aWNlIGlzIAorCSoqCWZsYWdnZWQgTk9TQ0FOLCBpbiBvcmRlciB0byBzcGVlZCB1cCAKKwkqKgl0aGUgYm9vdC4KKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlpZiAoKGNtZC0+Y21uZFswXSA9PSAwIHx8IGNtZC0+Y21uZFswXSA9PSAweDEyKSAmJiAKKwkgICAgKHRwLT51c3JmbGFnICYgVUZfTk9TQ0FOKSkgeworCQl0cC0+dXNyZmxhZyAmPSB+VUZfTk9TQ0FOOworCQlyZXR1cm4gRElEX0JBRF9UQVJHRVQ7CisJfQorCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgeworCQlQUklOVF9BRERSKGNtZCwgIkNNRD0leCAiLCBjbWQtPmNtbmRbMF0pOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKglBc3NpZ24gYSBjY2IgLyBiaW5kIGNtZC4KKwkqKglJZiByZXNldHRpbmcsIHNob3J0ZW4gc2V0dGxlX3RpbWUgaWYgbmVjZXNzYXJ5CisJKioJaW4gb3JkZXIgdG8gYXZvaWQgc3B1cmlvdXMgdGltZW91dHMuCisJKioJSWYgcmVzZXR0aW5nIG9yIG5vIGZyZWUgY2NiLAorCSoqCWluc2VydCBjbWQgaW50byB0aGUgd2FpdGluZyBsaXN0LgorCSoqCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKwlpZiAobnAtPnNldHRsZV90aW1lICYmIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCA+PSBIWikgeworCQl1X2xvbmcgdGxpbWl0ID0ga3RpbWVfZ2V0KGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCAtIEhaKTsKKwkJaWYgKGt0aW1lX2RpZihucC0+c2V0dGxlX3RpbWUsIHRsaW1pdCkgPiAwKQorCQkJbnAtPnNldHRsZV90aW1lID0gdGxpbWl0OworCX0KKworCWlmIChucC0+c2V0dGxlX3RpbWUgfHwgIShjcD1uY3JfZ2V0X2NjYiAobnAsIGNtZCkpKSB7CisJCWluc2VydF9pbnRvX3dhaXRpbmdfbGlzdChucCwgY21kKTsKKwkJcmV0dXJuKERJRF9PSyk7CisJfQorCWNwLT5jbWQgPSBjbWQ7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCUJ1aWxkIHRoZSBpZGVudGlmeSAvIHRhZyAvIHNkdHIgbWVzc2FnZQorCSoqCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKworCWlkbXNnID0gTV9JREVOVElGWSB8IHNkZXYtPmx1bjsKKworCWlmIChjcCAtPnRhZyAhPSBOT19UQUcgfHwKKwkJKGNwICE9IG5wLT5jY2IgJiYgbnAtPmRpc2MgJiYgISh0cC0+dXNyZmxhZyAmIFVGX05PRElTQykpKQorCQlpZG1zZyB8PSAweDQwOworCisJbXNncHRyID0gY3AtPnNjc2lfc21zZzsKKwltc2dsZW4gPSAwOworCW1zZ3B0clttc2dsZW4rK10gPSBpZG1zZzsKKworCWlmIChjcC0+dGFnICE9IE5PX1RBRykgeworCQljaGFyIG9yZGVyID0gbnAtPm9yZGVyOworCisJCS8qCisJCSoqCUZvcmNlIG9yZGVyZWQgdGFnIGlmIG5lY2Vzc2FyeSB0byBhdm9pZCB0aW1lb3V0cyAKKwkJKioJYW5kIHRvIHByZXNlcnZlIGludGVyYWN0aXZpdHkuCisJCSovCisJCWlmIChscCAmJiBrdGltZV9leHAobHAtPnRhZ3Nfc3RpbWUpKSB7CisJCQlpZiAobHAtPnRhZ3Nfc21hcCkgeworCQkJCW9yZGVyID0gTV9PUkRFUkVEX1RBRzsKKwkJCQlpZiAoKERFQlVHX0ZMQUdTICYgREVCVUdfVEFHUyl8fGJvb3R2ZXJib3NlPjIpeyAKKwkJCQkJUFJJTlRfQUREUihjbWQsCisJCQkJCQkib3JkZXJlZCB0YWcgZm9yY2VkLlxuIik7CisJCQkJfQorCQkJfQorCQkJbHAtPnRhZ3Nfc3RpbWUgPSBrdGltZV9nZXQoMypIWik7CisJCQlscC0+dGFnc19zbWFwID0gbHAtPnRhZ3NfdW1hcDsKKwkJfQorCisJCWlmIChvcmRlciA9PSAwKSB7CisJCQkvKgorCQkJKioJT3JkZXJlZCB3cml0ZSBvcHMsIHVub3JkZXJlZCByZWFkIG9wcy4KKwkJCSovCisJCQlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworCQkJY2FzZSAweDA4OiAgLyogUkVBRF9TTUFMTCAoNikgKi8KKwkJCWNhc2UgMHgyODogIC8qIFJFQURfQklHICAoMTApICovCisJCQljYXNlIDB4YTg6ICAvKiBSRUFEX0hVR0UgKDEyKSAqLworCQkJCW9yZGVyID0gTV9TSU1QTEVfVEFHOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlvcmRlciA9IE1fT1JERVJFRF9UQUc7CisJCQl9CisJCX0KKwkJbXNncHRyW21zZ2xlbisrXSA9IG9yZGVyOworCQkvKgorCQkqKglBY3R1YWwgdGFncyBhcmUgbnVtYmVyZWQgMSwzLDUsLi4yKk1BWFRBR1MrMSwKKwkJKioJc2luY2Ugd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIGRldmljZXMgdGhhdCBoYXZlIAorCQkqKglwcm9ibGVtcyB3aXRoICNUQUcgMCBvciB0b28gZ3JlYXQgI1RBRyBudW1iZXJzLgorCQkqLworCQltc2dwdHJbbXNnbGVuKytdID0gKGNwLT50YWcgPDwgMSkgKyAxOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqCisJKioJQnVpbGQgdGhlIGRhdGEgZGVzY3JpcHRvcnMKKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisKKwlkaXJlY3Rpb24gPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCWlmIChkaXJlY3Rpb24gIT0gRE1BX05PTkUpIHsKKwkJc2VnbWVudHMgPSBuY3Jfc2NhdHRlcihucCwgY3AsIGNwLT5jbWQpOworCQlpZiAoc2VnbWVudHMgPCAwKSB7CisJCQluY3JfZnJlZV9jY2IobnAsIGNwKTsKKwkJCXJldHVybihESURfRVJST1IpOworCQl9CisJfQorCWVsc2UgeworCQljcC0+ZGF0YV9sZW4gPSAwOworCQlzZWdtZW50cyA9IDA7CisJfQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCW5lZ290aWF0aW9uIHJlcXVpcmVkPworCSoqCisJKioJKG5lZ29fc3RhdHVzIGlzIGZpbGxlZCBieSBuY3JfcHJlcGFyZV9uZWdvKCkpCisJKioKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisKKwljcC0+bmVnb19zdGF0dXMgPSAwOworCisJaWYgKCghdHAtPndpZGVkb25lIHx8ICF0cC0+cGVyaW9kKSAmJiAhdHAtPm5lZ29fY3AgJiYgbHApIHsKKwkJbXNnbGVuICs9IG5jcl9wcmVwYXJlX25lZ28gKG5wLCBjcCwgbXNncHRyICsgbXNnbGVuKTsKKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCURldGVybWluZSB4ZmVyIGRpcmVjdGlvbi4KKwkqKgorCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJaWYgKCFjcC0+ZGF0YV9sZW4pCisJCWRpcmVjdGlvbiA9IERNQV9OT05FOworCisJLyoKKwkqKglJZiBkYXRhIGRpcmVjdGlvbiBpcyBCSURJUkVDVElPTkFMLCBzcGVjdWxhdGUgRlJPTV9ERVZJQ0UKKwkqKglidXQgcHJlcGFyZSBhbHRlcm5hdGUgcG9pbnRlcnMgZm9yIFRPX0RFVklDRSBpbiBjYXNlIAorCSoqCW9mIG91ciBzcGVjdWxhdGlvbiB3aWxsIGJlIGp1c3Qgd3JvbmcuCisJKioJU0NSSVBUUyB3aWxsIHN3YXAgdmFsdWVzIGlmIG5lZWRlZC4KKwkqLworCXN3aXRjaChkaXJlY3Rpb24pIHsKKwljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJZ29hbHAgPSBOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkYXRhX291dDIpICsgODsKKwkJaWYgKHNlZ21lbnRzIDw9IE1BWF9TQ0FUVEVSTCkKKwkJCWxhc3RwID0gZ29hbHAgLSA4IC0gKHNlZ21lbnRzICogMTYpOworCQllbHNlIHsKKwkJCWxhc3RwID0gTkNCX1NDUklQVEhfUEhZUyAobnAsIGhkYXRhX291dDIpOworCQkJbGFzdHAgLT0gKHNlZ21lbnRzIC0gTUFYX1NDQVRURVJMKSAqIDE2OworCQl9CisJCWlmIChkaXJlY3Rpb24gIT0gRE1BX0JJRElSRUNUSU9OQUwpCisJCQlicmVhazsKKwkJY3AtPnBoeXMuaGVhZGVyLndnb2FscAk9IGNwdV90b19zY3IoZ29hbHApOworCQljcC0+cGh5cy5oZWFkZXIud2xhc3RwCT0gY3B1X3RvX3NjcihsYXN0cCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlnb2FscCA9IE5DQl9TQ1JJUFRfUEhZUyAobnAsIGRhdGFfaW4yKSArIDg7CisJCWlmIChzZWdtZW50cyA8PSBNQVhfU0NBVFRFUkwpCisJCQlsYXN0cCA9IGdvYWxwIC0gOCAtIChzZWdtZW50cyAqIDE2KTsKKwkJZWxzZSB7CisJCQlsYXN0cCA9IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBoZGF0YV9pbjIpOworCQkJbGFzdHAgLT0gKHNlZ21lbnRzIC0gTUFYX1NDQVRURVJMKSAqIDE2OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBETUFfTk9ORToKKwkJbGFzdHAgPSBnb2FscCA9IE5DQl9TQ1JJUFRfUEhZUyAobnAsIG5vX2RhdGEpOworCQlicmVhazsKKwl9CisKKwkvKgorCSoqCVNldCBhbGwgcG9pbnRlcnMgdmFsdWVzIG5lZWRlZCBieSBTQ1JJUFRTLgorCSoqCUlmIGRpcmVjdGlvbiBpcyB1bmtub3duLCBzdGFydCBhdCBkYXRhX2lvLgorCSovCisJY3AtPnBoeXMuaGVhZGVyLmxhc3RwID0gY3B1X3RvX3NjcihsYXN0cCk7CisJY3AtPnBoeXMuaGVhZGVyLmdvYWxwID0gY3B1X3RvX3Njcihnb2FscCk7CisKKwlpZiAoZGlyZWN0aW9uID09IERNQV9CSURJUkVDVElPTkFMKQorCQljcC0+cGh5cy5oZWFkZXIuc2F2ZXAgPSAKKwkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIGRhdGFfaW8pKTsKKwllbHNlCisJCWNwLT5waHlzLmhlYWRlci5zYXZlcD0gY3B1X3RvX3NjcihsYXN0cCk7CisKKwkvKgorCSoqCVNhdmUgdGhlIGluaXRpYWwgZGF0YSBwb2ludGVyIGluIG9yZGVyIHRvIGJlIGFibGUgCisJKioJdG8gcmVkbyB0aGUgY29tbWFuZC4KKwkqLworCWNwLT5zdGFydHAgPSBjcC0+cGh5cy5oZWFkZXIuc2F2ZXA7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCWZpbGwgaW4gY2NiCisJKioKKwkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKgorCSoqCisJKioJcGh5c2ljYWwgLT4gdmlydHVhbCBiYWNrbGluaworCSoqCUdlbmVyaWMgU0NTSSBjb21tYW5kCisJKi8KKworCS8qCisJKioJU3RhcnRxdWV1ZQorCSovCisJY3AtPnN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgICA9IGNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgc2VsZWN0KSk7CisJY3AtPnJlc3RhcnQuc2NoZWR1bGUubF9wYWRkciA9IGNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgcmVzZWxfZHNhKSk7CisJLyoKKwkqKglzZWxlY3QKKwkqLworCWNwLT5waHlzLnNlbGVjdC5zZWxfaWQJCT0gc2Rldi0+aWQ7CisJY3AtPnBoeXMuc2VsZWN0LnNlbF9zY250bDMJPSB0cC0+d3ZhbDsKKwljcC0+cGh5cy5zZWxlY3Quc2VsX3N4ZmVyCT0gdHAtPnN2YWw7CisJLyoKKwkqKgltZXNzYWdlCisJKi8KKwljcC0+cGh5cy5zbXNnLmFkZHIJCT0gY3B1X3RvX3NjcihDQ0JfUEhZUyAoY3AsIHNjc2lfc21zZykpOworCWNwLT5waHlzLnNtc2cuc2l6ZQkJPSBjcHVfdG9fc2NyKG1zZ2xlbik7CisKKwkvKgorCSoqCWNvbW1hbmQKKwkqLworCW1lbWNweShjcC0+Y2RiX2J1ZiwgY21kLT5jbW5kLCBtaW5fdChpbnQsIGNtZC0+Y21kX2xlbiwgc2l6ZW9mKGNwLT5jZGJfYnVmKSkpOworCWNwLT5waHlzLmNtZC5hZGRyCQk9IGNwdV90b19zY3IoQ0NCX1BIWVMgKGNwLCBjZGJfYnVmWzBdKSk7CisJY3AtPnBoeXMuY21kLnNpemUJCT0gY3B1X3RvX3NjcihjbWQtPmNtZF9sZW4pOworCisJLyoKKwkqKglzdGF0dXMKKwkqLworCWNwLT5hY3R1YWxxdWlya3MJCT0gMDsKKwljcC0+aG9zdF9zdGF0dXMJCQk9IGNwLT5uZWdvX3N0YXR1cyA/IEhTX05FR09USUFURSA6IEhTX0JVU1k7CisJY3AtPnNjc2lfc3RhdHVzCQkJPSBTX0lMTEVHQUw7CisJY3AtPnBhcml0eV9zdGF0dXMJCT0gMDsKKworCWNwLT54ZXJyX3N0YXR1cwkJCT0gWEVfT0s7CisjaWYgMAorCWNwLT5zeW5jX3N0YXR1cwkJCT0gdHAtPnN2YWw7CisJY3AtPndpZGVfc3RhdHVzCQkJPSB0cC0+d3ZhbDsKKyNlbmRpZgorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKioKKwkqKglDcml0aWNhbCByZWdpb246IHN0YXJ0IHRoaXMgam9iLgorCSoqCisJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJKi8KKworCS8qIGFjdGl2YXRlIHRoaXMgam9iLiAgKi8KKwljcC0+bWFnaWMJCT0gQ0NCX01BR0lDOworCisJLyoKKwkqKglpbnNlcnQgbmV4dCBDQ0JzIGludG8gc3RhcnQgcXVldWUuCisJKioJMiBtYXggYXQgYSB0aW1lIGlzIGVub3VnaCB0byBmbHVzaCB0aGUgQ0NCIHdhaXQgcXVldWUuCisJKi8KKwljcC0+YXV0b19zZW5zZSA9IDA7CisJaWYgKGxwKQorCQluY3Jfc3RhcnRfbmV4dF9jY2IobnAsIGxwLCAyKTsKKwllbHNlCisJCW5jcl9wdXRfc3RhcnRfcXVldWUobnAsIGNwKTsKKworCS8qIENvbW1hbmQgaXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZC4gICovCisKKwlyZXR1cm4gRElEX09LOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglJbnNlcnQgYSBDQ0IgaW50byB0aGUgc3RhcnQgcXVldWUgYW5kIHdha2UgdXAgdGhlIAorKioJU0NSSVBUUyBwcm9jZXNzb3IuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgbmNyX3N0YXJ0X25leHRfY2NiKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgbGNiICpscCwgaW50IG1heG4pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcXA7CisJc3RydWN0IGNjYiAqY3A7CisKKwlpZiAobHAtPmhlbGRfY2NiKQorCQlyZXR1cm47CisKKwl3aGlsZSAobWF4bi0tICYmIGxwLT5xdWV1ZWRjY2JzIDwgbHAtPnF1ZXVlZGVwdGgpIHsKKwkJcXAgPSBuY3JfbGlzdF9wb3AoJmxwLT53YWl0X2NjYnEpOworCQlpZiAoIXFwKQorCQkJYnJlYWs7CisJCSsrbHAtPnF1ZXVlZGNjYnM7CisJCWNwID0gbGlzdF9lbnRyeShxcCwgc3RydWN0IGNjYiwgbGlua19jY2JxKTsKKwkJbGlzdF9hZGRfdGFpbChxcCwgJmxwLT5idXN5X2NjYnEpOworCQlscC0+anVtcF9jY2JbY3AtPnRhZyA9PSBOT19UQUcgPyAwIDogY3AtPnRhZ10gPQorCQkJY3B1X3RvX3NjcihDQ0JfUEhZUyAoY3AsIHJlc3RhcnQpKTsKKwkJbmNyX3B1dF9zdGFydF9xdWV1ZShucCwgY3ApOworCX0KK30KKworc3RhdGljIHZvaWQgbmNyX3B1dF9zdGFydF9xdWV1ZShzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3ApCit7CisJdTE2CXFpZHg7CisKKwkvKgorCSoqCWluc2VydCBpbnRvIHN0YXJ0IHF1ZXVlLgorCSovCisJaWYgKCFucC0+c3F1ZXVlcHV0KSBucC0+c3F1ZXVlcHV0ID0gMTsKKwlxaWR4ID0gbnAtPnNxdWV1ZXB1dCArIDI7CisJaWYgKHFpZHggPj0gTUFYX1NUQVJUICsgTUFYX1NUQVJUKSBxaWR4ID0gMTsKKworCW5wLT5zY3JpcHRoLT50cnlsb29wIFtxaWR4XSA9IGNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgaWRsZSkpOworCU1FTU9SWV9CQVJSSUVSKCk7CisJbnAtPnNjcmlwdGgtPnRyeWxvb3AgW25wLT5zcXVldWVwdXRdID0gY3B1X3RvX3NjcihDQ0JfUEhZUyAoY3AsIHN0YXJ0KSk7CisKKwlucC0+c3F1ZXVlcHV0ID0gcWlkeDsKKwkrK25wLT5xdWV1ZWRjY2JzOworCWNwLT5xdWV1ZWQgPSAxOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUVVFVUUpCisJCXByaW50ayAoIiVzOiBxdWV1ZXBvcz0lZC5cbiIsIG5jcl9uYW1lIChucCksIG5wLT5zcXVldWVwdXQpOworCisJLyoKKwkqKglTY3JpcHQgcHJvY2Vzc29yIG1heSBiZSB3YWl0aW5nIGZvciByZXNlbGVjdC4KKwkqKglXYWtlIGl0IHVwLgorCSovCisJTUVNT1JZX0JBUlJJRVIoKTsKKwlPVVRCIChuY19pc3RhdCwgU0lHUCk7Cit9CisKKworc3RhdGljIGludCBuY3JfcmVzZXRfc2NzaV9idXMoc3RydWN0IG5jYiAqbnAsIGludCBlbmFiX2ludCwgaW50IHNldHRsZV9kZWxheSkKK3sKKwl1MzIgdGVybTsKKwlpbnQgcmV0diA9IDA7CisKKwlucC0+c2V0dGxlX3RpbWUJPSBrdGltZV9nZXQoc2V0dGxlX2RlbGF5ICogSFopOworCisJaWYgKGJvb3R2ZXJib3NlID4gMSkKKwkJcHJpbnRrKCIlczogcmVzZXR0aW5nLCAiCisJCQkiY29tbWFuZCBwcm9jZXNzaW5nIHN1c3BlbmRlZCBmb3IgJWQgc2Vjb25kc1xuIiwKKwkJCW5jcl9uYW1lKG5wKSwgc2V0dGxlX2RlbGF5KTsKKworCW5jcl9jaGlwX3Jlc2V0KG5wLCAxMDApOworCXVkZWxheSgyMDAwKTsJLyogVGhlIDg5NSBuZWVkcyB0aW1lIGZvciB0aGUgYnVzIG1vZGUgdG8gc2V0dGxlICovCisJaWYgKGVuYWJfaW50KQorCQlPVVRXIChuY19zaWVuLCBSU1QpOworCS8qCisJKioJRW5hYmxlIFRvbGVyYW50LCByZXNldCBJUlFEIGlmIHByZXNlbnQgYW5kIAorCSoqCXByb3Blcmx5IHNldCBJUlEgbW9kZSwgcHJpb3IgdG8gcmVzZXR0aW5nIHRoZSBidXMuCisJKi8KKwlPVVRCIChuY19zdGVzdDMsIFRFKTsKKwlPVVRCIChuY19zY250bDEsIENSU1QpOworCXVkZWxheSgyMDApOworCisJaWYgKCFkcml2ZXJfc2V0dXAuYnVzX2NoZWNrKQorCQlnb3RvIG91dDsKKwkvKgorCSoqCUNoZWNrIGZvciBubyB0ZXJtaW5hdG9ycyBvciBTQ1NJIGJ1cyBzaG9ydHMgdG8gZ3JvdW5kLgorCSoqCVJlYWQgU0NTSSBkYXRhIGJ1cywgZGF0YSBwYXJpdHkgYml0cyBhbmQgY29udHJvbCBzaWduYWxzLgorCSoqCVdlIGFyZSBleHBlY3RpbmcgUkVTRVQgdG8gYmUgVFJVRSBhbmQgb3RoZXIgc2lnbmFscyB0byBiZSAKKwkqKglGQUxTRS4KKwkqLworCisJdGVybSA9CUlOQihuY19zc3RhdDApOworCXRlcm0gPQkoKHRlcm0gJiAyKSA8PCA3KSArICgodGVybSAmIDEpIDw8IDE3KTsJLyogcnN0IHNkcDAgKi8KKwl0ZXJtIHw9ICgoSU5CKG5jX3NzdGF0MikgJiAweDAxKSA8PCAyNikgfAkvKiBzZHAxICAgICAqLworCQkoKElOVyhuY19zYmRsKSAmIDB4ZmYpICAgPDwgOSkgIHwJLyogZDctMCAgICAgKi8KKwkJKChJTlcobmNfc2JkbCkgJiAweGZmMDApIDw8IDEwKSB8CS8qIGQxNS04ICAgICovCisJCUlOQihuY19zYmNsKTsJLyogcmVxIGFjayBic3kgc2VsIGF0biBtc2cgY2QgaW8gICAgKi8KKworCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpKQorCQl0ZXJtICY9IDB4M2ZmZmY7CisKKwlpZiAodGVybSAhPSAoMjw8NykpIHsKKwkJcHJpbnRrKCIlczogc3VzcGljaW91cyBTQ1NJIGRhdGEgd2hpbGUgcmVzZXR0aW5nIHRoZSBCVVMuXG4iLAorCQkJbmNyX25hbWUobnApKTsKKwkJcHJpbnRrKCIlczogJXNkcDAsZDctMCxyc3QscmVxLGFjayxic3ksc2VsLGF0bixtc2csYy9kLGkvbyA9ICIKKwkJCSIweCVseCwgZXhwZWN0aW5nIDB4JWx4XG4iLAorCQkJbmNyX25hbWUobnApLAorCQkJKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpID8gImRwMSxkMTUtOCwiIDogIiIsCisJCQkodV9sb25nKXRlcm0sICh1X2xvbmcpKDI8PDcpKTsKKwkJaWYgKGRyaXZlcl9zZXR1cC5idXNfY2hlY2sgPT0gMSkKKwkJCXJldHYgPSAxOworCX0KK291dDoKKwlPVVRCIChuY19zY250bDEsIDApOworCXJldHVybiByZXR2OworfQorCisvKgorICogU3RhcnQgcmVzZXQgcHJvY2Vzcy4KKyAqIElmIHJlc2V0IGluIHByb2dyZXNzIGRvIG5vdGhpbmcuCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCByZWluaXRpYWxpemUgdGhlIGNoaXAuCisgKiBUaGUgdGltZW91dCBoYW5kbGVyIHdpbGwgd2FpdCBmb3Igc2V0dGxlX3RpbWUgYmVmb3JlIAorICogY2xlYXJpbmcgaXQgYW5kIHNvIHJlc3VtaW5nIGNvbW1hbmQgcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIHZvaWQgbmNyX3N0YXJ0X3Jlc2V0KHN0cnVjdCBuY2IgKm5wKQoreworCWlmICghbnAtPnNldHRsZV90aW1lKSB7CisJCW5jcl9yZXNldF9zY3NpX2J1cyhucCwgMSwgZHJpdmVyX3NldHVwLnNldHRsZV9kZWxheSk7CisgCX0KK30KKyAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglSZXNldCB0aGUgU0NTSSBCVVMuCisqKglUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBnZW5lcmljIFNDU0kgZHJpdmVyLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IG5jcl9yZXNldF9idXMgKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBzeW5jX3Jlc2V0KQoreworLyoJc3RydWN0IHNjc2lfZGV2aWNlICAgICAgICAqZGV2aWNlICAgID0gY21kLT5kZXZpY2U7ICovCisJc3RydWN0IGNjYiAqY3A7CisJaW50IGZvdW5kOworCisvKgorICogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHJlc2V0IGlzIGluIHByb2dyZXNzLgorICovCisJaWYgKG5wLT5zZXR0bGVfdGltZSkgeworCQlyZXR1cm4gRkFJTEVEOworCX0KKy8qCisgKiBTdGFydCB0aGUgcmVzZXQgcHJvY2Vzcy4KKyAqIFRoZSBzY3JpcHQgcHJvY2Vzc29yIGlzIHRoZW4gYXNzdW1lZCB0byBiZSBzdG9wcGVkLgorICogQ29tbWFuZHMgd2lsbCBub3cgYmUgcXVldWVkIGluIHRoZSB3YWl0aW5nIGxpc3QgdW50aWwgYSBzZXR0bGUgCisgKiBkZWxheSBvZiAyIHNlY29uZHMgd2lsbCBiZSBjb21wbGV0ZWQuCisgKi8KKwluY3Jfc3RhcnRfcmVzZXQobnApOworLyoKKyAqIEZpcnN0LCBsb29rIGluIHRoZSB3YWtldXAgbGlzdAorICovCisJZm9yIChmb3VuZD0wLCBjcD1ucC0+Y2NiOyBjcDsgY3A9Y3AtPmxpbmtfY2NiKSB7CisJCS8qCisJCSoqCWxvb2sgZm9yIHRoZSBjY2Igb2YgdGhpcyBjb21tYW5kLgorCQkqLworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0lETEUpIGNvbnRpbnVlOworCQlpZiAoY3AtPmNtZCA9PSBjbWQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorLyoKKyAqIFRoZW4sIGxvb2sgaW4gdGhlIHdhaXRpbmcgbGlzdAorICovCisJaWYgKCFmb3VuZCAmJiByZXRyaWV2ZV9mcm9tX3dhaXRpbmdfbGlzdCgwLCBucCwgY21kKSkKKwkJZm91bmQgPSAxOworLyoKKyAqIFdha2UtdXAgYWxsIGF3YWl0aW5nIGNvbW1hbmRzIHdpdGggRElEX1JFU0VULgorICovCisJcmVzZXRfd2FpdGluZ19saXN0KG5wKTsKKy8qCisgKiBXYWtlLXVwIGFsbCBwZW5kaW5nIGNvbW1hbmRzIHdpdGggSFNfUkVTRVQgLT4gRElEX1JFU0VULgorICovCisJbmNyX3dha2V1cChucCwgSFNfUkVTRVQpOworLyoKKyAqIElmIHRoZSBpbnZvbHZlZCBjb21tYW5kIHdhcyBub3QgaW4gYSBkcml2ZXIgcXVldWUsIGFuZCB0aGUgCisgKiBzY3NpIGRyaXZlciB0b2xkIHVzIHJlc2V0IGlzIHN5bmNocm9ub3VzLCBhbmQgdGhlIGNvbW1hbmQgaXMgbm90IAorICogY3VycmVudGx5IGluIHRoZSB3YWl0aW5nIGxpc3QsIGNvbXBsZXRlIGl0IHdpdGggRElEX1JFU0VUIHN0YXR1cywKKyAqIGluIG9yZGVyIHRvIGtlZXAgaXQgYWxpdmUuCisgKi8KKwlpZiAoIWZvdW5kICYmIHN5bmNfcmVzZXQgJiYgIXJldHJpZXZlX2Zyb21fd2FpdGluZ19saXN0KDAsIG5wLCBjbWQpKSB7CisJCWNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfUkVTRVQsIDApOworCQluY3JfcXVldWVfZG9uZV9jbWQobnAsIGNtZCk7CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKyNpZiAwIC8qIHVudXNlZCBhbmQgYnJva2VuLi4gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglBYm9ydCBhbiBTQ1NJIGNvbW1hbmQuCisqKglUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBnZW5lcmljIFNDU0kgZHJpdmVyLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IG5jcl9hYm9ydF9jb21tYW5kIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworLyoJc3RydWN0IHNjc2lfZGV2aWNlICAgICAgICAqZGV2aWNlICAgID0gY21kLT5kZXZpY2U7ICovCisJc3RydWN0IGNjYiAqY3A7CisJaW50IGZvdW5kOworCWludCByZXR2OworCisvKgorICogRmlyc3QsIGxvb2sgZm9yIHRoZSBzY3NpIGNvbW1hbmQgaW4gdGhlIHdhaXRpbmcgbGlzdAorICovCisJaWYgKHJlbW92ZV9mcm9tX3dhaXRpbmdfbGlzdChucCwgY21kKSkgeworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0FCT1JULCAwKTsKKwkJbmNyX3F1ZXVlX2RvbmVfY21kKG5wLCBjbWQpOworCQlyZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCX0KKworLyoKKyAqIFRoZW4sIGxvb2sgaW4gdGhlIHdha2V1cCBsaXN0CisgKi8KKwlmb3IgKGZvdW5kPTAsIGNwPW5wLT5jY2I7IGNwOyBjcD1jcC0+bGlua19jY2IpIHsKKwkJLyoKKwkJKioJbG9vayBmb3IgdGhlIGNjYiBvZiB0aGlzIGNvbW1hbmQuCisJCSovCisJCWlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfSURMRSkgY29udGludWU7CisJCWlmIChjcC0+Y21kID09IGNtZCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCX0KKworCWlmIChucC0+c2V0dGxlX3RpbWUpIHsKKwkJcmV0dXJuIFNDU0lfQUJPUlRfU05PT1pFOworCX0KKworCS8qCisJKioJSWYgdGhlIENDQiBpcyBhY3RpdmUsIHBhdGNoIHNjaGVkdWxlIGp1bXBzIGZvciB0aGUgCisJKioJc2NyaXB0IHRvIGFib3J0IHRoZSBjb21tYW5kLgorCSovCisKKwlzd2l0Y2goY3AtPmhvc3Rfc3RhdHVzKSB7CisJY2FzZSBIU19CVVNZOgorCWNhc2UgSFNfTkVHT1RJQVRFOgorCQlwcmludGsgKCIlczogYWJvcnQgY2NiPSVwIChjYW5jZWwpXG4iLCBuY3JfbmFtZSAobnApLCBjcCk7CisJCQljcC0+c3RhcnQuc2NoZWR1bGUubF9wYWRkciA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgY2FuY2VsKSk7CisJCXJldHYgPSBTQ1NJX0FCT1JUX1BFTkRJTkc7CisJCWJyZWFrOworCWNhc2UgSFNfRElTQ09OTkVDVDoKKwkJY3AtPnJlc3RhcnQuc2NoZWR1bGUubF9wYWRkciA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgYWJvcnQpKTsKKwkJcmV0diA9IFNDU0lfQUJPUlRfUEVORElORzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0diA9IFNDU0lfQUJPUlRfTk9UX1JVTk5JTkc7CisJCWJyZWFrOworCisJfQorCisJLyoKKwkqKiAgICAgIElmIHRoZXJlIGFyZSBubyByZXF1ZXN0cywgdGhlIHNjcmlwdAorCSoqICAgICAgcHJvY2Vzc29yIHdpbGwgc2xlZXAgb24gU0VMX1dBSVRfUkVTRUwuCisJKiogICAgICBMZXQncyB3YWtlIGl0IHVwLCBzaW5jZSBpdCBtYXkgaGF2ZSB0byB3b3JrLgorCSovCisJT1VUQiAobmNfaXN0YXQsIFNJR1ApOworCisJcmV0dXJuIHJldHY7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbmNyX2RldGFjaChzdHJ1Y3QgbmNiICpucCkKK3sKKwlzdHJ1Y3QgY2NiICpjcDsKKwlzdHJ1Y3QgdGNiICp0cDsKKwlzdHJ1Y3QgbGNiICpscDsKKwlpbnQgdGFyZ2V0LCBsdW47CisJaW50IGk7CisJY2hhciBpbnN0X25hbWVbMTZdOworCisJLyogTG9jYWwgY29weSBzbyB3ZSBkb24ndCBhY2Nlc3MgbnAgYWZ0ZXIgZnJlZWluZyBpdCEgKi8KKwlzdHJsY3B5KGluc3RfbmFtZSwgbmNyX25hbWUobnApLCBzaXplb2YoaW5zdF9uYW1lKSk7CisKKwlwcmludGsoIiVzOiByZWxlYXNpbmcgaG9zdCByZXNvdXJjZXNcbiIsIG5jcl9uYW1lKG5wKSk7CisKKy8qCisqKglTdG9wIHRoZSBuY3JfdGltZW91dCBwcm9jZXNzCisqKglTZXQgcmVsZWFzZV9zdGFnZSB0byAxIGFuZCB3YWl0IHRoYXQgbmNyX3RpbWVvdXQoKSBzZXQgaXQgdG8gMi4KKyovCisKKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKKwlwcmludGsoIiVzOiBzdG9wcGluZyB0aGUgdGltZXJcbiIsIG5jcl9uYW1lKG5wKSk7CisjZW5kaWYKKwlucC0+cmVsZWFzZV9zdGFnZSA9IDE7CisJZm9yIChpID0gNTAgOyBpICYmIG5wLT5yZWxlYXNlX3N0YWdlICE9IDIgOyBpLS0pCisJCW1kZWxheSgxMDApOworCWlmIChucC0+cmVsZWFzZV9zdGFnZSAhPSAyKQorCQlwcmludGsoIiVzOiB0aGUgdGltZXIgc2VlbXMgdG8gYmUgYWxyZWFkeSBzdG9wcGVkXG4iLCBuY3JfbmFtZShucCkpOworCWVsc2UgbnAtPnJlbGVhc2Vfc3RhZ2UgPSAyOworCisvKgorKioJRGlzYWJsZSBjaGlwIGludGVycnVwdHMKKyovCisKKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKKwlwcmludGsoIiVzOiBkaXNhYmxpbmcgY2hpcCBpbnRlcnJ1cHRzXG4iLCBuY3JfbmFtZShucCkpOworI2VuZGlmCisJT1VUVyAobmNfc2llbiAsIDApOworCU9VVEIgKG5jX2RpZW4gLCAwKTsKKworCS8qCisJKioJUmVzZXQgTkNSIGNoaXAKKwkqKglSZXN0b3JlIGJpb3Mgc2V0dGluZyBmb3IgYXV0b21hdGljIGNsb2NrIGRldGVjdGlvbi4KKwkqLworCisJcHJpbnRrKCIlczogcmVzZXR0aW5nIGNoaXBcbiIsIG5jcl9uYW1lKG5wKSk7CisJbmNyX2NoaXBfcmVzZXQobnAsIDEwMCk7CisKKwlPVVRCKG5jX2Rtb2RlLAlucC0+c3ZfZG1vZGUpOworCU9VVEIobmNfZGNudGwsCW5wLT5zdl9kY250bCk7CisJT1VUQihuY19jdGVzdDAsCW5wLT5zdl9jdGVzdDApOworCU9VVEIobmNfY3Rlc3QzLAlucC0+c3ZfY3Rlc3QzKTsKKwlPVVRCKG5jX2N0ZXN0NCwJbnAtPnN2X2N0ZXN0NCk7CisJT1VUQihuY19jdGVzdDUsCW5wLT5zdl9jdGVzdDUpOworCU9VVEIobmNfZ3BjbnRsLAlucC0+c3ZfZ3BjbnRsKTsKKwlPVVRCKG5jX3N0ZXN0MiwJbnAtPnN2X3N0ZXN0Mik7CisKKwluY3Jfc2VsZWN0Y2xvY2sobnAsIG5wLT5zdl9zY250bDMpOworCisJLyoKKwkqKglGcmVlIGFsbG9jYXRlZCBjY2IocykKKwkqLworCisJd2hpbGUgKChjcD1ucC0+Y2NiLT5saW5rX2NjYikgIT0gTlVMTCkgeworCQlucC0+Y2NiLT5saW5rX2NjYiA9IGNwLT5saW5rX2NjYjsKKwkJaWYgKGNwLT5ob3N0X3N0YXR1cykgeworCQlwcmludGsoIiVzOiBzaGFsbCBmcmVlIGFuIGFjdGl2ZSBjY2IgKGhvc3Rfc3RhdHVzPSVkKVxuIiwKKwkJCW5jcl9uYW1lKG5wKSwgY3AtPmhvc3Rfc3RhdHVzKTsKKwkJfQorI2lmZGVmIERFQlVHX05DUjUzQzhYWAorCXByaW50aygiJXM6IGZyZWVpbmcgY2NiICglbHgpXG4iLCBuY3JfbmFtZShucCksICh1X2xvbmcpIGNwKTsKKyNlbmRpZgorCQltX2ZyZWVfZG1hKGNwLCBzaXplb2YoKmNwKSwgIkNDQiIpOworCX0KKworCS8qIEZyZWUgYWxsb2NhdGVkIHRwKHMpICovCisKKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IE1BWF9UQVJHRVQgOyB0YXJnZXQrKykgeworCQl0cD0mbnAtPnRhcmdldFt0YXJnZXRdOworCQlmb3IgKGx1biA9IDAgOyBsdW4gPCBNQVhfTFVOIDsgbHVuKyspIHsKKwkJCWxwID0gdHAtPmxwW2x1bl07CisJCQlpZiAobHApIHsKKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKKwlwcmludGsoIiVzOiBmcmVlaW5nIGxwICglbHgpXG4iLCBuY3JfbmFtZShucCksICh1X2xvbmcpIGxwKTsKKyNlbmRpZgorCQkJCWlmIChscC0+anVtcF9jY2IgIT0gJmxwLT5qdW1wX2NjYl8wKQorCQkJCQltX2ZyZWVfZG1hKGxwLT5qdW1wX2NjYiwyNTYsIkpVTVBfQ0NCIik7CisJCQkJbV9mcmVlX2RtYShscCwgc2l6ZW9mKCpscCksICJMQ0IiKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChucC0+c2NyaXB0aDApCisJCW1fZnJlZV9kbWEobnAtPnNjcmlwdGgwLCBzaXplb2Yoc3RydWN0IHNjcmlwdGgpLCAiU0NSSVBUSCIpOworCWlmIChucC0+c2NyaXB0MCkKKwkJbV9mcmVlX2RtYShucC0+c2NyaXB0MCwgc2l6ZW9mKHN0cnVjdCBzY3JpcHQpLCAiU0NSSVBUIik7CisJaWYgKG5wLT5jY2IpCisJCW1fZnJlZV9kbWEobnAtPmNjYiwgc2l6ZW9mKHN0cnVjdCBjY2IpLCAiQ0NCIik7CisJbV9mcmVlX2RtYShucCwgc2l6ZW9mKHN0cnVjdCBuY2IpLCAiTkNCIik7CisKKwlwcmludGsoIiVzOiBob3N0IHJlc291cmNlcyBzdWNjZXNzZnVsbHkgcmVsZWFzZWRcbiIsIGluc3RfbmFtZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglDb21wbGV0ZSBleGVjdXRpb24gb2YgYSBTQ1NJIGNvbW1hbmQuCisqKglTaWduYWwgY29tcGxldGlvbiB0byB0aGUgZ2VuZXJpYyBTQ1NJIGRyaXZlci4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCit2b2lkIG5jcl9jb21wbGV0ZSAoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgdGNiICp0cDsKKwlzdHJ1Y3QgbGNiICpscDsKKworCS8qCisJKioJU2FuaXR5IGNoZWNrCisJKi8KKworCWlmICghY3AgfHwgY3AtPm1hZ2ljICE9IENDQl9NQUdJQyB8fCAhY3AtPmNtZCkKKwkJcmV0dXJuOworCisJLyoKKwkqKglQcmludCBtaW5pbWFsIGRlYnVnIGluZm9ybWF0aW9uLgorCSovCisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKQorCQlwcmludGsgKCJDQ0I9JWx4IFNUQVQ9JXgvJXhcbiIsICh1bnNpZ25lZCBsb25nKWNwLAorCQkJY3AtPmhvc3Rfc3RhdHVzLGNwLT5zY3NpX3N0YXR1cyk7CisKKwkvKgorCSoqCUdldCBjb21tYW5kLCB0YXJnZXQgYW5kIGx1biBwb2ludGVycy4KKwkqLworCisJY21kID0gY3AtPmNtZDsKKwljcC0+Y21kID0gTlVMTDsKKwl0cCA9ICZucC0+dGFyZ2V0W2NtZC0+ZGV2aWNlLT5pZF07CisJbHAgPSB0cC0+bHBbY21kLT5kZXZpY2UtPmx1bl07CisKKwkvKgorCSoqCVdlIGRvbm5vdCBxdWV1ZSBtb3JlIHRoYW4gMSBjY2IgcGVyIHRhcmdldCAKKwkqKgl3aXRoIG5lZ290aWF0aW9uIGF0IGFueSB0aW1lLiBJZiB0aGlzIGNjYiB3YXMgCisJKioJdXNlZCBmb3IgbmVnb3RpYXRpb24sIGNsZWFyIHRoaXMgaW5mbyBpbiB0aGUgdGNiLgorCSovCisKKwlpZiAoY3AgPT0gdHAtPm5lZ29fY3ApCisJCXRwLT5uZWdvX2NwID0gTlVMTDsKKworCS8qCisJKioJSWYgYXV0by1zZW5zZSBwZXJmb3JtZWQsIGNoYW5nZSBzY3NpIHN0YXR1cy4KKwkqLworCWlmIChjcC0+YXV0b19zZW5zZSkgeworCQljcC0+c2NzaV9zdGF0dXMgPSBjcC0+YXV0b19zZW5zZTsKKwl9CisKKwkvKgorCSoqCUlmIHdlIHdlcmUgcmVjb3ZlcmluZyBmcm9tIHF1ZXVlIGZ1bGwgb3IgcGVyZm9ybWluZyAKKwkqKglhdXRvLXNlbnNlLCByZXF1ZXVlIHNraXBwZWQgQ0NCcyB0byB0aGUgd2FpdCBxdWV1ZS4KKwkqLworCisJaWYgKGxwICYmIGxwLT5oZWxkX2NjYikgeworCQlpZiAoY3AgPT0gbHAtPmhlbGRfY2NiKSB7CisJCQlsaXN0X3NwbGljZV9pbml0KCZscC0+c2tpcF9jY2JxLCAmbHAtPndhaXRfY2NicSk7CisJCQlscC0+aGVsZF9jY2IgPSBOVUxMOworCQl9CisJfQorCisJLyoKKwkqKglDaGVjayBmb3IgcGFyaXR5IGVycm9ycy4KKwkqLworCisJaWYgKGNwLT5wYXJpdHlfc3RhdHVzID4gMSkgeworCQlQUklOVF9BRERSKGNtZCwgIiVkIHBhcml0eSBlcnJvcihzKS5cbiIsY3AtPnBhcml0eV9zdGF0dXMpOworCX0KKworCS8qCisJKioJQ2hlY2sgZm9yIGV4dGVuZGVkIGVycm9ycy4KKwkqLworCisJaWYgKGNwLT54ZXJyX3N0YXR1cyAhPSBYRV9PSykgeworCQlzd2l0Y2ggKGNwLT54ZXJyX3N0YXR1cykgeworCQljYXNlIFhFX0VYVFJBX0RBVEE6CisJCQlQUklOVF9BRERSKGNtZCwgImV4dHJhbmVvdXMgZGF0YSBkaXNjYXJkZWQuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFhFX0JBRF9QSEFTRToKKwkJCVBSSU5UX0FERFIoY21kLCAiaW52YWxpZCBzY3NpIHBoYXNlICg0LzUpLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBSSU5UX0FERFIoY21kLCAiZXh0ZW5kZWQgZXJyb3IgJWQuXG4iLAorCQkJCQljcC0+eGVycl9zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwLT5ob3N0X3N0YXR1cz09SFNfQ09NUExFVEUpCisJCQljcC0+aG9zdF9zdGF0dXMgPSBIU19GQUlMOworCX0KKworCS8qCisJKioJUHJpbnQgb3V0IGFueSBlcnJvciBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCisJKi8KKwlpZiAoREVCVUdfRkxBR1MgJiAoREVCVUdfUkVTVUxUfERFQlVHX1RJTlkpKSB7CisJCWlmIChjcC0+aG9zdF9zdGF0dXMhPUhTX0NPTVBMRVRFIHx8IGNwLT5zY3NpX3N0YXR1cyE9U19HT09EKSB7CisJCQlQUklOVF9BRERSKGNtZCwgIkVSUk9SOiBjbWQ9JXggaG9zdF9zdGF0dXM9JXggIgorCQkJCQkic2NzaV9zdGF0dXM9JXhcbiIsIGNtZC0+Y21uZFswXSwKKwkJCQkJY3AtPmhvc3Rfc3RhdHVzLCBjcC0+c2NzaV9zdGF0dXMpOworCQl9CisJfQorCisJLyoKKwkqKglDaGVjayB0aGUgc3RhdHVzLgorCSovCisJaWYgKCAgIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUpCisJCSYmIChjcC0+c2NzaV9zdGF0dXMgPT0gU19HT09EIHx8CisJCSAgICBjcC0+c2NzaV9zdGF0dXMgPT0gU19DT05EX01FVCkpIHsKKwkJLyoKKwkJICoJQWxsIHdlbnQgd2VsbCAoR09PRCBzdGF0dXMpLgorCQkgKglDT05ESVRJT04gTUVUIHN0YXR1cyBpcyByZXR1cm5lZCBvbiAKKwkJICoJYFByZS1GZXRjaCcgb3IgYFNlYXJjaCBkYXRhJyBzdWNjZXNzLgorCQkgKi8KKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9PSywgY3AtPnNjc2lfc3RhdHVzKTsKKworCQkvKgorCQkqKglAUkVTSURACisJCSoqCUNvdWxkIGRpZyBvdXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHJlc2lkLAorCQkqKglidXQgaXQgd291bGQgYmUgcXVpdGUgY29tcGxpY2F0ZWQuCisJCSovCisJCS8qIGlmIChjcC0+cGh5cy5oZWFkZXIubGFzdHAgIT0gY3AtPnBoeXMuaGVhZGVyLmdvYWxwKSAqLworCisJCS8qCisJCSoqCUFsbG9jYXRlIHRoZSBsY2IgaWYgbm90IHlldC4KKwkJKi8KKwkJaWYgKCFscCkKKwkJCW5jcl9hbGxvY19sY2IgKG5wLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCisJCXRwLT5ieXRlcyAgICAgKz0gY3AtPmRhdGFfbGVuOworCQl0cC0+dHJhbnNmZXJzICsrOworCisJCS8qCisJCSoqCUlmIHRhZ3Mgd2FzIHJlZHVjZWQgZHVlIHRvIHF1ZXVlIGZ1bGwsCisJCSoqCWluY3JlYXNlIHRhZ3MgaWYgMTAwMCBnb29kIHN0YXR1cyByZWNlaXZlZC4KKwkJKi8KKwkJaWYgKGxwICYmIGxwLT51c2V0YWdzICYmIGxwLT5udW10YWdzIDwgbHAtPm1heHRhZ3MpIHsKKwkJCSsrbHAtPm51bV9nb29kOworCQkJaWYgKGxwLT5udW1fZ29vZCA+PSAxMDAwKSB7CisJCQkJbHAtPm51bV9nb29kID0gMDsKKwkJCQkrK2xwLT5udW10YWdzOworCQkJCW5jcl9zZXR1cF90YWdzIChucCwgY21kLT5kZXZpY2UpOworCQkJfQorCQl9CisJfSBlbHNlIGlmICgoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0NPTVBMRVRFKQorCQkmJiAoY3AtPnNjc2lfc3RhdHVzID09IFNfQ0hFQ0tfQ09ORCkpIHsKKwkJLyoKKwkJKiogICBDaGVjayBjb25kaXRpb24gY29kZQorCQkqLworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX09LLCBTX0NIRUNLX0NPTkQpOworCisJCS8qCisJCSoqCUNvcHkgYmFjayBzZW5zZSBkYXRhIHRvIGNhbGxlcidzIGJ1ZmZlci4KKwkJKi8KKwkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCBjcC0+c2Vuc2VfYnVmLAorCQkgICAgICAgbWluKHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlciksIHNpemVvZihjcC0+c2Vuc2VfYnVmKSkpOworCisJCWlmIChERUJVR19GTEFHUyAmIChERUJVR19SRVNVTFR8REVCVUdfVElOWSkpIHsKKwkJCXVfY2hhciAqIHAgPSAodV9jaGFyKikgJiBjbWQtPnNlbnNlX2J1ZmZlcjsKKwkJCWludCBpOworCQkJUFJJTlRfQUREUihjbWQsICJzZW5zZSBkYXRhOiIpOworCQkJZm9yIChpPTA7IGk8MTQ7IGkrKykgcHJpbnRrICgiICV4IiwgKnArKyk7CisJCQlwcmludGsgKCIuXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAoKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19DT01QTEVURSkKKwkJJiYgKGNwLT5zY3NpX3N0YXR1cyA9PSBTX0NPTkZMSUNUKSkgeworCQkvKgorCQkqKiAgIFJlc2VydmF0aW9uIENvbmZsaWN0IGNvbmRpdGlvbiBjb2RlCisJCSovCisJCWNtZC0+cmVzdWx0ID0gU2NzaVJlc3VsdChESURfT0ssIFNfQ09ORkxJQ1QpOworCQorCX0gZWxzZSBpZiAoKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19DT01QTEVURSkKKwkJJiYgKGNwLT5zY3NpX3N0YXR1cyA9PSBTX0JVU1kgfHwKKwkJICAgIGNwLT5zY3NpX3N0YXR1cyA9PSBTX1FVRVVFX0ZVTEwpKSB7CisKKwkJLyoKKwkJKiogICBUYXJnZXQgaXMgYnVzeS4KKwkJKi8KKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9PSywgY3AtPnNjc2lfc3RhdHVzKTsKKworCX0gZWxzZSBpZiAoKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19TRUxfVElNRU9VVCkKKwkJfHwgKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19USU1FT1VUKSkgeworCisJCS8qCisJCSoqICAgTm8gcmVzcG9uc2UKKwkJKi8KKwkJY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KERJRF9USU1FX09VVCwgY3AtPnNjc2lfc3RhdHVzKTsKKworCX0gZWxzZSBpZiAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX1JFU0VUKSB7CisKKwkJLyoKKwkJKiogICBTQ1NJIGJ1cyByZXNldAorCQkqLworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX1JFU0VULCBjcC0+c2NzaV9zdGF0dXMpOworCisJfSBlbHNlIGlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQUJPUlRFRCkgeworCisJCS8qCisJCSoqICAgVHJhbnNmZXIgYWJvcnRlZAorCQkqLworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0FCT1JULCBjcC0+c2NzaV9zdGF0dXMpOworCisJfSBlbHNlIHsKKworCQkvKgorCQkqKiAgT3RoZXIgcHJvdG9jb2wgbWVzc2VzCisJCSovCisJCVBSSU5UX0FERFIoY21kLCAiQ09NTUFORCBGQUlMRUQgKCV4ICV4KSBAJXAuXG4iLAorCQkJY3AtPmhvc3Rfc3RhdHVzLCBjcC0+c2NzaV9zdGF0dXMsIGNwKTsKKworCQljbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoRElEX0VSUk9SLCBjcC0+c2NzaV9zdGF0dXMpOworCX0KKworCS8qCisJKioJdHJhY2Ugb3V0cHV0CisJKi8KKworCWlmICh0cC0+dXNyZmxhZyAmIFVGX1RSQUNFKSB7CisJCXVfY2hhciAqIHA7CisJCWludCBpOworCQlQUklOVF9BRERSKGNtZCwgIiBDTUQ6Iik7CisJCXAgPSAodV9jaGFyKikgJmNtZC0+Y21uZFswXTsKKwkJZm9yIChpPTA7IGk8Y21kLT5jbWRfbGVuOyBpKyspIHByaW50ayAoIiAleCIsICpwKyspOworCisJCWlmIChjcC0+aG9zdF9zdGF0dXM9PUhTX0NPTVBMRVRFKSB7CisJCQlzd2l0Y2ggKGNwLT5zY3NpX3N0YXR1cykgeworCQkJY2FzZSBTX0dPT0Q6CisJCQkJcHJpbnRrICgiICBHT09EIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfQ0hFQ0tfQ09ORDoKKwkJCQlwcmludGsgKCIgIFNFTlNFOiIpOworCQkJCXAgPSAodV9jaGFyKikgJmNtZC0+c2Vuc2VfYnVmZmVyOworCQkJCWZvciAoaT0wOyBpPDE0OyBpKyspCisJCQkJCXByaW50ayAoIiAleCIsICpwKyspOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsgKCIgIFNUQVQ6ICV4XG4iLCBjcC0+c2NzaV9zdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgcHJpbnRrICgiICBIT1NURVJST1I6ICV4IiwgY3AtPmhvc3Rfc3RhdHVzKTsKKwkJcHJpbnRrICgiXG4iKTsKKwl9CisKKwkvKgorCSoqCUZyZWUgdGhpcyBjY2IKKwkqLworCW5jcl9mcmVlX2NjYiAobnAsIGNwKTsKKworCS8qCisJKioJcmVxdWV1ZSBhd2FpdGluZyBzY3NpIGNvbW1hbmRzIGZvciB0aGlzIGx1bi4KKwkqLworCWlmIChscCAmJiBscC0+cXVldWVkY2NicyA8IGxwLT5xdWV1ZWRlcHRoICYmCisJICAgICFsaXN0X2VtcHR5KCZscC0+d2FpdF9jY2JxKSkKKwkJbmNyX3N0YXJ0X25leHRfY2NiKG5wLCBscCwgMik7CisKKwkvKgorCSoqCXJlcXVldWUgYXdhaXRpbmcgc2NzaSBjb21tYW5kcyBmb3IgdGhpcyBjb250cm9sbGVyLgorCSovCisJaWYgKG5wLT53YWl0aW5nX2xpc3QpCisJCXJlcXVldWVfd2FpdGluZ19saXN0KG5wKTsKKworCS8qCisJKioJc2lnbmFsIGNvbXBsZXRpb24gdG8gZ2VuZXJpYyBkcml2ZXIuCisJKi8KKwluY3JfcXVldWVfZG9uZV9jbWQobnAsIGNtZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglTaWduYWwgYWxsIChvciBvbmUpIGNvbnRyb2wgYmxvY2sgZG9uZS4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKioJVGhpcyBDQ0IgaGFzIGJlZW4gc2tpcHBlZCBieSB0aGUgTkNSLgorKioJUXVldWUgaXQgaW4gdGhlIGNvcnJlcG9uZGluZyB1bml0IHF1ZXVlLgorKi8KK3N0YXRpYyB2b2lkIG5jcl9jY2Jfc2tpcHBlZChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3ApCit7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlzdHJ1Y3QgbGNiICpscCA9IHRwLT5scFtjcC0+bHVuXTsKKworCWlmIChscCAmJiBjcCAhPSBucC0+Y2NiKSB7CisJCWNwLT5ob3N0X3N0YXR1cyAmPSB+SFNfU0tJUE1BU0s7CisJCWNwLT5zdGFydC5zY2hlZHVsZS5sX3BhZGRyID0gCisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHNlbGVjdCkpOworCQlsaXN0X2RlbCgmY3AtPmxpbmtfY2NicSk7CisJCWxpc3RfYWRkX3RhaWwoJmNwLT5saW5rX2NjYnEsICZscC0+c2tpcF9jY2JxKTsKKwkJaWYgKGNwLT5xdWV1ZWQpIHsKKwkJCS0tbHAtPnF1ZXVlZGNjYnM7CisJCX0KKwl9CisJaWYgKGNwLT5xdWV1ZWQpIHsKKwkJLS1ucC0+cXVldWVkY2NiczsKKwkJY3AtPnF1ZXVlZCA9IDA7CisJfQorfQorCisvKgorKioJVGhlIE5DUiBoYXMgY29tcGxldGVkIENDQnMuCisqKglMb29rIGF0IHRoZSBET05FIFFVRVVFIGlmIGVuYWJsZWQsIG90aGVyd2lzZSBzY2FuIGFsbCBDQ0JzCisqLwordm9pZCBuY3Jfd2FrZXVwX2RvbmUgKHN0cnVjdCBuY2IgKm5wKQoreworCXN0cnVjdCBjY2IgKmNwOworI2lmZGVmIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKwlpbnQgaSwgajsKKworCWkgPSBucC0+Y2NiX2RvbmVfaWM7CisJd2hpbGUgKDEpIHsKKwkJaiA9IGkrMTsKKwkJaWYgKGogPj0gTUFYX0RPTkUpCisJCQlqID0gMDsKKworCQljcCA9IG5wLT5jY2JfZG9uZVtqXTsKKwkJaWYgKCFDQ0JfRE9ORV9WQUxJRChjcCkpCisJCQlicmVhazsKKworCQlucC0+Y2NiX2RvbmVbal0gPSAoc3RydWN0IGNjYiAqKUNDQl9ET05FX0VNUFRZOworCQlucC0+c2NyaXB0aC0+ZG9uZV9xdWV1ZVs1KmogKyA0XSA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkb25lX3BsdWcpKTsKKwkJTUVNT1JZX0JBUlJJRVIoKTsKKwkJbnAtPnNjcmlwdGgtPmRvbmVfcXVldWVbNSppICsgNF0gPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgZG9uZV9lbmQpKTsKKworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzICYgSFNfRE9ORU1BU0spCisJCQluY3JfY29tcGxldGUgKG5wLCBjcCk7CisJCWVsc2UgaWYgKGNwLT5ob3N0X3N0YXR1cyAmIEhTX1NLSVBNQVNLKQorCQkJbmNyX2NjYl9za2lwcGVkIChucCwgY3ApOworCisJCWkgPSBqOworCX0KKwlucC0+Y2NiX2RvbmVfaWMgPSBpOworI2Vsc2UKKwljcCA9IG5wLT5jY2I7CisJd2hpbGUgKGNwKSB7CisJCWlmIChjcC0+aG9zdF9zdGF0dXMgJiBIU19ET05FTUFTSykKKwkJCW5jcl9jb21wbGV0ZSAobnAsIGNwKTsKKwkJZWxzZSBpZiAoY3AtPmhvc3Rfc3RhdHVzICYgSFNfU0tJUE1BU0spCisJCQluY3JfY2NiX3NraXBwZWQgKG5wLCBjcCk7CisJCWNwID0gY3AtPmxpbmtfY2NiOworCX0KKyNlbmRpZgorfQorCisvKgorKioJQ29tcGxldGUgYWxsIGFjdGl2ZSBDQ0JzLgorKi8KK3ZvaWQgbmNyX3dha2V1cCAoc3RydWN0IG5jYiAqbnAsIHVfbG9uZyBjb2RlKQoreworCXN0cnVjdCBjY2IgKmNwID0gbnAtPmNjYjsKKworCXdoaWxlIChjcCkgeworCQlpZiAoY3AtPmhvc3Rfc3RhdHVzICE9IEhTX0lETEUpIHsKKwkJCWNwLT5ob3N0X3N0YXR1cyA9IGNvZGU7CisJCQluY3JfY29tcGxldGUgKG5wLCBjcCk7CisJCX0KKwkJY3AgPSBjcC0+bGlua19jY2I7CisJfQorfQorCisvKgorKiogUmVzZXQgbmNyIGNoaXAuCisqLworCisvKiBTb21lIGluaXRpYWxpc2F0aW9uIG11c3QgYmUgZG9uZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgcmVzZXQsIGZvciA1M2M3MjAsCisgKiBhdCBsZWFzdC4gIEVBIChkY250bCBiaXQgNSkgaXNuJ3Qgc2V0IGhlcmUgYXMgaXQgaXMgc2V0IG9uY2Ugb25seSBpbgorICogdGhlIF9kZXRlY3QgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIG5jcl9jaGlwX3Jlc2V0KHN0cnVjdCBuY2IgKm5wLCBpbnQgZGVsYXkpCit7CisJT1VUQiAobmNfaXN0YXQsICBTUlNUKTsKKwl1ZGVsYXkoZGVsYXkpOworCU9VVEIgKG5jX2lzdGF0LCAgMCAgICk7CisKKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRUhQKQorCQlPVVRCIChuY19jdGVzdDAsIEVIUCk7CisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX01VWCkKKwkJT1VUQiAobmNfY3Rlc3Q0LCBNVVgpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglTdGFydCBOQ1IgY2hpcC4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCit2b2lkIG5jcl9pbml0IChzdHJ1Y3QgbmNiICpucCwgaW50IHJlc2V0LCBjaGFyICogbXNnLCB1X2xvbmcgY29kZSkKK3sKKyAJaW50CWk7CisKKyAJLyoKKwkqKglSZXNldCBjaGlwIGlmIGFza2VkLCBvdGhlcndpc2UganVzdCBjbGVhciBmaWZvcy4KKyAJKi8KKworCWlmIChyZXNldCkgeworCQlPVVRCIChuY19pc3RhdCwgIFNSU1QpOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJZWxzZSB7CisJCU9VVEIgKG5jX3N0ZXN0MywgVEV8Q1NGKTsKKwkJT1VUT05CIChuY19jdGVzdDMsIENMRik7CisJfQorIAorCS8qCisJKioJTWVzc2FnZS4KKwkqLworCisJaWYgKG1zZykgcHJpbnRrIChLRVJOX0lORk8gIiVzOiByZXN0YXJ0ICglcykuXG4iLCBuY3JfbmFtZSAobnApLCBtc2cpOworCisJLyoKKwkqKglDbGVhciBTdGFydCBRdWV1ZQorCSovCisJbnAtPnF1ZXVlZGVwdGggPSBNQVhfU1RBUlQgLSAxOwkvKiAxIGVudHJ5IG5lZWRlZCBhcyBlbmQgbWFya2VyICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9TVEFSVCArIE1BWF9TVEFSVDsgaSArPSAyKQorCQlucC0+c2NyaXB0aDAtPnRyeWxvb3BbaV0gPQorCQkJCWNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgaWRsZSkpOworCisJLyoKKwkqKglTdGFydCBhdCBmaXJzdCBlbnRyeS4KKwkqLworCW5wLT5zcXVldWVwdXQgPSAwOworCW5wLT5zY3JpcHQwLT5zdGFydHBvc1swXSA9IGNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIHRyeWxvb3ApKTsKKworI2lmZGVmIFNDU0lfTkNSX0NDQl9ET05FX1NVUFBPUlQKKwkvKgorCSoqCUNsZWFyIERvbmUgUXVldWUKKwkqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE9ORTsgaSsrKSB7CisJCW5wLT5jY2JfZG9uZVtpXSA9IChzdHJ1Y3QgY2NiICopQ0NCX0RPTkVfRU1QVFk7CisJCW5wLT5zY3JpcHRoMC0+ZG9uZV9xdWV1ZVs1KmkgKyA0XSA9CisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGRvbmVfZW5kKSk7CisJfQorI2VuZGlmCisKKwkvKgorCSoqCVN0YXJ0IGF0IGZpcnN0IGVudHJ5LgorCSovCisJbnAtPnNjcmlwdDAtPmRvbmVfcG9zWzBdID0gY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCxkb25lX3F1ZXVlKSk7CisJbnAtPmNjYl9kb25lX2ljID0gTUFYX0RPTkUtMTsKKwlucC0+c2NyaXB0aDAtPmRvbmVfcXVldWVbNSooTUFYX0RPTkUtMSkgKyA0XSA9CisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGRvbmVfcGx1ZykpOworCisJLyoKKwkqKglXYWtldXAgYWxsIHBlbmRpbmcgam9icy4KKwkqLworCW5jcl93YWtldXAgKG5wLCBjb2RlKTsKKworCS8qCisJKioJSW5pdCBjaGlwLgorCSovCisKKwkvKgorCSoqIFJlbW92ZSByZXNldDsgYmlnIGRlbGF5IGJlY2F1c2UgdGhlIDg5NSBuZWVkcyB0aW1lIGZvciB0aGUKKwkqKiBidXMgbW9kZSB0byBzZXR0bGUKKwkqLworCW5jcl9jaGlwX3Jlc2V0KG5wLCAyMDAwKTsKKworCU9VVEIgKG5jX3NjbnRsMCwgbnAtPnJ2X3NjbnRsMCB8IDB4YzApOworCQkJCQkvKiAgZnVsbCBhcmIuLCBlbmEgcGFyaXR5LCBwYXItPkFUTiAgKi8KKwlPVVRCIChuY19zY250bDEsIDB4MDApOwkJLyogIG9kZCBwYXJpdHksIGFuZCByZW1vdmUgQ1JTVCEhICovCisKKwluY3Jfc2VsZWN0Y2xvY2sobnAsIG5wLT5ydl9zY250bDMpOwkvKiBTZWxlY3QgU0NTSSBjbG9jayAqLworCisJT1VUQiAobmNfc2NpZCAgLCBSUkV8bnAtPm15YWRkcik7CS8qIEFkYXB0ZXIgU0NTSSBhZGRyZXNzICovCisJT1VUVyAobmNfcmVzcGlkLCAxdWw8PG5wLT5teWFkZHIpOwkvKiBJZCB0byByZXNwb25kIHRvICovCisJT1VUQiAobmNfaXN0YXQgLCBTSUdQCSk7CQkvKiAgU2lnbmFsIFByb2Nlc3MgKi8KKwlPVVRCIChuY19kbW9kZSAsIG5wLT5ydl9kbW9kZSk7CQkvKiBCdXJzdCBsZW5ndGgsIGRtYSBtb2RlICovCisJT1VUQiAobmNfY3Rlc3Q1LCBucC0+cnZfY3Rlc3Q1KTsJLyogTGFyZ2UgZmlmbyArIGxhcmdlIGJ1cnN0ICovCisKKwlPVVRCIChuY19kY250bCAsIE5PQ09NfG5wLT5ydl9kY250bCk7CS8qIFByb3RlY3QgU0ZCUiAqLworCU9VVEIgKG5jX2N0ZXN0MCwgbnAtPnJ2X2N0ZXN0MCk7CS8qIDcyMDogQ0RJUyBhbmQgRUhQICovCisJT1VUQiAobmNfY3Rlc3QzLCBucC0+cnZfY3Rlc3QzKTsJLyogV3JpdGUgYW5kIGludmFsaWRhdGUgKi8KKwlPVVRCIChuY19jdGVzdDQsIG5wLT5ydl9jdGVzdDQpOwkvKiBNYXN0ZXIgcGFyaXR5IGNoZWNraW5nICovCisKKwlPVVRCIChuY19zdGVzdDIsIEVYVHxucC0+cnZfc3Rlc3QyKTsJLyogRXh0ZW5kZWQgU3JlcS9TYWNrIGZpbHRlcmluZyAqLworCU9VVEIgKG5jX3N0ZXN0MywgVEUpOwkJCS8qIFRvbGVyQU5UIGVuYWJsZSAqLworCU9VVEIgKG5jX3N0aW1lMCwgMHgwYwkpOwkJLyogSFRIIGRpc2FibGVkICBTVE8gMC4yNSBzZWMgKi8KKworCS8qCisJKioJRGlzYWJsZSBkaXNjb25uZWN0cy4KKwkqLworCisJbnAtPmRpc2MgPSAwOworCisJLyoKKwkqKiAgICBFbmFibGUgR1BJTzAgcGluIGZvciB3cml0aW5nIGlmIExFRCBzdXBwb3J0LgorCSovCisKKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfTEVEMCkgeworCQlPVVRPRkZCIChuY19ncGNudGwsIDB4MDEpOworCX0KKworCS8qCisJKiogICAgICBlbmFibGUgaW50cworCSovCisKKwlPVVRXIChuY19zaWVuICwgU1RPfEhUSHxNQXxTR0V8VURDfFJTVHxQQVIpOworCU9VVEIgKG5jX2RpZW4gLCBNRFBFfEJGfEFCUlR8U1NJfFNJUnxJSUQpOworCisJLyoKKwkqKglGaWxsIGluIHRhcmdldCBzdHJ1Y3R1cmUuCisJKioJUmVpbml0aWFsaXplIHVzcnN5bmMuCisJKioJUmVpbml0aWFsaXplIHVzcndpZGUuCisJKioJUHJlcGFyZSBzeW5jIG5lZ290aWF0aW9uIGFjY29yZGluZyB0byBhY3R1YWwgU0NTSSBidXMgbW9kZS4KKwkqLworCisJZm9yIChpPTA7aTxNQVhfVEFSR0VUO2krKykgeworCQlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W2ldOworCisJCXRwLT5zdmFsICAgID0gMDsKKwkJdHAtPnd2YWwgICAgPSBucC0+cnZfc2NudGwzOworCisJCWlmICh0cC0+dXNyc3luYyAhPSAyNTUpIHsKKwkJCWlmICh0cC0+dXNyc3luYyA8PSBucC0+bWF4c3luYykgeworCQkJCWlmICh0cC0+dXNyc3luYyA8IG5wLT5taW5zeW5jKSB7CisJCQkJCXRwLT51c3JzeW5jID0gbnAtPm1pbnN5bmM7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJCXRwLT51c3JzeW5jID0gMjU1OworCQl9CisKKwkJaWYgKHRwLT51c3J3aWRlID4gbnAtPm1heHdpZGUpCisJCQl0cC0+dXNyd2lkZSA9IG5wLT5tYXh3aWRlOworCisJfQorCisJLyoKKwkqKiAgICBTdGFydCBzY3JpcHQgcHJvY2Vzc29yLgorCSovCisJaWYgKG5wLT5wYWRkcjIpIHsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRrICgiJXM6IERvd25sb2FkaW5nIFNDU0kgU0NSSVBUUy5cbiIsCisJCQkJbmNyX25hbWUobnApKTsKKwkJT1VUTCAobmNfc2NyYXRjaGEsIHZ0b2J1cyhucC0+c2NyaXB0MCkpOworCQlPVVRMX0RTUCAoTkNCX1NDUklQVEhfUEhZUyAobnAsIHN0YXJ0X3JhbSkpOworCX0KKwllbHNlCisJCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBzdGFydCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglQcmVwYXJlIHRoZSBuZWdvdGlhdGlvbiB2YWx1ZXMgZm9yIHdpZGUgYW5kCisqKglzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBuY3JfbmVnb3RpYXRlIChzdHJ1Y3QgbmNiKiBucCwgc3RydWN0IHRjYiogdHApCit7CisJLyoKKwkqKgltaW5zeW5jIHVuaXQgaXMgNG5zICEKKwkqLworCisJdV9sb25nIG1pbnN5bmMgPSB0cC0+dXNyc3luYzsKKworCS8qCisJKioJU0NTSSBidXMgbW9kZSBsaW1pdAorCSovCisKKwlpZiAobnAtPnNjc2lfbW9kZSAmJiBucC0+c2NzaV9tb2RlID09IFNNT0RFX1NFKSB7CisJCWlmIChtaW5zeW5jIDwgMTIpIG1pbnN5bmMgPSAxMjsKKwl9CisKKwkvKgorCSoqCW91ciBsaW1pdCAuLgorCSovCisKKwlpZiAobWluc3luYyA8IG5wLT5taW5zeW5jKQorCQltaW5zeW5jID0gbnAtPm1pbnN5bmM7CisKKwkvKgorCSoqCWRpdmlkZXIgbGltaXQKKwkqLworCisJaWYgKG1pbnN5bmMgPiBucC0+bWF4c3luYykKKwkJbWluc3luYyA9IDI1NTsKKworCWlmICh0cC0+bWF4b2ZmcyA+IG5wLT5tYXhvZmZzKQorCQl0cC0+bWF4b2ZmcyA9IG5wLT5tYXhvZmZzOworCisJdHAtPm1pbnN5bmMgPSBtaW5zeW5jOworCXRwLT5tYXhvZmZzID0gKG1pbnN5bmM8MjU1ID8gdHAtPm1heG9mZnMgOiAwKTsKKworCS8qCisJKioJcGVyaW9kPTA6IGhhcyB0byBuZWdvdGlhdGUgc3luYyB0cmFuc2ZlcgorCSovCisKKwl0cC0+cGVyaW9kPTA7CisKKwkvKgorCSoqCXdpZGVkb25lPTA6IGhhcyB0byBuZWdvdGlhdGUgd2lkZSB0cmFuc2ZlcgorCSovCisJdHAtPndpZGVkb25lPTA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCUdldCBjbG9jayBmYWN0b3IgYW5kIHN5bmMgZGl2aXNvciBmb3IgYSBnaXZlbiAKKyoqCXN5bmNocm9ub3VzIGZhY3RvciBwZXJpb2QuCisqKglSZXR1cm5zIHRoZSBjbG9jayBmYWN0b3IgKGluIHN4ZmVyKSBhbmQgc2NudGwzIAorKioJc3luY2hyb25vdXMgZGl2aXNvciBmaWVsZC4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9nZXRzeW5jKHN0cnVjdCBuY2IgKm5wLCB1X2NoYXIgc2ZhYywgdV9jaGFyICpmYWtwLCB1X2NoYXIgKnNjbnRsM3ApCit7CisJdV9sb25nCWNsayA9IG5wLT5jbG9ja19raHo7CS8qIFNDU0kgY2xvY2sgZnJlcXVlbmN5IGluIGtIegkqLworCWludAlkaXYgPSBucC0+Y2xvY2tfZGl2bjsJLyogTnVtYmVyIG9mIGRpdmlzb3JzIHN1cHBvcnRlZAkqLworCXVfbG9uZwlmYWs7CQkJLyogU3luYyBmYWN0b3IgaW4gc3hmZXIJCSovCisJdV9sb25nCXBlcjsJCQkvKiBQZXJpb2QgaW4gdGVudGhzIG9mIG5zCSovCisJdV9sb25nCWtwYzsJCQkvKiAocGVyICogY2xrKQkJCSovCisKKwkvKgorCSoqCUNvbXB1dGUgdGhlIHN5bmNocm9ub3VzIHBlcmlvZCBpbiB0ZW50aHMgb2YgbmFuby1zZWNvbmRzCisJKi8KKwlpZgkoc2ZhYyA8PSAxMCkJcGVyID0gMjUwOworCWVsc2UgaWYJKHNmYWMgPT0gMTEpCXBlciA9IDMwMzsKKwllbHNlIGlmCShzZmFjID09IDEyKQlwZXIgPSA1MDA7CisJZWxzZQkJCXBlciA9IDQwICogc2ZhYzsKKworCS8qCisJKioJTG9vayBmb3IgdGhlIGdyZWF0ZXN0IGNsb2NrIGRpdmlzb3IgdGhhdCBhbGxvd3MgYW4gCisJKioJaW5wdXQgc3BlZWQgZmFzdGVyIHRoYW4gdGhlIHBlcmlvZC4KKwkqLworCWtwYyA9IHBlciAqIGNsazsKKwl3aGlsZSAoLS1kaXYgPj0gMCkKKwkJaWYgKGtwYyA+PSAoZGl2XzEwTVtkaXZdIDw8IDIpKSBicmVhazsKKworCS8qCisJKioJQ2FsY3VsYXRlIHRoZSBsb3dlc3QgY2xvY2sgZmFjdG9yIHRoYXQgYWxsb3dzIGFuIG91dHB1dCAKKwkqKglzcGVlZCBub3QgZmFzdGVyIHRoYW4gdGhlIHBlcmlvZC4KKwkqLworCWZhayA9IChrcGMgLSAxKSAvIGRpdl8xME1bZGl2XSArIDE7CisKKyNpZiAwCS8qIFRoaXMgb3B0aW1pemF0aW9uIGRvZXMgbm90IHNlZW0gdmVyeSB1c2VmdWwgKi8KKworCXBlciA9IChmYWsgKiBkaXZfMTBNW2Rpdl0pIC8gY2xrOworCisJLyoKKwkqKglXaHkgbm90IHRvIHRyeSB0aGUgaW1tZWRpYXRlIGxvd2VyIGRpdmlzb3IgYW5kIHRvIGNob29zZSAKKwkqKgl0aGUgb25lIHRoYXQgYWxsb3dzIHRoZSBmYXN0ZXN0IG91dHB1dCBzcGVlZCA/CisJKioJV2UgZG9uJ3Qgd2FudCBpbnB1dCBzcGVlZCB0b28gbXVjaCBncmVhdGVyIHRoYW4gb3V0cHV0IHNwZWVkLgorCSovCisJaWYgKGRpdiA+PSAxICYmIGZhayA8IDgpIHsKKwkJdV9sb25nIGZhazIsIHBlcjI7CisJCWZhazIgPSAoa3BjIC0gMSkgLyBkaXZfMTBNW2Rpdi0xXSArIDE7CisJCXBlcjIgPSAoZmFrMiAqIGRpdl8xME1bZGl2LTFdKSAvIGNsazsKKwkJaWYgKHBlcjIgPCBwZXIgJiYgZmFrMiA8PSA4KSB7CisJCQlmYWsgPSBmYWsyOworCQkJcGVyID0gcGVyMjsKKwkJCS0tZGl2OworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoZmFrIDwgNCkgZmFrID0gNDsJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiwgdG9vIGJhZCAuLi4gKi8KKworCS8qCisJKioJQ29tcHV0ZSBhbmQgcmV0dXJuIHN5bmMgcGFyYW1ldGVycyBmb3IgdGhlIG5jcgorCSovCisJKmZha3AJCT0gZmFrIC0gNDsKKwkqc2NudGwzcAk9ICgoZGl2KzEpIDw8IDQpICsgKHNmYWMgPCAyNSA/IDB4ODAgOiAwKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglTZXQgYWN0dWFsIHZhbHVlcywgc3luYyBzdGF0dXMgYW5kIHBhdGNoIGFsbCBjY2JzIG9mIAorKioJYSB0YXJnZXQgYWNjb3JkaW5nIHRvIG5ldyBzeW5jL3dpZGUgYWdyZWVtZW50LgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgbmNyX3NldF9zeW5jX3dpZGVfc3RhdHVzIChzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHRhcmdldCkKK3sKKwlzdHJ1Y3QgY2NiICpjcDsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisKKwkvKgorCSoqCXNldCBhY3R1YWwgdmFsdWUgYW5kIHN5bmNfc3RhdHVzCisJKi8KKwlPVVRCIChuY19zeGZlciwgdHAtPnN2YWwpOworCW5wLT5zeW5jX3N0ID0gdHAtPnN2YWw7CisJT1VUQiAobmNfc2NudGwzLCB0cC0+d3ZhbCk7CisJbnAtPndpZGVfc3QgPSB0cC0+d3ZhbDsKKworCS8qCisJKioJcGF0Y2ggQUxMIGNjYnMgb2YgdGhpcyB0YXJnZXQuCisJKi8KKwlmb3IgKGNwID0gbnAtPmNjYjsgY3A7IGNwID0gY3AtPmxpbmtfY2NiKSB7CisJCWlmICghY3AtPmNtZCkgY29udGludWU7CisJCWlmIChjcC0+Y21kLT5kZXZpY2UtPmlkICE9IHRhcmdldCkgY29udGludWU7CisjaWYgMAorCQljcC0+c3luY19zdGF0dXMgPSB0cC0+c3ZhbDsKKwkJY3AtPndpZGVfc3RhdHVzID0gdHAtPnd2YWw7CisjZW5kaWYKKwkJY3AtPnBoeXMuc2VsZWN0LnNlbF9zY250bDMgPSB0cC0+d3ZhbDsKKwkJY3AtPnBoeXMuc2VsZWN0LnNlbF9zeGZlciAgPSB0cC0+c3ZhbDsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVN3aXRjaCBzeW5jIG1vZGUgZm9yIGN1cnJlbnQgam9iIGFuZCBpdCdzIHRhcmdldAorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgbmNyX3NldHN5bmMgKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCwgdV9jaGFyIHNjbnRsMywgdV9jaGFyIHN4ZmVyKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGNwLT5jbWQ7CisJc3RydWN0IHRjYiAqdHA7CisJdV9jaGFyIHRhcmdldCA9IElOQiAobmNfc2RpZCkgJiAweDBmOworCXVfY2hhciBpZGl2OworCisJQlVHX09OKHRhcmdldCAhPSAoY21kLT5kZXZpY2UtPmlkICYgMHhmKSk7CisKKwl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisKKwlpZiAoIXNjbnRsMyB8fCAhKHN4ZmVyICYgMHgxZikpCisJCXNjbnRsMyA9IG5wLT5ydl9zY250bDM7CisJc2NudGwzID0gKHNjbnRsMyAmIDB4ZjApIHwgKHRwLT53dmFsICYgRVdTKSB8IChucC0+cnZfc2NudGwzICYgMHgwNyk7CisKKwkvKgorCSoqCURlZHVjZSB0aGUgdmFsdWUgb2YgY29udHJvbGxlciBzeW5jIHBlcmlvZCBmcm9tIHNjbnRsMy4KKwkqKglwZXJpb2QgaXMgaW4gdGVudGhzIG9mIG5hbm8tc2Vjb25kcy4KKwkqLworCisJaWRpdiA9ICgoc2NudGwzID4+IDQpICYgMHg3KTsKKwlpZiAoKHN4ZmVyICYgMHgxZikgJiYgaWRpdikKKwkJdHAtPnBlcmlvZCA9ICgoKHN4ZmVyPj41KSs0KSpkaXZfMTBNW2lkaXYtMV0pL25wLT5jbG9ja19raHo7CisJZWxzZQorCQl0cC0+cGVyaW9kID0gMHhmZmZmOworCisJLyogU3RvcCB0aGVyZSBpZiBzeW5jIHBhcmFtZXRlcnMgYXJlIHVuY2hhbmdlZCAqLworCWlmICh0cC0+c3ZhbCA9PSBzeGZlciAmJiB0cC0+d3ZhbCA9PSBzY250bDMpCisJCXJldHVybjsKKwl0cC0+c3ZhbCA9IHN4ZmVyOworCXRwLT53dmFsID0gc2NudGwzOworCisJaWYgKHN4ZmVyICYgMHgwMWYpIHsKKwkJLyogRGlzYWJsZSBleHRlbmRlZCBTcmVxL1NhY2sgZmlsdGVyaW5nICovCisJCWlmICh0cC0+cGVyaW9kIDw9IDIwMDApCisJCQlPVVRPRkZCKG5jX3N0ZXN0MiwgRVhUKTsKKwl9CisgCisJc3BpX2Rpc3BsYXlfeGZlcl9hZ3JlZW1lbnQodHAtPnN0YXJnZXQpOworCisJLyoKKwkqKglzZXQgYWN0dWFsIHZhbHVlIGFuZCBzeW5jX3N0YXR1cworCSoqCXBhdGNoIEFMTCBjY2JzIG9mIHRoaXMgdGFyZ2V0LgorCSovCisJbmNyX3NldF9zeW5jX3dpZGVfc3RhdHVzKG5wLCB0YXJnZXQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglTd2l0Y2ggd2lkZSBtb2RlIGZvciBjdXJyZW50IGpvYiBhbmQgaXQncyB0YXJnZXQKKyoqCVNDU0kgc3BlY3Mgc2F5OiBhIFNDU0kgZGV2aWNlIHRoYXQgYWNjZXB0cyBhIFdEVFIgCisqKgltZXNzYWdlIHNoYWxsIHJlc2V0IHRoZSBzeW5jaHJvbm91cyBhZ3JlZW1lbnQgdG8gCisqKglhc3luY2hyb25vdXMgbW9kZS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9zZXR3aWRlIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3AsIHVfY2hhciB3aWRlLCB1X2NoYXIgYWNrKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGNwLT5jbWQ7CisJdTE2IHRhcmdldCA9IElOQiAobmNfc2RpZCkgJiAweDBmOworCXN0cnVjdCB0Y2IgKnRwOworCXVfY2hhcglzY250bDM7CisJdV9jaGFyCXN4ZmVyOworCisJQlVHX09OKHRhcmdldCAhPSAoY21kLT5kZXZpY2UtPmlkICYgMHhmKSk7CisKKwl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJdHAtPndpZGVkb25lICA9ICB3aWRlKzE7CisJc2NudGwzID0gKHRwLT53dmFsICYgKH5FV1MpKSB8ICh3aWRlID8gRVdTIDogMCk7CisKKwlzeGZlciA9IGFjayA/IDAgOiB0cC0+c3ZhbDsKKworCS8qCisJKioJIFN0b3AgdGhlcmUgaWYgc3luYy93aWRlIHBhcmFtZXRlcnMgYXJlIHVuY2hhbmdlZAorCSovCisJaWYgKHRwLT5zdmFsID09IHN4ZmVyICYmIHRwLT53dmFsID09IHNjbnRsMykgcmV0dXJuOworCXRwLT5zdmFsID0gc3hmZXI7CisJdHAtPnd2YWwgPSBzY250bDM7CisKKwkvKgorCSoqCUJlbGxzIGFuZCB3aGlzdGxlcyAgIDstKQorCSovCisJaWYgKGJvb3R2ZXJib3NlID49IDIpIHsKKwkJZGV2X2luZm8oJmNtZC0+ZGV2aWNlLT5zZGV2X3RhcmdldC0+ZGV2LCAiV0lERSBTQ1NJICVzYWJsZWQuXG4iLAorCQkJCShzY250bDMgJiBFV1MpID8gImVuIiA6ICJkaXMiKTsKKwl9CisKKwkvKgorCSoqCXNldCBhY3R1YWwgdmFsdWUgYW5kIHN5bmNfc3RhdHVzCisJKioJcGF0Y2ggQUxMIGNjYnMgb2YgdGhpcyB0YXJnZXQuCisJKi8KKwluY3Jfc2V0X3N5bmNfd2lkZV9zdGF0dXMobnAsIHRhcmdldCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVN3aXRjaCB0YWdnZWQgbW9kZSBmb3IgYSB0YXJnZXQuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgdm9pZCBuY3Jfc2V0dXBfdGFncyAoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwl1bnNpZ25lZCBjaGFyIHRuID0gc2Rldi0+aWQsIGxuID0gc2Rldi0+bHVuOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBsY2IgKmxwID0gdHAtPmxwW2xuXTsKKwl1X2NoYXIgICByZXF0YWdzLCBtYXhkZXB0aDsKKworCS8qCisJKioJSnVzdCBpbiBjYXNlIC4uLgorCSovCisJaWYgKCghdHApIHx8ICghbHApIHx8ICFzZGV2KQorCQlyZXR1cm47CisKKwkvKgorCSoqCUlmIFNDU0kgZGV2aWNlIHF1ZXVlIGRlcHRoIGlzIG5vdCB5ZXQgc2V0LCBsZWF2ZSBoZXJlLgorCSovCisJaWYgKCFscC0+c2NkZXZfZGVwdGgpCisJCXJldHVybjsKKworCS8qCisJKioJRG9ubm90IGFsbG93IG1vcmUgdGFncyB0aGFuIHRoZSBTQ1NJIGRyaXZlciBjYW4gcXVldWUgCisJKioJZm9yIHRoaXMgZGV2aWNlLgorCSoqCURvbm5vdCBhbGxvdyBtb3JlIHRhZ3MgdGhhbiB3ZSBjYW4gaGFuZGxlLgorCSovCisJbWF4ZGVwdGggPSBscC0+c2NkZXZfZGVwdGg7CisJaWYgKG1heGRlcHRoID4gbHAtPm1heG54cykJbWF4ZGVwdGggICAgPSBscC0+bWF4bnhzOworCWlmIChscC0+bWF4dGFncyA+IG1heGRlcHRoKQlscC0+bWF4dGFncyA9IG1heGRlcHRoOworCWlmIChscC0+bnVtdGFncyA+IG1heGRlcHRoKQlscC0+bnVtdGFncyA9IG1heGRlcHRoOworCisJLyoKKwkqKglvbmx5IGRldmljZXMgY29uZm9ybWFudCB0byBBTlNJIFZlcnNpb24gPj0gMgorCSoqCW9ubHkgZGV2aWNlcyBjYXBhYmxlIG9mIHRhZ2dlZCBjb21tYW5kcworCSoqCW9ubHkgaWYgZW5hYmxlZCBieSB1c2VyIC4uCisJKi8KKwlpZiAoc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCAmJiBscC0+bnVtdGFncyA+IDEpIHsKKwkJcmVxdGFncyA9IGxwLT5udW10YWdzOworCX0gZWxzZSB7CisJCXJlcXRhZ3MgPSAxOworCX0KKworCS8qCisJKioJVXBkYXRlIG1heCBudW1iZXIgb2YgdGFncworCSovCisJbHAtPm51bXRhZ3MgPSByZXF0YWdzOworCWlmIChscC0+bnVtdGFncyA+IGxwLT5tYXh0YWdzKQorCQlscC0+bWF4dGFncyA9IGxwLT5udW10YWdzOworCisJLyoKKwkqKglJZiB3ZSB3YW50IHRvIHN3aXRjaCB0YWcgbW9kZSwgd2UgbXVzdCB3YWl0IAorCSoqCWZvciBubyBDQ0IgdG8gYmUgYWN0aXZlLgorCSovCisJaWYJKHJlcXRhZ3MgPiAxICYmIGxwLT51c2V0YWdzKSB7CSAvKiBTdGF5IGluIHRhZ2dlZCBtb2RlICAgICovCisJCWlmIChscC0+cXVldWVkZXB0aCA9PSByZXF0YWdzKQkgLyogQWxyZWFkeSBhbm5vdW5jZWQJICAgKi8KKwkJCXJldHVybjsKKwkJbHAtPnF1ZXVlZGVwdGgJPSByZXF0YWdzOworCX0KKwllbHNlIGlmCShyZXF0YWdzIDw9IDEgJiYgIWxwLT51c2V0YWdzKSB7IC8qIFN0YXkgaW4gdW50YWdnZWQgbW9kZSAgKi8KKwkJbHAtPnF1ZXVlZGVwdGgJPSByZXF0YWdzOworCQlyZXR1cm47CisJfQorCWVsc2UgewkJCQkJIC8qIFdhbnQgdG8gc3dpdGNoIHRhZyBtb2RlICovCisJCWlmIChscC0+YnVzeWNjYnMpCQkgLyogSWYgbm90IHlldCBzYWZlLCByZXR1cm4gKi8KKwkJCXJldHVybjsKKwkJbHAtPnF1ZXVlZGVwdGgJPSByZXF0YWdzOworCQlscC0+dXNldGFncwk9IHJlcXRhZ3MgPiAxID8gMSA6IDA7CisJfQorCisJLyoKKwkqKglQYXRjaCB0aGUgbHVuIG1pbmktc2NyaXB0LCBhY2NvcmRpbmcgdG8gdGFnIG1vZGUuCisJKi8KKwlscC0+anVtcF90YWcubF9wYWRkciA9IGxwLT51c2V0YWdzPworCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUX1BIWVMobnAsIHJlc2VsX3RhZykpIDoKKwkJCWNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTKG5wLCByZXNlbF9ub3RhZykpOworCisJLyoKKwkqKglBbm5vdW5jZSBjaGFuZ2UgdG8gdXNlci4KKwkqLworCWlmIChib290dmVyYm9zZSkgeworCQlpZiAobHAtPnVzZXRhZ3MpIHsKKwkJCWRldl9pbmZvKCZzZGV2LT5zZGV2X2dlbmRldiwKKwkJCQkidGFnZ2VkIGNvbW1hbmQgcXVldWUgZGVwdGggc2V0IHRvICVkXG4iLAorCQkJCXJlcXRhZ3MpOworCQl9IGVsc2UgeworCQkJZGV2X2luZm8oJnNkZXYtPnNkZXZfZ2VuZGV2LAorCQkJCQkidGFnZ2VkIGNvbW1hbmQgcXVldWVpbmcgZGlzYWJsZWRcbiIpOworCQl9CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJbmNyIHRpbWVvdXQgaGFuZGxlci4KKyoqCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJTWlzdXNlZCB0byBrZWVwIHRoZSBkcml2ZXIgcnVubmluZyB3aGVuCisqKglpbnRlcnJ1cHRzIGFyZSBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdGF0aWMgdm9pZCBuY3JfdGltZW91dCAoc3RydWN0IG5jYiAqbnApCit7CisJdV9sb25nCXRoaXN0aW1lID0ga3RpbWVfZ2V0KDApOworCisJLyoKKwkqKglJZiByZWxlYXNlIHByb2Nlc3MgaW4gcHJvZ3Jlc3MsIGxldCdzIGdvCisJKioJU2V0IHRoZSByZWxlYXNlIHN0YWdlIGZyb20gMSB0byAyIHRvIHN5bmNocm9uaXplCisJKioJd2l0aCB0aGUgcmVsZWFzZSBwcm9jZXNzLgorCSovCisKKwlpZiAobnAtPnJlbGVhc2Vfc3RhZ2UpIHsKKwkJaWYgKG5wLT5yZWxlYXNlX3N0YWdlID09IDEpIG5wLT5yZWxlYXNlX3N0YWdlID0gMjsKKwkJcmV0dXJuOworCX0KKworCW5wLT50aW1lci5leHBpcmVzID0ga3RpbWVfZ2V0KFNDU0lfTkNSX1RJTUVSX0lOVEVSVkFMKTsKKwlhZGRfdGltZXIoJm5wLT50aW1lcik7CisKKwkvKgorCSoqCUlmIHdlIGFyZSByZXNldHRpbmcgdGhlIG5jciwgd2FpdCBmb3Igc2V0dGxlX3RpbWUgYmVmb3JlIAorCSoqCWNsZWFyaW5nIGl0LiBUaGVuIGNvbW1hbmQgcHJvY2Vzc2luZyB3aWxsIGJlIHJlc3VtZWQuCisJKi8KKwlpZiAobnAtPnNldHRsZV90aW1lKSB7CisJCWlmIChucC0+c2V0dGxlX3RpbWUgPD0gdGhpc3RpbWUpIHsKKwkJCWlmIChib290dmVyYm9zZSA+IDEpCisJCQkJcHJpbnRrKCIlczogY29tbWFuZCBwcm9jZXNzaW5nIHJlc3VtZWRcbiIsIG5jcl9uYW1lKG5wKSk7CisJCQlucC0+c2V0dGxlX3RpbWUJPSAwOworCQkJbnAtPmRpc2MJPSAxOworCQkJcmVxdWV1ZV93YWl0aW5nX2xpc3QobnApOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSoqCVNpbmNlIHRoZSBnZW5lcmljIHNjc2kgZHJpdmVyIG9ubHkgYWxsb3dzIHVzIDAuNSBzZWNvbmQgCisJKioJdG8gcGVyZm9ybSBhYm9ydCBvZiBhIGNvbW1hbmQsIHdlIG11c3QgbG9vayBhdCBjY2JzIGFib3V0IAorCSoqCWV2ZXJ5IDAuMjUgc2Vjb25kLgorCSovCisJaWYgKG5wLT5sYXN0dGltZSArIDQqSFogPCB0aGlzdGltZSkgeworCQkvKgorCQkqKglibG9jayBuY3IgaW50ZXJydXB0cworCQkqLworCQlucC0+bGFzdHRpbWUgPSB0aGlzdGltZTsKKwl9CisKKyNpZmRlZiBTQ1NJX05DUl9CUk9LRU5fSU5UUgorCWlmIChJTkIobmNfaXN0YXQpICYgKElOVEZ8U0lQfERJUCkpIHsKKworCQkvKgorCQkqKglQcm9jZXNzIHBlbmRpbmcgaW50ZXJydXB0cy4KKwkJKi8KKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRrICgieyIpOworCQluY3JfZXhjZXB0aW9uIChucCk7CisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50ayAoIn0iKTsKKwl9CisjZW5kaWYgLyogU0NTSV9OQ1JfQlJPS0VOX0lOVFIgKi8KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJbG9nIG1lc3NhZ2UgZm9yIHJlYWwgaGFyZCBlcnJvcnMKKyoqCisqKgkibmNyMCB0YXJnIDA/OiBFUlJPUiAoZHM6c2kpIChzby1zaS1zZCkgKHN4ZmVyL3NjbnRsMykgQCBuYW1lIChkc3A6ZGJjKS4iCisqKgkiCSAgICAgIHJlZzogcjAgcjEgcjIgcjMgcjQgcjUgcjYgLi4uLi4gcmYuIgorKioKKyoqCWV4Y2VwdGlvbiByZWdpc3RlcjoKKyoqCQlkczoJZHN0YXQKKyoqCQlzaToJc2lzdAorKioKKyoqCVNDU0kgYnVzIGxpbmVzOgorKioJCXNvOgljb250cm9sIGxpbmVzIGFzIGRyaXZlciBieSBOQ1IuCisqKgkJc2k6CWNvbnRyb2wgbGluZXMgYXMgc2VlbiBieSBOQ1IuCisqKgkJc2Q6CXNjc2kgZGF0YSBsaW5lcyBhcyBzZWVuIGJ5IE5DUi4KKyoqCisqKgl3aWRlL2Zhc3Rtb2RlOgorKioJCXN4ZmVyOgkoc2VlIHRoZSBtYW51YWwpCisqKgkJc2NudGwzOgkoc2VlIHRoZSBtYW51YWwpCisqKgorKioJY3VycmVudCBzY3JpcHQgY29tbWFuZDoKKyoqCQlkc3A6CXNjcmlwdCBhZGRyZXNzIChyZWxhdGl2ZSB0byBzdGFydCBvZiBzY3JpcHQpLgorKioJCWRiYzoJZmlyc3Qgd29yZCBvZiBzY3JpcHQgY29tbWFuZC4KKyoqCisqKglGaXJzdCAxNiByZWdpc3RlciBvZiB0aGUgY2hpcDoKKyoqCQlyMC4ucmYKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9sb2dfaGFyZF9lcnJvcihzdHJ1Y3QgbmNiICpucCwgdTE2IHNpc3QsIHVfY2hhciBkc3RhdCkKK3sKKwl1MzIJZHNwOworCWludAlzY3JpcHRfb2ZzOworCWludAlzY3JpcHRfc2l6ZTsKKwljaGFyCSpzY3JpcHRfbmFtZTsKKwl1X2NoYXIJKnNjcmlwdF9iYXNlOworCWludAlpOworCisJZHNwCT0gSU5MIChuY19kc3ApOworCisJaWYgKGRzcCA+IG5wLT5wX3NjcmlwdCAmJiBkc3AgPD0gbnAtPnBfc2NyaXB0ICsgc2l6ZW9mKHN0cnVjdCBzY3JpcHQpKSB7CisJCXNjcmlwdF9vZnMJPSBkc3AgLSBucC0+cF9zY3JpcHQ7CisJCXNjcmlwdF9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzY3JpcHQpOworCQlzY3JpcHRfYmFzZQk9ICh1X2NoYXIgKikgbnAtPnNjcmlwdDA7CisJCXNjcmlwdF9uYW1lCT0gInNjcmlwdCI7CisJfQorCWVsc2UgaWYgKG5wLT5wX3NjcmlwdGggPCBkc3AgJiYgCisJCSBkc3AgPD0gbnAtPnBfc2NyaXB0aCArIHNpemVvZihzdHJ1Y3Qgc2NyaXB0aCkpIHsKKwkJc2NyaXB0X29mcwk9IGRzcCAtIG5wLT5wX3NjcmlwdGg7CisJCXNjcmlwdF9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzY3JpcHRoKTsKKwkJc2NyaXB0X2Jhc2UJPSAodV9jaGFyICopIG5wLT5zY3JpcHRoMDsKKwkJc2NyaXB0X25hbWUJPSAic2NyaXB0aCI7CisJfSBlbHNlIHsKKwkJc2NyaXB0X29mcwk9IGRzcDsKKwkJc2NyaXB0X3NpemUJPSAwOworCQlzY3JpcHRfYmFzZQk9IE5VTEw7CisJCXNjcmlwdF9uYW1lCT0gIm1lbSI7CisJfQorCisJcHJpbnRrICgiJXM6JWQ6IEVSUk9SICgleDoleCkgKCV4LSV4LSV4KSAoJXgvJXgpIEAgKCVzICV4OiUwOHgpLlxuIiwKKwkJbmNyX25hbWUgKG5wKSwgKHVuc2lnbmVkKUlOQiAobmNfc2RpZCkmMHgwZiwgZHN0YXQsIHNpc3QsCisJCSh1bnNpZ25lZClJTkIgKG5jX3NvY2wpLCAodW5zaWduZWQpSU5CIChuY19zYmNsKSwgKHVuc2lnbmVkKUlOQiAobmNfc2JkbCksCisJCSh1bnNpZ25lZClJTkIgKG5jX3N4ZmVyKSwodW5zaWduZWQpSU5CIChuY19zY250bDMpLCBzY3JpcHRfbmFtZSwgc2NyaXB0X29mcywKKwkJKHVuc2lnbmVkKUlOTCAobmNfZGJjKSk7CisKKwlpZiAoKChzY3JpcHRfb2ZzICYgMykgPT0gMCkgJiYKKwkgICAgKHVuc2lnbmVkKXNjcmlwdF9vZnMgPCBzY3JpcHRfc2l6ZSkgeworCQlwcmludGsgKCIlczogc2NyaXB0IGNtZCA9ICUwOHhcbiIsIG5jcl9uYW1lKG5wKSwKKwkJCXNjcl90b19jcHUoKGludCkgKihuY3JjbWQgKikoc2NyaXB0X2Jhc2UgKyBzY3JpcHRfb2ZzKSkpOworCX0KKworCXByaW50ayAoIiVzOiByZWdkdW1wOiIsIG5jcl9uYW1lKG5wKSk7CisJZm9yIChpPTA7IGk8MTY7aSsrKQorICAgICAgICAgICAgcHJpbnRrICgiICUwMngiLCAodW5zaWduZWQpSU5CX09GRihpKSk7CisJcHJpbnRrICgiLlxuIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJbmNyIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglJbiBub3JtYWwgY2FzZXMsIGludGVycnVwdCBjb25kaXRpb25zIG9jY3VyIG9uZSBhdCBhIAorKioJdGltZS4gVGhlIG5jciBpcyBhYmxlIHRvIHN0YWNrIGluIHNvbWUgZXh0cmEgcmVnaXN0ZXJzIAorKioJb3RoZXIgaW50ZXJydXB0cyB0aGF0IHdpbGwgb2NjdXJzIGFmdGVyIHRoZSBmaXJzdCBvbmUuCisqKglCdXQgc2V2ZXJhbGwgaW50ZXJydXB0cyBtYXkgb2NjdXIgYXQgdGhlIHNhbWUgdGltZS4KKyoqCisqKglXZSBwcm9iYWJseSBzaG91bGQgb25seSB0cnkgdG8gZGVhbCB3aXRoIHRoZSBub3JtYWwgCisqKgljYXNlLCBidXQgaXQgc2VlbXMgdGhhdCBtdWx0aXBsZSBpbnRlcnJ1cHRzIG9jY3VyIGluIAorKioJc29tZSBjYXNlcyB0aGF0IGFyZSBub3QgYWJub3JtYWwgYXQgYWxsLgorKioKKyoqCVRoZSBtb3N0IGZyZXF1ZW50IGludGVycnVwdCBjb25kaXRpb24gaXMgUGhhc2UgTWlzbWF0Y2guCisqKglXZSBzaG91bGQgd2FudCB0byBzZXJ2aWNlIHRoaXMgaW50ZXJydXB0IHF1aWNrbHkuCisqKglBIFNDU0kgcGFyaXR5IGVycm9yIG1heSBiZSBkZWxpdmVyZWQgYXQgdGhlIHNhbWUgdGltZS4KKyoqCVRoZSBTSVIgaW50ZXJydXB0IGlzIG5vdCB2ZXJ5IGZyZXF1ZW50IGluIHRoaXMgZHJpdmVyLCAKKyoqCXNpbmNlIHRoZSBJTlRGTFkgaXMgbGlrZWx5IHVzZWQgZm9yIGNvbW1hbmQgY29tcGxldGlvbiAKKyoqCXNpZ25hbGluZy4KKyoqCVRoZSBTZWxlY3Rpb24gVGltZW91dCBpbnRlcnJ1cHQgbWF5IGJlIHRyaWdnZXJlZCB3aXRoIAorKioJSUlEIGFuZC9vciBVREMuCisqKglUaGUgU0JNQyBpbnRlcnJ1cHQgKFNDU0kgQnVzIE1vZGUgQ2hhbmdlKSBtYXkgcHJvYmFibHkgCisqKglvY2N1ciBhdCBhbnkgdGltZS4KKyoqCisqKglUaGlzIGhhbmRsZXIgdHJ5IHRvIGRlYWwgYXMgY2xldmVybHkgYXMgcG9zc2libGUgd2l0aCBhbGwKKyoqCXRoZSBhYm92ZS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordm9pZCBuY3JfZXhjZXB0aW9uIChzdHJ1Y3QgbmNiICpucCkKK3sKKwl1X2NoYXIJaXN0YXQsIGRzdGF0OworCXUxNglzaXN0OworCWludAlpOworCisJLyoKKwkqKglpbnRlcnJ1cHQgb24gdGhlIGZseSA/CisJKioJU2luY2UgdGhlIGdsb2JhbCBoZWFkZXIgbWF5IGJlIGNvcGllZCBiYWNrIHRvIGEgQ0NCIAorCSoqCXVzaW5nIGEgcG9zdGVkIFBDSSBtZW1vcnkgd3JpdGUsIHRoZSBsYXN0IG9wZXJhdGlvbiBvbiAKKwkqKgl0aGUgaXN0YXQgcmVnaXN0ZXIgaXMgYSBSRUFEIGluIG9yZGVyIHRvIGZsdXNoIHBvc3RlZCAKKwkqKglQQ0kgd3JpdGUgY29tbWFuZHMuCisJKi8KKwlpc3RhdCA9IElOQiAobmNfaXN0YXQpOworCWlmIChpc3RhdCAmIElOVEYpIHsKKwkJT1VUQiAobmNfaXN0YXQsIChpc3RhdCAmIFNJR1ApIHwgSU5URik7CisJCWlzdGF0ID0gSU5CIChuY19pc3RhdCk7CisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50ayAoIkYgIik7CisJCW5jcl93YWtldXBfZG9uZSAobnApOworCX0KKworCWlmICghKGlzdGF0ICYgKFNJUHxESVApKSkKKwkJcmV0dXJuOworCisJaWYgKGlzdGF0ICYgQ0FCUlQpCisJCU9VVEIgKG5jX2lzdGF0LCBDQUJSVCk7CisKKwkvKgorCSoqCVN0ZWluYmFjaCdzIEd1aWRlbGluZSBmb3IgU3lzdGVtcyBQcm9ncmFtbWluZzoKKwkqKglOZXZlciB0ZXN0IGZvciBhbiBlcnJvciBjb25kaXRpb24geW91IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS4KKwkqLworCisJc2lzdCAgPSAoaXN0YXQgJiBTSVApID8gSU5XIChuY19zaXN0KSAgOiAwOworCWRzdGF0ID0gKGlzdGF0ICYgRElQKSA/IElOQiAobmNfZHN0YXQpIDogMDsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpCisJCXByaW50ayAoIjwlZHwleDoleHwleDoleD4iLAorCQkJKGludClJTkIobmNfc2NyMCksCisJCQlkc3RhdCxzaXN0LAorCQkJKHVuc2lnbmVkKUlOTChuY19kc3ApLAorCQkJKHVuc2lnbmVkKUlOTChuY19kYmMpKTsKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkqKglGaXJzdCwgaW50ZXJydXB0cyB3ZSB3YW50IHRvIHNlcnZpY2UgY2xlYW5seS4KKwkqKgorCSoqCVBoYXNlIG1pc21hdGNoIGlzIHRoZSBtb3N0IGZyZXF1ZW50IGludGVycnVwdCwgYW5kIAorCSoqCXNvIHdlIGhhdmUgdG8gc2VydmljZSBpdCBhcyBxdWlja2x5IGFuZCBhcyBjbGVhbmx5IAorCSoqCWFzIHBvc3NpYmxlLgorCSoqCVByb2dyYW1tZWQgaW50ZXJydXB0cyBhcmUgcmFyZWx5IHVzZWQgaW4gdGhpcyBkcml2ZXIsCisJKioJYnV0IHdlIG11c3QgaGFuZGxlIHRoZW0gY2xlYW5seSBhbnl3YXkuCisJKioJV2UgdHJ5IHRvIGRlYWwgd2l0aCBQQVIgYW5kIFNCTUMgY29tYmluZWQgd2l0aCAKKwkqKglzb21lIG90aGVyIGludGVycnVwdChzKS4KKwkqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSovCisKKwlpZiAoIShzaXN0ICAmIChTVE98R0VOfEhUSHxTR0V8VURDfFJTVCkpICYmCisJICAgICEoZHN0YXQgJiAoTURQRXxCRnxBQlJUfElJRCkpKSB7CisJCWlmICgoc2lzdCAmIFNCTUMpICYmIG5jcl9pbnRfc2JtYyAobnApKQorCQkJcmV0dXJuOworCQlpZiAoKHNpc3QgJiBQQVIpICAmJiBuY3JfaW50X3BhciAgKG5wKSkKKwkJCXJldHVybjsKKwkJaWYgKHNpc3QgJiBNQSkgeworCQkJbmNyX2ludF9tYSAobnApOworCQkJcmV0dXJuOworCQl9CisJCWlmIChkc3RhdCAmIFNJUikgeworCQkJbmNyX2ludF9zaXIgKG5wKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkqKiAgREVMIDM5NyAtIDUzQzg3NSBSZXYgMyAtIFBhcnQgTnVtYmVyIDYwOS0wMzkyNDEwIC0gSVRFTSAyLgorCQkqLworCQlpZiAoIShzaXN0ICYgKFNCTUN8UEFSKSkgJiYgIShkc3RhdCAmIFNTSSkpIHsKKwkJCXByaW50aygJIiVzOiB1bmtub3duIGludGVycnVwdChzKSBpZ25vcmVkLCAiCisJCQkJIklTVEFUPSV4IERTVEFUPSV4IFNJU1Q9JXhcbiIsCisJCQkJbmNyX25hbWUobnApLCBpc3RhdCwgZHN0YXQsIHNpc3QpOworCQkJcmV0dXJuOworCQl9CisJCU9VVE9OQl9TVEQgKCk7CisJCXJldHVybjsKKwl9CisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKioJTm93LCBpbnRlcnJ1cHRzIHRoYXQgbmVlZCBzb21lIGZpeGluZyB1cC4KKwkqKglPcmRlciBhbmQgbXVsdGlwbGUgaW50ZXJydXB0cyBpcyBzbyBsZXNzIGltcG9ydGFudC4KKwkqKgorCSoqCUlmIFNSU1QgaGFzIGJlZW4gYXNzZXJ0ZWQsIHdlIGp1c3QgcmVzZXQgdGhlIGNoaXAuCisJKioKKwkqKglTZWxlY3Rpb24gaXMgaW50aXJlbHkgaGFuZGxlZCBieSB0aGUgY2hpcC4gSWYgdGhlIAorCSoqCWNoaXAgc2F5cyBTVE8sIHdlIHRydXN0IGl0LiBTZWVtcyBzb21lIG90aGVyIAorCSoqCWludGVycnVwdHMgbWF5IG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUgKFVEQywgSUlEKSwgc28gCisJKioJd2UgaWdub3JlIHRoZW0uIEluIGFueSBjYXNlIHdlIGRvIGVub3VnaCBmaXgtdXAgCisJKioJaW4gdGhlIHNlcnZpY2Ugcm91dGluZS4KKwkqKglXZSBqdXN0IGV4Y2x1ZGUgc29tZSBmYXRhbCBkbWEgZXJyb3JzLgorCSoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKi8KKworCWlmIChzaXN0ICYgUlNUKSB7CisJCW5jcl9pbml0IChucCwgMSwgYm9vdHZlcmJvc2UgPyAic2NzaSByZXNldCIgOiBOVUxMLCBIU19SRVNFVCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHNpc3QgJiBTVE8pICYmCisJCSEoZHN0YXQgJiAoTURQRXxCRnxBQlJUKSkpIHsKKwkvKgorCSoqCURFTCAzOTcgLSA1M0M4NzUgUmV2IDMgLSBQYXJ0IE51bWJlciA2MDktMDM5MjQxMCAtIElURU0gMS4KKwkqLworCQlPVVRPTkIgKG5jX2N0ZXN0MywgQ0xGKTsKKworCQluY3JfaW50X3N0byAobnApOworCQlyZXR1cm47CisJfQorCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkqKglOb3csIGludGVycnVwdHMgd2UgYXJlIG5vdCBhYmxlIHRvIHJlY292ZXIgY2xlYW5seS4KKwkqKgkoQXQgbGVhc3QgZm9yIHRoZSBtb21lbnQpLgorCSoqCisJKioJRG8gdGhlIHJlZ2lzdGVyIGR1bXAuCisJKioJTG9nIG1lc3NhZ2UgZm9yIHJlYWwgaGFyZCBlcnJvcnMuCisJKioJQ2xlYXIgYWxsIGZpZm9zLgorCSoqCUZvciBNRFBFLCBCRiwgQUJPUlQsIElJRCwgU0dFIGFuZCBIVEggd2UgcmVzZXQgdGhlIAorCSoqCUJVUyBhbmQgdGhlIGNoaXAuCisJKioJV2UgYXJlIG1vcmUgc29mdCBmb3IgVURDLgorCSoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJKi8KKworCWlmIChrdGltZV9leHAobnAtPnJlZ3RpbWUpKSB7CisJCW5wLT5yZWd0aW1lID0ga3RpbWVfZ2V0KDEwKkhaKTsKKwkJZm9yIChpID0gMDsgaTxzaXplb2YobnAtPnJlZ2R1bXApOyBpKyspCisJCQkoKGNoYXIqKSZucC0+cmVnZHVtcClbaV0gPSBJTkJfT0ZGKGkpOworCQlucC0+cmVnZHVtcC5uY19kc3RhdCA9IGRzdGF0OworCQlucC0+cmVnZHVtcC5uY19zaXN0ICA9IHNpc3Q7CisJfQorCisJbmNyX2xvZ19oYXJkX2Vycm9yKG5wLCBzaXN0LCBkc3RhdCk7CisKKwlwcmludGsgKCIlczogaGF2ZSB0byBjbGVhciBmaWZvcy5cbiIsIG5jcl9uYW1lIChucCkpOworCU9VVEIgKG5jX3N0ZXN0MywgVEV8Q1NGKTsKKwlPVVRPTkIgKG5jX2N0ZXN0MywgQ0xGKTsKKworCWlmICgoc2lzdCAmIChTR0UpKSB8fAorCQkoZHN0YXQgJiAoTURQRXxCRnxBQlJUfElJRCkpKSB7CisJCW5jcl9zdGFydF9yZXNldChucCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2lzdCAmIEhUSCkgeworCQlwcmludGsgKCIlczogaGFuZHNoYWtlIHRpbWVvdXRcbiIsIG5jcl9uYW1lKG5wKSk7CisJCW5jcl9zdGFydF9yZXNldChucCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2lzdCAmIFVEQykgeworCQlwcmludGsgKCIlczogdW5leHBlY3RlZCBkaXNjb25uZWN0XG4iLCBuY3JfbmFtZShucCkpOworCQlPVVRCIChIU19QUlQsIEhTX1VORVhQRUNURUQpOworCQlPVVRMX0RTUCAoTkNCX1NDUklQVF9QSFlTIChucCwgY2xlYW51cCkpOworCQlyZXR1cm47CisJfQorCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkqKglXZSBqdXN0IG1pc3MgdGhlIGNhdXNlIG9mIHRoZSBpbnRlcnJ1cHQuIDooCisJKioJUHJpbnQgYSBtZXNzYWdlLiBUaGUgdGltZW91dCB3aWxsIGRvIHRoZSByZWFsIHdvcmsuCisJKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkqLworCXByaW50ayAoIiVzOiB1bmtub3duIGludGVycnVwdFxuIiwgbmNyX25hbWUobnApKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJbmNyIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHNlbGVjdGlvbiB0aW1lb3V0CisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJVGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gdGhlIDUzYzgxMC4KKyoqCUFsdGhvdWdoIGEgU1RPLUludGVycnVwdCBpcyBwZW5kaW5nLAorKioJaXQgY29udGludWVzIGV4ZWN1dGluZyBzY3JpcHQgY29tbWFuZHMuCisqKglCdXQgaXQgd2lsbCBmYWlsIGFuZCBpbnRlcnJ1cHQgKElJRCkgb24KKyoqCXRoZSBuZXh0IGluc3RydWN0aW9uIHdoZXJlIGl0J3MgbG9va2luZworKioJZm9yIGEgdmFsaWQgcGhhc2UuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkIG5jcl9pbnRfc3RvIChzdHJ1Y3QgbmNiICpucCkKK3sKKwl1X2xvbmcgZHNhOworCXN0cnVjdCBjY2IgKmNwOworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50ayAoIlQiKTsKKworCS8qCisJKioJbG9vayBmb3IgY2NiIGFuZCBzZXQgdGhlIHN0YXR1cy4KKwkqLworCisJZHNhID0gSU5MIChuY19kc2EpOworCWNwID0gbnAtPmNjYjsKKwl3aGlsZSAoY3AgJiYgKENDQl9QSFlTIChjcCwgcGh5cykgIT0gZHNhKSkKKwkJY3AgPSBjcC0+bGlua19jY2I7CisKKwlpZiAoY3ApIHsKKwkJY3AtPiBob3N0X3N0YXR1cyA9IEhTX1NFTF9USU1FT1VUOworCQluY3JfY29tcGxldGUgKG5wLCBjcCk7CisJfQorCisJLyoKKwkqKglyZXBhaXIgc3RhcnQgcXVldWUgYW5kIGp1bXAgdG8gc3RhcnQgcG9pbnQuCisJKi8KKworCU9VVExfRFNQIChOQ0JfU0NSSVBUSF9QSFlTIChucCwgc3RvX3Jlc3RhcnQpKTsKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCW5jciBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBTQ1NJIGJ1cyBtb2RlIGNoYW5nZQorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCXNwaTItcjEyIDExLjIuMyBzYXlzIGEgdHJhbnNjZWl2ZXIgbW9kZSBjaGFuZ2UgbXVzdCAKKyoqCWdlbmVyYXRlIGEgcmVzZXQgZXZlbnQgYW5kIGEgZGV2aWNlIHRoYXQgZGV0ZWN0cyBhIHJlc2V0IAorKioJZXZlbnQgc2hhbGwgaW5pdGlhdGUgYSBoYXJkIHJlc2V0LiBJdCBzYXlzIGFsc28gdGhhdCBhCisqKglkZXZpY2UgdGhhdCBkZXRlY3RzIGEgbW9kZSBjaGFuZ2Ugc2hhbGwgc2V0IGRhdGEgdHJhbnNmZXIgCisqKgltb2RlIHRvIGVpZ2h0IGJpdCBhc3luY2hyb25vdXMsIGV0Yy4uLgorKioJU28sIGp1c3QgcmVzZXR0aW5nIHNob3VsZCBiZSBlbm91Z2guCisqKgkgCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdGF0aWMgaW50IG5jcl9pbnRfc2JtYyAoc3RydWN0IG5jYiAqbnApCit7CisJdV9jaGFyIHNjc2lfbW9kZSA9IElOQiAobmNfc3Rlc3Q0KSAmIFNNT0RFOworCisJaWYgKHNjc2lfbW9kZSAhPSBucC0+c2NzaV9tb2RlKSB7CisJCXByaW50aygiJXM6IFNDU0kgYnVzIG1vZGUgY2hhbmdlIGZyb20gJXggdG8gJXguXG4iLAorCQkJbmNyX25hbWUobnApLCBucC0+c2NzaV9tb2RlLCBzY3NpX21vZGUpOworCisJCW5wLT5zY3NpX21vZGUgPSBzY3NpX21vZGU7CisKKworCQkvKgorCQkqKglTdXNwZW5kIGNvbW1hbmQgcHJvY2Vzc2luZyBmb3IgMSBzZWNvbmQgYW5kIAorCQkqKglyZWluaXRpYWxpemUgYWxsIGV4Y2VwdCB0aGUgY2hpcC4KKwkJKi8KKwkJbnAtPnNldHRsZV90aW1lCT0ga3RpbWVfZ2V0KDEqSFopOworCQluY3JfaW5pdCAobnAsIDAsIGJvb3R2ZXJib3NlID8gInNjc2kgbW9kZSBjaGFuZ2UiIDogTlVMTCwgSFNfUkVTRVQpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCW5jciBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBTQ1NJIHBhcml0eSBlcnJvci4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdGF0aWMgaW50IG5jcl9pbnRfcGFyIChzdHJ1Y3QgbmNiICpucCkKK3sKKwl1X2NoYXIJaHN0cwk9IElOQiAoSFNfUFJUKTsKKwl1MzIJZGJjCT0gSU5MIChuY19kYmMpOworCXVfY2hhcglzc3RhdDEJPSBJTkIgKG5jX3NzdGF0MSk7CisJaW50IHBoYXNlCT0gLTE7CisJaW50IG1zZwkJPSAtMTsKKwl1MzIgam1wOworCisJcHJpbnRrKCIlczogU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQ6IFNDUjE9JWQgREJDPSV4IFNTVEFUMT0leFxuIiwKKwkJbmNyX25hbWUobnApLCBoc3RzLCBkYmMsIHNzdGF0MSk7CisKKwkvKgorCSAqCUlnbm9yZSB0aGUgaW50ZXJydXB0IGlmIHRoZSBOQ1IgaXMgbm90IGNvbm5lY3RlZCAKKwkgKgl0byB0aGUgU0NTSSBidXMsIHNpbmNlIHRoZSByaWdodCB3b3JrIHNob3VsZCBoYXZlICAKKwkgKgliZWVuIGRvbmUgb24gdW5leHBlY3RlZCBkaXNjb25uZWN0aW9uIGhhbmRsaW5nLgorCSAqLworCWlmICghKElOQiAobmNfc2NudGwxKSAmIElTQ09OKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqCUlmIHRoZSBuZXh1cyBpcyBub3QgY2xlYXJseSBpZGVudGlmaWVkLCByZXNldCB0aGUgYnVzLgorCSAqCVdlIHdpbGwgdHJ5IHRvIGRvIGJldHRlciBsYXRlci4KKwkgKi8KKwlpZiAoaHN0cyAmIEhTX0lOVkFMTUFTSykKKwkJZ290byByZXNldF9hbGw7CisKKwkvKgorCSAqCUlmIHRoZSBTQ1NJIHBhcml0eSBlcnJvciBvY2N1cnMgaW4gTVNHIElOIHBoYXNlLCBwcmVwYXJlIGEgCisJICoJTVNHIFBBUklUWSBtZXNzYWdlLiBPdGhlcndpc2UsIHByZXBhcmUgYSBJTklUSUFUT1IgREVURUNURUQgCisJICoJRVJST1IgbWVzc2FnZSBhbmQgbGV0IHRoZSBkZXZpY2UgZGVjaWRlIHRvIHJldHJ5IHRoZSBjb21tYW5kIAorCSAqCW9yIHRvIHRlcm1pbmF0ZSB3aXRoIGNoZWNrIGNvbmRpdGlvbi4gSWYgd2Ugd2VyZSBpbiBNU0cgSU4gCisJICoJcGhhc2Ugd2FpdGluZyBmb3IgdGhlIHJlc3BvbnNlIG9mIGEgbmVnb3RpYXRpb24sIHdlIHdpbGwgCisJICoJZ2V0IFNJUl9ORUdPX0ZBSUxFRCBhdCBkaXNwYXRjaC4KKwkgKi8KKwlpZiAoIShkYmMgJiAweGMwMDAwMDAwKSkKKwkJcGhhc2UgPSAoZGJjID4+IDI0KSAmIDc7CisJaWYgKHBoYXNlID09IDcpCisJCW1zZyA9IE1fUEFSSVRZOworCWVsc2UKKwkJbXNnID0gTV9JRF9FUlJPUjsKKworCisJLyoKKwkgKglJZiB0aGUgTkNSIHN0b3BwZWQgb24gYSBNT1ZFIF4gREFUQV9JTiwgd2UganVtcCB0byBhIAorCSAqCXNjcmlwdCB0aGF0IHdpbGwgaWdub3JlIGFsbCBkYXRhIGluIGJ5dGVzIHVudGlsIHBoYXNlIAorCSAqCWNoYW5nZSwgc2luY2Ugd2UgYXJlIG5vdCBzdXJlIHRoZSBjaGlwIHdpbGwgd2FpdCB0aGUgcGhhc2UgCisJICoJY2hhbmdlIHByaW9yIHRvIGRlbGl2ZXJpbmcgdGhlIGludGVycnVwdC4KKwkgKi8KKwlpZiAocGhhc2UgPT0gMSkKKwkJam1wID0gTkNCX1NDUklQVEhfUEhZUyAobnAsIHBhcl9lcnJfZGF0YV9pbik7CisJZWxzZQorCQlqbXAgPSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgcGFyX2Vycl9vdGhlcik7CisKKwlPVVRPTkIgKG5jX2N0ZXN0MywgQ0xGICk7CS8qIGNsZWFyIGRtYSBmaWZvICAqLworCU9VVEIgKG5jX3N0ZXN0MywgVEV8Q1NGKTsJLyogY2xlYXIgc2NzaSBmaWZvICovCisKKwlucC0+bXNnb3V0WzBdID0gbXNnOworCU9VVExfRFNQIChqbXApOworCXJldHVybiAxOworCityZXNldF9hbGw6CisJbmNyX3N0YXJ0X3Jlc2V0KG5wKTsKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioKKyoqCW5jciBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBwaGFzZSBlcnJvcnMuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVdlIGhhdmUgdG8gY29uc3RydWN0IGEgbmV3IHRyYW5zZmVyIGRlc2NyaXB0b3IsCisqKgl0byB0cmFuc2ZlciB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBibG9jay4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyB2b2lkIG5jcl9pbnRfbWEgKHN0cnVjdCBuY2IgKm5wKQoreworCXUzMglkYmM7CisJdTMyCXJlc3Q7CisJdTMyCWRzcDsKKwl1MzIJZHNhOworCXUzMglueHRkc3A7CisJdTMyCW5ld3RtcDsKKwl1MzIJKnZkc3A7CisJdTMyCW9hZHIsIG9sZW47CisJdTMyCSp0YmxwOworCW5jcmNtZCAqbmV3Y21kOworCXVfY2hhcgljbWQsIHNiY2w7CisJc3RydWN0IGNjYiAqY3A7CisKKwlkc3AJPSBJTkwgKG5jX2RzcCk7CisJZGJjCT0gSU5MIChuY19kYmMpOworCXNiY2wJPSBJTkIgKG5jX3NiY2wpOworCisJY21kCT0gZGJjID4+IDI0OworCXJlc3QJPSBkYmMgJiAweGZmZmZmZjsKKworCS8qCisJKioJVGFrZSBpbnRvIGFjY291bnQgZG1hIGZpZm8gYW5kIHZhcmlvdXMgYnVmZmVycyBhbmQgbGF0Y2hlcywKKwkqKglvbmx5IGlmIHRoZSBpbnRlcnJ1cHRlZCBwaGFzZSBpcyBhbiBPVVRQVVQgcGhhc2UuCisJKi8KKworCWlmICgoY21kICYgMSkgPT0gMCkgeworCQl1X2NoYXIJY3Rlc3Q1LCBzczAsIHNzMjsKKwkJdTE2CWRlbHRhOworCisJCWN0ZXN0NSA9IChucC0+cnZfY3Rlc3Q1ICYgREZTKSA/IElOQiAobmNfY3Rlc3Q1KSA6IDA7CisJCWlmIChjdGVzdDUgJiBERlMpCisJCQlkZWx0YT0oKChjdGVzdDUgPDwgOCkgfCAoSU5CIChuY19kZmlmbykgJiAweGZmKSkgLSByZXN0KSAmIDB4M2ZmOworCQllbHNlCisJCQlkZWx0YT0oSU5CIChuY19kZmlmbykgLSByZXN0KSAmIDB4N2Y7CisKKwkJLyoKKwkJKioJVGhlIGRhdGEgaW4gdGhlIGRtYSBmaWZvIGhhcyBub3QgYmVlbiB0cmFuc2ZlcnJlZCB0bworCQkqKgl0aGUgdGFyZ2V0IC0+IGFkZCB0aGUgYW1vdW50IHRvIHRoZSByZXN0CisJCSoqCWFuZCBjbGVhciB0aGUgZGF0YS4KKwkJKioJQ2hlY2sgdGhlIHNzdGF0MiByZWdpc3RlciBpbiBjYXNlIG9mIHdpZGUgdHJhbnNmZXIuCisJCSovCisKKwkJcmVzdCArPSBkZWx0YTsKKwkJc3MwICA9IElOQiAobmNfc3N0YXQwKTsKKwkJaWYgKHNzMCAmIE9MRikgcmVzdCsrOworCQlpZiAoc3MwICYgT1JGKSByZXN0Kys7CisJCWlmIChJTkIobmNfc2NudGwzKSAmIEVXUykgeworCQkJc3MyID0gSU5CIChuY19zc3RhdDIpOworCQkJaWYgKHNzMiAmIE9MRjEpIHJlc3QrKzsKKwkJCWlmIChzczIgJiBPUkYxKSByZXN0Kys7CisJCX0KKworCQlpZiAoREVCVUdfRkxBR1MgJiAoREVCVUdfVElOWXxERUJVR19QSEFTRSkpCisJCQlwcmludGsgKCJQJXgleCBSTD0lZCBEPSVkIFNTMD0leCAiLCBjbWQmNywgc2JjbCY3LAorCQkJCSh1bnNpZ25lZCkgcmVzdCwgKHVuc2lnbmVkKSBkZWx0YSwgc3MwKTsKKworCX0gZWxzZQl7CisJCWlmIChERUJVR19GTEFHUyAmIChERUJVR19USU5ZfERFQlVHX1BIQVNFKSkKKwkJCXByaW50ayAoIlAleCV4IFJMPSVkICIsIGNtZCY3LCBzYmNsJjcsIHJlc3QpOworCX0KKworCS8qCisJKioJQ2xlYXIgZmlmb3MuCisJKi8KKwlPVVRPTkIgKG5jX2N0ZXN0MywgQ0xGICk7CS8qIGNsZWFyIGRtYSBmaWZvICAqLworCU9VVEIgKG5jX3N0ZXN0MywgVEV8Q1NGKTsJLyogY2xlYXIgc2NzaSBmaWZvICovCisKKwkvKgorCSoqCWxvY2F0ZSBtYXRjaGluZyBjcC4KKwkqKglpZiB0aGUgaW50ZXJydXB0ZWQgcGhhc2UgaXMgREFUQSBJTiBvciBEQVRBIE9VVCwKKwkqKgl0cnVzdCB0aGUgZ2xvYmFsIGhlYWRlci4KKwkqLworCWRzYSA9IElOTCAobmNfZHNhKTsKKwlpZiAoIShjbWQgJiA2KSkgeworCQljcCA9IG5wLT5oZWFkZXIuY3A7CisJCWlmIChDQ0JfUEhZUyhjcCwgcGh5cykgIT0gZHNhKQorCQkJY3AgPSBOVUxMOworCX0gZWxzZSB7CisJCWNwICA9IG5wLT5jY2I7CisJCXdoaWxlIChjcCAmJiAoQ0NCX1BIWVMgKGNwLCBwaHlzKSAhPSBkc2EpKQorCQkJY3AgPSBjcC0+bGlua19jY2I7CisJfQorCisJLyoKKwkqKgl0cnkgdG8gZmluZCB0aGUgaW50ZXJydXB0ZWQgc2NyaXB0IGNvbW1hbmQsCisJKioJYW5kIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRvIGNvbnRpbnVlLgorCSovCisJdmRzcAk9IE5VTEw7CisJbnh0ZHNwCT0gMDsKKwlpZgkoZHNwID4gIG5wLT5wX3NjcmlwdCAmJgorCQkgZHNwIDw9IG5wLT5wX3NjcmlwdCArIHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSkgeworCQl2ZHNwID0gKHUzMiAqKSgoY2hhciopbnAtPnNjcmlwdDAgKyAoZHNwLW5wLT5wX3NjcmlwdC04KSk7CisJCW54dGRzcCA9IGRzcDsKKwl9CisJZWxzZSBpZgkoZHNwID4gIG5wLT5wX3NjcmlwdGggJiYKKwkJIGRzcCA8PSBucC0+cF9zY3JpcHRoICsgc2l6ZW9mKHN0cnVjdCBzY3JpcHRoKSkgeworCQl2ZHNwID0gKHUzMiAqKSgoY2hhciopbnAtPnNjcmlwdGgwICsgKGRzcC1ucC0+cF9zY3JpcHRoLTgpKTsKKwkJbnh0ZHNwID0gZHNwOworCX0KKwllbHNlIGlmIChjcCkgeworCQlpZgkoZHNwID09IENDQl9QSFlTIChjcCwgcGF0Y2hbMl0pKSB7CisJCQl2ZHNwID0gJmNwLT5wYXRjaFswXTsKKwkJCW54dGRzcCA9IHNjcl90b19jcHUodmRzcFszXSk7CisJCX0KKwkJZWxzZSBpZiAoZHNwID09IENDQl9QSFlTIChjcCwgcGF0Y2hbNl0pKSB7CisJCQl2ZHNwID0gJmNwLT5wYXRjaFs0XTsKKwkJCW54dGRzcCA9IHNjcl90b19jcHUodmRzcFszXSk7CisJCX0KKwl9CisKKwkvKgorCSoqCWxvZyB0aGUgaW5mb3JtYXRpb24KKwkqLworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUEhBU0UpIHsKKwkJcHJpbnRrICgiXG5DUD0lcCBDUDI9JXAgRFNQPSV4IE5YVD0leCBWRFNQPSVwIENNRD0leCAiLAorCQkJY3AsIG5wLT5oZWFkZXIuY3AsCisJCQkodW5zaWduZWQpZHNwLAorCQkJKHVuc2lnbmVkKW54dGRzcCwgdmRzcCwgY21kKTsKKwl9CisKKwkvKgorCSoqCWNwPTAgbWVhbnMgdGhhdCB0aGUgRFNBIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQgY29udHJvbCAKKwkqKglibG9jay4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzaW5jZSB3ZSBkb25ub3QgdXNlIG11bHRpLWJ5dGUgCisJKioJbW92ZSB3aGlsZSB3ZSBhcmUgYmVpbmcgcmVzZWxlY3RlZCBvdCBhZnRlciBjb21tYW5kIGNvbXBsZXRlLgorCSoqCVdlIGFyZSBub3QgYWJsZSB0byByZWNvdmVyIGZyb20gc3VjaCBhIHBoYXNlIGVycm9yLgorCSovCisJaWYgKCFjcCkgeworCQlwcmludGsgKCIlczogU0NTSSBwaGFzZSBlcnJvciBmaXh1cDogIgorCQkJIkNDQiBhbHJlYWR5IGRlcXVldWVkICgweCUwOGx4KVxuIiwgCisJCQluY3JfbmFtZSAobnApLCAodV9sb25nKSBucC0+aGVhZGVyLmNwKTsKKwkJZ290byByZXNldF9hbGw7CisJfQorCisJLyoKKwkqKglnZXQgb2xkIHN0YXJ0YWRkcmVzcyBhbmQgb2xkIGxlbmd0aC4KKwkqLworCisJb2FkciA9IHNjcl90b19jcHUodmRzcFsxXSk7CisKKwlpZiAoY21kICYgMHgxMCkgewkvKiBUYWJsZSBpbmRpcmVjdCAqLworCQl0YmxwID0gKHUzMiAqKSAoKGNoYXIqKSAmY3AtPnBoeXMgKyBvYWRyKTsKKwkJb2xlbiA9IHNjcl90b19jcHUodGJscFswXSk7CisJCW9hZHIgPSBzY3JfdG9fY3B1KHRibHBbMV0pOworCX0gZWxzZSB7CisJCXRibHAgPSAodTMyICopIDA7CisJCW9sZW4gPSBzY3JfdG9fY3B1KHZkc3BbMF0pICYgMHhmZmZmZmY7CisJfQorCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfUEhBU0UpIHsKKwkJcHJpbnRrICgiT0NNRD0leFxuVEJMUD0lcCBPTEVOPSV4IE9BRFI9JXhcbiIsCisJCQkodW5zaWduZWQpIChzY3JfdG9fY3B1KHZkc3BbMF0pID4+IDI0KSwKKwkJCXRibHAsCisJCQkodW5zaWduZWQpIG9sZW4sCisJCQkodW5zaWduZWQpIG9hZHIpOworCX0KKworCS8qCisJKioJY2hlY2sgY21kIGFnYWluc3QgYXNzdW1lZCBpbnRlcnJ1cHRlZCBzY3JpcHQgY29tbWFuZC4KKwkqLworCisJaWYgKGNtZCAhPSAoc2NyX3RvX2NwdSh2ZHNwWzBdKSA+PiAyNCkpIHsKKwkJUFJJTlRfQUREUihjcC0+Y21kLCAiaW50ZXJuYWwgZXJyb3I6IGNtZD0lMDJ4ICE9ICUwMng9KHZkc3BbMF0gIgorCQkJCSI+PiAyNClcbiIsIGNtZCwgc2NyX3RvX2NwdSh2ZHNwWzBdKSA+PiAyNCk7CisKKwkJZ290byByZXNldF9hbGw7CisJfQorCisJLyoKKwkqKgljcCAhPSBucC0+aGVhZGVyLmNwIG1lYW5zIHRoYXQgdGhlIGhlYWRlciBvZiB0aGUgQ0NCIAorCSoqCWN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgaGFzIG5vdCB5ZXQgYmVlbiBjb3BpZWQgdG8gCisJKioJdGhlIGdsb2JhbCBoZWFkZXIgYXJlYS4gVGhhdCBtYXkgaGFwcGVuIGlmIHRoZSBkZXZpY2UgZGlkIAorCSoqCW5vdCBhY2NlcHQgYWxsIG91ciBtZXNzYWdlcyBhZnRlciBoYXZpbmcgYmVlbiBzZWxlY3RlZC4KKwkqLworCWlmIChjcCAhPSBucC0+aGVhZGVyLmNwKSB7CisJCXByaW50ayAoIiVzOiBTQ1NJIHBoYXNlIGVycm9yIGZpeHVwOiAiCisJCQkiQ0NCIGFkZHJlc3MgbWlzbWF0Y2ggKDB4JTA4bHggIT0gMHglMDhseClcbiIsIAorCQkJbmNyX25hbWUgKG5wKSwgKHVfbG9uZykgY3AsICh1X2xvbmcpIG5wLT5oZWFkZXIuY3ApOworCX0KKworCS8qCisJKioJaWYgb2xkIHBoYXNlIG5vdCBkYXRhcGhhc2UsIGxlYXZlIGhlcmUuCisJKi8KKworCWlmIChjbWQgJiAweDA2KSB7CisJCVBSSU5UX0FERFIoY3AtPmNtZCwgInBoYXNlIGNoYW5nZSAleC0leCAlZEAlMDh4IHJlc2lkPSVkLlxuIiwKKwkJCWNtZCY3LCBzYmNsJjcsICh1bnNpZ25lZClvbGVuLAorCQkJKHVuc2lnbmVkKW9hZHIsICh1bnNpZ25lZClyZXN0KTsKKwkJZ290byB1bmV4cGVjdGVkX3BoYXNlOworCX0KKworCS8qCisJKioJY2hvb3NlIHRoZSBjb3JyZWN0IHBhdGNoIGFyZWEuCisJKioJaWYgc2F2ZXAgcG9pbnRzIHRvIG9uZSwgY2hvb3NlIHRoZSBvdGhlci4KKwkqLworCisJbmV3Y21kID0gY3AtPnBhdGNoOworCW5ld3RtcCA9IENDQl9QSFlTIChjcCwgcGF0Y2gpOworCWlmIChuZXd0bXAgPT0gc2NyX3RvX2NwdShjcC0+cGh5cy5oZWFkZXIuc2F2ZXApKSB7CisJCW5ld2NtZCA9ICZjcC0+cGF0Y2hbNF07CisJCW5ld3RtcCA9IENDQl9QSFlTIChjcCwgcGF0Y2hbNF0pOworCX0KKworCS8qCisJKioJZmlsbGluIHRoZSBjb21tYW5kcworCSovCisKKwluZXdjbWRbMF0gPSBjcHVfdG9fc2NyKCgoY21kICYgMHgwZikgPDwgMjQpIHwgcmVzdCk7CisJbmV3Y21kWzFdID0gY3B1X3RvX3NjcihvYWRyICsgb2xlbiAtIHJlc3QpOworCW5ld2NtZFsyXSA9IGNwdV90b19zY3IoU0NSX0pVTVApOworCW5ld2NtZFszXSA9IGNwdV90b19zY3Iobnh0ZHNwKTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1BIQVNFKSB7CisJCVBSSU5UX0FERFIoY3AtPmNtZCwgIm5ld2NtZFslZF0gJXggJXggJXggJXguXG4iLAorCQkJKGludCkgKG5ld2NtZCAtIGNwLT5wYXRjaCksCisJCQkodW5zaWduZWQpc2NyX3RvX2NwdShuZXdjbWRbMF0pLAorCQkJKHVuc2lnbmVkKXNjcl90b19jcHUobmV3Y21kWzFdKSwKKwkJCSh1bnNpZ25lZClzY3JfdG9fY3B1KG5ld2NtZFsyXSksCisJCQkodW5zaWduZWQpc2NyX3RvX2NwdShuZXdjbWRbM10pKTsKKwl9CisJLyoKKwkqKglmYWtlIHRoZSByZXR1cm4gYWRkcmVzcyAodG8gdGhlIHBhdGNoKS4KKwkqKglhbmQgcmVzdGFydCBzY3JpcHQgcHJvY2Vzc29yIGF0IGRpc3BhdGNoZXIuCisJKi8KKwlPVVRMIChuY190ZW1wLCBuZXd0bXApOworCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkaXNwYXRjaCkpOworCXJldHVybjsKKworCS8qCisJKioJVW5leHBlY3RlZCBwaGFzZSBjaGFuZ2VzIHRoYXQgb2NjdXJzIHdoZW4gdGhlIGN1cnJlbnQgcGhhc2UgCisJKioJaXMgbm90IGEgREFUQSBJTiBvciBEQVRBIE9VVCBwaGFzZSBhcmUgZHVlIHRvIGVycm9yIGNvbmRpdGlvbnMuCisJKioJU3VjaCBldmVudCBtYXkgb25seSBoYXBwZW4gd2hlbiB0aGUgU0NSSVBUUyBpcyB1c2luZyBhIAorCSoqCW11bHRpYnl0ZSBTQ1NJIE1PVkUuCisJKioKKwkqKglQaGFzZSBjaGFuZ2UJCVNvbWUgcG9zc2libGUgY2F1c2UKKwkqKgorCSoqCUNPTU1BTkQgIC0tPiBNU0cgSU4JU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgYnkgdGFyZ2V0LgorCSoqCUNPTU1BTkQgIC0tPiBTVEFUVVMJQmFkIGNvbW1hbmQgb3IgcmVmdXNlZCBieSB0YXJnZXQuCisJKioJTVNHIE9VVCAgLS0+IE1TRyBJTiAgICAgTWVzc2FnZSByZWplY3RlZCBieSB0YXJnZXQuCisJKioJTVNHIE9VVCAgLS0+IENPTU1BTkQgICAgQm9ndXMgdGFyZ2V0IHRoYXQgZGlzY2FyZHMgZXh0ZW5kZWQKKwkqKgkJCQluZWdvdGlhdGlvbiBtZXNzYWdlcy4KKwkqKgorCSoqCVRoZSBjb2RlIGJlbG93IGRvZXMgbm90IGNhcmUgb2YgdGhlIG5ldyBwaGFzZSBhbmQgc28gCisJKioJdHJ1c3RzIHRoZSB0YXJnZXQuIFdoeSB0byBhbm5veSBpdCA/CisJKioJSWYgdGhlIGludGVycnVwdGVkIHBoYXNlIGlzIENPTU1BTkQgcGhhc2UsIHdlIHJlc3RhcnQgYXQKKwkqKglkaXNwYXRjaGVyLgorCSoqCUlmIGEgdGFyZ2V0IGRvZXMgbm90IGdldCBhbGwgdGhlIG1lc3NhZ2VzIGFmdGVyIHNlbGVjdGlvbiwgCisJKioJdGhlIGNvZGUgYXNzdW1lcyBibGluZGx5IHRoYXQgdGhlIHRhcmdldCBkaXNjYXJkcyBleHRlbmRlZCAKKwkqKgltZXNzYWdlcyBhbmQgY2xlYXJzIHRoZSBuZWdvdGlhdGlvbiBzdGF0dXMuCisJKioJSWYgdGhlIHRhcmdldCBkb2VzIG5vdCB3YW50IGFsbCBvdXIgcmVzcG9uc2UgdG8gbmVnb3RpYXRpb24sCisJKioJd2UgZm9yY2UgYSBTSVJfTkVHT19QUk9UTyBpbnRlcnJ1cHQgKGl0IGlzIGEgaGFjayB0aGF0IGF2b2lkcyAKKwkqKglibG9hdCBmb3Igc3VjaCBhIHNob3VsZF9ub3RfaGFwcGVuIHNpdHVhdGlvbikuCisJKioJSW4gYWxsIG90aGVyIHNpdHVhdGlvbiwgd2UgcmVzZXQgdGhlIEJVUy4KKwkqKglBcmUgdGhlc2UgYXNzdW1wdGlvbnMgcmVhc29ubmFibGUgPyAoV2FpdCBhbmQgc2VlIC4uLikKKwkqLwordW5leHBlY3RlZF9waGFzZToKKwlkc3AgLT0gODsKKwlueHRkc3AgPSAwOworCisJc3dpdGNoIChjbWQgJiA3KSB7CisJY2FzZSAyOgkvKiBDT01NQU5EIHBoYXNlICovCisJCW54dGRzcCA9IE5DQl9TQ1JJUFRfUEhZUyAobnAsIGRpc3BhdGNoKTsKKwkJYnJlYWs7CisjaWYgMAorCWNhc2UgMzoJLyogU1RBVFVTICBwaGFzZSAqLworCQlueHRkc3AgPSBOQ0JfU0NSSVBUX1BIWVMgKG5wLCBkaXNwYXRjaCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSA2OgkvKiBNU0cgT1VUIHBoYXNlICovCisJCW5wLT5zY3JpcHRoLT5ueHRkc3BfZ29fb25bMF0gPSBjcHVfdG9fc2NyKGRzcCArIDgpOworCQlpZgkoZHNwID09IE5DQl9TQ1JJUFRfUEhZUyAobnAsIHNlbmRfaWRlbnQpKSB7CisJCQljcC0+aG9zdF9zdGF0dXMgPSBIU19CVVNZOworCQkJbnh0ZHNwID0gTkNCX1NDUklQVEhfUEhZUyAobnAsIGNscmF0bl9nb19vbik7CisJCX0KKwkJZWxzZSBpZgkoZHNwID09IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzZW5kX3dkdHIpIHx8CisJCQkgZHNwID09IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzZW5kX3NkdHIpKSB7CisJCQlueHRkc3AgPSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgbmVnb19iYWRfcGhhc2UpOworCQl9CisJCWJyZWFrOworI2lmIDAKKwljYXNlIDc6CS8qIE1TRyBJTiAgcGhhc2UgKi8KKwkJbnh0ZHNwID0gTkNCX1NDUklQVF9QSFlTIChucCwgY2xyYWNrKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwlpZiAobnh0ZHNwKSB7CisJCU9VVExfRFNQIChueHRkc3ApOworCQlyZXR1cm47CisJfQorCityZXNldF9hbGw6CisJbmNyX3N0YXJ0X3Jlc2V0KG5wKTsKK30KKworCitzdGF0aWMgdm9pZCBuY3Jfc2lyX3RvX3JlZG8oc3RydWN0IG5jYiAqbnAsIGludCBudW0sIHN0cnVjdCBjY2IgKmNwKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZAk9IGNwLT5jbWQ7CisJc3RydWN0IHRjYiAqdHAJPSAmbnAtPnRhcmdldFtjbWQtPmRldmljZS0+aWRdOworCXN0cnVjdCBsY2IgKmxwCT0gdHAtPmxwW2NtZC0+ZGV2aWNlLT5sdW5dOworCXN0cnVjdCBsaXN0X2hlYWQgKnFwOworCXN0cnVjdCBjY2IgKgljcDI7CisJaW50CQlkaXNjX2NudCA9IDA7CisJaW50CQlidXN5X2NudCA9IDA7CisJdTMyCQlzdGFydHA7CisJdV9jaGFyCQlzX3N0YXR1cyA9IElOQiAoU1NfUFJUKTsKKworCS8qCisJKioJTGV0IHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBza2lwIGFsbCBub3QgeWV0IHN0YXJ0ZWQgQ0NCcywKKwkqKglhbmQgY291bnQgZGlzY29ubmVjdGVkIENDQnMuIFNpbmNlIHRoZSBidXN5IHF1ZXVlIGlzIGluIAorCSoqCXRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjaGlwIHN0YXJ0IHF1ZXVlLCBkaXNjb25uZWN0ZWQgQ0NCcyAKKwkqKglhcmUgYmVmb3JlIGNwIGFuZCBidXN5IG9uZXMgYWZ0ZXIuCisJKi8KKwlpZiAobHApIHsKKwkJcXAgPSBscC0+YnVzeV9jY2JxLnByZXY7CisJCXdoaWxlIChxcCAhPSAmbHAtPmJ1c3lfY2NicSkgeworCQkJY3AyID0gbGlzdF9lbnRyeShxcCwgc3RydWN0IGNjYiwgbGlua19jY2JxKTsKKwkJCXFwICA9IHFwLT5wcmV2OworCQkJKytidXN5X2NudDsKKwkJCWlmIChjcDIgPT0gY3ApCisJCQkJYnJlYWs7CisJCQljcDItPnN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgPQorCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgc2tpcCkpOworCQl9CisJCWxwLT5oZWxkX2NjYiA9IGNwOwkvKiBSZXF1ZXVlIHdoZW4gdGhpcyBvbmUgY29tcGxldGVzICovCisJCWRpc2NfY250ID0gbHAtPnF1ZXVlZGNjYnMgLSBidXN5X2NudDsKKwl9CisKKwlzd2l0Y2goc19zdGF0dXMpIHsKKwlkZWZhdWx0OgkvKiBKdXN0IGZvciBzYWZldHksIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwljYXNlIFNfUVVFVUVfRlVMTDoKKwkJLyoKKwkJKioJRGVjcmVhc2UgbnVtYmVyIG9mIHRhZ3MgdG8gdGhlIG51bWJlciBvZiAKKwkJKioJZGlzY29ubmVjdGVkIGNvbW1hbmRzLgorCQkqLworCQlpZiAoIWxwKQorCQkJZ290byBvdXQ7CisJCWlmIChib290dmVyYm9zZSA+PSAxKSB7CisJCQlQUklOVF9BRERSKGNtZCwgIlFVRVVFIEZVTEwhICVkIGJ1c3ksICVkIGRpc2Nvbm5lY3RlZCAiCisJCQkJCSJDQ0JzXG4iLCBidXN5X2NudCwgZGlzY19jbnQpOworCQl9CisJCWlmIChkaXNjX2NudCA8IGxwLT5udW10YWdzKSB7CisJCQlscC0+bnVtdGFncwk9IGRpc2NfY250ID4gMiA/IGRpc2NfY250IDogMjsKKwkJCWxwLT5udW1fZ29vZAk9IDA7CisJCQluY3Jfc2V0dXBfdGFncyAobnAsIGNtZC0+ZGV2aWNlKTsKKwkJfQorCQkvKgorCQkqKglSZXF1ZXVlIHRoZSBjb21tYW5kIHRvIHRoZSBzdGFydCBxdWV1ZS4KKwkJKioJSWYgYW55IGRpc2Nvbm5lY3RlZCBjb21tYW5kcywKKwkJKioJCUNsZWFyIFNJR1AuCisJCSoqCQlKdW1wIHRvIHJlc2VsZWN0LgorCQkqLworCQljcC0+cGh5cy5oZWFkZXIuc2F2ZXAgPSBjcC0+c3RhcnRwOworCQljcC0+aG9zdF9zdGF0dXMgPSBIU19CVVNZOworCQljcC0+c2NzaV9zdGF0dXMgPSBTX0lMTEVHQUw7CisKKwkJbmNyX3B1dF9zdGFydF9xdWV1ZShucCwgY3ApOworCQlpZiAoZGlzY19jbnQpCisJCQlJTkIgKG5jX2N0ZXN0Mik7CQkvKiBDbGVhciBTSUdQICovCisJCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCByZXNlbGVjdCkpOworCQlyZXR1cm47CisJY2FzZSBTX1RFUk1JTkFURUQ6CisJY2FzZSBTX0NIRUNLX0NPTkQ6CisJCS8qCisJCSoqCUlmIHdlIHdlcmUgcmVxdWVzdGluZyBzZW5zZSwgZ2l2ZSB1cC4KKwkJKi8KKwkJaWYgKGNwLT5hdXRvX3NlbnNlKQorCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJKioJRGV2aWNlIHJldHVybmVkIENIRUNLIENPTkRJVElPTiBzdGF0dXMuCisJCSoqCVByZXBhcmUgYWxsIG5lZWRlZCBkYXRhIHN0cnV0dXJlcyBmb3IgZ2V0dGluZyAKKwkJKioJc2Vuc2UgZGF0YS4KKwkJKioKKwkJKioJaWRlbnRpZnkgbWVzc2FnZQorCQkqLworCQljcC0+c2NzaV9zbXNnMlswXQk9IElERU5USUZZKDAsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQljcC0+cGh5cy5zbXNnLmFkZHIJPSBjcHVfdG9fc2NyKENDQl9QSFlTIChjcCwgc2NzaV9zbXNnMikpOworCQljcC0+cGh5cy5zbXNnLnNpemUJPSBjcHVfdG9fc2NyKDEpOworCisJCS8qCisJCSoqCXNlbnNlIGNvbW1hbmQKKwkJKi8KKwkJY3AtPnBoeXMuY21kLmFkZHIJPSBjcHVfdG9fc2NyKENDQl9QSFlTIChjcCwgc2Vuc2VjbWQpKTsKKwkJY3AtPnBoeXMuY21kLnNpemUJPSBjcHVfdG9fc2NyKDYpOworCisJCS8qCisJCSoqCXBhdGNoIHJlcXVlc3RlZCBzaXplIGludG8gc2Vuc2UgY29tbWFuZAorCQkqLworCQljcC0+c2Vuc2VjbWRbMF0JCT0gMHgwMzsKKwkJY3AtPnNlbnNlY21kWzFdCQk9IGNtZC0+ZGV2aWNlLT5sdW4gPDwgNTsKKwkJY3AtPnNlbnNlY21kWzRdCQk9IHNpemVvZihjcC0+c2Vuc2VfYnVmKTsKKworCQkvKgorCQkqKglzZW5zZSBkYXRhCisJCSovCisJCW1lbXNldChjcC0+c2Vuc2VfYnVmLCAwLCBzaXplb2YoY3AtPnNlbnNlX2J1ZikpOworCQljcC0+cGh5cy5zZW5zZS5hZGRyCT0gY3B1X3RvX3NjcihDQ0JfUEhZUyhjcCxzZW5zZV9idWZbMF0pKTsKKwkJY3AtPnBoeXMuc2Vuc2Uuc2l6ZQk9IGNwdV90b19zY3Ioc2l6ZW9mKGNwLT5zZW5zZV9idWYpKTsKKworCQkvKgorCQkqKglyZXF1ZXVlIHRoZSBjb21tYW5kLgorCQkqLworCQlzdGFydHAgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzZGF0YV9pbikpOworCisJCWNwLT5waHlzLmhlYWRlci5zYXZlcAk9IHN0YXJ0cDsKKwkJY3AtPnBoeXMuaGVhZGVyLmdvYWxwCT0gc3RhcnRwICsgMjQ7CisJCWNwLT5waHlzLmhlYWRlci5sYXN0cAk9IHN0YXJ0cDsKKwkJY3AtPnBoeXMuaGVhZGVyLndnb2FscAk9IHN0YXJ0cCArIDI0OworCQljcC0+cGh5cy5oZWFkZXIud2xhc3RwCT0gc3RhcnRwOworCisJCWNwLT5ob3N0X3N0YXR1cyA9IEhTX0JVU1k7CisJCWNwLT5zY3NpX3N0YXR1cyA9IFNfSUxMRUdBTDsKKwkJY3AtPmF1dG9fc2Vuc2UJPSBzX3N0YXR1czsKKworCQljcC0+c3RhcnQuc2NoZWR1bGUubF9wYWRkciA9CisJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHNlbGVjdCkpOworCisJCS8qCisJCSoqCVNlbGVjdCB3aXRob3V0IEFUTiBmb3IgcXVpcmt5IGRldmljZXMuCisJCSovCisJCWlmIChjbWQtPmRldmljZS0+c2VsZWN0X25vX2F0bikKKwkJCWNwLT5zdGFydC5zY2hlZHVsZS5sX3BhZGRyID0KKwkJCWNwdV90b19zY3IoTkNCX1NDUklQVEhfUEhZUyAobnAsIHNlbGVjdF9ub19hdG4pKTsKKworCQluY3JfcHV0X3N0YXJ0X3F1ZXVlKG5wLCBjcCk7CisKKwkJT1VUTF9EU1AgKE5DQl9TQ1JJUFRfUEhZUyAobnAsIHN0YXJ0KSk7CisJCXJldHVybjsKKwl9CisKK291dDoKKwlPVVRPTkJfU1REICgpOworCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKiogICAgICBuY3IgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgcHJvZ3JhbW1lZCBpbnRlcnJ1cHRzLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3ZvaWQgbmNyX2ludF9zaXIgKHN0cnVjdCBuY2IgKm5wKQoreworCXVfY2hhciBzY250bDM7CisJdV9jaGFyIGNoZywgb2ZzLCBwZXIsIGZhaywgd2lkZTsKKwl1X2NoYXIgbnVtID0gSU5CIChuY19kc3BzKTsKKwlzdHJ1Y3QgY2NiICpjcD1OVUxMOworCXVfbG9uZwlkc2EgICAgPSBJTkwgKG5jX2RzYSk7CisJdV9jaGFyCXRhcmdldCA9IElOQiAobmNfc2RpZCkgJiAweDBmOworCXN0cnVjdCB0Y2IgKnRwICAgICA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHAtPnN0YXJnZXQ7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGsgKCJJIyVkIiwgbnVtKTsKKworCXN3aXRjaCAobnVtKSB7CisJY2FzZSBTSVJfSU5URkxZOgorCQkvKgorCQkqKglUaGlzIGlzIHVzZWQgZm9yIEhQIFphbG9uLzUzYzcyMCB3aGVyZSBJTlRGTFkKKwkJKioJb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBicm9rZW4uCisJCSovCisJCW5jcl93YWtldXBfZG9uZShucCk7CisjaWZkZWYgU0NTSV9OQ1JfQ0NCX0RPTkVfU1VQUE9SVAorCQlPVVRMKG5jX2RzcCwgTkNCX1NDUklQVF9QSFlTIChucCwgZG9uZV9lbmQpICsgOCk7CisjZWxzZQorCQlPVVRMKG5jX2RzcCwgTkNCX1NDUklQVF9QSFlTIChucCwgc3RhcnQpKTsKKyNlbmRpZgorCQlyZXR1cm47CisJY2FzZSBTSVJfUkVTRUxfTk9fTVNHX0lOOgorCWNhc2UgU0lSX1JFU0VMX05PX0lERU5USUZZOgorCQkvKgorCQkqKglJZiBkZXZpY2VzIHJlc2VsZWN0aW5nIHdpdGhvdXQgc2VuZGluZyBhbiBJREVOVElGWSAKKwkJKioJbWVzc2FnZSBzdGlsbCBleGlzdCwgdGhpcyBzaG91bGQgaGVscC4KKwkJKioJV2UganVzdCBhc3N1bWUgbHVuPTAsIDEgQ0NCLCBubyB0YWcuCisJCSovCisJCWlmICh0cC0+bHBbMF0pIHsgCisJCQlPVVRMX0RTUCAoc2NyX3RvX2NwdSh0cC0+bHBbMF0tPmp1bXBfY2NiWzBdKSk7CisJCQlyZXR1cm47CisJCX0KKwljYXNlIFNJUl9SRVNFTF9CQURfVEFSR0VUOgkvKiBXaWxsIHNlbmQgYSBUQVJHRVQgUkVTRVQgbWVzc2FnZSAqLworCWNhc2UgU0lSX1JFU0VMX0JBRF9MVU46CQkvKiBXaWxsIHNlbmQgYSBUQVJHRVQgUkVTRVQgbWVzc2FnZSAqLworCWNhc2UgU0lSX1JFU0VMX0JBRF9JX1RfTF9ROgkvKiBXaWxsIHNlbmQgYW4gQUJPUlQgVEFHIG1lc3NhZ2UgICAqLworCWNhc2UgU0lSX1JFU0VMX0JBRF9JX1RfTDoJLyogV2lsbCBzZW5kIGFuIEFCT1JUIG1lc3NhZ2UJICAgICovCisJCXByaW50ayAoIiVzOiVkOiBTSVIgJWQsICIKKwkJCSJpbmNvcnJlY3QgbmV4dXMgaWRlbnRpZmljYXRpb24gb24gcmVzZWxlY3Rpb25cbiIsCisJCQluY3JfbmFtZSAobnApLCB0YXJnZXQsIG51bSk7CisJCWdvdG8gb3V0OworCWNhc2UgU0lSX0RPTkVfT1ZFUkZMT1c6CisJCXByaW50ayAoIiVzOiVkOiBTSVIgJWQsICIKKwkJCSJDQ0IgZG9uZSBxdWV1ZSBvdmVyZmxvd1xuIiwKKwkJCW5jcl9uYW1lIChucCksIHRhcmdldCwgbnVtKTsKKwkJZ290byBvdXQ7CisJY2FzZSBTSVJfQkFEX1NUQVRVUzoKKwkJY3AgPSBucC0+aGVhZGVyLmNwOworCQlpZiAoIWNwIHx8IENDQl9QSFlTIChjcCwgcGh5cykgIT0gZHNhKQorCQkJZ290byBvdXQ7CisJCW5jcl9zaXJfdG9fcmVkbyhucCwgbnVtLCBjcCk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQkvKgorCQkqKglsb29rdXAgdGhlIGNjYgorCQkqLworCQljcCA9IG5wLT5jY2I7CisJCXdoaWxlIChjcCAmJiAoQ0NCX1BIWVMgKGNwLCBwaHlzKSAhPSBkc2EpKQorCQkJY3AgPSBjcC0+bGlua19jY2I7CisKKwkJQlVHX09OKCFjcCk7CisJCUJVR19PTihjcCAhPSBucC0+aGVhZGVyLmNwKTsKKworCQlpZiAoIWNwIHx8IGNwICE9IG5wLT5oZWFkZXIuY3ApCisJCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKG51bSkgeworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVdhcyBTaWUgc2Nob24gaW1tZXIgdWViZXIgdHJhbnNmZXJtb2RlIG5lZ290aWF0aW9uIHdpc3NlbiB3b2xsdGVuIC4uLgorKioKKyoqCVdlIHRyeSB0byBuZWdvdGlhdGUgc3luYyBhbmQgd2lkZSB0cmFuc2ZlciBvbmx5IGFmdGVyCisqKglhIHN1Y2Nlc3NmdWwgaW5xdWlyZSBjb21tYW5kLiBXZSBsb29rIGF0IGJ5dGUgNyBvZiB0aGUKKyoqCWlucXVpcmUgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdGFyZ2V0LgorKioKKyoqCVdoZW4gd2UgdHJ5IHRvIG5lZ290aWF0ZSwgd2UgYXBwZW5kIHRoZSBuZWdvdGlhdGlvbiBtZXNzYWdlCisqKgl0byB0aGUgaWRlbnRpZnkgYW5kIChtYXliZSkgc2ltcGxlIHRhZyBtZXNzYWdlLgorKioJVGhlIGhvc3Qgc3RhdHVzIGZpZWxkIGlzIHNldCB0byBIU19ORUdPVElBVEUgdG8gbWFyayB0aGlzCisqKglzaXR1YXRpb24uCisqKgorKioJSWYgdGhlIHRhcmdldCBkb2Vzbid0IGFuc3dlciB0aGlzIG1lc3NhZ2UgaW1taWRpYXRlbHkKKyoqCShhcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQpLCB0aGUgU0lSX05FR09fRkFJTCBpbnRlcnJ1cHQKKyoqCXdpbGwgYmUgcmFpc2VkIGV2ZW50dWFsbHkuCisqKglUaGUgaGFuZGxlciByZW1vdmVzIHRoZSBIU19ORUdPVElBVEUgc3RhdHVzLCBhbmQgc2V0cyB0aGUKKyoqCW5lZ290aWF0ZWQgdmFsdWUgdG8gdGhlIGRlZmF1bHQgKGFzeW5jIC8gbm93aWRlKS4KKyoqCisqKglJZiB3ZSByZWNlaXZlIGEgbWF0Y2hpbmcgYW5zd2VyIGltbWVkaWF0ZWx5LCB3ZSBjaGVjayBpdAorKioJZm9yIHZhbGlkaXR5LCBhbmQgc2V0IHRoZSB2YWx1ZXMuCisqKgorKioJSWYgd2UgcmVjZWl2ZSBhIFJlamVjdCBtZXNzYWdlIGltbWVkaWF0ZWx5LCB3ZSBhc3N1bWUgdGhlCisqKgluZWdvdGlhdGlvbiBoYXMgZmFpbGVkLCBhbmQgZmFsbCBiYWNrIHRvIHN0YW5kYXJkIHZhbHVlcy4KKyoqCisqKglJZiB3ZSByZWNlaXZlIGEgbmVnb3RpYXRpb24gbWVzc2FnZSB3aGlsZSBub3QgaW4gSFNfTkVHT1RJQVRFCisqKglzdGF0ZSwgaXQncyBhIHRhcmdldCBpbml0aWF0ZWQgbmVnb3RpYXRpb24uIFdlIHByZXBhcmUgYQorKioJKGhvcGVmdWxseSkgdmFsaWQgYW5zd2VyLCBzZXQgb3VyIHBhcmFtZXRlcnMsIGFuZCBzZW5kIGJhY2sgCisqKgl0aGlzIGFuc3dlciB0byB0aGUgdGFyZ2V0LgorKioKKyoqCUlmIHRoZSB0YXJnZXQgZG9lc24ndCBmZXRjaCB0aGUgYW5zd2VyIChubyBtZXNzYWdlIG91dCBwaGFzZSksCisqKgl3ZSBhc3N1bWUgdGhlIG5lZ290aWF0aW9uIGhhcyBmYWlsZWQsIGFuZCBmYWxsIGJhY2sgdG8gZGVmYXVsdAorKioJc2V0dGluZ3MuCisqKgorKioJV2hlbiB3ZSBzZXQgdGhlIHZhbHVlcywgd2UgYWRqdXN0IHRoZW0gaW4gYWxsIGNjYnMgYmVsb25naW5nIAorKioJdG8gdGhpcyB0YXJnZXQsIGluIHRoZSBjb250cm9sbGVyJ3MgcmVnaXN0ZXIsIGFuZCBpbiB0aGUgInBoeXMiCisqKglmaWVsZCBvZiB0aGUgY29udHJvbGxlcidzIHN0cnVjdCBuY2IuCisqKgorKioJUG9zc2libGUgY2FzZXM6CQkgICBocyAgc2lyICAgbXNnX2luIHZhbHVlICBzZW5kICAgZ290bworKioJV2UgdHJ5IHRvIG5lZ290aWF0ZToKKyoqCS0+IHRhcmdldCBkb2Vzbid0IG1zZ2luICAgIE5FRyBGQUlMICBub29wICAgZGVmYS4gIC0gICAgICBkaXNwYXRjaAorKioJLT4gdGFyZ2V0IHJlamVjdGVkIG91ciBtc2cgTkVHIEZBSUwgIHJlamVjdCBkZWZhLiAgLSAgICAgIGRpc3BhdGNoCisqKgktPiB0YXJnZXQgYW5zd2VyZWQgIChvaykgICBORUcgU1lOQyAgc2R0ciAgIHNldCAgICAtICAgICAgY2xyYWNrCisqKgktPiB0YXJnZXQgYW5zd2VyZWQgKCFvaykgICBORUcgU1lOQyAgc2R0ciAgIGRlZmEuICBSRUotLS0+bXNnX2JhZAorKioJLT4gdGFyZ2V0IGFuc3dlcmVkICAob2spICAgTkVHIFdJREUgIHdkdHIgICBzZXQgICAgLSAgICAgIGNscmFjaworKioJLT4gdGFyZ2V0IGFuc3dlcmVkICghb2spICAgTkVHIFdJREUgIHdkdHIgICBkZWZhLiAgUkVKLS0tPm1zZ19iYWQKKyoqCS0+IGFueSBvdGhlciBtc2dpbgkgICBORUcgRkFJTCAgbm9vcCAgIGRlZmEuICAtICAgICAgZGlzcGF0Y2gKKyoqCisqKglUYXJnZXQgdHJpZXMgdG8gbmVnb3RpYXRlOgorKioJLT4gaW5jb21pbmcgbWVzc2FnZQkgICAtLS0gU1lOQyAgc2R0ciAgIHNldCAgICBTRFRSICAgLQorKioJLT4gaW5jb21pbmcgbWVzc2FnZQkgICAtLS0gV0lERSAgd2R0ciAgIHNldCAgICBXRFRSICAgLQorKiogICAgICBXZSBzZW50IG91ciBhbnN3ZXI6CisqKgktPiB0YXJnZXQgZG9lc24ndCBtc2dvdXQgICAtLS0gUFJPVE8gPyAgICAgIGRlZmEuICAtICAgICAgZGlzcGF0Y2gKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisJY2FzZSBTSVJfTkVHT19GQUlMRUQ6CisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqKgorCQkqKglOZWdvdGlhdGlvbiBmYWlsZWQuCisJCSoqCVRhcmdldCBkb2Vzbid0IHNlbmQgYW4gYW5zd2VyIG1lc3NhZ2UsCisJCSoqCW9yIHRhcmdldCByZWplY3RlZCBvdXIgbWVzc2FnZS4KKwkJKioKKwkJKiogICAgICBSZW1vdmUgbmVnb3RpYXRpb24gcmVxdWVzdC4KKwkJKioKKwkJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSovCisJCU9VVEIgKEhTX1BSVCwgSFNfQlVTWSk7CisKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIFNJUl9ORUdPX1BST1RPOgorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKioKKwkJKioJTmVnb3RpYXRpb24gZmFpbGVkLgorCQkqKglUYXJnZXQgZG9lc24ndCBmZXRjaCB0aGUgYW5zd2VyIG1lc3NhZ2UuCisJCSoqCisJCSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqLworCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCVBSSU5UX0FERFIoY3AtPmNtZCwgIm5lZ290aWF0aW9uIGZhaWxlZCBzaXI9JXggIgorCQkJCQkic3RhdHVzPSV4LlxuIiwgbnVtLCBjcC0+bmVnb19zdGF0dXMpOworCQl9CisKKwkJLyoKKwkJKioJYW55IGVycm9yIGluIG5lZ290aWF0aW9uOgorCQkqKglmYWxsIGJhY2sgdG8gZGVmYXVsdCBtb2RlLgorCQkqLworCQlzd2l0Y2ggKGNwLT5uZWdvX3N0YXR1cykgeworCisJCWNhc2UgTlNfU1lOQzoKKwkJCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSAwOworCQkJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CisJCQluY3Jfc2V0c3luYyAobnAsIGNwLCAwLCAweGUwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTlNfV0lERToKKwkJCXNwaV93aWR0aChzdGFyZ2V0KSA9IDA7CisJCQluY3Jfc2V0d2lkZSAobnAsIGNwLCAwLCAwKTsKKwkJCWJyZWFrOworCisJCX0KKwkJbnAtPm1zZ2luIFswXSA9IE1fTk9PUDsKKwkJbnAtPm1zZ291dFswXSA9IE1fTk9PUDsKKwkJY3AtPm5lZ29fc3RhdHVzID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9ORUdPX1NZTkM6CisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCW5jcl9wcmludF9tc2coY3AsICJzeW5jIG1zZ2luIiwgbnAtPm1zZ2luKTsKKwkJfQorCisJCWNoZyA9IDA7CisJCXBlciA9IG5wLT5tc2dpblszXTsKKwkJb2ZzID0gbnAtPm1zZ2luWzRdOworCQlpZiAob2ZzPT0wKSBwZXI9MjU1OworCisJCS8qCisJCSoqICAgICAgaWYgdGFyZ2V0IHNlbmRzIFNEVFIgbWVzc2FnZSwKKwkJKioJICAgICAgaXQgQ0FOIHRyYW5zZmVyIHN5bmNoLgorCQkqLworCisJCWlmIChvZnMgJiYgc3RhcmdldCkKKwkJCXNwaV9zdXBwb3J0X3N5bmMoc3RhcmdldCkgPSAxOworCisJCS8qCisJCSoqCWNoZWNrIHZhbHVlcyBhZ2FpbnN0IGRyaXZlciBsaW1pdHMuCisJCSovCisKKwkJaWYgKHBlciA8IG5wLT5taW5zeW5jKQorCQkJe2NoZyA9IDE7IHBlciA9IG5wLT5taW5zeW5jO30KKwkJaWYgKHBlciA8IHRwLT5taW5zeW5jKQorCQkJe2NoZyA9IDE7IHBlciA9IHRwLT5taW5zeW5jO30KKwkJaWYgKG9mcyA+IHRwLT5tYXhvZmZzKQorCQkJe2NoZyA9IDE7IG9mcyA9IHRwLT5tYXhvZmZzO30KKworCQkvKgorCQkqKglDaGVjayBhZ2FpbnN0IGNvbnRyb2xsZXIgbGltaXRzLgorCQkqLworCQlmYWsJPSA3OworCQlzY250bDMJPSAwOworCQlpZiAob2ZzICE9IDApIHsKKwkJCW5jcl9nZXRzeW5jKG5wLCBwZXIsICZmYWssICZzY250bDMpOworCQkJaWYgKGZhayA+IDcpIHsKKwkJCQljaGcgPSAxOworCQkJCW9mcyA9IDA7CisJCQl9CisJCX0KKwkJaWYgKG9mcyA9PSAwKSB7CisJCQlmYWsJPSA3OworCQkJcGVyCT0gMDsKKwkJCXNjbnRsMwk9IDA7CisJCQl0cC0+bWluc3luYyA9IDA7CisJCX0KKworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCQlQUklOVF9BRERSKGNwLT5jbWQsICJzeW5jOiBwZXI9JWQgc2NudGwzPTB4JXggb2ZzPSVkICIKKwkJCQkiZmFrPSVkIGNoZz0lZC5cbiIsIHBlciwgc2NudGwzLCBvZnMsIGZhaywgY2hnKTsKKwkJfQorCisJCWlmIChJTkIgKEhTX1BSVCkgPT0gSFNfTkVHT1RJQVRFKSB7CisJCQlPVVRCIChIU19QUlQsIEhTX0JVU1kpOworCQkJc3dpdGNoIChjcC0+bmVnb19zdGF0dXMpIHsKKworCQkJY2FzZSBOU19TWU5DOgorCQkJCS8qIFRoaXMgd2FzIGFuIGFuc3dlciBtZXNzYWdlICovCisJCQkJaWYgKGNoZykgeworCQkJCQkvKiBBbnN3ZXIgd2Fzbid0IGFjY2VwdGFibGUuICAqLworCQkJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gMDsKKwkJCQkJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CisJCQkJCW5jcl9zZXRzeW5jKG5wLCBjcCwgMCwgMHhlMCk7CisJCQkJCU9VVExfRFNQKE5DQl9TQ1JJUFRfUEhZUyAobnAsIG1zZ19iYWQpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBBbnN3ZXIgaXMgb2suICAqLworCQkJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gcGVyOworCQkJCQlzcGlfb2Zmc2V0KHN0YXJnZXQpID0gb2ZzOworCQkJCQluY3Jfc2V0c3luYyhucCwgY3AsIHNjbnRsMywgKGZhazw8NSl8b2ZzKTsKKwkJCQkJT1VUTF9EU1AoTkNCX1NDUklQVF9QSFlTIChucCwgY2xyYWNrKSk7CisJCQkJfQorCQkJCXJldHVybjsKKworCQkJY2FzZSBOU19XSURFOgorCQkJCXNwaV93aWR0aChzdGFyZ2V0KSA9IDA7CisJCQkJbmNyX3NldHdpZGUobnAsIGNwLCAwLCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSoqCUl0IHdhcyBhIHJlcXVlc3QuIFNldCB2YWx1ZSBhbmQKKwkJKiogICAgICBwcmVwYXJlIGFuIGFuc3dlciBtZXNzYWdlCisJCSovCisKKwkJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IHBlcjsKKwkJc3BpX29mZnNldChzdGFyZ2V0KSA9IG9mczsKKwkJbmNyX3NldHN5bmMobnAsIGNwLCBzY250bDMsIChmYWs8PDUpfG9mcyk7CisKKwkJbnAtPm1zZ291dFswXSA9IE1fRVhURU5ERUQ7CisJCW5wLT5tc2dvdXRbMV0gPSAzOworCQlucC0+bXNnb3V0WzJdID0gTV9YX1NZTkNfUkVROworCQlucC0+bXNnb3V0WzNdID0gcGVyOworCQlucC0+bXNnb3V0WzRdID0gb2ZzOworCisJCWNwLT5uZWdvX3N0YXR1cyA9IE5TX1NZTkM7CisKKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQkJbmNyX3ByaW50X21zZyhjcCwgInN5bmMgbXNnb3V0IiwgbnAtPm1zZ291dCk7CisJCX0KKworCQlpZiAoIW9mcykgeworCQkJT1VUTF9EU1AgKE5DQl9TQ1JJUFRfUEhZUyAobnAsIG1zZ19iYWQpKTsKKwkJCXJldHVybjsKKwkJfQorCQlucC0+bXNnaW4gWzBdID0gTV9OT09QOworCisJCWJyZWFrOworCisJY2FzZSBTSVJfTkVHT19XSURFOgorCQkvKgorCQkqKglXaWRlIHJlcXVlc3QgbWVzc2FnZSByZWNlaXZlZC4KKwkJKi8KKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQkJbmNyX3ByaW50X21zZyhjcCwgIndpZGUgbXNnaW4iLCBucC0+bXNnaW4pOworCQl9CisKKwkJLyoKKwkJKioJZ2V0IHJlcXVlc3RlZCB2YWx1ZXMuCisJCSovCisKKwkJY2hnICA9IDA7CisJCXdpZGUgPSBucC0+bXNnaW5bM107CisKKwkJLyoKKwkJKiogICAgICBpZiB0YXJnZXQgc2VuZHMgV0RUUiBtZXNzYWdlLAorCQkqKgkgICAgICBpdCBDQU4gdHJhbnNmZXIgd2lkZS4KKwkJKi8KKworCQlpZiAod2lkZSAmJiBzdGFyZ2V0KQorCQkJc3BpX3N1cHBvcnRfd2lkZShzdGFyZ2V0KSA9IDE7CisKKwkJLyoKKwkJKioJY2hlY2sgdmFsdWVzIGFnYWluc3QgZHJpdmVyIGxpbWl0cy4KKwkJKi8KKworCQlpZiAod2lkZSA+IHRwLT51c3J3aWRlKQorCQkJe2NoZyA9IDE7IHdpZGUgPSB0cC0+dXNyd2lkZTt9CisKKwkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQkJUFJJTlRfQUREUihjcC0+Y21kLCAid2lkZTogd2lkZT0lZCBjaGc9JWQuXG4iLCB3aWRlLAorCQkJCQljaGcpOworCQl9CisKKwkJaWYgKElOQiAoSFNfUFJUKSA9PSBIU19ORUdPVElBVEUpIHsKKwkJCU9VVEIgKEhTX1BSVCwgSFNfQlVTWSk7CisJCQlzd2l0Y2ggKGNwLT5uZWdvX3N0YXR1cykgeworCisJCQljYXNlIE5TX1dJREU6CisJCQkJLyoKKwkJCQkqKiAgICAgIFRoaXMgd2FzIGFuIGFuc3dlciBtZXNzYWdlCisJCQkJKi8KKwkJCQlpZiAoY2hnKSB7CisJCQkJCS8qIEFuc3dlciB3YXNuJ3QgYWNjZXB0YWJsZS4gICovCisJCQkJCXNwaV93aWR0aChzdGFyZ2V0KSA9IDA7CisJCQkJCW5jcl9zZXR3aWRlKG5wLCBjcCwgMCwgMSk7CisJCQkJCU9VVExfRFNQIChOQ0JfU0NSSVBUX1BIWVMgKG5wLCBtc2dfYmFkKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQW5zd2VyIGlzIG9rLiAgKi8KKwkJCQkJc3BpX3dpZHRoKHN0YXJnZXQpID0gd2lkZTsKKwkJCQkJbmNyX3NldHdpZGUobnAsIGNwLCB3aWRlLCAxKTsKKwkJCQkJT1VUTF9EU1AgKE5DQl9TQ1JJUFRfUEhZUyAobnAsIGNscmFjaykpOworCQkJCX0KKwkJCQlyZXR1cm47CisKKwkJCWNhc2UgTlNfU1lOQzoKKwkJCQlzcGlfcGVyaW9kKHN0YXJnZXQpID0gMDsKKwkJCQlzcGlfb2Zmc2V0KHN0YXJnZXQpID0gMDsKKwkJCQluY3Jfc2V0c3luYyhucCwgY3AsIDAsIDB4ZTApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoKKwkJKioJSXQgd2FzIGEgcmVxdWVzdCwgc2V0IHZhbHVlIGFuZAorCQkqKiAgICAgIHByZXBhcmUgYW4gYW5zd2VyIG1lc3NhZ2UKKwkJKi8KKworCQlzcGlfd2lkdGgoc3RhcmdldCkgPSB3aWRlOworCQluY3Jfc2V0d2lkZShucCwgY3AsIHdpZGUsIDEpOworCisJCW5wLT5tc2dvdXRbMF0gPSBNX0VYVEVOREVEOworCQlucC0+bXNnb3V0WzFdID0gMjsKKwkJbnAtPm1zZ291dFsyXSA9IE1fWF9XSURFX1JFUTsKKwkJbnAtPm1zZ291dFszXSA9IHdpZGU7CisKKwkJbnAtPm1zZ2luIFswXSA9IE1fTk9PUDsKKworCQljcC0+bmVnb19zdGF0dXMgPSBOU19XSURFOworCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCW5jcl9wcmludF9tc2coY3AsICJ3aWRlIG1zZ291dCIsIG5wLT5tc2dpbik7CisJCX0KKwkJYnJlYWs7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglQcm9jZXNzaW5nIG9mIHNwZWNpYWwgbWVzc2FnZXMKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisJY2FzZSBTSVJfUkVKRUNUX1JFQ0VJVkVEOgorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSoqCisJCSoqCVdlIHJlY2VpdmVkIGEgTV9SRUpFQ1QgbWVzc2FnZS4KKwkJKioKKwkJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqLworCisJCVBSSU5UX0FERFIoY3AtPmNtZCwgIk1fUkVKRUNUIHJlY2VpdmVkICgleDoleCkuXG4iLAorCQkJKHVuc2lnbmVkKXNjcl90b19jcHUobnAtPmxhc3Rtc2cpLCBucC0+bXNnb3V0WzBdKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJUl9SRUpFQ1RfU0VOVDoKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqKgorCQkqKglXZSByZWNlaXZlZCBhbiB1bmtub3duIG1lc3NhZ2UKKwkJKioKKwkJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqLworCisJCW5jcl9wcmludF9tc2coY3AsICJNX1JFSkVDVCBzZW50IGZvciIsIG5wLT5tc2dpbik7CisJCWJyZWFrOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJUHJvY2Vzc2luZyBvZiBzcGVjaWFsIG1lc3NhZ2VzCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCWNhc2UgU0lSX0lHTl9SRVNJRFVFOgorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSoqCisJCSoqCVdlIHJlY2VpdmVkIGFuIElHTk9SRSBSRVNJRFVFIG1lc3NhZ2UsCisJCSoqCXdoaWNoIGNvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHNjcmlwdC4KKwkJKioKKwkJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqLworCisJCVBSSU5UX0FERFIoY3AtPmNtZCwgIk1fSUdOX1JFU0lEVUUgcmVjZWl2ZWQsIGJ1dCBub3QgeWV0ICIKKwkJCQkiaW1wbGVtZW50ZWQuXG4iKTsKKwkJYnJlYWs7CisjaWYgMAorCWNhc2UgU0lSX01JU1NJTkdfU0FWRToKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqKgorCQkqKglXZSByZWNlaXZlZCBhbiBESVNDT05ORUNUIG1lc3NhZ2UsCisJCSoqCWJ1dCB0aGUgZGF0YXBvaW50ZXIgd2Fzbid0IHNhdmVkIGJlZm9yZS4KKwkJKioKKwkJKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkqLworCisJCVBSSU5UX0FERFIoY3AtPmNtZCwgIk1fRElTQ09OTkVDVCByZWNlaXZlZCwgYnV0IGRhdGFwb2ludGVyICIKKwkJCQkibm90IHNhdmVkOiBkYXRhPSV4IHNhdmU9JXggZ29hbD0leC5cbiIsCisJCQkodW5zaWduZWQpIElOTCAobmNfdGVtcCksCisJCQkodW5zaWduZWQpIHNjcl90b19jcHUobnAtPmhlYWRlci5zYXZlcCksCisJCQkodW5zaWduZWQpIHNjcl90b19jcHUobnAtPmhlYWRlci5nb2FscCkpOworCQlicmVhazsKKyNlbmRpZgorCX0KKworb3V0OgorCU9VVE9OQl9TVEQgKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglBY3F1aXJlIGEgY29udHJvbCBibG9jaworKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyBzdHJ1Y3QgY2NiICpuY3JfZ2V0X2NjYihzdHJ1Y3QgbmNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXVfY2hhciB0biA9IGNtZC0+ZGV2aWNlLT5pZDsKKwl1X2NoYXIgbG4gPSBjbWQtPmRldmljZS0+bHVuOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBsY2IgKmxwID0gdHAtPmxwW2xuXTsKKwl1X2NoYXIgdGFnID0gTk9fVEFHOworCXN0cnVjdCBjY2IgKmNwID0gTlVMTDsKKworCS8qCisJKioJTHVuIHN0cnVjdHVyZSBhdmFpbGFibGUgPworCSovCisJaWYgKGxwKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnFwOworCQkvKgorCQkqKglLZWVwIGZyb20gdXNpbmcgbW9yZSB0YWdzIHRoYW4gd2UgY2FuIGhhbmRsZS4KKwkJKi8KKwkJaWYgKGxwLT51c2V0YWdzICYmIGxwLT5idXN5Y2NicyA+PSBscC0+bWF4bnhzKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyoKKwkJKioJQWxsb2NhdGUgYSBuZXcgQ0NCIGlmIG5lZWRlZC4KKwkJKi8KKwkJaWYgKGxpc3RfZW1wdHkoJmxwLT5mcmVlX2NjYnEpKQorCQkJbmNyX2FsbG9jX2NjYihucCwgdG4sIGxuKTsKKworCQkvKgorCQkqKglMb29rIGZvciBmcmVlIENDQgorCQkqLworCQlxcCA9IG5jcl9saXN0X3BvcCgmbHAtPmZyZWVfY2NicSk7CisJCWlmIChxcCkgeworCQkJY3AgPSBsaXN0X2VudHJ5KHFwLCBzdHJ1Y3QgY2NiLCBsaW5rX2NjYnEpOworCQkJaWYgKGNwLT5tYWdpYykgeworCQkJCVBSSU5UX0FERFIoY21kLCAiY2NiIGZyZWUgbGlzdCBjb3JydXB0ZWQgIgorCQkJCQkJIihAJXApXG4iLCBjcCk7CisJCQkJY3AgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0X2FkZF90YWlsKHFwLCAmbHAtPndhaXRfY2NicSk7CisJCQkJKytscC0+YnVzeWNjYnM7CisJCQl9CisJCX0KKworCQkvKgorCQkqKglJZiBhIENDQiBpcyBhdmFpbGFibGUsCisJCSoqCUdldCBhIHRhZyBmb3IgdGhpcyBuZXh1cyBpZiByZXF1aXJlZC4KKwkJKi8KKwkJaWYgKGNwKSB7CisJCQlpZiAobHAtPnVzZXRhZ3MpCisJCQkJdGFnID0gbHAtPmNiX3RhZ3NbbHAtPmlhX3RhZ107CisJCX0KKwkJZWxzZSBpZiAobHAtPmFjdGNjYnMgPiAwKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkqKglpZiBub3RoaW5nIGF2YWlsYWJsZSwgdGFrZSB0aGUgZGVmYXVsdC4KKwkqLworCWlmICghY3ApCisJCWNwID0gbnAtPmNjYjsKKworCS8qCisJKioJV2FpdCB1bnRpbCBhdmFpbGFibGUuCisJKi8KKyNpZiAwCisJd2hpbGUgKGNwLT5tYWdpYykgeworCQlpZiAoZmxhZ3MgJiBTQ1NJX05PU0xFRVApIGJyZWFrOworCQlpZiAodHNsZWVwICgoY2FkZHJfdCljcCwgUFJJQklPfFBDQVRDSCwgIm5jciIsIDApKQorCQkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlpZiAoY3AtPm1hZ2ljKQorCQlyZXR1cm4gTlVMTDsKKworCWNwLT5tYWdpYyA9IDE7CisKKwkvKgorCSoqCU1vdmUgdG8gbmV4dCBhdmFpbGFibGUgdGFnIGlmIHRhZyB1c2VkLgorCSovCisJaWYgKGxwKSB7CisJCWlmICh0YWcgIT0gTk9fVEFHKSB7CisJCQkrK2xwLT5pYV90YWc7CisJCQlpZiAobHAtPmlhX3RhZyA9PSBNQVhfVEFHUykKKwkJCQlscC0+aWFfdGFnID0gMDsKKwkJCWxwLT50YWdzX3VtYXAgfD0gKCgodGFnbWFwX3QpIDEpIDw8IHRhZyk7CisJCX0KKwl9CisKKwkvKgorCSoqCVJlbWVtYmVyIGFsbCBpbmZvcm1hdGlvbnMgbmVlZGVkIHRvIGZyZWUgdGhpcyBDQ0IuCisJKi8KKwljcC0+dGFnCSAgID0gdGFnOworCWNwLT50YXJnZXQgPSB0bjsKKwljcC0+bHVuICAgID0gbG47CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19UQUdTKSB7CisJCVBSSU5UX0FERFIoY21kLCAiY2NiIEAlcCB1c2luZyB0YWcgJWQuXG4iLCBjcCwgdGFnKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglSZWxlYXNlIG9uZSBjb250cm9sIGJsb2NrCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgbmNyX2ZyZWVfY2NiIChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3ApCit7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlzdHJ1Y3QgbGNiICpscCA9IHRwLT5scFtjcC0+bHVuXTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RBR1MpIHsKKwkJUFJJTlRfQUREUihjcC0+Y21kLCAiY2NiIEAlcCBmcmVlaW5nIHRhZyAlZC5cbiIsIGNwLCBjcC0+dGFnKTsKKwl9CisKKwkvKgorCSoqCUlmIGx1biBjb250cm9sIGJsb2NrIGF2YWlsYWJsZSwKKwkqKglkZWNyZW1lbnQgYWN0aXZlIGNvbW1hbmRzIGFuZCBpbmNyZW1lbnQgY3JlZGl0LCAKKwkqKglmcmVlIHRoZSB0YWcgaWYgYW55IGFuZCByZW1vdmUgdGhlIEpVTVAgZm9yIHJlc2VsZWN0LgorCSovCisJaWYgKGxwKSB7CisJCWlmIChjcC0+dGFnICE9IE5PX1RBRykgeworCQkJbHAtPmNiX3RhZ3NbbHAtPmlmX3RhZysrXSA9IGNwLT50YWc7CisJCQlpZiAobHAtPmlmX3RhZyA9PSBNQVhfVEFHUykKKwkJCQlscC0+aWZfdGFnID0gMDsKKwkJCWxwLT50YWdzX3VtYXAgJj0gfigoKHRhZ21hcF90KSAxKSA8PCBjcC0+dGFnKTsKKwkJCWxwLT50YWdzX3NtYXAgJj0gbHAtPnRhZ3NfdW1hcDsKKwkJCWxwLT5qdW1wX2NjYltjcC0+dGFnXSA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTKG5wLCBiYWRfaV90X2xfcSkpOworCQl9IGVsc2UgeworCQkJbHAtPmp1bXBfY2NiWzBdID0KKwkJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMobnAsIGJhZF9pX3RfbCkpOworCQl9CisJfQorCisJLyoKKwkqKglNYWtlIHRoaXMgQ0NCIGF2YWlsYWJsZS4KKwkqLworCisJaWYgKGxwKSB7CisJCWlmIChjcCAhPSBucC0+Y2NiKQorCQkJbGlzdF9tb3ZlKCZjcC0+bGlua19jY2JxLCAmbHAtPmZyZWVfY2NicSk7CisJCS0tbHAtPmJ1c3ljY2JzOworCQlpZiAoY3AtPnF1ZXVlZCkgeworCQkJLS1scC0+cXVldWVkY2NiczsKKwkJfQorCX0KKwljcCAtPiBob3N0X3N0YXR1cyA9IEhTX0lETEU7CisJY3AgLT4gbWFnaWMgPSAwOworCWlmIChjcC0+cXVldWVkKSB7CisJCS0tbnAtPnF1ZXVlZGNjYnM7CisJCWNwLT5xdWV1ZWQgPSAwOworCX0KKworI2lmIDAKKwlpZiAoY3AgPT0gbnAtPmNjYikKKwkJd2FrZXVwICgoY2FkZHJfdCkgY3ApOworI2VuZGlmCit9CisKKworI2RlZmluZSBuY3JfcmVnX2J1c19hZGRyKHIpIChucC0+cGFkZHIgKyBvZmZzZXRvZiAoc3RydWN0IG5jcl9yZWcsIHIpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJSW5pdGlhbGl6ZSB0aGUgZml4ZWQgcGFydCBvZiBhIENDQiBzdHJ1Y3R1cmUuCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBuY3JfaW5pdF9jY2Ioc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwKQoreworCW5jcmNtZCBjb3B5XzQgPSBucC0+ZmVhdHVyZXMgJiBGRV9QRkVOID8gU0NSX0NPUFkoNCkgOiBTQ1JfQ09QWV9GKDQpOworCisJLyoKKwkqKglSZW1lbWJlciB2aXJ0dWFsIGFuZCBidXMgYWRkcmVzcyBvZiB0aGlzIGNjYi4KKwkqLworCWNwLT5wX2NjYiAJICAgPSB2dG9idXMoY3ApOworCWNwLT5waHlzLmhlYWRlci5jcCA9IGNwOworCisJLyoKKwkqKglUaGlzIGFsbG93cyBsaXN0X2RlbCB0byB3b3JrIGZvciB0aGUgZGVmYXVsdCBjY2IuCisJKi8KKwlJTklUX0xJU1RfSEVBRCgmY3AtPmxpbmtfY2NicSk7CisKKwkvKgorCSoqCUluaXRpYWx5emUgdGhlIHN0YXJ0IGFuZCByZXN0YXJ0IGxhdW5jaCBzY3JpcHQuCisJKioKKwkqKglDT1BZKDQpIEAoLi4ucF9waHlzKSwgQChkc2EpCisJKioJSlVNUCBAKHNjaGVkX3BvaW50KQorCSovCisJY3AtPnN0YXJ0LnNldHVwX2RzYVswXQkgPSBjcHVfdG9fc2NyKGNvcHlfNCk7CisJY3AtPnN0YXJ0LnNldHVwX2RzYVsxXQkgPSBjcHVfdG9fc2NyKENDQl9QSFlTKGNwLCBzdGFydC5wX3BoeXMpKTsKKwljcC0+c3RhcnQuc2V0dXBfZHNhWzJdCSA9IGNwdV90b19zY3IobmNyX3JlZ19idXNfYWRkcihuY19kc2EpKTsKKwljcC0+c3RhcnQuc2NoZWR1bGUubF9jbWQgPSBjcHVfdG9fc2NyKFNDUl9KVU1QKTsKKwljcC0+c3RhcnQucF9waHlzCSA9IGNwdV90b19zY3IoQ0NCX1BIWVMoY3AsIHBoeXMpKTsKKworCW1lbWNweSgmY3AtPnJlc3RhcnQsICZjcC0+c3RhcnQsIHNpemVvZihjcC0+cmVzdGFydCkpOworCisJY3AtPnN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgICA9IGNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgaWRsZSkpOworCWNwLT5yZXN0YXJ0LnNjaGVkdWxlLmxfcGFkZHIgPSBjcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBhYm9ydCkpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKglBbGxvY2F0ZSBhIENDQiBhbmQgaW5pdGlhbGl6ZSBpdHMgZml4ZWQgcGFydC4KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyB2b2lkIG5jcl9hbGxvY19jY2Ioc3RydWN0IG5jYiAqbnAsIHVfY2hhciB0biwgdV9jaGFyIGxuKQoreworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBsY2IgKmxwID0gdHAtPmxwW2xuXTsKKwlzdHJ1Y3QgY2NiICpjcCA9IE5VTEw7CisKKwkvKgorCSoqCUFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBDQ0IuCisJKi8KKwljcCA9IG1fY2FsbG9jX2RtYShzaXplb2Yoc3RydWN0IGNjYiksICJDQ0IiKTsKKwlpZiAoIWNwKQorCQlyZXR1cm47CisKKwkvKgorCSoqCUNvdW50IGl0IGFuZCBpbml0aWFseXplIGl0LgorCSovCisJbHAtPmFjdGNjYnMrKzsKKwlucC0+YWN0Y2NicysrOworCW1lbXNldChjcCwgMCwgc2l6ZW9mICgqY3ApKTsKKwluY3JfaW5pdF9jY2IobnAsIGNwKTsKKworCS8qCisJKioJQ2hhaW4gaW50byB3YWtldXAgbGlzdCBhbmQgZnJlZSBjY2IgcXVldWUgYW5kIHRha2UgaXQgCisJKioJaW50byBhY2NvdW50IGZvciB0YWdnZWQgY29tbWFuZHMuCisJKi8KKwljcC0+bGlua19jY2IgICAgICA9IG5wLT5jY2ItPmxpbmtfY2NiOworCW5wLT5jY2ItPmxpbmtfY2NiID0gY3A7CisKKwlsaXN0X2FkZCgmY3AtPmxpbmtfY2NicSwgJmxwLT5mcmVlX2NjYnEpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKiogICAgICBBbGxvY2F0aW9uIG9mIHJlc291cmNlcyBmb3IgVGFyZ2V0cy9MdW5zL1RhZ3MuCisqKgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJVGFyZ2V0IGNvbnRyb2wgYmxvY2sgaW5pdGlhbGlzYXRpb24uCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBmdWxseSBpbml0aWFsaXplZCBhZnRlciBhIFNDU0kgY29tbWFuZCAKKyoqCWhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgZm9yIHRoaXMgdGFyZ2V0LgorKioJSXQgY29udGFpbnMgYSBTQ1JJUFQgdGhhdCBpcyBjYWxsZWQgb24gdGFyZ2V0IHJlc2VsZWN0aW9uLgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBuY3JfaW5pdF90Y2IgKHN0cnVjdCBuY2IgKm5wLCB1X2NoYXIgdG4pCit7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFt0bl07CisJbmNyY21kIGNvcHlfMSA9IG5wLT5mZWF0dXJlcyAmIEZFX1BGRU4gPyBTQ1JfQ09QWSgxKSA6IFNDUl9DT1BZX0YoMSk7CisJaW50IHRoID0gdG4gJiAzOworCWludCBpOworCisJLyoKKwkqKglKdW1wIHRvIG5leHQgdGNiIGlmIFNGQlIgZG9lcyBub3QgbWF0Y2ggdGhpcyB0YXJnZXQuCisJKioJSlVNUCAgSUYgKFNGQlIgIT0gI3RhcmdldCMpLCBAKG5leHQgdGNiKQorCSovCisJdHAtPmp1bXBfdGNiLmxfY21kICAgPQorCQljcHVfdG9fc2NyKChTQ1JfSlVNUCBeIElGRkFMU0UgKERBVEEgKDB4ODAgKyB0bikpKSk7CisJdHAtPmp1bXBfdGNiLmxfcGFkZHIgPSBucC0+anVtcF90Y2JbdGhdLmxfcGFkZHI7CisKKwkvKgorCSoqCUxvYWQgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlZ2lzdGVyLgorCSoqCUNPUFkgQCh0cC0+c3ZhbCksIEAoc3hmZXIpCisJKi8KKwl0cC0+Z2V0c2NyWzBdID0JY3B1X3RvX3Njcihjb3B5XzEpOworCXRwLT5nZXRzY3JbMV0gPSBjcHVfdG9fc2NyKHZ0b2J1cyAoJnRwLT5zdmFsKSk7CisjaWZkZWYgU0NTSV9OQ1JfQklHX0VORElBTgorCXRwLT5nZXRzY3JbMl0gPSBjcHVfdG9fc2NyKG5jcl9yZWdfYnVzX2FkZHIobmNfc3hmZXIpIF4gMyk7CisjZWxzZQorCXRwLT5nZXRzY3JbMl0gPSBjcHVfdG9fc2NyKG5jcl9yZWdfYnVzX2FkZHIobmNfc3hmZXIpKTsKKyNlbmRpZgorCisJLyoKKwkqKglMb2FkIHRoZSB0aW1pbmcgcmVnaXN0ZXIuCisJKioJQ09QWSBAKHRwLT53dmFsKSwgQChzY250bDMpCisJKi8KKwl0cC0+Z2V0c2NyWzNdID0JY3B1X3RvX3Njcihjb3B5XzEpOworCXRwLT5nZXRzY3JbNF0gPSBjcHVfdG9fc2NyKHZ0b2J1cyAoJnRwLT53dmFsKSk7CisjaWZkZWYgU0NTSV9OQ1JfQklHX0VORElBTgorCXRwLT5nZXRzY3JbNV0gPSBjcHVfdG9fc2NyKG5jcl9yZWdfYnVzX2FkZHIobmNfc2NudGwzKSBeIDMpOworI2Vsc2UKKwl0cC0+Z2V0c2NyWzVdID0gY3B1X3RvX3NjcihuY3JfcmVnX2J1c19hZGRyKG5jX3NjbnRsMykpOworI2VuZGlmCisKKwkvKgorCSoqCUdldCB0aGUgSURFTlRJRlkgbWVzc2FnZSBhbmQgdGhlIGx1bi4KKwkqKglDQUxMIEBzY3JpcHQocmVzZWxfbHVuKQorCSovCisJdHAtPmNhbGxfbHVuLmxfY21kICAgPSBjcHVfdG9fc2NyKFNDUl9DQUxMKTsKKwl0cC0+Y2FsbF9sdW4ubF9wYWRkciA9IGNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgcmVzZWxfbHVuKSk7CisKKwkvKgorCSoqCUxvb2sgZm9yIHRoZSBsdW4gY29udHJvbCBibG9jayBvZiB0aGlzIG5leHVzLgorCSoqCUZvciBpID0gMCB0byAzCisJKioJCUpVTVAgXiBJRlRSVUUgKE1BU0sgKGksIDMpKSwgQChuZXh0X2xjYikKKwkqLworCWZvciAoaSA9IDAgOyBpIDwgNCA7IGkrKykgeworCQl0cC0+anVtcF9sY2JbaV0ubF9jbWQgICA9CisJCQkJY3B1X3RvX3NjcigoU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKGksIDMpKSkpOworCQl0cC0+anVtcF9sY2JbaV0ubF9wYWRkciA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgYmFkX2lkZW50aWZ5KSk7CisJfQorCisJLyoKKwkqKglMaW5rIHRoaXMgdGFyZ2V0IGNvbnRyb2wgYmxvY2sgdG8gdGhlIEpVTVAgY2hhaW4uCisJKi8KKwlucC0+anVtcF90Y2JbdGhdLmxfcGFkZHIgPSBjcHVfdG9fc2NyKHZ0b2J1cyAoJnRwLT5qdW1wX3RjYikpOworCisJLyoKKwkqKglUaGVzZSBhc3NlcnQncyBzaG91bGQgYmUgbW92ZWQgYXQgZHJpdmVyIGluaXRpYWxpc2F0aW9ucy4KKwkqLworI2lmZGVmIFNDU0lfTkNSX0JJR19FTkRJQU4KKwlCVUdfT04oKChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZywgbmNfc3hmZXIpIF4KKwkJIG9mZnNldG9mKHN0cnVjdCB0Y2IgICAgLCBzdmFsICAgICkpICYzKSAhPSAzKTsKKwlCVUdfT04oKChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZywgbmNfc2NudGwzKSBeCisJCSBvZmZzZXRvZihzdHJ1Y3QgdGNiICAgICwgd3ZhbCAgICApKSAmMykgIT0gMyk7CisjZWxzZQorCUJVR19PTigoKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLCBuY19zeGZlcikgXgorCQkgb2Zmc2V0b2Yoc3RydWN0IHRjYiAgICAsIHN2YWwgICAgKSkgJjMpICE9IDApOworCUJVR19PTigoKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLCBuY19zY250bDMpIF4KKwkJIG9mZnNldG9mKHN0cnVjdCB0Y2IgICAgLCB3dmFsICAgICkpICYzKSAhPSAwKTsKKyNlbmRpZgorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKglMdW4gY29udHJvbCBibG9jayBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKglUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYWZ0ZXIgYSBTQ1NJIAorKioJY29tbWFuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGZvciB0aGlzIHRhcmdldC9sdW4uCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBzdHJ1Y3QgbGNiICpuY3JfYWxsb2NfbGNiIChzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHRuLCB1X2NoYXIgbG4pCit7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFt0bl07CisJc3RydWN0IGxjYiAqbHAgPSB0cC0+bHBbbG5dOworCW5jcmNtZCBjb3B5XzQgPSBucC0+ZmVhdHVyZXMgJiBGRV9QRkVOID8gU0NSX0NPUFkoNCkgOiBTQ1JfQ09QWV9GKDQpOworCWludCBsaCA9IGxuICYgMzsKKworCS8qCisJKioJQWxyZWFkeSBkb25lLCByZXR1cm4uCisJKi8KKwlpZiAobHApCisJCXJldHVybiBscDsKKworCS8qCisJKioJQWxsb2NhdGUgdGhlIGxjYi4KKwkqLworCWxwID0gbV9jYWxsb2NfZG1hKHNpemVvZihzdHJ1Y3QgbGNiKSwgIkxDQiIpOworCWlmICghbHApCisJCWdvdG8gZmFpbDsKKwltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKwl0cC0+bHBbbG5dID0gbHA7CisKKwkvKgorCSoqCUluaXRpYWxpemUgdGhlIHRhcmdldCBjb250cm9sIGJsb2NrIGlmIG5vdCB5ZXQuCisJKi8KKwlpZiAoIXRwLT5qdW1wX3RjYi5sX2NtZCkKKwkJbmNyX2luaXRfdGNiKG5wLCB0bik7CisKKwkvKgorCSoqCUluaXRpYWxpemUgdGhlIENDQiBxdWV1ZSBoZWFkZXJzLgorCSovCisJSU5JVF9MSVNUX0hFQUQoJmxwLT5mcmVlX2NjYnEpOworCUlOSVRfTElTVF9IRUFEKCZscC0+YnVzeV9jY2JxKTsKKwlJTklUX0xJU1RfSEVBRCgmbHAtPndhaXRfY2NicSk7CisJSU5JVF9MSVNUX0hFQUQoJmxwLT5za2lwX2NjYnEpOworCisJLyoKKwkqKglTZXQgbWF4IENDQnMgdG8gMSBhbmQgdXNlIHRoZSBkZWZhdWx0IDEgZW50cnkgCisJKioJanVtcCB0YWJsZSBieSBkZWZhdWx0LgorCSovCisJbHAtPm1heG54cwk9IDE7CisJbHAtPmp1bXBfY2NiCT0gJmxwLT5qdW1wX2NjYl8wOworCWxwLT5wX2p1bXBfY2NiCT0gY3B1X3RvX3Njcih2dG9idXMobHAtPmp1bXBfY2NiKSk7CisKKwkvKgorCSoqCUluaXRpbGlhbHl6ZSB0aGUgcmVzZWxlY3Qgc2NyaXB0OgorCSoqCisJKioJSnVtcCB0byBuZXh0IGxjYiBpZiBTRkJSIGRvZXMgbm90IG1hdGNoIHRoaXMgbHVuLgorCSoqCUxvYWQgVEVNUCB3aXRoIHRoZSBDQ0IgZGlyZWN0IGp1bXAgdGFibGUgYnVzIGFkZHJlc3MuCisJKioJR2V0IHRoZSBTSU1QTEUgVEFHIG1lc3NhZ2UgYW5kIHRoZSB0YWcuCisJKioKKwkqKglKVU1QICBJRiAoU0ZCUiAhPSAjbHVuIyksIEAobmV4dCBsY2IpCisJKioJQ09QWSBAKGxwLT5wX2p1bXBfY2NiKSwJICBAKHRlbXApCisJKioJSlVNUCBAc2NyaXB0KHJlc2VsX25vdGFnKQorCSovCisJbHAtPmp1bXBfbGNiLmxfY21kICAgPQorCQljcHVfdG9fc2NyKChTQ1JfSlVNUCBeIElGRkFMU0UgKE1BU0sgKDB4ODArbG4sIDB4ZmYpKSkpOworCWxwLT5qdW1wX2xjYi5sX3BhZGRyID0gdHAtPmp1bXBfbGNiW2xoXS5sX3BhZGRyOworCisJbHAtPmxvYWRfanVtcF9jY2JbMF0gPSBjcHVfdG9fc2NyKGNvcHlfNCk7CisJbHAtPmxvYWRfanVtcF9jY2JbMV0gPSBjcHVfdG9fc2NyKHZ0b2J1cyAoJmxwLT5wX2p1bXBfY2NiKSk7CisJbHAtPmxvYWRfanVtcF9jY2JbMl0gPSBjcHVfdG9fc2NyKG5jcl9yZWdfYnVzX2FkZHIobmNfdGVtcCkpOworCisJbHAtPmp1bXBfdGFnLmxfY21kICAgPSBjcHVfdG9fc2NyKFNDUl9KVU1QKTsKKwlscC0+anVtcF90YWcubF9wYWRkciA9IGNwdV90b19zY3IoTkNCX1NDUklQVF9QSFlTIChucCwgcmVzZWxfbm90YWcpKTsKKworCS8qCisJKioJTGluayB0aGlzIGx1biBjb250cm9sIGJsb2NrIHRvIHRoZSBKVU1QIGNoYWluLgorCSovCisJdHAtPmp1bXBfbGNiW2xoXS5sX3BhZGRyID0gY3B1X3RvX3Njcih2dG9idXMgKCZscC0+anVtcF9sY2IpKTsKKworCS8qCisJKioJSW5pdGlhbGl6ZSBjb21tYW5kIHF1ZXVpbmcgY29udHJvbC4KKwkqLworCWxwLT5idXN5Y2Nicwk9IDE7CisJbHAtPnF1ZXVlZGNjYnMJPSAxOworCWxwLT5xdWV1ZWRlcHRoCT0gMTsKK2ZhaWw6CisJcmV0dXJuIGxwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKglMdW4gY29udHJvbCBibG9jayBzZXR1cCBvbiBJTlFVSVJZIGRhdGEgcmVjZWl2ZWQuCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioJV2Ugb25seSBzdXBwb3J0IFdJREUsIFNZTkMgZm9yIHRhcmdldHMgYW5kIENNRFEgZm9yIGxvZ2ljYWwgdW5pdHMuCisqKglUaGlzIHNldHVwIGlzIGRvbmUgb24gZWFjaCBJTlFVSVJZIHNpbmNlIHdlIGFyZSBleHBlY3RpbmcgdXNlciAKKyoqCXdpbGwgcGxheSB3aXRoIENIQU5HRSBERUZJTklUSU9OIGNvbW1hbmRzLiA6LSkKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHN0cnVjdCBsY2IgKm5jcl9zZXR1cF9sY2IgKHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJdW5zaWduZWQgY2hhciB0biA9IHNkZXYtPmlkLCBsbiA9IHNkZXYtPmx1bjsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RuXTsKKwlzdHJ1Y3QgbGNiICpscCA9IHRwLT5scFtsbl07CisKKwkvKiBJZiBubyBsY2IsIHRyeSB0byBhbGxvY2F0ZSBpdC4gICovCisJaWYgKCFscCAmJiAhKGxwID0gbmNyX2FsbG9jX2xjYihucCwgdG4sIGxuKSkpCisJCWdvdG8gZmFpbDsKKworCS8qCisJKioJSWYgdW5pdCBzdXBwb3J0cyB0YWdnZWQgY29tbWFuZHMsIGFsbG9jYXRlIHRoZSAKKwkqKglDQ0IgSlVNUCB0YWJsZSBpZiBub3QgeWV0LgorCSovCisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgJiYgbHAtPmp1bXBfY2NiID09ICZscC0+anVtcF9jY2JfMCkgeworCQlpbnQgaTsKKwkJbHAtPmp1bXBfY2NiID0gbV9jYWxsb2NfZG1hKDI1NiwgIkpVTVBfQ0NCIik7CisJCWlmICghbHAtPmp1bXBfY2NiKSB7CisJCQlscC0+anVtcF9jY2IgPSAmbHAtPmp1bXBfY2NiXzA7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbHAtPnBfanVtcF9jY2IgPSBjcHVfdG9fc2NyKHZ0b2J1cyhscC0+anVtcF9jY2IpKTsKKwkJZm9yIChpID0gMCA7IGkgPCA2NCA7IGkrKykKKwkJCWxwLT5qdW1wX2NjYltpXSA9CisJCQkJY3B1X3RvX3NjcihOQ0JfU0NSSVBUSF9QSFlTIChucCwgYmFkX2lfdF9sX3EpKTsKKwkJZm9yIChpID0gMCA7IGkgPCBNQVhfVEFHUyA7IGkrKykKKwkJCWxwLT5jYl90YWdzW2ldID0gaTsKKwkJbHAtPm1heG54cyA9IE1BWF9UQUdTOworCQlscC0+dGFnc19zdGltZSA9IGt0aW1lX2dldCgzKkhaKTsKKwkJbmNyX3NldHVwX3RhZ3MgKG5wLCBzZGV2KTsKKwl9CisKKworZmFpbDoKKwlyZXR1cm4gbHA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCisqKglCdWlsZCBTY2F0dGVyIEdhdGhlciBCbG9jaworKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglUaGUgdHJhbnNmZXIgYXJlYSBtYXkgYmUgc2NhdHRlcmVkIGFtb25nCisqKglzZXZlcmFsIG5vbiBhZGphY2VudCBwaHlzaWNhbCBwYWdlcy4KKyoqCisqKglXZSBtYXkgdXNlIE1BWF9TQ0FUVEVSIGJsb2Nrcy4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisqKglXZSB0cnkgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBjYXVzZWQKKyoqCWJ5IHVuZXhwZWN0ZWQgcGhhc2UgY2hhbmdlcyBkdWUgdG8gZGlzY29ubmVjdHMuCisqKglBIHR5cGljYWwgaGFyZGRpc2sgbWF5IGRpc2Nvbm5lY3QgYmVmb3JlIEFOWSBibG9jay4KKyoqCUlmIHdlIHdhbnRlZCB0byBhdm9pZCB1bmV4cGVjdGVkIHBoYXNlIGNoYW5nZXMgYXQgYWxsCisqKgl3ZSBoYWQgdG8gdXNlIGEgYnJlYWsgcG9pbnQgZXZlcnkgNTEyIGJ5dGVzLgorKioJT2YgY291cnNlIHRoZSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgYmxvY2tzIGlzCisqKglsaW1pdGVkLgorKioJVW5kZXIgTGludXgsIHRoZSBzY2F0dGVyL2dhdHRlciBibG9ja3MgYXJlIHByb3ZpZGVkIGJ5IAorKioJdGhlIGdlbmVyaWMgZHJpdmVyLiBXZSBqdXN0IGhhdmUgdG8gY29weSBhZGRyZXNzZXMgYW5kIAorKioJc2l6ZXMgdG8gdGhlIGRhdGEgc2VnbWVudCBhcnJheS4KKyovCisKK3N0YXRpYyBpbnQgbmNyX3NjYXR0ZXJfbm9fc2dsaXN0KHN0cnVjdCBuY2IgKm5wLCBzdHJ1Y3QgY2NiICpjcCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBzY3JfdGJsbW92ZSAqZGF0YSA9ICZjcC0+cGh5cy5kYXRhW01BWF9TQ0FUVEVSIC0gMV07CisJaW50IHNlZ21lbnQ7CisKKwljcC0+ZGF0YV9sZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKworCWlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlkbWFfYWRkcl90IGJhZGRyID0gbWFwX3Njc2lfc2luZ2xlX2RhdGEobnAsIGNtZCk7CisJCWlmIChiYWRkcikgeworCQkJbmNyX2J1aWxkX3NnZShucCwgZGF0YSwgYmFkZHIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCXNlZ21lbnQgPSAxOworCQl9IGVsc2UgeworCQkJc2VnbWVudCA9IC0yOworCQl9CisJfSBlbHNlIHsKKwkJc2VnbWVudCA9IDA7CisJfQorCisJcmV0dXJuIHNlZ21lbnQ7Cit9CisKK3N0YXRpYyBpbnQgbmNyX3NjYXR0ZXIoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBjY2IgKmNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IHNlZ21lbnQJPSAwOworCWludCB1c2Vfc2cJPSAoaW50KSBjbWQtPnVzZV9zZzsKKworCWNwLT5kYXRhX2xlbgk9IDA7CisKKwlpZiAoIXVzZV9zZykKKwkJc2VnbWVudCA9IG5jcl9zY2F0dGVyX25vX3NnbGlzdChucCwgY3AsIGNtZCk7CisJZWxzZSBpZiAoKHVzZV9zZyA9IG1hcF9zY3NpX3NnX2RhdGEobnAsIGNtZCkpID4gMCkgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjYXR0ZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5idWZmZXI7CisJCXN0cnVjdCBzY3JfdGJsbW92ZSAqZGF0YTsKKworCQlpZiAodXNlX3NnID4gTUFYX1NDQVRURVIpIHsKKwkJCXVubWFwX3Njc2lfZGF0YShucCwgY21kKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWRhdGEgPSAmY3AtPnBoeXMuZGF0YVtNQVhfU0NBVFRFUiAtIHVzZV9zZ107CisKKwkJZm9yIChzZWdtZW50ID0gMDsgc2VnbWVudCA8IHVzZV9zZzsgc2VnbWVudCsrKSB7CisJCQlkbWFfYWRkcl90IGJhZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNjYXR0ZXJbc2VnbWVudF0pOworCQkJdW5zaWduZWQgaW50IGxlbiA9IHNnX2RtYV9sZW4oJnNjYXR0ZXJbc2VnbWVudF0pOworCisJCQluY3JfYnVpbGRfc2dlKG5wLCAmZGF0YVtzZWdtZW50XSwgYmFkZHIsIGxlbik7CisJCQljcC0+ZGF0YV9sZW4gKz0gbGVuOworCQl9CisJfSBlbHNlIHsKKwkJc2VnbWVudCA9IC0yOworCX0KKworCXJldHVybiBzZWdtZW50OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKgorKioJVGVzdCB0aGUgYnVzIHNub29wIGxvZ2ljIDotKAorKioKKyoqCUhhcyB0byBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKioKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IG5jcl9yZWd0ZXN0IChzdHJ1Y3QgbmNiKiBucCkKK3sKKwlyZWdpc3RlciB2b2xhdGlsZSB1MzIgZGF0YTsKKwkvKgorCSoqCW5jciByZWdpc3RlcnMgbWF5IE5PVCBiZSBjYWNoZWQuCisJKioJd3JpdGUgMHhmZmZmZmZmZiB0byBhIHJlYWQgb25seSByZWdpc3RlciBhcmVhLAorCSoqCWFuZCB0cnkgdG8gcmVhZCBpdCBiYWNrLgorCSovCisJZGF0YSA9IDB4ZmZmZmZmZmY7CisJT1VUTF9PRkYob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcsIG5jX2RzdGF0KSwgZGF0YSk7CisJZGF0YSA9IElOTF9PRkYob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcsIG5jX2RzdGF0KSk7CisjaWYgMQorCWlmIChkYXRhID09IDB4ZmZmZmZmZmYpIHsKKyNlbHNlCisJaWYgKChkYXRhICYgMHhlMmYwZmZmZCkgIT0gMHgwMjAwMDA4MCkgeworI2VuZGlmCisJCXByaW50ayAoIkNBQ0hFIFRFU1QgRkFJTEVEOiByZWcgZHN0YXQtc3N0YXQyIHJlYWRiYWNrICV4LlxuIiwKKwkJCSh1bnNpZ25lZCkgZGF0YSk7CisJCXJldHVybiAoMHgxMCk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5jcl9zbm9vcHRlc3QgKHN0cnVjdCBuY2IqIG5wKQoreworCXUzMgluY3JfcmQsIG5jcl93ciwgbmNyX2JrLCBob3N0X3JkLCBob3N0X3dyLCBwYzsKKwlpbnQJaSwgZXJyPTA7CisJaWYgKG5wLT5yZWcpIHsKKwkJZXJyIHw9IG5jcl9yZWd0ZXN0IChucCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gKGVycik7CisJfQorCisJLyogaW5pdCAqLworCXBjICA9IE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzbm9vcHRlc3QpOworCWhvc3Rfd3IgPSAxOworCW5jcl93ciAgPSAyOworCS8qCisJKioJU2V0IG1lbW9yeSBhbmQgcmVnaXN0ZXIuCisJKi8KKwlucC0+bmNyX2NhY2hlID0gY3B1X3RvX3Njcihob3N0X3dyKTsKKwlPVVRMIChuY190ZW1wLCBuY3Jfd3IpOworCS8qCisJKioJU3RhcnQgc2NyaXB0IChleGNoYW5nZSB2YWx1ZXMpCisJKi8KKwlPVVRMX0RTUCAocGMpOworCS8qCisJKioJV2FpdCAndGlsIGRvbmUgKHdpdGggdGltZW91dCkKKwkqLworCWZvciAoaT0wOyBpPE5DUl9TTk9PUF9USU1FT1VUOyBpKyspCisJCWlmIChJTkIobmNfaXN0YXQpICYgKElOVEZ8U0lQfERJUCkpCisJCQlicmVhazsKKwkvKgorCSoqCVNhdmUgdGVybWluYXRpb24gcG9zaXRpb24uCisJKi8KKwlwYyA9IElOTCAobmNfZHNwKTsKKwkvKgorCSoqCVJlYWQgbWVtb3J5IGFuZCByZWdpc3Rlci4KKwkqLworCWhvc3RfcmQgPSBzY3JfdG9fY3B1KG5wLT5uY3JfY2FjaGUpOworCW5jcl9yZCAgPSBJTkwgKG5jX3NjcmF0Y2hhKTsKKwluY3JfYmsgID0gSU5MIChuY190ZW1wKTsKKwkvKgorCSoqCVJlc2V0IG5jciBjaGlwCisJKi8KKwluY3JfY2hpcF9yZXNldChucCwgMTAwKTsKKwkvKgorCSoqCWNoZWNrIGZvciB0aW1lb3V0CisJKi8KKwlpZiAoaT49TkNSX1NOT09QX1RJTUVPVVQpIHsKKwkJcHJpbnRrICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IHRpbWVvdXQuXG4iKTsKKwkJcmV0dXJuICgweDIwKTsKKwl9CisJLyoKKwkqKglDaGVjayB0ZXJtaW5hdGlvbiBwb3NpdGlvbi4KKwkqLworCWlmIChwYyAhPSBOQ0JfU0NSSVBUSF9QSFlTIChucCwgc25vb3BlbmQpKzgpIHsKKwkJcHJpbnRrICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IHNjcmlwdCBleGVjdXRpb24gZmFpbGVkLlxuIik7CisJCXByaW50ayAoInN0YXJ0PSUwOGx4LCBwYz0lMDhseCwgZW5kPSUwOGx4XG4iLCAKKwkJCSh1X2xvbmcpIE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzbm9vcHRlc3QpLCAodV9sb25nKSBwYywKKwkJCSh1X2xvbmcpIE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBzbm9vcGVuZCkgKzgpOworCQlyZXR1cm4gKDB4NDApOworCX0KKwkvKgorCSoqCVNob3cgcmVzdWx0cy4KKwkqLworCWlmIChob3N0X3dyICE9IG5jcl9yZCkgeworCQlwcmludGsgKCJDQUNIRSBURVNUIEZBSUxFRDogaG9zdCB3cm90ZSAlZCwgbmNyIHJlYWQgJWQuXG4iLAorCQkJKGludCkgaG9zdF93ciwgKGludCkgbmNyX3JkKTsKKwkJZXJyIHw9IDE7CisJfQorCWlmIChob3N0X3JkICE9IG5jcl93cikgeworCQlwcmludGsgKCJDQUNIRSBURVNUIEZBSUxFRDogbmNyIHdyb3RlICVkLCBob3N0IHJlYWQgJWQuXG4iLAorCQkJKGludCkgbmNyX3dyLCAoaW50KSBob3N0X3JkKTsKKwkJZXJyIHw9IDI7CisJfQorCWlmIChuY3JfYmsgIT0gbmNyX3dyKSB7CisJCXByaW50ayAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBuY3Igd3JvdGUgJWQsIHJlYWQgYmFjayAlZC5cbiIsCisJCQkoaW50KSBuY3Jfd3IsIChpbnQpIG5jcl9iayk7CisJCWVyciB8PSA0OworCX0KKwlyZXR1cm4gKGVycik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCURldGVybWluZSB0aGUgbmNyJ3MgY2xvY2sgZnJlcXVlbmN5LgorKioJVGhpcyBpcyBlc3NlbnRpYWwgZm9yIHRoZSBuZWdvdGlhdGlvbgorKioJb2YgdGhlIHN5bmNocm9ub3VzIHRyYW5zZmVyIHJhdGUuCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJTm90ZTogd2UgaGF2ZSB0byByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuCisqKglUSEVSRSBJUyBOTyBTQVZFIERFRkFVTFQgVkFMVUUuCisqKgorKioJTW9zdCBOQ1IvU1lNQklPUyBib2FyZHMgYXJlIGRlbGl2ZXJlZCB3aXRoIGEgNDAgTWh6IGNsb2NrLgorKioJNTNDODYwIGFuZCA1M0M4NzUgcmV2LiAxIHN1cHBvcnQgZmFzdDIwIHRyYW5zZmVycyBidXQgCisqKglkbyBub3QgaGF2ZSBhIGNsb2NrIGRvdWJsZXIgYW5kIHNvIGFyZSBwcm92aWRlZCB3aXRoIGEgCisqKgk4MCBNSHogY2xvY2suIEFsbCBvdGhlciBmYXN0MjAgYm9hcmRzIGluY29ycG9yYXRlIGEgZG91YmxlciAKKyoqCWFuZCBzbyBzaG91bGQgYmUgZGVsaXZlcmVkIHdpdGggYSA0MCBNSHogY2xvY2suCisqKglUaGUgZnV0dXJlIGZhc3Q0MCBjaGlwcyAoODk1Lzg5NSkgdXNlIGEgNDAgTWh6IGJhc2UgY2xvY2sgCisqKglhbmQgcHJvdmlkZSBhIGNsb2NrIHF1YWRydXBsZXIgKDE2MCBNaHopLiBUaGUgY29kZSBiZWxvdyAKKyoqCXRyaWVzIHRvIGRlYWwgYXMgY2xldmVybHkgYXMgcG9zc2libGUgd2l0aCBhbGwgdGhpcyBzdHVmZi4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKglTZWxlY3QgTkNSIFNDU0kgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB2b2lkIG5jcl9zZWxlY3RjbG9jayhzdHJ1Y3QgbmNiICpucCwgdV9jaGFyIHNjbnRsMykKK3sKKwlpZiAobnAtPm11bHRpcGxpZXIgPCAyKSB7CisJCU9VVEIobmNfc2NudGwzLAlzY250bDMpOworCQlyZXR1cm47CisJfQorCisJaWYgKGJvb3R2ZXJib3NlID49IDIpCisJCXByaW50ayAoIiVzOiBlbmFibGluZyBjbG9jayBtdWx0aXBsaWVyXG4iLCBuY3JfbmFtZShucCkpOworCisJT1VUQihuY19zdGVzdDEsIERCTEVOKTsJICAgLyogRW5hYmxlIGNsb2NrIG11bHRpcGxpZXIJCSAgKi8KKwlpZiAobnAtPm11bHRpcGxpZXIgPiAyKSB7ICAvKiBQb2xsIGJpdCA1IG9mIHN0ZXN0NCBmb3IgcXVhZHJ1cGxlciAqLworCQlpbnQgaSA9IDIwOworCQl3aGlsZSAoIShJTkIobmNfc3Rlc3Q0KSAmIExDS0ZSUSkgJiYgLS1pID4gMCkKKwkJCXVkZWxheSgyMCk7CisJCWlmICghaSkKKwkJCXByaW50aygiJXM6IHRoZSBjaGlwIGNhbm5vdCBsb2NrIHRoZSBmcmVxdWVuY3lcbiIsIG5jcl9uYW1lKG5wKSk7CisJfSBlbHNlCQkJLyogV2FpdCAyMCBtaWNyby1zZWNvbmRzIGZvciBkb3VibGVyCSovCisJCXVkZWxheSgyMCk7CisJT1VUQihuY19zdGVzdDMsIEhTQyk7CQkvKiBIYWx0IHRoZSBzY3NpIGNsb2NrCQkqLworCU9VVEIobmNfc2NudGwzLAlzY250bDMpOworCU9VVEIobmNfc3Rlc3QxLCAoREJMRU58REJMU0VMKSk7LyogU2VsZWN0IGNsb2NrIG11bHRpcGxpZXIJKi8KKwlPVVRCKG5jX3N0ZXN0MywgMHgwMCk7CQkvKiBSZXN0YXJ0IHNjc2kgY2xvY2sgCQkqLworfQorCisKKy8qCisgKgljYWxjdWxhdGUgTkNSIFNDU0kgY2xvY2sgZnJlcXVlbmN5IChpbiBLSHopCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfX2luaXQgbmNyZ2V0ZnJlcSAoc3RydWN0IG5jYiAqbnAsIGludCBnZW4pCit7CisJdW5zaWduZWQgbXMgPSAwOworCWNoYXIgY291bnQgPSAwOworCisJLyoKKwkgKiBNZWFzdXJlIEdFTiB0aW1lciBkZWxheSBpbiBvcmRlciAKKwkgKiB0byBjYWxjdWxhdGUgU0NTSSBjbG9jayBmcmVxdWVuY3kKKwkgKgorCSAqIFRoaXMgY29kZSB3aWxsIG5ldmVyIGV4ZWN1dGUgdG9vCisJICogbWFueSBsb29wIGl0ZXJhdGlvbnMgKGlmIERFTEFZIGlzIAorCSAqIHJlYXNvbmFibHkgY29ycmVjdCkuIEl0IGNvdWxkIGdldAorCSAqIHRvbyBsb3cgYSBkZWxheSAodG9vIGhpZ2ggYSBmcmVxLikKKwkgKiBpZiB0aGUgQ1BVIGlzIHNsb3cgZXhlY3V0aW5nIHRoZSAKKwkgKiBsb29wIGZvciBzb21lIHJlYXNvbiAoYW4gTk1JLCBmb3IKKwkgKiBleGFtcGxlKS4gRm9yIHRoaXMgcmVhc29uIHdlIHdpbGwKKwkgKiBpZiBtdWx0aXBsZSBtZWFzdXJlbWVudHMgYXJlIHRvIGJlIAorCSAqIHBlcmZvcm1lZCB0cnVzdCB0aGUgaGlnaGVyIGRlbGF5IAorCSAqIChsb3dlciBmcmVxdWVuY3kgcmV0dXJuZWQpLgorCSAqLworCU9VVEIgKG5jX3N0ZXN0MSwgMCk7CS8qIG1ha2Ugc3VyZSBjbG9jayBkb3VibGVyIGlzIE9GRiAqLworCU9VVFcgKG5jX3NpZW4gLCAwKTsJLyogbWFzayBhbGwgc2NzaSBpbnRlcnJ1cHRzICovCisJKHZvaWQpIElOVyAobmNfc2lzdCk7CS8qIGNsZWFyIHBlbmRpbmcgc2NzaSBpbnRlcnJ1cHQgKi8KKwlPVVRCIChuY19kaWVuICwgMCk7CS8qIG1hc2sgYWxsIGRtYSBpbnRlcnJ1cHRzICovCisJKHZvaWQpIElOVyAobmNfc2lzdCk7CS8qIGFub3RoZXIgb25lLCBqdXN0IHRvIGJlIHN1cmUgOikgKi8KKwlPVVRCIChuY19zY250bDMsIDQpOwkvKiBzZXQgcHJlLXNjYWxlciB0byBkaXZpZGUgYnkgMyAqLworCU9VVEIgKG5jX3N0aW1lMSwgMCk7CS8qIGRpc2FibGUgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisJT1VUQiAobmNfc3RpbWUxLCBnZW4pOwkvKiBzZXQgdG8gbm9taW5hbCBkZWxheSBvZiAxPDxnZW4gKiAxMjV1cyAqLworCXdoaWxlICghKElOVyhuY19zaXN0KSAmIEdFTikgJiYgbXMrKyA8IDEwMDAwMCkgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDsgY291bnQgKyspCisJCQl1ZGVsYXkoMTAwKTsJLyogY291bnQgbXMgKi8KKwl9CisJT1VUQiAobmNfc3RpbWUxLCAwKTsJLyogZGlzYWJsZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKyAJLyoKKyAJICogc2V0IHByZXNjYWxlciB0byBkaXZpZGUgYnkgd2hhdGV2ZXIgMCBtZWFucworIAkgKiAwIG91Z2h0IHRvIGNob29zZSBkaXZpZGUgYnkgMiwgYnV0IGFwcGVhcnMKKyAJICogdG8gc2V0IGRpdmlkZSBieSAzLjUgbW9kZSBpbiBteSA1M2M4MTAgLi4uCisgCSAqLworIAlPVVRCIChuY19zY250bDMsIDApOworCisJaWYgKGJvb3R2ZXJib3NlID49IDIpCisJCXByaW50ayAoIiVzOiBEZWxheSAoR0VOPSVkKTogJXUgbXNlY1xuIiwgbmNyX25hbWUobnApLCBnZW4sIG1zKTsKKyAgCS8qCisgCSAqIGFkanVzdCBmb3IgcHJlc2NhbGVyLCBhbmQgY29udmVydCBpbnRvIEtIeiAKKyAgCSAqLworCXJldHVybiBtcyA/ICgoMSA8PCBnZW4pICogNDM0MCkgLyBtcyA6IDA7Cit9CisKKy8qCisgKglHZXQvcHJvYmUgTkNSIFNDU0kgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBuY3JfZ2V0Y2xvY2sgKHN0cnVjdCBuY2IgKm5wLCBpbnQgbXVsdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNjbnRsMyA9IElOQihuY19zY250bDMpOworCXVuc2lnbmVkIGNoYXIgc3Rlc3QxID0gSU5CKG5jX3N0ZXN0MSk7CisJdW5zaWduZWQgZjE7CisKKwlucC0+bXVsdGlwbGllciA9IDE7CisJZjEgPSA0MDAwMDsKKworCS8qCisJKioJVHJ1ZSB3aXRoIDg3NSBvciA4OTUgd2l0aCBjbG9jayBtdWx0aXBsaWVyIHNlbGVjdGVkCisJKi8KKwlpZiAobXVsdCA+IDEgJiYgKHN0ZXN0MSAmIChEQkxFTitEQkxTRUwpKSA9PSBEQkxFTitEQkxTRUwpIHsKKwkJaWYgKGJvb3R2ZXJib3NlID49IDIpCisJCQlwcmludGsgKCIlczogY2xvY2sgbXVsdGlwbGllciBmb3VuZFxuIiwgbmNyX25hbWUobnApKTsKKwkJbnAtPm11bHRpcGxpZXIgPSBtdWx0OworCX0KKworCS8qCisJKioJSWYgbXVsdGlwbGllciBub3QgZm91bmQgb3Igc2NudGwzIG5vdCA3LDUsMywKKwkqKglyZXNldCBjaGlwIGFuZCBnZXQgZnJlcXVlbmN5IGZyb20gZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorCSoqCU90aGVyd2lzZSB0cnVzdCBzY250bDMgQklPUyBzZXR0aW5nLgorCSovCisJaWYgKG5wLT5tdWx0aXBsaWVyICE9IG11bHQgfHwgKHNjbnRsMyAmIDcpIDwgMyB8fCAhKHNjbnRsMyAmIDEpKSB7CisJCXVuc2lnbmVkIGYyOworCisJCW5jcl9jaGlwX3Jlc2V0KG5wLCA1KTsKKworCQkodm9pZCkgbmNyZ2V0ZnJlcSAobnAsIDExKTsJLyogdGhyb3cgYXdheSBmaXJzdCByZXN1bHQgKi8KKwkJZjEgPSBuY3JnZXRmcmVxIChucCwgMTEpOworCQlmMiA9IG5jcmdldGZyZXEgKG5wLCAxMSk7CisKKwkJaWYoYm9vdHZlcmJvc2UpCisJCQlwcmludGsgKCIlczogTkNSIGNsb2NrIGlzICV1S0h6LCAldUtIelxuIiwgbmNyX25hbWUobnApLCBmMSwgZjIpOworCisJCWlmIChmMSA+IGYyKSBmMSA9IGYyOwkJLyogdHJ1c3QgbG93ZXIgcmVzdWx0CSovCisKKwkJaWYJKGYxIDwJNDUwMDApCQlmMSA9ICA0MDAwMDsKKwkJZWxzZSBpZiAoZjEgPAk1NTAwMCkJCWYxID0gIDUwMDAwOworCQllbHNlCQkJCWYxID0gIDgwMDAwOworCisJCWlmIChmMSA8IDgwMDAwICYmIG11bHQgPiAxKSB7CisJCQlpZiAoYm9vdHZlcmJvc2UgPj0gMikKKwkJCQlwcmludGsgKCIlczogY2xvY2sgbXVsdGlwbGllciBhc3N1bWVkXG4iLCBuY3JfbmFtZShucCkpOworCQkJbnAtPm11bHRpcGxpZXIJPSBtdWx0OworCQl9CisJfSBlbHNlIHsKKwkJaWYJKChzY250bDMgJiA3KSA9PSAzKQlmMSA9ICA0MDAwMDsKKwkJZWxzZSBpZgkoKHNjbnRsMyAmIDcpID09IDUpCWYxID0gIDgwMDAwOworCQllbHNlIAkJCQlmMSA9IDE2MDAwMDsKKworCQlmMSAvPSBucC0+bXVsdGlwbGllcjsKKwl9CisKKwkvKgorCSoqCUNvbXB1dGUgY29udHJvbGxlciBzeW5jaHJvbm91cyBwYXJhbWV0ZXJzLgorCSovCisJZjEJCSo9IG5wLT5tdWx0aXBsaWVyOworCW5wLT5jbG9ja19raHoJPSBmMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT0gTElOVVggRU5UUlkgUE9JTlRTIFNFQ1RJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IG5jcjUzYzh4eF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2aWNlLT5ob3N0OworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopIGhvc3QtPmhvc3RkYXRhKS0+bmNiOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbZGV2aWNlLT5pZF07CisJdHAtPnN0YXJnZXQgPSBkZXZpY2UtPnNkZXZfdGFyZ2V0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmNyNTNjOHh4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2aWNlLT5ob3N0OworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopIGhvc3QtPmhvc3RkYXRhKS0+bmNiOworCXN0cnVjdCB0Y2IgKnRwID0gJm5wLT50YXJnZXRbZGV2aWNlLT5pZF07CisJc3RydWN0IGxjYiAqbHAgPSB0cC0+bHBbZGV2aWNlLT5sdW5dOworCWludCBudW10YWdzLCBkZXB0aF90b191c2U7CisKKwluY3Jfc2V0dXBfbGNiKG5wLCBkZXZpY2UpOworCisJLyoKKwkqKglTZWxlY3QgcXVldWUgZGVwdGggZnJvbSBkcml2ZXIgc2V0dXAuCisJKioJRG9ubm90IHVzZSBtb3JlIHRoYW4gY29uZmlndXJlZCBieSB1c2VyLgorCSoqCVVzZSBhdCBsZWFzdCAyLgorCSoqCURvbm5vdCB1c2UgbW9yZSB0aGFuIG91ciBtYXhpbXVtLgorCSovCisJbnVtdGFncyA9IGRldmljZV9xdWV1ZV9kZXB0aChucC0+dW5pdCwgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4pOworCWlmIChudW10YWdzID4gdHAtPnVzcnRhZ3MpCisJCW51bXRhZ3MgPSB0cC0+dXNydGFnczsKKwlpZiAoIWRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkKKwkJbnVtdGFncyA9IDE7CisJZGVwdGhfdG9fdXNlID0gbnVtdGFnczsKKwlpZiAoZGVwdGhfdG9fdXNlIDwgMikKKwkJZGVwdGhfdG9fdXNlID0gMjsKKwlpZiAoZGVwdGhfdG9fdXNlID4gTUFYX1RBR1MpCisJCWRlcHRoX3RvX3VzZSA9IE1BWF9UQUdTOworCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLAorCQkJCShkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQgPworCQkJCSBNU0dfU0lNUExFX1RBRyA6IDApLAorCQkJCWRlcHRoX3RvX3VzZSk7CisKKwkvKgorCSoqCVNpbmNlIHRoZSBxdWV1ZSBkZXB0aCBpcyBub3QgdHVuYWJsZSB1bmRlciBMaW51eCwKKwkqKgl3ZSBuZWVkIHRvIGtub3cgdGhpcyB2YWx1ZSBpbiBvcmRlciBub3QgdG8gCisJKioJYW5ub3VuY2Ugc3R1cGlkIHRoaW5ncyB0byB1c2VyLgorCSoqCisJKioJWFhYKGhjaCk6IEFzIG9mIExpbnV4IDIuNiBpdCBjZXJ0YWlubHkgX2lzXyB0dW5hYmxlLi4KKwkqKgkJICBJbiBmYWN0IHdlIGp1c3QgdHVuZWQgaXQsIG9yIGRpZCBJIG1pc3MKKwkqKgkJICBzb21ldGhpbmcgaW1wb3J0YW50PyA6KQorCSovCisJaWYgKGxwKSB7CisJCWxwLT5udW10YWdzID0gbHAtPm1heHRhZ3MgPSBudW10YWdzOworCQlscC0+c2NkZXZfZGVwdGggPSBkZXB0aF90b191c2U7CisJfQorCW5jcl9zZXR1cF90YWdzIChucCwgZGV2aWNlKTsKKworI2lmZGVmIERFQlVHX05DUjUzQzhYWAorCXByaW50aygibmNyNTNjOHh4X3NlbGVjdF9xdWV1ZV9kZXB0aDogaG9zdD0lZCwgaWQ9JWQsIGx1bj0lZCwgZGVwdGg9JWRcbiIsCisJICAgICAgIG5wLT51bml0LCBkZXZpY2UtPmlkLCBkZXZpY2UtPmx1biwgZGVwdGhfdG9fdXNlKTsKKyNlbmRpZgorCisJaWYgKHNwaV9zdXBwb3J0X3N5bmMoZGV2aWNlLT5zZGV2X3RhcmdldCkgJiYKKwkgICAgIXNwaV9pbml0aWFsX2R2KGRldmljZS0+c2Rldl90YXJnZXQpKQorCQlzcGlfZHZfZGV2aWNlKGRldmljZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmNyNTNjOHh4X3F1ZXVlX2NvbW1hbmQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKiBkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworICAgICBzdHJ1Y3QgbmNiICpucCA9ICgoc3RydWN0IGhvc3RfZGF0YSAqKSBjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpLT5uY2I7CisgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgIGludCBzdHM7CisKKyNpZmRlZiBERUJVR19OQ1I1M0M4WFgKK3ByaW50aygibmNyNTNjOHh4X3F1ZXVlX2NvbW1hbmRcbiIpOworI2VuZGlmCisKKyAgICAgY21kLT5zY3NpX2RvbmUgICAgID0gZG9uZTsKKyAgICAgY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKyAgICAgY21kLT5fX2RhdGFfbWFwcGVkID0gMDsKKyAgICAgY21kLT5fX2RhdGFfbWFwcGluZyA9IDA7CisKKyAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgIGlmICgoc3RzID0gbmNyX3F1ZXVlX2NvbW1hbmQobnAsIGNtZCkpICE9IERJRF9PSykgeworCSAgY21kLT5yZXN1bHQgPSBTY3NpUmVzdWx0KHN0cywgMCk7CisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCitwcmludGsoIm5jcjUzYzh4eCA6IGNvbW1hbmQgbm90IHF1ZXVlZCAtIHJlc3VsdD0lZFxuIiwgc3RzKTsKKyNlbmRpZgorICAgICB9CisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCisgICAgIGVsc2UKK3ByaW50aygibmNyNTNjOHh4IDogY29tbWFuZCBzdWNjZXNzZnVsbHkgcXVldWVkXG4iKTsKKyNlbmRpZgorCisgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5zbXBfbG9jaywgZmxhZ3MpOworCisgICAgIGlmIChzdHMgIT0gRElEX09LKSB7CisgICAgICAgICAgdW5tYXBfc2NzaV9kYXRhKG5wLCBjbWQpOworICAgICAgICAgIGRvbmUoY21kKTsKKwkgIHN0cyA9IDA7CisgICAgIH0KKworICAgICByZXR1cm4gc3RzOworfQorCitpcnFyZXR1cm5fdCBuY3I1M2M4eHhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSAoc3RydWN0IFNjc2lfSG9zdCAqKWRldl9pZDsKKyAgICAgc3RydWN0IGhvc3RfZGF0YSAqaG9zdF9kYXRhID0gKHN0cnVjdCBob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGE7CisgICAgIHN0cnVjdCBuY2IgKm5wID0gaG9zdF9kYXRhLT5uY2I7CisgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmRvbmVfbGlzdDsKKworI2lmZGVmIERFQlVHX05DUjUzQzhYWAorICAgICBwcmludGsoIm5jcjUzYzh4eCA6IGludGVycnVwdCByZWNlaXZlZFxuIik7CisjZW5kaWYKKworICAgICBpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGsgKCJbIik7CisKKyAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5zbXBfbG9jaywgZmxhZ3MpOworICAgICBuY3JfZXhjZXB0aW9uKG5wKTsKKyAgICAgZG9uZV9saXN0ICAgICA9IG5wLT5kb25lX2xpc3Q7CisgICAgIG5wLT5kb25lX2xpc3QgPSBOVUxMOworICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKworICAgICBpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGsgKCJdXG4iKTsKKworICAgICBpZiAoZG9uZV9saXN0KQorCSAgICAgbmNyX2ZsdXNoX2RvbmVfY21kcyhkb25lX2xpc3QpOworICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG5jcjUzYzh4eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgbnByZWYpCit7CisJc3RydWN0IG5jYiAqbnAgPSAoc3RydWN0IG5jYiAqKSBucHJlZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKmRvbmVfbGlzdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKwluY3JfdGltZW91dChucCk7CisJZG9uZV9saXN0ICAgICA9IG5wLT5kb25lX2xpc3Q7CisJbnAtPmRvbmVfbGlzdCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPnNtcF9sb2NrLCBmbGFncyk7CisKKwlpZiAoZG9uZV9saXN0KQorCQluY3JfZmx1c2hfZG9uZV9jbWRzKGRvbmVfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgbmNyNTNjOHh4X2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IG5jYiAqbnAgPSAoKHN0cnVjdCBob3N0X2RhdGEgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+bmNiOworCWludCBzdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpkb25lX2xpc3Q7CisKKwkvKgorCSAqIElmIHRoZSBtaWQtbGV2ZWwgZHJpdmVyIHRvbGQgdXMgcmVzZXQgaXMgc3luY2hyb25vdXMsIGl0IHNlZW1zIAorCSAqIHRoYXQgd2UgbXVzdCBjYWxsIHRoZSBkb25lKCkgY2FsbGJhY2sgZm9yIHRoZSBpbnZvbHZlZCBjb21tYW5kLCAKKwkgKiBldmVuIGlmIHRoaXMgY29tbWFuZCB3YXMgbm90IHF1ZXVlZCB0byB0aGUgbG93LWxldmVsIGRyaXZlciwgCisJICogYmVmb3JlIHJldHVybmluZyBTVUNDRVNTLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5zbXBfbG9jaywgZmxhZ3MpOworCXN0cyA9IG5jcl9yZXNldF9idXMobnAsIGNtZCwgMSk7CisKKwlkb25lX2xpc3QgICAgID0gbnAtPmRvbmVfbGlzdDsKKwlucC0+ZG9uZV9saXN0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKworCW5jcl9mbHVzaF9kb25lX2NtZHMoZG9uZV9saXN0KTsKKworCXJldHVybiBzdHM7Cit9CisKKyNpZiAwIC8qIHVudXNlZCBhbmQgYnJva2VuICovCitzdGF0aWMgaW50IG5jcjUzYzh4eF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IG5jYiAqbnAgPSAoKHN0cnVjdCBob3N0X2RhdGEgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+bmNiOworCWludCBzdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpkb25lX2xpc3Q7CisKKyNpZiBkZWZpbmVkIFNDU0lfUkVTRVRfU1lOQ0hST05PVVMgJiYgZGVmaW5lZCBTQ1NJX1JFU0VUX0FTWU5DSFJPTk9VUworCXByaW50aygibmNyNTNjOHh4X2Fib3J0OiBwaWQ9JWx1IHNlcmlhbF9udW1iZXI9JWxkIHNlcmlhbF9udW1iZXJfYXRfdGltZW91dD0lbGRcbiIsCisJCWNtZC0+cGlkLCBjbWQtPnNlcmlhbF9udW1iZXIsIGNtZC0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0KTsKKyNlbHNlCisJcHJpbnRrKCJuY3I1M2M4eHhfYWJvcnQ6IGNvbW1hbmQgcGlkICVsdVxuIiwgY21kLT5waWQpOworI2VuZGlmCisKKwlOQ1JfTE9DS19OQ0IobnAsIGZsYWdzKTsKKworI2lmIGRlZmluZWQgU0NTSV9SRVNFVF9TWU5DSFJPTk9VUyAmJiBkZWZpbmVkIFNDU0lfUkVTRVRfQVNZTkNIUk9OT1VTCisJLyoKKwkgKiBXZSBoYXZlIHRvIGp1c3QgaWdub3JlIGFib3J0IHJlcXVlc3RzIGluIHNvbWUgc2l0dWF0aW9ucy4KKwkgKi8KKwlpZiAoY21kLT5zZXJpYWxfbnVtYmVyICE9IGNtZC0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0KSB7CisJCXN0cyA9IFNDU0lfQUJPUlRfTk9UX1JVTk5JTkc7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCisJc3RzID0gbmNyX2Fib3J0X2NvbW1hbmQobnAsIGNtZCk7CitvdXQ6CisJZG9uZV9saXN0ICAgICA9IG5wLT5kb25lX2xpc3Q7CisJbnAtPmRvbmVfbGlzdCA9IE5VTEw7CisJTkNSX1VOTE9DS19OQ0IobnAsIGZsYWdzKTsKKworCW5jcl9mbHVzaF9kb25lX2NtZHMoZG9uZV9saXN0KTsKKworCXJldHVybiBzdHM7Cit9CisjZW5kaWYKKworCisvKgorKioJU2NzaSBjb21tYW5kIHdhaXRpbmcgbGlzdCBtYW5hZ2VtZW50LgorKioKKyoqCUl0IG1heSBoYXBwZW4gdGhhdCB3ZSBjYW5ub3QgaW5zZXJ0IGEgc2NzaSBjb21tYW5kIGludG8gdGhlIHN0YXJ0IHF1ZXVlLAorKioJaW4gdGhlIGZvbGxvd2luZyBjaXJjdW1zdGFuY2VzLgorKiogCQlUb28gZmV3IHByZWFsbG9jYXRlZCBjY2IocyksIAorKioJCW1heHRhZ3MgPCBjbWRfcGVyX2x1biBvZiB0aGUgTGludXggaG9zdCBjb250cm9sIGJsb2NrLAorKioJCWV0Yy4uLgorKioJU3VjaCBzY3NpIGNvbW1hbmRzIGFyZSBpbnNlcnRlZCBpbnRvIGEgd2FpdGluZyBsaXN0LgorKioJV2hlbiBhIHNjc2kgY29tbWFuZCBjb21wbGV0ZSwgd2UgdHJ5IHRvIHJlcXVldWUgdGhlIGNvbW1hbmRzIG9mIHRoZQorKioJd2FpdGluZyBsaXN0LgorKi8KKworI2RlZmluZSBuZXh0X3djbWQgaG9zdF9zY3JpYmJsZQorCitzdGF0aWMgdm9pZCBpbnNlcnRfaW50b193YWl0aW5nX2xpc3Qoc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp3Y21kOworCisjaWZkZWYgREVCVUdfV0FJVElOR19MSVNUCisJcHJpbnRrKCIlczogY21kICVseCBpbnNlcnRlZCBpbnRvIHdhaXRpbmcgbGlzdFxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSBjbWQpOworI2VuZGlmCisJY21kLT5uZXh0X3djbWQgPSBOVUxMOworCWlmICghKHdjbWQgPSBucC0+d2FpdGluZ19saXN0KSkgbnAtPndhaXRpbmdfbGlzdCA9IGNtZDsKKwllbHNlIHsKKwkJd2hpbGUgKCh3Y21kLT5uZXh0X3djbWQpICE9IDApCisJCQl3Y21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgd2NtZC0+bmV4dF93Y21kOworCQl3Y21kLT5uZXh0X3djbWQgPSAoY2hhciAqKSBjbWQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqcmV0cmlldmVfZnJvbV93YWl0aW5nX2xpc3QoaW50IHRvX3JlbW92ZSwgc3RydWN0IG5jYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICoqcGNtZCA9ICZucC0+d2FpdGluZ19saXN0OworCisJd2hpbGUgKCpwY21kKSB7CisJCWlmIChjbWQgPT0gKnBjbWQpIHsKKwkJCWlmICh0b19yZW1vdmUpIHsKKwkJCQkqcGNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+bmV4dF93Y21kOworCQkJCWNtZC0+bmV4dF93Y21kID0gTlVMTDsKKwkJCX0KKyNpZmRlZiBERUJVR19XQUlUSU5HX0xJU1QKKwlwcmludGsoIiVzOiBjbWQgJWx4IHJldHJpZXZlZCBmcm9tIHdhaXRpbmcgbGlzdFxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSBjbWQpOworI2VuZGlmCisJCQlyZXR1cm4gY21kOworCQl9CisJCXBjbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgJigqcGNtZCktPm5leHRfd2NtZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfd2FpdGluZ19saXN0KHN0cnVjdCBuY2IgKm5wLCBpbnQgc3RzKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKndhaXRpbmdfbGlzdCwgKndjbWQ7CisKKwl3YWl0aW5nX2xpc3QgPSBucC0+d2FpdGluZ19saXN0OworCW5wLT53YWl0aW5nX2xpc3QgPSBOVUxMOworCisjaWZkZWYgREVCVUdfV0FJVElOR19MSVNUCisJaWYgKHdhaXRpbmdfbGlzdCkgcHJpbnRrKCIlczogd2FpdGluZ19saXN0PSVseCBwcm9jZXNzaW5nIHN0cz0lZFxuIiwgbmNyX25hbWUobnApLCAodV9sb25nKSB3YWl0aW5nX2xpc3QsIHN0cyk7CisjZW5kaWYKKwl3aGlsZSAoKHdjbWQgPSB3YWl0aW5nX2xpc3QpICE9IDApIHsKKwkJd2FpdGluZ19saXN0ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgd2NtZC0+bmV4dF93Y21kOworCQl3Y21kLT5uZXh0X3djbWQgPSBOVUxMOworCQlpZiAoc3RzID09IERJRF9PSykgeworI2lmZGVmIERFQlVHX1dBSVRJTkdfTElTVAorCXByaW50aygiJXM6IGNtZCAlbHggdHJ5aW5nIHRvIHJlcXVldWVcbiIsIG5jcl9uYW1lKG5wKSwgKHVfbG9uZykgd2NtZCk7CisjZW5kaWYKKwkJCXN0cyA9IG5jcl9xdWV1ZV9jb21tYW5kKG5wLCB3Y21kKTsKKwkJfQorCQlpZiAoc3RzICE9IERJRF9PSykgeworI2lmZGVmIERFQlVHX1dBSVRJTkdfTElTVAorCXByaW50aygiJXM6IGNtZCAlbHggZG9uZSBmb3JjZWQgc3RzPSVkXG4iLCBuY3JfbmFtZShucCksICh1X2xvbmcpIHdjbWQsIHN0cyk7CisjZW5kaWYKKwkJCXdjbWQtPnJlc3VsdCA9IFNjc2lSZXN1bHQoc3RzLCAwKTsKKwkJCW5jcl9xdWV1ZV9kb25lX2NtZChucCwgd2NtZCk7CisJCX0KKwl9Cit9CisKKyN1bmRlZiBuZXh0X3djbWQKKworc3RhdGljIHNzaXplX3Qgc2hvd19uY3I1M2M4eHhfcmV2aXNpb24oc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IGhvc3RfZGF0YSAqaG9zdF9kYXRhID0gKHN0cnVjdCBob3N0X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKyAgCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIweCV4XG4iLCBob3N0X2RhdGEtPm5jYi0+cmV2aXNpb25faWQpOworfQorICAKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBuY3I1M2M4eHhfcmV2aXNpb25fYXR0ciA9IHsKKwkuYXR0cgk9IHsgLm5hbWUgPSAicmV2aXNpb24iLCAubW9kZSA9IFNfSVJVR08sIH0sCisJLnNob3cJPSBzaG93X25jcjUzYzh4eF9yZXZpc2lvbiwKK307CisgIAorc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpuY3I1M2M4eHhfaG9zdF9hdHRyc1tdID0geworCSZuY3I1M2M4eHhfcmV2aXNpb25fYXR0ciwKKwlOVUxMCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglCb290IGNvbW1hbmQgbGluZS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYJTU9EVUxFCitjaGFyICpuY3I1M2M4eHg7CS8qIGNvbW1hbmQgbGluZSBwYXNzZWQgYnkgaW5zbW9kICovCittb2R1bGVfcGFyYW0obmNyNTNjOHh4LCBjaGFycCwgMCk7CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbmNyNTNjOHh4X3NldHVwKGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc3ltNTNjOHh4X19zZXR1cChzdHIpOworfQorCisjaWZuZGVmIE1PRFVMRQorX19zZXR1cCgibmNyNTNjOHh4PSIsIG5jcjUzYzh4eF9zZXR1cCk7CisjZW5kaWYKKworCisvKgorICoJSG9zdCBhdHRhY2ggYW5kIGluaXRpYWxpc2F0aW9ucy4KKyAqCisgKglBbGxvY2F0ZSBob3N0IGRhdGEgYW5kIG5jYiBzdHJ1Y3R1cmUuCisgKglSZXF1ZXN0IElPIHJlZ2lvbiBhbmQgcmVtYXAgTU1JTyByZWdpb24uCisgKglEbyBjaGlwIGluaXRpYWxpemF0aW9uLgorICoJSWYgYWxsIGlzIE9LLCBpbnN0YWxsIGludGVycnVwdCBoYW5kbGluZyBhbmQKKyAqCXN0YXJ0IHRoZSB0aW1lciBkYWVtb24uCisgKi8KK3N0cnVjdCBTY3NpX0hvc3QgKiBfX2luaXQgbmNyX2F0dGFjaChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50LAorCQkJCQlpbnQgdW5pdCwgc3RydWN0IG5jcl9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaG9zdF9kYXRhICpob3N0X2RhdGE7CisJc3RydWN0IG5jYiAqbnAgPSBOVUxMOworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gTlVMTDsKKwl1X2xvbmcgZmxhZ3MgPSAwOworCWludCBpOworCisJaWYgKCF0cG50LT5uYW1lKQorCQl0cG50LT5uYW1lCT0gU0NTSV9OQ1JfRFJJVkVSX05BTUU7CisJaWYgKCF0cG50LT5zaG9zdF9hdHRycykKKwkJdHBudC0+c2hvc3RfYXR0cnMgPSBuY3I1M2M4eHhfaG9zdF9hdHRyczsKKworCXRwbnQtPnF1ZXVlY29tbWFuZAk9IG5jcjUzYzh4eF9xdWV1ZV9jb21tYW5kOworCXRwbnQtPnNsYXZlX2NvbmZpZ3VyZQk9IG5jcjUzYzh4eF9zbGF2ZV9jb25maWd1cmU7CisJdHBudC0+c2xhdmVfYWxsb2MJPSBuY3I1M2M4eHhfc2xhdmVfYWxsb2M7CisJdHBudC0+ZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSBuY3I1M2M4eHhfYnVzX3Jlc2V0OworCXRwbnQtPmNhbl9xdWV1ZQkJPSBTQ1NJX05DUl9DQU5fUVVFVUU7CisJdHBudC0+dGhpc19pZAkJPSA3OworCXRwbnQtPnNnX3RhYmxlc2l6ZQk9IFNDU0lfTkNSX1NHX1RBQkxFU0laRTsKKwl0cG50LT5jbWRfcGVyX2x1bgk9IFNDU0lfTkNSX0NNRF9QRVJfTFVOOworCXRwbnQtPnVzZV9jbHVzdGVyaW5nCT0gRU5BQkxFX0NMVVNURVJJTkc7CisKKwlpZiAoZGV2aWNlLT5kaWZmZXJlbnRpYWwpCisJCWRyaXZlcl9zZXR1cC5kaWZmX3N1cHBvcnQgPSBkZXZpY2UtPmRpZmZlcmVudGlhbDsKKworCXByaW50ayhLRVJOX0lORk8gIm5jcjUzYzcyMC0lZDogcmV2IDB4JXggaXJxICVkXG4iLAorCQl1bml0LCBkZXZpY2UtPmNoaXAucmV2aXNpb25faWQsIGRldmljZS0+c2xvdC5pcnEpOworCisJaW5zdGFuY2UgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKCpob3N0X2RhdGEpKTsKKwlpZiAoIWluc3RhbmNlKQorCSAgICAgICAgZ290byBhdHRhY2hfZXJyb3I7CisJaG9zdF9kYXRhID0gKHN0cnVjdCBob3N0X2RhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJbnAgPSBfX21fY2FsbG9jX2RtYShkZXZpY2UtPmRldiwgc2l6ZW9mKHN0cnVjdCBuY2IpLCAiTkNCIik7CisJaWYgKCFucCkKKwkJZ290byBhdHRhY2hfZXJyb3I7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5zbXBfbG9jayk7CisJbnAtPmRldiA9IGRldmljZS0+ZGV2OworCW5wLT5wX25jYiA9IHZ0b2J1cyhucCk7CisJaG9zdF9kYXRhLT5uY2IgPSBucDsKKworCW5wLT5jY2IgPSBtX2NhbGxvY19kbWEoc2l6ZW9mKHN0cnVjdCBjY2IpLCAiQ0NCIik7CisJaWYgKCFucC0+Y2NiKQorCQlnb3RvIGF0dGFjaF9lcnJvcjsKKworCS8qIFN0b3JlIGlucHV0IGluZm9ybWF0aW9uIGluIHRoZSBob3N0IGRhdGEgc3RydWN0dXJlLiAgKi8KKwlucC0+dW5pdAk9IHVuaXQ7CisJbnAtPnZlcmJvc2UJPSBkcml2ZXJfc2V0dXAudmVyYm9zZTsKKwlzcHJpbnRmKG5wLT5pbnN0X25hbWUsICJuY3I1M2M3MjAtJWQiLCBucC0+dW5pdCk7CisJbnAtPnJldmlzaW9uX2lkCT0gZGV2aWNlLT5jaGlwLnJldmlzaW9uX2lkOworCW5wLT5mZWF0dXJlcwk9IGRldmljZS0+Y2hpcC5mZWF0dXJlczsKKwlucC0+Y2xvY2tfZGl2bgk9IGRldmljZS0+Y2hpcC5ucl9kaXZpc29yOworCW5wLT5tYXhvZmZzCT0gZGV2aWNlLT5jaGlwLm9mZnNldF9tYXg7CisJbnAtPm1heGJ1cnN0CT0gZGV2aWNlLT5jaGlwLmJ1cnN0X21heDsKKwlucC0+bXlhZGRyCT0gZGV2aWNlLT5ob3N0X2lkOworCisJLyogQWxsb2NhdGUgU0NSSVBUUyBhcmVhcy4gICovCisJbnAtPnNjcmlwdDAgPSBtX2NhbGxvY19kbWEoc2l6ZW9mKHN0cnVjdCBzY3JpcHQpLCAiU0NSSVBUIik7CisJaWYgKCFucC0+c2NyaXB0MCkKKwkJZ290byBhdHRhY2hfZXJyb3I7CisJbnAtPnNjcmlwdGgwID0gbV9jYWxsb2NfZG1hKHNpemVvZihzdHJ1Y3Qgc2NyaXB0aCksICJTQ1JJUFRIIik7CisJaWYgKCFucC0+c2NyaXB0aDApCisJCWdvdG8gYXR0YWNoX2Vycm9yOworCisJaW5pdF90aW1lcigmbnAtPnRpbWVyKTsKKwlucC0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykgbnA7CisJbnAtPnRpbWVyLmZ1bmN0aW9uID0gbmNyNTNjOHh4X3RpbWVvdXQ7CisKKwkvKiBUcnkgdG8gbWFwIHRoZSBjb250cm9sbGVyIGNoaXAgdG8gdmlydHVhbCBhbmQgcGh5c2ljYWwgbWVtb3J5LiAqLworCisJbnAtPnBhZGRyCT0gZGV2aWNlLT5zbG90LmJhc2U7CisJbnAtPnBhZGRyMgk9IChucC0+ZmVhdHVyZXMgJiBGRV9SQU0pID8gZGV2aWNlLT5zbG90LmJhc2VfMiA6IDA7CisKKwlpZiAoZGV2aWNlLT5zbG90LmJhc2VfdikKKwkJbnAtPnZhZGRyID0gZGV2aWNlLT5zbG90LmJhc2VfdjsKKwllbHNlCisJCW5wLT52YWRkciA9IGlvcmVtYXAoZGV2aWNlLT5zbG90LmJhc2VfYywgMTI4KTsKKworCWlmICghbnAtPnZhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBjYW4ndCBtYXAgbWVtb3J5IG1hcHBlZCBJTyByZWdpb25cbiIsbmNyX25hbWUobnApKTsKKwkJZ290byBhdHRhY2hfZXJyb3I7CisJfSBlbHNlIHsKKwkJaWYgKGJvb3R2ZXJib3NlID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IHVzaW5nIG1lbW9yeSBtYXBwZWQgSU8gYXQgdmlydHVhbCBhZGRyZXNzIDB4JWx4XG4iLCBuY3JfbmFtZShucCksICh1X2xvbmcpIG5wLT52YWRkcik7CisJfQorCisJLyogTWFrZSB0aGUgY29udHJvbGxlcidzIHJlZ2lzdGVycyBhdmFpbGFibGUuICBOb3cgdGhlIElOQiBJTlcgSU5MCisJICogT1VUQiBPVVRXIE9VVEwgbWFjcm9zIGNhbiBiZSB1c2VkIHNhZmVseS4KKwkgKi8KKworCW5wLT5yZWcgPSAoc3RydWN0IG5jcl9yZWcgX19pb21lbSAqKW5wLT52YWRkcjsKKworCS8qIERvIGNoaXAgZGVwZW5kZW50IGluaXRpYWxpemF0aW9uLiAgKi8KKwluY3JfcHJlcGFyZV9zZXR0aW5nKG5wKTsKKworCWlmIChucC0+cGFkZHIyICYmIHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSA+IDQwOTYpIHsKKwkJbnAtPnBhZGRyMiA9IDA7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzY3JpcHQgdG9vIGxhcmdlLCBOT1QgdXNpbmcgb24gY2hpcCBSQU0uXG4iLAorCQkJbmNyX25hbWUobnApKTsKKwl9CisKKwlpbnN0YW5jZS0+bWF4X2NoYW5uZWwJPSAwOworCWluc3RhbmNlLT50aGlzX2lkICAgICAgID0gbnAtPm15YWRkcjsKKwlpbnN0YW5jZS0+bWF4X2lkCT0gbnAtPm1heHdpZGUgPyAxNiA6IDg7CisJaW5zdGFuY2UtPm1heF9sdW4JPSBTQ1NJX05DUl9NQVhfTFVOOworCWluc3RhbmNlLT5iYXNlCQk9ICh1bnNpZ25lZCBsb25nKSBucC0+cmVnOworCWluc3RhbmNlLT5pcnEJCT0gZGV2aWNlLT5zbG90LmlycTsKKwlpbnN0YW5jZS0+dW5pcXVlX2lkCT0gZGV2aWNlLT5zbG90LmJhc2U7CisJaW5zdGFuY2UtPmRtYV9jaGFubmVsCT0gMDsKKwlpbnN0YW5jZS0+Y21kX3Blcl9sdW4JPSBNQVhfVEFHUzsKKwlpbnN0YW5jZS0+Y2FuX3F1ZXVlCT0gKE1BWF9TVEFSVC00KTsKKwkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IGZvcmdldCB0byBjYWxsIG5jcjUzYzh4eF9pbml0IGZyb20KKwkgKiB5b3VyIG1vZHVsZV9pbml0ICovCisJQlVHX09OKCFuY3I1M2M4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKwlpbnN0YW5jZS0+dHJhbnNwb3J0dAk9IG5jcjUzYzh4eF90cmFuc3BvcnRfdGVtcGxhdGU7CisJc2NzaV9zZXRfZGV2aWNlKGluc3RhbmNlLCBkZXZpY2UtPmRldik7CisKKwkvKiBQYXRjaCBzY3JpcHQgdG8gcGh5c2ljYWwgYWRkcmVzc2VzICovCisJbmNyX3NjcmlwdF9maWxsKCZzY3JpcHQwLCAmc2NyaXB0aDApOworCisJbnAtPnNjcmlwdGgJPSBucC0+c2NyaXB0aDA7CisJbnAtPnBfc2NyaXB0aAk9IHZ0b2J1cyhucC0+c2NyaXB0aCk7CisJbnAtPnBfc2NyaXB0CT0gKG5wLT5wYWRkcjIpID8gIG5wLT5wYWRkcjIgOiB2dG9idXMobnAtPnNjcmlwdDApOworCisJbmNyX3NjcmlwdF9jb3B5X2FuZF9iaW5kKG5wLCAobmNyY21kICopICZzY3JpcHQwLAorCQkJKG5jcmNtZCAqKSBucC0+c2NyaXB0MCwgc2l6ZW9mKHN0cnVjdCBzY3JpcHQpKTsKKwluY3Jfc2NyaXB0X2NvcHlfYW5kX2JpbmQobnAsIChuY3JjbWQgKikgJnNjcmlwdGgwLAorCQkJKG5jcmNtZCAqKSBucC0+c2NyaXB0aDAsIHNpemVvZihzdHJ1Y3Qgc2NyaXB0aCkpOworCW5wLT5jY2ItPnBfY2NiCT0gdnRvYnVzIChucC0+Y2NiKTsKKworCS8qIFBhdGNoIHRoZSBzY3JpcHQgZm9yIExFRCBzdXBwb3J0LiAgKi8KKworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9MRUQwKSB7CisJCW5wLT5zY3JpcHQwLT5pZGxlWzBdICA9CisJCQkJY3B1X3RvX3NjcihTQ1JfUkVHX1JFRyhncHJlZywgU0NSX09SLCAgMHgwMSkpOworCQlucC0+c2NyaXB0MC0+cmVzZWxlY3RlZFswXSA9CisJCQkJY3B1X3RvX3NjcihTQ1JfUkVHX1JFRyhncHJlZywgU0NSX0FORCwgMHhmZSkpOworCQlucC0+c2NyaXB0MC0+c3RhcnRbMF0gPQorCQkJCWNwdV90b19zY3IoU0NSX1JFR19SRUcoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpKTsKKwl9CisKKwkvKgorCSAqIExvb2sgZm9yIHRoZSB0YXJnZXQgY29udHJvbCBibG9jayBvZiB0aGlzIG5leHVzLgorCSAqIEZvciBpID0gMCB0byAzCisJICogICBKVU1QIF4gSUZUUlVFIChNQVNLIChpLCAzKSksIEAobmV4dF9sY2IpCisJICovCisJZm9yIChpID0gMCA7IGkgPCA0IDsgaSsrKSB7CisJCW5wLT5qdW1wX3RjYltpXS5sX2NtZCAgID0KKwkJCQljcHVfdG9fc2NyKChTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoaSwgMykpKSk7CisJCW5wLT5qdW1wX3RjYltpXS5sX3BhZGRyID0KKwkJCQljcHVfdG9fc2NyKE5DQl9TQ1JJUFRIX1BIWVMgKG5wLCBiYWRfdGFyZ2V0KSk7CisJfQorCisJbmNyX2NoaXBfcmVzZXQobnAsIDEwMCk7CisKKwkvKiBOb3cgY2hlY2sgdGhlIGNhY2hlIGhhbmRsaW5nIG9mIHRoZSBjaGlwc2V0LiAgKi8KKworCWlmIChuY3Jfc25vb3B0ZXN0KG5wKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNBQ0hFIElOQ09SUkVDVExZIENPTkZJR1VSRUQuXG4iKTsKKwkJZ290byBhdHRhY2hfZXJyb3I7CisJfQorCisJLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICAqLworCW5wLT5pcnEgPSBkZXZpY2UtPnNsb3QuaXJxOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZml4ZWQgcGFydCBvZiB0aGUgZGVmYXVsdCBjY2IuICAqLworCW5jcl9pbml0X2NjYihucCwgbnAtPmNjYik7CisKKwkvKgorCSAqIEFmdGVyIFNDU0kgZGV2aWNlcyBoYXZlIGJlZW4gb3BlbmVkLCB3ZSBjYW5ub3QgcmVzZXQgdGhlIGJ1cworCSAqIHNhZmVseSwgc28gd2UgZG8gaXQgaGVyZS4gIEludGVycnVwdCBoYW5kbGVyIGRvZXMgdGhlIHJlYWwgd29yay4KKwkgKiBQcm9jZXNzIHRoZSByZXNldCBleGNlcHRpb24gaWYgaW50ZXJydXB0cyBhcmUgbm90IGVuYWJsZWQgeWV0LgorCSAqIFRoZW4gZW5hYmxlIGRpc2Nvbm5lY3RzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKwlpZiAobmNyX3Jlc2V0X3Njc2lfYnVzKG5wLCAwLCBkcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZBVEFMIEVSUk9SOiBDSEVDSyBTQ1NJIEJVUyAtIENBQkxFUywgVEVSTUlOQVRJT04sIERFVklDRSBQT1dFUiBldGMuIVxuIiwgbmNyX25hbWUobnApKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKwkJZ290byBhdHRhY2hfZXJyb3I7CisJfQorCW5jcl9leGNlcHRpb24obnApOworCisJbnAtPmRpc2MgPSAxOworCisJLyoKKwkgKiBUaGUgbWlkZGxlLWxldmVsIFNDU0kgZHJpdmVyIGRvZXMgbm90IHdhaXQgZm9yIGRldmljZXMgdG8gc2V0dGxlLgorCSAqIFdhaXQgc3luY2hyb25vdXNseSBpZiBtb3JlIHRoYW4gMiBzZWNvbmRzLgorCSAqLworCWlmIChkcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5ID4gMikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogd2FpdGluZyAlZCBzZWNvbmRzIGZvciBzY3NpIGRldmljZXMgdG8gc2V0dGxlLi4uXG4iLAorCQkJbmNyX25hbWUobnApLCBkcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5KTsKKwkJbWRlbGF5KDEwMDAgKiBkcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5KTsKKwl9CisKKwkvKiBzdGFydCB0aGUgdGltZW91dCBkYWVtb24gKi8KKwlucC0+bGFzdHRpbWU9MDsKKwluY3JfdGltZW91dCAobnApOworCisJLyogdXNlIFNJTVBMRSBUQUcgbWVzc2FnZXMgYnkgZGVmYXVsdCAqLworI2lmZGVmIFNDU0lfTkNSX0FMV0FZU19TSU1QTEVfVEFHCisJbnAtPm9yZGVyID0gTV9TSU1QTEVfVEFHOworI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+c21wX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbnN0YW5jZTsKKworIGF0dGFjaF9lcnJvcjoKKwlpZiAoIWluc3RhbmNlKQorCQlyZXR1cm4gTlVMTDsKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGV0YWNoaW5nLi4uXG4iLCBuY3JfbmFtZShucCkpOworCWlmICghbnApCisJCWdvdG8gdW5yZWdpc3RlcjsKKwlpZiAobnAtPnNjcmlwdGgwKQorCQltX2ZyZWVfZG1hKG5wLT5zY3JpcHRoMCwgc2l6ZW9mKHN0cnVjdCBzY3JpcHRoKSwgIlNDUklQVEgiKTsKKwlpZiAobnAtPnNjcmlwdDApCisJCW1fZnJlZV9kbWEobnAtPnNjcmlwdDAsIHNpemVvZihzdHJ1Y3Qgc2NyaXB0KSwgIlNDUklQVCIpOworCWlmIChucC0+Y2NiKQorCQltX2ZyZWVfZG1hKG5wLT5jY2IsIHNpemVvZihzdHJ1Y3QgY2NiKSwgIkNDQiIpOworCW1fZnJlZV9kbWEobnAsIHNpemVvZihzdHJ1Y3QgbmNiKSwgIk5DQiIpOworCWhvc3RfZGF0YS0+bmNiID0gTlVMTDsKKworIHVucmVnaXN0ZXI6CisJc2NzaV9ob3N0X3B1dChpbnN0YW5jZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitpbnQgbmNyNTNjOHh4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaG9zdF9kYXRhICpob3N0X2RhdGE7CisjaWZkZWYgREVCVUdfTkNSNTNDOFhYCisJcHJpbnRrKCJuY3I1M2M4eHg6IHJlbGVhc2VcbiIpOworI2VuZGlmCisJaWYgKCFob3N0KQorCQlyZXR1cm4gMTsKKwlob3N0X2RhdGEgPSAoc3RydWN0IGhvc3RfZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCWlmIChob3N0X2RhdGEgJiYgaG9zdF9kYXRhLT5uY2IpCisJCW5jcl9kZXRhY2goaG9zdF9kYXRhLT5uY2IpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBuY3I1M2M4eHhfc2V0X3BlcmlvZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBwZXJpb2QpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG5jYiAqbnAgPSAoKHN0cnVjdCBob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGEpLT5uY2I7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwlpZiAocGVyaW9kID4gbnAtPm1heHN5bmMpCisJCXBlcmlvZCA9IG5wLT5tYXhzeW5jOworCWVsc2UgaWYgKHBlcmlvZCA8IG5wLT5taW5zeW5jKQorCQlwZXJpb2QgPSBucC0+bWluc3luYzsKKworCXRwLT51c3JzeW5jID0gcGVyaW9kOworCisJbmNyX25lZ290aWF0ZShucCwgdHApOworfQorCitzdGF0aWMgdm9pZCBuY3I1M2M4eHhfc2V0X29mZnNldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBvZmZzZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG5jYiAqbnAgPSAoKHN0cnVjdCBob3N0X2RhdGEgKilzaG9zdC0+aG9zdGRhdGEpLT5uY2I7CisJc3RydWN0IHRjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwlpZiAob2Zmc2V0ID4gbnAtPm1heG9mZnMpCisJCW9mZnNldCA9IG5wLT5tYXhvZmZzOworCWVsc2UgaWYgKG9mZnNldCA8IDApCisJCW9mZnNldCA9IDA7CisKKwl0cC0+bWF4b2ZmcyA9IG9mZnNldDsKKworCW5jcl9uZWdvdGlhdGUobnAsIHRwKTsKK30KKworc3RhdGljIHZvaWQgbmNyNTNjOHh4X3NldF93aWR0aChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCB3aWR0aCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbmNiICpucCA9ICgoc3RydWN0IGhvc3RfZGF0YSAqKXNob3N0LT5ob3N0ZGF0YSktPm5jYjsKKwlzdHJ1Y3QgdGNiICp0cCA9ICZucC0+dGFyZ2V0W3N0YXJnZXQtPmlkXTsKKworCWlmICh3aWR0aCA+IG5wLT5tYXh3aWRlKQorCQl3aWR0aCA9IG5wLT5tYXh3aWRlOworCWVsc2UgaWYgKHdpZHRoIDwgMCkKKwkJd2lkdGggPSAwOworCisJdHAtPnVzcndpZGUgPSB3aWR0aDsKKworCW5jcl9uZWdvdGlhdGUobnAsIHRwKTsKK30KKworc3RhdGljIHZvaWQgbmNyNTNjOHh4X2dldF9zaWduYWxsaW5nKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBuY2IgKm5wID0gKChzdHJ1Y3QgaG9zdF9kYXRhICopc2hvc3QtPmhvc3RkYXRhKS0+bmNiOworCWVudW0gc3BpX3NpZ25hbF90eXBlIHR5cGU7CisKKwlzd2l0Y2ggKG5wLT5zY3NpX21vZGUpIHsKKwljYXNlIFNNT0RFX1NFOgorCQl0eXBlID0gU1BJX1NJR05BTF9TRTsKKwkJYnJlYWs7CisJY2FzZSBTTU9ERV9IVkQ6CisJCXR5cGUgPSBTUElfU0lHTkFMX0hWRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHlwZSA9IFNQSV9TSUdOQUxfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCXNwaV9zaWduYWxsaW5nKHNob3N0KSA9IHR5cGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2Z1bmN0aW9uX3RlbXBsYXRlIG5jcjUzYzh4eF90cmFuc3BvcnRfZnVuY3Rpb25zID0gIHsKKwkuc2V0X3BlcmlvZAk9IG5jcjUzYzh4eF9zZXRfcGVyaW9kLAorCS5zaG93X3BlcmlvZAk9IDEsCisJLnNldF9vZmZzZXQJPSBuY3I1M2M4eHhfc2V0X29mZnNldCwKKwkuc2hvd19vZmZzZXQJPSAxLAorCS5zZXRfd2lkdGgJPSBuY3I1M2M4eHhfc2V0X3dpZHRoLAorCS5zaG93X3dpZHRoCT0gMSwKKwkuZ2V0X3NpZ25hbGxpbmcJPSBuY3I1M2M4eHhfZ2V0X3NpZ25hbGxpbmcsCit9OworCitpbnQgX19pbml0IG5jcjUzYzh4eF9pbml0KHZvaWQpCit7CisJbmNyNTNjOHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHNwaV9hdHRhY2hfdHJhbnNwb3J0KCZuY3I1M2M4eHhfdHJhbnNwb3J0X2Z1bmN0aW9ucyk7CisJaWYgKCFuY3I1M2M4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuY3I1M2M4eHhfZXhpdCh2b2lkKQoreworCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChuY3I1M2M4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguaCBiL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM3YjgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgRGV2aWNlIGRyaXZlciBmb3IgdGhlIFBDSS1TQ1NJIE5DUjUzOFhYIGNvbnRyb2xsZXIgZmFtaWx5LgorKioKKyoqICBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKiogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHBvcnRlZCB0byBMaW51eCBmcm9tIHRoZSBGcmVlQlNEIE5DUjUzQzhYWCBkcml2ZXIKKyoqICBhbmQgaXMgY3VycmVudGx5IG1haW50YWluZWQgYnkKKyoqCisqKiAgICAgICAgICBHZXJhcmQgUm91ZGllciAgICAgICAgICAgICAgPGdyb3VkaWVyQGZyZWUuZnI+CisqKgorKiogIEJlaW5nIGdpdmVuIHRoYXQgdGhpcyBkcml2ZXIgb3JpZ2luYXRlcyBmcm9tIHRoZSBGcmVlQlNEIHZlcnNpb24sIGFuZAorKiogIGluIG9yZGVyIHRvIGtlZXAgc3luZXJneSBvbiBib3RoLCBhbnkgc3VnZ2VzdGVkIGVuaGFuY2VtZW50cyBhbmQgY29ycmVjdGlvbnMKKyoqICByZWNlaXZlZCBvbiBMaW51eCBhcmUgYXV0b21hdGljYWxseSBhIHBvdGVudGlhbCBjYW5kaWRhdGUgZm9yIHRoZSBGcmVlQlNEIAorKiogIHZlcnNpb24uCisqKgorKiogIFRoZSBvcmlnaW5hbCBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisqKiAgICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyoqICAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorKioKKyoqICBBbmQgaGFzIGJlZW4gcG9ydGVkIHRvIE5ldEJTRCBieQorKiogICAgICAgICAgQ2hhcmxlcyBNLiBIYW5udW0gICAgICAgICAgIDxteWNyb2Z0QGdudS5haS5taXQuZWR1PgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgTkNSNTNDOFhYX0gKKyNkZWZpbmUgTkNSNTNDOFhYX0gKKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJzeW01M2M4eHhfZGVmcy5oIgorCisvKgorCUJ1aWxkIGEgc2NhdHRlci9nYXRoZXIgZW50cnkuCisJc2VlIHN5bTUzYzh4eF8yL3N5bV9oaXBkLmggZm9yIG1vcmUgZGV0YWlsZWQgc3ltX2J1aWxkX3NnZSgpCisJaW1wbGVtZW50YXRpb24gOykKKyAqLworCisjZGVmaW5lIG5jcl9idWlsZF9zZ2UobnAsIGRhdGEsIGJhZGQsIGxlbikJXAorZG8gewkJCQkJCVwKKwkoZGF0YSktPmFkZHIgPSBjcHVfdG9fc2NyKGJhZGQpOwlcCisJKGRhdGEpLT5zaXplID0gY3B1X3RvX3NjcihsZW4pOwkJXAorfSB3aGlsZSAoMCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJU3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBkZXRlY3Rpb24gcm91dGluZSB0byB0cmFuc21pdCAKKyoqCWRldmljZSBjb25maWd1cmF0aW9uIHRvIHRoZSBhdHRhY2ggZnVuY3Rpb24uCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RydWN0IG5jcl9zbG90IHsKKwl1X2xvbmcJYmFzZTsKKwl1X2xvbmcJYmFzZV8yOworCXVfbG9uZwliYXNlX2M7CisJdV9sb25nCWJhc2VfMl9jOworCXZvaWQgX19pb21lbSAqYmFzZV92OworCXZvaWQgX19pb21lbSAqYmFzZV8yX3Y7CisJaW50CWlycTsKKy8qIHBvcnQgYW5kIHJlZyBmaWVsZHMgdG8gdXNlIElOQiwgT1VUQiBtYWNyb3MgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgbmNyX3JlZwlfX2lvbWVtICpyZWc7Cit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglTdHJ1Y3R1cmUgdXNlZCBieSBkZXRlY3Rpb24gcm91dGluZSB0byBzYXZlIGRhdGEgb24gCisqKgllYWNoIGRldGVjdGVkIGJvYXJkIGZvciBhdHRhY2guCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RydWN0IG5jcl9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UgICpkZXY7CisJc3RydWN0IG5jcl9zbG90ICBzbG90OworCXN0cnVjdCBuY3JfY2hpcCAgY2hpcDsKKwl1X2NoYXIgaG9zdF9pZDsKKwl1OCBkaWZmZXJlbnRpYWw7Cit9OworCitleHRlcm4gc3RydWN0IFNjc2lfSG9zdCAqbmNyX2F0dGFjaChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50LCBpbnQgdW5pdCwgc3RydWN0IG5jcl9kZXZpY2UgKmRldmljZSk7CitleHRlcm4gaW50IG5jcjUzYzh4eF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworaXJxcmV0dXJuX3QgbmNyNTNjOHh4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworZXh0ZXJuIGludCBuY3I1M2M4eHhfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG5jcjUzYzh4eF9leGl0KHZvaWQpOworCisjZW5kaWYgLyogTkNSNTNDOFhYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9uc3AzMi5jIGIvZHJpdmVycy9zY3NpL25zcDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9uc3AzMi5jCkBAIC0wLDAgKzEsMzU4NSBAQAorLyoKKyAqIE5pbmphU0NTSS0zMkJpIENhcmRidXMsIE5pbmphU0NTSS0zMlVERSBQQ0kvQ2FyZEJ1cyBTQ1NJIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzCisgKiAgICAgIFlPS09UQSBIaXJvc2hpIDx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+CisgKiAgICAgIEdPVE8gTWFzYW5vcmkgPGdvdG9tQGRlYmlhbi5vci5qcD4sIDxnb3RvbUBkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogUmV2aXNpb24gSGlzdG9yeToKKyAqICAgMS4wOiBJbml0aWFsIFJlbGVhc2UuCisgKiAgIDEuMTogQWRkIC9wcm9jIFNEVFIgc3RhdHVzLgorICogICAgICAgIFJlbW92ZSBvYnNvbGV0ZSBlcnJvciBoYW5kbGVyIG5zcDMyX3Jlc2V0LgorICogICAgICAgIFNvbWUgY2xlYW4gdXAuCisgKiAgIDEuMjogUG93ZXJQQyAoYmlnIGVuZGlhbikgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorIyBpbmNsdWRlIDxsaW51eC9ibGsuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibnNwMzIuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgICAgICAgdHJhbnNfbW9kZSA9IDA7CS8qIGRlZmF1bHQ6IEJJT1MgKi8KK21vZHVsZV9wYXJhbSAgICAgKHRyYW5zX21vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRyYW5zX21vZGUsICJ0cmFuc2ZlciBtb2RlICgwOiBCSU9TKGRlZmF1bHQpIDE6IEFzeW5jIDI6IFVsdHJhMjBNIik7CisjZGVmaW5lIEFTWU5DX01PREUgICAgMQorI2RlZmluZSBVTFRSQTIwTV9NT0RFIDIKKworc3RhdGljIGludCAgICAgICBhdXRvX3BhcmFtID0gMDsJLyogZGVmYXVsdDogT04gKi8KK21vZHVsZV9wYXJhbSAgICAgKGF1dG9fcGFyYW0sIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhhdXRvX3BhcmFtLCAiQXV0b1BhcmFtZXRlciBtb2RlICgwOiBPTihkZWZhdWx0KSAxOiBPRkYpIik7CisKK3N0YXRpYyBpbnQgICAgICAgZGlzY19wcml2ICA9IDE7CS8qIGRlZmF1bHQ6IE9GRiAqLworbW9kdWxlX3BhcmFtICAgICAoZGlzY19wcml2LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzY19wcml2LCAgImRpc2Nvbm5lY3Rpb24gcHJpdmlsZWdlIG1vZGUgKDA6IE9OIDE6IE9GRihkZWZhdWx0KSkiKTsKKworTU9EVUxFX0FVVEhPUigiWU9LT1RBIEhpcm9zaGkgPHlva290YUBuZXRsYWIuaXMudHN1a3ViYS5hYy5qcD4sIEdPVE8gTWFzYW5vcmkgPGdvdG9tQGRlYmlhbi5vci5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV29ya2JpdCBOaW5qYVNDU0ktMzJCaS9VREUgQ2FyZEJ1cy9QQ0kgU0NTSSBob3N0IGJ1cyBhZGFwdGVyIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgY29uc3QgY2hhciAqbnNwMzJfcmVsZWFzZV92ZXJzaW9uID0gIjEuMiI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN1cHBvcnRlZCBoYXJkd2FyZQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbnNwMzJfcGNpX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS52ZW5kb3IgICAgICA9IFBDSV9WRU5ET1JfSURfSU9EQVRBLAorCQkuZGV2aWNlICAgICAgPSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJX0NCU0NfSUksCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IE1PREVMX0lPREFUQSwKKwl9LAorCXsKKwkJLnZlbmRvciAgICAgID0gUENJX1ZFTkRPUl9JRF9XT1JLQklULAorCQkuZGV2aWNlICAgICAgPSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJX0tNRSwKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gTU9ERUxfS01FLAorCX0sCisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1dPUktCSVQsCisJCS5kZXZpY2UgICAgICA9IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklfV0JULAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBNT0RFTF9XT1JLQklULAorCX0sCisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1dPUktCSVQsCisJCS5kZXZpY2UgICAgICA9IFBDSV9ERVZJQ0VfSURfV09SS0JJVF9TVEFOREFSRCwKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gTU9ERUxfUENJX1dPUktCSVQsCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICA9IFBDSV9WRU5ET1JfSURfV09SS0JJVCwKKwkJLmRldmljZSAgICAgID0gUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJCSV9MT0dJVEVDLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBNT0RFTF9MT0dJVEVDLAorCX0sCisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1dPUktCSVQsCisJCS5kZXZpY2UgICAgICA9IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklCX0xPR0lURUMsCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IE1PREVMX1BDSV9MT0dJVEVDLAorCX0sCisJeworCQkudmVuZG9yICAgICAgPSBQQ0lfVkVORE9SX0lEX1dPUktCSVQsCisJCS5kZXZpY2UgICAgICA9IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyVURFX01FTENPLAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBNT0RFTF9QQ0lfTUVMQ08sCisJfSwKKwl7CisJCS52ZW5kb3IgICAgICA9IFBDSV9WRU5ET1JfSURfV09SS0JJVCwKKwkJLmRldmljZSAgICAgID0gUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJVREVfTUVMQ09fSUksCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IE1PREVMX1BDSV9NRUxDTywKKwl9LAorCXswLDAsfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbnNwMzJfcGNpX3RhYmxlKTsKKworc3RhdGljIG5zcDMyX2h3X2RhdGEgbnNwMzJfZGF0YV9iYXNlOyAgLyogcHJvYmUgPC0+IGRldGVjdCBnbHVlICovCisKKworLyoKKyAqIFBlcmlvZC9BY2tXaWR0aCBzcGVlZCBjb252ZXJzaW9uIHRhYmxlCisgKgorICogTm90ZTogVGhpcyBwZXJpb2QvYWNrd2lkdGggc3BlZWQgdGFibGUgbXVzdCBiZSBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICovCitzdGF0aWMgbnNwMzJfc3luY190YWJsZSBuc3AzMl9zeW5jX3RhYmxlXzQwTVtdID0geworICAgICAvKiB7UE5vLCBBVywgICBTUCwgICBFUCwgU1JFUSBzbXBsfSAgU3BlZWQoTUIvcykgUGVyaW9kIEFja1dpZHRoICovCisJezB4MSwgIDAsIDB4MGMsIDB4MGMsIFNNUExfNDBNfSwgIC8qICAyMC4wIDogIDUwbnMsICAyNW5zICovCisJezB4MiwgIDAsIDB4MGQsIDB4MTgsIFNNUExfNDBNfSwgIC8qICAxMy4zIDogIDc1bnMsICAyNW5zICovCisJezB4MywgIDEsIDB4MTksIDB4MTksIFNNUExfNDBNfSwgIC8qICAxMC4wIDogMTAwbnMsICA1MG5zICovCisJezB4NCwgIDEsIDB4MWEsIDB4MWYsIFNNUExfMjBNfSwgIC8qICAgOC4wIDogMTI1bnMsICA1MG5zICovCisJezB4NSwgIDIsIDB4MjAsIDB4MjUsIFNNUExfMjBNfSwgIC8qICAgNi43IDogMTUwbnMsICA3NW5zICovCisJezB4NiwgIDIsIDB4MjYsIDB4MzEsIFNNUExfMjBNfSwgIC8qICAgNS43IDogMTc1bnMsICA3NW5zICovCisJezB4NywgIDMsIDB4MzIsIDB4MzIsIFNNUExfMjBNfSwgIC8qICAgNS4wIDogMjAwbnMsIDEwMG5zICovCisJezB4OCwgIDMsIDB4MzMsIDB4MzgsIFNNUExfMTBNfSwgIC8qICAgNC40IDogMjI1bnMsIDEwMG5zICovCisJezB4OSwgIDMsIDB4MzksIDB4M2UsIFNNUExfMTBNfSwgIC8qICAgNC4wIDogMjUwbnMsIDEwMG5zICovCit9OworCitzdGF0aWMgbnNwMzJfc3luY190YWJsZSBuc3AzMl9zeW5jX3RhYmxlXzIwTVtdID0geworCXsweDEsICAwLCAweDE5LCAweDE5LCBTTVBMXzQwTX0sICAvKiAxMC4wIDogMTAwbnMsICA1MG5zICovCisJezB4MiwgIDAsIDB4MWEsIDB4MjUsIFNNUExfMjBNfSwgIC8qICA2LjcgOiAxNTBucywgIDUwbnMgKi8KKwl7MHgzLCAgMSwgMHgyNiwgMHgzMiwgU01QTF8yME19LCAgLyogIDUuMCA6IDIwMG5zLCAxMDBucyAqLworCXsweDQsICAxLCAweDMzLCAweDNlLCBTTVBMXzEwTX0sICAvKiAgNC4wIDogMjUwbnMsIDEwMG5zICovCisJezB4NSwgIDIsIDB4M2YsIDB4NGIsIFNNUExfMTBNfSwgIC8qICAzLjMgOiAzMDBucywgMTUwbnMgKi8KKwl7MHg2LCAgMiwgMHg0YywgMHg1NywgU01QTF8xME19LCAgLyogIDIuOCA6IDM1MG5zLCAxNTBucyAqLworCXsweDcsICAzLCAweDU4LCAweDY0LCBTTVBMXzEwTX0sICAvKiAgMi41IDogNDAwbnMsIDIwMG5zICovCisJezB4OCwgIDMsIDB4NjUsIDB4NzAsIFNNUExfMTBNfSwgIC8qICAyLjIgOiA0NTBucywgMjAwbnMgKi8KKwl7MHg5LCAgMywgMHg3MSwgMHg3ZCwgU01QTF8xME19LCAgLyogIDIuMCA6IDUwMG5zLCAyMDBucyAqLworfTsKKworc3RhdGljIG5zcDMyX3N5bmNfdGFibGUgbnNwMzJfc3luY190YWJsZV9wY2lbXSA9IHsKKwl7MHgxLCAgMCwgMHgwYywgMHgwZiwgU01QTF80ME19LCAgLyogMTYuNiA6ICA2MG5zLCAgMzBucyAqLworCXsweDIsICAwLCAweDEwLCAweDE2LCBTTVBMXzQwTX0sICAvKiAxMS4xIDogIDkwbnMsICAzMG5zICovCisJezB4MywgIDEsIDB4MTcsIDB4MWUsIFNNUExfMjBNfSwgIC8qICA4LjMgOiAxMjBucywgIDYwbnMgKi8KKwl7MHg0LCAgMSwgMHgxZiwgMHgyNSwgU01QTF8yME19LCAgLyogIDYuNyA6IDE1MG5zLCAgNjBucyAqLworCXsweDUsICAyLCAweDI2LCAweDJkLCBTTVBMXzIwTX0sICAvKiAgNS42IDogMTgwbnMsICA5MG5zICovCisJezB4NiwgIDIsIDB4MmUsIDB4MzQsIFNNUExfMTBNfSwgIC8qICA0LjggOiAyMTBucywgIDkwbnMgKi8KKwl7MHg3LCAgMywgMHgzNSwgMHgzYywgU01QTF8xME19LCAgLyogIDQuMiA6IDI0MG5zLCAxMjBucyAqLworCXsweDgsICAzLCAweDNkLCAweDQzLCBTTVBMXzEwTX0sICAvKiAgMy43IDogMjcwbnMsIDEyMG5zICovCisJezB4OSwgIDMsIDB4NDQsIDB4NGIsIFNNUExfMTBNfSwgIC8qICAzLjMgOiAzMDBucywgMTIwbnMgKi8KK307CisKKy8qCisgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbgorICovCisvKiBtb2R1bGUgZW50cnkgcG9pbnQgKi8KK3N0YXRpYyBpbnQgIF9fZGV2aW5pdCBuc3AzMl9wcm9iZSAoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbnNwMzJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIGludCAgX19pbml0ICAgIGluaXRfbnNwMzIgICh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCAgICBleGl0X25zcDMyICAodm9pZCk7CisKKy8qIHN0cnVjdCBTY3NpX0hvc3RfVGVtcGxhdGUgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKK3N0YXRpYyBpbnQgICAgICAgICBuc3AzMl9wcm9jX2luZm8gICAoc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCk7CisjZWxzZQorc3RhdGljIGludCAgICAgICAgIG5zcDMyX3Byb2NfaW5mbyAgIChjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCwgaW50KTsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCitzdGF0aWMgaW50ICAgICAgICAgbnNwMzJfZGV0ZWN0ICAgICAgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKyNlbHNlCitzdGF0aWMgaW50ICAgICAgICAgbnNwMzJfZGV0ZWN0ICAgICAgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKKyNlbmRpZgorc3RhdGljIGludCAgICAgICAgIG5zcDMyX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosCisJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBjb25zdCBjaGFyICpuc3AzMl9pbmZvICAgICAgICAoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgICAgICAgICBuc3AzMl9yZWxlYXNlICAgICAoc3RydWN0IFNjc2lfSG9zdCAqKTsKKworLyogU0NTSSBlcnJvciBoYW5kbGVyICovCitzdGF0aWMgaW50ICAgICAgICAgbnNwMzJfZWhfYWJvcnQgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCAgICAgICAgIG5zcDMyX2VoX2J1c19yZXNldCAoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgICAgICAgICBuc3AzMl9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CisKKy8qIGdlbmVyYXRlIFNDU0kgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgbnNwMzJfYnVpbGRfaWRlbnRpZnkoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX25vcCAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9idWlsZF9yZWplY3QgIChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIHZvaWQgbnNwMzJfYnVpbGRfc2R0ciAgICAoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKKworLyogU0NTSSBtZXNzYWdlIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgIG5zcDMyX2J1c2ZyZWVfb2NjdXIoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBzaG9ydCk7CitzdGF0aWMgdm9pZCBuc3AzMl9tc2dvdXRfb2NjdXIgKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9tc2dpbl9vY2N1ciAgKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgc2hvcnQpOworCitzdGF0aWMgaW50ICBuc3AzMl9zZXR1cF9zZ190YWJsZSAgICAoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgIG5zcDMyX3NlbGVjdGlvbl9hdXRvcGFyYShzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCAgbnNwMzJfc2VsZWN0aW9uX2F1dG9zY3NpKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9zY3NpX2RvbmUgICAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgIG5zcDMyX2FyYml0cmF0aW9uICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50ICBuc3AzMl9yZXNlbGVjdGlvbiAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyB2b2lkIG5zcDMyX2FkanVzdF9idXNmcmVlICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBuc3AzMl9yZXN0YXJ0X2F1dG9zY3NpICAoc3RydWN0IHNjc2lfY21uZCAqLCB1bnNpZ25lZCBzaG9ydCk7CisKKy8qIFNDU0kgU0RUUiAqLworc3RhdGljIHZvaWQgbnNwMzJfYW5hbHl6ZV9zZHRyICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCAgbnNwMzJfc2VhcmNoX3BlcmlvZF9lbnRyeShuc3AzMl9od19kYXRhICosIG5zcDMyX3RhcmdldCAqLCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyB2b2lkIG5zcDMyX3NldF9hc3luYyAgICAgICAgICAobnNwMzJfaHdfZGF0YSAqLCBuc3AzMl90YXJnZXQgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9zZXRfbWF4X3N5bmMgICAgICAgKG5zcDMyX2h3X2RhdGEgKiwgbnNwMzJfdGFyZ2V0ICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKK3N0YXRpYyB2b2lkIG5zcDMyX3NldF9zeW5jX2VudHJ5ICAgICAobnNwMzJfaHdfZGF0YSAqLCBuc3AzMl90YXJnZXQgKiwgaW50LCB1bnNpZ25lZCBjaGFyKTsKKworLyogU0NTSSBidXMgc3RhdHVzIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3dhaXRfcmVxICAgIChuc3AzMl9od19kYXRhICosIGludCk7CitzdGF0aWMgdm9pZCBuc3AzMl93YWl0X3NhY2sgICAobnNwMzJfaHdfZGF0YSAqLCBpbnQpOworc3RhdGljIHZvaWQgbnNwMzJfc2Fja19hc3NlcnQgKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgdm9pZCBuc3AzMl9zYWNrX25lZ2F0ZSAobnNwMzJfaHdfZGF0YSAqKTsKK3N0YXRpYyB2b2lkIG5zcDMyX2RvX2J1c19yZXNldChuc3AzMl9od19kYXRhICopOworCisvKiBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90IGRvX25zcDMyX2lzcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKy8qIGluaXRpYWxpemUgaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgIG5zcDMyaHdfaW5pdChuc3AzMl9od19kYXRhICopOworCisvKiBFRVBST00gaGFuZGxlciAqLworc3RhdGljICAgICAgICBpbnQgIG5zcDMyX2dldHByb21fcGFyYW0gKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgICAgICAgIGludCAgbnNwMzJfZ2V0cHJvbV9hdDI0ICAobnNwMzJfaHdfZGF0YSAqKTsKK3N0YXRpYyAgICAgICAgaW50ICBuc3AzMl9nZXRwcm9tX2MxNiAgIChuc3AzMl9od19kYXRhICopOworc3RhdGljICAgICAgICB2b2lkIG5zcDMyX3Byb21fc3RhcnQgICAgKG5zcDMyX2h3X2RhdGEgKik7CitzdGF0aWMgICAgICAgIHZvaWQgbnNwMzJfcHJvbV9zdG9wICAgICAobnNwMzJfaHdfZGF0YSAqKTsKK3N0YXRpYyAgICAgICAgaW50ICBuc3AzMl9wcm9tX3JlYWQgICAgIChuc3AzMl9od19kYXRhICosIGludCk7CitzdGF0aWMgICAgICAgIGludCAgbnNwMzJfcHJvbV9yZWFkX2JpdCAobnNwMzJfaHdfZGF0YSAqKTsKK3N0YXRpYyAgICAgICAgdm9pZCBuc3AzMl9wcm9tX3dyaXRlX2JpdChuc3AzMl9od19kYXRhICosIGludCk7CitzdGF0aWMgICAgICAgIHZvaWQgbnNwMzJfcHJvbV9zZXQgICAgICAobnNwMzJfaHdfZGF0YSAqLCBpbnQsIGludCk7CitzdGF0aWMgICAgICAgIGludCAgbnNwMzJfcHJvbV9nZXQgICAgICAobnNwMzJfaHdfZGF0YSAqLCBpbnQpOworCisvKiBkZWJ1Zy93YXJuaW5nL2luZm8gbWVzc2FnZSAqLworc3RhdGljIHZvaWQgbnNwMzJfbWVzc2FnZSAoY29uc3QgY2hhciAqLCBpbnQsIGNoYXIgKiwgY2hhciAqLCAuLi4pOworI2lmZGVmIE5TUDMyX0RFQlVHCitzdGF0aWMgdm9pZCBuc3AzMl9kbWVzc2FnZShjb25zdCBjaGFyICosIGludCwgaW50LCAgICBjaGFyICosIC4uLik7CisjZW5kaWYKKworLyoKKyAqIG1heF9zZWN0b3JzIGlzIGN1cnJlbnRseSBsaW1pdGVkIHVwIHRvIDEyOC4KKyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbnNwMzJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJCT0gIm5zcDMyIiwKKwkubmFtZQkJCQk9ICJXb3JrYml0IE5pbmphU0NTSS0zMkJpL1VERSIsCisJLnByb2NfaW5mbwkJCT0gbnNwMzJfcHJvY19pbmZvLAorCS5pbmZvCQkJCT0gbnNwMzJfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBuc3AzMl9xdWV1ZWNvbW1hbmQsCisJLmNhbl9xdWV1ZQkJCT0gMSwKKwkuc2dfdGFibGVzaXplCQkJPSBOU1AzMl9TR19TSVpFLAorCS5tYXhfc2VjdG9ycwkJCT0gMTI4LAorCS5jbWRfcGVyX2x1bgkJCT0gMSwKKwkudGhpc19pZAkJCT0gTlNQMzJfSE9TVF9TQ1NJSUQsCisJLnVzZV9jbHVzdGVyaW5nCQkJPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgCT0gbnNwMzJfZWhfYWJvcnQsCisvKgkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBOVUxMLCAqLworCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBuc3AzMl9laF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBuc3AzMl9laF9ob3N0X3Jlc2V0LAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNzQpKQorCS5kZXRlY3QJCQkJPSBuc3AzMl9kZXRlY3QsCisJLnJlbGVhc2UJCQk9IG5zcDMyX3JlbGVhc2UsCisjZW5kaWYKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDIpKQorCS51c2VfbmV3X2VoX2NvZGUgICAgICAgIAk9IDEsCisjZWxzZQorLyoJLmhpZ2htZW1faW8JCQk9IDEsICovCisjZW5kaWYKK307CisKKyNpbmNsdWRlICJuc3AzMl9pby5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRlYnVnLCBlcnJvciBwcmludAorICovCisjaWZuZGVmIE5TUDMyX0RFQlVHCisjIGRlZmluZSBOU1AzMl9ERUJVR19NQVNLCSAgICAgIDB4MDAwMDAwCisjIGRlZmluZSBuc3AzMl9tc2codHlwZSwgYXJncy4uLikgICAgIG5zcDMyX21lc3NhZ2UgKCIiLCAwLCAodHlwZSksIGFyZ3MpCisjIGRlZmluZSBuc3AzMl9kYmcobWFzaywgYXJncy4uLikgICAgIC8qICovCisjZWxzZQorIyBkZWZpbmUgTlNQMzJfREVCVUdfTUFTSwkgICAgICAweGZmZmZmZgorIyBkZWZpbmUgbnNwMzJfbXNnKHR5cGUsIGFyZ3MuLi4pIFwKKwluc3AzMl9tZXNzYWdlIChfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAodHlwZSksIGFyZ3MpCisjIGRlZmluZSBuc3AzMl9kYmcobWFzaywgYXJncy4uLikgXAorCW5zcDMyX2RtZXNzYWdlKF9fRlVOQ1RJT05fXywgX19MSU5FX18sIChtYXNrKSwgYXJncykKKyNlbmRpZgorCisjZGVmaW5lIE5TUDMyX0RFQlVHX1FVRVVFQ09NTUFORAlCSVQoMCkKKyNkZWZpbmUgTlNQMzJfREVCVUdfUkVHSVNURVIJCUJJVCgxKQorI2RlZmluZSBOU1AzMl9ERUJVR19BVVRPU0NTSQkJQklUKDIpCisjZGVmaW5lIE5TUDMyX0RFQlVHX0lOVFIJCUJJVCgzKQorI2RlZmluZSBOU1AzMl9ERUJVR19TR0xJU1QJCUJJVCg0KQorI2RlZmluZSBOU1AzMl9ERUJVR19CVVNGUkVFCQlCSVQoNSkKKyNkZWZpbmUgTlNQMzJfREVCVUdfQ0RCX0NPTlRFTlRTCUJJVCg2KQorI2RlZmluZSBOU1AzMl9ERUJVR19SRVNFTEVDVElPTgkJQklUKDcpCisjZGVmaW5lIE5TUDMyX0RFQlVHX01TR0lOT0NDVVIJCUJJVCg4KQorI2RlZmluZSBOU1AzMl9ERUJVR19FRVBST00JCUJJVCg5KQorI2RlZmluZSBOU1AzMl9ERUJVR19NU0dPVVRPQ0NVUgkJQklUKDEwKQorI2RlZmluZSBOU1AzMl9ERUJVR19CVVNSRVNFVAkJQklUKDExKQorI2RlZmluZSBOU1AzMl9ERUJVR19SRVNUQVJUCQlCSVQoMTIpCisjZGVmaW5lIE5TUDMyX0RFQlVHX1NZTkMJCUJJVCgxMykKKyNkZWZpbmUgTlNQMzJfREVCVUdfV0FJVAkJQklUKDE0KQorI2RlZmluZSBOU1AzMl9ERUJVR19UQVJHRVRGTEFHCQlCSVQoMTUpCisjZGVmaW5lIE5TUDMyX0RFQlVHX1BST0MJCUJJVCgxNikKKyNkZWZpbmUgTlNQMzJfREVCVUdfSU5JVAkJQklUKDE3KQorI2RlZmluZSBOU1AzMl9TUEVDSUFMX1BSSU5UX1JFR0lTVEVSCUJJVCgyMCkKKworI2RlZmluZSBOU1AzMl9ERUJVR19CVUZfTEVOCQkxMDAKKworc3RhdGljIHZvaWQgbnNwMzJfbWVzc2FnZShjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSwgY2hhciAqdHlwZSwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmW05TUDMyX0RFQlVHX0JVRl9MRU5dOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKyNpZm5kZWYgTlNQMzJfREVCVUcKKwlwcmludGsoIiVzbnNwMzI6ICVzXG4iLCB0eXBlLCBidWYpOworI2Vsc2UKKwlwcmludGsoIiVzbnNwMzI6ICVzICglZCk6ICVzXG4iLCB0eXBlLCBmdW5jLCBsaW5lLCBidWYpOworI2VuZGlmCit9CisKKyNpZmRlZiBOU1AzMl9ERUJVRworc3RhdGljIHZvaWQgbnNwMzJfZG1lc3NhZ2UoY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUsIGludCBtYXNrLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbTlNQMzJfREVCVUdfQlVGX0xFTl07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWlmIChtYXNrICYgTlNQMzJfREVCVUdfTUFTSykgeworCQlwcmludGsoIm5zcDMyLWRlYnVnOiAweCV4ICVzICglZCk6ICVzXG4iLCBtYXNrLCBmdW5jLCBsaW5lLCBidWYpOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgTlNQMzJfREVCVUcKKyMgaW5jbHVkZSAibnNwMzJfZGVidWcuYyIKKyNlbHNlCisjIGRlZmluZSBzaG93X2NvbW1hbmQoYXJnKSAgIC8qICovCisjIGRlZmluZSBzaG93X2J1c3BoYXNlKGFyZykgIC8qICovCisjIGRlZmluZSBzaG93X2F1dG9waGFzZShhcmcpIC8qICovCisjZW5kaWYKKworLyoKKyAqIElERU5USUZZIE1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfYnVpbGRfaWRlbnRpZnkoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50IHBvcyAgICAgICAgICAgICA9IGRhdGEtPm1zZ291dF9sZW47CisJaW50IG1vZGUgICAgICAgICAgICA9IEZBTFNFOworCisJLyogWFhYOiBBdXRvIERpc2NQcml2IGRldGVjdGlvbiBpcyBwcm9ncmVzc2luZy4uLiAqLworCWlmIChkaXNjX3ByaXYgPT0gMCkgeworCQkvKiBtb2RlID0gVFJVRTsgKi8KKwl9CisKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IElERU5USUZZKG1vZGUsIFNDcG50LT5kZXZpY2UtPmx1bik7IHBvcysrOworCisJZGF0YS0+bXNnb3V0X2xlbiA9IHBvczsKK30KKworLyoKKyAqIFNEVFIgTWVzc2FnZSBSb3V0aW5lCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX3NkdHIoc3RydWN0IHNjc2lfY21uZCAgICAqU0NwbnQsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgcGVyaW9kLAorCQkJICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgcG9zICAgICAgICAgICAgID0gZGF0YS0+bXNnb3V0X2xlbjsKKworCWRhdGEtPm1zZ291dGJ1Zltwb3NdID0gRVhURU5ERURfTUVTU0FHRTsgIHBvcysrOworCWRhdGEtPm1zZ291dGJ1Zltwb3NdID0gRVhURU5ERURfU0RUUl9MRU47IHBvcysrOworCWRhdGEtPm1zZ291dGJ1Zltwb3NdID0gRVhURU5ERURfU0RUUjsgICAgIHBvcysrOworCWRhdGEtPm1zZ291dGJ1Zltwb3NdID0gcGVyaW9kOyAgICAgICAgICAgIHBvcysrOworCWRhdGEtPm1zZ291dGJ1Zltwb3NdID0gb2Zmc2V0OyAgICAgICAgICAgIHBvcysrOworCisJZGF0YS0+bXNnb3V0X2xlbiA9IHBvczsKK30KKworLyoKKyAqIE5vIE9wZXJhdGlvbiBNZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX25vcChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgICAgICAgICAgICBwb3MgID0gZGF0YS0+bXNnb3V0X2xlbjsKKworCWlmIChwb3MgIT0gMCkgeworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLAorCQkJICAiU29tZSBtZXNzYWdlcyBhcmUgYWxyZWFkeSBjb250YWluZWQhIik7CisJCXJldHVybjsKKwl9CisKKwlkYXRhLT5tc2dvdXRidWZbcG9zXSA9IE5PUDsgcG9zKys7CisJZGF0YS0+bXNnb3V0X2xlbiA9IHBvczsKK30KKworLyoKKyAqIFJlamVjdCBNZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2J1aWxkX3JlamVjdChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlpbnQgICAgICAgICAgICBwb3MgID0gZGF0YS0+bXNnb3V0X2xlbjsKKworCWRhdGEtPm1zZ291dGJ1Zltwb3NdID0gTUVTU0FHRV9SRUpFQ1Q7IHBvcysrOworCWRhdGEtPm1zZ291dF9sZW4gPSBwb3M7Cit9CisJCisvKgorICogdGltZXIKKyAqLworI2lmIDAKK3N0YXRpYyB2b2lkIG5zcDMyX3N0YXJ0X3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBpbnQgdGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IFNDcG50LT5ob3N0LT5pb19wb3J0OworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJ0aW1lcj0lZCIsIHRpbWUpOworCisJaWYgKHRpbWUgJiAoflRJTUVSX0NOVF9NQVNLKSkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgInRpbWVyIHNldCBvdmVyZmxvdyIpOworCX0KKworCW5zcDMyX3dyaXRlMihiYXNlLCBUSU1FUl9TRVQsIHRpbWUgJiBUSU1FUl9DTlRfTUFTSyk7Cit9CisjZW5kaWYKKworCisvKgorICogc2V0IFNDU0kgY29tbWFuZCBhbmQgb3RoZXIgcGFyYW1ldGVyIHRvIGFzaWMsIGFuZCBzdGFydCBzZWxlY3Rpb24gcGhhc2UKKyAqLworc3RhdGljIGludCBuc3AzMl9zZWxlY3Rpb25fYXV0b3BhcmEoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludAliYXNlICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBpbnQJaG9zdF9pZCA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7CisJdW5zaWduZWQgY2hhcgl0YXJnZXQgID0gU0NwbnQtPmRldmljZS0+aWQ7CisJbnNwMzJfYXV0b3BhcmFtICpwYXJhbSAgPSBkYXRhLT5hdXRvcGFyYW07CisJdW5zaWduZWQgY2hhcglwaGFzZTsKKwlpbnQJCWksIHJldDsKKwl1bnNpZ25lZCBpbnQJbXNnb3V0OworCXUxNl9sZQkgICAgICAgIHM7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksICJpbiIpOworCisJLyoKKwkgKiBjaGVjayBidXMgZnJlZQorCSAqLworCXBoYXNlID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfTU9OSVRPUik7CisJaWYgKHBoYXNlICE9IEJVU01PTl9CVVNfRlJFRSkgeworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAiYnVzIGJ1c3kiKTsKKwkJc2hvd19idXNwaGFzZShwaGFzZSAmIEJVU01PTl9QSEFTRV9NQVNLKTsKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qCisJICogbWVzc2FnZSBvdXQKKwkgKgorCSAqIE5vdGU6IElmIHRoZSByYW5nZSBvZiBtc2dvdXRfbGVuIGlzIDEgLSAzLCBmaWxsIHNjc2lfbXNnb3V0LgorCSAqICAgICAgIG92ZXIgMyBtZXNzYWdlcyBuZWVkcyBhbm90aGVyIHJvdXRpbmUuCisJICovCisJaWYgKGRhdGEtPm1zZ291dF9sZW4gPT0gMCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJTQ1NJIE1zZ091dCB3aXRob3V0IGFueSBtZXNzYWdlISIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlIGlmIChkYXRhLT5tc2dvdXRfbGVuID4gMCAmJiBkYXRhLT5tc2dvdXRfbGVuIDw9IDMpIHsKKwkJbXNnb3V0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGRhdGEtPm1zZ291dF9sZW47IGkrKykgeworCQkJLyoKKwkJCSAqIHRoZSBzZW5kaW5nIG9yZGVyIG9mIHRoZSBtZXNzYWdlIGlzOgorCQkJICogIE1DTlQgMzogTVNHIzAgLT4gTVNHIzEgLT4gTVNHIzIKKwkJCSAqICBNQ05UIDI6ICAgICAgICAgIE1TRyMxIC0+IE1TRyMyCisJCQkgKiAgTUNOVCAxOiAgICAgICAgICAgICAgICAgICBNU0cjMiAgICAKKwkJCSAqLworCQkJbXNnb3V0ID4+PSA4OworCQkJbXNnb3V0IHw9ICgodW5zaWduZWQgaW50KShkYXRhLT5tc2dvdXRidWZbaV0pIDw8IDI0KTsKKwkJfQorCQltc2dvdXQgfD0gTVZfVkFMSUQ7CS8qIE1WIHZhbGlkICovCisJCW1zZ291dCB8PSAodW5zaWduZWQgaW50KWRhdGEtPm1zZ291dF9sZW47IC8qIGxlbiAqLworCX0gZWxzZSB7CisJCS8qIGRhdGEtPm1zZ291dF9sZW4gPiAzICovCisJCW1zZ291dCA9IDA7CisJfQorCisJLy8gbnNwX2RiZyhOU1AzMl9ERUJVR19BVVRPU0NTSSwgInNlbCB0aW1lIG91dD0weCV4XG4iLCBuc3AzMl9yZWFkMihiYXNlLCBTRUxfVElNRV9PVVQpKTsKKwkvLyBuc3AzMl93cml0ZTIoYmFzZSwgU0VMX1RJTUVfT1VULCAgIFNFTF9USU1FT1VUX1RJTUUpOworCisJLyoKKwkgKiBzZXR1cCBhc2ljIHBhcmFtZXRlcgorCSAqLworCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKG5zcDMyX2F1dG9wYXJhbSkpOworCisJLyogY2RiICovCisJZm9yIChpID0gMDsgaSA8IFNDcG50LT5jbWRfbGVuOyBpKyspIHsKKwkJcGFyYW0tPmNkYls0ICogaV0gPSBTQ3BudC0+Y21uZFtpXTsKKwl9CisKKwkvKiBvdXRnb2luZyBtZXNzYWdlcyAqLworCXBhcmFtLT5tc2dvdXQgPSBjcHVfdG9fbGUzMihtc2dvdXQpOworCisJLyogc3luY3JlZywgYWNrd2lkdGgsIHRhcmdldCBpZCwgU1JFUSBzYW1wbGluZyByYXRlICovCisJcGFyYW0tPnN5bmNyZWcgICAgPSBkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jcmVnOworCXBhcmFtLT5hY2t3aWR0aCAgID0gZGF0YS0+Y3VyX3RhcmdldC0+YWNrd2lkdGg7CisJcGFyYW0tPnRhcmdldF9pZCAgPSBCSVQoaG9zdF9pZCkgfCBCSVQodGFyZ2V0KTsKKwlwYXJhbS0+c2FtcGxlX3JlZyA9IGRhdGEtPmN1cl90YXJnZXQtPnNhbXBsZV9yZWc7CisKKwkvLyBuc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksICJzYW1wbGUgcmF0ZT0weCV4XG4iLCBkYXRhLT5jdXJfdGFyZ2V0LT5zYW1wbGVfcmVnKTsKKworCS8qIGNvbW1hbmQgY29udHJvbCAqLworCXBhcmFtLT5jb21tYW5kX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihDTEVBUl9DREJfRklGT19QT0lOVEVSIHwKKwkJCQkJICAgICBBVVRPU0NTSV9TVEFSVCAgICAgICAgIHwKKwkJCQkJICAgICBBVVRPX01TR0lOXzAwX09SXzA0ICAgIHwKKwkJCQkJICAgICBBVVRPX01TR0lOXzAyICAgICAgICAgIHwKKwkJCQkJICAgICBBVVRPX0FUTiAgICAgICAgICAgICAgICk7CisKKworCS8qIHRyYW5zZmVyIGNvbnRyb2wgKi8KKwlzID0gMDsKKwlzd2l0Y2ggKGRhdGEtPnRyYW5zX21ldGhvZCkgeworCWNhc2UgTlNQMzJfVFJBTlNGRVJfQlVTTUFTVEVSOgorCQlzIHw9IEJNX1NUQVJUOworCQlicmVhazsKKwljYXNlIE5TUDMyX1RSQU5TRkVSX01NSU86CisJCXMgfD0gQ0JfTU1JT19NT0RFOworCQlicmVhazsKKwljYXNlIE5TUDMyX1RSQU5TRkVSX1BJTzoKKwkJcyB8PSBDQl9JT19NT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluc3AzMl9tc2coS0VSTl9FUlIsICJ1bmtub3duIHRyYW5zX21ldGhvZCIpOworCQlicmVhazsKKwl9CisJLyoKKwkgKiBPUi1lZCBCTElFTkRfTU9ERSwgRklGTyBpbnRyIGlzIGRlY3JlYXNlZCwgaW5zdGVhZCBvZiBQQ0kgYnVzIHdhaXRzLgorCSAqIEZvciBidXMgbWFzdGVyIHRyYW5zZmVyLCBpdCdzIHRha2VuIG9mZi4KKwkgKi8KKwlzIHw9IChUUkFOU0ZFUl9HTyB8IEFMTF9DT1VOVEVSX0NMUik7CisJcGFyYW0tPnRyYW5zZmVyX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihzKTsKKworCS8qIHNnIHRhYmxlIGFkZHIgKi8KKwlwYXJhbS0+c2d0X3BvaW50ZXIgPSBjcHVfdG9fbGUzMihkYXRhLT5jdXJfbHVudC0+c2dsdW5fcGFkZHIpOworCisJLyoKKwkgKiB0cmFuc2ZlciBwYXJhbWV0ZXIgdG8gQVNJQworCSAqLworCW5zcDMyX3dyaXRlNChiYXNlLCBTR1RfQURSLCAgICAgICAgIGRhdGEtPmF1dG9fcGFkZHIpOworCW5zcDMyX3dyaXRlMihiYXNlLCBDT01NQU5EX0NPTlRST0wsIENMRUFSX0NEQl9GSUZPX1BPSU5URVIgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUT19QQVJBTUVURVIgICAgICAgICApOworCisJLyoKKwkgKiBDaGVjayBhcmJpdHJhdGlvbgorCSAqLworCXJldCA9IG5zcDMyX2FyYml0cmF0aW9uKFNDcG50LCBiYXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFNlbGVjdGlvbiB3aXRoIEFVVE8gU0NTSSAod2l0aG91dCBBVVRPIFBBUkFNRVRFUikKKyAqLworc3RhdGljIGludCBuc3AzMl9zZWxlY3Rpb25fYXV0b3Njc2koc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludAliYXNlICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBpbnQJaG9zdF9pZCA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7CisJdW5zaWduZWQgY2hhcgl0YXJnZXQgID0gU0NwbnQtPmRldmljZS0+aWQ7CisJdW5zaWduZWQgY2hhcglwaGFzZTsKKwlpbnQJCXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAljb21tYW5kCT0gMDsKKwl1bnNpZ25lZCBpbnQJbXNnb3V0ICA9IDA7CisJdW5zaWduZWQgc2hvcnQJZXhlY3BoOworCWludAkJaTsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19BVVRPU0NTSSwgImluIik7CisKKwkvKgorCSAqIElSUSBkaXNhYmxlCisJICovCisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCBJUlFfQ09OVFJPTF9BTExfSVJRX01BU0spOworCisJLyoKKwkgKiBjaGVjayBidXMgbGluZQorCSAqLworCXBoYXNlID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfTU9OSVRPUik7CisJaWYoKChwaGFzZSAmIEJVU01PTl9CU1kpID09IDEpIHx8IChwaGFzZSAmIEJVU01PTl9TRUwpID09IDEpIHsKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgImJ1cyBidXN5Iik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCXN0YXR1cyA9IDE7CisJCWdvdG8gb3V0OworICAgICAgICB9CisKKwkvKgorCSAqIGNsZWFyIGV4ZWNwaAorCSAqLworCWV4ZWNwaCA9IG5zcDMyX3JlYWQyKGJhc2UsIFNDU0lfRVhFQ1VURV9QSEFTRSk7CisKKwkvKgorCSAqIGNsZWFyIEZJRk8gY291bnRlciB0byBzZXQgQ0RCcworCSAqLworCW5zcDMyX3dyaXRlMihiYXNlLCBDT01NQU5EX0NPTlRST0wsIENMRUFSX0NEQl9GSUZPX1BPSU5URVIpOworCisJLyoKKwkgKiBzZXQgQ0RCMCAtIENEQjE1CisJICovCisJZm9yIChpID0gMDsgaSA8IFNDcG50LT5jbWRfbGVuOyBpKyspIHsKKwkJbnNwMzJfd3JpdGUxKGJhc2UsIENPTU1BTkRfREFUQSwgU0NwbnQtPmNtbmRbaV0pOworICAgICAgICB9CisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0NEQl9DT05URU5UUywgIkNEQlswXT1bMHgleF0iLCBTQ3BudC0+Y21uZFswXSk7CisKKwkvKgorCSAqIHNldCBTQ1NJT1VUIExBVENIKGluaXRpYXRvcikvVEFSR0VUKHRhcmdldCkgKE9SLWVkKSBJRAorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTQ1NJX09VVF9MQVRDSF9UQVJHRVRfSUQsIEJJVChob3N0X2lkKSB8IEJJVCh0YXJnZXQpKTsKKworCS8qCisJICogc2V0IFNDU0kgTVNHT1VUIFJFRworCSAqCisJICogTm90ZTogSWYgdGhlIHJhbmdlIG9mIG1zZ291dF9sZW4gaXMgMSAtIDMsIGZpbGwgc2NzaV9tc2dvdXQuCisJICogICAgICAgb3ZlciAzIG1lc3NhZ2VzIG5lZWRzIGFub3RoZXIgcm91dGluZS4KKwkgKi8KKwlpZiAoZGF0YS0+bXNnb3V0X2xlbiA9PSAwKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgIlNDU0kgTXNnT3V0IHdpdGhvdXQgYW55IG1lc3NhZ2UhIik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXN0YXR1cyA9IDE7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZGF0YS0+bXNnb3V0X2xlbiA+IDAgJiYgZGF0YS0+bXNnb3V0X2xlbiA8PSAzKSB7CisJCW1zZ291dCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5tc2dvdXRfbGVuOyBpKyspIHsKKwkJCS8qCisJCQkgKiB0aGUgc2VuZGluZyBvcmRlciBvZiB0aGUgbWVzc2FnZSBpczoKKwkJCSAqICBNQ05UIDM6IE1TRyMwIC0+IE1TRyMxIC0+IE1TRyMyCisJCQkgKiAgTUNOVCAyOiAgICAgICAgICBNU0cjMSAtPiBNU0cjMgorCQkJICogIE1DTlQgMTogICAgICAgICAgICAgICAgICAgTVNHIzIgICAgCisJCQkgKi8KKwkJCW1zZ291dCA+Pj0gODsKKwkJCW1zZ291dCB8PSAoKHVuc2lnbmVkIGludCkoZGF0YS0+bXNnb3V0YnVmW2ldKSA8PCAyNCk7CisJCX0KKwkJbXNnb3V0IHw9IE1WX1ZBTElEOwkvKiBNViB2YWxpZCAqLworCQltc2dvdXQgfD0gKHVuc2lnbmVkIGludClkYXRhLT5tc2dvdXRfbGVuOyAvKiBsZW4gKi8KKwkJbnNwMzJfd3JpdGU0KGJhc2UsIFNDU0lfTVNHX09VVCwgbXNnb3V0KTsKKwl9IGVsc2UgeworCQkvKiBkYXRhLT5tc2dvdXRfbGVuID4gMyAqLworCQluc3AzMl93cml0ZTQoYmFzZSwgU0NTSV9NU0dfT1VULCAwKTsKKwl9CisKKwkvKgorCSAqIHNldCBzZWxlY3Rpb24gdGltZW91dCg9IDI1MG1zKQorCSAqLworCW5zcDMyX3dyaXRlMihiYXNlLCBTRUxfVElNRV9PVVQsICAgU0VMX1RJTUVPVVRfVElNRSk7CisKKwkvKgorCSAqIHNldCBTUkVRIGhhemFyZCBraWxsZXIgc2FtcGxpbmcgcmF0ZQorCSAqIAorCSAqIFRPRE86IHNhbXBsZV9yYXRlIChCQVNFKzBGKSBpcyAwIHdoZW4gaW50ZXJuYWwgY2xvY2sgPSA0ME1Iei4KKwkgKiAgICAgIGNoZWNrIG90aGVyIGludGVybmFsIGNsb2NrIQorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTUkVRX1NNUExfUkFURSwgZGF0YS0+Y3VyX3RhcmdldC0+c2FtcGxlX3JlZyk7CisKKwkvKgorCSAqIGNsZWFyIEFyYml0CisJICovCisJbnNwMzJfd3JpdGUxKGJhc2UsIFNFVF9BUkJJVCwgICAgICBBUkJJVF9DTEVBUik7CisKKwkvKgorCSAqIHNldCBTWU5DUkVHCisJICogRG9uJ3Qgc2V0IEJNX1NUQVJUX0FEUiBiZWZvcmUgc2V0dGluZyB0aGlzIHJlZ2lzdGVyLgorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTWU5DX1JFRywgIGRhdGEtPmN1cl90YXJnZXQtPnN5bmNyZWcpOworCisJLyoKKwkgKiBzZXQgQUNLV0lEVEgKKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgQUNLX1dJRFRILCBkYXRhLT5jdXJfdGFyZ2V0LT5hY2t3aWR0aCk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksCisJCSAgInN5bmNyZWc9MHgleCwgYWNrd2lkdGg9MHgleCwgc2d0cGFkZHI9MHgleCwgaWQ9MHgleCIsCisJCSAgbnNwMzJfcmVhZDEoYmFzZSwgU1lOQ19SRUcpLCBuc3AzMl9yZWFkMShiYXNlLCBBQ0tfV0lEVEgpLAorCQkgIG5zcDMyX3JlYWQ0KGJhc2UsIFNHVF9BRFIpLCBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX09VVF9MQVRDSF9UQVJHRVRfSUQpKTsKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksICJtc2dvdXRfbGVuPSVkLCBtc2dvdXQ9MHgleCIsCisJCSAgZGF0YS0+bXNnb3V0X2xlbiwgbXNnb3V0KTsKKworCS8qCisJICogc2V0IFNHVCBBRERSIChwaHlzaWNhbCBhZGRyZXNzKQorCSAqLworCW5zcDMyX3dyaXRlNChiYXNlLCBTR1RfQURSLCBkYXRhLT5jdXJfbHVudC0+c2dsdW5fcGFkZHIpOworCisJLyoKKwkgKiBzZXQgVFJBTlNGRVIgQ09OVFJPTCBSRUcKKwkgKi8KKwljb21tYW5kID0gMDsKKwljb21tYW5kIHw9IChUUkFOU0ZFUl9HTyB8IEFMTF9DT1VOVEVSX0NMUik7CisJaWYgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX0JVU01BU1RFUikgeworCQlpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA+IDApIHsKKwkJCWNvbW1hbmQgfD0gQk1fU1RBUlQ7CisJCX0KKwl9IGVsc2UgaWYgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX01NSU8pIHsKKwkJY29tbWFuZCB8PSBDQl9NTUlPX01PREU7CisJfSBlbHNlIGlmIChkYXRhLT50cmFuc19tZXRob2QgJiBOU1AzMl9UUkFOU0ZFUl9QSU8pIHsKKwkJY29tbWFuZCB8PSBDQl9JT19NT0RFOworCX0KKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgY29tbWFuZCk7CisKKwkvKgorCSAqIHN0YXJ0IEFVVE8gU0NTSSwga2ljayBvZmYgYXJiaXRyYXRpb24KKwkgKi8KKwljb21tYW5kID0gKENMRUFSX0NEQl9GSUZPX1BPSU5URVIgfAorCQkgICBBVVRPU0NTSV9TVEFSVCAgICAgICAgIHwKKwkJICAgQVVUT19NU0dJTl8wMF9PUl8wNCAgICB8CisJCSAgIEFVVE9fTVNHSU5fMDIgICAgICAgICAgfAorCQkgICBBVVRPX0FUTiAgICAgICAgICAgICAgICApOworCW5zcDMyX3dyaXRlMihiYXNlLCBDT01NQU5EX0NPTlRST0wsIGNvbW1hbmQpOworCisJLyoKKwkgKiBDaGVjayBhcmJpdHJhdGlvbgorCSAqLworCXN0YXR1cyA9IG5zcDMyX2FyYml0cmF0aW9uKFNDcG50LCBiYXNlKTsKKworIG91dDoKKwkvKgorCSAqIElSUSBlbmFibGUKKwkgKi8KKwluc3AzMl93cml0ZTIoYmFzZSwgSVJRX0NPTlRST0wsIDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogQXJiaXRyYXRpb24gU3RhdHVzIENoZWNrCisgKgkKKyAqIE5vdGU6IEFyYml0cmF0aW9uIGNvdW50ZXIgaXMgd2FpdGVkIGR1cmluZyBBUkJJVF9HTyBpcyBub3QgbGlmdGluZy4KKyAqCSBVc2luZyB1ZGVsYXkoMSkgY29uc3VtZXMgQ1BVIHRpbWUgYW5kIHN5c3RlbSB0aW1lLCBidXQgCisgKgkgYXJiaXRyYXRpb24gZGVsYXkgdGltZSBpcyBkZWZpbmVkIG1pbmltYWwgMi40dXMgaW4gU0NTSQorICoJIHNwZWNpZmljYXRpb24sIHRodXMgdWRlbGF5IHdvcmtzIGFzIGNvYXJzZSBncmFpbmVkIHdhaXQgdGltZXIuCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfYXJiaXRyYXRpb24oc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCBiYXNlKQoreworCXVuc2lnbmVkIGNoYXIgYXJiaXQ7CisJaW50CSAgICAgIHN0YXR1cyA9IFRSVUU7CisJaW50CSAgICAgIHRpbWUgICA9IDA7CisKKwlkbyB7CisJCWFyYml0ID0gbnNwMzJfcmVhZDEoYmFzZSwgQVJCSVRfU1RBVFVTKTsKKwkJdGltZSsrOworCX0gd2hpbGUgKChhcmJpdCAmIChBUkJJVF9XSU4gfCBBUkJJVF9GQUlMKSkgPT0gMCAmJgorCQkgKHRpbWUgPD0gQVJCSVRfVElNRU9VVF9USU1FKSk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksCisJCSAgImFyYml0OiAweCV4LCBkZWxheSB0aW1lOiAlZCIsIGFyYml0LCB0aW1lKTsKKworCWlmIChhcmJpdCAmIEFSQklUX1dJTikgeworCQkvKiBBcmJpdHJhdGlvbiBzdWNjZWVkZWQgKi8KKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIEVYVF9QT1JULCBMRURfT04pOyAvKiBQQ0kgTEVEIG9uICovCisJfSBlbHNlIGlmIChhcmJpdCAmIEFSQklUX0ZBSUwpIHsKKwkJLyogQXJiaXRyYXRpb24gZmFpbGVkICovCisJCVNDcG50LT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCXN0YXR1cyA9IEZBTFNFOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHVua25vd24gZXJyb3Igb3IgQVJCSVRfR08gdGltZW91dCwKKwkJICogc29tZXRoaW5nIGxvY2sgdXAhIGd1ZXNzIG5vIGNvbm5lY3Rpb24uCisJCSAqLworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQVVUT1NDU0ksICJhcmJpdCB0aW1lb3V0Iik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJc3RhdHVzID0gRkFMU0U7CisgICAgICAgIH0KKworCS8qCisJICogY2xlYXIgQXJiaXQKKwkgKi8KKwluc3AzMl93cml0ZTEoYmFzZSwgU0VUX0FSQklULCBBUkJJVF9DTEVBUik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiByZXNlbGVjdGlvbgorICoKKyAqIE5vdGU6IFRoaXMgcmVzZWxlY3Rpb24gcm91dGluZSBpcyBjYWxsZWQgZnJvbSBtc2dpbl9vY2N1ciwKKyAqCSByZXNlbGVjdGlvbiB0YXJnZXQgaWQmbHVuIG11c3QgYmUgYWxyZWFkeSBzZXQuCisgKgkgU0NTSS0yIHNheXMgSURFTlRJRlkgaW1wbGllcyBSRVNUT1JFX1BPSU5URVIgb3BlcmF0aW9uLgorICovCitzdGF0aWMgaW50IG5zcDMyX3Jlc2VsZWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBjaGFyIG5ld2x1bikKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgICBob3N0X2lkID0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZDsKKwl1bnNpZ25lZCBpbnQgICBiYXNlICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBjaGFyICB0bXBpZCwgbmV3aWQ7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUkVTRUxFQ1RJT04sICJlbnRlciIpOworCisJLyoKKwkgKiBjYWxjdWxhdGUgcmVzZWxlY3RlZCBTQ1NJIElECisJICovCisJdG1waWQgPSBuc3AzMl9yZWFkMShiYXNlLCBSRVNFTEVDVF9JRCk7CisJdG1waWQgJj0gKH5CSVQoaG9zdF9pZCkpOworCW5ld2lkID0gMDsKKwl3aGlsZSAodG1waWQpIHsKKwkJaWYgKHRtcGlkICYgMSkgeworCQkJYnJlYWs7CisJCX0KKwkJdG1waWQgPj49IDE7CisJCW5ld2lkKys7CisJfQorCisJLyoKKwkgKiBJZiByZXNlbGVjdGVkIE5ldyBJRDpMVU4gaXMgbm90IGV4aXN0ZWQKKwkgKiBvciBjdXJyZW50IG5leHVzIGlzIG5vdCBleGlzdGVkLCB1bmV4cGVjdGVkCisJICogcmVzZWxlY3Rpb24gaXMgb2NjdXJyZWQuIFNlbmQgcmVqZWN0IG1lc3NhZ2UuCisJICovCisJaWYgKG5ld2lkID49IEFSUkFZX1NJWkUoZGF0YS0+bHVudCkgfHwgbmV3bHVuID49IEFSUkFZX1NJWkUoZGF0YS0+bHVudFswXSkpIHsKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgInVua25vd24gaWQvbHVuIik7CisJCXJldHVybiBGQUxTRTsKKwl9IGVsc2UgaWYoZGF0YS0+bHVudFtuZXdpZF1bbmV3bHVuXS5TQ3BudCA9PSBOVUxMKSB7CisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJubyBTQ1NJIGNvbW1hbmQgaXMgcHJvY2Vzc2luZyIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZGF0YS0+Y3VyX2lkICAgID0gbmV3aWQ7CisJZGF0YS0+Y3VyX2x1biAgID0gbmV3bHVuOworCWRhdGEtPmN1cl90YXJnZXQgPSAmKGRhdGEtPnRhcmdldFtuZXdpZF0pOworCWRhdGEtPmN1cl9sdW50ICAgPSAmKGRhdGEtPmx1bnRbbmV3aWRdW25ld2x1bl0pOworCisJLyogcmVzZXQgU0FDSy9TYXZlZEFDSyBjb3VudGVyIChvciBBTEwgY2xlYXI/KSAqLworCW5zcDMyX3dyaXRlNChiYXNlLCBDTFJfQ09VTlRFUiwgQ0xSQ09VTlRFUl9BTExNQVNLKTsKKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBuc3AzMl9zZXR1cF9zZ190YWJsZSAtIGJ1aWxkIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgZm9yIHRyYW5zZmVyIGRhdGEKKyAqCQkJICAgIHdpdGggYnVzIG1hc3Rlci4KKyAqCisgKiBOb3RlOiBOaW5qYVNDU0ktMzJCaS9VREUgYnVzIG1hc3RlciBjYW4gbm90IHRyYW5zZmVyIG92ZXIgNjRLQiBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfc2V0dXBfc2dfdGFibGUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICAgKnNnbDsKKwluc3AzMl9zZ3RhYmxlICpzZ3QgPSBkYXRhLT5jdXJfbHVudC0+c2dsdW4tPnNndDsKKwlpbnQgbnVtLCBpOworCXUzMl9sZSBsOworCisJaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPT0gMCkgeworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlpZiAoc2d0ID09IE5VTEwpIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1NHTElTVCwgIlNHVCA9PSBudWxsIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlzZ2wgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQludW0gPSBwY2lfbWFwX3NnKGRhdGEtPlBjaSwgc2dsLCBTQ3BudC0+dXNlX3NnLAorCQkJCSBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJCS8qCisJCQkgKiBCdWlsZCBuc3AzMl9zZ2xpc3QsIHN1YnN0aXR1dGUgc2cgZG1hIGFkZHJlc3Nlcy4KKwkJCSAqLworCQkJc2d0W2ldLmFkZHIgPSBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZ2wpKTsKKwkJCXNndFtpXS5sZW4gID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZ2wpKTsKKwkJCXNnbCsrOworCisJCQlpZiAobGUzMl90b19jcHUoc2d0W2ldLmxlbikgPiAweDEwMDAwKSB7CisJCQkJbnNwMzJfbXNnKEtFUk5fRVJSLAorCQkJCQkiY2FuJ3QgdHJhbnNmZXIgb3ZlciA2NEtCIGF0IGEgdGltZSwgc2l6ZT0weCVseCIsIGxlMzJfdG9fY3B1KHNndFtpXS5sZW4pKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfU0dMSVNULAorCQkJCSAgIm51bSAweCV4IDogYWRkciAweCVseCBsZW4gMHglbHgiLAorCQkJCSAgaSwKKwkJCQkgIGxlMzJfdG9fY3B1KHNndFtpXS5hZGRyKSwKKwkJCQkgIGxlMzJfdG9fY3B1KHNndFtpXS5sZW4gKSk7CisJCX0KKworCQkvKiBzZXQgZW5kIG1hcmsgKi8KKwkJbCA9IGxlMzJfdG9fY3B1KHNndFtudW0tMV0ubGVuKTsKKwkJc2d0W251bS0xXS5sZW4gPSBjcHVfdG9fbGUzMihsIHwgU0dURU5EKTsKKworCX0gZWxzZSB7CisJCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luCT0gcGNpX21hcF9zaW5nbGUoZGF0YS0+UGNpLAorCQkJU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLAorCQkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlzZ3RbMF0uYWRkciA9IGNwdV90b19sZTMyKFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luKTsKKwkJc2d0WzBdLmxlbiAgPSBjcHVfdG9fbGUzMihTQ3BudC0+cmVxdWVzdF9idWZmbGVuIHwgU0dURU5EKTsgLyogc2V0IGVuZCBtYXJrICovCisKKwkJaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPiAweDEwMDAwKSB7CisJCQluc3AzMl9tc2coS0VSTl9FUlIsCisJCQkJICAiY2FuJ3QgdHJhbnNmZXIgb3ZlciA2NEtCIGF0IGEgdGltZSwgc2l6ZT0weCVseCIsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19TR0xJU1QsICJzaW5nbGUgOiBhZGRyIDB4JWx4IGxlbj0weCVseCIsCisJCQkgIGxlMzJfdG9fY3B1KHNndFswXS5hZGRyKSwKKwkJCSAgbGUzMl90b19jcHUoc2d0WzBdLmxlbiApKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBuc3AzMl9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCW5zcDMyX3RhcmdldCAqdGFyZ2V0OworCW5zcDMyX2x1bnQgICAqY3VyX2x1bnQ7CisJaW50IHJldDsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQsCisJCSAgImVudGVyLiB0YXJnZXQ6IDB4JXggTFVOOiAweCV4IGNtbmQ6IDB4JXggY21uZGxlbjogMHgleCAiCisJCSAgInVzZV9zZzogMHgleCByZXFidWY6IDB4JWx4IHJlcWxlbjogMHgleCIsCisJCSAgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPmNtbmRbMF0sIFNDcG50LT5jbWRfbGVuLAorCQkgIFNDcG50LT51c2Vfc2csIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwlpZiAoZGF0YS0+Q3VycmVudFNDICE9IE5VTEwpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiQ3VycmVudHNjICE9IE5VTEwuIENhbmNlbCB0aGlzIGNvbW1hbmQgcmVxdWVzdCIpOworCQlkYXRhLT5DdXJyZW50U0MgPSBOVUxMOworCQlTQ3BudC0+cmVzdWx0ICAgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCS8qIGNoZWNrIHRhcmdldCBJRCBpcyBub3Qgc2FtZSBhcyB0aGlzIGluaXRpYXRvciBJRCAqLworCWlmIChTQ3BudC0+ZGV2aWNlLT5pZCA9PSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT50aGlzX2lkKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQsICJ0ZXJnZXQ9PWhvc3Q/Pz8iKTsKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQlkb25lKFNDcG50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2hlY2sgdGFyZ2V0IExVTiBpcyBhbGxvd2FibGUgdmFsdWUgKi8KKwlpZiAoU0NwbnQtPmRldmljZS0+bHVuID49IE1BWF9MVU4pIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1FVRVVFQ09NTUFORCwgIm5vIG1vcmUgbHVuIik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCXNob3dfY29tbWFuZChTQ3BudCk7CisKKwlTQ3BudC0+c2NzaV9kb25lICAgICA9IGRvbmU7CisJZGF0YS0+Q3VycmVudFNDICAgICAgPSBTQ3BudDsKKwlTQ3BudC0+U0NwLlN0YXR1cyAgICA9IENIRUNLX0NPTkRJVElPTjsKKwlTQ3BudC0+U0NwLk1lc3NhZ2UgICA9IDA7CisJU0NwbnQtPnJlc2lkICAgICAgICAgPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCisJU0NwbnQtPlNDcC5wdHIJCSAgICA9IChjaGFyICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCVNDcG50LT5TQ3AuYnVmZmVyCSAgICA9IE5VTEw7CisJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKworCS8qIGluaXRpYWxpemUgZGF0YSAqLworCWRhdGEtPm1zZ291dF9sZW4JPSAwOworCWRhdGEtPm1zZ2luX2xlbgkJPSAwOworCWN1cl9sdW50CQk9ICYoZGF0YS0+bHVudFtTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+bHVuXSk7CisJY3VyX2x1bnQtPlNDcG50CQk9IFNDcG50OworCWN1cl9sdW50LT5zYXZlX2RhdHAJPSAwOworCWN1cl9sdW50LT5tc2dpbjAzCT0gRkFMU0U7CisJZGF0YS0+Y3VyX2x1bnQJCT0gY3VyX2x1bnQ7CisJZGF0YS0+Y3VyX2lkCQk9IFNDcG50LT5kZXZpY2UtPmlkOworCWRhdGEtPmN1cl9sdW4JCT0gU0NwbnQtPmRldmljZS0+bHVuOworCisJcmV0ID0gbnNwMzJfc2V0dXBfc2dfdGFibGUoU0NwbnQpOworCWlmIChyZXQgPT0gRkFMU0UpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiU0dUIGZhaWwiKTsKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJbnNwMzJfc2NzaV9kb25lKFNDcG50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQnVpbGQgSURFTlRJRlkgKi8KKwluc3AzMl9idWlsZF9pZGVudGlmeShTQ3BudCk7CisKKwkvKiAKKwkgKiBJZiB0YXJnZXQgaXMgdGhlIGZpcnN0IHRpbWUgdG8gdHJhbnNmZXIgYWZ0ZXIgdGhlIHJlc2V0CisJICogKHRhcmdldCBkb24ndCBoYXZlIFNEVFJfRE9ORSBhbmQgU0RUUl9JTklUSUFUT1IpLCBzeW5jCisJICogbWVzc2FnZSBTRFRSIGlzIG5lZWRlZCB0byBkbyBzeW5jaHJvbm91cyB0cmFuc2Zlci4KKwkgKi8KKwl0YXJnZXQgPSAmZGF0YS0+dGFyZ2V0W1NDcG50LT5kZXZpY2UtPmlkXTsKKwlkYXRhLT5jdXJfdGFyZ2V0ID0gdGFyZ2V0OworCisJaWYgKCEodGFyZ2V0LT5zeW5jX2ZsYWcgJiAoU0RUUl9ET05FIHwgU0RUUl9JTklUSUFUT1IgfCBTRFRSX1RBUkdFVCkpKSB7CisJCXVuc2lnbmVkIGNoYXIgcGVyaW9kLCBvZmZzZXQ7CisKKwkJaWYgKHRyYW5zX21vZGUgIT0gQVNZTkNfTU9ERSkgeworCQkJbnNwMzJfc2V0X21heF9zeW5jKGRhdGEsIHRhcmdldCwgJnBlcmlvZCwgJm9mZnNldCk7CisJCQluc3AzMl9idWlsZF9zZHRyKFNDcG50LCBwZXJpb2QsIG9mZnNldCk7CisJCQl0YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0lOSVRJQVRPUjsKKwkJfSBlbHNlIHsKKwkJCW5zcDMyX3NldF9hc3luYyhkYXRhLCB0YXJnZXQpOworCQkJdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9ET05FOworCQl9CisKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1FVRVVFQ09NTUFORCwKKwkJCSAgIlNEVFI6IGVudHJ5OiAlZCBzdGFydF9wZXJpb2Q6IDB4JXggb2Zmc2V0OiAweCV4XG4iLAorCQkJICB0YXJnZXQtPmxpbWl0X2VudHJ5LCBwZXJpb2QsIG9mZnNldCk7CisJfSBlbHNlIGlmICh0YXJnZXQtPnN5bmNfZmxhZyAmIFNEVFJfSU5JVElBVE9SKSB7CisJCS8qCisJCSAqIEl0IHdhcyBuZWdvdGlhdGluZyBTRFRSIHdpdGggdGFyZ2V0LCBzZW5kaW5nIGZyb20gdGhlCisJCSAqIGluaXRpYXRvciwgYnV0IHRoZXJlIGFyZSBubyBjaGFuY2UgdG8gcmVtb3ZlIHRoaXMgZmxhZy4KKwkJICogU2V0IGFzeW5jIGJlY2F1c2Ugd2UgZG9uJ3QgZ2V0IHByb3BlciBuZWdvdGlhdGlvbi4KKwkJICovCisJCW5zcDMyX3NldF9hc3luYyhkYXRhLCB0YXJnZXQpOworCQl0YXJnZXQtPnN5bmNfZmxhZyAmPSB+U0RUUl9JTklUSUFUT1I7CisJCXRhcmdldC0+c3luY19mbGFnIHw9IFNEVFJfRE9ORTsKKworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfUVVFVUVDT01NQU5ELAorCQkJICAiU0RUUl9JTklUSUFUT1I6IGZhbGwgYmFjayB0byBhc3luYyIpOworCX0gZWxzZSBpZiAodGFyZ2V0LT5zeW5jX2ZsYWcgJiBTRFRSX1RBUkdFVCkgeworCQkvKgorCQkgKiBJdCB3YXMgbmVnb3RpYXRpbmcgU0RUUiB3aXRoIHRhcmdldCwgc2VuZGluZyBmcm9tIHRhcmdldCwKKwkJICogYnV0IHRoZXJlIGFyZSBubyBjaGFuY2UgdG8gcmVtb3ZlIHRoaXMgZmxhZy4gIFNldCBhc3luYworCQkgKiBiZWNhdXNlIHdlIGRvbid0IGdldCBwcm9wZXIgbmVnb3RpYXRpb24uCisJCSAqLworCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgdGFyZ2V0KTsKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgJj0gflNEVFJfVEFSR0VUOworCQl0YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0RPTkU7CisKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1FVRVVFQ09NTUFORCwKKwkJCSAgIlVua25vd24gU0RUUiBmcm9tIHRhcmdldCBpcyByZWFjaGVkLCBmYWxsIGJhY2sgdG8gYXN5bmMuIik7CisJfQorCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1RBUkdFVEZMQUcsCisJCSAgInRhcmdldDogJWQgc3luY19mbGFnOiAweCV4IHN5bmNyZWc6IDB4JXggYWNrd2lkdGg6IDB4JXgiLAorCQkgIFNDcG50LT5kZXZpY2UtPmlkLCB0YXJnZXQtPnN5bmNfZmxhZywgdGFyZ2V0LT5zeW5jcmVnLAorCQkgIHRhcmdldC0+YWNrd2lkdGgpOworCisJLyogU2VsZWN0aW9uICovCisJaWYgKGF1dG9fcGFyYW0gPT0gMCkgeworCQlyZXQgPSBuc3AzMl9zZWxlY3Rpb25fYXV0b3BhcmEoU0NwbnQpOworCX0gZWxzZSB7CisJCXJldCA9IG5zcDMyX3NlbGVjdGlvbl9hdXRvc2NzaShTQ3BudCk7CisJfQorCisJaWYgKHJldCAhPSBUUlVFKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19RVUVVRUNPTU1BTkQsICJzZWxlY3Rpb24gZmFpbCIpOworCQluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBpbml0aWFsaXplIGFzaWMgKi8KK3N0YXRpYyBpbnQgbnNwMzJod19pbml0KG5zcDMyX2h3X2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50ICAgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCXVuc2lnbmVkIHNob3J0IGlycV9zdGF0OworCXVuc2lnbmVkIGxvbmcgIGxjX3JlZzsKKwl1bnNpZ25lZCBjaGFyICBwb3dlcjsKKworCWxjX3JlZyA9IG5zcDMyX2luZGV4X3JlYWQ0KGJhc2UsIENGR19MQVRFX0NBQ0hFKTsKKwlpZiAoKGxjX3JlZyAmIDB4ZmYwMCkgPT0gMCkgeworCQlsY19yZWcgfD0gKDB4MjAgPDwgOCk7CisJCW5zcDMyX2luZGV4X3dyaXRlMihiYXNlLCBDRkdfTEFURV9DQUNIRSwgbGNfcmVnICYgMHhmZmZmKTsKKwl9CisKKwluc3AzMl93cml0ZTIoYmFzZSwgSVJRX0NPTlRST0wsICAgICAgICBJUlFfQ09OVFJPTF9BTExfSVJRX01BU0spOworCW5zcDMyX3dyaXRlMihiYXNlLCBUUkFOU0ZFUl9DT05UUk9MLCAgIDApOworCW5zcDMyX3dyaXRlNChiYXNlLCBCTV9DTlQsICAgICAgICAgICAgIDApOworCW5zcDMyX3dyaXRlMihiYXNlLCBTQ1NJX0VYRUNVVEVfUEhBU0UsIDApOworCisJZG8geworCQlpcnFfc3RhdCA9IG5zcDMyX3JlYWQyKGJhc2UsIElSUV9TVEFUVVMpOworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5JVCwgImlycV9zdGF0IDB4JXgiLCBpcnFfc3RhdCk7CisJfSB3aGlsZSAoaXJxX3N0YXQgJiBJUlFTVEFUVVNfQU5ZX0lSUSk7CisKKwkvKgorCSAqIEZpbGwgRklGT19GVUxMX1NITEQsIEZJRk9fRU1QVFlfU0hMRC4gQmVsb3cgcGFyYW1ldGVyIGlzCisJICogIGRlc2lnbmF0ZWQgYnkgc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlpZiAoKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX1BJTykgfHwKKwkgICAgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX01NSU8pKSB7CisJCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBGSUZPX0ZVTExfU0hMRF9DT1VOVCwgIDB4NDApOworCQluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgRklGT19FTVBUWV9TSExEX0NPVU5ULCAweDQwKTsKKwl9IGVsc2UgaWYgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX0JVU01BU1RFUikgeworCQluc3AzMl9pbmRleF93cml0ZTEoYmFzZSwgRklGT19GVUxMX1NITERfQ09VTlQsICAweDEwKTsKKwkJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIEZJRk9fRU1QVFlfU0hMRF9DT1VOVCwgMHg2MCk7CisJfSBlbHNlIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOSVQsICJ1bmtub3duIHRyYW5zZmVyIG1vZGUiKTsKKwl9CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5JVCwgImZ1bGwgMHgleCBlbXAgMHgleCIsCisJCSAgbnNwMzJfaW5kZXhfcmVhZDEoYmFzZSwgRklGT19GVUxMX1NITERfQ09VTlQpLAorCQkgIG5zcDMyX2luZGV4X3JlYWQxKGJhc2UsIEZJRk9fRU1QVFlfU0hMRF9DT1VOVCkpOworCisJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIENMT0NLX0RJViwgZGF0YS0+Y2xvY2spOworCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBCTV9DWUNMRSwgIE1FTVJEX0NNRDEgfCBTR1RfQVVUT19QQVJBX01FTUVEX0NNRCk7CisJbnNwMzJfd3JpdGUxKGJhc2UsIFBBUklUWV9DT05UUk9MLCAwKTsJLyogcGFyaXR5IGNoZWNrIGlzIGRpc2FibGUgKi8KKworCS8qCisJICogaW5pdGlhbGl6ZSBNSVNDX1dSUkQgcmVnaXN0ZXIKKwkgKiAKKwkgKiBOb3RlOiBEZXNpZ25hdGVkIHBhcmFtZXRlcnMgaXMgb2JleWVkIGFzIGZvbGxvd2luZzoKKwkgKglNSVNDX1NDU0lfRElSRUNUSU9OX0RFVEVDVE9SX1NFTEVDVDogSXQgbXVzdCBiZSBzZXQuCisJICoJTUlTQ19NQVNURVJfVEVSTUlOQVRJT05fU0VMRUNUOiAgICAgIEl0IG11c3QgYmUgc2V0LgorCSAqCU1JU0NfQk1SRVFfTkVHQVRFX1RJTUlOR19TRUw6CSAgICAgSXQgc2hvdWxkIGJlIHNldC4KKwkgKglNSVNDX0FVVE9TRUxfVElNSU5HX1NFTDoJICAgICBJdCBzaG91bGQgYmUgc2V0LgorCSAqCU1JU0NfQk1TVE9QX0NIQU5HRTJfTk9OREFUQV9QSEFTRTogICBJdCBzaG91bGQgYmUgc2V0LgorCSAqCU1JU0NfREVMQVlFRF9CTVNUQVJUOgkJICAgICBJdCdzIHNlbGVjdGVkIGZvciBzYWZldHkuCisJICoKKwkgKiBOb3RlOiBJZiBNSVNDX0JNU1RPUF9DSEFOR0UyX05PTkRBVEFfUEhBU0UgaXMgc2V0LCB0aGVuCisJICoJd2UgaGF2ZSB0byBzZXQgVFJBTlNGRVJDT05UUk9MX0JNX1NUQVJUIGFzIDAgYW5kIHNldAorCSAqCWFwcHJvcHJpYXRlIHZhbHVlIGJlZm9yZSByZXN0YXJ0aW5nIGJ1cyBtYXN0ZXIgdHJhbnNmZXIuCisJICovCisJbnNwMzJfaW5kZXhfd3JpdGUyKGJhc2UsIE1JU0NfV1IsCisJCQkgICAoU0NTSV9ESVJFQ1RJT05fREVURUNUT1JfU0VMRUNUIHwKKwkJCSAgICBERUxBWUVEX0JNU1RBUlQgICAgICAgICAgICAgICAgfAorCQkJICAgIE1BU1RFUl9URVJNSU5BVElPTl9TRUxFQ1QgICAgICB8CisJCQkgICAgQk1SRVFfTkVHQVRFX1RJTUlOR19TRUwgICAgICAgIHwKKwkJCSAgICBBVVRPU0VMX1RJTUlOR19TRUwgICAgICAgICAgICAgfAorCQkJICAgIEJNU1RPUF9DSEFOR0UyX05PTkRBVEFfUEhBU0UpKTsKKworCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBURVJNX1BXUl9DT05UUk9MLCAwKTsKKwlwb3dlciA9IG5zcDMyX2luZGV4X3JlYWQxKGJhc2UsIFRFUk1fUFdSX0NPTlRST0wpOworCWlmICghKHBvd2VyICYgU0VOU0UpKSB7CisJCW5zcDMyX21zZyhLRVJOX0lORk8sICJ0ZXJtIHBvd2VyIG9uIik7CisJCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBURVJNX1BXUl9DT05UUk9MLCBCUFdSKTsKKwl9CisKKwluc3AzMl93cml0ZTIoYmFzZSwgVElNRVJfU0VULCBUSU1FUl9TVE9QKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgVElNRVJfU0VULCBUSU1FUl9TVE9QKTsgLyogUmVxdWlyZWQgMiB0aW1lcyAqLworCisJbnNwMzJfd3JpdGUxKGJhc2UsIFNZTkNfUkVHLCAgICAgMCk7CisJbnNwMzJfd3JpdGUxKGJhc2UsIEFDS19XSURUSCwgICAgMCk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIFNFTF9USU1FX09VVCwgU0VMX1RJTUVPVVRfVElNRSk7CisKKwkvKgorCSAqIGVuYWJsZSB0byBzZWxlY3QgZGVzaWduYXRlZCBJUlEgKGV4Y2VwdCBmb3IKKwkgKiBJUlFTRUxFQ1RfU0VSUiwgSVJRU0VMRUNUX1BFUlIsIElSUVNFTEVDVF9CTUNOVEVSUikKKwkgKi8KKwluc3AzMl9pbmRleF93cml0ZTIoYmFzZSwgSVJRX1NFTEVDVCwgSVJRU0VMRUNUX1RJTUVSX0lSUSAgICAgICAgIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgIElSUVNFTEVDVF9TQ1NJUkVTRVRfSVJRICAgICB8CisJCQkgICAgICAgICAgICAgICAgICAgICBJUlFTRUxFQ1RfRklGT19TSExEX0lSUSAgICAgfAorCQkJICAgICAgICAgICAgICAgICAgICAgSVJRU0VMRUNUX1JFU0VMRUNUX0lSUSAgICAgIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgIElSUVNFTEVDVF9QSEFTRV9DSEFOR0VfSVJRICB8CisJCQkgICAgICAgICAgICAgICAgICAgICBJUlFTRUxFQ1RfQVVUT19TQ1NJX1NFUV9JUlEgfAorCQkJICAgICAgICAgICAgICAgICAgLy8gICBJUlFTRUxFQ1RfQk1DTlRFUlJfSVJRICAgICAgfAorCQkJICAgICAgICAgICAgICAgICAgICAgSVJRU0VMRUNUX1RBUkdFVF9BQk9SVF9JUlEgIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgIElSUVNFTEVDVF9NQVNURVJfQUJPUlRfSVJRICk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCAwKTsKKworCS8qIFBDSSBMRUQgb2ZmICovCisJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIEVYVF9QT1JUX0REUiwgTEVEX09GRik7CisJbnNwMzJfaW5kZXhfd3JpdGUxKGJhc2UsIEVYVF9QT1JULCAgICAgTEVEX09GRik7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKiBpbnRlcnJ1cHQgcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IGRvX25zcDMyX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IGJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCA9IGRhdGEtPkN1cnJlbnRTQzsKKwl1bnNpZ25lZCBzaG9ydCBhdXRvX3N0YXQsIGlycV9zdGF0LCB0cmFuc19zdGF0OworCXVuc2lnbmVkIGNoYXIgYnVzbW9uLCBidXNwaGFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJaW50IGhhbmRsZWQgPSAwOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGF0YS0+SG9zdDsKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyNlbHNlCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvX3JlcXVlc3RfbG9jaywgZmxhZ3MpOworI2VuZGlmCisKKwkvKgorCSAqIElSUSBjaGVjaywgdGhlbiBlbmFibGUgSVJRIG1hc2sKKwkgKi8KKwlpcnFfc3RhdCA9IG5zcDMyX3JlYWQyKGJhc2UsIElSUV9TVEFUVVMpOworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAKKwkJICAiZW50ZXIgSVJROiAlZCwgSVJRc3RhdHVzOiAweCV4IiwgaXJxLCBpcnFfc3RhdCk7CisJLyogaXMgdGhpcyBpbnRlcnJ1cHQgY29tZXMgZnJvbSBOaW5qYSBhc2ljPyAqLworCWlmICgoaXJxX3N0YXQgJiBJUlFTVEFUVVNfQU5ZX0lSUSkgPT0gMCkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgInNoYXJlZCBpbnRlcnJ1cHQ6IGlycSBvdGhlciAweCV4IiwgaXJxX3N0YXQpOworCQlnb3RvIG91dDI7CisJfQorCWhhbmRsZWQgPSAxOworCW5zcDMyX3dyaXRlMihiYXNlLCBJUlFfQ09OVFJPTCwgSVJRX0NPTlRST0xfQUxMX0lSUV9NQVNLKTsKKworCWJ1c21vbiA9IG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX01PTklUT1IpOworCWJ1c3BoYXNlID0gYnVzbW9uICYgQlVTTU9OX1BIQVNFX01BU0s7CisKKwl0cmFuc19zdGF0ID0gbnNwMzJfcmVhZDIoYmFzZSwgVFJBTlNGRVJfU1RBVFVTKTsKKwlpZiAoKGlycV9zdGF0ID09IDB4ZmZmZikgJiYgKHRyYW5zX3N0YXQgPT0gMHhmZmZmKSkgeworCQluc3AzMl9tc2coS0VSTl9JTkZPLCAiY2FyZCBkaXNjb25uZWN0Iik7CisJCWlmIChkYXRhLT5DdXJyZW50U0MgIT0gTlVMTCkgeworCQkJbnNwMzJfbXNnKEtFUk5fSU5GTywgImNsZWFuIHVwIGN1cnJlbnQgU0NTSSBjb21tYW5kIik7CisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCQluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRpbWVyIElSUSAqLworCWlmIChpcnFfc3RhdCAmIElSUVNUQVRVU19USU1FUl9JUlEpIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJ0aW1lciBzdG9wIik7CisJCW5zcDMyX3dyaXRlMihiYXNlLCBUSU1FUl9TRVQsIFRJTUVSX1NUT1ApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTQ1NJIHJlc2V0ICovCisJaWYgKGlycV9zdGF0ICYgSVJRU1RBVFVTX1NDU0lSRVNFVF9JUlEpIHsKKwkJbnNwMzJfbXNnKEtFUk5fSU5GTywgImRldGVjdGVkIHNvbWVvbmUgZG8gYnVzIHJlc2V0Iik7CisJCW5zcDMyX2RvX2J1c19yZXNldChkYXRhKTsKKwkJaWYgKFNDcG50ICE9IE5VTEwpIHsKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCQluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWlmIChTQ3BudCA9PSBOVUxMKSB7CisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJTQ3BudD09TlVMTCB0aGlzIGNhbid0IGJlIGhhcHBlbmVkIik7CisJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsICJpcnFfc3RhdD0weCV4IHRyYW5zX3N0YXQ9MHgleCIsIGlycV9zdGF0LCB0cmFuc19zdGF0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBdXRvU0NTSSBJbnRlcnJ1cHQuCisJICogTm90ZTogVGhpcyBpbnRlcnJ1cHQgaXMgb2NjdXJyZWQgd2hlbiBBdXRvU0NTSSBpcyBmaW5pc2hlZC4gIFRoZW4KKwkgKiBjaGVjayBTQ1NJRVhFQ1VURVBIQVNFLCBhbmQgZG8gYXBwcm9wcmlhdGUgYWN0aW9uLiAgRWFjaCBwaGFzZXMgYXJlCisJICogcmVjb3JkZWQgd2hlbiBBdXRvU0NTSSBzZXF1ZW5jZXIgaGFzIGJlZW4gcHJvY2Vzc2VkLgorCSAqLworCWlmKGlycV9zdGF0ICYgSVJRU1RBVFVTX0FVVE9TQ1NJX0lSUSkgeworCQkvKiBnZXR0aW5nIFNDU0kgZXhlY3V0ZWQgcGhhc2UgKi8KKwkJYXV0b19zdGF0ID0gbnNwMzJfcmVhZDIoYmFzZSwgU0NTSV9FWEVDVVRFX1BIQVNFKTsKKwkJbnNwMzJfd3JpdGUyKGJhc2UsIFNDU0lfRVhFQ1VURV9QSEFTRSwgMCk7CisKKwkJLyogU2VsZWN0aW9uIFRpbWVvdXQsIGdvIGJ1c2ZyZWUgcGhhc2UuICovCisJCWlmIChhdXRvX3N0YXQgJiBTRUxFQ1RJT05fVElNRU9VVCkgeworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsCisJCQkJICAic2VsZWN0aW9uIHRpbWVvdXQgb2NjdXJyZWQiKTsKKworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9USU1FX09VVCA8PCAxNjsKKwkJCW5zcDMyX3Njc2lfZG9uZShTQ3BudCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChhdXRvX3N0YXQgJiBNU0dPVVRfUEhBU0UpIHsKKwkJCS8qCisJCQkgKiBNc2dPdXQgcGhhc2Ugd2FzIHByb2Nlc3NlZC4KKwkJCSAqIElmIE1TR19JTl9PQ0NVRVIgaXMgbm90IHNldCwgdGhlbiBNc2dPdXQgcGhhc2UgaXMKKwkJCSAqIGNvbXBsZXRlZC4gVGh1cywgbXNnb3V0X2xlbiBtdXN0IHJlc2V0LiAgT3RoZXJ3aXNlLAorCQkJICogbm90aGluZyB0byBkbyBoZXJlLiBJZiBNU0dfT1VUX09DQ1VFUiBpcyBvY2N1cnJlZCwKKwkJCSAqIHRoZW4gd2Ugd2lsbCBlbmNvdW50ZXIgdGhlIGNvbmRpdGlvbiBhbmQgY2hlY2suCisJCQkgKi8KKwkJCWlmICghKGF1dG9fc3RhdCAmIE1TR19JTl9PQ0NVRVIpICYmCisJCQkgICAgIChkYXRhLT5tc2dvdXRfbGVuIDw9IDMpKSB7CisJCQkJLyoKKwkJCQkgKiAhTVNHX0lOX09DQ1VFUiAmJiBtc2dvdXRfbGVuIDw9MworCQkJCSAqICAgLS0tPiBBdXRvU0NTSSB3aXRoIE1TR09VVHJlZyBpcyBwcm9jZXNzZWQuCisJCQkJICovCisJCQkJZGF0YS0+bXNnb3V0X2xlbiA9IDA7CisJCQl9OworCisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgIk1zZ091dCBwaGFzZSBwcm9jZXNzZWQiKTsKKwkJfQorCisJCWlmICgoYXV0b19zdGF0ICYgREFUQV9JTl9QSEFTRSkgJiYKKwkJICAgIChTQ3BudC0+cmVzaWQgPiAwKSAmJgorCQkgICAgKChuc3AzMl9yZWFkMihiYXNlLCBGSUZPX1JFU1RfQ05UKSAmIEZJRk9fUkVTVF9NQVNLKSAhPSAwKSkgeworCQkJcHJpbnRrKCAiYXV0bytmaWZvXG4iKTsKKwkJCS8vbnNwMzJfcGlvX3JlYWQoU0NwbnQpOworCQl9CisKKwkJaWYgKGF1dG9fc3RhdCAmIChEQVRBX0lOX1BIQVNFIHwgREFUQV9PVVRfUEhBU0UpKSB7CisJCQkvKiBEQVRBX0lOX1BIQVNFL0RBVEFfT1VUX1BIQVNFIHdhcyBwcm9jZXNzZWQuICovCisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwKKwkJCQkgICJEYXRhIGluL291dCBwaGFzZSBwcm9jZXNzZWQiKTsKKworCQkJLyogcmVhZCBCTUNOVCwgU0dUIHBvaW50ZXIgYWRkciAqLworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJCTUNOVD0weCVseCIsIAorCQkJCSAgICBuc3AzMl9yZWFkNChiYXNlLCBCTV9DTlQpKTsKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiYWRkcj0weCVseCIsIAorCQkJCSAgICBuc3AzMl9yZWFkNChiYXNlLCBTR1RfQURSKSk7CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgIlNBQ0s9MHglbHgiLCAKKwkJCQkgICAgbnNwMzJfcmVhZDQoYmFzZSwgU0FDS19DTlQpKTsKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiU1NBQ0s9MHglbHgiLCAKKwkJCQkgICAgbnNwMzJfcmVhZDQoYmFzZSwgU0FWRURfU0FDS19DTlQpKTsKKworCQkJU0NwbnQtPnJlc2lkID0gMDsgLyogYWxsIGRhdGEgdHJhbnNmZXJlZCEgKi8KKwkJfQorCisJCS8qCisJCSAqIE1zZ0luIE9jY3VyCisJCSAqLworCQlpZiAoYXV0b19zdGF0ICYgTVNHX0lOX09DQ1VFUikgeworCQkJbnNwMzJfbXNnaW5fb2NjdXIoU0NwbnQsIGlycV9zdGF0LCBhdXRvX3N0YXQpOworCQl9CisKKwkJLyoKKwkJICogTXNnT3V0IE9jY3VyCisJCSAqLworCQlpZiAoYXV0b19zdGF0ICYgTVNHX09VVF9PQ0NVRVIpIHsKKwkJCW5zcDMyX21zZ291dF9vY2N1cihTQ3BudCk7CisJCX0KKworCQkvKgorCQkgKiBCdXMgRnJlZSBPY2N1cgorCQkgKi8KKwkJaWYgKGF1dG9fc3RhdCAmIEJVU19GUkVFX09DQ1VFUikgeworCQkJcmV0ID0gbnNwMzJfYnVzZnJlZV9vY2N1cihTQ3BudCwgYXV0b19zdGF0KTsKKwkJCWlmIChyZXQgPT0gVFJVRSkgeworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJaWYgKGF1dG9fc3RhdCAmIFNUQVRVU19QSEFTRSkgeworCQkJLyoKKwkJCSAqIFJlYWQgQ1NCIGFuZCBzdWJzdGl0dXRlIENTQiBmb3IgU0NwbnQtPnJlc3VsdAorCQkJICogdG8gc2F2ZSBzdGF0dXMgcGhhc2Ugc3R1dGFzIGJ5dGUuCisJCQkgKiBzY3NpIGVycm9yIGhhbmRsZXIgY2hlY2tzIGhvc3RfYnl0ZSAoRElEXyo6CisJCQkgKiBsb3cgbGV2ZWwgZHJpdmVyIHRvIGluZGljYXRlIHN0YXR1cyksIHRoZW4gY2hlY2tzIAorCQkJICogc3RhdHVzX2J5dGUgKFNDU0kgc3RhdHVzIGJ5dGUpLgorCQkJICovCisJCQlTQ3BudC0+cmVzdWx0ID0JKGludCluc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0NTQl9JTik7CisJCX0KKworCQlpZiAoYXV0b19zdGF0ICYgSUxMRUdBTF9QSEFTRSkgeworCQkJLyogSWxsZWdhbCBwaGFzZSBpcyBkZXRlY3RlZC4gU0FDSyBpcyBub3QgYmFjay4gKi8KKwkJCW5zcDMyX21zZyhLRVJOX1dBUk5JTkcsIAorCQkJCSAgIkFVVE8gU0NTSSBJTExFR0FMIFBIQVNFIE9DQ1VSISEhISIpOworCisJCQkvKiBUT0RPOiBjdXJyZW50bHkgd2UgZG9uJ3QgaGF2ZSBhbnkgYWN0aW9uLi4uIGJ1cyByZXNldD8gKi8KKworCQkJLyoKKwkJCSAqIFRvIHNlbmQgYmFjayBTQUNLLCBhc3NlcnQsIHdhaXQsIGFuZCBuZWdhdGUuCisJCQkgKi8KKwkJCW5zcDMyX3NhY2tfYXNzZXJ0KGRhdGEpOworCQkJbnNwMzJfd2FpdF9yZXEoZGF0YSwgTkVHQVRFKTsKKwkJCW5zcDMyX3NhY2tfbmVnYXRlKGRhdGEpOworCisJCX0KKworCQlpZiAoYXV0b19zdGF0ICYgQ09NTUFORF9QSEFTRSkgeworCQkJLyogbm90aGluZyB0byBkbyAqLworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJDb21tYW5kIHBoYXNlIHByb2Nlc3NlZCIpOworCQl9CisKKwkJaWYgKGF1dG9fc3RhdCAmIEFVVE9TQ1NJX0JVU1kpIHsKKwkJCS8qIEF1dG9TQ1NJIGlzIHJ1bm5pbmcgKi8KKwkJfQorCisJCXNob3dfYXV0b3BoYXNlKGF1dG9fc3RhdCk7CisJfQorCisJLyogRklGT19TSExEX0lSUSAqLworCWlmIChpcnFfc3RhdCAmIElSUVNUQVRVU19GSUZPX1NITERfSVJRKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiRklGTyBJUlEiKTsKKworCQlzd2l0Y2goYnVzcGhhc2UpIHsKKwkJY2FzZSBCVVNQSEFTRV9EQVRBX09VVDoKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiZmlmby93cml0ZSIpOworCisJCQkvL25zcDMyX3Bpb193cml0ZShTQ3BudCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQlVTUEhBU0VfREFUQV9JTjoKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiZmlmby9yZWFkIik7CisKKwkJCS8vbnNwMzJfcGlvX3JlYWQoU0NwbnQpOworCisJCQlicmVhazsKKworCQljYXNlIEJVU1BIQVNFX1NUQVRVUzoKKwkJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiZmlmby9zdGF0dXMiKTsKKworCQkJU0NwbnQtPlNDcC5TdGF0dXMgPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0NTQl9JTik7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJmaWZvL290aGVyIHBoYXNlIik7CisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgImlycV9zdGF0PTB4JXggdHJhbnNfc3RhdD0weCV4IiwgaXJxX3N0YXQsIHRyYW5zX3N0YXQpOworCQkJc2hvd19idXNwaGFzZShidXNwaGFzZSk7CisJCQlicmVhazsKKwkJfQorCisJCWdvdG8gb3V0OworCX0KKworCS8qIFBoYXNlIENoYW5nZSBJUlEgKi8KKwlpZiAoaXJxX3N0YXQgJiBJUlFTVEFUVVNfUEhBU0VfQ0hBTkdFX0lSUSkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfSU5UUiwgInBoYXNlIGNoYW5nZSBJUlEiKTsKKworCQlzd2l0Y2goYnVzcGhhc2UpIHsKKwkJY2FzZSBCVVNQSEFTRV9NRVNTQUdFX0lOOgorCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJwaGFzZSBjaGcvbXNnIGluIik7CisJCQluc3AzMl9tc2dpbl9vY2N1cihTQ3BudCwgaXJxX3N0YXQsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAicGhhc2UgY2hnL290aGVyIHBoYXNlPyIpOworCQkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgImlycV9zdGF0PTB4JXggdHJhbnNfc3RhdD0weCV4XG4iLAorCQkJCSAgaXJxX3N0YXQsIHRyYW5zX3N0YXQpOworCQkJc2hvd19idXNwaGFzZShidXNwaGFzZSk7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQQ0lfSVJRICovCisJaWYgKGlycV9zdGF0ICYgSVJRU1RBVFVTX1BDSV9JUlEpIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsICJQQ0kgSVJRIG9jY3VycmVkIik7CisJCS8qIERvIG5vdGhpbmcgKi8KKwl9CisKKwkvKiBCTUNOVEVSUl9JUlEgKi8KKwlpZiAoaXJxX3N0YXQgJiBJUlFTVEFUVVNfQk1DTlRFUlJfSVJRKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgIlJlY2VpdmVkIHVuZXhwZWN0ZWQgQk1DTlRFUlIgSVJRISAiKTsKKwkJLyoKKwkJICogVE9ETzogVG8gYmUgaW1wbGVtZW50ZWQgaW1wcm92aW5nIGJ1cyBtYXN0ZXIKKwkJICogdHJhbnNmZXIgcmVsaWFibGl0eSB3aGVuIEJNQ05URVJSIGlzIG9jY3VycmVkIGluCisJCSAqIEF1dG9TQ1NJIHBoYXNlIGRlc2NyaWJlZCBpbiBzcGVjaWZpY2F0aW9uLgorCQkgKi8KKwl9CisKKyNpZiAwCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0lOVFIsCisJCSAgImlycV9zdGF0PTB4JXggdHJhbnNfc3RhdD0weCV4IiwgaXJxX3N0YXQsIHRyYW5zX3N0YXQpOworCXNob3dfYnVzcGhhc2UoYnVzcGhhc2UpOworI2VuZGlmCisKKyBvdXQ6CisJLyogZGlzYWJsZSBJUlEgbWFzayAqLworCW5zcDMyX3dyaXRlMihiYXNlLCBJUlFfQ09OVFJPTCwgMCk7CisKKyBvdXQyOgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyNlbHNlCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9fcmVxdWVzdF9sb2NrLCBmbGFncyk7CisjZW5kaWYKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19JTlRSLCAiZXhpdCIpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyN1bmRlZiBTUFJJTlRGCisjZGVmaW5lIFNQUklOVEYoYXJncy4uLikgXAorCWRvIHsgXAorCQlpZihsZW5ndGggPiAocG9zIC0gYnVmZmVyKSkgeyBcCisJCQlwb3MgKz0gc25wcmludGYocG9zLCBsZW5ndGggLSAocG9zIC0gYnVmZmVyKSArIDEsICMjIGFyZ3MpOyBcCisJCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfUFJPQywgImJ1ZmZlcj0weCVwIHBvcz0weCVwIGxlbmd0aD0lZCAlZFxuIiwgYnVmZmVyLCBwb3MsIGxlbmd0aCwgIGxlbmd0aCAtIChwb3MgLSBidWZmZXIpKTtcCisJCX0gXAorCX0gd2hpbGUoMCkKK3N0YXRpYyBpbnQgbnNwMzJfcHJvY19pbmZvKAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKSAKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorI2VuZGlmCisJY2hhciAgICAgICAgICAgICAqYnVmZmVyLAorCWNoYXIgICAgICAgICAgICAqKnN0YXJ0LAorCW9mZl90ICAgICAgICAgICAgIG9mZnNldCwKKwlpbnQgICAgICAgICAgICAgICBsZW5ndGgsCisjaWYgIShMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKSAKKwlpbnQgICAgICAgICAgICAgICBob3N0bm8sCisjZW5kaWYKKwlpbnQgICAgICAgICAgICAgICBpbm91dCkKK3sKKwljaGFyICAgICAgICAgICAgICpwb3MgPSBidWZmZXI7CisJaW50ICAgICAgICAgICAgICAgdGhpc2xlbmd0aDsKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKwluc3AzMl9od19kYXRhICAgICpkYXRhOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKSAKKwlpbnQgICAgICAgICAgICAgICBob3N0bm87CisjZWxzZQorCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgICAgICBiYXNlOworCXVuc2lnbmVkIGNoYXIgICAgIG1vZGVfcmVnOworCWludCAgICAgICAgICAgICAgIGlkLCBzcGVlZDsKKwlsb25nICAgICAgICAgICAgICBtb2RlbDsKKworCS8qIFdyaXRlIGlzIG5vdCBzdXBwb3J0ZWQsIGp1c3QgcmV0dXJuLiAqLworCWlmIChpbm91dCA9PSBUUlVFKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKSAKKwlob3N0bm8gPSBob3N0LT5ob3N0X25vOworI2Vsc2UKKwkvKiBzZWFyY2ggdGhpcyBIQkEgaG9zdCAqLworCWhvc3QgPSBzY3NpX2hvc3RfaG5fZ2V0KGhvc3Rubyk7CisJaWYgKGhvc3QgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVTUkNIOworCX0KKyNlbmRpZgorCWRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCWJhc2UgPSBob3N0LT5pb19wb3J0OworCisJU1BSSU5URigiTmluamFTQ1NJLTMyIHN0YXR1c1xuXG4iKTsKKwlTUFJJTlRGKCJEcml2ZXIgdmVyc2lvbjogICAgICAgICVzLCAkUmV2aXNpb246IDEuMzMgJFxuIiwgbnNwMzJfcmVsZWFzZV92ZXJzaW9uKTsKKwlTUFJJTlRGKCJTQ1NJIGhvc3QgTm8uOiAgICAgICAgICVkXG4iLAkJaG9zdG5vKTsKKwlTUFJJTlRGKCJJUlE6ICAgICAgICAgICAgICAgICAgICVkXG4iLAkJaG9zdC0+aXJxKTsKKwlTUFJJTlRGKCJJTzogICAgICAgICAgICAgICAgICAgIDB4JWx4LTB4JWx4XG4iLCBob3N0LT5pb19wb3J0LCBob3N0LT5pb19wb3J0ICsgaG9zdC0+bl9pb19wb3J0IC0gMSk7CisJU1BSSU5URigiTU1JTyh2aXJ0dWFsIGFkZHJlc3MpOiAweCVseC0weCVseFxuIiwJaG9zdC0+YmFzZSwgaG9zdC0+YmFzZSArIGRhdGEtPk1taW9MZW5ndGggLSAxKTsKKwlTUFJJTlRGKCJzZ190YWJsZXNpemU6ICAgICAgICAgICVkXG4iLAkJaG9zdC0+c2dfdGFibGVzaXplKTsKKwlTUFJJTlRGKCJDaGlwIHJldmlzaW9uOiAgICAgICAgIDB4JXhcbiIsICAgICAgIAkobnNwMzJfcmVhZDIoYmFzZSwgSU5ERVhfUkVHKSA+PiA4KSAmIDB4ZmYpOworCisJbW9kZV9yZWcgPSBuc3AzMl9pbmRleF9yZWFkMShiYXNlLCBDSElQX01PREUpOworCW1vZGVsICAgID0gZGF0YS0+cGNpX2RldmlkLT5kcml2ZXJfZGF0YTsKKworI2lmZGVmIENPTkZJR19QTQorCVNQUklOVEYoIlBvd2VyIE1hbmFnZW1lbnQ6ICAgICAgJXNcbiIsICAgICAgICAgIChtb2RlX3JlZyAmIE9QVEYpID8gInllcyIgOiAibm8iKTsKKyNlbmRpZgorCVNQUklOVEYoIk9FTTogICAgICAgICAgICAgICAgICAgJWxkLCAlc1xuIiwgICAgIChtb2RlX3JlZyAmIChPRU0wfE9FTTEpKSwgbnNwMzJfbW9kZWxbbW9kZWxdKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoZGF0YS0+TG9jayksIGZsYWdzKTsKKwlTUFJJTlRGKCJDdXJyZW50U0M6ICAgICAgICAgICAgIDB4JXBcblxuIiwgICAgICBkYXRhLT5DdXJyZW50U0MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihkYXRhLT5Mb2NrKSwgZmxhZ3MpOworCisKKwlTUFJJTlRGKCJTRFRSIHN0YXR1c1xuIik7CisJZm9yIChpZCA9IDA7IGlkIDwgQVJSQVlfU0laRShkYXRhLT50YXJnZXQpOyBpZCsrKSB7CisKKyAgICAgICAgICAgICAgICBTUFJJTlRGKCJpZCAlZDogIiwgaWQpOworCisJCWlmIChpZCA9PSBob3N0LT50aGlzX2lkKSB7CisJCQlTUFJJTlRGKCItLS0tLSBOaW5qYVNDU0ktMzIgaG9zdCBhZGFwdGVyXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGRhdGEtPnRhcmdldFtpZF0uc3luY19mbGFnID09IFNEVFJfRE9ORSkgeworCQkJaWYgKGRhdGEtPnRhcmdldFtpZF0ucGVyaW9kID09IDAgICAgICAgICAgICAmJgorCQkJICAgIGRhdGEtPnRhcmdldFtpZF0ub2Zmc2V0ID09IEFTWU5DX09GRlNFVCApIHsKKwkJCQlTUFJJTlRGKCJhc3luYyIpOworCQkJfSBlbHNlIHsKKwkJCQlTUFJJTlRGKCIgc3luYyIpOworCQkJfQorCQl9IGVsc2UgeworCQkJU1BSSU5URigiIG5vbmUiKTsKKwkJfQorCisJCWlmIChkYXRhLT50YXJnZXRbaWRdLnBlcmlvZCAhPSAwKSB7CisKKwkJCXNwZWVkID0gMTAwMDAwMCAvIChkYXRhLT50YXJnZXRbaWRdLnBlcmlvZCAqIDQpOworCisJCQlTUFJJTlRGKCIgdHJhbnNmZXIgJWQuJWRNQi9zLCBvZmZzZXQgJWQiLAorCQkJCXNwZWVkIC8gMTAwMCwKKwkJCQlzcGVlZCAlIDEwMDAsCisJCQkJZGF0YS0+dGFyZ2V0W2lkXS5vZmZzZXQKKwkJCQkpOworCQl9CisJCVNQUklOVEYoIlxuIik7CisJfQorCisKKwl0aGlzbGVuZ3RoID0gcG9zIC0gKGJ1ZmZlciArIG9mZnNldCk7CisKKwlpZih0aGlzbGVuZ3RoIDwgMCkgeworCQkqc3RhcnQgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKworCXRoaXNsZW5ndGggPSBtaW4odGhpc2xlbmd0aCwgbGVuZ3RoKTsKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlyZXR1cm4gdGhpc2xlbmd0aDsKK30KKyN1bmRlZiBTUFJJTlRGCisKKworCisvKgorICogUmVzZXQgcGFyYW1ldGVycyBhbmQgY2FsbCBzY3NpX2RvbmUgZm9yIGRhdGEtPmN1cl9sdW50LgorICogQmUgY2FyZWZ1bCBzZXR0aW5nIFNDcG50LT5yZXN1bHQgPSBESURfKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBuc3AzMl9zY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50ICAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisKKwkvKgorCSAqIHVubWFwIHBjaQorCSAqLworCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuID09IDApIHsKKwkJZ290byBza2lwOworCX0KKworCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCXBjaV91bm1hcF9zZyhkYXRhLT5QY2ksCisJCQkgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilTQ3BudC0+YnVmZmVyLAorCQkJICAgICBTQ3BudC0+dXNlX3NnLCBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0gZWxzZSB7CisJCXBjaV91bm1hcF9zaW5nbGUoZGF0YS0+UGNpLAorCQkJCSAodTMyKVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luLAorCQkJCSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCX0KKworIHNraXA6CisJLyoKKwkgKiBjbGVhciBUUkFOU0ZFUkNPTlRST0xfQk1fU1RBUlQKKwkgKi8KKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgMCk7CisJbnNwMzJfd3JpdGU0KGJhc2UsIEJNX0NOVCwgICAgICAgICAgIDApOworCisJLyoKKwkgKiBjYWxsIHNjc2lfZG9uZQorCSAqLworCSgqU0NwbnQtPnNjc2lfZG9uZSkoU0NwbnQpOworCisJLyoKKwkgKiByZXNldCBwYXJhbWV0ZXJzCisJICovCisJZGF0YS0+Y3VyX2x1bnQtPlNDcG50ID0gTlVMTDsKKwlkYXRhLT5jdXJfbHVudCAgICAgICAgPSBOVUxMOworCWRhdGEtPmN1cl90YXJnZXQgICAgICA9IE5VTEw7CisJZGF0YS0+Q3VycmVudFNDICAgICAgPSBOVUxMOworfQorCisKKy8qCisgKiBCdXMgRnJlZSBPY2N1cgorICoKKyAqIEN1cnJlbnQgUGhhc2UgaXMgQlVTRlJFRS4gQXV0b1NDU0kgaXMgYXV0b21hdGljYWxseSBleGVjdXRlIEJVU0ZSRUUgcGhhc2UKKyAqIHdpdGggQUNLIHJlcGx5IHdoZW4gYmVsb3cgY29uZGl0aW9uIGlzIG1hdGNoZWQ6CisgKglNc2dJbiAwMDogQ29tbWFuZCBDb21wbGV0ZS4KKyAqCU1zZ0luIDAyOiBTYXZlIERhdGEgUG9pbnRlci4KKyAqCU1zZ0luIDA0OiBEaWNvbm5lY3QuCisgKiBJbiBvdGhlciBjYXNlLCB1bmV4cGVjdGVkIEJVU0ZSRUUgaXMgZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfYnVzZnJlZV9vY2N1cihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdW5zaWduZWQgc2hvcnQgZXhlY3BoKQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCBiYXNlICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX0JVU0ZSRUUsICJlbnRlciBleGVjcGg9MHgleCIsIGV4ZWNwaCk7CisJc2hvd19hdXRvcGhhc2UoZXhlY3BoKTsKKworCW5zcDMyX3dyaXRlNChiYXNlLCBCTV9DTlQsICAgICAgICAgICAwKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgMCk7CisKKwkvKgorCSAqIE1zZ0luIDAyOiBTYXZlIERhdGEgUG9pbnRlcgorCSAqCisJICogVkFMSUQ6CisJICogICBTYXZlIERhdGEgUG9pbnRlciBpcyByZWNlaXZlZC4gQWRqdXN0IHBvaW50ZXIuCisJICogICAKKwkgKiBOTy1WQUxJRDoKKwkgKiAgIFNDU0ktMyBzYXlzIGlmIFNhdmUgRGF0YSBQb2ludGVyIGlzIG5vdCByZWNlaXZlZCwgdGhlbiB3ZSByZXN0YXJ0CisJICogICBwcm9jZXNzaW5nIGFuZCB3ZSBjYW4ndCBhZGp1c3QgYW55IFNDU0kgZGF0YSBwb2ludGVyIGluIG5leHQgZGF0YQorCSAqICAgcGhhc2UuCisJICovCisJaWYgKGV4ZWNwaCAmIE1TR0lOXzAyX1ZBTElEKSB7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19CVVNGUkVFLCAiTXNnSW4wMl9WYWxpZCIpOworCisJCS8qCisJCSAqIENoZWNrIHNhY2tfY250L3NhdmVkX3NhY2tfY250LCB0aGVuIGFkanVzdCBzZyB0YWJsZSBpZgorCQkgKiBuZWVkZWQuCisJCSAqLworCQlpZiAoIShleGVjcGggJiBNU0dJTl8wMF9WQUxJRCkgJiYgCisJCSAgICAoKGV4ZWNwaCAmIERBVEFfSU5fUEhBU0UpIHx8IChleGVjcGggJiBEQVRBX09VVF9QSEFTRSkpKSB7CisJCQl1bnNpZ25lZCBpbnQgc2Fja2xlbiwgc19zYWNrbGVuOworCisJCQkvKgorCQkJICogUmVhZCBTQUNLIGNvdW50IGFuZCBTQVZFRFNBQ0sgY291bnQsIHRoZW4gY29tcGFyZS4KKwkJCSAqLworCQkJc2Fja2xlbiAgID0gbnNwMzJfcmVhZDQoYmFzZSwgU0FDS19DTlQgICAgICApOworCQkJc19zYWNrbGVuID0gbnNwMzJfcmVhZDQoYmFzZSwgU0FWRURfU0FDS19DTlQpOworCisJCQkvKgorCQkJICogSWYgU0FWRURTQUNLQ05UID09IDAsIGl0IG1lYW5zIFNhdmVkRGF0YVBvaW50ZXIgaXMKKwkJCSAqIGNvbWUgYWZ0ZXIgZGF0YSB0cmFuc2ZlcmluZy4KKwkJCSAqLworCQkJaWYgKHNfc2Fja2xlbiA+IDApIHsKKwkJCQkvKgorCQkJCSAqIENvbXBhcmluZyBiZXR3ZWVuIHNhY2sgYW5kIHNhdmVkc2FjayB0bworCQkJCSAqIGNoZWNrIHRoZSBjb25kaXRpb24gb2YgQXV0b01zZ0luMDMuCisJCQkJICoKKwkJCQkgKiBJZiB0aGV5IGFyZSBzYW1lLCBzZXQgbXNnaW4wMyA9PSBUUlVFLAorCQkJCSAqIENPTU1BTkRDT05UUk9MX0FVVE9fTVNHSU5fMDMgaXMgZW5hYmxlZCBhdAorCQkJCSAqIHJlc2VsZWN0aW9uLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZXkKKwkJCQkgKiBhcmVuJ3Qgc2FtZSwgc2V0IG1zZ2luMDMgPT0gRkFMU0UsIGFuZAorCQkJCSAqIENPTU1BTkRDT05UUk9MX0FVVE9fTVNHSU5fMDMgaXMgZGlzYWJsZWQgYXQKKwkJCQkgKiByZXNlbGVjdGlvbi4KKwkJCQkgKi8KKwkJCQlpZiAoc2Fja2xlbiAhPSBzX3NhY2tsZW4pIHsKKwkJCQkJZGF0YS0+Y3VyX2x1bnQtPm1zZ2luMDMgPSBGQUxTRTsKKwkJCQl9IGVsc2UgeworCQkJCQlkYXRhLT5jdXJfbHVudC0+bXNnaW4wMyA9IFRSVUU7CisJCQkJfQorCisJCQkJbnNwMzJfYWRqdXN0X2J1c2ZyZWUoU0NwbnQsIHNfc2Fja2xlbik7CisJCQl9CisJCX0KKworCQkvKiBUaGlzIHZhbHVlIGhhcyBub3Qgc3Vic3RpdHVkZSB3aXRoIHZhbGlkIHZhbHVlIHlldC4uLiAqLworCQkvL2RhdGEtPmN1cl9sdW50LT5zYXZlX2RhdHAgPSBkYXRhLT5jdXJfZGF0cDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBubyBwcm9jZXNzaW5nLgorCQkgKi8KKwl9CisJCisJaWYgKGV4ZWNwaCAmIE1TR0lOXzAzX1ZBTElEKSB7CisJCS8qIE1zZ0luMDMgd2FzIHZhbGlkIHRvIGJlIHByb2Nlc3NlZC4gTm8gbmVlZCBwcm9jZXNzaW5nLiAqLworCX0KKworCS8qCisJICogdGFyZ2V0IFNEVFIgY2hlY2sKKwkgKi8KKwlpZiAoZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnICYgU0RUUl9JTklUSUFUT1IpIHsKKwkJLyoKKwkJICogU0RUUiBuZWdvdGlhdGlvbiBwdWxsZWQgYnkgdGhlIGluaXRpYXRvciBoYXMgbm90CisJCSAqIGZpbmlzaGVkIHlldC4gRmFsbCBiYWNrIHRvIEFTWU5DIG1vZGUuCisJCSAqLworCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgZGF0YS0+Y3VyX3RhcmdldCk7CisJCWRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyAmPSB+U0RUUl9JTklUSUFUT1I7CisJCWRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0RPTkU7CisJfSBlbHNlIGlmIChkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jX2ZsYWcgJiBTRFRSX1RBUkdFVCkgeworCQkvKgorCQkgKiBTRFRSIG5lZ290aWF0aW9uIHB1bGxlZCBieSB0aGUgdGFyZ2V0IGhhcyBiZWVuCisJCSAqIG5lZ290aWF0aW5nLgorCQkgKi8KKwkJaWYgKGV4ZWNwaCAmIChNU0dJTl8wMF9WQUxJRCB8IE1TR0lOXzA0X1ZBTElEKSkgeworCQkJLyogCisJCQkgKiBJZiB2YWxpZCBtZXNzYWdlIGlzIHJlY2VpdmVkLCB0aGVuCisJCQkgKiBuZWdvdGlhdGlvbiBpcyBzdWNjZWVkZWQuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBPbiB0aGUgY29udHJhcnksIGlmIHVuZXhwZWN0ZWQgYnVzIGZyZWUgaXMKKwkJCSAqIG9jY3VycmVkLCB0aGVuIG5lZ290aWF0aW9uIGlzIGZhaWxlZC4gRmFsbAorCQkJICogYmFjayB0byBBU1lOQyBtb2RlLgorCQkJICovCisJCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgZGF0YS0+Y3VyX3RhcmdldCk7CisJCX0KKwkJZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnICY9IH5TRFRSX1RBUkdFVDsKKwkJZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnIHw9IFNEVFJfRE9ORTsKKwl9CisKKwkvKgorCSAqIEl0IGlzIGFsd2F5cyBlbnN1cmVkIGJ5IFNDU0kgc3RhbmRhcmQgdGhhdCBpbml0aWF0b3IKKwkgKiBzd2l0Y2hlcyBpbnRvIEJ1cyBGcmVlIFBoYXNlIGFmdGVyCisJICogcmVjZWl2aW5nIG1lc3NhZ2UgMDAgKENvbW1hbmQgQ29tcGxldGUpLCAwNCAoRGlzY29ubmVjdCkuCisJICogSXQncyB0aGUgcmVhc29uIHRoYXQgcHJvY2Vzc2luZyBoZXJlIGlzIHZhbGlkLgorCSAqLworCWlmIChleGVjcGggJiBNU0dJTl8wMF9WQUxJRCkgeworCQkvKiBNc2dJbiAwMDogQ29tbWFuZCBDb21wbGV0ZSAqLworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTRlJFRSwgImNvbW1hbmQgY29tcGxldGUiKTsKKworCQlTQ3BudC0+U0NwLlN0YXR1cyAgPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0NTQl9JTik7CisJCVNDcG50LT5TQ3AuTWVzc2FnZSA9IDA7CisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19CVVNGUkVFLCAKKwkJCSAgIm5vcm1hbCBlbmQgc3RhdD0weCV4IHJlc2lkPTB4JXhcbiIsCisJCQkgIFNDcG50LT5TQ3AuU3RhdHVzLCBTQ3BudC0+cmVzaWQpOworCQlTQ3BudC0+cmVzdWx0ID0gKERJRF9PSyAgICAgICAgICAgICA8PCAxNikgfAorCQkJICAgICAgICAoU0NwbnQtPlNDcC5NZXNzYWdlIDw8ICA4KSB8CisJCQkgICAgICAgIChTQ3BudC0+U0NwLlN0YXR1cyAgPDwgIDApOworCQluc3AzMl9zY3NpX2RvbmUoU0NwbnQpOworCQkvKiBBbGwgb3BlcmF0aW9uIGlzIGRvbmUgKi8KKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIGlmIChleGVjcGggJiBNU0dJTl8wNF9WQUxJRCkgeworCQkvKiBNc2dJbiAwNDogRGlzY29ubmVjdCAqLworCQlTQ3BudC0+U0NwLlN0YXR1cyAgPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0NTQl9JTik7CisJCVNDcG50LT5TQ3AuTWVzc2FnZSA9IDQ7CisJCQorCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTRlJFRSwgImRpc2Nvbm5lY3QiKTsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJLyogVW5leHBlY3RlZCBidXMgZnJlZSAqLworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAidW5leHBlY3RlZCBidXMgZnJlZSBvY2N1cnJlZCIpOworCisJCS8qIERJRF9FUlJPUj8gKi8KKwkJLy9TQ3BudC0+cmVzdWx0ICAgPSAoRElEX09LIDw8IDE2KSB8IChTQ3BudC0+U0NwLk1lc3NhZ2UgPDwgOCkgfCAoU0NwbnQtPlNDcC5TdGF0dXMgPDwgMCk7CisJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCW5zcDMyX3Njc2lfZG9uZShTQ3BudCk7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAqIG5zcDMyX2FkanVzdF9idXNmcmVlIC0gYWRqdXN0aW5nIFNHIHRhYmxlCisgKgorICogTm90ZTogVGhpcyBkcml2ZXIgYWRqdXN0IHRoZSBTRyB0YWJsZSB1c2luZyBTQ1NJIEFDSworICogICAgICAgY291bnRlciBpbnN0ZWFkIG9mIEJNQ05UIGNvdW50ZXIhCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX2FkanVzdF9idXNmcmVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgc19zYWNrbGVuKQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludCAgICAgICAgICAgICAgICAgICBvbGRfZW50cnkgPSBkYXRhLT5jdXJfZW50cnk7CisJaW50ICAgICAgICAgICAgICAgICAgIG5ld19lbnRyeTsKKwlpbnQgICAgICAgICAgICAgICAgICAgc2dfbnVtID0gZGF0YS0+Y3VyX2x1bnQtPnNnX251bTsKKwluc3AzMl9zZ3RhYmxlICpzZ3QgICAgPSBkYXRhLT5jdXJfbHVudC0+c2dsdW4tPnNndDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgcmVzdGxlbiwgc2VudGxlbjsKKwl1MzJfbGUgICAgICAgICAgICAgICAgbGVuLCBhZGRyOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1NHTElTVCwgIm9sZCByZXNpZD0weCV4IiwgU0NwbnQtPnJlc2lkKTsKKworCS8qIGFkanVzdCBzYXZlZCBTQUNLIGNvdW50IHdpdGggNCBieXRlIHN0YXJ0IGFkZHJlc3MgYm91bmRhcnkgKi8KKwlzX3NhY2tsZW4gLT0gbGUzMl90b19jcHUoc2d0W29sZF9lbnRyeV0uYWRkcikgJiAzOworCisJLyoKKwkgKiBjYWxjdWxhdGUgbmV3X2VudHJ5IGZyb20gc2FjayBjb3VudCBhbmQgZWFjaCBzZ3RbXS5sZW4gCisJICogY2FsY3VsYXRlIHRoZSBieXRlIHdoaWNoIGlzIGludGVudCB0byBzZW5kCisJICovCisJc2VudGxlbiA9IDA7CisJZm9yIChuZXdfZW50cnkgPSBvbGRfZW50cnk7IG5ld19lbnRyeSA8IHNnX251bTsgbmV3X2VudHJ5KyspIHsKKwkJc2VudGxlbiArPSAobGUzMl90b19jcHUoc2d0W25ld19lbnRyeV0ubGVuKSAmIH5TR1RFTkQpOworCQlpZiAoc2VudGxlbiA+IHNfc2Fja2xlbikgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBhbGwgc2d0IGlzIHByb2Nlc3NlZCAqLworCWlmIChuZXdfZW50cnkgPT0gc2dfbnVtKSB7CisJCWdvdG8gbGFzdDsKKwl9CisKKwlpZiAoc2VudGxlbiA9PSBzX3NhY2tsZW4pIHsKKwkJLyogWFhYOiBjb25maXJtIGl0J3Mgb2sgb3Igbm90ICovCisJCS8qIEluIHRoaXMgY2FzZSwgaXQncyBvayBiZWNhdXNlIHdlIGFyZSBhdCAKKwkJICAgdGhlIGhlYWQgZWxlbWVudCBvZiB0aGUgc2cuIHJlc3RsZW4gaXMgY29ycmVjdGx5IGNhbGN1bGF0ZWQuICovCisJfQorCisJLyogY2FsY3VsYXRlIHRoZSByZXN0IGxlbmd0aCBmb3IgdHJhbnNmZXJpbmcgKi8KKwlyZXN0bGVuID0gc2VudGxlbiAtIHNfc2Fja2xlbjsKKworCS8qIHVwZGF0ZSBhZGp1c3RpbmcgY3VycmVudCBTRyB0YWJsZSBlbnRyeSAqLworCWxlbiAgPSBsZTMyX3RvX2NwdShzZ3RbbmV3X2VudHJ5XS5sZW4pOworCWFkZHIgPSBsZTMyX3RvX2NwdShzZ3RbbmV3X2VudHJ5XS5hZGRyKTsKKwlhZGRyICs9IChsZW4gLSByZXN0bGVuKTsKKwlzZ3RbbmV3X2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJc2d0W25ld19lbnRyeV0ubGVuICA9IGNwdV90b19sZTMyKHJlc3RsZW4pOworCisJLyogc2V0IGN1cl9lbnRyeSB3aXRoIG5ld19lbnRyeSAqLworCWRhdGEtPmN1cl9lbnRyeSA9IG5ld19lbnRyeTsKKyAKKwlyZXR1cm47CisKKyBsYXN0OgorCWlmIChTQ3BudC0+cmVzaWQgPCBzZW50bGVuKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgInJlc2lkIHVuZGVyZmxvdyIpOworCX0KKworCVNDcG50LT5yZXNpZCAtPSBzZW50bGVuOworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19TR0xJU1QsICJuZXcgcmVzaWQ9MHgleCIsIFNDcG50LT5yZXNpZCk7CisKKwkvKiB1cGRhdGUgaG9zdGRhdGEgYW5kIGx1biAqLworCisJcmV0dXJuOworfQorCisKKy8qCisgKiBJdCdzIGNhbGxlZCBNc2dPdXQgcGhhc2Ugb2NjdXIuCisgKiBOaW5qYVNDU0ktMzJCaS9VREUgYXV0b21hdGljYWxseSBwcm9jZXNzZXMgdXAgdG8gMyBtZXNzYWdlcyBpbgorICogbWVzc2FnZSBvdXQgcGhhc2UuIEl0LCBob3dldmVyLCBoYXMgbW9yZSB0aGFuIDMgbWVzc2FnZXMsCisgKiBIQkEgY3JlYXRlcyB0aGUgaW50ZXJydXB0IGFuZCB3ZSBoYXZlIHRvIHByb2Nlc3MgYnkgaGFuZC4KKyAqLworc3RhdGljIHZvaWQgbnNwMzJfbXNnb3V0X29jY3VyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCBiYXNlICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCS8vdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKKwlsb25nIG5ld19zZ3RwOworCWludCBpOworCQorCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dPVVRPQ0NVUiwKKwkJICAiZW50ZXI6IG1zZ291dF9sZW46IDB4JXgiLCBkYXRhLT5tc2dvdXRfbGVuKTsKKworCS8qCisJICogSWYgTXNnT3V0IHBoYXNlIGlzIG9jY3VycmVkIHdpdGhvdXQgaGF2aW5nIGFueQorCSAqIG1lc3NhZ2UsIHRoZW4gTm9fT3BlcmF0aW9uIGlzIHNlbnQgKFNDU0ktMikuCisJICovCisJaWYgKGRhdGEtPm1zZ291dF9sZW4gPT0gMCkgeworCQluc3AzMl9idWlsZF9ub3AoU0NwbnQpOworCX0KKworCS8qCisJICogU2V0IFNHVFAgQUREUiBjdXJyZW50IGVudHJ5IGZvciByZXN0YXJ0aW5nIEFVVE9TQ1NJLCAKKwkgKiBiZWNhdXNlIFNHVFAgaXMgaW5jcmVtZW50ZWQgbmV4dCBwb2ludC4KKwkgKiBUaGVyZSBpcyBmZXcgc3RhdGVtZW50IGluIHRoZSBzcGVjaWZpY2F0aW9uLi4uCisJICovCisgCW5ld19zZ3RwID0gZGF0YS0+Y3VyX2x1bnQtPnNnbHVuX3BhZGRyICsgCisJCSAgIChkYXRhLT5jdXJfbHVudC0+Y3VyX2VudHJ5ICogc2l6ZW9mKG5zcDMyX3NndGFibGUpKTsKKworCS8qCisJICogc2VuZCBtZXNzYWdlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5tc2dvdXRfbGVuOyBpKyspIHsKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR09VVE9DQ1VSLAorCQkJICAiJWQgOiAweCV4IiwgaSwgZGF0YS0+bXNnb3V0YnVmW2ldKTsKKworCQkvKgorCQkgKiBDaGVjayBSRVEgaXMgYXNzZXJ0ZWQuCisJCSAqLworCQluc3AzMl93YWl0X3JlcShkYXRhLCBBU1NFUlQpOworCisJCWlmIChpID09IChkYXRhLT5tc2dvdXRfbGVuIC0gMSkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgbGFzdCBtZXNzYWdlLCBzZXQgdGhlIEF1dG9TQ1NJIHJlc3RhcnQKKwkJCSAqIGJlZm9yZSBzZW5kIGJhY2sgdGhlIGFjayBtZXNzYWdlLiBBdXRvU0NTSQorCQkJICogcmVzdGFydCBhdXRvbWF0aWNhbGx5IG5lZ2F0ZSBBVE4gc2lnbmFsLgorCQkJICovCisJCQkvL2NvbW1hbmQgPSAoQVVUT19NU0dJTl8wMF9PUl8wNCB8IEFVVE9fTVNHSU5fMDIpOworCQkJLy9uc3AzMl9yZXN0YXJ0X2F1dG9zY3NpKFNDcG50LCBjb21tYW5kKTsKKwkJCW5zcDMyX3dyaXRlMihiYXNlLCBDT01NQU5EX0NPTlRST0wsCisJCQkJCSAoQ0xFQVJfQ0RCX0ZJRk9fUE9JTlRFUiB8CisJCQkJCSAgQVVUT19DT01NQU5EX1BIQVNFICAgICB8CisJCQkJCSAgQVVUT1NDU0lfUkVTVEFSVCAgICAgICB8CisJCQkJCSAgQVVUT19NU0dJTl8wMF9PUl8wNCAgICB8CisJCQkJCSAgQVVUT19NU0dJTl8wMiAgICAgICAgICApKTsKKwkJfQorCQkvKgorCQkgKiBXcml0ZSBkYXRhIHdpdGggU0FDSywgdGhlbiB3YWl0IHNhY2sgaXMKKwkJICogYXV0b21hdGljYWxseSBuZWdhdGVkLgorCQkgKi8KKwkJbnNwMzJfd3JpdGUxKGJhc2UsIFNDU0lfREFUQV9XSVRIX0FDSywgZGF0YS0+bXNnb3V0YnVmW2ldKTsKKwkJbnNwMzJfd2FpdF9zYWNrKGRhdGEsIE5FR0FURSk7CisKKwkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR09VVE9DQ1VSLCAiYnVzOiAweCV4XG4iLAorCQkJICBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0JVU19NT05JVE9SKSk7CisJfTsKKworCWRhdGEtPm1zZ291dF9sZW4gPSAwOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR09VVE9DQ1VSLCAiZXhpdCIpOworfQorCisvKgorICogUmVzdGFydCBBdXRvU0NTSQorICoKKyAqIE5vdGU6IFJlc3RhcnRpbmcgQXV0b1NDU0kgbmVlZHMgc2V0OgorICoJCVNZTkNfUkVHLCBBQ0tfV0lEVEgsIFNHVF9BRFIsIFRSQU5TRkVSX0NPTlRST0wKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfcmVzdGFydF9hdXRvc2NzaShzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdW5zaWduZWQgc2hvcnQgY29tbWFuZCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgICBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQgdHJhbnNmZXIgPSAwOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1JFU1RBUlQsICJlbnRlciIpOworCisJaWYgKGRhdGEtPmN1cl90YXJnZXQgPT0gTlVMTCB8fCBkYXRhLT5jdXJfbHVudCA9PSBOVUxMKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgIlRhcmdldCBvciBMdW4gaXMgaW52YWxpZCIpOworCX0KKworCS8qCisJICogc2V0IFNZTkNfUkVHCisJICogRG9uJ3Qgc2V0IEJNX1NUQVJUX0FEUiBiZWZvcmUgc2V0dGluZyB0aGlzIHJlZ2lzdGVyLgorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBTWU5DX1JFRywgZGF0YS0+Y3VyX3RhcmdldC0+c3luY3JlZyk7CisKKwkvKgorCSAqIHNldCBBQ0tXSURUSAorCSAqLworCW5zcDMyX3dyaXRlMShiYXNlLCBBQ0tfV0lEVEgsIGRhdGEtPmN1cl90YXJnZXQtPmFja3dpZHRoKTsKKworCS8qCisJICogc2V0IFNSRVEgaGF6YXJkIGtpbGxlciBzYW1wbGluZyByYXRlCisJICovCisJbnNwMzJfd3JpdGUxKGJhc2UsIFNSRVFfU01QTF9SQVRFLCBkYXRhLT5jdXJfdGFyZ2V0LT5zYW1wbGVfcmVnKTsKKworCS8qCisJICogc2V0IFNHVCBBRERSIChwaHlzaWNhbCBhZGRyZXNzKQorCSAqLworCW5zcDMyX3dyaXRlNChiYXNlLCBTR1RfQURSLCBkYXRhLT5jdXJfbHVudC0+c2dsdW5fcGFkZHIpOworCisJLyoKKwkgKiBzZXQgVFJBTlNGRVIgQ09OVFJPTCBSRUcKKwkgKi8KKwl0cmFuc2ZlciA9IDA7CisJdHJhbnNmZXIgfD0gKFRSQU5TRkVSX0dPIHwgQUxMX0NPVU5URVJfQ0xSKTsKKwlpZiAoZGF0YS0+dHJhbnNfbWV0aG9kICYgTlNQMzJfVFJBTlNGRVJfQlVTTUFTVEVSKSB7CisJCWlmIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuID4gMCkgeworCQkJdHJhbnNmZXIgfD0gQk1fU1RBUlQ7CisJCX0KKwl9IGVsc2UgaWYgKGRhdGEtPnRyYW5zX21ldGhvZCAmIE5TUDMyX1RSQU5TRkVSX01NSU8pIHsKKwkJdHJhbnNmZXIgfD0gQ0JfTU1JT19NT0RFOworCX0gZWxzZSBpZiAoZGF0YS0+dHJhbnNfbWV0aG9kICYgTlNQMzJfVFJBTlNGRVJfUElPKSB7CisJCXRyYW5zZmVyIHw9IENCX0lPX01PREU7CisJfQorCW5zcDMyX3dyaXRlMihiYXNlLCBUUkFOU0ZFUl9DT05UUk9MLCB0cmFuc2Zlcik7CisKKwkvKgorCSAqIHJlc3RhcnQgQXV0b1NDU0kKKwkgKgorCSAqIFRPRE86IENPTU1BTkRDT05UUk9MX0FVVE9fQ09NTUFORF9QSEFTRSBpcyBuZWVkZWQgPworCSAqLworCWNvbW1hbmQgfD0gKENMRUFSX0NEQl9GSUZPX1BPSU5URVIgfAorCQkgICAgQVVUT19DT01NQU5EX1BIQVNFICAgICB8CisJCSAgICBBVVRPU0NTSV9SRVNUQVJUICAgICAgICk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIENPTU1BTkRfQ09OVFJPTCwgY29tbWFuZCk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUkVTVEFSVCwgImV4aXQiKTsKK30KKworCisvKgorICogY2Fubm90IHJ1biBhdXRvbWF0aWNhbGx5IG1lc3NhZ2UgaW4gb2NjdXIKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfbXNnaW5fb2NjdXIoc3RydWN0IHNjc2lfY21uZCAgICAgKlNDcG50LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAgaXJxX3N0YXR1cywKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IGV4ZWNwaCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1bnNpZ25lZCBpbnQgICBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBjaGFyICBtc2c7CisJdW5zaWduZWQgY2hhciAgbXNndHlwZTsKKwl1bnNpZ25lZCBjaGFyICBuZXdsdW47CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZCAgPSAwOworCWludCAgICAgICAgICAgIG1zZ2NsZWFyID0gVFJVRTsKKwlsb25nICAgICAgICAgICBuZXdfc2d0cDsKKwlpbnQgICAgICAgICAgICByZXQ7CisKKwkvKgorCSAqIHJlYWQgZmlyc3QgbWVzc2FnZQorCSAqICAgIFVzZSBTQ1NJREFUQV9XX0FDSyBpbnN0ZWFkIG9mIFNDU0lEQVRBSU4sIGJlY2F1c2UgdGhlIHByb2NlZHVyZQorCSAqICAgIG9mIE1lc3NhZ2UtSW4gaGF2ZSB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHNlbmRpbmcgYmFjayBTQ1NJIEFDSy4KKwkgKi8KKwltc2cgPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0RBVEFfSU4pOworCWRhdGEtPm1zZ2luYnVmWyh1bnNpZ25lZCBjaGFyKWRhdGEtPm1zZ2luX2xlbl0gPSBtc2c7CisJbXNndHlwZSA9IGRhdGEtPm1zZ2luYnVmWzBdOworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dJTk9DQ1VSLAorCQkgICJlbnRlcjogbXNnbGVuOiAweCV4IG1zZ2luOiAweCV4IG1zZ3R5cGU6IDB4JXgiLAorCQkgIGRhdGEtPm1zZ2luX2xlbiwgbXNnLCBtc2d0eXBlKTsKKworCS8qCisJICogVE9ETzogV2UgbmVlZCBjaGVja2luZyB3aGV0aGVyIGJ1cyBwaGFzZSBpcyBtZXNzYWdlIGluPworCSAqLworCisJLyoKKwkgKiBhc3NlcnQgU0NTSSBBQ0sKKwkgKi8KKwluc3AzMl9zYWNrX2Fzc2VydChkYXRhKTsKKworCS8qCisJICogcHJvY2Vzc2luZyBJREVOVElGWQorCSAqLworCWlmIChtc2d0eXBlICYgMHg4MCkgeworCQlpZiAoIShpcnFfc3RhdHVzICYgSVJRU1RBVFVTX1JFU0VMRUNUX09DQ1VFUikpIHsKKwkJCS8qIEludmFsaWQgKG5vbiByZXNlbGVjdCkgcGhhc2UgKi8KKwkJCWdvdG8gcmVqZWN0OworCQl9CisKKwkJbmV3bHVuID0gbXNndHlwZSAmIDB4MWY7IC8qIFRPRE86IFNQSS0zIGNvbXBsaWFudD8gKi8KKwkJcmV0ID0gbnNwMzJfcmVzZWxlY3Rpb24oU0NwbnQsIG5ld2x1bik7CisJCWlmIChyZXQgPT0gVFJVRSkgeworCQkJZ290byByZXN0YXJ0OworCQl9IGVsc2UgeworCQkJZ290byByZWplY3Q7CisJCX0KKwl9CisJCisJLyoKKwkgKiBwcm9jZXNzaW5nIG1lc3NhZ2VzIGV4Y2VwdCBmb3IgSURFTlRJRlkKKwkgKgorCSAqIFRPRE86IE1lc3NhZ2VzIGFyZSBhbGwgU0NTSS0yIHRlcm1pbm9sb2d5LiBTQ1NJLTMgY29tcGxpYW5jZSBpcyBUT0RPLgorCSAqLworCXN3aXRjaCAobXNndHlwZSkgeworCS8qCisJICogMS1ieXRlIG1lc3NhZ2UKKwkgKi8KKwljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJY2FzZSBESVNDT05ORUNUOgorCQkvKgorCQkgKiBUaGVzZSBtZXNzYWdlcyBzaG91bGQgbm90IGJlIG9jY3VycmVkLgorCQkgKiBUaGV5IHNob3VsZCBiZSBwcm9jZXNzZWQgb24gQXV0b1NDU0kgc2VxdWVuY2VyLgorCQkgKi8KKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgCisJCQkgICAidW5leHBlY3RlZCBtZXNzYWdlIG9mIEF1dG9TQ1NJIE1zZ0luOiAweCV4IiwgbXNnKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJLyoKKwkJICogQXV0b01zZ0luMDMgaXMgZGlzYWJsZWQsIGFuZCBIQkEgZ2V0cyB0aGlzIG1lc3NhZ2UuCisJCSAqLworCisJCWlmICgoZXhlY3BoICYgREFUQV9JTl9QSEFTRSkgfHwgKGV4ZWNwaCAmIERBVEFfT1VUX1BIQVNFKSkgeworCQkJdW5zaWduZWQgaW50IHNfc2Fja2xlbjsKKworCQkJc19zYWNrbGVuID0gbnNwMzJfcmVhZDQoYmFzZSwgU0FWRURfU0FDS19DTlQpOworCQkJaWYgKChleGVjcGggJiBNU0dJTl8wMl9WQUxJRCkgJiYgKHNfc2Fja2xlbiA+IDApKSB7CisJCQkJbnNwMzJfYWRqdXN0X2J1c2ZyZWUoU0NwbnQsIHNfc2Fja2xlbik7CisJCQl9IGVsc2UgeworCQkJCS8qIE5vIG5lZWQgdG8gcmV3cml0ZSBTR1QgKi8KKwkJCX0KKwkJfQorCQlkYXRhLT5jdXJfbHVudC0+bXNnaW4wMyA9IEZBTFNFOworCisJCS8qIFVwZGF0ZSB3aXRoIHRoZSBuZXcgdmFsdWUgKi8KKworCQkvKiByZXNldCBTQUNLL1NhdmVkQUNLIGNvdW50ZXIgKG9yIEFMTCBjbGVhcj8pICovCisJCW5zcDMyX3dyaXRlNChiYXNlLCBDTFJfQ09VTlRFUiwgQ0xSQ09VTlRFUl9BTExNQVNLKTsKKworCQkvKgorCQkgKiBzZXQgbmV3IHNnIHBvaW50ZXIKKwkJICovCisJCW5ld19zZ3RwID0gZGF0YS0+Y3VyX2x1bnQtPnNnbHVuX3BhZGRyICsgCisJCQkoZGF0YS0+Y3VyX2x1bnQtPmN1cl9lbnRyeSAqIHNpemVvZihuc3AzMl9zZ3RhYmxlKSk7CisJCW5zcDMyX3dyaXRlNChiYXNlLCBTR1RfQURSLCBuZXdfc2d0cCk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNBVkVfUE9JTlRFUlM6CisJCS8qCisJCSAqIFRoZXNlIG1lc3NhZ2VzIHNob3VsZCBub3QgYmUgb2NjdXJyZWQuCisJCSAqIFRoZXkgc2hvdWxkIGJlIHByb2Nlc3NlZCBvbiBBdXRvU0NTSSBzZXF1ZW5jZXIuCisJCSAqLworCQluc3AzMl9tc2cgKEtFUk5fV0FSTklORywgCisJCQkgICAidW5leHBlY3RlZCBtZXNzYWdlIG9mIEF1dG9TQ1NJIE1zZ0luOiBTQVZFX1BPSU5URVJTIik7CisJCQorCQlicmVhazsKKwkJCisJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJLyogSWYgcHJldmlvdXMgbWVzc2FnZV9vdXQgaXMgc2VuZGluZyBTRFRSLCBhbmQgZ2V0IAorCQkgICBtZXNzYWdlX3JlamVjdCBmcm9tIHRhcmdldCwgU0RUUiBuZWdvdGlhdGlvbiBpcyBmYWlsZWQgKi8KKwkJaWYgKGRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyAmCisJCQkJKFNEVFJfSU5JVElBVE9SIHwgU0RUUl9UQVJHRVQpKSB7CisJCQkvKgorCQkJICogQ3VycmVudCB0YXJnZXQgaXMgbmVnb3RpYXRpbmcgU0RUUiwgYnV0IGl0J3MKKwkJCSAqIGZhaWxlZC4gIEZhbGwgYmFjayB0byBhc3luYyB0cmFuc2ZlciBtb2RlLCBhbmQgc2V0CisJCQkgKiBTRFRSX0RPTkUuCisJCQkgKi8KKwkJCW5zcDMyX3NldF9hc3luYyhkYXRhLCBkYXRhLT5jdXJfdGFyZ2V0KTsKKwkJCWRhdGEtPmN1cl90YXJnZXQtPnN5bmNfZmxhZyAmPSB+U0RUUl9JTklUSUFUT1I7CisJCQlkYXRhLT5jdXJfdGFyZ2V0LT5zeW5jX2ZsYWcgfD0gU0RUUl9ET05FOworCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisJY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKwkJLyogcXVldWUgdGFnIGlzIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5ICovCisJCW5zcDMyX21zZyAoS0VSTl9XQVJOSU5HLCAKKwkJCSAgICJ1bnN1cHBvcnRlZCBtZXNzYWdlOiAweCV4IiwgbXNndHlwZSk7CisJCWJyZWFrOworCisJY2FzZSBJTklUSUFURV9SRUNPVkVSWToKKwkJLyogc3RhcmluZyBFQ0EgKEV4dGVuZGVkIENvbnRpbmdlbnQgQWxsZWdpYW5jZSkgc3RhdGUuICovCisJCS8qIFRoaXMgbWVzc2FnZSBpcyBkZWNsaW5lZCBpbiBTUEkyIG9yIGxhdGVyLiAqLworCisJCWdvdG8gcmVqZWN0OworCisJLyoKKwkgKiAyLWJ5dGUgbWVzc2FnZQorCSAqLworCWNhc2UgU0lNUExFX1FVRVVFX1RBRzoKKwljYXNlIDB4MjM6CisJCS8qCisJCSAqIDB4MjM6IElnbm9yZV9XaWRlX1Jlc2lkdWUgaXMgbm90IGRlY2xhcmVkIGluIHNjc2kuaC4KKwkJICogTm8gc3VwcG9ydCBpcyBuZWVkZWQuCisJCSAqLworCQlpZiAoZGF0YS0+bXNnaW5fbGVuID49IDEpIHsKKwkJCWdvdG8gcmVqZWN0OworCQl9CisKKwkJLyogY3VycmVudCBwb3NpdGlvbiBpcyAxLWJ5dGUgb2YgMiBieXRlICovCisJCW1zZ2NsZWFyID0gRkFMU0U7CisKKwkJYnJlYWs7CisKKwkvKgorCSAqIGV4dGVuZGVkIG1lc3NhZ2UKKwkgKi8KKwljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCWlmIChkYXRhLT5tc2dpbl9sZW4gPCAxKSB7CisJCQkvKgorCQkJICogQ3VycmVudCBwb3NpdGlvbiBkb2VzIG5vdCByZWFjaCAyLWJ5dGUKKwkJCSAqICgyLWJ5dGUgaXMgZXh0ZW5kZWQgbWVzc2FnZSBsZW5ndGgpLgorCQkJICovCisJCQltc2djbGVhciA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGRhdGEtPm1zZ2luYnVmWzFdICsgMSkgPiBkYXRhLT5tc2dpbl9sZW4pIHsKKwkJCS8qCisJCQkgKiBDdXJyZW50IGV4dGVuZGVkIG1lc3NhZ2UgaGFzIG1zZ2luYnVmWzFdICsgMgorCQkJICogKG1zZ2luX2xlbiBzdGFydHMgY291bnRpbmcgZnJvbSAwLCBzbyBidWZbMV0gKyAxKS4KKwkJCSAqIElmIGN1cnJlbnQgbWVzc2FnZSBwb3NpdGlvbiBpcyBub3QgZmluaXNoZWQsCisJCQkgKiBjb250aW51ZSByZWNlaXZpbmcgbWVzc2FnZS4KKwkJCSAqLworCQkJbXNnY2xlYXIgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogUmVhY2ggaGVyZSBtZWFucyByZWd1bGFyIGxlbmd0aCBvZiBlYWNoIHR5cGUgb2YgCisJCSAqIGV4dGVuZGVkIG1lc3NhZ2VzLgorCQkgKi8KKwkJc3dpdGNoIChkYXRhLT5tc2dpbmJ1ZlsyXSkgeworCQljYXNlIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVI6CisJCQkvKiBUT0RPICovCisJCQlnb3RvIHJlamVjdDsgLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9TRFRSOgorCQkJLyoKKwkJCSAqIEV4Y2hhbmdlIHRoaXMgbWVzc2FnZSBiZXR3ZWVuIGluaXRpYXRvciBhbmQgdGFyZ2V0LgorCQkJICovCisJCQlpZiAoZGF0YS0+bXNnaW5fbGVuICE9IEVYVEVOREVEX1NEVFJfTEVOICsgMSkgeworCQkJCS8qCisJCQkJICogcmVjZWl2ZWQgaW5hcHByb3ByaWF0ZSBtZXNzYWdlLgorCQkJCSAqLworCQkJCWdvdG8gcmVqZWN0OworCQkJCWJyZWFrOworCQkJfQorCisJCQluc3AzMl9hbmFseXplX3NkdHIoU0NwbnQpOworCisJCQlicmVhazsKKworCQljYXNlIEVYVEVOREVEX0VYVEVOREVEX0lERU5USUZZOgorCQkJLyogU0NTSS1JIG9ubHksIG5vdCBzdXBwb3J0ZWQuICovCisJCQlnb3RvIHJlamVjdDsgLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCisJCQlicmVhazsKKworCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQlnb3RvIHJlamVjdDsgLyogbm90IGltcGxlbWVudGVkIHlldCAqLworCisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJZ290byByZWplY3Q7CisJCX0KKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCWdvdG8gcmVqZWN0OworCX0KKworIHJlc3RhcnQ6CisJaWYgKG1zZ2NsZWFyID09IFRSVUUpIHsKKwkJZGF0YS0+bXNnaW5fbGVuID0gMDsKKworCQkvKgorCQkgKiBJZiByZXN0YXJ0aW5nIEF1dG9TQ1NJLCBidXQgdGhlcmUgYXJlIHNvbWUgbWVzc2FnZSB0byBvdXQKKwkJICogKG1zZ291dF9sZW4gPiAwKSwgc2V0IEF1dG9BVE4sIGFuZCBzZXQgU0NTSU1TR09VVCBhcyAwCisJCSAqIChNVl9WQUxJRCA9IDApLiBXaGVuIGNvbW1hbmRjb250cm9sIGlzIHdyaXR0ZW4gd2l0aAorCQkgKiBBdXRvU0NTSSByZXN0YXJ0LCBhdCB0aGUgc2FtZSB0aW1lIE1zZ091dE9jY3VyIHNob3VsZCBiZQorCQkgKiBoYXBwZW5lZCAoaG93ZXZlciwgc3VjaCBzaXR1YXRpb24gaXMgcmVhbGx5IHBvc3NpYmxlLi4uPykuCisJCSAqLworCQlpZiAoZGF0YS0+bXNnb3V0X2xlbiA+IDApIHsJCisJCQluc3AzMl93cml0ZTQoYmFzZSwgU0NTSV9NU0dfT1VULCAwKTsKKwkJCWNvbW1hbmQgfD0gQVVUT19BVE47CisJCX0KKworCQkvKgorCQkgKiByZXN0YXJ0IEF1dG9TQ1NJCisJCSAqIElmIGl0J3MgZmFpbGVkLCBDT01NQU5EQ09OVFJPTF9BVVRPX0NPTU1BTkRfUEhBU0UgaXMgbmVlZGVkLgorCQkgKi8KKwkJY29tbWFuZCB8PSAoQVVUT19NU0dJTl8wMF9PUl8wNCB8IEFVVE9fTVNHSU5fMDIpOworCisJCS8qCisJCSAqIElmIGN1cnJlbnQgbXNnaW4wMyBpcyBUUlVFLCB0aGVuIGZsYWcgb24uCisJCSAqLworCQlpZiAoZGF0YS0+Y3VyX2x1bnQtPm1zZ2luMDMgPT0gVFJVRSkgeworCQkJY29tbWFuZCB8PSBBVVRPX01TR0lOXzAzOworCQl9CisJCWRhdGEtPmN1cl9sdW50LT5tc2dpbjAzID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJZGF0YS0+bXNnaW5fbGVuKys7CisJfQorCisJLyoKKwkgKiByZXN0YXJ0IEF1dG9TQ1NJCisJICovCisJbnNwMzJfcmVzdGFydF9hdXRvc2NzaShTQ3BudCwgY29tbWFuZCk7CisKKwkvKgorCSAqIHdhaXQgU0NTSSBSRVEgbmVnYXRlIGZvciBSRVEtQUNLIGhhbmRzaGFrZQorCSAqLworCW5zcDMyX3dhaXRfcmVxKGRhdGEsIE5FR0FURSk7CisKKwkvKgorCSAqIG5lZ2F0ZSBTQ1NJIEFDSworCSAqLworCW5zcDMyX3NhY2tfbmVnYXRlKGRhdGEpOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR0lOT0NDVVIsICJleGl0Iik7CisKKwlyZXR1cm47CisKKyByZWplY3Q6CisJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgCisJCSAgImludmFsaWQgb3IgdW5zdXBwb3J0ZWQgTWVzc2FnZUluLCByZWplY3RlZC4gIgorCQkgICJjdXJyZW50IG1zZzogMHgleCAobGVuOiAweCV4KSwgcHJvY2Vzc2luZyBtc2c6IDB4JXgiLAorCQkgIG1zZywgZGF0YS0+bXNnaW5fbGVuLCBtc2d0eXBlKTsKKwluc3AzMl9idWlsZF9yZWplY3QoU0NwbnQpOworCWRhdGEtPm1zZ2luX2xlbiA9IDA7CisKKwlnb3RvIHJlc3RhcnQ7Cit9CisKKy8qCisgKiAKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfYW5hbHl6ZV9zZHRyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgICAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJbnNwMzJfdGFyZ2V0ICAgICAqdGFyZ2V0ICAgICA9IGRhdGEtPmN1cl90YXJnZXQ7CisJbnNwMzJfc3luY190YWJsZSAqc3luY3Q7CisJdW5zaWduZWQgY2hhciAgICAgZ2V0X3BlcmlvZCA9IGRhdGEtPm1zZ2luYnVmWzNdOworCXVuc2lnbmVkIGNoYXIgICAgIGdldF9vZmZzZXQgPSBkYXRhLT5tc2dpbmJ1Zls0XTsKKwlpbnQgICAgICAgICAgICAgICBlbnRyeTsKKwlpbnQgICAgICAgICAgICAgICBzeW5jbnVtOworCisJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX01TR0lOT0NDVVIsICJlbnRlciIpOworCisJc3luY3QgICA9IGRhdGEtPnN5bmN0OworCXN5bmNudW0gPSBkYXRhLT5zeW5jbnVtOworCisJLyoKKwkgKiBJZiB0aGlzIGluaXRpdG9yIHNlbnQgdGhlIFNEVFIgbWVzc2FnZSwgdGhlbiB0YXJnZXQgcmVzcG9uZHMgU0RUUiwKKwkgKiBpbml0aWF0b3IgU1lOQ1JFRywgQUNLV0lEVEggZnJvbSBTRFRSIHBhcmFtZXRlci4KKwkgKiBNZXNzYWdlcyBhcmUgbm90IGFwcHJvcHJpYXRlLCB0aGVuIHNlbmQgYmFjayByZWplY3QgbWVzc2FnZS4KKwkgKiBJZiBpbml0aWF0b3IgZGlkIG5vdCBzZW5kIHRoZSBTRFRSLCBidXQgdGFyZ2V0IHNlbmRzIFNEVFIsIAorCSAqIGluaXRpYXRvciBjYWxjdWxhdG9yIHRoZSBhcHByb3ByaWF0ZSBwYXJhbWV0ZXIgYW5kIHNlbmQgYmFjayBTRFRSLgorCSAqLwkKKwlpZiAodGFyZ2V0LT5zeW5jX2ZsYWcgJiBTRFRSX0lOSVRJQVRPUikgeworCQkvKgorCQkgKiBJbml0aWF0b3Igc2VudCBTRFRSLCB0aGUgdGFyZ2V0IHJlc3BvbmRzIGFuZAorCQkgKiBzZW5kIGJhY2sgbmVnb3RpYXRpb24gU0RUUi4KKwkJICovCisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dJTk9DQ1VSLCAidGFyZ2V0IHJlc3BvbmRzIFNEVFIiKTsKKwkKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgJj0gflNEVFJfSU5JVElBVE9SOworCQl0YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0RPTkU7CisKKwkJLyoKKwkJICogb2Zmc2V0OgorCQkgKi8KKwkJaWYgKGdldF9vZmZzZXQgPiBTWU5DX09GRlNFVCkgeworCQkJLyoKKwkJCSAqIE5lZ290aWF0aW9uIGlzIGZhaWxlZCwgdGhlIHRhcmdldCBzZW5kIGJhY2sKKwkJCSAqIHVuZXhwZWN0ZWQgb2Zmc2V0IHZhbHVlLgorCQkJICovCisJCQlnb3RvIHJlamVjdDsKKwkJfQorCQkKKwkJaWYgKGdldF9vZmZzZXQgPT0gQVNZTkNfT0ZGU0VUKSB7CisJCQkvKgorCQkJICogTmVnb3RpYXRpb24gaXMgc3VjY2VlZGVkLCB0aGUgdGFyZ2V0IHdhbnQKKwkJCSAqIHRvIGZhbGwgYmFjayBpbnRvIGFzeW5jaHJvbm91cyB0cmFuc2ZlciBtb2RlLgorCQkJICovCisJCQlnb3RvIGFzeW5jOworCQl9CisKKwkJLyoKKwkJICogcGVyaW9kOgorCQkgKiAgICBDaGVjayB3aGV0aGVyIHN5bmMgcGVyaW9kIGlzIHRvbyBzaG9ydC4gSWYgdG9vIHNob3J0LAorCQkgKiAgICBmYWxsIGJhY2sgdG8gYXN5bmMgbW9kZS4gSWYgaXQncyBvaywgdGhlbiBpbnZlc3RpZ2F0ZQorCQkgKiAgICB0aGUgcmVjZWl2ZWQgc3luYyBwZXJpb2QuIElmIHN5bmMgcGVyaW9kIGlzIGFjY2VwdGFibGUKKwkJICogICAgYmV0d2VlbiBzeW5jIHRhYmxlIHN0YXJ0X3BlcmlvZCBhbmQgZW5kX3BlcmlvZCwgdGhlbgorCQkgKiAgICBzZXQgdGhpcyBJX1QgbmV4dXMgYXMgc2VudCBvZmZzZXQgYW5kIHBlcmlvZC4KKwkJICogICAgSWYgaXQncyBub3QgYWNjZXB0YWJsZSwgc2VuZCBiYWNrIHJlamVjdCBhbmQgZmFsbCBiYWNrCisJCSAqICAgIHRvIGFzeW5jIG1vZGUuCisJCSAqLworCQlpZiAoZ2V0X3BlcmlvZCA8IGRhdGEtPnN5bmN0WzBdLnBlcmlvZF9udW0pIHsKKwkJCS8qCisJCQkgKiBOZWdvdGlhdGlvbiBpcyBmYWlsZWQsIHRoZSB0YXJnZXQgc2VuZCBiYWNrCisJCQkgKiB1bmV4cGVjdGVkIHBlcmlvZCB2YWx1ZS4KKwkJCSAqLworCQkJZ290byByZWplY3Q7CisJCX0KKworCQllbnRyeSA9IG5zcDMyX3NlYXJjaF9wZXJpb2RfZW50cnkoZGF0YSwgdGFyZ2V0LCBnZXRfcGVyaW9kKTsKKworCQlpZiAoZW50cnkgPCAwKSB7CisJCQkvKgorCQkJICogVGFyZ2V0IHdhbnQgdG8gdXNlIGxvbmcgcGVyaW9kIHdoaWNoIGlzIG5vdCAKKwkJCSAqIGFjY2VwdGFibGUgTmluamFTQ1NJLTMyQmkvVURFLgorCQkJICovCisJCQlnb3RvIHJlamVjdDsKKwkJfQorCisJCS8qCisJCSAqIFNldCBuZXcgc3luYyB0YWJsZSBhbmQgb2Zmc2V0IGluIHRoaXMgSV9UIG5leHVzLgorCQkgKi8KKwkJbnNwMzJfc2V0X3N5bmNfZW50cnkoZGF0YSwgdGFyZ2V0LCBlbnRyeSwgZ2V0X29mZnNldCk7CisJfSBlbHNlIHsKKwkJLyogVGFyZ2V0IHNlbmQgU0RUUiB0byBpbml0aWF0b3IuICovCisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19NU0dJTk9DQ1VSLCAidGFyZ2V0IHNlbmQgU0RUUiIpOworCQorCQl0YXJnZXQtPnN5bmNfZmxhZyB8PSBTRFRSX0lOSVRJQVRPUjsKKworCQkvKiBvZmZzZXQ6ICovCisJCWlmIChnZXRfb2Zmc2V0ID4gU1lOQ19PRkZTRVQpIHsKKwkJCS8qIHNlbmQgYmFjayBhcyBTWU5DX09GRlNFVCAqLworCQkJZ2V0X29mZnNldCA9IFNZTkNfT0ZGU0VUOworCQl9CisKKwkJLyogcGVyaW9kOiAqLworCQlpZiAoZ2V0X3BlcmlvZCA8IGRhdGEtPnN5bmN0WzBdLnBlcmlvZF9udW0pIHsKKwkJCWdldF9wZXJpb2QgPSBkYXRhLT5zeW5jdFswXS5wZXJpb2RfbnVtOworCQl9CisKKwkJZW50cnkgPSBuc3AzMl9zZWFyY2hfcGVyaW9kX2VudHJ5KGRhdGEsIHRhcmdldCwgZ2V0X3BlcmlvZCk7CisKKwkJaWYgKGdldF9vZmZzZXQgPT0gQVNZTkNfT0ZGU0VUIHx8IGVudHJ5IDwgMCkgeworCQkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIHRhcmdldCk7CisJCQluc3AzMl9idWlsZF9zZHRyKFNDcG50LCAwLCBBU1lOQ19PRkZTRVQpOworCQl9IGVsc2UgeworCQkJbnNwMzJfc2V0X3N5bmNfZW50cnkoZGF0YSwgdGFyZ2V0LCBlbnRyeSwgZ2V0X29mZnNldCk7CisJCQluc3AzMl9idWlsZF9zZHRyKFNDcG50LCBnZXRfcGVyaW9kLCBnZXRfb2Zmc2V0KTsKKwkJfQorCX0KKworCXRhcmdldC0+cGVyaW9kID0gZ2V0X3BlcmlvZDsKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfTVNHSU5PQ0NVUiwgImV4aXQiKTsKKwlyZXR1cm47CisKKyByZWplY3Q6CisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBtZXNzYWdlIGlzIHVuYWNjZXB0YWJsZSwgc2VuZCBiYWNrIHRvIHRoZSB0YXJnZXQKKwkgKiB3aXRoIHJlamVjdCBtZXNzYWdlLgorCSAqLworCW5zcDMyX2J1aWxkX3JlamVjdChTQ3BudCk7CisKKyBhc3luYzoKKwluc3AzMl9zZXRfYXN5bmMoZGF0YSwgdGFyZ2V0KTsJLyogc2V0IGFzIEFTWU5DIHRyYW5zZmVyIG1vZGUgKi8KKworCXRhcmdldC0+cGVyaW9kID0gMDsKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfTVNHSU5PQ0NVUiwgImV4aXQ6IHNldCBhc3luYyIpOworCXJldHVybjsKK30KKworCisvKgorICogU2VhcmNoIGNvbmZpZyBlbnRyeSBudW1iZXIgbWF0Y2hlZCBpbiBzeW5jX3RhYmxlIGZyb20gZ2l2ZW4KKyAqIHRhcmdldCBhbmQgc3BlZWQgcGVyaW9kIHZhbHVlLiBJZiBmYWlsZWQgdG8gc2VhcmNoLCByZXR1cm4gbmVnYXRpdmUgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfc2VhcmNoX3BlcmlvZF9lbnRyeShuc3AzMl9od19kYXRhICpkYXRhLAorCQkJCSAgICAgbnNwMzJfdGFyZ2V0ICAqdGFyZ2V0LAorCQkJCSAgICAgdW5zaWduZWQgY2hhciAgcGVyaW9kKQoreworCWludCBpOworCisJaWYgKHRhcmdldC0+bGltaXRfZW50cnkgPj0gZGF0YS0+c3luY251bSkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJsaW1pdF9lbnRyeSBleGNlZWRzIHN5bmNudW0hIik7CisJCXRhcmdldC0+bGltaXRfZW50cnkgPSAwOworCX0KKworCWZvciAoaSA9IHRhcmdldC0+bGltaXRfZW50cnk7IGkgPCBkYXRhLT5zeW5jbnVtOyBpKyspIHsKKwkJaWYgKHBlcmlvZCA+PSBkYXRhLT5zeW5jdFtpXS5zdGFydF9wZXJpb2QgJiYKKwkJICAgIHBlcmlvZCA8PSBkYXRhLT5zeW5jdFtpXS5lbmRfcGVyaW9kKSB7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGdpdmVuIHBlcmlvZCB2YWx1ZSBpcyBvdmVyIHRoZSBzeW5jX3RhYmxlIHZhbHVlLgorCSAqIElmIHNvLCByZXR1cm4gbWF4IHZhbHVlLgorCSAqLworCWlmIChpID09IGRhdGEtPnN5bmNudW0pIHsKKwkJaSA9IC0xOworCX0KKworCXJldHVybiBpOworfQorCisKKy8qCisgKiB0YXJnZXQgPC0+IGluaXRpYXRvciB1c2UgQVNZTkMgdHJhbnNmZXIKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfc2V0X2FzeW5jKG5zcDMyX2h3X2RhdGEgKmRhdGEsIG5zcDMyX3RhcmdldCAqdGFyZ2V0KQoreworCXVuc2lnbmVkIGNoYXIgcGVyaW9kID0gZGF0YS0+c3luY3RbdGFyZ2V0LT5saW1pdF9lbnRyeV0ucGVyaW9kX251bTsKKworCXRhcmdldC0+b2Zmc2V0ICAgICA9IEFTWU5DX09GRlNFVDsKKwl0YXJnZXQtPnBlcmlvZCAgICAgPSAwOworCXRhcmdldC0+c3luY3JlZyAgICA9IFRPX1NZTkNSRUcocGVyaW9kLCBBU1lOQ19PRkZTRVQpOworCXRhcmdldC0+YWNrd2lkdGggICA9IDA7CisJdGFyZ2V0LT5zYW1wbGVfcmVnID0gMDsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19TWU5DLCAic2V0IGFzeW5jIik7Cit9CisKKworLyoKKyAqIHRhcmdldCA8LT4gaW5pdGlhdG9yIHVzZSBtYXhpbXVtIFNZTkMgdHJhbnNmZXIKKyAqLworc3RhdGljIHZvaWQgbnNwMzJfc2V0X21heF9zeW5jKG5zcDMyX2h3X2RhdGEgKmRhdGEsCisJCQkgICAgICAgbnNwMzJfdGFyZ2V0ICAqdGFyZ2V0LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnBlcmlvZCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpvZmZzZXQpCit7CisJdW5zaWduZWQgY2hhciBwZXJpb2RfbnVtLCBhY2t3aWR0aDsKKworCXBlcmlvZF9udW0gPSBkYXRhLT5zeW5jdFt0YXJnZXQtPmxpbWl0X2VudHJ5XS5wZXJpb2RfbnVtOworCSpwZXJpb2QgICAgPSBkYXRhLT5zeW5jdFt0YXJnZXQtPmxpbWl0X2VudHJ5XS5zdGFydF9wZXJpb2Q7CisJYWNrd2lkdGggICA9IGRhdGEtPnN5bmN0W3RhcmdldC0+bGltaXRfZW50cnldLmFja3dpZHRoOworCSpvZmZzZXQgICAgPSBTWU5DX09GRlNFVDsKKworCXRhcmdldC0+c3luY3JlZyAgICA9IFRPX1NZTkNSRUcocGVyaW9kX251bSwgKm9mZnNldCk7CisJdGFyZ2V0LT5hY2t3aWR0aCAgID0gYWNrd2lkdGg7CisJdGFyZ2V0LT5vZmZzZXQgICAgID0gKm9mZnNldDsKKwl0YXJnZXQtPnNhbXBsZV9yZWcgPSAwOyAgICAgICAvKiBkaXNhYmxlIFNSRVEgc2FtcGxpbmcgKi8KK30KKworCisvKgorICogdGFyZ2V0IDwtPiBpbml0aWF0b3IgdXNlIGVudHJ5IG51bWJlciBzcGVlZAorICovCitzdGF0aWMgdm9pZCBuc3AzMl9zZXRfc3luY19lbnRyeShuc3AzMl9od19kYXRhICpkYXRhLAorCQkJCSBuc3AzMl90YXJnZXQgICp0YXJnZXQsCisJCQkJIGludCAgICAgICAgICAgIGVudHJ5LAorCQkJCSB1bnNpZ25lZCBjaGFyICBvZmZzZXQpCit7CisJdW5zaWduZWQgY2hhciBwZXJpb2QsIGFja3dpZHRoLCBzYW1wbGVfcmF0ZTsKKworCXBlcmlvZCAgICAgID0gZGF0YS0+c3luY3RbZW50cnldLnBlcmlvZF9udW07CisJYWNrd2lkdGggICAgPSBkYXRhLT5zeW5jdFtlbnRyeV0uYWNrd2lkdGg7CisJb2Zmc2V0ICAgICAgPSBvZmZzZXQ7CisJc2FtcGxlX3JhdGUgPSBkYXRhLT5zeW5jdFtlbnRyeV0uc2FtcGxlX3JhdGU7CisKKwl0YXJnZXQtPnN5bmNyZWcgICAgPSBUT19TWU5DUkVHKHBlcmlvZCwgb2Zmc2V0KTsKKwl0YXJnZXQtPmFja3dpZHRoICAgPSBhY2t3aWR0aDsKKwl0YXJnZXQtPm9mZnNldCAgICAgPSBvZmZzZXQ7CisJdGFyZ2V0LT5zYW1wbGVfcmVnID0gc2FtcGxlX3JhdGUgfCBTQU1QTElOR19FTkFCTEU7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfU1lOQywgInNldCBzeW5jIik7Cit9CisKKworLyoKKyAqIEl0IHdhaXRzIHVudGlsIFNDU0kgUkVRIGJlY29tZXMgYXNzZXJ0aW9uIG9yIG5lZ2F0aW9uIHN0YXRlLgorICoKKyAqIE5vdGU6IElmIG5zcDMyX21zZ2luX29jY3VyIGlzIGNhbGxlZCwgd2UgYXNzZXJ0cyBTQ1NJIEFDSy4gVGhlbgorICogICAgIGNvbm5lY3RlZCB0YXJnZXQgcmVzcG9uZHMgU0NTSSBSRVEgbmVnYXRpb24uICBXZSBoYXZlIHRvIHdhaXQKKyAqICAgICBTQ1NJIFJFUSBiZWNvbWVzIG5lZ2F0aW9uIGluIG9yZGVyIHRvIG5lZ2F0ZSBTQ1NJIEFDSyBzaWduYWwgZm9yCisgKiAgICAgUkVRLUFDSyBoYW5kc2hha2UuCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3dhaXRfcmVxKG5zcDMyX2h3X2RhdGEgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgICAgICA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWludCAgICAgICAgICAgd2FpdF90aW1lID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJ1cywgcmVxX2JpdDsKKworCWlmICghKChzdGF0ZSA9PSBBU1NFUlQpIHx8IChzdGF0ZSA9PSBORUdBVEUpKSkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJ1bmtub3duIHN0YXRlIGRlc2lnbmF0aW9uIik7CisJfQorCS8qIFJFUSBpcyBCSVQoNSkgKi8KKwlyZXFfYml0ID0gKHN0YXRlID09IEFTU0VSVCA/IEJVU01PTl9SRVEgOiAwKTsKKworCWRvIHsKKwkJYnVzID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfTU9OSVRPUik7CisJCWlmICgoYnVzICYgQlVTTU9OX1JFUSkgPT0gcmVxX2JpdCkgeworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1dBSVQsIAorCQkJCSAgIndhaXRfdGltZTogJWQiLCB3YWl0X3RpbWUpOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxKTsKKwkJd2FpdF90aW1lKys7CisJfSB3aGlsZSAod2FpdF90aW1lIDwgUkVRU0FDS19USU1FT1VUX1RJTUUpOworCisJbnNwMzJfbXNnKEtFUk5fV0FSTklORywgIndhaXQgUkVRIHRpbWVvdXQsIHJlcV9iaXQ6IDB4JXgiLCByZXFfYml0KTsKK30KKworLyoKKyAqIEl0IHdhaXRzIHVudGlsIFNDU0kgU0FDSyBiZWNvbWVzIGFzc2VydGlvbiBvciBuZWdhdGlvbiBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgbnNwMzJfd2FpdF9zYWNrKG5zcDMyX2h3X2RhdGEgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgICAgICA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWludCAgICAgICAgICAgd2FpdF90aW1lID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJ1cywgYWNrX2JpdDsKKworCWlmICghKChzdGF0ZSA9PSBBU1NFUlQpIHx8IChzdGF0ZSA9PSBORUdBVEUpKSkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJ1bmtub3duIHN0YXRlIGRlc2lnbmF0aW9uIik7CisJfQorCS8qIEFDSyBpcyBCSVQoNCkgKi8KKwlhY2tfYml0ID0gKHN0YXRlID09IEFTU0VSVCA/IEJVU01PTl9BQ0sgOiAwKTsKKworCWRvIHsKKwkJYnVzID0gbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfTU9OSVRPUik7CisJCWlmICgoYnVzICYgQlVTTU9OX0FDSykgPT0gYWNrX2JpdCkgeworCQkJbnNwMzJfZGJnKE5TUDMyX0RFQlVHX1dBSVQsCisJCQkJICAid2FpdF90aW1lOiAlZCIsIHdhaXRfdGltZSk7CisJCQlyZXR1cm47CisJCX0KKwkJdWRlbGF5KDEpOworCQl3YWl0X3RpbWUrKzsKKwl9IHdoaWxlICh3YWl0X3RpbWUgPCBSRVFTQUNLX1RJTUVPVVRfVElNRSk7CisKKwluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAid2FpdCBTQUNLIHRpbWVvdXQsIGFja19iaXQ6IDB4JXgiLCBhY2tfYml0KTsKK30KKworLyoKKyAqIGFzc2VydCBTQ1NJIEFDSworICoKKyAqIE5vdGU6IFNDU0kgQUNLIGFzc2VydGlvbiBuZWVkcyB3aXRoIEFDS0VOQj0xLCBBVVRPRElSRUNUSU9OPTEuCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3NhY2tfYXNzZXJ0KG5zcDMyX2h3X2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50ICBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJdW5zaWduZWQgY2hhciBidXNjdHJsOworCisJYnVzY3RybCAgPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MKTsKKwlidXNjdHJsCXw9IChCVVNDVExfQUNLIHwgQVVUT0RJUkVDVElPTiB8IEFDS0VOQik7CisJbnNwMzJfd3JpdGUxKGJhc2UsIFNDU0lfQlVTX0NPTlRST0wsIGJ1c2N0cmwpOworfQorCisvKgorICogbmVnYXRlIFNDU0kgQUNLCisgKi8KK3N0YXRpYyB2b2lkIG5zcDMyX3NhY2tfbmVnYXRlKG5zcDMyX2h3X2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50ICBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJdW5zaWduZWQgY2hhciBidXNjdHJsOworCisJYnVzY3RybCAgPSBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MKTsKKwlidXNjdHJsCSY9IH5CVVNDVExfQUNLOworCW5zcDMyX3dyaXRlMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MLCBidXNjdHJsKTsKK30KKworCisKKy8qCisgKiBOb3RlOiBuX2lvX3BvcnQgaXMgZGVmaW5lZCBhcyAweDdmIGJlY2F1c2UgSS9PIHJlZ2lzdGVyIHBvcnQgaXMKKyAqCSBhc3NpZ25lZCBhczoKKyAqCTB4ODAwLTB4OGZmOiBtZW1vcnkgbWFwcGVkIEkvTyBwb3J0CisgKgkweDkwMC0weGJmZjogKG1hcCBzYW1lIDB4ODAwLTB4OGZmIEkvTyBwb3J0IGltYWdlIHJlcGVhdGVkbHkpCisgKgkweGMwMC0weGZmZjogQ2FyZEJ1cyBzdGF0dXMgcmVnaXN0ZXJzCisgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKyNkZWZpbmUgREVURUNUX09LIDAKKyNkZWZpbmUgREVURUNUX05HIDEKKyNkZWZpbmUgUENJREVWICAgIHBkZXYKK3N0YXRpYyBpbnQgbnNwMzJfZGV0ZWN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorI2Vsc2UKKyNkZWZpbmUgREVURUNUX09LIDEKKyNkZWZpbmUgREVURUNUX05HIDAKKyNkZWZpbmUgUENJREVWICAgIChkYXRhLT5QY2kpCitzdGF0aWMgaW50IG5zcDMyX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKnNodCkKKyNlbmRpZgoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CS8qIHJlZ2lzdGVyZWQgaG9zdCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcmVzb3VyY2UgICpyZXM7CisJbnNwMzJfaHdfZGF0YSAgICAqZGF0YTsKKwlpbnQgICAgICAgICAgICAgICByZXQ7CisJaW50ICAgICAgICAgICAgICAgaSwgajsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19SRUdJU1RFUiwgImVudGVyIik7CisKKwkvKgorCSAqIHJlZ2lzdGVyIHRoaXMgSEJBIGFzIFNDU0kgZGV2aWNlCisJICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmbnNwMzJfdGVtcGxhdGUsIHNpemVvZihuc3AzMl9od19kYXRhKSk7CisjZWxzZQorCWhvc3QgPSBzY3NpX3JlZ2lzdGVyKHNodCwgc2l6ZW9mKG5zcDMyX2h3X2RhdGEpKTsKKyNlbmRpZgorCWlmIChob3N0ID09IE5VTEwpIHsKKwkJbnNwMzJfbXNnIChLRVJOX0VSUiwgImZhaWxlZCB0byBzY3NpIHJlZ2lzdGVyIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qCisJICogc2V0IG5zcDMyX2h3X2RhdGEKKwkgKi8KKwlkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKworCW1lbWNweShkYXRhLCAmbnNwMzJfZGF0YV9iYXNlLCBzaXplb2YobnNwMzJfaHdfZGF0YSkpOworCisJaG9zdC0+aXJxICAgICAgID0gZGF0YS0+SXJxTnVtYmVyOworCWhvc3QtPmlvX3BvcnQgICA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWhvc3QtPnVuaXF1ZV9pZCA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWhvc3QtPm5faW9fcG9ydAk9IGRhdGEtPk51bUFkZHJlc3M7CisJaG9zdC0+YmFzZSAgICAgID0gKHVuc2lnbmVkIGxvbmcpZGF0YS0+TW1pb0FkZHJlc3M7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw2MykpCisJc2NzaV9zZXRfZGV2aWNlKGhvc3QsICZQQ0lERVYtPmRldik7CisjZWxzZQorCXNjc2lfc2V0X3BjaV9kZXZpY2UoaG9zdCwgUENJREVWKTsKKyNlbmRpZgorCisJZGF0YS0+SG9zdCAgICAgID0gaG9zdDsKKwlzcGluX2xvY2tfaW5pdCgmKGRhdGEtPkxvY2spKTsKKworCWRhdGEtPmN1cl9sdW50ICAgPSBOVUxMOworCWRhdGEtPmN1cl90YXJnZXQgPSBOVUxMOworCisJLyoKKwkgKiBCdXMgbWFzdGVyIHRyYW5zZmVyIG1vZGUgaXMgc3VwcG9ydGVkIGN1cnJlbnRseS4KKwkgKi8KKwlkYXRhLT50cmFuc19tZXRob2QgPSBOU1AzMl9UUkFOU0ZFUl9CVVNNQVNURVI7CisKKwkvKgorCSAqIFNldCBjbG9jayBkaXYsIENMT0NLXzQgKEhCQSBoYXMgb3duIGV4dGVybmFsIGNsb2NrLCBhbmQKKwkgKiBkaXZpZGluZyAqIDEwMG5zLzQpLgorCSAqIEN1cnJlbnRseSBDTE9DS180IGhhcyBvbmx5IHRlc3RlZCwgbm90IGZvciBDTE9DS18yL1BDSUNMSyB5ZXQuCisJICovCisJZGF0YS0+Y2xvY2sgPSBDTE9DS180OworCisJLyoKKwkgKiBTZWxlY3QgYXBwcm9wcmlhdGUgbnNwMzJfc3luY190YWJsZSBhbmQgc2V0IElfQ0xPQ0tESVYuCisJICovCisJc3dpdGNoIChkYXRhLT5jbG9jaykgeworCWNhc2UgQ0xPQ0tfNDoKKwkJLyogSWYgZGF0YS0+Y2xvY2sgaXMgQ0xPQ0tfNCwgdGhlbiBzZWxlY3QgNDBNIHN5bmMgdGFibGUuICovCisJCWRhdGEtPnN5bmN0ICAgPSBuc3AzMl9zeW5jX3RhYmxlXzQwTTsKKwkJZGF0YS0+c3luY251bSA9IEFSUkFZX1NJWkUobnNwMzJfc3luY190YWJsZV80ME0pOworCQlicmVhazsKKwljYXNlIENMT0NLXzI6CisJCS8qIElmIGRhdGEtPmNsb2NrIGlzIENMT0NLXzIsIHRoZW4gc2VsZWN0IDIwTSBzeW5jIHRhYmxlLiAqLworCQlkYXRhLT5zeW5jdCAgID0gbnNwMzJfc3luY190YWJsZV8yME07CisJCWRhdGEtPnN5bmNudW0gPSBBUlJBWV9TSVpFKG5zcDMyX3N5bmNfdGFibGVfMjBNKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lDTEs6CisJCS8qIElmIGRhdGEtPmNsb2NrIGlzIFBDSUNMSywgdGhlbiBzZWxlY3QgcGNpIHN5bmMgdGFibGUuICovCisJCWRhdGEtPnN5bmN0ICAgPSBuc3AzMl9zeW5jX3RhYmxlX3BjaTsKKwkJZGF0YS0+c3luY251bSA9IEFSUkFZX1NJWkUobnNwMzJfc3luY190YWJsZV9wY2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLAorCQkJICAiSW52YWxpZCBjbG9jayBkaXYgaXMgc2VsZWN0ZWQsIHNldCBDTE9DS180LiIpOworCQkvKiBVc2UgZGVmYXVsdCB2YWx1ZSBDTE9DS180ICovCisJCWRhdGEtPmNsb2NrICAgPSBDTE9DS180OworCQlkYXRhLT5zeW5jdCAgID0gbnNwMzJfc3luY190YWJsZV80ME07CisJCWRhdGEtPnN5bmNudW0gPSBBUlJBWV9TSVpFKG5zcDMyX3N5bmNfdGFibGVfNDBNKTsKKwl9CisKKwkvKgorCSAqIHNldHVwIG5zcDMyX2x1bnQKKwkgKi8KKworCS8qCisJICogc2V0dXAgRE1BIAorCSAqLworCWlmIChwY2lfc2V0X2RtYV9tYXNrKFBDSURFViwgMHhmZmZmZmZmZlVMKSAhPSAwKSB7CisJCW5zcDMyX21zZyAoS0VSTl9FUlIsICJmYWlsZWQgdG8gc2V0IFBDSSBETUEgbWFzayIpOworCQlnb3RvIHNjc2lfdW5yZWdpc3RlcjsKKwl9CisKKwkvKgorCSAqIGFsbG9jYXRlIGF1dG9wYXJhbSBETUEgcmVzb3VyY2UuCisJICovCisJZGF0YS0+YXV0b3BhcmFtID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoUENJREVWLCBzaXplb2YobnNwMzJfYXV0b3BhcmFtKSwgJihkYXRhLT5hdXRvX3BhZGRyKSk7CisJaWYgKGRhdGEtPmF1dG9wYXJhbSA9PSBOVUxMKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgImZhaWxlZCB0byBhbGxvY2F0ZSBETUEgbWVtb3J5Iik7CisJCWdvdG8gc2NzaV91bnJlZ2lzdGVyOworCX0KKworCS8qCisJICogYWxsb2NhdGUgc2NhdHRlci1nYXRoZXIgRE1BIHJlc291cmNlLgorCSAqLworCWRhdGEtPnNnX2xpc3QgPSBwY2lfYWxsb2NfY29uc2lzdGVudChQQ0lERVYsIE5TUDMyX1NHX1RBQkxFX1NJWkUsCisJCQkJCSAgICAgJihkYXRhLT5zZ19wYWRkcikpOworCWlmIChkYXRhLT5zZ19saXN0ID09IE5VTEwpIHsKKwkJbnNwMzJfbXNnKEtFUk5fRVJSLCAiZmFpbGVkIHRvIGFsbG9jYXRlIERNQSBtZW1vcnkiKTsKKwkJZ290byBmcmVlX2F1dG9wYXJhbTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT5sdW50KTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGRhdGEtPmx1bnRbMF0pOyBqKyspIHsKKwkJCWludCBvZmZzZXQgPSBpICogQVJSQVlfU0laRShkYXRhLT5sdW50WzBdKSArIGo7CisJCQluc3AzMl9sdW50IHRtcCA9IHsKKwkJCQkuU0NwbnQgICAgICAgPSBOVUxMLAorCQkJCS5zYXZlX2RhdHAgICA9IDAsCisJCQkJLm1zZ2luMDMgICAgID0gRkFMU0UsCisJCQkJLnNnX251bSAgICAgID0gMCwKKwkJCQkuY3VyX2VudHJ5ICAgPSAwLAorCQkJCS5zZ2x1biAgICAgICA9ICYoZGF0YS0+c2dfbGlzdFtvZmZzZXRdKSwKKwkJCQkuc2dsdW5fcGFkZHIgPSBkYXRhLT5zZ19wYWRkciArIChvZmZzZXQgKiBzaXplb2YobnNwMzJfc2dsdW4pKSwKKwkJCX07CisKKwkJCWRhdGEtPmx1bnRbaV1bal0gPSB0bXA7CisJCX0KKwl9CisKKwkvKgorCSAqIHNldHVwIHRhcmdldAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPnRhcmdldCk7IGkrKykgeworCQluc3AzMl90YXJnZXQgKnRhcmdldCA9ICYoZGF0YS0+dGFyZ2V0W2ldKTsKKworCQl0YXJnZXQtPmxpbWl0X2VudHJ5ICA9IDA7CisJCXRhcmdldC0+c3luY19mbGFnICAgID0gMDsKKwkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIHRhcmdldCk7CisJfQorCisJLyoKKwkgKiBFRVBST00gY2hlY2sKKwkgKi8KKwlyZXQgPSBuc3AzMl9nZXRwcm9tX3BhcmFtKGRhdGEpOworCWlmIChyZXQgPT0gRkFMU0UpIHsKKwkJZGF0YS0+cmVzZXR0aW1lID0gMzsJLyogZGVmYXVsdCAzICovCisJfQorCisJLyoKKwkgKiBzZXR1cCBIQkEKKwkgKi8KKwluc3AzMmh3X2luaXQoZGF0YSk7CisKKwlzbnByaW50ZihkYXRhLT5pbmZvX3N0ciwgc2l6ZW9mKGRhdGEtPmluZm9fc3RyKSwKKwkJICJOaW5qYVNDU0ktMzJCaS9VREU6IGlycSAlZCwgaW8gMHglbHgrMHgleCIsCisJCSBob3N0LT5pcnEsIGhvc3QtPmlvX3BvcnQsIGhvc3QtPm5faW9fcG9ydCk7CisKKwkvKgorCSAqIFNDU0kgYnVzIHJlc2V0CisJICoKKwkgKiBOb3RlOiBJdCdzIGltcG9ydGFudCB0byByZXNldCBTQ1NJIGJ1cyBpbiBpbml0aWFsaXphdGlvbiBwaGFzZS4KKwkgKiAgICAgTmluamFTQ1NJLTMyQmkvVURFIEhCQSBFRVBST00gc2VlbXMgdG8gZXhjaGFuZ2UgU0RUUiB3aGVuCisJICogICAgIHN5c3RlbSBpcyBjb21pbmcgdXAsIHNvIFNDU0kgZGV2aWNlcyBjb25uZWN0ZWQgdG8gSEJBIGlzIHNldCBhcworCSAqICAgICB1bi1hc3luY2hyb25vdXMgbW9kZS4gIEl0IGJyaW5ncyB0aGUgbWVyaXQgdGhhdCB0aGlzIEhCQSBpcworCSAqICAgICByZWFkeSB0byBzdGFydCBzeW5jaHJvbm91cyB0cmFuc2ZlciB3aXRob3V0IGFueSBwcmVwYXJhdGlvbiwKKwkgKiAgICAgYnV0IHdlIGFyZSBkaWZmaWN1bHQgdG8gY29udHJvbCB0cmFuc2ZlciBzcGVlZC4gIEluIGFkZGl0aW9uLAorCSAqICAgICBpdCBwcmV2ZW50cyBkZXZpY2UgdHJhbnNmZXIgc3BlZWQgZnJvbSBlZmZlY3RpbmcgRUVQUk9NIHN0YXJ0LXVwCisJICogICAgIFNEVFIuICBOaW5qYVNDU0ktMzJCaS9VREUgaGFzIHRoZSBmZWF0dXJlIGlmIEVFUFJPTSBpcyBzZXQgYXMKKwkgKiAgICAgQXV0byBNb2RlLCB0aGVuIEZBU1QtMTBNIGlzIHNlbGVjdGVkIHdoZW4gU0NTSSBkZXZpY2VzIGFyZQorCSAqICAgICBjb25uZWN0ZWQgc2FtZSBvciBtb3JlIHRoYW4gNCBkZXZpY2VzLiAgSXQgc2hvdWxkIGJlIGF2b2lkZWQKKwkgKiAgICAgZGVwZW5kaW5nIG9uIHRoaXMgc3BlY2lmaWNhdGlvbi4gVGh1cywgcmVzZXR0aW5nIHRoZSBTQ1NJIGJ1cworCSAqICAgICByZXN0b3JlcyBhbGwgY29ubmVjdGVkIFNDU0kgZGV2aWNlcyB0byBhc3luY2hyb25vdXMgbW9kZSwgdGhlbgorCSAqICAgICB0aGlzIGRyaXZlciBzZXQgU0RUUiBzYWZlbHkgbGF0ZXIsIGFuZCB3ZSBjYW4gY29udHJvbCBhbGwgU0NTSQorCSAqICAgICBkZXZpY2UgdHJhbnNmZXIgbW9kZS4KKwkgKi8KKwluc3AzMl9kb19idXNfcmVzZXQoZGF0YSk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGRvX25zcDMyX2lzciwKKwkJCSAgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCAibnNwMzIiLCBkYXRhKTsKKwlpZiAocmV0IDwgMCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJVbmFibGUgdG8gYWxsb2NhdGUgSVJRIGZvciBOaW5qYVNDU0kzMiAiCisJCQkgICJTQ1NJIFBDSSBjb250cm9sbGVyLiBJbnRlcnJ1cHQ6ICVkIiwgaG9zdC0+aXJxKTsKKwkJZ290byBmcmVlX3NnX2xpc3Q7CisJfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFBDSSBJTyByZWdpc3RlcgorICAgICAgICAgKi8KKwlyZXMgPSByZXF1ZXN0X3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQsICJuc3AzMiIpOworCWlmIChyZXMgPT0gTlVMTCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsIAorCQkJICAiSS9PIHJlZ2lvbiAweCVseCsweCVseCBpcyBhbHJlYWR5IHVzZWQiLAorCQkJICBkYXRhLT5CYXNlQWRkcmVzcywgZGF0YS0+TnVtQWRkcmVzcyk7CisJCWdvdG8gZnJlZV9pcnE7CisgICAgICAgIH0KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorCXNjc2lfYWRkX2hvc3QgKGhvc3QsICZQQ0lERVYtPmRldik7CisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisjZW5kaWYKKwlwY2lfc2V0X2RydmRhdGEoUENJREVWLCBob3N0KTsKKwlyZXR1cm4gREVURUNUX09LOworCisgZnJlZV9pcnE6CisJZnJlZV9pcnEoaG9zdC0+aXJxLCBkYXRhKTsKKworIGZyZWVfc2dfbGlzdDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KFBDSURFViwgTlNQMzJfU0dfVEFCTEVfU0laRSwKKwkJCSAgICBkYXRhLT5zZ19saXN0LCBkYXRhLT5zZ19wYWRkcik7CisKKyBmcmVlX2F1dG9wYXJhbToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KFBDSURFViwgc2l6ZW9mKG5zcDMyX2F1dG9wYXJhbSksCisJCQkgICAgZGF0YS0+YXV0b3BhcmFtLCBkYXRhLT5hdXRvX3BhZGRyKTsKKwkKKyBzY3NpX3VucmVnaXN0ZXI6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworIGVycjoKKwlyZXR1cm4gREVURUNUX05HOworfQorI3VuZGVmIERFVEVDVF9PSworI3VuZGVmIERFVEVDVF9ORworI3VuZGVmIFBDSURFVgorCitzdGF0aWMgaW50IG5zcDMyX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwluc3AzMl9od19kYXRhICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKworCWlmIChkYXRhLT5hdXRvcGFyYW0pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkYXRhLT5QY2ksIHNpemVvZihuc3AzMl9hdXRvcGFyYW0pLAorCQkJCSAgICBkYXRhLT5hdXRvcGFyYW0sIGRhdGEtPmF1dG9fcGFkZHIpOworCX0KKworCWlmIChkYXRhLT5zZ19saXN0KSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGF0YS0+UGNpLCBOU1AzMl9TR19UQUJMRV9TSVpFLAorCQkJCSAgICBkYXRhLT5zZ19saXN0LCBkYXRhLT5zZ19wYWRkcik7CisJfQorCisJaWYgKGhvc3QtPmlycSkgeworCQlmcmVlX2lycShob3N0LT5pcnEsIGRhdGEpOworCX0KKworCWlmIChob3N0LT5pb19wb3J0ICYmIGhvc3QtPm5faW9fcG9ydCkgeworCQlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCBob3N0LT5uX2lvX3BvcnQpOworCX0KKworCWlmIChkYXRhLT5NbWlvQWRkcmVzcykgeworCQlpb3VubWFwKGRhdGEtPk1taW9BZGRyZXNzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm5zcDMyX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopc2hwbnQtPmhvc3RkYXRhOworCisJcmV0dXJuIGRhdGEtPmluZm9fc3RyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBlcnJvciBoYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJbnNwMzJfaHdfZGF0YSAqZGF0YSA9IChuc3AzMl9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50ICAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisKKwluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAiYWJvcnQiKTsKKworCWlmIChkYXRhLT5jdXJfbHVudC0+U0NwbnQgPT0gTlVMTCkgeworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTUkVTRVQsICJhYm9ydCBmYWlsZWQiKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpZiAoZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnICYgKFNEVFJfSU5JVElBVE9SIHwgU0RUUl9UQVJHRVQpKSB7CisJCS8qIHJlc2V0IFNEVFIgbmVnb3RpYXRpb24gKi8KKwkJZGF0YS0+Y3VyX3RhcmdldC0+c3luY19mbGFnID0gMDsKKwkJbnNwMzJfc2V0X2FzeW5jKGRhdGEsIGRhdGEtPmN1cl90YXJnZXQpOworCX0KKworCW5zcDMyX3dyaXRlMihiYXNlLCBUUkFOU0ZFUl9DT05UUk9MLCAwKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgQk1fQ05ULCAgICAgICAgICAgMCk7CisKKwlTQ3BudC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCW5zcDMyX3Njc2lfZG9uZShTQ3BudCk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTUkVTRVQsICJhYm9ydCBzdWNjZXNzIik7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbnNwMzJfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCW5zcDMyX2h3X2RhdGEgKmRhdGEgPSAobnNwMzJfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCAgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCisJbnNwMzJfbXNnKEtFUk5fSU5GTywgIkJ1cyBSZXNldCIpOwkKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTUkVTRVQsICJTQ3BudD0weCV4IiwgU0NwbnQpOworCisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCBJUlFfQ09OVFJPTF9BTExfSVJRX01BU0spOworCW5zcDMyX2RvX2J1c19yZXNldChkYXRhKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgSVJRX0NPTlRST0wsIDApOworCisJcmV0dXJuIFNVQ0NFU1M7CS8qIFNDU0kgYnVzIHJlc2V0IGlzIHN1Y2NlZWRlZCBhdCBhbnkgdGltZS4gKi8KK30KKworc3RhdGljIHZvaWQgbnNwMzJfZG9fYnVzX3Jlc2V0KG5zcDMyX2h3X2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50ICAgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCXVuc2lnbmVkIHNob3J0IGludHJkYXQ7CisJaW50IGk7CisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfQlVTUkVTRVQsICJpbiIpOworCisJLyoKKwkgKiBzdG9wIGFsbCB0cmFuc2ZlcgorCSAqIGNsZWFyIFRSQU5TRkVSQ09OVFJPTF9CTV9TVEFSVAorCSAqIGNsZWFyIGNvdW50ZXIKKwkgKi8KKwluc3AzMl93cml0ZTIoYmFzZSwgVFJBTlNGRVJfQ09OVFJPTCwgMCk7CisJbnNwMzJfd3JpdGU0KGJhc2UsIEJNX0NOVCwgICAgICAgICAgIDApOworCW5zcDMyX3dyaXRlNChiYXNlLCBDTFJfQ09VTlRFUiwgICAgICBDTFJDT1VOVEVSX0FMTE1BU0spOworCisJLyoKKwkgKiBmYWxsIGJhY2sgdG8gYXN5bmNocm9ub3VzIHRyYW5zZmVyIG1vZGUKKwkgKiBpbml0aWFsaXplIFNEVFIgbmVnb3RpYXRpb24gZmxhZworCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPnRhcmdldCk7IGkrKykgeworCQluc3AzMl90YXJnZXQgKnRhcmdldCA9ICZkYXRhLT50YXJnZXRbaV07CisKKwkJdGFyZ2V0LT5zeW5jX2ZsYWcgPSAwOworCQluc3AzMl9zZXRfYXN5bmMoZGF0YSwgdGFyZ2V0KTsKKwl9CisKKwkvKgorCSAqIHJlc2V0IFNDU0kgYnVzCisJICovCisJbnNwMzJfd3JpdGUxKGJhc2UsIFNDU0lfQlVTX0NPTlRST0wsIEJVU0NUTF9SU1QpOworCXVkZWxheShSRVNFVF9IT0xEX1RJTUUpOworCW5zcDMyX3dyaXRlMShiYXNlLCBTQ1NJX0JVU19DT05UUk9MLCAwKTsKKwlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaW50cmRhdCA9IG5zcDMyX3JlYWQyKGJhc2UsIElSUV9TVEFUVVMpOyAvKiBkdW1teSByZWFkICovCisJCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19CVVNSRVNFVCwgImlycToxOiAweCV4IiwgaW50cmRhdCk7CisgICAgICAgIH0KKworCWRhdGEtPkN1cnJlbnRTQyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbnNwMzJfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwl1bnNpZ25lZCBpbnQgICAgICBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwluc3AzMl9od19kYXRhICAgICpkYXRhID0gKG5zcDMyX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJIb3N0IFJlc2V0Iik7CQorCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19CVVNSRVNFVCwgIlNDcG50PTB4JXgiLCBTQ3BudCk7CisKKwluc3AzMmh3X2luaXQoZGF0YSk7CisJbnNwMzJfd3JpdGUyKGJhc2UsIElSUV9DT05UUk9MLCBJUlFfQ09OVFJPTF9BTExfSVJRX01BU0spOworCW5zcDMyX2RvX2J1c19yZXNldChkYXRhKTsKKwluc3AzMl93cml0ZTIoYmFzZSwgSVJRX0NPTlRST0wsIDApOworCisJcmV0dXJuIFNVQ0NFU1M7CS8qIEhvc3QgcmVzZXQgaXMgc3VjY2VlZGVkIGF0IGFueSB0aW1lLiAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRUVQUk9NIGhhbmRsZXIKKyAqLworCisvKgorICogZ2V0dGluZyBFRVBST00gcGFyYW1ldGVyCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfZ2V0cHJvbV9wYXJhbShuc3AzMl9od19kYXRhICpkYXRhKQoreworCWludCB2ZW5kb3IgPSBkYXRhLT5wY2lfZGV2aWQtPnZlbmRvcjsKKwlpbnQgZGV2aWNlID0gZGF0YS0+cGNpX2RldmlkLT5kZXZpY2U7CisJaW50IHJldCwgdmFsLCBpOworCisJLyoKKwkgKiBFRVBST00gY2hlY2tpbmcuCisJICovCisJcmV0ID0gbnNwMzJfcHJvbV9yZWFkKGRhdGEsIDB4N2UpOworCWlmIChyZXQgIT0gMHg1NSkgeworCQluc3AzMl9tc2coS0VSTl9JTkZPLCAiTm8gRUVQUk9NIGRldGVjdGVkOiAweCV4IiwgcmV0KTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXQgPSBuc3AzMl9wcm9tX3JlYWQoZGF0YSwgMHg3Zik7CisJaWYgKHJldCAhPSAweGFhKSB7CisJCW5zcDMyX21zZyhLRVJOX0lORk8sICJJbnZhbGlkIG51bWJlcjogMHgleCIsIHJldCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvKgorCSAqIGNoZWNrIEVFUFJPTSB0eXBlCisJICovCisJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1dPUktCSVQgJiYKKwkgICAgZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfV09SS0JJVF9TVEFOREFSRCkgeworCQlyZXQgPSBuc3AzMl9nZXRwcm9tX2MxNihkYXRhKTsKKwl9IGVsc2UgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1dPUktCSVQgJiYKKwkJICAgZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklCX0xPR0lURUMpIHsKKwkJcmV0ID0gbnNwMzJfZ2V0cHJvbV9hdDI0KGRhdGEpOworCX0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfV09SS0JJVCAmJgorCQkgICBkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJVREVfTUVMQ08gKSB7CisJCXJldCA9IG5zcDMyX2dldHByb21fYXQyNChkYXRhKTsKKwl9IGVsc2UgeworCQluc3AzMl9tc2coS0VSTl9XQVJOSU5HLCAiVW5rbm93biBFRVBST00iKTsKKwkJcmV0ID0gRkFMU0U7CisJfQorCisJLyogZm9yIGRlYnVnIDogU1BST00gZGF0YSBmdWxsIGNoZWNraW5nICovCisJZm9yIChpID0gMDsgaSA8PSAweDFmOyBpKyspIHsKKwkJdmFsID0gbnNwMzJfcHJvbV9yZWFkKGRhdGEsIGkpOworCQluc3AzMl9kYmcoTlNQMzJfREVCVUdfRUVQUk9NLAorCQkJICAicm9tIGFkZHJlc3MgMHgleCA6IDB4JXgiLCBpLCB2YWwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIEFUMjRDMDFBIChMb2dpdGVjOiBMSEEtNjAwUyksIEFUMjRDMDIgKE1lbGNvIEJ1ZmZhbG86IElGQy1VU0xQKSBkYXRhIG1hcDoKKyAqCisgKiAgIFJPTUFERFIKKyAqICAgMHgwMCAtIDB4MDYgOiAgRGV2aWNlIFN5bmNocm9ub3VzIFRyYW5zZmVyIFBlcmlvZCAoU0NTSSBJRCAwIC0gNikgCisgKgkJCVZhbHVlIDB4MDogQVNZTkMsIDB4MGM6IFVsdHJhLTIwTSwgMHgxOTogRmFzdC0xME0KKyAqICAgMHgwNyAgICAgICAgOiAgSEJBIFN5bmNocm9ub3VzIFRyYW5zZmVyIFBlcmlvZAorICoJCQlWYWx1ZSAwOiBBdXRvU3luYywgMTogTWFudWFsIFNldHRpbmcKKyAqICAgMHgwOCAtIDB4MGYgOiAgTm90IFVzZWQ/ICgweDApCisgKiAgIDB4MTAgICAgICAgIDogIEJ1cyBUZXJtaW5hdGlvbgorICogCQkJVmFsdWUgMDogQXV0b1tPTl0sIDE6IE9OLCAyOiBPRkYKKyAqICAgMHgxMSAgICAgICAgOiAgTm90IFVzZWQ/ICgwKQorICogICAweDEyICAgICAgICA6ICBCdXMgUmVzZXQgRGVsYXkgVGltZSAoMHgwMykKKyAqICAgMHgxMyAgICAgICAgOiAgQm9vdGFibGUgQ0QgU3VwcG9ydAorICoJCQlWYWx1ZSAwOiBEaXNhYmxlLCAxOiBFbmFibGUKKyAqICAgMHgxNCAgICAgICAgOiAgRGV2aWNlIFNjYW4KKyAqCQkJQml0ICAgNyAgNiAgNSAgNCAgMyAgMiAgMSAgMAorICoJCQkgICAgICB8ICA8LS0tLS0tLS0tLS0tLS0tLS0+CisgKiAJCQkgICAgICB8ICAgIFNDU0kgSUQ6IFZhbHVlIDA6IFNraXAsIDE6IFlFUworICoJCQkgICAgICB8LT4gIFZhbHVlIDA6IEFMTCBzY2FuLCAgVmFsdWUgMTogTWFudWFsCisgKiAgIDB4MTUgLSAweDFiIDogIE5vdCBVc2VkPyAoMCkKKyAqICAgMHgxYyAgICAgICAgOiAgQ29uc3RhbnQ/ICgweDAxKSAoY2xvY2sgZGl2PykKKyAqICAgMHgxZCAtIDB4N2MgOiAgTm90IFVzZWQgKDB4ZmYpCisgKiAgIDB4N2QJIDogIE5vdCBVc2VkPyAoMHhmZikKKyAqICAgMHg3ZSAgICAgICAgOiAgQ29uc3RhbnQgKDB4NTUpLCBWYWxpZGl0eSBzaWduYXR1cmUKKyAqICAgMHg3ZiAgICAgICAgOiAgQ29uc3RhbnQgKDB4YWEpLCBWYWxpZGl0eSBzaWduYXR1cmUKKyAqLworc3RhdGljIGludCBuc3AzMl9nZXRwcm9tX2F0MjQobnNwMzJfaHdfZGF0YSAqZGF0YSkKK3sKKwlpbnQgICAgICAgICAgIHJldCwgaTsKKwlpbnQgICAgICAgICAgIGF1dG9fc3luYzsKKwluc3AzMl90YXJnZXQgKnRhcmdldDsKKwlpbnQgICAgICAgICAgIGVudHJ5OworCisJLyoKKwkgKiBSZXNldCB0aW1lIHdoaWNoIGlzIGRlc2lnbmF0ZWQgYnkgRUVQUk9NLgorCSAqCisJICogVE9ETzogTm90IHVzZWQgeWV0LgorCSAqLworCWRhdGEtPnJlc2V0dGltZSA9IG5zcDMyX3Byb21fcmVhZChkYXRhLCAweDEyKTsKKworCS8qCisJICogSEJBIFN5bmNocm9ub3VzIFRyYW5zZmVyIFBlcmlvZAorCSAqCisJICogTm90ZTogYXV0b19zeW5jID0gMDogYXV0bywgMTogbWFudWFsLiAgTmluamEgU0NTSSBIQkEgc3BlYyBzYXlzCisJICoJdGhhdCBpZiBhdXRvX3N5bmMgaXMgMCAoYXV0byksIGFuZCBjb25uZWN0ZWQgU0NTSSBkZXZpY2VzIGFyZQorCSAqCXNhbWUgb3IgbG93ZXIgdGhhbiAzLCB0aGVuIHRyYW5zZmVyIHNwZWVkIGlzIHNldCBhcyBVTFRSQS0yME0uCisJICoJT24gdGhlIGNvbnRyYXJ5IGlmIGNvbm5lY3RlZCBTQ1NJIGRldmljZXMgYXJlIHNhbWUgb3IgaGlnaGVyCisJICoJdGhhbiA0LCB0aGVuIHRyYW5zZmVyIHNwZWVkIGlzIHNldCBhcyBGQVNULTEwTS4KKwkgKgorCSAqCUkgYnJlYWsgdGhpcyBydWxlLiBUaGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBTQ1NJIGRldmljZXMgYXJlCisJICoJb25seSBpZ25vcmVkLiBJZiBhdXRvX3N5bmMgaXMgMCAoYXV0byksIHRoZW4gdHJhbnNmZXIgc3BlZWQgaXMKKwkgKglmb3JjZWQgYXMgVUxUUkEtMjBNLgorCSAqLworCXJldCA9IG5zcDMyX3Byb21fcmVhZChkYXRhLCAweDA3KTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwkJYXV0b19zeW5jID0gVFJVRTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhdXRvX3N5bmMgPSBGQUxTRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnNwMzJfbXNnKEtFUk5fV0FSTklORywKKwkJCSAgIlVuc3VwcG9ydGVkIEF1dG8gU3luYyBtb2RlLiBGYWxsIGJhY2sgdG8gbWFudWFsIG1vZGUuIik7CisJCWF1dG9fc3luYyA9IFRSVUU7CisJfQorCisJaWYgKHRyYW5zX21vZGUgPT0gVUxUUkEyME1fTU9ERSkgeworCQlhdXRvX3N5bmMgPSBUUlVFOworCX0KKworCS8qCisJICogZWFjaCBkZXZpY2UgU3luY2hyb25vdXMgVHJhbnNmZXIgUGVyaW9kCisJICovCisJZm9yIChpID0gMDsgaSA8IE5TUDMyX0hPU1RfU0NTSUlEOyBpKyspIHsKKwkJdGFyZ2V0ID0gJmRhdGEtPnRhcmdldFtpXTsKKwkJaWYgKGF1dG9fc3luYyA9PSBUUlVFKSB7CisJCQl0YXJnZXQtPmxpbWl0X2VudHJ5ID0gMDsgICAvKiBzZXQgYXMgVUxUUkEyME0gKi8KKwkJfSBlbHNlIHsKKwkJCXJldCAgID0gbnNwMzJfcHJvbV9yZWFkKGRhdGEsIGkpOworCQkJZW50cnkgPSBuc3AzMl9zZWFyY2hfcGVyaW9kX2VudHJ5KGRhdGEsIHRhcmdldCwgcmV0KTsKKwkJCWlmIChlbnRyeSA8IDApIHsKKwkJCQkvKiBzZWFyY2ggZmFpbGVkLi4uIHNldCBtYXhpbXVtIHNwZWVkICovCisJCQkJZW50cnkgPSAwOworCQkJfQorCQkJdGFyZ2V0LT5saW1pdF9lbnRyeSA9IGVudHJ5OworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIEMxNiAxMTAgKEktTyBEYXRhOiBTQy1OQkQpIGRhdGEgbWFwOgorICoKKyAqICAgUk9NQUREUgorICogICAweDAwIC0gMHgwNiA6ICBEZXZpY2UgU3luY2hyb25vdXMgVHJhbnNmZXIgUGVyaW9kIChTQ1NJIElEIDAgLSA2KSAKKyAqCQkJVmFsdWUgMHgwOiAyME1CL1MsIDB4MTogMTBNQi9TLCAweDI6IDVNQi9TLCAweDM6IEFTWU5DCisgKiAgIDB4MDcgICAgICAgIDogIDAgKEhCQSBTeW5jaHJvbm91cyBUcmFuc2ZlciBQZXJpb2Q6IEF1dG8gU3luYykKKyAqICAgMHgwOCAtIDB4MGYgOiAgTm90IFVzZWQ/ICgweDApCisgKiAgIDB4MTAgICAgICAgIDogIFRyYW5zZmVyIE1vZGUKKyAqCQkJVmFsdWUgMDogUElPLCAxOiBCdXNtYXRlcgorICogICAweDExICAgICAgICA6ICBCdXMgUmVzZXQgRGVsYXkgVGltZSAoMHgwMC0weDIwKQorICogICAweDEyICAgICAgICA6ICBCdXMgVGVybWluYXRpb24KKyAqIAkJCVZhbHVlIDA6IERpc2FibGUsIDE6IEVuYWJsZQorICogICAweDEzIC0gMHgxOSA6ICBEaXNjb25uZWN0aW9uCisgKgkJCVZhbHVlIDA6IERpc2FibGUsIDE6IEVuYWJsZQorICogICAweDFhIC0gMHg3YyA6ICBOb3QgVXNlZD8gKDApCisgKiAgIDB4N2QJIDogIE5vdCBVc2VkPyAoMHhmOCkKKyAqICAgMHg3ZSAgICAgICAgOiAgQ29uc3RhbnQgKDB4NTUpLCBWYWxpZGl0eSBzaWduYXR1cmUKKyAqICAgMHg3ZiAgICAgICAgOiAgQ29uc3RhbnQgKDB4YWEpLCBWYWxpZGl0eSBzaWduYXR1cmUKKyAqLworc3RhdGljIGludCBuc3AzMl9nZXRwcm9tX2MxNihuc3AzMl9od19kYXRhICpkYXRhKQoreworCWludCAgICAgICAgICAgcmV0LCBpOworCW5zcDMyX3RhcmdldCAqdGFyZ2V0OworCWludCAgICAgICAgICAgZW50cnksIHZhbDsKKworCS8qCisJICogUmVzZXQgdGltZSB3aGljaCBpcyBkZXNpZ25hdGVkIGJ5IEVFUFJPTS4KKwkgKgorCSAqIFRPRE86IE5vdCB1c2VkIHlldC4KKwkgKi8KKwlkYXRhLT5yZXNldHRpbWUgPSBuc3AzMl9wcm9tX3JlYWQoZGF0YSwgMHgxMSk7CisKKwkvKgorCSAqIGVhY2ggZGV2aWNlIFN5bmNocm9ub3VzIFRyYW5zZmVyIFBlcmlvZAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOU1AzMl9IT1NUX1NDU0lJRDsgaSsrKSB7CisJCXRhcmdldCA9ICZkYXRhLT50YXJnZXRbaV07CisJCXJldCA9IG5zcDMyX3Byb21fcmVhZChkYXRhLCBpKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJLyogMjBNQi9zICovCisJCQl2YWwgPSAweDBjOworCQkJYnJlYWs7CisJCWNhc2UgMToJCS8qIDEwTUIvcyAqLworCQkJdmFsID0gMHgxOTsKKwkJCWJyZWFrOworCQljYXNlIDI6CQkvKiA1TUIvcyAqLworCQkJdmFsID0gMHgzMjsKKwkJCWJyZWFrOworCQljYXNlIDM6CQkvKiBBU1lOQyAqLworCQkJdmFsID0gMHgwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBkZWZhdWx0IDIwTUIvcyAqLworCQkJdmFsID0gMHgwYzsKKwkJCWJyZWFrOworCQl9CisJCWVudHJ5ID0gbnNwMzJfc2VhcmNoX3BlcmlvZF9lbnRyeShkYXRhLCB0YXJnZXQsIHZhbCk7CisJCWlmIChlbnRyeSA8IDAgfHwgdHJhbnNfbW9kZSA9PSBVTFRSQTIwTV9NT0RFKSB7CisJCQkvKiBzZWFyY2ggZmFpbGVkLi4uIHNldCBtYXhpbXVtIHNwZWVkICovCisJCQllbnRyeSA9IDA7CisJCX0KKwkJdGFyZ2V0LT5saW1pdF9lbnRyeSA9IGVudHJ5OworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBBdG1lbCBBVDI0QzAxQSAoZHJpdmVkIGluIDVWKSBzZXJpYWwgRUVQUk9NIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgbnNwMzJfcHJvbV9yZWFkKG5zcDMyX2h3X2RhdGEgKmRhdGEsIGludCByb21hZGRyKQoreworCWludCBpLCB2YWw7CisKKwkvKiBzdGFydCBjb25kaXRpb24gKi8KKwluc3AzMl9wcm9tX3N0YXJ0KGRhdGEpOworCisJLyogZGV2aWNlIGFkZHJlc3MgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAxKTsJLyogMSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiAwICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMSk7CS8qIDEgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogMCAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiBBMjogMCAoR05EKSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiBBMTogMCAoR05EKSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiBBMDogMCAoR05EKSAqLworCisJLyogUi9XOiBXIGZvciBkdW1teSB3cml0ZSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOworCisJLyogYWNrICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMCk7CisKKwkvKiB3b3JkIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAoKHJvbWFkZHIgPj4gaSkgJiAxKSk7CisJfQorCisJLyogYWNrICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMCk7CisKKwkvKiBzdGFydCBjb25kaXRpb24gKi8KKwluc3AzMl9wcm9tX3N0YXJ0KGRhdGEpOworCisJLyogZGV2aWNlIGFkZHJlc3MgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAxKTsJLyogMSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiAwICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMSk7CS8qIDEgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsJLyogMCAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiBBMjogMCAoR05EKSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiBBMTogMCAoR05EKSAqLworCW5zcDMyX3Byb21fd3JpdGVfYml0KGRhdGEsIDApOwkvKiBBMDogMCAoR05EKSAqLworCisJLyogUi9XOiBSICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMSk7CisKKwkvKiBhY2sgKi8KKwluc3AzMl9wcm9tX3dyaXRlX2JpdChkYXRhLCAwKTsKKworCS8qIGRhdGEuLi4gKi8KKwl2YWwgPSAwOworCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisJCXZhbCArPSAobnNwMzJfcHJvbV9yZWFkX2JpdChkYXRhKSA8PCBpKTsKKwl9CisJCisJLyogbm8gYWNrICovCisJbnNwMzJfcHJvbV93cml0ZV9iaXQoZGF0YSwgMSk7CisKKwkvKiBzdG9wIGNvbmRpdGlvbiAqLworCW5zcDMyX3Byb21fc3RvcChkYXRhKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIG5zcDMyX3Byb21fc2V0KG5zcDMyX2h3X2RhdGEgKmRhdGEsIGludCBiaXQsIGludCB2YWwpCit7CisJaW50IGJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlpbnQgdG1wOworCisJdG1wID0gbnNwMzJfaW5kZXhfcmVhZDEoYmFzZSwgU0VSSUFMX1JPTV9DVEwpOworCisJaWYgKHZhbCA9PSAwKSB7CisJCXRtcCAmPSB+Yml0OworCX0gZWxzZSB7CisJCXRtcCB8PSAgYml0OworCX0KKworCW5zcDMyX2luZGV4X3dyaXRlMShiYXNlLCBTRVJJQUxfUk9NX0NUTCwgdG1wKTsKKworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyBpbnQgbnNwMzJfcHJvbV9nZXQobnNwMzJfaHdfZGF0YSAqZGF0YSwgaW50IGJpdCkKK3sKKwlpbnQgYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWludCB0bXAsIHJldDsKKworCWlmIChiaXQgIT0gU0RBKSB7CisJCW5zcDMyX21zZyhLRVJOX0VSUiwgInJldHVybiB2YWx1ZSBpcyBub3QgYXBwcm9wcmlhdGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwl0bXAgPSBuc3AzMl9pbmRleF9yZWFkMShiYXNlLCBTRVJJQUxfUk9NX0NUTCkgJiBiaXQ7CisKKwlpZiAodG1wID09IDApIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCX0KKworCXVkZWxheSgxMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuc3AzMl9wcm9tX3N0YXJ0IChuc3AzMl9od19kYXRhICpkYXRhKQoreworCS8qIHN0YXJ0IGNvbmRpdGlvbiAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNDTCwgMSk7CisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0RBLCAxKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBFTkEsIDEpOwkvKiBvdXRwdXQgbW9kZSAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNEQSwgMCk7CS8qIGtlZXBpbmcgU0NMPTEgYW5kIHRyYW5zaXRpbmcKKwkJCQkJICogU0RBIDEtPjAgaXMgc3RhcnQgY29uZGl0aW9uICovCisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0NMLCAwKTsKK30KKworc3RhdGljIHZvaWQgbnNwMzJfcHJvbV9zdG9wIChuc3AzMl9od19kYXRhICpkYXRhKQoreworCS8qIHN0b3AgY29uZGl0aW9uICovCisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0NMLCAxKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBTREEsIDApOworCW5zcDMyX3Byb21fc2V0KGRhdGEsIEVOQSwgMSk7CS8qIG91dHB1dCBtb2RlICovCisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0RBLCAxKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBTQ0wsIDApOworfQorCitzdGF0aWMgdm9pZCBuc3AzMl9wcm9tX3dyaXRlX2JpdChuc3AzMl9od19kYXRhICpkYXRhLCBpbnQgdmFsKQoreworCS8qIHdyaXRlICovCisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0RBLCB2YWwpOworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNDTCwgMSAgKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBTQ0wsIDAgICk7Cit9CisKK3N0YXRpYyBpbnQgbnNwMzJfcHJvbV9yZWFkX2JpdChuc3AzMl9od19kYXRhICpkYXRhKQoreworCWludCB2YWw7CisKKwkvKiByZWFkICovCisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgRU5BLCAwKTsJLyogaW5wdXQgbW9kZSAqLworCW5zcDMyX3Byb21fc2V0KGRhdGEsIFNDTCwgMSk7CisKKwl2YWwgPSBuc3AzMl9wcm9tX2dldChkYXRhLCBTREEpOworCisJbnNwMzJfcHJvbV9zZXQoZGF0YSwgU0NMLCAwKTsKKwluc3AzMl9wcm9tX3NldChkYXRhLCBFTkEsIDEpOwkvKiBvdXRwdXQgbW9kZSAqLworCisJcmV0dXJuIHZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBvd2VyIE1hbmFnZW1lbnQKKyAqLworI2lmZGVmIENPTkZJR19QTQorCisvKiBEZXZpY2Ugc3VzcGVuZGVkICovCitzdGF0aWMgaW50IG5zcDMyX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJbnNwMzJfbXNnKEtFUk5fSU5GTywgInBjaS1zdXNwZW5kOiBwZGV2PTB4JXAsIHN0YXRlPSVsZCwgc2xvdD0lcywgaG9zdD0weCVwIiwgcGRldiwgc3RhdGUsIHBjaV9uYW1lKHBkZXYpLCBob3N0KTsKKworCXBjaV9zYXZlX3N0YXRlICAgICAocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlIChwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKworCXJldHVybiAwOworfQorCisvKiBEZXZpY2Ugd29rZW4gdXAgKi8KK3N0YXRpYyBpbnQgbnNwMzJfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJbnNwMzJfaHdfZGF0YSAgICAqZGF0YSA9IChuc3AzMl9od19kYXRhICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgc2hvcnQgICAgcmVnOworCisJbnNwMzJfbXNnKEtFUk5fSU5GTywgInBjaS1yZXN1bWU6IHBkZXY9MHglcCwgc2xvdD0lcywgaG9zdD0weCVwIiwgcGRldiwgcGNpX25hbWUocGRldiksIGhvc3QpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKKwlwY2lfZW5hYmxlX3dha2UgICAgKHBkZXYsIDAsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlICAocGRldik7CisKKwlyZWcgPSBuc3AzMl9yZWFkMihkYXRhLT5CYXNlQWRkcmVzcywgSU5ERVhfUkVHKTsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJpbz0weCV4IHJlZz0weCV4IiwgZGF0YS0+QmFzZUFkZHJlc3MsIHJlZyk7CisKKwlpZiAocmVnID09IDB4ZmZmZikgeworCQluc3AzMl9tc2coS0VSTl9JTkZPLCAibWlzc2luZyBkZXZpY2UuIGFib3J0IHJlc3VtZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnNwMzJod19pbml0ICAgICAgKGRhdGEpOworCW5zcDMyX2RvX2J1c19yZXNldChkYXRhKTsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJyZXN1bWUgc3VjY2VzcyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZSB3YWtlIGV2ZW50ICovCitzdGF0aWMgaW50IG5zcDMyX2VuYWJsZV93YWtlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUsIGludCBlbmFibGUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW5zcDMyX21zZyhLRVJOX0lORk8sICJwY2ktZW5hYmxlX3dha2U6IHN0dWIsIHBkZXY9MHglcCwgZW5hYmxlPSVkLCBzbG90PSVzLCBob3N0PTB4JXAiLCBwZGV2LCBlbmFibGUsIHBjaV9uYW1lKHBkZXYpLCBob3N0KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSS9DYXJkYnVzIHByb2JlL3JlbW92ZSByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG5zcDMyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKwluc3AzMl9od19kYXRhICpkYXRhID0gJm5zcDMyX2RhdGFfYmFzZTsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19SRUdJU1RFUiwgImVudGVyIik7CisKKyAgICAgICAgcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQluc3AzMl9tc2coS0VSTl9FUlIsICJmYWlsZWQgdG8gZW5hYmxlIHBjaSBkZXZpY2UiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkYXRhLT5QY2kgICAgICAgICA9IHBkZXY7CisJZGF0YS0+cGNpX2RldmlkICAgPSBpZDsKKwlkYXRhLT5JcnFOdW1iZXIgICA9IHBkZXYtPmlycTsKKwlkYXRhLT5CYXNlQWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlkYXRhLT5OdW1BZGRyZXNzICA9IHBjaV9yZXNvdXJjZV9sZW4gIChwZGV2LCAwKTsKKwlkYXRhLT5NbWlvQWRkcmVzcyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCisJCQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuICAocGRldiwgMSkpOworCWRhdGEtPk1taW9MZW5ndGggID0gcGNpX3Jlc291cmNlX2xlbiAgKHBkZXYsIDEpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwlyZXQgPSBuc3AzMl9kZXRlY3QocGRldik7CisjZWxzZQorCXJldCA9IHNjc2lfcmVnaXN0ZXJfaG9zdCgmbnNwMzJfdGVtcGxhdGUpOworI2VuZGlmCisKKwluc3AzMl9tc2coS0VSTl9JTkZPLCAiaXJxOiAlaSBtbWlvOiAlcCsweCVseCBzbG90OiAlcyBtb2RlbDogJXMiLAorCQkgIHBkZXYtPmlycSwKKwkJICBkYXRhLT5NbWlvQWRkcmVzcywgZGF0YS0+TW1pb0xlbmd0aCwKKwkJICBwY2lfbmFtZShwZGV2KSwKKwkJICBuc3AzMl9tb2RlbFtpZC0+ZHJpdmVyX2RhdGFdKTsKKworCW5zcDMyX2RiZyhOU1AzMl9ERUJVR19SRUdJU1RFUiwgImV4aXQgJWQiLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG5zcDMyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworI2VuZGlmCisKKwluc3AzMl9kYmcoTlNQMzJfREVCVUdfUkVHSVNURVIsICJlbnRlciIpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisgICAgICAgIHNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisKKwluc3AzMl9yZWxlYXNlKGhvc3QpOworCisJc2NzaV9ob3N0X3B1dChob3N0KTsKKyNlbHNlCisJc2NzaV91bnJlZ2lzdGVyX2hvc3QoJm5zcDMyX3RlbXBsYXRlKTsJCisjZW5kaWYKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuc3AzMl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm5zcDMyIiwKKwkuaWRfdGFibGUJPSBuc3AzMl9wY2lfdGFibGUsCisJLnByb2JlCQk9IG5zcDMyX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobnNwMzJfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IG5zcDMyX3N1c3BlbmQsIAorCS5yZXN1bWUJCT0gbnNwMzJfcmVzdW1lLCAKKwkuZW5hYmxlX3dha2UgICAgPSBuc3AzMl9lbmFibGVfd2FrZSwKKyNlbmRpZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW91bGUgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9uc3AzMih2b2lkKSB7CisJbnNwMzJfbXNnKEtFUk5fSU5GTywgImxvYWRpbmcuLi4iKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZuc3AzMl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uc3AzMih2b2lkKSB7CisJbnNwMzJfbXNnKEtFUk5fSU5GTywgInVubG9hZGluZy4uLiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbnNwMzJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9uc3AzMik7Cittb2R1bGVfZXhpdChleGl0X25zcDMyKTsKKworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbnNwMzIuaCBiL2RyaXZlcnMvc2NzaS9uc3AzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjQzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbnNwMzIuaApAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIFdvcmtiaXQgTmluamFTQ1NJLTMyQmkvVURFIFBDSS9DYXJkQnVzIFNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIKKyAqIEJhc2ljIGRhdGEgaGVhZGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2lmbmRlZiBfTlNQMzJfSAorI2RlZmluZSBfTlNQMzJfSAorCisvLyNkZWZpbmUgTlNQMzJfREVCVUcgOQorCisvKgorICogVkVORE9SL0RFVklDRSBJRAorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU9EQVRBICAweDEwZmMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9XT1JLQklUIDB4MTE0NQorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklfQ0JTQ19JSSAgIDB4MDAwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMkJJX0tNRSAgICAgICAweGYwMDcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJCSV9XQlQgICAgICAgMHg4MDA3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV09SS0JJVF9TVEFOREFSRCAgICAgICAgIDB4ZjAxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1dPUktCSVRfRFVBTEVER0UgICAgICAgICAweGYwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJCSV9MT0dJVEVDICAgMHhmMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTklOSkFTQ1NJXzMyQklCX0xPR0lURUMgIDB4ZjAxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05JTkpBU0NTSV8zMlVERV9NRUxDTyAgICAweGYwMTUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OSU5KQVNDU0lfMzJVREVfTUVMQ09fSUkgMHg4MDA5CisKKy8qCisgKiBNT0RFTAorICovCitlbnVtIHsKKwlNT0RFTF9JT0RBVEEgICAgICAgID0gMCwKKwlNT0RFTF9LTUUgICAgICAgICAgID0gMSwKKwlNT0RFTF9XT1JLQklUICAgICAgID0gMiwKKwlNT0RFTF9MT0dJVEVDICAgICAgID0gMywKKwlNT0RFTF9QQ0lfV09SS0JJVCAgID0gNCwKKwlNT0RFTF9QQ0lfTE9HSVRFQyAgID0gNSwKKwlNT0RFTF9QQ0lfTUVMQ08gICAgID0gNiwKK307CisKK3N0YXRpYyBjaGFyICogbnNwMzJfbW9kZWxbXSA9IHsKKwkiSS1PIERBVEEgQ0JTQy1JSSBDYXJkQnVzIGNhcmQiLAorCSJLTUUgU0NTSSBDYXJkQnVzIGNhcmQiLAorCSJXb3JrYml0IGR1byBTQ1NJIENhcmRCdXMgY2FyZCIsCisJIkxvZ2l0ZWMgQ2FyZEJ1cyBjYXJkIHdpdGggZXh0ZXJuYWwgUk9NIiwKKwkiV29ya2JpdCAvIEktTyBEQVRBIFBDSSBjYXJkIiwKKwkiTG9naXRlYyBQQ0kgY2FyZCB3aXRoIGV4dGVybmFsIFJPTSIsCisJIk1lbGNvIENhcmRCdXMvUENJIGNhcmQgd2l0aCBleHRlcm5hbCBST00iLAorfTsKKworCisvKgorICogU0NTSSBHZW5lcmljIERlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgRVhURU5ERURfU0RUUl9MRU4JMHgwMworCisvKiBMaXR0bGUgRW5kaWFuICovCit0eXBlZGVmIHUzMiB1MzJfbGU7Cit0eXBlZGVmIHUxNiB1MTZfbGU7CisKKy8qCisgKiBNQUNSTworICovCisjZGVmaW5lIEJJVCh4KSAgICAgICgxVUwgPDwgKHgpKQorCisvKgorICogQkFTSUMgRGVmaW5pdGlvbnMKKyAqLworI2lmbmRlZiBUUlVFCisjIGRlZmluZSBUUlVFICAxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyMgZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorI2RlZmluZSBBU1NFUlQgMQorI2RlZmluZSBORUdBVEUgMAorCisKKy8qKioqKioqKioqKioqKioqKioqLworLyogbm9ybWFsIHJlZ2lzdGVyICovCisvKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEb24ndCBhY2Nlc3MgYmVsb3cgcmVnaXN0ZXIgd2l0aCBEb3VibGUgV29yZDoKKyAqICswMCwgKzA0LCArMDgsICswYywgKzY0LCArODAsICs4NCwgKzg4LCArOTAsICtjNCwgK2M4LCArY2MsICtkMC4KKyAqLworI2RlZmluZSBJUlFfQ09OVFJPTCAweDAwCS8qIEJBU0UrMDAsIFcsIFcgKi8KKyNkZWZpbmUgSVJRX1NUQVRVUyAgMHgwMAkvKiBCQVNFKzAwLCBXLCBSICovCisjIGRlZmluZSBJUlFTVEFUVVNfTEFUQ0hFRF9NU0cgICAgICBCSVQoMCkKKyMgZGVmaW5lIElSUVNUQVRVU19MQVRDSEVEX0lPICAgICAgIEJJVCgxKQorIyBkZWZpbmUgSVJRU1RBVFVTX0xBVENIRURfQ0QgICAgICAgQklUKDIpCisjIGRlZmluZSBJUlFTVEFUVVNfTEFUQ0hFRF9CVVNfRlJFRSBCSVQoMykKKyMgZGVmaW5lIElSUVNUQVRVU19SRVNFTEVDVF9PQ0NVRVIgIEJJVCg0KQorIyBkZWZpbmUgSVJRU1RBVFVTX1BIQVNFX0NIQU5HRV9JUlEgQklUKDUpCisjIGRlZmluZSBJUlFTVEFUVVNfU0NTSVJFU0VUX0lSUSAgICBCSVQoNikKKyMgZGVmaW5lIElSUVNUQVRVU19USU1FUl9JUlEgICAgICAgIEJJVCg3KQorIyBkZWZpbmUgSVJRU1RBVFVTX0ZJRk9fU0hMRF9JUlEgICAgQklUKDgpCisjIGRlZmluZSBJUlFTVEFUVVNfUENJX0lSUQkgICAgQklUKDkpCisjIGRlZmluZSBJUlFTVEFUVVNfQk1DTlRFUlJfSVJRICAgICBCSVQoMTApCisjIGRlZmluZSBJUlFTVEFUVVNfQVVUT1NDU0lfSVJRICAgICBCSVQoMTEpCisjIGRlZmluZSBQQ0lfSVJRX01BU0sgICAgICAgICAgICAgICBCSVQoMTIpCisjIGRlZmluZSBUSU1FUl9JUlFfTUFTSyAgICAgICAgICAgICBCSVQoMTMpCisjIGRlZmluZSBGSUZPX0lSUV9NQVNLICAgICAgICAgICAgICBCSVQoMTQpCisjIGRlZmluZSBTQ1NJX0lSUV9NQVNLICAgICAgICAgICAgICBCSVQoMTUpCisjIGRlZmluZSBJUlFfQ09OVFJPTF9BTExfSVJRX01BU0sgICAoUENJX0lSUV9NQVNLICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJfSVJRX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklGT19JUlFfTUFTSyAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSV9JUlFfTUFTSyAgKQorIyBkZWZpbmUgSVJRU1RBVFVTX0FOWV9JUlEgICAgICAgICAgKElSUVNUQVRVU19SRVNFTEVDVF9PQ0NVRVIJfCBcCisJCQkJICAgICBJUlFTVEFUVVNfUEhBU0VfQ0hBTkdFX0lSUQl8IFwKKwkJCQkgICAgIElSUVNUQVRVU19TQ1NJUkVTRVRfSVJRCXwgXAorCQkJCSAgICAgSVJRU1RBVFVTX1RJTUVSX0lSUQl8IFwKKwkJCQkgICAgIElSUVNUQVRVU19GSUZPX1NITERfSVJRCXwgXAorCQkJCSAgICAgSVJRU1RBVFVTX1BDSV9JUlEJCXwgXAorCQkJCSAgICAgSVJRU1RBVFVTX0JNQ05URVJSX0lSUQl8IFwKKwkJCQkgICAgIElSUVNUQVRVU19BVVRPU0NTSV9JUlEJKQorCisjZGVmaW5lIFRSQU5TRkVSX0NPTlRST0wJMHgwMgkvKiBCQVNFKzAyLCBXLCBXICovCisjZGVmaW5lIFRSQU5TRkVSX1NUQVRVUwkJMHgwMgkvKiBCQVNFKzAyLCBXLCBSICovCisjIGRlZmluZSBDQl9NTUlPX01PREUgICAgICAgIEJJVCgwKQorIyBkZWZpbmUgQ0JfSU9fTU9ERSAgICAgICAgICBCSVQoMSkKKyMgZGVmaW5lIEJNX1RFU1QgICAgICAgICAgICAgQklUKDIpCisjIGRlZmluZSBCTV9URVNUX0RJUiAgICAgICAgIEJJVCgzKQorIyBkZWZpbmUgRFVBTF9FREdFX0VOQUJMRSAgICBCSVQoNCkKKyMgZGVmaW5lIE5PX1RSQU5TRkVSX1RPX0hPU1QgQklUKDUpCisjIGRlZmluZSBUUkFOU0ZFUl9HTyAgICAgICAgIEJJVCg3KQorIyBkZWZpbmUgQkxJRU5EX01PREUgICAgICAgICBCSVQoOCkKKyMgZGVmaW5lIEJNX1NUQVJUICAgICAgICAgICAgQklUKDkpCisjIGRlZmluZSBBRFZBTkNFRF9CTV9XUklURSAgIEJJVCgxMCkKKyMgZGVmaW5lIEJNX1NJTkdMRV9NT0RFICAgICAgQklUKDExKQorIyBkZWZpbmUgRklGT19UUlVFX0ZVTEwgICAgICBCSVQoMTIpCisjIGRlZmluZSBGSUZPX1RSVUVfRU1QVFkgICAgIEJJVCgxMykKKyMgZGVmaW5lIEFMTF9DT1VOVEVSX0NMUiAgICAgQklUKDE0KQorIyBkZWZpbmUgRklGT1RFU1QgICAgICAgICAgICBCSVQoMTUpCisKKyNkZWZpbmUgSU5ERVhfUkVHCQkweDA0CS8qIEJBU0UrMDQsIEJ5dGUoUi9XKSwgV29yZChSKSAqLworCisjZGVmaW5lIFRJTUVSX1NFVAkJMHgwNgkvKiBCQVNFKzA2LCBXLCBSL1cgKi8KKyMgZGVmaW5lIFRJTUVSX0NOVF9NQVNLICgweGZmKQorIyBkZWZpbmUgVElNRVJfU1RPUCAgICAgQklUKDgpCisKKyNkZWZpbmUgREFUQV9SRUdfTE9XCQkweDA4CS8qIEJBU0UrMDgsIExvd1csIFIvVyAqLworI2RlZmluZSBEQVRBX1JFR19ISQkJMHgwYQkvKiBCQVNFKzBhLCBIaS1XLCBSL1cgKi8KKworI2RlZmluZSBGSUZPX1JFU1RfQ05UCQkweDBjCS8qIEJBU0UrMGMsIFcsIFIvVyAqLworIyBkZWZpbmUgRklGT19SRVNUX01BU0sgICAgICAgMHgxZmYKKyMgZGVmaW5lIEZJRk9fRU1QVFlfU0hMRF9GTEFHIEJJVCgxNCkKKyMgZGVmaW5lIEZJRk9fRlVMTF9TSExEX0ZMQUcgIEJJVCgxNSkKKworI2RlZmluZSBTUkVRX1NNUExfUkFURQkJMHgwZgkvKiBCQVNFKzBmLCBCLCBSL1cgKi8KKyMgZGVmaW5lIFNSRVFTTVBMUkFURV9SQVRFMCBCSVQoMCkKKyMgZGVmaW5lIFNSRVFTTVBMUkFURV9SQVRFMSBCSVQoMSkKKyMgZGVmaW5lIFNBTVBMSU5HX0VOQUJMRSAgICBCSVQoMikKKyMgIGRlZmluZSBTTVBMXzQwTSAoMCkgICAgICAgICAgICAgICAgICAgLyogNDBNSHo6ICAgMC0xMDBucy9wZXJpb2QgKi8KKyMgIGRlZmluZSBTTVBMXzIwTSAoU1JFUVNNUExSQVRFX1JBVEUwKSAgLyogMjBNSHo6IDEwMC0yMDBucy9wZXJpb2QgKi8KKyMgIGRlZmluZSBTTVBMXzEwTSAoU1JFUVNNUExSQVRFX1JBVEUxKSAgLyogMTBNaHo6IDIwMC0gICBucy9wZXJpb2QgKi8KKworI2RlZmluZSBTQ1NJX0JVU19DT05UUk9MCTB4MTAJLyogQkFTRSsxMCwgQiwgUi9XICovCisjIGRlZmluZSBCVVNDVExfU0VMICAgICAgICAgQklUKDApCisjIGRlZmluZSBCVVNDVExfUlNUICAgICAgICAgQklUKDEpCisjIGRlZmluZSBCVVNDVExfREFUQU9VVF9FTkIgQklUKDIpCisjIGRlZmluZSBCVVNDVExfQVROICAgICAgICAgQklUKDMpCisjIGRlZmluZSBCVVNDVExfQUNLICAgICAgICAgQklUKDQpCisjIGRlZmluZSBCVVNDVExfQlNZICAgICAgICAgQklUKDUpCisjIGRlZmluZSBBVVRPRElSRUNUSU9OICAgICAgQklUKDYpCisjIGRlZmluZSBBQ0tFTkIgICAgICAgICAgICAgQklUKDcpCisKKyNkZWZpbmUgQ0xSX0NPVU5URVIJCTB4MTIJLyogQkFTRSsxMiwgQiwgVyAqLworIyBkZWZpbmUgQUNLX0NPVU5URVJfQ0xSICAgICAgIEJJVCgwKQorIyBkZWZpbmUgU1JFUV9DT1VOVEVSX0NMUiAgICAgIEJJVCgxKQorIyBkZWZpbmUgRklGT19IT1NUX1BPSU5URVJfQ0xSIEJJVCgyKQorIyBkZWZpbmUgRklGT19SRVNUX0NPVU5UX0NMUiAgIEJJVCgzKQorIyBkZWZpbmUgQk1fQ09VTlRFUl9DTFIgICAgICAgIEJJVCg0KQorIyBkZWZpbmUgU0FWRURfQUNLX0NMUiAgICAgICAgIEJJVCg1KQorIyBkZWZpbmUgQ0xSQ09VTlRFUl9BTExNQVNLICAgIChBQ0tfQ09VTlRFUl9DTFIgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSRVFfQ09VTlRFUl9DTFIgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklGT19IT1NUX1BPSU5URVJfQ0xSIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUZPX1JFU1RfQ09VTlRfQ0xSICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJNX0NPVU5URVJfQ0xSICAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FWRURfQUNLX0NMUiAgICAgICAgICkKKworI2RlZmluZSBTQ1NJX0JVU19NT05JVE9SCTB4MTIJLyogQkFTRSsxMiwgQiwgUiAqLworIyBkZWZpbmUgQlVTTU9OX01TRyBCSVQoMCkKKyMgZGVmaW5lIEJVU01PTl9JTyAgQklUKDEpCisjIGRlZmluZSBCVVNNT05fQ0QgIEJJVCgyKQorIyBkZWZpbmUgQlVTTU9OX0JTWSBCSVQoMykKKyMgZGVmaW5lIEJVU01PTl9BQ0sgQklUKDQpCisjIGRlZmluZSBCVVNNT05fUkVRIEJJVCg1KQorIyBkZWZpbmUgQlVTTU9OX1NFTCBCSVQoNikKKyMgZGVmaW5lIEJVU01PTl9BVE4gQklUKDcpCisKKyNkZWZpbmUgQ09NTUFORF9EQVRBCQkweDE0CS8qIEJBU0UrMTQsIEIsIFIvVyAqLworCisjZGVmaW5lIFBBUklUWV9DT05UUk9MCQkweDE2CS8qIEJBU0UrMTYsIEIsIFcgKi8KKyMgZGVmaW5lIFBBUklUWV9DSEVDS19FTkFCTEUgQklUKDApCisjIGRlZmluZSBQQVJJVFlfRVJST1JfQ0xFQVIgIEJJVCgxKQorI2RlZmluZSBQQVJJVFlfU1RBVFVTCQkweDE2CS8qIEJBU0UrMTYsIEIsIFIgKi8KKy8vIyBkZWZpbmUgUEFSSVRZX0NIRUNLX0VOQUJMRSBCSVQoMCkKKyMgZGVmaW5lIFBBUklUWV9FUlJPUl9OT1JNQUwgQklUKDEpCisjIGRlZmluZSBQQVJJVFlfRVJST1JfTFNCICAgIEJJVCgxKQorIyBkZWZpbmUgUEFSSVRZX0VSUk9SX01TQiAgICBCSVQoMikKKworI2RlZmluZSBSRVNFTEVDVF9JRAkJMHgxOAkvKiBCQVNFKzE4LCBCLCBSICovCisKKyNkZWZpbmUgQ09NTUFORF9DT05UUk9MCQkweDE4CS8qIEJBU0UrMTgsIFcsIFcgKi8KKyMgZGVmaW5lIENMRUFSX0NEQl9GSUZPX1BPSU5URVIgQklUKDApCisjIGRlZmluZSBBVVRPX0NPTU1BTkRfUEhBU0UgICAgIEJJVCgxKQorIyBkZWZpbmUgQVVUT1NDU0lfU1RBUlQgICAgICAgICBCSVQoMikKKyMgZGVmaW5lIEFVVE9TQ1NJX1JFU1RBUlQgICAgICAgQklUKDMpCisjIGRlZmluZSBBVVRPX1BBUkFNRVRFUiAgICAgICAgIEJJVCg0KQorIyBkZWZpbmUgQVVUT19BVE4gICAgICAgICAgICAgICBCSVQoNSkKKyMgZGVmaW5lIEFVVE9fTVNHSU5fMDBfT1JfMDQgICAgQklUKDYpCisjIGRlZmluZSBBVVRPX01TR0lOXzAyICAgICAgICAgIEJJVCg3KQorIyBkZWZpbmUgQVVUT19NU0dJTl8wMyAgICAgICAgICBCSVQoOCkKKworI2RlZmluZSBTRVRfQVJCSVQJCTB4MWEJLyogQkFTRSsxYSwgQiwgVyAqLworIyBkZWZpbmUgQVJCSVRfR08gICAgQklUKDApCisjIGRlZmluZSBBUkJJVF9DTEVBUiBCSVQoMSkKKworI2RlZmluZSBBUkJJVF9TVEFUVVMJCTB4MWEJLyogQkFTRSsxYSwgQiwgUiAqLworLy8jIGRlZmluZSBBUkJJVF9HTyAgICAgICAgICAgICBCSVQoMCkKKyMgZGVmaW5lIEFSQklUX1dJTiAgICAgICAgICAgIEJJVCgxKQorIyBkZWZpbmUgQVJCSVRfRkFJTCAgICAgICAgICAgQklUKDIpCisjIGRlZmluZSBBVVRPX1BBUkFNRVRFUl9WQUxJRCBCSVQoMykKKyMgZGVmaW5lIFNHVF9WQUxJRCAgICAgICAgICAgIEJJVCg0KQorCisjZGVmaW5lIFNZTkNfUkVHCQkweDFjCS8qIEJBU0UrMWMsIEIsIFIvVyAqLworCisjZGVmaW5lIEFDS19XSURUSAkJMHgxZAkvKiBCQVNFKzFkLCBCLCBSL1cgKi8KKworI2RlZmluZSBTQ1NJX0RBVEFfV0lUSF9BQ0sJMHgyMAkvKiBCQVNFKzIwLCBCLCBSL1cgKi8KKyNkZWZpbmUgU0NTSV9PVVRfTEFUQ0hfVEFSR0VUX0lEIDB4MjIJLyogQkFTRSsyMiwgQiwgVyAqLworI2RlZmluZSBTQ1NJX0RBVEFfSU4JCTB4MjIJLyogQkFTRSsyMiwgQiwgUiAqLworCisjZGVmaW5lIFNDQU1fQ09OVFJPTAkJMHgyNAkvKiBCQVNFKzI0LCBCLCBXICovCisjZGVmaW5lIFNDQU1fU1RBVFVTCQkweDI0CS8qIEJBU0UrMjQsIEIsIFIgKi8KKyMgZGVmaW5lIFNDQU1fTVNHICAgIEJJVCgwKQorIyBkZWZpbmUgU0NBTV9JTyAgICAgQklUKDEpCisjIGRlZmluZSBTQ0FNX0NEICAgICBCSVQoMikKKyMgZGVmaW5lIFNDQU1fQlNZICAgIEJJVCgzKQorIyBkZWZpbmUgU0NBTV9TRUwgICAgQklUKDQpCisjIGRlZmluZSBTQ0FNX1hGRVJPSyBCSVQoNSkKKworI2RlZmluZSBTQ0FNX0RBVEEJCTB4MjYJLyogQkFTRSsyNiwgQiwgUi9XICovCisjIGRlZmluZSBTRDAJQklUKDApCisjIGRlZmluZSBTRDEJQklUKDEpCisjIGRlZmluZSBTRDIJQklUKDIpCisjIGRlZmluZSBTRDMJQklUKDMpCisjIGRlZmluZSBTRDQJQklUKDQpCisjIGRlZmluZSBTRDUJQklUKDUpCisjIGRlZmluZSBTRDYJQklUKDYpCisjIGRlZmluZSBTRDcJQklUKDcpCisKKyNkZWZpbmUgU0FDS19DTlQJCTB4MjgJLyogQkFTRSsyOCwgRFcsIFIvVyAqLworI2RlZmluZSBTUkVRX0NOVAkJMHgyYwkvKiBCQVNFKzJjLCBEVywgUi9XICovCisKKyNkZWZpbmUgRklGT19EQVRBX0xPVwkJMHgzMAkvKiBCQVNFKzMwLCBCL1cvRFcsIFIvVyAqLworI2RlZmluZSBGSUZPX0RBVEFfSElHSAkJMHgzMgkvKiBCQVNFKzMyLCBCL1csIFIvVyAqLworI2RlZmluZSBCTV9TVEFSVF9BRFIJCTB4MzQJLyogQkFTRSszNCwgRFcsIFIvVyAqLworCisjZGVmaW5lIEJNX0NOVAkJCTB4MzgJLyogQkFTRSszOCwgRFcsIFIvVyAqLworIyBkZWZpbmUgQk1fQ09VTlRfTUFTSyAweDAwMDFmZmZmVUwKKyMgZGVmaW5lIFNHVEVORCAgICAgICAgQklUKDMxKSAgICAgIC8qIExhc3QgU0dUIG1hcmtlciAqLworCisjZGVmaW5lIFNHVF9BRFIJCQkweDNjCS8qIEJBU0UrM2MsIERXLCBSL1cgKi8KKyNkZWZpbmUgV0FJVF9SRUcJCTB4NDAJLyogQmkgb25seSAqLworCisjZGVmaW5lIFNDU0lfRVhFQ1VURV9QSEFTRQkweDQwCS8qIEJBU0UrNDAsIFcsIFIgKi8KKyMgZGVmaW5lIENPTU1BTkRfUEhBU0UgICAgIEJJVCgwKQorIyBkZWZpbmUgREFUQV9JTl9QSEFTRSAgICAgQklUKDEpCisjIGRlZmluZSBEQVRBX09VVF9QSEFTRSAgICBCSVQoMikKKyMgZGVmaW5lIE1TR09VVF9QSEFTRSAgICAgIEJJVCgzKQorIyBkZWZpbmUgU1RBVFVTX1BIQVNFICAgICAgQklUKDQpCisjIGRlZmluZSBJTExFR0FMX1BIQVNFICAgICBCSVQoNSkKKyMgZGVmaW5lIEJVU19GUkVFX09DQ1VFUiAgIEJJVCg2KQorIyBkZWZpbmUgTVNHX0lOX09DQ1VFUiAgICAgQklUKDcpCisjIGRlZmluZSBNU0dfT1VUX09DQ1VFUiAgICBCSVQoOCkKKyMgZGVmaW5lIFNFTEVDVElPTl9USU1FT1VUIEJJVCg5KQorIyBkZWZpbmUgTVNHSU5fMDBfVkFMSUQgICAgQklUKDEwKQorIyBkZWZpbmUgTVNHSU5fMDJfVkFMSUQgICAgQklUKDExKQorIyBkZWZpbmUgTVNHSU5fMDNfVkFMSUQgICAgQklUKDEyKQorIyBkZWZpbmUgTVNHSU5fMDRfVkFMSUQgICAgQklUKDEzKQorIyBkZWZpbmUgQVVUT1NDU0lfQlVTWSAgICAgQklUKDE1KQorCisjZGVmaW5lIFNDU0lfQ1NCX0lOCQkweDQyCS8qIEJBU0UrNDIsIEIsIFIgKi8KKworI2RlZmluZSBTQ1NJX01TR19PVVQJCTB4NDQJLyogQkFTRSs0NCwgRFcsIFIvVyAqLworIyBkZWZpbmUgTVNHT1VUX0NPVU5UX01BU0sgKEJJVCgwKXxCSVQoMSkpCisjIGRlZmluZSBNVl9WQUxJRAkgICAgQklUKDcpCisKKyNkZWZpbmUgU0VMX1RJTUVfT1VUCQkweDQ4CS8qIEJBU0UrNDgsIFcsIFIvVyAqLworI2RlZmluZSBTQVZFRF9TQUNLX0NOVAkJMHg0YwkvKiBCQVNFKzRjLCBEVywgUiAqLworCisjZGVmaW5lIEhUT1NEQVRBREVMQVkJCTB4NTAJLyogQkFTRSs1MCwgQiwgUi9XICovCisjZGVmaW5lIFNUT0hEQVRBREVMQVkJCTB4NTQJLyogQkFTRSs1NCwgQiwgUi9XICovCisjZGVmaW5lIEFDS1NVTUNIRUNLUkQJCTB4NTgJLyogQkFTRSs1OCwgVywgUiAqLworI2RlZmluZSBSRVFTVU1DSEVDS1JECQkweDVjCS8qIEJBU0UrNWMsIFcsIFIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKiovCisvKiBpbmRleGVkIHJlZ2lzdGVyICovCisvKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ0xPQ0tfRElWCQkweDAwCS8qIEJBU0UrMDgsIElEWCswMCwgQiwgUi9XICovCisjIGRlZmluZSBDTE9DS18yICBCSVQoMCkJLyogTUNMSy8yICovCisjIGRlZmluZSBDTE9DS180ICBCSVQoMSkJLyogTUNMSy80ICovCisjIGRlZmluZSBQQ0lDTEsJICBCSVQoNykJLyogUENJQ0xLICgzM01IeikgKi8KKworI2RlZmluZSBURVJNX1BXUl9DT05UUk9MCTB4MDEJLyogQkFTRSswOCwgSURYKzAxLCBCLCBSL1cgKi8KKyMgZGVmaW5lIEJQV1IgIEJJVCgwKQorIyBkZWZpbmUgU0VOU0UgQklUKDEpCS8qIFJlYWQgT25seSAqLworCisjZGVmaW5lIEVYVF9QT1JUX0REUgkJMHgwMgkvKiBCQVNFKzA4LCBJRFgrMDIsIEIsIFIvVyAqLworI2RlZmluZSBFWFRfUE9SVAkJMHgwMwkvKiBCQVNFKzA4LCBJRFgrMDMsIEIsIFIvVyAqLworIyBkZWZpbmUgTEVEX09OCSAoMCkKKyMgZGVmaW5lIExFRF9PRkYgQklUKDApCisKKyNkZWZpbmUgSVJRX1NFTEVDVAkJMHgwNAkvKiBCQVNFKzA4LCBJRFgrMDQsIFcsIFIvVyAqLworIyBkZWZpbmUgSVJRU0VMRUNUX1JFU0VMRUNUX0lSUSAgICAgIEJJVCgwKQorIyBkZWZpbmUgSVJRU0VMRUNUX1BIQVNFX0NIQU5HRV9JUlEgIEJJVCgxKQorIyBkZWZpbmUgSVJRU0VMRUNUX1NDU0lSRVNFVF9JUlEgICAgIEJJVCgyKQorIyBkZWZpbmUgSVJRU0VMRUNUX1RJTUVSX0lSUSAgICAgICAgIEJJVCgzKQorIyBkZWZpbmUgSVJRU0VMRUNUX0ZJRk9fU0hMRF9JUlEgICAgIEJJVCg0KQorIyBkZWZpbmUgSVJRU0VMRUNUX1RBUkdFVF9BQk9SVF9JUlEgIEJJVCg1KQorIyBkZWZpbmUgSVJRU0VMRUNUX01BU1RFUl9BQk9SVF9JUlEgIEJJVCg2KQorIyBkZWZpbmUgSVJRU0VMRUNUX1NFUlJfSVJRICAgICAgICAgIEJJVCg3KQorIyBkZWZpbmUgSVJRU0VMRUNUX1BFUlJfSVJRICAgICAgICAgIEJJVCg4KQorIyBkZWZpbmUgSVJRU0VMRUNUX0JNQ05URVJSX0lSUSAgICAgIEJJVCg5KQorIyBkZWZpbmUgSVJRU0VMRUNUX0FVVE9fU0NTSV9TRVFfSVJRIEJJVCgxMCkKKworI2RlZmluZSBPTERfU0NTSV9QSEFTRQkJMHgwNQkvKiBCQVNFKzA4LCBJRFgrMDUsIEIsIFIgKi8KKyMgZGVmaW5lIE9MRF9NU0cgIEJJVCgwKQorIyBkZWZpbmUgT0xEX0lPICAgQklUKDEpCisjIGRlZmluZSBPTERfQ0QgICBCSVQoMikKKyMgZGVmaW5lIE9MRF9CVVNZIEJJVCgzKQorCisjZGVmaW5lIEZJRk9fRlVMTF9TSExEX0NPVU5UCTB4MDYJLyogQkFTRSswOCwgSURYKzA2LCBCLCBSL1cgKi8KKyNkZWZpbmUgRklGT19FTVBUWV9TSExEX0NPVU5UCTB4MDcJLyogQkFTRSswOCwgSURYKzA3LCBCLCBSL1cgKi8KKworI2RlZmluZSBFWFBfUk9NX0NPTlRST0wJCTB4MDgJLyogQkFTRSswOCwgSURYKzA4LCBCLCBSL1cgKi8gLyogZXh0ZXJuYWwgUk9NIGNvbnRyb2wgKi8KKyMgZGVmaW5lIFJPTV9XUklURV9FTkIgQklUKDApCisjIGRlZmluZSBJT19BQ0NFU1NfRU5CIEJJVCgxKQorIyBkZWZpbmUgUk9NX0FEUl9DTEVBUiBCSVQoMikKKworI2RlZmluZSBFWFBfUk9NX0FEUgkJMHgwOQkvKiBCQVNFKzA4LCBJRFgrMDksIFcsIFIvVyAqLworCisjZGVmaW5lIEVYUF9ST01fREFUQQkJMHgwYQkvKiBCQVNFKzA4LCBJRFgrMGEsIEIsIFIvVyAqLworCisjZGVmaW5lIENISVBfTU9ERQkJMHgwYgkvKiBCQVNFKzA4LCBJRFgrMGIsIEIsIFIgICAqLyAvKiBOaW5qYVNDU0ktMzJCaSBvbmx5ICovCisjIGRlZmluZSBPRU0wIEJJVCgxKSAgLyogT0VNIHNlbGVjdCAqLyAvKiAwMD1JLU8gREFUQSwgMDE9S01FLCAxMD1Xb3JrYml0LCAxMT1FeHQgUk9NICovCisjIGRlZmluZSBPRU0xIEJJVCgyKSAgLyogT0VNIHNlbGVjdCAqLworIyBkZWZpbmUgT1BUQiBCSVQoMykgIC8qIEtNRSBtb2RlIHNlbGVjdCAqLworIyBkZWZpbmUgT1BUQyBCSVQoNCkgIC8qIEtNRSBtb2RlIHNlbGVjdCAqLworIyBkZWZpbmUgT1BURCBCSVQoNSkgIC8qIEtNRSBtb2RlIHNlbGVjdCAqLworIyBkZWZpbmUgT1BURSBCSVQoNikgIC8qIEtNRSBtb2RlIHNlbGVjdCAqLworIyBkZWZpbmUgT1BURiBCSVQoNykgIC8qIFBvd2VyIG1hbmFnZW1lbnQgKi8KKworI2RlZmluZSBNSVNDX1dSCQkJMHgwYwkvKiBCQVNFKzA4LCBJRFgrMGMsIFcsIFIvVyAqLworI2RlZmluZSBNSVNDX1JECQkJMHgwYworIyBkZWZpbmUgU0NTSV9ESVJFQ1RJT05fREVURUNUT1JfU0VMRUNUIEJJVCgwKQorIyBkZWZpbmUgU0NTSTJfSE9TVF9ESVJFQ1RJT05fVkFMSUQJQklUKDEpCS8qIFJlYWQgb25seSAqLworIyBkZWZpbmUgSE9TVDJfU0NTSV9ESVJFQ1RJT05fVkFMSUQJQklUKDIpCS8qIFJlYWQgb25seSAqLworIyBkZWZpbmUgREVMQVlFRF9CTVNUQVJUICAgICAgICAgICAgICAgIEJJVCgzKQorIyBkZWZpbmUgTUFTVEVSX1RFUk1JTkFUSU9OX1NFTEVDVCAgICAgIEJJVCg0KQorIyBkZWZpbmUgQk1SRVFfTkVHQVRFX1RJTUlOR19TRUwgICAgICAgIEJJVCg1KQorIyBkZWZpbmUgQVVUT1NFTF9USU1JTkdfU0VMICAgICAgICAgICAgIEJJVCg2KQorIyBkZWZpbmUgTUlTQ19NQUJPUlRfTUFTSwkJQklUKDcpCisjIGRlZmluZSBCTVNUT1BfQ0hBTkdFMl9OT05EQVRBX1BIQVNFCUJJVCg4KQorCisjZGVmaW5lIEJNX0NZQ0xFCQkweDBkCS8qIEJBU0UrMDgsIElEWCswZCwgQiwgUi9XICovCisjIGRlZmluZSBCTV9DWUNMRTAJCSBCSVQoMCkKKyMgZGVmaW5lIEJNX0NZQ0xFMQkJIEJJVCgxKQorIyBkZWZpbmUgQk1fRlJBTUVfQVNTRVJUX1RJTUlORwkgQklUKDIpCisjIGRlZmluZSBCTV9JUkRZX0FTU0VSVF9USU1JTkcJIEJJVCgzKQorIyBkZWZpbmUgQk1fU0lOR0xFX0JVU19NQVNURVIJIEJJVCg0KQorIyBkZWZpbmUgTUVNUkRfQ01EMCAgICAgICAgICAgICAgQklUKDUpCisjIGRlZmluZSBTR1RfQVVUT19QQVJBX01FTUVEX0NNRCBCSVQoNikKKyMgZGVmaW5lIE1FTVJEX0NNRDEgICAgICAgICAgICAgIEJJVCg3KQorCisKKyNkZWZpbmUgU1JFUV9FREdICQkweDBlCS8qIEJBU0UrMDgsIElEWCswZSwgQiwgVyAqLworIyBkZWZpbmUgU1JFUV9FREdIX1NFTEVDVCBCSVQoMCkKKworI2RlZmluZSBVUF9DTlQJCQkweDBmCS8qIEJBU0UrMDgsIElEWCswZiwgQiwgVyAqLworIyBkZWZpbmUgUkVRQ05UX1VQICBCSVQoMCkKKyMgZGVmaW5lIEFDS0NOVF9VUCAgQklUKDEpCisjIGRlZmluZSBCTUFEUl9VUCAgIEJJVCg0KQorIyBkZWZpbmUgQk1DTlRfVVAgICBCSVQoNSkKKyMgZGVmaW5lIFNHVF9DTlRfVVAgQklUKDcpCisKKyNkZWZpbmUgQ0ZHX0NNRF9TVFIJCTB4MTAJLyogQkFTRSswOCwgSURYKzEwLCBXLCBSICovCisjZGVmaW5lIENGR19MQVRFX0NBQ0hFCQkweDExCS8qIEJBU0UrMDgsIElEWCsxMSwgVywgUi9XICovCisjZGVmaW5lIENGR19CQVNFX0FEUl8xCQkweDEyCS8qIEJBU0UrMDgsIElEWCsxMiwgVywgUiAqLworI2RlZmluZSBDRkdfQkFTRV9BRFJfMgkJMHgxMwkvKiBCQVNFKzA4LCBJRFgrMTMsIFcsIFIgKi8KKyNkZWZpbmUgQ0ZHX0lOTElORQkJMHgxNAkvKiBCQVNFKzA4LCBJRFgrMTQsIFcsIFIgKi8KKworI2RlZmluZSBTRVJJQUxfUk9NX0NUTAkJMHgxNQkvKiBCQVNFKzA4LCBJRFgrMTUsIEIsIFIgKi8KKyMgZGVmaW5lIFNDTCBCSVQoMCkKKyMgZGVmaW5lIEVOQSBCSVQoMSkKKyMgZGVmaW5lIFNEQSBCSVQoMikKKworI2RlZmluZSBGSUZPX0hTVF9QT0lOVEVSCTB4MTYJLyogQkFTRSswOCwgSURYKzE2LCBCLCBSL1cgKi8KKyNkZWZpbmUgU1JFUV9ERUxBWQkJMHgxNwkvKiBCQVNFKzA4LCBJRFgrMTcsIEIsIFIvVyAqLworI2RlZmluZSBTQUNLX0RFTEFZCQkweDE4CS8qIEJBU0UrMDgsIElEWCsxOCwgQiwgUi9XICovCisjZGVmaW5lIFNSRVFfTk9JU0VfQ0FOQ0VMCTB4MTkJLyogQkFTRSswOCwgSURYKzE5LCBCLCBSL1cgKi8KKyNkZWZpbmUgU0RQX05PSVNFX0NBTkNFTAkweDFhCS8qIEJBU0UrMDgsIElEWCsxYSwgQiwgUi9XICovCisjZGVmaW5lIERFTEFZX1RFU1QJCTB4MWIJLyogQkFTRSswOCwgSURYKzFiLCBCLCBSL1cgKi8KKyNkZWZpbmUgU0QwX05PSVNFX0NBTkNFTAkweDIwCS8qIEJBU0UrMDgsIElEWCsyMCwgQiwgUi9XICovCisjZGVmaW5lIFNEMV9OT0lTRV9DQU5DRUwJMHgyMQkvKiBCQVNFKzA4LCBJRFgrMjEsIEIsIFIvVyAqLworI2RlZmluZSBTRDJfTk9JU0VfQ0FOQ0VMCTB4MjIJLyogQkFTRSswOCwgSURYKzIyLCBCLCBSL1cgKi8KKyNkZWZpbmUgU0QzX05PSVNFX0NBTkNFTAkweDIzCS8qIEJBU0UrMDgsIElEWCsyMywgQiwgUi9XICovCisjZGVmaW5lIFNENF9OT0lTRV9DQU5DRUwJMHgyNAkvKiBCQVNFKzA4LCBJRFgrMjQsIEIsIFIvVyAqLworI2RlZmluZSBTRDVfTk9JU0VfQ0FOQ0VMCTB4MjUJLyogQkFTRSswOCwgSURYKzI1LCBCLCBSL1cgKi8KKyNkZWZpbmUgU0Q2X05PSVNFX0NBTkNFTAkweDI2CS8qIEJBU0UrMDgsIElEWCsyNiwgQiwgUi9XICovCisjZGVmaW5lIFNEN19OT0lTRV9DQU5DRUwJMHgyNwkvKiBCQVNFKzA4LCBJRFgrMjcsIEIsIFIvVyAqLworCisKKy8qCisgKiBVc2VmdWwgQnVzIE1vbml0b3Igc3RhdHVzIGNvbWJpbmF0aW9ucy4KKyAqLworI2RlZmluZSBCVVNNT05fQlVTX0ZSRUUgICAgMAorI2RlZmluZSBCVVNNT05fQ09NTUFORCAgICAgKCBCVVNNT05fQlNZIHwgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU01PTl9DRCB8IEJVU01PTl9SRVEgKQorI2RlZmluZSBCVVNNT05fTUVTU0FHRV9JTiAgKCBCVVNNT05fQlNZIHwgQlVTTU9OX01TRyB8IEJVU01PTl9JTyB8IEJVU01PTl9DRCB8IEJVU01PTl9SRVEgKQorI2RlZmluZSBCVVNNT05fTUVTU0FHRV9PVVQgKCBCVVNNT05fQlNZIHwgQlVTTU9OX01TRyB8ICAgICAgICAgICAgIEJVU01PTl9DRCB8IEJVU01PTl9SRVEgKQorI2RlZmluZSBCVVNNT05fREFUQV9JTiAgICAgKCBCVVNNT05fQlNZIHwgICAgICAgICAgICAgIEJVU01PTl9JTyB8ICAgICAgICAgICAgIEJVU01PTl9SRVEgKQorI2RlZmluZSBCVVNNT05fREFUQV9PVVQgICAgKCBCVVNNT05fQlNZIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU01PTl9SRVEgKQorI2RlZmluZSBCVVNNT05fU1RBVFVTICAgICAgKCBCVVNNT05fQlNZIHwgICAgICAgICAgICAgIEJVU01PTl9JTyB8IEJVU01PTl9DRCB8IEJVU01PTl9SRVEgKQorI2RlZmluZSBCVVNNT05fUkVTRUxFQ1QgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU01PTl9JTyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCVVNNT05fU0VMKQorI2RlZmluZSBCVVNNT05fUEhBU0VfTUFTSyAgKCAgICAgICAgICAgICAgQlVTTU9OX01TRyB8IEJVU01PTl9JTyB8IEJVU01PTl9DRCAgICAgICAgICAgICAgfCBCVVNNT05fU0VMKQorCisjZGVmaW5lIEJVU1BIQVNFX0NPTU1BTkQgICAgICggQlVTTU9OX0NPTU1BTkQgICAgICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9NRVNTQUdFX0lOICAoIEJVU01PTl9NRVNTQUdFX0lOICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfTUVTU0FHRV9PVVQgKCBCVVNNT05fTUVTU0FHRV9PVVQgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX0RBVEFfSU4gICAgICggQlVTTU9OX0RBVEFfSU4gICAgICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9EQVRBX09VVCAgICAoIEJVU01PTl9EQVRBX09VVCAgICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfU1RBVFVTICAgICAgKCBCVVNNT05fU1RBVFVTICAgICAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX1NFTEVDVCAgICAgICggQlVTTU9OX1NFTCB8IEJVU01PTl9JTyApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RydWN0dXJlIGZvciBETUEvU2NhdHRlciBHYXRoZXIgbGlzdAorICovCisjZGVmaW5lIE5TUDMyX1NHX1NJWkUJCVNHX0FMTAorCit0eXBlZGVmIHN0cnVjdCBfbnNwMzJfc2d0YWJsZSB7CisJLyogdmFsdWVzIG11c3QgYmUgbGl0dGxlIGVuZGlhbiAqLworCXUzMl9sZSBhZGRyOyAvKiB0cmFuc2ZlciBhZGRyZXNzICovCisJdTMyX2xlIGxlbjsgIC8qIHRyYW5zZmVyIGxlbmd0aC4gQklUKDMxKSBpcyBmb3IgU0dUX0VORCBtYXJrICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBuc3AzMl9zZ3RhYmxlOworCit0eXBlZGVmIHN0cnVjdCBfbnNwMzJfc2dsdW4geworCW5zcDMyX3NndGFibGUgc2d0W05TUDMyX1NHX1NJWkUrMV07CS8qIFNHIHRhYmxlICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBuc3AzMl9zZ2x1bjsKKyNkZWZpbmUgTlNQMzJfU0dfVEFCTEVfU0laRSAoc2l6ZW9mKG5zcDMyX3NndGFibGUpICogTlNQMzJfU0dfU0laRSAqIE1BWF9UQVJHRVQgKiBNQVhfTFVOKQorCisvKiBBdXRvIHBhcmFtZXRlciBtb2RlIG1lbW9yeSBtYXAuICAgKi8KKy8qIEFsbCB2YWx1ZXMgbXVzdCBiZSBsaXR0bGUgZW5kaWFuLiAqLwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX2F1dG9wYXJhbSB7CisJdTggICAgIGNkYls0ICogMHgxMF07ICAgIC8qIFNDU0kgQ29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAqLworCXUzMl9sZSBtc2dvdXQ7ICAgICAgICAgICAvKiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgKi8KKwl1OCAgICAgc3luY3JlZzsgICAgICAgICAgLyogc3luYyByZWdpc3RlciB2YWx1ZSAgICAgICAgICAgICAgICovCisJdTggICAgIGFja3dpZHRoOyAgICAgICAgIC8qIGFjayB3aWR0aCByZWdpc3RlciB2YWx1ZSAgICAgICAgICAqLworCXU4ICAgICB0YXJnZXRfaWQ7ICAgICAgICAvKiB0YXJnZXQvaG9zdCBkZXZpY2UgaWQgICAgICAgICAgICAgKi8KKwl1OCAgICAgc2FtcGxlX3JlZzsgICAgICAgLyogaGF6YXJkIGtpbGxlciBzYW1wbGluZyByYXRlICAgICAgICovCisJdTE2X2xlIGNvbW1hbmRfY29udHJvbDsgIC8qIGNvbW1hbmQgY29udHJvbCByZWdpc3RlciAgICAgICAgICAqLworCXUxNl9sZSB0cmFuc2Zlcl9jb250cm9sOyAvKiB0cmFuc2ZlciBjb250cm9sIHJlZ2lzdGVyICAgICAgICAgKi8KKwl1MzJfbGUgc2d0X3BvaW50ZXI7ICAgICAgLyogU0cgdGFibGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BICovCisJdTMyX2xlIGR1bW15WzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbnNwMzJfYXV0b3BhcmFtOyAgLyogbXVzdCBiZSBwYWNrZWQgc3RydWN0ICovCisKKy8qCisgKiBob3N0IGRhdGEgc3RydWN0dXJlCisgKi8KKy8qIG1lc3NhZ2UgaW4vb3V0IGJ1ZmZlciAqLworI2RlZmluZSBNU0dPVVRCVUZfTUFYCQkyMAorI2RlZmluZSBNU0dJTkJVRl9NQVgJCTIwCisKKy8qIGZsYWcgZm9yIHRyYW5zX21ldGhvZCAqLworI2RlZmluZSBOU1AzMl9UUkFOU0ZFUl9CVVNNQVNURVIJQklUKDApCisjZGVmaW5lIE5TUDMyX1RSQU5TRkVSX01NSU8JCUJJVCgxKQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworI2RlZmluZSBOU1AzMl9UUkFOU0ZFUl9QSU8JCUJJVCgyKQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGNvbm5lY3RlZCBMVU4gZHluYW1pYyBkYXRhCisgKgorICogTm90ZTogQ3VycmVudGx5IHRhZ2dlZCBxdWV1aW5nIGlzIGRpc2FibGVkLCBlYWNoIG5zcDMyX2x1bnQgaG9sZHMKKyAqICAgICAgIG9uZSBTQ1NJIGNvbW1hbmQgYW5kIG9uZSBzdGF0ZS4KKyAqLworI2RlZmluZSBESVNDUFJJVl9PSwkJQklUKDApCQkvKiBESVNDUFJJViBFbmFibGUgbW9kZSAqLworI2RlZmluZSBNU0dJTjAzCQkJQklUKDEpCQkvKiBBdXRvIE1zZyBJbiAwMyBGbGFnICAqLworCit0eXBlZGVmIHN0cnVjdCBfbnNwMzJfbHVudCB7CisJc3RydWN0IHNjc2lfY21uZAkqU0NwbnQ7CSAgICAvKiBDdXJyZW50IEhhbmRsaW5nIHN0cnVjdCBzY3NpX2NtbmQgKi8KKwl1bnNpZ25lZCBsb25nCSBzYXZlX2RhdHA7ICAvKiBTYXZlIERhdGEgUG9pbnRlciAtIHNhdmVkIHBvc2l0aW9uIGZyb20gaW5pdGlhbCBhZGRyZXNzICovCisJaW50CQkgbXNnaW4wMzsJLyogYXV0byBtc2cgaW4gMDMgZmxhZyAgICAgKi8KKwl1bnNpZ25lZCBpbnQJIHNnX251bTsJLyogVG90YWwgbnVtYmVyIG9mIFNHIGVudHJpZXMgKi8KKwlpbnQJCSBjdXJfZW50cnk7CS8qIEN1cnJlbnQgU0cgZW50cnkgbnVtYmVyICovCisJbnNwMzJfc2dsdW4gICAgICpzZ2x1bjsJCS8qIHNnIHRhYmxlIHBlciBsdW4gICAgICAgICovCisJZG1hX2FkZHJfdCAgICAgICBzZ2x1bl9wYWRkcjsgICAvKiBzZ2x1biBwaHlzaWNhbCBhZGRyZXNzICAqLworfSBuc3AzMl9sdW50OworCisKKy8qCisgKiBTQ1NJIFRBUkdFVC9MVU4gZGVmaW5pdGlvbgorICovCisjZGVmaW5lIE5TUDMyX0hPU1RfU0NTSUlEICAgIDcgIC8qIFNDU0kgaW5pdGlhdG9yIGlzIGV2ZXJ5dGltZSBkZWZpbmVkIGFzIDcgKi8KKyNkZWZpbmUgTUFYX1RBUkdFVAkgICAgIDgKKyNkZWZpbmUgTUFYX0xVTgkJICAgICA4CS8qIFhYWDogSW4gU1BJMywgbWF4IG51bWJlciBvZiBMVU4gaXMgNjQuICovCisKKwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX3N5bmNfdGFibGUgeworCXVuc2lnbmVkIGNoYXIJcGVyaW9kX251bTsJLyogcGVyaW9kIG51bWJlciAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgY2hhcglhY2t3aWR0aDsJLyogYWNrIHdpZHRoIGRlc2lnbmF0ZWQgYnkgcGVyaW9kICovCisJdW5zaWduZWQgY2hhcglzdGFydF9wZXJpb2Q7CS8qIHNlYXJjaCByYW5nZSAtIHN0YXJ0IHBlcmlvZCAgICAqLworCXVuc2lnbmVkIGNoYXIJZW5kX3BlcmlvZDsJLyogc2VhcmNoIHJhbmdlIC0gZW5kIHBlcmlvZCAgICAgICovCisJdW5zaWduZWQgY2hhciAgIHNhbXBsZV9yYXRlOyAgICAvKiBoYXphcmQga2lsbGVyIHBhcmFtZXRlciAgICAgICAgKi8KK30gbnNwMzJfc3luY190YWJsZTsKKworCisvKgorICogc3RydWN0dXJlIGZvciB0YXJnZXQgZGV2aWNlIHN0YXRpYyBkYXRhCisgKi8KKy8qIGZsYWcgZm9yIG5zcDMyX3RhcmdldC5zeW5jX2ZsYWcgKi8KKyNkZWZpbmUgU0RUUl9JTklUSUFUT1IJICBCSVQoMCkgICAgLyogc2VuZGluZyBTRFRSIGZyb20gaW5pdGlhdG9yICAgICAgICAqLworI2RlZmluZSBTRFRSX1RBUkdFVAkgIEJJVCgxKSAgICAvKiBzZW5kaW5nIFNEVFIgZnJvbSB0YXJnZXQgICAgICAgICAgICovCisjZGVmaW5lIFNEVFJfRE9ORQkgIEJJVCgyKSAgICAvKiBleGNoYW5naW5nIFNEVFIgaGFzIGJlZW4gcHJvY2Vzc2VkICovCisKKy8qIHN5bmNyb25vdXMgcGVyaW9kIHZhbHVlIGZvciBuc3AzMl90YXJnZXQuY29uZmlnX21heCAqLworI2RlZmluZSBGQVNUNU0JCQkweDMyCisjZGVmaW5lIEZBU1QxME0JCQkweDE5CisjZGVmaW5lIFVMVFJBMjBNCQkweDBjCisKKy8qIGZsYWcgZm9yIG5zcDMyX3RhcmdldC57c3luY19vZmZzZXR9LCBwZXJpb2QgKi8KKyNkZWZpbmUgQVNZTkNfT0ZGU0VUCQkwCS8qIGFzeW5jaHJvbm91cyB0cmFuc2ZlciAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lOQ19PRkZTRVQJCTB4ZgkvKiBzeW5jaHJvbm91cyB0cmFuc2ZlciBtYXggb2Zmc2V0ICovCisKKy8qIHN5bmNyZWc6CisgIGJpdDowNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAorICAgICAgLS0tUEVSSU9ELS0gLS0tT0ZGU0VULS0gICAqLworI2RlZmluZSBUT19TWU5DUkVHKHBlcmlvZCwgb2Zmc2V0KSAoKChwZXJpb2QpICYgMHgwZikgPDwgNCB8ICgob2Zmc2V0KSAmIDB4MGYpKQorCit0eXBlZGVmIHN0cnVjdCBfbnNwMzJfdGFyZ2V0IHsKKwl1bnNpZ25lZCBjaGFyCXN5bmNyZWc7CS8qIHZhbHVlIGZvciBTWU5DUkVHICAgKi8KKwl1bnNpZ25lZCBjaGFyCWFja3dpZHRoOwkvKiB2YWx1ZSBmb3IgQUNLV0lEVEggICovCisJdW5zaWduZWQgY2hhciAgIHBlcmlvZDsgICAgICAgICAvKiBzeW5jIHBlcmlvZCAoMC0yNTUpICovCisJdW5zaWduZWQgY2hhcglvZmZzZXQ7CQkvKiBzeW5jIG9mZnNldCAoMC0xNSkgICovCisJaW50CQlzeW5jX2ZsYWc7CS8qIFNEVFJfKiwgMCAgICAgICAgICAgKi8KKwlpbnQJCWxpbWl0X2VudHJ5OwkvKiBtYXggc3BlZWQgbGltaXQgZW50cnkgZGVzaWduYXRlZAorCQkJCQkgICBieSBFRVBST00gY29uZmlndXJhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgICBzYW1wbGVfcmVnOyAgICAgLyogU1JFUSBoYXphcmQga2lsbGVyIHJlZ2lzdGVyICovCit9IG5zcDMyX3RhcmdldDsKKwordHlwZWRlZiBzdHJ1Y3QgX25zcDMyX2h3X2RhdGEgeworCWludCAgICAgICAgICAgSXJxTnVtYmVyOworCWludCAgICAgICAgICAgQmFzZUFkZHJlc3M7CisJaW50ICAgICAgICAgICBOdW1BZGRyZXNzOworCXZvaWQgX19pb21lbSAqTW1pb0FkZHJlc3M7CisjZGVmaW5lIE5TUDMyX01NSU9fT0ZGU0VUIDB4MDgwMAorCXVuc2lnbmVkIGxvbmcgTW1pb0xlbmd0aDsKKworCXN0cnVjdCBzY3NpX2NtbmQgKkN1cnJlbnRTQzsKKworCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICpQY2k7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9kZXZpZDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAgICAgICAgICAqSG9zdDsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgTG9jazsKKworCWNoYXIgaW5mb19zdHJbMTAwXTsKKworCS8qIGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9uICovCisJbnNwMzJfc2dsdW4gICAgICAqc2dfbGlzdDsJLyogc2dsaXN0IHZpcnR1eGFsIGFkZHJlc3MgICAgICAgICAqLworCWRtYV9hZGRyX3QJICBzZ19wYWRkcjsgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaHdfc2dfdGFibGUgKi8KKwluc3AzMl9hdXRvcGFyYW0gICphdXRvcGFyYW07CS8qIGF1dG8gcGFyYW1ldGVyIHRyYW5zZmVyIHJlZ2lvbiAgKi8KKwlkbWFfYWRkcl90CSAgYXV0b19wYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBhdXRvcGFyYW0gICAqLworCWludCAJCSAgY3VyX2VudHJ5OwkvKiBjdXJyZW50IHNndCBlbnRyeSAgICAgICAgICAgICAgICovCisKKwkvKiB0YXJnZXQvTFVOICovCisJbnNwMzJfbHVudCAgICAgICAqY3VyX2x1bnQ7CS8qIEN1cnJlbnQgY29ubmVjdGVkIExVTiB0YWJsZSAqLworCW5zcDMyX2x1bnQgICAgICAgIGx1bnRbTUFYX1RBUkdFVF1bTUFYX0xVTl07ICAvKiBBbGwgTFVOIHRhYmxlICovCisKKwluc3AzMl90YXJnZXQgICAgICpjdXJfdGFyZ2V0OwkvKiBDdXJyZW50IGNvbm5lY3RlZCBTQ1NJIElEICAgICovCisJbnNwMzJfdGFyZ2V0CSAgdGFyZ2V0W01BWF9UQVJHRVRdOwkgICAgIC8qIFNDU0kgSUQgKi8KKwlpbnQJCSAgY3VyX2lkOwkvKiBDdXJyZW50IGNvbm5lY3RlZCB0YXJnZXQgSUQgICovCisJaW50CQkgIGN1cl9sdW47CS8qIEN1cnJlbnQgY29ubmVjdGVkIHRhcmdldCBMVU4gKi8KKworCS8qIGJlaGF2aW9yIHNldHRpbmcgcGFyYW1ldGVycyAqLworCWludAkJICB0cmFuc19tZXRob2Q7CS8qIHRyYW5zZmVyIG1ldGhvZCBmbGFnICAgICAgICAgICAgKi8KKwlpbnQJCSAgcmVzZXR0aW1lOwkvKiBSZXNldCB0aW1lICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IAkJICBjbG9jazsgICAgICAgCS8qIGNsb2NrIGRpdmlkaW5nIGZsYWcgICAgICAgICAgICAgKi8KKwluc3AzMl9zeW5jX3RhYmxlICpzeW5jdDsJLyogc3luY190YWJsZSBkZXRlcm1pbmVkIGJ5IGNsb2NrICAqLworCWludAkJICBzeW5jbnVtOwkvKiB0aGUgbWF4IG51bWJlciBvZiBzeW5jdCBlbGVtZW50ICovCisKKwkvKiBtZXNzYWdlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgbXNnb3V0YnVmW01TR09VVEJVRl9NQVhdOyAvKiBtc2dvdXQgYnVmZmVyICAgICovCisJY2hhcgkgICAgICBtc2dvdXRfbGVuOwkJLyogbXNnb3V0YnVmIGxlbmd0aCAqLworCXVuc2lnbmVkIGNoYXIgbXNnaW5idWYgW01TR0lOQlVGX01BWF07CS8qIG1lZ2luIGJ1ZmZlciAgICAgKi8KKwljaGFyCSAgICAgIG1zZ2luX2xlbjsJCS8qIG1zZ2luYnVmIGxlbmd0aCAgKi8KKworfSBuc3AzMl9od19kYXRhOworCisvKgorICogVElNRSBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgUkVTRVRfSE9MRF9USU1FCQkxMDAwMAkvKiByZXNldCB0aW1lIGluIHVzIChTQ1NJLTIgc2F5cyB0aGUKKwkJCQkJICAgbWluaW11bSBpcyAyNXVzKSAqLworI2RlZmluZSBTRUxfVElNRU9VVF9USU1FCTEwMDAwCS8qIDI1MG1zIGRlZmluZWQgaW4gU0NTSSBzcGVjaWZpY2F0aW9uCisJCQkJCSAgICgyNS42dXMvMXVuaXQpICovCisjZGVmaW5lIEFSQklUX1RJTUVPVVRfVElNRQkxMDAJLyogMTAwdXMgKi8KKyNkZWZpbmUgUkVRU0FDS19USU1FT1VUX1RJTUUJMTAwMDAJLyogbWF4IHdhaXQgdGltZSBmb3IgUkVRL1NBQ0sgYXNzZXJ0aW9uCisJCQkJCSAgIG9yIG5lZ2F0aW9uLCAxMDAwMHVzID09IDEwbXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb21wYXRpYmlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIGZvciBLZXJuZWwgMi40ICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKKyMgZGVmaW5lIHNjc2lfcmVnaXN0ZXJfaG9zdCh0ZW1wbGF0ZSkgCXNjc2lfcmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCB0ZW1wbGF0ZSkKKyMgZGVmaW5lIHNjc2lfdW5yZWdpc3Rlcl9ob3N0KHRlbXBsYXRlKSBzY3NpX3VucmVnaXN0ZXJfbW9kdWxlKE1PRFVMRV9TQ1NJX0hBLCB0ZW1wbGF0ZSkKKyMgZGVmaW5lIHNjc2lfaG9zdF9wdXQoaG9zdCkgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCkKKyMgZGVmaW5lIHBjaV9uYW1lKHBjaV9kZXYpICAgICAgICAgICAgICAoKHBjaV9kZXYpLT5zbG90X25hbWUpCisKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyMgZGVmaW5lIElSUV9OT05FICAgICAgLyogKi8KKyMgZGVmaW5lIElSUV9IQU5ETEVEICAgLyogKi8KKyMgZGVmaW5lIElSUV9SRVRWQUwoeCkgLyogKi8KKworLyogVGhpcyBpcyBhZC1ob2MgdmVyc2lvbiBvZiBzY3NpX2hvc3RfZ2V0X25leHQoKSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfZ2V0X25leHQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCXJldHVybiBzY3NpX2hvc3RsaXN0OworCX0gZWxzZSB7CisJCXJldHVybiBob3N0LT5uZXh0OworCX0KK30KKworLyogVGhpcyBpcyBhZC1ob2MgdmVyc2lvbiBvZiBzY3NpX2hvc3RfaG5fZ2V0KCkgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2huX2dldCh1bnNpZ25lZCBzaG9ydCBob3N0bm8pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKworCWZvciAoaG9zdCA9IHNjc2lfaG9zdF9nZXRfbmV4dChOVUxMKTsgaG9zdCAhPSBOVUxMOworCSAgICAgaG9zdCA9IHNjc2lfaG9zdF9nZXRfbmV4dChob3N0KSkgeworCQlpZiAoaG9zdC0+aG9zdF9ubyA9PSBob3N0bm8pIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGhvc3Q7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9OU1AzMl9IICovCisvKiBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9uc3AzMl9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL25zcDMyX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzYzU5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9uc3AzMl9kZWJ1Zy5jCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogV29ya2JpdCBOaW5qYVNDU0ktMzJCaS9VREUgUENJL0NhcmRCdXMgU0NTSSBIb3N0IEJ1cyBBZGFwdGVyIGRyaXZlcgorICogRGVidWcgcm91dGluZQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisvKgorICogU2hvdyB0aGUgY29tbWFuZCBkYXRhIG9mIGEgY29tbWFuZAorICovCitzdGF0aWMgY29uc3QgY2hhciB1bmtub3duW10gPSAiVU5LTk9XTiI7CisKK3N0YXRpYyBjb25zdCBjaGFyICogZ3JvdXBfMF9jb21tYW5kc1tdID0geworLyogMDAtMDMgKi8gIlRlc3QgVW5pdCBSZWFkeSIsICJSZXplcm8gVW5pdCIsIHVua25vd24sICJSZXF1ZXN0IFNlbnNlIiwKKy8qIDA0LTA3ICovICJGb3JtYXQgVW5pdCIsICJSZWFkIEJsb2NrIExpbWl0cyIsIHVua25vd24sICJSZWFzc3NpZ24gQmxvY2tzIiwKKy8qIDA4LTBkICovICJSZWFkICg2KSIsIHVua25vd24sICJXcml0ZSAoNikiLCAiU2VlayAoNikiLCB1bmtub3duLCB1bmtub3duLAorLyogMGUtMTIgKi8gdW5rbm93biwgIlJlYWQgUmV2ZXJzZSIsICJXcml0ZSBGaWxlbWFya3MiLCAiU3BhY2UiLCAiSW5xdWlyeSIsICAKKy8qIDEzLTE2ICovIHVua25vd24sICJSZWNvdmVyIEJ1ZmZlcmVkIERhdGEiLCAiTW9kZSBTZWxlY3QiLCAiUmVzZXJ2ZSIsCisvKiAxNy0xYiAqLyAiUmVsZWFzZSIsICJDb3B5IiwgIkVyYXNlIiwgIk1vZGUgU2Vuc2UiLCAiU3RhcnQvU3RvcCBVbml0IiwKKy8qIDFjLTFkICovICJSZWNlaXZlIERpYWdub3N0aWMiLCAiU2VuZCBEaWFnbm9zdGljIiwgCisvKiAxZS0xZiAqLyAiUHJldmVudC9BbGxvdyBNZWRpdW0gUmVtb3ZhbCIsIHVua25vd24sCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyICpncm91cF8xX2NvbW1hbmRzW10gPSB7CisvKiAyMC0yMiAqLyAgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwKKy8qIDIzLTI4ICovIHVua25vd24sIHVua25vd24sICJSZWFkIENhcGFjaXR5IiwgdW5rbm93biwgdW5rbm93biwgIlJlYWQgKDEwKSIsCisvKiAyOS0yZCAqLyB1bmtub3duLCAiV3JpdGUgKDEwKSIsICJTZWVrICgxMCkiLCB1bmtub3duLCB1bmtub3duLAorLyogMmUtMzEgKi8gIldyaXRlIFZlcmlmeSIsIlZlcmlmeSIsICJTZWFyY2ggSGlnaCIsICJTZWFyY2ggRXF1YWwiLAorLyogMzItMzQgKi8gIlNlYXJjaCBMb3ciLCAiU2V0IExpbWl0cyIsICJQcmVmZXRjaCBvciBSZWFkIFBvc2l0aW9uIiwgCisvKiAzNS0zNyAqLyAiU3luY2hyb25pemUgQ2FjaGUiLCJMb2NrL1VubG9jayBDYWNoZSIsICJSZWFkIERlZmVjdCBEYXRhIiwKKy8qIDM4LTNjICovICJNZWRpdW0gU2NhbiIsICJDb21wYXJlIiwiQ29weSBWZXJpZnkiLCAiV3JpdGUgQnVmZmVyIiwgIlJlYWQgQnVmZmVyIiwKKy8qIDNkLTNmICovICJVcGRhdGUgQmxvY2siLCAiUmVhZCBMb25nIiwgICJXcml0ZSBMb25nIiwKK307CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmdyb3VwXzJfY29tbWFuZHNbXSA9IHsKKy8qIDQwLTQxICovICJDaGFuZ2UgRGVmaW5pdGlvbiIsICJXcml0ZSBTYW1lIiwgCisvKiA0Mi00OCAqLyAiUmVhZCBTdWItQ2goY2QpIiwgIlJlYWQgVE9DIiwgIlJlYWQgSGVhZGVyKGNkKSIsICJQbGF5IEF1ZGlvKGNkKSIsIHVua25vd24sICJQbGF5IEF1ZGlvIE1TRihjZCkiLCAiUGxheSBBdWRpbyBUcmFjay9JbmRleChjZCkiLCAKKy8qIDQ5LTRmICovICJQbGF5IFRyYWNrIFJlbGF0aXZlKDEwKShjZCkiLCB1bmtub3duLCAiUGF1c2UvUmVzdW1lKGNkKSIsICJMb2cgU2VsZWN0IiwgIkxvZyBTZW5zZSIsIHVua25vd24sIHVua25vd24sCisvKiA1MC01NSAqLyB1bmtub3duLCB1bmtub3duLCB1bmtub3duLCB1bmtub3duLCB1bmtub3duLCAiTW9kZSBTZWxlY3QgKDEwKSIsCisvKiA1Ni01YiAqLyB1bmtub3duLCB1bmtub3duLCB1bmtub3duLCB1bmtub3duLCAiTW9kZSBTZW5zZSAoMTApIiwgdW5rbm93biwKKy8qIDVjLTVmICovIHVua25vd24sIHVua25vd24sIHVua25vd24sCit9OworCisjZGVmaW5lIGdyb3VwKG9wY29kZSkgKCgob3Bjb2RlKSA+PiA1KSAmIDcpCisKKyNkZWZpbmUgUkVTRVJWRURfR1JPVVAgIDAKKyNkZWZpbmUgVkVORE9SX0dST1VQICAgIDEKKyNkZWZpbmUgTk9URVhUX0dST1VQICAgIDIKKworc3RhdGljIGNvbnN0IGNoYXIgKipjb21tYW5kc1tdID0geworICAgIGdyb3VwXzBfY29tbWFuZHMsIGdyb3VwXzFfY29tbWFuZHMsIGdyb3VwXzJfY29tbWFuZHMsIAorICAgIChjb25zdCBjaGFyICoqKSBSRVNFUlZFRF9HUk9VUCwgKGNvbnN0IGNoYXIgKiopIFJFU0VSVkVEX0dST1VQLCAKKyAgICAoY29uc3QgY2hhciAqKikgTk9URVhUX0dST1VQLCAoY29uc3QgY2hhciAqKikgVkVORE9SX0dST1VQLCAKKyAgICAoY29uc3QgY2hhciAqKikgVkVORE9SX0dST1VQCit9OworCitzdGF0aWMgY29uc3QgY2hhciByZXNlcnZlZFtdID0gIlJFU0VSVkVEIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZlbmRvcltdID0gIlZFTkRPUiBTUEVDSUZJQyI7CisKK3N0YXRpYyB2b2lkIHByaW50X29wY29kZWsodW5zaWduZWQgY2hhciBvcGNvZGUpCit7CisJY29uc3QgY2hhciAqKnRhYmxlID0gY29tbWFuZHNbIGdyb3VwKG9wY29kZSkgXTsKKworCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpIHRhYmxlKSB7CisJY2FzZSBSRVNFUlZFRF9HUk9VUDoKKwkJcHJpbnRrKCIlc1slMDJ4XSAiLCByZXNlcnZlZCwgb3Bjb2RlKTsgCisJCWJyZWFrOworCWNhc2UgTk9URVhUX0dST1VQOgorCQlwcmludGsoIiVzKG5vdGV4dClbJTAyeF0gIiwgdW5rbm93biwgb3Bjb2RlKTsgCisJCWJyZWFrOworCWNhc2UgVkVORE9SX0dST1VQOgorCQlwcmludGsoIiVzWyUwMnhdICIsIHZlbmRvciwgb3Bjb2RlKTsgCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICh0YWJsZVtvcGNvZGUgJiAweDFmXSAhPSB1bmtub3duKQorCQkJcHJpbnRrKCIlc1slMDJ4XSAiLCB0YWJsZVtvcGNvZGUgJiAweDFmXSwgb3Bjb2RlKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIlc1slMDJ4XSAiLCB1bmtub3duLCBvcGNvZGUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvbW1hbmRrICh1bnNpZ25lZCBjaGFyICpjb21tYW5kKQoreworCWludCBpLHM7CisvLwlwcmludGsoS0VSTl9ERUJVRyk7CisJcHJpbnRfb3Bjb2Rlayhjb21tYW5kWzBdKTsKKwkvKnByaW50ayhLRVJOX0RFQlVHICIlcyAiLCBfX0ZVTkNUSU9OX18pOyovCisJaWYgKChjb21tYW5kWzBdID4+IDUpID09IDYgfHwKKwkgICAgKGNvbW1hbmRbMF0gPj4gNSkgPT0gNyApIHsKKwkJcyA9IDEyOyAvKiB2ZW5kZXIgc3BlY2lmaWMgKi8KKwl9IGVsc2UgeworCQlzID0gQ09NTUFORF9TSVpFKGNvbW1hbmRbMF0pOworCX0KKworCWZvciAoIGkgPSAxOyBpIDwgczsgKytpKSB7CisJCXByaW50aygiJTAyeCAiLCBjb21tYW5kW2ldKTsKKwl9CisKKwlzd2l0Y2ggKHMpIHsKKwljYXNlIDY6CisJCXByaW50aygiTEJBPSVkIGxlbj0lZCIsCisJCSAgICAgICAoKCh1bnNpZ25lZCBpbnQpY29tbWFuZFsxXSAmIDB4MGYpIDw8IDE2KSB8CisJCSAgICAgICAoICh1bnNpZ25lZCBpbnQpY29tbWFuZFsyXSAgICAgICAgIDw8ICA4KSB8CisJCSAgICAgICAoICh1bnNpZ25lZCBpbnQpY29tbWFuZFszXSAgICAgICAgICAgICAgKSwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpY29tbWFuZFs0XQorCQkJKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJcHJpbnRrKCJMQkE9JWQgbGVuPSVkIiwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbMl0gPDwgMjQpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbM10gPDwgMTYpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbNF0gPDwgIDgpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbNV0gICAgICApLAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs3XSA8PCAgOCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs4XSAgICAgICkKKwkJICAgICAgICk7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCXByaW50aygiTEJBPSVkIGxlbj0lZCIsCisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzJdIDw8IDI0KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzNdIDw8IDE2KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzRdIDw8ICA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzVdICAgICAgKSwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbNl0gPDwgMjQpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbN10gPDwgMTYpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbOF0gPDwgIDgpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbOV0gICAgICApCisJCSAgICAgICApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2NvbW1hbmQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlwcmludF9jb21tYW5kayhTQ3BudC0+Y21uZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfYnVzcGhhc2UodW5zaWduZWQgY2hhciBzdGF0KQoreworCXN3aXRjaChzdGF0KSB7CisJY2FzZSBCVVNQSEFTRV9DT01NQU5EOgorCQlwcmludGsoICJCVVNQSEFTRV9DT01NQU5EXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9NRVNTQUdFX0lOOgorCQlwcmludGsoICJCVVNQSEFTRV9NRVNTQUdFX0lOXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9NRVNTQUdFX09VVDoKKwkJcHJpbnRrKCAiQlVTUEhBU0VfTUVTU0FHRV9PVVRcbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX0RBVEFfSU46CisJCXByaW50ayggIkJVU1BIQVNFX0RBVEFfSU5cbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX0RBVEFfT1VUOgorCQlwcmludGsoICJCVVNQSEFTRV9EQVRBX09VVFxuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfU1RBVFVTOgorCQlwcmludGsoICJCVVNQSEFTRV9TVEFUVVNcbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX1NFTEVDVDoKKwkJcHJpbnRrKCAiQlVTUEhBU0VfU0VMRUNUXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCAiQlVTUEhBU0Vfb3RoZXI6IDB4JXhcbiIsIHN0YXQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfYXV0b3BoYXNlKHVuc2lnbmVkIHNob3J0IGkpCit7CisJcHJpbnRrKCJhdXRvOiAweCV4LCIsIGkpOworCisJaWYoaSAmIENPTU1BTkRfUEhBU0UpIHsKKwkJcHJpbnRrKCIgY21kIik7CisJfQorCWlmKGkgJiBEQVRBX0lOX1BIQVNFKSB7CisJCXByaW50aygiIGRpbiIpOworCX0KKwlpZihpICYgREFUQV9PVVRfUEhBU0UpIHsKKwkJcHJpbnRrKCIgZG91dCIpOworCX0KKwlpZihpICYgTVNHT1VUX1BIQVNFKSB7CisJCXByaW50aygiIG1vdXQiKTsKKwl9CisJaWYoaSAmIFNUQVRVU19QSEFTRSkgeworCQlwcmludGsoIiBzdGF0Iik7CisJfQorCWlmKGkgJiBJTExFR0FMX1BIQVNFKSB7CisJCXByaW50aygiIGlsbCIpOworCX0KKwlpZihpICYgQlVTX0ZSRUVfT0NDVUVSKSB7CisJCXByaW50aygiIGJmcmVlLW8iKTsKKwl9CisJaWYoaSAmIE1TR19JTl9PQ0NVRVIpIHsKKwkJcHJpbnRrKCIgbWluLW8iKTsKKwl9CisJaWYoaSAmIE1TR19PVVRfT0NDVUVSKSB7CisJCXByaW50aygiIG1vdXQtbyIpOworCX0KKwlpZihpICYgU0VMRUNUSU9OX1RJTUVPVVQpIHsKKwkJcHJpbnRrKCIgc2VsIik7CisJfQorCWlmKGkgJiBNU0dJTl8wMF9WQUxJRCkgeworCQlwcmludGsoIiBtMCIpOworCX0KKwlpZihpICYgTVNHSU5fMDJfVkFMSUQpIHsKKwkJcHJpbnRrKCIgbTIiKTsKKwl9CisJaWYoaSAmIE1TR0lOXzAzX1ZBTElEKSB7CisJCXByaW50aygiIG0zIik7CisJfQorCWlmKGkgJiBNU0dJTl8wNF9WQUxJRCkgeworCQlwcmludGsoIiBtNCIpOworCX0KKwlpZihpICYgQVVUT1NDU0lfQlVTWSkgeworCQlwcmludGsoIiBidXN5Iik7CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBuc3AzMl9wcmludF9yZWdpc3RlcihpbnQgYmFzZSkKK3sKKwlpZiAoIShOU1AzMl9ERUJVR19NQVNLICYgTlNQMzJfU1BFQ0lBTF9QUklOVF9SRUdJU1RFUikpCisJCXJldHVybjsKKworCXByaW50aygiUGhhc2U9MHgleCwgIiwgbnNwMzJfcmVhZDEoYmFzZSwgU0NTSV9CVVNfTU9OSVRPUikpOworCXByaW50aygiT2xkUGhhc2U9MHgleCwgIiwgbnNwMzJfaW5kZXhfcmVhZDEoYmFzZSwgT0xEX1NDU0lfUEhBU0UpKTsKKwlwcmludGsoInN5bmNyZWc9MHgleCwgIiwgbnNwMzJfcmVhZDEoYmFzZSwgU1lOQ19SRUcpKTsKKwlwcmludGsoImFja3dpZHRoPTB4JXgsICIsIG5zcDMyX3JlYWQxKGJhc2UsIEFDS19XSURUSCkpOworCXByaW50aygic2d0cGFkZHI9MHglbHgsICIsIG5zcDMyX3JlYWQ0KGJhc2UsIFNHVF9BRFIpKTsKKwlwcmludGsoInNjc2lvdXRsYXRjaD0weCV4LCAiLCBuc3AzMl9yZWFkMShiYXNlLCBTQ1NJX09VVF9MQVRDSF9UQVJHRVRfSUQpKTsKKwlwcmludGsoIm1zZ291dD0weCVseCwgIiwgbnNwMzJfcmVhZDQoYmFzZSwgU0NTSV9NU0dfT1VUKSk7CisJcHJpbnRrKCJtaXNjcmQ9MHgleCwgIiwgbnNwMzJfaW5kZXhfcmVhZDIoYmFzZSwgTUlTQ19XUikpOworCXByaW50aygic2VsdGltZW91dD0weCV4LCAiLCBuc3AzMl9yZWFkMihiYXNlLCBTRUxfVElNRV9PVVQpKTsKKwlwcmludGsoInNyZXFyYXRlPTB4JXgsICIsIG5zcDMyX3JlYWQxKGJhc2UsIFNSRVFfU01QTF9SQVRFKSk7CisJcHJpbnRrKCJ0cmFuc1N0YXR1cz0weCV4LCAiLCBuc3AzMl9yZWFkMihiYXNlLCBUUkFOU0ZFUl9TVEFUVVMpKTsKKwlwcmludGsoInJlc2VsZWN0aWQ9MHgleCwgIiwgbnNwMzJfcmVhZDIoYmFzZSwgQ09NTUFORF9DT05UUk9MKSk7CisJcHJpbnRrKCJhcmJpdD0weCV4LCAiLCBuc3AzMl9yZWFkMShiYXNlLCBBUkJJVF9TVEFUVVMpKTsKKwlwcmludGsoIkJtU3RhcnQ9MHglbHgsICIsIG5zcDMyX3JlYWQ0KGJhc2UsIEJNX1NUQVJUX0FEUikpOworCXByaW50aygiQm1Db3VudD0weCVseCwgIiwgbnNwMzJfcmVhZDQoYmFzZSwgQk1fQ05UKSk7CisJcHJpbnRrKCJTYWNrQ250PTB4JWx4LCAiLCBuc3AzMl9yZWFkNChiYXNlLCBTQUNLX0NOVCkpOworCXByaW50aygiU1JlcUNudD0weCVseCwgIiwgbnNwMzJfcmVhZDQoYmFzZSwgU1JFUV9DTlQpKTsKKwlwcmludGsoIlNhdmVkU2Fja0NudD0weCVseCwgIiwgbnNwMzJfcmVhZDQoYmFzZSwgU0FWRURfU0FDS19DTlQpKTsKKwlwcmludGsoIlNjc2lCdXNDb250cm9sPTB4JXgsICIsIG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQlVTX0NPTlRST0wpKTsKKwlwcmludGsoIkZpZm9SZXN0Q250PTB4JXgsICIsIG5zcDMyX3JlYWQyKGJhc2UsIEZJRk9fUkVTVF9DTlQpKTsKKwlwcmludGsoIkNkYkluPTB4JXgsICIsIG5zcDMyX3JlYWQxKGJhc2UsIFNDU0lfQ1NCX0lOKSk7CisJcHJpbnRrKCJcbiIpOworCisJaWYgKDApIHsKKwkJcHJpbnRrKCJleGVjcGg9MHgleCwgIiwgbnNwMzJfcmVhZDIoYmFzZSwgU0NTSV9FWEVDVVRFX1BIQVNFKSk7CisJCXByaW50aygiSXJxU3RhdHVzPTB4JXgsICIsIG5zcDMyX3JlYWQyKGJhc2UsIElSUV9TVEFUVVMpKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbnNwMzJfaW8uaCBiL2RyaXZlcnMvc2NzaS9uc3AzMl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjNjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbnNwMzJfaW8uaApAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIFdvcmtiaXQgTmluamFTQ1NJLTMyQmkvVURFIFBDSS9DYXJkQnVzIFNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIKKyAqIEkvTyByb3V0aW5lCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05TUDMyX0lPX0gKKyNkZWZpbmUgX05TUDMyX0lPX0gKKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX3dyaXRlMSh1bnNpZ25lZCBpbnQgIGJhc2UsCisJCQkJdW5zaWduZWQgaW50ICBpbmRleCwKKwkJCQl1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXRiKHZhbCwgKGJhc2UgKyBpbmRleCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwMzJfcmVhZDEodW5zaWduZWQgaW50IGJhc2UsCisJCQkJCXVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlyZXR1cm4gaW5iKGJhc2UgKyBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl93cml0ZTIodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQl1bnNpZ25lZCBpbnQgICBpbmRleCwKKwkJCQl1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJb3V0dyh2YWwsIChiYXNlICsgaW5kZXgpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBuc3AzMl9yZWFkMih1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlyZXR1cm4gaW53KGJhc2UgKyBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl93cml0ZTQodW5zaWduZWQgaW50ICBiYXNlLAorCQkJCXVuc2lnbmVkIGludCAgaW5kZXgsCisJCQkJdW5zaWduZWQgbG9uZyB2YWwpCit7CisJb3V0bCh2YWwsIChiYXNlICsgaW5kZXgpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5zcDMyX3JlYWQ0KHVuc2lnbmVkIGludCBiYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGlubChiYXNlICsgaW5kZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbW1pb193cml0ZTEodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICBpbmRleCwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnB0cjsKKworCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXdyaXRlYih2YWwsIHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3AzMl9tbWlvX3JlYWQxKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgIGluZGV4KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnB0cjsKKworCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXJldHVybiByZWFkYihwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbW1pb193cml0ZTIodW5zaWduZWQgbG9uZyAgYmFzZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAgIGluZGV4LAorCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwdHI7CisKKwlwdHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgaW5kZXgpOworCisJd3JpdGV3KGNwdV90b19sZTE2KHZhbCksIHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgbnNwMzJfbW1pb19yZWFkMih1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCAgaW5kZXgpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnB0cjsKKworCXB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKShiYXNlICsgTlNQMzJfTU1JT19PRkZTRVQgKyBpbmRleCk7CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVhZHcocHRyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9tbWlvX3dyaXRlNCh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgIGluZGV4LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRyOworCisJcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgaW5kZXgpOworCisJd3JpdGVsKGNwdV90b19sZTMyKHZhbCksIHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuc3AzMl9tbWlvX3JlYWQ0KHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgIGluZGV4KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0cjsKKworCXB0ciA9ICh1bnNpZ25lZCBsb25nICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXJldHVybiBsZTMyX3RvX2NwdShyZWFkbChwdHIpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG5zcDMyX2luZGV4X3JlYWQxKHVuc2lnbmVkIGludCBiYXNlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCW91dGIocmVnLCBiYXNlICsgSU5ERVhfUkVHKTsKKwlyZXR1cm4gaW5iKGJhc2UgKyBEQVRBX1JFR19MT1cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfaW5kZXhfd3JpdGUxKHVuc2lnbmVkIGludCAgYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgIHJlZywKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXRiKHJlZywgYmFzZSArIElOREVYX1JFRyAgICk7CisJb3V0Yih2YWwsIGJhc2UgKyBEQVRBX1JFR19MT1cpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IG5zcDMyX2luZGV4X3JlYWQyKHVuc2lnbmVkIGludCBiYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlvdXRiKHJlZywgYmFzZSArIElOREVYX1JFRyk7CisJcmV0dXJuIGludyhiYXNlICsgREFUQV9SRUdfTE9XKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcDMyX2luZGV4X3dyaXRlMih1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAgIHJlZywKKwkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJb3V0YihyZWcsIGJhc2UgKyBJTkRFWF9SRUcgICApOworCW91dHcodmFsLCBiYXNlICsgREFUQV9SRUdfTE9XKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5zcDMyX2luZGV4X3JlYWQ0KHVuc2lnbmVkIGludCBiYXNlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGxvbmcgaCxsOworCisJb3V0YihyZWcsIGJhc2UgKyBJTkRFWF9SRUcpOworCWwgPSBpbncoYmFzZSArIERBVEFfUkVHX0xPVyk7CisJaCA9IGludyhiYXNlICsgREFUQV9SRUdfSEkgKTsKKworCXJldHVybiAoKGggPDwgMTYpIHwgbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9pbmRleF93cml0ZTQodW5zaWduZWQgaW50ICBiYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAgcmVnLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgaCxsOworCisJaCA9ICh2YWwgJiAweGZmZmYwMDAwKSA+PiAxNjsKKwlsID0gKHZhbCAmIDB4MDAwMGZmZmYpID4+ICAwOworCisJb3V0YihyZWcsIGJhc2UgKyBJTkRFWF9SRUcgICApOworCW91dHcobCwgICBiYXNlICsgREFUQV9SRUdfTE9XKTsKKwlvdXR3KGgsICAgYmFzZSArIERBVEFfUkVHX0hJICk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3AzMl9tbWlvX2luZGV4X3JlYWQxKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCByZWcpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmluZGV4X3B0ciwgKmRhdGFfcHRyOworCisJaW5kZXhfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIElOREVYX1JFRyk7CisJZGF0YV9wdHIgID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBOU1AzMl9NTUlPX09GRlNFVCArIERBVEFfUkVHX0xPVyk7CisKKwl3cml0ZWIocmVnLCBpbmRleF9wdHIpOworCXJldHVybiByZWFkYihkYXRhX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9tbWlvX2luZGV4X3dyaXRlMSh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCSAgIHVuc2lnbmVkIGludCAgcmVnLAorCQkJCQkgICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqaW5kZXhfcHRyLCAqZGF0YV9wdHI7CisKKwlpbmRleF9wdHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgSU5ERVhfUkVHKTsKKwlkYXRhX3B0ciAgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgREFUQV9SRUdfTE9XKTsKKworCXdyaXRlYihyZWcsIGluZGV4X3B0cik7CisJd3JpdGViKHZhbCwgZGF0YV9wdHIgKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBuc3AzMl9tbWlvX2luZGV4X3JlYWQyKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgIHJlZykKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqaW5kZXhfcHRyLCAqZGF0YV9wdHI7CisKKwlpbmRleF9wdHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgSU5ERVhfUkVHKTsKKwlkYXRhX3B0ciAgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgREFUQV9SRUdfTE9XKTsKKworCXdyaXRlYihyZWcsIGluZGV4X3B0cik7CisJcmV0dXJuIGxlMTZfdG9fY3B1KHJlYWR3KGRhdGFfcHRyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9tbWlvX2luZGV4X3dyaXRlMih1bnNpZ25lZCBsb25nICBiYXNlLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgICByZWcsCisJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqaW5kZXhfcHRyLCAqZGF0YV9wdHI7CisKKwlpbmRleF9wdHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgSU5ERVhfUkVHKTsKKwlkYXRhX3B0ciAgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIE5TUDMyX01NSU9fT0ZGU0VUICsgREFUQV9SRUdfTE9XKTsKKworCXdyaXRlYihyZWcsICAgICAgICAgICAgICBpbmRleF9wdHIpOworCXdyaXRldyhjcHVfdG9fbGUxNih2YWwpLCBkYXRhX3B0ciApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfbXVsdGlfcmVhZDQodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAgIHJlZywKKwkJCQkgICAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCWluc2woYmFzZSArIHJlZywgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9maWZvX3JlYWQodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJbnNwMzJfbXVsdGlfcmVhZDQoYmFzZSwgRklGT19EQVRBX0xPVywgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3AzMl9tdWx0aV93cml0ZTQodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgICByZWcsCisJCQkJICAgICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW91dHNsKGJhc2UgKyByZWcsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwMzJfZmlmb193cml0ZSh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCSAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW5zcDMyX211bHRpX3dyaXRlNChiYXNlLCBGSUZPX0RBVEFfTE9XLCBidWYsIGNvdW50KTsKK30KKworI2VuZGlmIC8qIF9OU1AzMl9JT19IICovCisvKiBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jIGIvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczZDdlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jCkBAIC0wLDAgKzEsNjA5IEBACisvKgorICogT2t0YWdvbl9lc3AuYyAtLSBEcml2ZXIgZm9yIGJzYyBPa3RhZ29uCisgKgorICogV3JpdHRlbiBieSBDYXJzdGVuIFBsdW50a2UgMTk5OAorICoKKyAqIEJhc2VkIG9uIGN5YmVyX2VzcC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQU1JR0EpIHx8IGRlZmluZWQoQ09ORklHX0FQVVMpCisjZGVmaW5lIFVTRV9CT1RUT01fSEFMRgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIk5DUjUzQzl4LmgiCisKKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKworI2lmZGVmIFVTRV9CT1RUT01fSEFMRgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2VuZGlmCisKKy8qIFRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyBjYW4gYmUgZm91bmQgaW4gdGhlIFoyIGNvbmZpZyBhcmVhIGF0IHRoZXNlCisgKiBvZmZzZXRzOgorICovCisjZGVmaW5lIE9LVEFHT05fRVNQX0FERFIgMHgwMzAwMAorI2RlZmluZSBPS1RBR09OX0RNQV9BRERSIDB4MDEwMDAKKworCitzdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7CitzdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworCitzdGF0aWMgdm9pZCBkbWFfaXJxX2V4aXQoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKKworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9vbmUoc3RydWN0IE5DUl9FU1AgKixTY3NpX0NtbmQgKik7CitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbChzdHJ1Y3QgTkNSX0VTUCAqLFNjc2lfQ21uZCAqKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqLFNjc2lfQ21uZCAqKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbChzdHJ1Y3QgTkNSX0VTUCAqLFNjc2lfQ21uZCAqKTsKK3N0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnKFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgIG9rdGFnb25fbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqeCk7CisKKyNpZmRlZiBVU0VfQk9UVE9NX0hBTEYKK3N0YXRpYyB2b2lkIGRtYV9jb21taXQodm9pZCAqb3BhcXVlKTsKKworbG9uZyBva3RhZ190b19pbyhsb25nICpwYWRkciwgbG9uZyAqYWRkciwgbG9uZyBsZW4pOworbG9uZyBva3RhZ19mcm9tX2lvKGxvbmcgKmFkZHIsIGxvbmcgKnBhZGRyLCBsb25nIGxlbik7CisKK3N0YXRpYyBERUNMQVJFX1dPUksodHFfZmFrZV9kbWEsIGRtYV9jb21taXQsIE5VTEwpOworCisjZGVmaW5lIERNQV9NQVhUUkFOU0ZFUiAweDgwMDAKKworI2Vsc2UKKworLyoKKyAqIE5vIGJvdHRvbSBoYWxmLiBVc2UgdHJhbnNmZXIgZGlyZWN0bHkgZnJvbSBJUlEuIEZpbmQgYSBuYXJyb3cgcGF0aAorICogYmV0d2VlbiB0b28gbXVjaCBJUlEgb3ZlcmhlYWQgYW5kIGNsb2dnaW5nIHRoZSBJUlEgZm9yIHRvbyBsb25nLgorICovCisKKyNkZWZpbmUgRE1BX01BWFRSQU5TRkVSIDB4MTAwMAorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBva3RhZ29uX25vdGlmaWVyID0geyAKKwlva3RhZ29uX25vdGlmeV9yZWJvb3QsCisJTlVMTCwKKwkwCit9OworCitzdGF0aWMgbG9uZyAqcGFkZHJlc3M7CitzdGF0aWMgbG9uZyAqYWRkcmVzczsKK3N0YXRpYyBsb25nIGxlbjsKK3N0YXRpYyBsb25nIGRtYV9vbjsKK3N0YXRpYyBpbnQgZGlyZWN0aW9uOworc3RhdGljIHN0cnVjdCBOQ1JfRVNQICpjdXJyZW50X2VzcDsKKworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKKwkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0CisJCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYXNmZXJlZCB0byB0aGUgRVNQIGNoaXAKKwkJCQkgKiB2aWEgUElPLgorCQkJCSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCitpbnQgb2t0YWdvbl9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCB6b3Jyb19kZXYgKnogPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzOworCisJd2hpbGUgKCh6ID0gem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fUFJPRF9CU0NfT0tUQUdPTl8yMDA4LCB6KSkpIHsKKwkgICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworCSAgICBpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK09LVEFHT05fRVNQX0FERFIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncyksICJOQ1I1M0M5eCIpKSB7CisJCS8qCisJCSAqIEl0IGlzIGEgU0NTSSBjb250cm9sbGVyLgorCQkgKiBIYXJkd2lyZSBIb3N0IGFkYXB0ZXIgdG8gU0NTSSBJRCA3CisJCSAqLworCQkKKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKVpUV09fVkFERFIoYm9hcmQpOworCQllcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIE9LVEFHT05fRVNQX0FERFIpOworCisJCS8qIFRoaXMgbGluZSB3YXMgNSBsaW5lcyBsb3dlciAqLworCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCtPS1RBR09OX0VTUF9BRERSKTsKKworCQkvKiB3ZSBoYXZlIHRvIHNoaWZ0IHRoZSByZWdpc3RlcnMgb25seSBvbmUgYml0IGZvciBva3RhZ29uICovCisJCWVzcC0+c2hpZnQgPSAxOworCisJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpOworCQl1ZGVsYXkoNSk7CisJCWlmIChlc3BfcmVhZChlcmVncy0+ZXNwX2NmZzEpICE9IChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpCisJCQlyZXR1cm4gMDsgLyogQmFpbCBvdXQgaWYgYWRkcmVzcyBkaWQgbm90IGhvbGQgZGF0YSAqLworCisJCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLworCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKKworCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKKwkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7CisJCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOworCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOworCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247CisJCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKKwkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOworCisJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLworCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKKwkJZXNwLT5kbWFfZHJhaW4gPSAwOworCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gJmRtYV9pbnZhbGlkYXRlOworCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOworCQllc3AtPmRtYV9pcnFfZXhpdCA9ICZkbWFfaXJxX2V4aXQ7CisJCWVzcC0+ZG1hX2xlZF9vbiA9ICZkbWFfbGVkX29uOworCQllc3AtPmRtYV9sZWRfb2ZmID0gJmRtYV9sZWRfb2ZmOworCQllc3AtPmRtYV9wb2xsID0gMDsKKwkJZXNwLT5kbWFfcmVzZXQgPSAwOworCisJCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSAmZG1hX21tdV9nZXRfc2NzaV9vbmU7CisJCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAmZG1hX21tdV9nZXRfc2NzaV9zZ2w7CisJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZTsKKwkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAmZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsOworCQllc3AtPmRtYV9hZHZhbmNlX3NnID0gJmRtYV9hZHZhbmNlX3NnOworCisJCS8qIFNDU0kgY2hpcCBzcGVlZCAqLworCQkvKiBMb29raW5nIGF0IHRoZSBxdWFydHogb2YgdGhlIFNDU0kgYm9hcmQuLi4gKi8KKwkJZXNwLT5jZnJlcSA9IDI1MDAwMDAwOworCisJCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBDeWJlclN0b3JtIGFyZSBtYXBwZWQKKwkJICogcmVsYXRpdmUgdG8gdGhlIGRldmljZSAoaS5lLiBpbiB0aGUgc2FtZSBab3JybworCQkgKiBJL08gYmxvY2spLgorCQkgKi8KKwkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBPS1RBR09OX0RNQV9BRERSKTsKKworCQlwYWRkcmVzcyA9IChsb25nICopIGVzcC0+ZHJlZ3M7CisKKwkJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KKwkJZXNwLT5lcmVncyA9IGVyZWdzOworCQkKKwkJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLworCQllc3AtPmVzcF9jb21tYW5kID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKSBjbWRfYnVmZmVyOworCisJCS8qIFllcywgdGhlIHZpcnR1YWwgYWRkcmVzcy4gU2VlIGJlbG93LiAqLworCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSAoX191MzIpIGNtZF9idWZmZXI7CisKKwkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisJCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIFNBX1NISVJRLAorCQkJICAgICJCU0MgT2t0YWdvbiBTQ1NJIiwgZXNwLT5laG9zdCk7CisKKwkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCisJCWVzcC0+c2NzaV9pZCA9IDc7CisJCQorCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLworCQllc3AtPmRpZmYgPSAwOworCisJCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKwkJcHJpbnRrKCJFU1BfT2t0YWdvbiBEcml2ZXIgMS4xIgorI2lmZGVmIFVTRV9CT1RUT01fSEFMRgorCQkgICAgICAgIiBbQk9UVE9NX0hBTEZdIgorI2Vsc2UKKwkJICAgICAgICIgW0lSUV0iCisjZW5kaWYKKwkJICAgICAgICIgcmVnaXN0ZXJlZC5cbiIpOworCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcyxlc3BzX2luX3VzZSk7CisJCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOworCQljdXJyZW50X2VzcCA9IGVzcDsKKwkJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZva3RhZ29uX25vdGlmaWVyKTsKKwkJcmV0dXJuIGVzcHNfaW5fdXNlOworCSAgICB9CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBPbiBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIHRoZSBTQ1NJIGVxdWlwbWVudCBnZXRzIGNvbmZ1c2VkIG9uIHJlYm9vdCwKKyAqIHNvIHdlIGhhdmUgdG8gcmVzZXQgaXQgdGhlbi4KKyAqLworCitzdGF0aWMgaW50Citva3RhZ29uX25vdGlmeV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKngpCit7CisgIHN0cnVjdCBOQ1JfRVNQICplc3A7CisgIAorICBpZigoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKSAmJiAoZXNwID0gY3VycmVudF9lc3ApKQorICAgeworICAgIGVzcF9ib290dXBfcmVzZXQoZXNwLGVzcC0+ZXJlZ3MpOworICAgIHVkZWxheSg1MDApOyAvKiBTZXR0bGUgdGltZS4gTWF5YmUgdW5uZWNlc3NhcnkuICovCisgICB9CisgIHJldHVybiBOT1RJRllfRE9ORTsKK30KKyAgICAKKworCQorI2lmZGVmIFVTRV9CT1RUT01fSEFMRgorCisKKy8qCisgKiBUaGUgYnNjIE9rdGFnb24gY29udHJvbGxlciBoYXMgbm8gcmVhbCBETUEsIHNvIHdlIGhhdmUgdG8gZG8gdGhlICdETUEKKyAqIHRyYW5zZmVyJyBpbiB0aGUgaW50ZXJydXB0IChZaWtlcyEpIG9yIHVzZSBhIGJvdHRvbSBoYWxmIHRvIG5vdCB0byBjbHV0dGVyCisgKiBJUlEncyBmb3IgbG9uZ2VyLXRoYW4tZ29vZC4KKyAqCisgKiBGSVhNRQorICogQklHIFBST0JMRU06ICdsZW4nIGlzIHVzdWFsbHkgdGhlIGJ1ZmZlciBsZW5ndGgsIG5vdCB0aGUgZXhwZWN0ZWQgbGVuZ3RoCisgKiBvZiB0aGUgZGF0YS4gU28gRE1BIG1heSBmaW5pc2ggcHJlbWF0dXJlbHksIGZ1cnRoZXIgcmVhZHMgbGVhZCB0bworICogJ21hY2hpbmUgY2hlY2snIG9uIEFQVVMgc3lzdGVtcyAoZG9uJ3Qga25vdyBhYm91dCBtNjhrIHN5c3RlbXMsIEFtaWdhT1MKKyAqIGRlbGliZXJhdGVseSBpZ25vcmVzIHRoZSBidXMgZmF1bHRzKSBhbmQgYSBub3JtYWwgY29weS1sb29wIGNhbid0CisgKiBiZSBleGl0ZWQgcHJlbWF0dXJlbHkganVzdCBhdCB0aGUgcmlnaHQgbW9tZW50IGJ5IHRoZSBkbWFfaW52YWxpZGF0ZSBJUlEuCisgKiBTbyBkbyBpdCB0aGUgaGFyZCB3YXksIHdyaXRlIGFuIG93biBjb3BpZXIgaW4gYXNzZW1ibGVyIGFuZAorICogY2F0Y2ggdGhlIGV4Y2VwdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIENhcnN0ZW4KKyAqLworIAorIAorc3RhdGljIHZvaWQgZG1hX2NvbW1pdCh2b2lkICpvcGFxdWUpCit7CisgICAgbG9uZyB3YWl0LGxlbjIscG9zOworICAgIHN0cnVjdCBOQ1JfRVNQICplc3A7CisKKyAgICBFU1BEQVRBKCgiVHJhbnNmZXI6ICVsZCBieXRlcywgQWRkcmVzcyAweCUwOGxYLCBEaXJlY3Rpb246ICVkXG4iLAorICAgICAgICAgbGVuLChsb25nKSBhZGRyZXNzLGRpcmVjdGlvbikpOworICAgIGRtYV9pbnRzX29mZihjdXJyZW50X2VzcCk7CisKKyAgICBwb3MgPSAwOworICAgIHdhaXQgPSAxOworICAgIGlmKGRpcmVjdGlvbikgLyogd3JpdGU/IChtZW1vcnkgdG8gZGV2aWNlKSAqLworICAgICB7CisgICAgICB3aGlsZShsZW4gPiAwKQorICAgICAgIHsKKyAgICAgICAgbGVuMiA9IG9rdGFnX3RvX2lvKHBhZGRyZXNzLCBhZGRyZXNzK3BvcywgbGVuKTsKKwlpZighbGVuMikKKwkgeworCSAgaWYod2FpdCA+IDEwMDApCisJICAgeworCSAgICBwcmludGsoIkV4cGVkaXRlZCBETUEgZXhpdCAod3JpdGluZykgJWxkXG4iLGxlbik7CisJICAgIGJyZWFrOworCSAgIH0KKwkgIG1kZWxheSh3YWl0KTsKKwkgIHdhaXQgKj0gMjsKKwkgfQorCXBvcyArPSBsZW4yOworCWxlbiAtPSBsZW4yKnNpemVvZihsb25nKTsKKyAgICAgICB9CisgICAgIH0gZWxzZSB7CisgICAgICB3aGlsZShsZW4gPiAwKQorICAgICAgIHsKKyAgICAgICAgbGVuMiA9IG9rdGFnX2Zyb21faW8oYWRkcmVzcytwb3MsIHBhZGRyZXNzLCBsZW4pOworCWlmKCFsZW4yKQorCSB7CisJICBpZih3YWl0ID4gMTAwMCkKKwkgICB7CisJICAgIHByaW50aygiRXhwZWRpdGVkIERNQSBleGl0IChyZWFkaW5nKSAlbGRcbiIsbGVuKTsKKwkgICAgYnJlYWs7CisJICAgfQorCSAgbWRlbGF5KHdhaXQpOworCSAgd2FpdCAqPSAyOworCSB9CisJcG9zICs9IGxlbjI7CisJbGVuIC09IGxlbjIqc2l6ZW9mKGxvbmcpOworICAgICAgIH0KKyAgICAgfQorCisgICAgLyogdG8gbWFrZSBlc3AtPnNoaWZ0IHdvcmsgKi8KKyAgICBlc3A9Y3VycmVudF9lc3A7CisKKyNpZiAwCisgICAgbGVuMiA9IChlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF90Y2xvdykgJiAweGZmKSB8CisgICAgICAgICAgICgoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3BfdGNtZWQpICYgMHhmZikgPDwgOCk7CisKKyAgICAvKgorICAgICAqIFVoIHVoLiBJZiB5b3Ugc2VlIHRoaXMsIGxlbiBhbmQgdHJhbnNmZXIgY291bnQgcmVnaXN0ZXJzIHdlcmUgb3V0IG9mCisgICAgICogc3luYy4gVGhhdCBtZWFucyByZWFsbHkgc2VyaW91cyB0cm91YmxlLgorICAgICAqLworCisgICAgaWYobGVuMikKKyAgICAgIHByaW50aygiRWVlZWshISBUcmFuc2ZlciBjb3VudCBzdGlsbCAlbGQhXG4iLGxlbjIpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIE5vcm1hbGx5IHdlIGp1c3QgbmVlZCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIGNvbWUuCisgICAgICogQnV0IGF0IGxlYXN0IG9uZSBkZXZpY2UgKG15IE1pY3JvdGVrIFNjYW5NYWtlciA2MzApIHJlZ3VsYXJseSBtaXMtCisgICAgICogY2FsY3VsYXRlcyB0aGUgYnl0ZXMgaXQgc2hvdWxkIHNlbmQgd2hpY2ggaXMgcmVhbGx5IHVnbHkgYmVjYXVzZQorICAgICAqIGl0IGxvY2tzIHVwIHRoZSBTQ1NJIGJ1cyBpZiBub3QgYWNjb3VudGVkIGZvci4KKyAgICAgKi8KKworICAgIGlmKCEoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKQorICAgICB7CisgICAgICBsb25nIGxlbiA9IDEwMDsKKyAgICAgIGxvbmcgdHJhc2hbMTBdOworCisgICAgICAvKgorICAgICAgICogSW50ZXJydXB0IGJpdCB3YXMgbm90IHNldC4gRWl0aGVyIHRoZSBkZXZpY2UgaXMganVzdCBwbGFpbiBsYXp5CisgICAgICAgKiBzbyB3ZSBnaXZlIGl0IGEgMTAgbXMgY2hhbmNlIG9yLi4uCisgICAgICAgKi8KKyAgICAgIHdoaWxlKGxlbi0tICYmICghKGVzcF9yZWFkKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSkpCisgICAgICAgIHVkZWxheSgxMDApOworCisKKyAgICAgIGlmKCEoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKQorICAgICAgIHsKKyAgICAgICAgLyoKKwkgKiBTbyB3ZSB0aGluayB0aGF0IHRoZSB0cmFuc2ZlciBjb3VudCBpcyBvdXQgb2Ygc3luYy4gU2luY2Ugd2UKKwkgKiBoYXZlIGFsbCB3ZSB3YW50IHdlIGFyZSBoYXBweSBhbmQgY2FuIGRpdGNoIHRoZSB0cmFzaC4KKwkgKi8KKwkgCisgICAgICAgIGxlbiA9IERNQV9NQVhUUkFOU0ZFUjsKKworICAgICAgICB3aGlsZShsZW4tLSAmJiAoIShlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpKQorICAgICAgICAgIG9rdGFnX2Zyb21faW8odHJhc2gscGFkZHJlc3MsMik7CisKKyAgICAgICAgaWYoIShlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpCisgICAgICAgICB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBUaGluZ3MgcmVhbGx5IGhhdmUgZ29uZSB3cm9uZy4gSWYgd2UgbGVhdmUgdGhlIHN5c3RlbSBpbiB0aGF0CisgICAgICAgICAgICogc3RhdGUsIHRoZSBTQ1NJIGJ1cyBpcyBsb2NrZWQgZm9yZXZlci4gSSBob3BlIHRoYXQgdGhpcyB3aWxsCisgICAgICAgICAgICogdHVybiB0aGUgc3lzdGVtIGluIGEgbW9yZSBvciBsZXNzIHJ1bm5pbmcgc3RhdGUuCisgICAgICAgICAgICovCisgICAgICAgICAgcHJpbnRrKCJEZXZpY2UgaXMgYm9saXhlZCwgdHJ5aW5nIGJ1cyByZXNldC4uLlxuIik7CisJICBlc3BfYm9vdHVwX3Jlc2V0KGN1cnJlbnRfZXNwLGN1cnJlbnRfZXNwLT5lcmVncyk7CisgICAgICAgICB9CisgICAgICAgfQorICAgICB9CisKKyAgICBFU1BEQVRBKCgiVHJhbnNmZXJfZmluYWxlOiBkb19kYXRhX2ZpbmFsZSBzaG91bGQgY29tZVxuIikpOworCisgICAgbGVuID0gMDsKKyAgICBkbWFfb24gPSAwOworICAgIGRtYV9pbnRzX29uKGN1cnJlbnRfZXNwKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCit7CisJLyogU2luY2UgdGhlIEN5YmVyU3Rvcm0gRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCisJICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCisJICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgorCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PworCSAqLworCXJldHVybiBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworCWlmKHN6ID4gRE1BX01BWFRSQU5TRkVSKQorCQlzeiA9IERNQV9NQVhUUkFOU0ZFUjsKKwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7Cit9CisKKy8qCisgKiBXaGF0IHRoZSBmJEAmIGlzIHRoaXM/CisgKgorICogU29tZSBTQ1NJIGRldmljZXMgKGxpa2UgbXkgTWljcm90ZWsgU2Nhbk1ha2VyIDYzMCBzY2FubmVyKSB3YW50IHRvIHRyYW5zZmVyCisgKiBtb3JlIGRhdGEgdGhhbiByZXF1ZXN0ZWQuIEhvdyBtdWNoPyBEdW5uby4gU28gZGl0Y2ggdGhlIGJvZ3VzIGRhdGEgaW50bworICogdGhlIHNpbmssIGhvcGluZyB0aGUgZGV2aWNlIHdpbGwgYWR2YW5jZSB0byB0aGUgbmV4dCBwaGFzZSBzb29uZXIgb3IgbGF0ZXIuCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgLS0gQ2Fyc3RlbgorICovCisKK3N0YXRpYyBsb25nIG9rdGFnX2V2YV9idWZmZXJbMTZdOyAvKiBUaGUgZGF0YSBzaW5rICovCisKK3N0YXRpYyB2b2lkIG9rdGFnX2NoZWNrX2RtYSh2b2lkKQoreworICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCisgIGVzcD1jdXJyZW50X2VzcDsKKyAgaWYoIWxlbikKKyAgIHsKKyAgICBhZGRyZXNzID0gb2t0YWdfZXZhX2J1ZmZlcjsKKyAgICBsZW4gPSAyOworICAgIC8qIGVzcF9kb19kYXRhIHNldHMgdGhlbSB0byB6ZXJvIGxpa2UgbGVuICovCisgICAgZXNwX3dyaXRlKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3RjbG93LDIpOworICAgIGVzcF93cml0ZShjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF90Y21lZCwwKTsKKyAgIH0KK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKK3sKKwkvKiBab3JybyBpcyBub25jYWNoZWQsIGV2ZXJ5dGhpbmcgZWxzZSBkb25lIHVzaW5nIHByb2Nlc3Nvci4gKi8KKwkvKiBjYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOyAqLworCQorCWlmKGRtYV9vbikKKwkgIHBhbmljKCJkbWFfaW5pdF9yZWFkIHdoaWxlIGRtYSBwcm9jZXNzIGlzIGluaXRpYWxpemVkL3J1bm5pbmchXG4iKTsKKwlkaXJlY3Rpb24gPSAwOworCWFkZHJlc3MgPSAobG9uZyAqKSB2YWRkcmVzczsKKwljdXJyZW50X2VzcCA9IGVzcDsKKwlsZW4gPSBsZW5ndGg7CisJb2t0YWdfY2hlY2tfZG1hKCk7CisgICAgICAgIGRtYV9vbiA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCS8qIGNhY2hlX3B1c2goYWRkciwgbGVuZ3RoKTsgKi8KKworCWlmKGRtYV9vbikKKwkgIHBhbmljKCJkbWFfaW5pdF93cml0ZSB3aGlsZSBkbWEgcHJvY2VzcyBpcyBpbml0aWFsaXplZC9ydW5uaW5nIVxuIik7CisJZGlyZWN0aW9uID0gMTsKKwlhZGRyZXNzID0gKGxvbmcgKikgdmFkZHJlc3M7CisJY3VycmVudF9lc3AgPSBlc3A7CisJbGVuID0gbGVuZ3RoOworCW9rdGFnX2NoZWNrX2RtYSgpOworCWRtYV9vbiA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCWRpc2FibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwllbmFibGVfaXJxKGVzcC0+aXJxKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwkvKiBJdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGUgRE1BIElSUSBiaXQgaW4gdGhlIGNvcnJlY3Qgd2F5ISAqLworCXJldHVybiAoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKK30KKworc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworfQorCitzdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJcmV0dXJuICgoY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOworfQorCitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCit7CisJLyogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCisJICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCisJICovCisJaWYod3JpdGUpeworCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOworCX0gZWxzZSB7CisJCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOworCX0KK30KKworLyoKKyAqIElSUSBlbnRyeSB3aGVuIERNQSB0cmFuc2ZlciBpcyByZWFkeSB0byBiZSBzdGFydGVkCisgKi8KKworc3RhdGljIHZvaWQgZG1hX2lycV9leGl0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisjaWZkZWYgVVNFX0JPVFRPTV9IQUxGCisJaWYoZG1hX29uKQorCSB7CisJICBzY2hlZHVsZV93b3JrKCZ0cV9mYWtlX2RtYSk7CisJIH0KKyNlbHNlCisJd2hpbGUobGVuICYmICFkbWFfaXJxX3AoZXNwKSkKKwkgeworCSAgaWYoZGlyZWN0aW9uKQorCSAgICAqcGFkZHJlc3MgPSAqYWRkcmVzcysrOworCSAgIGVsc2UKKwkgICAgKmFkZHJlc3MrKyA9ICpwYWRkcmVzczsKKwkgIGxlbiAtPSAoc2l6ZW9mKGxvbmcpKTsKKwkgfQorCWxlbiA9IDA7CisgICAgICAgIGRtYV9vbiA9IDA7CisjZW5kaWYKK30KKworLyoKKyAqIElSUSBlbnRyeSB3aGVuIERNQSBoYXMganVzdCBmaW5pc2hlZAorICovCisKK3N0YXRpYyB2b2lkIGRtYV9pbnZhbGlkYXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7Cit9CisKKy8qCisgKiBTaW5jZSB0aGUgcHJvY2Vzc29yIGRvZXMgdGhlIGRhdGEgdHJhbnNmZXIgd2UgaGF2ZSB0byB1c2UgdGhlIGN1c3RvbQorICogbW11IGludGVyZmFjZSB0byBwYXNzIHRoZSB2aXJ0dWFsIGFkZHJlc3MsIG5vdCB0aGUgcGh5c2ljYWwuCisgKi8KKwordm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQoreworICAgICAgICBzcC0+U0NwLnB0ciA9CisgICAgICAgICAgICAgICAgc3AtPnJlcXVlc3RfYnVmZmVyOworfQorCit2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisgICAgICAgIHNwLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKHNwLT5TQ3AuYnVmZmVyLT5wYWdlKSsKKwkJICAgICAgc3AtPlNDcC5idWZmZXItPm9mZnNldDsKK30KKwordm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKK30KKwordm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2woc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKK30KKwordm9pZCBkbWFfYWR2YW5jZV9zZyhTY3NpX0NtbmQgKnNwKQoreworCXNwLT5TQ3AucHRyID0gcGFnZV9hZGRyZXNzKHNwLT5TQ3AuYnVmZmVyLT5wYWdlKSsKKwkJICAgICAgc3AtPlNDcC5idWZmZXItPm9mZnNldDsKK30KKworCisjZGVmaW5lIEhPU1RTX0MKKworaW50IG9rdGFnb25fZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisjaWZkZWYgTU9EVUxFCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmVkZXY7CisJZXNwX3JlbGVhc2UoKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZva3RhZ29uX25vdGlmaWVyKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gImVzcC1va3RhZ29uIiwKKwkucHJvY19pbmZvCQk9ICZlc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJPSAiQlNDIE9rdGFnb24gU0NTSSIsCisJLmRldGVjdAkJCT0gb2t0YWdvbl9lc3BfZGV0ZWN0LAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLnJlbGVhc2UJCT0gb2t0YWdvbl9lc3BfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSA3LAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCit9OworCisKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9pby5TIGIvZHJpdmVycy9zY3NpL29rdGFnb25faW8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGNlOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL29rdGFnb25faW8uUwpAQCAtMCwwICsxLDE5NSBAQAorLyogLSotIG1vZGU6IGFzbSAtKi0KKyAqIER1ZSB0byBwcm9ibGVtcyB3aGlsZSB0cmFuc2ZlcnJpbmcgZGF0YSBJJ3ZlIHB1dCB0aGVzZSByb3V0aW5lcyBhcyBhc3NlbWJseQorICogY29kZS4KKyAqIFNpbmNlIEknbSBubyBQUEMgYXNzZW1ibGVyIGd1cnUsIHRoZSBjb2RlIGlzIGp1c3QgdGhlIGFzc2VtYmxlciB2ZXJzaW9uIG9mCisKK2ludCBva3RhZ190b19pbyhsb25nICpwYWRkcixsb25nICphZGRyLGxvbmcgbGVuKQoreworICBsb25nICphZGRyMiA9IGFkZHI7CisgIGZvcihsZW49KGxlbitzaXplb2YobG9uZyktMSkvc2l6ZW9mKGxvbmcpO2xlbi0tOykKKyAgICAqcGFkZHIgPSAqYWRkcjIrKzsKKyAgcmV0dXJuIGFkZHIyIC0gYWRkcjsKK30KKworaW50IG9rdGFnX2Zyb21faW8obG9uZyAqYWRkcixsb25nICpwYWRkcixsb25nIGxlbikKK3sKKyAgbG9uZyAqYWRkcjIgPSBhZGRyOworICBmb3IobGVuPShsZW4rc2l6ZW9mKGxvbmcpLTEpL3NpemVvZihsb25nKTtsZW4tLTspCisgICAgKmFkZHIyKysgPSAqcGFkZHI7CisgIHJldHVybiBhZGRyMiAtIGFkZHI7Cit9CisKKyAqIGFzc2VtYmxlZCB1c2luZyBnY2MgLU8yIC1TLCB3aXRoIHR3byBleGNlcHRpb24gY2F0Y2ggcG9pbnRzIHdoZXJlIGRhdGEKKyAqIGlzIG1vdmVkIHRvL2Zyb20gdGhlIElPIHJlZ2lzdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19BUFVTCisKKwkuZmlsZQkib2t0YWdvbl9pby5jIgorCitnY2MyX2NvbXBpbGVkLjoKKy8qCisJLnNlY3Rpb24gIi50ZXh0IgorKi8KKwkuYWxpZ24gMgorCS5nbG9ibCBva3RhZ190b19pbworCS50eXBlCSBva3RhZ190b19pbyxAZnVuY3Rpb24KK29rdGFnX3RvX2lvOgorCWFkZGkgNSw1LDMKKwlzcndpIDUsNSwyCisJY21wd2kgMSw1LDAKKwltciA5LDMKKwltciAzLDQKKwlhZGRpIDUsNSwtMQorCWJjIDEyLDYsLkwzCisuTDU6CisJY21wd2kgMSw1LDAKKwlsd3ogMCwwKDMpCisJYWRkaSAzLDMsNAorCWFkZGkgNSw1LC0xCitleHAxOglzdHcgMCwwKDkpCisJYmMgNCw2LC5MNQorLkwzOgorcmV0MToJc3ViZiAzLDQsMworCXNyYXdpIDMsMywyCisJYmxyCisuTGZlMToKKwkuc2l6ZQkgb2t0YWdfdG9faW8sLkxmZTEtb2t0YWdfdG9faW8KKwkuYWxpZ24gMgorCS5nbG9ibCBva3RhZ19mcm9tX2lvCisJLnR5cGUJIG9rdGFnX2Zyb21faW8sQGZ1bmN0aW9uCitva3RhZ19mcm9tX2lvOgorCWFkZGkgNSw1LDMKKwlzcndpIDUsNSwyCisJY21wd2kgMSw1LDAKKwltciA5LDMKKwlhZGRpIDUsNSwtMQorCWJjIDEyLDYsLkw5CisuTDExOgorCWNtcHdpIDEsNSwwCitleHAyOglsd3ogMCwwKDQpCisJYWRkaSA1LDUsLTEKKwlzdHcgMCwwKDMpCisJYWRkaSAzLDMsNAorCWJjIDQsNiwuTDExCisuTDk6CityZXQyOglzdWJmIDMsOSwzCisJc3Jhd2kgMywzLDIKKwlibHIKKy5MZmUyOgorCS5zaXplCSBva3RhZ19mcm9tX2lvLC5MZmUyLW9rdGFnX2Zyb21faW8KKwkuaWRlbnQJIkdDQzogKEdOVSkgZWdjcy0yLjkwLjI5IDk4MDUxNSAoZWdjcy0xLjAuMyByZWxlYXNlKSIKKworLyoKKyAqIEV4Y2VwdGlvbiB0YWJsZS4KKyAqIFNlY29uZCBsb25nd29yZCBzaG93cyB3aGVyZSB0byBqdW1wIHdoZW4gYW4gZXhjZXB0aW9uIGF0IHRoZSBhZGRyIHRoZSBmaXJzdAorICogbG9uZ3dvcmQgaXMgcG9pbnRpbmcgdG8gaXMgY2F1Z2h0LgorICovCisKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduCTIKK29rdGFnb25fZXhjZXB0OgorCS5sb25nCWV4cDEscmV0MQorCS5sb25nCWV4cDIscmV0MgorCisjZWxzZQorCisvKgorVGhlIGNvZGUgd2hpY2ggZm9sbG93cyBpcyBmb3IgNjgweDAgYmFzZWQgYXNzZW1ibGVyIGFuZCBpcyBtZWFudCBmb3IKK0xpbnV4L202OGsuIEl0IHdhcyBjcmVhdGVkIGJ5IGNyb3NzIGNvbXBpbGluZyB0aGUgY29kZSB1c2luZyB0aGUKK2luc3RydWN0aW9ucyBnaXZlbiBhYm92ZS4gSSB0aGVuIGFkZGVkIHRoZSBmb3VyIGxhYmVscyB1c2VkIGluIHRoZQorZXhjZXB0aW9uIGhhbmRsZXIgdGFibGUgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuCistIEtldmluIDxrY296ZW5zQGludGVybG9nLmNvbT4KKyovCisKKyNpZmRlZiBDT05GSUdfQU1JR0EKKworCS5maWxlCSJva3RhZ29uX2lvLmMiCisJLnZlcnNpb24JIjAxLjAxIgorZ2NjMl9jb21waWxlZC46CisudGV4dAorCS5hbGlnbiAJMgorLmdsb2JsIG9rdGFnX3RvX2lvCisJLnR5cGUJIG9rdGFnX3RvX2lvLEBmdW5jdGlvbgorb2t0YWdfdG9faW86CisJbGluay53ICVhNiwjMAorCW1vdmUubCAlZDIsLSglc3ApCisJbW92ZS5sIDgoJWE2KSwlYTEKKwltb3ZlLmwgMTIoJWE2KSwlZDEKKwltb3ZlLmwgJWQxLCVhMAorCW1vdmUubCAxNiglYTYpLCVkMAorCWFkZHEubCAjMywlZDAKKwlsc3IubCAjMiwlZDAKKwlzdWJxLmwgIzEsJWQwCisJbW92ZXEubCAjLTEsJWQyCisJY21wLmwgJWQwLCVkMgorCWpiZXEgLkwzCisuTDU6CitleHAxOgorCW1vdmUubCAoJWEwKSssKCVhMSkKKwlkYnJhICVkMCwuTDUKKwljbHIudyAlZDAKKwlzdWJxLmwgIzEsJWQwCisJamJjYyAuTDUKKy5MMzoKK3JldDE6CisJbW92ZS5sICVhMCwlZDAKKwlzdWIubCAlZDEsJWQwCisJYXNyLmwgIzIsJWQwCisJbW92ZS5sIC00KCVhNiksJWQyCisJdW5sayAlYTYKKwlydHMKKworLkxmZTE6CisJLnNpemUJIG9rdGFnX3RvX2lvLC5MZmUxLW9rdGFnX3RvX2lvCisJLmFsaWduIAkyCisuZ2xvYmwgb2t0YWdfZnJvbV9pbworCS50eXBlCSBva3RhZ19mcm9tX2lvLEBmdW5jdGlvbgorb2t0YWdfZnJvbV9pbzoKKwlsaW5rLncgJWE2LCMwCisJbW92ZS5sICVkMiwtKCVzcCkKKwltb3ZlLmwgOCglYTYpLCVkMQorCW1vdmUubCAxMiglYTYpLCVhMQorCW1vdmUubCAlZDEsJWEwCisJbW92ZS5sIDE2KCVhNiksJWQwCisJYWRkcS5sICMzLCVkMAorCWxzci5sICMyLCVkMAorCXN1YnEubCAjMSwlZDAKKwltb3ZlcS5sICMtMSwlZDIKKwljbXAubCAlZDAsJWQyCisJamJlcSAuTDkKKy5MMTE6CitleHAyOgorCW1vdmUubCAoJWExKSwoJWEwKSsKKwlkYnJhICVkMCwuTDExCisJY2xyLncgJWQwCisJc3VicS5sICMxLCVkMAorCWpiY2MgLkwxMQorLkw5OgorcmV0MjoKKwltb3ZlLmwgJWEwLCVkMAorCXN1Yi5sICVkMSwlZDAKKwlhc3IubCAjMiwlZDAKKwltb3ZlLmwgLTQoJWE2KSwlZDIKKwl1bmxrICVhNgorCXJ0cworLkxmZTI6CisJLnNpemUJIG9rdGFnX2Zyb21faW8sLkxmZTItb2t0YWdfZnJvbV9pbworCS5pZGVudAkiR0NDOiAoR05VKSAyLjcuMi4xIgorCisvKgorICogRXhjZXB0aW9uIHRhYmxlLgorICogU2Vjb25kIGxvbmd3b3JkIHNob3dzIHdoZXJlIHRvIGp1bXAgd2hlbiBhbiBleGNlcHRpb24gYXQgdGhlIGFkZHIgdGhlIGZpcnN0CisgKiBsb25nd29yZCBpcyBwb2ludGluZyB0byBpcyBjYXVnaHQuCisgKi8KKworLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24JMgorb2t0YWdvbl9leGNlcHQ6CisJLmxvbmcJZXhwMSxyZXQxCisJLmxvbmcJZXhwMixyZXQyCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NzdC5jIGIvZHJpdmVycy9zY3NpL29zc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTg1YzdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL29zc3QuYwpAQCAtMCwwICsxLDU5MTQgQEAKKy8qCisgIFNDU0kgVGFwZSBEcml2ZXIgZm9yIExpbnV4IHZlcnNpb24gMS4xIGFuZCBuZXdlci4gU2VlIHRoZSBhY2NvbXBhbnlpbmcKKyAgZmlsZSBEb2N1bWVudGF0aW9uL3Njc2kvc3QudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgIEhpc3Rvcnk6CisKKyAgT25TdHJlYW0gU0NTSSBUYXBlIHN1cHBvcnQgKG9zc3QpIGNsb25lZCBmcm9tIHN0LmMgYnkKKyAgV2lsbGVtIFJpZWRlIChvc3N0QHJpZWRlLm9yZykgRmViIDIwMDAKKyAgRml4ZXMgLi4uIEt1cnQgR2FybG9mZiA8Z2FybG9mZkBzdXNlLmRlPiBNYXIgMjAwMAorCisgIFJld3JpdHRlbiBmcm9tIER3YXluZSBGb3JzeXRoJ3MgU0NTSSB0YXBlIGRyaXZlciBieSBLYWkgTWFraXNhcmEuCisgIENvbnRyaWJ1dGlvbiBhbmQgaWRlYXMgZnJvbSBzZXZlcmFsIHBlb3BsZSBpbmNsdWRpbmcgKGluIGFscGhhYmV0aWNhbAorICBvcmRlcikgS2xhdXMgRWhyZW5mcmllZCwgV29sZmdhbmcgRGVuaywgU3RldmUgSGlyc2NoLCBBbmRyZWFzIEtvcHBlbmgib2ZlciwKKyAgTWljaGFlbCBMZW9kb2x0ZXIsIEV5YWwgTGViZWRpbnNreSwgSiJvcmcgV2V1bGUsIGFuZCBFcmljIFlvdW5nZGFsZS4KKworICBDb3B5cmlnaHQgMTk5MiAtIDIwMDIgS2FpIE1ha2lzYXJhIC8gMjAwMCAtIDIwMDQgV2lsbGVtIFJpZWRlCisJIGVtYWlsIG9zc3RAcmllZGUub3JnCisKKyAgJEhlYWRlcjogL2N2c3Jvb3Qvb3NzdC9Ecml2ZXIvb3NzdC5jLHYgMS43MyAyMDA1LzAxLzAxIDIxOjEzOjM0IHdyaWVkZSBFeHAgJAorCisgIE1pY3Jvc2NvcGljIGFsdGVyYXRpb25zIC0gUmlrIExpbmcsIDIwMDAvMTIvMjEKKyAgTGFzdCBzdC5jIHN5bmM6IFR1ZSBPY3QgMTUgMjI6MDE6MDQgMjAwMiBieSBtYWtpc2FyYQorICBTb21lIHNtYWxsIGZvcm1hbCBjaGFuZ2VzIC0gYWViLCA5NTA4MDkKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY3ZzaWQgPSAiJElkOiBvc3N0LmMsdiAxLjczIDIwMDUvMDEvMDEgMjE6MTM6MzQgd3JpZWRlIEV4cCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICogb3NzdF92ZXJzaW9uID0gIjAuOTkuMyI7CisKKy8qIFRoZSAiZmFpbHVyZSB0byByZWNvbm5lY3QiIGZpcm13YXJlIGJ1ZyAqLworI2RlZmluZSBPU1NUX0ZXX05FRURfUE9MTF9NSU4gMTA2MDEgLyooMTA3QSkqLworI2RlZmluZSBPU1NUX0ZXX05FRURfUE9MTF9NQVggMTA3MDQgLyooMTA4RCkqLworI2RlZmluZSBPU1NUX0ZXX05FRURfUE9MTCh4LGQpICgoeCkgPj0gT1NTVF9GV19ORUVEX1BPTExfTUlOICYmICh4KSA8PSBPU1NUX0ZXX05FRURfUE9MTF9NQVggJiYgZC0+aG9zdC0+dGhpc19pZCAhPSA3KQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBUaGUgZHJpdmVyIHByaW50cyBzb21lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvbiB0aGUgY29uc29sZSBpZiBERUJVRworICAgaXMgZGVmaW5lZCBhbmQgbm9uLXplcm8uICovCisjZGVmaW5lIERFQlVHIDAKKworLyogVGhlIG1lc3NhZ2UgbGV2ZWwgZm9yIHRoZSBkZWJ1ZyBtZXNzYWdlcyBpcyBjdXJyZW50bHkgc2V0IHRvIEtFUk5fTk9USUNFCisgICBzbyB0aGF0IHBlb3BsZSBjYW4gZWFzaWx5IHNlZSB0aGUgbWVzc2FnZXMuIExhdGVyIHdoZW4gdGhlIGRlYnVnZ2luZyBtZXNzYWdlcworICAgaW4gdGhlIGRyaXZlcnMgYXJlIG1vcmUgd2lkZWx5IGNsYXNzaWZpZWQsIHRoaXMgbWF5IGJlIGNoYW5nZWQgdG8gS0VSTl9ERUJVRy4gKi8KKyNkZWZpbmUgT1NTVF9ERUJfTVNHICBLRVJOX05PVElDRQorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorCisjZGVmaW5lIFNUX0tJTE9CWVRFIDEwMjQKKworI2luY2x1ZGUgInN0LmgiCisjaW5jbHVkZSAib3NzdC5oIgorI2luY2x1ZGUgIm9zc3Rfb3B0aW9ucy5oIgorI2luY2x1ZGUgIm9zc3RfZGV0ZWN0LmgiCisKK3N0YXRpYyBpbnQgbWF4X2RldiA9IDA7CitzdGF0aWMgaW50IHdyaXRlX3RocmVzaG9sZF9rYnMgPSAwOworc3RhdGljIGludCBtYXhfc2dfc2VncyA9IDA7CisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9BVVRIT1IoIldpbGxlbSBSaWVkZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPblN0cmVhbSB7REktfEZXLXxTQy18VVNCfXszMHw1MH0gVGFwZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9kZXYsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9kZXYsICJNYXhpbXVtIG51bWJlciBvZiBPblN0cmVhbSBUYXBlIERyaXZlcyB0byBhdHRhY2ggKDQpIik7CisKK21vZHVsZV9wYXJhbSh3cml0ZV90aHJlc2hvbGRfa2JzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh3cml0ZV90aHJlc2hvbGRfa2JzLCAiQXN5bmNocm9ub3VzIHdyaXRlIHRocmVzaG9sZCAoS0I7IDMyKSIpOworCittb2R1bGVfcGFyYW0obWF4X3NnX3NlZ3MsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9zZ19zZWdzLCAiTWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgdG8gdXNlICg5KSIpOworI2Vsc2UKK3N0YXRpYyBzdHJ1Y3Qgb3NzdF9kZXZfcGFybSB7CisgICAgICAgY2hhciAgICpuYW1lOworICAgICAgIGludCAgICAqdmFsOworfSBwYXJtc1tdIF9faW5pdGRhdGEgPSB7CisgICAgICAgeyAibWF4X2RldiIsICAgICAgICAgICAgICZtYXhfZGV2ICAgICAgICAgICAgIH0sCisgICAgICAgeyAid3JpdGVfdGhyZXNob2xkX2ticyIsICZ3cml0ZV90aHJlc2hvbGRfa2JzIH0sCisgICAgICAgeyAibWF4X3NnX3NlZ3MiLCAgICAgICAgICZtYXhfc2dfc2VncyAgICAgICAgIH0KK307CisjZW5kaWYKKworc3RhdGljIGNoYXIgKm9zc3RfZm9ybWF0c1tTVF9OQlJfTU9ERVNdID17IiIsICJsIiwgIm0iLCAiYSJ9OworCisvKiBTb21lIGRlZmF1bHQgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIHRvIG9zc3Rfb3B0aW9ucy5oICovCisjZGVmaW5lIE9TU1RfQlVGRkVSX1NJWkUgKE9TU1RfQlVGRkVSX0JMT0NLUyAqIFNUX0tJTE9CWVRFKQorI2RlZmluZSBPU1NUX1dSSVRFX1RIUkVTSE9MRCAoT1NTVF9XUklURV9USFJFU0hPTERfQkxPQ0tTICogU1RfS0lMT0JZVEUpCisKKy8qIFRoZSBidWZmZXIgc2l6ZSBzaG91bGQgZml0IGludG8gdGhlIDI0IGJpdHMgZm9yIGxlbmd0aCBpbiB0aGUKKyAgIDYtYnl0ZSBTQ1NJIHJlYWQgYW5kIHdyaXRlIGNvbW1hbmRzLiAqLworI2lmIE9TU1RfQlVGRkVSX1NJWkUgPj0gKDIgPDwgMjQgLSAxKQorI2Vycm9yICJCdWZmZXIgc2l6ZSBzaG91bGQgbm90IGV4Y2VlZCAoMiA8PCAyNCAtIDEpIGJ5dGVzISIKKyNlbmRpZgorCisjaWYgREVCVUcKK3N0YXRpYyBpbnQgZGVidWdnaW5nID0gMTsKKy8qIHVuY29tbWVudCBkZWZpbmUgYmVsb3cgdG8gdGVzdCBlcnJvciByZWNvdmVyeSAqLworLy8gI2RlZmluZSBPU1NUX0lOSkVDVF9FUlJPUlMgMSAKKyNlbmRpZgorCisvKiBEbyBub3QgcmV0cnkhIFRoZSBkcml2ZSBmaXJtd2FyZSBhbHJlYWR5IHJldHJpZXMgd2hlbiBhcHByb3ByaWF0ZSwKKyAgIGFuZCB3aGVuIGl0IHRyaWVzIHRvIHRlbGwgdXMgc29tZXRoaW5nLCB3ZSBoYWQgYmV0dGVyIGxpc3Rlbi4uLiAqLworI2RlZmluZSBNQVhfUkVUUklFUyAwCisKKyNkZWZpbmUgTk9fVEFQRSAgTk9UX1JFQURZCisKKyNkZWZpbmUgT1NTVF9XQUlUX1BPU0lUSU9OX0NPTVBMRVRFICAgKEhaID4gMjAwID8gSFogLyAyMDAgOiAxKQorI2RlZmluZSBPU1NUX1dBSVRfV1JJVEVfQ09NUExFVEUgICAgICAoSFogLyAxMikKKyNkZWZpbmUgT1NTVF9XQUlUX0xPTkdfV1JJVEVfQ09NUExFVEUgKEhaIC8gMikKKwkKKyNkZWZpbmUgT1NTVF9USU1FT1VUICgyMDAgKiBIWikKKyNkZWZpbmUgT1NTVF9MT05HX1RJTUVPVVQgKDE4MDAgKiBIWikKKworI2RlZmluZSBUQVBFX05SKHgpIChpbWlub3IoeCkgJiB+KC0xIDw8IFNUX01PREVfU0hJRlQpKQorI2RlZmluZSBUQVBFX01PREUoeCkgKChpbWlub3IoeCkgJiBTVF9NT0RFX01BU0spID4+IFNUX01PREVfU0hJRlQpCisjZGVmaW5lIFRBUEVfUkVXSU5EKHgpICgoaW1pbm9yKHgpICYgMHg4MCkgPT0gMCkKKyNkZWZpbmUgVEFQRV9JU19SQVcoeCkgKFRBUEVfTU9ERSh4KSAmIChTVF9OQlJfTU9ERVMgPj4gMSkpCisKKy8qIEludGVybmFsIGlvY3RsIHRvIHNldCBib3RoIGRlbnNpdHkgKHVwcGVybW9zdCA4IGJpdHMpIGFuZCBibG9ja3NpemUgKGxvd2VyCisgICAyNCBiaXRzKSAqLworI2RlZmluZSBTRVRfREVOU19BTkRfQkxLIDB4MTAwMDEKKworc3RhdGljIGludCBvc3N0X2J1ZmZlcl9zaXplICAgICAgID0gT1NTVF9CVUZGRVJfU0laRTsKK3N0YXRpYyBpbnQgb3NzdF93cml0ZV90aHJlc2hvbGQgICA9IE9TU1RfV1JJVEVfVEhSRVNIT0xEOworc3RhdGljIGludCBvc3N0X21heF9zZ19zZWdzICAgICAgID0gT1NTVF9NQVhfU0c7CitzdGF0aWMgaW50IG9zc3RfbWF4X2RldiAgICAgICAgICAgPSBPU1NUX01BWF9UQVBFUzsKK3N0YXRpYyBpbnQgb3NzdF9ucl9kZXY7CisKK3N0YXRpYyBzdHJ1Y3Qgb3NzdF90YXBlICoqb3Nfc2NzaV90YXBlcyA9IE5VTEw7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhvc19zY3NpX3RhcGVzX2xvY2spOworCitzdGF0aWMgaW50IG1vZGVzX2RlZmluZWQgPSAwOworCitzdGF0aWMgc3RydWN0IG9zc3RfYnVmZmVyICpuZXdfdGFwZV9idWZmZXIoaW50LCBpbnQsIGludCk7CitzdGF0aWMgaW50IGVubGFyZ2VfYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqLCBpbnQpOworc3RhdGljIHZvaWQgbm9ybWFsaXplX2J1ZmZlcihzdHJ1Y3Qgb3NzdF9idWZmZXIgKik7CitzdGF0aWMgaW50IGFwcGVuZF90b19idWZmZXIoY29uc3QgY2hhciBfX3VzZXIgKiwgc3RydWN0IG9zc3RfYnVmZmVyICosIGludCk7CitzdGF0aWMgaW50IGZyb21fYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqLCBjaGFyIF9fdXNlciAqLCBpbnQpOworc3RhdGljIGludCBvc3N0X3plcm9fYnVmZmVyX3RhaWwoc3RydWN0IG9zc3RfYnVmZmVyICopOworc3RhdGljIGludCBvc3N0X2NvcHlfdG9fYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqLCB1bnNpZ25lZCBjaGFyICopOworc3RhdGljIGludCBvc3N0X2NvcHlfZnJvbV9idWZmZXIoc3RydWN0IG9zc3RfYnVmZmVyICosIHVuc2lnbmVkIGNoYXIgKik7CisKK3N0YXRpYyBpbnQgb3NzdF9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBvc3N0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICopOworCitzdGF0aWMgc3RydWN0IHNjc2lfZHJpdmVyIG9zc3RfdGVtcGxhdGUgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZ2VuZHJ2ID0geworCQkubmFtZQkJPSAgIm9zc3QiLAorCQkucHJvYmUJCT0gb3NzdF9wcm9iZSwKKwkJLnJlbW92ZQkJPSBvc3N0X3JlbW92ZSwKKwl9Cit9OworCitzdGF0aWMgaW50IG9zc3RfaW50X2lvY3RsKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgaW50IG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBmcmFtZSwgaW50IHNraXApOworCitzdGF0aWMgaW50IG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpOworCitzdGF0aWMgaW50IG9zc3RfZmx1c2hfd3JpdGVfYnVmZmVyKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpOworCitzdGF0aWMgaW50IG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3Zlcnkoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBwZW5kaW5nKTsKKworc3RhdGljIGlubGluZSBjaGFyICp0YXBlX25hbWUoc3RydWN0IG9zc3RfdGFwZSAqdGFwZSkKK3sKKwlyZXR1cm4gdGFwZS0+ZHJpdmUtPmRpc2tfbmFtZTsKK30KKwwKKy8qIFJvdXRpbmVzIHRoYXQgaGFuZGxlIHRoZSBpbnRlcmFjdGlvbiB3aXRoIG1pZC1sYXllciBTQ1NJIHJvdXRpbmVzICovCisKKy8qIENvbnZlcnQgdGhlIHJlc3VsdCB0byBzdWNjZXNzIGNvZGUgKi8KK3N0YXRpYyBpbnQgb3NzdF9jaGtfcmVzdWx0KHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCkKK3sKKwljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJaW50IHJlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqIHNlbnNlID0gU1JwbnQtPnNyX3NlbnNlX2J1ZmZlciwgc2NvZGU7CisjaWYgREVCVUcKKwljb25zdCBjaGFyICpzdHA7CisjZW5kaWYKKworCWlmICghcmVzdWx0KSB7CisJCXNlbnNlWzBdID0gMDsgICAgLyogV2UgZG9uJ3QgaGF2ZSBzZW5zZSBkYXRhIGlmIHRoaXMgYnl0ZSBpcyB6ZXJvICovCisJCXJldHVybiAwOworCX0KKwlpZiAoKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfTUFTSykgPT0gRFJJVkVSX1NFTlNFKQorCQlzY29kZSA9IHNlbnNlWzJdICYgMHgwZjsKKwllbHNlIHsKKwkJc2Vuc2VbMF0gPSAwOyAgICAvKiBXZSBkb24ndCBoYXZlIHNlbnNlIGRhdGEgaWYgdGhpcyBieXRlIGlzIHplcm8gKi8KKwkJc2NvZGUgPSAwOworCX0KKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcpIHsKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRXJyb3I6ICV4LCBjbWQ6ICV4ICV4ICV4ICV4ICV4ICV4IExlbjogJWRcbiIsCisJCSAgIG5hbWUsIHJlc3VsdCwKKwkJICAgU1JwbnQtPnNyX2NtbmRbMF0sIFNScG50LT5zcl9jbW5kWzFdLCBTUnBudC0+c3JfY21uZFsyXSwKKwkJICAgU1JwbnQtPnNyX2NtbmRbM10sIFNScG50LT5zcl9jbW5kWzRdLCBTUnBudC0+c3JfY21uZFs1XSwKKwkJICAgU1JwbnQtPnNyX2J1ZmZsZW4pOworCQlpZiAoc2NvZGUpIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNlbnNlOiAlMDJ4LCBBU0M6ICUwMngsIEFTQ1E6ICUwMnhcbiIsCisJCQkgICAgICAgCW5hbWUsIHNjb2RlLCBzZW5zZVsxMl0sIHNlbnNlWzEzXSk7CisJCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKQorCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoIm9zc3QgIiwgU1JwbnQpOworCX0KKwllbHNlCisjZW5kaWYKKwlpZiAoIShkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKSB8fAorCQkoKHNlbnNlWzBdICYgMHg3MCkgPT0gMHg3MCAmJgorCQkgc2NvZGUgIT0gTk9fU0VOU0UgJiYKKwkJIHNjb2RlICE9IFJFQ09WRVJFRF9FUlJPUiAmJgorLyogICAgICAJIHNjb2RlICE9IFVOSVRfQVRURU5USU9OICYmICovCisJCSBzY29kZSAhPSBCTEFOS19DSEVDSyAmJgorCQkgc2NvZGUgIT0gVk9MVU1FX09WRVJGTE9XICYmCisJCSBTUnBudC0+c3JfY21uZFswXSAhPSBNT0RFX1NFTlNFICYmCisJCSBTUnBudC0+c3JfY21uZFswXSAhPSBURVNUX1VOSVRfUkVBRFkpKSB7IC8qIEFibm9ybWFsIGNvbmRpdGlvbnMgZm9yIHRhcGUgKi8KKwkJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IENvbW1hbmQgd2l0aCBzZW5zZSBkYXRhOlxuIiwgbmFtZSk7CisJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgib3NzdDoiLCBTUnBudCk7CisJCX0KKwkJZWxzZSB7CisJCQlzdGF0aWMJaW50CW5vdHlldHByaW50ZWQgPSAxOworCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICIlczpXOiBXYXJuaW5nICV4IChzdWdnLiBidCAweCV4LCBkcml2ZXIgYnQgMHgleCwgaG9zdCBidCAweCV4KS5cbiIsCisJCQkgICAgIG5hbWUsIHJlc3VsdCwgc3VnZ2VzdGlvbihyZXN1bHQpLCBkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX01BU0ssCisJCQkgICAgIGhvc3RfYnl0ZShyZXN1bHQpKTsKKwkJCWlmIChub3R5ZXRwcmludGVkKSB7CisJCQkJbm90eWV0cHJpbnRlZCA9IDA7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6STogVGhpcyB3YXJuaW5nIG1heSBiZSBjYXVzZWQgYnkgeW91ciBzY3NpIGNvbnRyb2xsZXIsXG4iLCBuYW1lKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczpJOiBpdCBoYXMgYmVlbiByZXBvcnRlZCB3aXRoIHNvbWUgQnVzbG9naWMgY2FyZHMuXG4iLCBuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwlTVHAtPnBvc191bmtub3duIHw9IFNUcC0+ZGV2aWNlLT53YXNfcmVzZXQ7CisKKwlpZiAoKHNlbnNlWzBdICYgMHg3MCkgPT0gMHg3MCAmJgorCSAgICAgc2NvZGUgPT0gUkVDT1ZFUkVEX0VSUk9SKSB7CisJCVNUcC0+cmVjb3Zlcl9jb3VudCsrOworCQlTVHAtPnJlY292ZXJfZXJyZWcrKzsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKSB7CisJCQlpZiAoU1JwbnQtPnNyX2NtbmRbMF0gPT0gUkVBRF82KQorCQkJCXN0cCA9ICJyZWFkIjsKKwkJCWVsc2UgaWYgKFNScG50LT5zcl9jbW5kWzBdID09IFdSSVRFXzYpCisJCQkJc3RwID0gIndyaXRlIjsKKwkJCWVsc2UKKwkJCQlzdHAgPSAiaW9jdGwiOworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVjb3ZlcmVkICVzIGVycm9yICglZCkuXG4iLCBuYW1lLCBzdHAsCisJCQkJCSAgICAgU1RwLT5yZWNvdmVyX2NvdW50KTsKKwkJfQorI2VuZGlmCisJCWlmICgoc2Vuc2VbMl0gJiAweGUwKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAoLUVJTyk7Cit9CisKKworLyogV2FrZXVwIGZyb20gaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBvc3N0X3NsZWVwX2RvbmUgKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlzdHJ1Y3Qgb3NzdF90YXBlICogU1RwID0gY29udGFpbmVyX29mKFNDcG50LT5yZXF1ZXN0LT5ycV9kaXNrLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBvc3N0X3RhcGUsIGRyaXZlcik7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+d3JpdGluZyAmJgorCSAgICAoU0NwbnQtPnNlbnNlX2J1ZmZlclswXSAmIDB4NzApID09IDB4NzAgJiYKKwkgICAgKFNDcG50LT5zZW5zZV9idWZmZXJbMl0gJiAweDQwKSkgeworCQkvKiBFT00gYXQgd3JpdGUtYmVoaW5kLCBoYXMgYWxsIGJlZW4gd3JpdHRlbj8gKi8KKwkJaWYgKChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gVk9MVU1FX09WRVJGTE9XKQorCQkJU1RwLT5idWZmZXItPm1pZGxldmVsX3Jlc3VsdCA9IFNDcG50LT5yZXN1bHQ7IC8qIEVycm9yICovCisJCWVsc2UKKwkJCVNUcC0+YnVmZmVyLT5taWRsZXZlbF9yZXN1bHQgPSBJTlRfTUFYOyAgICAgICAvKiBPSyAqLworCX0KKwllbHNlCisJCVNUcC0+YnVmZmVyLT5taWRsZXZlbF9yZXN1bHQgPSBTQ3BudC0+cmVzdWx0OworCVNDcG50LT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CisJU1RwLT5idWZmZXItPmxhc3RfU1JwbnQgPSBTQ3BudC0+c2NfcmVxdWVzdDsKKworI2lmIERFQlVHCisJU1RwLT53cml0ZV9wZW5kaW5nID0gMDsKKyNlbmRpZgorCWNvbXBsZXRlKFNDcG50LT5yZXF1ZXN0LT53YWl0aW5nKTsKK30KKworCisvKiBEbyB0aGUgc2NzaSBjb21tYW5kLiBXYWl0cyB1bnRpbCBjb21tYW5kIHBlcmZvcm1lZCBpZiBkb193YWl0IGlzIHRydWUuCisgICBPdGhlcndpc2Ugb3NzdF93cml0ZV9iZWhpbmRfY2hlY2soKSBpcyB1c2VkIHRvIGNoZWNrIHRoYXQgdGhlIGNvbW1hbmQKKyAgIGhhcyBmaW5pc2hlZC4gKi8KK3N0YXRpYwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogb3NzdF9kb19zY3NpKHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCBzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIAorCXVuc2lnbmVkIGNoYXIgKmNtZCwgaW50IGJ5dGVzLCBpbnQgZGlyZWN0aW9uLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsIGludCBkb193YWl0KQoreworCXVuc2lnbmVkIGNoYXIgKmJwOworI2lmZGVmIE9TU1RfSU5KRUNUX0VSUk9SUworCXN0YXRpYyAgIGludCAgIGluamVjdCA9IDA7CisJc3RhdGljICAgaW50ICAgcmVwZWF0ID0gMDsKKyNlbmRpZgorCWlmIChTUnBudCA9PSBOVUxMKSB7CisJCWlmICgoU1JwbnQgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoU1RwLT5kZXZpY2UsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IENhbid0IGdldCBTQ1NJIHJlcXVlc3QuXG4iLCB0YXBlX25hbWUoU1RwKSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAoLUVJTlRSKTsKKwkJCWVsc2UKKwkJCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9ICgtRUJVU1kpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKyAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZTVHAtPndhaXQpOworCVNScG50LT5zcl91c2Vfc2cgPSAoYnl0ZXMgPiAoU1RwLT5idWZmZXIpLT5zZ1swXS5sZW5ndGgpID8KKwkJCQkgICAgKFNUcC0+YnVmZmVyKS0+dXNlX3NnIDogMDsKKwlpZiAoU1JwbnQtPnNyX3VzZV9zZykgeworCQlicCA9IChjaGFyICopJihTVHAtPmJ1ZmZlci0+c2dbMF0pOworCQlpZiAoU1RwLT5idWZmZXItPnNnX3NlZ3MgPCBTUnBudC0+c3JfdXNlX3NnKQorCQkJU1JwbnQtPnNyX3VzZV9zZyA9IFNUcC0+YnVmZmVyLT5zZ19zZWdzOworCX0KKwllbHNlCisJCWJwID0gKFNUcC0+YnVmZmVyKS0+Yl9kYXRhOworCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKwlTUnBudC0+c3JfY21kX2xlbiA9IDA7CisJU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSAmKFNUcC0+d2FpdCk7CisJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKwlTUnBudC0+c3JfcmVxdWVzdC0+cnFfZGlzayA9IFNUcC0+ZHJpdmU7CisKKwlzY3NpX2RvX3JlcShTUnBudCwgKHZvaWQgKiljbWQsIGJwLCBieXRlcywgb3NzdF9zbGVlcF9kb25lLCB0aW1lb3V0LCByZXRyaWVzKTsKKworCWlmIChkb193YWl0KSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcpOworCQlTUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7CisJCVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9IG9zc3RfY2hrX3Jlc3VsdChTVHAsIFNScG50KTsKKyNpZmRlZiBPU1NUX0lOSkVDVF9FUlJPUlMKKwkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9PSAwICYmCisJCSAgICBjbWRbMF0gPT0gUkVBRF82ICYmCisJCSAgICBjbWRbNF0gJiYgCisJCSAgICAoICgrKyBpbmplY3QgJSA4MykgPT0gMjkgIHx8CisJCSAgICAgIChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID09IDI0MCAKKwkJCSAgICAgICAgIC8qIG9yIFNUcC0+cmVhZF9lcnJvcl9mcmFtZSB0byBmYWlsIGFnYWluIG9uIHRoZSBibG9jayBjYWxjdWxhdGVkIGFib3ZlICovICYmCisJCQkJICsrcmVwZWF0IDwgMykpKSB7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBJbmplY3RpbmcgcmVhZCBlcnJvclxuIiwgdGFwZV9uYW1lKFNUcCkpOworCQkJU1RwLT5idWZmZXItPmxhc3RfcmVzdWx0X2ZhdGFsID0gMTsKKwkJfQorI2VuZGlmCisJfQorCXJldHVybiBTUnBudDsKK30KKworCisvKiBIYW5kbGUgdGhlIHdyaXRlLWJlaGluZCBjaGVja2luZyAoZG93bnMgdGhlIHNlbWFwaG9yZSkgKi8KK3N0YXRpYyB2b2lkIG9zc3Rfd3JpdGVfYmVoaW5kX2NoZWNrKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCkKK3sKKwlzdHJ1Y3Qgb3NzdF9idWZmZXIgKiBTVGJ1ZmZlcjsKKworCVNUYnVmZmVyID0gU1RwLT5idWZmZXI7CisKKyNpZiBERUJVRworCWlmIChTVHAtPndyaXRlX3BlbmRpbmcpCisJCVNUcC0+bmJyX3dhaXRzKys7CisJZWxzZQorCQlTVHAtPm5icl9maW5pc2hlZCsrOworI2VuZGlmCisJd2FpdF9mb3JfY29tcGxldGlvbigmKFNUcC0+d2FpdCkpOworCShTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOworCisJU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ID0gb3NzdF9jaGtfcmVzdWx0KFNUcCwgU1RwLT5idWZmZXItPmxhc3RfU1JwbnQpOworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0KQorCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9CisJCQlvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgJigoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50KSwgMSk7CisJZWxzZQorCQlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uKys7CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdCgoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50KTsKKworCWlmIChTVGJ1ZmZlci0+d3JpdGluZyA8IFNUYnVmZmVyLT5idWZmZXJfYnl0ZXMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IHdyaXRlX2JlaGluZF9jaGVjazogc29tZXRoaW5nIGxlZnQgaW4gYnVmZmVyIVxuIik7CisKKwlTVGJ1ZmZlci0+YnVmZmVyX2J5dGVzIC09IFNUYnVmZmVyLT53cml0aW5nOworCVNUYnVmZmVyLT53cml0aW5nID0gMDsKKworCXJldHVybjsKK30KKworCisMCisvKiBPbnN0cmVhbSBzcGVjaWZpYyBSb3V0aW5lcyAqLworLyoKKyAqIEluaXRpYWxpemUgdGhlIE9uU3RyZWFtIEFVWAorICovCitzdGF0aWMgdm9pZCBvc3N0X2luaXRfYXV4KHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIGludCBmcmFtZV90eXBlLCBpbnQgZnJhbWVfc2VxX251bWJlciwKKwkJCQkJIGludCBsb2dpY2FsX2Jsa19udW0sIGludCBibGtfc3osIGludCBibGtfY250KQoreworCW9zX2F1eF90ICAgICAgICphdXggPSBTVHAtPmJ1ZmZlci0+YXV4OworCW9zX3BhcnRpdGlvbl90ICpwYXIgPSAmYXV4LT5wYXJ0aXRpb247CisJb3NfZGF0X3QgICAgICAgKmRhdCA9ICZhdXgtPmRhdDsKKworCWlmIChTVHAtPnJhdykgcmV0dXJuOworCisJbWVtc2V0KGF1eCwgMCwgc2l6ZW9mKCphdXgpKTsKKwlhdXgtPmZvcm1hdF9pZCA9IGh0b25sKDApOworCW1lbWNweShhdXgtPmFwcGxpY2F0aW9uX3NpZywgIkxJTjQiLCA0KTsKKwlhdXgtPmhkd3IgPSBodG9ubCgwKTsKKwlhdXgtPmZyYW1lX3R5cGUgPSBmcmFtZV90eXBlOworCisJc3dpdGNoIChmcmFtZV90eXBlKSB7CisJICBjYXNlCU9TX0ZSQU1FX1RZUEVfSEVBREVSOgorCQlhdXgtPnVwZGF0ZV9mcmFtZV9jbnRyICAgID0gaHRvbmwoU1RwLT51cGRhdGVfZnJhbWVfY250cik7CisJCXBhci0+cGFydGl0aW9uX251bSAgICAgICAgPSBPU19DT05GSUdfUEFSVElUSU9OOworCQlwYXItPnBhcl9kZXNjX3ZlciAgICAgICAgID0gT1NfUEFSVElUSU9OX1ZFUlNJT047CisJCXBhci0+d3J0X3Bhc3NfY250ciAgICAgICAgPSBodG9ucygweGZmZmYpOworCQkvKiAwLTQgPSByZXNlcnZlZCwgNS05ID0gaGVhZGVyLCAyOTkwLTI5OTQgPSBoZWFkZXIsIDI5OTUtMjk5OSA9IHJlc2VydmVkICovCisJCXBhci0+Zmlyc3RfZnJhbWVfcHBvcyAgICAgPSBodG9ubCgwKTsKKwkJcGFyLT5sYXN0X2ZyYW1lX3Bwb3MgICAgICA9IGh0b25sKDB4YmI3KTsKKwkJYXV4LT5mcmFtZV9zZXFfbnVtICAgICAgICA9IGh0b25sKDApOworCQlhdXgtPmxvZ2ljYWxfYmxrX251bV9oaWdoID0gaHRvbmwoMCk7CisJCWF1eC0+bG9naWNhbF9ibGtfbnVtICAgICAgPSBodG9ubCgwKTsKKwkJYXV4LT5uZXh0X21hcmtfcHBvcyAgICAgICA9IGh0b25sKFNUcC0+Zmlyc3RfbWFya19wcG9zKTsKKwkJYnJlYWs7CisJICBjYXNlCU9TX0ZSQU1FX1RZUEVfREFUQToKKwkgIGNhc2UJT1NfRlJBTUVfVFlQRV9NQVJLRVI6CisJCWRhdC0+ZGF0X3N6ID0gODsKKwkJZGF0LT5yZXNlcnZlZDEgPSAwOworCQlkYXQtPmVudHJ5X2NudCA9IDE7CisJCWRhdC0+cmVzZXJ2ZWQzID0gMDsKKwkJZGF0LT5kYXRfbGlzdFswXS5ibGtfc3ogICA9IGh0b25sKGJsa19zeik7CisJCWRhdC0+ZGF0X2xpc3RbMF0uYmxrX2NudCAgPSBodG9ucyhibGtfY250KTsKKwkJZGF0LT5kYXRfbGlzdFswXS5mbGFncyAgICA9IGZyYW1lX3R5cGU9PU9TX0ZSQU1FX1RZUEVfTUFSS0VSPworCQkJCQkJCU9TX0RBVF9GTEFHU19NQVJLOk9TX0RBVF9GTEFHU19EQVRBOworCQlkYXQtPmRhdF9saXN0WzBdLnJlc2VydmVkID0gMDsKKwkgIGNhc2UJT1NfRlJBTUVfVFlQRV9FT0Q6CisJCWF1eC0+dXBkYXRlX2ZyYW1lX2NudHIgICAgPSBodG9ubCgwKTsKKwkJcGFyLT5wYXJ0aXRpb25fbnVtICAgICAgICA9IE9TX0RBVEFfUEFSVElUSU9OOworCQlwYXItPnBhcl9kZXNjX3ZlciAgICAgICAgID0gT1NfUEFSVElUSU9OX1ZFUlNJT047CisJCXBhci0+d3J0X3Bhc3NfY250ciAgICAgICAgPSBodG9ucyhTVHAtPndydF9wYXNzX2NudHIpOworCQlwYXItPmZpcnN0X2ZyYW1lX3Bwb3MgICAgID0gaHRvbmwoU1RwLT5maXJzdF9kYXRhX3Bwb3MpOworCQlwYXItPmxhc3RfZnJhbWVfcHBvcyAgICAgID0gaHRvbmwoU1RwLT5jYXBhY2l0eSk7CisJCWF1eC0+ZnJhbWVfc2VxX251bSAgICAgICAgPSBodG9ubChmcmFtZV9zZXFfbnVtYmVyKTsKKwkJYXV4LT5sb2dpY2FsX2Jsa19udW1faGlnaCA9IGh0b25sKDApOworCQlhdXgtPmxvZ2ljYWxfYmxrX251bSAgICAgID0gaHRvbmwobG9naWNhbF9ibGtfbnVtKTsKKwkJYnJlYWs7CisJICBkZWZhdWx0OiA7IC8qIHByb2JhYmx5IEZJTEwgKi8KKwl9CisJYXV4LT5maWxlbWFya19jbnQgPSBudG9obChTVHAtPmZpbGVtYXJrX2NudCk7CisJYXV4LT5waHlzX2ZtID0gbnRvaGwoMHhmZmZmZmZmZik7CisJYXV4LT5sYXN0X21hcmtfcHBvcyA9IG50b2hsKFNUcC0+bGFzdF9tYXJrX3Bwb3MpOworCWF1eC0+bGFzdF9tYXJrX2xibiAgPSBudG9obChTVHAtPmxhc3RfbWFya19sYm4pOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgd2UgaGF2ZSB0aGUgY29ycmVjdCB0YXBlIGZyYW1lCisgKi8KK3N0YXRpYyBpbnQgb3NzdF92ZXJpZnlfZnJhbWUoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgaW50IGZyYW1lX3NlcV9udW1iZXIsIGludCBxdWlldCkKK3sKKwljaGFyICAgICAgICAgICAgICAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJb3NfYXV4X3QgICAgICAgICAgICogYXV4ICA9IFNUcC0+YnVmZmVyLT5hdXg7CisJb3NfcGFydGl0aW9uX3QgICAgICogcGFyICA9ICYoYXV4LT5wYXJ0aXRpb24pOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqIFNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlpbnQJCSAgICAgYmxrX2NudCwgYmxrX3N6LCBpOworCisJaWYgKFNUcC0+cmF3KSB7CisJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpIHsKKwkJCWZvciAoaT0wOyBpIDwgU1RwLT5idWZmZXItPnNnX3NlZ3M7IGkrKykKKwkJCQltZW1zZXQocGFnZV9hZGRyZXNzKFNUcC0+YnVmZmVyLT5zZ1tpXS5wYWdlKSwKKwkJCQkgICAgICAgMCwgU1RwLT5idWZmZXItPnNnW2ldLmxlbmd0aCk7CisJCQlzdHJjcHkoU1RwLT5idWZmZXItPmJfZGF0YSwgIlJFQUQgRVJST1IgT04gRlJBTUUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKwkJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgPSBPU19GUkFNRV9TSVpFOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNraXBwaW5nIGZyYW1lLCByZWFkIGVycm9yXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKG50b2hsKGF1eC0+Zm9ybWF0X2lkKSAhPSAwKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgZnJhbWUsIGZvcm1hdF9pZCAldVxuIiwgbmFtZSwgbnRvaGwoYXV4LT5mb3JtYXRfaWQpKTsKKyNlbmRpZgorCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChtZW1jbXAoYXV4LT5hcHBsaWNhdGlvbl9zaWcsIFNUcC0+YXBwbGljYXRpb25fc2lnLCA0KSAhPSAwICYmCisJICAgIChtZW1jbXAoYXV4LT5hcHBsaWNhdGlvbl9zaWcsICJMSU4zIiwgNCkgIT0gMCB8fCBTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gIT0gNCkpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgaW5jb3JyZWN0IGFwcGxpY2F0aW9uIHNpZ25hdHVyZVxuIiwgbmFtZSk7CisjZW5kaWYKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAocGFyLT5wYXJ0aXRpb25fbnVtICE9IE9TX0RBVEFfUEFSVElUSU9OKSB7CisJCWlmICghU1RwLT5saW51eF9tZWRpYSB8fCBTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gIT0gMikgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgcGFydGl0aW9uIG51bSAlZFxuIiwKKwkJCQkJICAgIG5hbWUsIHBhci0+cGFydGl0aW9uX251bSk7CisjZW5kaWYKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKwlpZiAocGFyLT5wYXJfZGVzY192ZXIgIT0gT1NfUEFSVElUSU9OX1ZFUlNJT04pIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgcGFydGl0aW9uIHZlcnNpb24gJWRcbiIsIG5hbWUsIHBhci0+cGFyX2Rlc2NfdmVyKTsKKyNlbmRpZgorCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChudG9ocyhwYXItPndydF9wYXNzX2NudHIpICE9IFNUcC0+d3J0X3Bhc3NfY250cikgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNraXBwaW5nIGZyYW1lLCB3cnRfcGFzc19jbnRyICVkIChleHBlY3RlZCAlZClcbiIsIAorCQkJCSAgICBuYW1lLCBudG9ocyhwYXItPndydF9wYXNzX2NudHIpLCBTVHAtPndydF9wYXNzX2NudHIpOworI2VuZGlmCisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKGF1eC0+ZnJhbWVfdHlwZSAhPSBPU19GUkFNRV9UWVBFX0RBVEEgJiYKKwkgICAgYXV4LT5mcmFtZV90eXBlICE9IE9TX0ZSQU1FX1RZUEVfRU9EICYmCisJICAgIGF1eC0+ZnJhbWVfdHlwZSAhPSBPU19GUkFNRV9UWVBFX01BUktFUikgeworCQlpZiAoIXF1aWV0KQorI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgZnJhbWUgdHlwZSAleFxuIiwgbmFtZSwgYXV4LT5mcmFtZV90eXBlKTsKKyNlbmRpZgorCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChhdXgtPmZyYW1lX3R5cGUgPT0gT1NfRlJBTUVfVFlQRV9FT0QgJiYKKwkgICAgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA8IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogU2tpcHBpbmcgcHJlbWF0dXJlIEVPRCBmcmFtZSAlZFxuIiwgbmFtZSwKKwkJCQkgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbik7CisJCWdvdG8gZXJyX291dDsKKwl9CisgICAgICAgIGlmIChmcmFtZV9zZXFfbnVtYmVyICE9IC0xICYmIG50b2hsKGF1eC0+ZnJhbWVfc2VxX251bSkgIT0gZnJhbWVfc2VxX251bWJlcikgeworCQlpZiAoIXF1aWV0KQorI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSwgc2VxdWVuY2UgbnVtYmVyICV1IChleHBlY3RlZCAlZClcbiIsIAorCQkJCQkgICAgbmFtZSwgbnRvaGwoYXV4LT5mcmFtZV9zZXFfbnVtKSwgZnJhbWVfc2VxX251bWJlcik7CisjZW5kaWYKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoYXV4LT5mcmFtZV90eXBlID09IE9TX0ZSQU1FX1RZUEVfTUFSS0VSKSB7CisJCVNUcHMtPmVvZiA9IFNUX0ZNX0hJVDsKKworCQlpID0gbnRvaGwoYXV4LT5maWxlbWFya19jbnQpOworCQlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgIT0gTlVMTCAmJiBpIDwgT1NfRk1fVEFCX01BWCAmJiAoaSA+IFNUcC0+ZmlsZW1hcmtfY250IHx8CisJCSAgICBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uIC0gMSAhPSBudG9obChTVHAtPmhlYWRlcl9jYWNoZS0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50W2ldKSkpIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogJXMgZmlsZW1hcmsgJWQgYXQgZnJhbWUgcG9zICVkXG4iLCBuYW1lLAorCQkJCSAgU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtpXSA9PSAwPyJMZWFybmVkIjoiQ29ycmVjdGVkIiwKKwkJCQkgIGksIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gLSAxKTsKKyNlbmRpZgorCQkJU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtpXSA9IGh0b25sKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gLSAxKTsKKwkJCWlmIChpID49IFNUcC0+ZmlsZW1hcmtfY250KQorCQkJCSBTVHAtPmZpbGVtYXJrX2NudCA9IGkrMTsKKwkJfQorCX0KKwlpZiAoYXV4LT5mcmFtZV90eXBlID09IE9TX0ZSQU1FX1RZUEVfRU9EKSB7CisJCVNUcHMtPmVvZiA9IFNUX0VPRF8xOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDE7CisJfQorCWlmIChhdXgtPmZyYW1lX3R5cGUgPT0gT1NfRlJBTUVfVFlQRV9EQVRBKSB7CisgICAgICAgICAgICAgICAgYmxrX2NudCA9IG50b2hzKGF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19jbnQpOworCQlibGtfc3ogID0gbnRvaGwoYXV4LT5kYXQuZGF0X2xpc3RbMF0uYmxrX3N6KTsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IGJsa19jbnQgKiBibGtfc3o7CisJCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPSAwOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDE7CisKKwkJLyogU2VlIHdoYXQgYmxvY2sgc2l6ZSB3YXMgdXNlZCB0byB3cml0ZSBmaWxlICovCisJCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gYmxrX3N6ICYmIGJsa19zeiA+IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkgICAgCSIlczpJOiBGaWxlIHdhcyB3cml0dGVuIHdpdGggYmxvY2sgc2l6ZSAlZCVjLCBjdXJyZW50bHkgJWQlYywgYWRqdXN0ZWQgdG8gbWF0Y2guXG4iLAorICAgICAgIAkJCQluYW1lLCBibGtfc3o8MTAyND9ibGtfc3o6YmxrX3N6LzEwMjQsYmxrX3N6PDEwMjQ/J2InOidrJywKKwkJCQlTVHAtPmJsb2NrX3NpemU8MTAyND9TVHAtPmJsb2NrX3NpemU6U1RwLT5ibG9ja19zaXplLzEwMjQsCisJCQkJU1RwLT5ibG9ja19zaXplPDEwMjQ/J2InOidrJyk7CisJCQlTVHAtPmJsb2NrX3NpemUgICAgICAgICAgICA9IGJsa19zejsKKwkJCVNUcC0+YnVmZmVyLT5idWZmZXJfYmxvY2tzID0gT1NfREFUQV9TSVpFIC8gYmxrX3N6OworCQl9CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCX0KKyAgICAgICAgU1RwLT5mcmFtZV9zZXFfbnVtYmVyID0gbnRvaGwoYXV4LT5mcmFtZV9zZXFfbnVtKTsKKwlTVHAtPmxvZ2ljYWxfYmxrX251bSAgPSBudG9obChhdXgtPmxvZ2ljYWxfYmxrX251bSk7CisJcmV0dXJuIDE7CisKK2Vycl9vdXQ6CisJaWYgKFNUcC0+cmVhZF9lcnJvcl9mcmFtZSA9PSAwKQorCQlTVHAtPnJlYWRfZXJyb3JfZnJhbWUgPSBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uIC0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSB1bml0IHRvIGJlY29tZSBSZWFkeQorICovCitzdGF0aWMgaW50IG9zc3Rfd2FpdF9yZWFkeShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwKKwkJCQkgdW5zaWduZWQgdGltZW91dCwgaW50IGluaXRpYWxfZGVsYXkpCit7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50OworCXVuc2lnbmVkIGxvbmcJCXN0YXJ0d2FpdCA9IGppZmZpZXM7CisjaWYgREVCVUcKKwlpbnQJCQlkYmcgID0gZGVidWdnaW5nOworCWNoYXIgICAgCSAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hlZCBvbnN0cmVhbSB3YWl0IHJlYWR5XG4iLCBuYW1lKTsKKyNlbmRpZgorCisJaWYgKGluaXRpYWxfZGVsYXkgPiAwKQorCQltc2xlZXAoamlmZmllc190b19tc2Vjcyhpbml0aWFsX2RlbGF5KSk7CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaSgqYVNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCSphU1JwbnQgPSBTUnBudDsKKwlpZiAoIVNScG50KSByZXR1cm4gKC1FQlVTWSk7CisKKwl3aGlsZSAoIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBzdGFydHdhaXQgKyB0aW1lb3V0KkhaKSAmJgorCSAgICAgICAoKCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICA9PSAyICYmIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDQgICAgJiYKKwkJIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAxIHx8IFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdID09IDgpICAgICkgfHwKKwkJKCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICA9PSA2ICYmIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDB4MjggJiYKKwkJICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICkpIHsKKyNpZiBERUJVRworCSAgICBpZiAoZGVidWdnaW5nKSB7CisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNsZWVwaW5nIGluIG9uc3RyZWFtIHdhaXQgcmVhZHlcbiIsIG5hbWUpOworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBUdXJuaW5nIG9mZiBkZWJ1Z2dpbmcgZm9yIGEgd2hpbGVcbiIsIG5hbWUpOworCQlkZWJ1Z2dpbmcgPSAwOworCSAgICB9CisjZW5kaWYKKwkgICAgbXNsZWVwKDEwMCk7CisKKwkgICAgbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJICAgIGNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCSAgICBTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwl9CisJKmFTUnBudCA9IFNScG50OworI2lmIERFQlVHCisJZGVidWdnaW5nID0gZGJnOworI2VuZGlmCisJaWYgKCBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgJiYKKwkgICAgIG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3ZlcnkoU1RwLCBhU1JwbnQsIDApICkgeworI2lmIERFQlVHCisJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFibm9ybWFsIGV4aXQgZnJvbSBvbnN0cmVhbSB3YWl0IHJlYWR5XG4iLCBuYW1lKTsKKwkgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVzdWx0ID0gJWQsIFNlbnNlOiAwPSUwMngsIDI9JTAyeCwgMTI9JTAyeCwgMTM9JTAyeFxuIiwgbmFtZSwKKwkJCVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSwKKwkJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSk7CisjZW5kaWYKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBOb3JtYWwgZXhpdCBmcm9tIG9uc3RyZWFtIHdhaXQgcmVhZHlcbiIsIG5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIHRhcGUgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIHVuaXQKKyAqLworc3RhdGljIGludCBvc3N0X3dhaXRfZm9yX21lZGl1bShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgdW5zaWduZWQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBjaGFyCQljbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQ7CisJdW5zaWduZWQgbG9uZwkJc3RhcnR3YWl0ID0gamlmZmllczsKKyNpZiBERUJVRworCWludAkJCWRiZyA9IGRlYnVnZ2luZzsKKwljaGFyICAgIAkgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgb25zdHJlYW0gd2FpdCBmb3IgbWVkaXVtXG4iLCBuYW1lKTsKKyNlbmRpZgorCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisJaWYgKCFTUnBudCkgcmV0dXJuICgtRUJVU1kpOworCisJd2hpbGUgKCBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgJiYgdGltZV9iZWZvcmUoamlmZmllcywgc3RhcnR3YWl0ICsgdGltZW91dCpIWikgJiYKKwkJU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAgPT0gMiAmJiBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSAweDNhICAgICAgICYmCisJICAgICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisjaWYgREVCVUcKKwkgICAgaWYgKGRlYnVnZ2luZykgeworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTbGVlcGluZyBpbiBvbnN0cmVhbSB3YWl0IG1lZGl1bVxuIiwgbmFtZSk7CisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFR1cm5pbmcgb2ZmIGRlYnVnZ2luZyBmb3IgYSB3aGlsZVxuIiwgbmFtZSk7CisJCWRlYnVnZ2luZyA9IDA7CisJICAgIH0KKyNlbmRpZgorCSAgICBtc2xlZXAoMTAwKTsKKworCSAgICBtZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkgICAgY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJICAgIFNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCX0KKwkqYVNScG50ID0gU1JwbnQ7CisjaWYgREVCVUcKKwlkZWJ1Z2dpbmcgPSBkYmc7CisjZW5kaWYKKwlpZiAoIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCAgICAgJiYgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAgIT0gMiAmJgorCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gIT0gNCAmJiBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAxKSB7CisjaWYgREVCVUcKKwkgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQWJub3JtYWwgZXhpdCBmcm9tIG9uc3RyZWFtIHdhaXQgbWVkaXVtXG4iLCBuYW1lKTsKKwkgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVzdWx0ID0gJWQsIFNlbnNlOiAwPSUwMngsIDI9JTAyeCwgMTI9JTAyeCwgMTM9JTAyeFxuIiwgbmFtZSwKKwkJCVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSwKKwkJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSk7CisjZW5kaWYKKwkgICAgcmV0dXJuIDA7CisJfQorI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTm9ybWFsIGV4aXQgZnJvbSBvbnN0cmVhbSB3YWl0IG1lZGl1bVxuIiwgbmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBmcmFtZSkKK3sKKwlpbnQJcmV0dmFsOworCisJb3NzdF93YWl0X3JlYWR5KFNUcCwgYVNScG50LCAxNSAqIDYwLCAwKTsJCQkvKiBUT0RPIC0gY2FuIHRoaXMgY2F0Y2ggYSB3cml0ZSBlcnJvcj8gKi8KKwlyZXR2YWwgPSBvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgZnJhbWUsIDApOworCWlmIChyZXR2YWwpIHJldHVybiAocmV0dmFsKTsKKwlvc3N0X3dhaXRfcmVhZHkoU1RwLCBhU1JwbnQsIDE1ICogNjAsIE9TU1RfV0FJVF9QT1NJVElPTl9DT01QTEVURSk7CisJcmV0dXJuIChvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCkpOworfQorCisvKgorICogV2FpdCBmb3Igd3JpdGUocykgdG8gY29tcGxldGUKKyAqLworc3RhdGljIGludCBvc3N0X2ZsdXNoX2RyaXZlX2J1ZmZlcihzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwl1bnNpZ25lZCBjaGFyCQljbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQ7CisJaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQJCQlkZWxheSAgPSBPU1NUX1dBSVRfV1JJVEVfQ09NUExFVEU7CisjaWYgREVCVUcKKwljaGFyCQkgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgb25zdHJlYW0gZmx1c2ggZHJpdmUgYnVmZmVyICh3cml0ZSBmaWxlbWFyaylcbiIsIG5hbWUpOworI2VuZGlmCisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBXUklURV9GSUxFTUFSS1M7CisJY21kWzFdID0gMTsKKworCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJKmFTUnBudCA9IFNScG50OworCWlmICghU1JwbnQpIHJldHVybiAoLUVCVVNZKTsKKwlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0KSB7CisJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IDIgJiYgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gPT0gNCkgeworCQkJaWYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdID09IDgpIHsKKwkJCQlkZWxheSA9IE9TU1RfV0FJVF9MT05HX1dSSVRFX0NPTVBMRVRFOworCQkJfQorCQl9IGVsc2UKKwkJCXJlc3VsdCA9IG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3ZlcnkoU1RwLCBhU1JwbnQsIDApOworCX0KKwlyZXN1bHQgfD0gb3NzdF93YWl0X3JlYWR5KFNUcCwgYVNScG50LCA1ICogNjAsIGRlbGF5KTsKKwlTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyA9IE9TX1dSSVRJTkdfQ09NUExFVEU7CisKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKyNkZWZpbmUgT1NTVF9QT0xMX1BFUl9TRUMgMTAKK3N0YXRpYyBpbnQgb3NzdF93YWl0X2ZyYW1lKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgY3VyciwgaW50IG1pbmxhc3QsIGludCB0bykKK3sKKwl1bnNpZ25lZCBsb25nCXN0YXJ0d2FpdCA9IGppZmZpZXM7CisJY2hhcgkgICAgICAqIG5hbWUgICAgICA9IHRhcGVfbmFtZShTVHApOworI2lmIERFQlVHCisJY2hhcgkgICBub3R5ZXRwcmludGVkICA9IDE7CisjZW5kaWYKKwlpZiAobWlubGFzdCA+PSAwICYmIFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dLnJ3ICE9IFNUX1JFQURJTkcpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6QTogV2FpdGluZyBmb3IgZnJhbWUgd2l0aG91dCBoYXZpbmcgaW5pdGlhbGl6ZWQgcmVhZCFcbiIsIG5hbWUpOworCisJd2hpbGUgKHRpbWVfYmVmb3JlIChqaWZmaWVzLCBzdGFydHdhaXQgKyB0bypIWikpCisJeyAKKwkJaW50IHJlc3VsdDsKKwkJcmVzdWx0ID0gb3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQpOworCQlpZiAocmVzdWx0ID09IC1FSU8pCisJCQlpZiAoKHJlc3VsdCA9IG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3ZlcnkoU1RwLCBhU1JwbnQsIDApKSA9PSAwKQorCQkJCXJldHVybiAwOwkvKiBzdWNjZXNzZnVsIHJlY292ZXJ5IGxlYXZlcyBkcml2ZSByZWFkeSBmb3IgZnJhbWUgKi8KKwkJaWYgKHJlc3VsdCA8IDApIGJyZWFrOworCQlpZiAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9PSBjdXJyICYmCisJCSAgICAoKG1pbmxhc3QgPCAwICYmCisJCSAgICAgIChzaWduZWQpU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uID4gKHNpZ25lZCljdXJyICsgbWlubGFzdCkgfHwKKwkJICAgICAobWlubGFzdCA+PSAwICYmIFNUcC0+Y3VyX2ZyYW1lcyA+IG1pbmxhc3QpCisJCSAgICApICYmIHJlc3VsdCA+PSAwKQorCQl7CisjaWYgREVCVUcJCQkKKwkJCWlmIChkZWJ1Z2dpbmcgfHwgamlmZmllcyAtIHN0YXJ0d2FpdCA+PSAyKkhaL09TU1RfUE9MTF9QRVJfU0VDKQorCQkJCXByaW50ayAoT1NTVF9ERUJfTVNHCisJCQkJCSIlczpEOiBTdWNjIHdhaXQgZiBmciAlaSAoPiVpKTogJWktJWkgJWkgKCVpKTogJTNsaS4lbGkgc1xuIiwKKwkJCQkJbmFtZSwgY3VyciwgY3VycittaW5sYXN0LCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLAorCQkJCQlTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+Y3VyX2ZyYW1lcywKKwkJCQkJcmVzdWx0LCAoamlmZmllcy1zdGFydHdhaXQpL0haLCAKKwkJCQkJKCgoamlmZmllcy1zdGFydHdhaXQpJUhaKSoxMCkvSFopOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorI2lmIERFQlVHCisJCWlmIChqaWZmaWVzIC0gc3RhcnR3YWl0ID49IDIqSFovT1NTVF9QT0xMX1BFUl9TRUMgJiYgbm90eWV0cHJpbnRlZCkKKwkJeworCQkJcHJpbnRrIChPU1NUX0RFQl9NU0cgIiVzOkQ6IFdhaXQgZm9yIGZyYW1lICVpICg+JWkpOiAlaS0laSAlaSAoJWkpXG4iLAorCQkJCW5hbWUsIGN1cnIsIGN1cnIrbWlubGFzdCwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwKKwkJCQlTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+Y3VyX2ZyYW1lcywgcmVzdWx0KTsKKwkJCW5vdHlldHByaW50ZWQtLTsKKwkJfQorI2VuZGlmCisJCW1zbGVlcCgxMDAwIC8gT1NTVF9QT0xMX1BFUl9TRUMpOworCX0KKyNpZiBERUJVRworCXByaW50ayAoT1NTVF9ERUJfTVNHICIlczpEOiBGYWlsIHdhaXQgZiBmciAlaSAoPiVpKTogJWktJWkgJWk6ICUzbGkuJWxpIHNcbiIsCisJCW5hbWUsIGN1cnIsIGN1cnIrbWlubGFzdCwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwKKwkJU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmN1cl9mcmFtZXMsCisJCShqaWZmaWVzLXN0YXJ0d2FpdCkvSFosICgoKGppZmZpZXMtc3RhcnR3YWl0KSVIWikqMTApL0haKTsKKyNlbmRpZgkKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IG9zc3RfcmVjb3Zlcl93YWl0X2ZyYW1lKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgd3JpdGluZykKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwl1bnNpZ25lZCBjaGFyCQljbWRbTUFYX0NPTU1BTkRfU0laRV07CisJdW5zaWduZWQgbG9uZyAgIAlzdGFydHdhaXQgPSBqaWZmaWVzOworCWludAkJCXJldHZhbCAgICA9IDE7CisgICAgICAgIGNoYXIJCSAgICAgICogbmFtZSAgICAgID0gdGFwZV9uYW1lKFNUcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmICh3cml0aW5nKSB7CisJCWNoYXIJbXlidWZbMjRdOworCQljaGFyICAqIG9sZGRhdGEgPSBTVHAtPmJ1ZmZlci0+Yl9kYXRhOworCQlpbnQJb2xkc2l6ZSA9IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZTsKKworCQkvKiB3cml0ZSB6ZXJvIGZtIHRoZW4gcmVhZCBwb3MgLSBpZiBzaG93cyB3cml0ZSBlcnJvciwgdHJ5IHRvIHJlY292ZXIgLSBpZiBubyBwcm9ncmVzcywgd2FpdCAqLworCisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBXUklURV9GSUxFTUFSS1M7CisJCWNtZFsxXSA9IDE7CisJCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwgU1RwLT50aW1lb3V0LAorCQkJCQkJCQlNQVhfUkVUUklFUywgMSk7CisKKwkJd2hpbGUgKHJldHZhbCAmJiB0aW1lX2JlZm9yZSAoamlmZmllcywgc3RhcnR3YWl0ICsgNSo2MCpIWikpIHsKKworCQkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCAmJiAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpICE9IDIpIHsKKworCQkJCS8qIHNvbWUgZmFpbHVyZSAtIG5vdCBqdXN0IG5vdC1yZWFkeSAqLworCQkJCXJldHZhbCA9IG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3ZlcnkoU1RwLCBhU1JwbnQsIDApOworCQkJCWJyZWFrOworCQkJfQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQgKEhaIC8gT1NTVF9QT0xMX1BFUl9TRUMpOworCisJCQlTVHAtPmJ1ZmZlci0+Yl9kYXRhID0gbXlidWY7IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZSA9IDI0OworCQkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCQljbWRbMF0gPSBSRUFEX1BPU0lUSU9OOworCisJCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDIwLCBETUFfRlJPTV9ERVZJQ0UsIFNUcC0+dGltZW91dCwKKwkJCQkJCQkJCQlNQVhfUkVUUklFUywgMSk7CisKKwkJCXJldHZhbCA9ICggU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0IHx8IChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxNV0gPiAyNSApOworCQkJU1RwLT5idWZmZXItPmJfZGF0YSA9IG9sZGRhdGE7IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZSA9IG9sZHNpemU7CisJCX0KKwkJaWYgKHJldHZhbCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogRGV2aWNlIGRpZCBub3Qgc3VjY2VlZCB0byB3cml0ZSBidWZmZXJlZCBkYXRhXG4iLCBuYW1lKTsKKwl9IGVsc2UKKwkJLyogVE9ETyAtIGZpZ3VyZSBvdXQgd2hpY2ggZXJyb3IgY29uZGl0aW9ucyBjYW4gYmUgaGFuZGxlZCAqLworCQlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSIlczpXOiBSZWNvdmVyX3dhaXRfZnJhbWUocmVhZCkgY2Fubm90IGhhbmRsZSAlMDJ4OiUwMng6JTAyeFxuIiwgbmFtZSwKKwkJCQkJKCphU1JwbnQpLT5zcl9zZW5zZV9idWZmZXJbIDJdICYgMHgwZiwKKwkJCQkJKCphU1JwbnQpLT5zcl9zZW5zZV9idWZmZXJbMTJdLAorCQkJCQkoKmFTUnBudCktPnNyX3NlbnNlX2J1ZmZlclsxM10pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgT25TdHJlYW0gdGFwZSBmcmFtZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgorICovCitzdGF0aWMgaW50IG9zc3RfcmVhZF9mcmFtZShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHRpbWVvdXQpCit7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50OworCWludAkJCXJldHZhbCA9IDA7CisjaWYgREVCVUcKKwlvc19hdXhfdAkgICAgICAqIGF1eCAgICA9IFNUcC0+YnVmZmVyLT5hdXg7CisJY2hhcgkJICAgICAgKiBuYW1lICAgPSB0YXBlX25hbWUoU1RwKTsKKyNlbmRpZgorCisJaWYgKFNUcC0+cG9sbCkKKwkJaWYgKG9zc3Rfd2FpdF9mcmFtZSAoU1RwLCBhU1JwbnQsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIDAsIHRpbWVvdXQpKQorCQkJcmV0dmFsID0gb3NzdF9yZWNvdmVyX3dhaXRfZnJhbWUoU1RwLCBhU1JwbnQsIDApOworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gUkVBRF82OworCWNtZFsxXSA9IDE7CisJY21kWzRdID0gMTsKKworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhZGluZyBmcmFtZSBmcm9tIE9uU3RyZWFtIHRhcGVcbiIsIG5hbWUpOworI2VuZGlmCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBjbWQsIE9TX0ZSQU1FX1NJWkUsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkgICAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisJaWYgKCFTUnBudCkKKwkJcmV0dXJuICgtRUJVU1kpOworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0KSB7CisJICAgIHJldHZhbCA9IDE7CisJICAgIGlmIChTVHAtPnJlYWRfZXJyb3JfZnJhbWUgPT0gMCkgeworCQlTVHAtPnJlYWRfZXJyb3JfZnJhbWUgPSBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uOworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlY29yZGluZyByZWFkIGVycm9yIGF0ICVkXG4iLCBuYW1lLCBTVHAtPnJlYWRfZXJyb3JfZnJhbWUpOworI2VuZGlmCisJICAgIH0KKyNpZiBERUJVRworCSAgICBpZiAoZGVidWdnaW5nKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTZW5zZTogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeFxuIiwKKwkJICAgbmFtZSwKKwkJICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxXSwKKwkJICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclszXSwKKwkJICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls0XSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls1XSwKKwkJICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls2XSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls3XSk7CisjZW5kaWYKKwl9CisJZWxzZQorCSAgICBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uKys7CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKSB7CisJICAgY2hhciBzaWdbOF07IGludCBpOworCSAgIGZvciAoaT0wO2k8NDtpKyspCisJCSAgIHNpZ1tpXSA9IGF1eC0+YXBwbGljYXRpb25fc2lnW2ldPDMyPydeJzphdXgtPmFwcGxpY2F0aW9uX3NpZ1tpXTsKKwkgICBzaWdbNF0gPSAnXDAnOworCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgCisJCSIlczpEOiBBVVg6ICVzIFVwZEZyQ3QjJWQgV3Bhc3MjJWQgJXMgRnJTZXEjJWQgTG9nQmxrIyVkIFF0eT0lZCBTej0lZFxuIiwgbmFtZSwgc2lnLAorCQkJbnRvaGwoYXV4LT51cGRhdGVfZnJhbWVfY250ciksIG50b2hzKGF1eC0+cGFydGl0aW9uLndydF9wYXNzX2NudHIpLAorCQkJYXV4LT5mcmFtZV90eXBlPT0xPyJFT0QiOmF1eC0+ZnJhbWVfdHlwZT09Mj8iTUFSSyI6CisJCQlhdXgtPmZyYW1lX3R5cGU9PTg/IkhFQURSIjphdXgtPmZyYW1lX3R5cGU9PTB4ODA/IkRBVEEiOiJGSUxMIiwgCisJCQludG9obChhdXgtPmZyYW1lX3NlcV9udW0pLCBudG9obChhdXgtPmxvZ2ljYWxfYmxrX251bSksCisJCQludG9ocyhhdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KSwgbnRvaGwoYXV4LT5kYXQuZGF0X2xpc3RbMF0uYmxrX3N6KSApOworCSAgIGlmIChhdXgtPmZyYW1lX3R5cGU9PTIpCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IG1hcmtfY250PSVkLCBsYXN0X21hcmtfcHBvcz0lZCwgbGFzdF9tYXJrX2xibj0lZFxuIiwgbmFtZSwKKwkJCW50b2hsKGF1eC0+ZmlsZW1hcmtfY250KSwgbnRvaGwoYXV4LT5sYXN0X21hcmtfcHBvcyksIG50b2hsKGF1eC0+bGFzdF9tYXJrX2xibikpOworCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEV4aXQgcmVhZCBmcmFtZSBmcm9tIE9uU3RyZWFtIHRhcGUgd2l0aCBjb2RlICVkXG4iLCBuYW1lLCByZXR2YWwpOworCX0KKyNlbmRpZgorCXJldHVybiAocmV0dmFsKTsKK30KKworc3RhdGljIGludCBvc3N0X2luaXRpYXRlX3JlYWQoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJc3RydWN0IHN0X3BhcnRzdGF0ICAgICogU1RwcyAgID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICogU1JwbnQgIDsKKwl1bnNpZ25lZCBjaGFyCQljbWRbTUFYX0NPTU1BTkRfU0laRV07CisJaW50CQkJcmV0dmFsID0gMDsKKwljaGFyCQkgICAgICAqIG5hbWUgICA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKFNUcHMtPnJ3ICE9IFNUX1JFQURJTkcpIHsgICAgICAgICAvKiBJbml0aWFsaXplIHJlYWQgb3BlcmF0aW9uICovCisJCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HIHx8IFNUcC0+ZGlydHkpIHsKKwkJCVNUcC0+d3JpdGVfdHlwZSA9IE9TX1dSSVRFX0RBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICBvc3N0X2ZsdXNoX3dyaXRlX2J1ZmZlcihTVHAsIGFTUnBudCk7CisJCQlvc3N0X2ZsdXNoX2RyaXZlX2J1ZmZlcihTVHAsIGFTUnBudCk7CisJCX0KKwkJU1Rwcy0+cncgPSBTVF9SRUFESU5HOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisKKwkJLyoKKwkJICogICAgICBJc3N1ZSBhIHJlYWQgMCBjb21tYW5kIHRvIGdldCB0aGUgT25TdHJlYW0gZHJpdmUKKyAgICAgICAgICAgICAgICAgKiAgICAgIHJlYWQgZnJhbWVzIGludG8gaXRzIGJ1ZmZlci4KKwkJICovCisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBSRUFEXzY7CisJCWNtZFsxXSA9IDE7CisKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTdGFydCBSZWFkIEFoZWFkIG9uIE9uU3RyZWFtIHRhcGVcbiIsIG5hbWUpOworI2VuZGlmCisJCVNScG50ICAgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkJKmFTUnBudCA9IFNScG50OworCQlpZiAoKHJldHZhbCA9IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFcnJvciBzdGFydGluZyByZWFkIGFoZWFkXG4iLCBuYW1lKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkJCQlpbnQgZnJhbWVfc2VxX251bWJlciwgaW50IHF1aWV0KQoreworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqIFNUcHMgID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJY2hhcgkJICAgKiBuYW1lICA9IHRhcGVfbmFtZShTVHApOworCWludAkJICAgICBjbnQgICA9IDAsCisJCQkgICAgIGJhZCAgID0gMCwKKwkJCSAgICAgcGFzdCAgPSAwLAorCQkJICAgICB4LAorCQkJICAgICBwb3NpdGlvbjsKKworCS8qCisJICogSWYgd2Ugd2FudCBqdXN0IGFueSBmcmFtZSAoLTEpIGFuZCB0aGVyZSBpcyBhIGZyYW1lIGluIHRoZSBidWZmZXIsIHJldHVybiBpdAorCSAqLworCWlmIChmcmFtZV9zZXFfbnVtYmVyID09IC0xICYmIFNUcC0+ZnJhbWVfaW5fYnVmZmVyKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRnJhbWUgJWQgc3RpbGwgaW4gYnVmZmVyXG4iLCBuYW1lLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIpOworI2VuZGlmCisJCXJldHVybiAoU1Rwcy0+ZW9mKTsKKwl9CisJLyoKKyAgICAgICAgICogU2VhcmNoIGFuZCB3YWl0IGZvciB0aGUgbmV4dCBsb2dpY2FsIHRhcGUgZnJhbWUKKwkgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoY250KysgPiA0MDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6RTogQ291bGRuJ3QgZmluZCBsb2dpY2FsIGZyYW1lICVkLCBhYm9ydGluZ1xuIiwKKwkJCQkJICAgIG5hbWUsIGZyYW1lX3NlcV9udW1iZXIpOworCQkJaWYgKFNUcC0+cmVhZF9lcnJvcl9mcmFtZSkgeworCQkJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBTVHAtPnJlYWRfZXJyb3JfZnJhbWUsIDApOworI2lmIERFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVwb3NpdGlvbmluZyB0YXBlIHRvIGJhZCBmcmFtZSAlZFxuIiwKKwkJCQkJCSAgICBuYW1lLCBTVHAtPnJlYWRfZXJyb3JfZnJhbWUpOworI2VuZGlmCisJCQkJU1RwLT5yZWFkX2Vycm9yX2ZyYW1lID0gMDsKKwkJCQlTVHAtPmFib3J0X2NvdW50Kys7CisJCQl9CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IExvb2tpbmcgZm9yIGZyYW1lICVkLCBhdHRlbXB0ICVkXG4iLAorCQkJCQkgIG5hbWUsIGZyYW1lX3NlcV9udW1iZXIsIGNudCk7CisjZW5kaWYKKwkJaWYgKCBvc3N0X2luaXRpYXRlX3JlYWQoU1RwLCBhU1JwbnQpCisgICAgICAgICAgICAgICAgfHwgKCAoIVNUcC0+ZnJhbWVfaW5fYnVmZmVyKSAmJiBvc3N0X3JlYWRfZnJhbWUoU1RwLCBhU1JwbnQsIDMwKSApICkgeworCQkJaWYgKFNUcC0+cmF3KQorCQkJCXJldHVybiAoLUVJTyk7CisJCQlwb3NpdGlvbiA9IG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKwkJCWlmIChwb3NpdGlvbiA+PSAweGJhZSAmJiBwb3NpdGlvbiA8IDB4YmI4KQorCQkJCXBvc2l0aW9uID0gMHhiYjg7CisJCQllbHNlIGlmIChwb3NpdGlvbiA+IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MgfHwgKytiYWQgPT0gMTApIHsKKwkJCQlwb3NpdGlvbiA9IFNUcC0+cmVhZF9lcnJvcl9mcmFtZSAtIDE7CisJCQkJYmFkID0gMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBvc2l0aW9uICs9IDI5OworCQkJCWNudCAgICAgICs9IDE5OworCQkJfQorI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBCYWQgZnJhbWUgZGV0ZWN0ZWQsIHBvc2l0aW9uaW5nIHRhcGUgdG8gYmxvY2sgJWRcbiIsCisJCQkJCSBuYW1lLCBwb3NpdGlvbik7CisjZW5kaWYKKwkJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBwb3NpdGlvbiwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob3NzdF92ZXJpZnlfZnJhbWUoU1RwLCBmcmFtZV9zZXFfbnVtYmVyLCBxdWlldCkpCisJCQlicmVhazsKKwkJaWYgKG9zc3RfdmVyaWZ5X2ZyYW1lKFNUcCwgLTEsIHF1aWV0KSkgeworCQkJeCA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3NlcV9udW0pOworCQkJaWYgKFNUcC0+ZmFzdF9vcGVuKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiJXM6VzogRm91bmQgbG9naWNhbCBmcmFtZSAlZCBpbnN0ZWFkIG9mICVkIGFmdGVyIGZhc3Qgb3BlblxuIiwKKwkJCQkgICAgICAgbmFtZSwgeCwgZnJhbWVfc2VxX251bWJlcik7CisJCQkJU1RwLT5oZWFkZXJfb2sgPSAwOworCQkJCVNUcC0+cmVhZF9lcnJvcl9mcmFtZSA9IDA7CisJCQkJcmV0dXJuICgtRUlPKTsKKwkJCX0KKwkJCWlmICh4ID4gZnJhbWVfc2VxX251bWJlcikgeworCQkJCWlmICgrK3Bhc3QgPiAzKSB7CisJCQkJCS8qIHBvc2l0aW9uaW5nIGJhY2t3YXJkcyBkaWQgbm90IGJyaW5nIHVzIHRvIHRoZSBkZXNpcmVkIGZyYW1lICovCisJCQkJCXBvc2l0aW9uID0gU1RwLT5yZWFkX2Vycm9yX2ZyYW1lIC0gMTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkgICAgICAgIAlwb3NpdGlvbiA9IG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KQorCQkJCQkgICAgICAgICArIGZyYW1lX3NlcV9udW1iZXIgLSB4IC0gMTsKKworCQkJCQlpZiAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA+PSAzMDAwICYmIHBvc2l0aW9uIDwgMzAwMCkKKwkJCQkJCXBvc2l0aW9uIC09IDEwOworCQkJCX0KKyNpZiBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoT1NTVF9ERUJfTVNHCisJCQkJICAgICAgICIlczpEOiBGb3VuZCBsb2dpY2FsIGZyYW1lICVkIHdoaWxlIGxvb2tpbmcgZm9yICVkOiBiYWNrIHVwICVkXG4iLAorCQkJCQkJbmFtZSwgeCwgZnJhbWVfc2VxX251bWJlciwKKwkJCQkJICAgICAgIAlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uIC0gcG9zaXRpb24pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIHBvc2l0aW9uLCAwKTsKKwkJCQljbnQgKz0gMTA7CisJCQl9CisJCQllbHNlCisJCQkJcGFzdCA9IDA7CisJCX0KKwkJaWYgKG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KSA9PSAweGJhZikgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBjb25maWcgcGFydGl0aW9uXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIDB4YmI4LCAwKTsKKwkJCWNudC0tOworCQl9CisJCVNUcC0+ZnJhbWVfaW5fYnVmZmVyID0gMDsKKwl9CisJaWYgKGNudCA+IDEpIHsKKwkJU1RwLT5yZWNvdmVyX2NvdW50Kys7CisJCVNUcC0+cmVjb3Zlcl9lcnJlZysrOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpJOiBEb24ndCB3b3JyeSwgUmVhZCBlcnJvciBhdCBwb3NpdGlvbiAlZCByZWNvdmVyZWRcbiIsIAorCQkJCQluYW1lLCBTVHAtPnJlYWRfZXJyb3JfZnJhbWUpOworIAl9CisJU1RwLT5yZWFkX2NvdW50Kys7CisKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcgfHwgU1Rwcy0+ZW9mKQorCQlwcmludGsoT1NTVF9ERUJfTVNHCisJCQkiJXM6RDogRXhpdCBnZXQgbG9naWNhbCBmcmFtZSAoJWQ9PiVkKSBmcm9tIE9uU3RyZWFtIHRhcGUgd2l0aCBjb2RlICVkXG4iLAorCQkJbmFtZSwgZnJhbWVfc2VxX251bWJlciwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCBTVHBzLT5lb2YpOworI2VuZGlmCisJU1RwLT5mYXN0X29wZW4gPSAwOworCVNUcC0+cmVhZF9lcnJvcl9mcmFtZSA9IDA7CisJcmV0dXJuIChTVHBzLT5lb2YpOworfQorCitzdGF0aWMgaW50IG9zc3Rfc2Vla19sb2dpY2FsX2JsayhzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IGxvZ2ljYWxfYmxrX251bSkKK3sKKyAgICAgICAgc3RydWN0IHN0X3BhcnRzdGF0ICogU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWNoYXIJCSAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCWludAlyZXRyaWVzICAgID0gMDsKKwlpbnQJZnJhbWVfc2VxX2VzdGltYXRlLCBwcG9zX2VzdGltYXRlLCBtb3ZlOworCQorCWlmIChsb2dpY2FsX2Jsa19udW0gPCAwKSBsb2dpY2FsX2Jsa19udW0gPSAwOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2Vla2luZyBsb2dpY2FsIGJsb2NrICVkIChub3cgYXQgJWQsIHNpemUgJWQlYylcbiIsCisJCQkJbmFtZSwgbG9naWNhbF9ibGtfbnVtLCBTVHAtPmxvZ2ljYWxfYmxrX251bSwgCisJCQkJU1RwLT5ibG9ja19zaXplPDEwMjQ/U1RwLT5ibG9ja19zaXplOlNUcC0+YmxvY2tfc2l6ZS8xMDI0LAorCQkJCVNUcC0+YmxvY2tfc2l6ZTwxMDI0PydiJzonaycpOworI2VuZGlmCisJLyogRG8gd2Uga25vdyB3aGVyZSB3ZSBhcmU/ICovCisJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKSB7CisJCW1vdmUgICAgICAgICAgICAgICAgPSBsb2dpY2FsX2Jsa19udW0gLSBTVHAtPmxvZ2ljYWxfYmxrX251bTsKKwkJaWYgKG1vdmUgPCAwKSBtb3ZlIC09IChPU19EQVRBX1NJWkUgLyBTVHAtPmJsb2NrX3NpemUpIC0gMTsKKwkJbW92ZSAgICAgICAgICAgICAgIC89IChPU19EQVRBX1NJWkUgLyBTVHAtPmJsb2NrX3NpemUpOworCQlmcmFtZV9zZXFfZXN0aW1hdGUgID0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyICsgbW92ZTsKKwl9IGVsc2UKKwkJZnJhbWVfc2VxX2VzdGltYXRlICA9IGxvZ2ljYWxfYmxrX251bSAqIFNUcC0+YmxvY2tfc2l6ZSAvIE9TX0RBVEFfU0laRTsKKworCWlmIChmcmFtZV9zZXFfZXN0aW1hdGUgPCAyOTgwKSBwcG9zX2VzdGltYXRlID0gZnJhbWVfc2VxX2VzdGltYXRlICsgMTA7CisJZWxzZQkJCSAgICAgICBwcG9zX2VzdGltYXRlID0gZnJhbWVfc2VxX2VzdGltYXRlICsgMjA7CisJd2hpbGUgKCsrcmV0cmllcyA8IDEwKSB7CisJICAgaWYgKHBwb3NfZXN0aW1hdGUgPiBTVHAtPmVvZF9mcmFtZV9wcG9zLTIpIHsKKwkgICAgICAgZnJhbWVfc2VxX2VzdGltYXRlICs9IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MgLSAyIC0gcHBvc19lc3RpbWF0ZTsKKwkgICAgICAgcHBvc19lc3RpbWF0ZSAgICAgICA9IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MgLSAyOworCSAgIH0KKwkgICBpZiAoZnJhbWVfc2VxX2VzdGltYXRlIDwgMCkgeworCSAgICAgICBmcmFtZV9zZXFfZXN0aW1hdGUgPSAwOworCSAgICAgICBwcG9zX2VzdGltYXRlICAgICAgPSAxMDsKKwkgICB9CisJICAgb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIHBwb3NfZXN0aW1hdGUsIDApOworCSAgIGlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCBmcmFtZV9zZXFfZXN0aW1hdGUsIDEpID49IDApIHsKKwkgICAgICAvKiB3ZSd2ZSBsb2NhdGVkIHRoZSBlc3RpbWF0ZWQgZnJhbWUsIG5vdyBkb2VzIGl0IGhhdmUgb3VyIGJsb2NrPyAqLworCSAgICAgIGlmIChsb2dpY2FsX2Jsa19udW0gPCAgU1RwLT5sb2dpY2FsX2Jsa19udW0gfHwKKwkgICAgICAgICAgbG9naWNhbF9ibGtfbnVtID49IFNUcC0+bG9naWNhbF9ibGtfbnVtICsgbnRvaHMoU1RwLT5idWZmZXItPmF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19jbnQpKSB7CisJCSBpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkKKwkJICAgIG1vdmUgPSBsb2dpY2FsX2Jsa19udW0gPCBTVHAtPmxvZ2ljYWxfYmxrX251bT8gLTIgOiAxOworCQkgZWxzZSB7CisJCSAgICBtb3ZlICAgICAgICAgICAgICAgID0gbG9naWNhbF9ibGtfbnVtIC0gU1RwLT5sb2dpY2FsX2Jsa19udW07CisJCSAgICBpZiAobW92ZSA8IDApIG1vdmUgLT0gKE9TX0RBVEFfU0laRSAvIFNUcC0+YmxvY2tfc2l6ZSkgLSAxOworCQkgICAgbW92ZSAgICAgICAgICAgICAgIC89IChPU19EQVRBX1NJWkUgLyBTVHAtPmJsb2NrX3NpemUpOworCQkgfQorCQkgaWYgKCFtb3ZlKSBtb3ZlID0gbG9naWNhbF9ibGtfbnVtID4gU1RwLT5sb2dpY2FsX2Jsa19udW0gPyAxIDogLTE7CisjaWYgREVCVUcKKwkJIHByaW50ayhPU1NUX0RFQl9NU0cKKwkJCSIlczpEOiBTZWVrIHJldHJ5ICVkIGF0IHBwb3MgJWQgZnNxICVkIChlc3QgJWQpIGxibiAlZCAobmVlZCAlZCkgbW92ZSAlZFxuIiwKKwkJCQluYW1lLCByZXRyaWVzLCBwcG9zX2VzdGltYXRlLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIGZyYW1lX3NlcV9lc3RpbWF0ZSwgCisJCQkJU1RwLT5sb2dpY2FsX2Jsa19udW0sIGxvZ2ljYWxfYmxrX251bSwgbW92ZSk7CisjZW5kaWYKKwkJIGZyYW1lX3NlcV9lc3RpbWF0ZSArPSBtb3ZlOworCQkgcHBvc19lc3RpbWF0ZSAgICAgICs9IG1vdmU7CisJCSBjb250aW51ZTsKKwkgICAgICB9IGVsc2UgeworCQkgU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciAgPSAobG9naWNhbF9ibGtfbnVtIC0gU1RwLT5sb2dpY2FsX2Jsa19udW0pICogU1RwLT5ibG9ja19zaXplOworCQkgU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyAtPSBTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyOworCQkgU1RwLT5sb2dpY2FsX2Jsa19udW0gICAgICAgPSAgbG9naWNhbF9ibGtfbnVtOworI2lmIERFQlVHCisJCSBwcmludGsoT1NTVF9ERUJfTVNHIAorCQkJIiVzOkQ6IFNlZWsgc3VjY2VzcyBhdCBwcG9zICVkIGZzcSAlZCBpbl9idWYgJWQsIGJ5dGVzICVkLCBwdHIgJWQqJWRcbiIsCisJCQkJbmFtZSwgcHBvc19lc3RpbWF0ZSwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCBTVHAtPmZyYW1lX2luX2J1ZmZlciwgCisJCQkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcywgU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciAvIFNUcC0+YmxvY2tfc2l6ZSwgCisJCQkJU1RwLT5ibG9ja19zaXplKTsKKyNlbmRpZgorCQkgU1Rwcy0+ZHJ2X2ZpbGUgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5maWxlbWFya19jbnQpOworCQkgaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJICAgICBTVHBzLT5kcnZfZmlsZSsrOworCQkgICAgIFNUcHMtPmRydl9ibG9jayA9IDA7CisJCSB9IGVsc2UgeworCQkgICAgIFNUcHMtPmRydl9ibG9jayA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19sYm4pPworCQkJCQkgIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0KKwkJCQkJICAgICAoU1Rwcy0+ZHJ2X2ZpbGUgPyBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfbGJuKSArIDEgOiAwKToKKwkJCQkJLTE7CisJCSB9CisJCSBTVHBzLT5lb2YgPSAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA+PSBTVHAtPmVvZF9mcmFtZV9wcG9zKT9TVF9FT0Q6U1RfTk9FT0Y7CisJCSByZXR1cm4gMDsKKwkgICAgICB9CisJICAgfQorCSAgIGlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMSkgPCAwKQorCSAgICAgIGdvdG8gZXJyb3I7CisJICAgLyogd2UgYXJlIG5vdCB5ZXQgYXQgdGhlIGVzdGltYXRlZCBmcmFtZSwgYWRqdXN0IG91ciBlc3RpbWF0ZSBvZiBpdHMgcGh5c2ljYWwgcG9zaXRpb24gKi8KKyNpZiBERUJVRworCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNlZWsgcmV0cnkgJWQgYXQgcHBvcyAlZCBmc3EgJWQgKGVzdCAlZCkgbGJuICVkIChuZWVkICVkKVxuIiwgCisJCQkgICBuYW1lLCByZXRyaWVzLCBwcG9zX2VzdGltYXRlLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIGZyYW1lX3NlcV9lc3RpbWF0ZSwgCisJCQkgICBTVHAtPmxvZ2ljYWxfYmxrX251bSwgbG9naWNhbF9ibGtfbnVtKTsKKyNlbmRpZgorCSAgIGlmIChmcmFtZV9zZXFfZXN0aW1hdGUgIT0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyKQorCSAgICAgIHBwb3NfZXN0aW1hdGUgKz0gZnJhbWVfc2VxX2VzdGltYXRlIC0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyOworCSAgIGVsc2UKKwkgICAgICBicmVhazsKKwl9CitlcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgIiVzOkU6IENvdWxkbid0IHNlZWsgdG8gbG9naWNhbCBibG9jayAlZCAoYXQgJWQpLCAlZCByZXRyaWVzXG4iLCAKKwkJCSAgICBuYW1lLCBsb2dpY2FsX2Jsa19udW0sIFNUcC0+bG9naWNhbF9ibGtfbnVtLCByZXRyaWVzKTsKKwlyZXR1cm4gKC1FSU8pOworfQorCisvKiBUaGUgdmFsdWVzIGJlbG93IGFyZSBiYXNlZCBvbiB0aGUgT25TdHJlYW0gZnJhbWUgcGF5bG9hZCBzaXplIG9mIDMySyA9PSAyKioxNSwKKyAqIHRoYXQgaXMsIE9TU1RfRlJBTUVfU0hJRlQgKyBPU1NUX1NFQ1RPUl9TSElGVCBtdXN0IGJlIDE1LiBXaXRoIGEgbWluaW11bSBibG9jaworICogc2l6ZSBvZiA1MTIgYnl0ZXMsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byByZXNvbHZlIDMySy81MTIgPT0gNjQgPT0gMioqNiBwb3NpdGlvbnMKKyAqIGluc2lkZSBlYWNoIGZyYW1lLiBGaW5hbHksIE9TU1RfU0VDVE9SX01BU0sgPT0gMioqT1NTVF9GUkFNRV9TSElGVCAtIDEuCisgKi8KKyNkZWZpbmUgT1NTVF9GUkFNRV9TSElGVCAgNgorI2RlZmluZSBPU1NUX1NFQ1RPUl9TSElGVCA5CisjZGVmaW5lIE9TU1RfU0VDVE9SX01BU0sgIDB4MDNGCisKK3N0YXRpYyBpbnQgb3NzdF9nZXRfc2VjdG9yKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCWludAlzZWN0b3I7CisjaWYgREVCVUcKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwkKKwlwcmludGsoT1NTVF9ERUJfTVNHIAorCQkiJXM6RDogUG9zaXRpb25lZCBhdCBwcG9zICVkLCBmcmFtZSAlZCwgbGJuICVkLCBmaWxlICVkLCBibGsgJWQsICVjcHRyICVkLCBlb2YgJWRcbiIsCisJCW5hbWUsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1RwLT5sb2dpY2FsX2Jsa19udW0sCisJCVNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dLmRydl9maWxlLCBTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5kcnZfYmxvY2ssIAorCQlTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyA9PSBTVF9XUklUSU5HPyd3JzoncicsCisJCVNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dLnJ3ID09IFNUX1dSSVRJTkc/U1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlczoKKwkJU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciwgU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0uZW9mKTsKKyNlbmRpZgorCS8qIGRvIHdlIGtub3cgd2hlcmUgd2UgYXJlIGluc2lkZSBhIGZpbGU/ICovCisJaWYgKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dLmRydl9ibG9jayA+PSAwKSB7CisJCXNlY3RvciA9IChTVHAtPmZyYW1lX2luX2J1ZmZlciA/IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24tMSA6CisJCQkJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbikgPDwgT1NTVF9GUkFNRV9TSElGVDsKKwkJaWYgKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dLnJ3ID09IFNUX1dSSVRJTkcpCisJCSAgICAgICAJc2VjdG9yIHw9IChTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID4+IE9TU1RfU0VDVE9SX1NISUZUKSAmIE9TU1RfU0VDVE9SX01BU0s7CisJCWVsc2UKKwkgICAgICAgCQlzZWN0b3IgfD0gKFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPj4gT1NTVF9TRUNUT1JfU0hJRlQpICYgT1NTVF9TRUNUT1JfTUFTSzsKKwl9IGVsc2UgeworCQlzZWN0b3IgPSBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisJCWlmIChzZWN0b3IgPiAwKQorCQkJc2VjdG9yIDw8PSBPU1NUX0ZSQU1FX1NISUZUOworCX0KKwlyZXR1cm4gc2VjdG9yOworfQorCitzdGF0aWMgaW50IG9zc3Rfc2Vla19zZWN0b3Ioc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBzZWN0b3IpCit7CisgICAgICAgIHN0cnVjdCBzdF9wYXJ0c3RhdCAqIFNUcHMgICA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWludAkJICAgICBmcmFtZSAgPSBzZWN0b3IgPj4gT1NTVF9GUkFNRV9TSElGVCwKKwkJCSAgICAgb2Zmc2V0ID0gKHNlY3RvciAmIE9TU1RfU0VDVE9SX01BU0spIDw8IE9TU1RfU0VDVE9SX1NISUZULCAKKwkJCSAgICAgcjsKKyNpZiBERUJVRworCWNoYXIgICAgICAgICAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTZWVraW5nIHNlY3RvciAlZCBpbiBmcmFtZSAlZCBhdCBvZmZzZXQgJWRcbiIsCisJCQkJbmFtZSwgc2VjdG9yLCBmcmFtZSwgb2Zmc2V0KTsKKyNlbmRpZgorCWlmIChmcmFtZSA8IDAgfHwgZnJhbWUgPj0gU1RwLT5jYXBhY2l0eSkgcmV0dXJuICgtRU5YSU8pOworCisJaWYgKGZyYW1lIDw9IFNUcC0+Zmlyc3RfZGF0YV9wcG9zKSB7CisJCVNUcC0+ZnJhbWVfc2VxX251bWJlciA9IFNUcC0+bG9naWNhbF9ibGtfbnVtID0gU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAwOworCQlyZXR1cm4gKG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBmcmFtZSwgMCkpOworCX0KKwlyID0gb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIG9mZnNldD9mcmFtZTpmcmFtZS0xLCAwKTsKKwlpZiAociA8IDApIHJldHVybiByOworCisJciA9IG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAxKTsKKwlpZiAociA8IDApIHJldHVybiByOworCisJaWYgKG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KSAhPSAob2Zmc2V0P2ZyYW1lKzE6ZnJhbWUpKSByZXR1cm4gKC1FSU8pOworCisJaWYgKG9mZnNldCkgeworCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAgICAgICs9IG9mZnNldCAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciAgPSBvZmZzZXQ7CisJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgLT0gb2Zmc2V0OworCX0gZWxzZSB7CisJCVNUcC0+ZnJhbWVfc2VxX251bWJlcisrOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciAgICAgICA9IDA7CisJCVNUcC0+bG9naWNhbF9ibGtfbnVtICAgICAgKz0gbnRvaHMoU1RwLT5idWZmZXItPmF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19jbnQpOworCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzICA9IFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPSAwOworCX0KKwlTVHBzLT5kcnZfZmlsZSA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZpbGVtYXJrX2NudCk7CisJaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwl9IGVsc2UgeworCQlTVHBzLT5kcnZfYmxvY2sgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfbGJuKT8KKwkJCQkgICAgU1RwLT5sb2dpY2FsX2Jsa19udW0gLQorCQkJCQkoU1Rwcy0+ZHJ2X2ZpbGUgPyBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfbGJuKSArIDEgOiAwKToKKwkJCQkgIC0xOworCX0KKwlTVHBzLT5lb2YgICAgICAgPSAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA+PSBTVHAtPmVvZF9mcmFtZV9wcG9zKT9TVF9FT0Q6U1RfTk9FT0Y7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHIAorCQkiJXM6RDogTm93IHBvc2l0aW9uZWQgYXQgcHBvcyAlZCwgZnJhbWUgJWQsIGxibiAlZCwgZmlsZSAlZCwgYmxrICVkLCBycHRyICVkLCBlb2YgJWRcbiIsCisJCW5hbWUsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1RwLT5sb2dpY2FsX2Jsa19udW0sCisJCVNUcHMtPmRydl9maWxlLCBTVHBzLT5kcnZfYmxvY2ssIFNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIsIFNUcHMtPmVvZik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgYmFjayB0aGUgZHJpdmUncyBpbnRlcm5hbCBidWZmZXIgY29udGVudHMsIGFzIGEgcGFydAorICogb2YgdGhlIHdyaXRlIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBmb3Igb2xkIE9uU3RyZWFtCisgKiBmaXJtd2FyZSByZXZpc2lvbnMuCisgKiBQcmVjb25kaXRpb24gZm9yIHRoaXMgZnVuY3Rpb24gdG8gd29yazogYWxsIGZyYW1lcyBpbiB0aGUKKyAqIGRyaXZlJ3MgYnVmZmVyIG11c3QgYmUgb2Ygb25lIHR5cGUgKERBVEEsIE1BUksgb3IgRU9EKSEKKyAqLworc3RhdGljIGludCBvc3N0X3JlYWRfYmFja19idWZmZXJfYW5kX3Jld3JpdGUoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkJCQl1bnNpZ25lZCBpbnQgZnJhbWUsIHVuc2lnbmVkIGludCBza2lwLCBpbnQgcGVuZGluZykKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudCA9ICogYVNScG50OworCXVuc2lnbmVkIGNoYXIJICAgICAgKiBidWZmZXIsICogcDsKKwl1bnNpZ25lZCBjaGFyCQljbWRbTUFYX0NPTU1BTkRfU0laRV07CisJaW50CQkJZmxhZywgbmV3X2ZyYW1lLCBpOworCWludAkJCW5mcmFtZXMgICAgICAgICAgPSBTVHAtPmN1cl9mcmFtZXM7CisJaW50CQkJYmxrc19wZXJfZnJhbWUgICA9IG50b2hzKFNUcC0+YnVmZmVyLT5hdXgtPmRhdC5kYXRfbGlzdFswXS5ibGtfY250KTsKKwlpbnQJCQlmcmFtZV9zZXFfbnVtYmVyID0gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfc2VxX251bSkKKwkJCQkJCS0gKG5mcmFtZXMgKyBwZW5kaW5nIC0gMSk7CisJaW50CQkJbG9naWNhbF9ibGtfbnVtICA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmxvZ2ljYWxfYmxrX251bSkgCisJCQkJCQktIChuZnJhbWVzICsgcGVuZGluZyAtIDEpICogYmxrc19wZXJfZnJhbWU7CisJY2hhcgkJICAgICAgKiBuYW1lICAgICAgICAgICAgID0gdGFwZV9uYW1lKFNUcCk7CisJdW5zaWduZWQgbG9uZwkJc3RhcnR3YWl0ICAgICAgICA9IGppZmZpZXM7CisjaWYgREVCVUcKKwlpbnQJCQlkYmcgICAgICAgICAgICAgID0gZGVidWdnaW5nOworI2VuZGlmCisKKwlpZiAoKGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopdm1hbGxvYygobmZyYW1lcyArIDEpICogT1NfREFUQV9TSVpFKSkgPT0gTlVMTCkKKwkJcmV0dXJuICgtRUlPKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IFJlYWRpbmcgYmFjayAlZCBmcmFtZXMgZnJvbSBkcml2ZSBidWZmZXIlc1xuIiwKKwkJCSBuYW1lLCBuZnJhbWVzLCBwZW5kaW5nPyIgYW5kIG9uZSB0aGF0IHdhcyBwZW5kaW5nIjoiIik7CisKKwlvc3N0X2NvcHlfZnJvbV9idWZmZXIoU1RwLT5idWZmZXIsIChwID0gJmJ1ZmZlcltuZnJhbWVzICogT1NfREFUQV9TSVpFXSkpOworI2lmIERFQlVHCisJaWYgKHBlbmRpbmcgJiYgZGVidWdnaW5nKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBQZW5kaW5nIGZyYW1lICVkIChsYmxrICVkKSwgZGF0YSAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCW5hbWUsIGZyYW1lX3NlcV9udW1iZXIgKyBuZnJhbWVzLAorCQkJICAgICAgIAlsb2dpY2FsX2Jsa19udW0gKyBuZnJhbWVzICogYmxrc19wZXJfZnJhbWUsCisJCQkgICAgICAgCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworI2VuZGlmCisJZm9yIChpID0gMCwgcCA9IGJ1ZmZlcjsgaSA8IG5mcmFtZXM7IGkrKywgcCArPSBPU19EQVRBX1NJWkUpIHsKKworCQltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gMHgzQzsJCS8qIEJ1ZmZlciBSZWFkICAgICAgICAgICAqLworCQljbWRbMV0gPSA2OwkJLyogUmV0cmlldmUgRmF1bHR5IEJsb2NrICovCisJCWNtZFs3XSA9IDMyNzY4ID4+IDg7CisJCWNtZFs4XSA9IDMyNzY4ICYgMHhmZjsKKworCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIE9TX0ZSQU1FX1NJWkUsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCQorCQlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgfHwgIVNScG50KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IEZhaWxlZCB0byByZWFkIGZyYW1lIGJhY2sgZnJvbSBPblN0cmVhbSBidWZmZXJcbiIsIG5hbWUpOworCQkJdmZyZWUoKHZvaWQgKilidWZmZXIpOworCQkJKmFTUnBudCA9IFNScG50OworCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCQlvc3N0X2NvcHlfZnJvbV9idWZmZXIoU1RwLT5idWZmZXIsIHApOworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFkIGJhY2sgbG9naWNhbCBmcmFtZSAlZCwgZGF0YSAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCQkgIG5hbWUsIGZyYW1lX3NlcV9udW1iZXIgKyBpLCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTsKKyNlbmRpZgorCX0KKwkqYVNScG50ID0gU1JwbnQ7CisJb3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQpOworCisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGcmFtZXMgbGVmdCBpbiBidWZmZXI6ICVkXG4iLCBuYW1lLCBTVHAtPmN1cl9mcmFtZXMpOworI2VuZGlmCisJLyogV3JpdGUgc3luY2hyb25vdXNseSBzbyB3ZSBjYW4gYmUgc3VyZSB3ZSdyZSBPSyBhZ2FpbiBhbmQgZG9uJ3QgaGF2ZSB0byByZWNvdmVyIHJlY3Vyc2l2ZWx5ICovCisJLyogSW4gdGhlIGhlYWRlciB3ZSBkb24ndCBhY3R1YWxseSByZS13cml0ZSB0aGUgZnJhbWVzIHRoYXQgZmFpbCwganVzdCB0aGUgb25lcyBhZnRlciB0aGVtICovCisKKwlmb3IgKGZsYWc9MSwgbmV3X2ZyYW1lPWZyYW1lLCBwPWJ1ZmZlciwgaT0wOyBpIDwgbmZyYW1lcyArIHBlbmRpbmc7ICkgeworCisJCWlmIChmbGFnKSB7CisJCQlpZiAoU1RwLT53cml0ZV90eXBlID09IE9TX1dSSVRFX0hFQURFUikgeworCQkJCWkgKz0gc2tpcDsKKwkJCQlwICs9IHNraXAgKiBPU19EQVRBX1NJWkU7CisJCQl9CisJCQllbHNlIGlmIChuZXdfZnJhbWUgPCAyOTkwICYmIG5ld19mcmFtZStza2lwK25mcmFtZXMrcGVuZGluZyA+PSAyOTkwKQorCQkJCW5ld19mcmFtZSA9IDMwMDAtaTsKKwkJCWVsc2UKKwkJCQluZXdfZnJhbWUgKz0gc2tpcDsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUG9zaXRpb24gdG8gZnJhbWUgJWQsIHdyaXRlIGZzZXEgJWRcbiIsCisJCQkJCQluYW1lLCBuZXdfZnJhbWUraSwgZnJhbWVfc2VxX251bWJlcitpKTsKKyNlbmRpZgorCQkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIG5ld19mcmFtZSArIGksIDApOworCQkJb3NzdF93YWl0X3JlYWR5KFNUcCwgYVNScG50LCA2MCwgT1NTVF9XQUlUX1BPU0lUSU9OX0NPTVBMRVRFKTsKKwkJCW9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKwkJCVNScG50ID0gKiBhU1JwbnQ7CisKKwkJCWlmIChuZXdfZnJhbWUgPiBmcmFtZSArIDEwMDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IEZhaWxlZCB0byBmaW5kIHdyaXRhYmxlIHRhcGUgbWVkaWFcbiIsIG5hbWUpOworCQkJCXZmcmVlKCh2b2lkICopYnVmZmVyKTsKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJaWYgKCBpID49IG5mcmFtZXMgKyBwZW5kaW5nICkgYnJlYWs7CisJCQlmbGFnID0gMDsKKwkJfQorCQlvc3N0X2NvcHlfdG9fYnVmZmVyKFNUcC0+YnVmZmVyLCBwKTsKKwkJLyoKKwkJICogSU1QT1JUQU5UOiBmb3IgZXJyb3IgcmVjb3ZlcnkgdG8gd29yaywgX25ldmVyXyBxdWV1ZSBmcmFtZXMgd2l0aCBtaXhlZCBmcmFtZSB0eXBlIQorCQkgKi8KKwkJb3NzdF9pbml0X2F1eChTVHAsIFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUsIGZyYW1lX3NlcV9udW1iZXIraSwKKwkJCSAgICAgICAJbG9naWNhbF9ibGtfbnVtICsgaSpibGtzX3Blcl9mcmFtZSwKKwkJCSAgICAgICAJbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19zeiksIGJsa3NfcGVyX2ZyYW1lKTsKKwkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IFdSSVRFXzY7CisJCWNtZFsxXSA9IDE7CisJCWNtZFs0XSA9IDE7CisKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJCSIlczpEOiBBYm91dCB0byB3cml0ZSBmcmFtZSAlZCwgc2VxICVkLCBsYm4gJWQsIGRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQluYW1lLCBuZXdfZnJhbWUraSwgZnJhbWVfc2VxX251bWJlcitpLCBsb2dpY2FsX2Jsa19udW0gKyBpKmJsa3NfcGVyX2ZyYW1lLAorCQkJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworI2VuZGlmCisJCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgT1NfRlJBTUVfU0laRSwgRE1BX1RPX0RFVklDRSwKKwkJCQkJICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCisJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpCisJCQlmbGFnID0gMTsKKwkJZWxzZSB7CisJCQlwICs9IE9TX0RBVEFfU0laRTsgaSsrOworCisJCQkvKiBpZiB3ZSBqdXN0IHNlbnQgdGhlIGxhc3QgZnJhbWUsIHdhaXQgdGlsbCBhbGwgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gKi8KKwkJCWlmICggaSA9PSBuZnJhbWVzICsgcGVuZGluZyApIHsKKyNpZiBERUJVRworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENoZWNrIHJlLXdyaXRlIHN1Y2Nlc3NmdWxcbiIsIG5hbWUpOworI2VuZGlmCisJCQkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCQkJY21kWzBdID0gV1JJVEVfRklMRU1BUktTOworCQkJCWNtZFsxXSA9IDE7CisJCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkJCQkgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisjaWYgREVCVUcKKwkJCQlpZiAoZGVidWdnaW5nKSB7CisJCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNsZWVwaW5nIGluIHJlLXdyaXRlIHdhaXQgcmVhZHlcbiIsIG5hbWUpOworCQkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBUdXJuaW5nIG9mZiBkZWJ1Z2dpbmcgZm9yIGEgd2hpbGVcbiIsIG5hbWUpOworCQkJCQlkZWJ1Z2dpbmcgPSAwOworCQkJCX0KKyNlbmRpZgorCQkJCWZsYWcgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJCQkJd2hpbGUgKCAhZmxhZyAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBzdGFydHdhaXQgKyA2MCpIWikgKSB7CisKKwkJCQkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCQkJCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCQkJCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsCisJCQkJCQkJCQkJCQlNQVhfUkVUUklFUywgMSk7CisKKwkJCQkJaWYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gPT0gMiAmJiBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEyXSA9PSA0ICYmCisJCQkJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gPT0gMSB8fCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSA4KSkgeworCQkJCQkJLyogaW4gdGhlIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHkgKi8KKwkJCQkJCW1zbGVlcCgxMDApOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkKKwkJCQkJCWZsYWcgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisjaWYgREVCVUcKKwkJCQlkZWJ1Z2dpbmcgPSBkYmc7CisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV2FpdCByZS13cml0ZSBmaW5pc2hlZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJfQorCQkqYVNScG50ID0gU1JwbnQ7CisJCWlmIChmbGFnKSB7CisJCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbIDJdICYgMHgwZikgPT0gMTMgJiYKKwkJCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gICAgICAgICA9PSAgMCAmJgorCQkJICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSAgICAgICAgID09ICAyKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBWb2x1bWUgb3ZlcmZsb3cgaW4gd3JpdGUgZXJyb3IgcmVjb3ZlcnlcbiIsIG5hbWUpOworCQkJCXZmcmVlKCh2b2lkICopYnVmZmVyKTsKKwkJCQlyZXR1cm4gKC1FSU8pOwkJCS8qIGhpdCBlbmQgb2YgdGFwZSA9IGZhaWwgKi8KKwkJCX0KKwkJCWkgPSAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbM10gPDwgMjQpIHwKKwkJCSAgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbNF0gPDwgMTYpIHwKKwkJCSAgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbNV0gPDwgIDgpIHwKKwkJCSAgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbNl0gICAgICAgICkgLSBuZXdfZnJhbWU7CisJCQlwID0gJmJ1ZmZlcltpICogT1NfREFUQV9TSVpFXTsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQWRkaXRpb25hbCB3cml0ZSBlcnJvciBhdCAlZFxuIiwgbmFtZSwgbmV3X2ZyYW1lK2kpOworI2VuZGlmCisJCQlvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCk7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IHJlcG9ydGVkIGZyYW1lIHBvc2l0aW9uczogaG9zdCA9ICVkLCB0YXBlID0gJWQsIGJ1ZmZlciA9ICVkXG4iLAorCQkJCQkgIG5hbWUsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5jdXJfZnJhbWVzKTsKKyNlbmRpZgorCQl9CisJfQorCWlmIChmbGFnKSB7CisJCS8qIGVycm9yIHJlY292ZXJ5IGRpZCBub3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6RDogV3JpdGUgZXJyb3IgcmVjb3ZlcnkgZmFpbGVkIGluICVzXG4iLCBuYW1lLAorCQkJCVNUcC0+d3JpdGVfdHlwZSA9PSBPU19XUklURV9IRUFERVI/ImhlYWRlciI6ImJvZHkiKTsKKwl9CisJaWYgKCFwZW5kaW5nKQorCQlvc3N0X2NvcHlfdG9fYnVmZmVyKFNUcC0+YnVmZmVyLCBwKTsJLyogc28gYnVmZmVyIGNvbnRlbnQgPT0gYXQgZW50cnkgaW4gYWxsIGNhc2VzICovCisJdmZyZWUoKHZvaWQgKilidWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9zc3RfcmVwb3NpdGlvbl9hbmRfcmV0cnkoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkJCXVuc2lnbmVkIGludCBmcmFtZSwgdW5zaWduZWQgaW50IHNraXAsIGludCBwZW5kaW5nKQoreworCXVuc2lnbmVkIGNoYXIJCWNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwljaGFyCQkgICAgICAqIG5hbWUgICAgICA9IHRhcGVfbmFtZShTVHApOworCWludAkJCWV4cGVjdGVkICA9IDA7CisJaW50CQkJYXR0ZW1wdHMgID0gMTAwMCAvIHNraXA7CisJaW50CQkJZmxhZyAgICAgID0gMTsKKwl1bnNpZ25lZCBsb25nCQlzdGFydHdhaXQgPSBqaWZmaWVzOworI2lmIERFQlVHCisJaW50CQkJZGJnICAgICAgID0gZGVidWdnaW5nOworI2VuZGlmCisKKwl3aGlsZSAoYXR0ZW1wdHMgJiYgdGltZV9iZWZvcmUoamlmZmllcywgc3RhcnR3YWl0ICsgNjAqSFopKSB7CisJCWlmIChmbGFnKSB7CisjaWYgREVCVUcKKwkJCWRlYnVnZ2luZyA9IGRiZzsKKyNlbmRpZgorCQkJaWYgKGZyYW1lIDwgMjk5MCAmJiBmcmFtZStza2lwK1NUcC0+Y3VyX2ZyYW1lcytwZW5kaW5nID49IDI5OTApCisJCQkJZnJhbWUgPSAzMDAwLXNraXA7CisJCQlleHBlY3RlZCA9IGZyYW1lK3NraXArU1RwLT5jdXJfZnJhbWVzK3BlbmRpbmc7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFBvc2l0aW9uIHRvIGZwcG9zICVkLCByZS13cml0ZSBmcm9tIGZzZXEgJWRcbiIsCisJCQkJCSAgbmFtZSwgZnJhbWUrc2tpcCwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLVNUcC0+Y3VyX2ZyYW1lcy1wZW5kaW5nKTsKKyNlbmRpZgorCQkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIGZyYW1lICsgc2tpcCwgMSk7CisJCQlmbGFnID0gMDsKKwkJCWF0dGVtcHRzLS07CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwkJfQorCQlpZiAob3NzdF9nZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQpIDwgMCkgewkJLyogYWRkaXRpb25hbCB3cml0ZSBlcnJvciAqLworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBZGRsIGVycm9yLCBob3N0ICVkLCB0YXBlICVkLCBidWZmZXIgJWRcbiIsCisJCQkJCSAgbmFtZSwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwKKwkJCQkJICBTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+Y3VyX2ZyYW1lcyk7CisjZW5kaWYKKwkJCWZyYW1lID0gU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uOworCQkJZmxhZyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocGVuZGluZyAmJiBTVHAtPmN1cl9mcmFtZXMgPCA1MCkgeworCisJCQltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJCWNtZFswXSA9IFdSSVRFXzY7CisJCQljbWRbMV0gPSAxOworCQkJY21kWzRdID0gMTsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQWJvdXQgdG8gd3JpdGUgcGVuZGluZyBmc2VxICVkIGF0IGZwcG9zICVkXG4iLAorCQkJCQkgIG5hbWUsIFNUcC0+ZnJhbWVfc2VxX251bWJlci0xLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uKTsKKyNlbmRpZgorCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBjbWQsIE9TX0ZSQU1FX1NJWkUsIERNQV9UT19ERVZJQ0UsCisJCQkJCQkgICAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkJCSphU1JwbnQgPSBTUnBudDsKKworCQkJaWYgKFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkgewkJLyogYWRkaXRpb25hbCB3cml0ZSBlcnJvciAqLworCQkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsgMl0gJiAweDBmKSA9PSAxMyAmJgorCQkJCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gICAgICAgICA9PSAgMCAmJgorCQkJCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gICAgICAgICA9PSAgMikgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJICAgICAgICIlczpFOiBWb2x1bWUgb3ZlcmZsb3cgaW4gd3JpdGUgZXJyb3IgcmVjb3ZlcnlcbiIsCisJCQkJCSAgICAgICBuYW1lKTsKKwkJCQkJYnJlYWs7CQkJCS8qIGhpdCBlbmQgb2YgdGFwZSA9IGZhaWwgKi8KKwkJCQl9CisJCQkJZmxhZyA9IDE7CisJCQl9CisJCQllbHNlCisJCQkJcGVuZGluZyA9IDA7CisKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChTVHAtPmN1cl9mcmFtZXMgPT0gMCkgeworI2lmIERFQlVHCisJCQlkZWJ1Z2dpbmcgPSBkYmc7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXYWl0IHJlLXdyaXRlIGZpbmlzaGVkXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJaWYgKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gIT0gZXhwZWN0ZWQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOkE6IEFjdHVhbCBwb3NpdGlvbiAlZCAtIGV4cGVjdGVkICVkXG4iLCAKKwkJCQkJCW5hbWUsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIGV4cGVjdGVkKTsKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKSB7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTbGVlcGluZyBpbiByZS13cml0ZSB3YWl0IHJlYWR5XG4iLCBuYW1lKTsKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFR1cm5pbmcgb2ZmIGRlYnVnZ2luZyBmb3IgYSB3aGlsZVxuIiwgbmFtZSk7CisJCQlkZWJ1Z2dpbmcgPSAwOworCQl9CisjZW5kaWYKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gZmluZCB2YWxpZCB0YXBlIG1lZGlhXG4iLCBuYW1lKTsKKyNpZiBERUJVRworCWRlYnVnZ2luZyA9IGRiZzsKKyNlbmRpZgorCXJldHVybiAoLUVJTyk7Cit9CisKKy8qCisgKiBFcnJvciByZWNvdmVyeSBhbGdvcml0aG0gZm9yIHRoZSBPblN0cmVhbSB0YXBlLgorICovCisKK3N0YXRpYyBpbnQgb3NzdF93cml0ZV9lcnJvcl9yZWNvdmVyeShzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHBlbmRpbmcpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqIFNScG50ICA9ICogYVNScG50OworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgKiBTVHBzICAgPSAmIFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dOworCWNoYXIJCSAgICAqIG5hbWUgICA9IHRhcGVfbmFtZShTVHApOworCWludAkJICAgICAgcmV0dmFsID0gMDsKKwlpbnQJCSAgICAgIHJ3X3N0YXRlOworCXVuc2lnbmVkIGludAkgICAgICBmcmFtZSwgc2tpcDsKKworCXJ3X3N0YXRlID0gU1Rwcy0+cnc7CisKKwlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbIDJdICYgMHgwZikgIT0gMworCSAgfHwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gICAgICAgICAhPSAxMgorCSAgfHwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10gICAgICAgICAhPSAwKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV3JpdGUgZXJyb3IgcmVjb3ZlcnkgY2Fubm90IGhhbmRsZSAlMDJ4OiUwMng6JTAyeFxuIiwgbmFtZSwKKwkJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSk7CisjZW5kaWYKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJZnJhbWUgPQkoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclszXSA8PCAyNCkgfAorCQkoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls0XSA8PCAxNikgfAorCQkoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls1XSA8PCAgOCkgfAorCQkgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls2XTsKKwlza2lwICA9ICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzldOworIAorI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRGV0ZWN0ZWQgcGh5c2ljYWwgYmFkIGZyYW1lIGF0ICV1LCBhZHZpc2VkIHRvIHNraXAgJWRcbiIsIG5hbWUsIGZyYW1lLCBza2lwKTsKKyNlbmRpZgorCW9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IHJlcG9ydGVkIGZyYW1lIHBvc2l0aW9uczogaG9zdCA9ICVkLCB0YXBlID0gJWRcbiIsCisJCQluYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24pOworI2VuZGlmCisJc3dpdGNoIChTVHAtPndyaXRlX3R5cGUpIHsKKwkgICBjYXNlIE9TX1dSSVRFX0RBVEE6CisJICAgY2FzZSBPU19XUklURV9FT0Q6CisJICAgY2FzZSBPU19XUklURV9ORVdfTUFSSzoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSIlczpJOiBSZWxvY2F0aW5nICVkIGJ1ZmZlcmVkIGxvZ2ljYWwgZnJhbWVzIGZyb20gcG9zaXRpb24gJXUgdG8gJXVcbiIsCisJCQluYW1lLCBTVHAtPmN1cl9mcmFtZXMsIGZyYW1lLCAoZnJhbWUgKyBza2lwID4gMzAwMCAmJiBmcmFtZSA8IDMwMDApPzMwMDA6ZnJhbWUgKyBza2lwKTsKKwkJaWYgKFNUcC0+b3NfZndfcmV2ID49IDEwNjAwKQorCQkJcmV0dmFsID0gb3NzdF9yZXBvc2l0aW9uX2FuZF9yZXRyeShTVHAsIGFTUnBudCwgZnJhbWUsIHNraXAsIHBlbmRpbmcpOworCQllbHNlCisJCQlyZXR2YWwgPSBvc3N0X3JlYWRfYmFja19idWZmZXJfYW5kX3Jld3JpdGUoU1RwLCBhU1JwbnQsIGZyYW1lLCBza2lwLCBwZW5kaW5nKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JXM6ICVzV3JpdGUgZXJyb3Ilc3JlY292ZXJlZFxuIiwgbmFtZSwKKwkJCSAgICAgICAJcmV0dmFsPyJFIiAgICA6IkkiLAorCQkJICAgICAgIAlyZXR2YWw/IiIgICAgIDoiRG9uJ3Qgd29ycnksICIsCisJCQkgICAgICAgCXJldHZhbD8iIG5vdCAiOiIgIik7CisJCWJyZWFrOworCSAgIGNhc2UgT1NfV1JJVEVfTEFTVF9NQVJLOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IEJhZCBmcmFtZSBpbiB1cGRhdGUgbGFzdCBtYXJrZXIsIGZhdGFsXG4iLCBuYW1lKTsKKwkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIGZyYW1lICsgU1RwLT5jdXJfZnJhbWVzICsgcGVuZGluZywgMCk7CisJCXJldHZhbCA9IC1FSU87CisJCWJyZWFrOworCSAgIGNhc2UgT1NfV1JJVEVfSEVBREVSOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpJOiBCYWQgZnJhbWUgaW4gaGVhZGVyIHBhcnRpdGlvbiwgc2tpcHBlZFxuIiwgbmFtZSk7CisJCXJldHZhbCA9IG9zc3RfcmVhZF9iYWNrX2J1ZmZlcl9hbmRfcmV3cml0ZShTVHAsIGFTUnBudCwgZnJhbWUsIDEsIHBlbmRpbmcpOworCQlicmVhazsKKwkgICBkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBCYWQgZnJhbWUgaW4gZmlsbGVyLCBpZ25vcmVkXG4iLCBuYW1lKTsKKwkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIGZyYW1lICsgU1RwLT5jdXJfZnJhbWVzICsgcGVuZGluZywgMCk7CisJfQorCW9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFBvc2l0aW9uaW5nIGNvbXBsZXRlLCBjdXJfZnJhbWVzICVkLCBwb3MgJWQsIHRhcGUgcG9zICVkXG4iLCAKKwkJCW5hbWUsIFNUcC0+Y3VyX2ZyYW1lcywgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uKTsKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBuZXh0IGxvZ2ljYWwgZnJhbWUgdG8gd3JpdGU6ICVkXG4iLCBuYW1lLCBTVHAtPmxvZ2ljYWxfYmxrX251bSk7CisjZW5kaWYKKwlpZiAocmV0dmFsID09IDApIHsKKwkJU1RwLT5yZWNvdmVyX2NvdW50Kys7CisJCVNUcC0+cmVjb3Zlcl9lcnJlZysrOworCX0gZWxzZQorCQlTVHAtPmFib3J0X2NvdW50Kys7CisKKwlTVHBzLT5ydyA9IHJ3X3N0YXRlOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19iYWNrd2FyZChzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwKKwkJCQkJCQkJIGludCBtdF9vcCwgaW50IG10X2NvdW50KQoreworCWNoYXIgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCWludCAgICAgY250OworCWludCAgICAgbGFzdF9tYXJrX3Bwb3MgPSAtMTsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hlZCBzcGFjZV9vdmVyX2ZpbGVtYXJrc19iYWNrd2FyZHMgJWQgJWRcbiIsIG5hbWUsIG10X29wLCBtdF9jb3VudCk7CisjZW5kaWYKKwlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gc3BhY2VfZmlsZW1hcmtzX2J3ZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gPj0gNCkgeworCQkvKgorCQkgKiBkaXJlY3QgbG9va3VwIGluIGhlYWRlciBmaWxlbWFyayBsaXN0CisJCSAqLworCQljbnQgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5maWxlbWFya19jbnQpOworCQlpZiAoU1RwLT5oZWFkZXJfb2sgICAgICAgICAgICAgICAgICAgICAgICAgJiYgCisJCSAgICBTVHAtPmhlYWRlcl9jYWNoZSAhPSBOVUxMICAgICAgICAgICAgICAmJgorCQkgICAgKGNudCAtIG10X2NvdW50KSAgPj0gMCAgICAgICAgICAgICAgICAgJiYKKwkJICAgIChjbnQgLSBtdF9jb3VudCkgICA8IE9TX0ZNX1RBQl9NQVggICAgICYmCisJCSAgICAoY250IC0gbXRfY291bnQpICAgPCBTVHAtPmZpbGVtYXJrX2NudCAmJgorCQkgICAgU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtjbnQtMV0gPT0gU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpCisKKwkJCWxhc3RfbWFya19wcG9zID0gbnRvaGwoU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtjbnQgLSBtdF9jb3VudF0pOworI2lmIERFQlVHCisJCWlmIChTVHAtPmhlYWRlcl9jYWNoZSA9PSBOVUxMIHx8IChjbnQgLSBtdF9jb3VudCkgPCAwIHx8IChjbnQgLSBtdF9jb3VudCkgPj0gT1NfRk1fVEFCX01BWCkKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZpbGVtYXJrIGxvb2t1cCBmYWlsIGR1ZSB0byAlc1xuIiwgbmFtZSwKKwkJCSAgICAgICBTVHAtPmhlYWRlcl9jYWNoZSA9PSBOVUxMPyJsYWNrIG9mIGhlYWRlciBjYWNoZSI6ImNvdW50IG91dCBvZiByYW5nZSIpOworCQllbHNlCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGaWxlbWFyayBsb29rdXA6IHByZXYgbWFyayAlZCAoJXMpLCBza2lwICVkIHRvICVkXG4iLAorCQkJCW5hbWUsIGNudCwKKwkJCQkoKGNudCA9PSAtMSAmJiBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfcHBvcykgPT0gLTEpIHx8CisJCQkJIChTVHAtPmhlYWRlcl9jYWNoZS0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50W2NudC0xXSA9PQorCQkJCQkgU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpKT8ibWF0Y2giOiJlcnJvciIsCisJCQkgICAgICAgbXRfY291bnQsIGxhc3RfbWFya19wcG9zKTsKKyNlbmRpZgorCQlpZiAobGFzdF9tYXJrX3Bwb3MgPiAxMCAmJiBsYXN0X21hcmtfcHBvcyA8IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIHsKKwkJCW9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsIGFTUnBudCwgbGFzdF9tYXJrX3Bwb3MpOworCQkJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgCisJCQkJCSIlczpEOiBDb3VsZG4ndCBnZXQgbG9naWNhbCBibGsgbnVtIGluIHNwYWNlX2ZpbGVtYXJrc1xuIiwgbmFtZSk7CisjZW5kaWYKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFeHBlY3RlZCB0byBmaW5kIG1hcmtlciBhdCBwcG9zICVkLCBub3QgZm91bmRcbiIsCisJCQkJCQkgbmFtZSwgbGFzdF9tYXJrX3Bwb3MpOworCQkJCXJldHVybiAoLUVJTyk7CisJCQl9CisJCQlnb3RvIGZvdW5kOworCQl9CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmV2ZXJ0aW5nIHRvIHNjYW4gZmlsZW1hcmsgYmFja3dhcmRzXG4iLCBuYW1lKTsKKyNlbmRpZgorCX0KKwljbnQgPSAwOworCXdoaWxlIChjbnQgIT0gbXRfY291bnQpIHsKKwkJbGFzdF9tYXJrX3Bwb3MgPSBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfcHBvcyk7CisJCWlmIChsYXN0X21hcmtfcHBvcyA9PSAtMSkKKwkJCXJldHVybiAoLUVJTyk7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUG9zaXRpb25pbmcgdG8gbGFzdCBtYXJrIGF0ICVkXG4iLCBuYW1lLCBsYXN0X21hcmtfcHBvcyk7CisjZW5kaWYKKwkJb3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgYVNScG50LCBsYXN0X21hcmtfcHBvcyk7CisJCWNudCsrOworCQlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCBnZXQgbG9naWNhbCBibGsgbnVtIGluIHNwYWNlX2ZpbGVtYXJrc1xuIiwgbmFtZSk7CisjZW5kaWYKKwkJCXJldHVybiAoLUVJTyk7CisJCX0KKwkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IEV4cGVjdGVkIHRvIGZpbmQgbWFya2VyIGF0IHBwb3MgJWQsIG5vdCBmb3VuZFxuIiwKKwkJCQkJIG5hbWUsIGxhc3RfbWFya19wcG9zKTsKKwkJCXJldHVybiAoLUVJTyk7CisJCX0KKwl9Citmb3VuZDoKKwlpZiAobXRfb3AgPT0gTVRCU0ZNKSB7CisJCVNUcC0+ZnJhbWVfc2VxX251bWJlcisrOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciAgICAgID0gMDsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPSAwOworCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAgICAgKz0gbnRvaHMoU1RwLT5idWZmZXItPmF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19jbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFEUkwgMS4xIGNvbXBhdGlibGUgInNsb3ciIHNwYWNlIGZpbGVtYXJrcyBmd2QgdmVyc2lvbgorICoKKyAqIEp1c3Qgc2NhbnMgZm9yIHRoZSBmaWxlbWFyayBzZXF1ZW50aWFsbHkuCisgKi8KK3N0YXRpYyBpbnQgb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19mb3J3YXJkX3Nsb3coc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsCisJCQkJCQkJCSAgICAgaW50IG10X29wLCBpbnQgbXRfY291bnQpCit7CisJaW50CWNudCA9IDA7CisjaWYgREVCVUcKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJlYWNoZWQgc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9zbG93ICVkICVkXG4iLCBuYW1lLCBtdF9vcCwgbXRfY291bnQpOworI2VuZGlmCisJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCBnZXQgbG9naWNhbCBibGsgbnVtIGluIHNwYWNlX2ZpbGVtYXJrc19md2RcbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHVybiAoLUVJTyk7CisJfQorCXdoaWxlICgxKSB7CisJCWlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMCkgPCAwKSB7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gc3BhY2VfZmlsZW1hcmtzXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJcmV0dXJuICgtRUlPKTsKKwkJfQorCQlpZiAoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX01BUktFUikKKwkJCWNudCsrOworCQlpZiAoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX0VPRCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBzcGFjZV9md2Q6IEVPRCByZWFjaGVkXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJaWYgKFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPiBTVHAtPmVvZF9mcmFtZV9wcG9zKzEpIHsKKyNpZiBERUJVRworCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEVPRCBwb3NpdGlvbiBjb3JyZWN0ZWQgKCVkPT4lZClcbiIsCisJCQkJCSAgICAgICAJbmFtZSwgU1RwLT5lb2RfZnJhbWVfcHBvcywgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbi0xKTsKKyNlbmRpZgorCQkJCVNUcC0+ZW9kX2ZyYW1lX3Bwb3MgPSBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLTE7CisJCQl9CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJCWlmIChjbnQgPT0gbXRfY291bnQpCisJCQlicmVhazsKKwkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOworCX0KKwlpZiAobXRfb3AgPT0gTVRGU0YpIHsKKwkJU1RwLT5mcmFtZV9zZXFfbnVtYmVyKys7CisJCVNUcC0+ZnJhbWVfaW5fYnVmZmVyICAgICAgPSAwOworCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID0gMDsKKwkJU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciA9IDA7CisJCVNUcC0+bG9naWNhbF9ibGtfbnVtICAgICArPSBudG9ocyhTVHAtPmJ1ZmZlci0+YXV4LT5kYXQuZGF0X2xpc3RbMF0uYmxrX2NudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRmFzdCBsaW51eCBzcGVjaWZpYyB2ZXJzaW9uIG9mIE9uU3RyZWFtIEZTRgorICovCitzdGF0aWMgaW50IG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9mYXN0KHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LAorCQkJCQkJCQkgICAgIGludCBtdF9vcCwgaW50IG10X2NvdW50KQoreworCWNoYXIgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCWludAljbnQgID0gMCwKKwkJbmV4dF9tYXJrX3Bwb3MgPSAtMTsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hlZCBzcGFjZV9vdmVyX2ZpbGVtYXJrc19mb3J3YXJkX2Zhc3QgJWQgJWRcbiIsIG5hbWUsIG10X29wLCBtdF9jb3VudCk7CisjZW5kaWYKKwlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvdWxkbid0IGdldCBsb2dpY2FsIGJsayBudW0gaW4gc3BhY2VfZmlsZW1hcmtzX2Z3ZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisKKwlpZiAoU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID49IDQpIHsKKwkJLyoKKwkJICogZGlyZWN0IGxvb2t1cCBpbiBoZWFkZXIgZmlsZW1hcmsgbGlzdAorCQkgKi8KKwkJY250ID0gbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZmlsZW1hcmtfY250KSAtIDE7CisJCWlmIChTVHAtPmhlYWRlcl9vayAgICAgICAgICAgICAgICAgICAgICAgICAmJiAKKwkJICAgIFNUcC0+aGVhZGVyX2NhY2hlICE9IE5VTEwgICAgICAgICAgICAgICYmCisJCSAgICAoY250ICsgbXRfY291bnQpICAgPCBPU19GTV9UQUJfTUFYICAgICAmJgorCQkgICAgKGNudCArIG10X2NvdW50KSAgIDwgU1RwLT5maWxlbWFya19jbnQgJiYKKwkJICAgICgoY250ID09IC0xICYmIG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19wcG9zKSA9PSAtMSkgfHwKKwkJICAgICAoU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtjbnRdID09IFNUcC0+YnVmZmVyLT5hdXgtPmxhc3RfbWFya19wcG9zKSkpCisKKwkJCW5leHRfbWFya19wcG9zID0gbnRvaGwoU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtjbnQgKyBtdF9jb3VudF0pOworI2lmIERFQlVHCisJCWlmIChTVHAtPmhlYWRlcl9jYWNoZSA9PSBOVUxMIHx8IChjbnQgKyBtdF9jb3VudCkgPj0gT1NfRk1fVEFCX01BWCkKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZpbGVtYXJrIGxvb2t1cCBmYWlsIGR1ZSB0byAlc1xuIiwgbmFtZSwKKwkJCSAgICAgICBTVHAtPmhlYWRlcl9jYWNoZSA9PSBOVUxMPyJsYWNrIG9mIGhlYWRlciBjYWNoZSI6ImNvdW50IG91dCBvZiByYW5nZSIpOworCQllbHNlCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGaWxlbWFyayBsb29rdXA6IHByZXYgbWFyayAlZCAoJXMpLCBza2lwICVkIHRvICVkXG4iLAorCQkJICAgICAgIG5hbWUsIGNudCwKKwkJCSAgICAgICAoKGNudCA9PSAtMSAmJiBudG9obChTVHAtPmJ1ZmZlci0+YXV4LT5sYXN0X21hcmtfcHBvcykgPT0gLTEpIHx8CisJCQkJKFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbY250XSA9PQorCQkJCQkgU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpKT8ibWF0Y2giOiJlcnJvciIsCisJCQkgICAgICAgbXRfY291bnQsIG5leHRfbWFya19wcG9zKTsKKyNlbmRpZgorCQlpZiAobmV4dF9tYXJrX3Bwb3MgPD0gMTAgfHwgbmV4dF9tYXJrX3Bwb3MgPiBTVHAtPmVvZF9mcmFtZV9wcG9zKSB7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJldmVydGluZyB0byBzbG93IGZpbGVtYXJrIHNwYWNlXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJcmV0dXJuIG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9zbG93KFNUcCwgYVNScG50LCBtdF9vcCwgbXRfY291bnQpOworCQl9IGVsc2UgeworCQkJb3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgYVNScG50LCBuZXh0X21hcmtfcHBvcyk7CisJCQlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiBzcGFjZV9maWxlbWFya3NcbiIsCisJCQkJCQkgbmFtZSk7CisjZW5kaWYKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFeHBlY3RlZCB0byBmaW5kIG1hcmtlciBhdCBwcG9zICVkLCBub3QgZm91bmRcbiIsCisJCQkJCQkgbmFtZSwgbmV4dF9tYXJrX3Bwb3MpOworCQkJCXJldHVybiAoLUVJTyk7CisJCQl9CisJCQlpZiAobnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZmlsZW1hcmtfY250KSAhPSBjbnQgKyBtdF9jb3VudCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IEV4cGVjdGVkIHRvIGZpbmQgbWFya2VyICVkIGF0IHBwb3MgJWQsIG5vdCAlZFxuIiwKKwkJCQkJCSBuYW1lLCBjbnQrbXRfY291bnQsIG5leHRfbWFya19wcG9zLAorCQkJCQkJIG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPmZpbGVtYXJrX2NudCkpOworICAgICAgIAkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRmluZCBuZWFyZXN0ICh1c3VhbGx5IHByZXZpb3VzKSBtYXJrZXIsIHRoZW4ganVtcCBmcm9tIG1hcmtlciB0byBtYXJrZXIKKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlpZiAoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX01BUktFUikKKwkJCQlicmVhazsKKwkJCWlmIChTVHAtPmJ1ZmZlci0+YXV4LT5mcmFtZV90eXBlID09IE9TX0ZSQU1FX1RZUEVfRU9EKSB7CisjaWYgREVCVUcKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBzcGFjZV9md2Q6IEVPRCByZWFjaGVkXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJCXJldHVybiAoLUVJTyk7CisJCQl9CisJCQlpZiAobnRvaGwoU1RwLT5idWZmZXItPmF1eC0+ZmlsZW1hcmtfY250KSA9PSAwKSB7CisJCQkJaWYgKFNUcC0+Zmlyc3RfbWFya19wcG9zID09IC0xKSB7CisjaWYgREVCVUcKKwkJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmV2ZXJ0aW5nIHRvIHNsb3cgZmlsZW1hcmsgc3BhY2VcbiIsIG5hbWUpOworI2VuZGlmCisJCQkJCXJldHVybiBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfc2xvdyhTVHAsIGFTUnBudCwgbXRfb3AsIG10X2NvdW50KTsKKwkJCQl9CisJCQkJb3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgYVNScG50LCBTVHAtPmZpcnN0X21hcmtfcHBvcyk7CisJCQkJaWYgKG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCBhU1JwbnQsIC0xLCAwKSA8IDApIHsKKyNpZiBERUJVRworCQkJCQlwcmludGsoT1NTVF9ERUJfTVNHCisJCQkJCSAgICAgICAiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiBzcGFjZV9maWxlbWFya3NfZndkX2Zhc3RcbiIsCisJCQkJCSAgICAgICBuYW1lKTsKKyNlbmRpZgorCQkJCQlyZXR1cm4gKC1FSU8pOworCQkJCX0KKwkJCQlpZiAoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSAhPSBPU19GUkFNRV9UWVBFX01BUktFUikgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFeHBlY3RlZCB0byBmaW5kIGZpbGVtYXJrIGF0ICVkXG4iLAorCQkJCQkJCSBuYW1lLCBTVHAtPmZpcnN0X21hcmtfcHBvcyk7CisJCQkJCXJldHVybiAoLUVJTyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAob3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19iYWNrd2FyZChTVHAsIGFTUnBudCwgTVRCU0YsIDEpIDwgMCkKKwkJCQkJcmV0dXJuICgtRUlPKTsKKwkJCQltdF9jb3VudCsrOworCQkJfQorCQl9CisJCWNudCsrOworCQl3aGlsZSAoY250ICE9IG10X2NvdW50KSB7CisJCQluZXh0X21hcmtfcHBvcyA9IG50b2hsKFNUcC0+YnVmZmVyLT5hdXgtPm5leHRfbWFya19wcG9zKTsKKwkJCWlmICghbmV4dF9tYXJrX3Bwb3MgfHwgbmV4dF9tYXJrX3Bwb3MgPiBTVHAtPmVvZF9mcmFtZV9wcG9zKSB7CisjaWYgREVCVUcKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZXZlcnRpbmcgdG8gc2xvdyBmaWxlbWFyayBzcGFjZVxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCQlyZXR1cm4gb3NzdF9zcGFjZV9vdmVyX2ZpbGVtYXJrc19mb3J3YXJkX3Nsb3coU1RwLCBhU1JwbnQsIG10X29wLCBtdF9jb3VudCAtIGNudCk7CisJCQl9CisjaWYgREVCVUcKKwkJCWVsc2UgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUG9zaXRpb25pbmcgdG8gbmV4dCBtYXJrIGF0ICVkXG4iLCBuYW1lLCBuZXh0X21hcmtfcHBvcyk7CisjZW5kaWYKKwkJCW9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsIGFTUnBudCwgbmV4dF9tYXJrX3Bwb3MpOworCQkJY250Kys7CisJCQlpZiAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsIGFTUnBudCwgLTEsIDApIDwgMCkgeworI2lmIERFQlVHCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiBzcGFjZV9maWxlbWFya3NcbiIsCisJCQkJCQkgbmFtZSk7CisjZW5kaWYKKwkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQkJaWYgKFNUcC0+YnVmZmVyLT5hdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9NQVJLRVIpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBFeHBlY3RlZCB0byBmaW5kIG1hcmtlciBhdCBwcG9zICVkLCBub3QgZm91bmRcbiIsCisJCQkJCQkgbmFtZSwgbmV4dF9tYXJrX3Bwb3MpOworCQkJCXJldHVybiAoLUVJTyk7CisJCQl9CisJCX0KKwl9CisJaWYgKG10X29wID09IE1URlNGKSB7CisJCVNUcC0+ZnJhbWVfc2VxX251bWJlcisrOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciAgICAgID0gMDsKKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCVNUcC0+YnVmZmVyLT5yZWFkX3BvaW50ZXIgPSAwOworCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAgICAgKz0gbnRvaHMoU1RwLT5idWZmZXItPmF1eC0+ZGF0LmRhdF9saXN0WzBdLmJsa19jbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIGRlYnVnIG1vZGUsIHdlIHdhbnQgdG8gc2VlIGFzIG1hbnkgZXJyb3JzIGFzIHBvc3NpYmxlCisgKiB0byB0ZXN0IHRoZSBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20uCisgKi8KKyNpZiBERUJVRworc3RhdGljIHZvaWQgb3NzdF9zZXRfcmV0cmllcyhzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHJldHJpZXMpCit7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50ICA9ICogYVNScG50OworCWNoYXIJCSAgICAgICogbmFtZSAgID0gdGFwZV9uYW1lKFNUcCk7CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBNT0RFX1NFTEVDVDsKKwljbWRbMV0gPSAweDEwOworCWNtZFs0XSA9IE5VTUJFUl9SRVRSSUVTX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzBdID0gY21kWzRdIC0gMTsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMV0gPSAwOwkJCS8qIE1lZGl1bSBUeXBlIC0gaWdub3JpbmcgKi8KKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0gPSAwOwkJCS8qIFJlc2VydmVkICovCisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzNdID0gMDsJCQkvKiBCbG9jayBEZXNjcmlwdG9yIExlbmd0aCAqLworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAwXSA9IE5VTUJFUl9SRVRSSUVTX1BBR0UgfCAoMSA8PCA3KTsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgMV0gPSAyOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAyXSA9IDQ7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDNdID0gcmV0cmllczsKKworCWlmIChkZWJ1Z2dpbmcpCisJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNldHRpbmcgbnVtYmVyIG9mIHJldHJpZXMgb24gT25TdHJlYW0gdGFwZSB0byAlZFxuIiwgbmFtZSwgcmV0cmllcyk7CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQpCisJICAgIHByaW50ayAoS0VSTl9FUlIgIiVzOkQ6IENvdWxkbid0IHNldCByZXRyaWVzIHRvICVkXG4iLCBuYW1lLCByZXRyaWVzKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgb3NzdF93cml0ZV9maWxlbWFyayhzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpbnQJcmVzdWx0OworCWludAl0aGlzX21hcmtfcHBvcyA9IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb247CisJaW50CXRoaXNfbWFya19sYm4gID0gU1RwLT5sb2dpY2FsX2Jsa19udW07CisjaWYgREVCVUcKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKyNlbmRpZgorCisJaWYgKFNUcC0+cmF3KSByZXR1cm4gMDsKKworCVNUcC0+d3JpdGVfdHlwZSA9IE9TX1dSSVRFX05FV19NQVJLOworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV3JpdGluZyBGaWxlbWFyayAlaSBhdCBmcHBvcyAlZCAoZnNlcSAlZCwgbGJsayAlZClcbiIsIAorCSAgICAgICBuYW1lLCBTVHAtPmZpbGVtYXJrX2NudCwgdGhpc19tYXJrX3Bwb3MsIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgdGhpc19tYXJrX2xibik7CisjZW5kaWYKKwlTVHAtPmRpcnR5ID0gMTsKKwlyZXN1bHQgID0gb3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCXJlc3VsdCB8PSBvc3N0X2ZsdXNoX2RyaXZlX2J1ZmZlcihTVHAsIGFTUnBudCk7CisJU1RwLT5sYXN0X21hcmtfcHBvcyA9IHRoaXNfbWFya19wcG9zOworCVNUcC0+bGFzdF9tYXJrX2xibiAgPSB0aGlzX21hcmtfbGJuOworCWlmIChTVHAtPmhlYWRlcl9jYWNoZSAhPSBOVUxMICYmIFNUcC0+ZmlsZW1hcmtfY250IDwgT1NfRk1fVEFCX01BWCkKKwkJU1RwLT5oZWFkZXJfY2FjaGUtPmRhdF9mbV90YWIuZm1fdGFiX2VudFtTVHAtPmZpbGVtYXJrX2NudF0gPSBodG9ubCh0aGlzX21hcmtfcHBvcyk7CisJaWYgKFNUcC0+ZmlsZW1hcmtfY250KysgPT0gMCkKKwkJU1RwLT5maXJzdF9tYXJrX3Bwb3MgPSB0aGlzX21hcmtfcHBvczsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG9zc3Rfd3JpdGVfZW9kKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCWludAlyZXN1bHQ7CisjaWYgREVCVUcKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKyNlbmRpZgorCisJaWYgKFNUcC0+cmF3KSByZXR1cm4gMDsKKworCVNUcC0+d3JpdGVfdHlwZSA9IE9TX1dSSVRFX0VPRDsKKwlTVHAtPmVvZF9mcmFtZV9wcG9zID0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbjsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRpbmcgRU9EIGF0IGZwcG9zICVkIChmc2VxICVkLCBsYmxrICVkKVxuIiwgbmFtZSwKKwkJCVNUcC0+ZW9kX2ZyYW1lX3Bwb3MsIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1RwLT5sb2dpY2FsX2Jsa19udW0pOworI2VuZGlmCisJU1RwLT5kaXJ0eSA9IDE7CisKKwlyZXN1bHQgID0gb3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCBhU1JwbnQpOwkKKwlyZXN1bHQgfD0gb3NzdF9mbHVzaF9kcml2ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCVNUcC0+ZW9kX2ZyYW1lX2xmYSA9IC0tKFNUcC0+ZnJhbWVfc2VxX251bWJlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvc3N0X3dyaXRlX2ZpbGxlcihzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IHdoZXJlLCBpbnQgY291bnQpCit7CisJY2hhciAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVhY2hlZCBvbnN0cmVhbSB3cml0ZSBmaWxsZXIgZ3JvdXAgJWRcbiIsIG5hbWUsIHdoZXJlKTsKKyNlbmRpZgorCW9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgNjAgKiA1LCAwKTsKKwlvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgd2hlcmUsIDApOworCVNUcC0+d3JpdGVfdHlwZSA9IE9TX1dSSVRFX0ZJTExFUjsKKwl3aGlsZSAoY291bnQtLSkgeworCQltZW1jcHkoU1RwLT5idWZmZXItPmJfZGF0YSwgIkZpbGxlciIsIDYpOworCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID0gNjsKKwkJU1RwLT5kaXJ0eSA9IDE7CisJCWlmIChvc3N0X2ZsdXNoX3dyaXRlX2J1ZmZlcihTVHAsIGFTUnBudCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IENvdWxkbid0IHdyaXRlIGZpbGxlciBmcmFtZVxuIiwgbmFtZSk7CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJfQorI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRXhpdGluZyBvbnN0cmVhbSB3cml0ZSBmaWxsZXIgZ3JvdXBcbiIsIG5hbWUpOworI2VuZGlmCisJcmV0dXJuIG9zc3RfZmx1c2hfZHJpdmVfYnVmZmVyKFNUcCwgYVNScG50KTsKK30KKworc3RhdGljIGludCBfX29zc3Rfd3JpdGVfaGVhZGVyKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgd2hlcmUsIGludCBjb3VudCkKK3sKKwljaGFyICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCWludCAgICAgcmVzdWx0OworCisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFjaGVkIG9uc3RyZWFtIHdyaXRlIGhlYWRlciBncm91cCAlZFxuIiwgbmFtZSwgd2hlcmUpOworI2VuZGlmCisJb3NzdF93YWl0X3JlYWR5KFNUcCwgYVNScG50LCA2MCAqIDUsIDApOworCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCB3aGVyZSwgMCk7CisJU1RwLT53cml0ZV90eXBlID0gT1NfV1JJVEVfSEVBREVSOworCXdoaWxlIChjb3VudC0tKSB7CisJCW9zc3RfY29weV90b19idWZmZXIoU1RwLT5idWZmZXIsICh1bnNpZ25lZCBjaGFyICopU1RwLT5oZWFkZXJfY2FjaGUpOworCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID0gc2l6ZW9mKG9zX2hlYWRlcl90KTsKKwkJU1RwLT5kaXJ0eSA9IDE7CisJCWlmIChvc3N0X2ZsdXNoX3dyaXRlX2J1ZmZlcihTVHAsIGFTUnBudCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IENvdWxkbid0IHdyaXRlIGhlYWRlciBmcmFtZVxuIiwgbmFtZSk7CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJfQorCXJlc3VsdCA9IG9zc3RfZmx1c2hfZHJpdmVfYnVmZmVyKFNUcCwgYVNScG50KTsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRlIG9uc3RyZWFtIGhlYWRlciBncm91cCAlc1xuIiwgbmFtZSwgcmVzdWx0PyJmYWlsZWQiOiJkb25lIik7CisjZW5kaWYKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG9zc3Rfd3JpdGVfaGVhZGVyKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgbG9jYXRlX2VvZCkKK3sKKwlvc19oZWFkZXJfdCAqIGhlYWRlcjsKKwlpbnQJICAgICAgcmVzdWx0OworCWNoYXIgICAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0aW5nIHRhcGUgaGVhZGVyXG4iLCBuYW1lKTsKKyNlbmRpZgorCWlmIChTVHAtPnJhdykgcmV0dXJuIDA7CisKKwlpZiAoU1RwLT5oZWFkZXJfY2FjaGUgPT0gTlVMTCkgeworCQlpZiAoKFNUcC0+aGVhZGVyX2NhY2hlID0gKG9zX2hlYWRlcl90ICopdm1hbGxvYyhzaXplb2Yob3NfaGVhZGVyX3QpKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBGYWlsZWQgdG8gYWxsb2NhdGUgaGVhZGVyIGNhY2hlXG4iLCBuYW1lKTsKKwkJCXJldHVybiAoLUVOT01FTSk7CisJCX0KKwkJbWVtc2V0KFNUcC0+aGVhZGVyX2NhY2hlLCAwLCBzaXplb2Yob3NfaGVhZGVyX3QpKTsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBbGxvY2F0ZWQgYW5kIGNsZWFyZWQgbWVtb3J5IGZvciBoZWFkZXIgY2FjaGVcbiIsIG5hbWUpOworI2VuZGlmCisJfQorCWlmIChTVHAtPmhlYWRlcl9vaykgU1RwLT51cGRhdGVfZnJhbWVfY250cisrOworCWVsc2UgICAgICAgICAgICAgICAgU1RwLT51cGRhdGVfZnJhbWVfY250ciA9IDA7CisKKwloZWFkZXIgPSBTVHAtPmhlYWRlcl9jYWNoZTsKKwlzdHJjcHkoaGVhZGVyLT5pZGVudF9zdHIsICJBRFJfU0VRIik7CisJaGVhZGVyLT5tYWpvcl9yZXYgICAgICA9IDE7CisJaGVhZGVyLT5taW5vcl9yZXYgICAgICA9IDQ7CisJaGVhZGVyLT5leHRfdHJrX3RiX29mZiA9IGh0b25zKDE3MTkyKTsKKwloZWFkZXItPnB0X3Bhcl9udW0gICAgID0gMTsKKwloZWFkZXItPnBhcnRpdGlvblswXS5wYXJ0aXRpb25fbnVtICAgICAgICAgICAgICA9IE9TX0RBVEFfUEFSVElUSU9OOworCWhlYWRlci0+cGFydGl0aW9uWzBdLnBhcl9kZXNjX3ZlciAgICAgICAgICAgICAgID0gT1NfUEFSVElUSU9OX1ZFUlNJT047CisJaGVhZGVyLT5wYXJ0aXRpb25bMF0ud3J0X3Bhc3NfY250ciAgICAgICAgICAgICAgPSBodG9ucyhTVHAtPndydF9wYXNzX2NudHIpOworCWhlYWRlci0+cGFydGl0aW9uWzBdLmZpcnN0X2ZyYW1lX3Bwb3MgICAgICAgICAgID0gaHRvbmwoU1RwLT5maXJzdF9kYXRhX3Bwb3MpOworCWhlYWRlci0+cGFydGl0aW9uWzBdLmxhc3RfZnJhbWVfcHBvcyAgICAgICAgICAgID0gaHRvbmwoU1RwLT5jYXBhY2l0eSk7CisJaGVhZGVyLT5wYXJ0aXRpb25bMF0uZW9kX2ZyYW1lX3Bwb3MgICAgICAgICAgICAgPSBodG9ubChTVHAtPmVvZF9mcmFtZV9wcG9zKTsKKwloZWFkZXItPmNmZ19jb2xfd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICA9IGh0b25sKDIwKTsKKwloZWFkZXItPmRhdF9jb2xfd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICA9IGh0b25sKDE1MDApOworCWhlYWRlci0+cWZhX2NvbF93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaHRvbmwoMCk7CisJaGVhZGVyLT5leHRfdHJhY2tfdGIubnJfc3RyZWFtX3BhcnQgICAgICAgICAgICAgPSAxOworCWhlYWRlci0+ZXh0X3RyYWNrX3RiLmV0X2VudF9zeiAgICAgICAgICAgICAgICAgID0gMzI7CisJaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkuZXRfcGFydF9udW0gPSAwOworCWhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5LmZtdCAgICAgICAgID0gMTsKKwloZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5mbV90YWJfb2ZmICA9IGh0b25zKDE3NzM2KTsKKwloZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5sYXN0X2hsYl9oaSA9IDA7CisJaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkubGFzdF9obGIgICAgPSBodG9ubChTVHAtPmVvZF9mcmFtZV9sZmEpOworCWhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5Lmxhc3RfcHAJPSBodG9ubChTVHAtPmVvZF9mcmFtZV9wcG9zKTsKKwloZWFkZXItPmRhdF9mbV90YWIuZm1fcGFydF9udW0gICAgICAgICAgICAgICAgICA9IDA7CisJaGVhZGVyLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRfc3ogICAgICAgICAgICAgICAgPSA0OworCWhlYWRlci0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50X2NudCAgICAgICAgICAgICAgID0gaHRvbnMoU1RwLT5maWxlbWFya19jbnQ8T1NfRk1fVEFCX01BWD8KKwkJCQkJCQkJU1RwLT5maWxlbWFya19jbnQ6T1NfRk1fVEFCX01BWCk7CisKKwlyZXN1bHQgID0gX19vc3N0X3dyaXRlX2hlYWRlcihTVHAsIGFTUnBudCwgMHhiYWUsIDUpOworCWlmIChTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyID09IDApCisJCSAgICBvc3N0X3dyaXRlX2ZpbGxlcihTVHAsIGFTUnBudCwgMHhiYjMsIDUpOworCXJlc3VsdCAmPSBfX29zc3Rfd3JpdGVfaGVhZGVyKFNUcCwgYVNScG50LCAgICAgNSwgNSk7CisKKwlpZiAobG9jYXRlX2VvZCkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IExvY2F0aW5nIGJhY2sgdG8gZW9kIGZyYW1lIGFkZHIgJWRcbiIsIG5hbWUsIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpOworI2VuZGlmCisJCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBTVHAtPmVvZF9mcmFtZV9wcG9zLCAwKTsKKwl9CisJaWYgKHJlc3VsdCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBXcml0ZSBoZWFkZXIgZmFpbGVkXG4iLCBuYW1lKTsKKwllbHNlIHsKKwkJbWVtY3B5KFNUcC0+YXBwbGljYXRpb25fc2lnLCAiTElONCIsIDQpOworCQlTVHAtPmxpbnV4X21lZGlhICAgICAgICAgPSAxOworCQlTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gPSA0OworCQlTVHAtPmhlYWRlcl9vayAgICAgICAgICAgPSAxOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG9zc3RfcmVzZXRfaGVhZGVyKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCWlmIChTVHAtPmhlYWRlcl9jYWNoZSAhPSBOVUxMKQorCQltZW1zZXQoU1RwLT5oZWFkZXJfY2FjaGUsIDAsIHNpemVvZihvc19oZWFkZXJfdCkpOworCisJU1RwLT5sb2dpY2FsX2Jsa19udW0gPSBTVHAtPmZyYW1lX3NlcV9udW1iZXIgPSAwOworCVNUcC0+ZnJhbWVfaW5fYnVmZmVyID0gMDsKKwlTVHAtPmVvZF9mcmFtZV9wcG9zID0gU1RwLT5maXJzdF9kYXRhX3Bwb3MgPSAweDAwMDAwMDBBOworCVNUcC0+ZmlsZW1hcmtfY250ID0gMDsKKwlTVHAtPmZpcnN0X21hcmtfcHBvcyA9IFNUcC0+bGFzdF9tYXJrX3Bwb3MgPSBTVHAtPmxhc3RfbWFya19sYm4gPSAtMTsKKwlyZXR1cm4gb3NzdF93cml0ZV9oZWFkZXIoU1RwLCBhU1JwbnQsIDEpOworfQorCitzdGF0aWMgaW50IF9fb3NzdF9hbmFseXplX2hlYWRlcnMoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBwcG9zKQoreworCWNoYXIgICAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCW9zX2hlYWRlcl90ICogaGVhZGVyOworCW9zX2F1eF90ICAgICogYXV4OworCWNoYXIgICAgICAgICAgaWRfc3RyaW5nWzhdOworCWludAkgICAgICBsaW51eF9tZWRpYV92ZXJzaW9uLAorCQkgICAgICB1cGRhdGVfZnJhbWVfY250cjsKKworCWlmIChTVHAtPnJhdykKKwkJcmV0dXJuIDE7CisKKwlpZiAocHBvcyA9PSA1IHx8IHBwb3MgPT0gMHhiYWUgfHwgU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0KSB7CisJCWlmIChvc3N0X3NldF9mcmFtZV9wb3NpdGlvbihTVHAsIGFTUnBudCwgcHBvcywgMCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBDb3VsZG4ndCBwb3NpdGlvbiB0YXBlXG4iLCBuYW1lKTsKKwkJb3NzdF93YWl0X3JlYWR5KFNUcCwgYVNScG50LCA2MCAqIDE1LCAwKTsKKwkJaWYgKG9zc3RfaW5pdGlhdGVfcmVhZCAoU1RwLCBhU1JwbnQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBDb3VsZG4ndCBpbml0aWF0ZSByZWFkXG4iLCBuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChvc3N0X3JlYWRfZnJhbWUoU1RwLCBhU1JwbnQsIDE4MCkpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCByZWFkIGhlYWRlciBmcmFtZVxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCWhlYWRlciA9IChvc19oZWFkZXJfdCAqKSBTVHAtPmJ1ZmZlci0+Yl9kYXRhOwkvKiB3YXJuaW5nOiBvbmx5IGZpcnN0IHNlZ21lbnQgYWRkcmVzc2FibGUgKi8KKwlhdXggPSBTVHAtPmJ1ZmZlci0+YXV4OworCWlmIChhdXgtPmZyYW1lX3R5cGUgIT0gT1NfRlJBTUVfVFlQRV9IRUFERVIpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBub24taGVhZGVyIGZyYW1lICglZClcbiIsIG5hbWUsIHBwb3MpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwlpZiAobnRvaGwoYXV4LT5mcmFtZV9zZXFfbnVtKSAgICAgICAgICAgICAgIT0gMCAgICAgICAgICAgICAgICAgICB8fAorCSAgICBudG9obChhdXgtPmxvZ2ljYWxfYmxrX251bSkgICAgICAgICAgICAhPSAwICAgICAgICAgICAgICAgICAgIHx8CisJICAgICAgICAgIGF1eC0+cGFydGl0aW9uLnBhcnRpdGlvbl9udW0gICAgICE9IE9TX0NPTkZJR19QQVJUSVRJT04gfHwKKwkgICAgbnRvaGwoYXV4LT5wYXJ0aXRpb24uZmlyc3RfZnJhbWVfcHBvcykgIT0gMCAgICAgICAgICAgICAgICAgICB8fAorCSAgICBudG9obChhdXgtPnBhcnRpdGlvbi5sYXN0X2ZyYW1lX3Bwb3MpICAhPSAweGJiNyAgICAgICAgICAgICAgICkgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEludmFsaWQgaGVhZGVyIGZyYW1lICglZCwlZCwlZCwlZCwlZClcbiIsIG5hbWUsCisJCQkJbnRvaGwoYXV4LT5mcmFtZV9zZXFfbnVtKSwgbnRvaGwoYXV4LT5sb2dpY2FsX2Jsa19udW0pLAorCQkJICAgICAgIAlhdXgtPnBhcnRpdGlvbi5wYXJ0aXRpb25fbnVtLCBudG9obChhdXgtPnBhcnRpdGlvbi5maXJzdF9mcmFtZV9wcG9zKSwKKwkJCSAgICAgICAJbnRvaGwoYXV4LT5wYXJ0aXRpb24ubGFzdF9mcmFtZV9wcG9zKSk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJuY21wKGhlYWRlci0+aWRlbnRfc3RyLCAiQURSX1NFUSIsIDcpICE9IDAgJiYKKwkgICAgc3RybmNtcChoZWFkZXItPmlkZW50X3N0ciwgIkFEUi1TRVEiLCA3KSAhPSAwKSB7CisJCXN0cmxjcHkoaWRfc3RyaW5nLCBoZWFkZXItPmlkZW50X3N0ciwgOCk7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW52YWxpZCBoZWFkZXIgaWRlbnRpZmljYXRpb24gc3RyaW5nICVzXG4iLCBuYW1lLCBpZF9zdHJpbmcpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwl1cGRhdGVfZnJhbWVfY250ciA9IG50b2hsKGF1eC0+dXBkYXRlX2ZyYW1lX2NudHIpOworCWlmICh1cGRhdGVfZnJhbWVfY250ciA8IFNUcC0+dXBkYXRlX2ZyYW1lX2NudHIpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTa2lwcGluZyBmcmFtZSAlZCB3aXRoIHVwZGF0ZV9mcmFtZV9jb3VudGVyICVkPCVkXG4iLAorCQkJCSAgIG5hbWUsIHBwb3MsIHVwZGF0ZV9mcmFtZV9jbnRyLCBTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJaWYgKGhlYWRlci0+bWFqb3JfcmV2ICE9IDEgfHwgaGVhZGVyLT5taW5vcl9yZXYgIT0gNCApIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiAlcyByZXZpc2lvbiAlZC4lZCBkZXRlY3RlZCAoMS40IHN1cHBvcnRlZClcbiIsIAorCQkJCSBuYW1lLCAoaGVhZGVyLT5tYWpvcl9yZXYgIT0gMSB8fCBoZWFkZXItPm1pbm9yX3JldiA8IDIgfHwgCisJCQkJICAgICAgIGhlYWRlci0+bWlub3JfcmV2ICA+IDQgKT8gIkludmFsaWQiIDogIldhcm5pbmc6IiwKKwkJCQkgaGVhZGVyLT5tYWpvcl9yZXYsIGhlYWRlci0+bWlub3JfcmV2KTsKKyNlbmRpZgorCQlpZiAoaGVhZGVyLT5tYWpvcl9yZXYgIT0gMSB8fCBoZWFkZXItPm1pbm9yX3JldiA8IDIgfHwgaGVhZGVyLT5taW5vcl9yZXYgPiA0KQorCQkJcmV0dXJuIDA7CisJfQorI2lmIERFQlVHCisJaWYgKGhlYWRlci0+cHRfcGFyX251bSAhPSAxKQorCQlwcmludGsoS0VSTl9JTkZPICIlczpXOiAlZCBwYXJ0aXRpb25zIGRlZmluZWQsIG9ubHkgb25lIHN1cHBvcnRlZFxuIiwgCisJCQkJIG5hbWUsIGhlYWRlci0+cHRfcGFyX251bSk7CisjZW5kaWYKKwltZW1jcHkoaWRfc3RyaW5nLCBhdXgtPmFwcGxpY2F0aW9uX3NpZywgNCk7CisJaWRfc3RyaW5nWzRdID0gMDsKKwlpZiAobWVtY21wKGlkX3N0cmluZywgIkxJTiIsIDMpID09IDApIHsKKwkJU1RwLT5saW51eF9tZWRpYSA9IDE7CisJCWxpbnV4X21lZGlhX3ZlcnNpb24gPSBpZF9zdHJpbmdbM10gLSAnMCc7CisJCWlmIChsaW51eF9tZWRpYV92ZXJzaW9uICE9IDQpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBMaW51eCBtZWRpYSB2ZXJzaW9uICVkIGRldGVjdGVkIChjdXJyZW50IDQpXG4iLAorCQkJCQkgbmFtZSwgbGludXhfbWVkaWFfdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogTm9uIExpbnV4IG1lZGlhIGRldGVjdGVkICglcylcbiIsIG5hbWUsIGlkX3N0cmluZyk7CisJCXJldHVybiAwOworCX0KKwlpZiAobGludXhfbWVkaWFfdmVyc2lvbiA8IFNUcC0+bGludXhfbWVkaWFfdmVyc2lvbikgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNraXBwaW5nIGZyYW1lICVkIHdpdGggbGludXhfbWVkaWFfdmVyc2lvbiAlZFxuIiwKKwkJCQkgIG5hbWUsIHBwb3MsIGxpbnV4X21lZGlhX3ZlcnNpb24pOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwlpZiAobGludXhfbWVkaWFfdmVyc2lvbiA+IFNUcC0+bGludXhfbWVkaWFfdmVyc2lvbikgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZyYW1lICVkIHNldHMgbGludXhfbWVkaWFfdmVyc2lvbiB0byAlZFxuIiwKKwkJCQkgICBuYW1lLCBwcG9zLCBsaW51eF9tZWRpYV92ZXJzaW9uKTsKKyNlbmRpZgorCQltZW1jcHkoU1RwLT5hcHBsaWNhdGlvbl9zaWcsIGlkX3N0cmluZywgNSk7CisJCVNUcC0+bGludXhfbWVkaWFfdmVyc2lvbiA9IGxpbnV4X21lZGlhX3ZlcnNpb247CisJCVNUcC0+dXBkYXRlX2ZyYW1lX2NudHIgPSAtMTsKKwl9CisJaWYgKHVwZGF0ZV9mcmFtZV9jbnRyID4gU1RwLT51cGRhdGVfZnJhbWVfY250cikgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZyYW1lICVkIHNldHMgdXBkYXRlX2ZyYW1lX2NvdW50ZXIgdG8gJWRcbiIsCisJCQkJICAgbmFtZSwgcHBvcywgdXBkYXRlX2ZyYW1lX2NudHIpOworI2VuZGlmCisJCWlmIChTVHAtPmhlYWRlcl9jYWNoZSA9PSBOVUxMKSB7CisJCQlpZiAoKFNUcC0+aGVhZGVyX2NhY2hlID0gKG9zX2hlYWRlcl90ICopdm1hbGxvYyhzaXplb2Yob3NfaGVhZGVyX3QpKSkgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogRmFpbGVkIHRvIGFsbG9jYXRlIGhlYWRlciBjYWNoZVxuIiwgbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFsbG9jYXRlZCBtZW1vcnkgZm9yIGhlYWRlciBjYWNoZVxuIiwgbmFtZSk7CisjZW5kaWYKKwkJfQorCQlvc3N0X2NvcHlfZnJvbV9idWZmZXIoU1RwLT5idWZmZXIsICh1bnNpZ25lZCBjaGFyICopU1RwLT5oZWFkZXJfY2FjaGUpOworCQloZWFkZXIgPSBTVHAtPmhlYWRlcl9jYWNoZTsJLyogZnVydGhlciBhY2Nlc3NlcyBmcm9tIGNhY2hlZCAoZnVsbCkgY29weSAqLworCisJCVNUcC0+d3J0X3Bhc3NfY250ciAgICAgPSBudG9ocyhoZWFkZXItPnBhcnRpdGlvblswXS53cnRfcGFzc19jbnRyKTsKKwkJU1RwLT5maXJzdF9kYXRhX3Bwb3MgICA9IG50b2hsKGhlYWRlci0+cGFydGl0aW9uWzBdLmZpcnN0X2ZyYW1lX3Bwb3MpOworCQlTVHAtPmVvZF9mcmFtZV9wcG9zICAgID0gbnRvaGwoaGVhZGVyLT5wYXJ0aXRpb25bMF0uZW9kX2ZyYW1lX3Bwb3MpOworCQlTVHAtPmVvZF9mcmFtZV9sZmEgICAgID0gbnRvaGwoaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkubGFzdF9obGIpOworCQlTVHAtPmZpbGVtYXJrX2NudCAgICAgID0gbnRvaGwoYXV4LT5maWxlbWFya19jbnQpOworCQlTVHAtPmZpcnN0X21hcmtfcHBvcyAgID0gbnRvaGwoYXV4LT5uZXh0X21hcmtfcHBvcyk7CisJCVNUcC0+bGFzdF9tYXJrX3Bwb3MgICAgPSBudG9obChhdXgtPmxhc3RfbWFya19wcG9zKTsKKwkJU1RwLT5sYXN0X21hcmtfbGJuICAgICA9IG50b2hsKGF1eC0+bGFzdF9tYXJrX2xibik7CisJCVNUcC0+dXBkYXRlX2ZyYW1lX2NudHIgPSB1cGRhdGVfZnJhbWVfY250cjsKKyNpZiBERUJVRworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IERldGVjdGVkIHdyaXRlIHBhc3MgJWQsIHVwZGF0ZSBmcmFtZSBjb3VudGVyICVkLCBmaWxlbWFyayBjb3VudGVyICVkXG4iLAorCQkJICBuYW1lLCBTVHAtPndydF9wYXNzX2NudHIsIFNUcC0+dXBkYXRlX2ZyYW1lX2NudHIsIFNUcC0+ZmlsZW1hcmtfY250KTsKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBmaXJzdCBkYXRhIGZyYW1lIG9uIHRhcGUgPSAlZCwgbGFzdCA9ICVkLCBlb2QgZnJhbWUgPSAlZFxuIiwgbmFtZSwKKwkJCSAgU1RwLT5maXJzdF9kYXRhX3Bwb3MsCisJCQkgIG50b2hsKGhlYWRlci0+cGFydGl0aW9uWzBdLmxhc3RfZnJhbWVfcHBvcyksCisJCQkgIG50b2hsKGhlYWRlci0+cGFydGl0aW9uWzBdLmVvZF9mcmFtZV9wcG9zKSk7CisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogZmlyc3QgbWFyayBvbiB0YXBlID0gJWQsIGxhc3QgPSAlZCwgZW9kIGZyYW1lID0gJWRcbiIsIAorCQkJICBuYW1lLCBTVHAtPmZpcnN0X21hcmtfcHBvcywgU1RwLT5sYXN0X21hcmtfcHBvcywgU1RwLT5lb2RfZnJhbWVfcHBvcyk7CisjZW5kaWYKKwkJaWYgKGhlYWRlci0+bWlub3JfcmV2IDwgNCAmJiBTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gPT0gNCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBNb3ZpbmcgZmlsZW1hcmsgbGlzdCB0byBBRFIgMS40IGxvY2F0aW9uXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJbWVtY3B5KCh2b2lkICopaGVhZGVyLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnQsIAorCQkJICAgICAgICh2b2lkICopaGVhZGVyLT5vbGRfZmlsZW1hcmtfbGlzdCwgc2l6ZW9mKGhlYWRlci0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50KSk7CisJCQltZW1zZXQoKHZvaWQgKiloZWFkZXItPm9sZF9maWxlbWFya19saXN0LCAwLCBzaXplb2YoaGVhZGVyLT5vbGRfZmlsZW1hcmtfbGlzdCkpOworCQl9CisJCWlmIChoZWFkZXItPm1pbm9yX3JldiA9PSA0ICAgJiYKKwkJICAgIChoZWFkZXItPmV4dF90cmtfdGJfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBodG9ucygxNzE5MikgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+cGFydGl0aW9uWzBdLnBhcnRpdGlvbl9udW0gICAgICAgICAgICAgICE9IE9TX0RBVEFfUEFSVElUSU9OICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5wYXJ0aXRpb25bMF0ucGFyX2Rlc2NfdmVyICAgICAgICAgICAgICAgIT0gT1NfUEFSVElUSU9OX1ZFUlNJT04gICAgICAgfHwKKwkJICAgICBoZWFkZXItPnBhcnRpdGlvblswXS5sYXN0X2ZyYW1lX3Bwb3MgICAgICAgICAgICAhPSBodG9ubChTVHAtPmNhcGFjaXR5KSAgICAgICB8fAorCQkgICAgIGhlYWRlci0+Y2ZnX2NvbF93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGh0b25sKDIwKSAgICAgICAgICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5kYXRfY29sX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gaHRvbmwoMTUwMCkgICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPnFmYV9jb2xfd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBodG9ubCgwKSAgICAgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZXh0X3RyYWNrX3RiLm5yX3N0cmVhbV9wYXJ0ICAgICAgICAgICAgICE9IDEgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5leHRfdHJhY2tfdGIuZXRfZW50X3N6ICAgICAgICAgICAgICAgICAgIT0gMzIgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5ldF9wYXJ0X251bSAhPSBPU19EQVRBX1BBUlRJVElPTiAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5LmZtdCAgICAgICAgICE9IDEgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisJCSAgICAgaGVhZGVyLT5leHRfdHJhY2tfdGIuZGF0X2V4dF90cmtfZXkuZm1fdGFiX29mZiAgIT0gaHRvbnMoMTc3MzYpICAgICAgICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmV4dF90cmFja190Yi5kYXRfZXh0X3Rya19leS5sYXN0X2hsYl9oaSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZXh0X3RyYWNrX3RiLmRhdF9leHRfdHJrX2V5Lmxhc3RfcHAgICAgICE9IGh0b25sKFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIHx8CisJCSAgICAgaGVhZGVyLT5kYXRfZm1fdGFiLmZtX3BhcnRfbnVtICAgICAgICAgICAgICAgICAgIT0gT1NfREFUQV9QQVJUSVRJT04gICAgICAgICAgfHwKKwkJICAgICBoZWFkZXItPmRhdF9mbV90YWIuZm1fdGFiX2VudF9zeiAgICAgICAgICAgICAgICAhPSA0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorCQkgICAgIGhlYWRlci0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50X2NudCAgICAgICAgICAgICAgICE9CisJCQkgICAgIGh0b25zKFNUcC0+ZmlsZW1hcmtfY250PE9TX0ZNX1RBQl9NQVg/U1RwLT5maWxlbWFya19jbnQ6T1NfRk1fVEFCX01BWCkpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogRmFpbGVkIGNvbnNpc3RlbmN5IGNoZWNrIEFEUiAxLjQgZm9ybWF0XG4iLCBuYW1lKTsKKworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG9zc3RfYW5hbHl6ZV9oZWFkZXJzKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCWludAlwb3NpdGlvbiwgcHBvczsKKwlpbnQJZmlyc3QsIGxhc3Q7CisJaW50CXZhbGlkID0gMDsKKwljaGFyICAqIG5hbWUgID0gdGFwZV9uYW1lKFNUcCk7CisKKwlwb3NpdGlvbiA9IG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KTsKKworCWlmIChTVHAtPnJhdykgeworCQlTVHAtPmhlYWRlcl9vayA9IFNUcC0+bGludXhfbWVkaWEgPSAxOworCQlTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gPSAwOworCQlyZXR1cm4gMTsKKwl9CisJU1RwLT5oZWFkZXJfb2sgPSBTVHAtPmxpbnV4X21lZGlhID0gU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uID0gMDsKKwlTVHAtPndydF9wYXNzX2NudHIgPSBTVHAtPnVwZGF0ZV9mcmFtZV9jbnRyID0gLTE7CisJU1RwLT5lb2RfZnJhbWVfcHBvcyA9IFNUcC0+Zmlyc3RfZGF0YV9wcG9zID0gLTE7CisJU1RwLT5maXJzdF9tYXJrX3Bwb3MgPSBTVHAtPmxhc3RfbWFya19wcG9zID0gU1RwLT5sYXN0X21hcmtfbGJuID0gLTE7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFkaW5nIGhlYWRlclxuIiwgbmFtZSk7CisjZW5kaWYKKworCS8qIG9wdGltaXphdGlvbiBmb3Igc3BlZWQgLSBpZiB3ZSBhcmUgcG9zaXRpb25lZCBhdCBwcG9zIDEwLCByZWFkIHNlY29uZCBncm91cCBmaXJzdCAgKi8JCisJLyogVE9ETyB0cnkgdGhlIEFEUiAxLjEgbG9jYXRpb25zIGZvciB0aGUgc2Vjb25kIGdyb3VwIGlmIHdlIGhhdmUgbm8gdmFsaWQgb25lIHlldC4uLiAqLworCisJZmlyc3QgPSBwb3NpdGlvbj09MTA/MHhiYWU6IDU7CisJbGFzdCAgPSBwb3NpdGlvbj09MTA/MHhiYjM6MTA7CisKKwlmb3IgKHBwb3MgPSBmaXJzdDsgcHBvcyA8IGxhc3Q7IHBwb3MrKykKKwkJaWYgKF9fb3NzdF9hbmFseXplX2hlYWRlcnMoU1RwLCBhU1JwbnQsIHBwb3MpKQorCQkJdmFsaWQgPSAxOworCisJZmlyc3QgPSBwb3NpdGlvbj09MTA/IDU6MHhiYWU7CisJbGFzdCAgPSBwb3NpdGlvbj09MTA/MTA6MHhiYjM7CisKKwlmb3IgKHBwb3MgPSBmaXJzdDsgcHBvcyA8IGxhc3Q7IHBwb3MrKykKKwkJaWYgKF9fb3NzdF9hbmFseXplX2hlYWRlcnMoU1RwLCBhU1JwbnQsIHBwb3MpKQorCQkJdmFsaWQgPSAxOworCisJaWYgKCF2YWxpZCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IEZhaWxlZCB0byBmaW5kIHZhbGlkIEFEUkwgaGVhZGVyLCBuZXcgbWVkaWE/XG4iLCBuYW1lKTsKKwkJU1RwLT5lb2RfZnJhbWVfcHBvcyA9IFNUcC0+Zmlyc3RfZGF0YV9wcG9zID0gMDsKKwkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIDEwLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwb3NpdGlvbiA8PSBTVHAtPmZpcnN0X2RhdGFfcHBvcykgeworCQlwb3NpdGlvbiA9IFNUcC0+Zmlyc3RfZGF0YV9wcG9zOworCQlTVHAtPnBzWzBdLmRydl9maWxlID0gU1RwLT5wc1swXS5kcnZfYmxvY2sgPSBTVHAtPmZyYW1lX3NlcV9udW1iZXIgPSBTVHAtPmxvZ2ljYWxfYmxrX251bSA9IDA7CisJfQorCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBwb3NpdGlvbiwgMCk7CisJU1RwLT5oZWFkZXJfb2sgPSAxOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgb3NzdF92ZXJpZnlfcG9zaXRpb24oc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJaW50CWZyYW1lX3Bvc2l0aW9uICA9IFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb247CisJaW50CWZyYW1lX3NlcV9udW1iciA9IFNUcC0+ZnJhbWVfc2VxX251bWJlcjsKKwlpbnQJbG9naWNhbF9ibGtfbnVtID0gU1RwLT5sb2dpY2FsX2Jsa19udW07CisgICAgICAgCWludAloYWxmd2F5X2ZyYW1lICAgPSBTVHAtPmZyYW1lX2luX2J1ZmZlcjsKKwlpbnQJcmVhZF9wb2ludGVyICAgID0gU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlcjsKKwlpbnQJcHJldl9tYXJrX3Bwb3MgID0gLTE7CisJaW50CWFjdHVhbF9tYXJrX3Bwb3MsIGksIG47CisjaWYgREVCVUcKKwljaGFyICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFZlcmlmeSB0aGF0IHRoZSB0YXBlIGlzIHJlYWxseSB0aGUgb25lIHdlIHRoaW5rIGJlZm9yZSB3cml0aW5nXG4iLCBuYW1lKTsKKyNlbmRpZgorCW9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50LCBmcmFtZV9wb3NpdGlvbiAtIDEsIDApOworCWlmIChvc3N0X2dldF9sb2dpY2FsX2ZyYW1lKFNUcCwgYVNScG50LCAtMSwgMCkgPCAwKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQ291bGRuJ3QgZ2V0IGxvZ2ljYWwgYmxrIG51bSBpbiB2ZXJpZnlfcG9zaXRpb25cbiIsIG5hbWUpOworI2VuZGlmCisJCXJldHVybiAoLUVJTyk7CisJfQorCWlmIChTVHAtPmxpbnV4X21lZGlhX3ZlcnNpb24gPj0gNCkgeworCQlmb3IgKGk9MDsgaTxTVHAtPmZpbGVtYXJrX2NudDsgaSsrKQorCQkJaWYgKChuPW50b2hsKFNUcC0+aGVhZGVyX2NhY2hlLT5kYXRfZm1fdGFiLmZtX3RhYl9lbnRbaV0pKSA8IGZyYW1lX3Bvc2l0aW9uKQorCQkJCXByZXZfbWFya19wcG9zID0gbjsKKwl9IGVsc2UKKwkJcHJldl9tYXJrX3Bwb3MgPSBmcmFtZV9wb3NpdGlvbiAtIDE7ICAvKiB1c3VhbGx5IC0gd2UgZG9uJ3QgcmVhbGx5IGtub3cgKi8KKwlhY3R1YWxfbWFya19wcG9zID0gU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSA9PSBPU19GUkFNRV9UWVBFX01BUktFUiA/CisJCQkJZnJhbWVfcG9zaXRpb24gLSAxIDogbnRvaGwoU1RwLT5idWZmZXItPmF1eC0+bGFzdF9tYXJrX3Bwb3MpOworCWlmIChmcmFtZV9wb3NpdGlvbiAgIT0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiAgICAgICAgICAgICAgICAgICB8fAorCSAgICBmcmFtZV9zZXFfbnVtYnIgIT0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyICsgKGhhbGZ3YXlfZnJhbWU/MDoxKSB8fAorCSAgICBwcmV2X21hcmtfcHBvcyAgIT0gYWN0dWFsX21hcmtfcHBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBCbG9jayBtaXNtYXRjaDogZnBwb3MgJWQtJWQsIGZzZXEgJWQtJWQsIG1hcmsgJWQtJWRcbiIsIG5hbWUsCisJCQkJICBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBmcmFtZV9wb3NpdGlvbiwgCisJCQkJICBTVHAtPmZyYW1lX3NlcV9udW1iZXIgKyAoaGFsZndheV9mcmFtZT8wOjEpLAorCQkJCSAgZnJhbWVfc2VxX251bWJyLCBhY3R1YWxfbWFya19wcG9zLCBwcmV2X21hcmtfcHBvcyk7CisjZW5kaWYKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJaWYgKGhhbGZ3YXlfZnJhbWUpIHsKKwkJLyogcHJlcGFyZSBidWZmZXIgZm9yIGFwcGVuZCBhbmQgcmV3cml0ZSBvbiB0b3Agb2Ygb3JpZ2luYWwgKi8KKwkJb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCBhU1JwbnQsIGZyYW1lX3Bvc2l0aW9uIC0gMSwgMCk7CisJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgID0gcmVhZF9wb2ludGVyOworCQlTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyA9IFNUX1dSSVRJTkc7CisJCVNUcC0+ZGlydHkgICAgICAgICAgICAgICAgID0gMTsKKwl9CisJU1RwLT5mcmFtZV9pbl9idWZmZXIgID0gaGFsZndheV9mcmFtZTsKKwlTVHAtPmZyYW1lX3NlcV9udW1iZXIgPSBmcmFtZV9zZXFfbnVtYnI7CisJU1RwLT5sb2dpY2FsX2Jsa19udW0gID0gbG9naWNhbF9ibGtfbnVtOworCXJldHVybiAwOworfQorCisvKiBBY2MuIHRvIE9uU3RyZWFtLCB0aGUgdmVycy4gbnVtYmVyaW5nIGlzIHRoZSBmb2xsb3dpbmc6CisgKiBYLlhYIGZvciByZWxlYXNlZCB2ZXJzaW9ucyAoWD1kaWdpdCksIAorICogWFhYWSBmb3IgdW5yZWxlYXNlZCB2ZXJzaW9ucyAoWT1sZXR0ZXIpCisgKiBPcmRlcmluZyAxLjA1IDwgMTA2QSA8IDEwNkIgPCAuLi4gIDwgMTA2YSA8IC4uLiA8IDEuMDYKKyAqIFRoaXMgZm4gbWFrZXMgbW9ub3RvbiBudW1iZXJzIG91dCBvZiB0aGlzIHNjaGVtZSAuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBvc3N0X3BhcnNlX2Zpcm13YXJlX3JldiAoY29uc3QgY2hhciAqIHN0cikKK3sKKwlpZiAoc3RyWzFdID09ICcuJykgeworCQlyZXR1cm4gKHN0clswXS0nMCcpKjEwMDAwCisJCQkrKHN0clsyXS0nMCcpKjEwMDAKKwkJCSsoc3RyWzNdLScwJykqMTAwOworCX0gZWxzZSB7CisJCXJldHVybiAoc3RyWzBdLScwJykqMTAwMDAKKwkJCSsoc3RyWzFdLScwJykqMTAwMAorCQkJKyhzdHJbMl0tJzAnKSoxMDAgLSAxMDAKKwkJCSsoc3RyWzNdLSdAJyk7CisJfQorfQorCisvKgorICogQ29uZmlndXJlIHRoZSBPblN0cmVhbSBTQ0lJIHRhcGUgZHJpdmUgZm9yIGRlZmF1bHQgb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgb3NzdF9jb25maWd1cmVfb25zdHJlYW0oc3RydWN0IG9zc3RfdGFwZSAqU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgY21kW01BWF9DT01NQU5EX1NJWkVdOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAgICAgICAgICAgICAgICAgKiBTUnBudCA9ICogYVNScG50OworCW9zc3RfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QgKiBoZWFkZXI7CisJb3NzdF9ibG9ja19zaXplX3BhZ2VfdCAgICAgICAqIGJzOworCW9zc3RfY2FwYWJpbGl0aWVzX3BhZ2VfdCAgICAgKiBjcDsKKwlvc3N0X3RhcGVfcGFyYW10cl9wYWdlX3QgICAgICogcHJtOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZV9idWZmZXJfc2l6ZTsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKSB7CisjaWYgREVCVUcKKwkgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTm90IFJlYWR5XG4iLCBuYW1lKTsKKyNlbmRpZgorCSAgICByZXR1cm4gKC1FSU8pOworCX0KKwkKKwlpZiAoU1RwLT5vc19md19yZXYgPCAxMDYwMCkgeworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczpJOiBPbGQgT25TdHJlYW0gZmlybXdhcmUgcmV2aXNpb24gZGV0ZWN0ZWQgKCVzKSxcbiIsIG5hbWUsIFNUcC0+ZGV2aWNlLT5yZXYpOworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczpJOiBhbiB1cGdyYWRlIHRvIHZlcnNpb24gMS4wNiBvciBhYm92ZSBpcyByZWNvbW1lbmRlZFxuIiwgbmFtZSk7CisJfQorCisJLyoKKwkgKiBDb25maWd1cmUgMzIuNUtCIChkYXRhK2F1eCkgZnJhbWUgc2l6ZS4KKyAgICAgICAgICogR2V0IHRoZSBjdXJyZW50IGZyYW1lIHNpemUgZnJvbSB0aGUgYmxvY2sgc2l6ZSBtb2RlIHBhZ2UKKwkgKi8KKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBNT0RFX1NFTlNFOworCWNtZFsxXSA9IDg7CisJY21kWzJdID0gQkxPQ0tfU0laRV9QQUdFOworCWNtZFs0XSA9IEJMT0NLX1NJWkVfUEFHRV9MRU5HVEggKyBNT0RFX0hFQURFUl9MRU5HVEg7CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX0ZST01fREVWSUNFLCBTVHAtPnRpbWVvdXQsIDAsIDEpOworCWlmIChTUnBudCA9PSBOVUxMKSB7CisjaWYgREVCVUcKKyAJICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIm9zc3QgOkQ6IEJ1c3lcbiIpOworI2VuZGlmCisJICAgIHJldHVybiAoLUVCVVNZKTsKKwl9CisJKmFTUnBudCA9IFNScG50OworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisJICAgIHByaW50ayAoS0VSTl9FUlIgIiVzOkU6IENhbid0IGdldCB0YXBlIGJsb2NrIHNpemUgbW9kZSBwYWdlXG4iLCBuYW1lKTsKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisKKwloZWFkZXIgPSAob3NzdF9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCAqKSAoU1RwLT5idWZmZXIpLT5iX2RhdGE7CisJYnMgPSAob3NzdF9ibG9ja19zaXplX3BhZ2VfdCAqKSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhICsgc2l6ZW9mKG9zc3RfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QpICsgaGVhZGVyLT5iZGwpOworCisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiAzMktCIHBsYXkgYmFjazogJXNcbiIsICAgbmFtZSwgYnMtPnBsYXkzMiAgICAgPyAiWWVzIiA6ICJObyIpOworCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IDMyLjVLQiBwbGF5IGJhY2s6ICVzXG4iLCBuYW1lLCBicy0+cGxheTMyXzUgICA/ICJZZXMiIDogIk5vIik7CisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogMzJLQiByZWNvcmQ6ICVzXG4iLCAgICAgIG5hbWUsIGJzLT5yZWNvcmQzMiAgID8gIlllcyIgOiAiTm8iKTsKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiAzMi41S0IgcmVjb3JkOiAlc1xuIiwgICAgbmFtZSwgYnMtPnJlY29yZDMyXzUgPyAiWWVzIiA6ICJObyIpOworI2VuZGlmCisKKwkvKgorCSAqIENvbmZpZ3VyZSBkZWZhdWx0IGF1dG8gY29sdW1ucyBtb2RlLCAzMi41S0IgdHJhbnNmZXIgbW9kZQorCSAqLyAKKwlicy0+b25lID0gMTsKKwlicy0+cGxheTMyID0gMDsKKwlicy0+cGxheTMyXzUgPSAxOworCWJzLT5yZWNvcmQzMiA9IDA7CisJYnMtPnJlY29yZDMyXzUgPSAxOworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CisJY21kWzFdID0gMHgxMDsKKwljbWRbNF0gPSBCTE9DS19TSVpFX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9UT19ERVZJQ0UsIFNUcC0+dGltZW91dCwgMCwgMSk7CisJKmFTUnBudCA9IFNScG50OworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisJICAgIHByaW50ayAoS0VSTl9FUlIgIiVzOkU6IENvdWxkbid0IHNldCB0YXBlIGJsb2NrIHNpemUgbW9kZSBwYWdlXG4iLCBuYW1lKTsKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisKKyNpZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gIiVzOkQ6IERyaXZlIEJsb2NrIFNpemUgY2hhbmdlZCB0byAzMi41S1xuIiwgbmFtZSk7CisJIC8qCisJICogSW4gZGVidWcgbW9kZSwgd2Ugd2FudCB0byBzZWUgYXMgbWFueSBlcnJvcnMgYXMgcG9zc2libGUKKwkgKiB0byB0ZXN0IHRoZSBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20uCisJICovCisJb3NzdF9zZXRfcmV0cmllcyhTVHAsIGFTUnBudCwgMCk7CisJU1JwbnQgPSAqIGFTUnBudDsKKyNlbmRpZgorCisJLyoKKwkgKiBTZXQgdmVuZG9yIG5hbWUgdG8gJ0xJTjQnIGZvciAiTGludXggc3VwcG9ydCB2ZXJzaW9uIDQiLgorCSAqLworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CisJY21kWzFdID0gMHgxMDsKKwljbWRbNF0gPSBWRU5ET1JfSURFTlRfUEFHRV9MRU5HVEggKyBNT0RFX0hFQURFUl9MRU5HVEg7CisKKwloZWFkZXItPm1vZGVfZGF0YV9sZW5ndGggPSBWRU5ET1JfSURFTlRfUEFHRV9MRU5HVEggKyBNT0RFX0hFQURFUl9MRU5HVEggLSAxOworCWhlYWRlci0+bWVkaXVtX3R5cGUgICAgICA9IDA7CS8qIE1lZGl1bSBUeXBlIC0gaWdub3JpbmcgKi8KKwloZWFkZXItPmRzcCAgICAgICAgICAgICAgPSAwOwkvKiBSZXNlcnZlZCAqLworCWhlYWRlci0+YmRsICAgICAgICAgICAgICA9IDA7CS8qIEJsb2NrIERlc2NyaXB0b3IgTGVuZ3RoICovCisJCisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDBdID0gVkVORE9SX0lERU5UX1BBR0UgfCAoMSA8PCA3KTsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgMV0gPSA2OworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyAyXSA9ICdMJzsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgM10gPSAnSSc7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDRdID0gJ04nOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyA1XSA9ICc0JzsKKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgNl0gPSAwOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyA3XSA9IDA7CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICIlczpFOiBDb3VsZG4ndCBzZXQgdmVuZG9yIG5hbWUgdG8gJXNcbiIsIG5hbWUsIAorCQkJKGNoYXIgKikgKChTVHAtPmJ1ZmZlciktPmJfZGF0YSArIE1PREVfSEVBREVSX0xFTkdUSCArIDIpKTsKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBNT0RFX1NFTlNFOworCWNtZFsxXSA9IDg7CisJY21kWzJdID0gQ0FQQUJJTElUSUVTX1BBR0U7CisJY21kWzRdID0gQ0FQQUJJTElUSUVTX1BBR0VfTEVOR1RIICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKwkqYVNScG50ID0gU1JwbnQ7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICIlczpFOiBDYW4ndCBnZXQgY2FwYWJpbGl0aWVzIHBhZ2VcbiIsIG5hbWUpOworCSAgICByZXR1cm4gKC1FSU8pOworCX0KKworCWhlYWRlciA9IChvc3N0X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90ICopIChTVHAtPmJ1ZmZlciktPmJfZGF0YTsKKwljcCAgICAgPSAob3NzdF9jYXBhYmlsaXRpZXNfcGFnZV90ICAgICopICgoU1RwLT5idWZmZXIpLT5iX2RhdGEgKworCQkgc2l6ZW9mKG9zc3RfbW9kZV9wYXJhbWV0ZXJfaGVhZGVyX3QpICsgaGVhZGVyLT5iZGwpOworCisJZHJpdmVfYnVmZmVyX3NpemUgPSBudG9ocyhjcC0+YnVmZmVyX3NpemUpIC8gMjsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IE1PREVfU0VOU0U7CisJY21kWzFdID0gODsKKwljbWRbMl0gPSBUQVBFX1BBUkFNVFJfUEFHRTsKKwljbWRbNF0gPSBUQVBFX1BBUkFNVFJfUEFHRV9MRU5HVEggKyBNT0RFX0hFQURFUl9MRU5HVEg7CisKKwlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX0ZST01fREVWSUNFLCBTVHAtPnRpbWVvdXQsIDAsIDEpOworCSphU1JwbnQgPSBTUnBudDsKKworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisJICAgIHByaW50ayAoS0VSTl9FUlIgIiVzOkU6IENhbid0IGdldCB0YXBlIHBhcmFtZXRlciBwYWdlXG4iLCBuYW1lKTsKKwkgICAgcmV0dXJuICgtRUlPKTsKKwl9CisKKwloZWFkZXIgPSAob3NzdF9tb2RlX3BhcmFtZXRlcl9oZWFkZXJfdCAqKSAoU1RwLT5idWZmZXIpLT5iX2RhdGE7CisJcHJtICAgID0gKG9zc3RfdGFwZV9wYXJhbXRyX3BhZ2VfdCAgICAqKSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhICsKKwkJIHNpemVvZihvc3N0X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90KSArIGhlYWRlci0+YmRsKTsKKworCVNUcC0+ZGVuc2l0eSAgPSBwcm0tPmRlbnNpdHk7CisJU1RwLT5jYXBhY2l0eSA9IG50b2hzKHBybS0+c2VndHJrKSAqIG50b2hzKHBybS0+dHJrcyk7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBEZW5zaXR5ICVkLCB0YXBlIGxlbmd0aDogJWRNQiwgZHJpdmUgYnVmZmVyIHNpemU6ICVkS0JcbiIsCisJCQkgIG5hbWUsIFNUcC0+ZGVuc2l0eSwgU1RwLT5jYXBhY2l0eSAvIDMyLCBkcml2ZV9idWZmZXJfc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiAwOworCQorfQorCisKKy8qIFN0ZXAgb3ZlciBFT0YgaWYgaXQgaGFzIGJlZW4gaW5hZHZlcnRlbnRseSBjcm9zc2VkIChpb2N0bCBub3QgdXNlZCBiZWNhdXNlCisgICBpdCBtZXNzZXMgdXAgdGhlIGJsb2NrIG51bWJlcikuICovCitzdGF0aWMgaW50IGNyb3NzX2VvZihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgZm9yd2FyZCkKK3sKKwlpbnQJcmVzdWx0OworCWNoYXIgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTdGVwcGluZyBvdmVyIGZpbGVtYXJrICVzLlxuIiwKKwkgICAJCQkgIG5hbWUsIGZvcndhcmQgPyAiZm9yd2FyZCIgOiAiYmFja3dhcmQiKTsKKyNlbmRpZgorCisJaWYgKGZvcndhcmQpIHsKKwkgICAvKiBhc3N1bWVzIHRoYXQgdGhlIGZpbGVtYXJrIGlzIGFscmVhZHkgcmVhZCBieSB0aGUgZHJpdmUsIHNvIHRoaXMgaXMgbG93IGNvc3QgKi8KKwkgICByZXN1bHQgPSBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfc2xvdyhTVHAsIGFTUnBudCwgTVRGU0YsIDEpOworCX0KKwllbHNlCisJICAgLyogYXNzdW1lcyB0aGlzIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGp1c3QgcmVhZCB0aGUgZmlsZW1hcmshICovCisJICAgcmVzdWx0ID0gb3NzdF9zZWVrX2xvZ2ljYWxfYmxrKFNUcCwgYVNScG50LCBTVHAtPmxvZ2ljYWxfYmxrX251bSAtIDEpOworCisJaWYgKHJlc3VsdCA8IDApCisJICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6VzogU3RlcHBpbmcgb3ZlciBmaWxlbWFyayAlcyBmYWlsZWQuXG4iLAorCQkJCW5hbWUsIGZvcndhcmQgPyAiZm9yd2FyZCIgOiAiYmFja3dhcmQiKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogR2V0IHRoZSB0YXBlIHBvc2l0aW9uLiAqLworCitzdGF0aWMgaW50IG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQpCit7CisJdW5zaWduZWQgY2hhcgkJc2NtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICAgKiBTUnBudDsKKwlpbnQJCQlyZXN1bHQgPSAwOworCWNoYXIgICAgCSAgICAgICogbmFtZSAgID0gdGFwZV9uYW1lKFNUcCk7CisKKwkvKiBLRzogV2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBpdCBmb3IgY2hlY2tpbmcgV3JpdGUgQnVmZmVyIGF2YWlsYWJpbGl0eQorCSAqICBhbmQgdGh1cyBkb24ndCB3YW50IHRvIHJpc2sgdG8gb3ZlcndyaXRlIGFueXRoaW5nLiBFeGNoYW5nZSBidWZmZXJzIC4uLiAqLworCWNoYXIJCW15YnVmWzI0XTsKKwljaGFyCSAgICAgICogb2xkZGF0YSA9IFNUcC0+YnVmZmVyLT5iX2RhdGE7CisJaW50CQlvbGRzaXplID0gU1RwLT5idWZmZXItPmJ1ZmZlcl9zaXplOworCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpIHJldHVybiAoLUVJTyk7CisKKwltZW1zZXQgKHNjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCXNjbWRbMF0gPSBSRUFEX1BPU0lUSU9OOworCisJU1RwLT5idWZmZXItPmJfZGF0YSA9IG15YnVmOyBTVHAtPmJ1ZmZlci0+YnVmZmVyX3NpemUgPSAyNDsKKwlTUnBudCA9IG9zc3RfZG9fc2NzaSgqYVNScG50LCBTVHAsIHNjbWQsIDIwLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJICAgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJaWYgKCFTUnBudCkgeworCQlTVHAtPmJ1ZmZlci0+Yl9kYXRhID0gb2xkZGF0YTsgU1RwLT5idWZmZXItPmJ1ZmZlcl9zaXplID0gb2xkc2l6ZTsKKwkJcmV0dXJuICgtRUJVU1kpOworCX0KKwkqYVNScG50ID0gU1JwbnQ7CisKKwlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0KQorCQlyZXN1bHQgPSAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSA9PSAzKSA/IC1FSU8gOiAtRUlOVkFMOwkvKiAzOiBXcml0ZSBFcnJvciAqLworCisJaWYgKHJlc3VsdCA9PSAtRUlOVkFMKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IENhbid0IHJlYWQgdGFwZSBwb3NpdGlvbi5cbiIsIG5hbWUpOworCWVsc2UgeworCQlpZiAocmVzdWx0ID09IC1FSU8pIHsJLyogcmUtcmVhZCBwb3NpdGlvbiAtIHRoaXMgbmVlZHMgdG8gcHJlc2VydmUgbWVkaWEgZXJyb3JzICovCisJCQl1bnNpZ25lZCBjaGFyIG15c2Vuc2VbMTZdOworCQkJbWVtY3B5IChteXNlbnNlLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyLCAxNik7CisJCQltZW1zZXQgKHNjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQkJc2NtZFswXSA9IFJFQURfUE9TSVRJT047CisJCQlTVHAtPmJ1ZmZlci0+Yl9kYXRhID0gbXlidWY7IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZSA9IDI0OworCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgc2NtZCwgMjAsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJCSAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogUmVyZWFkIHBvc2l0aW9uLCByZWFzb249WyUwMng6JTAyeDolMDJ4XSwgcmVzdWx0PVslcyUwMng6JTAyeDolMDJ4XVxuIiwKKwkJCQkJbmFtZSwgbXlzZW5zZVsyXSwgbXlzZW5zZVsxMl0sIG15c2Vuc2VbMTNdLCBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ/IiI6Im9rOiIsCisJCQkJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0sU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0sU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxM10pOworI2VuZGlmCisJCQlpZiAoIVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCkKKwkJCQltZW1jcHkgKFNScG50LT5zcl9zZW5zZV9idWZmZXIsIG15c2Vuc2UsIDE2KTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBEb3VibGUgZXJyb3IgaW4gZ2V0IHBvc2l0aW9uXG4iLCBuYW1lKTsKKwkJfQorCQlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID0gKChTVHAtPmJ1ZmZlciktPmJfZGF0YVs0XSA8PCAyNCkKKwkJCQkJICArICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbNV0gPDwgMTYpCisJCQkJCSAgKyAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzZdIDw8IDgpCisJCQkJCSAgKyAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzddOworCQlTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24gID0gKChTVHAtPmJ1ZmZlciktPmJfZGF0YVsgOF0gPDwgMjQpCisJCQkJCSAgKyAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWyA5XSA8PCAxNikKKwkJCQkJICArICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTBdIDw8ICA4KQorCQkJCQkgICsgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxMV07CisJCVNUcC0+Y3VyX2ZyYW1lcyAgICAgICAgICAgPSAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzE1XTsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKSB7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBEcml2ZSBQb3NpdGlvbnM6IGhvc3QgJWQsIHRhcGUgJWQlcywgYnVmZmVyICVkXG4iLCBuYW1lLAorCQkJCQkgICAgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uLAorCQkJCQkgICAgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVswXSYweDgwKT8iIChCT1ApIjoKKwkJCQkJICAgICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMF0mMHg0MCk/IiAoRU9QKSI6IiIsCisJCQkJCSAgICBTVHAtPmN1cl9mcmFtZXMpOworCQl9CisjZW5kaWYKKwkJaWYgKFNUcC0+Y3VyX2ZyYW1lcyA9PSAwICYmIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gIT0gU1RwLT5sYXN0X2ZyYW1lX3Bvc2l0aW9uKSB7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IENvcnJlY3RpbmcgcmVhZCBwb3NpdGlvbiAlZCwgJWQsICVkXG4iLCBuYW1lLAorCQkJCQlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb24sIFNUcC0+Y3VyX2ZyYW1lcyk7CisjZW5kaWYKKwkJCVNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPSBTVHAtPmxhc3RfZnJhbWVfcG9zaXRpb247CisJCX0KKwl9CisJU1RwLT5idWZmZXItPmJfZGF0YSA9IG9sZGRhdGE7IFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZSA9IG9sZHNpemU7CisKKwlyZXR1cm4gKHJlc3VsdCA9PSAwID8gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA6IHJlc3VsdCk7Cit9CisKKworLyogU2V0IHRoZSB0YXBlIGJsb2NrICovCitzdGF0aWMgaW50IG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBwcG9zLCBpbnQgc2tpcCkKK3sKKwl1bnNpZ25lZCBjaGFyCQlzY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50OworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgICAqIFNUcHM7CisJaW50CQkJcmVzdWx0ID0gMDsKKwlpbnQJCQlwcCAgICAgPSAocHBvcyA9PSAzMDAwICYmICFza2lwKT8gMCA6IHBwb3M7CisJY2hhcgkJICAgICAgKiBuYW1lICAgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKSByZXR1cm4gKC1FSU8pOworCisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCisJaWYgKHBwb3MgPCAwIHx8IHBwb3MgPiBTVHAtPmNhcGFjaXR5KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IFJlcG9zaXRpb24gcmVxdWVzdCAlZCBvdXQgb2YgcmFuZ2VcbiIsIG5hbWUsIHBwb3MpOworCQlwcCA9IHBwb3MgPSBwcG9zIDwgMCA/IDAgOiAoU1RwLT5jYXBhY2l0eSAtIDEpOworCQlyZXN1bHQgPSAoLUVJTlZBTCk7CisJfQorCisJZG8geworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTZXR0aW5nIHBwb3MgdG8gJWQuXG4iLCBuYW1lLCBwcCk7CisjZW5kaWYKKwkJbWVtc2V0IChzY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJc2NtZFswXSA9IFNFRUtfMTA7CisJCXNjbWRbMV0gPSAxOworCQlzY21kWzNdID0gKHBwID4+IDI0KTsKKwkJc2NtZFs0XSA9IChwcCA+PiAxNik7CisJCXNjbWRbNV0gPSAocHAgPj4gOCk7CisJCXNjbWRbNl0gPSAgcHA7CisJCWlmIChza2lwKQorCQkJc2NtZFs5XSA9IDB4ODA7CisKKwkJU1JwbnQgPSBvc3N0X2RvX3Njc2koKmFTUnBudCwgU1RwLCBzY21kLCAwLCBETUFfTk9ORSwgU1RwLT5sb25nX3RpbWVvdXQsCisJCQkJCQkJCU1BWF9SRVRSSUVTLCAxKTsKKwkJaWYgKCFTUnBudCkKKwkJCXJldHVybiAoLUVCVVNZKTsKKwkJKmFTUnBudCAgPSBTUnBudDsKKworCQlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBTRUVLIGNvbW1hbmQgZnJvbSAlZCB0byAlZCBmYWlsZWQuXG4iLAorCQkJCQluYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBwcCk7CisjZW5kaWYKKwkJCXJlc3VsdCA9ICgtRUlPKTsKKwkJfQorCQlpZiAocHAgIT0gcHBvcykKKwkJCW9zc3Rfd2FpdF9yZWFkeShTVHAsIGFTUnBudCwgNSAqIDYwLCBPU1NUX1dBSVRfUE9TSVRJT05fQ09NUExFVEUpOworCX0gd2hpbGUgKChwcCAhPSBwcG9zKSAmJiAocHAgPSBwcG9zKSk7CisJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9IFNUcC0+bGFzdF9mcmFtZV9wb3NpdGlvbiA9IHBwb3M7CisJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJU1Rwcy0+YXRfc20gPSAwOworCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvc3N0X3dyaXRlX3RyYWlsZXIoc3RydWN0IG9zc3RfdGFwZSAqU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwgaW50IGxlYXZlX2F0X0VPVCkKK3sKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKiBTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoU1RwLT53cml0ZV90eXBlICE9IE9TX1dSSVRFX05FV19NQVJLKSB7CisJCS8qIHRydWUgdW5sZXNzIHRoZSB1c2VyIHdyb3RlIHRoZSBmaWxlbWFyayBmb3IgdXMgKi8KKwkJcmVzdWx0ID0gb3NzdF9mbHVzaF9kcml2ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCQlpZiAocmVzdWx0IDwgMCkgZ290byBvdXQ7CisJCXJlc3VsdCA9IG9zc3Rfd3JpdGVfZmlsZW1hcmsoU1RwLCBhU1JwbnQpOworCQlpZiAocmVzdWx0IDwgMCkgZ290byBvdXQ7CisKKwkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQlTVHBzLT5kcnZfZmlsZSsrIDsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwl9CisJcmVzdWx0ID0gb3NzdF93cml0ZV9lb2QoU1RwLCBhU1JwbnQpOworCW9zc3Rfd3JpdGVfaGVhZGVyKFNUcCwgYVNScG50LCBsZWF2ZV9hdF9FT1QpOworCisJU1Rwcy0+ZW9mID0gU1RfRk07CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKwwKKy8qIG9zc3QgdmVyc2lvbnMgb2Ygc3QgZnVuY3Rpb25zIC0gYXVnbWVudGVkIGFuZCBzdHJpcHBlZCB0byBzdWl0IE9uU3RyZWFtIG9ubHkgKi8KKworLyogRmx1c2ggdGhlIHdyaXRlIGJ1ZmZlciAobmV2ZXIgbmVlZCB0byB3cml0ZSBpZiB2YXJpYWJsZSBibG9ja3NpemUpLiAqLworc3RhdGljIGludCBvc3N0X2ZsdXNoX3dyaXRlX2J1ZmZlcihzdHJ1Y3Qgb3NzdF90YXBlICpTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50KQoreworCWludAkJCW9mZnNldCwgdHJhbnNmZXIsIGJsa3MgPSAwOworCWludAkJCXJlc3VsdCA9IDA7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50ID0gKmFTUnBudDsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICAgKiBTVHBzOworCWNoYXIJCSAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKChTVHAtPmJ1ZmZlciktPndyaXRpbmcpIHsKKwkJaWYgKFNScG50ID09IChTVHAtPmJ1ZmZlciktPmxhc3RfU1JwbnQpCisjaWYgREVCVUcKKwkJCXsgcHJpbnRrKE9TU1RfREVCX01TRworCSAiJXM6RDogYVNScG50IHBvaW50cyB0byBzY3NpX3JlcXVlc3QgdGhhdCB3cml0ZV9iZWhpbmRfY2hlY2sgd2lsbCByZWxlYXNlIC0tIGNsZWFyZWRcbiIsIG5hbWUpOworI2VuZGlmCisJCQkqYVNScG50ID0gU1JwbnQgPSBOVUxMOworI2lmIERFQlVHCisJCQl9IGVsc2UgaWYgKFNScG50KQorCQkJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkgIiVzOkQ6IGFTUnBudCBkb2VzIG5vdCBwb2ludCB0byBzY3NpX3JlcXVlc3QgdGhhdCB3cml0ZV9iZWhpbmRfY2hlY2sgd2lsbCByZWxlYXNlIC0tIHN0cmFuZ2VcbiIsIG5hbWUpOworI2VuZGlmCQorCQlvc3N0X3dyaXRlX2JlaGluZF9jaGVjayhTVHApOworCQlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQpIHsKKyNpZiBERUJVRworCQkJaWYgKGRlYnVnZ2luZykKKwkJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBc3luYyB3cml0ZSBlcnJvciAoZmx1c2gpICV4LlxuIiwKKwkJCQkgICAgICAgbmFtZSwgKFNUcC0+YnVmZmVyKS0+bWlkbGV2ZWxfcmVzdWx0KTsKKyNlbmRpZgorCQkJaWYgKChTVHAtPmJ1ZmZlciktPm1pZGxldmVsX3Jlc3VsdCA9PSBJTlRfTUFYKQorCQkJCXJldHVybiAoLUVOT1NQQyk7CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJfQorCisJcmVzdWx0ID0gMDsKKwlpZiAoU1RwLT5kaXJ0eSA9PSAxKSB7CisKKwkJU1RwLT53cml0ZV9jb3VudCsrOworCQlTVHBzICAgICA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCQlTVHBzLT5ydyA9IFNUX1dSSVRJTkc7CisJCW9mZnNldCAgID0gU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlczsKKwkJYmxrcyAgICAgPSAob2Zmc2V0ICsgU1RwLT5ibG9ja19zaXplIC0gMSkgLyBTVHAtPmJsb2NrX3NpemU7CisJCXRyYW5zZmVyID0gT1NfRlJBTUVfU0laRTsKKwkJCisJCWlmIChvZmZzZXQgPCBPU19EQVRBX1NJWkUpCisJCQlvc3N0X3plcm9fYnVmZmVyX3RhaWwoU1RwLT5idWZmZXIpOworCisJCWlmIChTVHAtPnBvbGwpCisJCQlpZiAob3NzdF93YWl0X2ZyYW1lIChTVHAsIGFTUnBudCwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgLTUwLCAxMjApKQorCQkJCXJlc3VsdCA9IG9zc3RfcmVjb3Zlcl93YWl0X2ZyYW1lKFNUcCwgYVNScG50LCAxKTsKKworCQltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gV1JJVEVfNjsKKwkJY21kWzFdID0gMTsKKwkJY21kWzRdID0gMTsKKworCQlzd2l0Y2gJKFNUcC0+d3JpdGVfdHlwZSkgeworCQkgICBjYXNlIE9TX1dSSVRFX0RBVEE6CisjaWYgREVCVUcKKyAgIAkJCWlmIChkZWJ1Z2dpbmcpCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV3JpdGluZyAlZCBibG9ja3MgdG8gZnJhbWUgJWQsIGxibGtzICVkLSVkXG4iLAorCQkJCQluYW1lLCBibGtzLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsIAorCQkJCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAtIGJsa3MsIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0gMSk7CisjZW5kaWYKKwkJCW9zc3RfaW5pdF9hdXgoU1RwLCBPU19GUkFNRV9UWVBFX0RBVEEsIFNUcC0+ZnJhbWVfc2VxX251bWJlcisrLAorCQkJCSAgICAgIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0gYmxrcywgU1RwLT5ibG9ja19zaXplLCBibGtzKTsKKwkJCWJyZWFrOworCQkgICBjYXNlIE9TX1dSSVRFX0VPRDoKKwkJCW9zc3RfaW5pdF9hdXgoU1RwLCBPU19GUkFNRV9UWVBFX0VPRCwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyKyssCisJCQkJICAgICAgU1RwLT5sb2dpY2FsX2Jsa19udW0sIDAsIDApOworCQkJYnJlYWs7CisJCSAgIGNhc2UgT1NfV1JJVEVfTkVXX01BUks6CisJCQlvc3N0X2luaXRfYXV4KFNUcCwgT1NfRlJBTUVfVFlQRV9NQVJLRVIsIFNUcC0+ZnJhbWVfc2VxX251bWJlcisrLAorCQkJCSAgICAgIFNUcC0+bG9naWNhbF9ibGtfbnVtKyssIDAsIGJsa3M9MSk7CisJCQlicmVhazsKKwkJICAgY2FzZSBPU19XUklURV9IRUFERVI6CisJCQlvc3N0X2luaXRfYXV4KFNUcCwgT1NfRlJBTUVfVFlQRV9IRUFERVIsIDAsIDAsIDAsIGJsa3M9MCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogcHJvYmFibHkgRklMTEVSICovCisJCQlvc3N0X2luaXRfYXV4KFNUcCwgT1NfRlJBTUVfVFlQRV9GSUxMLCAwLCAwLCAwLCAwKTsKKwkJfQorI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGbHVzaGluZyAlZCBieXRlcywgVHJhbnNmZXJpbmcgJWQgYnl0ZXMgaW4gJWQgbGJsb2Nrcy5cbiIsCisJCQkgIAkJCSBuYW1lLCBvZmZzZXQsIHRyYW5zZmVyLCBibGtzKTsKKyNlbmRpZgorCisJCVNScG50ID0gb3NzdF9kb19zY3NpKCphU1JwbnQsIFNUcCwgY21kLCB0cmFuc2ZlciwgRE1BX1RPX0RFVklDRSwKKwkJCQkJICAgICAgU1RwLT50aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisJCSphU1JwbnQgPSBTUnBudDsKKwkJaWYgKCFTUnBudCkKKwkJCXJldHVybiAoLUVCVVNZKTsKKworCQlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHCisJCQkJIiVzOkQ6IHdyaXRlIHNlbnNlIFswXT0weCUwMnggWzJdPSUwMnggWzEyXT0lMDJ4IFsxM109JTAyeFxuIiwKKwkJCQluYW1lLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdLAorCQkJCVNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSk7CisjZW5kaWYKKwkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSAmIDB4NzApID09IDB4NzAgJiYKKwkJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4NDApICYmIC8qIEZJWE1FIC0gU0MtMzAgZHJpdmUgZG9lc24ndCBhc3NlcnQgRU9NIGJpdCAqLworCQkJICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gTk9fU0VOU0UpIHsKKwkJCQlTVHAtPmRpcnR5ID0gMDsKKwkJCQkoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPSAwOworCQkJCXJlc3VsdCA9ICgtRU5PU1BDKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChvc3N0X3dyaXRlX2Vycm9yX3JlY292ZXJ5KFNUcCwgYVNScG50LCAxKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IEVycm9yIG9uIGZsdXNoIHdyaXRlLlxuIiwgbmFtZSk7CisJCQkJCXJlc3VsdCA9ICgtRUlPKTsKKwkJCQl9CisJCQl9CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOwkJLyogRklYTUUgLSBldmVuIGlmIHdyaXRlIHJlY292ZXJ5IHN1Y2NlZWRzPyAqLworCQl9CisJCWVsc2UgeworCQkJU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbisrOworCQkJU1RwLT5kaXJ0eSA9IDA7CisJCQkoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPSAwOworCQl9CisJfQorI2lmIERFQlVHCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRXhpdCBmbHVzaCB3cml0ZSBidWZmZXIgd2l0aCBjb2RlICVkXG4iLCBuYW1lLCByZXN1bHQpOworI2VuZGlmCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBGbHVzaCB0aGUgdGFwZSBidWZmZXIuIFRoZSB0YXBlIHdpbGwgYmUgcG9zaXRpb25lZCBjb3JyZWN0bHkgdW5sZXNzCisgICBzZWVrX25leHQgaXMgdHJ1ZS4gKi8KK3N0YXRpYyBpbnQgb3NzdF9mbHVzaF9idWZmZXIoc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqKiBhU1JwbnQsIGludCBzZWVrX25leHQpCit7CisJc3RydWN0IHN0X3BhcnRzdGF0ICogU1RwczsKKwlpbnQgICAgYmFja3NwYWNlID0gMCwgcmVzdWx0ID0gMDsKKyNpZiBERUJVRworCWNoYXIgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisjZW5kaWYKKworCS8qCisJICogSWYgdGhlcmUgd2FzIGEgYnVzIHJlc2V0LCBibG9jayBmdXJ0aGVyIGFjY2VzcworCSAqIHRvIHRoaXMgZGV2aWNlLgorCSAqLworCWlmKCBTVHAtPnBvc191bmtub3duKQorCQlyZXR1cm4gKC1FSU8pOworCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpCisJCXJldHVybiAwOworCisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HIHx8IFNUcC0+ZGlydHkpIHsJLyogV3JpdGluZyAqLworCQlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9EQVRBOworCQlyZXR1cm4gb3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCBhU1JwbnQpOworCX0KKwlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCXJldHVybiAwOworCisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFjaGVkIGZsdXNoIChyZWFkKSBidWZmZXJcbiIsIG5hbWUpOworI2VuZGlmCisKKwlpZiAoIVNUcC0+Y2FuX2JzcikgeworCQliYWNrc3BhY2UgPSAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzICsgKFNUcC0+YnVmZmVyKS0+cmVhZF9wb2ludGVyKSAvIFNUcC0+YmxvY2tfc2l6ZSAtCisJCQkgICAgKChTVHAtPmJ1ZmZlciktPnJlYWRfcG9pbnRlciArIFNUcC0+YmxvY2tfc2l6ZSAtIDEgICAgICAgICkgLyBTVHAtPmJsb2NrX3NpemUgOworCQkoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPSAwOworCQkoU1RwLT5idWZmZXIpLT5yZWFkX3BvaW50ZXIgPSAwOworCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CQkvKiBGSVhNRSBpcyB0aGlzIHJlbGV2YW50IHcuIE9TU1Q/ICovCisJfQorCisJaWYgKCFzZWVrX25leHQpIHsKKwkJaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJCXJlc3VsdCA9IGNyb3NzX2VvZihTVHAsIGFTUnBudCwgMCk7IC8qIEJhY2sgb3ZlciB0aGUgRU9GIGhpdCAqLworCQkJaWYgKCFyZXN1bHQpCisJCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCQllbHNlIHsKKwkJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJfQorCQl9CisJCWlmICghcmVzdWx0ICYmIGJhY2tzcGFjZSA+IDApCS8qIFRPRE8gLS0gZGVzaWduIGFuZCBydW4gYSB0ZXN0IGNhc2UgZm9yIHRoaXMgKi8KKwkJCXJlc3VsdCA9IG9zc3Rfc2Vla19sb2dpY2FsX2JsayhTVHAsIGFTUnBudCwgU1RwLT5sb2dpY2FsX2Jsa19udW0gLSBiYWNrc3BhY2UpOworCX0KKwllbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvc3N0X3dyaXRlX2ZyYW1lKHN0cnVjdCBvc3N0X3RhcGUgKiBTVHAsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKiogYVNScG50LCBpbnQgc3luY2hyb25vdXMpCit7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50OworCWludAkJCWJsa3M7CisjaWYgREVCVUcKKwljaGFyCQkgICAgICAqIG5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKyNlbmRpZgorCisJaWYgKCghU1RwLT4gcmF3KSAmJiAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA9PSAweGJhZSkpIHsgLyogX211c3RfIHByZXNlcnZlIGJ1ZmZlciEgKi8KKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZWFjaGluZyBjb25maWcgcGFydGl0aW9uLlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJaWYgKG9zc3RfZmx1c2hfZHJpdmVfYnVmZmVyKFNUcCwgYVNScG50KSA8IDApIHsKKwkJCXJldHVybiAoLUVJTyk7CisJCX0KKwkJLyogZXJyb3IgcmVjb3ZlcnkgbWF5IGhhdmUgYnVtcGVkIHVzIHBhc3QgdGhlIGhlYWRlciBwYXJ0aXRpb24gKi8KKwkJaWYgKG9zc3RfZ2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgYVNScG50KSA8IDB4YmI4KSB7CisjaWYgREVCVUcKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNraXBwaW5nIG92ZXIgY29uZmlnIHBhcnRpdGlvbi5cbiIsIG5hbWUpOworI2VuZGlmCisJCW9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsIGFTUnBudCwgMHhiYjgpOworCQl9CisJfQorCisJaWYgKFNUcC0+cG9sbCkKKwkJaWYgKG9zc3Rfd2FpdF9mcmFtZSAoU1RwLCBhU1JwbnQsIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24sIC00OCwgMTIwKSkKKwkJCWlmIChvc3N0X3JlY292ZXJfd2FpdF9mcmFtZShTVHAsIGFTUnBudCwgMSkpCisJCQkJcmV0dXJuICgtRUlPKTsKKworLy8Jb3NzdF9idWlsZF9zdGF0cyhTVHAsICZTUnBudCk7CisKKwlTVHAtPnBzW1NUcC0+cGFydGl0aW9uXS5ydyA9IFNUX1dSSVRJTkc7CisJU1RwLT53cml0ZV90eXBlICAgICAgICAgICAgPSBPU19XUklURV9EQVRBOworCQkJCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdICAgPSBXUklURV82OworCWNtZFsxXSAgID0gMTsKKwljbWRbNF0gICA9IDE7CQkJCQkJLyogb25lIGZyYW1lIGF0IGEgdGltZS4uLiAqLworCWJsa3MgICAgID0gU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyAvIFNUcC0+YmxvY2tfc2l6ZTsKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcpCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRpbmcgJWQgYmxvY2tzIHRvIGZyYW1lICVkLCBsYmxrcyAlZC0lZFxuIiwgbmFtZSwgYmxrcywgCisJCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIsIFNUcC0+bG9naWNhbF9ibGtfbnVtIC0gYmxrcywgU1RwLT5sb2dpY2FsX2Jsa19udW0gLSAxKTsKKyNlbmRpZgorCW9zc3RfaW5pdF9hdXgoU1RwLCBPU19GUkFNRV9UWVBFX0RBVEEsIFNUcC0+ZnJhbWVfc2VxX251bWJlcisrLAorCQkgICAgICBTVHAtPmxvZ2ljYWxfYmxrX251bSAtIGJsa3MsIFNUcC0+YmxvY2tfc2l6ZSwgYmxrcyk7CisKKyNpZiBERUJVRworCWlmICghc3luY2hyb25vdXMpCisJCVNUcC0+d3JpdGVfcGVuZGluZyA9IDE7CisjZW5kaWYKKwlTUnBudCA9IG9zc3RfZG9fc2NzaSgqYVNScG50LCBTVHAsIGNtZCwgT1NfRlJBTUVfU0laRSwgRE1BX1RPX0RFVklDRSwgU1RwLT50aW1lb3V0LAorCQkJCQkJCQkJTUFYX1JFVFJJRVMsIHN5bmNocm9ub3VzKTsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gKC1FQlVTWSk7CisJKmFTUnBudCA9IFNScG50OworCisJaWYgKHN5bmNocm9ub3VzKSB7CisJCWlmIChTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworI2lmIERFQlVHCisJCQlpZiAoZGVidWdnaW5nKQorCQkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEVycm9yIG9uIHdyaXRlOlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSAmIDB4NzApID09IDB4NzAgJiYKKwkJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4NDApKSB7CisJCQkJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gVk9MVU1FX09WRVJGTE9XKQorCQkJCQlyZXR1cm4gKC1FTk9TUEMpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKG9zc3Rfd3JpdGVfZXJyb3JfcmVjb3ZlcnkoU1RwLCBhU1JwbnQsIDEpKQorCQkJCQlyZXR1cm4gKC1FSU8pOworCQkJfQorCQl9CisJCWVsc2UKKwkJCVNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24rKzsKKwl9CisKKwlTVHAtPndyaXRlX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworLyogTG9jayBvciB1bmxvY2sgdGhlIGRyaXZlIGRvb3IuIERvbid0IHVzZSB3aGVuIHN0cnVjdCBzY3NpX3JlcXVlc3QgYWxsb2NhdGVkLiAqLworc3RhdGljIGludCBkb19kb29yX2xvY2soc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgaW50IGRvX2xvY2spCit7CisJaW50IHJldHZhbCwgY21kOworCisJY21kID0gZG9fbG9jayA/IFNDU0lfSU9DVExfRE9PUkxPQ0sgOiBTQ1NJX0lPQ1RMX0RPT1JVTkxPQ0s7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiAlc29ja2luZyBkcml2ZSBkb29yLlxuIiwgdGFwZV9uYW1lKFNUcCksIGRvX2xvY2sgPyAiTCIgOiAiVW5sIik7CisjZW5kaWYKKwlyZXR2YWwgPSBzY3NpX2lvY3RsKFNUcC0+ZGV2aWNlLCBjbWQsIE5VTEwpOworCWlmICghcmV0dmFsKSB7CisJCVNUcC0+ZG9vcl9sb2NrZWQgPSBkb19sb2NrID8gU1RfTE9DS0VEX0VYUExJQ0lUIDogU1RfVU5MT0NLRUQ7CisJfQorCWVsc2UgeworCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfTE9DS19GQUlMUzsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogU2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSBhZnRlciByZXNldCAqLworc3RhdGljIHZvaWQgcmVzZXRfc3RhdGUoc3RydWN0IG9zc3RfdGFwZSAqU1RwKQoreworCWludCBpOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKworCVNUcC0+cG9zX3Vua25vd24gPSAwOworCWZvciAoaSA9IDA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCVNUcHMgPSAmKFNUcC0+cHNbaV0pOworCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQlTVHBzLT5hdF9zbSA9IDA7CisJCVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQlTVHBzLT5kcnZfYmxvY2sgPSAtMTsKKwkJU1Rwcy0+ZHJ2X2ZpbGUgPSAtMTsKKwl9Cit9CisJCQkJCisMCisvKiBFbnRyeSBwb2ludHMgdG8gb3NzdCAqLworCisvKiBXcml0ZSBjb21tYW5kICovCitzdGF0aWMgc3NpemVfdCBvc3N0X3dyaXRlKHN0cnVjdCBmaWxlICogZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QJCSAgICAgIHRvdGFsLCByZXR2YWwgPSAwOworCXNzaXplX3QJCSAgICAgIGksIGRvX2NvdW50LCBibGtzLCB0cmFuc2ZlcjsKKwlpbnQJCSAgICAgIHdyaXRlX3RocmVzaG9sZDsKKwlpbnQJCSAgICAgIGRvaW5nX3dyaXRlID0gMDsKKwljb25zdCBjaGFyICAgX191c2VyICogYl9wb2ludDsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQgPSBOVUxMOworCXN0cnVjdCBzdF9tb2RlZGVmICAgKiBTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICAqIFNUcHM7CisJc3RydWN0IG9zc3RfdGFwZSAgICAqIFNUcCAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJY2hhcgkJICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZTVHAtPmxvY2spKQorCQlyZXR1cm4gKC1FUkVTVEFSVFNZUyk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCisJICogZWxzZSB0cnkgYW5kIHVzZSB0aGlzIGRldmljZS4gIEFsc28sIGlmIGVycm9yIHJlY292ZXJ5IGZhaWxzLCBpdAorCSAqIG1heSB0cnkgYW5kIHRha2UgdGhlIGRldmljZSBvZmZsaW5lLCBpbiB3aGljaCBjYXNlIGFsbCBmdXJ0aGVyCisJICogYWNjZXNzIHRvIHRoZSBkZXZpY2UgaXMgcHJvaGliaXRlZC4KKwkgKi8KKwlpZiggIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTVHAtPmRldmljZSkgKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisJCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpIHsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCXJldHZhbCA9ICgtRU5PTUVESVVNKTsKKwkJZWxzZQorCQkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJaWYgKCFTVG0tPmRlZmluZWQpIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIGJ1cyByZXNldCwgYmxvY2sgZnVydGhlciBhY2Nlc3MKKwkgKiB0byB0aGlzIGRldmljZS4KKwkgKi8KKwlpZiAoU1RwLT5wb3NfdW5rbm93bikgeworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKworI2lmIERFQlVHCisJaWYgKCFTVHAtPmluX3VzZSkgeworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBJbmNvcnJlY3QgZGV2aWNlLlxuIiwgbmFtZSk7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisKKwlpZiAoU1RwLT53cml0ZV9wcm90KSB7CisJCXJldHZhbCA9ICgtRUFDQ0VTKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogV3JpdGUgbXVzdCBiZSBpbnRlZ3JhbCBudW1iZXIgb2YgYmxvY2tzICovCisJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwICYmIChjb3VudCAlIFNUcC0+YmxvY2tfc2l6ZSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOkU6IFdyaXRlICglWmQgYnl0ZXMpIG5vdCBtdWx0aXBsZSBvZiB0YXBlIGJsb2NrIHNpemUgKCVkJWMpLlxuIiwKKwkJCQkgICAgICAgbmFtZSwgY291bnQsIFNUcC0+YmxvY2tfc2l6ZTwxMDI0PworCQkJCSAgICAgICBTVHAtPmJsb2NrX3NpemU6U1RwLT5ibG9ja19zaXplLzEwMjQsIFNUcC0+YmxvY2tfc2l6ZTwxMDI0PydiJzonaycpOworCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID49IFNUcC0+Y2FwYWNpdHkgLSBPU1NUX0VPTV9SRVNFUlZFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6RTogV3JpdGUgdHJ1bmNhdGVkIGF0IEVPTSBlYXJseSB3YXJuaW5nIChmcmFtZSAlZCkuXG4iLAorCQkJCSAgICAgICBuYW1lLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uKTsKKwkJcmV0dmFsID0gKC1FTk9TUEMpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU1RwLT5kb19hdXRvX2xvY2sgJiYgU1RwLT5kb29yX2xvY2tlZCA9PSBTVF9VTkxPQ0tFRCAmJiAhZG9fZG9vcl9sb2NrKFNUcCwgMSkpCisJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9MT0NLRURfQVVUTzsKKworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKworCWlmIChTVHBzLT5ydyA9PSBTVF9SRUFESU5HKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU3dpdGNoaW5nIGZyb20gcmVhZCB0byB3cml0ZSBhdCBmaWxlICVkLCBibG9jayAlZFxuIiwgbmFtZSwgCisJCQkJCVNUcHMtPmRydl9maWxlLCBTVHBzLT5kcnZfYmxvY2spOworI2VuZGlmCisJCXJldHZhbCA9IG9zc3RfZmx1c2hfYnVmZmVyKFNUcCwgJlNScG50LCAwKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gb3V0OworCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJfQorCWlmIChTVHBzLT5ydyAhPSBTVF9XUklUSU5HKSB7CisJCS8qIEFyZSB3ZSB0b3RhbGx5IHJld3JpdGluZyB0aGlzIHRhcGU/ICovCisJCWlmICghU1RwLT5oZWFkZXJfb2sgfHwKKwkJICAgIChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID09IFNUcC0+Zmlyc3RfZGF0YV9wcG9zICYmIFNUcHMtPmRydl9ibG9jayA8IDApIHx8CisJCSAgICAoU1Rwcy0+ZHJ2X2ZpbGUgPT0gMCAmJiBTVHBzLT5kcnZfYmxvY2sgPT0gMCkpIHsKKwkJCVNUcC0+d3J0X3Bhc3NfY250cisrOworI2lmIERFQlVHCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBbGxvY2F0aW5nIG5leHQgd3JpdGUgcGFzcyBjb3VudGVyOiAlZFxuIiwKKwkJCQkJCSAgbmFtZSwgU1RwLT53cnRfcGFzc19jbnRyKTsKKyNlbmRpZgorCQkJb3NzdF9yZXNldF9oZWFkZXIoU1RwLCAmU1JwbnQpOworCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAwOworCQl9CisJCS8qIERvIHdlIGtub3cgd2hlcmUgd2UnbGwgYmUgd3JpdGluZyBvbiB0aGUgdGFwZT8gKi8KKwkJZWxzZSB7CisJCQlpZiAoKFNUcC0+ZmFzdF9vcGVuICYmIG9zc3RfdmVyaWZ5X3Bvc2l0aW9uKFNUcCwgJlNScG50KSkgfHwKKwkJCSAgCQlTVHBzLT5kcnZfZmlsZSA8IDAgfHwgU1Rwcy0+ZHJ2X2Jsb2NrIDwgMCkgeworCQkJCWlmIChTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uID09IFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIHsJLyogYXQgRU9EICovCisJCQkgIAkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHAtPmZpbGVtYXJrX2NudDsKKwkJCSAgCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLyogV2UgaGF2ZSBubyBpZGVhIHdoZXJlIHRoZSB0YXBlIGlzIHBvc2l0aW9uZWQgLSBnaXZlIHVwICovCisjaWYgREVCVUcKKwkJCQkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJCQkJIiVzOkQ6IENhbm5vdCB3cml0ZSBhdCBpbmRldGVybWluYXRlIHBvc2l0aW9uLlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJCQkJcmV0dmFsID0gKC1FSU8pOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisgICAgICAJCQl9CSAgCisJCQlpZiAoKFNUcHMtPmRydl9maWxlICsgU1Rwcy0+ZHJ2X2Jsb2NrKSA+IDAgJiYgU1Rwcy0+ZHJ2X2ZpbGUgPCBTVHAtPmZpbGVtYXJrX2NudCkgeworCQkJCVNUcC0+ZmlsZW1hcmtfY250ID0gU1Rwcy0+ZHJ2X2ZpbGU7CisJCQkJU1RwLT5sYXN0X21hcmtfcHBvcyA9CisJCQkJICAgICAgIAludG9obChTVHAtPmhlYWRlcl9jYWNoZS0+ZGF0X2ZtX3RhYi5mbV90YWJfZW50W1NUcC0+ZmlsZW1hcmtfY250LTFdKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIlczpXOiBPdmVyd3JpdGluZyBmaWxlICVkIHdpdGggb2xkIHdyaXRlIHBhc3MgY291bnRlciAlZFxuIiwKKwkJCQkJCW5hbWUsIFNUcHMtPmRydl9maWxlLCBTVHAtPndydF9wYXNzX2NudHIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIiVzOlc6IG1heSBsZWFkIHRvIHN0YWxlIGRhdGEgYmVpbmcgYWNjZXB0ZWQgb24gcmVhZGluZyBiYWNrIVxuIiwKKwkJCQkJCW5hbWUpOworI2lmIERFQlVHCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJCSAgIiVzOkQ6IHJlc2V0dGluZyBmaWxlbWFyayBjb3VudCB0byAlZCBhbmQgbGFzdCBtYXJrIHBwb3MsbGJuIHRvICVkLCVkXG4iLAorCQkJCQluYW1lLCBTVHAtPmZpbGVtYXJrX2NudCwgU1RwLT5sYXN0X21hcmtfcHBvcywgU1RwLT5sYXN0X21hcmtfbGJuKTsKKyNlbmRpZgorCQkJfQorCQl9CisJCVNUcC0+ZmFzdF9vcGVuID0gMDsKKwl9CisJaWYgKCFTVHAtPmhlYWRlcl9vaykgeworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRlIGNhbm5vdCBwcm9jZWVkIHdpdGhvdXQgdmFsaWQgaGVhZGVyc1xuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+d3JpdGluZykgeworaWYgKFNScG50KSBwcmludGsoS0VSTl9FUlIgIiVzOkE6IE5vdCBzdXBwb3NlZCB0byBoYXZlIFNScG50IGF0IGxpbmUgJWRcbiIsIG5hbWUsIF9fTElORV9fKTsKKwkJb3NzdF93cml0ZV9iZWhpbmRfY2hlY2soU1RwKTsKKwkJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0KSB7CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFzeW5jIHdyaXRlIGVycm9yICh3cml0ZSkgJXguXG4iLCBuYW1lLAorCQkJCQkJIChTVHAtPmJ1ZmZlciktPm1pZGxldmVsX3Jlc3VsdCk7CisjZW5kaWYKKwkJaWYgKChTVHAtPmJ1ZmZlciktPm1pZGxldmVsX3Jlc3VsdCA9PSBJTlRfTUFYKQorCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQllbHNlCisJCQlTVHBzLT5lb2YgPSBTVF9FT01fRVJST1I7CisJCX0KKwl9CisJaWYgKFNUcHMtPmVvZiA9PSBTVF9FT01fT0spIHsKKwkJcmV0dmFsID0gKC1FTk9TUEMpOworCQlnb3RvIG91dDsKKwl9CisJZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0VPTV9FUlJPUikgeworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIHRoZSBidWZmZXIgcmVhZGFiaWxpdHkgaW4gY2FzZXMgd2hlcmUgY29weV91c2VyIG1pZ2h0IGNhdGNoCisJCSB0aGUgcHJvYmxlbXMgYWZ0ZXIgc29tZSB0YXBlIG1vdmVtZW50LiAqLworCWlmICgoY29weV9mcm9tX3VzZXIoJmksIGJ1ZiwgMSkgIT0gMCB8fAorCSAgICAgY29weV9mcm9tX3VzZXIoJmksIGJ1ZiArIGNvdW50IC0gMSwgMSkgIT0gMCkpIHsKKwkJcmV0dmFsID0gKC1FRkFVTFQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIVNUbS0+ZG9fYnVmZmVyX3dyaXRlcykgeworCQl3cml0ZV90aHJlc2hvbGQgPSAxOworCX0KKwllbHNlCisJCXdyaXRlX3RocmVzaG9sZCA9IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MgKiBTVHAtPmJsb2NrX3NpemU7CisJaWYgKCFTVG0tPmRvX2FzeW5jX3dyaXRlcykKKwkJd3JpdGVfdGhyZXNob2xkLS07CisKKwl0b3RhbCA9IGNvdW50OworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogV3JpdGluZyAlZCBieXRlcyB0byBmaWxlICVkIGJsb2NrICVkIGxibGsgJWQgZnNlcSAlZCBmcHBvcyAlZFxuIiwKKwkJCQluYW1lLCBjb3VudCwgU1Rwcy0+ZHJ2X2ZpbGUsIFNUcHMtPmRydl9ibG9jaywKKwkJCQlTVHAtPmxvZ2ljYWxfYmxrX251bSwgU1RwLT5mcmFtZV9zZXFfbnVtYmVyLCBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uKTsKKyNlbmRpZgorCWJfcG9pbnQgPSBidWY7CisJd2hpbGUgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyArIGNvdW50ID4gd3JpdGVfdGhyZXNob2xkKQorCXsKKwkJZG9pbmdfd3JpdGUgPSAxOworCQlkb19jb3VudCA9IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MgKiBTVHAtPmJsb2NrX3NpemUgLQorCQkJICAgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzOworCQlpZiAoZG9fY291bnQgPiBjb3VudCkKKwkJCWRvX2NvdW50ID0gY291bnQ7CisKKwkJaSA9IGFwcGVuZF90b19idWZmZXIoYl9wb2ludCwgU1RwLT5idWZmZXIsIGRvX2NvdW50KTsKKwkJaWYgKGkpIHsKKwkJCXJldHZhbCA9IGk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJsa3MgPSBkb19jb3VudCAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJU1RwLT5sb2dpY2FsX2Jsa19udW0gKz0gYmxrczsgIC8qIGxvZ2ljYWxfYmxrX251bSBpcyBpbmNyZW1lbnRlZCBhcyBkYXRhIGlzIG1vdmVkIGZyb20gdXNlciAqLworICAKKwkJaSA9IG9zc3Rfd3JpdGVfZnJhbWUoU1RwLCAmU1JwbnQsIDEpOworCisJCWlmIChpID09ICgtRU5PU1BDKSkgeworCQkJdHJhbnNmZXIgPSBTVHAtPmJ1ZmZlci0+d3JpdGluZzsJLyogRklYTUUgLS0gY2hlY2sgdGhpcyBsb2dpYyAqLworCQkJaWYgKHRyYW5zZmVyIDw9IGRvX2NvdW50KSB7CisJCQkJZmlscC0+Zl9wb3MgKz0gZG9fY291bnQgLSB0cmFuc2ZlcjsKKwkJCQljb3VudCAtPSBkb19jb3VudCAtIHRyYW5zZmVyOworCQkJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQkJCQlTVHBzLT5kcnZfYmxvY2sgKz0gKGRvX2NvdW50IC0gdHJhbnNmZXIpIC8gU1RwLT5ibG9ja19zaXplOworCQkJCX0KKwkJCQlTVHBzLT5lb2YgPSBTVF9FT01fT0s7CisJCQkJcmV0dmFsID0gKC1FTk9TUEMpOwkJLyogRU9NIHdpdGhpbiBjdXJyZW50IHJlcXVlc3QgKi8KKyNpZiBERUJVRworCQkJCWlmIChkZWJ1Z2dpbmcpCisJCQkJICAgICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRU9NIHdpdGggJWQgYnl0ZXMgdW53cml0dGVuLlxuIiwKKwkJCQkJCQkgICAgIG5hbWUsIHRyYW5zZmVyKTsKKyNlbmRpZgorCQkJfQorCQkJZWxzZSB7CisJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX0VSUk9SOworCQkJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CQkvKiBUb28gY2F1dGlvdXM/ICovCisJCQkJcmV0dmFsID0gKC1FSU8pOwkJLyogRU9NIGZvciBvbGQgZGF0YSAqLworI2lmIERFQlVHCisJCQkJaWYgKGRlYnVnZ2luZykKKwkJCQkgICAgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBFT00gd2l0aCBsb3N0IGRhdGEuXG4iLCBuYW1lKTsKKyNlbmRpZgorCQkJfQorCQl9CisJCWVsc2UKKwkJCXJldHZhbCA9IGk7CisJCQkKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWlmIChTUnBudCAhPSBOVUxMKSB7CisJCQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQkJCVNScG50ID0gTlVMTDsKKwkJCX0KKwkJCVNUcC0+YnVmZmVyLT5idWZmZXJfYnl0ZXMgPSAwOworCQkJU1RwLT5kaXJ0eSA9IDA7CisJCQlpZiAoY291bnQgPCB0b3RhbCkKKwkJCQlyZXR2YWwgPSB0b3RhbCAtIGNvdW50OworCQkJZ290byBvdXQ7CisJCX0KKworCQlmaWxwLT5mX3BvcyArPSBkb19jb3VudDsKKwkJYl9wb2ludCArPSBkb19jb3VudDsKKwkJY291bnQgLT0gZG9fY291bnQ7CisJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IGJsa3M7CisJCX0KKwkJU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCVNUcC0+ZGlydHkgPSAwOworCX0gIC8qIGVuZCB3aGlsZSB3cml0ZSB0aHJlc2hvbGQgZXhjZWVkZWQgKi8KKworCWlmIChjb3VudCAhPSAwKSB7CisJCVNUcC0+ZGlydHkgPSAxOworCQlpID0gYXBwZW5kX3RvX2J1ZmZlcihiX3BvaW50LCBTVHAtPmJ1ZmZlciwgY291bnQpOworCQlpZiAoaSkgeworCQkJcmV0dmFsID0gaTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJsa3MgPSBjb3VudCAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJU1RwLT5sb2dpY2FsX2Jsa19udW0gKz0gYmxrczsKKwkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKSB7CisJCQlTVHBzLT5kcnZfYmxvY2sgKz0gYmxrczsKKwkJfQorCQlmaWxwLT5mX3BvcyArPSBjb3VudDsKKwkJY291bnQgPSAwOworCX0KKworCWlmIChkb2luZ193cml0ZSAmJiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU1RtLT5kb19hc3luY193cml0ZXMgJiYgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA+PSBTVHAtPndyaXRlX3RocmVzaG9sZCkpIHsgCisJCS8qIFNjaGVkdWxlIGFuIGFzeW5jaHJvbm91cyB3cml0ZSAqLworCQkoU1RwLT5idWZmZXIpLT53cml0aW5nID0gKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyAvCisJCQkJCSAgIFNUcC0+YmxvY2tfc2l6ZSkgKiBTVHAtPmJsb2NrX3NpemU7CisJCVNUcC0+ZGlydHkgPSAhKChTVHAtPmJ1ZmZlciktPndyaXRpbmcgPT0KKwkJCQkgICAgICAgICAgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzKTsKKworCQlpID0gb3NzdF93cml0ZV9mcmFtZShTVHAsICZTUnBudCwgMCk7CisJCWlmIChpIDwgMCkgeworCQkJcmV0dmFsID0gKC1FSU8pOworCQkJZ290byBvdXQ7CisJCX0KKwkJU1JwbnQgPSBOVUxMOwkJCS8qIFByZXZlbnQgcmVsZWFzaW5nIHRoaXMgcmVxdWVzdCEgKi8KKwl9CisJU1Rwcy0+YXRfc20gJj0gKHRvdGFsID09IDApOworCWlmICh0b3RhbCA+IDApCisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCisJcmV0dmFsID0gdG90YWw7CisKK291dDoKKwlpZiAoU1JwbnQgIT0gTlVMTCkgc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCisJdXAoJlNUcC0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIFJlYWQgY29tbWFuZCAqLworc3RhdGljIHNzaXplX3Qgb3NzdF9yZWFkKHN0cnVjdCBmaWxlICogZmlscCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QJCSAgICAgIHRvdGFsLCByZXR2YWwgPSAwOworCXNzaXplX3QJCSAgICAgIGksIHRyYW5zZmVyOworCWludAkJICAgICAgc3BlY2lhbDsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAgICogU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgKiBTVHBzOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCA9IE5VTEw7CisJc3RydWN0IG9zc3RfdGFwZSAgICAqIFNUcCAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNoYXIJCSAgICAqIG5hbWUgID0gdGFwZV9uYW1lKFNUcCk7CisKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJlNUcC0+bG9jaykpCisJCXJldHVybiAoLUVSRVNUQVJUU1lTKTsKKworCS8qCisJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKKwkgKiBlbHNlIHRyeSBhbmQgdXNlIHRoaXMgZGV2aWNlLiAgQWxzbywgaWYgZXJyb3IgcmVjb3ZlcnkgZmFpbHMsIGl0CisJICogbWF5IHRyeSBhbmQgdGFrZSB0aGUgZGV2aWNlIG9mZmxpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIKKwkgKiBhY2Nlc3MgdG8gdGhlIGRldmljZSBpcyBwcm9oaWJpdGVkLgorCSAqLworCWlmKCAhc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKFNUcC0+ZGV2aWNlKSApIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKwkKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkgeworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9OT19UQVBFKQorCQkJcmV0dmFsID0gKC1FTk9NRURJVU0pOworCQllbHNlCisJCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKwlpZiAoIVNUbS0+ZGVmaW5lZCkgeworCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJZ290byBvdXQ7CisJfQorI2lmIERFQlVHCisJaWYgKCFTVHAtPmluX3VzZSkgeworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBJbmNvcnJlY3QgZGV2aWNlLlxuIiwgbmFtZSk7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisJLyogTXVzdCBoYXZlIGluaXRpYWxpemVkIG1lZGl1bSAqLworCWlmICghU1RwLT5oZWFkZXJfb2spIHsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU1RwLT5kb19hdXRvX2xvY2sgJiYgU1RwLT5kb29yX2xvY2tlZCA9PSBTVF9VTkxPQ0tFRCAmJiAhZG9fZG9vcl9sb2NrKFNUcCwgMSkpCisJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9MT0NLRURfQVVUTzsKKworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORykgeworCQlyZXR2YWwgPSBvc3N0X2ZsdXNoX2J1ZmZlcihTVHAsICZTUnBudCwgMCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCQkvKiBGSVhNRSAtLSB0aGlzIG1heSBsZWF2ZSB0aGUgdGFwZSB3aXRob3V0IEVPRCBhbmQgdXAyZGF0ZSBoZWFkZXJzICovCisJfQorCisJaWYgKChjb3VudCAlIFNUcC0+YmxvY2tfc2l6ZSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAiJXM6VzogUmVhZCAoJVpkIGJ5dGVzKSBub3QgbXVsdGlwbGUgb2YgdGFwZSBibG9jayBzaXplICglZCVjKS5cbiIsIG5hbWUsIGNvdW50LAorCQkgICAgU1RwLT5ibG9ja19zaXplPDEwMjQ/U1RwLT5ibG9ja19zaXplOlNUcC0+YmxvY2tfc2l6ZS8xMDI0LCBTVHAtPmJsb2NrX3NpemU8MTAyND8nYic6J2snKTsKKwl9CisKKyNpZiBERUJVRworCWlmIChkZWJ1Z2dpbmcgJiYgU1Rwcy0+ZW9mICE9IFNUX05PRU9GKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBFT0YvRU9NIGZsYWcgdXAgKCVkKS4gQnl0ZXMgJWRcbiIsIG5hbWUsCisJCQkJICAgICBTVHBzLT5lb2YsIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyk7CisjZW5kaWYKKwlpZiAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID09IDAgJiYKKwkgICAgIFNUcHMtPmVvZiA+PSBTVF9FT0RfMSkgeworCQlpZiAoU1Rwcy0+ZW9mIDwgU1RfRU9EKSB7CisJCQlTVHBzLT5lb2YgKz0gMTsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXR2YWwgPSAoLUVJTyk7ICAvKiBFT00gb3IgQmxhbmsgQ2hlY2sgKi8KKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgdGhlIGJ1ZmZlciB3cml0YWJpbGl0eSBiZWZvcmUgYW55IHRhcGUgbW92ZW1lbnQuIERvbid0IGFsdGVyCisJCSBidWZmZXIgZGF0YS4gKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJmksIGJ1ZiwgMSkgICAgICAgICAgICAgIT0gMCB8fAorCSAgICBjb3B5X3RvX3VzZXIgIChidWYsICZpLCAxKSAgICAgICAgICAgICAhPSAwIHx8CisJICAgIGNvcHlfZnJvbV91c2VyKCZpLCBidWYgKyBjb3VudCAtIDEsIDEpICE9IDAgfHwKKwkgICAgY29weV90b191c2VyICAoYnVmICsgY291bnQgLSAxLCAmaSwgMSkgIT0gMCkgeworCQlyZXR2YWwgPSAoLUVGQVVMVCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIExvb3AgdW50aWwgZW5vdWdoIGRhdGEgaW4gYnVmZmVyIG9yIGEgc3BlY2lhbCBjb25kaXRpb24gZm91bmQgKi8KKwlmb3IgKHRvdGFsID0gMCwgc3BlY2lhbCA9IDA7IHRvdGFsIDwgY291bnQgLSBTVHAtPmJsb2NrX3NpemUgKyAxICYmICFzcGVjaWFsOyApIHsKKworCQkvKiBHZXQgbmV3IGRhdGEgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSAqLworCQlpZiAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID09IDApIHsKKwkJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKQorCQkJCWJyZWFrOworCQkJc3BlY2lhbCA9IG9zc3RfZ2V0X2xvZ2ljYWxfZnJhbWUoU1RwLCAmU1JwbnQsIFNUcC0+ZnJhbWVfc2VxX251bWJlciwgMCk7CisJCQlpZiAoc3BlY2lhbCA8IDApIHsgCQkJLyogTm8gbmVlZCB0byBjb250aW51ZSByZWFkICovCisJCQkJU1RwLT5mcmFtZV9pbl9idWZmZXIgPSAwOworCQkJCXJldHZhbCA9IHNwZWNpYWw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKiBNb3ZlIHRoZSBkYXRhIGZyb20gZHJpdmVyIGJ1ZmZlciB0byB1c2VyIGJ1ZmZlciAqLworCQlpZiAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID4gMCkgeworI2lmIERFQlVHCisJCQlpZiAoZGVidWdnaW5nICYmIFNUcHMtPmVvZiAhPSBTVF9OT0VPRikKKwkJCSAgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBFT0YgdXAgKCVkKS4gTGVmdCAlZCwgbmVlZGVkICVkLlxuIiwgbmFtZSwKKwkJCQkJCSBTVHBzLT5lb2YsIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcywgY291bnQgLSB0b3RhbCk7CisjZW5kaWYKKwkJICAgICAgIAkvKiBmb3JjZSBtdWx0aXBsZSBvZiBibG9jayBzaXplLCBub3RlIGJsb2NrX3NpemUgbWF5IGhhdmUgYmVlbiBhZGp1c3RlZCAqLworCQkJdHJhbnNmZXIgPSAoKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA8IGNvdW50IC0gdG90YWwgPworCQkJCSAgICAgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzIDogY291bnQgLSB0b3RhbCkvCisJCQkJCVNUcC0+YmxvY2tfc2l6ZSkgKiBTVHAtPmJsb2NrX3NpemU7CisKKwkJCWlmICh0cmFuc2ZlciA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgIiVzOlc6IE5vdGhpbmcgY2FuIGJlIHRyYW5zZmVyZWQsIHJlcXVlc3RlZCAlWmQsIHRhcGUgYmxvY2sgc2l6ZSAoJWQlYykuXG4iLAorCQkJICAgCQluYW1lLCBjb3VudCwgU1RwLT5ibG9ja19zaXplIDwgMTAyND8KKwkJCQkJU1RwLT5ibG9ja19zaXplOlNUcC0+YmxvY2tfc2l6ZS8xMDI0LAorCQkJCSAgICAgICAJU1RwLT5ibG9ja19zaXplPDEwMjQ/J2InOidrJyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpID0gZnJvbV9idWZmZXIoU1RwLT5idWZmZXIsIGJ1ZiwgdHJhbnNmZXIpOworCQkJaWYgKGkpICB7CisJCQkJcmV0dmFsID0gaTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCVNUcC0+bG9naWNhbF9ibGtfbnVtICs9IHRyYW5zZmVyIC8gU1RwLT5ibG9ja19zaXplOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrICAgICAgKz0gdHJhbnNmZXIgLyBTVHAtPmJsb2NrX3NpemU7CisJCQlmaWxwLT5mX3BvcyAgICAgICAgICArPSB0cmFuc2ZlcjsKKwkJCWJ1ZiAgICAgICAgICAgICAgICAgICs9IHRyYW5zZmVyOworCQkJdG90YWwgICAgICAgICAgICAgICAgKz0gdHJhbnNmZXI7CisJCX0KKyAKKwkJaWYgKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9PSAwKSB7CisjaWYgREVCVUcKKwkJCWlmIChkZWJ1Z2dpbmcpCisJCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRmluaXNoZWQgd2l0aCBmcmFtZSAlZFxuIiwKKwkJCQkJICAgICAgIAluYW1lLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIpOworI2VuZGlmCisJCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisJCQlTVHAtPmZyYW1lX3NlcV9udW1iZXIrKzsgICAgICAgICAgICAgIC8qIGZyYW1lIHRvIGxvb2sgZm9yIG5leHQgdGltZSAqLworCQl9CisJfSAvKiBmb3IgKHRvdGFsID0gMCwgc3BlY2lhbCA9IDA7IHRvdGFsIDwgY291bnQgJiYgIXNwZWNpYWw7ICkgKi8KKworCS8qIENoYW5nZSB0aGUgZW9mIHN0YXRlIGlmIG5vIGRhdGEgZnJvbSB0YXBlIG9yIGJ1ZmZlciAqLworCWlmICh0b3RhbCA9PSAwKSB7CisJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQlTVHBzLT5lb2YgPSAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA+PSBTVHAtPmVvZF9mcmFtZV9wcG9zKT9TVF9FT0RfMjpTVF9GTTsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQl9CisJCWVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9FT0RfMSkgeworCQkJU1Rwcy0+ZW9mID0gU1RfRU9EXzI7CisJCQlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID4gMCAmJiBTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQl9CisJCWVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9FT0RfMikKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKwl9CisJZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0ZNKQorCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKworCXJldHZhbCA9IHRvdGFsOworCitvdXQ6CisJaWYgKFNScG50ICE9IE5VTEwpIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCXVwKCZTVHAtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBTZXQgdGhlIGRyaXZlciBvcHRpb25zICovCitzdGF0aWMgdm9pZCBvc3N0X2xvZ19vcHRpb25zKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgc3RydWN0IHN0X21vZGVkZWYgKlNUbSwgY2hhciAqbmFtZSkKK3sKKyAgcHJpbnRrKEtFUk5fSU5GTworIiVzOkk6IE1vZGUgJWQgb3B0aW9uczogYnVmZmVyIHdyaXRlczogJWQsIGFzeW5jIHdyaXRlczogJWQsIHJlYWQgYWhlYWQ6ICVkXG4iLAorCSBuYW1lLCBTVHAtPmN1cnJlbnRfbW9kZSwgU1RtLT5kb19idWZmZXJfd3JpdGVzLCBTVG0tPmRvX2FzeW5jX3dyaXRlcywKKwkgU1RtLT5kb19yZWFkX2FoZWFkKTsKKyAgcHJpbnRrKEtFUk5fSU5GTworIiVzOkk6ICAgIGNhbiBic3I6ICVkLCB0d28gRk1zOiAlZCwgZmFzdCBtdGVvbTogJWQsIGF1dG8gbG9jazogJWQsXG4iLAorCSBuYW1lLCBTVHAtPmNhbl9ic3IsIFNUcC0+dHdvX2ZtLCBTVHAtPmZhc3RfbXRlb20sIFNUcC0+ZG9fYXV0b19sb2NrKTsKKyAgcHJpbnRrKEtFUk5fSU5GTworIiVzOkk6ICAgIGRlZnMgZm9yIHdyOiAlZCwgbm8gYmxvY2sgbGltaXRzOiAlZCwgcGFydGl0aW9uczogJWQsIHMyIGxvZzogJWRcbiIsCisJIG5hbWUsIFNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcywgU1RwLT5vbWl0X2Jsa2xpbXMsIFNUcC0+Y2FuX3BhcnRpdGlvbnMsCisJIFNUcC0+c2NzaTJfbG9naWNhbCk7CisgIHByaW50ayhLRVJOX0lORk8KKyIlczpJOiAgICBzeXN2OiAlZFxuIiwgbmFtZSwgU1RtLT5zeXN2KTsKKyNpZiBERUJVRworICBwcmludGsoS0VSTl9JTkZPCisJICIlczpEOiAgICBkZWJ1Z2dpbmc6ICVkXG4iLAorCSBuYW1lLCBkZWJ1Z2dpbmcpOworI2VuZGlmCit9CisKKworc3RhdGljIGludCBvc3N0X3NldF9vcHRpb25zKHN0cnVjdCBvc3N0X3RhcGUgKlNUcCwgbG9uZyBvcHRpb25zKQoreworCWludAkJICAgIHZhbHVlOworCWxvbmcJCSAgICBjb2RlOworCXN0cnVjdCBzdF9tb2RlZGVmICogU1RtOworCWNoYXIJCSAgKiBuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisKKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKwlpZiAoIVNUbS0+ZGVmaW5lZCkgeworCQltZW1jcHkoU1RtLCAmKFNUcC0+bW9kZXNbMF0pLCBzaXplb2YoKlNUbSkpOworCQltb2Rlc19kZWZpbmVkID0gMTsKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKQorCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW5pdGlhbGl6ZWQgbW9kZSAlZCBkZWZpbml0aW9uIGZyb20gbW9kZSAwXG4iLAorCQkJCQkgICAgIG5hbWUsIFNUcC0+Y3VycmVudF9tb2RlKTsKKyNlbmRpZgorCX0KKworCWNvZGUgPSBvcHRpb25zICYgTVRfU1RfT1BUSU9OUzsKKwlpZiAoY29kZSA9PSBNVF9TVF9CT09MRUFOUykgeworCQlTVG0tPmRvX2J1ZmZlcl93cml0ZXMgPSAob3B0aW9ucyAmIE1UX1NUX0JVRkZFUl9XUklURVMpICE9IDA7CisJCVNUbS0+ZG9fYXN5bmNfd3JpdGVzICA9IChvcHRpb25zICYgTVRfU1RfQVNZTkNfV1JJVEVTKSAhPSAwOworCQlTVG0tPmRlZmF1bHRzX2Zvcl93cml0ZXMgPSAob3B0aW9ucyAmIE1UX1NUX0RFRl9XUklURVMpICE9IDA7CisJCVNUbS0+ZG9fcmVhZF9haGVhZCAgICA9IChvcHRpb25zICYgTVRfU1RfUkVBRF9BSEVBRCkgIT0gMDsKKwkJU1RwLT50d29fZm0JICAgICAgPSAob3B0aW9ucyAmIE1UX1NUX1RXT19GTSkgIT0gMDsKKwkJU1RwLT5mYXN0X210ZW9tCSAgICAgID0gKG9wdGlvbnMgJiBNVF9TVF9GQVNUX01URU9NKSAhPSAwOworCQlTVHAtPmRvX2F1dG9fbG9jayAgICAgPSAob3B0aW9ucyAmIE1UX1NUX0FVVE9fTE9DSykgIT0gMDsKKwkJU1RwLT5jYW5fYnNyICAgICAgICAgID0gKG9wdGlvbnMgJiBNVF9TVF9DQU5fQlNSKSAhPSAwOworCQlTVHAtPm9taXRfYmxrbGltcyAgICAgPSAob3B0aW9ucyAmIE1UX1NUX05PX0JMS0xJTVMpICE9IDA7CisJCWlmICgoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsID49IFNDU0lfMikKKwkJCVNUcC0+Y2FuX3BhcnRpdGlvbnMgPSAob3B0aW9ucyAmIE1UX1NUX0NBTl9QQVJUSVRJT05TKSAhPSAwOworCQlTVHAtPnNjc2kyX2xvZ2ljYWwgICAgPSAob3B0aW9ucyAmIE1UX1NUX1NDU0kyTE9HSUNBTCkgIT0gMDsKKwkJU1RtLT5zeXN2CSAgICAgID0gKG9wdGlvbnMgJiBNVF9TVF9TWVNWKSAhPSAwOworI2lmIERFQlVHCisJCWRlYnVnZ2luZyA9IChvcHRpb25zICYgTVRfU1RfREVCVUdHSU5HKSAhPSAwOworI2VuZGlmCisJCW9zc3RfbG9nX29wdGlvbnMoU1RwLCBTVG0sIG5hbWUpOworCX0KKwllbHNlIGlmIChjb2RlID09IE1UX1NUX1NFVEJPT0xFQU5TIHx8IGNvZGUgPT0gTVRfU1RfQ0xFQVJCT09MRUFOUykgeworCQl2YWx1ZSA9IChjb2RlID09IE1UX1NUX1NFVEJPT0xFQU5TKTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQlVGRkVSX1dSSVRFUykgIT0gMCkKKwkJCVNUbS0+ZG9fYnVmZmVyX3dyaXRlcyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9BU1lOQ19XUklURVMpICE9IDApCisJCQlTVG0tPmRvX2FzeW5jX3dyaXRlcyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9ERUZfV1JJVEVTKSAhPSAwKQorCQkJU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX1JFQURfQUhFQUQpICE9IDApCisJCQlTVG0tPmRvX3JlYWRfYWhlYWQgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfVFdPX0ZNKSAhPSAwKQorCQkJU1RwLT50d29fZm0gPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfRkFTVF9NVEVPTSkgIT0gMCkKKwkJCVNUcC0+ZmFzdF9tdGVvbSA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9BVVRPX0xPQ0spICE9IDApCisJCQlTVHAtPmRvX2F1dG9fbG9jayA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9DQU5fQlNSKSAhPSAwKQorCQkJU1RwLT5jYW5fYnNyID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX05PX0JMS0xJTVMpICE9IDApCisJCQlTVHAtPm9taXRfYmxrbGltcyA9IHZhbHVlOworCQlpZiAoKFNUcC0+ZGV2aWNlKS0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIgJiYKKwkJICAgIChvcHRpb25zICYgTVRfU1RfQ0FOX1BBUlRJVElPTlMpICE9IDApCisJCQlTVHAtPmNhbl9wYXJ0aXRpb25zID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX1NDU0kyTE9HSUNBTCkgIT0gMCkKKwkJCVNUcC0+c2NzaTJfbG9naWNhbCA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9TWVNWKSAhPSAwKQorCQkJU1RtLT5zeXN2ID0gdmFsdWU7CisjaWYgREVCVUcKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfREVCVUdHSU5HKSAhPSAwKQorCQkJZGVidWdnaW5nID0gdmFsdWU7CisjZW5kaWYKKwkJb3NzdF9sb2dfb3B0aW9ucyhTVHAsIFNUbSwgbmFtZSk7CisJfQorCWVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfV1JJVEVfVEhSRVNIT0xEKSB7CisJCXZhbHVlID0gKG9wdGlvbnMgJiB+TVRfU1RfT1BUSU9OUykgKiBTVF9LSUxPQllURTsKKwkJaWYgKHZhbHVlIDwgMSB8fCB2YWx1ZSA+IG9zc3RfYnVmZmVyX3NpemUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IFdyaXRlIHRocmVzaG9sZCAlZCB0b28gc21hbGwgb3IgdG9vIGxhcmdlLlxuIiwKKwkJCQkJICAgICBuYW1lLCB2YWx1ZSk7CisJCQlyZXR1cm4gKC1FSU8pOworCQl9CisJCVNUcC0+d3JpdGVfdGhyZXNob2xkID0gdmFsdWU7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IFdyaXRlIHRocmVzaG9sZCBzZXQgdG8gJWQgYnl0ZXMuXG4iLAorCQkJCSAgbmFtZSwgdmFsdWUpOworCX0KKwllbHNlIGlmIChjb2RlID09IE1UX1NUX0RFRl9CTEtTSVpFKSB7CisJCXZhbHVlID0gKG9wdGlvbnMgJiB+TVRfU1RfT1BUSU9OUyk7CisJCWlmICh2YWx1ZSA9PSB+TVRfU1RfT1BUSU9OUykgeworCQkJU1RtLT5kZWZhdWx0X2Jsa3NpemUgPSAoLTEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogRGVmYXVsdCBibG9jayBzaXplIGRpc2FibGVkLlxuIiwgbmFtZSk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodmFsdWUgPCA1MTIgfHwgdmFsdWUgPiBPU19EQVRBX1NJWkUgfHwgT1NfREFUQV9TSVpFICUgdmFsdWUpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpXOiBEZWZhdWx0IGJsb2NrIHNpemUgY2Fubm90IGJlIHNldCB0byAlZC5cbiIsCisJCQkJCQkJIG5hbWUsIHZhbHVlKTsKKwkJCQlyZXR1cm4gKC1FSU5WQUwpOworCQkJfQorCQkJU1RtLT5kZWZhdWx0X2Jsa3NpemUgPSB2YWx1ZTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IERlZmF1bHQgYmxvY2sgc2l6ZSBzZXQgdG8gJWQgYnl0ZXMuXG4iLAorCQkJCQkgIG5hbWUsIFNUbS0+ZGVmYXVsdF9ibGtzaXplKTsKKwkJfQorCX0KKwllbHNlIGlmIChjb2RlID09IE1UX1NUX1RJTUVPVVRTKSB7CisJCXZhbHVlID0gKG9wdGlvbnMgJiB+TVRfU1RfT1BUSU9OUyk7CisJCWlmICgodmFsdWUgJiBNVF9TVF9TRVRfTE9OR19USU1FT1VUKSAhPSAwKSB7CisJCQlTVHAtPmxvbmdfdGltZW91dCA9ICh2YWx1ZSAmIH5NVF9TVF9TRVRfTE9OR19USU1FT1VUKSAqIEhaOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogTG9uZyB0aW1lb3V0IHNldCB0byAlZCBzZWNvbmRzLlxuIiwgbmFtZSwKKwkJCQkJICAgICAodmFsdWUgJiB+TVRfU1RfU0VUX0xPTkdfVElNRU9VVCkpOworCQl9CisJCWVsc2UgeworCQkJU1RwLT50aW1lb3V0ID0gdmFsdWUgKiBIWjsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IE5vcm1hbCB0aW1lb3V0IHNldCB0byAlZCBzZWNvbmRzLlxuIiwgbmFtZSwgdmFsdWUpOworCQl9CisJfQorCWVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfREVGX09QVElPTlMpIHsKKwkJY29kZSA9IChvcHRpb25zICYgfk1UX1NUX0NMRUFSX0RFRkFVTFQpOworCQl2YWx1ZSA9IChvcHRpb25zICYgTVRfU1RfQ0xFQVJfREVGQVVMVCk7CisJCWlmIChjb2RlID09IE1UX1NUX0RFRl9ERU5TSVRZKSB7CisJCQlpZiAodmFsdWUgPT0gTVRfU1RfQ0xFQVJfREVGQVVMVCkgeworCQkJCVNUbS0+ZGVmYXVsdF9kZW5zaXR5ID0gKC0xKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBEZW5zaXR5IGRlZmF1bHQgZGlzYWJsZWQuXG4iLCBuYW1lKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNUbS0+ZGVmYXVsdF9kZW5zaXR5ID0gdmFsdWUgJiAweGZmOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IERlbnNpdHkgZGVmYXVsdCBzZXQgdG8gJXhcbiIsCisJCQkJCQkgIG5hbWUsIFNUbS0+ZGVmYXVsdF9kZW5zaXR5KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjb2RlID09IE1UX1NUX0RFRl9EUlZCVUZGRVIpIHsKKwkJCWlmICh2YWx1ZSA9PSBNVF9TVF9DTEVBUl9ERUZBVUxUKSB7CisJCQkJU1RwLT5kZWZhdWx0X2RydmJ1ZmZlciA9IDB4ZmY7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogRHJpdmUgYnVmZmVyIGRlZmF1bHQgZGlzYWJsZWQuXG4iLCBuYW1lKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNUcC0+ZGVmYXVsdF9kcnZidWZmZXIgPSB2YWx1ZSAmIDc7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogRHJpdmUgYnVmZmVyIGRlZmF1bHQgc2V0IHRvICV4XG4iLAorCQkJCQkJICBuYW1lLCBTVHAtPmRlZmF1bHRfZHJ2YnVmZmVyKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjb2RlID09IE1UX1NUX0RFRl9DT01QUkVTU0lPTikgeworCQkJaWYgKHZhbHVlID09IE1UX1NUX0NMRUFSX0RFRkFVTFQpIHsKKwkJCQlTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gPSBTVF9ET05UX1RPVUNIOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOkk6IENvbXByZXNzaW9uIGRlZmF1bHQgZGlzYWJsZWQuXG4iLCBuYW1lKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiA9ICh2YWx1ZSAmIDEgPyBTVF9ZRVMgOiBTVF9OTyk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogQ29tcHJlc3Npb24gZGVmYXVsdCBzZXQgdG8gJXhcbiIsCisJCQkJCQkgIG5hbWUsICh2YWx1ZSAmIDEpKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCXJldHVybiAoLUVJTyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBJbnRlcm5hbCBpb2N0bCBmdW5jdGlvbiAqLworc3RhdGljIGludCBvc3N0X2ludF9pb2N0bChzdHJ1Y3Qgb3NzdF90YXBlICogU1RwLCBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50CQkJdGltZW91dDsKKwlsb25nCQkJbHRtcDsKKwlpbnQJCQlpLCBpb2N0bF9yZXN1bHQ7CisJaW50CQkJY2hnX2VvZiA9IDE7CisJdW5zaWduZWQgY2hhcgkJY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgICAqIFNScG50ID0gKiBhU1JwbnQ7CisJc3RydWN0IHN0X3BhcnRzdGF0ICAgICogU1RwczsKKwlpbnQJCQlmaWxlbm8sIGJsa25vLCBhdF9zbSwgZnJhbWVfc2VxX251bWJyLCBsb2dpY2FsX2Jsa19udW07CisJaW50CQkJZGF0YWxlbiA9IDAsIGRpcmVjdGlvbiA9IERNQV9OT05FOworCWNoYXIJCSAgICAgICogbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkgJiYgY21kX2luICE9IE1UTE9BRCkgeworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9OT19UQVBFKQorCQkJcmV0dXJuICgtRU5PTUVESVVNKTsKKwkJZWxzZQorCQkJcmV0dXJuICgtRUlPKTsKKwl9CisJdGltZW91dCA9IFNUcC0+bG9uZ190aW1lb3V0OworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlmaWxlbm8gPSBTVHBzLT5kcnZfZmlsZTsKKwlibGtubyA9IFNUcHMtPmRydl9ibG9jazsKKwlhdF9zbSA9IFNUcHMtPmF0X3NtOworCWZyYW1lX3NlcV9udW1iciA9IFNUcC0+ZnJhbWVfc2VxX251bWJlcjsKKwlsb2dpY2FsX2Jsa19udW0gPSBTVHAtPmxvZ2ljYWxfYmxrX251bTsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCXN3aXRjaCAoY21kX2luKSB7CisJIGNhc2UgTVRGU0ZNOgorCQljaGdfZW9mID0gMDsgLyogQ2hhbmdlZCBmcm9tIHRoZSBGU0YgYWZ0ZXIgdGhpcyAqLworCSBjYXNlIE1URlNGOgorCQlpZiAoU1RwLT5yYXcpCisJCSAgIHJldHVybiAoLUVJTyk7CisJCWlmIChTVHAtPmxpbnV4X21lZGlhKQorCQkgICBpb2N0bF9yZXN1bHQgPSBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2ZvcndhcmRfZmFzdChTVHAsICZTUnBudCwgY21kX2luLCBhcmcpOworCQllbHNlCisJCSAgIGlvY3RsX3Jlc3VsdCA9IG9zc3Rfc3BhY2Vfb3Zlcl9maWxlbWFya3NfZm9yd2FyZF9zbG93KFNUcCwgJlNScG50LCBjbWRfaW4sIGFyZyk7CisJCWlmIChmaWxlbm8gPj0gMCkKKwkJICAgZmlsZW5vICs9IGFyZzsKKwkJYmxrbm8gPSAwOworCQlhdF9zbSAmPSAoYXJnID09IDApOworCQlnb3RvIG9zX2J5cGFzczsKKworCSBjYXNlIE1UQlNGOgorCQljaGdfZW9mID0gMDsgLyogQ2hhbmdlZCBmcm9tIHRoZSBGU0YgYWZ0ZXIgdGhpcyAqLworCSBjYXNlIE1UQlNGTToKKwkJaWYgKFNUcC0+cmF3KQorCQkgICByZXR1cm4gKC1FSU8pOworCQlpb2N0bF9yZXN1bHQgPSBvc3N0X3NwYWNlX292ZXJfZmlsZW1hcmtzX2JhY2t3YXJkKFNUcCwgJlNScG50LCBjbWRfaW4sIGFyZyk7CisJCWlmIChmaWxlbm8gPj0gMCkKKwkJICAgZmlsZW5vIC09IGFyZzsKKwkJYmxrbm8gPSAoLTEpOyAgLyogV2UgY2FuJ3Qga25vdyB0aGUgYmxvY2sgbnVtYmVyICovCisJCWF0X3NtICY9IChhcmcgPT0gMCk7CisJCWdvdG8gb3NfYnlwYXNzOworCisJIGNhc2UgTVRGU1I6CisJIGNhc2UgTVRCU1I6CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2tpcHBpbmcgJWx1IGJsb2NrcyAlcyBmcm9tIGxvZ2ljYWwgYmxvY2sgJWRcbiIsCisJCQkJbmFtZSwgYXJnLCBjbWRfaW49PU1URlNSPyJmb3J3YXJkIjoiYmFja3dhcmQiLCBsb2dpY2FsX2Jsa19udW0pOworI2VuZGlmCisJCWlmIChjbWRfaW4gPT0gTVRGU1IpIHsKKwkJICAgbG9naWNhbF9ibGtfbnVtICs9IGFyZzsKKwkJICAgaWYgKGJsa25vID49IDApIGJsa25vICs9IGFyZzsKKwkJfQorCQllbHNlIHsKKwkJICAgbG9naWNhbF9ibGtfbnVtIC09IGFyZzsKKwkJICAgaWYgKGJsa25vID49IDApIGJsa25vIC09IGFyZzsKKwkJfQorCQlpb2N0bF9yZXN1bHQgPSBvc3N0X3NlZWtfbG9naWNhbF9ibGsoU1RwLCAmU1JwbnQsIGxvZ2ljYWxfYmxrX251bSk7CisJCWZpbGVubyA9IFNUcHMtPmRydl9maWxlOworCQlibGtubyAgPSBTVHBzLT5kcnZfYmxvY2s7CisJCWF0X3NtICY9IChhcmcgPT0gMCk7CisJCWdvdG8gb3NfYnlwYXNzOworCisJIGNhc2UgTVRGU1M6CisJCWNtZFswXSA9IFNQQUNFOworCQljbWRbMV0gPSAweDA0OyAvKiBTcGFjZSBTZXRtYXJrcyAqLyAgIC8qIEZJWE1FIC0tIE9TIGNhbid0IGRvIHRoaXM/ICovCisJCWNtZFsyXSA9IChhcmcgPj4gMTYpOworCQljbWRbM10gPSAoYXJnID4+IDgpOworCQljbWRbNF0gPSBhcmc7CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNwYWNpbmcgdGFwZSBmb3J3YXJkICVkIHNldG1hcmtzLlxuIiwgbmFtZSwKKwkJY21kWzJdICogNjU1MzYgKyBjbWRbM10gKiAyNTYgKyBjbWRbNF0pOworI2VuZGlmCisJCWlmIChhcmcgIT0gMCkgeworCQkJYmxrbm8gPSBmaWxlbm8gPSAoLTEpOworCQkJYXRfc20gPSAxOworCQl9CisJCWJyZWFrOworCSBjYXNlIE1UQlNTOgorCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMHgwNDsgLyogU3BhY2UgU2V0bWFya3MgKi8gICAvKiBGSVhNRSAtLSBPUyBjYW4ndCBkbyB0aGlzPyAqLworCQlsdG1wID0gKC1hcmcpOworCQljbWRbMl0gPSAobHRtcCA+PiAxNik7CisJCWNtZFszXSA9IChsdG1wID4+IDgpOworCQljbWRbNF0gPSBsdG1wOworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpIHsKKwkJCWlmIChjbWRbMl0gJiAweDgwKQorCQkJICAgbHRtcCA9IDB4ZmYwMDAwMDA7CisJCQlsdG1wID0gbHRtcCB8IChjbWRbMl0gPDwgMTYpIHwgKGNtZFszXSA8PCA4KSB8IGNtZFs0XTsKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFNwYWNpbmcgdGFwZSBiYWNrd2FyZCAlbGQgc2V0bWFya3MuXG4iLAorCQkJCQkJbmFtZSwgKC1sdG1wKSk7CisJCSB9CisjZW5kaWYKKwkJIGlmIChhcmcgIT0gMCkgeworCQkJYmxrbm8gPSBmaWxlbm8gPSAoLTEpOworCQkJYXRfc20gPSAxOworCQkgfQorCQkgYnJlYWs7CisJIGNhc2UgTVRXRU9GOgorCQkgaWYgKChTVHBzLT5ydyA9PSBTVF9XUklUSU5HIHx8IFNUcC0+ZGlydHkpICYmICFTVHAtPnBvc191bmtub3duKSB7CisJCQlTVHAtPndyaXRlX3R5cGUgPSBPU19XUklURV9EQVRBOworCQkJaW9jdGxfcmVzdWx0ID0gb3NzdF9mbHVzaF93cml0ZV9idWZmZXIoU1RwLCAmU1JwbnQpOworCQkgfSBlbHNlCisJCQlpb2N0bF9yZXN1bHQgPSAwOworI2lmIERFQlVHCisJCSBpZiAoZGVidWdnaW5nKSAKKwkJCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRpbmcgJWxkIGZpbGVtYXJrKHMpLlxuIiwgbmFtZSwgYXJnKTsKKyNlbmRpZgorCQkgZm9yIChpPTA7IGk8YXJnOyBpKyspCisJCQlpb2N0bF9yZXN1bHQgfD0gb3NzdF93cml0ZV9maWxlbWFyayhTVHAsICZTUnBudCk7CisJCSBpZiAoZmlsZW5vID49IDApIGZpbGVubyArPSBhcmc7CisJCSBpZiAoYmxrbm8gID49IDApIGJsa25vICAgPSAwOworCQkgZ290byBvc19ieXBhc3M7CisKKwkgY2FzZSBNVFdTTToKKwkJIGlmIChTVHAtPndyaXRlX3Byb3QpCisJCQlyZXR1cm4gKC1FQUNDRVMpOworCQkgaWYgKCFTVHAtPnJhdykKKwkJCXJldHVybiAwOworCQkgY21kWzBdID0gV1JJVEVfRklMRU1BUktTOyAgIC8qIEZJWE1FIC0tIG5lZWQgT1MgdmVyc2lvbiAqLworCQkgaWYgKGNtZF9pbiA9PSBNVFdTTSkKKwkJCSBjbWRbMV0gPSAyOworCQkgY21kWzJdID0gKGFyZyA+PiAxNik7CisJCSBjbWRbM10gPSAoYXJnID4+IDgpOworCQkgY21kWzRdID0gYXJnOworCQkgdGltZW91dCA9IFNUcC0+dGltZW91dDsKKyNpZiBERUJVRworCQkgaWYgKGRlYnVnZ2luZykgCisJCQkgICBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBXcml0aW5nICVkIHNldG1hcmsocykuXG4iLCBuYW1lLAorCQkJCSAgY21kWzJdICogNjU1MzYgKyBjbWRbM10gKiAyNTYgKyBjbWRbNF0pOworI2VuZGlmCisJCSBpZiAoZmlsZW5vID49IDApCisJCQlmaWxlbm8gKz0gYXJnOworCQkgYmxrbm8gPSAwOworCQkgYXRfc20gPSAoY21kX2luID09IE1UV1NNKTsKKwkJIGJyZWFrOworCSBjYXNlIE1UT0ZGTDoKKwkgY2FzZSBNVExPQUQ6CisJIGNhc2UgTVRVTkxPQUQ6CisJIGNhc2UgTVRSRVRFTjoKKwkJIGNtZFswXSA9IFNUQVJUX1NUT1A7CisJCSBjbWRbMV0gPSAxOwkJCS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJIGlmIChjbWRfaW4gPT0gTVRMT0FEKSB7CisJCSAgICAgaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCSBjbWRbNF0gPSA0OwkJLyogb3BlbiB0cmF5ICovCisJCSAgICAgIGVsc2UKKwkJCSBjbWRbNF0gPSAxOwkJLyogbG9hZCAqLworCQkgfQorCQkgaWYgKGNtZF9pbiA9PSBNVFJFVEVOKQorCQkJIGNtZFs0XSA9IDM7CQkvKiByZXRlbnNpb24gdGhlbiBtb3VudCAqLworCQkgaWYgKGNtZF9pbiA9PSBNVE9GRkwpCisJCQkgY21kWzRdID0gNDsJCS8qIHJld2luZCB0aGVuIGVqZWN0ICovCisJCSB0aW1lb3V0ID0gU1RwLT50aW1lb3V0OworI2lmIERFQlVHCisJCSBpZiAoZGVidWdnaW5nKSB7CisJCQkgc3dpdGNoIChjbWRfaW4pIHsKKwkJCQkgY2FzZSBNVFVOTE9BRDoKKwkJCQkJIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFVubG9hZGluZyB0YXBlLlxuIiwgbmFtZSk7CisJCQkJCSBicmVhazsKKwkJCQkgY2FzZSBNVExPQUQ6CisJCQkJCSBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBMb2FkaW5nIHRhcGUuXG4iLCBuYW1lKTsKKwkJCQkJIGJyZWFrOworCQkJCSBjYXNlIE1UUkVURU46CisJCQkJCSBwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBSZXRlbnNpb25pbmcgdGFwZS5cbiIsIG5hbWUpOworCQkJCQkgYnJlYWs7CisJCQkJIGNhc2UgTVRPRkZMOgorCQkJCQkgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogRWplY3RpbmcgdGFwZS5cbiIsIG5hbWUpOworCQkJCQkgYnJlYWs7CisJCQkgfQorCQkgfQorI2VuZGlmCisgICAgICAgZmlsZW5vID0gYmxrbm8gPSBhdF9zbSA9IGZyYW1lX3NlcV9udW1iciA9IGxvZ2ljYWxfYmxrX251bSA9IDAgOworCQkgYnJlYWs7CisJIGNhc2UgTVROT1A6CisjaWYgREVCVUcKKwkJIGlmIChkZWJ1Z2dpbmcpCisJCQkgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTm8tb3Agb24gdGFwZS5cbiIsIG5hbWUpOworI2VuZGlmCisJCSByZXR1cm4gMDsgIC8qIFNob3VsZCBkbyBzb21ldGhpbmcgPyAqLworCQkgYnJlYWs7CisJIGNhc2UgTVRFT006CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJICAgcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU3BhY2luZyB0byBlbmQgb2YgcmVjb3JkZWQgbWVkaXVtLlxuIiwgbmFtZSk7CisjZW5kaWYKKwkJaWYgKChvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCAmU1JwbnQsIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpIDwgMCkgfHwKKwkJCSAgICAob3NzdF9nZXRfbG9naWNhbF9mcmFtZShTVHAsICZTUnBudCwgLTEsIDApICAgICAgICAgICAgICAgPCAwKSkgeworCQkgICBpb2N0bF9yZXN1bHQgPSAtRUlPOworCQkgICBnb3RvIG9zX2J5cGFzczsKKwkJfQorCQlpZiAoU1RwLT5idWZmZXItPmF1eC0+ZnJhbWVfdHlwZSAhPSBPU19GUkFNRV9UWVBFX0VPRCkgeworI2lmIERFQlVHCisJCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IE5vIEVPRCBmcmFtZSBmb3VuZCB3aGVyZSBleHBlY3RlZC5cbiIsIG5hbWUpOworI2VuZGlmCisJCSAgIGlvY3RsX3Jlc3VsdCA9IC1FSU87CisJCSAgIGdvdG8gb3NfYnlwYXNzOworCQl9CisJCWlvY3RsX3Jlc3VsdCA9IG9zc3Rfc2V0X2ZyYW1lX3Bvc2l0aW9uKFNUcCwgJlNScG50LCBTVHAtPmVvZF9mcmFtZV9wcG9zLCAwKTsKKwkJZmlsZW5vID0gU1RwLT5maWxlbWFya19jbnQ7CisJCWJsa25vICA9IGF0X3NtID0gMDsKKwkJZ290byBvc19ieXBhc3M7CisKKwkgY2FzZSBNVEVSQVNFOgorCQlpZiAoU1RwLT53cml0ZV9wcm90KQorCQkgICByZXR1cm4gKC1FQUNDRVMpOworCQlpb2N0bF9yZXN1bHQgPSBvc3N0X3Jlc2V0X2hlYWRlcihTVHAsICZTUnBudCk7CisJCWkgPSBvc3N0X3dyaXRlX2VvZChTVHAsICZTUnBudCk7CisJCWlmIChpIDwgaW9jdGxfcmVzdWx0KSBpb2N0bF9yZXN1bHQgPSBpOworCQlpID0gb3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgJlNScG50LCBTVHAtPmVvZF9mcmFtZV9wcG9zKTsKKwkJaWYgKGkgPCBpb2N0bF9yZXN1bHQpIGlvY3RsX3Jlc3VsdCA9IGk7CisJCWZpbGVubyA9IGJsa25vID0gYXRfc20gPSAwIDsKKwkJZ290byBvc19ieXBhc3M7CisKKwkgY2FzZSBNVFJFVzoKKwkJY21kWzBdID0gUkVaRVJPX1VOSVQ7IC8qIHJld2luZCAqLworCQljbWRbMV0gPSAxOworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCSAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFJld2luZGluZyB0YXBlLCBJbW1lZD0lZC5cbiIsIG5hbWUsIGNtZFsxXSk7CisjZW5kaWYKKwkJZmlsZW5vID0gYmxrbm8gPSBhdF9zbSA9IGZyYW1lX3NlcV9udW1iciA9IGxvZ2ljYWxfYmxrX251bSA9IDAgOworCQlicmVhazsKKworCSBjYXNlIE1UU0VUQkxLOiAgICAgICAgICAgLyogU2V0IGJsb2NrIGxlbmd0aCAqLworCQkgaWYgKChTVHBzLT5kcnZfYmxvY2sgPT0gMCApCQkJICAmJgorCQkgICAgICFTVHAtPmRpcnR5CQkJCSAgJiYKKwkJICAgICAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID09IDApCQkgICYmCisJCSAgICAgKChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spID49IDUxMiApCSAgJiYgCisJCSAgICAgKChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spIDw9IE9TX0RBVEFfU0laRSkgJiYKKwkJICAgICAhKE9TX0RBVEFfU0laRSAlIChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spKSAgKSB7CisJCQkgLyoKKwkJCSAgKiBPbmx5IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBibG9jayBzaXplIGlmIHlvdSBvcGVuZWQgdGhlCisJCQkgICogZGV2aWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlIGJlZm9yZSB3cml0aW5nIGFueXRoaW5nLgorCQkJICAqIE5vdGUsIHRoYXQgd2hlbiByZWFkaW5nLCBjaGFuZ2luZyBibG9ja19zaXplIGlzIGZ1dGlsZSwKKwkJCSAgKiBhcyB0aGUgc2l6ZSB1c2VkIHdoZW4gd3JpdGluZyBvdmVycmlkZXMgaXQuCisJCQkgICovCisJCQkgU1RwLT5ibG9ja19zaXplID0gKGFyZyAmIE1UX1NUX0JMS1NJWkVfTUFTSyk7CisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogQmxvY2sgc2l6ZSBzZXQgdG8gJWQgYnl0ZXMuXG4iLAorCQkJCQkgICBuYW1lLCBTVHAtPmJsb2NrX3NpemUpOworCQkJIHJldHVybiAwOworCQkgfQorCSBjYXNlIE1UU0VUREVOU0lUWTogICAgICAgLyogU2V0IHRhcGUgZGVuc2l0eSAqLworCSBjYXNlIE1UU0VURFJWQlVGRkVSOiAgICAgLyogU2V0IGRyaXZlIGJ1ZmZlcmluZyAqLworCSBjYXNlIFNFVF9ERU5TX0FORF9CTEs6ICAgLyogU2V0IGRlbnNpdHkgYW5kIGJsb2NrIHNpemUgKi8KKwkJIGNoZ19lb2YgPSAwOworCQkgaWYgKFNUcC0+ZGlydHkgfHwgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzICE9IDApCisJCQkgcmV0dXJuICgtRUlPKTsgICAgICAgLyogTm90IGFsbG93ZWQgaWYgZGF0YSBpbiBidWZmZXIgKi8KKwkJIGlmICgoY21kX2luID09IE1UU0VUQkxLIHx8IGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKSAmJgorCQkgICAgIChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spICE9IDAgICAgICAgICAgICAgICAgICAgICYmCisJCSAgICAgKGFyZyAmIE1UX1NUX0JMS1NJWkVfTUFTSykgIT0gU1RwLT5ibG9ja19zaXplICAgICAgICkgeworCQkJIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IElsbGVnYWwgdG8gc2V0IGJsb2NrIHNpemUgdG8gJWQlcy5cbiIsCisJCQkJCQluYW1lLCAoaW50KShhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spLAorCQkJCQkJKE9TX0RBVEFfU0laRSAlIChhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0spKT8iIjoiIG5vdyIpOworCQkJIHJldHVybiAoLUVJTlZBTCk7CisJCSB9CisJCSByZXR1cm4gMDsgIC8qIEZJWE1FIHNpbGVudGx5IGlnbm9yZSBpZiBibG9jayBzaXplIGRpZG4ndCBjaGFuZ2UgKi8KKworCSBkZWZhdWx0OgorCQlyZXR1cm4gKC1FTk9TWVMpOworCX0KKworCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgZGF0YWxlbiwgZGlyZWN0aW9uLCB0aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CisKKwlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCWlmICghU1JwbnQpIHsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBDb3VsZG4ndCBleGVjIHNjc2kgY21kIGZvciBJT0NUTFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIGlvY3RsX3Jlc3VsdDsKKwl9CisKKwlpZiAoIWlvY3RsX3Jlc3VsdCkgeyAgLyogU0NTSSBjb21tYW5kIHN1Y2Nlc3NmdWwgKi8KKwkJU1RwLT5mcmFtZV9zZXFfbnVtYmVyID0gZnJhbWVfc2VxX251bWJyOworCQlTVHAtPmxvZ2ljYWxfYmxrX251bSAgPSBsb2dpY2FsX2Jsa19udW07CisJfQorCitvc19ieXBhc3M6CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKQorCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBJT0NUTCAoJWQpIFJlc3VsdD0lZFxuIiwgbmFtZSwgY21kX2luLCBpb2N0bF9yZXN1bHQpOworI2VuZGlmCisKKwlpZiAoIWlvY3RsX3Jlc3VsdCkgewkJCQkvKiBzdWNjZXNzICovCisKKwkJaWYgKGNtZF9pbiA9PSBNVEZTRk0pIHsKKwkJCSBmaWxlbm8tLTsKKwkJCSBibGtuby0tOworCQl9CisJCWlmIChjbWRfaW4gPT0gTVRCU0ZNKSB7CisJCQkgZmlsZW5vKys7CisJCQkgYmxrbm8rKzsKKwkJfQorCQlTVHBzLT5kcnZfYmxvY2sgPSBibGtubzsKKwkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm87CisJCVNUcHMtPmF0X3NtID0gYXRfc207CisKKwkJaWYgKGNtZF9pbiA9PSBNVEVPTSkKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKwkJZWxzZSBpZiAoKGNtZF9pbiA9PSBNVEZTRk0gfHwgY21kX2luID09IE1UQlNGKSAmJiBTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQlpb2N0bF9yZXN1bHQgPSBvc3N0X3NlZWtfbG9naWNhbF9ibGsoU1RwLCAmU1JwbnQsIFNUcC0+bG9naWNhbF9ibGtfbnVtLTEpOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrKys7CisJCQlTVHAtPmxvZ2ljYWxfYmxrX251bSsrOworCQkJU1RwLT5mcmFtZV9zZXFfbnVtYmVyKys7CisJCQlTVHAtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisJCQlTVHAtPmJ1ZmZlci0+cmVhZF9wb2ludGVyID0gMDsKKwkJfQorCQllbHNlIGlmIChjbWRfaW4gPT0gTVRGU0YpCisJCQlTVHBzLT5lb2YgPSAoU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiA+PSBTVHAtPmVvZF9mcmFtZV9wcG9zKT9TVF9FT0Q6U1RfRk07CisJCWVsc2UgaWYgKGNoZ19lb2YpCisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKworCQlpZiAoY21kX2luID09IE1UT0ZGTCB8fCBjbWRfaW4gPT0gTVRVTkxPQUQpCisJCQlTVHAtPnJld19hdF9jbG9zZSA9IDA7CisJCWVsc2UgaWYgKGNtZF9pbiA9PSBNVExPQUQpIHsKKwkJCWZvciAoaT0wOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQkJICAgIFNUcC0+cHNbaV0ucncgPSBTVF9JRExFOworCQkJICAgIFNUcC0+cHNbaV0ubGFzdF9ibG9ja192YWxpZCA9IDA7LyogRklYTUUgLSB3aGVyZSBlbHNlIGlzIHRoaXMgZmllbGQgbWFpbnRhaW5lZD8gKi8KKwkJCX0KKwkJCVNUcC0+cGFydGl0aW9uID0gMDsKKwkJfQorCisJCWlmIChjbWRfaW4gPT0gTVRSRVcpIHsKKwkJCWlvY3RsX3Jlc3VsdCA9IG9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsICZTUnBudCwgU1RwLT5maXJzdF9kYXRhX3Bwb3MpOyAKKwkJCWlmIChpb2N0bF9yZXN1bHQgPiAwKQorCQkJCWlvY3RsX3Jlc3VsdCA9IDA7CisJCX0KKworCX0gZWxzZSBpZiAoY21kX2luID09IE1UQlNGIHx8IGNtZF9pbiA9PSBNVEJTRk0gKSB7CisJCWlmIChvc3N0X3Bvc2l0aW9uX3RhcGVfYW5kX2NvbmZpcm0oU1RwLCAmU1JwbnQsIFNUcC0+Zmlyc3RfZGF0YV9wcG9zKSA8IDApCisJCQlTVHBzLT5kcnZfZmlsZSA9IFNUcHMtPmRydl9ibG9jayA9IC0xOworCQllbHNlCisJCQlTVHBzLT5kcnZfZmlsZSA9IFNUcHMtPmRydl9ibG9jayA9IDA7CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCX0gZWxzZSBpZiAoY21kX2luID09IE1URlNGIHx8IGNtZF9pbiA9PSBNVEZTRk0pIHsKKwkJaWYgKG9zc3RfcG9zaXRpb25fdGFwZV9hbmRfY29uZmlybShTVHAsICZTUnBudCwgU1RwLT5lb2RfZnJhbWVfcHBvcykgPCAwKQorCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAtMTsKKwkJZWxzZSB7CisJCQlTVHBzLT5kcnZfZmlsZSAgPSBTVHAtPmZpbGVtYXJrX2NudDsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCX0KKwkJU1Rwcy0+ZW9mID0gU1RfRU9EOworCX0gZWxzZSBpZiAoY21kX2luID09IE1UQlNSIHx8IGNtZF9pbiA9PSBNVEZTUiB8fCBjbWRfaW4gPT0gTVRXRU9GIHx8IGNtZF9pbiA9PSBNVEVPTSkgeworCQlTVHBzLT5kcnZfZmlsZSA9IFNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQlTVHAtPmhlYWRlcl9vayA9IDA7CisJfSBlbHNlIGlmIChjbWRfaW4gPT0gTVRFUkFTRSkgeworCQlTVHAtPmhlYWRlcl9vayA9IDA7CisJfSBlbHNlIGlmIChTUnBudCkgeyAgLyogU0NTSSBjb21tYW5kIHdhcyBub3QgY29tcGxldGVseSBzdWNjZXNzZnVsLiAqLworCQlpZiAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4NDApIHsKKwkJCVNUcHMtPmVvZiA9IFNUX0VPTV9PSzsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCX0KKwkJaWYgKGNoZ19lb2YpCisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKworCQlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSA9PSBCTEFOS19DSEVDSykKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKworCQlpZiAoY21kX2luID09IE1UTE9BRCAmJiBvc3N0X3dhaXRfZm9yX21lZGl1bShTVHAsICZTUnBudCwgNjApKQorCQkJaW9jdGxfcmVzdWx0ID0gb3NzdF93YWl0X3JlYWR5KFNUcCwgJlNScG50LCA1ICogNjAsIE9TU1RfV0FJVF9QT1NJVElPTl9DT01QTEVURSk7CisJfQorCSphU1JwbnQgPSBTUnBudDsKKworCXJldHVybiBpb2N0bF9yZXN1bHQ7Cit9CisKKworLyogT3BlbiB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IG9zX3Njc2lfdGFwZV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJdW5zaWduZWQgc2hvcnQJICAgICAgZmxhZ3M7CisJaW50CQkgICAgICBpLCBiX3NpemUsIG5ld19zZXNzaW9uID0gMCwgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBjaGFyCSAgICAgIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICogU1JwbnQgPSBOVUxMOworCXN0cnVjdCBvc3N0X3RhcGUgICAgKiBTVHA7CisJc3RydWN0IHN0X21vZGVkZWYgICAqIFNUbTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICogU1RwczsKKwljaGFyCQkgICAgKiBuYW1lOworCWludAkJICAgICAgZGV2ICA9IFRBUEVfTlIoaW5vZGUpOworCWludAkJICAgICAgbW9kZSA9IFRBUEVfTU9ERShpbm9kZSk7CisKKwkvKgorCSAqIFdlIHJlYWxseSB3YW50IHRvIGRvIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOyBoZXJlLCBidXQgc29tZQorCSAqIHZlcnNpb25zIG9mIHRhciBpbmNvcnJlY3RseSBjYWxsIGxzZWVrIG9uIHRhcGVzIGFuZCBiYWlsIG91dCBpZiB0aGF0CisJICogZmFpbHMuICBTbyB3ZSBkaXNhbGxvdyBwcmVhZCgpIGFuZCBwd3JpdGUoKSwgYnV0IHBlcm1pdCBsc2Vla3MuCisJICovCisJZmlscC0+Zl9tb2RlICY9IH4oRk1PREVfUFJFQUQgfCBGTU9ERV9QV1JJVEUpOworCisJd3JpdGVfbG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwlpZiAoZGV2ID49IG9zc3RfbWF4X2RldiB8fCBvc19zY3NpX3RhcGVzID09IE5VTEwgfHwKKwkgICAgKFNUcCA9IG9zX3Njc2lfdGFwZXNbZGV2XSkgPT0gTlVMTCB8fCAhU1RwLT5kZXZpY2UpIHsKKwkJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCQlyZXR1cm4gKC1FTlhJTyk7CisJfQorCisJbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKFNUcC0+aW5fdXNlKSB7CisJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKyNpZiBERUJVRworCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBEZXZpY2UgYWxyZWFkeSBpbiB1c2UuXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gKC1FQlVTWSk7CisJfQorCWlmIChzY3NpX2RldmljZV9nZXQoU1RwLT5kZXZpY2UpKSB7CisJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKyNpZiBERUJVRworICAgICAgICAgICAgICAgIHByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEZhaWxlZCBzY3NpX2RldmljZV9nZXQuXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gKC1FTlhJTyk7CisJfQorCWZpbHAtPnByaXZhdGVfZGF0YSA9IFNUcDsKKwlTVHAtPmluX3VzZSA9IDE7CisJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCVNUcC0+cmV3X2F0X2Nsb3NlID0gVEFQRV9SRVdJTkQoaW5vZGUpOworCisJaWYoICFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoU1RwLT5kZXZpY2UpICkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWlmIChtb2RlICE9IFNUcC0+Y3VycmVudF9tb2RlKSB7CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IE1vZGUgY2hhbmdlIGZyb20gJWQgdG8gJWQuXG4iLAorCQkJCQkgICAgICAgbmFtZSwgU1RwLT5jdXJyZW50X21vZGUsIG1vZGUpOworI2VuZGlmCisJCW5ld19zZXNzaW9uID0gMTsKKwkJU1RwLT5jdXJyZW50X21vZGUgPSBtb2RlOworCX0KKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKworCWZsYWdzID0gZmlscC0+Zl9mbGFnczsKKwlTVHAtPndyaXRlX3Byb3QgPSAoKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSk7CisKKwlTVHAtPnJhdyA9IFRBUEVfSVNfUkFXKGlub2RlKTsKKwlpZiAoU1RwLT5yYXcpCisJCVNUcC0+aGVhZGVyX29rID0gMDsKKworCS8qIEFsbG9jYXRlIGRhdGEgc2VnbWVudHMgZm9yIHRoaXMgZGV2aWNlJ3MgdGFwZSBidWZmZXIgKi8KKwlpZiAoIWVubGFyZ2VfYnVmZmVyKFNUcC0+YnVmZmVyLCBTVHAtPnJlc3RyX2RtYSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpFOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHNlZ21lbnRzIGZvciB0YXBlIGJ1ZmZlci5cbiIsIG5hbWUpOworCQlyZXR2YWwgPSAoLUVPVkVSRkxPVyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKFNUcC0+YnVmZmVyLT5idWZmZXJfc2l6ZSA+PSBPU19GUkFNRV9TSVpFKSB7CisJCWZvciAoaSA9IDAsIGJfc2l6ZSA9IDA7IAorCQkgICAgIChpIDwgU1RwLT5idWZmZXItPnNnX3NlZ3MpICYmICgoYl9zaXplICsgU1RwLT5idWZmZXItPnNnW2ldLmxlbmd0aCkgPD0gT1NfREFUQV9TSVpFKTsgCisJCSAgICAgYl9zaXplICs9IFNUcC0+YnVmZmVyLT5zZ1tpKytdLmxlbmd0aCk7CisJCVNUcC0+YnVmZmVyLT5hdXggPSAob3NfYXV4X3QgKikgKHBhZ2VfYWRkcmVzcyhTVHAtPmJ1ZmZlci0+c2dbaV0ucGFnZSkgKyBPU19EQVRBX1NJWkUgLSBiX3NpemUpOworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IGJfZGF0YSBwb2ludHMgdG8gJXAgaW4gc2VnbWVudCAwIGF0ICVwXG4iLCBuYW1lLAorCQkJU1RwLT5idWZmZXItPmJfZGF0YSwgcGFnZV9hZGRyZXNzKFNUcC0+YnVmZmVyLT5zZ1swXS5wYWdlKSk7CisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFVWCBwb2ludHMgdG8gJXAgaW4gc2VnbWVudCAlZCBhdCAlcFxuIiwgbmFtZSwKKwkJCSBTVHAtPmJ1ZmZlci0+YXV4LCBpLCBwYWdlX2FkZHJlc3MoU1RwLT5idWZmZXItPnNnW2ldLnBhZ2UpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCVNUcC0+YnVmZmVyLT5hdXggPSBOVUxMOyAvKiB0aGlzIGhhZCBiZXR0ZXIgbmV2ZXIgaGFwcGVuISAqLworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOkE6IEZyYW1lc2l6ZSAlZCB0b28gbGFyZ2UgZm9yIGJ1ZmZlci5cbiIsIG5hbWUsIE9TX0ZSQU1FX1NJWkUpOworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJU1RwLT5idWZmZXItPndyaXRpbmcgPSAwOworCVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9IDA7CisJU1RwLT5kaXJ0eSA9IDA7CisJZm9yIChpPTA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCVNUcHMgPSAmKFNUcC0+cHNbaV0pOworCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJfQorCVNUcC0+cmVhZHkgPSBTVF9SRUFEWTsKKyNpZiBERUJVRworCVNUcC0+bmJyX3dhaXRzID0gU1RwLT5uYnJfZmluaXNoZWQgPSAwOworI2VuZGlmCisKKwltZW1zZXQgKGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJU1JwbnQgPSBvc3N0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLCBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KSB7CisJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwkJLyogRklYTUUgLSB2YWxpZD8gKi8KKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwICAgICAgJiYKKwkgICAgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gJiAweDBmKSA9PSBOT1RfUkVBRFkgJiYKKwkgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdICAgICAgICA9PSA0ICAgICAgICAgKSB7CisjaWYgREVCVUcKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogVW5pdCBub3QgcmVhZHksIGNhdXNlICV4XG4iLCBuYW1lLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSk7CisjZW5kaWYKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWlmIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAyKSB7CS8qIGluaXRpYWxpemUgY29tbWFuZCByZXF1aXJlZCAoTE9BRCkgKi8KKwkJCW1lbXNldCAoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKyAgICAgICAgCQljbWRbMF0gPSBTVEFSVF9TVE9QOworCQkJY21kWzFdID0gMTsKKwkJCWNtZFs0XSA9IDE7CisJCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJCQkgICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCQl9CisJCW9zc3Rfd2FpdF9yZWFkeShTVHAsICZTUnBudCwgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdPT0xPzE1OjMpICogNjAsIDApOworCX0KKwlpZiAoKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwICYmCisJICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gVU5JVF9BVFRFTlRJT04pIHsgLyogTmV3IG1lZGlhPyAqLworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFVuaXQgd2FudHMgYXR0ZW50aW9uXG4iLCBuYW1lKTsKKyNlbmRpZgorCQlTVHAtPmhlYWRlcl9vayA9IDA7CisKKwkJZm9yIChpPTA7IGkgPCAxMDsgaSsrKSB7CisKKwkJCW1lbXNldCAoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKworCQkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkJICAgICBTVHAtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSAmIDB4NzApICE9IDB4NzAgfHwKKwkJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpICE9IFVOSVRfQVRURU5USU9OKQorCQkJCWJyZWFrOworCQl9CisKKwkJU1RwLT5wb3NfdW5rbm93biA9IDA7CisJCVNUcC0+cGFydGl0aW9uID0gU1RwLT5uZXdfcGFydGl0aW9uID0gMDsKKwkJaWYgKFNUcC0+Y2FuX3BhcnRpdGlvbnMpCisJCQlTVHAtPm5icl9wYXJ0aXRpb25zID0gMTsgIC8qIFRoaXMgZ3Vlc3Mgd2lsbCBiZSB1cGRhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeSAqLworCQlmb3IgKGk9MDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJCVNUcHMgPSAmKFNUcC0+cHNbaV0pOworCQkJU1Rwcy0+cncgPSBTVF9JRExFOwkJLyogRklYTUUgLSBzZWVtcyB0byBiZSByZWR1bmRhbnQuLi4gKi8KKwkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQkJU1Rwcy0+YXRfc20gPSAwOworCQkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSAwIDsKKwkJfQorCQluZXdfc2Vzc2lvbiA9IDE7CisJCVNUcC0+cmVjb3Zlcl9jb3VudCA9IDA7CisJCVNUcC0+YWJvcnRfY291bnQgPSAwOworCX0KKwkvKgorCSAqIGlmIHdlIGhhdmUgdmFsaWQgaGVhZGVycyBmcm9tIGJlZm9yZSwgYW5kIHRoZSBkcml2ZS90YXBlIHNlZW0gdW50b3VjaGVkLAorCSAqIG9wZW4gd2l0aG91dCByZWNvbmZpZ3VyaW5nIGFuZCByZS1yZWFkaW5nIHRoZSBoZWFkZXJzCisJICovCisJaWYgKCFTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgJiYgU1RwLT5oZWFkZXJfb2sgJiYKKwkgICAgIVNScG50LT5zcl9yZXN1bHQgJiYgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSA9PSAwKSB7CisKKwkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IE1PREVfU0VOU0U7CisJCWNtZFsxXSA9IDg7CisJCWNtZFsyXSA9IFZFTkRPUl9JREVOVF9QQUdFOworCQljbWRbNF0gPSBWRU5ET1JfSURFTlRfUEFHRV9MRU5HVEggKyBNT0RFX0hFQURFUl9MRU5HVEg7CisKKwkJU1JwbnQgPSBvc3N0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwgU1RwLT50aW1lb3V0LCAwLCAxKTsKKworCQlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgfHwKKwkJICAgIFNUcC0+YnVmZmVyLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgMl0gIT0gJ0wnIHx8CisJCSAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDNdICE9ICdJJyB8fAorCQkgICAgU1RwLT5idWZmZXItPmJfZGF0YVtNT0RFX0hFQURFUl9MRU5HVEggKyA0XSAhPSAnTicgfHwKKwkJICAgIFNUcC0+YnVmZmVyLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsgNV0gIT0gJzQnICApIHsKKyNpZiBERUJVRworCQkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogU2lnbmF0dXJlIHdhcyBjaGFuZ2VkIHRvICVjJWMlYyVjXG4iLCBuYW1lLAorCQkJICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDJdLAorCQkJICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDNdLAorCQkJICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDRdLAorCQkJICBTVHAtPmJ1ZmZlci0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDVdKTsKKyNlbmRpZgorCQkJU1RwLT5oZWFkZXJfb2sgPSAwOworCQl9CisJCWkgPSBTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uOworCQlpZiAoU1RwLT5oZWFkZXJfb2sgJiYgaSA9PSBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsICZTUnBudCkpIHsKKwkJCWlmIChTVHAtPmRvb3JfbG9ja2VkID09IFNUX1VOTE9DS0VEKSB7CisJCQkJaWYgKGRvX2Rvb3JfbG9jayhTVHAsIDEpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBDYW4ndCBsb2NrIGRyaXZlIGRvb3JcbiIsIG5hbWUpOworCQkJCWVsc2UKKwkJCQkJU1RwLT5kb29yX2xvY2tlZCA9IFNUX0xPQ0tFRF9BVVRPOworCQkJfQorCQkJaWYgKCFTVHAtPmZyYW1lX2luX2J1ZmZlcikgeworCQkJCVNUcC0+YmxvY2tfc2l6ZSA9IChTVG0tPmRlZmF1bHRfYmxrc2l6ZSA+IDApID8KKwkJCQkJCQlTVG0tPmRlZmF1bHRfYmxrc2l6ZSA6IE9TX0RBVEFfU0laRTsKKwkJCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzID0gU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciA9IDA7CisJCQl9CisJCQlTVHAtPmJ1ZmZlci0+YnVmZmVyX2Jsb2NrcyA9IE9TX0RBVEFfU0laRSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJCVNUcC0+ZmFzdF9vcGVuID0gMTsKKwkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJCXJldHVybiAwOworCQl9CisjaWYgREVCVUcKKwkJaWYgKGkgIT0gU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbikKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFRhcGUgcG9zaXRpb24gY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCQkJbmFtZSwgaSwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbik7CisjZW5kaWYKKwkJU1RwLT5oZWFkZXJfb2sgPSAwOworCX0KKwlTVHAtPmZhc3Rfb3BlbiA9IDA7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCAmJiAgIC8qIGluIGFsbCBlcnJvciBjb25kaXRpb25zIGV4Y2VwdCBubyBtZWRpdW0gKi8gCisJICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICE9IDIgfHwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gIT0gMHgzQSkgKSB7CisKKwkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IE1PREVfU0VMRUNUOworCQljbWRbMV0gPSAweDEwOworCQljbWRbNF0gPSA0ICsgTU9ERV9IRUFERVJfTEVOR1RIOworCisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVswXSA9IGNtZFs0XSAtIDE7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVsxXSA9IDA7CQkJLyogTWVkaXVtIFR5cGUgLSBpZ25vcmluZyAqLworCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0gPSAwOwkJCS8qIFJlc2VydmVkICovCisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVszXSA9IDA7CQkJLyogQmxvY2sgRGVzY3JpcHRvciBMZW5ndGggKi8KKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDBdID0gMHgzZjsKKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDFdID0gMTsKKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDJdID0gMjsKKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01PREVfSEVBREVSX0xFTkdUSCArIDNdID0gMzsKKworI2lmIERFQlVHCisJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IEFwcGx5aW5nIHNvZnQgcmVzZXRcbiIsIG5hbWUpOworI2VuZGlmCisJCVNScG50ID0gb3NzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgY21kWzRdLCBETUFfVE9fREVWSUNFLCBTVHAtPnRpbWVvdXQsIDAsIDEpOworCisJCVNUcC0+aGVhZGVyX29rID0gMDsKKworCQlmb3IgKGk9MDsgaSA8IDEwOyBpKyspIHsKKworCQkJbWVtc2V0IChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJCQlTUnBudCA9IG9zc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJCQkJICAgIFNUcC0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCQkJaWYgKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdICYgMHg3MCkgIT0gMHg3MCB8fAorCQkJICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gTk9UX1JFQURZKQorCQkJYnJlYWs7CisKKwkJCWlmICgoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSAmIDB4MGYpID09IFVOSVRfQVRURU5USU9OKSB7CisJCQkJU1RwLT5wb3NfdW5rbm93biA9IDA7CisJCQkJU1RwLT5wYXJ0aXRpb24gPSBTVHAtPm5ld19wYXJ0aXRpb24gPSAwOworCQkJCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zKQorCQkJCQlTVHAtPm5icl9wYXJ0aXRpb25zID0gMTsgIC8qIFRoaXMgZ3Vlc3Mgd2lsbCBiZSB1cGRhdGVkIGxhdGVyIGlmIG5lY2Vzc2FyeSAqLworCQkJCWZvciAoaT0wOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQkJCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJCQkJU1Rwcy0+cncgPSBTVF9JRExFOworCQkJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCQkJU1Rwcy0+YXRfc20gPSAwOworCQkJCQlTVHBzLT5sYXN0X2Jsb2NrX3ZhbGlkID0gMDsKKwkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSAwIDsKKwkJCQl9CisJCQkJbmV3X3Nlc3Npb24gPSAxOworCQkJfQorCQl9CisJfQorCisJaWYgKG9zc3Rfd2FpdF9yZWFkeShTVHAsICZTUnBudCwgMTUgKiA2MCwgMCkpCQkvKiBGSVhNRSAtIG5vdCBhbGxvd2VkIHdpdGggTk9CTE9DSyAqLworCQkgcHJpbnRrKEtFUk5fSU5GTyAiJXM6STogRGV2aWNlIGRpZCBub3QgYmVjb21lIFJlYWR5IGluIG9wZW5cbiIsIG5hbWUpOworCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKwkJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCisJCSAgICAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSAmIDB4NzApID09IDB4NzAgJiYKKwkJICAgIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHgwZikgPT0gTk9UX1JFQURZICYmCisJCSAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gPT0gMHgzYSkgeyAvKiBDaGVjayBBU0MgKi8KKwkJCVNUcC0+cmVhZHkgPSBTVF9OT19UQVBFOworCQl9IGVsc2UKKwkJCVNUcC0+cmVhZHkgPSBTVF9OT1RfUkVBRFk7CisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBOVUxMOworCQlTVHAtPmRlbnNpdHkgPSAwOyAgIAkvKiBDbGVhciB0aGUgZXJyb25lb3VzICJyZXNpZHVlIiAqLworCQlTVHAtPndyaXRlX3Byb3QgPSAwOworCQlTVHAtPmJsb2NrX3NpemUgPSAwOworCQlTVHAtPnBzWzBdLmRydl9maWxlID0gU1RwLT5wc1swXS5kcnZfYmxvY2sgPSAoLTEpOworCQlTVHAtPnBhcnRpdGlvbiA9IFNUcC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9VTkxPQ0tFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJb3NzdF9jb25maWd1cmVfb25zdHJlYW0oU1RwLCAmU1JwbnQpOworCisJU1RwLT5ibG9ja19zaXplID0gU1RwLT5yYXcgPyBPU19GUkFNRV9TSVpFIDogKAorCQkJICAgICAoU1RtLT5kZWZhdWx0X2Jsa3NpemUgPiAwKSA/IFNUbS0+ZGVmYXVsdF9ibGtzaXplIDogT1NfREFUQV9TSVpFKTsKKwlTVHAtPmJ1ZmZlci0+YnVmZmVyX2Jsb2NrcyA9IFNUcC0+cmF3ID8gMSA6IE9TX0RBVEFfU0laRSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwlTVHAtPmJ1ZmZlci0+YnVmZmVyX2J5dGVzICA9CisJU1RwLT5idWZmZXItPnJlYWRfcG9pbnRlciAgPQorCVNUcC0+ZnJhbWVfaW5fYnVmZmVyICAgICAgID0gMDsKKworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogQmxvY2sgc2l6ZTogJWQsIGZyYW1lIHNpemU6ICVkLCBidWZmZXIgc2l6ZTogJWQgKCVkIGJsb2NrcykuXG4iLAorCQkgICAgIG5hbWUsIFNUcC0+YmxvY2tfc2l6ZSwgT1NfRlJBTUVfU0laRSwgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX3NpemUsCisJCSAgICAgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2Jsb2Nrcyk7CisjZW5kaWYKKworCWlmIChTVHAtPmRydl93cml0ZV9wcm90KSB7CisJCVNUcC0+d3JpdGVfcHJvdCA9IDE7CisjaWYgREVCVUcKKwkJaWYgKGRlYnVnZ2luZykKKwkJCXByaW50ayhPU1NUX0RFQl9NU0cgIiVzOkQ6IFdyaXRlIHByb3RlY3RlZFxuIiwgbmFtZSk7CisjZW5kaWYKKwkJaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkgfHwgKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JEV1IpIHsKKwkJCXJldHZhbCA9ICgtRVJPRlMpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKG5ld19zZXNzaW9uKSB7ICAvKiBDaGFuZ2UgdGhlIGRyaXZlIHBhcmFtZXRlcnMgZm9yIHRoZSBuZXcgbW9kZSAqLworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogTmV3IFNlc3Npb25cbiIsIG5hbWUpOworI2VuZGlmCisJCVNUcC0+ZGVuc2l0eV9jaGFuZ2VkID0gU1RwLT5ibGtzaXplX2NoYW5nZWQgPSAwOworCQlTVHAtPmNvbXByZXNzaW9uX2NoYW5nZWQgPSAwOworCX0KKworCS8qCisJICogcHJvcGVybHkgcG9zaXRpb24gdGhlIHRhcGUgYW5kIGNoZWNrIHRoZSBBRFIgaGVhZGVycworCSAqLworCWlmIChTVHAtPmRvb3JfbG9ja2VkID09IFNUX1VOTE9DS0VEKSB7CisJCSBpZiAoZG9fZG9vcl9sb2NrKFNUcCwgMSkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiBDYW4ndCBsb2NrIGRyaXZlIGRvb3JcbiIsIG5hbWUpOworCQkgZWxzZQorCQkJU1RwLT5kb29yX2xvY2tlZCA9IFNUX0xPQ0tFRF9BVVRPOworCX0KKworCW9zc3RfYW5hbHl6ZV9oZWFkZXJzKFNUcCwgJlNScG50KTsKKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlpZiAoU1JwbnQgIT0gTlVMTCkKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOworCVNUcC0+aGVhZGVyX29rID0gMDsKKwlTVHAtPmluX3VzZSA9IDA7CisJc2NzaV9kZXZpY2VfcHV0KFNUcC0+ZGV2aWNlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworLyogRmx1c2ggdGhlIHRhcGUgYnVmZmVyIGJlZm9yZSBjbG9zZSAqLworc3RhdGljIGludCBvc19zY3NpX3RhcGVfZmx1c2goc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWludAkJICAgICAgcmVzdWx0ID0gMCwgcmVzdWx0MjsKKwlzdHJ1Y3Qgb3NzdF90YXBlICAgICogU1RwICAgID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdF9tb2RlZGVmICAgKiBTVG0gICAgPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgICogU1RwcyAgID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqIFNScG50ICA9IE5VTEw7CisJY2hhcgkJICAgICogbmFtZSAgID0gdGFwZV9uYW1lKFNUcCk7CisKKwlpZiAoZmlsZV9jb3VudChmaWxwKSA+IDEpCisJCXJldHVybiAwOworCisJaWYgKChTVHBzLT5ydyA9PSBTVF9XUklUSU5HIHx8IFNUcC0+ZGlydHkpICYmICFTVHAtPnBvc191bmtub3duKSB7CisJCVNUcC0+d3JpdGVfdHlwZSA9IE9TX1dSSVRFX0RBVEE7CisJCXJlc3VsdCA9IG9zc3RfZmx1c2hfd3JpdGVfYnVmZmVyKFNUcCwgJlNScG50KTsKKwkJaWYgKHJlc3VsdCAhPSAwICYmIHJlc3VsdCAhPSAoLUVOT1NQQykpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKCBTVHBzLT5ydyA+PSBTVF9XUklUSU5HICYmICFTVHAtPnBvc191bmtub3duKSB7CisKKyNpZiBERUJVRworCQlpZiAoZGVidWdnaW5nKSB7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBGaWxlIGxlbmd0aCAlbGQgYnl0ZXMuXG4iLAorCQkJCQkgICAgICAgbmFtZSwgKGxvbmcpKGZpbHAtPmZfcG9zKSk7CisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBBc3luYyB3cml0ZSB3YWl0cyAlZCwgZmluaXNoZWQgJWQuXG4iLAorCQkJCQkgICAgICAgbmFtZSwgU1RwLT5uYnJfd2FpdHMsIFNUcC0+bmJyX2ZpbmlzaGVkKTsKKwkJfQorI2VuZGlmCisJCXJlc3VsdCA9IG9zc3Rfd3JpdGVfdHJhaWxlcihTVHAsICZTUnBudCwgIShTVHAtPnJld19hdF9jbG9zZSkpOworI2lmIERFQlVHCisJCWlmIChkZWJ1Z2dpbmcpCisJCQlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBCdWZmZXIgZmx1c2hlZCwgJWQgRU9GKHMpIHdyaXR0ZW5cbiIsCisJCQkJCSAgICAgICBuYW1lLCAxK1NUcC0+dHdvX2ZtKTsKKyNlbmRpZgorCX0KKwllbHNlIGlmICghU1RwLT5yZXdfYXRfY2xvc2UpIHsKKwkJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCQlpZiAoIVNUbS0+c3lzdiB8fCBTVHBzLT5ydyAhPSBTVF9SRUFESU5HKSB7CisJCQlpZiAoU1RwLT5jYW5fYnNyKQorCQkJCXJlc3VsdCA9IG9zc3RfZmx1c2hfYnVmZmVyKFNUcCwgJlNScG50LCAwKTsgLyogdGhpcyBpcyB0aGUgZGVmYXVsdCBwYXRoICovCisJCQllbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQkJcmVzdWx0ID0gY3Jvc3NfZW9mKFNUcCwgJlNScG50LCAwKTsKKwkJCQkJaWYgKHJlc3VsdCkgeworCQkJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJCQkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQkJCQlTVHBzLT5lb2YgPSBTVF9GTTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgoU1Rwcy0+ZW9mID09IFNUX05PRU9GICYmCisJCQkgICEocmVzdWx0ID0gY3Jvc3NfZW9mKFNUcCwgJlNScG50LCAxKSkpIHx8CisJCQkgU1Rwcy0+ZW9mID09IFNUX0ZNX0hJVCkgeworCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQlTVHBzLT5lb2YgPSBTVF9GTTsKKwkJfQorCX0KKworb3V0OgorCWlmIChTVHAtPnJld19hdF9jbG9zZSkgeworCQlyZXN1bHQyID0gb3NzdF9wb3NpdGlvbl90YXBlX2FuZF9jb25maXJtKFNUcCwgJlNScG50LCBTVHAtPmZpcnN0X2RhdGFfcHBvcyk7CisJCVNUcHMtPmRydl9maWxlID0gU1Rwcy0+ZHJ2X2Jsb2NrID0gU1RwLT5mcmFtZV9zZXFfbnVtYmVyID0gU1RwLT5sb2dpY2FsX2Jsa19udW0gPSAwOworCQlpZiAocmVzdWx0ID09IDAgJiYgcmVzdWx0MiA8IDApCisJCQlyZXN1bHQgPSByZXN1bHQyOworCX0KKwlpZiAoU1JwbnQpIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCWlmIChTVHAtPmFib3J0X2NvdW50IHx8IFNUcC0+cmVjb3Zlcl9jb3VudCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczpJOiIsIG5hbWUpOworCQlpZiAoU1RwLT5hYm9ydF9jb3VudCkKKwkJCXByaW50aygiICVkIHVucmVjb3ZlcmVkIGVycm9ycyIsIFNUcC0+YWJvcnRfY291bnQpOworCQlpZiAoU1RwLT5yZWNvdmVyX2NvdW50KQorCQkJcHJpbnRrKCIgJWQgcmVjb3ZlcmVkIGVycm9ycyIsIFNUcC0+cmVjb3Zlcl9jb3VudCk7CisJCWlmIChTVHAtPndyaXRlX2NvdW50KQorCQkJcHJpbnRrKCIgaW4gJWQgZnJhbWVzIHdyaXR0ZW4iLCBTVHAtPndyaXRlX2NvdW50KTsKKwkJaWYgKFNUcC0+cmVhZF9jb3VudCkKKwkJCXByaW50aygiIGluICVkIGZyYW1lcyByZWFkIiwgU1RwLT5yZWFkX2NvdW50KTsKKwkJcHJpbnRrKCJcbiIpOworCQlTVHAtPnJlY292ZXJfY291bnQgPSAwOworCQlTVHAtPmFib3J0X2NvdW50ICAgPSAwOworCX0KKwlTVHAtPndyaXRlX2NvdW50ID0gMDsKKwlTVHAtPnJlYWRfY291bnQgID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogQ2xvc2UgdGhlIGRldmljZSBhbmQgcmVsZWFzZSBpdCAqLworc3RhdGljIGludCBvc19zY3NpX3RhcGVfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpbnQJCSAgICAgIHJlc3VsdCA9IDA7CisJc3RydWN0IG9zc3RfdGFwZSAgICAqIFNUcCAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChTVHAtPmRvb3JfbG9ja2VkID09IFNUX0xPQ0tFRF9BVVRPKQorCQlkb19kb29yX2xvY2soU1RwLCAwKTsKKworCWlmIChTVHAtPnJhdykKKwkJU1RwLT5oZWFkZXJfb2sgPSAwOworCQorCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOworCXdyaXRlX2xvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJU1RwLT5pbl91c2UgPSAwOworCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKworCXNjc2lfZGV2aWNlX3B1dChTVHAtPmRldmljZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFRoZSBpb2N0bCBjb21tYW5kICovCitzdGF0aWMgaW50IG9zc3RfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsc3RydWN0IGZpbGUgKiBmaWxlLAorCSB1bnNpZ25lZCBpbnQgY21kX2luLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQJCSAgICAgIGksIGNtZF9uciwgY21kX3R5cGUsIHJldHZhbCA9IDA7CisJdW5zaWduZWQgaW50CSAgICAgIGJsazsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAgICogU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAgKiBTVHBzOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCA9IE5VTEw7CisJc3RydWN0IG9zc3RfdGFwZSAgICAqIFNUcCAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIJCSAgICAqIG5hbWUgID0gdGFwZV9uYW1lKFNUcCk7CisJdm9pZAkgICAgX191c2VyICAqIHAgICAgID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmU1RwLT5sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworI2lmIERFQlVHCisJaWYgKGRlYnVnZ2luZyAmJiAhU1RwLT5pbl91c2UpIHsKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAiJXM6RDogSW5jb3JyZWN0IGRldmljZS5cbiIsIG5hbWUpOworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKworCS8qCisJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKKwkgKiBlbHNlIHRyeSBhbmQgdXNlIHRoaXMgZGV2aWNlLiAgQWxzbywgaWYgZXJyb3IgcmVjb3ZlcnkgZmFpbHMsIGl0CisJICogbWF5IHRyeSBhbmQgdGFrZSB0aGUgZGV2aWNlIG9mZmxpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIKKwkgKiBhY2Nlc3MgdG8gdGhlIGRldmljZSBpcyBwcm9oaWJpdGVkLgorCSAqLworCWlmKCAhc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKFNUcC0+ZGV2aWNlKSApIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKworCWNtZF90eXBlID0gX0lPQ19UWVBFKGNtZF9pbik7CisJY21kX25yICAgPSBfSU9DX05SKGNtZF9pbik7CisjaWYgREVCVUcKKwlwcmludGsoT1NTVF9ERUJfTVNHICIlczpEOiBJb2N0bCAlZCwlZCBpbiAlcyBtb2RlXG4iLCBuYW1lLAorCQkJICAgIGNtZF90eXBlLCBjbWRfbnIsIFNUcC0+cmF3PyJyYXciOiJub3JtYWwiKTsKKyNlbmRpZgorCWlmIChjbWRfdHlwZSA9PSBfSU9DX1RZUEUoTVRJT0NUT1ApICYmIGNtZF9uciA9PSBfSU9DX05SKE1USU9DVE9QKSkgeworCQlzdHJ1Y3QgbXRvcCBtdGM7CisJCWludCAgICBhdXRvX3dlb2YgPSAwOworCisJCWlmIChfSU9DX1NJWkUoY21kX2luKSAhPSBzaXplb2YobXRjKSkgeworCQkJcmV0dmFsID0gKC1FSU5WQUwpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikgJm10YywgcCwgc2l6ZW9mKHN0cnVjdCBtdG9wKSk7CisJCWlmIChpKSB7CisJCQlyZXR2YWwgPSAoLUVGQVVMVCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRTRVREUlZCVUZGRVIgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOlc6IE1UU0VURFJWQlVGRkVSIG9ubHkgYWxsb3dlZCBmb3Igcm9vdC5cbiIsIG5hbWUpOworCQkJcmV0dmFsID0gKC1FUEVSTSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghU1RtLT5kZWZpbmVkICYmIChtdGMubXRfb3AgIT0gTVRTRVREUlZCVUZGRVIgJiYgKG10Yy5tdF9jb3VudCAmIE1UX1NUX09QVElPTlMpID09IDApKSB7CisJCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFTVHAtPnBvc191bmtub3duKSB7CisKKwkJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQkJaWYgKG10Yy5tdF9vcCA9PSBNVEZTRiB8fCBtdGMubXRfb3AgPT0gTVRGU0ZNfHwgbXRjLm10X29wID09IE1URU9NKSB7CisJCQkJCW10Yy5tdF9jb3VudCAtPSAxOworCQkJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQkJCVNUcHMtPmRydl9maWxlICs9IDE7CisJCQkJfQorCQkJCWVsc2UgaWYgKG10Yy5tdF9vcCA9PSBNVEJTRiB8fCBtdGMubXRfb3AgPT0gTVRCU0ZNKSB7CisJCQkJCW10Yy5tdF9jb3VudCArPSAxOworCQkJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQkJCVNUcHMtPmRydl9maWxlICs9IDE7CisJCQkJfQorCQkJfQorCisJCQlpZiAobXRjLm10X29wID09IE1UU0VFSykgeworCQkJCS8qIE9sZCBwb3NpdGlvbiBtdXN0IGJlIHJlc3RvcmVkIGlmIHBhcnRpdGlvbiB3aWxsIGJlIGNoYW5nZWQgKi8KKwkJCQlpID0gIVNUcC0+Y2FuX3BhcnRpdGlvbnMgfHwgKFNUcC0+bmV3X3BhcnRpdGlvbiAhPSBTVHAtPnBhcnRpdGlvbik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpID0gbXRjLm10X29wID09IE1UUkVXICAgfHwgbXRjLm10X29wID09IE1UT0ZGTCB8fAorCQkJCSAgICBtdGMubXRfb3AgPT0gTVRSRVRFTiB8fCBtdGMubXRfb3AgPT0gTVRFT00gIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVExPQ0sgIHx8IG10Yy5tdF9vcCA9PSBNVExPQUQgfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1URlNGICAgfHwgbXRjLm10X29wID09IE1URlNGTSB8fAorCQkJCSAgICBtdGMubXRfb3AgPT0gTVRCU0YgICB8fCBtdGMubXRfb3AgPT0gTVRCU0ZNIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVENPTVBSRVNTSU9OOworCQkJfQorCQkJaSA9IG9zc3RfZmx1c2hfYnVmZmVyKFNUcCwgJlNScG50LCBpKTsKKwkJCWlmIChpIDwgMCkgeworCQkJCXJldHZhbCA9IGk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgd2FzIGEgYnVzIHJlc2V0LCBibG9jayBmdXJ0aGVyIGFjY2VzcworCQkJICogdG8gdGhpcyBkZXZpY2UuICBJZiB0aGUgdXNlciB3YW50cyB0byByZXdpbmQgdGhlIHRhcGUsCisJCQkgKiB0aGVuIHJlc2V0IHRoZSBmbGFnIGFuZCBhbGxvdyBhY2Nlc3MgYWdhaW4uCisJCQkgKi8KKwkJCWlmKG10Yy5tdF9vcCAhPSBNVFJFVyAgICYmCisJCQkgICBtdGMubXRfb3AgIT0gTVRPRkZMICAmJgorCQkJICAgbXRjLm10X29wICE9IE1UUkVURU4gJiYKKwkJCSAgIG10Yy5tdF9vcCAhPSBNVEVSQVNFICYmCisJCQkgICBtdGMubXRfb3AgIT0gTVRTRUVLICAmJgorCQkJICAgbXRjLm10X29wICE9IE1URU9NKSAgIHsKKwkJCQlyZXR2YWwgPSAoLUVJTyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZXNldF9zdGF0ZShTVHApOworCQkJLyogcmVtb3ZlIHRoaXMgd2hlbiB0aGUgbWlkbGV2ZWwgcHJvcGVybHkgY2xlYXJzIHdhc19yZXNldCAqLworCQkJU1RwLT5kZXZpY2UtPndhc19yZXNldCA9IDA7CisJCX0KKworCQlpZiAobXRjLm10X29wICE9IE1UQ09NUFJFU1NJT04gICYmIG10Yy5tdF9vcCAhPSBNVExPQ0sgICAgICAgICAmJgorCQkgICAgbXRjLm10X29wICE9IE1UTk9QICAgICAgICAgICYmIG10Yy5tdF9vcCAhPSBNVFNFVEJMSyAgICAgICAmJgorCQkgICAgbXRjLm10X29wICE9IE1UU0VUREVOU0lUWSAgICYmIG10Yy5tdF9vcCAhPSBNVFNFVERSVkJVRkZFUiAmJiAKKwkJICAgIG10Yy5tdF9vcCAhPSBNVE1LUEFSVCAgICAgICAmJiBtdGMubXRfb3AgIT0gTVRTRVRQQVJUICAgICAgJiYKKwkJICAgIG10Yy5tdF9vcCAhPSBNVFdFT0YgICAgICAgICAmJiBtdGMubXRfb3AgIT0gTVRXU00gICAgICAgICAgICkgeworCisJCQkvKgorCQkJICogVGhlIHVzZXIgdGVsbHMgdXMgdG8gbW92ZSB0byBhbm90aGVyIHBvc2l0aW9uIG9uIHRoZSB0YXBlLgorCQkJICogSWYgd2Ugd2VyZSBhcHBlbmRpbmcgdG8gdGhlIHRhcGUgY29udGVudCwgdGhhdCB3b3VsZCBsZWF2ZQorCQkJICogdGhlIHRhcGUgd2l0aG91dCBwcm9wZXIgZW5kLCBpbiB0aGF0IGNhc2Ugd3JpdGUgRU9EIGFuZAorCQkJICogdXBkYXRlIHRoZSBoZWFkZXIgdG8gcmVmbGVjdCBpdHMgcG9zaXRpb24uCisJCQkgKi8KKyNpZiBERUJVRworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6RDogYXV0b193ZW9kICVzIGF0IGZmcD0lZCxlZnA9JWQsZnNuPSVkLGxibj0lZCxmbj0lZCxibj0lZFxuIiwgbmFtZSwKKwkJCQkJU1Rwcy0+cncgPj0gU1RfV1JJVElORyA/ICJ3cml0ZSIgOiBTVHBzLT5ydyA9PSBTVF9SRUFESU5HID8gInJlYWQiIDogImlkbGUiLAorCQkJCQlTVHAtPmZpcnN0X2ZyYW1lX3Bvc2l0aW9uLCBTVHAtPmVvZF9mcmFtZV9wcG9zLCBTVHAtPmZyYW1lX3NlcV9udW1iZXIsCisJCQkJCVNUcC0+bG9naWNhbF9ibGtfbnVtLCBTVHBzLT5kcnZfZmlsZSwgU1Rwcy0+ZHJ2X2Jsb2NrICk7CisjZW5kaWYKKwkJCWlmIChTVHBzLT5ydyA+PSBTVF9XUklUSU5HICYmIFNUcC0+Zmlyc3RfZnJhbWVfcG9zaXRpb24gPj0gU1RwLT5lb2RfZnJhbWVfcHBvcykgeworCQkJCWF1dG9fd2VvZiA9ICgoU1RwLT53cml0ZV90eXBlICE9IE9TX1dSSVRFX05FV19NQVJLKSAmJgorCQkJCQkJCSEobXRjLm10X29wID09IE1UUkVXIHx8IG10Yy5tdF9vcCA9PSBNVE9GRkwpKTsKKwkJCQlpID0gb3NzdF93cml0ZV90cmFpbGVyKFNUcCwgJlNScG50LAorCQkJCQkJCSEobXRjLm10X29wID09IE1UUkVXIHx8IG10Yy5tdF9vcCA9PSBNVE9GRkwpKTsKKyNpZiBERUJVRworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOkQ6IHBvc3QgdHJhaWxlciB4ZW9mPSVkLGZmcD0lZCxlZnA9JWQsZnNuPSVkLGxibj0lZCxmbj0lZCxibj0lZFxuIiwKKwkJCQkJCW5hbWUsIGF1dG9fd2VvZiwgU1RwLT5maXJzdF9mcmFtZV9wb3NpdGlvbiwgU1RwLT5lb2RfZnJhbWVfcHBvcywKKwkJCQkJCVNUcC0+ZnJhbWVfc2VxX251bWJlciwgU1RwLT5sb2dpY2FsX2Jsa19udW0sIFNUcHMtPmRydl9maWxlLCBTVHBzLT5kcnZfYmxvY2sgKTsKKyNlbmRpZgorCQkJCWlmIChpIDwgMCkgeworCQkJCQlyZXR2YWwgPSBpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UT0ZGTCAmJiBTVHAtPmRvb3JfbG9ja2VkICE9IFNUX1VOTE9DS0VEKQorCQkJZG9fZG9vcl9sb2NrKFNUcCwgMCk7ICAvKiBJZ25vcmUgcmVzdWx0ISAqLworCisJCWlmIChtdGMubXRfb3AgPT0gTVRTRVREUlZCVUZGRVIgJiYKKwkJICAgKG10Yy5tdF9jb3VudCAmIE1UX1NUX09QVElPTlMpICE9IDApIHsKKwkJCXJldHZhbCA9IG9zc3Rfc2V0X29wdGlvbnMoU1RwLCBtdGMubXRfY291bnQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UU0VUUEFSVCkgeworCQkJaWYgKG10Yy5tdF9jb3VudCA+PSBTVHAtPm5icl9wYXJ0aXRpb25zKQorCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQllbHNlIHsKKwkJCQlTVHAtPm5ld19wYXJ0aXRpb24gPSBtdGMubXRfY291bnQ7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVE1LUEFSVCkgeworCQkJaWYgKCFTVHAtPmNhbl9wYXJ0aXRpb25zKSB7CisJCQkJcmV0dmFsID0gKC1FSU5WQUwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKChpID0gb3NzdF9pbnRfaW9jdGwoU1RwLCAmU1JwbnQsIE1UUkVXLCAwKSkgPCAwIC8qfHwKKwkJCSAgICAoaSA9IHBhcnRpdGlvbl90YXBlKGlub2RlLCBtdGMubXRfY291bnQpKSA8IDAqLykgeworCQkJCXJldHZhbCA9IGk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmb3IgKGk9MDsgaSA8IFNUX05CUl9QQVJUSVRJT05TOyBpKyspIHsKKwkJCQlTVHAtPnBzW2ldLnJ3ID0gU1RfSURMRTsKKwkJCQlTVHAtPnBzW2ldLmF0X3NtID0gMDsKKwkJCQlTVHAtPnBzW2ldLmxhc3RfYmxvY2tfdmFsaWQgPSAwOworCQkJfQorCQkJU1RwLT5wYXJ0aXRpb24gPSBTVHAtPm5ld19wYXJ0aXRpb24gPSAwOworCQkJU1RwLT5uYnJfcGFydGl0aW9ucyA9IDE7ICAvKiBCYWQgZ3Vlc3MgPy0pICovCisJCQlTVHBzLT5kcnZfYmxvY2sgPSBTVHBzLT5kcnZfZmlsZSA9IDA7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBvdXQ7CisJIAl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFRUspIHsKKwkJCWlmIChTVHAtPnJhdykKKwkJCQlpID0gb3NzdF9zZXRfZnJhbWVfcG9zaXRpb24oU1RwLCAmU1JwbnQsIG10Yy5tdF9jb3VudCwgMCk7CisJCQllbHNlCisJCQkJaSA9IG9zc3Rfc2Vla19zZWN0b3IoU1RwLCAmU1JwbnQsIG10Yy5tdF9jb3VudCk7CisJCQlpZiAoIVNUcC0+Y2FuX3BhcnRpdGlvbnMpCisJCQkJU1RwLT5wc1swXS5ydyA9IFNUX0lETEU7CisJCQlyZXR2YWwgPSBpOworCQkJZ290byBvdXQ7CisJCX0KKyAKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVExPQ0sgfHwgbXRjLm10X29wID09IE1UVU5MT0NLKSB7CisJCQlyZXR2YWwgPSBkb19kb29yX2xvY2soU1RwLCAobXRjLm10X29wID09IE1UTE9DSykpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoYXV0b193ZW9mKQorCQkJY3Jvc3NfZW9mKFNUcCwgJlNScG50LCAwKTsKKworCQlpZiAobXRjLm10X29wID09IE1UQ09NUFJFU1NJT04pCisJCQlyZXR2YWwgPSAtRUlOVkFMOyAgICAgICAvKiBPblN0cmVhbSBkcml2ZXMgZG9uJ3QgaGF2ZSBjb21wcmVzc2lvbiBoYXJkd2FyZSAqLworCQllbHNlCisJCQkvKiBNVEJTRiBNVEJTRk0gTVRCU1IgTVRCU1MgTVRFT00gTVRFUkFTRSBNVEZTRiBNVEZTRkIgTVRGU1IgTVRGU1MKKwkJCSAqIE1UTE9BRCBNVE9GRkwgTVRSRVNFVCBNVFJFVEVOIE1UUkVXIE1UVU5MT0FEIE1UV0VPRiBNVFdTTSAqLworCQkJcmV0dmFsID0gb3NzdF9pbnRfaW9jdGwoU1RwLCAmU1JwbnQsIG10Yy5tdF9vcCwgbXRjLm10X2NvdW50KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFTVG0tPmRlZmluZWQpIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoaSA9IG9zc3RfZmx1c2hfYnVmZmVyKFNUcCwgJlNScG50LCAwKSkgPCAwKSB7CisJCXJldHZhbCA9IGk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjbWRfdHlwZSA9PSBfSU9DX1RZUEUoTVRJT0NHRVQpICYmIGNtZF9uciA9PSBfSU9DX05SKE1USU9DR0VUKSkgeworCQlzdHJ1Y3QgbXRnZXQgbXRfc3RhdHVzOworCisJCWlmIChfSU9DX1NJWkUoY21kX2luKSAhPSBzaXplb2Yoc3RydWN0IG10Z2V0KSkgeworCQkJIHJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCSBnb3RvIG91dDsKKwkJfQorCisJCW10X3N0YXR1cy5tdF90eXBlID0gTVRfSVNPTlNUUkVBTV9TQzsKKwkJbXRfc3RhdHVzLm10X2VycmVnID0gU1RwLT5yZWNvdmVyX2VycmVnIDw8IE1UX1NUX1NPRlRFUlJfU0hJRlQ7CisJCW10X3N0YXR1cy5tdF9kc3JlZyA9CisJCQkoKFNUcC0+YmxvY2tfc2l6ZSA8PCBNVF9TVF9CTEtTSVpFX1NISUZUKSAmIE1UX1NUX0JMS1NJWkVfTUFTSykgfAorCQkJKChTVHAtPmRlbnNpdHkgICAgPDwgTVRfU1RfREVOU0lUWV9TSElGVCkgJiBNVF9TVF9ERU5TSVRZX01BU0spOworCQltdF9zdGF0dXMubXRfYmxrbm8gPSBTVHBzLT5kcnZfYmxvY2s7CisJCW10X3N0YXR1cy5tdF9maWxlbm8gPSBTVHBzLT5kcnZfZmlsZTsKKwkJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwKSB7CisJCQlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORykKKwkJCQltdF9zdGF0dXMubXRfYmxrbm8gKz0gKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzIC8gU1RwLT5ibG9ja19zaXplOworCQkJZWxzZSBpZiAoU1Rwcy0+cncgPT0gU1RfUkVBRElORykKKwkJCQltdF9zdGF0dXMubXRfYmxrbm8gLT0gKChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyArCisJCQkJCQkJU1RwLT5ibG9ja19zaXplIC0gMSkgLyBTVHAtPmJsb2NrX3NpemU7CisJCX0KKworCQltdF9zdGF0dXMubXRfZ3N0YXQgPSAwOworCQlpZiAoU1RwLT5kcnZfd3JpdGVfcHJvdCkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfV1JfUFJPVCgweGZmZmZmZmZmKTsKKwkJaWYgKG10X3N0YXR1cy5tdF9ibGtubyA9PSAwKSB7CisJCQlpZiAobXRfc3RhdHVzLm10X2ZpbGVubyA9PSAwKQorCQkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfQk9UKDB4ZmZmZmZmZmYpOworCQkJZWxzZQorCQkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRU9GKDB4ZmZmZmZmZmYpOworCQl9CisJCW10X3N0YXR1cy5tdF9yZXNpZCA9IFNUcC0+cGFydGl0aW9uOworCQlpZiAoU1Rwcy0+ZW9mID09IFNUX0VPTV9PSyB8fCBTVHBzLT5lb2YgPT0gU1RfRU9NX0VSUk9SKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9FT1QoMHhmZmZmZmZmZik7CisJCWVsc2UgaWYgKFNUcHMtPmVvZiA+PSBTVF9FT01fT0spCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0VPRCgweGZmZmZmZmZmKTsKKwkJaWYgKFNUcC0+ZGVuc2l0eSA9PSAxKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9EXzgwMCgweGZmZmZmZmZmKTsKKwkJZWxzZSBpZiAoU1RwLT5kZW5zaXR5ID09IDIpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0RfMTYwMCgweGZmZmZmZmZmKTsKKwkJZWxzZSBpZiAoU1RwLT5kZW5zaXR5ID09IDMpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0RfNjI1MCgweGZmZmZmZmZmKTsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfUkVBRFkpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX09OTElORSgweGZmZmZmZmZmKTsKKwkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfTk9fVEFQRSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRFJfT1BFTigweGZmZmZmZmZmKTsKKwkJaWYgKFNUcHMtPmF0X3NtKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9TTSgweGZmZmZmZmZmKTsKKwkJaWYgKFNUbS0+ZG9fYXN5bmNfd3JpdGVzIHx8IChTVG0tPmRvX2J1ZmZlcl93cml0ZXMgJiYgU1RwLT5ibG9ja19zaXplICE9IDApIHx8CisJCSAgICBTVHAtPmRydl9idWZmZXIgIT0gMCkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfSU1fUkVQX0VOKDB4ZmZmZmZmZmYpOworCisJCWkgPSBjb3B5X3RvX3VzZXIocCwgJm10X3N0YXR1cywgc2l6ZW9mKHN0cnVjdCBtdGdldCkpOworCQlpZiAoaSkgeworCQkJcmV0dmFsID0gKC1FRkFVTFQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlTVHAtPnJlY292ZXJfZXJyZWcgPSAwOyAgLyogQ2xlYXIgYWZ0ZXIgcmVhZCAqLworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9IC8qIEVuZCBvZiBNVElPQ0dFVCAqLworCisJaWYgKGNtZF90eXBlID09IF9JT0NfVFlQRShNVElPQ1BPUykgJiYgY21kX25yID09IF9JT0NfTlIoTVRJT0NQT1MpKSB7CisJCXN0cnVjdCBtdHBvcyBtdF9wb3M7CisKKwkJaWYgKF9JT0NfU0laRShjbWRfaW4pICE9IHNpemVvZihzdHJ1Y3QgbXRwb3MpKSB7CisJCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoU1RwLT5yYXcpCisJCQlibGsgPSBvc3N0X2dldF9mcmFtZV9wb3NpdGlvbihTVHAsICZTUnBudCk7CisJCWVsc2UKKwkJCWJsayA9IG9zc3RfZ2V0X3NlY3RvcihTVHAsICZTUnBudCk7CisJCWlmIChibGsgPCAwKSB7CisJCQlyZXR2YWwgPSBibGs7CisJCQlnb3RvIG91dDsKKwkJfQorCQltdF9wb3MubXRfYmxrbm8gPSBibGs7CisJCWkgPSBjb3B5X3RvX3VzZXIocCwgJm10X3Bvcywgc2l6ZW9mKHN0cnVjdCBtdHBvcykpOworCQlpZiAoaSkKKwkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoU1JwbnQpIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCXVwKCZTVHAtPmxvY2spOworCisJcmV0dXJuIHNjc2lfaW9jdGwoU1RwLT5kZXZpY2UsIGNtZF9pbiwgcCk7CisKK291dDoKKwlpZiAoU1JwbnQpIHNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCXVwKCZTVHAtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIG9zc3RfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqU1RwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IFNUcC0+ZGV2aWNlOworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jb21wYXRfaW9jdGwpIHsKKworCQlyZXQgPSBzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKHNkZXYsIGNtZF9pbiwgKHZvaWQgX191c2VyICopYXJnKTsKKworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworDAorLyogTWVtb3J5IGhhbmRsaW5nIHJvdXRpbmVzICovCisKKy8qIFRyeSB0byBhbGxvY2F0ZSBhIG5ldyB0YXBlIGJ1ZmZlciBza2VsZXRvbi4gQ2FsbGVyIG11c3Qgbm90IGhvbGQgb3Nfc2NzaV90YXBlc19sb2NrICovCitzdGF0aWMgc3RydWN0IG9zc3RfYnVmZmVyICogbmV3X3RhcGVfYnVmZmVyKCBpbnQgZnJvbV9pbml0aWFsaXphdGlvbiwgaW50IG5lZWRfZG1hLCBpbnQgbWF4X3NnICkKK3sKKwlpbnQgaSwgcHJpb3JpdHk7CisJc3RydWN0IG9zc3RfYnVmZmVyICp0YjsKKworCWlmIChmcm9tX2luaXRpYWxpemF0aW9uKQorCQlwcmlvcml0eSA9IEdGUF9BVE9NSUM7CisJZWxzZQorCQlwcmlvcml0eSA9IEdGUF9LRVJORUw7CisKKwlpID0gc2l6ZW9mKHN0cnVjdCBvc3N0X2J1ZmZlcikgKyAob3NzdF9tYXhfc2dfc2VncyAtIDEpICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJdGIgPSAoc3RydWN0IG9zc3RfYnVmZmVyICopa21hbGxvYyhpLCBwcmlvcml0eSk7CisJaWYgKCF0YikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIm9zc3QgOkk6IENhbid0IGFsbG9jYXRlIG5ldyB0YXBlIGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHRiLCAwLCBpKTsKKwl0Yi0+c2dfc2VncyA9IHRiLT5vcmlnX3NnX3NlZ3MgPSAwOworCXRiLT51c2Vfc2cgPSBtYXhfc2c7CisJdGItPmluX3VzZSA9IDE7CisJdGItPmRtYSA9IG5lZWRfZG1hOworCXRiLT5idWZmZXJfc2l6ZSA9IDA7CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKSAKKwkJcHJpbnRrKE9TU1RfREVCX01TRworCQkJIm9zc3QgOkQ6IEFsbG9jYXRlZCB0YXBlIGJ1ZmZlciBza2VsZXRvbiAoJWQgYnl0ZXMsICVkIHNlZ21lbnRzLCBkbWE6ICVkKS5cbiIsCisJCQkgICBpLCBtYXhfc2csIG5lZWRfZG1hKTsKKyNlbmRpZgorCXJldHVybiB0YjsKK30KKworLyogVHJ5IHRvIGFsbG9jYXRlIGEgdGVtcG9yYXJ5ICh3aGlsZSBhIHVzZXIgaGFzIHRoZSBkZXZpY2Ugb3BlbikgZW5sYXJnZWQgdGFwZSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IG9zc3RfYnVmZmVyICpTVGJ1ZmZlciwgaW50IG5lZWRfZG1hKQoreworCWludCBzZWdzLCBuYnIsIG1heF9zZWdzLCBiX3NpemUsIHByaW9yaXR5LCBvcmRlciwgZ290OworCisJaWYgKFNUYnVmZmVyLT5idWZmZXJfc2l6ZSA+PSBPU19GUkFNRV9TSVpFKQorCQlyZXR1cm4gMTsKKworCWlmIChTVGJ1ZmZlci0+c2dfc2VncykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvc3N0IDpBOiBCdWZmZXIgbm90IHByZXZpb3VzbHkgbm9ybWFsaXplZC5cbiIpOworCQlub3JtYWxpemVfYnVmZmVyKFNUYnVmZmVyKTsKKwl9CisJLyogU2VlIGhvdyBtYW55IHNlZ21lbnRzIHdlIGNhbiB1c2UgLS0gbmVlZCBhdCBsZWFzdCB0d28gKi8KKwluYnIgPSBtYXhfc2VncyA9IFNUYnVmZmVyLT51c2Vfc2c7CisJaWYgKG5iciA8PSAyKQorCQlyZXR1cm4gMDsKKworCXByaW9yaXR5ID0gR0ZQX0tFUk5FTCAvKiB8IF9fR0ZQX05PV0FSTiAqLzsKKwlpZiAobmVlZF9kbWEpCisJCXByaW9yaXR5IHw9IEdGUF9ETUE7CisKKwkvKiBUcnkgdG8gYWxsb2NhdGUgdGhlIGZpcnN0IHNlZ21lbnQgdXAgdG8gT1NfREFUQV9TSVpFIGFuZCB0aGUgb3RoZXJzCisJICAgYmlnIGVub3VnaCB0byByZWFjaCB0aGUgZ29hbCAoY29kZSBhc3N1bWVzIG5vIHNlZ21lbnRzIGluIHBsYWNlKSAqLworCWZvciAoYl9zaXplID0gT1NfREFUQV9TSVpFLCBvcmRlciA9IE9TU1RfRklSU1RfT1JERVI7IGJfc2l6ZSA+PSBQQUdFX1NJWkU7IG9yZGVyLS0sIGJfc2l6ZSAvPSAyKSB7CisJCVNUYnVmZmVyLT5zZ1swXS5wYWdlID0gYWxsb2NfcGFnZXMocHJpb3JpdHksIG9yZGVyKTsKKwkJU1RidWZmZXItPnNnWzBdLm9mZnNldCA9IDA7CisJCWlmIChTVGJ1ZmZlci0+c2dbMF0ucGFnZSAhPSBOVUxMKSB7CisJCSAgICBTVGJ1ZmZlci0+c2dbMF0ubGVuZ3RoID0gYl9zaXplOworCQkgICAgU1RidWZmZXItPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhTVGJ1ZmZlci0+c2dbMF0ucGFnZSk7CisJCSAgICBicmVhazsKKwkJfQorCX0KKwlpZiAoU1RidWZmZXItPnNnWzBdLnBhZ2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIm9zc3QgOkk6IENhbid0IGFsbG9jYXRlIHRhcGUgYnVmZmVyIG1haW4gc2VnbWVudC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyogR290IGluaXRpYWwgc2VnbWVudCBvZiAnYnNpemUsb3JkZXInLCBjb250aW51ZSB3aXRoIHNhbWUgc2l6ZSBpZiBwb3NzaWJsZSwgZXhjZXB0IGZvciBBVVggKi8KKwlmb3IgKHNlZ3M9U1RidWZmZXItPnNnX3NlZ3M9MSwgZ290PWJfc2l6ZTsKKwkgICAgIHNlZ3MgPCBtYXhfc2VncyAmJiBnb3QgPCBPU19GUkFNRV9TSVpFOyApIHsKKwkJU1RidWZmZXItPnNnW3NlZ3NdLnBhZ2UgPQorCQkJCWFsbG9jX3BhZ2VzKHByaW9yaXR5LCAoT1NfRlJBTUVfU0laRSAtIGdvdCA8PSBQQUdFX1NJWkUpID8gMCA6IG9yZGVyKTsKKwkJU1RidWZmZXItPnNnW3NlZ3NdLm9mZnNldCA9IDA7CisJCWlmIChTVGJ1ZmZlci0+c2dbc2Vnc10ucGFnZSA9PSBOVUxMKSB7CisJCQlpZiAoT1NfRlJBTUVfU0laRSAtIGdvdCA8PSAobWF4X3NlZ3MgLSBzZWdzKSAqIGJfc2l6ZSAvIDIgJiYgb3JkZXIpIHsKKwkJCQliX3NpemUgLz0gMjsgIC8qIExhcmdlIGVub3VnaCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlcnMgKi8KKwkJCQlvcmRlci0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6VzogRmFpbGVkIHRvIGVubGFyZ2UgYnVmZmVyIHRvICVkIGJ5dGVzLlxuIiwKKwkJCQkJCU9TX0ZSQU1FX1NJWkUpOworI2lmIERFQlVHCisJCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgPSBnb3Q7CisjZW5kaWYKKwkJCW5vcm1hbGl6ZV9idWZmZXIoU1RidWZmZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJU1RidWZmZXItPnNnW3NlZ3NdLmxlbmd0aCA9IChPU19GUkFNRV9TSVpFIC0gZ290IDw9IFBBR0VfU0laRSAvIDIpID8gKE9TX0ZSQU1FX1NJWkUgLSBnb3QpIDogYl9zaXplOworCQlnb3QgKz0gU1RidWZmZXItPnNnW3NlZ3NdLmxlbmd0aDsKKwkJU1RidWZmZXItPmJ1ZmZlcl9zaXplID0gZ290OworCQlTVGJ1ZmZlci0+c2dfc2VncyA9ICsrc2VnczsKKwl9CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nKSB7CisJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkJCSAgICJvc3N0IDpEOiBFeHBhbmRlZCB0YXBlIGJ1ZmZlciAoJWQgYnl0ZXMsICVkLT4lZCBzZWdtZW50cywgZG1hOiAlZCwgYXQ6ICVwKS5cbiIsCisJCQkgICBnb3QsIFNUYnVmZmVyLT5vcmlnX3NnX3NlZ3MsIFNUYnVmZmVyLT5zZ19zZWdzLCBuZWVkX2RtYSwgU1RidWZmZXItPmJfZGF0YSk7CisJCXByaW50ayhPU1NUX0RFQl9NU0cKKwkJCSAgICJvc3N0IDpEOiBzZWdtZW50IHNpemVzOiBmaXJzdCAlZCBhdCAlcCwgbGFzdCAlZCBieXRlcyBhdCAlcC5cbiIsCisJCQkgICBTVGJ1ZmZlci0+c2dbMF0ubGVuZ3RoLCBwYWdlX2FkZHJlc3MoU1RidWZmZXItPnNnWzBdLnBhZ2UpLAorCQkJICAgU1RidWZmZXItPnNnW3NlZ3MtMV0ubGVuZ3RoLCBwYWdlX2FkZHJlc3MoU1RidWZmZXItPnNnW3NlZ3MtMV0ucGFnZSkpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKKworLyogUmVsZWFzZSB0aGUgc2VnbWVudHMgKi8KK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9idWZmZXIoc3RydWN0IG9zc3RfYnVmZmVyICpTVGJ1ZmZlcikKK3sKKyAgaW50IGksIG9yZGVyLCBiX3NpemU7CisKKwlmb3IgKGk9MDsgaSA8IFNUYnVmZmVyLT5zZ19zZWdzOyBpKyspIHsKKworCQlmb3IgKGJfc2l6ZSA9IFBBR0VfU0laRSwgb3JkZXIgPSAwOworCQkgICAgIGJfc2l6ZSA8IFNUYnVmZmVyLT5zZ1tpXS5sZW5ndGg7CisJCSAgICAgYl9zaXplICo9IDIsIG9yZGVyKyspOworCisJCV9fZnJlZV9wYWdlcyhTVGJ1ZmZlci0+c2dbaV0ucGFnZSwgb3JkZXIpOworCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgLT0gU1RidWZmZXItPnNnW2ldLmxlbmd0aDsKKwl9CisjaWYgREVCVUcKKwlpZiAoZGVidWdnaW5nICYmIFNUYnVmZmVyLT5vcmlnX3NnX3NlZ3MgPCBTVGJ1ZmZlci0+c2dfc2VncykKKwkJcHJpbnRrKE9TU1RfREVCX01TRyAib3NzdCA6RDogQnVmZmVyIGF0ICVwIG5vcm1hbGl6ZWQgdG8gJWQgYnl0ZXMgKHNlZ3MgJWQpLlxuIiwKKwkJCSAgICAgU1RidWZmZXItPmJfZGF0YSwgU1RidWZmZXItPmJ1ZmZlcl9zaXplLCBTVGJ1ZmZlci0+c2dfc2Vncyk7CisjZW5kaWYKKwlTVGJ1ZmZlci0+c2dfc2VncyA9IFNUYnVmZmVyLT5vcmlnX3NnX3NlZ3MgPSAwOworfQorCisKKy8qIE1vdmUgZGF0YSBmcm9tIHRoZSB1c2VyIGJ1ZmZlciB0byB0aGUgdGFwZSBidWZmZXIuIFJldHVybnMgemVybyAoc3VjY2Vzcykgb3IKKyAgIG5lZ2F0aXZlIGVycm9yIGNvZGUuICovCitzdGF0aWMgaW50IGFwcGVuZF90b19idWZmZXIoY29uc3QgY2hhciBfX3VzZXIgKnVicCwgc3RydWN0IG9zc3RfYnVmZmVyICpzdF9icCwgaW50IGRvX2NvdW50KQoreworCWludCBpLCBjbnQsIHJlcywgb2Zmc2V0OworCisJZm9yIChpPTAsIG9mZnNldD1zdF9icC0+YnVmZmVyX2J5dGVzOworCSAgICAgaSA8IHN0X2JwLT5zZ19zZWdzICYmIG9mZnNldCA+PSBzdF9icC0+c2dbaV0ubGVuZ3RoOyBpKyspCisJb2Zmc2V0IC09IHN0X2JwLT5zZ1tpXS5sZW5ndGg7CisJaWYgKGkgPT0gc3RfYnAtPnNnX3NlZ3MpIHsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogQXBwZW5kX3RvX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJZm9yICggOyBpIDwgc3RfYnAtPnNnX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKKwkJY250ID0gc3RfYnAtPnNnW2ldLmxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8KKwkJICAgICAgc3RfYnAtPnNnW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50OworCQlyZXMgPSBjb3B5X2Zyb21fdXNlcihwYWdlX2FkZHJlc3Moc3RfYnAtPnNnW2ldLnBhZ2UpICsgb2Zmc2V0LCB1YnAsIGNudCk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQlkb19jb3VudCAtPSBjbnQ7CisJCXN0X2JwLT5idWZmZXJfYnl0ZXMgKz0gY250OworCQl1YnAgKz0gY250OworCQlvZmZzZXQgPSAwOworCX0KKwlpZiAoZG9fY291bnQpIHsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogQXBwZW5kX3RvX2J1ZmZlciBvdmVyZmxvdyAobGVmdCAlZCkuXG4iLAorCQkgICAgICAgZG9fY291bnQpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBNb3ZlIGRhdGEgZnJvbSB0aGUgdGFwZSBidWZmZXIgdG8gdGhlIHVzZXIgYnVmZmVyLiBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yCisgICBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLworc3RhdGljIGludCBmcm9tX2J1ZmZlcihzdHJ1Y3Qgb3NzdF9idWZmZXIgKnN0X2JwLCBjaGFyIF9fdXNlciAqdWJwLCBpbnQgZG9fY291bnQpCit7CisJaW50IGksIGNudCwgcmVzLCBvZmZzZXQ7CisKKwlmb3IgKGk9MCwgb2Zmc2V0PXN0X2JwLT5yZWFkX3BvaW50ZXI7CisJICAgICBpIDwgc3RfYnAtPnNnX3NlZ3MgJiYgb2Zmc2V0ID49IHN0X2JwLT5zZ1tpXS5sZW5ndGg7IGkrKykKKwkJb2Zmc2V0IC09IHN0X2JwLT5zZ1tpXS5sZW5ndGg7CisJaWYgKGkgPT0gc3RfYnAtPnNnX3NlZ3MpIHsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogRnJvbV9idWZmZXIgb2Zmc2V0IG92ZXJmbG93LlxuIik7CisJCXJldHVybiAoLUVJTyk7CisJfQorCWZvciAoIDsgaSA8IHN0X2JwLT5zZ19zZWdzICYmIGRvX2NvdW50ID4gMDsgaSsrKSB7CisJCWNudCA9IHN0X2JwLT5zZ1tpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/CisJCSAgICAgIHN0X2JwLT5zZ1tpXS5sZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKKwkJcmVzID0gY29weV90b191c2VyKHVicCwgcGFnZV9hZGRyZXNzKHN0X2JwLT5zZ1tpXS5wYWdlKSArIG9mZnNldCwgY250KTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiAoLUVGQVVMVCk7CisJCWRvX2NvdW50IC09IGNudDsKKwkJc3RfYnAtPmJ1ZmZlcl9ieXRlcyAtPSBjbnQ7CisJCXN0X2JwLT5yZWFkX3BvaW50ZXIgKz0gY250OworCQl1YnAgKz0gY250OworCQlvZmZzZXQgPSAwOworCX0KKwlpZiAoZG9fY291bnQpIHsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogRnJvbV9idWZmZXIgb3ZlcmZsb3cgKGxlZnQgJWQpLlxuIiwgZG9fY291bnQpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2V0cyB0aGUgdGFpbCBvZiB0aGUgYnVmZmVyIGFmdGVyIGZpbGwgcG9pbnQgdG8gemVyby4KKyAgIFJldHVybnMgemVybyAoc3VjY2Vzcykgb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4gICAgICAgICovCitzdGF0aWMgaW50IG9zc3RfemVyb19idWZmZXJfdGFpbChzdHJ1Y3Qgb3NzdF9idWZmZXIgKnN0X2JwKQoreworCWludAlpLCBvZmZzZXQsIGRvX2NvdW50LCBjbnQ7CisKKwlmb3IgKGkgPSAwLCBvZmZzZXQgPSBzdF9icC0+YnVmZmVyX2J5dGVzOworCSAgICAgaSA8IHN0X2JwLT5zZ19zZWdzICYmIG9mZnNldCA+PSBzdF9icC0+c2dbaV0ubGVuZ3RoOyBpKyspCisJCW9mZnNldCAtPSBzdF9icC0+c2dbaV0ubGVuZ3RoOworCWlmIChpID09IHN0X2JwLT5zZ19zZWdzKSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IFplcm9fYnVmZmVyIG9mZnNldCBvdmVyZmxvdy5cbiIpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlmb3IgKGRvX2NvdW50ID0gT1NfREFUQV9TSVpFIC0gc3RfYnAtPmJ1ZmZlcl9ieXRlczsKKwkgICAgIGkgPCBzdF9icC0+c2dfc2VncyAmJiBkb19jb3VudCA+IDA7IGkrKykgeworCQljbnQgPSBzdF9icC0+c2dbaV0ubGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPworCQkgICAgICBzdF9icC0+c2dbaV0ubGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQgOworCQltZW1zZXQocGFnZV9hZGRyZXNzKHN0X2JwLT5zZ1tpXS5wYWdlKSArIG9mZnNldCwgMCwgY250KTsKKwkJZG9fY291bnQgLT0gY250OworCQlvZmZzZXQgPSAwOworCX0KKwlpZiAoZG9fY291bnQpIHsgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6QTogWmVyb19idWZmZXIgb3ZlcmZsb3cgKGxlZnQgJWQpLlxuIiwgZG9fY291bnQpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ29weSBhIG9zc3QgMzJLIGNodW5rIG9mIG1lbW9yeSBpbnRvIHRoZSBidWZmZXIuCisgICBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLworc3RhdGljIGludCBvc3N0X2NvcHlfdG9fYnVmZmVyKHN0cnVjdCBvc3N0X2J1ZmZlciAqc3RfYnAsIHVuc2lnbmVkIGNoYXIgKnB0cikKK3sKKwlpbnQJaSwgY250LCBkb19jb3VudCA9IE9TX0RBVEFfU0laRTsKKworCWZvciAoaSA9IDA7IGkgPCBzdF9icC0+c2dfc2VncyAmJiBkb19jb3VudCA+IDA7IGkrKykgeworCQljbnQgPSBzdF9icC0+c2dbaV0ubGVuZ3RoIDwgZG9fY291bnQgPworCQkgICAgICBzdF9icC0+c2dbaV0ubGVuZ3RoIDogZG9fY291bnQgOworCQltZW1jcHkocGFnZV9hZGRyZXNzKHN0X2JwLT5zZ1tpXS5wYWdlKSwgcHRyLCBjbnQpOworCQlkb19jb3VudCAtPSBjbnQ7CisJCXB0ciAgICAgICs9IGNudDsKKwl9CisJaWYgKGRvX2NvdW50IHx8IGkgIT0gc3RfYnAtPnNnX3NlZ3MtMSkgeyAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvc3N0IDpBOiBDb3B5X3RvX2J1ZmZlciBvdmVyZmxvdyAobGVmdCAlZCBhdCBzZyAlZCkuXG4iLAorCQkJCQkgZG9fY291bnQsIGkpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ29weSBhIG9zc3QgMzJLIGNodW5rIG9mIG1lbW9yeSBmcm9tIHRoZSBidWZmZXIuCisgICBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLworc3RhdGljIGludCBvc3N0X2NvcHlfZnJvbV9idWZmZXIoc3RydWN0IG9zc3RfYnVmZmVyICpzdF9icCwgdW5zaWduZWQgY2hhciAqcHRyKQoreworCWludAlpLCBjbnQsIGRvX2NvdW50ID0gT1NfREFUQV9TSVpFOworCisJZm9yIChpID0gMDsgaSA8IHN0X2JwLT5zZ19zZWdzICYmIGRvX2NvdW50ID4gMDsgaSsrKSB7CisJCWNudCA9IHN0X2JwLT5zZ1tpXS5sZW5ndGggPCBkb19jb3VudCA/CisJCSAgICAgIHN0X2JwLT5zZ1tpXS5sZW5ndGggOiBkb19jb3VudCA7CisJCW1lbWNweShwdHIsIHBhZ2VfYWRkcmVzcyhzdF9icC0+c2dbaV0ucGFnZSksIGNudCk7CisJCWRvX2NvdW50IC09IGNudDsKKwkJcHRyICAgICAgKz0gY250OworCX0KKwlpZiAoZG9fY291bnQgfHwgaSAhPSBzdF9icC0+c2dfc2Vncy0xKSB7ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOkE6IENvcHlfZnJvbV9idWZmZXIgb3ZlcmZsb3cgKGxlZnQgJWQgYXQgc2cgJWQpLlxuIiwKKwkJCQkJIGRvX2NvdW50LCBpKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwwKKy8qIE1vZHVsZSBob3VzZWtlZXBpbmcgKi8KKworc3RhdGljIHZvaWQgdmFsaWRhdGVfb3B0aW9ucyAodm9pZCkKK3sKKyAgaWYgKG1heF9kZXYgPiAwKQorCQlvc3N0X21heF9kZXYgPSBtYXhfZGV2OyAgCisgIGlmICh3cml0ZV90aHJlc2hvbGRfa2JzID4gMCkKKwkJb3NzdF93cml0ZV90aHJlc2hvbGQgPSB3cml0ZV90aHJlc2hvbGRfa2JzICogU1RfS0lMT0JZVEU7CisgIGlmIChvc3N0X3dyaXRlX3RocmVzaG9sZCA+IG9zc3RfYnVmZmVyX3NpemUpCisJCW9zc3Rfd3JpdGVfdGhyZXNob2xkID0gb3NzdF9idWZmZXJfc2l6ZTsKKyAgaWYgKG1heF9zZ19zZWdzID49IE9TU1RfRklSU1RfU0cpCisJCW9zc3RfbWF4X3NnX3NlZ3MgPSBtYXhfc2dfc2VnczsKKyNpZiBERUJVRworICBwcmludGsoT1NTVF9ERUJfTVNHICJvc3N0IDpEOiBtYXggdGFwZXMgJWQsIHdyaXRlIHRocmVzaG9sZCAlZCwgbWF4IHMvZyBzZWdzICVkLlxuIiwKKwkJCSAgIG9zc3RfbWF4X2Rldiwgb3NzdF93cml0ZV90aHJlc2hvbGQsIG9zc3RfbWF4X3NnX3NlZ3MpOworI2VuZGlmCit9CisJCisjaWZuZGVmIE1PRFVMRQorLyogU2V0IHRoZSBib290IG9wdGlvbnMuIFN5bnRheDogb3NzdD14eHgseXl5LC4uLgorICAgd2hlcmUgeHh4IGlzIHdyaXRlIHRocmVzaG9sZCBpbiAxMDI0IGJ5dGUgYmxvY2tzLAorICAgYW5kICAgeXl5IGlzIG51bWJlciBvZiBzL2cgc2VnbWVudHMgdG8gdXNlLiAqLworc3RhdGljIGludCBfX2luaXQgb3NzdF9zZXR1cCAoY2hhciAqc3RyKQoreworICBpbnQgaSwgaW50c1s1XTsKKyAgY2hhciAqc3RwOworCisgIHN0cCA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisgIGlmIChpbnRzWzBdID4gMCkgeworCWZvciAoaSA9IDA7IGkgPCBpbnRzWzBdICYmIGkgPCBBUlJBWV9TSVpFKHBhcm1zKTsgaSsrKQorCQkgICpwYXJtc1tpXS52YWwgPSBpbnRzW2kgKyAxXTsKKyAgfSBlbHNlIHsKKwl3aGlsZSAoc3RwICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGFybXMpOyBpKyspIHsKKwkJCWludCBsZW4gPSBzdHJsZW4ocGFybXNbaV0ubmFtZSk7CisJCQlpZiAoIXN0cm5jbXAoc3RwLCBwYXJtc1tpXS5uYW1lLCBsZW4pICYmCisJCQkgICAgKCooc3RwICsgbGVuKSA9PSAnOicgfHwgKihzdHAgKyBsZW4pID09ICc9JykpIHsKKwkJCQkqcGFybXNbaV0udmFsID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwoc3RwICsgbGVuICsgMSwgTlVMTCwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPj0gc2l6ZW9mKHBhcm1zKSAvIHNpemVvZihzdHJ1Y3Qgb3NzdF9kZXZfcGFybSkpCisJCQlwcmludGsoS0VSTl9JTkZPICJvc3N0IDpJOiBJbGxlZ2FsIHBhcmFtZXRlciBpbiAnJXMnXG4iLAorCQkJICAgICAgIHN0cCk7CisJCXN0cCA9IHN0cmNocihzdHAsICcsJyk7CisJCWlmIChzdHApCisJCQlzdHArKzsKKwl9CisgIH0KKworICByZXR1cm4gMTsKK30KKworX19zZXR1cCgib3NzdD0iLCBvc3N0X3NldHVwKTsKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9zc3RfZm9wcyA9IHsKKwkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCisJLnJlYWQgPSAgICAgICAgIG9zc3RfcmVhZCwKKwkud3JpdGUgPSAgICAgICAgb3NzdF93cml0ZSwKKwkuaW9jdGwgPSAgICAgICAgb3NzdF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IG9zc3RfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLm9wZW4gPSAgICAgICAgIG9zX3Njc2lfdGFwZV9vcGVuLAorCS5mbHVzaCA9ICAgICAgICBvc19zY3NpX3RhcGVfZmx1c2gsCisJLnJlbGVhc2UgPSAgICAgIG9zX3Njc2lfdGFwZV9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgb3NzdF9zdXBwb3J0cyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBTRHApCit7CisJc3RydWN0CW9zc3Rfc3VwcG9ydF9kYXRhIHsKKwkJY2hhciAqdmVuZG9yOworCQljaGFyICptb2RlbDsKKwkJY2hhciAqcmV2OworCQljaGFyICpkcml2ZXJfaGludDsgLyogTmFtZSBvZiB0aGUgY29ycmVjdCBkcml2ZXIsIE5VTEwgaWYgdW5rbm93biAqLworCX07CisKK3N0YXRpYwlzdHJ1Y3QJb3NzdF9zdXBwb3J0X2RhdGEgc3VwcG9ydF9saXN0W10gPSB7CisJCS8qIHsiWFhYIiwgIll5LSIsICIiLCBOVUxMfSwgIGV4YW1wbGUgKi8KKwkJU0lHU19GUk9NX09TU1QsCisJCXtOVUxMLCB9fTsKKworCXN0cnVjdAlvc3N0X3N1cHBvcnRfZGF0YSAqcnA7CisKKwkvKiBXZSBhcmUgd2lsbGluZyB0byBkcml2ZSBPblN0cmVhbSBTQy14MCBhcyB3ZWxsIGFzIHRoZQorCSAqIAkgKiBJREUsIFBhclBvcnQsIEZpcmVXaXJlLCBVU0IgdmFyaWFudHMsIGlmIGFjY2Vzc2libGUgYnkKKwkgKiAJIAkgKiBlbXVsYXRpb24gbGF5ZXIgKGlkZS1zY3NpLCB1c2Itc3RvcmFnZSwgLi4uKSAqLworCisJZm9yIChycD0mKHN1cHBvcnRfbGlzdFswXSk7IHJwLT52ZW5kb3IgIT0gTlVMTDsgcnArKykKKwkJaWYgKCFzdHJuY21wKHJwLT52ZW5kb3IsIFNEcC0+dmVuZG9yLCBzdHJsZW4ocnAtPnZlbmRvcikpICYmCisJCSAgICAhc3RybmNtcChycC0+bW9kZWwsIFNEcC0+bW9kZWwsIHN0cmxlbihycC0+bW9kZWwpKSAmJgorCQkgICAgIXN0cm5jbXAocnAtPnJldiwgU0RwLT5yZXYsIHN0cmxlbihycC0+cmV2KSkpIAorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzeXNmcyBzdXBwb3J0IGZvciBvc3N0IGRyaXZlciBwYXJhbWV0ZXIgaW5mb3JtYXRpb24KKyAqLworCitzdGF0aWMgc3NpemVfdCBvc3N0X3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRkLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIG9zc3RfdmVyc2lvbik7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCBvc3N0X3ZlcnNpb25fc2hvdywgTlVMTCk7CisKK3N0YXRpYyB2b2lkIG9zc3RfY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcykKK3sKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKK30KKworc3RhdGljIHZvaWQgb3NzdF9yZW1vdmVfZHJpdmVyZnNfZmlsZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzKQoreworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworfQorCisvKgorICogc3lzZnMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIEFEUiBoZWFkZXIgaW5mb3JtYXRpb24KKyAqLworCitzdGF0aWMgc3NpemVfdCBvc3N0X2Fkcl9yZXZfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb3NzdF90YXBlICogU1RwID0gKHN0cnVjdCBvc3N0X3RhcGUgKikgY2xhc3NfZ2V0X2RldmRhdGEgKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKworCWlmIChTVHAgJiYgU1RwLT5oZWFkZXJfb2sgJiYgU1RwLT5saW51eF9tZWRpYSkKKwkJbCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJWRcbiIsIFNUcC0+aGVhZGVyX2NhY2hlLT5tYWpvcl9yZXYsIFNUcC0+aGVhZGVyX2NhY2hlLT5taW5vcl9yZXYpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihBRFJfcmV2LCBTX0lSVUdPLCBvc3N0X2Fkcl9yZXZfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG9zc3RfbGludXhfbWVkaWFfdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvc3N0X3RhcGUgKiBTVHAgPSAoc3RydWN0IG9zc3RfdGFwZSAqKSBjbGFzc19nZXRfZGV2ZGF0YSAoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCisJaWYgKFNUcCAmJiBTVHAtPmhlYWRlcl9vayAmJiBTVHAtPmxpbnV4X21lZGlhKQorCQlsID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJMSU4lZFxuIiwgU1RwLT5saW51eF9tZWRpYV92ZXJzaW9uKTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIobWVkaWFfdmVyc2lvbiwgU19JUlVHTywgb3NzdF9saW51eF9tZWRpYV92ZXJzaW9uX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBvc3N0X2NhcGFjaXR5X3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqIFNUcCA9IChzdHJ1Y3Qgb3NzdF90YXBlICopIGNsYXNzX2dldF9kZXZkYXRhIChjbGFzc19kZXYpOworCXNzaXplX3QgbCA9IDA7CisKKwlpZiAoU1RwICYmIFNUcC0+aGVhZGVyX29rICYmIFNUcC0+bGludXhfbWVkaWEpCisJCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVHAtPmNhcGFjaXR5KTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIoY2FwYWNpdHksIFNfSVJVR08sIG9zc3RfY2FwYWNpdHlfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG9zc3RfZmlyc3RfZGF0YV9wcG9zX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqIFNUcCA9IChzdHJ1Y3Qgb3NzdF90YXBlICopIGNsYXNzX2dldF9kZXZkYXRhIChjbGFzc19kZXYpOworCXNzaXplX3QgbCA9IDA7CisKKwlpZiAoU1RwICYmIFNUcC0+aGVhZGVyX29rICYmIFNUcC0+bGludXhfbWVkaWEpCisJCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVHAtPmZpcnN0X2RhdGFfcHBvcyk7CisJcmV0dXJuIGw7Cit9CisKK0NMQVNTX0RFVklDRV9BVFRSKEJPVF9mcmFtZSwgU19JUlVHTywgb3NzdF9maXJzdF9kYXRhX3Bwb3Nfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG9zc3RfZW9kX2ZyYW1lX3Bwb3Nfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb3NzdF90YXBlICogU1RwID0gKHN0cnVjdCBvc3N0X3RhcGUgKikgY2xhc3NfZ2V0X2RldmRhdGEgKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKworCWlmIChTVHAgJiYgU1RwLT5oZWFkZXJfb2sgJiYgU1RwLT5saW51eF9tZWRpYSkKKwkJbCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIFNUcC0+ZW9kX2ZyYW1lX3Bwb3MpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihFT0RfZnJhbWUsIFNfSVJVR08sIG9zc3RfZW9kX2ZyYW1lX3Bwb3Nfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG9zc3RfZmlsZW1hcmtfY250X3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG9zc3RfdGFwZSAqIFNUcCA9IChzdHJ1Y3Qgb3NzdF90YXBlICopIGNsYXNzX2dldF9kZXZkYXRhIChjbGFzc19kZXYpOworCXNzaXplX3QgbCA9IDA7CisKKwlpZiAoU1RwICYmIFNUcC0+aGVhZGVyX29rICYmIFNUcC0+bGludXhfbWVkaWEpCisJCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVHAtPmZpbGVtYXJrX2NudCk7CisJcmV0dXJuIGw7Cit9CisKK0NMQVNTX0RFVklDRV9BVFRSKGZpbGVfY291bnQsIFNfSVJVR08sIG9zc3RfZmlsZW1hcmtfY250X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqIG9zc3Rfc3lzZnNfY2xhc3M7CisKK3N0YXRpYyBpbnQgb3NzdF9zeXNmc192YWxpZCA9IDA7CisKK3N0YXRpYyB2b2lkIG9zc3Rfc3lzZnNfaW5pdCh2b2lkKQoreworCW9zc3Rfc3lzZnNfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAib25zdHJlYW1fdGFwZSIpOworCWlmICggSVNfRVJSKG9zc3Rfc3lzZnNfY2xhc3MpICkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3NzdCA6VzogVW5hYmxlIHRvIHJlZ2lzdGVyIHN5c2ZzIGNsYXNzXG4iKTsKKwllbHNlCisJCW9zc3Rfc3lzZnNfdmFsaWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBvc3N0X3N5c2ZzX2FkZChkZXZfdCBkZXYsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IG9zc3RfdGFwZSAqIFNUcCwgY2hhciAqIG5hbWUpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqb3NzdF9jbGFzc19tZW1iZXI7CisKKwlpZiAoIW9zc3Rfc3lzZnNfdmFsaWQpIHJldHVybjsKKworCW9zc3RfY2xhc3NfbWVtYmVyID0gY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQob3NzdF9zeXNmc19jbGFzcywgZGV2LCBkZXZpY2UsICIlcyIsIG5hbWUpOworCWlmIChJU19FUlIob3NzdF9jbGFzc19tZW1iZXIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOlc6IFVuYWJsZSB0byBhZGQgc3lzZnMgY2xhc3MgbWVtYmVyICVzXG4iLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKwljbGFzc19zZXRfZGV2ZGF0YShvc3N0X2NsYXNzX21lbWJlciwgU1RwKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUob3NzdF9jbGFzc19tZW1iZXIsICZjbGFzc19kZXZpY2VfYXR0cl9BRFJfcmV2KTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUob3NzdF9jbGFzc19tZW1iZXIsICZjbGFzc19kZXZpY2VfYXR0cl9tZWRpYV92ZXJzaW9uKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUob3NzdF9jbGFzc19tZW1iZXIsICZjbGFzc19kZXZpY2VfYXR0cl9jYXBhY2l0eSk7CisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKG9zc3RfY2xhc3NfbWVtYmVyLCAmY2xhc3NfZGV2aWNlX2F0dHJfQk9UX2ZyYW1lKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUob3NzdF9jbGFzc19tZW1iZXIsICZjbGFzc19kZXZpY2VfYXR0cl9FT0RfZnJhbWUpOworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShvc3N0X2NsYXNzX21lbWJlciwgJmNsYXNzX2RldmljZV9hdHRyX2ZpbGVfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBvc3N0X3N5c2ZzX2Rlc3Ryb3koZGV2X3QgZGV2KQoreworCWlmICghb3NzdF9zeXNmc192YWxpZCkgcmV0dXJuOyAKKworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIG9zc3Rfc3lzZnNfY2xlYW51cCh2b2lkKQoreworCWlmIChvc3N0X3N5c2ZzX3ZhbGlkKSB7CisJCWNsYXNzX3NpbXBsZV9kZXN0cm95KG9zc3Rfc3lzZnNfY2xhc3MpOworCQlvc3N0X3N5c2ZzX3ZhbGlkID0gMDsKKwl9Cit9CisKKy8qCisgKiBvc3N0IHN0YXJ0dXAgLyBjbGVhbnVwIGNvZGUKKyAqLworCitzdGF0aWMgaW50IG9zc3RfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqIFNEcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IG9zc3RfdGFwZSAgICogdHBudDsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAgKiBTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICogU1RwczsKKwlzdHJ1Y3Qgb3NzdF9idWZmZXIgKiBidWZmZXI7CisJc3RydWN0IGdlbmRpc2sJICAgKiBkcml2ZTsKKwlpbnQJCSAgICAgaSwgbW9kZSwgZGV2X251bTsKKworCWlmIChTRHAtPnR5cGUgIT0gVFlQRV9UQVBFIHx8ICFvc3N0X3N1cHBvcnRzKFNEcCkpCisJCXJldHVybiAtRU5PREVWOworCisJZHJpdmUgPSBhbGxvY19kaXNrKDEpOworCWlmICghZHJpdmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvc3N0IDpFOiBPdXQgb2YgbWVtb3J5LiBEZXZpY2Ugbm90IGF0dGFjaGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGF0dGFjaCwgYnVpbGQgdGhlIGluZnJhc3RydWN0dXJlICovCisJd3JpdGVfbG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwlpZiAob3Nfc2NzaV90YXBlcyA9PSBOVUxMKSB7CisJCW9zX3Njc2lfdGFwZXMgPQorCQkJKHN0cnVjdCBvc3N0X3RhcGUgKiopa21hbGxvYyhvc3N0X21heF9kZXYgKiBzaXplb2Yoc3RydWN0IG9zc3RfdGFwZSAqKSwKKwkJCQkgICBHRlBfQVRPTUlDKTsKKwkJaWYgKG9zX3Njc2lfdGFwZXMgPT0gTlVMTCkgeworCQkJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCQkJcHJpbnRrKEtFUk5fRVJSICJvc3N0IDpFOiBVbmFibGUgdG8gYWxsb2NhdGUgYXJyYXkgZm9yIE9uU3RyZWFtIFNDU0kgdGFwZXMuXG4iKTsKKwkJCWdvdG8gb3V0X3B1dF9kaXNrOworCQl9CisJCWZvciAoaT0wOyBpIDwgb3NzdF9tYXhfZGV2OyArK2kpIG9zX3Njc2lfdGFwZXNbaV0gPSBOVUxMOworCX0KKwkKKwlpZiAob3NzdF9ucl9kZXYgPj0gb3NzdF9tYXhfZGV2KSB7CisJCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJvc3N0IDpFOiBUb28gbWFueSB0YXBlIGRldmljZXMgKG1heC4gJWQpLlxuIiwgb3NzdF9tYXhfZGV2KTsKKwkJZ290byBvdXRfcHV0X2Rpc2s7CisJfQorCisJLyogZmluZCBhIGZyZWUgbWlub3IgbnVtYmVyICovCisJZm9yIChpPTA7IG9zX3Njc2lfdGFwZXNbaV0gJiYgaTxvc3N0X21heF9kZXY7IGkrKyk7CisJaWYoaSA+PSBvc3N0X21heF9kZXYpIHBhbmljICgiU2NzaV9kZXZpY2VzIGNvcnJ1cHQgKG9zc3QpIik7CisJZGV2X251bSA9IGk7CisKKwkvKiBhbGxvY2F0ZSBhIHN0cnVjdCBvc3N0X3RhcGUgZm9yIHRoaXMgZGV2aWNlICovCisJdHBudCA9IChzdHJ1Y3Qgb3NzdF90YXBlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IG9zc3RfdGFwZSksIEdGUF9BVE9NSUMpOworCWlmICh0cG50ID09IE5VTEwpIHsKKwkJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgIm9zc3QgOkU6IENhbid0IGFsbG9jYXRlIGRldmljZSBkZXNjcmlwdG9yLCBkZXZpY2Ugbm90IGF0dGFjaGVkLlxuIik7CisJCWdvdG8gb3V0X3B1dF9kaXNrOworCX0KKwltZW1zZXQodHBudCwgMCwgc2l6ZW9mKHN0cnVjdCBvc3N0X3RhcGUpKTsKKworCS8qIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGlzIGRldmljZSAqLworCWkgPSBTRHAtPmhvc3QtPnNnX3RhYmxlc2l6ZTsKKwlpZiAob3NzdF9tYXhfc2dfc2VncyA8IGkpCisJCWkgPSBvc3N0X21heF9zZ19zZWdzOworCWJ1ZmZlciA9IG5ld190YXBlX2J1ZmZlcigxLCBTRHAtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hLCBpKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgIm9zc3QgOkU6IFVuYWJsZSB0byBhbGxvY2F0ZSBhIHRhcGUgYnVmZmVyLCBkZXZpY2Ugbm90IGF0dGFjaGVkLlxuIik7CisJCWtmcmVlKHRwbnQpOworCQlnb3RvIG91dF9wdXRfZGlzazsKKwl9CisJb3Nfc2NzaV90YXBlc1tkZXZfbnVtXSA9IHRwbnQ7CisJdHBudC0+YnVmZmVyID0gYnVmZmVyOworCXRwbnQtPmRldmljZSA9IFNEcDsKKwlkcml2ZS0+cHJpdmF0ZV9kYXRhID0gJnRwbnQtPmRyaXZlcjsKKwlzcHJpbnRmKGRyaXZlLT5kaXNrX25hbWUsICJvc3N0JWQiLCBkZXZfbnVtKTsKKwl0cG50LT5kcml2ZXIgPSAmb3NzdF90ZW1wbGF0ZTsKKwl0cG50LT5kcml2ZSA9IGRyaXZlOworCXRwbnQtPmluX3VzZSA9IDA7CisJdHBudC0+Y2FwYWNpdHkgPSAweGZmZmZmOworCXRwbnQtPmRpcnR5ID0gMDsKKwl0cG50LT5kcnZfYnVmZmVyID0gMTsgIC8qIFRyeSBidWZmZXJpbmcgaWYgbm8gbW9kZSBzZW5zZSAqLworCXRwbnQtPnJlc3RyX2RtYSA9IChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYTsKKwl0cG50LT5kZW5zaXR5ID0gMDsKKwl0cG50LT5kb19hdXRvX2xvY2sgPSBPU1NUX0FVVE9fTE9DSzsKKwl0cG50LT5jYW5fYnNyID0gT1NTVF9JTl9GSUxFX1BPUzsKKwl0cG50LT5jYW5fcGFydGl0aW9ucyA9IDA7CisJdHBudC0+dHdvX2ZtID0gT1NTVF9UV09fRk07CisJdHBudC0+ZmFzdF9tdGVvbSA9IE9TU1RfRkFTVF9NVEVPTTsKKwl0cG50LT5zY3NpMl9sb2dpY2FsID0gT1NTVF9TQ1NJMkxPR0lDQUw7IC8qIEZJWE1FICovCisJdHBudC0+d3JpdGVfdGhyZXNob2xkID0gb3NzdF93cml0ZV90aHJlc2hvbGQ7CisJdHBudC0+ZGVmYXVsdF9kcnZidWZmZXIgPSAweGZmOyAvKiBObyBmb3JjZWQgYnVmZmVyaW5nICovCisJdHBudC0+cGFydGl0aW9uID0gMDsKKwl0cG50LT5uZXdfcGFydGl0aW9uID0gMDsKKwl0cG50LT5uYnJfcGFydGl0aW9ucyA9IDA7CisJdHBudC0+bWluX2Jsb2NrID0gNTEyOworCXRwbnQtPm1heF9ibG9jayA9IE9TX0RBVEFfU0laRTsKKwl0cG50LT50aW1lb3V0ID0gT1NTVF9USU1FT1VUOworCXRwbnQtPmxvbmdfdGltZW91dCA9IE9TU1RfTE9OR19USU1FT1VUOworCisJLyogUmVjb2duaXplIE9uU3RyZWFtIHRhcGVzICovCisJLyogV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGZvciBPblN0cmVhbSwgYXMgdGhpcyBoYXMgYmVlbiBkb25lIGluIGRldGVjdCAoKSAqLworCXRwbnQtPm9zX2Z3X3JldiA9IG9zc3RfcGFyc2VfZmlybXdhcmVfcmV2IChTRHAtPnJldik7CisJdHBudC0+b21pdF9ibGtsaW1zID0gMTsKKworCXRwbnQtPnBvbGwgPSAoc3RybmNtcChTRHAtPm1vZGVsLCAiREktIiwgMykgPT0gMCkgfHwgCisJCSAgICAgKHN0cm5jbXAoU0RwLT5tb2RlbCwgIkZXLSIsIDMpID09IDApIHx8IE9TU1RfRldfTkVFRF9QT0xMKHRwbnQtPm9zX2Z3X3JldixTRHApOworCXRwbnQtPmZyYW1lX2luX2J1ZmZlciA9IDA7CisJdHBudC0+aGVhZGVyX29rID0gMDsKKwl0cG50LT5saW51eF9tZWRpYSA9IDA7CisJdHBudC0+aGVhZGVyX2NhY2hlID0gTlVMTDsKKworCWZvciAoaT0wOyBpIDwgU1RfTkJSX01PREVTOyBpKyspIHsKKwkJU1RtID0gJih0cG50LT5tb2Rlc1tpXSk7CisJCVNUbS0+ZGVmaW5lZCA9IDA7CisJCVNUbS0+c3lzdiA9IE9TU1RfU1lTVjsKKwkJU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzID0gMDsKKwkJU1RtLT5kb19hc3luY193cml0ZXMgPSBPU1NUX0FTWU5DX1dSSVRFUzsKKwkJU1RtLT5kb19idWZmZXJfd3JpdGVzID0gT1NTVF9CVUZGRVJfV1JJVEVTOworCQlTVG0tPmRvX3JlYWRfYWhlYWQgPSBPU1NUX1JFQURfQUhFQUQ7CisJCVNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiA9IFNUX0RPTlRfVE9VQ0g7CisJCVNUbS0+ZGVmYXVsdF9ibGtzaXplID0gNTEyOworCQlTVG0tPmRlZmF1bHRfZGVuc2l0eSA9ICgtMSk7ICAvKiBObyBmb3JjZWQgZGVuc2l0eSAqLworCX0KKworCWZvciAoaT0wOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQlTVHBzID0gJih0cG50LT5wc1tpXSk7CisJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCVNUcHMtPmF0X3NtID0gMDsKKwkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCVNUcHMtPmRydl9maWxlID0gKC0xKTsKKwl9CisKKwl0cG50LT5jdXJyZW50X21vZGUgPSAwOworCXRwbnQtPm1vZGVzWzBdLmRlZmluZWQgPSAxOworCXRwbnQtPm1vZGVzWzJdLmRlZmluZWQgPSAxOworCXRwbnQtPmRlbnNpdHlfY2hhbmdlZCA9IHRwbnQtPmNvbXByZXNzaW9uX2NoYW5nZWQgPSB0cG50LT5ibGtzaXplX2NoYW5nZWQgPSAwOworCisJaW5pdF9NVVRFWCgmdHBudC0+bG9jayk7CisJb3NzdF9ucl9kZXYrKzsKKwl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJeworCQljaGFyIG5hbWVbOF07CisJCS8qICBSZXdpbmQgZW50cnkgICovCisJCW9zc3Rfc3lzZnNfYWRkKE1LREVWKE9TU1RfTUFKT1IsIGRldl9udW0pLCBkZXYsIHRwbnQsIHRhcGVfbmFtZSh0cG50KSk7CisJCS8qICBOby1yZXdpbmQgZW50cnkgICovCisJCXNucHJpbnRmKG5hbWUsIDgsICIlcyVzIiwgIm4iLCB0YXBlX25hbWUodHBudCkpOworCQlvc3N0X3N5c2ZzX2FkZChNS0RFVihPU1NUX01BSk9SLCBkZXZfbnVtICsgMTI4KSwgZGV2LCB0cG50LCBuYW1lKTsKKwl9CisJZm9yIChtb2RlID0gMDsgbW9kZSA8IFNUX05CUl9NT0RFUzsgKyttb2RlKSB7CisJCS8qICBSZXdpbmQgZW50cnkgICovCisJCWRldmZzX21rX2NkZXYoTUtERVYoT1NTVF9NQUpPUiwgZGV2X251bSArIChtb2RlIDw8IDUpKSwKKwkJCQlTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCQkJIiVzL290JXMiLCBTRHAtPmRldmZzX25hbWUsIG9zc3RfZm9ybWF0c1ttb2RlXSk7CisKKwkJLyogIE5vLXJld2luZCBlbnRyeSAgKi8KKwkJZGV2ZnNfbWtfY2RldihNS0RFVihPU1NUX01BSk9SLCBkZXZfbnVtICsgKG1vZGUgPDwgNSkgKyAxMjgpLAorCQkJCVNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJCQkiJXMvb3Qlc24iLCBTRHAtPmRldmZzX25hbWUsIG9zc3RfZm9ybWF0c1ttb2RlXSk7CisJfQorCWRyaXZlLT5udW1iZXIgPSBkZXZmc19yZWdpc3Rlcl90YXBlKFNEcC0+ZGV2ZnNfbmFtZSk7CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSJvc3N0IDpJOiBBdHRhY2hlZCBPblN0cmVhbSAlLjVzIHRhcGUgYXQgc2NzaSVkLCBjaGFubmVsICVkLCBpZCAlZCwgbHVuICVkIGFzICVzXG4iLAorCQlTRHAtPm1vZGVsLCBTRHAtPmhvc3QtPmhvc3Rfbm8sIFNEcC0+Y2hhbm5lbCwgU0RwLT5pZCwgU0RwLT5sdW4sIHRhcGVfbmFtZSh0cG50KSk7CisKKwlyZXR1cm4gMDsKKworb3V0X3B1dF9kaXNrOgorICAgICAgICBwdXRfZGlzayhkcml2ZSk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworfTsKKworc3RhdGljIGludCBvc3N0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICogU0RwID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb3NzdF90YXBlICogdHBudDsKKwlpbnQgaSwgbW9kZTsKKworCWlmICgoU0RwLT50eXBlICE9IFRZUEVfVEFQRSkgfHwgKG9zc3RfbnJfZGV2IDw9IDApKQorCQlyZXR1cm4gMDsKKworCXdyaXRlX2xvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJZm9yKGk9MDsgaSA8IG9zc3RfbWF4X2RldjsgaSsrKSB7CisJCWlmKCh0cG50ID0gb3Nfc2NzaV90YXBlc1tpXSkgJiYgKHRwbnQtPmRldmljZSA9PSBTRHApKSB7CisJCQlvc3N0X3N5c2ZzX2Rlc3Ryb3koTUtERVYoT1NTVF9NQUpPUiwgaSkpOworCQkJb3NzdF9zeXNmc19kZXN0cm95KE1LREVWKE9TU1RfTUFKT1IsIGkrMTI4KSk7CisJCQl0cG50LT5kZXZpY2UgPSBOVUxMOworCQkJZm9yIChtb2RlID0gMDsgbW9kZSA8IFNUX05CUl9NT0RFUzsgKyttb2RlKSB7CisJCQkJZGV2ZnNfcmVtb3ZlKCIlcy9vdCVzIiwgU0RwLT5kZXZmc19uYW1lLCBvc3N0X2Zvcm1hdHNbbW9kZV0pOworCQkJCWRldmZzX3JlbW92ZSgiJXMvb3Qlc24iLCBTRHAtPmRldmZzX25hbWUsIG9zc3RfZm9ybWF0c1ttb2RlXSk7CisJCQl9CisJCQlkZXZmc191bnJlZ2lzdGVyX3RhcGUodHBudC0+ZHJpdmUtPm51bWJlcik7CisJCQlwdXRfZGlzayh0cG50LT5kcml2ZSk7CisJCQlvc19zY3NpX3RhcGVzW2ldID0gTlVMTDsKKwkJCW9zc3RfbnJfZGV2LS07CisJCQl3cml0ZV91bmxvY2soJm9zX3Njc2lfdGFwZXNfbG9jayk7CisJCQlpZiAodHBudC0+aGVhZGVyX2NhY2hlICE9IE5VTEwpIHZmcmVlKHRwbnQtPmhlYWRlcl9jYWNoZSk7CisJCQlpZiAodHBudC0+YnVmZmVyKSB7CisJCQkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOworCQkJCWtmcmVlKHRwbnQtPmJ1ZmZlcik7CisJCQl9CisJCQlrZnJlZSh0cG50KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXdyaXRlX3VubG9jaygmb3Nfc2NzaV90YXBlc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9vc3N0KHZvaWQpIAoreworCXByaW50ayhLRVJOX0lORk8gIm9zc3QgOkk6IFRhcGUgZHJpdmVyIHdpdGggT25TdHJlYW0gc3VwcG9ydCB2ZXJzaW9uICVzXG5vc3N0IDpJOiAlc1xuIiwgb3NzdF92ZXJzaW9uLCBjdnNpZCk7CisKKwl2YWxpZGF0ZV9vcHRpb25zKCk7CisJb3NzdF9zeXNmc19pbml0KCk7CisKKwlpZiAoKHJlZ2lzdGVyX2NocmRldihPU1NUX01BSk9SLCJvc3N0IiwgJm9zc3RfZm9wcykgPCAwKSB8fCBzY3NpX3JlZ2lzdGVyX2RyaXZlcigmb3NzdF90ZW1wbGF0ZS5nZW5kcnYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3NzdCA6RTogVW5hYmxlIHRvIHJlZ2lzdGVyIG1ham9yICVkIGZvciBPblN0cmVhbSB0YXBlc1xuIiwgT1NTVF9NQUpPUik7CisJCW9zc3Rfc3lzZnNfY2xlYW51cCgpOworCQlyZXR1cm4gMTsKKwl9CisJb3NzdF9jcmVhdGVfZHJpdmVyZnNfZmlsZXMoJm9zc3RfdGVtcGxhdGUuZ2VuZHJ2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9vc3N0ICh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBvc3N0X3RhcGUgKiBTVHA7CisKKwlvc3N0X3JlbW92ZV9kcml2ZXJmc19maWxlcygmb3NzdF90ZW1wbGF0ZS5nZW5kcnYpOworCXNjc2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm9zc3RfdGVtcGxhdGUuZ2VuZHJ2KTsKKwl1bnJlZ2lzdGVyX2NocmRldihPU1NUX01BSk9SLCAib3NzdCIpOworCW9zc3Rfc3lzZnNfY2xlYW51cCgpOworCisJaWYgKG9zX3Njc2lfdGFwZXMpIHsKKwkJZm9yIChpPTA7IGkgPCBvc3N0X21heF9kZXY7ICsraSkgeworCQkJaWYgKCEoU1RwID0gb3Nfc2NzaV90YXBlc1tpXSkpIGNvbnRpbnVlOworCQkJLyogVGhpcyBpcyBkZWZlbnNpdmUsIHN1cHBvc2VkIHRvIGhhcHBlbiBkdXJpbmcgZGV0YWNoICovCisJCQlpZiAoU1RwLT5oZWFkZXJfY2FjaGUpCisJCQkJdmZyZWUoU1RwLT5oZWFkZXJfY2FjaGUpOworCQkJaWYgKFNUcC0+YnVmZmVyKSB7CisJCQkJbm9ybWFsaXplX2J1ZmZlcihTVHAtPmJ1ZmZlcik7CisJCQkJa2ZyZWUoU1RwLT5idWZmZXIpOworCQkJfQorCQkJcHV0X2Rpc2soU1RwLT5kcml2ZSk7CisJCQlrZnJlZShTVHApOworCQl9CisJCWtmcmVlKG9zX3Njc2lfdGFwZXMpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJvc3N0IDpJOiBVbmxvYWRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChpbml0X29zc3QpOworbW9kdWxlX2V4aXQoZXhpdF9vc3N0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9vc3N0LmggYi9kcml2ZXJzL3Njc2kvb3NzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MmUxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5oCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICoJJEhlYWRlcjogL2N2c3Jvb3Qvb3NzdC9Ecml2ZXIvb3NzdC5oLHYgMS4xNiAyMDA1LzAxLzAxIDIxOjEzOjM1IHdyaWVkZSBFeHAgJAorICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCisvKglGSVhNRSAtIHJlbmFtZSBhbmQgdXNlIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIG9yIGRlbGV0ZSB0aGVtIQorICogICAgICAgICAgICAgIGFuZCB0aGUgdHlwZXMgcmVhbGx5IHNob3VsZCBnbyB0byBzdC5oIGFueXdheS4uLgorICoJSU5RVUlSWSBwYWNrZXQgY29tbWFuZCAtIERhdGEgRm9ybWF0IChGcm9tIFRhYmxlIDYtOCBvZiBRSUMtMTU3QykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCWRldmljZV90eXBlCTo1OwkvKiBQZXJpcGhlcmFsIERldmljZSBUeXBlICovCisJdW5zaWduZWQJcmVzZXJ2ZWQwXzc2NQk6MzsJLyogUGVyaXBoZXJhbCBRdWFsaWZpZXIgLSBSZXNlcnZlZCAqLworCXVuc2lnbmVkCXJlc2VydmVkMV82dDAJOjc7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJcm1iCQk6MTsJLyogUmVtb3ZhYmxlIE1lZGl1bSBCaXQgKi8KKwl1bnNpZ25lZAlhbnNpX3ZlcnNpb24JOjM7CS8qIEFOU0kgVmVyc2lvbiAqLworCXVuc2lnbmVkCWVjbWFfdmVyc2lvbgk6MzsJLyogRUNNQSBWZXJzaW9uICovCisJdW5zaWduZWQJaXNvX3ZlcnNpb24JOjI7CS8qIElTTyBWZXJzaW9uICovCisJdW5zaWduZWQJcmVzcG9uc2VfZm9ybWF0IDo0OwkvKiBSZXNwb25zZSBEYXRhIEZvcm1hdCAqLworCXVuc2lnbmVkCXJlc2VydmVkM180NQk6MjsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNgk6MTsJLyogVHJtSU9QIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlyZXNlcnZlZDNfNwk6MTsJLyogQUVOQyAtIFJlc2VydmVkICovCisJdTgJCWFkZGl0aW9uYWxfbGVuZ3RoOwkvKiBBZGRpdGlvbmFsIExlbmd0aCAodG90YWxfbGVuZ3RoLTQpICovCisJdTgJCXJzdjUsIHJzdjYsIHJzdjc7CS8qIFJlc2VydmVkICovCisJdTgJCXZlbmRvcl9pZFs4XTsJCS8qIFZlbmRvciBJZGVudGlmaWNhdGlvbiAqLworCXU4CQlwcm9kdWN0X2lkWzE2XTsJCS8qIFByb2R1Y3QgSWRlbnRpZmljYXRpb24gKi8KKwl1OAkJcmV2aXNpb25fbGV2ZWxbNF07CS8qIFJldmlzaW9uIExldmVsICovCisJdTgJCXZlbmRvcl9zcGVjaWZpY1syMF07CS8qIFZlbmRvciBTcGVjaWZpYyAtIE9wdGlvbmFsICovCisJdTgJCXJlc2VydmVkNTZ0OTVbNDBdOwkvKiBSZXNlcnZlZCAtIE9wdGlvbmFsICovCisJCQkJCQkvKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG1heSBiZSByZXR1cm5lZCAqLworfSBpZGV0YXBlX2lucXVpcnlfcmVzdWx0X3Q7CisKKy8qCisgKglSRUFEIFBPU0lUSU9OIHBhY2tldCBjb21tYW5kIC0gRGF0YSBGb3JtYXQgKEZyb20gVGFibGUgNi01NykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCXJlc2VydmVkMF8xMAk6MjsJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlicHUJCToxOwkvKiBCbG9jayBQb3NpdGlvbiBVbmtub3duICovCQorCXVuc2lnbmVkCXJlc2VydmVkMF81NDMJOjM7CS8qIFJlc2VydmVkICovCisJdW5zaWduZWQJZW9wCQk6MTsJLyogRW5kIE9mIFBhcnRpdGlvbiAqLworCXVuc2lnbmVkCWJvcAkJOjE7CS8qIEJlZ2lubmluZyBPZiBQYXJ0aXRpb24gKi8KKwl1OAkJcGFydGl0aW9uOwkJLyogUGFydGl0aW9uIE51bWJlciAqLworCXU4CQlyZXNlcnZlZDIsIHJlc2VydmVkMzsJLyogUmVzZXJ2ZWQgKi8KKwl1MzIJCWZpcnN0X2Jsb2NrOwkJLyogRmlyc3QgQmxvY2sgTG9jYXRpb24gKi8KKwl1MzIJCWxhc3RfYmxvY2s7CQkvKiBMYXN0IEJsb2NrIExvY2F0aW9uIChPcHRpb25hbCkgKi8KKwl1OAkJcmVzZXJ2ZWQxMjsJCS8qIFJlc2VydmVkICovCisJdTgJCWJsb2Nrc19pbl9idWZmZXJbM107CS8qIEJsb2NrcyBJbiBCdWZmZXIgLSAoT3B0aW9uYWwpICovCisJdTMyCQlieXRlc19pbl9idWZmZXI7CS8qIEJ5dGVzIEluIEJ1ZmZlciAoT3B0aW9uYWwpICovCit9IGlkZXRhcGVfcmVhZF9wb3NpdGlvbl9yZXN1bHRfdDsKKworLyoKKyAqICAgICAgRm9sbG93cyBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBTRUxFQ1QgU0VOU0UgLyBNT0RFIFNFTlNFCisgKiAgICAgIHBhY2tldCBjb21tYW5kcy4gCisgKi8KKyNkZWZpbmUgQ09NUFJFU1NJT05fUEFHRSAgICAgICAgICAgMHgwZgorI2RlZmluZSBDT01QUkVTU0lPTl9QQUdFX0xFTkdUSCAgICAxNgorCisjZGVmaW5lIENBUEFCSUxJVElFU19QQUdFICAgICAgICAgIDB4MmEKKyNkZWZpbmUgQ0FQQUJJTElUSUVTX1BBR0VfTEVOR1RIICAgMjAKKworI2RlZmluZSBUQVBFX1BBUkFNVFJfUEFHRSAgICAgICAgICAweDJiCisjZGVmaW5lIFRBUEVfUEFSQU1UUl9QQUdFX0xFTkdUSCAgIDE2CisKKyNkZWZpbmUgTlVNQkVSX1JFVFJJRVNfUEFHRSAgICAgICAgMHgyZgorI2RlZmluZSBOVU1CRVJfUkVUUklFU19QQUdFX0xFTkdUSCA0CisKKyNkZWZpbmUgQkxPQ0tfU0laRV9QQUdFICAgICAgICAgICAgMHgzMAorI2RlZmluZSBCTE9DS19TSVpFX1BBR0VfTEVOR1RIICAgICA0CisKKyNkZWZpbmUgQlVGRkVSX0ZJTExJTkdfUEFHRSAgICAgICAgMHgzMworI2RlZmluZSBCVUZGRVJfRklMTElOR19QQUdFX0xFTkdUSCA0CisKKyNkZWZpbmUgVkVORE9SX0lERU5UX1BBR0UgICAgICAgICAgMHgzNgorI2RlZmluZSBWRU5ET1JfSURFTlRfUEFHRV9MRU5HVEggICA4CisKKyNkZWZpbmUgTE9DQVRFX1NUQVRVU19QQUdFICAgICAgICAgMHgzNworI2RlZmluZSBMT0NBVEVfU1RBVFVTX1BBR0VfTEVOR1RIICAwCisKKyNkZWZpbmUgTU9ERV9IRUFERVJfTEVOR1RIICAgICAgICAgNAorCisKKy8qCisgKglSRVFVRVNUIFNFTlNFIHBhY2tldCBjb21tYW5kIHJlc3VsdCAtIERhdGEgRm9ybWF0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQJZXJyb3JfY29kZQk6NzsJLyogQ3VycmVudCBvZiBkZWZlcnJlZCBlcnJvcnMgKi8KKwl1bnNpZ25lZAl2YWxpZAkJOjE7CS8qIFRoZSBpbmZvcm1hdGlvbiBmaWVsZCBjb25mb3JtcyB0byBRSUMtMTU3QyAqLworCXU4CQlyZXNlcnZlZDEJOjg7CS8qIFNlZ21lbnQgTnVtYmVyIC0gUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZAlzZW5zZV9rZXkJOjQ7CS8qIFNlbnNlIEtleSAqLworCXVuc2lnbmVkCXJlc2VydmVkMl80CToxOwkvKiBSZXNlcnZlZCAqLworCXVuc2lnbmVkCWlsaQkJOjE7CS8qIEluY29ycmVjdCBMZW5ndGggSW5kaWNhdG9yICovCisJdW5zaWduZWQJZW9tCQk6MTsJLyogRW5kIE9mIE1lZGl1bSAqLworCXVuc2lnbmVkCWZpbGVtYXJrIAk6MTsJLyogRmlsZW1hcmsgKi8KKwl1MzIJCWluZm9ybWF0aW9uIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1OAkJYXNsOwkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoIChuLTcpICovCisJdTMyCQljb21tYW5kX3NwZWNpZmljOwkvKiBBZGRpdGlvbmFsIGNvbW1hbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwl1OAkJYXNjOwkJCS8qIEFkZGl0aW9uYWwgU2Vuc2UgQ29kZSAqLworCXU4CQlhc2NxOwkJCS8qIEFkZGl0aW9uYWwgU2Vuc2UgQ29kZSBRdWFsaWZpZXIgKi8KKwl1OAkJcmVwbGFjZWFibGVfdW5pdF9jb2RlOwkvKiBGaWVsZCBSZXBsYWNlYWJsZSBVbml0IENvZGUgKi8KKwl1bnNpZ25lZAlza19zcGVjaWZpYzEgCTo3OwkvKiBTZW5zZSBLZXkgU3BlY2lmaWMgKi8KKwl1bnNpZ25lZAlza3N2CQk6MTsJLyogU2Vuc2UgS2V5IFNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHZhbGlkICovCisJdTgJCXNrX3NwZWNpZmljMjsJCS8qIFNlbnNlIEtleSBTcGVjaWZpYyAqLworCXU4CQlza19zcGVjaWZpYzM7CQkvKiBTZW5zZSBLZXkgU3BlY2lmaWMgKi8KKwl1OAkJcGFkWzJdOwkJCS8qIFBhZGRpbmcgdG8gMjAgYnl0ZXMgKi8KK30gaWRldGFwZV9yZXF1ZXN0X3NlbnNlX3Jlc3VsdF90OworCisvKgorICogICAgICBNb2RlIFBhcmFtZXRlciBIZWFkZXIgZm9yIHRoZSBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgdTggICAgICAgICAgICAgIG1vZGVfZGF0YV9sZW5ndGg7ICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGRhdGEgdHJhbnNmZXIgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIG1lZGl1bV90eXBlOyAgICAgICAgICAgIC8qIE1lZGl1bSBUeXBlICovCisgICAgICAgIHU4ICAgICAgICAgICAgICBkc3A7ICAgICAgICAgICAgICAgICAgICAvKiBEZXZpY2UgU3BlY2lmaWMgUGFyYW1ldGVyICovCisgICAgICAgIHU4ICAgICAgICAgICAgICBiZGw7ICAgICAgICAgICAgICAgICAgICAvKiBCbG9jayBEZXNjcmlwdG9yIExlbmd0aCAqLworfSBvc3N0X21vZGVfcGFyYW1ldGVyX2hlYWRlcl90OworCisvKgorICogICAgICBNb2RlIFBhcmFtZXRlciBCbG9jayBEZXNjcmlwdG9yIHRoZSBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kCisgKgorICogICAgICBTdXBwb3J0IGZvciBibG9jayBkZXNjcmlwdG9ycyBpcyBvcHRpb25hbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1OCAgICAgICAgICAgICAgZGVuc2l0eV9jb2RlOyAgICAgICAgICAgLyogTWVkaXVtIGRlbnNpdHkgY29kZSAqLworICAgICAgICB1OCAgICAgICAgICAgICAgYmxvY2tzWzNdOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIGxlbmd0aFszXTsgICAgICAgICAgICAgIC8qIEJsb2NrIExlbmd0aCAqLworfSBvc3N0X3BhcmFtZXRlcl9ibG9ja19kZXNjcmlwdG9yX3Q7CisKKy8qCisgKiAgICAgIFRoZSBEYXRhIENvbXByZXNzaW9uIFBhZ2UsIGFzIHJldHVybmVkIGJ5IHRoZSBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBzICAgICAgICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMCAgICAgICA6MTsgICAgIC8qIFJlc2VydmVkICovCisJdW5zaWduZWQgICAgICAgIHBhZ2VfY29kZSAgICAgICA6NjsgICAgIC8qIFBhZ2UgQ29kZSAtIFNob3VsZCBiZSAweGYgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIENvZGUgLSBTaG91bGQgYmUgMHhmICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDAgICAgICAgOjE7ICAgICAvKiBSZXNlcnZlZCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHMgICAgICAgICAgICAgIDoxOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorICAgICAgICB1OCAgICAgICAgICAgICAgcGFnZV9sZW5ndGg7ICAgICAgICAgICAgLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgMTQgKi8KKyNpZiAgIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICB1bnNpZ25lZCAgICAgICAgZGNlICAgICAgICAgICAgIDoxOyAgICAgLyogRGF0YSBDb21wcmVzc2lvbiBFbmFibGUgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGRjYyAgICAgICAgICAgICA6MTsgICAgIC8qIERhdGEgQ29tcHJlc3Npb24gQ2FwYWJsZSAqLworCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDIgICAgICAgOjY7ICAgICAvKiBSZXNlcnZlZCAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkMiAgICAgICA6NjsgICAgIC8qIFJlc2VydmVkICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBkY2MgICAgICAgICAgICAgOjE7ICAgICAvKiBEYXRhIENvbXByZXNzaW9uIENhcGFibGUgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGRjZSAgICAgICAgICAgICA6MTsgICAgIC8qIERhdGEgQ29tcHJlc3Npb24gRW5hYmxlICovCisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGRkZSAgICAgICAgICAgICA6MTsgICAgIC8qIERhdGEgRGVjb21wcmVzc2lvbiBFbmFibGUgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlZCAgICAgICAgICAgICA6MjsgICAgIC8qIFJlcG9ydCBFeGNlcHRpb24gb24gRGVjb21wcmVzc2lvbiAqLworCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDMgICAgICAgOjU7ICAgICAvKiBSZXNlcnZlZCAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkMyAgICAgICA6NTsgICAgIC8qIFJlc2VydmVkICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZWQgICAgICAgICAgICAgOjI7ICAgICAvKiBSZXBvcnQgRXhjZXB0aW9uIG9uIERlY29tcHJlc3Npb24gKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGRkZSAgICAgICAgICAgICA6MTsgICAgIC8qIERhdGEgRGVjb21wcmVzc2lvbiBFbmFibGUgKi8KKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKyAgICAgICAgdTMyICAgICAgICAgICAgIGNhOyAgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzaW9uIEFsZ29yaXRobSAqLworICAgICAgICB1MzIgICAgICAgICAgICAgZGE7ICAgICAgICAgICAgICAgICAgICAgLyogRGVjb21wcmVzc2lvbiBBbGdvcml0aG0gKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIHJlc2VydmVkWzRdOyAgICAgICAgICAgIC8qIFJlc2VydmVkICovCit9IG9zc3RfZGF0YV9jb21wcmVzc2lvbl9wYWdlX3Q7CisKKy8qCisgKiAgICAgIFRoZSBNZWRpdW0gUGFydGl0aW9uIFBhZ2UsIGFzIHJldHVybmVkIGJ5IHRoZSBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBzICAgICAgICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMV82ICAgICA6MTsgICAgIC8qIFJlc2VydmVkICovCisJdW5zaWduZWQgICAgICAgIHBhZ2VfY29kZSAgICAgICA6NjsgICAgIC8qIFBhZ2UgQ29kZSAtIFNob3VsZCBiZSAweDExICovCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCAgICAgICAgcGFnZV9jb2RlICAgICAgIDo2OyAgICAgLyogUGFnZSBDb2RlIC0gU2hvdWxkIGJlIDB4MTEgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMV82ICAgICA6MTsgICAgIC8qIFJlc2VydmVkICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBwcyAgICAgICAgICAgICAgOjE7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisgICAgICAgIHU4ICAgICAgICAgICAgICBwYWdlX2xlbmd0aDsgICAgICAgICAgICAvKiBQYWdlIExlbmd0aCAtIFNob3VsZCBiZSA2ICovCisgICAgICAgIHU4ICAgICAgICAgICAgICBtYXA7ICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIEFkZGl0aW9uYWwgUGFydGl0aW9ucyAtIFNob3VsZCBiZSAwICovCisgICAgICAgIHU4ICAgICAgICAgICAgICBhcGQ7ICAgICAgICAgICAgICAgICAgICAvKiBBZGRpdGlvbmFsIFBhcnRpdGlvbnMgRGVmaW5lZCAtIFNob3VsZCBiZSAwICovCisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGZkcCAgICAgICAgICAgICA6MTsgICAgIC8qIEZpeGVkIERhdGEgUGFydGl0aW9ucyAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgc2RwICAgICAgICAgICAgIDoxOyAgICAgLyogU2hvdWxkIGJlIDAgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGlkcCAgICAgICAgICAgICA6MTsgICAgIC8qIFNob3VsZCBiZSAwICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBwc3VtICAgICAgICAgICAgOjI7ICAgICAvKiBTaG91bGQgYmUgMCAqLworCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDRfMDEyICAgOjM7ICAgICAvKiBSZXNlcnZlZCAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkNF8wMTIgICA6MzsgICAgIC8qIFJlc2VydmVkICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBwc3VtICAgICAgICAgICAgOjI7ICAgICAvKiBTaG91bGQgYmUgMCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgaWRwICAgICAgICAgICAgIDoxOyAgICAgLyogU2hvdWxkIGJlIDAgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHNkcCAgICAgICAgICAgICA6MTsgICAgIC8qIFNob3VsZCBiZSAwICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBmZHAgICAgICAgICAgICAgOjE7ICAgICAvKiBGaXhlZCBEYXRhIFBhcnRpdGlvbnMgKi8KKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKyAgICAgICAgdTggICAgICAgICAgICAgIG1mcjsgICAgICAgICAgICAgICAgICAgIC8qIE1lZGl1bSBGb3JtYXQgUmVjb2duaXRpb24gKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgIC8qIFJlc2VydmVkICovCit9IG9zc3RfbWVkaXVtX3BhcnRpdGlvbl9wYWdlX3Q7CisKKy8qCisgKiAgICAgIENhcGFiaWxpdGllcyBhbmQgTWVjaGFuaWNhbCBTdGF0dXMgUGFnZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMV82NyAgICA6MjsKKwl1bnNpZ25lZCAgICAgICAgcGFnZV9jb2RlICAgICAgIDo2OyAgICAgLyogUGFnZSBjb2RlIC0gU2hvdWxkIGJlIDB4MmEgKi8KKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgyYSAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQxXzY3ICAgIDoyOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorICAgICAgICB1OCAgICAgICAgICAgICAgcGFnZV9sZW5ndGg7ICAgICAgICAgICAgLyogUGFnZSBMZW5ndGggLSBTaG91bGQgYmUgMHgxMiAqLworICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQyLCByZXNlcnZlZDM7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkNF82NyAgICA6MjsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHNwcmV2ICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIFNQQUNFIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbiAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ0XzEyMzQgIDo0OworCXVuc2lnbmVkICAgICAgICBybyAgICAgICAgICAgICAgOjE7ICAgICAvKiBSZWFkIE9ubHkgTW9kZSAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHJvICAgICAgICAgICAgICA6MTsgICAgIC8qIFJlYWQgT25seSBNb2RlICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDRfMTIzNCAgOjQ7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBzcHJldiAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBTUEFDRSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkNF82NyAgICA6MjsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKyNpZiAgIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ1XzY3ICAgIDoyOworICAgICAgICB1bnNpZ25lZCAgICAgICAgcWZhICAgICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgdGhlIFFGQSB0d28gcGFydGl0aW9uIGZvcm1hdHMgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkNV80ICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGVmbXQgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIEVSQVNFIGNvbW1hbmQgaW5pdGlhdGVkIGZvcm1hdHRpbmcgKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ1XzAxMiAgIDozOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHJlc2VydmVkNV8wMTIgICA6MzsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGVmbXQgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIEVSQVNFIGNvbW1hbmQgaW5pdGlhdGVkIGZvcm1hdHRpbmcgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkNV80ICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHFmYSAgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIHRoZSBRRkEgdHdvIHBhcnRpdGlvbiBmb3JtYXRzICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDVfNjcgICAgOjI7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGNtcHJzICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIGRhdGEgY29tcHJlc3Npb24gKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGVjYyAgICAgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIGVycm9yIGNvcnJlY3Rpb24gKi8KKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ2XzQ1ICAgIDoyOyAgICAgLyogUmVzZXJ2ZWQgKi8gIAorICAgICAgICB1bnNpZ25lZCAgICAgICAgZWplY3QgICAgICAgICAgIDoxOyAgICAgLyogVGhlIGRldmljZSBjYW4gZWplY3QgdGhlIHZvbHVtZSAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHJldmVudCAgICAgICAgIDoxOyAgICAgLyogVGhlIGRldmljZSBkZWZhdWx0cyBpbiB0aGUgcHJldmVudCBzdGF0ZSBhZnRlciBwb3dlciB1cCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgbG9ja2VkICAgICAgICAgIDoxOyAgICAgLyogVGhlIHZvbHVtZSBpcyBsb2NrZWQgKi8KKwl1bnNpZ25lZCAgICAgICAgbG9jayAgICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgbG9ja2luZyB0aGUgdm9sdW1lICovCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCAgICAgICAgbG9jayAgICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgbG9ja2luZyB0aGUgdm9sdW1lICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBsb2NrZWQgICAgICAgICAgOjE7ICAgICAvKiBUaGUgdm9sdW1lIGlzIGxvY2tlZCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcHJldmVudCAgICAgICAgIDoxOyAgICAgLyogVGhlIGRldmljZSBkZWZhdWx0cyBpbiB0aGUgcHJldmVudCBzdGF0ZSBhZnRlciBwb3dlciB1cCAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgZWplY3QgICAgICAgICAgIDoxOyAgICAgLyogVGhlIGRldmljZSBjYW4gZWplY3QgdGhlIHZvbHVtZSAqLworCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDZfNDUgICAgOjI7ICAgICAvKiBSZXNlcnZlZCAqLyAgCisgICAgICAgIHVuc2lnbmVkICAgICAgICBlY2MgICAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBlcnJvciBjb3JyZWN0aW9uICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBjbXBycyAgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyBkYXRhIGNvbXByZXNzaW9uICovCisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIGJsazMyNzY4ICAgICAgICA6MTsgICAgIC8qIHNsb3diIC0gdGhlIGRldmljZSByZXN0cmljdHMgdGhlIGJ5dGUgY291bnQgZm9yIFBJTyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNmZXJzIGZvciBzbG93IGJ1ZmZlciBtZW1vcnkgPz8/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHNvIDMyNzY4IGJsb2NrIHNpemUgaW4gc29tZSBjYXNlcyAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ3XzNfNiAgIDo0OworICAgICAgICB1bnNpZ25lZCAgICAgICAgYmxrMTAyNCAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgMTAyNCBieXRlcyBibG9jayBzaXplICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICBibGs1MTIgICAgICAgICAgOjE7ICAgICAvKiBTdXBwb3J0cyA1MTIgYnl0ZXMgYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkICAgICAgICByZXNlcnZlZDdfMCAgICAgOjE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ3XzAgICAgIDoxOworICAgICAgICB1bnNpZ25lZCAgICAgICAgYmxrNTEyICAgICAgICAgIDoxOyAgICAgLyogU3VwcG9ydHMgNTEyIGJ5dGVzIGJsb2NrIHNpemUgKi8KKyAgICAgICAgdW5zaWduZWQgICAgICAgIGJsazEwMjQgICAgICAgICA6MTsgICAgIC8qIFN1cHBvcnRzIDEwMjQgYnl0ZXMgYmxvY2sgc2l6ZSAqLworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQ3XzNfNiAgIDo0OworICAgICAgICB1bnNpZ25lZCAgICAgICAgYmxrMzI3NjggICAgICAgIDoxOyAgICAgLyogc2xvd2IgLSB0aGUgZGV2aWNlIHJlc3RyaWN0cyB0aGUgYnl0ZSBjb3VudCBmb3IgUElPICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc2ZlcnMgZm9yIHNsb3cgYnVmZmVyIG1lbW9yeSA/Pz8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsc28gMzI3NjggYmxvY2sgc2l6ZSBpbiBzb21lIGNhc2VzICovCisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisgICAgICAgIHUxNiAgICAgICAgICAgICBtYXhfc3BlZWQ7ICAgICAgICAgICAgICAvKiBNYXhpbXVtIHNwZWVkIHN1cHBvcnRlZCBpbiBLQnBzICovCisgICAgICAgIHU4ICAgICAgICAgICAgICByZXNlcnZlZDEwLCByZXNlcnZlZDExOworICAgICAgICB1MTYgICAgICAgICAgICAgY3RsOyAgICAgICAgICAgICAgICAgICAgLyogQ29udGludW91cyBUcmFuc2ZlciBMaW1pdCBpbiBibG9ja3MgKi8KKyAgICAgICAgdTE2ICAgICAgICAgICAgIHNwZWVkOyAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgU3BlZWQsIGluIEtCcHMgKi8KKyAgICAgICAgdTE2ICAgICAgICAgICAgIGJ1ZmZlcl9zaXplOyAgICAgICAgICAgIC8qIEJ1ZmZlciBTaXplLCBpbiA1MTIgYnl0ZXMgKi8KKyAgICAgICAgdTggICAgICAgICAgICAgIHJlc2VydmVkMTgsIHJlc2VydmVkMTk7Cit9IG9zc3RfY2FwYWJpbGl0aWVzX3BhZ2VfdDsKKworLyoKKyAqICAgICAgQmxvY2sgU2l6ZSBQYWdlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyNpZiAgIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICB1bnNpZ25lZCAgICAgICAgcHMgICAgICAgICAgICAgIDoxOworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQxXzYgICAgIDoxOworCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgzMCAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHBhZ2VfY29kZSAgICAgICA6NjsgICAgIC8qIFBhZ2UgY29kZSAtIFNob3VsZCBiZSAweDMwICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDFfNiAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBwcyAgICAgICAgICAgICAgOjE7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisgICAgICAgIHU4ICAgICAgICAgICAgICBwYWdlX2xlbmd0aDsgICAgICAgICAgICAvKiBQYWdlIExlbmd0aCAtIFNob3VsZCBiZSAyICovCisgICAgICAgIHU4ICAgICAgICAgICAgICByZXNlcnZlZDI7CisjaWYgICBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgdW5zaWduZWQgICAgICAgIG9uZSAgICAgICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMl82ICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlY29yZDMyXzUgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlY29yZDMyICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMl8yMyAgICA6MjsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBsYXkzMl81ICAgICAgICA6MTsKKwl1bnNpZ25lZCAgICAgICAgcGxheTMyICAgICAgICAgIDoxOworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHBsYXkzMiAgICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHBsYXkzMl81ICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMl8yMyAgICA6MjsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlY29yZDMyICAgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlY29yZDMyXzUgICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIHJlc2VydmVkMl82ICAgICA6MTsKKyAgICAgICAgdW5zaWduZWQgICAgICAgIG9uZSAgICAgICAgICAgICA6MTsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKK30gb3NzdF9ibG9ja19zaXplX3BhZ2VfdDsKKworLyoKKyAqCVRhcGUgUGFyYW1ldGVycyBQYWdlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyNpZiAgIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICB1bnNpZ25lZCAgICAgICAgcHMgICAgICAgICAgICAgIDoxOworICAgICAgICB1bnNpZ25lZCAgICAgICAgcmVzZXJ2ZWQxXzYgICAgIDoxOworCXVuc2lnbmVkICAgICAgICBwYWdlX2NvZGUgICAgICAgOjY7ICAgICAvKiBQYWdlIGNvZGUgLSBTaG91bGQgYmUgMHgyYiAqLworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgICAgICAgIHBhZ2VfY29kZSAgICAgICA6NjsgICAgIC8qIFBhZ2UgY29kZSAtIFNob3VsZCBiZSAweDJiICovCisgICAgICAgIHVuc2lnbmVkICAgICAgICByZXNlcnZlZDFfNiAgICAgOjE7CisgICAgICAgIHVuc2lnbmVkICAgICAgICBwcyAgICAgICAgICAgICAgOjE7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJdTgJCXJlc2VydmVkMjsKKwl1OAkJZGVuc2l0eTsKKwl1OAkJcmVzZXJ2ZWQzLHJlc2VydmVkNDsKKwl1MTYJCXNlZ3RyazsKKwl1MTYJCXRya3M7CisJdTgJCXJlc2VydmVkNSxyZXNlcnZlZDYscmVzZXJ2ZWQ3LHJlc2VydmVkOCxyZXNlcnZlZDkscmVzZXJ2ZWQxMDsKK30gb3NzdF90YXBlX3BhcmFtdHJfcGFnZV90OworCisvKiBPblN0cmVhbSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIE9TX0NPTkZJR19QQVJUSVRJT04gICAgICgweGZmKQorI2RlZmluZSBPU19EQVRBX1BBUlRJVElPTiAgICAgICAoMCkKKyNkZWZpbmUgT1NfUEFSVElUSU9OX1ZFUlNJT04gICAgKDEpCisKKy8qCisgKiBwYXJ0aXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3NfcGFydGl0aW9uX3MgeworICAgICAgICBfX3U4ICAgIHBhcnRpdGlvbl9udW07CisgICAgICAgIF9fdTggICAgcGFyX2Rlc2NfdmVyOworICAgICAgICBfX3UxNiAgIHdydF9wYXNzX2NudHI7CisgICAgICAgIF9fdTMyICAgZmlyc3RfZnJhbWVfcHBvczsKKyAgICAgICAgX191MzIgICBsYXN0X2ZyYW1lX3Bwb3M7CisgICAgICAgIF9fdTMyICAgZW9kX2ZyYW1lX3Bwb3M7Cit9IG9zX3BhcnRpdGlvbl90OworCisvKgorICogREFUIGVudHJ5CisgKi8KK3R5cGVkZWYgc3RydWN0IG9zX2RhdF9lbnRyeV9zIHsKKyAgICAgICAgX191MzIgICBibGtfc3o7CisgICAgICAgIF9fdTE2ICAgYmxrX2NudDsKKyAgICAgICAgX191OCAgICBmbGFnczsKKyAgICAgICAgX191OCAgICByZXNlcnZlZDsKK30gb3NfZGF0X2VudHJ5X3Q7CisKKy8qCisgKiBEQVQKKyAqLworI2RlZmluZSBPU19EQVRfRkxBR1NfREFUQSAgICAgICAoMHhjKQorI2RlZmluZSBPU19EQVRfRkxBR1NfTUFSSyAgICAgICAoMHgxKQorCit0eXBlZGVmIHN0cnVjdCBvc19kYXRfcyB7CisgICAgICAgIF9fdTggICAgICAgICAgICBkYXRfc3o7CisgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDE7CisgICAgICAgIF9fdTggICAgICAgICAgICBlbnRyeV9jbnQ7CisgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDM7CisgICAgICAgIG9zX2RhdF9lbnRyeV90ICBkYXRfbGlzdFsxNl07Cit9IG9zX2RhdF90OworCisvKgorICogRnJhbWUgdHlwZXMKKyAqLworI2RlZmluZSBPU19GUkFNRV9UWVBFX0ZJTEwgICAgICAoMCkKKyNkZWZpbmUgT1NfRlJBTUVfVFlQRV9FT0QgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgT1NfRlJBTUVfVFlQRV9NQVJLRVIgICAgKDEgPDwgMSkKKyNkZWZpbmUgT1NfRlJBTUVfVFlQRV9IRUFERVIgICAgKDEgPDwgMykKKyNkZWZpbmUgT1NfRlJBTUVfVFlQRV9EQVRBICAgICAgKDEgPDwgNykKKworLyoKKyAqIEFVWAorICovCit0eXBlZGVmIHN0cnVjdCBvc19hdXhfcyB7CisgICAgICAgIF9fdTMyICAgICAgICAgICBmb3JtYXRfaWQ7ICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBjb21wYWJpbGl0eSBBVVggaXMgYmFzZWQgb24gKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgIGFwcGxpY2F0aW9uX3NpZ1s0XTsgICAgIC8qIGRyaXZlciB1c2VkIHRvIHdyaXRlIHRoaXMgbWVkaWEgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIGhkd3I7ICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCisgICAgICAgIF9fdTMyICAgICAgICAgICB1cGRhdGVfZnJhbWVfY250cjsgICAgICAvKiBmb3IgY29uZmlndXJhdGlvbiBmcmFtZSAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgZnJhbWVfdHlwZTsKKyAgICAgICAgX191OCAgICAgICAgICAgIGZyYW1lX3R5cGVfcmVzZXJ2ZWQ7CisgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZF8xOF8xOVsyXTsKKyAgICAgICAgb3NfcGFydGl0aW9uX3QgIHBhcnRpdGlvbjsKKyAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkXzM2XzQzWzhdOworICAgICAgICBfX3UzMiAgICAgICAgICAgZnJhbWVfc2VxX251bTsKKyAgICAgICAgX191MzIgICAgICAgICAgIGxvZ2ljYWxfYmxrX251bV9oaWdoOworICAgICAgICBfX3UzMiAgICAgICAgICAgbG9naWNhbF9ibGtfbnVtOworICAgICAgICBvc19kYXRfdCAgICAgICAgZGF0OworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWQxODhfMTkxWzRdOworICAgICAgICBfX3UzMiAgICAgICAgICAgZmlsZW1hcmtfY250OworICAgICAgICBfX3UzMiAgICAgICAgICAgcGh5c19mbTsKKyAgICAgICAgX191MzIgICAgICAgICAgIGxhc3RfbWFya19wcG9zOworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWQyMDRfMjIzWzIwXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBfX3U4ICAgICAgICAgYXBwX3NwZWNpZmljWzMyXTsKKyAgICAgICAgICoKKyAgICAgICAgICogTGludXggc3BlY2lmaWMgZmllbGRzOgorICAgICAgICAgKi8KKyAgICAgICAgIF9fdTMyICAgICAgICAgIG5leHRfbWFya19wcG9zOyAgICAgICAgIC8qIHdoZW4ga25vd24sIHBvaW50cyB0byBuZXh0IG1hcmtlciAqLworCSBfX3UzMgkJbGFzdF9tYXJrX2xibjsJCS8qIHN0b3JpbmcgbG9nX2Jsa19udW0gb2YgbGFzdCBtYXJrIGlzIGV4dGVuZHMgQURSIHNwZWMgKi8KKyAgICAgICAgIF9fdTggICAgICAgICAgIGxpbnV4X3NwZWNpZmljWzI0XTsKKworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWRfMjU2XzUxMVsyNTZdOworfSBvc19hdXhfdDsKKworI2RlZmluZSBPU19GTV9UQUJfTUFYIDEwMjQKKwordHlwZWRlZiBzdHJ1Y3Qgb3NfZm1fdGFiX3MgeworCV9fdTgJCWZtX3BhcnRfbnVtOworCV9fdTgJCXJlc2VydmVkXzE7CisJX191OAkJZm1fdGFiX2VudF9zejsKKwlfX3U4CQlyZXNlcnZlZF8zOworCV9fdTE2CQlmbV90YWJfZW50X2NudDsKKwlfX3U4CQlyZXNlcnZlZDZfMTVbMTBdOworCV9fdTMyCQlmbV90YWJfZW50W09TX0ZNX1RBQl9NQVhdOworfSBvc19mbV90YWJfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NfZXh0X3Rya19leV9zIHsKKwlfX3U4CQlldF9wYXJ0X251bTsKKwlfX3U4CQlmbXQ7CisJX191MTYJCWZtX3RhYl9vZmY7CisJX191OAkJcmVzZXJ2ZWQ0XzdbNF07CisJX191MzIJCWxhc3RfaGxiX2hpOworCV9fdTMyCQlsYXN0X2hsYjsKKwlfX3UzMgkJbGFzdF9wcDsKKwlfX3U4CQlyZXNlcnZlZDIwXzMxWzEyXTsKK30gb3NfZXh0X3Rya19leV90OworCit0eXBlZGVmIHN0cnVjdCBvc19leHRfdHJrX3RiX3MgeworCV9fdTgJCW5yX3N0cmVhbV9wYXJ0OworCV9fdTgJCXJlc2VydmVkXzE7CisJX191OAkJZXRfZW50X3N6OworCV9fdTgJCXJlc2VydmVkM18xNVsxM107CisJb3NfZXh0X3Rya19leV90CWRhdF9leHRfdHJrX2V5OworCW9zX2V4dF90cmtfZXlfdAlxZmFfZXh0X3Rya19leTsKK30gb3NfZXh0X3Rya190Yl90OworCit0eXBlZGVmIHN0cnVjdCBvc19oZWFkZXJfcyB7CisgICAgICAgIGNoYXIgICAgICAgICAgICBpZGVudF9zdHJbOF07CisgICAgICAgIF9fdTggICAgICAgICAgICBtYWpvcl9yZXY7CisgICAgICAgIF9fdTggICAgICAgICAgICBtaW5vcl9yZXY7CisJX191MTYJCWV4dF90cmtfdGJfb2ZmOworICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWQxMl8xNVs0XTsKKyAgICAgICAgX191OCAgICAgICAgICAgIHB0X3Bhcl9udW07CisgICAgICAgIF9fdTggICAgICAgICAgICBwdF9yZXNlcnZlZDFfM1szXTsKKyAgICAgICAgb3NfcGFydGl0aW9uX3QgIHBhcnRpdGlvblsxNl07CisJX191MzIJCWNmZ19jb2xfd2lkdGg7CisJX191MzIJCWRhdF9jb2xfd2lkdGg7CisJX191MzIJCXFmYV9jb2xfd2lkdGg7CisJX191OAkJY2FydHJpZGdlWzE2XTsKKwlfX3U4CQlyZXNlcnZlZDMwNF81MTFbMjA4XTsKKwlfX3UzMgkJb2xkX2ZpbGVtYXJrX2xpc3RbMTY2ODAvNF07CQkvKiBpbiBBRFIgMS40IF9fdTggdHJhY2tfdGFibGVbMTY2ODBdICovCisJb3NfZXh0X3Rya190Yl90CWV4dF90cmFja190YjsKKwlfX3U4CQlyZXNlcnZlZDE3MjcyXzE3NzM1WzQ2NF07CisJb3NfZm1fdGFiX3QJZGF0X2ZtX3RhYjsKKwlvc19mbV90YWJfdAlxZmFfZm1fdGFiOworCV9fdTgJCXJlc2VydmVkMjU5NjBfMzI3NjdbNjgwOF07Cit9IG9zX2hlYWRlcl90OworCisKKy8qCisgKiBPblN0cmVhbSBBRFJMIGZyYW1lCisgKi8KKyNkZWZpbmUgT1NfRlJBTUVfU0laRSAgICgzMiAqIDEwMjQgKyA1MTIpCisjZGVmaW5lIE9TX0RBVEFfU0laRSAgICAoMzIgKiAxMDI0KQorI2RlZmluZSBPU19BVVhfU0laRSAgICAgKDUxMikKKy8vI2RlZmluZSBPU1NUX01BWF9TRyAgICAgIDIKKworLyogVGhlIE9uU3RyZWFtIHRhcGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCitzdHJ1Y3Qgb3NzdF9idWZmZXIgeworICB1bnNpZ25lZCBjaGFyIGluX3VzZTsKKyAgdW5zaWduZWQgY2hhciBkbWE7CS8qIERNQS1hYmxlIGJ1ZmZlciAqLworICBpbnQgYnVmZmVyX3NpemU7CisgIGludCBidWZmZXJfYmxvY2tzOworICBpbnQgYnVmZmVyX2J5dGVzOworICBpbnQgcmVhZF9wb2ludGVyOworICBpbnQgd3JpdGluZzsKKyAgaW50IG1pZGxldmVsX3Jlc3VsdDsKKyAgaW50IHN5c2NhbGxfcmVzdWx0OworICBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpsYXN0X1NScG50OworICB1bnNpZ25lZCBjaGFyICpiX2RhdGE7CisgIG9zX2F1eF90ICphdXg7ICAgICAgICAgICAgICAgLyogb25zdHJlYW0gQVVYIHN0cnVjdHVyZSBhdCBlbmQgb2YgZWFjaCBibG9jayAgICAgKi8KKyAgdW5zaWduZWQgc2hvcnQgdXNlX3NnOyAgICAgICAvKiB6ZXJvIG9yIG51bWJlciBvZiBzL2cgc2VnbWVudHMgZm9yIHRoaXMgYWRhcHRlciAqLworICB1bnNpZ25lZCBzaG9ydCBzZ19zZWdzOyAgICAgIC8qIG51bWJlciBvZiBzZWdtZW50cyBpbiBzL2cgbGlzdCAgICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIHNob3J0IG9yaWdfc2dfc2VnczsgLyogbnVtYmVyIG9mIHNlZ21lbnRzIGFsbG9jYXRlZCBhdCBmaXJzdCB0cnkgICAgICAgKi8KKyAgc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOyAgICAvKiBNVVNUIEJFIGxhc3QgaXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSA7CisKKy8qIFRoZSBPblN0cmVhbSB0YXBlIGRyaXZlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBvc3N0X3RhcGUgeworICBzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRyaXZlcjsKKyAgdW5zaWduZWQgY2FwYWNpdHk7CisgIHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOworICBzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7ICAgICAgIC8qIGZvciBzZXJpYWxpemF0aW9uICovCisgIHN0cnVjdCBjb21wbGV0aW9uIHdhaXQ7ICAgICAgLyogZm9yIFNDU0kgY29tbWFuZHMgKi8KKyAgc3RydWN0IG9zc3RfYnVmZmVyICogYnVmZmVyOworCisgIC8qIERyaXZlIGNoYXJhY3RlcmlzdGljcyAqLworICB1bnNpZ25lZCBjaGFyIG9taXRfYmxrbGltczsKKyAgdW5zaWduZWQgY2hhciBkb19hdXRvX2xvY2s7CisgIHVuc2lnbmVkIGNoYXIgY2FuX2JzcjsKKyAgdW5zaWduZWQgY2hhciBjYW5fcGFydGl0aW9uczsKKyAgdW5zaWduZWQgY2hhciB0d29fZm07CisgIHVuc2lnbmVkIGNoYXIgZmFzdF9tdGVvbTsKKyAgdW5zaWduZWQgY2hhciByZXN0cl9kbWE7CisgIHVuc2lnbmVkIGNoYXIgc2NzaTJfbG9naWNhbDsKKyAgdW5zaWduZWQgY2hhciBkZWZhdWx0X2RydmJ1ZmZlcjsgIC8qIDB4ZmYgPSBkb24ndCB0b3VjaCwgdmFsdWUgMyBiaXRzICovCisgIHVuc2lnbmVkIGNoYXIgcG9zX3Vua25vd247ICAgICAgICAvKiBhZnRlciByZXNldCBwb3NpdGlvbiB1bmtub3duICovCisgIGludCB3cml0ZV90aHJlc2hvbGQ7CisgIGludCB0aW1lb3V0OwkJCS8qIHRpbWVvdXQgZm9yIG5vcm1hbCBjb21tYW5kcyAqLworICBpbnQgbG9uZ190aW1lb3V0OwkJLyogdGltZW91dCBmb3IgY29tbWFuZHMga25vd24gdG8gdGFrZSBsb25nIHRpbWUqLworCisgIC8qIE1vZGUgY2hhcmFjdGVyaXN0aWNzICovCisgIHN0cnVjdCBzdF9tb2RlZGVmIG1vZGVzW1NUX05CUl9NT0RFU107CisgIGludCBjdXJyZW50X21vZGU7CisKKyAgLyogU3RhdHVzIHZhcmlhYmxlcyAqLworICBpbnQgcGFydGl0aW9uOworICBpbnQgbmV3X3BhcnRpdGlvbjsKKyAgaW50IG5icl9wYXJ0aXRpb25zOyAgICAvKiB6ZXJvIHVudGlsIHBhcnRpdGlvbiBzdXBwb3J0IGVuYWJsZWQgKi8KKyAgc3RydWN0IHN0X3BhcnRzdGF0IHBzW1NUX05CUl9QQVJUSVRJT05TXTsKKyAgdW5zaWduZWQgY2hhciBkaXJ0eTsKKyAgdW5zaWduZWQgY2hhciByZWFkeTsKKyAgdW5zaWduZWQgY2hhciB3cml0ZV9wcm90OworICB1bnNpZ25lZCBjaGFyIGRydl93cml0ZV9wcm90OworICB1bnNpZ25lZCBjaGFyIGluX3VzZTsKKyAgdW5zaWduZWQgY2hhciBibGtzaXplX2NoYW5nZWQ7CisgIHVuc2lnbmVkIGNoYXIgZGVuc2l0eV9jaGFuZ2VkOworICB1bnNpZ25lZCBjaGFyIGNvbXByZXNzaW9uX2NoYW5nZWQ7CisgIHVuc2lnbmVkIGNoYXIgZHJ2X2J1ZmZlcjsKKyAgdW5zaWduZWQgY2hhciBkZW5zaXR5OworICB1bnNpZ25lZCBjaGFyIGRvb3JfbG9ja2VkOworICB1bnNpZ25lZCBjaGFyIHJld19hdF9jbG9zZTsKKyAgdW5zaWduZWQgY2hhciBpbml0ZWQ7CisgIGludCBibG9ja19zaXplOworICBpbnQgbWluX2Jsb2NrOworICBpbnQgbWF4X2Jsb2NrOworICBpbnQgcmVjb3Zlcl9jb3VudDsgICAgICAgICAgICAvKiBmcm9tIHRhcGUgb3BlbmluZyAqLworICBpbnQgYWJvcnRfY291bnQ7CisgIGludCB3cml0ZV9jb3VudDsKKyAgaW50IHJlYWRfY291bnQ7CisgIGludCByZWNvdmVyX2VycmVnOyAgICAgICAgICAgIC8qIGZyb20gbGFzdCBzdGF0dXMgY2FsbCAqLworICAvKgorICAgKiBPblN0cmVhbSBzcGVjaWZpYyBkYXRhCisgICAqLworICBpbnQJICAgb3NfZndfcmV2OwkJCSAgICAgICAvKiB0aGUgZmlybXdhcmUgcmV2aXNpb24gKiAxMDAwMCAqLworICB1bnNpZ25lZCBjaGFyICByYXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnIE9uU3RyZWFtIHJhdyBhY2Nlc3MgKDMyLjVLQiBibG9jayBzaXplKSAqLworICB1bnNpZ25lZCBjaGFyICBwb2xsOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnIHRoYXQgdGhpcyBkcml2ZSBuZWVkcyBwb2xsaW5nIChJREV8ZmlybXdhcmUpICovCisgIHVuc2lnbmVkIGNoYXIgIGZyYW1lX2luX2J1ZmZlcjsJICAgICAgIC8qIGZsYWcgdGhhdCB0aGUgZnJhbWUgYXMgcGVyIGZyYW1lX3NlcV9udW1iZXIKKwkJCQkJCSogaGFzIGJlZW4gcmVhZCBpbnRvIFNUcC0+YnVmZmVyIGFuZCBpcyB2YWxpZCAqLworICBpbnQgICAgICBmcmFtZV9zZXFfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAvKiBsb2dpY2FsIGZyYW1lIG51bWJlciAqLworICBpbnQgICAgICBsb2dpY2FsX2Jsa19udW07ICAgICAgICAgICAgICAgICAgICAvKiBsb2dpY2FsIGJsb2NrIG51bWJlciAqLworICB1bnNpZ25lZCBmaXJzdF9mcmFtZV9wb3NpdGlvbjsgICAgICAgICAgICAgICAvKiBwaHlzaWNhbCBmcmFtZSB0byBiZSB0cmFuc2ZlcnJlZCB0by9mcm9tIGhvc3QgKi8KKyAgdW5zaWduZWQgbGFzdF9mcmFtZV9wb3NpdGlvbjsgICAgICAgICAgICAgICAgLyogcGh5c2ljYWwgZnJhbWUgdG8gYmUgdHJhbnNmZXJkIHRvL2Zyb20gdGFwZSAqLworICBpbnQgICAgICBjdXJfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBmcmFtZXMgaW4gaW50ZXJuYWwgYnVmZmVyICovCisgIGludCAgICAgIG1heF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZnJhbWVzIGluIGludGVybmFsIGJ1ZmZlciAqLworICBjaGFyICAgICBhcHBsaWNhdGlvbl9zaWdbNV07ICAgICAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBzaWduYXR1cmUgKi8KKyAgdW5zaWduZWQgY2hhciAgZmFzdF9vcGVuOyAgICAgICAgICAgICAgICAgICAgLyogZmxhZyB0aGF0IHJlbWluZHMgdXMgd2UgZGlkbid0IGNoZWNrIGhlYWRlcnMgYXQgb3BlbiAqLworICB1bnNpZ25lZCBzaG9ydCB3cnRfcGFzc19jbnRyOyAgICAgICAgICAgICAgICAvKiB3cml0ZSBwYXNzIGNvdW50ZXIgKi8KKyAgaW50ICAgICAgdXBkYXRlX2ZyYW1lX2NudHI7ICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIGZyYW1lIGNvdW50ZXIgKi8KKyAgaW50ICAgICAgb25zdHJlYW1fd3JpdGVfZXJyb3I7ICAgICAgICAgICAgICAgLyogd3JpdGUgZXJyb3IgcmVjb3ZlcnkgYWN0aXZlICovCisgIGludCAgICAgIGhlYWRlcl9vazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBmcmFtZSB2ZXJpZmllZCBvayAqLworICBpbnQgICAgICBsaW51eF9tZWRpYTsgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkaW5nIGxpbnV4LXNwZWNpZmMgbWVkaWEgKi8KKyAgaW50ICAgICAgbGludXhfbWVkaWFfdmVyc2lvbjsKKyAgb3NfaGVhZGVyX3QgKiBoZWFkZXJfY2FjaGU7CQkgICAgICAgLyogY2FjaGUgaXMga2VwdCBmb3IgZmlsZW1hcmsgcG9zaXRpb25zICovCisgIGludCAgICAgIGZpbGVtYXJrX2NudDsKKyAgaW50ICAgICAgZmlyc3RfbWFya19wcG9zOworICBpbnQgICAgICBsYXN0X21hcmtfcHBvczsKKyAgaW50ICAgICAgbGFzdF9tYXJrX2xibjsJCQkvKiBzdG9yaW5nIGxvZ19ibGtfbnVtIG9mIGxhc3QgbWFyayBpcyBleHRlbmRzIEFEUiBzcGVjICovCisgIGludCAgICAgIGZpcnN0X2RhdGFfcHBvczsKKyAgaW50ICAgICAgZW9kX2ZyYW1lX3Bwb3M7CisgIGludCAgICAgIGVvZF9mcmFtZV9sZmE7CisgIGludCAgICAgIHdyaXRlX3R5cGU7CQkJCS8qIHVzZWQgaW4gd3JpdGUgZXJyb3IgcmVjb3ZlcnkgKi8KKyAgaW50ICAgICAgcmVhZF9lcnJvcl9mcmFtZTsJCQkvKiB1c2VkIGluIHJlYWQgZXJyb3IgcmVjb3ZlcnkgKi8KKyAgdW5zaWduZWQgbG9uZyBjbWRfc3RhcnRfdGltZTsKKyAgdW5zaWduZWQgbG9uZyBtYXhfY21kX3RpbWU7CisKKyNpZiBERUJVRworICB1bnNpZ25lZCBjaGFyIHdyaXRlX3BlbmRpbmc7CisgIGludCBuYnJfZmluaXNoZWQ7CisgIGludCBuYnJfd2FpdHM7CisgIHVuc2lnbmVkIGNoYXIgbGFzdF9jbW5kWzZdOworICB1bnNpZ25lZCBjaGFyIGxhc3Rfc2Vuc2VbMTZdOworI2VuZGlmCisgIHN0cnVjdCBnZW5kaXNrICpkcml2ZTsKK30gOworCisvKiBWYWx1ZXMgb2Ygd3JpdGVfdHlwZSAqLworI2RlZmluZSBPU19XUklURV9EQVRBICAgICAgMAorI2RlZmluZSBPU19XUklURV9FT0QgICAgICAgMQorI2RlZmluZSBPU19XUklURV9ORVdfTUFSSyAgMgorI2RlZmluZSBPU19XUklURV9MQVNUX01BUksgMworI2RlZmluZSBPU19XUklURV9IRUFERVIgICAgNAorI2RlZmluZSBPU19XUklURV9GSUxMRVIgICAgNQorCisvKiBBZGRpdGlvbmFsIHJ3IHN0YXRlICovCisjZGVmaW5lIE9TX1dSSVRJTkdfQ09NUExFVEUgMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3RfZGV0ZWN0LmggYi9kcml2ZXJzL3Njc2kvb3NzdF9kZXRlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTcxN2QwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL29zc3RfZGV0ZWN0LmgKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIFNJR1NfRlJPTV9PU1NUIFwKKyAgICAgICB7Ik9uU3RyZWFtIiwgIlNDLSIsICIiLCAib3NzdCJ9LCBcCisgICAgICAgeyJPblN0cmVhbSIsICJESS0iLCAiIiwgIm9zc3QifSwgXAorICAgICAgIHsiT25TdHJlYW0iLCAiRFAtIiwgIiIsICJvc3N0In0sIFwKKyAgICAgICB7Ik9uU3RyZWFtIiwgIkZXLSIsICIiLCAib3NzdCJ9LCBcCisgICAgICAgeyJPblN0cmVhbSIsICJVU0IiLCAiIiwgIm9zc3QifQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3Rfb3B0aW9ucy5oIGIvZHJpdmVycy9zY3NpL29zc3Rfb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWU2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvb3NzdF9vcHRpb25zLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgICBUaGUgY29tcGlsZS10aW1lIGNvbmZpZ3VyYWJsZSBkZWZhdWx0cyBmb3IgdGhlIExpbnV4IFNDU0kgdGFwZSBkcml2ZXIuCisKKyAgIENvcHlyaWdodCAxOTk1IEthaSBNYWtpc2FyYS4KKyAgIAorICAgTGFzdCBtb2RpZmllZDogV2VkIFNlcCAgMiAyMToyNDowNyAxOTk4IGJ5IHJvb3RAaG9tZQorICAgCisgICBDaGFuZ2VkIChhbmQgcmVuYW1lZCkgZm9yIE9uU3RyZWFtIFNDU0kgZHJpdmVzIGdhcmxvZmZAc3VzZS5kZQorICAgMjAwMC0wNi0yMQorCisgICAkSGVhZGVyOiAvY3Zzcm9vdC9vc3N0L0RyaXZlci9vc3N0X29wdGlvbnMuaCx2IDEuNiAyMDAzLzEyLzIzIDE0OjIyOjEyIHdyaWVkZSBFeHAgJAorKi8KKworI2lmbmRlZiBfT1NTVF9PUFRJT05TX0gKKyNkZWZpbmUgX09TU1RfT1BUSU9OU19ICisKKy8qIFRoZSBtaW5pbXVtIGxpbWl0IGZvciB0aGUgbnVtYmVyIG9mIFNDU0kgdGFwZSBkZXZpY2VzIGlzIGRldGVybWluZWQgYnkKKyAgIE9TU1RfTUFYX1RBUEVTLiBJZiB0aGUgbnVtYmVyIG9mIHRhcGUgZGV2aWNlcyBhbmQgdGhlICJzbGFjayIgZGVmaW5lZCBieQorICAgT1NTVF9FWFRSQV9ERVZTIGV4Y2VlZHMgT1NTVF9NQVhfVEFQRVMsIHRoZSBsYXJnZSBudW1iZXIgaXMgdXNlZC4gKi8KKyNkZWZpbmUgT1NTVF9NQVhfVEFQRVMgNAorCisvKiBJZiBPU1NUX0lOX0ZJTEVfUE9TIGlzIG5vbnplcm8sIHRoZSBkcml2ZXIgcG9zaXRpb25zIHRoZSB0YXBlIGFmdGVyIHRoZQorICAgcmVjb3JkIGJlZW4gcmVhZCBieSB0aGUgdXNlciBwcm9ncmFtIGV2ZW4gaWYgdGhlIHRhcGUgaGFzIG1vdmVkIGZ1cnRoZXIKKyAgIGJlY2F1c2Ugb2YgYnVmZmVyZWQgcmVhZHMuIFNob3VsZCBiZSBzZXQgdG8gemVybyB0byBzdXBwb3J0IGFsc28gZHJpdmVzCisgICB0aGF0IGNhbid0IHNwYWNlIGJhY2t3YXJkcyBvdmVyIHJlY29yZHMuIE5PVEU6IFRoZSB0YXBlIHdpbGwgYmUKKyAgIHNwYWNlZCBiYWNrd2FyZHMgb3ZlciBhbiAiYWNjaWRlbnRhbGx5IiBjcm9zc2VkIGZpbGVtYXJrIGluIGFueSBjYXNlLiAqLworI2RlZmluZSBPU1NUX0lOX0ZJTEVfUE9TIDEKKworLyogVGhlIHRhcGUgZHJpdmVyIGJ1ZmZlciBzaXplIGluIGtpbG9ieXRlcy4gKi8KKy8qIERvbid0IGNoYW5nZSwgYXMgdGhpcyBpcyB0aGUgSFcgYmxvY2tzaXplICovCisjZGVmaW5lIE9TU1RfQlVGRkVSX0JMT0NLUyAzMgorCisvKiBUaGUgbnVtYmVyIG9mIGtpbG9ieXRlcyBvZiBkYXRhIGluIHRoZSBidWZmZXIgdGhhdCB0cmlnZ2VycyBhbgorICAgYXN5bmNocm9ub3VzIHdyaXRlIGluIGZpeGVkIGJsb2NrIG1vZGUuIFNlZSBhbHNvIE9TU1RfQVNZTkNfV1JJVEVTCisgICBiZWxvdy4gKi8KKyNkZWZpbmUgT1NTVF9XUklURV9USFJFU0hPTERfQkxPQ0tTIDMyCisKKy8qIE9TU1RfRU9NX1JFU0VSVkUgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhcmUga2VwdCBpbiByZXNlcnZlIGZvcgorICogICogd3JpdGUgZXJyb3IgcmVjb3Zlcnkgd2hlbiB3cml0aW5nIG5lYXIgZW5kIG9mIG1lZGl1bS4gRU5PU1BDIGlzIHJldHVybmVkCisgKiAgICogd2hlbiB3cml0ZSgpIGlzIGNhbGxlZCBhbmQgdGhlIHRhcGUgd3JpdGUgcG9zaXRpb24gaXMgd2l0aGluIHRoaXMgbnVtYmVyCisgKiAgICAqIG9mIGJsb2NrcyBmcm9tIHRoZSB0YXBlIGNhcGFjaXR5LiAqLworI2RlZmluZSBPU1NUX0VPTV9SRVNFUlZFIDMwMAorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFwZSBidWZmZXJzIHRoZSBkcml2ZXIgYWxsb2NhdGVzLiBUaGUgbnVtYmVyCisgICBpcyBhbHNvIGNvbnN0cmFpbmVkIGJ5IHRoZSBudW1iZXIgb2YgZHJpdmVzIGRldGVjdGVkLiBEZXRlcm1pbmVzIHRoZQorICAgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudGx5IGFjdGl2ZSB0YXBlIGRyaXZlcy4gKi8KKyNkZWZpbmUgT1NTVF9NQVhfQlVGRkVSUyBPU1NUX01BWF9UQVBFUyAKKworLyogTWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgKi8KKy8qIEZpdCBvbmUgYnVmZmVyIGluIHBhZ2VzIGFuZCBhZGQgb25lIGZvciB0aGUgQVVYIGhlYWRlciAqLworI2RlZmluZSBPU1NUX01BWF9TRyAgICAgICgoKE9TU1RfQlVGRkVSX0JMT0NLUyoxMDI0KSAvIFBBR0VfU0laRSkgKyAxKQorCisvKiBUaGUgbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzIHRvIGFsbG9jYXRlIGF0IGZpcnN0IHRyeSAobXVzdCBiZQorICAgc21hbGxlciBvciBlcXVhbCB0byB0aGUgbWF4aW11bSkuICovCisjZGVmaW5lIE9TU1RfRklSU1RfU0cgICAgKChPU1NUX0JVRkZFUl9CTE9DS1MqMTAyNCkgLyBQQUdFX1NJWkUpCisKKy8qIFRoZSBzaXplIG9mIHRoZSBmaXJzdCBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyAoZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBibG9jaworICAgc2l6ZSBmb3IgU0NTSSBhZGFwdGVycyBub3Qgc3VwcG9ydGluZyBzY2F0dGVyL2dhdGhlcikuIFRoZSBkZWZhdWx0IGlzIHNldAorICAgdG8gdHJ5IHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgYXMgb25lIGNodW5rLiAqLworI2RlZmluZSBPU1NUX0ZJUlNUX09SREVSICAoMTUtUEFHRV9TSElGVCkKKworCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGRlZmluZSBkZWZhdWx0cyBmb3IgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQKKyAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggZHJpdmUgdXNpbmcgdGhlIE1UU1RPUFRJT05TIGlvY3RsLiAqLworCisvKiBJZiBPU1NUX1RXT19GTSBpcyBub24temVybywgdGhlIGRyaXZlciB3cml0ZXMgdHdvIGZpbGVtYXJrcyBhZnRlciBhCisgICBmaWxlIGJlaW5nIHdyaXR0ZW4uIFNvbWUgZHJpdmVzIGNhbid0IGhhbmRsZSB0d28gZmlsZW1hcmtzIGF0IHRoZQorICAgZW5kIG9mIGRhdGEuICovCisjZGVmaW5lIE9TU1RfVFdPX0ZNIDAKKworLyogSWYgT1NTVF9CVUZGRVJfV1JJVEVTIGlzIG5vbi16ZXJvLCB3cml0ZXMgaW4gZml4ZWQgYmxvY2sgbW9kZSBhcmUKKyAgIGJ1ZmZlcmVkIHVudGlsIHRoZSBkcml2ZXIgYnVmZmVyIGlzIGZ1bGwgb3IgYXN5bmNocm9ub3VzIHdyaXRlIGlzCisgICB0cmlnZ2VyZWQuICovCisjZGVmaW5lIE9TU1RfQlVGRkVSX1dSSVRFUyAxCisKKy8qIElmIE9TU1RfQVNZTkNfV1JJVEVTIGlzIG5vbi16ZXJvLCB0aGUgU0NTSSB3cml0ZSBjb21tYW5kIG1heSBiZSBzdGFydGVkCisgICB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC4gTWF5IGNhdXNlIHByb2JsZW1zIGluIG11bHRpcGxlCisgICB0YXBlIGJhY2t1cHMuICovCisjZGVmaW5lIE9TU1RfQVNZTkNfV1JJVEVTIDEKKworLyogSWYgT1NTVF9SRUFEX0FIRUFEIGlzIG5vbi16ZXJvLCBibG9ja3MgYXJlIHJlYWQgYWhlYWQgaW4gZml4ZWQgYmxvY2sKKyAgIG1vZGUuICovCisjZGVmaW5lIE9TU1RfUkVBRF9BSEVBRCAxCisKKy8qIElmIE9TU1RfQVVUT19MT0NLIGlzIG5vbi16ZXJvLCB0aGUgZHJpdmUgZG9vciBpcyBsb2NrZWQgYXQgdGhlIGZpcnN0CisgICByZWFkIG9yIHdyaXRlIGNvbW1hbmQgYWZ0ZXIgdGhlIGRldmljZSBpcyBvcGVuZWQuIFRoZSBkb29yIGlzIG9wZW5lZAorICAgd2hlbiB0aGUgZGV2aWNlIGlzIGNsb3NlZC4gKi8KKyNkZWZpbmUgT1NTVF9BVVRPX0xPQ0sgMAorCisvKiBJZiBPU1NUX0ZBU1RfTVRFT00gaXMgbm9uLXplcm8sIHRoZSBNVEVPTSBpb2N0bCBpcyBkb25lIHVzaW5nIHRoZQorICAgZGlyZWN0IFNDU0kgY29tbWFuZC4gVGhlIGZpbGUgbnVtYmVyIHN0YXR1cyBpcyBsb3N0IGJ1dCB0aGlzIG1ldGhvZAorICAgaXMgZmFzdCB3aXRoIHNvbWUgZHJpdmVzLiBPdGhlcndpc2UgTVRFT00gaXMgZG9uZSBieSBzcGFjaW5nIG92ZXIKKyAgIGZpbGVzIGFuZCB0aGUgZmlsZSBudW1iZXIgc3RhdHVzIGlzIHJldGFpbmVkLiAqLworI2RlZmluZSBPU1NUX0ZBU1RfTVRFT00gMAorCisvKiBJZiBPU1NUX1NDU0kyTE9HSUNBTCBpcyBub256ZXJvLCB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzZXMgYXJlIHVzZWQgZm9yCisgICBNVElPQ1BPUyBhbmQgTVRTRUVLIGJ5IGRlZmF1bHQuIFZlbmRvciBhZGRyZXNzZXMgYXJlIHVzZWQgaWYgT1NTVF9TQ1NJMkxPR0lDQUwKKyAgIGlzIHplcm8uICovCisjZGVmaW5lIE9TU1RfU0NTSTJMT0dJQ0FMIDAKKworLyogSWYgT1NTVF9TWVNWIGlzIG5vbi16ZXJvLCB0aGUgdGFwZSBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgU1lTIFYgc2VtYW50aWNzLgorICAgVGhlIGRlZmF1bHQgaXMgQlNEIHNlbWFudGljcy4gKi8KKyNkZWZpbmUgT1NTVF9TWVNWIDAKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wYXMxNi5jIGIvZHJpdmVycy9zY3NpL3BhczE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwZGVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wYXMxNi5jCkBAIC0wLDAgKzEsNjM5IEBACisjZGVmaW5lIEFVVE9TRU5TRQorI2RlZmluZSBQU0VVRE9fRE1BCisjZGVmaW5lIEZPTworI2RlZmluZSBVTlNBRkUgIC8qIE5vdCB1bnNhZmUgZm9yIFBBUzE2IC0tIHVzZSBpdCAqLworCisvKgorICogVGhpcyBkcml2ZXIgYWRhcHRlZCBmcm9tIERyZXcgRWNraGFyZHQncyBUcmFudG9yIFQxMjggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcKKyAqCShVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCisgKglkcmV3QGNvbG9yYWRvLmVkdQorICogICAgICArMSAoMzAzKSA2NjYtNTgzNgorICoKKyAqICAoIEJhc2VkIG9uIFQxMjggLSBESVNUUklCVVRJT04gUkVMRUFTRSAzLiApIAorICoKKyAqIE1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgUHJvIEF1ZGlvIFNwZWN0cnVtL1N0dWRpbyAxNgorICogYnkgSm9obiBXZWlkbWFuLgorICoKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTWVkaWEgVmlzaW9uCisgKiAoNTEwKSA3NzAtODYwMAorICogKDgwMCkgMzQ4LTcxMTYKKyAqIAorICogYW5kIAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qCisgKiBPcHRpb25zIDogCisgKiBBVVRPU0VOU0UgLSBpZiBkZWZpbmVkLCBSRVFVRVNUIFNFTlNFIHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkKKyAqICAgICAgZm9yIGNvbW1hbmRzIHRoYXQgcmV0dXJuIHdpdGggYSBDSEVDSyBDT05ESVRJT04gc3RhdHVzLiAKKyAqCisgKiBMSU1JVF9UUkFOU0ZFUlNJWkUgLSBpZiBkZWZpbmVkLCBsaW1pdCB0aGUgcHNldWRvLWRtYSB0cmFuc2ZlcnMgdG8gNTEyCisgKiAgICAgIGJ5dGVzIGF0IGEgdGltZS4gIFNpbmNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQgZHVyaW5nCisgKiAgICAgIHRoZXNlIHRyYW5zZmVycywgd2UgbWlnaHQgbmVlZCB0aGlzIHRvIGdpdmUgcmVhc29uYWJsZSBpbnRlcnJ1cHQKKyAqICAgICAgc2VydmljZSB0aW1lIGlmIHRoZSB0cmFuc2ZlciBzaXplIGdldHMgdG9vIGxhcmdlLgorICoKKyAqIFBTRVVET19ETUEgLSBlbmFibGVzIFBTRVVETy1ETUEgaGFyZHdhcmUsIHNob3VsZCBnaXZlIGEgMy00WCBwZXJmb3JtYW5jZQorICogaW5jcmVhc2UgY29tcGFyZWQgdG8gcG9sbGVkIEkvTy4KKyAqCisgKiBQQVJJVFkgLSBlbmFibGUgcGFyaXR5IGNoZWNraW5nLiAgTm90IHN1cHBvcnRlZC4KKyAqIAorICogU0NTSTIgLSBlbmFibGUgc3VwcG9ydCBmb3IgU0NTSS1JSSB0YWdnZWQgcXVldWVpbmcuICBVbnRlc3RlZC4KKyAqCisgKiBVTlNBRkUgLSBsZWF2ZSBpbnRlcnJ1cHRzIGVuYWJsZWQgZHVyaW5nIHBzZXVkby1ETUEgdHJhbnNmZXJzLiAgVGhpcworICoJICAgIHBhcmFtZXRlciBjb21lcyBmcm9tIHRoZSBOQ1I1MzgwIGNvZGUuICBJdCBpcyBOT1QgdW5zYWZlIHdpdGgKKyAqCSAgICB0aGUgUEFTMTYgYW5kIHlvdSBzaG91bGQgdXNlIGl0LiAgSWYgeW91IGRvbid0IHlvdSB3aWxsIGhhdmUKKyAqCSAgICBhIHByb2JsZW0gd2l0aCBkcm9wcGVkIGNoYXJhY3RlcnMgZHVyaW5nIGhpZ2ggc3BlZWQKKyAqCSAgICBjb21tdW5pY2F0aW9ucyBkdXJpbmcgU0NTSSB0cmFuc2ZlcnMuICBJZiB5b3UgcmVhbGx5IGRvbid0CisgKgkgICAgd2FudCB0byB1c2UgVU5TQUZFIHlvdSBjYW4gdHJ5IGRlZmluaW5nIExJTUlUX1RSQU5TRkVSU0laRSBvcgorICoJICAgIHR3aWRkbGUgd2l0aCB0aGUgdHJhbnNmZXIgc2l6ZSBpbiB0aGUgaGlnaCBsZXZlbCBjb2RlLgorICoKKyAqIFVTTEVFUCAtIGVuYWJsZSBzdXBwb3J0IGZvciBkZXZpY2VzIHRoYXQgZG9uJ3QgZGlzY29ubmVjdC4gIFVudGVzdGVkLgorICoKKyAqIFRoZSBjYXJkIGlzIGRldGVjdGVkIGFuZCBpbml0aWFsaXplZCBpbiBvbmUgb2Ygc2V2ZXJhbCB3YXlzIDogCisgKiAxLiAgQXV0b3Byb2JlIChkZWZhdWx0KSAtIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBtb2RlbHMgb2YKKyAqICAgICB0aGUgUHJvIEF1ZGlvIFNwZWN0cnVtL1N0dWRpbyAxNiwgYW5kIEkgb25seSBoYXZlIG9uZSBvZgorICogICAgIHRoZW0sIHNvIHRoaXMgbWF5IHJlcXVpcmUgYSBsaXR0bGUgdHdlYWtpbmcuICBBbiBpbnRlcnJ1cHQKKyAqICAgICBpcyB0cmlnZ2VyZWQgdG8gYXV0b3Byb2JlIGZvciB0aGUgaW50ZXJydXB0IGxpbmUuICBOb3RlOgorICogICAgIHdpdGggdGhlIG5ld2VyIG1vZGVsIGJvYXJkcywgdGhlIGludGVycnVwdCBpcyBzZXQgdmlhCisgKiAgICAgc29mdHdhcmUgYWZ0ZXIgcmVzZXQgdXNpbmcgdGhlIGRlZmF1bHRfaXJxIGZvciB0aGUKKyAqICAgICBjdXJyZW50IGJvYXJkIG51bWJlci4KKyAqCisgKiAyLiAgV2l0aCBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIC0gcGFzMTY9cG9ydCxpcnEgbWF5IGJlIAorICogICAgIHVzZWQgb24gdGhlIExJTE8gY29tbWFuZCBsaW5lIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KKyAqCisgKiAzLiAgV2l0aCB0aGUgUEFTMTZfT1ZFUlJJREUgY29tcGlsZSB0aW1lIGRlZmluZS4gIFRoaXMgaXMgCisgKiAgICAgc3BlY2lmaWVkIGFzIGFuIGFycmF5IG9mIGFkZHJlc3MsIGlycSB0dXBsZXMuICBJZSwgZm9yCisgKiAgICAgb25lIGJvYXJkIGF0IHRoZSBkZWZhdWx0IDB4Mzg4IGFkZHJlc3MsIElSUTEwLCBJIGNvdWxkIHNheSAKKyAqICAgICAtRFBBUzE2X09WRVJSSURFPXt7MHgzODgsIDEwfX0KKyAqICAgICBOT1RFOiAgVW50ZXN0ZWQuCisgKgkKKyAqIDQuICBXaGVuIGluY2x1ZGVkIGFzIGEgbW9kdWxlLCB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZToKKyAqICAgICAgICAgcGFzMTZfaXJxPXh4CQl0aGUgaW50ZXJydXB0CisgKiAgICAgICAgIHBhczE2X2FkZHI9eHgJdGhlIHBvcnQKKyAqICAgICBlLmcuICJtb2Rwcm9iZSBwYXMxNiBwYXMxNl9hZGRyPTB4Mzg4IHBhczE2X2lycT01IgorICoKKyAqICAgICBOb3RlIHRoYXQgaWYgdGhlIG92ZXJyaWRlIG1ldGhvZHMgYXJlIHVzZWQsIHBsYWNlIGhvbGRlcnMgbXVzdAorICogICAgIGJlIHNwZWNpZmllZCBmb3Igb3RoZXIgYm9hcmRzIGluIHRoZSBzeXN0ZW0uCisgKgorICoKKyAqIENvbmZpZ3VyYXRpb24gbm90ZXMgOgorICogICBUaGUgY3VycmVudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnJ1cHQgc2hhcmluZyB3aXRoIHRoZQorICogICBzb3VuZCBwb3J0aW9uIG9mIHRoZSBjYXJkLiAgSWYgeW91IHVzZSB0aGUgc2FtZSBpcnEgZm9yIHRoZQorICogICBzY3NpIHBvcnQgYW5kIHNvdW5kIHlvdSB3aWxsIGhhdmUgcHJvYmxlbXMuICBFaXRoZXIgdXNlCisgKiAgIGEgZGlmZmVyZW50IGlycSBmb3IgdGhlIHNjc2kgcG9ydCBvciBkb24ndCB1c2UgaW50ZXJydXB0cworICogICBmb3IgdGhlIHNjc2kgcG9ydC4KKyAqCisgKiAgIElmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggeW91ciBjYXJkIG5vdCBiZWluZyByZWNvZ25pemVkLCB1c2UKKyAqICAgdGhlIExJTE8gY29tbWFuZCBsaW5lIG92ZXJyaWRlLiAgVHJ5IHRvIGdldCBpdCByZWNvZ25pemVkIHdpdGhvdXQKKyAqICAgaW50ZXJydXB0cy4gIEllLCBmb3IgYSBib2FyZCBhdCB0aGUgZGVmYXVsdCAweDM4OCBiYXNlIHBvcnQsCisgKiAgIGJvb3Q6IGxpbnV4IHBhczE2PTB4Mzg4LDI1NQorICoKKyAqICAgU0NTSV9JUlFfTk9ORSAoMjU1KSBzaG91bGQgYmUgc3BlY2lmaWVkIGZvciBubyBpbnRlcnJ1cHQsCisgKiAgIElSUV9BVVRPICgyNTQpIHRvIGF1dG9wcm9iZSBmb3IgYW4gSVJRIGxpbmUgaWYgb3ZlcnJpZGRlbgorICogICBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqICAgKElSUV9BVVRPID09IDI1NCwgU0NTSV9JUlFfTk9ORSA9PSAyNTUgaW4gTkNSNTM4MC5oKQorICovCisgCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInBhczE2LmgiCisjZGVmaW5lIEFVVE9QUk9CRV9JUlEKKyNpbmNsdWRlICJOQ1I1MzgwLmgiCisKKworc3RhdGljIGludCBwYXNfbWF4aSA9IDA7CitzdGF0aWMgaW50IHBhc193bWF4aSA9IDA7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGFzMTZfYWRkciA9IDA7CitzdGF0aWMgaW50IHBhczE2X2lycSA9IDA7CisgCisKK2ludCBzY3NpX2lycV90cmFuc2xhdGVbXSA9CisJeyAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgMCwgIDAsICA3LCAgOCwgIDksICAwLCAxMCwgMTEgfTsKKworLyogVGhlIGRlZmF1bHRfaXJxcyBhcnJheSBjb250YWlucyB2YWx1ZXMgdXNlZCB0byBzZXQgdGhlIGlycSBpbnRvIHRoZQorICogYm9hcmQgdmlhIHNvZnR3YXJlIChhcyBtdXN0IGJlIGRvbmUgb24gbmV3ZXIgbW9kZWwgYm9hcmRzIHdpdGhvdXQKKyAqIGlycSBqdW1wZXJzIG9uIHRoZSBib2FyZCkuICBUaGUgZmlyc3QgdmFsdWUgaW4gdGhlIGFycmF5IHdpbGwgYmUKKyAqIGFzc2lnbmVkIHRvIGxvZ2ljYWwgYm9hcmQgMCwgdGhlIG5leHQgdG8gYm9hcmQgMSwgZXRjLgorICovCitpbnQgZGVmYXVsdF9pcnFzW10gX19pbml0ZGF0YSA9IAorCXsgIFBBUzE2X0RFRkFVTFRfQk9BUkRfMV9JUlEsCisJICAgUEFTMTZfREVGQVVMVF9CT0FSRF8yX0lSUSwKKwkgICBQQVMxNl9ERUZBVUxUX0JPQVJEXzNfSVJRLAorCSAgIFBBUzE2X0RFRkFVTFRfQk9BUkRfNF9JUlEKKwl9OworCitzdGF0aWMgc3RydWN0IG92ZXJyaWRlIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpb19wb3J0OworICAgIGludCAgaXJxOworfSBvdmVycmlkZXMgCisjaWZkZWYgUEFTMTZfT1ZFUlJJREUKKyAgICBbXSBfX2luaXRkYXRhID0gUEFTMTZfT1ZFUlJJREU7CisjZWxzZQorICAgIFs0XSBfX2luaXRkYXRhID0ge3swLElSUV9BVVRPfSwgezAsSVJRX0FVVE99LCB7MCxJUlFfQVVUT30sCisJezAsSVJRX0FVVE99fTsKKyNlbmRpZgorCisjZGVmaW5lIE5PX09WRVJSSURFUyAoc2l6ZW9mKG92ZXJyaWRlcykgLyBzaXplb2Yoc3RydWN0IG92ZXJyaWRlKSkKKworc3RhdGljIHN0cnVjdCBiYXNlIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpb19wb3J0OworICAgIGludCBub2F1dG87Cit9IGJhc2VzW10gX19pbml0ZGF0YSA9IAorCXsge1BBUzE2X0RFRkFVTFRfQkFTRV8xLCAwfSwKKwkgIHtQQVMxNl9ERUZBVUxUX0JBU0VfMiwgMH0sCisJICB7UEFTMTZfREVGQVVMVF9CQVNFXzMsIDB9LAorCSAge1BBUzE2X0RFRkFVTFRfQkFTRV80LCAwfQorCX07CisKKyNkZWZpbmUgTk9fQkFTRVMgKHNpemVvZiAoYmFzZXMpIC8gc2l6ZW9mIChzdHJ1Y3QgYmFzZSkpCisKK3Vuc2lnbmVkIHNob3J0ICBwYXMxNl9vZmZzZXRbIDggXSA9CisgICAgeworCTB4MWMwMCwgICAgLyogT1VUUFVUX0RBVEFfUkVHICovCisJMHgxYzAxLCAgICAvKiBJTklUSUFUT1JfQ09NTUFORF9SRUcgKi8KKwkweDFjMDIsICAgIC8qIE1PREVfUkVHICovCisJMHgxYzAzLCAgICAvKiBUQVJHRVRfQ09NTUFORF9SRUcgKi8KKwkweDNjMDAsICAgIC8qIFNUQVRVU19SRUcgcm8sIFNFTEVDVF9FTkFCTEVfUkVHIHdvICovCisJMHgzYzAxLCAgICAvKiBCVVNfQU5EX1NUQVRVU19SRUcgcm8sIFNUQVJUX0RNQV9TRU5EX1JFRyB3byAqLworCTB4M2MwMiwgICAgLyogSU5QVVRfREFUQV9SRUdJU1RFUiBybywgKE4vQSBvbiBQQVMxNiA/KQorCQkgICAgKiBTVEFSVF9ETUFfVEFSR0VUX1JFQ0VJVkVfUkVHIHdvCisJCSAgICAqLworCTB4M2MwMywgICAgLyogUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcgcm8sCisJCSAgICAqIFNUQVJUX0RNQV9JTklUSUFUT1JfUkVDRUlWRV9SRUcgd28KKwkJICAgICovCisgICAgfTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgZm9sbG93aW5nIHdpbGwgc2V0IHRoZSBtb25pdG9yIGJvcmRlciBjb2xvciAodXNlZnVsIHRvIGZpbmQKKyB3aGVyZSBzb21ldGhpbmcgY3Jhc2hlZCBvciBnZXRzIHN0dWNrIGF0ICovCisvKiAxID0gYmx1ZQorIDIgPSBncmVlbgorIDMgPSBjeWFuCisgNCA9IHJlZAorIDUgPSBtYWdlbnRhCisgNiA9IHllbGxvdworIDcgPSB3aGl0ZQorKi8KKyNpZiAxCisjZGVmaW5lIHJ0cmMoaSkge2luYigweDNkYSk7IG91dGIoMHgzMSwgMHgzYzApOyBvdXRiKChpKSwgMHgzYzApO30KKyNlbHNlCisjZGVmaW5lIHJ0cmMoaSkge30KKyNlbmRpZgorCisKKy8qCisgKiBGdW5jdGlvbiA6IGVuYWJsZV9ib2FyZCggaW50ICBib2FyZF9udW0sIHVuc2lnbmVkIHNob3J0IHBvcnQgKQorICoKKyAqIFB1cnBvc2UgOiAgc2V0IGFkZHJlc3MgaW4gbmV3IG1vZGVsIGJvYXJkCisgKgorICogSW5wdXRzIDogYm9hcmRfbnVtIC0gbG9naWNhbCBib2FyZCBudW1iZXIgMC0zLCBwb3J0IC0gYmFzZSBhZGRyZXNzCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorCWVuYWJsZV9ib2FyZCggaW50ICBib2FyZF9udW0sICB1bnNpZ25lZCBzaG9ydCBwb3J0ICkKK3sKKyAgICBvdXRiKCAweGJjICsgYm9hcmRfbnVtLCBNQVNURVJfQUREUkVTU19QVFIgKTsKKyAgICBvdXRiKCBwb3J0ID4+IDIsIE1BU1RFUl9BRERSRVNTX1BUUiApOworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIDogaW5pdF9ib2FyZCggdW5zaWduZWQgc2hvcnQgcG9ydCwgaW50IGlycSApCisgKgorICogUHVycG9zZSA6ICBTZXQgdGhlIGJvYXJkIHVwIHRvIGhhbmRsZSB0aGUgU0NTSSBpbnRlcmZhY2UKKyAqCisgKiBJbnB1dHMgOiBwb3J0IC0gYmFzZSBhZGRyZXNzIG9mIHRoZSBib2FyZCwKKyAqCSAgICBpcnEgLSBpcnEgdG8gYXNzaWduIHRvIHRoZSBTQ1NJIHBvcnQKKyAqCSAgICBmb3JjZV9pcnEgLSBzZXQgaXQgZXZlbiBpZiBpdCBjb25mbGljdHMgd2l0aCBzb3VuZCBkcml2ZXIKKyAqCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IAorCWluaXRfYm9hcmQoIHVuc2lnbmVkIHNob3J0IGlvX3BvcnQsIGludCBpcnEsIGludCBmb3JjZV9pcnEgKQoreworCXVuc2lnbmVkIGludAl0bXA7CisJdW5zaWduZWQgaW50CXBhc19pcnFfY29kZTsKKworCS8qIEluaXRpYWxpemUgdGhlIFNDU0kgcGFydCBvZiB0aGUgYm9hcmQgKi8KKworCW91dGIoIDB4MzAsIGlvX3BvcnQgKyBQX1RJTUVPVVRfQ09VTlRFUl9SRUcgKTsgIC8qIFRpbWVvdXQgY291bnRlciAqLworCW91dGIoIDB4MDEsIGlvX3BvcnQgKyBQX1RJTUVPVVRfU1RBVFVTX1JFR19PRkZTRVQgKTsgICAvKiBSZXNldCBUQyAqLworCW91dGIoIDB4MDEsIGlvX3BvcnQgKyBXQUlUX1NUQVRFICk7ICAgLyogMSBXYWl0IHN0YXRlICovCisKKwlOQ1I1MzgwX3JlYWQoIFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHICk7CisKKwkvKiBTZXQgdGhlIFNDU0kgaW50ZXJydXB0IHBvaW50ZXIgd2l0aG91dCBtdWNraW5nIHVwIHRoZSBzb3VuZAorCSAqIGludGVycnVwdCBwb2ludGVyIGluIHRoZSBzYW1lIGJ5dGUuCisJICovCisJcGFzX2lycV9jb2RlID0gKCBpcnEgPCAxNiApID8gc2NzaV9pcnFfdHJhbnNsYXRlW2lycV0gOiAwOworCXRtcCA9IGluYiggaW9fcG9ydCArIElPX0NPTkZJR18zICk7CisKKwlpZiggKCggdG1wICYgMHgwZiApID09IHBhc19pcnFfY29kZSkgJiYgcGFzX2lycV9jb2RlID4gMCAKKwkgICAgJiYgIWZvcmNlX2lycSApCisJeworCSAgICBwcmludGsoICJwYXMxNjogV0FSTklORzogQ2FuJ3QgdXNlIHNhbWUgaXJxIGFzIHNvdW5kICIKKwkJICAgICJkcml2ZXIgLS0gaW50ZXJydXB0cyBkaXNhYmxlZFxuIiApOworCSAgICAvKiBTZXQgdXAgdGhlIGRyaXZlIHBhcmFtZXRlcnMsIGRpc2FibGUgNTM4MCBpbnRlcnJ1cHRzICovCisJICAgIG91dGIoIDB4NGQsIGlvX3BvcnQgKyBTWVNfQ09ORklHXzQgKTsKKwl9CisJZWxzZQorCXsKKwkgICAgdG1wID0gKCAgdG1wICYgMHgwZiApIHwgKCBwYXNfaXJxX2NvZGUgPDwgNCApOworCSAgICBvdXRiKCB0bXAsIGlvX3BvcnQgKyBJT19DT05GSUdfMyApOworCisJICAgIC8qIFNldCB1cCB0aGUgZHJpdmUgcGFyYW1ldGVycyBhbmQgZW5hYmxlIDUzODAgaW50ZXJydXB0cyAqLworCSAgICBvdXRiKCAweDZkLCBpb19wb3J0ICsgU1lTX0NPTkZJR180ICk7CisJfQorfQorCisKKy8qCisgKiBGdW5jdGlvbiA6IHBhczE2X2h3X2RldGVjdCggdW5zaWduZWQgc2hvcnQgYm9hcmRfbnVtICkKKyAqCisgKiBQdXJwb3NlIDogZGV0ZXJtaW5lIGlmIGEgcGFzMTYgYm9hcmQgaXMgcHJlc2VudAorICogCisgKiBJbnB1dHMgOiBib2FyZF9udW0gLSBsb2dpY2FsIGJvYXJkIG51bWJlciAoIDAgLSAzICkKKyAqCisgKiBSZXR1cm5zIDogMCBpZiBib2FyZCBub3QgZm91bmQsIDEgaWYgZm91bmQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgCisgICAgIHBhczE2X2h3X2RldGVjdCggdW5zaWduZWQgc2hvcnQgIGJvYXJkX251bSApCit7CisgICAgdW5zaWduZWQgY2hhcglib2FyZF9yZXYsIHRtcDsKKyAgICB1bnNpZ25lZCBzaG9ydAlpb19wb3J0ID0gYmFzZXNbIGJvYXJkX251bSBdLmlvX3BvcnQ7CisKKyAgICAvKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBQQVMxNiBib2FyZCBhdCB0aGUgYWRkcmVzcyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIGxvZ2ljYWwgYm9hcmQgbnVtYmVyLgorICAgICAqLworCisgICAgLyogRmlyc3QsIGF0dGVtcHQgdG8gdGFrZSBhIG5ld2VyIG1vZGVsIGJvYXJkIG91dCBvZiByZXNldCBhbmQKKyAgICAgKiBnaXZlIGl0IGEgYmFzZSBhZGRyZXNzLiAgVGhpcyBzaG91bGRuJ3QgYWZmZWN0IG9sZGVyIGJvYXJkcy4KKyAgICAgKi8KKyAgICBlbmFibGVfYm9hcmQoIGJvYXJkX251bSwgaW9fcG9ydCApOworCisgICAgLyogTm93IHNlZSBpZiBpdCBsb29rcyBsaWtlIGEgUEFTMTYgYm9hcmQgKi8KKyAgICBib2FyZF9yZXYgPSBpbmIoIGlvX3BvcnQgKyBQQ0JfQ09ORklHICk7CisKKyAgICBpZiggYm9hcmRfcmV2ID09IDB4ZmYgKQorCXJldHVybiAwOworCisgICAgdG1wID0gYm9hcmRfcmV2IF4gMHhlMDsKKworICAgIG91dGIoIHRtcCwgaW9fcG9ydCArIFBDQl9DT05GSUcgKTsKKyAgICB0bXAgPSBpbmIoIGlvX3BvcnQgKyBQQ0JfQ09ORklHICk7CisgICAgb3V0YiggYm9hcmRfcmV2LCBpb19wb3J0ICsgUENCX0NPTkZJRyApOworCisgICAgaWYoIGJvYXJkX3JldiAhPSB0bXAgKSAJLyogTm90IGEgUEFTLTE2ICovCisJcmV0dXJuIDA7CisKKyAgICBpZiggKCBpbmIoIGlvX3BvcnQgKyBPUEVSQVRJT05fTU9ERV8xICkgJiAweDAzICkgIT0gMHgwMyApIAorCXJldHVybiAwOyAgCS8qIHJldHVybiBpZiBubyBTQ1NJIGludGVyZmFjZSBmb3VuZCAqLworCisgICAgLyogTWVkaWF2aXNpb24gaGFzIHNvbWUgbmV3IG1vZGVsIGJvYXJkcyB0aGF0IHJldHVybiBJRCBiaXRzCisgICAgICogdGhhdCBpbmRpY2F0ZSBhIFNDU0kgaW50ZXJmYWNlLCBidXQgdGhleSdyZSBub3QgKExNUykuICBXZSdsbAorICAgICAqIHB1dCBpbiBhbiBhZGRpdGlvbmFsIHRlc3QgdG8gdHJ5IHRvIHdlZWQgdGhlbSBvdXQuCisgICAgICovCisKKyAgICBvdXRiKCAweDAxLCBpb19wb3J0ICsgV0FJVF9TVEFURSApOyAJLyogMSBXYWl0IHN0YXRlICovCisgICAgTkNSNTM4MF93cml0ZSggTU9ERV9SRUcsIDB4MjAgKTsJCS8qIElzIGl0IHJlYWxseSBTQ1NJPyAqLworICAgIGlmKCBOQ1I1MzgwX3JlYWQoIE1PREVfUkVHICkgIT0gMHgyMCApCS8qIFdyaXRlIHRvIGEgcmVnLiAgICAqLworCXJldHVybiAwOwkJCQkvKiBhbmQgdHJ5IHRvIHJlYWQgICAgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBNT0RFX1JFRywgMHgwMCApOwkJLyogaXQgYmFjay4JICAgICAgKi8KKyAgICBpZiggTkNSNTM4MF9yZWFkKCBNT0RFX1JFRyApICE9IDB4MDAgKQorCXJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIDogcGFzMTZfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCisgKgorICogUHVycG9zZSA6IExJTE8gY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCisgKiAKKyAqIElucHV0cyA6IHN0ciAtIHVudXNlZCwgaW50cyAtIGFycmF5IG9mIGludGVnZXIgcGFyYW1ldGVycyB3aXRoIGludHNbMF0KKyAqCWVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaW50cy4KKyAqCisgKi8KKwordm9pZCBfX2luaXQgcGFzMTZfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisgICAgc3RhdGljIGludCBjb21tYW5kbGluZV9jdXJyZW50ID0gMDsKKyAgICBpbnQgaTsKKyAgICBpZiAoaW50c1swXSAhPSAyKSAKKwlwcmludGsoInBhczE2X3NldHVwIDogdXNhZ2UgcGFzMTY9aW9fcG9ydCxpcnFcbiIpOworICAgIGVsc2UgCisJaWYgKGNvbW1hbmRsaW5lX2N1cnJlbnQgPCBOT19PVkVSUklERVMpIHsKKwkgICAgb3ZlcnJpZGVzW2NvbW1hbmRsaW5lX2N1cnJlbnRdLmlvX3BvcnQgPSAodW5zaWduZWQgc2hvcnQpIGludHNbMV07CisJICAgIG92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pcnEgPSBpbnRzWzJdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgTk9fQkFTRVM7ICsraSkKKwkJaWYgKGJhc2VzW2ldLmlvX3BvcnQgPT0gKHVuc2lnbmVkIHNob3J0KSBpbnRzWzFdKSB7CisgCQkgICAgYmFzZXNbaV0ubm9hdXRvID0gMTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgICsrY29tbWFuZGxpbmVfY3VycmVudDsKKwl9Cit9CisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgcGFzMTZfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCisgKgorICogUHVycG9zZSA6IGRldGVjdHMgYW5kIGluaXRpYWxpemVzIFBBUzE2IGNvbnRyb2xsZXJzCisgKgl0aGF0IHdlcmUgYXV0b3Byb2JlZCwgb3ZlcnJpZGRlbiBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUsIAorICoJb3Igc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBJbnB1dHMgOiB0cG50IC0gdGVtcGxhdGUgZm9yIHRoaXMgU0NTSSBhZGFwdGVyLgorICogCisgKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgorICoKKyAqLworCitpbnQgX19pbml0IHBhczE2X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworICAgIHN0YXRpYyBpbnQgY3VycmVudF9vdmVycmlkZSA9IDA7CisgICAgc3RhdGljIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfYmFzZSA9IDA7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisgICAgdW5zaWduZWQgc2hvcnQgaW9fcG9ydDsKKyAgICBpbnQgIGNvdW50OworCisgICAgdHBudC0+cHJvY19uYW1lID0gInBhczE2IjsKKyAgICB0cG50LT5wcm9jX2luZm8gPSAmcGFzMTZfcHJvY19pbmZvOworCisgICAgaWYgKHBhczE2X2FkZHIgIT0gMCkgeworCW92ZXJyaWRlc1swXS5pb19wb3J0ID0gcGFzMTZfYWRkcjsKKwkvKgorCSogIFRoaXMgaXMgaG93IHdlIGF2b2lkIHNlZWluZyBtb3JlIHRoYW4KKwkqICBvbmUgaG9zdCBhZGFwdGVyIGF0IHRoZSBzYW1lIEkvTyBwb3J0LgorCSogIENyaWJiZWQgc2hhbWVsZXNzbHkgZnJvbSBwYXMxNl9zZXR1cCgpLgorCSovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTk9fQkFTRVM7ICsrY291bnQpCisJICAgIGlmIChiYXNlc1tjb3VudF0uaW9fcG9ydCA9PSBwYXMxNl9hZGRyKSB7CisgCQkgICAgYmFzZXNbY291bnRdLm5vYXV0byA9IDE7CisJCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChwYXMxNl9pcnEgIT0gMCkKKwlvdmVycmlkZXNbMF0uaXJxID0gcGFzMTZfaXJxOworCisgICAgZm9yIChjb3VudCA9IDA7IGN1cnJlbnRfb3ZlcnJpZGUgPCBOT19PVkVSUklERVM7ICsrY3VycmVudF9vdmVycmlkZSkgeworCWlvX3BvcnQgPSAwOworCisJaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pb19wb3J0KQorCXsKKwkgICAgaW9fcG9ydCA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pb19wb3J0OworCSAgICBlbmFibGVfYm9hcmQoIGN1cnJlbnRfb3ZlcnJpZGUsIGlvX3BvcnQgKTsKKwkgICAgaW5pdF9ib2FyZCggaW9fcG9ydCwgb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycSwgMSApOworCX0KKwllbHNlCisJICAgIGZvciAoOyAhaW9fcG9ydCAmJiAoY3VycmVudF9iYXNlIDwgTk9fQkFTRVMpOyArK2N1cnJlbnRfYmFzZSkgeworI2lmIChQREVCVUcgJiBQREVCVUdfSU5JVCkKKyAgICBwcmludGsoInNjc2ktcGFzMTYgOiBwcm9iaW5nIGlvX3BvcnQgJTA0eFxuIiwgKHVuc2lnbmVkIGludCkgYmFzZXNbY3VycmVudF9iYXNlXS5pb19wb3J0KTsKKyNlbmRpZgorCQlpZiAoICFiYXNlc1tjdXJyZW50X2Jhc2VdLm5vYXV0byAmJgorCQkgICAgIHBhczE2X2h3X2RldGVjdCggY3VycmVudF9iYXNlICkgKXsKKwkJCWlvX3BvcnQgPSBiYXNlc1tjdXJyZW50X2Jhc2VdLmlvX3BvcnQ7CisJCQlpbml0X2JvYXJkKCBpb19wb3J0LCBkZWZhdWx0X2lycXNbIGN1cnJlbnRfYmFzZSBdLCAwICk7IAorI2lmIChQREVCVUcgJiBQREVCVUdfSU5JVCkKKwkJCXByaW50aygic2NzaS1wYXMxNiA6IGRldGVjdGVkIGJvYXJkLlxuIik7CisjZW5kaWYKKwkJfQorICAgIH0KKworCisjaWYgZGVmaW5lZChQREVCVUcpICYmIChQREVCVUcgJiBQREVCVUdfSU5JVCkKKwlwcmludGsoInNjc2ktcGFzMTYgOiBpb19wb3J0ID0gJTA0eFxuIiwgKHVuc2lnbmVkIGludCkgaW9fcG9ydCk7CisjZW5kaWYKKworCWlmICghaW9fcG9ydCkKKwkgICAgYnJlYWs7CisKKwlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmKGluc3RhbmNlID09IE5VTEwpCisJCWJyZWFrOworCQkKKwlpbnN0YW5jZS0+aW9fcG9ydCA9IGlvX3BvcnQ7CisKKwlOQ1I1MzgwX2luaXQoaW5zdGFuY2UsIDApOworCisJaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnEgIT0gSVJRX0FVVE8pCisJICAgIGluc3RhbmNlLT5pcnEgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxOworCWVsc2UgCisJICAgIGluc3RhbmNlLT5pcnEgPSBOQ1I1MzgwX3Byb2JlX2lycShpbnN0YW5jZSwgUEFTMTZfSVJRUyk7CisKKwlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKSAKKwkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHBhczE2X2ludHIsIFNBX0lOVEVSUlVQVCwgInBhczE2IiwgaW5zdGFuY2UpKSB7CisJCXByaW50aygic2NzaSVkIDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsIAorCQkgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworCQlpbnN0YW5jZS0+aXJxID0gU0NTSV9JUlFfTk9ORTsKKwkgICAgfSAKKworCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBpbnRlcnJ1cHRzIG5vdCBlbmFibGVkLiBmb3IgYmV0dGVyIGludGVyYWN0aXZlIHBlcmZvcm1hbmNlLFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCSAgICBwcmludGsoInNjc2klZCA6IHBsZWFzZSBqdW1wZXIgdGhlIGJvYXJkIGZvciBhIGZyZWUgSVJRLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCSAgICAvKiBEaXNhYmxlIDUzODAgaW50ZXJydXB0cywgbGVhdmUgZHJpdmUgcGFyYW1zIHRoZSBzYW1lICovCisJICAgIG91dGIoIDB4NGQsIGlvX3BvcnQgKyBTWVNfQ09ORklHXzQgKTsKKwkgICAgb3V0YiggKGluYihpb19wb3J0ICsgSU9fQ09ORklHXzMpICYgMHgwZiksIGlvX3BvcnQgKyBJT19DT05GSUdfMyApOworCX0KKworI2lmIGRlZmluZWQoUERFQlVHKSAmJiAoUERFQlVHICYgUERFQlVHX0lOSVQpCisJcHJpbnRrKCJzY3NpJWQgOiBpcnEgPSAlZFxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworI2VuZGlmCisKKwlwcmludGsoInNjc2klZCA6IGF0IDB4JTA0eCIsIGluc3RhbmNlLT5ob3N0X25vLCAoaW50KSAKKwkgICAgaW5zdGFuY2UtPmlvX3BvcnQpOworCWlmIChpbnN0YW5jZS0+aXJxID09IFNDU0lfSVJRX05PTkUpCisJICAgIHByaW50ayAoIiBpbnRlcnJ1cHRzIGRpc2FibGVkIik7CisJZWxzZSAKKwkgICAgcHJpbnRrICgiIGlycSAlZCIsIGluc3RhbmNlLT5pcnEpOworCXByaW50aygiIG9wdGlvbnMgQ0FOX1FVRVVFPSVkICBDTURfUEVSX0xVTj0lZCByZWxlYXNlPSVkIiwKKwkgICAgQ0FOX1FVRVVFLCBDTURfUEVSX0xVTiwgUEFTMTZfUFVCTElDX1JFTEVBU0UpOworCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisJcHJpbnRrKCJcbiIpOworCisJKytjdXJyZW50X292ZXJyaWRlOworCSsrY291bnQ7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IHBhczE2X2Jpb3NwYXJhbShEaXNrICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCAqaXApCisgKgorICogUHVycG9zZSA6IEdlbmVyYXRlcyBhIEJJT1MgLyBET1MgY29tcGF0aWJsZSBILUMtUyBtYXBwaW5nIGZvciAKKyAqCXRoZSBzcGVjaWZpZWQgZGV2aWNlIC8gc2l6ZS4KKyAqIAorICogSW5wdXRzIDogc2l6ZSA9IHNpemUgb2YgZGV2aWNlIGluIHNlY3RvcnMgKDUxMiBieXRlcyksIGRldiA9IGJsb2NrIGRldmljZQorICoJbWFqb3IgLyBtaW5vciwgaXBbXSA9IHtoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzfSAgCisgKgorICogUmV0dXJucyA6IGFsd2F5cyAwIChzdWNjZXNzKSwgaW5pdGlhbGl6ZXMgaXAKKyAqCQorICovCisKKy8qIAorICogWFhYIE1vc3QgU0NTSSBib2FyZHMgdXNlIHRoaXMgbWFwcGluZywgSSBjb3VsZCBiZSBpbmNvcnJlY3QuICBTb21lIG9uZQorICogdXNpbmcgaGFyZCBkaXNrcyBvbiBhIHRyYW50b3Igc2hvdWxkIHZlcmlmeSB0aGF0IHRoaXMgbWFwcGluZyBjb3JyZXNwb25kcworICogdG8gdGhhdCB1c2VkIGJ5IHRoZSBCSU9TIC8gQVNQSSBkcml2ZXIgYnkgcnVubmluZyB0aGUgbGludXggZmRpc2sgcHJvZ3JhbQorICogYW5kIG1hdGNoaW5nIHRoZSBIX0NfUyBjb29yZGluYXRlcyB0byB3aGF0IERPUyB1c2VzLgorICovCisKK2ludCBwYXMxNl9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKiBpcCkKK3sKKyAgaW50IHNpemUgPSBjYXBhY2l0eTsKKyAgaXBbMF0gPSA2NDsKKyAgaXBbMV0gPSAzMjsKKyAgaXBbMl0gPSBzaXplID4+IDExOwkJLyogSSB0aGluayBJIGhhdmUgaXQgYXMgLygzMio2NCkgKi8KKyAgaWYoIGlwWzJdID4gMTAyNCApIHsJCS8qIHllcywgPiwgbm90ID49ICovCisJaXBbMF09MjU1OworCWlwWzFdPTYzOworCWlwWzJdPXNpemUvKDYzKjI1NSk7CisJaWYoIGlwWzJdID4gMTAyMyApCS8qIHllcyA+MTAyMy4uLiAqLworCQlpcFsyXSA9IDEwMjM7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcHJlYWQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKyAqCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKKyAqCisgKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgcmVhZCBmdW5jdGlvbiwgdHJhbnNmZXJzIGxlbiBieXRlcyB0byAKKyAqCWRzdAorICogCisgKiBJbnB1dHMgOiBkc3QgPSBkZXN0aW5hdGlvbiwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKKyAqIAl0aW1lb3V0LgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHJlYWQgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpkc3QsCisgICAgaW50IGxlbikgeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgICpkID0gZHN0OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHNob3J0IHJlZyA9ICh1bnNpZ25lZCBzaG9ydCkgKGluc3RhbmNlLT5pb19wb3J0ICsgCisJUF9EQVRBX1JFR19PRkZTRVQpOworICAgIHJlZ2lzdGVyIGludCBpID0gbGVuOworICAgIGludCBpaSA9IDA7CisKKyAgICB3aGlsZSAoICEoaW5iKGluc3RhbmNlLT5pb19wb3J0ICsgUF9TVEFUVVNfUkVHX09GRlNFVCkgJiBQX1NUX1JEWSkgKQorCSArK2lpOworCisgICAgaW5zYiggcmVnLCBkLCBpICk7CisKKyAgICBpZiAoIGluYihpbnN0YW5jZS0+aW9fcG9ydCArIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBQX1RTX1RJTSkgeworCW91dGIoIFBfVFNfQ1QsIGluc3RhbmNlLT5pb19wb3J0ICsgUF9USU1FT1VUX1NUQVRVU19SRUdfT0ZGU0VUKTsKKwlwcmludGsoInNjc2klZCA6IHdhdGNoZG9nIHRpbWVyIGZpcmVkIGluIE5DUjUzODBfcHJlYWQoKVxuIiwKKwkgICAgaW5zdGFuY2UtPmhvc3Rfbm8pOworCXJldHVybiAtMTsKKyAgICB9CisgICBpZiAoaWkgPiBwYXNfbWF4aSkKKyAgICAgIHBhc19tYXhpID0gaWk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3B3cml0ZSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICoJdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQorICoKKyAqIFB1cnBvc2UgOiBGYXN0IDUzODAgcHNldWRvLWRtYSB3cml0ZSBmdW5jdGlvbiwgdHJhbnNmZXJzIGxlbiBieXRlcyBmcm9tCisgKglzcmMKKyAqIAorICogSW5wdXRzIDogc3JjID0gc291cmNlLCBsZW4gPSBsZW5ndGggaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBhIGZhaWx1cmUgc3VjaCBhcyBhIHdhdGNoZG9nIAorICogCXRpbWVvdXQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wd3JpdGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpzcmMsCisgICAgaW50IGxlbikgeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMgPSBzcmM7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgcmVnID0gKGluc3RhbmNlLT5pb19wb3J0ICsgUF9EQVRBX1JFR19PRkZTRVQpOworICAgIHJlZ2lzdGVyIGludCBpID0gbGVuOworICAgIGludCBpaSA9IDA7CisKKyAgICB3aGlsZSAoICEoKGluYihpbnN0YW5jZS0+aW9fcG9ydCArIFBfU1RBVFVTX1JFR19PRkZTRVQpKSAmIFBfU1RfUkRZKSApCisJICsraWk7CisgCisgICAgb3V0c2IoIHJlZywgcywgaSApOworCisgICAgaWYgKGluYihpbnN0YW5jZS0+aW9fcG9ydCArIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBQX1RTX1RJTSkgeworCW91dGIoIFBfVFNfQ1QsIGluc3RhbmNlLT5pb19wb3J0ICsgUF9USU1FT1VUX1NUQVRVU19SRUdfT0ZGU0VUKTsKKwlwcmludGsoInNjc2klZCA6IHdhdGNoZG9nIHRpbWVyIGZpcmVkIGluIE5DUjUzODBfcHdyaXRlKClcbiIsCisJICAgIGluc3RhbmNlLT5ob3N0X25vKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpaSA+IHBhc19tYXhpKQorCSBwYXNfd21heGkgPSBpaTsKKyAgICByZXR1cm4gMDsKK30KKworI2luY2x1ZGUgIk5DUjUzODAuYyIKKworc3RhdGljIGludCBwYXMxNl9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlOQ1I1MzgwX2V4aXQoc2hvc3QpOworCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gMHhmZikKKwkJZnJlZV9kbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lICAgICAgICAgICA9ICJQcm8gQXVkaW8gU3BlY3RydW0tMTYgU0NTSSIsCisJLmRldGVjdCAgICAgICAgID0gcGFzMTZfZGV0ZWN0LAorCS5yZWxlYXNlICAgICAgICA9IHBhczE2X3JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZCAgID0gcGFzMTZfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IHBhczE2X2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciA9IHBhczE2X2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBwYXMxNl9kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IHBhczE2X2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0gICAgID0gcGFzMTZfYmlvc3BhcmFtLCAKKwkuY2FuX3F1ZXVlICAgICAgPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQgICAgICAgID0gNywKKwkuc2dfdGFibGVzaXplICAgPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuICAgID0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nID0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW0ocGFzMTZfYWRkciwgdXNob3J0LCAwKTsKK21vZHVsZV9wYXJhbShwYXMxNl9pcnEsIGludCwgMCk7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wYXMxNi5oIGIvZHJpdmVycy9zY3NpL3BhczE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkNGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wYXMxNi5oCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogVGhpcyBkcml2ZXIgYWRhcHRlZCBmcm9tIERyZXcgRWNraGFyZHQncyBUcmFudG9yIFQxMjggZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcKKyAqCShVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCisgKglkcmV3QGNvbG9yYWRvLmVkdQorICogICAgICArMSAoMzAzKSA2NjYtNTgzNgorICoKKyAqICAoIEJhc2VkIG9uIFQxMjggLSBESVNUUklCVVRJT04gUkVMRUFTRSAzLiApIAorICoKKyAqIE1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgUHJvIEF1ZGlvIFNwZWN0cnVtL1N0dWRpbyAxNgorICogYnkgSm9obiBXZWlkbWFuLgorICoKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogTWVkaWEgVmlzaW9uCisgKiAoNTEwKSA3NzAtODYwMAorICogKDgwMCkgMzQ4LTcxMTYKKyAqIAorICogYW5kIAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKworI2lmbmRlZiBQQVMxNl9ICisjZGVmaW5lIFBBUzE2X0gKKworI2RlZmluZSBQQVMxNl9QVUJMSUNfUkVMRUFTRSAzCisKKyNkZWZpbmUgUERFQlVHX0lOSVQJMHgxCisjZGVmaW5lIFBERUJVR19UUkFOU0ZFUiAweDIKKworI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JBU0VfMSAgMHgzODgKKyNkZWZpbmUgUEFTMTZfREVGQVVMVF9CQVNFXzIgIDB4Mzg0CisjZGVmaW5lIFBBUzE2X0RFRkFVTFRfQkFTRV8zICAweDM4YworI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JBU0VfNCAgMHgyODgKKworI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JPQVJEXzFfSVJRIDEwCisjZGVmaW5lIFBBUzE2X0RFRkFVTFRfQk9BUkRfMl9JUlEgMTIKKyNkZWZpbmUgUEFTMTZfREVGQVVMVF9CT0FSRF8zX0lSUSAxNAorI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JPQVJEXzRfSVJRIDE1CisKKworLyoKKyAqIFRoZSBQcm8gQXVkaW8gU3BlY3RydW0gYm9hcmRzIGFyZSBJL08gbWFwcGVkLiBUaGV5IHVzZSBhIFppbG9nIDUzODAKKyAqIFNDU0kgY29udHJvbGxlciwgd2hpY2ggaXMgdGhlIGVxdWl2YWxlbnQgb2YgTkNSJ3MgNTM4MC4gICJQc2V1ZG8tRE1BIgorICogYXJjaGl0ZWN0dXJlIGlzIHVzZWQsIHdoZXJlIGEgUEFMIGRyaXZlcyB0aGUgRE1BIHNpZ25hbHMgb24gdGhlIDUzODAKKyAqIGFsbG93aW5nIGZhc3QsIGJsaW5kIHRyYW5zZmVycyB3aXRoIHByb3BlciBoYW5kc2hha2luZy4gCisgKi8KKworCisvKiBUaGUgVGltZS1vdXQgQ291bnRlciByZWdpc3RlciBpcyB1c2VkIHRvIHNhZmUtZ3VhcmQgYWdhaW5zdCBhIHN0dWNrCisgKiBidXMgKGluIHRoZSBjYXNlIG9mIFJEWSBkcml2ZW4gaGFuZHNoYWtlKSBvciBhIHN0dWNrIGJ5dGUgKGlmIDE2LUJpdAorICogRE1BIGNvbnZlcnNpb24gaXMgdXNlZCkuICBUaGUgY291bnRlciB1c2VzIGEgMjguMjI0TUh6IGNsb2NrCisgKiBkaXZpZGVkIGJ5IDE0IGFzIGl0cyBjbG9jayBzb3VyY2UuICBJbiB0aGUgY2FzZSBvZiBhIHN0dWNrIGJ5dGUgaW4KKyAqIHRoZSBob2xkaW5nIHJlZ2lzdGVyLCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIChhbmQgbWl4ZWQgd2l0aCB0aGUKKyAqIG9uZSB3aXRoIHRoZSBkcml2ZSkgdXNpbmcgdGhlIENELVJPTSBpbnRlcnJ1cHQgcG9pbnRlci4KKyAqLworIAorI2RlZmluZSBQX1RJTUVPVVRfQ09VTlRFUl9SRUcJMHg0MDAwCisjZGVmaW5lIFBfVENfRElTQUJMRQkweDgwCS8qIFNldCB0byAwIHRvIGVuYWJsZSB0aW1lb3V0IGludC4gKi8KKwkJCQkvKiBCaXRzIEQ2LUQwIGNvbnRhaW4gdGltZW91dCBjb3VudCAqLworCisKKyNkZWZpbmUgUF9USU1FT1VUX1NUQVRVU19SRUdfT0ZGU0VUCTB4NDAwMQorI2RlZmluZSBQX1RTX1RJTQkJMHg4MAkvKiBjaGVjayB0aW1lb3V0IHN0YXR1cyAqLworCQkJCQkvKiBCaXRzIEQ2LUQ0IE4vVSAqLworI2RlZmluZSBQX1RTX0FSTV9EUlFfSU5UCTB4MDgJLyogQXJtIERSUSBJbnQuICBXaGVuIHNldCBoaWdoLAorCQkJCQkgKiB0aGUgbmV4dCByaXNpbmcgZWRnZSB3aWxsCisJCQkJCSAqIGNhdXNlIGEgQ0QtUk9NIGludGVycnVwdC4KKwkJCQkJICogV2hlbiBzZXQgbG93LCB0aGUgaW50ZXJydXB0CisJCQkJCSAqIHdpbGwgYmUgY2xlYXJlZC4gIFRoZXJlIGlzCisJCQkJCSAqIG5vIHN0YXR1cyBhdmFpbGFibGUgZm9yCisJCQkJCSAqIHRoaXMgaW50ZXJydXB0LgorCQkJCQkgKi8KKyNkZWZpbmUgUF9UU19FTkFCTEVfVE9fRVJSX0lOVEVSUlVQVAkvKiBFbmFibGUgdGltZW91dCBlcnJvciBpbnQuICovCisjZGVmaW5lIFBfVFNfRU5BQkxFX1dBSVQJCS8qIEVuYWJsZSBXYWl0ICovCisKKyNkZWZpbmUgUF9UU19DVAkJCTB4MDEJLyogY2xlYXIgdGltZW91dC4gTm90ZTogd3JpdGluZworCQkJCQkgKiB0byB0aGlzIHJlZ2lzdGVyIGNsZWFycyB0aGUKKwkJCQkJICogdGltZW91dCBlcnJvciBpbnQuIG9yIHN0YXR1cworCQkJCQkgKi8KKworCisvKgorICogVGhlIGRhdGEgcmVnaXN0ZXIgcmVhZHMvd3JpdGVzIHRvL2Zyb20gdGhlIDUzODAgaW4gcHNldWRvLURNQSBtb2RlCisgKi8gCisKKyNkZWZpbmUgUF9EQVRBX1JFR19PRkZTRVQJMHg1YzAwCS8qIHJ3ICovCisKKyNkZWZpbmUgUF9TVEFUVVNfUkVHX09GRlNFVAkweDVjMDEJLyogcm8gKi8KKyNkZWZpbmUgUF9TVF9SRFkJCTB4ODAJLyogNTM4MCBERFJRIFN0YXR1cyAqLworCisjZGVmaW5lIFBfSVJRX1NUQVRVUwkJMHg1YzAzCisjZGVmaW5lIFBfSVNfSVJRCQkweDgwCS8qIERJUlEgc3RhdHVzICovCisKKyNkZWZpbmUgUENCX0NPTkZJRyAweDgwMworI2RlZmluZSBNQVNURVJfQUREUkVTU19QVFIgMHg5YTAxICAvKiBGaXhlZCBwb3NpdGlvbiAtIG5vIHJlbG8gKi8KKyNkZWZpbmUgU1lTX0NPTkZJR180IDB4ODAwMworI2RlZmluZSBXQUlUX1NUQVRFIDB4YmMwMAorI2RlZmluZSBPUEVSQVRJT05fTU9ERV8xIDB4ZWMwMworI2RlZmluZSBJT19DT05GSUdfMyAweGYwMDIKKworCisjaWZuZGVmIEFTTQorc3RhdGljIGludCBwYXMxNl9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHBhczE2X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkJICAgc2VjdG9yX3QsIGludCopOworc3RhdGljIGludCBwYXMxNl9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGludCBwYXMxNl9xdWV1ZV9jb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBpbnQgcGFzMTZfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgcGFzMTZfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHBhczE2X2RldmljZV9yZXNldChTY3NpX0NtbmQgKik7CisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gMgorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAzMiAKKyNlbmRpZgorCisjaWZuZGVmIEhPU1RTX0MKKworI2RlZmluZSBOQ1I1MzgwX2ltcGxlbWVudGF0aW9uX2ZpZWxkcyBcCisgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgaW9fcG9ydAorCisjZGVmaW5lIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpIFwKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBpb19wb3J0CisKKyNkZWZpbmUgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSkgXAorICAgIGlvX3BvcnQgPSAoaW5zdGFuY2UpLT5pb19wb3J0CisKKyNkZWZpbmUgUEFTMTZfaW9fcG9ydChyZWcpICggaW9fcG9ydCArIHBhczE2X29mZnNldFsocmVnKV0gKQorCisjaWYgIShQREVCVUcgJiBQREVCVUdfVFJBTlNGRVIpIAorI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKSAoIGluYihQQVMxNl9pb19wb3J0KHJlZykpICkKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSAoIG91dGIoKHZhbHVlKSxQQVMxNl9pb19wb3J0KHJlZykpICkKKyNlbHNlCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpCQkJCQkJXAorICAgICgoKHVuc2lnbmVkIGNoYXIpIHByaW50aygic2NzaSVkIDogcmVhZCByZWdpc3RlciAlZCBhdCBpb19wb3J0ICUwNHhcbiJcCisgICAgLCBpbnN0YW5jZS0+aG9zdG5vLCAocmVnKSwgUEFTMTZfaW9fcG9ydChyZWcpKSksIGluYiggUEFTMTZfaW9fcG9ydChyZWcpKSApCisKKyNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSAJCQkJCVwKKyAgICAocHJpbnRrKCJzY3NpJWQgOiB3cml0ZSAlMDJ4IHRvIHJlZ2lzdGVyICVkIGF0IGlvX3BvcnQgJTA0eFxuIiwgCVwKKwkgICAgaW5zdGFuY2UtPmhvc3RubywgKHZhbHVlKSwgKHJlZyksIFBBUzE2X2lvX3BvcnQocmVnKSksCVwKKyAgICBvdXRiKCAodmFsdWUpLFBBUzE2X2lvX3BvcnQocmVnKSApICkKKworI2VuZGlmCisKKworI2RlZmluZSBOQ1I1MzgwX2ludHIgcGFzMTZfaW50cgorI2RlZmluZSBkb19OQ1I1MzgwX2ludHIgZG9fcGFzMTZfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgcGFzMTZfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX2Fib3J0IHBhczE2X2Fib3J0CisjZGVmaW5lIE5DUjUzODBfZGV2aWNlX3Jlc2V0IHBhczE2X2RldmljZV9yZXNldAorI2RlZmluZSBOQ1I1MzgwX2J1c19yZXNldCBwYXMxNl9idXNfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9ob3N0X3Jlc2V0IHBhczE2X2hvc3RfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8gcGFzMTZfcHJvY19pbmZvCisKKy8qIDE1IDE0IDEyIDEwIDcgNSAzIAorICAgMTEwMSAwMTAwIDEwMTAgMTAwMCAqLworICAgCisjZGVmaW5lIFBBUzE2X0lSUVMgMHhkNGE4IAorCisjZW5kaWYgLyogZWxzZSBkZWYgSE9TVFNfQyAqLworI2VuZGlmIC8qIG5kZWYgQVNNICovCisjZW5kaWYgLyogUEFTMTZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjaTIwMDAuYyBiL2RyaXZlcnMvc2NzaS9wY2kyMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjZTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY2kyMDAwLmMKQEAgLTAsMCArMSw4MzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLiBQQ0ktMjAwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBwY2kyMDAwLmMgLSBMaW51eCBIb3N0IERyaXZlciBmb3IgUENJLTIwMDAgSW50ZWxsaUNhY2hlIFNDU0kgQWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIFRlY2huaWNhbCB1cGRhdGVzIGFuZCBwcm9kdWN0IGluZm9ybWF0aW9uIGF0OgorICogIGh0dHA6Ly93d3cucHNpZGlzay5jb20KKyAqCisgKiBQbGVhc2Ugc2VuZCBxdWVzdGlvbnMsIGNvbW1lbnRzLCBidWcgcmVwb3J0cyB0bzoKKyAqICB0ZWNoQHBzaWRpc2suY29tIFRlY2huaWNhbCBTdXBwb3J0CisgKgorICoKKyAqCVJldmlzaW9ucwkxLjEwCUphbi0yMS0xOTk5CisgKgkJLSBGaXhlZCBzaWduIG9uIG1lc3NhZ2UgdG8gcmVmbGVjdCBwcm9wZXIgY29udHJvbGxlciBuYW1lLgorICoJCS0gQWRkZWQgc3VwcG9ydCBmb3IgUkFJRCBzdGF0dXMgbW9uaXRvcmluZyBhbmQgY29udHJvbC4KKyAqCisgKiAgUmV2aXNpb25zCTEuMTEJTWFyLTIyLTE5OTkKKyAqCQktIEZpeGVkIGNvbnRyb2wgdGltZW91dCB0byBub3QgbG9jayB1cCB0aGUgZW50aXJlIHN5c3RlbSBpZgorICoJCSAgY29udHJvbGxlciBnb2VzIG9mZmxpbmUgY29tcGxldGVseS4KKyAqCisgKglSZXZpc2lvbnMgMS4xMgkJTWFyLTI2LTE5OTkKKyAqCQktIEZpeGVkIHNwaW5sb2NrIGFuZCBQQ0kgY29uZmlndXJhdGlvbi4KKyAqCisgKglSZXZpc2lvbnMgMS4yMAkJTWFyLTI3LTIwMDAKKyAqCQktIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgRE1BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBDSTIwMDBfVkVSU0lPTgkJIjEuMjAiCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAicGNpMjAwMC5oIgorI2luY2x1ZGUgInBzaV9yb3kuaCIKKworCisvLyNkZWZpbmUgREVCVUcgMQorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNkZWZpbmUgU1RPUF9IRVJFCXtpbnQgc3Q7Zm9yKHN0PTA7c3Q8MTAwO3N0Kyspe3N0PTE7fX0KKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2RlZmluZSBTVE9QX0hFUkUKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAorCXsKKwl1bnNpZ25lZCBpbnQJYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJbGVuZ3RoOworCX0JU0NBVEdBVEgsICpQU0NBVEdBVEg7CisKK3R5cGVkZWYgc3RydWN0CisJeworCVNjc2lfQ21uZAkJKlNDcG50OworCVBTQ0FUR0FUSAkJIHNjYXRHYXRoOworCWRtYV9hZGRyX3QJCSBzY2F0R2F0aERtYTsKKwlVQ0hBUgkJCSpjZGI7CisJZG1hX2FkZHJfdAkJIGNkYkRtYTsgCisJVUNIQVIJCQkgdGFnOworCX0JREVWMjAwMCwgKlBERVYyMDAwOworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlVTE9ORwkJCSBiYXNlUG9ydDsKKwlVTE9ORwkJCSBtYjA7CisJVUxPTkcJCQkgbWIxOworCVVMT05HCQkJIG1iMjsKKwlVTE9ORwkJCSBtYjM7CisJVUxPTkcJCQkgbWI0OworCVVMT05HCQkJIGNtZDsKKwlVTE9ORwkJCSB0YWc7CisJVUxPTkcJCQkgaXJxT3duZWQ7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisJREVWMjAwMAkgCQkgZGV2W01BWF9CVVNdW01BWF9VTklUU107CisJfQlBREFQVEVSMjAwMCwgKlBBREFQVEVSMjAwMDsKKworI2RlZmluZSBIT1NUREFUQShob3N0KSAoKFBBREFQVEVSMjAwMCkmaG9zdC0+aG9zdGRhdGEpCisjZGVmaW5lIGNvbnNpc3RlbnRMZW4gKE1BWF9CVVMgKiBNQVhfVU5JVFMgKiAoMTYgKiBzaXplb2YgKFNDQVRHQVRIKSArIE1BWF9DT01NQU5EX1NJWkUpKQorCisKK3N0YXRpYyBzdHJ1Y3QJU2NzaV9Ib3N0IAkgICAqUHNpSG9zdFtNQVhBREFQVEVSXSA9IHtOVUxMLH07ICAvLyBPbmUgZm9yIGVhY2ggYWRhcHRlcgorc3RhdGljCQkJaW50CQkJCU51bUFkYXB0ZXJzID0gMDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOgkJCVdhaXRSZWFkeQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJV2FpdCBmb3IgY29udHJvbGxlciByZWFkeS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgb24gbm90IHJlYWR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXYWl0UmVhZHkgKFBBREFQVEVSMjAwMCBwYWRhcHRlcikKKwl7CisJVUxPTkcJejsKKworCWZvciAoIHogPSAwOyAgeiA8IChUSU1FT1VUX0NPTU1BTkQgKiA0KTsgIHorKyApCisJCXsKKwkJaWYgKCAhaW5iX3AgKHBhZGFwdGVyLT5jbWQpICkKKwkJCXJldHVybiBGQUxTRTsKKwkJdWRlbGF5ICgyNTApOworCQl9OwkJCQkJCQkJCisJcmV0dXJuIFRSVUU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJV2FpdFJlYWR5TG9uZwk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJV2FpdCBmb3IgY29udHJvbGxlciByZWFkeS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgb24gbm90IHJlYWR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXYWl0UmVhZHlMb25nIChQQURBUFRFUjIwMDAgcGFkYXB0ZXIpCisJeworCVVMT05HCXo7CisKKwlmb3IgKCB6ID0gMDsgIHogPCAoNTAwMCAqIDQpOyAgeisrICkKKwkJeworCQlpZiAoICFpbmJfcCAocGFkYXB0ZXItPmNtZCkgKQorCQkJcmV0dXJuIEZBTFNFOworCQl1ZGVsYXkgKDI1MCk7CisJCX07CQkJCQkJCQkKKwlyZXR1cm4gVFJVRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJT3BEb25lCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglDbGVhbiB1cCBvcGVyYXRpb24gYW5kIGlzc3VlIGRvbmUgdG8gY2FsbGVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudAktIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCQkJCQlzdGF0dXMJLSBDYWxsZXIgc3RhdHVzLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgT3BEb25lIChTY3NpX0NtbmQgKlNDcG50LCBVTE9ORyBzdGF0dXMpCisJeworCVNDcG50LT5yZXN1bHQgPSBzdGF0dXM7CisJU0NwbnQtPnNjc2lfZG9uZSAoU0NwbnQpOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglDb21tYW5kCQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJSXNzdWUgcXVldWVkIGNvbW1hbmQgdG8gdGhlIFBDSS0yMDAwLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgdG8gYWRhcHRlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgKgkJCQkJY21kCQkgLSBQQ0ktMjAwMCBjb21tYW5kIGJ5dGUuCisgKgorICoJUmV0dXJuczoJCU5vbi16ZXJvIGNvbW1hbmQgdGFnIGlmIG9wZXJhdGlvbiBpcyBhY2NlcHRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVQ0hBUiBDb21tYW5kIChQQURBUFRFUjIwMDAgcGFkYXB0ZXIsIFVDSEFSIGNtZCkKKwl7CisJb3V0Yl9wIChjbWQsIHBhZGFwdGVyLT5jbWQpOworCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQorCQlyZXR1cm4gMDsKKworCWlmICggaW53X3AgKHBhZGFwdGVyLT5tYjApICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaW5iX3AgKHBhZGFwdGVyLT5tYjEpOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglCdWlsZFNnTGlzdAkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CUJ1aWxkIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0IGZvciBjb250cm9sbGVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudAkgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGFkYXB0ZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBhZGFwdGVyIGRldmljZSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU5vbi16ZXJvIGluIG5vdCBzY2F0dGVyIGdhdGhlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgQnVpbGRTZ0xpc3QgKFNjc2lfQ21uZCAqU0NwbnQsIFBBREFQVEVSMjAwMCBwYWRhcHRlciwgUERFVjIwMDAgcGRldikKKwl7CisJaW50CQkJCQkgejsKKwlpbnQJCQkJCSB6YzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOworCisJaWYgKCBTQ3BudC0+dXNlX3NnICkKKwkJeworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCXpjID0gcGNpX21hcF9zZyAocGFkYXB0ZXItPnBkZXYsIHNnLCBTQ3BudC0+dXNlX3NnLCBzY3NpX3RvX3BjaV9kbWFfZGlyIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJZm9yICggeiA9IDA7ICB6IDwgemM7ICB6KysgKQorCQkJeworCQkJcGRldi0+c2NhdEdhdGhbel0uYWRkcmVzcyA9IGNwdV90b19sZTMyIChzZ19kbWFfYWRkcmVzcyAoc2cpKTsKKwkJCXBkZXYtPnNjYXRHYXRoW3pdLmxlbmd0aCA9IGNwdV90b19sZTMyIChzZ19kbWFfbGVuIChzZysrKSk7CisJCQl9CisJCW91dGwgKHBkZXYtPnNjYXRHYXRoRG1hLCBwYWRhcHRlci0+bWIyKTsKKwkJb3V0bCAoKHpjIDw8IDI0KSB8IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIHBhZGFwdGVyLT5tYjMpOworCQlyZXR1cm4gRkFMU0U7CisJCX0KKwlpZiAoICFTQ3BudC0+cmVxdWVzdF9idWZmbGVuKQorCQl7CisJCW91dGwgKDAsIHBhZGFwdGVyLT5tYjIpOworCQlvdXRsICgwLCBwYWRhcHRlci0+bWIzKTsKKwkJcmV0dXJuIFRSVUU7CisJCX0KKwlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBjaV9tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBzY3NpX3RvX3BjaV9kbWFfZGlyIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwlvdXRsIChTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwgcGFkYXB0ZXItPm1iMik7CisJb3V0bCAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwgcGFkYXB0ZXItPm1iMyk7CisJcmV0dXJuIFRSVUU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUHNpUmFpZENtZAorICoKKyAqCURlc2NyaXB0aW9uOglFeGVjdXRlIGEgc2ltcGxlIGNvbW1hbmQuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlLgorICoJCQkJCWNtZAkJIC0gUm95IGNvbW1hbmQgYnl0ZS4KKyAqCisgKglSZXR1cm5zOgkJUmV0dXJuIGVycm9yIHN0YXR1cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFBzaVJhaWRDbWQgKFBBREFQVEVSMjAwMCBwYWRhcHRlciwgY2hhciBjbWQpCisJeworCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQkJCQkJCS8vIHRlc3QgZm9yIGNvbW1hbmQgcmVnaXN0ZXIgcmVhZHkKKwkJcmV0dXJuIERJRF9USU1FX09VVDsKKwlvdXRiX3AgKGNtZCwgcGFkYXB0ZXItPmNtZCk7CQkJCQkvLyBpc3N1ZSBjb21tYW5kCisJaWYgKCBXYWl0UmVhZHlMb25nIChwYWRhcHRlcikgKQkJCQkJLy8gd2FpdCBmb3IgYWRhcHRlciByZWFkeQorCQlyZXR1cm4gRElEX1RJTUVfT1VUOworCXJldHVybiBESURfT0s7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlycV9IYW5kbGVyCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglJbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJaXJxCQktIEhhcmR3YXJlIElSUSBudW1iZXIuCisgKgkJCQkJZGV2X2lkCS0KKyAqCQkJCQlyZWdzCS0KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBpcyBub3QgcmVhZHkgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBJcnFfSGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKwl7CisJc3RydWN0IFNjc2lfSG9zdCAgICpzaG9zdCA9IE5VTEw7CS8vIFBvaW50ZXIgdG8gaG9zdCBkYXRhIGJsb2NrCisJUEFEQVBURVIyMDAwCQlwYWRhcHRlcjsJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVBERVYyMDAwCQkJcGRldjsKKwlTY3NpX0NtbmQJCSAgICpTQ3BudDsKKwlVQ0hBUgkJCQl0YWcgPSAwOworCVVDSEFSCQkJCXRhZzA7CisJVUxPTkcJCQkJZXJyb3I7CisJaW50CQkJCQlwdW47CisJaW50CQkJCQlidXM7CisJaW50CQkJCQl6OworICAgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworICAgIGludCBoYW5kbGVkID0gMDsKKworCURFQihwcmludGsgKCJcbnBjaTIwMDAgcmVjZWl2ZWQgaW50ZXJydXB0ICIpKTsKKwlmb3IgKCB6ID0gMDsgeiA8IE51bUFkYXB0ZXJzOyAgeisrICkJCQkJCQkJCQkJLy8gc2NhbiBmb3IgaW50ZXJydXB0IHRvIHByb2Nlc3MKKwkJeworCQlpZiAoIFBzaUhvc3Rbel0tPmlycSA9PSAoVUNIQVIpKGlycSAmIDB4RkYpICkKKwkJCXsKKwkJCXRhZyA9IGluYl9wIChIT1NUREFUQShQc2lIb3N0W3pdKS0+dGFnKTsKKwkJCWlmICggIHRhZyApCisJCQkJeworCQkJCXNob3N0ID0gUHNpSG9zdFt6XTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCWlmICggIXNob3N0ICkKKwkJeworCQlERUIgKHByaW50ayAoIlxucGNpMjAwMDogbm90IG15IGludGVycnVwdCIpKTsKKwkJZ290byBvdXQ7CisJCX0KKworICAgIGhhbmRsZWQgPSAxOworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlwYWRhcHRlciA9IEhPU1REQVRBKHNob3N0KTsKKworCXRhZzAgPSB0YWcgJiAweDdGOwkJCQkJCQkJCQkJCQkJCS8vIG1hc2sgb2ZmIHRoZSBlcnJvciBiaXQKKwlmb3IgKCBidXMgPSAwOyAgYnVzIDwgTUFYX0JVUzsgIGJ1cysrICkJCQkJCQkJCQkJLy8gc2NhbiB0aGUgYnVzc2VzCisgICAgCXsKKwkJZm9yICggcHVuID0gMDsgIHB1biA8IE1BWF9VTklUUzsgIHB1bisrICkJCQkJCQkJCS8vIHNjYW4gdGhlIHRhcmdldHMKKyAgICAJCXsKKwkJCXBkZXYgPSAmcGFkYXB0ZXItPmRldltidXNdW3B1bl07CisJCQlpZiAoICFwZGV2LT50YWcgKQorICAgIAkJCWNvbnRpbnVlOworCQkJaWYgKCBwZGV2LT50YWcgPT0gdGFnMCApCQkJCQkJCQkJCQkvLyBpcyB0aGlzIGl0PworCQkJCXsKKwkJCQlwZGV2LT50YWcgPSAwOworCQkJCVNDcG50ID0gcGRldi0+U0NwbnQ7CisJCQkJZ290byB1bm1hcFByb2NlZWQ7CisgICAgCQkJfQorCQkJfQorICAgIAl9CisKKwlvdXRiX3AgKDB4RkYsIHBhZGFwdGVyLT50YWcpOwkJCQkJCQkJCQkJCS8vIGNsZWFyIHRoZSBvcCBpbnRlcnJ1cHQKKwlvdXRiX3AgKENNRF9ET05FLCBwYWRhcHRlci0+Y21kKTsJCQkJCQkJCQkJCS8vIGNvbXBsZXRlIHRoZSBvcAorCWdvdG8gaXJxX3JldHVybjsJCQkJCQkJCQkJCQkJCQkvLyBkb25lLCBidXQsIHdpdGggd2hhdD8KKwordW5tYXBQcm9jZWVkOjsKKwlpZiAoICFidXMgKQorCQl7CisJCXN3aXRjaCAoIFNDcG50LT5jbW5kWzBdICkKKwkJCXsKKwkJCWNhc2UgU0NTSU9QX1RFU1RfVU5JVF9SRUFEWToKKwkJCQlwY2lfdW5tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIHNpemVvZiAoU0NwbnQtPnNlbnNlX2J1ZmZlciksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZ290byBpcnFQcm9jZWVkOworCQkJY2FzZSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWToKKwkJCQlwY2lfdW5tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIDgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZ290byBpcnFQcm9jZWVkOworCQkJY2FzZSBTQ1NJT1BfVkVSSUZZOgorCQkJY2FzZSBTQ1NJT1BfU1RBUlRfU1RPUF9VTklUOgorCQkJY2FzZSBTQ1NJT1BfTUVESVVNX1JFTU9WQUw6CisJCQkJZ290byBpcnFQcm9jZWVkOworCQkJfQorCQl9CisJaWYgKCBTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiApCisJCXBjaV91bm1hcF9zaW5nbGUgKHBhZGFwdGVyLT5wZGV2LCBTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwgc2NzaV90b19wY2lfZG1hX2RpcihTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwllbHNlIAorCQl7CisJCWlmICggU0NwbnQtPnVzZV9zZyApCisJCQlwY2lfdW5tYXBfc2cgKHBhZGFwdGVyLT5wZGV2LCAoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+dXNlX3NnLCBzY3NpX3RvX3BjaV9kbWFfZGlyKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbikpOworCQl9CisKK2lycVByb2NlZWQ6OworCWlmICggdGFnICYgRVJSMDhfVEFHR0VEICkJCQkJCQkJCQkJCQkvLyBpcyB0aGVyZSBhbiBlcnJvciBoZXJlPworCQl7CisJCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQorCQkJeworCQkJT3BEb25lIChTQ3BudCwgRElEX1RJTUVfT1VUIDw8IDE2KTsKKwkJCWdvdG8gaXJxX3JldHVybjsKKwkJCX0KKworCQlvdXRiX3AgKHRhZzAsIHBhZGFwdGVyLT5tYjApOwkJCQkJCQkJCQkvLyBnZXQgcmVhbCBlcnJvciBjb2RlCisJCW91dGJfcCAoQ01EX0VSUk9SLCBwYWRhcHRlci0+Y21kKTsKKwkJaWYgKCBXYWl0UmVhZHkgKHBhZGFwdGVyKSApCQkJCQkJCQkJCQkvLyB3YWl0IGZvciBjb250cm9sbGVyIHRvIHN1Y2sgdXAgdGhlIG9wCisJCQl7CisJCQlPcERvbmUgKFNDcG50LCBESURfVElNRV9PVVQgPDwgMTYpOworCQkJZ290byBpcnFfcmV0dXJuOworCQkJfQorCisJCWVycm9yID0gaW5sIChwYWRhcHRlci0+bWIwKTsJCQkJCQkJCQkJLy8gZ2V0IGVycm9yIGRhdGEKKwkJb3V0Yl9wICgweEZGLCBwYWRhcHRlci0+dGFnKTsJCQkJCQkJCQkJLy8gY2xlYXIgdGhlIG9wIGludGVycnVwdAorCQlvdXRiX3AgKENNRF9ET05FLCBwYWRhcHRlci0+Y21kKTsJCQkJCQkJCQkvLyBjb21wbGV0ZSB0aGUgb3AKKworCQlERUIgKHByaW50ayAoInN0YXR1czogJWxYICIsIGVycm9yKSk7CisJCWlmICggZXJyb3IgPT0gMHgwMDAyMDAwMiApCQkJCQkJCQkJCQkvLyBpcyB0aGlzIGVycm9yIGEgY2hlY2sgY29uZGl0aW9uPworCQkJeworCQkJaWYgKCBidXMgKQkJCQkJCQkJCQkJCQkJLy8gYXJlIHdlIGRvaW50IFNDU0kgY29tbWFuZHM/CisJCQkJeworCQkJCU9wRG9uZSAoU0NwbnQsIChESURfT0sgPDwgMTYpIHwgMik7CisJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCX0KKwkJCWlmICggKlNDcG50LT5jbW5kID09IFNDU0lPUF9URVNUX1VOSVRfUkVBRFkgKQorCQkJCU9wRG9uZSAoU0NwbnQsIChEUklWRVJfU0VOU0UgPDwgMjQpIHwgKERJRF9PSyA8PCAxNikgfCAyKTsJLy8gdGVzdCBjYWxsZXIgd2UgaGF2ZSBzZW5zZSBkYXRhIHRvbworCQkJZWxzZQorCQkJCU9wRG9uZSAoU0NwbnQsIERJRF9FUlJPUiA8PCAxNik7CisJCQlnb3RvIGlycV9yZXR1cm47CisJCQl9CisJCU9wRG9uZSAoU0NwbnQsIERJRF9FUlJPUiA8PCAxNik7CisJCWdvdG8gaXJxX3JldHVybjsKKwkJfQorCisJb3V0Yl9wICgweEZGLCBwYWRhcHRlci0+dGFnKTsJCQkJCQkJCQkJCS8vIGNsZWFyIHRoZSBvcCBpbnRlcnJ1cHQKKwlvdXRiX3AgKENNRF9ET05FLCBwYWRhcHRlci0+Y21kKTsJCQkJCQkJCQkJLy8gY29tcGxldGUgdGhlIG9wCisJT3BEb25lIChTQ3BudCwgRElEX09LIDw8IDE2KTsKKworaXJxX3JldHVybjoKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK291dDoKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMDAwX1F1ZXVlQ29tbWFuZAorICoKKyAqCURlc2NyaXB0aW9uOglQcm9jZXNzIGEgcXVldWVkIGNvbW1hbmQgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCQkJCQlkb25lICAtIFBvaW50ZXIgdG8gZG9uZSBmdW5jdGlvbiB0byBjYWxsLgorICoKKyAqCVJldHVybnM6CQlTdGF0dXMgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQY2kyMDAwX1F1ZXVlQ29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKKwl7CisJVUNIQVIJCSAgICpjZGIgPSAoVUNIQVIgKilTQ3BudC0+Y21uZDsJCQkJCS8vIFBvaW50ZXIgdG8gU0NTSSBDREIKKwlQQURBUFRFUjIwMDAJcGFkYXB0ZXIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KTsJCQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlpbnQJCQkJcmMJCSA9IC0xOwkJCQkJCQkJLy8gY29tbWFuZCByZXR1cm4gY29kZQorCVVDSEFSCQkJYnVzCQkgPSBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsOworCVVDSEFSCQkJcHVuCQkgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwlVQ0hBUgkJCWx1bgkJID0gU0NwbnQtPmRldmljZS0+bHVuOworCVVDSEFSCQkJY21kOworCVBERVYyMDAwCQlwZGV2CSA9ICZwYWRhcHRlci0+ZGV2W2J1c11bcHVuXTsKKworCWlmICggIWRvbmUgKQorCQl7CisJCXByaW50aygicGNpMjAwMF9xdWV1ZWNvbW1hbmQ6ICUwMlg6IGRvbmUgY2FuJ3QgYmUgTlVMTFxuIiwgKmNkYik7CisJCXJldHVybiAwOworCQl9CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKwlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IDA7CisJcGRldi0+U0NwbnQgPSBTQ3BudDsgIAkJCQkJCQkJCS8vIFNhdmUgdGhpcyBjb21tYW5kIGRhdGEKKworCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQorCQl7CisJCXJjID0gRElEX0VSUk9SOworCQlnb3RvIGZpbmlzaGVkOworCQl9CisKKwlvdXR3X3AgKHB1biB8IChsdW4gPDwgOCksIHBhZGFwdGVyLT5tYjApOworCisJaWYgKCBidXMgKQorCQl7CisJCURFQiAoaWYoKmNkYikgcHJpbnRrICgiXG5DREI6ICVYLSAgJVggJVggJVggJVggJVggJVggJVggJVggJVggJVggIiwgU0NwbnQtPmNtZF9sZW4sIGNkYlswXSwgY2RiWzFdLCBjZGJbMl0sIGNkYlszXSwgY2RiWzRdLCBjZGJbNV0sIGNkYls2XSwgY2RiWzddLCBjZGJbOF0sIGNkYls5XSkpOworCQlERUIgKGlmKCpjZGIpIHByaW50ayAoIlxudGltZW91dF9wZXJfY29tbWFuZDogJWQsIHRpbWVvdXRfdG90YWw6ICVkLCB0aW1lb3V0OiAlZCwgaW50ZXJuYWxfdGltb3V0OiAlZCIsIFNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kLAorCQkJCQkJCSAgU0NwbnQtPnRpbWVvdXRfdG90YWwsIFNDcG50LT50aW1lb3V0LCBTQ3BudC0+aW50ZXJuYWxfdGltZW91dCkpOworCQlvdXRsIChTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZCwgcGFkYXB0ZXItPm1iMSk7CisJCW91dGJfcCAoQ01EX1NDU0lfVElNRU9VVCwgcGFkYXB0ZXItPmNtZCk7CisJCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQorCQkJeworCQkJcmMgPSBESURfRVJST1I7CisJCQlnb3RvIGZpbmlzaGVkOworCQkJfQorCisJCW91dHdfcCAocHVuIHwgKGx1biA8PCA4KSwgcGFkYXB0ZXItPm1iMCk7CisJCW91dHdfcCAoU0NwbnQtPmNtZF9sZW4gPDwgOCwgcGFkYXB0ZXItPm1iMCArIDIpOworCQltZW1jcHkgKHBkZXYtPmNkYiwgY2RiLCBNQVhfQ09NTUFORF9TSVpFKTsKKworCQlvdXRsIChwZGV2LT5jZGJEbWEsIHBhZGFwdGVyLT5tYjEpOworCQlpZiAoIEJ1aWxkU2dMaXN0IChTQ3BudCwgcGFkYXB0ZXIsIHBkZXYpICkKKwkJCWNtZCA9IENNRF9TQ1NJX1RIUlU7CisJCWVsc2UKKwkJCWNtZCA9IENNRF9TQ1NJX1RIUlVfU0c7CisJCWlmICggKHBkZXYtPnRhZyA9IENvbW1hbmQgKHBhZGFwdGVyLCBjbWQpKSA9PSAwICkKKwkJCXJjID0gRElEX1RJTUVfT1VUOworCQlnb3RvIGZpbmlzaGVkOworCQl9CisJZWxzZQorCQl7CisJCWlmICggbHVuICkKKwkJCXsKKwkJCXJjID0gRElEX0JBRF9UQVJHRVQ7CisJCQlnb3RvIGZpbmlzaGVkOworCQkJfQorCQl9CisKKwlzd2l0Y2ggKCAqY2RiICkKKwkJeworCQljYXNlIFNDU0lPUF9JTlFVSVJZOiAgIAkJCQkJLy8gaW5xdWlyeSBDREIKKwkJCWlmICggY2RiWzJdID09IFNDX01ZX1JBSUQgKQorCQkJCXsKKwkJCQlzd2l0Y2ggKCBjZGJbM10gKSAKKwkJCQkJeworCQkJCQljYXNlIE1ZX1NDU0lfUkVCVUlMRDoKKwkJCQkJCU9wRG9uZSAoU0NwbnQsIFBzaVJhaWRDbWQgKHBhZGFwdGVyLCBDTURfUkFJRF9SRUJVSUxEKSA8PCAxNik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJY2FzZSBNWV9TQ1NJX0FMQVJNTVVURToKKwkJCQkJCU9wRG9uZSAoU0NwbnQsIFBzaVJhaWRDbWQgKHBhZGFwdGVyLCBDTURfUkFJRF9NVVRFKSA8PCAxNik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJY2FzZSBNWV9TQ1NJX0RFTU9GQUlMOgorCQkJCQkJT3BEb25lIChTQ3BudCwgUHNpUmFpZENtZCAocGFkYXB0ZXIsIENNRF9SQUlEX0ZBSUwpIDw8IDE2KTsKKwkJCQkJCXJldHVybiAwOworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKCBTQ3BudC0+dXNlX3NnICkKKwkJCQkJCQl7CisJCQkJCQkJcmMgPSBESURfRVJST1I7CisJCQkJCQkJZ290byBmaW5pc2hlZDsKKwkJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luID0gcGNpX21hcF9zaW5nbGUgKHBhZGFwdGVyLT5wZGV2LCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkJCQkJCQkJICBzY3NpX3RvX3BjaV9kbWFfZGlyKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbikpOworCQkJCQkJCW91dGwgKFNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luLCBwYWRhcHRlci0+bWIyKTsKKwkJCQkJCQl9CisJCQkJCQlvdXRsIChjZGJbNV0sIHBhZGFwdGVyLT5tYjApOworCQkJCQkJb3V0bCAoY2RiWzNdLCBwYWRhcHRlci0+bWIzKTsKKwkJCQkJCWNtZCA9IENNRF9EQVNEX1JBSURfUlE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJCX0KKwkJCQorCQkJaWYgKCBTQ3BudC0+dXNlX3NnICkKKwkJCQl7CisJCQkJU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gPSBwY2lfbWFwX3NpbmdsZSAocGFkYXB0ZXItPnBkZXYsCisJCQkJCQkJCQkgICgoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyKS0+YWRkcmVzcywKKwkJCQkJCQkJCSAgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCQkJCSAgc2NzaV90b19wY2lfZG1hX2RpciAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IHBjaV9tYXBfc2luZ2xlIChwYWRhcHRlci0+cGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkJCQkJICBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJCQkJICBzY3NpX3RvX3BjaV9kbWFfZGlyIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQl9CisJCQlvdXRsIChTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwgcGFkYXB0ZXItPm1iMik7CisJCQlvdXRsIChTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBwYWRhcHRlci0+bWIzKTsKKwkJCWNtZCA9IENNRF9EQVNEX1NDU0lfSU5ROworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZOgkJCS8vIHRlc3QgdW5pdCByZWFkeSBDREIKKwkJCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luID0gcGNpX21hcF9zaW5nbGUgKHBhZGFwdGVyLT5wZGV2LCBTQ3BudC0+c2Vuc2VfYnVmZmVyLCBzaXplb2YgKFNDcG50LT5zZW5zZV9idWZmZXIpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJb3V0bCAoU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4sIHBhZGFwdGVyLT5tYjIpOworCQkJb3V0bCAoc2l6ZW9mIChTQ3BudC0+c2Vuc2VfYnVmZmVyKSwgcGFkYXB0ZXItPm1iMyk7CisJCQljbWQgPSBDTURfVEVTVF9SRUFEWTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTSU9QX1JFQURfQ0FQQUNJVFk6CQkJICAJLy8gcmVhZCBjYXBhY2l0eSBDREIKKwkJCWlmICggU0NwbnQtPnVzZV9zZyApCisJCQkJeworCQkJCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luID0gcGNpX21hcF9zaW5nbGUgKHBhZGFwdGVyLT5wZGV2LCAoKHN0cnVjdCBzY2F0dGVybGlzdCAqKShTQ3BudC0+cmVxdWVzdF9idWZmZXIpKS0+YWRkcmVzcywKKwkJCQkJCQkJCQkgIDgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJfQorCQkJZWxzZQorCQkJCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luID0gcGNpX21hcF9zaW5nbGUgKHBhZGFwdGVyLT5wZGV2LCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsIDgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlvdXRsIChTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiwgcGFkYXB0ZXItPm1iMik7CisJCQlvdXRsICg4LCBwYWRhcHRlci0+bWIzKTsKKwkJCWNtZCA9IENNRF9EQVNEX0NBUDsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9WRVJJRlk6CQkJCQkJLy8gdmVyaWZ5IENEQgorCQkJb3V0d19wICgoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KSwgcGFkYXB0ZXItPm1iMCArIDIpOworCQkJb3V0bCAoWFNDU0kyTE9ORyAoJmNkYlsyXSksIHBhZGFwdGVyLT5tYjEpOworCQkJY21kID0gQ01EX1JFQURfU0c7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfUkVBRDoJCQkJCQkvLyByZWFkMTAgQ0RCCisJCQlvdXR3X3AgKChVU0hPUlQpY2RiWzhdIHwgKChVU0hPUlQpY2RiWzddIDw8IDgpLCBwYWRhcHRlci0+bWIwICsgMik7CisJCQlvdXRsIChYU0NTSTJMT05HICgmY2RiWzJdKSwgcGFkYXB0ZXItPm1iMSk7CisJCQlpZiAoIEJ1aWxkU2dMaXN0IChTQ3BudCwgcGFkYXB0ZXIsIHBkZXYpICkKKwkJCQljbWQgPSBDTURfUkVBRDsKKwkJCWVsc2UKKwkJCQljbWQgPSBDTURfUkVBRF9TRzsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9SRUFENjoJCQkJCQkvLyByZWFkNiAgQ0RCCisJCQlvdXR3X3AgKGNkYls0XSwgcGFkYXB0ZXItPm1iMCArIDIpOworCQkJb3V0bCAoKFNDU0kyTE9ORyAoJmNkYlsxXSkpICYgMHgwMDFGRkZGRiwgcGFkYXB0ZXItPm1iMSk7CisJCQlpZiAoIEJ1aWxkU2dMaXN0IChTQ3BudCwgcGFkYXB0ZXIsIHBkZXYpICkKKwkJCQljbWQgPSBDTURfUkVBRDsKKwkJCWVsc2UKKwkJCQljbWQgPSBDTURfUkVBRF9TRzsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9XUklURToJCQkJCQkvLyB3cml0ZTEwIENEQgorCQkJb3V0d19wICgoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KSwgcGFkYXB0ZXItPm1iMCArIDIpOworCQkJb3V0bCAoWFNDU0kyTE9ORyAoJmNkYlsyXSksIHBhZGFwdGVyLT5tYjEpOworCQkJaWYgKCBCdWlsZFNnTGlzdCAoU0NwbnQsIHBhZGFwdGVyLCBwZGV2KSApCisJCQkJY21kID0gQ01EX1dSSVRFOworCQkJZWxzZQorCQkJCWNtZCA9IENNRF9XUklURV9TRzsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9XUklURTY6CQkJCQkJLy8gd3JpdGU2ICBDREIKKwkJCW91dHdfcCAoY2RiWzRdLCBwYWRhcHRlci0+bWIwICsgMik7CisJCQlvdXRsICgoU0NTSTJMT05HICgmY2RiWzFdKSkgJiAweDAwMUZGRkZGLCBwYWRhcHRlci0+bWIxKTsKKwkJCWlmICggQnVpbGRTZ0xpc3QgKFNDcG50LCBwYWRhcHRlciwgcGRldikgKQorCQkJCWNtZCA9IENNRF9XUklURTsKKwkJCWVsc2UKKwkJCQljbWQgPSBDTURfV1JJVEVfU0c7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfU1RBUlRfU1RPUF9VTklUOgorCQkJY21kID0gQ01EX0VKRUNUX01FRElBOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX01FRElVTV9SRU1PVkFMOgorCQkJc3dpdGNoICggY2RiWzRdICkKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQljbWQgPSBDTURfVU5MT0NLX0RPT1I7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJY21kID0gQ01EX0xPQ0tfRE9PUjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJY21kID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKCBjbWQgKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCIChwcmludGsgKCJwY2kyMDAwX3F1ZXVlY29tbWFuZDogVW5zdXBwb3J0ZWQgY29tbWFuZCAlMDJYXG4iLCAqY2RiKSk7CisJCQlPcERvbmUgKFNDcG50LCBESURfRVJST1IgPDwgMTYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCWlmICggKHBkZXYtPnRhZyA9IENvbW1hbmQgKHBhZGFwdGVyLCBjbWQpKSA9PSAwICkKKwkJcmMgPSBESURfVElNRV9PVVQ7CitmaW5pc2hlZDo7CisJaWYgKCByYyAhPSAtMSApCisJCU9wRG9uZSAoU0NwbnQsIHJjIDw8IDE2KTsKKwlyZXR1cm4gMDsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjAwMF9EZXRlY3QKKyAqCisgKglEZXNjcmlwdGlvbjoJRGV0ZWN0IGFuZCBpbml0aWFsaXplIG91ciBib2FyZHMuCisgKgorICoJUGFyYW1ldGVyczoJCXRwbnQgLSBQb2ludGVyIHRvIFNDU0kgaG9zdCB0ZW1wbGF0ZSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU51bWJlciBvZiBhZGFwdGVycyBpbnN0YWxsZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjAwMF9EZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKKwl7CisJaW50CQkJCQlmb3VuZCA9IDA7CisJaW50CQkJCQlpbnN0YWxsZWQgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgICAqcHNob3N0OworCVBBREFQVEVSMjAwMAkgICAgcGFkYXB0ZXI7CisJaW50CQkJCQl6LCB6ejsKKwlpbnQJCQkJCXNldGlycTsKKwlzdHJ1Y3QgcGNpX2RldgkgICAqcGRldiA9IE5VTEw7CisJVUNIQVIJCQkgICAqY29uc2lzdGVudDsKKwlkbWFfYWRkcl90CQkJY29uc2lzdGVudERtYTsKKworCXdoaWxlICggKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFZFTkRPUl9QU0ksIERFVklDRV9ST1lfMSwgcGRldikpICE9IE5VTEwgKQorCQl7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJCWNvbnRpbnVlOworCQlwc2hvc3QgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2YoQURBUFRFUjIwMDApKTsKKwkJaWYocHNob3N0ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGFkYXB0ZXIgPSBIT1NUREFUQShwc2hvc3QpOworCisJCXBhZGFwdGVyLT5iYXNlUG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisJCURFQiAocHJpbnRrICgiXG5CYXNlIFJlZ3MgPSAlIzA0WCIsIHBhZGFwdGVyLT5iYXNlUG9ydCkpOwkJCS8vIGdldCB0aGUgYmFzZSBJL08gcG9ydCBhZGRyZXNzCisJCXBhZGFwdGVyLT5tYjAJPSBwYWRhcHRlci0+YmFzZVBvcnQgKyBSVFJfTUFJTEJPWDsJCSAgIAkJCS8vIGdldCB0aGUgMzIgYml0IG1haWwgYm94ZXMKKwkJcGFkYXB0ZXItPm1iMQk9IHBhZGFwdGVyLT5iYXNlUG9ydCArIFJUUl9NQUlMQk9YICsgNDsKKwkJcGFkYXB0ZXItPm1iMgk9IHBhZGFwdGVyLT5iYXNlUG9ydCArIFJUUl9NQUlMQk9YICsgODsKKwkJcGFkYXB0ZXItPm1iMwk9IHBhZGFwdGVyLT5iYXNlUG9ydCArIFJUUl9NQUlMQk9YICsgMTI7CisJCXBhZGFwdGVyLT5tYjQJPSBwYWRhcHRlci0+YmFzZVBvcnQgKyBSVFJfTUFJTEJPWCArIDE2OworCQlwYWRhcHRlci0+Y21kCT0gcGFkYXB0ZXItPmJhc2VQb3J0ICsgUlRSX0xPQ0FMX0RPT1JCRUxMOwkJCS8vIGNvbW1hbmQgcmVnaXN0ZXIKKwkJcGFkYXB0ZXItPnRhZwk9IHBhZGFwdGVyLT5iYXNlUG9ydCArIFJUUl9QQ0lfRE9PUkJFTEw7CQkJLy8gdGFnL3Jlc3BvbnNlIHJlZ2lzdGVyCisJCXBhZGFwdGVyLT5wZGV2ID0gcGRldjsKKworCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJb3V0Yl9wICgweDg0LCBwYWRhcHRlci0+bWIwKTsKKwkJb3V0Yl9wIChDTURfU1BFQ0lGWSwgcGFkYXB0ZXItPmNtZCk7CisJCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQorCQkJZ290byB1bnJlZ2lzdGVyOworCisJCWNvbnNpc3RlbnQgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAocGRldiwgY29uc2lzdGVudExlbiwgJmNvbnNpc3RlbnREbWEpOworCQlpZiAoICFjb25zaXN0ZW50ICkKKwkJCXsKKwkJCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgbWVtb3J5IGZvciBQQ0ktMjAwMCBjb250cm9sbGVyLlxuIik7CisJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQl9CisJCQorCQlzY3NpX3NldF9kZXZpY2UocHNob3N0LCAmcGRldi0+ZGV2KTsKKwkJcHNob3N0LT5pcnEgPSBwZGV2LT5pcnE7CisJCXNldGlycSA9IDE7CisJCXBhZGFwdGVyLT5pcnFPd25lZCA9IDA7CisJCWZvciAoIHogPSAwOyAgeiA8IGluc3RhbGxlZDsgIHorKyApCQkJCQkJCQkJLy8gc2NhbiBmb3Igc2hhcmVkIGludGVycnVwdHMKKwkJCXsKKwkJCWlmICggUHNpSG9zdFt6XS0+aXJxID09IHBzaG9zdC0+aXJxICkJCQkJCQkJLy8gaWYgc2hhcmVkIHRoZW4sIGRvbid0IHBvc3NlcworCQkJCXNldGlycSA9IDA7CisJCQl9CisJCWlmICggc2V0aXJxICkJCQkJCQkJCQkJCQkvLyBpZiBub3Qgc2hhcmVkLCBwb3NzZXMKKwkJCXsKKwkJCWlmICggcmVxdWVzdF9pcnEgKHBzaG9zdC0+aXJxLCBJcnFfSGFuZGxlciwgU0FfU0hJUlEsICJwY2kyMDAwIiwgcGFkYXB0ZXIpIDwgMCApCisJCQkJeworCQkJCWlmICggcmVxdWVzdF9pcnEgKHBzaG9zdC0+aXJxLCBJcnFfSGFuZGxlciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJwY2kyMDAwIiwgcGFkYXB0ZXIpIDwgMCApCisJCQkJCXsKKwkJCQkJcHJpbnRrICgiVW5hYmxlIHRvIGFsbG9jYXRlIElSUSBmb3IgUENJLTIwMDAgY29udHJvbGxlci5cbiIpOworCQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50IChwZGV2LCBjb25zaXN0ZW50TGVuLCBjb25zaXN0ZW50LCBjb25zaXN0ZW50RG1hKTsKKwkJCQkJZ290byB1bnJlZ2lzdGVyOworCQkJCQl9CisJCQkJfQorCQkJcGFkYXB0ZXItPmlycU93bmVkID0gcHNob3N0LT5pcnE7CQkJCQkJLy8gc2V0IElSUSBhcyBvd25lZAorCQkJfQorCQlQc2lIb3N0W2luc3RhbGxlZF0JPSBwc2hvc3Q7CQkJCQkJCQkJCS8vIHNhdmUgU0NTSV9IT1NUIHBvaW50ZXIKKworCQlwc2hvc3QtPmlvX3BvcnQJCT0gcGFkYXB0ZXItPmJhc2VQb3J0OworCQlwc2hvc3QtPm5faW9fcG9ydAk9IDB4RkY7CisJCXBzaG9zdC0+dW5pcXVlX2lkCT0gcGFkYXB0ZXItPmJhc2VQb3J0OworCQlwc2hvc3QtPm1heF9pZAkJPSAxNjsKKwkJcHNob3N0LT5tYXhfY2hhbm5lbAk9IDE7CisKKwkJZm9yICggenogPSAwOyAgenogPCBNQVhfQlVTOyAgenorKyApCisJCQlmb3IgKCB6ID0gMDsgeiA8IE1BWF9VTklUUzsgIHorKyApCisJCQkJeworCQkJCXBhZGFwdGVyLT5kZXZbenpdW3pdLnRhZyA9IDA7CisJCQkJcGFkYXB0ZXItPmRldlt6el1bel0uc2NhdEdhdGggPSAoUFNDQVRHQVRIKWNvbnNpc3RlbnQ7CisJCQkJcGFkYXB0ZXItPmRldlt6el1bel0uc2NhdEdhdGhEbWEgPSBjb25zaXN0ZW50RG1hOworCQkJCWNvbnNpc3RlbnQgKz0gMTYgKiBzaXplb2YgKFNDQVRHQVRIKTsKKwkJCQljb25zaXN0ZW50RG1hICs9IDE2ICogc2l6ZW9mIChTQ0FUR0FUSCk7CisJCQkJcGFkYXB0ZXItPmRldlt6el1bel0uY2RiID0gKFVDSEFSICopY29uc2lzdGVudDsKKwkJCQlwYWRhcHRlci0+ZGV2W3p6XVt6XS5jZGJEbWEgPSBjb25zaXN0ZW50RG1hOworCQkJCWNvbnNpc3RlbnQgKz0gTUFYX0NPTU1BTkRfU0laRTsKKwkJCQljb25zaXN0ZW50RG1hICs9IE1BWF9DT01NQU5EX1NJWkU7CisJCQkJfQorCQkJCisJCXByaW50aygiXG5QU0ktMjAwMCBJbnRlbGxpZ2VudCBTdG9yYWdlIFNDU0kgQ09OVFJPTExFUjogYXQgSS9PID0gJWxYICBJUlEgPSAlZFxuIiwgcGFkYXB0ZXItPmJhc2VQb3J0LCBwc2hvc3QtPmlycSk7CisJCXByaW50aygiVmVyc2lvbiAlcywgQ29tcGlsZWQgJXMgJXNcblxuIiwgUENJMjAwMF9WRVJTSU9OLCAgX19EQVRFX18sIF9fVElNRV9fKTsKKwkJZm91bmQrKzsKKwkJaWYgKCArK2luc3RhbGxlZCA8IE1BWEFEQVBURVIgKQorCQkJY29udGludWU7CisJCWJyZWFrOwordW5yZWdpc3Rlcjo7CisJCXNjc2lfdW5yZWdpc3RlciAocHNob3N0KTsKKwkJZm91bmQrKzsKKwkJfQorCU51bUFkYXB0ZXJzID0gaW5zdGFsbGVkOworCXJldHVybiBpbnN0YWxsZWQ7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIwMDBfQWJvcnQKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyB0aGUgQWJvcnQgY29tbWFuZCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIuCisgKgorICoJUGFyYW1ldGVyczoJCVNDcG50IC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlBbGx3YXlzIHNub296ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQY2kyMDAwX0Fib3J0IChTY3NpX0NtbmQgKlNDcG50KQorCXsKKwlERUIgKHByaW50ayAoInBjaTIwMDBfYWJvcnRcbiIpKTsKKwlyZXR1cm4gU0NTSV9BQk9SVF9TTk9PWkU7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIwMDBfUmVzZXQKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyB0aGUgUmVzZXQgY29tbWFuZCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIuCisgKgorICoJUGFyYW1ldGVyczoJCVNDcG50IC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCWZsYWdzIC0gRmxhZ3MgYWJvdXQgdGhlIHJlc2V0IGNvbW1hbmQKKyAqCisgKglSZXR1cm5zOgkJTm8gYWN0aXZlIGNvbW1hbmQgYXQgdGhpcyB0aW1lLCBzbyB0aGlzIG1lYW5zCisgKgkJCQkJdGhhdCBlYWNoIHRpbWUgd2UgZ290IHNvbWUga2luZCBvZiByZXNwb25zZSB0aGUKKyAqCQkJCQlsYXN0IHRpbWUgdGhyb3VnaC4gIFRlbGwgdGhlIG1pZC1sZXZlbCBjb2RlIHRvCisgKgkJCQkJcmVxdWVzdCBzZW5zZSBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBkZWNpZGUgd2hhdAorICoJCQkJCXRvIGRvIG5leHQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjAwMF9SZXNldCAoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IHJlc2V0X2ZsYWdzKQorCXsKKwlyZXR1cm4gU0NTSV9SRVNFVF9QVU5UOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMDAwX1JlbGVhc2UKKyAqCisgKglEZXNjcmlwdGlvbjoJUmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHNpbmdsZSBlYWNoIGFkYXB0ZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBzaG9zdCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJemVyby4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQY2kyMDAwX1JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCkKKwl7CisgICAgUEFEQVBURVIyMDAwCXBhZGFwdGVyID0gSE9TVERBVEEgKHBzaG9zdCk7CisKKwlpZiAoIHBhZGFwdGVyLT5pcnFPd25lZCApCisJCWZyZWVfaXJxIChwc2hvc3QtPmlycSwgcGFkYXB0ZXIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBhZGFwdGVyLT5wZGV2LCBjb25zaXN0ZW50TGVuLCBwYWRhcHRlci0+ZGV2WzBdWzBdLnNjYXRHYXRoLCBwYWRhcHRlci0+ZGV2WzBdWzBdLnNjYXRHYXRoRG1hKTsKKwlyZWxlYXNlX3JlZ2lvbiAocHNob3N0LT5pb19wb3J0LCBwc2hvc3QtPm5faW9fcG9ydCk7CisgICAgc2NzaV91bnJlZ2lzdGVyKHBzaG9zdCk7CisgICAgcmV0dXJuIDA7CisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjAwMF9CaW9zUGFyYW0KKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyB0aGUgYmlvc3BhcmFtIHJlcXVlc3QgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyIHRvCisgKgkJCQkJcmV0dXJuIEMvSC9TIGRhdGEuCisgKgorICoJUGFyYW1ldGVyczoJCWRpc2sgLSBQb2ludGVyIHRvIFNDU0kgZGlzayBzdHJ1Y3R1cmUuCisgKgkJCQkJZGV2CSAtIE1ham9yL21pbm9yIG51bWJlciBmcm9tIGtlcm5lbC4KKyAqCQkJCQlnZW9tIC0gUG9pbnRlciB0byBpbnRlZ2VyIGFycmF5IHRvIHBsYWNlIGdlb21ldHJ5IGRhdGEuCisgKgorICoJUmV0dXJuczoJCXplcm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjAwMF9CaW9zUGFyYW0gKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSkKKwl7CisJUEFEQVBURVIyMDAwCSAgICBwYWRhcHRlcjsKKworCXBhZGFwdGVyID0gSE9TVERBVEEoc2Rldi0+aG9zdCk7CisKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJcmV0dXJuIDA7CisJb3V0Yl9wIChzZGV2LT5pZCwgcGFkYXB0ZXItPm1iMCk7CisJb3V0Yl9wIChDTURfR0VUX1BBUk1TLCBwYWRhcHRlci0+Y21kKTsKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJcmV0dXJuIDA7CisKKwlnZW9tWzBdID0gaW5iX3AgKHBhZGFwdGVyLT5tYjIgKyAzKTsKKwlnZW9tWzFdID0gaW5iX3AgKHBhZGFwdGVyLT5tYjIgKyAyKTsKKwlnZW9tWzJdID0gaW53X3AgKHBhZGFwdGVyLT5tYjIpOworCXJldHVybiAwOworCX0KKworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJPSAicGNpMjAwMCIsCisJLm5hbWUJCT0gIlBDSS0yMDAwIFNDU0kgSW50ZWxsaWdlbnQgRGlzayBDb250cm9sbGVyIiwKKwkuZGV0ZWN0CQk9IFBjaTIwMDBfRGV0ZWN0LAorCS5yZWxlYXNlCT0gUGNpMjAwMF9SZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJPSBQY2kyMDAwX1F1ZXVlQ29tbWFuZCwKKwkuYWJvcnQJCT0gUGNpMjAwMF9BYm9ydCwKKwkucmVzZXQJCT0gUGNpMjAwMF9SZXNldCwKKwkuYmlvc19wYXJhbQk9IFBjaTIwMDBfQmlvc1BhcmFtLAorCS5jYW5fcXVldWUJPSAxNiwKKwkudGhpc19pZAk9IC0xLAorCS5zZ190YWJsZXNpemUJPSAxNiwKKwkuY21kX3Blcl9sdW4JPSAxLAorCS51c2VfY2x1c3RlcmluZwk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY2kyMDAwLmggYi9kcml2ZXJzL3Njc2kvcGNpMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWFmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNpMjAwMC5oCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4gUENJLTIwMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogcGNpMjAwMC5oIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIFBDSS0yMDAwIEludGVsbGlDYWNoZSBTQ1NJIEFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlCisgKiBjb2RlIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBjb21tZW50IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbi4KKyAqCisgKiBUZWNobmljYWwgdXBkYXRlcyBhbmQgcHJvZHVjdCBpbmZvcm1hdGlvbiBhdDoKKyAqICBodHRwOi8vd3d3LnBzaWRpc2suY29tCisgKgorICogUGxlYXNlIHNlbmQgcXVlc3Rpb25zLCBjb21tZW50cywgYnVnIHJlcG9ydHMgdG86CisgKiAgdGVjaEBwc2lkaXNrLmNvbSBUZWNobmljYWwgU3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfUENJMjAwMF9ICisjZGVmaW5lIF9QQ0kyMDAwX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZm5kZWYJUFNJX0VJREVfU0NTSU9QCisjZGVmaW5lCVBTSV9FSURFX1NDU0lPUAkxCisKKyNpZm5kZWYgTElOVVhfVkVSU0lPTl9DT0RFCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2VuZGlmIAorI2RlZmluZQlMSU5VWFZFUlNJT04odixwLHMpICAgICgoKHYpPDwxNikgKyAoKHApPDw4KSArIChzKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlkZWZpbml0aW9uIG9mIHN0YW5kYXJkIGRhdGEgdHlwZXMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDSEFSCWNoYXIKKyNkZWZpbmUJVUNIQVIJdW5zaWduZWQgY2hhcgorI2RlZmluZQlTSE9SVAlzaG9ydAorI2RlZmluZQlVU0hPUlQJdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUJQk9PTAlsb25nCisjZGVmaW5lCUxPTkcJbG9uZworI2RlZmluZQlVTE9ORwl1bnNpZ25lZCBsb25nCisjZGVmaW5lCVZPSUQJdm9pZAorCit0eXBlZGVmCUNIQVIJKlBDSEFSOwordHlwZWRlZglVQ0hBUgkqUFVDSEFSOwordHlwZWRlZglTSE9SVAkqUFNIT1JUOwordHlwZWRlZglVU0hPUlQJKlBVU0hPUlQ7Cit0eXBlZGVmCUJPT0wJKlBCT09MOwordHlwZWRlZglMT05HCSpQTE9ORzsKK3R5cGVkZWYJVUxPTkcJKlBVTE9ORzsKK3R5cGVkZWYJVk9JRAkqUFZPSUQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlNaXNjLiBtYWNyb3MJCQkgCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBTlkyU0NTSSh1cCwgcCkJCQkJCVwKKygoVUNIQVIgKil1cClbMF0gPSAoKChVTE9ORykocCkpID4+IDgpOwlcCisoKFVDSEFSICopdXApWzFdID0gKChVTE9ORykocCkpOworCisjZGVmaW5lIFNDU0kyTE9ORyh1cCkJCQkJCVwKKyggKCgobG9uZykqKCgoVUNIQVIgKil1cCkpKSA8PCAxNikJCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsxXSkpIDw8IDgpCQlcCisrICgobG9uZykoKChVQ0hBUiAqKXVwKVsyXSkpICkKKworI2RlZmluZSBYQU5ZMlNDU0kodXAsIHApCQkJCVwKKygoVUNIQVIgKil1cClbMF0gPSAoKGxvbmcpKHApKSA+PiAyNDsJXAorKChVQ0hBUiAqKXVwKVsxXSA9ICgobG9uZykocCkpID4+IDE2OwlcCisoKFVDSEFSICopdXApWzJdID0gKChsb25nKShwKSkgPj4gODsJXAorKChVQ0hBUiAqKXVwKVszXSA9ICgobG9uZykocCkpOworCisjZGVmaW5lIFhTQ1NJMkxPTkcodXApCQkJCQlcCisoICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMF0pKSA8PCAyNCkJXAorKyAoKChsb25nKSgoKFVDSEFSICopdXApWzFdKSkgPDwgMTYpCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsyXSkpIDw8ICA4KQlcCisrICgobG9uZykoKChVQ0hBUiAqKXVwKVszXSkpICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlTQ1NJIENEQiBvcGVyYXRpb24gY29kZXMgCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZCQkweDAwCisjZGVmaW5lIFNDU0lPUF9SRVpFUk9fVU5JVAkJCTB4MDEKKyNkZWZpbmUgU0NTSU9QX1JFV0lORAkJCQkweDAxCisjZGVmaW5lIFNDU0lPUF9SRVFVRVNUX0JMT0NLX0FERFIJMHgwMgorI2RlZmluZSBTQ1NJT1BfUkVRVUVTVF9TRU5TRQkJMHgwMworI2RlZmluZSBTQ1NJT1BfRk9STUFUX1VOSVQJCQkweDA0CisjZGVmaW5lIFNDU0lPUF9SRUFEX0JMT0NLX0xJTUlUUwkweDA1CisjZGVmaW5lIFNDU0lPUF9SRUFTU0lHTl9CTE9DS1MJCTB4MDcKKyNkZWZpbmUgU0NTSU9QX1JFQUQ2CQkJCTB4MDgKKyNkZWZpbmUgU0NTSU9QX1JFQ0VJVkUJCQkJMHgwOAorI2RlZmluZSBTQ1NJT1BfV1JJVEU2CQkJCTB4MEEKKyNkZWZpbmUgU0NTSU9QX1BSSU5UCQkJCTB4MEEKKyNkZWZpbmUgU0NTSU9QX1NFTkQJCQkJCTB4MEEKKyNkZWZpbmUgU0NTSU9QX1NFRUs2CQkJCTB4MEIKKyNkZWZpbmUgU0NTSU9QX1RSQUNLX1NFTEVDVAkJCTB4MEIKKyNkZWZpbmUgU0NTSU9QX1NMRVdfUFJJTlQJCQkweDBCCisjZGVmaW5lIFNDU0lPUF9TRUVLX0JMT0NLCQkJMHgwQworI2RlZmluZSBTQ1NJT1BfUEFSVElUSU9OCQkJMHgwRAorI2RlZmluZSBTQ1NJT1BfUkVBRF9SRVZFUlNFCQkJMHgwRgorI2RlZmluZSBTQ1NJT1BfV1JJVEVfRklMRU1BUktTCQkweDEwCisjZGVmaW5lIFNDU0lPUF9GTFVTSF9CVUZGRVIJCQkweDEwCisjZGVmaW5lIFNDU0lPUF9TUEFDRQkJCQkweDExCisjZGVmaW5lIFNDU0lPUF9JTlFVSVJZCQkJCTB4MTIKKyNkZWZpbmUgU0NTSU9QX1ZFUklGWTYJCQkJMHgxMworI2RlZmluZSBTQ1NJT1BfUkVDT1ZFUl9CVUZfREFUQQkJMHgxNAorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRUxFQ1QJCQkweDE1CisjZGVmaW5lIFNDU0lPUF9SRVNFUlZFX1VOSVQJCQkweDE2CisjZGVmaW5lIFNDU0lPUF9SRUxFQVNFX1VOSVQJCQkweDE3CisjZGVmaW5lIFNDU0lPUF9DT1BZCQkJCQkweDE4CisjZGVmaW5lIFNDU0lPUF9FUkFTRQkJCQkweDE5CisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTlNFCQkJMHgxQQorI2RlZmluZSBTQ1NJT1BfU1RBUlRfU1RPUF9VTklUCQkweDFCCisjZGVmaW5lIFNDU0lPUF9TVE9QX1BSSU5UCQkJMHgxQgorI2RlZmluZSBTQ1NJT1BfTE9BRF9VTkxPQUQJCQkweDFCCisjZGVmaW5lIFNDU0lPUF9SRUNFSVZFX0RJQUdOT1NUSUMJMHgxQworI2RlZmluZSBTQ1NJT1BfU0VORF9ESUFHTk9TVElDCQkweDFECisjZGVmaW5lIFNDU0lPUF9NRURJVU1fUkVNT1ZBTAkJMHgxRQorI2RlZmluZSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWQkJMHgyNQorI2RlZmluZSBTQ1NJT1BfUkVBRAkJCQkJMHgyOAorI2RlZmluZSBTQ1NJT1BfV1JJVEUJCQkJMHgyQQorI2RlZmluZSBTQ1NJT1BfU0VFSwkJCQkJMHgyQgorI2RlZmluZSBTQ1NJT1BfTE9DQVRFCQkJCTB4MkIKKyNkZWZpbmUgU0NTSU9QX1dSSVRFX1ZFUklGWQkJCTB4MkUKKyNkZWZpbmUgU0NTSU9QX1ZFUklGWQkJCQkweDJGCisjZGVmaW5lIFNDU0lPUF9TRUFSQ0hfREFUQV9ISUdICQkweDMwCisjZGVmaW5lIFNDU0lPUF9TRUFSQ0hfREFUQV9FUVVBTAkweDMxCisjZGVmaW5lIFNDU0lPUF9TRUFSQ0hfREFUQV9MT1cJCTB4MzIKKyNkZWZpbmUgU0NTSU9QX1NFVF9MSU1JVFMJCQkweDMzCisjZGVmaW5lIFNDU0lPUF9SRUFEX1BPU0lUSU9OCQkweDM0CisjZGVmaW5lIFNDU0lPUF9TWU5DSFJPTklaRV9DQUNIRQkweDM1CisjZGVmaW5lIFNDU0lPUF9DT01QQVJFCQkJCTB4MzkKKyNkZWZpbmUgU0NTSU9QX0NPUFlfQ09NUEFSRQkJCTB4M0EKKyNkZWZpbmUgU0NTSU9QX1dSSVRFX0RBVEFfQlVGRgkJMHgzQgorI2RlZmluZSBTQ1NJT1BfUkVBRF9EQVRBX0JVRkYJCTB4M0MKKyNkZWZpbmUgU0NTSU9QX0NIQU5HRV9ERUZJTklUSU9OCTB4NDAKKyNkZWZpbmUgU0NTSU9QX1JFQURfU1VCX0NIQU5ORUwJCTB4NDIKKyNkZWZpbmUgU0NTSU9QX1JFQURfVE9DCQkJCTB4NDMKKyNkZWZpbmUgU0NTSU9QX1JFQURfSEVBREVSCQkJMHg0NAorI2RlZmluZSBTQ1NJT1BfUExBWV9BVURJTwkJCTB4NDUKKyNkZWZpbmUgU0NTSU9QX1BMQVlfQVVESU9fTVNGCQkweDQ3CisjZGVmaW5lIFNDU0lPUF9QTEFZX1RSQUNLX0lOREVYCQkweDQ4CisjZGVmaW5lIFNDU0lPUF9QTEFZX1RSQUNLX1JFTEFUSVZFCTB4NDkKKyNkZWZpbmUgU0NTSU9QX1BBVVNFX1JFU1VNRQkJCTB4NEIKKyNkZWZpbmUgU0NTSU9QX0xPR19TRUxFQ1QJCQkweDRDCisjZGVmaW5lIFNDU0lPUF9MT0dfU0VOU0UJCQkweDRECisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTEVDVDEwCQkweDU1CisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTlNFMTAJCQkweDVBCisjZGVmaW5lIFNDU0lPUF9MT0FEX1VOTE9BRF9TTE9UCQkweEE2CisjZGVmaW5lIFNDU0lPUF9NRUNIQU5JU01fU1RBVFVTCQkweEJECisjZGVmaW5lIFNDU0lPUF9SRUFEX0NECQkJCTB4QkUKKworLy8gU0NTSSByZWFkIGNhcGFjaXR5IHN0cnVjdHVyZQordHlwZWRlZglzdHJ1Y3QgX1JFQURfQ0FQQUNJVFlfREFUQQorCXsKKwlVTE9ORyBibGtzOwkJCQkvKiB0b3RhbCBibG9ja3MgKGNvbnZlcnRlZCB0byBsaXR0bGUgZW5kaWFuKSAqLworCVVMT05HIGJsa3NpejsJCQkvKiBzaXplIG9mIGVhY2ggKGNvbnZlcnRlZCB0byBsaXR0bGUgZW5kaWFuKSAqLworCX0JUkVBRF9DQVBBQ0lUWV9EQVRBLCAqUFJFQURfQ0FQQUNJVFlfREFUQTsKKworLy8gU0NTSSBpbnF1aXJ5IGRhdGEKK3R5cGVkZWYgc3RydWN0IF9JTlFVSVJZREFUQQorCXsKKwlVQ0hBUiBEZXZpY2VUeXBlCQkJOjU7CisJVUNIQVIgRGV2aWNlVHlwZVF1YWxpZmllcgk6MzsKKwlVQ0hBUiBEZXZpY2VUeXBlTW9kaWZpZXIJOjc7CisJVUNIQVIgUmVtb3ZhYmxlTWVkaWEJCToxOworICAgIFVDSEFSIFZlcnNpb25zOworICAgIFVDSEFSIFJlc3BvbnNlRGF0YUZvcm1hdDsKKyAgICBVQ0hBUiBBZGRpdGlvbmFsTGVuZ3RoOworICAgIFVDSEFSIFJlc2VydmVkWzJdOworCVVDSEFSIFNvZnRSZXNldAkJCQk6MTsKKwlVQ0hBUiBDb21tYW5kUXVldWUJCQk6MTsKKwlVQ0hBUiBSZXNlcnZlZDIJCQkJOjE7CisJVUNIQVIgTGlua2VkQ29tbWFuZHMJCToxOworCVVDSEFSIFN5bmNocm9ub3VzCQkJOjE7CisJVUNIQVIgV2lkZTE2Qml0CQkJCToxOworCVVDSEFSIFdpZGUzMkJpdAkJCQk6MTsKKwlVQ0hBUiBSZWxhdGl2ZUFkZHJlc3NpbmcJOjE7CisgICAgVUNIQVIgVmVuZG9ySWRbOF07CisgICAgVUNIQVIgUHJvZHVjdElkWzE2XTsKKyAgICBVQ0hBUiBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsKKyAgICBVQ0hBUiBWZW5kb3JTcGVjaWZpY1syMF07CisgICAgVUNIQVIgUmVzZXJ2ZWQzWzQwXTsKKwl9CUlOUVVJUllEQVRBLCAqUElOUVVJUllEQVRBOworCisjZW5kaWYKKworLy8gZnVuY3Rpb24gcHJvdG90eXBlcworaW50IFBjaTIwMDBfRGV0ZWN0CQkJKFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCk7CitpbnQgUGNpMjAwMF9Db21tYW5kCQkJKFNjc2lfQ21uZCAqU0NwbnQpOworaW50IFBjaTIwMDBfUXVldWVDb21tYW5kCShTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCBQY2kyMDAwX0Fib3J0CQkJKFNjc2lfQ21uZCAqU0NwbnQpOworaW50IFBjaTIwMDBfUmVzZXQJCQkoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBQY2kyMDAwX1JlbGVhc2UJCQkoc3RydWN0IFNjc2lfSG9zdCAqcHNob3N0KTsKK2ludCBQY2kyMDAwX0Jpb3NQYXJhbQkJKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY2kyMjIwaS5jIGIvZHJpdmVycy9zY3NpL3BjaTIyMjBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NWU0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY2kyMjIwaS5jCkBAIC0wLDAgKzEsMjkxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBDSS0yMjIwSSBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBwY2kyMjIwaS5jIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIFBDSS0yMjIwSSBFSURFIFJBSUQgQWRhcHRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIFRlY2huaWNhbCB1cGRhdGVzIGFuZCBwcm9kdWN0IGluZm9ybWF0aW9uIGF0OgorICogIGh0dHA6Ly93d3cucHNpZGlzay5jb20KKyAqCisgKiBQbGVhc2Ugc2VuZCBxdWVzdGlvbnMsIGNvbW1lbnRzLCBidWcgcmVwb3J0cyB0bzoKKyAqICB0ZWNoQHBzaWRpc2suY29tIFRlY2huaWNhbCBTdXBwb3J0CisgKgorICoKKyAqCVJldmlzaW9ucyAxLjEwCQlNYXItMjYtMTk5OQorICoJCS0gVXBkYXRlZCBkcml2ZXIgZm9yIFJBSUQgYW5kIGhvdCByZWNvbnN0cnVjdCBzdXBwb3J0LgorICoKKyAqCVJldmlzaW9ucyAxLjExCQlNYXItMjYtMTk5OQorICoJCS0gRml4ZWQgc3BpbmxvY2sgYW5kIFBDSSBjb25maWd1cmF0aW9uLgorICoKKyAqCVJldmlzaW9uIDIuMDAJCURlY2VtYmVyLTEtMTk5OQorICoJCS0gQWRkZWQgY29kZSBmb3IgdGhlIFBDSS0yMjQwSSBjb250cm9sbGVyCisgKgkJLSBBZGRlZCBjb2RlIGZvciBBVEFQSSBkZXZpY2VzLgorICoJCS0gRG91YmxlIGJ1ZmZlciBmb3Igc2NhdHRlci9nYXRoZXIgc3VwcG9ydAorICoKKyAqCVJldmlzaW9uIDIuMTAJCU1hcmNoLTI3LTIwMDAKKyAqCQktIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgRE1BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlcnJvciBDb252ZXJ0IG1lIHRvIHVuZGVyc3RhbmQgcGFnZStvZmZzZXQgYmFzZWQgc2NhdHRlcmxpc3RzCisKKy8vI2RlZmluZSBERUJVRyAxCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAicGNpMjIyMGkuaCIKKyNpbmNsdWRlICJwc2lfZGFsZS5oIgorCisKKyNkZWZpbmUJUENJMjIyMElfVkVSU0lPTgkJIjIuMTAiCisjZGVmaW5lCVJFQURfQ01ECQkJCUlERV9DTURfUkVBRF9NVUxUSVBMRQorI2RlZmluZQlXUklURV9DTUQJCQkJSURFX0NNRF9XUklURV9NVUxUSVBMRQorI2RlZmluZQlNQVhfQlVTX01BU1RFUl9CTE9DS1MJU0VDVE9SU1hGRVIJCS8vIFRoaXMgaXMgdGhlIG1heGltdW0gd2UgY2FuIGJ1cyBtYXN0ZXIKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERFQih4KSB4CisjZGVmaW5lIFNUT1BfSEVSRSgpCXtpbnQgc3Q7Zm9yKHN0PTA7c3Q8MTAwO3N0Kyspe3N0PTE7fX0KKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2RlZmluZSBTVE9QX0hFUkUoKQorI2VuZGlmCisKKyNkZWZpbmUgTUFYQURBUFRFUiA0CQkJCQkvLyBJbmNyZWFzZSB0aGlzIGFuZCB0aGUgc2l6ZXMgb2YgdGhlIGFycmF5cyBiZWxvdywgaWYgeW91IG5lZWQgbW9yZS4KKworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlVQ0hBUgkJCWJ5dGU2OwkJCQkvLyBkZXZpY2Ugc2VsZWN0IHJlZ2lzdGVyIGltYWdlCisJVUNIQVIJCQlzcGlnb3Q7CQkJCS8vIHNwaWdvdCBudW1iZXIKKwlVQ0hBUgkJCXNwaWdvdHNbMl07CQkJLy8gUkFJRCBzcGlnb3RzCisJVUNIQVIJCQlkZXZpY2VJRFsyXTsJCS8vIGRldmljZSBJRCBjb2RlcworCVVTSE9SVAkJCXNlY3RvcnM7CQkJLy8gbnVtYmVyIG9mIHNlY3RvcnMgcGVyIHRyYWNrCisJVVNIT1JUCQkJaGVhZHM7CQkJCS8vIG51bWJlciBvZiBoZWFkcworCVVTSE9SVAkJCWN5bGluZGVyczsJCQkvLyBudW1iZXIgb2YgY3lsaW5kZXJzIGZvciB0aGlzIGRldmljZQorCVVTSE9SVAkJCXNwYXJld29yZDsJCQkvLyBwbGFjZWhvbGRlcgorCVVMT05HCQkJYmxvY2tzOwkJCQkvLyBudW1iZXIgb2YgYmxvY2tzIG9uIGRldmljZQorCURJU0tfTUlSUk9SCQlEaXNrTWlycm9yWzJdOwkJLy8gUkFJRCBzdGF0dXMgYW5kIGNvbnRyb2wKKwlVTE9ORwkJCWxhc3RzZWN0b3JsYmFbMl07CS8vIGxhc3QgYWRkcmVzc2FibGUgc2VjdG9yIG9uIHRoZSBkcml2ZQorCVVTSE9SVAkJCXJhaWQ7CQkJCS8vIFJBSUQgYWN0aXZlIGZsYWcKKwlVU0hPUlQJCQltaXJyb3JSZWNvbjsKKwlVQ0hBUgkJCXJlY29uT247CisJVVNIT1JUCQkJcmVjb25Db3VudDsKKwlVU0hPUlQJCQlyZWNvbklzU3RhcnRpbmc7CS8vIGluZGljYXRlIGhvdCByZWNvbnN0cnVjdCBpcyBzdGFydGluZworCVVDSEFSCQkJY21kRHJxSW50OwkJCS8vIGZsYWcgZm9yIGNvbW1hbmQgaW50ZXJydXB0CisJVUNIQVIJCQlwYWNrZXQ7CQkJCS8vIGNvbW1hbmQgcGFja2V0IHNpemUgaW4gYnl0ZXMKKwl9CU9VUl9ERVZJQ0UsICpQT1VSX0RFVklDRTsJCisKK3R5cGVkZWYgc3RydWN0CisJeworCVVTSE9SVAkJIGJpZ0Q7CQkJCQkvLyBpZGVudGl0eSBpcyBhIFBDSS0yMjQwSSBpZiB0cnVlLCBvdGhlcndpc2UgYSBQQ0ktMjIyMEkKKwlVU0hPUlQJCSBhdGFwaTsJCQkJCS8vIHRoaXMgaW50ZXJmYWNlIGlzIGZvciBBVEFQSSBkZXZpY2VzIG9ubHkKKwlVTE9ORwkJIHJlZ0RtYURlc2M7CQkJLy8gYWRkcmVzcyBvZiB0aGUgRE1BIGRpc2NyaXB0b3IgcmVnaXN0ZXIgZm9yIGRpcmVjdGlvbiBvZiB0cmFuc2ZlcgorCVVMT05HCQkgcmVnRG1hQ21kU3RhdDsJCQkvLyBCeXRlICMxIG9mIERNQSBjb21tYW5kIHN0YXR1cyByZWdpc3RlcgorCVVMT05HCQkgcmVnRG1hQWRkclBjaTsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIFBDSSBhZGRyZXNzIG9mIERNQQorCVVMT05HCQkgcmVnRG1hQWRkckxvYzsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIGxvY2FsIGJ1cyBhZGRyZXNzIG9mIERNQQorCVVMT05HCQkgcmVnRG1hQ291bnQ7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBETUEgdHJhbnNmZXIgY291bnQKKwlVTE9ORwkJIHJlZ0RtYU1vZGU7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBETUEgbW9kZSBjb250cm9sCisJVUxPTkcJCSByZWdSZW1hcDsJCQkJLy8gMzIgYml0IGxvY2FsIHNwYWNlIHJlbWFwCisJVUxPTkcJCSByZWdEZXNjOwkJCQkvLyAzMiBiaXQgbG9jYWwgcmVnaW9uIGRlc2NyaXB0b3IKKwlVTE9ORwkJIHJlZ1JhbmdlOwkJCQkvLyAzMiBiaXQgbG9jYWwgcmFuZ2UKKwlVTE9ORwkJIHJlZ0lycUNvbnRyb2w7CQkJLy8gMTYgYml0IEludGVycnVwdCBlbmFibGUvZGlzYWJsZSBhbmQgc3RhdHVzCisJVUxPTkcJCSByZWdTY3JhdGNoUGFkOwkJCS8vIHNjcmF0Y2ggcGFkIEkvTyBiYXNlIGFkZHJlc3MKKwlVTE9ORwkJIHJlZ0Jhc2U7CQkJCS8vIEJhc2UgSS9PIHJlZ2lzdGVyIGZvciBkYXRhIHNwYWNlCisJVUxPTkcJCSByZWdEYXRhOwkJCQkvLyBkYXRhIHJlZ2lzdGVyIEkvTyBhZGRyZXNzCisJVUxPTkcJCSByZWdFcnJvcjsJCQkJLy8gZXJyb3IgcmVnaXN0ZXIgSS9PIGFkZHJlc3MKKwlVTE9ORwkJIHJlZ1NlY3RDb3VudDsJCQkvLyBzZWN0b3IgY291bnQgcmVnaXN0ZXIgSS9PIGFkZHJlc3MKKwlVTE9ORwkJIHJlZ0xiYTA7CQkJCS8vIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgTEJBCisJVUxPTkcJCSByZWdMYmE4OwkJCQkvLyBuZXh0IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgTEJBCisJVUxPTkcJCSByZWdMYmExNjsJCQkJLy8gbmV4dCBtb3N0IHNpZ25pZmljYW4gYnl0ZSBvZiBMQkEKKwlVTE9ORwkJIHJlZ0xiYTI0OwkJCQkvLyBoZWFkIGFuZCBtb3N0IDQgc2lnbmlmaWNhbnQgYml0cyBvZiBMQkEKKwlVTE9ORwkJIHJlZ1N0YXRDbWQ7CQkJLy8gc3RhdHVzIG9uIHJlYWQgYW5kIGNvbW1hbmQgb24gd3JpdGUgcmVnaXN0ZXIKKwlVTE9ORwkJIHJlZ1N0YXRTZWw7CQkJLy8gYm9hcmQgc3RhdHVzIG9uIHJlYWQgYW5kIHNwaWdvdCBzZWxlY3Qgb24gd3JpdGUgcmVnaXN0ZXIKKwlVTE9ORwkJIHJlZ0ZhaWw7CQkJCS8vIGZhaWwgYml0cyBjb250cm9sIHJlZ2lzdGVyCisJVUxPTkcJCSByZWdBbHRTdGF0OwkJCS8vIGFsdGVybmF0ZSBzdGF0dXMgYW5kIGRyaXZlIGNvbnRyb2wgcmVnaXN0ZXIKKwlVTE9ORwkJIGJhc2VQb3J0OwkJCQkvLyBQTFggYmFzZSBJL08gcG9ydAorCVVTSE9SVAkJIHRpbWluZ01vZGU7CQkJLy8gdGltaW5nIG1vZGUgY3VycmVudGx5IHNldCBmb3IgYWRhcHRlcgorCVVTSE9SVAkJIHRpbWluZ1BJTzsJCQkJLy8gVFJVRSBpZiBQSU8gdGltaW5nIGlzIGFjdGl2ZQorCXN0cnVjdCBwY2lfZGV2CSpwY2lkZXY7CisJVUxPTkcJCSB0aW1pbmdBZGRyZXNzOwkJCS8vIGFkZHJlc3MgdG8gdXNlIG9uIGFkYXB0ZXIgZm9yIGN1cnJlbnQgdGltaW5nIG1vZGUKKwlVTE9ORwkJIGlycU93bmVkOwkJCQkvLyBvd25lZCBJUlEgb3IgemVybyBpZiBzaGFyZWQKKwlVQ0hBUgkJIG51bWJlck9mRHJpdmVzOwkJLy8gc2F2ZWQgbnVtYmVyIG9mIGRyaXZlcyBvbiB0aGlzIGNvbnRyb2xsZXIKKwlVQ0hBUgkJIGZhaWxSZWdpc3RlcjsJCQkvLyBjdXJyZW50IGludmVydGVkIGRhdGEgaW4gZmFpbCByZWdpc3RlcgorCU9VUl9ERVZJQ0UJIGRldmljZVtCSUdEX01BWERSSVZFU107CisJRElTS19NSVJST1IJKnJhaWREYXRhW0JJR0RfTUFYRFJJVkVTXTsKKwlVTE9ORwkJIHN0YXJ0U2VjdG9yOworCVVTSE9SVAkJIHNlY3RvckNvdW50OworCVVMT05HCQkgcmVhZENvdW50OworCVVDSEFSCQkqY3VycmVudFNnQnVmZmVyOworCVVMT05HCQkgY3VycmVudFNnQ291bnQ7CisJVVNIT1JUCQkgbmV4dFNnOworCVVDSEFSCQkgY21kOworCVNjc2lfQ21uZAkqU0NwbnQ7CisJUE9VUl9ERVZJQ0UJIHBkZXY7CQkJCQkvLyBjdXJyZW50IGRldmljZSBvcGVhcmF0aW5nIG9uCisJVVNIT1JUCQkgZGV2SW5SZWNvbkluZGV4OworCVVTSE9SVAkJIGV4cGVjdGluZ0lSUTsKKwlVU0hPUlQJCSByZWNvbk9uOwkJCQkvLyBIb3QgcmVjb25zdHJ1Y3QgaXMgdG8gYmUgZG9uZS4KKwlVU0hPUlQJCSByZWNvblBoYXNlOwkJCS8vIEhvdCByZWNvbnN0cnVjdCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuCisJVUxPTkcJCSByZWNvblNpemU7CisJVVNIT1JUCQkgZGVtb0ZhaWw7CQkJCS8vIGZsYWcgZm9yIFJBSUQgZmFpbHVyZSBkZW1vbnN0cmF0aW9uCisJVVNIT1JUCQkgc3Vydml2b3I7CisJVVNIT1JUCQkgZmFpbGlucHJvZzsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlyZWNvblRpbWVyOwkKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlVQ0hBUgkJKmtCdWZmZXI7CisJZG1hX2FkZHJfdAkga0J1ZmZlckRtYTsKKwlVQ0hBUgkJIHJlcVNlbnNlOworCVVDSEFSCQkgYXRhcGlDZGJbMTZdOworCVVDSEFSCQkgYXRhcGlTcGVjaWFsOworCX0JQURBUFRFUjIyMjBJLCAqUEFEQVBURVIyMjIwSTsKKworI2RlZmluZSBIT1NUREFUQShob3N0KSAoKFBBREFQVEVSMjIyMEkpJmhvc3QtPmhvc3RkYXRhKQorCisjZGVmaW5lCVJFQ09OX1BIQVNFX1JFQURZCQkweDAxCisjZGVmaW5lCVJFQ09OX1BIQVNFX0NPUFkJCTB4MDIKKyNkZWZpbmUJUkVDT05fUEhBU0VfVVBEQVRFCQkweDAzCisjZGVmaW5lCVJFQ09OX1BIQVNFX0xBU1QJCTB4MDQKKyNkZWZpbmUJUkVDT05fUEhBU0VfRU5ECQkJMHgwNwkKKyNkZWZpbmUJUkVDT05fUEhBU0VfTUFSS0lORwkJMHg4MAorI2RlZmluZQlSRUNPTl9QSEFTRV9GQUlMT1ZFUgkweEZGCisKK3N0YXRpYyBzdHJ1Y3QJU2NzaV9Ib3N0IAkgICAqUHNpSG9zdFtNQVhBREFQVEVSXSA9IHtOVUxMLH07ICAvLyBPbmUgZm9yIGVhY2ggYWRhcHRlcgorc3RhdGljCQkJaW50CQkJCU51bUFkYXB0ZXJzID0gMDsKK3N0YXRpYwkJCWludAkJCQlJbnN0YWxsZWQgPSAwOworc3RhdGljCQkJU0VUVVAJCQlEYWxlU2V0dXA7CitzdGF0aWMJCQlESVNLX01JUlJPUgkJRGlza01pcnJvcltCSUdEX01BWERSSVZFU107CitzdGF0aWMJCQlVTE9ORwkJCU1vZGVBcnJheVtdID0ge0RBTEVfREFUQV9NT0RFMiwgREFMRV9EQVRBX01PREUzLCBEQUxFX0RBVEFfTU9ERTQsIERBTEVfREFUQV9NT0RFNX07CitzdGF0aWMJCQlVTE9ORwkJCU1vZGVBcnJheTJbXSA9IHtCSUdEX0RBVEFfTU9ERTIsIEJJR0RfREFUQV9NT0RFMywgQklHRF9EQVRBX01PREU0LCBCSUdEX0RBVEFfTU9ERTV9OworCitzdGF0aWMgdm9pZCBSZWNvblRpbWVyRXhwaXJ5ICh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJCQlBbGFybQorICoKKyAqCURlc2NyaXB0aW9uOglTb3VuZCB0aGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UKKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJZGV2aWNlCSAtIERldmljZSBudW1iZXIuCisgKgkKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBBbGFybSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgVUNIQVIgZGV2aWNlKQorCXsKKwlVQ0hBUgl6YzsKKworCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQl7CisJCXpjID0gZGV2aWNlIHwgKEZBSUxfQU5ZIHwgRkFJTF9BVURJQkxFKTsKKwkJaWYgKCBwYWRhcHRlci0+ZmFpbFJlZ2lzdGVyICYgRkFJTF9BTlkgKSAKKwkJCXpjIHw9IEZBSUxfTVVMVElQTEU7CisJCQorCQlwYWRhcHRlci0+ZmFpbFJlZ2lzdGVyID0gemM7CisJCW91dGJfcCAofnpjLCBwYWRhcHRlci0+cmVnRmFpbCk7CisJCX0KKwllbHNlCisJCW91dGJfcCAoMHgzQyB8ICgxIDw8IGRldmljZSksIHBhZGFwdGVyLT5yZWdGYWlsKTsJCQkvLyBzb3VuZCBhbGFybSBhbmQgc2V0IGZhaWwgbGlnaHQJCQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglNdXRlQWxhcm0JOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CU11dGUgdGhlIGF1ZGlibGUgYWxhcm0uCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIE11dGVBbGFybSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlcikKKwl7CisJVUNIQVIJb2xkOworCisJaWYgKCBwYWRhcHRlci0+YmlnRCApCisJCXsKKwkJcGFkYXB0ZXItPmZhaWxSZWdpc3RlciAmPSB+RkFJTF9BVURJQkxFOworCQlvdXRiX3AgKH5wYWRhcHRlci0+ZmFpbFJlZ2lzdGVyLCBwYWRhcHRlci0+cmVnRmFpbCk7CisJCX0KKwllbHNlCisJCXsKKwkJb2xkID0gKGluYl9wIChwYWRhcHRlci0+cmVnU3RhdFNlbCkgPj4gMykgfCAoaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0U2VsKSAmIDB4ODMpOworCQlvdXRiX3AgKG9sZCB8IDB4NDAsIHBhZGFwdGVyLT5yZWdGYWlsKTsKKwkJfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglXYWl0UmVhZHkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGRldmljZSByZWFkeS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgYXNzZXJ0IERSUSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXYWl0UmVhZHkgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIpCisJeworCVVMT05HCXo7CisJVUNIQVIJc3RhdHVzOworCisJZm9yICggeiA9IDA7ICB6IDwgKFRJTUVPVVRfUkVBRFkgKiA0KTsgIHorKyApCisJCXsKKwkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsKKwkJaWYgKCAoc3RhdHVzICYgKElERV9TVEFUVVNfRFJEWSB8IElERV9TVEFUVVNfQlVTWSkpID09IElERV9TVEFUVVNfRFJEWSApCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5ICgyNTApOworCQl9CisJcmV0dXJuIHN0YXR1czsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJV2FpdFJlYWR5UmVzZXQJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGRldmljZSByZWFkeS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgYXNzZXJ0IERSUSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXYWl0UmVhZHlSZXNldCAoUEFEQVBURVIyMjIwSSBwYWRhcHRlcikKKwl7CisJVUxPTkcJejsKKwlVQ0hBUglzdGF0dXM7CisKKwlmb3IgKCB6ID0gMDsgIHogPCAoMTI1ICogMTYpOyAgeisrICkJCQkJLy8gd2FpdCB1cCB0byAxLzQgc2Vjb25kCisJCXsKKwkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsKKwkJaWYgKCAoc3RhdHVzICYgKElERV9TVEFUVVNfRFJEWSB8IElERV9TVEFUVVNfQlVTWSkpID09IElERV9TVEFUVVNfRFJEWSApCisJCQl7CisJCQlERUIgKHByaW50ayAoIlxuUENJMjIyMEk6ICBSZXNldCB0b29rICVsZCBtU2VjIHRvIGJlIHJlYWR5IiwgeiAvIDgpKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl1ZGVsYXkgKDEyNSk7CisJCX0KKwlERUIgKHByaW50ayAoIlxuUENJMjIyMEk6ICBSZXNldCB0b29rIG1vcmUgdGhhbiAyIFNlY29uZHMgdG8gY29tZSByZWFkeSwgRGlzayBGYWlsdXJlIikpOworCXJldHVybiBzdGF0dXM7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVdhaXREcnEJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGRldmljZSByZWFkeSBmb3IgZGF0YSB0cmFuc2Zlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgYXNzZXJ0IERSUSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBXYWl0RHJxIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyKQorCXsKKwlVTE9ORwl6OworCVVDSEFSCXN0YXR1czsKKworCWZvciAoIHogPSAwOyAgeiA8IChUSU1FT1VUX0RSUSAqIDQpOyAgeisrICkKKwkJeworCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOworCQlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfRFJRICkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkgKDI1MCk7CisJCX0KKwlyZXR1cm4gc3RhdHVzOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglBdGFwaVdhaXRSZWFkeQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJV2FpdCBmb3IgZGV2aWNlIGJ1c3kgYW5kIERSUSB0byBiZSBjbGVhcmVkLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQltc2VjCSAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBkb2VzIG5vdCBjbGVhciBidXN5IGluIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEF0YXBpV2FpdFJlYWR5IChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBpbnQgbXNlYykKKwl7CisJaW50IHo7CisKKwlmb3IgKCB6ID0gMDsgIHogPCAobXNlYyAqIDE2KTsgIHorKyApCisJCXsKKwkJaWYgKCAhKGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCkgJiAoSURFX1NUQVRVU19CVVNZIHwgSURFX1NUQVRVU19EUlEpKSApCisJCQlyZXR1cm4gRkFMU0U7CisJCXVkZWxheSAoMTI1KTsKKwkJfQorCXJldHVybiBUUlVFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglBdGFwaVdhaXREcnEJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdhaXQgZm9yIGRldmljZSByZWFkeSBmb3IgZGF0YSB0cmFuc2Zlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJbXNlYwkgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgYXNzZXJ0IERSUSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBBdGFwaVdhaXREcnEgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIGludCBtc2VjKQorCXsKKwlVTE9ORwl6OworCisJZm9yICggeiA9IDA7ICB6IDwgKG1zZWMgKiAxNik7ICB6KysgKQorCQl7CisJCWlmICggaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKSAmIElERV9TVEFUVVNfRFJRICkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkgKDEyOCk7CisJCX0KKwlyZXR1cm4gVFJVRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJSGFyZFJlc2V0CTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglXYWl0IGZvciBkZXZpY2UgcmVhZHkgZm9yIGRhdGEgdHJhbnNmZXIuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBkZXZpY2UuCisgKgkJCQkJc3BpZ290CSAtIFNwaWdvdCBudW1iZXIuCisgKgorICoJUmV0dXJuczoJCVRSVUUgaWYgZHJpdmUgZG9lcyBub3QgYXNzZXJ0IERSUSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBIYXJkUmVzZXQgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYsIFVDSEFSIHNwaWdvdCkKKwl7CisJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOlJFU0VUICBzcGlnb3QgPSAlWCAgZGV2aWNlcyA9ICVkLCAlZCIsIHNwaWdvdCwgcGRldi0+ZGV2aWNlSURbMF0sIHBkZXYtPmRldmljZUlEWzFdKSk7CisJbWRlbGF5ICgxMDApOwkJCQkJCQkJCQkvLyBqdXN0IHdhaXQgMTAwIG1TZWMgdG8gbGV0IGRyaXZlcyBmbHVzaAkKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBzcGlnb3QgfCBTRUxfSVJRX09GRik7CisJCisJb3V0Yl9wICgweDBFLCBwYWRhcHRlci0+cmVnQWx0U3RhdCk7CQkJCQkvLyByZXNldCB0aGUgc3V2aXZvcgorCXVkZWxheSAoMTAwKTsJCQkJCQkJCQkJCS8vIHdhaXQgYSBsaXR0bGUJCisJb3V0Yl9wICgweDA4LCBwYWRhcHRlci0+cmVnQWx0U3RhdCk7CQkJCQkvLyBjbGVhciB0aGUgcmVzZXQKKwl1ZGVsYXkgKDEwMCk7CisKKwlvdXRiX3AgKDB4QTAsIHBhZGFwdGVyLT5yZWdMYmEyNCk7CQkJCQkJLy8gc2VsZWN0IHRoZSBtYXN0ZXIgZHJpdmUKKwlpZiAoIFdhaXRSZWFkeVJlc2V0IChwYWRhcHRlcikgKQorCQl7CisJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogbWFzdGVyIG5vdCByZWFkeSBhZnRlciByZXNldCIpKTsKKwkJcmV0dXJuIFRSVUU7CisJCX0KKwlvdXRiX3AgKDB4QjAsIHBhZGFwdGVyLT5yZWdMYmEyNCk7CQkJCQkJLy8gdHJ5IHRoZSBzbGF2ZSBkcml2ZQorCWlmICggKGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCkgJiAoSURFX1NUQVRVU19EUkRZIHwgSURFX1NUQVRVU19CVVNZKSkgPT0gSURFX1NUQVRVU19EUkRZICkgCisJCXsKKwkJREVCIChwcmludGsgKCJcblBDSTIyMjBJOiBpbml0aWFsaXppbmcgc2xhdmUgZHJpdmUgb24gc3BpZ290ICVYIiwgc3BpZ290KSk7CisJCW91dGJfcCAoU0VDVE9SU1hGRVIsIHBhZGFwdGVyLT5yZWdTZWN0Q291bnQpOworCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBJREVfQ01EX1NFVF9NVUxUSVBMRSk7CQorCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCXsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogc2xhdmUgbm90IHJlYWR5IGFmdGVyIHNldCBtdWx0aXBsZSIpKTsKKwkJCXJldHVybiBUUlVFOworCQkJfQorCQl9CisJCisJb3V0Yl9wICgweEEwLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCQkvLyBzZWxlY3QgdGhlIGRyaXZlCisJb3V0Yl9wIChTRUNUT1JTWEZFUiwgcGFkYXB0ZXItPnJlZ1NlY3RDb3VudCk7CisJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NNRF9TRVRfTVVMVElQTEUpOwkKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJeworCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IG1hc3RlciBub3QgcmVhZHkgYWZ0ZXIgc2V0IG11bHRpcGxlIikpOworCQlyZXR1cm4gVFJVRTsKKwkJfQorCXJldHVybiBGQUxTRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQXRhcGlSZXNldAk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJV2FpdCBmb3IgZGV2aWNlIHJlYWR5IGZvciBkYXRhIHRyYW5zZmVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGNvbWUgcmVhZHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEF0YXBpUmVzZXQgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYpCisJeworCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdCk7CisJQXRhcGlEZXZpY2UgKHBhZGFwdGVyLCBwZGV2LT5ieXRlNik7CisJQXRhcGlDb3VudExvIChwYWRhcHRlciwgMCk7CisJQXRhcGlDb3VudEhpIChwYWRhcHRlciwgMCk7CisJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfQVRBUElfUkVTRVQpOworCXVkZWxheSAoMTI1KTsKKwlpZiAoIEF0YXBpV2FpdFJlYWR5IChwYWRhcHRlciwgMTAwMCkgKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoIGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCkgfHwgKGluYl9wIChwYWRhcHRlci0+cmVnTGJhOCkgIT0gMHgxNCkgfHwgKGluYl9wIChwYWRhcHRlci0+cmVnTGJhMTYpICE9IDB4RUIpICkKKwkJcmV0dXJuIFRSVUU7CisJcmV0dXJuIEZBTFNFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglXYWxrU2NhdEdhdGgJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVRyYW5zZmVyIGRhdGEgdG8vZnJvbSBzY2F0dGVyL2dhdGhlciBidWZmZXJzLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlkYXRhaW4gICAtIFRSVUUgaWYgZGF0YSByZWFkLgorICoJCQkJCWxlbmd0aCAgIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgV2Fsa1NjYXRHYXRoIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBVQ0hBUiBkYXRhaW4sIFVMT05HIGxlbmd0aCkKKwl7CisJVUxPTkcJIGNvdW50OworCVVDSEFSCSpidWZmZXIgPSBwYWRhcHRlci0+a0J1ZmZlcjsKKworCXdoaWxlICggbGVuZ3RoICkKKwkJeworCQljb3VudCA9ICggbGVuZ3RoID4gcGFkYXB0ZXItPmN1cnJlbnRTZ0NvdW50ICkgPyBwYWRhcHRlci0+Y3VycmVudFNnQ291bnQgOiBsZW5ndGg7IAorCQkKKwkJaWYgKCBkYXRhaW4gKQorCQkJbWVtY3B5IChwYWRhcHRlci0+Y3VycmVudFNnQnVmZmVyLCBidWZmZXIsIGNvdW50KTsKKwkJZWxzZQorCQkJbWVtY3B5IChidWZmZXIsIHBhZGFwdGVyLT5jdXJyZW50U2dCdWZmZXIsIGNvdW50KTsKKworCQlwYWRhcHRlci0+Y3VycmVudFNnQ291bnQgLT0gY291bnQ7CisJCWlmICggIXBhZGFwdGVyLT5jdXJyZW50U2dDb3VudCApCisJCQl7CisJCQlpZiAoIHBhZGFwdGVyLT5uZXh0U2cgPCBwYWRhcHRlci0+U0NwbnQtPnVzZV9zZyApCisJCQkJeworCQkJCXBhZGFwdGVyLT5jdXJyZW50U2dCdWZmZXIgPSAoKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBhZGFwdGVyLT5TQ3BudC0+cmVxdWVzdF9idWZmZXIpW3BhZGFwdGVyLT5uZXh0U2ddLmFkZHJlc3M7CisJCQkJcGFkYXB0ZXItPmN1cnJlbnRTZ0NvdW50ID0gKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwYWRhcHRlci0+U0NwbnQtPnJlcXVlc3RfYnVmZmVyKVtwYWRhcHRlci0+bmV4dFNnXS5sZW5ndGg7CisJCQkJcGFkYXB0ZXItPm5leHRTZysrOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJcGFkYXB0ZXItPmN1cnJlbnRTZ0J1ZmZlciArPSBjb3VudDsKKworCQlsZW5ndGggLT0gY291bnQ7CisJCWJ1ZmZlciArPSBjb3VudDsKKwkJfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglCdXNNYXN0ZXIJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CURvIGEgYnVzIG1hc3RlciBJL08uCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCWRhdGFpbgkgLSBUUlVFIGlmIGRhdGEgcmVhZC4KKyAqCQkJCQlpcnEJCSAtIFRSVUUgaWYgYnVzIG1hc3RlciBpbnRlcnJ1cHQgZXhwZWN0ZWQuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBCdXNNYXN0ZXIgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFVDSEFSIGRhdGFpbiwgVUNIQVIgaXJxKQorCXsKKwlVTE9ORyB6bDsKKwkKKwl6bCA9ICggcGFkYXB0ZXItPnNlY3RvckNvdW50ID4gTUFYX0JVU19NQVNURVJfQkxPQ0tTICkgPyBNQVhfQlVTX01BU1RFUl9CTE9DS1MgOiBwYWRhcHRlci0+c2VjdG9yQ291bnQ7CisJcGFkYXB0ZXItPnNlY3RvckNvdW50IC09IHpsOworCXpsICo9IChVTE9ORylCWVRFU19QRVJfU0VDVE9SOworCisJaWYgKCBkYXRhaW4gKQorCQl7CisJCXBhZGFwdGVyLT5yZWFkQ291bnQgPSB6bDsKKwkJb3V0Yl9wICg4LCBwYWRhcHRlci0+cmVnRG1hRGVzYyk7CQkJCQkJCS8vIHJlYWQgb3BlcmF0aW9uCisJCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQkJeworCQkJaWYgKCBpcnEgJiYgIXBhZGFwdGVyLT5zZWN0b3JDb3VudCApCisJCQkJb3V0Yl9wICgweDBDLCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCS8vIGludGVycnVwdCBvbgorCQkJZWxzZQorCQkJCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkvLyBubyBpbnRlcnJ1cHQKKwkJCX0KKwkJZWxzZSAKKwkJCXsKKwkJCWlmICggaXJxICYmICFwYWRhcHRlci0+c2VjdG9yQ291bnQgKQorCQkJCW91dGJfcCAoMHgwNSwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkvLyBpbnRlcnJ1cHQgb24KKwkJCWVsc2UKKwkJCQlvdXRiX3AgKDB4MDEsIHBhZGFwdGVyLT5yZWdEbWFNb2RlKTsJCQkJLy8gbm8gaW50ZXJydXB0CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJb3V0Yl9wICgweDAwLCBwYWRhcHRlci0+cmVnRG1hRGVzYyk7CQkJCQkJLy8gd3JpdGUgb3BlcmF0aW9uCisJCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQkJb3V0Yl9wICgweDA4LCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCQkvLyBubyBpbnRlcnJ1cHQJCQkJCQkKKwkJZWxzZQorCQkJb3V0Yl9wICgweDAxLCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCQkvLyBubyBpbnRlcnJ1cHQKKwkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgRkFMU0UsIHpsKTsJCisJCX0KKwkKKwlvdXRsIChwYWRhcHRlci0+dGltaW5nQWRkcmVzcywgcGFkYXB0ZXItPnJlZ0RtYUFkZHJMb2MpOworCW91dGwgKHBhZGFwdGVyLT5rQnVmZmVyRG1hLCBwYWRhcHRlci0+cmVnRG1hQWRkclBjaSk7CisJb3V0bCAoemwsIHBhZGFwdGVyLT5yZWdEbWFDb3VudCk7CisJb3V0Yl9wICgweDAzLCBwYWRhcHRlci0+cmVnRG1hQ21kU3RhdCk7CQkJCQkJCS8vIGtpY2sgdGhlIERNQSBlbmdpbmUgaW4gZ2VhcgorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglBdGFwaUJ1c01hc3Rlcgk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJRG8gYSBidXMgbWFzdGVyIEkvTy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJZGF0YWluCSAtIFRSVUUgaWYgZGF0YSByZWFkLgorICoJCQkJCWxlbmd0aAkgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBBdGFwaUJ1c01hc3RlciAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgVUNIQVIgZGF0YWluLCBVTE9ORyBsZW5ndGgpCisJeworCW91dGwgKHBhZGFwdGVyLT50aW1pbmdBZGRyZXNzLCBwYWRhcHRlci0+cmVnRG1hQWRkckxvYyk7CisJb3V0bCAocGFkYXB0ZXItPmtCdWZmZXJEbWEsIHBhZGFwdGVyLT5yZWdEbWFBZGRyUGNpKTsKKwlvdXRsIChsZW5ndGgsIHBhZGFwdGVyLT5yZWdEbWFDb3VudCk7CisJaWYgKCBkYXRhaW4gKQorCQl7CisJCWlmICggcGFkYXB0ZXItPnJlYWRDb3VudCApCisJCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgVFJVRSwgcGFkYXB0ZXItPnJlYWRDb3VudCk7CisJCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0RtYURlc2MpOwkJCQkJCS8vIHJlYWQgb3BlcmF0aW9uCisJCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUpOwkJCQkJCS8vIG5vIGludGVycnVwdAorCQlwYWRhcHRlci0+cmVhZENvdW50ID0gbGVuZ3RoOworCQl9CisJZWxzZQorCQl7CisJCW91dGJfcCAoMHgwMCwgcGFkYXB0ZXItPnJlZ0RtYURlc2MpOwkJCQkJCS8vIHdyaXRlIG9wZXJhdGlvbgorCQlvdXRiX3AgKDB4MDgsIHBhZGFwdGVyLT5yZWdEbWFNb2RlKTsJCQkJCQkvLyBubyBpbnRlcnJ1cHQJCQkJCQkKKwkJaWYgKCAhcGFkYXB0ZXItPmF0YXBpU3BlY2lhbCApCisJCQlXYWxrU2NhdEdhdGggKHBhZGFwdGVyLCBGQUxTRSwgbGVuZ3RoKTsJCisJCX0KKwlvdXRiX3AgKDB4MDMsIHBhZGFwdGVyLT5yZWdEbWFDbWRTdGF0KTsJCQkJCQkJLy8ga2ljayB0aGUgRE1BIGVuZ2luZSBpbiBnZWFyCisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVdyaXRlRGF0YQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJV3JpdGUgZGF0YSB0byBkZXZpY2UuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGRvZXMgbm90IGFzc2VydCBEUlEgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgV3JpdGVEYXRhIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyKQorCXsKKwlVTE9ORwl6bDsKKwkKKwlpZiAoICFXYWl0RHJxIChwYWRhcHRlcikgKQorCQl7CisJCWlmICggcGFkYXB0ZXItPnRpbWluZ1BJTyApCisJCQl7CisJCQl6bCA9IChwYWRhcHRlci0+c2VjdG9yQ291bnQgPiBNQVhfQlVTX01BU1RFUl9CTE9DS1MpID8gTUFYX0JVU19NQVNURVJfQkxPQ0tTIDogcGFkYXB0ZXItPnNlY3RvckNvdW50OworCQkJV2Fsa1NjYXRHYXRoIChwYWRhcHRlciwgRkFMU0UsIHpsICogQllURVNfUEVSX1NFQ1RPUik7CisJCQlvdXRzdyAocGFkYXB0ZXItPnJlZ0RhdGEsIHBhZGFwdGVyLT5rQnVmZmVyLCB6bCAqIChCWVRFU19QRVJfU0VDVE9SIC8gMikpOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50IC09IHpsOworCQkJfQorCQllbHNlCisJCQlCdXNNYXN0ZXIgKHBhZGFwdGVyLCAwLCAwKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlwYWRhcHRlci0+Y21kID0gMDsJCQkJCQkJCQkJCQkvLyBudWxsIG91dCB0aGUgY29tbWFuZCBieXRlCisJcmV0dXJuIDE7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVdyaXRlRGF0YUJvdGgJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdyaXRlIGRhdGEgdG8gZGV2aWNlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKglSZXR1cm5zOgkJSW5kZXggKyAxIG9mIGRyaXZlIG5vdCBmYWlsZWQgb3IgemVybyBmb3IgT0suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFdyaXRlRGF0YUJvdGggKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYpCisJeworCVVMT05HCXpsOworCVVDSEFSCXN0YXR1czAsIHN0YXR1czE7CisKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdKTsKKwlzdGF0dXMwID0gV2FpdERycSAocGFkYXB0ZXIpOworCWlmICggIXN0YXR1czAgKQorCQl7CisJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbMV0pOworCQlzdGF0dXMxID0gV2FpdERycSAocGFkYXB0ZXIpOworCQlpZiAoICFzdGF0dXMxICkKKwkJCXsKKwkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbMF0gfCBwZGV2LT5zcGlnb3RzWzFdIHwgcGFkYXB0ZXItPmJpZ0QpOworCQkJaWYgKCBwYWRhcHRlci0+dGltaW5nUElPICkKKwkJCQl7CisJCQkJemwgPSAocGFkYXB0ZXItPnNlY3RvckNvdW50ID4gTUFYX0JVU19NQVNURVJfQkxPQ0tTKSA/IE1BWF9CVVNfTUFTVEVSX0JMT0NLUyA6IHBhZGFwdGVyLT5zZWN0b3JDb3VudDsKKwkJCQlXYWxrU2NhdEdhdGggKHBhZGFwdGVyLCBGQUxTRSwgemwgKiBCWVRFU19QRVJfU0VDVE9SKTsKKwkJCQlvdXRzdyAocGFkYXB0ZXItPnJlZ0RhdGEsIHBhZGFwdGVyLT5rQnVmZmVyLCB6bCAqIChCWVRFU19QRVJfU0VDVE9SIC8gMikpOworCQkJCXBhZGFwdGVyLT5zZWN0b3JDb3VudCAtPSB6bDsKKwkJCQl9CisJCQllbHNlCisJCQkJQnVzTWFzdGVyIChwYWRhcHRlciwgMCwgMCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCXBhZGFwdGVyLT5jbWQgPSAwOwkJCQkJCQkJCQkJCS8vIG51bGwgb3V0IHRoZSBjb21tYW5kIGJ5dGUKKwlpZiAoIHN0YXR1czAgKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gMTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJSWRlQ21kCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglQcm9jZXNzIGFuIElERSBjb21tYW5kLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlLgorICoKKyAqCVJldHVybnM6CQlaZXJvIGlmIG5vIGVycm9yIG9yIHN0YXR1cyByZWdpc3RlciBjb250ZW50cyBvbiBlcnJvci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVQ0hBUiBJZGVDbWQgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYpCisJeworCVVDSEFSCXN0YXR1czsKKworCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdCB8IHBhZGFwdGVyLT5iaWdEKTsJCQkJCQkJLy8gc2VsZWN0IHRoZSBzcGlnb3QKKwlvdXRiX3AgKHBkZXYtPmJ5dGU2IHwgKChVQ0hBUiAqKSgmcGFkYXB0ZXItPnN0YXJ0U2VjdG9yKSlbM10sIHBhZGFwdGVyLT5yZWdMYmEyNCk7CQkJLy8gc2VsZWN0IHRoZSBkcml2ZQorCXN0YXR1cyA9IFdhaXRSZWFkeSAocGFkYXB0ZXIpOworCWlmICggIXN0YXR1cyApCisJCXsKKwkJb3V0Yl9wIChwYWRhcHRlci0+c2VjdG9yQ291bnQsIHBhZGFwdGVyLT5yZWdTZWN0Q291bnQpOworCQlvdXRiX3AgKCgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzBdLCBwYWRhcHRlci0+cmVnTGJhMCk7CisJCW91dGJfcCAoKChVQ0hBUiAqKSgmcGFkYXB0ZXItPnN0YXJ0U2VjdG9yKSlbMV0sIHBhZGFwdGVyLT5yZWdMYmE4KTsKKwkJb3V0Yl9wICgoKFVDSEFSICopKCZwYWRhcHRlci0+c3RhcnRTZWN0b3IpKVsyXSwgcGFkYXB0ZXItPnJlZ0xiYTE2KTsKKwkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIHBhZGFwdGVyLT5jbWQpOworCQlyZXR1cm4gMDsKKwkJfQorCisJcGFkYXB0ZXItPmNtZCA9IDA7CQkJCQkJCQkJLy8gbnVsbCBvdXQgdGhlIGNvbW1hbmQgYnl0ZQorCXJldHVybiBzdGF0dXM7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlkZUNtZEJvdGgJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgYW4gSURFIGNvbW1hbmQgdG8gYm90aCBkcml2ZXJzLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqCVJldHVybnM6CQlJbmRleCArIDEgb2YgZHJpdmUgbm90IGZhaWxlZCBvciB6ZXJvIGZvciBPSy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVQ0hBUiBJZGVDbWRCb3RoIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2KQorCXsKKwlVQ0hBUglzdGF0dXMwOworCVVDSEFSCXN0YXR1czE7CisKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdIHwgcGRldi0+c3BpZ290c1sxXSk7CQkJCQkJCQkvLyBzZWxlY3QgdGhlIHNwaWdvdHMKKwlvdXRiX3AgKHBhZGFwdGVyLT5wZGV2LT5ieXRlNiB8ICgoVUNIQVIgKikoJnBhZGFwdGVyLT5zdGFydFNlY3RvcikpWzNdLCBwYWRhcHRlci0+cmVnTGJhMjQpOy8vIHNlbGVjdCB0aGUgZHJpdmUKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdKTsKKwlzdGF0dXMwID0gV2FpdFJlYWR5IChwYWRhcHRlcik7CisJaWYgKCAhc3RhdHVzMCApCisJCXsKKwkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1sxXSk7CisJCXN0YXR1czEgPSBXYWl0UmVhZHkgKHBhZGFwdGVyKTsKKwkJaWYgKCAhc3RhdHVzMSApCisJCQl7CisJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdIHwgcGRldi0+c3BpZ290c1sxXSB8IHBhZGFwdGVyLT5iaWdEKTsKKwkJCW91dGJfcCAocGFkYXB0ZXItPnNlY3RvckNvdW50LCBwYWRhcHRlci0+cmVnU2VjdENvdW50KTsKKwkJCW91dGJfcCAoKChVQ0hBUiAqKSgmcGFkYXB0ZXItPnN0YXJ0U2VjdG9yKSlbMF0sIHBhZGFwdGVyLT5yZWdMYmEwKTsKKwkJCW91dGJfcCAoKChVQ0hBUiAqKSgmcGFkYXB0ZXItPnN0YXJ0U2VjdG9yKSlbMV0sIHBhZGFwdGVyLT5yZWdMYmE4KTsKKwkJCW91dGJfcCAoKChVQ0hBUiAqKSgmcGFkYXB0ZXItPnN0YXJ0U2VjdG9yKSlbMl0sIHBhZGFwdGVyLT5yZWdMYmExNik7CisJCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gVFJVRTsKKwkJCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIHBhZGFwdGVyLT5jbWQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlwYWRhcHRlci0+Y21kID0gMDsJCQkJCQkJCQkvLyBudWxsIG91dCB0aGUgY29tbWFuZCBieXRlCisJaWYgKCBzdGF0dXMwICkKKwkJcmV0dXJuIDI7CisJcmV0dXJuIDE7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CU9wRG9uZQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJQ29tcGxldGUgYW4gb3BlcmF0b2luIGRvbmUgc2VxdWVuY2UuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciB0byBob3N0IGRhdGEgYmxvY2suCisgKgkJCQkJc3BpZ290CSAtIFNwaWdvdCBzZWxlY3QgY29kZS4KKyAqCQkJCQlkZXZpY2UJIC0gRGV2aWNlIGJ5dGUgY29kZS4KKyAqCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIE9wRG9uZSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgVUxPTkcgcmVzdWx0KQorCXsKKwlTY3NpX0NtbmQJICAgKlNDcG50ID0gcGFkYXB0ZXItPlNDcG50OworCQorCWlmICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQl7CisJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gMDsKKwkJaWYgKCBwYWRhcHRlci0+U0NwbnQgKQorCQkJeworCQkJUGNpMjIyMGlfUXVldWVDb21tYW5kIChTQ3BudCwgU0NwbnQtPnNjc2lfZG9uZSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICggcGFkYXB0ZXItPnJlY29uT24gKQorCQkJCXsKKwkJCQlSZWNvblRpbWVyRXhwaXJ5ICgodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CisJCQkJfQorCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXBhZGFwdGVyLT5jbWQgPSAwOworCQlwYWRhcHRlci0+U0NwbnQgPSBOVUxMOwkKKwkJcGFkYXB0ZXItPnBkZXYgPSBOVUxMOworCQlTQ3BudC0+cmVzdWx0ID0gcmVzdWx0OworCQlTQ3BudC0+c2NzaV9kb25lIChTQ3BudCk7CisJCWlmICggcGFkYXB0ZXItPnJlY29uT24gJiYgIXBhZGFwdGVyLT5yZWNvblRpbWVyLmRhdGEgKQorCQkJeworCQkJcGFkYXB0ZXItPnJlY29uVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyA0KTsJLy8gc3RhcnQgaW4gMS80IHNlY29uZAorCQkJcGFkYXB0ZXItPnJlY29uVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyOworCQkJYWRkX3RpbWVyICgmcGFkYXB0ZXItPnJlY29uVGltZXIpOworCQkJfQorCQl9CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlubGluZUlkZW50aWZ5CTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglEbyBhbiBpbnRsaW5lIGlucXVpcnkgb24gYSBkcml2ZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGhvc3QgZGF0YSBibG9jay4KKyAqCQkJCQlzcGlnb3QJIC0gU3BpZ290IHNlbGVjdCBjb2RlLgorICoJCQkJCWRldmljZQkgLSBEZXZpY2UgYnl0ZSBjb2RlLgorICoKKyAqCVJldHVybnM6CQlMYXN0IGFkZHJlc3NhYmxlIHNlY3RvciBvciB6ZXJvIGlmIG5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgSW5saW5lSWRlbnRpZnkgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFVDSEFSIHNwaWdvdCwgVUNIQVIgZGV2aWNlKQorCXsKKwlQSURFTlRJRllfREFUQQlwaWQgPSAoUElERU5USUZZX0RBVEEpcGFkYXB0ZXItPmtCdWZmZXI7CisKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBzcGlnb3QgfCBTRUxfSVJRX09GRik7CQkJCQkvLyBzZWxlY3QgdGhlIHNwaWdvdAorCW91dGJfcCAoKGRldmljZSA8PCA0KSB8IDB4QTAsIHBhZGFwdGVyLT5yZWdMYmEyNCk7CQkJCS8vIHNlbGVjdCB0aGUgZHJpdmUKKwlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJcmV0dXJuIDA7CisJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfSURFTlRJRlkpOwkKKwlpZiAoIFdhaXREcnEgKHBhZGFwdGVyKSApCisJCXJldHVybiAwOworCWluc3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwYWRhcHRlci0+a0J1ZmZlciwgc2l6ZW9mIChJREVOVElGWV9EQVRBKSA+PiAxKTsKKwlyZXR1cm4gKHBpZC0+TEJBVG90YWxTZWN0b3JzIC0gMSk7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUF0YXBpSWRlbnRpZnkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CURvIGFuIGludGxpbmUgaW5xdWlyeSBvbiBhIGRyaXZlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgdG8gaG9zdCBkYXRhIGJsb2NrLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBkZXZpY2UgdGFibGUuCisgKgorICoJUmV0dXJuczoJCVRSVUUgb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgQXRhcGlJZGVudGlmeSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgUE9VUl9ERVZJQ0UgcGRldikKKwl7CisJQVRBUElfR0VORVJBTF8wCQlhZzA7CisJVVNIT1JUCQkJCXpzOworCWludAkJCQkJejsKKworCUF0YXBpRGV2aWNlIChwYWRhcHRlciwgcGRldi0+Ynl0ZTYpOwkKKwlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBJREVfQ09NTUFORF9BVEFQSV9JREVOVElGWSk7CQorCWlmICggQXRhcGlXYWl0RHJxIChwYWRhcHRlciwgMzAwMCkgKQorCQlyZXR1cm4gVFJVRTsKKworCSooVVNIT1JUICopJmFnMCA9IGlud19wIChwYWRhcHRlci0+cmVnRGF0YSk7CisJZm9yICggeiA9IDA7ICB6IDwgMjU1OyAgeisrICkKKwkJenMgPSBpbndfcCAocGFkYXB0ZXItPnJlZ0RhdGEpOworCisJaWYgKCBhZzAuUHJvdG9jb2xUeXBlID09IDIgKQorCQl7CisJCWlmICggYWcwLkNtZERycVR5cGUgPT0gMSApCisJCQlwZGV2LT5jbWREcnFJbnQgPSBUUlVFOworCQlzd2l0Y2ggKCBhZzAuQ21kUGFja2V0U2l6ZSApCisJCQl7CisJCQljYXNlIDA6CisJCQkJcGRldi0+cGFja2V0ID0gNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlwZGV2LT5wYWNrZXQgPSA4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwZGV2LT5wYWNrZXQgPSA2OworCQkJCWJyZWFrOworCQkJfQorCQlyZXR1cm4gRkFMU0U7CisJCX0KKwlyZXR1cm4gVFJVRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJQXRhcGkyU2NzaQorICoKKyAqCURlc2NyaXB0aW9uOglDb252ZXJ0IEFUQVBJIGRhdGEgdG8gU0NTSSBkYXRhLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlTQ3BudAkgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEF0YXBpMlNjc2kgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFNjc2lfQ21uZCAqU0NwbnQpCisJeworCVVDSEFSCSpidWZmID0gcGFkYXB0ZXItPmN1cnJlbnRTZ0J1ZmZlcjsKKyAKKwlzd2l0Y2ggKCBTQ3BudC0+Y21uZFswXSApCisJCXsKKwkJY2FzZSBTQ1NJT1BfTU9ERV9TRU5TRToKKwkJCWJ1ZmZbMF0gPSBwYWRhcHRlci0+a0J1ZmZlclsxXTsKKwkJCWJ1ZmZbMV0gPSBwYWRhcHRlci0+a0J1ZmZlclsyXTsKKwkJCWJ1ZmZbMl0gPSBwYWRhcHRlci0+a0J1ZmZlclszXTsKKwkJCWJ1ZmZbM10gPSBwYWRhcHRlci0+a0J1ZmZlcls3XTsKKwkJCW1lbWNweSAoJmJ1ZmZbNF0sICZwYWRhcHRlci0+a0J1ZmZlcls4XSwgcGFkYXB0ZXItPmF0YXBpQ2RiWzhdIC0gOCk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfSU5RVUlSWToKKwkJCXBhZGFwdGVyLT5rQnVmZmVyWzJdID0gMjsKKwkJCW1lbWNweSAoYnVmZiwgcGFkYXB0ZXItPmtCdWZmZXIsIHBhZGFwdGVyLT5jdXJyZW50U2dDb3VudCk7CisJCQlicmVhazsJCQorCQlkZWZhdWx0OgorCQkJaWYgKCBwYWRhcHRlci0+cmVhZENvdW50ICkKKwkJCQlXYWxrU2NhdEdhdGggKHBhZGFwdGVyLCBUUlVFLCBwYWRhcHRlci0+cmVhZENvdW50KTsKKwkJCWJyZWFrOworCQl9CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVNjc2kyQXRhcGkKKyAqCisgKglEZXNjcmlwdGlvbjoJQ29udmVydCBTQ1NJIHBhY2tldCBjb21tYW5kIHRvIEF0YXBpIHBhY2tldCBjb21tYW5kLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlTQ3BudAkgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBTY3NpMkF0YXBpIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBTY3NpX0NtbmQgKlNDcG50KQorCXsKKwlVQ0hBUgkqY2RiID0gU0NwbnQtPmNtbmQ7CisJVUNIQVIJKmJ1ZmYgPSBwYWRhcHRlci0+Y3VycmVudFNnQnVmZmVyOworCisJc3dpdGNoIChjZGJbMF0pIAorCQl7CisJCWNhc2UgU0NTSU9QX1JFQUQ2OgorICAgICAgICAgICAgcGFkYXB0ZXItPmF0YXBpQ2RiWzBdID0gU0NTSU9QX1JFQUQ7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbMV0gPSBjZGJbMV0gJiAweEUwOworICAgICAgICAgICAgcGFkYXB0ZXItPmF0YXBpQ2RiWzNdID0gY2RiWzFdICYgMHgxRjsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls0XSA9IGNkYlsyXTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls1XSA9IGNkYlszXTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls4XSA9IGNkYls0XTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls5XSA9IGNkYls1XTsKKwkJCWJyZWFrOworCQljYXNlIFNDU0lPUF9XUklURTY6CisgICAgICAgICAgICBwYWRhcHRlci0+YXRhcGlDZGJbMF0gPSBTQ1NJT1BfV1JJVEU7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbMV0gPSBjZGJbMV0gJiAweEUwOworICAgICAgICAgICAgcGFkYXB0ZXItPmF0YXBpQ2RiWzNdID0gY2RiWzFdICYgMHgxRjsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls0XSA9IGNkYlsyXTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls1XSA9IGNkYlszXTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls4XSA9IGNkYls0XTsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYls5XSA9IGNkYls1XTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFNDU0lPUF9NT0RFX1NFTlNFOiAKKyAgICAgICAgICAgIHBhZGFwdGVyLT5hdGFwaUNkYlswXSA9IFNDU0lPUF9NT0RFX1NFTlNFMTA7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbMl0gPSBjZGJbMl07CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbOF0gPSBjZGJbNF0gKyA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTQ1NJT1BfTU9ERV9TRUxFQ1Q6IAorCQkJcGFkYXB0ZXItPmF0YXBpU3BlY2lhbCA9IFRSVUU7CisJCQlwYWRhcHRlci0+YXRhcGlDZGJbMF0gPSBTQ1NJT1BfTU9ERV9TRUxFQ1QxMDsKKwkJCXBhZGFwdGVyLT5hdGFwaUNkYlsxXSA9IGNkYlsxXSB8IDB4MTA7CisJCQltZW1jcHkgKHBhZGFwdGVyLT5rQnVmZmVyLCBidWZmLCA0KTsKKwkJCXBhZGFwdGVyLT5rQnVmZmVyWzRdID0gcGFkYXB0ZXItPmtCdWZmZXJbNV0gPSAwOworCQkJcGFkYXB0ZXItPmtCdWZmZXJbNl0gPSBwYWRhcHRlci0+a0J1ZmZlcls3XSA9IDA7CisJCQltZW1jcHkgKCZwYWRhcHRlci0+a0J1ZmZlcls4XSwgJmJ1ZmZbNF0sIGNkYls0XSAtIDQpOworCQkJcGFkYXB0ZXItPmF0YXBpQ2RiWzhdID0gY2RiWzRdICsgNDsKKwkJCWJyZWFrOworCSAgICB9CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUF0YXBpU2VuZENkYgorICoKKyAqCURlc2NyaXB0aW9uOglTZW5kIHRoZSBDREIgcGFja2V0IHRvIHRoZSBkZXZpY2UuCisgKgorICoJUGFyYW1ldGVyczoJCXBhZGFwdGVyIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXBkZXYJIC0gUG9pbnRlciB0byBkZXZpY2UuCisgKgkJCQkJY2RiCQkgLSBQb2ludGVyIHRvIDE2IGJ5dGUgU0NTSSBjZGIuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBBdGFwaVNlbmRDZGIgKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIFBPVVJfREVWSUNFIHBkZXYsIENIQVIgKmNkYikKKwl7CisJREVCIChwcmludGsgKCJcblBDSTIyNDJJOiBDREI6ICVYICVYICVYICVYICVYICVYICVYICVYICVYICVYICVYICVYIiwgY2RiWzBdLCBjZGJbMV0sIGNkYlsyXSwgY2RiWzNdLCBjZGJbNF0sIGNkYls1XSwgY2RiWzZdLCBjZGJbN10sIGNkYls4XSwgY2RiWzldLCBjZGJbMTBdLCBjZGJbMTFdKSk7CisJb3V0c3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBjZGIsIHBkZXYtPnBhY2tldCk7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUF0YXBpUmVxdWVzdFNlbnNlCisgKgorICoJRGVzY3JpcHRpb246CVNlbmQgdGhlIENEQiBwYWNrZXQgdG8gdGhlIGRldmljZS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIGRldmljZS4KKyAqCQkJCQlTQ3BudAkgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJcGFzcwkgLSBJZiB0cnVlIHRoZW4gdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgdG8gc2VuZCBjZGIuCisgKgorICoJUmV0dXJuczoJCVRSVUUgb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEF0YXBpUmVxdWVzdFNlbnNlIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2LCBTY3NpX0NtbmQgKlNDcG50LCBVQ0hBUiBwYXNzKQorCXsKKwlVQ0hBUgljZGJbMTZdID0ge1NDU0lPUF9SRVFVRVNUX1NFTlNFLDAsMCwwLDE2LDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CQkKKwkKKwlERUIgKHByaW50ayAoIlxuUENJMjI0Mkk6IEFVVE8gUkVRVUVTVCBTRU5TRSIpKTsKKwljZGJbNF0gPSAoVUNIQVIpKHNpemVvZiAoU0NwbnQtPnNlbnNlX2J1ZmZlcikpOworCWlmICggIXBhc3MgKQorCQl7CisJCXBhZGFwdGVyLT5yZXFTZW5zZSA9IFRSVUU7CisJIAlBdGFwaUNvdW50TG8gKHBhZGFwdGVyLCBjZGJbNF0pOwkJCQkJCQorCQlBdGFwaUNvdW50SGkgKHBhZGFwdGVyLCAwKTsJCQkJCQkKKwkJb3V0Yl9wICgwLCBwYWRhcHRlci0+cmVnRXJyb3IpOwkJCQkJCQorCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBJREVfQ09NTUFORF9BVEFQSV9QQUNLRVQpOworCQlpZiAoIHBkZXYtPmNtZERycUludCApCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJaWYgKCBBdGFwaVdhaXREcnEgKHBhZGFwdGVyLCA1MDApICkKKwkJCXJldHVybiBUUlVFOworCQl9CisJQXRhcGlTZW5kQ2RiIChwYWRhcHRlciwgcGRldiwgY2RiKTsJCisJcmV0dXJuIEZBTFNFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglJbmxpbmVSZWFkU2lnbmF0dXJlCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglEbyBhbiBpbmxpbmUgcmVhZCBSQUlEIHNpZ2F0dXJlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQlwZGV2CSAtIFBvaW50ZXIgdG8gZGV2aWNlLgorICoJCQkJCWluZGV4CSAtIGluZGV4IG9mIGRhdGEgdG8gcmVhZC4KKyAqCisgKglSZXR1cm5zOgkJWmVybyBpZiBubyBlcnJvciBvciBzdGF0dXMgcmVnaXN0ZXIgY29udGVudHMgb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUNIQVIgSW5saW5lUmVhZFNpZ25hdHVyZSAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgUE9VUl9ERVZJQ0UgcGRldiwgaW50IGluZGV4KQorCXsKKwlVQ0hBUglzdGF0dXM7CisJVUxPTkcJemwgPSBwZGV2LT5sYXN0c2VjdG9ybGJhW2luZGV4XTsKKworCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbaW5kZXhdIHwgU0VMX0lSUV9PRkYpOwkvLyBzZWxlY3QgdGhlIHNwaWdvdCB3aXRob3V0IGludGVycnVwdHMKKwlvdXRiX3AgKHBkZXYtPmJ5dGU2IHwgKChVQ0hBUiAqKSZ6bClbM10sIHBhZGFwdGVyLT5yZWdMYmEyNCk7CQkKKwlzdGF0dXMgPSBXYWl0UmVhZHkgKHBhZGFwdGVyKTsKKwlpZiAoICFzdGF0dXMgKQorCQl7CisJCW91dGJfcCAoKChVQ0hBUiAqKSZ6bClbMl0sIHBhZGFwdGVyLT5yZWdMYmExNik7CisJCW91dGJfcCAoKChVQ0hBUiAqKSZ6bClbMV0sIHBhZGFwdGVyLT5yZWdMYmE4KTsgCisJCW91dGJfcCAoKChVQ0hBUiAqKSZ6bClbMF0sIHBhZGFwdGVyLT5yZWdMYmEwKTsKKwkJb3V0Yl9wICgxLCBwYWRhcHRlci0+cmVnU2VjdENvdW50KTsKKwkJV3JpdGVDb21tYW5kIChwYWRhcHRlciwgSURFX0NPTU1BTkRfUkVBRCk7CisJCXN0YXR1cyA9IFdhaXREcnEgKHBhZGFwdGVyKTsKKwkJaWYgKCAhc3RhdHVzICkKKwkJCXsKKwkJCWluc3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwYWRhcHRlci0+a0J1ZmZlciwgQllURVNfUEVSX1NFQ1RPUiAvIDIpOworCQkJKChVTE9ORyAqKSgmcGRldi0+RGlza01pcnJvcltpbmRleF0pKVswXSA9ICgoVUxPTkcgKikoJnBhZGFwdGVyLT5rQnVmZmVyW0RJU0tfTUlSUk9SX1BPU0lUSU9OXSkpWzBdOworCQkJKChVTE9ORyAqKSgmcGRldi0+RGlza01pcnJvcltpbmRleF0pKVsxXSA9ICgoVUxPTkcgKikoJnBhZGFwdGVyLT5rQnVmZmVyW0RJU0tfTUlSUk9SX1BPU0lUSU9OXSkpWzFdOworCQkJLy8gc29tZSBkcml2ZXMgYXNzZXJ0IERSUSBiZWZvcmUgSVJRIHNvIGxldCdzIG1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgSVJRCisJCQlXYWl0UmVhZHkgKHBhZGFwdGVyKTsKKwkJCXJldHVybiAwOwkJCQorCQkJfQorCQl9CisJcmV0dXJuIHN0YXR1czsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJRGVjb2RlRXJyb3IJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CURlY29kZSBhbmQgcHJvY2VzcyBkZXZpY2UgZXJyb3JzLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgdG8gYWRhcHRlciBkYXRhLgorICoJCQkJCXN0YXR1cyAtIFN0YXR1cyByZWdpc3RlciBjb2RlLgorICoKKyAqCVJldHVybnM6CQlUaGUgZHJpdmVyIHN0YXR1cyBjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVMT05HIERlY29kZUVycm9yIChQQURBUFRFUjIyMjBJCXBhZGFwdGVyLCBVQ0hBUiBzdGF0dXMpCisJeworCVVDSEFSCQkJZXJyb3I7CisKKwlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gMDsKKwlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfV1JJVEVfRkFVTFQgKQorCQl7CisJCXJldHVybiBESURfUEFSSVRZIDw8IDE2OworCQl9CisJaWYgKCBzdGF0dXMgJiBJREVfU1RBVFVTX0JVU1kgKQorCQlyZXR1cm4gRElEX0JVU19CVVNZIDw8IDE2OworCisJZXJyb3IgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ0Vycm9yKTsKKwlERUIocHJpbnRrICgiXG5wY2kyMjIwaSBlcnJvciByZWdpc3RlcjogJXgiLCBlcnJvcikpOworCXN3aXRjaCAoIGVycm9yICkKKwkJeworCQljYXNlIElERV9FUlJPUl9BTU5GOgorCQljYXNlIElERV9FUlJPUl9US09ORjoKKwkJY2FzZSBJREVfRVJST1JfQUJSVDoKKwkJY2FzZSBJREVfRVJST1JfSURGTjoKKwkJY2FzZSBJREVfRVJST1JfVU5DOgorCQljYXNlIElERV9FUlJPUl9CQks6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRElEX0VSUk9SIDw8IDE2OworCQl9CisJcmV0dXJuIERJRF9FUlJPUiA8PCAxNjsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJU3RhcnRUaW1lcgk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJU3RhcnQgdGhlIHRpbWVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlpcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBTdGFydFRpbWVyIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyKQorCXsKKwlwYWRhcHRlci0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUSU1FT1VUX0RBVEE7CisJYWRkX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJV3JpdGVTaWduYXR1cmUJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVN0YXJ0IHRoZSB0aW1lci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIG91ciBkZXZpY2UuCisgKgkJCQkJc3BpZ290CSAtIFNlbGVjdGVkIHNwaWdvdC4KKyAqCQkJCQlpbmRleAkgLSBpbmRleCBvZiBtaXJyb3Igc2lnbmF0dXJlIG9uIGRldmljZS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBvbiBhbnkgZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFdyaXRlU2lnbmF0dXJlIChQQURBUFRFUjIyMjBJIHBhZGFwdGVyLCBQT1VSX0RFVklDRSBwZGV2LCBVQ0hBUiBzcGlnb3QsIGludCBpbmRleCkKKwl7CisJVUxPTkcJemw7CisKKwlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBzcGlnb3QpOworCXpsID0gcGRldi0+bGFzdHNlY3RvcmxiYVtpbmRleF07CisJb3V0Yl9wIChwZGV2LT5ieXRlNiB8ICgoVUNIQVIgKikmemwpWzNdLCBwYWRhcHRlci0+cmVnTGJhMjQpOwkJCisJb3V0Yl9wICgoKFVDSEFSICopJnpsKVsyXSwgcGFkYXB0ZXItPnJlZ0xiYTE2KTsKKwlvdXRiX3AgKCgoVUNIQVIgKikmemwpWzFdLCBwYWRhcHRlci0+cmVnTGJhOCk7CisJb3V0Yl9wICgoKFVDSEFSICopJnpsKVswXSwgcGFkYXB0ZXItPnJlZ0xiYTApOworCW91dGJfcCAoMSwgcGFkYXB0ZXItPnJlZ1NlY3RDb3VudCk7CisKKwlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBJREVfQ09NTUFORF9XUklURSk7CQorCWlmICggV2FpdERycSAocGFkYXB0ZXIpICkKKwkJcmV0dXJuIFRSVUU7CisJU3RhcnRUaW1lciAocGFkYXB0ZXIpOwkKKwlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gVFJVRTsKKwkKKwkoKFVMT05HICopKCZwYWRhcHRlci0+a0J1ZmZlcltESVNLX01JUlJPUl9QT1NJVElPTl0pKVswXSA9ICgoVUxPTkcgKikoJnBkZXYtPkRpc2tNaXJyb3JbaW5kZXhdKSlbMF07CisJKChVTE9ORyAqKSgmcGFkYXB0ZXItPmtCdWZmZXJbRElTS19NSVJST1JfUE9TSVRJT05dKSlbMV0gPSAoKFVMT05HICopKCZwZGV2LT5EaXNrTWlycm9yW2luZGV4XSkpWzFdOworCW91dHN3IChwYWRhcHRlci0+cmVnRGF0YSwgcGFkYXB0ZXItPmtCdWZmZXIsIEJZVEVTX1BFUl9TRUNUT1IgLyAyKTsKKwlyZXR1cm4gRkFMU0U7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJSW5pdEZhaWxvdmVyCisgKgorICoJRGVzY3JpcHRpb246CVRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmFpbG92ZXIgcm91dGluZQorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudAkgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJcGRldgkgLSBQb2ludGVyIHRvIG91ciBkZXZpY2UuCisgKgkKKyAqCVJldHVybnM6CQlUUlVFIG9uIGVycm9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IEluaXRGYWlsb3ZlciAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgUE9VUl9ERVZJQ0UgcGRldikKKwl7CisJVUNIQVIJc3BpZ290OworCQorCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogIEluaXRpYWxpemUgZmFpbG92ZXIgcHJvY2VzcyAtIHN1cnZpdm9yID0gJWQiLCBwZGV2LT5kZXZpY2VJRFtwYWRhcHRlci0+c3Vydml2b3JdKSk7CisJcGRldi0+cmFpZCA9IEZBTFNFOwkJCQkJCQkJCS8vaW5pdGlhbGl6ZXMgc3lzdGVtIGZvciBub24gcmFpZCBtb2RlCisJcGRldi0+cmVjb25PbiA9IEZBTFNFOworCXNwaWdvdCA9IHBkZXYtPnNwaWdvdHNbcGFkYXB0ZXItPnN1cnZpdm9yXTsJCisKKwlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbcGFkYXB0ZXItPnN1cnZpdm9yXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQl7CisJCURFQiAocHJpbnRrICgiXG4gICAgICAgICBmYWlsZWQsIGlzIHN1cnZpdm9yIikpOworCQlyZXR1cm4gKFRSVUUpOyAKKwkJfQorCisJaWYgKCBIYXJkUmVzZXQgKHBhZGFwdGVyLCBwZGV2LCBzcGlnb3QpICkKKwkJeworCQlERUIgKHByaW50ayAoIlxuICAgICAgICAgZmFpbGVkLCByZXNldCIpKTsKKwkJcmV0dXJuIFRSVUU7CisJCX0KKworCUFsYXJtIChwYWRhcHRlciwgcGRldi0+ZGV2aWNlSURbcGFkYXB0ZXItPnN1cnZpdm9yIF4gMV0pOworCXBkZXYtPkRpc2tNaXJyb3JbcGFkYXB0ZXItPnN1cnZpdm9yXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9TVVJWSVZPUjsJLy9jbGVhciBwcmVzZW50IHN0YXR1cworCQorCWlmICggV3JpdGVTaWduYXR1cmUgKHBhZGFwdGVyLCBwZGV2LCBzcGlnb3QsIHBhZGFwdGVyLT5zdXJ2aXZvcikgKQorCQl7CisJCURFQiAocHJpbnRrICgiXG4gICAgICAgICBmYWlsZWQsIHdyaXRlIHNpZ25hdHVyZSIpKTsKKwkJcmV0dXJuIFRSVUU7CisJCX0KKwlwYWRhcHRlci0+ZmFpbGlucHJvZyA9IFRSVUU7CisJcmV0dXJuIEZBTFNFOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglUaW1lckV4cGlyeQk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJVGltZXIgZXhwaXJ5IHJvdXRpbmUuCisgKgorICoJUGFyYW1ldGVyczoJCWRhdGEgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBUaW1lckV4cGlyeSAodW5zaWduZWQgbG9uZyBkYXRhKQorCXsKKwlQQURBUFRFUjIyMjBJCXBhZGFwdGVyID0gKFBBREFQVEVSMjIyMEkpZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGFkYXB0ZXItPlNDcG50LT5kZXZpY2UtPmhvc3Q7CisJUE9VUl9ERVZJQ0UJCXBkZXYgPSBwYWRhcHRlci0+cGRldjsKKwlVQ0hBUgkJCXN0YXR1cyA9IElERV9TVEFUVVNfQlVTWTsKKwlVQ0hBUgkJCXRlbXAsIHRlbXAxOworICAgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisgICAgLyoKKyAgICAgKiBEaXNhYmxlIGludGVycnVwdHMsIGlmIHRoZXkgYXJlbid0IGFscmVhZHkgZGlzYWJsZWQgYW5kIGFjcXVpcmUKKyAgICAgKiB0aGUgSS9PIHNwaW5sb2NrLgorICAgICAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlIChob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlERUIgKHByaW50ayAoIlxuUENJMjIyMEk6IFRpbWVvdXQgZXhwaXJlZCAiKSk7CisKKwlpZiAoIHBhZGFwdGVyLT5mYWlsaW5wcm9nICkKKwkJeworCQlERUIgKHByaW50ayAoImluIGZhaWxvdmVyIHByb2Nlc3MiKSk7CisJCU9wRG9uZSAocGFkYXB0ZXIsIERlY29kZUVycm9yIChwYWRhcHRlciwgaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKSkpOworCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKwkJfQorCQorCXdoaWxlICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQl7CisJCURFQiAocHJpbnRrICgiaW4gcmVjb24gcGhhc2UgJVgiLCBwYWRhcHRlci0+cmVjb25QaGFzZSkpOworCQlzd2l0Y2ggKCBwYWRhcHRlci0+cmVjb25QaGFzZSApCisJCQl7CisJCQljYXNlIFJFQ09OX1BIQVNFX01BUktJTkc6CisJCQljYXNlIFJFQ09OX1BIQVNFX0xBU1Q6CisJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMSA6IDA7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDEiKSk7CisJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQkJZ290byB0aW1lckV4cGlyeURvbmU7CisJCQkKKwkJCWNhc2UgUkVDT05fUEhBU0VfUkVBRFk6CisJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKworCQkJY2FzZSBSRUNPTl9QSEFTRV9DT1BZOgorCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDAgOiAxOworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAyIikpOworCQkJCURFQiAocHJpbnRrICgiXG4gICAgICAgc3BpZy9zdGF0ID0gJVgiLCBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRTZWwpKTsKKwkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKworCQkJY2FzZSBSRUNPTl9QSEFTRV9VUERBVEU6CisJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMCA6IDE7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDMiKSkpOworCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfRVJST1IgPDwgMTYpOworCQkJCWdvdG8gdGltZXJFeHBpcnlEb25lOworCisJCQljYXNlIFJFQ09OX1BIQVNFX0VORDoKKwkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgNCIpKTsKKwkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQlnb3RvIHRpbWVyRXhwaXJ5RG9uZTsKKwkJCX0KKwkJfQorCQorCXdoaWxlICggcGFkYXB0ZXItPmNtZCApCisJCXsKKwkJb3V0Yl9wICgweDA4LCBwYWRhcHRlci0+cmVnRG1hQ21kU3RhdCk7CQkJCQkvLyBjYW5jZWwgaW50ZXJydXB0IGZyb20gRE1BIGVuZ2luZQorCQlpZiAoIHBkZXYtPnJhaWQgKQorCQkJeworCQkJaWYgKCBwYWRhcHRlci0+Y21kID09IFdSSVRFX0NNRCApCisJCQkJeworCQkJCURFQiAocHJpbnRrICgiaW4gUkFJRCB3cml0ZSBvcGVyYXRpb24iKSk7CisJCQkJdGVtcCA9ICggcGRldi0+c3BpZ290ICYgKFNFTF8xIHwgU0VMXzIpICkgPyBTRUxfMSA6IFNFTF8zOworCQkJCWlmICggaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0U2VsKSAmIHRlbXAgKQorCQkJCQl7CisJCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRGV0ZXJtaW5lZCBBIE9LIikpOworCQkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCB0ZW1wIHwgU0VMX0lSUV9PRkYpOyAvLyBNYXNraW5nIHRoZSBpbnRlcnJ1cHQgZHVyaW5nIHNwaWdvdCBzZWxlY3QKKwkJCQkJdGVtcCA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXRlbXAgPSBJREVfU1RBVFVTX0JVU1k7CisKKwkJCQl0ZW1wMSA9ICggcGRldi0+c3BpZ290ICYgKFNFTF8xIHwgU0VMXzIpICkgPyBTRUxfMiA6IFNFTF80OworCQkJCWlmICggaW5iIChwYWRhcHRlci0+cmVnU3RhdFNlbCkgJiB0ZW1wMSApCisJCQkJCXsKKwkJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBEZXRlcm1pbmVkIEIgT0siKSk7CisJCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHRlbXAxIHwgU0VMX0lSUV9PRkYpOyAvLyBNYXNraW5nIHRoZSBpbnRlcnJ1cHQgZHVyaW5nIHNwaWdvdCBzZWxlY3QKKwkJCQkJdGVtcDEgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl0ZW1wMSA9IElERV9TVEFUVVNfQlVTWTsKKwkJCQorCQkJCWlmICggKHRlbXAgJiBJREVfU1RBVFVTX0JVU1kpIHx8ICh0ZW1wMSAmIElERV9TVEFUVVNfQlVTWSkgKQorCQkJCQl7CisJCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogU3RhdHVzIEE6ICVYICAgQjogJVgiLCB0ZW1wICYgMHhGRiwgdGVtcDEgJiAweEZGKSk7CisJIAkJCQlpZiAoICh0ZW1wICYgSURFX1NUQVRVU19CVVNZKSAmJiAodGVtcDEgJiBJREVfU1RBVFVTX0JVU1kpICkgCisJCQkJCQl7CisJCQkJCQlzdGF0dXMgPSB0ZW1wOworCQkJCQkJYnJlYWs7CisJCQkJCQl9CQkKKwkJCQkJZWxzZQkKKwkJCQkJCXsKKwkJCQkJCWlmICggdGVtcCAmIElERV9TVEFUVVNfQlVTWSApCisJCQkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gMTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAwOworCQkJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQkJeworCQkJCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJZ290byB0aW1lckV4cGlyeURvbmU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCURFQiAocHJpbnRrICgiaW4gUkFJRCByZWFkIG9wZXJhdGlvbiIpKTsKKwkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgNiIpKTsKKwkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJeworCQkJCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWdvdG8gdGltZXJFeHBpcnlEb25lOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJREVCIChwcmludGsgKCJpbiBJL08gb3BlcmF0aW9uIikpOworCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsKKwkJCX0KKwkJYnJlYWs7CisJCX0KKwkKKwlPcERvbmUgKHBhZGFwdGVyLCBEZWNvZGVFcnJvciAocGFkYXB0ZXIsIHN0YXR1cykpOworCit0aW1lckV4cGlyeURvbmU6OworICAgIC8qCisgICAgICogUmVsZWFzZSB0aGUgSS9PIHNwaW5sb2NrIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBmbGFncworICAgICAqIHdoaWNoIHdpbGwgZW5hYmxlIGludGVycnVwdHMgaWYgYW5kIG9ubHkgaWYgdGhleSB3ZXJlCisgICAgICogZW5hYmxlZCBvbiBlbnRyeS4KKyAgICAgKi8KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlIChob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJCQlTZXRSZWNvbnN0cnVjdAk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJU2V0IHRoZSByZWNvbnN0cnVjdCB1cC4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGRldgktIFBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZS4KKyAqCQkJCQlpbmRleAktIE1pcnJvciBpbmRleCBudW1iZXIuCisgKgorICoJUmV0dXJuczoJCU51bWJlciBvZiBzZWN0b3JzIG9uIG5ldyBkaXNrIHJlcXVpcmVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIExPTkcgU2V0UmVjb25zdHJ1Y3QgKFBPVVJfREVWSUNFIHBkZXYsIGludCBpbmRleCkKKwl7CisJcGRldi0+RGlza01pcnJvcltpbmRleF0uc3RhdHVzID0gVUNCRl9NSVJST1JFRDsJCQkJCQkJLy8gc2V0dXAgdGhlIGZsYWdzCisJcGRldi0+RGlza01pcnJvcltpbmRleCBeIDFdLnN0YXR1cyA9IFVDQkZfTUlSUk9SRUQgfCBVQ0JGX1JFQlVJTEQ7CisJcGRldi0+RGlza01pcnJvcltpbmRleCBeIDFdLnJlY29uc3RydWN0UG9pbnQgPSAwOwkJCQkJCS8vIHN0YXJ0IHRoZSByZWNvbnN0cnVjdAorCXBkZXYtPnJlY29uQ291bnQgPSAxOTkwOwkJCQkJCQkJCQkJCS8vIG1hcmsgdGFyZ2V0IGRyaXZlIGVhcmx5CisJcmV0dXJuIHBkZXYtPkRpc2tNaXJyb3JbaW5kZXhdLnJlY29uc3RydWN0UG9pbnQ7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVJlY29uVGltZXJFeHBpcnkJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVJlY29uc3RydWN0IHRpbWVyIGV4cGlyeSByb3V0aW5lLgorICoKKyAqCVBhcmFtZXRlcnM6CQlkYXRhIC0gUG9pbnRlciBhZGFwdGVyIGRhdGEgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQlOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUmVjb25UaW1lckV4cGlyeSAodW5zaWduZWQgbG9uZyBkYXRhKQorCXsKKwlQQURBUFRFUjIyMjBJCXBhZGFwdGVyID0gKFBBREFQVEVSMjIyMEkpZGF0YTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGFkYXB0ZXItPlNDcG50LT5kZXZpY2UtPmhvc3Q7CisJUE9VUl9ERVZJQ0UJCXBkZXY7CisJVUxPTkcJCQl0ZXN0c2l6ZSA9IDA7CisJUElERU5USUZZX0RBVEEJcGlkOworCVVTSE9SVAkJCW1pbm1vZGU7CisJVUxPTkcJCQl6bDsKKwlVQ0hBUgkJCXpjOworCVVTSE9SVAkJCXo7CisgICAgdW5zaWduZWQgbG9uZwlmbGFnczsKKworICAgIC8qCisgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzLCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IGRpc2FibGVkIGFuZCBhY3F1aXJlCisgICAgICogdGhlIEkvTyBzcGlubG9jay4KKyAgICAgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmICggcGFkYXB0ZXItPlNDcG50ICkKKwkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCisJcGFkYXB0ZXItPnJlY29uVGltZXIuZGF0YSA9IDA7CisJZm9yICggeiA9IHBhZGFwdGVyLT5kZXZJblJlY29uSW5kZXggKyAxOyAgeiA8IEJJR0RfTUFYRFJJVkVTOyAgeisrICkKKwkJeworCQlpZiAoIHBhZGFwdGVyLT5kZXZpY2Vbel0ucmVjb25PbiApCisJCQlicmVhazsKKwkJfQorCWlmICggeiA8IEJJR0RfTUFYRFJJVkVTICkKKwkJcGRldiA9ICZwYWRhcHRlci0+ZGV2aWNlW3pdOworCWVsc2UKKwkJeworCQlmb3IgKCB6ID0gMDsgIHogPCBCSUdEX01BWERSSVZFUzsgIHorKyApCisJCQl7CisJCQlpZiAoIHBhZGFwdGVyLT5kZXZpY2Vbel0ucmVjb25PbiApCisJCQkJYnJlYWs7CisJCQl9CisJCWlmICggeiA8IEJJR0RfTUFYRFJJVkVTICkKKwkJCXBkZXYgPSAmcGFkYXB0ZXItPmRldmljZVt6XTsKKwkJZWxzZQorCQkJeworCQkJcGFkYXB0ZXItPnJlY29uT24gPSBGQUxTRTsKKwkJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKwkJCX0KKwkJfQorCisJcGFkYXB0ZXItPmRldkluUmVjb25JbmRleCA9IHo7CisJcGlkID0gKFBJREVOVElGWV9EQVRBKXBhZGFwdGVyLT5rQnVmZmVyOworCXBhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwlpZiAoIHBkZXYtPnJlY29uSXNTdGFydGluZyApCisJCXsKKwkJcGRldi0+cmVjb25Jc1N0YXJ0aW5nID0gRkFMU0U7CisJCXBkZXYtPnJlY29uT24gPSBGQUxTRTsKKworCQl3aGlsZSAoIChwZGV2LT5EaXNrTWlycm9yWzBdLnNpZ25hdHVyZSA9PSBTSUdOQVRVUkUpICYmIChwZGV2LT5EaXNrTWlycm9yWzFdLnNpZ25hdHVyZSA9PSBTSUdOQVRVUkUpICYmCisJCQkgKHBkZXYtPkRpc2tNaXJyb3JbMF0ucGFpcklkZW50aWZpZXIgPT0gKHBkZXYtPkRpc2tNaXJyb3JbMV0ucGFpcklkZW50aWZpZXIgXiAxKSkgKQorCQkJeworCQkJaWYgKCAocGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX01BVENIRUQpICYmIChwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfTUFUQ0hFRCkgKQorCQkJCWJyZWFrOworCisJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUiApCQkJCS8vIGlzIGZpcnN0IGRyaXZlIHN1cnZpdm9yPworCQkJCXRlc3RzaXplID0gU2V0UmVjb25zdHJ1Y3QgKHBkZXYsIDApOworCQkJZWxzZQorCQkJCWlmICggcGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SICkJCQkvLyBpcyBzZWNvbmQgZHJpdmUgc3Vydml2b3I/CisJCQkJCXRlc3RzaXplID0gU2V0UmVjb25zdHJ1Y3QgKHBkZXYsIDEpOworCisJCQlpZiAoIChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgfHwgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9SRUJVSUxEKSApCisJCQkJeworCQkJCWlmICggcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQkJCQlwZGV2LT5taXJyb3JSZWNvbiA9IDA7CisJCQkJZWxzZQorCQkJCQlwZGV2LT5taXJyb3JSZWNvbiA9IDE7CisJCQkJcGRldi0+cmVjb25PbiA9IFRSVUU7CisJCQkJfQorCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKCAhcGRldi0+cmVjb25PbiApCisJCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisKKwkJaWYgKCBwYWRhcHRlci0+YmlnRCApCisJCQl7CisJCQlwYWRhcHRlci0+ZmFpbFJlZ2lzdGVyID0gMDsKKwkJCW91dGJfcCAofnBhZGFwdGVyLT5mYWlsUmVnaXN0ZXIsIHBhZGFwdGVyLT5yZWdGYWlsKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJemMgPSAoKGluYl9wIChwYWRhcHRlci0+cmVnU3RhdFNlbCkgPj4gMykgfCBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRTZWwpKSAmIDB4ODM7CQkvLyBtdXRlIHRoZSBhbGFybQorCQkJb3V0Yl9wICgweEZGLCBwYWRhcHRlci0+cmVnRmFpbCk7CisJCQl9CisKKwkJd2hpbGUgKCAxICkKKwkJCXsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogaGFyZCByZXNldCBpc3N1ZSIpKTsKKwkJCWlmICggSGFyZFJlc2V0IChwYWRhcHRlciwgcGRldiwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0pICkKKwkJCQl7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBzdWIgMSIpKTsKKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCXBkZXYtPmxhc3RzZWN0b3JsYmFbcGRldi0+bWlycm9yUmVjb25dID0gSW5saW5lSWRlbnRpZnkgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzW3BkZXYtPm1pcnJvclJlY29uXSwgcGRldi0+ZGV2aWNlSURbcGRldi0+bWlycm9yUmVjb25dICYgMSk7CisKKwkJCWlmICggcGRldi0+bGFzdHNlY3RvcmxiYVtwZGV2LT5taXJyb3JSZWNvbl0gPCB0ZXN0c2l6ZSApCisJCQkJeworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogc3ViIDIgJWxkICVsZCIsIHBkZXYtPmxhc3RzZWN0b3JsYmFbcGRldi0+bWlycm9yUmVjb25dLCB0ZXN0c2l6ZSkpOworCQkJCWJyZWFrOworCQkJCX0KKworCSAgICAgICAgLy8gdGVzdCBMQkEgYW5kIG11bHRpcGVyIHNlY3RvciB0cmFuc2ZlciBjb21wYXRpYmlsaXR5CisJCQlpZiAoIXBpZC0+U3VwcG9ydExCQSB8fCAocGlkLT5OdW1TZWN0b3JzUGVySW50IDwgU0VDVE9SU1hGRVIpIHx8ICFwaWQtPlZhbGlkXzY0XzcwICkKKwkJCQl7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBzdWIgMyIpKTsKKwkJCQlicmVhazsKKwkJCQl9CisKKwkgICAgICAgIC8vIHRlc3QgUElPL2J1cyBtYXRlcmluZyBtb2RlIGNvbXBhdGliaWxpdHkKKwkJCWlmICggKHBpZC0+TWluUElPQ3ljbGVXaXRob3V0RmxvdyA+IDI0MCkgJiYgIXBpZC0+U3VwcG9ydElPUkRZRGlzYWJsZSAmJiAhcGFkYXB0ZXItPnRpbWluZ1BJTyApCisJCQkJeworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogc3ViIDQiKSk7CisJCQkJYnJlYWs7CisJCQkJfQorCisJCQlpZiAoIHBpZC0+TWluUElPQ3ljbGVXaXRob3V0RmxvdyA8PSAxMjAgKQkvLyBzZXR1cCB0aW1pbmcgbW9kZSBvZiBkcml2ZQorCQkJCW1pbm1vZGUgPSA1OworCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoIHBpZC0+TWluUElPQ3lsY2VXaXRoRmxvdyA8PSAxNTAgKQorCQkJCQltaW5tb2RlID0gNDsKKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKCBwaWQtPk1pblBJT0N5bGNlV2l0aEZsb3cgPD0gMTgwICkKKwkJCQkJCW1pbm1vZGUgPSAzOworCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlpZiAoIHBpZC0+TWluUElPQ3lsY2VXaXRoRmxvdyA8PSAyNDAgKQorCQkJCQkJCW1pbm1vZGUgPSAyOworCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IHN1YiA1IikpOworCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKCBwYWRhcHRlci0+dGltaW5nTW9kZSA+IG1pbm1vZGUgKQkJCQkJCQkJCS8vIHNldCBtaW5pbXVtIHRpbWluZyBtb2RlCisJCQkJcGFkYXB0ZXItPnRpbWluZ01vZGUgPSBtaW5tb2RlOworCQkJaWYgKCBwYWRhcHRlci0+dGltaW5nTW9kZSA+PSAyICkKKwkJCQlwYWRhcHRlci0+dGltaW5nQWRkcmVzcwk9IE1vZGVBcnJheVtwYWRhcHRlci0+dGltaW5nTW9kZSAtIDJdOworCQkJZWxzZQorCQkJCXBhZGFwdGVyLT50aW1pbmdQSU8gPSBUUlVFOworCisJCQlwYWRhcHRlci0+cmVjb25PbiA9IFRSVUU7CisJCQlicmVhazsKKwkJCX0KKworCQlpZiAoICFwZGV2LT5yZWNvbk9uICkKKwkJCXsJCQorCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gcGRldi0+bWlycm9yUmVjb24gXiAxOworCQkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9GQUlMT1ZFUjsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSA3IikpOworCQkJSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldik7CisJCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJCQl9CisKKwkJcGRldi0+cmFpZCA9IFRSVUU7CisJCisJCWlmICggV3JpdGVTaWduYXR1cmUgKHBhZGFwdGVyLCBwZGV2LCBwZGV2LT5zcGlnb3QsIHBkZXYtPm1pcnJvclJlY29uIF4gMSkgKQorCQkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCQlwYWRhcHRlci0+cmVjb25QaGFzZSA9IFJFQ09OX1BIQVNFX01BUktJTkc7CisJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKwkJfQorCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gcmVjb25zdHJ1Y3QgY29weSBzdGFydHMgaGVyZQkKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlpZiAoIHBkZXYtPnJlY29uQ291bnQrKyA+IDIwMDAgKQorCQl7CisJCXBkZXYtPnJlY29uQ291bnQgPSAwOworCQlpZiAoIFdyaXRlU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0sIHBkZXYtPm1pcnJvclJlY29uKSApCisJCQl7CisJCQlwYWRhcHRlci0+c3Vydml2b3IgPSBwZGV2LT5taXJyb3JSZWNvbiBeIDE7CisJCQlwYWRhcHRlci0+cmVjb25QaGFzZSA9IFJFQ09OX1BIQVNFX0ZBSUxPVkVSOworCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDgiKSk7CisJCQlJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KTsKKwkJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKwkJCX0KKwkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9VUERBVEU7CisJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKwkJfQorCisJemwgPSBwZGV2LT5EaXNrTWlycm9yW3BkZXYtPm1pcnJvclJlY29uXS5yZWNvbnN0cnVjdFBvaW50OwkKKwlwYWRhcHRlci0+cmVjb25TaXplID0gcGRldi0+RGlza01pcnJvcltwZGV2LT5taXJyb3JSZWNvbiBeIDFdLnJlY29uc3RydWN0UG9pbnQgLSB6bDsKKwlpZiAoIHBhZGFwdGVyLT5yZWNvblNpemUgPiBNQVhfQlVTX01BU1RFUl9CTE9DS1MgKQorCQlwYWRhcHRlci0+cmVjb25TaXplID0gTUFYX0JVU19NQVNURVJfQkxPQ0tTOworCisJaWYgKCBwYWRhcHRlci0+cmVjb25TaXplICkKKwkJeworCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdIHwgcGRldi0+c3BpZ290c1sxXSk7CS8vIHNlbGVjdCB0aGUgc3BpZ290cworCQlvdXRiX3AgKHBkZXYtPmJ5dGU2IHwgKChVQ0hBUiAqKSgmemwpKVszXSwgcGFkYXB0ZXItPnJlZ0xiYTI0KTsJLy8gc2VsZWN0IHRoZSBkcml2ZQorCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QpOworCQlpZiAoIFdhaXRSZWFkeSAocGFkYXB0ZXIpICkKKwkJCWdvdG8gcmVjb25UaW1lckV4cGlyeTsKKworCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzW3BkZXYtPm1pcnJvclJlY29uXSk7CisJCWlmICggV2FpdFJlYWR5IChwYWRhcHRlcikgKQorCQkJeworCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gcGRldi0+bWlycm9yUmVjb24gXiAxOworCQkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9GQUlMT1ZFUjsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSA5IikpOworCQkJSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldik7CisJCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJCQl9CisJCisJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbMF0gfCBwZGV2LT5zcGlnb3RzWzFdKTsKKwkJb3V0Yl9wIChwYWRhcHRlci0+cmVjb25TaXplICYgMHhGRiwgcGFkYXB0ZXItPnJlZ1NlY3RDb3VudCk7CisJCW91dGJfcCAoKChVQ0hBUiAqKSgmemwpKVswXSwgcGFkYXB0ZXItPnJlZ0xiYTApOworCQlvdXRiX3AgKCgoVUNIQVIgKikoJnpsKSlbMV0sIHBhZGFwdGVyLT5yZWdMYmE4KTsKKwkJb3V0Yl9wICgoKFVDSEFSICopKCZ6bCkpWzJdLCBwYWRhcHRlci0+cmVnTGJhMTYpOworCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gVFJVRTsKKwkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9SRUFEWTsKKwkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0pOworCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBXUklURV9DTUQpOworCQlTdGFydFRpbWVyIChwYWRhcHRlcik7CisJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdCk7CisJCVdyaXRlQ29tbWFuZCAocGFkYXB0ZXIsIFJFQURfQ01EKTsKKwkJZ290byByZWNvblRpbWVyRXhwaXJ5OworCQl9CisKKwlwZGV2LT5EaXNrTWlycm9yW3BkZXYtPm1pcnJvclJlY29uXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9NQVRDSEVEOworCXBkZXYtPkRpc2tNaXJyb3JbcGRldi0+bWlycm9yUmVjb24gXiAxXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9NQVRDSEVEOworCWlmICggV3JpdGVTaWduYXR1cmUgKHBhZGFwdGVyLCBwZGV2LCBwZGV2LT5zcGlnb3QsIHBkZXYtPm1pcnJvclJlY29uIF4gMSkgKQorCQlnb3RvIHJlY29uVGltZXJFeHBpcnk7CisJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9MQVNUOworCityZWNvblRpbWVyRXhwaXJ5OjsKKyAgICAvKgorICAgICAqIFJlbGVhc2UgdGhlIEkvTyBzcGlubG9jayBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmxhZ3MKKyAgICAgKiB3aGljaCB3aWxsIGVuYWJsZSBpbnRlcnJ1cHRzIGlmIGFuZCBvbmx5IGlmIHRoZXkgd2VyZQorICAgICAqIGVuYWJsZWQgb24gZW50cnkuCisgICAgICovCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJSXJxX0hhbmRsZXIJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CUludGVycnVwdCBoYW5kbGVyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlpcnEJCS0gSGFyZHdhcmUgSVJRIG51bWJlci4KKyAqCQkJCQlkZXZfaWQJLQorICoJCQkJCXJlZ3MJLQorICoKKyAqCVJldHVybnM6CQlUUlVFIGlmIGRyaXZlIGlzIG5vdCByZWFkeSBpbiB0aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90IElycV9IYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorCXsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAgKnNob3N0ID0gTlVMTDsJLy8gUG9pbnRlciB0byBob3N0IGRhdGEgYmxvY2sKKwlQQURBUFRFUjIyMjBJCQlwYWRhcHRlcjsJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVBPVVJfREVWSUNFCQkJcGRldjsKKwlTY3NpX0NtbmQJCSAgICpTQ3BudDsKKwlVQ0hBUgkJCQlzdGF0dXM7CisJVUNIQVIJCQkJc3RhdHVzMTsKKwlBVEFQSV9TVEFUVVMJCXN0YXR1c2E7CisJQVRBUElfUkVBU09OCQlyZWFzb25hOworCUFUQVBJX0VSUk9SCQkJZXJyb3JhOworCWludAkJCQkJejsKKwlVTE9ORwkJCQl6bDsKKyAgICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisKKy8vCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaSByZWNlaXZlZCBpbnRlcnJ1cHRcbiIpKTsKKworCWZvciAoIHogPSAwOyB6IDwgTnVtQWRhcHRlcnM7ICB6KysgKQkJCQkJCQkJLy8gc2NhbiBmb3IgaW50ZXJydXB0IHRvIHByb2Nlc3MKKwkJeworCQlpZiAoIFBzaUhvc3Rbel0tPmlycSA9PSAoVUNIQVIpKGlycSAmIDB4RkYpICkKKwkJCXsKKwkJCWlmICggaW53X3AgKEhPU1REQVRBKFBzaUhvc3Rbel0pLT5yZWdJcnFDb250cm9sKSAmIDB4ODAwMCApCisJCQkJeworCQkJCXNob3N0ID0gUHNpSG9zdFt6XTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCWlmICggIXNob3N0ICkKKwkJeworCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IG5vdCBteSBpbnRlcnJ1cHQiKSk7CisJCWdvdG8gb3V0OworCQl9CisKKwloYW5kbGVkID0gMTsKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcGFkYXB0ZXIgPSBIT1NUREFUQShzaG9zdCk7CisJcGRldiA9IHBhZGFwdGVyLT5wZGV2OworCVNDcG50ID0gcGFkYXB0ZXItPlNDcG50OworCW91dGJfcCAoMHgwOCwgcGFkYXB0ZXItPnJlZ0RtYUNtZFN0YXQpOwkJCQkJCQkJCS8vIGNhbmNlbCBpbnRlcnJ1cHQgZnJvbSBETUEgZW5naW5lCisKKwlpZiAoIHBhZGFwdGVyLT5hdGFwaSAmJiBTQ3BudCApCisJCXsKKwkJKihjaGFyICopJnN0YXR1c2EgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOwkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBzdGF0dXMKKwkJKihjaGFyICopJnJlYXNvbmEgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NlY3RDb3VudCk7CQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIGludGVycnVwdCByZWFzb24KKwkKKwkJaWYgKCAhc3RhdHVzYS5ic3kgKQorCQkJeworCQkJaWYgKCBzdGF0dXNhLmRycSApCQkJCQkJCQkJCQkJCS8vIHRlc3QgZm9yIHRyYW5zZmVyIHBoYXNlCisJCQkJeworCQkJCWlmICggIXJlYXNvbmEuY29kICkJCQkJCQkJCQkJCQkvLyB0ZXN0IGZvciBkYXRhIHBoYXNlCisJCQkJCXsKKwkJCQkJeiA9IChVTE9ORylpbmJfcCAocGFkYXB0ZXItPnJlZ0xiYTgpIHwgKFVMT05HKShpbmJfcCAocGFkYXB0ZXItPnJlZ0xiYTE2KSA8PCA4KTsKKwkJCQkJaWYgKCBwYWRhcHRlci0+cmVxU2Vuc2UgKQorCQkJCQkJaW5zdyAocGFkYXB0ZXItPnJlZ0RhdGEsIFNDcG50LT5zZW5zZV9idWZmZXIsIHogLyAyKTsKKwkJCQkJZWxzZQorCQkJCQkJQXRhcGlCdXNNYXN0ZXIgKHBhZGFwdGVyLCByZWFzb25hLmlvLCB6KTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJaWYgKCByZWFzb25hLmNvZCAmJiAhcmVhc29uYS5pbyApCQkJCQkJCQkvLyB0ZXN0IGZvciBjb21tYW5kIHBhY2tldCBwaGFzZQorCQkJCQl7CisJCQkJCWlmICggcGFkYXB0ZXItPnJlcVNlbnNlICkKKwkJCQkJCUF0YXBpUmVxdWVzdFNlbnNlIChwYWRhcHRlciwgcGRldiwgU0NwbnQsIFRSVUUpOworCQkJCQllbHNlCisJCQkJCQlBdGFwaVNlbmRDZGIgKHBhZGFwdGVyLCBwZGV2LCBwYWRhcHRlci0+YXRhcGlDZGIpOworCQkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWlmICggcmVhc29uYS5pbyAmJiBzdGF0dXNhLmRyZHkgKQkJCQkJCQkJLy8gdGVzdCBmb3Igc3RhdHVzIHBoYXNlCisJCQkJCXsKKwkJCQkJQXRhcGkyU2NzaSAocGFkYXB0ZXIsIFNDcG50KTsKKwkJCQkJaWYgKCBzdGF0dXNhLmNoZWNrICkKKwkJCQkJCXsKKwkJCQkJCSooVUNIQVIgKikmZXJyb3JhID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdFcnJvcik7CQkJLy8gcmVhZCB0aGUgZGV2aWNlIGVycm9yCisJCQkJCQlpZiAoIGVycm9yYS5zZW5zZUtleSApCisJCQkJCQkJeworCQkJCQkJCWlmICggcGFkYXB0ZXItPnJlcVNlbnNlIHx8IEF0YXBpUmVxdWVzdFNlbnNlIChwYWRhcHRlciwgcGRldiwgU0NwbnQsIEZBTFNFKSApCisJCQkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQlpZiAoIGVycm9yYS5pbGkgfHwgZXJyb3JhLmFib3J0ICkKKwkJCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJaWYgKCBwYWRhcHRlci0+cmVxU2Vuc2UgKQorCQkJCQkJCXsKKwkJCQkJCQlERUIgKHByaW50ayAoIlBDSTIyNDJJOiBTZW5zZSBjb2RlcyAtICVYICVYICVYICIsICgoVUNIQVIgKilTQ3BudC0+c2Vuc2VfYnVmZmVyKVswXSwgKChVQ0hBUiAqKVNDcG50LT5zZW5zZV9idWZmZXIpWzEyXSwgKChVQ0hBUiAqKVNDcG50LT5zZW5zZV9idWZmZXIpWzEzXSkpOworCQkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIChEUklWRVJfU0VOU0UgPDwgMjQpIHwgKERJRF9PSyA8PCAxNikgfCAyKTsKKwkJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsJCisJCQkJCX0KKwkJCQl9CisJCQl9CQkKKwkJZ290byBpcnFfcmV0dXJuOworCQl9CisJCisJaWYgKCAhcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSB8fCAhKFNDcG50IHx8IHBhZGFwdGVyLT5yZWNvblBoYXNlKSApCisJCXsKKwkJREVCKHByaW50ayAoIlxucGNpMjIyMGkgVW5zb2xpY2l0ZWQgaW50ZXJydXB0XG4iKSk7CisJCVNUT1BfSEVSRSAoKTsKKwkJZ290byBpcnFfcmV0dXJuOworCQl9CisJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IDA7CisKKwlpZiAoIHBhZGFwdGVyLT5mYWlsaW5wcm9nICkKKwkJeworCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGkgaW50ZXJydXB0IGZhaWxvdmVyIGNvbXBsZXRlIikpOworCQlwYWRhcHRlci0+ZmFpbGlucHJvZyA9IEZBTFNFOworCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOwkJCQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQlpZiAoIHN0YXR1cyAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJeworCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBpbnRlcnJ1cHQgZmFpbG92ZXIgZXJyb3IgZnJvbSBkcml2ZSAlWCIsIHN0YXR1cykpOworCQkJcGFkYXB0ZXItPmNtZCA9IDA7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogcmVzdGFydGluZyBmYWlsZWQgb3BlcnRhdGlvbi4iKSk7CisJCQlwZGV2LT5zcGlnb3QgPSAocGFkYXB0ZXItPnN1cnZpdm9yKSA/IHBkZXYtPnNwaWdvdHNbMV0gOiBwZGV2LT5zcGlnb3RzWzBdOworCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCWlmICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQllbHNlCisJCQkJUGNpMjIyMGlfUXVldWVDb21tYW5kIChTQ3BudCwgU0NwbnQtPnNjc2lfZG9uZSk7CisJCQlnb3RvIGlycV9yZXR1cm47CQkKKwkJCX0KKwkJfQorCisJaWYgKCBwYWRhcHRlci0+cmVjb25QaGFzZSApCisJCXsKKwkJc3dpdGNoICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQkJeworCQkJY2FzZSBSRUNPTl9QSEFTRV9NQVJLSU5HOgorCQkJY2FzZSBSRUNPTl9QSEFTRV9MQVNUOgorCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJLy8gcmVhZCB0aGUgZGV2aWNlIHN0YXR1cworCQkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQkJaWYgKCBwYWRhcHRlci0+cmVjb25QaGFzZSA9PSBSRUNPTl9QSEFTRV9MQVNUICkKKwkJCQkJeworCQkJCQlpZiAoIHN0YXR1cyAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJCQkJeworCQkJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKCBwZGV2LT5zcGlnb3QgPT0gcGRldi0+c3BpZ290c1swXSApID8gMSA6IDA7CisJCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTAiKSk7CisJCQkJCQlpZiAoIEluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBEZWNvZGVFcnJvciAocGFkYXB0ZXIsIHN0YXR1cykpOworCQkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQkJfQorCQkJCQlpZiAoIFdyaXRlU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0sIHBkZXYtPm1pcnJvclJlY29uKSApCisJCQkJCQl7CisJCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAwIDogMTsKKwkJCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAxMSIpKTsKKwkJCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJCU9wRG9uZSAocGFkYXB0ZXIsIERlY29kZUVycm9yIChwYWRhcHRlciwgc3RhdHVzKSk7CisJCQkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJCQl9CisJCQkJCXBhZGFwdGVyLT5yZWNvblBoYXNlID0gUkVDT05fUEhBU0VfRU5EOwkKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQlnb3RvIGlycV9yZXR1cm47CisKKwkJCWNhc2UgUkVDT05fUEhBU0VfUkVBRFk6CisJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJCQkJeworCQkJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBEZWNvZGVFcnJvciAocGFkYXB0ZXIsIHN0YXR1cykpOworCQkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJCX0KKwkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzW3BkZXYtPm1pcnJvclJlY29uXSk7CisJCQkJaWYgKCBXYWl0RHJxIChwYWRhcHRlcikgKQorCQkJCQl7CisJCQkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDAgOiAxOworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTIiKSk7CisJCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpKTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290IHwgU0VMX0NPUFkgfCBwYWRhcHRlci0+YmlnRCk7CisJCQkJcGFkYXB0ZXItPnJlY29uUGhhc2UgPSBSRUNPTl9QSEFTRV9DT1BZOworCQkJCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSBUUlVFOworCQkJCWlmICggcGFkYXB0ZXItPnRpbWluZ1BJTyApCisJCQkJCXsKKwkJCQkJaW5zdyAocGFkYXB0ZXItPnJlZ0RhdGEsIHBhZGFwdGVyLT5rQnVmZmVyLCBwYWRhcHRlci0+cmVjb25TaXplICogKEJZVEVTX1BFUl9TRUNUT1IgLyAyKSk7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKCAocGFkYXB0ZXItPnRpbWluZ01vZGUgPiAzKSApCisJCQkJCQl7CisJCQkJCQlpZiAoIHBhZGFwdGVyLT5iaWdEICkKKwkJCQkJCQlvdXRsIChCSUdEX0RBVEFfTU9ERTMsIHBhZGFwdGVyLT5yZWdEbWFBZGRyTG9jKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlvdXRsIChEQUxFX0RBVEFfTU9ERTMsIHBhZGFwdGVyLT5yZWdEbWFBZGRyTG9jKTsKKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJb3V0bCAocGFkYXB0ZXItPnRpbWluZ0FkZHJlc3MsIHBhZGFwdGVyLT5yZWdEbWFBZGRyTG9jKTsKKwkJCQkJb3V0bCAocGFkYXB0ZXItPmtCdWZmZXJEbWEsIHBhZGFwdGVyLT5yZWdEbWFBZGRyUGNpKTsKKwkJCQkJb3V0bCAocGFkYXB0ZXItPnJlY29uU2l6ZSAqIEJZVEVTX1BFUl9TRUNUT1IsIHBhZGFwdGVyLT5yZWdEbWFDb3VudCk7CisJCQkJCW91dGJfcCAoOCwgcGFkYXB0ZXItPnJlZ0RtYURlc2MpOwkJCQkJCS8vIHJlYWQgb3BlcmF0aW9uCisJCQkJCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQkJCQkJb3V0Yl9wICg4LCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCQkvLyBubyBpbnRlcnJ1cHQKKwkJCQkJZWxzZQorCQkJCQkJb3V0Yl9wICgxLCBwYWRhcHRlci0+cmVnRG1hTW9kZSk7CQkJCQkvLyBubyBpbnRlcnJ1cHQKKwkJCQkJb3V0Yl9wICgweDAzLCBwYWRhcHRlci0+cmVnRG1hQ21kU3RhdCk7CQkJCQkvLyBraWNrIHRoZSBETUEgZW5naW5lIGluIGdlYXIKKwkJCQkJfQorCQkJCWdvdG8gaXJxX3JldHVybjsKKworCQkJY2FzZSBSRUNPTl9QSEFTRV9DT1BZOgorCQkJCXBkZXYtPkRpc2tNaXJyb3JbcGRldi0+bWlycm9yUmVjb25dLnJlY29uc3RydWN0UG9pbnQgKz0gcGFkYXB0ZXItPnJlY29uU2l6ZTsKKworCQkJY2FzZSBSRUNPTl9QSEFTRV9VUERBVEU6CisJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1twZGV2LT5taXJyb3JSZWNvbl0gfCBTRUxfSVJRX09GRik7CisJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCQlpZiAoIHN0YXR1cyAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJCQl7CisJCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDAgOiAxOworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTMiKSk7CisJCQkJCURFQiAocHJpbnRrICgiXG4gIHN0YXR1cyByZWdpc3RlciA9ICVYICAgZXJyb3IgPSAlWCIsIHN0YXR1cywgaW5iX3AgKHBhZGFwdGVyLT5yZWdFcnJvcikpKTsKKwkJCQkJaWYgKCBJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBEZWNvZGVFcnJvciAocGFkYXB0ZXIsIHN0YXR1cykpOworCQkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJCX0KKwkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfT0sgPDwgMTYpOworCQkJCWdvdG8gaXJxX3JldHVybjsKKworCQkJY2FzZSBSRUNPTl9QSEFTRV9FTkQ6CisJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCQlpZiAoIHN0YXR1cyAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJCQl7CisJCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9ICggcGRldi0+c3BpZ290ID09IHBkZXYtPnNwaWdvdHNbMF0gKSA/IDAgOiAxOworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTQiKSk7CisJCQkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpKTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJcGRldi0+cmVjb25PbiA9IDA7CisJCQkJaWYgKCBwYWRhcHRlci0+YmlnRCApCisJCQkJCXsKKwkJCQkJZm9yICggeiA9IDA7ICB6IDwgcGFkYXB0ZXItPm51bWJlck9mRHJpdmVzOyAgeisrICkKKwkJCQkJCXsKKwkJCQkJCWlmICggcGFkYXB0ZXItPmRldmljZVt6XS5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IgKQorCQkJCQkJCXsKKwkJCQkJCQlBbGFybSAocGFkYXB0ZXIsIHBhZGFwdGVyLT5kZXZpY2Vbel0uZGV2aWNlSURbMF0gXiAyKTsKKwkJCQkJCQlNdXRlQWxhcm0gKHBhZGFwdGVyKTsKKwkJCQkJCQl9CisJCQkJCQlpZiAoIHBhZGFwdGVyLT5kZXZpY2Vbel0uRGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SICkKKwkJCQkJCQl7CisJCQkJCQkJQWxhcm0gKHBhZGFwdGVyLCBwYWRhcHRlci0+ZGV2aWNlW3pdLmRldmljZUlEWzFdIF4gMik7CisJCQkJCQkJTXV0ZUFsYXJtIChwYWRhcHRlcik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQlnb3RvIGlycV9yZXR1cm47CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBpcnFfcmV0dXJuOworCQkJfQorCQl9CisJCQorCXN3aXRjaCAoIHBhZGFwdGVyLT5jbWQgKQkJCQkJCQkJCQkJCS8vIGRlY2lkZSBob3cgdG8gaGFuZGxlIHRoZSBpbnRlcnJ1cHQKKwkJeworCQljYXNlIFJFQURfQ01EOgorCQkJaWYgKCBwYWRhcHRlci0+c2VjdG9yQ291bnQgKQorCQkJCXsKKwkJCQlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1N0YXRDbWQpOwkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBzdGF0dXMKKwkJCQlpZiAoIHN0YXR1cyAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJCQl7CisJCQkJCWlmICggcGRldi0+cmFpZCApCisJCQkJCQl7CisJCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAoIHBkZXYtPnNwaWdvdCA9PSBwZGV2LT5zcGlnb3RzWzBdICkgPyAxIDogMDsKKwkJCQkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTUiKSk7CisJCQkJCQlpZiAoICFJbml0RmFpbG92ZXIgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQkJfQorCQkJCQlicmVhazsJCisJCQkJCX0KKwkJCQlpZiAoIHBhZGFwdGVyLT50aW1pbmdQSU8gKQorCQkJCQl7CisJCQkJCWluc3cgKHBhZGFwdGVyLT5yZWdEYXRhLCBwYWRhcHRlci0+a0J1ZmZlciwgcGFkYXB0ZXItPnJlYWRDb3VudCAvIDIpOworCQkJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgLT0gcGFkYXB0ZXItPnJlYWRDb3VudCAvIEJZVEVTX1BFUl9TRUNUT1I7CisJCQkJCVdhbGtTY2F0R2F0aCAocGFkYXB0ZXIsIFRSVUUsIHBhZGFwdGVyLT5yZWFkQ291bnQpOworCQkJCQlpZiAoICFwYWRhcHRlci0+c2VjdG9yQ291bnQgKQorCQkJCQkJeworCQkJCQkJc3RhdHVzID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggcGFkYXB0ZXItPnJlYWRDb3VudCApCisJCQkJCQlXYWxrU2NhdEdhdGggKHBhZGFwdGVyLCBUUlVFLCBwYWRhcHRlci0+cmVhZENvdW50KTsKKwkJCQkJQnVzTWFzdGVyIChwYWRhcHRlciwgMSwgMSk7CisJCQkJCX0KKwkJCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gVFJVRTsKKwkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJfQorCQkJaWYgKCBwYWRhcHRlci0+cmVhZENvdW50ICYmICFwYWRhcHRlci0+dGltaW5nUElPICkKKwkJCQlXYWxrU2NhdEdhdGggKHBhZGFwdGVyLCBUUlVFLCBwYWRhcHRlci0+cmVhZENvdW50KTsKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFdSSVRFX0NNRDoKKwkJCWlmICggcGRldi0+cmFpZCApCisJCQkJeworCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdHNbMF0gfCBTRUxfSVJRX09GRik7CQkJCQorCQkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290c1sxXSB8IFNFTF9JUlFfT0ZGKTsJCQkJCisJCQkJc3RhdHVzMSA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CQkJCQkJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJCQkJfQorCQkJZWxzZQorCQkJCVNlbGVjdFNwaWdvdCAocGFkYXB0ZXIsIHBkZXYtPnNwaWdvdCB8IFNFTF9JUlFfT0ZGKTsJCQkJCisJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBzdGF0dXMKKwkJCQlzdGF0dXMxID0gMDsKKwkJCisJCQlpZiAoIHN0YXR1cyAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJCXsJCisJCQkJaWYgKCBwZGV2LT5yYWlkICYmICEoc3RhdHVzMSAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkpICkKKwkJCQkJeworCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAxOworCQkJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QgfCBTRUxfSVJRX09GRik7CisJCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAxNiAgc3RhdHVzID0gJVggIGVycm9yID0gJVgiLCBzdGF0dXMsIGluYl9wIChwYWRhcHRlci0+cmVnRXJyb3IpKSk7CisJCQkJCWlmICggIUluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCWdvdG8gaXJxX3JldHVybjsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmICggcGRldi0+cmFpZCApCisJCQkJeworCQkJCWlmICggc3RhdHVzMSAmIChJREVfU1RBVFVTX0VSUk9SIHwgSURFX1NUQVRVU19XUklURV9GQVVMVCkgKQorCQkJCQl7CQorCQkJCQlwYWRhcHRlci0+c3Vydml2b3IgPSAwOworCQkJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTcgIHN0YXR1cyA9ICVYICBlcnJvciA9ICVYIiwgc3RhdHVzMSwgaW5iX3AgKHBhZGFwdGVyLT5yZWdFcnJvcikpKTsKKwkJCQkJaWYgKCAhSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQlzdGF0dXMgPSBzdGF0dXMxOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWlmICggcGFkYXB0ZXItPnNlY3RvckNvdW50ICkKKwkJCQkJeworCQkJCQlzdGF0dXMgPSBXcml0ZURhdGFCb3RoIChwYWRhcHRlciwgcGRldik7CisJCQkJCWlmICggc3RhdHVzICkKKwkJCQkJCXsKKwkJCQkJCXBhZGFwdGVyLT5zdXJ2aXZvciA9IHN0YXR1cyA+PiAxOworCQkJCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAxOCIpKTsKKwkJCQkJCWlmICggIUluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJCQlnb3RvIGlycV9yZXR1cm47CisJCQkJCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzW3N0YXR1c10gfCBTRUxfSVJRX09GRik7CQkJCQorCQkJCQkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTdGF0Q21kKTsJCQkJCQkJCS8vIHJlYWQgdGhlIGRldmljZSBzdGF0dXMKKwkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gVFJVRTsKKwkJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCQl9CisJCQkJc3RhdHVzID0gMDsKKwkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoIHBhZGFwdGVyLT5zZWN0b3JDb3VudCApCQorCQkJCXsJCisJCQkJU2VsZWN0U3BpZ290IChwYWRhcHRlciwgcGRldi0+c3BpZ290IHwgcGFkYXB0ZXItPmJpZ0QpOworCQkJCXN0YXR1cyA9IFdyaXRlRGF0YSAocGFkYXB0ZXIpOworCQkJCWlmICggc3RhdHVzICkKKwkJCQkJYnJlYWs7CisJCQkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IFRSVUU7CisJCQkJZ290byBpcnFfcmV0dXJuOworCQkJCX0KKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKworCQljYXNlIElERV9DT01NQU5EX0lERU5USUZZOgorCQkJeworCQkJUElOUVVJUllEQVRBCXBpbnF1aXJ5RGF0YSAgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCQlQSURFTlRJRllfREFUQQlwaWQgPSAoUElERU5USUZZX0RBVEEpcGFkYXB0ZXItPmtCdWZmZXI7CisKKwkJCXN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU3RhdENtZCk7CisJCQlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfRFJRICkKKwkJCQl7CisJCQkJaW5zdyAocGFkYXB0ZXItPnJlZ0RhdGEsIHBpZCwgc2l6ZW9mIChJREVOVElGWV9EQVRBKSA+PiAxKTsKKworCQkJCW1lbXNldCAocGlucXVpcnlEYXRhLCAwLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsJCS8vIFplcm8gSU5RVUlSWSBkYXRhIHN0cnVjdHVyZS4KKwkJCQlwaW5xdWlyeURhdGEtPkRldmljZVR5cGUgPSAwOworCQkJCXBpbnF1aXJ5RGF0YS0+VmVyc2lvbnMgPSAyOworCQkJCXBpbnF1aXJ5RGF0YS0+QWRkaXRpb25hbExlbmd0aCA9IDM1IC0gNDsKKworCQkJCS8vIEZpbGwgaW4gdmVuZG9yIGlkZW50aWZpY2F0aW9uIGZpZWxkcy4KKwkJCQlmb3IgKCB6ID0gMDsgIHogPCAyMDsgIHogKz0gMiApCisJCQkJCXsKKwkJCQkJcGlucXVpcnlEYXRhLT5WZW5kb3JJZFt6XQkgID0gKChVQ0hBUiAqKXBpZC0+TW9kZWxOdW1iZXIpW3ogKyAxXTsKKwkJCQkJcGlucXVpcnlEYXRhLT5WZW5kb3JJZFt6ICsgMV0gPSAoKFVDSEFSICopcGlkLT5Nb2RlbE51bWJlcilbel07CisJCQkJCX0KKworCQkJCS8vIEluaXRpYWxpemUgdW51c2VkIHBvcnRpb24gb2YgcHJvZHVjdCBpZC4KKwkJCQlmb3IgKCB6ID0gMDsgIHogPCA0OyAgeisrICkKKwkJCQkJcGlucXVpcnlEYXRhLT5Qcm9kdWN0SWRbMTIgKyB6XSA9ICcgJzsKKworCQkJCS8vIE1vdmUgZmlybXdhcmUgcmV2aXNpb24gZnJvbSBJREVOVElGWSBkYXRhIHRvCisJCQkJLy8gcHJvZHVjdCByZXZpc2lvbiBpbiBJTlFVSVJZIGRhdGEuCisJCQkJZm9yICggeiA9IDA7ICB6IDwgNDsgIHogKz0gMiApCisJCQkJCXsKKwkJCQkJcGlucXVpcnlEYXRhLT5Qcm9kdWN0UmV2aXNpb25MZXZlbFt6XQkgPSAoKFVDSEFSICopcGlkLT5GaXJtd2FyZVJldmlzaW9uKVt6ICsgMV07CisJCQkJCXBpbnF1aXJ5RGF0YS0+UHJvZHVjdFJldmlzaW9uTGV2ZWxbeiArIDFdID0gKChVQ0hBUiAqKXBpZC0+RmlybXdhcmVSZXZpc2lvbilbel07CisJCQkJCX0KKwkJCQlpZiAoIHBkZXYgPT0gcGFkYXB0ZXItPmRldmljZSApCisJCQkJCSooKFVTSE9SVCAqKSgmcGlucXVpcnlEYXRhLT5WZW5kb3JTcGVjaWZpYykpID0gREVWSUNFX0RBTEVfMTsKKwkJCQkKKwkJCQlzdGF0dXMgPSAwOworCQkJCX0KKwkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCWRlbF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJaWYgKCBzdGF0dXMgKQorCQl7CisJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaSBJbnRlcnJ1cHQgaGFuZGxlciByZXR1cm4gZXJyb3IiKSk7CisJCXpsID0gRGVjb2RlRXJyb3IgKHBhZGFwdGVyLCBzdGF0dXMpOworCQl9CisJZWxzZQorCQl6bCA9IERJRF9PSyA8PCAxNjsKKworCU9wRG9uZSAocGFkYXB0ZXIsIHpsKTsKK2lycV9yZXR1cm46CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMjIwaV9RdWV1ZUNvbW1hbmQKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyBhIHF1ZXVlZCBjb21tYW5kIGZyb20gdGhlIFNDU0kgbWFuYWdlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJZG9uZSAgLSBQb2ludGVyIHRvIGRvbmUgZnVuY3Rpb24gdG8gY2FsbC4KKyAqCisgKglSZXR1cm5zOgkJU3RhdHVzIGNvZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjIyMGlfUXVldWVDb21tYW5kIChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQorCXsKKwlVQ0hBUgkJICAgKmNkYiA9IChVQ0hBUiAqKVNDcG50LT5jbW5kOwkJCQkJLy8gUG9pbnRlciB0byBTQ1NJIENEQgorCVBBREFQVEVSMjIyMEkJcGFkYXB0ZXIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KTsJCQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlQT1VSX0RFVklDRQkJcGRldgkgPSAmcGFkYXB0ZXItPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF07Ly8gUG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKwlVQ0hBUgkJCXJjOwkJCQkJCQkJCQkJLy8gY29tbWFuZCByZXR1cm4gY29kZQorCWludAkJCQl6OyAKKwlQREVWSUNFX1JBSUQxCXBkcjsKKworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCXBhZGFwdGVyLT5TQ3BudCA9IFNDcG50OyAgCQkJCQkJCQkJLy8gU2F2ZSB0aGlzIGNvbW1hbmQgZGF0YQorCXBhZGFwdGVyLT5yZWFkQ291bnQgPSAwOworCisJaWYgKCBTQ3BudC0+dXNlX3NnICkKKwkJeworCQlwYWRhcHRlci0+Y3VycmVudFNnQnVmZmVyID0gKChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilTQ3BudC0+cmVxdWVzdF9idWZmZXIpWzBdLmFkZHJlc3M7CisJCXBhZGFwdGVyLT5jdXJyZW50U2dDb3VudCA9ICgoc3RydWN0IHNjYXR0ZXJsaXN0ICopU0NwbnQtPnJlcXVlc3RfYnVmZmVyKVswXS5sZW5ndGg7CisJCX0KKwllbHNlCisJCXsKKwkJcGFkYXB0ZXItPmN1cnJlbnRTZ0J1ZmZlciA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJcGFkYXB0ZXItPmN1cnJlbnRTZ0NvdW50ID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJfQorCXBhZGFwdGVyLT5uZXh0U2cgPSAxOworCisJaWYgKCAhZG9uZSApCisJCXsKKwkJcHJpbnRrKCJwY2kyMjIwaV9xdWV1ZWNvbW1hbmQ6ICUwMlg6IGRvbmUgY2FuJ3QgYmUgTlVMTFxuIiwgKmNkYik7CisJCXJldHVybiAwOworCQl9CisJCisJaWYgKCBwYWRhcHRlci0+YXRhcGkgKQorCQl7CisJCVVDSEFSCQkJemxvLCB6aGk7CisKKwkJREVCIChwcmludGsgKCJcblBDSTIyNDJJOiBJRCAlZCwgTFVOICVkIG9wY29kZSAlWCAiLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmRldmljZS0+bHVuLCAqY2RiKSk7CisJCXBhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwkJaWYgKCAhcGRldi0+Ynl0ZTYgfHwgU0NwbnQtPmRldmljZS0+bHVuICkKKwkJCXsKKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9CQURfVEFSR0VUIDw8IDE2KTsKKwkJCXJldHVybiAwOworCQkJfQorCQorCQlwYWRhcHRlci0+YXRhcGlTcGVjaWFsID0gRkFMU0U7CisJCXBhZGFwdGVyLT5yZXFTZW5zZSA9IEZBTFNFOworCQltZW1zZXQgKHBhZGFwdGVyLT5hdGFwaUNkYiwgMCwgMTYpOworCQlTZWxlY3RTcGlnb3QgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3QpOwkJCQkJCQkJCS8vIHNlbGVjdCB0aGUgc3BpZ290CisJCUF0YXBpRGV2aWNlIChwYWRhcHRlciwgcGRldi0+Ynl0ZTYpOwkJCQkJCQkJCS8vIHNlbGVjdCB0aGUgZHJpdmUKKwkJaWYgKCBBdGFwaVdhaXRSZWFkeSAocGFkYXB0ZXIsIDEwMCkgKQorCQkJeworCQkJT3BEb25lIChwYWRhcHRlciwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJc3dpdGNoICggY2RiWzBdICkgCisJCQl7CisJCQljYXNlIFNDU0lPUF9NT0RFX1NFTlNFOgorCQkJY2FzZSBTQ1NJT1BfTU9ERV9TRUxFQ1Q6CisJCQkJU2NzaTJBdGFwaSAocGFkYXB0ZXIsIFNDcG50KTsKKwkJCQl6ID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiArIDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNDU0lPUF9SRUFENjoKKwkJCWNhc2UgU0NTSU9QX1dSSVRFNjoKKwkJCQlTY3NpMkF0YXBpIChwYWRhcHRlciwgU0NwbnQpOworCQkJCXogPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQltZW1jcHkgKHBhZGFwdGVyLT5hdGFwaUNkYiwgY2RiLCBTQ3BudC0+Y21kX2xlbik7CisJCQkJeiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJCQkJYnJlYWs7CisJCQl9CisJCWlmICggeiA+IEFUQVBJX1RSQU5TRkVSICkKKwkJCXogPSBBVEFQSV9UUkFOU0ZFUjsKKwkgICAgemxvID0gKFVDSEFSKSh6ICYgMHhGRik7CisJICAgIHpoaSA9IChVQ0hBUikoeiA+PiA4KTsKKworCSAJQXRhcGlDb3VudExvIChwYWRhcHRlciwgemxvKTsJCQkJCQkKKwkgICAJQXRhcGlDb3VudEhpIChwYWRhcHRlciwgemhpKTsJCQkJCQkKKwkgICAJb3V0Yl9wICgwLCBwYWRhcHRlci0+cmVnRXJyb3IpOwkJCQkJCQorCQlXcml0ZUNvbW1hbmQgKHBhZGFwdGVyLCBJREVfQ09NTUFORF9BVEFQSV9QQUNLRVQpOworCQlpZiAoIHBkZXYtPmNtZERycUludCApCisJCQlyZXR1cm4gMDsKKworCQlpZiAoIEF0YXBpV2FpdERycSAocGFkYXB0ZXIsIDUwMCkgKQorCQkJeworCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCXJldHVybiAwOworCQkJfQorCQlBdGFwaVNlbmRDZGIgKHBhZGFwdGVyLCBwZGV2LCBwYWRhcHRlci0+YXRhcGlDZGIpOwkKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlpZiAoIHBhZGFwdGVyLT5yZWNvblBoYXNlICkKKwkJcmV0dXJuIDA7CisJaWYgKCBwYWRhcHRlci0+cmVjb25UaW1lci5kYXRhICkKKwkJeworCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+cmVjb25UaW1lcik7CisJCXBhZGFwdGVyLT5yZWNvblRpbWVyLmRhdGEgPSAwOworCQl9CisJCQorCWlmICggKFNDcG50LT5kZXZpY2UtPmlkID49IHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlcykgfHwgU0NwbnQtPmRldmljZS0+bHVuICkKKwkJeworCQlPcERvbmUgKHBhZGFwdGVyLCBESURfQkFEX1RBUkdFVCA8PCAxNik7CisJCXJldHVybiAwOworCQl9CisJCisJc3dpdGNoICggKmNkYiApCisJCXsKKwkJY2FzZSBTQ1NJT1BfSU5RVUlSWTogICAJCQkJCS8vIGlucXVpcnkgQ0RCCisJCQl7CisJCQlpZiAoIGNkYlsyXSA9PSBTQ19NWV9SQUlEICkKKwkJCQl7CisJCQkJc3dpdGNoICggY2RiWzNdICkgCisJCQkJCXsKKwkJCQkJY2FzZSBNWV9TQ1NJX1JFQlVJTEQ6CisJCQkJCQlmb3IgKCB6ID0gMDsgIHogPCBwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXM7ICB6KysgKQorCQkJCQkJCXsKKwkJCQkJCQlwZGV2ID0gJnBhZGFwdGVyLT5kZXZpY2Vbel07CisJCQkJCQkJaWYgKCAoKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgJiYgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9NSVJST1JFRCkpIHx8CisJCQkJCQkJCSAoKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgJiYgKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9NSVJST1JFRCkpICkKKwkJCQkJCQkJeworCQkJCQkJCQlwYWRhcHRlci0+cmVjb25PbiA9IHBkZXYtPnJlY29uT24gPSBwZGV2LT5yZWNvbklzU3RhcnRpbmcgPSBUUlVFOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE1ZX1NDU0lfQUxBUk1NVVRFOgorCQkJCQkJTXV0ZUFsYXJtIChwYWRhcHRlcik7CisJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfT0sgPDwgMTYpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTVlfU0NTSV9ERU1PRkFJTDoKKwkJCQkJCXBhZGFwdGVyLT5kZW1vRmFpbCA9IFRSVUU7CQkJCQorCQkJCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJeiA9IGNkYls1XTsJCQkJLy8gZ2V0IGluZGV4CisJCQkJCQlwZHIgPSAoUERFVklDRV9SQUlEMSlTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCQkJCQlpZiAoIHBhZGFwdGVyLT5yYWlkRGF0YVt6XSApCisJCQkJCQkJeworCQkJCQkJCW1lbWNweSAoJnBkci0+RGlza1JhaWQxLCBwYWRhcHRlci0+cmFpZERhdGFbel0sIHNpemVvZiAoRElTS19NSVJST1IpKTsKKwkJCQkJCQlpZiAoIHBhZGFwdGVyLT5yYWlkRGF0YVt6XS0+cmVjb25zdHJ1Y3RQb2ludCA+IHBhZGFwdGVyLT5yYWlkRGF0YVt6IF4gMl0tPnJlY29uc3RydWN0UG9pbnQgKQorCQkJCQkJCQlwZHItPlRvdGFsU2VjdG9ycyA9IHBhZGFwdGVyLT5yYWlkRGF0YVt6XS0+cmVjb25zdHJ1Y3RQb2ludDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBkci0+VG90YWxTZWN0b3JzID0gcGFkYXB0ZXItPnJhaWREYXRhW3ogXiAyXS0+cmVjb25zdHJ1Y3RQb2ludDsKKwkJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJbWVtc2V0IChwZHIsIDAsIHNpemVvZiAoREVWSUNFX1JBSUQxKSk7CisJCQkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfT0sgPDwgMTYpOworCQkJCQkJYnJlYWs7CisJCQkJCX0JCisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJcGFkYXB0ZXItPmNtZCA9IElERV9DT01NQU5EX0lERU5USUZZOworCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZOgkJCS8vIHRlc3QgdW5pdCByZWFkeSBDREIKKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9PSyA8PCAxNik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWToJCQkgIAkvLyByZWFkIGNhcGN0aXkgQ0RCCisJCQl7CisJCQlQUkVBRF9DQVBBQ0lUWV9EQVRBCXBkYXRhID0gKFBSRUFEX0NBUEFDSVRZX0RBVEEpU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCisJCQlwZGF0YS0+Ymxrc2l6ID0gMHgyMDAwMDsKKwkJCVhBTlkyU0NTSSAoKFVDSEFSICopJnBkYXRhLT5ibGtzLCBwZGV2LT5ibG9ja3MpOworCQkJT3BEb25lIChwYWRhcHRlciwgRElEX09LIDw8IDE2KTsKKwkJCXJldHVybiAwOworCQkJfQorCQljYXNlIFNDU0lPUF9WRVJJRlk6CQkJCQkJLy8gdmVyaWZ5IENEQgorCQkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yID0gWFNDU0kyTE9ORyAoJmNkYlsyXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSAoVUNIQVIpKChVU0hPUlQpY2RiWzhdIHwgKChVU0hPUlQpY2RiWzddIDw8IDgpKTsKKwkJCXBhZGFwdGVyLT5jbWQgPSBJREVfQ09NTUFORF9WRVJJRlk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfUkVBRDoJCQkJCQkvLyByZWFkMTAgQ0RCCisJCQlwYWRhcHRlci0+c3RhcnRTZWN0b3IgPSBYU0NTSTJMT05HICgmY2RiWzJdKTsKKwkJCXBhZGFwdGVyLT5zZWN0b3JDb3VudCA9IChVU0hPUlQpY2RiWzhdIHwgKChVU0hPUlQpY2RiWzddIDw8IDgpOworCQkJcGFkYXB0ZXItPmNtZCA9IFJFQURfQ01EOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1JFQUQ2OgkJCQkJCS8vIHJlYWQ2ICBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFNDU0kyTE9ORyAoJmNkYlsxXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSBjZGJbNF07CisJCQlwYWRhcHRlci0+Y21kID0gUkVBRF9DTUQ7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfV1JJVEU6CQkJCQkJLy8gd3JpdGUxMCBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFhTQ1NJMkxPTkcgKCZjZGJbMl0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gKFVTSE9SVCljZGJbOF0gfCAoKFVTSE9SVCljZGJbN10gPDwgOCk7CisJCQlwYWRhcHRlci0+Y21kID0gV1JJVEVfQ01EOworCQkJYnJlYWs7CisJCWNhc2UgU0NTSU9QX1dSSVRFNjoJCQkJCQkvLyB3cml0ZTYgIENEQgorCQkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yID0gU0NTSTJMT05HICgmY2RiWzFdKTsKKwkJCXBhZGFwdGVyLT5zZWN0b3JDb3VudCA9IGNkYls0XTsKKwkJCXBhZGFwdGVyLT5jbWQgPSBXUklURV9DTUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQiAocHJpbnRrICgicGNpMjIyMGlfcXVldWVjb21tYW5kOiBVbnN1cHBvcnRlZCBjb21tYW5kICUwMlhcbiIsICpjZGIpKTsKKwkJCU9wRG9uZSAocGFkYXB0ZXIsIERJRF9FUlJPUiA8PCAxNik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKCBwYWRhcHRlci0+cmVjb25QaGFzZSApCisJCXJldHVybiAwOworCQorCXBhZGFwdGVyLT5wZGV2ID0gcGRldjsKKworCXdoaWxlICggcGFkYXB0ZXItPmRlbW9GYWlsICkKKwkJeworCQlwZGV2ID0gcGFkYXB0ZXItPnBkZXYgPSAmcGFkYXB0ZXItPmRldmljZVswXTsKKwkJcGFkYXB0ZXItPmRlbW9GYWlsID0gRkFMU0U7CisJCWlmICggIXBkZXYtPnJhaWQgfHwgCisJCQkgKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgfHwgCisJCQkgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgKQorCQkJeworCQkJYnJlYWs7CisJCQl9CisJCWlmICggcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gMTsKKwkJZWxzZQorCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gMDsKKwkJCQlERUIgKHByaW50ayAoIlxucGNpMjIyMGk6IEZBSUxVUkUgMTkiKSk7CisJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCQl9CisKKwlTdGFydFRpbWVyIChwYWRhcHRlcik7CisJaWYgKCBwZGV2LT5yYWlkICYmIChwYWRhcHRlci0+Y21kID09IFdSSVRFX0NNRCkgKQorCQl7CisJCXJjID0gSWRlQ21kQm90aCAocGFkYXB0ZXIsIHBkZXYpOworCQlpZiAoICFyYyApCisJCQlyYyA9IFdyaXRlRGF0YUJvdGggKHBhZGFwdGVyLCBwZGV2KTsKKwkJaWYgKCByYyApCisJCQl7CisJCQlkZWxfdGltZXIgKCZwYWRhcHRlci0+dGltZXIpOworCQkJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IDA7CisJCQlwYWRhcHRlci0+c3Vydml2b3IgPSByYyA+PiAxOworCQkJCURFQiAocHJpbnRrICgiXG5wY2kyMjIwaTogRkFJTFVSRSAyMCIpKTsKKwkJCWlmICggSW5pdEZhaWxvdmVyIChwYWRhcHRlciwgcGRldikgKQorCQkJCXsKKwkJCQlPcERvbmUgKHBhZGFwdGVyLCBESURfRVJST1IgPDwgMTYpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlyYyA9IElkZUNtZCAocGFkYXB0ZXIsIHBkZXYpOworCQlpZiAoIChwYWRhcHRlci0+Y21kID09IFdSSVRFX0NNRCkgJiYgIXJjICkKKwkJCXJjID0gV3JpdGVEYXRhIChwYWRhcHRlcik7CisJCWlmICggcmMgKQorCQkJeworCQkJZGVsX3RpbWVyICgmcGFkYXB0ZXItPnRpbWVyKTsKKwkJCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSAwOworCQkJaWYgKCBwZGV2LT5yYWlkICkKKwkJCQl7CisJCQkJcGFkYXB0ZXItPnN1cnZpdm9yID0gKHBkZXYtPnNwaWdvdCBeIDMpID4+IDE7CisJCQkJREVCIChwcmludGsgKCJcbnBjaTIyMjBpOiBGQUlMVVJFIDIxIikpOworCQkJCWlmICggIUluaXRGYWlsb3ZlciAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJT3BEb25lIChwYWRhcHRlciwgRElEX0VSUk9SIDw8IDE2KTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJcmV0dXJuIDA7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJUmVhZEZsYXNoCisgKgorICoJRGVzY3JpcHRpb246CVJlYWQgaW5mb3JtYXRpb24gZnJvbSBjb250cm9sbGVyIEZsYXNoIG1lbW9yeS4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIHRvIGhvc3QgaW50ZXJmYWNlIGRhdGEgc3RydWN0dXJlLgorICoJCQkJCXBkYXRhCSAtIFBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmVzLgorICoJCQkJCWJhc2UJIC0gYmFzZSBhZGRyZXNzIGluIEZsYXNoLgorICoJCQkJCWxlbmd0aAkgLSBsZW5naHQgb2YgZGF0YSBzcGFjZSBpbiBieXRlcy4KKyAqCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBWT0lEIFJlYWRGbGFzaCAoUEFEQVBURVIyMjIwSSBwYWRhcHRlciwgVk9JRCAqcGRhdGEsIFVMT05HIGJhc2UsIFVMT05HIGxlbmd0aCkKKwl7CisJVUxPTkcJIG9sZHJlbWFwOworCVVDSEFSCSBvbGRkZXNjOworCVVMT05HCSB6OworCVVDSEFSCSpwZCA9IChVQ0hBUiAqKXBkYXRhOworCisJb2xkcmVtYXAgPSBpbmwgKHBhZGFwdGVyLT5yZWdSZW1hcCk7CQkJCQkJCS8vIHNhdmUgdmFsdWVzIHRvIHJlc3RvcmUgbGF0ZXIKKwlvbGRkZXNjICA9IGluYl9wIChwYWRhcHRlci0+cmVnRGVzYyk7CisKKwlvdXRsIChiYXNlIHwgMSwgcGFkYXB0ZXItPnJlZ1JlbWFwKTsJCQkJCQkJLy8gcmVtYXAgdG8gRmxhc2ggc3BhY2UgYXMgc3BlY2lmaWVkCisJb3V0Yl9wICgweDQwLCBwYWRhcHRlci0+cmVnRGVzYyk7CQkJCQkJCQkvLyBkZXNjcmliZSByZW1hcCByZWdpb24gYXMgOCBiaXQKKwlmb3IgKCB6ID0gMDsgIHogPCBsZW5ndGg7ICB6KyspCQkJCQkJCQkJLy8gZ2V0ICJsZW5ndGgiIGRhdGEgY291bnQKKwkJKnBkKysgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ0Jhc2UgKyB6KTsJCQkJCQkvLyByZWFkIGluIHRoZSBkYXRhCisKKwlvdXRsIChvbGRyZW1hcCwgcGFkYXB0ZXItPnJlZ1JlbWFwKTsJCQkJCQkJLy8gcmVzdG9yZSByZW1hcCByZWdpc3RlciB2YWx1ZXMKKwlvdXRiX3AgKG9sZGRlc2MsIHBhZGFwdGVyLT5yZWdEZXNjKTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJCQlHZXRSZWdzCisgKgorICoJRGVzY3JpcHRpb246CUluaXRpYWxpemUgdGhlIHJlZ2VzdGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwc2hvc3QJCSAgLSBQb2ludGVyIHRvIFNDU0kgaG9zdCBkYXRhIHN0cnVjdHVyZS4KKyAqCQkJCQliaWdkCQkgIC0gUENJLTIyNDBJIGlkZW50aWZpZXIKKyAqCQkJCQlwY2lkZXYJCSAgLSBQb2ludGVyIHRvIGRldmljZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBmYWlsdXJlIHRvIGluc3RhbGwuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVVNIT1JUIEdldFJlZ3MgKHN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCwgQk9PTCBiaWdkLCBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQorCXsKKwlQQURBUFRFUjIyMjBJCXBhZGFwdGVyOworCWludAkJCQlzZXRpcnE7CisJaW50CQkJCXo7CisJVVNIT1JUCQkJenIsIHpsOworCVVDSEFSCQkgICAqY29uc2lzdGVudDsKKwlkbWFfYWRkcl90CQljb25zaXN0ZW50RG1hOworCisJcGFkYXB0ZXIgPSBIT1NUREFUQShwc2hvc3QpOworCW1lbXNldCAocGFkYXB0ZXIsIDAsIHNpemVvZiAoQURBUFRFUjIyMjBJKSk7CisJbWVtc2V0ICgmRGFsZVNldHVwLCAwLCBzaXplb2YgKERhbGVTZXR1cCkpOworCW1lbXNldCAoRGlza01pcnJvciwgMCwgc2l6ZW9mIChEaXNrTWlycm9yKSk7CisKKwl6ciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpZGV2LCAxKTsKKwl6bCA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpZGV2LCAyKTsKKworCXBhZGFwdGVyLT5iYXNlUG9ydCA9IHpyOworCXBhZGFwdGVyLT5yZWdSZW1hcAkJPSB6ciArIFJUUl9MT0NBTF9SRU1BUDsJCQkJCS8vIDMyIGJpdCBsb2NhbCBzcGFjZSByZW1hcAorCXBhZGFwdGVyLT5yZWdEZXNjCQk9IHpyICsgUlRSX1JFR0lPTlM7CSAgCQkJCQkvLyAzMiBiaXQgbG9jYWwgcmVnaW9uIGRlc2NyaXB0b3IKKwlwYWRhcHRlci0+cmVnUmFuZ2UJCT0genIgKyBSVFJfTE9DQUxfUkFOR0U7CQkJCQkvLyAzMiBiaXQgbG9jYWwgcmFuZ2UKKwlwYWRhcHRlci0+cmVnSXJxQ29udHJvbAk9IHpyICsgUlRSX0lOVF9DT05UUk9MX1NUQVRVUzsJCQkvLyAxNiBiaXQgaW50ZXJydXB0IGNvbnRyb2wgYW5kIHN0YXR1cworCXBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkCT0genIgKyBSVFJfTUFJTEJPWDsJICAJCQkJCS8vIDE2IGJ5dGUgc2NyYXRjaHBhZCBJL08gYmFzZSBhZGRyZXNzCisKKwlwYWRhcHRlci0+cmVnQmFzZQkJPSB6bDsKKwlwYWRhcHRlci0+cmVnRGF0YQkJPSB6bCArIFJFR19EQVRBOwkJCQkJCS8vIGRhdGEgcmVnaXN0ZXIgSS9PIGFkZHJlc3MKKwlwYWRhcHRlci0+cmVnRXJyb3IJCT0gemwgKyBSRUdfRVJST1I7CQkJCQkJLy8gZXJyb3IgcmVnaXN0ZXIgSS9PIGFkZHJlc3MKKwlwYWRhcHRlci0+cmVnU2VjdENvdW50CT0gemwgKyBSRUdfU0VDVE9SX0NPVU5UOwkJCQkvLyBzZWN0b3IgY291bnQgcmVnaXN0ZXIgSS9PIGFkZHJlc3MKKwlwYWRhcHRlci0+cmVnTGJhMAkJPSB6bCArIFJFR19MQkFfMDsJCQkJCQkvLyBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIExCQQorCXBhZGFwdGVyLT5yZWdMYmE4CQk9IHpsICsgUkVHX0xCQV84OwkJCQkJCS8vIG5leHQgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBMQkEKKwlwYWRhcHRlci0+cmVnTGJhMTYJCT0gemwgKyBSRUdfTEJBXzE2OwkJCQkJCS8vIG5leHQgbW9zdCBzaWduaWZpY2FuIGJ5dGUgb2YgTEJBCisJcGFkYXB0ZXItPnJlZ0xiYTI0CQk9IHpsICsgUkVHX0xCQV8yNDsJCQkJCQkvLyBoZWFkIGFuZCBtb3N0IDQgc2lnbmlmaWNhbnQgYml0cyBvZiBMQkEKKwlwYWRhcHRlci0+cmVnU3RhdENtZAk9IHpsICsgUkVHX1NUQVRfQ01EOwkJCQkJLy8gc3RhdHVzIG9uIHJlYWQgYW5kIGNvbW1hbmQgb24gd3JpdGUgcmVnaXN0ZXIKKwlwYWRhcHRlci0+cmVnU3RhdFNlbAk9IHpsICsgUkVHX1NUQVRfU0VMOwkJCQkJLy8gYm9hcmQgc3RhdHVzIG9uIHJlYWQgYW5kIHNwaWdvdCBzZWxlY3Qgb24gd3JpdGUgcmVnaXN0ZXIKKwlwYWRhcHRlci0+cmVnRmFpbAkJPSB6bCArIFJFR19GQUlMOworCXBhZGFwdGVyLT5yZWdBbHRTdGF0CT0gemwgKyBSRUdfQUxUX1NUQVQ7CisJcGFkYXB0ZXItPnBjaWRldgkJPSBwY2lkZXY7CisKKwlpZiAoIGJpZ2QgKQorCQl7CisJCXBhZGFwdGVyLT5yZWdEbWFEZXNjCT0genIgKyBSVFJfRE1BMF9ERVNDX1BUUjsJCQkvLyBhZGRyZXNzIG9mIHRoZSBETUEgZGlzY3JpcHRvciByZWdpc3RlciBmb3IgZGlyZWN0aW9uIG9mIHRyYW5zZmVyCisJCXBhZGFwdGVyLT5yZWdEbWFDbWRTdGF0CT0genIgKyBSVFJfRE1BX0NPTU1BTkRfU1RBVFVTOwkJLy8gQnl0ZSAjMCBvZiBETUEgY29tbWFuZCBzdGF0dXMgcmVnaXN0ZXIKKwkJcGFkYXB0ZXItPnJlZ0RtYUFkZHJQY2kJPSB6ciArIFJUUl9ETUEwX1BDSV9BRERSOwkJCS8vIDMyIGJpdCByZWdpc3RlciBmb3IgUENJIGFkZHJlc3Mgb2YgRE1BCisJCXBhZGFwdGVyLT5yZWdEbWFBZGRyTG9jCT0genIgKyBSVFJfRE1BMF9MT0NBTF9BRERSOwkJCS8vIDMyIGJpdCByZWdpc3RlciBmb3IgbG9jYWwgYnVzIGFkZHJlc3Mgb2YgRE1BCisJCXBhZGFwdGVyLT5yZWdEbWFDb3VudAk9IHpyICsgUlRSX0RNQTBfQ09VTlQ7CQkJCS8vIDMyIGJpdCByZWdpc3RlciBmb3IgRE1BIHRyYW5zZmVyIGNvdW50CisJCXBhZGFwdGVyLT5yZWdEbWFNb2RlCT0genIgKyBSVFJfRE1BMF9NT0RFICsgMTsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIERNQSBtb2RlIGNvbnRyb2wKKwkJcGFkYXB0ZXItPmJpZ0QJCQk9IFNFTF9ORVdfU1BFRURfMTsJCQkJCS8vIHNldCBzcGlnb3Qgc3BlZWQgY29udHJvbCBiaXQKKwkJfQorCWVsc2UKKwkJeworCQlwYWRhcHRlci0+cmVnRG1hRGVzYwk9IHpsICsgUlRMX0RNQTFfREVTQ19QVFI7CQkJLy8gYWRkcmVzcyBvZiB0aGUgRE1BIGRpc2NyaXB0b3IgcmVnaXN0ZXIgZm9yIGRpcmVjdGlvbiBvZiB0cmFuc2ZlcgorCQlwYWRhcHRlci0+cmVnRG1hQ21kU3RhdAk9IHpsICsgUlRMX0RNQV9DT01NQU5EX1NUQVRVUyArIDE7CS8vIEJ5dGUgIzEgb2YgRE1BIGNvbW1hbmQgc3RhdHVzIHJlZ2lzdGVyCisJCXBhZGFwdGVyLT5yZWdEbWFBZGRyUGNpCT0gemwgKyBSVExfRE1BMV9QQ0lfQUREUjsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIFBDSSBhZGRyZXNzIG9mIERNQQorCQlwYWRhcHRlci0+cmVnRG1hQWRkckxvYwk9IHpsICsgUlRMX0RNQTFfTE9DQUxfQUREUjsJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIGxvY2FsIGJ1cyBhZGRyZXNzIG9mIERNQQorCQlwYWRhcHRlci0+cmVnRG1hQ291bnQJPSB6bCArIFJUTF9ETUExX0NPVU5UOwkJCQkvLyAzMiBiaXQgcmVnaXN0ZXIgZm9yIERNQSB0cmFuc2ZlciBjb3VudAorCQlwYWRhcHRlci0+cmVnRG1hTW9kZQk9IHpsICsgUlRMX0RNQTFfTU9ERSArIDE7CQkJLy8gMzIgYml0IHJlZ2lzdGVyIGZvciBETUEgbW9kZSBjb250cm9sCisJCX0KKworCXBhZGFwdGVyLT5udW1iZXJPZkRyaXZlcyA9IGluYl9wIChwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIEJJR0RfTlVNX0RSSVZFUyk7CisJaWYgKCAhYmlnZCAmJiAhcGFkYXB0ZXItPm51bWJlck9mRHJpdmVzICkJCQkJCQkvLyBpZiBubyBkZXZpY2VzIG9uIHRoaXMgYm9hcmQKKwkJcmV0dXJuIFRSVUU7CisKKwlwc2hvc3QtPmlycSA9IHBjaWRldi0+aXJxOworCXNldGlycSA9IDE7CisJZm9yICggeiA9IDA7ICB6IDwgSW5zdGFsbGVkOyAgeisrICkJCQkJCQkJCS8vIHNjYW4gZm9yIHNoYXJlZCBpbnRlcnJ1cHRzCisJCXsKKwkJaWYgKCBQc2lIb3N0W3pdLT5pcnEgPT0gcHNob3N0LT5pcnEgKQkJCQkJCS8vIGlmIHNoYXJlZCB0aGVuLCBkb24ndCBwb3NzZXMKKwkJCXNldGlycSA9IDA7CisJCX0KKwlpZiAoIHNldGlycSApCQkJCQkJCQkJCQkJCS8vIGlmIG5vdCBzaGFyZWQsIHBvc3NlcworCQl7CisJCWlmICggcmVxdWVzdF9pcnEgKHBzaG9zdC0+aXJxLCBJcnFfSGFuZGxlciwgU0FfU0hJUlEsICJwY2kyMjIwaSIsIHBhZGFwdGVyKSA8IDAgKQorCQkJeworCQkJaWYgKCByZXF1ZXN0X2lycSAocHNob3N0LT5pcnEsIElycV9IYW5kbGVyLCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwgInBjaTIyMjBpIiwgcGFkYXB0ZXIpIDwgMCApCisJCQkJeworCQkJCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIFBDSS0yMjIwSSBjb250cm9sbGVyLlxuIik7CisJCQkJcmV0dXJuIFRSVUU7CisJCQkJfQorCQkJfQorCQlwYWRhcHRlci0+aXJxT3duZWQgPSBwc2hvc3QtPmlycTsJCQkJCQkJLy8gc2V0IElSUSBhcyBvd25lZAorCQl9CisKKwlpZiAoIHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlcyApCisJCWNvbnNpc3RlbnQgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAocGNpZGV2LCBTRUNUT1JTWEZFUiAqIEJZVEVTX1BFUl9TRUNUT1IsICZjb25zaXN0ZW50RG1hKTsKKwllbHNlCisJCWNvbnNpc3RlbnQgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAocGNpZGV2LCBBVEFQSV9UUkFOU0ZFUiwgJmNvbnNpc3RlbnREbWEpOworCWlmICggIWNvbnNpc3RlbnQgKQorCQl7CisJCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyIGZvciBQQ0ktMjIyMEkgY29udHJvbGxlci5cbiIpOworCQlmcmVlX2lycSAocHNob3N0LT5pcnEsIHBhZGFwdGVyKTsKKwkJcmV0dXJuIFRSVUU7CisJCX0KKwlwYWRhcHRlci0+a0J1ZmZlciA9IGNvbnNpc3RlbnQ7CisJcGFkYXB0ZXItPmtCdWZmZXJEbWEgPSBjb25zaXN0ZW50RG1hOworCisJUHNpSG9zdFtJbnN0YWxsZWRdCT0gcHNob3N0OwkJCQkJCQkJCS8vIHNhdmUgU0NTSV9IT1NUIHBvaW50ZXIKKwlwc2hvc3QtPmlvX3BvcnQJCT0gcGFkYXB0ZXItPmJhc2VQb3J0OworCXBzaG9zdC0+bl9pb19wb3J0CT0gMHhGRjsKKwlwc2hvc3QtPnVuaXF1ZV9pZAk9IHBhZGFwdGVyLT5yZWdCYXNlOworCisJb3V0Yl9wICgweDAxLCBwYWRhcHRlci0+cmVnUmFuZ2UpOwkJCQkJCQkJLy8gZml4IG91ciByYW5nZSByZWdpc3RlciBiZWNhdXNlIG90aGVyIGRyaXZlcnMgd2FudCB0byB0cm9tcCBvbiBpdAorCisJcGFkYXB0ZXItPnRpbWluZ01vZGUgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBEQUxFX1RJTUlOR19NT0RFKTsKKwlpZiAoIHBhZGFwdGVyLT50aW1pbmdNb2RlID49IDIgKQorCQl7CisJCWlmICggYmlnZCApCisJCQlwYWRhcHRlci0+dGltaW5nQWRkcmVzcwk9IE1vZGVBcnJheTJbcGFkYXB0ZXItPnRpbWluZ01vZGUgLSAyXTsKKwkJZWxzZQorCQkJcGFkYXB0ZXItPnRpbWluZ0FkZHJlc3MJPSBNb2RlQXJyYXlbcGFkYXB0ZXItPnRpbWluZ01vZGUgLSAyXTsKKwkJfQorCWVsc2UKKwkJcGFkYXB0ZXItPnRpbWluZ1BJTyA9IFRSVUU7CisKKwlSZWFkRmxhc2ggKHBhZGFwdGVyLCAmRGFsZVNldHVwLCBEQUxFX0ZMQVNIX1NFVFVQLCBzaXplb2YgKFNFVFVQKSk7CisJUmVhZEZsYXNoIChwYWRhcHRlciwgJkRpc2tNaXJyb3IsIERBTEVfRkxBU0hfUkFJRCwgc2l6ZW9mIChEaXNrTWlycm9yKSk7CisKKwlyZXR1cm4gRkFMU0U7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CQkJU2V0dXBGaW5pc2gKKyAqCisgKglEZXNjcmlwdGlvbjoJQ29tcGxldGUgdGhlIGRyaXZlciBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGZvciBhIGNhcmQKKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgIC0gUG9pbnRlciB0byBTQ1NJIGhvc3QgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJc3RyCQkgIC0gUG9pbnRlciB0byBib2FyZCB0eXBlIHN0cmluZy4KKyAqCisgKglSZXR1cm5zOgkJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1ZPSUQgU2V0dXBGaW5pc2ggKFBBREFQVEVSMjIyMEkgcGFkYXB0ZXIsIGNoYXIgKnN0ciwgaW50IGlycSkKKwl7CisJaW5pdF90aW1lciAoJnBhZGFwdGVyLT50aW1lcik7CisJcGFkYXB0ZXItPnRpbWVyLmZ1bmN0aW9uID0gVGltZXJFeHBpcnk7CisJcGFkYXB0ZXItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwYWRhcHRlcjsKKwlpbml0X3RpbWVyICgmcGFkYXB0ZXItPnJlY29uVGltZXIpOworCXBhZGFwdGVyLT5yZWNvblRpbWVyLmZ1bmN0aW9uID0gUmVjb25UaW1lckV4cGlyeTsKKwlwYWRhcHRlci0+cmVjb25UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXI7CisJcHJpbnRrKCJcblBDSS0lc0kgRUlERSBDT05UUk9MTEVSOiBhdCBJL08gPSAlbFgvJWxYICBJUlEgPSAlZFxuIiwgc3RyLCBwYWRhcHRlci0+YmFzZVBvcnQsIHBhZGFwdGVyLT5yZWdCYXNlLCBpcnEpOworCXByaW50aygiVmVyc2lvbiAlcywgQ29tcGlsZWQgJXMgJXNcblxuIiwgUENJMjIyMElfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fKTsKKwl9CQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIyMjBpX0RldGVjdAorICoKKyAqCURlc2NyaXB0aW9uOglEZXRlY3QgYW5kIGluaXRpYWxpemUgb3VyIGJvYXJkcy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJdHBudCAtIFBvaW50ZXIgdG8gU0NTSSBob3N0IHRlbXBsYXRlIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJTnVtYmVyIG9mIGFkYXB0ZXJzIGluc3RhbGxlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBQY2kyMjIwaV9EZXRlY3QgKFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKKwl7CisJc3RydWN0IFNjc2lfSG9zdCAgICpwc2hvc3Q7CisJUEFEQVBURVIyMjIwSQkgICAgcGFkYXB0ZXI7CisJUE9VUl9ERVZJQ0UJCQlwZGV2OworCWludAkJCQkJdW5pdDsKKwlpbnQJCQkJCXo7CisJVVNIT1JUCQkJCXJhaWRvbjsKKwlVQ0hBUgkJCQlzcGlnb3QxLCBzcGlnb3QyOworCVVDSEFSCQkJCWRldmljZTsKKwlzdHJ1Y3QgcGNpX2RldgkgICAqcGNpZGV2ID0gTlVMTDsKKworCXdoaWxlICggKHBjaWRldiA9IHBjaV9maW5kX2RldmljZSAoVkVORE9SX1BTSSwgREVWSUNFX0RBTEVfMSwgcGNpZGV2KSkgIT0gTlVMTCApCisJCXsKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJCQljb250aW51ZTsKKwkJcHNob3N0ID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKEFEQVBURVIyMjIwSSkpOworCQlpZihwc2hvc3Q9PU5VTEwpCisJCQljb250aW51ZTsKKwkJCQorCQlwYWRhcHRlciA9IEhPU1REQVRBKHBzaG9zdCk7CisKKwkJaWYgKCBHZXRSZWdzIChwc2hvc3QsIEZBTFNFLCBwY2lkZXYpICkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKworCQlzY3NpX3NldF9kZXZpY2UocHNob3N0LCAmcGNpZGV2LT5kZXYpOworCQlwc2hvc3QtPm1heF9pZCA9IHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlczsKKwkJZm9yICggeiA9IDA7ICB6IDwgcGFkYXB0ZXItPm51bWJlck9mRHJpdmVzOyAgeisrICkKKwkJCXsKKwkJCXVuaXQgPSBpbmJfcCAocGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBEQUxFX0NIQU5ORUxfREVWSUNFXzAgKyB6KSAmIDB4MEY7CisJCQlwZGV2ID0gJnBhZGFwdGVyLT5kZXZpY2Vbel07CisJCQlwZGV2LT5ieXRlNgkJPSAoVUNIQVIpKCgodW5pdCAmIDEpIDw8IDQpIHwgMHhFMCk7CisJCQlwZGV2LT5zcGlnb3QJPSAoVUNIQVIpKDEgPDwgKHVuaXQgPj4gMSkpOworCQkJcGRldi0+c2VjdG9ycwk9IERhbGVTZXR1cC5zZXR1cERldmljZVt1bml0XS5zZWN0b3JzOworCQkJcGRldi0+aGVhZHMJCT0gRGFsZVNldHVwLnNldHVwRGV2aWNlW3VuaXRdLmhlYWRzOworCQkJcGRldi0+Y3lsaW5kZXJzID0gRGFsZVNldHVwLnNldHVwRGV2aWNlW3VuaXRdLmN5bGluZGVyczsKKwkJCXBkZXYtPmJsb2Nrcwk9IERhbGVTZXR1cC5zZXR1cERldmljZVt1bml0XS5ibG9ja3M7CisKKwkJCWlmICggIXogKQorCQkJCXsKKwkJCQlEaXNrTWlycm9yWzBdLnN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIERBTEVfUkFJRF8wX1NUQVRVUyk7CQkKKwkJCQlEaXNrTWlycm9yWzFdLnN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIERBTEVfUkFJRF8xX1NUQVRVUyk7CQkKKwkJCQlpZiAoIChEaXNrTWlycm9yWzBdLnNpZ25hdHVyZSA9PSBTSUdOQVRVUkUpICYmIChEaXNrTWlycm9yWzFdLnNpZ25hdHVyZSA9PSBTSUdOQVRVUkUpICYmCisJCQkJICAgICAoRGlza01pcnJvclswXS5wYWlySWRlbnRpZmllciA9PSAoRGlza01pcnJvclsxXS5wYWlySWRlbnRpZmllciBeIDEpKSApCisJCQkJCXsJCQkgCisJCQkJCXJhaWRvbiA9IFRSVUU7CisJCQkJCWlmICggdW5pdCA+ICh1bml0IF4gMikgKQorCQkJCQkJdW5pdCA9IHVuaXQgXiAyOworCQkJCQl9CQorCQkJCWVsc2UKKwkJCQkJcmFpZG9uID0gRkFMU0U7CisKKwkJCQltZW1jcHkgKHBkZXYtPkRpc2tNaXJyb3IsIERpc2tNaXJyb3IsIHNpemVvZiAoRGlza01pcnJvcikpOworCQkJCXBhZGFwdGVyLT5yYWlkRGF0YVswXSA9ICZwZGV2LT5EaXNrTWlycm9yWzBdOworCQkJCXBhZGFwdGVyLT5yYWlkRGF0YVsyXSA9ICZwZGV2LT5EaXNrTWlycm9yWzFdOworCQkJCQorCQkJCXNwaWdvdDEgPSBzcGlnb3QyID0gRkFMU0U7CisJCQkJcGRldi0+c3BpZ290c1swXSA9IDE7CisJCQkJcGRldi0+c3BpZ290c1sxXSA9IDI7CisJCQkJcGRldi0+bGFzdHNlY3RvcmxiYVswXSA9IElubGluZUlkZW50aWZ5IChwYWRhcHRlciwgMSwgMCk7CisJCQkJcGRldi0+bGFzdHNlY3RvcmxiYVsxXSA9IElubGluZUlkZW50aWZ5IChwYWRhcHRlciwgMiwgMCk7CisJCQkJCQkKKwkJCQlpZiAoICEocGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SKSAmJiBwZGV2LT5sYXN0c2VjdG9ybGJhWzBdICkKKwkJCQkJc3BpZ290MSA9IFRSVUU7CisJCQkJaWYgKCAhKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgJiYgcGRldi0+bGFzdHNlY3RvcmxiYVsxXSApCisJCQkJCXNwaWdvdDIgPSBUUlVFOworCQkJCWlmICggcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBEaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IgKQorCQkJCQlzcGlnb3QxID0gVFJVRTsKKworCQkJCWlmICggc3BpZ290MSAmJiAocGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpICkKKwkJCQkJSW5saW5lUmVhZFNpZ25hdHVyZSAocGFkYXB0ZXIsIHBkZXYsIDApOworCQkJCWlmICggc3BpZ290MiAmJiAocGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpICkKKwkJCQkJSW5saW5lUmVhZFNpZ25hdHVyZSAocGFkYXB0ZXIsIHBkZXYsIDEpOworCisJCQkJaWYgKCBzcGlnb3QxICYmIHNwaWdvdDIgJiYgcmFpZG9uICkKKwkJCQkJeworCQkJCQlwZGV2LT5yYWlkID0gMTsKKwkJCQkJaWYgKCBwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCApCisJCQkJCQlwZGV2LT5zcGlnb3QgPSAyOworCQkJCQllbHNlCisJCQkJCQlwZGV2LT5zcGlnb3QgPSAxOworCQkJCQlpZiAoIChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgfHwgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9SRUJVSUxEKSApCisJCQkJCQlwYWRhcHRlci0+cmVjb25PbiA9IHBkZXYtPnJlY29uT24gPSBwZGV2LT5yZWNvbklzU3RhcnRpbmcgPSBUUlVFOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggc3BpZ290MSApCisJCQkJCQl7CisJCQkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJCQkJCQlnb3RvIHVucmVnaXN0ZXI7CisJCQkJCQlwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyA9IFVDQkZfTUlSUk9SRUQgfCBVQ0JGX1NVUlZJVk9SOworCQkJCQkJcGRldi0+c3BpZ290ID0gMTsKKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJaWYgKCBwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCApCisJCQkJCQkJZ290byB1bnJlZ2lzdGVyOworCQkJCQkJcGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9TVVJWSVZPUjsKKwkJCQkJCXBkZXYtPnNwaWdvdCA9IDI7CisJCQkJCQl9CisJCQkJCWlmICggRGFsZVNldHVwLnJlYm9vdFJlYnVpbGQgJiYgcmFpZG9uICkKKwkJCQkJCXBhZGFwdGVyLT5yZWNvbk9uID0gcGRldi0+cmVjb25PbiA9IHBkZXYtPnJlY29uSXNTdGFydGluZyA9IFRSVUU7CisJCQkJCX0KKwkJCQorCQkJCWlmICggcmFpZG9uICkKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCVNldHVwRmluaXNoIChwYWRhcHRlciwgIjIyMjAiLCBwc2hvc3QtPmlycSk7CisJCisJCWlmICggKytJbnN0YWxsZWQgPCBNQVhBREFQVEVSICkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKK3VucmVnaXN0ZXI6OworCQlzY3NpX3VucmVnaXN0ZXIgKHBzaG9zdCk7CisJCX0KKworCXdoaWxlICggKHBjaWRldiA9IHBjaV9maW5kX2RldmljZSAoVkVORE9SX1BTSSwgREVWSUNFX0JJR0RfMSwgcGNpZGV2KSkgIT0gTlVMTCApCisJCXsKKwkJcHNob3N0ID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mKEFEQVBURVIyMjIwSSkpOworCQlwYWRhcHRlciA9IEhPU1REQVRBKHBzaG9zdCk7CisKKwkJaWYgKCBHZXRSZWdzIChwc2hvc3QsIFRSVUUsIHBjaWRldikgKQorCQkJZ290byB1bnJlZ2lzdGVyMTsKKworCQlmb3IgKCB6ID0gMDsgIHogPCBCSUdEX01BWERSSVZFUzsgIHorKyApCisJCQlEaXNrTWlycm9yW3pdLnN0YXR1cyA9IGluYl9wIChwYWRhcHRlci0+cmVnU2NyYXRjaFBhZCArIEJJR0RfUkFJRF8wX1NUQVRVUyArIHopOwkJCisKKwkJc2NzaV9zZXRfcGNpX2RldmljZShwc2hvc3QsIHBjaWRldik7CisJCXBzaG9zdC0+bWF4X2lkID0gcGFkYXB0ZXItPm51bWJlck9mRHJpdmVzOworCQlwYWRhcHRlci0+ZmFpbFJlZ2lzdGVyID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgQklHRF9BTEFSTV9JTUFHRSk7CisJCWZvciAoIHogPSAwOyAgeiA8IHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlczsgIHorKyApCisJCQl7CisJCQl1bml0ID0gaW5iX3AgKHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgQklHRF9ERVZJQ0VfMCArIHopOworCQkJcGRldiA9ICZwYWRhcHRlci0+ZGV2aWNlW3pdOworCQkJcGRldi0+Ynl0ZTYJCT0gKFVDSEFSKSgoKHVuaXQgJiAxKSA8PCA0KSB8IDB4RTApOworCQkJcGRldi0+c3BpZ290CT0gKFVDSEFSKSgxIDw8ICh1bml0ID4+IDEpKTsKKwkJCXBkZXYtPnNlY3RvcnMJPSBEYWxlU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uc2VjdG9yczsKKwkJCXBkZXYtPmhlYWRzCQk9IERhbGVTZXR1cC5zZXR1cERldmljZVt1bml0XS5oZWFkczsKKwkJCXBkZXYtPmN5bGluZGVycyA9IERhbGVTZXR1cC5zZXR1cERldmljZVt1bml0XS5jeWxpbmRlcnM7CisJCQlwZGV2LT5ibG9ja3MJPSBEYWxlU2V0dXAuc2V0dXBEZXZpY2VbdW5pdF0uYmxvY2tzOworCQkJCisJCQlpZiAoIChEaXNrTWlycm9yW3VuaXRdLnNpZ25hdHVyZSA9PSBTSUdOQVRVUkUpICYmIChEaXNrTWlycm9yW3VuaXQgXiAyXS5zaWduYXR1cmUgPT0gU0lHTkFUVVJFKSAmJgorCQkJICAgICAoRGlza01pcnJvclt1bml0XS5wYWlySWRlbnRpZmllciA9PSAoRGlza01pcnJvclt1bml0IF4gMl0ucGFpcklkZW50aWZpZXIgXiAxKSkgKQorCQkJCXsJCQkgCisJCQkJcmFpZG9uID0gVFJVRTsKKwkJCQlpZiAoIHVuaXQgPiAodW5pdCBeIDIpICkKKwkJCQkJdW5pdCA9IHVuaXQgXiAyOworCQkJCX0JCisJCQllbHNlCisJCQkJcmFpZG9uID0gRkFMU0U7CisJCQkJCisJCQlzcGlnb3QxID0gc3BpZ290MiA9IEZBTFNFOworCQkJbWVtY3B5ICgmcGRldi0+RGlza01pcnJvclswXSwgJkRpc2tNaXJyb3JbdW5pdF0sIHNpemVvZiAoRElTS19NSVJST1IpKTsKKwkJCW1lbWNweSAoJnBkZXYtPkRpc2tNaXJyb3JbMV0sICZEaXNrTWlycm9yW3VuaXQgXiAyXSwgc2l6ZW9mIChESVNLX01JUlJPUikpOworCQkJcGFkYXB0ZXItPnJhaWREYXRhW3VuaXRdCSA9ICZwZGV2LT5EaXNrTWlycm9yWzBdOworCQkJcGFkYXB0ZXItPnJhaWREYXRhW3VuaXQgXiAyXSA9ICZwZGV2LT5EaXNrTWlycm9yWzFdOworCQkJcGRldi0+c3BpZ290c1swXSA9IDEgPDwgKHVuaXQgPj4gMSk7CisJCQlwZGV2LT5zcGlnb3RzWzFdID0gMSA8PCAoKHVuaXQgXiAyKSA+PiAxKTsKKwkJCXBkZXYtPmRldmljZUlEWzBdID0gdW5pdDsKKwkJCXBkZXYtPmRldmljZUlEWzFdID0gdW5pdCBeIDI7CisJCQlwZGV2LT5sYXN0c2VjdG9ybGJhWzBdID0gSW5saW5lSWRlbnRpZnkgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzBdLCB1bml0ICYgMSk7CisJCQlwZGV2LT5sYXN0c2VjdG9ybGJhWzFdID0gSW5saW5lSWRlbnRpZnkgKHBhZGFwdGVyLCBwZGV2LT5zcGlnb3RzWzFdLCB1bml0ICYgMSk7CisKKwkJCWlmICggIShwZGV2LT5EaXNrTWlycm9yWzFdLnN0YXR1cyAmIFVDQkZfU1VSVklWT1IpICYmIHBkZXYtPmxhc3RzZWN0b3JsYmFbMF0gKQorCQkJCXNwaWdvdDEgPSBUUlVFOworCQkJaWYgKCAhKHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgVUNCRl9TVVJWSVZPUikgJiYgcGRldi0+bGFzdHNlY3RvcmxiYVsxXSApCisJCQkJc3BpZ290MiA9IFRSVUU7CisJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMF0uc3RhdHVzICYgcGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1NVUlZJVk9SICkKKwkJCQlzcGlnb3QxID0gVFJVRTsKKworCQkJaWYgKCBzcGlnb3QxICYmIChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgKQorCQkJCUlubGluZVJlYWRTaWduYXR1cmUgKHBhZGFwdGVyLCBwZGV2LCAwKTsKKwkJCWlmICggc3BpZ290MiAmJiAocGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQpICkKKwkJCQlJbmxpbmVSZWFkU2lnbmF0dXJlIChwYWRhcHRlciwgcGRldiwgMSk7CisKKwkJCWlmICggc3BpZ290MSAmJiBzcGlnb3QyICYmIHJhaWRvbiApCisJCQkJeworCQkJCXBkZXYtPnJhaWQgPSAxOworCQkJCWlmICggcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQkJCQlwZGV2LT5zcGlnb3QgPSBwZGV2LT5zcGlnb3RzWzFdOworCQkJCWVsc2UKKwkJCQkJcGRldi0+c3BpZ290ID0gcGRldi0+c3BpZ290c1swXTsKKwkJCQlpZiAoIChwZGV2LT5EaXNrTWlycm9yWzBdLnN0YXR1cyAmIFVDQkZfUkVCVUlMRCkgfHwgKHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9SRUJVSUxEKSApCisJCQkJCXBhZGFwdGVyLT5yZWNvbk9uID0gcGRldi0+cmVjb25PbiA9IHBkZXYtPnJlY29uSXNTdGFydGluZyA9IFRSVUU7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoIHNwaWdvdDEgKQorCQkJCQl7CisJCQkJCWlmICggcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgJiBVQ0JGX1JFQlVJTEQgKQorCQkJCQkJZ290byB1bnJlZ2lzdGVyMTsKKwkJCQkJcGRldi0+RGlza01pcnJvclswXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9TVVJWSVZPUjsKKwkJCQkJcGRldi0+c3BpZ290ID0gcGRldi0+c3BpZ290c1swXTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoIHBkZXYtPkRpc2tNaXJyb3JbMV0uc3RhdHVzICYgVUNCRl9SRUJVSUxEICkKKwkJCQkJCWdvdG8gdW5yZWdpc3RlcjsKKwkJCQkJcGRldi0+RGlza01pcnJvclsxXS5zdGF0dXMgPSBVQ0JGX01JUlJPUkVEIHwgVUNCRl9TVVJWSVZPUjsKKwkJCQkJcGRldi0+c3BpZ290ID0gcGRldi0+c3BpZ290c1sxXTsKKwkJCQkJfQorCQkJCWlmICggRGFsZVNldHVwLnJlYm9vdFJlYnVpbGQgJiYgcmFpZG9uICkKKwkJCQkJcGFkYXB0ZXItPnJlY29uT24gPSBwZGV2LT5yZWNvbk9uID0gcGRldi0+cmVjb25Jc1N0YXJ0aW5nID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCQorCQlpZiAoICFwYWRhcHRlci0+bnVtYmVyT2ZEcml2ZXMgKQkJCQkJCQkJCS8vIElmIG5vIEFUQSBkZXZpY2VzIHRoZW4gc2NhbiBBVEFQSQorCQkJeworCQkJdW5pdCA9IDA7CisJCQlmb3IgKCBzcGlnb3QxID0gMDsgIHNwaWdvdDEgPCA0OyAgc3BpZ290MSsrICkKKwkJCQl7CisJCQkJZm9yICggZGV2aWNlID0gMDsgIGRldmljZSA8IDI7ICBkZXZpY2UrKyApCisJCQkJCXsKKwkJCQkJREVCIChwcmludGsgKCJcblBDSTIyNDJJOiBzY2FubmluZyBmb3IgSUQgJWQgIiwgKHNwaWdvdDEgKiAyKSArIGRldmljZSkpOworCQkJCQlwZGV2ID0gJihwYWRhcHRlci0+ZGV2aWNlWyhzcGlnb3QxICogMikgKyBkZXZpY2VdKTsKKwkJCQkJcGRldi0+Ynl0ZTYgPSAweDBBIHwgKGRldmljZSA8PCA0KTsKKwkJCQkJcGRldi0+c3BpZ290ID0gMSA8PCBzcGlnb3QxOworCQkJCQlpZiAoICFBdGFwaVJlc2V0IChwYWRhcHRlciwgcGRldikgKQorCQkJCQkJeworCQkJCQkJREVCIChwcmludGsgKCIgRGV2aWNlIGZvdW5kICIpKTsKKwkJCQkJCWlmICggIUF0YXBpSWRlbnRpZnkgKHBhZGFwdGVyLCBwZGV2KSApCisJCQkJCQkJeworCQkJCQkJCURFQiAocHJpbnRrICgiIERldmljZSB2ZXJpZmllZCIpKTsKKwkJCQkJCQl1bml0Kys7CisJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQlwZGV2LT5zcGlnb3QgPSBwZGV2LT5ieXRlNiA9IDA7CisJCQkJCX0KKwkJCQl9CisKKwkJCWlmICggdW5pdCApCisJCQkJeworCQkJCXBhZGFwdGVyLT5hdGFwaSA9IFRSVUU7CisJCQkJcGFkYXB0ZXItPnRpbWluZ0FkZHJlc3MgPSBEQUxFX0RBVEFfTU9ERTM7CisJCQkJb3V0d19wICgweDA5MDAsIHBhZGFwdGVyLT5yZWdJcnFDb250cm9sKTsJCQkJCS8vIFR1cm4gb3VyIGludGVycnVwdHMgb24KKwkJCQlvdXR3X3AgKDB4MEM0MSwgcGFkYXB0ZXItPnJlZ0RtYU1vZGUgLSAxKTsJCQkJCS8vIHNldHVwIGZvciAxNiBiaXRzLCByZWFkeSBlbmFibGVkLCBkb25lIElSUSBlbmFibGVkLCBubyBpbmNyaW1lbnQKKwkJCQlvdXRiX3AgKDB4RkYsIHBhZGFwdGVyLT5yZWdGYWlsKTsJCQkJCQkJLy8gYWxsIGZhaWwgbGlnaHRzIGFuZCBhbGFybSBvZmYKKwkJCQlwc2hvc3QtPm1heF9pZCA9IDg7CisJCQkJfQorCQkJfQorCQlTZXR1cEZpbmlzaCAocGFkYXB0ZXIsICIyMjQwIiwgcHNob3N0LT5pcnEpOworCQkKKwkJaWYgKCArK0luc3RhbGxlZCA8IE1BWEFEQVBURVIgKQorCQkJY29udGludWU7CisJCWJyZWFrOwordW5yZWdpc3RlcjE6OworCQlzY3NpX3VucmVnaXN0ZXIgKHBzaG9zdCk7CisJCX0KKworCU51bUFkYXB0ZXJzID0gSW5zdGFsbGVkOworCXJldHVybiBJbnN0YWxsZWQ7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBjaTIyMjBpX0Fib3J0CisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIEFib3J0IGNvbW1hbmQgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyLgorICoKKyAqCVBhcmFtZXRlcnM6CQlTQ3BudCAtIFBvaW50ZXIgdG8gU0NTSSBjb21tYW5kIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJQWxsd2F5cyBzbm9vemUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjIyMGlfQWJvcnQgKFNjc2lfQ21uZCAqU0NwbnQpCisJeworCVBBREFQVEVSMjIyMEkJcGFkYXB0ZXIgPSBIT1NUREFUQShTQ3BudC0+ZGV2aWNlLT5ob3N0KTsJCQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKKwlQT1VSX0RFVklDRQkJcGRldgkgPSAmcGFkYXB0ZXItPmRldmljZVtTQ3BudC0+ZGV2aWNlLT5pZF07Ly8gUG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKworCWlmICggIXBhZGFwdGVyLT5TQ3BudCApCisJCXJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCQorCWlmICggcGFkYXB0ZXItPmF0YXBpICkKKwkJeworCQlpZiAoIEF0YXBpUmVzZXQgKHBhZGFwdGVyLCBwZGV2KSApCisJCQlyZXR1cm4gU0NTSV9BQk9SVF9FUlJPUjsKKwkJT3BEb25lIChwYWRhcHRlciwgRElEX0FCT1JUIDw8IDE2KTsKKwkJcmV0dXJuIFNDU0lfQUJPUlRfU1VDQ0VTUzsKKwkJfQorCXJldHVybiBTQ1NJX0FCT1JUX1NOT09aRTsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjIyMGlfUmVzZXQKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyB0aGUgUmVzZXQgY29tbWFuZCBmcm9tIHRoZSBTQ1NJIG1hbmFnZXIuCisgKgorICoJUGFyYW1ldGVyczoJCVNDcG50IC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoJCQkJCWZsYWdzIC0gRmxhZ3MgYWJvdXQgdGhlIHJlc2V0IGNvbW1hbmQKKyAqCisgKglSZXR1cm5zOgkJTm8gYWN0aXZlIGNvbW1hbmQgYXQgdGhpcyB0aW1lLCBzbyB0aGlzIG1lYW5zCisgKgkJCQkJdGhhdCBlYWNoIHRpbWUgd2UgZ290IHNvbWUga2luZCBvZiByZXNwb25zZSB0aGUKKyAqCQkJCQlsYXN0IHRpbWUgdGhyb3VnaC4gIFRlbGwgdGhlIG1pZC1sZXZlbCBjb2RlIHRvCisgKgkJCQkJcmVxdWVzdCBzZW5zZSBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBkZWNpZGUgd2hhdAorICoJCQkJCXRvIGRvIG5leHQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjIyMGlfUmVzZXQgKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCByZXNldF9mbGFncykKKwl7CisJUEFEQVBURVIyMjIwSQlwYWRhcHRlciA9IEhPU1REQVRBKFNDcG50LT5kZXZpY2UtPmhvc3QpOwkJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVBPVVJfREVWSUNFCQlwZGV2CSA9ICZwYWRhcHRlci0+ZGV2aWNlW1NDcG50LT5kZXZpY2UtPmlkXTsvLyBQb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorCisJaWYgKCBwYWRhcHRlci0+YXRhcGkgKQorCQl7CisJCWlmICggQXRhcGlSZXNldCAocGFkYXB0ZXIsIHBkZXYpICkKKwkJCXJldHVybiBTQ1NJX1JFU0VUX0VSUk9SOworCQlyZXR1cm4gU0NTSV9SRVNFVF9TVUNDRVNTOworCQl9CisJcmV0dXJuIFNDU0lfUkVTRVRfUFVOVDsKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUGNpMjIyMGlfUmVsZWFzZQorICoKKyAqCURlc2NyaXB0aW9uOglSZWxlYXNlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEgc2luZ2xlIGVhY2ggYWRhcHRlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcHNob3N0IC0gUG9pbnRlciB0byBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnM6CQl6ZXJvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFBjaTIyMjBpX1JlbGVhc2UgKHN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCkKKwl7CisgICAgUEFEQVBURVIyMjIwSQlwYWRhcHRlciA9IEhPU1REQVRBIChwc2hvc3QpOworCVVTSE9SVAkJCXo7CisKKwlpZiAoIHBhZGFwdGVyLT5yZWNvbk9uICkKKwkJeworCQlwYWRhcHRlci0+cmVjb25PbiA9IEZBTFNFOwkJCQkJCS8vIHNodXQgZG93biB0aGUgaG90IHJlY29uc3RydWN0CisJCWlmICggcGFkYXB0ZXItPnJlY29uUGhhc2UgKQorCQkJbWRlbGF5ICgzMDApOworCQlpZiAoIHBhZGFwdGVyLT5yZWNvblRpbWVyLmRhdGEgKQkJCQkvLyBpcyB0aGUgdGltZXIgcnVubmluZz8KKwkJCXsKKwkJCWRlbF90aW1lciAoJnBhZGFwdGVyLT5yZWNvblRpbWVyKTsKKwkJCXBhZGFwdGVyLT5yZWNvblRpbWVyLmRhdGEgPSAwOworCQkJfQorCQl9CisKKwkvLyBzYXZlIFJBSUQgc3RhdHVzIG9uIHRoZSBib2FyZAorCWlmICggcGFkYXB0ZXItPmJpZ0QgKQorCQl7CisJCW91dGJfcCAocGFkYXB0ZXItPmZhaWxSZWdpc3RlciwgcGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBCSUdEX0FMQVJNX0lNQUdFKTsKKwkJZm9yICggeiA9IDA7ICB6IDwgQklHRF9NQVhEUklWRVM7ICB6KysgKQorCQkJeworCQkJaWYgKCBwYWRhcHRlci0+cmFpZERhdGEgKQorCQkJCW91dGJfcCAocGFkYXB0ZXItPnJhaWREYXRhW3pdLT5zdGF0dXMsIHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgQklHRF9SQUlEXzBfU1RBVFVTICsgeik7CQorCQkJZWxzZQorCQkJCW91dGJfcCAoMCwgcGFkYXB0ZXItPnJlZ1NjcmF0Y2hQYWQgKyBCSUdEX1JBSURfMF9TVEFUVVMpOwkKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlvdXRiX3AgKHBhZGFwdGVyLT5kZXZpY2VbMF0uRGlza01pcnJvclswXS5zdGF0dXMsIHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgREFMRV9SQUlEXzBfU1RBVFVTKTsJCQorCQlvdXRiX3AgKHBhZGFwdGVyLT5kZXZpY2VbMF0uRGlza01pcnJvclsxXS5zdGF0dXMsIHBhZGFwdGVyLT5yZWdTY3JhdGNoUGFkICsgREFMRV9SQUlEXzFfU1RBVFVTKTsJCQorCQl9CisKKwlpZiAoIHBhZGFwdGVyLT5pcnFPd25lZCApCisJCWZyZWVfaXJxIChwc2hvc3QtPmlycSwgcGFkYXB0ZXIpOworICAgIHJlbGVhc2VfcmVnaW9uIChwc2hvc3QtPmlvX3BvcnQsIHBzaG9zdC0+bl9pb19wb3J0KTsKKwlpZiAoIHBhZGFwdGVyLT5udW1iZXJPZkRyaXZlcyApCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBhZGFwdGVyLT5wY2lkZXYsIFNFQ1RPUlNYRkVSICogQllURVNfUEVSX1NFQ1RPUiwgcGFkYXB0ZXItPmtCdWZmZXIsIHBhZGFwdGVyLT5rQnVmZmVyRG1hKTsKKwllbHNlCQorCQlwY2lfZnJlZV9jb25zaXN0ZW50IChwYWRhcHRlci0+cGNpZGV2LCBBVEFQSV9UUkFOU0ZFUiwgcGFkYXB0ZXItPmtCdWZmZXIsIHBhZGFwdGVyLT5rQnVmZmVyRG1hKTsKKyAgICBzY3NpX3VucmVnaXN0ZXIocHNob3N0KTsKKyAgICByZXR1cm4gMDsKKwl9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQY2kyMjIwaV9CaW9zUGFyYW0KKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyB0aGUgYmlvc3BhcmFtIHJlcXVlc3QgZnJvbSB0aGUgU0NTSSBtYW5hZ2VyIHRvCisgKgkJCQkJcmV0dXJuIEMvSC9TIGRhdGEuCisgKgorICoJUGFyYW1ldGVyczoJCWRpc2sgLSBQb2ludGVyIHRvIFNDU0kgZGlzayBzdHJ1Y3R1cmUuCisgKgkJCQkJZGV2CSAtIE1ham9yL21pbm9yIG51bWJlciBmcm9tIGtlcm5lbC4KKyAqCQkJCQlnZW9tIC0gUG9pbnRlciB0byBpbnRlZ2VyIGFycmF5IHRvIHBsYWNlIGdlb21ldHJ5IGRhdGEuCisgKgorICoJUmV0dXJuczoJCXplcm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUGNpMjIyMGlfQmlvc1BhcmFtIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCisJeworCVBPVVJfREVWSUNFCXBkZXY7CisKKwlpZiAoICEoSE9TVERBVEEoc2Rldi0+aG9zdCkpLT5hdGFwaSApCisJCXsKKwkJcGRldiA9ICYoSE9TVERBVEEoc2Rldi0+aG9zdCktPmRldmljZVtzZGV2LT5pZF0pOworCisJCWdlb21bMF0gPSBwZGV2LT5oZWFkczsKKwkJZ2VvbVsxXSA9IHBkZXYtPnNlY3RvcnM7CisJCWdlb21bMl0gPSBwZGV2LT5jeWxpbmRlcnM7CisJCX0KKwlyZXR1cm4gMDsKKwl9CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLnByb2NfbmFtZQkJPSAicGNpMjIyMGkiLAorCS5uYW1lCQkJPSAiUENJLTIyMjBJL1BDSS0yMjQwSSIsCisJLmRldGVjdAkJCT0gUGNpMjIyMGlfRGV0ZWN0LAorCS5yZWxlYXNlCQk9IFBjaTIyMjBpX1JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBQY2kyMjIwaV9RdWV1ZUNvbW1hbmQsCisJLmFib3J0CQkJPSBQY2kyMjIwaV9BYm9ydCwKKwkucmVzZXQJCQk9IFBjaTIyMjBpX1Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IFBjaTIyMjBpX0Jpb3NQYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY2kyMjIwaS5oIGIvZHJpdmVycy9zY3NpL3BjaTIyMjBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNjA1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY2kyMjIwaS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLiBQQ0ktMjIyMEkgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogcGNpMjIyMGkuaCAtIExpbnV4IEhvc3QgRHJpdmVyIGZvciBQQ0ktMjIyMGkgRUlERSBBZGFwdGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiBtb2RpZmljYXRpb24uCisgKgorICogVGVjaG5pY2FsIHVwZGF0ZXMgYW5kIHByb2R1Y3QgaW5mb3JtYXRpb24gYXQ6CisgKiAgaHR0cDovL3d3dy5wc2lkaXNrLmNvbQorICoKKyAqIFBsZWFzZSBzZW5kIHF1ZXN0aW9ucywgY29tbWVudHMsIGJ1ZyByZXBvcnRzIHRvOgorICogIHRlY2hAcHNpZGlzay5jb20gVGVjaG5pY2FsIFN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1BDSTIyMjBJX0gKKyNkZWZpbmUgX1BDSTIyMjBJX0gKKworI2lmbmRlZiBMSU5VWF9WRVJTSU9OX0NPREUKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjZW5kaWYgCisjZGVmaW5lCUxJTlVYVkVSU0lPTih2LHAscykgICAgKCgodik8PDE2KSArICgocCk8PDgpICsgKHMpKQorCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCitpbnQgUGNpMjIyMGlfRGV0ZWN0CQkJKFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCk7CitpbnQgUGNpMjIyMGlfQ29tbWFuZAkJKFNjc2lfQ21uZCAqU0NwbnQpOworaW50IFBjaTIyMjBpX1F1ZXVlQ29tbWFuZAkoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitpbnQgUGNpMjIyMGlfQWJvcnQJCQkoU2NzaV9DbW5kICpTQ3BudCk7CitpbnQgUGNpMjIyMGlfUmVzZXQJCQkoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2ludCBQY2kyMjIwaV9SZWxlYXNlCQkoc3RydWN0IFNjc2lfSG9zdCAqcHNob3N0KTsKK2ludCBQY2kyMjIwaV9CaW9zUGFyYW0JCShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCQkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MjE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvS2NvbmZpZwpAQCAtMCwwICsxLDgyIEBACisjCisjIFBDTUNJQSBTQ1NJIGFkYXB0ZXIgY29uZmlndXJhdGlvbgorIworCittZW51ICJQQ01DSUEgU0NTSSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJIT1uICYmIFBDTUNJQSE9biAmJiBNT0RVTEVTCisKK2NvbmZpZyBQQ01DSUFfQUhBMTUyWAorCXRyaXN0YXRlICJBZGFwdGVjIEFIQTE1MlggUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBtICYmICE2NEJJVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFBDTUNJQSBTQ1NJIGhvc3QKKwkgIGFkYXB0ZXIgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWhhMTUyeF9jcy4KKworY29uZmlnIFBDTUNJQV9GRE9NQUlOCisJdHJpc3RhdGUgIkZ1dHVyZSBEb21haW4gUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBtCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgUENNQ0lBIFNDU0kgaG9zdAorCSAgYWRhcHRlciB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBmZG9tYWluX2NzLgorCitjb25maWcgUENNQ0lBX05JTkpBX1NDU0kKKwl0cmlzdGF0ZSAiTmluamFTQ1NJLTMgLyBOaW5qYVNDU0ktMzJCaSAoMTZiaXQpIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gbSAmJiAhNjRCSVQKKwloZWxwCisJICBJZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgUENNQ0lBIFNDU0kgaG9zdCBhZGFwdGVyIHRvCisJICB5b3VyIGNvbXB1dGVyLCBzYXkgWSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvTmluamFTQ1NJLnR4dD4uCisKKwkgIFN1cHBvcnRlZCBjYXJkczoKKworCSAgTmluamFTQ1NJLTM6ICh2ZXJzaW9uIHN0cmluZzogIldCVCIsIk5pbmphU0NTSS0zIiwiUjEuMCIpCisJICAgIElPLURBVEEgICAgIFBDU0MtRlAKKwkgICAgQUxQSEEgREFUQSAgQUQtUENTMjAxCisJICAgIEN5USd2ZSAgICAgIFNGQy0yMDEgIAorCSAgICBMT0dJVEVDSCAgICBMUE0tU0NTSTJFCisJICAgIFBpb25lZXIgUENSLVBSMjQncyBjYXJkCisJICAgIEktTyBEQVRBIENEUFMtUFgyNCdzIGNhcmQgKFBDU0MtRikKKwkgICAgUGFuYXNvbmljIEtYTC1SVzEwQU4gQ0QtUlcncyBjYXJkCisJICAgIGV0Yy4KKworCSAgTmluamFTQ1NJLTMyQml0IChpbiAxNmJpdCBtb2RlKToKKwkgICAgW1dvcmtiaXQgKHZlcnNpb24gc3RyaW5nOiAiV09SS0JJVCIsIlVsdHJhTmluamEtMTYiLCIxIildCisJICAgIEphenogU0NQMDUwCisJICAgIFtJLU8gREFUQSAoT0VNKSAodmVyc2lvbiBzdHJpbmc6ICJJTyBEQVRBIiwiQ0JTQzE2ICAgICAgICIsIjEiKV0KKwkgICAgSS1PIERBVEEgQ0JTQy1JSQorCSAgICBbS3l1c3l1IE1hdHN1c2hpdGEgS290b2J1a2kgKE9FTSkKKyAgICAgICAgICAgICAgICh2ZXJzaW9uIHN0cmluZzogIktNRSAgICAiLCJTQ1NJLUNBUkQtMDAxIiwiMSIpXQorCSAgICBLTUUgS1hMLTgyMEFOJ3MgY2FyZAorCSAgICBIUCBNODIwZSBDRFJXJ3MgY2FyZAorCSAgICBldGMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5zcF9jcy4KKworY29uZmlnIFBDTUNJQV9RTE9HSUMKKwl0cmlzdGF0ZSAiUWxvZ2ljIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gbQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFBDTUNJQSBTQ1NJIGhvc3QKKwkgIGFkYXB0ZXIgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljX2NzLgorCitjb25maWcgUENNQ0lBX1NZTTUzQzUwMAorCXRyaXN0YXRlICJTeW1iaW9zIDUzYzUwMCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIG0KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgTmV3IE1lZGlhIEJ1cyBUb2FzdGVyIG9yIG90aGVyIFBDTUNJQQorCSAgU0NTSSBhZGFwdGVyIGJhc2VkIG9uIHRoZSBTeW1iaW9zIDUzYzUwMCBjb250cm9sbGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW01M2M1MDBfY3MuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTM3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKworRVhUUkFfQ0ZMQUdTCQkrPSAtSWRyaXZlcnMvc2NzaQorCisjIDE2LWJpdCBjbGllbnQgZHJpdmVycworb2JqLSQoQ09ORklHX1BDTUNJQV9RTE9HSUMpCSs9IHFsb2dpY19jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX0ZET01BSU4pCSs9IGZkb21haW5fY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9BSEExNTJYKQkrPSBhaGExNTJ4X2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfTklOSkFfU0NTSSkJKz0gbnNwX2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfU1lNNTNDNTAwKQkrPSBzeW01M2M1MDBfY3MubworCithaGExNTJ4X2NzLW9ianMJOj0gYWhhMTUyeF9zdHViLm8gYWhhMTUyeF9jb3JlLm8KK2Zkb21haW5fY3Mtb2Jqcwk6PSBmZG9tYWluX3N0dWIubyBmZG9tYWluX2NvcmUubworcWxvZ2ljX2NzLW9ianMJOj0gcWxvZ2ljX3N0dWIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhMzcxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9jb3JlLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFBDTUNJQQkxCisjZGVmaW5lIEFIQTE1MlhfU1RBVCAxCisjaW5jbHVkZSAiYWhhMTUyeC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwYjRjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBkcml2ZXIgZm9yIEFkYXB0ZWMgQUhBMTUyWC1jb21wYXRpYmxlIFBDTUNJQSBTQ1NJIGNhcmRzLgorCisgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEFkYXB0ZWMgQUhBLTE0NjAsIHRoZSBOZXcgTWVkaWEgQnVzCisgICAgVG9hc3RlciwgYW5kIHRoZSBOZXcgTWVkaWEgVG9hc3QgJiBKYW0uCisgICAgCisgICAgYWhhMTUyeF9jcy5jIDEuNTQgMjAwMC8wNi8xMiAyMToyNzoyNQorCisgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAgICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworCisgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgICBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAgICA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICAgIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAorICAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKKyAgICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KKyAgICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQorICAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCisgICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgImFoYTE1MnguaCIKKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDA2NDQpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorImFoYTE1MnhfY3MuYyAxLjU0IDIwMDAvMDYvMTIgMjE6Mjc6MjUgKERhdmlkIEhpbmRzKSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKKy8qIFNDU0kgYnVzIHNldHVwIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgaG9zdF9pZCA9IDc7CitzdGF0aWMgaW50IHJlY29ubmVjdCA9IDE7CitzdGF0aWMgaW50IHBhcml0eSA9IDE7CitzdGF0aWMgaW50IHN5bmNocm9ub3VzID0gMTsKK3N0YXRpYyBpbnQgcmVzZXRfZGVsYXkgPSAxMDA7CitzdGF0aWMgaW50IGV4dF90cmFucyA9IDA7CisKK21vZHVsZV9wYXJhbShob3N0X2lkLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJlY29ubmVjdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwYXJpdHksIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3luY2hyb25vdXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmVzZXRfZGVsYXksIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZXh0X3RyYW5zLCBpbnQsIDApOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBzY3NpX2luZm9fdCB7CisgICAgZGV2X2xpbmtfdAkJbGluazsKKyAgICBkZXZfbm9kZV90CQlub2RlOworICAgIHN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7Cit9IHNjc2lfaW5mb190OworCitzdGF0aWMgdm9pZCBhaGExNTJ4X3JlbGVhc2VfY3MoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGFoYTE1MnhfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyBkZXZfbGlua190ICphaGExNTJ4X2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGFoYTE1MnhfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImFoYTE1MnhfY3MiOworCitzdGF0aWMgZGV2X2xpbmtfdCAqYWhhMTUyeF9hdHRhY2godm9pZCkKK3sKKyAgICBzY3NpX2luZm9fdCAqaW5mbzsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgImFoYTE1MnhfYXR0YWNoKClcbiIpOworCisgICAgLyogQ3JlYXRlIG5ldyBTQ1NJIGRldmljZSAqLworICAgIGluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworICAgIGlmICghaW5mbykgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworICAgIGxpbmsgPSAmaW5mby0+bGluazsgbGluay0+cHJpdiA9IGluZm87CisKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAweDIwOworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxMDsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFoYTE1MnhfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCWFoYTE1MnhfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGluazsKK30gLyogYWhhMTUyeF9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGFoYTE1MnhfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgImFoYTE1MnhfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgICAKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwlhaGExNTJ4X3JlbGVhc2VfY3MobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGtmcmVlKGxpbmstPnByaXYpOworICAgIAorfSAvKiBhaGExNTJ4X2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBhaGExNTJ4X2NvbmZpZ19jcyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBhaGExNTJ4X3NldHVwIHM7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKKyAgICB1X2NoYXIgdHVwbGVfZGF0YVs2NF07CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKyAgICAKKyAgICBERUJVRygwLCAiYWhhMTUyeF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSB0dXBsZV9kYXRhOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHdoaWxlICgxKSB7CisJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkgICAgZ290byBuZXh0X2VudHJ5OworCS8qIEZvciBOZXcgTWVkaWEgVCZKLCBsb29rIGZvciBhIFNDU0kgd2luZG93ICovCisJaWYgKHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzBdLmxlbiA+PSAweDIwKQorCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5iYXNlOworCWVsc2UgaWYgKChwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLm53aW4gPiAxKSAmJgorCQkgKHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzFdLmxlbiA+PSAweDIwKSkKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMV0uYmFzZTsKKwlpZiAoKHBhcnNlLmNmdGFibGVfZW50cnkuaW8ubndpbiA+IDApICYmCisJICAgIChsaW5rLT5pby5CYXNlUG9ydDEgPCAweGZmZmYpKSB7CisJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OworCSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8oaGFuZGxlLCAmbGluay0+aW8pOworCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKwl9CisgICAgbmV4dF9lbnRyeToKKwlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIH0KKyAgICAKKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworICAgIAorICAgIC8qIFNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhaGExNTJ4IGRyaXZlciAqLworICAgIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKyAgICBzLmNvbmYgICAgICAgID0gIlBDTUNJQSBzZXR1cCI7CisgICAgcy5pb19wb3J0ICAgICA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBzLmlycSAgICAgICAgID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIHMuc2NzaWlkICAgICAgPSBob3N0X2lkOworICAgIHMucmVjb25uZWN0ICAgPSByZWNvbm5lY3Q7CisgICAgcy5wYXJpdHkgICAgICA9IHBhcml0eTsKKyAgICBzLnN5bmNocm9ub3VzID0gc3luY2hyb25vdXM7CisgICAgcy5kZWxheSAgICAgICA9IHJlc2V0X2RlbGF5OworICAgIGlmIChleHRfdHJhbnMpCisgICAgICAgIHMuZXh0X3RyYW5zID0gZXh0X3RyYW5zOworCisgICAgaG9zdCA9IGFoYTE1MnhfcHJvYmVfb25lKCZzKTsKKyAgICBpZiAoaG9zdCA9PSBOVUxMKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeF9jczogbm8gU0NTSSBkZXZpY2VzIGZvdW5kXG4iKTsKKwlnb3RvIGNzX2ZhaWxlZDsKKyAgICB9CisKKyAgICBzcHJpbnRmKGluZm8tPm5vZGUuZGV2X25hbWUsICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKKyAgICBsaW5rLT5kZXYgPSAmaW5mby0+bm9kZTsKKyAgICBpbmZvLT5ob3N0ID0gaG9zdDsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcmV0dXJuOworICAgIAorY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworICAgIGFoYTE1MnhfcmVsZWFzZV9jcyhsaW5rKTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGFoYTE1MnhfcmVsZWFzZV9jcyhkZXZfbGlua190ICpsaW5rKQoreworCXNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKworCWFoYTE1MnhfcmVsZWFzZShpbmZvLT5ob3N0KTsKKwlsaW5rLT5kZXYgPSBOVUxMOworICAgIAorCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKK3N0YXRpYyBpbnQgYWhhMTUyeF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgCisgICAgREVCVUcoMCwgImFoYTE1MnhfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgYWhhMTUyeF9yZWxlYXNlX2NzKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJYWhhMTUyeF9jb25maWdfY3MobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBTY3NpX0NtbmQgdG1wOworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICB0bXAuZGV2aWNlLT5ob3N0ID0gaW5mby0+aG9zdDsKKwkgICAgYWhhMTUyeF9ob3N0X3Jlc2V0KCZ0bXApOworCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhaGExNTJ4X2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImFoYTE1MnhfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBhaGExNTJ4X2F0dGFjaCwKKwkuZGV0YWNoCQk9IGFoYTE1MnhfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9haGExNTJ4X2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmFoYTE1MnhfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfYWhhMTUyeF9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmYWhhMTUyeF9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9haGExNTJ4X2NzKTsKK21vZHVsZV9leGl0KGV4aXRfYWhhMTUyeF9jcyk7CisgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fY29yZS5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg5MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX2NvcmUuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgUENNQ0lBIDEKKyNpbmNsdWRlICJmZG9tYWluLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGY3YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYwpAQCAtMCwwICsxLDMyMyBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIGRyaXZlciBmb3IgRnV0dXJlIERvbWFpbi1jb21wYXRpYmxlIFBDTUNJQSBTQ1NJIGNhcmRzCisKKyAgICBmZG9tYWluX2NzLmMgMS40NyAyMDAxLzEwLzEzIDAwOjA4OjUyCisKKyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisKKyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAgICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgICAgd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAgICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgorICAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyAgICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiZmRvbWFpbi5oIgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZ1dHVyZSBEb21haW4gUENNQ0lBIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisiZmRvbWFpbl9jcy5jIDEuNDcgMjAwMS8xMC8xMyAwMDowODo1MiAoRGF2aWQgSGluZHMpIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IHNjc2lfaW5mb190IHsKKyAgICBkZXZfbGlua190CQlsaW5rOworICAgIGRldl9ub2RlX3QJCW5vZGU7CisgICAgc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKK30gc2NzaV9pbmZvX3Q7CisKKworc3RhdGljIHZvaWQgZmRvbWFpbl9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBmZG9tYWluX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyBkZXZfbGlua190ICpmZG9tYWluX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGZkb21haW5fZGV0YWNoKGRldl9saW5rX3QgKik7CisKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiZmRvbWFpbl9jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICpmZG9tYWluX2F0dGFjaCh2b2lkKQoreworICAgIHNjc2lfaW5mb190ICppbmZvOworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgaW50IHJldDsKKyAgICAKKyAgICBERUJVRygwLCAiZmRvbWFpbl9hdHRhY2goKVxuIik7CisKKyAgICAvKiBDcmVhdGUgbmV3IFNDU0kgZGV2aWNlICovCisgICAgaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFpbmZvKSByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisgICAgbGluayA9ICZpbmZvLT5saW5rOyBsaW5rLT5wcml2ID0gaW5mbzsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAweDEwOworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxMDsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmZkb21haW5fZXZlbnQ7CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCWZkb21haW5fZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGluazsKK30gLyogZmRvbWFpbl9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZkb21haW5fZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgImZkb21haW5fZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgICAKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwlmZG9tYWluX3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGtmcmVlKGxpbmstPnByaXYpOworICAgIAorfSAvKiBmZG9tYWluX2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBmZG9tYWluX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisgICAgdV9jaGFyIHR1cGxlX2RhdGFbNjRdOworICAgIGNoYXIgc3RyWzE2XTsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCisgICAgREVCVUcoMCwgImZkb21haW5fY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gdHVwbGVfZGF0YTsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKyAgICAKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgd2hpbGUgKDEpIHsKKwlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwIHx8CisJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQorCSAgICBnb3RvIG5leHRfZW50cnk7CisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW5kZXg7CisJbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0uYmFzZTsKKwlpID0gcGNtY2lhX3JlcXVlc3RfaW8oaGFuZGxlLCAmbGluay0+aW8pOworCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworICAgIG5leHRfZW50cnk6CisJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB9CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworICAgIAorICAgIC8qIEEgYmFkIGhhY2suLi4gKi8KKyAgICByZWxlYXNlX3JlZ2lvbihsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlvLk51bVBvcnRzMSk7CisKKyAgICAvKiBTZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgZmRvbWFpbiBkcml2ZXIgKi8KKyAgICBzcHJpbnRmKHN0ciwgIiVkLCVkIiwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworICAgIGZkb21haW5fc2V0dXAoc3RyKTsKKyAgICAKKyAgICBob3N0ID0gX19mZG9tYWluXzE2eDBfZGV0ZWN0KCZmZG9tYWluX2RyaXZlcl90ZW1wbGF0ZSk7CisgICAgaWYgKCFob3N0KSB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImZkb21haW5fY3M6IG5vIFNDU0kgZGV2aWNlcyBmb3VuZFxuIik7CisJZ290byBjc19mYWlsZWQ7CisgICAgfQorIAorICAgIHNjc2lfYWRkX2hvc3QoaG9zdCwgTlVMTCk7IC8qIFhYWCBoYW5kbGUgZmFpbHVyZSAqLworICAgIHNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisgICAgc3ByaW50ZihpbmZvLT5ub2RlLmRldl9uYW1lLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisgICAgaW5mby0+aG9zdCA9IGhvc3Q7CisgICAgCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICByZXR1cm47CisgICAgCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisgICAgZmRvbWFpbl9yZWxlYXNlKGxpbmspOworICAgIHJldHVybjsKKyAgICAKK30gLyogZmRvbWFpbl9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZkb21haW5fcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIHNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKworICAgIERFQlVHKDAsICJmZG9tYWluX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgc2NzaV9yZW1vdmVfaG9zdChpbmZvLT5ob3N0KTsKKyAgICBsaW5rLT5kZXYgPSBOVUxMOworICAgIAorICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgICBzY3NpX3VucmVnaXN0ZXIoaW5mby0+aG9zdCk7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZmRvbWFpbl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQlldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCisgICAgREVCVUcoMSwgImZkb21haW5fZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgZmRvbWFpbl9yZWxlYXNlKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJZmRvbWFpbl9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBmZG9tYWluXzE2eDBfYnVzX3Jlc2V0KE5VTEwpOworCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGZkb21haW5fZXZlbnQgKi8KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGZkb21haW5fY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiZmRvbWFpbl9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IGZkb21haW5fYXR0YWNoLAorCS5kZXRhY2gJCT0gZmRvbWFpbl9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2Zkb21haW5fY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmZmRvbWFpbl9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9mZG9tYWluX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZmZG9tYWluX2NzX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X2Zkb21haW5fY3MpOworbW9kdWxlX2V4aXQoZXhpdF9mZG9tYWluX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NmM0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCkBAIC0wLDAgKzEsMjE5OCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBOaW5qYVNDU0ktMyAvIE5pbmphU0NTSS0zMkJpIFBDTUNJQSBTQ1NJIGhvc3QgYWRhcHRlciBjYXJkIGRyaXZlcgorICAgICAgQnk6IFlPS09UQSBIaXJvc2hpIDx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+CisKKyAgICBWZXIuMi44ICAgU3VwcG9ydCAzMmJpdCBNTUlPIG1vZGUKKyAgICAgICAgICAgICAgU3VwcG9ydCBTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3QgKFNEVFIpIG1vZGUKKyAgICBWZXIuMi4wICAgU3VwcG9ydCAzMmJpdCBQSU8gbW9kZQorICAgIFZlci4xLjEuMiBGaXggZm9yIHNjYXR0ZXIgbGlzdCBidWZmZXIgZXhjZWVkcworICAgIFZlci4xLjEgICBTdXBwb3J0IHNjYXR0ZXIgbGlzdAorICAgIFZlci4wLjEgICBJbml0aWFsIHZlcnNpb24KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlc2UgUENjYXJkcy4KKworCUktTyBEQVRBIFBDU0MtRgkgKFdvcmtiaXQgTmluamFTQ1NJLTMpCisJCQkiV0JUIiwgIk5pbmphU0NTSS0zIiwgIlIxLjAiCisJSS1PIERBVEEgQ0JTQy1JSSAoV29ya2JpdCBOaW5qYVNDU0ktMzJCaSBpbiAxNmJpdCBtb2RlKQorCQkJIklPIERBVEEiLCAiQ0JTQzE2CSAiLCAiMSIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogbnNwX2NzLmMsdiAxLjIzIDIwMDMvMDgvMTggMTE6MDk6MTkgZWxjYSBFeHAgJCAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDwuLi9kcml2ZXJzL3Njc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgIm5zcF9jcy5oIgorCitNT0RVTEVfQVVUSE9SKCJZT0tPVEEgSGlyb3NoaSA8eW9rb3RhQG5ldGxhYi5pcy50c3VrdWJhLmFjLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXb3JrQml0IE5pbmphU0NTSS0zIC8gTmluamFTQ1NJLTMyQmkoMTZiaXQpIFBDTUNJQSBTQ1NJIGhvc3QgYWRhcHRlciBtb2R1bGUgJFJldmlzaW9uOiAxLjIzICQiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJzZCxzcixzZyxzdCIpOworI2lmZGVmIE1PRFVMRV9MSUNFTlNFCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYKKworI2luY2x1ZGUgIm5zcF9pby5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcgKi8KKworc3RhdGljIGludCAgICAgICBuc3BfYnVyc3RfbW9kZSA9IEJVUlNUX01FTTMyOworbW9kdWxlX3BhcmFtKG5zcF9idXJzdF9tb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhuc3BfYnVyc3RfbW9kZSwgIkJ1cnN0IHRyYW5zZmVyIG1vZGUgKDA9aW84LCAxPWlvMzIsIDI9bWVtMzIoZGVmYXVsdCkpIik7CisKKy8qIFJlbGVhc2UgSU8gcG9ydHMgYWZ0ZXIgY29uZmlndXJhdGlvbj8gKi8KK3N0YXRpYyBpbnQgICAgICAgZnJlZV9wb3J0cyA9IDA7Cittb2R1bGVfcGFyYW0oZnJlZV9wb3J0cywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyZWVfcG9ydHMsICJSZWxlYXNlIElPIHBvcnRzIGFmdGVyIGNvbmZpZ3VyYXRpb24/IChkZWZhdWx0OiAwICg9bm8pKSIpOworCisvKiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL3Njc2kvaG9zdHMuaCAqLworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBuc3BfZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJICAgICAgICAgPSAibnNwX2NzIiwKKwkucHJvY19pbmZvCQkgPSBuc3BfcHJvY19pbmZvLAorCS5uYW1lCQkJID0gIldvcmtCaXQgTmluamFTQ1NJLTMvMzJCaSgxNmJpdCkiLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJLmRldGVjdAkJCSA9IG5zcF9kZXRlY3Rfb2xkLAorCS5yZWxlYXNlCQkgPSBuc3BfcmVsZWFzZV9vbGQsCisjZW5kaWYKKwkuaW5mbwkJCSA9IG5zcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCSA9IG5zcF9xdWV1ZWNvbW1hbmQsCisvKgkuZWhfc3RyYXRlZ3lfaGFuZGxlcgkgPSBuc3BfZWhfc3RyYXRlZ3ksKi8KKy8qCS5laF9hYm9ydF9oYW5kbGVyCSA9IG5zcF9laF9hYm9ydCwqLworLyoJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gbnNwX2VoX2RldmljZV9yZXNldCwqLworCS5laF9idXNfcmVzZXRfaGFuZGxlcgkgPSBuc3BfZWhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJID0gbnNwX2VoX2hvc3RfcmVzZXQsCisJLmNhbl9xdWV1ZQkJID0gMSwKKwkudGhpc19pZAkJID0gTlNQX0lOSVRJQVRPUl9JRCwKKwkuc2dfdGFibGVzaXplCQkgPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQkgPSAxLAorCS51c2VfY2x1c3RlcmluZwkJID0gRElTQUJMRV9DTFVTVEVSSU5HLAorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMikpCisJLnVzZV9uZXdfZWhfY29kZQkgPSAxLAorI2VuZGlmCit9OworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gID0geyJuc3BfY3MifTsKKworc3RhdGljIG5zcF9od19kYXRhIG5zcF9kYXRhX2Jhc2U7IC8qIGF0dGFjaCA8LT4gZGV0ZWN0IGdsdWUgKi8KKworCisKKy8qCisgKiBkZWJ1ZywgZXJyb3IgcHJpbnQKKyAqLworI2lmbmRlZiBOU1BfREVCVUcKKyMgZGVmaW5lIE5TUF9ERUJVR19NQVNLCQkweDAwMDAwMAorIyBkZWZpbmUgbnNwX21zZyh0eXBlLCBhcmdzLi4uKSBuc3BfY3NfbWVzc2FnZSgiIiwgMCwgKHR5cGUpLCBhcmdzKQorIyBkZWZpbmUgbnNwX2RiZyhtYXNrLCBhcmdzLi4uKSAvKiAqLworI2Vsc2UKKyMgZGVmaW5lIE5TUF9ERUJVR19NQVNLCQkweGZmZmZmZgorIyBkZWZpbmUgbnNwX21zZyh0eXBlLCBhcmdzLi4uKSBcCisJbnNwX2NzX21lc3NhZ2UgKF9fRlVOQ1RJT05fXywgX19MSU5FX18sICh0eXBlKSwgYXJncykKKyMgZGVmaW5lIG5zcF9kYmcobWFzaywgYXJncy4uLikgXAorCW5zcF9jc19kbWVzc2FnZShfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAobWFzayksIGFyZ3MpCisjZW5kaWYKKworI2RlZmluZSBOU1BfREVCVUdfUVVFVUVDT01NQU5ECQlCSVQoMCkKKyNkZWZpbmUgTlNQX0RFQlVHX1JFR0lTVEVSCQlCSVQoMSkKKyNkZWZpbmUgTlNQX0RFQlVHX0FVVE9TQ1NJCQlCSVQoMikKKyNkZWZpbmUgTlNQX0RFQlVHX0lOVFIJCQlCSVQoMykKKyNkZWZpbmUgTlNQX0RFQlVHX1NHTElTVAkJQklUKDQpCisjZGVmaW5lIE5TUF9ERUJVR19CVVNGUkVFCQlCSVQoNSkKKyNkZWZpbmUgTlNQX0RFQlVHX0NEQl9DT05URU5UUwkJQklUKDYpCisjZGVmaW5lIE5TUF9ERUJVR19SRVNFTEVDVElPTgkJQklUKDcpCisjZGVmaW5lIE5TUF9ERUJVR19NU0dJTk9DQ1VSCQlCSVQoOCkKKyNkZWZpbmUgTlNQX0RFQlVHX0VFUFJPTQkJQklUKDkpCisjZGVmaW5lIE5TUF9ERUJVR19NU0dPVVRPQ0NVUgkJQklUKDEwKQorI2RlZmluZSBOU1BfREVCVUdfQlVTUkVTRVQJCUJJVCgxMSkKKyNkZWZpbmUgTlNQX0RFQlVHX1JFU1RBUlQJCUJJVCgxMikKKyNkZWZpbmUgTlNQX0RFQlVHX1NZTkMJCQlCSVQoMTMpCisjZGVmaW5lIE5TUF9ERUJVR19XQUlUCQkJQklUKDE0KQorI2RlZmluZSBOU1BfREVCVUdfVEFSR0VURkxBRwkJQklUKDE1KQorI2RlZmluZSBOU1BfREVCVUdfUFJPQwkJCUJJVCgxNikKKyNkZWZpbmUgTlNQX0RFQlVHX0lOSVQJCQlCSVQoMTcpCisjZGVmaW5lIE5TUF9ERUJVR19EQVRBX0lPICAgICAgCQlCSVQoMTgpCisjZGVmaW5lIE5TUF9TUEVDSUFMX1BSSU5UX1JFR0lTVEVSCUJJVCgyMCkKKworI2RlZmluZSBOU1BfREVCVUdfQlVGX0xFTgkJMTUwCisKK3N0YXRpYyB2b2lkIG5zcF9jc19tZXNzYWdlKGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lLCBjaGFyICp0eXBlLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbTlNQX0RFQlVHX0JVRl9MRU5dOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKyNpZm5kZWYgTlNQX0RFQlVHCisJcHJpbnRrKCIlc25zcF9jczogJXNcbiIsIHR5cGUsIGJ1Zik7CisjZWxzZQorCXByaW50aygiJXNuc3BfY3M6ICVzICglZCk6ICVzXG4iLCB0eXBlLCBmdW5jLCBsaW5lLCBidWYpOworI2VuZGlmCit9CisKKyNpZmRlZiBOU1BfREVCVUcKK3N0YXRpYyB2b2lkIG5zcF9jc19kbWVzc2FnZShjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSwgaW50IG1hc2ssIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZltOU1BfREVCVUdfQlVGX0xFTl07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWlmIChtYXNrICYgTlNQX0RFQlVHX01BU0spIHsKKwkJcHJpbnRrKCJuc3BfY3MtZGVidWc6IDB4JXggJXMgKCVkKTogJXNcbiIsIG1hc2ssIGZ1bmMsIGxpbmUsIGJ1Zik7CisJfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDbGVuYXVwIHBhcmFtZXRlcnMgYW5kIGNhbGwgZG9uZSgpIGZ1bmN0aW9ucy4KKyAqIFlvdSBtdXN0IGJlIHNldCBTQ3BudC0+cmVzdWx0IGJlZm9yZSBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIG5zcF9zY3NpX2RvbmUoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJZGF0YS0+Q3VycmVudFNDID0gTlVMTDsKKworCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOworfQorCitzdGF0aWMgaW50IG5zcF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKyNpZmRlZiBOU1BfREVCVUcKKwkvKnVuc2lnbmVkIGludCBob3N0X2lkID0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZDsqLworCS8qdW5zaWduZWQgaW50IGJhc2UgICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OyovCisJdW5zaWduZWQgY2hhciB0YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKyNlbmRpZgorCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwluc3BfZGJnKE5TUF9ERUJVR19RVUVVRUNPTU1BTkQsICJTQ3BudD0weCVwIHRhcmdldD0lZCBsdW49JWQgYnVmZj0weCVwIGJ1ZmZsZW49JWQgdXNlX3NnPSVkIiwKKwkJICAgU0NwbnQsIHRhcmdldCwgU0NwbnQtPmRldmljZS0+bHVuLCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIFNDcG50LT51c2Vfc2cpOworCS8vbnNwX2RiZyhOU1BfREVCVUdfUVVFVUVDT01NQU5ELCAiYmVmb3JlIEN1cnJlbnRTQz0weCVwIiwgZGF0YS0+Q3VycmVudFNDKTsKKworCVNDcG50LT5zY3NpX2RvbmUJPSBkb25lOworCisJaWYgKGRhdGEtPkN1cnJlbnRTQyAhPSBOVUxMKSB7CisJCW5zcF9tc2coS0VSTl9ERUJVRywgIkN1cnJlbnRTQyE9TlVMTCB0aGlzIGNhbid0IGJlIGhhcHBlbiIpOworCQlTQ3BudC0+cmVzdWx0ICAgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJbnNwX3Njc2lfZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworI2lmIDAKKwkvKiBYWFg6IHBjbWNpYS1jcyBnZW5lcmF0ZXMgU0NTSSBjb21tYW5kIHdpdGggInNjc2lfaW5mbyIgdXRpbGl0eS4KKwkgICAgICAgIFRoaXMgbWFrZXMga2VybmVsIGNyYXNoIHdoZW4gc3VzcGVuZGluZy4uLiAqLworCWlmIChkYXRhLT5TY3NpSW5mby0+c3RvcCAhPSAwKSB7CisJCW5zcF9tc2coS0VSTl9JTkZPLCAic3VzcGVuZGluZyBkZXZpY2UuIHJlamVjdCBjb21tYW5kLiIpOworCQlTQ3BudC0+cmVzdWx0ICA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQluc3Bfc2NzaV9kb25lKFNDcG50KTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorI2VuZGlmCisKKwlzaG93X2NvbW1hbmQoU0NwbnQpOworCisJZGF0YS0+Q3VycmVudFNDCQk9IFNDcG50OworCisJU0NwbnQtPlNDcC5TdGF0dXMJPSBDSEVDS19DT05ESVRJT047CisJU0NwbnQtPlNDcC5NZXNzYWdlCT0gMDsKKwlTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbiA9IElPX1VOS05PV047CisJU0NwbnQtPlNDcC5zZW50X2NvbW1hbmQgPSAwOworCVNDcG50LT5TQ3AucGhhc2UJPSBQSF9VTkRFVEVSTUlORUQ7CisJU0NwbnQtPnJlc2lkCSAgICAgICAgPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCisJLyogc2V0dXAgc2NyYXRjaCBhcmVhCisJICAgU0NwLnB0cgkJOiBidWZmZXIgcG9pbnRlcgorCSAgIFNDcC50aGlzX3Jlc2lkdWFsCTogYnVmZmVyIGxlbmd0aAorCSAgIFNDcC5idWZmZXIJCTogbmV4dCBidWZmZXIKKwkgICBTQ3AuYnVmZmVyc19yZXNpZHVhbCA6IGxlZnQgYnVmZmVycyBpbiBsaXN0CisJICAgU0NwLnBoYXNlCQk6IGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbW1hbmQgKi8KKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlTQ3BudC0+U0NwLmJ1ZmZlcgkgICAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJU0NwbnQtPlNDcC5wdHIJCSAgICA9IEJVRkZFUl9BRERSOworCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBTQ3BudC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBTQ3BudC0+dXNlX3NnIC0gMTsKKwl9IGVsc2UgeworCQlTQ3BudC0+U0NwLnB0cgkJICAgID0gKGNoYXIgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCQlTQ3BudC0+U0NwLmJ1ZmZlcgkgICAgPSBOVUxMOworCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCX0KKworCWlmIChuc3Bod19zdGFydF9zZWxlY3Rpb24oU0NwbnQpID09IEZBTFNFKSB7CisJCW5zcF9kYmcoTlNQX0RFQlVHX1FVRVVFQ09NTUFORCwgInNlbGVjdGlvbiBmYWlsIik7CisJCVNDcG50LT5yZXN1bHQgICA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJbnNwX3Njc2lfZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19RVUVVRUNPTU1BTkQsICJvdXQiKTsKKyNpZmRlZiBOU1BfREVCVUcKKwlkYXRhLT5DbWRJZCsrOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZXR1cCBQSU8gRklGTyB0cmFuc2ZlciBtb2RlIGFuZCBlbmFibGUvZGlzYWJsZSB0byBkYXRhIG91dAorICovCitzdGF0aWMgdm9pZCBuc3Bfc2V0dXBfZmlmbyhuc3BfaHdfZGF0YSAqZGF0YSwgaW50IGVuYWJsZWQpCit7CisJdW5zaWduZWQgaW50ICBiYXNlID0gZGF0YS0+QmFzZUFkZHJlc3M7CisJdW5zaWduZWQgY2hhciB0cmFuc2Zlcl9tb2RlX3JlZzsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImVuYWJsZWQ9JWQiLCBlbmFibGVkKTsKKworCWlmIChlbmFibGVkICE9IEZBTFNFKSB7CisJCXRyYW5zZmVyX21vZGVfcmVnID0gVFJBTlNGRVJfR08gfCBCUkFJTkQ7CisJfSBlbHNlIHsKKwkJdHJhbnNmZXJfbW9kZV9yZWcgPSAwOworCX0KKworCXRyYW5zZmVyX21vZGVfcmVnIHw9IGRhdGEtPlRyYW5zZmVyTW9kZTsKKworCW5zcF9pbmRleF93cml0ZShiYXNlLCBUUkFOU0ZFUk1PREUsIHRyYW5zZmVyX21vZGVfcmVnKTsKK30KKworc3RhdGljIHZvaWQgbnNwaHdfaW5pdF9zeW5jKG5zcF9od19kYXRhICpkYXRhKQoreworCXN5bmNfZGF0YSB0bXBfc3luYyA9IHsgLlN5bmNOZWdvdGlhdGlvbiA9IFNZTkNfTk9UX1lFVCwKKwkJCSAgICAgICAuU3luY1BlcmlvZCAgICAgID0gMCwKKwkJCSAgICAgICAuU3luY09mZnNldCAgICAgID0gMAorCX07CisJaW50IGk7CisKKwkvKiBzZXR1cCBzeW5jIGRhdGEgKi8KKwlmb3IgKCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+U3luYyk7IGkrKyApIHsKKwkJZGF0YS0+U3luY1tpXSA9IHRtcF9zeW5jOworCX0KK30KKworLyoKKyAqIEluaXRpYWxpemUgTmluamEgaGFyZHdhcmUKKyAqLworc3RhdGljIGludCBuc3Bod19pbml0KG5zcF9od19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBiYXNlICAgICA9IGRhdGEtPkJhc2VBZGRyZXNzOworCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluIGJhc2U9MHgleCIsIGJhc2UpOworCisJZGF0YS0+U2NzaUNsb2NrRGl2ID0gQ0xPQ0tfNDBNIHwgRkFTVF8yMDsKKwlkYXRhLT5DdXJyZW50U0MgICAgPSBOVUxMOworCWRhdGEtPkZpZm9Db3VudCAgICA9IDA7CisJZGF0YS0+VHJhbnNmZXJNb2RlID0gTU9ERV9JTzg7CisKKwluc3Bod19pbml0X3N5bmMoZGF0YSk7CisKKwkvKiBibG9jayBhbGwgaW50ZXJydXB0cyAqLworCW5zcF93cml0ZShiYXNlLAkgICAgICBJUlFDT05UUk9MLCAgIElSUUNPTlRST0xfQUxMTUFTSyk7CisKKwkvKiBzZXR1cCBTQ1NJIGludGVyZmFjZSAqLworCW5zcF93cml0ZShiYXNlLAkgICAgICBJRlNFTEVDVCwJICAgIElGX0lGU0VMKTsKKworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJSVJRTU9ERSwgIDApOworCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRSQU5TRkVSTU9ERSwgTU9ERV9JTzgpOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBDTE9DS0RJViwJICAgIGRhdGEtPlNjc2lDbG9ja0Rpdik7CisKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgUEFSSVRZQ1RSTCwgICAwKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgUE9JTlRFUkNMUiwgICBQT0lOVEVSX0NMRUFSICAgICB8CisJCQkJCSAgICBBQ0tfQ09VTlRFUl9DTEVBUiB8CisJCQkJCSAgICBSRVFfQ09VTlRFUl9DTEVBUiB8CisJCQkJCSAgICBIT1NUX0NPVU5URVJfQ0xFQVIpOworCisJLyogc2V0dXAgZmlmbyBhc2ljICovCisJbnNwX3dyaXRlKGJhc2UsCSAgICAgIElGU0VMRUNULAkgICAgSUZfUkVHU0VMKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgVEVSTVBXUkNUUkwsICAwKTsKKwlpZiAoKG5zcF9pbmRleF9yZWFkKGJhc2UsIE9USEVSQ09OVFJPTCkgJiBUUFdSX1NFTlNFKSA9PSAwKSB7CisJCW5zcF9tc2coS0VSTl9JTkZPLCAidGVybWluYXRvciBwb3dlciBvbiIpOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgVEVSTVBXUkNUUkwsIFBPV0VSX09OKTsKKwl9CisKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgVElNRVJDT1VOVCwgICAwKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgVElNRVJDT1VOVCwgICAwKTsgLyogcmVxdWlyZXMgMiB0aW1lcyEhICovCisKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU1lOQ1JFRywJICAgIDApOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBBQ0tXSURUSCwJICAgIDApOworCisJLyogZW5hYmxlIGludGVycnVwdHMgYW5kIGFjayB0aGVtICovCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lJUlFNT0RFLCAgU0NTSV9QSEFTRV9DSEFOR0VfRUkgfAorCQkJCQkgICAgUkVTRUxFQ1RfRUkJCSB8CisJCQkJCSAgICBTQ1NJX1JFU0VUX0lSUV9FSQkgKTsKKwluc3Bfd3JpdGUoYmFzZSwJICAgICAgSVJRQ09OVFJPTCwgICBJUlFDT05UUk9MX0FMTENMRUFSKTsKKworCW5zcF9zZXR1cF9maWZvKGRhdGEsIEZBTFNFKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICogU3RhcnQgc2VsZWN0aW9uIHBoYXNlCisgKi8KK3N0YXRpYyBpbnQgbnNwaHdfc3RhcnRfc2VsZWN0aW9uKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJdW5zaWduZWQgaW50ICBob3N0X2lkCSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPnRoaXNfaWQ7CisJdW5zaWduZWQgaW50ICBiYXNlCSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgY2hhciB0YXJnZXQJID0gU0NwbnQtPmRldmljZS0+aWQ7CisJbnNwX2h3X2RhdGEgICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50CSAgICAgIHRpbWVfb3V0OworCXVuc2lnbmVkIGNoYXIgcGhhc2UsIGFyYml0OworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgImluIik7CisKKwlwaGFzZSA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lCVVNNT04pOworCWlmKHBoYXNlICE9IEJVU01PTl9CVVNfRlJFRSkgeworCQkvL25zcF9kYmcoTlNQX0RFQlVHX1JFU0VMRUNUSU9OLCAiYnVzIGJ1c3kiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIHN0YXJ0IGFyYml0cmF0aW9uICovCisJLy9uc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgInN0YXJ0IGFyYml0Iik7CisJU0NwbnQtPlNDcC5waGFzZSA9IFBIX0FSQlNUQVJUOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTRVRBUkJJVCwgQVJCSVRfR08pOworCisJdGltZV9vdXQgPSAxMDAwOworCWRvIHsKKwkJLyogWFhYOiB3aGF0IGEgc3R1cGlkIGNoaXAhICovCisJCWFyYml0ID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgQVJCSVRTVEFUVVMpOworCQkvL25zcF9kYmcoTlNQX0RFQlVHX1JFU0VMRUNUSU9OLCAiYXJiaXQ9JWQsIHdhaXRfY291bnQ9JWQiLCBhcmJpdCwgd2FpdF9jb3VudCk7CisJCXVkZWxheSgxKTsgLyogaG9sZCAxLjJ1cyAqLworCX0gd2hpbGUoKGFyYml0ICYgKEFSQklUX1dJTiB8IEFSQklUX0ZBSUwpKSA9PSAwICYmCisJCSh0aW1lX291dC0tICE9IDApKTsKKworCWlmICghKGFyYml0ICYgQVJCSVRfV0lOKSkgeworCQkvL25zcF9kYmcoTlNQX0RFQlVHX1JFU0VMRUNUSU9OLCAiYXJiaXQgZmFpbCIpOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0VUQVJCSVQsIEFSQklUX0ZMQUdfQ0xFQVIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogYXNzZXJ0IHNlbGVjdCBsaW5lICovCisJLy9uc3BfZGJnKE5TUF9ERUJVR19SRVNFTEVDVElPTiwgImFzc2VydCBTRUwgbGluZSIpOworCVNDcG50LT5TQ3AucGhhc2UgPSBQSF9TRUxTVEFSVDsKKwl1ZGVsYXkoMyk7IC8qIHdhaXQgMi40dXMgKi8KKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSURBVEFMQVRDSCwgQklUKGhvc3RfaWQpIHwgQklUKHRhcmdldCkpOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgICBTQ1NJX1NFTCB8IFNDU0lfQlNZICAgICAgICAgICAgICAgICAgICB8IFNDU0lfQVROKTsKKwl1ZGVsYXkoMik7IC8qIHdhaXQgPjEuMnVzICovCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCAgIFNDU0lfU0VMIHwgU0NTSV9CU1kgfCBTQ1NJX0RBVEFPVVRfRU5CIHwgU0NTSV9BVE4pOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTRVRBUkJJVCwJICAgICBBUkJJVF9GTEFHX0NMRUFSKTsKKwkvKnVkZWxheSgxKTsqLyAvKiB3YWl0ID45MG5zICovCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCAgIFNDU0lfU0VMICAgICAgICAgICAgfCBTQ1NJX0RBVEFPVVRfRU5CIHwgU0NTSV9BVE4pOworCisJLyogY2hlY2sgc2VsZWN0aW9uIHRpbWVvdXQgKi8KKwluc3Bfc3RhcnRfdGltZXIoU0NwbnQsIDEwMDAvNTEpOworCWRhdGEtPlNlbGVjdGlvblRpbWVPdXQgPSAxOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBuc3Bfc3luY190YWJsZSB7CisJdW5zaWduZWQgaW50IG1pbl9wZXJpb2Q7CisJdW5zaWduZWQgaW50IG1heF9wZXJpb2Q7CisJdW5zaWduZWQgaW50IGNoaXBfcGVyaW9kOworCXVuc2lnbmVkIGludCBhY2tfd2lkdGg7Cit9OworCitzdGF0aWMgc3RydWN0IG5zcF9zeW5jX3RhYmxlIG5zcF9zeW5jX3RhYmxlXzQwTVtdID0geworCXsweDBjLCAweDBjLCAweDEsIDB9LAkvKiAyME1CCSAgNTBucyovCisJezB4MTksIDB4MTksIDB4MywgMX0sCS8qIDEwTUIJIDEwMG5zKi8gCisJezB4MWEsIDB4MjUsIDB4NSwgMn0sCS8qIDcuNU1CIDE1MG5zKi8gCisJezB4MjYsIDB4MzIsIDB4NywgM30sCS8qIDVNQgkgMjAwbnMqLworCXsgICAwLCAgICAwLCAgIDAsIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBuc3Bfc3luY190YWJsZSBuc3Bfc3luY190YWJsZV8yME1bXSA9IHsKKwl7MHgxOSwgMHgxOSwgMHgxLCAwfSwJLyogMTBNQgkgMTAwbnMqLyAKKwl7MHgxYSwgMHgyNSwgMHgyLCAwfSwJLyogNy41TUIgMTUwbnMqLyAKKwl7MHgyNiwgMHgzMiwgMHgzLCAxfSwJLyogNU1CCSAyMDBucyovCisJeyAgIDAsICAgIDAsICAgMCwgMH0sCit9OworCisvKgorICogc2V0dXAgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBtb2RlCisgKi8KK3N0YXRpYyBpbnQgbnNwX2FuYWx5emVfc2R0cihTY3NpX0NtbmQgKlNDcG50KQoreworCXVuc2lnbmVkIGNoYXIJICAgICAgIHRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworLy8JdW5zaWduZWQgY2hhcgkgICAgICAgbHVuICAgID0gU0NwbnQtPmRldmljZS0+bHVuOworCW5zcF9od19kYXRhICAgICAgICAgICAqZGF0YSAgID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3luY19kYXRhCSAgICAgICpzeW5jICAgPSAmKGRhdGEtPlN5bmNbdGFyZ2V0XSk7CisJc3RydWN0IG5zcF9zeW5jX3RhYmxlICpzeW5jX3RhYmxlOworCXVuc2lnbmVkIGludAkgICAgICAgcGVyaW9kLCBvZmZzZXQ7CisJaW50CQkgICAgICAgaTsKKworCisJbnNwX2RiZyhOU1BfREVCVUdfU1lOQywgImluIik7CisKKwlwZXJpb2QgPSBzeW5jLT5TeW5jUGVyaW9kOworCW9mZnNldCA9IHN5bmMtPlN5bmNPZmZzZXQ7CisKKwluc3BfZGJnKE5TUF9ERUJVR19TWU5DLCAicGVyaW9kPTB4JXgsIG9mZnNldD0weCV4IiwgcGVyaW9kLCBvZmZzZXQpOworCisJaWYgKChkYXRhLT5TY3NpQ2xvY2tEaXYgJiAoQklUKDApfEJJVCgxKSkpID09IENMT0NLXzIwTSkgeworCQlzeW5jX3RhYmxlID0gbnNwX3N5bmNfdGFibGVfMjBNOworCX0gZWxzZSB7CisJCXN5bmNfdGFibGUgPSBuc3Bfc3luY190YWJsZV80ME07CisJfQorCisJZm9yICggaSA9IDA7IHN5bmNfdGFibGUtPm1heF9wZXJpb2QgIT0gMDsgaSsrLCBzeW5jX3RhYmxlKyspIHsKKwkJaWYgKCBwZXJpb2QgPj0gc3luY190YWJsZS0+bWluX3BlcmlvZCAmJgorCQkgICAgIHBlcmlvZCA8PSBzeW5jX3RhYmxlLT5tYXhfcGVyaW9kCSApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHBlcmlvZCAhPSAwICYmIHN5bmNfdGFibGUtPm1heF9wZXJpb2QgPT0gMCkgeworCQkvKgorCQkgKiBObyBwcm9wZXIgcGVyaW9kL29mZnNldCBmb3VuZAorCQkgKi8KKwkJbnNwX2RiZyhOU1BfREVCVUdfU1lOQywgIm5vIHByb3BlciBwZXJpb2Qvb2Zmc2V0Iik7CisKKwkJc3luYy0+U3luY1BlcmlvZCAgICAgID0gMDsKKwkJc3luYy0+U3luY09mZnNldCAgICAgID0gMDsKKwkJc3luYy0+U3luY1JlZ2lzdGVyICAgID0gMDsKKwkJc3luYy0+QWNrV2lkdGgJICAgICAgPSAwOworCisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlzeW5jLT5TeW5jUmVnaXN0ZXIgICAgPSAoc3luY190YWJsZS0+Y2hpcF9wZXJpb2QgPDwgU1lOQ1JFR19QRVJJT0RfU0hJRlQpIHwKKwkJICAgICAgICAgICAgICAgIChvZmZzZXQgJiBTWU5DUkVHX09GRlNFVF9NQVNLKTsKKwlzeW5jLT5BY2tXaWR0aAkgICAgICA9IHN5bmNfdGFibGUtPmFja193aWR0aDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX1NZTkMsICJzeW5jX3JlZz0weCV4LCBhY2tfd2lkdGg9MHgleCIsIHN5bmMtPlN5bmNSZWdpc3Rlciwgc3luYy0+QWNrV2lkdGgpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIHN0YXJ0IG5pbmphIGhhcmR3YXJlIHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIG5zcF9zdGFydF90aW1lcihTY3NpX0NtbmQgKlNDcG50LCBpbnQgdGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImluIFNDcG50PTB4JXAsIHRpbWU9JWQiLCBTQ3BudCwgdGltZSk7CisJZGF0YS0+VGltZXJDb3VudCA9IHRpbWU7CisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRJTUVSQ09VTlQsIHRpbWUpOworfQorCisvKgorICogd2FpdCBmb3IgYnVzIHBoYXNlIGNoYW5nZQorICovCitzdGF0aWMgaW50IG5zcF9uZWdhdGVfc2lnbmFsKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGNoYXIgbWFzaywgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgY2hhciByZWc7CisJaW50CSAgICAgIHRpbWVfb3V0OworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiaW4iKTsKKworCXRpbWVfb3V0ID0gMTAwOworCisJZG8geworCQlyZWcgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTTU9OKTsKKwkJaWYgKHJlZyA9PSAweGZmKSB7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCh0aW1lX291dC0tICE9IDApICYmIChyZWcgJiBtYXNrKSAhPSAwKTsKKworCWlmICh0aW1lX291dCA9PSAwKSB7CisJCW5zcF9tc2coS0VSTl9ERUJVRywgIiAlcyBzaWduYWwgb2ZmIHRpbWV1dCIsIHN0cik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBleHBlY3QgTmluamEgSXJxCisgKi8KK3N0YXRpYyBpbnQgbnNwX2V4cGVjdF9zaWduYWwoU2NzaV9DbW5kCSAgICpTQ3BudCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAgY3VycmVudF9waGFzZSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UJID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwlpbnQJICAgICAgdGltZV9vdXQ7CisJdW5zaWduZWQgY2hhciBwaGFzZSwgaV9zcmM7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJjdXJyZW50X3BoYXNlPTB4JXgsIG1hc2s9MHgleCIsIGN1cnJlbnRfcGhhc2UsIG1hc2spOworCisJdGltZV9vdXQgPSAxMDA7CisJZG8geworCQlwaGFzZSA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lCVVNNT04pOworCQlpZiAocGhhc2UgPT0gMHhmZikgeworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAicmV0IC0xIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaV9zcmMgPSBuc3BfcmVhZChiYXNlLCBJUlFTVEFUVVMpOworCQlpZiAoaV9zcmMgJiBJUlFTVEFUVVNfU0NTSSkgeworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAicmV0IDAgZm91bmQgc2NzaSBzaWduYWwiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICgocGhhc2UgJiBtYXNrKSAhPSAwICYmIChwaGFzZSAmIEJVU01PTl9QSEFTRV9NQVNLKSA9PSBjdXJyZW50X3BoYXNlKSB7CisJCQkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJyZXQgMSBwaGFzZT0weCV4IiwgcGhhc2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IHdoaWxlKHRpbWVfb3V0LS0gIT0gMCk7CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJ0aW1lb3V0Iik7CisJcmV0dXJuIC0xOworfQorCisvKgorICogdHJhbnNmZXIgU0NTSSBtZXNzYWdlCisgKi8KK3N0YXRpYyBpbnQgbnNwX3hmZXIoU2NzaV9DbW5kICpTQ3BudCwgaW50IHBoYXNlKQoreworCXVuc2lnbmVkIGludCAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJbnNwX2h3X2RhdGEgICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJY2hhcgkgICAgICpidWYgID0gZGF0YS0+TXNnQnVmZmVyOworCWludAkgICAgICBsZW4gID0gbWluKE1TR0JVRl9TSVpFLCBkYXRhLT5Nc2dMZW4pOworCWludAkgICAgICBwdHI7CisJaW50CSAgICAgIHJldDsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImluIik7CisJZm9yIChwdHIgPSAwOyBsZW4gPiAwOyBsZW4tLSwgcHRyKyspIHsKKworCQlyZXQgPSBuc3BfZXhwZWN0X3NpZ25hbChTQ3BudCwgcGhhc2UsIEJVU01PTl9SRVEpOworCQlpZiAocmV0IDw9IDApIHsKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJ4ZmVyIHF1aXQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogaWYgbGFzdCBieXRlLCBuZWdhdGUgQVROICovCisJCWlmIChsZW4gPT0gMSAmJiBTQ3BudC0+U0NwLnBoYXNlID09IFBIX01TR19PVVQpIHsKKwkJCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgQVVUT0RJUkVDVElPTiB8IEFDS0VOQik7CisJCX0KKworCQkvKiByZWFkICYgd3JpdGUgbWVzc2FnZSAqLworCQlpZiAocGhhc2UgJiBCVVNNT05fSU8pIHsKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJyZWFkIG1zZyIpOworCQkJYnVmW3B0cl0gPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJREFUQVdJVEhBQ0spOworCQl9IGVsc2UgeworCQkJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgIndyaXRlIG1zZyIpOworCQkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lEQVRBV0lUSEFDSywgYnVmW3B0cl0pOworCQl9CisJCW5zcF9uZWdhdGVfc2lnbmFsKFNDcG50LCBCVVNNT05fQUNLLCAieGZlcjxhY2s+Iik7CisKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIGdldCBleHRyYSBTQ1NJIGRhdGEgZnJvbSBmaWZvCisgKi8KK3N0YXRpYyBpbnQgbnNwX2RhdGFwaGFzZV9ieXBhc3MoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGludCBjb3VudDsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImluIik7CisKKwlpZiAoU0NwbnQtPlNDcC5oYXZlX2RhdGFfaW4gIT0gSU9fSU4pIHsKKwkJcmV0dXJuIDA7CisJfQorCisJY291bnQgPSBuc3BfZmlmb19jb3VudChTQ3BudCk7CisJaWYgKGRhdGEtPkZpZm9Db3VudCA9PSBjb3VudCkgeworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJub3QgdXNlIGJ5cGFzcyBxdWlyayIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFhYWDogTlNQX1FVSVJLCisJICogZGF0YSBwaGFzZSBza2lwIG9ubHkgb2NjdXJlcyBpbiBjYXNlIG9mIFNDU0lfTE9XX1JFQUQKKwkgKi8KKwluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAidXNlIGJ5cGFzcyBxdWlyayIpOworCVNDcG50LT5TQ3AucGhhc2UgPSBQSF9EQVRBOworCW5zcF9waW9fcmVhZChTQ3BudCk7CisJbnNwX3NldHVwX2ZpZm8oZGF0YSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhY2NlcHQgcmVzZWxlY3Rpb24KKyAqLworc3RhdGljIGludCBuc3BfcmVzZWxlY3RlZChTY3NpX0NtbmQgKlNDcG50KQoreworCXVuc2lnbmVkIGludCAgYmFzZSAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgaW50ICBob3N0X2lkID0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZDsKKwkvL25zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgY2hhciBidXNfcmVnOworCXVuc2lnbmVkIGNoYXIgaWRfcmVnLCB0bXA7CisJaW50IHRhcmdldDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX1JFU0VMRUNUSU9OLCAiaW4iKTsKKworCWlkX3JlZyA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFJFU0VMRUNUSUQpOworCXRtcCAgICA9IGlkX3JlZyAmICh+QklUKGhvc3RfaWQpKTsKKwl0YXJnZXQgPSAwOworCXdoaWxlKHRtcCAhPSAwKSB7CisJCWlmICh0bXAgJiBCSVQoMCkpIHsKKwkJCWJyZWFrOworCQl9CisJCXRtcCA+Pj0gMTsKKwkJdGFyZ2V0Kys7CisJfQorCisJaWYgKFNDcG50LT5kZXZpY2UtPmlkICE9IHRhcmdldCkgeworCQluc3BfbXNnKEtFUk5fRVJSLCAiWFhYOiByZXNlbGVjdCBJRCBtdXN0IGJlICVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24uIiwgdGFyZ2V0KTsKKwl9CisKKwluc3BfbmVnYXRlX3NpZ25hbChTQ3BudCwgQlVTTU9OX1NFTCwgInJlc2VsZWN0PFNFTD4iKTsKKworCW5zcF9uZXh1cyhTQ3BudCk7CisJYnVzX3JlZyA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lCVVNDVFJMKSAmIH4oU0NTSV9CU1kgfCBTQ1NJX0FUTik7CisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFNDU0lCVVNDVFJMLCBidXNfcmVnKTsKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIGJ1c19yZWcgfCBBVVRPRElSRUNUSU9OIHwgQUNLRU5CKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICogY291bnQgaG93IG1hbnkgZGF0YSB0cmFuc2ZlcmQKKyAqLworc3RhdGljIGludCBuc3BfZmlmb19jb3VudChTY3NpX0NtbmQgKlNDcG50KQoreworCXVuc2lnbmVkIGludCBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IGwsIG0sIGgsIGR1bW15OworCisJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFBPSU5URVJDTFIsIFBPSU5URVJfQ0xFQVIgfCBBQ0tfQ09VTlRFUik7CisKKwlsICAgICA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFRSQU5TRkVSQ09VTlQpOworCW0gICAgID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgVFJBTlNGRVJDT1VOVCk7CisJaCAgICAgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBUUkFOU0ZFUkNPVU5UKTsKKwlkdW1teSA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFRSQU5TRkVSQ09VTlQpOyAvKiByZXF1aXJlZCB0aGlzISAqLworCisJY291bnQgPSAoaCA8PCAxNikgfCAobSA8PCA4KSB8IChsIDw8IDApOworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiY291bnQ9MHgleCIsIGNvdW50KTsKKworCXJldHVybiBjb3VudDsKK30KKworLyogZmlmbyBzaXplICovCisjZGVmaW5lIFJGSUZPX0NSSVQgNjQKKyNkZWZpbmUgV0ZJRk9fQ1JJVCA2NAorCisvKgorICogcmVhZCBkYXRhIGluIERBVEEgSU4gcGhhc2UKKyAqLworc3RhdGljIHZvaWQgbnNwX3Bpb19yZWFkKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJdW5zaWduZWQgaW50ICBiYXNlICAgICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+YmFzZTsKKwluc3BfaHdfZGF0YSAgKmRhdGEgICAgICA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWxvbmcJICAgICAgdGltZV9vdXQ7CisJaW50CSAgICAgIG9jb3VudCwgcmVzOworCXVuc2lnbmVkIGNoYXIgc3RhdCwgZmlmb19zdGF0OworCisJb2NvdW50ID0gZGF0YS0+Rmlmb0NvdW50OworCisJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImluIFNDcG50PTB4JXAgcmVzaWQ9JWQgb2NvdW50PSVkIHB0cj0weCVwIHRoaXNfcmVzaWR1YWw9JWQgYnVmZmVycz0weCVwIG5idWY9JWQiLAorCQlTQ3BudCwgU0NwbnQtPnJlc2lkLCBvY291bnQsIFNDcG50LT5TQ3AucHRyLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwsIFNDcG50LT5TQ3AuYnVmZmVyLCBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworCisJdGltZV9vdXQgPSAxMDAwOworCisJd2hpbGUgKCh0aW1lX291dC0tICE9IDApICYmCisJICAgICAgIChTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPiAwIHx8IFNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA+IDAgKSApIHsKKworCQlzdGF0ID0gbnNwX2luZGV4X3JlYWQoYmFzZSwgU0NTSUJVU01PTik7CisJCXN0YXQgJj0gQlVTTU9OX1BIQVNFX01BU0s7CisKKworCQlyZXMgPSBuc3BfZmlmb19jb3VudChTQ3BudCkgLSBvY291bnQ7CisJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInB0cj0weCVwIHRoaXM9MHgleCBvY291bnQ9MHgleCByZXM9MHgleCIsIFNDcG50LT5TQ3AucHRyLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwsIG9jb3VudCwgcmVzKTsKKwkJaWYgKHJlcyA9PSAwKSB7IC8qIGlmIHNvbWUgZGF0YSBhdmlsYWJsZSA/ICovCisJCQlpZiAoc3RhdCA9PSBCVVNQSEFTRV9EQVRBX0lOKSB7IC8qIHBoYXNlIGNoYW5nZWQ/ICovCisJCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiIHdhaXQgZm9yIGRhdGEgdGhpcz0lZCIsIFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJwaGFzZSBjaGFuZ2VkIHN0YXQ9MHgleCIsIHN0YXQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJZmlmb19zdGF0ID0gbnNwX3JlYWQoYmFzZSwgRklGT1NUQVRVUyk7CisJCWlmICgoZmlmb19zdGF0ICYgRklGT1NUQVRVU19GVUxMX0VNUFRZKSA9PSAwICYmCisJCSAgICBzdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCVVNQSEFTRV9EQVRBX0lOKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlcyA9IG1pbihyZXMsIFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCk7CisKKwkJc3dpdGNoIChkYXRhLT5UcmFuc2Zlck1vZGUpIHsKKwkJY2FzZSBNT0RFX0lPMzI6CisJCQlyZXMgJj0gfihCSVQoMSl8QklUKDApKTsgLyogYWxpZ24gNCAqLworCQkJbnNwX2ZpZm8zMl9yZWFkKGJhc2UsIFNDcG50LT5TQ3AucHRyLCByZXMgPj4gMik7CisJCQlicmVhazsKKwkJY2FzZSBNT0RFX0lPODoKKwkJCW5zcF9maWZvOF9yZWFkIChiYXNlLCBTQ3BudC0+U0NwLnB0ciwgcmVzICAgICApOworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX01FTTMyOgorCQkJcmVzICY9IH4oQklUKDEpfEJJVCgwKSk7IC8qIGFsaWduIDQgKi8KKwkJCW5zcF9tbWlvX2ZpZm8zMl9yZWFkKG1taW9fYmFzZSwgU0NwbnQtPlNDcC5wdHIsIHJlcyA+PiAyKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAidW5rbm93biByZWFkIG1vZGUiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVNDcG50LT5yZXNpZAkgICAgICAgCSAtPSByZXM7CisJCVNDcG50LT5TQ3AucHRyCQkgKz0gcmVzOworCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gcmVzOworCQlvY291bnQJCQkgKz0gcmVzOworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJwdHI9MHglcCB0aGlzX3Jlc2lkdWFsPTB4JXggb2NvdW50PTB4JXgiLCBTQ3BudC0+U0NwLnB0ciwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCBvY291bnQpOworCisJCS8qIGdvIHRvIG5leHQgc2NhdHRlciBsaXN0IGlmIGF2YWlsYWJsZSAqLworCQlpZiAoU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsCT09IDAgJiYKKwkJICAgIFNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCAhPSAwICkgeworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAic2NhdHRlcmxpc3QgbmV4dCB0aW1lb3V0PSVkIiwgdGltZV9vdXQpOworCQkJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLS07CisJCQlTQ3BudC0+U0NwLmJ1ZmZlcisrOworCQkJU0NwbnQtPlNDcC5wdHIJCSA9IEJVRkZFUl9BRERSOworCQkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID0gU0NwbnQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJCXRpbWVfb3V0ID0gMTAwMDsKKworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAicGFnZTogMHglcCwgb2ZmOiAweCV4IiwgU0NwbnQtPlNDcC5idWZmZXItPnBhZ2UsIFNDcG50LT5TQ3AuYnVmZmVyLT5vZmZzZXQpOworCQl9CisJfQorCisJZGF0YS0+Rmlmb0NvdW50ID0gb2NvdW50OworCisJaWYgKHRpbWVfb3V0ID09IDApIHsKKwkJbnNwX21zZyhLRVJOX0RFQlVHLCAicGlvIHJlYWQgdGltZW91dCByZXNpZD0lZCB0aGlzX3Jlc2lkdWFsPSVkIGJ1ZmZlcnNfcmVzaWR1YWw9JWQiLAorCQkJU0NwbnQtPnJlc2lkLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwsIFNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCk7CisJfQorCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJyZWFkIG9jb3VudD0weCV4Iiwgb2NvdW50KTsKKwluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiciBjbWQ9JWQgcmVzaWQ9MHgleFxuIiwgZGF0YS0+Q21kSWQsIFNDcG50LT5yZXNpZCk7Cit9CisKKy8qCisgKiB3cml0ZSBkYXRhIGluIERBVEEgT1VUIHBoYXNlCisgKi8KK3N0YXRpYyB2b2lkIG5zcF9waW9fd3JpdGUoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgICAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5iYXNlOworCW5zcF9od19kYXRhICAqZGF0YSAgICAgID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW50CSAgICAgIHRpbWVfb3V0OworCWludCAgICAgICAgICAgb2NvdW50LCByZXM7CisJdW5zaWduZWQgY2hhciBzdGF0OworCisJb2NvdW50CSA9IGRhdGEtPkZpZm9Db3VudDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJpbiBmaWZvY291bnQ9JWQgcHRyPTB4JXAgdGhpc19yZXNpZHVhbD0lZCBidWZmZXJzPTB4JXAgbmJ1Zj0lZCByZXNpZD0weCV4IiwKKwkJZGF0YS0+Rmlmb0NvdW50LCBTQ3BudC0+U0NwLnB0ciwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLCBTQ3BudC0+U0NwLmJ1ZmZlciwgU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLCBTQ3BudC0+cmVzaWQpOworCisJdGltZV9vdXQgPSAxMDAwOworCisJd2hpbGUgKCh0aW1lX291dC0tICE9IDApICYmCisJICAgICAgIChTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgPiAwIHx8IFNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA+IDApKSB7CisJCXN0YXQgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTTU9OKTsKKwkJc3RhdCAmPSBCVVNNT05fUEhBU0VfTUFTSzsKKworCQlpZiAoc3RhdCAhPSBCVVNQSEFTRV9EQVRBX09VVCkgeworCQkJcmVzID0gb2NvdW50IC0gbnNwX2ZpZm9fY291bnQoU0NwbnQpOworCisJCQluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAicGhhc2UgY2hhbmdlZCBzdGF0PTB4JXgsIHJlcz0lZFxuIiwgc3RhdCwgcmVzKTsKKwkJCS8qIFB1dCBiYWNrIHBvaW50ZXIgKi8KKwkJCVNDcG50LT5yZXNpZAkgICAgICAgCSArPSByZXM7CisJCQlTQ3BudC0+U0NwLnB0cgkJIC09IHJlczsKKwkJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCArPSByZXM7CisJCQlvY291bnQJCQkgLT0gcmVzOworCisJCQlicmVhazsKKwkJfQorCisJCXJlcyA9IG9jb3VudCAtIG5zcF9maWZvX2NvdW50KFNDcG50KTsKKwkJaWYgKHJlcyA+IDApIHsgLyogd3JpdGUgYWxsIGRhdGE/ICovCisJCQluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAid2FpdCBmb3IgYWxsIGRhdGEgb3V0LiBvY291bnQ9MHgleCByZXM9JWQiLCBvY291bnQsIHJlcyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlcyA9IG1pbihTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwsIFdGSUZPX0NSSVQpOworCisJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInB0cj0weCVwIHRoaXM9MHgleCByZXM9MHgleCIsIFNDcG50LT5TQ3AucHRyLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwsIHJlcyk7CisJCXN3aXRjaCAoZGF0YS0+VHJhbnNmZXJNb2RlKSB7CisJCWNhc2UgTU9ERV9JTzMyOgorCQkJcmVzICY9IH4oQklUKDEpfEJJVCgwKSk7IC8qIGFsaWduIDQgKi8KKwkJCW5zcF9maWZvMzJfd3JpdGUoYmFzZSwgU0NwbnQtPlNDcC5wdHIsIHJlcyA+PiAyKTsKKwkJCWJyZWFrOworCQljYXNlIE1PREVfSU84OgorCQkJbnNwX2ZpZm84X3dyaXRlIChiYXNlLCBTQ3BudC0+U0NwLnB0ciwgcmVzICAgICApOworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX01FTTMyOgorCQkJcmVzICY9IH4oQklUKDEpfEJJVCgwKSk7IC8qIGFsaWduIDQgKi8KKwkJCW5zcF9tbWlvX2ZpZm8zMl93cml0ZShtbWlvX2Jhc2UsIFNDcG50LT5TQ3AucHRyLCByZXMgPj4gMik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInVua25vd24gd3JpdGUgbW9kZSIpOworCQkJYnJlYWs7CisJCX0KKworCQlTQ3BudC0+cmVzaWQJICAgICAgIAkgLT0gcmVzOworCQlTQ3BudC0+U0NwLnB0cgkJICs9IHJlczsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IHJlczsKKwkJb2NvdW50CQkJICs9IHJlczsKKworCQkvKiBnbyB0byBuZXh0IHNjYXR0ZXIgbGlzdCBpZiBhdmFpbGFibGUgKi8KKwkJaWYgKFNDcG50LT5TQ3AudGhpc19yZXNpZHVhbAk9PSAwICYmCisJCSAgICBTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgIT0gMCApIHsKKwkJCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgInNjYXR0ZXJsaXN0IG5leHQiKTsKKwkJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbC0tOworCQkJU0NwbnQtPlNDcC5idWZmZXIrKzsKKwkJCVNDcG50LT5TQ3AucHRyCQkgPSBCVUZGRVJfQUREUjsKKwkJCVNDcG50LT5TQ3AudGhpc19yZXNpZHVhbCA9IFNDcG50LT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQl0aW1lX291dCA9IDEwMDA7CisJCX0KKwl9CisKKwlkYXRhLT5GaWZvQ291bnQgPSBvY291bnQ7CisKKwlpZiAodGltZV9vdXQgPT0gMCkgeworCQluc3BfbXNnKEtFUk5fREVCVUcsICJwaW8gd3JpdGUgdGltZW91dCByZXNpZD0weCV4IiwgU0NwbnQtPnJlc2lkKTsKKwl9CisJbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgIndyaXRlIG9jb3VudD0weCV4Iiwgb2NvdW50KTsKKwluc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAidyBjbWQ9JWQgcmVzaWQ9MHgleFxuIiwgZGF0YS0+Q21kSWQsIFNDcG50LT5yZXNpZCk7Cit9CisjdW5kZWYgUkZJRk9fQ1JJVAorI3VuZGVmIFdGSUZPX0NSSVQKKworLyoKKyAqIHNldHVwIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVyIG1vZGUKKyAqLworc3RhdGljIGludCBuc3BfbmV4dXMoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBpbnQgICBiYXNlICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXVuc2lnbmVkIGNoYXIgIHRhcmdldCA9IFNDcG50LT5kZXZpY2UtPmlkOworLy8JdW5zaWduZWQgY2hhciAgbHVuICAgID0gU0NwbnQtPmRldmljZS0+bHVuOworCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJc3luY19kYXRhICAgICAqc3luYyAgID0gJihkYXRhLT5TeW5jW3RhcmdldF0pOworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiaW4gU0NwbnQ9MHglcCIsIFNDcG50KTsKKworCS8qIHNldHVwIHN5bmNoIHRyYW5zZmVyIHJlZ2lzdGVycyAqLworCW5zcF9pbmRleF93cml0ZShiYXNlLCBTWU5DUkVHLAlzeW5jLT5TeW5jUmVnaXN0ZXIpOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBBQ0tXSURUSCwgc3luYy0+QWNrV2lkdGgpOworCisJaWYgKFNDcG50LT51c2Vfc2cgICAgPT0gMCAgICAgICAgfHwKKwkgICAgU0NwbnQtPnJlc2lkICUgNCAhPSAwICAgICAgICB8fAorCSAgICBTQ3BudC0+cmVzaWQgICAgIDw9IFBBR0VfU0laRSApIHsKKwkJZGF0YS0+VHJhbnNmZXJNb2RlID0gTU9ERV9JTzg7CisJfSBlbHNlIGlmIChuc3BfYnVyc3RfbW9kZSA9PSBCVVJTVF9NRU0zMikgeworCQlkYXRhLT5UcmFuc2Zlck1vZGUgPSBNT0RFX01FTTMyOworCX0gZWxzZSBpZiAobnNwX2J1cnN0X21vZGUgPT0gQlVSU1RfSU8zMikgeworCQlkYXRhLT5UcmFuc2Zlck1vZGUgPSBNT0RFX0lPMzI7CisJfSBlbHNlIHsKKwkJZGF0YS0+VHJhbnNmZXJNb2RlID0gTU9ERV9JTzg7CisJfQorCisJLyogc2V0dXAgcGRtYSBmaWZvICovCisJbnNwX3NldHVwX2ZpZm8oZGF0YSwgVFJVRSk7CisKKwkvKiBjbGVhciBhY2sgY291bnRlciAqLworIAlkYXRhLT5GaWZvQ291bnQgPSAwOworCW5zcF9pbmRleF93cml0ZShiYXNlLCBQT0lOVEVSQ0xSLCBQT0lOVEVSX0NMRUFSCSAgICB8CisJCQkJCSAgQUNLX0NPVU5URVJfQ0xFQVIgfAorCQkJCQkgIFJFUV9DT1VOVEVSX0NMRUFSIHwKKwkJCQkJICBIT1NUX0NPVU5URVJfQ0xFQVIpOworCisJcmV0dXJuIDA7Cit9CisKKyNpbmNsdWRlICJuc3BfbWVzc2FnZS5jIgorLyoKKyAqIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuc3BpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50ICAgYmFzZTsKKwl1bnNpZ25lZCBjaGFyICBpcnFfc3RhdHVzLCBpcnFfcGhhc2UsIHBoYXNlOworCVNjc2lfQ21uZCAgICAgKnRtcFNDOworCXVuc2lnbmVkIGNoYXIgIHRhcmdldCwgbHVuOworCXVuc2lnbmVkIGludCAgKnN5bmNfbmVnOworCWludCAgICAgICAgICAgIGksIHRtcDsKKwluc3BfaHdfZGF0YSAgICpkYXRhOworCisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJkZXZfaWQ9MHglcCIsIGRldl9pZCk7CisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiaG9zdD0weCVwIiwgKChzY3NpX2luZm9fdCAqKWRldl9pZCktPmhvc3QpOworCisJaWYgKCAgICAgICAgICAgICAgICBkZXZfaWQgICAgICAgICE9IE5VTEwgJiYKKwkgICAgKChzY3NpX2luZm9fdCAqKWRldl9pZCktPmhvc3QgIT0gTlVMTCAgKSB7CisJCXNjc2lfaW5mb190ICppbmZvID0gKHNjc2lfaW5mb190ICopZGV2X2lkOworCisJCWRhdGEgPSAobnNwX2h3X2RhdGEgKilpbmZvLT5ob3N0LT5ob3N0ZGF0YTsKKwl9IGVsc2UgeworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiaG9zdCBkYXRhIHdyb25nIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICImbnNwX2RhdGFfYmFzZT0weCVwLCBkZXZfaWQ9MHglcCIsICZuc3BfZGF0YV9iYXNlLCBkZXZfaWQpOworCisJYmFzZSA9IGRhdGEtPkJhc2VBZGRyZXNzOworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgImJhc2U9MHgleCIsIGJhc2UpOworCisJLyoKKwkgKiBpbnRlcnJ1cHQgY2hlY2sKKwkgKi8KKwluc3Bfd3JpdGUoYmFzZSwgSVJRQ09OVFJPTCwgSVJRQ09OVFJPTF9JUlFESVNBQkxFKTsKKwlpcnFfc3RhdHVzID0gbnNwX3JlYWQoYmFzZSwgSVJRU1RBVFVTKTsKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJpcnFfc3RhdHVzPTB4JXgiLCBpcnFfc3RhdHVzKTsKKwlpZiAoKGlycV9zdGF0dXMgPT0gMHhmZikgfHwgKChpcnFfc3RhdHVzICYgSVJRU1RBVFVTX01BU0spID09IDApKSB7CisJCW5zcF93cml0ZShiYXNlLCBJUlFDT05UUk9MLCAwKTsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAibm8gaXJxL3NoYXJlZCBpcnEiKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIFhYWDogSU1QT1JUQU5UCisJICogRG8gbm90IHJlYWQgYW4gaXJxX3BoYXNlIHJlZ2lzdGVyIGlmIG5vIHNjc2kgcGhhc2UgaW50ZXJydXB0LgorCSAqIFVubGVzcywgeW91IHNob3VsZCBsb3NlIGEgc2NzaSBwaGFzZSBpbnRlcnJ1cHQuCisJICovCisJcGhhc2UgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTTU9OKTsKKwlpZigoaXJxX3N0YXR1cyAmIElSUVNUQVRVU19TQ1NJKSAhPSAwKSB7CisJCWlycV9waGFzZSA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIElSUVBIQVNFU0VOQ0UpOworCX0gZWxzZSB7CisJCWlycV9waGFzZSA9IDA7CisJfQorCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiaXJxX3BoYXNlPTB4JXgiLCBpcnFfcGhhc2UpOworCisJLyoKKwkgKiB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciAoc2NzaSB2cyB0aW1lciBpbnRlcnJ1cHRzKQorCSAqLworCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInRpbWVyY291bnQ9JWQiLCBkYXRhLT5UaW1lckNvdW50KTsKKwlpZiAoZGF0YS0+VGltZXJDb3VudCAhPSAwKSB7CisJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInN0b3AgdGltZXIiKTsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIFRJTUVSQ09VTlQsIDApOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgVElNRVJDT1VOVCwgMCk7CisJCWRhdGEtPlRpbWVyQ291bnQgPSAwOworCX0KKworCWlmICgoaXJxX3N0YXR1cyAmIElSUVNUQVRVU19NQVNLKSA9PSBJUlFTVEFUVVNfVElNRVIgJiYKKwkgICAgZGF0YS0+U2VsZWN0aW9uVGltZU91dCA9PSAwKSB7CisJCS8vbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInRpbWVyIHN0YXJ0Iik7CisJCW5zcF93cml0ZShiYXNlLCBJUlFDT05UUk9MLCBJUlFDT05UUk9MX1RJTUVSX0NMRUFSKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCW5zcF93cml0ZShiYXNlLCBJUlFDT05UUk9MLCBJUlFDT05UUk9MX1RJTUVSX0NMRUFSIHwgSVJRQ09OVFJPTF9GSUZPX0NMRUFSKTsKKworCWlmICgoaXJxX3N0YXR1cyAmIElSUVNUQVRVU19TQ1NJKSAmJgorCSAgICAoaXJxX3BoYXNlICAmIFNDU0lfUkVTRVRfSVJRKSkgeworCQluc3BfbXNnKEtFUk5fRVJSLCAiYnVzIHJlc2V0IChwb3dlciBvZmY/KSIpOworCisJCW5zcGh3X2luaXQoZGF0YSk7CisJCW5zcF9idXNfcmVzZXQoZGF0YSk7CisKKwkJaWYoZGF0YS0+Q3VycmVudFNDICE9IE5VTEwpIHsKKwkJCXRtcFNDID0gZGF0YS0+Q3VycmVudFNDOworCQkJdG1wU0MtPnJlc3VsdCAgPSAoRElEX1JFU0VUICAgICAgICAgICAgICAgICAgIDw8IDE2KSB8CisJCQkJICAgICAgICAgKCh0bXBTQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCAgOCkgfAorCQkJCSAgICAgICAgICgodG1wU0MtPlNDcC5TdGF0dXMgICYgMHhmZikgPDwgIDApOworCQkJbnNwX3Njc2lfZG9uZSh0bXBTQyk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChkYXRhLT5DdXJyZW50U0MgPT0gTlVMTCkgeworCQluc3BfbXNnKEtFUk5fRVJSLCAiQ3VycmVudFNDPT1OVUxMIGlycV9zdGF0dXM9MHgleCBwaGFzZT0weCV4IGlycV9waGFzZT0weCV4IHRoaXMgY2FuJ3QgYmUgaGFwcGVuLiByZXNldCBldmVyeXRoaW5nIiwgaXJxX3N0YXR1cywgcGhhc2UsIGlycV9waGFzZSk7CisJCW5zcGh3X2luaXQoZGF0YSk7CisJCW5zcF9idXNfcmVzZXQoZGF0YSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwl0bXBTQyAgICA9IGRhdGEtPkN1cnJlbnRTQzsKKwl0YXJnZXQgICA9IHRtcFNDLT5kZXZpY2UtPmlkOworCWx1biAgICAgID0gdG1wU0MtPmRldmljZS0+bHVuOworCXN5bmNfbmVnID0gJihkYXRhLT5TeW5jW3RhcmdldF0uU3luY05lZ290aWF0aW9uKTsKKworCS8qCisJICogcGFyc2UgaGFyZHdhcmUgU0NTSSBpcnEgcmVhc29ucyByZWdpc3RlcgorCSAqLworCWlmIChpcnFfc3RhdHVzICYgSVJRU1RBVFVTX1NDU0kpIHsKKwkJaWYgKGlycV9waGFzZSAmIFJFU0VMRUNUX0lSUSkgeworCQkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInJlc2VsZWN0Iik7CisJCQluc3Bfd3JpdGUoYmFzZSwgSVJRQ09OVFJPTCwgSVJRQ09OVFJPTF9SRVNFTEVDVF9DTEVBUik7CisJCQlpZiAobnNwX3Jlc2VsZWN0ZWQodG1wU0MpICE9IEZBTFNFKSB7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9CisKKwkJaWYgKChpcnFfcGhhc2UgJiAoUEhBU0VfQ0hBTkdFX0lSUSB8IExBVENIRURfQlVTX0ZSRUUpKSA9PSAwKSB7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisKKwkvL3Nob3dfcGhhc2UodG1wU0MpOworCisJc3dpdGNoKHRtcFNDLT5TQ3AucGhhc2UpIHsKKwljYXNlIFBIX1NFTFNUQVJUOgorCQkvLyAqc3luY19uZWcgPSBTWU5DX05PVF9ZRVQ7CisJCWlmICgocGhhc2UgJiBCVVNNT05fQlNZKSA9PSAwKSB7CisJCQkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJzZWxlY3Rpb24gY291bnQ9JWQiLCBkYXRhLT5TZWxlY3Rpb25UaW1lT3V0KTsKKwkJCWlmIChkYXRhLT5TZWxlY3Rpb25UaW1lT3V0ID49IE5TUF9TRUxUSU1FT1VUKSB7CisJCQkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgInNlbGVjdGlvbiB0aW1lIG91dCIpOworCQkJCWRhdGEtPlNlbGVjdGlvblRpbWVPdXQgPSAwOworCQkJCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgMCk7CisKKwkJCQl0bXBTQy0+cmVzdWx0ICAgPSBESURfVElNRV9PVVQgPDwgMTY7CisJCQkJbnNwX3Njc2lfZG9uZSh0bXBTQyk7CisKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCQlkYXRhLT5TZWxlY3Rpb25UaW1lT3V0ICs9IDE7CisJCQluc3Bfc3RhcnRfdGltZXIodG1wU0MsIDEwMDAvNTEpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJLyogYXR0ZW50aW9uIGFzc2VydCAqLworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJhdHRlbnRpb24gYXNzZXJ0Iik7CisJCWRhdGEtPlNlbGVjdGlvblRpbWVPdXQgPSAwOworCQl0bXBTQy0+U0NwLnBoYXNlICAgICAgID0gUEhfU0VMRUNURUQ7CisJCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgU0NTSV9BVE4pOworCQl1ZGVsYXkoMSk7CisJCW5zcF9pbmRleF93cml0ZShiYXNlLCBTQ1NJQlVTQ1RSTCwgU0NTSV9BVE4gfCBBVVRPRElSRUNUSU9OIHwgQUNLRU5CKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJCWJyZWFrOworCisJY2FzZSBQSF9SRVNFTEVDVDoKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAicGhhc2UgcmVzZWxlY3QiKTsKKwkJLy8gKnN5bmNfbmVnID0gU1lOQ19OT1RfWUVUOworCQlpZiAoKHBoYXNlICYgQlVTTU9OX1BIQVNFX01BU0spICE9IEJVU1BIQVNFX01FU1NBR0VfSU4pIHsKKworCQkJdG1wU0MtPnJlc3VsdAk9IERJRF9BQk9SVCA8PCAxNjsKKwkJCW5zcF9zY3NpX2RvbmUodG1wU0MpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCS8qIGZhbGwgdGhydSAqLworCWRlZmF1bHQ6CisJCWlmICgoaXJxX3N0YXR1cyAmIChJUlFTVEFUVVNfU0NTSSB8IElSUVNUQVRVU19GSUZPKSkgPT0gMCkgeworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCWJyZWFrOworCX0KKworCS8qCisJICogU0NTSSBzZXF1ZW5jZXIKKwkgKi8KKwkvL25zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJzdGFydCBzY3NpIHNlcSIpOworCisJLyogbm9ybWFsIGRpc2Nvbm5lY3QgKi8KKwlpZiAoKCh0bXBTQy0+U0NwLnBoYXNlID09IFBIX01TR19JTikgfHwgKHRtcFNDLT5TQ3AucGhhc2UgPT0gUEhfTVNHX09VVCkpICYmCisJICAgIChpcnFfcGhhc2UgJiBMQVRDSEVEX0JVU19GUkVFKSAhPSAwICkgeworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAibm9ybWFsIGRpc2Nvbm5lY3QgaXJxX3N0YXR1cz0weCV4LCBwaGFzZT0weCV4LCBpcnFfcGhhc2U9MHgleCIsIGlycV9zdGF0dXMsIHBoYXNlLCBpcnFfcGhhc2UpOworCisJCS8vKnN5bmNfbmVnICAgICAgID0gU1lOQ19OT1RfWUVUOworCisJCWlmICgodG1wU0MtPlNDcC5NZXNzYWdlID09IE1TR19DT01NQU5EX0NPTVBMRVRFKSkgeyAgICAgLyogYWxsIGNvbW1hbmQgY29tcGxldGUgYW5kIHJldHVybiBzdGF0dXMgKi8KKwkJCXRtcFNDLT5yZXN1bHQgPSAoRElEX09LCQkgICAgICAgICAgICAgPDwgMTYpIHwKKwkJCQkJKCh0bXBTQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCAgOCkgfAorCQkJCQkoKHRtcFNDLT5TQ3AuU3RhdHVzICAmIDB4ZmYpIDw8ICAwKTsKKwkJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJjb21tYW5kIGNvbXBsZXRlIHJlc3VsdD0weCV4IiwgdG1wU0MtPnJlc3VsdCk7CisJCQluc3Bfc2NzaV9kb25lKHRtcFNDKTsKKworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCisJLyogY2hlY2sgdW5leHBlY3RlZCBidXMgZnJlZSBzdGF0ZSAqLworCWlmIChwaGFzZSA9PSAwKSB7CisJCW5zcF9tc2coS0VSTl9ERUJVRywgInVuZXhwZWN0ZWQgYnVzIGZyZWUuIGlycV9zdGF0dXM9MHgleCwgcGhhc2U9MHgleCwgaXJxX3BoYXNlPTB4JXgiLCBpcnFfc3RhdHVzLCBwaGFzZSwgaXJxX3BoYXNlKTsKKworCQkqc3luY19uZWcgICAgICAgPSBTWU5DX05HOworCQl0bXBTQy0+cmVzdWx0ICAgPSBESURfRVJST1IgPDwgMTY7CisJCW5zcF9zY3NpX2RvbmUodG1wU0MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3dpdGNoIChwaGFzZSAmIEJVU01PTl9QSEFTRV9NQVNLKSB7CisJY2FzZSBCVVNQSEFTRV9DT01NQU5EOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiQlVTUEhBU0VfQ09NTUFORCIpOworCQlpZiAoKHBoYXNlICYgQlVTTU9OX1JFUSkgPT0gMCkgeworCQkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIlJFUSA9PSAwIik7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKworCQl0bXBTQy0+U0NwLnBoYXNlID0gUEhfQ09NTUFORDsKKworCQluc3BfbmV4dXModG1wU0MpOworCisJCS8qIHdyaXRlIHNjc2kgY29tbWFuZCAqLworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiY21kX2xlbj0lZCIsIHRtcFNDLT5jbWRfbGVuKTsKKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIENPTU1BTkRDVFJMLCBDTEVBUl9DT01NQU5EX1BPSU5URVIpOworCQlmb3IgKGkgPSAwOyBpIDwgdG1wU0MtPmNtZF9sZW47IGkrKykgeworCQkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIENPTU1BTkREQVRBLCB0bXBTQy0+Y21uZFtpXSk7CisJCX0KKwkJbnNwX2luZGV4X3dyaXRlKGJhc2UsIENPTU1BTkRDVFJMLCBDTEVBUl9DT01NQU5EX1BPSU5URVIgfCBBVVRPX0NPTU1BTkRfR08pOworCQlicmVhazsKKworCWNhc2UgQlVTUEhBU0VfREFUQV9PVVQ6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJCVVNQSEFTRV9EQVRBX09VVCIpOworCisJCXRtcFNDLT5TQ3AucGhhc2UgICAgICAgID0gUEhfREFUQTsKKwkJdG1wU0MtPlNDcC5oYXZlX2RhdGFfaW4gPSBJT19PVVQ7CisKKwkJbnNwX3Bpb193cml0ZSh0bXBTQyk7CisKKwkJYnJlYWs7CisKKwljYXNlIEJVU1BIQVNFX0RBVEFfSU46CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJCVVNQSEFTRV9EQVRBX0lOIik7CisKKwkJdG1wU0MtPlNDcC5waGFzZSAgICAgICAgPSBQSF9EQVRBOworCQl0bXBTQy0+U0NwLmhhdmVfZGF0YV9pbiA9IElPX0lOOworCisJCW5zcF9waW9fcmVhZCh0bXBTQyk7CisKKwkJYnJlYWs7CisKKwljYXNlIEJVU1BIQVNFX1NUQVRVUzoKKwkJbnNwX2RhdGFwaGFzZV9ieXBhc3ModG1wU0MpOworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiQlVTUEhBU0VfU1RBVFVTIik7CisKKwkJdG1wU0MtPlNDcC5waGFzZSA9IFBIX1NUQVRVUzsKKworCQl0bXBTQy0+U0NwLlN0YXR1cyA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lEQVRBV0lUSEFDSyk7CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJtZXNzYWdlPTB4JXggc3RhdHVzPTB4JXgiLCB0bXBTQy0+U0NwLk1lc3NhZ2UsIHRtcFNDLT5TQ3AuU3RhdHVzKTsKKworCQlicmVhazsKKworCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9PVVQ6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOVFIsICJCVVNQSEFTRV9NRVNTQUdFX09VVCIpOworCQlpZiAoKHBoYXNlICYgQlVTTU9OX1JFUSkgPT0gMCkgeworCQkJZ290byB0aW1lcl9vdXQ7CisJCX0KKworCQl0bXBTQy0+U0NwLnBoYXNlID0gUEhfTVNHX09VVDsKKworCQkvLypzeW5jX25lZyA9IFNZTkNfTk9UX1lFVDsKKworCQlkYXRhLT5Nc2dMZW4gPSBpID0gMDsKKwkJZGF0YS0+TXNnQnVmZmVyW2ldID0gSURFTlRJRlkoVFJVRSwgbHVuKTsgaSsrOworCisJCWlmICgqc3luY19uZWcgPT0gU1lOQ19OT1RfWUVUKSB7CisJCQlkYXRhLT5TeW5jW3RhcmdldF0uU3luY1BlcmlvZCA9IDA7CisJCQlkYXRhLT5TeW5jW3RhcmdldF0uU3luY09mZnNldCA9IDA7CisKKwkJCS8qKi8KKwkJCWRhdGEtPk1zZ0J1ZmZlcltpXSA9IE1TR19FWFRFTkRFRDsgaSsrOworCQkJZGF0YS0+TXNnQnVmZmVyW2ldID0gMzsgICAgICAgICAgICBpKys7CisJCQlkYXRhLT5Nc2dCdWZmZXJbaV0gPSBNU0dfRVhUX1NEVFI7IGkrKzsKKwkJCWRhdGEtPk1zZ0J1ZmZlcltpXSA9IDB4MGM7ICAgICAgICAgaSsrOworCQkJZGF0YS0+TXNnQnVmZmVyW2ldID0gMTU7ICAgICAgICAgICBpKys7CisJCQkvKiovCisJCX0KKwkJZGF0YS0+TXNnTGVuID0gaTsKKworCQluc3BfYW5hbHl6ZV9zZHRyKHRtcFNDKTsKKwkJc2hvd19tZXNzYWdlKGRhdGEpOworCQluc3BfbWVzc2FnZV9vdXQodG1wU0MpOworCQlicmVhazsKKworCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9JTjoKKwkJbnNwX2RhdGFwaGFzZV9ieXBhc3ModG1wU0MpOworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAiQlVTUEhBU0VfTUVTU0FHRV9JTiIpOworCQlpZiAoKHBoYXNlICYgQlVTTU9OX1JFUSkgPT0gMCkgeworCQkJZ290byB0aW1lcl9vdXQ7CisJCX0KKworCQl0bXBTQy0+U0NwLnBoYXNlID0gUEhfTVNHX0lOOworCQluc3BfbWVzc2FnZV9pbih0bXBTQyk7CisKKwkJLyoqLworCQlpZiAoKnN5bmNfbmVnID09IFNZTkNfTk9UX1lFVCkgeworCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAic3luYyB0YXJnZXQ9JWQsbHVuPSVkIix0YXJnZXQsbHVuKTsKKworCQkJaWYgKGRhdGEtPk1zZ0xlbiAgICAgICA+PSA1ICAgICAgICAgICAgJiYKKwkJCSAgICBkYXRhLT5Nc2dCdWZmZXJbMF0gPT0gTVNHX0VYVEVOREVEICYmCisJCQkgICAgZGF0YS0+TXNnQnVmZmVyWzFdID09IDMgICAgICAgICAgICAmJgorCQkJICAgIGRhdGEtPk1zZ0J1ZmZlclsyXSA9PSBNU0dfRVhUX1NEVFIgKSB7CisJCQkJZGF0YS0+U3luY1t0YXJnZXRdLlN5bmNQZXJpb2QgPSBkYXRhLT5Nc2dCdWZmZXJbM107CisJCQkJZGF0YS0+U3luY1t0YXJnZXRdLlN5bmNPZmZzZXQgPSBkYXRhLT5Nc2dCdWZmZXJbNF07CisJCQkJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAic3luYyBvaywgJWQgJWQiLCBkYXRhLT5Nc2dCdWZmZXJbM10sIGRhdGEtPk1zZ0J1ZmZlcls0XSk7CisJCQkJKnN5bmNfbmVnID0gU1lOQ19PSzsKKwkJCX0gZWxzZSB7CisJCQkJZGF0YS0+U3luY1t0YXJnZXRdLlN5bmNQZXJpb2QgPSAwOworCQkJCWRhdGEtPlN5bmNbdGFyZ2V0XS5TeW5jT2Zmc2V0ID0gMDsKKwkJCQkqc3luY19uZWcgPSBTWU5DX05HOworCQkJfQorCQkJbnNwX2FuYWx5emVfc2R0cih0bXBTQyk7CisJCX0KKwkJLyoqLworCisJCS8qIHNlYXJjaCBsYXN0IG1lc3NlYWdlIGJ5dGUgKi8KKwkJdG1wID0gLTE7CisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5Nc2dMZW47IGkrKykgeworCQkJdG1wID0gZGF0YS0+TXNnQnVmZmVyW2ldOworCQkJaWYgKGRhdGEtPk1zZ0J1ZmZlcltpXSA9PSBNU0dfRVhURU5ERUQpIHsKKwkJCQlpICs9ICgxICsgZGF0YS0+TXNnQnVmZmVyW2krMV0pOworCQkJfQorCQl9CisJCXRtcFNDLT5TQ3AuTWVzc2FnZSA9IHRtcDsKKworCQluc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAibWVzc2FnZT0weCV4IGxlbj0lZCIsIHRtcFNDLT5TQ3AuTWVzc2FnZSwgZGF0YS0+TXNnTGVuKTsKKwkJc2hvd19tZXNzYWdlKGRhdGEpOworCisJCWJyZWFrOworCisJY2FzZSBCVVNQSEFTRV9TRUxFQ1Q6CisJZGVmYXVsdDoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5UUiwgIkJVU1BIQVNFIG90aGVyIik7CisKKwkJYnJlYWs7CisJfQorCisJLy9uc3BfZGJnKE5TUF9ERUJVR19JTlRSLCAib3V0Iik7CisJcmV0dXJuIElSUV9IQU5ETEVEOyAJCisKK3RpbWVyX291dDoKKwluc3Bfc3RhcnRfdGltZXIodG1wU0MsIDEwMDAvMTAyKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBOU1BfREVCVUcKKyNpbmNsdWRlICJuc3BfZGVidWcuYyIKKyNlbmRpZgkvKiBOU1BfREVCVUcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGxvb2sgZm9yIG5pbmphMyBjYXJkIGFuZCBpbml0IGlmIGZvdW5kCQkJICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpuc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqc2h0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CS8qIHJlZ2lzdGVyZWQgaG9zdCBzdHJ1Y3R1cmUgKi8KKwluc3BfaHdfZGF0YSAqZGF0YV9iID0gJm5zcF9kYXRhX2Jhc2UsICpkYXRhOworCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgInRoaXNfaWQ9JWQiLCBzaHQtPnRoaXNfaWQpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJm5zcF9kcml2ZXJfdGVtcGxhdGUsIHNpemVvZihuc3BfaHdfZGF0YSkpOworI2Vsc2UKKwlob3N0ID0gc2NzaV9yZWdpc3RlcihzaHQsIHNpemVvZihuc3BfaHdfZGF0YSkpOworI2VuZGlmCisJaWYgKGhvc3QgPT0gTlVMTCkgeworCQluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaG9zdCBmYWlsZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtY3B5KGhvc3QtPmhvc3RkYXRhLCBkYXRhX2IsIHNpemVvZihuc3BfaHdfZGF0YSkpOworCWRhdGEgPSAobnNwX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YTsKKwlkYXRhLT5TY3NpSW5mby0+aG9zdCA9IGhvc3Q7CisjaWZkZWYgTlNQX0RFQlVHCisJZGF0YS0+Q21kSWQgPSAwOworI2VuZGlmCisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaXJxPSVkLCVkIiwgZGF0YV9iLT5JcnFOdW1iZXIsICgobnNwX2h3X2RhdGEgKilob3N0LT5ob3N0ZGF0YSktPklycU51bWJlcik7CisKKwlob3N0LT51bmlxdWVfaWQJICA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWhvc3QtPmlvX3BvcnQJICA9IGRhdGEtPkJhc2VBZGRyZXNzOworCWhvc3QtPm5faW9fcG9ydAkgID0gZGF0YS0+TnVtQWRkcmVzczsKKwlob3N0LT5pcnEJICA9IGRhdGEtPklycU51bWJlcjsKKwlob3N0LT5iYXNlICAgICAgICA9IGRhdGEtPk1taW9BZGRyZXNzOworCisJc3Bpbl9sb2NrX2luaXQoJihkYXRhLT5Mb2NrKSk7CisKKwlzbnByaW50ZihkYXRhLT5uc3BpbmZvLAorCQkgc2l6ZW9mKGRhdGEtPm5zcGluZm8pLAorCQkgIk5pbmphU0NTSS0zLzMyQmkgRHJpdmVyICRSZXZpc2lvbjogMS4yMyAkIElPOjB4JTA0bHgtMHglMDRseCBNTUlPKHZpcnQgYWRkcik6MHglMDRseCBJUlE6JTAyZCIsCisJCSBob3N0LT5pb19wb3J0LCBob3N0LT5pb19wb3J0ICsgaG9zdC0+bl9pb19wb3J0IC0gMSwKKwkJIGhvc3QtPmJhc2UsCisJCSBob3N0LT5pcnEpOworCXNodC0+bmFtZQkgID0gZGF0YS0+bnNwaW5mbzsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJlbmQiKTsKKworCisJcmV0dXJuIGhvc3Q7IC8qIGRldGVjdCBkb25lLiAqLworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKK3N0YXRpYyBpbnQgbnNwX2RldGVjdF9vbGQoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHQpCit7CisJaWYgKG5zcF9kZXRlY3Qoc2h0KSA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8vTU9EX0lOQ19VU0VfQ09VTlQ7CisJCXJldHVybiAxOworCX0KK30KKworCitzdGF0aWMgaW50IG5zcF9yZWxlYXNlX29sZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwkvL25zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopc2hwbnQtPmhvc3RkYXRhOworCisJLyogUENNQ0lBIENhcmQgU2VydmljZSBkb3NlIHNhbWUgdGhpbmdzIGJlbG93LiAqLworCS8qIFNvIHdlIGRvIG5vdGhpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvL2lmIChzaHBudC0+aXJxKSB7CisJLy8JZnJlZV9pcnEoc2hwbnQtPmlycSwgZGF0YS0+U2NzaUluZm8pOworCS8vfQorCS8vaWYgKHNocG50LT5pb19wb3J0KSB7CisJLy8JcmVsZWFzZV9yZWdpb24oc2hwbnQtPmlvX3BvcnQsIHNocG50LT5uX2lvX3BvcnQpOworCS8vfQorCisJLy9NT0RfREVDX1VTRV9DT1VOVDsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiByZXR1cm4gaW5mbyBzdHJpbmcJCQkJCQkgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGNvbnN0IGNoYXIgKm5zcF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopc2hwbnQtPmhvc3RkYXRhOworCisJcmV0dXJuIGRhdGEtPm5zcGluZm87Cit9CisKKyN1bmRlZiBTUFJJTlRGCisjZGVmaW5lIFNQUklOVEYoYXJncy4uLikgXAorICAgICAgICBkbyB7IFwKKwkJaWYobGVuZ3RoID4gKHBvcyAtIGJ1ZmZlcikpIHsgXAorCQkJcG9zICs9IHNucHJpbnRmKHBvcywgbGVuZ3RoIC0gKHBvcyAtIGJ1ZmZlcikgKyAxLCAjIyBhcmdzKTsgXAorCQkJbnNwX2RiZyhOU1BfREVCVUdfUFJPQywgImJ1ZmZlcj0weCVwIHBvcz0weCVwIGxlbmd0aD0lZCAlZFxuIiwgYnVmZmVyLCBwb3MsIGxlbmd0aCwgIGxlbmd0aCAtIChwb3MgLSBidWZmZXIpKTtcCisJCX0gXAorCX0gd2hpbGUoMCkKK3N0YXRpYyBpbnQKK25zcF9wcm9jX2luZm8oCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwKKyNlbmRpZgorCWNoYXIgICpidWZmZXIsCisJY2hhciAqKnN0YXJ0LAorCW9mZl90ICBvZmZzZXQsCisJaW50ICAgIGxlbmd0aCwKKyNpZiAhKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykpCisJaW50ICAgIGhvc3RubywKKyNlbmRpZgorCWludCAgICBpbm91dCkKK3sKKwlpbnQgaWQ7CisJY2hhciAqcG9zID0gYnVmZmVyOworCWludCB0aGlzbGVuZ3RoOworCWludCBzcGVlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW5zcF9od19kYXRhICpkYXRhOworI2lmICEoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworI2Vsc2UKKwlpbnQgaG9zdG5vOworI2VuZGlmCisJaWYgKGlub3V0KSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzMpKQorCWhvc3RubyA9IGhvc3QtPmhvc3Rfbm87CisjZWxzZQorCS8qIHNlYXJjaCB0aGlzIEhCQSBob3N0ICovCisJaG9zdCA9IHNjc2lfaG9zdF9obl9nZXQoaG9zdG5vKTsKKwlpZiAoaG9zdCA9PSBOVUxMKSB7CisJCXJldHVybiAtRVNSQ0g7CisJfQorI2VuZGlmCisJZGF0YSA9IChuc3BfaHdfZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCisKKwlTUFJJTlRGKCJOaW5qYVNDU0kgc3RhdHVzXG5cbiIpOworCVNQUklOVEYoIkRyaXZlciB2ZXJzaW9uOiAgICAgICAgJFJldmlzaW9uOiAxLjIzICRcbiIpOworCVNQUklOVEYoIlNDU0kgaG9zdCBOby46ICAgICAgICAgJWRcbiIsICAgICAgICAgIGhvc3Rubyk7CisJU1BSSU5URigiSVJROiAgICAgICAgICAgICAgICAgICAlZFxuIiwgICAgICAgICAgaG9zdC0+aXJxKTsKKwlTUFJJTlRGKCJJTzogICAgICAgICAgICAgICAgICAgIDB4JWx4LTB4JWx4XG4iLCBob3N0LT5pb19wb3J0LCBob3N0LT5pb19wb3J0ICsgaG9zdC0+bl9pb19wb3J0IC0gMSk7CisJU1BSSU5URigiTU1JTyh2aXJ0dWFsIGFkZHJlc3MpOiAweCVseC0weCVseFxuIiwgaG9zdC0+YmFzZSwgaG9zdC0+YmFzZSArIGRhdGEtPk1taW9MZW5ndGggLSAxKTsKKwlTUFJJTlRGKCJzZ190YWJsZXNpemU6ICAgICAgICAgICVkXG4iLCAgICAgICAgICBob3N0LT5zZ190YWJsZXNpemUpOworCisJU1BSSU5URigiYnVyc3QgdHJhbnNmZXIgbW9kZTogICAiKTsKKwlzd2l0Y2ggKG5zcF9idXJzdF9tb2RlKSB7CisJY2FzZSBCVVJTVF9JTzg6CisJCVNQUklOVEYoImlvOCIpOworCQlicmVhazsKKwljYXNlIEJVUlNUX0lPMzI6CisJCVNQUklOVEYoImlvMzIiKTsKKwkJYnJlYWs7CisJY2FzZSBCVVJTVF9NRU0zMjoKKwkJU1BSSU5URigibWVtMzIiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU1BSSU5URigiPz8/Iik7CisJCWJyZWFrOworCX0KKwlTUFJJTlRGKCJcbiIpOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGRhdGEtPkxvY2spLCBmbGFncyk7CisJU1BSSU5URigiQ3VycmVudFNDOiAgICAgICAgICAgICAweCVwXG5cbiIsICAgICAgZGF0YS0+Q3VycmVudFNDKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoZGF0YS0+TG9jayksIGZsYWdzKTsKKworCVNQUklOVEYoIlNEVFIgc3RhdHVzXG4iKTsKKwlmb3IoaWQgPSAwOyBpZCA8IEFSUkFZX1NJWkUoZGF0YS0+U3luYyk7IGlkKyspIHsKKworCQlTUFJJTlRGKCJpZCAlZDogIiwgaWQpOworCisJCWlmIChpZCA9PSBob3N0LT50aGlzX2lkKSB7CisJCQlTUFJJTlRGKCItLS0tLSBOaW5qYVNDU0ktMyBob3N0IGFkYXB0ZXJcbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2goZGF0YS0+U3luY1tpZF0uU3luY05lZ290aWF0aW9uKSB7CisJCWNhc2UgU1lOQ19PSzoKKwkJCVNQUklOVEYoIiBzeW5jIik7CisJCQlicmVhazsKKwkJY2FzZSBTWU5DX05HOgorCQkJU1BSSU5URigiYXN5bmMiKTsKKwkJCWJyZWFrOworCQljYXNlIFNZTkNfTk9UX1lFVDoKKwkJCVNQUklOVEYoIiBub25lIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNQUklOVEYoIj8/Pz8/Iik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkYXRhLT5TeW5jW2lkXS5TeW5jUGVyaW9kICE9IDApIHsKKwkJCXNwZWVkID0gMTAwMDAwMCAvIChkYXRhLT5TeW5jW2lkXS5TeW5jUGVyaW9kICogNCk7CisKKwkJCVNQUklOVEYoIiB0cmFuc2ZlciAlZC4lZE1CL3MsIG9mZnNldCAlZCIsCisJCQkJc3BlZWQgLyAxMDAwLAorCQkJCXNwZWVkICUgMTAwMCwKKwkJCQlkYXRhLT5TeW5jW2lkXS5TeW5jT2Zmc2V0CisJCQkJKTsKKwkJfQorCQlTUFJJTlRGKCJcbiIpOworCX0KKworCXRoaXNsZW5ndGggPSBwb3MgLSAoYnVmZmVyICsgb2Zmc2V0KTsKKworCWlmKHRoaXNsZW5ndGggPCAwKSB7CisJCSpzdGFydCA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCisJdGhpc2xlbmd0aCA9IG1pbih0aGlzbGVuZ3RoLCBsZW5ndGgpOworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKworCXJldHVybiB0aGlzbGVuZ3RoOworfQorI3VuZGVmIFNQUklOVEYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogZXJyb3IgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKnN0YXRpYyBpbnQgbnNwX2VoX3N0cmF0ZWd5KHN0cnVjdCBTY3NpX0hvc3QgKlNob3N0KQoreworCXJldHVybiBGQUlMRUQ7Cit9Ki8KKworLyoKK3N0YXRpYyBpbnQgbnNwX2VoX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJbnNwX2RiZyhOU1BfREVCVUdfQlVTUkVTRVQsICJTQ3BudD0weCVwIiwgU0NwbnQpOworCisJcmV0dXJuIG5zcF9laF9idXNfcmVzZXQoU0NwbnQpOworfSovCisKKy8qCitzdGF0aWMgaW50IG5zcF9laF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwluc3BfZGJnKE5TUF9ERUJVR19CVVNSRVNFVCwgIiVzOiBTQ3BudD0weCVwIiwgU0NwbnQpOworCisJcmV0dXJuIEZBSUxFRDsKK30qLworCitzdGF0aWMgaW50IG5zcF9idXNfcmVzZXQobnNwX2h3X2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGJhc2UgPSBkYXRhLT5CYXNlQWRkcmVzczsKKwlpbnQJICAgICBpOworCisJbnNwX3dyaXRlKGJhc2UsIElSUUNPTlRST0wsIElSUUNPTlRST0xfQUxMTUFTSyk7CisKKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIFNDU0lfUlNUKTsKKwltZGVsYXkoMTAwKTsgLyogMTAwbXMgKi8KKwluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIDApOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCQluc3BfaW5kZXhfcmVhZChiYXNlLCBJUlFQSEFTRVNFTkNFKTsgLyogZHVtbXkgcmVhZCAqLworCX0KKworCW5zcGh3X2luaXRfc3luYyhkYXRhKTsKKworCW5zcF93cml0ZShiYXNlLCBJUlFDT05UUk9MLCBJUlFDT05UUk9MX0FMTENMRUFSKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IG5zcF9laF9idXNfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJbnNwX2RiZyhOU1BfREVCVUdfQlVTUkVTRVQsICJTQ3BudD0weCVwIiwgU0NwbnQpOworCisJcmV0dXJuIG5zcF9idXNfcmVzZXQoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbnNwX2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJbnNwX2RiZyhOU1BfREVCVUdfQlVTUkVTRVQsICJpbiIpOworCisJbnNwaHdfaW5pdChkYXRhKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFBDTUNJQSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIG5zcF9jc19hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworICAgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICAgIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgICAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBkZXZfbGlua190ICpuc3BfY3NfYXR0YWNoKHZvaWQpCit7CisJc2NzaV9pbmZvX3QgICppbmZvOworCWNsaWVudF9yZWdfdCAgY2xpZW50X3JlZzsKKwlkZXZfbGlua190ICAgKmxpbms7CisJaW50CSAgICAgIHJldDsKKwluc3BfaHdfZGF0YSAgKmRhdGEgPSAmbnNwX2RhdGFfYmFzZTsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJpbiIpOworCisJLyogQ3JlYXRlIG5ldyBTQ1NJIGRldmljZSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvID09IE5VTEwpIHsgcmV0dXJuIE5VTEw7IH0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJbGluayA9ICZpbmZvLT5saW5rOworCWxpbmstPnByaXYgPSBpbmZvOworCWRhdGEtPlNjc2lJbmZvID0gaW5mbzsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJpbmZvPTB4JXAiLCBpbmZvKTsKKworCS8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworCWxpbmstPmlvLk51bVBvcnRzMQkgPSAweDEwOworCWxpbmstPmlvLkF0dHJpYnV0ZXMxCSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWxpbmstPmlvLklPQWRkckxpbmVzCSA9IDEwOwkvKiBub3QgdXNlZCAqLworCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMJID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworCWxpbmstPmlycS5JUlFJbmZvMQkgPSBJUlFfTEVWRUxfSUQ7CisKKwkvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworCWxpbmstPmlycS5IYW5kbGVyCSA9ICZuc3BpbnRyOworCWxpbmstPmlycS5JbnN0YW5jZSAgICAgICA9IGluZm87CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgICAgIHw9IChTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00pOworCisJLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcwkgPSBDT05GX0VOQUJMRV9JUlE7CisJbGluay0+Y29uZi5WY2MJCSA9IDUwOworCWxpbmstPmNvbmYuSW50VHlwZQkgPSBJTlRfTUVNT1JZX0FORF9JTzsKKwlsaW5rLT5jb25mLlByZXNlbnQJID0gUFJFU0VOVF9PUFRJT047CisKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQgICAgICAgICAgICAgICA9IGRldl9saXN0OworCWRldl9saXN0ICAgICAgICAgICAgICAgICA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbwkgPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sJID0KKwkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQJfAorCQlDU19FVkVOVF9QTV9TVVNQRU5ECXwgQ1NfRVZFTlRfUE1fUkVTVU1FCSA7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm5zcF9jc19ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24JID0gMHgwMjEwOworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCW5zcF9jc19kZXRhY2gobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKworCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImxpbms9MHglcCIsIGxpbmspOworCXJldHVybiBsaW5rOworfSAvKiBuc3BfY3NfYXR0YWNoICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCSBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgbnNwX2NzX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJpbiwgbGluaz0weCVwIiwgbGluayk7CisKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpIHsKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoKmxpbmtwID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCW5zcF9jc19yZWxlYXNlKGxpbmspOworCisJLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJaWYgKGxpbmstPmhhbmRsZSkgeworCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKwl9CisKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlrZnJlZShsaW5rLT5wcml2KTsKKwlsaW5rLT5wcml2ID0gTlVMTDsKKworfSAvKiBuc3BfY3NfZGV0YWNoICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgbnNwX2NzX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBuc3BfY3NfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJY2xpZW50X2hhbmRsZV90CSAgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXNjc2lfaW5mb190CSAqaW5mbwkgPSBsaW5rLT5wcml2OworCXR1cGxlX3QJCSAgdHVwbGU7CisJY2lzcGFyc2VfdAkgIHBhcnNlOworCWludAkJICBsYXN0X3JldCwgbGFzdF9mbjsKKwl1bnNpZ25lZCBjaGFyCSAgdHVwbGVfZGF0YVs2NF07CisJY29uZmlnX2luZm9fdAkgIGNvbmY7CisJd2luX3JlcV90ICAgICAgICAgcmVxOworCW1lbXJlcV90ICAgICAgICAgIG1hcDsKKwljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCW5zcF9od19kYXRhICAgICAgKmRhdGEgPSAmbnNwX2RhdGFfYmFzZTsKKyNpZiAhKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNzQpKQorCVNjc2lfRGV2aWNlCSAqZGV2OworCWRldl9ub2RlX3QJKip0YWlsLCAqbm9kZTsKKyNlbmRpZgorCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluIik7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgICAgPSBDSVNUUExfQ09ORklHOworCXR1cGxlLkF0dHJpYnV0ZXMgICAgICA9IDA7CisJdHVwbGUuVHVwbGVEYXRhCSAgICAgID0gdHVwbGVfZGF0YTsKKwl0dXBsZS5UdXBsZURhdGFNYXggICAgPSBzaXplb2YodHVwbGVfZGF0YSk7CisJdHVwbGUuVHVwbGVPZmZzZXQgICAgID0gMDsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLAlwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLAlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCAgICA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUJICAgICAgfD0gREVWX0NPTkZJRzsKKworCS8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCisJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKwlsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXdoaWxlICgxKSB7CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisKKwkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQkJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgeyBkZmx0ID0gKmNmZzsgfQorCQlpZiAoY2ZnLT5pbmRleCA9PSAwKSB7IGdvdG8gbmV4dF9lbnRyeTsgfQorCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKworCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisKKwkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDApIHsKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCQl9CisJCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDApIHsKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCQl9CisJCX0KKworCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQl9IGVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwkJfQorCisJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpIHsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCX0KKworCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQl9CisJCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLworCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJfQorCisJCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0Lm1lbS5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9tZW1fdCAqbWVtID0KKwkJCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC5tZW07CisJCQlyZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTTsKKwkJCXJlcS5BdHRyaWJ1dGVzIHw9IFdJTl9FTkFCTEU7CisJCQlyZXEuQmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKKwkJCXJlcS5TaXplID0gbWVtLT53aW5bMF0ubGVuOworCQkJaWYgKHJlcS5TaXplIDwgMHgxMDAwKSB7CisJCQkJcmVxLlNpemUgPSAweDEwMDA7CisJCQl9CisJCQlyZXEuQWNjZXNzU3BlZWQgPSAwOworCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCW1hcC5QYWdlID0gMDsgbWFwLkNhcmRPZmZzZXQgPSBtZW0tPndpblswXS5jYXJkX2FkZHI7CisJCQlpZiAocGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtYXApICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCisJCQlkYXRhLT5NbWlvQWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXBfbm9jYWNoZShyZXEuQmFzZSwgcmVxLlNpemUpOworCQkJZGF0YS0+TW1pb0xlbmd0aCAgPSByZXEuU2l6ZTsKKwkJfQorCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCisJCWJyZWFrOworCisJbmV4dF9lbnRyeToKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgIm5leHQiKTsKKworCQlpZiAobGluay0+aW8uTnVtUG9ydHMxKSB7CisJCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJCX0KKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl9CisKKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7CisJCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKwl9CisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworCisJaWYgKGZyZWVfcG9ydHMpIHsKKwkJaWYgKGxpbmstPmlvLkJhc2VQb3J0MSkgeworCQkJcmVsZWFzZV9yZWdpb24obGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pby5OdW1Qb3J0czEpOworCQl9CisJCWlmIChsaW5rLT5pby5CYXNlUG9ydDIpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGxpbmstPmlvLkJhc2VQb3J0MiwgbGluay0+aW8uTnVtUG9ydHMyKTsKKwkJfQorCX0KKworCS8qIFNldCBwb3J0IGFuZCBJUlEgKi8KKwlkYXRhLT5CYXNlQWRkcmVzcyA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlkYXRhLT5OdW1BZGRyZXNzICA9IGxpbmstPmlvLk51bVBvcnRzMTsKKwlkYXRhLT5JcnFOdW1iZXIgICA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJJL09bMHgleCsweCV4XSBJUlEgJWQiLAorCQlkYXRhLT5CYXNlQWRkcmVzcywgZGF0YS0+TnVtQWRkcmVzcywgZGF0YS0+SXJxTnVtYmVyKTsKKworCWlmKG5zcGh3X2luaXQoZGF0YSkgPT0gRkFMU0UpIHsKKwkJZ290byBjc19mYWlsZWQ7CisJfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwyKSkKKwlob3N0ID0gbnNwX2RldGVjdCgmbnNwX2RyaXZlcl90ZW1wbGF0ZSk7CisjZWxzZQorCXNjc2lfcmVnaXN0ZXJfaG9zdCgmbnNwX2RyaXZlcl90ZW1wbGF0ZSk7CisJZm9yIChob3N0ID0gc2NzaV9ob3N0X2dldF9uZXh0KE5VTEwpOyBob3N0ICE9IE5VTEw7CisJICAgICBob3N0ID0gc2NzaV9ob3N0X2dldF9uZXh0KGhvc3QpKSB7CisJCWlmIChob3N0LT5ob3N0dCA9PSAmbnNwX2RyaXZlcl90ZW1wbGF0ZSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImRldGVjdCBmYWlsZWQiKTsKKwkJZ290byBjc19mYWlsZWQ7CisJfQorCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSw3NCkpCisJc2NzaV9hZGRfaG9zdCAoaG9zdCwgTlVMTCk7CisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlzbnByaW50ZihpbmZvLT5ub2RlLmRldl9uYW1lLCBzaXplb2YoaW5mby0+bm9kZS5kZXZfbmFtZSksICJzY3NpJWQiLCBob3N0LT5ob3N0X25vKTsKKwlsaW5rLT5kZXYgID0gJmluZm8tPm5vZGU7CisJaW5mby0+aG9zdCA9IGhvc3Q7CisKKyNlbHNlCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgIkdFVF9TQ1NJX0lORk8iKTsKKwl0YWlsID0gJmxpbmstPmRldjsKKwlpbmZvLT5uZGV2ID0gMDsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJob3N0PTB4JXAiLCBob3N0KTsKKworCWZvciAoZGV2ID0gaG9zdC0+aG9zdF9xdWV1ZTsgZGV2ICE9IE5VTEw7IGRldiA9IGRldi0+bmV4dCkgeworCQl1bnNpZ25lZCBsb25nIGlkOworCQlpZCA9IChkZXYtPmlkICYgMHgwZikgKyAoKGRldi0+bHVuICYgMHgwZikgPDwgNCkgKworCQkJKChkZXYtPmNoYW5uZWwgJiAweDBmKSA8PCA4KSArCisJCQkoKGRldi0+aG9zdC0+aG9zdF9ubyAmIDB4MGYpIDw8IDEyKTsKKwkJbm9kZSA9ICZpbmZvLT5ub2RlW2luZm8tPm5kZXZdOworCQlub2RlLT5taW5vciA9IDA7CisJCXN3aXRjaCAoZGV2LT50eXBlKSB7CisJCWNhc2UgVFlQRV9UQVBFOgorCQkJbm9kZS0+bWFqb3IgPSBTQ1NJX1RBUEVfTUFKT1I7CisJCQlzbnByaW50Zihub2RlLT5kZXZfbmFtZSwgc2l6ZW9mKG5vZGUtPmRldl9uYW1lKSwgInN0IyUwNGx4IiwgaWQpOworCQkJYnJlYWs7CisJCWNhc2UgVFlQRV9ESVNLOgorCQljYXNlIFRZUEVfTU9EOgorCQkJbm9kZS0+bWFqb3IgPSBTQ1NJX0RJU0swX01BSk9SOworCQkJc25wcmludGYobm9kZS0+ZGV2X25hbWUsIHNpemVvZihub2RlLT5kZXZfbmFtZSksICJzZCMlMDRseCIsIGlkKTsKKwkJCWJyZWFrOworCQljYXNlIFRZUEVfUk9NOgorCQljYXNlIFRZUEVfV09STToKKwkJCW5vZGUtPm1ham9yID0gU0NTSV9DRFJPTV9NQUpPUjsKKwkJCXNucHJpbnRmKG5vZGUtPmRldl9uYW1lLCBzaXplb2Yobm9kZS0+ZGV2X25hbWUpLCAic3IjJTA0bHgiLCBpZCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW5vZGUtPm1ham9yID0gU0NTSV9HRU5FUklDX01BSk9SOworCQkJc25wcmludGYobm9kZS0+ZGV2X25hbWUsIHNpemVvZihub2RlLT5kZXZfbmFtZSksICJzZyMlMDRseCIsIGlkKTsKKwkJCWJyZWFrOworCQl9CisJCSp0YWlsID0gbm9kZTsgdGFpbCA9ICZub2RlLT5uZXh0OworCQlpbmZvLT5uZGV2Kys7CisJCWluZm8tPmhvc3QgPSBkZXYtPmhvc3Q7CisJfQorCisJKnRhaWwgPSBOVUxMOworCWlmIChpbmZvLT5uZGV2ID09IDApIHsKKwkJbnNwX21zZyhLRVJOX0lORk8sICJubyBTQ1NJIGRldmljZXMgZm91bmQiKTsKKwl9CisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImhvc3Q9MHglcCIsIGhvc3QpOworI2VuZGlmCisKKwkvKiBGaW5hbGx5LCByZXBvcnQgd2hhdCB3ZSd2ZSBkb25lICovCisJcHJpbnRrKEtFUk5fSU5GTyAibnNwX2NzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCisJICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCisJICAgICAgIGxpbmstPmNvbmYuVmNjLzEwLCBsaW5rLT5jb25mLlZjYyUxMCk7CisJaWYgKGxpbmstPmNvbmYuVnBwMSkgeworCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxLzEwLCBsaW5rLT5jb25mLlZwcDElMTApOworCX0KKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7CisJCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCX0KKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKSB7CisJCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKKwl9CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMikKKwkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyK2xpbmstPmlvLk51bVBvcnRzMi0xKTsKKwlpZiAobGluay0+d2luKQorCQlwcmludGsoIiwgbWVtIDB4JTA2bHgtMHglMDZseCIsIHJlcS5CYXNlLAorCQkgICAgICAgcmVxLkJhc2UrcmVxLlNpemUtMSk7CisJcHJpbnRrKCJcbiIpOworCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlyZXR1cm47CisKKyBjc19mYWlsZWQ6CisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImNvbmZpZyBmYWlsIik7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisJbnNwX2NzX3JlbGVhc2UobGluayk7CisKKwlyZXR1cm47Cit9IC8qIG5zcF9jc19jb25maWcgKi8KKyN1bmRlZiBDU19DSEVDSworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBuc3BfY3NfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIG5zcF9jc19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCW5zcF9od19kYXRhICpkYXRhID0gTlVMTDsKKworCWlmIChpbmZvLT5ob3N0ID09IE5VTEwpIHsKKwkJbnNwX21zZyhLRVJOX0RFQlVHLCAidW5leHBlY3RlZCBjYXJkIHJlbGVhc2UgY2FsbC4iKTsKKwl9IGVsc2UgeworCQlkYXRhID0gKG5zcF9od19kYXRhICopaW5mby0+aG9zdC0+aG9zdGRhdGE7CisJfQorCisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImxpbms9MHglcCIsIGxpbmspOworCisJLyogVW5saW5rIHRoZSBkZXZpY2UgY2hhaW4gKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwyKSkKKwlpZiAoaW5mby0+aG9zdCAhPSBOVUxMKSB7CisJCXNjc2lfcmVtb3ZlX2hvc3QoaW5mby0+aG9zdCk7CisJfQorI2Vsc2UKKwlzY3NpX3VucmVnaXN0ZXJfaG9zdCgmbnNwX2RyaXZlcl90ZW1wbGF0ZSk7CisjZW5kaWYKKwlsaW5rLT5kZXYgPSBOVUxMOworCisJaWYgKGxpbmstPndpbikgeworCQlpZiAoZGF0YSAhPSBOVUxMKSB7CisJCQlpb3VubWFwKCh2b2lkICopKGRhdGEtPk1taW9BZGRyZXNzKSk7CisJCX0KKwkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisJfQorCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKSB7CisJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwl9CisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkgeworCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwl9CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMikpCisJaWYgKGluZm8tPmhvc3QgIT0gTlVMTCkgeworCQlzY3NpX2hvc3RfcHV0KGluZm8tPmhvc3QpOworCX0KKyNlbmRpZgorfSAvKiBuc3BfY3NfcmVsZWFzZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorCisgICAgV2hlbiBhIENBUkRfUkVNT1ZBTCBldmVudCBpcyByZWNlaXZlZCwgd2UgaW1tZWRpYXRlbHkgc2V0IGEgZmxhZworICAgIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQKKyAgICBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnIHRvIG1ha2Ugc3VyZQorICAgIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBuc3BfY3NfZXZlbnQoZXZlbnRfdAkJICAgICAgIGV2ZW50LAorCQkJaW50CQkgICAgICAgcHJpb3JpdHksCisJCQlldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisJZGV2X2xpbmtfdCAgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisJbnNwX2h3X2RhdGEgKmRhdGE7CisKKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiaW4sIGV2ZW50PTB4JTA4eCIsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImV2ZW50OiByZW1vdmUiKTsKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQkoKHNjc2lfaW5mb190ICopbGluay0+cHJpdiktPnN0b3AgPSAxOworCQkJbnNwX2NzX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiZXZlbnQ6IGluc2VydCIpOworCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKKwkJaW5mby0+YnVzICAgID0gIGFyZ3MtPmJ1czsKKyNlbmRpZgorCQluc3BfY3NfY29uZmlnKGxpbmspOworCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImV2ZW50OiBzdXNwZW5kIik7CisJCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQkvKiBNYXJrIHRoZSBkZXZpY2UgYXMgc3RvcHBlZCwgdG8gYmxvY2sgSU8gdW50aWwgbGF0ZXIgKi8KKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImV2ZW50OiByZXNldCBwaHlzaWNhbCIpOworCisJCWlmIChpbmZvLT5ob3N0ICE9IE5VTEwpIHsKKwkJCW5zcF9tc2coS0VSTl9JTkZPLCAiY2xlYXIgU0RUUiBzdGF0dXMiKTsKKworCQkJZGF0YSA9IChuc3BfaHdfZGF0YSAqKWluZm8tPmhvc3QtPmhvc3RkYXRhOworCisJCQluc3Bod19pbml0X3N5bmMoZGF0YSk7CisJCX0KKworCQlpbmZvLT5zdG9wID0gMTsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJldmVudDogcmVzdW1lIik7CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiZXZlbnQ6IHJlc2V0Iik7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCX0KKwkJaW5mby0+c3RvcCA9IDA7CisKKwkJaWYgKGluZm8tPmhvc3QgIT0gTlVMTCkgeworCQkJbnNwX21zZyhLRVJOX0lORk8sICJyZXNldCBob3N0IGFuZCBidXMiKTsKKworCQkJZGF0YSA9IChuc3BfaHdfZGF0YSAqKWluZm8tPmhvc3QtPmhvc3RkYXRhOworCisJCQluc3Bod19pbml0ICAgKGRhdGEpOworCQkJbnNwX2J1c19yZXNldChkYXRhKTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImV2ZW50OiB1bmtub3duIik7CisJCWJyZWFrOworCX0KKwluc3BfZGJnKE5TUF9ERUJVR19JTklULCAiZW5kIik7CisJcmV0dXJuIDA7Cit9IC8qIG5zcF9jc19ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qCisgKgltb2R1bGUgZW50cnkgcG9pbnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBuc3BfZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcnYgICAgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJuc3BfY3MiLAorCX0sCisJLmF0dGFjaCAgICAgICAgID0gbnNwX2NzX2F0dGFjaCwKKwkuZGV0YWNoICAgICAgICAgPSBuc3BfY3NfZGV0YWNoLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBuc3BfY3NfaW5pdCh2b2lkKQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKKwluc3BfbXNnKEtFUk5fSU5GTywgImxvYWRpbmcuLi4iKTsKKworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZuc3BfZHJpdmVyKTsKKyNlbHNlCisJc2VydmluZm9fdCBzZXJ2OworCisJbnNwX21zZyhLRVJOX0lORk8sICJsb2FkaW5nLi4uIik7CisJcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oJnNlcnYpOworCWlmIChzZXJ2LlJldmlzaW9uICE9IENTX1JFTEVBU0VfQ09ERSkgeworCQluc3BfbXNnKEtFUk5fREVCVUcsICJDYXJkIFNlcnZpY2VzIHJlbGVhc2UgZG9lcyBub3QgbWF0Y2ghIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZWdpc3Rlcl9wY21jaWFfZHJpdmVyKCZkZXZfaW5mbywgJm5zcF9jc19hdHRhY2gsICZuc3BfY3NfZGV0YWNoKTsKKworCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJvdXQiKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnNwX2NzX2V4aXQodm9pZCkKK3sKKwluc3BfbXNnKEtFUk5fSU5GTywgInVubG9hZGluZy4uLiIpOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQorCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmbnNwX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworI2Vsc2UKKwl1bnJlZ2lzdGVyX3BjbWNpYV9kcml2ZXIoJmRldl9pbmZvKTsKKwkvKiBYWFg6IHRoaXMgcmVhbGx5IG5lZWRzIHRvIG1vdmUgaW50byBnZW5lcmljIGNvZGUuLiAqLworCXdoaWxlIChkZXZfbGlzdCAhPSBOVUxMKSB7CisJCWlmIChkZXZfbGlzdC0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluc3BfY3NfcmVsZWFzZShkZXZfbGlzdCk7CisJCX0KKwkJbnNwX2NzX2RldGFjaChkZXZfbGlzdCk7CisJfQorI2VuZGlmCit9CisKKworbW9kdWxlX2luaXQobnNwX2NzX2luaXQpCittb2R1bGVfZXhpdChuc3BfY3NfZXhpdCkKKworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5oIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAxYjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuaApAQCAtMCwwICsxLDQ3MiBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LworICBIZWFkZXIgZmlsZSBmb3IgbnNwX2NzLmMKKyAgICAgIEJ5OiBZT0tPVEEgSGlyb3NoaSA8eW9rb3RhQG5ldGxhYi5pcy50c3VrdWJhLmFjLmpwPgorCisgICAgVmVyLjEuMCA6IEN1dCB1bnVzZWQgbGluZXMuCisgICAgVmVyIDAuMSA6IEluaXRpYWwgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qICRJZDogbnNwX2NzLmgsdiAxLjE5IDIwMDMvMDgvMTggMTE6MDk6MTkgZWxjYSBFeHAgJCAqLworCisjaWZuZGVmICBfX25zcF9jc19fCisjZGVmaW5lICBfX25zcF9jc19fCisKKy8qIGZvciBkZWJ1Z2dpbmcgKi8KKy8vI2RlZmluZSBOU1BfREVCVUcgOQorCisvKgorI2RlZmluZSBzdGF0aWMKKyNkZWZpbmUgaW5saW5lCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb21lIHVzZWZ1bCBtYWNyb3MuLi4KKyAqLworI2RlZmluZSBCSVQoeCkgICAgICAoMUwgPDwgKHgpKQorCisvKiBTQ1NJIGluaXRpYXRvciBtdXN0IGJlIElEIDcgKi8KKyNkZWZpbmUgTlNQX0lOSVRJQVRPUl9JRCAgNworCisjZGVmaW5lIE5TUF9TRUxUSU1FT1VUIDIwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWdpc3RlciBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBiYXNlIHJlZ2lzdGVyCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUJSVJRQ09OVFJPTAkweDAwICAvKiBSICovCisjICBkZWZpbmUgSVJRQ09OVFJPTF9SRVNFTEVDVF9DTEVBUiAgICAgQklUKDApCisjICBkZWZpbmUgSVJRQ09OVFJPTF9QSEFTRV9DSEFOR0VfQ0xFQVIgQklUKDEpCisjICBkZWZpbmUgSVJRQ09OVFJPTF9USU1FUl9DTEVBUiAgICAgICAgQklUKDIpCisjICBkZWZpbmUgSVJRQ09OVFJPTF9GSUZPX0NMRUFSICAgICAgICAgQklUKDMpCisjICBkZWZpbmUgSVJRQ09OVFJPTF9BTExNQVNLICAgICAgICAgICAgMHhmZgorIyAgZGVmaW5lIElSUUNPTlRST0xfQUxMQ0xFQVIgICAgICAgICAgIChJUlFDT05UUk9MX1JFU0VMRUNUX0NMRUFSICAgICB8IFwKKwkJCQkJIElSUUNPTlRST0xfUEhBU0VfQ0hBTkdFX0NMRUFSIHwgXAorCQkJCQkgSVJRQ09OVFJPTF9USU1FUl9DTEVBUiAgICAgICAgfCBcCisJCQkJCSBJUlFDT05UUk9MX0ZJRk9fQ0xFQVIgICAgICAgICAgKQorIyAgZGVmaW5lIElSUUNPTlRST0xfSVJRRElTQUJMRSAgICAgICAgIDB4ZjAKKworI2RlZmluZQlJUlFTVEFUVVMJMHgwMCAgLyogVyAqLworIyAgZGVmaW5lIElSUVNUQVRVU19TQ1NJICBCSVQoMCkKKyMgIGRlZmluZSBJUlFTVEFUVVNfVElNRVIgQklUKDIpCisjICBkZWZpbmUgSVJRU1RBVFVTX0ZJRk8gIEJJVCgzKQorIyAgZGVmaW5lIElSUVNUQVRVU19NQVNLICAweDBmCisKKyNkZWZpbmUJSUZTRUxFQ1QJMHgwMSAvKiBXICovCisjICBkZWZpbmUgSUZfSUZTRUwgICAgQklUKDApCisjICBkZWZpbmUgSUZfUkVHU0VMICAgQklUKDIpCisKKyNkZWZpbmUJRklGT1NUQVRVUwkweDAxIC8qIFIgKi8KKyMgIGRlZmluZSBGSUZPU1RBVFVTX0NISVBfUkVWSVNJT05fTUFTSyAweDBmCisjICBkZWZpbmUgRklGT1NUQVRVU19DSElQX0lEX01BU0sgICAgICAgMHg3MAorIyAgZGVmaW5lIEZJRk9TVEFUVVNfRlVMTF9FTVBUWSAgICAgICAgIEJJVCg3KQorCisjZGVmaW5lCUlOREVYUkVHCTB4MDIgLyogUi9XICovCisjZGVmaW5lCURBVEFSRUcJCTB4MDMgLyogUi9XICovCisjZGVmaW5lCUZJRk9EQVRBCTB4MDQgLyogUi9XICovCisjZGVmaW5lCUZJRk9EQVRBMQkweDA1IC8qIFIvVyAqLworI2RlZmluZQlGSUZPREFUQTIJMHgwNiAvKiBSL1cgKi8KKyNkZWZpbmUJRklGT0RBVEEzCTB4MDcgLyogUi9XICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGluZGV4ZWQgcmVnaXN0ZXIKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIEVYVEJVU0NUUkwJMHgxMCAvKiBSL1csZGVsZXRlZCAqLworCisjZGVmaW5lIENMT0NLRElWCTB4MTEgLyogUi9XICovCisjICBkZWZpbmUgQ0xPQ0tfNDBNIDB4MDIKKyMgIGRlZmluZSBDTE9DS18yME0gMHgwMQorIyAgZGVmaW5lIEZBU1RfMjAgICBCSVQoMikKKworI2RlZmluZSBURVJNUFdSQ1RSTAkweDEzIC8qIFIvVyAqLworIyAgZGVmaW5lIFBPV0VSX09OIEJJVCgwKQorCisjZGVmaW5lIFNDU0lJUlFNT0RFCTB4MTUgLyogUi9XICovCisjICBkZWZpbmUgU0NTSV9QSEFTRV9DSEFOR0VfRUkgQklUKDApCisjICBkZWZpbmUgUkVTRUxFQ1RfRUkgICAgICAgICAgQklUKDQpCisjICBkZWZpbmUgRklGT19JUlFfRUkgICAgICAgICAgQklUKDUpCisjICBkZWZpbmUgU0NTSV9SRVNFVF9JUlFfRUkgICAgQklUKDYpCisKKyNkZWZpbmUgSVJRUEhBU0VTRU5DRQkweDE2IC8qIFIgKi8KKyMgIGRlZmluZSBMQVRDSEVEX01TRyAgICAgIEJJVCgwKQorIyAgZGVmaW5lIExBVENIRURfSU8gICAgICAgQklUKDEpCisjICBkZWZpbmUgTEFUQ0hFRF9DRCAgICAgICBCSVQoMikKKyMgIGRlZmluZSBMQVRDSEVEX0JVU19GUkVFIEJJVCgzKQorIyAgZGVmaW5lIFBIQVNFX0NIQU5HRV9JUlEgQklUKDQpCisjICBkZWZpbmUgUkVTRUxFQ1RfSVJRICAgICBCSVQoNSkKKyMgIGRlZmluZSBGSUZPX0lSUSAgICAgICAgIEJJVCg2KQorIyAgZGVmaW5lIFNDU0lfUkVTRVRfSVJRICAgQklUKDcpCisKKyNkZWZpbmUgVElNRVJDT1VOVAkweDE3IC8qIFIvVyAqLworCisjZGVmaW5lIFNDU0lCVVNDVFJMCTB4MTggLyogUi9XICovCisjICBkZWZpbmUgU0NTSV9TRUwgICAgICAgICBCSVQoMCkKKyMgIGRlZmluZSBTQ1NJX1JTVCAgICAgICAgIEJJVCgxKQorIyAgZGVmaW5lIFNDU0lfREFUQU9VVF9FTkIgQklUKDIpCisjICBkZWZpbmUgU0NTSV9BVE4gICAgICAgICBCSVQoMykKKyMgIGRlZmluZSBTQ1NJX0FDSyAgICAgICAgIEJJVCg0KQorIyAgZGVmaW5lIFNDU0lfQlNZICAgICAgICAgQklUKDUpCisjICBkZWZpbmUgQVVUT0RJUkVDVElPTiAgICBCSVQoNikKKyMgIGRlZmluZSBBQ0tFTkIgICAgICAgICAgIEJJVCg3KQorCisjZGVmaW5lIFNDU0lCVVNNT04JMHgxOSAvKiBSICovCisKKyNkZWZpbmUgU0VUQVJCSVQJMHgxQSAvKiBXICovCisjICBkZWZpbmUgQVJCSVRfR08gICAgICAgICBCSVQoMCkKKyMgIGRlZmluZSBBUkJJVF9GTEFHX0NMRUFSIEJJVCgxKQorCisjZGVmaW5lIEFSQklUU1RBVFVTCTB4MUEgLyogUiAqLworLyojICBkZWZpbmUgQVJCSVRfR08gICAgICAgIEJJVCgwKSovCisjICBkZWZpbmUgQVJCSVRfV0lOICAgICAgICBCSVQoMSkKKyMgIGRlZmluZSBBUkJJVF9GQUlMICAgICAgIEJJVCgyKQorIyAgZGVmaW5lIFJFU0VMRUNUX0ZMQUcgICAgQklUKDMpCisKKyNkZWZpbmUgUEFSSVRZQ1RSTAkweDFCICAvKiBXICovCisjZGVmaW5lIFBBUklUWVNUQVRVUwkweDFCICAvKiBSICovCisKKyNkZWZpbmUgQ09NTUFORENUUkwJMHgxQyAgLyogVyAqLworIyAgZGVmaW5lIENMRUFSX0NPTU1BTkRfUE9JTlRFUiBCSVQoMCkKKyMgIGRlZmluZSBBVVRPX0NPTU1BTkRfR08gICAgICAgQklUKDEpCisKKyNkZWZpbmUgUkVTRUxFQ1RJRAkweDFDICAvKiBSICAgKi8KKyNkZWZpbmUgQ09NTUFORERBVEEJMHgxRCAgLyogUi9XICovCisKKyNkZWZpbmUgUE9JTlRFUkNMUgkweDFFICAvKiAgIFcgKi8KKyMgIGRlZmluZSBQT0lOVEVSX0NMRUFSICAgICAgQklUKDApCisjICBkZWZpbmUgQUNLX0NPVU5URVJfQ0xFQVIgIEJJVCgxKQorIyAgZGVmaW5lIFJFUV9DT1VOVEVSX0NMRUFSICBCSVQoMikKKyMgIGRlZmluZSBIT1NUX0NPVU5URVJfQ0xFQVIgQklUKDMpCisjICBkZWZpbmUgUkVBRF9TT1VSQ0UgICAgICAgIChCSVQoNCkgfCBCSVQoNSkpCisjICAgIGRlZmluZSBBQ0tfQ09VTlRFUiAgICAgICAgKDApCisjICAgIGRlZmluZSBSRVFfQ09VTlRFUiAgICAgICAgKEJJVCg0KSkKKyMgICAgZGVmaW5lIEhPU1RfQ09VTlRFUiAgICAgICAoQklUKDUpKQorCisjZGVmaW5lIFRSQU5TRkVSQ09VTlQJMHgxRSAgLyogUiAgICovCisKKyNkZWZpbmUgVFJBTlNGRVJNT0RFCTB4MjAgIC8qIFIvVyAqLworIyAgZGVmaW5lIE1PREVfTUVNOCAgIEJJVCgwKQorIyAgZGVmaW5lIE1PREVfTUVNMzIgIEJJVCgxKQorIyAgZGVmaW5lIE1PREVfQURSMjQgIEJJVCgyKQorIyAgZGVmaW5lIE1PREVfQURSMzIgIEJJVCgzKQorIyAgZGVmaW5lIE1PREVfSU84ICAgIEJJVCg0KQorIyAgZGVmaW5lIE1PREVfSU8zMiAgIEJJVCg1KQorIyAgZGVmaW5lIFRSQU5TRkVSX0dPIEJJVCg2KQorIyAgZGVmaW5lIEJSQUlORCAgICAgIEJJVCg3KQorCisjZGVmaW5lIFNZTkNSRUcJCTB4MjEgLyogUi9XICovCisjICBkZWZpbmUgU1lOQ1JFR19PRkZTRVRfTUFTSyAgMHgwZgorIyAgZGVmaW5lIFNZTkNSRUdfUEVSSU9EX01BU0sgIDB4ZjAKKyMgIGRlZmluZSBTWU5DUkVHX1BFUklPRF9TSElGVCA0CisKKyNkZWZpbmUgU0NTSURBVEFMQVRDSAkweDIyIC8qICAgVyAqLworI2RlZmluZSBTQ1NJREFUQUlOCTB4MjIgLyogUiAgICovCisjZGVmaW5lIFNDU0lEQVRBV0lUSEFDSwkweDIzIC8qIFIvVyAqLworI2RlZmluZSBTQ0FNQ09OVFJPTAkweDI0IC8qICAgVyAqLworI2RlZmluZSBTQ0FNU1RBVFVTCTB4MjQgLyogUiAgICovCisjZGVmaW5lIFNDQU1EQVRBCTB4MjUgLyogUi9XICovCisKKyNkZWZpbmUgT1RIRVJDT05UUk9MCTB4MjYgLyogUi9XICovCisjICBkZWZpbmUgVFBMX1JPTV9XUklURV9FTiBCSVQoMCkKKyMgIGRlZmluZSBUUFdSX09VVCAgICAgICAgIEJJVCgxKQorIyAgZGVmaW5lIFRQV1JfU0VOU0UgICAgICAgQklUKDIpCisjICBkZWZpbmUgUkE4X0NPTlRST0wgICAgICBCSVQoMykKKworI2RlZmluZSBBQ0tXSURUSAkweDI3IC8qIFIvVyAqLworI2RlZmluZSBDTFJURVNUUE5UCTB4MjggLyogICBXICovCisjZGVmaW5lIEFDS0NOVExECTB4MjkgLyogICBXICovCisjZGVmaW5lIFJFUUNOVExECTB4MkEgLyogICBXICovCisjZGVmaW5lIEhTVENOVExECTB4MkIgLyogICBXICovCisjZGVmaW5lIENIRUNLU1VNCTB4MkMgLyogUi9XICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElucHV0IHN0YXR1cyBiaXQgZGVmaW5pdGlvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTX01FU1NBR0UJQklUKDApICAgIC8qIE1lc3NhZ2UgbGluZSBmcm9tIFNDU0kgYnVzICAgICAgKi8KKyNkZWZpbmUgU19JTwkJQklUKDEpICAgIC8qIElucHV0L091dHB1dCBsaW5lIGZyb20gU0NTSSBidXMgKi8KKyNkZWZpbmUgU19DRAkJQklUKDIpICAgIC8qIENvbW1hbmQvRGF0YSBsaW5lIGZyb20gU0NTSSBidXMgKi8KKyNkZWZpbmUgU19CVVNZCQlCSVQoMykgICAgLyogQnVzeSBsaW5lIGZyb20gU0NTSSBidXMgICAgICAgICAqLworI2RlZmluZSBTX0FDSwkJQklUKDQpICAgIC8qIEFja25vd2xlZ2UgbGluZSBmcm9tIFNDU0kgYnVzICAgKi8KKyNkZWZpbmUgU19SRVFVRVNUCUJJVCg1KSAgICAvKiBSZXF1ZXN0IGxpbmUgZnJvbSBTQ1NJIGJ1cyAgICAgICovCisjZGVmaW5lIFNfU0VMRUNUCUJJVCg2KQkgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU19BVE4JCUJJVCg3KQkgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVc2VmdWwgQnVzIE1vbml0b3Igc3RhdHVzIGNvbWJpbmF0aW9ucy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQlVTTU9OX1NFTCAgICAgICAgIFNfU0VMRUNUCisjZGVmaW5lIEJVU01PTl9CU1kgICAgICAgICBTX0JVU1kKKyNkZWZpbmUgQlVTTU9OX1JFUSAgICAgICAgIFNfUkVRVUVTVAorI2RlZmluZSBCVVNNT05fSU8gICAgICAgICAgU19JTworI2RlZmluZSBCVVNNT05fQUNLICAgICAgICAgU19BQ0sKKyNkZWZpbmUgQlVTTU9OX0JVU19GUkVFICAgIDAKKyNkZWZpbmUgQlVTTU9OX0NPTU1BTkQgICAgICggU19CVVNZIHwgU19DRCB8ICAgICAgICAgICAgICAgICAgICBTX1JFUVVFU1QgKQorI2RlZmluZSBCVVNNT05fTUVTU0FHRV9JTiAgKCBTX0JVU1kgfCBTX0NEIHwgU19JTyB8IFNfTUVTU0FHRSB8IFNfUkVRVUVTVCApCisjZGVmaW5lIEJVU01PTl9NRVNTQUdFX09VVCAoIFNfQlVTWSB8IFNfQ0QgfCAgICAgICAgU19NRVNTQUdFIHwgU19SRVFVRVNUICkKKyNkZWZpbmUgQlVTTU9OX0RBVEFfSU4gICAgICggU19CVVNZIHwgICAgICAgIFNfSU8gfCAgICAgICAgICAgICBTX1JFUVVFU1QgKQorI2RlZmluZSBCVVNNT05fREFUQV9PVVQgICAgKCBTX0JVU1kgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfUkVRVUVTVCApCisjZGVmaW5lIEJVU01PTl9TVEFUVVMgICAgICAoIFNfQlVTWSB8IFNfQ0QgfCBTX0lPIHwgICAgICAgICAgICAgU19SRVFVRVNUICkKKyNkZWZpbmUgQlVTTU9OX1NFTEVDVCAgICAgICggICAgICAgICAgICAgICAgIFNfSU8gfCAgICAgICAgICAgICAgICAgICAgICAgIFNfU0VMRUNUICkKKyNkZWZpbmUgQlVTTU9OX1JFU0VMRUNUICAgICggICAgICAgICAgICAgICAgIFNfSU8gfCAgICAgICAgICAgICAgICAgICAgICAgIFNfU0VMRUNUICkKKyNkZWZpbmUgQlVTTU9OX1BIQVNFX01BU0sgICggICAgICAgICAgU19DRCB8IFNfSU8gfCBTX01FU1NBR0UgfCAgICAgICAgICAgIFNfU0VMRUNUICkKKworI2RlZmluZSBCVVNQSEFTRV9TRUxFQ1QgICAgICAoIEJVU01PTl9TRUxFQ1QgICAgICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfQ09NTUFORCAgICAgKCBCVVNNT05fQ09NTUFORCAgICAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX01FU1NBR0VfSU4gICggQlVTTU9OX01FU1NBR0VfSU4gICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9NRVNTQUdFX09VVCAoIEJVU01PTl9NRVNTQUdFX09VVCAmIEJVU01PTl9QSEFTRV9NQVNLICkKKyNkZWZpbmUgQlVTUEhBU0VfREFUQV9JTiAgICAgKCBCVVNNT05fREFUQV9JTiAgICAgJiBCVVNNT05fUEhBU0VfTUFTSyApCisjZGVmaW5lIEJVU1BIQVNFX0RBVEFfT1VUICAgICggQlVTTU9OX0RBVEFfT1VUICAgICYgQlVTTU9OX1BIQVNFX01BU0sgKQorI2RlZmluZSBCVVNQSEFTRV9TVEFUVVMgICAgICAoIEJVU01PTl9TVEFUVVMgICAgICAmIEJVU01PTl9QSEFTRV9NQVNLICkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IHNjc2lfaW5mb190IHsKKwlkZXZfbGlua190ICAgICAgICAgICAgIGxpbms7CisJc3RydWN0IFNjc2lfSG9zdCAgICAgICpob3N0OworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDc0KSkKKwlkZXZfbm9kZV90ICAgICAgICAgICAgIG5vZGU7CisjZWxzZQorCWludAkgICAgICAgICAgICAgICBuZGV2OworCWRldl9ub2RlX3QgICAgICAgICAgICAgbm9kZVs4XTsKKwlzdHJ1Y3QgYnVzX29wZXJhdGlvbnMgKmJ1czsKKyNlbmRpZgorCWludCAgICAgICAgICAgICAgICAgICAgc3RvcDsKK30gc2NzaV9pbmZvX3Q7CisKKworLyogc3luY2hyb25vdXMgdHJhbnNmZXIgbmVnb3RpYXRpb24gZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgX3N5bmNfZGF0YSB7CisJdW5zaWduZWQgaW50IFN5bmNOZWdvdGlhdGlvbjsKKyNkZWZpbmUgU1lOQ19OT1RfWUVUIDAKKyNkZWZpbmUgU1lOQ19PSyAgICAgIDEKKyNkZWZpbmUgU1lOQ19ORyAgICAgIDIKKworCXVuc2lnbmVkIGludCAgU3luY1BlcmlvZDsKKwl1bnNpZ25lZCBpbnQgIFN5bmNPZmZzZXQ7CisJdW5zaWduZWQgY2hhciBTeW5jUmVnaXN0ZXI7CisJdW5zaWduZWQgY2hhciBBY2tXaWR0aDsKK30gc3luY19kYXRhOworCit0eXBlZGVmIHN0cnVjdCBfbnNwX2h3X2RhdGEgeworCXVuc2lnbmVkIGludCAgQmFzZUFkZHJlc3M7CisJdW5zaWduZWQgaW50ICBOdW1BZGRyZXNzOworCXVuc2lnbmVkIGludCAgSXJxTnVtYmVyOworCisJdW5zaWduZWQgbG9uZyBNbWlvQWRkcmVzczsKKyNkZWZpbmUgTlNQX01NSU9fT0ZGU0VUIDB4MDgwMAorCXVuc2lnbmVkIGxvbmcgTW1pb0xlbmd0aDsKKworCXVuc2lnbmVkIGNoYXIgU2NzaUNsb2NrRGl2OworCisJdW5zaWduZWQgY2hhciBUcmFuc2Zlck1vZGU7CisKKwlpbnQgICAgICAgICAgIFRpbWVyQ291bnQ7CisJaW50ICAgICAgICAgICBTZWxlY3Rpb25UaW1lT3V0OworCVNjc2lfQ21uZCAgICAqQ3VycmVudFNDOworCS8vaW50ICAgICAgICAgICBDdXJybmV0VGFyZ2V0OworCisJaW50ICAgICAgICAgICBGaWZvQ291bnQ7CisKKyNkZWZpbmUgTVNHQlVGX1NJWkUgMjAKKwl1bnNpZ25lZCBjaGFyIE1zZ0J1ZmZlcltNU0dCVUZfU0laRV07CisJaW50IE1zZ0xlbjsKKworI2RlZmluZSBOX1RBUkdFVCA4CisJc3luY19kYXRhICAgICBTeW5jW05fVEFSR0VUXTsKKworCWNoYXIgbnNwaW5mb1sxMTBdOyAgICAgLyogZGVzY3JpcHRpb24gKi8KKwlzcGlubG9ja190IExvY2s7CisKKwlzY3NpX2luZm9fdCAgICpTY3NpSW5mbzsgLyogYXR0YWNoIDwtPiBkZXRlY3QgZ2x1ZSAqLworCisKKyNpZmRlZiBOU1BfREVCVUcKKwlpbnQgQ21kSWQ7IC8qIEFjY2VwdGVkIGNvbW1hbmQgc2VyaWFsIG51bWJlci4KKwkJICAgICAgVXNlZCBmb3IgZGVidWdnaW5nLiAgICAgICAgICAgICAqLworI2VuZGlmCit9IG5zcF9od19kYXRhOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICovCisKKy8qIENhcmQgc2VydmljZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBkZXZfbGlua190ICpuc3BfY3NfYXR0YWNoICh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICAgICBuc3BfY3NfZGV0YWNoIChkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkICAgICAgICBuc3BfY3NfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkICAgICAgICBuc3BfY3NfY29uZmlnIChkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgICAgICAgICBuc3BfY3NfZXZlbnQgIChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qIExpbnV4IFNDU0kgc3Vic3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKm5zcF9kZXRlY3QgICAgIChTY3NpX0hvc3RfVGVtcGxhdGUgKnNodCk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKK3N0YXRpYyAgICAgICAgaW50ICAgICAgICBuc3BfZGV0ZWN0X29sZCAoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHQpOworc3RhdGljICAgICAgICBpbnQgICAgICAgIG5zcF9yZWxlYXNlX29sZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisjZW5kaWYKK3N0YXRpYyBjb25zdCAgY2hhciAgICAgICpuc3BfaW5mbyAgICAgICAoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljICAgICAgICBpbnQgICAgICAgIG5zcF9wcm9jX2luZm8gICgKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LAorI2VuZGlmCisJCQkJCSBjaGFyICAgKmJ1ZmZlciwKKwkJCQkJIGNoYXIgICoqc3RhcnQsCisJCQkJCSBvZmZfdCAgIG9mZnNldCwKKwkJCQkJIGludCAgICAgbGVuZ3RoLAorI2lmICEoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDczKSkKKwkJCQkJIGludCAgICAgaG9zdG5vLAorI2VuZGlmCisJCQkJCSBpbnQgICAgIGlub3V0KTsKK3N0YXRpYyAgICAgICAgaW50ICAgICAgICBuc3BfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCogZG9uZSkoU2NzaV9DbW5kICpTQ3BudCkpOworCisvKiBFcnJvciBoYW5kbGVyICovCisvKnN0YXRpYyBpbnQgbnNwX2VoX2Fib3J0ICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsqLworLypzdGF0aWMgaW50IG5zcF9laF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCk7Ki8KK3N0YXRpYyBpbnQgbnNwX2VoX2J1c19yZXNldCAgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgaW50IG5zcF9laF9ob3N0X3Jlc2V0ICAgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIGludCBuc3BfYnVzX3Jlc2V0ICAgICAgIChuc3BfaHdfZGF0YSAqZGF0YSk7CisKKy8qICovCitzdGF0aWMgaW50ICBuc3Bod19pbml0ICAgICAgICAgICAobnNwX2h3X2RhdGEgKmRhdGEpOworc3RhdGljIGludCAgbnNwaHdfc3RhcnRfc2VsZWN0aW9uKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIHZvaWQgbnNwX3N0YXJ0X3RpbWVyICAgICAgKFNjc2lfQ21uZCAqU0NwbnQsIGludCB0aW1lKTsKK3N0YXRpYyBpbnQgIG5zcF9maWZvX2NvdW50ICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9waW9fcmVhZCAgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9waW9fd3JpdGUgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9uZXh1cyAgICAgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIG5zcF9zY3NpX2RvbmUgICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9hbmFseXplX3NkdHIgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9uZWdhdGVfc2lnbmFsICAgIChTY3NpX0NtbmQgKlNDcG50LCB1bnNpZ25lZCBjaGFyIG1hc2ssIGNoYXIgKnN0cik7CitzdGF0aWMgaW50ICBuc3BfZXhwZWN0X3NpZ25hbCAgICAoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgY2hhciBjdXJyZW50X3BoYXNlLCB1bnNpZ25lZCBjaGFyICBtYXNrKTsKK3N0YXRpYyBpbnQgIG5zcF94ZmVyICAgICAgICAgICAgIChTY3NpX0NtbmQgKlNDcG50LCBpbnQgcGhhc2UpOworc3RhdGljIGludCAgbnNwX2RhdGFwaGFzZV9ieXBhc3MgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIGludCAgbnNwX3Jlc2VsZWN0ZWQgICAgICAgKFNjc2lfQ21uZCAqU0NwbnQpOworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKm5zcF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHQpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworLy9zdGF0aWMgaXJxcmV0dXJuX3QgbnNwaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyogTW9kdWxlIGVudHJ5IHBvaW50Ki8KK3N0YXRpYyBpbnQgIF9faW5pdCBuc3BfY3NfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBuc3BfY3NfZXhpdCh2b2lkKTsKKworCisvKiBEZWJ1ZyAqLworI2lmZGVmIE5TUF9ERUJVRworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIHNob3dfcGhhc2UgICAoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBzaG93X2J1c3BoYXNlKHVuc2lnbmVkIGNoYXIgc3RhdCk7CitzdGF0aWMgdm9pZCBzaG93X21lc3NhZ2UgKG5zcF9od19kYXRhICpkYXRhKTsKKyNlbHNlCisjIGRlZmluZSBzaG93X2NvbW1hbmQocHRyKSAgIC8qICovCisjIGRlZmluZSBzaG93X3BoYXNlKFNDcG50KSAgIC8qICovCisjIGRlZmluZSBzaG93X2J1c3BoYXNlKHN0YXQpIC8qICovCisjIGRlZmluZSBzaG93X21lc3NhZ2UoZGF0YSkgIC8qICovCisjZW5kaWYKKworLyoKKyAqIFNDU0kgcGhhc2UKKyAqLworZW51bSBfc2NzaV9waGFzZSB7CisJUEhfVU5ERVRFUk1JTkVEICwKKwlQSF9BUkJTVEFSVCAgICAgLAorCVBIX1NFTFNUQVJUICAgICAsCisJUEhfU0VMRUNURUQgICAgICwKKwlQSF9DT01NQU5EICAgICAgLAorCVBIX0RBVEEgICAgICAgICAsCisJUEhfU1RBVFVTICAgICAgICwKKwlQSF9NU0dfSU4gICAgICAgLAorCVBIX01TR19PVVQgICAgICAsCisJUEhfRElTQ09OTkVDVCAgICwKKwlQSF9SRVNFTEVDVCAgICAgLAorCVBIX0FCT1JUICAgICAgICAsCisJUEhfUkVTRVQKK307CisKK2VudW0gX2RhdGFfaW5fb3V0IHsKKwlJT19VTktOT1dOLAorCUlPX0lOLAorCUlPX09VVAorfTsKKworZW51bSBfYnVyc3RfbW9kZSB7CisJQlVSU1RfSU84ICAgPSAwLAorCUJVUlNUX0lPMzIgID0gMSwKKwlCVVJTVF9NRU0zMiA9IDIsCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0NTSSBtZXNzYWFnZQorICovCisjZGVmaW5lIE1TR19DT01NQU5EX0NPTVBMRVRFIDB4MDAKKyNkZWZpbmUgTVNHX0VYVEVOREVEICAgICAgICAgMHgwMQorI2RlZmluZSBNU0dfQUJPUlQgICAgICAgICAgICAweDA2CisjZGVmaW5lIE1TR19OT19PUEVSQVRJT04gICAgIDB4MDgKKyNkZWZpbmUgTVNHX0JVU19ERVZJQ0VfUkVTRVQgMHgwYworCisjZGVmaW5lIE1TR19FWFRfU0RUUiAgICAgICAgIDB4MDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbXBhdGliaWxpdHkgZnVuY3Rpb25zCisgKi8KKworLyogZm9yIEtlcm5lbCAyLjQgKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorIyAgZGVmaW5lIHNjc2lfcmVnaXN0ZXJfaG9zdCh0ZW1wbGF0ZSkgICBzY3NpX3JlZ2lzdGVyX21vZHVsZShNT0RVTEVfU0NTSV9IQSwgdGVtcGxhdGUpCisjICBkZWZpbmUgc2NzaV91bnJlZ2lzdGVyX2hvc3QodGVtcGxhdGUpIHNjc2lfdW5yZWdpc3Rlcl9tb2R1bGUoTU9EVUxFX1NDU0lfSEEsIHRlbXBsYXRlKQorIyAgZGVmaW5lIHNjc2lfaG9zdF9wdXQoaG9zdCkgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoaG9zdCkKKwordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworIyAgZGVmaW5lIElSUV9OT05FICAgICAgLyogKi8KKyMgIGRlZmluZSBJUlFfSEFORExFRCAgIC8qICovCisjICBkZWZpbmUgSVJRX1JFVFZBTCh4KSAvKiAqLworCisvKiBUaGlzIGlzIGFkLWhvYyB2ZXJzaW9uIG9mIHNjc2lfaG9zdF9nZXRfbmV4dCgpICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdF9nZXRfbmV4dChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJcmV0dXJuIHNjc2lfaG9zdGxpc3Q7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGhvc3QtPm5leHQ7CisJfQorfQorCisvKiBUaGlzIGlzIGFkLWhvYyB2ZXJzaW9uIG9mIHNjc2lfaG9zdF9obl9nZXQoKSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfaG5fZ2V0KHVuc2lnbmVkIHNob3J0IGhvc3RubykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCisJZm9yIChob3N0ID0gc2NzaV9ob3N0X2dldF9uZXh0KE5VTEwpOyBob3N0ICE9IE5VTEw7CisJICAgICBob3N0ID0gc2NzaV9ob3N0X2dldF9uZXh0KGhvc3QpKSB7CisJCWlmIChob3N0LT5ob3N0X25vID09IGhvc3RubykgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gaG9zdDsKK30KKworc3RhdGljIHZvaWQgY3NfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW50IGZ1bmMsIGludCByZXQpCit7CisJZXJyb3JfaW5mb190IGVyciA9IHsgZnVuYywgcmV0IH07CisJcGNtY2lhX3JlcG9ydF9lcnJvcihoYW5kbGUsICZlcnIpOworfQorCisvKiBzY2F0dGVyLWdhdGhlciB0YWJsZSAqLworIyAgZGVmaW5lIEJVRkZFUl9BRERSIChTQ3BudC0+U0NwLmJ1ZmZlci0+YWRkcmVzcykKKyNlbmRpZgorCisvKiBmb3IgS2VybmVsIDIuNiAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorLyogc2NhdHRlci1nYXRoZXIgdGFibGUgKi8KKyMgIGRlZmluZSBCVUZGRVJfQUREUiAoKGNoYXIgKikoKHVuc2lnbmVkIGludCkoU0NwbnQtPlNDcC5idWZmZXItPnBhZ2UpICsgU0NwbnQtPlNDcC5idWZmZXItPm9mZnNldCkpCisjZW5kaWYKKworI2VuZGlmICAvKl9fbnNwX2NzX18qLworLyogZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU1YzYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfZGVidWcuYwpAQCAtMCwwICsxLDIxNSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZWJ1ZyByb3V0aW5lcyBmb3IgbnNwX2NzCisgICAgICBCeTogWU9LT1RBIEhpcm9zaGkgPHlva290YUBuZXRsYWIuaXMudHN1a3ViYS5hYy5qcD4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogJElkOiBuc3BfZGVidWcuYyx2IDEuMyAyMDAzLzA3LzI2IDE0OjIxOjA5IGVsY2EgRXhwICQgKi8KKworLyoKKyAqIFNob3cgdGhlIGNvbW1hbmQgZGF0YSBvZiBhIGNvbW1hbmQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdW5rbm93bltdID0gIlVOS05PV04iOworCitzdGF0aWMgY29uc3QgY2hhciAqIGdyb3VwXzBfY29tbWFuZHNbXSA9IHsKKy8qIDAwLTAzICovICJUZXN0IFVuaXQgUmVhZHkiLCAiUmV6ZXJvIFVuaXQiLCB1bmtub3duLCAiUmVxdWVzdCBTZW5zZSIsCisvKiAwNC0wNyAqLyAiRm9ybWF0IFVuaXQiLCAiUmVhZCBCbG9jayBMaW1pdHMiLCB1bmtub3duLCAiUmVhc3NzaWduIEJsb2NrcyIsCisvKiAwOC0wZCAqLyAiUmVhZCAoNikiLCB1bmtub3duLCAiV3JpdGUgKDYpIiwgIlNlZWsgKDYpIiwgdW5rbm93biwgdW5rbm93biwKKy8qIDBlLTEyICovIHVua25vd24sICJSZWFkIFJldmVyc2UiLCAiV3JpdGUgRmlsZW1hcmtzIiwgIlNwYWNlIiwgIklucXVpcnkiLCAgCisvKiAxMy0xNiAqLyB1bmtub3duLCAiUmVjb3ZlciBCdWZmZXJlZCBEYXRhIiwgIk1vZGUgU2VsZWN0IiwgIlJlc2VydmUiLAorLyogMTctMWIgKi8gIlJlbGVhc2UiLCAiQ29weSIsICJFcmFzZSIsICJNb2RlIFNlbnNlIiwgIlN0YXJ0L1N0b3AgVW5pdCIsCisvKiAxYy0xZCAqLyAiUmVjZWl2ZSBEaWFnbm9zdGljIiwgIlNlbmQgRGlhZ25vc3RpYyIsIAorLyogMWUtMWYgKi8gIlByZXZlbnQvQWxsb3cgTWVkaXVtIFJlbW92YWwiLCB1bmtub3duLAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqZ3JvdXBfMV9jb21tYW5kc1tdID0geworLyogMjAtMjIgKi8gIHVua25vd24sIHVua25vd24sIHVua25vd24sCisvKiAyMy0yOCAqLyB1bmtub3duLCB1bmtub3duLCAiUmVhZCBDYXBhY2l0eSIsIHVua25vd24sIHVua25vd24sICJSZWFkICgxMCkiLAorLyogMjktMmQgKi8gdW5rbm93biwgIldyaXRlICgxMCkiLCAiU2VlayAoMTApIiwgdW5rbm93biwgdW5rbm93biwKKy8qIDJlLTMxICovICJXcml0ZSBWZXJpZnkiLCJWZXJpZnkiLCAiU2VhcmNoIEhpZ2giLCAiU2VhcmNoIEVxdWFsIiwKKy8qIDMyLTM0ICovICJTZWFyY2ggTG93IiwgIlNldCBMaW1pdHMiLCAiUHJlZmV0Y2ggb3IgUmVhZCBQb3NpdGlvbiIsIAorLyogMzUtMzcgKi8gIlN5bmNocm9uaXplIENhY2hlIiwiTG9jay9VbmxvY2sgQ2FjaGUiLCAiUmVhZCBEZWZlY3QgRGF0YSIsCisvKiAzOC0zYyAqLyAiTWVkaXVtIFNjYW4iLCAiQ29tcGFyZSIsIkNvcHkgVmVyaWZ5IiwgIldyaXRlIEJ1ZmZlciIsICJSZWFkIEJ1ZmZlciIsCisvKiAzZC0zZiAqLyAiVXBkYXRlIEJsb2NrIiwgIlJlYWQgTG9uZyIsICAiV3JpdGUgTG9uZyIsCit9OworCisKK3N0YXRpYyBjb25zdCBjaGFyICpncm91cF8yX2NvbW1hbmRzW10gPSB7CisvKiA0MC00MSAqLyAiQ2hhbmdlIERlZmluaXRpb24iLCAiV3JpdGUgU2FtZSIsIAorLyogNDItNDggKi8gIlJlYWQgU3ViLUNoKGNkKSIsICJSZWFkIFRPQyIsICJSZWFkIEhlYWRlcihjZCkiLCAiUGxheSBBdWRpbyhjZCkiLCB1bmtub3duLCAiUGxheSBBdWRpbyBNU0YoY2QpIiwgIlBsYXkgQXVkaW8gVHJhY2svSW5kZXgoY2QpIiwgCisvKiA0OS00ZiAqLyAiUGxheSBUcmFjayBSZWxhdGl2ZSgxMCkoY2QpIiwgdW5rbm93biwgIlBhdXNlL1Jlc3VtZShjZCkiLCAiTG9nIFNlbGVjdCIsICJMb2cgU2Vuc2UiLCB1bmtub3duLCB1bmtub3duLAorLyogNTAtNTUgKi8gdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgIk1vZGUgU2VsZWN0ICgxMCkiLAorLyogNTYtNWIgKi8gdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgdW5rbm93biwgIk1vZGUgU2Vuc2UgKDEwKSIsIHVua25vd24sCisvKiA1Yy01ZiAqLyB1bmtub3duLCB1bmtub3duLCB1bmtub3duLAorfTsKKworI2RlZmluZSBncm91cChvcGNvZGUpICgoKG9wY29kZSkgPj4gNSkgJiA3KQorCisjZGVmaW5lIFJFU0VSVkVEX0dST1VQICAwCisjZGVmaW5lIFZFTkRPUl9HUk9VUCAgICAxCisjZGVmaW5lIE5PVEVYVF9HUk9VUCAgICAyCisKK3N0YXRpYyBjb25zdCBjaGFyICoqY29tbWFuZHNbXSA9IHsKKyAgICBncm91cF8wX2NvbW1hbmRzLCBncm91cF8xX2NvbW1hbmRzLCBncm91cF8yX2NvbW1hbmRzLCAKKyAgICAoY29uc3QgY2hhciAqKikgUkVTRVJWRURfR1JPVVAsIChjb25zdCBjaGFyICoqKSBSRVNFUlZFRF9HUk9VUCwgCisgICAgKGNvbnN0IGNoYXIgKiopIE5PVEVYVF9HUk9VUCwgKGNvbnN0IGNoYXIgKiopIFZFTkRPUl9HUk9VUCwgCisgICAgKGNvbnN0IGNoYXIgKiopIFZFTkRPUl9HUk9VUAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmVzZXJ2ZWRbXSA9ICJSRVNFUlZFRCI7CitzdGF0aWMgY29uc3QgY2hhciB2ZW5kb3JbXSA9ICJWRU5ET1IgU1BFQ0lGSUMiOworCitzdGF0aWMgdm9pZCBwcmludF9vcGNvZGVrKHVuc2lnbmVkIGNoYXIgb3Bjb2RlKQoreworCWNvbnN0IGNoYXIgKip0YWJsZSA9IGNvbW1hbmRzWyBncm91cChvcGNvZGUpIF07CisKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSB0YWJsZSkgeworCWNhc2UgUkVTRVJWRURfR1JPVVA6CisJCXByaW50aygiJXNbJTAyeF0gIiwgcmVzZXJ2ZWQsIG9wY29kZSk7IAorCQlicmVhazsKKwljYXNlIE5PVEVYVF9HUk9VUDoKKwkJcHJpbnRrKCIlcyhub3RleHQpWyUwMnhdICIsIHVua25vd24sIG9wY29kZSk7IAorCQlicmVhazsKKwljYXNlIFZFTkRPUl9HUk9VUDoKKwkJcHJpbnRrKCIlc1slMDJ4XSAiLCB2ZW5kb3IsIG9wY29kZSk7IAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAodGFibGVbb3Bjb2RlICYgMHgxZl0gIT0gdW5rbm93bikKKwkJCXByaW50aygiJXNbJTAyeF0gIiwgdGFibGVbb3Bjb2RlICYgMHgxZl0sIG9wY29kZSk7CisJCWVsc2UKKwkJCXByaW50aygiJXNbJTAyeF0gIiwgdW5rbm93biwgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9jb21tYW5kayAodW5zaWduZWQgY2hhciAqY29tbWFuZCkKK3sKKwlpbnQgaSwgczsKKwlwcmludGsoS0VSTl9ERUJVRyk7CisJcHJpbnRfb3Bjb2Rlayhjb21tYW5kWzBdKTsKKwkvKnByaW50ayhLRVJOX0RFQlVHICIlcyAiLCBfX0ZVTkNUSU9OX18pOyovCisJaWYgKChjb21tYW5kWzBdID4+IDUpID09IDYgfHwKKwkgICAgKGNvbW1hbmRbMF0gPj4gNSkgPT0gNyApIHsKKwkJcyA9IDEyOyAvKiB2ZW5kZXIgc3BlY2lmaWMgKi8KKwl9IGVsc2UgeworCQlzID0gQ09NTUFORF9TSVpFKGNvbW1hbmRbMF0pOworCX0KKwlmb3IgKCBpID0gMTsgaSA8IHM7ICsraSkgeworCQlwcmludGsoIiUwMnggIiwgY29tbWFuZFtpXSk7CisJfQorCisJc3dpdGNoIChzKSB7CisJY2FzZSA2OgorCQlwcmludGsoIkxCQT0lZCBsZW49JWQiLAorCQkgICAgICAgKCgodW5zaWduZWQgaW50KWNvbW1hbmRbMV0gJiAweDBmKSA8PCAxNikgfAorCQkgICAgICAgKCAodW5zaWduZWQgaW50KWNvbW1hbmRbMl0gICAgICAgICA8PCAgOCkgfAorCQkgICAgICAgKCAodW5zaWduZWQgaW50KWNvbW1hbmRbM10gICAgICAgICAgICAgICksCisJCSAgICAgICAodW5zaWduZWQgaW50KWNvbW1hbmRbNF0KKwkJCSk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXByaW50aygiTEJBPSVkIGxlbj0lZCIsCisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzJdIDw8IDI0KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzNdIDw8IDE2KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzRdIDw8ICA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzVdICAgICAgKSwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbN10gPDwgIDgpIHwKKwkJICAgICAgICgodW5zaWduZWQgaW50KWNvbW1hbmRbOF0gICAgICApCisJCSAgICAgICApOworCQlicmVhazsKKwljYXNlIDEyOgorCQlwcmludGsoIkxCQT0lZCBsZW49JWQiLAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFsyXSA8PCAyNCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFszXSA8PCAxNikgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs0XSA8PCAgOCkgfAorCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpY29tbWFuZFs1XSAgICAgICksCisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzZdIDw8IDI0KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzddIDw8IDE2KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzhdIDw8ICA4KSB8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCljb21tYW5kWzldICAgICAgKQorCQkgICAgICAgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJcHJpbnRfY29tbWFuZGsoU0NwbnQtPmNtbmQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3BoYXNlKFNjc2lfQ21uZCAqU0NwbnQpCit7CisJaW50IGkgPSBTQ3BudC0+U0NwLnBoYXNlOworCisJY2hhciAqcGhbXSA9IHsKKwkJIlBIX1VOREVURVJNSU5FRCIsCisJCSJQSF9BUkJTVEFSVCIsCisJCSJQSF9TRUxTVEFSVCIsCisJCSJQSF9TRUxFQ1RFRCIsCisJCSJQSF9DT01NQU5EIiwKKwkJIlBIX0RBVEEiLAorCQkiUEhfU1RBVFVTIiwKKwkJIlBIX01TR19JTiIsCisJCSJQSF9NU0dfT1VUIiwKKwkJIlBIX0RJU0NPTk5FQ1QiLAorCQkiUEhfUkVTRUxFQ1QiCisJfTsKKworCWlmICggaSA8IFBIX1VOREVURVJNSU5FRCB8fCBpID4gUEhfUkVTRUxFQ1QgKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpIHBoYXNlOiB1bmtub3duKCVkKVxuIiwgaSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAic2NzaSBwaGFzZTogJXNcbiIsIHBoW2ldKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc2hvd19idXNwaGFzZSh1bnNpZ25lZCBjaGFyIHN0YXQpCit7CisJc3dpdGNoKHN0YXQpIHsKKwljYXNlIEJVU1BIQVNFX0NPTU1BTkQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJCVVNQSEFTRV9DT01NQU5EXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCVVNQSEFTRV9NRVNTQUdFX0lOOgorCQlwcmludGsoS0VSTl9ERUJVRyAiQlVTUEhBU0VfTUVTU0FHRV9JTlxuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfTUVTU0FHRV9PVVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJCVVNQSEFTRV9NRVNTQUdFX09VVFxuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfREFUQV9JTjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJVU1BIQVNFX0RBVEFfSU5cbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX0RBVEFfT1VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiQlVTUEhBU0VfREFUQV9PVVRcbiIpOworCQlicmVhazsKKwljYXNlIEJVU1BIQVNFX1NUQVRVUzoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJVU1BIQVNFX1NUQVRVU1xuIik7CisJCWJyZWFrOworCWNhc2UgQlVTUEhBU0VfU0VMRUNUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiQlVTUEhBU0VfU0VMRUNUXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJVU1BIQVNFX290aGVyXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X21lc3NhZ2UobnNwX2h3X2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAibXNnOiIpOworCWZvcihpPTA7IGkgPCBkYXRhLT5Nc2dMZW47IGkrKykgeworCQlwcmludGsoIiAlMDJ4IiwgZGF0YS0+TXNnQnVmZmVyW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisvKiBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2lvLmggYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODc0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9pby5oCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICBOaW5qYVNDU0kgSS9PIGZ1bnRpb25zIAorICAgICAgQnk6IFlPS09UQSBIaXJvc2hpIDx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+CisgCisgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgICovCisKKy8qICRJZDogbnNwX2lvLmgsdiAxLjMgMjAwMy8wOC8wNCAyMToxNToyNiBlbGNhIEV4cCAkICovCisKKyNpZm5kZWYgX19OU1BfSU9fSF9fCisjZGVmaW5lIF9fTlNQX0lPX0hfXworCitzdGF0aWMgaW5saW5lICAgICAgICAgIHZvaWQgbnNwX3dyaXRlKHVuc2lnbmVkIGludCBiYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIHZhbCk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwX3JlYWQodW5zaWduZWQgaW50IGJhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpOworc3RhdGljIGlubGluZSAgICAgICAgICB2b2lkIG5zcF9pbmRleF93cml0ZSh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgUmVnaXN0ZXIsCisJCQkJCSAgICB1bnNpZ25lZCBjaGFyIFZhbHVlKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3BfaW5kZXhfcmVhZCh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGludCBSZWdpc3Rlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCYXNpYyBJTworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3Bfd3JpdGUodW5zaWduZWQgaW50ICBiYXNlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgIGluZGV4LAorCQkJICAgICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlvdXRiKHZhbCwgKGJhc2UgKyBpbmRleCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbnNwX3JlYWQodW5zaWduZWQgaW50IGJhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIGluYihiYXNlICsgaW5kZXgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbmRleGVkIElPCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBuc3BfaW5kZXhfcmVhZCh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsCisJCQkJCSAgIHVuc2lnbmVkIGludCBSZWdpc3RlcikKK3sKKwlvdXRiKFJlZ2lzdGVyLCBCYXNlQWRkciArIElOREVYUkVHKTsKKwlyZXR1cm4gaW5iKEJhc2VBZGRyICsgREFUQVJFRyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfaW5kZXhfd3JpdGUodW5zaWduZWQgaW50ICBCYXNlQWRkciwKKwkJCQkgICB1bnNpZ25lZCBpbnQgIFJlZ2lzdGVyLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgVmFsdWUpCit7CisJb3V0YihSZWdpc3RlciwgQmFzZUFkZHIgKyBJTkRFWFJFRyk7CisJb3V0YihWYWx1ZSwgQmFzZUFkZHIgKyBEQVRBUkVHKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZmlmbyBmdW5jCisgKi8KKworLyogcmVhZCA4IGJpdCBGSUZPICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX211bHRpX3JlYWRfMSh1bnNpZ25lZCBpbnQgICBCYXNlQWRkciwKKwkJCQkgICAgdW5zaWduZWQgaW50ICAgUmVnaXN0ZXIsCisJCQkJICAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJaW5zYihCYXNlQWRkciArIFJlZ2lzdGVyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9maWZvOF9yZWFkKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwkvKm5zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJidWY9MHglcCwgY291bnQ9MHglbHgiLCBidWYsIGNvdW50KTsqLworCW5zcF9tdWx0aV9yZWFkXzEoYmFzZSwgRklGT0RBVEEsIGJ1ZiwgY291bnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcmVhZCAxNiBiaXQgRklGTyAqLworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tdWx0aV9yZWFkXzIodW5zaWduZWQgaW50ICAgQmFzZUFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGludCAgIFJlZ2lzdGVyLAorCQkJCSAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCWluc3coQmFzZUFkZHIgKyBSZWdpc3RlciwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfZmlmbzE2X3JlYWQodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiYnVmPTB4JXAsIGNvdW50PTB4JWx4KjIiLCBidWYsIGNvdW50KTsKKwluc3BfbXVsdGlfcmVhZF8yKGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlYWQgMzJiaXQgRklGTyAqLworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tdWx0aV9yZWFkXzQodW5zaWduZWQgaW50ICAgQmFzZUFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGludCAgIFJlZ2lzdGVyLAorCQkJCSAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCWluc2woQmFzZUFkZHIgKyBSZWdpc3RlciwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfZmlmbzMyX3JlYWQodW5zaWduZWQgaW50ICAgYmFzZSwKKwkJCQkgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiYnVmPTB4JXAsIGNvdW50PTB4JWx4KjQiLCBidWYsIGNvdW50KTsKKwluc3BfbXVsdGlfcmVhZF80KGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogd3JpdGUgOGJpdCBGSUZPICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX211bHRpX3dyaXRlXzEodW5zaWduZWQgaW50ICAgQmFzZUFkZHIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkgICAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW91dHNiKEJhc2VBZGRyICsgUmVnaXN0ZXIsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX2ZpZm84X3dyaXRlKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJICAgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW5zcF9tdWx0aV93cml0ZV8xKGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB3cml0ZSAxNmJpdCBGSUZPICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX211bHRpX3dyaXRlXzIodW5zaWduZWQgaW50ICAgQmFzZUFkZHIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkgICAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW91dHN3KEJhc2VBZGRyICsgUmVnaXN0ZXIsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX2ZpZm8xNl93cml0ZSh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCSAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW5zcF9tdWx0aV93cml0ZV8yKGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB3cml0ZSAzMmJpdCBGSUZPICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX211bHRpX3dyaXRlXzQodW5zaWduZWQgaW50ICAgQmFzZUFkZHIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgICBSZWdpc3RlciwKKwkJCQkgICAgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW91dHNsKEJhc2VBZGRyICsgUmVnaXN0ZXIsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX2ZpZm8zMl93cml0ZSh1bnNpZ25lZCBpbnQgICBiYXNlLAorCQkJCSAgICB2b2lkICAgICAgICAgICpidWYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50KQoreworCW5zcF9tdWx0aV93cml0ZV80KGJhc2UsIEZJRk9EQVRBLCBidWYsIGNvdW50KTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tbWlvX3dyaXRlKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkgIHVuc2lnbmVkIGludCAgaW5kZXgsCisJCQkJICB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKShiYXNlICsgTlNQX01NSU9fT0ZGU0VUICsgaW5kZXgpOworCisJd3JpdGViKHZhbCwgcHRyKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG5zcF9tbWlvX3JlYWQodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQkgIHVuc2lnbmVkIGludCAgaW5kZXgpCit7CisJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoYmFzZSArIE5TUF9NTUlPX09GRlNFVCArIGluZGV4KTsKKworCXJldHVybiByZWFkYihwdHIpOworfQorCisvKi0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG5zcF9tbWlvX2luZGV4X3JlYWQodW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCQkJdW5zaWduZWQgaW50ICByZWcpCit7CisJdW5zaWduZWQgY2hhciAqaW5kZXhfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoYmFzZSArIE5TUF9NTUlPX09GRlNFVCArIElOREVYUkVHKTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhX3B0ciAgPSAodW5zaWduZWQgY2hhciAqKShiYXNlICsgTlNQX01NSU9fT0ZGU0VUICsgREFUQVJFRyk7CisKKwl3cml0ZWIoKHVuc2lnbmVkIGNoYXIpcmVnLCBpbmRleF9wdHIpOworCXJldHVybiByZWFkYihkYXRhX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfbW1pb19pbmRleF93cml0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJCXVuc2lnbmVkIGludCAgcmVnLAorCQkJCQl1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyICppbmRleF9wdHIgPSAodW5zaWduZWQgY2hhciAqKShiYXNlICsgTlNQX01NSU9fT0ZGU0VUICsgSU5ERVhSRUcpOworCXVuc2lnbmVkIGNoYXIgKmRhdGFfcHRyICA9ICh1bnNpZ25lZCBjaGFyICopKGJhc2UgKyBOU1BfTU1JT19PRkZTRVQgKyBEQVRBUkVHKTsKKworCXdyaXRlYigodW5zaWduZWQgY2hhcilyZWcsIGluZGV4X3B0cik7CisJd3JpdGViKHZhbCwgICAgICAgICAgICAgICAgZGF0YV9wdHIpOworfQorCisvKiByZWFkIDMyYml0IEZJRk8gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuc3BfbW1pb19tdWx0aV9yZWFkXzQodW5zaWduZWQgbG9uZyAgYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCAgIFJlZ2lzdGVyLAorCQkJCQkgdm9pZCAgICAgICAgICAqYnVmLAorCQkJCQkgdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyAqcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoYmFzZSArIFJlZ2lzdGVyKTsKKwl1bnNpZ25lZCBsb25nICp0bXAgPSAodW5zaWduZWQgbG9uZyAqKWJ1ZjsKKwlpbnQgaTsKKworCS8vbnNwX2RiZyhOU1BfREVCVUdfREFUQV9JTywgImJhc2UgMHglMGx4IHB0ciAweCVwIixiYXNlLHB0cik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkqdG1wID0gcmVhZGwocHRyKTsKKwkJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiPCVkLCVwLCVwLCVseD4iLCBpLCBwdHIsIHRtcCwgKnRtcCk7CisJCXRtcCsrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG5zcF9tbWlvX2ZpZm8zMl9yZWFkKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJCXZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkJdW5zaWduZWQgbG9uZyAgY291bnQpCit7CisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiYnVmPTB4JXAsIGNvdW50PTB4JWx4KjQiLCBidWYsIGNvdW50KTsKKwluc3BfbW1pb19tdWx0aV9yZWFkXzQoYmFzZSwgRklGT0RBVEEsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX21taW9fbXVsdGlfd3JpdGVfNCh1bnNpZ25lZCBsb25nICBiYXNlLAorCQkJCQkgIHVuc2lnbmVkIGludCAgIFJlZ2lzdGVyLAorCQkJCQkgIHZvaWQgICAgICAgICAgKmJ1ZiwKKwkJCQkJICB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nICpwdHIgPSAodW5zaWduZWQgbG9uZyAqKShiYXNlICsgUmVnaXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgKnRtcCA9ICh1bnNpZ25lZCBsb25nICopYnVmOworCWludCBpOworCisJLy9uc3BfZGJnKE5TUF9ERUJVR19EQVRBX0lPLCAiYmFzZSAweCUwbHggcHRyIDB4JXAiLGJhc2UscHRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXdyaXRlbCgqdG1wLCBwdHIpOworCQkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICI8JWQsJXAsJXAsJWx4PiIsIGksIHB0ciwgdG1wLCAqdG1wKTsKKwkJdG1wKys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnNwX21taW9fZmlmbzMyX3dyaXRlKHVuc2lnbmVkIGludCAgIGJhc2UsCisJCQkJCSB2b2lkICAgICAgICAgICpidWYsCisJCQkJCSB1bnNpZ25lZCBsb25nICBjb3VudCkKK3sKKwkvL25zcF9kYmcoTlNQX0RFQlVHX0RBVEFfSU8sICJidWY9MHglcCwgY291bnQ9MHglbHgqNCIsIGJ1ZiwgY291bnQpOworCW5zcF9tbWlvX211bHRpX3dyaXRlXzQoYmFzZSwgRklGT0RBVEEsIGJ1ZiwgY291bnQpOworfQorCisKKworI2VuZGlmCisvKiBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX21lc3NhZ2UuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX21lc3NhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA1NzczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfbWVzc2FnZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgTmluamFTQ1NJLTMgbWVzc2FnZSBoYW5kbGVyCisgICAgICBCeTogWU9LT1RBIEhpcm9zaGkgPHlva290YUBuZXRsYWIuaXMudHN1a3ViYS5hYy5qcD4KKworICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKy8qICRJZDogbnNwX21lc3NhZ2UuYyx2IDEuNiAyMDAzLzA3LzI2IDE0OjIxOjA5IGVsY2EgRXhwICQgKi8KKworc3RhdGljIHZvaWQgbnNwX21lc3NhZ2VfaW4oU2NzaV9DbW5kICpTQ3BudCkKK3sKKwl1bnNpZ25lZCBpbnQgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCW5zcF9od19kYXRhICAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YV9yZWcsIGNvbnRyb2xfcmVnOworCWludCAgICAgICAgICAgcmV0LCBsZW47CisKKwkvKgorCSAqIFhYWDogTlNQIFFVSVJLCisJICogTlNQIGludm9rZSBpbnRlcnJ1cHRzIG9ubHkgaW4gdGhlIGNhc2Ugb2Ygc2NzaSBwaGFzZSBjaGFuZ2VzLAorCSAqIHRoZXJlZm9yZSB3ZSBzaG91bGQgcG9sbCB0aGUgc2NzaSBwaGFzZSBoZXJlIHRvIGNhdGNoIAorCSAqIHRoZSBuZXh0ICJtc2cgaW4iIGlmIGV4aXN0cyAobm8gc2NzaSBwaGFzZSBjaGFuZ2VzKS4KKwkgKi8KKwlyZXQgPSAxNjsKKwlsZW4gPSAwOworCisJbnNwX2RiZyhOU1BfREVCVUdfTVNHSU5PQ0NVUiwgIm1zZ2luIGxvb3AiKTsKKwlkbyB7CisJCS8qIHJlYWQgZGF0YSAqLworCQlkYXRhX3JlZyA9IG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lEQVRBSU4pOworCisJCS8qIGFzc2VydCBBQ0sgKi8KKwkJY29udHJvbF9yZWcgPSBuc3BfaW5kZXhfcmVhZChiYXNlLCBTQ1NJQlVTQ1RSTCk7CisJCWNvbnRyb2xfcmVnIHw9IFNDU0lfQUNLOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIGNvbnRyb2xfcmVnKTsKKwkJbnNwX25lZ2F0ZV9zaWduYWwoU0NwbnQsIEJVU01PTl9SRVEsICJtc2dpbjxSRVE+Iik7CisKKwkJZGF0YS0+TXNnQnVmZmVyW2xlbl0gPSBkYXRhX3JlZzsgbGVuKys7CisKKwkJLyogZGVhc3NlcnQgQUNLICovCisJCWNvbnRyb2xfcmVnID0gIG5zcF9pbmRleF9yZWFkKGJhc2UsIFNDU0lCVVNDVFJMKTsKKwkJY29udHJvbF9yZWcgJj0gflNDU0lfQUNLOworCQluc3BfaW5kZXhfd3JpdGUoYmFzZSwgU0NTSUJVU0NUUkwsIGNvbnRyb2xfcmVnKTsKKworCQkvKiBjYXRjaCBhIG5leHQgc2lnbmFsICovCisJCXJldCA9IG5zcF9leHBlY3Rfc2lnbmFsKFNDcG50LCBCVVNQSEFTRV9NRVNTQUdFX0lOLCBCVVNNT05fUkVRKTsKKwl9IHdoaWxlIChyZXQgPiAwICYmIE1TR0JVRl9TSVpFID4gbGVuKTsKKworCWRhdGEtPk1zZ0xlbiA9IGxlbjsKKworfQorCitzdGF0aWMgdm9pZCBuc3BfbWVzc2FnZV9vdXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludCByZXQgPSAxOworCWludCBsZW4gPSBkYXRhLT5Nc2dMZW47CisKKwkvKgorCSAqIFhYWDogTlNQIFFVSVJLCisJICogTlNQIGludm9rZSBpbnRlcnJ1cHRzIG9ubHkgaW4gdGhlIGNhc2Ugb2Ygc2NzaSBwaGFzZSBjaGFuZ2VzLAorCSAqIHRoZXJlZm9yZSB3ZSBzaG91bGQgcG9sbCB0aGUgc2NzaSBwaGFzZSBoZXJlIHRvIGNhdGNoIAorCSAqIHRoZSBuZXh0ICJtc2cgb3V0IiBpZiBleGlzdHMgKG5vIHNjc2kgcGhhc2UgY2hhbmdlcykuCisJICovCisKKwluc3BfZGJnKE5TUF9ERUJVR19NU0dPVVRPQ0NVUiwgIm1zZ291dCBsb29wIik7CisJZG8geworCQlpZiAobnNwX3hmZXIoU0NwbnQsIEJVU1BIQVNFX01FU1NBR0VfT1VUKSkgeworCQkJbnNwX21zZyhLRVJOX0RFQlVHLCAibXNnb3V0OiB4ZmVyIHNob3J0Iik7CisJCX0KKworCQkvKiBjYXRjaCBhIG5leHQgc2lnbmFsICovCisJCXJldCA9IG5zcF9leHBlY3Rfc2lnbmFsKFNDcG50LCBCVVNQSEFTRV9NRVNTQUdFX09VVCwgQlVTTU9OX1JFUSk7CisJfSB3aGlsZSAocmV0ID4gMCAmJiBsZW4tLSA+IDApOworCit9CisKKy8qIGVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjZiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBkcml2ZXIgZm9yIHRoZSBRbG9naWMgU0NTSSBjYXJkCisKKyAgICBxbG9naWNfY3MuYyAxLjc5IDIwMDAvMDYvMTIgMjE6Mjc6MjYKKworICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKworICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUworICAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgICAgVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgICAgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQgQS4gSGluZHMKKyAgICBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKKyAgICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAgICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisgICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisgICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAgICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKKyAgICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworICAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICIuLi9xbG9naWNmYXM0MDguaCIKKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisKKy8qIFNldCB0aGUgZm9sbG93aW5nIHRvIDIgdG8gdXNlIG5vcm1hbCBpbnRlcnJ1cHQgKGFjdGl2ZSBoaWdoL3RvdGVtcG9sZS0KKyAqIHRyaXN0YXRlKSwgb3RoZXJ3aXNlIHVzZSAwIChSRVFVSVJFRCBGT1IgUENNQ0lBKSBmb3IgYWN0aXZlIGxvdywgb3BlbgorICogZHJhaW4KKyAqLworI2RlZmluZSBJTlRfVFlQRQkwCisKK3N0YXRpYyBjaGFyIHFsb2dpY19uYW1lW10gPSAicWxvZ2ljX2NzIjsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwNjQ0KTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gInFsb2dpY19jcy5jIDEuNzktYWMgMjAwMi8xMC8yNiAoRGF2aWQgSGluZHMpIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBxbG9naWNmYXNfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBxbG9naWNfbmFtZSwKKwkucHJvY19uYW1lCQk9IHFsb2dpY19uYW1lLAorCS5pbmZvCQkJPSBxbG9naWNmYXM0MDhfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBxbG9naWNmYXM0MDhfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcWxvZ2ljZmFzNDA4X2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IHFsb2dpY2ZhczQwOF9kZXZpY2VfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHFsb2dpY2ZhczQwOF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtCQk9IHFsb2dpY2ZhczQwOF9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZQkJPSAxLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9pbmZvX3QgeworCWRldl9saW5rX3QgbGluazsKKwlkZXZfbm9kZV90IG5vZGU7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl1bnNpZ25lZCBzaG9ydCBtYW5mX2lkOworfSBzY3NpX2luZm9fdDsKKworc3RhdGljIHZvaWQgcWxvZ2ljX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IHFsb2dpY19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqcWxvZ2ljX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHFsb2dpY19kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJxbG9naWNfY3MiOworCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqcWxvZ2ljX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKmhvc3QsCisJCQkJZGV2X2xpbmtfdCAqbGluaywgaW50IHFiYXNlLCBpbnQgcWxpcnEpCit7CisJaW50IHFsdHlwOwkJLyogdHlwZSBvZiBjaGlwICovCisJaW50IHFpbml0aWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CS8qIHJlZ2lzdGVyZWQgaG9zdCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXY7CisKKwlxbHR5cCA9IHFsb2dpY2ZhczQwOF9nZXRfY2hpcF90eXBlKHFiYXNlLCBJTlRfVFlQRSk7CisJcWluaXRpZCA9IGhvc3QtPnRoaXNfaWQ7CisJaWYgKHFpbml0aWQgPCAwKQorCQlxaW5pdGlkID0gNzsJLyogaWYgbm8gSUQsIHVzZSA3ICovCisKKwlxbG9naWNmYXM0MDhfc2V0dXAocWJhc2UsIHFpbml0aWQsIElOVF9UWVBFKTsKKworCWhvc3QtPm5hbWUgPSBxbG9naWNfbmFtZTsKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyhob3N0LCBzaXplb2Yoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2KSk7CisJaWYgKCFzaG9zdCkKKwkJZ290byBlcnI7CisJc2hvc3QtPmlvX3BvcnQgPSBxYmFzZTsKKwlzaG9zdC0+bl9pb19wb3J0ID0gMTY7CisJc2hvc3QtPmRtYV9jaGFubmVsID0gLTE7CisJaWYgKHFsaXJxICE9IC0xKQorCQlzaG9zdC0+aXJxID0gcWxpcnE7CisKKwlwcml2ID0gZ2V0X3ByaXZfYnlfaG9zdChzaG9zdCk7CisJcHJpdi0+cWxpcnEgPSBxbGlycTsKKwlwcml2LT5xYmFzZSA9IHFiYXNlOworCXByaXYtPnFpbml0aWQgPSBxaW5pdGlkOworCXByaXYtPnNob3N0ID0gc2hvc3Q7CisJcHJpdi0+aW50X3R5cGUgPSBJTlRfVFlQRTsJCQkJCQorCisJaWYgKHJlcXVlc3RfaXJxKHFsaXJxLCBxbG9naWNmYXM0MDhfaWhhbmRsLCAwLCBxbG9naWNfbmFtZSwgc2hvc3QpKQorCQlnb3RvIGZyZWVfc2NzaV9ob3N0OworCisJc3ByaW50Zihwcml2LT5xaW5mbywKKwkJIlFsb2dpY2ZhcyBEcml2ZXIgdmVyc2lvbiAwLjQ2LCBjaGlwICUwMlggYXQgJTAzWCwgSVJRICVkLCBUUGRtYTolZCIsCisJCXFsdHlwLCBxYmFzZSwgcWxpcnEsIFFMX1RVUkJPX1BETUEpOworCisJaWYgKHNjc2lfYWRkX2hvc3Qoc2hvc3QsIE5VTEwpKQorCQlnb3RvIGZyZWVfaW50ZXJydXB0OworCisJc2NzaV9zY2FuX2hvc3Qoc2hvc3QpOworCisJcmV0dXJuIHNob3N0OworCitmcmVlX2ludGVycnVwdDoKKwlmcmVlX2lycShxbGlycSwgc2hvc3QpOworCitmcmVlX3Njc2lfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwkKK2VycjoKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBkZXZfbGlua190ICpxbG9naWNfYXR0YWNoKHZvaWQpCit7CisJc2NzaV9pbmZvX3QgKmluZm87CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlpbnQgcmV0OworCisJREVCVUcoMCwgInFsb2dpY19hdHRhY2goKVxuIik7CisKKwkvKiBDcmVhdGUgbmV3IFNDU0kgZGV2aWNlICovCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJbGluayA9ICZpbmZvLT5saW5rOworCWxpbmstPnByaXYgPSBpbmZvOworCWxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJbGluay0+aW8uSU9BZGRyTGluZXMgPSAxMDsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworCWxpbmstPmNvbmYuVmNjID0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnFsb2dpY19ldmVudDsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9IENTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfCBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gMCkgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQlxbG9naWNfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbGluazsKK30JCQkJLyogcWxvZ2ljX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcWxvZ2ljX2RldGFjaChkZXZfbGlua190ICogbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisKKwlERUJVRygwLCAicWxvZ2ljX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCWlmICgqbGlua3AgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJcWxvZ2ljX3JlbGVhc2UobGluayk7CisKKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCWtmcmVlKGxpbmstPnByaXYpOworCit9CQkJCS8qIHFsb2dpY19kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgcWxvZ2ljX2NvbmZpZyhkZXZfbGlua190ICogbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXNjc2lfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOworCXVuc2lnbmVkIHNob3J0IHR1cGxlX2RhdGFbMzJdOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisKKwlERUJVRygwLCAicWxvZ2ljX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKwl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIHR1cGxlX2RhdGE7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSkKKwkJaW5mby0+bWFuZl9pZCA9IGxlMTZfdG9fY3B1KHR1cGxlLlR1cGxlRGF0YVswXSk7CisKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQkJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleDsKKwkJbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0uYmFzZTsKKwkJbGluay0+aW8uTnVtUG9ydHMxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0ubGVuOworCQlpZiAobGluay0+aW8uQmFzZVBvcnQxICE9IDApIHsKKwkJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhoYW5kbGUsICZsaW5rLT5pbyk7CisJCQlpZiAoaSA9PSBDU19TVUNDRVNTKQorCQkJCWJyZWFrOworCQl9CisJICAgICAgbmV4dF9lbnRyeToKKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl9CisKKwlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworCisJaWYgKChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9NQUNOSUNBKSB8fCAoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfUElPTkVFUikgfHwgKGluZm8tPm1hbmZfaWQgPT0gMHgwMDk4KSkgeworCQkvKiBzZXQgQVRBY21kICovCisJCW91dGIoMHhiNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHhkKTsKKwkJb3V0YigweDI0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDkpOworCQlvdXRiKDB4MDQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJfQorCisJLyogVGhlIEtYTC04MTBBTiBoYXMgYSBiaWdnZXIgSU8gcG9ydCB3aW5kb3cgKi8KKwlpZiAobGluay0+aW8uTnVtUG9ydHMxID09IDMyKQorCQlob3N0ID0gcWxvZ2ljX2RldGVjdCgmcWxvZ2ljZmFzX2RyaXZlcl90ZW1wbGF0ZSwgbGluaywKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSArIDE2LCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWVsc2UKKwkJaG9zdCA9IHFsb2dpY19kZXRlY3QoJnFsb2dpY2Zhc19kcml2ZXJfdGVtcGxhdGUsIGxpbmssCisJCQlsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisJCisJaWYgKCFob3N0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBTQ1NJIGRldmljZXMgZm91bmRcbiIsIHFsb2dpY19uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3ByaW50ZihpbmZvLT5ub2RlLmRldl9uYW1lLCAic2NzaSVkIiwgaG9zdC0+aG9zdF9ubyk7CisJbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisJaW5mby0+aG9zdCA9IGhvc3Q7CisKK291dDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCXJldHVybjsKKworY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCWxpbmstPmRldiA9IE5VTEw7CisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKwlyZXR1cm47CisKK30JCQkJLyogcWxvZ2ljX2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcWxvZ2ljX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisKKwlERUJVRygwLCAicWxvZ2ljX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisJc2NzaV9yZW1vdmVfaG9zdChpbmZvLT5ob3N0KTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCisJZnJlZV9pcnEobGluay0+aXJxLkFzc2lnbmVkSVJRLCBpbmZvLT5ob3N0KTsKKworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKwlzY3NpX2hvc3RfcHV0KGluZm8tPmhvc3QpOworCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHFsb2dpY19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpCit7CisJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCisJREVCVUcoMSwgInFsb2dpY19ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJCXFsb2dpY19yZWxlYXNlKGxpbmspOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJcWxvZ2ljX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQkJaWYgKChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9NQUNOSUNBKSB8fCAoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfUElPTkVFUikgfHwgKGluZm8tPm1hbmZfaWQgPT0gMHgwMDk4KSkgeworCQkJCW91dGIoMHg4MCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHhkKTsKKwkJCQlvdXRiKDB4MjQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4OSk7CisJCQkJb3V0YigweDA0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweGQpOworCQkJfQorCQkJLyogVWdnZ2dsbGx5eXl5ISEhICovCisJCQlxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KE5VTEwpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30JCQkJLyogcWxvZ2ljX2V2ZW50ICovCisKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHFsb2dpY19jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCS5uYW1lCQk9ICJxbG9naWNfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBxbG9naWNfYXR0YWNoLAorCS5kZXRhY2gJCT0gcWxvZ2ljX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcWxvZ2ljX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnFsb2dpY19jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9xbG9naWNfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnFsb2dpY19jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworTU9EVUxFX0FVVEhPUigiVG9tIFplcnVjaGEsIE1pY2hhZWwgR3JpZmZpdGgiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgUENNQ0lBIFFsb2dpYyBGQVMgU0NTSSBjb250cm9sbGVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoaW5pdF9xbG9naWNfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9xbG9naWNfY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1N2QwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKQEAgLTAsMCArMSwxMDIyIEBACisvKgorKiAgc3ltNTNjNTAwX2NzLmMJQm9iIFRyYWN5IChyY3RAZnJ1cy5jb20pCisqCisqICBBIHJld3JpdGUgb2YgdGhlIHBjbWNpYS1jcyBhZGQtb24gZHJpdmVyIGZvciBuZXdlciAoY2lyY2EgMTk5NykKKyogIE5ldyBNZWRpYSBCdXMgVG9hc3RlciBQQ01DSUEgU0NTSSBjYXJkcyB1c2luZyB0aGUgU3ltYmlvcyBMb2dpYworKiAgNTNjNTAwIGNvbnRyb2xsZXI6IGludGVuZGVkIGZvciB1c2Ugd2l0aCAyLjYgYW5kIGxhdGVyIGtlcm5lbHMuCisqICBUaGUgcGNtY2lhLWNzIGFkZC1vbiB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyIGlzIG5vdCBzdXBwb3J0ZWQKKyogIGJleW9uZCAyLjQuICBJdCBjb25zaXN0ZWQgb2YgdGhyZWUgZmlsZXMgd2l0aCBoaXN0b3J5L2NvcHlyaWdodAorKiAgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyoKKyogIFNZTTUzQzUwMC5oCisqCUJvYiBUcmFjeSAocmN0QGZydXMuY29tKQorKglPcmlnaW5hbCBieSBUb20gQ29ybmVyICh0Y29ybmVyQHZpYS5hdCkuCisqCUFkYXB0ZWQgZnJvbSBOQ1I1M2M0MDZhLmggd2hpY2ggaXMgQ29weXJpZ2h0ZWQgKEMpIDE5OTQKKyoJTm9ybXVuZHMgU2F1bWFuaXMgKG5vcm11bmRzQHJ4LnRlY2guc3doLmx2KQorKgorKiAgU1lNNTNDNTAwLmMKKyoJQm9iIFRyYWN5IChyY3RAZnJ1cy5jb20pCisqCU9yaWdpbmFsIGRyaXZlciBieSBUb20gQ29ybmVyICh0Y29ybmVyQHZpYS5hdCkgd2FzIGFkYXB0ZWQKKyoJZnJvbSBOQ1I1M2M0MDZhLmMgd2hpY2ggaXMgQ29weXJpZ2h0ZWQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgCisqCU5vcm11bmRzIFNhdW1hbmlzIChub3JtdW5kc0BmaS5pYm0uY29tKQorKgorKiAgc3ltNTNjNTAwLmMKKyoJQm9iIFRyYWN5IChyY3RAZnJ1cy5jb20pCisqCU9yaWdpbmFsIGJ5IFRvbSBDb3JuZXIgKHRjb3JuZXJAdmlhLmF0KSB3YXMgYWRhcHRlZCBmcm9tIGEKKyoJZHJpdmVyIGZvciB0aGUgUWxvZ2ljIFNDU0kgY2FyZCB3cml0dGVuIGJ5CisqCURhdmlkIEhpbmRzIChkaGluZHNAYWxsZWdyby5zdGFuZm9yZC5lZHUpLgorKiAKKyogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogIGxhdGVyIHZlcnNpb24uCisqCisqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2RlZmluZSBTWU01M0M1MDBfREVCVUcgMAorI2RlZmluZSBWRVJCT1NFX1NZTTUzQzUwMF9ERUJVRyAwCisKKy8qCisqICBTZXQgdGhpcyB0byAwIGlmIHlvdSBlbmNvdW50ZXIga2VybmVsIGxvY2t1cHMgd2hpbGUgdHJhbnNmZXJyaW5nIAorKiAgZGF0YSBpbiBQSU8gbW9kZS4gIE5vdGUgdGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEgInN5c2ZzIi4KKyovCisjZGVmaW5lIFVTRV9GQVNUX1BJTyAxCisKKy8qID09PT09PT09PT09PT09PSBFbmQgb2YgdXNlciBjb25maWd1cmFibGUgcGFyYW1ldGVycyA9PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9Cisic3ltNTNjNTAwX2NzLmMgMC45YyAyMDA0LzEwLzI3IChCb2IgVHJhY3kpIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNkZWZpbmUgU1lOQ19NT0RFIDAgCQkvKiBTeW5jaHJvbm91cyB0cmFuc2ZlciBtb2RlICovCisKKy8qIERlZmF1bHQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDMV9JTUcgICAweDA3CQkvKiBJRD03ICovCisjZGVmaW5lIEMyX0lNRyAgIDB4NDgJCS8qIEZFIFNDU0kyICovCisjZGVmaW5lIEMzX0lNRyAgIDB4MjAJCS8qIENEQiAqLworI2RlZmluZSBDNF9JTUcgICAweDA0CQkvKiBBTkUgKi8KKyNkZWZpbmUgQzVfSU1HICAgMHhhNAkJLyogPyBjaGFuZ2VkIGZyb20gYjY9IEFBIFBJIFNJRSBQT0wgKi8KKyNkZWZpbmUgQzdfSU1HICAgMHg4MAkJLyogYWRkZWQgZm9yIFNZTTUzQzUwMCB0LiBjb3JuZXIgKi8KKworLyogSGFyZHdhcmUgUmVnaXN0ZXJzOiBvZmZzZXRzIGZyb20gaW9fcG9ydCAoYmFzZSkgKi8KKworLyogQ29udHJvbCBSZWdpc3RlciBTZXQgMCAqLworI2RlZmluZSBUQ19MU0IJCTB4MDAJCS8qIHRyYW5zZmVyIGNvdW50ZXIgbHNiICovCisjZGVmaW5lIFRDX01TQgkJMHgwMQkJLyogdHJhbnNmZXIgY291bnRlciBtc2IgKi8KKyNkZWZpbmUgU0NTSV9GSUZPCTB4MDIJCS8qIHNjc2kgZmlmbyByZWdpc3RlciAqLworI2RlZmluZSBDTURfUkVHCQkweDAzCQkvKiBjb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFNUQVRfUkVHCTB4MDQJCS8qIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBERVNUX0lECQkweDA0CQkvKiBzZWxlY3Rpb24vcmVzZWxlY3Rpb24gYnVzIGlkICovCisjZGVmaW5lIElOVF9SRUcJCTB4MDUJCS8qIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JUSU1PVVQJMHgwNQkJLyogc2VsZWN0L3Jlc2VsZWN0IHRpbWVvdXQgcmVnICovCisjZGVmaW5lIFNFUV9SRUcJCTB4MDYJCS8qIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1lOQ1BSRAkJMHgwNgkJLyogc3luY2hyb25vdXMgdHJhbnNmZXIgcGVyaW9kICovCisjZGVmaW5lIEZJRk9fRkxBR1MJMHgwNwkJLyogaW5kaWNhdGVzICMgb2YgYnl0ZXMgaW4gZmlmbyAqLworI2RlZmluZSBTWU5DT0ZGCQkweDA3CQkvKiBzeW5jaHJvbm91cyBvZmZzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ORklHMQkJMHgwOAkJLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBDTEtDT05WCQkweDA5CQkvKiBjbG9jayBjb252ZXJzaW9uIHJlZ2lzdGVyICovCisvKiAjZGVmaW5lIFRFU1RSRUcJMHgwQSAqLwkJLyogdGVzdCBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIENPTkZJRzIJCTB4MEIJCS8qIGNvbmZpZ3VyYXRpb24gMiByZWdpc3RlciAqLworI2RlZmluZSBDT05GSUczCQkweDBDCQkvKiBjb25maWd1cmF0aW9uIDMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ORklHNAkJMHgwRAkJLyogY29uZmlndXJhdGlvbiA0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRDX0hJR0gJCTB4MEUJCS8qIHRyYW5zZmVyIGNvdW50ZXIgaGlnaCAqLworLyogI2RlZmluZSBGSUZPX0JPVFRPTQkweDBGICovCQkvKiByZXNlcnZlIEZJRk8gYnl0ZSByZWdpc3RlciAqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIFNldCAxICovCisvKiAjZGVmaW5lIEpVTVBFUl9TRU5TRQkweDAwICovCQkvKiBqdW1wZXIgc2Vuc2UgcG9ydCByZWcgKHIvdykgKi8KKy8qICNkZWZpbmUgU1JBTV9QVFIJMHgwMSAqLwkJLyogU1JBTSBhZGRyZXNzIHBvaW50ZXIgcmVnIChyL3cpICovCisvKiAjZGVmaW5lIFNSQU1fREFUQQkweDAyICovCQkvKiBTUkFNIGRhdGEgcmVnaXN0ZXIgKHIvdykgKi8KKyNkZWZpbmUgUElPX0ZJRk8JMHgwNAkJLyogUElPIEZJRk8gcmVnaXN0ZXJzIChyL3cpICovCisvKiAjZGVmaW5lIFBJT19GSUZPMQkweDA1ICovCQkvKiAgKi8KKy8qICNkZWZpbmUgUElPX0ZJRk8yCTB4MDYgKi8JCS8qICAqLworLyogI2RlZmluZSBQSU9fRklGTzMJMHgwNyAqLwkJLyogICovCisjZGVmaW5lIFBJT19TVEFUVVMJMHgwOAkJLyogUElPIHN0YXR1cyAoci93KSAqLworLyogI2RlZmluZSBBVEFfQ01ECTB4MDkgKi8JCS8qIEFUQSBjb21tYW5kL3N0YXR1cyByZWcgKHIvdykgKi8KKy8qICNkZWZpbmUgQVRBX0VSUgkweDBBICovCQkvKiBBVEEgZmVhdHVyZXMvZXJyb3IgcmVnIChyL3cpICovCisjZGVmaW5lIFBJT19GTEFHCTB4MEIJCS8qIFBJTyBmbGFnIGludGVycnVwdCBlbmFibGUgKHIvdykgKi8KKyNkZWZpbmUgQ09ORklHNQkJMHgwOQkJLyogY29uZmlndXJhdGlvbiA1IHJlZ2lzdGVyICovCisvKiAjZGVmaW5lIFNJR05BVFVSRQkweDBFICovCQkvKiBzaWduYXR1cmUgcmVnaXN0ZXIgKHIpICovCisvKiAjZGVmaW5lIENPTkZJRzYJMHgwRiAqLwkJLyogY29uZmlndXJhdGlvbiA2IHJlZ2lzdGVyIChyKSAqLworI2RlZmluZSBDT05GSUc3CQkweDBkCisKKy8qIHNlbGVjdCByZWdpc3RlciBzZXQgMCAqLworI2RlZmluZSBSRUcwKHgpCQkob3V0YihDNF9JTUcsICh4KSArIENPTkZJRzQpKQorLyogc2VsZWN0IHJlZ2lzdGVyIHNldCAxICovCisjZGVmaW5lIFJFRzEoeCkJCW91dGIoQzdfSU1HLCAoeCkgKyBDT05GSUc3KTsgb3V0YihDNV9JTUcsICh4KSArIENPTkZJRzUpCisKKyNpZiBTWU01M0M1MDBfREVCVUcKKyNkZWZpbmUgREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIERFQih4KQorI2VuZGlmCisKKyNpZiBWRVJCT1NFX1NZTTUzQzUwMF9ERUJVRworI2RlZmluZSBWREVCKHgpIHgKKyNlbHNlCisjZGVmaW5lIFZERUIoeCkKKyNlbmRpZgorCisjZGVmaW5lIExPQURfRE1BX0NPVU5UKHgsIGNvdW50KSBcCisgIG91dGIoY291bnQgJiAweGZmLCAoeCkgKyBUQ19MU0IpOyBcCisgIG91dGIoKGNvdW50ID4+IDgpICYgMHhmZiwgKHgpICsgVENfTVNCKTsgXAorICBvdXRiKChjb3VudCA+PiAxNikgJiAweGZmLCAoeCkgKyBUQ19ISUdIKTsKKworLyogQ2hpcCBjb21tYW5kcyAqLworI2RlZmluZSBETUFfT1AgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgU0NTSV9OT1AgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBGTFVTSF9GSUZPICAgICAgICAgICAweDAxCisjZGVmaW5lIENISVBfUkVTRVQgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0NTSV9SRVNFVCAgICAgICAgICAgMHgwMworI2RlZmluZSBSRVNFTEVDVCAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFNFTEVDVF9OT19BVE4gICAgICAgIDB4NDEKKyNkZWZpbmUgU0VMRUNUX0FUTiAgICAgICAgICAgMHg0MgorI2RlZmluZSBTRUxFQ1RfQVROX1NUT1AgICAgICAweDQzCisjZGVmaW5lIEVOQUJMRV9TRUwgICAgICAgICAgIDB4NDQKKyNkZWZpbmUgRElTQUJMRV9TRUwgICAgICAgICAgMHg0NQorI2RlZmluZSBTRUxFQ1RfQVROMyAgICAgICAgICAweDQ2CisjZGVmaW5lIFJFU0VMRUNUMyAgICAgICAgICAgIDB4NDcKKyNkZWZpbmUgVFJBTlNGRVJfSU5GTyAgICAgICAgMHgxMAorI2RlZmluZSBJTklUX0NNRF9DT01QTEVURSAgICAweDExCisjZGVmaW5lIE1TR19BQ0NFUFQgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgVFJBTlNGRVJfUEFEICAgICAgICAgMHgxOAorI2RlZmluZSBTRVRfQVROICAgICAgICAgICAgICAweDFhCisjZGVmaW5lIFJFU0VUX0FUTiAgICAgICAgICAgIDB4MWIKKyNkZWZpbmUgU0VORF9NU0cgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBTRU5EX1NUQVRVUyAgICAgICAgICAweDIxCisjZGVmaW5lIFNFTkRfREFUQSAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgRElTQ09OTl9TRVEgICAgICAgICAgMHgyMworI2RlZmluZSBURVJNSU5BVEVfU0VRICAgICAgICAweDI0CisjZGVmaW5lIFRBUkdfQ01EX0NPTVBMRVRFICAgIDB4MjUKKyNkZWZpbmUgRElTQ09OTiAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBSRUNWX01TRyAgICAgICAgICAgICAweDI4CisjZGVmaW5lIFJFQ1ZfQ01EICAgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgUkVDVl9EQVRBICAgICAgICAgICAgMHgyYQorI2RlZmluZSBSRUNWX0NNRF9TRVEgICAgICAgICAweDJiCisjZGVmaW5lIFRBUkdFVF9BQk9SVF9ETUEgICAgIDB4MDQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0cnVjdCBzY3NpX2luZm9fdCB7CisJZGV2X2xpbmtfdCBsaW5rOworCWRldl9ub2RlX3Qgbm9kZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXVuc2lnbmVkIHNob3J0IG1hbmZfaWQ7Cit9OworCisvKgorKiAgUmVwb3NpdG9yeSBmb3IgcGVyLWluc3RhbmNlIGhvc3QgZGF0YS4KKyovCitzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgeworCXN0cnVjdCBzY3NpX2NtbmQgKmN1cnJlbnRfU0M7CisJaW50IGZhc3RfcGlvOworfTsKKworZW51bSBQaGFzZSB7CisgICAgaWRsZSwKKyAgICBkYXRhX291dCwKKyAgICBkYXRhX2luLAorICAgIGNvbW1hbmRfcGgsCisgICAgc3RhdHVzX3BoLAorICAgIG1lc3NhZ2Vfb3V0LAorICAgIG1lc3NhZ2VfaW4KK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorKiAgR2xvYmFsICh3aXRoaW4gdGhpcyBtb2R1bGUpIHZhcmlhYmxlcyBvdGhlciB0aGFuCisqICBzeW01M2M1MDBfZHJpdmVyX3RlbXBsYXRlICh0aGUgc2NzaV9ob3N0X3RlbXBsYXRlKS4KKyovCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJzeW01M2M1MDBfY3MiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHZvaWQKK2NoaXBfaW5pdChpbnQgaW9fcG9ydCkKK3sKKwlSRUcxKGlvX3BvcnQpOworCW91dGIoMHgwMSwgaW9fcG9ydCArIFBJT19TVEFUVVMpOworCW91dGIoMHgwMCwgaW9fcG9ydCArIFBJT19GTEFHKTsKKworCW91dGIoQzRfSU1HLCBpb19wb3J0ICsgQ09ORklHNCk7CS8qIFJFRzAoaW9fcG9ydCk7ICovCisJb3V0YihDM19JTUcsIGlvX3BvcnQgKyBDT05GSUczKTsKKwlvdXRiKEMyX0lNRywgaW9fcG9ydCArIENPTkZJRzIpOworCW91dGIoQzFfSU1HLCBpb19wb3J0ICsgQ09ORklHMSk7CisKKwlvdXRiKDB4MDUsIGlvX3BvcnQgKyBDTEtDT05WKTsJLyogY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgKi8KKwlvdXRiKDB4OUMsIGlvX3BvcnQgKyBTUlRJTU9VVCk7CS8qIFNlbGVjdGlvbiB0aW1lb3V0ICovCisJb3V0YigweDA1LCBpb19wb3J0ICsgU1lOQ1BSRCk7CS8qIFN5bmNocm9ub3VzIHRyYW5zZmVyIHBlcmlvZCAqLworCW91dGIoU1lOQ19NT0RFLCBpb19wb3J0ICsgU1lOQ09GRik7CS8qIHN5bmNocm9ub3VzIG1vZGUgKi8gIAorfQorCitzdGF0aWMgdm9pZAorU1lNNTNDNTAwX2ludF9ob3N0X3Jlc2V0KGludCBpb19wb3J0KQoreworCW91dGIoQzRfSU1HLCBpb19wb3J0ICsgQ09ORklHNCk7CS8qIFJFRzAoaW9fcG9ydCk7ICovCisJb3V0YihDSElQX1JFU0VULCBpb19wb3J0ICsgQ01EX1JFRyk7CisJb3V0YihTQ1NJX05PUCwgaW9fcG9ydCArIENNRF9SRUcpOwkvKiByZXF1aXJlZCBhZnRlciByZXNldCAqLworCW91dGIoU0NTSV9SRVNFVCwgaW9fcG9ydCArIENNRF9SRUcpOworCWNoaXBfaW5pdChpb19wb3J0KTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50CitTWU01M0M1MDBfcGlvX3JlYWQoaW50IGZhc3RfcGlvLCBpbnQgYmFzZSwgdW5zaWduZWQgY2hhciAqcmVxdWVzdCwgdW5zaWduZWQgaW50IHJlcWxlbikKK3sKKwlpbnQgaTsKKwlpbnQgbGVuOwkvKiBjdXJyZW50IHNjc2kgZmlmbyBzaXplICovCisKKwlSRUcxKGJhc2UpOworCXdoaWxlIChyZXFsZW4pIHsKKwkJaSA9IGluYihiYXNlICsgUElPX1NUQVRVUyk7CisJCS8qIFZERUIocHJpbnRrKCJwaW9fc3RhdHVzPSV4XG4iLCBpKSk7ICovCisJCWlmIChpICYgMHg4MCkgCisJCQlyZXR1cm4gMDsKKworCQlzd2l0Y2ggKGkgJiAweDFlKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgMHgxMDoJLyogZmlmbyBlbXB0eSAqLworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDoKKwkJCWxlbiA9IDE7CisJCQlicmVhazsgCisJCWNhc2UgMHg4OgkvKiBmaWZvIDEvMyBmdWxsICovCisJCQlsZW4gPSA0MjsKKwkJCWJyZWFrOworCQljYXNlIDB4YzoJLyogZmlmbyAyLzMgZnVsbCAqLworCQkJbGVuID0gODQ7CisJCQlicmVhazsKKwkJY2FzZSAweGU6CS8qIGZpZm8gZnVsbCAqLworCQkJbGVuID0gMTI4OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGkgJiAweDQwKSAmJiBsZW4gPT0gMCkgeyAvKiBmaWZvIGVtcHR5IGFuZCBpbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGxlbikgeworCQkJaWYgKGxlbiA+IHJlcWxlbikgCisJCQkJbGVuID0gcmVxbGVuOworCisJCQlpZiAoZmFzdF9waW8gJiYgbGVuID4gMykgeworCQkJCWluc2woYmFzZSArIFBJT19GSUZPLCByZXF1ZXN0LCBsZW4gPj4gMik7CisJCQkJcmVxdWVzdCArPSBsZW4gJiAweGZjOyAKKwkJCQlyZXFsZW4gLT0gbGVuICYgMHhmYzsgCisJCQl9IGVsc2UgeworCQkJCXdoaWxlIChsZW4tLSkgeworCQkJCQkqcmVxdWVzdCsrID0gaW5iKGJhc2UgKyBQSU9fRklGTyk7CisJCQkJCXJlcWxlbi0tOworCQkJCX0KKwkJCX0gCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAorU1lNNTNDNTAwX3Bpb193cml0ZShpbnQgZmFzdF9waW8sIGludCBiYXNlLCB1bnNpZ25lZCBjaGFyICpyZXF1ZXN0LCB1bnNpZ25lZCBpbnQgcmVxbGVuKQoreworCWludCBpID0gMDsKKwlpbnQgbGVuOwkvKiBjdXJyZW50IHNjc2kgZmlmbyBzaXplICovCisKKwlSRUcxKGJhc2UpOworCXdoaWxlIChyZXFsZW4gJiYgIShpICYgMHg0MCkpIHsKKwkJaSA9IGluYihiYXNlICsgUElPX1NUQVRVUyk7CisJCS8qIFZERUIocHJpbnRrKCJwaW9fc3RhdHVzPSV4XG4iLCBpKSk7ICovCisJCWlmIChpICYgMHg4MCkJLyogZXJyb3IgKi8KKwkJCXJldHVybiAwOworCisJCXN3aXRjaCAoaSAmIDB4MWUpIHsKKwkJY2FzZSAweDEwOgorCQkJbGVuID0gMTI4OworCQkJYnJlYWs7CisJCWNhc2UgMHgwOgorCQkJbGVuID0gODQ7CisJCQlicmVhazsKKwkJY2FzZSAweDg6CisJCQlsZW4gPSA0MjsKKwkJCWJyZWFrOworCQljYXNlIDB4YzoKKwkJCWxlbiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSAweGU6CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gcmVxbGVuKQorCQkJCWxlbiA9IHJlcWxlbjsKKworCQkJaWYgKGZhc3RfcGlvICYmIGxlbiA+IDMpIHsKKwkJCQlvdXRzbChiYXNlICsgUElPX0ZJRk8sIHJlcXVlc3QsIGxlbiA+PiAyKTsKKwkJCQlyZXF1ZXN0ICs9IGxlbiAmIDB4ZmM7CisJCQkJcmVxbGVuIC09IGxlbiAmIDB4ZmM7CisJCQl9IGVsc2UgeworCQkJCXdoaWxlIChsZW4tLSkgeworCQkJCQlvdXRiKCpyZXF1ZXN0KyssIGJhc2UgKyBQSU9fRklGTyk7CisJCQkJCXJlcWxlbi0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90CitTWU01M0M1MDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOworCURFQih1bnNpZ25lZCBjaGFyIGZpZm9fc2l6ZTspCisJREVCKHVuc2lnbmVkIGNoYXIgc2VxX3JlZzspCisJdW5zaWduZWQgY2hhciBzdGF0dXMsIGludF9yZWc7CisJdW5zaWduZWQgY2hhciBwaW9fc3RhdHVzOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0OworCXVuc2lnbmVkIGludCBzZ2NvdW50OworCWludCBwb3J0X2Jhc2UgPSBkZXYtPmlvX3BvcnQ7CisJc3RydWN0IHN5bTUzYzUwMF9kYXRhICpkYXRhID0KKwkgICAgKHN0cnVjdCBzeW01M2M1MDBfZGF0YSAqKWRldi0+aG9zdGRhdGE7CisJc3RydWN0IHNjc2lfY21uZCAqY3VyU0MgPSBkYXRhLT5jdXJyZW50X1NDOworCWludCBmYXN0X3BpbyA9IGRhdGEtPmZhc3RfcGlvOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCVZERUIocHJpbnRrKCJTWU01M0M1MDBfaW50ciBjYWxsZWRcbiIpKTsKKworCVJFRzEocG9ydF9iYXNlKTsKKwlwaW9fc3RhdHVzID0gaW5iKHBvcnRfYmFzZSArIFBJT19TVEFUVVMpOworCVJFRzAocG9ydF9iYXNlKTsKKwlzdGF0dXMgPSBpbmIocG9ydF9iYXNlICsgU1RBVF9SRUcpOworCURFQihzZXFfcmVnID0gaW5iKHBvcnRfYmFzZSArIFNFUV9SRUcpKTsKKwlpbnRfcmVnID0gaW5iKHBvcnRfYmFzZSArIElOVF9SRUcpOworCURFQihmaWZvX3NpemUgPSBpbmIocG9ydF9iYXNlICsgRklGT19GTEFHUykgJiAweDFmKTsKKworI2lmIFNZTTUzQzUwMF9ERUJVRworCXByaW50aygic3RhdHVzPSUwMngsIHNlcV9yZWc9JTAyeCwgaW50X3JlZz0lMDJ4LCBmaWZvX3NpemU9JTAyeCIsIAorCSAgICBzdGF0dXMsIHNlcV9yZWcsIGludF9yZWcsIGZpZm9fc2l6ZSk7CisJcHJpbnRrKCIsIHBpbz0lMDJ4XG4iLCBwaW9fc3RhdHVzKTsKKyNlbmRpZiAvKiBTWU01M0M1MDBfREVCVUcgKi8KKworCWlmIChpbnRfcmVnICYgMHg4MCkgewkvKiBTQ1NJIHJlc2V0IGludHIgKi8KKwkJREVCKHByaW50aygiU1lNNTNDNTAwOiByZXNldCBpbnRyIHJlY2VpdmVkXG4iKSk7CisJCWN1clNDLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCWdvdG8gaWRsZV9vdXQ7CisJfQorCisJaWYgKHBpb19zdGF0dXMgJiAweDgwKSB7CisJCXByaW50aygiU1lNNTNDNTAwOiBXYXJuaW5nOiBQSU8gZXJyb3IhXG4iKTsKKwkJY3VyU0MtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJZ290byBpZGxlX291dDsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHgyMCkgewkJLyogUGFyaXR5IGVycm9yICovCisJCXByaW50aygiU1lNNTNDNTAwOiBXYXJuaW5nOiBwYXJpdHkgZXJyb3IhXG4iKTsKKwkJY3VyU0MtPnJlc3VsdCA9IERJRF9QQVJJVFkgPDwgMTY7CisJCWdvdG8gaWRsZV9vdXQ7CisJfQorCisJaWYgKHN0YXR1cyAmIDB4NDApIHsJCS8qIEdyb3NzIGVycm9yICovCisJCXByaW50aygiU1lNNTNDNTAwOiBXYXJuaW5nOiBncm9zcyBlcnJvciFcbiIpOworCQljdXJTQy0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlnb3RvIGlkbGVfb3V0OworCX0KKworCWlmIChpbnRfcmVnICYgMHgyMCkgewkJLyogRGlzY29ubmVjdCAqLworCQlERUIocHJpbnRrKCJTWU01M0M1MDA6IGRpc2Nvbm5lY3QgaW50ciByZWNlaXZlZFxuIikpOworCQlpZiAoY3VyU0MtPlNDcC5waGFzZSAhPSBtZXNzYWdlX2luKSB7CS8qIFVuZXhwZWN0ZWQgZGlzY29ubmVjdCAqLworCQkJY3VyU0MtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQl9IGVsc2UgewkvKiBDb21tYW5kIGNvbXBsZXRlLCByZXR1cm4gc3RhdHVzIGFuZCBtZXNzYWdlICovCisJCQljdXJTQy0+cmVzdWx0ID0gKGN1clNDLT5TQ3AuU3RhdHVzICYgMHhmZikKKwkJCSAgICB8ICgoY3VyU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX09LIDw8IDE2KTsKKwkJfQorCQlnb3RvIGlkbGVfb3V0OworCX0KKworCXN3aXRjaCAoc3RhdHVzICYgMHgwNykgewkvKiBzY3NpIHBoYXNlICovCisJY2FzZSAweDAwOgkJCS8qIERBVEEtT1VUICovCisJCWlmIChpbnRfcmVnICYgMHgxMCkgewkvKiBUYXJnZXQgcmVxdWVzdGluZyBpbmZvIHRyYW5zZmVyICovCisJCQljdXJTQy0+U0NwLnBoYXNlID0gZGF0YV9vdXQ7CisJCQlWREVCKHByaW50aygiU1lNNTNDNTAwOiBEYXRhLU91dCBwaGFzZVxuIikpOworCQkJb3V0YihGTFVTSF9GSUZPLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJCUxPQURfRE1BX0NPVU5UKHBvcnRfYmFzZSwgY3VyU0MtPnJlcXVlc3RfYnVmZmxlbik7CS8qIE1heCB0cmFuc2ZlciBzaXplICovCisJCQlvdXRiKFRSQU5TRkVSX0lORk8gfCBETUFfT1AsIHBvcnRfYmFzZSArIENNRF9SRUcpOworCQkJaWYgKCFjdXJTQy0+dXNlX3NnKQkvKiBEb24ndCB1c2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlTWU01M0M1MDBfcGlvX3dyaXRlKGZhc3RfcGlvLCBwb3J0X2Jhc2UsIGN1clNDLT5yZXF1ZXN0X2J1ZmZlciwgY3VyU0MtPnJlcXVlc3RfYnVmZmxlbik7CisJCQllbHNlIHsJLyogdXNlIHNjYXR0ZXItZ2F0aGVyICovCisJCQkJc2djb3VudCA9IGN1clNDLT51c2Vfc2c7CisJCQkJc2dsaXN0ID0gY3VyU0MtPnJlcXVlc3RfYnVmZmVyOworCQkJCXdoaWxlIChzZ2NvdW50LS0pIHsKKwkJCQkJU1lNNTNDNTAwX3Bpb193cml0ZShmYXN0X3BpbywgcG9ydF9iYXNlLCBwYWdlX2FkZHJlc3Moc2dsaXN0LT5wYWdlKSArIHNnbGlzdC0+b2Zmc2V0LCBzZ2xpc3QtPmxlbmd0aCk7CisJCQkJCXNnbGlzdCsrOworCQkJCX0KKwkJCX0KKwkJCVJFRzAocG9ydF9iYXNlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwMToJCS8qIERBVEEtSU4gKi8KKwkJaWYgKGludF9yZWcgJiAweDEwKSB7CS8qIFRhcmdldCByZXF1ZXN0aW5nIGluZm8gdHJhbnNmZXIgKi8KKwkJCWN1clNDLT5TQ3AucGhhc2UgPSBkYXRhX2luOworCQkJVkRFQihwcmludGsoIlNZTTUzQzUwMDogRGF0YS1JbiBwaGFzZVxuIikpOworCQkJb3V0YihGTFVTSF9GSUZPLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJCUxPQURfRE1BX0NPVU5UKHBvcnRfYmFzZSwgY3VyU0MtPnJlcXVlc3RfYnVmZmxlbik7CS8qIE1heCB0cmFuc2ZlciBzaXplICovCisJCQlvdXRiKFRSQU5TRkVSX0lORk8gfCBETUFfT1AsIHBvcnRfYmFzZSArIENNRF9SRUcpOworCQkJaWYgKCFjdXJTQy0+dXNlX3NnKQkvKiBEb24ndCB1c2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlTWU01M0M1MDBfcGlvX3JlYWQoZmFzdF9waW8sIHBvcnRfYmFzZSwgY3VyU0MtPnJlcXVlc3RfYnVmZmVyLCBjdXJTQy0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCWVsc2UgewkvKiBVc2Ugc2NhdHRlci1nYXRoZXIgKi8KKwkJCQlzZ2NvdW50ID0gY3VyU0MtPnVzZV9zZzsKKwkJCQlzZ2xpc3QgPSBjdXJTQy0+cmVxdWVzdF9idWZmZXI7CisJCQkJd2hpbGUgKHNnY291bnQtLSkgeworCQkJCQlTWU01M0M1MDBfcGlvX3JlYWQoZmFzdF9waW8sIHBvcnRfYmFzZSwgcGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCwgc2dsaXN0LT5sZW5ndGgpOworCQkJCQlzZ2xpc3QrKzsKKwkJCQl9CisJCQl9CisJCQlSRUcwKHBvcnRfYmFzZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MDI6CQkvKiBDT01NQU5EICovCisJCWN1clNDLT5TQ3AucGhhc2UgPSBjb21tYW5kX3BoOworCQlwcmludGsoIlNZTTUzQzUwMDogV2FybmluZzogVW5rbm93biBpbnRlcnJ1cHQgb2NjdXJyZWQgaW4gY29tbWFuZCBwaGFzZSFcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgwMzoJCS8qIFNUQVRVUyAqLworCQljdXJTQy0+U0NwLnBoYXNlID0gc3RhdHVzX3BoOworCQlWREVCKHByaW50aygiU1lNNTNDNTAwOiBTdGF0dXMgcGhhc2VcbiIpKTsKKwkJb3V0YihGTFVTSF9GSUZPLCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJb3V0YihJTklUX0NNRF9DT01QTEVURSwgcG9ydF9iYXNlICsgQ01EX1JFRyk7CisJCWJyZWFrOworCisJY2FzZSAweDA0OgkJLyogUmVzZXJ2ZWQgKi8KKwljYXNlIDB4MDU6CQkvKiBSZXNlcnZlZCAqLworCQlwcmludGsoIlNZTTUzQzUwMDogV0FSTklORzogUmVzZXJ2ZWQgcGhhc2UhISFcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgwNjoJCS8qIE1FU1NBR0UtT1VUICovCisJCURFQihwcmludGsoIlNZTTUzQzUwMDogTWVzc2FnZS1PdXQgcGhhc2VcbiIpKTsKKwkJY3VyU0MtPlNDcC5waGFzZSA9IG1lc3NhZ2Vfb3V0OworCQlvdXRiKFNFVF9BVE4sIHBvcnRfYmFzZSArIENNRF9SRUcpOwkvKiBSZWplY3QgdGhlIG1lc3NhZ2UgKi8KKwkJb3V0YihNU0dfQUNDRVBULCBwb3J0X2Jhc2UgKyBDTURfUkVHKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDc6CQkvKiBNRVNTQUdFLUlOICovCisJCVZERUIocHJpbnRrKCJTWU01M0M1MDA6IE1lc3NhZ2UtSW4gcGhhc2VcbiIpKTsKKwkJY3VyU0MtPlNDcC5waGFzZSA9IG1lc3NhZ2VfaW47CisKKwkJY3VyU0MtPlNDcC5TdGF0dXMgPSBpbmIocG9ydF9iYXNlICsgU0NTSV9GSUZPKTsKKwkJY3VyU0MtPlNDcC5NZXNzYWdlID0gaW5iKHBvcnRfYmFzZSArIFNDU0lfRklGTyk7CisKKwkJVkRFQihwcmludGsoIlNDU0kgRklGTyBzaXplPSVkXG4iLCBpbmIocG9ydF9iYXNlICsgRklGT19GTEFHUykgJiAweDFmKSk7CisJCURFQihwcmludGsoIlN0YXR1cyA9ICUwMnggIE1lc3NhZ2UgPSAlMDJ4XG4iLCBjdXJTQy0+U0NwLlN0YXR1cywgY3VyU0MtPlNDcC5NZXNzYWdlKSk7CisKKwkJaWYgKGN1clNDLT5TQ3AuTWVzc2FnZSA9PSBTQVZFX1BPSU5URVJTIHx8IGN1clNDLT5TQ3AuTWVzc2FnZSA9PSBESVNDT05ORUNUKSB7CisJCQlvdXRiKFNFVF9BVE4sIHBvcnRfYmFzZSArIENNRF9SRUcpOwkvKiBSZWplY3QgbWVzc2FnZSAqLworCQkJREVCKHByaW50aygiRGlzY2FyZGluZyBTQVZFX1BPSU5URVJTIG1lc3NhZ2VcbiIpKTsKKwkJfQorCQlvdXRiKE1TR19BQ0NFUFQsIHBvcnRfYmFzZSArIENNRF9SRUcpOworCQlicmVhazsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKKworaWRsZV9vdXQ6CisJY3VyU0MtPlNDcC5waGFzZSA9IGlkbGU7CisJY3VyU0MtPnNjc2lfZG9uZShjdXJTQyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkCitTWU01M0M1MDBfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCXN0cnVjdCBzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpbmZvLT5ob3N0OworCisJREVCVUcoMCwgIlNZTTUzQzUwMF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworCS8qCisJKiAgRG8gdGhpcyBiZWZvcmUgcmVsZWFzaW5nL2ZyZWVpbmcgcmVzb3VyY2VzLgorCSovCisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisKKwkvKgorCSogIEludGVycnVwdHMgZ2V0dGluZyBob3NlZCBvbiBjYXJkIHJlbW92YWwuICBUcnkKKwkqICB0aGUgZm9sbG93aW5nIGNvZGUsIG1vc3RseSBmcm9tIHFsb2dpY2Zhcy5jLgorCSovCisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKworCWxpbmstPmRldiA9IE5VTEw7CisKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK30gLyogU1lNNTNDNTAwX3JlbGVhc2UgKi8KKworc3RhdGljIGNvbnN0IGNoYXIqCitTWU01M0M1MDBfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpTQ2hvc3QpCit7CisJc3RhdGljIGNoYXIgaW5mb19tc2dbMjU2XTsKKwlzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKmRhdGEgPQorCSAgICAoc3RydWN0IHN5bTUzYzUwMF9kYXRhICopU0Nob3N0LT5ob3N0ZGF0YTsKKworCURFQihwcmludGsoIlNZTTUzQzUwMF9pbmZvIGNhbGxlZFxuIikpOworCSh2b2lkKXNucHJpbnRmKGluZm9fbXNnLCBzaXplb2YoaW5mb19tc2cpLAorCSAgICAiU1lNNTNDNTAwIGF0IDB4JWx4LCBJUlEgJWQsICVzIFBJTyBtb2RlLiIsIAorCSAgICBTQ2hvc3QtPmlvX3BvcnQsIFNDaG9zdC0+aXJxLCBkYXRhLT5mYXN0X3BpbyA/ICJmYXN0IiA6ICJzbG93Iik7CisJcmV0dXJuIChpbmZvX21zZyk7Cit9CisKK3N0YXRpYyBpbnQgCitTWU01M0M1MDBfcXVldWUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCWludCBpOworCWludCBwb3J0X2Jhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCXN0cnVjdCBzeW01M2M1MDBfZGF0YSAqZGF0YSA9CisJICAgIChzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCVZERUIocHJpbnRrKCJTWU01M0M1MDBfcXVldWUgY2FsbGVkXG4iKSk7CisKKwlERUIocHJpbnRrKCJjbWQ9JTAyeCwgY21kX2xlbj0lMDJ4LCB0YXJnZXQ9JTAyeCwgbHVuPSUwMngsIGJ1ZmZsZW49JWRcbiIsIAorCSAgICBTQ3BudC0+Y21uZFswXSwgU0NwbnQtPmNtZF9sZW4sIFNDcG50LT5kZXZpY2UtPmlkLCAKKwkgICAgU0NwbnQtPmRldmljZS0+bHVuLCAgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbikpOworCisJVkRFQihmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkgICAgcHJpbnRrKCJjbWRbJWRdPSUwMnggICIsIGksIFNDcG50LT5jbW5kW2ldKSk7CisJVkRFQihwcmludGsoIlxuIikpOworCisJZGF0YS0+Y3VycmVudF9TQyA9IFNDcG50OworCWRhdGEtPmN1cnJlbnRfU0MtPnNjc2lfZG9uZSA9IGRvbmU7CisJZGF0YS0+Y3VycmVudF9TQy0+U0NwLnBoYXNlID0gY29tbWFuZF9waDsKKwlkYXRhLT5jdXJyZW50X1NDLT5TQ3AuU3RhdHVzID0gMDsKKwlkYXRhLT5jdXJyZW50X1NDLT5TQ3AuTWVzc2FnZSA9IDA7CisKKwkvKiBXZSBhcmUgbG9ja2VkIGhlcmUgYWxyZWFkeSBieSB0aGUgbWlkIGxheWVyICovCisJUkVHMChwb3J0X2Jhc2UpOworCW91dGIoU0NwbnQtPmRldmljZS0+aWQsIHBvcnRfYmFzZSArIERFU1RfSUQpOwkvKiBzZXQgZGVzdGluYXRpb24gKi8KKwlvdXRiKEZMVVNIX0ZJRk8sIHBvcnRfYmFzZSArIENNRF9SRUcpOwkvKiByZXNldCB0aGUgZmlmb3MgKi8KKworCWZvciAoaSA9IDA7IGkgPCBTQ3BudC0+Y21kX2xlbjsgaSsrKSB7CisJCW91dGIoU0NwbnQtPmNtbmRbaV0sIHBvcnRfYmFzZSArIFNDU0lfRklGTyk7CisJfQorCW91dGIoU0VMRUNUX05PX0FUTiwgcG9ydF9iYXNlICsgQ01EX1JFRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCAKK1NZTTUzQzUwMF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCWludCBwb3J0X2Jhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OworCisJREVCKHByaW50aygiU1lNNTNDNTAwX2hvc3RfcmVzZXQgY2FsbGVkXG4iKSk7CisJU1lNNTNDNTAwX2ludF9ob3N0X3Jlc2V0KHBvcnRfYmFzZSk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCAKK1NZTTUzQzUwMF9iaW9zcGFybShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRpc2ssCisgICAgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmluZm9fYXJyYXkpCit7CisJaW50IHNpemU7CisKKwlERUIocHJpbnRrKCJTWU01M0M1MDBfYmlvc3Bhcm0gY2FsbGVkXG4iKSk7CisKKwlzaXplID0gY2FwYWNpdHk7CisJaW5mb19hcnJheVswXSA9IDY0OwkJLyogaGVhZHMgKi8KKwlpbmZvX2FycmF5WzFdID0gMzI7CQkvKiBzZWN0b3JzICovCisJaW5mb19hcnJheVsyXSA9IHNpemUgPj4gMTE7CS8qIGN5bGluZGVycyAqLworCWlmIChpbmZvX2FycmF5WzJdID4gMTAyNCkgewkvKiBiaWcgZGlzayAqLworCQlpbmZvX2FycmF5WzBdID0gMjU1OworCQlpbmZvX2FycmF5WzFdID0gNjM7CisJCWluZm9fYXJyYXlbMl0gPSBzaXplIC8gKDI1NSAqIDYzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitTWU01M0M1MDBfc2hvd19waW8oc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKlNIcCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzeW01M2M1MDBfZGF0YSAqZGF0YSA9CisJICAgIChzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKilTSHAtPmhvc3RkYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgNCwgIiVkXG4iLCBkYXRhLT5mYXN0X3Bpbyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitTWU01M0M1MDBfc3RvcmVfcGlvKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBwaW87CisJc3RydWN0IFNjc2lfSG9zdCAqU0hwID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHN5bTUzYzUwMF9kYXRhICpkYXRhID0KKwkgICAgKHN0cnVjdCBzeW01M2M1MDBfZGF0YSAqKVNIcC0+aG9zdGRhdGE7CisKKwlwaW8gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCWlmIChwaW8gPT0gMCB8fCBwaW8gPT0gMSkgeworCQlkYXRhLT5mYXN0X3BpbyA9IHBpbzsKKwkJcmV0dXJuIGNvdW50OworCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCisvKgorKiAgU0NTSSBIQkEgZGV2aWNlIGF0dHJpYnV0ZXMgd2Ugd2FudCB0bworKiAgbWFrZSBhdmFpbGFibGUgdmlhIHN5c2ZzLgorKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBTWU01M0M1MDBfcGlvX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gImZhc3RfcGlvIiwKKwkJLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpLAorCX0sCisJLnNob3cgPSBTWU01M0M1MDBfc2hvd19waW8sCisJLnN0b3JlID0gU1lNNTNDNTAwX3N0b3JlX3BpbywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqU1lNNTNDNTAwX3Nob3N0X2F0dHJzW10gPSB7CisJJlNZTTUzQzUwMF9waW9fYXR0ciwKKwlOVUxMLAorfTsKKworLyoKKyogIHNjc2lfaG9zdF90ZW1wbGF0ZSBpbml0aWFsaXplcgorKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHN5bTUzYzUwMF9kcml2ZXJfdGVtcGxhdGUgPSB7CisgICAgIC5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorICAgICAubmFtZQkJCT0gIlNZTTUzQzUwMCIsCisgICAgIC5pbmZvCQkJPSBTWU01M0M1MDBfaW5mbywKKyAgICAgLnF1ZXVlY29tbWFuZAkJPSBTWU01M0M1MDBfcXVldWUsCisgICAgIC5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBTWU01M0M1MDBfaG9zdF9yZXNldCwKKyAgICAgLmJpb3NfcGFyYW0JCT0gU1lNNTNDNTAwX2Jpb3NwYXJtLAorICAgICAucHJvY19uYW1lCQkJPSAiU1lNNTNDNTAwIiwKKyAgICAgLmNhbl9xdWV1ZQkJCT0gMSwKKyAgICAgLnRoaXNfaWQJCQk9IDcsCisgICAgIC5zZ190YWJsZXNpemUJCT0gMzIsCisgICAgIC5jbWRfcGVyX2x1bgkJPSAxLAorICAgICAudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisgICAgIC5zaG9zdF9hdHRycwkJPSBTWU01M0M1MDBfc2hvc3RfYXR0cnMKK307CisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQKK1NZTTUzQzUwMF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXN0cnVjdCBzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCWludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKKwlpbnQgaXJxX2xldmVsLCBwb3J0X2Jhc2U7CisJdW5zaWduZWQgc2hvcnQgdHVwbGVfZGF0YVszMl07CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50ID0gJnN5bTUzYzUwMF9kcml2ZXJfdGVtcGxhdGU7CisJc3RydWN0IHN5bTUzYzUwMF9kYXRhICpkYXRhOworCisJREVCVUcoMCwgIlNZTTUzQzUwMF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKXR1cGxlX2RhdGE7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJgorCSAgICAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSkKKwkJaW5mby0+bWFuZl9pZCA9IGxlMTZfdG9fY3B1KHR1cGxlLlR1cGxlRGF0YVswXSk7CisKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQkgICAgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OworCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5iYXNlOworCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5sZW47CisKKwkJaWYgKGxpbmstPmlvLkJhc2VQb3J0MSAhPSAwKSB7CisJCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8oaGFuZGxlLCAmbGluay0+aW8pOworCQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJCQlicmVhazsKKwkJfQorbmV4dF9lbnRyeToKKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl9CisKKwlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworCisJLyoKKwkqICBUaGF0J3MgdGhlIHRyb3VibGUgd2l0aCBjb3B5aW5nIGxpYmVyYWxseSBmcm9tIGFub3RoZXIgZHJpdmVyLgorCSogIFNvbWUgdGhpbmdzIHByb2JhYmx5IGFyZW4ndCByZWxldmFudCwgYW5kIEkgc3VzcGVjdCB0aGlzIGVudGlyZQorCSogIHNlY3Rpb24gZGVhbGluZyB3aXRoIG1hbnVmYWN0dXJlciBJRHMgY2FuIGJlIHNjcmFwcGVkLgktLXJjdAorCSovCisJaWYgKChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9NQUNOSUNBKSB8fAorCSAgICAoaW5mby0+bWFuZl9pZCA9PSBNQU5GSURfUElPTkVFUikgfHwKKwkgICAgKGluZm8tPm1hbmZfaWQgPT0gMHgwMDk4KSkgeworCQkvKiBzZXQgQVRBY21kICovCisJCW91dGIoMHhiNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHhkKTsKKwkJb3V0YigweDI0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDkpOworCQlvdXRiKDB4MDQsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJfQorCisJLyoKKwkqICBpcnFfbGV2ZWwgPT0gMCBpbXBsaWVzIHRwbnQtPmNhbl9xdWV1ZSA9PSAwLCB3aGljaAorCSogIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMi42LiAgVGh1cywgb25seSBpcnFfbGV2ZWwgPiAwCisJKiAgd2lsbCBiZSBhbGxvd2VkLgorCSoKKwkqICBQb3NzaWJsZSBwb3J0X2Jhc2UgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOgorCSoKKwkqCTB4MTMwLCAweDIzMCwgMHgyODAsIDB4MjkwLAorCSoJMHgzMjAsIDB4MzMwLCAweDM0MCwgMHgzNTAKKwkqLworCXBvcnRfYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlpcnFfbGV2ZWwgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisKKwlERUIocHJpbnRrKCJTWU01M0M1MDA6IHBvcnRfYmFzZT0weCV4LCBpcnE9JWQsIGZhc3RfcGlvPSVkXG4iLAorCSAgICBwb3J0X2Jhc2UsIGlycV9sZXZlbCwgVVNFX0ZBU1RfUElPKTspCisKKwljaGlwX2luaXQocG9ydF9iYXNlKTsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKHN0cnVjdCBzeW01M2M1MDBfZGF0YSkpOworCWlmICghaG9zdCkgeworCQlwcmludGsoIlNZTTUzQzUwMDogVW5hYmxlIHRvIHJlZ2lzdGVyIGhvc3QsIGdpdmluZyB1cC5cbiIpOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKworCWRhdGEgPSAoc3RydWN0IHN5bTUzYzUwMF9kYXRhICopaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoaXJxX2xldmVsID4gMCkgeworCQlpZiAocmVxdWVzdF9pcnEoaXJxX2xldmVsLCBTWU01M0M1MDBfaW50ciwgU0FfU0hJUlEsICJTWU01M0M1MDAiLCBob3N0KSkgeworCQkJcHJpbnRrKCJTWU01M0M1MDA6IHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJWRcbiIsIGlycV9sZXZlbCk7CisJCQlnb3RvIGVycl9mcmVlX3Njc2k7CisJCX0KKwkJREVCKHByaW50aygiU1lNNTNDNTAwOiBhbGxvY2F0ZWQgSVJRICVkXG4iLCBpcnFfbGV2ZWwpKTsKKwl9IGVsc2UgaWYgKGlycV9sZXZlbCA9PSAwKSB7CisJCURFQihwcmludGsoIlNZTTUzQzUwMDogTm8gaW50ZXJydXB0cyBkZXRlY3RlZFxuIikpOworCQlnb3RvIGVycl9mcmVlX3Njc2k7CisJfSBlbHNlIHsKKwkJREVCKHByaW50aygiU1lNNTNDNTAwOiBTaG91bGRuJ3QgZ2V0IGhlcmUhXG4iKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2NzaTsKKwl9CisKKwlob3N0LT51bmlxdWVfaWQgPSBwb3J0X2Jhc2U7CisJaG9zdC0+aXJxID0gaXJxX2xldmVsOworCWhvc3QtPmlvX3BvcnQgPSBwb3J0X2Jhc2U7CisJaG9zdC0+bl9pb19wb3J0ID0gMHgxMDsKKwlob3N0LT5kbWFfY2hhbm5lbCA9IC0xOworCisJLyoKKwkqICBOb3RlIGZhc3RfcGlvIGlzIHNldCB0byBVU0VfRkFTVF9QSU8gYnkKKwkqICBkZWZhdWx0LCBidXQgY2FuIGJlIGNoYW5nZWQgdmlhICJzeXNmcyIuCisJKi8KKwlkYXRhLT5mYXN0X3BpbyA9IFVTRV9GQVNUX1BJTzsKKworCXNwcmludGYoaW5mby0+bm9kZS5kZXZfbmFtZSwgInNjc2klZCIsIGhvc3QtPmhvc3Rfbm8pOworCWxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworCWluZm8tPmhvc3QgPSBob3N0OworCisJaWYgKHNjc2lfYWRkX2hvc3QoaG9zdCwgTlVMTCkpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlnb3RvIG91dDsJLyogU1VDQ0VTUyAqLworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxX2xldmVsLCBob3N0KTsKK2Vycl9mcmVlX3Njc2k6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKK2Vycl9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAic3ltNTNjNTAwX2NzOiBubyBTQ1NJIGRldmljZXMgZm91bmRcbiIpOworCitvdXQ6CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlyZXR1cm47CisKK2NzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKwlTWU01M0M1MDBfcmVsZWFzZShsaW5rKTsKKwlyZXR1cm47Cit9IC8qIFNZTTUzQzUwMF9jb25maWcgKi8KKworc3RhdGljIGludAorU1lNNTNDNTAwX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OworCisJREVCVUcoMSwgIlNZTTUzQzUwMF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJCVNZTTUzQzUwMF9yZWxlYXNlKGxpbmspOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJU1lNNTNDNTAwX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQkJLyogU2VlIGVhcmxpZXIgY29tbWVudCBhYm91dCBtYW51ZmFjdHVyZXIgSURzLiAqLworCQkJaWYgKChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9NQUNOSUNBKSB8fAorCQkJICAgIChpbmZvLT5tYW5mX2lkID09IE1BTkZJRF9QSU9ORUVSKSB8fAorCQkJICAgIChpbmZvLT5tYW5mX2lkID09IDB4MDA5OCkpIHsKKwkJCQlvdXRiKDB4ODAsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4ZCk7CisJCQkJb3V0YigweDI0LCBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDkpOworCQkJCW91dGIoMHgwNCwgbGluay0+aW8uQmFzZVBvcnQxICsgMHhkKTsKKwkJCX0KKwkJCS8qCisJCQkqICBJZiB0aGluZ3MgZG9uJ3Qgd29yayBhZnRlciBhICJyZXN1bWUiLAorCQkJKiAgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQgbG9va2luZy4KKwkJCSovCisJCQlTWU01M0M1MDBfaW50X2hvc3RfcmVzZXQobGluay0+aW8uQmFzZVBvcnQxKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9IC8qIFNZTTUzQzUwMF9ldmVudCAqLworCitzdGF0aWMgdm9pZAorU1lNNTNDNTAwX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKworCURFQlVHKDAsICJTWU01M0M1MDBfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKQorCQkJYnJlYWs7CisJaWYgKCpsaW5rcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQlTWU01M0M1MDBfcmVsZWFzZShsaW5rKTsKKworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cy4gKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCWtmcmVlKGxpbmstPnByaXYpOworCWxpbmstPnByaXYgPSBOVUxMOworfSAvKiBTWU01M0M1MDBfZGV0YWNoICovCisKK3N0YXRpYyBkZXZfbGlua190ICoKK1NZTTUzQzUwMF9hdHRhY2godm9pZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9pbmZvX3QgKmluZm87CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlpbnQgcmV0OworCisJREVCVUcoMCwgIlNZTTUzQzUwMF9hdHRhY2goKVxuIik7CisKKwkvKiBDcmVhdGUgbmV3IFNDU0kgZGV2aWNlICovCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJbGluayA9ICZpbmZvLT5saW5rOworCWxpbmstPnByaXYgPSBpbmZvOworCWxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJbGluay0+aW8uSU9BZGRyTGluZXMgPSAxMDsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworCWxpbmstPmNvbmYuVmNjID0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJlNZTTUzQzUwMF9ldmVudDsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9IENTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gMCkgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQlTWU01M0M1MDBfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbGluazsKK30gLyogU1lNNTNDNTAwX2F0dGFjaCAqLworCitNT0RVTEVfQVVUSE9SKCJCb2IgVHJhY3kgPHJjdEBmcnVzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1lNNTNDNTAwIFBDTUNJQSBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc3ltNTNjNTAwX2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gInN5bTUzYzUwMF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IFNZTTUzQzUwMF9hdHRhY2gsCisJLmRldGFjaAkJPSBTWU01M0M1MDBfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfc3ltNTNjNTAwX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnN5bTUzYzUwMF9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfc3ltNTNjNTAwX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZzeW01M2M1MDBfY3NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zeW01M2M1MDBfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9zeW01M2M1MDBfY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BsdXRvLmMgYi9kcml2ZXJzL3Njc2kvcGx1dG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmIwYTJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BsdXRvLmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qIHBsdXRvLmM6IFNwYXJjU1RPUkFHRSBBcnJheSBTQ1NJIGhvc3QgYWRhcHRlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiBDT05GSUdfS01PRAorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAiLi4vZmM0L2ZjcF9pbXBsLmgiCisjaW5jbHVkZSAicGx1dG8uaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKiAjZGVmaW5lIFBMVVRPX0RFQlVHICovCisKKyNkZWZpbmUgcGx1dG9fcHJpbnRrIHByaW50ayAoIlBMVVRPICVzOiAiLCBmYy0+bmFtZSk7IHByaW50aworCisjaWZkZWYgUExVVE9fREVCVUcKKyNkZWZpbmUgUExEKHgpICBwbHV0b19wcmludGsgeDsKKyNkZWZpbmUgUExORCh4KSBwcmludGsgKCJQTFVUTzogIik7IHByaW50ayB4OworI2Vsc2UKKyNkZWZpbmUgUExEKHgpCisjZGVmaW5lIFBMTkQoeCkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGN0cmxfaW5xdWlyeSB7CisJc3RydWN0IFNjc2lfSG9zdCBob3N0OworCXN0cnVjdCBwbHV0byBwbHV0bzsKKwlTY3NpX0NtbmQgY21kOworCWNoYXIgaW5xdWlyeVsyNTZdOworCWZjX2NoYW5uZWwgKmZjOworfSAqZmNzIF9faW5pdGRhdGEgPSB7IDAgfTsKK3N0YXRpYyBpbnQgZmNzY291bnQgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgYXRvbWljX3QgZmNzcyBfX2luaXRkYXRhID0gQVRPTUlDX0lOSVQoMCk7CitERUNMQVJFX01VVEVYX0xPQ0tFRChmY19zZW0pOworCitzdGF0aWMgaW50IHBsdXRvX2VuY29kZV9hZGRyKFNjc2lfQ21uZCAqU0NwbnQsIHUxNiAqYWRkciwgZmNfY2hhbm5lbCAqZmMsIGZjcF9jbW5kICpmY21kKTsKKworc3RhdGljIHZvaWQgX19pbml0IHBsdXRvX2RldGVjdF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQTE5EKCgiVGltZW91dFxuIikpCisJdXAoJmZjX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbHV0b19kZXRlY3RfZG9uZShTY3NpX0NtbmQgKlNDcG50KQoreworCS8qIERvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQgX19pbml0IHBsdXRvX2RldGVjdF9zY3NpX2RvbmUoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlTQ3BudC0+cmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9ET05FOworCVBMTkQoKCJEZXRlY3QgZG9uZSAlMDhseFxuIiwgKGxvbmcpU0NwbnQpKQorCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0ICgmZmNzcykpCisJCXVwKCZmY19zZW0pOworfQorCitpbnQgcGx1dG9fc2xhdmVfY29uZmlndXJlKFNjc2lfRGV2aWNlICpkZXZpY2UpCit7CisJaW50IGRlcHRoX3RvX3VzZTsKKworCWlmIChkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCWRlcHRoX3RvX3VzZSA9IC8qIDI1NCAqLyA4OworCWVsc2UKKwkJZGVwdGhfdG9fdXNlID0gMjsKKworCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwKKwkJCQkoZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkID8KKwkJCQkgTVNHX1NJTVBMRV9UQUcgOiAwKSwKKwkJCQlkZXB0aF90b191c2UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERldGVjdCBhbGwgU1NBcyBhdHRhY2hlZCB0byB0aGUgbWFjaGluZS4KKyAgIFRvIGJlIGZhc3QsIGRvIGl0IG9uIGFsbCBvbmxpbmUgRkMgY2hhbm5lbHMgYXQgdGhlIHNhbWUgdGltZS4gKi8KK2ludCBfX2luaXQgcGx1dG9fZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlpbnQgaSwgcmV0cnksIG5wbHV0b3M7CisJZmNfY2hhbm5lbCAqZmM7CisJU2NzaV9EZXZpY2UgZGV2OworCXN0cnVjdCB0aW1lcl9saXN0IGZjX3RpbWVyID0KKwkJVElNRVJfSU5JVElBTElaRVIocGx1dG9fZGV0ZWN0X3RpbWVvdXQsIDAsIDApOworCisJdHBudC0+cHJvY19uYW1lID0gInBsdXRvIjsKKwlmY3Njb3VudCA9IDA7CisJZm9yX2VhY2hfb25saW5lX2ZjX2NoYW5uZWwoZmMpIHsKKwkJaWYgKCFmYy0+cG9zbWFwKQorCQkJZmNzY291bnQrKzsKKwl9CisJUExORCgoIiVkIGNoYW5uZWxzIG9ubGluZVxuIiwgZmNzY291bnQpKQorCWlmICghZmNzY291bnQpIHsKKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfRkM0X1NPQ19NT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0tNT0QpCisJCXJlcXVlc3RfbW9kdWxlKCJzb2MiKTsKKwkJCisJCWZvcl9lYWNoX29ubGluZV9mY19jaGFubmVsKGZjKSB7CisJCQlpZiAoIWZjLT5wb3NtYXApCisJCQkJZmNzY291bnQrKzsKKwkJfQorCQlpZiAoIWZjc2NvdW50KQorI2VuZGlmCisJCQlyZXR1cm4gMDsKKwl9CisJZmNzID0gKHN0cnVjdCBjdHJsX2lucXVpcnkgKikga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY3RybF9pbnF1aXJ5KSAqIGZjc2NvdW50LCBHRlBfRE1BKTsKKwlpZiAoIWZjcykgeworCQlwcmludGsgKCJQTFVUTzogTm90IGVub3VnaCBtZW1vcnkgdG8gcHJvYmVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJCisJbWVtc2V0IChmY3MsIDAsIHNpemVvZiAoc3RydWN0IGN0cmxfaW5xdWlyeSkgKiBmY3Njb3VudCk7CisJbWVtc2V0ICgmZGV2LCAwLCBzaXplb2YoZGV2KSk7CisJYXRvbWljX3NldCAoJmZjc3MsIGZjc2NvdW50KTsKKwkKKwlpID0gMDsKKwlmb3JfZWFjaF9vbmxpbmVfZmNfY2hhbm5lbChmYykgeworCQlTY3NpX0NtbmQgKlNDcG50OworCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCQlzdHJ1Y3QgcGx1dG8gKnBsdXRvOworCisJCWlmIChpID09IGZjc2NvdW50KSBicmVhazsKKwkJaWYgKGZjLT5wb3NtYXApIGNvbnRpbnVlOworCQkKKwkJUExEKCgidHJ5aW5nIHRvIGZpbmQgU1NBXG4iKSkKKworCQkvKiBJZiB0aGlzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBzb21lIG90aGVyIFNDU0kgaG9zdCwgdGhlbiBpdCBjYW5ub3QgYmUgcGx1dG8gKi8KKwkJaWYgKGZjLT5zY3NpX25hbWVbMF0pIGNvbnRpbnVlOworCQltZW1jcHkgKGZjLT5zY3NpX25hbWUsICJTU0EiLCA0KTsKKwkJCisJCWZjc1tpXS5mYyA9IGZjOworCQkKKwkJZmMtPmNhbl9xdWV1ZSA9IFBMVVRPX0NBTl9RVUVVRTsKKwkJZmMtPnJzcF9zaXplID0gNjQ7CisJCWZjLT5lbmNvZGVfYWRkciA9IHBsdXRvX2VuY29kZV9hZGRyOworCQkKKwkJZmMtPmZjcF9yZWdpc3RlcihmYywgVFlQRV9TQ1NJX0ZDUCwgMCk7CisJCisJCVNDcG50ID0gJihmY3NbaV0uY21kKTsKKwkJaG9zdCA9ICYoZmNzW2ldLmhvc3QpOworCQlwbHV0byA9IChzdHJ1Y3QgcGx1dG8gKilob3N0LT5ob3N0ZGF0YTsKKwkJCisJCXBsdXRvLT5mYyA9IGZjOworCQorCQlTQ3BudC0+Y21uZFswXSA9IElOUVVJUlk7CisJCVNDcG50LT5jbW5kWzRdID0gMjU1OworCQkKKwkJLyogRkMgbGF5ZXIgcmVxdWlyZXMgdGhpcywgc28gdGhhdCBTQ3BudC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkIGlzIGluaXRpYWxseSAwICovCisJCVNDcG50LT5kZXZpY2UgPSAmZGV2OworCQlkZXYuaG9zdCA9IGhvc3Q7CisJCQorCQlTQ3BudC0+Y21kX2xlbiA9IENPTU1BTkRfU0laRShJTlFVSVJZKTsKKwkKKwkJU0NwbnQtPnJlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKwkJCisJCVNDcG50LT5kb25lID0gcGx1dG9fZGV0ZWN0X2RvbmU7CisJCVNDcG50LT5idWZmbGVuID0gMjU2OworCQlTQ3BudC0+YnVmZmVyID0gZmNzW2ldLmlucXVpcnk7CisJCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPSAyNTY7CisJCVNDcG50LT5yZXF1ZXN0X2J1ZmZlciA9IGZjc1tpXS5pbnF1aXJ5OworCQlQTEQoKCJzZXQgdXAgJWQgJTA4bHhcbiIsIGksIChsb25nKVNDcG50KSkKKwkJaSsrOworCX0KKwkKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCA1OyByZXRyeSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBmY3Njb3VudDsgaSsrKSB7CisJCQlpZiAoIWZjc1tpXS5mYykgYnJlYWs7CisJCQlpZiAoZmNzW2ldLmNtZC5yZXF1ZXN0LT5ycV9zdGF0dXMgIT0gUlFfU0NTSV9ET05FKSB7CisJCQkJZGlzYWJsZV9pcnEoZmNzW2ldLmZjLT5pcnEpOworCQkJCVBMTkQoKCJxdWV1ZWNvbW1hbmQgJWQgJWRcbiIsIHJldHJ5LCBpKSkKKwkJCQlmY3Bfc2NzaV9xdWV1ZWNvbW1hbmQgKCYoZmNzW2ldLmNtZCksIAorCQkJCQlwbHV0b19kZXRlY3Rfc2NzaV9kb25lKTsKKwkJCQllbmFibGVfaXJxKGZjc1tpXS5mYy0+aXJxKTsKKwkJCX0KKwkJfQorCSAgICAKKwkJZmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCAqIEhaOworCQlhZGRfdGltZXIoJmZjX3RpbWVyKTsKKwkJCisJCWRvd24oJmZjX3NlbSk7CisJCVBMTkQoKCJXb2tlbiB1cFxuIikpCisJCWlmICghYXRvbWljX3JlYWQoJmZjc3MpKQorCQkJYnJlYWs7IC8qIEFsbCBmYyBjaGFubmVscyBoYXZlIGFuc3dlcmVkIHVzICovCisJfQorCWRlbF90aW1lcl9zeW5jKCZmY190aW1lcik7CisKKwlQTE5EKCgiRmluaXNoZWQgc2VhcmNoXG4iKSkKKwlmb3IgKGkgPSAwLCBucGx1dG9zID0gMDsgaSA8IGZjc2NvdW50OyBpKyspIHsKKwkJU2NzaV9DbW5kICpTQ3BudDsKKwkJCisJCWlmICghKGZjID0gZmNzW2ldLmZjKSkgYnJlYWs7CisJCisJCVNDcG50ID0gJihmY3NbaV0uY21kKTsKKwkJCisJCS8qIExldCBGQyBtaWQtbGV2ZWwgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzICovCisJCVNDcG50LT5kb25lIChTQ3BudCk7CisJCQorCQlpZiAoIVNDcG50LT5yZXN1bHQpIHsKKwkJCXN0cnVjdCBwbHV0b19pbnF1aXJ5ICppbnE7CisJCQlzdHJ1Y3QgcGx1dG8gKnBsdXRvOworCQkJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwkJCQorCQkJaW5xID0gKHN0cnVjdCBwbHV0b19pbnF1aXJ5ICopZmNzW2ldLmlucXVpcnk7CisKKwkJCWlmICgoaW5xLT5kdHlwZSAmIDB4MWYpID09IFRZUEVfUFJPQ0VTU09SICYmCisJCQkgICAgIXN0cm5jbXAgKGlucS0+dmVuZG9yX2lkLCAiU1VOIiwgMykgJiYKKwkJCSAgICAhc3RybmNtcCAoaW5xLT5wcm9kdWN0X2lkLCAiU1NBIiwgMykpIHsKKwkJCQljaGFyICpwOworCQkJCWxvbmcgKmFnZXM7CisJCQkJCisJCQkJYWdlcyA9IGttYWxsb2MgKCgoaW5xLT5jaGFubmVscyArIDEpICogaW5xLT50YXJnZXRzKSAqIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFhZ2VzKSBjb250aW51ZTsKKwkJCQkKKwkJCQlob3N0ID0gc2NzaV9yZWdpc3RlciAodHBudCwgc2l6ZW9mIChzdHJ1Y3QgcGx1dG8pKTsKKwkJCQlpZighaG9zdCkKKwkJCQl7CisJCQkJCWtmcmVlKGFnZXMpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKCF0cnlfbW9kdWxlX2dldChmYy0+bW9kdWxlKSkgeworCQkJCQlrZnJlZShhZ2VzKTsKKwkJCQkJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlucGx1dG9zKys7CisJCQkJCisJCQkJcGx1dG8gPSAoc3RydWN0IHBsdXRvICopaG9zdC0+aG9zdGRhdGE7CisJCQkJCisJCQkJaG9zdC0+bWF4X2lkID0gaW5xLT50YXJnZXRzOworCQkJCWhvc3QtPm1heF9jaGFubmVsID0gaW5xLT5jaGFubmVsczsKKwkJCQlob3N0LT5pcnEgPSBmYy0+aXJxOworCisJCQkJZmMtPmNoYW5uZWxzID0gaW5xLT5jaGFubmVscyArIDE7CisJCQkJZmMtPnRhcmdldHMgPSBpbnEtPnRhcmdldHM7CisJCQkJZmMtPmFnZXMgPSBhZ2VzOworCQkJCW1lbXNldCAoYWdlcywgMCwgKChpbnEtPmNoYW5uZWxzICsgMSkgKiBpbnEtPnRhcmdldHMpICogc2l6ZW9mKGxvbmcpKTsKKwkJCQkKKwkJCQlwbHV0by0+ZmMgPSBmYzsKKwkJCQltZW1jcHkgKHBsdXRvLT5yZXZfc3RyLCBpbnEtPnJldmlzaW9uLCA0KTsKKwkJCQlwbHV0by0+cmV2X3N0cls0XSA9IDA7CisJCQkJcCA9IHN0cmNociAocGx1dG8tPnJldl9zdHIsICcgJyk7CisJCQkJaWYgKHApICpwID0gMDsKKwkJCQltZW1jcHkgKHBsdXRvLT5md19yZXZfc3RyLCBpbnEtPmZ3X3JldmlzaW9uLCA0KTsKKwkJCQlwbHV0by0+ZndfcmV2X3N0cls0XSA9IDA7CisJCQkJcCA9IHN0cmNociAocGx1dG8tPmZ3X3Jldl9zdHIsICcgJyk7CisJCQkJaWYgKHApICpwID0gMDsKKwkJCQltZW1jcHkgKHBsdXRvLT5zZXJpYWxfc3RyLCBpbnEtPnNlcmlhbCwgMTIpOworCQkJCXBsdXRvLT5zZXJpYWxfc3RyWzEyXSA9IDA7CisJCQkJcCA9IHN0cmNociAocGx1dG8tPnNlcmlhbF9zdHIsICcgJyk7CisJCQkJaWYgKHApICpwID0gMDsKKwkJCQkKKwkJCQlQTEQoKCJGb3VuZCBTU0EgcmV2ICVzIGZ3IHJldiAlcyBzZXJpYWwgJXMgJWR4JWRcbiIsIHBsdXRvLT5yZXZfc3RyLCBwbHV0by0+ZndfcmV2X3N0ciwgcGx1dG8tPnNlcmlhbF9zdHIsIGhvc3QtPm1heF9jaGFubmVsLCBob3N0LT5tYXhfaWQpKQorCQkJfSBlbHNlCisJCQkJZmMtPmZjcF9yZWdpc3RlcihmYywgVFlQRV9TQ1NJX0ZDUCwgMSk7CisJCX0gZWxzZQorCQkJZmMtPmZjcF9yZWdpc3RlcihmYywgVFlQRV9TQ1NJX0ZDUCwgMSk7CisJfQorCWtmcmVlKChjaGFyICopZmNzKTsKKwlpZiAobnBsdXRvcykKKwkJcHJpbnRrICgiUExVVE86IFRvdGFsIG9mICVkIFNwYXJjU1RPUkFHRSBBcnJheXMgZm91bmRcbiIsIG5wbHV0b3MpOworCXJldHVybiBucGx1dG9zOworfQorCitpbnQgcGx1dG9fcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBwbHV0byAqcGx1dG8gPSAoc3RydWN0IHBsdXRvICopaG9zdC0+aG9zdGRhdGE7CisJZmNfY2hhbm5lbCAqZmMgPSBwbHV0by0+ZmM7CisKKwltb2R1bGVfcHV0KGZjLT5tb2R1bGUpOworCQorCWZjLT5mY3BfcmVnaXN0ZXIoZmMsIFRZUEVfU0NTSV9GQ1AsIDEpOworCVBMTkQoKCIgcmVsZWFzaW5nIHBsdXRvLlxuIikpOworCWtmcmVlIChmYy0+YWdlcyk7CisJUExORCgoInJlbGVhc2VkIHBsdXRvIVxuIikpOworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpwbHV0b19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RhdGljIGNoYXIgYnVmWzEyOF0sICpwOworCXN0cnVjdCBwbHV0byAqcGx1dG8gPSAoc3RydWN0IHBsdXRvICopIGhvc3QtPmhvc3RkYXRhOworCisJc3ByaW50ZihidWYsICJTVU4gU3BhcmNTVE9SQUdFIEFycmF5ICVzIGZ3ICVzIHNlcmlhbCAlcyAlZHglZCBvbiAlcyIsCisJCXBsdXRvLT5yZXZfc3RyLCBwbHV0by0+ZndfcmV2X3N0ciwgcGx1dG8tPnNlcmlhbF9zdHIsCisJCWhvc3QtPm1heF9jaGFubmVsLCBob3N0LT5tYXhfaWQsIHBsdXRvLT5mYy0+bmFtZSk7CisjaWZkZWYgX19zcGFyY19fCisJcCA9IHN0cmNocihidWYsIDApOworCXNwcmludGYocCwgIiBQUk9NIG5vZGUgJXgiLCBwbHV0by0+ZmMtPmRldi0+cHJvbV9ub2RlKTsKKyNlbmRpZgkKKwlyZXR1cm4gYnVmOworfQorCisvKiBTU0EgdXNlcyB0aGlzIEZDNFMgYWRkcmVzc2luZzoKKyAgIHN3aXRjaCAoYWRkclswXSkKKyAgIHsKKyAgIGNhc2UgMDogQ09OVFJPTExFUiAtIEFsbCBvZiBhZGRyWzFdLi5hZGRyWzNdIGhhcyB0byBiZSAwCisgICBjYXNlIDE6IFNJTkdMRSBESVNLIC0gYWRkclsxXSBjaGFubmVsLCBhZGRyWzJdIGlkLCBhZGRyWzNdIDAKKyAgIGNhc2UgMjogRElTSyBHUk9VUCAtID8/PworICAgfQorICAgCisgICBTbyB0aGF0IFNDU0kgbWlkLWxheWVyIGNhbiBhY2Nlc3MgdG8gdGhlc2UsIHdlIHJlc2VydmUKKyAgIGNoYW5uZWwgMCBpZCAwIGx1biAwIGZvciBDT05UUk9MTEVSCisgICBhbmQgY2hhbm5lbHMgMSAuLiBtYXhfY2hhbm5lbCBhcmUgbm9ybWFsIHNpbmdsZSBkaXNrcy4KKyAqLworc3RhdGljIGludCBwbHV0b19lbmNvZGVfYWRkcihTY3NpX0NtbmQgKlNDcG50LCB1MTYgKmFkZHIsIGZjX2NoYW5uZWwgKmZjLCBmY3BfY21uZCAqZmNtZCkKK3sKKwlQTE5EKCgiZW5jb2RlIGFkZHIgJWQgJWQgJWRcbiIsIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+Y21uZFsxXSAmIDB4ZTApKQorCS8qIFdlIGRvbid0IHN1cHBvcnQgTFVOcyAtIG5laXRoZXIgZG9lcyBTU0EgOikgKi8KKwlpZiAoU0NwbnQtPmNtbmRbMV0gJiAweGUwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIVNDcG50LT5kZXZpY2UtPmNoYW5uZWwpIHsKKwkJaWYgKFNDcG50LT5kZXZpY2UtPmlkKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldCAoYWRkciwgMCwgNCAqIHNpemVvZih1MTYpKTsKKwl9IGVsc2UgeworCQlhZGRyWzBdID0gMTsKKwkJYWRkclsxXSA9IFNDcG50LT5kZXZpY2UtPmNoYW5uZWwgLSAxOworCQlhZGRyWzJdID0gU0NwbnQtPmRldmljZS0+aWQ7CisJCWFkZHJbM10gPSAwOworCX0KKwkvKiBXZSdyZSBQb2ludC10by1Qb2ludCwgc28gdGFyZ2V0IGl0IHRvIHRoZSBkZWZhdWx0IERJRCAqLworCWZjbWQtPmRpZCA9IGZjLT5kaWQ7CisJUExORCgoInRyeWluZyAlMDR4JTA0eCUwNHglMDR4XG4iLCBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdKSkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9ICJTcGFyYyBTdG9yYWdlIEFycmF5IDEwMC8yMDAiLAorCS5kZXRlY3QJCQk9IHBsdXRvX2RldGVjdCwKKwkucmVsZWFzZQkJPSBwbHV0b19yZWxlYXNlLAorCS5pbmZvCQkJPSBwbHV0b19pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZmNwX3Njc2lfcXVldWVjb21tYW5kLAorCS5zbGF2ZV9jb25maWd1cmUJPSBwbHV0b19zbGF2ZV9jb25maWd1cmUsCisJLmNhbl9xdWV1ZQkJPSBQTFVUT19DQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSAxLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGZjcF9zY3NpX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IGZjcF9zY3NpX2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBmY3Bfc2NzaV9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IGZjcF9zY3NpX2hvc3RfcmVzZXQsCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGx1dG8uaCBiL2RyaXZlcnMvc2NzaS9wbHV0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjg0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcGx1dG8uaApAQCAtMCwwICsxLDQ3IEBACisvKiBwbHV0by5oOiBTcGFyY1NUT1JBR0UgQXJyYXkgU0NTSSBob3N0IGFkYXB0ZXIgZHJpdmVyIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQorICovCisKKyNpZm5kZWYgX1BMVVRPX0gKKyNkZWZpbmUgX1BMVVRPX0gKKworI2luY2x1ZGUgIi4uL2ZjNC9mY3BfaW1wbC5oIgorCitzdHJ1Y3QgcGx1dG8geworCS8qIFRoaXMgbXVzdCBiZSBmaXJzdCAqLworCWZjX2NoYW5uZWwJKmZjOworCWNoYXIJCXJldl9zdHJbNV07CisJY2hhcgkJZndfcmV2X3N0cls1XTsKKwljaGFyCQlzZXJpYWxfc3RyWzEzXTsKK307CisKK3N0cnVjdCBwbHV0b19pbnF1aXJ5IHsKKwl1OAlkdHlwZTsKKwl1OAlyZW1vdmFibGU6MSwgcXVhbGlmaWVyOjc7CisJdTgJaXNvOjIsIGVjbWE6MywgYW5zaTozOworCXU4CWFlbmM6MSwgdHJtaW9wOjEsIDoyLCByZGY6NDsKKwl1OAlsZW47CisJdTgJeHh4MTsKKwl1OAl4eHgyOworCXU4CXJlbGFkZHI6MSwgd2J1czMyOjEsIHdidXMxNjoxLCBzeW5jOjEsIGxpbmtlZDoxLCA6MSwgY21kcXVlOjEsIHNvZnRyZXNldDoxOworCXU4CXZlbmRvcl9pZFs4XTsKKwl1OAlwcm9kdWN0X2lkWzE2XTsKKwl1OAlyZXZpc2lvbls0XTsKKwl1OAlmd19yZXZpc2lvbls0XTsKKwl1OAlzZXJpYWxbMTJdOworCXU4CXh4eDNbMl07CisJdTgJY2hhbm5lbHM7CisJdTgJdGFyZ2V0czsKK307CisKKy8qIFRoaXMgaXMgdGhlIG1heCBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgU0NTSSBjb21tYW5kcyBwZXIgcGx1dG8gKi8KKyNkZWZpbmUgUExVVE9fQ0FOX1FVRVVFCQkyNTQKKworaW50IHBsdXRvX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitpbnQgcGx1dG9fcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworY29uc3QgY2hhciAqIHBsdXRvX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqKTsKK2ludCBwbHV0b19zbGF2ZV9jb25maWd1cmUoU2NzaV9EZXZpY2UgKik7CisKKyNlbmRpZiAvKiAhKF9QTFVUT19IKSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHBhLmMgYi9kcml2ZXJzL3Njc2kvcHBhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiNDUyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9wcGEuYwpAQCAtMCwwICsxLDExNTAgQEAKKy8qIHBwYS5jICAgLS0gIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBJT01FR0EgUFBBMyAKKyAqIHBhcmFsbGVsIHBvcnQgU0NTSSBob3N0IGFkYXB0ZXIuCisgKiAKKyAqIChUaGUgUFBBMyBpcyB0aGUgZW1iZWRkZWQgY29udHJvbGxlciBpbiB0aGUgWklQIGRyaXZlLikKKyAqIAorICogKGMpIDE5OTUsMTk5NiBHcmFudCBSLiBHdWVudGhlciwgZ3JhbnRAdG9ycXVlLm5ldCwKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKiAKKyAqIEN1cnJlbnQgTWFpbnRhaW5lcjogRGF2aWQgQ2FtcGJlbGwgKFBlcnRoLCBXZXN0ZXJuIEF1c3RyYWxpYSwgR01UKzA4MDApCisgKiAgICAgICAgICAgICAgICAgICAgIGNhbXBiZWxsQHRvcnF1ZS5uZXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKworc3RhdGljIHZvaWQgcHBhX3Jlc2V0X3B1bHNlKHVuc2lnbmVkIGludCBiYXNlKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBwYXJkZXZpY2UgKmRldjsJLyogUGFycG9ydCBkZXZpY2UgZW50cnkgICAgICAgICAqLworCWludCBiYXNlOwkJLyogQWN0dWFsIHBvcnQgYWRkcmVzcyAgICAgICAgICAqLworCWludCBtb2RlOwkJLyogVHJhbnNmZXIgbW9kZSAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBzY3NpX2NtbmQgKmN1cl9jbWQ7CS8qIEN1cnJlbnQgcXVldWVkIGNvbW1hbmQgICAgICAgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHBhX3RxOwkvKiBQb2xsaW5nIGludGVycnVwdCBzdHVmZiAgICAgICAqLworCXVuc2lnbmVkIGxvbmcganN0YXJ0OwkvKiBKaWZmaWVzIGF0IHN0YXJ0ICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyByZWNvbl90bW87CS8qIEhvdyBtYW55IHVzZWNzIHRvIHdhaXQgZm9yIHJlY29ubmVjdGlvbiAoNnRoIGJpdCkgKi8KKwl1bnNpZ25lZCBpbnQgZmFpbGVkOjE7CS8qIEZhaWx1cmUgZmxhZyAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCB3YW50ZWQ6MTsJLyogUGFycG9ydCBzaGFyaW5nIGJ1c3kgZmxhZyAgICAqLworCXdhaXRfcXVldWVfaGVhZF90ICp3YWl0aW5nOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfSBwcGFfc3RydWN0OworCisjaW5jbHVkZSAgInBwYS5oIgorCitzdGF0aWMgaW5saW5lIHBwYV9zdHJ1Y3QgKnBwYV9kZXYoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKihwcGFfc3RydWN0ICoqKSZob3N0LT5ob3N0ZGF0YTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhhcmJpdHJhdGlvbl9sb2NrKTsKKworc3RhdGljIHZvaWQgZ290X2l0KHBwYV9zdHJ1Y3QgKmRldikKK3sKKwlkZXYtPmJhc2UgPSBkZXYtPmRldi0+cG9ydC0+YmFzZTsKKwlpZiAoZGV2LT5jdXJfY21kKQorCQlkZXYtPmN1cl9jbWQtPlNDcC5waGFzZSA9IDE7CisJZWxzZQorCQl3YWtlX3VwKGRldi0+d2FpdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkIHBwYV93YWtldXAodm9pZCAqcmVmKQoreworCXBwYV9zdHJ1Y3QgKmRldiA9IChwcGFfc3RydWN0ICopIHJlZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGV2LT53YW50ZWQpIHsKKwkJcGFycG9ydF9jbGFpbShkZXYtPmRldik7CisJCWdvdF9pdChkZXYpOworCQlkZXYtPndhbnRlZCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcHBhX3BiX2NsYWltKHBwYV9zdHJ1Y3QgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXMgPSAxOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJaWYgKHBhcnBvcnRfY2xhaW0oZGV2LT5kZXYpID09IDApIHsKKwkJZ290X2l0KGRldik7CisJCXJlcyA9IDA7CisJfQorCWRldi0+d2FudGVkID0gcmVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBwcGFfcGJfZGlzbWlzcyhwcGFfc3RydWN0ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2FudGVkOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcmJpdHJhdGlvbl9sb2NrLCBmbGFncyk7CisJd2FudGVkID0gZGV2LT53YW50ZWQ7CisJZGV2LT53YW50ZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyYml0cmF0aW9uX2xvY2ssIGZsYWdzKTsKKwlpZiAoIXdhbnRlZCkKKwkJcGFycG9ydF9yZWxlYXNlKGRldi0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBwYV9wYl9yZWxlYXNlKHBwYV9zdHJ1Y3QgKmRldikKK3sKKwlwYXJwb3J0X3JlbGVhc2UoZGV2LT5kZXYpOworfQorCisvKgorICogU3RhcnQgb2YgQ2hpcHNldCBrbHVkZ2VzCisgKi8KKworLyogVGhpcyBpcyB0byBnaXZlIHRoZSBwcGEgZHJpdmVyIGEgd2F5IHRvIG1vZGlmeSB0aGUgdGltaW5ncyAoYW5kIG90aGVyCisgKiBwYXJhbWV0ZXJzKSBieSB3cml0aW5nIHRvIHRoZSAvcHJvYy9zY3NpL3BwYS8wIGZpbGUuCisgKiBWZXJ5IHNpbXBsZSBtZXRob2QgcmVhbGx5Li4uIChUbyBzaW1wbGUsIG5vIGVycm9yIGNoZWNraW5nIDooICkKKyAqIFJlYXNvbjogS2VybmVsIGhhY2tlcnMgSEFURSBoYXZpbmcgdG8gdW5sb2FkIGFuZCByZWxvYWQgbW9kdWxlcyBmb3IKKyAqIHRlc3RpbmcuLi4KKyAqIEFsc28gZ2l2ZXMgYSBtZXRob2QgdG8gdXNlIGEgc2NyaXB0IHRvIG9idGFpbiBvcHRpbXVtIHRpbWluZ3MgKFRPRE8pCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcHBhX3Byb2Nfd3JpdGUocHBhX3N0cnVjdCAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyB4OworCisJaWYgKChsZW5ndGggPiA1KSAmJiAoc3RybmNtcChidWZmZXIsICJtb2RlPSIsIDUpID09IDApKSB7CisJCXggPSBzaW1wbGVfc3RydG91bChidWZmZXIgKyA1LCBOVUxMLCAwKTsKKwkJZGV2LT5tb2RlID0geDsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisJaWYgKChsZW5ndGggPiAxMCkgJiYgKHN0cm5jbXAoYnVmZmVyLCAicmVjb25fdG1vPSIsIDEwKSA9PSAwKSkgeworCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyICsgMTAsIE5VTEwsIDApOworCQlkZXYtPnJlY29uX3RtbyA9IHg7CisJCXByaW50aygicHBhOiByZWNvbl90bW8gc2V0IHRvICVsZFxuIiwgeCk7CisJCXJldHVybiBsZW5ndGg7CisJfQorCXByaW50aygicHBhIC9wcm9jOiBpbnZhbGlkIHZhcmlhYmxlXG4iKTsKKwlyZXR1cm4gKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW50IHBwYV9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW4gPSAwOworCXBwYV9zdHJ1Y3QgKmRldiA9IHBwYV9kZXYoaG9zdCk7CisKKwlpZiAoaW5vdXQpCisJCXJldHVybiBwcGFfcHJvY193cml0ZShkZXYsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlZlcnNpb24gOiAlc1xuIiwgUFBBX1ZFUlNJT04pOworCWxlbiArPQorCSAgICBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIlBhcnBvcnQgOiAlc1xuIiwKKwkJICAgIGRldi0+ZGV2LT5wb3J0LT5uYW1lKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihidWZmZXIgKyBsZW4sICJNb2RlICAgIDogJXNcbiIsCisJCSAgICBQUEFfTU9ERV9TVFJJTkdbZGV2LT5tb2RlXSk7CisjaWYgUFBBX0RFQlVHID4gMAorCWxlbiArPQorCSAgICBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgInJlY29uX3RtbyA6ICVsdVxuIiwgZGV2LT5yZWNvbl90bW8pOworI2VuZGlmCisKKwkvKiBSZXF1ZXN0IGZvciBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAqLworCWlmIChvZmZzZXQgPiBsZW5ndGgpCisJCXJldHVybiAwOworCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX2NoZWNrKHBwYV9zdHJ1Y3QgKmRldik7CisKKyNpZiBQUEFfREVCVUcgPiAwCisjZGVmaW5lIHBwYV9mYWlsKHgseSkgcHJpbnRrKCJwcGE6IHBwYV9mYWlsKCVpKSBmcm9tICVzIGF0IGxpbmUgJWRcbiIsXAorCSAgIHksIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBwcGFfZmFpbF9mdW5jKHgseSk7CitzdGF0aWMgaW5saW5lIHZvaWQgcHBhX2ZhaWxfZnVuYyhwcGFfc3RydWN0ICpkZXYsIGludCBlcnJvcl9jb2RlKQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcGFfZmFpbChwcGFfc3RydWN0ICpkZXYsIGludCBlcnJvcl9jb2RlKQorI2VuZGlmCit7CisJLyogSWYgd2UgZmFpbCBhIGRldmljZSB0aGVuIHdlIHRyYXNoIHN0YXR1cyAvIG1lc3NhZ2UgYnl0ZXMgKi8KKwlpZiAoZGV2LT5jdXJfY21kKSB7CisJCWRldi0+Y3VyX2NtZC0+cmVzdWx0ID0gZXJyb3JfY29kZSA8PCAxNjsKKwkJZGV2LT5mYWlsZWQgPSAxOworCX0KK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBoaWdoIGJpdCB0byBiZSBzZXQuCisgKiAKKyAqIEluIHByaW5jaXBsZSwgdGhpcyBjb3VsZCBiZSB0aWVkIHRvIGFuIGludGVycnVwdCwgYnV0IHRoZSBhZGFwdGVyCisgKiBkb2Vzbid0IGFwcGVhciB0byBiZSBkZXNpZ25lZCB0byBzdXBwb3J0IGludGVycnVwdHMuICBXZSBzcGluIG9uCisgKiB0aGUgMHg4MCByZWFkeSBiaXQuIAorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBwcGFfd2FpdChwcGFfc3RydWN0ICpkZXYpCit7CisJaW50IGs7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCXVuc2lnbmVkIGNoYXIgcjsKKworCWsgPSBQUEFfU1BJTl9UTU87CisJLyogV2FpdCBmb3IgYml0IDYgYW5kIDcgLSBQSkMgKi8KKwlmb3IgKHIgPSByX3N0cihwcGIpOyAoKHIgJiAweGMwKSAhPSAweGMwKSAmJiAoayk7IGstLSkgeworCQl1ZGVsYXkoMSk7CisJCXIgPSByX3N0cihwcGIpOworCX0KKworCS8qCisJICogcmV0dXJuIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uLgorCSAqIFNlbWFudGljczogMHhjMCA9IFpJUCB3YW50cyBtb3JlIGRhdGEKKwkgKiAgICAgICAgICAgIDB4ZDAgPSBaSVAgd2FudHMgdG8gc2VuZCBtb3JlIGRhdGEKKwkgKiAgICAgICAgICAgIDB4ZTAgPSBaSVAgaXMgZXhwZWN0aW5nIFNDU0kgY29tbWFuZCBkYXRhCisJICogICAgICAgICAgICAweGYwID0gZW5kIG9mIHRyYW5zZmVyLCBaSVAgaXMgc2VuZGluZyBzdGF0dXMKKwkgKi8KKwlpZiAoaykKKwkJcmV0dXJuIChyICYgMHhmMCk7CisKKwkvKiBDb3VudGVyIGV4cGlyZWQgLSBUaW1lIG91dCBvY2N1cnJlZCAqLworCXBwYV9mYWlsKGRldiwgRElEX1RJTUVfT1VUKTsKKwlwcmludGsoInBwYSB0aW1lb3V0IGluIHBwYV93YWl0XG4iKTsKKwlyZXR1cm4gMDsJCS8qIGNvbW1hbmQgdGltZWQgb3V0ICovCit9CisKKy8qCisgKiBDbGVhciBFUFAgVGltZW91dCBCaXQgCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlcHBfcmVzZXQodW5zaWduZWQgc2hvcnQgcHBiKQoreworCWludCBpOworCisJaSA9IHJfc3RyKHBwYik7CisJd19zdHIocHBiLCBpKTsKKwl3X3N0cihwcGIsIGkgJiAweGZlKTsKK30KKworLyogCisgKiBXYWl0IGZvciBlbXB0eSBFQ1AgZmlmbyAoaWYgd2UgYXJlIGluIEVDUCBmaWZvIG1vZGUgb25seSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVjcF9zeW5jKHBwYV9zdHJ1Y3QgKmRldikKK3sKKwlpbnQgaSwgcHBiX2hpID0gZGV2LT5kZXYtPnBvcnQtPmJhc2VfaGk7CisKKwlpZiAocHBiX2hpID09IDApCisJCXJldHVybjsKKworCWlmICgocl9lY3IocHBiX2hpKSAmIDB4ZTApID09IDB4NjApIHsJLyogbW9kZSAwMTEgPT0gRUNQIGZpZm8gbW9kZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJCWlmIChyX2VjcihwcGJfaGkpICYgMHgwMSkKKwkJCQlyZXR1cm47CisJCQl1ZGVsYXkoNSk7CisJCX0KKwkJcHJpbnRrKCJwcGE6IEVDUCBzeW5jIGZhaWxlZCBhcyBkYXRhIHN0aWxsIHByZXNlbnQgaW4gRklGTy5cbiIpOworCX0KK30KKworc3RhdGljIGludCBwcGFfYnl0ZV9vdXQodW5zaWduZWQgc2hvcnQgYmFzZSwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gbGVuOyBpOyBpLS0pIHsKKwkJd19kdHIoYmFzZSwgKmJ1ZmZlcisrKTsKKwkJd19jdHIoYmFzZSwgMHhlKTsKKwkJd19jdHIoYmFzZSwgMHhjKTsKKwl9CisJcmV0dXJuIDE7CQkvKiBBbGwgd2VudCB3ZWxsIC0gd2UgaG9wZSEgKi8KK30KKworc3RhdGljIGludCBwcGFfYnl0ZV9pbih1bnNpZ25lZCBzaG9ydCBiYXNlLCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBsZW47IGk7IGktLSkgeworCQkqYnVmZmVyKysgPSByX2R0cihiYXNlKTsKKwkJd19jdHIoYmFzZSwgMHgyNyk7CisJCXdfY3RyKGJhc2UsIDB4MjUpOworCX0KKwlyZXR1cm4gMTsJCS8qIEFsbCB3ZW50IHdlbGwgLSB3ZSBob3BlISAqLworfQorCitzdGF0aWMgaW50IHBwYV9uaWJibGVfaW4odW5zaWduZWQgc2hvcnQgYmFzZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWZvciAoOyBsZW47IGxlbi0tKSB7CisJCXVuc2lnbmVkIGNoYXIgaDsKKworCQl3X2N0cihiYXNlLCAweDQpOworCQloID0gcl9zdHIoYmFzZSkgJiAweGYwOworCQl3X2N0cihiYXNlLCAweDYpOworCQkqYnVmZmVyKysgPSBoIHwgKChyX3N0cihiYXNlKSAmIDB4ZjApID4+IDQpOworCX0KKwlyZXR1cm4gMTsJCS8qIEFsbCB3ZW50IHdlbGwgLSB3ZSBob3BlISAqLworfQorCitzdGF0aWMgaW50IHBwYV9vdXQocHBhX3N0cnVjdCAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IHI7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCisJciA9IHBwYV93YWl0KGRldik7CisKKwlpZiAoKHIgJiAweDUwKSAhPSAweDQwKSB7CisJCXBwYV9mYWlsKGRldiwgRElEX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaCAoZGV2LT5tb2RlKSB7CisJY2FzZSBQUEFfTklCQkxFOgorCWNhc2UgUFBBX1BTMjoKKwkJLyogOCBiaXQgb3V0cHV0LCB3aXRoIGEgbG9vcCAqLworCQlyID0gcHBhX2J5dGVfb3V0KHBwYiwgYnVmZmVyLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgUFBBX0VQUF8zMjoKKwljYXNlIFBQQV9FUFBfMTY6CisJY2FzZSBQUEFfRVBQXzg6CisJCWVwcF9yZXNldChwcGIpOworCQl3X2N0cihwcGIsIDB4NCk7CisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9FUFAxNgorCQlpZiAoISgoKGxvbmcpIGJ1ZmZlciB8IGxlbikgJiAweDAxKSkKKwkJCW91dHN3KHBwYiArIDQsIGJ1ZmZlciwgbGVuID4+IDEpOworI2Vsc2UKKwkJaWYgKCEoKChsb25nKSBidWZmZXIgfCBsZW4pICYgMHgwMykpCisJCQlvdXRzbChwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAyKTsKKyNlbmRpZgorCQllbHNlCisJCQlvdXRzYihwcGIgKyA0LCBidWZmZXIsIGxlbik7CisJCXdfY3RyKHBwYiwgMHhjKTsKKwkJciA9ICEocl9zdHIocHBiKSAmIDB4MDEpOworCQl3X2N0cihwcGIsIDB4Yyk7CisJCWVjcF9zeW5jKGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJQUEE6IGJ1ZyBpbiBwcGFfb3V0KClcbiIpOworCQlyID0gMDsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcHBhX2luKHBwYV9zdHJ1Y3QgKmRldiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCByOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKworCXIgPSBwcGFfd2FpdChkZXYpOworCisJaWYgKChyICYgMHg1MCkgIT0gMHg1MCkgeworCQlwcGFfZmFpbChkZXYsIERJRF9FUlJPUik7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2ggKGRldi0+bW9kZSkgeworCWNhc2UgUFBBX05JQkJMRToKKwkJLyogNCBiaXQgaW5wdXQsIHdpdGggYSBsb29wICovCisJCXIgPSBwcGFfbmliYmxlX2luKHBwYiwgYnVmZmVyLCBsZW4pOworCQl3X2N0cihwcGIsIDB4Yyk7CisJCWJyZWFrOworCisJY2FzZSBQUEFfUFMyOgorCQkvKiA4IGJpdCBpbnB1dCwgd2l0aCBhIGxvb3AgKi8KKwkJd19jdHIocHBiLCAweDI1KTsKKwkJciA9IHBwYV9ieXRlX2luKHBwYiwgYnVmZmVyLCBsZW4pOworCQl3X2N0cihwcGIsIDB4NCk7CisJCXdfY3RyKHBwYiwgMHhjKTsKKwkJYnJlYWs7CisKKwljYXNlIFBQQV9FUFBfMzI6CisJY2FzZSBQUEFfRVBQXzE2OgorCWNhc2UgUFBBX0VQUF84OgorCQllcHBfcmVzZXQocHBiKTsKKwkJd19jdHIocHBiLCAweDI0KTsKKyNpZmRlZiBDT05GSUdfU0NTSV9JWklQX0VQUDE2CisJCWlmICghKCgobG9uZykgYnVmZmVyIHwgbGVuKSAmIDB4MDEpKQorCQkJaW5zdyhwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAxKTsKKyNlbHNlCisJCWlmICghKCgobG9uZykgYnVmZmVyIHwgbGVuKSAmIDB4MDMpKQorCQkJaW5zbChwcGIgKyA0LCBidWZmZXIsIGxlbiA+PiAyKTsKKyNlbmRpZgorCQllbHNlCisJCQlpbnNiKHBwYiArIDQsIGJ1ZmZlciwgbGVuKTsKKwkJd19jdHIocHBiLCAweDJjKTsKKwkJciA9ICEocl9zdHIocHBiKSAmIDB4MDEpOworCQl3X2N0cihwcGIsIDB4MmMpOworCQllY3Bfc3luYyhkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiUFBBOiBidWcgaW4gcHBhX2lucygpXG4iKTsKKwkJciA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcjsKK30KKworLyogZW5kIG9mIHBwYV9pby5oICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHBhX2RfcHVsc2UodW5zaWduZWQgc2hvcnQgcHBiLCB1bnNpZ25lZCBjaGFyIGIpCit7CisJd19kdHIocHBiLCBiKTsKKwl3X2N0cihwcGIsIDB4Yyk7CisJd19jdHIocHBiLCAweGUpOworCXdfY3RyKHBwYiwgMHhjKTsKKwl3X2N0cihwcGIsIDB4NCk7CisJd19jdHIocHBiLCAweGMpOworfQorCitzdGF0aWMgdm9pZCBwcGFfZGlzY29ubmVjdChwcGFfc3RydWN0ICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCisJcHBhX2RfcHVsc2UocHBiLCAwKTsKKwlwcGFfZF9wdWxzZShwcGIsIDB4M2MpOworCXBwYV9kX3B1bHNlKHBwYiwgMHgyMCk7CisJcHBhX2RfcHVsc2UocHBiLCAweGYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHBhX2NfcHVsc2UodW5zaWduZWQgc2hvcnQgcHBiLCB1bnNpZ25lZCBjaGFyIGIpCit7CisJd19kdHIocHBiLCBiKTsKKwl3X2N0cihwcGIsIDB4NCk7CisJd19jdHIocHBiLCAweDYpOworCXdfY3RyKHBwYiwgMHg0KTsKKwl3X2N0cihwcGIsIDB4Yyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcGFfY29ubmVjdChwcGFfc3RydWN0ICpkZXYsIGludCBmbGFnKQoreworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKworCXBwYV9jX3B1bHNlKHBwYiwgMCk7CisJcHBhX2NfcHVsc2UocHBiLCAweDNjKTsKKwlwcGFfY19wdWxzZShwcGIsIDB4MjApOworCWlmICgoZmxhZyA9PSBDT05ORUNUX0VQUF9NQVlCRSkgJiYgSU5fRVBQX01PREUoZGV2LT5tb2RlKSkKKwkJcHBhX2NfcHVsc2UocHBiLCAweGNmKTsKKwllbHNlCisJCXBwYV9jX3B1bHNlKHBwYiwgMHg4Zik7Cit9CisKK3N0YXRpYyBpbnQgcHBhX3NlbGVjdChwcGFfc3RydWN0ICpkZXYsIGludCB0YXJnZXQpCit7CisJaW50IGs7CisJdW5zaWduZWQgc2hvcnQgcHBiID0gZGV2LT5iYXNlOworCisJLyoKKwkgKiBCaXQgNiAoMHg0MCkgaXMgdGhlIGRldmljZSBzZWxlY3RlZCBiaXQuCisJICogRmlyc3Qgd2UgbXVzdCB3YWl0IHRpbGwgdGhlIGN1cnJlbnQgZGV2aWNlIGdvZXMgb2ZmIGxpbmUuLi4KKwkgKi8KKwlrID0gUFBBX1NFTEVDVF9UTU87CisJZG8geworCQlrLS07CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgocl9zdHIocHBiKSAmIDB4NDApICYmIChrKSk7CisJaWYgKCFrKQorCQlyZXR1cm4gMDsKKworCXdfZHRyKHBwYiwgKDEgPDwgdGFyZ2V0KSk7CisJd19jdHIocHBiLCAweGUpOworCXdfY3RyKHBwYiwgMHhjKTsKKwl3X2R0cihwcGIsIDB4ODApOwkvKiBUaGlzIGlzIE5PVCB0aGUgaW5pdGF0b3IgKi8KKwl3X2N0cihwcGIsIDB4OCk7CisKKwlrID0gUFBBX1NFTEVDVF9UTU87CisJZG8geworCQlrLS07CisJCXVkZWxheSgxKTsKKwl9CisJd2hpbGUgKCEocl9zdHIocHBiKSAmIDB4NDApICYmIChrKSk7CisJaWYgKCFrKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiAKKyAqIFRoaXMgaXMgYmFzZWQgb24gYSB0cmFjZSBvZiB3aGF0IHRoZSBJb21lZ2EgRE9TICdndWVzdCcgZHJpdmVyIGRvZXMuCisgKiBJJ3ZlIHRyaWVkIHNldmVyYWwgZGlmZmVyZW50IGtpbmRzIG9mIHBhcmFsbGVsIHBvcnRzIHdpdGggZ3Vlc3QgYW5kCisgKiBjb2RlZCB0aGlzIHRvIHJlYWN0IGluIHRoZSBzYW1lIHdheXMgdGhhdCBpdCBkb2VzLgorICogCisgKiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgaGludCBhYm91dCB3aGVyZSB0aGUKKyAqIGhhbmRzaGFraW5nIGZhaWxlZC4KKyAqIAorICovCitzdGF0aWMgaW50IHBwYV9pbml0KHBwYV9zdHJ1Y3QgKmRldikKK3sKKwlpbnQgcmV0djsKKwl1bnNpZ25lZCBzaG9ydCBwcGIgPSBkZXYtPmJhc2U7CisKKwlwcGFfZGlzY29ubmVjdChkZXYpOworCXBwYV9jb25uZWN0KGRldiwgQ09OTkVDVF9OT1JNQUwpOworCisJcmV0diA9IDI7CQkvKiBGYWlsZWQgKi8KKworCXdfY3RyKHBwYiwgMHhlKTsKKwlpZiAoKHJfc3RyKHBwYikgJiAweDA4KSA9PSAweDA4KQorCQlyZXR2LS07CisKKwl3X2N0cihwcGIsIDB4Yyk7CisJaWYgKChyX3N0cihwcGIpICYgMHgwOCkgPT0gMHgwMCkKKwkJcmV0di0tOworCisJaWYgKCFyZXR2KQorCQlwcGFfcmVzZXRfcHVsc2UocHBiKTsKKwl1ZGVsYXkoMTAwMCk7CQkvKiBBbGxvdyBkZXZpY2VzIHRvIHNldHRsZSBkb3duICovCisJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKwl1ZGVsYXkoMTAwMCk7CQkvKiBBbm90aGVyIGRlbGF5IHRvIGFsbG93IGRldmljZXMgdG8gc2V0dGxlICovCisKKwlpZiAocmV0dikKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gZGV2aWNlX2NoZWNrKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBwYV9zZW5kX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXBwYV9zdHJ1Y3QgKmRldiA9IHBwYV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCWludCBrOworCisJd19jdHIoZGV2LT5iYXNlLCAweDBjKTsKKworCWZvciAoayA9IDA7IGsgPCBjbWQtPmNtZF9sZW47IGsrKykKKwkJaWYgKCFwcGFfb3V0KGRldiwgJmNtZC0+Y21uZFtrXSwgMSkpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoZSBidWxrIGZsYWcgZW5hYmxlcyBzb21lIG9wdGltaXNhdGlvbnMgaW4gdGhlIGRhdGEgdHJhbnNmZXIgbG9vcHMsCisgKiBpdCBzaG91bGQgYmUgdHJ1ZSBmb3IgYW55IGNvbW1hbmQgdGhhdCB0cmFuc2ZlcnMgZGF0YSBpbiBpbnRlZ3JhbAorICogbnVtYmVycyBvZiBzZWN0b3JzLgorICogCisgKiBUaGUgZHJpdmVyIGFwcGVhcnMgdG8gcmVtYWluIHN0YWJsZSBpZiB3ZSBzcGVlZCB1cCB0aGUgcGFyYWxsZWwgcG9ydAorICogaS9vIGluIHRoaXMgZnVuY3Rpb24sIGJ1dCBub3QgZWxzZXdoZXJlLgorICovCitzdGF0aWMgaW50IHBwYV9jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwkvKiBSZXR1cm4gY29kZXM6CisJICogLTEgICAgIEVycm9yCisJICogIDAgICAgIFRvbGQgdG8gc2NoZWR1bGUKKwkgKiAgMSAgICAgRmluaXNoZWQgZGF0YSB0cmFuc2ZlcgorCSAqLworCXBwYV9zdHJ1Y3QgKmRldiA9IHBwYV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJdW5zaWduZWQgY2hhciByLCB2OworCWludCBmYXN0LCBidWxrLCBzdGF0dXM7CisKKwl2ID0gY21kLT5jbW5kWzBdOworCWJ1bGsgPSAoKHYgPT0gUkVBRF82KSB8fAorCQkodiA9PSBSRUFEXzEwKSB8fCAodiA9PSBXUklURV82KSB8fCAodiA9PSBXUklURV8xMCkpOworCisJLyoKKwkgKiBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZSBkcml2ZSBpcyByZWFkeSB0byBjb211bmljYXRlLAorCSAqIGhlbmNlIG5vIG5lZWQgZm9yIGEgZnVsbCBwcGFfd2FpdC4KKwkgKi8KKwlyID0gKHJfc3RyKHBwYikgJiAweGYwKTsKKworCXdoaWxlIChyICE9ICh1bnNpZ25lZCBjaGFyKSAweGYwKSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYmVlbiBydW5uaW5nIGZvciBtb3JlIHRoYW4gYSBmdWxsIHRpbWVyIHRpY2sKKwkJICogdGhlbiB0YWtlIGEgcmVzdC4KKwkJICovCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0X2ppZmZpZXMgKyAxKSkKKwkJCXJldHVybiAwOworCisJCWlmICgoY21kLT5TQ3AudGhpc19yZXNpZHVhbCA8PSAwKSkgeworCQkJcHBhX2ZhaWwoZGV2LCBESURfRVJST1IpOworCQkJcmV0dXJuIC0xOwkvKiBFUlJPUl9SRVRVUk4gKi8KKwkJfQorCisJCS8qIE9uIHNvbWUgaGFyZHdhcmUgd2UgaGF2ZSBTQ1NJIGRpc2Nvbm5lY3RlZCAoNnRoIGJpdCBsb3cpCisJCSAqIGZvciBhYm91dCAxMDB1c2Vjcy4gSXQgaXMgdG9vIGV4cGVuc2l2ZSB0byB3YWl0IGEgCisJCSAqIHRpY2sgb24gZXZlcnkgbG9vcCBzbyB3ZSBidXN5IHdhaXQgZm9yIG5vIG1vcmUgdGhhbgorCQkgKiA1MDB1c2VjcyB0byBnaXZlIHRoZSBkcml2ZSBhIGNoYW5jZSBmaXJzdC4gV2UgZG8gbm90IAorCQkgKiBjaGFuZ2UgdGhpbmdzIGZvciAibm9ybWFsIiBoYXJkd2FyZSBzaW5jZSBnZW5lcmFsbHkgCisJCSAqIHRoZSA2dGggYml0IGlzIGFsd2F5cyBoaWdoLgorCQkgKiBUaGlzIG1ha2VzIHRoZSBDUFUgbG9hZCBoaWdoZXIgb24gc29tZSBoYXJkd2FyZSAKKwkJICogYnV0IG90aGVyd2lzZSB3ZSBjYW4gbm90IGdldCBtb3JlIHRoYW4gNTBLL3NlY3MgCisJCSAqIG9uIHRoaXMgcHJvYmxlbSBoYXJkd2FyZS4KKwkJICovCisJCWlmICgociAmIDB4YzApICE9IDB4YzApIHsKKwkJCS8qIFdhaXQgZm9yIHJlY29ubmVjdGlvbiBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIAorCQkJICogamlmZnkvMiA9IDVtcyA9IDUwMDAgbG9vcHMKKwkJCSAqLworCQkJdW5zaWduZWQgbG9uZyBrID0gZGV2LT5yZWNvbl90bW87CisJCQlmb3IgKDsgayAmJiAoKHIgPSAocl9zdHIocHBiKSAmIDB4ZjApKSAmIDB4YzApICE9IDB4YzA7CisJCQkgICAgIGstLSkKKwkJCQl1ZGVsYXkoMSk7CisKKwkJCWlmICghaykKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIGRldGVybWluZSBpZiB3ZSBzaG91bGQgdXNlIGJ1cnN0IEkvTyAqLworCQlmYXN0ID0gKGJ1bGsgJiYgKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPj0gUFBBX0JVUlNUX1NJWkUpKQorCQkgICAgPyBQUEFfQlVSU1RfU0laRSA6IDE7CisKKwkJaWYgKHIgPT0gKHVuc2lnbmVkIGNoYXIpIDB4YzApCisJCQlzdGF0dXMgPSBwcGFfb3V0KGRldiwgY21kLT5TQ3AucHRyLCBmYXN0KTsKKwkJZWxzZQorCQkJc3RhdHVzID0gcHBhX2luKGRldiwgY21kLT5TQ3AucHRyLCBmYXN0KTsKKworCQljbWQtPlNDcC5wdHIgKz0gZmFzdDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtPSBmYXN0OworCisJCWlmICghc3RhdHVzKSB7CisJCQlwcGFfZmFpbChkZXYsIERJRF9CVVNfQlVTWSk7CisJCQlyZXR1cm4gLTE7CS8qIEVSUk9SX1JFVFVSTiAqLworCQl9CisJCWlmIChjbWQtPlNDcC5idWZmZXIgJiYgIWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpIHsKKwkJCS8qIGlmIHNjYXR0ZXIvZ2F0aGVyLCBhZHZhbmNlIHRvIHRoZSBuZXh0IHNlZ21lbnQgKi8KKwkJCWlmIChjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLS0pIHsKKwkJCQljbWQtPlNDcC5idWZmZXIrKzsKKwkJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0KKwkJCQkgICAgY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQkJY21kLT5TQ3AucHRyID0KKwkJCQkgICAgcGFnZV9hZGRyZXNzKGNtZC0+U0NwLmJ1ZmZlci0+cGFnZSkgKworCQkJCSAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJCX0KKwkJfQorCQkvKiBOb3cgY2hlY2sgdG8gc2VlIGlmIHRoZSBkcml2ZSBpcyByZWFkeSB0byBjb211bmljYXRlICovCisJCXIgPSAocl9zdHIocHBiKSAmIDB4ZjApOworCQkvKiBJZiBub3QsIGRyb3AgYmFjayBkb3duIHRvIHRoZSBzY2hlZHVsZXIgYW5kIHdhaXQgYSB0aW1lciB0aWNrICovCisJCWlmICghKHIgJiAweDgwKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsJCS8qIEZJTklTSF9SRVRVUk4gKi8KK30KKworLyoKKyAqIFNpbmNlIHRoZSBQUEEgaXRzZWxmIGRvZXNuJ3QgZ2VuZXJhdGUgaW50ZXJydXB0cywgd2UgdXNlCisgKiB0aGUgc2NoZWR1bGVyJ3MgdGFzayBxdWV1ZSB0byBnZW5lcmF0ZSBhIHN0cmVhbSBvZiBjYWxsLWJhY2tzIGFuZAorICogY29tcGxldGUgdGhlIHJlcXVlc3Qgd2hlbiB0aGUgZHJpdmUgaXMgcmVhZHkuCisgKi8KK3N0YXRpYyB2b2lkIHBwYV9pbnRlcnJ1cHQodm9pZCAqZGF0YSkKK3sKKwlwcGFfc3RydWN0ICpkZXYgPSAocHBhX3N0cnVjdCAqKSBkYXRhOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGRldi0+Y3VyX2NtZDsKKworCWlmICghY21kKSB7CisJCXByaW50aygiUFBBOiBidWcgaW4gcHBhX2ludGVycnVwdFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHBwYV9lbmdpbmUoZGV2LCBjbWQpKSB7CisJCWRldi0+cHBhX3RxLmRhdGEgPSAodm9pZCAqKSBkZXY7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT5wcGFfdHEsIDEpOworCQlyZXR1cm47CisJfQorCS8qIENvbW1hbmQgbXVzdCBvZiBjb21wbGV0ZWQgaGVuY2UgaXQgaXMgc2FmZSB0byBsZXQgZ28uLi4gKi8KKyNpZiBQUEFfREVCVUcgPiAwCisJc3dpdGNoICgoY21kLT5yZXN1bHQgPj4gMTYpICYgMHhmZikgeworCWNhc2UgRElEX09LOgorCQlicmVhazsKKwljYXNlIERJRF9OT19DT05ORUNUOgorCQlwcmludGsoInBwYTogbm8gZGV2aWNlIGF0IFNDU0kgSUQgJWlcbiIsIGNtZC0+ZGV2aWNlLT50YXJnZXQpOworCQlicmVhazsKKwljYXNlIERJRF9CVVNfQlVTWToKKwkJcHJpbnRrKCJwcGE6IEJVUyBCVVNZIC0gRVBQIHRpbWVvdXQgZGV0ZWN0ZWRcbiIpOworCQlicmVhazsKKwljYXNlIERJRF9USU1FX09VVDoKKwkJcHJpbnRrKCJwcGE6IHVua25vd24gdGltZW91dFxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX0FCT1JUOgorCQlwcmludGsoInBwYTogdG9sZCB0byBhYm9ydFxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX1BBUklUWToKKwkJcHJpbnRrKCJwcGE6IHBhcml0eSBlcnJvciAoPz8/KVxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX0VSUk9SOgorCQlwcmludGsoInBwYTogaW50ZXJuYWwgZHJpdmVyIGVycm9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESURfUkVTRVQ6CisJCXByaW50aygicHBhOiB0b2xkIHRvIHJlc2V0IGRldmljZVxuIik7CisJCWJyZWFrOworCWNhc2UgRElEX0JBRF9JTlRSOgorCQlwcmludGsoInBwYTogYmFkIGludGVycnVwdCAoPz8/KVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygicHBhOiBiYWQgcmV0dXJuIGNvZGUgKCUwMngpXG4iLAorCQkgICAgICAgKGNtZC0+cmVzdWx0ID4+IDE2KSAmIDB4ZmYpOworCX0KKyNlbmRpZgorCisJaWYgKGNtZC0+U0NwLnBoYXNlID4gMSkKKwkJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKworCXBwYV9wYl9kaXNtaXNzKGRldik7CisKKwlkZXYtPmN1cl9jbWQgPSBOVUxMOworCisJY21kLT5zY3NpX2RvbmUoY21kKTsKK30KKworc3RhdGljIGludCBwcGFfZW5naW5lKHBwYV9zdHJ1Y3QgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXVuc2lnbmVkIHNob3J0IHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGwgPSAwLCBoID0gMDsKKwlpbnQgcmV0djsKKworCS8qIEZpcnN0IGNoZWNrIGZvciBhbnkgZXJyb3JzIHRoYXQgbWF5IG9mIG9jY3VycmVkCisJICogSGVyZSB3ZSBjaGVjayBmb3IgaW50ZXJuYWwgZXJyb3JzCisJICovCisJaWYgKGRldi0+ZmFpbGVkKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY21kLT5TQ3AucGhhc2UpIHsKKwljYXNlIDA6CQkvKiBQaGFzZSAwIC0gV2FpdGluZyBmb3IgcGFycG9ydCAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkZXYtPmpzdGFydCArIEhaKSkgeworCQkJLyoKKwkJCSAqIFdlIHdhaXRlZCBtb3JlIHRoYW4gYSBzZWNvbmQKKwkJCSAqIGZvciBwYXJwb3J0IHRvIGNhbGwgdXMKKwkJCSAqLworCQkJcHBhX2ZhaWwoZGV2LCBESURfQlVTX0JVU1kpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CS8qIHdhaXQgdW50aWwgcHBhX3dha2V1cCBjbGFpbXMgcGFycG9ydCAqLworCWNhc2UgMToJCS8qIFBoYXNlIDEgLSBDb25uZWN0ZWQgKi8KKwkJewkJLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBmb3IgY2FibGUgdW5wbHVnZ2VkICovCisJCQlpbnQgcmV0diA9IDI7CS8qIEZhaWxlZCAqLworCisJCQlwcGFfY29ubmVjdChkZXYsIENPTk5FQ1RfRVBQX01BWUJFKTsKKworCQkJd19jdHIocHBiLCAweGUpOworCQkJaWYgKChyX3N0cihwcGIpICYgMHgwOCkgPT0gMHgwOCkKKwkJCQlyZXR2LS07CisKKwkJCXdfY3RyKHBwYiwgMHhjKTsKKwkJCWlmICgocl9zdHIocHBiKSAmIDB4MDgpID09IDB4MDApCisJCQkJcmV0di0tOworCisJCQlpZiAocmV0dikgeworCQkJCWlmICgoamlmZmllcyAtIGRldi0+anN0YXJ0KSA+ICgxICogSFopKSB7CisJCQkJCXByaW50aworCQkJCQkgICAgKCJwcGE6IFBhcmFsbGVsIHBvcnQgY2FibGUgaXMgdW5wbHVnZ2VkISFcbiIpOworCQkJCQlwcGFfZmFpbChkZXYsIERJRF9CVVNfQlVTWSk7CisJCQkJCXJldHVybiAwOworCQkJCX0gZWxzZSB7CisJCQkJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCQkJCXJldHVybiAxOwkvKiBUcnkgYWdhaW4gaW4gYSBqaWZmeSAqLworCQkJCX0KKwkJCX0KKwkJCWNtZC0+U0NwLnBoYXNlKys7CisJCX0KKworCWNhc2UgMjoJCS8qIFBoYXNlIDIgLSBXZSBhcmUgbm93IHRhbGtpbmcgdG8gdGhlIHNjc2kgYnVzICovCisJCWlmICghcHBhX3NlbGVjdChkZXYsIGNtZC0+ZGV2aWNlLT5pZCkpIHsKKwkJCXBwYV9mYWlsKGRldiwgRElEX05PX0NPTk5FQ1QpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCWNhc2UgMzoJCS8qIFBoYXNlIDMgLSBSZWFkeSB0byBhY2NlcHQgYSBjb21tYW5kICovCisJCXdfY3RyKHBwYiwgMHgwYyk7CisJCWlmICghKHJfc3RyKHBwYikgJiAweDgwKSkKKwkJCXJldHVybiAxOworCisJCWlmICghcHBhX3NlbmRfY29tbWFuZChjbWQpKQorCQkJcmV0dXJuIDA7CisJCWNtZC0+U0NwLnBoYXNlKys7CisKKwljYXNlIDQ6CQkvKiBQaGFzZSA0IC0gU2V0dXAgc2NhdHRlci9nYXRoZXIgYnVmZmVycyAqLworCQlpZiAoY21kLT51c2Vfc2cpIHsKKwkJCS8qIGlmIG1hbnkgYnVmZmVycyBhcmUgYXZhaWxhYmxlLCBzdGFydCBmaWxsaW5nIHRoZSBmaXJzdCAqLworCQkJY21kLT5TQ3AuYnVmZmVyID0KKwkJCSAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQljbWQtPlNDcC5wdHIgPQorCQkJICAgIHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJCSAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJfSBlbHNlIHsKKwkJCS8qIGVsc2UgZmlsbCB0aGUgb25seSBhdmFpbGFibGUgYnVmZmVyICovCisJCQljbWQtPlNDcC5idWZmZXIgPSBOVUxMOworCQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQkJY21kLT5TQ3AucHRyID0gY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJfQorCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCQljbWQtPlNDcC5waGFzZSsrOworCisJY2FzZSA1OgkJLyogUGhhc2UgNSAtIERhdGEgdHJhbnNmZXIgc3RhZ2UgKi8KKwkJd19jdHIocHBiLCAweDBjKTsKKwkJaWYgKCEocl9zdHIocHBiKSAmIDB4ODApKQorCQkJcmV0dXJuIDE7CisKKwkJcmV0diA9IHBwYV9jb21wbGV0aW9uKGNtZCk7CisJCWlmIChyZXR2ID09IC0xKQorCQkJcmV0dXJuIDA7CisJCWlmIChyZXR2ID09IDApCisJCQlyZXR1cm4gMTsKKwkJY21kLT5TQ3AucGhhc2UrKzsKKworCWNhc2UgNjoJCS8qIFBoYXNlIDYgLSBSZWFkIHN0YXR1cy9tZXNzYWdlICovCisJCWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkvKiBDaGVjayBmb3IgZGF0YSBvdmVycnVuICovCisJCWlmIChwcGFfd2FpdChkZXYpICE9ICh1bnNpZ25lZCBjaGFyKSAweGYwKSB7CisJCQlwcGFfZmFpbChkZXYsIERJRF9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAocHBhX2luKGRldiwgJmwsIDEpKSB7CS8qIHJlYWQgc3RhdHVzIGJ5dGUgKi8KKwkJCS8qIENoZWNrIGZvciBvcHRpb25hbCBtZXNzYWdlIGJ5dGUgKi8KKwkJCWlmIChwcGFfd2FpdChkZXYpID09ICh1bnNpZ25lZCBjaGFyKSAweGYwKQorCQkJCXBwYV9pbihkZXYsICZoLCAxKTsKKwkJCWNtZC0+cmVzdWx0ID0KKwkJCSAgICAoRElEX09LIDw8IDE2KSArIChoIDw8IDgpICsgKGwgJiBTVEFUVVNfTUFTSyk7CisJCX0KKwkJcmV0dXJuIDA7CS8qIEZpbmlzaGVkICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJwcGE6IEludmFsaWQgc2NzaSBwaGFzZVxuIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwYV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQl2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJcHBhX3N0cnVjdCAqZGV2ID0gcHBhX2RldihjbWQtPmRldmljZS0+aG9zdCk7CisKKwlpZiAoZGV2LT5jdXJfY21kKSB7CisJCXByaW50aygiUFBBOiBidWcgaW4gcHBhX3F1ZXVlY29tbWFuZFxuIik7CisJCXJldHVybiAwOworCX0KKwlkZXYtPmZhaWxlZCA9IDA7CisJZGV2LT5qc3RhcnQgPSBqaWZmaWVzOworCWRldi0+Y3VyX2NtZCA9IGNtZDsKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CS8qIGRlZmF1bHQgcmV0dXJuIGNvZGUgKi8KKwljbWQtPlNDcC5waGFzZSA9IDA7CS8qIGJ1cyBmcmVlICovCisKKwlkZXYtPnBwYV90cS5kYXRhID0gZGV2OworCXNjaGVkdWxlX3dvcmsoJmRldi0+cHBhX3RxKTsKKworCXBwYV9wYl9jbGFpbShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBcHBhcmVudGx5IHRoZSBkaXNrLT5jYXBhY2l0eSBhdHRyaWJ1dGUgaXMgb2ZmIGJ5IDEgc2VjdG9yIAorICogZm9yIGFsbCBkaXNrIGRyaXZlcy4gIFdlIGFkZCB0aGUgb25lIGhlcmUsIGJ1dCBpdCBzaG91bGQgcmVhbGx5CisgKiBiZSBkb25lIGluIHNkLmMuICBFdmVuIGlmIGl0IGdldHMgZml4ZWQgdGhlcmUsIHRoaXMgd2lsbCBzdGlsbAorICogd29yay4KKyAqLworc3RhdGljIGludCBwcGFfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCSAgICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK3sKKwlpcFswXSA9IDB4NDA7CisJaXBbMV0gPSAweDIwOworCWlwWzJdID0gKCh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSArIDEpIC8gKGlwWzBdICogaXBbMV0pOworCWlmIChpcFsyXSA+IDEwMjQpIHsKKwkJaXBbMF0gPSAweGZmOworCQlpcFsxXSA9IDB4M2Y7CisJCWlwWzJdID0gKCh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSArIDEpIC8gKGlwWzBdICogaXBbMV0pOworCQlpZiAoaXBbMl0gPiAxMDIzKQorCQkJaXBbMl0gPSAxMDIzOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGFfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXBwYV9zdHJ1Y3QgKmRldiA9IHBwYV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCS8qCisJICogVGhlcmUgaXMgbm8gbWV0aG9kIGZvciBhYm9ydGluZyBjb21tYW5kcyBzaW5jZSBJb21lZ2EKKwkgKiBoYXZlIHRpZWQgdGhlIFNDU0lfTUVTU0FHRSBsaW5lIGhpZ2ggaW4gdGhlIGludGVyZmFjZQorCSAqLworCisJc3dpdGNoIChjbWQtPlNDcC5waGFzZSkgeworCWNhc2UgMDoJCS8qIERvIG5vdCBoYXZlIGFjY2VzcyB0byBwYXJwb3J0ICovCisJY2FzZSAxOgkJLyogSGF2ZSBub3QgY29ubmVjdGVkIHRvIGludGVyZmFjZSAqLworCQlkZXYtPmN1cl9jbWQgPSBOVUxMOwkvKiBGb3JnZXQgdGhlIHByb2JsZW0gKi8KKwkJcmV0dXJuIFNVQ0NFU1M7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBTQ1NJIGNvbW1hbmQgc2VudCwgY2FuIG5vdCBhYm9ydCAqLworCQlyZXR1cm4gRkFJTEVEOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBwYV9yZXNldF9wdWxzZSh1bnNpZ25lZCBpbnQgYmFzZSkKK3sKKwl3X2R0cihiYXNlLCAweDQwKTsKKwl3X2N0cihiYXNlLCAweDgpOworCXVkZWxheSgzMCk7CisJd19jdHIoYmFzZSwgMHhjKTsKK30KKworc3RhdGljIGludCBwcGFfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXBwYV9zdHJ1Y3QgKmRldiA9IHBwYV9kZXYoY21kLT5kZXZpY2UtPmhvc3QpOworCisJaWYgKGNtZC0+U0NwLnBoYXNlKQorCQlwcGFfZGlzY29ubmVjdChkZXYpOworCWRldi0+Y3VyX2NtZCA9IE5VTEw7CS8qIEZvcmdldCB0aGUgcHJvYmxlbSAqLworCisJcHBhX2Nvbm5lY3QoZGV2LCBDT05ORUNUX05PUk1BTCk7CisJcHBhX3Jlc2V0X3B1bHNlKGRldi0+YmFzZSk7CisJdWRlbGF5KDEwMDApOwkJLyogZGV2aWNlIHNldHRsZSBkZWxheSAqLworCXBwYV9kaXNjb25uZWN0KGRldik7CisJdWRlbGF5KDEwMDApOwkJLyogZGV2aWNlIHNldHRsZSBkZWxheSAqLworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IGRldmljZV9jaGVjayhwcGFfc3RydWN0ICpkZXYpCit7CisJLyogVGhpcyByb3V0aW5lIGxvb2tzIGZvciBhIGRldmljZSBhbmQgdGhlbiBhdHRlbXB0cyB0byB1c2UgRVBQCisJICAgdG8gc2VuZCBhIGNvbW1hbmQuIElmIGFsbCBnb2VzIGFzIHBsYW5uZWQgdGhlbiBFUFAgaXMgYXZhaWxhYmxlLiAqLworCisJc3RhdGljIGNoYXIgY21kWzZdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisJaW50IGxvb3AsIG9sZF9tb2RlLCBzdGF0dXMsIGssIHBwYiA9IGRldi0+YmFzZTsKKwl1bnNpZ25lZCBjaGFyIGw7CisKKwlvbGRfbW9kZSA9IGRldi0+bW9kZTsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7CisJCS8qIEF0dGVtcHQgdG8gdXNlIEVQUCBmb3IgVGVzdCBVbml0IFJlYWR5ICovCisJCWlmICgocHBiICYgMHgwMDA3KSA9PSAweDAwMDApCisJCQlkZXYtPm1vZGUgPSBQUEFfRVBQXzMyOworCisJICAgICAgc2Vjb25kX3Bhc3M6CisJCXBwYV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQkvKiBTZWxlY3QgU0NTSSBkZXZpY2UgKi8KKwkJaWYgKCFwcGFfc2VsZWN0KGRldiwgbG9vcCkpIHsKKwkJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGsoInBwYTogRm91bmQgZGV2aWNlIGF0IElEICVpLCBBdHRlbXB0aW5nIHRvIHVzZSAlc1xuIiwKKwkJICAgICAgIGxvb3AsIFBQQV9NT0RFX1NUUklOR1tkZXYtPm1vZGVdKTsKKworCQkvKiBTZW5kIFNDU0kgY29tbWFuZCAqLworCQlzdGF0dXMgPSAxOworCQl3X2N0cihwcGIsIDB4MGMpOworCQlmb3IgKGwgPSAwOyAobCA8IDYpICYmIChzdGF0dXMpOyBsKyspCisJCQlzdGF0dXMgPSBwcGFfb3V0KGRldiwgY21kLCAxKTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJCXBwYV9jb25uZWN0KGRldiwgQ09OTkVDVF9FUFBfTUFZQkUpOworCQkJd19kdHIocHBiLCAweDQwKTsKKwkJCXdfY3RyKHBwYiwgMHgwOCk7CisJCQl1ZGVsYXkoMzApOworCQkJd19jdHIocHBiLCAweDBjKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlpZiAoZGV2LT5tb2RlID09IFBQQV9FUFBfMzIpIHsKKwkJCQlkZXYtPm1vZGUgPSBvbGRfbW9kZTsKKwkJCQlnb3RvIHNlY29uZF9wYXNzOworCQkJfQorCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJd19jdHIocHBiLCAweDBjKTsKKwkJayA9IDEwMDAwMDA7CS8qIDEgU2Vjb25kICovCisJCWRvIHsKKwkJCWwgPSByX3N0cihwcGIpOworCQkJay0tOworCQkJdWRlbGF5KDEpOworCQl9IHdoaWxlICghKGwgJiAweDgwKSAmJiAoaykpOworCisJCWwgJj0gMHhmMDsKKworCQlpZiAobCAhPSAweGYwKSB7CisJCQlwcGFfZGlzY29ubmVjdChkZXYpOworCQkJcHBhX2Nvbm5lY3QoZGV2LCBDT05ORUNUX0VQUF9NQVlCRSk7CisJCQlwcGFfcmVzZXRfcHVsc2UocHBiKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlpZiAoZGV2LT5tb2RlID09IFBQQV9FUFBfMzIpIHsKKwkJCQlkZXYtPm1vZGUgPSBvbGRfbW9kZTsKKwkJCQlnb3RvIHNlY29uZF9wYXNzOworCQkJfQorCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcHBhX2Rpc2Nvbm5lY3QoZGV2KTsKKwkJcHJpbnRrKCJwcGE6IENvbW11bmljYXRpb24gZXN0YWJsaXNoZWQgd2l0aCBJRCAlaSB1c2luZyAlc1xuIiwKKwkJICAgICAgIGxvb3AsIFBQQV9NT0RFX1NUUklOR1tkZXYtPm1vZGVdKTsKKwkJcHBhX2Nvbm5lY3QoZGV2LCBDT05ORUNUX0VQUF9NQVlCRSk7CisJCXBwYV9yZXNldF9wdWxzZShwcGIpOworCQl1ZGVsYXkoMTAwMCk7CisJCXBwYV9kaXNjb25uZWN0KGRldik7CisJCXVkZWxheSgxMDAwKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwcGFfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfbmFtZQkJPSAicHBhIiwKKwkucHJvY19pbmZvCQk9IHBwYV9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJJb21lZ2EgVlBJMCAocHBhKSBpbnRlcmZhY2UiLAorCS5xdWV1ZWNvbW1hbmQJCT0gcHBhX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHBwYV9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBwcGFfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHBwYV9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBwcGFfYmlvc3BhcmFtLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuY2FuX3F1ZXVlCQk9IDEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICBQYXJhbGxlbCBwb3J0IHByb2Jpbmcgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgTElTVF9IRUFEKHBwYV9ob3N0cyk7CisKK3N0YXRpYyBpbnQgX19wcGFfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdhaXRpbmcpOworCURFRklORV9XQUlUKHdhaXQpOworCXBwYV9zdHJ1Y3QgKmRldjsKKwlpbnQgcG9ydHM7CisJaW50IG1vZGVzLCBwcGIsIHBwYl9oaTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKHBwYV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHBwYV9zdHJ1Y3QpKTsKKwlkZXYtPmJhc2UgPSAtMTsKKwlkZXYtPm1vZGUgPSBQUEFfQVVUT0RFVEVDVDsKKwlkZXYtPnJlY29uX3RtbyA9IFBQQV9SRUNPTl9UTU87CisJaW5pdF93YWl0cXVldWVfaGVhZCgmd2FpdGluZyk7CisJZGV2LT5kZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwYiwgInBwYSIsIE5VTEwsIHBwYV93YWtldXAsCisJCQkJCSAgICBOVUxMLCAwLCBkZXYpOworCisJaWYgKCFkZXYtPmRldikKKwkJZ290byBvdXQ7CisKKwkvKiBDbGFpbSB0aGUgYnVzIHNvIGl0IHJlbWVtYmVycyB3aGF0IHdlIGRvIHRvIHRoZSBjb250cm9sCisJICogcmVnaXN0ZXJzLiBbIENUUiBhbmQgRUNQIF0KKwkgKi8KKwllcnIgPSAtRUJVU1k7CisJZGV2LT53YWl0aW5nID0gJndhaXRpbmc7CisJcHJlcGFyZV90b193YWl0KCZ3YWl0aW5nLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCWlmIChwcGFfcGJfY2xhaW0oZGV2KSkKKwkJc2NoZWR1bGVfdGltZW91dCgzICogSFopOworCWlmIChkZXYtPndhbnRlZCkgeworCQlwcmludGsoS0VSTl9FUlIgInBwYSVkOiBmYWlsZWQgdG8gY2xhaW0gcGFycG9ydCBiZWNhdXNlICIKKwkJCQkiYSBwYXJkZXZpY2UgaXMgb3duaW5nIHRoZSBwb3J0IGZvciB0b28gbG9uZyAiCisJCQkJInRpbWUhXG4iLCBwYi0+bnVtYmVyKTsKKwkJcHBhX3BiX2Rpc21pc3MoZGV2KTsKKwkJZGV2LT53YWl0aW5nID0gTlVMTDsKKwkJZmluaXNoX3dhaXQoJndhaXRpbmcsICZ3YWl0KTsKKwkJZ290byBvdXQxOworCX0KKwlkZXYtPndhaXRpbmcgPSBOVUxMOworCWZpbmlzaF93YWl0KCZ3YWl0aW5nLCAmd2FpdCk7CisJcHBiID0gZGV2LT5iYXNlID0gZGV2LT5kZXYtPnBvcnQtPmJhc2U7CisJcHBiX2hpID0gZGV2LT5kZXYtPnBvcnQtPmJhc2VfaGk7CisJd19jdHIocHBiLCAweDBjKTsKKwltb2RlcyA9IGRldi0+ZGV2LT5wb3J0LT5tb2RlczsKKworCS8qIE1vZGUgZGV0ZWN0aW9uIHdvcmtzIHVwIHRoZSBjaGFpbiBvZiBzcGVlZAorCSAqIFRoaXMgYXZvaWRzIGEgbmFzdHkgaWYtdGhlbi1lbHNlLWlmLS4uLiB0cmVlCisJICovCisJZGV2LT5tb2RlID0gUFBBX05JQkJMRTsKKworCWlmIChtb2RlcyAmIFBBUlBPUlRfTU9ERV9UUklTVEFURSkKKwkJZGV2LT5tb2RlID0gUFBBX1BTMjsKKworCWlmIChtb2RlcyAmIFBBUlBPUlRfTU9ERV9FQ1ApIHsKKwkJd19lY3IocHBiX2hpLCAweDIwKTsKKwkJZGV2LT5tb2RlID0gUFBBX1BTMjsKKwl9CisJaWYgKChtb2RlcyAmIFBBUlBPUlRfTU9ERV9FUFApICYmIChtb2RlcyAmIFBBUlBPUlRfTU9ERV9FQ1ApKQorCQl3X2VjcihwcGJfaGksIDB4ODApOworCisJLyogRG9uZSBjb25maWd1cmF0aW9uICovCisKKwllcnIgPSBwcGFfaW5pdChkZXYpOworCXBwYV9wYl9yZWxlYXNlKGRldik7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKwkvKiBub3cgdGhlIGdsdWUgLi4uICovCisJaWYgKGRldi0+bW9kZSA9PSBQUEFfTklCQkxFIHx8IGRldi0+bW9kZSA9PSBQUEFfUFMyKQorCQlwb3J0cyA9IDM7CisJZWxzZQorCQlwb3J0cyA9IDg7CisKKwlJTklUX1dPUksoJmRldi0+cHBhX3RxLCBwcGFfaW50ZXJydXB0LCBkZXYpOworCisJZXJyID0gLUVOT01FTTsKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwcGFfdGVtcGxhdGUsIHNpemVvZihwcGFfc3RydWN0ICopKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gb3V0MTsKKwlob3N0LT5pb19wb3J0ID0gcGItPmJhc2U7CisJaG9zdC0+bl9pb19wb3J0ID0gcG9ydHM7CisJaG9zdC0+ZG1hX2NoYW5uZWwgPSAtMTsKKwlob3N0LT51bmlxdWVfaWQgPSBwYi0+bnVtYmVyOworCSoocHBhX3N0cnVjdCAqKikmaG9zdC0+aG9zdGRhdGEgPSBkZXY7CisJZGV2LT5ob3N0ID0gaG9zdDsKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmxpc3QsICZwcGFfaG9zdHMpOworCWVyciA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgTlVMTCk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCXJldHVybiAwOworb3V0MjoKKwlsaXN0X2RlbF9pbml0KCZkZXYtPmxpc3QpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXQxOgorCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5kZXYpOworb3V0OgorCWtmcmVlKGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcHBhX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCit7CisJX19wcGFfYXR0YWNoKHBiKTsKK30KKworc3RhdGljIHZvaWQgcHBhX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCit7CisJcHBhX3N0cnVjdCAqZGV2OworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcHBhX2hvc3RzLCBsaXN0KSB7CisJCWlmIChkZXYtPmRldi0+cG9ydCA9PSBwYikgeworCQkJbGlzdF9kZWxfaW5pdCgmZGV2LT5saXN0KTsKKwkJCXNjc2lfcmVtb3ZlX2hvc3QoZGV2LT5ob3N0KTsKKwkJCXNjc2lfaG9zdF9wdXQoZGV2LT5ob3N0KTsKKwkJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5kZXYpOworCQkJa2ZyZWUoZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBwYV9kcml2ZXIgPSB7CisJLm5hbWUJPSAicHBhIiwKKwkuYXR0YWNoCT0gcHBhX2F0dGFjaCwKKwkuZGV0YWNoCT0gcHBhX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwYV9kcml2ZXJfaW5pdCh2b2lkKQoreworCXByaW50aygicHBhOiBWZXJzaW9uICVzXG4iLCBQUEFfVkVSU0lPTik7CisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwcGFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwYV9kcml2ZXJfZXhpdCh2b2lkKQoreworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBwYV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwcGFfZHJpdmVyX2luaXQpOworbW9kdWxlX2V4aXQocHBhX2RyaXZlcl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wcGEuaCBiL2RyaXZlcnMvc2NzaS9wcGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUxYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BwYS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKiAgRHJpdmVyIGZvciB0aGUgUFBBMyBwYXJhbGxlbCBwb3J0IFNDU0kgSEJBIGVtYmVkZGVkIGluIAorICogdGhlIElvbWVnYSBaSVAgZHJpdmUKKyAqIAorICogKGMpIDE5OTYgICAgIEdyYW50IFIuIEd1ZW50aGVyICBncmFudEB0b3JxdWUubmV0CisgKiAgICAgICAgICAgICAgRGF2aWQgQ2FtcGJlbGwgICAgIGNhbXBiZWxsQHRvcnF1ZS5uZXQKKyAqCisgKiAgICAgIEFsbCBjb21tZW50cyB0byBEYXZpZC4KKyAqLworCisjaWZuZGVmIF9QUEFfSAorI2RlZmluZSBfUFBBX0gKKworI2RlZmluZSAgIFBQQV9WRVJTSU9OICAgIjIuMDcgKGZvciBMaW51eCAyLjQueCkiCisKKy8qIAorICogdGhpcyBkcml2ZXIgaGFzIGJlZW4gaGFja2VkIGJ5IE1hdHRlbyBGcmlnbyAoYXRoZW5hQHRoZW9yeS5sY3MubWl0LmVkdSkKKyAqIHRvIHN1cHBvcnQgRVBQIGFuZCBzY2F0dGVyLWdhdGhlci4gICAgICAgICAgICAgICAgICAgICAgICBbMC4yNi1hdGhlbmFdCisgKgorICogYWRkaXRpb25hbCBoYWNrcyBieSBEYXZpZCBDYW1wYmVsbAorICogaW4gcmVzcG9uc2UgdG8gdGhpcyBkcml2ZXIgIm1pcy1iZWhhdmluZyIgb24gaGlzIG1hY2hpbmUuCisgKiAgICAgIEZpeGVkIEVQUCB0byBoYW5kbGUgInNvZnR3YXJlIiBjaGFuZ2luZyBvZiBFUFAgcG9ydCBkYXRhIGRpcmVjdGlvbi4KKyAqICAgICAgQ2hhc2VkIGRvd24gRVBQIHRpbWVvdXRzCisgKiAgICAgIE1hZGUgdGhpcyBkcml2ZXIgImtlcm5lbCB2ZXJzaW9uIGZyaWVuZGx5IiAgICAgICAgICAgWzAuMjgtYXRoZW5hXQorICoKKyAqIFsgU3R1ZmYgcmVtb3ZlZCBdCisgKgorICogQ29ycmVjdGVkIHBwYS5oIGZvciAyLjEueCBrZXJuZWxzICg+PTIuMS44NSkKKyAqIE1vZGlmaWVkICJOYXQgU2VtaSBLbHVkZ2UiIGZvciBleHRlbmRlZCBjaGlwc2V0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMS40MV0KKyAqCisgKiBGaXhlZCBpZF9wcm9iZSBmb3IgRVBQIDEuOSBjaGlwc2V0cyAobWlzZGV0ZWN0ZWQgYXMgRVBQIDEuNykKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuNDJdCisgKgorICogRGV2ZWxvcG1lbnQgc29sZWx5IGZvciAyLjEueCBrZXJuZWxzIGZyb20gbm93IG9uIQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wMF0KKyAqCisgKiBIYWNrIGFuZCBzbGFzaCBhdCB0aGUgaW5pdCBjb2RlIChFUFAgZGV2aWNlIGNoZWNrIHJvdXRpbmUpCisgKiBBZGRlZCBJTlNBTkUgb3B0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wMV0KKyAqCisgKiBQYXRjaCBhcHBsaWVkIHRvIHN5bmMgYWdhaW5zdCB0aGUgMi4xLngga2VybmVsIGNvZGUKKyAqIEluY2x1ZGVkIHFib290X3ppcC5zaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wMl0KKyAqCisgKiBDbGVhbmVkIHVwIHRoZSBtZXNzIGxlZnQgYnkgc29tZW9uZSBlbHNlIHRyeWluZyB0byBmaXggdGhlCisgKiBhc20gc2VjdGlvbiB0byBrZWVwIGVnY2MgaGFwcHkuIFRoZSBhc20gc2VjdGlvbiBubyBsb25nZXIKKyAqIGV4aXN0cywgdGhlIG5pYmJsZSBjb2RlIGlzICphbG1vc3QqIGFzIGZhc3QgYXMgdGhlIGFzbSBjb2RlCisgKiBwcm92aWRpbmcgaXQgaXMgY29tcGlsZWQgd2l0aCBlZ2NjLgorICoKKyAqIE90aGVyIGNsZWFuIHVwcyBpbmNsdWRlIHRoZSBmb2xsb3cgY2hhbmdlczoKKyAqICAgIENPTkZJR19TQ1NJX1BQQV9IQVZFX1BFREFOVElDID0+IENPTkZJR19TQ1NJX0laSVBfRVBQMTYKKyAqICAgIGFkZGVkIENPTkZJR19TQ1NJX0laSVBfU0xPV19DVFIgb3B0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyLjAzXQorICoKKyAqIFVzZSBwcGFfd2FpdCgpIHRvIGNoZWNrIGZvciByZWFkeSBBTkQgY29ubmVjdGVkIHN0YXR1cyBiaXRzCisgKiBBZGQgcHBhX3dhaXQoKSBjYWxscyB0byBwcGFfY29tcGxldGlvbigpCisgKiAgYnkgUGV0ZXIgQ2hlcnJpbWFuIDxwamNAZWNzLnNvdG9uLmFjLnVrPiBhbmQKKyAqICAgICBUaW0gV2F1Z2ggPHR3YXVnaEByZWRoYXQuY29tPgorICoJCQkJCQkJWzIuMDRdCisgKgorICogRml4IGtlcm5lbCBwYW5pYyBvbiBzY3NpIHRpbWVvdXQsIDIwMDAtMDgtMTgJCVsyLjA1XQorICoKKyAqIEF2b2lkIGlvX3JlcXVlc3RfbG9jayBwcm9ibGVtcy4KKyAqIEpvaG4gQ2F2YW4gPGpvaG5jYXZhbkBob21lLmNvbT4JCQlbMi4wNl0KKyAqCisgKiBCdXN5IHdhaXQgZm9yIGNvbm5lY3RlZCBzdGF0dXMgYml0IGluIHBwYV9jb21wbGV0aW9uKCkKKyAqICBpbiBvcmRlciB0byBjb3BlIHdpdGggc29tZSBoYXJkd2FyZSB0aGF0IGhhcyB0aGlzIGJpdCBsb3cKKyAqICBmb3Igc2hvcnQgcGVyaW9kcyBvZiB0aW1lLgorICogQWRkIHVkZWxheSgpIHRvIHBwYV9zZWxlY3QoKQorICogIGJ5IFBldGVyIENoZXJyaW1hbiA8cGpjQGVjcy5zb3Rvbi5hYy51az4gYW5kCisgKiAgICAgT2xlZyBNYWthcmVua28gPG9tYWthcmVua29AY3liZXJwbGF0LnJ1PiAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMi4wN10KKyAqLworLyogLS0tLS0tIEVORCBPRiBVU0VSIENPTkZJR1VSQUJMRSBQQVJBTUVURVJTIC0tLS0tICovCisKKyNpbmNsdWRlICA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSAgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlICA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSAgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAgPGFzbS9pby5oPgorI2luY2x1ZGUgIDxzY3NpL3Njc2lfaG9zdC5oPgorLyogYmF0dGVyaWVzIG5vdCBpbmNsdWRlZCA6LSkgKi8KKworLyoKKyAqIG1vZGVzIGluIHdoaWNoIHRoZSBkcml2ZXIgY2FuIG9wZXJhdGUgCisgKi8KKyNkZWZpbmUgICBQUEFfQVVUT0RFVEVDVCAgICAgICAgMAkvKiBBdXRvZGV0ZWN0IG1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICBQUEFfTklCQkxFICAgICAgICAgICAgMQkvKiB3b3JrIGluIHN0YW5kYXJkIDQgYml0IG1vZGUgICAgKi8KKyNkZWZpbmUgICBQUEFfUFMyICAgICAgICAgICAgICAgMgkvKiBQUy8yIGJ5dGUgbW9kZSAgICAgICAgICovCisjZGVmaW5lICAgUFBBX0VQUF84ICAgICAgICAgICAgIDMJLyogRVBQIG1vZGUsIDggYml0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgUFBBX0VQUF8xNiAgICAgICAgICAgIDQJLyogRVBQIG1vZGUsIDE2IGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgUFBBX0VQUF8zMiAgICAgICAgICAgIDUJLyogRVBQIG1vZGUsIDMyIGJpdCAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgUFBBX1VOS05PV04gICAgICAgICAgIDYJLyogSnVzdCBpbiBjYXNlLi4uICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBjaGFyICpQUEFfTU9ERV9TVFJJTkdbXSA9Cit7CisgICAgIkF1dG9kZXRlY3QiLAorICAgICJTUFAiLAorICAgICJQUy8yIiwKKyAgICAiRVBQIDggYml0IiwKKyAgICAiRVBQIDE2IGJpdCIsCisjaWZkZWYgQ09ORklHX1NDU0lfSVpJUF9FUFAxNgorICAgICJFUFAgMTYgYml0IiwKKyNlbHNlCisgICAgIkVQUCAzMiBiaXQiLAorI2VuZGlmCisgICAgIlVua25vd24ifTsKKworLyogb3RoZXIgb3B0aW9ucyAqLworI2RlZmluZSBQUEFfQlVSU1RfU0laRQk1MTIJLyogZGF0YSBidXJzdCBzaXplICovCisjZGVmaW5lIFBQQV9TRUxFQ1RfVE1PICA1MDAwCS8qIGhvdyBsb25nIHRvIHdhaXQgZm9yIHRhcmdldCA/ICovCisjZGVmaW5lIFBQQV9TUElOX1RNTyAgICA1MDAwMAkvKiBwcGFfd2FpdCBsb29wIGxpbWl0ZXIgKi8KKyNkZWZpbmUgUFBBX1JFQ09OX1RNTyAgIDUwMAkvKiBzY3NpIHJlY29ubmVjdGlvbiBsb29wIGxpbWl0ZXIgKi8KKyNkZWZpbmUgUFBBX0RFQlVHCTAJLyogZGVidWdnaW5nIG9wdGlvbiAqLworI2RlZmluZSBJTl9FUFBfTU9ERSh4KSAoeCA9PSBQUEFfRVBQXzggfHwgeCA9PSBQUEFfRVBQXzE2IHx8IHggPT0gUFBBX0VQUF8zMikKKworLyogYXJncyB0byBwcGFfY29ubmVjdCAqLworI2RlZmluZSBDT05ORUNUX0VQUF9NQVlCRSAxCisjZGVmaW5lIENPTk5FQ1RfTk9STUFMICAwCisKKyNkZWZpbmUgcl9kdHIoeCkgICAgICAgICh1bnNpZ25lZCBjaGFyKWluYigoeCkpCisjZGVmaW5lIHJfc3RyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzEpCisjZGVmaW5lIHJfY3RyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzIpCisjZGVmaW5lIHJfZXBwKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzQpCisjZGVmaW5lIHJfZmlmbyh4KSAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKSAvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworCQkJCQkvKiBPbiBQQ0kgaXMgYmFzZSsweDQwMCAhPSBiYXNlX2hpICovCisjZGVmaW5lIHJfZWNyKHgpICAgICAgICAodW5zaWduZWQgY2hhcilpbmIoKHgpKzB4MikgLyogeCBtdXN0IGJlIGJhc2VfaGkgKi8KKworI2RlZmluZSB3X2R0cih4LHkpICAgICAgb3V0Yih5LCAoeCkpCisjZGVmaW5lIHdfc3RyKHgseSkgICAgICBvdXRiKHksICh4KSsxKQorI2RlZmluZSB3X2VwcCh4LHkpICAgICAgb3V0Yih5LCAoeCkrNCkKKyNkZWZpbmUgd19maWZvKHgseSkgICAgIG91dGIoeSwgKHgpKQkvKiB4IG11c3QgYmUgYmFzZV9oaSAqLworI2RlZmluZSB3X2Vjcih4LHkpICAgICAgb3V0Yih5LCAoeCkrMHgyKS8qIHggbXVzdCBiZSBiYXNlX2hpICovCisKKyNpZmRlZiBDT05GSUdfU0NTSV9JWklQX1NMT1dfQ1RSCisjZGVmaW5lIHdfY3RyKHgseSkgICAgICBvdXRiX3AoeSwgKHgpKzIpCisjZWxzZQorI2RlZmluZSB3X2N0cih4LHkpICAgICAgb3V0Yih5LCAoeCkrMikKKyNlbmRpZgorCitzdGF0aWMgaW50IHBwYV9lbmdpbmUocHBhX3N0cnVjdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOworCisjZW5kaWYJCQkJLyogX1BQQV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHNpMjQwaS5jIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjU3NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuYwpAQCAtMCwwICsxLDY4NSBAQAorLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBTSS0yNDBJIGRldmljZSBkcml2ZXIgcHJvYyBzdXBwb3J0IGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCisgKglGaWxlIE5hbWU6CQlwc2kyNDBpLmMKKyAqCisgKglEZXNjcmlwdGlvbjoJU0NTSSBkcml2ZXIgZm9yIHRoZSBQU0kyNDBJIEVJREUgaW50ZXJmYWNlIGNhcmQuCisgKgorICotTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAicHNpMjQwaS5oIgorI2luY2x1ZGUgInBzaV9jaGlwLmgiCisKKy8vI2RlZmluZSBERUJVRyAxCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUIoeCkgeAorI2Vsc2UKKyNkZWZpbmUgREVCKHgpCisjZW5kaWYKKworI2RlZmluZSBNQVhCT0FSRFMgNgkvKiBJbmNyZWFzZSB0aGlzIGFuZCB0aGUgc2l6ZXMgb2YgdGhlIGFycmF5cyBiZWxvdywgaWYgeW91IG5lZWQgbW9yZS4gKi8KKworI2RlZmluZQlQT1JUX0RBVEEJCQkJMAorI2RlZmluZQlQT1JUX0VSUk9SCQkJCTEKKyNkZWZpbmUJUE9SVF9TRUNUT1JfQ09VTlQJCTIKKyNkZWZpbmUJUE9SVF9MQkFfMAkJCQkzCisjZGVmaW5lCVBPUlRfTEJBXzgJCQkJNAorI2RlZmluZQlQT1JUX0xCQV8xNgkJCQk1CisjZGVmaW5lCVBPUlRfTEJBXzI0CQkJCTYKKyNkZWZpbmUJUE9SVF9TVEFUX0NNRAkJCTcKKyNkZWZpbmUJUE9SVF9TRUxfRkFJTAkJCTgKKyNkZWZpbmUJUE9SVF9JUlFfU1RBVFVTCQkJOQorI2RlZmluZQlQT1JUX0FERFJFU1MJCQkxMAorI2RlZmluZQlQT1JUX0ZBSUwJCQkJMTEKKyNkZWZpbmUJUE9SVF9BTFRfU1RBVAkJICAgCTEyCisKK3R5cGVkZWYgc3RydWN0CisJeworCVVDSEFSCQkgICAJZGV2aWNlOwkJCQkvLyBkZXZpY2UgY29kZQorCVVDSEFSCQkJYnl0ZTY7CQkJCS8vIGRldmljZSBzZWxlY3QgcmVnaXN0ZXIgaW1hZ2UKKwlVQ0hBUgkJCXNwaWdvdDsJCQkJLy8gc3BpZ290IG51bWJlcgorCVVDSEFSCQkJZXhwZWN0aW5nSVJROwkJLy8gZmxhZyBmb3IgZXhwZWN0aW5nIGFuZCBpbnRlcnJ1cHQKKwlVU0hPUlQJCQlzZWN0b3JzOwkJCS8vIG51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjaworCVVTSE9SVAkJCWhlYWRzOwkJCQkvLyBudW1iZXIgb2YgaGVhZHMKKwlVU0hPUlQJCQljeWxpbmRlcnM7CQkJLy8gbnVtYmVyIG9mIGN5bGluZGVycyBmb3IgdGhpcyBkZXZpY2UKKwlVU0hPUlQJCQlzcGFyZXdvcmQ7CQkJLy8gcGxhY2Vob2xkZXIKKwlVTE9ORwkJCWJsb2NrczsJCQkJLy8gbnVtYmVyIG9mIGJsb2NrcyBvbiBkZXZpY2UKKwl9CU9VUl9ERVZJQ0UsICpQT1VSX0RFVklDRTsKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJVVNIT1JUCQkgcG9ydHNbMTNdOworCU9VUl9ERVZJQ0UJIGRldmljZVs4XTsKKwlTY3NpX0NtbmQJKnBTQ21uZDsKKwlJREVfU1RSVUNUCSBpZGU7CisJVUxPTkcJCSBzdGFydFNlY3RvcjsKKwlVU0hPUlQJCSBzZWN0b3JDb3VudDsKKwlTY3NpX0NtbmQJKlNDcG50OworCVZPSUQJCSpidWZmZXI7CisJVVNIT1JUCQkgZXhwZWN0aW5nSVJROworCX0JQURBUFRFUjI0MEksICpQQURBUFRFUjI0MEk7CisKKyNkZWZpbmUgSE9TVERBVEEoaG9zdCkgKChQQURBUFRFUjI0MEkpJmhvc3QtPmhvc3RkYXRhKQorCitzdGF0aWMgc3RydWN0CVNjc2lfSG9zdCAqUHNpSG9zdFs2XSA9IHtOVUxMLH07ICAvKiBPbmUgZm9yIGVhY2ggSVJRIGxldmVsICgxMC0xNSkgKi8KK3N0YXRpYwkJCUlERU5USUZZX0RBVEEJaWRlbnRpZnlEYXRhOworc3RhdGljCQkJU0VUVVAJCQlDaGlwU2V0dXA7CisKK3N0YXRpYwlVU0hPUlQJcG9ydEFkZHJbNl0gPSB7Q0hJUF9BRFJTXzAsIENISVBfQURSU18xLCBDSElQX0FEUlNfMiwgQ0hJUF9BRFJTXzMsIENISVBfQURSU180LCBDSElQX0FEUlNfNX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglXcml0ZURhdGEJOkxPQ0FMCisgKgorICoJRGVzY3JpcHRpb246CVdyaXRlIGRhdGEgdG8gZGV2aWNlLgorICoKKyAqCVBhcmFtZXRlcnM6CQlwYWRhcHRlciAtIFBvaW50ZXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBkb2VzIG5vdCBhc3NlcnQgRFJRIGluIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFdyaXRlRGF0YSAoUEFEQVBURVIyNDBJIHBhZGFwdGVyKQorCXsKKwlVTE9ORwl0aW1lcjsKKwlVU0hPUlQgKnBwb3J0cyA9IHBhZGFwdGVyLT5wb3J0czsKKworCXRpbWVyID0gamlmZmllcyArIFRJTUVPVVRfRFJROwkJCQkJCQkJLy8gY2FsY3VsYXRlIHRoZSB0aW1lb3V0IHZhbHVlCisJZG8gIHsKKwkJaWYgKCBpbmJfcCAocHBvcnRzW1BPUlRfU1RBVF9DTURdKSAmIElERV9TVEFUVVNfRFJRICkKKwkJCXsKKwkJCW91dHN3IChwcG9ydHNbUE9SVF9EQVRBXSwgcGFkYXB0ZXItPmJ1ZmZlciwgKFVTSE9SVClwYWRhcHRlci0+aWRlLmlkZS5pZGVbMl0gKiAyNTYpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0Jd2hpbGUgKCB0aW1lX2FmdGVyKHRpbWVyLCBqaWZmaWVzKSApOwkJCQkJCQkJCS8vIHRlc3QgZm9yIHRpbWVvdXQKKworCXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kID0gMDsJCQkJCQkJCQkvLyBudWxsIG91dCB0aGUgY29tbWFuZCBieXRlCisJcmV0dXJuIDE7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlkZUNtZAk6TE9DQUwKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyBhIHF1ZXVlZCBjb21tYW5kIGZyb20gdGhlIFNDU0kgbWFuYWdlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICoJUmV0dXJuczoJCVplcm8gaWYgbm8gZXJyb3Igb3Igc3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzIG9uIGVycm9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVDSEFSIElkZUNtZCAoUEFEQVBURVIyNDBJIHBhZGFwdGVyKQorCXsKKwlVTE9ORwl0aW1lcjsKKwlVU0hPUlQgKnBwb3J0cyA9IHBhZGFwdGVyLT5wb3J0czsKKwlVQ0hBUglzdGF0dXM7CisKKwlvdXRiX3AgKHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc3BpZ290LCBwcG9ydHNbUE9SVF9TRUxfRkFJTF0pOwkvLyBzZWxlY3QgdGhlIHNwaWdvdAorCW91dGJfcCAocGFkYXB0ZXItPmlkZS5pZGUuaWRlWzZdLCBwcG9ydHNbUE9SVF9MQkFfMjRdKTsJCQkvLyBzZWxlY3QgdGhlIGRyaXZlCisJdGltZXIgPSBqaWZmaWVzICsgVElNRU9VVF9SRUFEWTsJCQkJCQkJLy8gY2FsY3VsYXRlIHRoZSB0aW1lb3V0IHZhbHVlCisJZG8gIHsKKwkJc3RhdHVzID0gaW5iX3AgKHBhZGFwdGVyLT5wb3J0c1tQT1JUX1NUQVRfQ01EXSk7CisJCWlmICggc3RhdHVzICYgSURFX1NUQVRVU19EUkRZICkKKwkJCXsKKwkJCW91dGJfcCAocGFkYXB0ZXItPmlkZS5pZGUuaWRlWzJdLCBwcG9ydHNbUE9SVF9TRUNUT1JfQ09VTlRdKTsKKwkJCW91dGJfcCAocGFkYXB0ZXItPmlkZS5pZGUuaWRlWzNdLCBwcG9ydHNbUE9SVF9MQkFfMF0pOworCQkJb3V0Yl9wIChwYWRhcHRlci0+aWRlLmlkZS5pZGVbNF0sIHBwb3J0c1tQT1JUX0xCQV84XSk7CisJCQlvdXRiX3AgKHBhZGFwdGVyLT5pZGUuaWRlLmlkZVs1XSwgcHBvcnRzW1BPUlRfTEJBXzE2XSk7CisJCQlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gMTsKKwkJCW91dGJfcCAocGFkYXB0ZXItPmlkZS5pZGUuaWRlWzddLCBwcG9ydHNbUE9SVF9TVEFUX0NNRF0pOworCisJCQlpZiAoIHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kID09IElERV9DTURfV1JJVEVfTVVMVElQTEUgKQorCQkJCXJldHVybiAoV3JpdGVEYXRhIChwYWRhcHRlcikpOworCisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQl3aGlsZSAoIHRpbWVfYWZ0ZXIodGltZXIsIGppZmZpZXMpICk7CQkJCQkJCQkJLy8gdGVzdCBmb3IgdGltZW91dAorCisJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSAwOwkJCQkJCQkJCS8vIG51bGwgb3V0IHRoZSBjb21tYW5kIGJ5dGUKKwlyZXR1cm4gc3RhdHVzOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglTZXR1cFRyYW5zZmVyCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglTZXR1cCBhIGRhdGEgdHJhbnNmZXIgY29tbWFuZC4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcGFkYXB0ZXIgLSBQb2ludGVyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKgkJCQkJZHJpdmUJIC0gRHJpdmUvaGVhZCByZWdpc3RlciB1cHBlciBuaWJibGUgb25seS4KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBubyBkYXRhIHRvIHRyYW5zZmVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBTZXR1cFRyYW5zZmVyIChQQURBUFRFUjI0MEkgcGFkYXB0ZXIsIFVDSEFSIGRyaXZlKQorCXsKKwlpZiAoIHBhZGFwdGVyLT5zZWN0b3JDb3VudCApCisJCXsKKwkJKihVTE9ORyAqKXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMubGJhID0gcGFkYXB0ZXItPnN0YXJ0U2VjdG9yOworCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVbNl0gfD0gZHJpdmU7CisJCXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc2VjdG9ycyA9ICggcGFkYXB0ZXItPnNlY3RvckNvdW50ID4gU0VDVE9SU1hGRVIgKSA/IFNFQ1RPUlNYRkVSIDogcGFkYXB0ZXItPnNlY3RvckNvdW50OworCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgLT0gcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5zZWN0b3JzOwkvLyBidW1wIHRoZSBzdGFydCBhbmQgY291bnQgZm9yIG5leHQgeGZlcgorCQlwYWRhcHRlci0+c3RhcnRTZWN0b3IgKz0gcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5zZWN0b3JzOworCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UKKwkJeworCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IDA7CQkJCQkJCQkvLyBudWxsIG91dCB0aGUgY29tbWFuZCBieXRlCisJCXBhZGFwdGVyLT5TQ3BudCA9IE5VTEw7CisJCXJldHVybiAxOworCQl9CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CURlY29kZUVycm9yCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglEZWNvZGUgYW5kIHByb2Nlc3MgZGV2aWNlIGVycm9ycy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJcHNob3N0IC0gUG9pbnRlciB0byBob3N0IGRhdGEgYmxvY2suCisgKgkJCQkJc3RhdHVzIC0gU3RhdHVzIHJlZ2lzdGVyIGNvZGUuCisgKgorICoJUmV0dXJuczoJCVRoZSBkcml2ZXIgc3RhdHVzIGNvZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgVUxPTkcgRGVjb2RlRXJyb3IgKHN0cnVjdCBTY3NpX0hvc3QgKnBzaG9zdCwgVUNIQVIgc3RhdHVzKQorCXsKKwlQQURBUFRFUjI0MEkJcGFkYXB0ZXIgPSBIT1NUREFUQShwc2hvc3QpOworCVVDSEFSCQkJZXJyb3I7CisKKwlwYWRhcHRlci0+ZXhwZWN0aW5nSVJRID0gMDsKKwlwYWRhcHRlci0+U0NwbnQgPSBOVUxMOworCWlmICggc3RhdHVzICYgSURFX1NUQVRVU19XUklURV9GQVVMVCApCisJCXsKKwkJcmV0dXJuIERJRF9QQVJJVFkgPDwgMTY7CisJCX0KKwlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfQlVTWSApCisJCXJldHVybiBESURfQlVTX0JVU1kgPDwgMTY7CisKKwllcnJvciA9IGluYl9wIChwYWRhcHRlci0+cG9ydHNbUE9SVF9FUlJPUl0pOworCURFQihwcmludGsgKCJcbnBzaTI0MGkgZXJyb3IgcmVnaXN0ZXI6ICV4IiwgZXJyb3IpKTsKKwlzd2l0Y2ggKCBlcnJvciApCisJCXsKKwkJY2FzZSBJREVfRVJST1JfQU1ORjoKKwkJY2FzZSBJREVfRVJST1JfVEtPTkY6CisJCWNhc2UgSURFX0VSUk9SX0FCUlQ6CisJCWNhc2UgSURFX0VSUk9SX0lERk46CisJCWNhc2UgSURFX0VSUk9SX1VOQzoKKwkJY2FzZSBJREVfRVJST1JfQkJLOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIERJRF9FUlJPUiA8PCAxNjsKKwkJfQorCXJldHVybiBESURfRVJST1IgPDwgMTY7CisJfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CUlycV9IYW5kbGVyCTpMT0NBTAorICoKKyAqCURlc2NyaXB0aW9uOglJbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJaXJxCQktIEhhcmR3YXJlIElSUSBudW1iZXIuCisgKgkJCQkJZGV2X2lkCS0KKyAqCQkJCQlyZWdzCS0KKyAqCisgKglSZXR1cm5zOgkJVFJVRSBpZiBkcml2ZSBpcyBub3QgcmVhZHkgaW4gdGltZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIElycV9IYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorCXsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAgKnNob3N0OwkJCS8vIFBvaW50ZXIgdG8gaG9zdCBkYXRhIGJsb2NrCisJUEFEQVBURVIyNDBJCQlwYWRhcHRlcjsJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVVTSE9SVAkJIAkgICAqcHBvcnRzOwkJCS8vIEkvTyBwb3J0IGFycmF5CisJU2NzaV9DbW5kCQkgICAqU0NwbnQ7CisJVUNIQVIJCQkJc3RhdHVzOworCWludAkJCQkJejsKKworCURFQihwcmludGsgKCJcbnBzaTI0MGkgcmVjZWl2ZWQgaW50ZXJydXB0XG4iKSk7CisKKwlzaG9zdCA9IFBzaUhvc3RbaXJxIC0gMTBdOworCWlmICggIXNob3N0ICkKKwkJcGFuaWMgKCJTcGx1bmdlISIpOworCisJcGFkYXB0ZXIgPSBIT1NUREFUQShzaG9zdCk7CisJcHBvcnRzID0gcGFkYXB0ZXItPnBvcnRzOworCVNDcG50ID0gcGFkYXB0ZXItPlNDcG50OworCisJaWYgKCAhcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSApCisJCXsKKwkJREVCKHByaW50ayAoIlxucHNpMjQwaSBVbnNvbGljaXRlZCBpbnRlcnJ1cHRcbiIpKTsKKwkJcmV0dXJuOworCQl9CisJcGFkYXB0ZXItPmV4cGVjdGluZ0lSUSA9IDA7CisKKwlzdGF0dXMgPSBpbmJfcCAocGFkYXB0ZXItPnBvcnRzW1BPUlRfU1RBVF9DTURdKTsJCQkvLyByZWFkIHRoZSBkZXZpY2Ugc3RhdHVzCisJaWYgKCBzdGF0dXMgJiAoSURFX1NUQVRVU19FUlJPUiB8IElERV9TVEFUVVNfV1JJVEVfRkFVTFQpICkKKwkJZ290byBpcnFlcnJvcjsKKworCURFQihwcmludGsgKCJcbnBzaTI0MGkgcHJvY2Vzc2luZyBpbnRlcnJ1cHQiKSk7CisJc3dpdGNoICggcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgKQkJCQkJCQkvLyBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgaW50ZXJydXB0CisJCXsKKwkJY2FzZSBJREVfQ01EX1JFQURfTVVMVElQTEU6CisJCQlpZiAoIHN0YXR1cyAmIElERV9TVEFUVVNfRFJRICkKKwkJCQl7CisJCQkJaW5zdyAocHBvcnRzW1BPUlRfREFUQV0sIHBhZGFwdGVyLT5idWZmZXIsIChVU0hPUlQpcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5zZWN0b3JzICogMjU2KTsKKwkJCQlwYWRhcHRlci0+YnVmZmVyICs9IHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuc2VjdG9ycyAqIDUxMjsKKwkJCQlpZiAoIFNldHVwVHJhbnNmZXIgKHBhZGFwdGVyLCBwYWRhcHRlci0+aWRlLmlkZS5pZGVbNl0gJiAweEYwKSApCisJCQkJCXsKKwkJCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCQkJcGFkYXB0ZXItPlNDcG50ID0gTlVMTDsKKwkJCQkJU0NwbnQtPnNjc2lfZG9uZSAoU0NwbnQpOworCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQlpZiAoICEoc3RhdHVzID0gSWRlQ21kIChwYWRhcHRlcikpICkKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSURFX0NNRF9XUklURV9NVUxUSVBMRToKKwkJCXBhZGFwdGVyLT5idWZmZXIgKz0gcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5zZWN0b3JzICogNTEyOworCQkJaWYgKCBTZXR1cFRyYW5zZmVyIChwYWRhcHRlciwgcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzZdICYgMHhGMCkgKQorCQkJCXsKKwkJCQlTQ3BudC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJCXBhZGFwdGVyLT5TQ3BudCA9IE5VTEw7CisJCQkJU0NwbnQtPnNjc2lfZG9uZSAoU0NwbnQpOworCQkJCXJldHVybjsKKwkJCQl9CisJCQlpZiAoICEoc3RhdHVzID0gSWRlQ21kIChwYWRhcHRlcikpICkKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKworCQljYXNlIElERV9DT01NQU5EX0lERU5USUZZOgorCQkJeworCQkJUElOUVVJUllEQVRBCXBpbnF1aXJ5RGF0YSAgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisKKwkJCWlmICggc3RhdHVzICYgSURFX1NUQVRVU19EUlEgKQorCQkJCXsKKwkJCQlpbnN3IChwcG9ydHNbUE9SVF9EQVRBXSwgJmlkZW50aWZ5RGF0YSwgc2l6ZW9mIChpZGVudGlmeURhdGEpID4+IDEpOworCisJCQkJbWVtc2V0IChwaW5xdWlyeURhdGEsIDAsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOwkJLy8gWmVybyBJTlFVSVJZIGRhdGEgc3RydWN0dXJlLgorCQkJCXBpbnF1aXJ5RGF0YS0+RGV2aWNlVHlwZSA9IDA7CisJCQkJcGlucXVpcnlEYXRhLT5WZXJzaW9ucyA9IDI7CisJCQkJcGlucXVpcnlEYXRhLT5BZGRpdGlvbmFsTGVuZ3RoID0gMzUgLSA0OworCisJCQkJLy8gRmlsbCBpbiB2ZW5kb3IgaWRlbnRpZmljYXRpb24gZmllbGRzLgorCQkJCWZvciAoIHogPSAwOyAgeiA8IDIwOyAgeiArPSAyICkKKwkJCQkJeworCQkJCQlwaW5xdWlyeURhdGEtPlZlbmRvcklkW3pdCSAgPSAoKFVDSEFSICopaWRlbnRpZnlEYXRhLk1vZGVsTnVtYmVyKVt6ICsgMV07CisJCQkJCXBpbnF1aXJ5RGF0YS0+VmVuZG9ySWRbeiArIDFdID0gKChVQ0hBUiAqKWlkZW50aWZ5RGF0YS5Nb2RlbE51bWJlcilbel07CisJCQkJCX0KKworCQkJCS8vIEluaXRpYWxpemUgdW51c2VkIHBvcnRpb24gb2YgcHJvZHVjdCBpZC4KKwkJCQlmb3IgKCB6ID0gMDsgIHogPCA0OyAgeisrICkKKwkJCQkJcGlucXVpcnlEYXRhLT5Qcm9kdWN0SWRbMTIgKyB6XSA9ICcgJzsKKworCQkJCS8vIE1vdmUgZmlybXdhcmUgcmV2aXNpb24gZnJvbSBJREVOVElGWSBkYXRhIHRvCisJCQkJLy8gcHJvZHVjdCByZXZpc2lvbiBpbiBJTlFVSVJZIGRhdGEuCisJCQkJZm9yICggeiA9IDA7ICB6IDwgNDsgIHogKz0gMiApCisJCQkJCXsKKwkJCQkJcGlucXVpcnlEYXRhLT5Qcm9kdWN0UmV2aXNpb25MZXZlbFt6XQkgPSAoKFVDSEFSICopaWRlbnRpZnlEYXRhLkZpcm13YXJlUmV2aXNpb24pW3ogKyAxXTsKKwkJCQkJcGlucXVpcnlEYXRhLT5Qcm9kdWN0UmV2aXNpb25MZXZlbFt6ICsgMV0gPSAoKFVDSEFSICopaWRlbnRpZnlEYXRhLkZpcm13YXJlUmV2aXNpb24pW3pdOworCQkJCQl9CisKKwkJCQlTQ3BudC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJCXBhZGFwdGVyLT5TQ3BudCA9IE5VTEw7CisJCQkJU0NwbnQtPnNjc2lfZG9uZSAoU0NwbnQpOworCQkJCXJldHVybjsKKwkJCQl9CisJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCXBhZGFwdGVyLT5TQ3BudCA9IE5VTEw7CisJCQlTQ3BudC0+c2NzaV9kb25lIChTQ3BudCk7CisJCQlyZXR1cm47CisJCX0KKworaXJxZXJyb3I6OworCURFQihwcmludGsgKCJcbnBzaTI0MGkgZXJyb3IgIERldmljZSBTdGF0dXM6ICVYXG4iLCBzdGF0dXMpKTsKKwlTQ3BudC0+cmVzdWx0ID0gRGVjb2RlRXJyb3IgKHNob3N0LCBzdGF0dXMpOworCVNDcG50LT5zY3NpX2RvbmUgKFNDcG50KTsKKwl9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19JcnFfSGFuZGxlciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCUlycV9IYW5kbGVyKGlycSwgZGV2X2lkLCByZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJUHNpMjQwaV9RdWV1ZUNvbW1hbmQKKyAqCisgKglEZXNjcmlwdGlvbjoJUHJvY2VzcyBhIHF1ZXVlZCBjb21tYW5kIGZyb20gdGhlIFNDU0kgbWFuYWdlci4KKyAqCisgKglQYXJhbWV0ZXJzOgkJU0NwbnQgLSBQb2ludGVyIHRvIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgkJCQkJZG9uZSAgLSBQb2ludGVyIHRvIGRvbmUgZnVuY3Rpb24gdG8gY2FsbC4KKyAqCisgKglSZXR1cm5zOgkJU3RhdHVzIGNvZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFBzaTI0MGlfUXVldWVDb21tYW5kIChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQorCXsKKwlVQ0hBUgkJICAgKmNkYiA9IChVQ0hBUiAqKVNDcG50LT5jbW5kOwkJCQkJLy8gUG9pbnRlciB0byBTQ1NJIENEQgorCVBBREFQVEVSMjQwSQlwYWRhcHRlciA9IEhPU1REQVRBIChTQ3BudC0+ZGV2aWNlLT5ob3N0KTsgCQkJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCisJUE9VUl9ERVZJQ0UgCQlwZGV2CSA9ICZwYWRhcHRlci0+ZGV2aWNlIFtTQ3BudC0+ZGV2aWNlLT5pZF07Ly8gUG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKwlVQ0hBUgkJCXJjOwkJCQkJCQkJCQkJLy8gY29tbWFuZCByZXR1cm4gY29kZQorCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5zcGlnb3QgPSBwZGV2LT5zcGlnb3Q7CisJcGFkYXB0ZXItPmJ1ZmZlciA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwlpZiAoZG9uZSkKKwkJeworCQlpZiAoICFwZGV2LT5kZXZpY2UgKQorCQkJeworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQkJZG9uZSAoU0NwbnQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJcHJpbnRrKCJwc2kyNDBpX3F1ZXVlY29tbWFuZDogJTAyWDogZG9uZSBjYW4ndCBiZSBOVUxMXG4iLCAqY2RiKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXN3aXRjaCAoICpjZGIgKQorCQl7CisJCWNhc2UgU0NTSU9QX0lOUVVJUlk6ICAgCQkJCQkvLyBpbnF1aXJ5IENEQgorCQkJeworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzZdID0gcGRldi0+Ynl0ZTY7CisJCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IElERV9DT01NQU5EX0lERU5USUZZOworCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZOgkJCS8vIHRlc3QgdW5pdCByZWFkeSBDREIKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCQlkb25lIChTQ3BudCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNDU0lPUF9SRUFEX0NBUEFDSVRZOgkJCSAgCS8vIHJlYWQgY2FwY3RpeSBDREIKKwkJCXsKKwkJCVBSRUFEX0NBUEFDSVRZX0RBVEEJcGRhdGEgPSAoUFJFQURfQ0FQQUNJVFlfREFUQSlTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisKKwkJCXBkYXRhLT5ibGtzaXogPSAweDIwMDAwOworCQkJWEFOWTJTQ1NJICgoVUNIQVIgKikmcGRhdGEtPmJsa3MsIHBkZXYtPmJsb2Nrcyk7CisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQkJZG9uZSAoU0NwbnQpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJY2FzZSBTQ1NJT1BfVkVSSUZZOgkJCQkJCS8vIHZlcmlmeSBDREIKKwkJCSooVUxPTkcgKilwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmxiYSA9IFhTQ1NJMkxPTkcgKCZjZGJbMl0pOworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzZdIHw9IHBkZXYtPmJ5dGU2OworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlWzJdID0gKFVDSEFSKSgoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KSk7CisJCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IElERV9DT01NQU5EX1ZFUklGWTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTSU9QX1JFQUQ6CQkJCQkJLy8gcmVhZDEwIENEQgorCQkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yID0gWFNDU0kyTE9ORyAoJmNkYlsyXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSAoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KTsKKwkJCVNldHVwVHJhbnNmZXIgKHBhZGFwdGVyLCBwZGV2LT5ieXRlNik7CisJCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IElERV9DTURfUkVBRF9NVUxUSVBMRTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NTSU9QX1JFQUQ2OgkJCQkJCS8vIHJlYWQ2ICBDREIKKwkJCXBhZGFwdGVyLT5zdGFydFNlY3RvciA9IFNDU0kyTE9ORyAoJmNkYlsxXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSBjZGJbNF07CisJCQlTZXR1cFRyYW5zZmVyIChwYWRhcHRlciwgcGRldi0+Ynl0ZTYpOworCQkJcGFkYXB0ZXItPmlkZS5pZGUuaWRlcy5jbWQgPSBJREVfQ01EX1JFQURfTVVMVElQTEU7CisJCQlicmVhazsKKworCQljYXNlIFNDU0lPUF9XUklURToJCQkJCQkvLyB3cml0ZTEwIENEQgorCQkJcGFkYXB0ZXItPnN0YXJ0U2VjdG9yID0gWFNDU0kyTE9ORyAoJmNkYlsyXSk7CisJCQlwYWRhcHRlci0+c2VjdG9yQ291bnQgPSAoVVNIT1JUKWNkYls4XSB8ICgoVVNIT1JUKWNkYls3XSA8PCA4KTsKKwkJCVNldHVwVHJhbnNmZXIgKHBhZGFwdGVyLCBwZGV2LT5ieXRlNik7CisJCQlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCA9IElERV9DTURfV1JJVEVfTVVMVElQTEU7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJT1BfV1JJVEU2OgkJCQkJCS8vIHdyaXRlNiAgQ0RCCisJCQlwYWRhcHRlci0+c3RhcnRTZWN0b3IgPSBTQ1NJMkxPTkcgKCZjZGJbMV0pOworCQkJcGFkYXB0ZXItPnNlY3RvckNvdW50ID0gY2RiWzRdOworCQkJU2V0dXBUcmFuc2ZlciAocGFkYXB0ZXIsIHBkZXYtPmJ5dGU2KTsKKwkJCXBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kID0gSURFX0NNRF9XUklURV9NVUxUSVBMRTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlERUIgKHByaW50ayAoInBzaTI0MGlfcXVldWVjb21tYW5kOiBVbnN1cHBvcnRlZCBjb21tYW5kICUwMlhcbiIsICpjZGIpKTsKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQlkb25lIChTQ3BudCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJcGFkYXB0ZXItPlNDcG50ID0gU0NwbnQ7ICAJCQkJCQkJCQkvLyBTYXZlIHRoaXMgY29tbWFuZCBkYXRhCisKKwlyYyA9IElkZUNtZCAocGFkYXB0ZXIpOworCWlmICggcmMgKQorCQl7CisJCXBhZGFwdGVyLT5leHBlY3RpbmdJUlEgPSAwOworCQlERUIgKHByaW50ayAoInBzaTI0MGlfcXVldWVjb21tYW5kOiAlMDJYLCAlMDJYOiBEZXZpY2UgZmFpbGVkIHRvIHJlc3BvbmQgZm9yIGNvbW1hbmRcbiIsICpjZGIsIHBhZGFwdGVyLT5pZGUuaWRlLmlkZXMuY21kKSk7CisJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCWRvbmUgKFNDcG50KTsKKwkJcmV0dXJuIDA7CisJCX0KKwlERUIgKHByaW50aygicHNpMjQwaV9xdWV1ZWNvbW1hbmQ6ICUwMlgsICUwMlggbm93IHdhaXRpbmcgZm9yIGludGVycnVwdCAiLCAqY2RiLCBwYWRhcHRlci0+aWRlLmlkZS5pZGVzLmNtZCkpOworCXJldHVybiAwOworCX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmFtZToJCQlSZWFkQ2hpcE1lbW9yeQorICoKKyAqCURlc2NyaXB0aW9uOglSZWFkIGluZm9ybWF0aW9uIGZyb20gY29udHJvbGxlciBtZW1vcnkuCisgKgorICoJUGFyYW1ldGVyczoJCXBzZXR1cAktIFBvaW50ZXIgdG8gbWVtb3J5IGltYWdlIG9mIHNldHVwIGluZm9ybWF0aW9uLgorICoJCQkJCWJhc2UJLSBiYXNlIGFkZHJlc3Mgb2YgbWVtb3J5LgorICoJCQkJCWxlbmd0aAktIGxlbmdodCBvZiBkYXRhIHNwYWNlIGluIGJ5dGVzLgorICoJCQkJCXBvcnQJLSBJL08gYWRkcmVzcyBvZiBkYXRhIHBvcnQuCisgKgorICoJUmV0dXJuczoJCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUmVhZENoaXBNZW1vcnkgKHZvaWQgKnBkYXRhLCBVU0hPUlQgYmFzZSwgVVNIT1JUIGxlbmd0aCwgVVNIT1JUIHBvcnQpCisJeworCVVTSE9SVAl6LCB6ejsKKwlVQ0hBUgkqcGQgPSAoVUNIQVIgKilwZGF0YTsKKwlvdXRiX3AgKFNFTF9OT05FLCBwb3J0ICsgUkVHX1NFTF9GQUlMKTsJCQkJLy8gc2V0dXAgZGF0YSBwb3J0CisJenogPSAwOworCXdoaWxlICggenogPCBsZW5ndGggKQorCQl7CisJCW91dHdfcCAoYmFzZSwgcG9ydCArIFJFR19BRERSRVNTKTsJCQkJLy8gc2V0dXAgYWRkcmVzcworCisJCWZvciAoIHogPSAwOyAgeiA8IDg7ICB6KysgKQorCQkJeworCQkJaWYgKCAoenogKyB6KSA8IGxlbmd0aCApCisJCQkqcGQrKyA9IGluYl9wIChwb3J0ICsgeik7CS8vIHJlYWQgZGF0YSBieXRlCisJCQl9CisJCXp6ICs9IDg7CisJCWJhc2UgKz0gODsKKwkJfQorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOYW1lOglQc2kyNDBpX0RldGVjdAorICoKKyAqCURlc2NyaXB0aW9uOglEZXRlY3QgYW5kIGluaXRpYWxpemUgb3VyIGJvYXJkcy4KKyAqCisgKglQYXJhbWV0ZXJzOgkJdHBudCAtIFBvaW50ZXIgdG8gU0NTSSBob3N0IHRlbXBsYXRlIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zOgkJTnVtYmVyIG9mIGFkYXB0ZXJzIGZvdW5kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQc2kyNDBpX0RldGVjdCAoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQorCXsKKwlpbnQJCQkJCWJvYXJkOworCWludAkJCQkJY291bnQgPSAwOworCWludAkJCQkJdW5pdDsKKwlpbnQJCQkJCXo7CisJVVNIT1JUCQkJCXBvcnQsIHBvcnRfcmFuZ2UgPSAxNjsKKwlDSElQX0NPTkZJR19OCQljaGlwQ29uZmlnOworCUNISVBfREVWSUNFX04JCWNoaXBEZXZpY2VbOF07CisJc3RydWN0IFNjc2lfSG9zdCAgICpwc2hvc3Q7CisKKwlmb3IgKCBib2FyZCA9IDA7ICBib2FyZCA8IE1BWEJPQVJEUzsgIGJvYXJkKysgKQkJCQkJLy8gc2NhbiBmb3IgSS9PIHBvcnRzCisJCXsKKwkJcHNob3N0ID0gTlVMTDsKKwkJcG9ydCA9IHBvcnRBZGRyW2JvYXJkXTsJCQkJCQkJCS8vIGdldCBiYXNlIGFkZHJlc3MgdG8gdGVzdAorCQlpZiAoICFyZXF1ZXN0X3JlZ2lvbiAocG9ydCwgcG9ydF9yYW5nZSwgInBzaTI0MGkiKSApCisJCQljb250aW51ZTsKKwkJaWYgKCBpbmJfcCAocG9ydCArIFJFR19GQUlMKSAhPSBDSElQX0lEICkJCQkvLyBkbyB0aGUgZmlyc3QgdGVzdCBmb3IgbGlrbGV5IGhvb2QgdGhhdCBpdCBpcyB1cworCQkJZ290byBob3N0X2luaXRfZmFpbHVyZTsKKwkJb3V0Yl9wIChTRUxfTk9ORSwgcG9ydCArIFJFR19TRUxfRkFJTCk7CQkJCS8vIHNldHVwIEVFUFJPTS9SQU0gYWNjZXNzCisJCW91dHcgKDAsIHBvcnQgKyBSRUdfQUREUkVTUyk7CQkJCQkJLy8gc2V0dXAgRUVQUk9NIGFkZHJlc3MgemVybworCQlpZiAoIGluYl9wIChwb3J0KSAhPSAweDU1ICkJCQkJCQkJLy8gdGVzdCAxc3QgYnl0ZQorCQkJZ290byBob3N0X2luaXRfZmFpbHVyZTsJCQkJCQkJCQkvLyAgIG5vcGUKKwkJaWYgKCBpbmJfcCAocG9ydCArIDEpICE9IDB4QUEgKQkJCQkJCS8vIHRlc3QgMm5kIGJ5dGUKKwkJCWdvdG8gaG9zdF9pbml0X2ZhaWx1cmU7CQkJCQkJCQkvLyAgIG5vcGUKKworCQkvLyBhdCB0aGlzIHBvaW50IG91ciBib2FyZCBpcyBmb3VuZCBhbmQgY2FuIGJlIGFjY2Vzc2VkLiAgTm93IHdlIG5lZWQgdG8gaW5pdGlhbGl6ZQorCQkvLyBvdXIgaW5mb3JtYXRhdGlvbiBhbmQgcmVnaXN0ZXIgd2l0aCB0aGUga2VybmVsLgorCisKKwkJUmVhZENoaXBNZW1vcnkgKCZjaGlwQ29uZmlnLCBDSElQX0NPTkZJRywgc2l6ZW9mIChjaGlwQ29uZmlnKSwgcG9ydCk7CisJCVJlYWRDaGlwTWVtb3J5ICgmY2hpcERldmljZSwgQ0hJUF9ERVZJQ0UsIHNpemVvZiAoY2hpcERldmljZSksIHBvcnQpOworCQlSZWFkQ2hpcE1lbW9yeSAoJkNoaXBTZXR1cCwgQ0hJUF9FRVBST01fREFUQSwgc2l6ZW9mIChDaGlwU2V0dXApLCBwb3J0KTsKKworCQlpZiAoICFjaGlwQ29uZmlnLm51bURyaXZlcyApCQkJCQkJLy8gaWYgbm8gZGV2aWNlcyBvbiB0aGlzIGJvYXJkCisJCQlnb3RvIGhvc3RfaW5pdF9mYWlsdXJlOworCisJCXBzaG9zdCA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihBREFQVEVSMjQwSSkpOworCQlpZihwc2hvc3QgPT0gTlVMTCkKKwkJCWdvdG8gaG9zdF9pbml0X2ZhaWx1cmU7CQorCisJCVBzaUhvc3RbY2hpcENvbmZpZy5pcnEgLSAxMF0gPSBwc2hvc3Q7CisJCXBzaG9zdC0+dW5pcXVlX2lkID0gcG9ydDsKKwkJcHNob3N0LT5pb19wb3J0ID0gcG9ydDsKKwkJcHNob3N0LT5uX2lvX3BvcnQgPSAxNjsgIC8qIE51bWJlciBvZiBieXRlcyBvZiBJL08gc3BhY2UgdXNlZCAqLworCQlwc2hvc3QtPmlycSA9IGNoaXBDb25maWcuaXJxOworCisJCWZvciAoIHogPSAwOyAgeiA8IDExOyAgeisrICkJCQkJCQkvLyBidWlsZCByZWdlc3RlciBhZGRyZXNzIGFycmF5CisJCQlIT1NUREFUQShwc2hvc3QpLT5wb3J0c1t6XSA9IHBvcnQgKyB6OworCQlIT1NUREFUQShwc2hvc3QpLT5wb3J0c1sxMV0gPSBwb3J0ICsgUkVHX0ZBSUw7CisJCUhPU1REQVRBKHBzaG9zdCktPnBvcnRzWzEyXSA9IHBvcnQgKyBSRUdfQUxUX1NUQVQ7CisJCURFQiAocHJpbnRrICgiXG5Qb3J0cyA9IikpOworCQlERUIgKGZvciAoej0wO3o8MTM7eisrKSBwcmludGsoIiAlIzA0WCIsSE9TVERBVEEocHNob3N0KS0+cG9ydHNbel0pOyk7CisKKwkJZm9yICggeiA9IDA7ICB6IDwgY2hpcENvbmZpZy5udW1Ecml2ZXM7ICArK3ogKQorCQkJeworCQkJdW5pdCA9IGNoaXBEZXZpY2Vbel0uY2hhbm5lbCAmIDB4MEY7CisJCQlIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uZGV2aWNlCSA9IENoaXBTZXR1cC5zZXR1cERldmljZVt1bml0XS5kZXZpY2U7CisJCQlIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uYnl0ZTYJID0gKFVDSEFSKSgoKHVuaXQgJiAxKSA8PCA0KSB8IDB4RTApOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLnNwaWdvdAkgPSAoVUNIQVIpKDEgPDwgKHVuaXQgPj4gMSkpOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLnNlY3RvcnMJID0gQ2hpcFNldHVwLnNldHVwRGV2aWNlW3VuaXRdLnNlY3RvcnM7CisJCQlIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uaGVhZHMJID0gQ2hpcFNldHVwLnNldHVwRGV2aWNlW3VuaXRdLmhlYWRzOworCQkJSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmN5bGluZGVycyA9IENoaXBTZXR1cC5zZXR1cERldmljZVt1bml0XS5jeWxpbmRlcnM7CisJCQlIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uYmxvY2tzCSA9IENoaXBTZXR1cC5zZXR1cERldmljZVt1bml0XS5ibG9ja3M7CisJCQlERUIgKHByaW50ayAoIlxuSE9TVERBVEEtPmRldmljZSAgICA9ICVYIiwgSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmRldmljZSkpOworCQkJREVCIChwcmludGsgKCJcbiAgICAgICAgICBieXRlNiAgICAgPSAlWCIsIEhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5ieXRlNikpOworCQkJREVCIChwcmludGsgKCJcbiAgICAgICAgICBzcGlnb3QgICAgPSAlWCIsIEhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5zcGlnb3QpKTsKKwkJCURFQiAocHJpbnRrICgiXG4gICAgICAgICAgc2VjdG9ycyAgID0gJVgiLCBIT1NUREFUQShwc2hvc3QpLT5kZXZpY2VbdW5pdF0uc2VjdG9ycykpOworCQkJREVCIChwcmludGsgKCJcbiAgICAgICAgICBoZWFkcyAgICAgPSAlWCIsIEhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5oZWFkcykpOworCQkJREVCIChwcmludGsgKCJcbiAgICAgICAgICBjeWxpbmRlcnMgPSAlWCIsIEhPU1REQVRBKHBzaG9zdCktPmRldmljZVt1bml0XS5jeWxpbmRlcnMpKTsKKwkJCURFQiAocHJpbnRrICgiXG4gICAgICAgICAgYmxvY2tzICAgID0gJWxYIiwgSE9TVERBVEEocHNob3N0KS0+ZGV2aWNlW3VuaXRdLmJsb2NrcykpOworCQkJfQorCisJCWlmICggcmVxdWVzdF9pcnEgKGNoaXBDb25maWcuaXJxLCBkb19JcnFfSGFuZGxlciwgMCwgInBzaTI0MGkiLCBwc2hvc3QpID09IDAgKSAKKwkJCXsKKwkJCXByaW50aygiXG5QU0ktMjQwSSBFSURFIENPTlRST0xMRVI6IGF0IEkvTyA9ICV4ICBJUlEgPSAlZFxuIiwgcG9ydCwgY2hpcENvbmZpZy5pcnEpOworCQkgICAgICAgIHByaW50aygiKEMpIDE5OTcgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZFxuXG4iKTsKKwkJICAgICAgICBjb3VudCsrOworCQkgICAgICAgIGNvbnRpbnVlOworCQkJfQorCisJCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIFBTSS0yNDBJIGNvbnRyb2xsZXIuXG4iKTsKKyAgICAgICAgICAgCitob3N0X2luaXRfZmFpbHVyZToKKwkJCisJCXJlbGVhc2VfcmVnaW9uIChwb3J0LCBwb3J0X3JhbmdlKTsKKwkJaWYgKHBzaG9zdCkKKwkJCXNjc2lfdW5yZWdpc3RlciAocHNob3N0KTsKKworCQl9CisJcmV0dXJuIGNvdW50OworCX0KKworc3RhdGljIGludCBQc2kyNDBpX1JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5hbWU6CVBzaTI0MGlfQmlvc1BhcmFtCisgKgorICoJRGVzY3JpcHRpb246CVByb2Nlc3MgdGhlIGJpb3NwYXJhbSByZXF1ZXN0IGZyb20gdGhlIFNDU0kgbWFuYWdlciB0bworICoJCQkJCXJldHVybiBDL0gvUyBkYXRhLgorICoKKyAqCVBhcmFtZXRlcnM6CQlkaXNrIC0gUG9pbnRlciB0byBTQ1NJIGRpc2sgc3RydWN0dXJlLgorICoJCQkJCWRldgkgLSBNYWpvci9taW5vciBudW1iZXIgZnJvbSBrZXJuZWwuCisgKgkJCQkJZ2VvbSAtIFBvaW50ZXIgdG8gaW50ZWdlciBhcnJheSB0byBwbGFjZSBnZW9tZXRyeSBkYXRhLgorICoKKyAqCVJldHVybnM6CQl6ZXJvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBQc2kyNDBpX0Jpb3NQYXJhbSAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQorCXsKKwlQT1VSX0RFVklDRQlwZGV2OworCisJcGRldiA9ICYoSE9TVERBVEEoc2Rldi0+aG9zdCktPmRldmljZVtzZGV2LT5pZF0pOworCisJZ2VvbVswXSA9IHBkZXYtPmhlYWRzOworCWdlb21bMV0gPSBwZGV2LT5zZWN0b3JzOworCWdlb21bMl0gPSBwZGV2LT5jeWxpbmRlcnM7CisJcmV0dXJuIDA7CisJfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gInBzaTI0MGkiLCAKKwkubmFtZQkJCT0gIlBTSS0yNDBJIEVJREUgRGlzayBDb250cm9sbGVyIiwKKwkuZGV0ZWN0CQkJPSBQc2kyNDBpX0RldGVjdCwKKwkucmVsZWFzZQkJPSBQc2kyNDBpX1JlbGVhc2UsCisJLnF1ZXVlY29tbWFuZAkJPSBQc2kyNDBpX1F1ZXVlQ29tbWFuZCwKKwkuYmlvc19wYXJhbQkgIAk9IFBzaTI0MGlfQmlvc1BhcmFtLAorCS5jYW5fcXVldWUJICAJPSAxLAorCS50aGlzX2lkCSAgCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkgIAk9IFNHX05PTkUsCisJLmNtZF9wZXJfbHVuCSAgCT0gMSwgCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmggYi9kcml2ZXJzL3Njc2kvcHNpMjQwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTk4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcHNpMjQwaS5oCkBAIC0wLDAgKzEsMzE1IEBACisvKitNKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4gUFNJLTI0MEkgZGV2aWNlIGRyaXZlciBwcm9jIHN1cHBvcnQgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBQZXJjZXB0aXZlIFNvbHV0aW9ucywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqCUZpbGUgTmFtZToJCXBzaTI0MGkuaAorICoKKyAqCURlc2NyaXB0aW9uOglIZWFkZXIgZmlsZSBmb3IgdGhlIFNDU0kgZHJpdmVyIGZvciB0aGUgUFNJMjQwSQorICoJCQkJCUVJREUgaW50ZXJmYWNlIGNhcmQuCisgKgorICotTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9QU0kyNDBJX0gKKyNkZWZpbmUgX1BTSTI0MElfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2lmbmRlZglQU0lfRUlERV9TQ1NJT1AKKyNkZWZpbmUJUFNJX0VJREVfU0NTSU9QCTEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlTb21lIGRlZmluZXMgdGhhdCB3ZSBsaWtlIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hBUgkJY2hhcgorI2RlZmluZQlVQ0hBUgkJdW5zaWduZWQgY2hhcgorI2RlZmluZQlTSE9SVAkJc2hvcnQKKyNkZWZpbmUJVVNIT1JUCQl1bnNpZ25lZCBzaG9ydAorI2RlZmluZQlCT09MCQl1bnNpZ25lZCBzaG9ydAorI2RlZmluZQlMT05HCQlsb25nCisjZGVmaW5lCVVMT05HCQl1bnNpZ25lZCBsb25nCisjZGVmaW5lCVZPSUQJCXZvaWQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlUaW1lb3V0IGtvbnN0YW50cwkJIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJVElNRU9VVF9SRUFEWQkJCQkxMAkJLy8gMTAwIG1TZWMKKyNkZWZpbmUJVElNRU9VVF9EUlEJCQkJCTQwCQkvLyA0MDAgbVNlYworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCU1pc2MuIG1hY3JvcwkJCSAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFOWTJTQ1NJKHVwLCBwKQkJCQkJXAorKChVQ0hBUiAqKXVwKVswXSA9ICgoKFVMT05HKShwKSkgPj4gOCk7CVwKKygoVUNIQVIgKil1cClbMV0gPSAoKFVMT05HKShwKSk7CisKKyNkZWZpbmUgU0NTSTJMT05HKHVwKQkJCQkJXAorKCAoKChsb25nKSooKChVQ0hBUiAqKXVwKSkpIDw8IDE2KQkJXAorKyAoKChsb25nKSgoKFVDSEFSICopdXApWzFdKSkgPDwgOCkJCVwKKysgKChsb25nKSgoKFVDSEFSICopdXApWzJdKSkgKQorCisjZGVmaW5lIFhBTlkyU0NTSSh1cCwgcCkJCQkJXAorKChVQ0hBUiAqKXVwKVswXSA9ICgobG9uZykocCkpID4+IDI0OwlcCisoKFVDSEFSICopdXApWzFdID0gKChsb25nKShwKSkgPj4gMTY7CVwKKygoVUNIQVIgKil1cClbMl0gPSAoKGxvbmcpKHApKSA+PiA4OwlcCisoKFVDSEFSICopdXApWzNdID0gKChsb25nKShwKSk7CisKKyNkZWZpbmUgWFNDU0kyTE9ORyh1cCkJCQkJCVwKKyggKCgobG9uZykoKChVQ0hBUiAqKXVwKVswXSkpIDw8IDI0KQlcCisrICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMV0pKSA8PCAxNikJXAorKyAoKChsb25nKSgoKFVDSEFSICopdXApWzJdKSkgPDwgIDgpCVwKKysgKChsb25nKSgoKFVDSEFSICopdXApWzNdKSkgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCVNDU0kgQ0RCIG9wZXJhdGlvbiBjb2RlcyAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNDU0lPUF9URVNUX1VOSVRfUkVBRFkJCTB4MDAKKyNkZWZpbmUgU0NTSU9QX1JFWkVST19VTklUCQkJMHgwMQorI2RlZmluZSBTQ1NJT1BfUkVXSU5ECQkJCTB4MDEKKyNkZWZpbmUgU0NTSU9QX1JFUVVFU1RfQkxPQ0tfQUREUgkweDAyCisjZGVmaW5lIFNDU0lPUF9SRVFVRVNUX1NFTlNFCQkweDAzCisjZGVmaW5lIFNDU0lPUF9GT1JNQVRfVU5JVAkJCTB4MDQKKyNkZWZpbmUgU0NTSU9QX1JFQURfQkxPQ0tfTElNSVRTCTB4MDUKKyNkZWZpbmUgU0NTSU9QX1JFQVNTSUdOX0JMT0NLUwkJMHgwNworI2RlZmluZSBTQ1NJT1BfUkVBRDYJCQkJMHgwOAorI2RlZmluZSBTQ1NJT1BfUkVDRUlWRQkJCQkweDA4CisjZGVmaW5lIFNDU0lPUF9XUklURTYJCQkJMHgwQQorI2RlZmluZSBTQ1NJT1BfUFJJTlQJCQkJMHgwQQorI2RlZmluZSBTQ1NJT1BfU0VORAkJCQkJMHgwQQorI2RlZmluZSBTQ1NJT1BfU0VFSzYJCQkJMHgwQgorI2RlZmluZSBTQ1NJT1BfVFJBQ0tfU0VMRUNUCQkJMHgwQgorI2RlZmluZSBTQ1NJT1BfU0xFV19QUklOVAkJCTB4MEIKKyNkZWZpbmUgU0NTSU9QX1NFRUtfQkxPQ0sJCQkweDBDCisjZGVmaW5lIFNDU0lPUF9QQVJUSVRJT04JCQkweDBECisjZGVmaW5lIFNDU0lPUF9SRUFEX1JFVkVSU0UJCQkweDBGCisjZGVmaW5lIFNDU0lPUF9XUklURV9GSUxFTUFSS1MJCTB4MTAKKyNkZWZpbmUgU0NTSU9QX0ZMVVNIX0JVRkZFUgkJCTB4MTAKKyNkZWZpbmUgU0NTSU9QX1NQQUNFCQkJCTB4MTEKKyNkZWZpbmUgU0NTSU9QX0lOUVVJUlkJCQkJMHgxMgorI2RlZmluZSBTQ1NJT1BfVkVSSUZZNgkJCQkweDEzCisjZGVmaW5lIFNDU0lPUF9SRUNPVkVSX0JVRl9EQVRBCQkweDE0CisjZGVmaW5lIFNDU0lPUF9NT0RFX1NFTEVDVAkJCTB4MTUKKyNkZWZpbmUgU0NTSU9QX1JFU0VSVkVfVU5JVAkJCTB4MTYKKyNkZWZpbmUgU0NTSU9QX1JFTEVBU0VfVU5JVAkJCTB4MTcKKyNkZWZpbmUgU0NTSU9QX0NPUFkJCQkJCTB4MTgKKyNkZWZpbmUgU0NTSU9QX0VSQVNFCQkJCTB4MTkKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VOU0UJCQkweDFBCisjZGVmaW5lIFNDU0lPUF9TVEFSVF9TVE9QX1VOSVQJCTB4MUIKKyNkZWZpbmUgU0NTSU9QX1NUT1BfUFJJTlQJCQkweDFCCisjZGVmaW5lIFNDU0lPUF9MT0FEX1VOTE9BRAkJCTB4MUIKKyNkZWZpbmUgU0NTSU9QX1JFQ0VJVkVfRElBR05PU1RJQwkweDFDCisjZGVmaW5lIFNDU0lPUF9TRU5EX0RJQUdOT1NUSUMJCTB4MUQKKyNkZWZpbmUgU0NTSU9QX01FRElVTV9SRU1PVkFMCQkweDFFCisjZGVmaW5lIFNDU0lPUF9SRUFEX0NBUEFDSVRZCQkweDI1CisjZGVmaW5lIFNDU0lPUF9SRUFECQkJCQkweDI4CisjZGVmaW5lIFNDU0lPUF9XUklURQkJCQkweDJBCisjZGVmaW5lIFNDU0lPUF9TRUVLCQkJCQkweDJCCisjZGVmaW5lIFNDU0lPUF9MT0NBVEUJCQkJMHgyQgorI2RlZmluZSBTQ1NJT1BfV1JJVEVfVkVSSUZZCQkJMHgyRQorI2RlZmluZSBTQ1NJT1BfVkVSSUZZCQkJCTB4MkYKKyNkZWZpbmUgU0NTSU9QX1NFQVJDSF9EQVRBX0hJR0gJCTB4MzAKKyNkZWZpbmUgU0NTSU9QX1NFQVJDSF9EQVRBX0VRVUFMCTB4MzEKKyNkZWZpbmUgU0NTSU9QX1NFQVJDSF9EQVRBX0xPVwkJMHgzMgorI2RlZmluZSBTQ1NJT1BfU0VUX0xJTUlUUwkJCTB4MzMKKyNkZWZpbmUgU0NTSU9QX1JFQURfUE9TSVRJT04JCTB4MzQKKyNkZWZpbmUgU0NTSU9QX1NZTkNIUk9OSVpFX0NBQ0hFCTB4MzUKKyNkZWZpbmUgU0NTSU9QX0NPTVBBUkUJCQkJMHgzOQorI2RlZmluZSBTQ1NJT1BfQ09QWV9DT01QQVJFCQkJMHgzQQorI2RlZmluZSBTQ1NJT1BfV1JJVEVfREFUQV9CVUZGCQkweDNCCisjZGVmaW5lIFNDU0lPUF9SRUFEX0RBVEFfQlVGRgkJMHgzQworI2RlZmluZSBTQ1NJT1BfQ0hBTkdFX0RFRklOSVRJT04JMHg0MAorI2RlZmluZSBTQ1NJT1BfUkVBRF9TVUJfQ0hBTk5FTAkJMHg0MgorI2RlZmluZSBTQ1NJT1BfUkVBRF9UT0MJCQkJMHg0MworI2RlZmluZSBTQ1NJT1BfUkVBRF9IRUFERVIJCQkweDQ0CisjZGVmaW5lIFNDU0lPUF9QTEFZX0FVRElPCQkJMHg0NQorI2RlZmluZSBTQ1NJT1BfUExBWV9BVURJT19NU0YJCTB4NDcKKyNkZWZpbmUgU0NTSU9QX1BMQVlfVFJBQ0tfSU5ERVgJCTB4NDgKKyNkZWZpbmUgU0NTSU9QX1BMQVlfVFJBQ0tfUkVMQVRJVkUJMHg0OQorI2RlZmluZSBTQ1NJT1BfUEFVU0VfUkVTVU1FCQkJMHg0QgorI2RlZmluZSBTQ1NJT1BfTE9HX1NFTEVDVAkJCTB4NEMKKyNkZWZpbmUgU0NTSU9QX0xPR19TRU5TRQkJCTB4NEQKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VMRUNUMTAJCTB4NTUKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VOU0UxMAkJCTB4NUEKKyNkZWZpbmUgU0NTSU9QX0xPQURfVU5MT0FEX1NMT1QJCTB4QTYKKyNkZWZpbmUgU0NTSU9QX01FQ0hBTklTTV9TVEFUVVMJCTB4QkQKKyNkZWZpbmUgU0NTSU9QX1JFQURfQ0QJCQkJMHhCRQorCisvLyBJREUgY29tbWFuZCBkZWZpbml0aW9ucworI2RlZmluZSBJREVfQ09NTUFORF9BVEFQSV9SRVNFVAkJMHgwOAorI2RlZmluZSBJREVfQ09NTUFORF9SRUFECQkJMHgyMAorI2RlZmluZSBJREVfQ09NTUFORF9XUklURQkJCTB4MzAKKyNkZWZpbmUgSURFX0NPTU1BTkRfUkVDQUxJQlJBVEUJCTB4MTAKKyNkZWZpbmUgSURFX0NPTU1BTkRfU0VFSwkJCTB4NzAKKyNkZWZpbmUgSURFX0NPTU1BTkRfU0VUX1BBUkFNRVRFUlMJMHg5MQorI2RlZmluZSBJREVfQ09NTUFORF9WRVJJRlkJCQkweDQwCisjZGVmaW5lIElERV9DT01NQU5EX0FUQVBJX1BBQ0tFVAkweEEwCisjZGVmaW5lIElERV9DT01NQU5EX0FUQVBJX0lERU5USUZZCTB4QTEKKyNkZWZpbmUJSURFX0NNRF9SRUFEX01VTFRJUExFCQkweEM0CisjZGVmaW5lCUlERV9DTURfV1JJVEVfTVVMVElQTEUJCTB4QzUKKyNkZWZpbmUJSURFX0NNRF9TRVRfTVVMVElQTEUJCTB4QzYKKyNkZWZpbmUgSURFX0NPTU1BTkRfV1JJVEVfRE1BCQkweENBCisjZGVmaW5lIElERV9DT01NQU5EX1JFQURfRE1BCQkweEM4CisjZGVmaW5lIElERV9DT01NQU5EX0lERU5USUZZCQkweEVDCisKKy8vIElERSBzdGF0dXMgZGVmaW5pdGlvbnMKKyNkZWZpbmUgSURFX1NUQVRVU19FUlJPUgkJCTB4MDEKKyNkZWZpbmUgSURFX1NUQVRVU19JTkRFWAkJCTB4MDIKKyNkZWZpbmUgSURFX1NUQVRVU19DT1JSRUNURURfRVJST1IJMHgwNAorI2RlZmluZSBJREVfU1RBVFVTX0RSUQkJCQkweDA4CisjZGVmaW5lIElERV9TVEFUVVNfRFNDCQkJCTB4MTAKKyNkZWZpbmUJSURFX1NUQVRVU19XUklURV9GQVVMVAkJMHgyMAorI2RlZmluZSBJREVfU1RBVFVTX0RSRFkJCQkJMHg0MAorI2RlZmluZSBJREVfU1RBVFVTX0JVU1kJCQkJMHg4MAorCisvLyBJREUgZXJyb3IgZGVmaW5pdGlvbnMKKyNkZWZpbmUJSURFX0VSUk9SX0FNTkYJCQkJMHgwMQorI2RlZmluZQlJREVfRVJST1JfVEtPTkYJCQkJMHgwMgorI2RlZmluZQlJREVfRVJST1JfQUJSVAkJCQkweDA0CisjZGVmaW5lCUlERV9FUlJPUl9NQ1IJCQkJMHgwOAorI2RlZmluZQlJREVfRVJST1JfSURGTgkJCQkweDEwCisjZGVmaW5lCUlERV9FUlJPUl9NQwkJCQkweDIwCisjZGVmaW5lCUlERV9FUlJPUl9VTkMJCQkJMHg0MAorI2RlZmluZQlJREVfRVJST1JfQkJLCQkJCTB4ODAKKworLy8JSURFIGludGVyZmFjZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IF9JREVfU1RSVUNUCisJeworCXVuaW9uCisJCXsKKwkJVUNIQVIJaWRlWzldOworCQlzdHJ1Y3QKKwkJCXsKKwkJCVVTSE9SVAlkYXRhOworCQkJVUNIQVIJc2VjdG9yczsKKwkJCVVDSEFSCWxiYVs0XTsKKwkJCVVDSEFSCWNtZDsKKwkJCVVDSEFSCXNwaWdvdDsKKwkJCX0JaWRlczsKKwkJfSBpZGU7CisJfQlJREVfU1RSVUNUOworCisvLyBTQ1NJIHJlYWQgY2FwYWNpdHkgc3RydWN0dXJlCit0eXBlZGVmCXN0cnVjdCBfUkVBRF9DQVBBQ0lUWV9EQVRBCisJeworCVVMT05HIGJsa3M7CQkJCS8qIHRvdGFsIGJsb2NrcyAoY29udmVydGVkIHRvIGxpdHRsZSBlbmRpYW4pICovCisJVUxPTkcgYmxrc2l6OwkJCS8qIHNpemUgb2YgZWFjaCAoY29udmVydGVkIHRvIGxpdHRsZSBlbmRpYW4pICovCisJfQlSRUFEX0NBUEFDSVRZX0RBVEEsICpQUkVBRF9DQVBBQ0lUWV9EQVRBOworCisvLyBTQ1NJIGlucXVpcnkgZGF0YQorI2lmbmRlZiBIT1NUU19DCisKK3R5cGVkZWYgc3RydWN0IF9JTlFVSVJZREFUQQorCXsKKwlVQ0hBUiBEZXZpY2VUeXBlCQkJOjU7CisJVUNIQVIgRGV2aWNlVHlwZVF1YWxpZmllcgk6MzsKKwlVQ0hBUiBEZXZpY2VUeXBlTW9kaWZpZXIJOjc7CisJVUNIQVIgUmVtb3ZhYmxlTWVkaWEJCToxOworICAgIFVDSEFSIFZlcnNpb25zOworICAgIFVDSEFSIFJlc3BvbnNlRGF0YUZvcm1hdDsKKyAgICBVQ0hBUiBBZGRpdGlvbmFsTGVuZ3RoOworICAgIFVDSEFSIFJlc2VydmVkWzJdOworCVVDSEFSIFNvZnRSZXNldAkJCQk6MTsKKwlVQ0hBUiBDb21tYW5kUXVldWUJCQk6MTsKKwlVQ0hBUiBSZXNlcnZlZDIJCQkJOjE7CisJVUNIQVIgTGlua2VkQ29tbWFuZHMJCToxOworCVVDSEFSIFN5bmNocm9ub3VzCQkJOjE7CisJVUNIQVIgV2lkZTE2Qml0CQkJCToxOworCVVDSEFSIFdpZGUzMkJpdAkJCQk6MTsKKwlVQ0hBUiBSZWxhdGl2ZUFkZHJlc3NpbmcJOjE7CisgICAgVUNIQVIgVmVuZG9ySWRbOF07CisgICAgVUNIQVIgUHJvZHVjdElkWzE2XTsKKyAgICBVQ0hBUiBQcm9kdWN0UmV2aXNpb25MZXZlbFs0XTsKKyAgICBVQ0hBUiBWZW5kb3JTcGVjaWZpY1syMF07CisgICAgVUNIQVIgUmVzZXJ2ZWQzWzQwXTsKKwl9CUlOUVVJUllEQVRBLCAqUElOUVVJUllEQVRBOworI2VuZGlmCisKKy8vIElERSBJREVOVElGWSBkYXRhCit0eXBlZGVmIHN0cnVjdCBfSURFTlRJRllfREFUQQorCXsKKyAgICBVU0hPUlQgR2VuZXJhbENvbmZpZ3VyYXRpb247ICAgICAgICAgICAgLy8gMDAKKyAgICBVU0hPUlQgTnVtYmVyT2ZDeWxpbmRlcnM7ICAgICAgICAgICAgICAgLy8gMDIKKyAgICBVU0hPUlQgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgLy8gMDQKKyAgICBVU0hPUlQgTnVtYmVyT2ZIZWFkczsgICAgICAgICAgICAgICAgICAgLy8gMDYKKyAgICBVU0hPUlQgVW5mb3JtYXR0ZWRCeXRlc1BlclRyYWNrOyAgICAgICAgLy8gMDgKKyAgICBVU0hPUlQgVW5mb3JtYXR0ZWRCeXRlc1BlclNlY3RvcjsgICAgICAgLy8gMEEKKyAgICBVU0hPUlQgU2VjdG9yc1BlclRyYWNrOyAgICAgICAgICAgICAgICAgLy8gMEMKKyAgICBVU0hPUlQgVmVuZG9yVW5pcXVlMVszXTsgICAgICAgICAgICAgICAgLy8gMEUKKyAgICBVU0hPUlQgU2VyaWFsTnVtYmVyWzEwXTsgICAgICAgICAgICAgICAgLy8gMTQKKyAgICBVU0hPUlQgQnVmZmVyVHlwZTsgICAgICAgICAgICAgICAgICAgICAgLy8gMjgKKyAgICBVU0hPUlQgQnVmZmVyU2VjdG9yU2l6ZTsgICAgICAgICAgICAgICAgLy8gMkEKKyAgICBVU0hPUlQgTnVtYmVyT2ZFY2NCeXRlczsgICAgICAgICAgICAgICAgLy8gMkMKKyAgICBVU0hPUlQgRmlybXdhcmVSZXZpc2lvbls0XTsgICAgICAgICAgICAgLy8gMkUKKyAgICBVU0hPUlQgTW9kZWxOdW1iZXJbMjBdOyAgICAgICAgICAgICAgICAgLy8gMzYKKyAgICBVQ0hBUiAgTWF4aW11bUJsb2NrVHJhbnNmZXI7ICAgICAgICAgICAgLy8gNUUKKyAgICBVQ0hBUiAgVmVuZG9yVW5pcXVlMjsgICAgICAgICAgICAgICAgICAgLy8gNUYKKyAgICBVU0hPUlQgRG91YmxlV29yZElvOyAgICAgICAgICAgICAgICAgICAgLy8gNjAKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgICAgICAgICAgLy8gNjIKKyAgICBVU0hPUlQgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgLy8gNjQKKyAgICBVQ0hBUiAgVmVuZG9yVW5pcXVlMzsgICAgICAgICAgICAgICAgICAgLy8gNjYKKyAgICBVQ0hBUiAgUGlvQ3ljbGVUaW1pbmdNb2RlOyAgICAgICAgICAgICAgLy8gNjcKKyAgICBVQ0hBUiAgVmVuZG9yVW5pcXVlNDsgICAgICAgICAgICAgICAgICAgLy8gNjgKKyAgICBVQ0hBUiAgRG1hQ3ljbGVUaW1pbmdNb2RlOyAgICAgICAgICAgICAgLy8gNjkKKyAgICBVU0hPUlQgVHJhbnNsYXRpb25GaWVsZHNWYWxpZDoxOyAgICAgICAgLy8gNkEKKyAgICBVU0hPUlQgUmVzZXJ2ZWQzOjE1OworICAgIFVTSE9SVCBOdW1iZXJPZkN1cnJlbnRDeWxpbmRlcnM7ICAgICAgICAvLyA2QworICAgIFVTSE9SVCBOdW1iZXJPZkN1cnJlbnRIZWFkczsgICAgICAgICAgICAvLyA2RQorICAgIFVTSE9SVCBDdXJyZW50U2VjdG9yc1BlclRyYWNrOyAgICAgICAgICAvLyA3MAorICAgIFVMT05HICBDdXJyZW50U2VjdG9yQ2FwYWNpdHk7ICAgICAgICAgICAvLyA3MgorICAgIFVTSE9SVCBSZXNlcnZlZDRbMTk3XTsgICAgICAgICAgICAgICAgICAvLyA3NgorCX0JSURFTlRJRllfREFUQSwgKlBJREVOVElGWV9EQVRBOworCisvLyBJZGVudGlmeSBkYXRhIHdpdGhvdXQgdGhlIFJlc2VydmVkNC4KK3R5cGVkZWYgc3RydWN0IF9JREVOVElGWV9EQVRBMiB7CisgICAgVVNIT1JUIEdlbmVyYWxDb25maWd1cmF0aW9uOyAgICAgICAgICAgIC8vIDAwCisgICAgVVNIT1JUIE51bWJlck9mQ3lsaW5kZXJzOyAgICAgICAgICAgICAgIC8vIDAyCisgICAgVVNIT1JUIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDA0CisgICAgVVNIT1JUIE51bWJlck9mSGVhZHM7ICAgICAgICAgICAgICAgICAgIC8vIDA2CisgICAgVVNIT1JUIFVuZm9ybWF0dGVkQnl0ZXNQZXJUcmFjazsgICAgICAgIC8vIDA4CisgICAgVVNIT1JUIFVuZm9ybWF0dGVkQnl0ZXNQZXJTZWN0b3I7ICAgICAgIC8vIDBBCisgICAgVVNIT1JUIFNlY3RvcnNQZXJUcmFjazsgICAgICAgICAgICAgICAgIC8vIDBDCisgICAgVVNIT1JUIFZlbmRvclVuaXF1ZTFbM107ICAgICAgICAgICAgICAgIC8vIDBFCisgICAgVVNIT1JUIFNlcmlhbE51bWJlclsxMF07ICAgICAgICAgICAgICAgIC8vIDE0CisgICAgVVNIT1JUIEJ1ZmZlclR5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIDI4CisgICAgVVNIT1JUIEJ1ZmZlclNlY3RvclNpemU7ICAgICAgICAgICAgICAgIC8vIDJBCisgICAgVVNIT1JUIE51bWJlck9mRWNjQnl0ZXM7ICAgICAgICAgICAgICAgIC8vIDJDCisgICAgVVNIT1JUIEZpcm13YXJlUmV2aXNpb25bNF07ICAgICAgICAgICAgIC8vIDJFCisgICAgVVNIT1JUIE1vZGVsTnVtYmVyWzIwXTsgICAgICAgICAgICAgICAgIC8vIDM2CisgICAgVUNIQVIgIE1heGltdW1CbG9ja1RyYW5zZmVyOyAgICAgICAgICAgIC8vIDVFCisgICAgVUNIQVIgIFZlbmRvclVuaXF1ZTI7ICAgICAgICAgICAgICAgICAgIC8vIDVGCisgICAgVVNIT1JUIERvdWJsZVdvcmRJbzsgICAgICAgICAgICAgICAgICAgIC8vIDYwCisgICAgVVNIT1JUIENhcGFiaWxpdGllczsgICAgICAgICAgICAgICAgICAgIC8vIDYyCisgICAgVVNIT1JUIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgIC8vIDY0CisgICAgVUNIQVIgIFZlbmRvclVuaXF1ZTM7ICAgICAgICAgICAgICAgICAgIC8vIDY2CisgICAgVUNIQVIgIFBpb0N5Y2xlVGltaW5nTW9kZTsgICAgICAgICAgICAgIC8vIDY3CisgICAgVUNIQVIgIFZlbmRvclVuaXF1ZTQ7ICAgICAgICAgICAgICAgICAgIC8vIDY4CisgICAgVUNIQVIgIERtYUN5Y2xlVGltaW5nTW9kZTsgICAgICAgICAgICAgIC8vIDY5CisJVVNIT1JUIFRyYW5zbGF0aW9uRmllbGRzVmFsaWQ6MTsgICAgIAkvLyA2QQorICAgIFVTSE9SVCBSZXNlcnZlZDM6MTU7CisgICAgVVNIT1JUIE51bWJlck9mQ3VycmVudEN5bGluZGVyczsgICAgICAgIC8vIDZDCisgICAgVVNIT1JUIE51bWJlck9mQ3VycmVudEhlYWRzOyAgICAgICAgICAgIC8vIDZFCisgICAgVVNIT1JUIEN1cnJlbnRTZWN0b3JzUGVyVHJhY2s7ICAgICAgICAgIC8vIDcwCisgICAgVUxPTkcgIEN1cnJlbnRTZWN0b3JDYXBhY2l0eTsgICAgICAgICAgIC8vIDcyCisJfQlJREVOVElGWV9EQVRBMiwgKlBJREVOVElGWV9EQVRBMjsKKworI2VuZGlmCS8vIFBTSV9FSURFX1NDU0lPUAorCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCitpbnQgUHNpMjQwaV9Db21tYW5kCQkJKFNjc2lfQ21uZCAqU0NwbnQpOworaW50IFBzaTI0MGlfQWJvcnQJCQkoU2NzaV9DbW5kICpTQ3BudCk7CitpbnQgUHNpMjQwaV9SZXNldAkJCShTY3NpX0NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHNpX2NoaXAuaCBiL2RyaXZlcnMvc2NzaS9wc2lfY2hpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGNmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcHNpX2NoaXAuaApAQCAtMCwwICsxLDE5NSBAQAorLyorTSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBTSS0yNDBJIGRldmljZSBkcml2ZXIgcHJvYyBzdXBwb3J0IGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCisgKglGaWxlIE5hbWU6CXBzaV9jaGlwLmgKKyAqCisgKglEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnRlcmZhY2UgZGVmaW5lcyBhbmQKKyAqCQkJCQllcnJvciBjb2Rlcy4KKyAqCisgKi1NKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUFNJX0NISVAKKyNkZWZpbmUgUFNJX0NISVAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlNaXNjIGtvbnN0YW50cwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hJUF9NQVhEUklWRVMJCQk4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBJL08gYWRkcmVzc2VzCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNISVBfQURSU18wCQkJCTB4MDEzMAorI2RlZmluZQlDSElQX0FEUlNfMQkJCQkweDAxNTAKKyNkZWZpbmUJQ0hJUF9BRFJTXzIJCQkJMHgwMTkwCisjZGVmaW5lCUNISVBfQURSU18zCQkJCTB4MDIxMAorI2RlZmluZQlDSElQX0FEUlNfNAkJCQkweDAyMzAKKyNkZWZpbmUJQ0hJUF9BRFJTXzUJCQkJMHgwMjUwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJRUVQUk9NIGxvY2F0aW9ucwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNISVBfRUVQUk9NX0JJT1MJCTB4MDAwMAkJLy8gQklPUyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUJQ0hJUF9FRVBST01fREFUQQkJMHgyMDAwCSAgIAkvLyBTRVRVUCBkYXRhIGJhc2UgYWRkcmVzcworI2RlZmluZQlDSElQX0VFUFJPTV9GQUNUT1JZCQkweDI0MDAJICAgCS8vIEZBQ1RPUlkgZGF0YSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUJQ0hJUF9FRVBST01fU0VUVVAJCTB4MzAwMAkgICAJLy8gU0VUVVAgUFJPR1JBTSBiYXNlIGFkZHJlc3MKKworI2RlZmluZQlDSElQX0VFUFJPTV9TSVpFCQkzMjc2OFUJICAgCS8vIHNpemUgb2YgdGhlIGVudGlyZSBFRVBST00KKyNkZWZpbmUJQ0hJUF9FRVBST01fQklPU19TSVpFCTgxOTIJICAgCS8vIHNpemUgb2YgdGhlIEJJT1MgaW4gYnl0ZXMKKyNkZWZpbmUJQ0hJUF9FRVBST01fREFUQV9TSVpFCTQwOTYJICAgCS8vIHNpemUgb2YgZmFjdG9yeSwgc2V0dXAsIGxvZyBkYXRhIGJsb2NrIGluIGJ5dGVzCisjZGVmaW5lCUNISVBfRUVQUk9NX1NFVFVQX1NJWkUJMjA0ODBVCSAgIAkvLyBzaXplIG9mIHRoZSBzZXR1cCBwcm9ncmFtIGluIGJ5dGVzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBJbnRlcnJ1cHRzCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDSElQX0lSUV8xMAkJCQkweDcyCisjZGVmaW5lCUNISVBfSVJRXzExCQkJCTB4NzMKKyNkZWZpbmUJQ0hJUF9JUlFfMTIJCQkJMHg3NAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCUNoaXAgU2V0dXAgYWRkcmVzc2VzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hJUF9TRVRVUF9CQVNFCQkJMHgwMDAwQzAwMEwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlDaGlwIFJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0cwkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJUkVHX0RBVEEJCQkJMHgwMAorI2RlZmluZQlSRUdfRVJST1IJCQkJMHgwMQorI2RlZmluZQlSRUdfU0VDVE9SX0NPVU5UCQkweDAyCisjZGVmaW5lCVJFR19MQkFfMAkJCQkweDAzCisjZGVmaW5lCVJFR19MQkFfOAkJCQkweDA0CisjZGVmaW5lCVJFR19MQkFfMTYJCQkJMHgwNQorI2RlZmluZQlSRUdfTEJBXzI0CQkJCTB4MDYKKyNkZWZpbmUJUkVHX1NUQVRfQ01ECQkJMHgwNworI2RlZmluZQlSRUdfU0VMX0ZBSUwJCQkweDA4CisjZGVmaW5lCVJFR19JUlFfU1RBVFVTCQkJMHgwOQorI2RlZmluZQlSRUdfQUREUkVTUwkJCQkweDBBCisjZGVmaW5lCVJFR19GQUlMCQkJCTB4MEMKKyNkZWZpbmUJUkVHX0FMVF9TVEFUCQkgICAJMHgwRQorI2RlZmluZQlSRUdfRFJJVkVfQURSUwkJCTB4MEYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlDaGlwIFJBTSBsb2NhdGlvbnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlDSElQX0RFVklDRQkJCQkweDgwMDAKKyNkZWZpbmUJQ0hJUF9ERVZJQ0VfMAkJCTB4ODAwMAorI2RlZmluZSBDSElQX0RFVklDRV8xCQkJMHg4MDA4CisjZGVmaW5lCUNISVBfREVWSUNFXzIJCQkweDgwMTAKKyNkZWZpbmUJQ0hJUF9ERVZJQ0VfMwkJCTB4ODAxOAorI2RlZmluZQlDSElQX0RFVklDRV80CQkJMHg4MDIwCisjZGVmaW5lCUNISVBfREVWSUNFXzUJCQkweDgwMjgKKyNkZWZpbmUJQ0hJUF9ERVZJQ0VfNgkJCTB4ODAzMAorI2RlZmluZQlDSElQX0RFVklDRV83CQkJMHg4MDM4Cit0eXBlZGVmIHN0cnVjdAorCXsKKwlVQ0hBUgljaGFubmVsOwkJLy8gY2hhbm5lbCBvZiB0aGlzIGRldmljZSAoMC04KS4KKwlVQ0hBUglzcHQ7CQkJLy8gU2VjdG9ycyBQZXIgVHJhY2suCisJVUxPTkcJc3BjOwkJCS8vIFNlY3RvcnMgUGVyIEN5bGluZGVyLgorCX0JQ0hJUF9ERVZJQ0VfTjsKKworI2RlZmluZQlDSElQX0NPTkZJRwkJCQkweDgxMDAJCS8vIGFkZHJlc3Mgb2YgYm9hcmRzIGNvbmZpZ3VyYXRpb24uCit0eXBlZGVmIHN0cnVjdAorCXsKKwlVQ0hBUgkJaXJxOwkJCS8vIGludGVycnVwdCByZXF1ZXN0IGNoYW5uZWwgbnVtYmVyCisJVUNIQVIJCW51bURyaXZlczsJCS8vIE51bWJlciBvZiBhY2Nlc3NpYmxlIGRyaXZlcworCVVDSEFSCQlmYXN0Rm9ybWF0OwkgCS8vIEJvb2xlYW4gZm9yIGZhc3QgZm9ybWF0IGVuYWJsZQorCX0JQ0hJUF9DT05GSUdfTjsKKworI2RlZmluZQlDSElQX01BUAkJCQkweDgxMDggCQkvLyBlaWdodCBieXRlIGRldmljZSB0eXBlIG1hcC4KKworCisjZGVmaW5lCUNISVBfUkFJRAkJCQkweDgxMjAgCQkvLyBhcnJheSBvZiBSQUlEIHNpZ25hdHVyZSBzdHJ1Y3R1cmVzIGFuZCBMQkEKKyNkZWZpbmUJQ0hJUF9SQUlEXzEJCQkJMHg4MTIwCisjZGVmaW5lIENISVBfUkFJRF8yCQkJCTB4ODEzMAorI2RlZmluZQlDSElQX1JBSURfMwkJCQkweDgxNDAKKyNkZWZpbmUJQ0hJUF9SQUlEXzQJCQkJMHg4MTUwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBSZWdpc3RlciBNYXNrcwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNISVBfSUQJCQkJCTB4N0IKKyNkZWZpbmUJU0VMX1JBTQkJCQkJMHg4MDAwCisjZGVmaW5lCU1BU0tfRkFJTAkJCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQ2hpcCBjYWJsZSBzZWxlY3QgYml0cwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVNFQ1RPUlNYRkVSCQkJCTgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlDaGlwIGNhYmxlIHNlbGVjdCBiaXRzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJU0VMX05PTkUJCQkJMHgwMAorI2RlZmluZQlTRUxfMQkJCQkJMHgwMQorI2RlZmluZQlTRUxfMgkJCQkJMHgwMgorI2RlZmluZQlTRUxfMwkJCQkJMHgwNAorI2RlZmluZQlTRUxfNAkJCQkJMHgwOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCVByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlciovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlQSUMxCQkJCQkweDIwCQkvLyBmaXJzdCA4MjU5IGJhc2UgcG9ydCBhZGRyZXNzCisjZGVmaW5lCVBJQzIJCQkJCTB4QTAJCS8vIHNlY29uZCA4MjU5IGJhc2UgcG9ydCBhZGRyZXNzCisjZGVmaW5lCUlOVF9PQ1cxCQkJCTEJCQkvLyBPcGVyYXRpb24gQ29udHJvbCBXb3JkIDE6IElSUSBtYXNrCisjZGVmaW5lCUVPSQkJCQkJCTB4MjAJCS8vIG5vbi1zcGVjaWZpYyBlbmQtb2YtaW50ZXJydXB0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJRGV2aWNlL0dlb21ldHJ5IGNvbnRyb2xzCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBHRU9NRVRSWV9OT05FCQkgCTB4MAkJCS8vIE5vIGRldmljZQorI2RlZmluZSBHRU9NRVRSWV9BVVRPCQkJMHgxCQkJLy8gR2VvbWV0cnkgc2V0IGF1dG9tYXRpY2FsbHkKKyNkZWZpbmUgR0VPTUVUUllfVVNFUgkJIAkweDIJCQkvLyBVc2VyIHN1cHBsaWVkIGdlb21ldHJ5CisKKyNkZWZpbmUJREVWSUNFX05PTkUJCQkJMHgwCQkJLy8gTm8gZGV2aWNlIHByZXNlbnQKKyNkZWZpbmUJREVWSUNFX0lOQUNUSVZFCQkJMHgxCQkJLy8gZGV2aWNlIHByZXNlbnQgYnV0IG5vdCByZWdpc3RlcmVkIGFjdGl2ZQorI2RlZmluZQlERVZJQ0VfQVRBUEkJCQkweDIJCQkvLyBBVEFQSSBkZXZpY2UgKENEX1JPTSwgVGFwZSwgRXRjLi4uKQorI2RlZmluZQlERVZJQ0VfREFTRF9OT05MQkEJCTB4MwkJCS8vIE5vbiBMQkEgaW5jb21wYXRpYmxlIGRldmljZQorI2RlZmluZQlERVZJQ0VfREFTRF9MQkEJCQkweDQJCQkvLyBMQkEgY29tcGF0aWJsZSBkZXZpY2UKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlTZXR1cCBTdHJ1Y3R1cmUgRGVmaW5pdGlvbnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAkJCQkJCQkvLyBkZXZpY2Ugc2V0dXAgcGFyYW1ldGVycworCXsKKwlVQ0hBUgkJCWdlb21ldHJ5Q29udHJvbDsJLy8gZ2VvbWV0cnkgY29udHJvbCBmbGFncworCVVDSEFSCQkgICAJZGV2aWNlOwkJCQkvLyBkZXZpY2UgY29kZQorCVVTSE9SVAkJCXNlY3RvcnM7CQkJLy8gbnVtYmVyIG9mIHNlY3RvcnMgcGVyIHRyYWNrCisJVVNIT1JUCQkJaGVhZHM7CQkJCS8vIG51bWJlciBvZiBoZWFkcworCVVTSE9SVAkJCWN5bGluZGVyczsJCQkvLyBudW1iZXIgb2YgY3lsaW5kZXJzIGZvciB0aGlzIGRldmljZQorCVVMT05HCQkJYmxvY2tzOwkJCQkvLyBudW1iZXIgb2YgYmxvY2tzIG9uIGRldmljZQorCVVTSE9SVAkJCXNwYXJlMTsKKwlVU0hPUlQJCQlzcGFyZTI7CisJfSBTRVRVUF9ERVZJQ0UsICpQU0VUVVBfREVWSUNFOworCit0eXBlZGVmIHN0cnVjdAkJLy8gbWFzdGVyIHNldHVwIHN0cnVjdHVyZQorCXsKKwlVU0hPUlQgCQkJc3RhcnR1cERlbGF5OworCVVTSE9SVCAJCQlwcm9tcHRCSU9TOworCVVTSE9SVCAJCQlmYXN0Rm9ybWF0OworCVVTSE9SVAkJCXNwYXJlMjsKKwlVU0hPUlQJCQlzcGFyZTM7CisJVVNIT1JUCQkJc3BhcmU0OworCVVTSE9SVAkJCXNwYXJlNTsKKwlVU0hPUlQJCQlzcGFyZTY7CisJU0VUVVBfREVWSUNFCXNldHVwRGV2aWNlWzhdOworCX0JU0VUVVAsICpQU0VUVVA7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHNpX2RhbGUuaCBiL2RyaXZlcnMvc2NzaS9wc2lfZGFsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzJlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcHNpX2RhbGUuaApAQCAtMCwwICsxLDU2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuIFBDSS0yMjIwSSBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBwc2lfZGFsZWkuaCAtIExpbnV4IEhvc3QgRHJpdmVyIGZvciBQQ0ktMjIyMGkgRUlERSBBZGFwdGVycworICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFBlcmNlcHRpdmUgU29sdXRpb25zLCBJbmMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQorICogY29kZSByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgY29tbWVudCB3aXRob3V0CisgKiBtb2RpZmljYXRpb24uCisgKgorICogVGVjaG5pY2FsIHVwZGF0ZXMgYW5kIHByb2R1Y3QgaW5mb3JtYXRpb24gYXQ6CisgKiAgaHR0cDovL3d3dy5wc2lkaXNrLmNvbQorICoKKyAqIFBsZWFzZSBzZW5kIHF1ZXN0aW9ucywgY29tbWVudHMsIGJ1ZyByZXBvcnRzIHRvOgorICogIHRlY2hAcHNpZGlzay5jb20gVGVjaG5pY2FsIFN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlTb21lIGRlZmluZXMgdGhhdCB3ZSBsaWtlIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQ0hBUgkJY2hhcgorI2RlZmluZQlVQ0hBUgkJdW5zaWduZWQgY2hhcgorI2RlZmluZQlTSE9SVAkJc2hvcnQKKyNkZWZpbmUJVVNIT1JUCQl1bnNpZ25lZCBzaG9ydAorI2RlZmluZQlCT09MCQl1bnNpZ25lZCBzaG9ydAorI2RlZmluZQlMT05HCQlsb25nCisjZGVmaW5lCVVMT05HCQl1bnNpZ25lZCBsb25nCisjZGVmaW5lCVZPSUQJCXZvaWQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlEYWxlIFBDSSBzZXR1cAkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJVkVORE9SX1BTSQkJCTB4MTI1NgorI2RlZmluZQlERVZJQ0VfREFMRV8xCQkweDQ0MDEJCS8qICdEMScgKi8KKyNkZWZpbmUJREVWSUNFX0JJR0RfMQkJMHg0MjAxCQkvKiAnQjEnICovCisjZGVmaW5lCURFVklDRV9CSUdEXzIJCTB4NDIwMgkJLyogJ0IyJyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCU1pc2Mga29uc3RhbnRzCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlEQUxFX01BWERSSVZFUwkJCTQKKyNkZWZpbmUJQklHRF9NQVhEUklWRVMJCQk4CisjZGVmaW5lCVNFQ1RPUlNYRkVSCQkJCTgKKyNkZWZpbmUJQVRBUElfVFJBTlNGRVIJCQk4MTkyCisjZGVmaW5lCUJZVEVTX1BFUl9TRUNUT1IJCTUxMgorI2RlZmluZQlERUZBVUxUX1RJTUlOR19NT0RFCQk1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJRUVQUk9NIGxvY2F0aW9ucwkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlEQUxFX0ZMQVNIX1BBR0VfU0laRQkxMjgJCQkJLy8gbnVtYmVyIG9mIGJ5dGVzIHBlciBwYWdlCisjZGVmaW5lCURBTEVfRkxBU0hfU0laRQkJCTY1NTM2TAorCisjZGVmaW5lCURBTEVfRkxBU0hfQklPUwkJCTB4MDAwODAwMDBMCQkvLyBCSU9TIGJhc2UgYWRkcmVzcworI2RlZmluZQlEQUxFX0ZMQVNIX1NFVFVQCQkweDAwMDg4MDAwTAkJLy8gU0VUVVAgUFJPR1JBTSBiYXNlIGFkZHJlc3Mgb2Zmc2V0IGZyb20gQklPUworI2RlZmluZQlEQUxFX0ZMQVNIX1JBSUQJCQkweDAwMDg4NDAwTAkJLy8gUkFJRCBzaWduYXR1cmUgc3RvcmFnZQorI2RlZmluZQlEQUxFX0ZMQVNIX0ZBQ1RPUlkJCTB4MDAwODkwMDBMCQkvLyBGQUNUT1JZIGRhdGEgYmFzZSBhZGRyZXNzIG9mZnNldCBmcm9tIEJJT1MKKworI2RlZmluZQlEQUxFX0ZMQVNIX0JJT1NfU0laRQkzMjc2OFUJCQkvLyBzaXplIG9mIEZMQVNIIEJJT1MgUkVHSU9OCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJREFMRSBSZWdpc3RlciBhZGRyZXNzIG9mZnNldHMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJUkVHX0RBVEEJCQkJCTB4ODAKKyNkZWZpbmUJUkVHX0VSUk9SCQkJCQkweDg0CisjZGVmaW5lCVJFR19TRUNUT1JfQ09VTlQJCQkweDg4CisjZGVmaW5lCVJFR19MQkFfMAkJCQkJMHg4QworI2RlZmluZQlSRUdfTEJBXzgJCQkJCTB4OTAKKyNkZWZpbmUJUkVHX0xCQV8xNgkJCQkJMHg5NAorI2RlZmluZQlSRUdfTEJBXzI0CQkJCQkweDk4CisjZGVmaW5lCVJFR19TVEFUX0NNRAkJCQkweDlDCisjZGVmaW5lCVJFR19TVEFUX1NFTAkJCQkweEEwCisjZGVmaW5lCVJFR19GQUlMCQkJCQkweEIwCisjZGVmaW5lCVJFR19BTFRfU1RBVAkJCQkweEI4CisjZGVmaW5lCVJFR19EUklWRV9BRFJTCQkJCTB4QkMKKworI2RlZmluZQlEQUxFX0RBVEFfU0xPVwkJCQkweDAwMDQwMDAwTAorI2RlZmluZQlEQUxFX0RBVEFfTU9ERTIJCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUJREFMRV9EQVRBX01PREUzCQkJCTB4MDAwNTAwMDBMCisjZGVmaW5lCURBTEVfREFUQV9NT0RFNAkJCQkweDAwMDYwMDAwTAorI2RlZmluZQlEQUxFX0RBVEFfTU9ERTUJCQkJMHgwMDA3MDAwMEwKKworI2RlZmluZQlCSUdEX0RBVEFfU0xPVwkJCQkweDAwMDAwMDAwTAorI2RlZmluZQlCSUdEX0RBVEFfTU9ERTAJCQkJMHgwMDAwMDAwMEwKKyNkZWZpbmUJQklHRF9EQVRBX01PREUyCQkJCTB4MDAwMDAwMDBMCisjZGVmaW5lCUJJR0RfREFUQV9NT0RFMwkJCQkweDAwMDAwMDA4TAorI2RlZmluZQlCSUdEX0RBVEFfTU9ERTQJCQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUJQklHRF9EQVRBX01PREU1CQkJCTB4MDAwMDAwMjBMCisKKyNkZWZpbmUgUlRSX0xPQ0FMX1JBTkdFCQkJCTB4MDAwCisjZGVmaW5lIFJUUl9MT0NBTF9SRU1BUAkJCQkweDAwNAorI2RlZmluZSBSVFJfRVhQX1JBTkdFCQkJCTB4MDEwCisjZGVmaW5lIFJUUl9FWFBfUkVNQVAJCQkJMHgwMTQKKyNkZWZpbmUgUlRSX1JFR0lPTlMJCQkJCTB4MDE4CisjZGVmaW5lIFJUUl9ETV9NQVNLCQkJCQkweDAxQworI2RlZmluZSBSVFJfRE1fTE9DQUxfQkFTRQkJCTB4MDIwCisjZGVmaW5lIFJUUl9ETV9JT19CQVNFCQkJCTB4MDI0CisjZGVmaW5lIFJUUl9ETV9QQ0lfUkVNQVAJCQkweDAyOAorI2RlZmluZSBSVFJfRE1fSU9fQ09ORklHCQkJMHgwMkMKKyNkZWZpbmUgUlRSX01BSUxCT1gJCQkJCTB4MDQwCisjZGVmaW5lIFJUUl9MT0NBTF9ET09SQkVMTAkJCTB4MDYwCisjZGVmaW5lIFJUUl9QQ0lfRE9PUkJFTEwJCQkweDA2NAorI2RlZmluZSBSVFJfSU5UX0NPTlRST0xfU1RBVFVTIAkJMHgwNjgKKyNkZWZpbmUgUlRSX0VFUFJPTV9DT05UUk9MX1NUQVRVUwkweDA2QworCisjZGVmaW5lIFJUUl9ETUEwX01PREUJCQkJMHgwMDgwCisjZGVmaW5lIFJUUl9ETUEwX1BDSV9BRERSCQkJMHgwMDg0CisjZGVmaW5lIFJUUl9ETUEwX0xPQ0FMX0FERFIJCQkweDAwODgKKyNkZWZpbmUgUlRSX0RNQTBfQ09VTlQJCQkJMHgwMDhDCisjZGVmaW5lIFJUUl9ETUEwX0RFU0NfUFRSCQkJMHgwMDkwCisjZGVmaW5lIFJUUl9ETUExX01PREUJCQkJMHgwMDk0CisjZGVmaW5lIFJUUl9ETUExX1BDSV9BRERSCQkJMHgwMDk4CisjZGVmaW5lIFJUUl9ETUExX0xPQ0FMX0FERFIJCQkweDAwOUMKKyNkZWZpbmUgUlRSX0RNQTFfQ09VTlQJCQkJMHgwMEEwCisjZGVmaW5lIFJUUl9ETUExX0RFU0NfUFRSCQkJMHgwMEE0CisjZGVmaW5lIFJUUl9ETUFfQ09NTUFORF9TVEFUVVMJCTB4MDBBOAorI2RlZmluZSBSVFJfRE1BX0FSQjAJCQkJMHgwMEFDCisjZGVmaW5lIFJUUl9ETUFfQVJCMQkJCQkweDAwQjAKKworI2RlZmluZSBSVExfRE1BMF9NT0RFCQkJCTB4MDAKKyNkZWZpbmUgUlRMX0RNQTBfUENJX0FERFIJCQkweDA0CisjZGVmaW5lIFJUTF9ETUEwX0xPQ0FMX0FERFIJCQkweDA4CisjZGVmaW5lIFJUTF9ETUEwX0NPVU5UCQkJCTB4MEMKKyNkZWZpbmUgUlRMX0RNQTBfREVTQ19QVFIJCQkweDEwCisjZGVmaW5lIFJUTF9ETUExX01PREUJCQkJMHgxNAorI2RlZmluZSBSVExfRE1BMV9QQ0lfQUREUgkJCTB4MTgKKyNkZWZpbmUgUlRMX0RNQTFfTE9DQUxfQUREUgkJCTB4MUMKKyNkZWZpbmUgUlRMX0RNQTFfQ09VTlQJCQkJMHgyMAorI2RlZmluZSBSVExfRE1BMV9ERVNDX1BUUgkJCTB4MjQKKyNkZWZpbmUgUlRMX0RNQV9DT01NQU5EX1NUQVRVUwkJMHgyOAorI2RlZmluZSBSVExfRE1BX0FSQjAJCQkJMHgyQworI2RlZmluZSBSVExfRE1BX0FSQjEJCQkJMHgzMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCURhbGUgU2NyYXRjaHBhZCBsb2NhdGlvbnMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCURBTEVfQ0hBTk5FTF9ERVZJQ0VfMAkJMAkJLy8gZGV2aWNlIGNoYW5uZWwgbG9jYXRpb25zCisjZGVmaW5lCURBTEVfQ0hBTk5FTF9ERVZJQ0VfMQkJMQorI2RlZmluZQlEQUxFX0NIQU5ORUxfREVWSUNFXzIJCTIKKyNkZWZpbmUJREFMRV9DSEFOTkVMX0RFVklDRV8zCQkzCisKKyNkZWZpbmUJREFMRV9TQ1JBVENIX0RFVklDRV8wCQk0CQkvLyBkZXZpY2UgdHlwZSBjb2RlcworI2RlZmluZQlEQUxFX1NDUkFUQ0hfREVWSUNFXzEJCTUKKyNkZWZpbmUgREFMRV9TQ1JBVENIX0RFVklDRV8yCQk2CisjZGVmaW5lCURBTEVfU0NSQVRDSF9ERVZJQ0VfMwkJNworCisjZGVmaW5lCURBTEVfUkFJRF8wX1NUQVRVUwkJCTgKKyNkZWZpbmUgREFMRV9SQUlEXzFfU1RBVFVTCQkJOQorCisjZGVmaW5lCURBTEVfVElNSU5HX01PREUJCQkxMgkJLy8gYnVzIG1hc3RlciB0aW1pbmcgbW9kZSAoMiwgMywgNCwgNSkKKyNkZWZpbmUJREFMRV9OVU1fRFJJVkVTCQkJCTEzCQkvLyBudW1iZXIgb2YgYWRkcmVzc2FibGUgZHJpdmVzIG9uIHRoaXMgYm9hcmQKKyNkZWZpbmUJREFMRV9SQUlEX09OCQkJCTE0IAkJLy8gUkFJRCBzdGF0dXMgT24KKyNkZWZpbmUJREFMRV9MQVNUX0VSUk9SCQkJCTE1CQkvLyBMYXN0IGVycm9yIGNvZGUgZnJvbSBCSU9TCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQmlnRCBTY3JhdGNocGFkIGxvY2F0aW9ucwkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQklHRF9ERVZJQ0VfMAkJCTAJCS8vIGRldmljZSBjaGFubmVsIGxvY2F0aW9ucworI2RlZmluZQlCSUdEX0RFVklDRV8xCQkJMQorI2RlZmluZQlCSUdEX0RFVklDRV8yCQkJMgorI2RlZmluZQlCSUdEX0RFVklDRV8zCQkJMworCisjZGVmaW5lCUJJR0RfREVWSUNFXzQJCQk0CQkvLyBkZXZpY2UgdHlwZSBjb2RlcworI2RlZmluZQlCSUdEX0RFVklDRV81CQkJNQorI2RlZmluZSBCSUdEX0RFVklDRV82CQkJNgorI2RlZmluZQlCSUdEX0RFVklDRV83CQkJNworCisjZGVmaW5lCUJJR0RfQUxBUk1fSU1BR0UJCTExCQkvLyB+aW1hZ2Ugb2YgYWxhcm0gZmFpbCByZWdpc3RlcgkJCisjZGVmaW5lCUJJR0RfVElNSU5HX01PREUJCTEyCQkvLyBidXMgbWFzdGVyIHRpbWluZyBtb2RlICgyLCAzLCA0LCA1KQorI2RlZmluZQlCSUdEX05VTV9EUklWRVMJCQkxMwkJLy8gbnVtYmVyIG9mIGFkZHJlc3NhYmxlIGRyaXZlcyBvbiB0aGlzIGJvYXJkCisjZGVmaW5lCUJJR0RfUkFJRF9PTgkJCTE0IAkJLy8gUkFJRCBzdGF0dXMgaXMgb24gZm9yIHRoZSB3aG9sZSBib2FyZAorI2RlZmluZQlCSUdEX0xBU1RfRVJST1IJCQkxNQkJLy8gTGFzdCBlcnJvciBjb2RlIGZyb20gQklPUworCisjZGVmaW5lCUJJR0RfUkFJRF8wX1NUQVRVUwkJMTYKKyNkZWZpbmUgQklHRF9SQUlEXzFfU1RBVFVTCQkxNworI2RlZmluZQlCSUdEX1JBSURfMl9TVEFUVVMJCTE4CisjZGVmaW5lCUJJR0RfUkFJRF8zX1NUQVRVUwkJMTkKKyNkZWZpbmUJQklHRF9SQUlEXzRfU1RBVFVTCQkyMAorI2RlZmluZSBCSUdEX1JBSURfNV9TVEFUVVMJCTIxCisjZGVmaW5lCUJJR0RfUkFJRF82X1NUQVRVUwkJMjIKKyNkZWZpbmUJQklHRF9SQUlEXzdfU1RBVFVTCQkyMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCURhbGUgY2FibGUgc2VsZWN0IGJpdHMJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlTRUxfTk9ORQkJCQkJMHgwMAorI2RlZmluZQlTRUxfMQkJCQkJCTB4MDEKKyNkZWZpbmUJU0VMXzIJCQkJCQkweDAyCisjZGVmaW5lCVNFTF8zCQkJCQkJMHgwNAorI2RlZmluZQlTRUxfNAkJCQkJCTB4MDgKKyNkZWZpbmUJU0VMX05FV19TUEVFRF8xCQkJCTB4MjAKKyNkZWZpbmUJU0VMX0NPUFkJCQkJCTB4NDAKKyNkZWZpbmUJU0VMX0lSUV9PRkYJCQkJCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlEZXZpY2UvR2VvbWV0cnkgY29udHJvbHMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEdFT01FVFJZX05PTkUJIAkJCTB4MAkJCQkvLyBObyBkZXZpY2UKKyNkZWZpbmUgR0VPTUVUUllfU0VUCQkJCTB4MQkJCQkvLyBHZW9tZXRyeSBzZXQKKyNkZWZpbmUJR0VPTUVUUllfTEJBCQkJCTB4MgkJCQkvLyBHZW9tZXRyeSBzZXQgaW4gZGVmYXVsdCBMQkEgbW9kZQorI2RlZmluZQlHRU9NRVRSWV9QSE9FTklYCQkJMHgzCQkJCS8vIEdlb21ldHJ5IHNldCBpbiBQaGVvbml4IEJJT1MgY29tcGF0aWJpbGl0eSBtb2RlCisKKyNkZWZpbmUJREVWSUNFX05PTkUJCQkJCTB4MAkJCQkvLyBObyBkZXZpY2UgcHJlc2VudAorI2RlZmluZQlERVZJQ0VfSU5BQ1RJVkUJCQkJMHgxCQkJCS8vIGRldmljZSBwcmVzZW50IGJ1dCBub3QgcmVnaXN0ZXJlZCBhY3RpdmUKKyNkZWZpbmUJREVWSUNFX0FUQVBJCQkJCTB4MgkJCQkvLyBBVEFQSSBkZXZpY2UgKENEX1JPTSwgVGFwZSwgRXRjLi4uKQorI2RlZmluZQlERVZJQ0VfREFTRF9OT05MQkEJCQkweDMJCQkJLy8gTm9uIExCQSBpbmNvbXBhdGlibGUgZGV2aWNlCisjZGVmaW5lCURFVklDRV9EQVNEX0xCQQkJCQkweDQJCQkJLy8gTEJBIGNvbXBhdGlibGUgZGV2aWNlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJQmlnRCBmYWlsIHJlZ2lzdGVyIGJpdHMJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlGQUlMX05PTkUJCQkJMHgwMAorI2RlZmluZQlGQUlMXzAJCQkJCTB4MDEKKyNkZWZpbmUJRkFJTF8xCQkJCQkweDAyCisjZGVmaW5lCUZBSUxfMgkJCQkJMHgwNAorI2RlZmluZQlGQUlMX01VTFRJUExFCQkJMHgwOAorI2RlZmluZQlGQUlMX0dPT0QJCQkJMHgyMAorI2RlZmluZQlGQUlMX0FVRElCTEUJCQkweDQwCisjZGVmaW5lCUZBSUxfQU5ZCQkJCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlTZXR1cCBTdHJ1Y3R1cmUgRGVmaW5pdGlvbnMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAkJLy8gZGV2aWNlIHNldHVwIHBhcmFtZXRlcnMKKwl7CisJVUNIQVIJZ2VvbWV0cnlDb250cm9sOwkvLyBnZW9tZXRyeSBjb250cm9sIGZsYWdzCisJVUNIQVIJZGV2aWNlOwkJCQkvLyBkZXZpY2UgY29kZQorCVVTSE9SVAlzZWN0b3JzOwkJCS8vIG51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjaworCVVTSE9SVAloZWFkczsJCQkJLy8gbnVtYmVyIG9mIGhlYWRzCisJVVNIT1JUCWN5bGluZGVyczsJCQkvLyBudW1iZXIgb2YgY3lsaW5kZXJzIGZvciB0aGlzIGRldmljZQorCVVMT05HCWJsb2NrczsJCQkJLy8gbnVtYmVyIG9mIGJsb2NrcyBvbiBkZXZpY2UKKwlVTE9ORwlyZWFsQ2FwYWNpdHk7CQkvLyBudW1iZXIgb2YgcmVhbCBibG9ja3Mgb24gdGhpcyBkZXZpY2UgZm9yIGRyaXZlIGNoYW5nZWQgdGVzdGluZworCX0gU0VUVVBfREVWSUNFLCAqUFNFVFVQX0RFVklDRTsKKwordHlwZWRlZiBzdHJ1Y3QJCS8vIG1hc3RlciBzZXR1cCBzdHJ1Y3R1cmUKKwl7CisJVVNIT1JUCQkJc3RhcnR1cERlbGF5OworCUJPT0wJCQlwcm9tcHRCSU9TOworCUJPT0wJCQlmYXN0Rm9ybWF0OworCUJPT0wJCQlzaGFyZUludGVycnVwdDsKKwlCT09MCQkJcmVib290UmVidWlsZDsKKwlVU0hPUlQJCQl0aW1pbmdNb2RlOworCVVTSE9SVAkJCXNwYXJlNTsKKwlVU0hPUlQJCQlzcGFyZTY7CisJU0VUVVBfREVWSUNFCXNldHVwRGV2aWNlW0JJR0RfTUFYRFJJVkVTXTsKKwl9CVNFVFVQLCAqUFNFVFVQOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCVJBSUQgU3RydWN0dXJlIERlZmluaXRpb25zCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZglzdHJ1Y3QKKwl7CisJVUNIQVIJc2lnbmF0dXJlOwkJCS8vIDB4NTUgb3VyIG1pcnJvciBzaWduYXR1cmUKKwlVQ0hBUglzdGF0dXM7CQkJCS8vIGN1cnJlbnQgc3RhdHVzIGJpdHMKKwlVQ0hBUglwYWlySWRlbnRpZmllcjsJCS8vIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBwYWlyCisJVUxPTkcJcmVjb25zdHJ1Y3RQb2ludDsJLy8gcmVjb250cnVjdGlvbiBwb2ludCBmb3IgaG90IHJlY29uc3RydWN0CisJfQlESVNLX01JUlJPUjsKKwordHlwZWRlZiBzdHJ1Y3QJREVWSUNFX1JBSUQxCisJeworCWxvbmcJCVRvdGFsU2VjdG9yczsKKwlESVNLX01JUlJPUiBEaXNrUmFpZDE7CisJfQlERVZJQ0VfUkFJRDEsICpQREVWSUNFX1JBSUQxOworCisjZGVmaW5lCURJU0tfTUlSUk9SX1BPU0lUSU9OCTB4MDFBOAorI2RlZmluZQlTSUdOQVRVUkUJCQkJMHg1NQorCisjZGVmaW5lCU1BU0tfU0VSSUFMX05VTUJFUgkweDBGRkUJCQkvLyBtYXNrIGZvciBzZXJpYWwgbnVtYmVyIG1hdGNoaW5nCisjZGVmaW5lCU1BU0tfU0VSSUFMX1VOSVQJMHgwMDAxCQkJLy8gbWFzayBmb3IgdW5pdCBwb3J0aW9uIG9mIHNlcmlhbCBudW1iZXIKKworLy8gU3RhdHVzIGJpdHMKKyNkZWZpbmUJVUNCRl9NSVJST1JFRAkJMHgwMDEwCQkJCQkJCQkvLyBkcml2ZSBoYXMgYSBwYWlyCisjZGVmaW5lCVVDQkZfTUFUQ0hFRAkJMHgwMDIwCQkJCQkJCQkvLyBkcml2ZSBwYWlyIGlzIG1hdGNoZWQKKyNkZWZpbmUJVUNCRl9TVVJWSVZPUgkJMHgwMDQwCQkJCQkJCQkvLyB0aGlzIHVuaXQgaXMgYSBzdXJ2aXZvciBvZiBhIHBhaXIKKyNkZWZpbmUJVUNCRl9SRUJVSUxECQkweDAwODAJCQkJCQkJCS8vIHJlYnVpbGQgaW4gcHJvZ3Jlc3Mgb24gdGhpcyBkZXZpY2UKKworLy8gU0NTSSBjb250cm9scyBmb3IgUkFJRAorI2RlZmluZQlTQ19NWV9SQUlECQkJMHhCRgkJCS8vIG91ciBzcGVjaWFsIENEQiBjb21tYW5kIGJ5dGUgZm9yIFdpbjk1Li4uIGludGVyZmFjZQorI2RlZmluZQlNWV9TQ1NJX1FVRVJZMQkJMHgzMgkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHF1ZXJ5IGRyaXZlciBmb3IgUkFJRCAxIGluZm9ybWF0YXRpb24KKyNkZWZpbmUJTVlfU0NTSV9SRUJVSUxECQkweDQwCQkJLy8gYnl0ZSAxIHN1YmNvbW1hbmQgdG8gcmVjb25zdHJ1Y3QgYSBtaXJyb3JlZCBwYWlyCisjZGVmaW5lIE1ZX1NDU0lfREVNT0ZBSUwJMHg1NAkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIGZvciBSQUlEIGZhaWx1cmUgZGVtb25zdHJhdGlvbgorI2RlZmluZQlNWV9TQ1NJX0FMQVJNTVVURQkweDYwCQkJLy8gYnl0ZSAxIHN1YmNvbW1hbmQgdG8gbXV0ZSBhbnkgYWxhcm0gY3VycmVudGx5IG9uCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJVGltZW91dCBrb25zdGFudHMJCSAJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVRJTUVPVVRfUkVBRFkJCQkJMTAwCQkJLy8gMTAwIG1TZWMKKyNkZWZpbmUJVElNRU9VVF9EUlEJCQkJCTMwMAkJCS8vIDMwMCBtU2VjCisjZGVmaW5lCVRJTUVPVVRfREFUQQkJCQkoMyAqIEhaKQkvLyAzIHNlY29uZHMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQlNaXNjLiBtYWNyb3MJCQkgCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBTlkyU0NTSSh1cCwgcCkJCQkJCVwKKygoVUNIQVIgKil1cClbMF0gPSAoKChVTE9ORykocCkpID4+IDgpOwlcCisoKFVDSEFSICopdXApWzFdID0gKChVTE9ORykocCkpOworCisjZGVmaW5lIFNDU0kyTE9ORyh1cCkJCQkJCVwKKyggKCgobG9uZykqKCgoVUNIQVIgKil1cCkpKSA8PCAxNikJCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsxXSkpIDw8IDgpCQlcCisrICgobG9uZykoKChVQ0hBUiAqKXVwKVsyXSkpICkKKworI2RlZmluZSBYQU5ZMlNDU0kodXAsIHApCQkJCVwKKygoVUNIQVIgKil1cClbMF0gPSAoKGxvbmcpKHApKSA+PiAyNDsJXAorKChVQ0hBUiAqKXVwKVsxXSA9ICgobG9uZykocCkpID4+IDE2OwlcCisoKFVDSEFSICopdXApWzJdID0gKChsb25nKShwKSkgPj4gODsJXAorKChVQ0hBUiAqKXVwKVszXSA9ICgobG9uZykocCkpOworCisjZGVmaW5lIFhTQ1NJMkxPTkcodXApCQkJCQlcCisoICgoKGxvbmcpKCgoVUNIQVIgKil1cClbMF0pKSA8PCAyNCkJXAorKyAoKChsb25nKSgoKFVDSEFSICopdXApWzFdKSkgPDwgMTYpCVwKKysgKCgobG9uZykoKChVQ0hBUiAqKXVwKVsyXSkpIDw8ICA4KQlcCisrICgobG9uZykoKChVQ0hBUiAqKXVwKVszXSkpICkKKworI2RlZmluZQlTZWxlY3RTcGlnb3QocGFkYXB0ZXIsc3BpZ290KQlvdXRiX3AgKHNwaWdvdCwgcGFkYXB0ZXItPnJlZ1N0YXRTZWwpCisjZGVmaW5lIFdyaXRlQ29tbWFuZChwYWRhcHRlcixjbWQpCQlvdXRiX3AgKGNtZCwgcGFkYXB0ZXItPnJlZ1N0YXRDbWQpCisjZGVmaW5lCUF0YXBpRGV2aWNlKHBhZGFwdGVyLGIpCQkJb3V0Yl9wIChiLCBwYWRhcHRlci0+cmVnTGJhMjQpOworI2RlZmluZQlBdGFwaUNvdW50TG8ocGFkYXB0ZXIsYikJCW91dGJfcCAoYiwgcGFkYXB0ZXItPnJlZ0xiYTgpCisjZGVmaW5lCUF0YXBpQ291bnRIaShwYWRhcHRlcixiKQkJb3V0Yl9wIChiLCBwYWRhcHRlci0+cmVnTGJhMTYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJU0NTSSBDREIgb3BlcmF0aW9uIGNvZGVzIAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU0NTSU9QX1RFU1RfVU5JVF9SRUFEWQkJMHgwMAorI2RlZmluZSBTQ1NJT1BfUkVaRVJPX1VOSVQJCQkweDAxCisjZGVmaW5lIFNDU0lPUF9SRVdJTkQJCQkJMHgwMQorI2RlZmluZSBTQ1NJT1BfUkVRVUVTVF9CTE9DS19BRERSCTB4MDIKKyNkZWZpbmUgU0NTSU9QX1JFUVVFU1RfU0VOU0UJCTB4MDMKKyNkZWZpbmUgU0NTSU9QX0ZPUk1BVF9VTklUCQkJMHgwNAorI2RlZmluZSBTQ1NJT1BfUkVBRF9CTE9DS19MSU1JVFMJMHgwNQorI2RlZmluZSBTQ1NJT1BfUkVBU1NJR05fQkxPQ0tTCQkweDA3CisjZGVmaW5lIFNDU0lPUF9SRUFENgkJCQkweDA4CisjZGVmaW5lIFNDU0lPUF9SRUNFSVZFCQkJCTB4MDgKKyNkZWZpbmUgU0NTSU9QX1dSSVRFNgkJCQkweDBBCisjZGVmaW5lIFNDU0lPUF9QUklOVAkJCQkweDBBCisjZGVmaW5lIFNDU0lPUF9TRU5ECQkJCQkweDBBCisjZGVmaW5lIFNDU0lPUF9TRUVLNgkJCQkweDBCCisjZGVmaW5lIFNDU0lPUF9UUkFDS19TRUxFQ1QJCQkweDBCCisjZGVmaW5lIFNDU0lPUF9TTEVXX1BSSU5UCQkJMHgwQgorI2RlZmluZSBTQ1NJT1BfU0VFS19CTE9DSwkJCTB4MEMKKyNkZWZpbmUgU0NTSU9QX1BBUlRJVElPTgkJCTB4MEQKKyNkZWZpbmUgU0NTSU9QX1JFQURfUkVWRVJTRQkJCTB4MEYKKyNkZWZpbmUgU0NTSU9QX1dSSVRFX0ZJTEVNQVJLUwkJMHgxMAorI2RlZmluZSBTQ1NJT1BfRkxVU0hfQlVGRkVSCQkJMHgxMAorI2RlZmluZSBTQ1NJT1BfU1BBQ0UJCQkJMHgxMQorI2RlZmluZSBTQ1NJT1BfSU5RVUlSWQkJCQkweDEyCisjZGVmaW5lIFNDU0lPUF9WRVJJRlk2CQkJCTB4MTMKKyNkZWZpbmUgU0NTSU9QX1JFQ09WRVJfQlVGX0RBVEEJCTB4MTQKKyNkZWZpbmUgU0NTSU9QX01PREVfU0VMRUNUCQkJMHgxNQorI2RlZmluZSBTQ1NJT1BfUkVTRVJWRV9VTklUCQkJMHgxNgorI2RlZmluZSBTQ1NJT1BfUkVMRUFTRV9VTklUCQkJMHgxNworI2RlZmluZSBTQ1NJT1BfQ09QWQkJCQkJMHgxOAorI2RlZmluZSBTQ1NJT1BfRVJBU0UJCQkJMHgxOQorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRU5TRQkJCTB4MUEKKyNkZWZpbmUgU0NTSU9QX1NUQVJUX1NUT1BfVU5JVAkJMHgxQgorI2RlZmluZSBTQ1NJT1BfU1RPUF9QUklOVAkJCTB4MUIKKyNkZWZpbmUgU0NTSU9QX0xPQURfVU5MT0FECQkJMHgxQgorI2RlZmluZSBTQ1NJT1BfUkVDRUlWRV9ESUFHTk9TVElDCTB4MUMKKyNkZWZpbmUgU0NTSU9QX1NFTkRfRElBR05PU1RJQwkJMHgxRAorI2RlZmluZSBTQ1NJT1BfTUVESVVNX1JFTU9WQUwJCTB4MUUKKyNkZWZpbmUgU0NTSU9QX1JFQURfQ0FQQUNJVFkJCTB4MjUKKyNkZWZpbmUgU0NTSU9QX1JFQUQJCQkJCTB4MjgKKyNkZWZpbmUgU0NTSU9QX1dSSVRFCQkJCTB4MkEKKyNkZWZpbmUgU0NTSU9QX1NFRUsJCQkJCTB4MkIKKyNkZWZpbmUgU0NTSU9QX0xPQ0FURQkJCQkweDJCCisjZGVmaW5lIFNDU0lPUF9XUklURV9WRVJJRlkJCQkweDJFCisjZGVmaW5lIFNDU0lPUF9WRVJJRlkJCQkJMHgyRgorI2RlZmluZSBTQ1NJT1BfU0VBUkNIX0RBVEFfSElHSAkJMHgzMAorI2RlZmluZSBTQ1NJT1BfU0VBUkNIX0RBVEFfRVFVQUwJMHgzMQorI2RlZmluZSBTQ1NJT1BfU0VBUkNIX0RBVEFfTE9XCQkweDMyCisjZGVmaW5lIFNDU0lPUF9TRVRfTElNSVRTCQkJMHgzMworI2RlZmluZSBTQ1NJT1BfUkVBRF9QT1NJVElPTgkJMHgzNAorI2RlZmluZSBTQ1NJT1BfU1lOQ0hST05JWkVfQ0FDSEUJMHgzNQorI2RlZmluZSBTQ1NJT1BfQ09NUEFSRQkJCQkweDM5CisjZGVmaW5lIFNDU0lPUF9DT1BZX0NPTVBBUkUJCQkweDNBCisjZGVmaW5lIFNDU0lPUF9XUklURV9EQVRBX0JVRkYJCTB4M0IKKyNkZWZpbmUgU0NTSU9QX1JFQURfREFUQV9CVUZGCQkweDNDCisjZGVmaW5lIFNDU0lPUF9DSEFOR0VfREVGSU5JVElPTgkweDQwCisjZGVmaW5lIFNDU0lPUF9SRUFEX1NVQl9DSEFOTkVMCQkweDQyCisjZGVmaW5lIFNDU0lPUF9SRUFEX1RPQwkJCQkweDQzCisjZGVmaW5lIFNDU0lPUF9SRUFEX0hFQURFUgkJCTB4NDQKKyNkZWZpbmUgU0NTSU9QX1BMQVlfQVVESU8JCQkweDQ1CisjZGVmaW5lIFNDU0lPUF9QTEFZX0FVRElPX01TRgkJMHg0NworI2RlZmluZSBTQ1NJT1BfUExBWV9UUkFDS19JTkRFWAkJMHg0OAorI2RlZmluZSBTQ1NJT1BfUExBWV9UUkFDS19SRUxBVElWRQkweDQ5CisjZGVmaW5lIFNDU0lPUF9QQVVTRV9SRVNVTUUJCQkweDRCCisjZGVmaW5lIFNDU0lPUF9MT0dfU0VMRUNUCQkJMHg0QworI2RlZmluZSBTQ1NJT1BfTE9HX1NFTlNFCQkJMHg0RAorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRUxFQ1QxMAkJMHg1NQorI2RlZmluZSBTQ1NJT1BfTU9ERV9TRU5TRTEwCQkJMHg1QQorI2RlZmluZSBTQ1NJT1BfTE9BRF9VTkxPQURfU0xPVAkJMHhBNgorI2RlZmluZSBTQ1NJT1BfTUVDSEFOSVNNX1NUQVRVUwkJMHhCRAorI2RlZmluZSBTQ1NJT1BfUkVBRF9DRAkJCQkweEJFCisKKy8vIElERSBjb21tYW5kIGRlZmluaXRpb25zCisjZGVmaW5lIElERV9DT01NQU5EX0FUQVBJX1JFU0VUCQkweDA4CisjZGVmaW5lIElERV9DT01NQU5EX1JFQUQJCQkweDIwCisjZGVmaW5lIElERV9DT01NQU5EX1dSSVRFCQkJMHgzMAorI2RlZmluZSBJREVfQ09NTUFORF9SRUNBTElCUkFURQkJMHgxMAorI2RlZmluZSBJREVfQ09NTUFORF9TRUVLCQkJMHg3MAorI2RlZmluZSBJREVfQ09NTUFORF9TRVRfUEFSQU1FVEVSUwkweDkxCisjZGVmaW5lIElERV9DT01NQU5EX1ZFUklGWQkJCTB4NDAKKyNkZWZpbmUgSURFX0NPTU1BTkRfQVRBUElfUEFDS0VUCTB4QTAKKyNkZWZpbmUgSURFX0NPTU1BTkRfQVRBUElfSURFTlRJRlkJMHhBMQorI2RlZmluZQlJREVfQ01EX1JFQURfTVVMVElQTEUJCTB4QzQKKyNkZWZpbmUJSURFX0NNRF9XUklURV9NVUxUSVBMRQkJMHhDNQorI2RlZmluZQlJREVfQ01EX1NFVF9NVUxUSVBMRQkJMHhDNgorI2RlZmluZSBJREVfQ09NTUFORF9JREVOVElGWQkJMHhFQworCisvLyBJREUgc3RhdHVzIGRlZmluaXRpb25zCisjZGVmaW5lIElERV9TVEFUVVNfRVJST1IJCQkweDAxCisjZGVmaW5lIElERV9TVEFUVVNfSU5ERVgJCQkweDAyCisjZGVmaW5lIElERV9TVEFUVVNfQ09SUkVDVEVEX0VSUk9SCTB4MDQKKyNkZWZpbmUgSURFX1NUQVRVU19EUlEJCQkJMHgwOAorI2RlZmluZSBJREVfU1RBVFVTX0RTQwkJCQkweDEwCisjZGVmaW5lCUlERV9TVEFUVVNfV1JJVEVfRkFVTFQJCTB4MjAKKyNkZWZpbmUgSURFX1NUQVRVU19EUkRZCQkJCTB4NDAKKyNkZWZpbmUgSURFX1NUQVRVU19CVVNZCQkJCTB4ODAKKwordHlwZWRlZiBzdHJ1Y3QgX0FUQVBJX1NUQVRVUworCXsKKwlDSEFSCWNoZWNrCQk6MTsKKwlDSEFSCXJlc2VydmVkMQk6MTsKKwlDSEFSCWNvcnIJCToxOworCUNIQVIJZHJxCQkJOjE7CisJQ0hBUglkc2MJCQk6MTsKKwlDSEFSCXJlc2VydmVkMgk6MTsKKwlDSEFSCWRyZHkJCToxOworCUNIQVIJYnN5CQkJOjE7CisJfQlBVEFQSV9TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IF9BVEFQSV9SRUFTT04KKwl7CisJQ0hBUgljb2QJCQk6MTsKKwlDSEFSCWlvCQkJOjE7CisJQ0hBUglyZXNlcnZlZDEJOjY7CisJfQlBVEFQSV9SRUFTT047CisKK3R5cGVkZWYgc3RydWN0IF9BVEFQSV9FUlJPUgorCXsKKwlDSEFSCWlsaQkJCToxOworCUNIQVIJZW9tCQkJOjE7CisJQ0hBUglhYm9ydAkJOjE7CisJQ0hBUgltY3IJCQk6MTsKKwlDSEFSCXNlbnNlS2V5CTo0OworCX0JQVRBUElfRVJST1I7CisKKy8vIElERSBlcnJvciBkZWZpbml0aW9ucworI2RlZmluZQlJREVfRVJST1JfQU1ORgkJCQkweDAxCisjZGVmaW5lCUlERV9FUlJPUl9US09ORgkJCQkweDAyCisjZGVmaW5lCUlERV9FUlJPUl9BQlJUCQkJCTB4MDQKKyNkZWZpbmUJSURFX0VSUk9SX01DUgkJCQkweDA4CisjZGVmaW5lCUlERV9FUlJPUl9JREZOCQkJCTB4MTAKKyNkZWZpbmUJSURFX0VSUk9SX01DCQkJCTB4MjAKKyNkZWZpbmUJSURFX0VSUk9SX1VOQwkJCQkweDQwCisjZGVmaW5lCUlERV9FUlJPUl9CQksJCQkJMHg4MAorCisvLyBTQ1NJIHJlYWQgY2FwYWNpdHkgc3RydWN0dXJlCit0eXBlZGVmCXN0cnVjdCBfUkVBRF9DQVBBQ0lUWV9EQVRBCisJeworCVVMT05HIGJsa3M7CQkJCS8qIHRvdGFsIGJsb2NrcyAoY29udmVydGVkIHRvIGxpdHRsZSBlbmRpYW4pICovCisJVUxPTkcgYmxrc2l6OwkJCS8qIHNpemUgb2YgZWFjaCAoY29udmVydGVkIHRvIGxpdHRsZSBlbmRpYW4pICovCisJfQlSRUFEX0NBUEFDSVRZX0RBVEEsICpQUkVBRF9DQVBBQ0lUWV9EQVRBOworCisvLyBTQ1NJIGlucXVpcnkgZGF0YQordHlwZWRlZiBzdHJ1Y3QgX0lOUVVJUllEQVRBCisJeworCVVDSEFSIERldmljZVR5cGUJCQk6NTsKKwlVQ0hBUiBEZXZpY2VUeXBlUXVhbGlmaWVyCTozOworCVVDSEFSIERldmljZVR5cGVNb2RpZmllcgk6NzsKKwlVQ0hBUiBSZW1vdmFibGVNZWRpYQkJOjE7CisgICAgVUNIQVIgVmVyc2lvbnM7CisgICAgVUNIQVIgUmVzcG9uc2VEYXRhRm9ybWF0OworICAgIFVDSEFSIEFkZGl0aW9uYWxMZW5ndGg7CisgICAgVUNIQVIgUmVzZXJ2ZWRbMl07CisJVUNIQVIgU29mdFJlc2V0CQkJCToxOworCVVDSEFSIENvbW1hbmRRdWV1ZQkJCToxOworCVVDSEFSIFJlc2VydmVkMgkJCQk6MTsKKwlVQ0hBUiBMaW5rZWRDb21tYW5kcwkJOjE7CisJVUNIQVIgU3luY2hyb25vdXMJCQk6MTsKKwlVQ0hBUiBXaWRlMTZCaXQJCQkJOjE7CisJVUNIQVIgV2lkZTMyQml0CQkJCToxOworCVVDSEFSIFJlbGF0aXZlQWRkcmVzc2luZwk6MTsKKyAgICBVQ0hBUiBWZW5kb3JJZFs4XTsKKyAgICBVQ0hBUiBQcm9kdWN0SWRbMTZdOworICAgIFVDSEFSIFByb2R1Y3RSZXZpc2lvbkxldmVsWzRdOworICAgIFVDSEFSIFZlbmRvclNwZWNpZmljWzIwXTsKKyAgICBVQ0hBUiBSZXNlcnZlZDNbNDBdOworCX0JSU5RVUlSWURBVEEsICpQSU5RVUlSWURBVEE7CisKKy8vIElERSBJREVOVElGWSBkYXRhCisjcHJhZ21hIHBhY2sgKDEpCit0eXBlZGVmIHN0cnVjdCBfSURFTlRJRllfREFUQQorCXsKKyAgICBVU0hPUlQJR2VuZXJhbENvbmZpZ3VyYXRpb247CQkvLyAgMAorICAgIFVTSE9SVAlOdW1iZXJPZkN5bGluZGVyczsJCQkvLyAgMQorICAgIFVTSE9SVAlSZXNlcnZlZDE7CQkJCQkvLyAgMgorICAgIFVTSE9SVAlOdW1iZXJPZkhlYWRzOwkJCQkvLyAgMworICAgIFVTSE9SVAlVbmZvcm1hdHRlZEJ5dGVzUGVyVHJhY2s7CS8vICA0CisgICAgVVNIT1JUCVVuZm9ybWF0dGVkQnl0ZXNQZXJTZWN0b3I7CS8vICA1CisgICAgVVNIT1JUCVNlY3RvcnNQZXJUcmFjazsJCQkvLyAgNgorCVVTSE9SVAlOdW1CeXRlc0lTRzsJCQkJLy8gIDcgQnl0ZSBMZW4gLSBpbnRlci1zZWN0b3IgZ2FwCisJVVNIT1JUCU51bUJ5dGVzU3luYzsJCQkJLy8gIDggICAgICAgICAgLSBzeW5jIGZpZWxkCisJVVNIT1JUCU51bVdvcmRzVlVTOwkJCQkvLyAgOSBMZW4gLSBWZW5kb3IgVW5pcXVlIEluZm8KKyAgICBVU0hPUlQJU2VyaWFsTnVtYmVyWzEwXTsJCQkvLyAxMAorICAgIFVTSE9SVAlCdWZmZXJUeXBlOwkJCQkJLy8gMjAKKyAgICBVU0hPUlQJQnVmZmVyU2VjdG9yU2l6ZTsJCQkvLyAyMQorICAgIFVTSE9SVAlOdW1iZXJPZkVjY0J5dGVzOwkJCS8vIDIyCisgICAgVVNIT1JUCUZpcm13YXJlUmV2aXNpb25bNF07CQkvLyAyMworICAgIFVTSE9SVAlNb2RlbE51bWJlclsyMF07CQkJLy8gMjcKKwlVU0hPUlQJTnVtU2VjdG9yc1BlckludAk6ODsJCS8vIDQ3IE11bHRpcGxlIE1vZGUgLSBTZWMvQmxrCisJVVNIT1JUCVJlc2VydmVkMgkJCTo4OwkJLy8gNDcKKwlVU0hPUlQJRG91YmxlV29yZE1vZGU7CQkJCS8vIDQ4IGZsYWcgZm9yIGRvdWJsZSB3b3JkIG1vZGUgY2FwYWJsZQorCVVTSE9SVAlWZW5kb3JVbmlxdWUxCQk6ODsJCS8vIDQ5CisJVVNIT1JUCVN1cHBvcnRETUEJCQk6MTsJCS8vIDQ5IERNQSBzdXBwb3J0ZWQKKwlVU0hPUlQJU3VwcG9ydExCQQkJCToxOwkJLy8gNDkgTEJBIHN1cHBvcnRlZAorCVVTSE9SVAlTdXBwb3J0SU9SRFlEaXNhYmxlCToxOwkJLy8gNDkgSU9SRFkgY2FuIGJlIGRpc2FibGVkCisJVVNIT1JUCVN1cHBvcnRJT1JEWQkJOjE7CQkvLyA0OSBJT1JEWSBzdXBwb3J0ZWQKKwlVU0hPUlQJUmVzZXJ2ZWRQc3VlZG9ETUEJOjE7CQkvLyA0OSByZXNlcnZlZCBmb3IgcHNldWRvIERNQSBtb2RlIHN1cHBvcnQKKwlVU0hPUlQJUmVzZXJ2ZWQzCQkJOjM7CQkvLyA0OQorCVVTSE9SVAlSZXNlcnZlZDQ7CQkJCQkvLyA1MAorCVVTSE9SVAlSZXNlcnZlZDUJCQk6ODsJCS8vIDUxIFRyYW5zZmVyIEN5Y2xlIFRpbWluZyAtIFBJTworCVVTSE9SVAlQSU9DeWNsZVRpbWUJCTo4OwkJLy8gNTEgVHJhbnNmZXIgQ3ljbGUgVGltaW5nIC0gUElPCisJVVNIT1JUCVJlc2VydmVkNgkJCTo4OwkJLy8gNTIgICAgICAgICAgICAgICAgICAgICAgIC0gRE1BCisJVVNIT1JUCURNQUN5Y2xlVGltZQkJOjg7CQkvLyA1MiAgICAgICAgICAgICAgICAgICAgICAgLSBETUEKKwlVU0hPUlQJVmFsaWRfNTRfNTgJCQk6MTsJCS8vIDUzIHdvcmRzIDU0IC0gNTggYXJlIHZhbGlkCisJVVNIT1JUCVZhbGlkXzY0XzcwCQkJOjE7CQkvLyA1MyB3b3JkcyA2NCAtIDcwIGFyZSB2YWxpZAorCVVTSE9SVAlSZXNlcnZlZDcJCQk6MTQ7CS8vIDUzCisJVVNIT1JUCUxvZ051bUN5bDsJCQkJCS8vIDU0IEN1cnJlbnQgVHJhbnNsYXRpb24gLSBOdW0gQ3lsCisJVVNIT1JUCUxvZ051bUhlYWRzOwkJCQkvLyA1NSAgICAgICAgICAgICAgICAgICAgICAgTnVtIEhlYWRzCisJVVNIT1JUCUxvZ1NlY3RvcnNQZXJUcmFjazsJCQkvLyA1NiAgICAgICAgICAgICAgICAgICAgICAgU2VjL1RyaworCVVMT05HCUxvZ1RvdGFsU2VjdG9yczsJCQkvLyA1NyAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgU2VjCisJVVNIT1JUCUN1cnJlbnROdW1TZWNQZXJJbnQJOjg7CQkvLyA1OSBjdXJyZW50IHNldHRpbmcgZm9yIG51bWJlciBvZiBzZWN0b3JzIHBlciBpbnRlcnJ1cHQKKwlVU0hPUlQJVmFsaWROdW1TZWNQZXJJbnQJOjE7CQkvLyA1OSBDdXJyZW50IHNldHRpbmcgaXMgdmFsaWQgZm9yIG51bWJlciBvZiBzZWN0b3JzIHBlciBpbnRlcnJ1cHQKKwlVU0hPUlQJUmVzZXJ2ZWQ4CQkJOjc7CQkvLyA1OQorCVVMT05HCUxCQVRvdGFsU2VjdG9yczsJCQkvLyA2MCBMQkEgTW9kZSAtIFNlY3RvcnMKKwlVU0hPUlQJRE1BU1dvcmRGbGFnczsJCQkJLy8gNjIKKwlVU0hPUlQJRE1BTVdvcmRGbGFnczsJCQkJLy8gNjMKKwlVU0hPUlQJQWR2YW5jZWRQSU9TdXBwb3J0ICA6ODsJCS8vIDY0IEZsb3cgY29udHJvbCBQSU8gdHJhbnNmZXIgbW9kZXMgc3VwcG9ydGVkCisJVVNIT1JUCVJlc2VydmVkOQkJCTo4OwkJLy8gNjQKKwlVU0hPUlQJTWluTXVsdGlETUFDeWNsZTsJCQkvLyA2NSBtaW5pbXVtIG11bHRpd29yZCBETUEgdHJhbnNmZXIgY3ljbGUgdGltZSBwZXIgd29yZAorCVVTSE9SVAlSZWNvbWVuZERNQUN5Y2xlOwkJCS8vIDY2IE1hbnVmYWN0dXJlcidzIHJlY29tbWVuZGUgbXVsdGl3b3JkIERNQSB0cmFuc2ZlciBjeWNsZSB0aW1lCisJVVNIT1JUCU1pblBJT0N5Y2xlV2l0aG91dEZsb3c7CQkvLyA2NyBNaW5pbXVtIFBJTyB0cmFuc2ZlciBjeWNsZSB0aW1lIHdpdGhvdXQgZmxvdyBjb250cm9sCisJVVNIT1JUCU1pblBJT0N5bGNlV2l0aEZsb3c7CQkvLyA2OCBNaW5pbXVtIFBJTyB0cmFuc2ZlciBjeWNsZSB0aW1lIHdpdGggSU9SRFkgZmxvdyBjb250cm9sCisJVVNIT1JUCVJlc2VydmVkU3BhY2VbMjU2LTY5XTsJCS8vIDY5CisJfQlJREVOVElGWV9EQVRBLCAqUElERU5USUZZX0RBVEE7CisKKy8vIEFUQVBJIGNvbmZpZ3VyYXRpb24gYml0cwordHlwZWRlZiBzdHJ1Y3QgX0FUQVBJX0dFTkVSQUxfMAorCXsKKwlVU0hPUlQJQ21kUGFja2V0U2l6ZQkJOjI7CQkvLyBDb21tYW5kIHBhY2tldCBzaXplCisJVVNIT1JUCVJlc2VydmVkMQkJCTozOworCVVTSE9SVAlDbWREcnFUeXBlCQkJOjI7CisJVVNIT1JUCVJlbW92YWJsZQkJCToxOworCVVTSE9SVAlEZXZpY2VUeXBlCQkJOjU7CisJVVNIT1JUCVJlc2VydmVkMgkJCToxOworCVVTSE9SVAlQcm90b2NvbFR5cGUJCToyOworCX0JQVRBUElfR0VORVJBTF8wOworCisjcHJhZ21hIHBhY2sgKCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wc2lfcm95LmggYi9kcml2ZXJzL3Njc2kvcHNpX3JveS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NWI5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcHNpX3JveS5oCkBAIC0wLDAgKzEsMzMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4gUENJLTIwMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXguCisgKgorICogcHNpX3JveS5oIC0gTGludXggSG9zdCBEcml2ZXIgZm9yIFBDSS0yMDAwIEludGVsbGlDYWNoZSBTQ1NJIEFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgUGVyY2VwdGl2ZSBTb2x1dGlvbnMsIEluYy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlCisgKiBjb2RlIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBjb21tZW50IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbi4KKyAqCisgKiBUZWNobmljYWwgdXBkYXRlcyBhbmQgcHJvZHVjdCBpbmZvcm1hdGlvbiBhdDoKKyAqICBodHRwOi8vd3d3LnBzaWRpc2suY29tCisgKgorICogUGxlYXNlIHNlbmQgcXVlc3Rpb25zLCBjb21tZW50cywgYnVnIHJlcG9ydHMgdG86CisgKiAgdGVjaEBwc2lkaXNrLmNvbSBUZWNobmljYWwgU3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCVJPWV9IT1NUCisjZGVmaW5lCVJPWV9IT1NUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJUENJIHNldHVwCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJVkVORE9SX1BTSQkJCTB4MTI1NgorI2RlZmluZQlERVZJQ0VfUk9ZXzEJCTB4NTIwMQkJLyogJ1IxJyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCWNvbnRyb2xsZXIgY29uc3RhbnRzCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUFYQURBUFRFUgkJCTQJCQkvLyBJbmNyZWFzZSB0aGlzIGFuZCB0aGUgc2l6ZXMgb2YgdGhlIGFycmF5cyBiZWxvdywgaWYgeW91IG5lZWQgbW9yZS4KKyNkZWZpbmUJTUFYX0JVUwkJCQkyCisjZGVmaW5lCU1BWF9VTklUUwkJCTE2CisjZGVmaW5lCVRJTUVPVVRfQ09NTUFORAkJNDAwCQkJLy8gbnVtYmVyIG9mIG1pbGxpU2Vjb25kb3MgZm9yIGNvbW1hbmQgYnVzeSB0aW1lb3V0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJSS9PIGFkZHJlc3Mgb2Zmc2V0cwkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSVFJfTUFJTEJPWAkJCQkJCTB4MDQwCisjZGVmaW5lIFJUUl9MT0NBTF9ET09SQkVMTAkJCQkweDA2MAorI2RlZmluZSBSVFJfUENJX0RPT1JCRUxMCQkJCTB4MDY0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCQkJCSovCisvKgkJCUhvc3QgY29tbWFuZCBjb2RlcwkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUNNRF9SRUFEX0NIUwkJMHgwMQkJLyogcmVhZCBzZWN0b3JzIGFzIHNwZWNpZmllZCAoQ0hTIG1vZGUpICovCisjZGVmaW5lCUNNRF9SRUFECQkJMHgwMgkJLyogcmVhZCBzZWN0b3JzIGFzIHNwZWNpZmllZCAoUkJBIG1vZGUpICovCisjZGVmaW5lCUNNRF9SRUFEX1NHCQkJMHgwMwkJLyogcmVhZCBzZWN0b3JzIHVzaW5nIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgKi8KKyNkZWZpbmUJQ01EX1dSSVRFX0NIUwkJMHgwNAkJLyogd3JpdGUgc2VjdG9ycyBhcyBzcGVjaWZpZWQgKENIUyBtb2RlKSAqLworI2RlZmluZQlDTURfV1JJVEUJCQkweDA1CQkvKiB3cml0ZSBzZWN0b3JzIGFzIHNwZWNpZmllZCAoUkJBIG1vZGUpICovCisjZGVmaW5lCUNNRF9XUklURV9TRwkJMHgwNgkJLyogd3JpdGUgc2VjdG9ycyB1c2luZyBzY2F0dGVyL2dhdGhlciBsaXN0IChMQkEgbW9kZSkgKi8KKyNkZWZpbmUJQ01EX1JFQURfQ0hTX1NHCQkweDA3CQkvKiByZWFkIHNlY3RvcnMgdXNpbmcgc2NhdHRlci9nYXRoZXIgbGlzdCAoQ0hTIG1vZGUpICovCisjZGVmaW5lCUNNRF9XUklURV9DSFNfU0cJMHgwOAkJLyogd3JpdGUgc2VjdG9ycyB1c2luZyBzY2F0dGVyL2dhdGhlciBsaXN0IChDSFMgbW9kZSkgKi8KKyNkZWZpbmUJQ01EX1ZFUklGWV9DSFMJCTB4MDkJCS8qIHZlcmlmeSBkYXRhIG9uIHNlY3RvcnMgYXMgc3BlY2lmaWVkIChDSFMgbW9kZSkgKi8KKyNkZWZpbmUJQ01EX1ZFUklGWQkJCTB4MEEJCS8qIHZlcmlmeSBkYXRhIG9uIHNlY3RvcnMgYXMgc3BlY2lmaWVkIChSQkEgbW9kZSkgKi8KKyNkZWZpbmUJQ01EX0RBU0RfQ0RCCQkweDBCCQkvKiBwcm9jZXNzIENEQiBmb3IgYSBEQVNEIGRldmljZSAqLworI2RlZmluZQlDTURfREFTRF9DREJfU0cJCTB4MEMJCS8qIHByb2Nlc3MgQ0RCIGZvciBhIERBU0QgZGV2aWNlIHdpdGggc2NhdHRlci9nYXRoZXIgKi8KKworI2RlZmluZQlDTURfUkVBRF9BQlMJCTB4MTAJCS8qIHJlYWQgYWJzb2x1dGUgZGlzayAqLworI2RlZmluZQlDTURfV1JJVEVfQUJTCQkweDExCQkvKiB3cml0ZSBhYnNvbHV0ZSBkaXNrICovCisjZGVmaW5lCUNNRF9WRVJJRllfQUJTCQkweDEyCQkvKiB2ZXJpZnkgYWJzb2x1dGUgZGlzayAqLworI2RlZmluZQlDTURfVEVTVF9SRUFEWQkJMHgxMwkJLyogdGVzdCB1bml0IHJlYWR5IGFuZCByZXR1cm4gc3RhdHVzIGNvZGUgKi8KKyNkZWZpbmUJQ01EX0xPQ0tfRE9PUgkJMHgxNAkJLyogbG9jayBkZXZpY2UgZG9vciAqLworI2RlZmluZQlDTURfVU5MT0NLX0RPT1IJCTB4MTUJCS8qIHVubG9jayBkZXZpY2UgZG9vciAqLworI2RlZmluZQlDTURfRUpFQ1RfTUVESUEJCTB4MTYJCS8qIGVqZWN0IHRoZSBtZWRpYSAqLworI2RlZmluZQlDTURfVVBEQVRFX0NBUAkJMHgxNwkJLyogdXBkYXRlIGNhcGFjaXR5IGluZm9ybWF0aW9uICovCisjZGVmaW5lCUNNRF9URVNUX1BSSVYJCTB4MTgJCS8qIHRlc3QgYW5kIHNldHVwIHByaXZhdGUgZm9ybWF0IG1lZGlhICovCisKKworI2RlZmluZQlDTURfU0NTSV9USFJVCQkweDMwCQkvKiBTQ1NJIHBhc3MgdGhyb3VnaCBDREIgKi8KKyNkZWZpbmUJQ01EX1NDU0lfVEhSVV9TRwkweDMxCQkvKiBTQ1NJIHBhc3MgdGhyb3VnaCBDREIgd2l0aCBzY2F0dGVyL2dhdGhlciAqLworI2RlZmluZQlDTURfU0NTSV9SRVFfU0VOU0UJMHgzMgkJLyogU0NTSSBwYXNzIHRocm91Z2ggcmVxdWVzdCBzZW5zZSBhZnRlciBjaGVjayBjb25kaXRpb24gKi8KKworI2RlZmluZQlDTURfREFTRF9SQUlEX1JRCTB4MzUJCS8qIHJlcXVlc3QgREFTRCBSQUlEIGRyaXZlIGRhdGEgKi8KKyNkZWZpbmUJQ01EX0RBU0RfUkFJRF9SUTAJMHgzMQkJCS8qIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHF1ZXJ5IGZvciBSQUlEIDAgaW5mb3JtYXRhdGlvbiAqLworI2RlZmluZQlDTURfREFTRF9SQUlEX1JRMQkweDMyCQkJLyogYnl0ZSAxIHN1YmNvbW1hbmQgdG8gcXVlcnkgZm9yIFJBSUQgMSBpbmZvcm1hdGF0aW9uICovCisjZGVmaW5lCUNNRF9EQVNEX1JBSURfUlE1CTB4MzMJCQkvKiBieXRlIDEgc3ViY29tbWFuZCB0byBxdWVyeSBmb3IgUkFJRCA1IGluZm9ybWF0YXRpb24gKi8KKworI2RlZmluZQlDTURfREFTRF9TQ1NJX0lOUQkweDM2CQkvKiBkbyBEQVNEIGlucXVpcmUgYW5kIHJldHVybiBpbiBTQ1NJIGZvcm1hdCAqLworI2RlZmluZQlDTURfREFTRF9DQVAJCTB4MzcJCS8qIHJlYWQgREFTRCBjYXBhY2l0eSAqLworI2RlZmluZQlDTURfREFTRF9JTlEJCTB4MzgJCS8qIGRvIERBU0QgaW5xdWlyZSBmb3IgdHlwZSBkYXRhIGFuZCByZXR1cm4gU0NTSS9FSURFIGlucXVpcnkgKi8KKyNkZWZpbmUJQ01EX1NDU0lfSU5RCQkweDM5CQkvKiBkbyBTQ1NJIGlucXVpcmUgKi8KKyNkZWZpbmUJQ01EX1JFQURfU0VUVVAJCTB4M0EJCS8qIEdldCBzZXR1cCBzdHJ1Y3R1cmVzIGZyb20gY29udHJvbGxlciAqLworI2RlZmluZQlDTURfV1JJVEVfU0VUVVAJCTB4M0IJCS8qIFB1dCBzZXR1cCBzdHJ1Y3R1cmVzIGluIGNvbnRyb2xsZXIgYW5kIGJ1cm4gaW4gZmxhc2ggKi8KKyNkZWZpbmUJQ01EX1JFQURfQ09ORklHCQkweDNDCQkvKiBHZXQgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGFuZCBzZXR1cCBzdHJ1Y3R1cmVzICovCisjZGVmaW5lCUNNRF9XUklURV9DT05GSUcJMHgzRAkJLyogUHV0IHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbiBhbmQgc2V0dXAgc3RydWN0dXJlcyBpbiBmbGFzaCAqLworCisjZGVmaW5lCUNNRF9URVhUX0RFVklDRQkJMHgzRQkJLyogb2J0YWluIGRldmljZSB0ZXh0ICovCisjZGVmaW5lCUNNRF9URVhUX1NJR05PTgkJMHgzRgkJLyogZ2V0IHNpZ24gb24gYmFubmVyICovCisKKyNkZWZpbmUJQ01EX1FVRVVFCQkJMHg0MAkJLyogYW55IGNvbW1hbmQgYmVsb3cgdGhpcyBnZW5lcmF0ZXMgYSBxdWV1ZSB0YWcgaW50ZXJydXB0IHRvIGhvc3QqLworCisjZGVmaW5lCUNNRF9QUkVGRVRDSAkJMHg0MAkJLyogcHJlZmV0Y2ggc2VjdG9ycyBhcyBzcGVjaWZpZWQgKi8KKyNkZWZpbmUJQ01EX1RFU1RfV1JJVEUJCTB4NDEJCS8qIFRlc3QgYSBkZXZpY2UgZm9yIHdyaXRlIHByb3RlY3QgKi8KKyNkZWZpbmUJQ01EX0xBU1RfU1RBVFVTCQkweDQyCQkvKiBnZXQgbGFzdCBjb21tYW5kIHN0YXR1cyBhbmQgZXJyb3IgZGF0YSovCisjZGVmaW5lCUNNRF9BQk9SVAkJCTB4NDMJCS8qIGFib3J0IGNvbW1hbmQgYXMgc3BlY2lmaWVkICovCisjZGVmaW5lCUNNRF9FUlJPUgkJCTB4NDQJCS8qIGZldGNoIGVycm9yIGNvZGUgZnJvbSBhIHRhZ2dlZCBvcCAqLworI2RlZmluZQlDTURfRE9ORQkJCTB4NDUJCS8qIGRvbmUgd2l0aCBvcGVyYXRpb24gKi8KKyNkZWZpbmUJQ01EX0RJQUdOT1NUSUNTCQkweDQ2CQkvKiBleGVjdXRlIGNvbnRyb2xsZXIgZGlhZ25vc3RpY3MgYW5kIHdhaXQgZm9yIHJlc3VsdHMgKi8KKyNkZWZpbmUJQ01EX0ZFQVRVUkVfTU9ERQkweDQ3CQkvKiBmZWF0dXJlIG1vZGUgY29udHJvbCB3b3JkICovCisjZGVmaW5lCUNNRF9EQVNEX0lOUVVJUkUJMHg0OAkJLyogaW5xdWlyZSBhcyB0byBEQVNEIFNDU0kgZGV2aWNlICgzMiBwb3NzaWJsZSkgKi8KKyNkZWZpbmUJQ01EX0ZFQVRVUkVfUVVFUlkJMHg0OQkJLyogcXVlcnkgdGhlIGZlYXR1cmUgY29udHJvbCB3b3JkICovCisjZGVmaW5lCUNNRF9EQVNEX0VKRUNUCQkweDRBCQkvKiBFamVjdCByZW1vdmFibGUgbWVkaWEgZm9yIERBU0QgdHlwZSAqLworI2RlZmluZQlDTURfREFTRF9MT0NLCQkweDRCCQkvKiBMb2NrIHJlbW92YWJsZSBtZWRpYSBmb3IgREFTRCB0eXBlICovCisjZGVmaW5lCUNNRF9EQVNEX1RZUEUJCTB4NEMJCS8qIG9idGFpbiBEQVNEIGRldmljZSB0eXBlICovCisjZGVmaW5lCUNNRF9OVU1fREVWCQkJMHg0RAkJLyogb2J0YWluIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUJQ01EX0dFVF9QQVJNUwkJMHg0RQkJLyogb2J0YWluIGRldmljZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lCUNNRF9TUEVDSUZZCQkJMHg0RgkJLyogc3BlY2lmeSBvcGVyYXRpbmcgc3lzdGVtIGZvciBzY2F0dGVyL2dhdGhlciBvcGVyYXRpb25zICovCisKKyNkZWZpbmUJQ01EX1JBSURfR0VUX0RFVgkweDUwCQkvKiByZWFkIFJBSUQgZGV2aWNlIGdlb21ldHJ5ICovCisjZGVmaW5lIENNRF9SQUlEX1JFQUQJCTB4NTEJCS8qIHJlYWQgUkFJRCAxIHBhcmFtZXRlciBibG9jayAqLworI2RlZmluZQlDTURfUkFJRF9XUklURQkJMHg1MgkJLyogd3JpdGUgUkFJRCAxIHBhcmFtZXRlciBibG9jayAqLworI2RlZmluZQlDTURfUkFJRF9MSVRFVVAJCTB4NTMJCS8qIExpZ2h0IHVwIHRoZSBkcml2ZSBsaWdodCBmb3IgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUJQ01EX1JBSURfUkVCVUlMRAkweDU0CQkvKiBpc3N1ZSBhIFJBSUQgMSBwYWlyIHJlYnVpbGQgKi8KKyNkZWZpbmUJQ01EX1JBSURfTVVURQkJMHg1NQkJLyogbXV0ZSBSQUlEIGZhaWx1cmUgYWxhcm0gKi8KKyNkZWZpbmUJQ01EX1JBSURfRkFJTAkJMHg1NgkJLyogaW5kdWNlIGEgUkFJRCBmYWlsdXJlICovCisjZGVmaW5lCUNNRF9SQUlEX1NUQVRVUwkJMHg1NwkJLyogZ2V0IHN0YXR1cyBvZiBSQUlEIHBhaXIgKi8KKyNkZWZpbmUJQ01EX1JBSURfU1RPUAkJMHg1OAkJLyogc3RvcCBhbnkgcmVjb25zdHJ1Y3QgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgQ01EX1JBSURfU1RBUlQJCTB4NTkJCS8qIHN0YXJ0IHJlY29uc3RydWN0ICovCisjZGVmaW5lCUNNRF9SQUlEMF9SRUFECQkweDVBCQkvKiByZWFkIFJBSUQgMCBwYXJhbWV0ZXIgYmxvY2sgKi8KKyNkZWZpbmUJQ01EX1JBSUQwX1dSSVRFCQkweDVCCQkvKiB3cml0ZSBSQUlEIDAgcGFyYW1ldGVyIGJsb2NrICovCisjZGVmaW5lCUNNRF9SQUlENV9SRUFECQkweDVDCQkvKiByZWFkIFJBSUQgNSBwYXJhbWV0ZXIgYmxvY2sgKi8KKyNkZWZpbmUJQ01EX1JBSUQ1X1dSSVRFCQkweDVECQkvKiB3cml0ZSBSQUlEIDUgcGFyYW1ldGVyIGJsb2NrICovCisKKyNkZWZpbmUJQ01EX0VSQVNFX1RBQkxFUwkweDVGCQkvKiBlcmFzZSBwYXJ0aXRpb24gdGFibGUgYW5kIFJBSUQgc2lnbmF0dXR1cmVzICovCisKKyNkZWZpbmUJQ01EX1NDU0lfR0VUCQkweDYwCQkvKiBnZXQgU0NTSSBwYXNzIHRocm91Z2ggZGV2aWNlcyAqLworI2RlZmluZQlDTURfU0NTSV9USU1FT1VUCTB4NjEJCS8qIHNldCBTQ1NJIHBhc3MgdGhyb3VnaCB0aW1lb3V0ICovCisjZGVmaW5lCUNNRF9TQ1NJX0VSUk9SCQkweDYyCQkvKiBnZXQgU0NTSSBwYXNzIHRocm91Z2ggcmVxdWVzdCBzZW5zZSBsZW5ndGggYW5kIHJlc2lkdWFsIGRhdGEgY291bnQgKi8KKyNkZWZpbmUJQ01EX0dFVF9TUEFSTVMJCTB4NjMJCS8qIGdldCBTQ1NJIGJ1cyBhbmQgdXNlciBwYXJtcyAqLworI2RlZmluZQlDTURfU0NTSV9BQk9SVAkJMHg2NAkJLyogYWJvcnQgYnkgc2V0dGluZyB0aW1lLW91dCB0byB6ZXJvICovCisKKyNkZWZpbmUJQ01EX0NISVJQX0NISVJQCQkweDc3CQkvKiBtYWtlIGEgY2hpcnAgY2hpcnAgc291bmQgKi8KKyNkZWZpbmUJQ01EX0dFVF9MQVNUX0RPTkUJMHg3OAkJLyogZ2V0IHRhZyBvZiBsYXN0IGRvbmUgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJQ01EX0dFVF9GRUFUVVJFUwkweDc5CQkvKiBnZXQgZmVhdHVyZSBjb2RlIGFuZCBFU04gKi8KKyNkZWZpbmUgQ01EX0NMRUFSX0NBQ0hFCQkweDdBCQkvKiBDbGVhciBjYWNoZSBvbiBzcGVjaWZpZWQgZGV2aWNlICovCisjZGVmaW5lCUNNRF9CSU9TX1RFU1QJCTB4N0IJCS8qIFRlc3Qgd2hldGhlciBvciBub3QgdG8gbG9hZCBCSU9TICovCisjZGVmaW5lCUNNRF9XQUlUX0ZMVVNICQkweDdDCQkvKiB3YWl0IGZvciBjYWNoZSBmbHVzaGVkIGFuZCBpbnZhbGlkYXRlIHJlYWQgY2FjaGUgKi8KKyNkZWZpbmUJQ01EX1JFU0VUX0JVUwkJMHg3RAkJLyogcmVzZXQgdGhlIFNDU0kgYnVzICovCisjZGVmaW5lCUNNRF9TVEFSVFVQX1FSWQkJMHg3RQkJLyogc3RhcnR1cCBpbiBwcm9ncmVzcyBxdWVyeSAqLworI2RlZmluZQlDTURfUkVTRVQJCQkweDdGCQkvKiByZXNldCB0aGUgY29udHJvbGxlciAqLworCisjZGVmaW5lCUNNRF9SRVNUQVJUX1JFU0VUCTB4ODAJCS8qIHJlbG9hZCBhbmQgcmVzdGFydCB0aGUgY29udHJvbGxlciBhdCBhbnkgcmVzZXQgaXNzdWVkICovCisjZGVmaW5lCUNNRF9TT0ZUX1JFU0VUCQkweDgxCQkvKiBkbyBhIHNvZnQgcmVzZXQgTk9XISAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkJCQkqLworLyoJCQkJSG9zdCByZXR1cm4gZXJyb3JzCQkJCSovCisvKgkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlFUlIwOF9UQUdHRUQJCTB4ODAJCS8qIGRvb3JiZWxsIGVycm9yIG9yZWQgd2l0aCB0YWcgKi8KKworI2RlZmluZQlFUlIxNl9OT05FCQkJMHgwMDAwCQkvKiBubyBlcnJvcnMgKi8KKyNkZWZpbmUJRVJSMTZfU0NfQ09ORF9NRVQJMHgwMDA0CQkvKiBTQ1NJIHN0YXR1cyAtIENvbmRpdGlvbiBNZXQgKi8KKyNkZWZpbmUJRVJSMTZfQ01ECQkJMHgwMTAxCQkvKiBjb21tYW5kIGVycm9yICovCisjZGVmaW5lCUVSUjE2X1NDX0NIRUNLX0NPTkQJMHgwMDAyCQkvKiBTQ1NJIHN0YXR1cyAtIENoZWNrIENvbmRpdGlvbiAqLworI2RlZmluZQlFUlIxNl9DTURfTk9UCQkweDAyMDEJCS8qIGNvbW1hbmQgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBFUlIxNl9OT19ERVZJQ0UgICAgIDB4MDMwMQkJLyogaW52YWxpZCBkZXZpY2Ugc2VsZWN0aW9uICovCisjZGVmaW5lCUVSUjE2X1NFQ1RPUgkJMHgwMjAyCQkvKiBiYWQgc2VjdG9yICovCisjZGVmaW5lCUVSUjE2X1BST1RFQ1QJCTB4MDMwMwkJLyogd3JpdGUgcHJvdGVjdGVkICovCisjZGVmaW5lCUVSUjE2X05PU0VDVE9SCQkweDA0MDQJCS8qIHNlY3RvciBub3QgZm91bmQgKi8KKyNkZWZpbmUJRVJSMTZfTUVESUEJCQkweDBDMEMJCS8qIGludmFsaWQgbWVkaWEgKi8KKyNkZWZpbmUJRVJSMTZfQ09OVFJPTAkJMHgyMDIwCQkvKiBjb250cm9sbGVyIGVycm9yICovCisjZGVmaW5lCUVSUjE2X0NPTlRST0xfRE1BCTB4MjEyMAkJLyogY29udHJvbGxlciBETUEgZW5naW5lIGVycm9yICovCisjZGVmaW5lCUVSUjE2X05PX0FMQVJNCQkweDIyMjAJCS8qIGFsYXJtIGlzIG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUJRVJSMTZfT1BfQlVTWQkJMHgyMzIwCQkvKiBvcGVyYXRpb24gYnVzeSAqLworI2RlZmluZQlFUlIxNl9TRUVLCQkJMHg0MDQwCQkvKiBzZWVrIGZhaWx1cmUgKi8KKyNkZWZpbmUJRVJSMTZfREVWSUNFX0ZBSUwJMHg0MTQwCQkvKiBkZXZpY2UgaGFzIGZhaWxlZCAqLworI2RlZmluZSBFUlIxNl9USU1FT1VUCQkweDgwODAJCS8qIHRpbWVvdXQgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMTZfREVWX05PVF9SRUFEWQkweEFBQUEJCS8qIGRyaXZlIG5vdCByZWFkeSAqLworI2RlZmluZQlFUlIxNl9VTkRFRklORUQJCTB4QkJCQgkJLyogdW5kZWZpbmVkIGVycm9yICovCisjZGVmaW5lCUVSUjE2X1dSSVRFX0ZBVUxUCTB4Q0NDQwkJLyogd3JpdGUgZmF1bHQgKi8KKyNkZWZpbmUgRVJSMTZfSU5WQUxJRF9ERVYJMHg0MDAxCQkvKiBpbnZhbGlkIGRldmljZSBhY2Nlc3MgKi8KKyNkZWZpbmUJRVJSMTZfREVWSUNFX0JVU1kJMHg0MDAyCQkvKiBkZXZpY2UgaXMgYnVzeSAqLworI2RlZmluZQlFUlIxNl9NRU1PUlkJCTB4NDAwMwkJLyogZGV2aWNlIHBhc3MgdGhydSByZXF1aXJlcyB0b28gbXVjaCBtZW1vcnkgKi8KKyNkZWZpbmUJRVJSMTZfTk9fRkVBVFVSRQkweDQwRkEJCS8qIGZlYXR1cmUgbm8gaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUJRVJSMTZfTk9UQUcJCQkweDQwRkQJCS8qIG5vIHRhZyBzcGFjZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRVJSMTZfTk9UX1JFQURZCQkweDQwRkUJCS8qIGNvbnRyb2xsZXIgbm90IHJlYWR5IGVycm9yICovCisjZGVmaW5lCUVSUjE2X1NFVFVQX0ZMQVNICTB4NTA1MAkJLyogZXJyb3Igd2hlbiB3cml0aW5nIHNldHVwIHRvIGZsYXNoIG1lbW9yeSAqLworI2RlZmluZQlFUlIxNl9TRVRVUF9TSVpFCTB4NTA1MQkJLyogc2V0dXAgYmxvY2sgc2l6ZSBlcnJvciAqLworI2RlZmluZQlFUlIxNl9TRU5TRQkJCTB4RkZGRgkJLyogc2Vuc2Ugb3BlcmVyYXRpb24gZmFpbGVkICovCisjZGVmaW5lCUVSUjE2X1NDX0JVU1kJCTB4MDAwOAkJLyogU0NTSSBzdGF0dXMgLSBCdXN5ICovCisjZGVmaW5lCUVSUjE2X1NDX1JFU19DT05GTAkweDAwMTgJCS8qIFNDU0kgc3RhdHVzIC0gUmVzZXJ2YXRpb24gQ29uZmxpY3QgKi8KKyNkZWZpbmUJRVJSMTZfU0NfQ01EX1RFUk0JMHgwMDIyCQkvKiBTQ1NJIHN0YXR1cyAtIENvbW1hbmQgVGVybWluYXRlZCAqLworI2RlZmluZQlFUlIxNl9TQ19PVEhFUgkJMHgwMEZGCQkvKiBTQ1NJIHN0YXR1cyAtIG5vdCByZWNvZ25pemVkIChhbnkgdmFsdWUgbWFza2VkKSAqLworI2RlZmluZQlFUlIxNl9NRURJQV9DSEFOR0VECTB4ODAwMQkJLyogZGV2aWNlcyBtZWRpYSBoYXMgYmVlbiBjaGFuZ2VkICovCisKKyNkZWZpbmUJRVJSMzJfTk9ORQkJCTB4MDAwMDAwMDAJLyogbm8gZXJyb3JzICovCisjZGVmaW5lCUVSUjMyX1NDX0NPTkRfTUVUCTB4MDAwMDAwMDQJLyogU0NTSSBzdGF0dXMgLSBDb25kaXRpb24gTWV0ICovCisjZGVmaW5lCUVSUjMyX0NNRAkJCTB4MDAwMTAxMDEJLyogY29tbWFuZCBlcnJvciAqLworI2RlZmluZQlFUlIzMl9TQ19DSEVDS19DT05ECTB4MDAwMjAwMDIJLyogU0NTSSBzdGF0dXMgLSBDaGVjayBDb25kaXRpb24gKi8KKyNkZWZpbmUJRVJSMzJfQ01EX05PVAkJMHgwMDAzMDIwMQkvKiBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRVJSMzJfTk9fREVWSUNFICAgICAweDAwMDQwMzAxCS8qIGludmFsaWQgZGV2aWNlIHNlbGVjdGlvbiAqLworI2RlZmluZQlFUlIzMl9TRUNUT1IJCTB4MDAwNTAyMDIJLyogYmFkIHNlY3RvciAqLworI2RlZmluZQlFUlIzMl9QUk9URUNUCQkweDAwMDYwMzAzCS8qIHdyaXRlIHByb3RlY3RlZCAqLworI2RlZmluZQlFUlIzMl9OT1NFQ1RPUgkJMHgwMDA3MDQwNAkvKiBzZWN0b3Igbm90IGZvdW5kICovCisjZGVmaW5lCUVSUjMyX01FRElBCQkJMHgwMDA4MEMwQwkvKiBpbnZhbGlkIG1lZGlhICovCisjZGVmaW5lCUVSUjMyX0NPTlRST0wJCTB4MDAwOTIwMjAJLyogY29udHJvbGxlciBlcnJvciAqLworI2RlZmluZQlFUlIzMl9DT05UUk9MX0RNQQkweDAwMEEyMTIwCS8qIENvbnRyb2xsZXIgRE1BIGVycm9yICovCisjZGVmaW5lCUVSUjMyX05PX0FMQVJNCQkweDAwMEIyMjIwIAkvKiBhbGFybSBpcyBub3QgYWN0aXZlICovCisjZGVmaW5lCUVSUjMyX09QX0JVU1kJCTB4MDAwQzIzMjAJLyogb3BlcmF0aW9uIGJ1c3kgKi8KKyNkZWZpbmUJRVJSMzJfU0VFSwkJCTB4MDAwRDQwNDAJLyogc2VlayBmYWlsdXJlICovCisjZGVmaW5lCUVSUjMyX0RFVklDRV9GQUlMCTB4MDAwRTQxNDAJLyogZGV2aWNlIGhhcyBmYWlsZWQgKi8KKyNkZWZpbmUgRVJSMzJfVElNRU9VVAkJMHgwMDBGODA4MAkvKiB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lCUVSUjMyX0RFVl9OT1RfUkVBRFkJMHgwMDEwQUFBQQkvKiBkcml2ZSBub3QgcmVhZHkgKi8KKyNkZWZpbmUJRVJSMzJfVU5ERUZJTkVECQkweDAwMTFCQkJCCS8qIHVuZGVmaW5lZCBlcnJvciAqLworI2RlZmluZQlFUlIzMl9XUklURV9GQVVMVAkweDAwMTJDQ0NDCS8qIHdyaXRlIGZhdWx0ICovCisjZGVmaW5lIEVSUjMyX0lOVkFMSURfREVWCTB4MDAxMzQwMDEJLyogaW52YWxpZCBkZXZpY2UgYWNjZXNzICovCisjZGVmaW5lCUVSUjMyX0RFVklDRV9CVVNZCTB4MDAxNDQwMDIJLyogZGV2aWNlIGlzIGJ1c3kgKi8KKyNkZWZpbmUJRVJSMzJfTUVNT1JZCQkweDAwMTU0MDAzCS8qIGRldmljZSBwYXNzIHRocnUgcmVxdWlyZXMgdG9vIG11Y2ggbWVtb3J5ICovCisjZGVmaW5lCUVSUjMyX05PX0ZFQVRVUkUJMHgwMDE2NDBGQQkvKiBmZWF0dXJlIG5vIGltcGxlbWVudGVkICovCisjZGVmaW5lCUVSUjMyX05PVEFHCQkJMHgwMDE3NDBGRAkvKiBubyB0YWcgc3BhY2UgYXZhaWxhYmxlICovCisjZGVmaW5lCUVSUjMyX05PVF9SRUFEWQkJMHgwMDE4NDBGRQkvKiBjb250cm9sbGVyIG5vdCByZWFkeSBlcnJvciAqLworI2RlZmluZQlFUlIzMl9TRVRVUF9GTEFTSAkweDAwMTk1MDUwCS8qIGVycm9yIHdoZW4gd3JpdGluZyBzZXR1cCB0byBmbGFzaCBtZW1vcnkgKi8KKyNkZWZpbmUJRVJSMzJfU0VUVVBfU0laRQkweDAwMUE1MDUxCS8qIHNldHVwIGJsb2NrIHNpemUgZXJyb3IgKi8KKyNkZWZpbmUJRVJSMzJfU0VOU0UJCQkweDAwMUJGRkZGCS8qIHNlbnNlIG9wZXJlcmF0aW9uIGZhaWxlZCAqLworI2RlZmluZQlFUlIzMl9TQ19CVVNZCQkweDAwMUMwMDA4CS8qIFNDU0kgc3RhdHVzIC0gQnVzeSAqLworI2RlZmluZQlFUlIzMl9TQ19SRVNfQ09ORkwJMHgwMDFEMDAxOAkvKiBTQ1NJIHN0YXR1cyAtIFJlc2VydmF0aW9uIENvbmZsaWN0ICovCisjZGVmaW5lCUVSUjMyX1NDX0NNRF9URVJNCTB4MDAxRTAwMjIJLyogU0NTSSBzdGF0dXMgLSBDb21tYW5kIFRlcm1pbmF0ZWQgKi8KKyNkZWZpbmUJRVJSMzJfU0NfT1RIRVIJCTB4MDAxRjAwRkYJLyogU0NTSSBzdGF0dXMgLSBub3QgcmVjb2duaXplZCAoYW55IHZhbHVlIG1hc2tlZCkgKi8KKyNkZWZpbmUJRVJSMzJfTUVESUFfQ0hBTkdFRAkweDAwMjA4MDAxCS8qIGRldmljZXMgbWVkaWEgaGFzIGJlZW4gY2hhbmdlZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkJCQkqLworLyoJSG9zdCBPcGVyYXRpbmcgU3lzdGVtIHNwZWNpZmljYXRpb24gY29kZXMJKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVNQRUNfSU5URVJSVVBUCQkweDgwCQkvKiBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGhvc3QgaW50ZXJydXB0ICovCisjZGVmaW5lCVNQRUNfQkFDS1dBUkRfU0cJMHg0MAkJLyogc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBzY2F0dGVyL2dhdGhlciBpdGVtcyByZXZlcnNlZCAqLworI2RlZmluZQlTUEVDX0RPU19CTE9DSwkJMHgwMQkJLyogRE9TIERBU0QgYmxvY2tpbmcgb24gcGFzcyB0aHJvdWdoICovCisjZGVmaW5lCVNQRUNfT1MyX1YzCQkJMHgwMgkJLyogT1MvMiBXYXJwICovCisjZGVmaW5lCVNQQ0VfU0NPXzMyNDIJCTB4MDQJCS8qIFNDTyAzLjQuMi4yICovCisjZGVmaW5lCVNQRUNfUU5YXzRYCQkJMHgwNQkJLyogUU5YIDQuWFggKi8KKyNkZWZpbmUJU1BFQ19OT1ZFTExfTldQQQkweDA4CQkvKiBOb3ZlbGwgTldQQSBzY2F0dGVyL2dhdGhlciBzdXBwb3J0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCQkJCSovCisvKglJbnF1aXJlIHN0cnVjdHVyZXMJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmCXN0cnVjdAlfQ05UX1NDU0lfSU5RCisJeworCVVDSEFSCWRldnQ7CQkJCQkJLyogMDA6IGRldmljZSB0eXBlICovCisJVUNIQVIJZGV2dG07CQkJCQkJLyogMDE6IGRldmljZSB0eXBlIG1vZGlmaWVyICovCisJVUNIQVIJc3ZlcnM7CQkJCQkJLyogMDI6IFNDU0kgdmVyc2lvbiAqLworCVVDSEFSCXJmbXQ7CQkJCQkJLyogMDM6IHJlc3BvbnNlIGRhdGEgZm9ybWF0ICovCisJVUNIQVIJYWRsZW47CQkJCQkJLyogMDQ6IGFkZGl0aW9uYWwgbGVuZ3RoIG9mIGRhdGEgKi8KKwlVQ0hBUglyZXMxOwkJCQkJCS8qIDA1OiAqLworCVVDSEFSCXJlczI7CQkJCQkJLyogMDY6ICovCisJVUNIQVIJZm5jczsJCQkJCQkvKiAwNzogZnVuY3Rpb25hbCBjYXBhYmlsaXRpZXMgKi8KKwlVQ0hBUgl2aWRbOF07CQkJCQkJLyogMDg6IHZlbmRvciBJRCAqLworCVVDSEFSCXBpZFsxNl07CQkJCQkvKiAxMDogcHJvZHVjdCBJRCAqLworCVVDSEFSCXJldls0XTsJCQkJCQkvKiAyMDogcHJvZHVjdCByZXZpc2lvbiAqLworCX0JQ05UX1NDU0lfSU5ROworCit0eXBlZGVmCXN0cnVjdAlfQ05UX0lERV9JTlEKKwl7CisJVVNIT1JUCUdlbmVyYWxDb25maWd1cmF0aW9uOwkJLyogMDAgKi8KKwlVU0hPUlQJTnVtYmVyT2ZDeWxpbmRlcnM7CQkJLyogMDIgKi8KKwlVU0hPUlQJUmVzZXJ2ZWQxOwkJCQkJLyogMDQgKi8KKwlVU0hPUlQJTnVtYmVyT2ZIZWFkczsJCQkJLyogMDYgKi8KKwlVU0hPUlQJVW5mb3JtYXR0ZWRCeXRlc1BlclRyYWNrOwkvKiAwOCAqLworCVVTSE9SVAlVbmZvcm1hdHRlZEJ5dGVzUGVyU2VjdG9yOwkvKiAwQSAqLworCVVTSE9SVAlTZWN0b3JzUGVyVHJhY2s7CQkJLyogMEMgKi8KKwlVU0hPUlQJVmVuZG9yVW5pcXVlMVszXTsJCQkvKiAwRSAqLworCVVTSE9SVAlTZXJpYWxOdW1iZXJbMTBdOwkJCS8qIDE0ICovCisJVVNIT1JUCUJ1ZmZlclR5cGU7CQkJCQkvKiAyOCAqLworCVVTSE9SVAlCdWZmZXJTZWN0b3JTaXplOwkJCS8qIDJBICovCisJVVNIT1JUCU51bWJlck9mRWNjQnl0ZXM7CQkJLyogMkMgKi8KKwlVU0hPUlQJRmlybXdhcmVSZXZpc2lvbls0XTsJCS8qIDJFICovCisJVVNIT1JUCU1vZGVsTnVtYmVyWzIwXTsJCQkvKiAzNiAqLworCVVDSEFSCU1heGltdW1CbG9ja1RyYW5zZmVyOwkJLyogNUUgKi8KKwlVQ0hBUglWZW5kb3JVbmlxdWUyOwkJCQkvKiA1RiAqLworCVVTSE9SVAlEb3VibGVXb3JkSW87CQkJCS8qIDYwICovCisJVVNIT1JUCUNhcGFiaWxpdGllczsJCQkJLyogNjIgKi8KKwlVU0hPUlQJUmVzZXJ2ZWQyOwkJCQkJLyogNjQgKi8KKwlVQ0hBUglWZW5kb3JVbmlxdWUzOwkJCQkvKiA2NiAqLworCVVDSEFSCVBpb0N5Y2xlVGltaW5nTW9kZTsJCQkvKiA2NyAqLworCVVDSEFSCVZlbmRvclVuaXF1ZTQ7CQkJCS8qIDY4ICovCisJVUNIQVIJRG1hQ3ljbGVUaW1pbmdNb2RlOwkJCS8qIDY5ICovCisJVVNIT1JUCVRyYW5zbGF0aW9uRmllbGRzVmFsaWQ7CQkvKiA2QSAqLworCVVTSE9SVAlOdW1iZXJPZkN1cnJlbnRDeWxpbmRlcnM7CS8qIDZDICovCisJVVNIT1JUCU51bWJlck9mQ3VycmVudEhlYWRzOwkJLyogNkUgKi8KKwlVU0hPUlQJQ3VycmVudFNlY3RvcnNQZXJUcmFjazsJCS8qIDcwICovCisJVUxPTkcJQ3VycmVudFNlY3RvckNhcGFjaXR5OwkJLyogNzIgKi8KKwl9CUNOVF9JREVfSU5ROworCit0eXBlZGVmIHN0cnVjdAlfREFTRF9JTlFVSVJFCisJeworCVVMT05HCXR5cGU7CQkJCQkJLyogMCA9IFNDU0ksIDEgPSBJREUgKi8KKwl1bmlvbgorCQl7CisJCUNOVF9TQ1NJX0lOUQlzY3NpOwkJCS8qIFNDU0kgaW5xdWlyZSBkYXRhICovCisJCUNOVF9JREVfSU5RCQlpZGU7CQkJLyogSURFIGlucXVpcmUgZGF0YSAqLworCQl9CWlucTsKKwl9CURBU0RfSU5RVUlSRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qCURldmljZSBDb2RlcwkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERFVkNfREFTRAkJCTB4MDAJCS8qIERpcmVjdC1hY2Nlc3MgU3RvcmFnZSBEZXZpY2UgKi8KKyNkZWZpbmUgREVWQ19TRVFBQ0VTUwkJMHgwMQkJLyogU2VxdWVudGlhbC1hY2Nlc3MgZGV2aWNlICovCisjZGVmaW5lIERFVkNfUFJJTlRFUgkJMHgwMgkJLyogUHJpbnRlciBkZXZpY2UgKi8KKyNkZWZpbmUgREVWQ19QUk9DRVNTT1IJCTB4MDMJCS8qIFByb2Nlc3NvciBkZXZpY2UgKi8KKyNkZWZpbmUgREVWQ19XUklURU9OQ0UJCTB4MDQJCS8qIFdyaXRlLW9uY2UgZGV2aWNlICovCisjZGVmaW5lIERFVkNfQ0RST00JCQkweDA1CQkvKiBDRC1ST00gZGV2aWNlICovCisjZGVmaW5lIERFVkNfU0NBTk5FUgkJMHgwNgkJLyogU2Nhbm5lciBkZXZpY2UgKi8KKyNkZWZpbmUgREVWQ19PUFRJQ0FMCQkweDA3CQkvKiBPcHRpY2FsIG1lbW9yeSBkZXZpY2UgKi8KKyNkZWZpbmUgREVWQ19NRURDSEdSCQkweDA4CQkvKiBNZWRpdW0gY2hhbmdlciBkZXZpY2UgKi8KKyNkZWZpbmUJREVWQ19EQVNEX1JFTU9WQUJMRQkweDgwCQkvKiBEaXJlY3QtYWNjZXNzIHN0b3JhZ2UgZGV2aWNlLCBSZW1vdmFibGUgKi8KKyNkZWZpbmUJREVWQ19OT05FCQkJMHhGRgkJLyogbm8gZGV2aWNlICovCisKKy8vIFNDU0kgY29udHJvbHMgZm9yIFJBSUQKKyNkZWZpbmUJU0NfTVlfUkFJRAkJCTB4QkYJCQkvLyBvdXIgc3BlY2lhbCBDREIgY29tbWFuZCBieXRlIGZvciBXaW45NS4uLiBpbnRlcmZhY2UKKyNkZWZpbmUJTVlfU0NTSV9RVUVSWTAJCTB4MzEJCQkvLyBieXRlIDEgc3ViY29tbWFuZCB0byBxdWVyeSBkcml2ZXIgZm9yIFJBSUQgMCBpbmZvcm1hdGF0aW9uCisjZGVmaW5lCU1ZX1NDU0lfUVVFUlkxCQkweDMyCQkJLy8gYnl0ZSAxIHN1YmNvbW1hbmQgdG8gcXVlcnkgZHJpdmVyIGZvciBSQUlEIDEgaW5mb3JtYXRhdGlvbgorI2RlZmluZQlNWV9TQ1NJX1FVRVJZNQkJMHgzMwkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIHRvIHF1ZXJ5IGRyaXZlciBmb3IgUkFJRCA1IGluZm9ybWF0YXRpb24KKyNkZWZpbmUJTVlfU0NTSV9SRUJVSUxECQkweDQwCQkJLy8gYnl0ZSAxIHN1YmNvbW1hbmQgdG8gcmVjb25zdHJ1Y3QgYSBtaXJyb3JlZCBwYWlyCisjZGVmaW5lIE1ZX1NDU0lfREVNT0ZBSUwJMHg1NAkJCS8vIGJ5dGUgMSBzdWJjb21tYW5kIGZvciBSQUlEIGZhaWx1cmUgZGVtb25zdHJhdGlvbgorI2RlZmluZQlNWV9TQ1NJX0FMQVJNTVVURQkweDYwCQkJLy8gYnl0ZSAxIHN1YmNvbW1hbmQgdG8gbXV0ZSBhbnkgYWxhcm0gY3VycmVudGx5IG9uCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbDEwNDBfZncuaCBiL2RyaXZlcnMvc2NzaS9xbDEwNDBfZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ4ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsMTA0MF9mdy5oCkBAIC0wLDAgKzEsMjA5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQkJCQkJKgorICogCSAgICAgICAgLS0tIElTUDEwNDAgSW5pdGlhdG9yL1RhcmdldCBGaXJtd2FyZSAtLS0gICAgICAgICAgICAgICAqCisgKgkJCSAgICAzMiBMVU4gU3VwcG9ydAkJCQkqCisgKgkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiA3LjY1LjAwICgxNDoxNyBKdWwgMjAsIDE5OTkpCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlybXdhcmVfdmVyc2lvbltdID0gezcsNjUsMH07CisKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjcuNjUuMCIKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDEwMDAgOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsgCisJMHgwMDc4LCAweDEwM2EsIDB4MDAwMCwgMHg0MDU3LCAweDAwMDAsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsCisJMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMSwgMHgzOTM5LCAweDM1MjAsIDB4NTE0YywgMHg0ZjQ3LCAweDQ5NDMsCisJMHgyMDQzLCAweDRmNTIsIDB4NTA0ZiwgMHg1MjQxLCAweDU0NDksIDB4NGY0ZSwgMHgyMDQ5LCAweDUzNTAsCisJMHgzMTMwLCAweDMyMzAsIDB4MjA0OSwgMHgyZjU0LCAweDIwNDYsIDB4Njk3MiwgMHg2ZDc3LCAweDYxNzIsCisJMHg2NTIwLCAweDIwNTYsIDB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMCwgMHgzNzJlLCAweDM2MzUsCisJMHgyMDIwLCAweDIwNDMsIDB4NzU3MywgMHg3NDZmLCAweDZkNjUsIDB4NzIyMCwgMHg0ZTZmLCAweDJlMjAsCisJMHgzMDMwLCAweDIwNTAsIDB4NzI2ZiwgMHg2NDc1LCAweDYzNzQsIDB4MjA0ZSwgMHg2ZjJlLCAweDIwMjAsCisJMHgzMDMxLCAweDIwMjQsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwNDgsCisJMHgxMDQ1LCAweDAwMzgsIDB4MTA0YiwgMHgwMDc4LCAweDEwNDcsIDB4MDAyOCwgMHgxMDRiLCAweDIwYjksCisJMHgxMjEyLCAweDAwNzgsIDB4MTA0ZCwgMHgyMGI5LCAweDIyMjIsIDB4MjBjMSwgMHgwMDA4LCAweDIwNzEsCisJMHgwMDEwLCAweDcwYzMsIDB4MDAwNCwgMHgyMGM5LCAweDc3ZmYsIDB4MjA4OSwgMHgxMTg2LCAweDcwYzcsCisJMHg0OTUzLCAweDcwY2IsIDB4NTAyMCwgMHg3MGNmLCAweDIwMjAsIDB4NzBkMywgMHgwMDA3LCAweDNmMDAsCisJMHg3MGQ2LCAweDIwYzEsIDB4MDAwOCwgMHgyMDE5LCAweDAwMDAsIDB4MjAwOSwgMHhmZWZmLCAweDIxMDAsCisJMHgyMDBiLCAweGE1YTUsIDB4YTFlYywgMHg3ZmZmLCAweDJkNjQsIDB4MjA2YiwgMHgwYTBhLCAweGFkZGMsCisJMHgzZmZmLCAweDJiNTQsIDB4MjA1YiwgMHg1MDUwLCAweDIxMTQsIDB4YTI4NiwgMHhhNWE1LCAweDAwNDAsCisJMHgxMGJmLCAweGEzODYsIDB4MDAwZiwgMHgwMDQwLCAweDEwODUsIDB4MmM2YSwgMHgyYTVhLCAweDIwYzEsCisJMHgwMDAwLCAweDIwMTksIDB4MDAwZiwgMHgwMDc4LCAweDEwNjUsIDB4MmM2YSwgMHgyYTVhLCAweDIwYzEsCisJMHgwMDA4LCAweDIwMDksIDB4N2ZmZiwgMHgyMTQ4LCAweDI5NDQsIDB4MjA0YiwgMHgwYTBhLCAweGE5YmMsCisJMHgzZmZmLCAweDI3MzQsIDB4MjAzYiwgMHg1MDUwLCAweDIxMTQsIDB4YTI4NiwgMHgwYTBhLCAweDAwNDAsCisJMHgxMGE5LCAweDI4NGEsIDB4MjYzYSwgMHgyMGMxLCAweDAwMDQsIDB4MjAwOSwgMHgzZmZmLCAweDIxMzQsCisJMHgyMDBiLCAweDUwNTAsIDB4MjExNCwgMHhhMjg2LCAweDUwNTAsIDB4MDA0MCwgMHgxMGFhLCAweDAwNzgsCisJMHgxMThlLCAweDI4NGEsIDB4MjYzYSwgMHg5OGMwLCAweGExODgsIDB4MTAwMCwgMHgyMTJjLCAweDIwMGIsCisJMHhhNWE1LCAweDIxMTQsIDB4YTI4NiwgMHhhNWE1LCAweDAwNDAsIDB4MTBiYywgMHgyNTBhLCAweGExOGEsCisJMHgxMDAwLCAweDk4YzEsIDB4MDA3OCwgMHgxMGMxLCAweDI1MGEsIDB4MDA3OCwgMHgxMGMxLCAweDJjNmEsCisJMHgyYTVhLCAweDIxMzAsIDB4YTE4YSwgMHgwMDQwLCAweDIxMjgsIDB4YTFhMiwgMHg1MTAwLCAweDg0MjQsCisJMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4YTE5MiwgMHg3ODAwLCAweDIwMDksCisJMHgwMDAwLCAweDIwMDEsIDB4MDAzMSwgMHgxMDc4LCAweDFjYmEsIDB4MjIxOCwgMHgyMDc5LCAweDUxMDAsCisJMHgyZmEwLCAweDI0MDgsIDB4MjAxMSwgMHgwMDAwLCAweDIwYTksIDB4MDA0MCwgMHg0MmE0LCAweDgxMDksCisJMHgwMGMwLCAweDEwZGMsIDB4N2VmMiwgMHg4NTI4LCAweDdkZTYsIDB4N2NlYSwgMHg3YmVlLCAweDc4ODMsCisJMHgwMDAwLCAweDIwMzEsIDB4MDAzMCwgMHg3OGNmLCAweDAxMDEsIDB4NzgwYiwgMHgwMDAyLCAweDc4MGYsCisJMHgwMDAyLCAweDc4NGYsIDB4MDAwMywgMHgyMDY5LCAweDUxNDAsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsCisJMHhhMDgyLCAweDAwMDUsIDB4MDA0OCwgMHgxMTA0LCAweDAwMzgsIDB4MTEwMCwgMHgwMDc4LCAweDExMDgsCisJMHg2ODFiLCAweDAwM2MsIDB4MDA3OCwgMHgxMTBhLCAweDAwYTgsIDB4MTEwOCwgMHg2ODFiLCAweDAwM2MsCisJMHg2ODFiLCAweDAwMjgsIDB4NjgwNywgMHgwMDA3LCAweDY4MGIsIDB4MDBmYSwgMHg2ODBmLCAweDAwMDgsCisJMHg2ODEzLCAweDAwMDUsIDB4NjgyMywgMHgwMDAwLCAweDY4MjcsIDB4MDAwNiwgMHg2ODE3LCAweDAwMDgsCisJMHg2ODJiLCAweDAwMDAsIDB4NjgxZiwgMHgwMDE5LCAweDIwNjksIDB4NTM4MCwgMHgyMDExLCAweDAwMjAsCisJMHgyMDA5LCAweDAwMTAsIDB4NjgwYiwgMHgwODBjLCAweDY4MGYsIDB4MDAxOSwgMHg2ODAzLCAweGZkMDAsCisJMHg2ODA3LCAweDAwMTgsIDB4NmExYSwgMHgyZDAwLCAweGEwZTgsIDB4MDAwOCwgMHhhMjkwLCAweDAwMDQsCisJMHg4MTA5LCAweDAwYzAsIDB4MTEyMiwgMHgyMDY5LCAweDU0MDAsIDB4MjAwOSwgMHgwMDAyLCAweDIwYTksCisJMHgwMTAwLCAweDY4MzcsIDB4MDAwMCwgMHg2ODBiLCAweDAwNDAsIDB4N2JmMCwgMHhhMzg2LCAweGZlZmYsCisJMHgwMGMwLCAweDExNDgsIDB4NjgxNywgMHgwMTAwLCAweDY4MWYsIDB4MDA2NCwgMHgwMDc4LCAweDExNGMsCisJMHg2ODE3LCAweDAwNjQsIDB4NjgxZiwgMHgwMDAyLCAweGFkZTgsIDB4MDAxMCwgMHgwMDcwLCAweDExNTIsCisJMHgwMDc4LCAweDExMzksIDB4ODEwOSwgMHgwMGMwLCAweDExMzcsIDB4MTA3OCwgMHgyMjBhLCAweDEwNzgsCisJMHg0ODJjLCAweDEwNzgsIDB4MTk2MywgMHgxMDc4LCAweDRkMjIsIDB4MzIwMCwgMHhhMDg1LCAweDAwMGQsCisJMHgyMDkwLCAweDcwYzMsIDB4MDAwMCwgMHgwMDkwLCAweDExNmMsIDB4NzBjMCwgMHhhMDg2LCAweDAwMDIsCisJMHgwMGMwLCAweDExNmMsIDB4MTA3OCwgMHgxMjg0LCAweDEwNzgsIDB4MTE5NiwgMHg3OGNjLCAweGEwMDUsCisJMHgwMGMwLCAweDExN2EsIDB4MTA3OCwgMHgxY2UzLCAweDAwMTAsIDB4MTE4MCwgMHgwMDY4LCAweDExODAsCisJMHgxMDc4LCAweDIwZTksIDB4MDAxMCwgMHgxMTgwLCAweDAwNjgsIDB4MTE4MCwgMHgxMDc4LCAweDFhNDgsCisJMHgwMGUwLCAweDExNmMsIDB4MTA3OCwgMHg0YmE5LCAweDAwNzgsIDB4MTE2YywgMHgxMThlLCAweDExOTAsCisJMHgyNDBiLCAweDI0MGIsIDB4NDhhZCwgMHg0OGFkLCAweDI0MGIsIDB4MjQwYiwgMHgwMDc4LCAweDExOGUsCisJMHgwMDc4LCAweDExOTAsIDB4MDA3OCwgMHgxMTkyLCAweDAwNzgsIDB4MTE5NCwgMHgwMDY4LCAweDEyMDEsCisJMHgyMDYxLCAweDAwMDAsIDB4NjAxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgxMjAxLCAweDc4MTQsCisJMHhhMDA1LCAweDAwYzAsIDB4MTFhNywgMHgwMDEwLCAweDEyMDIsIDB4MDA3OCwgMHgxMjAxLCAweDIwMDksCisJMHg1MTViLCAweDIxMDQsIDB4YTAwNSwgMHgwMGMwLCAweDEyMDEsIDB4MjAwOSwgMHg1MTY0LCAweDIwMGIsCisJMHgwMDAwLCAweDc5MTQsIDB4YTE4NiwgMHgwMDQyLCAweDAwYzAsIDB4MTFjYywgMHg3ODE2LCAweDIwMDksCisJMHg1MTYyLCAweDIxNjQsIDB4MjAwYiwgMHgwMDAwLCAweDYwMTgsIDB4NzBjNiwgMHg2MDE0LCAweDcwY2EsCisJMHg2MTFjLCAweGExOGMsIDB4ZmYwMCwgMHg2MDIwLCAweGEwODQsIDB4MDBmZiwgMHhhMTA1LCAweDcwY2UsCisJMHgxMDc4LCAweDE5NDgsIDB4MDA3OCwgMHgxMWZmLCAweDc4MTQsIDB4YTA4NiwgMHgwMDE4LCAweDAwYzAsCisJMHgxMWQzLCAweDEwNzgsIDB4MTY1YSwgMHg3ODE3LCAweDAwMDAsIDB4MjAwOSwgMHg1MTYyLCAweDIxMDQsCisJMHhhMDY1LCAweDAwNDAsIDB4MTFlZiwgMHgwYzdlLCAweDYwOWMsIDB4MjA2MCwgMHgxMDc4LCAweDE5YjMsCisJMHgwYzdmLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LCAweDE3MzAsIDB4MjAwOSwgMHgwMDBjLCAweDYwMDcsCisJMHgwMTAzLCAweDEwNzgsIDB4MTkyNCwgMHgwMGMwLCAweDExZmIsIDB4MTA3OCwgMHgxOTQ4LCAweDIwMDksCisJMHg1MTYyLCAweDIwMGIsIDB4MDAwMCwgMHgyMDA5LCAweDUxNWMsIDB4MjEwNCwgMHgyMDBiLCAweDAwMDAsCisJMHhhMDA1LCAweDAwNDAsIDB4MTFmZiwgMHgyMDAxLCAweDQwMDUsIDB4MDA3OCwgMHgxMjg2LCAweDAwNzgsCisJMHgxMjg0LCAweDAwN2MsIDB4NzBjMywgMHgwMDAwLCAweDcwYzcsIDB4MDAwMCwgMHg3MGNiLCAweDAwMDAsCisJMHg3MGNmLCAweDAwMDAsIDB4NzBjMCwgMHhhMGJjLCAweGZmYzAsIDB4MDBjMCwgMHgxMjUyLCAweDIwMzgsCisJMHgwMDc5LCAweDEyMTIsIDB4MTI4NCwgMHgxMmU1LCAweDEyYTksIDB4MTJmZSwgMHgxMzBkLCAweDEzMTMsCisJMHgxMmEwLCAweDE3NDgsIDB4MTMxNywgMHgxMjk4LCAweDEyYWQsIDB4MTJhZiwgMHgxMmIxLCAweDEyYjMsCisJMHgxNzRkLCAweDEyOTgsIDB4MTMyOSwgMHgxMzYwLCAweDE2NzIsIDB4MTc0MiwgMHgxMmI1LCAweDE1OTEsCisJMHgxNWFkLCAweDE1YzksIDB4MTVmNCwgMHgxNTRhLCAweDE1NTgsIDB4MTU2YywgMHgxNTgwLCAweDEzZGYsCisJMHgxMjk4LCAweDEzOGQsIDB4MTM5MywgMHgxMzk4LCAweDEzOWQsIDB4MTNhMywgMHgxM2E4LCAweDEzYWQsCisJMHgxM2IyLCAweDEzYjcsIDB4MTNiYiwgMHgxM2QwLCAweDEzZGMsIDB4MTI5OCwgMHgxMjk4LCAweDEyOTgsCisJMHgxMjk4LCAweDEzZWIsIDB4MTNmNCwgMHgxNDAzLCAweDE0MjksIDB4MTQzMywgMHgxNDNhLCAweDE0ODAsCisJMHgxNDhmLCAweDE0OWUsIDB4MTRiMCwgMHgxNTJhLCAweDE1M2EsIDB4MTI5OCwgMHgxMjk4LCAweDEyOTgsCisJMHgxMjk4LCAweDE1M2YsIDB4YTBiYywgMHhmZmEwLCAweDAwYzAsIDB4MTI5OCwgMHgyMDM4LCAweGEwODQsCisJMHgwMDFmLCAweDAwNzksIDB4MTI1YiwgMHgxNzg2LCAweDE3ODksIDB4MTc5OSwgMHgxMjk4LCAweDEyOTgsCisJMHgxOGRmLCAweDE4ZmMsIDB4MTI5OCwgMHgxMjk4LCAweDEyOTgsIDB4MTkwMCwgMHgxOTA4LCAweDEyOTgsCisJMHgxMjk4LCAweDEyOTgsIDB4MTI5OCwgMHgxMmRiLCAweDEyZjQsIDB4MTMxZiwgMHgxMzU2LCAweDE2NjgsCisJMHgxNzY0LCAweDE3NzgsIDB4MTI5OCwgMHgxODI5LCAweDE5MGUsIDB4MThiYiwgMHgxOGM1LCAweDE4YzksCisJMHgxOGQ3LCAweDEyOTgsIDB4MTI5OCwgMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDA2LCAweDAwNzgsCisJMHgxMjg2LCAweDczY2UsIDB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwMCwgMHg3MGMyLCAweDAwNjgsCisJMHgxMjg3LCAweDIwNjEsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDAwZTAsCisJMHgxMjhmLCAweDAwZTAsIDB4MTI5MSwgMHgwMDY4LCAweDEyOTEsIDB4MjA5MSwgMHg0MDgwLCAweDAwN2MsCisJMHg3MGMzLCAweDQwMDEsIDB4MDA3OCwgMHgxMjg3LCAweDcwYzMsIDB4NDAwNiwgMHgwMDc4LCAweDEyODcsCisJMHgyMDk5LCAweDAwNDEsIDB4MjBhMSwgMHgwMDQxLCAweDIwYTksIDB4MDAwNSwgMHg1M2EzLCAweDAwNzgsCisJMHgxMjg0LCAweDcwYzQsIDB4NzBjMywgMHgwMDA0LCAweDAwN2EsIDB4MDA3OCwgMHgxMjg0LCAweDAwNzgsCisJMHgxMjg0LCAweDAwNzgsIDB4MTI4NCwgMHgwMDc4LCAweDEyODQsIDB4MjA5MSwgMHg4MDAwLCAweDcwYzMsCisJMHgwMDAwLCAweDcwYzcsIDB4NDk1MywgMHg3MGNiLCAweDUwMjAsIDB4NzBjZiwgMHgyMDIwLCAweDcwZDMsCisJMHgwMDA3LCAweDNmMDAsIDB4NzBkNiwgMHgyMDc5LCAweDAwMDAsIDB4NzgxYiwgMHgwMDAxLCAweDIwMzEsCisJMHgwMDMwLCAweDIwNTksIDB4MTAwMCwgMHgyMDI5LCAweDA0NTcsIDB4MjA1MSwgMHgwNDcwLCAweDIwNjEsCisJMHgwNDcyLCAweDIwYjksIDB4ZmZmZiwgMHgyMGMxLCAweDAwMDAsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsCisJMHg0MDgwLCAweDAwNzgsIDB4MDQ1NSwgMHgxMDc4LCAweDFiNTMsIDB4MDBjMCwgMHgxMjljLCAweDc1ZDgsCisJMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwMDc4LCAweDEyZTgsIDB4MjAyOSwgMHgwMDAwLCAweDI1MjAsCisJMHg3MWQwLCAweDczYzgsIDB4NzJjYywgMHg3MGM0LCAweDEwNzgsIDB4MWE4ZCwgMHgwMDQwLCAweDEyODQsCisJMHg3MGMzLCAweDQwMDIsIDB4MDA3OCwgMHgxMjg0LCAweDEwNzgsIDB4MWI1MywgMHgwMGMwLCAweDEyOWMsCisJMHg3NWQ4LCAweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLCAweDAwNzgsIDB4MTMwMSwgMHgyMDI5LCAweDAwMDAsCisJMHgyNTIwLCAweDcxZDAsIDB4NzNjOCwgMHg3MmNjLCAweDcwYzQsIDB4MTA3OCwgMHgxYWVkLCAweDAwNDAsCisJMHgxMjg0LCAweDcwYzMsIDB4NDAwMiwgMHgwMDc4LCAweDEyODQsIDB4NzFjNCwgMHg3MGM4LCAweDIxMTQsCisJMHgyMDBhLCAweDAwNzgsIDB4MTI4MiwgMHg3MWM0LCAweDIxMTQsIDB4MDA3OCwgMHgxMjgyLCAweDcwYzcsCisJMHgwMDA3LCAweDcwY2IsIDB4MDA0MSwgMHg3MGNmLCAweDAwMDAsIDB4MDA3OCwgMHgxMjg0LCAweDEwNzgsCisJMHgxYjUzLCAweDAwYzAsIDB4MTI5YywgMHg3NWQ4LCAweDc2ZGMsIDB4NzVkYSwgMHg3NmRlLCAweDAwNzgsCisJMHgxMzJjLCAweDIwMjksIDB4MDAwMCwgMHgyNTMwLCAweDcwYzQsIDB4NzJjOCwgMHg3M2NjLCAweDc0ZDAsCisJMHg3MGM2LCAweDcyY2EsIDB4NzNjZSwgMHg3NGQyLCAweGEwMDUsIDB4MDA0MCwgMHgxMzUwLCAweDgwMDEsCisJMHg3ODkyLCAweGEwODQsIDB4ZmMwMCwgMHgwMDQwLCAweDEzNDUsIDB4NzhjYywgMHhhMDg1LCAweDAwMDEsCisJMHg3OGNlLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDEyODYsIDB4N2E5YSwgMHg3YjllLCAweDdkYTIsCisJMHg3ZWE2LCAweDdjOTYsIDB4NzhjYywgMHhhMDg0LCAweGZmZmMsIDB4NzhjZSwgMHgwMDc4LCAweDEzNTQsCisJMHg3OGNjLCAweGEwODUsIDB4MDAwMSwgMHg3OGNlLCAweDAwNzgsIDB4MTI4NCwgMHgxMDc4LCAweDFiNTMsCisJMHgwMGMwLCAweDEyOWMsIDB4NzVkOCwgMHg3NmRjLCAweDc1ZGEsIDB4NzZkZSwgMHgwMDc4LCAweDEzNjMsCisJMHgyMDI5LCAweDAwMDAsIDB4MjUzMCwgMHg3MGM0LCAweDcyYzgsIDB4NzNjYywgMHg3NGQ0LCAweDcwYzYsCisJMHg3MmNhLCAweDczY2UsIDB4NzRkNiwgMHhhMDA1LCAweDAwNDAsIDB4MTM4NywgMHg4MDAxLCAweDc4YWUsCisJMHhhMDg0LCAweGZjMDAsIDB4MDA0MCwgMHgxMzdjLCAweDc4Y2MsIDB4YTA4NSwgMHgwMTAwLCAweDc4Y2UsCisJMHgyMDAxLCAweDQwMDUsIDB4MDA3OCwgMHgxMjg2LCAweDdhYjYsIDB4N2JiYSwgMHg3ZGJlLCAweDdlYzIsCisJMHg3Y2IyLCAweDc4Y2MsIDB4YTA4NCwgMHhmY2ZmLCAweDc4Y2UsIDB4MDA3OCwgMHgxMzhiLCAweDc4Y2MsCisJMHhhMDg1LCAweDAxMDAsIDB4NzhjZSwgMHgwMDc4LCAweDEyODQsIDB4MjAwOSwgMHg1MTYxLCAweDIxMGMsCisJMHg3YWVjLCAweDAwNzgsIDB4MTI4MiwgMHgyMDA5LCAweDUxNDEsIDB4MjEwYywgMHgwMDc4LCAweDEyODMsCisJMHgyMDA5LCAweDUxNDIsIDB4MjEwYywgMHgwMDc4LCAweDEyODMsIDB4MjA2MSwgMHg1MTQwLCAweDYxMGMsCisJMHg2MjEwLCAweDAwNzgsIDB4MTI4MiwgMHgyMDA5LCAweDUxNDUsIDB4MjEwYywgMHgwMDc4LCAweDEyODMsCisJMHgyMDA5LCAweDUxNDYsIDB4MjEwYywgMHgwMDc4LCAweDEyODMsIDB4MjAwOSwgMHg1MTQ4LCAweDIxMGMsCisJMHgwMDc4LCAweDEyODMsIDB4MjAwOSwgMHg1MTQ5LCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLCAweDc5MDgsCisJMHg3YTBjLCAweDAwNzgsIDB4MTI4MiwgMHg3MWM0LCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4YTBlOCwgMHg1MzgwLCAweDZhMDAsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDgsCisJMHgwMDQwLCAweDEzY2QsIDB4NmIwOCwgMHgwMDc4LCAweDEzY2UsIDB4NmIwYywgMHgwMDc4LCAweDEyODEsCisJMHg3N2M0LCAweDEwNzgsIDB4MTk3MywgMHgyMDkxLCAweDgwMDAsIDB4NmIxYywgMHg2YTE0LCAweDIwOTEsCisJMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMjgxLCAweDc5NGMsIDB4MDA3OCwgMHgxMjgzLCAweDc3YzQsCisJMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDY5MDgsIDB4NmExOCwgMHg2YjEwLCAweDIwOTEsCisJMHg4MDAxLCAweDAwNzgsIDB4MTI4MSwgMHg3MWM0LCAweGExODIsIDB4MDAxMCwgMHgwMGM4LCAweDEyN2MsCisJMHgxMDc4LCAweDIyZTIsIDB4MDA3OCwgMHgxMjgxLCAweDcxYzQsIDB4YTE4MiwgMHgwMDEwLCAweDAwYzgsCisJMHgxMjdjLCAweDIwMTEsIDB4NTE0MSwgMHgyMjA0LCAweDAwN2UsIDB4MjExMiwgMHgxMDc4LCAweDIyOWIsCisJMHgwMTdmLCAweDAwNzgsIDB4MTI4MywgMHg3MWM0LCAweDIwMTEsIDB4MTQyMSwgMHgyMGE5LCAweDAwMDgsCisJMHgyMjA0LCAweGExMDYsIDB4MDA0MCwgMHgxNDEzLCAweDgyMTAsIDB4MDA3MCwgMHgxNDExLCAweDAwNzgsCisJMHgxNDA4LCAweDAwNzgsIDB4MTI3YywgMHhhMjkyLCAweDE0MjEsIDB4MDI3ZSwgMHgyMDExLCAweDUxNDIsCisJMHgyMjA0LCAweDIxMTIsIDB4MDE3ZiwgMHgwMDdlLCAweDEwNzgsIDB4MjJhNywgMHgwMTdmLCAweDAwNzgsCisJMHgxMjgzLCAweDAzZTgsIDB4MDBmYSwgMHgwMWY0LCAweDAyZWUsIDB4MDA2NCwgMHgwMDE5LCAweDAwMzIsCisJMHgwMDRiLCAweDIwNjEsIDB4NTE0MCwgMHg2MTBjLCAweDYyMTAsIDB4NzBjNCwgMHg2MDBlLCAweDcwYzgsCisJMHg2MDEyLCAweDAwNzgsIDB4MTI4MiwgMHgyMDYxLCAweDUxNDAsIDB4NjExNCwgMHg3MGM0LCAweDYwMTYsCisJMHgwMDc4LCAweDEyODMsIDB4MjA2MSwgMHg1MTQwLCAweDcxYzQsIDB4MjAxMSwgMHgwMDA0LCAweDYwMWYsCisJMHgwMDE5LCAweDIwMTksIDB4MTIxMiwgMHhhMTg2LCAweDAwMjgsIDB4MDA0MCwgMHgxNDViLCAweDIwMTEsCisJMHgwMDA1LCAweDYwMWYsIDB4MDAxOSwgMHgyMDE5LCAweDEyMTIsIDB4YTE4NiwgMHgwMDMyLCAweDAwNDAsCisJMHgxNDViLCAweDIwMTEsIDB4MDAwNiwgMHg2MDFmLCAweDAwMGMsIDB4MjAxOSwgMHgyMjIyLCAweGExODYsCisJMHgwMDNjLCAweDAwYzAsIDB4MTI3YywgMHg2MDE4LCAweDAwN2UsIDB4NjExYSwgMHg3ODAwLCAweGEwODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MTQ3NiwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsCisJMHgwMDQ4LCAweDE0NmUsIDB4MDAzOCwgMHgxNDcyLCAweDAwNzgsIDB4MTQ3NiwgMHgwMDI4LCAweDE0NzIsCisJMHgwMDc4LCAweDE0NzYsIDB4MjAxOSwgMHgyMjIyLCAweDAwNzgsIDB4MTQ3OCwgMHgyMDE5LCAweDEyMTIsCisJMHgyM2I4LCAweDEwNzgsIDB4MjJiOCwgMHgxMDc4LCAweDRkMjIsIDB4MDE3ZiwgMHgwMDc4LCAweDEyODMsCisJMHg3MWM0LCAweGExODQsIDB4ZmZjZiwgMHgwMGMwLCAweDEyN2MsIDB4MjAxMSwgMHg1MTQ4LCAweDIyMDQsCisJMHgyMTEyLCAweDAwN2UsIDB4MTA3OCwgMHgyMmRhLCAweDAxN2YsIDB4MDA3OCwgMHgxMjgzLCAweDcxYzQsCisJMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMjdjLCAweDIwMTEsIDB4NTE0OSwgMHgyMjA0LCAweDAwN2UsCisJMHgyMTEyLCAweDEwNzgsIDB4MjJjOSwgMHgwMTdmLCAweDAwNzgsIDB4MTI4MywgMHg3MWM0LCAweDcyYzgsCisJMHhhMTg0LCAweGZmZmQsIDB4MDBjMCwgMHgxMjdiLCAweGEyODQsIDB4ZmZmZCwgMHgwMGMwLCAweDEyN2IsCisJMHgyMTAwLCAweDc5MDgsIDB4NzgwYSwgMHgyMjAwLCAweDdhMGMsIDB4NzgwZSwgMHgwMDc4LCAweDEyODIsCisJMHg3MWM0LCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZTgsCisJMHg1MzgwLCAweDIwMTksIDB4MDAwMCwgMHg3MmM4LCAweGEyODQsIDB4MDA4MCwgMHgwMDQwLCAweDE0YzYsCisJMHg2YzE0LCAweDg0ZmYsIDB4MDBjMCwgMHgxNGM2LCAweDY4MTcsIDB4MDA0MCwgMHhhMjg0LCAweDAwNDAsCisJMHgwMDQwLCAweDE0ZDAsIDB4NmMxMCwgMHg4NGZmLCAweDAwYzAsIDB4MTRkMCwgMHg2ODEzLCAweDAwMDEsCisJMHg2ODAwLCAweDAwN2UsIDB4YTIyNiwgMHgwMDQwLCAweDE0ZjMsIDB4NmEwMiwgMHhhNDg0LCAweDIwMDAsCisJMHgwMDQwLCAweDE0ZGMsIDB4YTM5ZCwgMHgwMDEwLCAweGE0ODQsIDB4MTAwMCwgMHgwMDQwLCAweDE0ZTIsCisJMHhhMzlkLCAweDAwMDgsIDB4YTQ4NCwgMHg0MDAwLCAweDAwNDAsIDB4MTRmMywgMHg4MTBmLCAweGEyODQsCisJMHg0MDAwLCAweDAwNDAsIDB4MTRlZiwgMHgxMDc4LCAweDIyZmMsIDB4MDA3OCwgMHgxNGYzLCAweDEwNzgsCisJMHgyMmVlLCAweDAwNzgsIDB4MTRmMywgMHg3MmNjLCAweDY4MDgsIDB4YTIwNiwgMHgwMDQwLCAweDE1MjIsCisJMHhhMmE0LCAweDAwZmYsIDB4MjA2MSwgMHg1MTQwLCAweDYxMTgsIDB4YTE4NiwgMHgwMDI4LCAweDAwNDAsCisJMHgxNTA5LCAweGExODYsIDB4MDAzMiwgMHgwMDQwLCAweDE1MGYsIDB4YTE4NiwgMHgwMDNjLCAweDAwNDAsCisJMHgxNTE1LCAweGE0ODIsIDB4MDA2NCwgMHgwMDQ4LCAweDE1MWYsIDB4MDA3OCwgMHgxNTE5LCAweGE0ODIsCisJMHgwMDUwLCAweDAwNDgsIDB4MTUxZiwgMHgwMDc4LCAweDE1MTksIDB4YTQ4MiwgMHgwMDQzLCAweDAwNDgsCisJMHgxNTFmLCAweDcxYzQsIDB4NzFjNiwgMHgwMjdmLCAweDcyY2EsIDB4MDA3OCwgMHgxMjdkLCAweDZhMGEsCisJMHhhMzlkLCAweDAwMGEsIDB4NjgwNCwgMHhhMzA1LCAweDY4MDYsIDB4MDI3ZiwgMHg2YjBjLCAweDcxYzQsCisJMHgwMDc4LCAweDEyODEsIDB4NzdjNCwgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDZhMTQsCisJMHg2YjFjLCAweDIwOTEsIDB4ODAwMSwgMHg3MGM4LCAweDY4MTYsIDB4NzBjYywgMHg2ODFlLCAweDI3MDgsCisJMHgwMDc4LCAweDEyODEsIDB4NzBjNCwgMHg3OTRjLCAweDc4NGUsIDB4MDA3OCwgMHgxMjgzLCAweDcxYzQsCisJMHg3MmM4LCAweDczY2MsIDB4YTE4MiwgMHgwMDEwLCAweDAwYzgsIDB4MTI3YywgMHgxMDc4LCAweDIzMGEsCisJMHgwMDc4LCAweDEyODEsIDB4NzdjNCwgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsCisJMHhhMjk1LCAweDAwMDIsIDB4NmEwYSwgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHgwMDc4LCAweDEyODIsCisJMHg3N2M0LCAweDEwNzgsIDB4MTk3MywgMHgyMDkxLCAweDgwMDAsIDB4NmEwOCwgMHhhMjk0LCAweGZmZjksCisJMHg2YTBhLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDE1NjcsIDB4MTA3OCwgMHgyMWQyLCAweDIwOTEsCisJMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMjgyLCAweDc3YzQsIDB4MTA3OCwgMHgxOTczLCAweDIwOTEsCisJMHg4MDAwLCAweDZhMDgsIDB4YTI5NSwgMHgwMDA0LCAweDZhMGEsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsCisJMHgxNTdiLCAweDEwNzgsIDB4MjFkMiwgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHgwMDc4LCAweDEyODIsCisJMHg3N2M0LCAweDIwNDEsIDB4MDAwMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4MTk4MCwgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHg2YTA4LCAweDAwNzgsCisJMHgxMjgyLCAweDc3YzQsIDB4NzJjOCwgMHg3M2NjLCAweDc3YzYsIDB4NzJjYSwgMHg3M2NlLCAweDEwNzgsCisJMHgxOWUxLCAweDAwYzAsIDB4MTVhOSwgMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwgMHgxNWE5LCAweDI3MDgsCisJMHgxMDc4LCAweDIzMWEsIDB4MDBjMCwgMHgxNWE5LCAweDc4MTcsIDB4MDAxNSwgMHgyMDkxLCAweDgwMDEsCisJMHgwMDdjLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDEyODQsIDB4NzdjNCwgMHg3N2M2LCAweDIwNDEsCisJMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxOTgwLCAweDIwNjEsIDB4NTE0MCwgMHg2MDZmLCAweDAwMDMsIDB4Njc4MiwgMHg2MDkzLCAweDAwMGYsCisJMHg2MDczLCAweDAwMDAsIDB4NzgxNywgMHgwMDE2LCAweDEwNzgsIDB4MjFkMiwgMHgyMDkxLCAweDgwMDEsCisJMHgwMDdjLCAweDc3YzgsIDB4NzdjYSwgMHg3N2M0LCAweDc3YzYsIDB4YTdiYywgMHhmZjAwLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNjEsIDB4NTE0MCwgMHg2MDZmLCAweDAwMDIsIDB4NjA3MywgMHgwMDAwLCAweDY3ODIsCisJMHg2MDkzLCAweDAwMGYsIDB4NzgxNywgMHgwMDE3LCAweDEwNzgsIDB4MjFkMiwgMHgyMDkxLCAweDgwMDEsCisJMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA0LCAweDIwNTEsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDE5ODAsIDB4NzBjOCwgMHg2ODM2LCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsCisJMHgxNWU4LCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDc4Y2MsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsCisJMHgxNjE4LCAweDIwMzksIDB4MDAwMCwgMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA0LCAweDIwNTEsCisJMHgwMDA4LCAweDEwNzgsIDB4MTk3MywgMHgyMDkxLCAweDgwMDAsIDB4NjgwOCwgMHhhODBkLCAweDY5MGEsCisJMHgyMDkxLCAweDgwMDEsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwgMHgxNjAxLCAweGE3YmMsCisJMHhmZjAwLCAweDg3M2YsIDB4ODczOCwgMHg4NzNmLCAweGE3ODQsIDB4MGYwMCwgMHgwMGMwLCAweDE2MDEsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MzAsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsCisJMHgxNjQxLCAweDY4NGIsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhhMDg0LCAweDAwMDQsCisJMHgwMDQwLCAweDE2MmUsIDB4MDA3MCwgMHgxNjJlLCAweDAwNzgsIDB4MTYyNSwgMHg2ODRiLCAweDAwMDksCisJMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxNjNiLCAweDAwNzAsCisJMHgxNjNiLCAweDAwNzgsIDB4MTYzMiwgMHgyMGE5LCAweDAwZmEsIDB4MDA3MCwgMHgxNjQxLCAweDAwNzgsCisJMHgxNjNkLCAweDIwNzksIDB4NTEwMCwgMHg3ODE3LCAweDAwMTgsIDB4MjA2MSwgMHg1MTQwLCAweDYwNmYsCisJMHgwMDAxLCAweDYwNzMsIDB4MDAwMCwgMHg2MDkzLCAweDAwMGYsIDB4NzhjYywgMHhhMDg1LCAweDAwMDIsCisJMHg3OGNlLCAweDY4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDY4MGEsIDB4NjgxYiwgMHgwMDQ4LCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4NzhjYywgMHhhMDg0LCAweGZmZmQsIDB4NzhjZSwgMHhhMDg0LCAweDAwMDEsCisJMHgwMGMwLCAweDE2NjQsIDB4MTA3OCwgMHgxYTJiLCAweDcxYzQsIDB4NzFjNiwgMHg3OTRhLCAweDAwN2MsCisJMHgxMDc4LCAweDFiNTMsIDB4MDBjMCwgMHgxMjljLCAweDc1ZDgsIDB4NzRkYywgMHg3NWRhLCAweDc0ZGUsCisJMHgwMDc4LCAweDE2NzUsIDB4MjAyOSwgMHgwMDAwLCAweDI1MjAsIDB4NzFjNCwgMHg3M2M4LCAweDcyY2MsCisJMHg3MWM2LCAweDczY2EsIDB4NzJjZSwgMHgyMDc5LCAweDUxMDAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxOTJlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDQwLCAweDE3MmMsIDB4MjBhOSwgMHgwMDA1LCAweDIwYTEsCisJMHg1MTE4LCAweDIwOTEsIDB4ODAwMCwgMHg0MWExLCAweDIwOTEsIDB4ODAwMSwgMHgyMDA5LCAweDAwMjAsCisJMHgxMDc4LCAweDE5MjksIDB4MDA0MCwgMHgxNjk4LCAweDEwNzgsIDB4MTk0OCwgMHgwMDc4LCAweDE3MmMsCisJMHg2MDA0LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDgwMDksIDB4MDA0MCwgMHgxNmZiLCAweDBjN2UsCisJMHgyYzY4LCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDE5MmUsIDB4MjA5MSwgMHg4MDAxLCAweDAwNDAsCisJMHgxNmNjLCAweDJjMDAsIDB4Njg5ZSwgMHg4MTA5LCAweDAwYzAsIDB4MTZhMCwgMHg2MDlmLCAweDAwMDAsCisJMHgwYzdmLCAweDBjN2UsIDB4NzIxOCwgMHg3MzFjLCAweDc0MjAsIDB4NzUyNCwgMHgyYzY4LCAweDY4OWMsCisJMHhhMDY1LCAweDAwNDAsIDB4MTZmYSwgMHgyMDA5LCAweDAwMjAsIDB4MTA3OCwgMHgxOTI5LCAweDAwYzAsCisJMHgxNmUzLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDE2Y2MsCisJMHgyZDAwLCAweDYwMDIsIDB4MDA3OCwgMHgxNmIyLCAweDBjN2YsIDB4MGM3ZSwgMHg2MDljLCAweDIwNjAsCisJMHgxMDc4LCAweDE5YjMsIDB4MGM3ZiwgMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwgMHgxNzMwLCAweDIwMDksCisJMHgwMDBjLCAweDYwMDgsIDB4YTA4NSwgMHgwMjAwLCAweDYwMGEsIDB4MTA3OCwgMHgxOTI0LCAweDEwNzgsCisJMHgxOTQ4LCAweDAwNzgsIDB4MTcyYywgMHgwYzdmLCAweDBjN2UsIDB4NjA5YywgMHgyMDYwLCAweDEwNzgsCisJMHgxOWIzLCAweDBjN2YsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MTczMCwgMHgyMDA5LCAweDAwMGMsCisJMHg2MDA3LCAweDAxMDMsIDB4NjAxYiwgMHgwMDAzLCAweDEwNzgsIDB4MTkyNCwgMHgxMDc4LCAweDE5NDgsCisJMHgwMDc4LCAweDE3MmMsIDB4MGM3ZiwgMHg3NGM0LCAweDczYzgsIDB4NzJjYywgMHg2MDE0LCAweDIwOTEsCisJMHg4MDAwLCAweDc4MTcsIDB4MDAxMiwgMHgwZTdlLCAweDIwNzEsIDB4NTE0MCwgMHg3MDZmLCAweDAwMDUsCisJMHg3MDczLCAweDAwMDAsIDB4NzM3NiwgMHg3MjdhLCAweDc0N2UsIDB4NzA4MiwgMHg3MDg3LCAweDAwMDAsCisJMHgyYzAwLCAweDcwOGEsIDB4NzA4ZiwgMHgwMDAwLCAweGEwMmUsIDB4MjUzMCwgMHg2MTFjLCAweDYxYTIsCisJMHhhMTg0LCAweDAwNjAsIDB4MDA0MCwgMHgxNzFlLCAweDEwNzgsIDB4NDdjMiwgMHgwZTdmLCAweDY1OTYsCisJMHg2NWE2LCAweDY2OWEsIDB4NjZhYSwgMHg2MGFmLCAweDAwMDAsIDB4NjBiMywgMHgwMDAwLCAweDEwNzgsCisJMHgyMWQyLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDcwYzMsIDB4NDAwNSwgMHgwMDc4LCAweDEyODcsCisJMHgyMGE5LCAweDAwMDUsIDB4MjA5OSwgMHg1MTE4LCAweDIwOTEsIDB4ODAwMCwgMHg1MzBhLCAweDIwOTEsCisJMHg4MDAxLCAweDIxMDAsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksCisJMHgwMDAwLCAweDAwN2MsIDB4NzFjNCwgMHg3MGM3LCAweDAwMDAsIDB4NzkwNiwgMHgwMDc4LCAweDEyODQsCisJMHg3MWM0LCAweDcxYzYsIDB4MjE2OCwgMHgwMDc4LCAweDE3NGYsIDB4MjA2OSwgMHgxMDAwLCAweDY5MGMsCisJMHhhMDE2LCAweDJkMDQsIDB4YTIxMCwgMHg4ZDY4LCAweDgxMDksIDB4MDBjMCwgMHgxNzUxLCAweGEyODUsCisJMHgwMDAwLCAweDAwYzAsIDB4MTc1ZiwgMHg3MGMzLCAweDQwMDAsIDB4MDA3OCwgMHgxNzYxLCAweDcwYzMsCisJMHg0MDAzLCAweDcwY2EsIDB4MDA3OCwgMHgxMjg3LCAweDIwMTEsIDB4NTE2NywgMHgyMjBjLCAweDcwYzQsCisJMHg4MDAzLCAweDAwNDgsIDB4MTc3MSwgMHgxMDc4LCAweDNiN2YsIDB4YTE4NCwgMHg3ZmZmLCAweDAwNzgsCisJMHgxNzc1LCAweDEwNzgsIDB4M2I3MiwgMHhhMTg1LCAweDgwMDAsIDB4MjAxMiwgMHgwMDc4LCAweDEyODMsCisJMHg3MWM0LCAweDEwNzgsIDB4M2I2OSwgMHg2MTAwLCAweDIwMDEsIDB4NTE2NywgMHgyMDA0LCAweGEwODQsCisJMHg4MDAwLCAweGExMGQsIDB4NjIwNCwgMHg2MzA4LCAweDAwNzgsIDB4MTI4MSwgMHg3OWU0LCAweDAwNzgsCisJMHgxMjgzLCAweDcxYzQsIDB4NzFjNiwgMHgyMTk4LCAweDIwYTEsIDB4MDA0MiwgMHgyMGE5LCAweDAwMDQsCisJMHg1M2EzLCAweDIxYTAsIDB4MjA5OSwgMHgwMDQyLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDAwNzgsCisJMHgxMjg0LCAweDcwYzQsIDB4MjA2OCwgMHgyMDc5LCAweDUxMDAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxOTJlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDQwLCAweDE4MjUsIDB4NjAwNywgMHgwMDAxLCAweDYwMGIsCisJMHgwMDAwLCAweDYwMmIsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDYsIDB4NmExMCwgMHhhMjhjLCAweDAwMGYsCisJMHhhMjg0LCAweDAwZjAsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LCAweDYwMTYsCisJMHhhMjg0LCAweDA4MDAsIDB4MDA0MCwgMHgxN2MwLCAweDYwMWIsIDB4MDAwYSwgMHgwMDc4LCAweDE3YzYsCisJMHhhMjg0LCAweDEwMDAsIDB4MDA0MCwgMHgxN2M2LCAweDYwMWIsIDB4MDAwYywgMHhhMjg0LCAweDAzMDAsCisJMHgwMDQwLCAweDE3Y2YsIDB4NjAyYiwgMHgwMDAxLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweGEwODUsCisJMHgwMDAxLCAweDYwMWUsIDB4NjAyMywgMHgwMDAwLCAweDYwMjcsIDB4MDAwMCwgMHhhMjg0LCAweDA0MDAsCisJMHgwMDQwLCAweDE3ZGMsIDB4NjAyYiwgMHgwMDAwLCAweDIwYTksIDB4MDAwNiwgMHhhYzgwLCAweDAwMGIsCisJMHgyMGEwLCAweGFkODAsIDB4MDAwNSwgMHgyMDk4LCAweDUzYTMsIDB4YTI4NCwgMHgwMzAwLCAweDAwYzAsCisJMHgxN2YxLCAweDYwNDYsIDB4NjA0YSwgMHg2MDRlLCAweDYwNTIsIDB4NjA5NiwgMHg2MDlhLCAweDAwNzgsCisJMHgxN2ZiLCAweDY4MDAsIDB4NjA0NiwgMHg2ODA0LCAweDYwNGEsIDB4NmUwOCwgMHg2NjRlLCAweDZkMGMsCisJMHg2NTUyLCAweDY1OTYsIDB4NjY5YSwgMHg2MDE0LCAweDIwOTEsIDB4ODAwMCwgMHg3ODE3LCAweDAwNDIsCisJMHgyYzA4LCAweDIwNjEsIDB4NTE0MCwgMHg2MDZmLCAweDAwMDUsIDB4NjA3MywgMHgwMDAwLCAweDYwNzcsCisJMHgwMDAwLCAweDYwN2IsIDB4MDAwMCwgMHg2MDdmLCAweDAwMDAsIDB4NjA4MiwgMHg2MThhLCAweGEyODQsCisJMHgwNDAwLCAweDYwOGUsIDB4MjA5MSwgMHg4MDAxLCAweDBlN2UsIDB4MjA3MSwgMHgwMDIwLCAweDcwMDcsCisJMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MGU3ZiwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDIxZDIsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4NzBjMywgMHg0MDA1LCAweDAwNzgsCisJMHgxMjg3LCAweDBjN2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHg1MTQwLCAweDIwNzksIDB4MDEwMCwgMHgyMDYxLCAweDAwMTAsIDB4NzBhMCwgMHhhMDZkLCAweDAwNDAsCisJMHgxOGIxLCAweDZhMDQsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNywgMHgwMDQwLCAweDE4NDQsCisJMHhhMjg2LCAweDAwMGYsIDB4MDBjMCwgMHgxOGIxLCAweDY5MWMsIDB4YTE4NCwgMHgwMDgwLCAweDAwYzAsCisJMHgxOGIxLCAweDY4MjQsIDB4YTE4YywgMHhmZjAwLCAweGEwODUsIDB4MDAxOSwgMHg2ODI2LCAweDcxYjAsCisJMHg4MWZmLCAweDAwNDAsIDB4MTg2NywgMHgwZDdlLCAweDIwNjksIDB4MDAyMCwgMHg2ODA3LCAweDAwMTAsCisJMHg2OTA4LCAweDY4MDgsIDB4YTEwNiwgMHgwMGMwLCAweDE4NTgsIDB4NjkwYywgMHg2ODBjLCAweGExMDYsCisJMHgwMGMwLCAweDE4NWQsIDB4YTE4NCwgMHgwMGZmLCAweDAwYzAsIDB4MTg1ZCwgMHgwZDdmLCAweDc4YjgsCisJMHhhMDg0LCAweDgwMWYsIDB4MDBjMCwgMHgxODY3LCAweDc4NDgsIDB4YTA4NSwgMHgwMDBjLCAweDc4NGEsCisJMHg3MWIwLCAweDgxZmYsIDB4MDA0MCwgMHgxODhhLCAweDcwYjMsIDB4MDAwMCwgMHgwZDdlLCAweDIwNjksCisJMHgwMDIwLCAweDY4MDcsIDB4MDAxOCwgMHg2ODA0LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDE4N2IsCisJMHg2ODA3LCAweDAwMDgsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgxODgyLCAweDY4MDcsCisJMHgwMDAyLCAweDBkN2YsIDB4NjFjNCwgMHg2MmM4LCAweDYzY2MsIDB4NjFjNiwgMHg2MmNhLCAweDYzY2UsCisJMHgwZTdlLCAweDIwNzEsIDB4NTEwMCwgMHg3MjY2LCAweDczNmEsIDB4YWU4MCwgMHgwMDE5LCAweDBlN2YsCisJMHg3ODQ4LCAweGEwODQsIDB4MDAwYywgMHgwMGMwLCAweDE4OTgsIDB4MTA3OCwgMHg0NmRiLCAweDc4YTMsCisJMHgwMDAwLCAweDc4NTgsIDB4YTA4NCwgMHhlZGZmLCAweDc4NWEsIDB4NzBiNCwgMHhhMDgwLCAweDAwZGYsCisJMHg3ODFhLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsCisJMHgxMjg0LCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MjA5MSwgMHg4MDAxLCAweDIwMDEsCisJMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHg3OTgwLCAweDcxYzYsIDB4NzFjNCwgMHhhMTgyLCAweDAwMDMsCisJMHgwMGM4LCAweDEyN2MsIDB4Nzk4MiwgMHgwMDc4LCAweDEyODQsIDB4Nzk4MCwgMHg3MWM2LCAweDAwNzgsCisJMHgxMjg0LCAweDc5NzQsIDB4NzFjNiwgMHg3MWM0LCAweDc5NzYsIDB4Nzk3OCwgMHg3MWNhLCAweDcxYzgsCisJMHg3OTdhLCAweDc5N2MsIDB4NzFjZSwgMHg3MWNjLCAweDc5N2UsIDB4MDA3OCwgMHgxMjg0LCAweDc5NzQsCisJMHg3MWM2LCAweDc5NzgsIDB4NzFjYSwgMHg3OTdjLCAweDcxY2UsIDB4MDA3OCwgMHgxMjg0LCAweDc5MDAsCisJMHg3MWM2LCAweDcxYzQsIDB4NzkwMiwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsCisJMHgwMDQ4LCAweDE4ZWUsIDB4MDAzOCwgMHgxOGYwLCAweDAwNzgsIDB4MThmYSwgMHgwMGE4LCAweDE4ZmEsCisJMHhhMThjLCAweDAwMDEsIDB4MDBjMCwgMHgxOGY4LCAweDIwYjksIDB4MjIyMiwgMHgwMDc4LCAweDE4ZmEsCisJMHgyMGI5LCAweDEyMTIsIDB4MDA3OCwgMHgxMjg0LCAweDc5MDAsIDB4NzFjNiwgMHgwMDc4LCAweDEyODQsCisJMHgyMDA5LCAweDUxNzQsIDB4MjEwNCwgMHg3MGM2LCAweDcwYzQsIDB4MjAwYSwgMHgwMDc4LCAweDEyODQsCisJMHgyMDA5LCAweDUxNzQsIDB4MjEwNCwgMHg3MGM2LCAweDAwNzgsIDB4MTI4NCwgMHg3MWM0LCAweDgxMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlOCwgMHg1MzgwLCAweDZhMTQsCisJMHhkMmI0LCAweDAwNDAsIDB4MTkxZiwgMHgyMDExLCAweDAwMDEsIDB4MDA3OCwgMHgxOTIxLCAweDIwMTEsCisJMHgwMDAwLCAweDZiMGMsIDB4MDA3OCwgMHgxMjgxLCAweGFjODAsIDB4MDAwMSwgMHgxMDc4LCAweDFiMGYsCisJMHgwMDdjLCAweGFjODAsIDB4MDAwMSwgMHgxMDc4LCAweDFhYWYsIDB4MDA3YywgMHg3ODUwLCAweGEwNjUsCisJMHgwMDQwLCAweDE5MzYsIDB4MmMwNCwgMHg3ODUyLCAweDIwNjMsIDB4MDAwMCwgMHgwMDdjLCAweDBmN2UsCisJMHgyMDc5LCAweDUxMDAsIDB4Nzg1MCwgMHhhMDZkLCAweDAwNDAsIDB4MTk0NiwgMHgyZDA0LCAweDc4NTIsCisJMHg2ODAzLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDY4MGIsIDB4MDAwMCwgMHgwZjdmLCAweDAwN2MsCisJMHgyMDkxLCAweDgwMDAsIDB4MGY3ZSwgMHgyMDc5LCAweDUxMDAsIDB4Nzg1MCwgMHgyMDYyLCAweDJjMDAsCisJMHhhMDA1LCAweDAwYzAsIDB4MTk1NSwgMHgxMDc4LCAweDIzZWIsIDB4Nzg1MiwgMHgwZjdmLCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4MGY3ZSwgMHgyMDc5LCAweDUxMDAsIDB4Nzg1MCwgMHgyMDZhLCAweDJkMDAsCisJMHg3ODUyLCAweDBmN2YsIDB4MDA3YywgMHgyMDExLCAweDc4MDAsIDB4N2E1MiwgMHg3YmVjLCAweDgzMTksCisJMHgwMDQwLCAweDE5NzAsIDB4YTI4MCwgMHgwMDMxLCAweDIwMTIsIDB4MjAxMCwgMHgwMDc4LCAweDE5NjcsCisJMHgyMDEzLCAweDAwMDAsIDB4MDA3YywgMHhhNzg0LCAweDBmMDAsIDB4ODAwYiwgMHhhNzg0LCAweDAwMWYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGExMDUsIDB4YTBlOCwgMHg1NDAwLCAweDAwN2MsCisJMHgxMDc4LCAweDE5NzMsIDB4MjkwMCwgMHg2ODJhLCAweDJhMDAsIDB4NjgyZSwgMHg2ODA4LCAweGEwODQsCisJMHhmZmVmLCAweGE4MGQsIDB4NjkwYSwgMHgyMDA5LCAweDUxNTIsIDB4MjEwYywgMHg2ODA0LCAweGEwMDUsCisJMHgwMDQwLCAweDE5YjIsIDB4YTExNiwgMHgwMGMwLCAweDE5OWQsIDB4MjA2MCwgMHg2MDAwLCAweDY4MDYsCisJMHgwMTdlLCAweDIwMGIsIDB4MDAwMCwgMHgwMDc4LCAweDE5YTAsIDB4MjAwOSwgMHgwMDAwLCAweDAxN2UsCisJMHg2ODA0LCAweGEwNjUsIDB4MDA0MCwgMHgxOWFmLCAweDYwMDAsIDB4NjgwNiwgMHgxMDc4LCAweDE5YzAsCisJMHgxMDc4LCAweDFjNWYsIDB4NjgxMCwgMHg4MDAxLCAweDY4MTIsIDB4MDBjMCwgMHgxOWEwLCAweDAxN2YsCisJMHg2OTAyLCAweDY5MDYsIDB4MDA3YywgMHhhMDY1LCAweDAwNDAsIDB4MTliZiwgMHg2MDljLCAweDYwOWYsCisJMHgwMDAwLCAweDIwMDgsIDB4MTA3OCwgMHgxOTQ4LCAweDIxMDAsIDB4MDA3OCwgMHgxOWIzLCAweDAwN2MsCisJMHg2MDA3LCAweDAxMDMsIDB4NjA4ZiwgMHgwMDAwLCAweDIwYTksIDB4MDAxYywgMHhhYzgwLCAweDAwMDUsCisJMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LCAweDY4MjgsIDB4NjAxYSwgMHg2ODJjLCAweDYwMjIsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHg1MTQwLCAweDcwNGMsIDB4YTA4YywgMHgwMjAwLCAweDAwYzAsCisJMHgxOWRmLCAweGEwODgsIDB4NTE4MCwgMHgyZDBhLCAweDgwMDAsIDB4NzA0ZSwgMHhhMDA2LCAweDBlN2YsCisJMHgwMDdjLCAweDEwNzgsIDB4MTk3MywgMHgyMDkxLCAweDgwMDAsIDB4NjgwNCwgMHg3ODFlLCAweGEwNjUsCisJMHgwMDQwLCAweDFhMmEsIDB4MDA3OCwgMHgxOWYyLCAweDJjMDAsIDB4NzgxZSwgMHg2MDAwLCAweGEwNjUsCisJMHgwMDQwLCAweDFhMmEsIDB4NjAwYywgMHhhMzA2LCAweDAwYzAsIDB4MTllYywgMHg2MDEwLCAweGEyMDYsCisJMHgwMGMwLCAweDE5ZWMsIDB4MmMyOCwgMHgyMDAxLCAweDUxNTIsIDB4MjAwNCwgMHhhYzA2LCAweDAwYzAsCisJMHgxYTAzLCAweDAwNzgsIDB4MWEyOCwgMHg2ODA0LCAweGFjMDYsIDB4MDBjMCwgMHgxYTEwLCAweDYwMDAsCisJMHhhMDY1LCAweDY4MDYsIDB4MDBjMCwgMHgxYTFhLCAweDY4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDFhMWEsCisJMHg2NDAwLCAweDc4MWMsIDB4MjA2MCwgMHg2NDAyLCAweGE0ODYsIDB4MDAwMCwgMHgwMGMwLCAweDFhMWEsCisJMHgyYzAwLCAweDY4MDIsIDB4MjU2MCwgMHgxMDc4LCAweDE5YzAsIDB4NjAxYiwgMHgwMDA1LCAweDYwMjMsCisJMHgwMDIwLCAweDEwNzgsIDB4MWM1ZiwgMHg2ODEwLCAweDgwMDEsIDB4MTA1MCwgMHgyM2ViLCAweDY4MTIsCisJMHhhMDg1LCAweGZmZmYsIDB4MDA3YywgMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksCisJMHgwMDA0LCAweDIwNTEsIDB4MDAwOCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxOTgwLCAweDg3MzgsCisJMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwgMHgxYTM1LCAweGE3YmMsIDB4ZmYwMCwgMHg4NzNmLCAweDg3MzgsCisJMHg4NzNmLCAweGE3ODQsIDB4MGYwMCwgMHgwMGMwLCAweDFhMzUsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsCisJMHgyMDYxLCAweDAwMDAsIDB4NjAxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgxYTU5LCAweDIwOTEsCisJMHg4MDAwLCAweDc4ZTAsIDB4NzhlMywgMHgwMDAwLCAweDIwOTEsIDB4ODAwMSwgMHhhMDA1LCAweDAwYzAsCisJMHgxYTVhLCAweDAwN2MsIDB4YTA4YywgMHhmZmYwLCAweDAwNDAsIDB4MWE2MCwgMHgxMDc4LCAweDIzZWIsCisJMHgwMDc5LCAweDFhNjIsIDB4MWE3MiwgMHgxYTc1LCAweDFhN2IsIDB4MWE3ZiwgMHgxYTczLCAweDFhODMsCisJMHgxYTg5LCAweDFhNzMsIDB4MWE3MywgMHgxYzI5LCAweDFjNGQsIDB4MWM1MSwgMHgxYTczLCAweDFhNzMsCisJMHgxYTczLCAweDFhNzMsIDB4MDA3YywgMHgxMDc4LCAweDIzZWIsIDB4MTA3OCwgMHgxYTJiLCAweDIwMDEsCisJMHg4MDAxLCAweDAwNzgsIDB4MWM1NywgMHgyMDAxLCAweDgwMDMsIDB4MDA3OCwgMHgxYzU3LCAweDIwMDEsCisJMHg4MDA0LCAweDAwNzgsIDB4MWM1NywgMHgxMDc4LCAweDFhMmIsIDB4MjAwMSwgMHg4MDA2LCAweDAwNzgsCisJMHgxYzU3LCAweDIwMDEsIDB4ODAwNywgMHgwMDc4LCAweDFjNTcsIDB4MjAzMCwgMHgyMTM4LCAweGE3ODIsCisJMHgwMDIxLCAweDAwNDgsIDB4MWE5NSwgMHgyMDA5LCAweDAwMjAsIDB4MjYwMCwgMHgxMDc4LCAweDFhYWYsCisJMHgwMGMwLCAweDFhYWUsIDB4YTdiYSwgMHgwMDIwLCAweDAwNDgsIDB4MWFhZCwgMHgwMDQwLCAweDFhYWQsCisJMHgyNzA4LCAweGE2YjAsIDB4MDAyMCwgMHhhMjkwLCAweDAwNDAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsCisJMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHgwMDc4LCAweDFhOGYsIDB4YTAwNiwgMHgwMDdjLCAweDgxZmYsCisJMHgwMDQwLCAweDFhZWEsIDB4MjA5OSwgMHgwMDMwLCAweDIwYTAsIDB4NzAwYywgMHhhMDg0LCAweDAwZmYsCisJMHgwMDQwLCAweDFhYzEsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsCisJMHgxYWJjLCAweDIxYTgsIDB4NzAxNywgMHgwMDAwLCAweDgxMGIsIDB4NzExMiwgMHg3MjFhLCAweDczMWUsCisJMHg3NDIyLCAweDc1MjYsIDB4NzgwYywgMHhhMDg1LCAweDAwMDEsIDB4NzAwMiwgMHg3MDA3LCAweDAwMDEsCisJMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDBjOCwgMHgxYWRlLCAweDIwMDksCisJMHgwMDIyLCAweDIxMDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwYzAsIDB4MWFkMCwgMHg3MDA4LCAweDgwMGIsCisJMHgwMGM4LCAweDFhZDAsIDB4NzAwNywgMHgwMDAyLCAweGEwOGMsIDB4MDFlMCwgMHgwMGMwLCAweDFhZWEsCisJMHg1M2E1LCAweGEwMDYsIDB4NzAwMywgMHgwMDAwLCAweDAwN2MsIDB4MjAzMCwgMHgyMTM4LCAweGE3ODIsCisJMHgwMDIxLCAweDAwNDgsIDB4MWFmNSwgMHgyMDA5LCAweDAwMjAsIDB4MjYwMCwgMHgxMDc4LCAweDFiMGYsCisJMHgwMGMwLCAweDFiMGUsIDB4YTdiYSwgMHgwMDIwLCAweDAwNDgsIDB4MWIwZCwgMHgwMDQwLCAweDFiMGQsCisJMHgyNzA4LCAweGE2YjAsIDB4MDAyMCwgMHhhMjkwLCAweDAwNDAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsCisJMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHgwMDc4LCAweDFhZWYsIDB4YTAwNiwgMHgwMDdjLCAweDgxZmYsCisJMHgwMDQwLCAweDFiNTAsIDB4MjA5OCwgMHgyMGExLCAweDAwMzAsIDB4NzAwYywgMHhhMDg0LCAweDAwZmYsCisJMHgwMDQwLCAweDFiMjEsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsCisJMHgxYjFjLCAweDIxYTgsIDB4NzAxNywgMHgwMDAwLCAweDgxMGIsIDB4NzExMiwgMHg3MjFhLCAweDczMWUsCisJMHg3NDIyLCAweDc1MjYsIDB4NzgwYywgMHhhMDg1LCAweDAwMDAsIDB4NzAwMiwgMHg1M2E2LCAweDcwMDcsCisJMHgwMDAxLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMGM4LCAweDFiM2YsCisJMHgyMDA5LCAweDAwMjIsIDB4MjEwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDBjMCwgMHgxYjMxLCAweDcwMTAsCisJMHhhMDg0LCAweGYwMDAsIDB4MDA0MCwgMHgxYjQ4LCAweDcwMDcsIDB4MDAwOCwgMHgwMDc4LCAweDFiNGMsCisJMHg3MTA4LCAweDgxMDMsIDB4MDBjOCwgMHgxYjMxLCAweDcwMDcsIDB4MDAwMiwgMHhhMTg0LCAweDAxZTAsCisJMHg3MDAzLCAweDAwMDAsIDB4MDA3YywgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDQsCisJMHgwMGM4LCAweDFiNWMsIDB4MDA3OCwgMHgxYjVmLCAweGEwMDYsIDB4MDA3OCwgMHgxYjYxLCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweDUxMDAsIDB4MmQwOCwgMHg3MDU4LCAweDY4MDIsCisJMHhhMDA1LCAweDAwYzAsIDB4MWI2YywgMHg3MTVlLCAweDcxNWEsIDB4MGU3ZiwgMHgwMDdjLCAweDJjMDgsCisJMHg3ODU4LCAweDYwMDIsIDB4YTAwNSwgMHgwMGMwLCAweDFiNzYsIDB4Nzk1ZSwgMHg3OTVhLCAweDAwN2MsCisJMHgyMDkxLCAweDgwMDAsIDB4NjAwMywgMHgwMDAwLCAweDJjMDgsIDB4Nzg1YywgMHhhMDY1LCAweDAwYzAsCisJMHgxYjg0LCAweDc5NWEsIDB4MDA3OCwgMHgxYjg1LCAweDYxMDIsIDB4Nzk1ZSwgMHgyMDkxLCAweDgwMDEsCisJMHgxMDc4LCAweDIxZWYsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4NTEwMCwgMHg3MDU4LCAweGEwNmQsCisJMHgwMDQwLCAweDFiOTksIDB4NjgwMCwgMHg3MDVhLCAweGEwMDUsIDB4MDBjMCwgMHgxYjk4LCAweDcwNWUsCisJMHg4ZGZmLCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweDBjN2UsIDB4MGY3ZSwgMHgyMDc5LCAweDUxMDAsCisJMHhhZjgwLCAweDAwMTYsIDB4MjA2MCwgMHg2MDAwLCAweGEwMDUsIDB4MDA0MCwgMHgxYmM5LCAweDIwNjgsCisJMHg2ODE0LCAweGEzMDYsIDB4MDBjMCwgMHgxYmIyLCAweDY4MjgsIDB4YTA4NCwgMHgwMGZmLCAweGE0MDYsCisJMHgwMDQwLCAweDFiYjUsIDB4MmQ2MCwgMHgwMDc4LCAweDFiYTMsIDB4NjgwMCwgMHhhMDA1LCAweDYwMDIsCisJMHgwMGMwLCAweDFiYzEsIDB4YWY4MCwgMHgwMDE2LCAweGFjMDYsIDB4MDA0MCwgMHgxYmMwLCAweDJjMDAsCisJMHg3ODVlLCAweDBkN2UsIDB4Njg5YywgMHhhMDA1LCAweDAwNDAsIDB4MWJjOCwgMHgxMDc4LCAweDE5YjMsCisJMHgwMDdmLCAweDBmN2YsIDB4MGM3ZiwgMHgwZDdmLCAweGEwMDUsIDB4MDA3YywgMHgwZDdlLCAweDBjN2UsCisJMHgwZjdlLCAweDIwNzksIDB4NTEwMCwgMHhhZjgwLCAweDAwMTYsIDB4MjA2MCwgMHg2MDAwLCAweGEwMDUsCisJMHgwMDQwLCAweDFiZjgsIDB4MjA2OCwgMHg2ODE0LCAweGEwODQsIDB4MDBmZiwgMHhhMzA2LCAweDAwNDAsCisJMHgxYmU0LCAweDJkNjAsIDB4MDA3OCwgMHgxYmQ2LCAweDY4MDAsIDB4YTAwNSwgMHg2MDAyLCAweDAwYzAsCisJMHgxYmYwLCAweGFmODAsIDB4MDAxNiwgMHhhYzA2LCAweDAwNDAsIDB4MWJlZiwgMHgyYzAwLCAweDc4NWUsCisJMHgwZDdlLCAweDY4OWMsIDB4YTAwNSwgMHgwMDQwLCAweDFiZjcsIDB4MTA3OCwgMHgxOWIzLCAweDAwN2YsCisJMHgwZjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHhhMDA1LCAweDAwN2MsIDB4MGQ3ZSwgMHgwYzdlLCAweDBmN2UsCisJMHgyMDc5LCAweDUxMDAsIDB4YWY4MCwgMHgwMDE2LCAweDIwNjAsIDB4NjAwMCwgMHhhMDZkLCAweDAwNDAsCisJMHgxYzI0LCAweDY4MTQsIDB4YTMwNiwgMHgwMDQwLCAweDFjMTAsIDB4MmQ2MCwgMHgwMDc4LCAweDFjMDUsCisJMHg2ODAwLCAweGEwMDUsIDB4NjAwMiwgMHgwMGMwLCAweDFjMWMsIDB4YWY4MCwgMHgwMDE2LCAweGFjMDYsCisJMHgwMDQwLCAweDFjMWIsIDB4MmMwMCwgMHg3ODVlLCAweDBkN2UsIDB4Njg5YywgMHhhMDA1LCAweDAwNDAsCisJMHgxYzIzLCAweDEwNzgsIDB4MTliMywgMHgwMDdmLCAweDBmN2YsIDB4MGM3ZiwgMHgwZDdmLCAweGEwMDUsCisJMHgwMDdjLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDUxNDAsIDB4NjgwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDFjMzcsIDB4MjA5MSwgMHg4MDAxLCAweDc4ZTMsIDB4MDAwOSwgMHgwMDdjLCAweDY4ODAsCisJMHhhMGJjLCAweGZmMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMTAsCisJMHgxMDc4LCAweDE5ODAsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwgMHgxYzQwLCAweDIwOTEsCisJMHg4MDAxLCAweDIwMDEsIDB4ODAwYSwgMHgwMDc4LCAweDFjNTcsIDB4MjAwMSwgMHg4MDBjLCAweDAwNzgsCisJMHgxYzU3LCAweDEwNzgsIDB4MWEyYiwgMHgyMDAxLCAweDgwMGQsIDB4MDA3OCwgMHgxYzU3LCAweDcwYzIsCisJMHgyMDYxLCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLCAweDYwMDQsCisJMHgyYzA4LCAweDIwNjMsIDB4MDAwMCwgMHg3ODg0LCAweDgwMDAsIDB4Nzg4NiwgMHg3ODg4LCAweGEwMDUsCisJMHg3OThhLCAweDAwNDAsIDB4MWM2ZSwgMHgyYzAyLCAweDAwNzgsIDB4MWM2ZiwgMHg3OThlLCAweDAwN2MsCisJMHg2ODA3LCAweDAxMDMsIDB4MGM3ZSwgMHgyMDYxLCAweDUxMDAsIDB4MmQwOCwgMHgyMDZiLCAweDAwMDAsCisJMHg2MDg0LCAweDgwMDAsIDB4NjA4NiwgMHg2MDg4LCAweGEwMDUsIDB4NjE4YSwgMHgwMDQwLCAweDFjODMsCisJMHgyZDAyLCAweDAwNzgsIDB4MWM4NCwgMHg2MThlLCAweDBjN2YsIDB4MDA3YywgMHgxMDc4LCAweDFjOTcsCisJMHgwMDQwLCAweDFjOTYsIDB4MGM3ZSwgMHg2MDljLCAweGEwNjUsIDB4MDA0MCwgMHgxYzkxLCAweDEwNzgsCisJMHgxOWIzLCAweDBjN2YsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MTk0OCwgMHgwMDdjLCAweDc4OGMsCisJMHhhMDY1LCAweDAwNDAsIDB4MWNhOSwgMHgyMDkxLCAweDgwMDAsIDB4Nzg4NCwgMHg4MDAxLCAweDc4ODYsCisJMHgyYzA0LCAweDc4OGUsIDB4YTAwNSwgMHgwMGMwLCAweDFjYTcsIDB4Nzg4YSwgMHg4MDAwLCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsIDB4ODAwNCwgMHg4MDg2LCAweDgxOGUsCisJMHgwMGM4LCAweDFjYjMsIDB4YTIwMCwgMHgwMDcwLCAweDFjYjcsIDB4MDA3OCwgMHgxY2FlLCAweDgwODYsCisJMHg4MThlLCAweDAwN2MsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDFjZGQsCisJMHhhMTFhLCAweDAwYzgsIDB4MWNkZCwgMHg4MjEzLCAweDgxOGQsIDB4MDA0OCwgMHgxY2NlLCAweGExMWEsCisJMHgwMGM4LCAweDFjY2YsIDB4MDA3MCwgMHgxY2Q1LCAweDAwNzgsIDB4MWNjMywgMHhhMTFhLCAweDIzMDgsCisJMHg4MjEwLCAweDAwNzAsIDB4MWNkNSwgMHgwMDc4LCAweDFjYzMsIDB4MDA3ZSwgMHgzMjAwLCAweGEwODQsCisJMHhmN2ZmLCAweDIwODAsIDB4MDA3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MDA3ZSwgMHgzMjAwLCAweGEwODUsCisJMHgwODAwLCAweDAwNzgsIDB4MWNkOSwgMHg3OTk0LCAweDcwZDAsIDB4YTEwNiwgMHgwMDQwLCAweDFkNTEsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgwMDIwLCAweDcwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDFkNTEsCisJMHg3MDA4LCAweDcyMDgsIDB4YTIwNiwgMHgwMGMwLCAweDFkNTEsIDB4YTI4NiwgMHgwMDA4LCAweDAwYzAsCisJMHgxZDUxLCAweDIwNzEsIDB4MDAxMCwgMHgxMDc4LCAweDE5MmUsIDB4MDA0MCwgMHgxZDUxLCAweDdhOWMsCisJMHg3Yjk4LCAweDdjYTQsIDB4N2RhMCwgMHhhMTg0LCAweGZmMDAsIDB4MDA0MCwgMHgxZDFmLCAweDIwMzEsCisJMHgwMDAwLCAweDgxMGIsIDB4ODZiNSwgMHg4MTBiLCAweDg2YjUsIDB4ODEwYiwgMHg4NmI1LCAweDgxMGIsCisJMHg4NmI1LCAweDgxMGIsIDB4ODZiNSwgMHg4MTBiLCAweDg2YjUsIDB4MjEwMCwgMHhhMjEwLCAweDI2MDAsCisJMHhhMzE5LCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3OCwgMHgxZDI5LCAweDgxMDcsCisJMHg4MDA0LCAweDgwMDQsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksCisJMHgwMDAwLCAweDIwMDksIDB4MDAyMCwgMHgxMDc4LCAweDE5MjksIDB4MjA5MSwgMHg4MDAxLCAweDAwNDAsCisJMHgxZDQ4LCAweDEwNzgsIDB4MTk0OCwgMHg3OGE4LCAweDgwMDAsIDB4NzhhYSwgMHhhMDg2LCAweDAwMDIsCisJMHgwMGMwLCAweDFkNTEsIDB4MjA5MSwgMHg4MDAwLCAweDc4ZTMsIDB4MDAwMiwgMHg3OGFiLCAweDAwMDAsCisJMHg3OGNjLCAweGEwODUsIDB4MDAwMywgMHg3OGNlLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDFkNTEsCisJMHg3OGFiLCAweDAwMDAsIDB4MTA3OCwgMHgyMGFjLCAweDYwMDQsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksCisJMHgxZDU2LCAweDIwNzEsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgxZDY2LCAweDFkODgsCisJMHgxZGFlLCAweDFkNjYsIDB4MWRjYiwgMHgxZDc1LCAweDFmMmMsIDB4MWY0NywgMHgxZDY2LCAweDFkODIsCisJMHgxZGE4LCAweDFlMTMsIDB4MWU4MiwgMHgxZWQyLCAweDFlZTQsIDB4MWY0MywgMHgyMDM5LCAweDA0MDAsCisJMHg3OGRjLCAweGE3MDUsIDB4NzhkZSwgMHg2MDA4LCAweGE3MDUsIDB4NjAwYSwgMHgxMDc4LCAweDFmYzcsCisJMHg2MDljLCAweDc4ZGEsIDB4MTA3OCwgMHgyMDk0LCAweDAwN2MsIDB4NzhkYywgMHhhMDg0LCAweDAxMDAsCisJMHgwMDQwLCAweDFkN2MsIDB4MDA3OCwgMHgxZDY2LCAweDYwMWMsIDB4YTA4NSwgMHgwMDgwLCAweDYwMWUsCisJMHgwMDc4LCAweDFkOGYsIDB4MTA3OCwgMHgxYjUzLCAweDAwYzAsIDB4MWQ2NiwgMHgxMDc4LCAweDIwYzYsCisJMHg3OGRjLCAweGEwODQsIDB4MDEwMCwgMHgwMDQwLCAweDFkOGYsIDB4MDA3OCwgMHgxZDY2LCAweDc4ZGYsCisJMHgwMDAwLCAweDYwMDQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4NzhkMiwgMHg4MDAxLCAweDYwOWYsCisJMHgwMDAwLCAweDAwNDAsIDB4MWRhNSwgMHgxMDc4LCAweDFmYzcsIDB4MDA0MCwgMHgxZGE1LCAweDc4ZGMsCisJMHhhMDg1LCAweDAxMDAsIDB4NzhkZSwgMHgwMDc4LCAweDFkYTcsIDB4MTA3OCwgMHgxZmViLCAweDAwN2MsCisJMHgxMDc4LCAweDFiNTMsIDB4MDBjMCwgMHgxZDY2LCAweDEwNzgsIDB4MjBjMiwgMHg3OGRjLCAweGEwOGMsCisJMHgwZTAwLCAweDAwYzAsIDB4MWRiNywgMHhhMDg0LCAweDAxMDAsIDB4MDBjMCwgMHgxZGI5LCAweDAwNzgsCisJMHgxZDY2LCAweDEwNzgsIDB4MWZjNywgMHgwMGMwLCAweDFkY2EsIDB4NjEwNCwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDcsIDB4MDA0MCwgMHgxZjg0LCAweGExODYsIDB4MDAwZiwgMHgwMDQwLCAweDFmODQsCisJMHgxMDc4LCAweDFmZWIsIDB4MDA3YywgMHg3OGRjLCAweGEwODQsIDB4MDEwMCwgMHgwMDQwLCAweDFkZDIsCisJMHgwMDc4LCAweDFkNjYsIDB4NzhkZiwgMHgwMDAwLCAweDY3MTQsIDB4MjAxMSwgMHgwMDAxLCAweDIwYTksCisJMHgwMDAxLCAweDYwMTgsIDB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDA0MCwgMHgxZGY1LCAweDIwMTEsCisJMHgwMDAxLCAweGE3YmMsIDB4ZmYwMCwgMHgyMGE5LCAweDAwMjAsIDB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsCisJMHgxZGY1LCAweDIwMzksIDB4MDAwMCwgMHgyMDExLCAweDAwMDIsIDB4MjBhOSwgMHgwMTAwLCAweGEwOGUsCisJMHgwMDAyLCAweDAwNDAsIDB4MWRmNSwgMHgwMDc4LCAweDFlMTAsIDB4MTA3OCwgMHgxOTczLCAweDIwOTEsCisJMHg4MDAwLCAweDY4MmIsIDB4MDAwMCwgMHg2ODJmLCAweDAwMDAsIDB4NjgwOCwgMHhhMDg0LCAweGZmZGUsCisJMHg2ODBhLCAweGFkZTgsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3MCwgMHgxZTA5LCAweDAwNzgsCisJMHgxZGY3LCAweDgyMTEsIDB4MDA0MCwgMHgxZTEwLCAweDIwYTksIDB4MDEwMCwgMHgwMDc4LCAweDFkZjcsCisJMHgxMDc4LCAweDE5NDgsIDB4MDA3YywgMHgyMDAxLCAweDUxNjcsIDB4MjAwNCwgMHhhMDg0LCAweDgwMDAsCisJMHgwMDQwLCAweDFmYWMsIDB4NjExNCwgMHgxMDc4LCAweDIwZTMsIDB4NjkwMCwgMHhhMTg0LCAweDAwMDEsCisJMHgwMDQwLCAweDFlMzQsIDB4NjAyOCwgMHhhMDg0LCAweDAwZmYsIDB4MDBjMCwgMHgxZmE0LCAweDY4MDAsCisJMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxZmFjLCAweDY4MDMsIDB4MDAwMCwgMHg2ODBiLCAweDAwMDAsCisJMHg2ODA3LCAweDAwMDAsIDB4MDA3OCwgMHgxZmI0LCAweDIwMTEsIDB4MDAwMSwgMHg2MDIwLCAweGQwZjQsCisJMHgwMDQwLCAweDFlM2MsIDB4YTI5NSwgMHgwMDAyLCAweGQwYzQsIDB4MDA0MCwgMHgxZTQxLCAweGEyOTUsCisJMHgwMDA4LCAweGQwY2MsIDB4MDA0MCwgMHgxZTQ2LCAweGEyOTUsIDB4MDQwMCwgMHg2MDFjLCAweGEwODQsCisJMHgwMDAyLCAweDAwNDAsIDB4MWU0ZCwgMHhhMjk1LCAweDAwMDQsIDB4NjAyYywgMHhhMDhjLCAweDAwZmYsCisJMHhhMTgyLCAweDAwMDIsIDB4MDA0OCwgMHgxZmIwLCAweGExODIsIDB4MDAxYiwgMHgwMGM4LCAweDFmYjAsCisJMHgwMDQwLCAweDFmYjAsIDB4NjkwZSwgMHg2MDJjLCAweDgwMDcsIDB4YTA4YywgMHgwMGZmLCAweGExODIsCisJMHgwMDAyLCAweDAwNDgsIDB4MWZiMCwgMHhhMTgyLCAweDAwMWIsIDB4MDBjOCwgMHgxZmIwLCAweDAwNDAsCisJMHgxZmIwLCAweDY5MTIsIDB4NjAzMCwgMHhhMDA1LCAweDAwYzAsIDB4MWU3MCwgMHgyMDAxLCAweDAwMWUsCisJMHg4MDAwLCAweDY4MTYsIDB4NjAyOCwgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHgxZmFjLCAweDY4MDYsCisJMHg2MDI4LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4MWZhYywgMHg2ODBhLCAweDZhMDIsCisJMHgwMDc4LCAweDFmYjQsIDB4MjAwMSwgMHg1MTY3LCAweDIwMDQsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsCisJMHgxZmFjLCAweDYxMTQsIDB4MTA3OCwgMHgyMGUzLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA0LCAweDZiMDgsCisJMHg2NDE4LCAweGE0ODQsIDB4MDAwMywgMHgwMDQwLCAweDFlYTgsIDB4NjEyOCwgMHhhMThjLCAweDAwZmYsCisJMHg4MDAxLCAweDAwYzAsIDB4MWVhMSwgMHgyMTAwLCAweGEyMTAsIDB4MDA0OCwgMHgxZWNlLCAweDAwNzgsCisJMHgxZWE4LCAweDgwMDEsIDB4MDBjMCwgMHgxZWNlLCAweDIxMDAsIDB4YTIxMiwgMHgwMDQ4LCAweDFlY2UsCisJMHhhNDg0LCAweDAwMGMsIDB4MDA0MCwgMHgxZWMyLCAweDYxMjgsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsCisJMHhhMDgyLCAweDAwMDQsIDB4MDBjMCwgMHgxZWJhLCAweDIxMDAsIDB4YTMxOCwgMHgwMDQ4LCAweDFlY2UsCisJMHgwMDc4LCAweDFlYzIsIDB4YTA4MiwgMHgwMDA0LCAweDAwYzAsIDB4MWVjZSwgMHgyMTAwLCAweGEzMWEsCisJMHgwMDQ4LCAweDFlY2UsIDB4NjAzMCwgMHhhMDA1LCAweDAwNDAsIDB4MWVjOCwgMHg4MDAwLCAweDY4MTYsCisJMHg2YTA2LCAweDZiMGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWZiNCwgMHgyMDkxLCAweDgwMDEsCisJMHgwMDc4LCAweDFmYjAsIDB4NjExNCwgMHgxMDc4LCAweDIwZTMsIDB4MjA5MSwgMHg4MDAwLCAweDZiMDgsCisJMHg4MzE4LCAweDAwNDgsIDB4MWVlMCwgMHg2YjBhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDFmYzMsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZmIwLCAweDYwMjQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsCisJMHgwMDQwLCAweDFmMDIsIDB4YTA4NiwgMHgwMDgwLCAweDAwYzAsIDB4MWYyYSwgMHgyMGE5LCAweDAwMDgsCisJMHgyMDY5LCAweDc1MTAsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDAsIDB4YTA4NCwgMHhmY2ZmLCAweDY4MDIsCisJMHhhZGU4LCAweDAwMDgsIDB4MDA3MCwgMHgxZWZlLCAweDAwNzgsIDB4MWVmNCwgMHgyMDkxLCAweDgwMDEsCisJMHgwMDc4LCAweDFmYjQsIDB4NjAyOCwgMHhhMDE1LCAweDAwNDAsIDB4MWYyYSwgMHg2MTE0LCAweDEwNzgsCisJMHgyMGUzLCAweDBkN2UsIDB4YWRlOCwgMHgwMDA3LCAweDIwOTEsIDB4ODAwMCwgMHg2ODAwLCAweGEwMGQsCisJMHgwMDQwLCAweDFmMjcsIDB4YTIwNiwgMHgwMDQwLCAweDFmMTgsIDB4MjE2OCwgMHgwMDc4LCAweDFmMGUsCisJMHgwYzdlLCAweDIxNjAsIDB4NjAwMCwgMHg2ODAyLCAweDEwNzgsIDB4MTk0OCwgMHgwYzdmLCAweDBkN2YsCisJMHg2ODA4LCAweDgwMDAsIDB4NjgwYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZmMzLCAweDIwOTEsCisJMHg4MDAxLCAweDBkN2YsIDB4MDA3OCwgMHgxZmFjLCAweDYxMTQsIDB4MTA3OCwgMHgyMGUzLCAweDY4MDAsCisJMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxZjljLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA0LCAweDgyMTAsCisJMHgwMDQ4LCAweDFmM2YsIDB4NmEwNiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZmMzLCAweDIwOTEsCisJMHg4MDAxLCAweDAwNzgsIDB4MWZiMCwgMHgxMDc4LCAweDFiNTMsIDB4MDBjMCwgMHgxZDY2LCAweDYxMTQsCisJMHgxMDc4LCAweDIwZTMsIDB4NjBiZSwgMHg2MGJiLCAweDAwMDAsIDB4NjkwMCwgMHhhMTg0LCAweDAwMDgsCisJMHgwMDQwLCAweDFmNTYsIDB4NjAyMCwgMHhhMDg1LCAweDAxMDAsIDB4NjAyMiwgMHhhMTg0LCAweDAwMDEsCisJMHgwMDQwLCAweDFmYWMsIDB4YTE4NCwgMHgwMTAwLCAweDAwYzAsIDB4MWY5OCwgMHhhMTg0LCAweDAyMDAsCisJMHgwMGMwLCAweDFmOTQsIDB4NjgxYywgMHhhMDA1LCAweDAwYzAsIDB4MWZhMCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwZiwgMHgwMGMwLCAweDFmNmYsIDB4MTA3OCwgMHgyMGM2LCAweDc4ZGYsCisJMHgwMDAwLCAweDYwMDQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4NzhkMiwgMHg4MDAxLCAweDYwOWYsCisJMHgwMDAwLCAweDAwNDAsIDB4MWY4NCwgMHgxMDc4LCAweDFmYzcsIDB4MDA0MCwgMHgxZjg0LCAweDc4ZGMsCisJMHhhMDg1LCAweDAxMDAsIDB4NzhkZSwgMHgwMDdjLCAweDc4ZDcsIDB4MDAwMCwgMHg3OGRiLCAweDAwMDAsCisJMHg2MDI0LCAweGEwODQsIDB4ZmYwMCwgMHg2MDI2LCAweDEwNzgsIDB4MzlkZSwgMHgwMDQwLCAweDFjZTMsCisJMHgxMDc4LCAweDFiNzgsIDB4MDA3OCwgMHgxY2UzLCAweDIwMDksIDB4MDAxNywgMHgwMDc4LCAweDFmYjYsCisJMHgyMDA5LCAweDAwMGUsIDB4MDA3OCwgMHgxZmI2LCAweDIwMDksIDB4MDAwNywgMHgwMDc4LCAweDFmYjYsCisJMHgyMDA5LCAweDAwMzUsIDB4MDA3OCwgMHgxZmI2LCAweDIwMDksIDB4MDAzZSwgMHgwMDc4LCAweDFmYjYsCisJMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHgxZmI2LCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDFmYjYsCisJMHgyMDA5LCAweDAwMTYsIDB4MDA3OCwgMHgxZmI2LCAweDIwMDksIDB4MDAwMSwgMHg2MDI0LCAweGEwODQsCisJMHhmZjAwLCAweGExMDUsIDB4NjAyNiwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxYzVmLCAweDIwOTEsCisJMHg4MDAxLCAweDAwNzgsIDB4MWNlMywgMHgxMDc4LCAweDE5NDgsIDB4MDA3OCwgMHgxY2UzLCAweDc4ZDQsCisJMHhhMDZkLCAweDAwYzAsIDB4MWZkMiwgMHgyYzAwLCAweDc4ZDYsIDB4NzhkYSwgMHg2MDlmLCAweDAwMDAsCisJMHgwMDc4LCAweDFmZGUsIDB4MmMwMCwgMHg2ODllLCAweDYwOWYsIDB4MDAwMCwgMHg3OGQ2LCAweDJkMDAsCisJMHg2MDAyLCAweDc4ZDgsIDB4YWQwNiwgMHgwMGMwLCAweDFmZGUsIDB4NjAwMiwgMHg3OGQwLCAweDgwMDEsCisJMHg3OGQyLCAweDAwYzAsIDB4MWZlYSwgMHg3OGRjLCAweGEwODQsIDB4ZmVmZiwgMHg3OGRlLCAweDc4ZDgsCisJMHgyMDYwLCAweGEwMDYsIDB4MDA3YywgMHhhMDJlLCAweDI1MzAsIDB4NjExYywgMHg2MWEyLCAweGExODQsCisJMHhlMWZmLCAweDYwMWUsIDB4YTE4NCwgMHgwMDYwLCAweDAwNDAsIDB4MWZmYSwgMHgwZTdlLCAweDEwNzgsCisJMHg0N2MyLCAweDBlN2YsIDB4NjU5NiwgMHg2NWE2LCAweDY2OWEsIDB4NjZhYSwgMHg2MGFmLCAweDAwMDAsCisJMHg2MGIzLCAweDAwMDAsIDB4NjcxNCwgMHgxMDc4LCAweDE5NzMsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTAsCisJMHhhMDg0LCAweDgwMDAsIDB4MDBjMCwgMHgyMDIxLCAweDY4MDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsCisJMHgyMDIxLCAweDIwOTEsIDB4ODAwMSwgMHgxMDc4LCAweDE5YzAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxYzVmLCAweDIwOTEsIDB4ODAwMSwgMHg3OGQ3LCAweDAwMDAsIDB4NzhkYiwgMHgwMDAwLCAweDAwNzgsCisJMHgyMDkzLCAweDYwMjQsIDB4YTA5NiwgMHgwMDAxLCAweDAwYzAsIDB4MjAyOCwgMHg4MDAwLCAweDYwMjYsCisJMHg2YTEwLCAweDY4MTQsIDB4MjA5MSwgMHg4MDAxLCAweGEyMDIsIDB4MDA0OCwgMHgyMDM3LCAweDAwNDAsCisJMHgyMDM3LCAweDIwMzksIDB4MDIwMCwgMHgxMDc4LCAweDIwOTQsIDB4MDA3OCwgMHgyMDkzLCAweDJjMDgsCisJMHgyMDkxLCAweDgwMDAsIDB4NjBhMCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyMDY0LCAweDY4MDAsCisJMHhhMDY1LCAweDAwNDAsIDB4MjA2OSwgMHg2YTA0LCAweDBlN2UsIDB4MjA3MSwgMHg1MTQwLCAweDcwMDAsCisJMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgyMDVlLCAweDcwNDgsIDB4YTIwNiwgMHgwMGMwLCAweDIwNWUsCisJMHg2YjA0LCAweDIzMWMsIDB4MjE2MCwgMHg2MzAyLCAweDIzMDAsIDB4YTAwNSwgMHgwMGMwLCAweDIwNTksCisJMHg2OTAyLCAweDIyNjAsIDB4NjEwMiwgMHgwZTdmLCAweDAwNzgsIDB4MjA3MCwgMHgyMTYwLCAweDYyMDIsCisJMHg2OTA2LCAweDBlN2YsIDB4MDA3OCwgMHgyMDcwLCAweDY4MDAsIDB4YTA2NSwgMHgwMDQwLCAweDIwNjksCisJMHg2MTAyLCAweDY5MDIsIDB4MDBjMCwgMHgyMDZkLCAweDY5MDYsIDB4MjE2MCwgMHg2MDAzLCAweDAwMDAsCisJMHgyMTYwLCAweDYwYTAsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjA3YSwgMHg2ODA4LCAweGEwODQsCisJMHhmZmZjLCAweDY4MGEsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjA5MSwgMHg4MDAxLCAweDY4MDgsCisJMHhhMDhjLCAweDAwNDAsIDB4MDA0MCwgMHgyMDg5LCAweGEwODYsIDB4MDA0MCwgMHg2ODBhLCAweDEwNzgsCisJMHgxOWQxLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDIxZDIsIDB4MjA5MSwgMHg4MDAxLCAweDc4ZGIsCisJMHgwMDAwLCAweDc4ZDcsIDB4MDAwMCwgMHgwMDdjLCAweDYwMDgsIDB4YTcwNSwgMHg2MDBhLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4MWM1ZiwgMHgyMDkxLCAweDgwMDEsIDB4NzhkOCwgMHhhMDY1LCAweDAwNDAsCisJMHgyMGE3LCAweDYwOWMsIDB4NzhkYSwgMHg2MDlmLCAweDAwMDAsIDB4MDA3OCwgMHgyMDk3LCAweDc4ZDcsCisJMHgwMDAwLCAweDc4ZGIsIDB4MDAwMCwgMHgwMDdjLCAweDc5OTAsIDB4Nzg5NCwgMHg4MDAwLCAweGExMGEsCisJMHgwMGM4LCAweDIwYjMsIDB4YTAwNiwgMHg3ODk2LCAweDcwZDIsIDB4NzgwNCwgMHhhMDA1LCAweDAwNDAsCisJMHgyMGMxLCAweDgwMDEsIDB4NzgwNiwgMHgwMGMwLCAweDIwYzEsIDB4MDA2OCwgMHgyMGMxLCAweDIwOTEsCisJMHg0MDgwLCAweDAwN2MsIDB4MjAzOSwgMHgyMGRhLCAweDAwNzgsIDB4MjBjOCwgMHgyMDM5LCAweDIwZTAsCisJMHgyNzA0LCAweGEwMDUsIDB4MDA0MCwgMHgyMGQ5LCAweGFjMDAsIDB4MjA2OCwgMHg2YjA4LCAweDZjMGMsCisJMHg2OTEwLCAweDZhMTQsIDB4NjkwYSwgMHg2YTBlLCAweDZiMTIsIDB4NmMxNiwgMHg4NzM4LCAweDAwNzgsCisJMHgyMGM4LCAweDAwN2MsIDB4MDAwMywgMHgwMDA5LCAweDAwMGYsIDB4MDAxNSwgMHgwMDFiLCAweDAwMDAsCisJMHgwMDE1LCAweDAwMWIsIDB4MDAwMCwgMHgwYzdlLCAweDEwNzgsIDB4M2I2OSwgMHgyYzY4LCAweDBjN2YsCisJMHgwMDdjLCAweDAwMTAsIDB4MjE1YSwgMHgwMDY4LCAweDIxNWEsIDB4MjAyOSwgMHgwMDAwLCAweDc4Y2IsCisJMHgwMDAwLCAweDc4OGMsIDB4YTA2NSwgMHgwMDQwLCAweDIxNTMsIDB4MjAwOSwgMHg1MTc0LCAweDIxMDQsCisJMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgyMTIxLCAweDYwMDQsIDB4YTA4NiwgMHgwMTAzLCAweDAwYzAsCisJMHgyMTIxLCAweDYwMTgsIDB4YTAwNSwgMHgwMGMwLCAweDIxMjEsIDB4NjAxNCwgMHhhMDA1LCAweDAwYzAsCisJMHgyMTIxLCAweDBkN2UsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsCisJMHgyMTIwLCAweDYwMGMsIDB4NzBjNiwgMHg2MDEwLCAweDcwY2EsIDB4NzBjMywgMHg4MDIwLCAweDY4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwZDdmLCAweDEwNzgsIDB4MWM4NiwgMHgwMDc4LCAweDIxNTgsCisJMHgwZDdmLCAweDEwNzgsIDB4MjE1YiwgMHgwMDQwLCAweDIxNTMsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsCisJMHhhMjk2LCAweDAwMDMsIDB4MDA0MCwgMHgyMTMzLCAweDYyMDQsIDB4YTI5NiwgMHgwMTEwLCAweDAwYzAsCisJMHgyMTQxLCAweDc4Y2IsIDB4MDAwMSwgMHg2MjA0LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweDgyMTEsCisJMHgwMDQwLCAweDIxNDEsIDB4ODVmZiwgMHgwMGMwLCAweDIxNTMsIDB4ODIxMCwgMHhhMjAyLCAweDAwYzgsCisJMHgyMTUzLCAweDA1N2UsIDB4MTA3OCwgMHgyMTZhLCAweDA1N2YsIDB4MDA0MCwgMHgyMTRlLCAweDc4ZTAsCisJMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHgyMTUzLCAweDAwNzgsIDB4MjE0MSwgMHg4NTI4LCAweDc4YzgsCisJMHhhMDA1LCAweDAwNDAsIDB4MjBmMSwgMHg4NWZmLCAweDAwNDAsIDB4MjE1YSwgMHgyMDkxLCAweDQwODAsCisJMHg3OGIwLCAweDcwZDYsIDB4MDA3YywgMHg3YmFjLCAweDc5YjAsIDB4NzBkNCwgMHhhMTAyLCAweDAwYzAsCisJMHgyMTY0LCAweDIzMDAsIDB4YTAwNSwgMHgwMDdjLCAweDAwNDgsIDB4MjE2OCwgMHhhMzAyLCAweDAwN2MsCisJMHg4MDAyLCAweDAwN2MsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwYzgsCisJMHgyMTg0LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDAwMjAsIDB4NzAwNCwgMHhhMDA1LCAweDAwYzAsCisJMHgyMWI5LCAweDcwMDgsIDB4NzIwOCwgMHhhMjA2LCAweDAwYzAsIDB4MjFiOSwgMHhhMjg2LCAweDAwMDgsCisJMHgwMGMwLCAweDIxYjksIDB4MjA3MSwgMHgwMDEwLCAweDEwNzgsIDB4MjFiZSwgMHgyMDA5LCAweDAwMjAsCisJMHg2MDA0LCAweGEwODYsIDB4MDEwMywgMHgwMGMwLCAweDIxOTMsIDB4NjAyOCwgMHhhMDA1LCAweDAwYzAsCisJMHgyMTkzLCAweDIwMDksIDB4MDAwYywgMHgxMDc4LCAweDE5MjQsIDB4MDA0MCwgMHgyMWFjLCAweDc4YzQsCisJMHg4MDAwLCAweDc4YzYsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MjFiOSwgMHgyMDkxLCAweDgwMDAsCisJMHg3OGUzLCAweDAwMDMsIDB4NzhjNywgMHgwMDAwLCAweDc4Y2MsIDB4YTA4NSwgMHgwMzAwLCAweDc4Y2UsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgyMWI5LCAweDc4YzcsIDB4MDAwMCwgMHgxMDc4LCAweDFjODYsCisJMHg3OWFjLCAweDc4YjAsIDB4ODAwMCwgMHhhMTBhLCAweDAwYzgsIDB4MjFiNywgMHhhMDA2LCAweDc4YjIsCisJMHhhMDA2LCAweDIwNzEsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg4MTA3LCAweDgwMDQsCisJMHg4MDA0LCAweDdhYjgsIDB4N2JiNCwgMHg3Y2MwLCAweDdkYmMsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsCisJMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDAwN2MsIDB4MjAwOSwgMHg1MTViLCAweDIwOTEsCisJMHg4MDAwLCAweDIwMGEsIDB4MGY3ZSwgMHgwZTdlLCAweDIwNzEsIDB4NTE0MCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDAwYzAsIDB4MjFlYywgMHgyMDA5LCAweDUxMTIsIDB4MjEwNCwgMHhhMDA1LCAweDAwYzAsCisJMHgyMWVjLCAweDIwNzksIDB4MDEwMCwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDIxZWMsCisJMHgwMDE4LCAweDIxZWMsIDB4NzgxYiwgMHgwMDRiLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBmN2UsCisJMHgwZTdlLCAweDIwNzEsIDB4NTE0MCwgMHgyMDkxLCAweDgwMDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMGMwLCAweDIyMDUsIDB4MjA3OSwgMHgwMTAwLCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsCisJMHgyMjA1LCAweDAwMTgsIDB4MjIwNSwgMHg3ODFiLCAweDAwNGQsIDB4MjA5MSwgMHg4MDAxLCAweDBlN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsIDB4MjA3MSwgMHg1MTQwLCAweDIwNzksCisJMHgwMTAwLCAweDc4NGIsIDB4MDAwZiwgMHgwMDk4LCAweDIyMTgsIDB4NzgzOCwgMHgwMDc4LCAweDIyMTEsCisJMHgyMGE5LCAweDAwNDAsIDB4NzgwMCwgMHhhMDgyLCAweDAwMDQsIDB4MDA0OCwgMHgyMjIxLCAweDIwYTksCisJMHgwMDYwLCAweDc4OWIsIDB4MDAwMCwgMHg3OGFmLCAweDAwMDAsIDB4NzhhZiwgMHgwMDAwLCAweDAwNzAsCisJMHgyMjJiLCAweDAwNzgsIDB4MjIyMywgMHg3ODAwLCAweGEwODIsIDB4MDAwNCwgMHgwMDQ4LCAweDIyM2EsCisJMHg3MGI3LCAweDAwOTYsIDB4MjAxOSwgMHg0ZWU3LCAweDEwNzgsIDB4MjI3NiwgMHg3MDJmLCAweDgwMDEsCisJMHgwMDc4LCAweDIyNDYsIDB4NzBiNywgMHgwMDAwLCAweDIwMTksIDB4NGQ1ZiwgMHgxMDc4LCAweDIyNzYsCisJMHgyMDE5LCAweDRkOWUsIDB4MTA3OCwgMHgyMjc2LCAweDcwMmYsIDB4ODAwMCwgMHg3MDAzLCAweDAwMDAsCisJMHgxMDc4LCAweDIzN2YsIDB4NzAwNCwgMHhhMDg0LCAweDAwMGYsIDB4MDE3ZSwgMHgyMDA5LCAweDA0ZmQsCisJMHgyMTBjLCAweGExOGEsIDB4MDAwNSwgMHgwMDQ4LCAweDIyNWIsIDB4MDAzOCwgMHgyMjYxLCAweGEwODUsCisJMHg2MjgwLCAweDAwNzgsIDB4MjI2MywgMHgwMDI4LCAweDIyNjEsIDB4YTA4NSwgMHg2MjgwLCAweDAwNzgsCisJMHgyMjYzLCAweGEwODUsIDB4NjJjMCwgMHgwMTdmLCAweDc4MDYsIDB4NzgwZiwgMHhiMjA0LCAweDc4NDMsCisJMHgwMGQ4LCAweDc4NTMsIDB4MDA4MCwgMHg3ODBiLCAweDAwMDgsIDB4NzA0NywgMHgwMDA4LCAweDcwNTMsCisJMHg1MTdmLCAweDcwNGYsIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgxMzdlLCAweDE0N2UsCisJMHgxNTdlLCAweDA0N2UsIDB4MjBhMSwgMHgwMTJiLCAweDIzMDQsIDB4YTAwNSwgMHg3ODlhLCAweDAwNDAsCisJMHgyMjk2LCAweDgzMTgsIDB4MjMyNCwgMHg4MzE4LCAweDIzOTgsIDB4MjRhOCwgMHhhNDg0LCAweGZmMDAsCisJMHgwMDQwLCAweDIyOGUsIDB4YTQ4MiwgMHgwMTAwLCAweDIwYTksIDB4MDEwMCwgMHgyMDIwLCAweDUzYTYsCisJMHhhMDA1LCAweDAwYzAsIDB4MjI4NSwgMHgzMzE4LCAweDAwNzgsIDB4MjI3YywgMHgwNDdmLCAweDE1N2YsCisJMHgxNDdmLCAweDEzN2YsIDB4MDA3YywgMHhhMThjLCAweDAwMGYsIDB4MjAxMSwgMHgwMTAxLCAweDIyMDQsCisJMHhhMDg0LCAweGZmZjAsIDB4YTEwNSwgMHgyMDEyLCAweDEwNzgsIDB4MjM3ZiwgMHgwMDdjLCAweDIwMTEsCisJMHgwMTAxLCAweDIwYTksIDB4MDAwOSwgMHg4MTBiLCAweDAwNzAsIDB4MjJiMCwgMHgwMDc4LCAweDIyYWIsCisJMHhhMThjLCAweDBlMDAsIDB4MjIwNCwgMHhhMDg0LCAweGYxZmYsIDB4YTEwNSwgMHgyMDEyLCAweDAwN2MsCisJMHgyMDA5LCAweDAxMDEsIDB4MjBhOSwgMHgwMDA1LCAweDgyMTMsIDB4MDA3MCwgMHgyMmMxLCAweDAwNzgsCisJMHgyMmJjLCAweGEyOTQsIDB4MDBlMCwgMHgyMTA0LCAweGEwODQsIDB4ZmYxZiwgMHhhMjA1LCAweDIwMGEsCisJMHgwMDdjLCAweDIwMTEsIDB4MDEwMSwgMHgyMGE5LCAweDAwMGMsIDB4ODEwYiwgMHgwMDcwLCAweDIyZDIsCisJMHgwMDc4LCAweDIyY2QsIDB4YTE4YywgMHhmMDAwLCAweDIyMDQsIDB4YTA4NCwgMHgwZmZmLCAweGExMDUsCisJMHgyMDEyLCAweDAwN2MsIDB4MjAxMSwgMHgwMTAyLCAweDIyMDQsIDB4YTA4NCwgMHhmZmNmLCAweGExMDUsCisJMHgyMDEyLCAweDAwN2MsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHgwYzdlLCAweDIwNjEsCisJMHgwMTAwLCAweDYwOWEsIDB4NjJhYywgMHg2M2FjLCAweDBjN2YsIDB4MDA3YywgMHg4MTAzLCAweDgwMDMsCisJMHhhMDgwLCAweDAwMjIsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjA5YSwgMHg2MGE0LCAweGEwODQsCisJMHhmZmRmLCAweDYwYWUsIDB4MGM3ZiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjIsCisJMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDlhLCAweDYwYTQsIDB4YTA4NSwgMHgwMDIwLCAweDYwYWUsCisJMHgwYzdmLCAweDAwN2MsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHgwYzdlLCAweDIwNjEsCisJMHgwMTAwLCAweDYwOWEsIDB4NjBhNCwgMHg2MmFlLCAweDIwMTAsIDB4NjBhNCwgMHg2M2FlLCAweDIwMTgsCisJMHgwYzdmLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MGU3ZSwgMHg2ODE4LCAweGEwMDUsCisJMHgwMDQwLCAweDIzNWQsIDB4MjA2MSwgMHg3NTAwLCAweDEwNzgsIDB4MjM2NSwgMHgwMDQwLCAweDIzNDksCisJMHgyMGE5LCAweDAwMDAsIDB4MjA2MSwgMHg3NDAwLCAweDBjN2UsIDB4MTA3OCwgMHgyMzY1LCAweDAwNDAsCisJMHgyMzM5LCAweDBjN2YsIDB4OGM2MCwgMHgwMDcwLCAweDIzMzcsIDB4MDA3OCwgMHgyMzJjLCAweDAwNzgsCisJMHgyMzVkLCAweDAwN2YsIDB4YTA4MiwgMHg3NDAwLCAweDIwNzEsIDB4NTE0MCwgMHg3MDg2LCAweDcxODIsCisJMHgyMDAxLCAweDAwMDQsIDB4NzA2ZSwgMHg3MDkzLCAweDAwMGYsIDB4MTA3OCwgMHgyMWNkLCAweDAwNzgsCisJMHgyMzU5LCAweDYwYzAsIDB4YTAwNSwgMHgwMGMwLCAweDIzNWQsIDB4MjA3MSwgMHg1MTQwLCAweDcxODIsCisJMHgyYzAwLCAweDcwOGEsIDB4MjAwMSwgMHgwMDA2LCAweDcwNmUsIDB4NzA5MywgMHgwMDBmLCAweDEwNzgsCisJMHgyMWNkLCAweDIwMDEsIDB4MDAwMCwgMHgwMDc4LCAweDIzNWYsIDB4MjAwMSwgMHgwMDAxLCAweDIwOTEsCisJMHg4MDAxLCAweGEwMDUsIDB4MGU3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MmMwNCwgMHhhMDA1LCAweDAwNDAsCisJMHgyMzdjLCAweDIwNjAsIDB4NjAwYywgMHhhMzA2LCAweDAwYzAsIDB4MjM3OSwgMHg2MDEwLCAweGEyMDYsCisJMHgwMGMwLCAweDIzNzksIDB4NjAxNCwgMHhhMTA2LCAweDAwYzAsIDB4MjM3OSwgMHhhMDA2LCAweDAwNzgsCisJMHgyMzdlLCAweDYwMDAsIDB4MDA3OCwgMHgyMzY2LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDIwMTEsCisJMHg1MTQxLCAweDIyMGMsIDB4YTE4YywgMHgwMDBmLCAweDIwMTEsIDB4MDEzYiwgMHgyMjA0LCAweGEwODQsCisJMHgwMTAwLCAweDAwNDAsIDB4MjM5NSwgMHgyMDIxLCAweGZmMDQsIDB4MjEyMiwgMHg4MTBiLCAweDgxMGIsCisJMHg4MTBiLCAweDgxMGIsIDB4YTE4ZCwgMHgwZjAwLCAweDIxMDQsIDB4MDA3YywgMHgwZTdlLCAweDY4ZTQsCisJMHhhMDhjLCAweDAwMjAsIDB4MDA0MCwgMHgyM2U5LCAweGEwODQsIDB4MDAwNiwgMHgwMGMwLCAweDIzZTksCisJMHg2MDE0LCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZjAsCisJMHg1MzgwLCAweDcwMDQsIDB4YTA4NCwgMHgwMDBhLCAweDAwYzAsIDB4MjNlOSwgMHg3MTA4LCAweGExOTQsCisJMHhmZjAwLCAweDAwNDAsIDB4MjNlOSwgMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHgwMDBjLCAweGExMDYsCisJMHgwMDQwLCAweDIzZDAsIDB4MjAwMSwgMHgwMDEyLCAweGExMDYsIDB4MDA0MCwgMHgyM2Q0LCAweDIwMDEsCisJMHgwMDE0LCAweGExMDYsIDB4MDA0MCwgMHgyM2Q4LCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LCAweDAwNDAsCisJMHgyM2RjLCAweDIwMDEsIDB4MDAzMiwgMHhhMTA2LCAweDAwNDAsIDB4MjNlMCwgMHgwMDc4LCAweDIzZTQsCisJMHgyMDA5LCAweDAwMTIsIDB4MDA3OCwgMHgyM2U2LCAweDIwMDksIDB4MDAxNCwgMHgwMDc4LCAweDIzZTYsCisJMHgyMDA5LCAweDAwMTksIDB4MDA3OCwgMHgyM2U2LCAweDIwMDksIDB4MDAyMCwgMHgwMDc4LCAweDIzZTYsCisJMHgyMDA5LCAweDAwM2YsIDB4MDA3OCwgMHgyM2U2LCAweDIwMTEsIDB4MDAwMCwgMHgyMTAwLCAweGEyMDUsCisJMHg3MDBhLCAweDBlN2YsIDB4MDA3YywgMHgwMDY4LCAweDIzZWIsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHgwMDAwLCAweDAwN2UsIDB4NzAxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyM2YyLCAweDAwN2YsCisJMHgyMDcxLCAweDAwMTAsIDB4NzBjYSwgMHgwMDdmLCAweDcwYzYsIDB4NzBjMywgMHg4MDAyLCAweDcwZGIsCisJMHgwNzQxLCAweDcwZGYsIDB4MDAwMCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsCisJMHg0MDgwLCAweDAwNzgsIDB4MjQwOSwgMHgxMDdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsCisJMHg3ZjNjLCAweDdlNTgsIDB4N2MzMCwgMHg3ZDM4LCAweDc3YzIsIDB4NzRjNiwgMHg3NmNhLCAweDc1Y2UsCisJMHhhNTk0LCAweDAwM2YsIDB4YTQ5YywgMHgwMDAzLCAweGE0ODQsIDB4MDAwZiwgMHgwMDc5LCAweDI0MjAsCisJMHgyNDMyLCAweDI0MzIsIDB4MjQzMiwgMHgyNzZjLCAweDM5M2IsIDB4MjQzMCwgMHgyNDYxLCAweDI0NmIsCisJMHgyNDMwLCAweDI0MzAsIDB4MjQzMCwgMHgyNDMwLCAweDI0MzAsIDB4MjQzMCwgMHgyNDMwLCAweDI0MzAsCisJMHgxMDc4LCAweDIzZWIsIDB4ODUwNywgMHhhMDg0LCAweDAwMWYsIDB4MDA3OSwgMHgyNDM3LCAweDI0NzUsCisJMHgyNzZjLCAweDI5MjYsIDB4MmEyMywgMHgyYTRiLCAweDJjZWQsIDB4MmY5OCwgMHgyZmRiLCAweDMwMjYsCisJMHgzMGFiLCAweDMxNjMsIDB4MzIwYywgMHgyNDYxLCAweDI4NDgsIDB4MmY2ZCwgMHgyNDU3LCAweDNjYzgsCisJMHgzY2U4LCAweDNlYWUsIDB4M2ViYSwgMHgzZjhmLCAweDI0NTcsIDB4MjQ1NywgMHg0MDYyLCAweDQwNjYsCisJMHgzY2M2LCAweDI0NTcsIDB4M2UxOSwgMHgyNDU3LCAweDNiOGMsIDB4MjQ2YiwgMHgyNDU3LCAweDEwNzgsCisJMHgyM2ViLCAweDAwMTgsIDB4MjQxMCwgMHgxMjdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdmLCAweDEwN2YsCisJMHgwMDdjLCAweDIwMTksIDB4NGUzYiwgMHgxMDc4LCAweDIyNzYsIDB4NzAyZiwgMHgwMDAxLCAweDc4MWIsCisJMHgwMDRmLCAweDAwNzgsIDB4MjQ1OSwgMHgyMDE5LCAweDRkOWUsIDB4MTA3OCwgMHgyMjc2LCAweDcwMmYsCisJMHg4MDAwLCAweDc4MWIsIDB4MDBkMCwgMHgwMDc4LCAweDI0NTksIDB4NzI0MiwgMHgyMDA5LCAweDUxMGYsCisJMHgyMDBiLCAweDAwMDAsIDB4YTU4NCwgMHgwMDAxLCAweDAwYzAsIDB4M2JhMCwgMHgwMDQwLCAweDI0OTIsCisJMHgxMDc4LCAweDIzZWIsIDB4NzAwMywgMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDAsCisJMHg3MDM3LCAweDAwMDAsIDB4MTA3OCwgMHgzOTEyLCAweDAwMTgsIDB4MjQxMCwgMHgyMDA5LCAweDUxMGYsCisJMHgyMDBiLCAweDAwMDAsIDB4NzA2OCwgMHhhMDA1LCAweDAwYzAsIDB4MjU1ZCwgMHg3MDZjLCAweGEwODQsCisJMHgwMDA3LCAweDAwNzksIDB4MjQ5YiwgMHgyNTk0LCAweDI0YTMsIDB4MjRhZiwgMHgyNGNjLCAweDI0ZWUsCisJMHgyNTNiLCAweDI1MTQsIDB4MjRhMywgMHgxMDc4LCAweDM4ZmEsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsCisJMHgyZTM5LCAweDAwYzAsIDB4MjRhZCwgMHg3MDAzLCAweDAwMDQsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsCisJMHgzOGZhLCAweDAwYzAsIDB4MjRjYSwgMHg3MDgwLCAweDgwMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsCisJMHg3OGFiLCAweDAwMGMsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMSwgMHg3ODViLCAweDAwMDQsCisJMHgyMDA5LCAweDAwZTAsIDB4MTA3OCwgMHgyZTJkLCAweDAwYzAsIDB4MjRjYSwgMHg3MDAzLCAweDAwMDQsCisJMHg3MDkzLCAweDAwMGYsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLCAweDI0ZWMsCisJMHg3MTgwLCAweDgxMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsIDB4YTE4YywgMHgwMDFmLCAweGExOGQsCisJMHgwMGMwLCAweDc5YWEsIDB4NzhhYiwgMHgwMDA2LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDIsCisJMHg3ODViLCAweDAwMDQsIDB4MjAwOSwgMHgwMGUwLCAweDEwNzgsIDB4MmUyZCwgMHgwMGMwLCAweDI0ZWMsCisJMHg3MDAzLCAweDAwMDQsIDB4NzA5MywgMHgwMDBmLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDM4ZmEsCisJMHgwMGMwLCAweDI1MTIsIDB4NzE4MCwgMHg4MTA3LCAweDc4ODIsIDB4Nzg5YiwgMHgwMDEwLCAweGExOGMsCisJMHgwMDFmLCAweGExOGQsIDB4MDBjMCwgMHg3OWFhLCAweDc4YWIsIDB4MDAyMCwgMHg3MTg0LCAweDc5YWEsCisJMHg3OGFiLCAweDAwMGQsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwNCwgMHg3ODViLCAweDAwMDQsCisJMHgyMDA5LCAweDAwZTAsIDB4MTA3OCwgMHgyZTJkLCAweDAwYzAsIDB4MjUxMiwgMHg3MDAzLCAweDAwMDQsCisJMHg3MDkzLCAweDAwMGYsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLCAweDI1MzksCisJMHg3MTgwLCAweDgxMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsIDB4YTE4YywgMHgwMDFmLCAweGExOGQsCisJMHgwMGMwLCAweDc5YWEsIDB4NzhhYiwgMHgwMDA2LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDIsCisJMHg3ODViLCAweDAwMDQsIDB4MjAwOSwgMHgwMGUwLCAweDEwNzgsIDB4MmUyZCwgMHgwMGMwLCAweDI1MzksCisJMHg3MDg4LCAweDcwOGIsIDB4MDAwMCwgMHgyMDY4LCAweDcwNGEsIDB4NzAwMywgMHgwMDAyLCAweDcwOTMsCisJMHgwMDBmLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDM4ZmEsIDB4MDBjMCwgMHgyNDU5LCAweDcwODgsCisJMHgyMDY4LCAweDZmMTQsIDB4MTA3OCwgMHgzN2VmLCAweDJjNTAsIDB4MTA3OCwgMHgzOWFjLCAweDc4OWIsCisJMHgwMDEwLCAweDY4MTQsIDB4YTA4NCwgMHgwMDFmLCAweGEwODUsIDB4MDA4MCwgMHg3OGFhLCAweDZlMWMsCisJMHgyMDQxLCAweDAwMDEsIDB4NzA4YywgMHhhMDg0LCAweDA0MDAsIDB4MjAwMSwgMHgwMDA0LCAweDAwNDAsCisJMHgyNTViLCAweDIwMDEsIDB4MDAwNiwgMHgwMDc4LCAweDI2N2MsIDB4MTA3OCwgMHgzOGZhLCAweDAwYzAsCisJMHgyNDU5LCAweDc4OWIsIDB4MDAxMCwgMHg3MDY4LCAweDIwNjgsIDB4NmYxNCwgMHgxMDc4LCAweDM3ZWYsCisJMHgyYzUwLCAweDEwNzgsIDB4MzlhYywgMHg2MDA4LCAweGEwODUsIDB4MDAxMCwgMHg2MDBhLCAweDY4MjQsCisJMHhhMDA1LCAweDAwNDAsIDB4MjU3YiwgMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHgyNTc5LCAweDAwNzgsCisJMHgyNTdiLCAweDY4MjcsIDB4MDAwNSwgMHg2YjE0LCAweGEzOWMsIDB4MDAxZiwgMHhhMzlkLCAweDAwYzAsCisJMHg3MDU4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI1ODksIDB4YTY4NCwgMHgwMDAxLCAweDAwNDAsCisJMHgyNThiLCAweGEzOWMsIDB4ZmZiZiwgMHg3YmFhLCAweDIwMzEsIDB4MDAyMCwgMHgyMDQxLCAweDAwMDEsCisJMHgyMDAxLCAweDAwMDMsIDB4MDA3OCwgMHgyNjdjLCAweDAwMTgsIDB4MjQxMCwgMHg3NDRjLCAweGE0ODUsCisJMHgwMDAwLCAweDAwNDAsIDB4MjVhZSwgMHhhMDgwLCAweDUxODAsIDB4MjAzMCwgMHg3MTUwLCAweDgxMDgsCisJMHhhMTJhLCAweDAwNDgsIDB4MjVhNSwgMHgyMDA5LCAweDUxODAsIDB4MjE2NCwgMHg2NTA0LCAweDg1ZmYsCisJMHgwMGMwLCAweDI1YmYsIDB4ODQyMSwgMHgwMGMwLCAweDI1OWYsIDB4NzE1MiwgMHg3MDAzLCAweDAwMDAsCisJMHg3MDRiLCAweDAwMDAsIDB4NzA0MCwgMHhhMDA1LCAweDAwNDAsIDB4M2JhMCwgMHgwMDc4LCAweDI0NTksCisJMHg3NjRjLCAweGE2YjAsIDB4NTE4MCwgMHg3MTUwLCAweDI2MDAsIDB4MDA3OCwgMHgyNWFhLCAweDcxNTIsCisJMHgyNTY4LCAweDI1NTgsIDB4NzU0YSwgMHgyYzUwLCAweDYwMzQsIDB4YTA4NSwgMHgwMDAwLCAweDAwYzAsCisJMHgyNWJjLCAweDY3MDgsIDB4NzczYSwgMHhhNzg0LCAweDAzM2YsIDB4MDA0MCwgMHgyNWY1LCAweGE3ODQsCisJMHgwMDIxLCAweDAwYzAsIDB4MjViYywgMHhhNzg0LCAweDAwMDIsIDB4MDA0MCwgMHgyNWRlLCAweGE3ODQsCisJMHgwMDA0LCAweDAwNDAsIDB4MjViYywgMHhhN2JjLCAweGZmZmIsIDB4NjcwYSwgMHhhNzg0LCAweDAwMDgsCisJMHgwMGMwLCAweDI1YmMsIDB4YTc4NCwgMHgwMDEwLCAweDAwYzAsIDB4MjViYywgMHhhNzg0LCAweDAyMDAsCisJMHgwMGMwLCAweDI1YmMsIDB4YTc4NCwgMHgwMTAwLCAweDAwNDAsIDB4MjVmNSwgMHg2MDE4LCAweGEwMDUsCisJMHgwMGMwLCAweDI1YmMsIDB4YTdiYywgMHhmZWZmLCAweDY3MGEsIDB4NjgyMywgMHgwMDAwLCAweDZlMWMsCisJMHhhNjg0LCAweDAwMGUsIDB4NjExOCwgMHgwMDQwLCAweDI2MDUsIDB4NjAxYywgMHhhMTAyLCAweDAwNDgsCisJMHgyNjA4LCAweDAwNDAsIDB4MjYwOCwgMHgwMDc4LCAweDI1YjgsIDB4ODFmZiwgMHgwMGMwLCAweDI1YjgsCisJMHg2OGMzLCAweDAwMDAsIDB4YTc4NCwgMHgwMDgwLCAweDAwYzAsIDB4MjYxMCwgMHg3MDBjLCAweDYwMjIsCisJMHhhN2JjLCAweGZmN2YsIDB4NjcwYSwgMHgxMDc4LCAweDM5YWMsIDB4MDAxOCwgMHgyNDEwLCAweDc4OWIsCisJMHgwMDEwLCAweGEwNDYsIDB4MTA3OCwgMHgzOGZhLCAweDAwYzAsIDB4MjQ1OSwgMHg2YjE0LCAweGEzOWMsCisJMHgwMDFmLCAweGEzOWQsIDB4MDBjMCwgMHg3MDU4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI2MmMsCisJMHhhNjg0LCAweDAwMDEsIDB4MDA0MCwgMHgyNjJlLCAweGEzOWMsIDB4ZmZiZiwgMHhhNjg0LCAweDAwMTAsCisJMHgwMDQwLCAweDI2MzQsIDB4YTM5ZCwgMHgwMDIwLCAweDdiYWEsIDB4ODg0MCwgMHhhNjg0LCAweDAwMGUsCisJMHgwMGMwLCAweDI2M2YsIDB4YTdiZCwgMHgwMDEwLCAweDY3MGEsIDB4MDA3OCwgMHgyNjdhLCAweDcxNTgsCisJMHhhMThjLCAweDA4MDAsIDB4MDA0MCwgMHgzNDAxLCAweDIwMTEsIDB4MDAyMCwgMHhhNjg0LCAweDAwMDgsCisJMHgwMGMwLCAweDI2NTAsIDB4ODIxMCwgMHhhNjg0LCAweDAwMDIsIDB4MDBjMCwgMHgyNjUwLCAweDgyMTAsCisJMHg3YWFhLCAweDg4NDAsIDB4MTA3OCwgMHgzOTEyLCAweDZhMTQsIDB4NjEwYywgMHg4MTA4LCAweGExOGMsCisJMHgwMGZmLCAweGExZTAsIDB4NzQwMCwgMHgyYzY0LCAweDhjZmYsIDB4MDA0MCwgMHgyNjcxLCAweDYwMTQsCisJMHhhMjA2LCAweDAwYzAsIDB4MjY1YiwgMHg2MGI4LCAweDgwMDEsIDB4NjBiYSwgMHgwMGMwLCAweDI2NTYsCisJMHgwYzdlLCAweDJhNjAsIDB4NjAwOCwgMHhhMDg1LCAweDAxMDAsIDB4NjAwYSwgMHgwYzdmLCAweDAwNzgsCisJMHgyNTk0LCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLCAweDI0NTksIDB4MmE2MCwgMHg2MTBlLCAweDc5YWEsCisJMHg4ODQwLCAweDcxMzIsIDB4MjAwMSwgMHgwMDAxLCAweDAwN2UsIDB4NzE1YywgMHhhMTg0LCAweDAwMTgsCisJMHgwMDQwLCAweDI2OTcsIDB4YTE4NCwgMHgwMDEwLCAweDAwNDAsIDB4MjY4YSwgMHgxMDc4LCAweDM2MDQsCisJMHgwMGMwLCAweDI2YmEsIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4MjY5NywgMHg2OWEwLCAweGExODQsCisJMHgwNjAwLCAweDAwYzAsIDB4MjY5NywgMHgxMDc4LCAweDM0ZjEsIDB4MDA3OCwgMHgyNmJhLCAweDY5YTAsCisJMHhhMTg0LCAweDA4MDAsIDB4MDA0MCwgMHgyNmFlLCAweDBjN2UsIDB4MDI3ZSwgMHgyOTYwLCAweDYwMDAsCisJMHhhMDg1LCAweDIwMDAsIDB4NjAwMiwgMHg2MTA0LCAweGExOGQsIDB4MDAxMCwgMHg2MTA2LCAweDAyN2YsCisJMHgwYzdmLCAweDEwNzgsIDB4MzYwNCwgMHgwMGMwLCAweDI2YmEsIDB4NjlhMCwgMHhhMTg0LCAweDAyMDAsCisJMHgwMDQwLCAweDI2YjYsIDB4MTA3OCwgMHgzNTQwLCAweDAwNzgsIDB4MjZiYSwgMHhhMTg0LCAweDA0MDAsCisJMHgwMGMwLCAweDI2OTMsIDB4NjlhMCwgMHhhMTg0LCAweDEwMDAsIDB4MDA0MCwgMHgyNmM1LCAweDY5MTQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgxMDc4LCAweDIyZWUsIDB4MDA3ZiwgMHg3MDAyLCAweGE2OGMsCisJMHgwMGUwLCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDI2ZDMsIDB4YTA4NiwgMHgwMDYwLCAweDAwYzAsCisJMHgyNmQzLCAweGExOGQsIDB4NDAwMCwgMHg4OGZmLCAweDAwNDAsIDB4MjZkOCwgMHhhMThkLCAweDAwMDQsCisJMHg3OTVhLCAweDY5YjYsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg3ODliLCAweDAwNjEsCisJMHg2ODE4LCAweGEwOGQsIDB4ODAwMCwgMHhhMDg0LCAweDdmZmYsIDB4NjkxYSwgMHhhNjhjLCAweDAwODAsCisJMHgwMDQwLCAweDI2ZjcsIDB4NzA5NywgMHgwMDAwLCAweGEwOGEsIDB4MDAwZCwgMHgwMDUwLCAweDI2ZjUsCisJMHhhMDhhLCAweDAwMGMsIDB4NzE5NiwgMHgyMDAxLCAweDAwMGMsIDB4ODAwYywgMHg3MTlhLCAweDc4YWEsCisJMHg4MDA4LCAweDgxMGMsIDB4MDA0MCwgMHgzNDA3LCAweGExOGMsIDB4MDBmOCwgMHgwMGMwLCAweDM0MDcsCisJMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsCisJMHg4MGFjLCAweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHg2ODE0LCAweDgwMDcsIDB4Nzg4MiwgMHg2ZDk0LCAweDdkZDYsIDB4N2RkZSwgMHg2ZTk4LCAweDdlZDIsCisJMHg3ZWRhLCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLCAweDI3MmUsIDB4NzAyYywgMHg4MDAzLCAweDAwNDgsCisJMHgyNzI3LCAweDIwMTksIDB4NGQ5ZSwgMHgxMDc4LCAweDIyNzYsIDB4NzAyZiwgMHg4MDAwLCAweDc4MzAsCisJMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgyNzJlLCAweDAwOTgsIDB4MjczNiwgMHg2MDA4LCAweGEwODQsCisJMHhmZmVmLCAweDYwMGEsIDB4MTA3OCwgMHgzOTEyLCAweDAwNzgsIDB4MjQ4MiwgMHg3MjAwLCAweGEyODQsCisJMHgwMDA3LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDI3NDMsIDB4NzgxYiwgMHgwMDRmLCAweDEwNzgsCisJMHgzOTEyLCAweDAwNzgsIDB4Mjc1NCwgMHg2YWI0LCAweGEyOTUsIDB4MjAwMCwgMHg3YTVhLCAweDc4MWIsCisJMHgwMDRmLCAweDEwNzgsIDB4MzkxMiwgMHg3MjAwLCAweDI1MDAsIDB4YTYwNSwgMHgwMDQwLCAweDI3NTQsCisJMHhhMjg0LCAweDAwMDcsIDB4MTA3OSwgMHgyNzYyLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweGEyODQsCisJMHgwMDA3LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDI0NTksIDB4NjAxOCwgMHg4MDAwLCAweDYwMWEsCisJMHgwMDc4LCAweDI0NTksIDB4Mjc2YSwgMHg0YTNhLCAweDRhM2EsIDB4NGEyOSwgMHg0YTNhLCAweDI3NmEsCisJMHg0YTI5LCAweDI3NmEsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4MzhmYSwgMHgwZjdlLCAweDIwNzksCisJMHg1MTAwLCAweDc4Y2MsIDB4MGY3ZiwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgyNzkwLCAweDcwNmMsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyNzdmLCAweDcwNmUsIDB4MDA3OCwgMHgyODIzLCAweDcwNmMsCisJMHhhMDg2LCAweDAwMDUsIDB4MDBjMCwgMHgyNzhlLCAweDcwODgsIDB4MjA2OCwgMHg2ODFiLCAweDAwMDQsCisJMHg2ODE3LCAweDAwMDAsIDB4NjgyMCwgMHhhMDg1LCAweDAwMDgsIDB4NjgyMiwgMHg3MDZmLCAweDAwMDAsCisJMHgyMDExLCAweDAwMDQsIDB4NzE2YywgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHgyN2IxLCAweGExODYsCisJMHgwMDA3LCAweDAwYzAsIDB4MjdhMSwgMHgyMDA5LCAweDUxMzgsIDB4MjAwYiwgMHgwMDA1LCAweDAwNzgsCisJMHgyN2IxLCAweDIwMDksIDB4NTExMywgMHgyMTA0LCAweDIwMDksIDB4NTExMiwgMHgyMDBhLCAweDIwMDksCisJMHg1MTM4LCAweDIwMGIsIDB4MDAwMSwgMHg3MDZmLCAweDAwMDAsIDB4NzA3MywgMHgwMDAxLCAweDAwNzgsCisJMHgyN2IzLCAweDcwNmYsIDB4MDAwMCwgMHgxMDc4LCAweDQ3NzYsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMTAsCisJMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHgzNmUyLCAweGE3YjgsIDB4MDEwMCwgMHgwMDcwLCAweDI3YzIsCisJMHgwMDc4LCAweDI3YmEsIDB4MTU3ZiwgMHg3MDAwLCAweDAwNzksIDB4MjdjNiwgMHgyN2Y0LCAweDI3ZGIsCisJMHgyN2RiLCAweDI3Y2UsIDB4MjdmNCwgMHgyN2Y0LCAweDI3ZjQsIDB4MjdmNCwgMHgyMDIxLCAweDUxNWEsCisJMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgyN2Y0LCAweGFkMDYsIDB4MDBjMCwgMHgyN2RiLCAweDY4MDAsCisJMHgyMDIyLCAweDAwNzgsIDB4MjdlYiwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDI3ZTcsCisJMHg2ZjE0LCAweDEwNzgsIDB4MzdlZiwgMHgxMDc4LCAweDMzZDgsIDB4MDA3OCwgMHgyN2ViLCAweDcwNjAsCisJMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHg2YTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODIwLCAweGEwODUsCisJMHgwMDA4LCAweDY4MjIsIDB4MTA3OCwgMHgxYzcwLCAweDIwMjEsIDB4NzUwMCwgMHgxMDc4LCAweDI4MzAsCisJMHgyMDIxLCAweDUxNWEsIDB4MTA3OCwgMHgyODMwLCAweDE1N2UsIDB4MjBhOSwgMHgwMDAwLCAweDIwMjEsCisJMHg3NDAwLCAweDEwNzgsIDB4MjgzMCwgMHg4NDIwLCAweDAwNzAsIDB4MjgwOCwgMHgwMDc4LCAweDI4MDEsCisJMHgyMDYxLCAweDU0MDAsIDB4MjAyMSwgMHgwMDAyLCAweDIwYTksIDB4MDEwMCwgMHg2MDE4LCAweDYxMTAsCisJMHg4MWZmLCAweDAwNDAsIDB4MjgxNywgMHhhMTAyLCAweDAwNTAsIDB4MjgxNywgMHg2MDEyLCAweDYwMWIsCisJMHgwMDAwLCAweGFjZTAsIDB4MDAxMCwgMHgwMDcwLCAweDI4MWYsIDB4MDA3OCwgMHgyODBlLCAweDg0MjEsCisJMHgwMGMwLCAweDI4MGMsIDB4MTU3ZiwgMHg3MDljLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI4MmEsCisJMHgxMDc4LCAweDNhMDAsIDB4NzAwMywgMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHgwMDc4LCAweDI0NTksCisJMHgwNDdlLCAweDI0MDQsIDB4YTAwNSwgMHgwMDQwLCAweDI4NDQsIDB4MjA2OCwgMHg2ODAwLCAweDAwN2UsCisJMHg2YTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODIwLCAweGEwODUsIDB4MDAwOCwgMHg2ODIyLCAweDEwNzgsCisJMHgxYzcwLCAweDAwN2YsIDB4MDA3OCwgMHgyODMyLCAweDA0N2YsIDB4MjAyMywgMHgwMDAwLCAweDAwN2MsCisJMHhhMjgyLCAweDAwMDMsIDB4MDA1MCwgMHgyODRlLCAweDEwNzgsIDB4MjNlYiwgMHgyMzAwLCAweDAwNzksCisJMHgyODUxLCAweDI4NTQsIDB4MjhjNywgMHgyOGU0LCAweGEyODIsIDB4MDAwMiwgMHgwMDQwLCAweDI4NWEsCisJMHgxMDc4LCAweDIzZWIsIDB4NzA2YywgMHg3MDZmLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDAwNzksCisJMHgyODYxLCAweDI4NjksIDB4Mjg2OSwgMHgyODZiLCAweDI4OWYsIDB4MzQwZCwgMHgyODY5LCAweDI4OWYsCisJMHgyODY5LCAweDEwNzgsIDB4MjNlYiwgMHg3NzgwLCAweDEwNzgsIDB4MzZlMiwgMHg3NzgwLCAweGE3YmMsCisJMHgwZjAwLCAweDEwNzgsIDB4MzdlZiwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyODk2LCAweDIwMjEsCisJMHg3NTAwLCAweDIwMDksIDB4MDAwNCwgMHgyMDExLCAweDAwMTAsIDB4MTA3OCwgMHgyOGZmLCAweDAwNDAsCisJMHgyODk2LCAweDE1N2UsIDB4MjBhOSwgMHgwMDAwLCAweDIwMjEsIDB4NzQwMCwgMHgwNDdlLCAweDIwMDksCisJMHgwMDA0LCAweDIwMTEsIDB4MDAxMCwgMHgxMDc4LCAweDI4ZmYsIDB4MDQ3ZiwgMHgwMDQwLCAweDI4OTUsCisJMHg4NDIwLCAweDAwNzAsIDB4Mjg5NSwgMHgwMDc4LCAweDI4ODYsIDB4MTU3ZiwgMHg4NzM4LCAweGE3ODQsCisJMHgwMDFmLCAweDAwYzAsIDB4Mjg3MSwgMHgwMDc4LCAweDI0ODIsIDB4MDA3OCwgMHgyNDgyLCAweDc3ODAsCisJMHgxMDc4LCAweDM3ZWYsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MjhjNSwgMHgyMDIxLCAweDc1MDAsCisJMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDIwLCAweDEwNzgsIDB4MjhmZiwgMHgwMDQwLCAweDI4YzUsCisJMHgxNTdlLCAweDIwYTksIDB4MDAwMCwgMHgyMDIxLCAweDc0MDAsIDB4MDQ3ZSwgMHgyMDA5LCAweDAwMDUsCisJMHgyMDExLCAweDAwMjAsIDB4MTA3OCwgMHgyOGZmLCAweDA0N2YsIDB4MDA0MCwgMHgyOGM0LCAweDg0MjAsCisJMHgwMDcwLCAweDI4YzQsIDB4MDA3OCwgMHgyOGI1LCAweDE1N2YsIDB4MDA3OCwgMHgyNDgyLCAweDIyMDAsCisJMHgwMDc5LCAweDI4Y2EsIDB4MjhjZCwgMHgyOGNmLCAweDI4Y2YsIDB4MTA3OCwgMHgyM2ViLCAweDIwMDksCisJMHgwMDEyLCAweDcwNmMsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4MjhkOCwgMHgyMDA5LCAweDAwMGUsCisJMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI4ZGUsIDB4NjkxYSwgMHg3MDZmLCAweDAwMDAsCisJMHg3MDczLCAweDAwMDEsIDB4MDA3OCwgMHgzODg4LCAweDIyMDAsIDB4MDA3OSwgMHgyOGU3LCAweDI4ZWMsCisJMHgyOGNmLCAweDI4ZWEsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4NDc3NiwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAxLCAweDAwYzAsIDB4MzM5ZCwgMHgxMDc4LCAweDMzZWUsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDEwNzgsIDB4MzM5MCwgMHgwMDQwLCAweDMzOWQsIDB4MDA3OCwgMHgyNTk0LCAweDI0MDQsCisJMHhhMDA1LCAweDAwNDAsIDB4MjkyMiwgMHgyMDY4LCAweDJkMDQsIDB4MDA3ZSwgMHg2ODE0LCAweGE3MDYsCisJMHgwMDQwLCAweDI5MGUsIDB4MmQyMCwgMHgwMDdmLCAweDAwNzgsIDB4MjkwMCwgMHgwMDdmLCAweDIwMjIsCisJMHg2OTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODIwLCAweGEyMDUsIDB4NjgyMiwgMHgxMDc4LCAweDFjNzAsCisJMHg2MDEwLCAweDgwMDEsIDB4NjAxMiwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLCAweDEwNzgsCisJMHgzM2VlLCAweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MjkyMSwgMHgyMzAwLCAweDAwNzksCisJMHgyOTI5LCAweDI5MmUsIDB4MjkyYywgMHgyOWM3LCAweDEwNzgsIDB4MjNlYiwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAxLCAweDAwYzAsIDB4Mjk0MiwgMHg3MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDI5M2EsCisJMHgwMDc4LCAweDI5NjUsIDB4MTA3OCwgMHgzM2VlLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsCisJMHgwMDc4LCAweDMzOWQsIDB4NzhlNCwgMHhhMDA1LCAweDAwZDAsIDB4Mjk2NSwgMHgwMDE4LCAweDI0NTksCisJMHgyMDA4LCAweGEwODQsIDB4MDAzMCwgMHgwMGMwLCAweDI5NTEsIDB4NzgxYiwgMHgwMDRmLCAweDAwNzgsCisJMHgyNDU5LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4Mjk0ZCwgMHgyMTAwLCAweGEwODQsCisJMHgwMDA3LCAweDAwNzksIDB4Mjk1YiwgMHgyOTllLCAweDI5YTksIDB4Mjk4ZiwgMHgyOTYzLCAweDM4ZWQsCisJMHgzOGVkLCAweDI5NjMsIDB4MjliOCwgMHgxMDc4LCAweDIzZWIsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsCisJMHgwMGMwLCAweDI5N2YsIDB4NzA2YywgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgyOTc1LCAweDIwMTEsCisJMHgwMDAyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LCAweDI4NDgsIDB4NzA2YywgMHhhMDg2LCAweDAwMDYsCisJMHgwMDQwLCAweDI5NmYsIDB4NzA2YywgMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHgyOTZmLCAweDc5ZTQsCisJMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgyOTg5LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsCisJMHgyOThiLCAweDAwNzgsIDB4MmY2ZCwgMHgyMDAxLCAweDAwMDMsIDB4MDA3OCwgMHgyZDAxLCAweDY4MTgsCisJMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyOTk2LCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LCAweDM2YzEsCisJMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHg2ODE4LCAweGEwODQsCisJMHg4MDAwLCAweDAwNDAsIDB4MjlhNSwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHgzNmMxLCAweDAwNzgsCisJMHgzOGI4LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjliMCwgMHg2ODFiLCAweDAwMWQsCisJMHgxMDc4LCAweDM2YzEsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDBjZCwgMHgwMDc4LCAweDI0NTksCisJMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI5YmYsIDB4NjgxYiwgMHgwMDFkLCAweDEwNzgsCisJMHgzNmMxLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwOGUsIDB4MDA3OCwgMHgyNDU5LCAweGE1ODQsCisJMHgwMDBmLCAweDAwYzAsIDB4MjllNCwgMHg3MDAwLCAweDAwNzksIDB4MjljZSwgMHgyNDgyLCAweDI5ZDgsCisJMHgyOWQ2LCAweDMzOWQsIDB4MzM5ZCwgMHgzMzlkLCAweDMzOWQsIDB4MjlkNiwgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDMzZWUsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgxMDc4LCAweDMzOTAsCisJMHgwMDQwLCAweDMzOWQsIDB4MDA3OCwgMHgyNTk0LCAweDc4ZTQsIDB4YTAwNSwgMHgwMGQwLCAweDI5NjUsCisJMHgwMDE4LCAweDI5NjUsIDB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MDBjMCwgMHgyOWYzLCAweDc4MWIsCisJMHgwMDRmLCAweDAwNzgsIDB4MjQ1OSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDI5ZWYsCisJMHgyMTAwLCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDI5ZmQsIDB4MmEwZiwgMHgyYTEzLCAweDJhMDcsCisJMHgyYTA1LCAweDM4ZWQsIDB4MzhlZCwgMHgyYTA1LCAweDM4ZTMsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsCisJMHgzNmM5LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsCisJMHgzNmM5LCAweDAwNzgsIDB4MzhiOCwgMHgxMDc4LCAweDM2YzksIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsCisJMHgwMGNkLCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDM2YzksIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsCisJMHgwMDhlLCAweDAwNzgsIDB4MjQ1OSwgMHgyMzAwLCAweDAwNzksIDB4MmEyNiwgMHgyYTJiLCAweDJhMjksCisJMHgyYTJkLCAweDEwNzgsIDB4MjNlYiwgMHgwMDc4LCAweDMwYWIsIDB4NjgxYiwgMHgwMDA4LCAweDc4YTMsCisJMHgwMDAwLCAweDc5ZTQsIDB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4MzBhYiwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDAwNDAsIDB4MzBhYiwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgyYTNmLCAweDJhNDcsCisJMHgyYTEzLCAweDI5OGYsIDB4Mzg4OCwgMHgzOGVkLCAweDM4ZWQsIDB4MmE0NywgMHgzOGUzLCAweDEwNzgsCisJMHgzODljLCAweDAwNzgsIDB4MjQ1OSwgMHhhMjgyLCAweDAwMDUsIDB4MDA1MCwgMHgyYTUxLCAweDEwNzgsCisJMHgyM2ViLCAweDIzMDAsIDB4MDA3OSwgMHgyYTU0LCAweDJhNTcsIDB4MmNhZSwgMHgyY2JjLCAweDIyMDAsCisJMHgwMDc5LCAweDJhNWEsIDB4MmE3NCwgMHgyYTYxLCAweDJhNzQsIDB4MmE1ZiwgMHgyYzkzLCAweDEwNzgsCisJMHgyM2ViLCAweDc4OWIsIDB4MDAxOCwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMjAsCisJMHgwMDQ4LCAweDM2OWQsIDB4YTA4YSwgMHgwMDA0LCAweDAwYzgsIDB4MzY5ZCwgMHgwMDc5LCAweDJhNzAsCisJMHgzNjlkLCAweDM2OWQsIDB4MzY5ZCwgMHgzNjRiLCAweDc4OWIsIDB4MDAxOCwgMHg3OWE4LCAweGExODQsCisJMHgwMDgwLCAweDAwNDAsIDB4MmE4NSwgMHgwMDc4LCAweDM2OWQsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsCisJMHgyYTdiLCAweDIwMTEsIDB4MDAwNCwgMHgwMDc4LCAweDMyMWYsIDB4YTE4NCwgMHgwMGZmLCAweGEwOGEsCisJMHgwMDEwLCAweDAwYzgsIDB4MzY5ZCwgMHgwMDc5LCAweDJhOGQsIDB4MmE5ZiwgMHgyYTlkLCAweDJhYjcsCisJMHgyYWJiLCAweDJiNzgsIDB4MzY5ZCwgMHgzNjlkLCAweDJiN2EsIDB4MzY5ZCwgMHgzNjlkLCAweDJjOGYsCisJMHgyYzhmLCAweDM2OWQsIDB4MzY5ZCwgMHgzNjlkLCAweDJjOTEsIDB4MTA3OCwgMHgyM2ViLCAweGE2ODQsCisJMHgxMDAwLCAweDAwNDAsIDB4MmFhYywgMHgyMDAxLCAweDA1MDAsIDB4ODAwMCwgMHg4MDAwLCAweDc4M2EsCisJMHg3ODFiLCAweDAwOGMsIDB4MDA3OCwgMHgyNDU5LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsCisJMHgyYWI1LCAweDY4MWIsIDB4MDAxZCwgMHgwMDc4LCAweDJhYTMsIDB4MDA3OCwgMHgzODg4LCAweDY4MWIsCisJMHgwMDFkLCAweDAwNzgsIDB4MzZhZCwgMHg2OTIwLCAweDY5MjIsIDB4YTY4NCwgMHgxODAwLCAweDAwYzAsCisJMHgyYWZjLCAweDY4MjAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MmIwNCwgMHg2ODE4LCAweGEwODYsCisJMHgwMDA4LCAweDAwYzAsIDB4MmFjZCwgMHg2ODFiLCAweDAwMDAsIDB4YTY4NCwgMHgwNDAwLCAweDAwNDAsCisJMHgyYjc0LCAweGE2ODQsIDB4MDA4MCwgMHgwMDQwLCAweDJhZjgsIDB4NzA5NywgMHgwMDAwLCAweDY4MTgsCisJMHhhMDg0LCAweDAwM2YsIDB4YTA4YSwgMHgwMDBkLCAweDAwNTAsIDB4MmFmOCwgMHhhMDhhLCAweDAwMGMsCisJMHg3MTk2LCAweDIwMDEsIDB4MDAwYywgMHg4MDBjLCAweDcxOWEsIDB4Nzg5YiwgMHgwMDYxLCAweDc4YWEsCisJMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsCisJMHg4MGFjLCAweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgyNDU5LCAweGE2ODQsIDB4MTAwMCwgMHgwMDQwLCAweDJiMDQsCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDJiNzAsCisJMHhhNjg0LCAweDA4MDAsIDB4MDA0MCwgMHgyYjcwLCAweGE2ODQsIDB4ODAwMCwgMHgwMGMwLCAweDJiMTIsCisJMHgwMDc4LCAweDJiMmMsIDB4YTZiNCwgMHg3ZmZmLCAweDdlNWEsIDB4NmViNiwgMHg3ODliLCAweDAwNzYsCisJMHg3YWFjLCAweDc5YWMsIDB4NzhhYywgMHg4MDFiLCAweDAwYzgsIDB4MmIxZiwgMHg4MDAwLCAweGEwODQsCisJMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDZiOTgsIDB4MjEwMCwgMHhhMzAyLCAweDY4YjIsCisJMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLCAweDJiMzQsCisJMHhhNmI0LCAweGJmZmYsIDB4N2U1YSwgMHg2ZWI2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHgyYjQxLCAweDEwNzgsIDB4NDgyYywgMHgxMDc4LCAweDRhMjksIDB4NzgxYiwgMHgwMDY0LCAweDAwNzgsCisJMHgyNDU5LCAweGEwMDYsIDB4MTA3OCwgMHg0YjMwLCAweDZhYjAsIDB4NjlhYywgMHg2Yzk4LCAweDZiOTQsCisJMHgyMjAwLCAweGExMDUsIDB4MDA0MCwgMHgyYjUwLCAweDIyMDAsIDB4YTQyMiwgMHgyMTAwLCAweGEzMWIsCisJMHg2Y2FhLCAweDdjZDIsIDB4N2NkYSwgMHg2YmE2LCAweDdiZDYsIDB4N2JkZSwgMHgyMzAwLCAweGE0MDUsCisJMHgwMGMwLCAweDJiNjIsIDB4YTZiNSwgMHg0MDAwLCAweDdlNWEsIDB4NmViNiwgMHg3ODFiLCAweDAwNjQsCisJMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDY0LCAweDIyMDAsIDB4YTExNSwgMHgwMGMwLCAweDJiNmMsCisJMHgxMDc4LCAweDRhM2EsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4NGE4NSwgMHgwMDc4LCAweDI0NTksCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDI0NTksCisJMHgxMDc4LCAweDIzZWIsIDB4MDA3OCwgMHgyYmRiLCAweDY5MjAsIDB4YTE4NCwgMHgwMTAwLCAweDAwNDAsCisJMHgyYjkyLCAweGExOGMsIDB4ZmVmZiwgMHg2OTIyLCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDAsCisJMHhhMDg0LCAweGVmZmYsIDB4NjAwMiwgMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LCAweDBjN2YsCisJMHgwMDc4LCAweDJiY2EsIDB4YTE4NCwgMHgwMjAwLCAweDAwNDAsIDB4MmJjYSwgMHhhMThjLCAweGZkZmYsCisJMHg2OTIyLCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDAsIDB4YTA4NCwgMHhkZmZmLCAweDYwMDIsCisJMHg2MDA0LCAweGEwODQsIDB4ZmZlZiwgMHg2MDA2LCAweDIwMDgsIDB4MmM0OCwgMHgwYzdmLCAweGExODQsCisJMHgwMDA4LCAweDAwNDAsIDB4MmJjYSwgMHgxMDc4LCAweDM3ZWIsIDB4MTA3OCwgMHgzNGYxLCAweDg4ZmYsCisJMHgwMDQwLCAweDJiY2EsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg3ZTU4LCAweGE2YjUsCisJMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmJjNCwgMHg3ODJiLCAweDMwMDgsCisJMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDU5LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNjUsCisJMHgwMDc4LCAweDI0NTksIDB4N2U1OCwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyYmQzLCAweDc4MWIsCisJMHgwMDU4LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDAwNzgsCisJMHgzNmE1LCAweDAwNzgsIDB4MzZhNSwgMHgyMDE5LCAweDAwMDAsIDB4Nzk5MCwgMHhhMThjLCAweDAwMDcsCisJMHgwMGMwLCAweDJiZTksIDB4NjgyMCwgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgyYmQ5LCAweDIwMDksCisJMHgwMDA4LCAweDc4OWIsIDB4MDAxMCwgMHg3OGE4LCAweGEwOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDEsCisJMHgwMGMwLCAweDJjMjAsIDB4MjMwMCwgMHg3Y2E4LCAweGE0MDAsIDB4MjAxOCwgMHhhMTAyLCAweDAwNDAsCisJMHgyYzE4LCAweDAwNDgsIDB4MmJmZCwgMHgwMDc4LCAweDJjMWEsIDB4YTM4MCwgMHgwMDAyLCAweGExMDIsCisJMHgwMGM4LCAweDJjMTgsIDB4NjkyMCwgMHhhMThjLCAweGZjZmYsIDB4NjkyMiwgMHgwYzdlLCAweDcwNTQsCisJMHgyMDYwLCAweDYwMDAsIDB4YTA4NCwgMHhlZmVmLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweGZmZTUsCisJMHg2MDA2LCAweDBjN2YsIDB4N2U1OCwgMHhhNmI0LCAweGZmZmIsIDB4N2U1YSwgMHgwMDc4LCAweDJiY2IsCisJMHgwMDc4LCAweDJiN2MsIDB4MjRhOCwgMHg3YWE4LCAweDAwZjAsIDB4MmMxYSwgMHgwMDc4LCAweDJiZWIsCisJMHhhMjg0LCAweDAwZjAsIDB4YTA4NiwgMHgwMDIwLCAweDAwYzAsIDB4MmM4MCwgMHg4MzE4LCAweDgzMTgsCisJMHgyMzAwLCAweGExMDIsIDB4MDA0MCwgMHgyYzMwLCAweDAwNDgsIDB4MmMzMCwgMHgwMDc4LCAweDJjN2QsCisJMHhhMjg2LCAweDAwMjMsIDB4MDA0MCwgMHgyYmQ5LCAweDY4MWMsIDB4YTA4NCwgMHhmZmYxLCAweDY4MWUsCisJMHg3ZTU4LCAweGE2ODQsIDB4ZmZmMSwgMHhhMDg1LCAweDAwMTAsIDB4MjAzMCwgMHg3ZTVhLCAweDYwMDgsCisJMHhhMDg1LCAweDAwMTAsIDB4NjAwYSwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDA0LCAweDIwMDgsCisJMHgyYzQ4LCAweDBjN2YsIDB4YTE4NCwgMHgwMDEwLCAweDAwNDAsIDB4MmM1NCwgMHgxMDc4LCAweDM3ZWIsCisJMHgxMDc4LCAweDM2MDQsIDB4MDA3OCwgMHgyYzYzLCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDQsCisJMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhhMTg0LCAweDAwMDgsIDB4MDA0MCwgMHgyYmNhLCAweDEwNzgsCisJMHgzN2ViLCAweDEwNzgsIDB4MzRmMSwgMHg4OGZmLCAweDAwNDAsIDB4MmJjYSwgMHg3ODliLCAweDAwNjAsCisJMHgyODAwLCAweDc4YWEsIDB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsCisJMHgyYzc3LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDU5LCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4N2FhOCwgMHgwMDc4LCAweDJiZWIsCisJMHg4MzE4LCAweDIzMDAsIDB4YTEwMiwgMHgwMDQwLCAweDJjODksIDB4MDA0OCwgMHgyYzg5LCAweDAwNzgsCisJMHgyYmViLCAweGEyODQsIDB4MDA4MCwgMHgwMGMwLCAweDM2YWQsIDB4MDA3OCwgMHgzNmE1LCAweDAwNzgsCisJMHgzNmFkLCAweDAwNzgsIDB4MzY5ZCwgMHg3ODliLCAweDAwMTgsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhlLCAweDAwMDEsIDB4MDA0MCwgMHgyYzllLCAweDEwNzgsIDB4MjNlYiwgMHg3YWE4LCAweGEyOTQsCisJMHgwMGZmLCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAwNCwgMHgwMGM4LCAweDM2OWQsCisJMHgwMDc5LCAweDJjYWEsIDB4MzY5ZCwgMHgzNDNlLCAweDM2OWQsIDB4MzU5OSwgMHhhMjgyLCAweDAwMDAsCisJMHgwMGMwLCAweDJjYjQsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4MzZjMSwgMHg3ODJiLCAweDMwMDgsCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweGEyODIsIDB4MDAwMywgMHgwMGMwLCAweDJjYzIsCisJMHgxMDc4LCAweDIzZWIsIDB4YTQ4NCwgMHg4MDAwLCAweDAwYzAsIDB4MmNlNSwgMHg3MDZjLCAweGEwMDUsCisJMHgwMDQwLCAweDJjY2MsIDB4MTA3OCwgMHgyM2ViLCAweDZmMTQsIDB4Nzc4MiwgMHhhN2JjLCAweDBmMDAsCisJMHgxMDc4LCAweDM3ZWYsIDB4NjAwOCwgMHhhMDg1LCAweDAwMjEsIDB4NjAwYSwgMHg4NzM4LCAweGE3ODQsCisJMHgwMDFmLCAweDAwYzAsIDB4MmNkMCwgMHgxMDc4LCAweDM2YzUsIDB4NzA2ZiwgMHgwMDAyLCAweDIwMDksCisJMHg1MTM4LCAweDIwMGIsIDB4MDAwOSwgMHgwMDc4LCAweDJjZTcsIDB4MTA3OCwgMHgzNmQxLCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4YTI4MiwgMHgwMDA0LCAweDAwNTAsCisJMHgyY2YzLCAweDEwNzgsIDB4MjNlYiwgMHgyMzAwLCAweDAwNzksIDB4MmNmNiwgMHgyY2Y5LCAweDJkZTIsCisJMHgyZTE1LCAweGEyODYsIDB4MDAwMywgMHgwMDQwLCAweDJjZmYsIDB4MTA3OCwgMHgyM2ViLCAweDIwMDEsCisJMHgwMDAwLCAweDAwN2UsIDB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4MmQwOCwgMHg3MDAzLCAweDAwMDMsCisJMHg2OGEwLCAweGEwODQsIDB4MjAwMCwgMHgwMDQwLCAweDJkMTEsIDB4NjAwOCwgMHhhMDg1LCAweDAwMDIsCisJMHg2MDBhLCAweDAwN2YsIDB4NzAzZSwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDJkMTgsCisJMHgyNDgyLCAweDJkMjIsIDB4MmQyMiwgMHgyZjE3LCAweDJmNTMsIDB4MjQ4MiwgMHgyZjUzLCAweDJkMjAsCisJMHgxMDc4LCAweDIzZWIsIDB4YTY4NCwgMHgxMDAwLCAweDAwYzAsIDB4MmQyYSwgMHgxMDc4LCAweDQ3NzYsCisJMHgwMDQwLCAweDJkYmMsIDB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHgyZDcyLCAweGExODYsCisJMHgwMDA4LCAweDAwYzAsIDB4MmQ0MSwgMHgxMDc4LCAweDMzZWUsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDEwNzgsIDB4MzM5MCwgMHgwMDQwLCAweDJkNzIsIDB4MTA3OCwgMHg0Nzc2LCAweDAwNzgsCisJMHgyZDU5LCAweGExODYsIDB4MDAyOCwgMHgwMGMwLCAweDJkNzIsIDB4MTA3OCwgMHg0Nzc2LCAweDYwMDgsCisJMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyZDU5LCAweDgwMDEsCisJMHg2MDFhLCAweGEwMDUsIDB4MDA0MCwgMHgyZDU5LCAweDgwMDEsIDB4YTAwNSwgMHgwMDQwLCAweDJkNTksCisJMHg2MDFlLCAweDY4MjAsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjQ4MiwgMHg2ODIwLCAweGEwODQsCisJMHhmZmZlLCAweDY4MjIsIDB4NzA2MCwgMHgwYzdlLCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLCAweDBjN2YsCisJMHg2MDA0LCAweDY4MDIsIDB4YTAwNSwgMHgyZDAwLCAweDAwYzAsIDB4MmQ2ZiwgMHg2MDAyLCAweDYwMDYsCisJMHgwMDc4LCAweDI0ODIsIDB4MDE3ZSwgMHgxMDc4LCAweDJlNDYsIDB4MDE3ZiwgMHhhNjg0LCAweGRmMDAsCisJMHg2ODFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ZjE0LCAweDgxZmYsIDB4MDA0MCwgMHgyZGJjLCAweGExODYsCisJMHgwMDAyLCAweDAwYzAsIDB4MmRiYywgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyZDhmLCAweGE2ODQsCisJMHgwMDYwLCAweDAwNDAsIDB4MmQ4ZiwgMHg3OGQ4LCAweDdhZGMsIDB4NjgyZSwgMHg2YTMyLCAweDY4MjAsCisJMHhhMDg0LCAweDA4MDAsIDB4MDBjMCwgMHgyZGJjLCAweDg3MTcsIDB4YTI5NCwgMHgwMDBmLCAweDgyMTMsCisJMHg4MjEzLCAweDgyMTMsIDB4YTI5MCwgMHg1MzgwLCAweGEyOTAsIDB4MDAwMCwgMHgyMjFjLCAweGEzODQsCisJMHgwMTAwLCAweDAwYzAsIDB4MmRhNSwgMHgwMDc4LCAweDJkYWIsIDB4ODIxMCwgMHgyMjA0LCAweGEwODUsCisJMHgwMDE4LCAweDIwMTIsIDB4ODIxMSwgMHhhMzg0LCAweDA0MDAsIDB4MDA0MCwgMHgyZGI4LCAweDY4YTAsCisJMHhhMDg0LCAweDAxMDAsIDB4MDBjMCwgMHgyZGI4LCAweDEwNzgsIDB4MmVjYSwgMHgwMDc4LCAweDI0ODIsCisJMHg2MDA4LCAweGEwODUsIDB4MDAwMiwgMHg2MDBhLCAweDY5MTYsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsCisJMHgwMDQwLCAweDJkYzQsIDB4NzAzYywgMHg2ODFhLCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDEwNzgsCisJMHgzM2RmLCAweDEwNzgsIDB4MzNlZSwgMHgwMGMwLCAweDJkZDEsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDY4MjAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MmRkYSwgMHgxMDc4LCAweDMzZDgsCisJMHgwMDc4LCAweDJkZGUsIDB4NzA2MCwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgxMDc4LCAweDFjNzAsCisJMHgwMDc4LCAweDI0ODIsIDB4YTI4MiwgMHgwMDA0LCAweDAwNDgsIDB4MmRlOCwgMHgxMDc4LCAweDIzZWIsCisJMHgyMjAwLCAweDAwNzksIDB4MmRlYiwgMHgyZGU2LCAweDJkZWYsIDB4MmRmYywgMHgyZGVmLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDUsIDB4MDA0MCwgMHgyZGY4LCAweDEwNzgsIDB4MzZjMSwgMHg3ODJiLCAweDMwMDgsCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDc4OTAsIDB4ODAwNywgMHg4MDAxLCAweGEwODQsCisJMHgwMDA3LCAweGEwODAsIDB4MDAxOCwgMHg3ODlhLCAweDc5YTgsIDB4YTE4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDAzLCAweDAwNDAsIDB4MmUxMSwgMHhhMTg2LCAweDAwMDAsIDB4MDA0MCwgMHgyZTExLCAweDAwNzgsCisJMHgzNjlkLCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4NjgyMCwgMHhhMDg1LCAweDAwMDQsCisJMHg2ODIyLCAweDgyZmYsIDB4MDBjMCwgMHgyZTIwLCAweDEwNzgsIDB4MzZjMSwgMHgwMDc4LCAweDJlMjcsCisJMHg4MjExLCAweDAwNDAsIDB4MmUyNSwgMHgxMDc4LCAweDIzZWIsIDB4MTA3OCwgMHgzNmQxLCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4NzAyYywgMHg4MDAzLCAweDAwNDgsCisJMHgyZTM3LCAweDIwMTksIDB4NGQ5ZSwgMHgxMDc4LCAweDIyNzYsIDB4NzAyZiwgMHg4MDAwLCAweDEwNzgsCisJMHgzOTEyLCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MmU0MywgMHgwMDE4LCAweDJlNDMsCisJMHg3OTFhLCAweGEwMDYsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhNjg0LCAweDAwNjAsCisJMHgwMGMwLCAweDJlNTAsIDB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDJlYzksCisJMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyZTcyLCAweDY4YjQsIDB4YTA4NCwgMHg0ODAwLCAweGE2MzUsCisJMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyZTcyLCAweDY5OTgsIDB4NmE5NCwgMHg2OTJlLCAweDZhMzIsCisJMHg3MDNjLCAweGEwMDUsIDB4MDBjMCwgMHgyZTZhLCAweDIyMDAsIDB4YTEwNSwgMHgwMDQwLCAweDJlNzEsCisJMHg3MDNmLCAweDAwMTUsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHgyZTcxLCAweDEwNzgsCisJMHg0Nzc2LCAweDAwN2MsIDB4YTY4NCwgMHgwMDIwLCAweDAwNDAsIDB4MmU5NCwgMHhhNjg0LCAweDQwMDAsCisJMHgwMDQwLCAweDJlODAsIDB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDJlNmEsCisJMHg2OGI0LCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LCAweGE2ODQsIDB4NDAwMCwgMHgwMGMwLCAweDJlN2EsCisJMHg3MDNjLCAweGEwMDUsIDB4MDBjMCwgMHgyZThlLCAweDcwM2YsIDB4MDAxNSwgMHg3OWQ4LCAweDdhZGMsCisJMHg2OTJlLCAweDZhMzIsIDB4MDA3OCwgMHgyZTZhLCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLCAweDJlOWUsCisJMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDAwNzgsIDB4MmU2YSwgMHg2OGI0LCAweGEwODQsCisJMHg0ODAwLCAweGE2MzUsIDB4YTY4NCwgMHg0MDAwLCAweDAwYzAsIDB4MmU5OCwgMHg3MDNjLCAweGEwMDUsCisJMHgwMGMwLCAweDJlYWMsIDB4NzAzZiwgMHgwMDE1LCAweDc5ZDgsIDB4N2FkYywgMHg3OGQwLCAweDgwZmIsCisJMHgwMGM4LCAweDJlYjMsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsCisJMHg2OTJlLCAweDZhMzIsIDB4MjEwMCwgMHhhMjA1LCAweDAwYzAsIDB4MmVjMCwgMHgwMDc4LCAweDJlNmEsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDJlYzksIDB4MTA3OCwgMHg0YjMwLCAweDAwNzgsCisJMHgyZTZhLCAweDAwN2MsIDB4NjAwOCwgMHhhMDg1LCAweDAyMDAsIDB4NjAwYSwgMHhhMzg0LCAweDAyMDAsCisJMHgwMDQwLCAweDJlZDYsIDB4NjAwOCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwYSwgMHg2ODFiLCAweDAwMDYsCisJMHg2ODhmLCAweDAwMDAsIDB4Njg5MywgMHgwMDAwLCAweDZhMzAsIDB4NjkyYywgMHg2YTNlLCAweDY5NDIsCisJMHg2ODJmLCAweDAwMDMsIDB4NjgzMywgMHgwMDAwLCAweDY4MzcsIDB4MDAyMCwgMHg2ODk3LCAweDAwMDAsCisJMHg2ODliLCAweDAwMjAsIDB4NjhiMywgMHgwMDAwLCAweDY4YWYsIDB4MDAwMCwgMHg3MDAwLCAweDAwNzksCisJMHgyZWYxLCAweDI0ODIsIDB4MmVmYiwgMHgyZjA0LCAweDJlZjksIDB4MmVmOSwgMHgyZWY5LCAweDJlZjksCisJMHgyZWY5LCAweDEwNzgsIDB4MjNlYiwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDJmMDQsCisJMHgxMDc4LCAweDMzZDgsIDB4MDA3OCwgMHgyZjBhLCAweDcwNjAsIDB4MmM1MCwgMHgyMDYwLCAweDY4MDAsCisJMHg2MDAyLCAweDJhNjAsIDB4MjAyMSwgMHg1MTVhLCAweDI0MDQsIDB4YTAwNSwgMHgwMDQwLCAweDJmMTMsCisJMHgyMDIwLCAweDAwNzgsIDB4MmYwYywgMHgyZDIyLCAweDIwNmIsIDB4MDAwMCwgMHgwMDdjLCAweDEwNzgsCisJMHgzM2RmLCAweDEwNzgsIDB4MzNlZSwgMHg2MDA4LCAweGEwODQsIDB4ZmRmZiwgMHg2MDBhLCAweDY4MmIsCisJMHgwMDAwLCAweDc4OWIsIDB4MDAwZSwgMHg2ZjE0LCAweDY4MTcsIDB4MDAwMiwgMHgxMDc4LCAweDRiNzgsCisJMHhhNjg0LCAweDA4MDAsIDB4MDA0MCwgMHgyZjMwLCAweDY5MWMsIDB4YTE4ZCwgMHgyMDAwLCAweDY5MWUsCisJMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDJmNDAsIDB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsCisJMHgwMDQwLCAweDJmM2UsIDB4NjgxYiwgMHgwMDFlLCAweDAwNzgsIDB4MmY0MCwgMHg2ODFiLCAweDAwMDAsCisJMHgyMDIxLCAweDUxNWEsIDB4MjQwNCwgMHhhZDA2LCAweDAwNDAsIDB4MmY0NywgMHg3NDYwLCAweDY4MDAsCisJMHgyMDIyLCAweDY4YzMsIDB4MDAwMCwgMHg2YTNjLCAweDY5NDAsIDB4NmEzMiwgMHg2OTJlLCAweDEwNzgsCisJMHgxYzcwLCAweDAwNzgsIDB4MjQ4MiwgMHgxMDc4LCAweDJlNDYsIDB4NjgyYiwgMHgwMDAwLCAweDIwMDEsCisJMHgwMDBlLCAweDZmMTQsIDB4MTA3OCwgMHgzOTE4LCAweGEwOGMsIDB4MDBmZiwgMHg2OTE2LCAweDY4MTgsCisJMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyZjY2LCAweDcwM2MsIDB4NjgxYSwgMHhhNjhjLCAweGRmMDAsCisJMHg2OTFlLCAweDcwNmYsIDB4MDAwMCwgMHgwMDc4LCAweDI0ODIsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsCisJMHgyZjczLCAweDAwNzgsIDB4MjQ4MiwgMHhhMDA2LCAweDEwNzgsIDB4NDc3NiwgMHg2ODE3LCAweDAwMDAsCisJMHg2ODFiLCAweDAwMTQsIDB4YTY4YywgMHhkZjAwLCAweDY5MWUsIDB4NjgyYiwgMHgwMDAwLCAweDY4MjAsCisJMHhhMDg1LCAweDAwZmYsIDB4NjgyMiwgMHg3MDAwLCAweDAwNzksIDB4MmY4NiwgMHgyNDgyLCAweDJmOTAsCisJMHgyZjkwLCAweDJmOTIsIDB4MmY5MiwgMHgyZjkyLCAweDJmOTIsIDB4MmY4ZSwgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDMzZWUsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgwMDc4LCAweDMzYTgsCisJMHgyMzAwLCAweDAwNzksIDB4MmY5YiwgMHgyZjllLCAweDJmYTAsIDB4MmZkOSwgMHgxMDc4LCAweDIzZWIsCisJMHg3MDAwLCAweDAwNzksIDB4MmZhMywgMHgyNDgyLCAweDJmYWQsIDB4MmZhZCwgMHgyZmM4LCAweDJmYWQsCisJMHgyZmQ1LCAweDJmYzgsIDB4MmZhYiwgMHgxMDc4LCAweDIzZWIsIDB4YTY4NCwgMHgwMDYwLCAweGEwODYsCisJMHgwMDYwLCAweDAwYzAsIDB4MmZjNCwgMHhhNmI0LCAweGZmZGYsIDB4YTZiNCwgMHhiZmZmLCAweGE2YjUsCisJMHgyMDAwLCAweDdlNWEsIDB4NjgxYywgMHhhMDg0LCAweGZmZGYsIDB4NjgxZSwgMHgxMDc4LCAweDQ3NzYsCisJMHgxMDc4LCAweDRhM2EsIDB4MDA3OCwgMHgzODg4LCAweGE2ODQsIDB4MjAwMCwgMHgwMDQwLCAweDJmYjcsCisJMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDJmZDUsIDB4NjgxYiwgMHgwMDE1LCAweGE2ODQsCisJMHg0MDAwLCAweDAwNDAsIDB4MmZkNSwgMHg2ODFiLCAweDAwMDcsIDB4MTA3OCwgMHgzODljLCAweDAwNzgsCisJMHgyNDU5LCAweDEwNzgsIDB4MjNlYiwgMHgyMzAwLCAweDAwNzksIDB4MmZkZSwgMHgyZmUxLCAweDJmZTMsCisJMHgzMDE2LCAweDEwNzgsIDB4MjNlYiwgMHg3MDAwLCAweDAwNzksIDB4MmZlNiwgMHgyNDgyLCAweDJmZjAsCisJMHgyZmYwLCAweDMwMGIsIDB4MmZmMCwgMHgzMDEyLCAweDMwMGIsIDB4MmZlZSwgMHgxMDc4LCAweDIzZWIsCisJMHhhNjg0LCAweDAwNjAsIDB4YTA4NiwgMHgwMDYwLCAweDAwYzAsIDB4MzAwNywgMHhhNmI0LCAweGZmYmYsCisJMHhhNmI0LCAweGJmZmYsIDB4YTZiNSwgMHgyMDAwLCAweDdlNWEsIDB4NjgxYywgMHhhMDg0LCAweGZmYmYsCisJMHg2ODFlLCAweDEwNzgsIDB4NDc3NiwgMHgxMDc4LCAweDRhM2EsIDB4MDA3OCwgMHgzODg4LCAweGE2ODQsCisJMHgyMDAwLCAweDAwNDAsIDB4MmZmYSwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDMwMTIsCisJMHg2ODFiLCAweDAwMDcsIDB4NzgxYiwgMHgwMGNkLCAweDAwNzgsIDB4MjQ1OSwgMHg2ODIwLCAweGEwODUsCisJMHgwMDA0LCAweDY4MjIsIDB4MTA3OCwgMHgzODUzLCAweGE2YjUsIDB4MDgwMCwgMHgxMDc4LCAweDM2YzEsCisJMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQ1OSwgMHgyMzAwLCAweDAwNzksCisJMHgzMDI5LCAweDMwMmMsIDB4MzAyZSwgMHgzMDMwLCAweDEwNzgsIDB4MjNlYiwgMHgwMDc4LCAweDM2YWQsCisJMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgzMDU5LCAweDc5ZTQsIDB4YTE4NCwgMHgwMDIwLCAweDAwNDAsCisJMHgzMDQwLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MzA0MCwgMHg3ODJiLCAweDMwMDksCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLCAweGE2ODQsIDB4ZmZmYiwgMHg3ODVhLCAweDc5ZTQsCisJMHhhMTg0LCAweDAwMjAsIDB4MDA0MCwgMHgzMDUxLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsCisJMHgzMDU1LCAweDIwMDEsIDB4MDAxNCwgMHgwMDc4LCAweDJkMDEsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksCisJMHgzMDkxLCAweDdhOTAsIDB4YTI5NCwgMHgwMDA3LCAweDc4OWIsIDB4MDA2MCwgMHg3OWE4LCAweDgxZmYsCisJMHgwMDQwLCAweDMwOGYsIDB4Nzg5YiwgMHgwMDEwLCAweDdiYTgsIDB4YTM4NCwgMHgwMDAxLCAweDAwYzAsCisJMHgzMDgwLCAweDdiYTgsIDB4N2JhOCwgMHhhMzg2LCAweDAwMDEsIDB4MDBjMCwgMHgzMDczLCAweDIwMDksCisJMHhmZmY3LCAweDAwNzgsIDB4MzA3OSwgMHhhMzg2LCAweDAwMDMsIDB4MDBjMCwgMHgzMDgwLCAweDIwMDksCisJMHhmZmVmLCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDQsIDB4YTEwNCwgMHg2MDA2LCAweDBjN2YsCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLCAweGE2ODQsIDB4ZmZmYiwgMHg3ODVhLCAweDc4MmIsCisJMHgzMDA5LCAweDY5MjAsIDB4YTE4YywgMHhmZGZmLCAweGExOGMsIDB4ZmVmZiwgMHg2OTIyLCAweDAwNzgsCisJMHgzODg4LCAweDI5OWUsIDB4MjlhOSwgMHgzMDliLCAweDMwYTMsIDB4MzA5OSwgMHgzMDk5LCAweDM4ODgsCisJMHgzODg4LCAweDEwNzgsIDB4MjNlYiwgMHg2OTIwLCAweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsCisJMHg2OTIyLCAweDAwNzgsIDB4Mzg5MiwgMHg2OTIwLCAweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsCisJMHg2OTIyLCAweDAwNzgsIDB4Mzg4OCwgMHg3OWU0LCAweGExODQsIDB4MDAzMCwgMHgwMDQwLCAweDMwYjUsCisJMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLCAweDMwZGMsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsCisJMHgwMGMwLCAweDMwY2YsIDB4NzA2YywgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgzMGM1LCAweDIwMTEsCisJMHgwMDAyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LCAweDI4NDgsIDB4NzA2YywgMHhhMDg2LCAweDAwMDYsCisJMHgwMDQwLCAweDMwYmYsIDB4NzA2YywgMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHgzMGJmLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgyNDU5LCAweDY4MTgsIDB4YTA4NSwgMHg4MDAwLCAweDY4MWEsCisJMHgyMDAxLCAweDAwMTQsIDB4MDA3OCwgMHgyZDAxLCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDMwZTAsCisJMHgzODg4LCAweDM4ODgsIDB4MzBlOCwgMHgzODg4LCAweDM4ZWQsIDB4MzhlZCwgMHgzODg4LCAweDM4ODgsCisJMHhhNjg0LCAweDAwODAsIDB4MDA0MCwgMHgzMTE3LCAweDcxOTQsIDB4ODFmZiwgMHgwMDQwLCAweDMxMTcsCisJMHhhMTgyLCAweDAwMGQsIDB4MDBkMCwgMHgzMGY4LCAweDcwOTcsIDB4MDAwMCwgMHgwMDc4LCAweDMwZmQsCisJMHhhMTgyLCAweDAwMGMsIDB4NzA5NiwgMHgyMDA5LCAweDAwMGMsIDB4Nzg5YiwgMHgwMDYxLCAweDc5YWEsCisJMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHg3MDk4LCAweDgxMTQsIDB4YTIxMCwgMHg3MjlhLCAweGEwODAsCisJMHgwMDBiLCAweGFkMDAsIDB4MjA5OCwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLCAweDgxMDgsCisJMHg4MWFjLCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3OCwgMHgzODkyLCAweGE2ODQsCisJMHgwNDAwLCAweDAwYzAsIDB4MzE1OCwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDM4OTIsCisJMHhhNjhjLCAweDAwNjAsIDB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MzEyYywgMHhhMDg2LCAweDAwNjAsCisJMHgwMGMwLCAweDMxMmMsIDB4YTE4ZCwgMHg0MDAwLCAweGExOGMsIDB4ZmZmYiwgMHg3OTVhLCAweDY5YjYsCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLCAweDc4OWIsIDB4MDA2MSwgMHg2ODE4LCAweGEwODUsCisJMHg4MDAwLCAweDY4MWEsIDB4NzhhYSwgMHg4MDA4LCAweDgxMGMsIDB4MDA0MCwgMHgzNDA3LCAweGExOGMsCisJMHgwMGY4LCAweDAwYzAsIDB4MzQwNywgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmIsCisJMHg3ODliLCAweDAwMDAsIDB4ODAwMCwgMHg4MGFjLCAweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsCisJMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHg2ODE0LCAweDgwMDcsIDB4Nzg4MiwgMHgwMDc4LCAweDM4OTIsCisJMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDMxNWYsIDB4NjgxYiwgMHgwMDA4LCAweDc4MWIsCisJMHgwMGMzLCAweDAwNzgsIDB4MjQ1OSwgMHgyMzAwLCAweDAwNzksIDB4MzE2NiwgMHgzMTZiLCAweDMyMGEsCisJMHgzMTY5LCAweDEwNzgsIDB4MjNlYiwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDMxNzAsCisJMHgyNDgyLCAweDMxN2EsIDB4MzFhZiwgMHgzMTg1LCAweDMxNzgsIDB4MjQ4MiwgMHgzMTc4LCAweDMxNzgsCisJMHgxMDc4LCAweDIzZWIsIDB4NjgxYywgMHhhMDg0LCAweDIwMDAsIDB4MDA0MCwgMHgzMTkzLCAweDYwMDgsCisJMHhhMDg1LCAweDAwMDIsIDB4NjAwYSwgMHgwMDc4LCAweDMxOTMsIDB4NjhjMCwgMHhhMDA1LCAweDAwYzAsCisJMHgzMWFmLCAweDY5MjAsIDB4YTE4ZCwgMHgwMDAxLCAweDY5MjIsIDB4NjhjMywgMHgwMDAxLCAweDY4MDAsCisJMHg3MDZhLCAweDAwNzgsIDB4MzFhOSwgMHg2OTIwLCAweGExOGQsIDB4MDAwMSwgMHg2OTIyLCAweDY4MDAsCisJMHg2MDA2LCAweGEwMDUsIDB4MDBjMCwgMHgzMTlkLCAweDYwMDIsIDB4NjgxYywgMHhhMDg0LCAweDAwMGUsCisJMHgwMDQwLCAweDMxYTksIDB4NzAxNCwgMHg2OGJhLCAweDcxMzAsIDB4YTE4OCwgMHg3NDAwLCAweDAwNzgsCisJMHgzMWFiLCAweDIwMDksIDB4NzUwMCwgMHgyMTA0LCAweDY4MDIsIDB4MmQwYSwgMHg3MTYyLCAweDZlYjYsCisJMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgzMjA4LCAweGE2ODQsIDB4MDgwMCwgMHgwMGMwLCAweDMxYzMsCisJMHhhNjg0LCAweDdmZmYsIDB4NjhiNiwgMHg2ODk0LCAweDY4YTYsIDB4Njg5OCwgMHg2OGFhLCAweDEwNzgsCisJMHg0Nzc2LCAweDAwNzgsIDB4MzIwOCwgMHhhNjg0LCAweDAwMjAsIDB4MDA0MCwgMHgzMWQ4LCAweDY4YzAsCisJMHhhMDA1LCAweDAwNDAsIDB4MzFjZiwgMHgxMDc4LCAweDRiNzgsIDB4MDA3OCwgMHgzMWQyLCAweGEwMDYsCisJMHgxMDc4LCAweDRiMzAsIDB4NzlkOCwgMHg3YWRjLCAweDY5YWEsIDB4NmFhNiwgMHgwMDc4LCAweDMxZGUsCisJMHgxMDc4LCAweDM3ZmMsIDB4NjlhYSwgMHg2YWE2LCAweDEwNzgsIDB4NGIzMCwgMHhhNjg0LCAweDgwMDAsCisJMHgwMDQwLCAweDMyMDgsIDB4YTY4NCwgMHg3ZmZmLCAweDY4YjYsIDB4MjAwMSwgMHgwMDc2LCAweDEwNzgsCisJMHgzOTE4LCAweDIwMTAsIDB4MjAwMSwgMHgwMDc4LCAweDEwNzgsIDB4MzkxOCwgMHgyMDA4LCAweGE2ODQsCisJMHgwMDIwLCAweDAwYzAsIDB4MzIwMCwgMHgyMDAxLCAweDAwN2EsIDB4MTA3OCwgMHgzOTE4LCAweDgwMWIsCisJMHgwMGM4LCAweDMxZmIsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsCisJMHg2Yjk4LCAweDIxMDAsIDB4YTMwMiwgMHg2OGIyLCAweDZiOTQsIDB4MjIwMCwgMHhhMzAzLCAweDY4YWUsCisJMHgwMDc4LCAweDI0ODIsIDB4MDA3OCwgMHgzNmFkLCAweDcwMzcsIDB4MDAwMCwgMHhhMjgyLCAweDAwMDYsCisJMHgwMDUwLCAweDMyMTQsIDB4MTA3OCwgMHgyM2ViLCAweDcwMDAsIDB4YTA4NCwgMHgwMDA3LCAweDEwYzAsCisJMHgzOWJlLCAweDIzMDAsIDB4MDA3OSwgMHgzMjFjLCAweDMyMWYsIDB4MzI0OCwgMHgzMjVjLCAweDIyMDAsCisJMHgwMDc5LCAweDMyMjIsIDB4MzI0NiwgMHgzNmFkLCAweDMyMjgsIDB4MzI0NiwgMHgzMjc4LCAweDMyYmEsCisJMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NjEwLCAweDIwNjgsIDB4NzA0YSwgMHgxNTdlLCAweDIwYTksCisJMHgwMDMxLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwNzAsIDB4MzIzOCwgMHgwMDc4LCAweDMyMzEsCisJMHgxNTdmLCAweGFkODAsIDB4MDAwOSwgMHg3MDM2LCAweDY4MTcsIDB4MDAwMCwgMHg2OGI3LCAweDA3MDAsCisJMHg2ODIzLCAweDA4MDAsIDB4NjgyNywgMHgwMDAzLCAweDAwNzgsIDB4MzY5ZCwgMHgxMDc4LCAweDIzZWIsCisJMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NjEwLCAweDIwNjgsIDB4NzA0YSwgMHhhZDgwLCAweDAwMDksCisJMHg3MDM2LCAweDIyMDAsIDB4MDA3OSwgMHgzMjU0LCAweDM2YWQsIDB4MzI1YSwgMHgzMjVhLCAweDMyNzgsCisJMHgzMjVhLCAweDM2YWQsIDB4MTA3OCwgMHgyM2ViLCAweDcwMDMsIDB4MDAwNSwgMHgyMDAxLCAweDc2MTAsCisJMHgyMDY4LCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4MjIwMCwgMHgwMDc5LCAweDMyNjgsCisJMHgzMjcwLCAweDMyNmUsIDB4MzI2ZSwgMHgzMjcwLCAweDMyNmUsIDB4MzI3MCwgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDM2ZDEsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksCisJMHg3MDAzLCAweDAwMDIsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsIDB4Nzg5YiwgMHgwMDE4LCAweDdjYTgsCisJMHhhNDg0LCAweDAwMWYsIDB4YTIxNSwgMHgyMDY5LCAweDc1MDAsIDB4MmQwNCwgMHgyZDA4LCAweDcxNjIsCisJMHgyMDY4LCAweGEwMDUsIDB4MDA0MCwgMHgzMjkzLCAweDY4MTQsIDB4YTIwNiwgMHgwMDQwLCAweDMyYWYsCisJMHg2ODAwLCAweDAwNzgsIDB4MzI4NiwgMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NjEwLCAweDIwNjgsCisJMHg3MDRhLCAweDcwMzYsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMzEsIDB4MjAwMywgMHgwMDAwLCAweDgwMDAsCisJMHgwMDcwLCAweDMyYTQsIDB4MDA3OCwgMHgzMjlkLCAweDE1N2YsIDB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsCisJMHg2YTE2LCAweDY4YjcsIDB4MDcwMCwgMHg2ODIzLCAweDA4MDAsIDB4NjgyNywgMHgwMDAzLCAweDZlYjQsCisJMHg3ZTVhLCAweDY4MjAsIDB4YTA4NCwgMHgwYzAwLCAweDAwNDAsIDB4MzMwOSwgMHgxMDc4LCAweDM2YzksCisJMHgwMDc4LCAweDMzMDksIDB4NzAwMywgMHgwMDAyLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDc4OWIsCisJMHgwMDE4LCAweDdjYTgsIDB4YTQ4NCwgMHgwMDFmLCAweGEyMTUsIDB4NzlhOCwgMHg3OWE4LCAweGExOGMsCisJMHgwMGZmLCAweGExZTgsIDB4NzQwMCwgMHgyZDA0LCAweDJkMDgsIDB4NzE2MiwgMHgyMDY4LCAweGEwMDUsCisJMHgwMDQwLCAweDMyZDksIDB4NjgxNCwgMHhhMjA2LCAweDAwNDAsIDB4MzJmNCwgMHg2ODAwLCAweDAwNzgsCisJMHgzMmNjLCAweDcwMDMsIDB4MDAwNSwgMHgyMDAxLCAweDc2MTAsIDB4MjA2OCwgMHg3MDRhLCAweDE1N2UsCisJMHgyMGE5LCAweDAwMzEsIDB4MjAwMywgMHgwMDAwLCAweDgwMDAsIDB4MDA3MCwgMHgzMmU5LCAweDAwNzgsCisJMHgzMmUyLCAweDE1N2YsIDB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4NmExNiwgMHg2OGI3LCAweDA3MDAsCisJMHg2ODIzLCAweDA4MDAsIDB4NjgyNywgMHgwMDAzLCAweDZlYjQsIDB4N2U1YSwgMHg2ODIwLCAweGEwODQsCisJMHgwYzAwLCAweDAwNDAsIDB4MzMwOSwgMHhhMDg0LCAweDA4MDAsIDB4MDA0MCwgMHgzMzAzLCAweDEwNzgsCisJMHgzNmNkLCAweDAwNzgsIDB4MzMwOSwgMHgxMDc4LCAweDM2YzksIDB4NzA4YiwgMHgwMDAwLCAweDAwNzgsCisJMHgzMzA5LCAweDAyN2UsIDB4ODIwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsCisJMHhhMDgwLCAweDUzODAsIDB4MjA2MCwgMHg3MDU2LCAweDYwMDAsIDB4NzA1YSwgMHg2MDA0LCAweDcwNWUsCisJMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgzMzYxLCAweDZiOTgsIDB4NmM5NCwgMHg2OWFjLCAweDY4YjAsCisJMHhhMTA1LCAweDAwYzAsIDB4MzM0MywgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweGE2YjQsCisJMHhiN2ZmLCAweDdlNWEsIDB4YTY4NCwgMHgwMDYwLCAweGEwODYsIDB4MDA2MCwgMHgwMDQwLCAweDMzNjEsCisJMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHgzMzNjLCAweDcwMDMsIDB4MDAwMywgMHg2ODJiLCAweDAwMDAsCisJMHgxMDc4LCAweDRhMjksIDB4MDA3OCwgMHgzMzNlLCAweDEwNzgsIDB4NGEzYSwgMHhhNmI1LCAweDIwMDAsCisJMHg3ZTVhLCAweDAwNzgsIDB4MzM2MSwgMHg2OGIwLCAweGEzMWEsIDB4MjEwMCwgMHhhNDIzLCAweDI0MDAsCisJMHhhMzA1LCAweDAwNDAsIDB4MzM2MSwgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweDY4YjAsCisJMHhhNmI0LCAweGJmZmYsIDB4N2U1YSwgMHgwMDdlLCAweDY4YzAsIDB4YTAwNSwgMHgwMDdmLCAweDAwNDAsCisJMHgzMzVmLCAweDcwMDMsIDB4MDAwMywgMHgxMDc4LCAweDRhMjksIDB4MDA3OCwgMHgzMzYxLCAweDEwNzgsCisJMHg0YTg1LCAweDA3N2YsIDB4MTA3OCwgMHgzN2VmLCAweDIwMDksIDB4MDA2NSwgMHhhNjg0LCAweDAwMDQsCisJMHgwMDQwLCAweDMzODIsIDB4NzhlNCwgMHhhMDg0LCAweDAwMzAsIDB4MDA0MCwgMHgzMzdhLCAweDc4ZWMsCisJMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgzMzdhLCAweDc4MmIsIDB4MzAwOCwgMHgyMDA5LCAweDAwNjUsCisJMHgwMDc4LCAweDMzODIsIDB4MGY3ZSwgMHgyMDc5LCAweDUxMDAsIDB4MTA3OCwgMHg0Nzc2LCAweDBmN2YsCisJMHgwMDQwLCAweDI0ODIsIDB4NzkxYSwgMHgyZDAwLCAweDcwNGEsIDB4ODIwNywgMHhhMDg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweDUzODAsIDB4MjA0OCwgMHgwMDc4LCAweDI0NTksCisJMHg2MDIwLCAweGEwMDUsIDB4MDA0MCwgMHgzMzljLCAweDgwMDEsIDB4NjAyMiwgMHg2MDA4LCAweGEwODUsCisJMHgwMDA4LCAweDYwMGEsIDB4NzAxMCwgMHg2MDI2LCAweDAwN2MsIDB4YTAwNiwgMHgxMDc4LCAweDQ3NzYsCisJMHg2ODE3LCAweDAwMDAsIDB4NjgxYiwgMHgwMDAxLCAweDY4MjMsIDB4MDA0MCwgMHg2ODFmLCAweDAxMDAsCisJMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDMzYWQsIDB4MjQ4MiwgMHgzM2I3LCAweDMzYjcsCisJMHgzM2Q0LCAweDMzYmYsIDB4MzNiZCwgMHgzM2JmLCAweDMzYjUsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsCisJMHgzM2RmLCAweDEwNzgsIDB4MzNkOCwgMHgxMDc4LCAweDFjNzAsIDB4MDA3OCwgMHgyNDgyLCAweDcwNmMsCisJMHg3MDZmLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDAwNzksIDB4MzNjNiwgMHgzM2QwLCAweDMzZDAsCisJMHgzM2NlLCAweDMzY2UsIDB4MzNjZSwgMHgzM2QwLCAweDMzY2UsIDB4MzNkMCwgMHgwMDc5LCAweDI4NjEsCisJMHg3MDZmLCAweDAwMDAsIDB4MDA3OCwgMHgyNDgyLCAweDY4MWIsIDB4MDAwMCwgMHgwMDc4LCAweDJmMTcsCisJMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHgzM2RkLCAweDYwMDIsIDB4NjAwNiwgMHgwMDdjLCAweDYwMTAsCisJMHhhMDA1LCAweDAwNDAsIDB4MzNlOCwgMHg4MDAxLCAweDAwZDAsIDB4MzNlOCwgMHgxMDc4LCAweDIzZWIsCisJMHg2MDEyLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MDA3YywgMHg2MDE4LCAweGEwMDUsCisJMHgwMDQwLCAweDMzZjQsIDB4ODAwMSwgMHg2MDFhLCAweDAwN2MsIDB4MTA3OCwgMHgzOTEyLCAweDY4MWIsCisJMHgwMDE4LCAweDAwNzgsIDB4MzQyYiwgMHgxMDc4LCAweDM5MTIsIDB4NjgxYiwgMHgwMDE5LCAweDAwNzgsCisJMHgzNDJiLCAweDEwNzgsIDB4MzkxMiwgMHg2ODFiLCAweDAwMWEsIDB4MDA3OCwgMHgzNDJiLCAweDEwNzgsCisJMHgzOTEyLCAweDY4MWIsIDB4MDAwMywgMHgwMDc4LCAweDM0MmIsIDB4Nzc4MCwgMHgxMDc4LCAweDM3ZWYsCisJMHg3MTg0LCAweGExOGMsIDB4MDBmZiwgMHhhMWU4LCAweDc0MDAsIDB4MmQwNCwgMHgyZDA4LCAweDIwNjgsCisJMHhhMDA1LCAweDAwYzAsIDB4MzQxZCwgMHgwMDc4LCAweDI0ODIsIDB4NjgxNCwgMHg3MjgwLCAweGEyMDYsCisJMHgwMDQwLCAweDM0MjUsIDB4NjgwMCwgMHgwMDc4LCAweDM0MTYsIDB4NjgwMCwgMHgyMDBhLCAweDY4MWIsCisJMHgwMDA1LCAweDcwOGIsIDB4MDAwMCwgMHgxMDc4LCAweDMzZGYsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsCisJMHgwMGMwLCAweDM0MzQsIDB4MTA3OCwgMHgzM2Q4LCAweDEwNzgsIDB4MzNlZSwgMHg2ODFmLCAweDAwMDAsCisJMHg2ODIzLCAweDAwMjAsIDB4MTA3OCwgMHgxYzcwLCAweDAwNzgsIDB4MjQ4MiwgMHhhMjgyLCAweDAwMDMsCisJMHgwMGMwLCAweDM2OWQsIDB4N2RhOCwgMHhhNWFjLCAweDAwZmYsIDB4N2NhOCwgMHhhNGE0LCAweDAwZmYsCisJMHg2OTIwLCAweGExOGQsIDB4MDA4MCwgMHg2OTIyLCAweGExODQsIDB4MDEwMCwgMHgwMDQwLCAweDM0YTIsCisJMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHhhNGE0LCAweDAwZmYsIDB4MDA0MCwgMHgzNDhjLCAweGE0ODIsCisJMHgwMDBjLCAweDAwNDgsIDB4MzQ1ZiwgMHgwMDQwLCAweDM0NWYsIDB4MjAyMSwgMHgwMDBjLCAweDg1MmIsCisJMHg4NTJiLCAweDEwNzgsIDB4Mzc2MCwgMHgwMDQwLCAweDM0NjksIDB4MTA3OCwgMHgzNTViLCAweDAwNzgsCisJMHgzNDk1LCAweDEwNzgsIDB4MzcxYiwgMHgwYzdlLCAweDI5NjAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsCisJMHg2MDA2LCAweDEwNzgsIDB4MzU4NiwgMHgwYzdmLCAweDY5MjAsIDB4YTE4ZCwgMHgwMTAwLCAweDY5MjIsCisJMHg3ZTU4LCAweGE2YjUsIDB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDM0ODYsCisJMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLCAweDMwMDgsCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDBjN2UsIDB4Mjk2MCwgMHg2MDA0LCAweGEwODQsCisJMHhmZmY1LCAweDYwMDYsIDB4MTA3OCwgMHgzNTg2LCAweDBjN2YsIDB4N2U1OCwgMHhhNjg0LCAweDA0MDAsCisJMHgwMGMwLCAweDM0OWUsIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODFiLCAweDAwNjUsCisJMHgwMDc4LCAweDI0NTksIDB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4NjEwMCwgMHhhMThjLCAweDEwMDAsCisJMHgwMDQwLCAweDM0ZTIsIDB4NjIwOCwgMHg4MjE3LCAweGEyOTQsIDB4MDBmZiwgMHhhMjgyLCAweDAwMGMsCisJMHgwMDQ4LCAweDM0YjYsIDB4MDA0MCwgMHgzNGI2LCAweDIwMTEsIDB4MDAwYywgMHgyNDAwLCAweGEyMDIsCisJMHgwMGM4LCAweDM0YmIsIDB4MjIyMCwgMHg2MjA4LCAweGEyOTQsIDB4MDBmZiwgMHg3MDE4LCAweGEwODYsCisJMHgwMDI4LCAweDAwYzAsIDB4MzRjYiwgMHhhMjgyLCAweDAwMTksIDB4MDBjOCwgMHgzNGQxLCAweDIwMTEsCisJMHgwMDE5LCAweDAwNzgsIDB4MzRkMSwgMHhhMjgyLCAweDAwMGMsIDB4MDBjOCwgMHgzNGQxLCAweDIwMTEsCisJMHgwMDBjLCAweDIyMDAsIDB4YTUwMiwgMHgwMGM4LCAweDM0ZDYsIDB4MjIyOCwgMHgxMDc4LCAweDM3MWYsCisJMHg4NTJiLCAweDg1MmIsIDB4MTA3OCwgMHgzNzYwLCAweDAwNDAsIDB4MzRlMiwgMHgxMDc4LCAweDM1NWIsCisJMHgwMDc4LCAweDM0ZTYsIDB4MTA3OCwgMHgzNzFiLCAweDEwNzgsIDB4MzU4NiwgMHg3ODU4LCAweGEwODUsCisJMHgwMDA0LCAweDc4NWEsIDB4MGM3ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsCisJMHgyNDU5LCAweDBjN2UsIDB4Mjk2MCwgMHg2MDAwLCAweGEwODQsIDB4MTAwMCwgMHgwMGMwLCAweDM1MDksCisJMHg2MDEwLCAweGEwODQsIDB4MDAwZiwgMHgwMGMwLCAweDM1MDMsIDB4NjEwNCwgMHhhMThjLCAweGZmZjUsCisJMHg2MTA2LCAweDBjN2YsIDB4MDA3YywgMHgyMDExLCAweDAwMzIsIDB4MjAxOSwgMHgwMDAwLCAweDAwNzgsCisJMHgzNTMwLCAweDY4YTAsIDB4YTA4NCwgMHgwMjAwLCAweDAwYzAsIDB4MzUwMywgMHg2MjA4LCAweGEyOTQsCisJMHgwMGZmLCAweDcwMTgsIDB4YTA4NiwgMHgwMDI4LCAweDAwYzAsIDB4MzUxZSwgMHhhMjgyLCAweDAwMTksCisJMHgwMGM4LCAweDM1MjQsIDB4MjAxMSwgMHgwMDE5LCAweDAwNzgsIDB4MzUyNCwgMHhhMjgyLCAweDAwMGMsCisJMHgwMGM4LCAweDM1MjQsIDB4MjAxMSwgMHgwMDBjLCAweDYzMDgsIDB4ODMxZiwgMHhhMzljLCAweDAwZmYsCisJMHhhMzgyLCAweDAwMGMsIDB4MDA0OCwgMHgzNTMwLCAweDAwNDAsIDB4MzUzMCwgMHgyMDE5LCAweDAwMGMsCisJMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLCAweDdiYWEsCisJMHhhOGMwLCAweDAwMDUsIDB4NjgyMCwgMHhhMDg1LCAweDAxMDAsIDB4NjgyMiwgMHgwYzdmLCAweDAwN2MsCisJMHgwYzdlLCAweDI5NjAsIDB4YTE4YywgMHhmZmY1LCAweDYxMDYsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksCisJMHgwMDAwLCAweDAwNzgsIDB4MzU0YiwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsCisJMHgwMDAxLCAweDdhYWEsIDB4N2JhYSwgMHhhOGMwLCAweDAwMDUsIDB4NjgyMCwgMHhhMDg1LCAweDAxMDAsCisJMHg2ODIyLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDcxNTQsIDB4MjE2MCwgMHgxMDc4LCAweDM1NjIsCisJMHgwYzdmLCAweDAwN2MsIDB4MjAwOCwgMHhhMDg0LCAweGZmZjAsIDB4YTQyNSwgMHg3Yzg2LCAweDYwMTgsCisJMHg3ODlhLCAweDdjYWUsIDB4NjQxMiwgMHg3OGE0LCAweGEwODQsIDB4ZmZmOCwgMHhhMThjLCAweDAwMDcsCisJMHhhMTA1LCAweDc4YTYsIDB4NjAxNiwgMHg3ODhhLCAweGE0YTQsIDB4MDAwZiwgMHg4NDI3LCAweDgyMDQsCisJMHg4MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhNDA1LCAweDYwMGUsIDB4NzhlYywgMHhkMDhjLCAweDAwYzAsCisJMHgzNTg1LCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LCAweDYwMDYsIDB4MDA3YywgMHgwYzdlLCAweDcwNTQsCisJMHgyMDYwLCAweDEwNzgsIDB4MzU4ZCwgMHgwYzdmLCAweDAwN2MsIDB4NjAxOCwgMHg3ODlhLCAweDc4YTQsCisJMHhhMDg0LCAweGZmZjAsIDB4NzhhNiwgMHg2MDEyLCAweDc4ODQsIDB4YTA4NCwgMHhmZmYwLCAweDc4ODYsCisJMHgwMDdjLCAweGEyODIsIDB4MDAwMiwgMHgwMGMwLCAweDM2OWQsIDB4N2FhOCwgMHg2OTIwLCAweGExOGQsCisJMHgwMDgwLCAweDY5MjIsIDB4YTE4NCwgMHgwMjAwLCAweDAwNDAsIDB4MzVlMiwgMHhhMThjLCAweGZkZmYsCisJMHg2OTIyLCAweGEyOTQsIDB4MDBmZiwgMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwgMHgzNjlkLCAweDEwNzgsCisJMHgzNjJiLCAweDEwNzgsIDB4MzU4NiwgMHhhOTgwLCAweDAwMDEsIDB4MjAwYywgMHgxMDc4LCAweDM3ZWIsCisJMHgxMDc4LCAweDM0ZjEsIDB4ODhmZiwgMHgwMDQwLCAweDM1ZDUsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsCisJMHg3OGFhLCAweDdlNTgsIDB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsCisJMHgzNWNmLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDU5LCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4N2U1OCwgMHhhNjg0LCAweDA0MDAsCisJMHgwMGMwLCAweDM1ZGUsIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODFiLCAweDAwNjUsCisJMHgwMDc4LCAweDI0NTksIDB4YTI4MiwgMHgwMDAyLCAweDAwYzgsIDB4MzVlYSwgMHhhMjg0LCAweDAwMDEsCisJMHgwMDQwLCAweDM1ZjQsIDB4NzE1NCwgMHhhMTg4LCAweDAwMDAsIDB4MjEwYywgMHhhMThjLCAweDIwMDAsCisJMHgwMGMwLCAweDM1ZjQsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4MzcwZCwgMHgxMDc4LCAweDM2MmIsCisJMHgxMDc4LCAweDM1ODYsIDB4Nzg1OCwgMHhhMDg1LCAweDAwMDQsIDB4Nzg1YSwgMHg3ODJiLCAweDMwMDgsCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDBjN2UsIDB4MDI3ZSwgMHgyOTYwLCAweDYwMDAsCisJMHgyMDExLCAweDAwMDEsIDB4YTA4NCwgMHgyMDAwLCAweDAwYzAsIDB4MzYxYiwgMHg2MDE0LCAweGEwODQsCisJMHgwMDQwLCAweDAwYzAsIDB4MzYxOSwgMHhhMThjLCAweGZmZWYsIDB4NjEwNiwgMHhhMDA2LCAweDAwNzgsCisJMHgzNjI4LCAweDIwMTEsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAyLCAweDc4YWIsCisJMHgwMDAzLCAweDdhYWEsIDB4YThjMCwgMHgwMDA0LCAweDY4MjAsIDB4YTA4NSwgMHgwMjAwLCAweDY4MjIsCisJMHgwMjdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHgxMDc4LCAweDM2MzIsCisJMHgwYzdmLCAweDAwN2MsIDB4ODJmZiwgMHgwMDQwLCAweDM2MzcsIDB4MjAxMSwgMHgwMDQwLCAweDYwMTgsCisJMHhhMDgwLCAweDAwMDIsIDB4Nzg5YSwgMHg3OGE0LCAweGEwODQsIDB4ZmZiZiwgMHhhMjA1LCAweDc4YTYsCisJMHg3ODhhLCAweDYwMTYsIDB4NzhlYywgMHhkMDhjLCAweDAwYzAsIDB4MzY0YSwgMHg2MDA0LCAweGEwODQsCisJMHhmZmVmLCAweDYwMDYsIDB4MDA3YywgMHgwMDdlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsCisJMHgzNjU0LCAweDAwN2YsIDB4MDA3OCwgMHgzNjU3LCAweDAwN2YsIDB4MDA3OCwgMHgzNjk5LCAweGE2ODQsCisJMHgwMDIwLCAweDAwNDAsIDB4MzY5OSwgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDM2OTksCisJMHg3YmI4LCAweGEzODQsIDB4MDAzZiwgMHg4MzFiLCAweDAwYzgsIDB4MzY2NywgMHg4MDAwLCAweGEwMDUsCisJMHgwMDQwLCAweDM2N2QsIDB4ODMxYiwgMHgwMGM4LCAweDM2NzAsIDB4ODAwMSwgMHgwMDQwLCAweDM2OTUsCisJMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgzNjdkLCAweDc4YjgsIDB4ODAxYiwgMHgwMGM4LCAweDM2NzksCisJMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHgwMGMwLCAweDM2OTUsIDB4YTZiNCwgMHhiZmZmLCAweDdlNWEsCisJMHg3OWQ4LCAweDdhZGMsIDB4MjAwMSwgMHgwMDAxLCAweGExMDgsIDB4MDBjOCwgMHgzNjg5LCAweGEyOTEsCisJMHgwMDAwLCAweDc5ZDIsIDB4NzlkYSwgMHg3YWQ2LCAweDdhZGUsIDB4MTA3OCwgMHg0YjMwLCAweDc4MWIsCisJMHgwMDY0LCAweDEwNzgsIDB4NDliNSwgMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDY0LCAweDAwNzgsCisJMHgyNDU5LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4MTA3OCwgMHgzNmQ1LCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4MTA3OCwgMHgzNmMxLCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0NTksIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsCisJMHgzNmM5LCAweDc4ZTQsIDB4YTA4NCwgMHgwMDMwLCAweDAwNDAsIDB4MjQ4MiwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDAwNDAsIDB4MjQ4MiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsCisJMHgyNDU5LCAweDIwMDEsIDB4MDAwNSwgMHgwMDc4LCAweDM2ZDcsIDB4MjAwMSwgMHgwMDBjLCAweDAwNzgsCisJMHgzNmQ3LCAweDIwMDEsIDB4MDAwNiwgMHgwMDc4LCAweDM2ZDcsIDB4MjAwMSwgMHgwMDBkLCAweDAwNzgsCisJMHgzNmQ3LCAweDIwMDEsIDB4MDAwOSwgMHgwMDc4LCAweDM2ZDcsIDB4MjAwMSwgMHgwMDA3LCAweDc4OWIsCisJMHgwMDEwLCAweDc4YWEsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMSwgMHhhNmI1LCAweDAwMDQsCisJMHg3ZTVhLCAweDAwN2MsIDB4MDc3ZSwgMHg4NzNmLCAweGE3YmMsIDB4MDAwZiwgMHg4NzNiLCAweDg3M2IsCisJMHg4NzAzLCAweGEwZTAsIDB4NTM4MCwgMHhhN2I4LCAweDAwMjAsIDB4N2Y5YSwgMHg3OWE0LCAweGExODQsCisJMHgwMDBmLCAweDAwNDAsIDB4MzZmYiwgMHhhMTg0LCAweGZmZjAsIDB4NzhhNiwgMHg2MDEyLCAweDYwMDQsCisJMHhhMDg1LCAweDAwMDgsIDB4NjAwNiwgMHg4NzM4LCAweDg3MzgsIDB4N2Y5YSwgMHg3OWE0LCAweGExODQsCisJMHgwMDQwLCAweDAwNDAsIDB4MzcwYiwgMHhhMTg0LCAweGZmYmYsIDB4NzhhNiwgMHg2MDE2LCAweDYwMDQsCisJMHhhMDg1LCAweDAwMTAsIDB4NjAwNiwgMHgwNzdmLCAweDAwN2MsIDB4Nzg5YiwgMHgwMDEwLCAweDc4YWIsCisJMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLCAweDAwMDMsIDB4N2FhYSwgMHg3ODliLCAweDAwNjAsCisJMHg3OGFiLCAweDAwMDQsIDB4MDA3YywgMHgyMDIxLCAweDAwMDAsIDB4MjAyOSwgMHgwMDMyLCAweDc4OWIsCisJMHgwMDEwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDMsIDB4NzhhYiwgMHgwMDAxLCAweDdkYWEsCisJMHg3Y2FhLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDUsIDB4MDA3YywgMHgxNTdlLCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHg3ODlhLCAweDc5YTQsCisJMHhhMThjLCAweGZmZjAsIDB4MjAwMSwgMHg1MTQ2LCAweDIwMDQsIDB4YTA4MiwgMHgwMDI4LCAweDAwNDAsCisJMHgzNzQ5LCAweDIwMjEsIDB4MzdkMiwgMHgyMDE5LCAweDAwMTQsIDB4MjBhOSwgMHgwMDBjLCAweDAwNzgsCisJMHgzNzRmLCAweDIwMjEsIDB4MzdkZSwgMHgyMDE5LCAweDAwMTksIDB4MjBhOSwgMHgwMDBkLCAweDIwMTEsCisJMHgwMDY0LCAweDI0MDQsIDB4YTA4NCwgMHhmZmYwLCAweGExMDYsIDB4MDA0MCwgMHgzNzVlLCAweDg0MjAsCisJMHgyMzAwLCAweGEyMTAsIDB4MDA3MCwgMHgzNzVlLCAweDAwNzgsIDB4Mzc1MSwgMHgxNTdmLCAweDAwN2MsCisJMHgxNTdlLCAweDIwMDksIDB4NTE0NiwgMHgyMTBjLCAweGExODIsIDB4MDAzMiwgMHgwMDQ4LCAweDM3NzQsCisJMHgwMDQwLCAweDM3NzgsIDB4MjAwOSwgMHgzN2M0LCAweDIwMTksIDB4MDAxMSwgMHgyMGE5LCAweDAwMGUsCisJMHgyMDExLCAweDAwMzIsIDB4MDA3OCwgMHgzNzhhLCAweGExODIsIDB4MDAyOCwgMHgwMDQwLCAweDM3ODIsCisJMHgyMDA5LCAweDM3ZDIsIDB4MjAxOSwgMHgwMDE0LCAweDIwYTksIDB4MDAwYywgMHgyMDExLCAweDAwNjQsCisJMHgwMDc4LCAweDM3OGEsIDB4MjAwOSwgMHgzN2RlLCAweDIwMTksIDB4MDAxOSwgMHgyMGE5LCAweDAwMGQsCisJMHgyMDExLCAweDAwNjQsIDB4MjIwMCwgMHhhNTAyLCAweDAwNDAsIDB4Mzc5YSwgMHgwMDQ4LCAweDM3OWEsCisJMHg4MTA4LCAweDIzMDAsIDB4YTIxMCwgMHgwMDcwLCAweDM3OTcsIDB4MDA3OCwgMHgzNzhhLCAweDE1N2YsCisJMHhhMDA2LCAweDAwN2MsIDB4MTU3ZiwgMHhhNTgyLCAweDAwNjQsIDB4MDBjOCwgMHgzN2E5LCAweDc4MDgsCisJMHhhMDg1LCAweDAwNzAsIDB4NzgwYSwgMHg3MDQ0LCAweGEwODUsIDB4MDA3MCwgMHg3MDQ2LCAweDAwNzgsCisJMHgzN2E5LCAweDc4ZWMsIDB4YTA4NCwgMHgwMzAwLCAweDAwNDAsIDB4MzdiMSwgMHgyMTA0LCAweDAwNzgsCisJMHgzN2MyLCAweDIxMDQsIDB4YTA5ZSwgMHgxMTAyLCAweDAwYzAsIDB4MzdjMiwgMHgyMDAxLCAweDA0ZmQsCisJMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMDQ4LCAweDM3YzEsIDB4MjAwMSwgMHgxMjAxLCAweDAwNzgsCisJMHgzN2MyLCAweDIxMDQsIDB4YTAwNSwgMHgwMDdjLCAweDExMDIsIDB4MzAwMiwgMHgzMjAyLCAweDQyMDMsCisJMHg0NDAzLCAweDU0MDQsIDB4NTYwNCwgMHg2NjA1LCAweDY4MDUsIDB4NzgwNiwgMHg3YTA2LCAweDBjMDcsCisJMHgwYzA3LCAweDBlMDcsIDB4MzIwMiwgMHg0MjAyLCAweDUyMDIsIDB4NjIwMiwgMHg3MjAyLCAweDY2MDUsCisJMHg3NjA1LCAweDc4MDUsIDB4N2EwNSwgMHg3YzA1LCAweDdlMDUsIDB4N2YwNSwgMHgyMjAyLCAweDMyMDIsCisJMHg0MjAyLCAweDUyMDIsIDB4NTQwNCwgMHg2NDA0LCAweDc0MDQsIDB4NzYwNCwgMHg3ODA0LCAweDdhMDQsCisJMHg3YzA0LCAweDdlMDQsIDB4N2YwNCwgMHg3ODliLCAweDAwMTAsIDB4YTA0NiwgMHgwMDdjLCAweGE3ODQsCisJMHgwZjAwLCAweDgwMGIsIDB4YTc4NCwgMHgwMDFmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsCisJMHhhMTA1LCAweGEwZTAsIDB4NTQwMCwgMHgwMDdjLCAweDc5ZDgsIDB4N2FkYywgMHg3OGQwLCAweDgwMWIsCisJMHgwMGM4LCAweDM4MDMsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsCisJMHgwMDdjLCAweDBmN2UsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDksIDB4NTE0MCwgMHgyMDkxLCAweDgwMDAsCisJMHgyMTA0LCAweDAwNzksIDB4MzgxMywgMHgzODQ5LCAweDM4MWQsIDB4MzgxZCwgMHgzODFkLCAweDM4MWQsCisJMHgzODFkLCAweDM4MWQsIDB4Mzg0ZCwgMHgxMDc4LCAweDIzZWIsIDB4Nzg0YiwgMHgwMDA0LCAweDc4NDgsCisJMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgzODFmLCAweDc4NGIsIDB4MDAwOCwgMHg3ODQ4LCAweGEwODQsCisJMHgwMDA4LCAweDAwYzAsIDB4MzgyNiwgMHg2OGI0LCAweGEwODUsIDB4NDAwMCwgMHg2OGI2LCAweDc4NTgsCisJMHhhMDg1LCAweDQwMDAsIDB4Nzg1YSwgMHg3ODMwLCAweGEwODQsIDB4MDA4MCwgMHgwMGMwLCAweDM4NDksCisJMHgwMDE4LCAweDM4NDksIDB4NjgxYywgMHhhMDg0LCAweDAwMjAsIDB4MDBjMCwgMHgzODQ3LCAweDBlN2UsCisJMHgyMDcxLCAweDUxNDAsIDB4MTA3OCwgMHgzODljLCAweDBlN2YsIDB4MDA3OCwgMHgzODQ5LCAweDc4MWIsCisJMHgwMGNkLCAweDIwOTEsIDB4ODAwMSwgMHgwZjdmLCAweDAwN2MsIDB4NzBiMywgMHgwMDAwLCAweDEwNzgsCisJMHgzYTc2LCAweDAwNzgsIDB4Mzg0OSwgMHgwYzdlLCAweDY4MTQsIDB4ODAwNywgMHhhMDg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGUwLCAweDUzODAsIDB4NjAwNCwgMHhhMDg0LCAweDAwMGEsCisJMHgwMGMwLCAweDM4ODYsIDB4NjEwOCwgMHhhMTk0LCAweGZmMDAsIDB4MDA0MCwgMHgzODg2LCAweGExOGMsCisJMHgwMGZmLCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LCAweDAwNDAsIDB4Mzg3NSwgMHgyMDAxLCAweDAwMzIsCisJMHhhMTA2LCAweDAwNDAsIDB4Mzg3OSwgMHgwMDc4LCAweDM4N2QsIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsCisJMHgzODdmLCAweDIwMDksIDB4MDAzZiwgMHgwMDc4LCAweDM4N2YsIDB4MjAxMSwgMHgwMDAwLCAweDIxMDAsCisJMHhhMjA1LCAweDYwMGEsIDB4NjAwNCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwNiwgMHgwYzdmLCAweDAwN2MsCisJMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDU5LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNjUsCisJMHgwMDc4LCAweDI0NTksIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLCAweDMwMDgsCisJMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDU5LCAweDIwMDksIDB4NTEyMCwgMHgyMTBjLCAweGExODYsCisJMHgwMDAwLCAweDAwNDAsIDB4MzhiMCwgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHgzOGIzLCAweDIwMDksCisJMHg1MTM4LCAweDIwMGIsIDB4MDAwYiwgMHg3MDZmLCAweDAwMDEsIDB4NzgxYiwgMHgwMDQ4LCAweDAwN2MsCisJMHg3ODFiLCAweDAwYzcsIDB4MDA3YywgMHgyMDA5LCAweDUxMzgsIDB4MjAwYiwgMHgwMDBhLCAweDAwN2MsCisJMHgyMDA5LCAweDUxMjAsIDB4MjEwYywgMHhhMTg2LCAweDAwMDAsIDB4MDA0MCwgMHgzOGQzLCAweGExODYsCisJMHgwMDAxLCAweDAwNDAsIDB4MzhjZCwgMHgyMDA5LCAweDUxMzgsIDB4MjAwYiwgMHgwMDBiLCAweDcwNmYsCisJMHgwMDAxLCAweDc4MWIsIDB4MDA0OCwgMHgwMDc4LCAweDI0NTksIDB4MjAwOSwgMHg1MTM4LCAweDIwMGIsCisJMHgwMDBhLCAweDAwNzgsIDB4MjQ1OSwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMGM3LCAweDAwNzgsCisJMHgyNDU5LCAweDc4MWIsIDB4MDBjZCwgMHgwMDc4LCAweDI0NTksIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsCisJMHgwMGNkLCAweDAwNzgsIDB4MjQ1OSwgMHg3ODFiLCAweDAwOGUsIDB4MDA3OCwgMHgyNDU5LCAweDc4MmIsCisJMHgzMDA4LCAweDc4MWIsIDB4MDA4ZSwgMHgwMDc4LCAweDI0NTksIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsCisJMHgwMDQwLCAweDM4ZjQsIDB4NjgxYiwgMHgwMDFkLCAweDcwNmYsIDB4MDAwMSwgMHg3ODFiLCAweDAwNDgsCisJMHgwMDc4LCAweDI0NTksIDB4MDA3ZSwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDM5MTAsCisJMHg3ODA4LCAweGEwODQsIDB4ZmZmYywgMHg3ODBhLCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsCisJMHg3OGVjLCAweGEwODQsIDB4MDAyMSwgMHgwMDQwLCAweDM5MTAsIDB4NzA0NCwgMHg3ODBhLCAweGEwMDUsCisJMHgwMDdmLCAweDAwN2MsIDB4NzA0NCwgMHhhMDg1LCAweDAwMDIsIDB4NzA0NiwgMHg3ODBhLCAweDAwN2MsCisJMHgwMDdlLCAweDc4MzAsIDB4YTA4NCwgMHgwMDQwLCAweDAwYzAsIDB4MzkxOSwgMHgwMDk4LCAweDM5MjQsCisJMHgwMDdmLCAweDc4OWEsIDB4NzhhYywgMHgwMDdjLCAweDc4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDc4MGEsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDIxLCAweDAwNDAsCisJMHgzOTMzLCAweDAwOTgsIDB4MzkzMSwgMHgwMDdmLCAweDc4OWEsIDB4NzhhYywgMHgwMDdlLCAweDcwNDQsCisJMHg3ODBhLCAweDAwN2YsIDB4MDA3YywgMHg3OGVjLCAweGEwODQsIDB4MDAwMiwgMHgwMGMwLCAweDQ3NjAsCisJMHhhNzg0LCAweDAwN2QsIDB4MDBjMCwgMHgzOTQ3LCAweDI3MDAsIDB4MTA3OCwgMHgyM2ViLCAweGE3ODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MmY2ZCwgMHhhNzg0LCAweDAwNzAsIDB4MDA0MCwgMHgzOTU3LCAweDBjN2UsCisJMHgyZDYwLCAweDJmNjgsIDB4MTA3OCwgMHgyMzk2LCAweDJkNzgsIDB4MmM2OCwgMHgwYzdmLCAweGE3ODQsCisJMHgwMDA4LCAweDAwNDAsIDB4Mzk2NCwgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsCisJMHgwMDQwLCAweDI0ODIsIDB4MDA3OCwgMHgzODg4LCAweGE3ODQsIDB4MDAwNCwgMHgwMDQwLCAweDM5OTcsCisJMHg3OGI4LCAweGEwODQsIDB4NDAwMSwgMHgwMDQwLCAweDM5OTcsIDB4Nzg0YiwgMHgwMDA4LCAweDc4ZWMsCisJMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgyNDgyLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA3LCAweGEwODYsCisJMHgwMDAxLCAweDAwYzAsIDB4Mzk5NywgMHg3OGMwLCAweGEwODUsIDB4NDgwMCwgMHgyMDMwLCAweDdlNWEsCisJMHg3ODFiLCAweDAwY2QsIDB4MDA3OCwgMHgyNDU5LCAweDc4NGIsIDB4MDAwOCwgMHg2ODE4LCAweGEwODQsCisJMHg4MDAwLCAweDAwNDAsIDB4Mzk5MywgMHg2ODFiLCAweDAwMTUsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsCisJMHgzOTkzLCAweDY4MWIsIDB4MDAwNywgMHgxMDc4LCAweDM4OWMsIDB4MDA3OCwgMHgyNDU5LCAweDY4MWIsCisJMHgwMDAzLCAweDc4NTgsIDB4YTA4NCwgMHgzZjAwLCAweDY4MWUsIDB4NjgyZiwgMHgwMDAwLCAweDY4MzMsCisJMHgwMDAwLCAweDc4NGIsIDB4MDAwOCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDI5NjUsCisJMHgwMDE4LCAweDI0NTksIDB4MDA3OCwgMHgzNmE1LCAweDZiMTQsIDB4ODMwNywgMHhhMDg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweDUzODAsIDB4MjA2MCwgMHgyMDQ4LCAweDcwNTYsCisJMHg2MDAwLCAweDcwNWEsIDB4NjAwNCwgMHg3MDVlLCAweDJhNjAsIDB4MDA3YywgMHgwMDc5LCAweDM5YzAsCisJMHgzOWM4LCAweDM5YzksIDB4MzljOCwgMHgzOWNiLCAweDM5YzgsIDB4MzljOCwgMHgzOWM4LCAweDM5ZDAsCisJMHgwMDdjLCAweDEwNzgsIDB4MzNlZSwgMHgxMDc4LCAweDQ3NzYsIDB4NzAzOCwgMHg2MDBhLCAweDAwN2MsCisJMHg3MGEwLCAweGEwMDUsIDB4MDA0MCwgMHgzOWRkLCAweDIwNjgsIDB4MTA3OCwgMHgxYjYyLCAweDEwNzgsCisJMHg0NmY4LCAweDEwNzgsIDB4NDZmZiwgMHg3MGEzLCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4NTE0MCwgMHg3MDAwLCAweGEwODYsIDB4MDAwNywgMHgwMGMwLCAweDM5ZjQsCisJMHg2MTEwLCAweDcwYmMsIDB4YTEwNiwgMHgwMGMwLCAweDM5ZjQsIDB4MGU3ZiwgMHgxMDc4LCAweDFiNmYsCisJMHgxMDc4LCAweDM5ZmEsIDB4YTAwNiwgMHgwMDdjLCAweDIwOTEsIDB4ODAwMSwgMHgwZTdmLCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDIwNzEsIDB4NTE0MCwgMHgwMDc4LCAweDIxZmEsCisJMHg3ODViLCAweDAwMDAsIDB4NzBhZiwgMHgwMDBlLCAweDIwMDksIDB4MDEwMCwgMHgwMTdlLCAweDcwYTAsCisJMHhhMDZkLCAweDAwNDAsIDB4M2EwZiwgMHg3MGEzLCAweDAwMDAsIDB4MDA3OCwgMHgzYTE1LCAweDcwYjMsCisJMHgwMDAwLCAweDEwNzgsIDB4MWI4YiwgMHgwMDQwLCAweDNhMWIsIDB4NzBhYywgMHg2ODI2LCAweDEwNzgsCisJMHgzYWY4LCAweDAwNzgsIDB4M2EwZiwgMHgwMTdmLCAweDE1N2UsIDB4MGM3ZSwgMHgwZDdlLCAweDIwYTksCisJMHgwMDA4LCAweDIwNjEsIDB4NzUxMCwgMHg2MDAwLCAweGExMDUsIDB4NjAwMiwgMHg2MDFjLCAweGEwNmQsCisJMHgwMDQwLCAweDNhMzMsIDB4NjgwMCwgMHg2MDFlLCAweDEwNzgsIDB4MTk1YSwgMHg2MDA4LCAweDgwMDAsCisJMHg2MDBhLCAweDAwNzgsIDB4M2EyNiwgMHg2MDE4LCAweGEwNmQsIDB4MDA0MCwgMHgzYTNkLCAweDY4MDAsCisJMHg2MDFhLCAweDEwNzgsIDB4MTk1YSwgMHgwMDc4LCAweDNhMzMsIDB4YWNlMCwgMHgwMDA4LCAweDAwNzAsCisJMHgzYTQzLCAweDAwNzgsIDB4M2EyMywgMHg3MDljLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDNhNGEsCisJMHgxMDc4LCAweDNiNzIsIDB4MGQ3ZiwgMHgwYzdmLCAweDE1N2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHgyMzAwLCAweDY4MDQsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksIDB4M2E1NiwgMHgzYTY2LCAweDNhNjYsCisJMHgzYTY2LCAweDNhNjYsIDB4M2E2NiwgMHgzYTY2LCAweDNhNjgsIDB4M2E2ZSwgMHgzYTY2LCAweDNhNjYsCisJMHgzYTY2LCAweDNhNjYsIDB4M2E2NiwgMHgzYTcwLCAweDNhNjYsIDB4M2E2OCwgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDQ0ZDAsIDB4MTA3OCwgMHgxOTVhLCAweDAwNzgsIDB4M2E3NCwgMHg2ODI3LCAweDAwMGIsCisJMHgxMDc4LCAweDQ0ZDAsIDB4MTA3OCwgMHgzYWY4LCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHgyMzAwLCAweDAwOTgsIDB4M2E5MiwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDNhOTIsCisJMHgwZDdlLCAweDEwNzgsIDB4NDcwOCwgMHgyZDAwLCAweDY4MmUsIDB4MjAwOSwgMHgwMDA0LCAweDIwMDEsCisJMHgwMDAwLCAweDY4MjcsIDB4MDA4NCwgMHgxMDc4LCAweDQ2YzEsIDB4MTA3OCwgMHgzYWY4LCAweDBkN2YsCisJMHgwMDc4LCAweDNhYzYsIDB4Nzk0OCwgMHhhMTg1LCAweDQwMDAsIDB4Nzg0YSwgMHgwMDk4LCAweDNhOWIsCisJMHg3OTRhLCAweDAwNzgsIDB4M2E4MCwgMHg3ODI4LCAweGEwODYsIDB4MTgzNCwgMHgwMGMwLCAweDNhYTQsCisJMHhhMTg1LCAweDAwMDQsIDB4MDA3OCwgMHgzYWFiLCAweDc4MjgsIDB4YTA4NiwgMHgxODE0LCAweDAwYzAsCisJMHgzYTk4LCAweGExODUsIDB4MDAwYywgMHg3ODRhLCAweDc4OWIsIDB4MDAwZSwgMHg3OGFiLCAweDAwMDIsCisJMHg3ODU4LCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1YSwgMHg3MGI0LCAweGEwODAsCisJMHgwMDkxLCAweDc4MWEsIDB4NjgyNywgMHgwMjg0LCAweDY4MmMsIDB4NjgzNiwgMHg2ODMwLCAweDY4M2EsCisJMHgyMDA5LCAweDAwMDQsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDZjMSwgMHgxMjdmLCAweDAwN2MsCisJMHgwZDdlLCAweDZiMTQsIDB4MTA3OCwgMHgxYmZkLCAweDAwNDAsIDB4M2FkNSwgMHgyMDY4LCAweDY4MjcsCisJMHgwMDAyLCAweDEwNzgsIDB4M2FmOCwgMHgwMDc4LCAweDNhY2EsIDB4MGQ3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHg2YjE0LCAweDZjMjgsIDB4YTRhNCwgMHgwMGZmLCAweDEwNzgsIDB4MWI5YiwgMHgwMDQwLCAweDNhZTUsCisJMHgyMDY4LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDNhZjgsIDB4MGQ3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHg2YjE0LCAweGEzOWMsIDB4MDBmZiwgMHgxMDc4LCAweDFiY2UsIDB4MDA0MCwgMHgzYWY2LCAweDIwNjgsCisJMHg2ODI3LCAweDAwMDIsIDB4MTA3OCwgMHgzYWY4LCAweDAwNzgsIDB4M2FlYiwgMHgwZDdmLCAweDAwN2MsCisJMHgwYzdlLCAweDY5MTQsIDB4MTA3OCwgMHgzYjY5LCAweDY5MDQsIDB4YTE4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDA2LCAweDAwNDAsIDB4M2IxMywgMHhhMTg2LCAweDAwMGQsIDB4MDA0MCwgMHgzYjMyLCAweGExODYsCisJMHgwMDE3LCAweDAwYzAsIDB4M2IwZiwgMHgxMDc4LCAweDE5NWEsIDB4MDA3OCwgMHgzYjExLCAweDEwNzgsCisJMHgxYzcyLCAweDBjN2YsIDB4MDA3YywgMHg2MDA0LCAweDgwMDEsIDB4MDA0OCwgMHgzYjMwLCAweDYwMDYsCisJMHgyMDA5LCAweDAwMDAsIDB4YTY4NCwgMHgwMDAxLCAweDAwYzAsIDB4M2IyMCwgMHhhMThkLCAweDgwMDAsCisJMHhhNjg0LCAweDAwMDQsIDB4MDA0MCwgMHgzYjI2LCAweGExOGQsIDB4MDAwMiwgMHg2OTFlLCAweDY4MjMsCisJMHgwMDAwLCAweDcxMDQsIDB4ODEwZiwgMHg2ODE4LCAweGExMDUsIDB4NjgxYSwgMHgwMDc4LCAweDNiMGYsCisJMHgxMDc4LCAweDIzZWIsIDB4NjAxOCwgMHhhMDA1LCAweDAwYzAsIDB4M2I0MSwgMHg2MDA4LCAweDgwMDEsCisJMHgwMDQ4LCAweDNiNDEsIDB4NjAwYSwgMHg2MDFjLCAweDY4MDIsIDB4MmQwMCwgMHg2MDFlLCAweDAwNzgsCisJMHgzYjU3LCAweGFjODgsIDB4MDAwNiwgMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwgMHgzYjRhLCAweDIwMDgsCisJMHgwMDc4LCAweDNiNDMsIDB4NjgwMiwgMHgyZDBhLCAweDYwMDgsIDB4ODAwMSwgMHgwMDQ4LCAweDNiMTEsCisJMHg2MDBhLCAweDYwMTgsIDB4MjA2OCwgMHg2ODAwLCAweDYwMWEsIDB4MDA3OCwgMHgzYjNiLCAweDE1N2UsCisJMHgxMzdlLCAweDE0N2UsIDB4MGM3ZSwgMHgwZDdlLCAweDEwNzgsIDB4MTkzNywgMHgyZGEwLCAweDEzN2YsCisJMHgyMGE5LCAweDAwMzEsIDB4NTNhMywgMHgwYzdmLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwNzgsCisJMHgzYjBmLCAweGExODQsIDB4MDAxZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweDc1MTAsCisJMHgyMDYwLCAweDAwN2MsIDB4MjAxOSwgMHg1MTUxLCAweDIzMDQsIDB4YTA4NSwgMHgwMDAxLCAweDIwMWEsCisJMHgyMDE5LCAweDAxMDIsIDB4MjMwNCwgMHhhMDg1LCAweDAwMDEsIDB4MjAxYSwgMHgwMDdjLCAweDIwMTksCisJMHg1MTUxLCAweDIzMDQsIDB4YTA4NCwgMHhmZmZlLCAweDIwMWEsIDB4MjAxOSwgMHgwMTAyLCAweDIzMDQsCisJMHhhMDg0LCAweGZmZmUsIDB4MjAxYSwgMHgwMDdjLCAweDc5OTAsIDB4YTE4YywgMHhmZmY4LCAweDc5OTIsCisJMHg3MGI0LCAweGEwODAsIDB4MDBkZCwgMHg3ODFhLCAweDAwNzgsIDB4MjQ1OSwgMHg3MGEzLCAweDAwMDAsCisJMHg3MDAzLCAweDAwMDAsIDB4NzA0MywgMHgwMDAxLCAweDcwMzcsIDB4MDAwMCwgMHgwMDE4LCAweDI0MTAsCisJMHgxMDc4LCAweDFiOGIsIDB4MDA0MCwgMHgzYmM3LCAweDIwMDksIDB4NTEwZiwgMHgyMDBiLCAweDAwMDAsCisJMHg2OGJjLCAweDIwNjAsIDB4NjEwMCwgMHhhMTg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYmJiLCAweDY4MjcsCisJMHgwMDBlLCAweGEwODQsIDB4MDIwMCwgMHgwMDQwLCAweDNiYjcsIDB4NjgyNywgMHgwMDE3LCAweDEwNzgsCisJMHgzYWY4LCAweDAwNzgsIDB4M2I5NiwgMHg3MDAwLCAweGEwODYsIDB4MDAwNywgMHgwMGMwLCAweDNjMjksCisJMHgyZDAwLCAweDcwYTIsIDB4YWQ4MCwgMHgwMDBmLCAweDcwMzYsIDB4MDA3OCwgMHgzYmNlLCAweDcwNDAsCisJMHhhMDg2LCAweDAwMDEsIDB4MDA0MCwgMHgyNDkyLCAweDAwNzgsIDB4MjQ1OSwgMHgyMDMxLCAweDAwMDAsCisJMHg2OTFjLCAweGExODQsIDB4MDAwMiwgMHgwMDQwLCAweDNiZDcsIDB4YTZiNSwgMHgwMDA0LCAweGExODQsCisJMHgwMGMwLCAweDgwMDMsIDB4ODAwMywgMHg4MDA3LCAweGEwODAsIDB4M2NjMiwgMHgyMDA0LCAweGE2MzUsCisJMHg2ODIwLCAweGEwODQsIDB4MDQwMCwgMHgwMDQwLCAweDNiZWYsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YWIsCisJMHgwMDAzLCAweDc4OWIsIDB4MDA4MSwgMHg3OGFiLCAweDAwMDEsIDB4YTZiNSwgMHgxMDAwLCAweDY4MjAsCisJMHhhMDg0LCAweDgwMDAsIDB4MDBjMCwgMHgzYmZkLCAweDY4MWMsIDB4YTA4NCwgMHg4MDAwLCAweDAwYzAsCisJMHgzYzA0LCAweGE2YjUsIDB4MDgwMCwgMHgwMDc4LCAweDNjMDQsIDB4YTZiNSwgMHgwNDAwLCAweDc4OWIsCisJMHgwMDBlLCAweDY4MjQsIDB4ODAwNywgMHg3OGFhLCAweDY4MjAsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsCisJMHgzYzBiLCAweGE2YjUsIDB4NDAwMCwgMHhhNjg0LCAweDAyMDAsIDB4MDA0MCwgMHgzYzI1LCAweDY4MmMsCisJMHg3OGQyLCAweDY4MzAsIDB4NzhkNiwgMHhhNjg0LCAweDAxMDAsIDB4MDA0MCwgMHgzYzIzLCAweDY4MmMsCisJMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzYzIzLCAweDc4ODgsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsCisJMHgzYzIzLCAweGE2YjUsIDB4ODAwMCwgMHgxMDc4LCAweDQ2ZjAsIDB4N2U1YSwgMHg2ZWI2LCAweDAwNzgsCisJMHg0NzI3LCAweDEwNzgsIDB4MzhmYSwgMHgwMGMwLCAweDNjYmMsIDB4NzAyYywgMHg4MDA0LCAweDAwNDgsCisJMHgzYzM3LCAweDIwMTksIDB4NGUzYiwgMHgxMDc4LCAweDIyNzYsIDB4NzAyZiwgMHgwMDAxLCAweDIwNDEsCisJMHgwMDAxLCAweDIwMzEsIDB4MTAwMCwgMHg3ODliLCAweDAwMTgsIDB4NjgxNCwgMHhhMDg0LCAweDAwMWYsCisJMHhhMDg1LCAweDAwODAsIDB4NzhhYSwgMHg2OTFjLCAweGExODQsIDB4MDAwMiwgMHgwMDQwLCAweDNjNTAsCisJMHhhNmI1LCAweDAwMDQsIDB4NzhhYiwgMHgwMDIwLCAweDY4MjgsIDB4NzhhYSwgMHhhOGMwLCAweDAwMDIsCisJMHg2ODFjLCAweGQwZjQsIDB4MDA0MCwgMHgzYzU5LCAweDJjNTAsIDB4MTA3OCwgMHgzOWFjLCAweDEwNzgsCisJMHg0NWZmLCAweDY4MjAsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4M2M2NywgMHhhNmI1LCAweDA0MDAsCisJMHg3ODliLCAweDAwMGUsIDB4NjgyNCwgMHg4MDA3LCAweDc4YWEsIDB4MDA3OCwgMHgzYzZlLCAweDY4MWMsCisJMHhhMDg0LCAweDgwMDAsIDB4MDBjMCwgMHgzYzZlLCAweGE2YjUsIDB4MDgwMCwgMHg2ODIwLCAweGEwODQsCisJMHgwMTAwLCAweDAwNDAsIDB4M2M3NSwgMHhhNmI1LCAweDQwMDAsIDB4NjgxYywgMHhhMDg0LCAweDAwYzAsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwNywgMHhhMDgwLCAweDNjYzIsIDB4MjAwNCwgMHhhNjM1LCAweGE2ODQsCisJMHgwMTAwLCAweDAwNDAsIDB4M2M4ZiwgMHg2ODJjLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDNjOGYsCisJMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDNjOGYsIDB4YTZiNSwgMHg4MDAwLCAweDc4OWIsCisJMHgwMDdlLCAweDdlYWUsIDB4NmViNiwgMHg2ODE0LCAweDgwMDcsIDB4NzhhYSwgMHg3ODgyLCAweDI4MTAsCisJMHg3YWFhLCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4M2NiYywgMHgwMDE4LCAweDNjYmMsCisJMHg3MGI0LCAweGEwODAsIDB4MDBlMiwgMHg3ODFhLCAweDEwNzgsIDB4MzkxMiwgMHhhNjg0LCAweDAyMDAsCisJMHgwMDQwLCAweDNjYjAsIDB4NjgyYywgMHg3OGQyLCAweDY4MzAsIDB4NzhkNiwgMHgxMDc4LCAweDQ2ZjAsCisJMHgyZDAwLCAweDcwYTIsIDB4NzA0YSwgMHg2ODEwLCAweDcwYmUsIDB4NzAwMywgMHgwMDA3LCAweGFkODAsCisJMHgwMDBmLCAweDcwMzYsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4MWI2MiwgMHgxMDc4LCAweDM5MTIsCisJMHgwMDc4LCAweDI0NTksIDB4MDAwMCwgMHgwMzAwLCAweDAyMDAsIDB4MDAwMCwgMHgxMDc4LCAweDIzZWIsCisJMHgyMzAwLCAweDAwNzksIDB4M2NjYiwgMHgzY2NlLCAweDNjY2UsIDB4M2NkMCwgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDQ2ZmYsIDB4NjkyNCwgMHhhMTg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDBhLCAweDAwNDAsCisJMHgzY2UyLCAweGExODQsIDB4ZmYwMCwgMHhhMDg1LCAweDAwMGEsIDB4NjgyNiwgMHgxMDc4LCAweDFiNjIsCisJMHgwMDc4LCAweDNiOTYsIDB4MjAwMSwgMHgwMDBhLCAweDEwNzgsIDB4NDY5MSwgMHgwMDc4LCAweDNiOTYsCisJMHhhMjgyLCAweDAwMDUsIDB4MDA1MCwgMHgzY2VlLCAweDEwNzgsIDB4MjNlYiwgMHg3MDAwLCAweGEwODQsCisJMHgwMDA3LCAweDEwYzAsIDB4MzliZSwgMHgxMDc4LCAweDE5MzcsIDB4MDBjMCwgMHgzZDBkLCAweGE2ODQsCisJMHgwMDA0LCAweDAwNDAsIDB4M2NmZiwgMHgyMDAxLCAweDI4MDAsIDB4MDA3OCwgMHgzZDAxLCAweDIwMDEsCisJMHgwODAwLCAweDcxYjQsIDB4YTE4OCwgMHgwMDkxLCAweDc4OWIsIDB4MDAwZSwgMHg3OGFhLCAweDIwMzEsCisJMHgwNDAwLCAweDdlNWEsIDB4NzkxYSwgMHgwMDc4LCAweDI0NTksIDB4NjgwNywgMHgwMTA2LCAweDY4MGIsCisJMHgwMDAwLCAweDY4OWYsIDB4MDAwMCwgMHg2ODI3LCAweDAwMDAsIDB4YTM4NiwgMHgwMDAyLCAweDAwYzAsCisJMHgzZDJlLCAweGEyODYsIDB4MDAwMiwgMHgwMGMwLCAweDNkMmUsIDB4NzhhMCwgMHhhMDA1LCAweDAwYzAsCisJMHgzZDJlLCAweGE0ODQsIDB4ODAwMCwgMHgwMGMwLCAweDNkMmUsIDB4NzhlNCwgMHhhMDg0LCAweDAwMDgsCisJMHgwMDQwLCAweDNkMmUsIDB4YTZiNSwgMHgwMDA4LCAweDIwMTksIDB4MDAwMCwgMHgxMDc4LCAweDQxMWUsCisJMHgyZDAwLCAweDcwYTIsIDB4NzA0YSwgMHg3MDAzLCAweDAwMDcsIDB4NzAzNywgMHgwMDAwLCAweDY4MjQsCisJMHhhMDg0LCAweDAwODAsIDB4MDA0MCwgMHgzZDQwLCAweDEwNzgsIDB4NDFkMCwgMHgwMDc4LCAweDI0NTksCisJMHgyMzAwLCAweDAwNzksIDB4M2Q0MywgMHgzZDQ2LCAweDNkYzcsIDB4M2RlNiwgMHgyMjAwLCAweDAwNzksCisJMHgzZDQ5LCAweDNkNGUsIDB4M2Q1ZSwgMHgzZDg0LCAweDNkOTAsIDB4M2RiMywgMHgyMDI5LCAweDAwMDEsCisJMHhhMDI2LCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDQyZjEsIDB4MDA3OSwgMHgzZDU3LCAweDNkNWMsCisJMHgyNDU5LCAweDNiOTYsIDB4M2Q1YywgMHgzZDVjLCAweDEwNzgsIDB4MjNlYiwgMHg3OTkwLCAweGExOGMsCisJMHgwMDA3LCAweDAwYzAsIDB4M2Q2NSwgMHgyMDA5LCAweDAwMDgsIDB4MjAxMSwgMHgwMDAxLCAweGE2ODQsCisJMHgwMDA0LCAweDAwNDAsIDB4M2Q2ZCwgMHgyMDExLCAweDAwMDMsIDB4MjIyMCwgMHhhMTJhLCAweDIwMTEsCisJMHgwMDAxLCAweDEwNzgsIDB4NDJmMSwgMHgwMDc5LCAweDNkNzUsIDB4M2Q3YSwgMHgyNDU5LCAweDNiOTYsCisJMHgzZDgyLCAweDNkN2MsIDB4MDA3OCwgMHg0NzJkLCAweDcwYWIsIDB4M2Q4MCwgMHgwMDc4LCAweDI0NTksCisJMHgwMDc4LCAweDNkN2EsIDB4MTA3OCwgMHgyM2ViLCAweGE2ODQsIDB4MDAxMCwgMHgwMDQwLCAweDNkOGUsCisJMHgxMDc4LCAweDQxOWYsIDB4MDA0MCwgMHgzZDhlLCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDQyMGMsCisJMHg2MDAwLCAweGEwODQsIDB4MDAwMiwgMHgwMDQwLCAweDNkYWQsIDB4NzBiNCwgMHhhMDgwLCAweDAwZDIsCisJMHg3ODFhLCAweDBkN2UsIDB4MTA3OCwgMHg0NzA4LCAweDJkMDAsIDB4NjgyZSwgMHg2ODI3LCAweDAwMDAsCisJMHgxMDc4LCAweDNhZjgsIDB4MGQ3ZiwgMHgxMDc4LCAweDE5NWEsIDB4NzAwMywgMHgwMDAwLCAweDcwMzcsCisJMHgwMDAwLCAweDcwNGIsIDB4MDAwMCwgMHgwMDc4LCAweDNiOTYsIDB4YTY4NCwgMHgwMDA0LCAweDAwYzAsCisJMHgzZGIzLCAweDAwNzgsIDB4NDcyZCwgMHg2MDAwLCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDNkYzUsCisJMHg2MDAwLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDNkYzUsIDB4NzBhYiwgMHgzZGM1LCAweDIwMDEsCisJMHgwMDA3LCAweDEwNzgsIDB4NDY4OSwgMHgwMDc4LCAweDQ3MzMsIDB4MDA3OCwgMHg0NzJkLCAweDIyMDAsCisJMHgwMDc5LCAweDNkY2EsIDB4M2RjZiwgMHgzZGNmLCAweDNkY2YsIDB4M2RkMSwgMHgzZGNmLCAweDEwNzgsCisJMHgyM2ViLCAweDcwYTcsIDB4M2RkNSwgMHgwMDc4LCAweDQ3MzksIDB4MjAxMSwgMHgwMDE4LCAweDEwNzgsCisJMHg0MmViLCAweDAwNzksIDB4M2RkYiwgMHgzZGUwLCAweDI0NTksIDB4M2I5NiwgMHgzZGUyLCAweDNkZTQsCisJMHgxMDc4LCAweDIzZWIsIDB4MTA3OCwgMHgyM2ViLCAweDEwNzgsIDB4MjNlYiwgMHgyMjAwLCAweDAwNzksCisJMHgzZGU5LCAweDNkZWUsIDB4M2RmMCwgMHgzZGYwLCAweDNkZWUsIDB4M2RlZSwgMHgxMDc4LCAweDIzZWIsCisJMHg3OGU0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDNlMDUsIDB4NzBhNywgMHgzZGY5LCAweDAwNzgsCisJMHg0NzM5LCAweDIwMTEsIDB4MDAwNCwgMHgxMDc4LCAweDQyZWIsIDB4MDA3OSwgMHgzZGZmLCAweDNlMDUsCisJMHgyNDU5LCAweDNiOTYsIDB4M2UwNSwgMHgzZTBmLCAweDNlMTMsIDB4NzBhYiwgMHgzZTBkLCAweDIwMDEsCisJMHgwMDAzLCAweDEwNzgsIDB4NDY4OSwgMHgwMDc4LCAweDQ3MzMsIDB4MDA3OCwgMHg0NzJkLCAweDcwYWIsCisJMHgzZTA1LCAweDAwNzgsIDB4MjQ1OSwgMHg3MGFiLCAweDNlMTcsIDB4MDA3OCwgMHgyNDU5LCAweDAwNzgsCisJMHgzZTBkLCAweGEyODIsIDB4MDAwMywgMHgwMDUwLCAweDNlMWYsIDB4MTA3OCwgMHgyM2ViLCAweGEzODYsCisJMHgwMDAyLCAweDAwYzAsIDB4M2UzOCwgMHhhMjg2LCAweDAwMDIsIDB4MDBjMCwgMHgzZTNlLCAweDc4YTAsCisJMHhhMDA1LCAweDAwYzAsIDB4M2UzZSwgMHhhNDg0LCAweDgwMDAsIDB4MDBjMCwgMHgzZTNlLCAweDc4ZTQsCisJMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHgzZTM4LCAweGE2YjUsIDB4MDAwOCwgMHgyMDE5LCAweDAwMDAsCisJMHhhNjg0LCAweDAwMDgsIDB4MDA0MCwgMHgzZTNlLCAweDEwNzgsIDB4NDE3YywgMHg2ODEwLCAweDcwYmUsCisJMHg3MDAzLCAweDAwMDcsIDB4MjMwMCwgMHgwMDc5LCAweDNlNDUsIDB4M2U0OCwgMHgzZTc1LCAweDNlN2QsCisJMHgyMjAwLCAweDAwNzksIDB4M2U0YiwgMHgzZTUwLCAweDNlNGUsIDB4M2U2OSwgMHgxMDc4LCAweDIzZWIsCisJMHg3OTkwLCAweGExYWMsIDB4MDAwNywgMHhhMDI2LCAweDIwMTEsIDB4MDAwMSwgMHgxMDc4LCAweDQyZjEsCisJMHgwMDc5LCAweDNlNWEsIDB4M2U1ZiwgMHgyNDU5LCAweDNiOTYsIDB4M2U2NywgMHgzZTYxLCAweDAwNzgsCisJMHg0NzJkLCAweDcwYWIsIDB4M2U2NSwgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHgzZTVmLCAweDEwNzgsCisJMHgyM2ViLCAweGE2ODQsIDB4MDAxMCwgMHgwMDQwLCAweDNlNzMsIDB4MTA3OCwgMHg0MTlmLCAweDAwNDAsCisJMHgzZTczLCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDQyMGMsIDB4MjIwMCwgMHgwMDc5LCAweDNlNzgsCisJMHgzZTdiLCAweDNlN2IsIDB4M2U3YiwgMHgxMDc4LCAweDIzZWIsIDB4MjIwMCwgMHgwMDc5LCAweDNlODAsCisJMHgzZTgzLCAweDNlODUsIDB4M2U4NSwgMHgxMDc4LCAweDIzZWIsIDB4NzhlNCwgMHhhMDg0LCAweDAwMDgsCisJMHgwMDQwLCAweDNlOWEsIDB4NzBhNywgMHgzZThlLCAweDAwNzgsIDB4NDczOSwgMHgyMDExLCAweDAwMDQsCisJMHgxMDc4LCAweDQyZWIsIDB4MDA3OSwgMHgzZTk0LCAweDNlOWEsIDB4MjQ1OSwgMHgzYjk2LCAweDNlOWEsCisJMHgzZWE0LCAweDNlYTgsIDB4NzBhYiwgMHgzZWEyLCAweDIwMDEsIDB4MDAwMywgMHgxMDc4LCAweDQ2ODksCisJMHgwMDc4LCAweDQ3MzMsIDB4MDA3OCwgMHg0NzJkLCAweDcwYWIsIDB4M2U5YSwgMHgwMDc4LCAweDI0NTksCisJMHg3MGFiLCAweDNlYWMsIDB4MDA3OCwgMHgyNDU5LCAweDAwNzgsIDB4M2VhMiwgMHgyMzAwLCAweDAwNzksCisJMHgzZWIxLCAweDNlYjYsIDB4M2ViOCwgMHgzZWI0LCAweDEwNzgsIDB4MjNlYiwgMHg3MGE0LCAweDAwN2EsCisJMHg3MGE0LCAweDAwN2EsIDB4YTI4MiwgMHgwMDAyLCAweDAwNTAsIDB4M2VjMCwgMHgxMDc4LCAweDIzZWIsCisJMHhhNjg0LCAweDAyMDAsIDB4MDA0MCwgMHgzZWNhLCAweDEwNzgsIDB4NDZmOCwgMHgxMDc4LCAweDQyZDMsCisJMHgxMDc4LCAweDQ2ZmYsIDB4MjMwMCwgMHgwMDc5LCAweDNlY2QsIDB4M2VkMCwgMHgzZWY0LCAweDNmNWEsCisJMHhhMjg2LCAweDAwMDEsIDB4MDA0MCwgMHgzZWQ2LCAweDEwNzgsIDB4MjNlYiwgMHhhNjg0LCAweDAyMDAsCisJMHgwMDQwLCAweDNlZGUsIDB4MTA3OCwgMHg0NmY4LCAweDEwNzgsIDB4NDZmZiwgMHgyMDAxLCAweDAwMDEsCisJMHgxMDc4LCAweDQ2OTEsIDB4NzhiOCwgMHhhMDg0LCAweGMwMDEsIDB4MDA0MCwgMHgzZWYwLCAweDc4NDgsCisJMHhhMDg1LCAweDAwMDgsIDB4Nzg0YSwgMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDNlZWIsCisJMHg3MDAzLCAweDAwMDAsIDB4MDA3OCwgMHgzYjk2LCAweDIyMDAsIDB4MDA3OSwgMHgzZWY3LCAweDNlZjksCisJMHgzZjJhLCAweDcwYTcsIDB4M2VmZCwgMHgwMDc4LCAweDQ3MzksIDB4MjAxMSwgMHgwMDBkLCAweDEwNzgsCisJMHg0MmViLCAweDAwNzksIDB4M2YwMywgMHgzZjBhLCAweDI0NTksIDB4M2I5NiwgMHgzZjEyLCAweDNmMWEsCisJMHgzZjIwLCAweDNmMjIsIDB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsCisJMHgwMDc4LCAweDQ3MjcsIDB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsCisJMHgwMDc4LCAweDQ3MjcsIDB4NzBhYiwgMHgzZjFlLCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDNmMGEsCisJMHgxMDc4LCAweDIzZWIsIDB4NzBhYiwgMHgzZjI2LCAweDAwNzgsIDB4MjQ1OSwgMHgxMDc4LCAweDQ3M2YsCisJMHgwMDc4LCAweDI0NTksIDB4NzBhNywgMHgzZjJlLCAweDAwNzgsIDB4NDczOSwgMHgyMDExLCAweDAwMTIsCisJMHgxMDc4LCAweDQyZWIsIDB4MDA3OSwgMHgzZjM0LCAweDNmM2EsIDB4MjQ1OSwgMHgzYjk2LCAweDNmNDYsCisJMHgzZjRlLCAweDNmNTQsIDB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsCisJMHg3MGI0LCAweGEwODAsIDB4MDBhNiwgMHg3ODFhLCAweDAwNzgsIDB4MjQ1OSwgMHhhNmI0LCAweDAwZmYsCisJMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDcyNywgMHg3MGFiLCAweDNmNTIsCisJMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHgzZjNhLCAweDcwYWIsIDB4M2Y1OCwgMHgwMDc4LCAweDI0NTksCisJMHgwMDc4LCAweDNmNDYsIDB4YTI4NiwgMHgwMDAxLCAweDAwNDAsIDB4M2Y2MCwgMHgxMDc4LCAweDIzZWIsCisJMHg3MGE3LCAweDNmNjQsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsIDB4MDAxNSwgMHgxMDc4LCAweDQyZWIsCisJMHgwMDc5LCAweDNmNmEsIDB4M2Y2ZiwgMHgyNDU5LCAweDNiOTYsIDB4M2Y3ZCwgMHgzZjg5LCAweGE2YjQsCisJMHgwMGZmLCAweGE2YjUsIDB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsIDB4NzgzYiwgMHgxMzAxLCAweDcwYjQsCisJMHhhMDgwLCAweDAwYjQsIDB4NzgxYSwgMHgwMDc4LCAweDI0NTksIDB4YTZiNCwgMHgwMGZmLCAweGE2YjUsCisJMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHg3MGI0LCAweGEwODAsIDB4MDBhNiwgMHg3ODFhLCAweDAwNzgsCisJMHgyNDU5LCAweDcwYWIsIDB4M2Y4ZCwgMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHgzZjZmLCAweGEyODIsCisJMHgwMDAzLCAweDAwNTAsIDB4M2Y5NSwgMHgxMDc4LCAweDIzZWIsIDB4MjMwMCwgMHgwMDc5LCAweDNmOTgsCisJMHgzZjliLCAweDNmZDIsIDB4NDAyZCwgMHhhMjg2LCAweDAwMDEsIDB4MDA0MCwgMHgzZmExLCAweDEwNzgsCisJMHgyM2ViLCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDNmYWUsCisJMHgxMDc4LCAweDNhZjgsIDB4NzAwMywgMHgwMDAwLCAweDAwNzgsIDB4M2I5NiwgMHg2ODNiLCAweDAwMDAsCisJMHg2ODM3LCAweDAwMDAsIDB4YTY4NCwgMHgwMjAwLCAweDAwNDAsIDB4M2ZiYywgMHgxMDc4LCAweDQ2ZjgsCisJMHgxMDc4LCAweDQyZDMsIDB4MTA3OCwgMHg0NmZmLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDQ2OTEsCisJMHg3OGI4LCAweGEwODQsIDB4YzAwMSwgMHgwMDQwLCAweDNmY2UsIDB4Nzg0OCwgMHhhMDg1LCAweDAwMDgsCisJMHg3ODRhLCAweDc4NDgsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4M2ZjOSwgMHg3MDAzLCAweDAwMDAsCisJMHgwMDc4LCAweDNiOTYsIDB4MjIwMCwgMHgwMDc5LCAweDNmZDUsIDB4M2ZkNywgMHg0MDA4LCAweDcwYTcsCisJMHgzZmRiLCAweDAwNzgsIDB4NDczOSwgMHgyMDExLCAweDAwMGQsIDB4MTA3OCwgMHg0MmViLCAweDAwNzksCisJMHgzZmUxLCAweDNmZTgsIDB4MjQ1OSwgMHgzYjk2LCAweDNmZjAsIDB4M2ZmOCwgMHgzZmZlLCAweDQwMDAsCisJMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwgMHgwODAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ3MjcsCisJMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwgMHgwODAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ3MjcsCisJMHg3MGFiLCAweDNmZmMsIDB4MDA3OCwgMHgyNDU5LCAweDAwNzgsIDB4M2ZlOCwgMHgxMDc4LCAweDIzZWIsCisJMHg3MGFiLCAweDQwMDQsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4NDczZiwgMHgwMDc4LCAweDI0NTksCisJMHg3MGE3LCAweDQwMGMsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsIDB4MDAwNSwgMHgxMDc4LCAweDQyZWIsCisJMHgwMDc5LCAweDQwMTIsIDB4NDAxNywgMHgyNDU5LCAweDNiOTYsIDB4NDAxZiwgMHg0MDI3LCAweGE2YjQsCisJMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NzI3LCAweGE2YjQsCisJMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NzI3LCAweDcwYWIsCisJMHg0MDJiLCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDQwMTcsIDB4YTI4NiwgMHgwMDAxLCAweDAwNDAsCisJMHg0MDMzLCAweDEwNzgsIDB4MjNlYiwgMHg3MGE3LCAweDQwMzcsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsCisJMHgwMDA2LCAweDEwNzgsIDB4NDJlYiwgMHgwMDc5LCAweDQwM2QsIDB4NDA0MiwgMHgyNDU5LCAweDNiOTYsCisJMHg0MDQ4LCAweDQwNTIsIDB4YTZiNSwgMHgwODAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ3MjcsCisJMHhhNmI0LCAweDAwZmYsIDB4YTZiNSwgMHgwODAwLCAweDZlYjYsIDB4YTZiNSwgMHg0MDAwLCAweDdlNWEsCisJMHgwMDc4LCAweDQ3MjcsIDB4NzBhYiwgMHg0MDU2LCAweDAwNzgsIDB4MjQ1OSwgMHgwMDc4LCAweDQwNDIsCisJMHgyMzAwLCAweDAwNzksIDB4NDA1YiwgMHg0MDYwLCAweDQwNWUsIDB4NDA1ZSwgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDIzZWIsIDB4MjMwMCwgMHg3MWE4LCAweGEwMDUsIDB4MDE3YSwgMHg2ODEwLCAweDcwYmUsCisJMHhhMjgyLCAweDAwMDMsIDB4MDA1MCwgMHg0MDZlLCAweDEwNzgsIDB4MjNlYiwgMHgyMzAwLCAweDAwNzksCisJMHg0MDcxLCAweDQwNzQsIDB4NDA4MiwgMHg0MGE0LCAweGE2ODQsIDB4MDIwMCwgMHgwMDQwLCAweDQwN2MsCisJMHgxMDc4LCAweDQ2ZjgsIDB4MTA3OCwgMHg0NmZmLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDQ2OTEsCisJMHgwMDc4LCAweDI0NTksIDB4YTI5NiwgMHgwMDAyLCAweDAwNDAsIDB4NDA4YiwgMHg4MmZmLCAweDAwNDAsCisJMHg0MDhiLCAweDEwNzgsIDB4MjNlYiwgMHg3MGE3LCAweDQwOGYsIDB4MDA3OCwgMHg0NzM5LCAweDIwMTEsCisJMHgwMDE4LCAweDEwNzgsIDB4NDJlYiwgMHgwMDc5LCAweDQwOTUsIDB4NDA5YSwgMHgyNDU5LCAweDNiOTYsCisJMHg0MDljLCAweDQwOWUsIDB4MDA3OCwgMHg0NzI3LCAweDAwNzgsIDB4NDcyNywgMHg3MGFiLCAweDQwYTIsCisJMHgwMDc4LCAweDI0NTksIDB4MDA3OCwgMHg0MDlhLCAweDIyMDAsIDB4MDA3OSwgMHg0MGE3LCAweDQwYTksCisJMHg0MGMyLCAweDcwYTcsIDB4NDBhZCwgMHgwMDc4LCAweDQ3MzksIDB4MjAxMSwgMHgwMDE3LCAweDEwNzgsCisJMHg0MmViLCAweDAwNzksIDB4NDBiMywgMHg0MGI4LCAweDI0NTksIDB4M2I5NiwgMHg0MGJhLCAweDQwYmMsCisJMHgwMDc4LCAweDQ3MjcsIDB4MDA3OCwgMHg0NzI3LCAweDcwYWIsIDB4NDBjMCwgMHgwMDc4LCAweDI0NTksCisJMHgwMDc4LCAweDQwYjgsIDB4YTQ4NCwgMHg4MDAwLCAweDAwYzAsIDB4NDEwYywgMHhhNjg0LCAweDAxMDAsCisJMHgwMDQwLCAweDQwZDYsIDB4MTA3OCwgMHg0NmY4LCAweDEwNzgsIDB4NDJkMywgMHgxMDc4LCAweDQ2ZmYsCisJMHg3ODQ4LCAweGEwODUsIDB4MDAwYywgMHg3ODRhLCAweDAwNzgsIDB4NDBkYSwgMHg3OGQ4LCAweDc4ZDIsCisJMHg3OGRjLCAweDc4ZDYsIDB4YTZiNCwgMHhlZmZmLCAweDdlNWEsIDB4NzBhNywgMHg0MGUxLCAweDAwNzgsCisJMHg0NzM5LCAweDIwMTEsIDB4MDAwZCwgMHgxMDc4LCAweDQyZWIsIDB4MDA3OSwgMHg0MGU3LCAweDQwZWUsCisJMHgyNDU5LCAweDNiOTYsIDB4NDBlZSwgMHg0MGZjLCAweDQxMDIsIDB4NDEwNCwgMHhhNjg0LCAweDAxMDAsCisJMHgwMDQwLCAweDQwZmEsIDB4MTA3OCwgMHg0NmI2LCAweDY4MmMsIDB4NzhkMiwgMHg2ODMwLCAweDc4ZDYsCisJMHgxMDc4LCAweDQ2ZjAsIDB4MDA3OCwgMHg0NzI3LCAweDcwYWIsIDB4NDEwMCwgMHgwMDc4LCAweDI0NTksCisJMHgwMDc4LCAweDQwZWUsIDB4MTA3OCwgMHgyM2ViLCAweDcwYWIsIDB4NDEwOCwgMHgwMDc4LCAweDI0NTksCisJMHgxMDc4LCAweDQ3M2YsIDB4MDA3OCwgMHgyNDU5LCAweDEwNzgsIDB4NDZmZiwgMHg3MGFiLCAweDQxMTYsCisJMHgyMDAxLCAweDAwMDMsIDB4MTA3OCwgMHg0Njg5LCAweDAwNzgsIDB4NDczMywgMHgxMDc4LCAweDQ2ZjAsCisJMHg2ODJjLCAweDc4ZDIsIDB4NjgzMCwgMHg3OGQ2LCAweDAwNzgsIDB4NDcyNywgMHg3MGI4LCAweDY4MTIsCisJMHg3MGJlLCAweDgwMDAsIDB4NzBiYSwgMHg2ODFiLCAweDAwMDAsIDB4YTY4NCwgMHgwMDA4LCAweDAwNDAsCisJMHg0MTQxLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDc4OTAsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsCisJMHg4MDA0LCAweGEwODQsIDB4MDAwZiwgMHg2ODFhLCAweDgwYWMsIDB4Nzg5YiwgMHgwMDAwLCAweGFmODAsCisJMHgwMDJiLCAweDIwOTgsIDB4YWQ4MCwgMHgwMDBiLCAweDIwYTAsIDB4NTNhNSwgMHgxNDdmLCAweDEzN2YsCisJMHgxNTdmLCAweGE2YzQsIDB4MGYwMCwgMHhhNjg0LCAweDAwMDIsIDB4MDBjMCwgMHg0MTUwLCAweDY5MmMsCisJMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHhhMTg0LCAweDAwMDcsIDB4MjAwOCwgMHgwMDc4LCAweDQxNWYsCisJMHg3ODliLCAweDAwMTAsIDB4NzlhYywgMHhhMTg0LCAweDAwMjAsIDB4MDA0MCwgMHg0MTVmLCAweDAxN2UsCisJMHgyMDA5LCAweDAwMDUsIDB4MjAwMSwgMHgzZDAwLCAweDEwNzgsIDB4NDZjMSwgMHgwMTdmLCAweGExODQsCisJMHgwMDFmLCAweGE4MDUsIDB4NjgxNiwgMHgxMDc4LCAweDNiNjksIDB4NjhiZSwgMHhhNjg0LCAweDAwMDQsCisJMHgwMDQwLCAweDQxNzAsIDB4YTE4YywgMHhmZjAwLCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLCAweGExMDUsCisJMHg2ODJhLCAweGE2YjQsIDB4MDBmZiwgMHg2MDAwLCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDQxN2EsCisJMHhhNmI1LCAweDQwMDAsIDB4NmViNiwgMHgwMDdjLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDY5MTgsCisJMHg3ODkwLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4YTA4NCwgMHgwMDBmLCAweDAwN2UsCisJMHhhMTAwLCAweDY4MWEsIDB4MDA3ZiwgMHg4MDAwLCAweDgwMDQsIDB4MDA0MCwgMHg0MTliLCAweDIwYTgsCisJMHg4MTA0LCAweGEwODAsIDB4MDAwYiwgMHhhZDAwLCAweDIwYTAsIDB4Nzg5YiwgMHgwMDAwLCAweGFmODAsCisJMHgwMDJiLCAweDIwOTgsIDB4NTNhNSwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDY4MmMsCisJMHhhMDg0LCAweDAwMjAsIDB4MDBjMCwgMHg0MWE3LCAweDYyMGMsIDB4MDA3OCwgMHg0MWE4LCAweDYyMTAsCisJMHg2YjE4LCAweDIzMDAsIDB4YTIwMiwgMHgwMDQwLCAweDQxYzgsIDB4MjAxOCwgMHhhMzgyLCAweDAwMGUsCisJMHgwMDQ4LCAweDQxYjgsIDB4MDA0MCwgMHg0MWI4LCAweDIwMTksIDB4MDAwZSwgMHgwMDc4LCAweDQxYmMsCisJMHg3ODU4LCAweGEwODQsIDB4ZmZlZiwgMHg3ODVhLCAweDc4M2IsIDB4MWIwMSwgMHg3ODkzLCAweDAwMDAsCisJMHg3YmEyLCAweDcwYjQsIDB4YTA4MCwgMHgwMDhlLCAweDc4MWEsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsCisJMHg3ODU4LCAweGEwODQsIDB4ZmZlZiwgMHg3ODVhLCAweDc4OTMsIDB4MDAwMCwgMHhhMDA2LCAweDAwN2MsCisJMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LCAweDAwMDcsIDB4MDA0MCwgMHg0MWRkLCAweGExOTYsCisJMHgwMDBmLCAweDAwNDAsIDB4NDFkZCwgMHg2ODA3LCAweDAxMTcsIDB4NjkxNCwgMHgxMDc4LCAweDNiNjksCisJMHg2MTAwLCAweDgxMDQsIDB4MDBjOCwgMHg0MWY4LCAweDYwMWMsIDB4YTAwNSwgMHgwMDQwLCAweDQxZWMsCisJMHgyMDAxLCAweDA4MDAsIDB4MDA3OCwgMHg0MWZhLCAweDBkN2UsIDB4NjgyNCwgMHgwMDdlLCAweDEwNzgsCisJMHg0NzA4LCAweDAwN2YsIDB4NjgyNiwgMHgyZDAwLCAweDY4MmUsIDB4MTA3OCwgMHgzYWY4LCAweDBkN2YsCisJMHgyMDAxLCAweDAyMDAsIDB4NjgyNiwgMHg4MDA3LCAweDc4OWIsIDB4MDAwZSwgMHg3OGFhLCAweDY4MjAsCisJMHhhMDg1LCAweDgwMDAsIDB4NjgyMiwgMHgyMDMxLCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLCAweDcxYjQsCisJMHhhMTg4LCAweDAwOTEsIDB4NzkxYSwgMHgwMDdjLCAweGE2YzQsIDB4MGYwMCwgMHhhNjg0LCAweDAwMDIsCisJMHgwMGMwLCAweDQyMjAsIDB4NjkyYywgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHhhMTg0LCAweDAwMDcsCisJMHgyMDA4LCAweGE4MDUsIDB4NjgxNiwgMHgxMDc4LCAweDNiNjksIDB4NjhiZSwgMHgwMDc4LCAweDQyMjMsCisJMHg2OTE0LCAweDEwNzgsIDB4M2I2OSwgMHg2MTAwLCAweDgxMDQsIDB4MDBjOCwgMHg0MjgwLCAweGExODQsCisJMHgwMzAwLCAweDAwNDAsIDB4NDIyZiwgMHg2ODA3LCAweDAxMTcsIDB4MDA3OCwgMHg0MjRkLCAweDYwMDQsCisJMHhhMDA1LCAweDAwYzAsIDB4NDI1NiwgMHg2ODA3LCAweDAxMTcsIDB4NjAxYywgMHhhMDA1LCAweDAwYzAsCisJMHg0MjQzLCAweDBkN2UsIDB4MTA3OCwgMHg0NzA4LCAweDY4MjcsIDB4MDAzNCwgMHgyZDAwLCAweDY4MmUsCisJMHgxMDc4LCAweDNhZjgsIDB4MGQ3ZiwgMHhhNjg0LCAweDAwMDQsIDB4MDA0MCwgMHg0MjRkLCAweDIwMzEsCisJMHgwNDAwLCAweDIwMDEsIDB4MjgwMCwgMHgwMDc4LCAweDQyNTEsIDB4MjAzMSwgMHgwNDAwLCAweDIwMDEsCisJMHgwODAwLCAweDcxYjQsIDB4YTE4OCwgMHgwMDkxLCAweDAwNzgsIDB4NDJhZSwgMHg2MDE4LCAweGEwMDUsCisJMHgwMGMwLCAweDQyNDMsIDB4NjAxYywgMHhhMDA1LCAweDAwYzAsIDB4NDI0MywgMHg2ODlmLCAweDAwMDAsCisJMHg2ODI3LCAweDAwM2QsIDB4YTY4NCwgMHgwMDAxLCAweDAwNDAsIDB4NDJiYywgMHhkNjk0LCAweDAwYzAsCisJMHg0Mjc5LCAweDYxMDAsIDB4ZDFkNCwgMHgwMDQwLCAweDQyNzksIDB4NjkyYywgMHg4MWZmLCAweDAwNDAsCisJMHg0MmJjLCAweGExODYsIDB4MDAwMywgMHgwMDQwLCAweDQyYmMsIDB4YTE4NiwgMHgwMDEyLCAweDAwNDAsCisJMHg0MmJjLCAweGE2YjUsIDB4MDgwMCwgMHg3MWI0LCAweGExODgsIDB4MDBhZiwgMHgwMDc4LCAweDQyYjcsCisJMHg2ODA3LCAweDAxMTcsIDB4MjAzMSwgMHgwNDAwLCAweDY5MmMsIDB4YTE4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDEyLCAweDAwYzAsIDB4NDI5MSwgMHgyMDAxLCAweDQyYzksIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsCisJMHg0MmEyLCAweGExODYsIDB4MDAwMywgMHgwMGMwLCAweDQyOWIsIDB4MjAwMSwgMHg0MmNhLCAweDIwMDksCisJMHgwMDEyLCAweDAwNzgsIDB4NDJhMiwgMHgyMDAxLCAweDAyMDAsIDB4NzFiNCwgMHhhMTg4LCAweDAwOTEsCisJMHgwMDc4LCAweDQyYWUsIDB4MTA3OCwgMHg0NmRiLCAweDc4YTMsIDB4MDAwMCwgMHg2ODFjLCAweGEwODUsCisJMHgwMDQwLCAweDY4MWUsIDB4NzFiNCwgMHhhMTg4LCAweDAwZGYsIDB4YTAwNiwgMHg2ODI2LCAweDgwMDcsCisJMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHg2ODIwLCAweGEwODUsIDB4ODAwMCwgMHg2ODIyLCAweDZlYjYsCisJMHg3ZTVhLCAweDc5MWEsIDB4MDA3OCwgMHgyNDU5LCAweDZlYjYsIDB4MTA3OCwgMHgzYWY4LCAweDY4MTAsCisJMHg3MGJlLCAweDcwMDMsIDB4MDAwNywgMHg3MGEzLCAweDAwMDAsIDB4NzA0YiwgMHgwMDAwLCAweDAwNzgsCisJMHgyNDU5LCAweDAwMjMsIDB4MDA3MCwgMHgwMDA1LCAweDAwMDAsIDB4MGEwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDI1LCAweDAwMDAsIDB4MDAwMCwgMHg2ODNiLCAweDAwMDAsIDB4NjgzNywgMHgwMDAwLCAweGE2ODQsCisJMHgwMjAwLCAweDAwNDAsIDB4NDJlYSwgMHg3OGI4LCAweGEwOGMsIDB4MDAxZiwgMHhhMDg0LCAweDgwMDAsCisJMHgwMDQwLCAweDQyZTMsIDB4ODEwOCwgMHg3OGQ4LCAweGExMDAsIDB4NjgzNiwgMHg3OGRjLCAweGEwODEsCisJMHgwMDAwLCAweDY4M2EsIDB4MDA3YywgMHg3OTkwLCAweDgxMGYsIDB4YTVhYywgMHgwMDA3LCAweDIwMjEsCisJMHgwMDAwLCAweGE0ODAsIDB4MDAxMCwgMHg3ODlhLCAweDc5YTgsIDB4YTE4YywgMHgwMGZmLCAweGExODQsCisJMHgwMDgwLCAweDAwYzAsIDB4NDMxOSwgMHhhMTgyLCAweDAwMjAsIDB4MDBjOCwgMHg0MzM3LCAweGExODIsCisJMHgwMDEyLCAweDAwYzgsIDB4NDY3YiwgMHgyMTAwLCAweDEwNzksIDB4NDMwNywgMHgwMDdjLCAweDQ2N2IsCisJMHg0NGU4LCAweDQ2N2IsIDB4NDY3YiwgMHg0MzQ0LCAweDQzNDcsIDB4NDM4MSwgMHg0M2I3LCAweDQzZWIsCisJMHg0M2VlLCAweDQ2N2IsIDB4NDY3YiwgMHg0M2EyLCAweDQ0MTIsIDB4NDQ0YywgMHg0NjdiLCAweDQ2N2IsCisJMHg0NDczLCAweGExODQsIDB4MDAyMCwgMHgwMGMwLCAweDQ0YTcsIDB4YTE4YywgMHgwMDFmLCAweDY4MTQsCisJMHhhMDg0LCAweDAwMWYsIDB4YTEwNiwgMHgwMDQwLCAweDQzMzQsIDB4NzBiNCwgMHhhMDgwLCAweDAwZDIsCisJMHg3ODFhLCAweDIwMDEsIDB4MDAxNCwgMHgxMDc4LCAweDQ2OTEsIDB4MTA3OCwgMHg0NmZmLCAweDcwMDMsCisJMHgwMDAwLCAweDIwMDEsIDB4MDAwMiwgMHgwMDdjLCAweDIwMDEsIDB4MDAwMCwgMHgwMDdjLCAweGExODIsCisJMHgwMDI0LCAweDAwYzgsIDB4NDY3YiwgMHhhMTg0LCAweDAwMDMsIDB4MTA3OSwgMHg0MzA3LCAweDAwN2MsCisJMHg0NjdiLCAweDQ2N2IsIDB4NDY3YiwgMHg0NjdiLCAweDEwNzgsIDB4NDY3YiwgMHgwMDdjLCAweDIyMDAsCisJMHgwMDc5LCAweDQzNGEsIDB4NDQ3NiwgMHg0NDc2LCAweDQzNmUsIDB4NDM2ZSwgMHg0MzZlLCAweDQzNmUsCisJMHg0MzZlLCAweDQzNmUsIDB4NDM2ZSwgMHg0MzZlLCAweDQzNmMsIDB4NDM2ZSwgMHg0MzYzLCAweDQzNmUsCisJMHg0MzZlLCAweDQzNmUsIDB4NDM2ZSwgMHg0MzZlLCAweDQzNzYsIDB4NDM3OSwgMHg0NDc2LCAweDQzNzksCisJMHg0MzZlLCAweDQzNmUsIDB4NDM2ZSwgMHgwYzdlLCAweDA3N2UsIDB4NmYxNCwgMHgxMDc4LCAweDM2ZTIsCisJMHgwNzdmLCAweDBjN2YsIDB4MDA3OCwgMHg0MzZlLCAweDEwNzgsIDB4NDU4YiwgMHg2ODI3LCAweDAyYjMsCisJMHgyMDA5LCAweDAwMGIsIDB4MjAwMSwgMHg0ODAwLCAweDAwNzgsIDB4NDRhYSwgMHgxMDc4LCAweDQ2NzAsCisJMHgwMDdjLCAweDY4MjcsIDB4MDA5MywgMHgyMDA5LCAweDAwMGIsIDB4MjAwMSwgMHg0ODAwLCAweDAwNzgsCisJMHg0NDkyLCAweDJkNTgsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg0MzhiLCAweDY4MDcsIDB4MDExNywgMHg2ODI3LCAweDAwMDIsIDB4MTA3OCwgMHg0NzA4LCAweDY4MjcsCisJMHgwMDM2LCAweDY5MzIsIDB4MmQwMCwgMHg2ODJlLCAweDBkN2UsIDB4MTA3OCwgMHgzYWM4LCAweDEwNzgsCisJMHg0NGQwLCAweDJiNjgsIDB4MTA3OCwgMHgzYWY4LCAweDBkN2YsIDB4MTA3OCwgMHgzYWY4LCAweDIwMDEsCisJMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHg0NGQwLCAweDIwMDEsIDB4MDAxNywgMHgxMDc4LCAweDQ2OTEsCisJMHg3MGEzLCAweDAwMDAsIDB4MjAwOSwgMHg1MTM4LCAweDIwMGIsIDB4MDAwNiwgMHg3MGFmLCAweDAwMTcsCisJMHgyMDA5LCAweDAyMDAsIDB4MTA3OCwgMHgzYTA2LCAweDIwMDEsIDB4MDAwMSwgMHgwMDdjLCAweDIyMDAsCisJMHgwMDc5LCAweDQzYmEsIDB4NDQ3NiwgMHg0NGE3LCAweDQ0YTcsIDB4NDRhNywgMHg0M2RiLCAweDQ0YjcsCisJMHg0M2UzLCAweDQ0YjcsIDB4NDRiNywgMHg0NGJhLCAweDQ0YmEsIDB4NDRiZiwgMHg0NGJmLCAweDQzZDMsCisJMHg0M2QzLCAweDQ0YTcsIDB4NDRhNywgMHg0NGI3LCAweDQ0YTcsIDB4NDNlMywgMHg0NDc2LCAweDQzZTMsCisJMHg0M2UzLCAweDQzZTMsIDB4NDNlMywgMHg2ODI3LCAweDAwODQsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsCisJMHg0MzAwLCAweDAwNzgsIDB4NDRjOSwgMHg2ODI3LCAweDAwMGQsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsCisJMHg0MzAwLCAweDAwNzgsIDB4NDRhYSwgMHg2ODI3LCAweDAwOTMsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsCisJMHg0MzAwLCAweDAwNzgsIDB4NDQ5MiwgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHgyMjAwLCAweDAwNzksCisJMHg0M2YxLCAweDQ0NzYsIDB4NDQwYSwgMHg0NDBhLCAweDQ0MGEsIDB4NDQwYSwgMHg0NGI3LCAweDQ0YjcsCisJMHg0NGI3LCAweDQ0YjcsIDB4NDRiNywgMHg0NGI3LCAweDQ0YjcsIDB4NDRiNywgMHg0NDBhLCAweDQ0MGEsCisJMHg0NDBhLCAweDQ0MGEsIDB4NDRiNywgMHg0NDBhLCAweDQ0MGEsIDB4NDRiNywgMHg0NGI3LCAweDQ0YjcsCisJMHg0NGI3LCAweDQ0NzYsIDB4NjgyNywgMHgwMDkzLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQzMDAsCisJMHgwMDc4LCAweDQ0OTIsIDB4YTY4NCwgMHgwMDA0LCAweDAwYzAsIDB4NDQyNiwgMHg2ODA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDQ2N2IsIDB4MTA3OCwgMHg0NGQwLCAweDY4MDcsCisJMHgwMTE3LCAweDEwNzgsIDB4M2FmOCwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHg2MDAwLCAweGEwODQsCisJMHgwMDA0LCAweDAwNDAsIDB4NDY3YiwgMHgyZDU4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NDQzNSwgMHg2ODA3LCAweDAxMTcsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsCisJMHg0NzA4LCAweDY4MjcsIDB4MDAzNiwgMHg2OTMyLCAweDJkMDAsIDB4NjgyZSwgMHgwZDdlLCAweDEwNzgsCisJMHgzYWQ3LCAweDEwNzgsIDB4NDRkMCwgMHgyYjY4LCAweDEwNzgsIDB4M2FmOCwgMHgwZDdmLCAweDEwNzgsCisJMHgzYWY4LCAweDIwMDEsIDB4MDAwMiwgMHgwMDdjLCAweDYwMDAsIDB4YTA4NCwgMHgwMDA0LCAweDAwNDAsCisJMHg0NjdiLCAweDJkNTgsIDB4NmEwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg0NDViLCAweDY4MDcsIDB4MDExNywgMHg2ODI3LCAweDAwMDIsIDB4MmQ1OCwgMHgxMDc4LCAweDQ3MDgsCisJMHg2ODI3LCAweDAwMzYsIDB4NjkzMiwgMHgyZDAwLCAweDY4MmUsIDB4MGQ3ZSwgMHgxMDc4LCAweDNhZTcsCisJMHgxMDc4LCAweDQ0ZDAsIDB4MmI2OCwgMHgxMDc4LCAweDNhZjgsIDB4MGQ3ZiwgMHgxMDc4LCAweDNhZjgsCisJMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHgxMDc4LCAweDQ2N2IsIDB4MDA3YywgMHg3MGI0LCAweGEwODAsCisJMHgwMGQyLCAweDc4MWEsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NDY5MSwgMHgxMDc4LCAweDQ2ZmYsCisJMHg3MDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHg0NmMxLCAweDEwNzgsCisJMHg0NmY4LCAweDEwNzgsIDB4NDJkMywgMHgxMDc4LCAweDQxZDAsIDB4MTA3OCwgMHg0NmZmLCAweDIwMDEsCisJMHgwMDAxLCAweDAwN2MsIDB4MTA3OCwgMHg0NmMxLCAweDEwNzgsIDB4NDZmOCwgMHgxMDc4LCAweDQyZDMsCisJMHg3MGI0LCAweGEwODAsIDB4MDBkMiwgMHg3ODFhLCAweDIwMDEsIDB4MDAxMywgMHgxMDc4LCAweDQ2OTEsCisJMHgxMDc4LCAweDQ2ZmYsIDB4NzAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMiwgMHgwMDdjLCAweDEwNzgsCisJMHg0NjdiLCAweDAwN2MsIDB4MTA3OCwgMHg0NmMxLCAweDEwNzgsIDB4NDZmOCwgMHgxMDc4LCAweDQyZDMsCisJMHgxMDc4LCAweDQxZDAsIDB4MTA3OCwgMHg0NmZmLCAweDIwMDEsIDB4MDAwMSwgMHgwMDdjLCAweDIwMDEsCisJMHgwMDAzLCAweDAwN2MsIDB4MTA3OCwgMHg0NThiLCAweDIwMDEsIDB4MDAwMCwgMHgwMDdjLCAweDBjN2UsCisJMHgwNzdlLCAweDZmMTQsIDB4MTA3OCwgMHgzNmUyLCAweDA3N2YsIDB4MGM3ZiwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDdjLCAweDEwNzgsIDB4NDZjMSwgMHgxMDc4LCAweDQ2N2IsIDB4MjAwMSwgMHgwMDA2LCAweDAwN2MsCisJMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDcsIDB4MDA0MCwgMHg0NGRiLCAweGExODYsCisJMHgwMDBmLCAweDAwYzAsIDB4NDRkZiwgMHgxMDc4LCAweDQ2ZjgsIDB4MTA3OCwgMHg0MmQzLCAweDcwYjQsCisJMHhhMDgwLCAweDAwZDIsIDB4NzgxYSwgMHgxMDc4LCAweDQ2ZmYsIDB4NzAwMywgMHgwMDAwLCAweDAwN2MsCisJMHg3YWE4LCAweGEyOTQsIDB4MDBmZiwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDQsCisJMHgwMGM4LCAweDQ2N2IsIDB4MTA3OSwgMHg0NGY1LCAweDAwN2MsIDB4NDY3YiwgMHg0NGY5LCAweDQ2N2IsCisJMHg0NTkyLCAweGEyODIsIDB4MDAwMywgMHgwMDQwLCAweDQ1MDAsIDB4MTA3OCwgMHg0NjdiLCAweDAwN2MsCisJMHg3ZGE4LCAweGE1YWMsIDB4MDBmZiwgMHg3Y2E4LCAweGE0YTQsIDB4MDBmZiwgMHg2OWI4LCAweGExODQsCisJMHgwMTAwLCAweDAwNDAsIDB4NDUzZiwgMHhhMThjLCAweGZlZmYsIDB4NjliYSwgMHg3OGEwLCAweGEwMDUsCisJMHgwMGMwLCAweDQ1M2YsIDB4YTRhNCwgMHgwMGZmLCAweDAwNDAsIDB4NDUzMywgMHhhNDgyLCAweDAwMGMsCisJMHgwMDQwLCAweDQ1MWMsIDB4MDBjOCwgMHg0NTI2LCAweDg1MmIsIDB4ODUyYiwgMHgxMDc4LCAweDM3NjAsCisJMHgwMDQwLCAweDQ1MjYsIDB4MTA3OCwgMHgzNTViLCAweDAwNzgsIDB4NDUzNSwgMHgxMDc4LCAweDQ2NWQsCisJMHgxMDc4LCAweDM1ODYsIDB4NjliOCwgMHhhMThkLCAweDAxMDAsIDB4NjliYSwgMHhhNmI1LCAweDEwMDAsCisJMHg3ZTVhLCAweDAwNzgsIDB4NDUzOCwgMHgxMDc4LCAweDM1ODYsIDB4YTZiNCwgMHhlZmZmLCAweDdlNWEsCisJMHg3MGI0LCAweGEwODAsIDB4MDA5MSwgMHg3ODFhLCAweDIwMDEsIDB4MDAwMSwgMHgwMDdjLCAweDBjN2UsCisJMHgxMDc4LCAweDQ1N2YsIDB4NjIwMCwgMHhkMmU0LCAweDAwNDAsIDB4NDU3MCwgMHg2MjA4LCAweDgyMTcsCisJMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDBjLCAweDAwNDgsIDB4NDU1MiwgMHgwMDQwLCAweDQ1NTIsCisJMHgyMDExLCAweDAwMGMsIDB4MjQwMCwgMHhhMjAyLCAweDAwYzgsIDB4NDU1NywgMHgyMjIwLCAweDYyMDgsCisJMHhhMjk0LCAweDAwZmYsIDB4NzAxYywgMHhhMjAyLCAweDAwYzgsIDB4NDU1ZiwgMHg3MjFjLCAweDIyMDAsCisJMHhhNTAyLCAweDAwYzgsIDB4NDU2NCwgMHgyMjI4LCAweDEwNzgsIDB4NDY2MSwgMHg4NTJiLCAweDg1MmIsCisJMHgxMDc4LCAweDM3NjAsIDB4MDA0MCwgMHg0NTcwLCAweDEwNzgsIDB4MzU2MiwgMHgwMDc4LCAweDQ1NzQsCisJMHgxMDc4LCAweDQ2NWQsIDB4MTA3OCwgMHgzNThkLCAweGE2YjUsIDB4MTAwMCwgMHg3ZTVhLCAweDcwYjQsCisJMHhhMDgwLCAweDAwYmUsIDB4NzgxYSwgMHgyMDAxLCAweDAwMDQsIDB4MGM3ZiwgMHgwMDdjLCAweDAwN2UsCisJMHg2ODE0LCAweDgwMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZTAsCisJMHg1MzgwLCAweDAwN2YsIDB4MDA3YywgMHgwYzdlLCAweDEwNzgsIDB4NDU3ZiwgMHgxMDc4LCAweDM1OGQsCisJMHgwYzdmLCAweDAwN2MsIDB4YTI4MiwgMHgwMDAyLCAweDAwYzAsIDB4NDY3YiwgMHg3YWE4LCAweGEyOTQsCisJMHgwMGZmLCAweDY5YjgsIDB4YTE4NCwgMHgwMjAwLCAweDAwNDAsIDB4NDVjOSwgMHhhMThjLCAweGZkZmYsCisJMHg2OWJhLCAweDc4YTAsIDB4YTAwNSwgMHgwMGMwLCAweDQ1YzksIDB4YTI4MiwgMHgwMDAyLCAweDAwYzgsCisJMHgzNjlkLCAweDEwNzgsIDB4NDYyNywgMHgxMDc4LCAweDM2MmIsIDB4MTA3OCwgMHgzNTg2LCAweGE2ODQsCisJMHgwMTAwLCAweDAwNDAsIDB4NDViZiwgMHg2ODJjLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDQ1YmYsCisJMHhjNmZjLCAweDc4ODgsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4NDViZiwgMHhjNmZkLCAweGE2YjUsCisJMHgxMDAwLCAweDdlNWEsIDB4NzBiNCwgMHhhMDgwLCAweDAwOTEsIDB4NzgxYSwgMHgyMDAxLCAweDAwMDEsCisJMHgwMDdjLCAweDBjN2UsIDB4MTA3OCwgMHg0NTdmLCAweGEyODQsIDB4ZmZmZSwgMHgwMDQwLCAweDQ1ZDQsCisJMHgyMDExLCAweDAwMDEsIDB4MDA3OCwgMHg0NWQ4LCAweGEyODQsIDB4MDAwMSwgMHgwMDQwLCAweDQ1ZGUsCisJMHg2MTAwLCAweGQxZWMsIDB4MDBjMCwgMHg0NWRlLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDQ2MTksCisJMHgxMDc4LCAweDM2MzIsIDB4MTA3OCwgMHgzNThkLCAweGE2ODQsIDB4MDEwMCwgMHgwMDQwLCAweDQ1ZjQsCisJMHg2ODJjLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDQ1ZjQsIDB4YzZmYywgMHg3ODg4LCAweGEwODQsCisJMHgwMDQwLCAweDAwNDAsIDB4NDVmNCwgMHhjNmZkLCAweGE2YjUsIDB4MTAwMCwgMHg3ZTVhLCAweDcwYjQsCisJMHhhMDgwLCAweDAwYmUsIDB4NzgxYSwgMHgyMDAxLCAweDAwMDQsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgyOTYwLCAweDYwMDAsIDB4MjAxMSwgMHgwMDAxLCAweGEwODQsIDB4MjAwMCwgMHgwMGMwLCAweDQ2MGEsCisJMHgyMDExLCAweDAwMDAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLCAweDAwMDMsCisJMHg3YWFhLCAweGE4YzAsIDB4MDAwNCwgMHg2OGI4LCAweGEwODUsIDB4MDIwMCwgMHg2OGJhLCAweDBjN2YsCisJMHgwMDdjLCAweDc4OWIsIDB4MDAxOCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAyLCAweDc4YWIsCisJMHgwMDAzLCAweDdhYWEsIDB4Nzg5YiwgMHgwMDgxLCAweDc4YWIsIDB4MDAwNCwgMHgwMDdjLCAweDBjN2UsCisJMHg3MDU0LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg0LCAweDEwMDAsIDB4MDBjMCwgMHg0NjM1LCAweDIwMjksCisJMHgwMDMyLCAweDIwMjEsIDB4MDAwMCwgMHgwMDc4LCAweDQ2NTUsIDB4NjUwOCwgMHhhNWFjLCAweDAwZmYsCisJMHg3MDE4LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDQ2NDUsIDB4YTU4MiwgMHgwMDE5LCAweDAwYzgsCisJMHg0NjRiLCAweDIwMjksIDB4MDAxOSwgMHgwMDc4LCAweDQ2NGIsIDB4YTU4MiwgMHgwMDBjLCAweDAwYzgsCisJMHg0NjRiLCAweDIwMjksIDB4MDAwYywgMHg2NDA4LCAweDg0MjcsIDB4YTRhNCwgMHgwMGZmLCAweGE0ODIsCisJMHgwMDBjLCAweDAwNDgsIDB4NDY1NSwgMHgyMDIxLCAweDAwMGMsIDB4MTA3OCwgMHg0NjYxLCAweDY4YjgsCisJMHhhMDg1LCAweDAxMDAsIDB4NjhiYSwgMHgwYzdmLCAweDAwN2MsIDB4MjAyMSwgMHgwMDAwLCAweDIwMjksCisJMHgwMDMyLCAweDc4OWIsIDB4MDAxOCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsCisJMHgwMDAxLCAweDdkYWEsIDB4N2NhYSwgMHg3ODliLCAweDAwODEsIDB4NzhhYiwgMHgwMDA1LCAweDAwN2MsCisJMHgyMDAxLCAweDAwMDMsIDB4MTA3OCwgMHg0Njg5LCAweDcwYjQsIDB4YTA4MCwgMHgwMGJlLCAweDc4MWEsCisJMHgyMDAxLCAweDAwMDUsIDB4MDA3YywgMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0Njg5LCAweGE2YjUsCisJMHgxMDAwLCAweDdlNWEsIDB4NzBiNCwgMHhhMDgwLCAweDAwYmUsIDB4NzgxYSwgMHgyMDAxLCAweDAwMDQsCisJMHgwMDdjLCAweDc4OWIsIDB4MDAxOCwgMHg3OGFhLCAweDc4OWIsIDB4MDA4MSwgMHg3OGFiLCAweDAwMDEsCisJMHgwMDdjLCAweDY5MDQsIDB4YTE4YywgMHgwMGZmLCAweGExOTYsIDB4MDAwNywgMHgwMDQwLCAweDQ2OWYsCisJMHhhMTk2LCAweDAwMGYsIDB4MDA0MCwgMHg0NjlmLCAweDEwNzgsIDB4MTk1YSwgMHgwMDdjLCAweDY5MjQsCisJMHhhMTk0LCAweDAwM2YsIDB4MDBjMCwgMHg0NmE4LCAweGExOGMsIDB4ZmZjMCwgMHhhMTA1LCAweDY4MjYsCisJMHgxMDc4LCAweDNhZjgsIDB4NjkxYywgMHhhMTg0LCAweDAxMDAsIDB4MDA0MCwgMHg0NmI1LCAweDY5MTQsCisJMHgxMDc4LCAweDNiNjksIDB4NjIwNCwgMHg4MjEwLCAweDYyMDYsIDB4MDA3YywgMHg2OTJjLCAweDY4MzQsCisJMHg2ODJlLCAweGExMTIsIDB4NjkzMCwgMHg2ODM4LCAweDY4MzIsIDB4YTExYiwgMHhhMjAwLCAweGEzMDEsCisJMHgwMDdjLCAweDBjN2UsIDB4YWRlMCwgMHgwMDE4LCAweDYwMDMsIDB4MDA3MCwgMHg2MTA2LCAweDYwMGIsCisJMHgwMDAwLCAweDYwMGYsIDB4MGEwMCwgMHg2MDEzLCAweDAwMDAsIDB4NjAxNywgMHgwMDAwLCAweDgwMDcsCisJMHg2MDFhLCAweDYwMWYsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDAsIDB4MGM3ZiwgMHg2ODI0LCAweGEwODUsCisJMHgwMDgwLCAweDY4MjYsIDB4MDA3YywgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMDk4LCAweGFmODAsCisJMHgwMDJkLCAweDIwYTAsIDB4ODFhYywgMHgwMDQwLCAweDQ2ZTYsIDB4NTNhNiwgMHhhMTg0LCAweDAwMDEsCisJMHgwMDQwLCAweDQ2ZWMsIDB4MzMwNCwgMHg3OGJlLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwN2MsCisJMHg3MGIwLCAweGEwMDUsIDB4MTBjMCwgMHgyM2ViLCAweDcwYjMsIDB4ODAwMCwgMHgwMDc4LCAweDRhM2EsCisJMHg3MWIwLCAweDgxZmYsIDB4MDA0MCwgMHg0NmZlLCAweDEwNzgsIDB4NGIzMCwgMHgwMDdjLCAweDcxYjAsCisJMHg4MWZmLCAweDAwNDAsIDB4NDcwNywgMHg3MGIzLCAweDAwMDAsIDB4MTA3OCwgMHg0Nzc2LCAweDAwN2MsCisJMHgwYzdlLCAweDBkN2UsIDB4MTA3OCwgMHgxOTM3LCAweDBjN2YsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsCisJMHgyZGEwLCAweDJjOTgsIDB4MjBhOSwgMHgwMDMxLCAweDUzYTMsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHg2ODA3LCAweDAxMGQsIDB4NjgwYiwgMHgwMDAwLCAweDcwMDQsIDB4ODAwNywgMHg2ODFhLCAweDY4MjMsCisJMHgwMDAwLCAweDY4MWYsIDB4MDAwMCwgMHg2ODlmLCAweDAwMDAsIDB4MGM3ZiwgMHgwMDdjLCAweDcwYjQsCisJMHhhMDgwLCAweDAwOTEsIDB4NzgxYSwgMHgwMDc4LCAweDI0NTksIDB4NzBiNCwgMHhhMDgwLCAweDAwODEsCisJMHg3ODFhLCAweDAwNzgsIDB4MjQ1OSwgMHg3MGI0LCAweGEwODAsIDB4MDBiZSwgMHg3ODFhLCAweDAwNzgsCisJMHgyNDU5LCAweDcwYjQsIDB4YTA4MCwgMHgwMGM4LCAweDc4MWEsIDB4MDA3OCwgMHgyNDU5LCAweDY5MDQsCisJMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMDA3LCAweDAwNDAsIDB4NDc0YywgMHhhMTk2LCAweDAwMGYsCisJMHgwMDQwLCAweDQ3NGMsIDB4NjgwNywgMHgwMTE3LCAweDIwMDEsIDB4MDIwMCwgMHg2ODI2LCAweDgwMDcsCisJMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHg2ODIwLCAweGEwODUsIDB4ODAwMCwgMHg2ODIyLCAweDIwMzEsCisJMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHg3MWI0LCAweGExODgsIDB4MDA5MSwgMHg3OTFhLCAweDAwN2MsCisJMHgxMDc4LCAweDQ2ZmYsIDB4Nzg0OCwgMHhhMDg1LCAweDAwMGMsIDB4Nzg0YSwgMHg3MGI0LCAweGEwODAsCisJMHgwMGQyLCAweDc4MWEsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDQwMCwgMHgxMDc4LCAweDQ2YzEsCisJMHgyMDAxLCAweDAwMTMsIDB4MTA3OCwgMHg0NjkxLCAweDAwNzgsIDB4M2I5NiwgMHgxMjdlLCAweDIwOTEsCisJMHgyMjAwLCAweDIwNDksIDB4NDc3NiwgMHg3MDAwLCAweDcyMDQsIDB4YTIwNSwgMHg3MjBjLCAweGEyMTUsCisJMHg3MDA4LCAweGEwODQsIDB4ZmZmNywgMHhhMjA1LCAweDAwNDAsIDB4NDc4OCwgMHgwMDc4LCAweDQ3OGQsCisJMHg3MDAzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDEsCisJMHgwMGMwLCAweDQ3YmIsIDB4NzEwOCwgMHg4MTAzLCAweDAwYzgsIDB4NDc5YSwgMHgxMDc4LCAweDQ4YmQsCisJMHgwMDc4LCAweDQ3OTIsIDB4NzAwYywgMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHg0N2JiLCAweDcwMDQsCisJMHg4MDA0LCAweDAwYzgsIDB4NDdiMiwgMHg3MDE0LCAweGEwMDUsIDB4MDBjMCwgMHg0N2FlLCAweDcwMTAsCisJMHhhMDA1LCAweDAwNDAsIDB4NDdiMiwgMHhhMTAyLCAweDAwYzgsIDB4NDc5MiwgMHg3MDA3LCAweDAwMTAsCisJMHgwMDc4LCAweDQ3YmIsIDB4OGFmZiwgMHgwMDQwLCAweDQ3YmIsIDB4MTA3OCwgMHg0YjA3LCAweDAwYzAsCisJMHg0N2I1LCAweDAwNDAsIDB4NDc5MiwgMHgxMDc4LCAweDQ4NDYsIDB4NzAwMywgMHgwMDAwLCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4MDE3ZSwgMHg2MTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDcsCisJMHgwMDQwLCAweDQ3Y2UsIDB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NDdkMSwgMHg2MDQwLCAweDAwNzgsCisJMHg0N2QyLCAweDY0MjgsIDB4MDE3ZiwgMHg4NGZmLCAweDAwNDAsIDB4NDdmYywgMHgyYzcwLCAweDcwMDQsCisJMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHg0ODBjLCAweDI3M2MsIDB4ODdmYiwgMHgwMGMwLCAweDQ3ZWEsCisJMHgwMDQ4LCAweDQ3ZTQsIDB4MTA3OCwgMHgyM2ViLCAweDYwOWMsIDB4YTA3NSwgMHgwMDQwLCAweDQ3ZmMsCisJMHgwMDc4LCAweDQ3ZDcsIDB4MjcwNCwgMHhhZTY4LCAweDY4MDgsIDB4YTYzMCwgMHg2ODBjLCAweGE1MjksCisJMHg4NDIxLCAweDAwNDAsIDB4NDdmYywgMHg4NzM4LCAweDI3MDQsIDB4YTAwNSwgMHgwMGMwLCAweDQ3ZWIsCisJMHg3MDljLCAweGEwNzUsIDB4MDBjMCwgMHg0N2Q3LCAweDAwN2MsIDB4MDAwMCwgMHgwMDA1LCAweDAwMDksCisJMHgwMDBkLCAweDAwMTEsIDB4MDAxNSwgMHgwMDE5LCAweDAwMWQsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDksCisJMHgwMDBmLCAweDAwMTUsIDB4MDAxYiwgMHgwMDAwLCAweDAwMDAsIDB4NDgwMSwgMHg0N2ZlLCAweDAwMDAsCisJMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHg0ODAxLCAweDAwMDAsIDB4NDgwOSwgMHg0ODA2LCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0ODA5LCAweDAwMDAsIDB4NDgwNCwgMHg0ODA0LCAweDAwMDAsCisJMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHg0ODA0LCAweDAwMDAsIDB4NDgwYSwgMHg0ODBhLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0ODBhLCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksCisJMHg1MTAwLCAweDIwNzEsIDB4MDAxMCwgMHg3MDA3LCAweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsCisJMHgwMDAwLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA3LCAweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsCisJMHgwMDAwLCAweDIwNDksIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgyMDQ5LCAweDQ4NDYsCisJMHgyMDE5LCAweDAwMDAsIDB4NzAwNCwgMHg4MDA0LCAweDAwYzgsIDB4NDg5OSwgMHg3MDA3LCAweDAwMTIsCisJMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgwMGMwLCAweDQ4NTAsIDB4YTE4NCwgMHgwMWUwLCAweDAwNDAsCisJMHg0ODViLCAweDEwNzgsIDB4MjNlYiwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsCisJMHgwMGM4LCAweDQ4NjYsIDB4YTE4NCwgMHg0MDAwLCAweDAwYzAsIDB4NDg1MCwgMHhhMTljLCAweDMwMGMsCisJMHhhMzg2LCAweDIwMDQsIDB4MDA0MCwgMHg0ODc0LCAweGEzODYsIDB4MDAwOCwgMHgwMDQwLCAweDQ4N2YsCisJMHhhMzg2LCAweDIwMGMsIDB4MDBjMCwgMHg0ODUwLCAweDcyMDAsIDB4ODIwNCwgMHgwMDQ4LCAweDQ4N2YsCisJMHg3MzBjLCAweGEzODQsIDB4MDBmZiwgMHgwMDQwLCAweDQ4N2YsIDB4MTA3OCwgMHgyM2ViLCAweDcwMDcsCisJMHgwMDEyLCAweDcwMDAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4NDg5OSwgMHg3MDA4LCAweGEwODQsCisJMHgwMWUwLCAweDAwYzAsIDB4NDg5OSwgMHg3MzEwLCAweDcwMTQsIDB4YTMwNSwgMHgwMDQwLCAweDQ4OTksCisJMHg3MTBjLCAweGExODQsIDB4MDMwMCwgMHgwMGMwLCAweDQ4OTksIDB4YTE4NCwgMHgwMGZmLCAweDAwYzAsCisJMHg0ODQ2LCAweDcwMDcsIDB4MDAxMiwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDgsCisJMHgwMGMwLCAweDQ4OWQsIDB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4ODEwMywgMHgwMDQ4LCAweDQ4YTIsCisJMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLCAweDAwN2MsIDB4MTA3ZSwgMHgwMDdlLCAweDEyN2UsCisJMHgxNTdlLCAweDIwOTEsIDB4MjIwMCwgMHg3MTA4LCAweDEwNzgsIDB4NDhiZCwgMHgxNTdmLCAweDEyN2YsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3ZiwgMHgxMDdmLCAweDAwN2MsIDB4NzIwNCwgMHg3NTAwLCAweDczMGMsCisJMHhhMzg0LCAweDAzMDAsIDB4MDBjMCwgMHg0OGU0LCAweGExODQsIDB4MDFlMCwgMHgwMGMwLCAweDQ5MDgsCisJMHg3MTA4LCAweGExODQsIDB4MDFlMCwgMHgwMGMwLCAweDQ5MDgsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsCisJMHhhMDgyLCAweDAwMDUsIDB4MDBjOCwgMHg0OGQ4LCAweGExODQsIDB4NDAwMCwgMHgwMGMwLCAweDQ4YzgsCisJMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHg0OGRjLCAweDQ4ZTYsIDB4NDhmOCwgMHg0OGU0LCAweDQ4ZjgsCisJMHg0OGU0LCAweDQ5NDQsIDB4NDhlNCwgMHg0OTQyLCAweDEwNzgsIDB4MjNlYiwgMHg3MDA0LCAweGEwODQsCisJMHgwMDEwLCAweGEwODUsIDB4MDAwMiwgMHg3MDA2LCAweDhhZmYsIDB4MDBjMCwgMHg0OGYzLCAweDIwNDksCisJMHgwMDAwLCAweDAwNzgsIDB4NDhmNywgMHgxMDc4LCAweDRiMDcsIDB4MDBjMCwgMHg0OGYzLCAweDAwN2MsCisJMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDIsIDB4NzAwNiwgMHg4YWZmLCAweDAwYzAsCisJMHg0OTAzLCAweDAwNzgsIDB4NDkwNywgMHgxMDc4LCAweDRiMDcsIDB4MDBjMCwgMHg0OTAzLCAweDAwN2MsCisJMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHgwMGUwLCAweDQ5MGIsIDB4MjA5MSwgMHg2MDAwLCAweDAwZTAsCisJMHg0OTBmLCAweDIwOTEsIDB4NjAwMCwgMHg3MDA3LCAweDAwMTIsIDB4NzAwNywgMHgwMDA4LCAweDcwMDQsCisJMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHg0OTE3LCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LCAweDgxMDMsCisJMHgwMDQ4LCAweDQ5MWMsIDB4NzAwMywgMHgwMDAwLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDQ5MzAsCisJMHg3MDA0LCAweGEwMDUsIDB4MDBjMCwgMHg0OTMwLCAweDcwMGMsIDB4YTAwNSwgMHgwMDQwLCAweDQ5MzIsCisJMHgwMDc4LCAweDQ5MTMsIDB4MjA0OSwgMHgwMDAwLCAweDEwNzgsIDB4MzgwOSwgMHg2ODE4LCAweGEwODQsCisJMHg4MDAwLCAweDAwNDAsIDB4NDkzZCwgMHg2ODFiLCAweDAwMDIsIDB4MDA3YywgMHgxMDc4LCAweDIzZWIsCisJMHgxMDc4LCAweDIzZWIsIDB4MTA3OCwgMHg0OWEwLCAweDcyMTAsIDB4NzExNCwgMHg3MDBjLCAweGEwOWMsCisJMHgwMGZmLCAweDI4MDAsIDB4YTMwMCwgMHhhMjExLCAweGExODksIDB4MDAwMCwgMHgxMDc4LCAweDQ5YTAsCisJMHgyNzA0LCAweDJjNTgsIDB4YWM2MCwgMHg2MzA4LCAweDIyMDAsIDB4YTMyMiwgMHg2MzBjLCAweDIxMDAsCisJMHhhMzFiLCAweDI0MDAsIDB4YTMwNSwgMHgwMDQwLCAweDQ5NjcsIDB4MDBjOCwgMHg0OTY3LCAweDg0MTIsCisJMHg4MjEwLCAweDgzMGEsIDB4YTE4OSwgMHgwMDAwLCAweDJiNjAsIDB4MDA3OCwgMHg0OTRlLCAweDJiNjAsCisJMHg4YTA3LCAweDAwN2UsIDB4NjAwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0OTczLCAweGE3YmEsCisJMHg0ODA2LCAweDAwNzgsIDB4NDk3NSwgMHhhN2JhLCAweDQ3ZmUsIDB4MDA3ZiwgMHhhNzNkLCAweDJjMDAsCisJMHg2ODg2LCAweDZmOGEsIDB4NmM5MiwgMHg2YjhlLCAweDcwMDcsIDB4MDAxMiwgMHgxMDc4LCAweDQ4NDYsCisJMHgwMDdjLCAweDg3MzgsIDB4MjcwNCwgMHhhMDA1LCAweDAwYzAsIDB4NDk5NCwgMHg2MDljLCAweGEwMDUsCisJMHgwMDQwLCAweDQ5OWQsIDB4MjA2MCwgMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDQ4MGMsCisJMHgyMDNjLCAweDg3ZmIsIDB4MTA0MCwgMHgyM2ViLCAweDhhNTEsIDB4MDA0MCwgMHg0OTljLCAweDcwMDgsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDAwN2MsIDB4MjA1MSwgMHgwMDAwLCAweDAwN2MsCisJMHg4YTUwLCAweDg3MzksIDB4MjcwNCwgMHhhMDA0LCAweDAwYzAsIDB4NDliNCwgMHg2MDAwLCAweGEwNjQsCisJMHgwMGMwLCAweDQ5YWIsIDB4MmQ2MCwgMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDQ4MWMsCisJMHgyMDNjLCAweDg3ZmIsIDB4MTA0MCwgMHgyM2ViLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLCAweDIwOTEsCisJMHgyMjAwLCAweDBkN2YsIDB4Njg4NCwgMHgyMDYwLCAweDY4ODgsIDB4NmI4YywgMHg2YzkwLCAweDgwNTcsCisJMHhhYWQ0LCAweDAwZmYsIDB4YTA4NCwgMHgwMGZmLCAweDAwN2UsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDgsCisJMHgwMDdmLCAweDAwNDAsIDB4NDljZiwgMHhhMGI4LCAweDQ4MDYsIDB4MDA3OCwgMHg0OWQxLCAweGEwYjgsCisJMHg0N2ZlLCAweDdlMDgsIDB4YTZiNSwgMHgwMDBjLCAweDY5MDQsIDB4YTE4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDA3LCAweDAwNDAsIDB4NDlkZiwgMHhhMThlLCAweDAwMGYsIDB4MDBjMCwgMHg0OWU4LCAweDY4MWMsCisJMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHg0OWVmLCAweGE2YjUsIDB4MDAwMSwgMHgwMDc4LCAweDQ5ZWYsCisJMHg2ODFjLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDQ5ZWYsIDB4YTZiNSwgMHgwMDAxLCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4NDlmMSwgMHgyNDAwLCAweGEzMDUsCisJMHgwMGMwLCAweDQ5ZmMsIDB4MDA3OCwgMHg0YTIyLCAweDJjNTgsIDB4MjcwNCwgMHg2MTA0LCAweGFjNjAsCisJMHg2MDAwLCAweGE0MDAsIDB4NzAxYSwgMHg2MDA0LCAweGEzMDEsIDB4NzAxZSwgMHhhMTg0LCAweDAwMDgsCisJMHgwMDQwLCAweDRhMTIsIDB4NjAxMCwgMHhhMDgxLCAweDAwMDAsIDB4NzAyMiwgMHg2MDE0LCAweGEwODEsCisJMHgwMDAwLCAweDcwMjYsIDB4NjIwOCwgMHgyNDAwLCAweGEyMDIsIDB4NzAxMiwgMHg2MjBjLCAweDIzMDAsCisJMHhhMjAzLCAweDcwMTYsIDB4NzYwMiwgMHg3MDA3LCAweDAwMDEsIDB4MmI2MCwgMHgxMDc4LCAweDQ5ODEsCisJMHgwMDc4LCAweDRhMjQsIDB4MTA3OCwgMHg0YjA3LCAweDAwYzAsIDB4NGEyMiwgMHgxMjdmLCAweDIwMDAsCisJMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHg3MDA3LCAweDAwMDQsCisJMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDRhMzAsIDB4NzAwMywgMHgwMDA4LCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDIwNDksCisJMHg0YTNhLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDRhNDMsCisJMHg3ZTA4LCAweGE2YjUsIDB4MDAwYywgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDcsCisJMHgwMDQwLCAweDRhNTYsIDB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NGE2MSwgMHg2ODFjLCAweGEwODQsCisJMHgwMDQwLCAweDAwNDAsIDB4NGE1ZCwgMHhhNmI1LCAweDAwMDEsIDB4Njg0MCwgMHgyMDUwLCAweDAwNzgsCisJMHg0YTZhLCAweDY4MWMsIDB4YTA4NCwgMHgwMDIwLCAweDAwYzAsIDB4NGE2OCwgMHhhNmI1LCAweDAwMDEsCisJMHg2ODI4LCAweDIwNTAsIDB4MmQ2MCwgMHg2MDA0LCAweGEwYmMsIDB4MDAwZiwgMHhhN2I4LCAweDQ4MGMsCisJMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwgMHg0YTdlLCAweDAwNDgsIDB4NGE3OCwgMHgxMDc4LCAweDIzZWIsCisJMHg2ODljLCAweGEwNjUsIDB4MDA0MCwgMHg0YTgyLCAweDAwNzgsIDB4NGE2YiwgMHgxMDc4LCAweDRiMDcsCisJMHgwMGMwLCAweDRhN2UsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDAxN2UsCisJMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDAzN2YsIDB4MDQ3ZiwgMHg3ZTA4LCAweGE2YjUsCisJMHgwMDBjLCAweDY5MDQsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNywgMHgwMDQwLCAweDRhOWMsCisJMHhhMThlLCAweDAwMGYsIDB4MDBjMCwgMHg0YWE1LCAweDY4MWMsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsCisJMHg0YWFjLCAweGE2YjUsIDB4MDAwMSwgMHgwMDc4LCAweDRhYWMsIDB4NjgxYywgMHhhMDg0LCAweDAwNDAsCisJMHgwMDQwLCAweDRhYWMsIDB4YTZiNSwgMHgwMDAxLCAweDIwNDksIDB4NGE4NSwgMHgwMTdlLCAweDY5MDQsCisJMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NGFiYSwgMHhhMThlLCAweDAwMGYsCisJMHgwMGMwLCAweDRhYmQsIDB4Njg0MCwgMHgwMDc4LCAweDRhYmUsIDB4NjgyOCwgMHgwMTdmLCAweGEwNTUsCisJMHgwMDQwLCAweDRiMDQsIDB4MmQ3MCwgMHgyZTYwLCAweDcwMDQsIDB4YTBiYywgMHgwMDBmLCAweGE3YjgsCisJMHg0ODBjLCAweDI3M2MsIDB4ODdmYiwgMHgwMGMwLCAweDRhZDgsIDB4MDA0OCwgMHg0YWQxLCAweDEwNzgsCisJMHgyM2ViLCAweDcwOWMsIDB4YTA3NSwgMHgyMDYwLCAweDAwNDAsIDB4NGIwNCwgMHgwMDc4LCAweDRhYzQsCisJMHgyNzA0LCAweGFlNjgsIDB4NjgwOCwgMHhhNDIyLCAweDY4MGMsIDB4YTMxYiwgMHgwMDQ4LCAweDRhZjEsCisJMHg4YTUxLCAweDAwYzAsIDB4NGFlNSwgMHgxMDc4LCAweDIzZWIsIDB4ODczOCwgMHgyNzA0LCAweGEwMDUsCisJMHgwMGMwLCAweDRhZDksIDB4NzA5YywgMHhhMDc1LCAweDIwNjAsIDB4MDA0MCwgMHg0YjA0LCAweDAwNzgsCisJMHg0YWM0LCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLCAweGEzOTksIDB4MDAwMCwgMHg2OTA4LCAweDI0MDAsCisJMHhhMTIyLCAweDY5MGMsIDB4MjMwMCwgMHhhMTFiLCAweDAwYzgsIDB4NGIwMCwgMHgxMDc4LCAweDIzZWIsCisJMHgyMDcxLCAweDAwMjAsIDB4MDA3OCwgMHg0OWVmLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDcwMDgsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4NGIyZiwgMHgyNzA0LCAweGFjMDgsCisJMHgyMTA0LCAweDcwMWEsIDB4ODEwOCwgMHgyMTA0LCAweDcwMWUsIDB4ODEwOCwgMHgyMTA0LCAweDcwMTIsCisJMHg4MTA4LCAweDIxMDQsIDB4NzAxNiwgMHg2MDA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDRiMjYsCisJMHg4MTA4LCAweDIxMDQsIDB4NzAyMiwgMHg4MTA4LCAweDIxMDQsIDB4NzAyNiwgMHg3NjAyLCAweDcwMDQsCisJMHhhMDg0LCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLCAweDcwMDYsIDB4MTA3OCwgMHg0OTgxLCAweDAwN2MsCisJMHgxMjdlLCAweDAwN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MjA0OSwgMHg0YjMwLCAweDBkN2YsCisJMHgwODdmLCAweDcxMDgsIDB4YTE4NCwgMHgwMDAzLCAweDAwYzAsIDB4NGI1YSwgMHgwMTdlLCAweDY5MDQsCisJMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NGI0YSwgMHhhMThlLCAweDAwMGYsCisJMHgwMGMwLCAweDRiNGQsIDB4Njg0MCwgMHgwMDc4LCAweDRiNGUsIDB4NjgyOCwgMHgwMTdmLCAweGEwMDUsCisJMHgwMDQwLCAweDRiNjgsIDB4MDA3OCwgMHg0NzhkLCAweDAwMjAsIDB4NGI1YSwgMHgxMDc4LCAweDQ5NDQsCisJMHgwMDc4LCAweDRiNjgsIDB4MDBhMCwgMHg0YjYxLCAweDcxMDgsIDB4MTA3OCwgMHg0OGJkLCAweDAwNzgsCisJMHg0YjM5LCAweDcwMDcsIDB4MDAxMCwgMHgwMGEwLCAweDRiNjMsIDB4NzEwOCwgMHgxMDc4LCAweDQ4YmQsCisJMHg3MDA4LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDRiMzksIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsCisJMHg0YjM5LCAweDcwMDMsIDB4MDAwMCwgMHgyMDQ5LCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsCisJMHgxMjdlLCAweDE0N2UsIDB4MTM3ZSwgMHgxNTdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsCisJMHgwZDdmLCAweDIwNDksIDB4NGI3OCwgMHhhZDgwLCAweDAwMTEsIDB4MjBhMCwgMHgyMDk5LCAweDAwMzEsCisJMHg3MDBjLCAweGEwODQsIDB4MDBmZiwgMHg2ODJhLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA3LCAweDAwMDIsCisJMHg3MDAzLCAweDAwMDEsIDB4MDA0MCwgMHg0Yjk3LCAweDgwMDAsIDB4ODBhYywgMHg1M2E1LCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4NGI5OSwgMHgwYzdmLCAweDIwNDksCisJMHgwMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgxNTdmLCAweDEzN2YsIDB4MTQ3ZiwgMHgxMjdmLCAweDIwMDAsCisJMHgwMDdjLCAweDIwOTEsIDB4NjAwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzhjYywgMHhhMDA1LCAweDAwNDAsCisJMHg0YmMwLCAweDc5OTQsIDB4NzBkMCwgMHhhMTA2LCAweDAwYzAsIDB4NGJjMCwgMHg3ODA0LCAweGEwMDUsCisJMHgwMDQwLCAweDRiYzAsIDB4NzgwNywgMHgwMDAwLCAweDAwNjgsIDB4NGJjMCwgMHgyMDkxLCAweDQwODAsCisJMHg3ODIwLCAweDgwMDEsIDB4NzgyMiwgMHgwMGMwLCAweDRjMWIsIDB4NzgyNCwgMHg3ODIyLCAweDIwNjksCisJMHg1MTQwLCAweDY4MDAsIDB4YTA4NCwgMHgwMDA3LCAweDAwNDAsIDB4NGJkZSwgMHhhMDg2LCAweDAwMDIsCisJMHgwMDQwLCAweDRiZGUsIDB4NjgzNCwgMHhhMDBkLCAweDAwNDAsIDB4NGJkZSwgMHgyMTA0LCAweGEwMDUsCisJMHgwMDQwLCAweDRiZGUsIDB4ODAwMSwgMHgyMDBhLCAweDAwNDAsIDB4NGNjMywgMHg3ODQ4LCAweGEwMDUsCisJMHgwMDQwLCAweDRiZWMsIDB4ODAwMSwgMHg3ODRhLCAweDAwYzAsIDB4NGJlYywgMHgyMDA5LCAweDAxMDIsCisJMHg2ODQ0LCAweDIwMGEsIDB4MTA3OCwgMHgyMWQyLCAweDY4OTAsIDB4YTAwNSwgMHgwMDQwLCAweDRiZjgsCisJMHg4MDAxLCAweDY4OTIsIDB4MDBjMCwgMHg0YmY4LCAweDY4NmYsIDB4MDAwMCwgMHg2ODczLCAweDAwMDEsCisJMHgyMDYxLCAweDU0MDAsIDB4MjBhOSwgMHgwMTAwLCAweDIwMDksIDB4MDAwMiwgMHg2MDM0LCAweGEwMDUsCisJMHgwMDQwLCAweDRjMGUsIDB4ODAwMSwgMHg2MDM2LCAweDAwYzAsIDB4NGMwZSwgMHg2MDEwLCAweGEwMDUsCisJMHgwMDQwLCAweDRjMGUsIDB4MDE3ZSwgMHgxMDc4LCAweDIxZDIsIDB4MDE3ZiwgMHhhY2UwLCAweDAwMTAsCisJMHgwMDcwLCAweDRjMTQsIDB4MDA3OCwgMHg0YmZlLCAweDgxMDksIDB4MDA0MCwgMHg0YzFiLCAweDIwYTksCisJMHgwMTAwLCAweDAwNzgsIDB4NGJmZSwgMHgxMDc4LCAweDRjMjgsIDB4MTA3OCwgMHg0YzRkLCAweDIwMDksCisJMHg1MTUxLCAweDIxMDQsIDB4MjAwOSwgMHgwMTAyLCAweDIwMGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsCisJMHg3ODM0LCAweDgwMDEsIDB4NzgzNiwgMHgwMGMwLCAweDRjNGMsIDB4NzgzOCwgMHg3ODM2LCAweDIwOTEsCisJMHg4MDAwLCAweDc4NDQsIDB4YTAwNSwgMHgwMGMwLCAweDRjMzcsIDB4MjAwMSwgMHgwMTAxLCAweDgwMDEsCisJMHg3ODQ2LCAweGEwODAsIDB4NzQwMCwgMHgyMDQwLCAweDIwMDQsIDB4YTA2NSwgMHgwMDQwLCAweDRjNGMsCisJMHg2MDI0LCAweGEwMDUsIDB4MDA0MCwgMHg0YzQ4LCAweDgwMDEsIDB4NjAyNiwgMHgwMDQwLCAweDRjN2MsCisJMHg2MDAwLCAweDJjNDAsIDB4MDA3OCwgMHg0YzNkLCAweDAwN2MsIDB4NzgyOCwgMHg4MDAxLCAweDc4MmEsCisJMHgwMGMwLCAweDRjN2IsIDB4NzgyYywgMHg3ODJhLCAweDc4MzAsIDB4YTAwNSwgMHgwMGMwLCAweDRjNWEsCisJMHgyMDAxLCAweDAyMDAsIDB4ODAwMSwgMHg3ODMyLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsCisJMHhhMDkwLCAweDU0MDAsIDB4YTI5OCwgMHgwMDAyLCAweDIzMDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsCisJMHg0YzdiLCAweGEyOTAsIDB4MDAwOSwgMHgyMjA0LCAweGEwMDUsIDB4MDA0MCwgMHg0YzczLCAweDgwMDEsCisJMHgyMDEyLCAweDAwYzAsIDB4NGM3YiwgMHgyMzA0LCAweGEwODQsIDB4ZmZmNywgMHhhMDg1LCAweDAwODAsCisJMHgyMDFhLCAweDEwNzgsIDB4MjFkMiwgMHgwMDdjLCAweDIwNjksIDB4NTE0MCwgMHg2ODAwLCAweGEwMDUsCisJMHgwMDQwLCAweDRjODYsIDB4Njg0OCwgMHhhYzA2LCAweDAwNDAsIDB4NGNjMywgMHg2MDFiLCAweDAwMDYsCisJMHg2MGI0LCAweGEwODQsIDB4M2YwMCwgMHg2MDFlLCAweDYwMjAsIDB4YTA4NCwgMHgwMGZmLCAweGEwODUsCisJMHgwMDYwLCAweDYwMjIsIDB4NjAwMCwgMHgyMDQyLCAweDY3MTQsIDB4NmY4MiwgMHgxMDc4LCAweDE5NzMsCisJMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwgMHg0YzllLCAweDgwMDEsIDB4NjgxYSwgMHg2ODA4LCAweGEwODQsCisJMHhmZmVmLCAweDY4MGEsIDB4NjgxMCwgMHg4MDAxLCAweDAwZDAsIDB4NGNhOCwgMHgxMDc4LCAweDIzZWIsCisJMHg2ODEyLCAweDYwMmYsIDB4MDAwMCwgMHg2MDMzLCAweDAwMDAsIDB4MmM2OCwgMHgxMDc4LCAweDFjNzAsCisJMHgyMDY5LCAweDUxNDAsIDB4Nzk0NCwgMHhhMTg0LCAweDAxMDAsIDB4MjAwMSwgMHgwMDA2LCAweDY4NmUsCisJMHgwMGMwLCAweDRjYmUsIDB4Njk4NiwgMHgyMDAxLCAweDAwMDQsIDB4Njg2ZSwgMHgxMDc4LCAweDIxY2QsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgyMDY5LCAweDAxMDAsIDB4MjAwOSwgMHg1MTQwLCAweDIxMDQsCisJMHhhMDg0LCAweDAwMDcsIDB4MDA0MCwgMHg0ZDFmLCAweGEwODYsIDB4MDAwNywgMHgwMGMwLCAweDRjZDksCisJMHgwZDdlLCAweDIwMDksIDB4NTE1MiwgMHgyMTZjLCAweDEwNzgsIDB4M2E0ZSwgMHgwZDdmLCAweDAwNzgsCisJMHg0ZDFmLCAweDIwMDksIDB4NTE1MiwgMHgyMTY0LCAweDEwNzgsIDB4MjM5NiwgMHg2MDFiLCAweDAwMDYsCisJMHg2ODU4LCAweGEwODQsIDB4M2YwMCwgMHg2MDFlLCAweDYwMjAsIDB4YTA4NCwgMHgwMGZmLCAweGEwODUsCisJMHgwMDQ4LCAweDYwMjIsIDB4NjAyZiwgMHgwMDAwLCAweDYwMzMsIDB4MDAwMCwgMHg2ODMwLCAweGEwODQsCisJMHgwMDQwLCAweDAwNDAsIDB4NGQxMywgMHg2ODRiLCAweDAwMDQsIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsCisJMHhhMDg0LCAweDAwMDQsIDB4MDA0MCwgMHg0ZDAwLCAweDAwNzAsIDB4NGQwMCwgMHgwMDc4LCAweDRjZjcsCisJMHg2ODRiLCAweDAwMDksIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsCisJMHg0ZDBkLCAweDAwNzAsIDB4NGQwZCwgMHgwMDc4LCAweDRkMDQsIDB4MjBhOSwgMHgwMGZhLCAweDAwNzAsCisJMHg0ZDEzLCAweDAwNzgsIDB4NGQwZiwgMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MWIsCisJMHgwMDQ4LCAweDIwMDksIDB4NTE1YiwgMHgyMDBiLCAweDAwMDcsIDB4Nzg0YywgMHg3ODRhLCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4MjA3OSwgMHg1MTAwLCAweDEwNzgsIDB4NGQ0ZCwgMHgxMDc4LCAweDRkMzEsCisJMHgxMDc4LCAweDRkM2YsIDB4NzgzMywgMHgwMDAwLCAweDc4NDcsIDB4MDAwMCwgMHg3ODRiLCAweDAwMDAsCisJMHgwMDdjLCAweDIwMTksIDB4MDAwMywgMHgyMDExLCAweDUxNDYsIDB4MjIwNCwgMHhhMDg2LCAweDAwM2MsCisJMHgwMDQwLCAweDRkM2MsIDB4MjAxOSwgMHgwMDAyLCAweDdiMmEsIDB4N2IyZSwgMHgwMDdjLCAweDIwMTksCisJMHgwMDM5LCAweDIwMTEsIDB4NTE0NiwgMHgyMjA0LCAweGEwODYsIDB4MDAzYywgMHgwMDQwLCAweDRkNGEsCisJMHgyMDE5LCAweDAwMjcsIDB4N2IzNiwgMHg3YjNhLCAweDAwN2MsIDB4MjAxOSwgMHgzOTcxLCAweDIwMTEsCisJMHg1MTQ2LCAweDIyMDQsIDB4YTA4NiwgMHgwMDNjLCAweDAwNDAsIDB4NGQ1OCwgMHgyMDE5LCAweDI2MjYsCisJMHg3YjIyLCAweDdiMjYsIDB4NzgzZiwgMHgwMDAwLCAweDc4NDMsIDB4MDAwYSwgMHgwMDdjLCAweDAwMjAsCisJMHgwMDJiLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAxNCwgMHgwMDE0LCAweDk4NDksIDB4MDAxNCwgMHgwMDE0LCAweDAwMTQsCisJMHgwMDE0LCAweDAwMTQsIDB4MDAxNCwgMHgwMDE0LCAweDAwODAsIDB4MDAwZiwgMHgwMDAwLCAweDAyMDEsCisJMHgwNjA0LCAweDBjMDgsIDB4MjEyMCwgMHg0MDIyLCAweGY4ODAsIDB4MDAxOCwgMHgzMDBiLCAweGEyMDEsCisJMHgwMDE0LCAweGEyMDAsIDB4MDAxNCwgMHhhMjAwLCAweDAyMTQsIDB4MDAwMCwgMHgwMDZjLCAweDAwMDIsCisJMHgwMDE0LCAweDk4ZDAsIDB4MDA5ZSwgMHgwMDk2LCAweGEyMDIsIDB4ODgzOCwgMHgzODA2LCAweDg4MzksCisJMHgyMGMzLCAweDA4NjQsIDB4OTg4NCwgMHgyOGMxLCAweDljYjEsIDB4YTIwMywgMHgzMDBjLCAweDI4NDYsCisJMHg4MTYxLCAweDg0NmEsIDB4ODMwMCwgMHgxODU2LCAweDg4M2EsIDB4OTg2NSwgMHgyOGYyLCAweDljOTAsCisJMHg5ODU4LCAweDMwMGMsIDB4MjhlMSwgMHg5YzkwLCAweDI4MDIsIDB4YTIwNiwgMHg2NGMzLCAweDI4MmQsCisJMHhhMjA3LCAweDY0YTAsIDB4NjdhMCwgMHg2ZmMwLCAweDE4MTQsIDB4ODgzYiwgMHg3ODI0LCAweDY4YzEsCisJMHg3ODY0LCAweDg4M2UsIDB4OTg3OCwgMHg4NTc2LCAweDg2NzcsIDB4MjA2YiwgMHgyOGMxLCAweDljYjEsCisJMHgyMDQ0LCAweDIxMDMsIDB4MjBhMiwgMHgyMDgxLCAweDk4NjUsIDB4YTIwOSwgMHgyOTAxLCAweDk4OGMsCisJMHgwMDE0LCAweGEyMDUsIDB4YTMwMCwgMHgxODcyLCAweDg3OWEsIDB4ODgzYywgMHgxZmUyLCAweGM2MDEsCisJMHhhMjBhLCAweDg1NmUsIDB4MDcwNCwgMHg5YzkwLCAweDAwMTQsIDB4YTIwNCwgMHhhMzAwLCAweDMwMDksCisJMHgxOWUyLCAweGY4NjgsIDB4ODE3NiwgMHg4NmViLCAweDg1ZWIsIDB4ODcyZSwgMHg4N2E5LCAweDg4M2YsCisJMHgwOGU2LCAweDk4OTAsIDB4Zjg4MSwgMHg5ODhiLCAweGM4MDEsIDB4MDAxNCwgMHhmOGMxLCAweDAwMTYsCisJMHg4NWIyLCAweDgwZjAsIDB4OTUzMiwgMHhmYjAyLCAweDFkZTIsIDB4MDAxNCwgMHg4NTMyLCAweGYyNDEsCisJMHgwMDE0LCAweDFkZTIsIDB4ODRhOCwgMHhkN2EwLCAweDFmZTYsIDB4MDAxNCwgMHhhMjA4LCAweDYwNDMsCisJMHg4MDA4LCAweDFkYzEsIDB4MDAxNiwgMHg4MzAwLCAweDgxNjAsIDB4ODQyYSwgMHhmMDQxLCAweDMwMDgsCisJMHg4NGE4LCAweDExZDYsIDB4NzA0MiwgMHgyMGRkLCAweDAwMTEsIDB4MjBkNSwgMHg4ODIyLCAweDAwMTYsCisJMHg4MDAwLCAweDI4NDcsIDB4MTAxMSwgMHg5OGMzLCAweDgwMDAsIDB4YTAwMCwgMHgyODAyLCAweDEwMTEsCisJMHg5OGM5LCAweDk4NjUsIDB4MjgzZSwgMHgxMDExLCAweDk4Y2QsIDB4YTIwYiwgMHgwMDE3LCAweDMwMGMsCisJMHhhMzAwLCAweDFkZTIsIDB4ZGI4MSwgMHgwMDE0LCAweDAyMTAsIDB4OThkYSwgMHgwMDE0LCAweDI2ZTAsCisJMHg4NzNhLCAweGZiMDIsIDB4MTlmMiwgMHgxZmUyLCAweDAwMTQsIDB4YTIwZCwgMHgzODA2LCAweDAyMTAsCisJMHg5Y2I2LCAweDA3MDQsIDB4MDAwMCwgMHgwMDZjLCAweDAwMDIsIDB4OTg0ZiwgMHgwMDE0LCAweDAwOWUsCisJMHgwMGE1LCAweDAwMTcsIDB4NjBmZiwgMHgzMDBjLCAweDg3MjAsIDB4YTIxMSwgMHg5Y2Q1LCAweDg3NzIsCisJMHg4ODM3LCAweDIxMDEsIDB4OTg3YSwgMHgxMGQyLCAweDc4ZTIsIDB4OWNkOCwgMHg5ODU5LCAweGQ5ODQsCisJMHhmMGUyLCAweGYwYTEsIDB4OThkMiwgMHgwMDE0LCAweDg4MzEsIDB4ZDE2NiwgMHg4ODMwLCAweDgwMGYsCisJMHg5NDAxLCAweGI1MjAsIDB4YzgwMiwgMHg4ODIwLCAweDk4N2EsIDB4MjMwMSwgMHg5ODdhLCAweDEwZDIsCisJMHg3OGU0LCAweDljZDgsIDB4ODgyMSwgMHg4ODIwLCAweDk4NTksIDB4ZjEyMywgMHhmMTQyLCAweGYxMDEsCisJMHg5OGNiLCAweDEwZDIsIDB4NzBmNiwgMHg4ODMyLCAweDgyMDMsIDB4ODcwYywgMHhkOTllLCAweDYwMDEsCisJMHgwMDE0LCAweDY4NDUsIDB4MDIxNCwgMHhhMjFiLCAweDljZDUsIDB4MjAwMSwgMHg5OGNhLCAweDgyMDEsCisJMHgxODUyLCAweGQxODQsIDB4ZDE2MywgMHg4ODM0LCAweDgwMDEsIDB4OTg4ZCwgMHgzMDI3LCAweDg0YTgsCisJMHgxYTU2LCAweDg4MzMsIDB4MDAxNCwgMHhhMjE4LCAweDY5ODEsIDB4OWNjMSwgMHg2OTJhLCAweDY5MDIsCisJMHgxODM0LCAweDk4OWQsIDB4MWExNCwgMHg4MDEwLCAweDg1OTIsIDB4ODAyNiwgMHg4NGI5LCAweDcwMjEsCisJMHgwMDE0LCAweGEzMDAsIDB4NjllMSwgMHg5Y2FhLCAweDY5NGMsIDB4YTIxMywgMHg5Y2JhLCAweDE0NjIsCisJMHhhMjEzLCAweDgwMDAsIDB4MTZlMSwgMHg5OGI0LCAweDgwMjMsIDB4MTZlMSwgMHg4MDAxLCAweDEwZjEsCisJMHgwMDE2LCAweDY5NjgsIDB4YTIxNCwgMHg5Y2JhLCAweDgwMDQsIDB4MTZlMSwgMHgwMTAxLCAweDMwMGEsCisJMHg4ODI3LCAweDAwMTQsIDB4OWNiYSwgMHgwMDE0LCAweDYxYzIsIDB4ODAwMiwgMHgxNGUxLCAweDAwMTYsCisJMHhhMjE3LCAweDljYzEsIDB4MDAxNCwgMHhhMzAwLCAweDgxODEsIDB4ODQyYSwgMHg4NGE4LCAweDFjZTYsCisJMHg4ODJjLCAweDAwMTYsIDB4YTIxMiwgMHg5Y2Q1LCAweDEwZDIsIDB4NzBlNCwgMHgwMDA0LCAweDgwMDcsCisJMHg5NDI0LCAweGNjMWEsIDB4OWNkOCwgMHg5OGNhLCAweDg4MjcsIDB4MzAwYSwgMHgwMDEzLCAweDgwMDAsCisJMHg4NGE0LCAweDAwMTYsIDB4MTFjMiwgMHgyMTFlLCAweDg3MGUsIDB4YTIxZCwgMHgwMDE0LCAweDg3OGUsCisJMHgwMDE2LCAweGEyMWMsIDB4MTAzNSwgMHg5ODkxLCAweGEyMTAsIDB4YTAwMCwgMHg4MDEwLCAweDg1OTIsCisJMHg4NTNiLCAweGQwNDQsIDB4ODAyMiwgMHgzODA3LCAweDg0YmIsIDB4OThlZiwgMHg4MDIxLCAweDM4MDcsCisJMHg4NGI5LCAweDMwMGMsIDB4ODE3ZSwgMHg4NzJiLCAweDg3NzIsIDB4OTg5MSwgMHgwMDAwLCAweDAwMjAsCisJMHgwMDJiLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAxNCwgMHgwMDE0LCAweDk4NDksIDB4MDAxNCwgMHgwMDE0LCAweDk4ZTUsCisJMHg5OGQwLCAweDAwMTQsIDB4MDAxNCwgMHgwMDE0LCAweDAwODAsIDB4MDEzZiwgMHgwMDAwLCAweDAyMDEsCisJMHgwNjA0LCAweDBjMDgsIDB4MjEyMCwgMHg0MDIyLCAweGY4ODAsIDB4MDAxOCwgMHgzMDBiLCAweGEyMDEsCisJMHgwMDE0LCAweGEyMDAsIDB4MDAxNCwgMHhhMjAwLCAweDAyMTQsIDB4YTIwMiwgMHg4ODM4LCAweDM4MDYsCisJMHg4ODM5LCAweDIwYzMsIDB4MDg2NCwgMHhhODJlLCAweDI4YzEsIDB4OWNiMSwgMHhhMjAzLCAweDMwMGMsCisJMHgyODQ2LCAweDgxNjEsIDB4ODQ2YSwgMHg4MzAwLCAweDE4NTYsIDB4ODgzYSwgMHhhODA0LCAweDI4ZjIsCisJMHg5YzkwLCAweGE4ZjQsIDB4MzAwYywgMHgyOGUxLCAweDljOTAsIDB4MjgwMiwgMHhhMjA2LCAweDY0YzMsCisJMHgyODJkLCAweGEyMDcsIDB4NjRhMCwgMHg2N2EwLCAweDZmYzAsIDB4MTgxNCwgMHg4ODNiLCAweDc4MjQsCisJMHg2OGMxLCAweDc4NjQsIDB4ODgzZSwgMHhhODAyLCAweDg1NzYsIDB4ODY3NywgMHgyMDZiLCAweDI4YzEsCisJMHg5Y2IxLCAweDIwNDQsIDB4MjEwMywgMHgyMGEyLCAweDIwODEsIDB4YThlNSwgMHhhMjA5LCAweDI5MDEsCisJMHhhODA5LCAweDAwMTQsIDB4YTIwNSwgMHhhMzAwLCAweDE4NzIsIDB4ODc5YSwgMHg4ODNjLCAweDFmZTIsCisJMHhjNjAxLCAweGEyMGEsIDB4ODU2ZSwgMHgwNzA0LCAweDljOTAsIDB4MDAxNCwgMHhhMjA0LCAweGEzMDAsCisJMHgzMDA5LCAweDE5ZTIsIDB4Zjg2OCwgMHg4MTc2LCAweDg2ZWIsIDB4ODVlYiwgMHg4NzJlLCAweDg3YTksCisJMHg4ODNmLCAweDA4ZTYsIDB4YThmMywgMHhmODgxLCAweGE4ZWMsIDB4YzgwMSwgMHgwMDE0LCAweGY4YzEsCisJMHgwMDE2LCAweDg1YjIsIDB4ODBmMCwgMHg5NTMyLCAweGZiMDIsIDB4MWRlMiwgMHgwMDE0LCAweDg1MzIsCisJMHhmMjQxLCAweDAwMTQsIDB4MWRlMiwgMHg4NGE4LCAweGQ3YTAsIDB4MWZlNiwgMHgwMDE0LCAweGEyMDgsCisJMHg2MDQzLCAweDgwMDgsIDB4MWRjMSwgMHgwMDE2LCAweDgzMDAsIDB4ODE2MCwgMHg4NDJhLCAweGYwNDEsCisJMHgzMDA4LCAweDg0YTgsIDB4MTFkNiwgMHg3MDQyLCAweDIwZGQsIDB4MDAxMSwgMHgyMGQ1LCAweDg4MjIsCisJMHgwMDE2LCAweDgwMDAsIDB4Mjg0NywgMHgxMDExLCAweGE4ZmMsIDB4ODAwMCwgMHhhMDAwLCAweDI4MDIsCisJMHgxMDExLCAweGE4ZmQsIDB4YTg5OCwgMHgyODNlLCAweDEwMTEsIDB4YThmZCwgMHhhMjBiLCAweDAwMTcsCisJMHgzMDBjLCAweGEzMDAsIDB4MWRlMiwgMHhkYjgxLCAweDAwMTQsIDB4MDIxMCwgMHhhODAxLCAweDAwMTQsCisJMHgyNmUwLCAweDg3M2EsIDB4ZmIwMiwgMHgxOWYyLCAweDFmZTIsIDB4MDAxNCwgMHhhMjBkLCAweDM4MDYsCisJMHgwMjEwLCAweDljYjYsIDB4MDcwNCwgMHgwMDE3LCAweDYwZmYsIDB4MzAwYywgMHg4NzIwLCAweGEyMTEsCisJMHg5ZDZiLCAweDg3NzIsIDB4ODgzNywgMHgyMTAxLCAweGE4MjEsIDB4MTBkMiwgMHg3OGUyLCAweDlkNmUsCisJMHhhOGZjLCAweGQ5ODQsIDB4ZjBlMiwgMHhmMGExLCAweGE4NzEsIDB4MDAxNCwgMHg4ODMxLCAweGQxNjYsCisJMHg4ODMwLCAweDgwMGYsIDB4OTQwMSwgMHhiNTIwLCAweGM4MDIsIDB4ODgyMCwgMHhhODBmLCAweDIzMDEsCisJMHhhODBkLCAweDEwZDIsIDB4NzhlNCwgMHg5ZDZlLCAweDg4MjEsIDB4ODgyMCwgMHhhOGU2LCAweGYxMjMsCisJMHhmMTQyLCAweGYxMDEsIDB4YTg1NCwgMHgxMGQyLCAweDcwZjYsIDB4ODgzMiwgMHg4MjAzLCAweDg3MGMsCisJMHhkOTllLCAweDYwMDEsIDB4MDAxNCwgMHg2ODQ1LCAweDAyMTQsIDB4YTIxYiwgMHg5ZDZiLCAweDIwMDEsCisJMHhhODQ1LCAweDgyMDEsIDB4MTg1MiwgMHhkMTg0LCAweGQxNjMsIDB4ODgzNCwgMHg4MDAxLCAweGE4MDEsCisJMHgzMDI3LCAweDg0YTgsIDB4MWE1NiwgMHg4ODMzLCAweDAwMTQsIDB4YTIxOCwgMHg2OTgxLCAweDlkNTcsCisJMHg2OTJhLCAweDY5MDIsIDB4MTgzNCwgMHhhODA1LCAweDFhMTQsIDB4ODAxMCwgMHg4NTkyLCAweDgwMjYsCisJMHg4NGI5LCAweDcwMjEsIDB4MDAxNCwgMHhhMzAwLCAweDY5ZTEsIDB4OWQ0MCwgMHg2OTRjLCAweGEyMTMsCisJMHg5ZDUwLCAweDE0NjIsIDB4YTIxMywgMHg4MDAwLCAweDE2ZTEsIDB4YTgwYSwgMHg4MDIzLCAweDE2ZTEsCisJMHg4MDAxLCAweDEwZjEsIDB4MDAxNiwgMHg2OTY4LCAweGEyMTQsIDB4OWQ1MCwgMHg4MDA0LCAweDE2ZTEsCisJMHgwMTAxLCAweDMwMGEsIDB4ODgyNywgMHgwMDE0LCAweDlkNTAsIDB4MDAxNCwgMHg2MWMyLCAweDgwMDIsCisJMHgxNGUxLCAweDAwMTYsIDB4YTIxNywgMHg5ZDU3LCAweDAwMTQsIDB4YTMwMCwgMHg4MTgxLCAweDg0MmEsCisJMHg4NGE4LCAweDFjZTYsIDB4ODgyYywgMHgwMDE2LCAweGEyMTIsIDB4OWQ2YiwgMHgxMGQyLCAweDcwZTQsCisJMHgwMDA0LCAweDgwMDcsIDB4OTQyNCwgMHhjYzFhLCAweDlkNmUsIDB4YThmOCwgMHg4ODI3LCAweDMwMGEsCisJMHgwMDEzLCAweDgwMDAsIDB4ODRhNCwgMHgwMDE2LCAweDExYzIsIDB4MjExZSwgMHg4NzBlLCAweGEyMWQsCisJMHgwMDE0LCAweDg3OGUsIDB4MDAxNiwgMHhhMjFjLCAweDEwMzUsIDB4YThhZiwgMHhhMjEwLCAweDM4MDcsCisJMHgzMDBjLCAweDgxN2UsIDB4ODcyYiwgMHg4NzcyLCAweGE4YTgsIDB4MDAwMCwgMHhkZjIxCit9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgcmlzY19jb2RlX2xlbmd0aDAxID0gMHg0MDU3OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWwxMjE2MF9mdy5oIGIvZHJpdmVycy9zY3NpL3FsMTIxNjBfZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI2YTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsMTIxNjBfZncuaApAQCAtMCwwICsxLDE3ODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMTIxNjAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi4yLnggYW5kIDIuNC54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUWxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJICAgICAgICAgICAtLS0gSVNQMTIxNjBBIEluaXRpYXRvciBGaXJtd2FyZSAtLS0gICAgICAgICAgICAgICAgICoKKyAqCQkJICAgICAgMzIgTFVOIFN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gMTAuMDQuMzIgKDEyOjAzIE1heSAwOSwgMjAwMSkKKyAqLworCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGZ3MTIxNjBpX3ZlcnNpb25fc3RyW10gPSB7MTAsNCwzMn07CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlybXdhcmVfdmVyc2lvbltdID0gezEwLDQsMzJ9OworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorI2RlZmluZSBmdzEyMTYwaV9WRVJTSU9OX1NUUklORyAiMTAuMDQuMzIiCisjZWxzZQorI2RlZmluZSBGV19WRVJTSU9OX1NUUklORyAiMTAuMDQuMzIiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZncxMjE2MGlfYWRkcjAxID0gMHgxMDAwOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgxMDAwOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ3MTIxNjBpX2NvZGUwMVtdID0geworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUwMVtdID0geworI2VuZGlmCisJMHgwODA0LCAweDEwNDEsIDB4MDAwMCwgMHgzNWU2LCAweDAwMDAsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsCisJMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMSwgMHgzOTM5LCAweDMxMmMsIDB4MzEzOSwgMHgzOTMyLCAweDJjMzEsCisJMHgzOTM5LCAweDMzMmMsIDB4MzEzOSwgMHgzOTM0LCAweDIwNTEsIDB4NGM0ZiwgMHg0NzQ5LCAweDQzMjAsCisJMHg0MzRmLCAweDUyNTAsIDB4NGY1MiwgMHg0MTU0LCAweDQ5NGYsIDB4NGUwMCwgMHgyMDQ5LCAweDUzNTAsCisJMHgzMTMyLCAweDMxMzYsIDB4MjA0NiwgMHg2OTcyLCAweDZkNzcsIDB4NjE3MiwgMHg2NTIwLCAweDIwNTYsCisJMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMxLCAweDMwMmUsIDB4MzAzNCwgMHgyMDIwLCAweDIwNDMsCisJMHg3NTczLCAweDc0NmYsIDB4NmQ2NSwgMHg3MjIwLCAweDRlNmYsIDB4MmUyMCwgMHgzMDMwLCAweDIwNTAsCisJMHg3MjZmLCAweDY0NzUsIDB4NjM3NCwgMHgyMDRlLCAweDZmMmUsIDB4MjAyMCwgMHgzMDMwLCAweDIwMjAsCisJMHgyNDAwLCAweDIwYzksIDB4OGZmZiwgMHgyMDcxLCAweDAyMDAsIDB4NzBhMCwgMHg3MGEyLCAweDIwMDEsCisJMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxMTIwLCAweDIwNzEsIDB4MDEwMCwgMHg3MGEwLCAweDcwYTIsCisJMHgyMGMxLCAweDAwMjAsIDB4MjA4OSwgMHgxMjIxLCAweDIwNzEsIDB4MDAxMCwgMHg3MGMzLCAweDAwMDQsCisJMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsIDB4MjAyMCwgMHg3MGQzLCAweDAwMGEsCisJMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHg3MGQ2LCAweDIwMDksIDB4ZmVmZiwgMHgyMTMwLCAweDIxMjgsCisJMHhhMWEyLCAweDQ2MDAsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsCisJMHhhMTkyLCAweDkwMDAsIDB4MjAwOSwgMHgwMDAwLCAweDIwMDEsIDB4MDAzMiwgMHgwODBjLCAweDFkZTgsCisJMHgyMjE4LCAweDIwNzksIDB4NDYwMCwgMHgyZmEwLCAweDI0MDgsIDB4MjAxMSwgMHgwMDAwLCAweDIwYTksCisJMHgwMDQwLCAweDQyYTQsIDB4ODEwOSwgMHgxZGQ4LCAweDIwMDksIDB4ZmYwMCwgMHgzNDAwLCAweGExMDIsCisJMHgwMjE4LCAweDAxMTAsIDB4MjBhOCwgMHg0MmE0LCAweDc4MWIsIDB4MDA2NCwgMHg3ODE0LCAweGMwY2QsCisJMHhjMGQ1LCAweDc4MTYsIDB4MjA3MSwgMHgwMjAwLCAweDAwZDYsIDB4MjA2OSwgMHg0NjQwLCAweDA4MGMsCisJMHg0NTlhLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTEzMCwgMHgyMDY5LCAweDQ2ODAsCisJMHgyMDcxLCAweDAxMDAsIDB4MDgwYywgMHg0NTlhLCAweDc4MTQsIDB4YzBkNCwgMHg3ODE2LCAweDAwZGUsCisJMHg3ZWNhLCAweDdjYzIsIDB4N2JjNiwgMHg3ODY3LCAweDAwMDAsIDB4NzgwMCwgMHhjMDhkLCAweDc4MDIsCisJMHgyMDMxLCAweDAwMzAsIDB4NzhhZiwgMHgwMTAxLCAweDc4MjMsIDB4MDAwMiwgMHg3ODI3LCAweDAwMDIsCisJMHgyMDA5LCAweDAwMDIsIDB4MjA2OSwgMHg0NjQwLCAweDY4MWIsIDB4MDAwMywgMHg2ODIzLCAweDAwMDcsCisJMHg2ODI3LCAweDAwZmEsIDB4NjgyYiwgMHgwMDA4LCAweDY4MmYsIDB4MDAyOCwgMHg2ODM3LCAweDAwMDYsCisJMHg2ODMzLCAweDAwMDgsIDB4NjgzYiwgMHgwMDAwLCAweDgxMDksIDB4MDUwMCwgMHg2OGNmLCAweDAwMGEsCisJMHg2OGJmLCAweDQ2YzAsIDB4MjA3OSwgMHg0NjAwLCAweDY4ZDMsIDB4NzYyZCwgMHg2OGMzLCAweDRiYzAsCisJMHg2OGM3LCAweDRhYzAsIDB4NjhjYiwgMHg4YmMwLCAweDY4YTcsIDB4OGU0NCwgMHg2OGFiLCAweDhlNDksCisJMHg2OGFmLCAweDhlNDQsIDB4NjhiMywgMHg4ZTQ0LCAweDY4YTMsIDB4MDAwMSwgMHgyMDAxLCAweDAxZmYsCisJMHgyMDA0LCAweGQwZmMsIDB4MTFjOCwgMHgyMDY5LCAweDQ2ODAsIDB4MDg3MCwgMHg2OGNmLCAweDAwMGEsCisJMHg2OGJmLCAweDQ4YzAsIDB4NjhkMywgMHg3ODM5LCAweDY4YzMsIDB4NmJjMCwgMHg2OGM3LCAweDRiNDAsCisJMHg2OGNiLCAweDhjZDAsIDB4NjhhNywgMHg4ZTQ5LCAweDY4YWIsIDB4OGU0ZSwgMHg2OGFmLCAweDhlNDksCisJMHg2OGIzLCAweDhlNDksIDB4NjhhMywgMHgwMDAxLCAweDAwZTYsIDB4MjA2OSwgMHg0YWMwLCAweDIwNzEsCisJMHgwMjAwLCAweDcwZWMsIDB4ZDBlNCwgMHgyMDE5LCAweDE4MDksIDB4MjAyMSwgMHgwMDA5LCAweDExMjAsCisJMHgyMDE5LCAweDE4MGMsIDB4MjAyMSwgMHgwMDBjLCAweDA4MGMsIDB4MWQ1OCwgMHgyMDAxLCAweDAxZmYsCisJMHgyMDA0LCAweGQwZmMsIDB4MTE4OCwgMHgyMDY5LCAweDRiNDAsIDB4MjA3MSwgMHgwMTAwLCAweDcwZWMsCisJMHhkMGU0LCAweDIwMTksIDB4MTgwOSwgMHgyMDIxLCAweDAwMDksIDB4MTEyMCwgMHgyMDE5LCAweDE4MGMsCisJMHgyMDIxLCAweDAwMGMsIDB4MDgwYywgMHgxZDU4LCAweDAwZWUsIDB4MjAxMSwgMHgwMDAyLCAweDIwNjksCisJMHg0YmMwLCAweDIwMDksIDB4MDAwMiwgMHgyMGE5LCAweDAxMDAsIDB4NjgzNywgMHgwMDAwLCAweDY4MGIsCisJMHgwMDQwLCAweDdiYzgsIDB4YTM4NiwgMHhmZWZmLCAweDExMjgsIDB4NjgxNywgMHgwMTAwLCAweDY4MWYsCisJMHgwMDY0LCAweDAwMjAsIDB4NjgxNywgMHgwMDY0LCAweDY4MWYsIDB4MDAwMiwgMHhhZGU4LCAweDAwMTAsCisJMHgxZjA0LCAweDExMzUsIDB4ODEwOSwgMHgxZDM4LCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsCisJMHgxMTI4LCAweDgyMTEsIDB4MDExOCwgMHgyMDY5LCAweDZiYzAsIDB4MDhkOCwgMHgwODBjLCAweDIyY2YsCisJMHgwODBjLCAweDQwMTUsIDB4MDgwYywgMHgxYjZkLCAweDA4MGMsIDB4NDU1MywgMHgyMDkxLCAweDIyMDAsCisJMHgyMDc5LCAweDQ2MDAsIDB4MjA3MSwgMHgwMDUwLCAweDIwOTEsIDB4MjQwMCwgMHgyMDc5LCAweDQ2MDAsCisJMHgyMDcxLCAweDAwMjAsIDB4MjA5MSwgMHgyNjAwLCAweDIwNzksIDB4MDIwMCwgMHgyMDcxLCAweDQ2NDAsCisJMHgyMDkxLCAweDI4MDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwNzEsIDB4NDY4MCwgMHgyMDkxLCAweDIwMDAsCisJMHgyMDc5LCAweDQ2MDAsIDB4MjA3MSwgMHgwMDEwLCAweDMyMDAsIDB4YTA4NSwgMHgzMDNkLCAweDIwOTAsCisJMHgyMDcxLCAweDAwMTAsIDB4NzBjMywgMHgwMDAwLCAweDEwMDQsIDB4MTE4YywgMHg3MGMwLCAweGEwODYsCisJMHgwMDAyLCAweDExMTAsIDB4MDgwYywgMHgxM2JhLCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDEyYWIsCisJMHg3OGFjLCAweGEwMDUsIDB4MTE4MCwgMHgwZTA0LCAweDExOWEsIDB4Nzg2YywgMHhhMDY1LCAweDAxMTAsCisJMHgwODBjLCAweDIwN2EsIDB4MDgwYywgMHgxZTA5LCAweDBlMDQsIDB4MTFhZiwgMHg3ODZjLCAweGEwNjUsCisJMHgwMTEwLCAweDA4MGMsIDB4MjA3YSwgMHgwZTA0LCAweDExYWYsIDB4MjAwOSwgMHg0NjQ3LCAweDIwMTEsCisJMHg0Njg3LCAweDIxMDQsIDB4MjIwYywgMHhhMTA1LCAweDAxMTAsIDB4MDgwYywgMHgxYzdjLCAweDIwNzEsCisJMHg0NjQwLCAweDcwYTAsIDB4YTAwNSwgMHgwMWU4LCAweDc0NGMsIDB4YTQ4NSwgMHgwMDAwLCAweDAxYzgsCisJMHgyMDc5LCAweDAyMDAsIDB4MjA5MSwgMHg4MDAwLCAweDcyZDAsIDB4YTI4YywgMHgzMDNkLCAweDIxOTAsCisJMHgwODBjLCAweDI3MjAsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTEsIDB4MzAzZCwgMHgwZTA0LCAweDExZDEsCisJMHgyMDc5LCAweDQ2MDAsIDB4Nzg2YywgMHhhMDY1LCAweDAxMjAsIDB4MjA3MSwgMHgwMDEwLCAweDA4MGMsCisJMHgyMDdhLCAweDFkMDQsIDB4MTFkOSwgMHgyMDc5LCAweDQ2MDAsIDB4MjA3MSwgMHgwMDEwLCAweDA4MGMsCisJMHg0MzcwLCAweDIwNzEsIDB4NDY4MCwgMHg3MGEwLCAweGEwMDUsIDB4MDE4OCwgMHg3MDRjLCAweGEwMjUsCisJMHgwMTcwLCAweDIwNzksIDB4MDEwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzJkMCwgMHhhMjhjLCAweDMwM2QsCisJMHgyMTkwLCAweDA4MGMsIDB4MjcyMCwgMHgyMDkxLCAweDgwMDAsIDB4MjA5MSwgMHgzMDNkLCAweDIwNzksCisJMHg0NjAwLCAweDIwNzEsIDB4MDAxMCwgMHgwZTA0LCAweDExZmEsIDB4Nzg2YywgMHhhMDY1LCAweDAxMTAsCisJMHgwODBjLCAweDIwN2EsIDB4MWQwNCwgMHgxMThlLCAweDA4MGMsIDB4NDM3MCwgMHgwODA0LCAweDExOGUsCisJMHgzYzAwLCAweGEwODQsIDB4MDAwNywgMHgwMDAyLCAweDEyMGMsIDB4MTIwYywgMHgxMjBlLCAweDEyMGUsCisJMHgxMjEzLCAweDEyMTMsIDB4MTIxOCwgMHgxMjE4LCAweDA4MGMsIDB4MjU0YywgMHgyMDkxLCAweDI0MDAsCisJMHgwODBjLCAweDQwYWQsIDB4MDAwNSwgMHgyMDkxLCAweDIyMDAsIDB4MDgwYywgMHg0MGFkLCAweDAwMDUsCisJMHgyMDkxLCAweDIyMDAsIDB4MDgwYywgMHg0MGFkLCAweDIwOTEsIDB4MjQwMCwgMHgwODBjLCAweDQwYWQsCisJMHgwMDA1LCAweDEyNDEsIDB4MTI0MSwgMHgxMjQyLCAweDEyNDIsIDB4MTI0ZCwgMHgxMjRkLCAweDEyNGQsCisJMHgxMjRkLCAweDEyNTYsIDB4MTI1NiwgMHgxMjYxLCAweDEyNjEsIDB4MTI0ZCwgMHgxMjRkLCAweDEyNGQsCisJMHgxMjRkLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLCAweDEyNzAsCisJMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLCAweDEyNzAsIDB4MTI3MCwgMHgxMjcwLCAweDEyNzAsCisJMHgxMjcwLCAweDBjZjgsIDB4MDAwNiwgMHgwMTA2LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDA4MGMsCisJMHgyNTY5LCAweDAxMmUsIDB4MDEwZSwgMHgwMDBlLCAweDAwMGQsIDB4MDAwNiwgMHgwMTA2LCAweDAxMjYsCisJMHgwODBjLCAweDEyMDAsIDB4MDEyZSwgMHgwMTBlLCAweDAwMGUsIDB4MDAwZCwgMHgwMDA2LCAweDAxMDYsCisJMHgwMTI2LCAweDIwOTEsIDB4MjYwMCwgMHgwODBjLCAweDI1NjksIDB4MDEyZSwgMHgwMTBlLCAweDAwMGUsCisJMHgwMDBkLCAweDAwMDYsIDB4MDEwNiwgMHgwMTI2LCAweDIwOTEsIDB4MjYwMCwgMHgwODBjLCAweDI1NjksCisJMHgyMDkxLCAweDI4MDAsIDB4MDgwYywgMHgyNTY5LCAweDAxMmUsIDB4MDEwZSwgMHgwMDBlLCAweDAwMGQsCisJMHgwMDA2LCAweDAxMDYsIDB4MDEyNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDc5LCAweDQ2MDAsCisJMHgyMDcxLCAweDAyMDAsIDB4MjA2OSwgMHg0NjQwLCAweDNkMDAsIDB4ZDA4YywgMHgwMTMwLCAweDcwZWMsCisJMHhhMDg0LCAweDFjMDAsIDB4NzhlMiwgMHgwODBjLCAweDQ1OWEsIDB4M2QwMCwgMHhkMDg0LCAweDAxNTAsCisJMHgyMDY5LCAweDQ2ODAsIDB4MjA3MSwgMHgwMTAwLCAweDcwZWMsIDB4YTA4NCwgMHgxYzAwLCAweDc4ZTYsCisJMHgwODBjLCAweDQ1OWEsIDB4MDgwYywgMHgyNGZkLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAxMmUsCisJMHgwMTBlLCAweDAwMGUsIDB4MDAwZCwgMHg3MDA4LCAweDgwMGIsIDB4MTI0MCwgMHg3MDA3LCAweDAwMDIsCisJMHhhMDhjLCAweDAxZTAsIDB4MTEyMCwgMHhkMDljLCAweDAxMDgsIDB4MDg4NywgMHgwODk3LCAweDcwYzMsCisJMHg0MDAyLCAweDA4MDQsIDB4MTNiZCwgMHgwZTA0LCAweDEzMWUsIDB4MjA2MSwgMHgwMDAwLCAweDYwMTgsCisJMHhkMDg0LCAweDE5MDQsIDB4MTMxZSwgMHg3ODI4LCAweGEwMDUsIDB4MTEyMCwgMHgwMDA0LCAweDEzMWYsCisJMHgwODA0LCAweDEzMWUsIDB4ZDBmYywgMHgwMTMwLCAweDAwMDYsIDB4MDgwYywgMHgxYjBhLCAweDAwMGUsCisJMHgwMTUwLCAweDAwMjgsIDB4MDAwNiwgMHgwODBjLCAweDFhZmYsIDB4MDAwZSwgMHgwMTIwLCAweDIwMDEsCisJMHg0MDA3LCAweDA4MDQsIDB4MTNiYywgMHg3OTEwLCAweGQwZmMsIDB4MTEyOCwgMHgyMDYxLCAweDQ2NDAsCisJMHhjMTljLCAweGM3ZmMsIDB4MDAyMCwgMHgyMDYxLCAweDQ2ODAsIDB4YzE5ZCwgMHhjN2ZkLCAweDYwNjAsCisJMHhhMDA1LCAweDE5MDQsIDB4MTMxZSwgMHg3OTEyLCAweDYwN2UsIDB4NzgyOCwgMHhjMGZjLCAweGEwODYsCisJMHgwMDE4LCAweDExMjAsIDB4MDBjNiwgMHgwODBjLCAweDE5MTYsIDB4MDBjZSwgMHg3ODJiLCAweDAwMDAsCisJMHg2MDc4LCAweGEwNjUsIDB4MDFlMCwgMHgwMGM2LCAweDYwOWMsIDB4MDgwYywgMHgxYmQ0LCAweDAwY2UsCisJMHg2MDlmLCAweDAwMDAsIDB4MDgwYywgMHgxYTQxLCAweDIwMDksIDB4MDAxOCwgMHg2MDg3LCAweDAxMDMsCisJMHg3ODEwLCAweDAwMDYsIDB4ODRmZiwgMHgxMTEwLCAweDg1ZmYsIDB4MDExMCwgMHhjMGM1LCAweDc4MTIsCisJMHgwODBjLCAweDFiMTUsIDB4MDAwZSwgMHg3ODEyLCAweDExOTgsIDB4MDgwYywgMHgxYjYwLCAweDc4MTAsCisJMHhkMDljLCAweDExMTgsIDB4MjA2MSwgMHg0NjQwLCAweDAwMjAsIDB4MjA2MSwgMHg0NjgwLCAweGMwOWMsCisJMHg3ODEyLCAweDYwN2IsIDB4MDAwMCwgMHg2MGQwLCAweGQwYzQsIDB4MDEzMCwgMHhjMGM0LCAweDYwZDIsCisJMHgyMDAxLCAweDQwMDUsIDB4MDgwNCwgMHgxM2JjLCAweDA4MDQsIDB4MTNiYSwgMHgwMDA1LCAweGEwMDYsCisJMHg3MGMyLCAweDcwYzYsIDB4NzBjYSwgMHg3MGNlLCAweDcwZGEsIDB4NzBjMCwgMHhhMDNkLCAweGEwOGEsCisJMHgwMDQwLCAweDFhMDQsIDB4MTM2YywgMHgwMDAyLCAweDEzYmEsIDB4MTQwOCwgMHgxM2Q2LCAweDE0M2MsCisJMHgxNDcwLCAweDE0NzAsIDB4MTNjZSwgMHgxYTU5LCAweDE0N2EsIDB4MTNjOCwgMHgxM2RhLCAweDEzZGIsCisJMHgxM2RjLCAweDEzZGQsIDB4MWE1ZCwgMHgxM2M4LCAweDE0ODcsIDB4MTRkYiwgMHgxOTMxLCAweDFhNTMsCisJMHgxM2RlLCAweDE3YmEsIDB4MTdmMCwgMHgxODIyLCAweDE4NjgsIDB4MTc3NywgMHgxNzg0LCAweDE3OTcsCisJMHgxN2E5LCAweDE1YjAsIDB4MTNjOCwgMHgxNTBkLCAweDE1MTgsIDB4MTUyNiwgMHgxNTM0LCAweDE1NGIsCisJMHgxNTU5LCAweDE1NWMsIDB4MTU2YSwgMHgxNTc4LCAweDE1ODIsIDB4MTU5NiwgMHgxNWEyLCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxNWJkLCAweDE1Y2UsIDB4MTVlOCwgMHgxNjFjLCAweDE2NDUsCisJMHgxNjU3LCAweDE2NWEsIDB4MTY4NSwgMHgxNmJlLCAweDE2ZDAsIDB4MTc0NSwgMHgxNzU1LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxNzY3LCAweDIxMDAsIDB4YTA4YSwgMHgwMDQwLCAweDFhMDQsCisJMHgxM2M4LCAweDAwMDIsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDFhN2YsCisJMHgxYTg1LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDFhODksIDB4MWFjOSwgMHgxM2M4LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTQwMywgMHgxNDZiLCAweDE0ODIsIDB4MTRkNiwgMHgxOTJjLCAweDEzYzgsCisJMHgxM2M4LCAweDE4ZmIsIDB4MTNjOCwgMHgxYWNkLCAweDFhNzEsIDB4MWE3YiwgMHgxM2M4LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsIDB4MTNjOCwgMHgxM2M4LCAweDEzYzgsCisJMHgxM2M4LCAweDEzYzgsIDB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwNiwgMHgwMDI4LCAweDczY2UsCisJMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDAwLCAweDcwYzIsIDB4MGUwNCwgMHgxM2JkLCAweDIwNjEsCisJMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDAwMDUsCisJMHg3MGMzLCAweDQwMDEsIDB4MGM5MCwgMHg3MGMzLCAweDQwMDYsIDB4MGM3OCwgMHgyMDk5LCAweDAwNDEsCisJMHgyMGExLCAweDAwNDEsIDB4MjBhOSwgMHgwMDA1LCAweDUzYTMsIDB4MGMyMCwgMHg3MGM0LCAweDcwYzMsCisJMHgwMDA0LCAweDA4MDcsIDB4MDhmOCwgMHgwOGYwLCAweDA4ZTgsIDB4MDhlMCwgMHgyMDkxLCAweDgwMDAsCisJMHg3MGMzLCAweDAwMDQsIDB4NzBjNywgMHg0OTUzLCAweDcwY2IsIDB4NTAyMCwgMHg3MGNmLCAweDIwMjAsCisJMHg3MGQzLCAweDAwMGEsIDB4MjAwMSwgMHgwMDA0LCAweDcwZDYsIDB4MjA3OSwgMHgwMDAwLCAweDc4MWIsCisJMHgwMDAxLCAweDIwMzEsIDB4MDAzMCwgMHgyMDU5LCAweDEwMDAsIDB4MjAyOSwgMHgwNDFhLCAweDIwNTEsCisJMHgwNDQ1LCAweDIwNjEsIDB4MDQ0NywgMHgyMGMxLCAweDAwMjAsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsCisJMHg0MDgwLCAweDA4MDQsIDB4MDQxOCwgMHg3NWQ4LCAweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLCAweDAwMTgsCisJMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwgMHg3MWQwLCAweDcyYzgsIDB4NzNjYywgMHg3MGM0LCAweDIwYTAsCisJMHgyMDk5LCAweDAwMzAsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwNiwgMHg3MzFhLCAweDcyMWUsCisJMHg3NDIyLCAweDc1MjYsIDB4MjAyMSwgMHgwMDQwLCAweDgxZmYsIDB4MDkwNCwgMHgxM2JhLCAweGExODIsCisJMHgwMDQwLCAweDEyMTAsIDB4MjEyMCwgMHhhMDA2LCAweDIwMDgsIDB4ODQwMywgMHg3MDEyLCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDcsIDB4MDAwMSwgMHg3MDA4LCAweGQwZmMsIDB4MGRlOCwgMHg3MDA3LCAweDAwMDIsCisJMHhhMDg0LCAweDAxZTAsIDB4MDEyMCwgMHg3MGMzLCAweDQwMDIsIDB4MDgwNCwgMHgxM2JkLCAweDI0YTgsCisJMHg1M2E1LCAweDBjMTAsIDB4MDgwNCwgMHgxM2JhLCAweDIwMjksIDB4MDAwMCwgMHgyNTIwLCAweDcxZDAsCisJMHg3MmM4LCAweDczY2MsIDB4NzBjNCwgMHgyMDk4LCAweDIwYTEsIDB4MDAzMCwgMHg3MDAzLCAweDAwMDAsCisJMHg3MDA3LCAweDAwMDYsIDB4NzMxYSwgMHg3MjFlLCAweDc0MjIsIDB4NzUyNiwgMHgyMDIxLCAweDAwNDAsCisJMHg3MDA3LCAweDAwMDYsIDB4ODFmZiwgMHgwOTA0LCAweDEzYmEsIDB4YTE4MiwgMHgwMDQwLCAweDEyMTAsCisJMHgyMTIwLCAweGEwMDYsIDB4MjAwOCwgMHg4NDAzLCAweDcwMTIsIDB4MjRhOCwgMHg1M2E2LCAweDcwMDcsCisJMHgwMDAxLCAweDcwMDgsIDB4ZDBmYywgMHgwZGU4LCAweGEwODQsIDB4MDFlMCwgMHgwZDQ4LCAweDcwYzMsCisJMHg0MDAyLCAweDA4MDQsIDB4MTNiZCwgMHg3NWQ4LCAweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLCAweDA4NzgsCisJMHg3MWM0LCAweDcwYzgsIDB4MjExNCwgMHhhNzllLCAweDAwMDQsIDB4MTEwOCwgMHgyMDBhLCAweDcyY2EsCisJMHgwODA0LCAweDEzYjksIDB4NzBjNywgMHgwMDBhLCAweDcwY2IsIDB4MDAwNCwgMHg3MGNmLCAweDAwMjAsCisJMHgwODA0LCAweDEzYmEsIDB4NzVkOCwgMHg3NmRjLCAweDc1ZGEsIDB4NzZkZSwgMHgwMDE4LCAweDIwMjksCisJMHgwMDAwLCAweDI1MzAsIDB4NzBjNCwgMHg3MmM4LCAweDczY2MsIDB4NzRkMCwgMHg3MGM2LCAweDcyY2EsCisJMHg3M2NlLCAweDc0ZDIsIDB4YTAwNSwgMHgwNWU4LCAweGE0MGEsIDB4MDEwOCwgMHgxMjQwLCAweDgwMDEsCisJMHg3ODcyLCAweGEwODQsIDB4ZmMwMCwgMHgwMTM4LCAweDc4YWMsIDB4YzA4NSwgMHg3OGFlLCAweDIwMDEsCisJMHg0MDA1LCAweDA4MDQsIDB4MTNiYywgMHg3YjdlLCAweDdhN2EsIDB4N2U4NiwgMHg3ZDgyLCAweDdjNzYsCisJMHhhNDhjLCAweGZmMDAsIDB4MDE3MCwgMHg4NDA3LCAweDgwMDQsIDB4ODAwNCwgMHg4MTBjLCAweDgxMGMsCisJMHg4MTBmLCAweGExMTgsIDB4YTI5MSwgMHgwMDAwLCAweGE2YjEsIDB4MDAwMCwgMHhhNTgxLCAweDAwMDAsCisJMHgwMDUwLCAweDg0MDcsIDB4ODAwNCwgMHg4MDA0LCAweGEzMTgsIDB4YTI5MSwgMHgwMDAwLCAweGE2YjEsCisJMHgwMDAwLCAweGE1ODEsIDB4MDAwMCwgMHg3MzFhLCAweDcyMWUsIDB4NzYyMiwgMHg3MDI2LCAweGE2MDUsCisJMHgwMTE4LCAweDdhMTAsIDB4YzJjNSwgMHg3YTEyLCAweDc4YWMsIDB4YTA4NCwgMHhmZmZjLCAweDc4YWUsCisJMHgwMDE4LCAweDc4YWMsIDB4YzA4NSwgMHg3OGFlLCAweDA4MDQsIDB4MTNiYSwgMHg3NWQ4LCAweDc2ZGMsCisJMHg3NWRhLCAweDc2ZGUsIDB4MDAxOCwgMHgyMDI5LCAweDAwMDAsIDB4MjUzMCwgMHg3MGM0LCAweDcyYzgsCisJMHg3M2NjLCAweDc0ZDQsIDB4NzBjNiwgMHg3MmNhLCAweDczY2UsIDB4NzRkNiwgMHhhMDA1LCAweDA1MDAsCisJMHhhNDBhLCAweDAxMTAsIDB4MWEwNCwgMHgxM2JjLCAweDgwMDEsIDB4Nzg5MiwgMHhhMDg0LCAweGZjMDAsCisJMHgwMTM4LCAweDc4YWMsIDB4YzBjNSwgMHg3OGFlLCAweDIwMDEsIDB4NDAwNSwgMHgwODA0LCAweDEzYmMsCisJMHg3YTlhLCAweDdiOWUsIDB4N2RhMiwgMHg3ZWE2LCAweDI2MDAsIDB4YTUwNSwgMHgwMTE4LCAweDdhMTAsCisJMHhjMmM1LCAweDdhMTIsIDB4N2M5NiwgMHg3OGFjLCAweGEwODQsIDB4ZmNmZiwgMHg3OGFlLCAweDAwMTgsCisJMHg3OGFjLCAweGMwYzUsIDB4NzhhZSwgMHgwODA0LCAweDEzYmEsIDB4MjAwOSwgMHgwMDAwLCAweDc4NmMsCisJMHhhMDY1LCAweDAxMTgsIDB4ODEwOCwgMHg2MDAwLCAweDBjZDgsIDB4N2FjNCwgMHgwODA0LCAweDEzYjgsCisJMHgyMDA5LCAweDQ2NDgsIDB4MjEwYywgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsCisJMHgxM2I5LCAweDIwMTEsIDB4NDY4OCwgMHgyMjE0LCAweDA4MDQsIDB4MTNiOCwgMHgyMDA5LCAweDQ2NDksCisJMHgyMTBjLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2I5LCAweDIwMTEsCisJMHg0Njg5LCAweDIyMTQsIDB4MDgwNCwgMHgxM2I4LCAweDIwNjEsIDB4NDY0MCwgMHg2MTI4LCAweDYyMmMsCisJMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDExNDgsCisJMHgyMDYxLCAweDQ2ODAsIDB4NjMyOCwgMHg3M2RhLCAweDYzMmMsIDB4ODMxYywgMHg4MzFjLCAweDgzMWMsCisJMHg3M2RlLCAweDA4MDQsIDB4MTNiOCwgMHgyMDA5LCAweDQ2NGMsIDB4MjEwYywgMHgyMDAxLCAweDAxZmYsCisJMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2I5LCAweDIwMTEsIDB4NDY4YywgMHgyMjE0LCAweDA4MDQsCisJMHgxM2I4LCAweDc5MTgsIDB4MDgwNCwgMHgxM2I5LCAweDIwMDksIDB4MDIwMiwgMHgyMTBjLCAweDIwMDEsCisJMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDEzYjksIDB4MjAxMSwgMHgwMTAyLCAweDIyMTQsCisJMHgwODA0LCAweDEzYjgsIDB4MjAwOSwgMHg0NjRkLCAweDIxMGMsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsCisJMHhkMGZjLCAweDE5MDQsIDB4MTNiOSwgMHgyMDExLCAweDQ2OGQsIDB4MjIxNCwgMHgwODA0LCAweDEzYjgsCisJMHg3OTIwLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2I5LCAweDdhMjQsCisJMHgwODA0LCAweDEzYjgsIDB4MjAxMSwgMHg0YjQwLCAweDcxYzQsIDB4ZDFmYywgMHgxMTEwLCAweDIwMTEsCisJMHg0YWMwLCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEyNjgsCisJMHg2YTAwLCAweDZiMDgsIDB4NmMxYywgMHg3NGRhLCAweDA4MDQsIDB4MTNiNywgMHg3N2M0LCAweDA4MGMsCisJMHgxYjdiLCAweDIwOTEsIDB4ODAwMCwgMHg2YjFjLCAweDZhMTQsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsCisJMHgwODA0LCAweDEzYjcsIDB4MjA2MSwgMHg0NjQwLCAweDYxMTgsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsCisJMHhkMGZjLCAweDE5MDQsIDB4MTNiOSwgMHgyMDYxLCAweDQ2ODAsIDB4NjIxOCwgMHgwODA0LCAweDEzYjgsCisJMHg3N2M0LCAweDA4MGMsIDB4MWI3YiwgMHgyMDkxLCAweDgwMDAsIDB4NjkwOCwgMHg2YTE4LCAweDZiMTAsCisJMHg3N2RhLCAweDIwOTEsIDB4ODAwMSwgMHgwODA0LCAweDEzYjcsIDB4NzFjNCwgMHgyMTEwLCAweGEyOTQsCisJMHgwMDBmLCAweGEyODIsIDB4MDAxMCwgMHgxYTA0LCAweDEzYjMsIDB4MDgwYywgMHgyMzhiLCAweGEzODQsCisJMHg0MDAwLCAweDAxMTAsIDB4YTI5NSwgMHgwMDIwLCAweDA4MDQsIDB4MTNiNywgMHg3MWM0LCAweDIxMDAsCisJMHhjMGJjLCAweGEwODIsIDB4MDAxMCwgMHgxYTA0LCAweDEzYjMsIDB4ZDFiYywgMHgxMTIwLCAweDIwMTEsCisJMHg0NjQ4LCAweDIyMDQsIDB4MDAyMCwgMHgyMDExLCAweDQ2ODgsIDB4MjIwNCwgMHhjMGJkLCAweDAwMDYsCisJMHgyMTAwLCAweGMwYmMsIDB4MjAxMiwgMHgwODBjLCAweDIzMzEsIDB4MDAxZSwgMHgwODA0LCAweDEzYjksCisJMHg3MWM0LCAweDIwMjEsIDB4NDY0OSwgMHgyNDA0LCAweDcwYzYsIDB4MjAxOSwgMHgwMDAwLCAweDAwMzAsCisJMHg3MWM4LCAweDIwMjEsIDB4NDY4OSwgMHgyNDA0LCAweDcwY2EsIDB4YzNmZCwgMHgyMDExLCAweDE2MTQsCisJMHgyMGE5LCAweDAwMDgsIDB4MjIwNCwgMHhhMTA2LCAweDAxMzgsIDB4ODIxMCwgMHgxZjA0LCAweDE1ZmEsCisJMHg3MWM0LCAweDcyYzgsIDB4MDgwNCwgMHgxM2IyLCAweGEyOTIsIDB4MTYxNCwgMHgwMDI2LCAweDIxMjIsCisJMHgwMDFlLCAweDA4MGMsIDB4MjM0MywgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDExMTAsCisJMHhkM2ZjLCAweDA5ZjAsIDB4MDgwNCwgMHgxM2JhLCAweDAzZTgsIDB4MDBmYSwgMHgwMWY0LCAweDAyZWUsCisJMHgwMDA0LCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDIwNjEsIDB4NDY0MCwgMHg2MTI4LCAweDYyMmMsCisJMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHg3MGM0LCAweDYwMmEsIDB4NzBjOCwgMHg4MDAzLCAweDgwMDMsCisJMHg4MDAzLCAweDYwMmUsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxMWEwLCAweDAwMjYsCisJMHgwMDE2LCAweDIwNjEsIDB4NDY4MCwgMHg2MTI4LCAweDYyMmMsIDB4ODIxNCwgMHg4MjE0LCAweDgyMTQsCisJMHg3MGQ4LCAweDYwMmEsIDB4NzBkYywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg2MDJlLCAweDcxZGEsCisJMHg3MmRlLCAweDAwMWUsIDB4MDAyZSwgMHgwODA0LCAweDEzYjgsIDB4MjA2MSwgMHg0NjQwLCAweDYxMzAsCisJMHg3MGM0LCAweDYwMzIsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDEzYjksCisJMHgyMDYxLCAweDQ2ODAsIDB4NjIzMCwgMHg3MGM4LCAweDYwMzIsIDB4MDgwNCwgMHgxM2I4LCAweDc5MTgsCisJMHgwODA0LCAweDEzYjksIDB4NzFjNCwgMHhhMTg0LCAweGYwY2YsIDB4MDE0OCwgMHgyMDAxLCAweDAxZmYsCisJMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2IzLCAweDcyYzgsIDB4MDgwNCwgMHgxM2IyLCAweDAwMDYsCisJMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHgyMzdmLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsCisJMHgwMTE4LCAweDAwMWUsIDB4MDgwNCwgMHgxM2I5LCAweDcxYzgsIDB4YTE4NCwgMHhmMGNmLCAweDAxMjgsCisJMHgwMDA2LCAweDIxMTAsIDB4NzFjNCwgMHgwODA0LCAweDEzYjIsIDB4MDAwNiwgMHhjM2ZkLCAweDA4MGMsCisJMHgyMzdmLCAweDAwMmUsIDB4MDAxZSwgMHgwODA0LCAweDEzYjgsIDB4NzFjNCwgMHhhMTgyLCAweDAwMTAsCisJMHgwMjQ4LCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgxM2IzLCAweDcyYzgsCisJMHgwODA0LCAweDEzYjIsIDB4MjAxMSwgMHg0NjRkLCAweDIyMDQsIDB4MDAwNiwgMHg4MTA0LCAweDEyMDgsCisJMHg4MTA4LCAweDIxMTIsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4MjM2YywgMHgyMDAxLCAweDAxZmYsCisJMHgyMDA0LCAweGQwZmMsIDB4MDExOCwgMHgwMDFlLCAweDA4MDQsIDB4MTNiOSwgMHg3MWM4LCAweGExODIsCisJMHgwMDEwLCAweDAyMjgsIDB4MDAwNiwgMHgyMTEwLCAweDcxYzQsIDB4MDgwNCwgMHgxM2IyLCAweDIwMTEsCisJMHg0NjhkLCAweDIyMDQsIDB4MDAwNiwgMHg4MTA0LCAweDEyMDgsIDB4ODEwOCwgMHgyMTEyLCAweGMzZmQsCisJMHgwODBjLCAweDIzNmMsIDB4MDAyZSwgMHgwMDFlLCAweDA4MDQsIDB4MTNiOCwgMHg3MWM0LCAweDcyYzgsCisJMHhhMTg0LCAweGZmZmQsIDB4MTkwNCwgMHgxM2IyLCAweGEyODQsIDB4ZmZmZCwgMHgxOTA0LCAweDEzYjIsCisJMHgyMTAwLCAweDc5MjAsIDB4NzgyMiwgMHgyMjAwLCAweDdhMjQsIDB4NzgyNiwgMHgwODA0LCAweDEzYjgsCisJMHgyMDExLCAweDRiNDAsIDB4NzFjNCwgMHhkMWZjLCAweDExMTAsIDB4MjAxMSwgMHg0YWMwLCAweDgxMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTI2OCwgMHg3MmM4LCAweDczY2MsCisJMHg3NGQ4LCAweDcxYzYsIDB4NjgwMCwgMHg3MGNhLCAweDczY2UsIDB4NzRkYSwgMHgyMDkxLCAweDgwMDAsCisJMHg2YTAyLCAweGQyYWMsIDB4MTExOCwgMHgyMDIxLCAweDAwMDAsIDB4MDA5MCwgMHhhNDg0LCAweDAwZmYsCisJMHhhMDgyLCAweDAwMDIsIDB4MWEwNCwgMHgxNzQxLCAweDg0M2YsIDB4YTdiYywgMHgwMGZmLCAweDAxNDAsCisJMHhhNzg2LCAweDAwMDIsIDB4MTkwNCwgMHgxNzQxLCAweGE0ODQsIDB4MDBmZiwgMHgwOTA0LCAweDE3NDEsCisJMHgyMDYxLCAweDAyMDAsIDB4ZDFmYywgMHgwMTEwLCAweDIwNjEsIDB4MDEwMCwgMHgyMDI5LCAweDAwMDksCisJMHgyMDMxLCAweDAwNjIsIDB4ODQzZiwgMHhhN2JjLCAweDAwZmYsIDB4MDEzMCwgMHg4MzA3LCAweGEwODQsCisJMHgwMGZmLCAweDExMTAsIDB4YTczZCwgMHgxMTM4LCAweDIwNDEsIDB4MDAxOSwgMHhhMzg0LCAweDAwZmYsCisJMHhhMDgyLCAweDAwMWEsIDB4MDIxMCwgMHhhNGE0LCAweDAwZmYsIDB4ODMwNywgMHhhMDg0LCAweDAwZmYsCisJMHgwMTg4LCAweGE4NDIsIDB4MDJmMCwgMHhhMDg2LCAweDAwMTAsIDB4MTEyMCwgMHhhMzljLCAweDAwZmYsCisJMHhhMzlkLCAweDBmMDAsIDB4YTNiYywgMHgwMGZmLCAweDI1MDAsIDB4YTcwMiwgMHgwMjkwLCAweDI2MDAsCisJMHhhNzAyLCAweDEyNzgsIDB4MjAzOSwgMHgwMDNhLCAweDY4MDQsIDB4YTcwNSwgMHg2ODA2LCAweDZiMGEsCisJMHg2YjBjLCAweDczY2UsIDB4NjgxYywgMHg3MGRhLCAweDZjMWUsIDB4MjA5MSwgMHg4MDAxLCAweDA4MDQsCisJMHgxM2JhLCAweDIwOTEsIDB4ODAwMSwgMHgwODA0LCAweDEzYjQsIDB4NzdjNCwgMHgwODBjLCAweDFiN2IsCisJMHgyMDkxLCAweDgwMDAsIDB4NmExNCwgMHg2YjFjLCAweDIwOTEsIDB4ODAwMSwgMHg3MGM4LCAweDY4MTYsCisJMHg3MGNjLCAweDY4MWUsIDB4MjcwOCwgMHgwODA0LCAweDEzYjcsIDB4NzBjNCwgMHgyMDYxLCAweDQ2NDAsCisJMHg2MTE4LCAweDYwMWEsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDEzYjksCisJMHg3MGM4LCAweDIwNjEsIDB4NDY4MCwgMHg2MjE4LCAweDYwMWEsIDB4MDgwNCwgMHgxM2I4LCAweDcxYzQsCisJMHg3MmM4LCAweDczY2MsIDB4YTE4MiwgMHgwMDEwLCAweDFhMDQsIDB4MTNiMywgMHgwODBjLCAweDIzYWYsCisJMHhhMzg0LCAweDQwMDAsIDB4MDExMCwgMHhhMjk1LCAweDAwMjAsIDB4MDgwNCwgMHgxM2I3LCAweDc3YzQsCisJMHgwODBjLCAweDFiN2IsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsIDB4YzI4ZCwgMHg2YTBhLCAweDIwOTEsCisJMHg4MDAxLCAweDI3MDgsIDB4MDgwNCwgMHgxM2I4LCAweDc3YzQsIDB4MDgwYywgMHgxYjdiLCAweDIwOTEsCisJMHg4MDAwLCAweDZhMDgsIDB4YTI5NCwgMHhmZmY5LCAweDZhMGEsIDB4NjgwNCwgMHhhMDA1LCAweDAxMTAsCisJMHgwODBjLCAweDIyYWUsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDgwNCwgMHgxM2I4LCAweDc3YzQsCisJMHgwODBjLCAweDFiN2IsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsIDB4YzI5NSwgMHg2YTBhLCAweDY4MDQsCisJMHhhMDA1LCAweDAxMTAsIDB4MDgwYywgMHgyMmFlLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDA4MDQsCisJMHgxM2I4LCAweDc3YzQsIDB4MjA0MSwgMHgwMDAxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgxYjkzLCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDZhMDgsCisJMHgwODA0LCAweDEzYjgsIDB4NzdjNCwgMHhkN2ZjLCAweDAxMjgsIDB4MDgwYywgMHgxYjBhLCAweDAxMzgsCisJMHgwODA0LCAweDEzYmMsIDB4MDgwYywgMHgxYWZmLCAweDAxMTAsIDB4MDgwNCwgMHgxM2JjLCAweDczYzgsCisJMHg3MmNjLCAweDc3YzYsIDB4NzNjYSwgMHg3MmNlLCAweDA4MGMsIDB4MWMwYiwgMHgxMWU4LCAweDY4MTgsCisJMHhhMDA1LCAweDAxYTAsIDB4MjcwOCwgMHgwMDc2LCAweDA4MGMsIDB4MjNjZSwgMHgwMDdlLCAweDExNzAsCisJMHgyMDAxLCAweDAwMTUsIDB4ZDdmYywgMHgxMTE4LCAweDIwNjEsIDB4NDY0MCwgMHgwMDE4LCAweGMwZmQsCisJMHgyMDYxLCAweDQ2ODAsIDB4NzgyYSwgMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDEsCisJMHgyMDAxLCAweDQwMDUsIDB4MDgwNCwgMHgxM2JjLCAweDIwOTEsIDB4ODAwMSwgMHgwODA0LCAweDEzYmEsCisJMHg3N2M0LCAweGQ3ZmMsIDB4MDEyOCwgMHgwODBjLCAweDFiMGEsIDB4MDEzOCwgMHgwODA0LCAweDEzYmMsCisJMHgwODBjLCAweDFhZmYsIDB4MDExMCwgMHgwODA0LCAweDEzYmMsIDB4NzdjNiwgMHgyMDQxLCAweDAwMjEsCisJMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDFiOTMsCisJMHgyMDA5LCAweDAwMTYsIDB4ZDdmYywgMHgxMTE4LCAweDIwNjEsIDB4NDY0MCwgMHgwMDE4LCAweDIwNjEsCisJMHg0NjgwLCAweGMxZmQsIDB4NjA2MywgMHgwMDAzLCAweDYwN2IsIDB4MDAwMCwgMHg2NzcyLCAweDYwN2YsCisJMHgwMDBmLCAweDc5MmEsIDB4NjFkMCwgMHhjMWM0LCAweDYxZDIsIDB4MDgwYywgMHgyMmFlLCAweDIwOTEsCisJMHg4MDAxLCAweDAwMDUsIDB4NzdjOCwgMHg3N2NhLCAweDc3YzQsIDB4NzdjNiwgMHhkN2ZjLCAweDAxMjgsCisJMHgwODBjLCAweDFiMGEsIDB4MDEzOCwgMHgwODA0LCAweDEzYmMsIDB4MDgwYywgMHgxYWZmLCAweDAxMTAsCisJMHgwODA0LCAweDEzYmMsIDB4YTdiYywgMHhmZjAwLCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweDAwMTcsCisJMHhkN2ZjLCAweDExMTgsIDB4MjA2MSwgMHg0NjQwLCAweDAwMTgsIDB4MjA2MSwgMHg0NjgwLCAweGMxZmQsCisJMHg2MDdiLCAweDAwMDAsIDB4NjA2MywgMHgwMDAyLCAweDY3NzIsIDB4NjA3ZiwgMHgwMDBmLCAweDc5MmEsCisJMHg2MWQwLCAweGMxYzQsIDB4NjFkMiwgMHgwODBjLCAweDIyYWUsIDB4MjA5MSwgMHg4MDAxLCAweDIwNDEsCisJMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMzAsIDB4MjA5MSwgMHg4MDAwLCAweDcwYzgsCisJMHhhMDA1LCAweDAxMTgsIDB4NjBkMCwgMHhjMGZkLCAweDYwZDIsIDB4MDgwYywgMHgxYjkzLCAweDcwYzgsCisJMHg2ODM2LCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDFkYzAsIDB4MjA5MSwgMHg4MDAxLCAweDAwMDUsCisJMHgyMDE5LCAweDAwMDAsIDB4NzJjOCwgMHhkMjg0LCAweDAxMjgsIDB4MDgwYywgMHgxYjBhLCAweDAxMzgsCisJMHgwODA0LCAweDEzYmMsIDB4MDgwYywgMHgxYWZmLCAweDAxMTAsIDB4MDgwNCwgMHgxM2JjLCAweDcyYzgsCisJMHg3MmNhLCAweDc4YWMsIDB4YTA4NCwgMHgwMDAzLCAweDE1MDgsIDB4MjAzOSwgMHgwMDAwLCAweGQyODQsCisJMHgwMTA4LCAweGM3ZmQsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMDgsCisJMHgwODBjLCAweDFiN2IsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDgsIDB4YzBkNCwgMHhhODBkLCAweDY5MGEsCisJMHgyMDkxLCAweDgwMDEsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MWQ5MCwgMHhhN2JjLCAweGZmMDAsCisJMHg4NzNmLCAweDg3MzgsIDB4ODczZiwgMHhhNzg0LCAweDBmMDAsIDB4MWQ1MCwgMHgyMDkxLCAweDgwMDAsCisJMHg3MmM4LCAweDIwNjksIDB4MDEwMCwgMHhkMjg0LCAweDExMTAsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDgsCisJMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODMwLCAweGQwYjQsIDB4MDFiMCwgMHg2ODRiLCAweDAwMDQsCisJMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhkMDk0LCAweDAxMTAsIDB4MWYwNCwgMHgxOGIyLCAweDY4NGIsCisJMHgwMDA5LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGQwODQsIDB4MDExMCwgMHgxZjA0LCAweDE4YmIsCisJMHgyMGE5LCAweDAwZmEsIDB4MWYwNCwgMHgxOGMyLCAweDIwNzksIDB4NDYwMCwgMHgyMDA5LCAweDAwMTgsCisJMHg3MmM4LCAweGQyODQsIDB4MTExOCwgMHgyMDYxLCAweDQ2NDAsIDB4MDAxOCwgMHgyMDYxLCAweDQ2ODAsCisJMHhjMWZkLCAweDYwN2IsIDB4MDAwMCwgMHg3OTJhLCAweDYwNjMsIDB4MDAwMSwgMHg2MDdmLCAweDAwMGYsCisJMHg2MGEzLCAweDAwMDAsIDB4NjBhNCwgMHg2MGFlLCAweDYwYjIsIDB4NjBkMCwgMHhkMGI0LCAweDAxNjAsCisJMHhjMGI0LCAweDYwZDIsIDB4MDBjNiwgMHg2MGI0LCAweGEwNjUsIDB4NjAwOCwgMHhjMGQ0LCAweDYwMGEsCisJMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHgwMGNlLCAweDYwZDAsIDB4YTA4NCwgMHg3ZWZmLCAweDYwZDIsCisJMHg3OGFjLCAweGMwOGQsIDB4NzhhZSwgMHg4M2ZmLCAweDAxMDgsIDB4MDAwNSwgMHg2ODFiLCAweDAwNTQsCisJMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHg3M2NjLCAweDA4MGMsIDB4MTg2YSwgMHg2OWVjLCAweDZhNDgsCisJMHhhMTg1LCAweDE4MDAsIDB4Njg0YSwgMHhhMTg1LCAweDAwNDAsIDB4NjhlZSwgMHg3M2NjLCAweDIwMjEsCisJMHgwMDA0LCAweDIwYTksIDB4MDlmZiwgMHgxZjA0LCAweDE5MGIsIDB4ODQyMSwgMHgxZGQwLCAweDgzMTksCisJMHgxZGIwLCAweDY5ZWUsIDB4NmE0YSwgMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHhkN2ZjLCAweDExMTgsCisJMHgyMDY5LCAweDQ2NDAsIDB4MDAxMCwgMHgyMDY5LCAweDQ2ODAsIDB4NzFjNCwgMHg3MWM2LCAweDY5MTYsCisJMHg4MWZmLCAweDExMTAsIDB4NjhhMywgMHgwMDAxLCAweDc4YWMsIDB4YzA4YywgMHg3OGFlLCAweGQwODQsCisJMHgxMTEwLCAweDA4MGMsIDB4MWM1YiwgMHgwMDA1LCAweDc1ZDgsIDB4NzRkYywgMHg3NWRhLCAweDc0ZGUsCisJMHgwMDEwLCAweGEwMmUsIDB4MjUyMCwgMHg3MWM0LCAweDczYzgsIDB4NzJjYywgMHg3MWM2LCAweDczY2EsCisJMHg3MmNlLCAweDIwNzksIDB4NDYwMCwgMHg3ZGRlLCAweDdjZGEsIDB4N2JkNiwgMHg3YWQyLCAweDA4MGMsCisJMHgxYjU4LCAweDA5MDQsIDB4MWEzZCwgMHgyMGE5LCAweDAwMDUsIDB4MjBhMSwgMHg0NjE0LCAweDIwOTEsCisJMHg4MDAwLCAweDQxYTEsIDB4MjA5MSwgMHg4MDAxLCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDFkMjQsCisJMHgwMTIwLCAweDA4MGMsIDB4MWI2MCwgMHgwODA0LCAweDFhM2QsIDB4NjAwNCwgMHhhMDhjLCAweDAwZmYsCisJMHhhMThlLCAweDAwMDksIDB4MTEyMCwgMHgwMDA2LCAweDA4MGMsIDB4MjA1ZiwgMHgwMDBlLCAweGEwODQsCisJMHhmZjAwLCAweDgwMDcsIDB4ODAwOSwgMHgwOTA0LCAweDE5ZTEsIDB4MDBjNiwgMHgyYzY4LCAweDA4MGMsCisJMHgxYjU4LCAweDA1YTgsIDB4MmMwMCwgMHg2ODllLCAweDgxMDksIDB4MWRjMCwgMHg2MDlmLCAweDAwMDAsCisJMHgwMGNlLCAweDAwYzYsIDB4N2RkYywgMHg3Y2Q4LCAweDdiZDQsIDB4N2FkMCwgMHhhMjkwLCAweDAwNDAsCisJMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHg3ZGRlLCAweDdjZGEsCisJMHg3YmQ2LCAweDdhZDIsIDB4MmM2OCwgMHg2ODljLCAweGEwNjUsIDB4MDkwNCwgMHgxOWUwLCAweDIwMDksCisJMHgwMDQwLCAweDA4MGMsIDB4MWQyNCwgMHgxNWEwLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDAyLCAweDExNjgsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDBhLCAweDExMjAsCisJMHgwMDE2LCAweDA4MGMsIDB4MjA1YywgMHgwMDFlLCAweDJkMDAsIDB4NjAwMiwgMHgwODk4LCAweDAwY2UsCisJMHgwMGM2LCAweDYwOWMsIDB4MDgwYywgMHgxYmQ0LCAweDAwY2UsIDB4NjA5ZiwgMHgwMDAwLCAweDA4MGMsCisJMHgxYTQxLCAweDIwMDksIDB4MDAxOCwgMHg2MDA4LCAweGMwY2QsIDB4NjAwYSwgMHg2MDA0LCAweDYwODYsCisJMHg3ODEwLCAweDAwMDYsIDB4ODRmZiwgMHgxMTEwLCAweDg1ZmYsIDB4MDExMCwgMHhjMGM1LCAweDc4MTIsCisJMHgwODBjLCAweDFiMTUsIDB4MDAwZSwgMHg3ODEyLCAweDA4MGMsIDB4MWI2MCwgMHgwODA0LCAweDFhM2QsCisJMHgwMGNlLCAweDAwYzYsIDB4NjA5YywgMHgwODBjLCAweDFiZDQsIDB4MDBjZSwgMHg2MDlmLCAweDAwMDAsCisJMHgwODBjLCAweDFhNDEsIDB4MjAwOSwgMHgwMDE4LCAweDYwODcsIDB4MDEwMywgMHg2MDFiLCAweDAwMDMsCisJMHg3ODEwLCAweDAwMDYsIDB4ODRmZiwgMHgxMTEwLCAweDg1ZmYsIDB4MDExMCwgMHhjMGM1LCAweDc4MTIsCisJMHgwODBjLCAweDFiMTUsIDB4MDAwZSwgMHg3ODEyLCAweDA4MGMsIDB4MWI2MCwgMHgwODA0LCAweDFhM2QsCisJMHgwMGNlLCAweDYxMTQsIDB4ZDFmYywgMHgwMTIwLCAweDA4MGMsIDB4MWIwYSwgMHgwMWYwLCAweDAwMTgsCisJMHgwODBjLCAweDFhZmYsIDB4MDFkMCwgMHgwODBjLCAweDFhNDEsIDB4MjAwOSwgMHgwMDE4LCAweDYwODcsCisJMHgwMTAzLCAweDYwMWIsIDB4MDAyMSwgMHg3ODEwLCAweDAwMDYsIDB4ODRmZiwgMHgxMTEwLCAweDg1ZmYsCisJMHgwMTEwLCAweGMwYzUsIDB4NzgxMiwgMHgwODBjLCAweDFiMTUsIDB4MDAwZSwgMHg3ODEyLCAweDA4MGMsCisJMHgxYjYwLCAweDIwMDEsIDB4NDAwNywgMHgwODA0LCAweDEzYmMsIDB4NzRjNCwgMHg3M2M4LCAweDcyY2MsCisJMHg2MDE0LCAweDIwOTEsIDB4ODAwMCwgMHgwMGU2LCAweDIwMDksIDB4MDAxMiwgMHhkMGZjLCAweDExMTgsCisJMHgyMDcxLCAweDQ2NDAsIDB4MDAxOCwgMHgyMDcxLCAweDQ2ODAsIDB4YzFmZCwgMHg3OTJhLCAweDcwNjMsCisJMHgwMDA1LCAweDcxZDAsIDB4YzFjNCwgMHg3MWQyLCAweDczNjYsIDB4NzI2YSwgMHg3NDZlLCAweDcwNzIsCisJMHg3MDc3LCAweDAwMDAsIDB4MmMwMCwgMHg3MDdhLCAweGEwMmUsIDB4MjUzMCwgMHg2MTFjLCAweGExODQsCisJMHgwMDYwLCAweDAxMTAsIDB4MDgwYywgMHgzZmMxLCAweDAwZWUsIDB4NjU5NiwgMHg2NWE2LCAweDY2OWEsCisJMHg2NmFhLCAweDYwYWYsIDB4MDAwMCwgMHg2MGIzLCAweDAwMDAsIDB4NjcxNCwgMHg2MDIzLCAweDAwMDAsCisJMHgwODBjLCAweDIyYWUsIDB4MjA5MSwgMHg4MDAxLCAweDAwMDUsIDB4NzBjMywgMHg0MDA1LCAweDA4MDQsCisJMHgxM2JkLCAweDIwYTksIDB4MDAwNSwgMHgyMDk5LCAweDQ2MTQsIDB4MjA5MSwgMHg4MDAwLCAweDUzMGEsCisJMHgyMDkxLCAweDgwMDEsIDB4MjEwMCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsCisJMHhhNWE5LCAweDAwMDAsIDB4MDAwNSwgMHg3MWM0LCAweDcwYzcsIDB4MDAwMCwgMHg3OTFlLCAweDA4MDQsCisJMHgxM2JhLCAweDcxYzQsIDB4NzFjNiwgMHgyMTY4LCAweDAwMTAsIDB4MjA2OSwgMHgxMDAwLCAweDY5MGMsCisJMHhhMDE2LCAweDJkMDQsIDB4YTIxMCwgMHg4ZDY4LCAweDgxMDksIDB4MWRkOCwgMHhhMjg1LCAweDAwMDAsCisJMHgxMTE4LCAweDcwYzMsIDB4NDAwMCwgMHgwMDEwLCAweDcwYzMsIDB4NDAwMywgMHg3MGNhLCAweDA4MDQsCisJMHgxM2JkLCAweDc5NjQsIDB4NzFjNiwgMHg3MWM0LCAweGExODIsIDB4MDAwMywgMHgxYTA0LCAweDEzYjMsCisJMHg3OTY2LCAweDA4MDQsIDB4MTNiYSwgMHg3OTY0LCAweDcxYzYsIDB4MDgwNCwgMHgxM2JhLCAweDc5MDAsCisJMHg3MWM2LCAweDcxYzQsIDB4NzkwMiwgMHgwODA0LCAweDEzYmEsIDB4NzkwMCwgMHg3MWM2LCAweDA4MDQsCisJMHgxM2JhLCAweDcwYzQsIDB4MjAxMSwgMHgwMDAwLCAweGEwOGMsIDB4MDAwZCwgMHgwMTYwLCAweDgxMGMsCisJMHgwMjMwLCAweDgyMTAsIDB4ODEwYywgMHg4MTBjLCAweDAyMTAsIDB4ODIxMCwgMHg4MTBjLCAweDgxZmYsCisJMHgxOTA0LCAweDEzYjQsIDB4ODIxMCwgMHg3YTBlLCAweGQyOGMsIDB4MDUzOCwgMHg3OTEwLCAweGMxY2QsCisJMHg3OTEyLCAweDIwMDksIDB4MDAyMSwgMHgyMDE5LCAweDAwMDMsIDB4ZDI4NCwgMHgwMWMwLCAweDgxMDgsCisJMHgyMDE5LCAweDAwNDEsIDB4MjAxMSwgMHg4ZTRlLCAweDIzMTIsIDB4MjAxOSwgMHgwMDQyLCAweDgyMTAsCisJMHgyMzEyLCAweDIwMTksIDB4MDA0MywgMHg4MjEwLCAweDIzMTIsIDB4MjAxOSwgMHgwMDQ2LCAweDgyMTAsCisJMHgyMzEyLCAweDIwMTksIDB4MDA0NywgMHg4MjEwLCAweDIzMTIsIDB4MjAxOSwgMHgwMDA2LCAweDIwMTEsCisJMHg4ZTUzLCAweDIxMTIsIDB4MjAxMSwgMHg4ZTczLCAweDIzMTIsIDB4NzkwNCwgMHg3ODA2LCAweDA4MDQsCisJMHgxM2I5LCAweDc4MDQsIDB4NzBjNiwgMHgwODA0LCAweDEzYmEsIDB4NzFjNCwgMHhkMWZjLCAweDExMTgsCisJMHgyMDExLCAweDRhYzAsIDB4MDAxMCwgMHgyMDExLCAweDRiNDAsIDB4ODEwNywgMHhhMDg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMjY4LCAweDIwMTEsIDB4MDAwMCwgMHg2ODE0LCAweGQwZmMsCisJMHgwMTEwLCAweGEyOTUsIDB4MDIwMCwgMHhkMGI0LCAweDAxMTAsIDB4YTI5NSwgMHgwMDAxLCAweDZiMGMsCisJMHg2ODAwLCAweDcwZGEsIDB4MDgwNCwgMHgxM2I3LCAweDc4MTQsIDB4ZDBmNCwgMHgwMTMwLCAweDIwMDEsCisJMHg0MDA3LCAweDcwZGIsIDB4MDAwMCwgMHhhMDA1LCAweDAwNDgsIDB4ZDBmYywgMHgwMTMwLCAweDIwMDEsCisJMHg0MDA3LCAweDcwZGIsIDB4MDAwMSwgMHhhMDA1LCAweDAwMDgsIDB4YTAwNiwgMHgwMDA1LCAweDc4MTQsCisJMHhkMGY0LCAweDAxMzAsIDB4MjAwMSwgMHg0MDA3LCAweDcwZGIsIDB4MDAwMCwgMHhhMDA1LCAweDAwMDgsCisJMHhhMDA2LCAweDAwMDUsIDB4NzgxNCwgMHhkMGZjLCAweDAxMzAsIDB4MjAwMSwgMHg0MDA3LCAweDcwZGIsCisJMHgwMDAxLCAweGEwMDUsIDB4MDAwOCwgMHhhMDA2LCAweDAwMDUsIDB4NzExMiwgMHg3MjFhLCAweDczMWUsCisJMHg3ODEwLCAweGQwYzQsIDB4MDExMCwgMHg3NDIyLCAweDc1MjYsIDB4YWM4MCwgMHgwMDAxLCAweDgxMDgsCisJMHg4MTBjLCAweDgxYTksIDB4ODA5OCwgMHgyMGExLCAweDAwMzAsIDB4NzAwMywgMHgwMDAwLCAweDYwODQsCisJMHgyMGEyLCAweDUzYTYsIDB4NzAwNywgMHgwMDAxLCAweDc5NzQsIDB4YTE4NCwgMHhmZjAwLCAweDAxNDAsCisJMHg4MTBmLCAweDgxMGMsIDB4ODEwYywgMHg4MDA0LCAweDgwMDQsIDB4ODAwNywgMHhhMTAwLCAweDAwMTgsCisJMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHg3OTdjLCAweGExMDgsIDB4N2E3OCwgMHhhMDA2LCAweGEyMTEsCisJMHg3ZDEwLCAweGQ1YzQsIDB4MDEyMCwgMHg3Yjg0LCAweGEzMTksIDB4N2M4MCwgMHhhNDIxLCAweDcwMDgsCisJMHhkMGZjLCAweDBkZTgsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwNiwgMHg3MTFhLCAweDcyMWUsCisJMHg3ZDEwLCAweGQ1YzQsIDB4MDExMCwgMHg3MzIyLCAweDc0MjYsIDB4YTA4NCwgMHgwMWUwLCAweDAwMDUsCisJMHg3ODQ4LCAweGEwNjUsIDB4MDEyMCwgMHgyYzA0LCAweDc4NGEsIDB4MjA2MywgMHgwMDAwLCAweDAwMDUsCisJMHgwMGY2LCAweDIwNzksIDB4NDYwMCwgMHg3ODQ4LCAweDIwNjIsIDB4MmMwMCwgMHhhMDA1LCAweDExMTAsCisJMHgwODBjLCAweDI1NGMsIDB4Nzg0YSwgMHgwMGZlLCAweDAwMDUsIDB4MjAxMSwgMHg5MDAwLCAweDdhNGEsCisJMHg3YmM0LCAweDgzMTksIDB4MDEyOCwgMHhhMjgwLCAweDAwMzIsIDB4MjAxMiwgMHgyMDEwLCAweDBjYzgsCisJMHgyMDEzLCAweDAwMDAsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4ZDdmYywgMHgxMTE4LCAweDIwMTEsCisJMHg0YmMwLCAweDAwMTAsIDB4MjAxMSwgMHg2YmMwLCAweGE3ODQsIDB4MGYwMCwgMHg4MDBiLCAweGE3ODQsCisJMHgwMDFmLCAweDAxMjAsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LCAweGEyNjgsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwYzM5LCAweDI5MDAsIDB4NjgyYSwgMHgyYTAwLCAweDY4MmUsCisJMHg2ODA4LCAweGEwODQsIDB4ZjllZiwgMHhhODBkLCAweDY5MGEsIDB4MDBlNiwgMHhkN2ZjLCAweDExMjgsCisJMHgyMDA5LCAweDQ2NTIsIDB4MjA3MSwgMHg0NjQwLCAweDAwMjAsIDB4MjAwOSwgMHg0NjkyLCAweDIwNzEsCisJMHg0NjgwLCAweDIxMGMsIDB4NjgwNCwgMHhhMDA1LCAweDAxNDgsIDB4YTExNiwgMHgxMTM4LCAweDIwNjAsCisJMHg2MDAwLCAweDY4MDYsIDB4MDAxNiwgMHgyMDBiLCAweDAwMDAsIDB4MDAxOCwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDE2LCAweDY4MDQsIDB4YTA2NSwgMHgwMTc4LCAweDYwMDAsIDB4NjgwNiwgMHgwNDIxLCAweDA4MGMsCisJMHgxZDk1LCAweDY4MTAsIDB4NzkwOCwgMHg4MTA5LCAweDc5MGEsIDB4ODAwMSwgMHg2ODEyLCAweDFkODgsCisJMHg3OTEwLCAweGMxYTUsIDB4NzkxMiwgMHgwMDFlLCAweDY5MDIsIDB4NjkwNiwgMHgyZDAwLCAweDIwNjAsCisJMHgwODBjLCAweDI2OTMsIDB4MDBlZSwgMHgwMDA1LCAweGEwNjUsIDB4MDE2MCwgMHgyMDA4LCAweDYwOWMsCisJMHhhMDA1LCAweDAxMjgsIDB4MjA2MiwgMHg2MDlmLCAweDAwMDAsIDB4YTA2NSwgMHgwY2MwLCAweDc4NDgsCisJMHg3OTRhLCAweDIwNjIsIDB4MDAwNSwgMHg2MDA3LCAweDAxMDMsIDB4NjA4ZiwgMHgwMDAwLCAweDIwYTksCisJMHgwMDFjLCAweGFjODAsIDB4MDAwNSwgMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LCAweDY4MjgsCisJMHg2MDFhLCAweDY4MmMsIDB4NjAyMiwgMHgwMDA1LCAweDAwZTYsIDB4ZDdmYywgMHgxMTI4LCAweDIwNzEsCisJMHg0NjQwLCAweDIwMzEsIDB4NDZjMCwgMHgwMDIwLCAweDIwNzEsIDB4NDY4MCwgMHgyMDMxLCAweDQ4YzAsCisJMHg3MDRjLCAweGEwOGMsIDB4MDIwMCwgMHgxMTI4LCAweGE2MDgsIDB4MmQwYSwgMHg4MDAwLCAweDcwNGUsCisJMHhhMDA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweGQ3ZmMsIDB4MTExOCwgMHgyMDc5LCAweDQ2NDAsCisJMHgwMDEwLCAweDIwNzksIDB4NDY4MCwgMHgwODBjLCAweDFiN2IsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDQsCisJMHg3ODBhLCAweGEwNjUsIDB4MDVmMCwgMHgwMDMwLCAweDJjMDAsIDB4NzgwYSwgMHgyMDYwLCAweDYwMDAsCisJMHhhMDY1LCAweDA1YjgsIDB4NjAxMCwgMHhhMzA2LCAweDFkYjgsIDB4NjAwYywgMHhhMjA2LCAweDFkYTAsCisJMHgyYzI4LCAweDc4NDgsIDB4YWMwNiwgMHgxMTA4LCAweDA0NDgsIDB4NjgwNCwgMHhhYzA2LCAweDExNDAsCisJMHg2MDAwLCAweDIwNjAsIDB4NjgwNiwgMHhhMDA1LCAweDExMTgsIDB4NjgwMywgMHgwMDAwLCAweDAwNDgsCisJMHg2NDAwLCAweDc4MDgsIDB4MjA2MCwgMHg2NDAyLCAweGE0ODYsIDB4MDAwMCwgMHgxMTEwLCAweDJjMDAsCisJMHg2ODAyLCAweDI1NjAsIDB4MDgwYywgMHgxYmUzLCAweDYwMWIsIDB4MDAwNSwgMHg2MDIzLCAweDAwMjAsCisJMHgwMGZlLCAweDA4MGMsIDB4MWQ5NSwgMHgwMGY2LCAweDc5MDgsIDB4ODEwOSwgMHg3OTBhLCAweDY4MTAsCisJMHg4MDAxLCAweDY4MTIsIDB4MTExOCwgMHg3ODEwLCAweGMwYTUsIDB4NzgxMiwgMHgyMDAxLCAweGZmZmYsCisJMHhhMDA1LCAweDAwZmUsIDB4MDAwNSwgMHgwMDc2LCAweDI3MDAsIDB4MjAzOSwgMHgwMDAwLCAweGQwZmMsCisJMHgwMTA4LCAweGM3ZmQsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMDgsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgxYjkzLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDFkZDAsCisJMHhhN2JjLCAweGZmMDAsIDB4ODczZiwgMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLCAweDFkOTAsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3ZSwgMHgwMDA1LCAweDc4NmMsIDB4MjAwOSwgMHg4ZTc0LCAweDIxMGMsCisJMHhhMTBkLCAweDAxMTgsIDB4YTA2NSwgMHgwODA0LCAweDIwN2EsIDB4MjA2MSwgMHgwMDAwLCAweDYwMTgsCisJMHhkMDg0LCAweDExYjgsIDB4NzgxMCwgMHhkMDhjLCAweDAxMzAsIDB4YzA4YywgMHg3ODEyLCAweGM3ZmMsCisJMHgyMDY5LCAweDQ2NDAsIDB4MDAyOCwgMHhjMDhkLCAweDc4MTIsIDB4MjA2OSwgMHg0NjgwLCAweGM3ZmQsCisJMHgyMDkxLCAweDgwMDAsIDB4NjgxYywgMHg2ODFmLCAweDAwMDAsIDB4MjA5MSwgMHg4MDAxLCAweGEwMDUsCisJMHgxMTA4LCAweDAwMDUsIDB4YTA4YywgMHhmZmYwLCAweDAxMTAsIDB4MDgwYywgMHgyNTRjLCAweDAwMDIsCisJMHgxY2I4LCAweDFjYmIsIDB4MWNjMSwgMHgxY2M1LCAweDFjYjksIDB4MWNjOSwgMHgxY2I5LCAweDFjYjksCisJMHgxY2I5LCAweDFjY2YsIDB4MWNmYiwgMHgxY2ZlLCAweDFkMDMsIDB4MWQwYywgMHgxY2I5LCAweDFjYjksCisJMHgwMDA1LCAweDA4MGMsIDB4MjU0YywgMHgwODBjLCAweDFjNWIsIDB4MjAwMSwgMHg4MDAxLCAweDA4MDQsCisJMHgxZDE1LCAweDIwMDEsIDB4ODAwMywgMHgwODA0LCAweDFkMTUsIDB4MjAwMSwgMHg4MDA0LCAweDA4MDQsCisJMHgxZDE1LCAweDA4MGMsIDB4MWM1YiwgMHgyMDAxLCAweDgwMDYsIDB4MDgwNCwgMHgxZDE1LCAweDIwOTEsCisJMHg4MDAwLCAweDAwNzYsIDB4ZDdmYywgMHgxMTI4LCAweDIwNjksIDB4NDY0MCwgMHgyMDM5LCAweDAwMDksCisJMHgwMDIwLCAweDIwNjksIDB4NDY4MCwgMHgyMDM5LCAweDAwMDksIDB4NjgwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMTI4LCAweDAwMGUsIDB4NmYxZSwgMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHg2ODcwLCAweDAwN2UsCisJMHhhMGJjLCAweGZmMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMTAsCisJMHgwODBjLCAweDFiOTMsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MWRkMCwgMHgyMDkxLCAweDgwMDEsCisJMHgyMDAxLCAweDgwMGEsIDB4MDBkMCwgMHgyMDAxLCAweDgwMGMsIDB4MDBiOCwgMHgwODBjLCAweDFjNWIsCisJMHgyMDAxLCAweDgwMGQsIDB4MDA5MCwgMHhkN2ZjLCAweDAxMTAsIDB4NzhlNCwgMHgwMDA4LCAweDc4ZTAsCisJMHg3MGM2LCAweDIwMDEsIDB4ODAwZSwgMHgwMDQ4LCAweGQ3ZmMsIDB4MDExMCwgMHg3OGVjLCAweDAwMDgsCisJMHg3OGU4LCAweDcwYzYsIDB4MjAwMSwgMHg4MDBmLCAweDAwMDAsIDB4NzBjMiwgMHhkN2ZjLCAweDExMTgsCisJMHg3MGRiLCAweDAwMDAsIDB4MDAxMCwgMHg3MGRiLCAweDAwMDEsIDB4MjA2MSwgMHgwMDAwLCAweDYwMWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDA1LCAweGFjODAsIDB4MDAwMSwgMHg4MWZmLCAweDA1MTgsCisJMHgyMDk5LCAweDAwMzAsIDB4MjBhMCwgMHg3MDBjLCAweGEwODQsIDB4MDdmZiwgMHgwMTAwLCAweDcwMTgsCisJMHgwMDA2LCAweDcwMWMsIDB4MDAwNiwgMHg3MDIwLCAweDAwMDYsIDB4NzAyNCwgMHgwMDA2LCAweDcxMTIsCisJMHg4MWFjLCAweDcyMWEsIDB4NzMxZSwgMHg3NDIyLCAweDc1MjYsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsCisJMHgwMDAxLCAweDcwMDgsIDB4ODAwYiwgMHgxZWU4LCAweDcwMDcsIDB4MDAwMiwgMHhhMDhjLCAweDAxZTAsCisJMHgxMTEwLCAweDUzYTUsIDB4YTAwNiwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDA0LCAweDAwMGUsCisJMHg3MDI2LCAweDAwMGUsIDB4NzAyMiwgMHgwMDBlLCAweDcwMWUsIDB4MDAwZSwgMHg3MDFhLCAweDAwMDUsCisJMHgyMDExLCAweDAwMjAsIDB4MjAwOSwgMHgwMDEwLCAweDZiMGEsIDB4NmMwZSwgMHg2ODFmLCAweDAyMDEsCisJMHg2ODAzLCAweGZkMjAsIDB4NjgwNywgMHgwMDM4LCAweDZhMWEsIDB4MmQwMCwgMHhhMGU4LCAweDAwMDgsCisJMHhhMjkwLCAweDAwMDQsIDB4ODEwOSwgMHgxZDgwLCAweDAwMDUsIDB4NzBlYywgMHhkMGRjLCAweDE1MjAsCisJMHgyMDI5LCAweDAwMDEsIDB4NzgxNCwgMHhkMGNjLCAweDExNjAsIDB4NzBlYywgMHhkMGU0LCAweDIwMTksCisJMHgwYzBhLCAweDIwMjEsIDB4MDAwYSwgMHgxMTIwLCAweDIwMTksIDB4MGMwYywgMHgyMDIxLCAweDAwMGMsCisJMHgwMDcwLCAweDcwZWMsIDB4ZDBlNCwgMHgxMTI4LCAweDIwMTksIDB4MTgwYywgMHgyMDIxLCAweDAwMGMsCisJMHgwMDMwLCAweDIwMTksIDB4MTgwOSwgMHgyMDIxLCAweDAwMDksIDB4YTVhZCwgMHgwMjAwLCAweDZiMGEsCisJMHg2YzBlLCAweDZkMWUsIDB4NjgwNywgMHgwMDM4LCAweDAwMDUsIDB4NjAwNCwgMHg2MDg2LCAweDJjMDgsCisJMHgyMDYzLCAweDAwMDAsIDB4Nzg2OCwgMHhhMDA1LCAweDc5NmEsIDB4MDExMCwgMHgyYzAyLCAweDAwMDgsCisJMHg3OTZlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDQ2MDAsIDB4Njg4NywgMHgwMTAzLCAweDJkMDgsCisJMHgyMDZiLCAweDAwMDAsIDB4NjA2OCwgMHhhMDA1LCAweDYxNmEsIDB4MDExMCwgMHgyZDAyLCAweDAwMDgsCisJMHg2MTZlLCAweDAwY2UsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDAsIDB4MmMwNCwgMHg3ODZlLCAweGEwMDUsCisJMHgxMTA4LCAweDc4NmEsIDB4MjA5MSwgMHg4MDAxLCAweDYwOWMsIDB4YTAwNSwgMHgwMTg4LCAweDAwYzYsCisJMHgyMDYwLCAweDIwMDgsIDB4NjA5YywgMHhhMDA1LCAweDAxMzgsIDB4MjA2MiwgMHg2MDlmLCAweDAwMDAsCisJMHhhMDY1LCAweDYwOWMsIDB4YTAwNSwgMHgxZGM4LCAweDc4NDgsIDB4Nzk0YSwgMHgyMDYyLCAweDAwY2UsCisJMHg3ODQ4LCAweDIwNjIsIDB4NjA5ZiwgMHgwMDAwLCAweGFjODUsIDB4MDAwMCwgMHgxMTEwLCAweDA4MGMsCisJMHgyNTRjLCAweDc4NGEsIDB4MDAwNSwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNiwgMHg4MDA0LCAweDgwODYsCisJMHg4MThlLCAweDEyMDgsIDB4YTIwMCwgMHgxZjA0LCAweDFkZGYsIDB4ODA4NiwgMHg4MThlLCAweDAwMDUsCisJMHgwMTU2LCAweDIwYTksIDB4MDAxMCwgMHhhMDA1LCAweDAxYjgsIDB4YTExYSwgMHgxMmE4LCAweDgyMTMsCisJMHg4MThkLCAweDAyMjgsIDB4YTExYSwgMHgxMjIwLCAweDFmMDQsIDB4MWRlZiwgMHgwMDI4LCAweGExMWEsCisJMHgyMzA4LCAweDgyMTAsIDB4MWYwNCwgMHgxZGVmLCAweDAwMDYsIDB4MzIwMCwgMHhhMDg0LCAweGVmZmYsCisJMHgyMDgwLCAweDAwMGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAwMDYsIDB4MzIwMCwgMHhhMDg1LCAweDEwMDAsCisJMHgwY2I4LCAweDdkNzQsIDB4NzBkMCwgMHhhNTA2LCAweDA5MDQsIDB4MWViZCwgMHg3ODEwLCAweDIwNTAsCisJMHgwODBjLCAweDFiNTgsIDB4MDkwNCwgMHgxZWJkLCAweGEwNDYsIDB4Nzk3MCwgMHgyNTAwLCAweDgwMDAsCisJMHhhMTEyLCAweDIwMDksIDB4MDA0MCwgMHgxMjA4LCAweDAwMzAsIDB4NzJkMCwgMHhhMjA2LCAweDAxMTgsCisJMHg4ODQwLCAweDIwMDksIDB4MDA4MCwgMHgwMGM2LCAweDcxMTIsIDB4NzAwNywgMHgwMDAxLCAweDIwOTksCisJMHgwMDMwLCAweDIwYTksIDB4MDAyMCwgMHhhYzgwLCAweDAwMDEsIDB4MjBhMCwgMHgyMDYxLCAweDAwMDAsCisJMHg4OGZmLCAweDAxMTAsIDB4MDgwYywgMHgxYjU4LCAweDcwMDgsIDB4ZDBmYywgMHgwZGU4LCAweDcwMDcsCisJMHgwMDAyLCAweDIwOTEsIDB4ODAwMSwgMHhhMDhjLCAweDAxZTAsIDB4MTUzOCwgMHg1M2E1LCAweDhjZmYsCisJMHgxMTIwLCAweDg4ZmYsIDB4MDkwNCwgMHgxZWFhLCAweDAwNTAsIDB4MmMwMCwgMHg3ODhlLCAweDIwYTksCisJMHgwMDIwLCAweGFjODAsIDB4MDAwMSwgMHgyMGEwLCAweDUzYTUsIDB4MDgwNCwgMHgxZWFhLCAweGEwNDYsCisJMHg3MjE4LCAweDczMWMsIDB4ZGFjNCwgMHgwMTEwLCAweDc0MjAsIDB4NzUyNCwgMHhhMjkyLCAweDAwNDAsCisJMHhhMzliLCAweDAwMDAsIDB4YTRhMywgMHgwMDAwLCAweGE1YWIsIDB4MDAwMCwgMHg3MjFhLCAweDczMWUsCisJMHhkYWM0LCAweDAxMTgsIDB4NzQyMiwgMHg3NTI2LCAweGEwMDYsIDB4NzAwNywgMHgwMDA0LCAweDA5MDQsCisJMHgxZWFhLCAweDhjZmYsIDB4MDExMCwgMHgwODBjLCAweDFiNjAsIDB4MDBjZSwgMHgwODBjLCAweDFiNjAsCisJMHhhMDQ2LCAweDc4ODgsIDB4ODAwMCwgMHg3ODhhLCAweGEwODYsIDB4MDAwMiwgMHgwMWMwLCAweDdhN2MsCisJMHg3Yjc4LCAweGRhYzQsIDB4MDExMCwgMHg3Yzg0LCAweDdkODAsIDB4Nzk3NCwgMHg4MTA3LCAweDgwMDQsCisJMHg4MDA0LCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsCisJMHg3MjFhLCAweDczMWUsIDB4ZGFjNCwgMHgwNTg4LCAweDc0MjIsIDB4NzUyNiwgMHgwNDcwLCAweDYwMTQsCisJMHhkMGZjLCAweDExMTgsIDB4MjA2OSwgMHg0NjQwLCAweDAwMTAsIDB4MjA2OSwgMHg0NjgwLCAweDIwOTEsCisJMHg4MDAwLCAweDY4MWYsIDB4MDAwMiwgMHg4OGZmLCAweDAxMjAsIDB4YTA0NiwgMHg3ODhjLCAweDIwNjAsCisJMHgwYzcwLCAweDc4OGIsIDB4MDAwMCwgMHg3OGFjLCAweGEwODUsIDB4MDAwMywgMHg3OGFlLCAweDIwOTEsCisJMHg4MDAxLCAweDAwOTgsIDB4MDBjZSwgMHg3ODhiLCAweDAwMDAsIDB4MDgwYywgMHgyMDM1LCAweDYwMDQsCisJMHhhMDg0LCAweDAwMGYsIDB4MDA1OSwgMHg4OGZmLCAweDAxMzAsIDB4Nzg4YywgMHgyMDYwLCAweDYwMDQsCisJMHhhMDg0LCAweDAwMGYsIDB4MDAxOSwgMHgwODA0LCAweDFlMDksIDB4MDAwNSwgMHgwMDAyLCAweDFlY2YsCisJMHgxZWVhLCAweDFmMDMsIDB4MWVjZiwgMHgxZjEwLCAweDFlZTAsIDB4MWVjZiwgMHgxZWNmLCAweDFlY2YsCisJMHgxZWU4LCAweDFmMDEsIDB4MWVjZiwgMHgxZWNmLCAweDFlY2YsIDB4MWVjZiwgMHgxZWNmLCAweDIwMzksCisJMHgwNDAwLCAweDc4YmMsIDB4YTcwNSwgMHg3OGJlLCAweDYwMDgsIDB4YTcwNSwgMHg2MDBhLCAweDA4MGMsCisJMHgxZjRjLCAweDYwOWMsIDB4NzhiYSwgMHg2MDlmLCAweDAwMDAsIDB4MDgwYywgMHgyMDIxLCAweDAwMDUsCisJMHg3OGJjLCAweGQwYzQsIDB4MDEwOCwgMHgwYzU4LCAweDYwMWMsIDB4YzBiZCwgMHg2MDFlLCAweDAwMzAsCisJMHgwODBjLCAweDIwNWYsIDB4NzhiYywgMHhkMGM0LCAweDAxMDgsIDB4MGMwOCwgMHg3OGJmLCAweDAwMDAsCisJMHg2MDA0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDc4YjIsIDB4ODAwMSwgMHgwMTM4LCAweDA4MGMsCisJMHgxZjRjLCAweDAxMjAsIDB4NzhiYywgMHhjMGM1LCAweDc4YmUsIDB4MDAxMCwgMHgwODA0LCAweDFmNjcsCisJMHgwMDA1LCAweDA4MGMsIDB4MjA1YywgMHg3OGJjLCAweGEwOGMsIDB4MGUwMCwgMHgxMTEwLCAweGQwYzQsCisJMHgxMTA4LCAweDA4MjgsIDB4MDgwYywgMHgxZjRjLCAweDExMTAsIDB4MDgwNCwgMHgxZjY3LCAweDAwMDUsCisJMHg3OGJjLCAweGQwYzQsIDB4MDExMCwgMHgwODA0LCAweDFlY2YsIDB4NzhiZiwgMHgwMDAwLCAweDY3MTQsCisJMHgyMDExLCAweDAwMDEsIDB4MjJhOCwgMHg2MDE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAxODgsCisJMHhhN2JjLCAweGZmMDAsIDB4MjBhOSwgMHgwMDIwLCAweGEwOGUsIDB4MDAwMSwgMHgwMTUwLCAweGE3YmMsCisJMHg4MDAwLCAweDIwMTEsIDB4MDAwMiwgMHgyMGE5LCAweDAxMDAsIDB4YTA4ZSwgMHgwMDAyLCAweDAxMDgsCisJMHgwMGMwLCAweDA4MGMsIDB4MWI3YiwgMHgyZDAwLCAweDIwOTEsIDB4ODAwMCwgMHg2ODJiLCAweDAwMDAsCisJMHg2ODJmLCAweDAwMDAsIDB4NjgwOCwgMHhhMDg0LCAweGZmZGUsIDB4NjgwYSwgMHhhZGU4LCAweDAwMTAsCisJMHgyMDkxLCAweDgwMDEsIDB4MWYwNCwgMHgxZjM0LCAweDgyMTEsIDB4MDExOCwgMHgyMGE5LCAweDAxMDAsCisJMHgwYzU4LCAweDA4MGMsIDB4MWI2MCwgMHgwMDA1LCAweDYwOWYsIDB4MDAwMCwgMHg3OGI0LCAweGEwNmQsCisJMHgyYzAwLCAweDc4YjYsIDB4MTExMCwgMHg3OGJhLCAweDAwMzgsIDB4Njg5ZSwgMHgyZDAwLCAweDYwMDIsCisJMHg3OGI4LCAweGFkMDYsIDB4MTEwOCwgMHg2MDAyLCAweDc4YjAsIDB4ODAwMSwgMHg3OGIyLCAweDExMzAsCisJMHg3OGJjLCAweGMwYzQsIDB4NzhiZSwgMHg3OGI4LCAweDIwNjAsIDB4YTAwNiwgMHgwMDA1LCAweDAwZTYsCisJMHhhMDJlLCAweDI1MzAsIDB4N2RiYSwgMHg3ZGI2LCAweDY1YWUsIDB4NjViMiwgMHg2MDFjLCAweDYwYTIsCisJMHgyMDQ4LCAweGE5ODQsIDB4ZTFmZiwgMHg2MDFlLCAweGE5ODQsIDB4MDA2MCwgMHgwMTEwLCAweDA4MGMsCisJMHgzZmMxLCAweDY1OTYsIDB4NjVhNiwgMHg2NjlhLCAweDY2YWEsIDB4NjcxNCwgMHgyMDcxLCAweDQ2ODAsCisJMHhkN2ZjLCAweDExMTAsIDB4MjA3MSwgMHg0NjQwLCAweGE3ODQsIDB4MGYwMCwgMHg4MDBiLCAweGE3ODQsCisJMHgwMDFmLCAweDAxMjAsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LCAweDcxYzAsCisJMHhhMTY4LCAweDI3MDAsIDB4ODAwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsCisJMHg3MWM0LCAweGExMDAsIDB4NjBjMiwgMHgyMDkxLCAweDgwMDAsIDB4NzgxNCwgMHhkMGM0LCAweDAxMzgsCisJMHhkN2ZjLCAweDExMTgsIDB4ZDBmNCwgMHgxMTQwLCAweDAwMTAsIDB4ZDBmYywgMHgxMTI4LCAweDZlMDgsCisJMHhkNjg0LCAweDAxZjAsIDB4ZDlmYywgMHgxMWUwLCAweDIwOTEsIDB4ODAwMSwgMHgwODBjLCAweDFiZTMsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgxZDk1LCAweDIwOTEsIDB4ODAwMSwgMHg3ODE0LCAweGQwYzQsCisJMHgwOTA0LCAweDIwMWYsIDB4ZDdmYywgMHgxMTIwLCAweGQwZjQsIDB4MTEzMCwgMHgwODA0LCAweDIwMWYsCisJMHhkMGZjLCAweDExMTAsIDB4MDgwNCwgMHgyMDFmLCAweDYwMWIsIDB4MDAyMSwgMHgwODA0LCAweDIwMWYsCisJMHg2MDI0LCAweGEwOTYsIDB4MDAwMSwgMHgxMTEwLCAweDgwMDAsIDB4NjAyNiwgMHg2YTEwLCAweDY4MTQsCisJMHhhMjAyLCAweDAyNjgsIDB4MDE2MCwgMHgyMDkxLCAweDgwMDEsIDB4MjAzOSwgMHgwMjAwLCAweDYwOWMsCisJMHg3OGJhLCAweDYwOWYsIDB4MDAwMCwgMHgwODBjLCAweDIwMjEsIDB4MDgwNCwgMHgyMDFmLCAweDJjMDgsCisJMHhkOWZjLCAweDAxZjAsIDB4NjgwMCwgMHhhMDY1LCAweDAxZDgsIDB4NmEwNCwgMHg3MDAwLCAweGEwODQsCisJMHgwMDAyLCAweDAxNjgsIDB4NzA0OCwgMHhhMjA2LCAweDExNTAsIDB4NmIwNCwgMHgyMTYwLCAweDIzMDQsCisJMHg2MDAyLCAweGEwMDUsIDB4MTEwOCwgMHg2OTAyLCAweDIyNjAsIDB4NjEwMiwgMHgwMDk4LCAweDJkMDAsCisJMHgyMDYwLCAweDA4MGMsIDB4MjY5MywgMHg2ZTA4LCAweDIxNjAsIDB4NjIwMiwgMHg2OTA2LCAweDAwNTAsCisJMHg2ODAwLCAweDY5MDIsIDB4YTA2NSwgMHgwMTEwLCAweDYxMDIsIDB4MDAwOCwgMHg2OTA2LCAweDIxNjAsCisJMHg2MDAzLCAweDAwMDAsIDB4MjE2MCwgMHhkOWZjLCAweDAxMTgsIDB4YTZiNCwgMHhmZmZjLCAweDZlMGEsCisJMHg2ODEwLCAweDdkMDgsIDB4ODUyOCwgMHg3ZDBhLCAweDgwMDAsIDB4NjgxMiwgMHgyMDkxLCAweDgwMDEsCisJMHhkNmI0LCAweDAxMjgsIDB4YTZiNiwgMHgwMDQwLCAweDZlMGEsIDB4MDgwYywgMHgxYmY0LCAweDAwZWUsCisJMHgwMDA1LCAweDYwMDgsIDB4YTcwNSwgMHg2MDBhLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDFkOTUsCisJMHgyMDkxLCAweDgwMDEsIDB4NzhiOCwgMHhhMDY1LCAweDAxMjgsIDB4NjA5YywgMHg3OGJhLCAweDYwOWYsCisJMHgwMDAwLCAweDBjNzgsIDB4NzhiNiwgMHg3OGJhLCAweDAwMDUsIDB4Nzk3MCwgMHg3ODc0LCAweDI4MTgsCisJMHhkMzg0LCAweDAxMTgsIDB4ODAwMCwgMHhhMTEyLCAweDAyMjAsIDB4ODAwMCwgMHhhMTEyLCAweDEyNzgsCisJMHhjMzg0LCAweDdhN2MsIDB4NzIxYSwgMHg3YTc4LCAweDcyMWUsIDB4ZGFjNCwgMHgwMTIwLCAweDdhODQsCisJMHg3MjIyLCAweDdhODAsIDB4NzIyNiwgMHhhMDA2LCAweGQzODQsIDB4MDEwOCwgMHg4MDAwLCAweDc4NzYsCisJMHg3MGQyLCAweDc4MWMsIDB4YTAwNSwgMHgwMTM4LCAweDgwMDEsIDB4NzgxZSwgMHgxMTIwLCAweDBlMDQsCisJMHgyMDViLCAweDIwOTEsIDB4NDA4MCwgMHgwMDA1LCAweDIwMzksIDB4MjA3MSwgMHgwMDEwLCAweDIwMzksCisJMHgyMDc3LCAweDI3MDQsIDB4YTAwNSwgMHgwMTYwLCAweGFjMDAsIDB4MjA2OCwgMHg2OTA4LCAweDY4MTAsCisJMHg2OTEyLCAweDY4MGEsIDB4NjkwYywgMHg2ODE0LCAweDY5MTYsIDB4NjgwZSwgMHg4NzM4LCAweDBjODgsCisJMHgwMDA1LCAweDAwMDMsIDB4MDAwOSwgMHgwMDBmLCAweDAwMTUsIDB4MDAxYiwgMHgwMDAwLCAweDAwMTUsCisJMHgwMDFiLCAweDAwMDAsIDB4MjA0MSwgMHgwMDAwLCAweDc4MGMsIDB4MDAwMiwgMHgyMjIzLCAweDIxZmUsCisJMHgyMDgyLCAweDIwZjIsIDB4MjAzOSwgMHg4ZTc0LCAweDI3MzQsIDB4N2QxMCwgMHgwMGMwLCAweDYwODQsCisJMHhhMDg2LCAweDAxMDMsIDB4MTkwNCwgMHgyMGRjLCAweDYxMTQsIDB4NjAxOCwgMHhhMTA1LCAweDAxMjAsCisJMHg4NmZmLCAweDExZDgsIDB4MDgwNCwgMHgyMGRjLCAweDg2MDMsIDB4YTA4MCwgMHg4ZTU1LCAweDYyMGMsCisJMHgyMjAyLCAweDgwMDAsIDB4NjIxMCwgMHgyMjAyLCAweDA4MGMsIDB4MWRiMywgMHg4NjMwLCAweGE2OGUsCisJMHgwMDBmLCAweDA5MDQsIDB4MjE1ZCwgMHg3ODZjLCAweGEwNjUsIDB4MWQwOCwgMHg3ODA4LCAweGE2MDIsCisJMHgxMjIwLCAweGQ1YWMsIDB4MTExMCwgMHgyNjNhLCAweDAwMDUsIDB4YTY4MiwgMHgwMDAzLCAweDFhMDQsCisJMHgyMTVkLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAwMDAsIDB4NjgxOCwgMHhkMDg0LCAweDExZjgsCisJMHgyMDExLCAweDhlNTUsIDB4MjIwNCwgMHg3MGM2LCAweDgyMTAsIDB4MjIwNCwgMHg3MGNhLCAweGQ2ODQsCisJMHgxMTMwLCAweDgyMTAsIDB4MjIwNCwgMHg3MGRhLCAweDgyMTAsIDB4MjIwNCwgMHg3MGRlLCAweGE2ODUsCisJMHg4MDIwLCAweDcwYzIsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3ODEwLCAweGEwODQsCisJMHhmZmNmLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLCAweDIwM2IsIDB4MDAwMCwgMHgwMDA1LCAweDc4MTAsCisJMHhjMGFkLCAweDc4MTIsIDB4MDgwNCwgMHgyMTVkLCAweDI2M2EsIDB4MDgwYywgMHgyMjI5LCAweDE5MDQsCisJMHgyMjQ1LCAweDc4NmMsIDB4YTA2NSwgMHgxOTA0LCAweDIwODcsIDB4MjA5MSwgMHg4MDAwLCAweDc4MTAsCisJMHhhMDg0LCAweGZmY2YsIDB4ODZmZiwgMHgwMTA4LCAweGMwYWQsIDB4NzgxMiwgMHgyMDkxLCAweDgwMDEsCisJMHgwODA0LCAweDIyNDUsIDB4MjAzOSwgMHg4ZTc0LCAweDI3MzQsIDB4N2QxMCwgMHgwMGEwLCAweDYwODQsCisJMHhhMDg2LCAweDAxMDMsIDB4MTkwNCwgMHgyMTQ3LCAweDYxMTQsIDB4NjAxOCwgMHhhMTA1LCAweDAxMjAsCisJMHg4NmZmLCAweDExYjgsIDB4MDgwNCwgMHgyMTQ3LCAweGE2ODAsIDB4OGU1NSwgMHg2MjBjLCAweDIyMDIsCisJMHgwODBjLCAweDFkYjMsIDB4ODYzMCwgMHhhNjhlLCAweDAwMWUsIDB4MDkwNCwgMHgyMTVkLCAweDc4NmMsCisJMHhhMDY1LCAweDFkMjgsIDB4NzgwOCwgMHhhNjAyLCAweDEyMjAsIDB4ZDVhYywgMHgxMTEwLCAweDI2M2EsCisJMHgwMDA1LCAweGE2ODIsIDB4MDAwNiwgMHgxYTA0LCAweDIxNWQsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksCisJMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgxMWY4LCAweDIwMTEsIDB4OGU1NSwgMHgyMDA5LCAweDhlNGUsCisJMHgyNmE4LCAweDIxMWMsIDB4MjIwNCwgMHgyMDFhLCAweDgxMDgsIDB4ODIxMCwgMHgxZjA0LCAweDIxMjksCisJMHhhNjg1LCAweDgwMzAsIDB4NzBjMiwgMHg2ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDc4MTAsCisJMHhhMDg0LCAweGZmY2YsIDB4NzgxMiwgMHgyMDkxLCAweDgwMDEsIDB4YTAwNiwgMHgyMDA5LCAweDhlNzUsCisJMHgyMDBhLCAweDIwM2EsIDB4MDAwNSwgMHg3ODEwLCAweGMwYWQsIDB4NzgxMiwgMHgwMGIwLCAweDI2M2EsCisJMHgwODBjLCAweDIyMjksIDB4MTkwNCwgMHgyMjQ1LCAweDc4NmMsIDB4YTA2NSwgMHgxOTA0LCAweDIwZjcsCisJMHgyMDkxLCAweDgwMDAsIDB4NzgxMCwgMHhhMDg0LCAweGZmY2YsIDB4ODZmZiwgMHgwMTA4LCAweGMwYWQsCisJMHg3ODEyLCAweDIwOTEsIDB4ODAwMSwgMHgwODA0LCAweDIyNDUsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsCisJMHgwMDA0LCAweDc5OTQsIDB4NzBkNCwgMHhhMTAyLCAweDAyMjgsIDB4MDE2OCwgMHg3YjkwLCAweGEzMDIsCisJMHgxMTUwLCAweDAwMTAsIDB4ODAwMiwgMHgxMTM4LCAweDI2M2EsIDB4NzgxMCwgMHhjMGFkLCAweDc4MTIsCisJMHgyMDkxLCAweDgwMDEsIDB4MDAwNSwgMHhhMTg0LCAweGZmMDAsIDB4MDE0MCwgMHg4MTBmLCAweDgxMGMsCisJMHg4MTBjLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA3LCAweGExMDAsIDB4MDAxOCwgMHg4MTA3LCAweDgwMDQsCisJMHg4MDA0LCAweDdhOWMsIDB4YTIxMCwgMHg3MjFhLCAweDdhOTgsIDB4YTAwNiwgMHhhMjExLCAweDcyMWUsCisJMHhkNGM0LCAweDAxMzAsIDB4N2FhNCwgMHhhMjExLCAweDcyMjIsIDB4N2FhMCwgMHhhMjExLCAweDcyMjYsCisJMHgyMGExLCAweDAwMzAsIDB4NzAwMywgMHgwMDAwLCAweDIwMDksIDB4OGU1NCwgMHgyNjBhLCAweDgxMDksCisJMHgyMTk4LCAweDIxMDQsIDB4ZDA4NCwgMHgwMTA4LCAweDg2MzMsIDB4YTZiMCwgMHgwMDAyLCAweDI2YTgsCisJMHg1M2E2LCAweDg2MDMsIDB4NzAxMiwgMHg3MDA3LCAweDAwMDEsIDB4Nzk5MCwgMHg3ODk0LCAweDgwMDAsCisJMHhhMTBhLCAweDEyMDgsIDB4YTAwNiwgMHgyMDI4LCAweDc5NzQsIDB4YTE4NCwgMHhmZjAwLCAweDAxNDAsCisJMHg4MTBmLCAweDgxMGMsIDB4ODEwYywgMHg4MDA0LCAweDgwMDQsIDB4ODAwNywgMHhhMTAwLCAweDAwMTgsCisJMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHg3OTdjLCAweGExMDgsIDB4N2E3OCwgMHhhMDA2LCAweGEyMTEsCisJMHhkNGM0LCAweDAxMjAsIDB4N2I4NCwgMHhhMzE5LCAweDdjODAsIDB4YTQyMSwgMHg3MDA4LCAweGQwZmMsCisJMHgwZGU4LCAweGEwODQsIDB4MDFlMCwgMHgwMWQwLCAweDdkMTAsIDB4MjAzMSwgMHg4ZTU0LCAweDI2MzQsCisJMHg3OGE4LCAweDgwMDAsIDB4NzhhYSwgMHhkMDhjLCAweDExMzgsIDB4NzAwNywgMHgwMDA2LCAweDcwMDQsCisJMHhkMDk0LCAweDFkZTgsIDB4MDgwNCwgMHgyMTVmLCAweDIwNjksIDB4NDY0NywgMHgyMDZiLCAweDAwMDMsCisJMHg3OGFjLCAweGEwODUsIDB4MDMwMCwgMHg3OGFlLCAweGEwMDYsIDB4MDA0OCwgMHgyMDMwLCAweDc1ZDYsCisJMHgyMDkxLCAweDQwODAsIDB4N2Q5NiwgMHg3ZDEwLCAweGE1YWMsIDB4ZmZjZiwgMHg3ZDEyLCAweDIwOTEsCisJMHg4MDAxLCAweDc4YWEsIDB4NzAwNywgMHgwMDA2LCAweDI2M2EsIDB4NzAwMywgMHgwMDAxLCAweDcxMWEsCisJMHg3MjFlLCAweGQ1YzQsIDB4MDExMCwgMHg3MzIyLCAweDc0MjYsIDB4MDAwNSwgMHg2MDg0LCAweGEwODYsCisJMHgwMTAzLCAweDExZDgsIDB4NjExNCwgMHg2MDE4LCAweGExMDUsIDB4MTFiOCwgMHgyMDY5LCAweDAwMDAsCisJMHg2ODE4LCAweGQwODQsIDB4MTE5MCwgMHg2MDBjLCAweDcwYzYsIDB4NjAxMCwgMHg3MGNhLCAweDcwYzMsCisJMHg4MDIwLCAweDY4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDgwYywgMHgxZGIzLCAweDBlMDQsCisJMHgyMjFjLCAweDc4NmMsIDB4YTA2NSwgMHgxZDEwLCAweDAwMDUsIDB4MDA1OSwgMHgxNTMwLCAweDc4NmMsCisJMHhhMDY1LCAweDE5ZTAsIDB4MDQxMCwgMHgwMDI5LCAweDE1MDAsIDB4Nzg2YywgMHhhMDY1LCAweDFkZDgsCisJMHgwMGUwLCAweDYwODQsIDB4YTA4NiwgMHgwMTAzLCAweDExNjgsIDB4NjAxOCwgMHhjMGZjLCAweDYwMWEsCisJMHhhMDg2LCAweDAwMDQsIDB4MTEzOCwgMHg3ODA0LCAweGQwYTQsIDB4MDEyMCwgMHgwODBjLCAweDFkYjMsCisJMHhhMDA2LCAweDAwMDUsIDB4MDA3OSwgMHgxMTE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwYjksCisJMHgxMTEwLCAweDIwNDEsIDB4MDAwMSwgMHg3ZDEwLCAweDAwMDUsIDB4ODhmZiwgMHgwMTEwLCAweDIwOTEsCisJMHg0MDgwLCAweDAwMDUsIDB4N2I5MCwgMHg3OTk0LCAweDcwZDQsIDB4YTEwMiwgMHgxMTE4LCAweGEzODUsCisJMHgwMDAwLCAweDAwMDUsIDB4MDIxMCwgMHhhMzAyLCAweDAwMDUsIDB4ODAwMiwgMHgwMDA1LCAweGExODQsCisJMHhmZjAwLCAweDAxNDAsIDB4ODEwZiwgMHg4MTBjLCAweDgxMGMsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDcsCisJMHhhMTAwLCAweDAwMTgsIDB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4N2E5YywgMHg3Yjk4LCAweDdjYTQsCisJMHg3ZGEwLCAweGEyMTAsIDB4YTAwNiwgMHhhMzE5LCAweGE0MjEsIDB4YTUyOSwgMHgyMDA5LCAweDAwMTgsCisJMHg2MDI4LCAweGEwMDUsIDB4MDExMCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgxYjE1LCAweDAxZDAsCisJMHg3OGE4LCAweDgwMDAsIDB4NzhhYSwgMHhkMDhjLCAweDE1MTAsIDB4NjAxNCwgMHhkMGZjLCAweDExMTgsCisJMHgyMDY5LCAweDQ2NDAsIDB4MDAxMCwgMHgyMDY5LCAweDQ2ODAsIDB4MjA5MSwgMHg4MDAwLCAweDY4MWYsCisJMHgwMDAzLCAweDc4YWIsIDB4MDAwMCwgMHg3OGFjLCAweGEwODUsIDB4MDMwMCwgMHg3OGFlLCAweDIwOTEsCisJMHg4MDAxLCAweDAwNjgsIDB4NzhhYiwgMHgwMDAwLCAweDA4MGMsIDB4MWRiMywgMHg3OTkwLCAweDc4OTQsCisJMHg4MDAwLCAweGExMGEsIDB4MTIwOCwgMHhhMDA2LCAweDc4OTYsIDB4NzBkNiwgMHhhMDA2LCAweDIwNzEsCisJMHgwMDEwLCAweDIwOTEsIDB4ODAwMSwgMHgwMDA1LCAweGQ3ZmMsIDB4MTExOCwgMHgyMDA5LCAweDQ2NTgsCisJMHgwMDEwLCAweDIwMDksIDB4NDY5OCwgMHgyMDkxLCAweDgwMDAsIDB4MjAwYSwgMHgwMGY2LCAweDIwMDksCisJMHg0NjgwLCAweDIwNzksIDB4MDEwMCwgMHhkN2ZjLCAweDExMjAsIDB4MjAwOSwgMHg0NjQwLCAweDIwNzksCisJMHgwMjAwLCAweDIxMDQsIDB4YTA4NiwgMHgwMDAwLCAweDExODAsIDB4ZDdmYywgMHgxMTE4LCAweDIwMDksCisJMHg0NjQ1LCAweDAwMTAsIDB4MjAwOSwgMHg0Njg1LCAweDIxMDQsIDB4YTAwNSwgMHgxMTMwLCAweDc4MzAsCisJMHhhMDg0LCAweDAwYzAsIDB4MTExMCwgMHg3ODFiLCAweDAwNTIsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDksCisJMHgwMDAyLCAweDIwNjksIDB4NDYwMCwgMHgyMDAxLCAweDAxZmYsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsCisJMHgyMzI0LCAweDIwNzEsIDB4NDY4MCwgMHgyMDc5LCAweDAxMDAsIDB4MjAyMSwgMHg0OGJmLCAweDc4NGIsCisJMHgwMDBmLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MDExOCwgMHgyMDE5LCAweDNlMGYsCisJMHgwMDMwLCAweDIwYTEsIDB4MDEyYiwgMHgyMDE5LCAweDNlMGYsIDB4ZDE4NCwgMHgwMTEwLCAweDIwYTEsCisJMHgwMjJiLCAweDIzMDQsIDB4YTAwNSwgMHgwMTQwLCAweDc4OWEsIDB4ODMxOCwgMHgyM2FjLCAweDgzMTgsCisJMHgyMzk4LCAweDUzYTYsIDB4MzMxOCwgMHgwY2E4LCAweDc4OWIsIDB4MDAwMCwgMHg3ODliLCAweDAwMjAsCisJMHgyMGE5LCAweDAwMTAsIDB4NzhhZiwgMHgwMDAwLCAweDc4YWYsIDB4MjAyMCwgMHgxZjA0LCAweDIzMDIsCisJMHg3MDAzLCAweDAwMDAsIDB4MDAxNiwgMHhkMThjLCAweDIwMDksIDB4MDAwMCwgMHgwMTA4LCAweGMxYmQsCisJMHgwODBjLCAweDI0NDMsIDB4MDAxZSwgMHg3MDIwLCAweGEwODQsIDB4MDAwZiwgMHhhMDg1LCAweDYzMDAsCisJMHg3ODA2LCAweDc4MGYsIDB4OTAwMCwgMHg3ODQzLCAweDAwZDgsIDB4Nzg1MywgMHgwMDkwLCAweDc4MGIsCisJMHgyZjA4LCAweDc0NTIsIDB4NzA0ZiwgMHgwMDAwLCAweDgxMDksIDB4MDE0MCwgMHgyMDcxLCAweDQ2NDAsCisJMHgyMDc5LCAweDAyMDAsIDB4MjAyMSwgMHg0NmJmLCAweDA4MDQsIDB4MjJkZiwgMHgwODBjLCAweDI0ZmQsCisJMHgwMDA1LCAweDAwMTYsIDB4MjAxMSwgMHgwMTAxLCAweGQxYmMsIDB4MTExMCwgMHgyMDExLCAweDAyMDEsCisJMHhhMThjLCAweDAwMGYsIDB4MjIwNCwgMHhhMDg0LCAweGZmZjAsIDB4YTEwNSwgMHgyMDEyLCAweDAwMWUsCisJMHgwODBjLCAweDI0NDMsIDB4MDAwNSwgMHgyMDExLCAweDAxMDEsIDB4ZDNmYywgMHgxMTEwLCAweDIwMTEsCisJMHgwMjAxLCAweDIwYTksIDB4MDAwOSwgMHg4MTBiLCAweDFmMDQsIDB4MjM0YiwgMHhhMThjLCAweDBlMDAsCisJMHgyMjA0LCAweGEwODQsIDB4ZjFmZiwgMHhhMTA1LCAweDIwMTIsIDB4MDAwNSwgMHgyMDE5LCAweDAwMDIsCisJMHgyMDA5LCAweDAxMDEsIDB4MjBhOSwgMHgwMDA1LCAweDgyMTMsIDB4MWYwNCwgMHgyMzVjLCAweGEyOTQsCisJMHgwMGUwLCAweDIxMDQsIDB4YTA4NCwgMHhmZjFmLCAweGEyMDUsIDB4MjAwYSwgMHg4MzE5LCAweDAxMTgsCisJMHgyMDA5LCAweDAyMDEsIDB4MGM3OCwgMHgwMDA1LCAweDIwMTEsIDB4MDEwMSwgMHhkM2ZjLCAweDExMTAsCisJMHgyMDExLCAweDAyMDEsIDB4MjBhOSwgMHgwMDBjLCAweDgxMGIsIDB4MWYwNCwgMHgyMzc0LCAweGExOGMsCisJMHhmMDAwLCAweDIyMDQsIDB4YTA4NCwgMHgwZmZmLCAweGExMDUsIDB4MjAxMiwgMHgwMDA1LCAweDIwMTEsCisJMHgwMTAyLCAweGQzZmMsIDB4MTExMCwgMHgyMDExLCAweDAyMDIsIDB4MjIwNCwgMHhhMDg0LCAweGYwY2YsCisJMHhhMTA1LCAweDIwMTIsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHhkMWJjLCAweDExMTAsCisJMHgyMDYxLCAweDAyMDAsIDB4YzFiYywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIwLCAweDYwOWEsCisJMHg2MmFjLCAweDYzYWMsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweGQxYmMsCisJMHgxMTEwLCAweDIwNjEsIDB4MDIwMCwgMHhjMWJjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjIsCisJMHg2MDlhLCAweDYwYTQsIDB4YTA4NCwgMHhmZmRmLCAweDYwYWUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsCisJMHgyMDYxLCAweDAxMDAsIDB4ZDFiYywgMHgxMTEwLCAweDIwNjEsIDB4MDIwMCwgMHhjMWJjLCAweDgxMDMsCisJMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHg2MDlhLCAweDYwYTQsIDB4YTI4YywgMHgwMDIwLCAweDAxMTgsCisJMHhjMmFjLCAweGEzOWQsIDB4NDAwMCwgMHhjM2VjLCAweGQzYjQsIDB4MTEwOCwgMHhjM2VkLCAweDYyYWUsCisJMHgyMDEwLCAweDYwYTQsIDB4NjNhZSwgMHgyMDE4LCAweDAwY2UsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDAsCisJMHgwMGM2LCAweDAwZTYsIDB4NjgxOCwgMHhhMDA1LCAweDA5MDQsIDB4MjQyNywgMHhkMWZjLCAweDAxMTgsCisJMHgyMDYxLCAweDhkZDAsIDB4MDAxMCwgMHgyMDYxLCAweDhjYzAsIDB4MDgwYywgMHgyNDJmLCAweDA1NjAsCisJMHgyMGE5LCAweDAxMDEsIDB4ZDFmYywgMHgwMTE4LCAweDIwNjEsIDB4OGNkMCwgMHgwMDEwLCAweDIwNjEsCisJMHg4YmMwLCAweDAwYzYsIDB4MDgwYywgMHgyNDJmLCAweDAxMjgsIDB4MDBjZSwgMHg4YzYwLCAweDFmMDQsCisJMHgyM2U5LCAweDA0YTgsIDB4MDAwZSwgMHhkMWZjLCAweDAxMjgsIDB4YTA4MiwgMHg4Y2QwLCAweDIwNzEsCisJMHg0NjgwLCAweDAwMjAsIDB4YTA4MiwgMHg4YmMwLCAweDIwNzEsIDB4NDY0MCwgMHg3MDc2LCAweDcxNzIsCisJMHgyMTM4LCAweDIwMDEsIDB4MDAwNCwgMHg3MDYyLCAweDcwN2YsIDB4MDAwZiwgMHg3MWQwLCAweGMxYzQsCisJMHg3MWQyLCAweDA4MGMsIDB4MjJhNCwgMHgwMGMwLCAweGQxZmMsIDB4MTExOCwgMHgyMDcxLCAweDQ2NDAsCisJMHgwMDEwLCAweDIwNzEsIDB4NDY4MCwgMHg2MDIwLCAweGMwZGQsIDB4NjAyMiwgMHg3MTcyLCAweDIxMzgsCisJMHgyYzAwLCAweDcwN2EsIDB4MjAwMSwgMHgwMDA2LCAweDcwNjIsIDB4NzA3ZiwgMHgwMDBmLCAweDcxZDAsCisJMHhjMWM0LCAweDcxZDIsIDB4MDgwYywgMHgyMmE0LCAweDIwMDEsIDB4MDAwMCwgMHgwMDEwLCAweDIwMDEsCisJMHgwMDAxLCAweDIwOTEsIDB4ODAwMSwgMHhhMDA1LCAweDAwZWUsIDB4MDBjZSwgMHgwMDA1LCAweDJjMDQsCisJMHhhMDA1LCAweDAxNzAsIDB4MjA2MCwgMHg2MDEwLCAweGEzMDYsIDB4MTE0MCwgMHg2MDBjLCAweGEyMDYsCisJMHgxMTI4LCAweDYwMTQsIDB4YTEwNiwgMHgxMTEwLCAweGEwMDYsIDB4MDAyMCwgMHg2MDAwLCAweDBjODAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDAxNiwgMHgyMDc5LCAweDQ2ODAsCisJMHgyMDcxLCAweDAxMDAsIDB4ZDFiYywgMHgxMTIwLCAweDIwNzksIDB4NDY0MCwgMHgyMDcxLCAweDAyMDAsCisJMHg3OTIwLCAweGExOGMsIDB4MDAwZiwgMHg3MGVjLCAweGQwYzQsIDB4MTExMCwgMHgwMDFlLCAweDAwNjAsCisJMHg4MTBiLCAweDgxMGIsIDB4ODEwYiwgMHg4MTBiLCAweDAwMGUsIDB4YTE4ZCwgMHgwODAwLCAweGQwYmMsCisJMHgxMTEwLCAweGExOGQsIDB4MGYwMCwgMHgyMTA0LCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsCisJMHg0NjAxLCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LCAweDY4ZTQsIDB4ZDBhYywgMHgwMTIwLCAweGEwODQsCisJMHgwMDA2LCAweDExMDgsIDB4MDAwOSwgMHgwMDA1LCAweDYwMTQsIDB4MDBlNiwgMHgwMDM2LCAweDIwMTgsCisJMHgyMDcxLCAweDRiNDAsIDB4ZDBmYywgMHgxMTEwLCAweDIwNzEsIDB4NGFjMCwgMHg4MDA3LCAweGEwODQsCisJMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGFlNzAsIDB4NzAwNCwgMHhhMDg0LCAweDAwMGEsCisJMHgxOTA0LCAweDI0ZmEsIDB4NzEwOCwgMHhhMTk0LCAweGZmMDAsIDB4MDkwNCwgMHgyNGZhLCAweGExOGMsCisJMHgwMGZmLCAweDcwMWMsIDB4YTA4NCwgMHhmZjAwLCAweDAxYzAsIDB4NzAwNCwgMHhhMDg1LCAweDAwM2EsCisJMHg3MDA2LCAweDIwMDEsIDB4MDAwOSwgMHhhMTAyLCAweDE2ZDgsIDB4MjAwMSwgMHgwMDBhLCAweGExMDIsCisJMHgxNmQwLCAweDIwMDEsIDB4MDAwYywgMHhhMTAyLCAweDE2YzgsIDB4NzAxYywgMHhhMDg0LCAweDAwZmYsCisJMHg3MDFlLCAweDcwMDQsIDB4YTA4NCwgMHhmZmRmLCAweDcwMDYsIDB4MjAwMSwgMHgwMDBhLCAweGExMDYsCisJMHgwMWE4LCAweDIwMDEsIDB4MDAwYywgMHhhMTA2LCAweDAxYTAsIDB4MjAwMSwgMHgwMDEyLCAweGExMDYsCisJMHgwMTk4LCAweDIwMDEsIDB4MDAxNCwgMHhhMTA2LCAweDAxOTAsIDB4MjAwMSwgMHgwMDE5LCAweGExMDYsCisJMHgwMTg4LCAweDIwMDEsIDB4MDAzMiwgMHhhMTA2LCAweDAxODAsIDB4MDBkOCwgMHgyMDA5LCAweDAwMGMsCisJMHgwMGQwLCAweDIwMDksIDB4MDAxMiwgMHgwMGI4LCAweDIwMDksIDB4MDAxNCwgMHgwMGEwLCAweDIwMDksCisJMHgwMDE5LCAweDAwODgsIDB4MjAwOSwgMHgwMDIwLCAweDAwNzAsIDB4MjAwOSwgMHgwMDNmLCAweDAwNTgsCisJMHgyMDA5LCAweDAwMGEsIDB4MDA0MCwgMHgyMDA5LCAweDAwMGMsIDB4MDAyOCwgMHgyMDA5LCAweDAwMTksCisJMHgwMDEwLCAweDIwMTEsIDB4MDAwMCwgMHgyMTAwLCAweGEyMDUsIDB4NzAwYSwgMHg3MDA0LCAweGEwODUsCisJMHgwMDBhLCAweDcwMDYsIDB4MjA3MSwgMHg0NjAwLCAweDcwMDQsIDB4ZDBiYywgMHgwMTU4LCAweGQzZmMsCisJMHgxMTIwLCAweDczZWEsIDB4MjA3MSwgMHg0NjQwLCAweDAwMTgsIDB4NzNlZSwgMHgyMDcxLCAweDQ2ODAsCisJMHg3MDFmLCAweDAwMGQsIDB4MDAzZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHgwMWZmLCAweDIwMDQsCisJMHhkMGZjLCAweDExZDAsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDEyYTAsCisJMHgyMDcxLCAweDAyMDAsIDB4NzFlYywgMHhhMThjLCAweDFjMDAsIDB4ODEwZiwgMHg4MTBjLCAweDgxMGMsCisJMHgyMDc5LCAweDAxMDAsIDB4NzhlYywgMHhhMDg0LCAweDFjMDAsIDB4ODAwNywgMHg4MDA0LCAweDgwMDQsCisJMHhhMTA1LCAweGEwOGEsIDB4MDAwNywgMHgwMjA4LCAweDAwMDUsIDB4MDAwMiwgMHgyNTRiLCAweDI1MzIsCisJMHgyNTRiLCAweDI1MzIsIDB4MjUyNSwgMHgyNTNmLCAweDI1MjUsIDB4NzAwOCwgMHhhMDg0LCAweGMzZmYsCisJMHhhMDg1LCAweDMwMDAsIDB4NzAwYSwgMHg3ODA4LCAweGEwODQsIDB4YzNmZiwgMHhhMDg1LCAweDMwMDAsCisJMHg3ODBhLCAweDAwMDUsIDB4NzAwOCwgMHhhMDg0LCAweGMzZmYsIDB4YTA4NSwgMHgyMDAwLCAweDcwMGEsCisJMHg3ODA4LCAweGEwODQsIDB4YzNmZiwgMHhhMDg1LCAweDIwMDAsIDB4NzgwYSwgMHgwMDA1LCAweDcwMDgsCisJMHhhMDg0LCAweGMzZmYsIDB4YTA4NSwgMHgwYzAwLCAweDcwMGEsIDB4NzgwOCwgMHhhMDg0LCAweGMzZmYsCisJMHhhMDg1LCAweDBjMDAsIDB4NzgwYSwgMHgwMDA1LCAweDBlMDQsIDB4MjU0YywgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweDAwMDAsIDB4MDAwNiwgMHg3MDE4LCAweGQwODQsIDB4MWRlOCwgMHgwMDBlLCAweDIwNzEsCisJMHgwMDEwLCAweDcwY2EsIDB4MDAwZSwgMHg3MGM2LCAweDcwYzMsIDB4ODAwMiwgMHg3MGRiLCAweDBhMDQsCisJMHg3MGRmLCAweDAwMjAsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgwY2Y4LCAweDdmM2MsIDB4N2U1OCwgMHg3YzMwLCAweDdkMzgsIDB4NzhhMCwgMHg3MDhhLCAweDc1OGUsCisJMHg3NDkyLCAweDc2OTYsIDB4Nzc5YSwgMHhhNTk0LCAweDAwM2YsIDB4ZDRmNCwgMHgwMTM4LCAweGQ3YmMsCisJMHgxMTI4LCAweGE3ODQsIDB4MDA3ZCwgMHgxOTA0LCAweDNjNzQsIDB4MDg3MSwgMHhhNDljLCAweDAwMGYsCisJMHhhMzgyLCAweDAwMDQsIDB4MDMyMCwgMHhhM2E2LCAweDAwMDcsIDB4MTkzMCwgMHgyNDE4LCAweDg1MDcsCisJMHhhMDg0LCAweDAwMGYsIDB4MDAwMiwgMHgyYjQ5LCAweDJjMzQsIDB4MmM3MiwgMHgyZWQ4LCAweDMyNTYsCisJMHgzMmFkLCAweDMzNTMsIDB4MzNlMiwgMHgzNGI2LCAweDM1ODgsIDB4MjU5ZSwgMHgyNTliLCAweDI5NzAsCisJMHgyYTU2LCAweDMyMmEsIDB4MjU5YiwgMHgwODBjLCAweDI1NGMsIDB4MDAwNSwgMHhhMDA2LCAweDAwMzgsCisJMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHhhMDA2LCAweDcwMDIsIDB4NzA0YSwgMHg3MDQyLCAweDcwY2UsCisJMHg3MDVjLCAweGEwMDUsIDB4MTkwNCwgMHgyNmVjLCAweDcwNjAsIDB4YTA4NCwgMHgwMDA3LCAweDAwMDIsCisJMHgyNWI4LCAweDI2MjYsIDB4MjYyZSwgMHgyNjM3LCAweDI2NDAsIDB4MjZkMiwgMHgyNjQ5LCAweDI2MjYsCisJMHg3ODMwLCAweGQwYmMsIDB4MWQxMCwgMHg3MWQwLCAweGQxYmMsIDB4MTlmOCwgMHhkMWI0LCAweDE5MDQsCisJMHgyNjAzLCAweDcwYTAsIDB4YTA4NiwgMHgwMDAxLCAweDA5YzAsIDB4NzBiMCwgMHhhMDZkLCAweDY4MDAsCisJMHhhMDY1LCAweGEwNTUsIDB4Nzg5YiwgMHgwMDgwLCAweDZiMGMsIDB4N2JhYSwgMHg2ODA4LCAweGEwNDUsCisJMHg2ZDEwLCAweDY4MDQsIDB4YTA2ZCwgMHhhMDVkLCAweGE4ODYsIDB4MDAwMSwgMHgwMTE4LCAweDY5YmMsCisJMHg3ZGFhLCAweDc5YWEsIDB4NjhjMCwgMHhhMDRkLCAweDZlMWMsIDB4MjAwMSwgMHgwMDEwLCAweDA4MDQsCisJMHgyODFmLCAweDcwNWMsIDB4YTAwNSwgMHgxOTA0LCAweDI1OWQsIDB4MDBjNiwgMHgwMGQ2LCAweDcwYjAsCisJMHhhMDZkLCAweDY4MDAsIDB4YTA2NSwgMHhhMDU1LCAweDc4OWIsIDB4MDA4MCwgMHg2YjBjLCAweDdiYWEsCisJMHg2ODA4LCAweGEwNDUsIDB4NmQxMCwgMHg2ODA0LCAweGEwNmQsIDB4YTA1ZCwgMHhhODg2LCAweDAwMDEsCisJMHgwMTE4LCAweDY5YmMsIDB4N2RhYSwgMHg3OWFhLCAweDY4YzAsIDB4YTA0ZCwgMHg2ZTFjLCAweDIwMDEsCisJMHgwMDIwLCAweDA4MDQsIDB4MjgxZiwgMHgwODBjLCAweDNjMzMsIDB4MTkwNCwgMHgyNTlkLCAweDc4MWIsCisJMHgwMDY4LCAweDcwYjgsIDB4YTA2ZCwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsCisJMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHg2OGJjLCAweDcwM2UsCisJMHhjMWI0LCAweDcxZDIsIDB4NzBiNCwgMHhhMDY1LCAweDY4YzAsIDB4NzA1NiwgMHg3MDAzLCAweDAwMDIsCisJMHgyZDAwLCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDIsIDB4MDAwNSwgMHgwODBjLCAweDNjMzMsCisJMHgxMTIwLCAweDc4MWIsIDB4MDA1NCwgMHg3MDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwODBjLCAweDNjMzMsCisJMHgxMTI4LCAweDIwMTEsIDB4MDAwYywgMHgwNDE5LCAweDcwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDA4MGMsCisJMHgzYzMzLCAweDExMjgsIDB4MjAxMSwgMHgwMDA2LCAweDAwZDEsIDB4NzAwMywgMHgwMDA0LCAweDAwMDUsCisJMHgwODBjLCAweDNjMzMsIDB4MTEyOCwgMHgyMDExLCAweDAwMGQsIDB4MDA4OSwgMHg3MDAzLCAweDAwMDQsCisJMHgwMDA1LCAweDA4MGMsIDB4M2MzMywgMHgxMTUwLCAweDIwMTEsIDB4MDAwNiwgMHgwMDQxLCAweDcwNzgsCisJMHg3MDdiLCAweDAwMDAsIDB4MjA2OCwgMHg3MDRhLCAweDcwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDcxNzAsCisJMHhjMWZjLCAweDgxMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwODAsIDB4YTI4NiwgMHgwMDBjLCAweDExMjAsCisJMHg3YWFhLCAweDIwMDEsIDB4MDAwMSwgMHgwMDk4LCAweGExOGMsIDB4MDAxZiwgMHhhMThkLCAweDAwYzAsCisJMHg3OWFhLCAweGEyODYsIDB4MDAwZCwgMHgwMTIwLCAweDdhYWEsIDB4MjAwMSwgMHgwMDAyLCAweDAwMzgsCisJMHg3OGFiLCAweDAwMjAsIDB4NzE3NCwgMHg3OWFhLCAweDdhYWEsIDB4MjAwMSwgMHgwMDA0LCAweDc4OWIsCisJMHgwMDYwLCAweDc4YWEsIDB4Nzg1YiwgMHgwMDA0LCAweDc4MWIsIDB4MDExMywgMHgwODBjLCAweDNjNDYsCisJMHg3MDdmLCAweDAwMGYsIDB4NzBkMCwgMHhkMGI0LCAweDAxNjgsIDB4YzBiNCwgMHg3MGQyLCAweDAwYzYsCisJMHg3MGI0LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHg2MDE4LCAweDgwMDEsCisJMHg2MDFhLCAweDAwY2UsIDB4MDAwNSwgMHg3MDE0LCAweGEwMDUsIDB4MTEzOCwgMHg3MGQwLCAweGQwYjQsCisJMHgwMTI4LCAweDcwYjQsIDB4YWMwNiwgMHgxMTEwLCAweDBjMjksIDB4MDAwNSwgMHgwMDE2LCAweDcxYTAsCisJMHhhMTg2LCAweDAwMDEsIDB4MDUyOCwgMHgwMGQ2LCAweDAwMjYsIDB4MjEwMCwgMHgyMDExLCAweDAwMDEsCisJMHhhMjEyLCAweDcwYjAsIDB4MjA2OCwgMHg2ODAwLCAweGFjMDYsIDB4MDEyMCwgMHg4MjExLCAweDAxYjAsCisJMHgwMGM5LCAweDBjYzgsIDB4MDBjNiwgMHgyMTAwLCAweDIwMTEsIDB4MDAwMSwgMHhhMjEyLCAweDcwYjAsCisJMHgyMDY4LCAweDY4MDAsIDB4MjA2MCwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLCAweDgyMTEsCisJMHgwMTEwLCAweDAwNDEsIDB4MGNiMCwgMHg3MGEzLCAweDAwMDEsIDB4MDBjZSwgMHgwMDJlLCAweDAwZGUsCisJMHgwMDFlLCAweDAwMDUsIDB4YWRlOCwgMHgwMDA1LCAweDcwYTgsIDB4YWQwNiwgMHgxMTEwLCAweDcwYTQsCisJMHgyMDY4LCAweDAwMDUsIDB4MDgwYywgMHgzYzMzLCAweDE5MDQsIDB4MjU5ZCwgMHg3MDc4LCAweDIwNjgsCisJMHg3NzcwLCAweDA4MGMsIDB4M2I2ZiwgMHgyYzUwLCAweDA4MGMsIDB4M2NjZSwgMHg3ODliLCAweDAwODAsCisJMHg2ODE0LCAweGEwODQsIDB4MDAxZiwgMHhjMGJkLCAweDc4YWEsIDB4NmUxYywgMHgyMDQxLCAweDAwMDEsCisJMHgyMDAxLCAweDAwMDQsIDB4MDgwNCwgMHgyODI0LCAweDA4MGMsIDB4M2MzMywgMHgxOTA0LCAweDI1OWQsCisJMHg3ODliLCAweDAwODAsIDB4NzA1YywgMHgyMDY4LCAweDZmMTQsIDB4NzBkMCwgMHhkMGI0LCAweDAxNjgsCisJMHhjMGI0LCAweDcwZDIsIDB4MDBjNiwgMHg3MGI0LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsCisJMHg2MDBhLCAweDYwMTgsIDB4ODAwMSwgMHg2MDFhLCAweDAwY2UsIDB4MDgwYywgMHgzYjZmLCAweDJjNTAsCisJMHgwODBjLCAweDNjY2UsIDB4NjgyNCwgMHhhMDA1LCAweDAxMzAsIDB4YTA4MiwgMHgwMDA2LCAweDAyMDgsCisJMHgwMDEwLCAweDY4MjcsIDB4MDAwNSwgMHg2ODE0LCAweGEwODQsIDB4MDAxZiwgMHhjMGJkLCAweDc4YWEsCisJMHgyMDMxLCAweDAwMjAsIDB4MjA0MSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMywgMHgwODA0LCAweDI4MjQsCisJMHhjMjhkLCAweDcyZDIsIDB4NzJiYywgMHhhMjAwLCAweGEwMTUsIDB4NzE1MCwgMHg4MTA4LCAweGExMmEsCisJMHgwMjA4LCAweDcxYmMsIDB4MjE2NCwgMHg2NTA0LCAweDg1ZmYsIDB4MTE3MCwgMHg3MTUyLCAweDg0MjEsCisJMHgxZGE4LCAweDcwZDAsIDB4ZDA4YywgMHgwMTI4LCAweDcwY2MsIDB4YTAwNSwgMHgxMTEwLCAweDcwY2YsCisJMHgwMDBhLCAweDAwMDUsIDB4MjIwMCwgMHgwYzkwLCAweDcwZDAsIDB4YzA4YywgMHg3MGQyLCAweDcwY2YsCisJMHgwMDAwLCAweDYwMzQsIDB4YTAwNSwgMHgxZGIwLCAweDY3MDgsIDB4YTc4NCwgMHgwNzNmLCAweDAxZDAsCisJMHhkN2Q0LCAweDFkODAsIDB4YTc4NCwgMHgwMDIxLCAweDFkNjgsIDB4YTc4NCwgMHgwMDAyLCAweDAxMzAsCisJMHhhNzg0LCAweDAwMDQsIDB4MGQzOCwgMHhhN2JjLCAweGZmZmIsIDB4NjcwYSwgMHhhNzg0LCAweDAyMTgsCisJMHgxZDA4LCAweGE3ODQsIDB4MDEwMCwgMHgwMTMwLCAweDYwMTgsIDB4YTAwNSwgMHgxOWQ4LCAweGE3YmMsCisJMHhmZWZmLCAweDY3MGEsIDB4MjU2OCwgMHg2ODIzLCAweDAwMDAsIDB4NmUxYywgMHhhNjg0LCAweDAwMGUsCisJMHg2MzE4LCAweDAxMjgsIDB4NjAxYywgMHhhMzAyLCAweDAyMjAsIDB4MDExOCwgMHgwODU4LCAweDgzZmYsCisJMHgxOTQ4LCAweDJkNTgsIDB4MmM1MCwgMHg3MTUyLCAweGQ3YmMsIDB4MTEyMCwgMHg3MDI4LCAweDYwMjIsCisJMHg2MDNhLCAweDAwMTAsIDB4YzdiYywgMHg2NzBhLCAweDY4YzAsIDB4YTA2NSwgMHhhMDRkLCAweDYxMDAsCisJMHgyYTYwLCAweDIwNDEsIDB4MDAwMSwgMHg2YjE0LCAweGEzOWMsIDB4MDAxZiwgMHhhMzlkLCAweDAwYzAsCisJMHhkMWZjLCAweDAxMTAsIDB4ZDY4NCwgMHgwMTEwLCAweGEzOWMsIDB4ZmZiZiwgMHhkNmE0LCAweDAxMTAsCisJMHhhMzlkLCAweDAwMjAsIDB4YTY4NCwgMHgwMDBlLCAweDE5MDQsIDB4MjdkNiwgMHhjN2E1LCAweDY3MGEsCisJMHgyYzAwLCAweDY4YzYsIDB4NzdhMCwgMHhhNzg2LCAweDAwMDEsIDB4MTE3OCwgMHg3MGQwLCAweGQwYjQsCisJMHgxMTYwLCAweDcwMDAsIDB4YTA4MiwgMHgwMDAyLCAweDEyNDAsIDB4NzgzMCwgMHhkMGJjLCAweDExMjgsCisJMHg3ODliLCAweDAwODAsIDB4N2JhYSwgMHgwODA0LCAweDI4MWQsIDB4ODczOSwgMHg3N2EyLCAweDI3NTAsCisJMHg3N2FjLCAweGE3YjAsIDB4MDAwNSwgMHg3MGE4LCAweGE2MDYsIDB4MTEwOCwgMHg3NmE0LCAweDc2YWUsCisJMHgyYzNhLCAweDg3MzgsIDB4MmQzYSwgMHg4NzM4LCAweDI4M2EsIDB4ODczOCwgMHgyMzNhLCAweDg3MzgsCisJMHgyNTNhLCAweDc4MzAsIDB4ZDBiYywgMHgwMTUwLCAweDIwOTEsIDB4ODAwMCwgMHgyMDkxLCAweDMwM2QsCisJMHg3MGQwLCAweGEwODQsIDB4MzAzZCwgMHgyMDkxLCAweDgwMDAsIDB4MjA5MCwgMHhhYWQ1LCAweDAwMDAsCisJMHgwMTIwLCAweDg0MjEsIDB4MjIwMCwgMHgxOTA0LCAweDI3MjUsIDB4MDAwNSwgMHhkMWRjLCAweDA5MDQsCisJMHgzN2NlLCAweDIwMjksIDB4MDAyMCwgMHhkNjljLCAweDExMjAsIDB4ODUyOCwgMHhkNjhjLCAweDExMDgsCisJMHg4NTI4LCAweDg4NDAsIDB4NmYxNCwgMHg2MTBjLCAweDgxMDgsIDB4YTE4YywgMHgwMGZmLCAweDcwYzgsCisJMHhhMTYwLCAweDJjNjQsIDB4OGNmZiwgMHgwMTg4LCAweDYwMTQsIDB4YTcwNiwgMHgxZGQwLCAweDYwYjgsCisJMHg4MDAxLCAweDYwYmEsIDB4MWQ4OCwgMHgyYTYwLCAweDYwMDgsIDB4YTA4NSwgMHgwMTAwLCAweDYwMGEsCisJMHgyMjAwLCAweDg0MjEsIDB4MTkwNCwgMHgyNzI1LCAweDAwMDUsIDB4MmE2MCwgMHg2MTBlLCAweDY5YmUsCisJMHgyYzAwLCAweDY4YzYsIDB4ODg0MCwgMHg2MDA4LCAweGMwZDUsIDB4NjAwYSwgMHg3N2EwLCAweGE3ODYsCisJMHgwMDAxLCAweDE5MDQsIDB4MjdhZCwgMHg3MGQwLCAweGQwYjQsIDB4MTkwNCwgMHgyN2FkLCAweDcwMDAsCisJMHhhMDgyLCAweDAwMDIsIDB4MWEwNCwgMHgyN2FkLCAweDc4MzAsIDB4ZDBiYywgMHgxOTA0LCAweDI3YWQsCisJMHg3ODliLCAweDAwODAsIDB4N2JhYSwgMHg3ZGFhLCAweDc5YWEsIDB4MjAwMSwgMHgwMDAyLCAweDAwMDYsCisJMHg2MDE4LCAweDgwMDAsIDB4NjAxYSwgMHgwMDA4LCAweDAwMDYsIDB4Mjk2MCwgMHg2MTA0LCAweDJhNjAsCisJMHgwODBjLCAweDNjZTEsIDB4MTU5MCwgMHhhMTg0LCAweDAwMTgsIDB4MDE4MCwgMHhhMTg0LCAweDAwMTAsCisJMHgwMTE4LCAweDA4MGMsIDB4Mzk3NywgMHgxNTQ4LCAweGExODQsIDB4MDAwOCwgMHgwMTM4LCAweDY5YTAsCisJMHhhMTg0LCAweDA2MDAsIDB4MTExOCwgMHgwODBjLCAweDM4OTUsIDB4MDBmOCwgMHg2OWEwLCAweGExODQsCisJMHgxZTAwLCAweDA1MjgsIDB4YTE4NCwgMHgwODAwLCAweDAxNzgsIDB4MDBjNiwgMHgyOTYwLCAweDYwMDAsCisJMHhhMDg1LCAweDIwMDAsIDB4NjAwMiwgMHg2MTA0LCAweGExOGQsIDB4MDAxMCwgMHg2MTA2LCAweDAwY2UsCisJMHgwODBjLCAweDM5NzcsIDB4MTE1MCwgMHg2OWEwLCAweGExODQsIDB4MDIwMCwgMHgwMTE4LCAweDA4MGMsCisJMHgzOGRhLCAweDAwMTgsIDB4YTE4NCwgMHgwNDAwLCAweDE5ZjAsIDB4NjlhMCwgMHhhMTg0LCAweDEwMDAsCisJMHgwMTMwLCAweDY5MTQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHgyMzljLCAweDAwMmUsCisJMHhhNjhjLCAweDAwZTAsIDB4YTY4NCwgMHgwMDYwLCAweDAxMjgsIDB4YTA4NiwgMHgwMDYwLCAweDExMTAsCisJMHhhMThkLCAweDQwMDAsIDB4YTE4ZCwgMHgwMTA0LCAweDY5YjYsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsCisJMHg3OGFhLCAweDY4MTgsIDB4YzBmZCwgMHg2ODFhLCAweGQ2YmMsIDB4MDE2OCwgMHhjMGZjLCAweDcwODMsCisJMHgwMDAwLCAweGEwOGEsIDB4MDAwZCwgMHgwMzI4LCAweGEwOGEsIDB4MDAwYywgMHg3MTgyLCAweDIwMDEsCisJMHgwMDBjLCAweDgwMGMsIDB4NzE4NiwgMHg3OGFhLCAweDM1MTgsIDB4MzM0MCwgMHgzNDI4LCAweDgwMDAsCisJMHg4MGFjLCAweGFmODAsIDB4MDAyYiwgMHgyMGEwLCAweDc4OWIsIDB4MDAwMCwgMHhhZDgwLCAweDAwMGIsCisJMHgyMDk4LCAweDUzYTYsIDB4MjNhOCwgMHgyODk4LCAweDI1YTAsIDB4YTI4NiwgMHgwMDIwLCAweDE1MDgsCisJMHg3MGQwLCAweGMwYjUsIDB4NzBkMiwgMHgyYzAwLCAweDcwYjYsIDB4MmQwMCwgMHg3MGJhLCAweDY4MTQsCisJMHhjMGZjLCAweDgwMDcsIDB4Nzg4MiwgMHhhMjg2LCAweDAwMDIsIDB4MDkwNCwgMHgyOGY1LCAweDcwYTAsCisJMHg4MDAwLCAweDcwYTIsIDB4NzRiMCwgMHhhNDk4LCAweDAwMDUsIDB4NzBhOCwgMHhhMzA2LCAweDExMDgsCisJMHg3M2E0LCAweDczYjIsIDB4YTI4NiwgMHgwMDEwLCAweDA5MDQsIDB4MjU5ZCwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDA1LCAweDcwMDAsIDB4YTAwNSwgMHgxOWUwLCAweGEyODYsIDB4MDAwMiwgMHgxOTA0LCAweDI5MGMsCisJMHgwODBjLCAweDNjMzMsIDB4MTlhOCwgMHg2ODE0LCAweGMwZmMsIDB4ODAwNywgMHg3ODgyLCAweDIwOTEsCisJMHg4MDAwLCAweDc4MWIsIDB4MDA2OCwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsCisJMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHgyMDkxLCAweDgwMDEsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsCisJMHgwMTI2LCAweDAwZDYsIDB4MDBjNiwgMHg3MGQwLCAweGEwODQsIDB4MmUwMCwgMHgyMDkwLCAweDAwY2UsCisJMHgwMGRlLCAweDAxMmUsIDB4MjkwMCwgMHg3MDU2LCAweDY4YmMsIDB4NzAzZSwgMHg3MDAzLCAweDAwMDIsCisJMHgyZDAwLCAweDcwNGEsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDIsIDB4NzgzMCwgMHhkMGJjLCAweDAxNDAsCisJMHgyMDkxLCAweDMwM2QsIDB4NzBkMCwgMHhhMDg0LCAweDMwM2QsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTAsCisJMHg3MGEwLCAweGEwMDUsIDB4MTEwOCwgMHgwMDA1LCAweDg0MjEsIDB4MGRlOCwgMHg3MjRjLCAweDcwYmMsCisJMHhhMjAwLCAweGEwMTUsIDB4MDgwNCwgMHgyNzI1LCAweGEyODYsIDB4MDAxMCwgMHgxNTYwLCAweDA4MGMsCisJMHgzYzMzLCAweDE5MDQsIDB4MjhhMCwgMHg2ODE0LCAweGMwZmMsIDB4ODAwNywgMHg3ODgyLCAweDc4MWIsCisJMHgwMDY4LCAweDY4YjQsIDB4Nzg1YSwgMHg2ODk0LCAweDc4ZDYsIDB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsCisJMHg3OGRhLCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLCAweDcwYTAsIDB4ODAwMCwgMHg3MGEyLCAweDc0YjAsCisJMHhhNDkwLCAweDAwMDUsIDB4NzBhOCwgMHhhMjA2LCAweDExMDgsIDB4NzJhNCwgMHg3MmIyLCAweDI5MDAsCisJMHg3MDU2LCAweDY4YmMsIDB4NzAzZSwgMHg3MDAzLCAweDAwMDIsIDB4MmQwMCwgMHg3MDRhLCAweGFkODAsCisJMHgwMDA5LCAweDcwNDIsIDB4MDAwNSwgMHg2YmI0LCAweGEzOWQsIDB4MjAwMCwgMHg3YjVhLCAweDY4MTQsCisJMHhjMGZjLCAweDgwMDcsIDB4Nzg4MiwgMHg2Yjk0LCAweDdiZDYsIDB4N2JkZSwgMHg2ZTk4LCAweDdlZDIsCisJMHg3ZWRhLCAweDc4MWIsIDB4MDA2OCwgMHgyOTAwLCAweDcwNTYsIDB4NzIwMiwgMHg3ODA4LCAweGMwOGQsCisJMHg3ODBhLCAweDIzMDAsIDB4YTYwNSwgMHgwMTcwLCAweDcwZDAsIDB4YTA4NCwgMHgyZTAwLCAweGEwODYsCisJMHgyNjAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDAwLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAxLCAweGEyODQsCisJMHgwMDBmLCAweDAwMjMsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDIsIDB4MDAwNSwgMHgyOTZlLCAweDQxZDksCisJMHg0MWQ5LCAweDQxYzcsIDB4NDFkOSwgMHgyOTZlLCAweDI5NmUsIDB4Mjk2ZSwgMHgwODBjLCAweDI1NGMsCisJMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLCAweDAwZjYsIDB4MjA3OSwgMHg0NjAwLCAweDc4YWMsCisJMHgwMGZlLCAweGQwODQsIDB4MDFiMCwgMHg3MDYwLCAweGEwODYsIDB4MDAwMSwgMHgwOTA0LCAweDJhMzIsCisJMHg3MDYwLCAweGEwODYsIDB4MDAwNSwgMHgxMTU4LCAweDcwNzgsIDB4MjA2OCwgMHg2ODFiLCAweDAwMDQsCisJMHg2ODE3LCAweDAwMDAsIDB4NjgyMCwgMHhhMDg0LCAweDAwZmYsIDB4YzA5ZCwgMHg2ODIyLCAweDcwNjMsCisJMHgwMDAwLCAweDcwYTMsIDB4MDAwMCwgMHg3MGE0LCAweDcwYWUsIDB4NzBiMiwgMHgwODBjLCAweDI2ODIsCisJMHgwMTU2LCAweDIwMTEsIDB4MDAwNCwgMHg3MTYwLCAweGExODYsIDB4MDAwMSwgMHgwMTYwLCAweGExODYsCisJMHgwMDA3LCAweDExMTgsIDB4NzAxZiwgMHgwMDA1LCAweDAwMzAsIDB4NzAxZiwgMHgwMDAxLCAweDcwZDAsCisJMHhjMGM1LCAweDcwZDIsIDB4MDAwMCwgMHgyMDAxLCAweDQ2MGEsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMTgsIDB4MDEzMCwgMHg3MDE4LCAweDcwMTYsIDB4YTAwNSwgMHgxMTEwLCAweDcwYTMsCisJMHgwMDAxLCAweDAwNjYsIDB4MDgwYywgMHgzZjI2LCAweDIwYTksIDB4MDAxMCwgMHgyMDM5LCAweDAwMDAsCisJMHgwODBjLCAweDNhNjYsIDB4YTdiOCwgMHgwMTAwLCAweDFmMDQsIDB4MjljMCwgMHgwMDZlLCAweDcwMDAsCisJMHgwMDAyLCAweDI5ZmQsIDB4MjlkYiwgMHgyOWRiLCAweDI5ZDMsIDB4MjlmZCwgMHgyOWZkLCAweDI5ZmQsCisJMHgyOWQxLCAweDA4MGMsIDB4MjU0YywgMHg3MDVjLCAweGEwMDUsIDB4MDUzOCwgMHhhZDA2LCAweDExMTgsCisJMHg2ODAwLCAweDcwNWUsIDB4MDA4MCwgMHg2ODIwLCAweGQwODQsIDB4MTE0OCwgMHg2ZjE0LCAweDA4MGMsCisJMHgzYjZmLCAweDYwMDgsIDB4YzBkNCwgMHg2MDBhLCAweDA4MGMsIDB4MzdhNCwgMHgwMDIwLCAweDcwNTgsCisJMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHhhNjg0LCAweDVmMDAsIDB4NjgxZSwgMHg2ODE4LCAweGQwZmMsCisJMHgwMTA4LCAweDZhMWEsIDB4NjgxNywgMHgwMDAwLCAweDY4MmIsIDB4MDAwMCwgMHg2ODIwLCAweGEwODQsCisJMHgwMGZmLCAweGMwOWQsIDB4NjgyMiwgMHgwODBjLCAweDFkYTIsIDB4MjAxMSwgMHgwMDA0LCAweDc0YzgsCisJMHhhNGEwLCAweDAxMDAsIDB4MDRiMSwgMHhhZWEwLCAweDAwMTcsIDB4MDQ5OSwgMHgyMGE5LCAweDAxMDEsCisJMHg3NGM4LCAweDA0NzksIDB4ODQyMCwgMHgxZjA0LCAweDJhMDksIDB4NzBjMCwgMHgyMDYwLCAweDIwMjEsCisJMHgwMDAyLCAweDIwYTksIDB4MDEwMCwgMHg2MTEwLCAweDgxZmYsIDB4MDE5OCwgMHg2MDE4LCAweDAwMTYsCisJMHgwMDA2LCAweDIwMTEsIDB4NDYwMiwgMHgyMjBjLCAweGExMDIsIDB4MjAxMiwgMHgwMDBlLCAweDAwMWUsCisJMHhhMTAyLCAweDAzMzgsIDB4NjAxMiwgMHgxMTI4LCAweDIwMTEsIDB4NDYwNCwgMHgyMjA0LCAweGMwYTUsCisJMHgyMDEyLCAweDYwMWIsIDB4MDAwMCwgMHhhY2UwLCAweDAwMTAsIDB4MWYwNCwgMHgyYTEzLCAweDg0MjEsCisJMHgxZDAwLCAweDAxNWUsIDB4NzA2MywgMHgwMDAwLCAweDcwMDMsIDB4MDAwMCwgMHg3MDRiLCAweDAwMDAsCisJMHgwMDA1LCAweDAwNDYsIDB4MjQwNCwgMHhhMDA1LCAweDAxYTgsIDB4MjA2OCwgMHg2ODAwLCAweDAwMDYsCisJMHg2YTFhLCAweDY4MTcsIDB4MDAwMCwgMHg2ODJiLCAweDAwMDAsIDB4NjhiNCwgMHhhMDg0LCAweDVmMDAsCisJMHg2ODFlLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLCAweGMwOWQsIDB4NjgyMiwgMHgwODBjLCAweDFkYTIsCisJMHgwMDBlLCAweDBjNDgsIDB4MDA0ZSwgMHgyMDIzLCAweDAwMDAsIDB4MDAwNSwgMHhhMjgyLCAweDAwMDMsCisJMHgwMzEwLCAweDA4MGMsIDB4MjU0YywgMHgyMzAwLCAweDAwMDIsIDB4MmE2MCwgMHgyYWRkLCAweDJhZjcsCisJMHhhMjgyLCAweDAwMDIsIDB4MDExMCwgMHgwODBjLCAweDI1NGMsIDB4NzA2MCwgMHg3MDYzLCAweDAwMDAsCisJMHg3MDdmLCAweDAwMDAsIDB4MDAyMiwgMHg3N2QwLCAweGM3YzUsIDB4NzdkMiwgMHgwMDAyLCAweDJhNzcsCisJMHgyYTc3LCAweDJhNzksIDB4MmFiMSwgMHgzN2Q4LCAweDJhNzcsIDB4MmFiMSwgMHgyYTc3LCAweDA4MGMsCisJMHgyNTRjLCAweDc3NzAsIDB4MDgwYywgMHgzYTY2LCAweDc3NzAsIDB4YTdiYywgMHg4ZjAwLCAweDA4MGMsCisJMHgzYjZmLCAweDYwMTgsIDB4YTAwNSwgMHgwNTI4LCAweGQ3ZmMsIDB4MTExOCwgMHgyMDIxLCAweDhjYzAsCisJMHgwMDEwLCAweDIwMjEsIDB4OGRkMCwgMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDEwLCAweDA4MGMsCisJMHgyYjExLCAweDAxYjgsIDB4MDE1NiwgMHgyMGE5LCAweDAxMDEsIDB4ZDdmYywgMHgxMTE4LCAweDIwMjEsCisJMHg4YmMwLCAweDAwMTAsIDB4MjAyMSwgMHg4Y2QwLCAweDAwNDYsIDB4MjAwOSwgMHgwMDA1LCAweDIwMTEsCisJMHgwMDEwLCAweDA4MGMsIDB4MmIxMSwgMHgwMDRlLCAweDAxMTgsIDB4ODQyMCwgMHgxZjA0LCAweDJhOWMsCisJMHgwMTVlLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDE5OTAsIDB4MDgwNCwgMHgyNWEwLCAweDA4MDQsCisJMHgyNWEwLCAweDc3NzAsIDB4MDgwYywgMHgzYjZmLCAweDYwMTgsIDB4YTAwNSwgMHgwNTIwLCAweGQ3ZmMsCisJMHgxMTE4LCAweDIwMjEsIDB4OGNjMCwgMHgwMDEwLCAweDIwMjEsIDB4OGRkMCwgMHgyMDA5LCAweDAwMDUsCisJMHgyMDExLCAweDAwMjAsIDB4MDgwYywgMHgyYjExLCAweDAxYjAsIDB4MDE1NiwgMHgyMGE5LCAweDAxMDEsCisJMHhkN2ZjLCAweDExMTgsIDB4MjAyMSwgMHg4YmMwLCAweDAwMTAsIDB4MjAyMSwgMHg4Y2QwLCAweDAwNDYsCisJMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDIwLCAweDA0ZTEsIDB4MDA0ZSwgMHgwMTE4LCAweDg0MjAsCisJMHgxZjA0LCAweDJhY2YsIDB4MDE1ZSwgMHgwODA0LCAweDI1YTAsIDB4MjIwMCwgMHgwMDAyLCAweDJhZTIsCisJMHgyYWU0LCAweDJhZTQsIDB4MDgwYywgMHgyNTRjLCAweDIwMDksIDB4MDAxMiwgMHg3MDYwLCAweGEwODYsCisJMHgwMDAyLCAweDAxMTAsIDB4MjAwOSwgMHgwMDBlLCAweDY4MTgsIDB4ZDBmYywgMHgwMTA4LCAweDY5MWEsCisJMHg3MDYzLCAweDAwMDAsIDB4NzBkMCwgMHhjMGM1LCAweDcwZDIsIDB4MDgwNCwgMHgzYmU1LCAweDIyMDAsCisJMHgwMDAyLCAweDJhZmUsIDB4MmFlNCwgMHgyYWZjLCAweDA4MGMsIDB4MjU0YywgMHgwODBjLCAweDNmMjYsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxOTA0LCAweDM3NWQsIDB4MDgwYywgMHgzN2JlLCAweDYwMDgsCisJMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHgwODBjLCAweDM3NGYsIDB4MDkwNCwgMHgzNzVkLCAweDA4MDQsCisJMHgyNWEwLCAweDI0MDQsIDB4YTAwNSwgMHgwNTkwLCAweDIwNjgsIDB4MmQwNCwgMHgwMDA2LCAweDY4MTQsCisJMHhhNzA2LCAweDAxMTgsIDB4MmQyMCwgMHgwMDBlLCAweDBjYTgsIDB4MDAwZSwgMHgyMDIyLCAweDY5MWEsCisJMHg2ODE3LCAweDAwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDY4YjQsIDB4YTA4NCwgMHg1ZjAwLCAweDY4MWUsCisJMHg2ODIwLCAweGEwODQsIDB4MDBmZiwgMHhhMjA1LCAweDY4MjIsIDB4MDgwYywgMHgxZGEyLCAweDIwMjEsCisJMHg0NjAyLCAweDI0MWMsIDB4ODMxOSwgMHgyMzIyLCAweDYwMTAsIDB4ODAwMSwgMHg2MDEyLCAweDExMjgsCisJMHgyMDIxLCAweDQ2MDQsIDB4MjQwNCwgMHhjMGE1LCAweDIwMjIsIDB4NjAwOCwgMHhhMDg0LCAweGY5ZWYsCisJMHg2MDBhLCAweDA4MGMsIDB4MjY5ZSwgMHgwODBjLCAweDM3YmUsIDB4MDAwNSwgMHhhMDg1LCAweDAwMDEsCisJMHgwY2UwLCAweDIzMDAsIDB4MDAwMiwgMHgyYjUwLCAweDJiNGUsIDB4MmJjYiwgMHgwODBjLCAweDI1NGMsCisJMHg3OGU0LCAweGEwMDUsIDB4MTdiMCwgMHgzMjA4LCAweGExOGMsIDB4MDgwMCwgMHgwMTE4LCAweDAxMDQsCisJMHgyNTlkLCAweDAwMTAsIDB4MDMwNCwgMHgyNTlkLCAweDIwMDgsIDB4YTA4NCwgMHgwMDMwLCAweDExMTAsCisJMHgwODA0LCAweDMyMmEsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MGRkMCwgMHg3ODg0LCAweGQwZmMsCisJMHgxMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDkwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDQsCisJMHgxMTE4LCAweDIwMDEsIDB4MDAwMCwgMHgwMDUwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDUsCisJMHgwMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwMDAyLCAweDJiYWUsCisJMHgyYmI3LCAweDJiYTQsIDB4MmI4NywgMHgzYzI5LCAweDNjMjksIDB4MmI4NywgMHgyYmMxLCAweDA4MGMsCisJMHgyNTRjLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDExOTAsIDB4NzA2MCwgMHhhMDg2LCAweDAwMDIsCisJMHgxMTMwLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LCAweDAwMDAsIDB4MDgwNCwgMHgyYTU2LCAweDcwNjAsCisJMHhhMDg2LCAweDAwMDYsIDB4MGRiMCwgMHg3MDYwLCAweGEwODYsIDB4MDAwNCwgMHgwZDkwLCAweDc5ZTQsCisJMHgyMDAxLCAweDAwMDMsIDB4MDgwNCwgMHgyZjE4LCAweDY4MTgsIDB4ZDBmYywgMHgwMTEwLCAweDY4MWIsCisJMHgwMDFkLCAweDA4MGMsIDB4M2EzYywgMHg3ODFiLCAweDAwNmUsIDB4MDAwNSwgMHg2ODE4LCAweGQwZmMsCisJMHgwMTEwLCAweDY4MWIsIDB4MDAxZCwgMHgwODBjLCAweDNhM2MsIDB4MDgwNCwgMHgzYzA3LCAweDY4MTgsCisJMHhkMGZjLCAweDAxMTAsIDB4NjgxYiwgMHgwMDFkLCAweDA4MGMsIDB4M2EzYywgMHg3ODFiLCAweDAwZmEsCisJMHgwMDA1LCAweDY4MTgsIDB4ZDBmYywgMHgwMTEwLCAweDY4MWIsIDB4MDAxZCwgMHgwODBjLCAweDNhM2MsCisJMHg3ODFiLCAweDAwY2IsIDB4MDAwNSwgMHhhNTg0LCAweDAwMGYsIDB4MTFjMCwgMHg3MDAwLCAweDAwMDIsCisJMHgyNWEwLCAweDJiZDgsIDB4MmJkYSwgMHgzNzVkLCAweDM3NWQsIDB4Mzc1ZCwgMHgyYmQ4LCAweDJiZDgsCisJMHgwODBjLCAweDI1NGMsIDB4MDgwYywgMHgzN2JlLCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsCisJMHgwODBjLCAweDM3NGYsIDB4MDkwNCwgMHgzNzVkLCAweDA4MDQsIDB4MjVhMCwgMHg3OGU0LCAweGEwMDUsCisJMHgxYjA0LCAweDJiODksIDB4MzIwOCwgMHhhMThjLCAweDA4MDAsIDB4MDExOCwgMHgwMTA0LCAweDJiODksCisJMHgwMDEwLCAweDAzMDQsIDB4MmI4OSwgMHgyMDA4LCAweGEwODQsIDB4MDAzMCwgMHgxMTE4LCAweDc4MWIsCisJMHgwMDY4LCAweDAwMDUsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MGRjOCwgMHg3ODg0LCAweGQwZmMsCisJMHgxMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDkwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDQsCisJMHgxMTE4LCAweDIwMDEsIDB4MDAwMCwgMHgwMDUwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDUsCisJMHgwMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwMDAyLCAweDJjMjYsCisJMHgyYzJhLCAweDJjMjEsIDB4MmMxZiwgMHgzYzI5LCAweDNjMjksIDB4MmMxZiwgMHgzYzIzLCAweDA4MGMsCisJMHgyNTRjLCAweDA4MGMsIDB4M2E0MiwgMHg3ODFiLCAweDAwNmUsIDB4MDAwNSwgMHgwODBjLCAweDNhNDIsCisJMHgwODA0LCAweDNjMDcsIDB4MDgwYywgMHgzYTQyLCAweDc4MWIsIDB4MDBmYSwgMHgwMDA1LCAweDA4MGMsCisJMHgzYTQyLCAweDc4MWIsIDB4MDBjYiwgMHgwMDA1LCAweDIzMDAsIDB4MDAwMiwgMHgyYzNiLCAweDJjMzksCisJMHgyYzNkLCAweDA4MGMsIDB4MjU0YywgMHgwODA0LCAweDMzZTIsIDB4NjgxYiwgMHgwMDE2LCAweDc4YTMsCisJMHgwMDAwLCAweDc5ZTQsIDB4YTE4NCwgMHgwMDMwLCAweDA5MDQsIDB4MzNlMiwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDA5MDQsIDB4MzNlMiwgMHhhMTg0LCAweDAxMDAsIDB4MGQ5OCwgMHg3ODg0LCAweGQwZmMsCisJMHgxMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDkwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDQsCisJMHgxMTE4LCAweDIwMDEsIDB4MDAwMCwgMHgwMDUwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDUsCisJMHgwMTE4LCAweGExODQsIDB4MDAwNywgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwMDAyLCAweDJjNmYsCisJMHgyYzJhLCAweDJiYTQsIDB4M2JlNSwgMHgzYzI5LCAweDNjMjksIDB4M2JlNSwgMHgzYzIzLCAweDA4MGMsCisJMHgzYmYxLCAweDAwMDUsIDB4YTI4MiwgMHgwMDA1LCAweDAzMTAsIDB4MDgwYywgMHgyNTRjLCAweDc4OTgsCisJMHgyMDQwLCAweDIzMDAsIDB4MDAwMiwgMHgyYzdlLCAweDJlYTgsIDB4MmViMiwgMHgyMjAwLCAweDAwMDIsCisJMHgyYzlhLCAweDJjODcsIDB4MmM5YSwgMHgyYzg1LCAweDJlOGEsIDB4MDgwYywgMHgyNTRjLCAweDc4OWIsCisJMHgwMDE4LCAweDc4YTgsIDB4MjAxMCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDIwLCAweDBhMDQsCisJMHgzYTBiLCAweGEwOGEsIDB4MDAwNCwgMHgxYTA0LCAweDNhMGIsIDB4MDAwMiwgMHgzYTBiLCAweDNhMGIsCisJMHgzYTBiLCAweDM5YzEsIDB4Nzg5YiwgMHgwMDE4LCAweDc5YTgsIDB4YTE4NCwgMHgwMDgwLCAweDAxNDgsCisJMHgwODA0LCAweDNhMGIsIDB4NzAwMCwgMHhhMDA1LCAweDFkZDgsIDB4MjAxMSwgMHgwMDA0LCAweDA4MDQsCisJMHgzNTk0LCAweGExODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMTAsIDB4MWEwNCwgMHgzYTBiLCAweDAwMDIsCisJMHgyY2MyLCAweDJjYzAsIDB4MmNkNCwgMHgyY2Q4LCAweDJkODYsIDB4M2EwYiwgMHgzYTBiLCAweDJkODgsCisJMHgzYTBiLCAweDNhMGIsIDB4MmU4NiwgMHgyZTg2LCAweDNhMGIsIDB4M2EwYiwgMHgzYTBiLCAweDJlODgsCisJMHgwODBjLCAweDI1NGMsIDB4ZDZlNCwgMHgwMTQwLCAweDIwMDEsIDB4MDMwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg3ODNhLCAweDc4MWIsIDB4MDBjNywgMHgwMDA1LCAweDY4MTgsIDB4ZDBmYywgMHgwMTE4LCAweDY4MWIsCisJMHgwMDFkLCAweDBjOTAsIDB4MDgwNCwgMHgzYmU1LCAweDY4MWIsIDB4MDAxZCwgMHgwODA0LCAweDNhMzYsCisJMHg2OTIwLCAweDY5MjIsIDB4YTY4NCwgMHgxODAwLCAweDE5MDQsIDB4MmQyOSwgMHg2ODIwLCAweGQwODQsCisJMHgxOTA0LCAweDJkMzEsIDB4NjgxOCwgMHhhMDg2LCAweDAwMDgsIDB4MTExMCwgMHg2ODFiLCAweDAwMDAsCisJMHhkNmQ0LCAweDA1NjgsIDB4ZDZiYywgMHgwNTU4LCAweDcwODMsIDB4MDAwMCwgMHg2ODE4LCAweGEwODQsCisJMHgwMDNmLCAweGEwOGEsIDB4MDAwZCwgMHgwNzE4LCAweGEwOGEsIDB4MDAwYywgMHg3MTgyLCAweDIwMDEsCisJMHgwMDBjLCAweDgwMGMsIDB4NzE4NiwgMHg3ODliLCAweDAwNjEsIDB4NzhhYSwgMHgwMTU2LCAweDAxMzYsCisJMHgwMTQ2LCAweDAwMTYsIDB4MzIwOCwgMHhhMThjLCAweDA2MDAsIDB4MDExOCwgMHgyMGExLCAweDAyMmIsCisJMHgwMDEwLCAweDIwYTEsIDB4MDEyYiwgMHgwMDFlLCAweDc4OWIsIDB4MDAwMCwgMHg4MDAwLCAweDgwYWMsCisJMHhhZDgwLCAweDAwMGIsIDB4MjA5OCwgMHg1M2E2LCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDYwMzgsCisJMHhhMDA1LCAweDExNTAsIDB4NjgxYywgMHhhMDg0LCAweDAwMGUsIDB4MDkwNCwgMHgzYTM2LCAweDA4MGMsCisJMHgzYTQ4LCAweDc4MmIsIDB4MzAwOCwgMHgwMDEwLCAweDgwMDEsIDB4NjAzYSwgMHg3ODFiLCAweDAwNzEsCisJMHgwMDA1LCAweGQ2ZTQsIDB4MDEzMCwgMHg3ODFiLCAweDAwODMsIDB4MDAwNSwgMHg3ODFiLCAweDAwODMsCisJMHgwMDA1LCAweGE2ODQsIDB4MDA2MCwgMHgwZGQwLCAweGQ2ZGMsIDB4MGRjMCwgMHhkNmZjLCAweDAxYTAsCisJMHhjNmZjLCAweDdlNWEsIDB4NmViNiwgMHg3YWRjLCAweDc5ZDgsIDB4NzhkMCwgMHg4MDA3LCAweGEwODQsCisJMHgwMDdmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDZiOTgsIDB4MjEwMCwgMHhhMzAyLCAweDY4YjIsCisJMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLCAweGQ2ZjQsIDB4MDExOCwgMHhjNmY0LCAweDdlNWEsCisJMHg2ZWI2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDExNDgsIDB4MDAwNiwgMHgwODBjLCAweDNmMjYsCisJMHgwODBjLCAweDQxZDksIDB4MDAwZSwgMHg3ODFiLCAweDAwODAsIDB4MDAwNSwgMHhhMDA2LCAweDA4MGMsCisJMHg0MmI1LCAweDZhYjAsIDB4NjlhYywgMHg2Yzk4LCAweDZiOTQsIDB4MjIwMCwgMHhhMTA1LCAweDAxMjAsCisJMHgyMjAwLCAweGE0MjIsIDB4MjEwMCwgMHhhMzFiLCAweDZjYWEsIDB4N2NkMiwgMHg3Y2RhLCAweDZiYTYsCisJMHg3YmQ2LCAweDdiZGUsIDB4MjMwMCwgMHhhNDA1LCAweDExMzAsIDB4YzZmNSwgMHg3ZTVhLCAweDZlYjYsCisJMHg3ODFiLCAweDAwODAsIDB4MDAwNSwgMHg3ODFiLCAweDAwODAsIDB4MjIwMCwgMHhhMTE1LCAweDExMTgsCisJMHgwODBjLCAweDQxZDksIDB4MDAwNSwgMHgwODBjLCAweDQyMDYsIDB4MDAwNSwgMHgwODBjLCAweDI1NGMsCisJMHgwODA0LCAweDJlMWMsIDB4MDBjNiwgMHg3MDU0LCAweDIwNjAsIDB4NjkyMCwgMHhhMThjLCAweGVjZmYsCisJMHg2OTIyLCAweDYwMDAsIDB4YTA4NCwgMHhjZmRmLCAweDYwMDIsIDB4MDgwYywgMHgzOGY0LCAweGEwMDYsCisJMHgyMDQwLCAweDIwMzgsIDB4MDgwYywgMHgzOTljLCAweDA4MDQsIDB4MmUxMCwgMHgwMGM2LCAweDcwNTQsCisJMHgyMDYwLCAweDJjNDgsIDB4N2FhOCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA0LCAweDExZDgsCisJMHg2OTIwLCAweGQxZTQsIDB4MTE3MCwgMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDAwLCAweDIwMzEsCisJMHgwMDAwLCAweGEwMDYsIDB4MjAxMCwgMHgwODBjLCAweDM4ZjcsIDB4MDgwYywgMHgzOTljLCAweDA4MDQsCisJMHgyZTEwLCAweGExOGMsIDB4ZWNmZiwgMHg2OTIyLCAweDYxMDQsIDB4YTE4YywgMHhmZmRkLCAweDYxMDYsCisJMHg2MDAwLCAweGMwYWMsIDB4NjAwMiwgMHhhMjg2LCAweDAwMDMsIDB4MDFkMCwgMHg2MTA0LCAweGExODQsCisJMHgwMDEwLCAweDA1NDgsIDB4MDgwYywgMHgzYjZiLCAweDA4MGMsIDB4Mzk3NywgMHg4OGZmLCAweDA1MTgsCisJMHgwMGNlLCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhjNjk1LCAweDdlNWEsCisJMHhkNmQ0LCAweDExMTgsIDB4NzgxYiwgMHgwMDZlLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsCisJMHg2OTIwLCAweGQxY2MsIDB4MDEzMCwgMHhhMThjLCAweGZkZmYsIDB4NjkyMiwgMHg2MDAwLCAweGMwZWMsCisJMHg2MDAyLCAweDIwMzksIDB4MDAwMCwgMHgyMDQxLCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweGEwMDYsCisJMHgyMDEwLCAweDA4MGMsIDB4Mzk5YywgMHhhMjg2LCAweDAwMDEsIDB4MDE1OCwgMHg2MTA0LCAweGExODQsCisJMHgwMDA4LCAweDAxYjAsIDB4MDgwYywgMHgzYjZiLCAweDA4MGMsIDB4Mzg5NSwgMHg4OGZmLCAweDE5ODAsCisJMHgwMDc4LCAweDY5MjAsIDB4ZDFjNCwgMHgwMTMwLCAweGExOGMsIDB4ZmVmZiwgMHg2OTIyLCAweDYwMDAsCisJMHhjMGU0LCAweDYwMDIsIDB4MjAzMSwgMHgwMDAwLCAweGEwMDYsIDB4MjAxMCwgMHgwODBjLCAweDM4ZjcsCisJMHgwMGNlLCAweDdlNTgsIDB4ZDZkNCwgMHgxMTE4LCAweDc4MWIsIDB4MDA3MSwgMHgwMDA1LCAweDc4MWIsCisJMHgwMDgzLCAweDAwMDUsIDB4MDgwNCwgMHgzYTMyLCAweDI4MDgsIDB4Nzg5YiwgMHgwMDgwLCAweDIwMTksCisJMHgwMDgwLCAweDc4YTgsIDB4YTA5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwMSwgMHgxMWI4LCAweDIzMDAsCisJMHhhMTAyLCAweGEwODYsIDB4MDAwMSwgMHgwOTA0LCAweDJkOGEsIDB4N2NhOCwgMHhhNGE0LCAweDAwZmYsCisJMHhhNDgwLCAweDAwMDIsIDB4YTMwMCwgMHgyMDE4LCAweGExMDIsIDB4MGEwNCwgMHgyZDllLCAweDA5MDQsCisJMHgyZDllLCAweDI0YTgsIDB4N2FhOCwgMHgxZjA0LCAweDJlM2EsIDB4MGMxOCwgMHhhMjg0LCAweDAwZjAsCisJMHhhMDgyLCAweDAwMjAsIDB4MDZiOCwgMHgyMjAwLCAweGEwODIsIDB4MDAyMSwgMHgxNjk4LCAweDdhYTgsCisJMHg4MzE4LCAweDgzMTgsIDB4MjEwMCwgMHhhMzAyLCAweDBhYTAsIDB4YTI4NiwgMHgwMDIzLCAweDA5NTAsCisJMHg2ODFjLCAweGEwODQsIDB4ZmZmMSwgMHg2ODFlLCAweDdlNTgsIDB4YTY4NCwgMHhmZmYxLCAweGMwYTUsCisJMHgyMDMwLCAweDdlNWEsIDB4NjAwOCwgMHhjMGE1LCAweDYwMGEsIDB4NzhhMCwgMHg4MDAxLCAweDA5MDQsCisJMHgyZTEwLCAweDIwYTgsIDB4Nzk5OCwgMHg3ODliLCAweDAwNjAsIDB4NzhhYSwgMHgyMDExLCAweDAwODAsCisJMHg3OTlhLCAweDc4YTgsIDB4Nzk5OCwgMHg3YTlhLCAweDc4YWEsIDB4N2E5OCwgMHgxZjA0LCAweDJlNjgsCisJMHhjNjk1LCAweDdlNWEsIDB4ZDZkNCwgMHgxMTE4LCAweDc4MWIsIDB4MDA2ZSwgMHgwMDA1LCAweDc4MWIsCisJMHgwMDgyLCAweDAwMDUsIDB4ODMxOCwgMHgyMTAwLCAweGEzMDIsIDB4MGEwNCwgMHgyZTIxLCAweGEyODQsCisJMHgwMDgwLCAweDE5MDQsIDB4M2EzNiwgMHg3OGEwLCAweGEwMDUsIDB4MDhjOCwgMHgwODA0LCAweDNhMzYsCisJMHgwODA0LCAweDNhMGIsIDB4NzA1NCwgMHhhMDRkLCAweDc4OWIsIDB4MDAxOCwgMHg3OGE4LCAweGEwODQsCisJMHgwMGZmLCAweGEwOGUsIDB4MDAwMSwgMHgwMTEwLCAweDA4MGMsIDB4MjU0YywgMHg3YWE4LCAweGEyOTQsCisJMHgwMGZmLCAweDc4NGIsIDB4MDAwOCwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDUsCisJMHgxYTA0LCAweDNhMGIsIDB4MDAwMiwgMHgzYTBiLCAweDM4MGMsIDB4M2EwYiwgMHgzOTI3LCAweDNkMzEsCisJMHhhMjgyLCAweDAwMDAsIDB4MTExMCwgMHgwODBjLCAweDI1NGMsIDB4MDgwYywgMHgzYTNjLCAweDc4MWIsCisJMHgwMDgyLCAweDAwMDUsIDB4YTI4MiwgMHgwMDAzLCAweDExMTAsIDB4MDgwYywgMHgyNTRjLCAweGQ0ZmMsCisJMHgxMWQwLCAweDcwNjAsIDB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4MjU0YywgMHg2ZjE0LCAweDc3NzIsCisJMHhhN2JjLCAweDhmMDAsIDB4MDgwYywgMHgzYjZmLCAweDYwMDgsIDB4YTA4NSwgMHgwMDIxLCAweDYwMGEsCisJMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgxZGIwLCAweDA4MGMsIDB4M2EzZiwgMHg3MDYzLCAweDAwMDIsCisJMHg3MDFmLCAweDAwMDksIDB4MDAxMCwgMHgwODBjLCAweDNhNGIsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsCisJMHhhMjgyLCAweDAwMDQsIDB4MDMxMCwgMHgwODBjLCAweDI1NGMsIDB4MjMwMCwgMHgwMDAyLCAweDJlZTIsCisJMHgzMDc4LCAweDMwYjQsIDB4YTI4NiwgMHgwMDAzLCAweDA1OTgsIDB4NzIwMCwgMHg3Y2Q4LCAweDdkZGMsCisJMHg3ZmQwLCAweDcxZDAsIDB4ZDFiNCwgMHgwNTI4LCAweGQxYmMsIDB4MTUxOCwgMHgyMDAxLCAweDQ2MDEsCisJMHgyMDA0LCAweGQwYzQsIDB4MTFmMCwgMHg3ODY4LCAweGEwODQsIDB4MDBmZiwgMHgxMWQwLCAweGEyODIsCisJMHgwMDAyLCAweDEyYjgsIDB4MDBkNiwgMHg3ODNiLCAweDgzMDAsIDB4NzgxYiwgMHgwMDU5LCAweDcwYjgsCisJMHhhMDZkLCAweDY4YjQsIDB4Nzg1YSwgMHg2ODk0LCAweDc4ZDYsIDB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsCisJMHg3OGRhLCAweGMxYjQsIDB4NzFkMiwgMHg3MDAzLCAweDAwMzAsIDB4MDBkZSwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDU4LCAweDc4M2IsIDB4MTMwMCwgMHg3ODFiLCAweDAwNTcsIDB4MjAwMSwgMHgwMDAwLCAweDAwMjAsCisJMHg3MjAwLCAweDdjZDgsIDB4N2RkYywgMHg3ZmQwLCAweDcwNDYsIDB4NjhhMCwgMHhkMGVjLCAweDAxMTgsCisJMHg2MDA4LCAweGMwOGQsIDB4NjAwYSwgMHhhMjg0LCAweDAwMGYsIDB4MDAwMiwgMHgzMDU5LCAweDJmMzMsCisJMHgyZjMwLCAweDMxODQsIDB4MzIwZiwgMHgyNWEwLCAweDJmMmUsIDB4MmYyZSwgMHgwODBjLCAweDI1NGMsCisJMHg2MDA4LCAweGMwZDQsIDB4NjAwYSwgMHhkNmU0LCAweDAxMjAsIDB4NzA0NCwgMHhhMDg2LCAweDAwMTQsCisJMHgxMWU4LCAweDA4MGMsIDB4M2YyNiwgMHgyMDA5LCAweDAwMDAsIDB4NjgxOCwgMHhkMGZjLCAweDAxMDgsCisJMHg3MDQ0LCAweGEwODYsIDB4MDAxNCwgMHgwMTY4LCAweDY4MTgsIDB4YTA4NiwgMHgwMDA4LCAweDE5MDQsCisJMHgzMDFiLCAweDc4NTgsIDB4ZDA5YywgMHgwOTA0LCAweDMwMWIsIDB4NjgyMCwgMHhkMGFjLCAweDA5MDQsCisJMHgzMDFiLCAweDY4MWIsIDB4MDAxNCwgMHgyMDA5LCAweDAwMDIsIDB4MDRhOCwgMHg3ODY4LCAweGEwOGMsCisJMHgwMGZmLCAweDA1ODgsIDB4YTE4NiwgMHgwMDA4LCAweDExNTgsIDB4NjAwOCwgMHhjMGE0LCAweDYwMGEsCisJMHgwODBjLCAweDM3NGYsIDB4MDU0MCwgMHgwODBjLCAweDM3YmUsIDB4MDgwYywgMHgzZjI2LCAweDAwNjAsCisJMHhhMTg2LCAweDAwMjgsIDB4MTUwMCwgMHg2MDE4LCAweGEwMDUsIDB4MGQ3OCwgMHg4MDAxLCAweDBkNjgsCisJMHg4MDAxLCAweDBkNTgsIDB4NjAxZSwgMHgwYzQ4LCAweDY4MjAsIDB4ZDA4NCwgMHgwOTA0LCAweDI1YTAsCisJMHhjMDg0LCAweDY4MjIsIDB4MDgwYywgMHgyNjkzLCAweDcwNTgsIDB4MDBjNiwgMHgyMDYwLCAweDY4MDAsCisJMHg2MDAyLCAweDAwY2UsIDB4NjAwNCwgMHg2ODAyLCAweGEwMDUsIDB4MmQwMCwgMHgxMTA4LCAweDYwMDIsCisJMHg2MDA2LCAweDA4MDQsIDB4MjVhMCwgMHgwMDE2LCAweDgxZmYsIDB4MTVmMCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDMwLCAweDA1ZDAsIDB4NzFkMCwgMHhkMWJjLCAweDE1YjgsIDB4ZDFiNCwgMHgxMWU4LCAweDcwNWMsCisJMHhhMDA1LCAweDE1OTAsIDB4NzBhMCwgMHhhMDg2LCAweDAwMDEsIDB4MDU3MCwgMHg3MDAzLCAweDAwMDAsCisJMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMDY2LCAweDAwYzYsIDB4MDBkNiwgMHgwODBjLCAweDI1YzUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHg3MWQwLCAweGQxYjQsCisJMHgxMWQ4LCAweDcwMDMsIDB4MDA0MCwgMHgwMGMwLCAweDA4MGMsIDB4M2MzMywgMHgxMWE4LCAweDc4MWIsCisJMHgwMDY4LCAweDAwZDYsIDB4NzBiOCwgMHhhMDZkLCAweDY4YjQsIDB4Nzg1YSwgMHg2ODk0LCAweDc4ZDYsCisJMHg3OGRlLCAweDY4OTgsIDB4NzhkMiwgMHg3OGRhLCAweGMxYjQsIDB4NzFkMiwgMHg3MDAzLCAweDAwMzAsCisJMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHgwMGRlLCAweDA4MGMsIDB4MzBkYywgMHgwMDFlLCAweDgxZmYsCisJMHgwOTA0LCAweDMwMWIsIDB4YTY4NCwgMHhkZjAwLCAweDY4MWUsIDB4NjgyYiwgMHgwMDAwLCAweDZmMTQsCisJMHhhMTg2LCAweDAwMDIsIDB4MTkwNCwgMHgzMDFjLCAweDY4MTgsIDB4YTA4NiwgMHgwMDE0LCAweDExMzAsCisJMHgyMDA4LCAweGQ2ZTQsIDB4MDExOCwgMHg3ODY4LCAweGEwOGMsIDB4MDBmZiwgMHgwODBjLCAweDNhNTUsCisJMHgwODBjLCAweDI2OWUsIDB4NjgyMCwgMHhkMGRjLCAweDE1NzgsIDB4ODcxNywgMHhhMjk0LCAweDAwMGYsCisJMHg4MjEzLCAweDgyMTMsIDB4ODIxMywgMHhiMjg0LCAweDA2MDAsIDB4MDExOCwgMHhhMjkwLCAweDRhYzAsCisJMHgwMDEwLCAweGEyOTAsIDB4NGI0MCwgMHhhMjkwLCAweDAwMDAsIDB4MjIxYywgMHhkM2M0LCAweDAxNzAsCisJMHg2ODIwLCAweGQwZTQsIDB4MDEyOCwgMHhhMDg0LCAweGVmZmYsIDB4NjgyMiwgMHhjM2FjLCAweDIzMTIsCisJMHg4MjEwLCAweDIyMDQsIDB4YTA4NSwgMHgwMDM4LCAweDIwMTIsIDB4ODIxMSwgMHhkM2Q0LCAweDAxMzgsCisJMHg2OGEwLCAweGQwYzQsIDB4MTEyMCwgMHgwODBjLCAweDMxNDQsIDB4MDgwNCwgMHgyNWEwLCAweDYwMDgsCisJMHhjMDhkLCAweDYwMGEsIDB4MDAwOCwgMHg2OTJhLCAweDY5MTYsIDB4NjgxOCwgMHhkMGZjLCAweDAxMTAsCisJMHg3MDQ0LCAweDY4MWEsIDB4YTY4YywgMHhkZjAwLCAweDY5MWUsIDB4NjQxMCwgMHg4NGZmLCAweDAxNjgsCisJMHgyMDA5LCAweDQ2MDIsIDB4MjEwNCwgMHg4MDAxLCAweDIwMGEsIDB4ODQyMSwgMHg2NDEyLCAweDExMjgsCisJMHgyMDIxLCAweDQ2MDQsIDB4MjQwNCwgMHhjMGE1LCAweDIwMjIsIDB4NjAxOCwgMHhhMDA1LCAweDAxMTgsCisJMHg4MDAxLCAweDYwMWEsIDB4MTExOCwgMHg2MDA4LCAweGMwYTQsIDB4NjAwYSwgMHg2ODIwLCAweGQwODQsCisJMHgxMTMwLCAweDY4MDAsIDB4YTAwNSwgMHgxMTA4LCAweDYwMDIsIDB4NjAwNiwgMHgwMDIwLCAweDcwNTgsCisJMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgyMDYxLCAweDQ2MDAsIDB4Njg4NywgMHgwMTAzLCAweDJkMDgsCisJMHgyMDZiLCAweDAwMDAsIDB4NjA2OCwgMHhhMDA1LCAweDYxNmEsIDB4MDExMCwgMHgyZDAyLCAweDAwMDgsCisJMHg2MTZlLCAweDcyMDAsIDB4YTI4NiwgMHgwMDMwLCAweDAxNTgsIDB4YTI4NiwgMHgwMDQwLCAweDE5MDQsCisJMHgyNWEwLCAweDcwMDMsIDB4MDAwMiwgMHg3MDQ4LCAweDIwNjgsIDB4NjhjNCwgMHgyMDYwLCAweDAwMDUsCisJMHg3MDAzLCAweDAwMDIsIDB4NzBiOCwgMHhhMDZkLCAweDY4YmMsIDB4NzAzZSwgMHg3MGI0LCAweGEwNjUsCisJMHg2OGMwLCAweDcwNTYsIDB4MmQwMCwgMHg3MDRhLCAweGFkODAsIDB4MDAwOSwgMHg3MDQyLCAweDAwMDUsCisJMHhhMjgyLCAweDAwMDQsIDB4MDIxMCwgMHgwODBjLCAweDI1NGMsIDB4MjIwMCwgMHgwMDAyLCAweDMwODMsCisJMHgzMDkyLCAweDMwOWUsIDB4MzA5MiwgMHhhNTg2LCAweDEzMDAsIDB4MDE2MCwgMHhhNTg2LCAweDgzMDAsCisJMHgxZDkwLCAweDcwMDMsIDB4MDAwMCwgMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHg2MDA4LCAweGEwODQsCisJMHhmYmVmLCAweDYwMGEsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDUsIDB4MDEyOCwgMHgwODBjLCAweDNhM2MsCisJMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHg3ODFiLCAweDAwODMsIDB4MDAwNSwgMHg3ODkwLCAweDgwMDcsCisJMHg4MDAxLCAweGEwODQsIDB4MDAwNywgMHhhMDgwLCAweDAwMTgsIDB4Nzg5YSwgMHg3OWE4LCAweGExOGMsCisJMHgwMGZmLCAweGExODYsIDB4MDAwMywgMHgwMTI4LCAweGExODYsIDB4MDAwMCwgMHgwMTEwLCAweDA4MDQsCisJMHgzYTBiLCAweDc4MWIsIDB4MDA4MywgMHgwMDA1LCAweDY4MjAsIDB4YzA5NSwgMHg2ODIyLCAweDgyZmYsCisJMHgxMTE4LCAweDA4MGMsIDB4M2EzYywgMHgwMDMwLCAweDgyMTEsIDB4MDExMCwgMHgwODBjLCAweDI1NGMsCisJMHgwODBjLCAweDNhNGIsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4MDgwYywgMHgzYzQ2LCAweDc4MzAsCisJMHhhMDg0LCAweDAwYzAsIDB4MTE3MCwgMHgwMDE2LCAweDMyMDgsIDB4YTE4YywgMHgwODAwLCAweDAwMWUsCisJMHgwMTE4LCAweDAxMDQsIDB4MzBkOSwgMHgwMDEwLCAweDAzMDQsIDB4MzBkOSwgMHg3OTFhLCAweGEwMDYsCisJMHgwMDA1LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweGE2ODQsIDB4MDA2MCwgMHgxMTMwLCAweDY4MmYsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwODA0LCAweDMxNDMsIDB4ZDZkYywgMHgxMTk4LCAweDY4YjQsCisJMHhkMGRjLCAweDExODAsIDB4Njk5OCwgMHg2YTk0LCAweDY5MmUsIDB4NmEzMiwgMHg3MDQ0LCAweGEwMDUsCisJMHgxMTMwLCAweDIyMDAsIDB4YTEwNSwgMHgwOTA0LCAweDNmMjYsIDB4NzA0NywgMHgwMDE1LCAweDA4MDQsCisJMHgzZjI2LCAweDAwMDUsIDB4ZDZhYywgMHgwMWYwLCAweGQ2ZjQsIDB4MDEzMCwgMHg2ODJmLCAweDAwMDAsCisJMHg2ODMzLCAweDAwMDAsIDB4MDgwNCwgMHgzZjI2LCAweDY4YjQsIDB4YTA4NCwgMHg0MDAwLCAweGE2MzUsCisJMHhkNmY0LCAweDFkYTAsIDB4NzA0NCwgMHhhMDA1LCAweDExMTAsIDB4NzA0NywgMHgwMDE1LCAweGQ2ZGMsCisJMHgxMTI4LCAweDY4YjQsIDB4ZDBkYywgMHgwMTEwLCAweDZjYTgsIDB4NmRhNCwgMHg2YzJlLCAweDZkMzIsCisJMHgwODA0LCAweDNmMjYsIDB4ZDZmNCwgMHgwMTMwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsCisJMHgwODA0LCAweDNmMjYsIDB4NjhiNCwgMHhhMDg0LCAweDQ4MDAsIDB4YTYzNSwgMHhkNmY0LCAweDFkYTAsCisJMHg3MDQ0LCAweGEwMDUsIDB4MTExMCwgMHg3MDQ3LCAweDAwMTUsIDB4MjQwOCwgMHgyNTEwLCAweDI3MDAsCisJMHg4MDA3LCAweGEwODQsIDB4MDA3ZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2OTJlLCAweDZhMzIsCisJMHgyMTAwLCAweGEyMDUsIDB4MTExMCwgMHgwODA0LCAweDNmMjYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDYsCisJMHgwMTEwLCAweDA4MDQsIDB4M2YyNiwgMHgwMDA1LCAweDY5NDYsIDB4NjAwOCwgMHhjMGNkLCAweGQzY2MsCisJMHgwMTA4LCAweGMwOGQsIDB4NjAwYSwgMHg2ODE4LCAweDY4M2EsIDB4NjgxYiwgMHgwMDA2LCAweDY4OGYsCisJMHgwMDAwLCAweDY4OTMsIDB4MDAwMCwgMHg2YTMwLCAweDY5MmMsIDB4NmEzZSwgMHg2OTQyLCAweDY4MmYsCisJMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM3LCAweDAwMjAsIDB4Njg5NywgMHgwMDAwLCAweDY4OWIsCisJMHgwMDIwLCAweDcwMDAsIDB4MDAwMiwgMHgyNWEwLCAweDMxNzMsIDB4MzE2ZCwgMHgzMTZiLCAweDMxNmIsCisJMHgzMTZiLCAweDMxNmIsIDB4MzE2YiwgMHgwODBjLCAweDI1NGMsIDB4NjgyMCwgMHhkMDg0LCAweDExMTgsCisJMHgwODBjLCAweDM3YTQsIDB4MDAzMCwgMHg3MDU4LCAweDJjNTAsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsCisJMHgyYTYwLCAweGFlYTAsIDB4MDAxNywgMHgyNDA0LCAweGEwMDUsIDB4MDExMCwgMHgyMDIwLCAweDBjZDgsCisJMHgyZDIyLCAweDIwNmIsIDB4MDAwMCwgMHgwMDA1LCAweDA4MGMsIDB4MzdhYSwgMHgwODBjLCAweDM3YmUsCisJMHg2MDA4LCAweGMwY2MsIDB4NjAwYSwgMHg2ODJiLCAweDAwMDAsIDB4Nzg5YiwgMHgwMDBlLCAweDZmMTQsCisJMHg2OTM4LCAweDY5MWEsIDB4Njk0NCwgMHg2OTE2LCAweDIwMDksIDB4MDAwMCwgMHhhZTg2LCAweDQ2NDAsCisJMHgwMTEwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDQyZWMsIDB4ZDZkYywgMHgwMWM4LCAweDY5MWMsCisJMHhjMWVkLCAweDY5MWUsIDB4NjgyOCwgMHhhMDgyLCAweDAwMGUsIDB4MDI5MCwgMHg2ODQ4LCAweGEwODQsCisJMHgwMDBmLCAweGEwODYsIDB4MDAwYiwgMHgxMTYwLCAweDY4NWMsIDB4YTA4NiwgMHgwMDQ3LCAweDExNDAsCisJMHgyMDAxLCAweDQ2MDEsIDB4MjAwNCwgMHhkMGFjLCAweDExMTgsIDB4MjcwMCwgMHgwODBjLCAweDI0NzUsCisJMHg2ODE4LCAweGQwZmMsIDB4MDE0MCwgMHg2ODFiLCAweDAwMDAsIDB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsCisJMHgwMTEwLCAweDY4MWIsIDB4MDAxZSwgMHhhZWEwLCAweDAwMTcsIDB4NjgwMCwgMHgyMDIyLCAweDZhM2MsCisJMHg2OTQwLCAweDZhMzIsIDB4NjkyZSwgMHg2OGMwLCAweDIwNjAsIDB4NjAwMCwgMHhkMGE0LCAweDA1ODAsCisJMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgwMGQ2LCAweDAwZjYsCisJMHgwMTU2LCAweDAxNDYsIDB4MjA3OSwgMHg0NjAwLCAweDA4MGMsIDB4MWI5MywgMHgwMTRlLCAweDAxNWUsCisJMHgwMGZlLCAweDcwYzgsIDB4MjAxMCwgMHgyMDA5LCAweDAxMDEsIDB4MDAyNiwgMHgyMjA0LCAweGEwNmQsCisJMHgwMTQwLCAweDY4MTQsIDB4YTcwNiwgMHgwMTEwLCAweDY4MDAsIDB4MGNjOCwgMHg2ODIwLCAweGMwZDUsCisJMHg2ODIyLCAweDAwMmUsIDB4ODIxMCwgMHg4MTA5LCAweDFkODAsIDB4MDBkZSwgMHg3MDYzLCAweDAwMDMsCisJMHg3MDdiLCAweDAwMDAsIDB4Nzc3MiwgMHg3MDdmLCAweDAwMGYsIDB4NzFkMCwgMHhjMWM0LCAweDcxZDIsCisJMHg2ODE4LCAweGEwODYsIDB4MDAwMiwgMHgxMTM4LCAweDY4MTcsIDB4MDAwMCwgMHg2ODJiLCAweDAwMDAsCisJMHg2ODFjLCAweGMwZWMsIDB4NjgxZSwgMHgwODBjLCAweDFkYTIsIDB4MDgwNCwgMHgyNWEwLCAweDdjZDgsCisJMHg3ZGRjLCAweDdmZDAsIDB4MDgwYywgMHgzMGRjLCAweDY4MmIsIDB4MDAwMCwgMHg3ODliLCAweDAwMGUsCisJMHg2ZjE0LCAweDA4MGMsIDB4M2M0YSwgMHhhMDhjLCAweDAwZmYsIDB4NjkxNiwgMHg2ODE4LCAweGQwZmMsCisJMHgwMTEwLCAweDcwNDQsIDB4NjgxYSwgMHhhNjhjLCAweGRmMDAsIDB4NjkxZSwgMHg3MDYzLCAweDAwMDAsCisJMHgwODA0LCAweDI1YTAsIDB4NzAwMCwgMHhhMDA1LCAweDExMTAsIDB4MDgwNCwgMHgyNWEwLCAweGEwMDYsCisJMHgwODBjLCAweDNmMjYsIDB4NjkyMCwgMHhkMWFjLCAweDExMTAsIDB4NjgxYiwgMHgwMDE0LCAweGE2OGMsCisJMHhkZjAwLCAweDY5MWUsIDB4NjgyYiwgMHgwMDAwLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLCAweDY4MjIsCisJMHg3MDAwLCAweDAwMDIsIDB4MjVhMCwgMHgzMjRjLCAweDMyNGMsIDB4MzI0ZiwgMHgzMjRmLCAweDMyNGYsCisJMHgzMjRhLCAweDMyNGEsIDB4MDgwYywgMHgyNTRjLCAweDY4MTgsIDB4MDgwNCwgMHgyZjE4LCAweDYwMDgsCisJMHhjMGE0LCAweDYwMGEsIDB4NjgxNywgMHgwMDAwLCAweDA4MDQsIDB4Mzc3MiwgMHgyMzAwLCAweDAwMDIsCisJMHgzMjViLCAweDMyNWQsIDB4MzJhYiwgMHgwODBjLCAweDI1NGMsIDB4ZDZmYywgMHgxOTA0LCAweDJkMzgsCisJMHg3MDAwLCAweGEwMGQsIDB4MDAwMiwgMHgyNWEwLCAweDMyNmQsIDB4MzI2ZCwgMHgzMjk3LCAweDMyNmQsCisJMHgzMmE4LCAweDMyNmIsIDB4MzI2YiwgMHgwODBjLCAweDI1NGMsIDB4YTY4NCwgMHgwMDYwLCAweDA1MzgsCisJMHhhMDg2LCAweDAwNjAsIDB4MTUxMCwgMHhjNmFjLCAweGM2ZjQsIDB4YzZlZCwgMHg3ZTVhLCAweDZlYjYsCisJMHg2ODFjLCAweGMwYWMsIDB4NjgxZSwgMHhhMTg2LCAweDAwMDIsIDB4MDE0OCwgMHgwODBjLCAweDNmMjYsCisJMHg2OWFjLCAweDY4YjAsIDB4YTExNSwgMHgwMTE4LCAweDA4MGMsIDB4NDIwNiwgMHgwMDEwLCAweDA4MGMsCisJMHg0MWQ5LCAweDc4MWIsIDB4MDA4MywgMHg3MWQwLCAweGQxYjQsIDB4MTkwNCwgMHgyNTlkLCAweDcwYTAsCisJMHhhMDg2LCAweDAwMDEsIDB4MTkwNCwgMHgyNWUxLCAweDAwMDUsIDB4ZDZlYywgMHgwOWYwLCAweDY4MTgsCisJMHhkMGZjLCAweDAxNzAsIDB4ZDZmNCwgMHgxMTMwLCAweDY4MWIsIDB4MDAxNSwgMHg3ODFiLCAweDAwODMsCisJMHgwODA0LCAweDI1OWQsIDB4NjgxYiwgMHgwMDA3LCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsCisJMHgwODBjLCAweDNiZjEsIDB4MDAwNSwgMHgwODBjLCAweDI1NGMsIDB4MjMwMCwgMHgwMDAyLCAweDMyYjQsCisJMHgzMmQ2LCAweDMzMmUsIDB4MDgwYywgMHgyNTRjLCAweDcwMDAsIDB4MDAwMiwgMHgzMmJlLCAweDMyYzAsCisJMHgzMmM3LCAweDMyYmUsIDB4MzJiZSwgMHgzMmJlLCAweDMyYmUsIDB4MzJiZSwgMHgwODBjLCAweDI1NGMsCisJMHg2OWFjLCAweDY4YjAsIDB4YTExNSwgMHgwMTE4LCAweDA4MGMsIDB4NDIwNiwgMHgwMDEwLCAweDA4MGMsCisJMHg0MWQ5LCAweDY4MWMsIDB4YzBiNCwgMHg2ODFlLCAweDcwZDAsIDB4ZDBiNCwgMHgxOTA0LCAweDI1OWQsCisJMHg3MGEwLCAweGEwODYsIDB4MDAwMSwgMHgxOTA0LCAweDI1ZTEsIDB4MDAwNSwgMHhkNmZjLCAweDE5MDQsCisJMHgzMzFlLCAweDcwMDAsIDB4YTAwZCwgMHgwMDAyLCAweDI1YTAsIDB4MzJlYywgMHgzMmU2LCAweDMzMTYsCisJMHgzMmVjLCAweDMzMWIsIDB4MzJlNCwgMHgzMmU0LCAweDA4MGMsIDB4MjU0YywgMHg2ODk0LCAweDc4ZDYsCisJMHg3OGRlLCAweDY4OTgsIDB4NzhkMiwgMHg3OGRhLCAweGE2ODQsIDB4MDA2MCwgMHgwNTM4LCAweGEwODYsCisJMHgwMDYwLCAweDE1MTAsIDB4YTZiNCwgMHhiZmJmLCAweGM2ZWQsIDB4N2U1YSwgMHg2ZWI2LCAweGExODYsCisJMHgwMDAyLCAweDAxNDgsIDB4MDgwYywgMHgzZjI2LCAweDY5YWMsIDB4NjhiMCwgMHhhMTE1LCAweDAxMTgsCisJMHgwODBjLCAweDQyMDYsIDB4MDAxMCwgMHgwODBjLCAweDQxZDksIDB4NzgxYiwgMHgwMDgzLCAweDY4MWMsCisJMHhjMGI0LCAweDY4MWUsIDB4NzFkMCwgMHhkMWI0LCAweDE5MDQsIDB4MjU5ZCwgMHg3MGEwLCAweGEwODYsCisJMHgwMDAxLCAweDE5MDQsIDB4MjVlMSwgMHgwMDA1LCAweGQ2ZWMsIDB4MDlmMCwgMHg2ODE4LCAweGQwZmMsCisJMHgwMTEwLCAweDY4MWIsIDB4MDAwNywgMHg3ODFiLCAweDAwZmIsIDB4MDAwNSwgMHhjNmZjLCAweDdlNWEsCisJMHg3YWRjLCAweDc5ZDgsIDB4NmI5OCwgMHgyMTAwLCAweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsCisJMHhhMzAzLCAweDY4YWUsIDB4NzlkMiwgMHg3ODFiLCAweDAwODMsIDB4MDAwNSwgMHhkNmRjLCAweDAxMzAsCisJMHg3ODJiLCAweDMwMDksIDB4NzgxYiwgMHgwMDgzLCAweDA4MDQsIDB4MjU5ZCwgMHg3ODg0LCAweGMwYWMsCisJMHg3ODg2LCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LCAweDExNTAsIDB4YTQ4NCwgMHgwMjAwLCAweDAxMDgsCisJMHhjNmY1LCAweGM2ZGQsIDB4N2U1YSwgMHg3ODFiLCAweDAwODMsIDB4MDgwNCwgMHgyNTlkLCAweDY4MjAsCisJMHhjMDk1LCAweDY4MjIsIDB4MDgwYywgMHgzYmRjLCAweGM2ZGQsIDB4MDgwYywgMHgzYTNjLCAweDc4MWIsCisJMHgwMDgyLCAweDA4MDQsIDB4MjU5ZCwgMHgyMzAwLCAweDAwMDIsIDB4MzM1OCwgMHgzMzVhLCAweDMzNWMsCisJMHgwODBjLCAweDI1NGMsIDB4MDgwNCwgMHgzYTM2LCAweDdkOTgsIDB4ZDZkNCwgMHgxNWE4LCAweDc5ZTQsCisJMHhkMWFjLCAweDAxMzAsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDExMCwgMHg3ODJiLCAweDMwMDksCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLCAweGE2ODQsIDB4ZmZmYiwgMHg3ODVhLCAweDdkOWEsCisJMHg3OWU0LCAweGQxYWMsIDB4MDEyMCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgxMTIwLCAweDIwMDEsCisJMHgwMDE0LCAweDA4MDQsIDB4MmYxOCwgMHg3ODg0LCAweGQwZmMsIDB4MTExOCwgMHhhMTg0LCAweDAwMDcsCisJMHgwMDkwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDQsIDB4MTExOCwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDUwLCAweGExODQsIDB4MDAwNywgMHhhMDg2LCAweDAwMDUsIDB4MDExOCwgMHhhMTg0LCAweDAwMDcsCisJMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwNGMyLCAweDdhOTAsIDB4YTI5NCwgMHgwMDA3LCAweDc4OWIsCisJMHgwMDYwLCAweDc5YTgsIDB4ODFmZiwgMHgwNTY4LCAweDc4OWIsIDB4MDA4MCwgMHg3YmE4LCAweGEzODQsCisJMHgwMDAxLCAweDExZDAsIDB4N2JhOCwgMHg3YmE4LCAweGEzODYsIDB4MDAwNCwgMHgxMTE4LCAweDIwMDksCisJMHhmZmRmLCAweDAwNTgsIDB4YTM4NiwgMHgwMDAxLCAweDExMTgsIDB4MjAwOSwgMHhmZmY3LCAweDAwMjgsCisJMHhhMzg2LCAweDAwMDMsIDB4MTE0OCwgMHgyMDA5LCAweGZmZWYsIDB4MDBjNiwgMHg3MDU0LCAweDIwNjAsCisJMHg2MDA0LCAweGExMDQsIDB4NjAwNiwgMHgwMGNlLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDAsCisJMHhhNjg0LCAweGZmZmIsIDB4Nzg1YSwgMHg3ODJiLCAweDMwMDksIDB4NjkyMCwgMHhhMThjLCAweGVjZmYsCisJMHg2OTIyLCAweDdkOWEsIDB4MDgwNCwgMHgzYmU1LCAweDJiYWUsIDB4MmJiNywgMHgzM2Q2LCAweDMzZGMsCisJMHgzM2Q0LCAweDMzZDQsIDB4M2JlNSwgMHgzYmU1LCAweDA4MGMsIDB4MjU0YywgMHg2OTIwLCAweGExOGMsCisJMHhmY2ZmLCAweDY5MjIsIDB4MDgwNCwgMHgzYmViLCAweDY5MjAsIDB4YTE4YywgMHhmY2ZmLCAweDY5MjIsCisJMHgwODA0LCAweDNiZTUsIDB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDEyMCwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDE1NzAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MTE5MCwgMHg3MDYwLCAweGEwODYsCisJMHgwMDAyLCAweDExMzAsIDB4MjAxMSwgMHgwMDAyLCAweDIwMTksIDB4MDAwMCwgMHgwODA0LCAweDJhNTYsCisJMHg3MDYwLCAweGEwODYsIDB4MDAwNiwgMHgwZGIwLCAweDcwNjAsIDB4YTA4NiwgMHgwMDA0LCAweDBkOTAsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwOTA0LCAweDI1OWQsIDB4NjkyMCwgMHhhMTg0LCAweDA0MjAsCisJMHgwMTI4LCAweGMxZDQsIDB4NjkyMiwgMHg2ODE4LCAweDA4MDQsIDB4MmYxOCwgMHg2ODE4LCAweGEwOGUsCisJMHgwMDAyLCAweDAxMjAsIDB4YzBmZCwgMHg2ODFhLCAweDIwMDEsIDB4MDAxNCwgMHgwODA0LCAweDJmMTgsCisJMHg3ODg0LCAweGQwZmMsIDB4MTExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDA5MCwgMHhhMTg0LCAweDAwMDcsCisJMHhhMDg2LCAweDAwMDQsIDB4MTExOCwgMHgyMDAxLCAweDAwMDAsIDB4MDA1MCwgMHhhMTg0LCAweDAwMDcsCisJMHhhMDg2LCAweDAwMDUsIDB4MDExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsCisJMHgwMDAyLCAweDNiZTUsIDB4M2JlNSwgMHgzNDM5LCAweDNiZTUsIDB4M2MyOSwgMHgzYzI5LCAweDNiZTUsCisJMHgzYmU1LCAweGQ2YmMsIDB4MDU3MCwgMHg3MTgwLCAweDgxZmYsIDB4MDU1OCwgMHhhMTgyLCAweDAwMGQsCisJMHgxMzE4LCAweDcwODMsIDB4MDAwMCwgMHgwMDI4LCAweGExODIsIDB4MDAwYywgMHg3MDgyLCAweDIwMDksCisJMHgwMDBjLCAweDc4OWIsIDB4MDA2MSwgMHg3OWFhLCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDcwODQsCisJMHg4MTE0LCAweGEyMTAsIDB4NzI4NiwgMHhhMDgwLCAweDAwMGIsIDB4YWQwMCwgMHgyMDk4LCAweGIyODQsCisJMHgwNjAwLCAweDAxMTgsIDB4MjBhMSwgMHgwMjJiLCAweDAwMTAsIDB4MjBhMSwgMHgwMTJiLCAweDc4OWIsCisJMHgwMDAwLCAweDgxMDgsIDB4ODFhYywgMHg1M2E2LCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDA4MDQsCisJMHgzYmViLCAweGQ2ZDQsIDB4MTkwNCwgMHgzNGFjLCAweDY4MjAsIDB4ZDA4NCwgMHgwOTA0LCAweDNiZWIsCisJMHhhNjhjLCAweDAwNjAsIDB4YTY4NCwgMHgwMDYwLCAweDAxMjAsIDB4YTA4NiwgMHgwMDYwLCAweDExMDgsCisJMHhjMWY1LCAweGMxOTQsIDB4Nzk1YSwgMHg2OWI2LCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDAsCisJMHg3ODliLCAweDAwNjEsIDB4NjgxOCwgMHhjMGZkLCAweDY4MWEsIDB4NzhhYSwgMHg4MDA4LCAweDgxMGMsCisJMHgwOTA0LCAweDM3ZDMsIDB4YTE4YywgMHgwMGY4LCAweDE5MDQsIDB4MzdkMywgMHgwMTU2LCAweDAxMzYsCisJMHgwMTQ2LCAweDAwMTYsIDB4MjBhMSwgMHgwMTJiLCAweDMyMDgsIDB4YTE4YywgMHgwNjAwLCAweDAxMTAsCisJMHgyMGExLCAweDAyMmIsIDB4MDAxZSwgMHg3ODliLCAweDAwMDAsIDB4ODAwMCwgMHg4MGFjLCAweGFkODAsCisJMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHg2ODE0LCAweGMwZmMsCisJMHg4MDA3LCAweDc4ODIsIDB4MDgwNCwgMHgzYmViLCAweDY4MTgsIDB4ZDBmYywgMHgwMTEwLCAweDY4MWIsCisJMHgwMDA4LCAweDA4MGMsIDB4M2EzYywgMHg3ODFiLCAweDAwZWQsIDB4MDAwNSwgMHgyMzAwLCAweDAwMDIsCisJMHgzNGJkLCAweDM1N2EsIDB4MzRiYiwgMHgwODBjLCAweDI1NGMsIDB4N2NkOCwgMHg3ZGRjLCAweDdmZDAsCisJMHg4MmZmLCAweDE1MjgsIDB4NzIwMCwgMHhhMjg2LCAweDAwMDMsIDB4MDkwNCwgMHgyZWU2LCAweDcxZDAsCisJMHhkMWJjLCAweDExZjgsIDB4ZDFiNCwgMHgwMWU4LCAweDIwMDEsIDB4NDYwMSwgMHgyMDA0LCAweGQwYzQsCisJMHgxMWMwLCAweDAwZDYsIDB4NzgzYiwgMHg4ODAwLCAweDc4MWIsIDB4MDA1OSwgMHg3MGI4LCAweGEwNmQsCisJMHg2OGI0LCAweGMwYTUsIDB4Nzg1YSwgMHg2ODk0LCAweDc4ZDYsIDB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsCisJMHg3OGRhLCAweGMxYjQsIDB4NzFkMiwgMHg3MDAzLCAweDAwMzAsIDB4MDBkZSwgMHgwMDMwLCAweDcyMDAsCisJMHgwMDIwLCAweDc4M2IsIDB4MTgwMCwgMHg3ODFiLCAweDAwNTcsIDB4YTI4NCwgMHgwMDBmLCAweDAwMDIsCisJMHgzNTY1LCAweDM1MjIsIDB4MzRmYSwgMHgyZjE1LCAweDM0ZjgsIDB4MzU2NSwgMHgzNGY4LCAweDM0ZjgsCisJMHgwODBjLCAweDI1NGMsIDB4NjgxYywgMHhkMGVjLCAweDAxMTgsIDB4NjAwOCwgMHhjMDhkLCAweDYwMGEsCisJMHg2OTIwLCAweGMxODUsIDB4NjkyMiwgMHg2ODAwLCAweDYwMDYsIDB4YTAwNSwgMHgxMTA4LCAweDYwMDIsCisJMHg2MDA4LCAweGMwZDQsIDB4NjAwYSwgMHg2ODFjLCAweGEwODQsIDB4MDAwZSwgMHgxMTIwLCAweDcxYzgsCisJMHhhMTg4LCAweDAxMDAsIDB4MDAyOCwgMHg3MDMwLCAweDY4YmEsIDB4NzEzYywgMHg3MGM4LCAweGExMDgsCisJMHgyMTA0LCAweDY4MDIsIDB4MmQwYSwgMHg3MTVhLCAweGQ2ZGMsIDB4MTEyMCwgMHhjNmZjLCAweDZlYjYsCisJMHgwODA0LCAweDM1NjUsIDB4NmViNiwgMHhhNjg0LCAweDAwNjAsIDB4MTEyMCwgMHhhNjg0LCAweDdmZmYsCisJMHg2OGI2LCAweDA0ZDgsIDB4ZDZkYywgMHgxMTUwLCAweGE2ODQsIDB4N2ZmZiwgMHg2OGI2LCAweDY4OTQsCisJMHg2OGE2LCAweDY4OTgsIDB4NjhhYSwgMHgwODBjLCAweDNmMjYsIDB4MDQ3OCwgMHhkNmFjLCAweDAxNDAsCisJMHhhMDA2LCAweDA4MGMsIDB4M2YyNiwgMHgyNDA4LCAweDI1MTAsIDB4NjlhYSwgMHg2YWE2LCAweDAwNjgsCisJMHgyNDA4LCAweDI1MTAsIDB4MjcwMCwgMHg4MDA3LCAweGEwODQsIDB4MDA3ZiwgMHhhMTA4LCAweGEyOTEsCisJMHgwMDAwLCAweDY5YWEsIDB4NmFhNiwgMHgwODBjLCAweDNmMjYsIDB4ZDZmYywgMHgwMWIwLCAweGE2ODQsCisJMHg3ZmZmLCAweDY4YjYsIDB4MjUxMCwgMHgyNDA4LCAweGQ2YWMsIDB4MTEzOCwgMHgyNzAwLCAweDgwMDcsCisJMHhhMDg0LCAweDAwN2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4NmI5OCwgMHgyMTAwLCAweGEzMDIsCisJMHg2OGIyLCAweDZiOTQsIDB4MjIwMCwgMHhhMzAzLCAweDY4YWUsIDB4NzAwMCwgMHhhMDg2LCAweDAwMzAsCisJMHgxOTA0LCAweDI1YTAsIDB4NzAwMywgMHgwMDAyLCAweDcwYjgsIDB4YTA2ZCwgMHg2OGJjLCAweDcwM2UsCisJMHg3MGI0LCAweGEwNjUsIDB4NjhjMCwgMHg3MDU2LCAweDJkMDAsIDB4NzA0YSwgMHhhZDgwLCAweDAwMDksCisJMHg3MDQyLCAweDAwMDUsIDB4YTU4NiwgMHg4ODAwLCAweDExNDgsIDB4NzAwMywgMHgwMDAwLCAweDYwMTgsCisJMHg4MDAxLCAweDYwMWEsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHgwODA0LCAweDNhMzYsCisJMHg3MDQzLCAweDAwMDAsIDB4YTI4MiwgMHgwMDA2LCAweDAzMTAsIDB4MDgwYywgMHgyNTRjLCAweDIzMDAsCisJMHgwMDAyLCAweDM1OTQsIDB4MzVhNSwgMHgzNWFmLCAweDIyMDAsIDB4MDAwMiwgMHgzNTljLCAweDNhMzYsCisJMHgzNTllLCAweDM1OWMsIDB4MzVlMCwgMHgzNjJlLCAweDA4MGMsIDB4MjU0YywgMHg3YTgwLCAweGEyOTQsCisJMHgwZjAwLCAweDA4MGMsIDB4MzY4MiwgMHgwODA0LCAweDNhMGIsIDB4MDBjMSwgMHgwMDAyLCAweDNhMzYsCisJMHgzNWFkLCAweDM1YWQsIDB4MzVlMCwgMHgzNWFkLCAweDNhMzYsIDB4MDgwYywgMHgyNTRjLCAweDAwNzEsCisJMHgwMDAyLCAweDM1YjksIDB4MzViNywgMHgzNWI3LCAweDM1YjksIDB4MzViNywgMHgzNWI5LCAweDA4MGMsCisJMHgyNTRjLCAweDA4MGMsIDB4M2E0YiwgMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAyLCAweDExNTAsIDB4MDgwYywgMHgzN2JlLCAweDAwMTAsIDB4MDgwYywgMHgzZjI2LCAweDYwMDgsCisJMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHgwMDIwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDBkYTgsCisJMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg4ZGUwLCAweGFlOGUsIDB4NDY0MCwgMHgwMTEwLCAweDIwMDEsCisJMHg4ZTEyLCAweDIwNjgsIDB4NzA0YSwgMHhhZDgwLCAweDAwMDksIDB4NzA0MiwgMHgyMjAwLCAweDAwMDUsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTU4LCAweDcwZDAsIDB4YzBiNSwgMHg3MGQyLCAweDJjMDAsCisJMHg3MGI2LCAweDJkMDAsIDB4NzBiYSwgMHgwMDM4LCAweDA4MGMsIDB4M2YyNiwgMHgwMDIwLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDMsIDB4MGRjOCwgMHg3MDAzLCAweDAwMDEsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsCisJMHg3ODliLCAweDAwMTgsIDB4N2NhOCwgMHhhNDg0LCAweDAwMWYsIDB4YTIxNSwgMHgyMDY5LCAweDhjYzAsCisJMHhiMjg0LCAweDA2MDAsIDB4MTExOCwgMHhjMmZkLCAweDIwNjksIDB4OGRkMCwgMHgyZDA0LCAweDJkMDgsCisJMHg3MTVhLCAweGEwNmQsIDB4MDEyOCwgMHg2ODE0LCAweGEyMDYsIDB4MDEyMCwgMHg2ODAwLCAweDBjYjgsCisJMHgwODBjLCAweDM2ODIsIDB4NmViNCwgMHg3ZTVhLCAweDY5MjAsIDB4YTE4NCwgMHgwYzAwLCAweDA5MDQsCisJMHgzNmE4LCAweDcwNjAsIDB4YTA4NiwgMHgwMDA2LCAweDExMjgsIDB4NzA3MCwgMHhhMjA2LCAweDExMTAsCisJMHg3MDYyLCAweDcwN2EsIDB4NjgxYiwgMHgwMDA1LCAweGMxYWQsIDB4NjgxYiwgMHgwMDA1LCAweGMxYWQsCisJMHhjMWQ0LCAweDY5MjIsIDB4MDgwYywgMHgzYTQyLCAweDA4MDQsIDB4MzZhOCwgMHg3MjAwLCAweGEyODYsCisJMHgwMDAyLCAweDExNTgsIDB4NzBkMCwgMHhjMGI1LCAweDcwZDIsIDB4MmMwMCwgMHg3MGI2LCAweDJkMDAsCisJMHg3MGJhLCAweDAwMzAsIDB4MDgwYywgMHgzZjI2LCAweDAwMTgsIDB4YTI4NiwgMHgwMDAzLCAweDBkZDAsCisJMHg3MDAzLCAweDAwMDEsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsIDB4Nzg5YiwgMHgwMDE4LCAweDdjYTgsCisJMHhhNDg0LCAweDAwMWYsIDB4YTIxNSwgMHhhZTg2LCAweDQ2NDAsIDB4MDEwOCwgMHhjMmZkLCAweDc5YTgsCisJMHg3OWE4LCAweGExOGMsIDB4MDBmZiwgMHgyMTE4LCAweDcwYzgsIDB4YTE2OCwgMHgyZDA0LCAweDJkMDgsCisJMHg3MTVhLCAweGEwNmQsIDB4MDEyOCwgMHg2ODE0LCAweGEyMDYsIDB4MDExOCwgMHg2ODAwLCAweDBjYjgsCisJMHgwNDA5LCAweDZlYjQsIDB4NjkyMCwgMHhhMTg0LCAweDBjMDAsIDB4MDkwNCwgMHgzNmE4LCAweGQwZGMsCisJMHgwMTc4LCAweDcwNjAsIDB4YTA4NiwgMHgwMDA0LCAweDExNDAsIDB4NzA3MCwgMHhhMjA2LCAweDExMjgsCisJMHg3MDc0LCAweGEzMDYsIDB4MTExMCwgMHg3MDYyLCAweDcwN2EsIDB4MDgwYywgMHgzYTQ4LCAweDA0ODAsCisJMHg2ODFiLCAweDAwMDUsIDB4YzFhZCwgMHhjMWQ0LCAweDY5MjIsIDB4MDgwYywgMHgzYTQyLCAweDcwN2IsCisJMHgwMDAwLCAweDA0MzAsIDB4NzAwMywgMHgwMDA1LCAweGIyODQsIDB4MDYwMCwgMHgwMTE4LCAweDIwMDEsCisJMHg4ZGUwLCAweDAwMTAsIDB4MjAwMSwgMHg4ZTEyLCAweDIwNjgsIDB4NzA0YSwgMHgwMTU2LCAweDIwYTksCisJMHgwMDMyLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDFmMDQsIDB4MzY5MSwgMHgwMTVlLCAweGIyODQsCisJMHgwNjAwLCAweDAxMTAsIDB4YzJmYywgMHgwMDA4LCAweGMyZmQsIDB4NmExNiwgMHhhZDgwLCAweDAwMDksCisJMHg3MDQyLCAweDY4YjcsIDB4MDcwMCwgMHg2ODIzLCAweDA4MDAsIDB4NjgyNywgMHgwMDAzLCAweDAwMDUsCisJMHhjNmVjLCAweGE2YWMsIDB4MDA2MCwgMHgwOTA0LCAweDM2ZWYsIDB4NmI5OCwgMHg2Yzk0LCAweDY5YWMsCisJMHg2OGIwLCAweGExMDUsIDB4MTFlMCwgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweGE1ODYsCisJMHgwMDYwLCAweDA1YzgsIDB4ZDZmNCwgMHgxMTA4LCAweGM2ZWQsIDB4YTZiNCwgMHhiN2ZmLCAweDdlNWEsCisJMHgyMDA5LCAweDAwODMsIDB4ZDY5YywgMHgwMTI4LCAweDIwMDksIDB4MDA4MiwgMHgyMDE5LCAweDAwMDAsCisJMHgyMzIwLCAweDc5MWEsIDB4ZDZlYywgMHgwNTg4LCAweDA4MGMsIDB4NDFkOSwgMHgwNDcwLCAweDY4YjAsCisJMHhhMzFhLCAweDIxMDAsIDB4YTQyMywgMHgyNDAwLCAweGEzMDUsIDB4MDFmOCwgMHg3YmQyLCAweDdiZGEsCisJMHg3Y2Q2LCAweDdjZGUsIDB4NjhiMCwgMHhkNmY0LCAweDExMDgsIDB4YzZlZCwgMHhjNmY0LCAweDdlNWEsCisJMHgyMDExLCAweDAwODMsIDB4ZDY5YywgMHgwMTI4LCAweDIwMTEsIDB4MDA4MiwgMHgyMDE5LCAweDAwMDAsCisJMHgyMzIwLCAweDdhMWEsIDB4ZDZlYywgMHgwMTg4LCAweDA4MGMsIDB4NDIwNiwgMHgwMDcwLCAweDIwMTksCisJMHgwMDAwLCAweDIzMjAsIDB4MDAxMCwgMHhhNmI0LCAweGI3ZmYsIDB4N2U1YSwgMHgyMDA5LCAweDAwODMsCisJMHhkNjljLCAweDAxMTAsIDB4MjAwOSwgMHgwMDgyLCAweDc5MWEsIDB4NjhjMCwgMHg3MDU2LCAweDJkMDAsCisJMHg3MDRhLCAweDY4YzQsIDB4MjA2MCwgMHg3MWQwLCAweDIwMDEsIDB4NDYwMSwgMHgyMDA0LCAweGQwYzQsCisJMHgxNWM4LCAweDcwZDQsIDB4YTAyZCwgMHgwMWI4LCAweGQxYmMsIDB4MDU0OCwgMHg3YTgwLCAweGEyOTQsCisJMHgwZjAwLCAweDcwZDgsIDB4YTIwNiwgMHgwMTE4LCAweDc4ZTAsIDB4YTUwNCwgMHgxNTU4LCAweDcwZDYsCisJMHhjMWJjLCAweDcxZDIsIDB4MDQzOCwgMHgyMDMxLCAweDAwMDEsIDB4ODUyYywgMHgwMjE4LCAweDg2MzMsCisJMHg4MjEwLCAweDBjZDgsIDB4MDAwNSwgMHg3ZGUwLCAweGE1OTQsIDB4ZmYwMCwgMHgwMTMwLCAweDIwMTEsCisJMHgwMDA4LCAweDg1MmYsIDB4MGM4MSwgMHg4NjM3LCAweDAwMDgsIDB4MGM2OSwgMHg4MjE3LCAweDc4ODAsCisJMHhhMDg0LCAweDBmMDAsIDB4YTIwNiwgMHgwMTcwLCAweDcyZGEsIDB4NzZkNiwgMHgwMDU4LCAweDdhODAsCisJMHhhMjk0LCAweDBmMDAsIDB4NzBkOCwgMHhhMjM2LCAweDBkYzAsIDB4NzhlMCwgMHhhNTM0LCAweDBkYTgsCisJMHhjMWJkLCAweDcxZDIsIDB4ZDFiNCwgMHgxOTA0LCAweDI1OWQsIDB4MjMwMCwgMHhhNDA1LCAweDA5MDQsCisJMHgyNTlkLCAweDcwYTAsIDB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MjVlMSwgMHgwMDA1LCAweDYwMjAsCisJMHhhMDA1LCAweDAxNTAsIDB4ODAwMSwgMHg2MDIyLCAweDYwMDgsIDB4YTA4NSwgMHgwMDA4LCAweDYwMGEsCisJMHg3MDBmLCAweDAxMDAsIDB4NzAyYywgMHg2MDI2LCAweDAwMDUsIDB4YTAwNiwgMHgwODBjLCAweDNmMjYsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMTIwLCAweDcwNjAsIDB4YTA4NiwgMHgwMDA1LCAweDExNTAsCisJMHg2ODJiLCAweDAwMDAsIDB4NjgxNywgMHgwMDAwLCAweDY4MWIsIDB4MDAwMSwgMHg2ODIzLCAweDAwNDAsCisJMHg2ODFmLCAweDAxMDAsIDB4NzAwMCwgMHhhMDg0LCAweDAwMGYsIDB4MDAwMiwgMHgyNWEwLCAweDM3ODMsCisJMHgzNzgwLCAweDM3YTAsIDB4Mzc4YywgMHgyNWEwLCAweDM3N2UsIDB4Mzc3ZSwgMHgwODBjLCAweDI1NGMsCisJMHgwNDQ5LCAweDA0MTEsIDB4MDAyOCwgMHgwNDMxLCAweDcwNTgsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsCisJMHgwODBjLCAweDFkYTIsIDB4MDgwNCwgMHgyNWEwLCAweDcwNjAsIDB4NzA2MywgMHgwMDAwLCAweDcwN2YsCisJMHgwMDAwLCAweDAwMDIsIDB4Mzc5YywgMHgzNzljLCAweDM3OWEsIDB4Mzc5YSwgMHgzNzlhLCAweDM3OWMsCisJMHgzNzlhLCAweDM3OWMsIDB4MDgwNCwgMHgyYTZiLCAweDcwNjMsIDB4MDAwMCwgMHgwODA0LCAweDI1YTAsCisJMHg2ODFiLCAweDAwMDAsIDB4MDgwNCwgMHgzMTg0LCAweDY4MDAsIDB4YTAwNSwgMHgxMTA4LCAweDYwMDIsCisJMHg2MDA2LCAweDAwMDUsIDB4NjQxMCwgMHg4NGZmLCAweDAxNjgsIDB4MjAwOSwgMHg0NjAyLCAweDIxMDQsCisJMHg4MDAxLCAweDIwMGEsIDB4ODQyMSwgMHg2NDEyLCAweDExMjgsIDB4MjAyMSwgMHg0NjA0LCAweDI0MDQsCisJMHhjMGE1LCAweDIwMjIsIDB4NjAwOCwgMHhjMGE0LCAweDYwMGEsIDB4MDAwNSwgMHg2MDE4LCAweGEwMDUsCisJMHgwMTEwLCAweDgwMDEsIDB4NjAxYSwgMHgwMDA1LCAweDA4MGMsIDB4M2M0NiwgMHg2ODFiLCAweDAwMTgsCisJMHgwNDkwLCAweDA4MGMsIDB4M2M0NiwgMHg2ODFiLCAweDAwMTksIDB4MDQ2OCwgMHgwODBjLCAweDNjNDYsCisJMHg2ODFiLCAweDAwMWEsIDB4MDQ0MCwgMHgwODBjLCAweDNjNDYsIDB4NjgxYiwgMHgwMDAzLCAweDA0MTgsCisJMHg3NzcwLCAweDA4MGMsIDB4M2I2ZiwgMHg3MTc0LCAweGExOGMsIDB4MDBmZiwgMHgzMjEwLCAweGEyOTQsCisJMHgwNjAwLCAweDAxMTgsIDB4YTFlOCwgMHg4YmMwLCAweDAwMTAsIDB4YTFlOCwgMHg4Y2QwLCAweDJkMDQsCisJMHgyZDA4LCAweDIwNjgsIDB4YTAwNSwgMHgxMTE4LCAweDcwN2EsIDB4MDgwNCwgMHgyNWEwLCAweDY4MTQsCisJMHg3MjcwLCAweGEyMDYsIDB4MDExMCwgMHg2ODAwLCAweDBjOTgsIDB4NjgwMCwgMHgyMDBhLCAweDY4MWIsCisJMHgwMDA1LCAweDcwN2IsIDB4MDAwMCwgMHgwODBjLCAweDM3YWEsIDB4NjgyMCwgMHhkMDg0LCAweDExMTAsCisJMHgwODBjLCAweDM3YTQsIDB4MDgwYywgMHgzN2JlLCAweDY4MWYsIDB4MDAwMCwgMHg2ODIzLCAweDAwMjAsCisJMHgwODBjLCAweDFkYTIsIDB4MDgwNCwgMHgyNWEwLCAweGEyODIsIDB4MDAwMywgMHgxOTA0LCAweDNhMTAsCisJMHg3ZGE4LCAweGE1YWMsIDB4MDBmZiwgMHg3ZWE4LCAweGE2YjQsIDB4MDBmZiwgMHg2OTIwLCAweGMxYmQsCisJMHg2OTIyLCAweGQxYzQsIDB4MDViMCwgMHhjMWM0LCAweDY5MjIsIDB4YTZiNCwgMHgwMGZmLCAweDA1MzAsCisJMHhhNjgyLCAweDAwMTgsIDB4MDIxOCwgMHgwMTEwLCAweDIwMzEsIDB4MDAxOCwgMHhhNjg2LCAweDAwMTAsCisJMHgxMTA4LCAweDg2MzAsIDB4ODUyYiwgMHg4NTJiLCAweDIwNDEsIDB4MDAwMCwgMHgwODBjLCAweDNhYzksCisJMHgwMTE4LCAweDA4MGMsIDB4MzhmNywgMHgwMGEwLCAweDA4MGMsIDB4M2E5NSwgMHgwODBjLCAweDM4ZjQsCisJMHg2OTIwLCAweGMxYzUsIDB4NjkyMiwgMHg3ZTU4LCAweGM2OTUsIDB4N2U1YSwgMHhkNmQ0LCAweDExMTgsCisJMHg3ODFiLCAweDAwNmUsIDB4MDAwNSwgMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHgwODBjLCAweDM4ZjQsCisJMHg3ZTU4LCAweGQ2ZDQsIDB4MTExOCwgMHg3ODFiLCAweDAwNzEsIDB4MDAwNSwgMHg3ODFiLCAweDAwODMsCisJMHgwMDA1LCAweDAwYzYsIDB4NzA1NCwgMHgyMDYwLCAweDYxMDAsIDB4ZDFlNCwgMHgwNTk4LCAweDYyMDgsCisJMHg4MjE3LCAweGEyOTQsIDB4MDBmZiwgMHhhMjgyLCAweDAwMTgsIDB4MDIxOCwgMHgwMTEwLCAweDIwMTEsCisJMHgwMDE4LCAweDI2MDAsIDB4YTIwMiwgMHgxMjA4LCAweDIyMzAsIDB4YTY4NiwgMHgwMDEwLCAweDExMDgsCisJMHg4NjMwLCAweDYyMDgsIDB4YTI5NCwgMHgwMGZmLCAweDc4ZWMsIDB4ZDBlNCwgMHgwMTMwLCAweGEyODIsCisJMHgwMDBhLCAweDEyNDAsIDB4MjAxMSwgMHgwMDBhLCAweDAwMjgsIDB4YTI4MiwgMHgwMDBjLCAweDEyMTAsCisJMHgyMDExLCAweDAwMGMsIDB4MjIwMCwgMHhhNTAyLCAweDEyMDgsIDB4MjIyOCwgMHgwODBjLCAweDNhOTksCisJMHg4NTJiLCAweDg1MmIsIDB4MjA0MSwgMHgwMDAwLCAweDA4MGMsIDB4M2FjOSwgMHgwMTE4LCAweDA4MGMsCisJMHgzOGY3LCAweDAwMjAsIDB4MDgwYywgMHgzYTk1LCAweDA4MGMsIDB4MzhmNCwgMHg3ODU4LCAweGMwOTUsCisJMHg3ODVhLCAweDAwY2UsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4MDBjNiwgMHgyOTYwLCAweDYwMDAsCisJMHhkMGU0LCAweDExODgsIDB4ZDBiNCwgMHgxMTUwLCAweDYwMTAsIDB4YTA4NCwgMHgwMDBmLCAweDExMzAsCisJMHg2MTA0LCAweGExOGMsIDB4ZmZmNSwgMHg2MTA2LCAweDAwY2UsIDB4MDAwNSwgMHgyMDExLCAweDAwMzIsCisJMHgyMDE5LCAweDAwMDAsIDB4MDBmMCwgMHg2OGEwLCAweGQwY2MsIDB4MWRjMCwgMHg2MjA4LCAweGEyOTQsCisJMHgwMGZmLCAweDc4ZWMsIDB4ZDBlNCwgMHgwMTMwLCAweGEyODIsIDB4MDAwYiwgMHgxMjE4LCAweDIwMTEsCisJMHgwMDBhLCAweDAwMjgsIDB4YTI4MiwgMHgwMDBjLCAweDEyMTAsIDB4MjAxMSwgMHgwMDBjLCAweDYzMDgsCisJMHg4MzFmLCAweGEzOWMsIDB4MDBmZiwgMHhhMzgyLCAweDAwMTgsIDB4MDIxOCwgMHgwMTEwLCAweDIwMTksCisJMHgwMDE4LCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDMsIDB4NzhhYiwgMHgwMDAxLCAweDdhYWEsCisJMHg3YmFhLCAweGE4YzAsIDB4MDAwNSwgMHg2ODIwLCAweGMwYzUsIDB4NjgyMiwgMHgwODBjLCAweDNhNTUsCisJMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgyOTYwLCAweDYxMDQsIDB4YTE4YywgMHhmZmY1LCAweDYxMDYsCisJMHgyMDExLCAweDAwMzIsIDB4MjAxOSwgMHgwMDAwLCAweDAwMDAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsCisJMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLCAweDdiYWEsIDB4YThjMCwgMHgwMDA1LCAweDY4MjAsCisJMHhjMGM1LCAweDY4MjIsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsIDB4MjAzMCwgMHgyMDEwLCAweDAwYzYsCisJMHg3MTU0LCAweDIxNjAsIDB4MjAxOCwgMHgyMDA4LCAweGEwODQsIDB4ZmZlMCwgMHhhNjM1LCAweDdlODYsCisJMHg2MDE4LCAweDc4OWEsIDB4N2VhZSwgMHg2NjEyLCAweDc4YTQsIDB4YTA4NCwgMHg3NzcwLCAweGExOGMsCisJMHgwMDBmLCAweGExMDUsIDB4MjAyOSwgMHg0NjA1LCAweDI1MmMsIDB4ZDVjYywgMHgwMTQwLCAweGQzYTQsCisJMHgwMTEwLCAweGEwODUsIDB4MDgwMCwgMHhkM2ZjLCAweDAxMTAsIDB4YTA4NSwgMHg4MDgwLCAweDc4YTYsCisJMHg2MDE2LCAweDc4OGEsIDB4YTZiNCwgMHgwMDFmLCAweDg2MzcsIDB4ODIwNCwgMHg4MDA0LCAweGE2MDUsCisJMHg2MDBlLCAweDYwMDQsIDB4YTA4NCwgMHhmZmQ1LCAweDYwMDYsIDB4MDBjZSwgMHgwMDA1LCAweGEyODIsCisJMHgwMDAyLCAweDE5MDQsIDB4M2ExYSwgMHg3YWE4LCAweDY5MjAsIDB4YzFiZCwgMHg2OTIyLCAweGQxY2MsCisJMHgwNTY4LCAweGMxY2MsIDB4NjkyMiwgMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDAyLCAweDFhMDQsCisJMHgzYTBiLCAweDA4MGMsIDB4Mzk5ZSwgMHgwODBjLCAweDM4ZjQsIDB4YTk4MCwgMHgwMDAxLCAweDIwMGMsCisJMHgwODBjLCAweDNiNmIsIDB4MDgwYywgMHgzODk1LCAweDg4ZmYsIDB4MDE3OCwgMHg3ODliLCAweDAwNjAsCisJMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhjNjk1LCAweDdlNWEsIDB4ZDZkNCwgMHgxMTE4LCAweDc4MWIsCisJMHgwMDZlLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsIDB4N2U1OCwgMHhkNmQ0LCAweDExMTgsCisJMHg3ODFiLCAweDAwNzEsIDB4MDAwNSwgMHg3ODFiLCAweDAwODMsIDB4MDAwNSwgMHhhMjgyLCAweDAwMDIsCisJMHgxMjE4LCAweGEyODQsIDB4MDAwMSwgMHgwMTQwLCAweDcxNTQsIDB4YTE4OCwgMHgwMDAwLCAweDIxMGMsCisJMHhkMWVjLCAweDExMTAsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4M2E4NywgMHgwNDc5LCAweDA4MGMsCisJMHgzOGY0LCAweDc4NTgsIDB4YzA5NSwgMHg3ODVhLCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LCAweDAwYzYsCisJMHgwMDI2LCAweDI5NjAsIDB4NjAwMCwgMHgyMDExLCAweDAwMDEsIDB4ZDBlYywgMHgxMTU4LCAweGQwYmMsCisJMHgxMTM4LCAweDYwMTQsIDB4ZDBiNCwgMHgxMTIwLCAweGMxYTQsIDB4NjEwNiwgMHhhMDA2LCAweDAwODgsCisJMHgyMDExLCAweDAwMDAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsIDB4MDAwMiwgMHg3OGFiLCAweDAwMDMsCisJMHg3YWFhLCAweGE4YzAsIDB4MDAwNCwgMHgwODBjLCAweDNhNTUsIDB4NjgyMCwgMHhhMDg1LCAweDAyMDAsCisJMHg2ODIyLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweDg4MDcsIDB4YTcxNSwgMHgwMGM2LCAweDIwMDksCisJMHgwMDAwLCAweDcwNTQsIDB4MjA2MCwgMHg4MmZmLCAweDAxMTAsIDB4MjAwOSwgMHgwMDQwLCAweDYwMTgsCisJMHhhMDgwLCAweDAwMDIsIDB4Nzg5YSwgMHg3OGE0LCAweGEwODQsIDB4ZmY5ZiwgMHhhMTA1LCAweGMwZWMsCisJMHhkMGI0LCAweDExMDgsIDB4YzBlZCwgMHg2MTAwLCAweGQxZjQsIDB4MDExMCwgMHhhMDg1LCAweDAwMjAsCisJMHg3OGE2LCAweDYwMTYsIDB4Nzg4YSwgMHg2MDA0LCAweGEwODQsIDB4ZmZlZiwgMHg2MDA2LCAweDAwY2UsCisJMHgwMDA1LCAweDAwMDYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDExMCwgMHgwMDBlLCAweDAwMTAsCisJMHgwMDBlLCAweDA0ODgsIDB4ZDZhYywgMHgwNTc4LCAweDc4ODgsIDB4YTA4NCwgMHgwMDQwLCAweDA1NTgsCisJMHg3YmI4LCAweDgzMDcsIDB4YTA4NCwgMHgwMDdmLCAweDE1MDgsIDB4ODIwNywgMHhhMDg0LCAweDAwZmYsCisJMHhhMDllLCAweDAwMDEsIDB4MTkwNCwgMHgzYTMyLCAweGQ2ZjQsIDB4MTFkMCwgMHg3OWQ4LCAweDdhZGMsCisJMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg3OWQyLCAweDc5ZGEsIDB4N2FkNiwgMHg3YWRlLCAweDA4MGMsCisJMHg0MmI1LCAweDc4MWIsIDB4MDA4MCwgMHhiMjg0LCAweDA2MDAsIDB4MDExOCwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDQxNzIsIDB4MDAwNSwgMHgwODBjLCAweDI1NGMsCisJMHg3ODFiLCAweDAwODAsIDB4MDAwNSwgMHg3ODFiLCAweDAwODMsIDB4MDAwNSwgMHgyMDM5LCAweDAwMDAsCisJMHgyMDQxLCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweGEwMDYsIDB4MjAxMCwgMHgwODBjLCAweDM4ZjcsCisJMHgwODBjLCAweDM5OWMsIDB4N2U1OCwgMHgwODBjLCAweDNhNGUsIDB4NzgxYiwgMHgwMDgyLCAweDAwMDUsCisJMHgwY2QxLCAweDY4MjAsIDB4YzBjNCwgMHg2ODIyLCAweDAwYzYsIDB4NzA1NCwgMHgyMDYwLCAweDA4MGMsCisJMHgzOTIxLCAweDAwYjAsIDB4MGM4MSwgMHg2ODIwLCAweGMwY2MsIDB4NjgyMiwgMHgwMGM2LCAweDcwNTQsCisJMHgyMDYwLCAweDA4MGMsIDB4MzliYiwgMHgwMDYwLCAweDBjMzEsIDB4NjgyMCwgMHhhMDg0LCAweGVjZmYsCisJMHg2ODIyLCAweDAwYzYsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDQsIDB4YTA4NCwgMHhmZmM1LCAweDYwMDYsCisJMHgwMGNlLCAweDAwMDUsIDB4MDA0OSwgMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHg2ODI3LCAweDAwMDIsCisJMHgwMDQ5LCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwgMHgwMDg4LCAweDIwMDEsCisJMHgwMDBjLCAweDAwNzAsIDB4NjgyMCwgMHhjMGQ1LCAweDY4MjIsIDB4MjAwMSwgMHgwMDA2LCAweDAwNDAsCisJMHgyMDAxLCAweDAwMGQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMDksIDB4MDAxMCwgMHgyMDAxLCAweDAwMDcsCisJMHg3ODliLCAweDAwN2UsIDB4NzhhYSwgMHhjNjlkLCAweDdlNWEsIDB4NzBkMCwgMHhkMGI0LCAweDAxNjgsCisJMHhjMGI0LCAweDcwZDIsIDB4MDBjNiwgMHg3MGI0LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsCisJMHg2MDBhLCAweDYwMTgsIDB4ODAwMSwgMHg2MDFhLCAweDAwY2UsIDB4MDAwNSwgMHgwMDc2LCAweDg3M2YsCisJMHhhN2JjLCAweDAwMGYsIDB4ODczYiwgMHg4NzNiLCAweDg3MDMsIDB4YTBlMCwgMHg0YWMwLCAweGFlOGUsCisJMHg0NjQwLCAweDAxMTAsIDB4YTBlMCwgMHg0YjQwLCAweGE3YjgsIDB4MDAyMCwgMHg3ZjlhLCAweDc5YTQsCisJMHhhMTg0LCAweDdmZTAsIDB4NzhhZSwgMHg2MDEyLCAweDc5YTQsIDB4YTE4NCwgMHg3NzNmLCAweDc4YTYsCisJMHg2MDE2LCAweDYwMDQsIDB4YTA4NSwgMHgwMDM4LCAweDYwMDYsIDB4MDA3ZSwgMHgwMDA1LCAweDc4OWIsCisJMHgwMDgwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDIsIDB4NzhhYiwgMHgwMDAzLCAweDdhYWEsCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA0LCAweDA4MDAsIDB4MjAzMSwgMHgwMDAwLCAweDIwMjksCisJMHgwMDMyLCAweDc4OWIsIDB4MDA4MCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsCisJMHgwMDAxLCAweDdkYWEsIDB4N2VhYSwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA1LCAweDA4MDQsCisJMHgzYTU1LCAweDAxNTYsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsCisJMHgwMDIwLCAweDc4OWEsIDB4NzlhNCwgMHhhMThjLCAweGZmZTAsIDB4MjAyMSwgMHgzYjU0LCAweDIwMTksCisJMHgwMDExLCAweDIwYTksIDB4MDAwZSwgMHgyMDExLCAweDAwMzIsIDB4MjQwNCwgMHhhMDg0LCAweGZmZTAsCisJMHhhMTA2LCAweDAxMjgsIDB4ODQyMCwgMHgyMzAwLCAweGEyMTAsIDB4MWYwNCwgMHgzYWJkLCAweDAxNWUsCisJMHgwMDA1LCAweDAxNTYsIDB4MDRmOCwgMHgyMDIxLCAweDNiNjIsIDB4MjBhOSwgMHgwMDA5LCAweDIwMTEsCisJMHgwMDI5LCAweGE1ODIsIDB4MDAyOCwgMHgwNTUwLCAweDg0MjAsIDB4OTVhOSwgMHgyMDExLCAweDAwMzMsCisJMHhhNTgyLCAweDAwMzMsIDB4MDYxOCwgMHg4NDIwLCAweDk1YTksIDB4MjAxOSwgMHgwMDBhLCAweDIwMTEsCisJMHgwMDY1LCAweDIyMDAsIDB4YTUwMiwgMHgwMmQwLCAweDg0MjAsIDB4MjMwMCwgMHhhMjEwLCAweDFmMDQsCisJMHgzYWUxLCAweDAxNWUsIDB4MDA4OCwgMHgyMDIxLCAweDNiNTQsIDB4MjAxOSwgMHgwMDExLCAweDIwYTksCisJMHgwMDBlLCAweDIwMTEsIDB4MDAzMywgMHgyMjAwLCAweGE1MDIsIDB4MDI0MCwgMHg4NDIwLCAweDIzMDAsCisJMHhhMjEwLCAweDFmMDQsIDB4M2FmMywgMHgwMTVlLCAweGEwMDYsIDB4MDAwNSwgMHg4MjExLCAweDAxNWUsCisJMHhhNTgyLCAweDAwNjQsIDB4MTIyMCwgMHg3ODA4LCAweGEwODUsIDB4MDA3MCwgMHg3ODBhLCAweDI0MDQsCisJMHhhMDA1LCAweDAwMDUsIDB4YTg4NiwgMHgwMDAyLCAweDAxZTgsIDB4MjAyMSwgMHgzYjQwLCAweDIwYTksCisJMHgwMDBkLCAweDIwMTEsIDB4MDAyOCwgMHhhNTgyLCAweDAwMjgsIDB4MGQ0OCwgMHg4NDIwLCAweDIwMTksCisJMHgwMDE5LCAweDIwMTEsIDB4MDAzMywgMHgyMjAwLCAweGE1MDIsIDB4MGUwMCwgMHg4NDIwLCAweDIzMDAsCisJMHhhMjEwLCAweDFmMDQsIDB4M2IxYiwgMHgwMTVlLCAweDIwMTEsIDB4MDE4NCwgMHhhNTgyLCAweDAxODUsCisJMHgwYWIwLCAweDA4OTAsIDB4MjAyMSwgMHgzYjRmLCAweDIwYTksIDB4MDAwMywgMHgyMDExLCAweDAwMjQsCisJMHhhNTg2LCAweDAwMjQsIDB4MDk2MCwgMHg4NDIwLCAweDIwMTEsIDB4MDAyOCwgMHhhNTg2LCAweDAwMjgsCisJMHgwOTMwLCAweDg0MjAsIDB4MjAxOSwgMHgwMDE5LCAweDIwMTEsIDB4MDAzMywgMHgwODA0LCAweDNhZjMsCisJMHgxMDIxLCAweDIyMDIsIDB4MzQwMywgMHg0NjA0LCAweDU4MDUsIDB4NmEwNiwgMHg3YzA3LCAweDQ2MTAsCisJMHg0NjEyLCAweDU4MTIsIDB4NWExMiwgMHg2YTE0LCAweDZjMTQsIDB4NmUxNCwgMHg3ZTE3LCAweDkwMjEsCisJMHhiMDAyLCAweGUyMDQsIDB4ZTIxMCwgMHhlMjEwLCAweDEyMDksIDB4MzAwMiwgMHgzMjAyLCAweDQyMDMsCisJMHg0NDAzLCAweDU0MDQsIDB4NTYwNCwgMHg2NjA1LCAweDY4MDUsIDB4NzgwNiwgMHg3YTA2LCAweDBjMDcsCisJMHgwYzA3LCAweDBlMDcsIDB4MTBlMSwgMHgzMzBhLCAweDU4MDUsIDB4NWEwNSwgMHg2YTA2LCAweDZjMDYsCisJMHg3YzA3LCAweDdlMDcsIDB4MGUwMCwgMHg3ODliLCAweDAwODAsIDB4YTA0NiwgMHgwMDA1LCAweGE3ODQsCisJMHgwZjAwLCAweDgwMGIsIDB4YTc4NCwgMHgwMDFmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsCisJMHhhMTA1LCAweGQ3ZmMsIDB4MDExOCwgMHhhMGUwLCAweDZiYzAsIDB4MDAxMCwgMHhhMGUwLCAweDRiYzAsCisJMHgwMDA1LCAweDAwZTYsIDB4MDBmNiwgMHhkMDg0LCAweDAxMzgsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDksCisJMHg0NjgwLCAweDIwNzEsIDB4NDY4MCwgMHgwMDMwLCAweDIwMDksIDB4NDY0MCwgMHgyMDc5LCAweDAyMDAsCisJMHgyMDcxLCAweDQ2NDAsIDB4MjA5MSwgMHg4MDAwLCAweDIxMDQsIDB4YTA4NCwgMHgwMDBmLCAweDAwMDIsCisJMHgzYmEyLCAweDNiYTIsIDB4M2JhMiwgMHgzYmEyLCAweDNiYTIsIDB4M2JhMiwgMHgzYmEwLCAweDNiYTAsCisJMHgwODBjLCAweDI1NGMsIDB4NjliNCwgMHhjMWY1LCAweGExOGMsIDB4ZmY5ZiwgMHg2OWI2LCAweGEwMDUsCisJMHgwNTgwLCAweDc4NTgsIDB4YTA4NCwgMHhmZjlmLCAweGEwODUsIDB4NjAwMCwgMHg3ODVhLCAweDc4MjgsCisJMHhhMDg2LCAweDE4MTQsIDB4MTUzMCwgMHg3ODRiLCAweDAwMDQsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDQsCisJMHgxZGUwLCAweDc4NGIsIDB4MDAwOCwgMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgxZGUwLCAweDc4MzAsCisJMHhkMGJjLCAweDExYjgsIDB4YjI4NCwgMHgwODAwLCAweDAxMTgsIDB4MDEwNCwgMHgzYmQ5LCAweDAwMTAsCisJMHgwMzA0LCAweDNiZDksIDB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDE1OCwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDAxMzgsIDB4NjgxYywgMHhkMGFjLCAweDExMTAsIDB4MDBkOSwgMHgwMDEwLCAweDc4MWIsCisJMHgwMGZiLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4NDYwMSwgMHgyMDA0LCAweGQwYWMsCisJMHgxMTE4LCAweDY4MTQsIDB4MDgwYywgMHgyNDc1LCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsCisJMHg3ODFiLCAweDAwODIsIDB4MDAwNSwgMHg3ODFiLCAweDAwNzEsIDB4MDAwNSwgMHg3ODFiLCAweDAwNmUsCisJMHgwMDA1LCAweDIwMDksIDB4NDYxOSwgMHgyMTBjLCAweGExODYsIDB4MDAwMCwgMHgwMTUwLCAweGExODYsCisJMHgwMDAxLCAweDAxNTAsIDB4NzAxZiwgMHgwMDBiLCAweDcwNjMsIDB4MDAwMSwgMHg3ODFiLCAweDAwNTQsCisJMHgwMDA1LCAweDc4MWIsIDB4MDBmMywgMHgwMDA1LCAweDcwMWYsIDB4MDAwYSwgMHgwMDA1LCAweDIwMDksCisJMHg0NjE5LCAweDIxMGMsIDB4YTE4NiwgMHgwMDAwLCAweDAxNjgsIDB4YTE4NiwgMHgwMDAxLCAweDAxMzgsCisJMHg3MDFmLCAweDAwMGIsIDB4NzA2MywgMHgwMDAxLCAweDc4MWIsIDB4MDA1NCwgMHgwMDA1LCAweDcwMWYsCisJMHgwMDBhLCAweDAwMDUsIDB4NzgxYiwgMHgwMGYyLCAweDAwMDUsIDB4NzgxYiwgMHgwMGZiLCAweDAwMDUsCisJMHg3ODFiLCAweDAwZmEsIDB4MDAwNSwgMHg3ODFiLCAweDAwY2MsIDB4MDAwNSwgMHg3ODFiLCAweDAwY2IsCisJMHgwMDA1LCAweDY4MTgsIDB4ZDBmYywgMHgwMTEwLCAweDY4MWIsIDB4MDAxZCwgMHg3MDYzLCAweDAwMDEsCisJMHg3ODFiLCAweDAwNTQsIDB4MDAwNSwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgxMTcwLCAweDc4MDgsCisJMHhjMDhjLCAweDc4MGEsIDB4ZTAwMCwgMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCwgMHg3OGVjLCAweGEwODQsCisJMHgwMDIxLCAweDAxMTgsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsIDB4MDAwNSwgMHg3ODA4LCAweGMwOGQsCisJMHg3ODBhLCAweDAwMDUsIDB4NzgzMCwgMHhhMDg0LCAweDAwNDAsIDB4MWRlMCwgMHhiMjg0LCAweDA4MDAsCisJMHgwMTE4LCAweDExMDQsIDB4M2M1OCwgMHgwMDEwLCAweDEzMDQsIDB4M2M1OCwgMHg3OGFjLCAweDAwMDUsCisJMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLCAweGUwMDAsIDB4ZTAwMCwgMHhlMDAwLCAweGUwMDAsCisJMHg3OGVjLCAweGEwODQsIDB4MDAyMSwgMHgwMTQwLCAweGIyODQsIDB4MDgwMCwgMHgwMTE4LCAweDExMDQsCisJMHgzYzY3LCAweDAwMTAsIDB4MTMwNCwgMHgzYzZhLCAweDc4YWMsIDB4MDAwNiwgMHg3ODA4LCAweGEwODUsCisJMHgwMDAyLCAweDc4MGEsIDB4MDAwZSwgMHgwMDA1LCAweGE3ODQsIDB4MDAwMSwgMHgxOTA0LCAweDMyMmEsCisJMHhhNzg0LCAweDAwNzAsIDB4MDE0MCwgMHgwMGM2LCAweDJkNjAsIDB4MmY2OCwgMHgwODBjLCAweDI0NjcsCisJMHgyZDc4LCAweDJjNjgsIDB4MDBjZSwgMHhhNzg0LCAweDAwMDgsIDB4MDE0OCwgMHg3ODRiLCAweDAwMDgsCisJMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwOTA0LCAweDMyMmEsIDB4MDgwNCwgMHgzYmU1LCAweGE3ODQsCisJMHgwMDA0LCAweDAxYzgsIDB4NzhiOCwgMHhhMDg0LCAweDgwMDAsIDB4MDFhOCwgMHg3ODRiLCAweDAwMDgsCisJMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwOTA0LCAweDMyMmEsIDB4NzhlNCwgMHhhMDg0LCAweDAwMDcsCisJMHhhMDg2LCAweDAwMDEsIDB4MTE0MCwgMHg3OGMwLCAweGE2ODUsIDB4NDgwMCwgMHgyMDMwLCAweDdlNWEsCisJMHg3ODFiLCAweDAwZmIsIDB4MDAwNSwgMHhhNzg0LCAweDAwODAsIDB4MDE0MCwgMHg3ODg0LCAweGQwZmMsCisJMHgwMTI4LCAweDA4MGMsIDB4M2EzMiwgMHg2ODFiLCAweDAwMjIsIDB4MDAwNSwgMHg2ODFiLCAweDAwMDMsCisJMHg3ODU4LCAweGEwODQsIDB4NWYwMCwgMHg2ODFlLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsCisJMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDkwNCwgMHgyYjg5LCAweGIyODQsCisJMHgwODAwLCAweDAxMTAsIDB4MDEwNCwgMHgyNTlkLCAweDAzMDQsIDB4MjU5ZCwgMHg2YjE0LCAweDgzMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ZDNmYywgMHgwMTE4LCAweGEwODAsCisJMHg0YjQwLCAweDAwMTAsIDB4YTA4MCwgMHg0YWMwLCAweDIwNjAsIDB4MjA0OCwgMHg3MDU2LCAweDJhNjAsCisJMHgwMDA1LCAweDAwYzYsIDB4Mjk2MCwgMHg2MDAwLCAweGQwYWMsIDB4MDkwNCwgMHgzZDJmLCAweDY4YTAsCisJMHhkMWFjLCAweDExMjAsIDB4YTA4NCwgMHgwZTAwLCAweDA5MDQsIDB4M2QyZCwgMHg2MTA4LCAweDgxMTcsCisJMHhhMThjLCAweDAwZmYsIDB4NjMxYywgMHg4MzJmLCAweGQwZGMsIDB4MDExMCwgMHhhMzlkLCAweDAwMDEsCisJMHhkMGNjLCAweDExYzgsIDB4YTU4NCwgMHgwMGZmLCAweDAxMzgsIDB4NzhlYywgMHhkMGU0LCAweDAxMTAsCisJMHg4MjEzLCAweDAwYjgsIDB4MjAyOSwgMHgwMDAwLCAweGExODIsIDB4MDAwYywgMHgxMjkwLCAweDc4ZWMsCisJMHhkMGU0LCAweDExMTgsIDB4MjAwOSwgMHgwMDBjLCAweDAwNjAsIDB4YTE4MiwgMHgwMDBiLCAweDEyNDgsCisJMHgyMDA5LCAweDAwMGEsIDB4MDAzMCwgMHgyMDA5LCAweDAwMzIsIDB4MjAxMSwgMHgwMDAwLCAweDIwMjksCisJMHgwMDAwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDYsIDB4NzhhYiwgMHgwMDA0LCAweDc5YWEsCisJMHg3OGFiLCAweDAwMDAsIDB4N2FhYSwgMHg3YmFhLCAweDdkYWEsIDB4YThjMCwgMHgwMDA4LCAweDY4MjAsCisJMHhhMDg1LCAweDEwMDAsIDB4NjgyMiwgMHgwODBjLCAweDNhNTUsIDB4YTA4NSwgMHgwMDAxLCAweDAwY2UsCisJMHgwMDA1LCAweGEyODIsIDB4MDAwNiwgMHgxOTA0LCAweDNhMjQsIDB4N2RhOCwgMHg3ZWFjLCAweDg2MzcsCisJMHhhNWFjLCAweDAwZmYsIDB4YTZiNCwgMHgwMGZmLCAweDdmYWMsIDB4ODc0NywgMHhhN2JjLCAweDAwZmYsCisJMHhhOGM0LCAweDAwZmYsIDB4NjkyMCwgMHhjMWJkLCAweDY5MjIsIDB4ZDFlNCwgMHgwOTA0LCAweDNkYTMsCisJMHhhMThjLCAweGVjZmYsIDB4NjkyMiwgMHhhNzgyLCAweDAwMDIsIDB4MWEwNCwgMHgzOWZlLCAweGE2YjQsCisJMHgwMGZmLCAweDA5MDQsIDB4M2RhMCwgMHhhNjgyLCAweDAwMzEsIDB4MWEwNCwgMHgzOWZlLCAweGE1ODIsCisJMHgwMDA5LCAweDBhMDQsIDB4MzlmZSwgMHhhODgyLCAweDAwMDMsIDB4MWEwNCwgMHgzOWZlLCAweGE4ODYsCisJMHgwMDAyLCAweDAxZDAsIDB4YTg4NiwgMHgwMDAwLCAweDE5MDQsIDB4MzlmZSwgMHgyMDAxLCAweDAwMGMsCisJMHg3OWVjLCAweGQxZTQsIDB4MDExMCwgMHgyMDAxLCAweDAwMGEsIDB4YTUwMiwgMHgxMjkwLCAweDA4MGMsCisJMHgzOWZlLCAweDAwYzYsIDB4Mjk2MCwgMHg2MDA0LCAweGEwODUsIDB4MDAxYSwgMHg2MDA2LCAweDYwMDAsCisJMHhjMGFjLCAweDYwMDIsIDB4MDBjZSwgMHgwMDA1LCAweGE3ODYsIDB4MDAwMCwgMHgwOTA0LCAweDM5ZmUsCisJMHg4NjM0LCAweGE2ODIsIDB4MDAxOCwgMHgwMjI4LCAweDAxMjAsIDB4MjAzMSwgMHgwMDE4LCAweDA4MDQsCisJMHgzZGYxLCAweGE2ODYsIDB4MDAxMCwgMHgxMTA4LCAweDg2MzAsIDB4ODUyYiwgMHg4NTJiLCAweDA4MGMsCisJMHgzYWM5LCAweDA5MDQsIDB4MzlmZSwgMHgwODBjLCAweDM4ZjcsIDB4MDgwYywgMHgzOTljLCAweDdlNTgsCisJMHhkNmQ0LCAweDExMTgsIDB4NzgxYiwgMHgwMDcxLCAweDAwMDUsIDB4NzgxYiwgMHgwMDgzLCAweDAwMDUsCisJMHgwODBjLCAweDM4ZjQsIDB4MGM5MCwgMHhhODg2LCAweDAwMDIsIDB4MTEwOCwgMHg4NjM0LCAweDcxNTQsCisJMHhhMTg4LCAweDAwMDAsIDB4MjEwYywgMHhkMWFjLCAweDA5MDQsIDB4MzlmZSwgMHhkMWVjLCAweDExMjAsCisJMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDAwLCAweGQxZTQsIDB4MTEyMCwgMHgyMDMxLCAweDAwMDAsCisJMHgyMDQxLCAweDAwMDAsIDB4YTc4MiwgMHgwMDAyLCAweDEyYzgsIDB4NjIxYywgMHhhMjg0LCAweDAwZmYsCisJMHhhNzA2LCAweDAxMTAsIDB4MjAzOSwgMHgwMDAwLCAweGE2MDUsIDB4MDE5MCwgMHg2MTA4LCAweDgxMWYsCisJMHhhMzljLCAweDAwZmYsIDB4MDE2OCwgMHhhMzAyLCAweDEyMDgsIDB4MjMzMCwgMHg4ODA3LCAweGE3MDUsCisJMHhhMDg2LCAweDAyMDEsIDB4MDE2MCwgMHhhODg2LCAweDAwMDAsIDB4MDE2OCwgMHgyMDM5LCAweDAwMDAsCisJMHgyMDQxLCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweGEwMDYsIDB4MjAxMCwgMHgwMDcwLCAweGEyODQsCisJMHhmZjAwLCAweDExMDgsIDB4MjA0MCwgMHhhMTg0LCAweDAwZmYsIDB4YTUwMiwgMHgwMTA4LCAweDIxMjgsCisJMHg4NTJiLCAweDg1MmIsIDB4MDgwYywgMHgzYWM5LCAweDBkNTgsIDB4MDgwYywgMHgzOGY3LCAweDA4MGMsCisJMHgzOTljLCAweDc4OWIsIDB4MDA4MCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDA2LCAweDc4YWIsCisJMHgwMDA0LCAweDdkYWEsIDB4NzhhYiwgMHgwMDAwLCAweDdlYWEsIDB4N2ZhYSwgMHgyODAwLCAweDc4YWEsCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA4LCAweDY4MjAsIDB4YzBlNSwgMHg2ODIyLCAweDA4MGMsCisJMHgzYTU1LCAweDc4NTgsIDB4YzA5NSwgMHg3ODVhLCAweDc4MWIsIDB4MDA4MiwgMHgwMDA1LCAweDAwMjAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwNjIsIDB4MDAwOSwgMHgwMDE0LCAweDAwMTQsIDB4OTg1NSwgMHg5ODRkLCAweDAwMTQsCisJMHg5OTExLCAweDk4ZmYsIDB4MDAxNCwgMHgwMDE0LCAweDAwOTAsIDB4MDBlNywgMHgwMTAwLCAweDA0MDIsCisJMHgyMDA4LCAweGY4ODAsIDB4MDAxOCwgMHgwMDE3LCAweDg0MGYsIDB4ZDhjMSwgMHgwMDE0LCAweDAwMTYsCisJMHhhMjBhLCAweDAwMTQsIDB4MzAwYiwgMHhhMjBjLCAweDAwMTQsIDB4MjUwMCwgMHgwMDEzLCAweDI1MDAsCisJMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsCisJMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHhhMjAwLCAweDM4MDYsCisJMHg4ODM5LCAweDIwYzQsIDB4MDg2NCwgMHhhODUwLCAweDMwMDgsIDB4MjhjMSwgMHg5ZDE4LCAweGEyMDEsCisJMHgzMDBjLCAweDI4NDcsIDB4ODE2MSwgMHg4NDZhLCAweDgwMDAsIDB4ODRhNCwgMHgxODU2LCAweDg4M2EsCisJMHhhODA4LCAweDI4ZTIsIDB4OWNjZSwgMHhhOGYzLCAweDA4NjQsIDB4YTgzZSwgMHgzMDBjLCAweGE4MDEsCisJMHgzMDA4LCAweDI4ZTEsIDB4OWNjZSwgMHgyOGEyLCAweDcxNjMsIDB4YTgzMSwgMHgyMDIxLCAweGE4MTgsCisJMHhhMjA1LCAweDg3MGMsIDB4ZDhkZSwgMHg2NGEwLCAweDZkZTAsIDB4NmZjMCwgMHg2N2E0LCAweDZjODAsCisJMHgwMjEyLCAweGEyMDUsIDB4ODgzZCwgMHg4ODJiLCAweDE4MTQsIDB4ODgzYiwgMHg3MDI3LCAweDg1ZjIsCisJMHhhNzM3LCAweGE1MzIsIDB4ZjAwMywgMHg4NTc2LCAweDg2NzcsIDB4YTgxMywgMHg4ODNlLCAweGE4MTEsCisJMHgyODgyLCAweDcxNjIsIDB4YTgxNCwgMHgyODBhLCAweGEyMDQsIDB4NjRjMCwgMHg2ZGUwLCAweDY3YTAsCisJMHg2ZmMwLCAweDE4MTQsIDB4ODgzYiwgMHg3MDIzLCAweDg1NzYsIDB4ODY3NywgMHhhODAyLCAweDc4NjEsCisJMHg4ODNlLCAweDIwNmEsIDB4MjhjMSwgMHg5ZDE4LCAweDIwNDIsIDB4MjEwMSwgMHhhOGNhLCAweDI5MDIsCisJMHhhMjBlLCAweGE4MGIsIDB4YTIwNywgMHgwMDE0LCAweGEyMDMsIDB4ODAwMCwgMHg4NWE0LCAweDE4NzIsCisJMHg4NzlhLCAweDg4M2MsIDB4MWZlMiwgMHhmNjAxLCAweGEyMDgsIDB4ODU2ZSwgMHg3MTIxLCAweDAwMTQsCisJMHgwNzA0LCAweDMwMDgsIDB4OWNjZSwgMHgwMDE0LCAweGEyMDIsIDB4ODAwMCwgMHg4NWE0LCAweDMwMDksCisJMHg4NGE4LCAweDE5ZTIsIDB4Zjg0NCwgMHg4NTZlLCAweDg4M2YsIDB4MDhlNiwgMHhhOGY1LCAweGY4NjEsCisJMHhhOGViLCAweGY4MDEsIDB4MDAxNCwgMHhmODgxLCAweDAwMTYsIDB4ODViMiwgMHg4MGYwLCAweDk1MzIsCisJMHhmYWEyLCAweDFkZTIsIDB4MDAxNCwgMHg4NTMyLCAweGYyMjEsIDB4MDAxNCwgMHgxZGUyLCAweDg0YTgsCisJMHhkNmUwLCAweDFmZTYsIDB4MDAxNCwgMHgzMDA4LCAweDgwMDAsIDB4Mjg0OSwgMHgxMDExLCAweGE4ZmMsCisJMHgzMDA4LCAweDgwMDAsIDB4YTAwMCwgMHgyMDgxLCAweDI4MDIsIDB4MTAxMSwgMHhhOGZjLCAweGE4ODksCisJMHgzMDA4LCAweDIwYTEsIDB4MjgzYywgMHgxMDExLCAweGE4ZmMsIDB4YTIwOSwgMHgwMDE3LCAweDMwMGMsCisJMHg4MDAwLCAweDg1YTQsIDB4MWRlMiwgMHhkYWMxLCAweDAwMTQsIDB4MDIxMCwgMHhhODAxLCAweDAwMTQsCisJMHgyNmUwLCAweDg3M2EsIDB4ZmFhMywgMHgxOWYyLCAweDI2ZTAsIDB4MThmMiwgMHgwMDE0LCAweGEyMGIsCisJMHgwMDE0LCAweGEyMGQsIDB4MzgwNiwgMHgwMjEwLCAweDlkMjIsIDB4MDcwNCwgMHhhMjA2LCAweDY4NjUsCisJMHg4MTdlLCAweDg0MmEsIDB4MWRjMSwgMHg4ODIzLCAweDAwMTYsIDB4NjA0MiwgMHg4MDA4LCAweGE4ZmEsCisJMHg4MTYwLCAweDg0MmEsIDB4ODE4MCwgMHhmMDIxLCAweDMwMDgsIDB4ODRhOCwgMHgxMWQ3LCAweDcwNDIsCisJMHgyMGRkLCAweDAwMTEsIDB4MjBkNSwgMHg4ODIyLCAweDAwMTYsIDB4MDAwMCwgMHgwMTI2LCAweDcwZDAsCisJMHhhMDg0LCAweDRjMDAsIDB4ODAwNCwgMHgyMDkwLCAweDcyMDQsIDB4NzAwOCwgMHhjMDljLCAweGEyMDUsCisJMHgxMWEwLCAweDcyMGMsIDB4ODJmZiwgMHgwMTI4LCAweDhhZmYsIDB4MTE3OCwgMHg3MjAwLCAweGQyODQsCisJMHgxMTYwLCAweDc4MDQsIDB4ZDBjYywgMHgwMTEwLCAweDA4MGMsIDB4NDMyOCwgMHg3MDA3LCAweDAwMDgsCisJMHg3MDAzLCAweDAwMDgsIDB4MDEyZSwgMHgyMDAwLCAweDAwMDUsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDMsCisJMHg3MDAyLCAweGM2OWMsIDB4ZDA4NCwgMHgwNTg4LCAweDcxMDgsIDB4ZTAwMCwgMHg3MDA4LCAweGExMDYsCisJMHgxZGQ4LCAweGExODQsIDB4MDAwMywgMHgwOTA0LCAweDNmYTIsIDB4YTE4NCwgMHgwMWUwLCAweDE5MDQsCisJMHgzZmEyLCAweGQxZjQsIDB4MWQ4OCwgMHhhMTg0LCAweDMwMDAsIDB4YTA4NiwgMHgxMDAwLCAweDBkNjAsCisJMHgyMDExLCAweDAxODAsIDB4NzEwYywgMHg4MjExLCAweDAxMzAsIDB4NzAwOCwgMHhkMGY0LCAweDFkMjAsCisJMHg3MDBjLCAweGExMDYsIDB4MGRjMCwgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHhlMDAwLCAweDcwMDgsCisJMHhhMTA2LCAweDFkZDgsIDB4YTE4NCwgMHgwMDAzLCAweDA1NjgsIDB4ZDE5NCwgMHgwZGIwLCAweGQxZjQsCisJMHgwNTQ4LCAweDcwMDcsIDB4MDAwMiwgMHgwODgwLCAweDA0MjgsIDB4NzEwOCwgMHhkMWZjLCAweDAxMzAsCisJMHgwODBjLCAweDQwYWUsIDB4OGFmZiwgMHgwOTA0LCAweDNmMmMsIDB4MGNiOCwgMHg3MDBjLCAweGEwOGMsCisJMHgwN2ZmLCAweDAxZTgsIDB4NzAwNCwgMHhkMDg0LCAweDAxNzgsIDB4NzAxNCwgMHhhMDA1LCAweDExNDgsCisJMHg3MDEwLCAweDczMTAsIDB4YTMwNiwgMHgxZGUwLCAweDIzMDAsIDB4YTAwNSwgMHgwMTI4LCAweGExMDIsCisJMHgxZTIwLCAweDcwMDcsIDB4MDAxMCwgMHgwMDMwLCAweDhhZmYsIDB4MDE0OCwgMHgwODBjLCAweDQyNmIsCisJMHgxZGU4LCAweDA5ZDgsIDB4MDgwYywgMHg0MDM0LCAweDAxMmUsIDB4MjAwMCwgMHgwMDA1LCAweDcyMDQsCisJMHg3MTA4LCAweGMxOWMsIDB4ODEwMywgMHgxMjE4LCAweDcwMDcsIDB4MDAwMiwgMHgwY2MwLCAweGEyMDUsCisJMHgxZDg4LCAweDcwMDcsIDB4MDAwOCwgMHg3MDAzLCAweDAwMDgsIDB4MDAwNiwgMHgyMDAxLCAweDQ2MDEsCisJMHgyMDA0LCAweGQwY2MsIDB4MDExMCwgMHgwODBjLCAweDQzMjgsIDB4MDAwZSwgMHgwMTJlLCAweDIwMDAsCisJMHgwMDA1LCAweDY0MjgsIDB4ODRmZiwgMHgwNTA4LCAweDJjNzAsIDB4NzAwNCwgMHhhMGJjLCAweDAwMGYsCisJMHhhN2I4LCAweDNmZjUsIDB4MjczYywgMHg4N2ZiLCAweDExNDgsIDB4MDIxMCwgMHgwODBjLCAweDI1NGMsCisJMHg2MDljLCAweGEwNzUsIDB4MDE5MCwgMHgwYzg4LCAweDIwMzksIDB4M2ZlYSwgMHgyNzA0LCAweGFlNjgsCisJMHg2ODA4LCAweGE2MzAsIDB4NjgwYywgMHhhNTI5LCAweDg0MjEsIDB4MDEzOCwgMHg4NzM4LCAweDI3MDQsCisJMHhhMDA1LCAweDFkYTgsIDB4NzA5YywgMHhhMDc1LCAweDFkMDAsIDB4MDAwNSwgMHgwMDAwLCAweDAwMDUsCisJMHgwMDA5LCAweDAwMGQsIDB4MDAxMSwgMHgwMDE1LCAweDAwMTksIDB4MDAxZCwgMHgwMDAwLCAweDAwMDMsCisJMHgwMDA5LCAweDAwMGYsIDB4MDAxNSwgMHgwMDFiLCAweDAwMDAsIDB4MDAwMCwgMHgzZmVhLCAweDNmZTcsCisJMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDNmZWEsIDB4MDAwMCwgMHgzZmYyLCAweDNmZWYsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNmZjIsIDB4MDAwMCwgMHgzZmVkLCAweDNmZWQsCisJMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDNmZWQsIDB4MDAwMCwgMHgzZmYzLCAweDNmZjMsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNmZjMsIDB4MjA3OSwgMHg0NjAwLCAweDIwNzEsCisJMHgwMDEwLCAweDcwMDcsIDB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAxLCAweDIwMDksCisJMHgwMDAyLCAweDIwNzEsIDB4MDA1MCwgMHg3MDA3LCAweDAwMGEsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsCisJMHgwMDAwLCAweDIwMDEsIDB4MDFmZiwgMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwgMHg4MTA5LCAweDAxMTgsCisJMHgyMDcxLCAweDAwMjAsIDB4MGM4MCwgMHgwMDA1LCAweDcwMDQsIDB4ODAwNCwgMHgxYTA0LCAweDQwOGEsCisJMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgxZGUwLCAweGExODQsIDB4MDFlMCwgMHgwMTIwLCAweDA4MGMsCisJMHg0MGU2LCAweDA4MDQsIDB4NDBhYSwgMHg3MDA3LCAweDAwMTIsIDB4MjAxOSwgMHgwMDAwLCAweDcxMDgsCisJMHg3MDA4LCAweGExMDYsIDB4MWRlMCwgMHhhMTg0LCAweDAxZTAsIDB4MDEyMCwgMHgwODBjLCAweDQwZTYsCisJMHgwODA0LCAweDQwYWEsIDB4YTE5YywgMHgzMDBjLCAweGEzODYsIDB4MjAwNCwgMHgwMTkwLCAweGEzODYsCisJMHgwMDA4LCAweDAxYzAsIDB4NzAwNCwgMHhkMDg0LCAweDExNDgsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsCisJMHgxZGUwLCAweGExODQsIDB4MDAwMywgMHgwMTEwLCAweDA4MDQsIDB4NDBlNiwgMHhhMzg2LCAweDIwMGMsCisJMHgxOWYwLCAweDcyMDAsIDB4ODIwNCwgMHgwMjMwLCAweDczMGMsIDB4YTM4NCwgMHgwN2ZmLCAweDAxMTAsCisJMHgwODBjLCAweDI1NGMsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MWRlMCwgMHhhMTg0LCAweDAxZTAsCisJMHgwMTE4LCAweDA4MGMsIDB4NDBlNiwgMHgwNDcwLCAweDcwMDcsIDB4MDAxMiwgMHg3MDAwLCAweGQwODQsCisJMHgxMTQ4LCAweDczMTAsIDB4NzAxNCwgMHhhMzA1LCAweDAxMjgsIDB4NzEwYywgMHhhMTg0LCAweDA3ZmYsCisJMHgxOTA0LCAweDQwMzQsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MWRlMCwgMHhhMTg0LCAweDAxZTAsCisJMHgwMTE4LCAweDA4MGMsIDB4NDBlNiwgMHgwMGIwLCAweDcwMDcsIDB4MDAxMiwgMHg3MDA3LCAweDAwMDgsCisJMHg3MDA0LCAweGQwOWMsIDB4MWRlOCwgMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgxZGUwLCAweGExODQsCisJMHgwMWUwLCAweDAxMTgsIDB4MDgwYywgMHg0MGU2LCAweDAwMjgsIDB4NzAwNywgMHgwMDEyLCAweDcxMDgsCisJMHg4MTAzLCAweDBlODgsIDB4NzAwMywgMHgwMDA4LCAweDAwMDUsIDB4NzEwOCwgMHhhMTg0LCAweDAxZTAsCisJMHgxNWE4LCAweDcxMDgsIDB4YTE4NCwgMHgwMWUwLCAweDE1ODgsIDB4YTE4NCwgMHgwMDA3LCAweDAwMDIsCisJMHg0MGMyLCAweDQwZDAsIDB4NDBjMCwgMHg0MGQwLCAweDQwYzAsIDB4NDEyMCwgMHg0MGMwLCAweDQxMWUsCisJMHgwODBjLCAweDI1NGMsIDB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YzA4ZCwgMHg3MDA2LCAweDhhZmYsCisJMHgxMTE4LCAweDIwNDksIDB4MDAwMCwgMHgwMDA1LCAweDA4MGMsIDB4NDI2YiwgMHgxZGU4LCAweDAwMDUsCisJMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhjMDhkLCAweDcwMDYsIDB4NzAwNCwgMHhkMDg0LCAweDExNDAsCisJMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgxZGUwLCAweGExODQsIDB4MDAwMywgMHgwMTA4LCAweDAwMzAsCisJMHg4YWZmLCAweDAxMTgsIDB4MDgwYywgMHg0MjZiLCAweDFkZTgsIDB4MDAwNSwgMHg3MDA3LCAweDAwMTIsCisJMHg3MTA4LCAweDFkMDQsIDB4NDBlOSwgMHgyMDkxLCAweDYwMDAsIDB4MWQwNCwgMHg0MGVkLCAweDIwOTEsCisJMHg2MDAwLCAweDcwMDcsIDB4MDAxMiwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNCwgMHhkMDljLCAweDFkZTgsCisJMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHhkMWZjLCAweDFkZDgsIDB4NzAwMywgMHgwMDAwLCAweDcwMDAsCisJMHhhMDA1LCAweDExMzAsIDB4NzAwNCwgMHhhMDA1LCAweDExMTgsIDB4NzAwYywgMHhhMDA1LCAweDAxMDgsCisJMHgwYzQwLCAweDIwNDksIDB4MDAwMCwgMHhiMjg0LCAweDAyMDAsIDB4MDExOCwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDNiODEsIDB4NjgxYiwgMHgwMDAyLCAweDIwNTEsCisJMHgwMDAwLCAweDAwMDUsIDB4MDgwYywgMHgyNTRjLCAweDA4MGMsIDB4MjU0YywgMHgwODBjLCAweDQxNWYsCisJMHg3MjEwLCAweDcxMTQsIDB4NzAwYywgMHhhMDljLCAweDA3ZmYsIDB4MjgwMCwgMHhhMzAwLCAweGEyMTEsCisJMHhhMTg5LCAweDAwMDAsIDB4MDRhMSwgMHgyNzA0LCAweDJjNTgsIDB4YWM2MCwgMHg2MzA4LCAweDIyMDAsCisJMHhhMzIyLCAweDYzMGMsIDB4MjEwMCwgMHhhMzFiLCAweDI0MDAsIDB4YTMwNSwgMHgwMTQwLCAweDEyMzgsCisJMHg4NDEyLCAweDgyMTAsIDB4ODMwYSwgMHhhMTg5LCAweDAwMDAsIDB4MmI2MCwgMHgwYzU4LCAweDJiNjAsCisJMHg4YTA3LCAweDAwMDYsIDB4NjAwNCwgMHhkMDljLCAweDAxMTgsIDB4YTdiYSwgMHgzZmVmLCAweDAwMTAsCisJMHhhN2JhLCAweDNmZTcsIDB4MDAwZSwgMHhhNzNkLCAweDJjMDAsIDB4Njg4NiwgMHg2ZjhhLCAweDZjOTIsCisJMHg2YjhlLCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LCAweDFkZTAsIDB4YTE4NCwgMHgwMWUwLCAweDAxMTAsCisJMHgwODBjLCAweDQwZTYsIDB4NzAwNywgMHgwMDEyLCAweDA4MGMsIDB4NDAzNCwgMHgwMDA1LCAweDhhNTAsCisJMHg4NzM5LCAweDI3MDQsIDB4YTAwNCwgMHgxMTY4LCAweDYwMDAsIDB4YTA2NCwgMHgxMTA4LCAweDJkNjAsCisJMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDQwMDUsIDB4MjAzYywgMHg4N2ZiLCAweDA5MGMsCisJMHgyNTRjLCAweDAwMDUsIDB4MDEyNiwgMHgwMGQ2LCAweDcwZDAsIDB4YTA4NCwgMHg0YzAwLCAweDgwMDQsCisJMHgyMDkwLCAweDAwZGUsIDB4Njg4NCwgMHgyMDYwLCAweDY4ODgsIDB4NmI4YywgMHg2YzkwLCAweDgwNTcsCisJMHhhYWQ0LCAweDAwZmYsIDB4YTA4NCwgMHgwMGZmLCAweDAwMDYsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDgsCisJMHgwMDBlLCAweDAxMTgsIDB4YTBiOCwgMHgzZmVmLCAweDAwMTAsIDB4YTBiOCwgMHgzZmU3LCAweGIyODQsCisJMHgwMjAwLCAweDAxMTAsIDB4N2UyMCwgMHgwMDA4LCAweDdlMjQsIDB4YTZiNSwgMHgwMDBjLCAweDY4MWMsCisJMHhkMGI0LCAweDAxMDgsIDB4YzY4NSwgMHgyNDAwLCAweGEzMDUsIDB4MDUxOCwgMHgyYzU4LCAweDI3MDQsCisJMHg2MTA0LCAweGFjNjAsIDB4NjAwMCwgMHhhNDAwLCAweDcwMWEsIDB4NjAwNCwgMHhhMzAxLCAweDcwMWUsCisJMHhkMTljLCAweDAxNDAsIDB4NjAxMCwgMHhhMDgxLCAweDAwMDAsIDB4NzAyMiwgMHg2MDE0LCAweGEwODEsCisJMHgwMDAwLCAweDcwMjYsIDB4NjIwOCwgMHgyNDAwLCAweGEyMDIsIDB4NzAxMiwgMHg2MjBjLCAweDIzMDAsCisJMHhhMjAzLCAweDcwMTYsIDB4NzYwMiwgMHg3MDA3LCAweDAwMDEsIDB4MmI2MCwgMHgwODBjLCAweDQyOTIsCisJMHgwMDEwLCAweDA4MGMsIDB4NDI2YiwgMHgxZGU4LCAweDAxMmUsIDB4MjAwMCwgMHgwMDA1LCAweDAxMjYsCisJMHgwMGQ2LCAweDcwZDAsIDB4YTA4NCwgMHg0YzAwLCAweDgwMDQsIDB4MjA5MCwgMHgwMGRlLCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDQsIDB4ZDA5NCwgMHgxZGU4LCAweDcwMDMsIDB4MDAwOCwgMHgwMTJlLCAweDIwMDAsCisJMHgwMDA1LCAweDAxMjYsIDB4MDBkNiwgMHg3MGQwLCAweGEwODQsIDB4NGMwMCwgMHg4MDA0LCAweDIwOTAsCisJMHgwMGRlLCAweDdlMjAsIDB4YjI4NCwgMHgwMjAwLCAweDExMDgsIDB4N2UyNCwgMHhhNmI1LCAweDAwMGMsCisJMHg2ODFjLCAweGQwYWMsIDB4MTExOCwgMHhjNjg1LCAweDcwMDMsIDB4MDAwMCwgMHg2ODI4LCAweDIwNTAsCisJMHgyZDYwLCAweDYwMDQsIDB4YTBiYywgMHgwMDBmLCAweGE3YjgsIDB4M2ZmNSwgMHgyNzNjLCAweDg3ZmIsCisJMHgxMTM4LCAweDAyMTAsIDB4MDgwYywgMHgyNTRjLCAweDY4OWMsIDB4YTA2NSwgMHgwMTIwLCAweDBjODgsCisJMHgwODBjLCAweDQyNmIsIDB4MWRlOCwgMHgwMTJlLCAweDIwMDAsIDB4MDAwNSwgMHgwMTI2LCAweDAwMDYsCisJMHgwMDE2LCAweDAwZDYsIDB4NzBkMCwgMHhhMDg0LCAweDRjMDAsIDB4ODAwNCwgMHgyMDkwLCAweDdlMjAsCisJMHhiMjg0LCAweDAyMDAsIDB4MTEwOCwgMHg3ZTI0LCAweDAwZGUsIDB4MDAzZSwgMHgwMDRlLCAweGE2YjUsCisJMHgwMDBjLCAweDY4MWMsIDB4ZDBiNCwgMHgwMTI4LCAweGM2ODUsIDB4NzAwMywgMHgwMDAwLCAweDcwMDcsCisJMHgwMDA0LCAweDIwNDksIDB4NDIwNiwgMHg2ODI4LCAweGEwNTUsIDB4MDBkNiwgMHgwOTA0LCAweDQyNjcsCisJMHgyZDcwLCAweDJlNjAsIDB4NzAwNCwgMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHgzZmY1LCAweDI3M2MsCisJMHg4N2ZiLCAweDExNDAsIDB4MDIxMCwgMHgwODBjLCAweDI1NGMsIDB4NzA5YywgMHhhMDc1LCAweDIwNjAsCisJMHgwNTcwLCAweDBjODAsIDB4MjcwNCwgMHhhZTY4LCAweDY4MDgsIDB4YTQyMiwgMHg2ODBjLCAweGEzMWIsCisJMHgwMjY4LCAweDhhNTEsIDB4MTExMCwgMHgwODBjLCAweDI1NGMsIDB4ODczOCwgMHgyNzA0LCAweGEwMDUsCisJMHgxZDkwLCAweDcwOWMsIDB4YTA3NSwgMHgyMDYwLCAweDAxZDAsIDB4MDhlMCwgMHg4NDIyLCAweDg0MjAsCisJMHg4MzFhLCAweGEzOTksIDB4MDAwMCwgMHg2OTA4LCAweDI0MDAsIDB4YTEyMiwgMHg2OTBjLCAweDIzMDAsCisJMHhhMTFiLCAweDEyMTAsIDB4MDgwYywgMHgyNTRjLCAweGIyODQsIDB4MDIwMCwgMHgwMTE4LCAweDIwNzEsCisJMHgwMDUwLCAweDAwMTAsIDB4MjA3MSwgMHgwMDIwLCAweDAwZGUsIDB4MDgwNCwgMHg0MTliLCAweDAwZGUsCisJMHgwMTJlLCAweDIwMDAsIDB4MDAwNSwgMHg3MDA4LCAweDAwMDYsIDB4YTA4NCwgMHgwMWUwLCAweDAwMGUsCisJMHgwMTEwLCAweGEwMDYsIDB4MDAwNSwgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDExMDgsCisJMHgwMDA1LCAweDI3MDQsIDB4YWM3OCwgMHg3ODAwLCAweDcwMWEsIDB4NzgwNCwgMHg3MDFlLCAweDc4MDgsCisJMHg3MDEyLCAweDc4MGMsIDB4NzAxNiwgMHg2MDA0LCAweGQwOWMsIDB4MDEyMCwgMHg3ODEwLCAweDcwMjIsCisJMHg3ODE0LCAweDcwMjYsIDB4NzYwMiwgMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhjMDg1LCAweDcwMDYsCisJMHgyMDc5LCAweDQ2MDAsIDB4OGE1MSwgMHgwMWU4LCAweDg3MzgsIDB4MjcwNCwgMHhhMDA1LCAweDExNjgsCisJMHg2MDljLCAweGEwMDUsIDB4MDFiOCwgMHgyMDYwLCAweDYwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgzZmY1LCAweDIwM2MsIDB4ODdmYiwgMHgwOTBjLCAweDI1NGMsIDB4NzAwOCwgMHgwMDA2LCAweGEwODQsCisJMHgwMWUwLCAweDAwMGUsIDB4MDExMCwgMHhhMDA2LCAweDAwMjgsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsCisJMHgwMDAzLCAweDAwMDUsIDB4MjA1MSwgMHgwMDAwLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZDYsCisJMHg3MGQwLCAweGEwODQsIDB4NGMwMCwgMHg4MDA0LCAweDIwOTAsIDB4MDBkZSwgMHgwMDhlLCAweDcxMDgsCisJMHhhMTg0LCAweDAwMDMsIDB4MTEyOCwgMHg2ODI4LCAweGEwMDUsIDB4MDE3OCwgMHgwODA0LCAweDNmNDUsCisJMHg3MTA4LCAweGQxZmMsIDB4MDExOCwgMHgwODBjLCAweDQwYWUsIDB4MGM4OCwgMHg3MDA3LCAweDAwMTAsCisJMHg3MTA4LCAweGQxZmMsIDB4MGRlOCwgMHgwODBjLCAweDQwYWUsIDB4NzAwOCwgMHhhMDg2LCAweDAwMDgsCisJMHgxZDMwLCAweDcwMDAsIDB4YTAwNSwgMHgxZDE4LCAweDcwMDMsIDB4MDAwMCwgMHgyMDQ5LCAweDAwMDAsCisJMHgwMDA2LCAweDIwMDEsIDB4NDYwMSwgMHgyMDA0LCAweGQwY2MsIDB4MDExMCwgMHgwODBjLCAweDQzMjgsCisJMHgwMDBlLCAweDAxMmUsIDB4MjAwMCwgMHgwMDA1LCAweDAxMjYsIDB4MDE0NiwgMHgwMTM2LCAweDAxNTYsCisJMHgwMGM2LCAweDAwZDYsIDB4NzBkMCwgMHhhMDg0LCAweDRjMDAsIDB4ODAwNCwgMHgyMDkwLCAweDAwZGUsCisJMHgyMDQ5LCAweDQyZWMsIDB4YWQ4MCwgMHgwMDExLCAweDIwYTAsIDB4YjI4NCwgMHgwMjAwLCAweDAxMTgsCisJMHgyMDk5LCAweDAwMzIsIDB4MDAxMCwgMHgyMDk5LCAweDAwMzEsIDB4NzAwYywgMHhhMDg0LCAweDA3ZmYsCisJMHg2ODJhLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAxLCAweDAxMTgsCisJMHg4MDAwLCAweDgwYWMsIDB4NTNhNSwgMHg3MDBjLCAweGEwODQsIDB4MDdmZiwgMHgwMTMwLCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDFkZTAsIDB4MDBjZSwgMHgyMDQ5LCAweDAwMDAsCisJMHg3MDAzLCAweDAwMDAsIDB4MDE1ZSwgMHgwMTNlLCAweDAxNGUsIDB4MDEyZSwgMHgyMDAwLCAweDAwMDUsCisJMHg2ODE0LCAweGQwZmMsIDB4MDkwNCwgMHg0MzZiLCAweDcwMDAsIDB4ZDA4NCwgMHgwNWUwLCAweDdlMjQsCisJMHhhNmI1LCAweDAwMDQsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDFkZTAsCisJMHg3MTE4LCAweDAwMTYsIDB4NzExYywgMHgwMDE2LCAweDcxMjAsIDB4MDAxNiwgMHg3MTI0LCAweDAwMTYsCisJMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgzZmZmLCAweDcwMjMsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsCisJMHg3MDEzLCAweDAwMDQsIDB4NzAxNywgMHgwMDAwLCAweDc2MDIsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsCisJMHhmZmZmLCAweDIwMDksIDB4MDAzMSwgMHgyMDBhLCAweDIwMGEsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsCisJMHgxZGUwLCAweGQxZmMsIDB4MGRkMCwgMHgwMDJlLCAweDcyMjYsIDB4MDAyZSwgMHg3MjIyLCAweDAwMmUsCisJMHg3MjFlLCAweDAwMmUsIDB4NzIxYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwOCwgMHhhMDg2LCAweDAwMDgsCisJMHgwMTEwLCAweDA4MDQsIDB4NDBlNiwgMHg3MDA3LCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDAwMDUsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA5MSwgMHg2MDAwLCAweDc4YWMsIDB4YTAwNSwgMHgxMTY4LCAweDc5NzQsCisJMHg3MGQwLCAweGExMDYsIDB4MTE0OCwgMHg3ODFjLCAweGEwMDUsIDB4MDEzMCwgMHg3ODFmLCAweDAwMDAsCisJMHgwZTA0LCAweDQzODQsIDB4MjA5MSwgMHg0MDgwLCAweDIwNjksIDB4NDY4MCwgMHhkN2ZjLCAweDExMTAsCisJMHgyMDY5LCAweDQ2NDAsIDB4NjgwMCwgMHhhMDg0LCAweDAwMGYsIDB4MTE5OCwgMHg2OGQwLCAweGQwYjQsCisJMHgwMTgwLCAweGQwYmMsIDB4MTE3MCwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHhkN2ZjLCAweDExMTAsCisJMHgyMDc5LCAweDAyMDAsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MTExMCwgMHgwODBjLCAweDIyYWUsCisJMHgwMGZlLCAweDc4MzAsIDB4ODAwMSwgMHg3ODMyLCAweDE5MDQsIDB4NDQwYiwgMHg3ODM0LCAweDc4MzIsCisJMHgyMDYxLCAweDZiYzAsIDB4MjA2OSwgMHg0NjgwLCAweGM3ZmQsIDB4NjhjYywgMHhhMDA1LCAweDAxMjgsCisJMHg4MDAxLCAweDY4Y2UsIDB4MTExMCwgMHgwODBjLCAweDQ1NzcsIDB4NjgwMCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMTY4LCAweGEwODYsIDB4MDAwMSwgMHgwMTUwLCAweDY4NDAsIDB4YTAwZCwgMHgwMTM4LCAweDIxMDQsCisJMHhhMDA1LCAweDAxMjAsIDB4ODAwMSwgMHgyMDBhLCAweDA5MDQsIDB4NDUxNCwgMHg2ODE0LCAweGEwMDUsCisJMHgwMWE4LCAweDgwMDEsIDB4NjgxNiwgMHgxMTkwLCAweDY4YTMsIDB4MDAwMSwgMHgwMGY2LCAweGQ3ZmMsCisJMHgxMTE4LCAweDIwNzksIDB4MDIwMCwgMHgwMDEwLCAweDIwNzksIDB4MDEwMCwgMHgwODBjLCAweDNjNDYsCisJMHgwMGZlLCAweDY4NjAsIDB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4MjJhZSwgMHg2ODdjLCAweGEwMDUsCisJMHgwMTQwLCAweDgwMDEsIDB4Njg3ZSwgMHgxMTI4LCAweDY4NjMsIDB4MDAwMCwgMHg2OGQwLCAweGMwYzUsCisJMHg2OGQyLCAweDY4ZDAsIDB4ZDBmYywgMHgwMWIwLCAweGMwZmMsIDB4NjhkMiwgMHgyMGE5LCAweDAyMDAsCisJMHg2MDM0LCAweGEwMDUsIDB4MDE1OCwgMHg4MDAxLCAweDYwMzYsIDB4NjhkMCwgMHhjMGZkLCAweDY4ZDIsCisJMHgxMTI4LCAweDYwMTAsIDB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4MjJhZSwgMHhhY2UwLCAweDAwMTAsCisJMHgxZjA0LCAweDQzZjAsIDB4ZDdmYywgMHgwMTM4LCAweDIwNjEsIDB4NGJjMCwgMHgyMDY5LCAweDQ2NDAsCisJMHhjN2ZjLCAweDA4MDQsIDB4NDNhZCwgMHgwNDU5LCAweDc4MzgsIDB4ODAwMSwgMHg3ODNhLCAweDExYTAsCisJMHg3ODNjLCAweDc4M2EsIDB4MjA2MSwgMHg0YmMwLCAweDIwNjksIDB4NDY0MCwgMHhjN2ZjLCAweDY4MGMsCisJMHhhMDA1LCAweDAxMTAsIDB4MDgwYywgMHg0NDg3LCAweGQ3ZmMsIDB4MTEzMCwgMHgyMDYxLCAweDZiYzAsCisJMHgyMDY5LCAweDQ2ODAsIDB4YzdmZCwgMHgwYzk4LCAweDc4MTAsIDB4ZDBjYywgMHgwMTY4LCAweGQwYWMsCisJMHgxMTIwLCAweGQwYTQsIDB4MDE0OCwgMHhjMGFkLCAweDc4MTIsIDB4MjA5MSwgMHg4MDAxLCAweDBlMDQsCisJMHg0NDMzLCAweDA4MGMsIDB4MjA3YSwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMSwgMHgwMDA1LCAweDc4NDAsCisJMHg4MDAxLCAweDc4NDIsIDB4MTkwNCwgMHg0NDg2LCAweDc4NDQsIDB4Nzg0MiwgMHgyMDY5LCAweDQ2NDAsCisJMHhjN2ZjLCAweDIwNzksIDB4MDIwMCwgMHg2OGQ0LCAweGEwMDUsIDB4MDEzOCwgMHg3ZGUwLCAweGE1MDQsCisJMHgxMTIwLCAweDY4ZDYsIDB4NjhkMCwgMHhjMGJjLCAweDY4ZDIsIDB4MjA3OSwgMHg0NjAwLCAweDY4MTAsCisJMHhhMDA1LCAweDExMTAsIDB4MjAwMSwgMHgwMTAxLCAweDgwMDEsIDB4NjgxMiwgMHhkN2ZjLCAweDAxMTgsCisJMHhhMDgwLCAweDhjZDAsIDB4MDAxMCwgMHhhMDgwLCAweDhiYzAsIDB4MjA0MCwgMHgyMDA0LCAweGEwNjUsCisJMHgwMWUwLCAweDYwMjQsIDB4YTAwNSwgMHgwMWIwLCAweDgwMDEsIDB4NjAyNiwgMHgxMTk4LCAweDY4MDAsCisJMHhhMDA1LCAweDAxMzAsIDB4Njg0OCwgMHhhYzA2LCAweDExMTgsIDB4MDgwYywgMHg0NTE0LCAweDAwNjgsCisJMHg2ODYwLCAweGEwMDUsIDB4MDExOCwgMHg2MDI3LCAweDAwMDEsIDB4MDAyMCwgMHgwODBjLCAweDQ0YzgsCisJMHgyODA0LCAweDBjMjgsIDB4NjAwMCwgMHgyYzQwLCAweDBjMTAsIDB4ZDdmYywgMHgxMTM4LCAweDIwNjksCisJMHg0NjgwLCAweGM3ZmQsIDB4MjA3OSwgMHgwMTAwLCAweDA4MDQsIDB4NDQ0MywgMHgwMDA1LCAweDIwMDksCisJMHgwMDAwLCAweDIwYTksIDB4MDIwMCwgMHg2MDA4LCAweGQwOWMsIDB4MDU1OCwgMHg2MDI0LCAweGEwMDUsCisJMHgwMTE4LCAweDgwMDEsIDB4NjAyNiwgMHgwNDE4LCAweDYwMDgsIDB4YzA5YywgMHhkMDg0LCAweDExMTAsCisJMHhkMGFjLCAweDAxYzAsIDB4NjAwYSwgMHg2MDA0LCAweGEwMDUsIDB4MDFkOCwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDE2LCAweDIwNjgsIDB4NjAxMCwgMHg4MDAxLCAweDYwMTIsIDB4MDgwYywgMHgzN2E0LCAweDJkMDAsCisJMHgyYzY4LCAweDIwNjAsIDB4MDgwYywgMHgxYmUzLCAweDA4MGMsIDB4MWQ5NSwgMHgwMDFlLCAweDAwY2UsCisJMHgwMGRlLCAweDAwMzgsIDB4YzBiZCwgMHg2MDBhLCAweGExOGQsIDB4MDAwMSwgMHgwMDEwLCAweGExOGQsCisJMHgwMTAwLCAweGFjZTAsIDB4MDAxMCwgMHgxZjA0LCAweDQ0OGIsIDB4YTE4NCwgMHgwMDAxLCAweDAxMzAsCisJMHhhMThjLCAweGZmZmUsIDB4NjkwZSwgMHgwODBjLCAweDIyYWUsIDB4MDAwOCwgMHg2OTBlLCAweDAwMDUsCisJMHgyYzAwLCAweDY4N2EsIDB4NjcxNCwgMHg2ZjcyLCAweDYwMTcsIDB4MDAwMCwgMHg2MDJiLCAweDAwMDAsCisJMHg2MDFiLCAweDAwMDYsIDB4NjBiNCwgMHhhMDg0LCAweDVmMDAsIDB4NjAxZSwgMHg2MDIwLCAweGEwODQsCisJMHgwMGZmLCAweGEwODUsIDB4MDA2MCwgMHg2MDIyLCAweDYwMDAsIDB4MjA0MiwgMHg2ODU4LCAweGFjMDYsCisJMHgxMTEwLCAweDI4MDAsIDB4Njg1YSwgMHgwODBjLCAweDFiN2IsIDB4NjgxOCwgMHhhMDA1LCAweDAxMTAsCisJMHg4MDAxLCAweDY4MWEsIDB4NjgwOCwgMHhjMGE0LCAweDY4MGEsIDB4NjgxMCwgMHg3OTA4LCAweDgxMDksCisJMHg3OTBhLCAweDgwMDEsIDB4MTMxMCwgMHgwODBjLCAweDI1NGMsIDB4NjgxMiwgMHgxMTE4LCAweDc5MTAsCisJMHhjMWE1LCAweDc5MTIsIDB4NjAyZiwgMHgwMDAwLCAweDYwMzMsIDB4MDAwMCwgMHgyYzY4LCAweDA4MGMsCisJMHgxZGEyLCAweGQ3ZmMsIDB4MTExOCwgMHgyMDY5LCAweDQ2NDAsIDB4MDAxMCwgMHgyMDY5LCAweDQ2ODAsCisJMHg2OTEwLCAweGExODQsIDB4MDEwMCwgMHgyMDAxLCAweDAwMDYsIDB4MTExOCwgMHg2OTc2LCAweDIwMDEsCisJMHgwMDA0LCAweDA4MGMsIDB4MjJhNCwgMHgwMDA1LCAweDAwZDYsIDB4Njk0OCwgMHgyMTYwLCAweGQ3ZmMsCisJMHgxMTE4LCAweDIwNjksIDB4MDIwMCwgMHgwMDEwLCAweDIwNjksIDB4MDEwMCwgMHgwODBjLCAweDI0NjcsCisJMHg2MDFiLCAweDAwMDYsIDB4Njg1OCwgMHhhMDg0LCAweDVmMDAsIDB4NjAxZSwgMHg2MDIwLCAweGEwODQsCisJMHgwMGZmLCAweGEwODUsIDB4MDA0OCwgMHg2MDIyLCAweDYwMmYsIDB4MDAwMCwgMHg2MDMzLCAweDAwMDAsCisJMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MzAsIDB4ZDBiNCwgMHgwMWIwLCAweDY4NGIsCisJMHgwMDA0LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGQwOTQsIDB4MDExMCwgMHgxZjA0LCAweDQ1M2IsCisJMHg2ODRiLCAweDAwMDksIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4ZDA4NCwgMHgwMTEwLCAweDFmMDQsCisJMHg0NTQ0LCAweDIwYTksIDB4MDBmYSwgMHgxZjA0LCAweDQ1NGIsIDB4NjgxYiwgMHgwMDU0LCAweDAwZGUsCisJMHg2ODYzLCAweDAwMDcsIDB4MDAwNSwgMHgyMDc5LCAweDQ2MDAsIDB4MDBlMSwgMHgwMDg5LCAweDAwYTksCisJMHgyMDA5LCAweDAwMDIsIDB4MjA2OSwgMHg0NjgwLCAweDY4MGYsIDB4MDAwMCwgMHg2ODEzLCAweDAwMDAsCisJMHg2ODE3LCAweDAwMDAsIDB4ODEwOSwgMHgwMTE4LCAweDIwNjksIDB4NDY0MCwgMHgwY2E4LCAweDAwMDUsCisJMHgyMDE5LCAweDAwYTMsIDB4N2IzYSwgMHg3YjNlLCAweDAwMDUsIDB4MjAxOSwgMHgwMDMzLCAweDdiNDIsCisJMHg3YjQ2LCAweDAwMDUsIDB4MjAxOSwgMHgzMmRkLCAweDdiMzIsIDB4N2IzNiwgMHgwMDA1LCAweDZhNGMsCisJMHhhMjg1LCAweDAwMDAsIDB4MDFmMCwgMHg2OTUwLCAweDZiYmMsIDB4YTMwMCwgMHgwMGM2LCAweDIxNjQsCisJMHg2MzA0LCAweDgzZmYsIDB4MTEzOCwgMHg4MjExLCAweDAxNDgsIDB4ODEwOCwgMHhhMTFhLCAweDBlYjgsCisJMHg2OWJjLCAweDBjYTgsIDB4NjhjZiwgMHgwMDBhLCAweDAwY2UsIDB4MDAwNSwgMHg2OTRjLCAweDZhYmMsCisJMHgyMjY0LCAweDYwMDgsIDB4YzBiNSwgMHg2MDBhLCAweDgyMTAsIDB4ODEwOSwgMHgxZGM4LCAweDY5NGUsCisJMHgwMGNlLCAweDAwMDUsIDB4MWQwNCwgMHg0NTlhLCAweDIwOTEsIDB4NjAwMCwgMHgxZDA0LCAweDQ1OWUsCisJMHgyMDkxLCAweDYwMDAsIDB4NzBlYywgMHhkMGRjLCAweDExMTgsIDB4ZDBkNCwgMHgwMTkwLCAweDAwOTgsCisJMHhhZThlLCAweDAxMDAsIDB4MDEzOCwgMHg3ODE0LCAweGMwZjUsIDB4YzBjNSwgMHg3ODE2LCAweGQwZDQsCisJMHgxNTc4LCAweDA0NTgsIDB4NzgxNCwgMHhjMGZkLCAweGMwYzUsIDB4NzgxNiwgMHhkMGQ0LCAweDE1NDAsCisJMHgwNDIwLCAweGQwZTQsIDB4MDUzOCwgMHgxZDA0LCAweDQ1YmIsIDB4MjA5MSwgMHg2MDAwLCAweDIwMDksCisJMHgwMDBjLCAweDFkMDQsIDB4NDVjMSwgMHgyMDkxLCAweDYwMDAsIDB4ODEwOSwgMHgxZGQwLCAweDcwZTQsCisJMHhhMDg0LCAweDAxZmYsIDB4YTA4NiwgMHgwMWZmLCAweDExMTAsIDB4NzBlYywgMHgwOGM4LCAweGFlOGUsCisJMHgwMTAwLCAweDAxMjgsIDB4NzgxNCwgMHhjMGY0LCAweGQwZmMsIDB4MTEzMCwgMHgwMDIwLCAweDc4MTQsCisJMHhjMGZjLCAweGQwZjQsIDB4MTEwOCwgMHhjMGM0LCAweDc4MTYsIDB4NzgwNCwgMHhkMDhjLCAweDAxMTAsCisJMHg2ODFmLCAweDAwMGMsIDB4NzBhMCwgMHg3MGEyLCAweDAwMDUsIDB4N2MxMgorfTsKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZncxMjE2MGlfbGVuZ3RoMDEgPSAweDM1ZTY7CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgcmlzY19jb2RlX2xlbmd0aDAxID0gMHgzNWU2OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWwxMjgwX2Z3LmggYi9kcml2ZXJzL3Njc2kvcWwxMjgwX2Z3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMWU5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbDEyODBfZncuaApAQCAtMCwwICsxLDIwMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMTI4MC8gZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi4yLnggYW5kIDIuNC54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUWxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJICAgICAgICAgLS0tIElTUDEyNDAvMTA4MC8xMjgwIEluaXRpYXRvciBGaXJtd2FyZSAtLS0gICAgICAgICAgICoKKyAqCQkJICAgICAgMzIgTFVOIFN1cHBvcnQJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiA4LjE1LjAwICgxNDozNSBBdWcgMjIsIDIwMDApCisgKi8KKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCitzdGF0aWMgdW5zaWduZWQgY2hhciBmdzEyODBlaV92ZXJzaW9uX3N0cltdID0gezgsMTUsMH07CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlybXdhcmVfdmVyc2lvbltdID0gezgsMTUsMH07CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCisjZGVmaW5lIGZ3MTI4MGVpX1ZFUlNJT05fU1RSSU5HICI4LjE1LjAwIgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjguMTUuMDAiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZncxMjgwZWlfYWRkcjAxID0gMHgxMDAwOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgxMDAwOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ3MTI4MGVpX2NvZGUwMVtdID0geworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUwMVtdID0geworI2VuZGlmCisJMHgwMDc4LCAweDEwNDEsIDB4MDAwMCwgMHgzZDNiLCAweDAwMDAsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsCisJMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMSwgMHgzOTM5LCAweDMxMmMsIDB4MzEzOSwgMHgzOTMyLCAweDJjMzEsCisJMHgzOTM5LCAweDMzMmMsIDB4MzEzOSwgMHgzOTM0LCAweDIwNTEsIDB4NGM0ZiwgMHg0NzQ5LCAweDQzMjAsCisJMHg0MzRmLCAweDUyNTAsIDB4NGY1MiwgMHg0MTU0LCAweDQ5NGYsIDB4NGUwMCwgMHgyMDQ5LCAweDUzNTAsCisJMHgzMTMyLCAweDM0MzAsIDB4MjA0NiwgMHg2OTcyLCAweDZkNzcsIDB4NjE3MiwgMHg2NTIwLCAweDIwNTYsCisJMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLCAweDM4MmUsIDB4MzEzNSwgMHgyMDIwLCAweDIwNDMsCisJMHg3NTczLCAweDc0NmYsIDB4NmQ2NSwgMHg3MjIwLCAweDRlNmYsIDB4MmUyMCwgMHgzMDMwLCAweDIwNTAsCisJMHg3MjZmLCAweDY0NzUsIDB4NjM3NCwgMHgyMDRlLCAweDZmMmUsIDB4MjAyMCwgMHgzMDMwLCAweDIwMjAsCisJMHgyNDAwLCAweDIwYzksIDB4OTdmZiwgMHgyMDAxLCAweDA0ZmMsIDB4MjAwNCwgMHhhMDg2LCAweDEwODAsCisJMHgwMGMwLCAweDEwNTQsIDB4MjA3MSwgMHgwMTAwLCAweDcwYTAsIDB4NzBhMiwgMHgyMGMxLCAweDAwMTAsCisJMHgyMDg5LCAweDEzNzQsIDB4MDA3OCwgMHgxMDZkLCAweDIwMDEsIDB4MDRmYywgMHgyMDA0LCAweGEwODYsCisJMHgxMjgwLCAweDAwYzAsIDB4MTA2OSwgMHgyMDcxLCAweDAyMDAsIDB4NzBhMCwgMHg3MGEyLCAweDIwNzEsCisJMHgwMTAwLCAweDcwYTAsIDB4NzBhMiwgMHgyMGMxLCAweDAwMTAsIDB4MjA4OSwgMHgxM2Y4LCAweDAwNzgsCisJMHgxMDZkLCAweDIwYzEsIDB4MDAyMCwgMHgyMDg5LCAweDEzMWMsIDB4MjA3MSwgMHgwMDEwLCAweDcwYzMsCisJMHgwMDA0LCAweDcwYzcsIDB4NDk1MywgMHg3MGNiLCAweDUwMjAsIDB4NzBjZiwgMHgyMDIwLCAweDcwZDMsCisJMHgwMDA4LCAweDIwMDEsIDB4MDRmZSwgMHg3MGQ2LCAweDIwYzEsIDB4MDAyMSwgMHgyMDE5LCAweDAwMDAsCisJMHgyMDA5LCAweGZlZmYsIDB4MjEwMCwgMHgyMDBiLCAweGE1YTUsIDB4YTFlYywgMHg3ZmZmLCAweDJkNjQsCisJMHgyMDZiLCAweDBhMGEsIDB4YWRkYywgMHgzZmZmLCAweDJiNTQsIDB4MjA1YiwgMHg1MDUwLCAweDIxMTQsCisJMHhhMjg2LCAweGE1YTUsIDB4MDA0MCwgMHgxMGE0LCAweGEzODYsIDB4MDAwZiwgMHgwMDQwLCAweDEwYTAsCisJMHgyYzZhLCAweDJhNWEsIDB4MjBjMSwgMHgwMDIwLCAweDIwMTksIDB4MDAwZiwgMHgwMDc4LCAweDEwODAsCisJMHgyYzZhLCAweDJhNWEsIDB4MDA3OCwgMHgxMGEyLCAweDJjNmEsIDB4MmE1YSwgMHgyMTMwLCAweDIxMjgsCisJMHhhMWEyLCAweDRlMDAsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweDg0MjQsCisJMHhhMTkyLCAweDk4MDAsIDB4MjAwOSwgMHgwMDAwLCAweDIwMDEsIDB4MDAzMiwgMHgxMDc4LCAweDIwN2EsCisJMHgyMjE4LCAweDIwNzksIDB4NGUwMCwgMHgyZmEwLCAweDI0MDgsIDB4MjAxMSwgMHgwMDAwLCAweDIwYTksCisJMHgwMDQwLCAweDQyYTQsIDB4ODEwOSwgMHgwMGMwLCAweDEwYmYsIDB4MjAwOSwgMHhmZjAwLCAweDM0MDAsCisJMHhhMTAyLCAweDAwNDgsIDB4MTBjZiwgMHgwMDQwLCAweDEwY2YsIDB4MjBhOCwgMHg0MmE0LCAweDIwMDEsCisJMHgwNGZjLCAweDIwMDQsIDB4YTA4NiwgMHgxMDgwLCAweDAwYzAsIDB4MTBlNSwgMHgyMDcxLCAweDAxMDAsCisJMHgwZDdlLCAweDIwNjksIDB4NGU0MCwgMHgxMDc4LCAweDRjZGQsIDB4MGQ3ZiwgMHg3ODEwLCAweGMwZWQsCisJMHg3ODEyLCAweDc4MWIsIDB4MDA2NCwgMHgwMDc4LCAweDExMGEsIDB4MjAwMSwgMHgwNGZjLCAweDIwMDQsCisJMHhhMDg2LCAweDEyODAsIDB4MDBjMCwgMHgxMTA1LCAweDc4MTQsIDB4YzBlZCwgMHhjMGQ1LCAweDc4MTYsCisJMHg3ODFiLCAweDAwNjQsIDB4MjA3MSwgMHgwMjAwLCAweDBkN2UsIDB4MjA2OSwgMHg0ZTQwLCAweDEwNzgsCisJMHg0Y2RkLCAweDIwNjksIDB4NGU4MCwgMHgyMDcxLCAweDAxMDAsIDB4MTA3OCwgMHg0Y2RkLCAweDc4MTQsCisJMHhjMGQ0LCAweDc4MTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDExMGEsIDB4NzgxNCwgMHhjMGU1LCAweDc4MTYsCisJMHg3ODFiLCAweDAwM2MsIDB4N2VjYSwgMHg3Y2MyLCAweDdiYzYsIDB4Nzg2NywgMHgwMDAwLCAweDc4MDAsCisJMHhjMDhkLCAweDc4MDIsIDB4MjAzMSwgMHgwMDMwLCAweDc4YWYsIDB4MDEwMSwgMHg3ODIzLCAweDAwMDIsCisJMHg3ODI3LCAweDAwMDIsIDB4MjAwOSwgMHgwMDAyLCAweDIwNjksIDB4NGU0MCwgMHg2ODFiLCAweDAwMDMsCisJMHg2ODIzLCAweDAwMDcsIDB4NjgyNywgMHgwMGZhLCAweDY4MmIsIDB4MDAwOCwgMHg2ODJmLCAweDAwMjgsCisJMHg2ODM3LCAweDAwMDAsIDB4NjgzYiwgMHgwMDA2LCAweDY4MzMsIDB4MDAwOCwgMHg2ODNmLCAweDAwMDAsCisJMHg4MTA5LCAweDAwNDAsIDB4MTE1ZSwgMHg2OGQzLCAweDAwMGEsIDB4NjhjMywgMHg0ZWMwLCAweDIwNzksCisJMHg0ZTAwLCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLCAweDExNDQsIDB4ZDBlYywgMHgwMGMwLCAweDExNDgsCisJMHg2OGQ3LCAweDczMjksIDB4MDA3OCwgMHgxMTRhLCAweDY4ZDcsIDB4NzMwZCwgMHgwMDc4LCAweDExNGEsCisJMHg2OGQ3LCAweDczMmQsIDB4NjhjNywgMHg1M2MwLCAweDY4Y2IsIDB4NTJjMCwgMHg2OGNmLCAweDkzYzAsCisJMHg2OGFiLCAweDk2NDQsIDB4NjhhZiwgMHg5NjQ5LCAweDY4YjMsIDB4OTY0NCwgMHg2OGI3LCAweDk2NDQsCisJMHg2OGE3LCAweDAwMDEsIDB4MjA2OSwgMHg0ZTgwLCAweDAwNzgsIDB4MTExZSwgMHg2OGQzLCAweDAwMGEsCisJMHg2OGMzLCAweDUwYzAsIDB4NzgxNCwgMHhkMGU0LCAweDAwYzAsIDB4MTE2YSwgMHg2OGQ3LCAweDc0MzksCisJMHgwMDc4LCAweDExNmMsIDB4NjhkNywgMHg3NDE5LCAweDY4YzcsIDB4NzNjMCwgMHg2OGNiLCAweDUzNDAsCisJMHg2OGNmLCAweDk0ZDAsIDB4NjhhYiwgMHg5NjQ5LCAweDY4YWYsIDB4OTY0ZSwgMHg2OGIzLCAweDk2NDksCisJMHg2OGI3LCAweDk2NDksIDB4NjhhNywgMHgwMDAxLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDExYzIsCisJMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxMWI0LCAweDBlN2UsIDB4MjA2OSwgMHg1MmMwLCAweDIwNzEsCisJMHgwMjAwLCAweDcwZWMsIDB4ZDBlNCwgMHgwMGMwLCAweDExOTUsIDB4MjAxOSwgMHgwYzBjLCAweDIwMjEsCisJMHgwMDBjLCAweDEwNzgsIDB4MjAwOSwgMHgwMDc4LCAweDExOWIsIDB4MjAxOSwgMHgwYzBhLCAweDIwMjEsCisJMHgwMDBhLCAweDEwNzgsIDB4MjAwOSwgMHgyMDY5LCAweDUzNDAsIDB4MjA3MSwgMHgwMTAwLCAweDcwZWMsCisJMHhkMGU0LCAweDAwYzAsIDB4MTFhYiwgMHgyMDE5LCAweDBjMGMsIDB4MjAyMSwgMHgwMDBjLCAweDEwNzgsCisJMHgyMDA5LCAweDAwNzgsIDB4MTFiMSwgMHgyMDE5LCAweDBjMGEsIDB4MjAyMSwgMHgwMDBhLCAweDEwNzgsCisJMHgyMDA5LCAweDBlN2YsIDB4MDA3OCwgMHgxMWRiLCAweDIwMTksIDB4MGMwYywgMHgyMDIxLCAweDAwMGMsCisJMHgyMDY5LCAweDUyYzAsIDB4MTA3OCwgMHgyMDA5LCAweDIwNjksIDB4NTM0MCwgMHgxMDc4LCAweDIwMDksCisJMHgwMDc4LCAweDExZGIsIDB4MjA2OSwgMHg1MmMwLCAweDBlN2UsIDB4MjA3MSwgMHgwMTAwLCAweDcwZWMsCisJMHhkMGU0LCAweDAwYzAsIDB4MTFkNCwgMHgyMDE5LCAweDBjMGMsIDB4MjAyMSwgMHgwMDBjLCAweDEwNzgsCisJMHgyMDA5LCAweDBlN2YsIDB4MDA3OCwgMHgxMWRiLCAweDIwMTksIDB4MGMwYSwgMHgyMDIxLCAweDAwMGEsCisJMHgxMDc4LCAweDIwMDksIDB4MGU3ZiwgMHgyMDExLCAweDAwMDIsIDB4MjA2OSwgMHg1M2MwLCAweDIwMDksCisJMHgwMDAyLCAweDIwYTksIDB4MDEwMCwgMHg2ODM3LCAweDAwMDAsIDB4NjgwYiwgMHgwMDQwLCAweDdiYzgsCisJMHhhMzg2LCAweGZlZmYsIDB4MDBjMCwgMHgxMWYyLCAweDY4MTcsIDB4MDEwMCwgMHg2ODFmLCAweDAwNjQsCisJMHgwMDc4LCAweDExZjYsIDB4NjgxNywgMHgwMDY0LCAweDY4MWYsIDB4MDAwMiwgMHhhZGU4LCAweDAwMTAsCisJMHgwMGYwLCAweDExZTMsIDB4ODEwOSwgMHgwMGMwLCAweDExZTEsIDB4ODIxMSwgMHgwMDQwLCAweDEyMDQsCisJMHgyMDY5LCAweDczYzAsIDB4MDA3OCwgMHgxMWRmLCAweDEwNzgsIDB4MjY1YiwgMHgxMDc4LCAweDQ2OGUsCisJMHgxMDc4LCAweDFkZDQsIDB4MTA3OCwgMHg0YzZmLCAweDIwOTEsIDB4MjEwMCwgMHgyMDc5LCAweDRlMDAsCisJMHg3ODEwLCAweGQwZWMsIDB4MDA0MCwgMHgxMjE4LCAweDIwNzEsIDB4MDAyMCwgMHgwMDc4LCAweDEyMWEsCisJMHgyMDcxLCAweDAwNTAsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4NGUwMCwgMHgyMDcxLCAweDAwMjAsCisJMHgyMDkxLCAweDIzMDAsIDB4MjA3OSwgMHg0ZTAwLCAweDc4MTAsIDB4ZDBlYywgMHgwMDQwLCAweDEyMmMsCisJMHgyMDc5LCAweDAxMDAsIDB4MDA3OCwgMHgxMjJlLCAweDIwNzksIDB4MDIwMCwgMHgyMDcxLCAweDRlNDAsCisJMHgyMDkxLCAweDI0MDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwNzEsIDB4NGU4MCwgMHgyMDkxLCAweDIwMDAsCisJMHgyMDc5LCAweDRlMDAsIDB4MjA3MSwgMHgwMDEwLCAweDMyMDAsIDB4YTA4NSwgMHgzMDNkLCAweDIwOTAsCisJMHgyMDcxLCAweDAwMTAsIDB4NzBjMywgMHgwMDAwLCAweDAwOTAsIDB4MTI0ZCwgMHg3MGMwLCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4MTI0ZCwgMHgxMDc4LCAweDE1YmEsIDB4MjAzOSwgMHgwMDAwLCAweDc4MTAsCisJMHhkMGVjLCAweDAwYzAsIDB4MTJjZiwgMHgxMDc4LCAweDE0OGUsIDB4NzhhYywgMHhhMDA1LCAweDAwYzAsCisJMHgxMjZiLCAweDAwNjgsIDB4MTI2MSwgMHg3ODZjLCAweGEwNjUsIDB4MDA0MCwgMHgxMjYxLCAweDEwNzgsCisJMHgyMzk1LCAweDEwNzgsIDB4MjBhMSwgMHgwMDY4LCAweDEyNzgsIDB4Nzg2YywgMHhhMDY1LCAweDAwNDAsCisJMHgxMjZiLCAweDEwNzgsIDB4MjM5NSwgMHgwMDY4LCAweDEyNzgsIDB4MjAwOSwgMHg0ZTQ3LCAweDIwMTEsCisJMHg0ZTg3LCAweDIxMDQsIDB4MjIwYywgMHhhMTA1LCAweDAwNDAsIDB4MTI3OCwgMHgxMDc4LCAweDFmMGEsCisJMHgyMDcxLCAweDRlNDAsIDB4NzBhNCwgMHhhMDA1LCAweDAwNDAsIDB4MTI5ZCwgMHg3NDUwLCAweGE0ODUsCisJMHgwMDAwLCAweDAwNDAsIDB4MTI5ZCwgMHgyMDc5LCAweDAyMDAsIDB4MjA5MSwgMHg4MDAwLCAweDcyZDQsCisJMHhhMjhjLCAweDMwM2QsIDB4MjE5MCwgMHgxMDc4LCAweDJiNmEsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTEsCisJMHgzMDNkLCAweDAwNjgsIDB4MTI5ZCwgMHgyMDc5LCAweDRlMDAsIDB4Nzg2YywgMHhhMDY1LCAweDAwNDAsCisJMHgxMjlkLCAweDIwNzEsIDB4MDAxMCwgMHgxMDc4LCAweDIzOTUsIDB4MDBlMCwgMHgxMmE1LCAweDIwNzksCisJMHg0ZTAwLCAweDIwNzEsIDB4MDAxMCwgMHgxMDc4LCAweDRhNDMsIDB4MjA3MSwgMHg0ZTgwLCAweDcwYTQsCisJMHhhMDA1LCAweDAwNDAsIDB4MTJiZCwgMHg3MDUwLCAweGEwMjUsIDB4MDA0MCwgMHgxMmJkLCAweDIwNzksCisJMHgwMTAwLCAweDIwOTEsIDB4ODAwMCwgMHg3MmQ0LCAweGEyOGMsIDB4MzAzZCwgMHgyMTkwLCAweDEwNzgsCisJMHgyYjZhLCAweDIwOTEsIDB4ODAwMCwgMHgyMDkxLCAweDMwM2QsIDB4MjA3OSwgMHg0ZTAwLCAweDIwNzEsCisJMHgwMDEwLCAweDAwNjgsIDB4MTJjOSwgMHg3ODZjLCAweGEwNjUsIDB4MDA0MCwgMHgxMmM5LCAweDEwNzgsCisJMHgyMzk1LCAweDAwZTAsIDB4MTI1MywgMHgxMDc4LCAweDRhNDMsIDB4MDA3OCwgMHgxMjUzLCAweDEwNzgsCisJMHgxNDhlLCAweDc4YWMsIDB4YTAwNSwgMHgwMGMwLCAweDEyZTcsIDB4MDA2OCwgMHgxMmRkLCAweDc4NmMsCisJMHhhMDY1LCAweDAwNDAsIDB4MTJkZCwgMHgxMDc4LCAweDIzOTUsIDB4MTA3OCwgMHgyMGExLCAweDAwNjgsCisJMHgxMmYxLCAweDc4NmMsIDB4YTA2NSwgMHgwMDQwLCAweDEyZTcsIDB4MTA3OCwgMHgyMzk1LCAweDAwNjgsCisJMHgxMmYxLCAweDIwMDksIDB4NGU0NywgMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwgMHgxMmYxLCAweDEwNzgsCisJMHgxZjBhLCAweDIwNzEsIDB4NGU0MCwgMHg3MGE0LCAweGEwMDUsIDB4MDA0MCwgMHgxMzBjLCAweDc0NTAsCisJMHhhNDg1LCAweDAwMDAsIDB4MDA0MCwgMHgxMzBjLCAweDIwNzksIDB4MDEwMCwgMHgyMDkxLCAweDgwMDAsCisJMHg3MmQ0LCAweGEyOGMsIDB4MzAzZCwgMHgyMTkwLCAweDEwNzgsIDB4MmI2YSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDkxLCAweDMwM2QsIDB4MjA3OSwgMHg0ZTAwLCAweDIwNzEsIDB4MDAxMCwgMHgwMDY4LCAweDEzMTYsCisJMHg3ODZjLCAweGEwNjUsIDB4MDA0MCwgMHgxMzE2LCAweDEwNzgsIDB4MjM5NSwgMHgwMGUwLCAweDEyY2YsCisJMHgxMDc4LCAweDRhNDMsIDB4MDA3OCwgMHgxMmNmLCAweDEzM2MsIDB4MTMzYywgMHgxMzNlLCAweDEzM2UsCisJMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzRiLCAweDEzNTYsIDB4MTM1NiwgMHgxMzYzLCAweDEzNjMsCisJMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzRiLCAweDEzM2MsIDB4MTMzYywgMHgxMzNlLCAweDEzM2UsCisJMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzRiLCAweDEzNTYsIDB4MTM1NiwgMHgxMzYzLCAweDEzNjMsCisJMHgxMzRiLCAweDEzNGIsIDB4MTM0YiwgMHgxMzRiLCAweDAwNzgsIDB4MTMzYywgMHgwMDdlLCAweDEwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4MjQwMCwgMHgxMDc4LCAweDI5OGEsIDB4MTI3ZiwgMHgxMDdmLCAweDAwN2YsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdlLCAweDEwN2UsIDB4MTI3ZSwgMHgxMDc4LCAweDEzYzgsCisJMHgxMjdmLCAweDEwN2YsIDB4MDA3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdlLCAweDEwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgxMDc4LCAweDI5OGEsIDB4MTI3ZiwgMHgxMDdmLCAweDAwN2YsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdlLCAweDEwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsCisJMHgxMDc4LCAweDI5OGEsIDB4MjA5MSwgMHgyNDAwLCAweDEwNzgsIDB4Mjk4YSwgMHgxMjdmLCAweDEwN2YsCisJMHgwMDdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDEzOTQsIDB4MTM5NCwgMHgxMzk2LCAweDEzOTYsCisJMHgxM2EzLCAweDEzYTMsIDB4MTNhMywgMHgxM2EzLCAweDEzYWUsIDB4MTNhZSwgMHgxMzk2LCAweDEzOTYsCisJMHgxM2EzLCAweDEzYTMsIDB4MTNhMywgMHgxM2EzLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLCAweDEzYWYsCisJMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLCAweDEzYWYsCisJMHgxM2FmLCAweDEzYWYsIDB4MTNhZiwgMHgxM2FmLCAweDAwNzgsIDB4MTM5NCwgMHgwMDdlLCAweDEwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgxMDc4LCAweDI5OGEsIDB4MTI3ZiwgMHgxMDdmLCAweDAwN2YsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdlLCAweDEwN2UsIDB4MTI3ZSwgMHgxMDc4LCAweDEzZDUsCisJMHgxMjdmLCAweDEwN2YsIDB4MDA3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgwMDdjLCAweDEwN2UsCisJMHgxMjdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDAwN2UsIDB4MjA3MSwgMHgwMTAwLCAweDIwNjksCisJMHg0ZTQwLCAweDIwNzksIDB4NGUwMCwgMHg3MGVjLCAweGEwODQsIDB4MWMwMCwgMHg3OGUyLCAweDEwNzgsCisJMHg0Y2RkLCAweDAwN2YsIDB4MGY3ZiwgMHgwZTdmLCAweDBkN2YsIDB4MTI3ZiwgMHgxMDdmLCAweDAwN2MsCisJMHgzYzAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDEzY2QsIDB4MTNkZSwgMHgxM2RlLCAweDEzZTAsCisJMHgxM2UwLCAweDEzZTUsIDB4MTNlNSwgMHgxM2VhLCAweDEzZWEsIDB4M2MwMCwgMHhhMDg0LCAweDAwMDMsCisJMHgwMDc5LCAweDEzZGEsIDB4MTNkZSwgMHgxM2RlLCAweDEzZjMsIDB4MTNmMywgMHgxMDc4LCAweDI5NmIsCisJMHgyMDkxLCAweDIyMDAsIDB4MTA3OCwgMHg0NzY4LCAweDAwN2MsIDB4MjA5MSwgMHgyMTAwLCAweDEwNzgsCisJMHg0NzY4LCAweDAwN2MsIDB4MjA5MSwgMHgyMTAwLCAweDEwNzgsIDB4NDc2OCwgMHgyMDkxLCAweDIyMDAsCisJMHgxMDc4LCAweDQ3NjgsIDB4MDA3YywgMHgyMDkxLCAweDIxMDAsIDB4MTA3OCwgMHg0NzY4LCAweDAwN2MsCisJMHgxNDE4LCAweDE0MTgsIDB4MTQxYSwgMHgxNDFhLCAweDE0MjcsIDB4MTQyNywgMHgxNDI3LCAweDE0MjcsCisJMHgxNDMyLCAweDE0MzIsIDB4MTQzZiwgMHgxNDNmLCAweDE0MjcsIDB4MTQyNywgMHgxNDI3LCAweDE0MjcsCisJMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsCisJMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsIDB4MTQ1MCwgMHgxNDUwLCAweDE0NTAsCisJMHgwMDc4LCAweDE0MTgsIDB4MDA3ZSwgMHgxMDdlLCAweDEyN2UsIDB4MjA5MSwgMHgyNDAwLCAweDEwNzgsCisJMHgyOThhLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDAwN2UsCisJMHgxMDdlLCAweDEyN2UsIDB4MTA3OCwgMHgxM2M4LCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4MDA3ZSwgMHgxMDdlLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLCAweDEwNzgsCisJMHgyOThhLCAweDEyN2YsIDB4MTA3ZiwgMHgwMDdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDAwN2UsCisJMHgxMDdlLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLCAweDEwNzgsIDB4Mjk4YSwgMHgyMDkxLCAweDI0MDAsCisJMHgxMDc4LCAweDI5OGEsIDB4MTI3ZiwgMHgxMDdmLCAweDAwN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsCisJMHgwMDdlLCAweDEwN2UsIDB4MTI3ZSwgMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDc5LCAweDRlMDAsCisJMHgyMDcxLCAweDAyMDAsIDB4MjA2OSwgMHg0ZTQwLCAweDNkMDAsIDB4ZDA4YywgMHgwMDQwLCAweDE0NjYsCisJMHg3MGVjLCAweGEwODQsIDB4MWMwMCwgMHg3OGUyLCAweDEwNzgsIDB4NGNkZCwgMHgzZDAwLCAweGQwODQsCisJMHgwMDQwLCAweDE0NzQsIDB4MjA2OSwgMHg0ZTgwLCAweDIwNzEsIDB4MDEwMCwgMHg3MGVjLCAweGEwODQsCisJMHgxYzAwLCAweDc4ZTYsIDB4MTA3OCwgMHg0Y2RkLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDEyN2YsCisJMHgxMDdmLCAweDAwN2YsIDB4MDA3YywgMHg3MDA4LCAweDgwMGIsIDB4MDBjOCwgMHgxNDg5LCAweDcwMDcsCisJMHgwMDAyLCAweGEwOGMsIDB4MDFlMCwgMHgwMGMwLCAweDE0OGEsIDB4ZDA5YywgMHgwMDQwLCAweDE0ODksCisJMHgwODdhLCAweDA5N2EsIDB4NzBjMywgMHg0MDAyLCAweDAwNzgsIDB4MTViZCwgMHgwMDY4LCAweDE1MTMsCisJMHgyMDYxLCAweDAwMDAsIDB4NjAxOCwgMHhkMDg0LCAweDAwYzAsIDB4MTUxMywgMHg3ODI4LCAweGEwMDUsCisJMHgwMGMwLCAweDE0OWUsIDB4MDAxMCwgMHgxNTE0LCAweDAwNzgsIDB4MTUxMywgMHg3OTEwLCAweGQxZjQsCisJMHgwMDQwLCAweDE0YTYsIDB4MjAwMSwgMHg0MDA3LCAweDAwNzgsIDB4MTViYywgMHg3OTE0LCAweGQxZWMsCisJMHgwMDQwLCAweDE0YzEsIDB4ZDBmYywgMHgwMDQwLCAweDE0YjcsIDB4MDA3ZSwgMHgxMDc4LCAweDFkNjQsCisJMHgwMDdmLCAweDAwNDAsIDB4MTRjMSwgMHgyMDAxLCAweDQwMDcsIDB4MDA3OCwgMHgxNWJjLCAweDAwN2UsCisJMHgxMDc4LCAweDFkNTQsIDB4MDA3ZiwgMHgwMDQwLCAweDE0YzEsIDB4MjAwMSwgMHg0MDA3LCAweDAwNzgsCisJMHgxNWJjLCAweDc5MTAsIDB4ZDBmYywgMHgwMGMwLCAweDE0Y2IsIDB4MjA2MSwgMHg0ZTQwLCAweGMxOWMsCisJMHhjN2ZjLCAweDAwNzgsIDB4MTRjZiwgMHgyMDYxLCAweDRlODAsIDB4YzE5ZCwgMHhjN2ZkLCAweDYwNjQsCisJMHhhMDA1LCAweDAwYzAsIDB4MTUxMywgMHg3OTEyLCAweDYwODMsIDB4MDAwMCwgMHg3ODI4LCAweGMwZmMsCisJMHhhMDg2LCAweDAwMTgsIDB4MDBjMCwgMHgxNGUwLCAweDBjN2UsIDB4MTA3OCwgMHgxYjViLCAweDBjN2YsCisJMHg3ODJiLCAweDAwMDAsIDB4NjA3YywgMHhhMDY1LCAweDAwNDAsIDB4MTRmOSwgMHgwYzdlLCAweDYwOWMsCisJMHgxMDc4LCAweDFlNDksIDB4MGM3ZiwgMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwgMHgxYzg0LCAweDIwMDksCisJMHgwMDE4LCAweDYwODcsIDB4MDEwMywgMHgxMDc4LCAweDFkNzQsIDB4MDBjMCwgMHgxNTBkLCAweDEwNzgsCisJMHgxZGM2LCAweDc4MTAsIDB4ZDA5YywgMHgwMGMwLCAweDE1MDEsIDB4MjA2MSwgMHg0ZTQwLCAweDAwNzgsCisJMHgxNTA1LCAweDIwNjEsIDB4NGU4MCwgMHhjMDljLCAweDc4MTIsIDB4NjA3ZiwgMHgwMDAwLCAweDYwZDQsCisJMHhkMGRjLCAweDAwNDAsIDB4MTUxMSwgMHhjMGRjLCAweDYwZDYsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsCisJMHgxNWJjLCAweDAwNzgsIDB4MTViYSwgMHgwMDdjLCAweDc4MTAsIDB4ZDBmNCwgMHgwMDQwLCAweDE1MWMsCisJMHgyMDAxLCAweDQwMDcsIDB4MDA3OCwgMHgxNWJjLCAweGEwMDYsIDB4NzBjMiwgMHg3MGM2LCAweDcwY2EsCisJMHg3MGNlLCAweDcwZGEsIDB4NzBjMCwgMHhhMDNkLCAweGEwOGEsIDB4MDA0MCwgMHgwMGM4LCAweDE1MmEsCisJMHgwMDc5LCAweDE1MzEsIDB4MjEwMCwgMHhhMDhhLCAweDAwNDAsIDB4MDBjOCwgMHgxNWM4LCAweDAwNzksCisJMHgxNTcxLCAweDE1YmEsIDB4MTYxMCwgMHgxNWQ5LCAweDE2NDgsIDB4MTY4MCwgMHgxNjgwLCAweDE1ZDAsCisJMHgxYzljLCAweDE2OGIsIDB4MTVjOCwgMHgxNWRkLCAweDE1ZGYsIDB4MTVlMSwgMHgxNWUzLCAweDFjYTEsCisJMHgxNWM4LCAweDE2OTksIDB4MTZmNiwgMHgxYjdiLCAweDFjOTYsIDB4MTVlNSwgMHgxOWMwLCAweDFhMDIsCisJMHgxYTNkLCAweDFhOGUsIDB4MTk3YiwgMHgxOTg4LCAweDE5OWMsIDB4MTlhZiwgMHgxN2NiLCAweDE1YzgsCisJMHgxNzJkLCAweDE3M2EsIDB4MTc0NiwgMHgxNzUyLCAweDE3NjgsIDB4MTc3NCwgMHgxNzc3LCAweDE3ODMsCisJMHgxNzhmLCAweDE3OTcsIDB4MTdiMywgMHgxN2JmLCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxN2Q4LCAweDE3ZWEsIDB4MTgwNiwgMHgxODNjLCAweDE4NjQsIDB4MTg3NCwgMHgxODc3LCAweDE4YTgsCisJMHgxOGQ5LCAweDE4ZWIsIDB4MTk0YSwgMHgxOTVhLCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxOTZhLCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxY2M2LCAweDFjY2MsCisJMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxY2QwLCAweDFkMTUsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxNWM4LCAweDE2MGEsIDB4MTY3YSwgMHgxNjkzLCAweDE2ZjAsIDB4MWI3NSwgMHgxNWM4LCAweDE1YzgsCisJMHgxYjNlLCAweDE1YzgsIDB4MWQxOSwgMHgxY2I4LCAweDFjYzIsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsIDB4MTVjOCwgMHgxNWM4LCAweDE1YzgsCisJMHgxNWM4LCAweDcyY2EsIDB4NzFjNiwgMHgyMDAxLCAweDQwMDYsIDB4MDA3OCwgMHgxNWJjLCAweDczY2UsCisJMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDAwLCAweDcwYzIsIDB4MDA2OCwgMHgxNWJkLCAweDIwNjEsCisJMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDAwN2MsCisJMHg3MGMzLCAweDQwMDEsIDB4MDA3OCwgMHgxNWJkLCAweDcwYzMsIDB4NDAwNiwgMHgwMDc4LCAweDE1YmQsCisJMHgyMDk5LCAweDAwNDEsIDB4MjBhMSwgMHgwMDQxLCAweDIwYTksIDB4MDAwNSwgMHg1M2EzLCAweDAwNzgsCisJMHgxNWJhLCAweDcwYzQsIDB4NzBjMywgMHgwMDA0LCAweDAwN2EsIDB4MDA3OCwgMHgxNWJhLCAweDAwNzgsCisJMHgxNWJhLCAweDAwNzgsIDB4MTViYSwgMHgwMDc4LCAweDE1YmEsIDB4MjA5MSwgMHg4MDAwLCAweDcwYzMsCisJMHgwMDA0LCAweDcwYzcsIDB4NDk1MywgMHg3MGNiLCAweDUwMjAsIDB4NzBjZiwgMHgyMDIwLCAweDcwZDMsCisJMHgwMDA4LCAweDIwMDEsIDB4MDAwZiwgMHg3MGQ2LCAweDIwNzksIDB4MDAwMCwgMHg3ODFiLCAweDAwMDEsCisJMHgyMDMxLCAweDAwMzAsIDB4MjA1OSwgMHgxMDAwLCAweDIwMjksIDB4MDQxYSwgMHgyMDUxLCAweDA0NDUsCisJMHgyMDYxLCAweDA0NDcsIDB4MjBjMSwgMHgwMDIwLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsCisJMHgwMDc4LCAweDA0MTgsIDB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwMDc4LCAweDE2MTMsCisJMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwgMHg3MWQwLCAweDcyYzgsIDB4NzNjYywgMHg3MGM0LCAweDIwYTAsCisJMHgyMDk5LCAweDAwMzAsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwNiwgMHg3MzFhLCAweDcyMWUsCisJMHg3NDIyLCAweDc1MjYsIDB4MjAyMSwgMHgwMDQwLCAweDgxZmYsIDB4MDA0MCwgMHgxNWJhLCAweGExODIsCisJMHgwMDQwLCAweDAwYzgsIDB4MTYyZCwgMHgyMTIwLCAweGEwMDYsIDB4MjAwOCwgMHg4NDAzLCAweDcwMTIsCisJMHg3MDA3LCAweDAwMDQsIDB4NzAwNywgMHgwMDAxLCAweDcwMDgsIDB4ZDBmYywgMHgwMDQwLCAweDE2MzQsCisJMHg3MDA3LCAweDAwMDIsIDB4YTA4NCwgMHgwMWUwLCAweDAwNDAsIDB4MTY0MiwgMHg3MGMzLCAweDQwMDIsCisJMHgwMDc4LCAweDE1YmQsIDB4MjRhOCwgMHg1M2E1LCAweDAwNzgsIDB4MTYyNCwgMHgwMDc4LCAweDE1YmEsCisJMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwgMHg3MWQwLCAweDcyYzgsIDB4NzNjYywgMHg3MGM0LCAweDIwOTgsCisJMHgyMGExLCAweDAwMzAsIDB4NzAwMywgMHgwMDAwLCAweDcwMDcsIDB4MDAwNiwgMHg3MzFhLCAweDcyMWUsCisJMHg3NDIyLCAweDc1MjYsIDB4MjAyMSwgMHgwMDQwLCAweDcwMDcsIDB4MDAwNiwgMHg4MWZmLCAweDAwNDAsCisJMHgxNWJhLCAweGExODIsIDB4MDA0MCwgMHgwMGM4LCAweDE2NjcsIDB4MjEyMCwgMHhhMDA2LCAweDIwMDgsCisJMHg4NDAzLCAweDcwMTIsIDB4MjRhOCwgMHg1M2E2LCAweDcwMDcsIDB4MDAwMSwgMHg3MDA4LCAweGQwZmMsCisJMHgwMDQwLCAweDE2NmUsIDB4YTA4NCwgMHgwMWUwLCAweDAwNDAsIDB4MTY1YywgMHg3MGMzLCAweDQwMDIsCisJMHgwMDc4LCAweDE1YmQsIDB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwMDc4LCAweDE2NGIsCisJMHg3MWM0LCAweDcwYzgsIDB4MjExNCwgMHhhNzllLCAweDAwMDQsIDB4MDBjMCwgMHgxNjg4LCAweDIwMGEsCisJMHg3MmNhLCAweDAwNzgsIDB4MTViOSwgMHg3MGM3LCAweDAwMDgsIDB4NzBjYiwgMHgwMDBmLCAweDcwY2YsCisJMHgwMDAwLCAweDAwNzgsIDB4MTViYSwgMHg3NWQ4LCAweDc2ZGMsIDB4NzVkYSwgMHg3NmRlLCAweDAwNzgsCisJMHgxNjljLCAweDIwMjksIDB4MDAwMCwgMHgyNTMwLCAweDcwYzQsIDB4NzJjOCwgMHg3M2NjLCAweDc0ZDAsCisJMHg3MGM2LCAweDcyY2EsIDB4NzNjZSwgMHg3NGQyLCAweGEwMDUsIDB4MDA0MCwgMHgxNmViLCAweGE0MGEsCisJMHgwMDQwLCAweDE2YWMsIDB4MDBjOCwgMHgxNmI1LCAweDgwMDEsIDB4Nzg3MiwgMHhhMDg0LCAweGZjMDAsCisJMHgwMDQwLCAweDE2YjksIDB4NzhhYywgMHhjMDg1LCAweDc4YWUsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsCisJMHgxNWJjLCAweDdiN2UsIDB4N2E3YSwgMHg3ZTg2LCAweDdkODIsIDB4N2M3NiwgMHhhNDhjLCAweGZmMDAsCisJMHgwMDQwLCAweDE2ZDEsIDB4ODQwNywgMHg4MDA0LCAweDgwMDQsIDB4ODEwYywgMHg4MTBjLCAweDgxMGYsCisJMHhhMTE4LCAweGEyOTEsIDB4MDAwMCwgMHhhNmIxLCAweDAwMDAsIDB4YTU4MSwgMHgwMDAwLCAweDAwNzgsCisJMHgxNmRiLCAweDg0MDcsIDB4ODAwNCwgMHg4MDA0LCAweGEzMTgsIDB4YTI5MSwgMHgwMDAwLCAweGE2YjEsCisJMHgwMDAwLCAweGE1ODEsIDB4MDAwMCwgMHg3MzFhLCAweDcyMWUsIDB4NzYyMiwgMHg3MDI2LCAweGE2MDUsCisJMHgwMDQwLCAweDE2ZTUsIDB4N2ExMCwgMHhjMmM1LCAweDdhMTIsIDB4NzhhYywgMHhhMDg0LCAweGZmZmMsCisJMHg3OGFlLCAweDAwNzgsIDB4MTZlZSwgMHg3OGFjLCAweGMwODUsIDB4NzhhZSwgMHgwMDc4LCAweDE1YmEsCisJMHg3NWQ4LCAweDc2ZGMsIDB4NzVkYSwgMHg3NmRlLCAweDAwNzgsIDB4MTZmOSwgMHgyMDI5LCAweDAwMDAsCisJMHgyNTMwLCAweDcwYzQsIDB4NzJjOCwgMHg3M2NjLCAweDc0ZDQsIDB4NzBjNiwgMHg3MmNhLCAweDczY2UsCisJMHg3NGQ2LCAweGEwMDUsIDB4MDA0MCwgMHgxNzI4LCAweGE0MGEsIDB4MDA0MCwgMHgxNzA5LCAweDAwYzgsCisJMHgxNWJjLCAweDgwMDEsIDB4Nzg5MiwgMHhhMDg0LCAweGZjMDAsIDB4MDA0MCwgMHgxNzE2LCAweDc4YWMsCisJMHhjMGM1LCAweDc4YWUsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTViYywgMHg3YTlhLCAweDdiOWUsCisJMHg3ZGEyLCAweDdlYTYsIDB4MjYwMCwgMHhhNTA1LCAweDAwNDAsIDB4MTcyMSwgMHg3YTEwLCAweGMyYzUsCisJMHg3YTEyLCAweDdjOTYsIDB4NzhhYywgMHhhMDg0LCAweGZjZmYsIDB4NzhhZSwgMHgwMDc4LCAweDE3MmIsCisJMHg3OGFjLCAweGMwYzUsIDB4NzhhZSwgMHgwMDc4LCAweDE1YmEsIDB4MjAwOSwgMHgwMDAwLCAweDc4NmMsCisJMHhhMDY1LCAweDAwNDAsIDB4MTczNywgMHg4MTA4LCAweDYwMDAsIDB4MDA3OCwgMHgxNzMwLCAweDdhYzQsCisJMHgwMDc4LCAweDE1YjgsIDB4MjAwOSwgMHg0ZTQ4LCAweDIxMGMsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsCisJMHgxNWI5LCAweDIwMTEsIDB4NGU4OCwgMHgyMjE0LCAweDAwNzgsIDB4MTViOCwgMHgyMDA5LCAweDRlNDksCisJMHgyMTBjLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE1YjksIDB4MjAxMSwgMHg0ZTg5LCAweDIyMTQsCisJMHgwMDc4LCAweDE1YjgsIDB4MjA2MSwgMHg0ZTQwLCAweDYxMjgsIDB4NjIyYywgMHg4MjE0LCAweDgyMTQsCisJMHg4MjE0LCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE3NjYsIDB4MjA2MSwgMHg0ZTgwLCAweDYzMjgsCisJMHg3M2RhLCAweDYzMmMsIDB4ODMxYywgMHg4MzFjLCAweDgzMWMsIDB4NzNkZSwgMHgwMDc4LCAweDE1YjgsCisJMHgyMDA5LCAweDRlNGMsIDB4MjEwYywgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxNWI5LCAweDIwMTEsCisJMHg0ZThjLCAweDIyMTQsIDB4MDA3OCwgMHgxNWI4LCAweDc5MTgsIDB4MDA3OCwgMHgxNWI5LCAweDIwMDksCisJMHg0ZTRkLCAweDIxMGMsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsIDB4MTViOSwgMHgyMDExLCAweDRlOGQsCisJMHgyMjE0LCAweDAwNzgsIDB4MTViOCwgMHgyMDA5LCAweDRlNGUsIDB4MjEwYywgMHg3ODEwLCAweGQwZWMsCisJMHgwMGMwLCAweDE1YjksIDB4MjAxMSwgMHg0ZThlLCAweDIyMTQsIDB4MDA3OCwgMHgxNWI4LCAweDc5MjAsCisJMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxNWI5LCAweDdhMjQsIDB4MDA3OCwgMHgxNWI4LCAweDcxYzQsCisJMHhkMWZjLCAweDAwYzAsIDB4MTc5ZiwgMHgyMDExLCAweDUyYzAsIDB4MDA3OCwgMHgxN2ExLCAweDIwMTEsCisJMHg1MzQwLCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEyNjgsCisJMHg2YTAwLCAweDY4MDQsIDB4ZDA5YywgMHgwMDQwLCAweDE3YjAsIDB4NmIwOCwgMHgwMDc4LCAweDE3YjEsCisJMHg2YjBjLCAweDAwNzgsIDB4MTViNywgMHg3N2M0LCAweDEwNzgsIDB4MWRlNCwgMHgyMDkxLCAweDgwMDAsCisJMHg2YjFjLCAweDZhMTQsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxNWI3LCAweDIwNjEsCisJMHg0ZTQwLCAweDYxMTgsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsIDB4MTViOSwgMHgyMDYxLCAweDRlODAsCisJMHg2MjE4LCAweDAwNzgsIDB4MTViOCwgMHg3N2M0LCAweDEwNzgsIDB4MWRlNCwgMHgyMDkxLCAweDgwMDAsCisJMHg2OTA4LCAweDZhMTgsIDB4NmIxMCwgMHg3N2RhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDE1YjcsCisJMHg3MWM0LCAweDIxMTAsIDB4YTI5NCwgMHgwMDBmLCAweGEyODIsIDB4MDAxMCwgMHgwMGM4LCAweDE1YjIsCisJMHgxMDc4LCAweDI3N2YsIDB4YTM4NCwgMHg0MDAwLCAweDAwNDAsIDB4MTdlOCwgMHhhMjk1LCAweDAwMjAsCisJMHgwMDc4LCAweDE1YjcsIDB4NzFjNCwgMHgyMTAwLCAweGMwYmMsIDB4YTA4MiwgMHgwMDEwLCAweDAwYzgsCisJMHgxNWIyLCAweGQxYmMsIDB4MDBjMCwgMHgxN2Y5LCAweDIwMTEsIDB4NGU0OCwgMHgyMjA0LCAweDAwNzgsCisJMHgxN2ZkLCAweDIwMTEsIDB4NGU4OCwgMHgyMjA0LCAweGMwYmQsIDB4MDA3ZSwgMHgyMTAwLCAweGMwYmMsCisJMHgyMDEyLCAweDEwNzgsIDB4MjZkYywgMHgwMTdmLCAweDAwNzgsIDB4MTViOSwgMHg3MWM0LCAweDIwMjEsCisJMHg0ZTQ5LCAweDI0MDQsIDB4NzBjNiwgMHgyMDE5LCAweDAwMDAsIDB4MDA3OCwgMHgxODE1LCAweDcxYzgsCisJMHgyMDIxLCAweDRlODksIDB4MjQwNCwgMHg3MGNhLCAweGMzZmQsIDB4MjAxMSwgMHgxODM0LCAweDIwYTksCisJMHgwMDA4LCAweDIyMDQsIDB4YTEwNiwgMHgwMDQwLCAweDE4MjQsIDB4ODIxMCwgMHgwMGYwLCAweDE4MTksCisJMHg3MWM0LCAweDcyYzgsIDB4MDA3OCwgMHgxNWIxLCAweGEyOTIsIDB4MTgzNCwgMHgwMjdlLCAweDIxMjIsCisJMHgwMTdmLCAweDEwNzgsIDB4MjZmZCwgMHg3ODEwLCAweGQwZWMsIDB4MDBjMCwgMHgxODMyLCAweGQzZmMsCisJMHgwMDQwLCAweDE4MGYsIDB4MDA3OCwgMHgxNWJhLCAweDAzZTgsIDB4MDBmYSwgMHgwMWY0LCAweDAyZWUsCisJMHgwMDA0LCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDIwNjEsIDB4NGU0MCwgMHg2MTI4LCAweDYyMmMsCisJMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHg3MGM0LCAweDYwMmEsIDB4NzBjOCwgMHg4MDAzLCAweDgwMDMsCisJMHg4MDAzLCAweDYwMmUsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsIDB4MTg2MiwgMHgwMjdlLCAweDAxN2UsCisJMHgyMDYxLCAweDRlODAsIDB4NjEyOCwgMHg2MjJjLCAweDgyMTQsIDB4ODIxNCwgMHg4MjE0LCAweDcwZDgsCisJMHg2MDJhLCAweDcwZGMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4NjAyZSwgMHg3MWRhLCAweDcyZGUsCisJMHgwMTdmLCAweDAyN2YsIDB4MDA3OCwgMHgxNWI4LCAweDIwNjEsIDB4NGU0MCwgMHg2MTMwLCAweDcwYzQsCisJMHg2MDMyLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE1YjksIDB4MjA2MSwgMHg0ZTgwLCAweDYyMzAsCisJMHg3MGM4LCAweDYwMzIsIDB4MDA3OCwgMHgxNWI4LCAweDc5MTgsIDB4MDA3OCwgMHgxNWI5LCAweDcxYzQsCisJMHhhMTg0LCAweGZmY2YsIDB4MDA0MCwgMHgxODgzLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDE1YjIsCisJMHg3MmM4LCAweDAwNzgsIDB4MTViMSwgMHgyMDExLCAweDRlNGQsIDB4MjIwNCwgMHgyMTEyLCAweDAwN2UsCisJMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHgyNzY0LCAweDc4MTAsIDB4ZDBlYywgMHgwMDQwLCAweDE4OTMsCisJMHgwMTdmLCAweDAwNzgsIDB4MTViOSwgMHg3MWM4LCAweGExODQsIDB4ZmZjZiwgMHgwMDQwLCAweDE4OWMsCisJMHgyMTEwLCAweDcxYzQsIDB4MDA3OCwgMHgxNWIxLCAweDIwMTEsIDB4NGU4ZCwgMHgyMjA0LCAweDIxMTIsCisJMHgwMDdlLCAweGMzZmQsIDB4MTA3OCwgMHgyNzY0LCAweDAyN2YsIDB4MDE3ZiwgMHgwMDc4LCAweDE1YjgsCisJMHg3MWM0LCAweGExODIsIDB4MDAxMCwgMHgwMDQ4LCAweDE4YjQsIDB4NzgxMCwgMHhkMGVjLCAweDAwYzAsCisJMHgxNWIyLCAweDcyYzgsIDB4MDA3OCwgMHgxNWIxLCAweDIwMTEsIDB4NGU0ZSwgMHgyMjA0LCAweDAwN2UsCisJMHgyMTEyLCAweDIwMTksIDB4MDAwMCwgMHgxMDc4LCAweDI3NDIsIDB4NzgxMCwgMHhkMGVjLCAweDAwNDAsCisJMHgxOGM0LCAweDAxN2YsIDB4MDA3OCwgMHgxNWI5LCAweDcxYzgsIDB4YTE4MiwgMHgwMDEwLCAweDAwNDgsCisJMHgxOGNkLCAweDIxMTAsIDB4NzFjNCwgMHgwMDc4LCAweDE1YjEsIDB4MjAxMSwgMHg0ZThlLCAweDIyMDQsCisJMHgwMDdlLCAweDIxMTIsIDB4YzNmZCwgMHgxMDc4LCAweDI3NDIsIDB4MDI3ZiwgMHgwMTdmLCAweDAwNzgsCisJMHgxNWI4LCAweDcxYzQsIDB4NzJjOCwgMHhhMTg0LCAweGZmZmQsIDB4MDBjMCwgMHgxNWIxLCAweGEyODQsCisJMHhmZmZkLCAweDAwYzAsIDB4MTViMSwgMHgyMTAwLCAweDc5MjAsIDB4NzgyMiwgMHgyMjAwLCAweDdhMjQsCisJMHg3ODI2LCAweDAwNzgsIDB4MTViOCwgMHg3MWM0LCAweGQxZmMsIDB4MDBjMCwgMHgxOGYzLCAweDIwMTEsCisJMHg1MmMwLCAweDAwNzgsIDB4MThmNSwgMHgyMDExLCAweDUzNDAsIDB4ODEwNywgMHhhMDg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMjY4LCAweDIwMTksIDB4MDAwMCwgMHg3MmM4LCAweDIwOTEsCisJMHg4MDAwLCAweDY4MDAsIDB4MDA3ZSwgMHhhMjI2LCAweDAwNDAsIDB4MTkxZSwgMHg2YTAyLCAweGQ0ZWMsCisJMHgwMDQwLCAweDE5MGIsIDB4YzNhNSwgMHhkNGU0LCAweDAwNDAsIDB4MTkwZiwgMHhjMzlkLCAweGQ0ZjQsCisJMHgwMDQwLCAweDE5MWUsIDB4ODEwZiwgMHhkMmY0LCAweDAwNDAsIDB4MTkxYSwgMHgxMDc4LCAweDI3YzEsCisJMHgwMDc4LCAweDE5MWUsIDB4MTA3OCwgMHgyNzlmLCAweDAwNzgsIDB4MTkxZSwgMHg3MmNjLCAweDY4MDgsCisJMHhhMjA2LCAweDAwNDAsIDB4MTk0MCwgMHhhMmE0LCAweDAwZmYsIDB4NzgxNCwgMHhkMGU0LCAweDAwYzAsCisJMHgxOTMxLCAweGE0ODIsIDB4MDAyOCwgMHgwMDQ4LCAweDE5M2QsIDB4MDA0MCwgMHgxOTNkLCAweDAwNzgsCisJMHgxOTM1LCAweGE0ODIsIDB4MDA0MywgMHgwMDQ4LCAweDE5M2QsIDB4NzFjNCwgMHg3MWM2LCAweDAyN2YsCisJMHg3MmNhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDE1YjMsIDB4NmEwYSwgMHhhMzlkLCAweDAwMGEsCisJMHg2ODA0LCAweGEzMDUsIDB4NjgwNiwgMHgwMjdmLCAweDZiMGMsIDB4NzFjNCwgMHgyMDkxLCAweDgwMDEsCisJMHgwMDc4LCAweDE1YjcsIDB4NzdjNCwgMHgxMDc4LCAweDFkZTQsIDB4MjA5MSwgMHg4MDAwLCAweDZhMTQsCisJMHg2YjFjLCAweDIwOTEsIDB4ODAwMSwgMHg3MGM4LCAweDY4MTYsIDB4NzBjYywgMHg2ODFlLCAweDI3MDgsCisJMHgwMDc4LCAweDE1YjcsIDB4NzBjNCwgMHgyMDYxLCAweDRlNDAsIDB4NjExOCwgMHg2MDFhLCAweDc4MTAsCisJMHhkMGVjLCAweDAwYzAsIDB4MTViOSwgMHg3MGM4LCAweDIwNjEsIDB4NGU4MCwgMHg2MjE4LCAweDYwMWEsCisJMHgwMDc4LCAweDE1YjgsIDB4NzFjNCwgMHg3MmM4LCAweDczY2MsIDB4YTE4MiwgMHgwMDEwLCAweDAwYzgsCisJMHgxNWIyLCAweDEwNzgsIDB4MjdlMywgMHhhMzg0LCAweDQwMDAsIDB4MDA0MCwgMHgxOTc5LCAweGEyOTUsCisJMHgwMDIwLCAweDAwNzgsIDB4MTViNywgMHg3N2M0LCAweDEwNzgsIDB4MWRlNCwgMHgyMDkxLCAweDgwMDAsCisJMHg2YTA4LCAweGMyOGQsIDB4NmEwYSwgMHgyMDkxLCAweDgwMDEsIDB4MjcwOCwgMHgwMDc4LCAweDE1YjgsCisJMHg3N2M0LCAweDEwNzgsIDB4MWRlNCwgMHgyMDkxLCAweDgwMDAsIDB4NmEwOCwgMHhhMjk0LCAweGZmZjksCisJMHg2YTBhLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDE5OTcsIDB4MTA3OCwgMHgyNjI4LCAweDIwOTEsCisJMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxNWI4LCAweDc3YzQsIDB4MTA3OCwgMHgxZGU0LCAweDIwOTEsCisJMHg4MDAwLCAweDZhMDgsIDB4YzI5NSwgMHg2YTBhLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDE5YWEsCisJMHgxMDc4LCAweDI2MjgsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxNWI4LCAweDc3YzQsCisJMHgyMDQxLCAweDAwMDEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDFkZmYsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4NmEwOCwgMHgwMDc4LCAweDE1YjgsCisJMHg3N2M0LCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLCAweDE5ZDQsIDB4ZDdmYywgMHgwMDQwLCAweDE5Y2UsCisJMHgxMDc4LCAweDFkNjQsIDB4MDA0MCwgMHgxOWQ0LCAweDAwNzgsIDB4MTViYywgMHgxMDc4LCAweDFkNTQsCisJMHgwMDQwLCAweDE5ZDQsIDB4MDA3OCwgMHgxNWJjLCAweDczYzgsIDB4NzJjYywgMHg3N2M2LCAweDczY2EsCisJMHg3MmNlLCAweDEwNzgsIDB4MWU4NiwgMHgwMGMwLCAweDE5ZmUsIDB4NjgxOCwgMHhhMDA1LCAweDAwNDAsCisJMHgxOWY4LCAweDI3MDgsIDB4MDc3ZSwgMHgxMDc4LCAweDI4MTMsIDB4MDc3ZiwgMHgwMGMwLCAweDE5ZjgsCisJMHgyMDAxLCAweDAwMTUsIDB4ZDdmYywgMHgwMGMwLCAweDE5ZjEsIDB4MjA2MSwgMHg0ZTQwLCAweDAwNzgsCisJMHgxOWY0LCAweGMwZmQsIDB4MjA2MSwgMHg0ZTgwLCAweDc4MmEsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsCisJMHgyMDkxLCAweDgwMDEsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTViYywgMHgyMDkxLCAweDgwMDEsCisJMHgwMDc4LCAweDE1YmEsIDB4NzdjNCwgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxYTE2LCAweGQ3ZmMsCisJMHgwMDQwLCAweDFhMTAsIDB4MTA3OCwgMHgxZDY0LCAweDAwNDAsIDB4MWExNiwgMHgwMDc4LCAweDE1YmMsCisJMHgxMDc4LCAweDFkNTQsIDB4MDA0MCwgMHgxYTE2LCAweDAwNzgsIDB4MTViYywgMHg3N2M2LCAweDIwNDEsCisJMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxZGZmLCAweDIwMDksIDB4MDAxNiwgMHhkN2ZjLCAweDAwYzAsIDB4MWEyYSwgMHgyMDYxLCAweDRlNDAsCisJMHgwMDc4LCAweDFhMmQsIDB4MjA2MSwgMHg0ZTgwLCAweGMxZmQsIDB4NjA2NywgMHgwMDAzLCAweDYwN2YsCisJMHgwMDAwLCAweDY3NzYsIDB4NjA4MywgMHgwMDBmLCAweDc5MmEsIDB4NjFkNCwgMHhjMWRjLCAweDYxZDYsCisJMHgxMDc4LCAweDI2MjgsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4NzdjOCwgMHg3N2NhLCAweDc3YzQsCisJMHg3N2M2LCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLCAweDFhNTQsIDB4ZDdmYywgMHgwMDQwLCAweDFhNGUsCisJMHgxMDc4LCAweDFkNjQsIDB4MDA0MCwgMHgxYTU0LCAweDAwNzgsIDB4MTViYywgMHgxMDc4LCAweDFkNTQsCisJMHgwMDQwLCAweDFhNTQsIDB4MDA3OCwgMHgxNWJjLCAweGE3YmMsIDB4ZmYwMCwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDA5LCAweDAwMTcsIDB4ZDdmYywgMHgwMGMwLCAweDFhNjEsIDB4MjA2MSwgMHg0ZTQwLCAweDAwNzgsCisJMHgxYTY0LCAweDIwNjEsIDB4NGU4MCwgMHhjMWZkLCAweDYwN2YsIDB4MDAwMCwgMHg2MDY3LCAweDAwMDIsCisJMHg2Nzc2LCAweDYwODMsIDB4MDAwZiwgMHg3OTJhLCAweDYxZDQsIDB4YzFkYywgMHg2MWQ2LCAweDEwNzgsCisJMHgyNjI4LCAweDIwOTEsIDB4ODAwMSwgMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsCisJMHgwMDEwLCAweDIwOTEsIDB4ODAwMCwgMHg3MGM4LCAweGEwMDUsIDB4MDA0MCwgMHgxYTgyLCAweDYwZDQsCisJMHhjMGZkLCAweDYwZDYsIDB4MTA3OCwgMHgxZGZmLCAweDcwYzgsIDB4NjgzNiwgMHg4NzM4LCAweGE3ODQsCisJMHgwMDFmLCAweDAwYzAsIDB4MWE4MiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgyMDE5LCAweDAwMDAsCisJMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxYWE0LCAweDcyYzgsIDB4ZDI4NCwgMHgwMDQwLCAweDFhOWUsCisJMHgxMDc4LCAweDFkNjQsIDB4MDA0MCwgMHgxYWE0LCAweDAwNzgsIDB4MTViYywgMHgxMDc4LCAweDFkNTQsCisJMHgwMDQwLCAweDFhYTQsIDB4MDA3OCwgMHgxNWJjLCAweDcyYzgsIDB4NzJjYSwgMHg3OGFjLCAweGEwODQsCisJMHgwMDAzLCAweDAwYzAsIDB4MWFjZiwgMHgyMDM5LCAweDAwMDAsIDB4ZDI4NCwgMHgwMDQwLCAweDFhYjEsCisJMHhjN2ZkLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LCAweDEwNzgsCisJMHgxZGU0LCAweDIwOTEsIDB4ODAwMCwgMHg2ODA4LCAweGMwZDQsIDB4YTgwZCwgMHg2OTBhLCAweDIwOTEsCisJMHg4MDAxLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MWFiNywgMHhhN2JjLCAweGZmMDAsCisJMHg4NzNmLCAweDg3MzgsIDB4ODczZiwgMHhhNzg0LCAweDBmMDAsIDB4MDBjMCwgMHgxYWI3LCAweDIwOTEsCisJMHg4MDAwLCAweDcyYzgsIDB4ZDI4NCwgMHgwMGMwLCAweDFhZTEsIDB4NzgxMCwgMHhkMGVjLCAweDAwNDAsCisJMHgxYWRkLCAweDIwNjksIDB4MDEwMCwgMHgwMDc4LCAweDFhZTMsIDB4MjA2OSwgMHgwMjAwLCAweDAwNzgsCisJMHgxYWUzLCAweDIwNjksIDB4MDEwMCwgMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MzAsCisJMHhkMGI0LCAweDAwNDAsIDB4MWIwMywgMHg2ODRiLCAweDAwMDQsIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsCisJMHhkMDk0LCAweDAwNDAsIDB4MWFmNSwgMHgwMGYwLCAweDFhZWYsIDB4Njg0YiwgMHgwMDA5LCAweDIwYTksCisJMHgwMDE0LCAweDY4NDgsIDB4ZDA4NCwgMHgwMDQwLCAweDFhZmYsIDB4MDBmMCwgMHgxYWY5LCAweDIwYTksCisJMHgwMGZhLCAweDAwZjAsIDB4MWIwMSwgMHgyMDc5LCAweDRlMDAsIDB4MjAwOSwgMHgwMDE4LCAweDcyYzgsCisJMHhkMjg0LCAweDAwYzAsIDB4MWIwZiwgMHgyMDYxLCAweDRlNDAsIDB4MDA3OCwgMHgxYjEyLCAweDIwNjEsCisJMHg0ZTgwLCAweGMxZmQsIDB4NjA3ZiwgMHgwMDAwLCAweDc5MmEsIDB4NjA2NywgMHgwMDAxLCAweDYwODMsCisJMHgwMDBmLCAweDYwYTcsIDB4MDAwMCwgMHg2MGE4LCAweDYwYjIsIDB4NjBiNiwgMHg2MGQ0LCAweGQwYjQsCisJMHgwMDQwLCAweDFiMmUsIDB4YzBiNCwgMHg2MGQ2LCAweDBjN2UsIDB4NjBiOCwgMHhhMDY1LCAweDYwMDgsCisJMHhjMGQ0LCAweDYwMGEsIDB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4MGM3ZiwgMHg2MGQ0LCAweGEwODQsCisJMHg3N2ZmLCAweDYwZDYsIDB4NzhhYywgMHhjMDhkLCAweDc4YWUsIDB4ODNmZiwgMHgwMDQwLCAweDFiMzksCisJMHgwMDdjLCAweDY4MWIsIDB4MDA0NywgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3M2NjLCAweDEwNzgsCisJMHgxYTkwLCAweDY5ZWMsIDB4NmE0OCwgMHhhMTg1LCAweDE4MDAsIDB4Njg0YSwgMHhhMTg1LCAweDAwNDAsCisJMHg2OGVlLCAweDczY2MsIDB4MjAyMSwgMHgwMDA0LCAweDIwYTksIDB4MDlmZiwgMHgwMGYwLCAweDFiNGUsCisJMHg4NDIxLCAweDAwYzAsIDB4MWI0YywgMHg4MzE5LCAweDAwYzAsIDB4MWI0YSwgMHg2OWVlLCAweDZhNGEsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHhkN2ZjLCAweDAwYzAsIDB4MWI2MiwgMHgyMDY5LCAweDRlNDAsCisJMHgwMDc4LCAweDFiNjQsIDB4MjA2OSwgMHg0ZTgwLCAweDcxYzQsIDB4NzFjNiwgMHg2OTE2LCAweDgxZmYsCisJMHgwMGMwLCAweDFiNmMsIDB4NjhhNywgMHgwMDAxLCAweDc4YWMsIDB4YzA4YywgMHg3OGFlLCAweGQwODQsCisJMHgwMGMwLCAweDFiNzQsIDB4MTA3OCwgMHgxZWU2LCAweDAwN2MsIDB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsCisJMHg3NGRlLCAweDAwNzgsIDB4MWI3ZSwgMHgyMDI5LCAweDAwMDAsIDB4MjUyMCwgMHg3MWM0LCAweDczYzgsCisJMHg3MmNjLCAweDcxYzYsIDB4NzNjYSwgMHg3MmNlLCAweDIwNzksIDB4NGUwMCwgMHg3ZGRlLCAweDdjZGEsCisJMHg3YmQ2LCAweDdhZDIsIDB4MTA3OCwgMHgxZGJkLCAweDAwNDAsIDB4MWM4MCwgMHgyMGE5LCAweDAwMDUsCisJMHgyMGExLCAweDRlMTQsIDB4MjA5MSwgMHg4MDAwLCAweDQxYTEsIDB4MjA5MSwgMHg4MDAxLCAweDIwMDksCisJMHgwMDQwLCAweDEwNzgsIDB4MWZkMSwgMHgwMDQwLCAweDFiYTEsIDB4MTA3OCwgMHgxZGM2LCAweDAwNzgsCisJMHgxYzgwLCAweDYwMDQsIDB4YTA4YywgMHgwMGZmLCAweGExOGUsIDB4MDAwOSwgMHgwMGMwLCAweDFiYWMsCisJMHgwMDdlLCAweDEwNzgsIDB4MjM3OCwgMHgwMDdmLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDgwMDksCisJMHgwMDQwLCAweDFjMjAsIDB4MGM3ZSwgMHgyYzY4LCAweDEwNzgsIDB4MWRiZCwgMHgwMDQwLCAweDFiZjIsCisJMHgyYzAwLCAweDY4OWUsIDB4ODEwOSwgMHgwMGMwLCAweDFiYjMsIDB4NjA5ZiwgMHgwMDAwLCAweDBjN2YsCisJMHgwYzdlLCAweDdkZGMsIDB4N2NkOCwgMHg3YmQ0LCAweDdhZDAsIDB4YTI5MCwgMHgwMDQwLCAweGEzOTksCisJMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4N2RkZSwgMHg3Y2RhLCAweDdiZDYsCisJMHg3YWQyLCAweDJjNjgsIDB4Njg5YywgMHhhMDY1LCAweDAwNDAsIDB4MWMxZiwgMHgyMDA5LCAweDAwNDAsCisJMHgxMDc4LCAweDFmZDEsIDB4MDBjMCwgMHgxYzA5LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4MWJmMiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMGEsCisJMHgwMGMwLCAweDFiZWUsIDB4MDE3ZSwgMHgxMDc4LCAweDIzNzQsIDB4MDE3ZiwgMHgyZDAwLCAweDYwMDIsCisJMHgwMDc4LCAweDFiYzEsIDB4MGM3ZiwgMHgwYzdlLCAweDYwOWMsIDB4MTA3OCwgMHgxZTQ5LCAweDBjN2YsCisJMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwgMHgxYzg0LCAweDIwMDksIDB4MDAxOCwgMHg2MDA4LCAweGMwY2QsCisJMHg2MDBhLCAweDYwMDQsIDB4NjA4NiwgMHgxMDc4LCAweDFkNzQsIDB4MTA3OCwgMHgxZGM2LCAweDAwNzgsCisJMHgxYzgwLCAweDBjN2YsIDB4MGM3ZSwgMHg2MDljLCAweDEwNzgsIDB4MWU0OSwgMHgwYzdmLCAweDYwOWYsCisJMHgwMDAwLCAweDEwNzgsIDB4MWM4NCwgMHgyMDA5LCAweDAwMTgsIDB4NjA4NywgMHgwMTAzLCAweDYwMWIsCisJMHgwMDAzLCAweDEwNzgsIDB4MWQ3NCwgMHgxMDc4LCAweDFkYzYsIDB4MDA3OCwgMHgxYzgwLCAweDBjN2YsCisJMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHgxYzQ1LCAweDYxMTQsIDB4ZDFmYywgMHgwMDQwLCAweDFjMmUsCisJMHgxMDc4LCAweDFkNjQsIDB4MDA0MCwgMHgxYzQ1LCAweDAwNzgsIDB4MWMzMiwgMHgxMDc4LCAweDFkNTQsCisJMHgwMDQwLCAweDFjNDUsIDB4MjAyOSwgMHgwMDAwLCAweDI1MjAsIDB4MjAwOSwgMHgwMDE4LCAweDczYzgsCisJMHg3MmNjLCAweDYwODcsIDB4MDEwMywgMHg2MDFiLCAweDAwMjEsIDB4MTA3OCwgMHgxZDc0LCAweDEwNzgsCisJMHgxZGM2LCAweDIwMDEsIDB4NDAwNywgMHgwMDc4LCAweDE1YmMsIDB4NzRjNCwgMHg3M2M4LCAweDcyY2MsCisJMHg2MDE0LCAweDIwOTEsIDB4ODAwMCwgMHgwZTdlLCAweDIwMDksIDB4MDAxMiwgMHhkMGZjLCAweDAwYzAsCisJMHgxYzU1LCAweDIwNzEsIDB4NGU0MCwgMHgwMDc4LCAweDFjNTgsIDB4MjA3MSwgMHg0ZTgwLCAweGMxZmQsCisJMHg3OTJhLCAweDcwNjcsIDB4MDAwNSwgMHg3MWQ0LCAweGMxZGMsIDB4NzFkNiwgMHg3MzZhLCAweDcyNmUsCisJMHg3NDcyLCAweDcwNzYsIDB4NzA3YiwgMHgwMDAwLCAweDJjMDAsIDB4NzA3ZSwgMHhhMDJlLCAweDI1MzAsCisJMHg2MTFjLCAweGExODQsIDB4MDA2MCwgMHgwMDQwLCAweDFjNmYsIDB4MTA3OCwgMHg0NjMyLCAweDBlN2YsCisJMHg2NTk2LCAweDY1YTYsIDB4NjY5YSwgMHg2NmFhLCAweDYwYWYsIDB4MDAwMCwgMHg2MGIzLCAweDAwMDAsCisJMHg2NzE0LCAweDYwMjMsIDB4MDAwMCwgMHgxMDc4LCAweDI2MjgsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsCisJMHg3MGMzLCAweDQwMDUsIDB4MDA3OCwgMHgxNWJkLCAweDIwYTksIDB4MDAwNSwgMHgyMDk5LCAweDRlMTQsCisJMHgyMDkxLCAweDgwMDAsIDB4NTMwYSwgMHgyMDkxLCAweDgwMDEsIDB4MjEwMCwgMHhhMjEwLCAweGEzOTksCisJMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3YywgMHg3MWM0LCAweDcwYzcsCisJMHgwMDAwLCAweDc5MWUsIDB4MDA3OCwgMHgxNWJhLCAweDcxYzQsIDB4NzFjNiwgMHgyMTY4LCAweDAwNzgsCisJMHgxY2EzLCAweDIwNjksIDB4MTAwMCwgMHg2OTBjLCAweGEwMTYsIDB4MmQwNCwgMHhhMjEwLCAweDhkNjgsCisJMHg4MTA5LCAweDAwYzAsIDB4MWNhNSwgMHhhMjg1LCAweDAwMDAsIDB4MDBjMCwgMHgxY2IzLCAweDcwYzMsCisJMHg0MDAwLCAweDAwNzgsIDB4MWNiNSwgMHg3MGMzLCAweDQwMDMsIDB4NzBjYSwgMHgwMDc4LCAweDE1YmQsCisJMHg3OTY0LCAweDcxYzYsIDB4NzFjNCwgMHhhMTgyLCAweDAwMDMsIDB4MDBjOCwgMHgxNWIyLCAweDc5NjYsCisJMHgwMDc4LCAweDE1YmEsIDB4Nzk2NCwgMHg3MWM2LCAweDAwNzgsIDB4MTViYSwgMHg3OTAwLCAweDcxYzYsCisJMHg3MWM0LCAweDc5MDIsIDB4MDA3OCwgMHgxNWJhLCAweDc5MDAsIDB4NzFjNiwgMHgwMDc4LCAweDE1YmEsCisJMHg3MGM0LCAweDIwMTEsIDB4MDAwMCwgMHhhMDhjLCAweDAwMGQsIDB4MDA0MCwgMHgxY2U1LCAweDgxMGMsCisJMHgwMDQ4LCAweDFjZTEsIDB4ODIxMCwgMHg4MTBjLCAweDgxMGMsIDB4MDA0OCwgMHgxY2UxLCAweDgyMTAsCisJMHg4MTBjLCAweDgxZmYsIDB4MDBjMCwgMHgxNWIzLCAweDgyMTAsIDB4N2EwZSwgMHhkMjhjLCAweDAwNDAsCisJMHgxZDExLCAweDc5MTAsIDB4YzFjZCwgMHg3OTEyLCAweDIwMDksIDB4MDAyMSwgMHgyMDE5LCAweDAwMDMsCisJMHhkMjg0LCAweDAwNDAsIDB4MWQwYiwgMHg4MTA4LCAweDIwMTksIDB4MDA0MSwgMHgyMDExLCAweDk2NGUsCisJMHgyMzEyLCAweDIwMTksIDB4MDA0MiwgMHg4MjEwLCAweDIzMTIsIDB4MjAxOSwgMHgwMDQzLCAweDgyMTAsCisJMHgyMzEyLCAweDIwMTksIDB4MDA0NiwgMHg4MjEwLCAweDIzMTIsIDB4MjAxOSwgMHgwMDQ3LCAweDgyMTAsCisJMHgyMzEyLCAweDIwMTksIDB4MDAwNiwgMHgyMDExLCAweDk2NTMsIDB4MjExMiwgMHgyMDExLCAweDk2NzMsCisJMHgyMzEyLCAweDc5MDQsIDB4NzgwNiwgMHgwMDc4LCAweDE1YjksIDB4NzgwNCwgMHg3MGM2LCAweDAwNzgsCisJMHgxNWJhLCAweDcxYzQsIDB4ZDFmYywgMHgwMGMwLCAweDFkMjEsIDB4MjAxMSwgMHg1MmMwLCAweDAwNzgsCisJMHgxZDIzLCAweDIwMTEsIDB4NTM0MCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsCisJMHg4MDAzLCAweGEyNjgsIDB4NmExNCwgMHhkMmI0LCAweDAwNDAsIDB4MWQzMiwgMHgyMDExLCAweDAwMDEsCisJMHgwMDc4LCAweDFkMzQsIDB4MjAxMSwgMHgwMDAwLCAweDZiMGMsIDB4NjgwMCwgMHg3MGRhLCAweDAwNzgsCisJMHgxNWI3LCAweDAxN2UsIDB4NzgxNCwgMHhkMGY0LCAweDAwNDAsIDB4MWQ0NiwgMHgyMDAxLCAweDQwMDcsCisJMHg3MGRiLCAweDAwMDAsIDB4YTE4ZCwgMHgwMDAxLCAweDAwNzgsIDB4MWQ1MiwgMHhkMGZjLCAweDAwNDAsCisJMHgxZDUxLCAweDIwMDEsIDB4NDAwNywgMHg3MGRiLCAweDAwMDEsIDB4YTE4ZCwgMHgwMDAxLCAweDAwNzgsCisJMHgxZDUyLCAweGEwMDYsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4NzgxNCwgMHhkMGY0LCAweDAwNDAsCisJMHgxZDYxLCAweDIwMDEsIDB4NDAwNywgMHg3MGRiLCAweDAwMDAsIDB4YTE4ZCwgMHgwMDAxLCAweDAwNzgsCisJMHgxZDYyLCAweGEwMDYsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4NzgxNCwgMHhkMGZjLCAweDAwNDAsCisJMHgxZDcxLCAweDIwMDEsIDB4NDAwNywgMHg3MGRiLCAweDAwMDEsIDB4YTE4ZCwgMHgwMDAxLCAweDAwNzgsCisJMHgxZDcyLCAweGEwMDYsIDB4MDE3ZiwgMHgwMDdjLCAweDcxMTIsIDB4NzIxYSwgMHg3MzFlLCAweDc4MTAsCisJMHhkMGM0LCAweDAwNDAsIDB4MWQ3ZCwgMHg3NDIyLCAweDc1MjYsIDB4YWM4MCwgMHgwMDAxLCAweDgxMDgsCisJMHg4MTBjLCAweDgxYTksIDB4ODA5OCwgMHgyMGExLCAweDAwMzAsIDB4NzAwMywgMHgwMDAwLCAweDYwODQsCisJMHgyMGEyLCAweDUzYTYsIDB4NzAwNywgMHgwMDAxLCAweDc5NzQsIDB4YTE4NCwgMHhmZjAwLCAweDAwNDAsCisJMHgxZDlhLCAweDgxMGYsIDB4ODEwYywgMHg4MTBjLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA3LCAweGExMDAsCisJMHgwMDc4LCAweDFkOWQsIDB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4Nzk3YywgMHhhMTA4LCAweDdhNzgsCisJMHhhMDA2LCAweGEyMTEsIDB4N2QxMCwgMHhkNWM0LCAweDAwNDAsIDB4MWRhYSwgMHg3Yjg0LCAweGEzMTksCisJMHg3YzgwLCAweGE0MjEsIDB4NzAwOCwgMHhkMGZjLCAweDAwNDAsIDB4MWRhYSwgMHg3MDAzLCAweDAwMDEsCisJMHg3MDA3LCAweDAwMDYsIDB4NzExYSwgMHg3MjFlLCAweDdkMTAsIDB4ZDVjNCwgMHgwMDQwLCAweDFkYmEsCisJMHg3MzIyLCAweDc0MjYsIDB4YTA4NCwgMHgwMWUwLCAweDAwN2MsIDB4Nzg0OCwgMHhhMDY1LCAweDAwNDAsCisJMHgxZGM1LCAweDJjMDQsIDB4Nzg0YSwgMHgyMDYzLCAweDAwMDAsIDB4MDA3YywgMHgwZjdlLCAweDIwNzksCisJMHg0ZTAwLCAweDc4NDgsIDB4MjA2MiwgMHgyYzAwLCAweGEwMDUsIDB4MDBjMCwgMHgxZGQxLCAweDEwNzgsCisJMHgyOTZiLCAweDc4NGEsIDB4MGY3ZiwgMHgwMDdjLCAweDIwMTEsIDB4OTgwMCwgMHg3YTRhLCAweDdiYzQsCisJMHg4MzE5LCAweDAwNDAsIDB4MWRlMSwgMHhhMjgwLCAweDAwMzIsIDB4MjAxMiwgMHgyMDEwLCAweDAwNzgsCisJMHgxZGQ4LCAweDIwMTMsIDB4MDAwMCwgMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHhkN2ZjLCAweDAwYzAsCisJMHgxZGVkLCAweDIwMTEsIDB4NTNjMCwgMHgwMDc4LCAweDFkZWYsIDB4MjAxMSwgMHg3M2MwLCAweGE3ODQsCisJMHgwZjAwLCAweDgwMGIsIDB4YTc4NCwgMHgwMDFmLCAweDAwNDAsIDB4MWRmYSwgMHg4MDAzLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHhhMjY4LCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDEwNzgsCisJMHgxZGU0LCAweDI5MDAsIDB4NjgyYSwgMHgyYTAwLCAweDY4MmUsIDB4NjgwOCwgMHhhMDg0LCAweGY5ZWYsCisJMHhhODBkLCAweDY5MGEsIDB4MGU3ZSwgMHhkN2ZjLCAweDAwYzAsIDB4MWUxNCwgMHgyMDA5LCAweDRlNTMsCisJMHgyMDcxLCAweDRlNDAsIDB4MDA3OCwgMHgxZTE4LCAweDIwMDksIDB4NGU5MywgMHgyMDcxLCAweDRlODAsCisJMHgyMTBjLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDFlMjgsIDB4YTExNiwgMHgwMGMwLCAweDFlMjgsCisJMHgyMDYwLCAweDYwMDAsIDB4NjgwNiwgMHgwMTdlLCAweDIwMGIsIDB4MDAwMCwgMHgwMDc4LCAweDFlMmIsCisJMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHg2ODA0LCAweGEwNjUsIDB4MDA0MCwgMHgxZTQwLCAweDYwMDAsCisJMHg2ODA2LCAweDEwNzgsIDB4MWU1YiwgMHgxMDc4LCAweDIwMWQsIDB4NjgxMCwgMHg3OTA4LCAweDgxMDksCisJMHg3OTBhLCAweDgwMDEsIDB4NjgxMiwgMHgwMGMwLCAweDFlMmIsIDB4NzkxMCwgMHhjMWE1LCAweDc5MTIsCisJMHgwMTdmLCAweDY5MDIsIDB4NjkwNiwgMHgyZDAwLCAweDIwNjAsIDB4MTA3OCwgMHgyYWNjLCAweDBlN2YsCisJMHgwMDdjLCAweGEwNjUsIDB4MDA0MCwgMHgxZTVhLCAweDIwMDgsIDB4NjA5YywgMHhhMDA1LCAweDAwNDAsCisJMHgxZTU3LCAweDIwNjIsIDB4NjA5ZiwgMHgwMDAwLCAweGEwNjUsIDB4MDA3OCwgMHgxZTRkLCAweDc4NDgsCisJMHg3OTRhLCAweDIwNjIsIDB4MDA3YywgMHg2MDA3LCAweDAxMDMsIDB4NjA4ZiwgMHgwMDAwLCAweDIwYTksCisJMHgwMDFjLCAweGFjODAsIDB4MDAwNSwgMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LCAweDY4MjgsCisJMHg2MDFhLCAweDY4MmMsIDB4NjAyMiwgMHgwMDdjLCAweDBlN2UsIDB4ZDdmYywgMHgwMGMwLCAweDFlNzYsCisJMHgyMDcxLCAweDRlNDAsIDB4MjAzMSwgMHg0ZWMwLCAweDAwNzgsIDB4MWU3YSwgMHgyMDcxLCAweDRlODAsCisJMHgyMDMxLCAweDUwYzAsIDB4NzA1MCwgMHhhMDhjLCAweDAyMDAsIDB4MDBjMCwgMHgxZTg0LCAweGE2MDgsCisJMHgyZDBhLCAweDgwMDAsIDB4NzA1MiwgMHhhMDA2LCAweDBlN2YsIDB4MDA3YywgMHgwZjdlLCAweGQ3ZmMsCisJMHgwMGMwLCAweDFlOGUsIDB4MjA3OSwgMHg0ZTQwLCAweDAwNzgsIDB4MWU5MCwgMHgyMDc5LCAweDRlODAsCisJMHgxMDc4LCAweDFkZTQsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDQsIDB4NzgwYSwgMHhhMDY1LCAweDAwNDAsCisJMHgxZWU0LCAweDAwNzgsIDB4MWVhMiwgMHgyYzAwLCAweDc4MGEsIDB4MjA2MCwgMHg2MDAwLCAweGEwNjUsCisJMHgwMDQwLCAweDFlZTQsIDB4NjAxMCwgMHhhMzA2LCAweDAwYzAsIDB4MWU5YiwgMHg2MDBjLCAweGEyMDYsCisJMHgwMGMwLCAweDFlOWIsIDB4MmMyOCwgMHg3ODRjLCAweGFjMDYsIDB4MDBjMCwgMHgxZWIxLCAweDAwNzgsCisJMHgxZWUxLCAweDY4MDQsIDB4YWMwNiwgMHgwMGMwLCAweDFlYmYsIDB4NjAwMCwgMHgyMDYwLCAweDY4MDYsCisJMHhhMDA1LCAweDAwYzAsIDB4MWViZiwgMHg2ODAzLCAweDAwMDAsIDB4MDA3OCwgMHgxZWM5LCAweDY0MDAsCisJMHg3ODA4LCAweDIwNjAsIDB4NjQwMiwgMHhhNDg2LCAweDAwMDAsIDB4MDBjMCwgMHgxZWM5LCAweDJjMDAsCisJMHg2ODAyLCAweDI1NjAsIDB4MGY3ZiwgMHgxMDc4LCAweDFlNWIsIDB4MGY3ZSwgMHg2MDFiLCAweDAwMDUsCisJMHg2MDIzLCAweDAwMjAsIDB4MGY3ZiwgMHgxMDc4LCAweDIwMWQsIDB4MGY3ZSwgMHg3OTA4LCAweDgxMDksCisJMHg3OTBhLCAweDY4MTAsIDB4ODAwMSwgMHg2ODEyLCAweDAwYzAsIDB4MWVlMSwgMHg3ODEwLCAweGMwYTUsCisJMHg3ODEyLCAweDIwMDEsIDB4ZmZmZiwgMHhhMDA1LCAweDBmN2YsIDB4MDA3YywgMHgwNzdlLCAweDI3MDAsCisJMHgyMDM5LCAweDAwMDAsIDB4ZDBmYywgMHgwMDQwLCAweDFlZWUsIDB4YzdmZCwgMHgyMDQxLCAweDAwMjEsCisJMHgyMDQ5LCAweDAwMDQsIDB4MjA1MSwgMHgwMDA4LCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDFkZmYsCisJMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLCAweDFlZjYsIDB4YTdiYywgMHhmZjAwLCAweDg3M2YsCisJMHg4NzM4LCAweDg3M2YsIDB4YTc4NCwgMHgwZjAwLCAweDAwYzAsIDB4MWVmNiwgMHgyMDkxLCAweDgwMDEsCisJMHgwNzdmLCAweDAwN2MsIDB4Nzg2YywgMHgyMDA5LCAweDk2NzQsIDB4MjEwYywgMHhhMTBkLCAweDAwNDAsCisJMHgxZjE0LCAweGEwNjUsIDB4MDA3OCwgMHgyMzk1LCAweDIwNjEsIDB4MDAwMCwgMHg2MDE4LCAweGQwODQsCisJMHgwMGMwLCAweDFmMzQsIDB4NzgxMCwgMHhkMDhjLCAweDAwNDAsIDB4MWYyNSwgMHhjMDhjLCAweDc4MTIsCisJMHhjN2ZjLCAweDIwNjksIDB4NGU0MCwgMHgwMDc4LCAweDFmMmEsIDB4YzA4ZCwgMHg3ODEyLCAweDIwNjksCisJMHg0ZTgwLCAweGM3ZmQsIDB4MjA5MSwgMHg4MDAwLCAweDY4MWMsIDB4NjgxZiwgMHgwMDAwLCAweDIwOTEsCisJMHg4MDAxLCAweGEwMDUsIDB4MDBjMCwgMHgxZjM1LCAweDAwN2MsIDB4YTA4YywgMHhmZmYwLCAweDAwNDAsCisJMHgxZjNiLCAweDEwNzgsIDB4Mjk2YiwgMHgwMDc5LCAweDFmM2QsIDB4MWY0ZCwgMHgxZjUwLCAweDFmNTYsCisJMHgxZjVhLCAweDFmNGUsIDB4MWY1ZSwgMHgxZjRlLCAweDFmNGUsIDB4MWY0ZSwgMHgxZjY0LCAweDFmOTUsCisJMHgxZjk5LCAweDFmOWYsIDB4MWZiNCwgMHgxZjRlLCAweDFmNGUsIDB4MDA3YywgMHgxMDc4LCAweDI5NmIsCisJMHgxMDc4LCAweDFlZTYsIDB4MjAwMSwgMHg4MDAxLCAweDAwNzgsIDB4MWZjMCwgMHgyMDAxLCAweDgwMDMsCisJMHgwMDc4LCAweDFmYzAsIDB4MjAwMSwgMHg4MDA0LCAweDAwNzgsIDB4MWZjMCwgMHgxMDc4LCAweDFlZTYsCisJMHgyMDAxLCAweDgwMDYsIDB4MDA3OCwgMHgxZmMwLCAweDIwOTEsIDB4ODAwMCwgMHgwNzdlLCAweGQ3ZmMsCisJMHgwMGMwLCAweDFmNzAsIDB4MjA2OSwgMHg0ZTQwLCAweDIwMzksIDB4MDAwOSwgMHgwMDc4LCAweDFmNzQsCisJMHgyMDY5LCAweDRlODAsIDB4MjAzOSwgMHgwMDA5LCAweDY4MDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHgxZjdlLCAweDAwN2YsIDB4NmYxZSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg2ODc0LCAweDA3N2YsCisJMHhhMGJjLCAweGZmMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMTAsCisJMHgxMDc4LCAweDFkZmYsIDB4ODczOCwgMHhhNzg0LCAweDAwMWYsIDB4MDBjMCwgMHgxZjg4LCAweDIwOTEsCisJMHg4MDAxLCAweDIwMDEsIDB4ODAwYSwgMHgwMDc4LCAweDFmYzAsIDB4MjAwMSwgMHg4MDBjLCAweDAwNzgsCisJMHgxZmMwLCAweDEwNzgsIDB4MWVlNiwgMHgyMDAxLCAweDgwMGQsIDB4MDA3OCwgMHgxZmMwLCAweDc4MTQsCisJMHhkMGU0LCAweDAwYzAsIDB4MWZiMiwgMHhkMGVjLCAweDAwNDAsIDB4MWZhYywgMHhkN2ZjLCAweDAwNDAsCisJMHgxZmFjLCAweDc4ZTQsIDB4MDA3OCwgMHgxZmFkLCAweDc4ZTAsIDB4NzBjNiwgMHgyMDAxLCAweDgwMGUsCisJMHgwMDc4LCAweDFmYzAsIDB4MDA3OCwgMHgxZjRlLCAweGQ3ZmMsIDB4MDA0MCwgMHgxZmJhLCAweDc4ZWMsCisJMHgwMDc4LCAweDFmYmIsIDB4NzhlOCwgMHg3MGM2LCAweDIwMDEsIDB4ODAwZiwgMHgwMDc4LCAweDFmYzAsCisJMHg3MGMyLCAweGQ3ZmMsIDB4MDBjMCwgMHgxZmM4LCAweDcwZGIsIDB4MDAwMCwgMHgwMDc4LCAweDFmY2EsCisJMHg3MGRiLCAweDAwMDEsIDB4MjA2MSwgMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgwMDdjLCAweGFjODAsIDB4MDAwMSwgMHg4MWZmLCAweDAwNDAsIDB4MWZmYywgMHgyMDk5LCAweDAwMzAsCisJMHgyMGEwLCAweDcwMGMsIDB4YTA4NCwgMHgwM2ZmLCAweDAwNDAsIDB4MWZkZSwgMHg3MDE4LCAweDAwN2UsCisJMHg3MDFjLCAweDAwN2UsIDB4NzAyMCwgMHgwMDdlLCAweDcwMjQsIDB4MDA3ZSwgMHg3MTEyLCAweDgxYWMsCisJMHg3MjFhLCAweDczMWUsIDB4NzQyMiwgMHg3NTI2LCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDEsCisJMHg3MDA4LCAweDgwMGIsIDB4MDBjOCwgMHgxZmYwLCAweDcwMDcsIDB4MDAwMiwgMHhhMDhjLCAweDAxZTAsCisJMHgwMGMwLCAweDFmZmMsIDB4NTNhNSwgMHhhMDA2LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDQsCisJMHgwMDdmLCAweDcwMjYsIDB4MDA3ZiwgMHg3MDIyLCAweDAwN2YsIDB4NzAxZSwgMHgwMDdmLCAweDcwMWEsCisJMHgwMDdjLCAweDIwMTEsIDB4MDAyMCwgMHgyMDA5LCAweDAwMTAsIDB4NmIwYSwgMHg2YzBlLCAweDY4MDMsCisJMHhmZDAwLCAweDY4MDcsIDB4MDAxOCwgMHg2YTFhLCAweDJkMDAsIDB4YTBlOCwgMHgwMDA4LCAweGEyOTAsCisJMHgwMDA0LCAweDgxMDksIDB4MDBjMCwgMHgyMDBkLCAweDAwN2MsIDB4NjAwNCwgMHg2MDg2LCAweDJjMDgsCisJMHgyMDYzLCAweDAwMDAsIDB4Nzg2OCwgMHhhMDA1LCAweDc5NmEsIDB4MDA0MCwgMHgyMDJhLCAweDJjMDIsCisJMHgwMDc4LCAweDIwMmIsIDB4Nzk2ZSwgMHgwMDdjLCAweDBjN2UsIDB4MjA2MSwgMHg0ZTAwLCAweDY4ODcsCisJMHgwMTAzLCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLCAweDYwNjgsIDB4YTAwNSwgMHg2MTZhLCAweDAwNDAsCisJMHgyMDNjLCAweDJkMDIsIDB4MDA3OCwgMHgyMDNkLCAweDYxNmUsIDB4MGM3ZiwgMHgwMDdjLCAweDIwOTEsCisJMHg4MDAwLCAweDJjMDQsIDB4Nzg2ZSwgMHhhMDA1LCAweDAwYzAsIDB4MjA0NywgMHg3ODZhLCAweDIwOTEsCisJMHg4MDAxLCAweDYwOWMsIDB4YTAwNSwgMHgwMDQwLCAweDIwNjAsIDB4MGM3ZSwgMHgyMDYwLCAweDIwMDgsCisJMHg2MDljLCAweGEwMDUsIDB4MDA0MCwgMHgyMDVjLCAweDIwNjIsIDB4NjA5ZiwgMHgwMDAwLCAweGEwNjUsCisJMHg2MDljLCAweGEwMDUsIDB4MDBjMCwgMHgyMDU0LCAweDc4NDgsIDB4Nzk0YSwgMHgyMDYyLCAweDBjN2YsCisJMHg3ODQ4LCAweDIwNjIsIDB4NjA5ZiwgMHgwMDAwLCAweGFjODUsIDB4MDAwMCwgMHgwMGMwLCAweDIwNmEsCisJMHgxMDc4LCAweDI5NmIsIDB4Nzg0YSwgMHgwMDdjLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LCAweDgwMDQsCisJMHg4MDg2LCAweDgxOGUsIDB4MDBjOCwgMHgyMDc1LCAweGEyMDAsIDB4MDBmMCwgMHgyMDcwLCAweDgwODYsCisJMHg4MThlLCAweDAwN2MsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDIwOWIsCisJMHhhMTFhLCAweDAwYzgsIDB4MjA5YiwgMHg4MjEzLCAweDgxOGQsIDB4MDA0OCwgMHgyMDhlLCAweGExMWEsCisJMHgwMGM4LCAweDIwOGYsIDB4MDBmMCwgMHgyMDgzLCAweDAwNzgsIDB4MjA5MywgMHhhMTFhLCAweDIzMDgsCisJMHg4MjEwLCAweDAwZjAsIDB4MjA4MywgMHgwMDdlLCAweDMyMDAsIDB4YTA4NCwgMHhmN2ZmLCAweDIwODAsCisJMHgwMDdmLCAweDE1N2YsIDB4MDA3YywgMHgwMDdlLCAweDMyMDAsIDB4YTA4NSwgMHgwODAwLCAweDAwNzgsCisJMHgyMDk3LCAweDdkNzQsIDB4NzBkMCwgMHhhNTA2LCAweDAwNDAsIDB4MjE4NywgMHg3ODEwLCAweDIwNTAsCisJMHg3ODAwLCAweGQwOGMsIDB4MDA0MCwgMHgyMGMzLCAweGRhZWMsIDB4MDA0MCwgMHgyMGMzLCAweDBlN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgwMDIwLCAweDcwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDIwYzAsCisJMHg3MDA4LCAweDBlN2YsIDB4YTA4NiwgMHgwMDA4LCAweDAwNDAsIDB4MjBjMywgMHgwMDc4LCAweDIxODcsCisJMHgwZTdmLCAweDAwNzgsIDB4MjE4NywgMHgxMDc4LCAweDFkYmQsIDB4MDA0MCwgMHgyMTg3LCAweGEwNDYsCisJMHg3OTcwLCAweDI1MDAsIDB4ODAwMCwgMHhhMTEyLCAweDIwMDksIDB4MDA0MCwgMHgwMGM4LCAweDIwZDIsCisJMHgwMDc4LCAweDIwZDksIDB4NzJkMCwgMHhhMjA2LCAweDAwNDAsIDB4MjBkOSwgMHg4ODQwLCAweDIwMDksCisJMHgwMDgwLCAweDBjN2UsIDB4NzExMiwgMHg3MDA3LCAweDAwMDEsIDB4MjA5OSwgMHgwMDMwLCAweDIwYTksCisJMHgwMDIwLCAweGFjODAsIDB4MDAwMSwgMHgyMGEwLCAweDIwNjEsIDB4MDAwMCwgMHg4OGZmLCAweDAwNDAsCisJMHgyMGViLCAweDEwNzgsIDB4MWRiZCwgMHg3MDA4LCAweGQwZmMsIDB4MDA0MCwgMHgyMGViLCAweDcwMDcsCisJMHgwMDAyLCAweDIwOTEsIDB4ODAwMSwgMHhhMDhjLCAweDAxZTAsIDB4MDBjMCwgMHgyMTIyLCAweDUzYTUsCisJMHg4Y2ZmLCAweDAwYzAsIDB4MjEwMCwgMHg4OGZmLCAweDAwNDAsIDB4MjE3MSwgMHgwMDc4LCAweDIxMGEsCisJMHgyYzAwLCAweDc4OGUsIDB4MjBhOSwgMHgwMDIwLCAweGFjODAsIDB4MDAwMSwgMHgyMGEwLCAweDUzYTUsCisJMHgwMDc4LCAweDIxNzEsIDB4YTA0NiwgMHg3MjE4LCAweDczMWMsIDB4ZGFjNCwgMHgwMDQwLCAweDIxMTIsCisJMHg3NDIwLCAweDc1MjQsIDB4YTI5MiwgMHgwMDQwLCAweGEzOWIsIDB4MDAwMCwgMHhhNGEzLCAweDAwMDAsCisJMHhhNWFiLCAweDAwMDAsIDB4NzIxYSwgMHg3MzFlLCAweGRhYzQsIDB4MDA0MCwgMHgyMTIyLCAweDc0MjIsCisJMHg3NTI2LCAweGEwMDYsIDB4NzAwNywgMHgwMDA0LCAweDAwNDAsIDB4MjE3MSwgMHg4Y2ZmLCAweDAwNDAsCisJMHgyMTJiLCAweDEwNzgsIDB4MWRjNiwgMHgwYzdmLCAweDEwNzgsIDB4MWRjNiwgMHhhMDQ2LCAweDc4ODgsCisJMHg4MDAwLCAweDc4OGEsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4MjE1MSwgMHg3YTdjLCAweDdiNzgsCisJMHhkYWM0LCAweDAwNDAsIDB4MjEzZCwgMHg3Yzg0LCAweDdkODAsIDB4Nzk3NCwgMHg4MTA3LCAweDgwMDQsCisJMHg4MDA0LCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsCisJMHg3MjFhLCAweDczMWUsIDB4ZGFjNCwgMHgwMDQwLCAweDIxODcsIDB4NzQyMiwgMHg3NTI2LCAweDAwNzgsCisJMHgyMTg3LCAweDYwMTQsIDB4ZDBmYywgMHgwMGMwLCAweDIxNTksIDB4MjA2OSwgMHg0ZTQwLCAweDAwNzgsCisJMHgyMTViLCAweDIwNjksIDB4NGU4MCwgMHgyMDkxLCAweDgwMDAsIDB4NjgxZiwgMHgwMDAyLCAweDg4ZmYsCisJMHgwMDQwLCAweDIxNjcsIDB4YTA0NiwgMHg3ODhjLCAweDIwNjAsIDB4MDA3OCwgMHgyMTUxLCAweDc4OGIsCisJMHgwMDAwLCAweDc4YWMsIDB4YTA4NSwgMHgwMDAzLCAweDc4YWUsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsCisJMHgyMTg3LCAweDBjN2YsIDB4Nzg4YiwgMHgwMDAwLCAweDEwNzgsIDB4MjM0NiwgMHg2MDA0LCAweGEwODQsCisJMHgwMDBmLCAweDEwNzgsIDB4MjE4OCwgMHg4OGZmLCAweDAwNDAsIDB4MjE4NSwgMHg3ODhjLCAweDIwNjAsCisJMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHgxMDc4LCAweDIxODgsIDB4MDA3OCwgMHgyMGExLCAweDAwN2MsCisJMHgwMDc5LCAweDIxOGEsIDB4MjE5YSwgMHgyMWI4LCAweDIxZDYsIDB4MjE5YSwgMHgyMWU3LCAweDIxYWIsCisJMHgyMTlhLCAweDIxOWEsIDB4MjE5YSwgMHgyMWI2LCAweDIxZDQsIDB4MjE5YSwgMHgyMTlhLCAweDIxOWEsCisJMHgyMTlhLCAweDIxOWEsIDB4MjAzOSwgMHgwNDAwLCAweDc4YmMsIDB4YTcwNSwgMHg3OGJlLCAweDYwMDgsCisJMHhhNzA1LCAweDYwMGEsIDB4MTA3OCwgMHgyMjJhLCAweDYwOWMsIDB4NzhiYSwgMHg2MDlmLCAweDAwMDAsCisJMHgxMDc4LCAweDIzMzAsIDB4MDA3YywgMHg3OGJjLCAweGQwYzQsIDB4MDA0MCwgMHgyMWIxLCAweDAwNzgsCisJMHgyMTlhLCAweDYwMWMsIDB4YzBiZCwgMHg2MDFlLCAweDAwNzgsIDB4MjFiZSwgMHgxMDc4LCAweDIzNzgsCisJMHg3OGJjLCAweGQwYzQsIDB4MDA0MCwgMHgyMWJlLCAweDAwNzgsIDB4MjE5YSwgMHg3OGJmLCAweDAwMDAsCisJMHg2MDA0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDc4YjIsIDB4ODAwMSwgMHgwMDQwLCAweDIxZDEsCisJMHgxMDc4LCAweDIyMmEsIDB4MDA0MCwgMHgyMWQxLCAweDc4YmMsIDB4YzBjNSwgMHg3OGJlLCAweDAwNzgsCisJMHgyMWQzLCAweDAwNzgsIDB4MjI0OSwgMHgwMDdjLCAweDEwNzgsIDB4MjM3NCwgMHg3OGJjLCAweGEwOGMsCisJMHgwZTAwLCAweDAwYzAsIDB4MjFkZSwgMHhkMGM0LCAweDAwYzAsIDB4MjFlMCwgMHgwMDc4LCAweDIxOWEsCisJMHgxMDc4LCAweDIyMmEsIDB4MDBjMCwgMHgyMWU2LCAweDAwNzgsIDB4MjI0OSwgMHgwMDdjLCAweDc4YmMsCisJMHhkMGM0LCAweDAwNDAsIDB4MjFlZCwgMHgwMDc4LCAweDIxOWEsIDB4NzhiZiwgMHgwMDAwLCAweDY3MTQsCisJMHgyMDExLCAweDAwMDEsIDB4MjJhOCwgMHg2MDE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAwNDAsCisJMHgyMjBkLCAweGE3YmMsIDB4ZmYwMCwgMHgyMGE5LCAweDAwMjAsIDB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsCisJMHgyMjBkLCAweGE3YmMsIDB4ODAwMCwgMHgyMDExLCAweDAwMDIsIDB4MjBhOSwgMHgwMTAwLCAweGEwOGUsCisJMHgwMDAyLCAweDAwNDAsIDB4MjIwZCwgMHgwMDc4LCAweDIyMjcsIDB4MTA3OCwgMHgxZGU0LCAweDJkMDAsCisJMHgyMDkxLCAweDgwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODA4LCAweGEwODQsCisJMHhmZmRlLCAweDY4MGEsIDB4YWRlOCwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMSwgMHgwMGYwLCAweDIyMTAsCisJMHg4MjExLCAweDAwNDAsIDB4MjIyNywgMHgyMGE5LCAweDAxMDAsIDB4MDA3OCwgMHgyMjEwLCAweDEwNzgsCisJMHgxZGM2LCAweDAwN2MsIDB4NjA5ZiwgMHgwMDAwLCAweDc4YjQsIDB4YTA2ZCwgMHgyYzAwLCAweDc4YjYsCisJMHgwMGMwLCAweDIyMzUsIDB4NzhiYSwgMHgwMDc4LCAweDIyM2QsIDB4Njg5ZSwgMHgyZDAwLCAweDYwMDIsCisJMHg3OGI4LCAweGFkMDYsIDB4MDBjMCwgMHgyMjNkLCAweDYwMDIsIDB4NzhiMCwgMHg4MDAxLCAweDc4YjIsCisJMHgwMGMwLCAweDIyNDgsIDB4NzhiYywgMHhjMGM0LCAweDc4YmUsIDB4NzhiOCwgMHgyMDYwLCAweGEwMDYsCisJMHgwMDdjLCAweDBlN2UsIDB4YTAyZSwgMHgyNTMwLCAweDdkYmEsIDB4N2RiNiwgMHg2NWFlLCAweDY1YjIsCisJMHg2MDFjLCAweDYwYTIsIDB4MjA0OCwgMHhhOTg0LCAweGUxZmYsIDB4NjAxZSwgMHhhOTg0LCAweDAwNjAsCisJMHgwMDQwLCAweDIyNWMsIDB4MTA3OCwgMHg0NjMyLCAweDY1OTYsIDB4NjVhNiwgMHg2NjlhLCAweDY2YWEsCisJMHg2NzE0LCAweDIwNzEsIDB4NGU4MCwgMHhkN2ZjLCAweDAwYzAsIDB4MjI2OCwgMHgyMDcxLCAweDRlNDAsCisJMHhhNzg0LCAweDBmMDAsIDB4ODAwYiwgMHhhNzg0LCAweDAwMWYsIDB4MDA0MCwgMHgyMjczLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LCAweDcxYzQsIDB4YTE2OCwgMHgyNzAwLCAweDgwMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4NzFjOCwgMHhhMTAwLCAweDYwYzIsCisJMHgyMDkxLCAweDgwMDAsIDB4NzgxNCwgMHhkMGM0LCAweDAwNDAsIDB4MjI5OCwgMHhkMGVjLCAweDAwNDAsCisJMHgyMjk0LCAweGQ3ZmMsIDB4MDBjMCwgMHgyMjkxLCAweGQwZjQsIDB4MDBjMCwgMHgyMjlmLCAweDAwNzgsCisJMHgyMjk4LCAweGQwZmMsIDB4MDBjMCwgMHgyMjlmLCAweDc4MTAsIDB4ZDBmNCwgMHgwMGMwLCAweDIyOWYsCisJMHg2ZTA4LCAweGQ2ODQsIDB4MDA0MCwgMHgyMmM5LCAweGQ5ZmMsIDB4MDBjMCwgMHgyMmM5LCAweDIwOTEsCisJMHg4MDAxLCAweDEwNzgsIDB4MWU1YiwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyMDFkLCAweDIwOTEsCisJMHg4MDAxLCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLCAweDIzMmUsIDB4NzgxNCwgMHhkMGM0LCAweDAwNDAsCisJMHgyMzJlLCAweGQwZWMsIDB4MDA0MCwgMHgyMmMxLCAweGQ3ZmMsIDB4MDBjMCwgMHgyMmJjLCAweGQwZjQsCisJMHgwMGMwLCAweDIyYzUsIDB4MDA3OCwgMHgyMzJlLCAweGQwZmMsIDB4MDBjMCwgMHgyMmM1LCAweDAwNzgsCisJMHgyMzJlLCAweDc4MTAsIDB4ZDBmNCwgMHgwMDQwLCAweDIzMmUsIDB4NjAxYiwgMHgwMDIxLCAweDAwNzgsCisJMHgyMzJlLCAweDYwMjQsIDB4YTA5NiwgMHgwMDAxLCAweDAwYzAsIDB4MjJkMCwgMHg4MDAwLCAweDYwMjYsCisJMHg2YTEwLCAweDY4MTQsIDB4YTIwMiwgMHgwMDQ4LCAweDIyZTMsIDB4MDA0MCwgMHgyMmUzLCAweDIwOTEsCisJMHg4MDAxLCAweDIwMzksIDB4MDIwMCwgMHg2MDljLCAweDc4YmEsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsCisJMHgyMzMwLCAweDAwNzgsIDB4MjMyZSwgMHgyYzA4LCAweGQ5ZmMsIDB4MDA0MCwgMHgyMzBiLCAweDY4MDAsCisJMHhhMDY1LCAweDAwNDAsIDB4MjMwYiwgMHg2YTA0LCAweDcwMDAsIDB4YTA4NCwgMHgwMDAyLCAweDAwNDAsCisJMHgyMzAxLCAweDcwNGMsIDB4YTIwNiwgMHgwMGMwLCAweDIzMDEsIDB4NmIwNCwgMHgyMTYwLCAweDIzMDQsCisJMHg2MDAyLCAweGEwMDUsIDB4MDBjMCwgMHgyMmZkLCAweDY5MDIsIDB4MjI2MCwgMHg2MTAyLCAweDAwNzgsCisJMHgyMzE3LCAweDJkMDAsIDB4MjA2MCwgMHgxMDc4LCAweDJhY2MsIDB4NmUwOCwgMHgyMTYwLCAweDYyMDIsCisJMHg2OTA2LCAweDAwNzgsIDB4MjMxNywgMHg2ODAwLCAweDY5MDIsIDB4YTA2NSwgMHgwMDQwLCAweDIzMTMsCisJMHg2MTAyLCAweDAwNzgsIDB4MjMxNCwgMHg2OTA2LCAweDIxNjAsIDB4NjAwMywgMHgwMDAwLCAweDIxNjAsCisJMHhkOWZjLCAweDAwNDAsIDB4MjMxZSwgMHhhNmI0LCAweGZmZmMsIDB4NmUwYSwgMHg2ODEwLCAweDdkMDgsCisJMHg4NTI4LCAweDdkMGEsIDB4ODAwMCwgMHg2ODEyLCAweDIwOTEsIDB4ODAwMSwgMHhkNmI0LCAweDAwNDAsCisJMHgyMzJlLCAweGE2YjYsIDB4MDA0MCwgMHg2ZTBhLCAweDEwNzgsIDB4MWU2YywgMHgwZTdmLCAweDAwN2MsCisJMHg2MDA4LCAweGE3MDUsIDB4NjAwYSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyMDFkLCAweDIwOTEsCisJMHg4MDAxLCAweDc4YjgsIDB4YTA2NSwgMHgwMDQwLCAweDIzNDMsIDB4NjA5YywgMHg3OGJhLCAweDYwOWYsCisJMHgwMDAwLCAweDAwNzgsIDB4MjMzMCwgMHg3OGI2LCAweDc4YmEsIDB4MDA3YywgMHg3OTcwLCAweDc4NzQsCisJMHgyODE4LCAweGQzODQsIDB4MDA0MCwgMHgyMzUwLCAweDgwMDAsIDB4YTExMiwgMHgwMDQ4LCAweDIzNTUsCisJMHg4MDAwLCAweGExMTIsIDB4MDBjOCwgMHgyMzY1LCAweGMzODQsIDB4N2E3YywgMHg3MjFhLCAweDdhNzgsCisJMHg3MjFlLCAweGRhYzQsIDB4MDA0MCwgMHgyMzYwLCAweDdhODQsIDB4NzIyMiwgMHg3YTgwLCAweDcyMjYsCisJMHhhMDA2LCAweGQzODQsIDB4MDA0MCwgMHgyMzY1LCAweDgwMDAsIDB4Nzg3NiwgMHg3MGQyLCAweDc4MWMsCisJMHhhMDA1LCAweDAwNDAsIDB4MjM3MywgMHg4MDAxLCAweDc4MWUsIDB4MDBjMCwgMHgyMzczLCAweDAwNjgsCisJMHgyMzczLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLCAweDIwMzksIDB4MjM4YywgMHgwMDc4LCAweDIzN2EsCisJMHgyMDM5LCAweDIzOTIsIDB4MjcwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjM4YiwgMHhhYzAwLCAweDIwNjgsCisJMHg2OTA4LCAweDY4MTAsIDB4NjkxMiwgMHg2ODBhLCAweDY5MGMsIDB4NjgxNCwgMHg2OTE2LCAweDY4MGUsCisJMHg4NzM4LCAweDAwNzgsIDB4MjM3YSwgMHgwMDdjLCAweDAwMDMsIDB4MDAwOSwgMHgwMDBmLCAweDAwMTUsCisJMHgwMDFiLCAweDAwMDAsIDB4MDAxNSwgMHgwMDFiLCAweDAwMDAsIDB4MjA0MSwgMHgwMDAwLCAweDc4MGMsCisJMHgwMDc5LCAweDIzOWEsIDB4MjU2YywgMHgyNTNmLCAweDIzOWUsIDB4MjQxNywgMHgyMDM5LCAweDk2NzQsCisJMHgyNzM0LCAweDdkMTAsIDB4MDA3OCwgMHgyM2JlLCAweDYwODQsIDB4YTA4NiwgMHgwMTAzLCAweDAwYzAsCisJMHgyNDAwLCAweDYxMTQsIDB4NjAxOCwgMHhhMTA1LCAweDAwNDAsIDB4MjNiMywgMHg4NmZmLCAweDAwYzAsCisJMHgyM2NmLCAweDAwNzgsIDB4MjQwMCwgMHg4NjAzLCAweGEwODAsIDB4OTY1NSwgMHg2MjBjLCAweDIyMDIsCisJMHg4MDAwLCAweDYyMTAsIDB4MjIwMiwgMHgxMDc4LCAweDIwM2YsIDB4ODYzMCwgMHhhNjhlLCAweDAwMGYsCisJMHgwMDQwLCAweDI0OGIsIDB4Nzg2YywgMHhhMDY1LCAweDAwYzAsIDB4MjNhNCwgMHg3ODA4LCAweGE2MDIsCisJMHgwMGM4LCAweDIzY2YsIDB4ZDVhYywgMHgwMGMwLCAweDIzY2YsIDB4MjYzYSwgMHgwMDdjLCAweGE2ODIsCisJMHgwMDAzLCAweDAwYzgsIDB4MjQ4YiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsCisJMHhkMDg0LCAweDAwYzAsIDB4MjNmYiwgMHgyMDExLCAweDk2NTUsIDB4MjIwNCwgMHg3MGM2LCAweDgyMTAsCisJMHgyMjA0LCAweDcwY2EsIDB4ZDY4NCwgMHgwMGMwLCAweDIzZWIsIDB4ODIxMCwgMHgyMjA0LCAweDcwZGEsCisJMHg4MjEwLCAweDIyMDQsIDB4NzBkZSwgMHhhNjg1LCAweDgwMjAsIDB4NzBjMiwgMHg2ODFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4NzgxMCwgMHhhMDg0LCAweGZmY2YsIDB4NzgxMiwgMHgyMDkxLCAweDgwMDEsCisJMHgyMDNiLCAweDAwMDAsIDB4MDA3YywgMHg3ODEwLCAweGMwYWQsIDB4NzgxMiwgMHgwMDc4LCAweDI0OGIsCisJMHgyNjNhLCAweDEwNzgsIDB4MjU3NiwgMHgwMGMwLCAweDI1OTksIDB4Nzg2YywgMHhhMDY1LCAweDAwYzAsCisJMHgyM2E0LCAweDIwOTEsIDB4ODAwMCwgMHg3ODEwLCAweGEwODQsIDB4ZmZjZiwgMHg4NmZmLCAweDAwNDAsCisJMHgyNDEyLCAweGMwYWQsIDB4NzgxMiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgyNTk5LCAweDIwMzksCisJMHg5Njc0LCAweDI3MzQsIDB4N2QxMCwgMHgwMDc4LCAweDI0MzMsIDB4NjA4NCwgMHhhMDg2LCAweDAxMDMsCisJMHgwMGMwLCAweDI0NzQsIDB4NjExNCwgMHg2MDE4LCAweGExMDUsIDB4MDA0MCwgMHgyNDJjLCAweDg2ZmYsCisJMHgwMGMwLCAweDI0NDQsIDB4MDA3OCwgMHgyNDc0LCAweGE2ODAsIDB4OTY1NSwgMHg2MjBjLCAweDIyMDIsCisJMHgxMDc4LCAweDIwM2YsIDB4ODYzMCwgMHhhNjhlLCAweDAwMWUsIDB4MDA0MCwgMHgyNDhiLCAweDc4NmMsCisJMHhhMDY1LCAweDAwYzAsIDB4MjQxZCwgMHg3ODA4LCAweGE2MDIsIDB4MDBjOCwgMHgyNDQ0LCAweGQ1YWMsCisJMHgwMGMwLCAweDI0NDQsIDB4MjYzYSwgMHgwMDdjLCAweGE2ODIsIDB4MDAwNiwgMHgwMGM4LCAweDI0OGIsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgwMGMwLCAweDI0NmYsCisJMHgyMDExLCAweDk2NTUsIDB4MjAwOSwgMHg5NjRlLCAweDI2YTgsIDB4MjExYywgMHgyMjA0LCAweDIwMWEsCisJMHg4MTA4LCAweDgyMTAsIDB4MDBmMCwgMHgyNDU1LCAweGE2ODUsIDB4ODAzMCwgMHg3MGMyLCAweDY4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3ODEwLCAweGEwODQsIDB4ZmZjZiwgMHg3ODEyLCAweDIwOTEsCisJMHg4MDAxLCAweGEwMDYsIDB4MjAwOSwgMHg5Njc1LCAweDIwMGEsIDB4MjAzYSwgMHgwMDdjLCAweDc4MTAsCisJMHhjMGFkLCAweDc4MTIsIDB4MDA3OCwgMHgyNDhiLCAweDI2M2EsIDB4MTA3OCwgMHgyNTc2LCAweDAwYzAsCisJMHgyNTk5LCAweDc4NmMsIDB4YTA2NSwgMHgwMGMwLCAweDI0MWQsIDB4MjA5MSwgMHg4MDAwLCAweDc4MTAsCisJMHhhMDg0LCAweGZmY2YsIDB4ODZmZiwgMHgwMDQwLCAweDI0ODYsIDB4YzBhZCwgMHg3ODEyLCAweDIwOTEsCisJMHg4MDAxLCAweDAwNzgsIDB4MjU5OSwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDA0LCAweDc5OTQsCisJMHg3MGQ0LCAweGExMDIsIDB4MDA0OCwgMHgyNDljLCAweDAwNDAsIDB4MjRhNiwgMHg3YjkwLCAweGEzMDIsCisJMHgwMGMwLCAweDI0YTYsIDB4MDA3OCwgMHgyNDlmLCAweDgwMDIsIDB4MDBjMCwgMHgyNGE2LCAweDI2M2EsCisJMHg3ODEwLCAweGMwYWQsIDB4NzgxMiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHhhMTg0LCAweGZmMDAsCisJMHgwMDQwLCAweDI0YjMsIDB4ODEwZiwgMHg4MTBjLCAweDgxMGMsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDcsCisJMHhhMTAwLCAweDAwNzgsIDB4MjRiNiwgMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHg3YTljLCAweGEyMTAsCisJMHg3MjFhLCAweDdhOTgsIDB4YTAwNiwgMHhhMjExLCAweDcyMWUsIDB4ZDRjNCwgMHgwMDQwLCAweDI0YzYsCisJMHg3YWE0LCAweGEyMTEsIDB4NzIyMiwgMHg3YWEwLCAweGEyMTEsIDB4NzIyNiwgMHgyMGExLCAweDAwMzAsCisJMHg3MDAzLCAweDAwMDAsIDB4MjAwOSwgMHg5NjU0LCAweDI2MGEsIDB4ODEwOSwgMHgyMTk4LCAweDIxMDQsCisJMHhkMDg0LCAweDAwNDAsIDB4MjRkNCwgMHg4NjMzLCAweGE2YjAsIDB4MDAwMiwgMHgyNmE4LCAweDUzYTYsCisJMHg4NjAzLCAweDcwMTIsIDB4NzAwNywgMHgwMDAxLCAweDc5OTAsIDB4Nzg5NCwgMHg4MDAwLCAweGExMGEsCisJMHgwMGM4LCAweDI0ZTMsIDB4YTAwNiwgMHgyMDI4LCAweDc5NzQsIDB4YTE4NCwgMHhmZjAwLCAweDAwNDAsCisJMHgyNGYyLCAweDgxMGYsIDB4ODEwYywgMHg4MTBjLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA3LCAweGExMDAsCisJMHgwMDc4LCAweDI0ZjUsIDB4ODEwNywgMHg4MDA0LCAweDgwMDQsIDB4Nzk3YywgMHhhMTA4LCAweDdhNzgsCisJMHhhMDA2LCAweGEyMTEsIDB4ZDRjNCwgMHgwMDQwLCAweDI1MDEsIDB4N2I4NCwgMHhhMzE5LCAweDdjODAsCisJMHhhNDIxLCAweDcwMDgsIDB4ZDBmYywgMHgwMDQwLCAweDI1MDEsIDB4YTA4NCwgMHgwMWUwLCAweDAwNDAsCisJMHgyNTI2LCAweDdkMTAsIDB4MjAzMSwgMHg5NjU0LCAweDI2MzQsIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsCisJMHhkMDhjLCAweDAwYzAsIDB4MjUxYiwgMHg3MDA3LCAweDAwMDYsIDB4NzAwNCwgMHhkMDk0LCAweDAwYzAsCisJMHgyNTE1LCAweDAwNzgsIDB4MjQ4ZCwgMHgyMDY5LCAweDRlNDcsIDB4MjA2YiwgMHgwMDAzLCAweDc4YWMsCisJMHhhMDg1LCAweDAzMDAsIDB4NzhhZSwgMHhhMDA2LCAweDAwNzgsIDB4MjUyZiwgMHgyMDMwLCAweDc1ZDYsCisJMHgyMDkxLCAweDQwODAsIDB4N2Q5NiwgMHg3ZDEwLCAweGE1YWMsIDB4ZmZjZiwgMHg3ZDEyLCAweDIwOTEsCisJMHg4MDAxLCAweDc4YWEsIDB4NzAwNywgMHgwMDA2LCAweDI2M2EsIDB4NzAwMywgMHgwMDAxLCAweDcxMWEsCisJMHg3MjFlLCAweGQ1YzQsIDB4MDA0MCwgMHgyNTNlLCAweDczMjIsIDB4NzQyNiwgMHgwMDdjLCAweDYwODQsCisJMHhhMDg2LCAweDAxMDMsIDB4MDBjMCwgMHgyNTYyLCAweDYxMTQsIDB4NjAxOCwgMHhhMTA1LCAweDAwYzAsCisJMHgyNTYyLCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LCAweGQwODQsIDB4MDBjMCwgMHgyNTYyLCAweDYwMGMsCisJMHg3MGM2LCAweDYwMTAsIDB4NzBjYSwgMHg3MGMzLCAweDgwMjAsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsCisJMHg0MDgwLCAweDEwNzgsIDB4MjAzZiwgMHgwMDY4LCAweDI1NjEsIDB4Nzg2YywgMHhhMDY1LCAweDAwYzAsCisJMHgyNTNmLCAweDAwN2MsIDB4MTA3OCwgMHgyNTc2LCAweDAwYzAsIDB4MjU5OSwgMHg3ODZjLCAweGEwNjUsCisJMHgwMGMwLCAweDI1M2YsIDB4MDA3OCwgMHgyNTk5LCAweDEwNzgsIDB4MjU3NiwgMHgwMGMwLCAweDI1OTksCisJMHg3ODZjLCAweGEwNjUsIDB4MDBjMCwgMHgyNTZjLCAweDAwNzgsIDB4MjU5OSwgMHg2MDg0LCAweGEwODYsCisJMHgwMTAzLCAweDAwYzAsIDB4MjU4YSwgMHg2MDE4LCAweGMwZmMsIDB4NjAxYSwgMHhhMDg2LCAweDAwMDQsCisJMHgwMGMwLCAweDI1OGEsIDB4NzgwNCwgMHhkMGE0LCAweDAwNDAsIDB4MjU4YSwgMHgxMDc4LCAweDIwM2YsCisJMHhhMDA2LCAweDAwN2MsIDB4MTA3OCwgMHgyNTlmLCAweDAwYzAsIDB4MjU5MSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDEwNzgsIDB4MjVhZSwgMHgwMGMwLCAweDI1OTcsIDB4MjA0MSwgMHgwMDAxLCAweDdkMTAsCisJMHgwMDdjLCAweDg4ZmYsIDB4MDA0MCwgMHgyNTllLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLCAweDdiOTAsCisJMHg3OTk0LCAweDcwZDQsIDB4YTEwMiwgMHgwMGMwLCAweDI1YTgsIDB4YTM4NSwgMHgwMDAwLCAweDAwN2MsCisJMHgwMDQ4LCAweDI1YWMsIDB4YTMwMiwgMHgwMDdjLCAweDgwMDIsIDB4MDA3YywgMHg3ODEwLCAweGQwZWMsCisJMHgwMDQwLCAweDI1YzYsIDB4MGU3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgwMDIwLCAweDcwMDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MjVjMywgMHg3MDA4LCAweDBlN2YsIDB4YTA4NiwgMHgwMDA4LCAweDAwNDAsCisJMHgyNWM2LCAweDAwNzgsIDB4MjYxNywgMHgwZTdmLCAweDAwNzgsIDB4MjYxNywgMHhhMTg0LCAweGZmMDAsCisJMHgwMDQwLCAweDI1ZDMsIDB4ODEwZiwgMHg4MTBjLCAweDgxMGMsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDcsCisJMHhhMTAwLCAweDAwNzgsIDB4MjVkNiwgMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHg3YTljLCAweDdiOTgsCisJMHg3Y2E0LCAweDdkYTAsIDB4YTIxMCwgMHhhMDA2LCAweGEzMTksIDB4YTQyMSwgMHhhNTI5LCAweDIwMDksCisJMHgwMDE4LCAweDYwMjgsIDB4YTAwNSwgMHgwMDQwLCAweDI1ZTcsIDB4MjAwOSwgMHgwMDQwLCAweDEwNzgsCisJMHgxZDc0LCAweDAwNDAsIDB4MjYwOSwgMHg3OGE4LCAweDgwMDAsIDB4NzhhYSwgMHhkMDhjLCAweDAwYzAsCisJMHgyNjE3LCAweDYwMTQsIDB4ZDBmYywgMHgwMGMwLCAweDI1ZjksIDB4MjA2OSwgMHg0ZTQwLCAweDAwNzgsCisJMHgyNWZiLCAweDIwNjksIDB4NGU4MCwgMHgyMDkxLCAweDgwMDAsIDB4NjgxZiwgMHgwMDAzLCAweDc4YWIsCisJMHgwMDAwLCAweDc4YWMsIDB4YTA4NSwgMHgwMzAwLCAweDc4YWUsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsCisJMHgyNjE3LCAweDc4YWIsIDB4MDAwMCwgMHgxMDc4LCAweDIwM2YsIDB4Nzk5MCwgMHg3ODk0LCAweDgwMDAsCisJMHhhMTBhLCAweDAwYzgsIDB4MjYxNCwgMHhhMDA2LCAweDc4OTYsIDB4NzBkNiwgMHhhMDA2LCAweDIwNzEsCisJMHgwMDEwLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweGQ3ZmMsIDB4MDBjMCwgMHgyNjIzLCAweDIwMDksCisJMHg0ZTU5LCAweDAwNzgsIDB4MjYyNSwgMHgyMDA5LCAweDRlOTksIDB4MjA5MSwgMHg4MDAwLCAweDIwMGEsCisJMHgwZjdlLCAweGQ3ZmMsIDB4MDBjMCwgMHgyNjNjLCAweDIwMDksIDB4NGU0MCwgMHgyMDAxLCAweDRlMDQsCisJMHgyMDA0LCAweGQwZWMsIDB4MDA0MCwgMHgyNjM4LCAweDIwNzksIDB4MDEwMCwgMHgwMDc4LCAweDI2NDAsCisJMHgyMDc5LCAweDAyMDAsIDB4MDA3OCwgMHgyNjQwLCAweDIwMDksIDB4NGU4MCwgMHgyMDc5LCAweDAxMDAsCisJMHgyMTA0LCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDI2NTksIDB4ZDdmYywgMHgwMGMwLCAweDI2NGMsCisJMHgyMDA5LCAweDRlNDUsIDB4MDA3OCwgMHgyNjRlLCAweDIwMDksIDB4NGU4NSwgMHgyMTA0LCAweGEwMDUsCisJMHgwMGMwLCAweDI2NTksIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgyNjU5LCAweDc4MWIsCisJMHgwMDQ1LCAweDBmN2YsIDB4MDA3YywgMHgyMDA5LCAweDAwMDIsIDB4MjA2OSwgMHg0ZTAwLCAweDY4MTAsCisJMHhkMGVjLCAweDAwYzAsIDB4MjZjOCwgMHgyMDcxLCAweDRlODAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMjEsCisJMHg1MGJmLCAweDc4NGIsIDB4MDAwZiwgMHgyMDE5LCAweDQ0NTcsIDB4ZDE4NCwgMHgwMDQwLCAweDI2N2MsCisJMHg2ODEwLCAweGQwZWMsIDB4MDA0MCwgMHgyNjc4LCAweDIwYTEsIDB4MDEyYiwgMHgwMDc4LCAweDI2N2UsCisJMHgyMGExLCAweDAyMmIsIDB4MDA3OCwgMHgyNjdlLCAweDIwYTEsIDB4MDEyYiwgMHgyMzA0LCAweGEwMDUsCisJMHgwMDQwLCAweDI2OGIsIDB4Nzg5YSwgMHg4MzE4LCAweDIzYWMsIDB4ODMxOCwgMHgyMzk4LCAweDUzYTYsCisJMHgzMzE4LCAweDAwNzgsIDB4MjY3ZSwgMHg3ODliLCAweDAwMjAsIDB4MjBhOSwgMHgwMDEwLCAweDY4MTQsCisJMHhkMGU0LCAweDAwNDAsIDB4MjY5YiwgMHg3OGFmLCAweDAwMDAsIDB4NzhhZiwgMHg5MDIwLCAweDAwZjAsCisJMHgyNjkzLCAweDAwNzgsIDB4MjZhMSwgMHg3OGFmLCAweDAwMDAsIDB4NzhhZiwgMHg4MDIwLCAweDAwZjAsCisJMHgyNjliLCAweDcwMDMsIDB4MDAwMCwgMHgwMTdlLCAweGQxOGMsIDB4MjAwOSwgMHgwMDAwLCAweDAwNDAsCisJMHgyNmFhLCAweGMxYmQsIDB4MTA3OCwgMHgyODliLCAweDAxN2YsIDB4NzAyMCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMDdlLCAweDY4MTQsIDB4ZDBlNCwgMHgwMDdmLCAweDAwYzAsIDB4MjZiYSwgMHhhMDg1LCAweDYzNDAsCisJMHgwMDc4LCAweDI2YmMsIDB4YTA4NSwgMHg2MmMwLCAweDc4MDYsIDB4NzgwZiwgMHg5MjAwLCAweDc4NDMsCisJMHgwMGQ4LCAweDc4NTMsIDB4MDA4MCwgMHg3ODBiLCAweDAwMDgsIDB4NzQ1NiwgMHg3MDUzLCAweDAwMDAsCisJMHg4MTA5LCAweDAwNDAsIDB4MjZkYiwgMHgyMDcxLCAweDRlNDAsIDB4NjgxMCwgMHhkMGVjLCAweDAwNDAsCisJMHgyNmQ1LCAweDIwNzksIDB4MDEwMCwgMHgwMDc4LCAweDI2ZDcsIDB4MjA3OSwgMHgwMjAwLCAweDIwMjEsCisJMHg0ZWJmLCAweDAwNzgsIDB4MjY2OSwgMHgwMDdjLCAweDAxN2UsIDB4ZDFiYywgMHgwMGMwLCAweDI2ZjAsCisJMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLCAweDI2ZWMsCisJMHgyMDExLCAweDAxMDEsIDB4MDA3OCwgMHgyNmYyLCAweDIwMTEsIDB4MDIwMSwgMHgwMDc4LCAweDI2ZjIsCisJMHgyMDExLCAweDAxMDEsIDB4YTE4YywgMHgwMDBmLCAweDIyMDQsIDB4YTA4NCwgMHhmZmYwLCAweGExMDUsCisJMHgyMDEyLCAweDAxN2YsIDB4MTA3OCwgMHgyODliLCAweDAwN2MsIDB4ZDNmYywgMHgwMGMwLCAweDI3MTAsCisJMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLCAweDI3MGMsCisJMHgyMDExLCAweDAxMDEsIDB4MDA3OCwgMHgyNzEyLCAweDIwMTEsIDB4MDIwMSwgMHgwMDc4LCAweDI3MTIsCisJMHgyMDExLCAweDAxMDEsIDB4MjBhOSwgMHgwMDA5LCAweDgxMGIsIDB4MDBmMCwgMHgyNzE0LCAweGExOGMsCisJMHgwZTAwLCAweDIyMDQsIDB4YTA4NCwgMHhmMWZmLCAweGExMDUsIDB4MjAxMiwgMHgwMDdjLCAweDIwMTksCisJMHgwMDAyLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsIDB4MDA0MCwgMHgyNzJjLCAweDgzMTksCisJMHgyMDA5LCAweDAxMDEsIDB4MDA3OCwgMHgyNzJlLCAweDIwMDksIDB4MDEwMSwgMHgyMGE5LCAweDAwMDUsCisJMHg4MjEzLCAweDAwZjAsIDB4MjczMCwgMHhhMjk0LCAweDAwZTAsIDB4MjEwNCwgMHhhMDg0LCAweGZmMWYsCisJMHhhMjA1LCAweDIwMGEsIDB4ODMxOSwgMHgwMDQwLCAweDI3NDEsIDB4MjAwOSwgMHgwMjAxLCAweDAwNzgsCisJMHgyNzJlLCAweDAwN2MsIDB4ZDNmYywgMHgwMGMwLCAweDI3NTUsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsCisJMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLCAweDI3NTEsIDB4MjAxMSwgMHgwMTAxLCAweDAwNzgsCisJMHgyNzU3LCAweDIwMTEsIDB4MDIwMSwgMHgwMDc4LCAweDI3NTcsIDB4MjAxMSwgMHgwMTAxLCAweDIwYTksCisJMHgwMDBjLCAweDgxMGIsIDB4MDBmMCwgMHgyNzU5LCAweGExOGMsIDB4ZjAwMCwgMHgyMjA0LCAweGEwODQsCisJMHgwZmZmLCAweGExMDUsIDB4MjAxMiwgMHgwMDdjLCAweGQzZmMsIDB4MDBjMCwgMHgyNzc3LCAweDAwN2UsCisJMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgyNzczLCAweDIwMTEsCisJMHgwMTAyLCAweDAwNzgsIDB4Mjc3OSwgMHgyMDExLCAweDAyMDIsIDB4MDA3OCwgMHgyNzc5LCAweDIwMTEsCisJMHgwMTAyLCAweDIyMDQsIDB4YTA4NCwgMHhmZmNmLCAweGExMDUsIDB4MjAxMiwgMHgwMDdjLCAweDBjN2UsCisJMHhkMWJjLCAweDAwYzAsIDB4Mjc5MywgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsCisJMHgwMDdmLCAweDAwNDAsIDB4Mjc4ZiwgMHgyMDYxLCAweDAxMDAsIDB4MDA3OCwgMHgyNzk1LCAweDIwNjEsCisJMHgwMjAwLCAweDAwNzgsIDB4Mjc5NSwgMHgyMDYxLCAweDAxMDAsIDB4YzFiYywgMHg4MTAzLCAweDgwMDMsCisJMHhhMDgwLCAweDAwMjAsIDB4NjA5YSwgMHg2MmFjLCAweDYzYWMsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHhkMWJjLCAweDAwYzAsIDB4MjdiMywgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsCisJMHgwMDdmLCAweDAwNDAsIDB4MjdhZiwgMHgyMDYxLCAweDAxMDAsIDB4MDA3OCwgMHgyN2I1LCAweDIwNjEsCisJMHgwMjAwLCAweDAwNzgsIDB4MjdiNSwgMHgyMDYxLCAweDAxMDAsIDB4YzFiYywgMHg4MTAzLCAweDgwMDMsCisJMHhhMDgwLCAweDAwMjIsIDB4NjA5YSwgMHg2MGE0LCAweGEwODQsIDB4ZmZkZiwgMHg2MGFlLCAweDBjN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4ZDFiYywgMHgwMGMwLCAweDI3ZDUsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsCisJMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLCAweDI3ZDEsIDB4MjA2MSwgMHgwMTAwLCAweDAwNzgsCisJMHgyN2Q3LCAweDIwNjEsIDB4MDIwMCwgMHgwMDc4LCAweDI3ZDcsIDB4MjA2MSwgMHgwMTAwLCAweGMxYmMsCisJMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIyLCAweDYwOWEsIDB4NjBhNCwgMHhhMDg1LCAweDAwMjAsCisJMHg2MGFlLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweGQxYmMsIDB4MDBjMCwgMHgyN2Y3LCAweDAwN2UsCisJMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgyN2YzLCAweDIwNjEsCisJMHgwMTAwLCAweDAwNzgsIDB4MjdmOSwgMHgyMDYxLCAweDAyMDAsIDB4MDA3OCwgMHgyN2Y5LCAweDIwNjEsCisJMHgwMTAwLCAweGMxYmMsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHg2MDlhLCAweDYwYTQsCisJMHhhMjhjLCAweDAwMjAsIDB4MDA0MCwgMHgyODA3LCAweGMyYWMsIDB4YTM5ZCwgMHg0MDAwLCAweGMzZmMsCisJMHhkM2I0LCAweDAwYzAsIDB4MjgwYywgMHhjM2ZkLCAweDYyYWUsIDB4MjAxMCwgMHg2MGE0LCAweDYzYWUsCisJMHgyMDE4LCAweDBjN2YsIDB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgwZTdlLCAweDY4MTgsCisJMHhhMDA1LCAweDAwNDAsIDB4Mjg3OSwgMHhkMWZjLCAweDAwNDAsIDB4MjgyMiwgMHgyMDYxLCAweDk1ZDAsCisJMHgwMDc4LCAweDI4MjQsIDB4MjA2MSwgMHg5NGMwLCAweDEwNzgsIDB4Mjg4MSwgMHgwMDQwLCAweDI4NWIsCisJMHgyMGE5LCAweDAxMDEsIDB4ZDFmYywgMHgwMDQwLCAweDI4MzEsIDB4MjA2MSwgMHg5NGQwLCAweDAwNzgsCisJMHgyODMzLCAweDIwNjEsIDB4OTNjMCwgMHgwYzdlLCAweDEwNzgsIDB4Mjg4MSwgMHgwMDQwLCAweDI4M2UsCisJMHgwYzdmLCAweDhjNjAsIDB4MDBmMCwgMHgyODMzLCAweDAwNzgsIDB4Mjg3OSwgMHgwMDdmLCAweGQxZmMsCisJMHgwMDQwLCAweDI4NDgsIDB4YTA4MiwgMHg5NGQwLCAweDIwNzEsIDB4NGU4MCwgMHgwMDc4LCAweDI4NGMsCisJMHhhMDgyLCAweDkzYzAsIDB4MjA3MSwgMHg0ZTQwLCAweDcwN2EsIDB4NzE3NiwgMHgyMTM4LCAweDIwMDEsCisJMHgwMDA0LCAweDcwNjYsIDB4NzA4MywgMHgwMDBmLCAweDcxZDQsIDB4YzFkYywgMHg3MWQ2LCAweDEwNzgsCisJMHgyNjFjLCAweDAwNzgsIDB4Mjg3NSwgMHhkMWZjLCAweDAwYzAsIDB4Mjg2MiwgMHgyMDcxLCAweDRlNDAsCisJMHgwMDc4LCAweDI4NjQsIDB4MjA3MSwgMHg0ZTgwLCAweDYwMjAsIDB4YzBkZCwgMHg2MDIyLCAweDcxNzYsCisJMHgyMTM4LCAweDJjMDAsIDB4NzA3ZSwgMHgyMDAxLCAweDAwMDYsIDB4NzA2NiwgMHg3MDgzLCAweDAwMGYsCisJMHg3MWQ0LCAweGMxZGMsIDB4NzFkNiwgMHgxMDc4LCAweDI2MWMsIDB4MjAwMSwgMHgwMDAwLCAweDAwNzgsCisJMHgyODdiLCAweDIwMDEsIDB4MDAwMSwgMHgyMDkxLCAweDgwMDEsIDB4YTAwNSwgMHgwZTdmLCAweDBjN2YsCisJMHgwMDdjLCAweDJjMDQsIDB4YTAwNSwgMHgwMDQwLCAweDI4OTgsIDB4MjA2MCwgMHg2MDEwLCAweGEzMDYsCisJMHgwMGMwLCAweDI4OTUsIDB4NjAwYywgMHhhMjA2LCAweDAwYzAsIDB4Mjg5NSwgMHg2MDE0LCAweGExMDYsCisJMHgwMGMwLCAweDI4OTUsIDB4YTAwNiwgMHgwMDc4LCAweDI4OWEsIDB4NjAwMCwgMHgwMDc4LCAweDI4ODIsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MDE3ZSwgMHhkMWJjLCAweDAwYzAsCisJMHgyOGIzLCAweDIwNzksIDB4NGU0MCwgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsCisJMHgwMDdmLCAweDAwNDAsIDB4MjhhZiwgMHgyMDcxLCAweDAxMDAsIDB4MDA3OCwgMHgyOGI3LCAweDIwNzEsCisJMHgwMjAwLCAweDAwNzgsIDB4MjhiNywgMHgyMDc5LCAweDRlODAsIDB4MjA3MSwgMHgwMTAwLCAweDc5MjAsCisJMHhhMThjLCAweDAwMGYsIDB4NzBlYywgMHhkMGM0LCAweDAwYzAsIDB4MjhjMSwgMHgwMTdmLCAweDAwNzgsCisJMHgyOGRjLCAweDgxMGIsIDB4ODEwYiwgMHg4MTBiLCAweDgxMGIsIDB4MDA3ZiwgMHhkMGJjLCAweDAwYzAsCisJMHgyOGQ5LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsIDB4ZDBlYywgMHgwMDdmLCAweDAwNDAsCisJMHgyOGQ1LCAweGExOGQsIDB4MGYwMCwgMHgwMDc4LCAweDI4ZGIsIDB4YTE4ZCwgMHgwZjAwLCAweDAwNzgsCisJMHgyOGRiLCAweGExOGQsIDB4MDgwMCwgMHgyMTA0LCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBlN2UsCisJMHgyMDAxLCAweDRlMDEsIDB4MjAwNCwgMHhkMGFjLCAweDAwYzAsIDB4Mjk1YywgMHg2OGU0LCAweGQwYWMsCisJMHgwMDQwLCAweDI5NWMsIDB4YTA4NCwgMHgwMDA2LCAweDAwYzAsIDB4Mjk1YywgMHg2MDE0LCAweGQwZmMsCisJMHgwMGMwLCAweDI4ZjYsIDB4MjA3MSwgMHg1MmMwLCAweDAwNzgsIDB4MjhmOCwgMHgyMDcxLCAweDUzNDAsCisJMHg4MDA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhZTcwLCAweDcwMDQsCisJMHhhMDg0LCAweDAwMGEsIDB4MDBjMCwgMHgyOTVjLCAweDcxMDgsIDB4YTE5NCwgMHhmZjAwLCAweDAwNDAsCisJMHgyOTVjLCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLCAweDAwMGEsIDB4YTEwNiwgMHgwMDQwLCAweDI5MmIsCisJMHgyMDAxLCAweDAwMGMsIDB4YTEwNiwgMHgwMDQwLCAweDI5MmYsIDB4MjAwMSwgMHgwMDEyLCAweGExMDYsCisJMHgwMDQwLCAweDI5MzMsIDB4MjAwMSwgMHgwMDE0LCAweGExMDYsIDB4MDA0MCwgMHgyOTM3LCAweDIwMDEsCisJMHgwMDE5LCAweGExMDYsIDB4MDA0MCwgMHgyOTNiLCAweDIwMDEsIDB4MDAzMiwgMHhhMTA2LCAweDAwNDAsCisJMHgyOTNmLCAweDAwNzgsIDB4Mjk0MywgMHgyMDA5LCAweDAwMGMsIDB4MDA3OCwgMHgyOTQ1LCAweDIwMDksCisJMHgwMDEyLCAweDAwNzgsIDB4Mjk0NSwgMHgyMDA5LCAweDAwMTQsIDB4MDA3OCwgMHgyOTQ1LCAweDIwMDksCisJMHgwMDE5LCAweDAwNzgsIDB4Mjk0NSwgMHgyMDA5LCAweDAwMjAsIDB4MDA3OCwgMHgyOTQ1LCAweDIwMDksCisJMHgwMDNmLCAweDAwNzgsIDB4Mjk0NSwgMHgyMDExLCAweDAwMDAsIDB4MjEwMCwgMHhhMjA1LCAweDcwMGEsCisJMHgyMDcxLCAweDRlMDAsIDB4NzAwNCwgMHhkMGJjLCAweDAwNDAsIDB4Mjk1YywgMHg2MDE0LCAweGQwZmMsCisJMHgwMGMwLCAweDI5NTcsIDB4NzBlYSwgMHgyMDcxLCAweDRlNDAsIDB4MDA3OCwgMHgyOTVhLCAweDcwZWUsCisJMHgyMDcxLCAweDRlODAsIDB4NzAxZiwgMHgwMDBkLCAweDBlN2YsIDB4MDA3YywgMHgyMDAxLCAweDRlMDUsCisJMHgyMDA0LCAweGQwZTQsIDB4MDBjMCwgMHgyOTZhLCAweDc4MDQsIDB4YTA4NCwgMHhmZjFmLCAweGEwODUsCisJMHg2MzQwLCAweDc4MDYsIDB4MDA3YywgMHgwMDY4LCAweDI5NmIsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHgwMDAwLCAweDAwN2UsIDB4NzAxOCwgMHhkMDg0LCAweDAwYzAsIDB4Mjk3MiwgMHgwMDdmLCAweDIwNzEsCisJMHgwMDEwLCAweDcwY2EsIDB4MDA3ZiwgMHg3MGM2LCAweDcwYzMsIDB4ODAwMiwgMHg3MGRiLCAweDA4MGYsCisJMHg3MGRmLCAweDAwMDAsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgwMDc4LCAweDI5ODgsIDB4N2YzYywgMHg3ZTU4LCAweDdjMzAsIDB4N2QzOCwgMHg3OGEwLCAweDcwOGUsCisJMHg3NTkyLCAweDc0OTYsIDB4NzY5YSwgMHg3NzllLCAweGE1OTQsIDB4MDAzZiwgMHhkNGY0LCAweDAwNDAsCisJMHgyOTlmLCAweGE3ODQsIDB4MDA3ZCwgMHgwMGMwLCAweDQzY2QsIDB4MTA3OCwgMHgyOTZiLCAweGE0OWMsCisJMHgwMDBmLCAweGEzODIsIDB4MDAwNCwgMHgwMDUwLCAweDI5YWEsIDB4YTNhNiwgMHgwMDA3LCAweDAwYzAsCisJMHgyOTZiLCAweDI0MTgsIDB4ODUwNywgMHhhMDg0LCAweDAwMGYsIDB4MDA3OSwgMHgyOWFmLCAweDMwMjgsCisJMHgzMTE5LCAweDMxNDQsIDB4MzNiNiwgMHgzNzlmLCAweDM4MTksIDB4MzhjZSwgMHgzOTVmLCAweDNhNGQsCisJMHgzYjNjLCAweDI5YzIsIDB4MjliZiwgMHgyZGY5LCAweDJmMWMsIDB4Mzc3MCwgMHgyOWJmLCAweDEwNzgsCisJMHgyOTZiLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDI5Y2MsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsCisJMHhhMDA2LCAweDcwMDIsIDB4NzA0ZSwgMHg3MDQ2LCAweDcwZDIsIDB4NzA2MCwgMHhhMDA1LCAweDAwYzAsCisJMHgyYjMyLCAweDcwNjQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4MjlkNiwgMHgyOWRlLCAweDJhNTEsCisJMHgyYTVhLCAweDJhNjUsIDB4MmE3MCwgMHgyYjE4LCAweDJhN2IsIDB4MmE1MSwgMHg3ODMwLCAweGQwYmMsCisJMHgwMGMwLCAweDI5YzEsIDB4NzFkNCwgMHhkMWJjLCAweDAwYzAsIDB4MjljMSwgMHhkMWI0LCAweDAwYzAsCisJMHgyYTJlLCAweDcwYTQsIDB4YTA4NiwgMHgwMDAxLCAweDAwNDAsIDB4MjljMSwgMHg3MGI0LCAweGEwNmQsCisJMHg2ODAwLCAweGEwNjUsIDB4YTA1NSwgMHg3ODliLCAweDAwMTAsIDB4NmIwYywgMHg3YmFhLCAweDY4MDgsCisJMHhhMDQ1LCAweDZkMTAsIDB4NjgwNCwgMHhhMDZkLCAweGEwNWQsIDB4YTg4NiwgMHgwMDAxLCAweDAwNDAsCisJMHgyYTA0LCAweDY5YmMsIDB4N2RhYSwgMHg3OWFhLCAweDY4YzAsIDB4YTA0ZCwgMHg2ZTFjLCAweDIwMDEsCisJMHgwMDEwLCAweDAwNzgsIDB4MmM4YywgMHg3MDYwLCAweGEwMDUsIDB4MDBjMCwgMHgyOWMxLCAweDBjN2UsCisJMHgwZDdlLCAweDcwYjQsIDB4YTA2ZCwgMHg2ODAwLCAweGEwNjUsIDB4YTA1NSwgMHg3ODliLCAweDAwMTAsCisJMHg2YjBjLCAweDdiYWEsIDB4NjgwOCwgMHhhMDQ1LCAweDZkMTAsIDB4NjgwNCwgMHhhMDZkLCAweGEwNWQsCisJMHhhODg2LCAweDAwMDEsIDB4MDA0MCwgMHgyYTI3LCAweDY5YmMsIDB4N2RhYSwgMHg3OWFhLCAweDY4YzAsCisJMHhhMDRkLCAweDZlMWMsIDB4MjAwMSwgMHgwMDIwLCAweDAwNzgsIDB4MmM4YywgMHgxMDc4LCAweDQzNjAsCisJMHgwMGMwLCAweDI5YzEsIDB4NzgxYiwgMHgwMDViLCAweDcwYmMsIDB4YTA2ZCwgMHg2OGI0LCAweDc4NWEsCisJMHg2ODk0LCAweDc4ZDYsIDB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHg3ODA4LCAweGMwOGQsCisJMHg3ODBhLCAweDY4YmMsIDB4NzA0MiwgMHhjMWI0LCAweDcxZDYsIDB4NzBiOCwgMHhhMDY1LCAweDY4YzAsCisJMHg3MDVhLCAweDcwMDMsIDB4MDAwMiwgMHgyZDAwLCAweDcwNGUsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDYsCisJMHgwMDdjLCAweDEwNzgsIDB4NDM2MCwgMHgwMGMwLCAweDJhNTksIDB4NzgxYiwgMHgwMDQ3LCAweDcwMDMsCisJMHgwMDA0LCAweDAwN2MsIDB4MTA3OCwgMHg0MzYwLCAweDAwYzAsIDB4MmE2NCwgMHgyMDExLCAweDAwMGMsCisJMHgxMDc4LCAweDJhOGIsIDB4NzAwMywgMHgwMDA0LCAweDAwN2MsIDB4MTA3OCwgMHg0MzYwLCAweDAwYzAsCisJMHgyYTZmLCAweDIwMTEsIDB4MDAwNiwgMHgxMDc4LCAweDJhOGIsIDB4NzAwMywgMHgwMDA0LCAweDAwN2MsCisJMHgxMDc4LCAweDQzNjAsIDB4MDBjMCwgMHgyYTdhLCAweDIwMTEsIDB4MDAwZCwgMHgxMDc4LCAweDJhOGIsCisJMHg3MDAzLCAweDAwMDQsIDB4MDA3YywgMHgxMDc4LCAweDQzNjAsIDB4MDBjMCwgMHgyYThhLCAweDIwMTEsCisJMHgwMDA2LCAweDEwNzgsIDB4MmE4YiwgMHg3MDdjLCAweDcwN2YsIDB4MDAwMCwgMHgyMDY4LCAweDcwNGUsCisJMHg3MDAzLCAweDAwMDEsIDB4MDA3YywgMHg3MTc0LCAweGMxZmMsIDB4ODEwNywgMHg3ODgyLCAweDc4OWIsCisJMHgwMDEwLCAweGEyODYsIDB4MDAwYywgMHgwMGMwLCAweDJhOWEsIDB4N2FhYSwgMHgyMDAxLCAweDAwMDEsCisJMHgwMDc4LCAweDJhYWYsIDB4YTE4YywgMHgwMDFmLCAweGExOGQsIDB4MDBjMCwgMHg3OWFhLCAweGEyODYsCisJMHgwMDBkLCAweDAwNDAsIDB4MmFhOCwgMHg3YWFhLCAweDIwMDEsIDB4MDAwMiwgMHgwMDc4LCAweDJhYWYsCisJMHg3OGFiLCAweDAwMjAsIDB4NzE3OCwgMHg3OWFhLCAweDdhYWEsIDB4MjAwMSwgMHgwMDA0LCAweDc4OWIsCisJMHgwMDYwLCAweDc4YWEsIDB4Nzg1YiwgMHgwMDA0LCAweDc4MWIsIDB4MDExNiwgMHgxMDc4LCAweDQzODMsCisJMHg3MDgzLCAweDAwMGYsIDB4NzBkNCwgMHhkMGI0LCAweDAwNDAsIDB4MmFjYiwgMHhjMGI0LCAweDcwZDYsCisJMHgwYzdlLCAweDcwYjgsIDB4YTA2NSwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLCAweDYwMTgsCisJMHg4MDAxLCAweDYwMWEsIDB4MGM3ZiwgMHgwMDdjLCAweDcwMTQsIDB4YTAwNSwgMHgwMGMwLCAweDJhZGEsCisJMHg3MGQ0LCAweGQwYjQsIDB4MDA0MCwgMHgyYWRiLCAweDcwYjgsIDB4YWMwNiwgMHgwMGMwLCAweDJhZGIsCisJMHgxMDc4LCAweDJhYmEsIDB4MDA3YywgMHgwMTdlLCAweDcxYTQsIDB4YTE4NiwgMHgwMDAxLCAweDAwNDAsCisJMHgyYjBkLCAweDBkN2UsIDB4MDI3ZSwgMHgyMTAwLCAweDIwMTEsIDB4MDAwMSwgMHhhMjEyLCAweDcwYjQsCisJMHgyMDY4LCAweDY4MDAsIDB4YWMwNiwgMHgwMDQwLCAweDJhZjQsIDB4ODIxMSwgMHgwMDQwLCAweDJiMGIsCisJMHgxMDc4LCAweDJiMGYsIDB4MDA3OCwgMHgyYWU5LCAweDBjN2UsIDB4MjEwMCwgMHgyMDExLCAweDAwMDEsCisJMHhhMjEyLCAweDcwYjQsIDB4MjA2OCwgMHg2ODAwLCAweDIwNjAsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsCisJMHg2MDBhLCAweDgyMTEsIDB4MDA0MCwgMHgyYjA4LCAweDEwNzgsIDB4MmIwZiwgMHgwMDc4LCAweDJhZmIsCisJMHg3MGE3LCAweDAwMDEsIDB4MGM3ZiwgMHgwMjdmLCAweDBkN2YsIDB4MDE3ZiwgMHgwMDdjLCAweGFkZTgsCisJMHgwMDA1LCAweDcwYWMsIDB4YWQwNiwgMHgwMGMwLCAweDJiMTcsIDB4NzBhOCwgMHgyMDY4LCAweDAwN2MsCisJMHgxMDc4LCAweDQzNjAsIDB4MDBjMCwgMHgyOWMxLCAweDcwN2MsIDB4MjA2OCwgMHg3Nzc0LCAweDEwNzgsCisJMHg0MWZlLCAweDJjNTAsIDB4MTA3OCwgMHg0NDQyLCAweDc4OWIsIDB4MDAxMCwgMHg2ODE0LCAweGEwODQsCisJMHgwMDFmLCAweGMwYmQsIDB4NzhhYSwgMHg2ZTFjLCAweDIwNDEsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDQsCisJMHgwMDc4LCAweDJjOTIsIDB4MTA3OCwgMHg0MzYwLCAweDAwYzAsIDB4MjljMSwgMHg3ODliLCAweDAwMTAsCisJMHg3MDYwLCAweDIwNjgsIDB4NmYxNCwgMHg3MGQ0LCAweGQwYjQsIDB4MDA0MCwgMHgyYjRjLCAweGMwYjQsCisJMHg3MGQ2LCAweDBjN2UsIDB4NzBiOCwgMHhhMDY1LCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsCisJMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHgwYzdmLCAweDEwNzgsIDB4NDFmZSwgMHgyYzUwLCAweDEwNzgsCisJMHg0NDQyLCAweDY4MjQsIDB4YTAwNSwgMHgwMDQwLCAweDJiNWQsIDB4YTA4MiwgMHgwMDA2LCAweDAwNDgsCisJMHgyYjViLCAweDAwNzgsIDB4MmI1ZCwgMHg2ODI3LCAweDAwMDUsIDB4NjgxNCwgMHhhMDg0LCAweDAwMWYsCisJMHhjMGJkLCAweDc4YWEsIDB4MjAzMSwgMHgwMDIwLCAweDIwNDEsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDMsCisJMHgwMDc4LCAweDJjOTIsIDB4YzI4ZCwgMHg3MmQ2LCAweDcyYzAsIDB4YTIwMCwgMHhhMDE1LCAweDcxNTQsCisJMHg4MTA4LCAweGExMmEsIDB4MDA0OCwgMHgyYjc1LCAweDcxYzAsIDB4MjE2NCwgMHg2NTA0LCAweDg1ZmYsCisJMHgwMGMwLCAweDJiOGMsIDB4NzE1NiwgMHg4NDIxLCAweDAwYzAsIDB4MmI3MCwgMHg3MGQ0LCAweGQwOGMsCisJMHgwMDQwLCAweDJiODgsIDB4NzBkMCwgMHhhMDA1LCAweDAwYzAsIDB4MmI4OCwgMHg3MGQzLCAweDAwMGEsCisJMHgwMDdjLCAweDIyMDAsIDB4MDA3OCwgMHgyYjdhLCAweDcwZDQsIDB4YzA4YywgMHg3MGQ2LCAweDcwZDMsCisJMHgwMDAwLCAweDYwMzQsIDB4YTAwNSwgMHgwMGMwLCAweDJiODksIDB4NjcwOCwgMHhhNzg0LCAweDA3M2YsCisJMHgwMDQwLCAweDJiYmIsIDB4ZDdkNCwgMHgwMGMwLCAweDJiODksIDB4YTc4NCwgMHgwMDIxLCAweDAwYzAsCisJMHgyYjg5LCAweGE3ODQsIDB4MDAwMiwgMHgwMDQwLCAweDJiYWMsIDB4YTc4NCwgMHgwMDA0LCAweDAwNDAsCisJMHgyYjg5LCAweGE3YmMsIDB4ZmZmYiwgMHg2NzBhLCAweGE3ODQsIDB4MDIxOCwgMHgwMGMwLCAweDJiODksCisJMHhhNzg0LCAweDAxMDAsIDB4MDA0MCwgMHgyYmJiLCAweDYwMTgsIDB4YTAwNSwgMHgwMGMwLCAweDJiODksCisJMHhhN2JjLCAweGZlZmYsIDB4NjcwYSwgMHgyNTY4LCAweDY4MjMsIDB4MDAwMCwgMHg2ZTFjLCAweGE2ODQsCisJMHgwMDBlLCAweDYzMTgsIDB4MDA0MCwgMHgyYmNjLCAweDYwMWMsIDB4YTMwMiwgMHgwMDQ4LCAweDJiY2YsCisJMHgwMDQwLCAweDJiY2YsIDB4MDA3OCwgMHgyYjg5LCAweDgzZmYsIDB4MDBjMCwgMHgyYjg5LCAweDJkNTgsCisJMHgyYzUwLCAweDcxNTYsIDB4ZDdiYywgMHgwMGMwLCAweDJiZDgsIDB4NzAyOCwgMHg2MDIyLCAweDYwM2EsCisJMHhjN2JjLCAweDY3MGEsIDB4NjhjMCwgMHhhMDY1LCAweGEwNGQsIDB4NjEwMCwgMHgyYTYwLCAweDIwNDEsCisJMHgwMDAxLCAweDZiMTQsIDB4YTM5YywgMHgwMDFmLCAweGEzOWQsIDB4MDBjMCwgMHhkMWZjLCAweDAwNDAsCisJMHgyYmVjLCAweGQ2ODQsIDB4MDA0MCwgMHgyYmVlLCAweGEzOWMsIDB4ZmZiZiwgMHhkNmE0LCAweDAwNDAsCisJMHgyYmYzLCAweGEzOWQsIDB4MDAyMCwgMHhhNjg0LCAweDAwMGUsIDB4MDBjMCwgMHgyYzNlLCAweGM3YTUsCisJMHg2NzBhLCAweDJjMDAsIDB4NjhjNiwgMHg3N2E0LCAweGE3ODYsIDB4MDAwMSwgMHgwMGMwLCAweDJjMTIsCisJMHg3MGQ0LCAweGQwYjQsIDB4MDBjMCwgMHgyYzEyLCAweDcwMDAsIDB4YTA4MiwgMHgwMDAyLCAweDAwYzgsCisJMHgyYzEyLCAweDc4MzAsIDB4ZDBiYywgMHgwMGMwLCAweDJjMTIsIDB4Nzg5YiwgMHgwMDEwLCAweDdiYWEsCisJMHgwMDc4LCAweDJjOGEsIDB4ODczOSwgMHg3N2E2LCAweDI3NTAsIDB4NzdiMCwgMHhhN2IwLCAweDAwMDUsCisJMHg3MGFjLCAweGE2MDYsIDB4MDBjMCwgMHgyYzFkLCAweDc2YTgsIDB4NzZiMiwgMHgyYzNhLCAweDg3MzgsCisJMHgyZDNhLCAweDg3MzgsIDB4MjgzYSwgMHg4NzM4LCAweDIzM2EsIDB4ODczOCwgMHgyNTNhLCAweDc4MzAsCisJMHhkMGJjLCAweDAwNDAsIDB4MmMzNSwgMHgyMDkxLCAweDgwMDAsIDB4MjA5MSwgMHgzMDNkLCAweDcwZDQsCisJMHhhMDg0LCAweDMwM2QsIDB4MjA5MSwgMHg4MDAwLCAweDIwOTAsIDB4YWFkNSwgMHgwMDAwLCAweDAwNDAsCisJMHgyYzNkLCAweDg0MjEsIDB4MjIwMCwgMHgwMGMwLCAweDJiNmYsIDB4MDA3YywgMHhkMWRjLCAweDAwNDAsCisJMHgzZTAwLCAweDIwMjksIDB4MDAyMCwgMHhkNjljLCAweDAwYzAsIDB4MmM0YiwgMHg4NTI4LCAweGQ2OGMsCisJMHgwMGMwLCAweDJjNGIsIDB4ODUyOCwgMHg4ODQwLCAweDZmMTQsIDB4NjEwYywgMHg4MTA4LCAweGExOGMsCisJMHgwMGZmLCAweDcwY2MsIDB4YTE2MCwgMHgyYzY0LCAweDhjZmYsIDB4MDA0MCwgMHgyYzZhLCAweDYwMTQsCisJMHhhNzA2LCAweDAwYzAsIDB4MmM1MywgMHg2MGI4LCAweDgwMDEsIDB4NjBiYSwgMHgwMGMwLCAweDJjNGUsCisJMHgyYTYwLCAweDYwMDgsIDB4YTA4NSwgMHgwMTAwLCAweDYwMGEsIDB4MjIwMCwgMHg4NDIxLCAweDAwYzAsCisJMHgyYjZmLCAweDAwN2MsIDB4MmE2MCwgMHg2MTBlLCAweDY5YmUsIDB4MmMwMCwgMHg2OGM2LCAweDg4NDAsCisJMHg2MDA4LCAweGMwZDUsIDB4NjAwYSwgMHg3N2E0LCAweGE3ODYsIDB4MDAwMSwgMHgwMGMwLCAweDJjMTIsCisJMHg3MGQ0LCAweGQwYjQsIDB4MDBjMCwgMHgyYzEyLCAweDcwMDAsIDB4YTA4MiwgMHgwMDAyLCAweDAwYzgsCisJMHgyYzEyLCAweDc4MzAsIDB4ZDBiYywgMHgwMGMwLCAweDJjMTIsIDB4Nzg5YiwgMHgwMDEwLCAweDdiYWEsCisJMHg3ZGFhLCAweDc5YWEsIDB4MjAwMSwgMHgwMDAyLCAweDAwN2UsIDB4NjAxOCwgMHg4MDAwLCAweDYwMWEsCisJMHgwMDc4LCAweDJjOTMsIDB4MDA3ZSwgMHgyOTYwLCAweDYxMDQsIDB4MmE2MCwgMHhhMTg0LCAweDAwMTgsCisJMHgwMDQwLCAweDJjYWYsIDB4YTE4NCwgMHgwMDEwLCAweDAwNDAsIDB4MmNhMiwgMHgxMDc4LCAweDQwMTEsCisJMHgwMGMwLCAweDJjZDQsIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4MmNhZiwgMHg2OWEwLCAweGExODQsCisJMHgwNjAwLCAweDAwYzAsIDB4MmNhZiwgMHgxMDc4LCAweDNlZjUsIDB4MDA3OCwgMHgyY2Q0LCAweDY5YTAsCisJMHhhMTg0LCAweDFlMDAsIDB4MDA0MCwgMHgyY2RmLCAweGExODQsIDB4MDgwMCwgMHgwMDQwLCAweDJjYzgsCisJMHgwYzdlLCAweDI5NjAsIDB4NjAwMCwgMHhhMDg1LCAweDIwMDAsIDB4NjAwMiwgMHg2MTA0LCAweGExOGQsCisJMHgwMDEwLCAweDYxMDYsIDB4MGM3ZiwgMHgxMDc4LCAweDQwMTEsIDB4MDBjMCwgMHgyY2Q0LCAweDY5YTAsCisJMHhhMTg0LCAweDAyMDAsIDB4MDA0MCwgMHgyY2QwLCAweDEwNzgsIDB4M2Y1NCwgMHgwMDc4LCAweDJjZDQsCisJMHhhMTg0LCAweDA0MDAsIDB4MDBjMCwgMHgyY2FiLCAweDY5YTAsIDB4YTE4NCwgMHgxMDAwLCAweDAwNDAsCisJMHgyY2RmLCAweDY5MTQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MTA3OCwgMHgyNzlmLCAweDAyN2YsCisJMHhhNjhjLCAweDAwZTAsIDB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MmNlYywgMHhhMDg2LCAweDAwNjAsCisJMHgwMGMwLCAweDJjZWMsIDB4YTE4ZCwgMHg0MDAwLCAweGExOGQsIDB4MDEwNCwgMHg2OWI2LCAweDc4OWIsCisJMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg2ODE4LCAweGMwZmQsIDB4NjgxYSwgMHhkNmJjLCAweDAwNDAsCisJMHgyZDA3LCAweGMwZmMsIDB4NzA4NywgMHgwMDAwLCAweGEwOGEsIDB4MDAwZCwgMHgwMDUwLCAweDJkMDUsCisJMHhhMDhhLCAweDAwMGMsIDB4NzE4NiwgMHgyMDAxLCAweDAwMGMsIDB4ODAwYywgMHg3MThhLCAweDc4YWEsCisJMHgzNTE4LCAweDMzNDAsIDB4MzQyOCwgMHg4MDAwLCAweDgwYWMsIDB4YWY4MCwgMHgwMDJiLCAweDIwYTAsCisJMHg3ODliLCAweDAwMDAsIDB4YWQ4MCwgMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgyM2E4LCAweDI4OTgsCisJMHgyNWEwLCAweGEyODYsIDB4MDAyMCwgMHgwMGMwLCAweDJkM2YsIDB4NzBkNCwgMHhjMGI1LCAweDcwZDYsCisJMHgyYzAwLCAweDcwYmEsIDB4MmQwMCwgMHg3MGJlLCAweDY4MTQsIDB4YzBmYywgMHg4MDA3LCAweDc4ODIsCisJMHhhMjg2LCAweDAwMDIsIDB4MDA0MCwgMHgyZDc1LCAweDcwYTQsIDB4ODAwMCwgMHg3MGE2LCAweDc0YjQsCisJMHhhNDk4LCAweDAwMDUsIDB4NzBhYywgMHhhMzA2LCAweDAwYzAsIDB4MmQzNywgMHg3M2E4LCAweDczYjYsCisJMHhhMjg2LCAweDAwMTAsIDB4MDA0MCwgMHgyOWMxLCAweDBkN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDcwMDAsCisJMHhhMDA1LCAweDAwYzAsIDB4MmQxZCwgMHhhMjg2LCAweDAwMDIsIDB4MDBjMCwgMHgyZDhmLCAweDEwNzgsCisJMHg0MzYwLCAweDAwYzAsIDB4MmQxZCwgMHg2ODE0LCAweGMwZmMsIDB4ODAwNywgMHg3ODgyLCAweDIwOTEsCisJMHg4MDAwLCAweDc4MWIsIDB4MDA1YiwgMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsCisJMHg2ODk4LCAweDc4ZDIsIDB4NzhkYSwgMHgyMDkxLCAweDgwMDEsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsCisJMHgxMjdlLCAweDBkN2UsIDB4MGM3ZSwgMHg3MGQ0LCAweGEwODQsIDB4MjcwMCwgMHgyMDkwLCAweDBjN2YsCisJMHgwZDdmLCAweDEyN2YsIDB4MjkwMCwgMHg3MDVhLCAweDY4YmMsIDB4NzA0MiwgMHg3MDAzLCAweDAwMDIsCisJMHgyZDAwLCAweDcwNGUsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDYsIDB4NzgzMCwgMHhkMGJjLCAweDAwNDAsCisJMHgyZDgxLCAweDIwOTEsIDB4MzAzZCwgMHg3MGQ0LCAweGEwODQsIDB4MzAzZCwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDkwLCAweDcwYTQsIDB4YTAwNSwgMHgwMGMwLCAweDJkODYsIDB4MDA3YywgMHg4NDIxLCAweDAwNDAsCisJMHgyZDg1LCAweDcyNTAsIDB4NzBjMCwgMHhhMjAwLCAweGEwMTUsIDB4MDA3OCwgMHgyYjZmLCAweGEyODYsCisJMHgwMDEwLCAweDAwYzAsIDB4MmRjMCwgMHgxMDc4LCAweDQzNjAsIDB4MDBjMCwgMHgyZDFkLCAweDY4MTQsCisJMHhjMGZjLCAweDgwMDcsIDB4Nzg4MiwgMHg3ODFiLCAweDAwNWIsIDB4NjhiNCwgMHg3ODVhLCAweDY4OTQsCisJMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsIDB4NzgwOCwgMHhjMDhkLCAweDc4MGEsCisJMHg3MGE0LCAweDgwMDAsIDB4NzBhNiwgMHg3NGI0LCAweGE0OTAsIDB4MDAwNSwgMHg3MGFjLCAweGEyMDYsCisJMHgwMGMwLCAweDJkYjMsIDB4NzJhOCwgMHg3MmI2LCAweDI5MDAsIDB4NzA1YSwgMHg2OGJjLCAweDcwNDIsCisJMHg3MDAzLCAweDAwMDIsIDB4MmQwMCwgMHg3MDRlLCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LCAweDAwN2MsCisJMHg2YmI0LCAweGEzOWQsIDB4MjAwMCwgMHg3YjVhLCAweDY4MTQsIDB4YzBmYywgMHg4MDA3LCAweDc4ODIsCisJMHg2Yjk0LCAweDdiZDYsIDB4N2JkZSwgMHg2ZTk4LCAweDdlZDIsIDB4N2VkYSwgMHg3ODFiLCAweDAwNWIsCisJMHgyOTAwLCAweDcwNWEsIDB4NzIwMiwgMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHgyMzAwLCAweGE2MDUsCisJMHgwMDQwLCAweDJkZWIsIDB4NzBkNCwgMHhhMDg0LCAweDI3MDAsIDB4YTA4NiwgMHgyMzAwLCAweDAwYzAsCisJMHgyZGU1LCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDJkZTcsIDB4MjAwOSwgMHgwMDAxLCAweGEyODQsCisJMHgwMDBmLCAweDEwNzksIDB4MmRlZiwgMHhhZDgwLCAweDAwMDksIDB4NzA0NiwgMHgwMDdjLCAweDJkZjcsCisJMHg0OGJkLCAweDQ4YmQsIDB4NDhhYSwgMHg0OGJkLCAweDJkZjcsIDB4MmRmNywgMHgyZGY3LCAweDEwNzgsCisJMHgyOTZiLCAweDc4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDc4MGEsIDB4MTA3OCwgMHgyOTVlLCAweDBmN2UsCisJMHgyMDc5LCAweDRlMDAsIDB4NzhhYywgMHgwZjdmLCAweGQwODQsIDB4MDA0MCwgMHgyZTIxLCAweDcwNjQsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyZTBmLCAweDcwNjYsIDB4MDA3OCwgMHgyZWY4LCAweDcwNjQsCisJMHhhMDg2LCAweDAwMDUsIDB4MDBjMCwgMHgyZTFmLCAweDcwN2MsIDB4MjA2OCwgMHg2ODFiLCAweDAwMDQsCisJMHg2ODE3LCAweDAwMDAsIDB4NjgyMCwgMHhhMDg0LCAweDAwZmYsIDB4YzA5ZCwgMHg2ODIyLCAweDcwNjcsCisJMHgwMDAwLCAweDcwYTcsIDB4MDAwMCwgMHg3MGE4LCAweDcwYjIsIDB4NzBiNiwgMHgxMDc4LCAweDJhYmEsCisJMHgxNTdlLCAweDIwMTEsIDB4MDAwNCwgMHg3MTY0LCAweGExODYsIDB4MDAwMSwgMHgwMDQwLCAweDJlNDEsCisJMHhhMTg2LCAweDAwMDcsIDB4MDBjMCwgMHgyZTM4LCAweDcwMWYsIDB4MDAwNSwgMHgwMDc4LCAweDJlNDEsCisJMHg3MDFmLCAweDAwMDEsIDB4NzA2NywgMHgwMDAwLCAweDcwZDQsIDB4YzBkZCwgMHg3MGQ2LCAweDAwNzgsCisJMHgyZTQzLCAweDcwNjcsIDB4MDAwMCwgMHgyMDAxLCAweDRlMGEsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMTgsIDB4MDA0MCwgMHgyZTUzLCAweDcwMTgsIDB4NzAxNiwgMHhhMDA1LCAweDAwYzAsCisJMHgyZTUzLCAweDcwYTcsIDB4MDAwMSwgMHgwNjdlLCAweDEwNzgsIDB4NDU4NiwgMHgyMGE5LCAweDAwMTAsCisJMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg0MGY4LCAweGE3YjgsIDB4MDEwMCwgMHgwMGYwLCAweDJlNWEsCisJMHgwNjdmLCAweDcwMDAsIDB4MDA3OSwgMHgyZTY0LCAweDJlOWUsIDB4MmU3OSwgMHgyZTc5LCAweDJlNmUsCisJMHgyZTllLCAweDJlOWUsIDB4MmU5ZSwgMHgyZTZjLCAweDEwNzgsIDB4Mjk2YiwgMHg3MDYwLCAweGEwMDUsCisJMHgwMDQwLCAweDJlOWUsIDB4YWQwNiwgMHgwMGMwLCAweDJlNzksIDB4NjgwMCwgMHg3MDYyLCAweDAwNzgsCisJMHgyZThiLCAweDY4MjAsIDB4ZDA4NCwgMHgwMGMwLCAweDJlODcsIDB4NmYxNCwgMHgxMDc4LCAweDQxZmUsCisJMHg2MDA4LCAweGMwZDQsIDB4NjAwYSwgMHgxMDc4LCAweDNkZDAsIDB4MDA3OCwgMHgyZThiLCAweDcwNWMsCisJMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHhhNjg0LCAweDVmMDAsIDB4NjgxZSwgMHg2ODE4LCAweGQwZmMsCisJMHgwMDQwLCAweDJlOTMsIDB4NmExYSwgMHg2ODE3LCAweDAwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDY4MjAsCisJMHhhMDg0LCAweDAwZmYsIDB4YzA5ZCwgMHg2ODIyLCAweDEwNzgsIDB4MjAyYywgMHhiMjg0LCAweDA0MDAsCisJMHgwMDQwLCAweDJlYTYsIDB4MjAyMSwgMHg5NWQwLCAweDAwNzgsIDB4MmVhOCwgMHgyMDIxLCAweDk0YzAsCisJMHgxMDc4LCAweDJlZmQsIDB4YjI4NCwgMHgwNDAwLCAweDAwNDAsIDB4MmViMiwgMHgyMDIxLCAweDRlOTgsCisJMHgwMDc4LCAweDJlYjQsIDB4MjAyMSwgMHg0ZTU4LCAweDEwNzgsIDB4MmVmZCwgMHgyMGE5LCAweDAxMDEsCisJMHhiMjg0LCAweDA0MDAsIDB4MDA0MCwgMHgyZWMwLCAweDIwMjEsIDB4OTRkMCwgMHgwMDc4LCAweDJlYzIsCisJMHgyMDIxLCAweDkzYzAsIDB4MTA3OCwgMHgyZWZkLCAweDg0MjAsIDB4MDBmMCwgMHgyZWMyLCAweGIyODQsCisJMHgwMzAwLCAweDAwNDAsIDB4MmVjZiwgMHgyMDYxLCAweDUzYzAsIDB4MDA3OCwgMHgyZWQxLCAweDIwNjEsCisJMHg3M2MwLCAweDIwMjEsIDB4MDAwMiwgMHgyMGE5LCAweDAxMDAsIDB4NjExMCwgMHg4MWZmLCAweDAwNDAsCisJMHgyZWVlLCAweDYwMTgsIDB4MDE3ZSwgMHgwMDdlLCAweDIwMTEsIDB4NGUwMiwgMHgyMjBjLCAweGExMDIsCisJMHgyMDEyLCAweDAwN2YsIDB4MDE3ZiwgMHhhMTAyLCAweDAwNTAsIDB4MmVlZSwgMHg2MDEyLCAweDAwYzAsCisJMHgyZWVlLCAweDIwMTEsIDB4NGUwNCwgMHgyMjA0LCAweGMwYTUsIDB4MjAxMiwgMHg2MDFiLCAweDAwMDAsCisJMHhhY2UwLCAweDAwMTAsIDB4MDBmMCwgMHgyZWQ1LCAweDg0MjEsIDB4MDBjMCwgMHgyZWQzLCAweDE1N2YsCisJMHg3MDAzLCAweDAwMDAsIDB4NzA0ZiwgMHgwMDAwLCAweDAwN2MsIDB4MDQ3ZSwgMHgyNDA0LCAweGEwMDUsCisJMHgwMDQwLCAweDJmMTgsIDB4MjA2OCwgMHg2ODAwLCAweDAwN2UsIDB4NmExYSwgMHg2ODE3LCAweDAwMDAsCisJMHg2ODJiLCAweDAwMDAsIDB4NjhiNCwgMHhhMDg0LCAweDVmMDAsIDB4NjgxZSwgMHg2ODIwLCAweGEwODQsCisJMHgwMGZmLCAweGMwOWQsIDB4NjgyMiwgMHgxMDc4LCAweDIwMmMsIDB4MDA3ZiwgMHgwMDc4LCAweDJlZmYsCisJMHgwNDdmLCAweDIwMjMsIDB4MDAwMCwgMHgwMDdjLCAweGEyODIsIDB4MDAwMywgMHgwMDUwLCAweDJmMjIsCisJMHgxMDc4LCAweDI5NmIsIDB4MjMwMCwgMHgwMDc5LCAweDJmMjUsIDB4MmYyOCwgMHgyZmIzLCAweDJmZDAsCisJMHhhMjgyLCAweDAwMDIsIDB4MDA0MCwgMHgyZjJlLCAweDEwNzgsIDB4Mjk2YiwgMHg3MDY0LCAweDcwNjcsCisJMHgwMDAwLCAweDcwODMsIDB4MDAwMCwgMHgwMDc5LCAweDJmMzUsIDB4MmYzZCwgMHgyZjNkLCAweDJmM2YsCisJMHgyZjdmLCAweDNlMGMsIDB4MmYzZCwgMHgyZjdmLCAweDJmM2QsIDB4MTA3OCwgMHgyOTZiLCAweDc3NzQsCisJMHgxMDc4LCAweDQwZjgsIDB4Nzc3NCwgMHhhN2JjLCAweDhmMDAsIDB4MTA3OCwgMHg0MWZlLCAweDYwMTgsCisJMHhhMDA1LCAweDAwNDAsIDB4MmY3NiwgMHhkN2ZjLCAweDAwYzAsIDB4MmY1MiwgMHgyMDIxLCAweDk0YzAsCisJMHgwMDc4LCAweDJmNTQsIDB4MjAyMSwgMHg5NWQwLCAweDIwMDksIDB4MDAwNSwgMHgyMDExLCAweDAwMTAsCisJMHgxMDc4LCAweDJmZWIsIDB4MDA0MCwgMHgyZjc2LCAweDE1N2UsIDB4MjBhOSwgMHgwMTAxLCAweGQ3ZmMsCisJMHgwMGMwLCAweDJmNjYsIDB4MjAyMSwgMHg5M2MwLCAweDAwNzgsIDB4MmY2OCwgMHgyMDIxLCAweDk0ZDAsCisJMHgwNDdlLCAweDIwMDksIDB4MDAwNSwgMHgyMDExLCAweDAwMTAsIDB4MTA3OCwgMHgyZmViLCAweDA0N2YsCisJMHgwMDQwLCAweDJmNzUsIDB4ODQyMCwgMHgwMGYwLCAweDJmNjgsIDB4MTU3ZiwgMHg4NzM4LCAweGE3ODQsCisJMHgwMDFmLCAweDAwYzAsIDB4MmY0NSwgMHgwMDc4LCAweDI5YzUsIDB4MDA3OCwgMHgyOWM1LCAweDc3NzQsCisJMHgxMDc4LCAweDQxZmUsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsIDB4MmZiMSwgMHhkN2ZjLCAweDAwYzAsCisJMHgyZjhkLCAweDIwMjEsIDB4OTRjMCwgMHgwMDc4LCAweDJmOGYsIDB4MjAyMSwgMHg5NWQwLCAweDIwMDksCisJMHgwMDA1LCAweDIwMTEsIDB4MDAyMCwgMHgxMDc4LCAweDJmZWIsIDB4MDA0MCwgMHgyZmIxLCAweDE1N2UsCisJMHgyMGE5LCAweDAxMDEsIDB4ZDdmYywgMHgwMGMwLCAweDJmYTEsIDB4MjAyMSwgMHg5M2MwLCAweDAwNzgsCisJMHgyZmEzLCAweDIwMjEsIDB4OTRkMCwgMHgwNDdlLCAweDIwMDksIDB4MDAwNSwgMHgyMDExLCAweDAwMjAsCisJMHgxMDc4LCAweDJmZWIsIDB4MDQ3ZiwgMHgwMDQwLCAweDJmYjAsIDB4ODQyMCwgMHgwMGYwLCAweDJmYTMsCisJMHgxNTdmLCAweDAwNzgsIDB4MjljNSwgMHgyMjAwLCAweDAwNzksIDB4MmZiNiwgMHgyZmI5LCAweDJmYmIsCisJMHgyZmJiLCAweDEwNzgsIDB4Mjk2YiwgMHgyMDA5LCAweDAwMTIsIDB4NzA2NCwgMHhhMDg2LCAweDAwMDIsCisJMHgwMDQwLCAweDJmYzQsIDB4MjAwOSwgMHgwMDBlLCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLCAweDJmYzksCisJMHg2OTFhLCAweDcwNjcsIDB4MDAwMCwgMHg3MGQ0LCAweGMwZGQsIDB4NzBkNiwgMHgwMDc4LCAweDQzMGQsCisJMHgyMjAwLCAweDAwNzksIDB4MmZkMywgMHgyZmQ4LCAweDJmYmIsIDB4MmZkNiwgMHgxMDc4LCAweDI5NmIsCisJMHgxMDc4LCAweDQ1ODYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgzZDdlLCAweDEwNzgsCisJMHgzZGVkLCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsIDB4MTA3OCwgMHgzZDZmLCAweDAwNDAsCisJMHgzZDdlLCAweDAwNzgsIDB4MjljNSwgMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgzMDI0LCAweDIwNjgsCisJMHgyZDA0LCAweDAwN2UsIDB4NjgxNCwgMHhhNzA2LCAweDAwNDAsIDB4MmZmYSwgMHgyZDIwLCAweDAwN2YsCisJMHgwMDc4LCAweDJmZWMsIDB4MDA3ZiwgMHgyMDIyLCAweDY5MWEsIDB4NjgxNywgMHgwMDAwLCAweDY4MmIsCisJMHgwMDAwLCAweDY4YjQsIDB4YTA4NCwgMHg1ZjAwLCAweDY4MWUsIDB4NjgyMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMjA1LCAweDY4MjIsIDB4MTA3OCwgMHgyMDJjLCAweDIwMjEsIDB4NGUwMiwgMHgyNDFjLCAweDgzMTksCisJMHgyMzIyLCAweDYwMTAsIDB4ODAwMSwgMHg2MDEyLCAweDAwYzAsIDB4MzAxYiwgMHgyMDIxLCAweDRlMDQsCisJMHgyNDA0LCAweGMwYTUsIDB4MjAyMiwgMHg2MDA4LCAweGEwODQsIDB4ZjllZiwgMHg2MDBhLCAweDEwNzgsCisJMHgyYWRiLCAweDEwNzgsIDB4M2RlZCwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDMwMjMsCisJMHgyMzAwLCAweDAwNzksIDB4MzAyYiwgMHgzMDMwLCAweDMwMmUsIDB4MzBiMCwgMHgxMDc4LCAweDI5NmIsCisJMHg3OGU0LCAweGEwMDUsIDB4MDBkMCwgMHgzMDY2LCAweDMyMDgsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsCisJMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLCAweDMwNDEsIDB4YTE4YywgMHgwMzAwLCAweDAwNzgsCisJMHgzMDQzLCAweGExOGMsIDB4MDQwMCwgMHgwMDQwLCAweDMwNDksIDB4MDAxOCwgMHgyOWMxLCAweDAwNzgsCisJMHgzMDRiLCAweDAwMjgsIDB4MjljMSwgMHgyMDA4LCAweGEwODQsIDB4MDAzMCwgMHgwMGMwLCAweDMwNTIsCisJMHgwMDc4LCAweDM3NzAsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgzMDUwLCAweDIxMDAsCisJMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgzMDVjLCAweDMwOTAsIDB4MzA5YSwgMHgzMDg1LCAweDMwNjQsCisJMHg0MzU1LCAweDQzNTUsIDB4MzA2NCwgMHgzMGE1LCAweDEwNzgsIDB4Mjk2YiwgMHg3MDAwLCAweGEwODYsCisJMHgwMDA0LCAweDAwYzAsIDB4MzA4MCwgMHg3MDY0LCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDMwNzYsCisJMHgyMDExLCAweDAwMDIsIDB4MjAxOSwgMHgwMDAwLCAweDAwNzgsIDB4MmYxYywgMHg3MDY0LCAweGEwODYsCisJMHgwMDA2LCAweDAwNDAsIDB4MzA3MCwgMHg3MDY0LCAweGEwODYsIDB4MDAwNCwgMHgwMDQwLCAweDMwNzAsCisJMHg3OWU0LCAweDIwMDEsIDB4MDAwMywgMHgwMDc4LCAweDMzZmEsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsCisJMHgzMDhiLCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LCAweDQwYzgsIDB4NzgxYiwgMHgwMDY0LCAweDAwN2MsCisJMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzMDk2LCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LCAweDQwYzgsCisJMHgwMDc4LCAweDQzMzEsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsIDB4MzBhMCwgMHg2ODFiLCAweDAwMWQsCisJMHgxMDc4LCAweDQwYzgsIDB4NzgxYiwgMHgwMGY4LCAweDAwN2MsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsCisJMHgzMGFiLCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LCAweDQwYzgsIDB4NzgxYiwgMHgwMGM4LCAweDAwN2MsCisJMHhhNTg0LCAweDAwMGYsIDB4MDBjMCwgMHgzMGNmLCAweDEwNzgsIDB4Mjk1ZSwgMHg3MDAwLCAweDAwNzksCisJMHgzMGI5LCAweDI5YzUsIDB4MzBjMSwgMHgzMGMzLCAweDNkN2UsIDB4M2Q3ZSwgMHgzZDdlLCAweDMwYzEsCisJMHgzMGMxLCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDNkZWQsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsCisJMHg2MDBhLCAweDEwNzgsIDB4M2Q2ZiwgMHgwMDQwLCAweDNkN2UsIDB4MDA3OCwgMHgyOWM1LCAweDc4ZTQsCisJMHhhMDA1LCAweDAwZDAsIDB4MzA2NiwgMHgzMjA4LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsCisJMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgzMGUwLCAweGExOGMsIDB4MDMwMCwgMHgwMDc4LCAweDMwZTIsCisJMHhhMThjLCAweDA0MDAsIDB4MDA0MCwgMHgzMGU4LCAweDAwMTgsIDB4MzA2NiwgMHgwMDc4LCAweDMwZWEsCisJMHgwMDI4LCAweDMwNjYsIDB4MjAwOCwgMHhhMDg0LCAweDAwMzAsIDB4MDBjMCwgMHgzMGYyLCAweDc4MWIsCisJMHgwMDViLCAweDAwN2MsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgzMGVmLCAweDIxMDAsCisJMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgzMGZjLCAweDMxMGIsIDB4MzEwZiwgMHgzMTA2LCAweDMxMDQsCisJMHg0MzU1LCAweDQzNTUsIDB4MzEwNCwgMHg0MzRmLCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDQwZDAsCisJMHg3ODFiLCAweDAwNjQsIDB4MDA3YywgMHgxMDc4LCAweDQwZDAsIDB4MDA3OCwgMHg0MzMxLCAweDEwNzgsCisJMHg0MGQwLCAweDc4MWIsIDB4MDBmOCwgMHgwMDdjLCAweDEwNzgsIDB4NDBkMCwgMHg3ODFiLCAweDAwYzgsCisJMHgwMDdjLCAweDIzMDAsIDB4MDA3OSwgMHgzMTFjLCAweDMxMjEsIDB4MzExZiwgMHgzMTIzLCAweDEwNzgsCisJMHgyOTZiLCAweDAwNzgsIDB4Mzk1ZiwgMHg2ODFiLCAweDAwMTYsIDB4NzhhMywgMHgwMDAwLCAweDc5ZTQsCisJMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgzOTVmLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsCisJMHgzOTVmLCAweGExODQsIDB4MDEwMCwgMHgwMDQwLCAweDMxMjcsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksCisJMHgzMTM5LCAweDMxNDEsIDB4MzEwZiwgMHgzMDg1LCAweDQzMGQsIDB4NDM1NSwgMHg0MzU1LCAweDQzMGQsCisJMHg0MzRmLCAweDEwNzgsIDB4NDMxOSwgMHgwMDdjLCAweGEyODIsIDB4MDAwNSwgMHgwMDUwLCAweDMxNGEsCisJMHgxMDc4LCAweDI5NmIsIDB4MjMwMCwgMHgwMDc5LCAweDMxNGQsIDB4MzE1MCwgMHgzMzgwLCAweDMzOGIsCisJMHgyMjAwLCAweDAwNzksIDB4MzE1MywgMHgzMTZkLCAweDMxNWEsIDB4MzE2ZCwgMHgzMTU4LCAweDMzNjMsCisJMHgxMDc4LCAweDI5NmIsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLCAweGEwODIsCisJMHgwMDIwLCAweDAwNDgsIDB4NDBiNywgMHhhMDhhLCAweDAwMDQsIDB4MDBjOCwgMHg0MGI3LCAweDAwNzksCisJMHgzMTY5LCAweDQwYjcsIDB4NDBiNywgMHg0MGI3LCAweDQwNjEsIDB4Nzg5YiwgMHgwMDE4LCAweDc5YTgsCisJMHhhMTg0LCAweDAwODAsIDB4MDA0MCwgMHgzMTdlLCAweDAwNzgsIDB4NDBiNywgMHg3MDAwLCAweGEwMDUsCisJMHgwMGMwLCAweDMxNzQsIDB4MjAxMSwgMHgwMDA0LCAweDAwNzgsIDB4M2I0YSwgMHhhMTg0LCAweDAwZmYsCisJMHhhMDhhLCAweDAwMTAsIDB4MDBjOCwgMHg0MGI3LCAweDAwNzksIDB4MzE4NiwgMHgzMTk4LCAweDMxOTYsCisJMHgzMWFkLCAweDMxYjEsIDB4MzI4NCwgMHg0MGI3LCAweDQwYjcsIDB4MzI4NiwgMHg0MGI3LCAweDQwYjcsCisJMHgzMzVmLCAweDMzNWYsIDB4NDBiNywgMHg0MGI3LCAweDQwYjcsIDB4MzM2MSwgMHgxMDc4LCAweDI5NmIsCisJMHhkNmU0LCAweDAwNDAsIDB4MzFhMywgMHgyMDAxLCAweDAzMDAsIDB4ODAwMCwgMHg4MDAwLCAweDc4M2EsCisJMHg3ODFiLCAweDAwYzMsIDB4MDA3YywgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzMWFiLCAweDY4MWIsCisJMHgwMDFkLCAweDAwNzgsIDB4MzE5YiwgMHgwMDc4LCAweDQzMGQsIDB4NjgxYiwgMHgwMDFkLCAweDAwNzgsCisJMHg0MGMxLCAweDY5MjAsIDB4NjkyMiwgMHhhNjg0LCAweDE4MDAsIDB4MDBjMCwgMHgzMjE2LCAweDY4MjAsCisJMHhkMDg0LCAweDAwYzAsIDB4MzIxYywgMHg2ODE4LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDMxYzIsCisJMHg2ODFiLCAweDAwMDAsIDB4ZDZkNCwgMHgwMDQwLCAweDMyODEsIDB4ZDZiYywgMHgwMDQwLCAweDMyMDIsCisJMHg3MDg3LCAweDAwMDAsIDB4NjgxOCwgMHhhMDg0LCAweDAwM2YsIDB4YTA4YSwgMHgwMDBkLCAweDAwNTAsCisJMHgzMjAyLCAweGEwOGEsIDB4MDAwYywgMHg3MTg2LCAweDIwMDEsIDB4MDAwYywgMHg4MDBjLCAweDcxOGEsCisJMHg3ODliLCAweDAwNjEsIDB4NzhhYSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgwMTdlLCAweDMyMDgsCisJMHhhMThjLCAweDAzMDAsIDB4MDA0MCwgMHgzMWY0LCAweDAwN2UsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsCisJMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgzMWYwLCAweDIwYTEsIDB4MDEyYiwgMHgwMDc4LCAweDMxZjYsCisJMHgyMGExLCAweDAyMmIsIDB4MDA3OCwgMHgzMWY2LCAweDIwYTEsIDB4MDEyYiwgMHgwMTdmLCAweDc4OWIsCisJMHgwMDAwLCAweDgwMDAsIDB4ODBhYywgMHhhZDgwLCAweDAwMGIsIDB4MjA5OCwgMHg1M2E2LCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4NjAzOCwgMHhhMDA1LCAweDAwYzAsIDB4MzIxMSwgMHg2ODFjLCAweGEwODQsCisJMHgwMDBlLCAweDAwNDAsIDB4NDBjMSwgMHgxMDc4LCAweDQwZDcsIDB4NzgyYiwgMHgzMDA4LCAweDAwNzgsCisJMHgzMjEzLCAweDgwMDEsIDB4NjAzYSwgMHg3ODFiLCAweDAwNjcsIDB4MDA3YywgMHhkNmU0LCAweDAwNDAsCisJMHgzMjFjLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDMyN2UsCisJMHhkNmRjLCAweDAwNDAsIDB4MzI3ZSwgMHhkNmZjLCAweDAwYzAsIDB4MzIyOCwgMHgwMDc4LCAweDMyM2YsCisJMHhjNmZjLCAweDdlNWEsIDB4NmViNiwgMHg3YWRjLCAweDc5ZDgsIDB4NzhkMCwgMHg4MDFiLCAweDAwYzgsCisJMHgzMjMyLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDZiOTgsCisJMHgyMTAwLCAweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLCAweGQ2ZjQsCisJMHgwMDQwLCAweDMyNDUsIDB4YzZmNCwgMHg3ZTVhLCAweDZlYjYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDMyNTMsIDB4MDA3ZSwgMHgxMDc4LCAweDQ1ODYsIDB4MTA3OCwgMHg0OGJkLCAweDAwN2YsCisJMHg3ODFiLCAweDAwNzYsIDB4MDA3YywgMHhhMDA2LCAweDEwNzgsIDB4NDljMywgMHg2YWIwLCAweDY5YWMsCisJMHg2Yzk4LCAweDZiOTQsIDB4MjIwMCwgMHhhMTA1LCAweDAwNDAsIDB4MzI2MiwgMHgyMjAwLCAweGE0MjIsCisJMHgyMTAwLCAweGEzMWIsIDB4NmNhYSwgMHg3Y2QyLCAweDdjZGEsIDB4NmJhNiwgMHg3YmQ2LCAweDdiZGUsCisJMHgyMzAwLCAweGE0MDUsIDB4MDBjMCwgMHgzMjcyLCAweGM2ZjUsIDB4N2U1YSwgMHg2ZWI2LCAweDc4MWIsCisJMHgwMDc2LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc2LCAweDIyMDAsIDB4YTExNSwgMHgwMGMwLCAweDMyN2IsCisJMHgxMDc4LCAweDQ4YmQsIDB4MDA3YywgMHgxMDc4LCAweDQ4ZjUsIDB4MDA3YywgMHg3ODFiLCAweDAwNzksCisJMHgwMDdjLCAweDc4MWIsIDB4MDA2NywgMHgwMDdjLCAweDEwNzgsIDB4Mjk2YiwgMHgwMDc4LCAweDMyZDIsCisJMHg2OTIwLCAweGQxYzQsIDB4MDA0MCwgMHgzMjliLCAweGMxYzQsIDB4NjkyMiwgMHgwYzdlLCAweDcwNTgsCisJMHgyMDYwLCAweDYwMDAsIDB4YzBlNCwgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LCAweDYwMDYsCisJMHgwYzdmLCAweDAwNzgsIDB4MzJjNiwgMHhkMWNjLCAweDAwNDAsIDB4MzJjNiwgMHhjMWNjLCAweDY5MjIsCisJMHgwYzdlLCAweDcwNTgsIDB4MjA2MCwgMHg2MDAwLCAweGMwZWMsIDB4NjAwMiwgMHg2MDA0LCAweGMwYTQsCisJMHg2MDA2LCAweDIwMDgsIDB4MmM0OCwgMHgwYzdmLCAweGQxOWMsIDB4MDA0MCwgMHgzMmM2LCAweDEwNzgsCisJMHg0MWZhLCAweDEwNzgsIDB4M2VmNSwgMHg4OGZmLCAweDAwNDAsIDB4MzJjNiwgMHg3ODliLCAweDAwNjAsCisJMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhjNjk1LCAweDdlNWEsIDB4ZDZkNCwgMHgwMGMwLCAweDMyYzMsCisJMHg3ODFiLCAweDAwNjQsIDB4MDA3YywgMHg3ODFiLCAweDAwNzgsIDB4MDA3YywgMHg3ZTU4LCAweGQ2ZDQsCisJMHgwMGMwLCAweDMyY2QsIDB4NzgxYiwgMHgwMDY3LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc5LCAweDAwN2MsCisJMHgwMDc4LCAweDQwYmMsIDB4MjAxOSwgMHgwMDAwLCAweDc5OTAsIDB4YTE4YywgMHgwMDA3LCAweDAwYzAsCisJMHgzMmUwLCAweDY4MjAsIDB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4MzJkMCwgMHgyMDA5LCAweDAwMDgsCisJMHg3ODliLCAweDAwMTAsIDB4NzhhOCwgMHhhMDk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgzMmZjLCAweDIzMDAsIDB4N2NhOCwgMHhhNDAwLCAweDIwMTgsIDB4YTEwMiwgMHgwMDQwLCAweDMyZjQsCisJMHgwMDQ4LCAweDMyZjQsIDB4MDA3OCwgMHgzMmY2LCAweDAwNzgsIDB4MzI4OCwgMHgyNGE4LCAweDdhYTgsCisJMHgwMGYwLCAweDMyZjYsIDB4MDA3OCwgMHgzMmUyLCAweGEyODQsIDB4MDBmMCwgMHhhMDg2LCAweDAwMjAsCisJMHgwMGMwLCAweDMzNTAsIDB4ODMxOCwgMHg4MzE4LCAweDIzMDAsIDB4YTEwMiwgMHgwMDQwLCAweDMzMGMsCisJMHgwMDQ4LCAweDMzMGMsIDB4MDA3OCwgMHgzMzRkLCAweGEyODYsIDB4MDAyMywgMHgwMDQwLCAweDMyZDAsCisJMHg2ODFjLCAweGEwODQsIDB4ZmZmMSwgMHg2ODFlLCAweDdlNTgsIDB4YTY4NCwgMHhmZmYxLCAweGMwYTUsCisJMHgyMDMwLCAweDdlNWEsIDB4NjAwOCwgMHhjMGE1LCAweDYwMGEsIDB4MGM3ZSwgMHg3MDU4LCAweDIwNjAsCisJMHg2MDA0LCAweDIwMDgsIDB4MmM0OCwgMHgwYzdmLCAweGQxYTQsIDB4MDA0MCwgMHgzMzJkLCAweDEwNzgsCisJMHg0MWZhLCAweDEwNzgsIDB4NDAxMSwgMHgwMDc4LCAweDMzM2IsIDB4MGM3ZSwgMHg3MDU4LCAweDIwNjAsCisJMHg2MDA0LCAweDIwMDgsIDB4MmM0OCwgMHgwYzdmLCAweGQxOWMsIDB4MDA0MCwgMHgzMmM2LCAweDEwNzgsCisJMHg0MWZhLCAweDEwNzgsIDB4M2VmNSwgMHg4OGZmLCAweDAwNDAsIDB4MzJjNiwgMHg3ODliLCAweDAwNjAsCisJMHgyODAwLCAweDc4YWEsIDB4YzY5NSwgMHg3ZTVhLCAweGQ2ZDQsIDB4MDBjMCwgMHgzMzRhLCAweDc4MWIsCisJMHgwMDY0LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4N2FhOCwgMHgwMDc4LCAweDMyZTIsCisJMHg4MzE4LCAweDIzMDAsIDB4YTEwMiwgMHgwMDQwLCAweDMzNTksIDB4MDA0OCwgMHgzMzU5LCAweDAwNzgsCisJMHgzMmUyLCAweGEyODQsIDB4MDA4MCwgMHgwMGMwLCAweDQwYzEsIDB4MDA3OCwgMHg0MGJjLCAweDAwNzgsCisJMHg0MGMxLCAweDAwNzgsIDB4NDBiNywgMHg3MDU4LCAweGEwNGQsIDB4Nzg5YiwgMHgwMDE4LCAweDc4YTgsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsIDB4MzM3MCwgMHgxMDc4LCAweDI5NmIsCisJMHg3YWE4LCAweGEyOTQsIDB4MDBmZiwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDQsCisJMHgwMGM4LCAweDQwYjcsIDB4MDA3OSwgMHgzMzdjLCAweDQwYjcsIDB4M2U0NiwgMHg0MGI3LCAweDNmYjksCisJMHhhMjgyLCAweDAwMDAsIDB4MDBjMCwgMHgzMzg2LCAweDEwNzgsIDB4Mjk2YiwgMHgxMDc4LCAweDQwYzgsCisJMHg3ODFiLCAweDAwNzgsIDB4MDA3YywgMHhhMjgyLCAweDAwMDMsIDB4MDBjMCwgMHgzMzkxLCAweDEwNzgsCisJMHgyOTZiLCAweGQ0ZmMsIDB4MDBjMCwgMHgzM2IxLCAweDcwNjQsIDB4YTAwNSwgMHgwMDQwLCAweDMzOWEsCisJMHgxMDc4LCAweDI5NmIsIDB4NmYxNCwgMHg3Nzc2LCAweGE3YmMsIDB4OGYwMCwgMHgxMDc4LCAweDQxZmUsCisJMHg2MDA4LCAweGEwODUsIDB4MDAyMSwgMHg2MDBhLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsCisJMHgzMzllLCAweDEwNzgsIDB4NDBjYywgMHg3MDY3LCAweDAwMDIsIDB4NzAxZiwgMHgwMDA5LCAweDAwNzgsCisJMHgzM2IzLCAweDEwNzgsIDB4NDBkYiwgMHg3ODFiLCAweDAwNzgsIDB4MDA3YywgMHhhMjgyLCAweDAwMDQsCisJMHgwMDUwLCAweDMzYmMsIDB4MTA3OCwgMHgyOTZiLCAweDIzMDAsIDB4MDA3OSwgMHgzM2JmLCAweDMzYzIsCisJMHgzNTgyLCAweDM1YzUsIDB4YTI4NiwgMHgwMDAzLCAweDAwNDAsIDB4MzNmYSwgMHg3MjAwLCAweDdjZDgsCisJMHg3ZGRjLCAweDdmZDAsIDB4NzFkNCwgMHhkMWJjLCAweDAwYzAsIDB4MzNmMiwgMHhkMWI0LCAweDAwNDAsCisJMHgzM2YyLCAweDc4NjgsIDB4YTA4NCwgMHgwMGZmLCAweDAwYzAsIDB4MzNmMiwgMHhhMjgyLCAweDAwMDIsCisJMHgwMGM4LCAweDMzZjIsIDB4MGQ3ZSwgMHg3ODNiLCAweDgzMDAsIDB4NzgxYiwgMHgwMDRjLCAweDcwYmMsCisJMHhhMDZkLCAweDY4YjQsIDB4Nzg1YSwgMHg2ODk0LCAweDc4ZDYsIDB4NzhkZSwgMHg2ODk4LCAweDc4ZDIsCisJMHg3OGRhLCAweGMxYjQsIDB4NzFkNiwgMHg3MDAzLCAweDAwMzAsIDB4MGQ3ZiwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDc4LCAweDMzZmUsIDB4NzgzYiwgMHgxMzAwLCAweDc4MWIsIDB4MDA0YSwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDc4LCAweDMzZmUsIDB4NzIwMCwgMHg3Y2Q4LCAweDdkZGMsIDB4N2ZkMCwgMHg3MDRhLCAweDY4YTAsCisJMHhkMGVjLCAweDAwNDAsIDB4MzQwNiwgMHg2MDA4LCAweGMwOGQsIDB4NjAwYSwgMHhhMjg0LCAweDAwMGYsCisJMHgwMDc5LCAweDM0MGEsIDB4MzU2MiwgMHgzNDE3LCAweDM0MTQsIDB4MzZjOCwgMHgzNzU0LCAweDI5YzUsCisJMHgzNDEyLCAweDM0MTIsIDB4MTA3OCwgMHgyOTZiLCAweDYwMDgsIDB4YzBkNCwgMHg2MDBhLCAweGQ2ZTQsCisJMHgwMDQwLCAweDM0MWYsIDB4NzA0OCwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzNDNmLCAweDEwNzgsCisJMHg0NTg2LCAweDIwMDksIDB4MDAwMCwgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzNDI4LCAweDcwNDgsCisJMHhhMDg2LCAweDAwMTQsIDB4MDA0MCwgMHgzNDM5LCAweDY4MTgsIDB4YTA4NiwgMHgwMDA4LCAweDAwYzAsCisJMHgzNTFhLCAweDc4NTgsIDB4ZDA5YywgMHgwMDQwLCAweDM1MWEsIDB4NjgyMCwgMHhkMGFjLCAweDAwNDAsCisJMHgzNTFhLCAweDY4MWIsIDB4MDAxNCwgMHgyMDA5LCAweDAwMDIsIDB4MDA3OCwgMHgzNDdlLCAweDc4NjgsCisJMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHgzNDdlLCAweGExODYsIDB4MDAwOCwgMHgwMGMwLCAweDM0NTUsCisJMHg2MDA4LCAweGMwYTQsIDB4NjAwYSwgMHgxMDc4LCAweDNkNmYsIDB4MDA0MCwgMHgzNDdlLCAweDEwNzgsCisJMHgzZGVkLCAweDEwNzgsIDB4NDU4NiwgMHgwMDc4LCAweDM0NjYsIDB4YTE4NiwgMHgwMDI4LCAweDAwYzAsCisJMHgzNDdlLCAweDYwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDM0NDgsIDB4ODAwMSwgMHgwMDQwLCAweDM0NDgsCisJMHg4MDAxLCAweDAwNDAsIDB4MzQ0OCwgMHg2MDFlLCAweDAwNzgsIDB4MzQ0OCwgMHg2ODIwLCAweGQwODQsCisJMHgwMDQwLCAweDI5YzUsIDB4YzA4NCwgMHg2ODIyLCAweDEwNzgsIDB4MmFjYywgMHg3MDVjLCAweDBjN2UsCisJMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgwYzdmLCAweDYwMDQsIDB4NjgwMiwgMHhhMDA1LCAweDJkMDAsCisJMHgwMGMwLCAweDM0N2IsIDB4NjAwMiwgMHg2MDA2LCAweDAwNzgsIDB4MjljNSwgMHgwMTdlLCAweDgxZmYsCisJMHgwMGMwLCAweDM0YzgsIDB4NzAwMCwgMHhhMDg2LCAweDAwMzAsIDB4MDA0MCwgMHgzNGM4LCAweDcxZDQsCisJMHhkMWJjLCAweDAwYzAsIDB4MzRjOCwgMHhkMWI0LCAweDAwYzAsIDB4MzRhZiwgMHg3MDYwLCAweGEwMDUsCisJMHgwMGMwLCAweDM0YzgsIDB4NzBhNCwgMHhhMDg2LCAweDAwMDEsIDB4MDA0MCwgMHgzNGM4LCAweDcwMDMsCisJMHgwMDAwLCAweDA0N2UsIDB4MDU3ZSwgMHgwNzdlLCAweDA2N2UsIDB4MGM3ZSwgMHgwZDdlLCAweDEwNzgsCisJMHgyOWVlLCAweDBkN2YsIDB4MGM3ZiwgMHgwNjdmLCAweDA3N2YsIDB4MDU3ZiwgMHgwNDdmLCAweDcxZDQsCisJMHhkMWI0LCAweDAwYzAsIDB4MzRjOCwgMHg3MDAzLCAweDAwNDAsIDB4MDA3OCwgMHgzNGM4LCAweDEwNzgsCisJMHg0MzYwLCAweDAwYzAsIDB4MzRjOCwgMHg3ODFiLCAweDAwNWIsIDB4MGQ3ZSwgMHg3MGJjLCAweGEwNmQsCisJMHg2OGI0LCAweDc4NWEsIDB4Njg5NCwgMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsCisJMHhjMWI0LCAweDcxZDYsIDB4NzAwMywgMHgwMDMwLCAweDc4MDgsIDB4YzA4ZCwgMHg3ODBhLCAweDBkN2YsCisJMHgxMDc4LCAweDM1ZmYsIDB4MDE3ZiwgMHg4MWZmLCAweDAwNDAsIDB4MzUxYSwgMHhhNjg0LCAweGRmMDAsCisJMHg2ODFlLCAweDY4MmIsIDB4MDAwMCwgMHg2ZjE0LCAweGExODYsIDB4MDAwMiwgMHgwMGMwLCAweDM1MWIsCisJMHg2ODE4LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDM0ZTQsIDB4MjAwOCwgMHhkNmU0LCAweDAwNDAsCisJMHgzNGU0LCAweDc4NjgsIDB4YTA4YywgMHgwMGZmLCAweDEwNzgsIDB4MmFiYSwgMHgxMDc4LCAweDJhZGIsCisJMHg2ODIwLCAweGQwZGMsIDB4MDBjMCwgMHgzNTFiLCAweDg3MTcsIDB4YTI5NCwgMHgwMDBmLCAweDgyMTMsCisJMHg4MjEzLCAweDgyMTMsIDB4YjI4NCwgMHgwMzAwLCAweDAwNDAsIDB4MzRmYSwgMHhhMjkwLCAweDUyYzAsCisJMHgwMDc4LCAweDM0ZmMsIDB4YTI5MCwgMHg1MzQwLCAweGEyOTAsIDB4MDAwMCwgMHgyMjFjLCAweGQzYzQsCisJMHgwMGMwLCAweDM1MDQsIDB4MDA3OCwgMHgzNTBhLCAweDgyMTAsIDB4MjIwNCwgMHhhMDg1LCAweDAwMTgsCisJMHgyMDEyLCAweDgyMTEsIDB4ZDNkNCwgMHgwMDQwLCAweDM1MTUsIDB4NjhhMCwgMHhkMGM0LCAweDAwYzAsCisJMHgzNTE1LCAweDEwNzgsIDB4MzY3OSwgMHgwMDc4LCAweDI5YzUsIDB4NjAwOCwgMHhjMDhkLCAweDYwMGEsCisJMHgwMDc4LCAweDM1MWIsIDB4NjkyYSwgMHg2OTE2LCAweDY4MTgsIDB4ZDBmYywgMHgwMDQwLCAweDM1MjIsCisJMHg3MDQ4LCAweDY4MWEsIDB4YTY4YywgMHhkZjAwLCAweDY5MWUsIDB4NjQxMCwgMHg4NGZmLCAweDAwNDAsCisJMHgzNTM3LCAweDIwMDksIDB4NGUwMiwgMHgyMTA0LCAweDgwMDEsIDB4MjAwYSwgMHg4NDIxLCAweDY0MTIsCisJMHgwMGMwLCAweDM1MzcsIDB4MjAyMSwgMHg0ZTA0LCAweDI0MDQsIDB4YzBhNSwgMHgyMDIyLCAweDYwMTgsCisJMHhhMDA1LCAweDAwNDAsIDB4MzUzZiwgMHg4MDAxLCAweDYwMWEsIDB4MDBjMCwgMHgzNTQyLCAweDYwMDgsCisJMHhjMGE0LCAweDYwMGEsIDB4NjgyMCwgMHhkMDg0LCAweDAwYzAsIDB4MzU0ZSwgMHg2ODAwLCAweGEwMDUsCisJMHgwMGMwLCAweDM1NGIsIDB4NjAwMiwgMHg2MDA2LCAweDAwNzgsIDB4MzU1MiwgMHg3MDVjLCAweDIwNjAsCisJMHg2ODAwLCAweDYwMDIsIDB4MjA2MSwgMHg0ZTAwLCAweDY4ODcsIDB4MDEwMywgMHgyZDA4LCAweDIwNmIsCisJMHgwMDAwLCAweDYwNjgsIDB4YTAwNSwgMHg2MTZhLCAweDAwNDAsIDB4MzU2MSwgMHgyZDAyLCAweDAwNzgsCisJMHgzNTYyLCAweDYxNmUsIDB4NzIwMCwgMHhhMjg2LCAweDAwMzAsIDB4MDA0MCwgMHgzNTcyLCAweGEyODYsCisJMHgwMDQwLCAweDAwYzAsIDB4MjljNSwgMHg3MDAzLCAweDAwMDIsIDB4NzA0YywgMHgyMDY4LCAweDY4YzQsCisJMHgyMDYwLCAweDAwN2MsIDB4NzAwMywgMHgwMDAyLCAweDcwYmMsIDB4YTA2ZCwgMHg2OGJjLCAweDcwNDIsCisJMHg3MGI4LCAweGEwNjUsIDB4NjhjMCwgMHg3MDVhLCAweDJkMDAsIDB4NzA0ZSwgMHhhZDgwLCAweDAwMDksCisJMHg3MDQ2LCAweDAwN2MsIDB4YTI4MiwgMHgwMDA0LCAweDAwNDgsIDB4MzU4OCwgMHgxMDc4LCAweDI5NmIsCisJMHgyMjAwLCAweDAwNzksIDB4MzU4YiwgMHgzNThmLCAweDM1YTAsIDB4MzVhZCwgMHgzNWEwLCAweGE1ODYsCisJMHgxMzAwLCAweDAwNDAsIDB4MzVhMCwgMHhhNTg2LCAweDgzMDAsIDB4MDBjMCwgMHgzNTg2LCAweDcwMDMsCisJMHgwMDAwLCAweDYwMTgsIDB4ODAwMSwgMHg2MDFhLCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwNSwgMHgwMDQwLCAweDM1YWEsIDB4MTA3OCwgMHg0MGM4LCAweDc4MWIsCisJMHgwMDc4LCAweDAwN2MsIDB4NzgxYiwgMHgwMDc5LCAweDAwN2MsIDB4Nzg5MCwgMHg4MDA3LCAweDgwMDEsCisJMHhhMDg0LCAweDAwMDcsIDB4YTA4MCwgMHgwMDE4LCAweDc4OWEsIDB4NzlhOCwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwgMHgzNWMyLCAweGExODYsIDB4MDAwMCwgMHgwMDQwLCAweDM1YzIsCisJMHgwMDc4LCAweDQwYjcsIDB4NzgxYiwgMHgwMDc5LCAweDAwN2MsIDB4NjgyMCwgMHhjMDk1LCAweDY4MjIsCisJMHg4MmZmLCAweDAwYzAsIDB4MzVjZiwgMHgxMDc4LCAweDQwYzgsIDB4MDA3OCwgMHgzNWQ2LCAweDgyMTEsCisJMHgwMDQwLCAweDM1ZDQsIDB4MTA3OCwgMHgyOTZiLCAweDEwNzgsIDB4NDBkYiwgMHg3ODFiLCAweDAwNzgsCisJMHgwMDdjLCAweDEwNzgsIDB4NDM4MywgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDM1ZmMsCisJMHgwMTdlLCAweDMyMDgsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsCisJMHgwMDQwLCAweDM1ZWUsIDB4YTE4YywgMHgwMzAwLCAweDAwNzgsIDB4MzVmMCwgMHhhMThjLCAweDA0MDAsCisJMHgwMTdmLCAweDAwNDAsIDB4MzVmNywgMHgwMDE4LCAweDM1ZmMsIDB4MDA3OCwgMHgzNWY5LCAweDAwMjgsCisJMHgzNWZjLCAweDc5MWEsIDB4YTAwNiwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweGE2ODQsCisJMHgwMDYwLCAweDAwYzAsIDB4MzYwOSwgMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDAwNzgsCisJMHgzNjc4LCAweGQ2ZGMsIDB4MDBjMCwgMHgzNjIxLCAweDY4YjQsIDB4ZDBkYywgMHgwMGMwLCAweDM2MjEsCisJMHg2OTk4LCAweDZhOTQsIDB4NjkyZSwgMHg2YTMyLCAweDcwNDgsIDB4YTAwNSwgMHgwMGMwLCAweDM2MWUsCisJMHgyMjAwLCAweGExMDUsIDB4MDA0MCwgMHg0NTg2LCAweDcwNGIsIDB4MDAxNSwgMHgwMDc4LCAweDQ1ODYsCisJMHgwMDdjLCAweGQ2YWMsIDB4MDA0MCwgMHgzNjQ3LCAweGQ2ZjQsIDB4MDA0MCwgMHgzNjJkLCAweDY4MmYsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDQ1ODYsIDB4NjhiNCwgMHhhMDg0LCAweDQwMDAsCisJMHhhNjM1LCAweGQ2ZjQsIDB4MDBjMCwgMHgzNjI3LCAweDcwNDgsIDB4YTAwNSwgMHgwMGMwLCAweDM2M2EsCisJMHg3MDRiLCAweDAwMTUsIDB4ZDZkYywgMHgwMGMwLCAweDM2NDMsIDB4NjhiNCwgMHhkMGRjLCAweDAwNDAsCisJMHgzNjQzLCAweDZjYTgsIDB4NmRhNCwgMHg2YzJlLCAweDZkMzIsIDB4MDA3OCwgMHg0NTg2LCAweGQ2ZjQsCisJMHgwMDQwLCAweDM2NTAsIDB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDQ1ODYsCisJMHg2OGI0LCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LCAweGQ2ZjQsIDB4MDBjMCwgMHgzNjRhLCAweDcwNDgsCisJMHhhMDA1LCAweDAwYzAsIDB4MzY1ZCwgMHg3MDRiLCAweDAwMTUsIDB4MjQwOCwgMHgyNTEwLCAweDI3MDAsCisJMHg4MGZiLCAweDAwYzgsIDB4MzY2NCwgMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHhhMTA4LCAweGEyOTEsCisJMHgwMDAwLCAweDY5MmUsIDB4NmEzMiwgMHgyMTAwLCAweGEyMDUsIDB4MDBjMCwgMHgzNjcxLCAweDAwNzgsCisJMHg0NTg2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4MzY3OCwgMHgwMDc4LCAweDQ1ODYsCisJMHgwMDdjLCAweDY5NDYsIDB4NjAwOCwgMHhjMGNkLCAweGQzY2MsIDB4MDA0MCwgMHgzNjgwLCAweGMwOGQsCisJMHg2MDBhLCAweDY4MTgsIDB4NjgzYSwgMHg2ODFiLCAweDAwMDYsIDB4Njg4ZiwgMHgwMDAwLCAweDY4OTMsCisJMHgwMDAwLCAweDZhMzAsIDB4NjkyYywgMHg2YTNlLCAweDY5NDIsIDB4NjgyZiwgMHgwMDAzLCAweDY4MzMsCisJMHgwMDAwLCAweDY4MzcsIDB4MDAyMCwgMHg2ODk3LCAweDAwMDAsIDB4Njg5YiwgMHgwMDIwLCAweDcwMDAsCisJMHgwMDc5LCAweDM2OWEsIDB4MjljNSwgMHgzNmFjLCAweDM2YTQsIDB4MzZhMiwgMHgzNmEyLCAweDM2YTIsCisJMHgzNmEyLCAweDM2YTIsIDB4MTA3OCwgMHgyOTZiLCAweDY4MjAsIDB4ZDA4NCwgMHgwMGMwLCAweDM2YWMsCisJMHgxMDc4LCAweDNkZDAsIDB4MDA3OCwgMHgzNmIyLCAweDcwNWMsIDB4MmM1MCwgMHgyMDYwLCAweDY4MDAsCisJMHg2MDAyLCAweDJhNjAsIDB4MzIwOCwgMHhhMThjLCAweDAzMDAsIDB4MDA0MCwgMHgzNmJiLCAweDIwMjEsCisJMHg0ZTU4LCAweDAwNzgsIDB4MzZiZCwgMHgyMDIxLCAweDRlOTgsIDB4MjQwNCwgMHhhMDA1LCAweDAwNDAsCisJMHgzNmM0LCAweDIwMjAsIDB4MDA3OCwgMHgzNmJkLCAweDJkMjIsIDB4MjA2YiwgMHgwMDAwLCAweDAwN2MsCisJMHgxMDc4LCAweDNkZDcsIDB4MTA3OCwgMHgzZGVkLCAweDYwMDgsIDB4YzBjYywgMHg2MDBhLCAweDY4MmIsCisJMHgwMDAwLCAweDc4OWIsIDB4MDAwZSwgMHg2ZjE0LCAweDY5MzgsIDB4NjkxYSwgMHg2OTQ0LCAweDY5MTYsCisJMHgzMjA4LCAweGExOGMsIDB4MDMwMCwgMHgwMDQwLCAweDM2ZTEsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsCisJMHgzNmUzLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDQ5ZjgsIDB4ZDZkYywgMHgwMDQwLCAweDM2ZWIsCisJMHg2OTFjLCAweGMxZWQsIDB4NjkxZSwgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzNmZhLCAweDc4NjgsCisJMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHgzNmY4LCAweDY4MWIsIDB4MDAxZSwgMHgwMDc4LCAweDM2ZmEsCisJMHg2ODFiLCAweDAwMDAsIDB4YjI4NCwgMHgwMzAwLCAweDAwYzAsIDB4MzcwMiwgMHgyMDIxLCAweDRlOTgsCisJMHgwMDc4LCAweDM3MDQsIDB4MjAyMSwgMHg0ZTU4LCAweDY4MDAsIDB4MjAyMiwgMHg2YTNjLCAweDY5NDAsCisJMHg2YTMyLCAweDY5MmUsIDB4NjhjMCwgMHgyMDYwLCAweDYwMDAsIDB4ZDBhNCwgMHgwMDQwLCAweDM3NDQsCisJMHgyMDQxLCAweDAwMjEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgwZDdlLCAweDBmN2UsCisJMHgxNTdlLCAweDE0N2UsIDB4MjA3OSwgMHg0ZTAwLCAweDEwNzgsIDB4MWRmZiwgMHgxNDdmLCAweDE1N2YsCisJMHgwZjdmLCAweDcwY2MsIDB4MjAxMCwgMHgyMDA5LCAweDAxMDEsIDB4MDI3ZSwgMHgyMjA0LCAweGEwNmQsCisJMHgwMDQwLCAweDM3MzQsIDB4NjgxNCwgMHhhNzA2LCAweDAwNDAsIDB4MzczMSwgMHg2ODAwLCAweDAwNzgsCisJMHgzNzI3LCAweDY4MjAsIDB4YzBkNSwgMHg2ODIyLCAweDAyN2YsIDB4ODIxMCwgMHg4MTA5LCAweDAwYzAsCisJMHgzNzI1LCAweDBkN2YsIDB4NzA2NywgMHgwMDAzLCAweDcwN2YsIDB4MDAwMCwgMHg3Nzc2LCAweDcwODMsCisJMHgwMDBmLCAweDcxZDQsIDB4YzFkYywgMHg3MWQ2LCAweDY4MTgsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsCisJMHgzNzUwLCAweDY4MTcsIDB4MDAwMCwgMHg2ODJiLCAweDAwMDAsIDB4NjgxYywgMHhjMGVjLCAweDY4MWUsCisJMHgxMDc4LCAweDIwMmMsIDB4MDA3OCwgMHgyOWM1LCAweDdjZDgsIDB4N2RkYywgMHg3ZmQwLCAweDEwNzgsCisJMHgzNWZmLCAweDY4MmIsIDB4MDAwMCwgMHg3ODliLCAweDAwMGUsIDB4NmYxNCwgMHgxMDc4LCAweDQzODcsCisJMHhhMDhjLCAweDAwZmYsIDB4NjkxNiwgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzNzY5LCAweDcwNDgsCisJMHg2ODFhLCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDcwNjcsIDB4MDAwMCwgMHgwMDc4LCAweDI5YzUsCisJMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgzNzc2LCAweDAwNzgsIDB4MjljNSwgMHhhMDA2LCAweDEwNzgsCisJMHg0NTg2LCAweDY5MjAsIDB4ZDFhYywgMHgwMGMwLCAweDM3N2YsIDB4NjgxYiwgMHgwMDE0LCAweGE2OGMsCisJMHhkZjAwLCAweDY5MWUsIDB4NjgyYiwgMHgwMDAwLCAweDY4MjAsIDB4YTA4NCwgMHgwMGZmLCAweDY4MjIsCisJMHg3MDAwLCAweDAwNzksIDB4Mzc4YiwgMHgyOWM1LCAweDM3OTUsIDB4Mzc5NSwgMHgzNzk4LCAweDM3OTgsCisJMHgzNzk4LCAweDM3OTMsIDB4Mzc5MywgMHgxMDc4LCAweDI5NmIsIDB4NjgxOCwgMHgwMDc4LCAweDMzZmEsCisJMHg2MDA4LCAweGMwYTQsIDB4NjAwYSwgMHg2ODE3LCAweDAwMDAsIDB4MDA3OCwgMHgzZDk1LCAweDIzMDAsCisJMHgwMDc5LCAweDM3YTIsIDB4MzdhNSwgMHgzN2E3LCAweDM4MTcsIDB4MTA3OCwgMHgyOTZiLCAweGQ2ZmMsCisJMHgwMGMwLCAweDM3ZmUsIDB4NzAwMCwgMHhhMDBkLCAweDAwNzksIDB4MzdhZSwgMHgyOWM1LCAweDM3YjgsCisJMHgzN2I4LCAweDM3ZTgsIDB4MzdiOCwgMHgzN2ZiLCAweDM3YjYsIDB4MzdiNiwgMHgxMDc4LCAweDI5NmIsCisJMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgzN2U4LCAweGEwODYsIDB4MDA2MCwgMHgwMGMwLCAweDM3ZTUsCisJMHhjNmFjLCAweGM2ZjQsIDB4YzZlZCwgMHg3ZTVhLCAweDZlYjYsIDB4NjgxYywgMHhjMGFjLCAweDY4MWUsCisJMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHgzN2Q3LCAweDEwNzgsIDB4NDU4NiwgMHg2OWFjLCAweDY4YjAsCisJMHhhMTE1LCAweDAwNDAsIDB4MzdkNywgMHgxMDc4LCAweDQ4ZjUsIDB4MDA3OCwgMHgzN2Q5LCAweDEwNzgsCisJMHg0OGJkLCAweDc4MWIsIDB4MDA3OSwgMHg3MWQ0LCAweGQxYjQsIDB4MDBjMCwgMHgyOWMxLCAweDcwYTQsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyYTBiLCAweDAwN2MsIDB4ZDZlYywgMHgwMDQwLCAweDM3YzIsCisJMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHgzN2ZiLCAweGQ2ZjQsIDB4MDBjMCwgMHgzN2Y1LCAweDY4MWIsCisJMHgwMDE1LCAweDc4MWIsIDB4MDA3OSwgMHgwMDc4LCAweDI5YzEsIDB4NjgxYiwgMHgwMDA3LCAweDY4MmYsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgxMDc4LCAweDQzMTksIDB4MDA3YywgMHhjNmZjLCAweDdlNWEsCisJMHg3YWRjLCAweDc5ZDgsIDB4NzhkMCwgMHg4MDFiLCAweDAwYzgsIDB4MzgwNywgMHg4MDAwLCAweGEwODQsCisJMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDZiOTgsIDB4MjEwMCwgMHhhMzAyLCAweDY4YjIsCisJMHg2Yjk0LCAweDIyMDAsIDB4YTMwMywgMHg2OGFlLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLCAweDEwNzgsCisJMHgyOTZiLCAweDIzMDAsIDB4MDA3OSwgMHgzODFjLCAweDM4MjEsIDB4Mzg0NiwgMHgzOGE2LCAweDEwNzgsCisJMHgyOTZiLCAweDcwMDAsIDB4MDA3OSwgMHgzODI0LCAweDM4MmMsIDB4MzgyZSwgMHgzODM3LCAweDM4MmMsCisJMHgzODJjLCAweDM4MmMsIDB4MzgyYywgMHgzODJjLCAweDEwNzgsIDB4Mjk2YiwgMHg2OWFjLCAweDY4YjAsCisJMHhhMTE1LCAweDAwNDAsIDB4MzgzNywgMHgxMDc4LCAweDQ4ZjUsIDB4MDA3OCwgMHgzODM5LCAweDEwNzgsCisJMHg0OGJkLCAweDY4MWMsIDB4YzBiNCwgMHg2ODFlLCAweDcwZDQsIDB4ZDBiNCwgMHgwMGMwLCAweDI5YzEsCisJMHg3MGE0LCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDJhMGIsIDB4MDA3YywgMHhkNmZjLCAweDAwYzAsCisJMHgzODk2LCAweDcwMDAsIDB4YTAwZCwgMHgwMDc5LCAweDM4NGQsIDB4MjljNSwgMHgzODVkLCAweDM4NTcsCisJMHgzODhkLCAweDM4NWQsIDB4Mzg5MywgMHgzODU1LCAweDM4NTUsIDB4MTA3OCwgMHgyOTZiLCAweDY4OTQsCisJMHg3OGQ2LCAweDc4ZGUsIDB4Njg5OCwgMHg3OGQyLCAweDc4ZGEsIDB4YTY4NCwgMHgwMDYwLCAweDAwNDAsCisJMHgzODhkLCAweGEwODYsIDB4MDA2MCwgMHgwMGMwLCAweDM4OGEsIDB4YTZiNCwgMHhiZmJmLCAweGM2ZWQsCisJMHg3ZTVhLCAweDZlYjYsIDB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4Mzg3OSwgMHgxMDc4LCAweDQ1ODYsCisJMHg2OWFjLCAweDY4YjAsIDB4YTExNSwgMHgwMDQwLCAweDM4NzksIDB4MTA3OCwgMHg0OGY1LCAweDAwNzgsCisJMHgzODdiLCAweDEwNzgsIDB4NDhiZCwgMHg3ODFiLCAweDAwNzksIDB4NjgxYywgMHhjMGI0LCAweDY4MWUsCisJMHg3MWQ0LCAweGQxYjQsIDB4MDBjMCwgMHgyOWMxLCAweDcwYTQsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgyYTBiLCAweDAwN2MsIDB4ZDZlYywgMHgwMDQwLCAweDM4NjcsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsCisJMHgzODkzLCAweDY4MWIsIDB4MDAwNywgMHg3ODFiLCAweDAwZjksIDB4MDA3YywgMHhjNmZjLCAweDdlNWEsCisJMHg3YWRjLCAweDc5ZDgsIDB4NmI5OCwgMHgyMTAwLCAweGEzMDIsIDB4NjhiMiwgMHg2Yjk0LCAweDIyMDAsCisJMHhhMzAzLCAweDY4YWUsIDB4NzlkMiwgMHg3ODFiLCAweDAwNzksIDB4MDA3YywgMHhkNmRjLCAweDAwNDAsCisJMHgzOGFmLCAweDc4MmIsIDB4MzAwOSwgMHg3ODFiLCAweDAwNzksIDB4MDA3OCwgMHgyOWMxLCAweDc4ODQsCisJMHhjMGFjLCAweDc4ODYsIDB4NzhlNCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgzOGMyLCAweGE0ODQsCisJMHgwMjAwLCAweDAwNDAsIDB4MzhiYywgMHhjNmY1LCAweGM2ZGQsIDB4N2U1YSwgMHg3ODFiLCAweDAwNzksCisJMHgwMDc4LCAweDI5YzEsIDB4NjgyMCwgMHhjMDk1LCAweDY4MjIsIDB4MTA3OCwgMHg0MjkyLCAweGM2ZGQsCisJMHgxMDc4LCAweDQwYzgsIDB4NzgxYiwgMHgwMDc4LCAweDAwNzgsIDB4MjljMSwgMHgyMzAwLCAweDAwNzksCisJMHgzOGQxLCAweDM4ZDQsIDB4MzhkNiwgMHgzOGQ4LCAweDEwNzgsIDB4Mjk2YiwgMHgwMDc4LCAweDQwYzEsCisJMHhkNmQ0LCAweDAwYzAsIDB4MzkxMywgMHg3OWU0LCAweGQxYWMsIDB4MDA0MCwgMHgzOGU2LCAweDc4ZWMsCisJMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgzOGU2LCAweDc4MmIsIDB4MzAwOSwgMHg3ODliLCAweDAwNjAsCisJMHg3OGFiLCAweDAwMDAsIDB4YTY4NCwgMHhmZmZiLCAweDc4NWEsIDB4NzllNCwgMHhkMWFjLCAweDAwNDAsCisJMHgzOGY2LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsIDB4MzkwZiwgMHgyMDAxLCAweDRlMDQsCisJMHgyMDA0LCAweGQwZTQsIDB4MDBjMCwgMHgzOTBiLCAweDY4MjAsIDB4ZDBjNCwgMHgwMDQwLCAweDM5MGIsCisJMHgwYzdlLCAweDcwNTgsIDB4MjA2MCwgMHg2MDA0LCAweGMwOWQsIDB4NjAwNiwgMHg2MDA4LCAweGEwODQsCisJMHgwMGZmLCAweDYwMGEsIDB4MGM3ZiwgMHgyMDAxLCAweDAwMTQsIDB4MDA3OCwgMHgzM2ZhLCAweGExODQsCisJMHgwMDA3LCAweDAwNzksIDB4Mzk0OSwgMHg3YTkwLCAweGEyOTQsIDB4MDAwNywgMHg3ODliLCAweDAwNjAsCisJMHg3OWE4LCAweDgxZmYsIDB4MDA0MCwgMHgzOTQ3LCAweDc4OWIsIDB4MDAxMCwgMHg3YmE4LCAweGEzODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MzkzYSwgMHg3YmE4LCAweDdiYTgsIDB4YTM4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgzOTJkLCAweDIwMDksIDB4ZmZmNywgMHgwMDc4LCAweDM5MzMsIDB4YTM4NiwgMHgwMDAzLCAweDAwYzAsCisJMHgzOTNhLCAweDIwMDksIDB4ZmZlZiwgMHgwYzdlLCAweDcwNTgsIDB4MjA2MCwgMHg2MDA0LCAweGExMDQsCisJMHg2MDA2LCAweDBjN2YsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsCisJMHg3ODVhLCAweDc4MmIsIDB4MzAwOSwgMHg2OTIwLCAweGExOGMsIDB4ZmNmZiwgMHg2OTIyLCAweDAwNzgsCisJMHg0MzBkLCAweDMwOTAsIDB4MzA5YSwgMHgzOTUzLCAweDM5NTksIDB4Mzk1MSwgMHgzOTUxLCAweDQzMGQsCisJMHg0MzBkLCAweDEwNzgsIDB4Mjk2YiwgMHg2OTIwLCAweGExOGMsIDB4ZmNmZiwgMHg2OTIyLCAweDAwNzgsCisJMHg0MzEzLCAweDY5MjAsIDB4YTE4YywgMHhmY2ZmLCAweDY5MjIsIDB4MDA3OCwgMHg0MzBkLCAweDc5ZTQsCisJMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgzOTY5LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsCisJMHgzOTlkLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4Mzk4MywgMHg3MDY0LCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4Mzk3OSwgMHgyMDExLCAweDAwMDIsIDB4MjAxOSwgMHgwMDAwLCAweDAwNzgsCisJMHgyZjFjLCAweDcwNjQsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4Mzk3MywgMHg3MDY0LCAweGEwODYsCisJMHgwMDA0LCAweDAwNDAsIDB4Mzk3MywgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDI5YzEsCisJMHg2OTIwLCAweGExODQsIDB4MDQyMCwgMHgwMDQwLCAweDM5OTIsIDB4YzFkNCwgMHg2OTIyLCAweDY4MTgsCisJMHgwMDc4LCAweDMzZmEsIDB4NjgxOCwgMHhhMDhlLCAweDAwMDIsIDB4MDA0MCwgMHgzOTliLCAweGMwZmQsCisJMHg2ODFhLCAweDIwMDEsIDB4MDAxNCwgMHgwMDc4LCAweDMzZmEsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksCisJMHgzOWExLCAweDQzMGQsIDB4NDMwZCwgMHgzOWE5LCAweDQzMGQsIDB4NDM1NSwgMHg0MzU1LCAweDQzMGQsCisJMHg0MzBkLCAweGQ2YmMsIDB4MDA0MCwgMHgzOWViLCAweDcxODQsIDB4ODFmZiwgMHgwMDQwLCAweDM5ZWIsCisJMHhhMTgyLCAweDAwMGQsIDB4MDBkMCwgMHgzOWI4LCAweDcwODcsIDB4MDAwMCwgMHgwMDc4LCAweDM5YmQsCisJMHhhMTgyLCAweDAwMGMsIDB4NzA4NiwgMHgyMDA5LCAweDAwMGMsIDB4Nzg5YiwgMHgwMDYxLCAweDc5YWEsCisJMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHg3MDg4LCAweDgxMTQsIDB4YTIxMCwgMHg3MjhhLCAweGEwODAsCisJMHgwMDBiLCAweGFkMDAsIDB4MjA5OCwgMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzOWRmLCAweDAwN2UsCisJMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHgzOWRiLCAweDIwYTEsCisJMHgwMTJiLCAweDAwNzgsIDB4MzllMSwgMHgyMGExLCAweDAyMmIsIDB4MDA3OCwgMHgzOWUxLCAweDIwYTEsCisJMHgwMTJiLCAweDc4OWIsIDB4MDAwMCwgMHg4MTA4LCAweDgxYWMsIDB4NTNhNiwgMHgxNDdmLCAweDEzN2YsCisJMHgxNTdmLCAweDAwNzgsIDB4NDMxMywgMHhkNmQ0LCAweDAwYzAsIDB4M2EzZiwgMHg2ODIwLCAweGQwODQsCisJMHgwMDQwLCAweDQzMTMsIDB4YTY4YywgMHgwMDYwLCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLCAweDM5ZmQsCisJMHhhMDg2LCAweDAwNjAsIDB4MDBjMCwgMHgzOWZkLCAweGMxZjUsIDB4YzE5NCwgMHg3OTVhLCAweDY5YjYsCisJMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAwLCAweDc4OWIsIDB4MDA2MSwgMHg2ODE4LCAweGMwZmQsCisJMHg2ODFhLCAweDc4YWEsIDB4ODAwOCwgMHg4MTBjLCAweDAwNDAsIDB4M2UwNiwgMHhhMThjLCAweDAwZjgsCisJMHgwMGMwLCAweDNlMDYsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MDE3ZSwgMHgzMjA4LCAweGExOGMsCisJMHgwMzAwLCAweDAwNDAsIDB4M2EyYiwgMHgwMDdlLCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsCisJMHgwMDdmLCAweDAwNDAsIDB4M2EyNywgMHgyMGExLCAweDAxMmIsIDB4MDA3OCwgMHgzYTJkLCAweDIwYTEsCisJMHgwMjJiLCAweDAwNzgsIDB4M2EyZCwgMHgyMGExLCAweDAxMmIsIDB4MDE3ZiwgMHg3ODliLCAweDAwMDAsCisJMHg4MDAwLCAweDgwYWMsIDB4YWQ4MCwgMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgxNDdmLCAweDEzN2YsCisJMHgxNTdmLCAweDY4MTQsIDB4YzBmYywgMHg4MDA3LCAweDc4ODIsIDB4MDA3OCwgMHg0MzEzLCAweDY4MTgsCisJMHhkMGZjLCAweDAwNDAsIDB4M2E0NSwgMHg2ODFiLCAweDAwMDgsIDB4NjgyMCwgMHhjMGFkLCAweDY4MjIsCisJMHgxMDc4LCAweDQwZDAsIDB4NzgxYiwgMHgwMGVhLCAweDAwN2MsIDB4MjMwMCwgMHgwMDc5LCAweDNhNTAsCisJMHgzYTU1LCAweDNiMmQsIDB4M2E1MywgMHgxMDc4LCAweDI5NmIsIDB4N2NkOCwgMHg3ZGRjLCAweDdmZDAsCisJMHg4MmZmLCAweDAwYzAsIDB4M2E3ZSwgMHg3MjAwLCAweGEyODYsIDB4MDAwMywgMHgwMDQwLCAweDMzYzcsCisJMHg3MWQ0LCAweGQxYmMsIDB4MDBjMCwgMHgzYTgxLCAweGQxYjQsIDB4MDA0MCwgMHgzYTgxLCAweDBkN2UsCisJMHg3ODNiLCAweDg4MDAsIDB4NzgxYiwgMHgwMDRjLCAweDcwYmMsIDB4YTA2ZCwgMHg2OGI0LCAweGMwYTUsCisJMHg3ODVhLCAweDY4OTQsIDB4NzhkNiwgMHg3OGRlLCAweDY4OTgsIDB4NzhkMiwgMHg3OGRhLCAweGMxYjQsCisJMHg3MWQ2LCAweDcwMDMsIDB4MDAzMCwgMHgwZDdmLCAweDAwNzgsIDB4M2E4NSwgMHg3MjAwLCAweDAwNzgsCisJMHgzYTg1LCAweDc4M2IsIDB4MTgwMCwgMHg3ODFiLCAweDAwNGEsIDB4YTI4NCwgMHgwMDBmLCAweDAwNzksCisJMHgzYTg5LCAweDNiMTgsIDB4M2FjNywgMHgzYTkzLCAweDMzZjYsIDB4M2E5MSwgMHgzYjE4LCAweDNhOTEsCisJMHgzYTkxLCAweDEwNzgsIDB4Mjk2YiwgMHg2ODFjLCAweGQwZWMsIDB4MDA0MCwgMHgzYTlhLCAweDYwMDgsCisJMHhjMDhkLCAweDYwMGEsIDB4NjkyMCwgMHhjMTg1LCAweDY5MjIsIDB4NjgwMCwgMHg2MDA2LCAweGEwMDUsCisJMHgwMGMwLCAweDNhYTMsIDB4NjAwMiwgMHg2MDA4LCAweGMwZDQsIDB4NjAwYSwgMHg2ODFjLCAweGEwODQsCisJMHgwMDBlLCAweDAwYzAsIDB4M2FiNywgMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYWIzLCAweDIwMDksCisJMHg5NGMwLCAweDAwNzgsIDB4M2FiYywgMHgyMDA5LCAweDk1ZDAsIDB4MDA3OCwgMHgzYWJjLCAweDcwMzAsCisJMHg2OGJhLCAweDcxNDAsIDB4NzBjYywgMHhhMTA4LCAweDIxMDQsIDB4NjgwMiwgMHgyZDBhLCAweDcxNWUsCisJMHhkNmRjLCAweDAwYzAsIDB4M2FjNywgMHhjNmZjLCAweDZlYjYsIDB4MDA3OCwgMHgzYjE4LCAweDZlYjYsCisJMHhhNjg0LCAweDAwNjAsIDB4MDBjMCwgMHgzYWQxLCAweGE2ODQsIDB4N2ZmZiwgMHg2OGI2LCAweDAwNzgsCisJMHgzYjE4LCAweGQ2ZGMsIDB4MDBjMCwgMHgzYWRmLCAweGE2ODQsIDB4N2ZmZiwgMHg2OGI2LCAweDY4OTQsCisJMHg2OGE2LCAweDY4OTgsIDB4NjhhYSwgMHgxMDc4LCAweDQ1ODYsIDB4MDA3OCwgMHgzYjE4LCAweGQ2YWMsCisJMHgwMDQwLCAweDNhZWIsIDB4YTAwNiwgMHgxMDc4LCAweDQ1ODYsIDB4MjQwOCwgMHgyNTEwLCAweDY5YWEsCisJMHg2YWE2LCAweDAwNzgsIDB4M2FmYiwgMHgyNDA4LCAweDI1MTAsIDB4MjcwMCwgMHg4MDFiLCAweDAwYzgsCisJMHgzYWYyLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsIDB4YTI5MSwgMHgwMDAwLCAweDY5YWEsCisJMHg2YWE2LCAweDEwNzgsIDB4NDU4NiwgMHhkNmZjLCAweDAwNDAsIDB4M2IxOCwgMHhhNjg0LCAweDdmZmYsCisJMHg2OGI2LCAweDI1MTAsIDB4MjQwOCwgMHhkNmFjLCAweDAwYzAsIDB4M2IxMCwgMHgyNzAwLCAweDgwMWIsCisJMHgwMGM4LCAweDNiMGIsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsCisJMHg2Yjk4LCAweDIxMDAsIDB4YTMwMiwgMHg2OGIyLCAweDZiOTQsIDB4MjIwMCwgMHhhMzAzLCAweDY4YWUsCisJMHg3MDAwLCAweGEwODYsIDB4MDAzMCwgMHgwMGMwLCAweDI5YzUsIDB4NzAwMywgMHgwMDAyLCAweDcwYmMsCisJMHhhMDZkLCAweDY4YmMsIDB4NzA0MiwgMHg3MGI4LCAweGEwNjUsIDB4NjhjMCwgMHg3MDVhLCAweDJkMDAsCisJMHg3MDRlLCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LCAweDAwN2MsIDB4YTU4NiwgMHg4ODAwLCAweDAwYzAsCisJMHgzYjNhLCAweDcwMDMsIDB4MDAwMCwgMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHg2MDA4LCAweGEwODQsCisJMHhmYmVmLCAweDYwMGEsIDB4MDA3OCwgMHg0MGMxLCAweDcwNDcsIDB4MDAwMCwgMHhhMjgyLCAweDAwMDYsCisJMHgwMDUwLCAweDNiNDQsIDB4MTA3OCwgMHgyOTZiLCAweDIzMDAsIDB4MDA3OSwgMHgzYjQ3LCAweDNiNGEsCisJMHgzYjVjLCAweDNiNjgsIDB4MjIwMCwgMHgwMDc5LCAweDNiNGQsIDB4M2I1MywgMHg0MGMxLCAweDNiNTUsCisJMHgzYjUzLCAweDNiYTIsIDB4M2JmNywgMHgxMDc4LCAweDI5NmIsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsCisJMHgxMDc4LCAweDNjODEsIDB4MDA3OCwgMHg0MGI3LCAweDEwNzgsIDB4M2I3OSwgMHgwMDc5LCAweDNiNjAsCisJMHg0MGMxLCAweDNiNjYsIDB4M2I2NiwgMHgzYmEyLCAweDNiNjYsIDB4NDBjMSwgMHgxMDc4LCAweDI5NmIsCisJMHgxMDc4LCAweDNiNzksIDB4MDA3OSwgMHgzYjZjLCAweDNiNzQsIDB4M2I3MiwgMHgzYjcyLCAweDNiNzQsCisJMHgzYjcyLCAweDNiNzQsIDB4MTA3OCwgMHgyOTZiLCAweDEwNzgsIDB4NDBkYiwgMHg3ODFiLCAweDAwNzgsCisJMHgwMDdjLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2I4YSwgMHgxMDc4LCAweDNkZWQsCisJMHgwMDc4LCAweDNiODQsIDB4MTA3OCwgMHg0NTg2LCAweDYwMDgsIDB4YTA4NCwgMHhmYmVmLCAweDYwMGEsCisJMHgwMDc4LCAweDNiOGYsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHgzYjgyLCAweDcwMDMsCisJMHgwMDA1LCAweGIyODQsIDB4MDMwMCwgMHgwMDQwLCAweDNiOTksIDB4MjAwMSwgMHg5NWUwLCAweDAwNzgsCisJMHgzYjliLCAweDIwMDEsIDB4OTYxMiwgMHgyMDY4LCAweDcwNGUsIDB4YWQ4MCwgMHgwMDA5LCAweDcwNDYsCisJMHgyMjAwLCAweDAwN2MsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgzYmI0LCAweDcwZDQsCisJMHhjMGI1LCAweDcwZDYsIDB4MmMwMCwgMHg3MGJhLCAweDJkMDAsIDB4NzBiZSwgMHgwMDc4LCAweDNiYjksCisJMHgxMDc4LCAweDQ1ODYsIDB4MDA3OCwgMHgzYmI5LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsCisJMHgzYmIwLCAweDcwMDMsIDB4MDAwMSwgMHg3YTgwLCAweGEyOTQsIDB4MGYwMCwgMHg3ODliLCAweDAwMTgsCisJMHg3Y2E4LCAweGE0ODQsIDB4MDAxZiwgMHhhMjE1LCAweDIwNjksIDB4OTRjMCwgMHhiMjg0LCAweDAzMDAsCisJMHgwMGMwLCAweDNiY2QsIDB4YzJmZCwgMHgyMDY5LCAweDk1ZDAsIDB4MmQwNCwgMHgyZDA4LCAweDcxNWUsCisJMHhhMDZkLCAweDAwNDAsIDB4M2JkYSwgMHg2ODE0LCAweGEyMDYsIDB4MDA0MCwgMHgzYmRjLCAweDY4MDAsCisJMHgwMDc4LCAweDNiY2UsIDB4MTA3OCwgMHgzYzgxLCAweDZlYjQsIDB4N2U1YSwgMHg2OTIwLCAweGExODQsCisJMHgwYzAwLCAweDAwNDAsIDB4M2NhYiwgMHg3MDY0LCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDNiZWUsCisJMHg3MDc0LCAweGEyMDYsIDB4MDBjMCwgMHgzYmVlLCAweDcwNjYsIDB4NzA3ZSwgMHg2ODFiLCAweDAwMDUsCisJMHhjMWFkLCAweGMxZDQsIDB4NjkyMiwgMHgxMDc4LCAweDQwZDAsIDB4MDA3OCwgMHgzY2FiLCAweDcyMDAsCisJMHhhMjg2LCAweDAwMDIsIDB4MDBjMCwgMHgzYzA5LCAweDcwZDQsIDB4YzBiNSwgMHg3MGQ2LCAweDJjMDAsCisJMHg3MGJhLCAweDJkMDAsIDB4NzBiZSwgMHgwMDc4LCAweDNjMGQsIDB4MTA3OCwgMHg0NTg2LCAweDAwNzgsCisJMHgzYzBkLCAweGEyODYsIDB4MDAwMywgMHgwMDQwLCAweDNjMDUsIDB4NzAwMywgMHgwMDAxLCAweDdhODAsCisJMHhhMjk0LCAweDBmMDAsIDB4Nzg5YiwgMHgwMDE4LCAweDdjYTgsIDB4YTQ4NCwgMHgwMDFmLCAweGEyMTUsCisJMHhiMjg0LCAweDAzMDAsIDB4MDBjMCwgMHgzYzFkLCAweGMyZmQsIDB4NzlhOCwgMHg3OWE4LCAweGExOGMsCisJMHgwMGZmLCAweDIxMTgsIDB4NzBjYywgMHhhMTY4LCAweDJkMDQsIDB4MmQwOCwgMHg3MTVlLCAweGEwNmQsCisJMHgwMDQwLCAweDNjMzEsIDB4NjgxNCwgMHhhMjA2LCAweDAwNDAsIDB4M2M1YSwgMHg2ODAwLCAweDAwNzgsCisJMHgzYzI1LCAweDcwMDMsIDB4MDAwNSwgMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYzNiLCAweDIwMDEsCisJMHg5NWUwLCAweDAwNzgsIDB4M2MzZCwgMHgyMDAxLCAweDk2MTIsIDB4MjA2OCwgMHg3MDRlLCAweDE1N2UsCisJMHgyMGE5LCAweDAwMzIsIDB4MjAwMywgMHgwMDAwLCAweDgwMDAsIDB4MDBmMCwgMHgzYzQyLCAweDE1N2YsCisJMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYzRmLCAweGMyZmMsIDB4MDA3OCwgMHgzYzUwLCAweGMyZmQsCisJMHg2YTE2LCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LCAweDY4YjcsIDB4MDcwMCwgMHg2ODIzLCAweDA4MDAsCisJMHg2ODI3LCAweDAwMDMsIDB4NmViNCwgMHg2OTIwLCAweGExODQsIDB4MGMwMCwgMHgwMDQwLCAweDNjYWIsCisJMHhkMGRjLCAweDAwNDAsIDB4M2M3NiwgMHg3MDY0LCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDNjNzIsCisJMHg3MDc0LCAweGEyMDYsIDB4MDBjMCwgMHgzYzcyLCAweDcwNzgsIDB4YTMwNiwgMHgwMGMwLCAweDNjNzIsCisJMHg3MDY2LCAweDcwN2UsIDB4MTA3OCwgMHg0MGQ3LCAweDAwNzgsIDB4M2NhYiwgMHg2ODFiLCAweDAwMDUsCisJMHhjMWFkLCAweGMxZDQsIDB4NjkyMiwgMHgxMDc4LCAweDQwZDAsIDB4NzA3ZiwgMHgwMDAwLCAweDAwNzgsCisJMHgzY2FiLCAweDcwMDMsIDB4MDAwNSwgMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYzhiLCAweDIwMDEsCisJMHg5NWUwLCAweDAwNzgsIDB4M2M4ZCwgMHgyMDAxLCAweDk2MTIsIDB4MjA2OCwgMHg3MDRlLCAweDE1N2UsCisJMHgyMGE5LCAweDAwMzIsIDB4MjAwMywgMHgwMDAwLCAweDgwMDAsIDB4MDBmMCwgMHgzYzkyLCAweDE1N2YsCisJMHhiMjg0LCAweDAzMDAsIDB4MDA0MCwgMHgzYzlmLCAweGMyZmMsIDB4MDA3OCwgMHgzY2EwLCAweGMyZmQsCisJMHg2YTE2LCAweGFkODAsIDB4MDAwOSwgMHg3MDQ2LCAweDY4YjcsIDB4MDcwMCwgMHg2ODIzLCAweDA4MDAsCisJMHg2ODI3LCAweDAwMDMsIDB4MDA3YywgMHhjNmVjLCAweGE2YWMsIDB4MDA2MCwgMHgwMDQwLCAweDNjZmQsCisJMHg2Yjk4LCAweDZjOTQsIDB4NjlhYywgMHg2OGIwLCAweGExMDUsIDB4MDBjMCwgMHgzY2Q4LCAweDdiZDIsCisJMHg3YmRhLCAweDdjZDYsIDB4N2NkZSwgMHhhNTg2LCAweDAwNjAsIDB4MDA0MCwgMHgzZDAyLCAweGQ2ZjQsCisJMHgwMGMwLCAweDNjYzMsIDB4YzZlZCwgMHhhNmI0LCAweGI3ZmYsIDB4N2U1YSwgMHgyMDA5LCAweDAwNzksCisJMHhkNjljLCAweDAwNDAsIDB4M2NkMCwgMHgyMDA5LCAweDAwNzgsIDB4MjAxOSwgMHgwMDAwLCAweDIzMjAsCisJMHg3OTFhLCAweGQ2ZWMsIDB4MDA0MCwgMHgzZDBkLCAweDEwNzgsIDB4NDhiZCwgMHgwMDc4LCAweDNkMGQsCisJMHg2OGIwLCAweGEzMWEsIDB4MjEwMCwgMHhhNDIzLCAweDI0MDAsIDB4YTMwNSwgMHgwMDQwLCAweDNkMDQsCisJMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweDY4YjAsIDB4ZDZmNCwgMHgwMGMwLCAweDNjZTksCisJMHhjNmVkLCAweGM2ZjQsIDB4N2U1YSwgMHgyMDExLCAweDAwNzksIDB4ZDY5YywgMHgwMDQwLCAweDNjZjUsCisJMHgyMDExLCAweDAwNzgsIDB4MjAxOSwgMHgwMDAwLCAweDIzMjAsIDB4N2ExYSwgMHhkNmVjLCAweDAwNDAsCisJMHgzZDBkLCAweDEwNzgsIDB4NDhmNSwgMHgwMDc4LCAweDNkMGQsIDB4MjAxOSwgMHgwMDAwLCAweDIzMjAsCisJMHgwMDc4LCAweDNkMDQsIDB4YTZiNCwgMHhiN2ZmLCAweDdlNWEsIDB4MjAwOSwgMHgwMDc5LCAweGQ2OWMsCisJMHgwMDQwLCAweDNkMGMsIDB4MjAwOSwgMHgwMDc4LCAweDc5MWEsIDB4NjhjMCwgMHg3MDVhLCAweDJkMDAsCisJMHg3MDRlLCAweDY4YzQsIDB4MjA2MCwgMHg3MWQ0LCAweDIwMDEsIDB4NGUwMSwgMHgyMDA0LCAweGQwYzQsCisJMHgwMGMwLCAweDNkNjIsIDB4NzBkOCwgMHhhMDJkLCAweDAwNDAsIDB4M2QzYiwgMHhkMWJjLCAweDAwNDAsCisJMHgzZDU1LCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDcwZGMsIDB4YTIwNiwgMHgwMDQwLCAweDNkMmMsCisJMHg3OGUwLCAweGE1MDQsIDB4MDBjMCwgMHgzZDYyLCAweDcwZGEsIDB4YzFiYywgMHg3MWQ2LCAweDAwNzgsCisJMHgzZDYyLCAweDIwMzEsIDB4MDAwMSwgMHg4NTJjLCAweDAwNDgsIDB4M2QzYSwgMHg4NjMzLCAweDgyMTAsCisJMHgwMDc4LCAweDNkMzMsIDB4MDA3YywgMHg3ZGUwLCAweGE1OTQsIDB4ZmYwMCwgMHgwMDQwLCAweDNkNDgsCisJMHgyMDExLCAweDAwMDgsIDB4ODUyZiwgMHgxMDc4LCAweDNkMzEsIDB4ODYzNywgMHgwMDc4LCAweDNkNGEsCisJMHgxMDc4LCAweDNkMzEsIDB4ODIxNywgMHg3ODgwLCAweGEwODQsIDB4MGYwMCwgMHhhMjA2LCAweDAwNDAsCisJMHgzZDYyLCAweDcyZGUsIDB4NzZkYSwgMHgwMDc4LCAweDNkNjIsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsCisJMHg3MGRjLCAweGEyMzYsIDB4MDA0MCwgMHgzZDUyLCAweDc4ZTAsIDB4YTUzNCwgMHgwMDQwLCAweDNkNTIsCisJMHhjMWJkLCAweDcxZDYsIDB4ZDFiNCwgMHgwMGMwLCAweDI5YzEsIDB4MjMwMCwgMHhhNDA1LCAweDAwNDAsCisJMHgyOWMxLCAweDcwYTQsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MmEwYiwgMHgwMDdjLCAweDYwMjAsCisJMHhhMDA1LCAweDAwNDAsIDB4M2Q3ZCwgMHg4MDAxLCAweDYwMjIsIDB4NjAwOCwgMHhhMDg1LCAweDAwMDgsCisJMHg2MDBhLCAweDcwMGYsIDB4MDEwMCwgMHg3MDJjLCAweDYwMjYsIDB4MDA3YywgMHhhMDA2LCAweDEwNzgsCisJMHg0NTg2LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4M2Q4YiwgMHg3MDY0LCAweGEwODYsCisJMHgwMDA1LCAweDAwYzAsIDB4M2Q5NSwgMHg2ODJiLCAweDAwMDAsIDB4NjgxNywgMHgwMDAwLCAweDY4MWIsCisJMHgwMDAxLCAweDY4MjMsIDB4MDA0MCwgMHg2ODFmLCAweDAxMDAsIDB4NzAwMCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMDc5LCAweDNkOWEsIDB4MjljNSwgMHgzZGFhLCAweDNkYTQsIDB4M2RjYywgMHgzZGI0LCAweDI5YzUsCisJMHgzZGEyLCAweDNkYTIsIDB4MTA3OCwgMHgyOTZiLCAweDEwNzgsIDB4M2RkNywgMHgxMDc4LCAweDNkZDAsCisJMHgwMDc4LCAweDNkYjAsIDB4MTA3OCwgMHgzZGQ3LCAweDcwNWMsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsCisJMHgxMDc4LCAweDIwMmMsIDB4MDA3OCwgMHgyOWM1LCAweDcwNjQsIDB4NzA2NywgMHgwMDAwLCAweDcwODMsCisJMHgwMDAwLCAweDAwNzksIDB4M2RiYiwgMHgzZGM4LCAweDNkYzgsIDB4M2RjMywgMHgzZGMzLCAweDNkYzMsCisJMHgzZGM4LCAweDNkYzMsIDB4M2RjOCwgMHg3N2Q0LCAweGM3ZGQsIDB4NzdkNiwgMHgwMDc5LCAweDJmMzUsCisJMHg3MDY3LCAweDAwMDAsIDB4MDA3OCwgMHgyOWM1LCAweDY4MWIsIDB4MDAwMCwgMHgwMDc4LCAweDM2YzgsCisJMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHgzZGQ1LCAweDYwMDIsIDB4NjAwNiwgMHgwMDdjLCAweDY0MTAsCisJMHg4NGZmLCAweDAwNDAsIDB4M2RlOSwgMHgyMDA5LCAweDRlMDIsIDB4MjEwNCwgMHg4MDAxLCAweDIwMGEsCisJMHg4NDIxLCAweDY0MTIsIDB4MDBjMCwgMHgzZGU5LCAweDIwMjEsIDB4NGUwNCwgMHgyNDA0LCAweGMwYTUsCisJMHgyMDIyLCAweDYwMDgsIDB4YzBhNCwgMHg2MDBhLCAweDAwN2MsIDB4NjAxOCwgMHhhMDA1LCAweDAwNDAsCisJMHgzZGYzLCAweDgwMDEsIDB4NjAxYSwgMHgwMDdjLCAweDEwNzgsIDB4NDM4MywgMHg2ODFiLCAweDAwMTgsCisJMHgwMDc4LCAweDNlMzQsIDB4MTA3OCwgMHg0MzgzLCAweDY4MWIsIDB4MDAxOSwgMHgwMDc4LCAweDNlMzQsCisJMHgxMDc4LCAweDQzODMsIDB4NjgxYiwgMHgwMDFhLCAweDAwNzgsIDB4M2UzNCwgMHgxMDc4LCAweDQzODMsCisJMHg2ODFiLCAweDAwMDMsIDB4MDA3OCwgMHgzZTM0LCAweDc3NzQsIDB4MTA3OCwgMHg0MWZlLCAweDcxNzgsCisJMHhhMThjLCAweDAwZmYsIDB4MzIxMCwgMHhhMjk0LCAweDAzMDAsIDB4MDA0MCwgMHgzZTFiLCAweGExZTgsCisJMHg5M2MwLCAweDAwNzgsIDB4M2UxZCwgMHhhMWU4LCAweDk0ZDAsIDB4MmQwNCwgMHgyZDA4LCAweDIwNjgsCisJMHhhMDA1LCAweDAwYzAsIDB4M2UyNiwgMHg3MDdlLCAweDAwNzgsIDB4MjljNSwgMHg2ODE0LCAweDcyNzQsCisJMHhhMjA2LCAweDAwNDAsIDB4M2UyZSwgMHg2ODAwLCAweDAwNzgsIDB4M2UxZSwgMHg2ODAwLCAweDIwMGEsCisJMHg2ODFiLCAweDAwMDUsIDB4NzA3ZiwgMHgwMDAwLCAweDEwNzgsIDB4M2RkNywgMHg2ODIwLCAweGQwODQsCisJMHgwMGMwLCAweDNlM2MsIDB4MTA3OCwgMHgzZGQwLCAweDEwNzgsIDB4M2RlZCwgMHg2ODFmLCAweDAwMDAsCisJMHg2ODIzLCAweDAwMjAsIDB4MTA3OCwgMHgyMDJjLCAweDAwNzgsIDB4MjljNSwgMHhhMjgyLCAweDAwMDMsCisJMHgwMGMwLCAweDQwYjcsIDB4N2RhOCwgMHhhNWFjLCAweDAwZmYsIDB4N2U1YSwgMHg3ZWE4LCAweGE2YjQsCisJMHgwMGZmLCAweDY5MjAsIDB4YzFiZCwgMHg2OTIyLCAweGQxYzQsIDB4MDA0MCwgMHgzZWExLCAweGMxYzQsCisJMHg2OTIyLCAweGE2YjQsIDB4MDBmZiwgMHgwMDQwLCAweDNlOGUsIDB4YTY4MiwgMHgwMDBjLCAweDAwNDgsCisJMHgzZTY1LCAweDAwNDAsIDB4M2U2NSwgMHgyMDMxLCAweDAwMGMsIDB4MjUwMCwgMHhhMDg2LCAweDAwMGEsCisJMHgwMDQwLCAweDNlNmMsIDB4ODUyYiwgMHg4NTJiLCAweDEwNzgsIDB4NDE5MCwgMHgwMDQwLCAweDNlNzQsCisJMHgxMDc4LCAweDNmNmYsIDB4MDA3OCwgMHgzZTk3LCAweDEwNzgsIDB4NDE0YiwgMHgwYzdlLCAweDI5NjAsCisJMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LCAweDEwNzgsIDB4M2ZhNSwgMHgwYzdmLCAweDY5MjAsCisJMHhjMWM1LCAweDY5MjIsIDB4N2U1OCwgMHhjNjk1LCAweDdlNWEsIDB4ZDZkNCwgMHgwMGMwLCAweDNlOGIsCisJMHg3ODFiLCAweDAwNjQsIDB4MDA3YywgMHg3ODFiLCAweDAwNzgsIDB4MDA3YywgMHgwYzdlLCAweDI5NjAsCisJMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LCAweDEwNzgsIDB4M2ZhNSwgMHgwYzdmLCAweDdlNTgsCisJMHhkNmQ0LCAweDAwYzAsIDB4M2U5ZSwgMHg3ODFiLCAweDAwNjcsIDB4MDA3YywgMHg3ODFiLCAweDAwNzksCisJMHgwMDdjLCAweDBjN2UsIDB4NzA1OCwgMHgyMDYwLCAweDYxMDAsIDB4ZDFlNCwgMHgwMDQwLCAweDNlZWEsCisJMHg2MjA4LCAweDgyMTcsIDB4YTI5NCwgMHgwMGZmLCAweGEyODIsIDB4MDAwYywgMHgwMDQ4LCAweDNlYjQsCisJMHgwMDQwLCAweDNlYjQsIDB4MjAxMSwgMHgwMDBjLCAweDI2MDAsIDB4YTIwMiwgMHgwMGM4LCAweDNlYjksCisJMHgyMjMwLCAweDYyMDgsIDB4YTI5NCwgMHgwMGZmLCAweDIwMDEsIDB4NGUwNSwgMHgyMDA0LCAweGQwZTQsCisJMHgwMGMwLCAweDNlY2UsIDB4NzhlYywgMHhkMGU0LCAweDAwNDAsIDB4M2VjZSwgMHhhMjgyLCAweDAwMGEsCisJMHgwMGM4LCAweDNlZDQsIDB4MjAxMSwgMHgwMDBhLCAweDAwNzgsIDB4M2VkNCwgMHhhMjgyLCAweDAwMGMsCisJMHgwMGM4LCAweDNlZDQsIDB4MjAxMSwgMHgwMDBjLCAweDIyMDAsIDB4YTUwMiwgMHgwMGM4LCAweDNlZDksCisJMHgyMjI4LCAweDEwNzgsIDB4NDE0ZiwgMHgyNTAwLCAweGEwODYsIDB4MDAwYSwgMHgwMDQwLCAweDNlZTIsCisJMHg4NTJiLCAweDg1MmIsIDB4MTA3OCwgMHg0MTkwLCAweDAwNDAsIDB4M2VlYSwgMHgxMDc4LCAweDNmNmYsCisJMHgwMDc4LCAweDNlZWUsIDB4MTA3OCwgMHg0MTRiLCAweDEwNzgsIDB4M2ZhNSwgMHg3ODU4LCAweGMwOTUsCisJMHg3ODVhLCAweDBjN2YsIDB4NzgxYiwgMHgwMDc4LCAweDAwN2MsIDB4MGM3ZSwgMHgyOTYwLCAweDYwMDAsCisJMHhkMGU0LCAweDAwYzAsIDB4M2YwYiwgMHhhMDg0LCAweDAwNDAsIDB4MDBjMCwgMHgzZjA1LCAweDYxMDQsCisJMHhhMThjLCAweGZmZjUsIDB4NjEwNiwgMHgwYzdmLCAweDAwN2MsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksCisJMHgwMDAwLCAweDAwNzgsIDB4M2YzNiwgMHg2OGEwLCAweGQwY2MsIDB4MDBjMCwgMHgzZjA1LCAweDYyMDgsCisJMHhhMjk0LCAweDAwZmYsIDB4MjAwMSwgMHg0ZTA1LCAweDIwMDQsIDB4ZDBlNCwgMHgwMGMwLCAweDNmMjQsCisJMHg3OGVjLCAweGQwZTQsIDB4MDA0MCwgMHgzZjI0LCAweGEyODIsIDB4MDAwYiwgMHgwMGM4LCAweDNmMjQsCisJMHgyMDExLCAweDAwMGEsIDB4MDA3OCwgMHgzZjJhLCAweGEyODIsIDB4MDAwYywgMHgwMGM4LCAweDNmMmEsCisJMHgyMDExLCAweDAwMGMsIDB4NjMwOCwgMHg4MzFmLCAweGEzOWMsIDB4MDBmZiwgMHhhMzgyLCAweDAwMGMsCisJMHgwMDQ4LCAweDNmMzYsIDB4MDA0MCwgMHgzZjM2LCAweDIwMTksIDB4MDAwYywgMHg3OGFiLCAweDAwMDEsCisJMHg3OGFiLCAweDAwMDMsIDB4NzhhYiwgMHgwMDAxLCAweDdhYWEsIDB4N2JhYSwgMHhhOGMwLCAweDAwMDUsCisJMHg2ODIwLCAweGMwYzUsIDB4NjgyMiwgMHg3MGQ0LCAweGQwYjQsIDB4MDA0MCwgMHgzZjUyLCAweGMwYjQsCisJMHg3MGQ2LCAweDcwYjgsIDB4YTA2NSwgMHg2MDA4LCAweGEwODQsIDB4ZmJlZiwgMHg2MDBhLCAweDYwMTgsCisJMHg4MDAxLCAweDYwMWEsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4Mjk2MCwgMHg2MTA0LCAweGExOGMsCisJMHhmZmY1LCAweDYxMDYsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LCAweDNmNjAsCisJMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLCAweDdiYWEsCisJMHhhOGMwLCAweDAwMDUsIDB4NjgyMCwgMHhjMGM1LCAweDY4MjIsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHg3MTU4LCAweDIxNjAsIDB4MjAxOCwgMHhhMDhjLCAweDAwMjAsIDB4MDA0MCwgMHgzZjc4LCAweGMwYWMsCisJMHgyMDA4LCAweGEwODQsIDB4ZmZmMCwgMHhhNjM1LCAweDdlODYsIDB4NjAxOCwgMHg3ODlhLCAweDdlYWUsCisJMHg2NjEyLCAweDc4YTQsIDB4YTA4NCwgMHhmZmYwLCAweGExOGMsIDB4MDAwZiwgMHhhMTA1LCAweGMwZjQsCisJMHhhMzljLCAweDAwMjAsIDB4MDA0MCwgMHgzZjhlLCAweGEwODUsIDB4NDAwMCwgMHhjMGZjLCAweGQwYjQsCisJMHgwMGMwLCAweDNmOTMsIDB4YzBmZCwgMHg3OGE2LCAweDYwMTYsIDB4Nzg4YSwgMHhhNmI0LCAweDAwMGYsCisJMHg4NjM3LCAweDgyMDQsIDB4ODAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTYwNSwgMHg2MDBlLCAweDYwMDQsCisJMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHg3MDU4LCAweDIwNjAsCisJMHg2MDE4LCAweDc4OWEsIDB4NzhhNCwgMHhhMDg0LCAweGZmZjAsIDB4NzhhNiwgMHg2MDEyLCAweDc4ODQsCisJMHhhMDg0LCAweGZmZjAsIDB4Nzg4NiwgMHg2MDBjLCAweGEwODQsIDB4MDBmZiwgMHg2MDBlLCAweDBjN2YsCisJMHgwMDdjLCAweGEyODIsIDB4MDAwMiwgMHgwMGMwLCAweDQwYjcsIDB4N2FhOCwgMHg2OTIwLCAweGMxYmQsCisJMHg2OTIyLCAweGQxY2MsIDB4MDA0MCwgMHgzZmY0LCAweGMxY2MsIDB4NjkyMiwgMHhhMjk0LCAweDAwZmYsCisJMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwgMHg0MGI3LCAweDEwNzgsIDB4NDA0NCwgMHgxMDc4LCAweDNmYTUsCisJMHhhOTgwLCAweDAwMDEsIDB4MjAwYywgMHgxMDc4LCAweDQxZmEsIDB4MTA3OCwgMHgzZWY1LCAweDg4ZmYsCisJMHgwMDQwLCAweDNmZWEsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHg3ZTU4LCAweGM2OTUsCisJMHg3ZTVhLCAweGQ2ZDQsIDB4MDBjMCwgMHgzZmU3LCAweDc4MWIsIDB4MDA2NCwgMHgwMDdjLCAweDc4MWIsCisJMHgwMDc4LCAweDAwN2MsIDB4N2U1OCwgMHhkNmQ0LCAweDAwYzAsIDB4M2ZmMSwgMHg3ODFiLCAweDAwNjcsCisJMHgwMDdjLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLCAweGEyODIsIDB4MDAwMiwgMHgwMGM4LCAweDNmZmMsCisJMHhhMjg0LCAweDAwMDEsIDB4MDA0MCwgMHg0MDA1LCAweDcxNTgsIDB4YTE4OCwgMHgwMDAwLCAweDIxMGMsCisJMHhkMWVjLCAweDAwYzAsIDB4NDAwNSwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg0MTJjLCAweDEwNzgsCisJMHg0MDQ0LCAweDEwNzgsIDB4M2ZhNSwgMHg3ODU4LCAweGMwOTUsIDB4Nzg1YSwgMHg3ODFiLCAweDAwNzgsCisJMHgwMDdjLCAweDBjN2UsIDB4MDI3ZSwgMHgyOTYwLCAweDYwMDAsIDB4MjAxMSwgMHgwMDAxLCAweGQwZWMsCisJMHgwMGMwLCAweDQwMjUsIDB4YTA4NCwgMHgwMDgwLCAweDAwYzAsIDB4NDAyMywgMHhjMWE0LCAweDYxMDYsCisJMHhhMDA2LCAweDAwNzgsIDB4NDA0MSwgMHgyMDExLCAweDAwMDAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsCisJMHgwMDAyLCAweDc4YWIsIDB4MDAwMywgMHg3YWFhLCAweGE4YzAsIDB4MDAwNCwgMHg3MGQ0LCAweGQwYjQsCisJMHgwMDQwLCAweDQwM2QsIDB4YzBiNCwgMHg3MGQ2LCAweDcwYjgsIDB4YTA2NSwgMHg2MDA4LCAweGEwODQsCisJMHhmYmVmLCAweDYwMGEsIDB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4NjgyMCwgMHhhMDg1LCAweDAyMDAsCisJMHg2ODIyLCAweDAyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NzA1OCwgMHgyMDYwLCAweDgyZmYsCisJMHgwMDQwLCAweDQwNGMsIDB4MjAxMSwgMHgwMDQwLCAweDYwMTgsIDB4YTA4MCwgMHgwMDAyLCAweDc4OWEsCisJMHg3OGE0LCAweGEwODQsIDB4ZmZiZiwgMHhhMjA1LCAweGMwZmMsIDB4ZDBiNCwgMHgwMGMwLCAweDQwNTksCisJMHhjMGZkLCAweDc4YTYsIDB4NjAxNiwgMHg3ODhhLCAweDYwMDQsIDB4YzBhNCwgMHg2MDA2LCAweDBjN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHg0MDZhLCAweDAwN2YsCisJMHgwMDc4LCAweDQwNmQsIDB4MDA3ZiwgMHgwMDc4LCAweDQwYjQsIDB4ZDZhYywgMHgwMDQwLCAweDQwYjQsCisJMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDQwYjQsIDB4N2JiOCwgMHhhMzg0LCAweDAwM2YsCisJMHg4MzFiLCAweDAwYzgsIDB4NDA3YywgMHg4MDAwLCAweGEwMDUsIDB4MDA0MCwgMHg0MDkxLCAweDgzMWIsCisJMHgwMGM4LCAweDQwODUsIDB4ODAwMSwgMHgwMDQwLCAweDQwYjEsIDB4ZDZmNCwgMHgwMDQwLCAweDQwOTEsCisJMHg3OGI4LCAweDgwMWIsIDB4MDBjOCwgMHg0MDhkLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweDAwYzAsCisJMHg0MGIxLCAweGM2ZjQsIDB4N2U1YSwgMHg3OWQ4LCAweDdhZGMsIDB4MjAwMSwgMHgwMDAxLCAweGExMDgsCisJMHgwMGM4LCAweDQwOWMsIDB4YTI5MSwgMHgwMDAwLCAweDc5ZDIsIDB4NzlkYSwgMHg3YWQ2LCAweDdhZGUsCisJMHgxMDc4LCAweDQ5YzMsIDB4NzgxYiwgMHgwMDc2LCAweGIyODQsIDB4MDMwMCwgMHgwMDQwLCAweDQwYWMsCisJMHgyMDAxLCAweDAwMDAsIDB4MDA3OCwgMHg0MGFlLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDQ4NGIsCisJMHgwMDdjLCAweDc4MWIsIDB4MDA3NiwgMHgwMDdjLCAweDc4MWIsIDB4MDA3OSwgMHgwMDdjLCAweDEwNzgsCisJMHg0MGRmLCAweDc4MWIsIDB4MDA3OCwgMHgwMDdjLCAweDEwNzgsIDB4NDBjOCwgMHg3ODFiLCAweDAwNzgsCisJMHgwMDdjLCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDQwZDAsIDB4NzgxYiwgMHgwMDc4LCAweDAwN2MsCisJMHgyMDAxLCAweDAwMDUsIDB4MDA3OCwgMHg0MGUxLCAweDIwMDEsIDB4MDAwYywgMHgwMDc4LCAweDQwZTEsCisJMHg2ODIwLCAweGMwZDUsIDB4NjgyMiwgMHgyMDAxLCAweDAwMDYsIDB4MDA3OCwgMHg0MGUxLCAweDIwMDEsCisJMHgwMDBkLCAweDAwNzgsIDB4NDBlMSwgMHgyMDAxLCAweDAwMDksIDB4MDA3OCwgMHg0MGUxLCAweDIwMDEsCisJMHgwMDA3LCAweDc4OWIsIDB4MDA3ZSwgMHg3OGFhLCAweGM2OWQsIDB4N2U1YSwgMHg3MGQ0LCAweGQwYjQsCisJMHgwMDQwLCAweDQwZjcsIDB4YzBiNCwgMHg3MGQ2LCAweDBjN2UsIDB4NzBiOCwgMHhhMDY1LCAweDYwMDgsCisJMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHg2MDE4LCAweDgwMDEsIDB4NjAxYSwgMHgwYzdmLCAweDAwN2MsCisJMHgwNzdlLCAweDg3M2YsIDB4YTdiYywgMHgwMDBmLCAweDg3M2IsIDB4ODczYiwgMHg4NzAzLCAweDAxN2UsCisJMHhiMjhjLCAweDAzMDAsIDB4MDA0MCwgMHg0MTA4LCAweGEwZTAsIDB4NTJjMCwgMHgwMDc4LCAweDQxMGEsCisJMHhhMGUwLCAweDUzNDAsIDB4MDE3ZiwgMHhhN2I4LCAweDAwMjAsIDB4N2Y5YSwgMHg3OWE0LCAweGExODQsCisJMHgwMDBmLCAweDAwNDAsIDB4NDExYSwgMHhhMTg0LCAweGZmZjAsIDB4NzhhNiwgMHg2MDEyLCAweDYwMDQsCisJMHhjMDlkLCAweDYwMDYsIDB4ODczOCwgMHg4NzM4LCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LCAweDAwNDAsCisJMHgwMDQwLCAweDQxMmEsIDB4YTE4NCwgMHhmZmJmLCAweGMwZmQsIDB4NzhhNiwgMHg2MDE2LCAweDYwMDQsCisJMHhjMGE1LCAweDYwMDYsIDB4MDc3ZiwgMHgwMDdjLCAweDc4OWIsIDB4MDAxMCwgMHg3OGFiLCAweDAwMDEsCisJMHg3OGFiLCAweDAwMDIsIDB4NzhhYiwgMHgwMDAzLCAweDdhYWEsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsCisJMHgwMDA0LCAweDcwZDQsIDB4ZDBiNCwgMHgwMDQwLCAweDQxNGEsIDB4YzBiNCwgMHg3MGQ2LCAweDBjN2UsCisJMHg3MGI4LCAweGEwNjUsIDB4NjAwOCwgMHhhMDg0LCAweGZiZWYsIDB4NjAwYSwgMHg2MDE4LCAweDgwMDEsCisJMHg2MDFhLCAweDBjN2YsIDB4MDA3YywgMHgyMDMxLCAweDAwMDAsIDB4MjAyOSwgMHgwMDMyLCAweDc4OWIsCisJMHgwMDEwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLCAweDAwMDMsIDB4NzhhYiwgMHgwMDAxLCAweDdkYWEsCisJMHg3ZWFhLCAweDc4OWIsIDB4MDA2MCwgMHg3OGFiLCAweDAwMDUsIDB4NzBkNCwgMHhkMGI0LCAweDAwNDAsCisJMHg0MTZlLCAweGMwYjQsIDB4NzBkNiwgMHgwYzdlLCAweDcwYjgsIDB4YTA2NSwgMHg2MDA4LCAweGEwODQsCisJMHhmYmVmLCAweDYwMGEsIDB4NjAxOCwgMHg4MDAxLCAweDYwMWEsIDB4MGM3ZiwgMHgwMDdjLCAweDE1N2UsCisJMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIwLCAweDc4OWEsCisJMHg3OWE0LCAweGExOGMsIDB4ZmZmMCwgMHgyMDIxLCAweDQxZTMsIDB4MjAxOSwgMHgwMDExLCAweDIwYTksCisJMHgwMDBlLCAweDIwMTEsIDB4MDAzMiwgMHgyNDA0LCAweGEwODQsIDB4ZmZmMCwgMHhhMTA2LCAweDAwNDAsCisJMHg0MThlLCAweDg0MjAsIDB4MjMwMCwgMHhhMjEwLCAweDAwZjAsIDB4NDE4MywgMHgxNTdmLCAweDAwN2MsCisJMHgxNTdlLCAweDIwMDEsIDB4NGUwNSwgMHgyMDA0LCAweGQwZTQsIDB4MDBjMCwgMHg0MWMxLCAweDIwMjEsCisJMHg0MWYxLCAweDIwYTksIDB4MDAwOSwgMHgyMDExLCAweDAwMjgsIDB4YTU4MiwgMHgwMDE5LCAweDAwNDAsCisJMHg0MWQ3LCAweDAwNDgsIDB4NDFkNywgMHg4NDIwLCAweDk1YTksIDB4MjAxMSwgMHgwMDMyLCAweGE1ODIsCisJMHgwMDMyLCAweDAwNDAsIDB4NDFkNywgMHgwMDQ4LCAweDQxZDcsIDB4ODQyMCwgMHg5NWE5LCAweDIwMTksCisJMHgwMDBhLCAweDIwMTEsIDB4MDA2NCwgMHgyMjAwLCAweGE1MDIsIDB4MDA0MCwgMHg0MWQ3LCAweDAwNDgsCisJMHg0MWQ3LCAweDg0MjAsIDB4MjMwMCwgMHhhMjEwLCAweDAwZjAsIDB4NDFiMywgMHgxNTdmLCAweDAwNzgsCisJMHg0MWQ1LCAweDIwMjEsIDB4NDFlMywgMHgyMDE5LCAweDAwMTEsIDB4MjBhOSwgMHgwMDBlLCAweDIwMTEsCisJMHgwMDMyLCAweDIyMDAsIDB4YTUwMiwgMHgwMDQwLCAweDQxZDcsIDB4MDA0OCwgMHg0MWQ3LCAweDg0MjAsCisJMHgyMzAwLCAweGEyMTAsIDB4MDBmMCwgMHg0MWM5LCAweDE1N2YsIDB4YTAwNiwgMHgwMDdjLCAweDE1N2YsCisJMHhhNTgyLCAweDAwNjQsIDB4MDBjOCwgMHg0MWUwLCAweDc4MDgsIDB4YTA4NSwgMHgwMDcwLCAweDc4MGEsCisJMHgyNDA0LCAweGEwMDUsIDB4MDA3YywgMHgxMjA5LCAweDMwMDIsIDB4MzIwMiwgMHg0MjAzLCAweDQ0MDMsCisJMHg1NDA0LCAweDU2MDQsIDB4NjYwNSwgMHg2ODA1LCAweDc4MDYsIDB4N2EwNiwgMHgwYzA3LCAweDBjMDcsCisJMHgwZTA3LCAweDEwZTEsIDB4MzMwYSwgMHg1ODA1LCAweDVhMDUsIDB4NmEwNiwgMHg2YzA2LCAweDdjMDcsCisJMHg3ZTA3LCAweDBlMDAsIDB4Nzg5YiwgMHgwMDEwLCAweGEwNDYsIDB4MDA3YywgMHhhNzg0LCAweDBmMDAsCisJMHg4MDBiLCAweGE3ODQsIDB4MDAxZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGExMDUsCisJMHhkN2ZjLCAweDAwNDAsIDB4NDIwZiwgMHhhMGUwLCAweDczYzAsIDB4MDA3OCwgMHg0MjExLCAweGEwZTAsCisJMHg1M2MwLCAweDAwN2MsIDB4MGU3ZSwgMHgwZjdlLCAweGQwODQsIDB4MDA0MCwgMHg0MjFmLCAweDIwNzksCisJMHgwMTAwLCAweDIwMDksIDB4NGU4MCwgMHgyMDcxLCAweDRlODAsIDB4MDA3OCwgMHg0MjJmLCAweDIwMDksCisJMHg0ZTQwLCAweDIwNzEsIDB4NGU0MCwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwNDAsCisJMHg0MjJkLCAweDIwNzksIDB4MDEwMCwgMHgwMDc4LCAweDQyMmYsIDB4MjA3OSwgMHgwMjAwLCAweDIwOTEsCisJMHg4MDAwLCAweDIxMDQsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksIDB4NDIzNiwgMHg0MjQwLCAweDQyNDAsCisJMHg0MjQwLCAweDQyNDAsIDB4NDI0MCwgMHg0MjQwLCAweDQyM2UsIDB4NDIzZSwgMHgxMDc4LCAweDI5NmIsCisJMHg2OWI0LCAweGMxZjUsIDB4YTE4YywgMHhmZjlmLCAweDY5YjYsIDB4YTAwNSwgMHgwMDQwLCAweDQyOGYsCisJMHg3ODU4LCAweGEwODQsIDB4ZmY5ZiwgMHhhMDg1LCAweDYwMDAsIDB4Nzg1YSwgMHg3ODI4LCAweGEwODYsCisJMHgxODE0LCAweDAwYzAsIDB4NDI4ZiwgMHg3ODRiLCAweDAwMDQsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDQsCisJMHgwMGMwLCAweDQyNTUsIDB4Nzg0YiwgMHgwMDA4LCAweDc4NDgsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsCisJMHg0MjVjLCAweDc4MzAsIDB4ZDBiYywgMHgwMGMwLCAweDQyOGYsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsCisJMHgyMDA0LCAweGQwZWMsIDB4MDA3ZiwgMHgwMDQwLCAweDQyNzEsIDB4YjI4NCwgMHgwMzAwLCAweDAwNzgsCisJMHg0MjczLCAweGIyODQsIDB4MDQwMCwgMHgwMDQwLCAweDQyNzksIDB4MDAxOCwgMHg0MjhmLCAweDAwNzgsCisJMHg0MjdiLCAweDAwMjgsIDB4NDI4ZiwgMHg3OWU0LCAweGExODQsIDB4MDAzMCwgMHgwMDQwLCAweDQyOGYsCisJMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDQyOGYsIDB4NjgxYywgMHhkMGFjLCAweDAwYzAsCisJMHg0MjhkLCAweDEwNzgsIDB4NDMxOSwgMHgwMDc4LCAweDQyOGYsIDB4NzgxYiwgMHgwMGY5LCAweDBmN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgyMDAxLCAweDRlMDEsIDB4MjAwNCwgMHhkMGFjLCAweDAwYzAsCisJMHg0MzBiLCAweDY4MTQsIDB4ODAwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsCisJMHhiMjhjLCAweDAzMDAsIDB4MDA0MCwgMHg0MmE4LCAweGEwZTAsIDB4NTJjMCwgMHgwMDc4LCAweDQyYWEsCisJMHhhMGUwLCAweDUzNDAsIDB4NjAwNCwgMHhhMDg0LCAweDAwMGEsIDB4MDBjMCwgMHg0MzBiLCAweDYxMDgsCisJMHhhMTk0LCAweGZmMDAsIDB4MDA0MCwgMHg0MzBiLCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLCAweDAwMGEsCisJMHhhMTA2LCAweDAwNDAsIDB4NDJkNiwgMHgyMDAxLCAweDAwMGMsIDB4YTEwNiwgMHgwMDQwLCAweDQyZGEsCisJMHgyMDAxLCAweDAwMTIsIDB4YTEwNiwgMHgwMDQwLCAweDQyZGUsIDB4MjAwMSwgMHgwMDE0LCAweGExMDYsCisJMHgwMDQwLCAweDQyZTIsIDB4MjAwMSwgMHgwMDE5LCAweGExMDYsIDB4MDA0MCwgMHg0MmU2LCAweDIwMDEsCisJMHgwMDMyLCAweGExMDYsIDB4MDA0MCwgMHg0MmVhLCAweDAwNzgsIDB4NDJlZSwgMHgyMDA5LCAweDAwMGMsCisJMHgwMDc4LCAweDQyZjAsIDB4MjAwOSwgMHgwMDEyLCAweDAwNzgsIDB4NDJmMCwgMHgyMDA5LCAweDAwMTQsCisJMHgwMDc4LCAweDQyZjAsIDB4MjAwOSwgMHgwMDE5LCAweDAwNzgsIDB4NDJmMCwgMHgyMDA5LCAweDAwMjAsCisJMHgwMDc4LCAweDQyZjAsIDB4MjAwOSwgMHgwMDNmLCAweDAwNzgsIDB4NDJmMCwgMHgyMDExLCAweDAwMDAsCisJMHgyMTAwLCAweGEyMDUsIDB4NjAwYSwgMHg2MDA0LCAweGEwODUsIDB4MDAwMiwgMHg2MDA2LCAweDIwNjEsCisJMHg0ZTAwLCAweDYwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDQzMGIsIDB4NjgxNCwgMHhkMGZjLCAweDAwYzAsCisJMHg0MzA2LCAweDYwZWEsIDB4MjA2MSwgMHg0ZTQwLCAweDAwNzgsIDB4NDMwOSwgMHg2MGVlLCAweDIwNjEsCisJMHg0ZTgwLCAweDYwMWYsIDB4ODAwZiwgMHgwYzdmLCAweDAwN2MsIDB4NzgxYiwgMHgwMDc5LCAweDAwN2MsCisJMHg3ODFiLCAweDAwNzgsIDB4MDA3YywgMHg3ODFiLCAweDAwNjcsIDB4MDA3YywgMHg3ODFiLCAweDAwNjQsCisJMHgwMDdjLCAweDIwMDksIDB4NGUxOSwgMHgyMTBjLCAweGExODYsIDB4MDAwMCwgMHgwMDQwLCAweDQzMmIsCisJMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHg0MzJlLCAweDcwMWYsIDB4MDAwYiwgMHg3MDY3LCAweDAwMDEsCisJMHg3ODFiLCAweDAwNDcsIDB4MDA3YywgMHg3ODFiLCAweDAwZjAsIDB4MDA3YywgMHg3MDFmLCAweDAwMGEsCisJMHgwMDdjLCAweDIwMDksIDB4NGUxOSwgMHgyMTBjLCAweGExODYsIDB4MDAwMCwgMHgwMDQwLCAweDQzNDYsCisJMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwgMHg0MzQzLCAweDcwMWYsIDB4MDAwYiwgMHg3MDY3LCAweDAwMDEsCisJMHg3ODFiLCAweDAwNDcsIDB4MDA3YywgMHg3MDFmLCAweDAwMGEsIDB4MDA3YywgMHg3ODFiLCAweDAwZWYsCisJMHgwMDdjLCAweDc4MWIsIDB4MDBmOSwgMHgwMDdjLCAweDc4MWIsIDB4MDBmOCwgMHgwMDdjLCAweDc4MWIsCisJMHgwMGM5LCAweDAwN2MsIDB4NzgxYiwgMHgwMGM4LCAweDAwN2MsIDB4NjgxOCwgMHhkMGZjLCAweDAwNDAsCisJMHg0MzViLCAweDY4MWIsIDB4MDAxZCwgMHg3MDY3LCAweDAwMDEsIDB4NzgxYiwgMHgwMDQ3LCAweDAwN2MsCisJMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDQzODIsIDB4NzgwOCwgMHhjMDhjLCAweDc4MGEsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDIxLCAweDAwYzAsCisJMHg0MzdmLCAweDIwMDEsIDB4NGUwNSwgMHgyMDA0LCAweGQwZTQsIDB4MDBjMCwgMHg0MzdkLCAweDc4MDQsCisJMHhhMDg0LCAweGZmMWYsIDB4YTA4NSwgMHgwMGUwLCAweDc4MDYsIDB4YTAwNiwgMHgwMDdjLCAweDc4MDgsCisJMHhjMDhkLCAweDc4MGEsIDB4MDA3YywgMHg3ODA4LCAweGMwOGQsIDB4NzgwYSwgMHgwMDdjLCAweDc4MzAsCisJMHhhMDg0LCAweDAwNDAsIDB4MDBjMCwgMHg0Mzg3LCAweDIwMDEsIDB4NGUwNCwgMHgyMDA0LCAweGQwZWMsCisJMHgwMDQwLCAweDQzOTYsIDB4YjI4NCwgMHgwMzAwLCAweDAwNzgsIDB4NDM5OCwgMHhiMjg0LCAweDA0MDAsCisJMHgwMDQwLCAweDQzOWUsIDB4MDA5OCwgMHg0M2EyLCAweDAwNzgsIDB4NDNhMCwgMHgwMGE4LCAweDQzYTIsCisJMHg3OGFjLCAweDAwN2MsIDB4NzgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NzgwYSwgMHgwMDA1LCAweDAwMDUsCisJMHgwMDA1LCAweDAwMDUsIDB4NzhlYywgMHhhMDg0LCAweDAwMjEsIDB4MDA0MCwgMHg0M2M1LCAweDAwN2UsCisJMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsIDB4MDA0MCwgMHg0M2JiLCAweGIyODQsCisJMHgwMzAwLCAweDAwNzgsIDB4NDNiZCwgMHhiMjg0LCAweDA0MDAsIDB4MDA0MCwgMHg0M2MzLCAweDAwOTgsCisJMHg0M2JmLCAweDAwNzgsIDB4NDNjNSwgMHgwMGE4LCAweDQzYzMsIDB4NzhhYywgMHgwMDdlLCAweDc4MDgsCisJMHhhMDg1LCAweDAwMDIsIDB4NzgwYSwgMHgwMDdmLCAweDAwN2MsIDB4YTc4NCwgMHgwMDAxLCAweDAwYzAsCisJMHgzNzcwLCAweGE3ODQsIDB4MDA3MCwgMHgwMDQwLCAweDQzZGQsIDB4MGM3ZSwgMHgyZDYwLCAweDJmNjgsCisJMHgxMDc4LCAweDI4ZGYsIDB4MmQ3OCwgMHgyYzY4LCAweDBjN2YsIDB4YTc4NCwgMHgwMDA4LCAweDAwNDAsCisJMHg0M2VhLCAweDc4NGIsIDB4MDAwOCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDM3NzAsCisJMHgwMDc4LCAweDQzMGQsIDB4YTc4NCwgMHgwMDA0LCAweDAwNDAsIDB4NDQxOSwgMHg3OGI4LCAweGEwODQsCisJMHg0MDAxLCAweDAwNDAsIDB4NDQxOSwgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsCisJMHgwMDQwLCAweDM3NzAsIDB4NzhlNCwgMHhhMDg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsCisJMHg0NDE5LCAweDc4YzAsIDB4YTY4NSwgMHg0ODAwLCAweDIwMzAsIDB4N2U1YSwgMHg3ODFiLCAweDAwZjksCisJMHgwMDdjLCAweDc4NGIsIDB4MDAwOCwgMHg2ODE4LCAweGQwZmMsIDB4MDA0MCwgMHg0NDE2LCAweDY4MWIsCisJMHgwMDE1LCAweGQ2ZjQsIDB4MDA0MCwgMHg0NDE2LCAweDY4MWIsIDB4MDAwNywgMHgxMDc4LCAweDQzMTksCisJMHgwMDdjLCAweDY4MWIsIDB4MDAwMywgMHg3ODU4LCAweGEwODQsIDB4M2YwMCwgMHg2ODFlLCAweDY4MmYsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsCisJMHgwMDQwLCAweDMwNjYsIDB4MDA3ZSwgMHgyMDAxLCAweDRlMDQsIDB4MjAwNCwgMHhkMGVjLCAweDAwN2YsCisJMHgwMDQwLCAweDQ0MzYsIDB4YjI4NCwgMHgwMzAwLCAweDAwNzgsIDB4NDQzOCwgMHhiMjg0LCAweDA0MDAsCisJMHgwMDQwLCAweDQ0M2UsIDB4MDAxOCwgMHgyOWMxLCAweDAwNzgsIDB4NDQ0MCwgMHgwMDI4LCAweDI5YzEsCisJMHgwMDc4LCAweDQwYmMsIDB4NmIxNCwgMHg4MzA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsCisJMHg4MDAzLCAweGQzZmMsIDB4MDA0MCwgMHg0NDUwLCAweGEwODAsIDB4NTM0MCwgMHgwMDc4LCAweDQ0NTIsCisJMHhhMDgwLCAweDUyYzAsIDB4MjA2MCwgMHgyMDQ4LCAweDcwNWEsIDB4MmE2MCwgMHgwMDdjLCAweDAwMjAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsCisJMHgwMDIwLCAweDAwNjIsIDB4MDAwOSwgMHgwMDE0LCAweDAwMTQsIDB4OTg0OCwgMHgwMDE0LCAweDAwMTQsCisJMHg5OTE0LCAweDk4ZmQsIDB4MDAxNCwgMHgwMDE0LCAweDAwODAsIDB4MDBmZiwgMHgwMTAwLCAweDA0MDIsCisJMHgyMDA4LCAweGY4ODAsIDB4MDAxOCwgMHhhMjBhLCAweDAwMTQsIDB4MzAwYiwgMHhhMjBjLCAweDAwMTQsCisJMHgyNTAwLCAweDAwMTMsIDB4MjUwMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsCisJMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsIDB4MDAxMCwgMHgwMDEwLCAweDAwMTAsCisJMHgwMDEwLCAweGEyMDAsIDB4MzgwNiwgMHg3MTAyLCAweDgwNWYsIDB4OTQ4MSwgMHg4ODM5LCAweDIwYzQsCisJMHgwODY0LCAweGE4NTYsIDB4MzAwOCwgMHgyOGMxLCAweDlkMWIsIDB4YTIwMSwgMHgzMDBjLCAweDI4NDcsCisJMHg4MTYxLCAweDg0NmEsIDB4ODAwMCwgMHg4NGE0LCAweDE4NTYsIDB4ODgzYSwgMHhhODA4LCAweDI4ZTIsCisJMHg5Y2NiLCAweGE4ZjMsIDB4MDg2NCwgMHhhODQ0LCAweDMwMGMsIDB4YTgwMSwgMHgzMDA4LCAweDI4ZTEsCisJMHg5Y2NiLCAweDIwMjEsIDB4YTgxZCwgMHhhMjA1LCAweDg3MGMsIDB4ZDhkZSwgMHg2NGEwLCAweDZkZTAsCisJMHg2ZmMwLCAweDYzYTQsIDB4NmM4MCwgMHgwMjEyLCAweGEyMDUsIDB4ODgzZCwgMHg3OTQyLCAweDgwMjAsCisJMHhhNGExLCAweDg4MmIsIDB4MTgxNCwgMHg4ODNiLCAweDgwZGYsIDB4OTRhMSwgMHg3MDI3LCAweDg1ZjIsCisJMHhhNzM3LCAweGE1MzIsIDB4ZjAwMywgMHg4NTc2LCAweDg2NzcsIDB4YTgxNiwgMHg4ODNlLCAweGE4MTQsCisJMHgyMDAxLCAweGE4MTIsIDB4YTIwNCwgMHg2NGMwLCAweDZkZTAsIDB4NjdhMCwgMHg2ZmMwLCAweDc5NDIsCisJMHg4MDIwLCAweGE0YTEsIDB4MTgxNCwgMHg4MGRmLCAweDk0YTEsIDB4ODgzYiwgMHg3MDIzLCAweDg1NzYsCisJMHg4Njc3LCAweGE4MDIsIDB4Nzg2MSwgMHg4ODNlLCAweDIwNmIsIDB4MjhjMSwgMHg5ZDFiLCAweDIwNDQsCisJMHgyMTAzLCAweDIwYTIsIDB4MjA4MSwgMHhhOGMzLCAweGEyMDcsIDB4MDkwNCwgMHhhMjBlLCAweGE4MDksCisJMHhhMjAzLCAweDgwMDAsIDB4ODVhNCwgMHgxODcyLCAweDg3OWEsIDB4ODgzYywgMHgxZmUyLCAweGY2MDEsCisJMHhhMjA4LCAweDg1NmUsIDB4ODY2ZiwgMHg3MTYxLCAweDAwMTQsIDB4MDcwNCwgMHgzMDA4LCAweDljY2IsCisJMHgwMDE0LCAweGEyMDIsIDB4ODAwMCwgMHg4NWE0LCAweDMwMDksIDB4ODRhOCwgMHgxOWUyLCAweGY4NDQsCisJMHg4NTZlLCAweDg4M2YsIDB4MDhlNiwgMHhhOGY1LCAweGY4NjEsIDB4YThlYSwgMHhmODAxLCAweDAwMTQsCisJMHhmODgxLCAweDAwMTYsIDB4ODViMiwgMHg4MGYwLCAweDk1MzIsIDB4ZmFhMiwgMHgxZGUyLCAweDAwMTQsCisJMHg4NTMyLCAweGYyMjEsIDB4MDAxNCwgMHgxZGUyLCAweDg0YTgsIDB4ZDZlMCwgMHgxZmU2LCAweDAwMTQsCisJMHgzMDA4LCAweDgwMDAsIDB4Mjg0YSwgMHgxMDExLCAweGE4ZmMsIDB4MzAwOCwgMHg5ZDMzLCAweDgwMDAsCisJMHhhMDAwLCAweDI4MDIsIDB4MTAxMSwgMHhhOGZkLCAweDlkMzksIDB4YThiZCwgMHgzMDA4LCAweDlkMzMsCisJMHgyODNiLCAweDEwMTEsIDB4YThmZCwgMHhhMjA5LCAweDcxMDIsIDB4ODA1ZiwgMHg5NDgxLCAweDAwMTcsCisJMHgzMDBjLCAweGEyMDksIDB4ODAwMCwgMHg4NWE0LCAweDFkZTIsIDB4YTIwOSwgMHhkYWMxLCAweDAwMTQsCisJMHgwMjEwLCAweGE4MDEsIDB4MDAxNCwgMHgyNmUwLCAweDg3M2EsIDB4ZmFhMywgMHgxOWYyLCAweDI2ZTAsCisJMHgxOGYyLCAweDAwMTQsIDB4YTIwYiwgMHgwMDE0LCAweGEyMGQsIDB4MzgwNiwgMHgwMjEwLCAweDlkMjUsCisJMHgwNzA0LCAweGEyMDYsIDB4Njg2NSwgMHg4MTdlLCAweDg0MmEsIDB4MWRjMSwgMHg4ODIzLCAweDAwMTYsCisJMHg2MDQyLCAweDgwMDgsIDB4YThmYSwgMHg4MDAwLCAweDg0YTQsIDB4ODE2MCwgMHg4NDJhLCAweGYwMjEsCisJMHgzMDA4LCAweDg0YTgsIDB4MTFkNiwgMHg3MDQyLCAweDIwZGQsIDB4MDAxMSwgMHgyMGQ0LCAweDg4MjIsCisJMHgwMDE2LCAweDc5NDQsIDB4ODQyMSwgMHhhMDIwLCAweGE1MzIsIDB4ODRhMSwgMHgwMDE2LCAweDc5NDQsCisJMHg4NDIxLCAweGEwZGYsIDB4OTUzMiwgMHg4NGExLCAweDAwMTYsIDB4MDAwMCwgMHgxMjdlLCAweDcwZDQsCisJMHhhMDg0LCAweDQ2MDAsIDB4ODAwNCwgMHgyMDkwLCAweDcyMDQsIDB4NzAwOCwgMHhjMDljLCAweGEyMDUsCisJMHgwMGMwLCAweDQ1YTIsIDB4NzIwYywgMHg4MmZmLCAweDAwNDAsIDB4NDU5ZCwgMHg4YWZmLCAweDAwYzAsCisJMHg0NWEyLCAweDcyMDAsIDB4ZDI4NCwgMHgwMGMwLCAweDQ1YTIsIDB4NzAwMywgMHgwMDA4LCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDMsIDB4NzAwMiwgMHhjNjljLCAweGQwODQsCisJMHgwMDQwLCAweDQ1ZTUsIDB4NzEwOCwgMHgwMDA1LCAweDcwMDgsIDB4YTEwNiwgMHgwMGMwLCAweDQ1YWEsCisJMHhhMTg0LCAweDAwMDMsIDB4MDA0MCwgMHg0NjE2LCAweGExODQsIDB4MDFlMCwgMHgwMGMwLCAweDQ2MTYsCisJMHhkMWY0LCAweDAwYzAsIDB4NDVhYSwgMHhhMTg0LCAweDMwMDAsIDB4YTA4NiwgMHgxMDAwLCAweDAwNDAsCisJMHg0NWFhLCAweDIwMTEsIDB4MDE4MCwgMHg3MTBjLCAweDgyMTEsIDB4MDA0MCwgMHg0NWNmLCAweDcwMDgsCisJMHhkMGY0LCAweDAwYzAsIDB4NDVhYSwgMHg3MDBjLCAweGExMDYsIDB4MDA0MCwgMHg0NWM0LCAweDcwMDcsCisJMHgwMDEyLCAweDcxMDgsIDB4MDAwNSwgMHg3MDA4LCAweGExMDYsIDB4MDBjMCwgMHg0NWQxLCAweGExODQsCisJMHgwMDAzLCAweDAwNDAsIDB4NDYxNiwgMHhkMTk0LCAweDAwNDAsIDB4NDVkMSwgMHhkMWY0LCAweDAwNDAsCisJMHg0NjE2LCAweDcwMDcsIDB4MDAwMiwgMHgwMDc4LCAweDQ1YWEsIDB4NzEwOCwgMHhkMWZjLCAweDAwNDAsCisJMHg0NWYwLCAweDEwNzgsIDB4NDc2OSwgMHg4YWZmLCAweDAwNDAsIDB4NDU4YywgMHgwMDc4LCAweDQ1ZTUsCisJMHg3MDBjLCAweGEwOGMsIDB4MDNmZiwgMHgwMDQwLCAweDQ2MWIsIDB4NzAwNCwgMHhkMDg0LCAweDAwNDAsCisJMHg0NjBkLCAweDcwMTQsIDB4YTAwNSwgMHgwMGMwLCAweDQ2MDksIDB4NzAxMCwgMHg3MzEwLCAweGEzMDYsCisJMHgwMGMwLCAweDQ1ZmQsIDB4MjMwMCwgMHhhMDA1LCAweDAwNDAsIDB4NDYwZCwgMHhhMTAyLCAweDAwYzgsCisJMHg0NWU1LCAweDcwMDcsIDB4MDAxMCwgMHgwMDc4LCAweDQ2MTYsIDB4OGFmZiwgMHgwMDQwLCAweDQ2MWIsCisJMHgxMDc4LCAweDQ5NzAsIDB4MDBjMCwgMHg0NjEwLCAweDAwNDAsIDB4NDVlNSwgMHgxMDc4LCAweDQ2YjQsCisJMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHg3MjA0LCAweDcxMDgsIDB4YzE5YywgMHg4MTAzLCAweDAwYzgsCisJMHg0NjJhLCAweDcwMDcsIDB4MDAwMiwgMHgwMDc4LCAweDQ2MWIsIDB4NzAwMywgMHgwMDA4LCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4YTIwNSwgMHgwMGMwLCAweDQ2MTYsIDB4NzAwMywgMHgwMDA4LCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4NjQyOCwgMHg4NGZmLCAweDAwNDAsIDB4NDY1ZSwgMHgyYzcwLCAweDcwMDQsCisJMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHg0NjZlLCAweDI3M2MsIDB4ODdmYiwgMHgwMGMwLCAweDQ2NGMsCisJMHgwMDQ4LCAweDQ2NDQsIDB4MTA3OCwgMHgyOTZiLCAweDYwOWMsIDB4YTA3NSwgMHgwMDQwLCAweDQ2NWUsCisJMHgwMDc4LCAweDQ2MzcsIDB4MjAzOSwgMHg0NjYzLCAweDI3MDQsIDB4YWU2OCwgMHg2ODA4LCAweGE2MzAsCisJMHg2ODBjLCAweGE1MjksIDB4ODQyMSwgMHgwMDQwLCAweDQ2NWUsIDB4ODczOCwgMHgyNzA0LCAweGEwMDUsCisJMHgwMGMwLCAweDQ2NGQsIDB4NzA5YywgMHhhMDc1LCAweDAwYzAsIDB4NDYzNywgMHgwMDdjLCAweDAwMDAsCisJMHgwMDA1LCAweDAwMDksIDB4MDAwZCwgMHgwMDExLCAweDAwMTUsIDB4MDAxOSwgMHgwMDFkLCAweDAwMDAsCisJMHgwMDAzLCAweDAwMDksIDB4MDAwZiwgMHgwMDE1LCAweDAwMWIsIDB4MDAwMCwgMHgwMDAwLCAweDQ2NjMsCisJMHg0NjYwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4NDY2MywgMHgwMDAwLCAweDQ2NmIsCisJMHg0NjY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDY2YiwgMHgwMDAwLCAweDQ2NjYsCisJMHg0NjY2LCAweDAwMDAsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4NDY2NiwgMHgwMDAwLCAweDQ2NmMsCisJMHg0NjZjLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDY2YywgMHgyMDc5LCAweDRlMDAsCisJMHgyMDcxLCAweDAwMTAsIDB4NzAwNywgMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDEsCisJMHg3ODEwLCAweGQwZWMsIDB4MDA0MCwgMHg0NmEyLCAweDIwMDksIDB4MDAwMSwgMHgyMDcxLCAweDAwMjAsCisJMHgwMDc4LCAweDQ2YTYsIDB4MjAwOSwgMHgwMDAyLCAweDIwNzEsIDB4MDA1MCwgMHg3MDA3LCAweDAwMGEsCisJMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDgxMDksIDB4MDA0MCwgMHg0NmIzLCAweDIwNzEsCisJMHgwMDIwLCAweDAwNzgsIDB4NDZhNiwgMHgwMDdjLCAweDcwMDQsIDB4ODAwNCwgMHgwMGM4LCAweDQ3M2QsCisJMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgwMGMwLCAweDQ2YjgsIDB4YTE4NCwgMHgwMWUwLCAweDAwNDAsCisJMHg0NmM1LCAweDEwNzgsIDB4NDdhYywgMHgwMDc4LCAweDQ3NjUsIDB4NzAwNywgMHgwMDEyLCAweDIwMTksCisJMHgwMDAwLCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LCAweDAwYzAsIDB4NDZjOSwgMHhhMTg0LCAweDAxZTAsCisJMHgwMDQwLCAweDQ2ZDYsIDB4MTA3OCwgMHg0N2FjLCAweDAwNzgsIDB4NDc2NSwgMHg3ODEwLCAweGQwZWMsCisJMHgwMDQwLCAweDQ2ZjAsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg0NmY0LCAweGExODQsIDB4NDAwMCwgMHgwMDQwLCAweDQ2ZjgsIDB4YTM4MiwgMHgwMDAzLCAweDAwYzgsCisJMHg0NmY4LCAweGExODQsIDB4MDAwNCwgMHgwMDQwLCAweDQ2YzksIDB4ODMxOCwgMHgwMDc4LCAweDQ2YzksCisJMHg3ODE0LCAweGQwZWMsIDB4MDBjMCwgMHg0NmY4LCAweGExODQsIDB4NDAwMCwgMHgwMGMwLCAweDQ2YzksCisJMHhhMTljLCAweDMwMGMsIDB4YTM4NiwgMHgyMDA0LCAweDAwNDAsIDB4NDcxNSwgMHhhMzg2LCAweDAwMDgsCisJMHgwMDQwLCAweDQ3MjAsIDB4NzAwNCwgMHhkMDg0LCAweDAwYzAsIDB4NDcxMSwgMHg3MTA4LCAweDcwMDgsCisJMHhhMTA2LCAweDAwYzAsIDB4NDcwNiwgMHhhMTg0LCAweDAwMDMsIDB4MDA0MCwgMHg0NzExLCAweDAwNzgsCisJMHg0N2FjLCAweGEzODYsIDB4MjAwYywgMHgwMGMwLCAweDQ2YzksIDB4NzIwMCwgMHg4MjA0LCAweDAwNDgsCisJMHg0NzIwLCAweDczMGMsIDB4YTM4NCwgMHgwM2ZmLCAweDAwNDAsIDB4NDcyMCwgMHgxMDc4LCAweDI5NmIsCisJMHg3MTA4LCAweDcwMDgsIDB4YTEwNiwgMHgwMGMwLCAweDQ3MjAsIDB4YTE4NCwgMHgwMWUwLCAweDAwNDAsCisJMHg0NzJkLCAweDEwNzgsIDB4NDdhYywgMHgwMDc4LCAweDQ3NjUsIDB4NzAwNywgMHgwMDEyLCAweDcwMDAsCisJMHhkMDg0LCAweDAwYzAsIDB4NDczZCwgMHg3MzEwLCAweDcwMTQsIDB4YTMwNSwgMHgwMDQwLCAweDQ3M2QsCisJMHg3MTBjLCAweGExODQsIDB4MDNmZiwgMHgwMGMwLCAweDQ2YjQsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsCisJMHgwMGMwLCAweDQ3M2QsIDB4YTE4NCwgMHgwMWUwLCAweDAwNDAsIDB4NDc0YSwgMHgxMDc4LCAweDQ3YWMsCisJMHgwMDc4LCAweDQ3NjUsIDB4NzAwNywgMHgwMDEyLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA0LCAweGQwOWMsCisJMHgwMGMwLCAweDQ3NGUsIDB4NzEwOCwgMHg3MDA4LCAweGExMDYsIDB4MDBjMCwgMHg0NzUyLCAweGExODQsCisJMHgwMWUwLCAweDAwNDAsIDB4NDc1ZiwgMHgxMDc4LCAweDQ3YWMsIDB4MDA3OCwgMHg0NzY1LCAweDcwMDcsCisJMHgwMDEyLCAweDcxMDgsIDB4ODEwMywgMHgwMDQ4LCAweDQ3NTIsIDB4NzAwMywgMHgwMDA4LCAweDAwN2MsCisJMHg3MTA4LCAweGExODQsIDB4MDFlMCwgMHgwMGMwLCAweDQ3YWMsIDB4NzEwOCwgMHhhMTg0LCAweDAxZTAsCisJMHgwMGMwLCAweDQ3YWMsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4NDc3NiwgMHg0NzgwLCAweDQ3OTAsCisJMHg0NzdlLCAweDQ3OTAsIDB4NDc3ZSwgMHg0N2VlLCAweDQ3N2UsIDB4NDdlYywgMHgxMDc4LCAweDI5NmIsCisJMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhjMDhkLCAweDcwMDYsIDB4OGFmZiwgMHgwMGMwLCAweDQ3OGIsCisJMHgyMDQ5LCAweDAwMDAsIDB4MDA3YywgMHgxMDc4LCAweDQ5NzAsIDB4MDBjMCwgMHg0NzhiLCAweDAwN2MsCisJMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhjMDhkLCAweDcwMDYsIDB4NzAwNCwgMHhkMDg0LCAweDAwYzAsCisJMHg0N2E0LCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LCAweDAwYzAsIDB4NDc5OSwgMHhhMTg0LCAweDAwMDMsCisJMHgwMDQwLCAweDQ3YTQsIDB4MDA3OCwgMHg0N2FjLCAweDhhZmYsIDB4MDA0MCwgMHg0N2FiLCAweDEwNzgsCisJMHg0OTcwLCAweDAwYzAsIDB4NDdhNywgMHgwMDdjLCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LCAweDAwZTAsCisJMHg0N2FmLCAweDIwOTEsIDB4NjAwMCwgMHgwMGUwLCAweDQ3YjMsIDB4MjA5MSwgMHg2MDAwLCAweDcwMDcsCisJMHgwMDEyLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA0LCAweGQwOWMsIDB4MDBjMCwgMHg0N2JiLCAweDcwMDcsCisJMHgwMDEyLCAweDcxMDgsIDB4ZDFmYywgMHgwMGMwLCAweDQ3YmYsIDB4NzAwMywgMHgwMDAwLCAweDcwMDAsCisJMHhhMDA1LCAweDAwYzAsIDB4NDdkMywgMHg3MDA0LCAweGEwMDUsIDB4MDBjMCwgMHg0N2QzLCAweDcwMGMsCisJMHhhMDA1LCAweDAwNDAsIDB4NDdkNSwgMHgwMDc4LCAweDQ3YjcsIDB4MjA0OSwgMHgwMDAwLCAweGIyODQsCisJMHgwMTAwLCAweDAwNDAsIDB4NDdkZiwgMHgyMDAxLCAweDAwMDAsIDB4MDA3OCwgMHg0N2UxLCAweDIwMDEsCisJMHgwMDAxLCAweDEwNzgsIDB4NDIxMiwgMHg2ODFiLCAweDAwMDIsIDB4MjA1MSwgMHgwMDAwLCAweDAwN2MsCisJMHgxMDc4LCAweDI5NmIsIDB4MTA3OCwgMHgyOTZiLCAweDEwNzgsIDB4NDgzNiwgMHg3MjEwLCAweDcxMTQsCisJMHg3MDBjLCAweGEwOWMsIDB4MDNmZiwgMHgyODAwLCAweGEzMDAsIDB4YTIxMSwgMHhhMTg5LCAweDAwMDAsCisJMHgxMDc4LCAweDQ4MzYsIDB4MjcwNCwgMHgyYzU4LCAweGFjNjAsIDB4NjMwOCwgMHgyMjAwLCAweGEzMjIsCisJMHg2MzBjLCAweDIxMDAsIDB4YTMxYiwgMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwgMHg0ODExLCAweDAwYzgsCisJMHg0ODExLCAweDg0MTIsIDB4ODIxMCwgMHg4MzBhLCAweGExODksIDB4MDAwMCwgMHgyYjYwLCAweDAwNzgsCisJMHg0N2Y4LCAweDJiNjAsIDB4OGEwNywgMHgwMDdlLCAweDYwMDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwNDAsCisJMHg0ODFkLCAweGE3YmEsIDB4NDY2OCwgMHgwMDc4LCAweDQ4MWYsIDB4YTdiYSwgMHg0NjYwLCAweDAwN2YsCisJMHhhNzNkLCAweDJjMDAsIDB4Njg4NiwgMHg2ZjhhLCAweDZjOTIsIDB4NmI4ZSwgMHg3MTA4LCAweDcwMDgsCisJMHhhMTA2LCAweDAwYzAsIDB4NDgyNiwgMHhhMTg0LCAweDAxZTAsIDB4MDA0MCwgMHg0ODMxLCAweDEwNzgsCisJMHg0N2FjLCAweDcwMDcsIDB4MDAxMiwgMHgxMDc4LCAweDQ2YjQsIDB4MDA3YywgMHg4YTUwLCAweDg3MzksCisJMHgyNzA0LCAweGEwMDQsIDB4MDBjMCwgMHg0ODRhLCAweDYwMDAsIDB4YTA2NCwgMHgwMGMwLCAweDQ4NDEsCisJMHgyZDYwLCAweDYwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4NDY3ZSwgMHgyMDNjLCAweDg3ZmIsCisJMHgxMDQwLCAweDI5NmIsIDB4MDA3YywgMHgxMjdlLCAweDBkN2UsIDB4NzBkNCwgMHhhMDg0LCAweDQ2MDAsCisJMHg4MDA0LCAweDIwOTAsIDB4MGQ3ZiwgMHg2ODg0LCAweDIwNjAsIDB4Njg4OCwgMHg2YjhjLCAweDZjOTAsCisJMHg4MDU3LCAweGFhZDQsIDB4MDBmZiwgMHhhMDg0LCAweDAwZmYsIDB4MDA3ZSwgMHg2ODA0LCAweGEwODQsCisJMHgwMDA4LCAweDAwN2YsIDB4MDA0MCwgMHg0ODY4LCAweGEwYjgsIDB4NDY2OCwgMHgwMDc4LCAweDQ4NmEsCisJMHhhMGI4LCAweDQ2NjAsIDB4YjI4NCwgMHgwMTAwLCAweDAwNDAsIDB4NDg3MSwgMHg3ZTIwLCAweDAwNzgsCisJMHg0ODcyLCAweDdlMjQsIDB4YTZiNSwgMHgwMDBjLCAweDY4MWMsIDB4ZDBiNCwgMHgwMDQwLCAweDQ4NzksCisJMHhjNjg1LCAweDI0MDAsIDB4YTMwNSwgMHgwMDQwLCAweDQ4YTMsIDB4MmM1OCwgMHgyNzA0LCAweDYxMDQsCisJMHhhYzYwLCAweDYwMDAsIDB4YTQwMCwgMHg3MDFhLCAweDYwMDQsIDB4YTMwMSwgMHg3MDFlLCAweGExODQsCisJMHgwMDA4LCAweDAwNDAsIDB4NDg5MywgMHg2MDEwLCAweGEwODEsIDB4MDAwMCwgMHg3MDIyLCAweDYwMTQsCisJMHhhMDgxLCAweDAwMDAsIDB4NzAyNiwgMHg2MjA4LCAweDI0MDAsIDB4YTIwMiwgMHg3MDEyLCAweDYyMGMsCisJMHgyMzAwLCAweGEyMDMsIDB4NzAxNiwgMHg3NjAyLCAweDcwMDcsIDB4MDAwMSwgMHgyYjYwLCAweDEwNzgsCisJMHg0OTliLCAweDAwNzgsIDB4NDhhNSwgMHgxMDc4LCAweDQ5NzAsIDB4MDBjMCwgMHg0OGEzLCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLCAweDcwZDQsIDB4YTA4NCwgMHg0NjAwLCAweDgwMDQsCisJMHgyMDkwLCAweDBkN2YsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4ZDA5NCwgMHgwMGMwLCAweDQ4YjQsCisJMHg3MDAzLCAweDAwMDgsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLCAweDcwZDQsCisJMHhhMDg0LCAweDQ2MDAsIDB4ODAwNCwgMHgwMDdlLCAweDIwOTAsIDB4MDA3ZiwgMHgwZDdmLCAweDdlMjAsCisJMHhiMjg0LCAweDAxMDAsIDB4MDBjMCwgMHg0OGNkLCAweDdlMjQsIDB4YTZiNSwgMHgwMDBjLCAweDY4MWMsCisJMHhkMGFjLCAweDAwYzAsIDB4NDhkOCwgMHhjNjg1LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDQsCisJMHg2ODI4LCAweDIwNTAsIDB4MmQ2MCwgMHg2MDA0LCAweGEwYmMsIDB4MDAwZiwgMHhhN2I4LCAweDQ2NmUsCisJMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwgMHg0OGVlLCAweDAwNDgsIDB4NDhlOCwgMHgxMDc4LCAweDI5NmIsCisJMHg2ODljLCAweGEwNjUsIDB4MDA0MCwgMHg0OGYyLCAweDAwNzgsIDB4NDhkYiwgMHgxMDc4LCAweDQ5NzAsCisJMHgwMGMwLCAweDQ4ZWUsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDAxN2UsCisJMHgwZDdlLCAweDcwZDQsIDB4YTA4NCwgMHg0NjAwLCAweDgwMDQsIDB4MDA3ZSwgMHgyMDkwLCAweDAwN2YsCisJMHg3ZTIwLCAweGIyODQsIDB4MDEwMCwgMHgwMGMwLCAweDQ5MDYsIDB4N2UyNCwgMHgwZDdmLCAweDAzN2YsCisJMHgwNDdmLCAweGE2YjUsIDB4MDAwYywgMHg2ODFjLCAweGQwYjQsIDB4MDA0MCwgMHg0OTE0LCAweGM2ODUsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDA0LCAweDIwNDksIDB4NDhmNSwgMHg2ODI4LCAweGEwNTUsCisJMHgwZDdlLCAweDAwNDAsIDB4NDk2YywgMHgyZDcwLCAweDJlNjAsIDB4NzAwNCwgMHhhMGJjLCAweDAwMGYsCisJMHhhN2I4LCAweDQ2NmUsIDB4MjczYywgMHg4N2ZiLCAweDAwYzAsIDB4NDkzMSwgMHgwMDQ4LCAweDQ5MmEsCisJMHgxMDc4LCAweDI5NmIsIDB4NzA5YywgMHhhMDc1LCAweDIwNjAsIDB4MDA0MCwgMHg0OTZjLCAweDAwNzgsCisJMHg0OTFkLCAweDI3MDQsIDB4YWU2OCwgMHg2ODA4LCAweGE0MjIsIDB4NjgwYywgMHhhMzFiLCAweDAwNDgsCisJMHg0OTRhLCAweDhhNTEsIDB4MDBjMCwgMHg0OTNlLCAweDEwNzgsIDB4Mjk2YiwgMHg4NzM4LCAweDI3MDQsCisJMHhhMDA1LCAweDAwYzAsIDB4NDkzMiwgMHg3MDljLCAweGEwNzUsIDB4MjA2MCwgMHgwMDQwLCAweDQ5NmMsCisJMHgwMDc4LCAweDQ5MWQsIDB4ODQyMiwgMHg4NDIwLCAweDgzMWEsIDB4YTM5OSwgMHgwMDAwLCAweDY5MDgsCisJMHgyNDAwLCAweGExMjIsIDB4NjkwYywgMHgyMzAwLCAweGExMWIsIDB4MDBjOCwgMHg0OTU5LCAweDEwNzgsCisJMHgyOTZiLCAweGIyODQsIDB4MDEwMCwgMHgwMDQwLCAweDQ5NjcsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsCisJMHhkMGVjLCAweDAwYzAsIDB4NDk2NywgMHgyMDcxLCAweDAwNTAsIDB4MDA3OCwgMHg0OTY5LCAweDIwNzEsCisJMHgwMDIwLCAweDBkN2YsIDB4MDA3OCwgMHg0ODc5LCAweDBkN2YsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsCisJMHg3MDA4LCAweDAwN2UsIDB4YTA4NCwgMHgwMWUwLCAweDAwN2YsIDB4MDA0MCwgMHg0OTc5LCAweGEwMDYsCisJMHgwMDdjLCAweGEwODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg0OTgwLCAweDAwN2MsCisJMHgyNzA0LCAweGFjNzgsIDB4NzgwMCwgMHg3MDFhLCAweDc4MDQsIDB4NzAxZSwgMHg3ODA4LCAweDcwMTIsCisJMHg3ODBjLCAweDcwMTYsIDB4NjAwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0OTkzLCAweDc4MTAsCisJMHg3MDIyLCAweDc4MTQsIDB4NzAyNiwgMHg3NjAyLCAweDcwMDQsIDB4YTA4NCwgMHgwMDEwLCAweGMwODUsCisJMHg3MDA2LCAweDIwNzksIDB4NGUwMCwgMHg4YTUxLCAweDAwNDAsIDB4NDliZiwgMHg4NzM4LCAweDI3MDQsCisJMHhhMDA1LCAweDAwYzAsIDB4NDliMSwgMHg2MDljLCAweGEwMDUsIDB4MDA0MCwgMHg0OWMwLCAweDIwNjAsCisJMHg2MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDQ2NmUsIDB4MjAzYywgMHg4N2ZiLCAweDEwNDAsCisJMHgyOTZiLCAweDcwMDgsIDB4MDA3ZSwgMHhhMDg0LCAweDAxZTAsIDB4MDA3ZiwgMHgwMDQwLCAweDQ5YmIsCisJMHhhMDA2LCAweDAwNzgsIDB4NDljMCwgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDAwN2MsCisJMHgyMDUxLCAweDAwMDAsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGQ3ZSwgMHg3MGQ0LCAweGEwODQsCisJMHg0NjAwLCAweDgwMDQsIDB4MjA5MCwgMHgwZDdmLCAweDA4N2YsIDB4NzEwOCwgMHhhMTg0LCAweDAwMDMsCisJMHgwMGMwLCAweDQ5ZDgsIDB4NjgyOCwgMHhhMDA1LCAweDAwNDAsIDB4NDllOCwgMHgwMDc4LCAweDQ1YTIsCisJMHg3MTA4LCAweGQxZmMsIDB4MDA0MCwgMHg0OWUwLCAweDEwNzgsIDB4NDc2OSwgMHgwMDc4LCAweDQ5Y2QsCisJMHg3MDA3LCAweDAwMTAsIDB4NzEwOCwgMHhkMWZjLCAweDAwNDAsIDB4NDllMiwgMHgxMDc4LCAweDQ3NjksCisJMHg3MDA4LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDQ5Y2QsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsCisJMHg0OWNkLCAweDcwMDMsIDB4MDAwMCwgMHgyMDQ5LCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsCisJMHgxMjdlLCAweDE0N2UsIDB4MTM3ZSwgMHgxNTdlLCAweDBjN2UsIDB4MGQ3ZSwgMHg3MGQ0LCAweGEwODQsCisJMHg0NjAwLCAweDgwMDQsIDB4MjA5MCwgMHgwZDdmLCAweDIwNDksIDB4NDlmOCwgMHhhZDgwLCAweDAwMTEsCisJMHgyMGEwLCAweGIyODQsIDB4MDEwMCwgMHgwMDQwLCAweDRhMWIsIDB4MjAwMSwgMHg0ZTA0LCAweDIwMDQsCisJMHhkMGVjLCAweDAwNDAsIDB4NGExNywgMHgyMDk5LCAweDAwMzEsIDB4MDA3OCwgMHg0YTFkLCAweDIwOTksCisJMHgwMDMyLCAweDAwNzgsIDB4NGExZCwgMHgyMDk5LCAweDAwMzEsIDB4NzAwYywgMHhhMDg0LCAweDAzZmYsCisJMHg2ODJhLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAxLCAweDAwNDAsCisJMHg0YTJjLCAweDgwMDAsIDB4ODBhYywgMHg1M2E1LCAweDcwMGMsIDB4YTA4NCwgMHgwM2ZmLCAweDAwNDAsCisJMHg0YTM4LCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDRhMzMsCisJMHgwYzdmLCAweDIwNDksIDB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MTU3ZiwgMHgxMzdmLCAweDE0N2YsCisJMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MjA5MSwgMHg2MDAwLCAweDc4YWMsCisJMHhhMDA1LCAweDAwYzAsIDB4NGE1YSwgMHg3OTc0LCAweDcwZDAsIDB4YTEwNiwgMHgwMGMwLCAweDRhNWEsCisJMHg3ODFjLCAweGEwMDUsIDB4MDA0MCwgMHg0YTVhLCAweDc4MWYsIDB4MDAwMCwgMHgwMDY4LCAweDRhNWEsCisJMHgyMDkxLCAweDQwODAsIDB4NzgzMCwgMHg4MDAxLCAweDc4MzIsIDB4MDBjMCwgMHg0YWUyLCAweDc4MzQsCisJMHg3ODMyLCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDRhZGIsIDB4MjA2MSwgMHg3M2MwLCAweDIwNjksCisJMHg0ZTgwLCAweGM3ZmQsIDB4NjhkMCwgMHhhMDA1LCAweDAwNDAsIDB4NGE3NCwgMHg4MDAxLCAweDY4ZDIsCisJMHgwMGMwLCAweDRhNzQsIDB4MTA3OCwgMHg0Y2IwLCAweDY4MDAsIDB4YTA4NCwgMHgwMDBmLCAweDAwNDAsCisJMHg0YTg5LCAweGEwODYsIDB4MDAwMSwgMHgwMDQwLCAweDRhODksIDB4Njg0NCwgMHhhMDBkLCAweDAwNDAsCisJMHg0YTg5LCAweDIxMDQsIDB4YTAwNSwgMHgwMDQwLCAweDRhODksIDB4ODAwMSwgMHgyMDBhLCAweDAwNDAsCisJMHg0YzIzLCAweDY4MTQsIDB4YTAwNSwgMHgwMDQwLCAweDRhYWUsIDB4ODAwMSwgMHg2ODE2LCAweDAwYzAsCisJMHg0YWFlLCAweDY4YTcsIDB4MDAwMSwgMHgwZjdlLCAweGQ3ZmMsIDB4MDBjMCwgMHg0YWEzLCAweDc4MTAsCisJMHhkMGVjLCAweDAwNDAsIDB4NGE5ZiwgMHgyMDc5LCAweDAxMDAsIDB4MDA3OCwgMHg0YWE1LCAweDIwNzksCisJMHgwMjAwLCAweDAwNzgsIDB4NGFhNSwgMHgyMDc5LCAweDAxMDAsIDB4MTA3OCwgMHg0MzgzLCAweDBmN2YsCisJMHg2ODY0LCAweGEwMDUsIDB4MDA0MCwgMHg0YWFlLCAweDEwNzgsIDB4MjYyOCwgMHg2ODgwLCAweGEwMDUsCisJMHgwMDQwLCAweDRhYmIsIDB4ODAwMSwgMHg2ODgyLCAweDAwYzAsIDB4NGFiYiwgMHg2ODY3LCAweDAwMDAsCisJMHg2OGQ0LCAweGMwZGQsIDB4NjhkNiwgMHg2OGQ0LCAweGQwZmMsIDB4MDA0MCwgMHg0YWQ4LCAweGMwZmMsCisJMHg2OGQ2LCAweDIwYTksIDB4MDIwMCwgMHg2MDM0LCAweGEwMDUsIDB4MDA0MCwgMHg0YWQ0LCAweDgwMDEsCisJMHg2MDM2LCAweDY4ZDQsIDB4YzBmZCwgMHg2OGQ2LCAweDAwYzAsIDB4NGFkNCwgMHg2MDEwLCAweGEwMDUsCisJMHgwMDQwLCAweDRhZDQsIDB4MTA3OCwgMHgyNjI4LCAweGFjZTAsIDB4MDAxMCwgMHgwMGYwLCAweDRhYzMsCisJMHhkN2ZjLCAweDAwNDAsIDB4NGFlMiwgMHgyMDYxLCAweDUzYzAsIDB4MjA2OSwgMHg0ZTQwLCAweGM3ZmMsCisJMHgwMDc4LCAweDRhNmEsIDB4MTA3OCwgMHg0YjFlLCAweDc4MzgsIDB4ODAwMSwgMHg3ODNhLCAweDAwYzAsCisJMHg0YjA0LCAweDc4M2MsIDB4NzgzYSwgMHgyMDYxLCAweDUzYzAsIDB4MjA2OSwgMHg0ZTQwLCAweGM3ZmMsCisJMHg2ODBjLCAweGEwMDUsIDB4MDA0MCwgMHg0YWY2LCAweDEwNzgsIDB4NGI4OCwgMHhkN2ZjLCAweDAwYzAsCisJMHg0YjA0LCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDRiMDQsIDB4MjA2MSwgMHg3M2MwLCAweDIwNjksCisJMHg0ZTgwLCAweGM3ZmQsIDB4MDA3OCwgMHg0YWYwLCAweDc4MTQsIDB4ZDBlNCwgMHgwMGMwLCAweDRiMDgsCisJMHg3ODEwLCAweGQwY2MsIDB4MDA0MCwgMHg0YjFiLCAweGQwYWMsIDB4MDBjMCwgMHg0YjE0LCAweGQwYTQsCisJMHgwMDQwLCAweDRiMWIsIDB4YzBhZCwgMHg3ODEyLCAweDIwOTEsIDB4ODAwMSwgMHgwMDY4LCAweDRiMWEsCisJMHgxMDc4LCAweDIzOTUsIDB4MDA3YywgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3ODQwLCAweDgwMDEsCisJMHg3ODQyLCAweDAwYzAsIDB4NGI4NywgMHg3ODQ0LCAweDc4NDIsIDB4MjA2OSwgMHg0ZTQwLCAweGM3ZmMsCisJMHg3ODEwLCAweDIwNzksIDB4MDIwMCwgMHhkMGVjLCAweDAwNDAsIDB4NGIzMCwgMHgyMDc5LCAweDAxMDAsCisJMHg2OGQ4LCAweGEwMDUsIDB4MDA0MCwgMHg0YjNjLCAweDdkZTAsIDB4YTUwNCwgMHgwMGMwLCAweDRiM2MsCisJMHg2OGRhLCAweDY4ZDQsIDB4YzBiYywgMHg2OGQ2LCAweDIwNzksIDB4NGUwMCwgMHg2ODEwLCAweGEwMDUsCisJMHgwMGMwLCAweDRiNDQsIDB4MjAwMSwgMHgwMTAxLCAweDgwMDEsIDB4NjgxMiwgMHhkN2ZjLCAweDAwNDAsCisJMHg0YjRkLCAweGEwODAsIDB4OTRkMCwgMHgwMDc4LCAweDRiNGYsIDB4YTA4MCwgMHg5M2MwLCAweDIwNDAsCisJMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHg0Yjc5LCAweDYwMjQsIDB4YTAwNSwgMHgwMDQwLCAweDRiNzUsCisJMHg4MDAxLCAweDYwMjYsIDB4MDBjMCwgMHg0Yjc1LCAweDY4MDAsIDB4YTAwNSwgMHgwMDQwLCAweDRiNjgsCisJMHg2ODRjLCAweGFjMDYsIDB4MDBjMCwgMHg0YjY4LCAweDEwNzgsIDB4NGMyMywgMHgwMDc4LCAweDRiNzksCisJMHg2ODY0LCAweGEwMDUsIDB4MDA0MCwgMHg0YjcwLCAweDYwMjcsIDB4MDAwMSwgMHgwMDc4LCAweDRiNzUsCisJMHgxMDc4LCAweDRiZDYsIDB4MjgwNCwgMHgwMDc4LCAweDRiNTEsIDB4NjAwMCwgMHgyYzQwLCAweDAwNzgsCisJMHg0YjUxLCAweGQ3ZmMsIDB4MDBjMCwgMHg0Yjg3LCAweDc4MTAsIDB4ZDBlYywgMHgwMGMwLCAweDRiODcsCisJMHgyMDY5LCAweDRlODAsIDB4YzdmZCwgMHgyMDc5LCAweDAxMDAsIDB4MDA3OCwgMHg0YjMwLCAweDAwN2MsCisJMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwMjAwLCAweDYwMDgsIDB4ZDA5YywgMHgwMDQwLCAweDRiYzIsCisJMHg2MDI0LCAweGEwMDUsIDB4MDA0MCwgMHg0Yjk4LCAweDgwMDEsIDB4NjAyNiwgMHgwMDc4LCAweDRiYzAsCisJMHg2MDA4LCAweGMwOWMsIDB4ZDA4NCwgMHgwMGMwLCAweDRiYTAsIDB4ZDBhYywgMHgwMDQwLCAweDRiYmEsCisJMHg2MDBhLCAweDYwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDRiYzIsIDB4MGQ3ZSwgMHgwYzdlLCAweDAxN2UsCisJMHgyMDY4LCAweDYwMTAsIDB4ODAwMSwgMHg2MDEyLCAweDEwNzgsIDB4M2RkMCwgMHgyZDAwLCAweDJjNjgsCisJMHgyMDYwLCAweDEwNzgsIDB4MWU1YiwgMHgxMDc4LCAweDIwMWQsIDB4MDE3ZiwgMHgwYzdmLCAweDBkN2YsCisJMHgwMDc4LCAweDRiYzIsIDB4YzBiZCwgMHg2MDBhLCAweGExOGQsIDB4MDAwMSwgMHgwMDc4LCAweDRiYzIsCisJMHhhMThkLCAweDAxMDAsIDB4YWNlMCwgMHgwMDEwLCAweDAwZjAsIDB4NGI4YywgMHhhMTg0LCAweDAwMDEsCisJMHgwMDQwLCAweDRiZDEsIDB4YTE4YywgMHhmZmZlLCAweDY5MGUsIDB4MTA3OCwgMHgyNjI4LCAweDAwNzgsCisJMHg0YmQyLCAweDY5MGUsIDB4MDA3YywgMHgwMGMwLCAweDRiZDIsIDB4Nzg2YywgMHgyYzAwLCAweDY4N2UsCisJMHg2NzE0LCAweDZmNzYsIDB4NjAxNywgMHgwMDAwLCAweDYwMmIsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDYsCisJMHg2MGI0LCAweGEwODQsIDB4M2YwMCwgMHg2MDFlLCAweDYwMjAsIDB4YTA4NCwgMHgwMGZmLCAweGEwODUsCisJMHgwMDYwLCAweDYwMjIsIDB4NjAwMCwgMHgyMDQyLCAweDEwNzgsIDB4MWRlNCwgMHg2ODE4LCAweGEwMDUsCisJMHgwMDQwLCAweDRiZjQsIDB4ODAwMSwgMHg2ODFhLCAweDY4MDgsIDB4YzBhNCwgMHg2ODBhLCAweDY4MTAsCisJMHg3OTA4LCAweDgxMDksIDB4NzkwYSwgMHg4MDAxLCAweDAwZDAsIDB4NGMwMCwgMHgxMDc4LCAweDI5NmIsCisJMHg2ODEyLCAweDAwYzAsIDB4NGMwNiwgMHg3OTEwLCAweGMxYTUsIDB4NzkxMiwgMHg2MDJmLCAweDAwMDAsCisJMHg2MDMzLCAweDAwMDAsIDB4MmM2OCwgMHgxMDc4LCAweDIwMmMsIDB4ZDdmYywgMHgwMGMwLCAweDRjMTQsCisJMHgyMDY5LCAweDRlNDAsIDB4MDA3OCwgMHg0YzE2LCAweDIwNjksIDB4NGU4MCwgMHg2OTEwLCAweGExODQsCisJMHgwMTAwLCAweDIwMDEsIDB4MDAwNiwgMHgwMGMwLCAweDRjMjAsIDB4Njk3YSwgMHgyMDAxLCAweDAwMDQsCisJMHgxMDc4LCAweDI2MWMsIDB4MDA3YywgMHgwZDdlLCAweDY5NGMsIDB4MjE2MCwgMHhkN2ZjLCAweDAwYzAsCisJMHg0YzM1LCAweDc4MTAsIDB4ZDBlYywgMHgwMDQwLCAweDRjMzEsIDB4MjA2OSwgMHgwMTAwLCAweDAwNzgsCisJMHg0YzM3LCAweDIwNjksIDB4MDIwMCwgMHgwMDc4LCAweDRjMzcsIDB4MjA2OSwgMHgwMTAwLCAweDEwNzgsCisJMHgyOGRmLCAweDYwMWIsIDB4MDAwNiwgMHg2ODU4LCAweGEwODQsIDB4M2YwMCwgMHg2MDFlLCAweDYwMjAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NSwgMHgwMDQ4LCAweDYwMjIsIDB4NjAyZiwgMHgwMDAwLCAweDYwMzMsCisJMHgwMDAwLCAweDY4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDY4MGEsIDB4NjgzMCwgMHhkMGI0LCAweDAwNDAsCisJMHg0YzY5LCAweDY4NGIsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTQsIDB4Njg0OCwgMHhkMDk0LCAweDAwNDAsCisJMHg0YzViLCAweDAwZjAsIDB4NGM1NSwgMHg2ODRiLCAweDAwMDksIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsCisJMHhkMDg0LCAweDAwNDAsIDB4NGM2NSwgMHgwMGYwLCAweDRjNWYsIDB4MjBhOSwgMHgwMGZhLCAweDAwZjAsCisJMHg0YzY3LCAweDY4MWIsIDB4MDA0NywgMHgwZDdmLCAweDY4NjcsIDB4MDAwNywgMHgwMDdjLCAweDIwNzksCisJMHg0ZTAwLCAweDEwNzgsIDB4NGNhMywgMHgxMDc4LCAweDRjODksIDB4MTA3OCwgMHg0Yzk2LCAweDIwMDksCisJMHgwMDAyLCAweDIwNjksIDB4NGU4MCwgMHg2ODBmLCAweDAwMDAsIDB4NjgxMywgMHgwMDAwLCAweDY4MTcsCisJMHgwMDAwLCAweDgxMDksIDB4MDA0MCwgMHg0Yzg4LCAweDIwNjksIDB4NGU0MCwgMHgwMDc4LCAweDRjN2IsCisJMHgwMDdjLCAweDc4MTAsIDB4ZDBlYywgMHgwMDQwLCAweDRjOTEsIDB4MjAxOSwgMHgwMGNjLCAweDAwNzgsCisJMHg0YzkzLCAweDIwMTksIDB4MDA3YiwgMHg3YjNhLCAweDdiM2UsIDB4MDA3YywgMHg3ODE0LCAweGQwZTQsCisJMHgwMGMwLCAweDRjOWUsIDB4MjAxOSwgMHgwMDQwLCAweDAwNzgsIDB4NGNhMCwgMHgyMDE5LCAweDAwMjYsCisJMHg3YjQyLCAweDdiNDYsIDB4MDA3YywgMHg3ODE0LCAweGQwZTQsIDB4MDBjMCwgMHg0Y2FiLCAweDIwMTksCisJMHgzZjk0LCAweDAwNzgsIDB4NGNhZCwgMHgyMDE5LCAweDI2MjQsIDB4N2IzMiwgMHg3YjM2LCAweDAwN2MsCisJMHg2YTUwLCAweGEyODUsIDB4MDAwMCwgMHgwMDQwLCAweDRjZGMsIDB4Njk1NCwgMHg2YmMwLCAweGEzMDAsCisJMHgwYzdlLCAweDIxNjQsIDB4NjMwNCwgMHg4M2ZmLCAweDAwYzAsIDB4NGNjOCwgMHg4MjExLCAweDAwNDAsCisJMHg0Y2NjLCAweDgxMDgsIDB4YTExYSwgMHgwMDQ4LCAweDRjYjksIDB4NjljMCwgMHgwMDc4LCAweDRjYjksCisJMHg2OGQzLCAweDAwMGEsIDB4MGM3ZiwgMHgwMDdjLCAweDY5NTAsIDB4NmFjMCwgMHgyMjY0LCAweDYwMmIsCisJMHgwMDAwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDA4LCAweGMwYjUsIDB4NjAwYSwgMHg4MjEwLCAweDgxMDksCisJMHgwMGMwLCAweDRjY2UsIDB4Njk1MiwgMHgwYzdmLCAweDAwN2MsIDB4MDBlMCwgMHg0Y2RkLCAweDIwOTEsCisJMHg2MDAwLCAweDAwZTAsIDB4NGNlMSwgMHgyMDkxLCAweDYwMDAsIDB4NzBlYywgMHhkMGRjLCAweDAwYzAsCisJMHg0Y2VlLCAweGQwZDQsIDB4MDA0MCwgMHg0ZDE3LCAweDAwNzgsIDB4NGQxYSwgMHgyMDA4LCAweDc4MTAsCisJMHhkMGVjLCAweDAwNDAsIDB4NGQwMSwgMHhkMWM0LCAweDAwYzAsIDB4NGQzOSwgMHg3ODE0LCAweGMwYzUsCisJMHg3ODE2LCAweDc4MTAsIDB4YzBmNSwgMHg3ODEyLCAweGQwZWMsIDB4MDA0MCwgMHg0ZDM1LCAweDAwNzgsCisJMHg0ZDMxLCAweGFlOGUsIDB4MDEwMCwgMHgwMDQwLCAweDRkMGUsIDB4NzgxNCwgMHhjMGY1LCAweGMwYzUsCisJMHg3ODE2LCAweGQwZDQsIDB4MDBjMCwgMHg0ZDM1LCAweDAwNzgsIDB4NGQzMSwgMHg3ODE0LCAweGMwZmQsCisJMHhjMGM1LCAweDc4MTYsIDB4ZDBkNCwgMHgwMGMwLCAweDRkMzUsIDB4MDA3OCwgMHg0ZDMxLCAweGQwZTQsCisJMHgwMDQwLCAweDRkMzcsIDB4MDBlMCwgMHg0ZDFhLCAweDIwOTEsIDB4NjAwMCwgMHgyMDA5LCAweDAwMGMsCisJMHgwMGUwLCAweDRkMjAsIDB4MjA5MSwgMHg2MDAwLCAweDgxMDksIDB4MDBjMCwgMHg0ZDIwLCAweDcwZTQsCisJMHhhMDg0LCAweDAxZmYsIDB4YTA4NiwgMHgwMWZmLCAweDAwYzAsIDB4NGQzMSwgMHg3MGVjLCAweDAwNzgsCisJMHg0Y2VlLCAweDc4MDQsIDB4ZDA4YywgMHgwMDQwLCAweDRkMzcsIDB4NjgxZiwgMHgwMDBjLCAweDcwYTAsCisJMHg3MGEyLCAweDAwN2MsIDB4MjA1YgorfTsKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZncxMjgwZWlfbGVuZ3RoMDEgPSAweDNkM2I7CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgcmlzY19jb2RlX2xlbmd0aDAxID0gMHgzZDNiOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQyODA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwpAQCAtMCwwICsxLDQ4NjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyoKKyogUUxvZ2ljICBRTEExMjgwIChVbHRyYTIpICBhbmQgIFFMQTEyMTYwIChVbHRyYTMpIFNDU0kgZHJpdmVyCisqIENvcHlyaWdodCAoQykgMjAwMCBRbG9naWMgQ29ycG9yYXRpb24gKHd3dy5xbG9naWMuY29tKQorKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBKZXMgU29yZW5zZW4sIFdpbGQgT3BlbiBTb3VyY2UgSW5jLgorKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBDaHJpc3RvcGggSGVsbHdpZworKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorKiBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBRTEExMjgwX1ZFUlNJT04gICAgICAiMy4yNSIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgUmV2ICAzLjI1LjEsIEZlYnJ1YXJ5IDEwLCAyMDA1IENocmlzdG9waCBIZWxsd2lnCisJLSB1c2UgcGNpX21hcF9zaW5nbGUgdG8gbWFwIG5vbi1TL0cgcmVxdWVzdHMKKwktIHJlbW92ZSBxbGExMjgwX3Byb2NfaW5mbworICAgIFJldiAgMy4yNSwgU2VwdGVtYmVyIDI4LCAyMDA0LCBDaHJpc3RvcGggSGVsbHdpZworCS0gYWRkIHN1cHBvcnQgZm9yIElTUDEwMjAvMTA0MAorCS0gZG9uJ3QgaW5jbHVkZSAic2NzaS5oIiBhbnltb3JlIGZvciAyLjYueAorICAgIFJldiAgMy4yNC40IEp1bmUgNywgMjAwNCBDaHJpc3RvcGggSGVsbHdpZworCS0gcmVzdHJ1Y3R1cmUgZmlybXdhcmUgbG9hZGluZywgY2xlYW51cCBpbml0aWFsaXphdGlvbiBjb2RlCisJLSBwcmVwYXJlIHN1cHBvcnQgZm9yIElTUDEwMjAvMTA0MCBjaGlwcworICAgIFJldiAgMy4yNC4zIEphbnVhcnkgMTksIDIwMDQsIEplcyBTb3JlbnNlbgorCS0gSGFuZGxlIFBDSSBETUEgbWFzayBzZXR0aW5ncyBjb3JyZWN0bHkKKwktIENvcnJlY3Qgb3JkZXIgb2YgZXJyb3IgaGFuZGxpbmcgaW4gcHJvYmVfb25lLCBmcmVlX2lycSBzaG91bGQgbm90CisJICBiZSBjYWxsZWQgaWYgcmVxdWVzdF9pcnEgZmFpbGVkCisgICAgUmV2ICAzLjI0LjIgSmFudWFyeSAxOSwgMjAwNCwgSmFtZXMgQm90dG9tbGV5ICYgQW5kcmV3IFZhc3F1ZXoKKwktIEJpZyBlbmRpYW4gZml4ZXMgKEphbWVzKQorCS0gUmVtb3ZlIGJvZ3VzIElPQ0IgY29udGVudCBvbiB6ZXJvIGRhdGEgdHJhbnNmZXIgY29tbWFuZHMgKEFuZHJldykKKyAgICBSZXYgIDMuMjQuMSBKYW51YXJ5IDUsIDIwMDQsIEplcyBTb3JlbnNlbgorCS0gSW5pdGlhbGl6ZSBjb21wbGV0aW9uIHF1ZXVlIHRvIGF2b2lkIE9PUFMgb24gcHJvYmUKKwktIEhhbmRsZSBpbnRlcnJ1cHRzIGR1cmluZyBtYWlsYm94IHRlc3RpbmcKKyAgICBSZXYgIDMuMjQgTm92ZW1iZXIgMTcsIDIwMDMsIENocmlzdG9waCBIZWxsd2lnCisgICAgCS0gdXNlIHN0cnVjdCBsaXN0X2hlYWQgZm9yIGNvbXBsZXRpb24gcXVldWUKKwktIGF2b2lkIG9sZCBTY3NpX0ZPTyB0eXBlZGVmcworCS0gY2xlYW51cCAyLjQgY29tcGF0IGdsdWUgYSBiaXQKKwktIHVzZSA8c2NzaS9zY3NpXyouaD4gaGVhZGVycyBvbiAyLjYgaW5zdGVhZCBvZiAic2NzaS5oIgorCS0gbWFrZSBpbml0aWFsaXphdGlvbiBmb3IgbWVtb3J5IG1hcHBlZCB2cyBwb3J0IEkvTyBtb3JlIHNpbWlsYXIKKwktIHJlbW92ZSBicm9rZW4gcGNpIGNvbmZpZyBzcGFjZSBtYW5pcHVsYXRpb24KKwktIGtpbGwgbW9yZSBjcnVmdAorCS0gdGhpcyBpcyBhbiBhbG1vc3QgcGVyZmVjdCAyLjYgc2NzaSBkcml2ZXIgbm93ISA7KQorICAgIFJldiAgMy4yMy4zOSBEZWNlbWJlciAxNywgMjAwMywgSmVzIFNvcmVuc2VuCisJLSBEZWxldGUgY29tcGxldGlvbiBxdWV1ZSBmcm9tIHNyYiBpZiBtYWlsYm94IGNvbW1hbmQgZmFpbGVkIHRvCisJICB0byBhdm9pZCBxbGExMjgwX2RvbmUgY29tcGxldGV0aW5nIHFsYTEyODBfZXJyb3JfYWN0aW9uJ3MKKwkgIG9ic29sZXRlIGNvbnRleHQKKwktIFJlZHVjZSBhcmd1bWVudHMgZm9yIHFsYTEyODBfZG9uZQorICAgIFJldiAgMy4yMy4zOCBPY3RvYmVyIDE4LCAyMDAzLCBDaHJpc3RvcGggSGVsbHdpZworCS0gQ29udmVydCB0byBuZXctc3R5bGUgaG90cGx1Z2FibGUgZHJpdmVyIGZvciAyLjYKKwktIEZpeCBtaXNzaW5nIHNjc2lfdW5yZWdpc3Rlci9zY3NpX2hvc3RfcHV0IG9uIEhCQSByZW1vdmFsCisJLSBLaWxsIHNvbWUgbW9yZSBjcnVmdAorICAgIFJldiAgMy4yMy4zNyBPY3RvYmVyIDEsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gTWFrZSBNTUlPIGRlcGVuZCBvbiBDT05GSUdfWDg2X1ZJU1dTIGluc3RlYWQgb2YgeWV0IGFub3RoZXIKKwkgIHJhbmRvbSBDT05GSUcgb3B0aW9uCisJLSBDbGVhbiB1cCBsb2NraW5nIGluIHByb2JlIHBhdGgKKyAgICBSZXYgIDMuMjMuMzYgT2N0b2JlciAxLCAyMDAzLCBDaHJpc3RvcGggSGVsbHdpZworCS0gcXVldWVjb21tYW5kIG9ubHkgZXZlciByZWNlaXZlcyBuZXcgY29tbWFuZHMgLSBjbGVhciBmbGFncworCS0gUmVpbnRlZ3JhdGUgbG9zdCBmaXhlcyBmcm9tIExpbnV4IDIuNQorICAgIFJldiAgMy4yMy4zNSBBdWd1c3QgMTQsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gQnVpbGQgYWdhaW5zdCAyLjYKKyAgICBSZXYgIDMuMjMuMzQgSnVseSAyMywgMjAwMywgSmVzIFNvcmVuc2VuCisJLSBSZW1vdmUgcG9pbnRsZXNzIFRSVUUvRkFMU0UgbWFjcm9zCisJLSBDbGVhbiB1cCB2Y2hhbiBoYW5kbGluZworICAgIFJldiAgMy4yMy4zMyBKdWx5IDMsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gRG9uJ3QgZGVmaW5lIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgYmVmb3JlIGRlZmluZSBkZXRlcm1pbmluZyBNTUlPLgorCSAgVGhpcyBqdXN0IGhhcHBlbmQgdG8gd29yayBvdXQgb24gaWE2NCBidXQgbm90IGVsc2V3aGVyZS4KKwktIERvbid0IHRyeSBhbmQgcmVhZCBmcm9tIHRoZSBjYXJkIHdoaWxlIGl0IGlzIGluIHJlc2V0IGFzCisJICBpdCB3b24ndCByZXNwb25kIGFuZCBjYXVzZXMgYW4gTUNBCisgICAgUmV2ICAzLjIzLjMyIEp1bmUgMjMsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gQmFzaWMgc3VwcG9ydCBmb3IgYm9vdCB0aW1lIGFyZ3VtZW50cworICAgIFJldiAgMy4yMy4zMSBKdW5lIDgsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gUmVkdWNlIGJvb3QgdGltZSBtZXNzYWdlcworICAgIFJldiAgMy4yMy4zMCBKdW5lIDYsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gRG8gbm90IGVuYWJsZSBzeW5jL3dpZGUvcHByIGJlZm9yZSBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkCisJICB0aGF0IHRoZSB0YXJnZXQgZGV2aWNlIGFjdHVhbGx5IHN1cHBvcnRzIGl0CisJLSBFbmFibGUgRE1BIGFyYml0cmF0aW9uIGZvciBtdWx0aSBjaGFubmVsIGNvbnRyb2xsZXJzCisgICAgUmV2ICAzLjIzLjI5IEp1bmUgMywgMjAwMywgSmVzIFNvcmVuc2VuCisJLSBQb3J0IHRvIDIuNS42OQorICAgIFJldiAgMy4yMy4yOCBKdW5lIDMsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gRWxpbWluYXRlIGR1cGxpY2F0ZSBtYXJrZXIgY29tbWFuZHMgb24gYnVzIHJlc2V0cworCS0gSGFuZGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzIGFwcHJvcHJpYXRlbHkgb24gYnVzL2RldmljZSByZXNldHMKKyAgICBSZXYgIDMuMjMuMjcgTWF5IDI4LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIFJlbW92ZSBib2d1cyBpbnB1dCBxdWV1ZSBjb2RlLCBsZXQgdGhlIExpbnV4IFNDU0kgbGF5ZXIgZG8gdGhlIHdvcmsKKwktIENsZWFuIHVwIE5WUkFNIGhhbmRsaW5nLCBvbmx5IHJlYWQgaXQgb25jZSBmcm9tIHRoZSBjYXJkCisJLSBBZGQgYSBudW1iZXIgb2YgbWlzc2luZyBkZWZhdWx0IG52cmFtIHBhcmFtZXRlcnMKKyAgICBSZXYgIDMuMjMuMjYgQmV0YSBNYXkgMjgsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gVXNlIGNvbXBsZXRpb24gcXVldWUgZm9yIG1haWxib3ggY29tbWFuZHMgaW5zdGVhZCBvZiBidXN5IHdhaXQKKyAgICBSZXYgIDMuMjMuMjUgQmV0YSBNYXkgMjcsIDIwMDMsIEphbWVzIEJvdHRvbWxleQorCS0gTWlncmF0ZSB0byB1c2UgbmV3IGVycm9yIGhhbmRsaW5nIGNvZGUKKyAgICBSZXYgIDMuMjMuMjQgQmV0YSBNYXkgMjEsIDIwMDMsIEphbWVzIEJvdHRvbWxleQorCS0gQmlnIGVuZGlhbiBzdXBwb3J0CisJLSBDbGVhbnVwIGRhdGEgZGlyZWN0aW9uIGNvZGUKKyAgICBSZXYgIDMuMjMuMjMgQmV0YSBNYXkgMTIsIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gU3dpdGNoIHRvIHVzaW5nIE1NSU8gaW5zdGVhZCBvZiBQSU8KKyAgICBSZXYgIDMuMjMuMjIgQmV0YSBBcHJpbCAxNSwgMjAwMywgSmVzIFNvcmVuc2VuCisJLSBGaXggUENJIHBhcml0eSBwcm9ibGVtIHdpdGggMTIxNjAgZHVyaW5nIHJlc2V0LgorICAgIFJldiAgMy4yMy4yMSBCZXRhIEFwcmlsIDE0LCAyMDAzLCBKZXMgU29yZW5zZW4KKwktIFVzZSBwY2lfbWFwX3BhZ2UoKS9wY2lfdW5tYXBfcGFnZSgpIGluc3RlYWQgb2YgbWFwX3NpbmdsZSB2ZXJzaW9uLgorICAgIFJldiAgMy4yMy4yMCBCZXRhIEFwcmlsIDksIDIwMDMsIEplcyBTb3JlbnNlbgorCS0gUmVtb3ZlIDwgMi40Lnggc3VwcG9ydAorCS0gSW50cm9kdWNlIEhPU1RfTE9DSyB0byBtYWtlIHRoZSBzcGluIGxvY2sgY2hhbmdlcyBwb3J0YWJsZS4KKwktIFJlbW92ZSBhIGJ1bmNoIG9mIGlkaW90aWMgYW5kIHVubmVjZXNzYXJ5IHR5cGVkZWYncworCS0gS2lsbCBhbGwgbGVmdG92ZXJzIG9mIHRhcmdldC1tb2RlIHN1cHBvcnQgd2hpY2ggbmV2ZXIgd29ya2VkIGFueXdheQorICAgIFJldiAgMy4yMy4xOSBCZXRhIEFwcmlsIDExLCAyMDAyLCBMaW51cyBUb3J2YWxkcworCS0gRG8gcWxhMTI4MF9wY2lfY29uZmlnKCkgYmVmb3JlIGNhbGxpbmcgcmVxdWVzdF9pcnEoKSBhbmQKKwkgIHJlcXVlc3RfcmVnaW9uKCkKKwktIFVzZSBwY2lfZG1hX2hpMzIoKSB0byBoYW5kbGUgdXBwZXIgd29yZCBvZiBETUEgYWRkcmVzc2VzIGluc3RlYWQKKwkgIG9mIGxhcmdlIHNoaWZ0cworCS0gSGFuZCBjb3JyZWN0IGFyZ3VtZW50cyB0byBmcmVlX2lycSgpIGluIGNhc2Ugb2YgZmFpbHVyZQorICAgIFJldiAgMy4yMy4xOCBCZXRhIEFwcmlsIDExLCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIFJ1biBzb3VyY2UgdGhyb3VnaCBMaW5kZW50IGFuZCBjbGVhbiB1cCB0aGUgb3V0cHV0CisgICAgUmV2ICAzLjIzLjE3IEJldGEgQXByaWwgMTEsIDIwMDIsIEplcyBTb3JlbnNlbgorCS0gVXBkYXRlIFNDU0kgZmlybXdhcmUgdG8gcWxhMTI4MCB2OC4xNS4wMCBhbmQgcWxhMTIxNjAgdjEwLjA0LjMyCisgICAgUmV2ICAzLjIzLjE2IEJldGEgTWFyY2ggMTksIDIwMDIsIEplcyBTb3JlbnNlbgorCS0gUmVseSBvbiBtYWlsYm94IGNvbW1hbmRzIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAtIGRvIG5vdAorCSAgcnVuIHFsYTEyODBfaXNyKCkgZnJvbSBxbDEyODBfbWFpbGJveF9jb21tYW5kKCkKKwktIFJlbW92ZSBkZXZpY2VfcmVnX3QKKwktIEludGVncmF0ZSBxbDEyMTYwX3NldF90YXJnZXRfcGFyYW1ldGVycygpIHdpdGggMTI4MCB2ZXJzaW9uCisJLSBNYWtlIHFsYTEyODBfc2V0dXAoKSBub24gc3RhdGljCisJLSBEbyBub3QgY2FsbCBxbGExMjgwX2NoZWNrX2Zvcl9kZWFkX3Njc2lfYnVzKCkgb24gZXZlcnkgSS9PIHJlcXVlc3QKKwkgIHNlbnQgdG8gdGhlIGNhcmQgLSB0aGlzIGNvbW1hbmQgcGF1c2VzIHRoZSBmaXJtYXJlISEhCisgICAgUmV2ICAzLjIzLjE1IEJldGEgTWFyY2ggMTksIDIwMDIsIEplcyBTb3JlbnNlbgorCS0gQ2xlYW4gdXAgcWxhMTI4MC5oIC0gcmVtb3ZlIG9ic29sZXRlIFFMX0RFQlVHX0xFVkVMX3ggZGVmaW5pdGlvbnMKKwktIFJlbW92ZSBhIHBpbGUgb2YgcG9pbnRsZXNzIGFuZCBjb25mdXNpbmcgKHNyYl90ICoqKSBhbmQKKwkgIChzY3NpX2x1X3QgKikgdHlwZWNhc3RzCisJLSBFeHBsaWNpdCBtYXJrIHRoYXQgd2UgZG8gbm90IHVzZSB0aGUgbmV3IGVycm9yIGhhbmRsaW5nIChmb3Igbm93KQorCS0gUmVtb3ZlIHNjc2lfcWxhX2hvc3RfdCBhbmQgdXNlICdzdHJ1Y3QnIGluc3RlYWQKKwktIFJlbW92ZSBpbl9hYm9ydCwgd2F0Y2hkb2dfZW5hYmxlZCwgZHBjLCBkcGNfc2NoZWQsIGJpb3NfZW5hYmxlZCwKKwkgIHBjaV82NGJpdF9zbG90IGZsYWdzIHdoaWNoIHdlcmVuJ3QgdXNlZCBmb3IgYW55dGhpbmcgYW55d2F5CisJLSBHcmFiIGhvc3QtPmhvc3RfbG9jayB3aGlsZSBjYWxsaW5nIHFsYTEyODBfaXNyKCkgZnJvbSBhYm9ydCgpCisJLSBVc2Ugc3Bpbl9sb2NrKCkvc3Bpbl91bmxvY2soKSBpbiBxbGExMjgwX2ludHJfaGFuZGxlcigpIC0gd2UKKwkgIGRvIG5vdCBuZWVkIHRvIHNhdmUvcmVzdG9yZSBmbGFncyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKwktIEVuYWJsZSBpbnRlcnJ1cHRzIGVhcmx5IChiZWZvcmUgYW55IG1haWxib3ggYWNjZXNzKSBpbiBwcmVwYXJhdGlvbgorCSAgZm9yIGNsZWFuaW5nIHVwIHRoZSBtYWlsYm94IGhhbmRsaW5nCisgICAgUmV2ICAzLjIzLjE0IEJldGEgTWFyY2ggMTQsIDIwMDIsIEplcyBTb3JlbnNlbgorCS0gRnVydGhlciBjbGVhbnVwcy4gUmVtb3ZlIGFsbCB0cmFjZSBvZiBRTF9ERUJVR19MRVZFTF94IGFuZCByZXBsYWNlCisJICBpdCB3aXRoIHByb3BlciB1c2Ugb2YgZHByaW50aygpLgorCS0gTWFrZSBxbGExMjgwX3ByaW50X3Njc2lfY21kKCkgYW5kIHFsYTEyODBfZHVtcF9idWZmZXIoKSBib3RoIHRha2UKKwkgIGEgZGVidWcgbGV2ZWwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIGlmIGRhdGEgaXMgdG8gYmUgcHJpbnRlZAorCS0gQWRkIEtFUk5fKiBpbmZvIHRvIHByaW50aygpCisgICAgUmV2ICAzLjIzLjEzIEJldGEgTWFyY2ggMTQsIDIwMDIsIEplcyBTb3JlbnNlbgorCS0gU2lnbmlmaWNhbnQgY29zbWV0aWMgY2xlYW51cHMKKwktIENoYW5nZSBkZWJ1ZyBjb2RlIHRvIHVzZSBkcHJpbnRrKCkgYW5kIHJlbW92ZSAjaWYgbWVzcworICAgIFJldiAgMy4yMy4xMiBCZXRhIE1hcmNoIDEzLCAyMDAyLCBKZXMgU29yZW5zZW4KKwktIE1vcmUgY29zbWV0aWMgY2xlYW51cHMsIGZpeCBwbGFjZXMgdHJlYXRpbmcgcmV0dXJuIGFzIGZ1bmN0aW9uCisJLSB1c2UgY3B1X3JlbGF4KCkgaW4gcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3RlcigpCisgICAgUmV2ICAzLjIzLjExIEJldGEgTWFyY2ggMTMsIDIwMDIsIEplcyBTb3JlbnNlbgorCS0gTWFrZSBpdCBjb21waWxlIHVuZGVyIDIuNS41CisgICAgUmV2ICAzLjIzLjEwIEJldGEgT2N0b2JlciAxLCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIERvIG5vIHR5cGVjYXN0IHNob3J0ICogdG8gbG9uZyAqIGluIFFMMTI4MEJvYXJkVGJsLCB0aGlzCisJICBicm9rZSBtaXNlcmFibHkgb24gYmlnIGVuZGlhbiBib3hlcworICAgIFJldiAgMy4yMy45IEJldGEgU2VwdGVtYmVyIDMwLCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIFJlbW92ZSBwcmUgMi4yIGhhY2sgZm9yIGNoZWNraW5nIGZvciByZWVudHJhbmNlIGluIGludGVycnVwdCBoYW5kbGVyCisJLSBNYWtlIGRhdGEgdHlwZXMgdXNlZCB0byByZWNlaXZlIGZyb20gU0NTSV97QlVTLFRDTixMVU59XzMyCisJICB1bnNpZ25lZCBpbnQgdG8gbWF0Y2ggdGhlIHR5cGVzIGZyb20gc3RydWN0IHNjc2lfY21uZAorICAgIFJldiAgMy4yMy44IEJldGEgU2VwdGVtYmVyIDI5LCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIFJlbW92ZSBib2d1cyB0aW1lcl90IHR5cGVkZWYgZnJvbSBxbGExMjgwLmgKKwktIFJlbW92ZSBvYnNvbGV0ZSBwcmUgMi4yIFBDSSBzZXR1cCBjb2RlLCB1c2UgcHJvcGVyICNkZWZpbmUncworCSAgZm9yIFBDSV8gdmFsdWVzLCBjYWxsIHBjaV9zZXRfbWFzdGVyKCkKKwktIEZpeCBtZW1sZWFrIG9mIHFsYTEyODBfYnVmZmVyIG9uIG1vZHVsZSB1bmxvYWQKKwktIE9ubHkgY29tcGlsZSBtb2R1bGUgcGFyc2luZyBjb2RlICNpZmRlZiBNT0RVTEUgLSBzaG91bGQgYmUKKwkgIGNoYW5nZWQgdG8gdXNlIGluZGl2aWR1YWwgTU9EVUxFX1BBUk0ncyBsYXRlcgorCS0gUmVtb3ZlIGR1bW15X2J1ZmZlciB0aGF0IHdhcyBuZXZlciBtb2RpZmllZCBub3IgcHJpbnRlZAorCS0gRU5URVIoKS9MRUFWRSgpIGFyZSBub29wcyB1bmxlc3MgUUxfREVCVUdfTEVWRUxfMywgaGVuY2UgcmVtb3ZlCisJICAjaWZkZWYgUUxfREVCVUdfTEVWRUxfMy8jZW5kaWYgYXJvdW5kIEVOVEVSKCkvTEVBVkUoKSBjYWxscworCS0gUmVtb3ZlIFxyIGZyb20gcHJpbnQgc3RhdGVtZW50cywgdGhpcyBpcyBMaW51eCwgbm90IERPUworCS0gUmVtb3ZlIG9ic29sZXRlIFFMQTEyODBfe1NDU0lMVSxJTlRSLFJJTkd9X3tMT0NLLFVOTE9DS30KKwkgIGR1bW15IG1hY3JvcworCS0gUmVtb3ZlIEMrKyBjb21waWxlIGhhY2sgaW4gaGVhZGVyIGZpbGUgYXMgTGludXggZHJpdmVyIGFyZSBub3QKKwkgIHN1cHBvc2VkIHRvIGJlIGNvbXBpbGVkIGFzIEMrKworCS0gS2lsbCBNU182NEJJVFMgbWFjcm8gYXMgaXQgbWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZQorCS0gUmVtb3ZlIHVubmVjZXNzYXJ5IGZsYWdzLmluX2ludGVycnVwdHMgYml0CisgICAgUmV2ICAzLjIzLjcgQmV0YSBBdWd1c3QgMjAsIDIwMDEsIEplcyBTb3JlbnNlbgorCS0gRG9udCcgY2hlY2sgZm9yIHNldCBmbGFncyBvbiBxLT5xX2ZsYWcgb25lIGJ5IG9uZSBpbiBxbGExMjgwX25leHQoKQorICAgICAgICAtIENoZWNrIHdoZXRoZXIgdGhlIGludGVycnVwdCB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBRTEExMjgwIGJlZm9yZQorICAgICAgICAgIGRvaW5nIGFueSBwcm9jZXNzaW5nCisJLSBxbGExMjgwX3N0YXR1c19lbnRyeSgpOiBPbmx5IHplcm8gb3V0IHBhcnQgb2Ygc2Vuc2VfYnVmZmVyIHRoYXQKKwkgIGlzIG5vdCBiZWluZyBjb3BpZWQgaW50bworCS0gUmVtb3ZlIG1vcmUgc3VwZXJmbG91b3VzIHR5cGVjYXN0cworCS0gcWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpKCkgcmVwbGFjZSBob21lLWJyZXcgbWVtY3B5KCkgd2l0aCBtZW1jcHkoKQorICAgIFJldiAgMy4yMy42IEJldGEgQXVndXN0IDIwLCAyMDAxLCBUb255IEx1Y2ssIEludGVsCisgICAgICAgIC0gRG9uJ3Qgd2FsayB0aGUgZW50aXJlIGxpc3QgaW4gcWxhMTI4MF9wdXRxX3QoKSBqdXN0IHRvIGRpcmVjdGx5CisJICBncmFiIHRoZSBwb2ludGVyIHRvIHRoZSBsYXN0IGVsZW1lbnQgYWZ0ZXJ3YXJkcworICAgIFJldiAgMy4yMy41IEJldGEgQXVndXN0IDksIDIwMDEsIEplcyBTb3JlbnNlbgorCS0gRG9uJ3QgdXNlIFNBX0lOVEVSUlVQVCwgaXQncyB1c2UgaXMgZGVwcmVjYXRlZCBmb3IgdGhpcyBraW5kYSBkcml2ZXIKKyAgICBSZXYgIDMuMjMuNCBCZXRhIEF1Z3VzdCA4LCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIFNldCBkZXYtPm1heF9zZWN0b3JzIHRvIDEwMjQKKyAgICBSZXYgIDMuMjMuMyBCZXRhIEF1Z3VzdCA2LCAyMDAxLCBKZXMgU29yZW5zZW4KKwktIFByb3ZpZGUgY29tcGF0IG1hY3JvcyBmb3IgcGNpX2VuYWJsZV9kZXZpY2UoKSwgcGNpX2ZpbmRfc3Vic3lzKCkKKwkgIGFuZCBzY3NpX3NldF9wY2lfZGV2aWNlKCkKKwktIENhbGwgc2NzaV9zZXRfcGNpX2RldmljZSgpIGZvciBhbGwgZGV2aWNlcworCS0gUmVkdWNlIHNpemUgb2Yga2VybmVsIHZlcnNpb24gZGVwZW5kZW50IGRldmljZSBwcm9iZSBjb2RlCisJLSBNb3ZlIGR1cGxpY2F0ZSBwcm9iZS9pbml0IGNvZGUgdG8gc2VwYXJhdGUgZnVuY3Rpb24KKwktIEhhbmRsZSBlcnJvciBpZiBxbGExMjgwX21lbV9hbGxvYygpIGZhaWxzCisJLSBLaWxsIE9GRlNFVCgpIG1hY3JvIGFuZCB1c2UgTGludXgncyBQQ0kgZGVmaW5pdGlvbnMgaW5zdGVhZAorICAgICAgICAtIEtpbGwgcHJpdmF0ZSBzdHJ1Y3R1cmUgZGVmaW5pbmcgUENJIGNvbmZpZyBzcGFjZSAoc3RydWN0IGNvbmZpZ19yZWcpCisJLSBPbmx5IGFsbG9jYXRlIEkvTyBwb3J0IHJlZ2lvbiBpZiBub3QgaW4gTU1JTyBtb2RlCisJLSBSZW1vdmUgZHVwbGljYXRlICh1bnVzZWQpIHNhbml0eSBjaGVjayBvZiBzaWZlIG9mIHNyYl90CisgICAgUmV2ICAzLjIzLjIgQmV0YSBBdWd1c3QgNiwgMjAwMSwgSmVzIFNvcmVuc2VuCisJLSBDaGFuZ2UgaG9tZS1icmV3IG1lbXNldCgpIGltcGxlbWVudGF0aW9ucyB0byB1c2UgbWVtc2V0KCkKKyAgICAgICAgLSBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gQ09NVFJBQ0UoKSAtIGFjY2Vzc2luZyBhIFBDJ3MgQ09NMiBzZXJpYWwKKyAgICAgICAgICBwb3J0IGRpcmVjdGx5IGlzIG5vdCBsZWdhbCB1bmRlciBMaW51eC4KKyAgICBSZXYgIDMuMjMuMSBCZXRhIEFwcmlsIDI0LCAyMDAxLCBKZXMgU29yZW5zZW4KKyAgICAgICAgLSBSZW1vdmUgcHJlIDIuMiBrZXJuZWwgc3VwcG9ydAorICAgICAgICAtIGNsZWFuIHVwIDY0IGJpdCBETUEgc2V0dGluZyB0byB1c2UgMi40IEFQSSAocHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0KQorICAgICAgICAtIEZpeCBNTUlPIGFjY2VzcyB0byB1c2UgcmVhZGwvd3JpdGVsIGluc3RlYWQgb2YgZGlyZWN0bHkKKyAgICAgICAgICBkZXJlZmVyZW5jaW5nIHBvaW50ZXJzCisgICAgICAgIC0gTnVrZSBNU0RPUyBkZWJ1Z2dpbmcgY29kZQorICAgICAgICAtIENoYW5nZSB0cnVlL2ZhbHNlIGRhdGEgdHlwZXMgdG8gaW50IGZyb20gdWludDhfdAorICAgICAgICAtIFVzZSBpbnQgZm9yIGNvdW50ZXJzIGluc3RlYWQgb2YgdWludDhfdCBldGMuCisgICAgICAgIC0gQ2xlYW4gdXAgc2l6ZSAmIGJ5dGUgb3JkZXIgY29udmVyc2lvbiBtYWNybyB1c2FnZQorICAgIFJldiAgMy4yMyBCZXRhIEphbnVhcnkgMTEsIDIwMDEgQk4gUWxvZ2ljCisgICAgICAgIC0gQWRkZWQgY2hlY2sgb2YgZGV2aWNlX2lkIHdoZW4gaGFuZGxpbmcgbm9uCisgICAgICAgICAgUUxBMTIxNjBzIGR1cmluZyBkZXRlY3QoKS4KKyAgICBSZXYgIDMuMjIgQmV0YSBKYW51YXJ5IDUsIDIwMDEgQk4gUWxvZ2ljCisgICAgICAgIC0gQ2hhbmdlZCBxdWV1ZV90YXNrKCkgdG8gc2NoZWR1bGVfdGFzaygpCisgICAgICAgICAgZm9yIGtlcm5lbHMgMi40LjAgYW5kIGhpZ2hlci4KKyAgICAgICAgICBOb3RlOiAyLjQuMC10ZXN0eHgga2VybmVscyByZWxlYXNlZCBwcmlvciB0bworICAgICAgICAgICAgICAgIHRoZSBhY3R1YWwgMi40LjAga2VybmVsIHJlbGVhc2Ugb24gSmFudWFyeSAyMDAxCisgICAgICAgICAgICAgICAgd2lsbCBnZXQgY29tcGlsZS9saW5rIGVycm9ycyB3aXRoIHNjaGVkdWxlX3Rhc2soKS4KKyAgICAgICAgICAgICAgICBQbGVhc2UgdXBkYXRlIHlvdXIga2VybmVsIHRvIHJlbGVhc2VkIDIuNC4wIGxldmVsLAorICAgICAgICAgICAgICAgIG9yIGNvbW1lbnQgbGluZXMgaW4gdGhpcyBmaWxlIGZsYWdnZWQgd2l0aCAgMy4yMgorICAgICAgICAgICAgICAgIHRvIHJlc29sdmUgY29tcGlsZS9saW5rIGVycm9yIG9mIHNjaGVkdWxlX3Rhc2soKS4KKyAgICAgICAgLSBBZGRlZCAtRENPTkZJR19TTVAgaW4gYWRkaXRpb24gdG8gLURfX1NNUF9fCisgICAgICAgICAgaW4gTWFrZWZpbGUgZm9yIDIuNC4wIGJ1aWxkcyBvZiBkcml2ZXIgYXMgbW9kdWxlLgorICAgIFJldiAgMy4yMSBCZXRhIEphbnVhcnkgNCwgMjAwMSBCTiBRbG9naWMKKyAgICAgICAgLSBDaGFuZ2VkIGNyaXRlcmlhIG9mIDY0LzMyIEJpdCBtb2RlIG9mIEhCQQorICAgICAgICAgIG9wZXJhdGlvbiBhY2NvcmRpbmcgdG8gQklUU19QRVJfTE9ORyByYXRoZXIKKyAgICAgICAgICB0aGFuIEhCQSdzIE5WUkFNIHNldHRpbmcgb2YgPjRHaWcgbWVtb3J5IGJpdDsKKyAgICAgICAgICBzbyB0aGF0IHRoZSBIQkEgYXV0by1jb25maWd1cmVzIHdpdGhvdXQgdGhlIG5lZWQKKyAgICAgICAgICB0byBzZXR1cCBlYWNoIHN5c3RlbSBpbmRpdmlkdWFsbHkuCisgICAgUmV2ICAzLjIwIEJldGEgRGVjZW1iZXIgNSwgMjAwMCBCTiBRbG9naWMKKyAgICAgICAgLSBBZGRlZCBwcmlvcml0eSBoYW5kbGluZyB0byBJQS02NCAgb25ib2FyZCBTQ1NJCisgICAgICAgICAgSVNQMTIxNjAgY2hpcCBmb3Iga2VybmVscyBncmVhdGVyIHRoYW4gMi4zLjE4LgorICAgICAgICAtIEFkZGVkIGlycXJlc3RvcmUgZm9yIHFsYTEyODBfaW50cl9oYW5kbGVyLgorICAgICAgICAtIEVuYWJsZWQgL3Byb2Mvc2NzaS9xbGExMjgwIGludGVyZmFjZS4KKyAgICAgICAgLSBDbGVhciAvcHJvYy9zY3NpL3FsYTEyODAgY291bnRlcnMgaW4gZGV0ZWN0KCkuCisgICAgUmV2ICAzLjE5IEJldGEgT2N0b2JlciAxMywgMjAwMCBCTiBRbG9naWMKKyAgICAgICAgLSBEZWNsYXJlIGRyaXZlcl90ZW1wbGF0ZSBmb3IgbmV3IGtlcm5lbAorICAgICAgICAgICgyLjQuMCBhbmQgZ3JlYXRlcikgc2NzaSBpbml0aWFsaXphdGlvbiBzY2hlbWUuCisgICAgICAgIC0gVXBkYXRlIC9wcm9jL3Njc2kgZW50cnkgZm9yIDIuMy4xOCBrZXJuZWxzIGFuZAorICAgICAgICAgIGFib3ZlIGFzIHFsYTEyODAKKyAgICBSZXYgIDMuMTggQmV0YSBPY3RvYmVyIDEwLCAyMDAwIEJOIFFsb2dpYworICAgICAgICAtIENoYW5nZWQgc2NhbiBvcmRlciBvZiBhZGFwdGVycyB0byBtYXAKKyAgICAgICAgICB0aGUgUUxBMTIxNjAgZm9sbG93ZWQgYnkgdGhlIFFMQTEyODAuCisgICAgUmV2ICAzLjE3IEJldGEgU2VwdGVtYmVyIDE4LCAyMDAwIEJOIFFsb2dpYworICAgICAgICAtIFJlbW92ZWQgd2FybmluZ3MgZm9yIDMyIGJpdCAyLjQueCBjb21waWxlcworICAgICAgICAtIENvcnJlY3RlZCBkZWNsYXJlZCBzaXplIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZQorICAgICAgICAgIERNQSBhZGRyZXNzZXMgdGhhdCBhcmUga2VwdCBpbiBlYWNoIGhhCisgICAgUmV2LiAzLjE2IEJldGEgIEF1Z3VzdCAyNSwgMjAwMCAgIEJOICBRbG9naWMKKyAgICAgICAgLSBDb3JyZWN0ZWQgNjQgYml0IGFkZHJlc3NpbmcgaXNzdWUgb24gSUEtNjQKKyAgICAgICAgICB3aGVyZSB0aGUgdXBwZXIgMzIgYml0cyB3ZXJlIG5vdCBwcm9wZXJseQorICAgICAgICAgIHBhc3NlZCB0byB0aGUgUklTQyBlbmdpbmUuCisgICAgUmV2LiAzLjE1IEJldGEgIEF1Z3VzdCAyMiwgMjAwMCAgIEJOICBRbG9naWMKKyAgICAgICAgLSBNb2RpZmllZCBxbGExMjgwX3NldHVwX2NoaXAgdG8gcHJvcGVybHkgbG9hZAorICAgICAgICAgIElTUCBmaXJtd2FyZSBmb3IgZ3JlYXRlciB0aGF0IDQgR2lnIG1lbW9yeSBvbiBJQS02NAorICAgIFJldi4gMy4xNCBCZXRhICBBdWd1c3QgMTYsIDIwMDAgICBCTiAgUWxvZ2ljCisgICAgICAgIC0gQWRkZWQgc2V0dGluZyBvZiBkbWFfbWFzayB0byBmdWxsIDY0IGJpdAorICAgICAgICAgIGlmIGZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nIGlzIHNldCBpbiBOVlJBTQorICAgIFJldi4gMy4xMyBCZXRhICBBdWd1c3QgMTYsIDIwMDAgICBCTiAgUWxvZ2ljCisgICAgICAgIC0gVXNlIG5ldyBQQ0kgRE1BIG1hcHBpbmcgQVBJcyBmb3IgMi40Lngga2VybmVsCisgICAgUmV2LiAzLjEyICAgICAgIEp1bHkgMTgsIDIwMDAgICAgUmVkaGF0ICYgQk4gUWxvZ2ljCisgICAgICAgIC0gQWRkZWQgY2hlY2sgb2YgcGNpX2VuYWJsZV9kZXZpY2UgdG8gZGV0ZWN0KCkgZm9yIDIuMy54CisgICAgICAgIC0gVXNlIHBjaV9yZXNvdXJjZV9zdGFydCgpIGluc3RlYWQgb2YKKyAgICAgICAgICBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCBpbiBkZXRlY3QoKSBmb3IgMi4zLngKKyAgICAgICAgLSBVcGRhdGVkIGRyaXZlciB2ZXJzaW9uCisgICAgUmV2LiAzLjExICAgICAgIEp1bHkgMTQsIDIwMDAgICAgQk4gIFFsb2dpYworCS0gVXBkYXRlZCBTQ1NJIEZpcm13YXJlIHRvIGZvbGxvd2luZyB2ZXJzaW9uczoKKwkgIHFsYTF4ODA6ICAgOC4xMy4wOAorCSAgcWxhMXgxNjA6ICAxMC4wNC4wOAorCS0gVXBkYXRlZCBkcml2ZXIgdmVyc2lvbiB0byAzLjExCisgICAgUmV2LiAzLjEwICAgIEp1bmUgMjMsIDIwMDAgICBCTiBRbG9naWMKKyAgICAgICAgLSBBZGRlZCBmaWx0ZXJpbmcgb2YgQU1JIFN1YlN5cyBWZW5kb3IgSUQgZGV2aWNlcworICAgIFJldi4gMy45CisgICAgICAgIC0gREVCVUdfUUxBMTI4MCB1bmRlZmluZWQgYW5kICBuZXcgdmVyc2lvbiAgQk4gUWxvZ2ljCisgICAgUmV2LiAzLjA4YiAgICAgIE1heSA5LCAyMDAwICAgIE1EIERlbGwKKyAgICAgICAgLSBBZGRlZCBsb2dpYyB0byBjaGVjayBhZ2FpbnN0IEFNSSBzdWJzeXN0ZW0gdmVuZG9yIElECisJUmV2LiAzLjA4ICAgICAgIE1heSA0LCAyMDAwICAgIERHICBRbG9naWMKKyAgICAgICAgLSBBZGRlZCBsb2dpYyB0byBjaGVjayBmb3IgUENJIHN1YnN5c3RlbSBJRC4KKwlSZXYuIDMuMDcgICAgICAgQXByIDI0LCAyMDAwICAgIERHICYgQk4gIFFsb2dpYworCSAgIC0gVXBkYXRlZCBTQ1NJIEZpcm13YXJlIHRvIGZvbGxvd2luZyB2ZXJzaW9uczoKKwkgICAgIHFsYTEyMTYwOiAgIDEwLjAxLjE5CisJCSBxbGExMjgwOiAgICAgOC4wOS4wMAorCVJldi4gMy4wNiAgICAgICBBcHIgMTIsIDIwMDAgICAgREcgJiBCTiAgUWxvZ2ljCisJICAgLSBJbnRlcm5hbCByZXZpc2lvbjsgbm90IHJlbGVhc2VkCisgICAgUmV2LiAzLjA1ICAgICAgIE1hciAyOCwgMjAwMCAgICBERyAmIEJOICBRbG9naWMKKyAgICAgICAtIEVkaXQgY29ycmVjdGlvbiBmb3IgdmlydF90b19idXMgYW5kIFBST0MuCisgICAgUmV2LiAzLjA0ICAgICAgIE1hciAyOCwgMjAwMCAgICBERyAmIEJOICBRbG9naWMKKyAgICAgICAtIE1lcmdlIGNoYW5nZXMgZnJvbSBpYTY0IHBvcnQuCisgICAgUmV2LiAzLjAzICAgICAgIE1hciAyOCwgMjAwMCAgICBCTiAgUWxvZ2ljCisgICAgICAgLSBJbmNyZWFzZSB2ZXJzaW9uIHRvIHJlZmxlY3QgbmV3IGNvZGUgZHJvcCB3aXRoIGNvbXBpbGUgZml4CisgICAgICAgICBvZiBpc3N1ZSB3aXRoIGluY2x1c2lvbiBvZiBsaW51eC9zcGlubG9jayBmb3IgMi4zIGtlcm5lbHMKKyAgICBSZXYuIDMuMDIgICAgICAgTWFyIDE1LCAyMDAwICAgIEJOICBRbG9naWMKKyAgICAgICAtIE1lcmdlIHFsYTEyODBfcHJvY19pbmZvIGZyb20gMi4xMCBjb2RlIGJhc2UKKyAgICBSZXYuIDMuMDEgICAgICAgRmViIDEwLCAyMDAwICAgIEJOICBRbG9naWMKKyAgICAgICAtIENvcnJlY3RlZCBjb2RlIHRvIGNvbXBpbGUgb24gYSAyLjIueCBrZXJuZWwuCisgICAgUmV2LiAzLjAwICAgICAgIEphbiAxNywgMjAwMCAgICBERyAgUWxvZ2ljCisJICAgLSBBZGRlZCA2NC1iaXQgc3VwcG9ydC4KKyAgICBSZXYuIDIuMDcgICAgICAgTm92IDksIDE5OTkgICAgIERHICBRbG9naWMKKwkgICAtIEFkZGVkIG5ldyByb3V0aW5lIHRvIHNldCB0YXJnZXQgcGFyYW1ldGVycyBmb3IgSVNQMTIxNjAuCisgICAgUmV2LiAyLjA2ICAgICAgIFNlcHQgMTAsIDE5OTkgICAgIERHICBRbG9naWMKKyAgICAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIElTUDEyMTYwIFVsdHJhIDMgY2hpcC4KKyAgICBSZXYuIDIuMDMgICAgICAgQXVndXN0IDMsIDE5OTkgICAgRnJlZCBMZXdpcywgSW50ZWwgRHVQb250CisJLSBNb2RpZmllZCBjb2RlIHRvIHJlbW92ZSBlcnJvcnMgZ2VuZXJhdGVkIHdoZW4gY29tcGlsaW5nIHdpdGgKKwkgIEN5Z251cyBJQTY0IENvbXBpbGVyLgorICAgICAgICAtIENoYW5nZWQgY29udmVyc2lvbiBvZiBwb2ludGVycyB0byB1bnNpZ25lZCBsb25ncyBpbnN0ZWFkIG9mIGludGVnZXJzLgorICAgICAgICAtIENoYW5nZWQgdHlwZSBvZiBJL08gcG9ydCB2YXJpYWJsZXMgZnJvbSB1aW50MzJfdCB0byB1bnNpZ25lZCBsb25nLgorICAgICAgICAtIE1vZGlmaWVkIE9GRlNFVCBtYWNybyB0byB3b3JrIHdpdGggNjQtYml0IGFzIHdlbGwgYXMgMzItYml0LgorICAgICAgICAtIENoYW5nZWQgc3ByaW50ZiBhbmQgcHJpbnRrIGZvcm1hdCBzcGVjaWZpZXJzIGZvciBwb2ludGVycyB0byAlcC4KKyAgICAgICAgLSBDaGFuZ2VkIHNvbWUgaW50IHRvIGxvbmcgdHlwZSBjYXN0cyB3aGVyZSBuZWVkZWQgaW4gc3ByaW50ZiAmIHByaW50ay4KKyAgICAgICAgLSBBZGRlZCBsIG1vZGlmaWVycyB0byBzcHJpbnRmIGFuZCBwcmludGsgZm9ybWF0IHNwZWNpZmllcnMgZm9yIGxvbmdzLgorICAgICAgICAtIFJlbW92ZWQgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KKyAgICBSZXYuIDEuMjAgICAgICAgSnVuZSA4LCAxOTk5ICAgICAgREcsICBRbG9naWMKKyAgICAgICAgIENoYW5nZXMgdG8gc3VwcG9ydCBSZWRIYXQgcmVsZWFzZSA2LjAgKGtlcm5lbCAyLjIuNSkuCisgICAgICAgLSBBZGRlZCBTQ1NJIGV4Y2x1c2l2ZSBhY2Nlc3MgbG9jayAoaW9fcmVxdWVzdF9sb2NrKSB3aGVuIGFjY2Vzc2luZworICAgICAgICAgdGhlIGFkYXB0ZXIuCisgICAgICAgLSBBZGRlZCBjaGFuZ2VzIGZvciB0aGUgbmV3IExJTlVYIGludGVyZmFjZSB0ZW1wbGF0ZS4gU29tZSBuZXcgZXJyb3IKKyAgICAgICAgIGhhbmRsaW5nIHJvdXRpbmVzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgdGVtcGxhdGUsIGJ1dCBmb3Igbm93IHdlCisgICAgICAgICB3aWxsIHVzZSB0aGUgb2xkIG9uZXMuCisgICAgLSAgIEluaXRpYWwgQmV0YSBSZWxlYXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwNTQ1CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2Jsay5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInNkLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQorI2luY2x1ZGUgPGFzbS9zbi9pby5oPgorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDQwNworI2Vycm9yICJLZXJuZWxzIG9sZGVyIHRoYW4gMi40LjcgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQiCisjZW5kaWYKKworCisvKgorICogQ29tcGlsZSB0aW1lIE9wdGlvbnM6CisgKiAgICAgICAgICAgIDAgLSBEaXNhYmxlIGFuZCAxIC0gRW5hYmxlCisgKi8KKyNkZWZpbmUgIERFQlVHX1FMQTEyODBfSU5UUgkwCisjZGVmaW5lICBERUJVR19QUklOVF9OVlJBTQkwCisjZGVmaW5lICBERUJVR19RTEExMjgwCQkwCisKKy8qCisgKiBUaGUgU0dJIFZJU1dTIGlzIGJyb2tlbiBhbmQgZG9lc24ndCBzdXBwb3J0IE1NSU8gOy0oCisgKi8KKyNpZmRlZiBDT05GSUdfWDg2X1ZJU1dTCisjZGVmaW5lCU1FTU9SWV9NQVBQRURfSU8JMAorI2Vsc2UKKyNkZWZpbmUJTUVNT1JZX01BUFBFRF9JTwkxCisjZW5kaWYKKworI2RlZmluZSBVTklRVUVfRldfTkFNRQorI2luY2x1ZGUgInFsYTEyODAuaCIKKyNpbmNsdWRlICJxbDEyMTYwX2Z3LmgiCQkvKiBJU1AgUklTQyBjb2RlcyAqLworI2luY2x1ZGUgInFsMTI4MF9mdy5oIgorI2luY2x1ZGUgInFsMTA0MF9mdy5oIgorCisKKy8qCisgKiBNaXNzaW5nIFBDSSBJRCdzCisgKi8KKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTA4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDgwCTB4MTA4MAorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTI0MAkweDEyNDAKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyODAJMHgxMjgwCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAxNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAxNjAJMHgxMDE2CisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTIxNjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTIxNjAJMHgxMjE2CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FNSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNSSAgICAgICAgICAgICAgIDB4MTAxZQorI2VuZGlmCisKKyNpZm5kZWYgQklUU19QRVJfTE9ORworI2Vycm9yICJCSVRTX1BFUl9MT05HIG5vdCBkZWZpbmVkISIKKyNlbmRpZgorI2lmIChCSVRTX1BFUl9MT05HID09IDY0KSB8fCBkZWZpbmVkIENPTkZJR19ISUdITUVNCisjZGVmaW5lIFFMQV82NEJJVF9QVFIJMQorI2VuZGlmCisKKyNpZmRlZiBRTEFfNjRCSVRfUFRSCisjZGVmaW5lIHBjaV9kbWFfaGkzMihhKQkJCSgoYSA+PiAxNikgPj4gMTYpCisjZWxzZQorI2RlZmluZSBwY2lfZG1hX2hpMzIoYSkJCQkwCisjZW5kaWYKKyNkZWZpbmUgcGNpX2RtYV9sbzMyKGEpCQkJKGEgJiAweGZmZmZmZmZmKQorCisjZGVmaW5lIE5WUkFNX0RFTEFZKCkJCQl1ZGVsYXkoNTAwKQkvKiAyIG1pY3Jvc2Vjb25kcyAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA1MDAKKyNkZWZpbmUgSE9TVF9MT0NLCQkJJmlvX3JlcXVlc3RfbG9jaworI2RlZmluZSBpcnFyZXR1cm5fdAkJCXZvaWQKKyNkZWZpbmUgSVJRX1JFVFZBTChmb28pCisjZGVmaW5lIE1TR19PUkRFUkVEX1RBRwkJCTEKKworI2RlZmluZSBETUFfQklESVJFQ1RJT05BTAlTQ1NJX0RBVEFfVU5LTk9XTgorI2RlZmluZSBETUFfVE9fREVWSUNFCQlTQ1NJX0RBVEFfV1JJVEUKKyNkZWZpbmUgRE1BX0ZST01fREVWSUNFCQlTQ1NJX0RBVEFfUkVBRAorI2RlZmluZSBETUFfTk9ORQkJU0NTSV9EQVRBX05PTkUKKworI2lmbmRlZiBIQVZFX1NFQ1RPUl9UCit0eXBlZGVmIHVuc2lnbmVkIGludCBzZWN0b3JfdDsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK3Njc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlLCBpbnQgdGFnLCBpbnQgZGVwdGgpCit7CisJaWYgKHRhZykgeworCQlkZXZpY2UtPnRhZ2dlZF9xdWV1ZSA9IHRhZzsKKwkJZGV2aWNlLT5jdXJyZW50X3RhZyA9IDA7CisJfQorCWRldmljZS0+cXVldWVfZGVwdGggPSBkZXB0aDsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0X2FsbG9jKFNjc2lfSG9zdF9UZW1wbGF0ZSAqdCwgc2l6ZV90IHMpCit7CisJcmV0dXJuIHNjc2lfcmVnaXN0ZXIodCwgcyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9ob3N0X3B1dChzdHJ1Y3QgU2NzaV9Ib3N0ICpoKQoreworCXNjc2lfdW5yZWdpc3RlcihoKTsKK30KKyNlbHNlCisjZGVmaW5lIEhPU1RfTE9DSwkJCWhhLT5ob3N0LT5ob3N0X2xvY2sKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwNjAwCisjZGVmaW5lIERFVl9TSU1QTEVfVEFHUyhkZXZpY2UpCQlkZXZpY2UtPnRhZ2dlZF9xdWV1ZQorLyoKKyAqIEhhY2sgYXJvdW5kIHRoYXQgcWxhMTI4MF9yZW1vdmVfb25lIGlzIGNhbGxlZCBmcm9tCisgKiBxbGExMjgwX3JlbGVhc2UgaW4gMi40CisgKi8KKyN1bmRlZiBfX2RldmV4aXQKKyNkZWZpbmUgX19kZXZleGl0CisjZWxzZQorI2RlZmluZSBERVZfU0lNUExFX1RBR1MoZGV2aWNlKQkJZGV2aWNlLT5zaW1wbGVfdGFncworI2VuZGlmCisjaWYgZGVmaW5lZChfX2lhNjRfXykgJiYgIWRlZmluZWQoaWE2NF9wbGF0Zm9ybV9pcykKKyNkZWZpbmUgaWE2NF9wbGF0Zm9ybV9pcyhmb28pCQkoIXN0cmNtcCh4LCBwbGF0Zm9ybV9uYW1lKSkKKyNlbmRpZgorCisKKyNkZWZpbmUgSVNfSVNQMTA0MChoYSkgKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMCkKKyNkZWZpbmUgSVNfSVNQMXg0MChoYSkgKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMCB8fCBcCisJCQloYS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyNDApCisjZGVmaW5lIElTX0lTUDF4MTYwKGhhKSAgICAgICAgKGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAxNjAgfHwgXAorCQkJCWhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTIxNjApCisKKworc3RhdGljIGludCBxbGExMjgwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIHFsYTEyODBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqKTsKKworLyoKKyAqICBRTG9naWMgRHJpdmVyIFN1cHBvcnQgRnVuY3Rpb24gUHJvdG90eXBlcy4KKyAqLworc3RhdGljIHZvaWQgcWxhMTI4MF9kb25lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwNTQ1CitzdGF0aWMgdm9pZCBxbGExMjgwX2dldF90YXJnZXRfb3B0aW9ucyhzdHJ1Y3Qgc2NzaV9jbW5kICosIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworI2VuZGlmCitzdGF0aWMgaW50IHFsYTEyODBfZ2V0X3Rva2VuKGNoYXIgKik7CitzdGF0aWMgaW50IHFsYTEyODBfc2V0dXAoY2hhciAqcykgX19pbml0OworCisvKgorICogIFFMb2dpYyBJU1AxMjgwIEhhcmR3YXJlIFN1cHBvcnQgRnVuY3Rpb24gUHJvdG90eXBlcy4KKyAqLworc3RhdGljIGludCBxbGExMjgwX2xvYWRfZmlybXdhcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgaW50IHFsYTEyODBfaW5pdF9yaW5ncyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK3N0YXRpYyBpbnQgcWxhMTI4MF9udnJhbV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgaW50IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosCisJCQkJICAgdWludDhfdCwgdWludDE2X3QgKik7CitzdGF0aWMgaW50IHFsYTEyODBfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGludCk7CitzdGF0aWMgaW50IHFsYTEyODBfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGludCwgaW50KTsKK3N0YXRpYyBpbnQgcWxhMTI4MF9hYm9ydF9kZXZpY2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgaW50IHFsYTEyODBfYWJvcnRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3Qgc3JiICosIGludCk7CitzdGF0aWMgaW50IHFsYTEyODBfYWJvcnRfaXNwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworI2lmZGVmIFFMQV82NEJJVF9QVFIKK3N0YXRpYyBpbnQgcWxhMTI4MF82NGJpdF9zdGFydF9zY3NpKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCBzcmIgKik7CisjZWxzZQorc3RhdGljIGludCBxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2koc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHNyYiAqKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcWxhMTI4MF9udl93cml0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MTZfdCk7CitzdGF0aWMgdm9pZCBxbGExMjgwX3BvbGwoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgdm9pZCBxbGExMjgwX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgdm9pZCBxbGExMjgwX21hcmtlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBpbnQsIGludCwgaW50LCB1OCk7CitzdGF0aWMgdm9pZCBxbGExMjgwX2lzcF9jbWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgdm9pZCBxbGExMjgwX2lzcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBzdHJ1Y3QgbGlzdF9oZWFkICopOworc3RhdGljIHZvaWQgcWxhMTI4MF9yc3RfYWVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworc3RhdGljIHZvaWQgcWxhMTI4MF9zdGF0dXNfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJlc3BvbnNlICosCisJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKik7CitzdGF0aWMgdm9pZCBxbGExMjgwX2Vycm9yX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXNwb25zZSAqLAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKik7CitzdGF0aWMgdWludDE2X3QgcWxhMTI4MF9nZXRfbnZyYW1fd29yZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdWludDE2X3QgcWxhMTI4MF9udnJhbV9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQzMl90KTsKK3N0YXRpYyB1aW50MTZfdCBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKHZvbGF0aWxlIHVpbnQxNl90IF9faW9tZW0gKik7CitzdGF0aWMgcmVxdWVzdF90ICpxbGExMjgwX3JlcV9wa3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitzdGF0aWMgaW50IHFsYTEyODBfY2hlY2tfZm9yX2RlYWRfc2NzaV9idXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwKKwkJCQkJICAgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIHFsYTEyODBfZ2V0X3RhcmdldF9wYXJhbWV0ZXJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosCisJCQkJCSAgIHN0cnVjdCBzY3NpX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgcWxhMTI4MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgaW50LCBpbnQpOworCisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2RyaXZlcl9zZXR1cCBkcml2ZXJfc2V0dXA7CisKKy8qCisgKiBjb252ZXJ0IHNjc2kgZGF0YSBkaXJlY3Rpb24gdG8gcmVxdWVzdF90IGNvbnRyb2wgZmxhZ3MKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorcWxhMTI4MF9kYXRhX2RpcmVjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kKQoreworCXN3aXRjaChjbW5kLT5zY19kYXRhX2RpcmVjdGlvbikgeworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlyZXR1cm4gQklUXzU7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlyZXR1cm4gQklUXzY7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJcmV0dXJuIEJJVF81IHwgQklUXzY7CisJLyoKKwkgKiBXZSBjb3VsZCBCVUcoKSBvbiBkZWZhdWx0IGhlcmUgaWYgb25lIG9mIHRoZSBmb3VyIGNhc2VzIGFyZW4ndAorCSAqIG1ldCwgYnV0IHRoZW4gYWdhaW4gaWYgd2UgcmVjZWl2ZSBzb21ldGhpbmcgbGlrZSB0aGF0IGZyb20gdGhlCisJICogU0NTSSBsYXllciB3ZSBoYXZlIG1vcmUgc2VyaW91cyBwcm9ibGVtcy4gVGhpcyBzaHV0cyB1cCBHQ0MuCisJICovCisJY2FzZSBETUFfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisJCQorI2lmIERFQlVHX1FMQTEyODAKK3N0YXRpYyB2b2lkIF9fcWxhMTI4MF9wcmludF9zY3NpX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKTsKK3N0YXRpYyB2b2lkIF9fcWxhMTI4MF9kdW1wX2J1ZmZlcihjaGFyICosIGludCk7CisjZW5kaWYKKworCisvKgorICogaW5zbW9kIG5lZWRzIHRvIGZpbmQgdGhlIHZhcmlhYmxlIGFuZCBtYWtlIGl0IHBvaW50IHRvIHNvbWV0aGluZworICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgY2hhciAqcWxhMTI4MDsKKworLyogaW5zbW9kIHFsYTEyODAgb3B0aW9ucz12ZXJib3NlIiAqLworbW9kdWxlX3BhcmFtKHFsYTEyODAsIGNoYXJwLCAwKTsKKyNlbHNlCitfX3NldHVwKCJxbGExMjgwPSIsIHFsYTEyODBfc2V0dXApOworI2VuZGlmCisKKworLyoKKyAqIFdlIHVzZSB0aGUgc2NzaV9wb2ludGVyIHN0cnVjdHVyZSB0aGF0J3MgaW5jbHVkZWQgd2l0aCBlYWNoIHNjc2lfY29tbWFuZAorICogdG8gb3ZlcmxheSBvdXIgc3RydWN0IHNyYiBvdmVyIGl0LiBxbGExMjgwX2luaXQoKSBjaGVja3MgdGhhdCBhIHNyYiBpcyBub3QKKyAqIGJpZ2dlciB0aGFuIGEgc2NzaV9wb2ludGVyLgorICovCisKKyNkZWZpbmUJQ01EX1NQKENtbmQpCQkmQ21uZC0+U0NwCisjZGVmaW5lCUNNRF9DREJMRU4oQ21uZCkJQ21uZC0+Y21kX2xlbgorI2RlZmluZQlDTURfQ0RCUChDbW5kKQkJQ21uZC0+Y21uZAorI2RlZmluZQlDTURfU05TUChDbW5kKQkJQ21uZC0+c2Vuc2VfYnVmZmVyCisjZGVmaW5lCUNNRF9TTlNMRU4oQ21uZCkJc2l6ZW9mKENtbmQtPnNlbnNlX2J1ZmZlcikKKyNkZWZpbmUJQ01EX1JFU1VMVChDbW5kKQlDbW5kLT5yZXN1bHQKKyNkZWZpbmUJQ01EX0hBTkRMRShDbW5kKQlDbW5kLT5ob3N0X3NjcmliYmxlCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA1NDUKKyNkZWZpbmUgQ01EX1JFUVVFU1QoQ21uZCkJQ21uZC0+cmVxdWVzdC5jbWQKKyNlbHNlCisjZGVmaW5lIENNRF9SRVFVRVNUKENtbmQpCUNtbmQtPnJlcXVlc3QtPmNtZAorI2VuZGlmCisKKyNkZWZpbmUgQ01EX0hPU1QoQ21uZCkJCUNtbmQtPmRldmljZS0+aG9zdAorI2RlZmluZSBTQ1NJX0JVU18zMihDbW5kKQlDbW5kLT5kZXZpY2UtPmNoYW5uZWwKKyNkZWZpbmUgU0NTSV9UQ05fMzIoQ21uZCkJQ21uZC0+ZGV2aWNlLT5pZAorI2RlZmluZSBTQ1NJX0xVTl8zMihDbW5kKQlDbW5kLT5kZXZpY2UtPmx1bgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgSVNQIEJvYXJkcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHFsYV9ib2FyZHMgeworCXVuc2lnbmVkIGNoYXIgbmFtZVs5XTsJLyogQm9hcmQgSUQgU3RyaW5nICovCisJaW50IG51bVBvcnRzOwkJLyogTnVtYmVyIG9mIFNDU0kgcG9ydHMgKi8KKwl1bnNpZ25lZCBzaG9ydCAqZndjb2RlOwkvKiBwb2ludGVyIHRvIEZXIGFycmF5ICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAqZndsZW47CS8qIG51bWJlciBvZiB3b3JkcyBpbiBhcnJheSAgICAqLworCXVuc2lnbmVkIHNob3J0ICpmd3N0YXJ0OwkvKiBzdGFydCBhZGRyZXNzIGZvciBGL1cgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICpmd3ZlcjsJLyogUHRyIHRvIEYvVyB2ZXJzaW9uIGFycmF5ICAgICovCit9OworCisvKiBOT1RFOiB0aGUgbGFzdCBhcmd1bWVudCBpbiBlYWNoIGVudHJ5IGlzIHVzZWQgdG8gaW5kZXggcWwxMjgwX2JvYXJkX3RibCAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHFsYTEyODBfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTIxNjAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorI2lmZGVmIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwXzEwNDAKKwl7UENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMjAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDF9LAorI2VuZGlmCisJe1BDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDgwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyfSwKKwl7UENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyNDAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDN9LAorCXtQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTI4MCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCisJe1BDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDE2MCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbGExMjgwX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHFsYV9ib2FyZHMgcWwxMjgwX2JvYXJkX3RibFtdID0geworCS8qIE5hbWUgLCAgTnVtYmVyIG9mIHBvcnRzLCBGVyBkZXRhaWxzICovCisJeyJRTEExMjE2MCIsIDIsICZmdzEyMTYwaV9jb2RlMDFbMF0sICZmdzEyMTYwaV9sZW5ndGgwMSwKKwkgJmZ3MTIxNjBpX2FkZHIwMSwgJmZ3MTIxNjBpX3ZlcnNpb25fc3RyWzBdfSwKKwl7IlFMQTEwNDAiLCAxLCAmcmlzY19jb2RlMDFbMF0sICZyaXNjX2NvZGVfbGVuZ3RoMDEsCisJICZyaXNjX2NvZGVfYWRkcjAxLCAmZmlybXdhcmVfdmVyc2lvblswXX0sCisJeyJRTEExMDgwIiwgMSwgJmZ3MTI4MGVpX2NvZGUwMVswXSwgJmZ3MTI4MGVpX2xlbmd0aDAxLAorCSAmZncxMjgwZWlfYWRkcjAxLCAmZncxMjgwZWlfdmVyc2lvbl9zdHJbMF19LAorCXsiUUxBMTI0MCIsIDIsICZmdzEyODBlaV9jb2RlMDFbMF0sICZmdzEyODBlaV9sZW5ndGgwMSwKKwkgJmZ3MTI4MGVpX2FkZHIwMSwgJmZ3MTI4MGVpX3ZlcnNpb25fc3RyWzBdfSwKKwl7IlFMQTEyODAiLCAyLCAmZncxMjgwZWlfY29kZTAxWzBdLCAmZncxMjgwZWlfbGVuZ3RoMDEsCisJICZmdzEyODBlaV9hZGRyMDEsICZmdzEyODBlaV92ZXJzaW9uX3N0clswXX0sCisJeyJRTEExMDE2MCIsIDEsICZmdzEyMTYwaV9jb2RlMDFbMF0sICZmdzEyMTYwaV9sZW5ndGgwMSwKKwkgJmZ3MTIxNjBpX2FkZHIwMSwgJmZ3MTIxNjBpX3ZlcnNpb25fc3RyWzBdfSwKKwl7IiAgICAgICAgIiwgMH0KK307CisKK3N0YXRpYyBpbnQgcWxhMTI4MF92ZXJib3NlID0gMTsKKworI2lmIERFQlVHX1FMQTEyODAKK3N0YXRpYyBpbnQgcWxfZGVidWdfbGV2ZWwgPSAxOworI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmb3JtYXQsIGEuLi4pCVwKKwlkbyB7IGlmIChxbF9kZWJ1Z19sZXZlbCA+PSBsZXZlbCkgcHJpbnRrKEtFUk5fRVJSIGZvcm1hdCwgIyNhKTsgfSB3aGlsZSgwKQorI2RlZmluZSBxbGExMjgwX2R1bXBfYnVmZmVyKGxldmVsLCBidWYsIHNpemUpCVwKKwlpZiAocWxfZGVidWdfbGV2ZWwgPj0gbGV2ZWwpIF9fcWxhMTI4MF9kdW1wX2J1ZmZlcihidWYsIHNpemUpCisjZGVmaW5lIHFsYTEyODBfcHJpbnRfc2NzaV9jbWQobGV2ZWwsIGNtZCkJXAorCWlmIChxbF9kZWJ1Z19sZXZlbCA+PSBsZXZlbCkgX19xbGExMjgwX3ByaW50X3Njc2lfY21kKGNtZCkKKyNlbHNlCisjZGVmaW5lIHFsX2RlYnVnX2xldmVsCQkJMAorI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmb3JtYXQsIGEuLi4pCWRve313aGlsZSgwKQorI2RlZmluZSBxbGExMjgwX2R1bXBfYnVmZmVyKGEsIGIsIGMpCWRve313aGlsZSgwKQorI2RlZmluZSBxbGExMjgwX3ByaW50X3Njc2lfY21kKGEsIGIpCWRve313aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgRU5URVIoeCkJCWRwcmludGsoMywgInFsYTEyODAgOiBFbnRlcmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgTEVBVkUoeCkJCWRwcmludGsoMywgInFsYTEyODAgOiBMZWF2aW5nICVzKClcbiIsIHgpOworI2RlZmluZSBFTlRFUl9JTlRSKHgpCQlkcHJpbnRrKDQsICJxbGExMjgwIDogRW50ZXJpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIExFQVZFX0lOVFIoeCkJCWRwcmludGsoNCwgInFsYTEyODAgOiBMZWF2aW5nICVzKClcbiIsIHgpOworCisKK3N0YXRpYyBpbnQgcWxhMTI4MF9yZWFkX252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MTZfdCAqd3B0cjsKKwl1aW50OF90IGNoa3N1bTsKKwlpbnQgY250LCBpOworCXN0cnVjdCBudnJhbSAqbnY7CisKKwlFTlRFUigicWxhMTI4MF9yZWFkX252cmFtIik7CisKKwlpZiAoZHJpdmVyX3NldHVwLm5vX252cmFtKQorCQlyZXR1cm4gMTsKKworCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxkKTogUmVhZGluZyBOVlJBTVxuIiwgaGEtPmhvc3Rfbm8pOworCisJd3B0ciA9ICh1aW50MTZfdCAqKSZoYS0+bnZyYW07CisJbnYgPSAmaGEtPm52cmFtOworCWNoa3N1bSA9IDA7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAzOyBjbnQrKykgeworCQkqd3B0ciA9IHFsYTEyODBfZ2V0X252cmFtX3dvcmQoaGEsIGNudCk7CisJCWNoa3N1bSArPSAqd3B0ciAmIDB4ZmY7CisJCWNoa3N1bSArPSAoKndwdHIgPj4gOCkgJiAweGZmOworCQl3cHRyKys7CisJfQorCisJaWYgKG52LT5pZDAgIT0gJ0knIHx8IG52LT5pZDEgIT0gJ1MnIHx8CisJICAgIG52LT5pZDIgIT0gJ1AnIHx8IG52LT5pZDMgIT0gJyAnIHx8IG52LT52ZXJzaW9uIDwgMSkgeworCQlkcHJpbnRrKDIsICJJbnZhbGlkIG52cmFtIElEIG9yIHZlcnNpb24hXG4iKTsKKwkJY2hrc3VtID0gMTsKKwl9IGVsc2UgeworCQlmb3IgKDsgY250IDwgc2l6ZW9mKHN0cnVjdCBudnJhbSk7IGNudCsrKSB7CisJCQkqd3B0ciA9IHFsYTEyODBfZ2V0X252cmFtX3dvcmQoaGEsIGNudCk7CisJCQljaGtzdW0gKz0gKndwdHIgJiAweGZmOworCQkJY2hrc3VtICs9ICgqd3B0ciA+PiA4KSAmIDB4ZmY7CisJCQl3cHRyKys7CisJCX0KKwl9CisKKwlkcHJpbnRrKDMsICJxbGExMjgwX3JlYWRfbnZyYW06IE5WUkFNIE1hZ2ljIElEPSAlYyAlYyAlYyAlMDJ4IgorCSAgICAgICAiIHZlcnNpb24gJWlcbiIsIG52LT5pZDAsIG52LT5pZDEsIG52LT5pZDIsIG52LT5pZDMsCisJICAgICAgIG52LT52ZXJzaW9uKTsKKworCisJaWYgKGNoa3N1bSkgeworCQlpZiAoIWRyaXZlcl9zZXR1cC5ub19udnJhbSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxkKTogVW5hYmxlIHRvIGlkZW50aWZ5IG9yICIKKwkJCSAgICAgICAidmFsaWRhdGUgTlZSQU0gY2hlY2tzdW0sIHVzaW5nIGRlZmF1bHQgIgorCQkJICAgICAgICJzZXR0aW5nc1xuIiwgaGEtPmhvc3Rfbm8pOworCQloYS0+bnZyYW1fdmFsaWQgPSAwOworCX0gZWxzZQorCQloYS0+bnZyYW1fdmFsaWQgPSAxOworCisJLyogVGhlIGZpcm13YXJlIGludGVyZmFjZSBpcywgdW0sIGludGVyZXN0aW5nLCBpbiB0aGF0IHRoZQorCSAqIGFjdHVhbCBmaXJtd2FyZSBpbWFnZSBvbiB0aGUgY2hpcCBpcyBsaXR0bGUgZW5kaWFuLCB0aHVzLAorCSAqIHRoZSBwcm9jZXNzIG9mIHRha2luZyB0aGF0IGltYWdlIHRvIHRoZSBDUFUgd291bGQgZW5kIHVwCisJICogbGl0dGxlIGVuZGlhbi4gIEhvd2V2ZXIsIHRoZSBmaXJtYXJlIGludGVyZmFjZSByZXF1aXJlcyBpdAorCSAqIHRvIGJlIHJlYWQgYSB3b3JkICh0d28gYnl0ZXMpIGF0IGEgdGltZS4KKwkgKgorCSAqIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMgd291bGQgYmUgdGhhdCB0aGUgd29yZCAoYW5kCisJICogZG91Ymxld29yZCkgcXVhbnRpdGVzIGluIHRoZSBmaXJtd2FyZSB3b3VsZCBiZSBjb3JyZWN0LCBidXQKKwkgKiB0aGUgYnl0ZXMgd291bGQgYmUgcGFpcndpc2UgcmV2ZXJzZWQuICBTaW5jZSBtb3N0IG9mIHRoZQorCSAqIGZpcm13YXJlIHF1YW50aXRlcyBhcmUsIGluIGZhY3QsIGJ5dGVzLCB3ZSBkbyBhbiBleHRyYQorCSAqIGxlMTZfdG9fY3B1KCkgaW4gdGhlIGZpcm13YXJlIHJlYWQgcm91dGluZS4KKwkgKgorCSAqIFRoZSB1cHNob3Qgb2YgYWxsIHRoaXMgaXMgdGhhdCB0aGUgYnl0ZXMgaW4gdGhlIGZpcm13YXJlCisJICogYXJlIGluIHRoZSBjb3JyZWN0IHBsYWNlcywgYnV0IHRoZSAxNiBhbmQgMzIgYml0IHF1YW50aXRlcworCSAqIGFyZSBzdGlsbCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4gIFdlIGZpeCB0aGF0IHVwIGJlbG93IGJ5CisJICogZG9pbmcgZXh0cmEgcmV2ZXJzZXMgb24gdGhlbSAqLworCW52LT5pc3BfcGFyYW1ldGVyID0gY3B1X3RvX2xlMTYobnYtPmlzcF9wYXJhbWV0ZXIpOworCW52LT5maXJtd2FyZV9mZWF0dXJlLncgPSBjcHVfdG9fbGUxNihudi0+ZmlybXdhcmVfZmVhdHVyZS53KTsKKwlmb3IoaSA9IDA7IGkgPCBNQVhfQlVTRVM7IGkrKykgeworCQludi0+YnVzW2ldLnNlbGVjdGlvbl90aW1lb3V0ID0gY3B1X3RvX2xlMTYobnYtPmJ1c1tpXS5zZWxlY3Rpb25fdGltZW91dCk7CisJCW52LT5idXNbaV0ubWF4X3F1ZXVlX2RlcHRoID0gY3B1X3RvX2xlMTYobnYtPmJ1c1tpXS5tYXhfcXVldWVfZGVwdGgpOworCX0KKwlkcHJpbnRrKDEsICJxbGExMjgwX3JlYWRfbnZyYW06IENvbXBsZXRlZCBSZWFkaW5nIE5WUkFNXG4iKTsKKwlMRUFWRSgicWxhMTI4MF9yZWFkX252cmFtIik7CisKKwlyZXR1cm4gY2hrc3VtOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWxhMTI4MF9pbmZvCisgKiAgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGRyaXZlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3FsYTEyODBfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0YXRpYyBjaGFyIHFsYTEyODBfc2NzaV9uYW1lX2J1ZmZlclsxMjVdOworCWNoYXIgKmJwOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgcWxhX2JvYXJkcyAqYmRwOworCisJYnAgPSAmcWxhMTI4MF9zY3NpX25hbWVfYnVmZmVyWzBdOworCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisJYmRwID0gJnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV07CisJbWVtc2V0KGJwLCAwLCBzaXplb2YocWxhMTI4MF9zY3NpX25hbWVfYnVmZmVyKSk7CisKKwlzcHJpbnRmIChicCwKKwkJICJRTG9naWMgJXMgUENJIHRvIFNDU0kgSG9zdCBBZGFwdGVyXG4iCisJCSAiICAgICAgIEZpcm13YXJlIHZlcnNpb246ICUyZC4lMDJkLiUwMmQsIERyaXZlciB2ZXJzaW9uICVzIiwKKwkJICZiZHAtPm5hbWVbMF0sIGJkcC0+Znd2ZXJbMF0sIGJkcC0+Znd2ZXJbMV0sIGJkcC0+Znd2ZXJbMl0sCisJCSBRTEExMjgwX1ZFUlNJT04pOworCXJldHVybiBicDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsYTEyMDBfcXVldWVjb21tYW5kCisgKiAgICAgUXVldWUgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgorICoKKyAqIE5vdGU6CisgKiBUaGUgbWlkLWxldmVsIGRyaXZlciB0cmllcyB0byBlbnN1cmVzIHRoYXQgcXVldWVjb21tYW5kIG5ldmVyIGdldHMgaW52b2tlZAorICogY29uY3VycmVudGx5IHdpdGggaXRzZWxmIG9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAoYWx0aG91Z2ggdGhlCisgKiBpbnRlcnJ1cHQgaGFuZGxlciBtYXkgY2FsbCB0aGlzIHJvdXRpbmUgYXMgcGFydCBvZiByZXF1ZXN0LWNvbXBsZXRpb24KKyAqIGhhbmRsaW5nKS4gICBVbmZvcnR1bmVseSwgaXQgc29tZXRpbWVzIGNhbGxzIHRoZSBzY2hlZHVsZXIgaW4gaW50ZXJydXB0CisgKiBjb250ZXh0IHdoaWNoIGlzIGEgYmlnIE5PISBOTyEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGExMjgwX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpmbikoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IHNyYiAqc3AgPSAoc3RydWN0IHNyYiAqKSZjbWQtPlNDcDsKKwlpbnQgc3RhdHVzOworCisJY21kLT5zY3NpX2RvbmUgPSBmbjsKKwlzcC0+Y21kID0gY21kOworCXNwLT5mbGFncyA9IDA7CisKKwlxbGExMjgwX3ByaW50X3Njc2lfY21kKDUsIGNtZCk7CisKKyNpZmRlZiBRTEFfNjRCSVRfUFRSCisJLyoKKwkgKiBVc2luZyA2NCBiaXQgY29tbWFuZHMgaWYgdGhlIFBDSSBicmlkZ2UgZG9lc24ndCBzdXBwb3J0IGl0IGlzIGEKKwkgKiBiaXQgd2FzdGVmdWwsIGhvd2V2ZXIgdGhpcyBzaG91bGQgcmVhbGx5IG9ubHkgaGFwcGVuIGlmIG9uZSdzCisJICogUENJIGNvbnRyb2xsZXIgaXMgY29tcGxldGVseSBicm9rZW4sIGxpa2UgdGhlIEJDTTEyNTAuIEZvcgorCSAqIHNhbmUgaGFyZHdhcmUgdGhpcyBpcyBub3QgYW4gaXNzdWUuCisJICovCisJc3RhdHVzID0gcWxhMTI4MF82NGJpdF9zdGFydF9zY3NpKGhhLCBzcCk7CisjZWxzZQorCXN0YXR1cyA9IHFsYTEyODBfMzJiaXRfc3RhcnRfc2NzaShoYSwgc3ApOworI2VuZGlmCisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBhY3Rpb24geworCUFCT1JUX0NPTU1BTkQsCisJQUJPUlRfREVWSUNFLAorCURFVklDRV9SRVNFVCwKKwlCVVNfUkVTRVQsCisJQURBUFRFUl9SRVNFVCwKKwlGQUlMCit9OworCisvKiB0aW1lciBhY3Rpb24gZm9yIGVycm9yIGFjdGlvbiBwcm9jZXNzb3IgKi8KK3N0YXRpYyB2b2lkIHFsYTEyODBfZXJyb3Jfd2FpdF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgX19kYXRhKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopX19kYXRhOworCXN0cnVjdCBzcmIgKnNwID0gKHN0cnVjdCBzcmIgKilDTURfU1AoY21kKTsKKworCWNvbXBsZXRlKHNwLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgcWxhMTI4MF9tYWlsYm94X3RpbWVvdXQodW5zaWduZWQgbG9uZyBfX2RhdGEpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopX19kYXRhOworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZzsKKwlyZWcgPSBoYS0+aW9iYXNlOworCisJaGEtPm1haWxib3hfb3V0WzBdID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDApOworCXByaW50ayhLRVJOX0VSUiAic2NzaSglbGQpOiBtYWlsYm94IHRpbWVkIG91dCwgbWFpbGJveDAgJTA0eCwgIgorCSAgICAgICAiaWN0cmwgJTA0eCwgaXN0YXR1cyAlMDR4XG4iLCBoYS0+aG9zdF9ubywgaGEtPm1haWxib3hfb3V0WzBdLAorCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5pY3RybCksIFJEX1JFR19XT1JEKCZyZWctPmlzdGF0dXMpKTsKKwljb21wbGV0ZShoYS0+bWFpbGJveF93YWl0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBxbGExMjAwX2Vycm9yX2FjdGlvbgorICogICAgVGhlIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBwZXJmb3JtIGEgc3BlY2lmaWVkIGVycm9yIGFjdGlvbiBhbmQKKyAqICAgIHdhaXQgZm9yIHRoZSByZXN1bHRzIChvciB0aW1lIG91dCkuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGNtZCA9IExpbnV4IFNDU0kgY29tbWFuZCBwYWNrZXQgb2YgdGhlIGNvbW1hbmQgdGhhdCBjYXVzZSB0aGUKKyAqICAgICAgICAgICAgYnVzIHJlc2V0LgorICogICAgICBhY3Rpb24gPSBlcnJvciBhY3Rpb24gdG8gdGFrZSAoc2VlIGFjdGlvbl90KQorICoKKyAqIFJldHVybnM6CisgKiAgICAgIFNVQ0NFU1Mgb3IgRkFJTEVECisgKgorICogTm90ZToKKyAqICAgICAgUmVzZXR0aW5nIHRoZSBidXMgYWx3YXlzIHN1Y2NlZWRzIC0gaXMgaGFzIHRvLCBvdGhlcndpc2UgdGhlCisgKiAgICAgIGtlcm5lbCB3aWxsIHBhbmljISBUcnkgYSBzdXJnaWNhbCB0ZWNobmlxdWUgLSBzZW5kaW5nIGEgQlVTCisgKiAgICAgIERFVklDRSBSRVNFVCBtZXNzYWdlIC0gb24gdGhlIG9mZmVuZGluZyB0YXJnZXQgYmVmb3JlIHB1bGxpbmcKKyAqICAgICAgdGhlIFNDU0kgYnVzIHJlc2V0IGxpbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGExMjgwX2Vycm9yX2FjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGVudW0gYWN0aW9uIGFjdGlvbikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJaW50IGJ1cywgdGFyZ2V0LCBsdW47CisJc3RydWN0IHNyYiAqc3A7CisJdWludDE2X3QgZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpoYW5kbGU7CisJaW50IHJlc3VsdCwgaTsKKwlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKShDTURfSE9TVChjbWQpLT5ob3N0ZGF0YSk7CisKKwlkcHJpbnRrKDQsICJlcnJvcl9hY3Rpb24gJWksIGlzdGF0dXMgMHglMDR4XG4iLCBhY3Rpb24sCisJCVJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5pc3RhdHVzKSk7CisKKwlkcHJpbnRrKDQsICJob3N0X2NtZCAweCUwNHgsIGljdHJsIDB4JTA0eCwgamlmZmllcyAlbGlcbiIsCisJCVJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5ob3N0X2NtZCksCisJCVJEX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5pY3RybCksIGppZmZpZXMpOworCisJRU5URVIoInFsYTEyODBfZXJyb3JfYWN0aW9uIik7CisJaWYgKHFsYTEyODBfdmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGkpOiBSZXNldHRpbmcgQ21uZD0weCVwLCAiCisJCSAgICAgICAiSGFuZGxlPTB4JXAsIGFjdGlvbj0weCV4XG4iLAorCQkgICAgICAgaGEtPmhvc3Rfbm8sIGNtZCwgQ01EX0hBTkRMRShjbWQpLCBhY3Rpb24pOworCisJaWYgKGNtZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIihzY3NpPzo/Oj86PykgUmVzZXQgY2FsbGVkIHdpdGggTlVMTCAiCisJCSAgICAgICAic2lfQ21uZCBwb2ludGVyLCBmYWlsaW5nLlxuIik7CisJCUxFQVZFKCJxbGExMjgwX2Vycm9yX2FjdGlvbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXNwID0gKHN0cnVjdCBzcmIgKilDTURfU1AoY21kKTsKKwloYW5kbGUgPSBDTURfSEFORExFKGNtZCk7CisKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCWRhdGEgPSBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKCZoYS0+aW9iYXNlLT5pc3RhdHVzKTsKKwkvKgorCSAqIFRoZSBpb19yZXF1ZXN0X2xvY2sgaXMgaGVsZCB3aGVuIHRoZSByZXNldCBoYW5kbGVyIGlzIGNhbGxlZCwgaGVuY2UKKwkgKiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgY2Fubm90IGJlIHJ1bm5pbmcgaW4gcGFyYWxsZWwgYXMgaXQgYWxzbworCSAqIGdyYWJzIHRoZSBsb2NrLiAvSmVzCisJICovCisJaWYgKGRhdGEgJiBSSVNDX0lOVCkKKwkJcWxhMTI4MF9pc3IoaGEsICZoYS0+ZG9uZV9xKTsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBzdWdnZXN0ZWQgYWN0aW9uIHRoYXQgdGhlIG1pZC1sZXZlbCBkcml2ZXIgd2FudHMKKwkgKiB1cyB0byBwZXJmb3JtLgorCSAqLworCWlmIChoYW5kbGUgPT0gKHVuc2lnbmVkIGNoYXIgKilJTlZBTElEX0hBTkRMRSB8fCBoYW5kbGUgPT0gTlVMTCkgeworCQlpZihhY3Rpb24gPT0gQUJPUlRfQ09NTUFORCkgeworCQkJLyogd2UgbmV2ZXIgZ290IHRoaXMgY29tbWFuZCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogQWJvcnRpbmcgYSBOVUxMIGhhbmRsZVxuIik7CisJCQlyZXR1cm4gU1VDQ0VTUzsJLyogbm8gYWN0aW9uIC0gd2UgZG9uJ3QgaGF2ZSBjb21tYW5kICovCisJCX0KKwl9IGVsc2UgeworCQlzcC0+d2FpdCA9ICZ3YWl0OworCX0KKworCWJ1cyA9IFNDU0lfQlVTXzMyKGNtZCk7CisJdGFyZ2V0ID0gU0NTSV9UQ05fMzIoY21kKTsKKwlsdW4gPSBTQ1NJX0xVTl8zMihjbWQpOworCisJLyogT3ZlcmxvYWRpbmcgcmVzdWx0LiAgSGVyZSBpdCBtZWFucyB0aGUgc3VjY2VzcyBvciBmYWlsIG9mIHRoZQorCSAqICppc3N1ZSogb2YgdGhlIGFjdGlvbi4gIFdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIHJvdXRpbmUsIGl0IG11c3QKKwkgKiBtZWFuIHRoZSBhY3R1YWwgc3VjY2VzcyBvciBmYWlsIG9mIHRoZSBhY3Rpb24gKi8KKwlyZXN1bHQgPSBGQUlMRUQ7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEZBSUw6CisJCWJyZWFrOworCisJY2FzZSBBQk9SVF9DT01NQU5EOgorCQlpZiAoKHNwLT5mbGFncyAmIFNSQl9BQk9SVF9QRU5ESU5HKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJzY3NpKCk6IENvbW1hbmQgaGFzIGEgcGVuZGluZyBhYm9ydCAiCisJCQkgICAgICAgIm1lc3NhZ2UgLSBBQk9SVF9QRU5ESU5HLlxuIik7CisJCQkvKiBUaGlzIHNob3VsZCB0ZWNobmljYWxseSBiZSBpbXBvc3NpYmxlIHNpbmNlIHdlCisJCQkgKiBub3cgd2FpdCBmb3IgYWJvcnQgY29tcGxldGlvbiAqLworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBpKyspIHsKKwkJCWlmIChzcCA9PSBoYS0+b3V0c3RhbmRpbmdfY21kc1tpXSkgeworCQkJCWRwcmludGsoMSwgInFsYTEyODA6IFJJU0MgYWJvcnRpbmcgY29tbWFuZFxuIik7CisJCQkJaWYgKHFsYTEyODBfYWJvcnRfY29tbWFuZChoYSwgc3AsIGkpID09IDApCisJCQkJCXJlc3VsdCA9IFNVQ0NFU1M7CisJCQkJZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIFNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBtaWdodAorCQkJCQkgKiBoYXZlIGhhcHBlbmQgdG8gdGhlIGNvbW1hbmQsIGl0CisJCQkJCSAqIGlzIHVuc2FmZSB0byByZW1vdmUgaXQgZnJvbSB0aGUKKwkJCQkJICogZGV2aWNlJ3MgcXVldWUgYXQgdGhpcyBwb2ludC4KKwkJCQkJICogV2FpdCBhbmQgbGV0IHRoZSBlc2NhbGF0aW9uCisJCQkJCSAqIHByb2Nlc3MgdGFrZSBjYXJlIG9mIGl0LgorCQkJCQkgKi8KKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgInNjc2koJWxpOiVpOiVpOiVpKTogVW5hYmxlIgorCQkJCQkgICAgICAgIiB0byBhYm9ydCBjb21tYW5kIVxuIiwKKwkJCQkJICAgICAgIGhhLT5ob3N0X25vLCBidXMsIHRhcmdldCwgbHVuKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFCT1JUX0RFVklDRToKKwkJaGEtPmZsYWdzLmluX3Jlc2V0ID0gMTsKKwkJaWYgKHFsYTEyODBfdmVyYm9zZSkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZWluZyBhYm9ydCBkZXZpY2UgIgorCQkJICAgICAgICJjb21tYW5kLlxuIiwgaGEtPmhvc3Rfbm8sIGJ1cywgdGFyZ2V0LCBsdW4pOworCQlpZiAocWxhMTI4MF9hYm9ydF9kZXZpY2UoaGEsIGJ1cywgdGFyZ2V0LCBsdW4pID09IDApCisJCQlyZXN1bHQgPSBTVUNDRVNTOworCQlicmVhazsKKworCWNhc2UgREVWSUNFX1JFU0VUOgorCQlpZiAocWxhMTI4MF92ZXJib3NlKQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJzY3NpKCVsZDolZDolZDolZCk6IFF1ZXVlaW5nIGRldmljZSByZXNldCAiCisJCQkgICAgICAgImNvbW1hbmQuXG4iLCBoYS0+aG9zdF9ubywgYnVzLCB0YXJnZXQsIGx1bik7CisJCWhhLT5mbGFncy5pbl9yZXNldCA9IDE7CisJCWlmIChxbGExMjgwX2RldmljZV9yZXNldChoYSwgYnVzLCB0YXJnZXQpID09IDApCisJCQlyZXN1bHQgPSBTVUNDRVNTOworCQlicmVhazsKKworCWNhc2UgQlVTX1JFU0VUOgorCQlpZiAocWxhMTI4MF92ZXJib3NlKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MCglbGQ6JWQpOiBJc3N1aW5nIEJVUyAiCisJCQkgICAgICAgIkRFVklDRSBSRVNFVFxuIiwgaGEtPmhvc3Rfbm8sIGJ1cyk7CisJCWhhLT5mbGFncy5pbl9yZXNldCA9IDE7CisJCWlmIChxbGExMjgwX2J1c19yZXNldChoYSwgYnVzID09IDApKQorCQkJcmVzdWx0ID0gU1VDQ0VTUzsKKworCQlicmVhazsKKworCWNhc2UgQURBUFRFUl9SRVNFVDoKKwlkZWZhdWx0OgorCQlpZiAocWxhMTI4MF92ZXJib3NlKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInNjc2koJWxkKTogSXNzdWVkIEFEQVBURVIgUkVTRVRcbiIsCisJCQkgICAgICAgaGEtPmhvc3Rfbm8pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGQpOiBJL08gcHJvY2Vzc2luZyB3aWxsICIKKwkJCSAgICAgICAiY29udGludWUgYXV0b21hdGljYWxseVxuIiwgaGEtPmhvc3Rfbm8pOworCQl9CisJCWhhLT5mbGFncy5yZXNldF9hY3RpdmUgPSAxOworCQkvKgorCQkgKiBXZSByZXN0YXJ0ZWQgYWxsIG9mIHRoZSBjb21tYW5kcyBhdXRvbWF0aWNhbGx5LCBzbyB0aGUKKwkJICogbWlkLWxldmVsIGNvZGUgY2FuIGV4cGVjdCBjb21wbGV0aW9ucyBtb21lbnRpdGFyaWx5LgorCQkgKi8KKwkJaWYgKHFsYTEyODBfYWJvcnRfaXNwKGhhKSA9PSAwKQorCQkJcmVzdWx0ID0gU1VDQ0VTUzsKKworCQloYS0+ZmxhZ3MucmVzZXRfYWN0aXZlID0gMDsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kb25lX3EpKQorCQlxbGExMjgwX2RvbmUoaGEpOworCWhhLT5mbGFncy5pbl9yZXNldCA9IDA7CisKKwkvKiBJZiB3ZSBkaWRuJ3QgbWFuYWdlIHRvIGlzc3VlIHRoZSBhY3Rpb24sIG9yIHdlIGhhdmUgbm8KKwkgKiBjb21tYW5kIHRvIHdhaXQgZm9yLCBleGl0IGhlcmUgKi8KKwlpZiAocmVzdWx0ID09IEZBSUxFRCB8fCBoYW5kbGUgPT0gTlVMTCB8fAorCSAgICBoYW5kbGUgPT0gKHVuc2lnbmVkIGNoYXIgKilJTlZBTElEX0hBTkRMRSkgeworCQkvKgorCQkgKiBDbGVhciBjb21wbGV0aW9uIHF1ZXVlIHRvIGF2b2lkIHFsYTEyODBfZG9uZSgpIHRyeWluZworCQkgKiB0byBjb21wbGV0ZSB0aGUgY29tbWFuZCBhdCBhIGxhdGVyIHN0YWdlIGFmdGVyIHdlCisJCSAqIGhhdmUgZXhpdGVkIHRoZSBjdXJyZW50IGNvbnRleHQKKwkJICovCisJCXNwLT53YWl0ID0gTlVMTDsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwkvKiBzZXQgdXAgYSB0aW1lciBqdXN0IGluIGNhc2Ugd2UncmUgcmVhbGx5IGphbW1lZCAqLworCWluaXRfdGltZXIoJnRpbWVyKTsKKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArIDQqSFo7CisJdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNtZDsKKwl0aW1lci5mdW5jdGlvbiA9IHFsYTEyODBfZXJyb3Jfd2FpdF90aW1lb3V0OworCWFkZF90aW1lcigmdGltZXIpOworCisJLyogd2FpdCBmb3IgdGhlIGFjdGlvbiB0byBjb21wbGV0ZSAob3IgdGhlIHRpbWVyIHRvIGV4cGlyZSkgKi8KKwlzcGluX3VubG9ja19pcnEoSE9TVF9MT0NLKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKKwlkZWxfdGltZXJfc3luYygmdGltZXIpOworCXNwaW5fbG9ja19pcnEoSE9TVF9MT0NLKTsKKwlzcC0+d2FpdCA9IE5VTEw7CisKKwkvKiB0aGUgb25seSBhY3Rpb24gd2UgbWlnaHQgZ2V0IGEgZmFpbCBmb3IgaXMgYWJvcnQgKi8KKwlpZiAoYWN0aW9uID09IEFCT1JUX0NPTU1BTkQpIHsKKwkJaWYoc3AtPmZsYWdzICYgU1JCX0FCT1JURUQpCisJCQlyZXN1bHQgPSBTVUNDRVNTOworCQllbHNlCisJCQlyZXN1bHQgPSBGQUlMRUQ7CisJfQorCisgbGVhdmU6CisJZHByaW50aygxLCAiUkVTRVQgcmV0dXJuaW5nICVkXG4iLCByZXN1bHQpOworCisJTEVBVkUoInFsYTEyODBfZXJyb3JfYWN0aW9uIik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsYTEyODBfYWJvcnQKKyAqICAgICBBYm9ydCB0aGUgc3BlY2lmaWVkIFNDU0kgY29tbWFuZChzKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIGNtZCkKK3sKKwlyZXR1cm4gcWxhMTI4MF9lcnJvcl9hY3Rpb24oY21kLCBBQk9SVF9DT01NQU5EKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsYTEyODBfZGV2aWNlX3Jlc2V0CisgKiAgICAgUmVzZXQgdGhlIHNwZWNpZmllZCBTQ1NJIGRldmljZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMTI4MF9laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBxbGExMjgwX2Vycm9yX2FjdGlvbihjbWQsIERFVklDRV9SRVNFVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX2J1c19yZXNldAorICogICAgIFJlc2V0IHRoZSBzcGVjaWZpZWQgYnVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMTI4MF9laF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBxbGExMjgwX2Vycm9yX2FjdGlvbihjbWQsIEJVU19SRVNFVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX2FkYXB0ZXJfcmVzZXQKKyAqICAgICBSZXNldCB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgKGJvdGggY2hhbm5lbHMpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGExMjgwX2VoX2FkYXB0ZXJfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBxbGExMjgwX2Vycm9yX2FjdGlvbihjbWQsIEFEQVBURVJfUkVTRVQpOworfQorCitzdGF0aWMgaW50CitxbGExMjgwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJaW50IGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisKKwloZWFkcyA9IDY0OworCXNlY3RvcnMgPSAzMjsKKwljeWxpbmRlcnMgPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCWlmIChjeWxpbmRlcnMgPiAxMDI0KSB7CisJCWhlYWRzID0gMjU1OworCQlzZWN0b3JzID0gNjM7CisJCWN5bGluZGVycyA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gKGhlYWRzICogc2VjdG9ycyk7CisJCS8qIGlmIChjeWxpbmRlcnMgPiAxMDIzKQorCQkgICBjeWxpbmRlcnMgPSAxMDIzOyAqLworCX0KKworCWdlb21bMF0gPSBoZWFkczsKKwlnZW9tWzFdID0gc2VjdG9yczsKKwlnZW9tWzJdID0gY3lsaW5kZXJzOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDYwMAorc3RhdGljIGludAorcWxhMTI4MF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0ZW1wbGF0ZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgPSAmcWxhMTI4MF9wY2lfdGJsWzBdOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlpbnQgbnVtX2hvc3RzID0gMDsKKworCWlmIChzaXplb2Yoc3RydWN0IHNyYikgPiBzaXplb2YoU2NzaV9Qb2ludGVyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAicWxhMTI4MDogc3RydWN0IHNyYiB0b28gYmlnLCBhYm9ydGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgoRE1BX0JJRElSRUNUSU9OQUwgIT0gUENJX0RNQV9CSURJUkVDVElPTkFMKSB8fAorCSAgICAoRE1BX1RPX0RFVklDRSAhPSBQQ0lfRE1BX1RPREVWSUNFKSB8fAorCSAgICAoRE1BX0ZST01fREVWSUNFICE9IFBDSV9ETUFfRlJPTURFVklDRSkgfHwKKwkgICAgKERNQV9OT05FICE9IFBDSV9ETUFfTk9ORSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInFsYTEyODA6IGRtYSBkaXJlY3Rpb24gYml0cyBkb24ndCBtYXRjaFxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE1PRFVMRQorCS8qCisJICogSWYgd2UgYXJlIGNhbGxlZCBhcyBhIG1vZHVsZSwgdGhlIHFsYTEyODAgcG9pbnRlciBtYXkgbm90IGJlIG51bGwKKwkgKiBhbmQgaXQgd291bGQgcG9pbnQgdG8gb3VyIGJvb3R1cCBzdHJpbmcsIGp1c3QgbGlrZSBvbiB0aGUgbGlsbworCSAqIGNvbW1hbmQgbGluZS4gIElGIG5vdCBOVUxMLCB0aGVuIHByb2Nlc3MgdGhpcyBjb25maWcgc3RyaW5nIHdpdGgKKwkgKiBxbGExMjgwX3NldHVwCisJICoKKwkgKiBCb290IHRpbWUgT3B0aW9ucworCSAqIFRvIGFkZCBvcHRpb25zIGF0IGJvb3QgdGltZSBhZGQgYSBsaW5lIHRvIHlvdXIgbGlsby5jb25mIGZpbGUgbGlrZToKKwkgKiBhcHBlbmQ9InFsYTEyODA9dmVyYm9zZSxtYXhfdGFnczp7ezI1NSwyNTUsMjU1LDI1NX0sezI1NSwyNTUsMjU1LDI1NX19IgorCSAqIHdoaWNoIHdpbGwgcmVzdWx0IGluIHRoZSBmaXJzdCBmb3VyIGRldmljZXMgb24gdGhlIGZpcnN0IHR3bworCSAqIGNvbnRyb2xsZXJzIGJlaW5nIHNldCB0byBhIHRhZ2dlZCBxdWV1ZSBkZXB0aCBvZiAzMi4KKwkgKi8KKwlpZiAocWxhMTI4MCkKKwkJcWxhMTI4MF9zZXR1cChxbGExMjgwKTsKKyNlbmRpZgorCisJLyogRmlyc3QgSW5pdGlhbGl6ZSBRTEExMjE2MCBvbiBQQ0kgQnVzIDEgRGV2IDIgKi8KKwl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoaWQtPnZlbmRvciwgaWQtPmRldmljZSwgcGRldikpKSB7CisJCWlmIChwZGV2LT5idXMtPm51bWJlciA9PSAxICYmIFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSAyKSB7CisJCQlpZiAoIXFsYTEyODBfcHJvYmVfb25lKHBkZXYsIGlkKSkKKwkJCQludW1faG9zdHMrKzsKKwkJfQorCX0KKworCXBkZXYgPSBOVUxMOworCS8qIFRyeSBhbmQgZmluZCBlYWNoIGRpZmZlcmVudCB0eXBlIG9mIGFkYXB0ZXIgd2Ugc3VwcG9ydCAqLworCWZvciAoaWQgPSAmcWxhMTI4MF9wY2lfdGJsWzBdOyBpZC0+ZGV2aWNlOyBpZCsrKSB7CisJCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShpZC0+dmVuZG9yLCBpZC0+ZGV2aWNlLCBwZGV2KSkpIHsKKwkJCS8qCisJCQkgKiBza2lwIFFMQTEyMTYwIGFscmVhZHkgaW5pdGlhbGl6ZWQgb24KKwkJCSAqIFBDSSBCdXMgMSBEZXYgMiBzaW5jZSB3ZSBhbHJlYWR5IGluaXRpYWxpemVkCisJCQkgKiBhbmQgcHJlc2VudGVkIGl0CisJCQkgKi8KKwkJCWlmIChpZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwICYmCisJCQkgICAgcGRldi0+YnVzLT5udW1iZXIgPT0gMSAmJgorCQkJICAgIFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSAyKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIXFsYTEyODBfcHJvYmVfb25lKHBkZXYsIGlkKSkKKwkJCQludW1faG9zdHMrKzsKKwkJfQorCX0KKworCXJldHVybiBudW1faG9zdHM7Cit9CisKKy8qCisgKiBUaGlzIGxvb2tzIGEgYml0IHVnbHkgYXMgd2UgY291bGQganVzdCBwYXNzIGRvd24gaG9zdCB0bworICogcWxhMTI4MF9yZW1vdmVfb25lLCBidXQgSSB3YW50IHRvIGtlZXAgcWxhMTI4MF9yZWxlYXNlIHB1cmVseSBhIHdyYXBwZXIKKyAqIGFyb3VuZCBwY2lfZHJpdmVyOjpyZW1vdmUgYXMgdXNlZCBmcm9tIDIuNiBvbndhcmRzLgorICovCitzdGF0aWMgaW50CitxbGExMjgwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKilob3N0LT5ob3N0ZGF0YTsKKworCXFsYTEyODBfcmVtb3ZlX29uZShoYS0+cGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTEyODBfYmlvc3BhcmFtX29sZChEaXNrICogZGlzaywga2Rldl90IGRldiwgaW50IGdlb21bXSkKK3sKKwlyZXR1cm4gcWxhMTI4MF9iaW9zcGFyYW0oZGlzay0+ZGV2aWNlLCBOVUxMLCBkaXNrLT5jYXBhY2l0eSwgZ2VvbSk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBxbGExMjgwX2ludHJfaGFuZGxlcgorICogICBIYW5kbGVzIHRoZSBIL1cgaW50ZXJydXB0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXJxcmV0dXJuX3QKK3FsYTEyODBfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZzsKKwl1MTYgZGF0YTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlFTlRFUl9JTlRSICgicWxhMTI4MF9pbnRyX2hhbmRsZXIiKTsKKwloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWRldl9pZDsKKworCXNwaW5fbG9jayhIT1NUX0xPQ0spOworCisJaGEtPmlzcl9jb3VudCsrOworCXJlZyA9IGhhLT5pb2Jhc2U7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIDApOwkvKiBkaXNhYmxlIG91ciBpbnRlcnJ1cHQuICovCisKKwlkYXRhID0gcWxhMTI4MF9kZWJvdW5jZV9yZWdpc3RlcigmcmVnLT5pc3RhdHVzKTsKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCWlmIChkYXRhICYgUklTQ19JTlQpIHsJCisJCXFsYTEyODBfaXNyKGhhLCAmaGEtPmRvbmVfcSk7CisJCWhhbmRsZWQgPSAxOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmhhLT5kb25lX3EpKQorCQlxbGExMjgwX2RvbmUoaGEpOworCisJc3Bpbl91bmxvY2soSE9TVF9MT0NLKTsKKworCS8qIGVuYWJsZSBvdXIgaW50ZXJydXB0LiAqLworCVdSVF9SRUdfV09SRCgmcmVnLT5pY3RybCwgKElTUF9FTl9JTlQgfCBJU1BfRU5fUklTQykpOworCisJTEVBVkVfSU5UUigicWxhMTI4MF9pbnRyX2hhbmRsZXIiKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50CitxbGExMjgwX3NldF90YXJnZXRfcGFyYW1ldGVycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBidXMsIGludCB0YXJnZXQpCit7CisJdWludDhfdCBtcjsKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlzdHJ1Y3QgbnZyYW0gKm52OworCWludCBzdGF0dXM7CisKKwludiA9ICZoYS0+bnZyYW07CisKKwltciA9IEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wOworCisJLyogU2V0IFRhcmdldCBQYXJhbWV0ZXJzLiAqLworCW1iWzBdID0gTUJDX1NFVF9UQVJHRVRfUEFSQU1FVEVSUzsKKwltYlsxXSA9ICh1aW50MTZfdCkgKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KTsKKwltYlsxXSA8PD0gODsKKworCW1iWzJdID0gKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuYyA8PCA4KTsKKworCWlmIChJU19JU1AxeDE2MChoYSkpIHsKKwkJbWJbMl0gfD0gbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByIDw8IDU7CisJCW1iWzNdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLnN5bmNfb2Zmc2V0IDw8IDgpIHwKKwkJCSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uc3luY19wZXJpb2Q7CisJCW1iWzZdID0JKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MucHByX29wdGlvbnMgPDwgOCkgfAorCQkJIG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MucHByX2J1c193aWR0aDsKKwkJbXIgfD0gQklUXzY7CisJfSBlbHNlIHsKKwkJbWJbM10gPQkobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXg4MC5zeW5jX29mZnNldCA8PCA4KSB8CisJCQkgbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kOworCX0KKworCXN0YXR1cyA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBtciwgJm1iWzBdKTsKKworCWlmIChzdGF0dXMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxkOiVpOiVpKTogIgorCQkgICAgICAgInFsYTEyODBfc2V0X3RhcmdldF9wYXJhbWV0ZXJzKCkgZmFpbGVkXG4iLAorCQkgICAgICAgaGEtPmhvc3Rfbm8sIGJ1cywgdGFyZ2V0KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX3NsYXZlX2NvbmZpZ3VyZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBEZXRlcm1pbmVzIHRoZSBxdWV1ZSBkZXB0aCBmb3IgYSBnaXZlbiBkZXZpY2UuICBUaGVyZSBhcmUgdHdvIHdheXMKKyAqICAgYSBxdWV1ZSBkZXB0aCBjYW4gYmUgb2J0YWluZWQgZm9yIGEgdGFnZ2VkIHF1ZXVlaW5nIGRldmljZS4gIE9uZQorICogICB3YXkgaXMgdGhlIGRlZmF1bHQgcXVldWUgZGVwdGggd2hpY2ggaXMgZGV0ZXJtaW5lZCBieSB3aGV0aGVyCisgKiAgIElmIGl0IGlzIGRlZmluZWQsIHRoZW4gaXQgaXMgdXNlZAorICogICBhcyB0aGUgZGVmYXVsdCBxdWV1ZSBkZXB0aC4gIE90aGVyd2lzZSwgd2UgdXNlIGVpdGhlciA0IG9yIDggYXMgdGhlCisgKiAgIGRlZmF1bHQgcXVldWUgZGVwdGggKGRlcGVuZGVudCBvbiB0aGUgbnVtYmVyIG9mIGhhcmR3YXJlIFNDQnMpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMTI4MF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCWludCBkZWZhdWx0X2RlcHRoID0gMzsKKwlpbnQgYnVzID0gZGV2aWNlLT5jaGFubmVsOworCWludCB0YXJnZXQgPSBkZXZpY2UtPmlkOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBudnJhbSAqbnY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwludiA9ICZoYS0+bnZyYW07CisKKwlpZiAocWxhMTI4MF9jaGVja19mb3JfZGVhZF9zY3NpX2J1cyhoYSwgYnVzKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkICYmCisJICAgIChoYS0+YnVzX3NldHRpbmdzW2J1c10ucXRhZ19lbmFibGVzICYgKEJJVF8wIDw8IHRhcmdldCkpKSB7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLAorCQkJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uaGl3YXQpOworCX0gZWxzZSB7CisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgMCwgZGVmYXVsdF9kZXB0aCk7CisJfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gMHgwMjA1MDAKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMgPSBkZXZpY2UtPnNkdHI7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlID0gZGV2aWNlLT53ZHRyOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3BwciA9IGRldmljZS0+cHByOworI2VuZGlmCisKKwlpZiAoZHJpdmVyX3NldHVwLm5vX3N5bmMgfHwKKwkgICAgKGRyaXZlcl9zZXR1cC5zeW5jX21hc2sgJiYKKwkgICAgICh+ZHJpdmVyX3NldHVwLnN5bmNfbWFzayAmICgxIDw8IHRhcmdldCkpKSkKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMDsKKwlpZiAoZHJpdmVyX3NldHVwLm5vX3dpZGUgfHwKKwkgICAgKGRyaXZlcl9zZXR1cC53aWRlX21hc2sgJiYKKwkgICAgICh+ZHJpdmVyX3NldHVwLndpZGVfbWFzayAmICgxIDw8IHRhcmdldCkpKSkKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV93aWRlID0gMDsKKwlpZiAoSVNfSVNQMXgxNjAoaGEpKSB7CisJCWlmIChkcml2ZXJfc2V0dXAubm9fcHByIHx8CisJCSAgICAoZHJpdmVyX3NldHVwLnBwcl9tYXNrICYmCisJCSAgICAgKH5kcml2ZXJfc2V0dXAucHByX21hc2sgJiAoMSA8PCB0YXJnZXQpKSkpCisJCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPSAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKEhPU1RfTE9DSywgZmxhZ3MpOworCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMpCisJCXN0YXR1cyA9IHFsYTEyODBfc2V0X3RhcmdldF9wYXJhbWV0ZXJzKGhhLCBidXMsIHRhcmdldCk7CisJcWxhMTI4MF9nZXRfdGFyZ2V0X3BhcmFtZXRlcnMoaGEsIGRldmljZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShIT1NUX0xPQ0ssIGZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgwMjA1NDUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbGExMjgwX3NlbGVjdF9xdWV1ZV9kZXB0aAorICoKKyAqICAgU2V0cyB0aGUgcXVldWUgZGVwdGggZm9yIGVhY2ggU0NTSSBkZXZpY2UgaGFuZ2luZyBvZmYgdGhlIGlucHV0CisgKiAgIGhvc3QgYWRhcHRlci4gIFdlIHVzZSBhIHF1ZXVlIGRlcHRoIG9mIDIgZm9yIGRldmljZXMgdGhhdCBkbyBub3QKKyAqICAgc3VwcG9ydCB0YWdnZWQgcXVldWVpbmcuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9zZWxlY3RfcXVldWVfZGVwdGgoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2X3EpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJRU5URVIoInFsYTEyODBfc2VsZWN0X3F1ZXVlX2RlcHRoIik7CisJZm9yIChzZGV2ID0gc2Rldl9xOyBzZGV2OyBzZGV2ID0gc2Rldi0+bmV4dCkKKwkJaWYgKHNkZXYtPmhvc3QgPT0gaG9zdCkKKwkJCXFsYTEyODBfc2xhdmVfY29uZmlndXJlKHNkZXYpOworCisJaWYgKHNkZXZfcSkKKwkJcWxhMTI4MF9jaGVja19mb3JfZGVhZF9zY3NpX2J1cyhoYSwgc2Rldl9xLT5jaGFubmVsKTsKKwlMRUFWRSgicWxhMTI4MF9zZWxlY3RfcXVldWVfZGVwdGgiKTsKK30KKyNlbmRpZgorCisvKgorICogcWxhMTI4MF9kb25lCisgKiAgICAgIFByb2Nlc3MgY29tcGxldGVkIGNvbW1hbmRzLgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGRvbmVfcSAgICAgICA9IGRvbmUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkCitxbGExMjgwX2RvbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBzcmIgKnNwOworCXN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcTsKKwlpbnQgYnVzLCB0YXJnZXQsIGx1bjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwlFTlRFUigicWxhMTI4MF9kb25lIik7CisKKwlkb25lX3EgPSAmaGEtPmRvbmVfcTsKKworCXdoaWxlICghbGlzdF9lbXB0eShkb25lX3EpKSB7CisJCXNwID0gbGlzdF9lbnRyeShkb25lX3EtPm5leHQsIHN0cnVjdCBzcmIsIGxpc3QpOworCisJCWxpc3RfZGVsKCZzcC0+bGlzdCk7CisJCisJCWNtZCA9IHNwLT5jbWQ7CisJCWJ1cyA9IFNDU0lfQlVTXzMyKGNtZCk7CisJCXRhcmdldCA9IFNDU0lfVENOXzMyKGNtZCk7CisJCWx1biA9IFNDU0lfTFVOXzMyKGNtZCk7CisKKwkJc3dpdGNoICgoQ01EX1JFU1VMVChjbWQpID4+IDE2KSkgeworCQljYXNlIERJRF9SRVNFVDoKKwkJCS8qIElzc3VlIG1hcmtlciBjb21tYW5kLiAqLworCQkJcWxhMTI4MF9tYXJrZXIoaGEsIGJ1cywgdGFyZ2V0LCAwLCBNS19TWU5DX0lEKTsKKwkJCWJyZWFrOworCQljYXNlIERJRF9BQk9SVDoKKwkJCXNwLT5mbGFncyAmPSB+U1JCX0FCT1JUX1BFTkRJTkc7CisJCQlzcC0+ZmxhZ3MgfD0gU1JCX0FCT1JURUQ7CisJCQlpZiAoc3AtPmZsYWdzICYgU1JCX1RJTUVPVVQpCisJCQkJQ01EX1JFU1VMVChzcC0+Y21kKSA9IERJRF9USU1FX09VVCA8PCAxNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZWxlYXNlIG1lbW9yeSB1c2VkIGZvciB0aGlzIEkvTyAqLworCQlpZiAoY21kLT51c2Vfc2cpIHsKKwkJCXBjaV91bm1hcF9zZyhoYS0+cGRldiwgY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJY21kLT51c2Vfc2csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGhhLT5wZGV2LCBzcC0+c2F2ZWRfZG1hX2hhbmRsZSwKKwkJCQkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9CisKKwkJLyogQ2FsbCB0aGUgbWlkLWxldmVsIGRyaXZlciBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlDTURfSEFORExFKHNwLT5jbWQpID0gKHVuc2lnbmVkIGNoYXIgKilJTlZBTElEX0hBTkRMRTsKKwkJaGEtPmFjdHRocmVhZHMtLTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MDIwNTAwCisJCWlmIChjbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSkKKwkJCXFsYTEyODBfZ2V0X3RhcmdldF9vcHRpb25zKGNtZCwgaGEpOworI2VuZGlmCisJCSgqKGNtZCktPnNjc2lfZG9uZSkoY21kKTsKKworCQlpZihzcC0+d2FpdCAhPSBOVUxMKQorCQkJY29tcGxldGUoc3AtPndhaXQpOworCX0KKwlMRUFWRSgicWxhMTI4MF9kb25lIik7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIGEgSVNQIGVycm9yIHRvIGEgTGludXggU0NTSSBlcnJvcgorICovCitzdGF0aWMgaW50CitxbGExMjgwX3JldHVybl9zdGF0dXMoc3RydWN0IHJlc3BvbnNlICogc3RzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjcCkKK3sKKwlpbnQgaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJdWludDE2X3QgY29tcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShzdHMtPmNvbXBfc3RhdHVzKTsKKwl1aW50MTZfdCBzdGF0ZV9mbGFncyA9IGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpOworCXVpbnQxNl90IHJlc2lkdWFsX2xlbmd0aCA9IGxlMTZfdG9fY3B1KHN0cy0+cmVzaWR1YWxfbGVuZ3RoKTsKKwl1aW50MTZfdCBzY3NpX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpOworI2lmIERFQlVHX1FMQTEyODBfSU5UUgorCXN0YXRpYyBjaGFyICpyZWFzb25bXSA9IHsKKwkJIkRJRF9PSyIsCisJCSJESURfTk9fQ09OTkVDVCIsCisJCSJESURfQlVTX0JVU1kiLAorCQkiRElEX1RJTUVfT1VUIiwKKwkJIkRJRF9CQURfVEFSR0VUIiwKKwkJIkRJRF9BQk9SVCIsCisJCSJESURfUEFSSVRZIiwKKwkJIkRJRF9FUlJPUiIsCisJCSJESURfUkVTRVQiLAorCQkiRElEX0JBRF9JTlRSIgorCX07CisjZW5kaWYJCQkJLyogREVCVUdfUUxBMTI4MF9JTlRSICovCisKKwlFTlRFUigicWxhMTI4MF9yZXR1cm5fc3RhdHVzIik7CisKKyNpZiBERUJVR19RTEExMjgwX0lOVFIKKwkvKgorCSAgZHByaW50aygxLCAicWxhMTI4MF9yZXR1cm5fc3RhdHVzOiBjb21wbCBzdGF0dXMgPSAweCUwNHhcbiIsCisJICBjb21wX3N0YXR1cyk7CisJKi8KKyNlbmRpZgorCisJc3dpdGNoIChjb21wX3N0YXR1cykgeworCWNhc2UgQ1NfQ09NUExFVEU6CisJCWhvc3Rfc3RhdHVzID0gRElEX09LOworCQlicmVhazsKKworCWNhc2UgQ1NfSU5DT01QTEVURToKKwkJaWYgKCEoc3RhdGVfZmxhZ3MgJiBTRl9HT1RfQlVTKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX05PX0NPTk5FQ1Q7CisJCWVsc2UgaWYgKCEoc3RhdGVfZmxhZ3MgJiBTRl9HT1RfVEFSR0VUKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0JBRF9UQVJHRVQ7CisJCWVsc2UgaWYgKCEoc3RhdGVfZmxhZ3MgJiBTRl9TRU5UX0NEQikpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJZWxzZSBpZiAoIShzdGF0ZV9mbGFncyAmIFNGX1RSQU5TRkVSUkVEX0RBVEEpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEoc3RhdGVfZmxhZ3MgJiBTRl9HT1RfU1RBVFVTKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKHN0YXRlX2ZsYWdzICYgU0ZfR09UX1NFTlNFKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKworCWNhc2UgQ1NfUkVTRVQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX1JFU0VUOworCQlicmVhazsKKworCWNhc2UgQ1NfQUJPUlRFRDoKKwkJaG9zdF9zdGF0dXMgPSBESURfQUJPUlQ7CisJCWJyZWFrOworCisJY2FzZSBDU19USU1FT1VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJYnJlYWs7CisKKwljYXNlIENTX0RBVEFfT1ZFUlJVTjoKKwkJZHByaW50aygyLCAiRGF0YSBvdmVycnVuIDB4JXhcbiIsIHJlc2lkdWFsX2xlbmd0aCk7CisJCWRwcmludGsoMiwgInFsYTEyODBfaXNyOiByZXNwb25zZSBwYWNrZXQgZGF0YVxuIik7CisJCXFsYTEyODBfZHVtcF9idWZmZXIoMiwgKGNoYXIgKilzdHMsIFJFU1BPTlNFX0VOVFJZX1NJWkUpOworCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisKKwljYXNlIENTX0RBVEFfVU5ERVJSVU46CisJCWlmICgoY3AtPnJlcXVlc3RfYnVmZmxlbiAtIHJlc2lkdWFsX2xlbmd0aCkgPAorCQkgICAgY3AtPnVuZGVyZmxvdykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJzY3NpOiBVbmRlcmZsb3cgZGV0ZWN0ZWQgLSByZXRyeWluZyAiCisJCQkgICAgICAgImNvbW1hbmQuXG4iKTsKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQl9IGVsc2UKKwkJCWhvc3Rfc3RhdHVzID0gRElEX09LOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwl9CisKKyNpZiBERUJVR19RTEExMjgwX0lOVFIKKwlkcHJpbnRrKDEsICJxbGExMjgwIElTUCBzdGF0dXM6IGhvc3Qgc3RhdHVzICglcykgc2NzaSBzdGF0dXMgJXhcbiIsCisJCXJlYXNvbltob3N0X3N0YXR1c10sIHNjc2lfc3RhdHVzKTsKKyNlbmRpZgorCisJTEVBVkUoInFsYTEyODBfcmV0dXJuX3N0YXR1cyIpOworCisJcmV0dXJuIChzY3NpX3N0YXR1cyAmIDB4ZmYpIHwgKGhvc3Rfc3RhdHVzIDw8IDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICBRTG9naWMgSVNQMTI4MCBIYXJkd2FyZSBTdXBwb3J0IEZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyoKKyAgKiBxbGEyMTAwX2VuYWJsZV9pbnRycworICAqIHFsYTIxMDBfZGlzYWJsZV9pbnRycworICAqCisgICogSW5wdXQ6CisgICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAgKgorICAqIFJldHVybnM6CisgICogICAgICBOb25lCisgICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTEyODBfZW5hYmxlX2ludHJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWc7CisKKwlyZWcgPSBoYS0+aW9iYXNlOworCS8qIGVuYWJsZSByaXNjIGFuZCBob3N0IGludGVycnVwdHMgKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIChJU1BfRU5fSU5UIHwgSVNQX0VOX1JJU0MpKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pY3RybCk7CS8qIFBDSSBQb3N0ZWQgV3JpdGUgZmx1c2ggKi8KKwloYS0+ZmxhZ3MuaW50c19lbmFibGVkID0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxbGExMjgwX2Rpc2FibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZzsKKworCXJlZyA9IGhhLT5pb2Jhc2U7CisJLyogZGlzYWJsZSByaXNjIGFuZCBob3N0IGludGVycnVwdHMgKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIDApOworCVJEX1JFR19XT1JEKCZyZWctPmljdHJsKTsJLyogUENJIFBvc3RlZCBXcml0ZSBmbHVzaCAqLworCWhhLT5mbGFncy5pbnRzX2VuYWJsZWQgPSAwOworfQorCisvKgorICogcWxhMTI4MF9pbml0aWFsaXplX2FkYXB0ZXIKKyAqICAgICAgSW5pdGlhbGl6ZSBib2FyZC4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK3FsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWc7CisJaW50IHN0YXR1czsKKwlpbnQgYnVzOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MDIwNTAwCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNlbmRpZgorCisJRU5URVIoInFsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyIik7CisKKwkvKiBDbGVhciBhZGFwdGVyIGZsYWdzLiAqLworCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCWhhLT5mbGFncy5kaXNhYmxlX2hvc3RfYWRhcHRlciA9IDA7CisJaGEtPmZsYWdzLnJlc2V0X2FjdGl2ZSA9IDA7CisJaGEtPmZsYWdzLmFib3J0X2lzcF9hY3RpdmUgPSAwOworCisJaGEtPmZsYWdzLmludHNfZW5hYmxlZCA9IDA7CisjaWYgZGVmaW5lZChDT05GSUdfSUE2NF9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19JQTY0X1NHSV9TTjIpCisJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpKTogRW5hYmxpbmcgU04yIFBDSSBETUEgIgorCQkgICAgICAgImR1YWwgY2hhbm5lbCBsb2NrdXAgd29ya2Fyb3VuZFxuIiwgaGEtPmhvc3Rfbm8pOworCQloYS0+ZmxhZ3MudXNlX3BjaV92Y2hhbm5lbCA9IDE7CisJCWRyaXZlcl9zZXR1cC5ub19udnJhbSA9IDE7CisJfQorI2VuZGlmCisKKwkvKiBUT0RPOiBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGhlIDEwNDAgbnZyYW0gZm9ybWF0ICovCisJaWYgKElTX0lTUDEwNDAoaGEpKQorCQlkcml2ZXJfc2V0dXAubm9fbnZyYW0gPSAxOworCisJZHByaW50aygxLCAiQ29uZmlndXJlIFBDSSBzcGFjZSBmb3IgYWRhcHRlci4uLlxuIik7CisKKwlyZWcgPSBoYS0+aW9iYXNlOworCisJLyogSW5zdXJlIG1haWxib3ggcmVnaXN0ZXJzIGFyZSBmcmVlLiAqLworCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfQ0xSX1JJU0NfSU5UKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQsIEhDX0NMUl9IT1NUX0lOVCk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQpOworCisJaWYgKHFsYTEyODBfcmVhZF9udnJhbShoYSkpIHsKKwkJZHByaW50aygyLCAicWxhMTI4MF9pbml0aWFsaXplX2FkYXB0ZXI6IGZhaWxlZCB0byByZWFkICIKKwkJCSJOVlJBTVxuIik7CisJfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwNTAwCisJLyoKKwkgKiBJdCdzIG5lY2Vzc2FyeSB0byBncmFiIHRoZSBzcGluIGhlcmUgYXMgcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQKKwkgKiBuZWVkcyB0byBiZSBhYmxlIHRvIGRyb3AgdGhlIGxvY2sgdW5jb25kaXRpb25hbGx5IHRvIHdhaXQKKwkgKiBmb3IgY29tcGxldGlvbi4KKwkgKiBJbiAyLjQgLT5kZXRlY3QgaXMgY2FsbGVkIHdpdGggdGhlIGlvX3JlcXVlc3RfbG9jayBoZWxkLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKEhPU1RfTE9DSywgZmxhZ3MpOworI2VuZGlmCisKKwlzdGF0dXMgPSBxbGExMjgwX2xvYWRfZmlybXdhcmUoaGEpOworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IGluaXRpYWxpemU6IHBjaSBwcm9iZSBmYWlsZWQhXG4iLAorCQkgICAgICAgaGEtPmhvc3Rfbm8pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXR1cCBhZGFwdGVyIGJhc2VkIG9uIE5WUkFNIHBhcmFtZXRlcnMuICovCisJZHByaW50aygxLCAic2NzaSglbGQpOiBDb25maWd1cmUgTlZSQU0gcGFyYW1ldGVyc1xuIiwgaGEtPmhvc3Rfbm8pOworCXFsYTEyODBfbnZyYW1fY29uZmlnKGhhKTsKKworCWlmIChoYS0+ZmxhZ3MuZGlzYWJsZV9ob3N0X2FkYXB0ZXIpIHsKKwkJc3RhdHVzID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gcWxhMTI4MF9pbml0X3JpbmdzKGhhKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKworCS8qIElzc3VlIFNDU0kgcmVzZXQsIGlmIHdlIGNhbid0IHJlc2V0IHR3aWNlIHRoZW4gYnVzIGlzIGRlYWQgKi8KKwlmb3IgKGJ1cyA9IDA7IGJ1cyA8IGhhLT5wb3J0czsgYnVzKyspIHsKKwkJaWYgKCFoYS0+YnVzX3NldHRpbmdzW2J1c10uZGlzYWJsZV9zY3NpX3Jlc2V0ICYmCisJCSAgICBxbGExMjgwX2J1c19yZXNldChoYSwgYnVzKSAmJgorCQkgICAgcWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cykpCisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uc2NzaV9idXNfZGVhZCA9IDE7CisJfQorCisJaGEtPmZsYWdzLm9ubGluZSA9IDE7Cisgb3V0OgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDUwMAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoSE9TVF9MT0NLLCBmbGFncyk7CisjZW5kaWYKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2luaXRpYWxpemVfYWRhcHRlcjogKioqKiBGQUlMRUQgKioqKlxuIik7CisKKwlMRUFWRSgicWxhMTI4MF9pbml0aWFsaXplX2FkYXB0ZXIiKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBJU1AgRmlybXdhcmUgVGVzdAorICogICAgICBDaGVja3MgaWYgcHJlc2VudCB2ZXJzaW9uIG9mIFJJU0MgZmlybXdhcmUgaXMgb2xkZXIgdGhhbgorICogICAgICBkcml2ZXIgZmlybXdhcmUuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBmaXJtd2FyZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC4KKyAqLworc3RhdGljIGludAorcWxhMTI4MF9pc3BfZmlybXdhcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBudnJhbSAqbnYgPSAoc3RydWN0IG52cmFtICopIGhhLT5yZXNwb25zZV9yaW5nOworCWludCBzdGF0dXMgPSAwOwkJLyogZGcgMi8yNyBhbHdheXMgbG9hZHMgUklTQyAqLworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCisJRU5URVIoInFsYTEyODBfaXNwX2Zpcm13YXJlIik7CisKKwlkcHJpbnRrKDEsICJzY3NpKCVsaSk6IERldGVybWluaW5nIGlmIFJJU0MgaXMgbG9hZGVkXG4iLCBoYS0+aG9zdF9ubyk7CisKKwkvKiBCYWQgTlZSQU0gZGF0YSwgbG9hZCBSSVNDIGNvZGUuICovCisJaWYgKCFoYS0+bnZyYW1fdmFsaWQpIHsKKwkJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPSAwOworCX0gZWxzZQorCQloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9CisJCQludi0+Y250cl9mbGFnc18xLmRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGU7CisKKwlpZiAoaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQpIHsKKwkJZHByaW50aygzLCAicWxhMTI4MF9pc3BfZmlybXdhcmU6IFRlbGxpbmcgUklTQyB0byB2ZXJpZnkgIgorCQkJImNoZWNrc3VtIG9mIGxvYWRlZCBCSU9TIGNvZGUuXG4iKTsKKworCQkvKiBWZXJpZnkgY2hlY2tzdW0gb2YgbG9hZGVkIFJJU0MgY29kZS4gKi8KKwkJbWJbMF0gPSBNQkNfVkVSSUZZX0NIRUNLU1VNOworCQkvKiBtYlsxXSA9IHFsMTJfcmlzY19jb2RlX2FkZHIwMTsgKi8KKwkJbWJbMV0gPSAqcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md3N0YXJ0OworCisJCWlmICghKHN0YXR1cyA9CisJCSAgICAgIHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pKSkgeworCQkJLyogU3RhcnQgZmlybXdhcmUgZXhlY3V0aW9uLiAqLworCQkJZHByaW50aygzLCAicWxhMTI4MF9pc3BfZmlybXdhcmU6IFN0YXJ0bmcgRi9XICIKKwkJCQkiZXhlY3V0aW9uLlxuIik7CisKKwkJCW1iWzBdID0gTUJDX0VYRUNVVEVfRklSTVdBUkU7CisJCQkvKiBtYlsxXSA9IHFsMTJfcmlzY19jb2RlX2FkZHIwMTsgKi8KKwkJCW1iWzFdID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKKwkJCXFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IFJJU0MgY2hlY2tzdW0gZmFpbGVkLlxuIik7CisJfSBlbHNlIHsKKwkJZHByaW50aygxLCAicWxhMTI4MDogTlZSQU0gY29uZmlndXJlZCB0byBsb2FkIFJJU0MgbG9hZC5cbiIpOworCQlzdGF0dXMgPSAxOworCX0KKworCWlmIChzdGF0dXMpCisJCWRwcmludGsoMiwgInFsYTEyODBfaXNwX2Zpcm13YXJlOiAqKioqIExvYWQgUklTQyBjb2RlICoqKipcbiIpOworCisJTEVBVkUoInFsYTEyODBfaXNwX2Zpcm13YXJlIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIENoaXAgZGlhZ25vc3RpY3MKKyAqICAgICAgVGVzdCBjaGlwIGZvciBwcm9wZXIgb3BlcmF0aW9uLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMTI4MF9jaGlwX2RpYWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGNudDsKKwl1aW50MTZfdCBkYXRhOworCWRwcmludGsoMywgInFsYTEyODBfY2hpcF9kaWFnOiB0ZXN0aW5nIGRldmljZSBhdCAweCVwIFxuIiwgJnJlZy0+aWRfbCk7CisKKwlkcHJpbnRrKDEsICJzY3NpKCVsZCk6IFZlcmlmeWluZyBjaGlwXG4iLCBoYS0+aG9zdF9ubyk7CisKKwkvKiBTb2Z0IHJlc2V0IGNoaXAgYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIElTUF9SRVNFVCk7CisKKwkvKgorCSAqIFdlIGNhbid0IGRvIGEgdHJhZGl0aW9uYWwgUENJIHdyaXRlIGZsdXNoIGhlcmUgYnkgcmVhZGluZworCSAqIGJhY2sgdGhlIHJlZ2lzdGVyLiBUaGUgY2FyZCB3aWxsIG5vdCByZXNwb25kIG9uY2UgdGhlIHJlc2V0CisJICogaXMgaW4gYWN0aW9uIGFuZCB3ZSBlbmQgdXAgd2l0aCBhIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uCisJICogaW5zdGVhZC4gTm90aGluZyB0byBkbyBidXQgd2FpdCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisJICogQSBwb3J0YWJsZSBwY2lfd3JpdGVfZmx1c2gocGRldikgY2FsbCB3b3VsZCBiZSB2ZXJ5IHVzZWZ1bCBoZXJlLgorCSAqLworCXVkZWxheSgyMCk7CisJZGF0YSA9IHFsYTEyODBfZGVib3VuY2VfcmVnaXN0ZXIoJnJlZy0+aWN0cmwpOworCS8qCisJICogWWV0IGFub3RoZXIgUUxvZ2ljIGdlbSA7LSgKKwkgKi8KKwlmb3IgKGNudCA9IDEwMDAwMDA7IGNudCAmJiBkYXRhICYgSVNQX1JFU0VUOyBjbnQtLSkgeworCQl1ZGVsYXkoNSk7CisJCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5pY3RybCk7CisJfQorCisJaWYgKCFjbnQpCisJCWdvdG8gZmFpbDsKKworCS8qIFJlc2V0IHJlZ2lzdGVyIGNsZWFyZWQgYnkgY2hpcCByZXNldC4gKi8KKwlkcHJpbnRrKDMsICJxbGExMjgwX2NoaXBfZGlhZzogcmVzZXQgcmVnaXN0ZXIgY2xlYXJlZCBieSBjaGlwIHJlc2V0XG4iKTsKKworCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgMCk7CisKKwkvKiBSZXNldCBSSVNDIGFuZCBkaXNhYmxlIEJJT1Mgd2hpY2gKKwkgICBhbGxvd3MgUklTQyB0byBleGVjdXRlIG91dCBvZiBSQU0uICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhvc3RfY21kLCBIQ19SRVNFVF9SSVNDIHwKKwkJICAgICBIQ19SRUxFQVNFX1JJU0MgfCBIQ19ESVNBQkxFX0JJT1MpOworCisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCWRhdGEgPSBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKCZyZWctPm1haWxib3gwKTsKKworCS8qCisJICogSSAqTE9WRSogdGhpcyBjb2RlIQorCSAqLworCWZvciAoY250ID0gMTAwMDAwMDsgY250ICYmIGRhdGEgPT0gTUJTX0JVU1k7IGNudC0tKSB7CisJCXVkZWxheSg1KTsKKwkJZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gwKTsKKwl9CisKKwlpZiAoIWNudCkKKwkJZ290byBmYWlsOworCisJLyogQ2hlY2sgcHJvZHVjdCBJRCBvZiBjaGlwICovCisJZHByaW50aygzLCAicWxhMTI4MF9jaGlwX2RpYWc6IENoZWNraW5nIHByb2R1Y3QgSUQgb2YgY2hpcFxuIik7CisKKwlpZiAoUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDEpICE9IFBST0RfSURfMSB8fAorCSAgICAoUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpICE9IFBST0RfSURfMiAmJgorCSAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpICE9IFBST0RfSURfMmEpIHx8CisJICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gzKSAhPSBQUk9EX0lEXzMgfHwKKwkgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDQpICE9IFBST0RfSURfNCkgeworCQlwcmludGsoS0VSTl9JTkZPICJxbGExMjgwOiBXcm9uZyBwcm9kdWN0IElEID0gIgorCQkgICAgICAgIjB4JXgsMHgleCwweCV4LDB4JXhcbiIsCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSksCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MiksCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MyksCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCkpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBFbmFibGUgaW50cyBlYXJseSEhIQorCSAqLworCXFsYTEyODBfZW5hYmxlX2ludHJzKGhhKTsKKworCWRwcmludGsoMSwgInFsYTEyODBfY2hpcF9kaWFnOiBDaGVja2luZyBtYWlsYm94ZXMgb2YgY2hpcFxuIik7CisJLyogV3JhcCBJbmNvbWluZyBNYWlsYm94ZXMgVGVzdC4gKi8KKwltYlswXSA9IE1CQ19NQUlMQk9YX1JFR0lTVEVSX1RFU1Q7CisJbWJbMV0gPSAweEFBQUE7CisJbWJbMl0gPSAweDU1NTU7CisJbWJbM10gPSAweEFBNTU7CisJbWJbNF0gPSAweDU1QUE7CisJbWJbNV0gPSAweEE1QTU7CisJbWJbNl0gPSAweDVBNUE7CisJbWJbN10gPSAweDI1MjU7CisKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgMHhmZiwgbWIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZmFpbDsKKworCWlmIChtYlsxXSAhPSAweEFBQUEgfHwgbWJbMl0gIT0gMHg1NTU1IHx8IG1iWzNdICE9IDB4QUE1NSB8fAorCSAgICBtYls0XSAhPSAweDU1QUEgfHwgbWJbNV0gIT0gMHhBNUE1IHx8IG1iWzZdICE9IDB4NUE1QSB8fAorCSAgICBtYls3XSAhPSAweDI1MjUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogRmFpbGVkIG1ib3ggY2hlY2tcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZHByaW50aygzLCAicWxhMTI4MF9jaGlwX2RpYWc6IGV4aXRpbmcgbm9ybWFsbHlcbiIpOworCXJldHVybiAwOworIGZhaWw6CisJZHByaW50aygyLCAicWxhMTI4MF9jaGlwX2RpYWc6ICoqKiogRkFJTEVEICoqKipcbiIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTEyODBfbG9hZF9maXJtd2FyZV9waW8oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQxNl90IHJpc2NfYWRkcmVzcywgKnJpc2NfY29kZV9hZGRyZXNzLCByaXNjX2NvZGVfc2l6ZTsKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXSwgaTsKKwlpbnQgZXJyOworCisJLyogTG9hZCBSSVNDIGNvZGUuICovCisJcmlzY19hZGRyZXNzID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKKwlyaXNjX2NvZGVfYWRkcmVzcyA9IHFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndjb2RlOworCXJpc2NfY29kZV9zaXplID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgcmlzY19jb2RlX3NpemU7IGkrKykgeworCQltYlswXSA9IE1CQ19XUklURV9SQU1fV09SRDsKKwkJbWJbMV0gPSByaXNjX2FkZHJlc3MgKyBpOworCQltYlsyXSA9IHJpc2NfY29kZV9hZGRyZXNzW2ldOworCisJCWVyciA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMCB8IEJJVF8xIHwgQklUXzIsIG1iKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IEZhaWxlZCB0byBsb2FkIGZpcm13YXJlXG4iLAorCQkJCQloYS0+aG9zdF9ubyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRFVNUF9JVF9CQUNLIDAJCS8qIGZvciBkZWJ1ZyBvZiBSSVNDIGxvYWRpbmcgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfbG9hZF9maXJtd2FyZV9kbWEoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQxNl90IHJpc2NfYWRkcmVzcywgKnJpc2NfY29kZV9hZGRyZXNzLCByaXNjX2NvZGVfc2l6ZTsKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXSwgY250OworCWludCBlcnIgPSAwLCBudW0sIGk7CisjaWYgRFVNUF9JVF9CQUNLCisJdWludDhfdCAqc3AsICp0YnVmOworCWRtYV9hZGRyX3QgcF90YnVmOworCisJdGJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LCA4MDAwLCAmcF90YnVmKTsKKwlpZiAoIXRidWYpCisJCXJldHVybiAtRU5PTUVNOworI2VuZGlmCisKKwkvKiBMb2FkIFJJU0MgY29kZS4gKi8KKwlyaXNjX2FkZHJlc3MgPSAqcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md3N0YXJ0OworCXJpc2NfY29kZV9hZGRyZXNzID0gcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md2NvZGU7CisJcmlzY19jb2RlX3NpemUgPSAqcWwxMjgwX2JvYXJkX3RibFtoYS0+ZGV2bnVtXS5md2xlbjsKKworCWRwcmludGsoMSwgIiVzOiBETUEgUklTQyBjb2RlICglaSkgd29yZHNcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJpc2NfY29kZV9zaXplKTsKKworCW51bSA9IDA7CisJd2hpbGUgKHJpc2NfY29kZV9zaXplID4gMCkgeworCQlpbnQgd2FybiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IDA7CisKKwkJY250ID0gMjAwMCA+PiAxOworCisJCWlmIChjbnQgPiByaXNjX2NvZGVfc2l6ZSkKKwkJCWNudCA9IHJpc2NfY29kZV9zaXplOworCisJCWRwcmludGsoMiwgInFsYTEyODBfc2V0dXBfY2hpcDogIGxvYWRpbmcgcmlzYyBAID0oMHglcCksIgorCQkJIiVkLCVkKDB4JXgpXG4iLAorCQkJcmlzY19jb2RlX2FkZHJlc3MsIGNudCwgbnVtLCByaXNjX2FkZHJlc3MpOworCQlmb3IoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJCSgodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nKVtpXSA9CisJCQkJY3B1X3RvX2xlMTYocmlzY19jb2RlX2FkZHJlc3NbaV0pOworCisJCW1iWzBdID0gTUJDX0xPQURfUkFNOworCQltYlsxXSA9IHJpc2NfYWRkcmVzczsKKwkJbWJbNF0gPSBjbnQ7CisJCW1iWzNdID0gaGEtPnJlcXVlc3RfZG1hICYgMHhmZmZmOworCQltYlsyXSA9IChoYS0+cmVxdWVzdF9kbWEgPj4gMTYpICYgMHhmZmZmOworCQltYls3XSA9IHBjaV9kbWFfaGkzMihoYS0+cmVxdWVzdF9kbWEpICYgMHhmZmZmOworCQltYls2XSA9IHBjaV9kbWFfaGkzMihoYS0+cmVxdWVzdF9kbWEpID4+IDE2OworCQlkcHJpbnRrKDIsICIlczogb3A9JWQgIDB4JXAgPSAweCU0eCwweCU0eCwweCU0eCwweCU0eFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIG1iWzBdLAorCQkJCSh2b2lkICopKGxvbmcpaGEtPnJlcXVlc3RfZG1hLAorCQkJCW1iWzZdLCBtYls3XSwgbWJbMl0sIG1iWzNdKTsKKwkJZXJyID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF80IHwgQklUXzMgfCBCSVRfMiB8CisJCQkJQklUXzEgfCBCSVRfMCwgbWIpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNjc2koJWxpKTogRmFpbGVkIHRvIGxvYWQgcGFydGlhbCAiCisJCQkgICAgICAgInNlZ21lbnQgb2YgZlxuIiwgaGEtPmhvc3Rfbm8pOworCQkJZ290byBvdXQ7CisJCX0KKworI2lmIERVTVBfSVRfQkFDSworCQltYlswXSA9IE1CQ19EVU1QX1JBTTsKKwkJbWJbMV0gPSByaXNjX2FkZHJlc3M7CisJCW1iWzRdID0gY250OworCQltYlszXSA9IHBfdGJ1ZiAmIDB4ZmZmZjsKKwkJbWJbMl0gPSAocF90YnVmID4+IDE2KSAmIDB4ZmZmZjsKKwkJbWJbN10gPSBwY2lfZG1hX2hpMzIocF90YnVmKSAmIDB4ZmZmZjsKKwkJbWJbNl0gPSBwY2lfZG1hX2hpMzIocF90YnVmKSA+PiAxNjsKKworCQllcnIgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzQgfCBCSVRfMyB8IEJJVF8yIHwKKwkJCQlCSVRfMSB8IEJJVF8wLCBtYik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJGYWlsZWQgdG8gZHVtcCBwYXJ0aWFsIHNlZ21lbnQgb2YgZi93XG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNwID0gKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nOworCQlmb3IgKGkgPSAwOyBpIDwgKGNudCA8PCAxKTsgaSsrKSB7CisJCQlpZiAodGJ1ZltpXSAhPSBzcFtpXSAmJiB3YXJuKysgPCAxMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZXIGNvbXBhcmUgZXJyb3IgQCAiCisJCQkJCQkiYnl0ZSgweCV4KSBsb29wIz0leFxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXywgaSwgbnVtKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGV2J5dGU9JXggICIKKwkJCQkJCSJGV2Zyb21DaGlwPSV4XG4iLAorCQkJCQkJX19GVU5DVElPTl9fLCBzcFtpXSwgdGJ1ZltpXSk7CisJCQkJLypicmVhazsgKi8KKwkJCX0KKwkJfQorI2VuZGlmCisJCXJpc2NfYWRkcmVzcyArPSBjbnQ7CisJCXJpc2NfY29kZV9zaXplID0gcmlzY19jb2RlX3NpemUgLSBjbnQ7CisJCXJpc2NfY29kZV9hZGRyZXNzID0gcmlzY19jb2RlX2FkZHJlc3MgKyBjbnQ7CisJCW51bSsrOworCX0KKworIG91dDoKKyNpZiBEVU1QX0lUX0JBQ0sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LCA4MDAwLCB0YnVmLCBwX3RidWYpOworI2VuZGlmCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorcWxhMTI4MF9zdGFydF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJaW50IGVycjsKKworCWRwcmludGsoMSwgIiVzOiBWZXJpZnlpbmcgY2hlY2tzdW0gb2YgbG9hZGVkIFJJU0MgY29kZS5cbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCisJLyogVmVyaWZ5IGNoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuICovCisJbWJbMF0gPSBNQkNfVkVSSUZZX0NIRUNLU1VNOworCS8qIG1iWzFdID0gcWwxMl9yaXNjX2NvZGVfYWRkcjAxOyAqLworCW1iWzFdID0gKnFsMTI4MF9ib2FyZF90YmxbaGEtPmRldm51bV0uZndzdGFydDsKKwllcnIgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgbWIpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IEZhaWxlZCBjaGVja3N1bVxuIiwgaGEtPmhvc3Rfbm8pOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFN0YXJ0IGZpcm13YXJlIGV4ZWN1dGlvbi4gKi8KKwlkcHJpbnRrKDEsICIlczogc3RhcnQgZmlybXdhcmUgcnVubmluZy5cbiIsIF9fRlVOQ1RJT05fXyk7CisJbWJbMF0gPSBNQkNfRVhFQ1VURV9GSVJNV0FSRTsKKwltYlsxXSA9ICpxbDEyODBfYm9hcmRfdGJsW2hhLT5kZXZudW1dLmZ3c3RhcnQ7CisJZXJyID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2koJWxpKTogRmFpbGVkIHRvIHN0YXJ0IGZpcm13YXJlXG4iLAorCQkJCWhhLT5ob3N0X25vKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitxbGExMjgwX2xvYWRfZmlybXdhcmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCBlcnIgPSAtRU5PREVWOworCisJLyogSWYgZmlybXdhcmUgbmVlZHMgdG8gYmUgbG9hZGVkICovCisJaWYgKCFxbGExMjgwX2lzcF9maXJtd2FyZShoYSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsaSk6IGlzcF9maXJtd2FyZSgpIGZhaWxlZCFcbiIsCisJCQkJaGEtPmhvc3Rfbm8pOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBxbGExMjgwX2NoaXBfZGlhZyhoYSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKElTX0lTUDEwNDAoaGEpKQorCQllcnIgPSBxbGExMjgwX2xvYWRfZmlybXdhcmVfcGlvKGhhKTsKKwllbHNlCisJCWVyciA9IHFsYTEyODBfbG9hZF9maXJtd2FyZV9kbWEoaGEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHFsYTEyODBfc3RhcnRfZmlybXdhcmUoaGEpOworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogSW5pdGlhbGl6ZSByaW5ncworICoKKyAqIElucHV0OgorICogICAgICBoYSAgICAgICAgICAgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgaGEtPnJlcXVlc3RfcmluZyAgPSByZXF1ZXN0IHJpbmcgdmlydHVhbCBhZGRyZXNzCisgKiAgICAgIGhhLT5yZXNwb25zZV9yaW5nID0gcmVzcG9uc2UgcmluZyB2aXJ0dWFsIGFkZHJlc3MKKyAqICAgICAgaGEtPnJlcXVlc3RfZG1hICAgPSByZXF1ZXN0IHJpbmcgcGh5c2ljYWwgYWRkcmVzcworICogICAgICBoYS0+cmVzcG9uc2VfZG1hICA9IHJlc3BvbnNlIHJpbmcgcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGExMjgwX2luaXRfcmluZ3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWludCBzdGF0dXMgPSAwOworCisJRU5URVIoInFsYTEyODBfaW5pdF9yaW5ncyIpOworCisJLyogQ2xlYXIgb3V0c3RhbmRpbmcgY29tbWFuZHMgYXJyYXkuICovCisJbWVtc2V0KGhhLT5vdXRzdGFuZGluZ19jbWRzLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNyYiAqKSAqIE1BWF9PVVRTVEFORElOR19DT01NQU5EUyk7CisKKwkvKiBJbml0aWFsaXplIHJlcXVlc3QgcXVldWUuICovCisJaGEtPnJlcXVlc3RfcmluZ19wdHIgPSBoYS0+cmVxdWVzdF9yaW5nOworCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7CisJaGEtPnJlcV9xX2NudCA9IFJFUVVFU1RfRU5UUllfQ05UOworCS8qIG1iWzBdID0gTUJDX0lOSVRfUkVRVUVTVF9RVUVVRTsgKi8KKwltYlswXSA9IE1CQ19JTklUX1JFUVVFU1RfUVVFVUVfQTY0OworCW1iWzFdID0gUkVRVUVTVF9FTlRSWV9DTlQ7CisJbWJbM10gPSBoYS0+cmVxdWVzdF9kbWEgJiAweGZmZmY7CisJbWJbMl0gPSAoaGEtPnJlcXVlc3RfZG1hID4+IDE2KSAmIDB4ZmZmZjsKKwltYls0XSA9IDA7CisJbWJbN10gPSBwY2lfZG1hX2hpMzIoaGEtPnJlcXVlc3RfZG1hKSAmIDB4ZmZmZjsKKwltYls2XSA9IHBjaV9kbWFfaGkzMihoYS0+cmVxdWVzdF9kbWEpID4+IDE2OworCWlmICghKHN0YXR1cyA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfNyB8IEJJVF82IHwgQklUXzQgfAorCQkJCQkgICAgICAgQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsCisJCQkJCSAgICAgICAmbWJbMF0pKSkgeworCQkvKiBJbml0aWFsaXplIHJlc3BvbnNlIHF1ZXVlLiAqLworCQloYS0+cmVzcG9uc2VfcmluZ19wdHIgPSBoYS0+cmVzcG9uc2VfcmluZzsKKwkJaGEtPnJzcF9yaW5nX2luZGV4ID0gMDsKKwkJLyogbWJbMF0gPSBNQkNfSU5JVF9SRVNQT05TRV9RVUVVRTsgKi8KKwkJbWJbMF0gPSBNQkNfSU5JVF9SRVNQT05TRV9RVUVVRV9BNjQ7CisJCW1iWzFdID0gUkVTUE9OU0VfRU5UUllfQ05UOworCQltYlszXSA9IGhhLT5yZXNwb25zZV9kbWEgJiAweGZmZmY7CisJCW1iWzJdID0gKGhhLT5yZXNwb25zZV9kbWEgPj4gMTYpICYgMHhmZmZmOworCQltYls1XSA9IDA7CisJCW1iWzddID0gcGNpX2RtYV9oaTMyKGhhLT5yZXNwb25zZV9kbWEpICYgMHhmZmZmOworCQltYls2XSA9IHBjaV9kbWFfaGkzMihoYS0+cmVzcG9uc2VfZG1hKSA+PiAxNjsKKwkJc3RhdHVzID0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF83IHwgQklUXzYgfCBCSVRfNSB8CisJCQkJCQkgQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsCisJCQkJCQkgJm1iWzBdKTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2luaXRfcmluZ3M6ICoqKiogRkFJTEVEICoqKipcbiIpOworCisJTEVBVkUoInFsYTEyODBfaW5pdF9yaW5ncyIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitxbGExMjgwX3ByaW50X3NldHRpbmdzKHN0cnVjdCBudnJhbSAqbnYpCit7CisJZHByaW50aygxLCAicWxhMTI4MCA6IGluaXRpYXRvciBzY3NpIGlkIGJ1c1swXT0lZFxuIiwKKwkJbnYtPmJ1c1swXS5jb25maWdfMS5pbml0aWF0b3JfaWQpOworCWRwcmludGsoMSwgInFsYTEyODAgOiBpbml0aWF0b3Igc2NzaSBpZCBidXNbMV09JWRcbiIsCisJCW52LT5idXNbMV0uY29uZmlnXzEuaW5pdGlhdG9yX2lkKTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiBidXMgcmVzZXQgZGVsYXlbMF09JWRcbiIsCisJCW52LT5idXNbMF0uYnVzX3Jlc2V0X2RlbGF5KTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogYnVzIHJlc2V0IGRlbGF5WzFdPSVkXG4iLAorCQludi0+YnVzWzFdLmJ1c19yZXNldF9kZWxheSk7CisKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogcmV0cnkgY291bnRbMF09JWRcbiIsIG52LT5idXNbMF0ucmV0cnlfY291bnQpOworCWRwcmludGsoMSwgInFsYTEyODAgOiByZXRyeSBkZWxheVswXT0lZFxuIiwgbnYtPmJ1c1swXS5yZXRyeV9kZWxheSk7CisJZHByaW50aygxLCAicWxhMTI4MCA6IHJldHJ5IGNvdW50WzFdPSVkXG4iLCBudi0+YnVzWzFdLnJldHJ5X2NvdW50KTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogcmV0cnkgZGVsYXlbMV09JWRcbiIsIG52LT5idXNbMV0ucmV0cnlfZGVsYXkpOworCisJZHByaW50aygxLCAicWxhMTI4MCA6IGFzeW5jIGRhdGEgc2V0dXAgdGltZVswXT0lZFxuIiwKKwkJbnYtPmJ1c1swXS5jb25maWdfMi5hc3luY19kYXRhX3NldHVwX3RpbWUpOworCWRwcmludGsoMSwgInFsYTEyODAgOiBhc3luYyBkYXRhIHNldHVwIHRpbWVbMV09JWRcbiIsCisJCW52LT5idXNbMV0uY29uZmlnXzIuYXN5bmNfZGF0YV9zZXR1cF90aW1lKTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiByZXEvYWNrIGFjdGl2ZSBuZWdhdGlvblswXT0lZFxuIiwKKwkJbnYtPmJ1c1swXS5jb25maWdfMi5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbik7CisJZHByaW50aygxLCAicWxhMTI4MCA6IHJlcS9hY2sgYWN0aXZlIG5lZ2F0aW9uWzFdPSVkXG4iLAorCQludi0+YnVzWzFdLmNvbmZpZ18yLnJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uKTsKKworCWRwcmludGsoMSwgInFsYTEyODAgOiBkYXRhIGxpbmUgYWN0aXZlIG5lZ2F0aW9uWzBdPSVkXG4iLAorCQludi0+YnVzWzBdLmNvbmZpZ18yLmRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb24pOworCWRwcmludGsoMSwgInFsYTEyODAgOiBkYXRhIGxpbmUgYWN0aXZlIG5lZ2F0aW9uWzFdPSVkXG4iLAorCQludi0+YnVzWzFdLmNvbmZpZ18yLmRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb24pOworCisJZHByaW50aygxLCAicWxhMTI4MCA6IGRpc2FibGUgbG9hZGluZyByaXNjIGNvZGU9JWRcbiIsCisJCW52LT5jbnRyX2ZsYWdzXzEuZGlzYWJsZV9sb2FkaW5nX3Jpc2NfY29kZSk7CisKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogZW5hYmxlIDY0Yml0IGFkZHJlc3Npbmc9JWRcbiIsCisJCW52LT5jbnRyX2ZsYWdzXzEuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcpOworCisJZHByaW50aygxLCAicWxhMTI4MCA6IHNlbGVjdGlvbiB0aW1lb3V0IGxpbWl0WzBdPSVkXG4iLAorCQludi0+YnVzWzBdLnNlbGVjdGlvbl90aW1lb3V0KTsKKwlkcHJpbnRrKDEsICJxbGExMjgwIDogc2VsZWN0aW9uIHRpbWVvdXQgbGltaXRbMV09JWRcbiIsCisJCW52LT5idXNbMV0uc2VsZWN0aW9uX3RpbWVvdXQpOworCisJZHByaW50aygxLCAicWxhMTI4MCA6IG1heCBxdWV1ZSBkZXB0aFswXT0lZFxuIiwKKwkJbnYtPmJ1c1swXS5tYXhfcXVldWVfZGVwdGgpOworCWRwcmludGsoMSwgInFsYTEyODAgOiBtYXggcXVldWUgZGVwdGhbMV09JWRcbiIsCisJCW52LT5idXNbMV0ubWF4X3F1ZXVlX2RlcHRoKTsKK30KKworc3RhdGljIHZvaWQKK3FsYTEyODBfc2V0X3RhcmdldF9kZWZhdWx0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBidXMsIGludCB0YXJnZXQpCit7CisJc3RydWN0IG52cmFtICpudiA9ICZoYS0+bnZyYW07CisKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYucmVuZWdvdGlhdGVfb25fZXJyb3IgPSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5hdXRvX3JlcXVlc3Rfc2Vuc2UgPSAxOworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi50YWdfcXVldWluZyA9IDE7CisJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jID0gMTsKKyNpZiAxCS8qIFNvbWUgU0NTSSBQcm9jZXNzb3JzIGRvIG5vdCBzZWVtIHRvIGxpa2UgdGhpcyAqLworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IDE7CisjZW5kaWYKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYucGFyaXR5X2NoZWNraW5nID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZGlzY29ubmVjdF9hbGxvd2VkID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZXhlY3V0aW9uX3Rocm90dGxlID0KKwkJbnYtPmJ1c1tidXNdLm1heF9xdWV1ZV9kZXB0aCAtIDE7CisKKwlpZiAoSVNfSVNQMXgxNjAoaGEpKSB7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLmRldmljZV9lbmFibGUgPSAxOworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5zeW5jX29mZnNldCA9IDB4MGU7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5zeW5jX3BlcmlvZCA9IDk7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3BwciA9IDE7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MucHByX29wdGlvbnMgPSAyOworCQludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLnBwcl9idXNfd2lkdGggPSAxOworCX0gZWxzZSB7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuZGV2aWNlX2VuYWJsZSA9IDE7CisJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuc3luY19vZmZzZXQgPSAxMjsKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnN5bmNfcGVyaW9kID0gMTA7CisJfQorfQorCitzdGF0aWMgdm9pZAorcWxhMTI4MF9zZXRfZGVmYXVsdHMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBudnJhbSAqbnYgPSAmaGEtPm52cmFtOworCWludCBidXMsIHRhcmdldDsKKworCWRwcmludGsoMSwgIlVzaW5nIGRlZmF1bHRzIGZvciBOVlJBTTogXG4iKTsKKwltZW1zZXQobnYsIDAsIHNpemVvZihzdHJ1Y3QgbnZyYW0pKTsKKworCS8qIG52LT5jbnRyX2ZsYWdzXzEuZGlzYWJsZV9sb2FkaW5nX3Jpc2NfY29kZSA9IDE7ICovCisJbnYtPmZpcm13YXJlX2ZlYXR1cmUuZi5lbmFibGVfZmFzdF9wb3N0aW5nID0gMTsKKwludi0+ZmlybXdhcmVfZmVhdHVyZS5mLmRpc2FibGVfc3luY2hyb25vdXNfYmFja29mZiA9IDE7CisJbnYtPnRlcm1pbmF0aW9uLmYuc2NzaV9idXNfMF9jb250cm9sID0gMzsKKwludi0+dGVybWluYXRpb24uZi5zY3NpX2J1c18xX2NvbnRyb2wgPSAzOworCW52LT50ZXJtaW5hdGlvbi5mLmF1dG9fdGVybV9zdXBwb3J0ID0gMTsKKworCS8qCisJICogU2V0IGRlZmF1bHQgRklGTyBtYWdpYyAtIFdoYXQgYXBwcm9wcmlhdGUgdmFsdWVzIHdvdWxkIGJlIGhlcmUKKwkgKiBpcyB1bmtub3duLiBUaGlzIGlzIHdoYXQgSSBoYXZlIGZvdW5kIHRlc3Rpbmcgd2l0aCAxMjE2MHMuCisJICoKKwkgKiBOb3csIEkgd291bGQgbG92ZSB0aGUgbWFnaWMgZGVjb2RlciByaW5nIGZvciB0aGlzIG9uZSwgdGhlCisJICogaGVhZGVyIGZpbGUgcHJvdmlkZWQgYnkgUUxvZ2ljIHNlZW1zIHRvIGJlIGJvZ3VzIG9yIGluY29tcGxldGUKKwkgKiBhdCBiZXN0LgorCSAqLworCW52LT5pc3BfY29uZmlnLmMgPSBJU1BfQ0ZHMV9CRU5BQnxJU1BfQ0ZHMV9GMTI4OworCWlmIChJU19JU1AxeDE2MChoYSkpCisJCW52LT5pc3BfcGFyYW1ldGVyID0gMHgwMTsgLyogZmFzdCBtZW1vcnkgZW5hYmxlICovCisKKwlmb3IgKGJ1cyA9IDA7IGJ1cyA8IE1BWF9CVVNFUzsgYnVzKyspIHsKKwkJbnYtPmJ1c1tidXNdLmNvbmZpZ18xLmluaXRpYXRvcl9pZCA9IDc7CisJCW52LT5idXNbYnVzXS5jb25maWdfMi5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbiA9IDE7CisJCW52LT5idXNbYnVzXS5jb25maWdfMi5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uID0gMTsKKwkJbnYtPmJ1c1tidXNdLnNlbGVjdGlvbl90aW1lb3V0ID0gMjUwOworCQludi0+YnVzW2J1c10ubWF4X3F1ZXVlX2RlcHRoID0gMjU2OworCisJCWlmIChJU19JU1AxMDQwKGhhKSkgeworCQkJbnYtPmJ1c1tidXNdLmJ1c19yZXNldF9kZWxheSA9IDM7CisJCQludi0+YnVzW2J1c10uY29uZmlnXzIuYXN5bmNfZGF0YV9zZXR1cF90aW1lID0gNjsKKwkJCW52LT5idXNbYnVzXS5yZXRyeV9kZWxheSA9IDE7CisJCX0gZWxzZSB7CisJCQludi0+YnVzW2J1c10uYnVzX3Jlc2V0X2RlbGF5ID0gNTsKKwkJCW52LT5idXNbYnVzXS5jb25maWdfMi5hc3luY19kYXRhX3NldHVwX3RpbWUgPSA4OworCQl9CisKKwkJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCBNQVhfVEFSR0VUUzsgdGFyZ2V0KyspCisJCQlxbGExMjgwX3NldF90YXJnZXRfZGVmYXVsdHMoaGEsIGJ1cywgdGFyZ2V0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3FsYTEyODBfY29uZmlnX3RhcmdldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBidXMsIGludCB0YXJnZXQpCit7CisJc3RydWN0IG52cmFtICpudiA9ICZoYS0+bnZyYW07CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJaW50IHN0YXR1cywgbHVuOworCisJLyogU2V0IFRhcmdldCBQYXJhbWV0ZXJzLiAqLworCW1iWzBdID0gTUJDX1NFVF9UQVJHRVRfUEFSQU1FVEVSUzsKKwltYlsxXSA9ICh1aW50MTZfdCkgKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KTsKKwltYlsxXSA8PD0gODsKKworCS8qCisJICogRG8gbm90IGVuYWJsZSB3aWRlLCBzeW5jLCBhbmQgcHByIGZvciB0aGUgaW5pdGlhbAorCSAqIElOUVVJUlkgcnVuLiBXZSBlbmFibGUgdGhpcyBsYXRlciBpZiB3ZSBkZXRlcm1pbmUKKwkgKiB0aGUgdGFyZ2V0IGFjdHVhbGx5IHN1cHBvcnRzIGl0LgorCSAqLworCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi4KKwkJYXV0b19yZXF1ZXN0X3NlbnNlID0gMTsKKwludi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuCisJCXN0b3BfcXVldWVfb25fY2hlY2sgPSAwOworCisJaWYgKElTX0lTUDF4MTYwKGhhKSkKKwkJbnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC4KKwkJCWZsYWdzLmVuYWJsZV9wcHIgPSAwOworCisJLyoKKwkgKiBObyBzeW5jLCB3aWRlLCBldGMuIHdoaWxlIHByb2JpbmcKKwkgKi8KKwltYlsyXSA9IChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmMgPDwgOCkgJgorCQl+KFRQX1NZTkMgLyp8IFRQX1dJREUgfCBUUF9QUFIqLyk7CisKKwlpZiAoSVNfSVNQMXgxNjAoaGEpKQorCQltYlszXSA9CW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4MTYwLnN5bmNfb2Zmc2V0IDw8IDg7CisJZWxzZQorCQltYlszXSA9CW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuc3luY19vZmZzZXQgPDwgODsKKwltYlszXSB8PSBudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uc3luY19wZXJpb2Q7CisKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwkvKiBTYXZlIFRhZyBxdWV1aW5nIGVuYWJsZSBmbGFnLiAqLworCW1iWzBdID0gQklUXzAgPDwgdGFyZ2V0OworCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYudGFnX3F1ZXVpbmcpCisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5xdGFnX2VuYWJsZXMgfD0gbWJbMF07CisKKwkvKiBTYXZlIERldmljZSBlbmFibGUgZmxhZy4gKi8KKwlpZiAoSVNfSVNQMXgxNjAoaGEpKSB7CisJCWlmIChudi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0uZmxhZ3MuZmxhZ3MxeDE2MC5kZXZpY2VfZW5hYmxlKQorCQkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmRldmljZV9lbmFibGVzIHw9IG1iWzBdOworCQloYS0+YnVzX3NldHRpbmdzW2J1c10ubHVuX2Rpc2FibGVzIHw9IDA7CisJfSBlbHNlIHsKKwkJaWYgKG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5mbGFncy5mbGFnczF4ODAuZGV2aWNlX2VuYWJsZSkKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5kZXZpY2VfZW5hYmxlcyB8PSBtYlswXTsKKwkJLyogU2F2ZSBMVU4gZGlzYWJsZSBmbGFnLiAqLworCQlpZiAobnYtPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLmZsYWdzLmZsYWdzMXg4MC5sdW5fZGlzYWJsZSkKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5sdW5fZGlzYWJsZXMgfD0gbWJbMF07CisJfQorCisJLyogU2V0IERldmljZSBRdWV1ZSBQYXJhbWV0ZXJzLiAqLworCWZvciAobHVuID0gMDsgbHVuIDwgTUFYX0xVTlM7IGx1bisrKSB7CisJCW1iWzBdID0gTUJDX1NFVF9ERVZJQ0VfUVVFVUU7CisJCW1iWzFdID0gKHVpbnQxNl90KShidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCk7CisJCW1iWzFdID0gbWJbMV0gPDwgOCB8IGx1bjsKKwkJbWJbMl0gPSBudi0+YnVzW2J1c10ubWF4X3F1ZXVlX2RlcHRoOworCQltYlszXSA9IG52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5leGVjdXRpb25fdGhyb3R0bGU7CisJCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgMHgwZiwgJm1iWzBdKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CitxbGExMjgwX2NvbmZpZ19idXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzKQoreworCXN0cnVjdCBudnJhbSAqbnYgPSAmaGEtPm52cmFtOworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWludCB0YXJnZXQsIHN0YXR1czsKKworCS8qIFNDU0kgUmVzZXQgRGlzYWJsZS4gKi8KKwloYS0+YnVzX3NldHRpbmdzW2J1c10uZGlzYWJsZV9zY3NpX3Jlc2V0ID0KKwkJbnYtPmJ1c1tidXNdLmNvbmZpZ18xLnNjc2lfcmVzZXRfZGlzYWJsZTsKKworCS8qIEluaXRpYXRvciBJRC4gKi8KKwloYS0+YnVzX3NldHRpbmdzW2J1c10uaWQgPSBudi0+YnVzW2J1c10uY29uZmlnXzEuaW5pdGlhdG9yX2lkOworCW1iWzBdID0gTUJDX1NFVF9JTklUSUFUT1JfSUQ7CisJbWJbMV0gPSBidXMgPyBoYS0+YnVzX3NldHRpbmdzW2J1c10uaWQgfCBCSVRfNyA6CisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5pZDsKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCS8qIFJlc2V0IERlbGF5LiAqLworCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5idXNfcmVzZXRfZGVsYXkgPQorCQludi0+YnVzW2J1c10uYnVzX3Jlc2V0X2RlbGF5OworCisJLyogQ29tbWFuZCBxdWV1ZSBkZXB0aCBwZXIgZGV2aWNlLiAqLworCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5oaXdhdCA9IG52LT5idXNbYnVzXS5tYXhfcXVldWVfZGVwdGggLSAxOworCisJLyogU2V0IHRhcmdldCBwYXJhbWV0ZXJzLiAqLworCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgTUFYX1RBUkdFVFM7IHRhcmdldCsrKQorCQlzdGF0dXMgfD0gcWxhMTI4MF9jb25maWdfdGFyZ2V0KGhhLCBidXMsIHRhcmdldCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CitxbGExMjgwX252cmFtX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3QgbnZyYW0gKm52ID0gJmhhLT5udnJhbTsKKwlpbnQgYnVzLCB0YXJnZXQsIHN0YXR1cyA9IDA7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJdWludDE2X3QgbWFzazsKKworCUVOVEVSKCJxbGExMjgwX252cmFtX2NvbmZpZyIpOworCisJaWYgKGhhLT5udnJhbV92YWxpZCkgeworCQkvKiBBbHdheXMgZm9yY2UgQVVUTyBzZW5zZSBmb3IgTElOVVggU0NTSSAqLworCQlmb3IgKGJ1cyA9IDA7IGJ1cyA8IE1BWF9CVVNFUzsgYnVzKyspCisJCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IE1BWF9UQVJHRVRTOyB0YXJnZXQrKykgeworCQkJCW52LT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi4KKwkJCQkJYXV0b19yZXF1ZXN0X3NlbnNlID0gMTsKKwkJCX0KKwl9IGVsc2UgeworCQlxbGExMjgwX3NldF9kZWZhdWx0cyhoYSk7CisJfQorCisJcWxhMTI4MF9wcmludF9zZXR0aW5ncyhudik7CisKKwkvKiBEaXNhYmxlIFJJU0MgbG9hZCBvZiBmaXJtd2FyZS4gKi8KKwloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9CisJCW52LT5jbnRyX2ZsYWdzXzEuZGlzYWJsZV9sb2FkaW5nX3Jpc2NfY29kZTsKKworCWlmIChJU19JU1AxMDQwKGhhKSkgeworCQl1aW50MTZfdCBod3JldiwgY2ZnMSwgY2RtYV9jb25mLCBkZG1hX2NvbmY7CisKKwkJaHdyZXYgPSBSRF9SRUdfV09SRCgmcmVnLT5jZmdfMCkgJiBJU1BfQ0ZHMF9IV01TSzsKKworCQljZmcxID0gUkRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEpOworCQljZG1hX2NvbmYgPSBSRF9SRUdfV09SRCgmcmVnLT5jZG1hX2NmZyk7CisJCWRkbWFfY29uZiA9IFJEX1JFR19XT1JEKCZyZWctPmRkbWFfY2ZnKTsKKworCQkvKiBCdXN0ZWQgZmlmbywgc2F5cyBtamFjb2IuICovCisJCWlmIChod3JldiA9PSBJU1BfQ0ZHMF8xMDQwQSkKKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY2ZnMSB8IElTUF9DRkcxX0Y2NCk7CisJCWVsc2UKKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgY2ZnMSB8IElTUF9DRkcxX0Y2NCB8IElTUF9DRkcxX0JFTkFCKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2RtYV9jZmcsIGNkbWFfY29uZiB8IENETUFfQ09ORl9CRU5BQik7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5kZG1hX2NmZywgY2RtYV9jb25mIHwgRERNQV9DT05GX0JFTkFCKTsKKwl9IGVsc2UgeworCQkvKiBTZXQgSVNQIGhhcmR3YXJlIERNQSBidXJzdCAqLworCQltYlswXSA9IG52LT5pc3BfY29uZmlnLmM7CisJCS8qIEVuYWJsZSBETUEgYXJiaXRyYXRpb24gb24gZHVhbCBjaGFubmVsIGNvbnRyb2xsZXJzICovCisJCWlmIChoYS0+cG9ydHMgPiAxKQorCQkJbWJbMF0gfD0gQklUXzEzOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y2ZnXzEsIG1iWzBdKTsKKworCQkvKiBTZXQgU0NTSSB0ZXJtaW5hdGlvbi4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmdwaW9fZW5hYmxlLCAoQklUXzMgKyBCSVRfMiArIEJJVF8xICsgQklUXzApKTsKKwkJbWJbMF0gPSBudi0+dGVybWluYXRpb24uYyAmIChCSVRfMyArIEJJVF8yICsgQklUXzEgKyBCSVRfMCk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvX2RhdGEsIG1iWzBdKTsKKwl9CisKKwkvKiBJU1AgcGFyYW1ldGVyIHdvcmQuICovCisJbWJbMF0gPSBNQkNfU0VUX1NZU1RFTV9QQVJBTUVURVI7CisJbWJbMV0gPSBudi0+aXNwX3BhcmFtZXRlcjsKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwlpZiAoSVNfSVNQMXg0MChoYSkpIHsKKwkJLyogY2xvY2sgcmF0ZSAtIGZvciBxbGExMjQwIGFuZCBvbGRlciwgb25seSAqLworCQltYlswXSA9IE1CQ19TRVRfQ0xPQ0tfUkFURTsKKwkJbWJbMV0gPSA0MDsKKwkgCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgbWIpOworCX0KKworCS8qIEZpcm13YXJlIGZlYXR1cmUgd29yZC4gKi8KKwltYlswXSA9IE1CQ19TRVRfRklSTVdBUkVfRkVBVFVSRVM7CisJbWFzayA9IEJJVF81IHwgQklUXzEgfCBCSVRfMDsKKwltYlsxXSA9IGxlMTZfdG9fY3B1KG52LT5maXJtd2FyZV9mZWF0dXJlLncpICYgKG1hc2spOworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZCAoQ09ORklHX0lBNjRfU0dJX1NOMikKKwlpZiAoaWE2NF9wbGF0Zm9ybV9pcygic24yIikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGkpOiBFbmFibGluZyBTTjIgUENJIERNQSAiCisJCSAgICAgICAid29ya2Fyb3VuZFxuIiwgaGEtPmhvc3Rfbm8pOworCQltYlsxXSB8PSBCSVRfOTsKKwl9CisjZW5kaWYKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIG1hc2ssICZtYlswXSk7CisKKwkvKiBSZXRyeSBjb3VudCBhbmQgZGVsYXkuICovCisJbWJbMF0gPSBNQkNfU0VUX1JFVFJZX0NPVU5UOworCW1iWzFdID0gbnYtPmJ1c1swXS5yZXRyeV9jb3VudDsKKwltYlsyXSA9IG52LT5idXNbMF0ucmV0cnlfZGVsYXk7CisJbWJbNl0gPSBudi0+YnVzWzFdLnJldHJ5X2NvdW50OworCW1iWzddID0gbnYtPmJ1c1sxXS5yZXRyeV9kZWxheTsKKwlzdGF0dXMgfD0gcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF83IHwgQklUXzYgfCBCSVRfMiB8CisJCQkJCSAgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCS8qIEFTWU5DIGRhdGEgc2V0dXAgdGltZS4gKi8KKwltYlswXSA9IE1CQ19TRVRfQVNZTkNfREFUQV9TRVRVUDsKKwltYlsxXSA9IG52LT5idXNbMF0uY29uZmlnXzIuYXN5bmNfZGF0YV9zZXR1cF90aW1lOworCW1iWzJdID0gbnYtPmJ1c1sxXS5jb25maWdfMi5hc3luY19kYXRhX3NldHVwX3RpbWU7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwkvKiBBY3RpdmUgbmVnYXRpb24gc3RhdGVzLiAqLworCW1iWzBdID0gTUJDX1NFVF9BQ1RJVkVfTkVHQVRJT047CisJbWJbMV0gPSAwOworCWlmIChudi0+YnVzWzBdLmNvbmZpZ18yLnJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uKQorCQltYlsxXSB8PSBCSVRfNTsKKwlpZiAobnYtPmJ1c1swXS5jb25maWdfMi5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uKQorCQltYlsxXSB8PSBCSVRfNDsKKwltYlsyXSA9IDA7CisJaWYgKG52LT5idXNbMV0uY29uZmlnXzIucmVxX2Fja19hY3RpdmVfbmVnYXRpb24pCisJCW1iWzJdIHw9IEJJVF81OworCWlmIChudi0+YnVzWzFdLmNvbmZpZ18yLmRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb24pCisJCW1iWzJdIHw9IEJJVF80OworCXN0YXR1cyB8PSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJbWJbMF0gPSBNQkNfU0VUX0RBVEFfT1ZFUlJVTl9SRUNPVkVSWTsKKwltYlsxXSA9IDI7CS8qIFJlc2V0IFNDU0kgYnVzIGFuZCByZXR1cm4gYWxsIG91dHN0YW5kaW5nIElPICovCisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJLyogdGhpbmd5ICovCisJbWJbMF0gPSBNQkNfU0VUX1BDSV9DT05UUk9MOworCW1iWzFdID0gMjsJLyogRGF0YSBETUEgQ2hhbm5lbCBCdXJzdCBFbmFibGUgKi8KKwltYlsyXSA9IDI7CS8qIENvbW1hbmQgRE1BIENoYW5uZWwgQnVyc3QgRW5hYmxlICovCisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwltYlswXSA9IE1CQ19TRVRfVEFHX0FHRV9MSU1JVDsKKwltYlsxXSA9IDg7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJLyogU2VsZWN0aW9uIHRpbWVvdXQuICovCisJbWJbMF0gPSBNQkNfU0VUX1NFTEVDVElPTl9USU1FT1VUOworCW1iWzFdID0gbnYtPmJ1c1swXS5zZWxlY3Rpb25fdGltZW91dDsKKwltYlsyXSA9IG52LT5idXNbMV0uc2VsZWN0aW9uX3RpbWVvdXQ7CisJc3RhdHVzIHw9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsICZtYlswXSk7CisKKwlmb3IgKGJ1cyA9IDA7IGJ1cyA8IGhhLT5wb3J0czsgYnVzKyspCisJCXN0YXR1cyB8PSBxbGExMjgwX2NvbmZpZ19idXMoaGEsIGJ1cyk7CisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX252cmFtX2NvbmZpZzogKioqKiBGQUlMRUQgKioqKlxuIik7CisKKwlMRUFWRSgicWxhMTI4MF9udnJhbV9jb25maWciKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogR2V0IE5WUkFNIGRhdGEgd29yZAorICogICAgICBDYWxjdWxhdGVzIHdvcmQgcG9zaXRpb24gaW4gTlZSQU0gYW5kIGNhbGxzIHJlcXVlc3Qgcm91dGluZSB0bworICogICAgICBnZXQgdGhlIHdvcmQgZnJvbSBOVlJBTS4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgYWRkcmVzcyA9IE5WUkFNIHdvcmQgYWRkcmVzcy4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICBkYXRhIHdvcmQuCisgKi8KK3N0YXRpYyB1aW50MTZfdAorcWxhMTI4MF9nZXRfbnZyYW1fd29yZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGFkZHJlc3MpCit7CisJdWludDMyX3QgbnZfY21kOworCXVpbnQxNl90IGRhdGE7CisKKwludl9jbWQgPSBhZGRyZXNzIDw8IDE2OworCW52X2NtZCB8PSBOVl9SRUFEX09QOworCisJZGF0YSA9IGxlMTZfdG9fY3B1KHFsYTEyODBfbnZyYW1fcmVxdWVzdChoYSwgbnZfY21kKSk7CisKKwlkcHJpbnRrKDgsICJxbGExMjgwX2dldF9udnJhbV93b3JkOiBleGl0aW5nIG5vcm1hbGx5IE5WUkFNIGRhdGEgPSAiCisJCSIweCV4IiwgZGF0YSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyoKKyAqIE5WUkFNIHJlcXVlc3QKKyAqICAgICAgU2VuZHMgcmVhZCBjb21tYW5kIHRvIE5WUkFNIGFuZCBnZXRzIGRhdGEgZnJvbSBOVlJBTS4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBudl9jbWQgPSBCaXQgMjYgICAgID0gc3RhcnQgYml0CisgKiAgICAgICAgICAgICAgIEJpdCAyNSwgMjQgPSBvcGNvZGUKKyAqICAgICAgICAgICAgICAgQml0IDIzLTE2ICA9IGFkZHJlc3MKKyAqICAgICAgICAgICAgICAgQml0IDE1LTAgICA9IHdyaXRlIGRhdGEKKyAqCisgKiBSZXR1cm5zOgorICogICAgICBkYXRhIHdvcmQuCisgKi8KK3N0YXRpYyB1aW50MTZfdAorcWxhMTI4MF9udnJhbV9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgbnZfY21kKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJaW50IGNudDsKKwl1aW50MTZfdCBkYXRhID0gMDsKKwl1aW50MTZfdCByZWdfZGF0YTsKKworCS8qIFNlbmQgY29tbWFuZCB0byBOVlJBTS4gKi8KKworCW52X2NtZCA8PD0gNTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDExOyBjbnQrKykgeworCQlpZiAobnZfY21kICYgQklUXzMxKQorCQkJcWxhMTI4MF9udl93cml0ZShoYSwgTlZfREFUQV9PVVQpOworCQllbHNlCisJCQlxbGExMjgwX252X3dyaXRlKGhhLCAwKTsKKwkJbnZfY21kIDw8PSAxOworCX0KKworCS8qIFJlYWQgZGF0YSBmcm9tIE5WUkFNLiAqLworCisJZm9yIChjbnQgPSAwOyBjbnQgPCAxNjsgY250KyspIHsKKwkJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCAoTlZfU0VMRUNUIHwgTlZfQ0xPQ0spKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCQlOVlJBTV9ERUxBWSgpOworCQlkYXRhIDw8PSAxOworCQlyZWdfZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsKKwkJaWYgKHJlZ19kYXRhICYgTlZfREFUQV9JTikKKwkJCWRhdGEgfD0gQklUXzA7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZfU0VMRUNUKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCQlOVlJBTV9ERUxBWSgpOworCX0KKworCS8qIERlc2VsZWN0IGNoaXAuICovCisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WX0RFU0VMRUNUKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pZF9sKTsJLyogRmx1c2ggUENJIHdyaXRlICovCisJTlZSQU1fREVMQVkoKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorcWxhMTI4MF9udl93cml0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQxNl90IGRhdGEpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WX1NFTEVDVCk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCU5WUkFNX0RFTEFZKCk7CisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBkYXRhIHwgTlZfU0VMRUNUIHwgTlZfQ0xPQ0spOworCVJEX1JFR19XT1JEKCZyZWctPmlkX2wpOwkvKiBGbHVzaCBQQ0kgd3JpdGUgKi8KKwlOVlJBTV9ERUxBWSgpOworCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgZGF0YSB8IE5WX1NFTEVDVCk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWRfbCk7CS8qIEZsdXNoIFBDSSB3cml0ZSAqLworCU5WUkFNX0RFTEFZKCk7Cit9CisKKy8qCisgKiBNYWlsYm94IENvbW1hbmQKKyAqICAgICAgSXNzdWUgbWFpbGJveCBjb21tYW5kIGFuZCB3YWl0cyBmb3IgY29tcGxldGlvbi4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIG1yID0gbWFpbGJveCByZWdpc3RlcnMgdG8gbG9hZC4KKyAqICAgICAgbWIgPSBkYXRhIHBvaW50ZXIgZm9yIG1haWxib3ggcmVnaXN0ZXJzLgorICoKKyAqIE91dHB1dDoKKyAqICAgICAgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF0gPSByZXR1cm5lZCBtYWlsYm94IGRhdGEuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50OF90IG1yLCB1aW50MTZfdCAqbWIpCit7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKyNpZiAwCisJTElTVF9IRUFEKGRvbmVfcSk7CisjZW5kaWYKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgY250OworCXVpbnQxNl90ICpvcHRyLCAqaXB0cjsKKwl1aW50MTZfdCBfX2lvbWVtICptcHRyOworCXVpbnQxNl90IGRhdGE7CisJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJRU5URVIoInFsYTEyODBfbWFpbGJveF9jb21tYW5kIik7CisKKwlpZiAoaGEtPm1haWxib3hfd2FpdCkgeworCQlwcmludGsoS0VSTl9FUlIgIldhcm5pbmcgbWFpbGJveCB3YWl0IGFscmVhZHkgaW4gdXNlIVxuIik7CisJfQorCWhhLT5tYWlsYm94X3dhaXQgPSAmd2FpdDsKKworCS8qCisJICogV2UgcmVhbGx5IHNob3VsZCBzdGFydCBvdXQgYnkgdmVyaWZ5aW5nIHRoYXQgdGhlIG1haWxib3ggaXMKKwkgKiBhdmFpbGFibGUgYmVmb3JlIHN0YXJ0aW5nIHNlbmRpbmcgdGhlIGNvbW1hbmQgZGF0YQorCSAqLworCS8qIExvYWQgbWFpbGJveCByZWdpc3RlcnMuICovCisJbXB0ciA9ICh1aW50MTZfdCBfX2lvbWVtICopICZyZWctPm1haWxib3gwOworCWlwdHIgPSBtYjsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7IGNudCsrKSB7CisJCWlmIChtciAmIEJJVF8wKSB7CisJCQlXUlRfUkVHX1dPUkQobXB0ciwgKCppcHRyKSk7CisJCX0KKworCQltciA+Pj0gMTsKKwkJbXB0cisrOworCQlpcHRyKys7CisJfQorCisJLyogSXNzdWUgc2V0IGhvc3QgaW50ZXJydXB0IGNvbW1hbmQuICovCisKKwkvKiBzZXQgdXAgYSB0aW1lciBqdXN0IGluIGNhc2Ugd2UncmUgcmVhbGx5IGphbW1lZCAqLworCWluaXRfdGltZXIoJnRpbWVyKTsKKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArIDIwKkhaOworCXRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyloYTsKKwl0aW1lci5mdW5jdGlvbiA9IHFsYTEyODBfbWFpbGJveF90aW1lb3V0OworCWFkZF90aW1lcigmdGltZXIpOworCisJc3Bpbl91bmxvY2tfaXJxKEhPU1RfTE9DSyk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhvc3RfY21kLCBIQ19TRVRfSE9TVF9JTlQpOworCWRhdGEgPSBxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKCZyZWctPmlzdGF0dXMpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoSE9TVF9MT0NLKTsKKworCWhhLT5tYWlsYm94X3dhaXQgPSBOVUxMOworCisJLyogQ2hlY2sgZm9yIG1haWxib3ggY29tbWFuZCB0aW1lb3V0LiAqLworCWlmIChoYS0+bWFpbGJveF9vdXRbMF0gIT0gTUJTX0NNRF9DTVApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicWxhMTI4MF9tYWlsYm94X2NvbW1hbmQ6IENvbW1hbmQgZmFpbGVkLCAiCisJCSAgICAgICAibWFpbGJveDAgPSAweCUwNHgsIG1haWxib3hfb3V0MCA9IDB4JTA0eCwgaXN0YXR1cyA9ICIKKwkJICAgICAgICIweCUwNHhcbiIsIAorCQkgICAgICAgbWJbMF0sIGhhLT5tYWlsYm94X291dFswXSwgUkRfUkVHX1dPUkQoJnJlZy0+aXN0YXR1cykpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtMCAlMDR4LCBtMSAlMDR4LCBtMiAlMDR4LCBtMyAlMDR4XG4iLAorCQkgICAgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDApLCBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSksCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MiksIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gzKSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm00ICUwNHgsIG01ICUwNHgsIG02ICUwNHgsIG03ICUwNHhcbiIsCisJCSAgICAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCksIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g1KSwKKwkJICAgICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g2KSwgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDcpKTsKKwkJc3RhdHVzID0gMTsKKwl9CisKKwkvKiBMb2FkIHJldHVybiBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwlvcHRyID0gbWI7CisJaXB0ciA9ICh1aW50MTZfdCAqKSAmaGEtPm1haWxib3hfb3V0WzBdOworCW1yID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKKwltZW1jcHkob3B0ciwgaXB0ciwgTUFJTEJPWF9SRUdJU1RFUl9DT1VOVCAqIHNpemVvZih1aW50MTZfdCkpOworCisjaWYgMAorCS8qIEdvIGNoZWNrIGZvciBhbnkgcmVzcG9uc2UgaW50ZXJydXB0cyBwZW5kaW5nLiAqLworCXFsYTEyODBfaXNyKGhhLCAmZG9uZV9xKTsKKyNlbmRpZgorCisJaWYgKGhhLT5mbGFncy5yZXNldF9tYXJrZXIpCisJCXFsYTEyODBfcnN0X2FlbihoYSk7CisKKyNpZiAwCisJaWYgKCFsaXN0X2VtcHR5KCZkb25lX3EpKQorCQlxbGExMjgwX2RvbmUoaGEsICZkb25lX3EpOworI2VuZGlmCisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX21haWxib3hfY29tbWFuZDogKioqKiBGQUlMRUQsIG1haWxib3gwID0gIgorCQkJIjB4JXggKioqKlxuIiwgbWJbMF0pOworCisJTEVBVkUoInFsYTEyODBfbWFpbGJveF9jb21tYW5kIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIHFsYTEyODBfcG9sbAorICogICAgICBQb2xscyBJU1AgZm9yIGludGVycnVwdHMuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9wb2xsKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQxNl90IGRhdGE7CisJTElTVF9IRUFEKGRvbmVfcSk7CisKKwkvKiBFTlRFUigicWxhMTI4MF9wb2xsIik7ICovCisKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5pc3RhdHVzKTsKKwlpZiAoZGF0YSAmIFJJU0NfSU5UKQorCQlxbGExMjgwX2lzcihoYSwgJmRvbmVfcSk7CisKKwlpZiAoIWhhLT5tYWlsYm94X3dhaXQpIHsKKwkJaWYgKGhhLT5mbGFncy5yZXNldF9tYXJrZXIpCisJCQlxbGExMjgwX3JzdF9hZW4oaGEpOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmZG9uZV9xKSkKKwkJcWxhMTI4MF9kb25lKGhhKTsKKworCS8qIExFQVZFKCJxbGExMjgwX3BvbGwiKTsgKi8KK30KKworLyoKKyAqIHFsYTEyODBfYnVzX3Jlc2V0CisgKiAgICAgIElzc3VlIFNDU0kgYnVzIHJlc2V0LgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGJ1cyA9IFNDU0kgYnVzIG51bWJlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2VzcworICovCitzdGF0aWMgaW50CitxbGExMjgwX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGludCBidXMpCit7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJdWludDE2X3QgcmVzZXRfZGVsYXk7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMywgInFsYTEyODBfYnVzX3Jlc2V0OiBlbnRlcmVkXG4iKTsKKworCWlmIChxbGExMjgwX3ZlcmJvc2UpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpOiVpKTogUmVzZXR0aW5nIFNDU0kgQlVTXG4iLAorCQkgICAgICAgaGEtPmhvc3Rfbm8sIGJ1cyk7CisKKwlyZXNldF9kZWxheSA9IGhhLT5idXNfc2V0dGluZ3NbYnVzXS5idXNfcmVzZXRfZGVsYXk7CisJbWJbMF0gPSBNQkNfQlVTX1JFU0VUOworCW1iWzFdID0gcmVzZXRfZGVsYXk7CisJbWJbMl0gPSAodWludDE2X3QpIGJ1czsKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJaWYgKHN0YXR1cykgeworCQlpZiAoaGEtPmJ1c19zZXR0aW5nc1tidXNdLmZhaWxlZF9yZXNldF9jb3VudCA+IDIpCisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uc2NzaV9idXNfZGVhZCA9IDE7CisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5mYWlsZWRfcmVzZXRfY291bnQrKzsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnEoSE9TVF9MT0NLKTsKKwkJc2NoZWR1bGVfdGltZW91dChyZXNldF9kZWxheSAqIEhaKTsKKwkJc3Bpbl9sb2NrX2lycShIT1NUX0xPQ0spOworCisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5zY3NpX2J1c19kZWFkID0gMDsKKwkJaGEtPmJ1c19zZXR0aW5nc1tidXNdLmZhaWxlZF9yZXNldF9jb3VudCA9IDA7CisJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5yZXNldF9tYXJrZXIgPSAwOworCQkvKiBJc3N1ZSBtYXJrZXIgY29tbWFuZC4gKi8KKwkJcWxhMTI4MF9tYXJrZXIoaGEsIGJ1cywgMCwgMCwgTUtfU1lOQ19BTEwpOworCX0KKworCS8qCisJICogV2Ugc2hvdWxkIHByb2JhYmx5IGNhbGwgcWxhMTI4MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoKQorCSAqIGhlcmUgYXMgd2VsbCBmb3IgYWxsIGRldmljZXMgb24gdGhlIGJ1cy4KKwkgKi8KKworCWlmIChzdGF0dXMpCisJCWRwcmludGsoMiwgInFsYTEyODBfYnVzX3Jlc2V0OiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKwllbHNlCisJCWRwcmludGsoMywgInFsYTEyODBfYnVzX3Jlc2V0OiBleGl0aW5nIG5vcm1hbGx5XG4iKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBxbGExMjgwX2RldmljZV9yZXNldAorICogICAgICBJc3N1ZSBidXMgZGV2aWNlIHJlc2V0IG1lc3NhZ2UgdG8gdGhlIHRhcmdldC4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgYnVzICAgICA9IFNDU0kgQlVTIG51bWJlci4KKyAqICAgICAgdGFyZ2V0ICA9IFNDU0kgSUQuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorcWxhMTI4MF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzLCBpbnQgdGFyZ2V0KQoreworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWludCBzdGF0dXM7CisKKwlFTlRFUigicWxhMTI4MF9kZXZpY2VfcmVzZXQiKTsKKworCW1iWzBdID0gTUJDX0FCT1JUX1RBUkdFVDsKKwltYlsxXSA9IChidXMgPyAodGFyZ2V0IHwgQklUXzcpIDogdGFyZ2V0KSA8PCA4OworCW1iWzJdID0gMTsKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzIgfCBCSVRfMSB8IEJJVF8wLCAmbWJbMF0pOworCisJLyogSXNzdWUgbWFya2VyIGNvbW1hbmQuICovCisJcWxhMTI4MF9tYXJrZXIoaGEsIGJ1cywgdGFyZ2V0LCAwLCBNS19TWU5DX0lEKTsKKworCWlmIChzdGF0dXMpCisJCWRwcmludGsoMiwgInFsYTEyODBfZGV2aWNlX3Jlc2V0OiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKworCUxFQVZFKCJxbGExMjgwX2RldmljZV9yZXNldCIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBxbGExMjgwX2Fib3J0X2RldmljZQorICogICAgICBJc3N1ZSBhbiBhYm9ydCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBidXMgICAgPSBTQ1NJIEJVUy4KKyAqICAgICAgdGFyZ2V0ID0gU0NTSSBJRC4KKyAqICAgICAgbHVuICAgID0gU0NTSSBMVU4uCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorcWxhMTI4MF9hYm9ydF9kZXZpY2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKQoreworCXVpbnQxNl90IG1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCWludCBzdGF0dXM7CisKKwlFTlRFUigicWxhMTI4MF9hYm9ydF9kZXZpY2UiKTsKKworCW1iWzBdID0gTUJDX0FCT1JUX0RFVklDRTsKKwltYlsxXSA9IChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCkgPDwgOCB8IGx1bjsKKwlzdGF0dXMgPSBxbGExMjgwX21haWxib3hfY29tbWFuZChoYSwgQklUXzEgfCBCSVRfMCwgJm1iWzBdKTsKKworCS8qIElzc3VlIG1hcmtlciBjb21tYW5kLiAqLworCXFsYTEyODBfbWFya2VyKGhhLCBidXMsIHRhcmdldCwgbHVuLCBNS19TWU5DX0lEX0xVTik7CisKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2Fib3J0X2RldmljZTogKioqKiBGQUlMRUQgKioqKlxuIik7CisKKwlMRUFWRSgicWxhMTI4MF9hYm9ydF9kZXZpY2UiKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogcWxhMTI4MF9hYm9ydF9jb21tYW5kCisgKiAgICAgIEFib3J0IGNvbW1hbmQgYWJvcnRzIGEgc3BlY2lmaWVkIElPQ0IuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBzcCA9IFNCIHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfYWJvcnRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBzcmIgKiBzcCwgaW50IGhhbmRsZSkKK3sKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwl1bnNpZ25lZCBpbnQgYnVzLCB0YXJnZXQsIGx1bjsKKwlpbnQgc3RhdHVzOworCisJRU5URVIoInFsYTEyODBfYWJvcnRfY29tbWFuZCIpOworCisJYnVzID0gU0NTSV9CVVNfMzIoc3AtPmNtZCk7CisJdGFyZ2V0ID0gU0NTSV9UQ05fMzIoc3AtPmNtZCk7CisJbHVuID0gU0NTSV9MVU5fMzIoc3AtPmNtZCk7CisKKwlzcC0+ZmxhZ3MgfD0gU1JCX0FCT1JUX1BFTkRJTkc7CisKKwltYlswXSA9IE1CQ19BQk9SVF9DT01NQU5EOworCW1iWzFdID0gKGJ1cyA/IHRhcmdldCB8IEJJVF83IDogdGFyZ2V0KSA8PCA4IHwgbHVuOworCW1iWzJdID0gaGFuZGxlID4+IDE2OworCW1iWzNdID0gaGFuZGxlICYgMHhmZmZmOworCXN0YXR1cyA9IHFsYTEyODBfbWFpbGJveF9jb21tYW5kKGhhLCAweDBmLCAmbWJbMF0pOworCisJaWYgKHN0YXR1cykgeworCQlkcHJpbnRrKDIsICJxbGExMjgwX2Fib3J0X2NvbW1hbmQ6ICoqKiogRkFJTEVEICoqKipcbiIpOworCQlzcC0+ZmxhZ3MgJj0gflNSQl9BQk9SVF9QRU5ESU5HOworCX0KKworCisJTEVBVkUoInFsYTEyODBfYWJvcnRfY29tbWFuZCIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBxbGExMjgwX3Jlc2V0X2FkYXB0ZXIKKyAqICAgICAgUmVzZXQgYWRhcHRlci4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitxbGExMjgwX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlFTlRFUigicWxhMTI4MF9yZXNldF9hZGFwdGVyIik7CisKKwkvKiBEaXNhYmxlIElTUCBjaGlwICovCisJaGEtPmZsYWdzLm9ubGluZSA9IDA7CisJV1JUX1JFR19XT1JEKCZyZWctPmljdHJsLCBJU1BfUkVTRVQpOworCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwKKwkJICAgICBIQ19SRVNFVF9SSVNDIHwgSENfUkVMRUFTRV9SSVNDIHwgSENfRElTQUJMRV9CSU9TKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pZF9sKTsJLyogRmx1c2ggUENJIHdyaXRlICovCisKKwlMRUFWRSgicWxhMTI4MF9yZXNldF9hZGFwdGVyIik7Cit9CisKKy8qCisgKiAgSXNzdWUgbWFya2VyIGNvbW1hbmQuCisgKiAgICAgIEZ1bmN0aW9uIGlzc3VlcyBtYXJrZXIgSU9DQi4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgYnVzICA9IFNDU0kgQlVTIG51bWJlcgorICogICAgICBpZCAgID0gU0NTSSBJRAorICogICAgICBsdW4gID0gU0NTSSBMVU4KKyAqICAgICAgdHlwZSA9IG1hcmtlciBtb2RpZmllcgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9tYXJrZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgYnVzLCBpbnQgaWQsIGludCBsdW4sIHU4IHR5cGUpCit7CisJc3RydWN0IG1ya19lbnRyeSAqcGt0OworCisJRU5URVIoInFsYTEyODBfbWFya2VyIik7CisKKwkvKiBHZXQgcmVxdWVzdCBwYWNrZXQuICovCisJaWYgKChwa3QgPSAoc3RydWN0IG1ya19lbnRyeSAqKSBxbGExMjgwX3JlcV9wa3QoaGEpKSkgeworCQlwa3QtPmVudHJ5X3R5cGUgPSBNQVJLRVJfVFlQRTsKKwkJcGt0LT5sdW4gPSAodWludDhfdCkgbHVuOworCQlwa3QtPnRhcmdldCA9ICh1aW50OF90KSAoYnVzID8gKGlkIHwgQklUXzcpIDogaWQpOworCQlwa3QtPm1vZGlmaWVyID0gdHlwZTsKKwkJcGt0LT5lbnRyeV9zdGF0dXMgPSAwOworCisJCS8qIElzc3VlIGNvbW1hbmQgdG8gSVNQICovCisJCXFsYTEyODBfaXNwX2NtZChoYSk7CisJfQorCisJTEVBVkUoInFsYTEyODBfbWFya2VyIik7Cit9CisKKworLyoKKyAqIHFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaQorICogICAgICBUaGUgc3RhcnQgU0NTSSBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgcmVxdWVzdCBwYWNrZXRzIG9uCisgKiAgICAgIHJlcXVlc3QgcmluZyBhbmQgbW9kaWZ5aW5nIElTUCBpbnB1dCBwb2ludGVyLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgc3AgPSBTQiBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2Vzcywgd2FzIGFibGUgdG8gaXNzdWUgY29tbWFuZC4KKyAqLworI2lmZGVmIFFMQV82NEJJVF9QVFIKK3N0YXRpYyBpbnQKK3FsYTEyODBfNjRiaXRfc3RhcnRfc2NzaShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBzcmIgKiBzcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7CisJY21kX2E2NF9lbnRyeV90ICpwa3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJdTMyICpkd29yZF9wdHI7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCWludCBzdGF0dXMgPSAwOworCWludCBjbnQ7CisJaW50IHJlcV9jbnQ7CisJdTE2IHNlZ19jbnQ7CisJdTggZGlyOworCisJRU5URVIoInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaToiKTsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgc2VnbWVudHMgcmVxdWlyZWQuICovCisJcmVxX2NudCA9IDE7CisJaWYgKGNtZC0+dXNlX3NnKSB7CisJCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQlzZWdfY250ID0gcGNpX21hcF9zZyhoYS0+cGRldiwgc2csIGNtZC0+dXNlX3NnLAorCQkJCSAgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJaWYgKHNlZ19jbnQgPiAyKSB7CisJCQlyZXFfY250ICs9IChzZWdfY250IC0gMikgLyA1OworCQkJaWYgKChzZWdfY250IC0gMikgJSA1KQorCQkJCXJlcV9jbnQrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsJLyogSWYgZGF0YSB0cmFuc2Zlci4gKi8KKwkJc2VnX2NudCA9IDE7CisJfSBlbHNlIHsKKwkJc2VnX2NudCA9IDA7CisJfQorCisJaWYgKChyZXFfY250ICsgMikgPj0gaGEtPnJlcV9xX2NudCkgeworCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGZyZWUgcmVxdWVzdCBlbnRyaWVzLiAqLworCQljbnQgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCk7CisJCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPCBjbnQpCisJCQloYS0+cmVxX3FfY250ID0gY250IC0gaGEtPnJlcV9yaW5nX2luZGV4OworCQllbHNlCisJCQloYS0+cmVxX3FfY250ID0KKwkJCQlSRVFVRVNUX0VOVFJZX0NOVCAtIChoYS0+cmVxX3JpbmdfaW5kZXggLSBjbnQpOworCX0KKworCS8qIElmIHJvb20gZm9yIHJlcXVlc3QgaW4gcmVxdWVzdCByaW5nLiAqLworCWlmICgocmVxX2NudCArIDIpID49IGhhLT5yZXFfcV9jbnQpIHsKKwkJc3RhdHVzID0gMTsKKwkJZHByaW50aygyLCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBpbi1wdHI9MHgleCAgcmVxX3FfY250PSIKKwkJCSIweCV4cmVxX2NudD0weCV4IiwgaGEtPnJlcV9yaW5nX2luZGV4LCBoYS0+cmVxX3FfY250LAorCQkJcmVxX2NudCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIGZvciByb29tIGluIG91dHN0YW5kaW5nIGNvbW1hbmQgbGlzdC4gKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUyAmJgorCQkgICAgIGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gIT0gMDsgY250KyspOworCisJaWYgKGNudCA+PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKKwkJc3RhdHVzID0gMTsKKwkJZHByaW50aygyLCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBOTyBST09NIElOICIKKwkJCSJPVVRTVEFORElORyBBUlJBWSwgcmVxX3FfY250PTB4JXgiLCBoYS0+cmVxX3FfY250KTsKKwkJZ290byBvdXQ7CisJfQorCisJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IHNwOworCWhhLT5yZXFfcV9jbnQgLT0gcmVxX2NudDsKKwlDTURfSEFORExFKHNwLT5jbWQpID0gKHVuc2lnbmVkIGNoYXIgKikodW5zaWduZWQgbG9uZykoY250ICsgMSk7CisKKwlkcHJpbnRrKDIsICI2NGJpdF9zdGFydDogY21kPSVwIHNwPSVwIENEQj0leG0sIGhhbmRsZSAlbHhcbiIsIGNtZCwgc3AsCisJCWNtZC0+Y21uZFswXSwgKGxvbmcpQ01EX0hBTkRMRShzcC0+Y21kKSk7CisJZHByaW50aygyLCAiICAgICAgICAgICAgIGJ1cyAlaSwgdGFyZ2V0ICVpLCBsdW4gJWlcbiIsCisJCVNDU0lfQlVTXzMyKGNtZCksIFNDU0lfVENOXzMyKGNtZCksIFNDU0lfTFVOXzMyKGNtZCkpOworCXFsYTEyODBfZHVtcF9idWZmZXIoMiwgY21kLT5jbW5kLCBNQVhfQ09NTUFORF9TSVpFKTsKKworCS8qCisJICogQnVpbGQgY29tbWFuZCBwYWNrZXQuCisJICovCisJcGt0ID0gKGNtZF9hNjRfZW50cnlfdCAqKSBoYS0+cmVxdWVzdF9yaW5nX3B0cjsKKworCXBrdC0+ZW50cnlfdHlwZSA9IENPTU1BTkRfQTY0X1RZUEU7CisJcGt0LT5lbnRyeV9jb3VudCA9ICh1aW50OF90KSByZXFfY250OworCXBrdC0+c3lzX2RlZmluZSA9ICh1aW50OF90KSBoYS0+cmVxX3JpbmdfaW5kZXg7CisJcGt0LT5lbnRyeV9zdGF0dXMgPSAwOworCXBrdC0+aGFuZGxlID0gY3B1X3RvX2xlMzIoY250KTsKKworCS8qIFplcm8gb3V0IHJlbWFpbmluZyBwb3J0aW9uIG9mIHBhY2tldC4gKi8KKwltZW1zZXQoKChjaGFyICopcGt0ICsgOCksIDAsIChSRVFVRVNUX0VOVFJZX1NJWkUgLSA4KSk7CisKKwkvKiBTZXQgSVNQIGNvbW1hbmQgdGltZW91dC4gKi8KKwlwa3QtPnRpbWVvdXQgPSBjcHVfdG9fbGUxNigzMCk7CisKKwkvKiBTZXQgZGV2aWNlIHRhcmdldCBJRCBhbmQgTFVOICovCisJcGt0LT5sdW4gPSBTQ1NJX0xVTl8zMihjbWQpOworCXBrdC0+dGFyZ2V0ID0gU0NTSV9CVVNfMzIoY21kKSA/CisJCShTQ1NJX1RDTl8zMihjbWQpIHwgQklUXzcpIDogU0NTSV9UQ05fMzIoY21kKTsKKworCS8qIEVuYWJsZSBzaW1wbGUgdGFnIHF1ZXVpbmcgaWYgZGV2aWNlIHN1cHBvcnRzIGl0LiAqLworCWlmIChERVZfU0lNUExFX1RBR1MoY21kLT5kZXZpY2UpKQorCQlwa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoQklUXzMpOworCisJLyogTG9hZCBTQ1NJIGNvbW1hbmQgcGFja2V0LiAqLworCXBrdC0+Y2RiX2xlbiA9IGNwdV90b19sZTE2KENNRF9DREJMRU4oY21kKSk7CisJbWVtY3B5KHBrdC0+c2NzaV9jZGIsICYoQ01EX0NEQlAoY21kKSksIENNRF9DREJMRU4oY21kKSk7CisJLyogZHByaW50aygxLCAiQnVpbGQgcGFja2V0IGZvciBjb21tYW5kWzBdPTB4JXhcbiIscGt0LT5zY3NpX2NkYlswXSk7ICovCisKKwkvKiBTZXQgdHJhbnNmZXIgZGlyZWN0aW9uLiAqLworCWRpciA9IHFsYTEyODBfZGF0YV9kaXJlY3Rpb24oY21kKTsKKwlwa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoZGlyKTsKKworCS8qIFNldCB0b3RhbCBkYXRhIHNlZ21lbnQgY291bnQuICovCisJcGt0LT5kc2VnX2NvdW50ID0gY3B1X3RvX2xlMTYoc2VnX2NudCk7CisKKwkvKgorCSAqIExvYWQgZGF0YSBzZWdtZW50cy4KKwkgKi8KKwlpZiAoc2VnX2NudCkgewkvKiBJZiBkYXRhIHRyYW5zZmVyLiAqLworCQkvKiBTZXR1cCBwYWNrZXQgYWRkcmVzcyBzZWdtZW50IHBvaW50ZXIuICovCisJCWR3b3JkX3B0ciA9ICh1MzIgKikmcGt0LT5kc2VnXzBfYWRkcmVzczsKKworCQlpZiAoY21kLT51c2Vfc2cpIHsJLyogSWYgc2NhdHRlciBnYXRoZXIgKi8KKwkJCS8qIExvYWQgY29tbWFuZCBlbnRyeSBkYXRhIHNlZ21lbnRzLiAqLworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCAyICYmIHNlZ19jbnQ7IGNudCsrLCBzZWdfY250LS0pIHsKKwkJCQlkbWFfaGFuZGxlID0gc2dfZG1hX2FkZHJlc3Moc2cpOworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQorCQkJCWlmIChoYS0+ZmxhZ3MudXNlX3BjaV92Y2hhbm5lbCkKKwkJCQkJc25fcGNpX3NldF92Y2hhbihoYS0+cGRldiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyAqKSZkbWFfaGFuZGxlLAorCQkJCQkJCSBTQ1NJX0JVU18zMihjbWQpKTsKKyNlbmRpZgorCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihkbWFfaGFuZGxlKSk7CisJCQkJKmR3b3JkX3B0cisrID0KKwkJCQkJY3B1X3RvX2xlMzIocGNpX2RtYV9oaTMyKGRtYV9oYW5kbGUpKTsKKwkJCQkqZHdvcmRfcHRyKysgPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7CisJCQkJc2crKzsKKwkJCQlkcHJpbnRrKDMsICJTL0cgU2VnbWVudCBwaHlzX2FkZHI9JXggJXgsIGxlbj0weCV4XG4iLAorCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2hpMzIoZG1hX2hhbmRsZSkpLAorCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoZG1hX2hhbmRsZSkpLAorCQkJCQljcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSkpOworCQkJfQorCQkJZHByaW50ayg1LCAicWxhMTI4MF82NGJpdF9zdGFydF9zY3NpOiBTY2F0dGVyL2dhdGhlciAiCisJCQkJImNvbW1hbmQgcGFja2V0IGRhdGEgLSBiICVpLCB0ICVpLCBsICVpIFxuIiwKKwkJCQlTQ1NJX0JVU18zMihjbWQpLCBTQ1NJX1RDTl8zMihjbWQpLAorCQkJCVNDU0lfTFVOXzMyKGNtZCkpOworCQkJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKXBrdCwKKwkJCQkJICAgIFJFUVVFU1RfRU5UUllfU0laRSk7CisKKwkJCS8qCisJCQkgKiBCdWlsZCBjb250aW51YXRpb24gcGFja2V0cy4KKwkJCSAqLworCQkJZHByaW50aygzLCAiUy9HIEJ1aWxkaW5nIENvbnRpbnVhdGlvbi4uLnNlZ19jbnQ9MHgleCAiCisJCQkJInJlbWFpbnNcbiIsIHNlZ19jbnQpOworCisJCQl3aGlsZSAoc2VnX2NudCA+IDApIHsKKwkJCQkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KKwkJCQloYS0+cmVxX3JpbmdfaW5kZXgrKzsKKwkJCQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IFJFUVVFU1RfRU5UUllfQ05UKSB7CisJCQkJCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7CisJCQkJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0KKwkJCQkJCWhhLT5yZXF1ZXN0X3Jpbmc7CisJCQkJfSBlbHNlCisJCQkJCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCisJCQkJcGt0ID0gKGNtZF9hNjRfZW50cnlfdCAqKWhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCisJCQkJLyogWmVybyBvdXQgcGFja2V0LiAqLworCQkJCW1lbXNldChwa3QsIDAsIFJFUVVFU1RfRU5UUllfU0laRSk7CisKKwkJCQkvKiBMb2FkIHBhY2tldCBkZWZhdWx0cy4gKi8KKwkJCQkoKHN0cnVjdCBjb250X2E2NF9lbnRyeSAqKSBwa3QpLT5lbnRyeV90eXBlID0KKwkJCQkJQ09OVElOVUVfQTY0X1RZUEU7CisJCQkJKChzdHJ1Y3QgY29udF9hNjRfZW50cnkgKikgcGt0KS0+ZW50cnlfY291bnQgPSAxOworCQkJCSgoc3RydWN0IGNvbnRfYTY0X2VudHJ5ICopIHBrdCktPnN5c19kZWZpbmUgPQorCQkJCQkodWludDhfdCloYS0+cmVxX3JpbmdfaW5kZXg7CisJCQkJLyogU2V0dXAgcGFja2V0IGFkZHJlc3Mgc2VnbWVudCBwb2ludGVyLiAqLworCQkJCWR3b3JkX3B0ciA9CisJCQkJCSh1MzIgKikmKChzdHJ1Y3QgY29udF9hNjRfZW50cnkgKikgcGt0KS0+ZHNlZ18wX2FkZHJlc3M7CisKKwkJCQkvKiBMb2FkIGNvbnRpbnVhdGlvbiBlbnRyeSBkYXRhIHNlZ21lbnRzLiAqLworCQkJCWZvciAoY250ID0gMDsgY250IDwgNSAmJiBzZWdfY250OworCQkJCSAgICAgY250KyssIHNlZ19jbnQtLSkgeworCQkJCQlkbWFfaGFuZGxlID0gc2dfZG1hX2FkZHJlc3Moc2cpOworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKQorCQkJCWlmIChoYS0+ZmxhZ3MudXNlX3BjaV92Y2hhbm5lbCkKKwkJCQkJc25fcGNpX3NldF92Y2hhbihoYS0+cGRldiwgCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgKikmZG1hX2hhbmRsZSwKKwkJCQkJCQkgU0NTSV9CVVNfMzIoY21kKSk7CisjZW5kaWYKKwkJCQkJKmR3b3JkX3B0cisrID0KKwkJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihkbWFfaGFuZGxlKSk7CisJCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2hpMzIoZG1hX2hhbmRsZSkpOworCQkJCQkqZHdvcmRfcHRyKysgPQorCQkJCQkJY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJCQlkcHJpbnRrKDMsICJTL0cgU2VnbWVudCBDb250LiBwaHlzX2FkZHI9JXggJXgsIGxlbj0weCV4XG4iLAorCQkJCQkJY3B1X3RvX2xlMzIocGNpX2RtYV9oaTMyKGRtYV9oYW5kbGUpKSwKKwkJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihkbWFfaGFuZGxlKSksCisJCQkJCQljcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSkpOworCQkJCQlzZysrOworCQkJCX0KKwkJCQlkcHJpbnRrKDUsICJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6ICIKKwkJCQkJImNvbnRpbnVhdGlvbiBwYWNrZXQgZGF0YSAtIGIgJWksIHQgIgorCQkJCQkiJWksIGwgJWkgXG4iLCBTQ1NJX0JVU18zMihjbWQpLAorCQkJCQlTQ1NJX1RDTl8zMihjbWQpLCBTQ1NJX0xVTl8zMihjbWQpKTsKKwkJCQlxbGExMjgwX2R1bXBfYnVmZmVyKDUsIChjaGFyICopcGt0LAorCQkJCQkJICAgIFJFUVVFU1RfRU5UUllfU0laRSk7CisJCQl9CisJCX0gZWxzZSB7CS8qIE5vIHNjYXR0ZXIgZ2F0aGVyIGRhdGEgdHJhbnNmZXIgKi8KKwkJCWRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShoYS0+cGRldiwKKwkJCQkJY21kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCQlzcC0+c2F2ZWRfZG1hX2hhbmRsZSA9IGRtYV9oYW5kbGU7CisjaWYgZGVmaW5lZChDT05GSUdfSUE2NF9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19JQTY0X1NHSV9TTjIpCisJCQlpZiAoaGEtPmZsYWdzLnVzZV9wY2lfdmNoYW5uZWwpCisJCQkJc25fcGNpX3NldF92Y2hhbihoYS0+cGRldiwgCisJCQkJCQkodW5zaWduZWQgbG9uZyAqKSZkbWFfaGFuZGxlLAorCQkJCQkJIFNDU0lfQlVTXzMyKGNtZCkpOworI2VuZGlmCisJCQkqZHdvcmRfcHRyKysgPSBjcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoZG1hX2hhbmRsZSkpOworCQkJKmR3b3JkX3B0cisrID0gY3B1X3RvX2xlMzIocGNpX2RtYV9oaTMyKGRtYV9oYW5kbGUpKTsKKwkJCSpkd29yZF9wdHIgPSBjcHVfdG9fbGUzMihjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisKKwkJCWRwcmludGsoNSwgInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaTogTm8gc2NhdHRlci8iCisJCQkJImdhdGhlciBjb21tYW5kIHBhY2tldCBkYXRhIC0gYiAlaSwgdCAlaSwgIgorCQkJCSJsICVpIFxuIiwgU0NTSV9CVVNfMzIoY21kKSwgU0NTSV9UQ05fMzIoY21kKSwKKwkJCQlTQ1NJX0xVTl8zMihjbWQpKTsKKwkJCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKilwa3QsCisJCQkJCSAgICBSRVFVRVNUX0VOVFJZX1NJWkUpOworCQl9CisJfSBlbHNlIHsJLyogTm8gZGF0YSB0cmFuc2ZlciAqLworCQlkcHJpbnRrKDUsICJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6IE5vIGRhdGEsIGNvbW1hbmQgIgorCQkJInBhY2tldCBkYXRhIC0gYiAlaSwgdCAlaSwgbCAlaSBcbiIsCisJCQlTQ1NJX0JVU18zMihjbWQpLCBTQ1NJX1RDTl8zMihjbWQpLCBTQ1NJX0xVTl8zMihjbWQpKTsKKwkJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKXBrdCwgUkVRVUVTVF9FTlRSWV9TSVpFKTsKKwl9CisJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBSRVFVRVNUX0VOVFJZX0NOVCkgeworCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJfSBlbHNlCisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisKKwkvKiBTZXQgY2hpcCBuZXcgcmluZyBpbmRleC4gKi8KKwlkcHJpbnRrKDIsCisJCSJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6IFdha2V1cCBSSVNDIGZvciBwZW5kaW5nIGNvbW1hbmRcbiIpOworCXNwLT5mbGFncyB8PSBTUkJfU0VOVDsKKwloYS0+YWN0dGhyZWFkcysrOworCVdSVF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCwgaGEtPnJlcV9yaW5nX2luZGV4KTsKKwkvKiBFbmZvcmNlIG1taW8gd3JpdGUgb3JkZXJpbmc7IHNlZSBjb21tZW50IGluIHFsYTEyODBfaXNwX2NtZCgpLiAqLworCW1taW93YigpOworCisgb3V0OgorCWlmIChzdGF0dXMpCisJCWRwcmludGsoMiwgInFsYTEyODBfNjRiaXRfc3RhcnRfc2NzaTogKioqKiBGQUlMRUQgKioqKlxuIik7CisJZWxzZQorCQlkcHJpbnRrKDMsICJxbGExMjgwXzY0Yml0X3N0YXJ0X3Njc2k6IGV4aXRpbmcgbm9ybWFsbHlcbiIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbHNlIC8qICFRTEFfNjRCSVRfUFRSICovCisKKy8qCisgKiBxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2kKKyAqICAgICAgVGhlIHN0YXJ0IFNDU0kgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHJlcXVlc3QgcGFja2V0cyBvbgorICogICAgICByZXF1ZXN0IHJpbmcgYW5kIG1vZGlmeWluZyBJU1AgaW5wdXQgcG9pbnRlci4KKyAqCisgKiAgICAgIFRoZSBRbG9naWMgZmlybXdhcmUgaW50ZXJmYWNlIGFsbG93cyBldmVyeSBxdWV1ZSBzbG90IHRvIGhhdmUgYSBTQ1NJCisgKiAgICAgIGNvbW1hbmQgYW5kIHVwIHRvIDQgc2NhdHRlci9nYXRoZXIgKFNHKSBlbnRyaWVzLiAgSWYgd2UgbmVlZCBtb3JlCisgKiAgICAgIHRoYW4gNCBTRyBlbnRyaWVzLCB0aGVuIGNvbnRpbnVhdGlvbiBlbnRyaWVzIGFyZSB1c2VkIHRoYXQgY2FuCisgKiAgICAgIGhvbGQgYW5vdGhlciA3IGVudHJpZXMgZWFjaC4gIFRoZSBzdGFydCByb3V0aW5lIGRldGVybWluZXMgaWYgdGhlcmUKKyAqICAgICAgaXMgZW91Z2h0IGVtcHR5IHNsb3RzIHRoZW4gYnVpbGQgdGhlIGNvbWJpbmF0aW9uIG9mIHJlcXVlc3RzIHRvCisgKiAgICAgIGZ1bGZpbGwgdGhlIE9TIHJlcXVlc3QuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBzcCA9IFNDU0kgUmVxdWVzdCBCbG9jayBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2Vzcywgd2FzIGFibGUgdG8gaXNzdWUgY29tbWFuZC4KKyAqLworc3RhdGljIGludAorcWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IHNyYiAqIHNwKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3AtPmNtZDsKKwlzdHJ1Y3QgY21kX2VudHJ5ICpwa3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJdWludDMyX3QgKmR3b3JkX3B0cjsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgY250OworCWludCByZXFfY250OworCXVpbnQxNl90IHNlZ19jbnQ7CisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCXU4IGRpcjsKKworCUVOVEVSKCJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2kiKTsKKworCWRwcmludGsoMSwgIjMyYml0X3N0YXJ0OiBjbWQ9JXAgc3A9JXAgQ0RCPSV4XG4iLCBjbWQsIHNwLAorCQljbWQtPmNtbmRbMF0pOworCisJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCBzZWdtZW50cyByZXF1aXJlZC4gKi8KKwlyZXFfY250ID0gMTsKKwlpZiAoY21kLT51c2Vfc2cpIHsKKwkJLyoKKwkJICogV2UgbXVzdCBidWlsZCBhbiBTRyBsaXN0IGluIGFkYXB0ZXIgZm9ybWF0LCBhcyB0aGUga2VybmVsJ3MKKwkJICogU0cgbGlzdCBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBiZWNhdXNlIG9mIGRhdGEgZmllbGQgc2l6ZQorCQkgKiAoX19hbHBoYV9fKSBkaWZmZXJlbmNlcyBhbmQgdGhlIGtlcm5lbCBTRyBsaXN0IHVzZXMgdmlydHVhbAorCQkgKiBhZGRyZXNzZXMgd2hlcmUgd2UgbmVlZCBwaHlzaWNhbCBhZGRyZXNzZXMuCisJCSAqLworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJc2VnX2NudCA9IHBjaV9tYXBfc2coaGEtPnBkZXYsIHNnLCBjbWQtPnVzZV9zZywKKwkJCQkgICAgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCS8qCisJCSAqIGlmIGdyZWF0ZXIgdGhhbiBmb3VyIHNnIGVudHJpZXMgdGhlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlCisJCSAqIGNvbnRpbnVhdGlvbiBlbnRyaWVzCisJCSAqLworCQlpZiAoc2VnX2NudCA+IDQpIHsKKwkJCXJlcV9jbnQgKz0gKHNlZ19jbnQgLSA0KSAvIDc7CisJCQlpZiAoKHNlZ19jbnQgLSA0KSAlIDcpCisJCQkJcmVxX2NudCsrOworCQl9CisJCWRwcmludGsoMywgIlMvRyBUcmFuc2ZlciBjbWQ9JXAgc2VnX2NudD0weCV4LCByZXFfY250PSV4XG4iLAorCQkJY21kLCBzZWdfY250LCByZXFfY250KTsKKwl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CS8qIElmIGRhdGEgdHJhbnNmZXIuICovCisJCWRwcmludGsoMywgIk5vIFMvRyB0cmFuc2ZlciB0PSV4IGNtZD0lcCBsZW49JXggQ0RCPSV4XG4iLAorCQkJU0NTSV9UQ05fMzIoY21kKSwgY21kLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCWNtZC0+Y21uZFswXSk7CisJCXNlZ19jbnQgPSAxOworCX0gZWxzZSB7CisJCS8qIGRwcmludGsoMSwgIk5vIGRhdGEgdHJhbnNmZXIgXG4iKTsgKi8KKwkJc2VnX2NudCA9IDA7CisJfQorCisJaWYgKChyZXFfY250ICsgMikgPj0gaGEtPnJlcV9xX2NudCkgeworCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGZyZWUgcmVxdWVzdCBlbnRyaWVzLiAqLworCQljbnQgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94NCk7CisJCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPCBjbnQpCisJCQloYS0+cmVxX3FfY250ID0gY250IC0gaGEtPnJlcV9yaW5nX2luZGV4OworCQllbHNlCisJCQloYS0+cmVxX3FfY250ID0KKwkJCQlSRVFVRVNUX0VOVFJZX0NOVCAtIChoYS0+cmVxX3JpbmdfaW5kZXggLSBjbnQpOworCX0KKworCWRwcmludGsoMywgIk51bWJlciBvZiBmcmVlIGVudHJpZXM9KCVkKSBzZWdfY250PTB4JXhcbiIsCisJCWhhLT5yZXFfcV9jbnQsIHNlZ19jbnQpOworCS8qIElmIHJvb20gZm9yIHJlcXVlc3QgaW4gcmVxdWVzdCByaW5nLiAqLworCWlmICgocmVxX2NudCArIDIpID49IGhhLT5yZXFfcV9jbnQpIHsKKwkJc3RhdHVzID0gMTsKKwkJZHByaW50aygyLCAicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpOiBpbi1wdHI9MHgleCwgIgorCQkJInJlcV9xX2NudD0weCV4LCByZXFfY250PTB4JXgiLCBoYS0+cmVxX3JpbmdfaW5kZXgsCisJCQloYS0+cmVxX3FfY250LCByZXFfY250KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgZm9yIGVtcHR5IHNsb3QgaW4gb3V0c3RhbmRpbmcgY29tbWFuZCBsaXN0LiAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTICYmCisJCSAgICAgKGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gIT0gMCk7IGNudCsrKSA7CisKKwlpZiAoY250ID49IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgeworCQlzdGF0dXMgPSAxOworCQlkcHJpbnRrKDIsICJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2k6IE5PIFJPT00gSU4gT1VUU1RBTkRJTkcgIgorCQkJIkFSUkFZLCByZXFfcV9jbnQ9MHgleFxuIiwgaGEtPnJlcV9xX2NudCk7CisJCWdvdG8gb3V0OworCX0KKworCUNNRF9IQU5ETEUoc3AtPmNtZCkgPSAodW5zaWduZWQgY2hhciAqKSAodW5zaWduZWQgbG9uZykoY250ICsgMSk7CisJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IHNwOworCWhhLT5yZXFfcV9jbnQgLT0gcmVxX2NudDsKKworCS8qCisJICogQnVpbGQgY29tbWFuZCBwYWNrZXQuCisJICovCisJcGt0ID0gKHN0cnVjdCBjbWRfZW50cnkgKikgaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwlwa3QtPmVudHJ5X3R5cGUgPSBDT01NQU5EX1RZUEU7CisJcGt0LT5lbnRyeV9jb3VudCA9ICh1aW50OF90KSByZXFfY250OworCXBrdC0+c3lzX2RlZmluZSA9ICh1aW50OF90KSBoYS0+cmVxX3JpbmdfaW5kZXg7CisJcGt0LT5lbnRyeV9zdGF0dXMgPSAwOworCXBrdC0+aGFuZGxlID0gY3B1X3RvX2xlMzIoY250KTsKKworCS8qIFplcm8gb3V0IHJlbWFpbmluZyBwb3J0aW9uIG9mIHBhY2tldC4gKi8KKwltZW1zZXQoKChjaGFyICopcGt0ICsgOCksIDAsIChSRVFVRVNUX0VOVFJZX1NJWkUgLSA4KSk7CisKKwkvKiBTZXQgSVNQIGNvbW1hbmQgdGltZW91dC4gKi8KKwlwa3QtPnRpbWVvdXQgPSBjcHVfdG9fbGUxNigzMCk7CisKKwkvKiBTZXQgZGV2aWNlIHRhcmdldCBJRCBhbmQgTFVOICovCisJcGt0LT5sdW4gPSBTQ1NJX0xVTl8zMihjbWQpOworCXBrdC0+dGFyZ2V0ID0gU0NTSV9CVVNfMzIoY21kKSA/CisJCShTQ1NJX1RDTl8zMihjbWQpIHwgQklUXzcpIDogU0NTSV9UQ05fMzIoY21kKTsKKworCS8qIEVuYWJsZSBzaW1wbGUgdGFnIHF1ZXVpbmcgaWYgZGV2aWNlIHN1cHBvcnRzIGl0LiAqLworCWlmIChERVZfU0lNUExFX1RBR1MoY21kLT5kZXZpY2UpKQorCQlwa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoQklUXzMpOworCisJLyogTG9hZCBTQ1NJIGNvbW1hbmQgcGFja2V0LiAqLworCXBrdC0+Y2RiX2xlbiA9IGNwdV90b19sZTE2KENNRF9DREJMRU4oY21kKSk7CisJbWVtY3B5KHBrdC0+c2NzaV9jZGIsICYoQ01EX0NEQlAoY21kKSksIENNRF9DREJMRU4oY21kKSk7CisKKwkvKmRwcmludGsoMSwgIkJ1aWxkIHBhY2tldCBmb3IgY29tbWFuZFswXT0weCV4XG4iLHBrdC0+c2NzaV9jZGJbMF0pOyAqLworCS8qIFNldCB0cmFuc2ZlciBkaXJlY3Rpb24uICovCisJZGlyID0gcWxhMTI4MF9kYXRhX2RpcmVjdGlvbihjbWQpOworCXBrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihkaXIpOworCisJLyogU2V0IHRvdGFsIGRhdGEgc2VnbWVudCBjb3VudC4gKi8KKwlwa3QtPmRzZWdfY291bnQgPSBjcHVfdG9fbGUxNihzZWdfY250KTsKKworCS8qCisJICogTG9hZCBkYXRhIHNlZ21lbnRzLgorCSAqLworCWlmIChzZWdfY250KSB7CisJCS8qIFNldHVwIHBhY2tldCBhZGRyZXNzIHNlZ21lbnQgcG9pbnRlci4gKi8KKwkJZHdvcmRfcHRyID0gJnBrdC0+ZHNlZ18wX2FkZHJlc3M7CisKKwkJaWYgKGNtZC0+dXNlX3NnKSB7CS8qIElmIHNjYXR0ZXIgZ2F0aGVyICovCisJCQlkcHJpbnRrKDMsICJCdWlsZGluZyBTL0cgZGF0YSBzZWdtZW50cy4uXG4iKTsKKwkJCXFsYTEyODBfZHVtcF9idWZmZXIoMSwgKGNoYXIgKilzZywgNCAqIDE2KTsKKworCQkJLyogTG9hZCBjb21tYW5kIGVudHJ5IGRhdGEgc2VnbWVudHMuICovCisJCQlmb3IgKGNudCA9IDA7IGNudCA8IDQgJiYgc2VnX2NudDsgY250KyssIHNlZ19jbnQtLSkgeworCQkJCSpkd29yZF9wdHIrKyA9CisJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhzZykpKTsKKwkJCQkqZHdvcmRfcHRyKysgPQorCQkJCQljcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7CisJCQkJZHByaW50aygzLCAiUy9HIFNlZ21lbnQgcGh5c19hZGRyPTB4JWx4LCBsZW49MHgleFxuIiwKKwkJCQkJKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhzZykpKSwKKwkJCQkJKHNnX2RtYV9sZW4oc2cpKSk7CisJCQkJc2crKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBCdWlsZCBjb250aW51YXRpb24gcGFja2V0cy4KKwkJCSAqLworCQkJZHByaW50aygzLCAiUy9HIEJ1aWxkaW5nIENvbnRpbnVhdGlvbiIKKwkJCQkiLi4uc2VnX2NudD0weCV4IHJlbWFpbnNcbiIsIHNlZ19jbnQpOworCQkJd2hpbGUgKHNlZ19jbnQgPiAwKSB7CisJCQkJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJCQkJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJCQkJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBSRVFVRVNUX0VOVFJZX0NOVCkgeworCQkJCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQkJCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9CisJCQkJCQloYS0+cmVxdWVzdF9yaW5nOworCQkJCX0gZWxzZQorCQkJCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCisJCQkJcGt0ID0gKHN0cnVjdCBjbWRfZW50cnkgKiloYS0+cmVxdWVzdF9yaW5nX3B0cjsKKworCQkJCS8qIFplcm8gb3V0IHBhY2tldC4gKi8KKwkJCQltZW1zZXQocGt0LCAwLCBSRVFVRVNUX0VOVFJZX1NJWkUpOworCisJCQkJLyogTG9hZCBwYWNrZXQgZGVmYXVsdHMuICovCisJCQkJKChzdHJ1Y3QgY29udF9lbnRyeSAqKSBwa3QpLT4KKwkJCQkJZW50cnlfdHlwZSA9IENPTlRJTlVFX1RZUEU7CisJCQkJKChzdHJ1Y3QgY29udF9lbnRyeSAqKSBwa3QpLT5lbnRyeV9jb3VudCA9IDE7CisKKwkJCQkoKHN0cnVjdCBjb250X2VudHJ5ICopIHBrdCktPnN5c19kZWZpbmUgPQorCQkJCQkodWludDhfdCkgaGEtPnJlcV9yaW5nX2luZGV4OworCisJCQkJLyogU2V0dXAgcGFja2V0IGFkZHJlc3Mgc2VnbWVudCBwb2ludGVyLiAqLworCQkJCWR3b3JkX3B0ciA9CisJCQkJCSYoKHN0cnVjdCBjb250X2VudHJ5ICopIHBrdCktPmRzZWdfMF9hZGRyZXNzOworCisJCQkJLyogTG9hZCBjb250aW51YXRpb24gZW50cnkgZGF0YSBzZWdtZW50cy4gKi8KKwkJCQlmb3IgKGNudCA9IDA7IGNudCA8IDcgJiYgc2VnX2NudDsKKwkJCQkgICAgIGNudCsrLCBzZWdfY250LS0pIHsKKwkJCQkJKmR3b3JkX3B0cisrID0KKwkJCQkJCWNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhzZykpKTsKKwkJCQkJKmR3b3JkX3B0cisrID0KKwkJCQkJCWNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJIlMvRyBTZWdtZW50IENvbnQuIHBoeXNfYWRkcj0weCV4LCAiCisJCQkJCQkibGVuPTB4JXhcbiIsCisJCQkJCQljcHVfdG9fbGUzMihwY2lfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSksCisJCQkJCQljcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSkpOworCQkJCQlzZysrOworCQkJCX0KKwkJCQlkcHJpbnRrKDUsICJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2k6ICIKKwkJCQkJImNvbnRpbnVhdGlvbiBwYWNrZXQgZGF0YSAtICIKKwkJCQkJInNjc2koJWk6JWk6JWkpXG4iLCBTQ1NJX0JVU18zMihjbWQpLAorCQkJCQlTQ1NJX1RDTl8zMihjbWQpLCBTQ1NJX0xVTl8zMihjbWQpKTsKKwkJCQlxbGExMjgwX2R1bXBfYnVmZmVyKDUsIChjaGFyICopcGt0LAorCQkJCQkJICAgIFJFUVVFU1RfRU5UUllfU0laRSk7CisJCQl9CisJCX0gZWxzZSB7CS8qIE5vIFMvRyBkYXRhIHRyYW5zZmVyICovCisJCQlkbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoaGEtPnBkZXYsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCWNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCXNwLT5zYXZlZF9kbWFfaGFuZGxlID0gZG1hX2hhbmRsZTsKKworCQkJKmR3b3JkX3B0cisrID0gY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKGRtYV9oYW5kbGUpKTsKKwkJCSpkd29yZF9wdHIgPSBjcHVfdG9fbGUzMihjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCX0KKwl9IGVsc2UgewkvKiBObyBkYXRhIHRyYW5zZmVyIGF0IGFsbCAqLworCQlkcHJpbnRrKDUsICJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2k6IE5vIGRhdGEsIGNvbW1hbmQgIgorCQkJInBhY2tldCBkYXRhIC0gXG4iKTsKKwkJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKXBrdCwgUkVRVUVTVF9FTlRSWV9TSVpFKTsKKwl9CisJZHByaW50ayg1LCAicWxhMTI4MF8zMmJpdF9zdGFydF9zY3NpOiBGaXJzdCBJT0NCIGJsb2NrOlxuIik7CisJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKWhhLT5yZXF1ZXN0X3JpbmdfcHRyLAorCQkJICAgIFJFUVVFU1RfRU5UUllfU0laRSk7CisKKwkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KKwloYS0+cmVxX3JpbmdfaW5kZXgrKzsKKwlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IFJFUVVFU1RfRU5UUllfQ05UKSB7CisJCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7CisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwl9IGVsc2UKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIrKzsKKworCS8qIFNldCBjaGlwIG5ldyByaW5nIGluZGV4LiAqLworCWRwcmludGsoMiwgInFsYTEyODBfMzJiaXRfc3RhcnRfc2NzaTogV2FrZXVwIFJJU0MgIgorCQkiZm9yIHBlbmRpbmcgY29tbWFuZFxuIik7CisJc3AtPmZsYWdzIHw9IFNSQl9TRU5UOworCWhhLT5hY3R0aHJlYWRzKys7CisJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g0LCBoYS0+cmVxX3JpbmdfaW5kZXgpOworCS8qIEVuZm9yY2UgbW1pbyB3cml0ZSBvcmRlcmluZzsgc2VlIGNvbW1lbnQgaW4gcWxhMTI4MF9pc3BfY21kKCkuICovCisJbW1pb3diKCk7CisKK291dDoKKwlpZiAoc3RhdHVzKQorCQlkcHJpbnRrKDIsICJxbGExMjgwXzMyYml0X3N0YXJ0X3Njc2k6ICoqKiogRkFJTEVEICoqKipcbiIpOworCisJTEVBVkUoInFsYTEyODBfMzJiaXRfc3RhcnRfc2NzaSIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisvKgorICogcWxhMTI4MF9yZXFfcGt0CisgKiAgICAgIEZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nIHJpbmcgYW5kCisgKiAgICAgIGdldHRpbmcgYSB6ZXJvZWQgb3V0IHJlcXVlc3QgcGFja2V0LgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IGZhaWxlZCB0byBnZXQgc2xvdC4KKyAqLworc3RhdGljIHJlcXVlc3RfdCAqCitxbGExMjgwX3JlcV9wa3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJcmVxdWVzdF90ICpwa3QgPSBOVUxMOworCWludCBjbnQ7CisJdWludDMyX3QgdGltZXI7CisKKwlFTlRFUigicWxhMTI4MF9yZXFfcGt0Iik7CisKKwkvKgorCSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LCBkYW1uIGl0ISEhCisJICovCisJLyogV2FpdCBmb3IgMzAgc2Vjb25kcyBmb3Igc2xvdC4gKi8KKwlmb3IgKHRpbWVyID0gMTUwMDAwMDA7IHRpbWVyOyB0aW1lci0tKSB7CisJCWlmIChoYS0+cmVxX3FfY250ID4gMCkgeworCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmcmVlIHJlcXVlc3QgZW50cmllcy4gKi8KKwkJCWNudCA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g0KTsKKwkJCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPCBjbnQpCisJCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKKwkJCWVsc2UKKwkJCQloYS0+cmVxX3FfY250ID0KKwkJCQkJUkVRVUVTVF9FTlRSWV9DTlQgLSAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKKwkJfQorCisJCS8qIEZvdW5kIGVtcHR5IHJlcXVlc3QgcmluZyBzbG90PyAqLworCQlpZiAoaGEtPnJlcV9xX2NudCA+IDApIHsKKwkJCWhhLT5yZXFfcV9jbnQtLTsKKwkJCXBrdCA9IGhhLT5yZXF1ZXN0X3JpbmdfcHRyOworCisJCQkvKiBaZXJvIG91dCBwYWNrZXQuICovCisJCQltZW1zZXQocGt0LCAwLCBSRVFVRVNUX0VOVFJZX1NJWkUpOworCisJCQkvKgorCQkJICogSG93IGNhbiB0aGlzIGJlIHJpZ2h0IHdoZW4gd2UgaGF2ZSBhIHJpbmcKKwkJCSAqIHNpemUgb2YgNTEyPz8/CisJCQkgKi8KKwkJCS8qIFNldCBzeXN0ZW0gZGVmaW5lZCBmaWVsZC4gKi8KKwkJCXBrdC0+c3lzX2RlZmluZSA9ICh1aW50OF90KSBoYS0+cmVxX3JpbmdfaW5kZXg7CisKKwkJCS8qIFNldCBlbnRyeSBjb3VudC4gKi8KKwkJCXBrdC0+ZW50cnlfY291bnQgPSAxOworCisJCQlicmVhazsKKwkJfQorCisJCXVkZWxheSgyKTsJLyogMTAgKi8KKworCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCQlxbGExMjgwX3BvbGwoaGEpOworCX0KKworCWlmICghcGt0KQorCQlkcHJpbnRrKDIsICJxbGExMjgwX3JlcV9wa3Q6ICoqKiogRkFJTEVEICoqKipcbiIpOworCWVsc2UKKwkJZHByaW50aygzLCAicWxhMTI4MF9yZXFfcGt0OiBleGl0aW5nIG5vcm1hbGx5XG4iKTsKKworCXJldHVybiBwa3Q7Cit9CisKKy8qCisgKiBxbGExMjgwX2lzcF9jbWQKKyAqICAgICAgRnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIG1vZGlmeWluZyBJU1AgaW5wdXQgcG9pbnRlci4KKyAqICAgICAgUmVsZWFzZXMgcmluZyBsb2NrLgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitxbGExMjgwX2lzcF9jbWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXN0cnVjdCBkZXZpY2VfcmVnIF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlFTlRFUigicWxhMTI4MF9pc3BfY21kIik7CisKKwlkcHJpbnRrKDUsICJxbGExMjgwX2lzcF9jbWQ6IElPQ0IgZGF0YTpcbiIpOworCXFsYTEyODBfZHVtcF9idWZmZXIoNSwgKGNoYXIgKiloYS0+cmVxdWVzdF9yaW5nX3B0ciwKKwkJCSAgICBSRVFVRVNUX0VOVFJZX1NJWkUpOworCisJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBSRVFVRVNUX0VOVFJZX0NOVCkgeworCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJfSBlbHNlCisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisKKwkvKgorCSAqIFVwZGF0ZSByZXF1ZXN0IGluZGV4IHRvIG1haWxib3g0IChSZXF1ZXN0IFF1ZXVlIEluKS4KKwkgKiBUaGUgbW1pb3diKCkgZW5zdXJlcyB0aGF0IHRoaXMgd3JpdGUgaXMgb3JkZXJlZCB3aXRoIHdyaXRlcyBieSBvdGhlcgorCSAqIENQVXMuICBXaXRob3V0IHRoZSBtbWlvd2IoKSwgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmc6CisJICogICAgQ1BVQSBwb3N0cyB3cml0ZSBvZiBpbmRleCA1IHRvIG1haWxib3g0CisJICogICAgQ1BVQSByZWxlYXNlcyBob3N0IGxvY2sKKwkgKiAgICBDUFVCIGFjcXVpcmVzIGhvc3QgbG9jaworCSAqICAgIENQVUIgcG9zdHMgd3JpdGUgb2YgaW5kZXggNiB0byBtYWlsYm94NAorCSAqICAgIE9uIFBDSSBidXMsIG9yZGVyIHJldmVyc2VzIGFuZCB3cml0ZSBvZiA2IHBvc3RzLCB0aGVuIGluZGV4IDUsCisJICogICAgICAgY2F1c2luZyBjaGlwIHRvIGlzc3VlIGZ1bGwgcXVldWUgb2Ygc3RhbGUgY29tbWFuZHMKKwkgKiBUaGUgbW1pb3diKCkgcHJldmVudHMgZnV0dXJlIHdyaXRlcyBmcm9tIGNyb3NzaW5nIHRoZSBiYXJyaWVyLgorCSAqIFNlZSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlaW9ib29rLnRtcGwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJICovCisJV1JUX1JFR19XT1JEKCZyZWctPm1haWxib3g0LCBoYS0+cmVxX3JpbmdfaW5kZXgpOworCW1taW93YigpOworCisJTEVBVkUoInFsYTEyODBfaXNwX2NtZCIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcWxhMTI4MF9pc3IKKyAqICAgICAgQ2FsbHMgSS9PIGRvbmUgb24gY29tbWFuZCBjb21wbGV0aW9uLgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIGRvbmVfcSAgICAgICA9IGRvbmUgcXVldWUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitxbGExMjgwX2lzcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXN0cnVjdCByZXNwb25zZSAqcGt0OworCXN0cnVjdCBzcmIgKnNwID0gTlVMTDsKKwl1aW50MTZfdCBtYWlsYm94W01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCXVpbnQxNl90ICp3cHRyOworCXVpbnQzMl90IGluZGV4OworCXUxNiBpc3RhdHVzOworCisJRU5URVIoInFsYTEyODBfaXNyIik7CisKKwlpc3RhdHVzID0gUkRfUkVHX1dPUkQoJnJlZy0+aXN0YXR1cyk7CisJaWYgKCEoaXN0YXR1cyAmIChSSVNDX0lOVCB8IFBDSV9JTlQpKSkKKwkJcmV0dXJuOworCisJLyogU2F2ZSBtYWlsYm94IHJlZ2lzdGVyIDUgKi8KKwltYWlsYm94WzVdID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDUpOworCisJLyogQ2hlY2sgZm9yIG1haWxib3ggaW50ZXJydXB0LiAqLworCisJbWFpbGJveFswXSA9IFJEX1JFR19XT1JEX2RtYXN5bmMoJnJlZy0+c2VtYXBob3JlKTsKKworCWlmIChtYWlsYm94WzBdICYgQklUXzApIHsKKwkJLyogR2V0IG1haWxib3ggZGF0YS4gKi8KKwkJLyogZHByaW50aygxLCAicWxhMTI4MF9pc3I6IEluIEdldCBtYWlsYm94IGRhdGEgXG4iKTsgKi8KKworCQl3cHRyID0gJm1haWxib3hbMF07CisJCSp3cHRyKysgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MCk7CisJCSp3cHRyKysgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSk7CisJCSp3cHRyID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpOworCQlpZiAobWFpbGJveFswXSAhPSBNQkFfU0NTSV9DT01QTEVUSU9OKSB7CisJCQl3cHRyKys7CisJCQkqd3B0cisrID0gUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDMpOworCQkJKndwdHIrKyA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g0KTsKKwkJCXdwdHIrKzsKKwkJCSp3cHRyKysgPSBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94Nik7CisJCQkqd3B0ciA9IFJEX1JFR19XT1JEKCZyZWctPm1haWxib3g3KTsKKwkJfQorCisJCS8qIFJlbGVhc2UgbWFpbGJveCByZWdpc3RlcnMuICovCisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfQ0xSX1JJU0NfSU5UKTsKKworCQlkcHJpbnRrKDUsICJxbGExMjgwX2lzcjogbWFpbGJveCBpbnRlcnJ1cHQgbWFpbGJveFswXSA9IDB4JXgiLAorCQkJbWFpbGJveFswXSk7CisKKwkJLyogSGFuZGxlIGFzeW5jaHJvbm91cyBldmVudCAqLworCQlzd2l0Y2ggKG1haWxib3hbMF0pIHsKKwkJY2FzZSBNQkFfU0NTSV9DT01QTEVUSU9OOgkvKiBSZXNwb25zZSBjb21wbGV0aW9uICovCisJCQlkcHJpbnRrKDUsICJxbGExMjgwX2lzcjogbWFpbGJveCBTQ1NJIHJlc3BvbnNlICIKKwkJCQkiY29tcGxldGlvblxuIik7CisKKwkJCWlmIChoYS0+ZmxhZ3Mub25saW5lKSB7CisJCQkJLyogR2V0IG91dHN0YW5kaW5nIGNvbW1hbmQgaW5kZXguICovCisJCQkJaW5kZXggPSBtYWlsYm94WzJdIDw8IDE2IHwgbWFpbGJveFsxXTsKKworCQkJCS8qIFZhbGlkYXRlIGhhbmRsZS4gKi8KKwkJCQlpZiAoaW5kZXggPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpCisJCQkJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbaW5kZXhdOworCQkJCWVsc2UKKwkJCQkJc3AgPSBOVUxMOworCisJCQkJaWYgKHNwKSB7CisJCQkJCS8qIEZyZWUgb3V0c3RhbmRpbmcgY29tbWFuZCBzbG90LiAqLworCQkJCQloYS0+b3V0c3RhbmRpbmdfY21kc1tpbmRleF0gPSBOVUxMOworCisJCQkJCS8qIFNhdmUgSVNQIGNvbXBsZXRpb24gc3RhdHVzICovCisJCQkJCUNNRF9SRVNVTFQoc3AtPmNtZCkgPSAwOworCisJCQkJCS8qIFBsYWNlIGJsb2NrIG9uIGRvbmUgcXVldWUgKi8KKwkJCQkJbGlzdF9hZGRfdGFpbCgmc3AtPmxpc3QsIGRvbmVfcSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSBhIHJlYWwgcHJvYmxlbSEKKwkJCQkJICovCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICJxbGExMjgwOiBJU1AgaW52YWxpZCBoYW5kbGUiKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1CQV9CVVNfUkVTRVQ6CS8qIFNDU0kgQnVzIFJlc2V0ICovCisJCQloYS0+ZmxhZ3MucmVzZXRfbWFya2VyID0gMTsKKwkJCWluZGV4ID0gbWFpbGJveFs2XSAmIEJJVF8wOworCQkJaGEtPmJ1c19zZXR0aW5nc1tpbmRleF0ucmVzZXRfbWFya2VyID0gMTsKKworCQkJcHJpbnRrKEtFUk5fREVCVUcgInFsYTEyODBfaXNyKCk6IGluZGV4ICVpICIKKwkJCSAgICAgICAiYXN5bmNocm9ub3VzIEJVU19SRVNFVFxuIiwgaW5kZXgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNQkFfU1lTVEVNX0VSUjoJLyogU3lzdGVtIEVycm9yICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgInFsYTEyODA6IElTUCBTeXN0ZW0gRXJyb3IgLSBtYngxPSV4aCwgbWJ4Mj0iCisJCQkgICAgICAgIiV4aCwgbWJ4Mz0leGhcbiIsIG1haWxib3hbMV0sIG1haWxib3hbMl0sCisJCQkgICAgICAgbWFpbGJveFszXSk7CisJCQlicmVhazsKKworCQljYXNlIE1CQV9SRVFfVFJBTlNGRVJfRVJSOgkvKiBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgInFsYTEyODA6IElTUCBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUJBX1JTUF9UUkFOU0ZFUl9FUlI6CS8qIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgInFsYTEyODA6IElTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvclxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1CQV9XQUtFVVBfVEhSRVM6CS8qIFJlcXVlc3QgUXVldWUgV2FrZS11cCAqLworCQkJZHByaW50aygyLCAicWxhMTI4MF9pc3I6IGFzeW5jaHJvbm91cyBXQUtFVVBfVEhSRVNcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNQkFfVElNRU9VVF9SRVNFVDoJLyogRXhlY3V0aW9uIFRpbWVvdXQgUmVzZXQgKi8KKwkJCWRwcmludGsoMiwKKwkJCQkicWxhMTI4MF9pc3I6IGFzeW5jaHJvbm91cyBUSU1FT1VUX1JFU0VUXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUJBX0RFVklDRV9SRVNFVDoJLyogQnVzIERldmljZSBSZXNldCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MF9pc3IoKTogYXN5bmNocm9ub3VzICIKKwkJCSAgICAgICAiQlVTX0RFVklDRV9SRVNFVFxuIik7CisKKwkJCWhhLT5mbGFncy5yZXNldF9tYXJrZXIgPSAxOworCQkJaW5kZXggPSBtYWlsYm94WzZdICYgQklUXzA7CisJCQloYS0+YnVzX3NldHRpbmdzW2luZGV4XS5yZXNldF9tYXJrZXIgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBNQkFfQlVTX01PREVfQ0hBTkdFOgorCQkJZHByaW50aygyLAorCQkJCSJxbGExMjgwX2lzcjogYXN5bmNocm9ub3VzIEJVU19NT0RFX0NIQU5HRVxuIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogZHByaW50aygxLCAicWxhMTI4MF9pc3I6IGRlZmF1bHQgY2FzZSBvZiBzd2l0Y2ggTUIgXG4iKTsgKi8KKwkJCWlmIChtYWlsYm94WzBdIDwgTUJBX0FTWU5DX0VWRU5UKSB7CisJCQkJd3B0ciA9ICZtYWlsYm94WzBdOworCQkJCW1lbWNweSgodWludDE2X3QgKikgaGEtPm1haWxib3hfb3V0LCB3cHRyLAorCQkJCSAgICAgICBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UICoKKwkJCQkgICAgICAgc2l6ZW9mKHVpbnQxNl90KSk7CisKKwkJCQlpZihoYS0+bWFpbGJveF93YWl0ICE9IE5VTEwpCisJCQkJCWNvbXBsZXRlKGhhLT5tYWlsYm94X3dhaXQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aG9zdF9jbWQsIEhDX0NMUl9SSVNDX0lOVCk7CisJfQorCisJLyoKKwkgKiBXZSB3aWxsIHJlY2VpdmUgaW50ZXJydXB0cyBkdXJpbmcgbWFpbGJveCB0ZXN0aW5nIHByaW9yIHRvCisJICogdGhlIGNhcmQgYmVpbmcgbWFya2VkIG9ubGluZSwgaGVuY2UgdGhlIGRvdWJsZSBjaGVjay4KKwkgKi8KKwlpZiAoIShoYS0+ZmxhZ3Mub25saW5lICYmICFoYS0+bWFpbGJveF93YWl0KSkgeworCQlkcHJpbnRrKDIsICJxbGExMjgwX2lzcjogUmVzcG9uc2UgcG9pbnRlciBFcnJvclxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChtYWlsYm94WzVdID49IFJFU1BPTlNFX0VOVFJZX0NOVCkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoaGEtPnJzcF9yaW5nX2luZGV4ICE9IG1haWxib3hbNV0pIHsKKwkJcGt0ID0gaGEtPnJlc3BvbnNlX3JpbmdfcHRyOworCisJCWRwcmludGsoNSwgInFsYTEyODBfaXNyOiBoYS0+cnNwX3JpbmdfaW5kZXggPSAweCV4LCBtYWlsYm94WzVdIgorCQkJIiA9IDB4JXhcbiIsIGhhLT5yc3BfcmluZ19pbmRleCwgbWFpbGJveFs1XSk7CisJCWRwcmludGsoNSwicWxhMTI4MF9pc3I6IHJlc3BvbnNlIHBhY2tldCBkYXRhXG4iKTsKKwkJcWxhMTI4MF9kdW1wX2J1ZmZlcig1LCAoY2hhciAqKXBrdCwgUkVTUE9OU0VfRU5UUllfU0laRSk7CisKKwkJaWYgKHBrdC0+ZW50cnlfdHlwZSA9PSBTVEFUVVNfVFlQRSkgeworCQkJaWYgKChsZTE2X3RvX2NwdShwa3QtPnNjc2lfc3RhdHVzKSAmIDB4ZmYpCisJCQkgICAgfHwgcGt0LT5jb21wX3N0YXR1cyB8fCBwa3QtPmVudHJ5X3N0YXR1cykgeworCQkJCWRwcmludGsoMiwgInFsYTEyODBfaXNyOiBoYS0+cnNwX3JpbmdfaW5kZXggPSAiCisJCQkJCSIweCV4IG1haWxib3hbNV0gPSAweCV4LCBjb21wX3N0YXR1cyAiCisJCQkJCSI9IDB4JXgsIHNjc2lfc3RhdHVzID0gMHgleFxuIiwKKwkJCQkJaGEtPnJzcF9yaW5nX2luZGV4LCBtYWlsYm94WzVdLAorCQkJCQlsZTE2X3RvX2NwdShwa3QtPmNvbXBfc3RhdHVzKSwKKwkJCQkJbGUxNl90b19jcHUocGt0LT5zY3NpX3N0YXR1cykpOworCQkJfQorCQl9IGVsc2UgeworCQkJZHByaW50aygyLCAicWxhMTI4MF9pc3I6IGhhLT5yc3BfcmluZ19pbmRleCA9ICIKKwkJCQkiMHgleCwgbWFpbGJveFs1XSA9IDB4JXhcbiIsCisJCQkJaGEtPnJzcF9yaW5nX2luZGV4LCBtYWlsYm94WzVdKTsKKwkJCWRwcmludGsoMiwgInFsYTEyODBfaXNyOiByZXNwb25zZSBwYWNrZXQgZGF0YVxuIik7CisJCQlxbGExMjgwX2R1bXBfYnVmZmVyKDIsIChjaGFyICopcGt0LAorCQkJCQkgICAgUkVTUE9OU0VfRU5UUllfU0laRSk7CisJCX0KKworCQlpZiAocGt0LT5lbnRyeV90eXBlID09IFNUQVRVU19UWVBFIHx8IHBrdC0+ZW50cnlfc3RhdHVzKSB7CisJCQlkcHJpbnRrKDIsICJzdGF0dXM6IENtZCAlcCwgaGFuZGxlICVpXG4iLAorCQkJCWhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXS0+Y21kLAorCQkJCXBrdC0+aGFuZGxlKTsKKwkJCWlmIChwa3QtPmVudHJ5X3R5cGUgPT0gU1RBVFVTX1RZUEUpCisJCQkJcWxhMTI4MF9zdGF0dXNfZW50cnkoaGEsIHBrdCwgZG9uZV9xKTsKKwkJCWVsc2UKKwkJCQlxbGExMjgwX2Vycm9yX2VudHJ5KGhhLCBwa3QsIGRvbmVfcSk7CisJCQkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KKwkJCWhhLT5yc3BfcmluZ19pbmRleCsrOworCQkJaWYgKGhhLT5yc3BfcmluZ19pbmRleCA9PSBSRVNQT05TRV9FTlRSWV9DTlQpIHsKKwkJCQloYS0+cnNwX3JpbmdfaW5kZXggPSAwOworCQkJCWhhLT5yZXNwb25zZV9yaW5nX3B0ciA9CWhhLT5yZXNwb25zZV9yaW5nOworCQkJfSBlbHNlCisJCQkJaGEtPnJlc3BvbnNlX3JpbmdfcHRyKys7CisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDUsIGhhLT5yc3BfcmluZ19pbmRleCk7CisJCX0KKwl9CisJCisgb3V0OgorCUxFQVZFKCJxbGExMjgwX2lzciIpOworfQorCisvKgorICogIHFsYTEyODBfcnN0X2FlbgorICogICAgICBQcm9jZXNzZXMgYXN5bmNocm9ub3VzIHJlc2V0LgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitxbGExMjgwX3JzdF9hZW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQ4X3QgYnVzOworCisJRU5URVIoInFsYTEyODBfcnN0X2FlbiIpOworCisJaWYgKGhhLT5mbGFncy5vbmxpbmUgJiYgIWhhLT5mbGFncy5yZXNldF9hY3RpdmUgJiYKKwkgICAgIWhhLT5mbGFncy5hYm9ydF9pc3BfYWN0aXZlKSB7CisJCWhhLT5mbGFncy5yZXNldF9hY3RpdmUgPSAxOworCQl3aGlsZSAoaGEtPmZsYWdzLnJlc2V0X21hcmtlcikgeworCQkJLyogSXNzdWUgbWFya2VyIGNvbW1hbmQuICovCisJCQloYS0+ZmxhZ3MucmVzZXRfbWFya2VyID0gMDsKKwkJCWZvciAoYnVzID0gMDsgYnVzIDwgaGEtPnBvcnRzICYmCisJCQkJICAgICAhaGEtPmZsYWdzLnJlc2V0X21hcmtlcjsgYnVzKyspIHsKKwkJCQlpZiAoaGEtPmJ1c19zZXR0aW5nc1tidXNdLnJlc2V0X21hcmtlcikgeworCQkJCQloYS0+YnVzX3NldHRpbmdzW2J1c10ucmVzZXRfbWFya2VyID0gMDsKKwkJCQkJcWxhMTI4MF9tYXJrZXIoaGEsIGJ1cywgMCwgMCwKKwkJCQkJCSAgICAgICBNS19TWU5DX0FMTCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJTEVBVkUoInFsYTEyODBfcnN0X2FlbiIpOworfQorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDUwMAorLyoKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitxbGExMjgwX2dldF90YXJnZXRfb3B0aW9ucyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1bnNpZ25lZCBjaGFyICpyZXN1bHQ7CisJc3RydWN0IG52cmFtICpuOworCWludCBidXMsIHRhcmdldCwgbHVuOworCisJYnVzID0gU0NTSV9CVVNfMzIoY21kKTsKKwl0YXJnZXQgPSBTQ1NJX1RDTl8zMihjbWQpOworCWx1biA9IFNDU0lfTFVOXzMyKGNtZCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0byBub3QgdG91Y2ggYW55dGhpbmcgaWYgc29tZW9uZSBpcyB1c2luZyB0aGUKKwkgKiBzZyBpbnRlcmZhY2UuCisJICovCisJaWYgKGNtZC0+dXNlX3NnIHx8IChDTURfUkVTVUxUKGNtZCkgPj4gMTYpICE9IERJRF9PSyB8fCBsdW4pCisJCXJldHVybjsKKworCXJlc3VsdCA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJbiA9ICZoYS0+bnZyYW07CisKKwluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wYXJhbWV0ZXIuZi5lbmFibGVfd2lkZSA9IDA7CisJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMgPSAwOworCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBwcl8xeDE2MC5mbGFncy5lbmFibGVfcHByID0gMDsKKworICAgICAgICBpZiAocmVzdWx0WzddICYgMHg2MCkKKwkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUgPSAxOworICAgICAgICBpZiAocmVzdWx0WzddICYgMHgxMCkKKwkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3N5bmMgPSAxOworCWlmICgocmVzdWx0WzJdID49IDMpICYmIChyZXN1bHRbNF0gKyA1ID4gNTYpICYmCisJICAgIChyZXN1bHRbNTZdICYgMHg0KSkKKwkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucHByXzF4MTYwLmZsYWdzLmVuYWJsZV9wcHIgPSAxOworCisJZHByaW50aygyLCAiZ2V0X3RhcmdldF9vcHRpb25zKCk6IHdpZGUgJWksIHN5bmMgJWksIHBwciAlaVxuIiwKKwkJbi0+YnVzW2J1c10udGFyZ2V0W3RhcmdldF0ucGFyYW1ldGVyLmYuZW5hYmxlX3dpZGUsCisJCW4tPmJ1c1tidXNdLnRhcmdldFt0YXJnZXRdLnBhcmFtZXRlci5mLmVuYWJsZV9zeW5jLAorCQluLT5idXNbYnVzXS50YXJnZXRbdGFyZ2V0XS5wcHJfMXgxNjAuZmxhZ3MuZW5hYmxlX3Bwcik7Cit9CisjZW5kaWYKKworLyoKKyAqICBxbGExMjgwX3N0YXR1c19lbnRyeQorICogICAgICBQcm9jZXNzZXMgcmVjZWl2ZWQgSVNQIHN0YXR1cyBlbnRyeS4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBwa3QgICAgICAgICAgPSBlbnRyeSBwb2ludGVyLgorICogICAgICBkb25lX3EgICAgICAgPSBkb25lIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9zdGF0dXNfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3QgcmVzcG9uc2UgKnBrdCwKKwkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJdW5zaWduZWQgaW50IGJ1cywgdGFyZ2V0LCBsdW47CisJaW50IHNlbnNlX3N6OworCXN0cnVjdCBzcmIgKnNwOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwl1aW50MzJfdCBoYW5kbGUgPSBsZTMyX3RvX2NwdShwa3QtPmhhbmRsZSk7CisJdWludDE2X3Qgc2NzaV9zdGF0dXMgPSBsZTE2X3RvX2NwdShwa3QtPnNjc2lfc3RhdHVzKTsKKwl1aW50MTZfdCBjb21wX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHBrdC0+Y29tcF9zdGF0dXMpOworCisJRU5URVIoInFsYTEyODBfc3RhdHVzX2VudHJ5Iik7CisKKwkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCisJaWYgKGhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKKwkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdOworCWVsc2UKKwkJc3AgPSBOVUxMOworCisJaWYgKCFzcCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJxbGExMjgwOiBTdGF0dXMgRW50cnkgaW52YWxpZCBoYW5kbGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGcmVlIG91dHN0YW5kaW5nIGNvbW1hbmQgc2xvdC4gKi8KKwloYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID0gTlVMTDsKKworCWNtZCA9IHNwLT5jbWQ7CisKKwkvKiBHZW5lcmF0ZSBMVSBxdWV1ZSBvbiBjbnRybCwgdGFyZ2V0LCBMVU4gKi8KKwlidXMgPSBTQ1NJX0JVU18zMihjbWQpOworCXRhcmdldCA9IFNDU0lfVENOXzMyKGNtZCk7CisJbHVuID0gU0NTSV9MVU5fMzIoY21kKTsKKworCWlmIChjb21wX3N0YXR1cyB8fCBzY3NpX3N0YXR1cykgeworCQlkcHJpbnRrKDMsICJzY3NpOiBjb21wX3N0YXR1cyA9IDB4JXgsIHNjc2lfc3RhdHVzID0gIgorCQkJIjB4JXgsIGhhbmRsZSA9IDB4JXhcbiIsIGNvbXBfc3RhdHVzLAorCQkJc2NzaV9zdGF0dXMsIGhhbmRsZSk7CisJfQorCisJLyogVGFyZ2V0IGJ1c3kgKi8KKwlpZiAoc2NzaV9zdGF0dXMgJiBTU19CVVNZX0NPTkRJVElPTiAmJgorCSAgICBzY3NpX3N0YXR1cyAhPSBTU19SRVNFUlZFX0NPTkZMSUNUKSB7CisJCUNNRF9SRVNVTFQoY21kKSA9CisJCQlESURfQlVTX0JVU1kgPDwgMTYgfCAoc2NzaV9zdGF0dXMgJiAweGZmKTsKKwl9IGVsc2UgeworCisJCS8qIFNhdmUgSVNQIGNvbXBsZXRpb24gc3RhdHVzICovCisJCUNNRF9SRVNVTFQoY21kKSA9IHFsYTEyODBfcmV0dXJuX3N0YXR1cyhwa3QsIGNtZCk7CisKKwkJaWYgKHNjc2lfc3RhdHVzICYgU1NfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQlpZiAoY29tcF9zdGF0dXMgIT0gQ1NfQVJTX0ZBSUxFRCkgeworCQkJCXVpbnQxNl90IHJlcV9zZW5zZV9sZW5ndGggPQorCQkJCQlsZTE2X3RvX2NwdShwa3QtPnJlcV9zZW5zZV9sZW5ndGgpOworCQkJCWlmIChyZXFfc2Vuc2VfbGVuZ3RoIDwgQ01EX1NOU0xFTihjbWQpKQorCQkJCQlzZW5zZV9zeiA9IHJlcV9zZW5zZV9sZW5ndGg7CisJCQkJZWxzZQorCQkJCQkvKgorCQkJCQkgKiBzY3NpX2NtbmQtPnNlbnNlX2J1ZmZlciBpcworCQkJCQkgKiA2NCBieXRlcywgd2h5IG9ubHkgY29weSA2Mz8KKwkJCQkJICogVGhpcyBsb29rcyB3cm9uZyEgL0plcworCQkJCQkgKi8KKwkJCQkJc2Vuc2Vfc3ogPSBDTURfU05TTEVOKGNtZCkgLSAxOworCisJCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLAorCQkJCSAgICAgICAmcGt0LT5yZXFfc2Vuc2VfZGF0YSwgc2Vuc2Vfc3opOworCQkJfSBlbHNlCisJCQkJc2Vuc2Vfc3ogPSAwOworCQkJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyICsgc2Vuc2Vfc3osIDAsCisJCQkgICAgICAgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSAtIHNlbnNlX3N6KTsKKworCQkJZHByaW50aygyLCAicWxhMTI4MF9zdGF0dXNfZW50cnk6IENoZWNrICIKKwkJCQkiY29uZGl0aW9uIFNlbnNlIGRhdGEsIGIgJWksIHQgJWksICIKKwkJCQkibCAlaVxuIiwgYnVzLCB0YXJnZXQsIGx1bik7CisJCQlpZiAoc2Vuc2Vfc3opCisJCQkJcWxhMTI4MF9kdW1wX2J1ZmZlcigyLAorCQkJCQkJICAgIChjaGFyICopY21kLT5zZW5zZV9idWZmZXIsCisJCQkJCQkgICAgc2Vuc2Vfc3opOworCQl9CisJfQorCisJLyogUGxhY2UgY29tbWFuZCBvbiBkb25lIHF1ZXVlLiAqLworCWxpc3RfYWRkX3RhaWwoJnNwLT5saXN0LCBkb25lX3EpOworIG91dDoKKwlMRUFWRSgicWxhMTI4MF9zdGF0dXNfZW50cnkiKTsKK30KKworLyoKKyAqICBxbGExMjgwX2Vycm9yX2VudHJ5CisgKiAgICAgIFByb2Nlc3NlcyBlcnJvciBlbnRyeS4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBwa3QgICAgICAgICAgPSBlbnRyeSBwb2ludGVyLgorICogICAgICBkb25lX3EgICAgICAgPSBkb25lIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZAorcWxhMTI4MF9lcnJvcl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCByZXNwb25zZSAqcGt0LAorCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXN0cnVjdCBzcmIgKnNwOworCXVpbnQzMl90IGhhbmRsZSA9IGxlMzJfdG9fY3B1KHBrdC0+aGFuZGxlKTsKKworCUVOVEVSKCJxbGExMjgwX2Vycm9yX2VudHJ5Iik7CisKKwlpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBCSVRfMykKKwkJZHByaW50aygyLCAicWxhMTI4MF9lcnJvcl9lbnRyeTogQkFEIFBBWUxPQUQgZmxhZyBlcnJvclxuIik7CisJZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBCSVRfMikKKwkJZHByaW50aygyLCAicWxhMTI4MF9lcnJvcl9lbnRyeTogQkFEIEhFQURFUiBmbGFnIGVycm9yXG4iKTsKKwllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIEJJVF8xKQorCQlkcHJpbnRrKDIsICJxbGExMjgwX2Vycm9yX2VudHJ5OiBGVUxMIGZsYWcgZXJyb3JcbiIpOworCWVsc2UKKwkJZHByaW50aygyLCAicWxhMTI4MF9lcnJvcl9lbnRyeTogVU5LTk9XTiBmbGFnIGVycm9yXG4iKTsKKworCS8qIFZhbGlkYXRlIGhhbmRsZS4gKi8KKwlpZiAoaGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV07CisJZWxzZQorCQlzcCA9IE5VTEw7CisKKwlpZiAoc3ApIHsKKwkJLyogRnJlZSBvdXRzdGFuZGluZyBjb21tYW5kIHNsb3QuICovCisJCWhhLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBOVUxMOworCisJCS8qIEJhZCBwYXlsb2FkIG9yIGhlYWRlciAqLworCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiAoQklUXzMgKyBCSVRfMikpIHsKKwkJCS8qIEJhZCBwYXlsb2FkIG9yIGhlYWRlciwgc2V0IGVycm9yIHN0YXR1cy4gKi8KKwkJCS8qIENNRF9SRVNVTFQoc3AtPmNtZCkgPSBDU19CQURfUEFZTE9BRDsgKi8KKwkJCUNNRF9SRVNVTFQoc3AtPmNtZCkgPSBESURfRVJST1IgPDwgMTY7CisJCX0gZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBCSVRfMSkgewkvKiBGVUxMIGZsYWcgKi8KKwkJCUNNRF9SRVNVTFQoc3AtPmNtZCkgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgZXJyb3Igc3RhdHVzLiAqLworCQkJQ01EX1JFU1VMVChzcC0+Y21kKSA9IERJRF9FUlJPUiA8PCAxNjsKKwkJfQorCisJCS8qIFBsYWNlIGNvbW1hbmQgb24gZG9uZSBxdWV1ZS4gKi8KKwkJbGlzdF9hZGRfdGFpbCgmc3AtPmxpc3QsIGRvbmVfcSk7CisJfQorI2lmZGVmIFFMQV82NEJJVF9QVFIKKwllbHNlIGlmIChwa3QtPmVudHJ5X3R5cGUgPT0gQ09NTUFORF9BNjRfVFlQRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIhcWxhMTI4MDogRXJyb3IgRW50cnkgaW52YWxpZCBoYW5kbGUiKTsKKwl9CisjZW5kaWYKKworCUxFQVZFKCJxbGExMjgwX2Vycm9yX2VudHJ5Iik7Cit9CisKKy8qCisgKiAgcWxhMTI4MF9hYm9ydF9pc3AKKyAqICAgICAgUmVzZXRzIElTUCBhbmQgYWJvcnRzIGFsbCBvdXRzdGFuZGluZyBjb21tYW5kcy4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK3FsYTEyODBfYWJvcnRfaXNwKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXN0cnVjdCBzcmIgKnNwOworCWludCBzdGF0dXMgPSAwOworCWludCBjbnQ7CisJaW50IGJ1czsKKworCUVOVEVSKCJxbGExMjgwX2Fib3J0X2lzcCIpOworCisJaWYgKGhhLT5mbGFncy5hYm9ydF9pc3BfYWN0aXZlIHx8ICFoYS0+ZmxhZ3Mub25saW5lKQorCQlnb3RvIG91dDsKKwkKKwloYS0+ZmxhZ3MuYWJvcnRfaXNwX2FjdGl2ZSA9IDE7CisKKwkvKiBEaXNhYmxlIElTUCBpbnRlcnJ1cHRzLiAqLworCXFsYTEyODBfZGlzYWJsZV9pbnRycyhoYSk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhvc3RfY21kLCBIQ19QQVVTRV9SSVNDKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5pZF9sKTsKKworCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpKTogZGVxdWV1aW5nIG91dHN0YW5kaW5nIGNvbW1hbmRzXG4iLAorCSAgICAgICBoYS0+aG9zdF9ubyk7CisJLyogRGVxdWV1ZSBhbGwgY29tbWFuZHMgaW4gb3V0c3RhbmRpbmcgY29tbWFuZCBsaXN0LiAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XTsKKwkJaWYgKHNwKSB7CisKKwkJCWNtZCA9IHNwLT5jbWQ7CisJCQlDTURfUkVTVUxUKGNtZCkgPSBESURfUkVTRVQgPDwgMTY7CisKKwkJCXNwLT5jbWQgPSBOVUxMOworCQkJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CisKKwkJCSgqY21kLT5zY3NpX2RvbmUpKGNtZCk7CisKKwkJCXNwLT5mbGFncyA9IDA7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBxbGExMjgwX2xvYWRfZmlybXdhcmUoaGEpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCisJLyogU2V0dXAgYWRhcHRlciBiYXNlZCBvbiBOVlJBTSBwYXJhbWV0ZXJzLiAqLworCXFsYTEyODBfbnZyYW1fY29uZmlnIChoYSk7CisKKwlzdGF0dXMgPSBxbGExMjgwX2luaXRfcmluZ3MoaGEpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCQkKKwkvKiBJc3N1ZSBTQ1NJIHJlc2V0LiAqLworCWZvciAoYnVzID0gMDsgYnVzIDwgaGEtPnBvcnRzOyBidXMrKykKKwkJcWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cyk7CisJCQorCWhhLT5mbGFncy5hYm9ydF9pc3BfYWN0aXZlID0gMDsKKyBvdXQ6CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAicWxhMTI4MDogSVNQIGVycm9yIHJlY292ZXJ5IGZhaWxlZCwgYm9hcmQgZGlzYWJsZWQiKTsKKwkJcWxhMTI4MF9yZXNldF9hZGFwdGVyKGhhKTsKKwkJZHByaW50aygyLCAicWxhMTI4MF9hYm9ydF9pc3A6ICoqKiogRkFJTEVEICoqKipcbiIpOworCX0KKworCUxFQVZFKCJxbGExMjgwX2Fib3J0X2lzcCIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIHFsYTEyODBfZGVib3VuY2VfcmVnaXN0ZXIKKyAqICAgICAgRGVib3VuY2UgcmVnaXN0ZXIuCisgKgorICogSW5wdXQ6CisgKiAgICAgIHBvcnQgPSByZWdpc3RlciBhZGRyZXNzLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIHJlZ2lzdGVyIHZhbHVlLgorICovCitzdGF0aWMgdTE2CitxbGExMjgwX2RlYm91bmNlX3JlZ2lzdGVyKHZvbGF0aWxlIHUxNiBfX2lvbWVtICogYWRkcikKK3sKKwl2b2xhdGlsZSB1MTYgcmV0OworCXZvbGF0aWxlIHUxNiByZXQyOworCisJcmV0ID0gUkRfUkVHX1dPUkQoYWRkcik7CisJcmV0MiA9IFJEX1JFR19XT1JEKGFkZHIpOworCisJaWYgKHJldCA9PSByZXQyKQorCQlyZXR1cm4gcmV0OworCisJZG8geworCQljcHVfcmVsYXgoKTsKKwkJcmV0ID0gUkRfUkVHX1dPUkQoYWRkcik7CisJCXJldDIgPSBSRF9SRUdfV09SRChhZGRyKTsKKwl9IHdoaWxlIChyZXQgIT0gcmV0Mik7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHFsYTEyODBfY2hlY2tfZm9yX2RlYWRfc2NzaV9idXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgIFRoaXMgcm91dGluZSBjaGVja3MgZm9yIGEgZGVhZCBTQ1NJIGJ1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNFVF9TWFBfQkFOSyAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBTQ1NJX1BIQVNFX0lOVkFMSUQgICAgICAweDg3RkYKK3N0YXRpYyBpbnQKK3FsYTEyODBfY2hlY2tfZm9yX2RlYWRfc2NzaV9idXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1bnNpZ25lZCBpbnQgYnVzKQoreworCXVpbnQxNl90IGNvbmZpZ19yZWcsIHNjc2lfY29udHJvbDsKKwlzdHJ1Y3QgZGV2aWNlX3JlZyBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJaWYgKGhhLT5idXNfc2V0dGluZ3NbYnVzXS5zY3NpX2J1c19kZWFkKSB7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5ob3N0X2NtZCwgSENfUEFVU0VfUklTQyk7CisJCWNvbmZpZ19yZWcgPSBSRF9SRUdfV09SRCgmcmVnLT5jZmdfMSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5jZmdfMSwgU0VUX1NYUF9CQU5LKTsKKwkJc2NzaV9jb250cm9sID0gUkRfUkVHX1dPUkQoJnJlZy0+c2NzaUNvbnRyb2xQaW5zKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmNmZ18xLCBjb25maWdfcmVnKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhvc3RfY21kLCBIQ19SRUxFQVNFX1JJU0MpOworCisJCWlmIChzY3NpX2NvbnRyb2wgPT0gU0NTSV9QSEFTRV9JTlZBTElEKSB7CisJCQloYS0+YnVzX3NldHRpbmdzW2J1c10uc2NzaV9idXNfZGVhZCA9IDE7CisjaWYgMAorCQkJQ01EX1JFU1VMVChjcCkgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCUNNRF9IQU5ETEUoY3ApID0gSU5WQUxJRF9IQU5ETEU7CisJCQkvKiBoYS0+YWN0dGhyZWFkcy0tOyAqLworCisJCQkoKihjcCktPnNjc2lfZG9uZSkoY3ApOworI2VuZGlmCisJCQlyZXR1cm4gMTsJLyogYnVzIGlzIGRlYWQgKi8KKwkJfSBlbHNlIHsKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5zY3NpX2J1c19kZWFkID0gMDsKKwkJCWhhLT5idXNfc2V0dGluZ3NbYnVzXS5mYWlsZWRfcmVzZXRfY291bnQgPSAwOworCQl9CisJfQorCXJldHVybiAwOwkJLyogYnVzIGlzIG5vdCBkZWFkICovCit9CisKK3N0YXRpYyB2b2lkCitxbGExMjgwX2dldF90YXJnZXRfcGFyYW1ldGVycyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkgICAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKwlpbnQgYnVzLCB0YXJnZXQsIGx1bjsKKworCWJ1cyA9IGRldmljZS0+Y2hhbm5lbDsKKwl0YXJnZXQgPSBkZXZpY2UtPmlkOworCWx1biA9IGRldmljZS0+bHVuOworCisKKwltYlswXSA9IE1CQ19HRVRfVEFSR0VUX1BBUkFNRVRFUlM7CisJbWJbMV0gPSAodWludDE2X3QpIChidXMgPyB0YXJnZXQgfCBCSVRfNyA6IHRhcmdldCk7CisJbWJbMV0gPDw9IDg7CisJcWxhMTI4MF9tYWlsYm94X2NvbW1hbmQoaGEsIEJJVF82IHwgQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzAsCisJCQkJJm1iWzBdKTsKKworCXByaW50ayhLRVJOX0lORk8gInNjc2koJWxpOiVkOiVkOiVkKToiLCBoYS0+aG9zdF9ubywgYnVzLCB0YXJnZXQsIGx1bik7CisKKwlpZiAobWJbM10gIT0gMCkgeworCQlwcmludGsoIiBTeW5jOiBwZXJpb2QgJWQsIG9mZnNldCAlZCIsCisJCSAgICAgICAobWJbM10gJiAweGZmKSwgKG1iWzNdID4+IDgpKTsKKwkJaWYgKG1iWzJdICYgQklUXzEzKQorCQkJcHJpbnRrKCIsIFdpZGUiKTsKKwkJaWYgKChtYlsyXSAmIEJJVF81KSAmJiAoKG1iWzZdID4+IDgpICYgMHhmZikgPj0gMikKKwkJCXByaW50aygiLCBEVCIpOworCX0gZWxzZQorCQlwcmludGsoIiBBc3luYyIpOworCisJaWYgKERFVl9TSU1QTEVfVEFHUyhkZXZpY2UpKQorCQlwcmludGsoIiwgVGFnZ2VkIHF1ZXVpbmc6IGRlcHRoICVkIiwgZGV2aWNlLT5xdWV1ZV9kZXB0aCk7CisJcHJpbnRrKCJcbiIpOworfQorCisKKyNpZiBERUJVR19RTEExMjgwCitzdGF0aWMgdm9pZAorX19xbGExMjgwX2R1bXBfYnVmZmVyKGNoYXIgKmIsIGludCBzaXplKQoreworCWludCBjbnQ7CisJdTggYzsKKworCXByaW50ayhLRVJOX0RFQlVHICIgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEFoICAiCisJICAgICAgICJCaCAgQ2ggIERoICBFaCAgRmhcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplOykgeworCQljID0gKmIrKzsKKworCQlwcmludGsoIjB4JTAyeCIsIGMpOworCQljbnQrKzsKKwkJaWYgKCEoY250ICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCQllbHNlCisJCQlwcmludGsoIiAiKTsKKwl9CisJaWYgKGNudCAlIDE2KQorCQlwcmludGsoIlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBxbDEyODBfcHJpbnRfc2NzaV9jbWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorX19xbGExMjgwX3ByaW50X3Njc2lfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IENNRF9IT1NUKGNtZCk7CisJc3RydWN0IHNyYiAqc3A7CisJLyogc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsgKi8KKworCWludCBpOworCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisKKwlzcCA9IChzdHJ1Y3Qgc3JiICopQ01EX1NQKGNtZCk7CisJcHJpbnRrKCJTQ1NJIENvbW1hbmQgQD0gMHglcCwgSGFuZGxlPTB4JXBcbiIsIGNtZCwgQ01EX0hBTkRMRShjbWQpKTsKKwlwcmludGsoIiAgY2hhbj0lZCwgdGFyZ2V0ID0gMHglMDJ4LCBsdW4gPSAweCUwMngsIGNtZF9sZW4gPSAweCUwMnhcbiIsCisJICAgICAgIFNDU0lfQlVTXzMyKGNtZCksIFNDU0lfVENOXzMyKGNtZCksIFNDU0lfTFVOXzMyKGNtZCksCisJICAgICAgIENNRF9DREJMRU4oY21kKSk7CisJcHJpbnRrKCIgQ0RCID0gIik7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgaSsrKSB7CisJCXByaW50aygiMHglMDJ4ICIsIGNtZC0+Y21uZFtpXSk7CisJfQorCXByaW50aygiICBzZWdfY250ID0lZFxuIiwgY21kLT51c2Vfc2cpOworCXByaW50aygiICByZXF1ZXN0IGJ1ZmZlcj0weCVwLCByZXF1ZXN0IGJ1ZmZlciBsZW49MHgleFxuIiwKKwkgICAgICAgY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCS8qIGlmIChjbWQtPnVzZV9zZykKKwkgICB7CisJICAgc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+cmVxdWVzdF9idWZmZXI7CisJICAgcHJpbnRrKCIgIFNHIGJ1ZmZlcjogXG4iKTsKKwkgICBxbGExMjgwX2R1bXBfYnVmZmVyKDEsIChjaGFyICopc2csIChjbWQtPnVzZV9zZypzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSkpOworCSAgIH0gKi8KKwlwcmludGsoIiAgdGFnPSVkLCB0cmFuc2ZlcnNpemU9MHgleCBcbiIsCisJICAgICAgIGNtZC0+dGFnLCBjbWQtPnRyYW5zZmVyc2l6ZSk7CisJcHJpbnRrKCIgIFBpZD0lbGksIFNQPTB4JXBcbiIsIGNtZC0+cGlkLCBDTURfU1AoY21kKSk7CisJcHJpbnRrKCIgdW5kZXJmbG93IHNpemUgPSAweCV4LCBkaXJlY3Rpb249MHgleFxuIiwKKwkgICAgICAgY21kLT51bmRlcmZsb3csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWwxMjgwX2R1bXBfZGV2aWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3FsMTI4MF9kdW1wX2RldmljZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjcDsKKwlzdHJ1Y3Qgc3JiICpzcDsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0RFQlVHICJPdXRzdGFuZGluZyBDb21tYW5kcyBvbiBjb250cm9sbGVyOlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBpKyspIHsKKwkJaWYgKChzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2ldKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlmICgoY3AgPSBzcC0+Y21kKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXFsYTEyODBfcHJpbnRfc2NzaV9jbWQoMSwgY3ApOworCX0KK30KKyNlbmRpZgorCisKK2VudW0gdG9rZW5zIHsKKwlUT0tFTl9OVlJBTSwKKwlUT0tFTl9TWU5DLAorCVRPS0VOX1dJREUsCisJVE9LRU5fUFBSLAorCVRPS0VOX1ZFUkJPU0UsCisJVE9LRU5fREVCVUcsCit9OworCitzdHJ1Y3Qgc2V0dXBfdG9rZW5zIHsKKwljaGFyICp0b2tlbjsKKwlpbnQgdmFsOworfTsKKworc3RhdGljIHN0cnVjdCBzZXR1cF90b2tlbnMgc2V0dXBfdG9rZW5bXSBfX2luaXRkYXRhID0gCit7CisJeyAibnZyYW0iLCBUT0tFTl9OVlJBTSB9LAorCXsgInN5bmMiLCBUT0tFTl9TWU5DIH0sCisJeyAid2lkZSIsIFRPS0VOX1dJREUgfSwKKwl7ICJwcHIiLCBUT0tFTl9QUFIgfSwKKwl7ICJ2ZXJib3NlIiwgVE9LRU5fVkVSQk9TRSB9LAorCXsgImRlYnVnIiwgVE9LRU5fREVCVUcgfSwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIHFsYTEyODBfc2V0dXAKKyAqCisgKiAgIEhhbmRsZSBib290IHBhcmFtZXRlcnMuIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgc28gb25lCisgKiAgIGNhbiBzcGVjaWZ5IHBlciBhZGFwdGVyIHBhcmFtZXRlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdAorcWxhMTI4MF9zZXR1cChjaGFyICpzKQoreworCWNoYXIgKmNwLCAqcHRyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCB0b2tlOworCisJY3AgPSBzOworCisJd2hpbGUgKGNwICYmIChwdHIgPSBzdHJjaHIoY3AsICc6JykpKSB7CisJCXB0cisrOworCQlpZiAoIXN0cmNtcChwdHIsICJ5ZXMiKSkgeworCQkJdmFsID0gMHgxMDAwMDsKKwkJCXB0ciArPSAzOworCQl9IGVsc2UgaWYgKCFzdHJjbXAocHRyLCAibm8iKSkgeworIAkJCXZhbCA9IDA7CisJCQlwdHIgKz0gMjsKKwkJfSBlbHNlCisJCQl2YWwgPSBzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDApOworCisJCXN3aXRjaCAoKHRva2UgPSBxbGExMjgwX2dldF90b2tlbihjcCkpKSB7CisJCWNhc2UgVE9LRU5fTlZSQU06CisJCQlpZiAoIXZhbCkKKwkJCQlkcml2ZXJfc2V0dXAubm9fbnZyYW0gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgVE9LRU5fU1lOQzoKKwkJCWlmICghdmFsKQorCQkJCWRyaXZlcl9zZXR1cC5ub19zeW5jID0gMTsKKwkJCWVsc2UgaWYgKHZhbCAhPSAweDEwMDAwKQorCQkJCWRyaXZlcl9zZXR1cC5zeW5jX21hc2sgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBUT0tFTl9XSURFOgorCQkJaWYgKCF2YWwpCisJCQkJZHJpdmVyX3NldHVwLm5vX3dpZGUgPSAxOworCQkJZWxzZSBpZiAodmFsICE9IDB4MTAwMDApCisJCQkJZHJpdmVyX3NldHVwLndpZGVfbWFzayA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIFRPS0VOX1BQUjoKKwkJCWlmICghdmFsKQorCQkJCWRyaXZlcl9zZXR1cC5ub19wcHIgPSAxOworCQkJZWxzZSBpZiAodmFsICE9IDB4MTAwMDApCisJCQkJZHJpdmVyX3NldHVwLnBwcl9tYXNrID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgVE9LRU5fVkVSQk9TRToKKwkJCXFsYTEyODBfdmVyYm9zZSA9IHZhbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogdW5rbm93biBib290IG9wdGlvbiAlc1xuIiwKKwkJCSAgICAgICBjcCk7CisJCX0KKworCQljcCA9IHN0cmNocihwdHIsICc7Jyk7CisJCWlmIChjcCkKKwkJCWNwKys7CisJCWVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAorcWxhMTI4MF9nZXRfdG9rZW4oY2hhciAqc3RyKQoreworCWNoYXIgKnNlcDsKKwlsb25nIHJldCA9IC0xOworCWludCBpLCBsZW47CisKKwlsZW4gPSBzaXplb2Yoc2V0dXBfdG9rZW4pL3NpemVvZihzdHJ1Y3Qgc2V0dXBfdG9rZW5zKTsKKworCXNlcCA9IHN0cmNocihzdHIsICc6Jyk7CisKKwlpZiAoc2VwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKyl7CisKKwkJCWlmICghc3RybmNtcChzZXR1cF90b2tlbltpXS50b2tlbiwgc3RyLCAoc2VwIC0gc3RyKSkpIHsKKwkJCQlyZXQgPSAgc2V0dXBfdG9rZW5baV0udmFsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDYwMAorc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcWxhMTI4MF9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLnByb2NfbmFtZQkJPSAicWxhMTI4MCIsCisJLm5hbWUJCQk9ICJRbG9naWMgSVNQIDEyODAvMTIxNjAiLAorCS5pbmZvCQkJPSBxbGExMjgwX2luZm8sCisJLnNsYXZlX2NvbmZpZ3VyZQk9IHFsYTEyODBfc2xhdmVfY29uZmlndXJlLAorCS5xdWV1ZWNvbW1hbmQJCT0gcWxhMTI4MF9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBxbGExMjgwX2VoX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcj0gcWxhMTI4MF9laF9kZXZpY2VfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcWxhMTI4MF9laF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHFsYTEyODBfZWhfYWRhcHRlcl9yZXNldCwKKwkuYmlvc19wYXJhbQkJPSBxbGExMjgwX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IDB4ZmZmZmYsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNlbHNlCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHFsYTEyODBfZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gInFsYTEyODAiLAorCS5uYW1lCQkJPSAiUWxvZ2ljIElTUCAxMjgwLzEyMTYwIiwKKwkuZGV0ZWN0CQkJPSBxbGExMjgwX2RldGVjdCwKKwkucmVsZWFzZQkJPSBxbGExMjgwX3JlbGVhc2UsCisJLmluZm8JCQk9IHFsYTEyODBfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IHFsYTEyODBfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gcWxhMTI4MF9laF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXI9IHFsYTEyODBfZWhfZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHFsYTEyODBfZWhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJPSBxbGExMjgwX2VoX2FkYXB0ZXJfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gcWxhMTI4MF9iaW9zcGFyYW1fb2xkLAorCS5jYW5fcXVldWUJCT0gMHhmZmZmZiwKKwkudGhpc19pZAkJPSAtMSwKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnVzZV9uZXdfZWhfY29kZQk9IDEsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitxbGExMjgwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCBkZXZudW0gPSBpZC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHFsYV9ib2FyZHMgKmJkcCA9ICZxbDEyODBfYm9hcmRfdGJsW2Rldm51bV07CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKworCS8qIEJ5cGFzcyBhbGwgQU1JIFNVQlNZUyBWRU5ET1IgSURzICovCisJaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTUkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInFsYTEyODA6IFNraXBwaW5nIEFNSSBTdWJTeXMgVmVuZG9yIElEIENoaXBcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6ICVzIGZvdW5kIG9uIFBDSSBidXMgJWksIGRldiAlaVxuIiwKKwkgICAgICAgYmRwLT5uYW1lLCBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pKTsKKwkKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInFsYTEyODA6IEZhaWxlZCB0byBlbmFibGVkIHBjaSBkZXZpY2UsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnJvciA9IC1FTk9NRU07CisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcWxhMTI4MF9kcml2ZXJfdGVtcGxhdGUsIHNpemVvZigqaGEpKTsKKwlpZiAoIWhvc3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInFsYTEyODA6IEZhaWxlZCB0byByZWdpc3RlciBob3N0LCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycm9yX2Rpc2FibGVfZGV2aWNlOworCX0KKworCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KGhhLCAwLCBzaXplb2Yoc3RydWN0IHNjc2lfcWxhX2hvc3QpKTsKKworCWhhLT5wZGV2ID0gcGRldjsKKwloYS0+ZGV2bnVtID0gZGV2bnVtOwkvKiBzcGVjaWZpZXMgbWljcm9jb2RlIGxvYWQgYWRkcmVzcyAqLworCisjaWZkZWYgUUxBXzY0QklUX1BUUgorCWlmIChwY2lfc2V0X2RtYV9tYXNrKGhhLT5wZGV2LCAoZG1hX2FkZHJfdCkgfiAwVUxMKSkgeworCQlpZiAocGNpX3NldF9kbWFfbWFzayhoYS0+cGRldiwgMHhmZmZmZmZmZikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2koJWxpKTogVW5hYmxlIHRvIHNldCBhICIKKwkJCSAgICAgICAiIHN1aXRhYmxlIERNQSBtYXNrIC0gYWJvcmluZ1xuIiwgaGEtPmhvc3Rfbm8pOworCQkJZXJyb3IgPSAtRU5PREVWOworCQkJZ290byBlcnJvcl9mcmVlX2lycTsKKwkJfQorCX0gZWxzZQorCQlkcHJpbnRrKDIsICJzY3NpKCVsaSk6IDY0IEJpdCBQQ0kgQWRkcmVzc2luZyBFbmFibGVkXG4iLAorCQkJaGEtPmhvc3Rfbm8pOworI2Vsc2UKKwlpZiAocGNpX3NldF9kbWFfbWFzayhoYS0+cGRldiwgMHhmZmZmZmZmZikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSglbGkpOiBVbmFibGUgdG8gc2V0IGEgIgorCQkgICAgICAgIiBzdWl0YWJsZSBETUEgbWFzayAtIGFib3JpbmdcbiIsIGhhLT5ob3N0X25vKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX2ZyZWVfaXJxOworCX0KKyNlbmRpZgorCisJaGEtPnJlcXVlc3RfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJKChSRVFVRVNUX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihyZXF1ZXN0X3QpKSksCisJCQkmaGEtPnJlcXVlc3RfZG1hKTsKKwlpZiAoIWhhLT5yZXF1ZXN0X3JpbmcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogRmFpbGVkIHRvIGdldCByZXF1ZXN0IG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3JfcHV0X2hvc3Q7CisJfQorCisJaGEtPnJlc3BvbnNlX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChoYS0+cGRldiwKKwkJCSgoUkVTUE9OU0VfRU5UUllfQ05UICsgMSkgKiAoc2l6ZW9mKHN0cnVjdCByZXNwb25zZSkpKSwKKwkJCSZoYS0+cmVzcG9uc2VfZG1hKTsKKwlpZiAoIWhhLT5yZXNwb25zZV9yaW5nKSB7CisJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODA6IEZhaWxlZCB0byBnZXQgcmVzcG9uc2UgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcl9mcmVlX3JlcXVlc3RfcmluZzsKKwl9CisKKwloYS0+cG9ydHMgPSBiZHAtPm51bVBvcnRzOworCisJaGEtPmhvc3QgPSBob3N0OworCWhhLT5ob3N0X25vID0gaG9zdC0+aG9zdF9ubzsKKworCWhvc3QtPmlycSA9IHBkZXYtPmlycTsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IGJkcC0+bnVtUG9ydHMgLSAxOworCWhvc3QtPm1heF9sdW4gPSBNQVhfTFVOUyAtIDE7CisJaG9zdC0+bWF4X2lkID0gTUFYX1RBUkdFVFM7CisJaG9zdC0+bWF4X3NlY3RvcnMgPSAxMDI0OworCWhvc3QtPnVuaXF1ZV9pZCA9IGhvc3QtPmhvc3Rfbm87CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCAweDAyMDU0NQorCWhvc3QtPnNlbGVjdF9xdWV1ZV9kZXB0aHMgPSBxbGExMjgwX3NlbGVjdF9xdWV1ZV9kZXB0aDsKKyNlbmRpZgorCisJZXJyb3IgPSAtRU5PREVWOworCisjaWYgTUVNT1JZX01BUFBFRF9JTworCWhhLT5tbXBiYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDEpLAorCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMSkpOworCWlmICghaGEtPm1tcGJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogVW5hYmxlIHRvIG1hcCBJL08gbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcl9mcmVlX3Jlc3BvbnNlX3Jpbmc7CisJfQorCisJaG9zdC0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKWhhLT5tbXBiYXNlOworCWhhLT5pb2Jhc2UgPSAoc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqKWhhLT5tbXBiYXNlOworI2Vsc2UKKwlob3N0LT5pb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAwKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDB4ZmYsICJxbGExMjgwIikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicWxhMTI4MDogRmFpbGVkIHRvIHJlc2VydmUgaS9vIHJlZ2lvbiAiCisJCQkJICIweCUwNGx4LTB4JTA0bHggLSBhbHJlYWR5IGluIHVzZVxuIiwKKwkJICAgICAgIGhvc3QtPmlvX3BvcnQsIGhvc3QtPmlvX3BvcnQgKyAweGZmKTsKKwkJZ290byBlcnJvcl9mcmVlX3Jlc3BvbnNlX3Jpbmc7CisJfQorCisJaGEtPmlvYmFzZSA9IChzdHJ1Y3QgZGV2aWNlX3JlZyAqKWhvc3QtPmlvX3BvcnQ7CisjZW5kaWYKKworCUlOSVRfTElTVF9IRUFEKCZoYS0+ZG9uZV9xKTsKKworCS8qIERpc2FibGUgSVNQIGludGVycnVwdHMuICovCisJcWxhMTI4MF9kaXNhYmxlX2ludHJzKGhhKTsKKworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHFsYTEyODBfaW50cl9oYW5kbGVyLCBTQV9TSElSUSwKKwkJCQkicWxhMTI4MCIsIGhhKSkgeworCQlwcmludGsoInFsYTEyODAgOiBGYWlsZWQgdG8gcmVzZXJ2ZSBpbnRlcnJ1cHQgJWQgYWxyZWFkeSAiCisJCSAgICAgICAiaW4gdXNlXG4iLCBwZGV2LT5pcnEpOworCQlnb3RvIGVycm9yX3JlbGVhc2VfcmVnaW9uOworCX0KKworCS8qIGxvYWQgdGhlIEYvVywgcmVhZCBwYXJhbWF0ZXJzLCBhbmQgaW5pdCB0aGUgSC9XICovCisJaWYgKHFsYTEyODBfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJxbGExeDE2MDogRmFpbGVkIHRvIGluaXRpYWxpemUgYWRhcHRlclxuIik7CisJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CisJfQorCisJLyogc2V0IG91ciBob3N0IElEICAobmVlZCB0byBkbyBzb21ldGhpbmcgYWJvdXQgb3VyIHR3byBJRHMpICovCisJaG9zdC0+dGhpc19pZCA9IGhhLT5idXNfc2V0dGluZ3NbMF0uaWQ7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgwMjA2MDAKKwllcnJvciA9IHNjc2lfYWRkX2hvc3QoaG9zdCwgJnBkZXYtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX2Rpc2FibGVfYWRhcHRlcjsKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKyNlbHNlCisJc2NzaV9zZXRfcGNpX2RldmljZShob3N0LCBwZGV2KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gMHgwMjA2MDAKKyBlcnJvcl9kaXNhYmxlX2FkYXB0ZXI6CisJV1JUX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5pY3RybCwgMCk7CisjZW5kaWYKKyBlcnJvcl9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIGhhKTsKKyBlcnJvcl9yZWxlYXNlX3JlZ2lvbjoKKyNpZiBNRU1PUllfTUFQUEVEX0lPCisJaW91bm1hcChoYS0+bW1wYmFzZSk7CisjZWxzZQorCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDB4ZmYpOworI2VuZGlmCisgZXJyb3JfZnJlZV9yZXNwb25zZV9yaW5nOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsCisJCQkoKFJFU1BPTlNFX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihzdHJ1Y3QgcmVzcG9uc2UpKSksCisJCQloYS0+cmVzcG9uc2VfcmluZywgaGEtPnJlc3BvbnNlX2RtYSk7CisgZXJyb3JfZnJlZV9yZXF1ZXN0X3Jpbmc6CisJcGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwKKwkJCSgoUkVRVUVTVF9FTlRSWV9DTlQgKyAxKSAqIChzaXplb2YocmVxdWVzdF90KSkpLAorCQkJaGEtPnJlcXVlc3RfcmluZywgaGEtPnJlcXVlc3RfZG1hKTsKKyBlcnJvcl9wdXRfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworIGVycm9yX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBlcnJvcjoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0CitxbGExMjgwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKilob3N0LT5ob3N0ZGF0YTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDYwMAorCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisjZW5kaWYKKworCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+aWN0cmwsIDApOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBoYSk7CisKKyNpZiBNRU1PUllfTUFQUEVEX0lPCisJaW91bm1hcChoYS0+bW1wYmFzZSk7CisjZWxzZQorCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDB4ZmYpOworI2VuZGlmCisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJKChSRVFVRVNUX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihyZXF1ZXN0X3QpKSksCisJCQloYS0+cmVxdWVzdF9yaW5nLCBoYS0+cmVxdWVzdF9kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGEtPnBkZXYsCisJCQkoKFJFU1BPTlNFX0VOVFJZX0NOVCArIDEpICogKHNpemVvZihzdHJ1Y3QgcmVzcG9uc2UpKSksCisJCQloYS0+cmVzcG9uc2VfcmluZywgaGEtPnJlc3BvbnNlX2RtYSk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MDIwNjAwCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcWxhMTI4MF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJxbGExMjgwIiwKKwkuaWRfdGFibGUJPSBxbGExMjgwX3BjaV90YmwsCisJLnByb2JlCQk9IHFsYTEyODBfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocWxhMTI4MF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitxbGExMjgwX2luaXQodm9pZCkKK3sKKwlpZiAoc2l6ZW9mKHN0cnVjdCBzcmIpID4gc2l6ZW9mKHN0cnVjdCBzY3NpX3BvaW50ZXIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJxbGExMjgwOiBzdHJ1Y3Qgc3JiIHRvbyBiaWcsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgTU9EVUxFCisJLyoKKwkgKiBJZiB3ZSBhcmUgY2FsbGVkIGFzIGEgbW9kdWxlLCB0aGUgcWxhMTI4MCBwb2ludGVyIG1heSBub3QgYmUgbnVsbAorCSAqIGFuZCBpdCB3b3VsZCBwb2ludCB0byBvdXIgYm9vdHVwIHN0cmluZywganVzdCBsaWtlIG9uIHRoZSBsaWxvCisJICogY29tbWFuZCBsaW5lLiAgSUYgbm90IE5VTEwsIHRoZW4gcHJvY2VzcyB0aGlzIGNvbmZpZyBzdHJpbmcgd2l0aAorCSAqIHFsYTEyODBfc2V0dXAKKwkgKgorCSAqIEJvb3QgdGltZSBPcHRpb25zCisJICogVG8gYWRkIG9wdGlvbnMgYXQgYm9vdCB0aW1lIGFkZCBhIGxpbmUgdG8geW91ciBsaWxvLmNvbmYgZmlsZSBsaWtlOgorCSAqIGFwcGVuZD0icWxhMTI4MD12ZXJib3NlLG1heF90YWdzOnt7MjU1LDI1NSwyNTUsMjU1fSx7MjU1LDI1NSwyNTUsMjU1fX0iCisJICogd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlIGZpcnN0IGZvdXIgZGV2aWNlcyBvbiB0aGUgZmlyc3QgdHdvCisJICogY29udHJvbGxlcnMgYmVpbmcgc2V0IHRvIGEgdGFnZ2VkIHF1ZXVlIGRlcHRoIG9mIDMyLgorCSAqLworCWlmIChxbGExMjgwKQorCQlxbGExMjgwX3NldHVwKHFsYTEyODApOworI2VuZGlmCisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZxbGExMjgwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3FsYTEyODBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcWxhMTI4MF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocWxhMTI4MF9pbml0KTsKK21vZHVsZV9leGl0KHFsYTEyODBfZXhpdCk7CisKKyNlbHNlCisjIGRlZmluZSBkcml2ZXJfdGVtcGxhdGUgcWxhMTI4MF9kcml2ZXJfdGVtcGxhdGUKKyMgaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJRbG9naWMgJiBKZXMgU29yZW5zZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUWxvZ2ljIElTUCBTQ1NJIChxbGExeDgwL3FsYTF4MTYwKSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFFMQTEyODBfVkVSU0lPTik7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgYWxtb3N0IGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmggYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDVhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5oCkBAIC0wLDAgKzEsMTA5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorKgorKiBRTG9naWMgSVNQMTI4MCAoVWx0cmEyKSAvMTIxNjAgKFVsdHJhMykgU0NTSSBkcml2ZXIKKyogQ29weXJpZ2h0IChDKSAyMDAwIFFsb2dpYyBDb3Jwb3JhdGlvbgorKiAod3d3LnFsb2dpYy5jb20pCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqIGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJX1FMQTEyODBfSAorI2RlZmluZQlfUUxBMTI4MF9ICisKKy8qCisgKiBEYXRhIGJpdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBCSVRfMAkweDEKKyNkZWZpbmUgQklUXzEJMHgyCisjZGVmaW5lIEJJVF8yCTB4NAorI2RlZmluZSBCSVRfMwkweDgKKyNkZWZpbmUgQklUXzQJMHgxMAorI2RlZmluZSBCSVRfNQkweDIwCisjZGVmaW5lIEJJVF82CTB4NDAKKyNkZWZpbmUgQklUXzcJMHg4MAorI2RlZmluZSBCSVRfOAkweDEwMAorI2RlZmluZSBCSVRfOQkweDIwMAorI2RlZmluZSBCSVRfMTAJMHg0MDAKKyNkZWZpbmUgQklUXzExCTB4ODAwCisjZGVmaW5lIEJJVF8xMgkweDEwMDAKKyNkZWZpbmUgQklUXzEzCTB4MjAwMAorI2RlZmluZSBCSVRfMTQJMHg0MDAwCisjZGVmaW5lIEJJVF8xNQkweDgwMDAKKyNkZWZpbmUgQklUXzE2CTB4MTAwMDAKKyNkZWZpbmUgQklUXzE3CTB4MjAwMDAKKyNkZWZpbmUgQklUXzE4CTB4NDAwMDAKKyNkZWZpbmUgQklUXzE5CTB4ODAwMDAKKyNkZWZpbmUgQklUXzIwCTB4MTAwMDAwCisjZGVmaW5lIEJJVF8yMQkweDIwMDAwMAorI2RlZmluZSBCSVRfMjIJMHg0MDAwMDAKKyNkZWZpbmUgQklUXzIzCTB4ODAwMDAwCisjZGVmaW5lIEJJVF8yNAkweDEwMDAwMDAKKyNkZWZpbmUgQklUXzI1CTB4MjAwMDAwMAorI2RlZmluZSBCSVRfMjYJMHg0MDAwMDAwCisjZGVmaW5lIEJJVF8yNwkweDgwMDAwMDAKKyNkZWZpbmUgQklUXzI4CTB4MTAwMDAwMDAKKyNkZWZpbmUgQklUXzI5CTB4MjAwMDAwMDAKKyNkZWZpbmUgQklUXzMwCTB4NDAwMDAwMDAKKyNkZWZpbmUgQklUXzMxCTB4ODAwMDAwMDAKKworI2lmIE1FTU9SWV9NQVBQRURfSU8KKyNkZWZpbmUgUkRfUkVHX1dPUkQoYWRkcikJCXJlYWR3X3JlbGF4ZWQoYWRkcikKKyNkZWZpbmUgUkRfUkVHX1dPUkRfZG1hc3luYyhhZGRyKQlyZWFkdyhhZGRyKQorI2RlZmluZSBXUlRfUkVHX1dPUkQoYWRkciwgZGF0YSkJd3JpdGV3KGRhdGEsIGFkZHIpCisjZWxzZQkJCQkvKiBNRU1PUllfTUFQUEVEX0lPICovCisjZGVmaW5lIFJEX1JFR19XT1JEKGFkZHIpCQlpbncoKHVuc2lnbmVkIGxvbmcpYWRkcikKKyNkZWZpbmUgUkRfUkVHX1dPUkRfZG1hc3luYyhhZGRyKQlSRF9SRUdfV09SRChhZGRyKQorI2RlZmluZSBXUlRfUkVHX1dPUkQoYWRkciwgZGF0YSkJb3V0dyhkYXRhLCAodW5zaWduZWQgbG9uZylhZGRyKQorI2VuZGlmCQkJCS8qIE1FTU9SWV9NQVBQRURfSU8gKi8KKworLyoKKyAqIEhvc3QgYWRhcHRlciBkZWZhdWx0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIE1BWF9CVVNFUwkyCS8qIDIgKi8KKyNkZWZpbmUgTUFYX0JfQklUUwkxCisKKyNkZWZpbmUgTUFYX1RBUkdFVFMJMTYJLyogMTYgKi8KKyNkZWZpbmUgTUFYX1RfQklUUwk0CS8qIDQgKi8KKworI2RlZmluZSBNQVhfTFVOUwk4CS8qIDMyICovCisjZGVmaW5lIE1BWF9MX0JJVFMJMwkvKiA1ICovCisKKy8qCisgKiBXYXRjaGRvZyB0aW1lIHF1YW50dW0KKyAqLworI2RlZmluZSBRTEExMjgwX1dER19USU1FX1FVQU5UVU0JNQkvKiBJbiBzZWNvbmRzICovCisKKy8qIENvbW1hbmQgcmV0cnkgY291bnQgKDAtNjU1MzUpICovCisjZGVmaW5lIENPTU1BTkRfUkVUUllfQ09VTlQJCTI1NQorCisvKiBNYXhpbXVtIG91dHN0YW5kaW5nIGNvbW1hbmRzIGluIElTUCBxdWV1ZXMgKi8KKyNkZWZpbmUgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTCTUxMgorI2RlZmluZSBJTlZBTElEX0hBTkRMRQkJCShNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMgKyAyKQorCisvKiBJU1AgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZW50cnkgY291bnRzICgzNy02NTUzNSkgKi8KKyNkZWZpbmUgUkVRVUVTVF9FTlRSWV9DTlQJCTI1NiAvKiBOdW1iZXIgb2YgcmVxdWVzdCBlbnRyaWVzLiAqLworI2RlZmluZSBSRVNQT05TRV9FTlRSWV9DTlQJCTE2ICAvKiBOdW1iZXIgb2YgcmVzcG9uc2UgZW50cmllcy4gKi8KKworLyogTnVtYmVyIG9mIHNlZ21lbnRzIDEgLSA2NTUzNSAqLworI2RlZmluZSBTR19TRUdNRU5UUwkJCTMyICAvKiBDbWQgZW50cnkgKyA2IGNvbnRpbnVhdGlvbnMgKi8KKworLyoKKyAqIFNDU0kgUmVxdWVzdCBCbG9jayBzdHJ1Y3R1cmUgIChzcCkgIHRoYXQgaXMgcGxhY2VkCisgKiBvbiBjbWQtPlNDcCBsb2NhdGlvbiBvZiBldmVyeSBJL08KKyAqLworc3RydWN0IHNyYiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogKDgvMTYpIExVIHF1ZXVlICovCisJc3RydWN0IHNjc2lfY21uZCAqY21kOwkvKiAoNC84KSBTQ1NJIGNvbW1hbmQgYmxvY2sgKi8KKwkvKiBOT1RFOiB0aGUgc3AtPmNtZCB3aWxsIGJlIE5VTEwgd2hlbiB0aGlzIGNvbXBsZXRpb24gaXMKKwkgKiBjYWxsZWQsIHNvIHlvdSBzaG91bGQga25vdyB0aGUgc2NzaV9jbW5kIHdoZW4gdXNpbmcgdGhpcyAqLworCXN0cnVjdCBjb21wbGV0aW9uICp3YWl0OworCWRtYV9hZGRyX3Qgc2F2ZWRfZG1hX2hhbmRsZTsJLyogZm9yIHVubWFwIG9mIHNpbmdsZSB0cmFuc2ZlcnMgKi8KKwl1aW50OF90IGZsYWdzOwkJLyogKDEpIFN0YXR1cyBmbGFncy4gKi8KKwl1aW50OF90IGRpcjsJCS8qIGRpcmVjdGlvbiBvZiB0cmFuc2ZlciAqLworfTsKKworLyoKKyAqIFNSQiBmbGFnIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgU1JCX1RJTUVPVVQJCSgxIDw8IDApCS8qIENvbW1hbmQgdGltZWQgb3V0ICovCisjZGVmaW5lIFNSQl9TRU5UCQkoMSA8PCAxKQkvKiBDb21tYW5kIHNlbnQgdG8gSVNQICovCisjZGVmaW5lIFNSQl9BQk9SVF9QRU5ESU5HCSgxIDw8IDIpCS8qIENvbW1hbmQgYWJvcnQgc2VudCB0byBkZXZpY2UgKi8KKyNkZWZpbmUgU1JCX0FCT1JURUQJCSgxIDw8IDMpCS8qIENvbW1hbmQgYWJvcnRlZCBjb21tYW5kIGFscmVhZHkgKi8KKworLyoKKyAqICBJU1AgSS9PIFJlZ2lzdGVyIFNldCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCisgKi8KK3N0cnVjdCBkZXZpY2VfcmVnIHsKKwl1aW50MTZfdCBpZF9sOwkJLyogSUQgbG93ICovCisJdWludDE2X3QgaWRfaDsJCS8qIElEIGhpZ2ggKi8KKwl1aW50MTZfdCBjZmdfMDsJCS8qIENvbmZpZ3VyYXRpb24gMCAqLworI2RlZmluZSBJU1BfQ0ZHMF9IV01TSyAgIDB4MDAwZgkvKiBIYXJkd2FyZSByZXZpc2lvbiBtYXNrICovCisjZGVmaW5lIElTUF9DRkcwXzEwMjAgICAgQklUXzAJLyogSVNQMTAyMCAqLworI2RlZmluZSBJU1BfQ0ZHMF8xMDIwQQkgQklUXzEJLyogSVNQMTAyMEEgKi8KKyNkZWZpbmUgSVNQX0NGRzBfMTA0MAkgQklUXzIJLyogSVNQMTA0MCAqLworI2RlZmluZSBJU1BfQ0ZHMF8xMDQwQQkgQklUXzMJLyogSVNQMTA0MEEgKi8KKyNkZWZpbmUgSVNQX0NGRzBfMTA0MEIJIEJJVF80CS8qIElTUDEwNDBCICovCisjZGVmaW5lIElTUF9DRkcwXzEwNDBDCSBCSVRfNQkvKiBJU1AxMDQwQyAqLworCXVpbnQxNl90IGNmZ18xOwkJLyogQ29uZmlndXJhdGlvbiAxICovCisjZGVmaW5lIElTUF9DRkcxX0YxMjggICAgQklUXzYgIC8qIDEyOC1ieXRlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lIElTUF9DRkcxX0Y2NCAgICAgQklUXzR8QklUXzUgLyogMTI4LWJ5dGUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgSVNQX0NGRzFfRjMyICAgICBCSVRfNSAgLyogMTI4LWJ5dGUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgSVNQX0NGRzFfRjE2ICAgICBCSVRfNCAgLyogMTI4LWJ5dGUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgSVNQX0NGRzFfQkVOQUIgICBCSVRfMiAgLyogR2xvYmFsIEJ1cyBidXJzdCBlbmFibGUgKi8KKyNkZWZpbmUgSVNQX0NGRzFfU1hQICAgICBCSVRfMCAgLyogU1hQIHJlZ2lzdGVyIHNlbGVjdCAqLworCXVpbnQxNl90IGljdHJsOwkJLyogSW50ZXJmYWNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgSVNQX1JFU0VUICAgICAgICBCSVRfMAkvKiBJU1Agc29mdCByZXNldCAqLworI2RlZmluZSBJU1BfRU5fSU5UICAgICAgIEJJVF8xCS8qIElTUCBlbmFibGUgaW50ZXJydXB0cy4gKi8KKyNkZWZpbmUgSVNQX0VOX1JJU0MgICAgICBCSVRfMgkvKiBJU1AgZW5hYmxlIFJJU0MgaW50ZXJydXB0cy4gKi8KKyNkZWZpbmUgSVNQX0ZMQVNIX0VOQUJMRSBCSVRfOAkvKiBGbGFzaCBCSU9TIFJlYWQvV3JpdGUgZW5hYmxlICovCisjZGVmaW5lIElTUF9GTEFTSF9VUFBFUiAgQklUXzkJLyogRmxhc2ggdXBwZXIgYmFuayBzZWxlY3QgKi8KKwl1aW50MTZfdCBpc3RhdHVzOwkvKiBJbnRlcmZhY2Ugc3RhdHVzICovCisjZGVmaW5lIFBDSV82NEJJVF9TTE9UICAgQklUXzE0CS8qIFBDSSA2NC1iaXQgc2xvdCBpbmRpY2F0b3IuICovCisjZGVmaW5lIFJJU0NfSU5UICAgICAgICAgQklUXzIJLyogUklTQyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUENJX0lOVCAgICAgICAgICBCSVRfMQkvKiBQQ0kgaW50ZXJydXB0ICovCisJdWludDE2X3Qgc2VtYXBob3JlOwkvKiBTZW1hcGhvcmUgKi8KKwl1aW50MTZfdCBudnJhbTsJCS8qIE5WUkFNIHJlZ2lzdGVyLiAqLworI2RlZmluZSBOVl9ERVNFTEVDVCAgICAgMAorI2RlZmluZSBOVl9DTE9DSyAgICAgICAgQklUXzAKKyNkZWZpbmUgTlZfU0VMRUNUICAgICAgIEJJVF8xCisjZGVmaW5lIE5WX0RBVEFfT1VUICAgICBCSVRfMgorI2RlZmluZSBOVl9EQVRBX0lOICAgICAgQklUXzMKKwl1aW50MTZfdCBmbGFzaF9kYXRhOwkvKiBGbGFzaCBCSU9TIGRhdGEgKi8KKwl1aW50MTZfdCBmbGFzaF9hZGRyZXNzOwkvKiBGbGFzaCBCSU9TIGFkZHJlc3MgKi8KKworCXVpbnQxNl90IHVudXNlZF8xWzB4MDZdOworCQorCS8qIGNkbWFfKiBhbmQgZGRtYV8qIGFyZSAxMDQwIG9ubHkgKi8KKwl1aW50MTZfdCBjZG1hX2NmZzsKKyNkZWZpbmUgQ0RNQV9DT05GX1NFTkFCICBCSVRfMwkvKiBTWFAgdG8gRE1BIERhdGEgZW5hYmxlICovCisjZGVmaW5lIENETUFfQ09ORl9SSVJRICAgQklUXzIJLyogUklTQyBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIENETUFfQ09ORl9CRU5BQiAgQklUXzEJLyogQnVzIGJ1cnN0IGVuYWJsZSAqLworI2RlZmluZSBDRE1BX0NPTkZfRElSICAgIEJJVF8wCS8qIERNQSBkaXJlY3Rpb24gKDA9Zmlmby0+aG9zdCAxPWhvc3QtPmZpZm8pICovCisJdWludDE2X3QgY2RtYV9jdHJsOyAKKwl1aW50MTZfdCBjZG1hX3N0YXR1czsgICAKKwl1aW50MTZfdCBjZG1hX2ZpZm9fc3RhdHVzOworCXVpbnQxNl90IGNkbWFfY291bnQ7CisJdWludDE2X3QgY2RtYV9yZXNlcnZlZDsKKwl1aW50MTZfdCBjZG1hX2FkZHJlc3NfY291bnRfMDsKKwl1aW50MTZfdCBjZG1hX2FkZHJlc3NfY291bnRfMTsKKwl1aW50MTZfdCBjZG1hX2FkZHJlc3NfY291bnRfMjsKKwl1aW50MTZfdCBjZG1hX2FkZHJlc3NfY291bnRfMzsKKworCXVpbnQxNl90IHVudXNlZF8yWzB4MDZdOworCisJdWludDE2X3QgZGRtYV9jZmc7CisjZGVmaW5lIERETUFfQ09ORl9TRU5BQiAgQklUXzMJLyogU1hQIHRvIERNQSBEYXRhIGVuYWJsZSAqLworI2RlZmluZSBERE1BX0NPTkZfUklSUSAgIEJJVF8yCS8qIFJJU0MgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBERE1BX0NPTkZfQkVOQUIgIEJJVF8xCS8qIEJ1cyBidXJzdCBlbmFibGUgKi8KKyNkZWZpbmUgRERNQV9DT05GX0RJUiAgICBCSVRfMAkvKiBETUEgZGlyZWN0aW9uICgwPWZpZm8tPmhvc3QgMT1ob3N0LT5maWZvKSAqLworCXVpbnQxNl90IGRkbWFfY3RybDsKKwl1aW50MTZfdCBkZG1hX3N0YXR1czsgCisJdWludDE2X3QgZGRtYV9maWZvX3N0YXR1czsKKwl1aW50MTZfdCBkZG1hX3hmZXJfY291bnRfbG93OworCXVpbnQxNl90IGRkbWFfeGZlcl9jb3VudF9oaWdoOworCXVpbnQxNl90IGRkbWFfYWRkcl9jb3VudF8wOworCXVpbnQxNl90IGRkbWFfYWRkcl9jb3VudF8xOworCXVpbnQxNl90IGRkbWFfYWRkcl9jb3VudF8yOworCXVpbnQxNl90IGRkbWFfYWRkcl9jb3VudF8zOyAKKworCXVpbnQxNl90IHVudXNlZF8zWzB4MGVdOworCisJdWludDE2X3QgbWFpbGJveDA7CS8qIE1haWxib3ggMCAqLworCXVpbnQxNl90IG1haWxib3gxOwkvKiBNYWlsYm94IDEgKi8KKwl1aW50MTZfdCBtYWlsYm94MjsJLyogTWFpbGJveCAyICovCisJdWludDE2X3QgbWFpbGJveDM7CS8qIE1haWxib3ggMyAqLworCXVpbnQxNl90IG1haWxib3g0OwkvKiBNYWlsYm94IDQgKi8KKwl1aW50MTZfdCBtYWlsYm94NTsJLyogTWFpbGJveCA1ICovCisJdWludDE2X3QgbWFpbGJveDY7CS8qIE1haWxib3ggNiAqLworCXVpbnQxNl90IG1haWxib3g3OwkvKiBNYWlsYm94IDcgKi8KKworCXVpbnQxNl90IHVudXNlZF80WzB4MjBdOy8qIDB4ODAtMHhiZiBHYXAgKi8KKworCXVpbnQxNl90IGhvc3RfY21kOwkvKiBIb3N0IGNvbW1hbmQgYW5kIGNvbnRyb2wgKi8KKyNkZWZpbmUgSE9TVF9JTlQgICAgICBCSVRfNwkvKiBob3N0IGludGVycnVwdCBiaXQgKi8KKyNkZWZpbmUgQklPU19FTkFCTEUgICBCSVRfMAorCisJdWludDE2X3QgdW51c2VkXzVbMHg1XTsJLyogMHhjMi0weGNiIEdhcCAqLworCisJdWludDE2X3QgZ3Bpb19kYXRhOworCXVpbnQxNl90IGdwaW9fZW5hYmxlOworCisJdWludDE2X3QgdW51c2VkXzZbMHgxMV07CS8qIGQwLWYwICovCisJdWludDE2X3Qgc2NzaUNvbnRyb2xQaW5zOwkvKiBmMiAqLworfTsKKworI2RlZmluZSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UCTgKKworLyoKKyAqICBJU1AgcHJvZHVjdCBpZGVudGlmaWNhdGlvbiBkZWZpbml0aW9ucyBpbiBtYWlsYm94ZXMgYWZ0ZXIgcmVzZXQuCisgKi8KKyNkZWZpbmUgUFJPRF9JRF8xCQkweDQ5NTMKKyNkZWZpbmUgUFJPRF9JRF8yCQkweDAwMDAKKyNkZWZpbmUgUFJPRF9JRF8yYQkJMHg1MDIwCisjZGVmaW5lIFBST0RfSURfMwkJMHgyMDIwCisjZGVmaW5lIFBST0RfSURfNAkJMHgxCisKKy8qCisgKiBJU1AgaG9zdCBjb21tYW5kIGFuZCBjb250cm9sIHJlZ2lzdGVyIGNvbW1hbmQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBIQ19SRVNFVF9SSVNDCQkweDEwMDAJLyogUmVzZXQgUklTQyAqLworI2RlZmluZSBIQ19QQVVTRV9SSVNDCQkweDIwMDAJLyogUGF1c2UgUklTQyAqLworI2RlZmluZSBIQ19SRUxFQVNFX1JJU0MJCTB4MzAwMAkvKiBSZWxlYXNlIFJJU0MgZnJvbSByZXNldC4gKi8KKyNkZWZpbmUgSENfU0VUX0hPU1RfSU5UCQkweDUwMDAJLyogU2V0IGhvc3QgaW50ZXJydXB0ICovCisjZGVmaW5lIEhDX0NMUl9IT1NUX0lOVAkJMHg2MDAwCS8qIENsZWFyIEhPU1QgaW50ZXJydXB0ICovCisjZGVmaW5lIEhDX0NMUl9SSVNDX0lOVAkJMHg3MDAwCS8qIENsZWFyIFJJU0MgaW50ZXJydXB0ICovCisjZGVmaW5lIEhDX0RJU0FCTEVfQklPUwkJMHg5MDAwCS8qIERpc2FibGUgQklPUy4gKi8KKworLyoKKyAqIElTUCBtYWlsYm94IFNlbGYtVGVzdCBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBNQlNfRlJNX0FMSVZFCQkwCS8qIEZpcm13YXJlIEFsaXZlLiAqLworI2RlZmluZSBNQlNfQ0hLU1VNX0VSUgkJMQkvKiBDaGVja3N1bSBFcnJvci4gKi8KKyNkZWZpbmUgTUJTX1NIQURPV19MRF9FUlIJMgkvKiBTaGFkb3cgTG9hZCBFcnJvci4gKi8KKyNkZWZpbmUgTUJTX0JVU1kJCTQJLyogQnVzeS4gKi8KKworLyoKKyAqIElTUCBtYWlsYm94IGNvbW1hbmQgY29tcGxldGUgc3RhdHVzIGNvZGVzCisgKi8KKyNkZWZpbmUgTUJTX0NNRF9DTVAJCTB4NDAwMAkvKiBDb21tYW5kIENvbXBsZXRlLiAqLworI2RlZmluZSBNQlNfSU5WX0NNRAkJMHg0MDAxCS8qIEludmFsaWQgQ29tbWFuZC4gKi8KKyNkZWZpbmUgTUJTX0hPU1RfSU5GX0VSUgkweDQwMDIJLyogSG9zdCBJbnRlcmZhY2UgRXJyb3IuICovCisjZGVmaW5lIE1CU19URVNUX0ZBSUxFRAkJMHg0MDAzCS8qIFRlc3QgRmFpbGVkLiAqLworI2RlZmluZSBNQlNfQ01EX0VSUgkJMHg0MDA1CS8qIENvbW1hbmQgRXJyb3IuICovCisjZGVmaW5lIE1CU19DTURfUEFSQU1fRVJSCTB4NDAwNgkvKiBDb21tYW5kIFBhcmFtZXRlciBFcnJvci4gKi8KKworLyoKKyAqIElTUCBtYWlsYm94IGFzeW5jaHJvbm91cyBldmVudCBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBNQkFfQVNZTkNfRVZFTlQJCTB4ODAwMAkvKiBBc3luY2hyb25vdXMgZXZlbnQuICovCisjZGVmaW5lIE1CQV9CVVNfUkVTRVQJCTB4ODAwMQkvKiBTQ1NJIEJ1cyBSZXNldC4gKi8KKyNkZWZpbmUgTUJBX1NZU1RFTV9FUlIJCTB4ODAwMgkvKiBTeXN0ZW0gRXJyb3IuICovCisjZGVmaW5lIE1CQV9SRVFfVFJBTlNGRVJfRVJSCTB4ODAwMwkvKiBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yLiAqLworI2RlZmluZSBNQkFfUlNQX1RSQU5TRkVSX0VSUgkweDgwMDQJLyogUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3IuICovCisjZGVmaW5lIE1CQV9XQUtFVVBfVEhSRVMJMHg4MDA1CS8qIFJlcXVlc3QgUXVldWUgV2FrZS11cC4gKi8KKyNkZWZpbmUgTUJBX1RJTUVPVVRfUkVTRVQJMHg4MDA2CS8qIEV4ZWN1dGlvbiBUaW1lb3V0IFJlc2V0LiAqLworI2RlZmluZSBNQkFfREVWSUNFX1JFU0VUCTB4ODAwNwkvKiBCdXMgRGV2aWNlIFJlc2V0LiAqLworI2RlZmluZSBNQkFfQlVTX01PREVfQ0hBTkdFCTB4ODAwRQkvKiBTQ1NJIGJ1cyBtb2RlIHRyYW5zaXRpb24uICovCisjZGVmaW5lIE1CQV9TQ1NJX0NPTVBMRVRJT04JMHg4MDIwCS8qIENvbXBsZXRpb24gcmVzcG9uc2UuICovCisKKy8qCisgKiBJU1AgbWFpbGJveCBjb21tYW5kcworICovCisjZGVmaW5lIE1CQ19OT1AJCQkJMAkvKiBObyBPcGVyYXRpb24gKi8KKyNkZWZpbmUgTUJDX0xPQURfUkFNCQkJMQkvKiBMb2FkIFJBTSAqLworI2RlZmluZSBNQkNfRVhFQ1VURV9GSVJNV0FSRQkJMgkvKiBFeGVjdXRlIGZpcm13YXJlICovCisjZGVmaW5lIE1CQ19EVU1QX1JBTQkJCTMJLyogRHVtcCBSQU0gY29udGVudHMgKi8KKyNkZWZpbmUgTUJDX1dSSVRFX1JBTV9XT1JECQk0CS8qIFdyaXRlIHJhbSB3b3JkICovCisjZGVmaW5lIE1CQ19SRUFEX1JBTV9XT1JECQk1CS8qIFJlYWQgcmFtIHdvcmQgKi8KKyNkZWZpbmUgTUJDX01BSUxCT1hfUkVHSVNURVJfVEVTVAk2CS8qIFdyYXAgaW5jb21pbmcgbWFpbGJveGVzICovCisjZGVmaW5lIE1CQ19WRVJJRllfQ0hFQ0tTVU0JCTcJLyogVmVyaWZ5IGNoZWNrc3VtICovCisjZGVmaW5lIE1CQ19BQk9VVF9GSVJNV0FSRQkJOAkvKiBHZXQgZmlybXdhcmUgcmV2aXNpb24gKi8KKyNkZWZpbmUgTUJDX0lOSVRfUkVRVUVTVF9RVUVVRQkJMHgxMAkvKiBJbml0aWFsaXplIHJlcXVlc3QgcXVldWUgKi8KKyNkZWZpbmUgTUJDX0lOSVRfUkVTUE9OU0VfUVVFVUUJCTB4MTEJLyogSW5pdGlhbGl6ZSByZXNwb25zZSBxdWV1ZSAqLworI2RlZmluZSBNQkNfRVhFQ1VURV9JT0NCCQkweDEyCS8qIEV4ZWN1dGUgSU9DQiBjb21tYW5kICovCisjZGVmaW5lIE1CQ19BQk9SVF9DT01NQU5ECQkweDE1CS8qIEFib3J0IElPQ0IgY29tbWFuZCAqLworI2RlZmluZSBNQkNfQUJPUlRfREVWSUNFCQkweDE2CS8qIEFib3J0IGRldmljZSAoSUQvTFVOKSAqLworI2RlZmluZSBNQkNfQUJPUlRfVEFSR0VUCQkweDE3CS8qIEFib3J0IHRhcmdldCAoSUQpICovCisjZGVmaW5lIE1CQ19CVVNfUkVTRVQJCQkweDE4CS8qIFNDU0kgYnVzIHJlc2V0ICovCisjZGVmaW5lIE1CQ19HRVRfUkVUUllfQ09VTlQJCTB4MjIJLyogR2V0IHJldHJ5IGNvdW50IGFuZCBkZWxheSAqLworI2RlZmluZSBNQkNfR0VUX1RBUkdFVF9QQVJBTUVURVJTCTB4MjgJLyogR2V0IHRhcmdldCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1CQ19TRVRfSU5JVElBVE9SX0lECQkweDMwCS8qIFNldCBpbml0aWF0b3IgU0NTSSBJRCAqLworI2RlZmluZSBNQkNfU0VUX1NFTEVDVElPTl9USU1FT1VUCTB4MzEJLyogU2V0IHNlbGVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lIE1CQ19TRVRfUkVUUllfQ09VTlQJCTB4MzIJLyogU2V0IHJldHJ5IGNvdW50IGFuZCBkZWxheSAqLworI2RlZmluZSBNQkNfU0VUX1RBR19BR0VfTElNSVQJCTB4MzMJLyogU2V0IHRhZyBhZ2UgbGltaXQgKi8KKyNkZWZpbmUgTUJDX1NFVF9DTE9DS19SQVRFCQkweDM0CS8qIFNldCBjbG9jayByYXRlICovCisjZGVmaW5lIE1CQ19TRVRfQUNUSVZFX05FR0FUSU9OCQkweDM1CS8qIFNldCBhY3RpdmUgbmVnYXRpb24gc3RhdGUgKi8KKyNkZWZpbmUgTUJDX1NFVF9BU1lOQ19EQVRBX1NFVFVQCTB4MzYJLyogU2V0IGFzeW5jIGRhdGEgc2V0dXAgdGltZSAqLworI2RlZmluZSBNQkNfU0VUX1BDSV9DT05UUk9MCQkweDM3CS8qIFNldCBCVVMgY29udHJvbCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1CQ19TRVRfVEFSR0VUX1BBUkFNRVRFUlMJMHgzOAkvKiBTZXQgdGFyZ2V0IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUJDX1NFVF9ERVZJQ0VfUVVFVUUJCTB4MzkJLyogU2V0IGRldmljZSBxdWV1ZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1CQ19TRVRfUkVTRVRfREVMQVlfUEFSQU1FVEVSUwkweDNBCS8qIFNldCByZXNldCBkZWxheSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1CQ19TRVRfU1lTVEVNX1BBUkFNRVRFUgkweDQ1CS8qIFNldCBzeXN0ZW0gcGFyYW1ldGVyIHdvcmQgKi8KKyNkZWZpbmUgTUJDX1NFVF9GSVJNV0FSRV9GRUFUVVJFUwkweDRBCS8qIFNldCBmaXJtd2FyZSBmZWF0dXJlIHdvcmQgKi8KKyNkZWZpbmUgTUJDX0lOSVRfUkVRVUVTVF9RVUVVRV9BNjQJMHg1MgkvKiBJbml0aWFsaXplIHJlcXVlc3QgcXVldWUgQTY0ICovCisjZGVmaW5lIE1CQ19JTklUX1JFU1BPTlNFX1FVRVVFX0E2NAkweDUzCS8qIEluaXRpYWxpemUgcmVzcG9uc2UgcSBBNjQgKi8KKyNkZWZpbmUgTUJDX0VOQUJMRV9UQVJHRVRfTU9ERQkJMHg1NQkvKiBFbmFibGUgdGFyZ2V0IG1vZGUgKi8KKyNkZWZpbmUgTUJDX1NFVF9EQVRBX09WRVJSVU5fUkVDT1ZFUlkJMHg1QQkvKiBTZXQgZGF0YSBvdmVycnVuIHJlY292ZXJ5IG1vZGUgKi8KKworLyoKKyAqIElTUCBHZXQvU2V0IFRhcmdldCBQYXJhbWV0ZXJzIG1haWxib3ggY29tbWFuZCBjb250cm9sIGZsYWdzLgorICovCisjZGVmaW5lIFRQX1BQUgkJCUJJVF81CS8qIFBQUiAqLworI2RlZmluZSBUUF9SRU5FR09USUFURQkJQklUXzgJLyogUmVuZWdvdGlhdGUgb24gZXJyb3IuICovCisjZGVmaW5lIFRQX1NUT1BfUVVFVUUgICAgICAgICAgIEJJVF85CS8qIFN0b3AgcXVlIG9uIGNoZWNrIGNvbmRpdGlvbiAqLworI2RlZmluZSBUUF9BVVRPX1JFUVVFU1RfU0VOU0UgICBCSVRfMTAJLyogQXV0b21hdGljIHJlcXVlc3Qgc2Vuc2UuICovCisjZGVmaW5lIFRQX1RBR0dFRF9RVUVVRSAgICAgICAgIEJJVF8xMQkvKiBUYWdnZWQgcXVldWluZy4gKi8KKyNkZWZpbmUgVFBfU1lOQyAgICAgICAgICAgICAgICAgQklUXzEyCS8qIFN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzLiAqLworI2RlZmluZSBUUF9XSURFICAgICAgICAgICAgICAgICBCSVRfMTMJLyogV2lkZSBkYXRhIHRyYW5zZmVycy4gKi8KKyNkZWZpbmUgVFBfUEFSSVRZICAgICAgICAgICAgICAgQklUXzE0CS8qIFBhcml0eSBjaGVja2luZy4gKi8KKyNkZWZpbmUgVFBfRElTQ09OTkVDVCAgICAgICAgICAgQklUXzE1CS8qIERpc2Nvbm5lY3QgcHJpdmlsZWdlLiAqLworCisvKgorICogTlZSQU0gQ29tbWFuZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgTlZfU1RBUlRfQklUCQlCSVRfMgorI2RlZmluZSBOVl9XUklURV9PUAkJKEJJVF8yNiB8IEJJVF8yNCkKKyNkZWZpbmUgTlZfUkVBRF9PUAkJKEJJVF8yNiB8IEJJVF8yNSkKKyNkZWZpbmUgTlZfRVJBU0VfT1AJCShCSVRfMjYgfCBCSVRfMjUgfCBCSVRfMjQpCisjZGVmaW5lIE5WX01BU0tfT1AJCShCSVRfMjYgfCBCSVRfMjUgfCBCSVRfMjQpCisjZGVmaW5lIE5WX0RFTEFZX0NPVU5UCQkxMAorCisvKgorICogIFFMb2dpYyBJU1AxMjgwL0lTUDEyMTYwIE5WUkFNIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgbnZyYW0geworCXVpbnQ4X3QgaWQwOwkJLyogMCAqLworCXVpbnQ4X3QgaWQxOwkJLyogMSAqLworCXVpbnQ4X3QgaWQyOwkJLyogMiAqLworCXVpbnQ4X3QgaWQzOwkJLyogMyAqLworCXVpbnQ4X3QgdmVyc2lvbjsJLyogNCAqLworCisJc3RydWN0IHsKKwkJdWludDhfdCBiaW9zX2NvbmZpZ3VyYXRpb25fbW9kZToyOworCQl1aW50OF90IGJpb3NfZGlzYWJsZToxOworCQl1aW50OF90IHNlbGVjdGFibGVfc2NzaV9ib290X2VuYWJsZToxOworCQl1aW50OF90IGNkX3JvbV9ib290X2VuYWJsZToxOworCQl1aW50OF90IGRpc2FibGVfbG9hZGluZ19yaXNjX2NvZGU6MTsKKwkJdWludDhfdCBlbmFibGVfNjRiaXRfYWRkcmVzc2luZzoxOworCQl1aW50OF90IHVudXNlZF83OjE7CisJfSBjbnRyX2ZsYWdzXzE7CQkvKiA1ICovCisKKwlzdHJ1Y3QgeworCQl1aW50OF90IGJvb3RfbHVuX251bWJlcjo1OworCQl1aW50OF90IHNjc2lfYnVzX251bWJlcjoxOworCQl1aW50OF90IHVudXNlZF82OjE7CisJCXVpbnQ4X3QgdW51c2VkXzc6MTsKKwl9IGNudHJfZmxhZ3NfMmw7CS8qIDcgKi8KKworCXN0cnVjdCB7CisJCXVpbnQ4X3QgYm9vdF90YXJnZXRfbnVtYmVyOjQ7CisJCXVpbnQ4X3QgdW51c2VkXzEyOjE7CisJCXVpbnQ4X3QgdW51c2VkXzEzOjE7CisJCXVpbnQ4X3QgdW51c2VkXzE0OjE7CisJCXVpbnQ4X3QgdW51c2VkXzE1OjE7CisJfSBjbnRyX2ZsYWdzXzJoOwkvKiA4ICovCisKKwl1aW50MTZfdCB1bnVzZWRfODsJLyogOCwgOSAqLworCXVpbnQxNl90IHVudXNlZF8xMDsJLyogMTAsIDExICovCisJdWludDE2X3QgdW51c2VkXzEyOwkvKiAxMiwgMTMgKi8KKwl1aW50MTZfdCB1bnVzZWRfMTQ7CS8qIDE0LCAxNSAqLworCisJdW5pb24geworCQl1aW50OF90IGM7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IHJlc2VydmVkOjI7CisJCQl1aW50OF90IGJ1cnN0X2VuYWJsZToxOworCQkJdWludDhfdCByZXNlcnZlZF8xOjE7CisJCQl1aW50OF90IGZpZm9fdGhyZXNob2xkOjQ7CisJCX0gZjsKKwl9IGlzcF9jb25maWc7CQkvKiAxNiAqLworCisJLyogVGVybWluYXRpb24KKwkgKiAwID0gRGlzYWJsZSwgMSA9IGhpZ2ggb25seSwgMyA9IEF1dG8gdGVybQorCSAqLworCXVuaW9uIHsKKwkJdWludDhfdCBjOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBzY3NpX2J1c18xX2NvbnRyb2w6MjsKKwkJCXVpbnQ4X3Qgc2NzaV9idXNfMF9jb250cm9sOjI7CisJCQl1aW50OF90IHVudXNlZF8wOjE7CisJCQl1aW50OF90IHVudXNlZF8xOjE7CisJCQl1aW50OF90IHVudXNlZF8yOjE7CisJCQl1aW50OF90IGF1dG9fdGVybV9zdXBwb3J0OjE7CisJCX0gZjsKKwl9IHRlcm1pbmF0aW9uOwkJLyogMTcgKi8KKworCXVpbnQxNl90IGlzcF9wYXJhbWV0ZXI7CS8qIDE4LCAxOSAqLworCisJdW5pb24geworCQl1aW50MTZfdCB3OworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgZW5hYmxlX2Zhc3RfcG9zdGluZzoxOworCQkJdWludDE2X3QgcmVwb3J0X2x2ZF9idXNfdHJhbnNpdGlvbjoxOworCQkJdWludDE2X3QgdW51c2VkXzI6MTsKKwkJCXVpbnQxNl90IHVudXNlZF8zOjE7CisJCQl1aW50MTZfdCBkaXNhYmxlX2lvc2JzX3dpdGhfYnVzX3Jlc2V0X3N0YXR1czoxOworCQkJdWludDE2X3QgZGlzYWJsZV9zeW5jaHJvbm91c19iYWNrb2ZmOjE7CisJCQl1aW50MTZfdCB1bnVzZWRfNjoxOworCQkJdWludDE2X3Qgc3luY2hyb25vdXNfYmFja29mZl9yZXBvcnRpbmc6MTsKKwkJCXVpbnQxNl90IGRpc2FibGVfcmVzZWxlY3Rpb25fZmFpcm5lc3M6MTsKKwkJCXVpbnQxNl90IHVudXNlZF85OjE7CisJCQl1aW50MTZfdCB1bnVzZWRfMTA6MTsKKwkJCXVpbnQxNl90IHVudXNlZF8xMToxOworCQkJdWludDE2X3QgdW51c2VkXzEyOjE7CisJCQl1aW50MTZfdCB1bnVzZWRfMTM6MTsKKwkJCXVpbnQxNl90IHVudXNlZF8xNDoxOworCQkJdWludDE2X3QgdW51c2VkXzE1OjE7CisJCX0gZjsKKwl9IGZpcm13YXJlX2ZlYXR1cmU7CS8qIDIwLCAyMSAqLworCisJdWludDE2X3QgdW51c2VkXzIyOwkvKiAyMiwgMjMgKi8KKworCXN0cnVjdCB7CisJCXN0cnVjdCB7CisJCQl1aW50OF90IGluaXRpYXRvcl9pZDo0OworCQkJdWludDhfdCBzY3NpX3Jlc2V0X2Rpc2FibGU6MTsKKwkJCXVpbnQ4X3Qgc2NzaV9idXNfc2l6ZToxOworCQkJdWludDhfdCBzY3NpX2J1c190eXBlOjE7CisJCQl1aW50OF90IHVudXNlZF83OjE7CisJCX0gY29uZmlnXzE7CS8qIDI0ICovCisKKwkJdWludDhfdCBidXNfcmVzZXRfZGVsYXk7CS8qIDI1ICovCisJCXVpbnQ4X3QgcmV0cnlfY291bnQ7CS8qIDI2ICovCisJCXVpbnQ4X3QgcmV0cnlfZGVsYXk7CS8qIDI3ICovCisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgYXN5bmNfZGF0YV9zZXR1cF90aW1lOjQ7CisJCQl1aW50OF90IHJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uOjE7CisJCQl1aW50OF90IGRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb246MTsKKwkJCXVpbnQ4X3QgdW51c2VkXzY6MTsKKwkJCXVpbnQ4X3QgdW51c2VkXzc6MTsKKwkJfSBjb25maWdfMjsJLyogMjggKi8KKworCQl1aW50OF90IHVudXNlZF8yOTsJLyogMjkgKi8KKworCQl1aW50MTZfdCBzZWxlY3Rpb25fdGltZW91dDsJLyogMzAsIDMxICovCisJCXVpbnQxNl90IG1heF9xdWV1ZV9kZXB0aDsJLyogMzIsIDMzICovCisKKwkJdWludDE2X3QgdW51c2VkXzM0OwkvKiAzNCwgMzUgKi8KKwkJdWludDE2X3QgdW51c2VkXzM2OwkvKiAzNiwgMzcgKi8KKwkJdWludDE2X3QgdW51c2VkXzM4OwkvKiAzOCwgMzkgKi8KKworCQlzdHJ1Y3QgeworCQkJdW5pb24geworCQkJCXVpbnQ4X3QgYzsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1aW50OF90IHJlbmVnb3RpYXRlX29uX2Vycm9yOjE7CisJCQkJCXVpbnQ4X3Qgc3RvcF9xdWV1ZV9vbl9jaGVjazoxOworCQkJCQl1aW50OF90IGF1dG9fcmVxdWVzdF9zZW5zZToxOworCQkJCQl1aW50OF90IHRhZ19xdWV1aW5nOjE7CisJCQkJCXVpbnQ4X3QgZW5hYmxlX3N5bmM6MTsKKwkJCQkJdWludDhfdCBlbmFibGVfd2lkZToxOworCQkJCQl1aW50OF90IHBhcml0eV9jaGVja2luZzoxOworCQkJCQl1aW50OF90IGRpc2Nvbm5lY3RfYWxsb3dlZDoxOworCQkJCX0gZjsKKwkJCX0gcGFyYW1ldGVyOwkvKiA0MCAqLworCisJCQl1aW50OF90IGV4ZWN1dGlvbl90aHJvdHRsZTsJLyogNDEgKi8KKwkJCXVpbnQ4X3Qgc3luY19wZXJpb2Q7CS8qIDQyICovCisKKwkJCXVuaW9uIHsJCS8qIDQzICovCisJCQkJdWludDhfdCBmbGFnc180MzsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1aW50OF90IHN5bmNfb2Zmc2V0OjQ7CisJCQkJCXVpbnQ4X3QgZGV2aWNlX2VuYWJsZToxOworCQkJCQl1aW50OF90IGx1bl9kaXNhYmxlOjE7CisJCQkJCXVpbnQ4X3QgdW51c2VkXzY6MTsKKwkJCQkJdWludDhfdCB1bnVzZWRfNzoxOworCQkJCX0gZmxhZ3MxeDgwOworCQkJCXN0cnVjdCB7CisJCQkJCXVpbnQ4X3Qgc3luY19vZmZzZXQ6NTsKKwkJCQkJdWludDhfdCBkZXZpY2VfZW5hYmxlOjE7CisJCQkJCXVpbnQ4X3QgdW51c2VkXzY6MTsKKwkJCQkJdWludDhfdCB1bnVzZWRfNzoxOworCQkJCX0gZmxhZ3MxeDE2MDsKKwkJCX0gZmxhZ3M7CisJCQl1bmlvbiB7CS8qIFBQUiBmbGFncyBmb3IgdGhlIDF4MTYwIGNvbnRyb2xsZXJzICovCisJCQkJdWludDhfdCB1bnVzZWRfNDQ7CisJCQkJc3RydWN0IHsKKwkJCQkJdWludDhfdCBwcHJfb3B0aW9uczo0OworCQkJCQl1aW50OF90IHBwcl9idXNfd2lkdGg6MjsKKwkJCQkJdWludDhfdCB1bnVzZWRfODoxOworCQkJCQl1aW50OF90IGVuYWJsZV9wcHI6MTsKKwkJCQl9IGZsYWdzOwkvKiA0NCAqLworCQkJfSBwcHJfMXgxNjA7CisJCQl1aW50OF90IHVudXNlZF80NTsJLyogNDUgKi8KKwkJfSB0YXJnZXRbTUFYX1RBUkdFVFNdOworCX0gYnVzW01BWF9CVVNFU107CisKKwl1aW50MTZfdCB1bnVzZWRfMjQ4OwkvKiAyNDgsIDI0OSAqLworCisJdWludDE2X3Qgc3Vic3lzdGVtX2lkWzJdOwkvKiAyNTAsIDI1MSwgMjUyLCAyNTMgKi8KKworCXVuaW9uIHsJCQkJLyogMjU0ICovCisJCXVpbnQ4X3QgdW51c2VkXzI1NDsKKwkJdWludDhfdCBzeXN0ZW1faWRfcG9pbnRlcjsKKwl9IHN5c2lkXzF4MTYwOworCisJdWludDhfdCBjaGtzdW07CQkvKiAyNTUgKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBjb21tYW5kIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIE1BWF9DTURTWgkxMgkJLyogU0NTSSBtYXhpbXVtIENEQiBzaXplLiAqLworc3RydWN0IGNtZF9lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQ09NTUFORF9UWVBFICAgIDEJCS8qIENvbW1hbmQgZW50cnkgKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50OF90IGx1bjsJCQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgdGFyZ2V0OwkJCS8qIFNDU0kgSUQgKi8KKwl1aW50MTZfdCBjZGJfbGVuOwkJLyogU0NTSSBjb21tYW5kIGxlbmd0aC4gKi8KKwl1aW50MTZfdCBjb250cm9sX2ZsYWdzOwkJLyogQ29udHJvbCBmbGFncy4gKi8KKwl1aW50MTZfdCByZXNlcnZlZDsKKwl1aW50MTZfdCB0aW1lb3V0OwkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CQkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJdWludDhfdCBzY3NpX2NkYltNQVhfQ01EU1pdOwkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18zX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBjb250aW51YXRpb24gZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBjb250X2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBDT05USU5VRV9UWVBFICAgMgkJLyogQ29udGludWF0aW9uIGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZDsJCS8qIFJlc2VydmVkICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18zX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzRfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzRfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfNV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgNSBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfNV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNSBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ182X2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCA2IGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ182X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA2IGxlbmd0aC4gKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBzdGF0dXMgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCByZXNwb25zZSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBTVEFUVVNfVFlQRSAgICAgMwkvKiBTdGF0dXMgZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworI2RlZmluZSBSRl9DT05UICAgICAgICAgQklUXzAJLyogQ29udGludWF0aW9uLiAqLworI2RlZmluZSBSRl9GVUxMICAgICAgICAgQklUXzEJLyogRnVsbCAqLworI2RlZmluZSBSRl9CQURfSEVBREVSICAgQklUXzIJLyogQmFkIGhlYWRlci4gKi8KKyNkZWZpbmUgUkZfQkFEX1BBWUxPQUQgIEJJVF8zCS8qIEJhZCBwYXlsb2FkLiAqLworCXVpbnQzMl90IGhhbmRsZTsJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50MTZfdCBzY3NpX3N0YXR1czsJLyogU0NTSSBzdGF0dXMuICovCisJdWludDE2X3QgY29tcF9zdGF0dXM7CS8qIENvbXBsZXRpb24gc3RhdHVzLiAqLworCXVpbnQxNl90IHN0YXRlX2ZsYWdzOwkvKiBTdGF0ZSBmbGFncy4gKi8KKyNkZWZpbmUgU0ZfVFJBTlNGRVJfQ01QTCBCSVRfMTQJLyogVHJhbnNmZXIgQ29tcGxldGUuICovCisjZGVmaW5lIFNGX0dPVF9TRU5TRSAgICBCSVRfMTMJLyogR290IFNlbnNlICovCisjZGVmaW5lIFNGX0dPVF9TVEFUVVMgICAgQklUXzEyCS8qIEdvdCBTdGF0dXMgKi8KKyNkZWZpbmUgU0ZfVFJBTlNGRVJSRURfREFUQSBCSVRfMTEJLyogVHJhbnNmZXJyZWQgZGF0YSAqLworI2RlZmluZSBTRl9TRU5UX0NEQiAgIEJJVF8xMAkvKiBTZW5kIENEQiAqLworI2RlZmluZSBTRl9HT1RfVEFSR0VUICBCSVRfOQkvKiAgKi8KKyNkZWZpbmUgU0ZfR09UX0JVUyAgICAgQklUXzgJLyogICovCisJdWludDE2X3Qgc3RhdHVzX2ZsYWdzOwkvKiBTdGF0dXMgZmxhZ3MuICovCisJdWludDE2X3QgdGltZTsJCS8qIFRpbWUuICovCisJdWludDE2X3QgcmVxX3NlbnNlX2xlbmd0aDsJLyogUmVxdWVzdCBzZW5zZSBkYXRhIGxlbmd0aC4gKi8KKwl1aW50MzJfdCByZXNpZHVhbF9sZW5ndGg7CS8qIFJlc2lkdWFsIHRyYW5zZmVyIGxlbmd0aC4gKi8KKwl1aW50MTZfdCByZXNlcnZlZFs0XTsKKwl1aW50OF90IHJlcV9zZW5zZV9kYXRhWzMyXTsJLyogUmVxdWVzdCBzZW5zZSBkYXRhLiAqLworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIG1hcmtlciBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IG1ya19lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBNQVJLRVJfVFlQRSAgICAgNAkvKiBNYXJrZXIgZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IHJlc2VydmVkOworCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IHRhcmdldDsJCS8qIFNDU0kgSUQgKi8KKwl1aW50OF90IG1vZGlmaWVyOwkvKiBNb2RpZmllciAoNy0wKS4gKi8KKyNkZWZpbmUgTUtfU1lOQ19JRF9MVU4gICAgICAwCS8qIFN5bmNocm9uaXplIElEL0xVTiAqLworI2RlZmluZSBNS19TWU5DX0lEICAgICAgICAgIDEJLyogU3luY2hyb25pemUgSUQgKi8KKyNkZWZpbmUgTUtfU1lOQ19BTEwgICAgICAgICAyCS8qIFN5bmNocm9uaXplIGFsbCBJRC9MVU4gKi8KKwl1aW50OF90IHJlc2VydmVkXzFbNTNdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIGV4dGVuZGVkIGNvbW1hbmQgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKgorICogVW51c2VkIGJ5IHRoZSBkcml2ZXIhCisgKi8KK3N0cnVjdCBlY21kX2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIEVYVEVOREVEX0NNRF9UWVBFICA1CS8qIEV4dGVuZGVkIGNvbW1hbmQgZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCisJdWludDhfdCB0YXJnZXQ7CQkvKiBTQ1NJIElEICovCisJdWludDE2X3QgY2RiX2xlbjsJLyogU0NTSSBjb21tYW5kIGxlbmd0aC4gKi8KKwl1aW50MTZfdCBjb250cm9sX2ZsYWdzOwkvKiBDb250cm9sIGZsYWdzLiAqLworCXVpbnQxNl90IHJlc2VydmVkOworCXVpbnQxNl90IHRpbWVvdXQ7CS8qIENvbW1hbmQgdGltZW91dC4gKi8KKwl1aW50MTZfdCBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJdWludDhfdCBzY3NpX2NkYls4OF07CS8qIFNDU0kgY29tbWFuZCB3b3Jkcy4gKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSA2NC1CaXQgYWRkcmVzc2luZywgY29tbWFuZCBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQ09NTUFORF9BNjRfVFlQRSA5CS8qIENvbW1hbmQgQTY0IGVudHJ5ICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl1aW50OF90IGx1bjsJCS8qIFNDU0kgTFVOICovCisJdWludDhfdCB0YXJnZXQ7CQkvKiBTQ1NJIElEICovCisJdWludDE2X3QgY2RiX2xlbjsJLyogU0NTSSBjb21tYW5kIGxlbmd0aC4gKi8KKwl1aW50MTZfdCBjb250cm9sX2ZsYWdzOwkvKiBDb250cm9sIGZsYWdzLiAqLworCXVpbnQxNl90IHJlc2VydmVkOworCXVpbnQxNl90IHRpbWVvdXQ7CS8qIENvbW1hbmQgdGltZW91dC4gKi8KKwl1aW50MTZfdCBkc2VnX2NvdW50OwkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJdWludDhfdCBzY3NpX2NkYltNQVhfQ01EU1pdOwkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMVsyXTsJLyogdW51c2VkICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KK30gY21kX2E2NF9lbnRyeV90LCByZXF1ZXN0X3Q7CisKKy8qCisgKiBJU1AgcXVldWUgLSA2NC1CaXQgYWRkcmVzc2luZywgY29udGludWF0aW9uIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgY29udF9hNjRfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQ09OVElOVUVfQTY0X1RZUEUgMHhBCS8qIENvbnRpbnVhdGlvbiBBNjQgZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18yX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18yX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzRfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzRfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgNCBsZW5ndGguICovCit9OworCisvKgorICogSVNQIHF1ZXVlIC0gZW5hYmxlIExVTiBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IGVsdW5fZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgRU5BQkxFX0xVTl9UWVBFIDB4QgkvKiBFbmFibGUgTFVOIGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzIG5vdCB1c2VkLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDE2X3QgbHVuOwkJLyogQml0IDE1IGlzIGJ1cyBudW1iZXIuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfNDsKKwl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCByZXNlcnZlZF81OworCXVpbnQ4X3QgY29tbWFuZF9jb3VudDsJLyogTnVtYmVyIG9mIEFUSU9zIGFsbG9jYXRlZC4gKi8KKwl1aW50OF90IGltbWVkX25vdGlmeV9jb3VudDsJLyogTnVtYmVyIG9mIEltbWVkaWF0ZSBOb3RpZnkgKi8KKwkvKiBlbnRyaWVzIGFsbG9jYXRlZC4gKi8KKwl1aW50OF90IGdyb3VwXzZfbGVuZ3RoOwkvKiBTQ1NJIENEQiBsZW5ndGggZm9yIGdyb3VwIDYgKi8KKwkvKiBjb21tYW5kcyAoMi0yNikuICovCisJdWludDhfdCBncm91cF83X2xlbmd0aDsJLyogU0NTSSBDREIgbGVuZ3RoIGZvciBncm91cCA3ICovCisJLyogY29tbWFuZHMgKDItMjYpLiAqLworCXVpbnQxNl90IHRpbWVvdXQ7CS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJdWludDE2X3QgcmVzZXJ2ZWRfNlsyMF07Cit9OworCisvKgorICogSVNQIHF1ZXVlIC0gbW9kaWZ5IExVTiBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqCisgKiBVbnVzZWQgYnkgdGhlIGRyaXZlciEKKyAqLworc3RydWN0IG1vZGlmeV9sdW5fZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgTU9ESUZZX0xVTl9UWVBFIDB4QwkvKiBNb2RpZnkgTFVOIGVudHJ5LiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKKwl1aW50OF90IG9wZXJhdG9yczsKKwl1aW50OF90IHJlc2VydmVkXzQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgcmVzZXJ2ZWRfNTsKKwl1aW50OF90IGNvbW1hbmRfY291bnQ7CS8qIE51bWJlciBvZiBBVElPcyBhbGxvY2F0ZWQuICovCisJdWludDhfdCBpbW1lZF9ub3RpZnlfY291bnQ7CS8qIE51bWJlciBvZiBJbW1lZGlhdGUgTm90aWZ5ICovCisJLyogZW50cmllcyBhbGxvY2F0ZWQuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfNjsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCXVpbnQxNl90IHJlc2VydmVkXzdbMjBdOworfTsKKworLyoKKyAqIElTUCBxdWV1ZSAtIGltbWVkaWF0ZSBub3RpZnkgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBub3RpZnlfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgSU1NRURfTk9USUZZX1RZUEUgMHhECS8qIEltbWVkaWF0ZSBub3RpZnkgZW50cnkuICovCisJdWludDhfdCBlbnRyeV9jb3VudDsJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCByZXNlcnZlZF8xOworCXVpbnQ4X3QgZW50cnlfc3RhdHVzOwkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgcmVzZXJ2ZWRfMjsKKwl1aW50OF90IGx1bjsKKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgcmVzZXJ2ZWRfNDsKKwl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KKwl1aW50OF90IHRhZ190eXBlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB0eXBlICovCisJLyogZW50cmllcyBhbGxvY2F0ZWQuICovCisJdWludDE2X3Qgc2VxX2lkOworCXVpbnQ4X3Qgc2NzaV9tc2dbOF07CS8qIFNDU0kgbWVzc2FnZSBub3QgaGFuZGxlZCBieSBJU1AgKi8KKwl1aW50MTZfdCByZXNlcnZlZF81WzhdOworCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07Cit9OworCisvKgorICogSVNQIHF1ZXVlIC0gbm90aWZ5IGFja25vd2xlZGdlIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgbmFja19lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBOT1RJRllfQUNLX1RZUEUgMHhFCS8qIE5vdGlmeSBhY2tub3dsZWRnZSBlbnRyeS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKKwl1aW50OF90IHRhcmdldF9pZDsKKwl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBldmVudDsKKwl1aW50MTZfdCBzZXFfaWQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfNFsyMl07Cit9OworCisvKgorICogSVNQIHF1ZXVlIC0gQWNjZXB0IFRhcmdldCBJL08gKEFUSU8pIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgYXRpb19lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBBQ0NFUFRfVEdUX0lPX1RZUEUgNgkvKiBBY2NlcHQgdGFyZ2V0IEkvTyBlbnRyeS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgY2RiX2xlbjsKKwl1aW50OF90IHRhcmdldF9pZDsKKwl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBzY3NpX3N0YXR1czsKKwl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KKwl1aW50OF90IHRhZ190eXBlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB0eXBlICovCisJdWludDhfdCBjZGJbMjZdOworCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07Cit9OworCisvKgorICogSVNQIHF1ZXVlIC0gQ29udGludWUgVGFyZ2V0IEkvTyAoQ1RJTykgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBjdGlvX2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIENPTlRJTlVFX1RHVF9JT19UWVBFIDcJLyogQ1RJTyBlbnRyeSAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKKwl1aW50OF90IHRhcmdldF9pZDsKKwl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBzY3NpX3N0YXR1czsKKwl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KKwl1aW50OF90IHRhZ190eXBlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB0eXBlICovCisJdWludDMyX3QgdHJhbnNmZXJfbGVuZ3RoOworCXVpbnQzMl90IHJlc2lkdWFsOworCXVpbnQxNl90IHRpbWVvdXQ7CS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQzMl90IGRzZWdfMF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18yX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18yX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDIgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfM19hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMyBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfM19sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBDVElPIHJldHVybmVkIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgY3Rpb19yZXRfZW50cnkgeworCXVpbnQ4X3QgZW50cnlfdHlwZTsJLyogRW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgQ1RJT19SRVRfVFlQRSAgIDcJLyogQ1RJTyByZXR1cm4gZW50cnkgKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBlbnRyeV9zdGF0dXM7CS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZF8yOworCXVpbnQ4X3QgbHVuOwkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IGluaXRpYXRvcl9pZDsKKwl1aW50OF90IHJlc2VydmVkXzM7CisJdWludDhfdCB0YXJnZXRfaWQ7CisJdWludDMyX3Qgb3B0aW9uX2ZsYWdzOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3Qgc2NzaV9zdGF0dXM7CisJdWludDhfdCB0YWdfdmFsdWU7CS8qIFJlY2VpdmVkIHF1ZXVlIHRhZyBtZXNzYWdlIHZhbHVlICovCisJdWludDhfdCB0YWdfdHlwZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdHlwZSAqLworCXVpbnQzMl90IHRyYW5zZmVyX2xlbmd0aDsKKwl1aW50MzJfdCByZXNpZHVhbDsKKwl1aW50MTZfdCB0aW1lb3V0OwkvKiAwID0gMzAgc2Vjb25kcywgMHhGRkZGID0gZGlzYWJsZSAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwl1aW50MzJfdCBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18xX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAxIGFkZHJlc3MuICovCisJdWludDE2X3QgZHNlZ18xX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQ4X3Qgc2Vuc2VfZGF0YVsxOF07Cit9OworCisvKgorICogSVNQIHF1ZXVlIC0gQ1RJTyBBNjQgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBjdGlvX2E2NF9lbnRyeSB7CisJdWludDhfdCBlbnRyeV90eXBlOwkvKiBFbnRyeSB0eXBlLiAqLworI2RlZmluZSBDVElPX0E2NF9UWVBFIDB4RgkvKiBDVElPIEE2NCBlbnRyeSAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKKwl1aW50OF90IHRhcmdldF9pZDsKKwl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBzY3NpX3N0YXR1czsKKwl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KKwl1aW50OF90IHRhZ190eXBlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB0eXBlICovCisJdWludDMyX3QgdHJhbnNmZXJfbGVuZ3RoOworCXVpbnQzMl90IHJlc2lkdWFsOworCXVpbnQxNl90IHRpbWVvdXQ7CS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQzMl90IHJlc2VydmVkXzRbMl07CisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KK307CisKKy8qCisgKiBJU1AgcXVldWUgLSBDVElPIHJldHVybmVkIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgY3Rpb19hNjRfcmV0X2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CS8qIEVudHJ5IHR5cGUuICovCisjZGVmaW5lIENUSU9fQTY0X1JFVF9UWVBFIDB4RgkvKiBDVElPIEE2NCByZXR1cm5lZCBlbnRyeSAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CS8qIEVudHJ5IGNvdW50LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTsKKwl1aW50OF90IGVudHJ5X3N0YXR1czsJLyogRW50cnkgU3RhdHVzLiAqLworCXVpbnQzMl90IHJlc2VydmVkXzI7CisJdWludDhfdCBsdW47CQkvKiBTQ1NJIExVTiAqLworCXVpbnQ4X3QgaW5pdGlhdG9yX2lkOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMzsKKwl1aW50OF90IHRhcmdldF9pZDsKKwl1aW50MzJfdCBvcHRpb25fZmxhZ3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBzY3NpX3N0YXR1czsKKwl1aW50OF90IHRhZ192YWx1ZTsJLyogUmVjZWl2ZWQgcXVldWUgdGFnIG1lc3NhZ2UgdmFsdWUgKi8KKwl1aW50OF90IHRhZ190eXBlOwkvKiBSZWNlaXZlZCBxdWV1ZSB0YWcgbWVzc2FnZSB0eXBlICovCisJdWludDMyX3QgdHJhbnNmZXJfbGVuZ3RoOworCXVpbnQzMl90IHJlc2lkdWFsOworCXVpbnQxNl90IHRpbWVvdXQ7CS8qIDAgPSAzMCBzZWNvbmRzLCAweEZGRkYgPSBkaXNhYmxlICovCisJdWludDE2X3QgZHNlZ19jb3VudDsJLyogRGF0YSBzZWdtZW50IGNvdW50LiAqLworCXVpbnQxNl90IHJlc2VydmVkXzRbN107CisJdWludDhfdCBzZW5zZV9kYXRhWzE4XTsKK307CisKKy8qCisgKiBJU1AgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWUgZW50cnkgc2l6ZXMKKyAqLworI2RlZmluZSBSRVNQT05TRV9FTlRSWV9TSVpFCShzaXplb2Yoc3RydWN0IHJlc3BvbnNlKSkKKyNkZWZpbmUgUkVRVUVTVF9FTlRSWV9TSVpFCShzaXplb2YocmVxdWVzdF90KSkKKworLyoKKyAqIElTUCBzdGF0dXMgZW50cnkgLSBjb21wbGV0aW9uIHN0YXR1cyBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBDU19DT01QTEVURSAgICAgICAgIDB4MAkvKiBObyBlcnJvcnMgKi8KKyNkZWZpbmUgQ1NfSU5DT01QTEVURSAgICAgICAweDEJLyogSW5jb21wbGV0ZSB0cmFuc2ZlciBvZiBjbWQuICovCisjZGVmaW5lIENTX0RNQSAgICAgICAgICAgICAgMHgyCS8qIEEgRE1BIGRpcmVjdGlvbiBlcnJvci4gKi8KKyNkZWZpbmUgQ1NfVFJBTlNQT1JUICAgICAgICAweDMJLyogVHJhbnNwb3J0IGVycm9yLiAqLworI2RlZmluZSBDU19SRVNFVCAgICAgICAgICAgIDB4NAkvKiBTQ1NJIGJ1cyByZXNldCBvY2N1cnJlZCAqLworI2RlZmluZSBDU19BQk9SVEVEICAgICAgICAgIDB4NQkvKiBTeXN0ZW0gYWJvcnRlZCBjb21tYW5kLiAqLworI2RlZmluZSBDU19USU1FT1VUICAgICAgICAgIDB4NgkvKiBUaW1lb3V0IGVycm9yLiAqLworI2RlZmluZSBDU19EQVRBX09WRVJSVU4gICAgIDB4NwkvKiBEYXRhIG92ZXJydW4uICovCisjZGVmaW5lIENTX0NPTU1BTkRfT1ZFUlJVTiAgMHg4CS8qIENvbW1hbmQgT3ZlcnJ1bi4gKi8KKyNkZWZpbmUgQ1NfU1RBVFVTX09WRVJSVU4gICAweDkJLyogU3RhdHVzIE92ZXJydW4uICovCisjZGVmaW5lIENTX0JBRF9NU0cgICAgICAgICAgMHhBCS8qIEJhZCBtc2cgYWZ0ZXIgc3RhdHVzIHBoYXNlLiAqLworI2RlZmluZSBDU19OT19NU0dfT1VUICAgICAgIDB4QgkvKiBObyBtc2cgb3V0IGFmdGVyIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgQ1NfRVhURU5ERURfSUQgICAgICAweEMJLyogRXh0ZW5kZWQgSUQgZmFpbGVkLiAqLworI2RlZmluZSBDU19JREVfTVNHICAgICAgICAgIDB4RAkvKiBUYXJnZXQgcmVqZWN0ZWQgSURFIG1zZy4gKi8KKyNkZWZpbmUgQ1NfQUJPUlRfTVNHICAgICAgICAweEUJLyogVGFyZ2V0IHJlamVjdGVkIGFib3J0IG1zZy4gKi8KKyNkZWZpbmUgQ1NfUkVKRUNUX01TRyAgICAgICAweEYJLyogVGFyZ2V0IHJlamVjdGVkIHJlamVjdCBtc2cuICovCisjZGVmaW5lIENTX05PUF9NU0cgICAgICAgICAgMHgxMAkvKiBUYXJnZXQgcmVqZWN0ZWQgTk9QIG1zZy4gKi8KKyNkZWZpbmUgQ1NfUEFSSVRZX01TRyAgICAgICAweDExCS8qIFRhcmdldCByZWplY3RlZCBwYXJpdHkgbXNnLiAqLworI2RlZmluZSBDU19ERVZfUkVTRVRfTVNHICAgIDB4MTIJLyogVGFyZ2V0IHJlamVjdGVkIGRldiByc3QgbXNnLiAqLworI2RlZmluZSBDU19JRF9NU0cgICAgICAgICAgIDB4MTMJLyogVGFyZ2V0IHJlamVjdGVkIElEIG1zZy4gKi8KKyNkZWZpbmUgQ1NfRlJFRSAgICAgICAgICAgICAweDE0CS8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUuICovCisjZGVmaW5lIENTX0RBVEFfVU5ERVJSVU4gICAgMHgxNQkvKiBEYXRhIFVuZGVycnVuLiAqLworI2RlZmluZSBDU19UUkFOQUNUSU9OXzEgICAgIDB4MTgJLyogVHJhbnNhY3Rpb24gZXJyb3IgMSAqLworI2RlZmluZSBDU19UUkFOQUNUSU9OXzIgICAgIDB4MTkJLyogVHJhbnNhY3Rpb24gZXJyb3IgMiAqLworI2RlZmluZSBDU19UUkFOQUNUSU9OXzMgICAgIDB4MWEJLyogVHJhbnNhY3Rpb24gZXJyb3IgMyAqLworI2RlZmluZSBDU19JTlZfRU5UUllfVFlQRSAgIDB4MWIJLyogSW52YWxpZCBlbnRyeSB0eXBlICovCisjZGVmaW5lIENTX0RFVl9RVUVVRV9GVUxMICAgMHgxYwkvKiBEZXZpY2UgcXVldWUgZnVsbCAqLworI2RlZmluZSBDU19QSEFTRURfU0tJUFBFRCAgIDB4MWQJLyogU0NTSSBwaGFzZSBza2lwcGVkICovCisjZGVmaW5lIENTX0FSU19GQUlMRUQgICAgICAgMHgxZQkvKiBBUlMgZmFpbGVkICovCisjZGVmaW5lIENTX0xWRF9CVVNfRVJST1IgICAgMHgyMQkvKiBMVkQgYnVzIGVycm9yICovCisjZGVmaW5lIENTX0JBRF9QQVlMT0FEICAgICAgMHg4MAkvKiBEcml2ZXIgZGVmaW5lZCAqLworI2RlZmluZSBDU19VTktOT1dOICAgICAgICAgIDB4ODEJLyogRHJpdmVyIGRlZmluZWQgKi8KKyNkZWZpbmUgQ1NfUkVUUlkgICAgICAgICAgICAweDgyCS8qIERyaXZlciBkZWZpbmVkICovCisKKy8qCisgKiBJU1Agc3RhdHVzIGVudHJ5IC0gU0NTSSBzdGF0dXMgYnl0ZSBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgU1NfQ0hFQ0tfQ09ORElUSU9OICBCSVRfMQorI2RlZmluZSBTU19DT05ESVRJT05fTUVUICAgIEJJVF8yCisjZGVmaW5lIFNTX0JVU1lfQ09ORElUSU9OICAgQklUXzMKKyNkZWZpbmUgU1NfUkVTRVJWRV9DT05GTElDVCAoQklUXzQgfCBCSVRfMykKKworLyoKKyAqIElTUCB0YXJnZXQgZW50cmllcyAtIE9wdGlvbiBmbGFncyBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgT0ZfRU5BQkxFX1RBRyAgICAgICBCSVRfMQkvKiBUYWdnZWQgcXVldWUgYWN0aW9uIGVuYWJsZSAqLworI2RlZmluZSBPRl9EQVRBX0lOICAgICAgICAgIEJJVF82CS8qIERhdGEgaW4gdG8gaW5pdGlhdG9yICovCisJCQkJCS8qICAoZGF0YSBmcm9tIHRhcmdldCB0byBpbml0aWF0b3IpICovCisjZGVmaW5lIE9GX0RBVEFfT1VUICAgICAgICAgQklUXzcJLyogRGF0YSBvdXQgZnJvbSBpbml0aWF0b3IgKi8KKwkJCQkJLyogIChkYXRhIGZyb20gaW5pdGlhdG9yIHRvIHRhcmdldCkgKi8KKyNkZWZpbmUgT0ZfTk9fREFUQSAgICAgICAgICAoQklUXzcgfCBCSVRfNikKKyNkZWZpbmUgT0ZfRElTQ19ESVNBQkxFRCAgICBCSVRfMTUJLyogRGlzY29ubmVjdHMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgT0ZfRElTQUJMRV9TRFAgICAgICBCSVRfMjQJLyogRGlzYWJsZSBzZW5kaW5nIHNhdmUgZGF0YSBwdHIgKi8KKyNkZWZpbmUgT0ZfU0VORF9SRFAgICAgICAgICBCSVRfMjYJLyogU2VuZCByZXN0b3JlIGRhdGEgcG9pbnRlcnMgbXNnICovCisjZGVmaW5lIE9GX0ZPUkNFX0RJU0MgICAgICAgQklUXzMwCS8qIERpc2Nvbm5lY3RzIG1hbmRhdG9yeSAqLworI2RlZmluZSBPRl9TU1RTICAgICAgICAgICAgIEJJVF8zMQkvKiBTZW5kIFNDU0kgc3RhdHVzICovCisKKworLyoKKyAqIEJVUyBwYXJhbWV0ZXJzL3NldHRpbmdzIHN0cnVjdHVyZSAtIFVOVVNFRAorICovCitzdHJ1Y3QgYnVzX3BhcmFtIHsKKwl1aW50OF90IGlkOwkJLyogSG9zdCBhZGFwdGVyIFNDU0kgaWQgKi8KKwl1aW50OF90IGJ1c19yZXNldF9kZWxheTsJLyogU0NTSSBidXMgcmVzZXQgZGVsYXkuICovCisJdWludDhfdCBmYWlsZWRfcmVzZXRfY291bnQ7CS8qIG51bWJlciBvZiB0aW1lIHJlc2V0IGZhaWxlZCAqLworCXVpbnQ4X3QgdW51c2VkOworCXVpbnQxNl90IGRldmljZV9lbmFibGVzOwkvKiBEZXZpY2UgZW5hYmxlIGJpdHMuICovCisJdWludDE2X3QgbHVuX2Rpc2FibGVzOwkvKiBMVU4gZGlzYWJsZSBiaXRzLiAqLworCXVpbnQxNl90IHF0YWdfZW5hYmxlczsJLyogVGFnIHF1ZXVlIGVuYWJsZXMuICovCisJdWludDE2X3QgaGl3YXQ7CQkvKiBIaWdoIHdhdGVyIG1hcmsgcGVyIGRldmljZS4gKi8KKwl1aW50OF90IHJlc2V0X21hcmtlcjoxOworCXVpbnQ4X3QgZGlzYWJsZV9zY3NpX3Jlc2V0OjE7CisJdWludDhfdCBzY3NpX2J1c19kZWFkOjE7CS8qIFNDU0kgQnVzIGlzIERlYWQsIHdoZW4gNSBiYWNrIHRvIGJhY2sgcmVzZXRzIGZhaWxlZCAqLworfTsKKworCitzdHJ1Y3QgcWxhX2RyaXZlcl9zZXR1cCB7CisJdWludDMyX3Qgbm9fc3luYzoxOworCXVpbnQzMl90IG5vX3dpZGU6MTsKKwl1aW50MzJfdCBub19wcHI6MTsKKwl1aW50MzJfdCBub19udnJhbToxOworCXVpbnQxNl90IHN5bmNfbWFzazsKKwl1aW50MTZfdCB3aWRlX21hc2s7CisJdWludDE2X3QgcHByX21hc2s7Cit9OworCisKKy8qCisgKiBMaW51eCBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBzY3NpX3FsYV9ob3N0IHsKKwkvKiBMaW51eCBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CS8qIHBvaW50ZXIgdG8gaG9zdCBkYXRhICovCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKm5leHQ7CisJc3RydWN0IGRldmljZV9yZWcgX19pb21lbSAqaW9iYXNlOwkvKiBCYXNlIE1lbW9yeS1tYXBwZWQgSS9PIGFkZHJlc3MgKi8KKworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqbW1wYmFzZTsJLyogbWVtb3J5IG1hcHBlZCBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBob3N0X25vOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVpbnQ4X3QgZGV2bnVtOworCXVpbnQ4X3QgcmV2aXNpb247CisJdWludDhfdCBwb3J0czsKKworCXVuc2lnbmVkIGxvbmcgYWN0dGhyZWFkczsKKwl1bnNpZ25lZCBsb25nIGlzcl9jb3VudDsJLyogSW50ZXJydXB0IGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBzcHVyaW91c19pbnQ7CisKKwkvKiBPdXRzdGFuZGluZ3MgSVNQIGNvbW1hbmRzLiAqLworCXN0cnVjdCBzcmIgKm91dHN0YW5kaW5nX2NtZHNbTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTXTsKKworCS8qIEJVUyBjb25maWd1cmF0aW9uIGRhdGEgKi8KKwlzdHJ1Y3QgYnVzX3BhcmFtIGJ1c19zZXR0aW5nc1tNQVhfQlVTRVNdOworCisJLyogUmVjZWl2ZWQgSVNQIG1haWxib3ggZGF0YS4gKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94X291dFtNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKKworCWRtYV9hZGRyX3QgcmVxdWVzdF9kbWE7CQkvKiBQaHlzaWNhbCBBZGRyZXNzICovCisJcmVxdWVzdF90ICpyZXF1ZXN0X3Jpbmc7CS8qIEJhc2UgdmlydHVhbCBhZGRyZXNzICovCisJcmVxdWVzdF90ICpyZXF1ZXN0X3JpbmdfcHRyOwkvKiBDdXJyZW50IGFkZHJlc3MuICovCisJdWludDE2X3QgcmVxX3JpbmdfaW5kZXg7CS8qIEN1cnJlbnQgaW5kZXguICovCisJdWludDE2X3QgcmVxX3FfY250OwkJLyogTnVtYmVyIG9mIGF2YWlsYWJsZSBlbnRyaWVzLiAqLworCisJZG1hX2FkZHJfdCByZXNwb25zZV9kbWE7CS8qIFBoeXNpY2FsIGFkZHJlc3MuICovCisJc3RydWN0IHJlc3BvbnNlICpyZXNwb25zZV9yaW5nOwkvKiBCYXNlIHZpcnR1YWwgYWRkcmVzcyAqLworCXN0cnVjdCByZXNwb25zZSAqcmVzcG9uc2VfcmluZ19wdHI7CS8qIEN1cnJlbnQgYWRkcmVzcy4gKi8KKwl1aW50MTZfdCByc3BfcmluZ19pbmRleDsJLyogQ3VycmVudCBpbmRleC4gKi8KKworCXN0cnVjdCBsaXN0X2hlYWQgZG9uZV9xOwkvKiBEb25lIHF1ZXVlICovCisKKwlzdHJ1Y3QgY29tcGxldGlvbiAqbWFpbGJveF93YWl0OworCisJdm9sYXRpbGUgc3RydWN0IHsKKwkJdWludDMyX3Qgb25saW5lOjE7CQkJLyogMCAqLworCQl1aW50MzJfdCByZXNldF9tYXJrZXI6MTsJCS8qIDEgKi8KKwkJdWludDMyX3QgZGlzYWJsZV9ob3N0X2FkYXB0ZXI6MTsJLyogMiAqLworCQl1aW50MzJfdCByZXNldF9hY3RpdmU6MTsJCS8qIDMgKi8KKwkJdWludDMyX3QgYWJvcnRfaXNwX2FjdGl2ZToxOwkJLyogNCAqLworCQl1aW50MzJfdCBkaXNhYmxlX3Jpc2NfY29kZV9sb2FkOjE7CS8qIDUgKi8KKwkJdWludDMyX3QgZW5hYmxlXzY0Yml0X2FkZHJlc3Npbmc6MTsJLyogNiAqLworCQl1aW50MzJfdCBpbl9yZXNldDoxOwkJCS8qIDcgKi8KKwkJdWludDMyX3QgaW50c19lbmFibGVkOjE7CisJCXVpbnQzMl90IGlnbm9yZV9udnJhbToxOworI2lmZGVmIF9faWE2NF9fCisJCXVpbnQzMl90IHVzZV9wY2lfdmNoYW5uZWw6MTsKKyNlbmRpZgorCX0gZmxhZ3M7CisKKwlzdHJ1Y3QgbnZyYW0gbnZyYW07CisJaW50IG52cmFtX3ZhbGlkOworfTsKKworI2VuZGlmIC8qIF9RTEExMjgwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L0tjb25maWcgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzNiODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9LY29uZmlnCkBAIC0wLDAgKzEsNDEgQEAKK2NvbmZpZyBTQ1NJX1FMQTJYWFgKKwl0cmlzdGF0ZQorCWRlZmF1bHQgKFNDU0kgJiYgUENJKQorCWRlcGVuZHMgb24gU0NTSSAmJiBQQ0kKKworY29uZmlnIFNDU0lfUUxBMjFYWAorCXRyaXN0YXRlICJRTG9naWMgSVNQMjEwMCBob3N0IGFkYXB0ZXIgZmFtaWx5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTQ1NJX1FMQTJYWFgKKyAgICAgICAgc2VsZWN0IFNDU0lfRkNfQVRUUlMKKwktLS1oZWxwLS0tCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFFMb2dpYyAyMXh4IChJU1AyMTAwKSBob3N0IGFkYXB0ZXIgZmFtaWx5LgorCitjb25maWcgU0NTSV9RTEEyMlhYCisJdHJpc3RhdGUgIlFMb2dpYyBJU1AyMjAwIGhvc3QgYWRhcHRlciBmYW1pbHkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWAorICAgICAgICBzZWxlY3QgU0NTSV9GQ19BVFRSUworCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDIyeHggKElTUDIyMDApIGhvc3QgYWRhcHRlciBmYW1pbHkuCisKK2NvbmZpZyBTQ1NJX1FMQTIzMDAKKwl0cmlzdGF0ZSAiUUxvZ2ljIElTUDIzMDAgaG9zdCBhZGFwdGVyIGZhbWlseSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYCisgICAgICAgIHNlbGVjdCBTQ1NJX0ZDX0FUVFJTCisJLS0taGVscC0tLQorCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgMjMwMCAoSVNQMjMwMCBhbmQgSVNQMjMxMikgaG9zdAorCWFkYXB0ZXIgZmFtaWx5LgorCitjb25maWcgU0NTSV9RTEEyMzIyCisJdHJpc3RhdGUgIlFMb2dpYyBJU1AyMzIyIGhvc3QgYWRhcHRlciBmYW1pbHkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0lfUUxBMlhYWAorICAgICAgICBzZWxlY3QgU0NTSV9GQ19BVFRSUworCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDIzMjIgKElTUDIzMjIpIGhvc3QgYWRhcHRlciBmYW1pbHkuCisKK2NvbmZpZyBTQ1NJX1FMQTYzMTIKKwl0cmlzdGF0ZSAiUUxvZ2ljIElTUDYzeHggaG9zdCBhZGFwdGVyIGZhbWlseSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSV9RTEEyWFhYCisgICAgICAgIHNlbGVjdCBTQ1NJX0ZDX0FUVFJTCisJLS0taGVscC0tLQorCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgNjN4eCAoSVNQNjMxMiBhbmQgSVNQNjMyMikgaG9zdAorCWFkYXB0ZXIgZmFtaWx5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2EyNDdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorRVhUUkFfQ0ZMQUdTICs9IC1EVU5JUVVFX0ZXX05BTUUKKworcWxhMnh4eC15IDo9IHFsYV9vcy5vIHFsYV9pbml0Lm8gcWxhX21ieC5vIHFsYV9pb2NiLm8gcWxhX2lzci5vIHFsYV9ncy5vIFwKKwkJcWxhX2RiZy5vIHFsYV9zdXAubyBxbGFfcnNjbi5vCisKK3FsYTIxMDAteSA6PSBxbDIxMDAubyBxbDIxMDBfZncubworcWxhMjIwMC15IDo9IHFsMjIwMC5vIHFsMjIwMF9mdy5vCitxbGEyMzAwLXkgOj0gcWwyMzAwLm8gcWwyMzAwX2Z3Lm8KK3FsYTIzMjIteSA6PSBxbDIzMjIubyBxbDIzMjJfZncubworcWxhNjMxMi15IDo9IHFsNjMxMi5vIHFsNjMxMl9mdy5vCisKK29iai0kKENPTkZJR19TQ1NJX1FMQTIxWFgpICs9IHFsYTJ4eHgubyBxbGEyMTAwLm8KK29iai0kKENPTkZJR19TQ1NJX1FMQTIyWFgpICs9IHFsYTJ4eHgubyBxbGEyMjAwLm8KK29iai0kKENPTkZJR19TQ1NJX1FMQTIzMDApICs9IHFsYTJ4eHgubyBxbGEyMzAwLm8KK29iai0kKENPTkZJR19TQ1NJX1FMQTIzMjIpICs9IHFsYTJ4eHgubyBxbGEyMzIyLm8KK29iai0kKENPTkZJR19TQ1NJX1FMQTYzMTIpICs9IHFsYTJ4eHgubyBxbGE2MzEyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjEwMC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExMzZhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjEwMC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBRTG9naWMgSVNQMjEwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzdG9waCBIZWxsd2lnLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworc3RhdGljIGNoYXIgcWxhX2RyaXZlcl9uYW1lW10gPSAicWxhMjEwMCI7CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIxMDB0cF92ZXJzaW9uW107CitleHRlcm4gdW5zaWduZWQgY2hhciAgZncyMTAwdHBfdmVyc2lvbl9zdHJbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIxMDB0cF9hZGRyMDE7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMTAwdHBfY29kZTAxW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMTAwdHBfbGVuZ3RoMDE7CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2Z3X2luZm8gcWxhX2Z3X3RibFtdID0geworCXsKKwkJLmFkZHJlc3NpbmcJPSBGV19JTkZPX0FERFJfTk9STUFMLAorCQkuZndjb2RlCQk9ICZmdzIxMDB0cF9jb2RlMDFbMF0sCisJCS5md2xlbgkJPSAmZncyMTAwdHBfbGVuZ3RoMDEsCisJCS5md3N0YXJ0CT0gJmZ3MjEwMHRwX2FkZHIwMSwKKwl9LAorCisJeyBGV19JTkZPX0FERFJfTk9NT1JFLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBxbGFfYm9hcmRfaW5mbyBxbGFfYm9hcmRfdGJsID0geworCS5kcnZfbmFtZQk9IHFsYV9kcml2ZXJfbmFtZSwKKworCS5pc3BfbmFtZQk9ICJJU1AyMTAwIiwKKwkuZndfaW5mbwk9IHFsYV9md190YmwsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcWxhMjEwMF9wY2lfdGJsW10gPSB7CisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUUxPR0lDLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIxMDAsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJnFsYV9ib2FyZF90YmwsCisJfSwKKworCXswLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWxhMjEwMF9wY2lfdGJsKTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3FsYTIxMDBfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHFsYTJ4MDBfcHJvYmVfb25lKHBkZXYsCisJICAgIChzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gKilpZC0+ZHJpdmVyX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3FsYTIxMDBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlxbGEyeDAwX3JlbW92ZV9vbmUocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBxbGEyMTAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInFsYTIxMDAiLAorCS5pZF90YWJsZQk9IHFsYTIxMDBfcGNpX3RibCwKKwkucHJvYmUJCT0gcWxhMjEwMF9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChxbGEyMTAwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3FsYTIxMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnFsYTIxMDBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcWxhMjEwMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxbGEyMTAwX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChxbGEyMTAwX2luaXQpOworbW9kdWxlX2V4aXQocWxhMjEwMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUUxvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBJU1AyMXh4IEZDLVNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFFMQTJYWFhfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIxMDBfZncuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjEwMF9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MmY5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIxMDBfZncuYwpAQCAtMCwwICsxLDQ4NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gMS4xOS4yNCAoMTQ6MDIgSnVsIDE2LCAyMDAyKQorICovCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMTAwdHBfdmVyc2lvbiA9IDEqMTAyNCsxOTsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfdmVyc2lvbiA9IDEqMTAyNCsxOTsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIGNoYXIgZncyMTAwdHBfdmVyc2lvbl9zdHJbXSA9IHsxLDE5LDI0fTsKKyNlbHNlCit1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHsxLDE5LDI0fTsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKKyNkZWZpbmUgZncyMTAwdHBfVkVSU0lPTl9TVFJJTkcgIjEuMTkuMjQiCisjZWxzZQorI2RlZmluZSBGV19WRVJTSU9OX1NUUklORyAiMS4xOS4yNCIKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjEwMHRwX2FkZHIwMSA9IDB4MTAwMCA7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHIwMSA9IDB4MTAwMCA7CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIxMDB0cF9jb2RlMDFbXSA9IHsgCisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsgCisjZW5kaWYKKwkweDAwNzgsIDB4MTAyZCwgMHgwMDAwLCAweDk1ZjEsIDB4MDAwMCwgMHgwMDAxLCAweDAwMTMsIDB4MDAxOCwKKwkweDAwMTcsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsIDB4NDk0NywgMHg0ODU0LCAweDIwMzIsIDB4MzAzMCwKKwkweDMxMjAsIDB4NTE0YywgMHg0ZjQ3LCAweDQ5NDMsIDB4MjA0MywgMHg0ZjUyLCAweDUwNGYsIDB4NTI0MSwKKwkweDU0NDksIDB4NGY0ZSwgMHgyMDQ5LCAweDUzNTAsIDB4MzIzMSwgMHgzMDMwLCAweDIwNDYsIDB4Njk3MiwKKwkweDZkNzcsIDB4NjE3MiwgMHg2NTIwLCAweDIwNTYsIDB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMCwKKwkweDMxMmUsIDB4MzEzOSwgMHgyMDIwLCAweDIwMjAsIDB4MjQwMCwgMHgyMDkxLCAweDIwMDAsIDB4MjBjMSwKKwkweDAwMjEsIDB4MjAzOSwgMHhmZmZmLCAweDIwMTksIDB4YWFhYSwgMHgyNzYwLCAweDIwNjksIDB4N2ZmZiwKKwkweDIwYzEsIDB4MDAyMCwgMHgyYzJjLCAweDJkMzQsIDB4Mjc2MiwgMHgyMzZhLCAweDJjMjQsIDB4MmQwNCwKKwkweDI2NmEsIDB4MjU2MiwgMHhhNDA2LCAweDAwYzAsIDB4MTA1MiwgMHgyMGMxLCAweDAwMjEsIDB4MmMyYywKKwkweDIzNjIsIDB4MmMwNCwgMHgyNTYyLCAweGEzMDYsIDB4MDA0MCwgMHgxMDUyLCAweDIwYzEsIDB4MDAyMCwKKwkweDIwMzksIDB4OGZmZiwgMHgyMGExLCAweGFkMDAsIDB4MjcwOCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwKKwkweDgxMGQsIDB4YTE4YywgMHgwMDBmLCAweDIwMDEsIDB4MDAwYSwgMHhhMTEyLCAweGEwMGUsIDB4MjFhOCwKKwkweDQxYTQsIDB4MzQwMCwgMHg4MjExLCAweDAwYzAsIDB4MTA1ZiwgMHgyNzA4LCAweDM0MDAsIDB4YTEwMiwKKwkweDAwNDAsIDB4MTA2ZiwgMHgwMDQ4LCAweDEwNmYsIDB4MjBhOCwgMHhhMDBlLCAweDQxYTQsIDB4MjBhMSwKKwkweGE1ZjEsIDB4MjAwOSwgMHgwMDAwLCAweDIwYTksIDB4MDcwZiwgMHg0MWE0LCAweDM0MDAsIDB4MjBjOSwKKwkweGFhZmYsIDB4MjA1OSwgMHgwMDAwLCAweDJiNzgsIDB4NzgyMywgMHgwMDA0LCAweDIwODksIDB4MjVjNywKKwkweDIwNTEsIDB4YTYwMCwgMHgyYTcwLCAweDc3NjIsIDB4YTc4NiwgMHg4ZmZmLCAweDAwNDAsIDB4MTA5MiwKKwkweDcwNWYsIDB4Y2QwMCwgMHg3MDViLCAweGNjZjEsIDB4NzA2NywgMHgwMjAwLCAweDcwNmIsIDB4MDIwMCwKKwkweDAwNzgsIDB4MTA5YSwgMHg3MDViLCAweGJkMDEsIDB4NzA2NywgMHgwMTAwLCAweDcwNmIsIDB4MDEwMCwKKwkweDcwNWYsIDB4YmQwMCwgMHgxMDc4LCAweDEyZGYsIDB4MTA3OCwgMHgxM2NhLCAweDEwNzgsIDB4MTU3NywKKwkweDEwNzgsIDB4MWNlOSwgMHgxMDc4LCAweDQyZWMsIDB4MTA3OCwgMHg3NmJmLCAweDEwNzgsIDB4MTM1NSwKKwkweDEwNzgsIDB4MmFjMCwgMHgxMDc4LCAweDRlOTMsIDB4MTA3OCwgMHg0OWEzLCAweDEwNzgsIDB4NTk0YSwKKwkweDEwNzgsIDB4MjI2MywgMHgxMDc4LCAweDVjNDMsIDB4MTA3OCwgMHg1NDg1LCAweDEwNzgsIDB4MjE2MiwKKwkweDEwNzgsIDB4MjI0MCwgMHgyMDkxLCAweDMwMDksIDB4NzgyMywgMHgwMDAwLCAweDAwOTAsIDB4MTBjZiwKKwkweDc4MjAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTBjZiwgMHg3ODIzLCAweDQwMDAsIDB4MDA2OCwKKwkweDEwYzcsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MmE3MCwKKwkweDcwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxN2YsIDB4MjAwMywgMHgwMDAwLCAweDJhNzAsIDB4NzAwMCwKKwkweGEwOGUsIDB4MDAwMywgMHgwMGMwLCAweDEwZWYsIDB4MTA3OCwgMHgzNjVlLCAweDEwNzgsIDB4MmFlOCwKKwkweDEwNzgsIDB4NGVlMywgMHgxMDc4LCAweDRiNjYsIDB4MjAwOSwgMHgwMTAwLCAweDIxMDQsIDB4YTA4MiwKKwkweDAwMDIsIDB4MDA0OCwgMHgxMGYzLCAweDEwNzgsIDB4NTk2NiwgMHgwMDc4LCAweDEwZDYsIDB4MTA3OSwKKwkweDEwZjcsIDB4MDA3OCwgMHgxMGRjLCAweDEwNzgsIDB4NzE5NywgMHgwMDc4LCAweDEwZWIsIDB4MTEwMSwKKwkweDExMDIsIDB4MTFiZSwgMHgxMGZmLCAweDEyNDYsIDB4MTJkYywgMHgxMmRkLCAweDEyZGUsIDB4MTA3OCwKKwkweDEzMzIsIDB4MDA3YywgMHgxMjdlLCAweDBmN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDAsIDB4YTA4NiwKKwkweDAwMDEsIDB4MDBjMCwgMHgxMTk4LCAweDEwNzgsIDB4M2FlYywgMHgyMDc5LCAweDAxMDAsIDB4Nzg0NCwKKwkweGEwMDUsIDB4MDBjMCwgMHgxMTk4LCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsIDB4MTA3OCwKKwkweDFhZGYsIDB4NzgwZiwgMHgwMGZmLCAweDc4NDAsIDB4YTA4NCwgMHhmZmZiLCAweDc4NDIsIDB4MjAxMSwKKwkweDgwMTAsIDB4NzNjNCwgMHgxMDc4LCAweDM2MWIsIDB4MjAwMSwgMHhmZmZmLCAweDEwNzgsIDB4NWFlNiwKKwkweDcyM2MsIDB4YzI4NCwgMHg3MjNlLCAweDIwMDEsIDB4YTYwYywgMHgyMDE0LCAweGMyYWMsIDB4MjIwMiwKKwkweDEwNzgsIDB4NmY5ZiwgMHgyMDExLCAweDAwMDQsIDB4MTA3OCwgMHg4ZDFiLCAweDEwNzgsIDB4NDg5ZSwKKwkweDEwNzgsIDB4NDJkNCwgMHgwMDQwLCAweDExNDQsIDB4NzA4NywgMHgwMDAxLCAweDcwYmYsIDB4MDAwMCwKKwkweDEwNzgsIDB4M2M5ZSwgMHgwMDc4LCAweDExOTgsIDB4MTA3OCwgMHg0OTY3LCAweDAwNDAsIDB4MTE0ZCwKKwkweDdhMGMsIDB4YzJiNCwgMHg3YTBlLCAweDAwNzgsIDB4MTE1OSwgMHgxMDc4LCAweDkwYTYsIDB4NzBjYywKKwkweGQwOWMsIDB4MDBjMCwgMHgxMTU5LCAweDcwOTgsIDB4YTAwNSwgMHgwMDQwLCAweDExNTksIDB4MTA3OCwKKwkweDQyYjgsIDB4NzBkNywgMHgwMDAwLCAweDcwZDMsIDB4MDAwMCwgMHg3MmNjLCAweDIwNzksIDB4YTY1MiwKKwkweDc4MDQsIDB4ZDBhYywgMHgwMDQwLCAweDExNjUsIDB4YzI5NSwgMHg3MmNlLCAweGEyOTYsIDB4MDAwNCwKKwkweDAwNDAsIDB4MTE4NiwgMHgyMDExLCAweDAwMDEsIDB4MTA3OCwgMHg4ZDFiLCAweDcwOTMsIDB4MDAwMCwKKwkweDcwOTcsIDB4ZmZmZiwgMHg3MDAzLCAweDAwMDIsIDB4MGY3ZiwgMHgxMDc4LCAweDI2NzcsIDB4MjAxMSwKKwkweDAwMDUsIDB4MTA3OCwgMHg3MGUwLCAweDEwNzgsIDB4NjJkMSwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwKKwkweDYwZTMsIDB4MDAwOCwgMHgwYzdmLCAweDEyN2YsIDB4MDA3OCwgMHgxMTlhLCAweDcwOTMsIDB4MDAwMCwKKwkweDcwOTcsIDB4ZmZmZiwgMHg3MDAzLCAweDAwMDIsIDB4MjAxMSwgMHgwMDA1LCAweDEwNzgsIDB4NzBlMCwKKwkweDEwNzgsIDB4NjJkMSwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MGUzLCAweDAwMDgsIDB4MGM3ZiwKKwkweDBmN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MjBhOSwgMHgwMDgyLCAweDIwMDksIDB4MDA3ZSwKKwkweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIxMTAsIDB4MDI3ZSwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwKKwkweDczZDAsIDB4MDI3ZiwgMHgxMDc4LCAweGE0ZjEsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MTA3OCwKKwkweDI5OGUsIDB4ODEwOCwgMHgwMGYwLCAweDExYTAsIDB4MGM3ZiwgMHg3MDZmLCAweDAwMDAsIDB4NzA3MCwKKwkweGEwODQsIDB4MDBmZiwgMHg3MDcyLCAweDcwOWIsIDB4MDAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgxMjQ0LCAweDcwOTQsIDB4YTA4NiwKKwkweGZmZmYsIDB4MDA0MCwgMHgxMWQxLCAweDEwNzgsIDB4MjY3NywgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwKKwkweDEyNDQsIDB4NzBjYywgMHhkMDljLCAweDAwNDAsIDB4MTFmZCwgMHhkMDg0LCAweDAwNDAsIDB4MTFmZCwKKwkweDBmN2UsIDB4MjA3OSwgMHgwMTAwLCAweDc5MGMsIDB4YzFiNSwgMHg3OTBlLCAweDBmN2YsIDB4ZDA4YywKKwkweDAwNDAsIDB4MTFmZCwgMHg3MGQwLCAweGEwODYsIDB4ZmZmZiwgMHgwMDQwLCAweDExZjksIDB4MTA3OCwKKwkweDI3ZjcsIDB4MTA3OCwgMHg2MmQxLCAweDcwY2MsIDB4ZDA5NCwgMHgwMGMwLCAweDEyNDQsIDB4MjAxMSwKKwkweDAwMDEsIDB4MjAxOSwgMHgwMDAwLCAweDEwNzgsIDB4MjgyZiwgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwKKwkweDEyNDQsIDB4NzBkNCwgMHhhMDA1LCAweDAwYzAsIDB4MTI0NCwgMHg3MDkwLCAweGEwMDUsIDB4MDBjMCwKKwkweDEyNDQsIDB4MTA3OCwgMHg0OTY3LCAweDAwYzAsIDB4MTI0NCwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYWMsIDB4MDA0MCwgMHgxMjI3LCAweDE1N2UsIDB4MGM3ZSwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwKKwkweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHgxMjFhLCAweDYwMDAsIDB4ZDBlYywKKwkweDAwYzAsIDB4MTIyMiwgMHgwMTdmLCAweDgxMDgsIDB4MDBmMCwgMHgxMjExLCAweDBjN2YsIDB4MTU3ZiwKKwkweDAwNzgsIDB4MTIyNywgMHgwMTdmLCAweDBjN2YsIDB4MTU3ZiwgMHgwMDc4LCAweDEyNDQsIDB4NzAwMywKKwkweDAwMDMsIDB4NzA5NywgMHhmZmZmLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDI0ZTgsIDB4MTA3OCwKKwkweDM2OTksIDB4MjAwMSwgMHhhOGIyLCAweDIwMDQsIDB4YTA4NiwgMHgwMDA1LCAweDAwYzAsIDB4MTIzYywKKwkweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDcwZTAsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4NzBlYSwKKwkweDEwNzgsIDB4NjJkMSwgMHgxMDc4LCAweDYzOWIsIDB4MTI3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MGY3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDEwMCwgMHgyMDA5LCAweDAwZjcsIDB4MTA3OCwKKwkweDQyYTEsIDB4Nzk0MCwgMHhhMThjLCAweDAwMTAsIDB4Nzk0MiwgMHg3OTI0LCAweGQxYjQsIDB4MDA0MCwKKwkweDEyNWIsIDB4NzgyNywgMHgwMDQwLCAweGQxOWMsIDB4MDA0MCwgMHgxMjYwLCAweDc4MjcsIDB4MDAwOCwKKwkweDAwN2UsIDB4MDM3ZSwgMHgxNTdlLCAweGEwMDYsIDB4MTA3OCwgMHg1YWU2LCAweDc5MDAsIDB4YTE4YSwKKwkweDAwMDMsIDB4MDA1MCwgMHgxMjg5LCAweDc5NTQsIDB4ZDFhYywgMHgwMGMwLCAweDEyODksIDB4MjAwOSwKKwkweDAwZjgsIDB4MTA3OCwgMHg0MmExLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsIDB4MjBhOSwKKwkweDA5YzQsIDB4NzgyMCwgMHhkMDljLCAweDAwYzAsIDB4MTI4MSwgMHg3ODI0LCAweGQwYWMsIDB4MDBjMCwKKwkweDEyY2EsIDB4MDBmMCwgMHgxMjc5LCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDI0ZTgsIDB4MDA3OCwKKwkweDEyZDUsIDB4Nzg1MywgMHgwMDAwLCAweDc4MmYsIDB4MDAyMCwgMHgyMGE5LCAweDAwNTAsIDB4MDBlMCwKKwkweDEyOGYsIDB4MjA5MSwgMHg2MDAwLCAweDAwZjAsIDB4MTI4ZiwgMHg3ODUzLCAweDA0MDAsIDB4NzgyZiwKKwkweDAwMDAsIDB4MjAwOSwgMHgwMGY4LCAweDEwNzgsIDB4NDJhMSwgMHgyMGE5LCAweDAwMGUsIDB4MDAwNSwKKwkweDAwZjAsIDB4MTI5ZiwgMHg3ODUzLCAweDE0MDAsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwKKwkweDIwMTksIDB4NjFhOCwgMHg3ODU0LCAweDAwMDUsIDB4MDAwNSwgMHhkMDhjLCAweDAwNDAsIDB4MTJiNCwKKwkweDc4MjQsIDB4ZDBhYywgMHgwMGMwLCAweDEyY2EsIDB4ODMxOSwgMHgwMGMwLCAweDEyYWEsIDB4MjAwOSwKKwkweGE2MzIsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4YTA4NCwgMHhmZmYwLCAweDAwNDAsIDB4MTJjNCwKKwkweDIwMGIsIDB4MDAwMCwgMHgxMDc4LCAweDI1ODgsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4MjRlOCwKKwkweDAwNzgsIDB4MTJkMywgMHgyMDAxLCAweGE2MzIsIDB4MjAwMywgMHgwMDAwLCAweDc4MjgsIDB4YzA5ZCwKKwkweDc4MmEsIDB4NzgyNywgMHgwMDQ4LCAweDc4NTMsIDB4MDQwMCwgMHgxNTdmLCAweDAzN2YsIDB4MDA3ZiwKKwkweDEyN2YsIDB4MGY3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MmE3MCwKKwkweDIwNjEsIDB4YThhZCwgMHgyMDYzLCAweDAwMDEsIDB4NjAwNywgMHgwMDEzLCAweDYwMGIsIDB4MDAxOCwKKwkweDYwMGYsIDB4MDAxNywgMHgyMDA5LCAweDAxMDAsIDB4MjEwNCwgMHhhMDgyLCAweDAwMDIsIDB4MDA0OCwKKwkweDEyZjUsIDB4NzA1MywgMHhmZmZmLCAweDAwNzgsIDB4MTJmNywgMHg3MDUzLCAweDAwMDAsIDB4NzA1NywKKwkweGZmZmYsIDB4NzA2ZiwgMHgwMDAwLCAweDcwNzMsIDB4MDAwMCwgMHgxMDc4LCAweDkwYTYsIDB4MjA2MSwKKwkweGE4OGQsIDB4NjAwMywgMHgwOTA5LCAweDYwMDcsIDB4MDAwMCwgMHg2MDBiLCAweDg4MDAsIDB4NjAwZiwKKwkweDAyMDAsIDB4NjAxMywgMHgwMGZmLCAweDYwMTcsIDB4MDAwMywgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwKKwkweDA3ZDAsIDB4MjA2MSwgMHhhODk1LCAweDYwMDMsIDB4ODAwMCwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwKKwkweDAwMDAsIDB4NjAwZiwgMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MDE3LCAweDAwMDAsIDB4NjAxYiwKKwkweDAwMDEsIDB4NjAxZiwgMHgwMDAwLCAweDIwNjEsIDB4YThhNSwgMHg2MDAzLCAweDUxNGMsIDB4NjAwNywKKwkweDRmNDcsIDB4NjAwYiwgMHg0OTQzLCAweDYwMGYsIDB4MjAyMCwgMHgyMDAxLCAweGE2MjYsIDB4MjAwMywKKwkweDAwMDAsIDB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHgxMzM0LCAweDAwN2UsIDB4MDE3ZSwKKwkweDIwNzksIDB4MDAwMCwgMHg3ODE4LCAweGQwODQsIDB4MDBjMCwgMHgxMzNhLCAweDAxN2YsIDB4NzkyZSwKKwkweDAwN2YsIDB4NzgyYSwgMHgwMDdmLCAweDc4MjYsIDB4MzkwMCwgMHg3ODNhLCAweDc4MjMsIDB4ODAwMiwKKwkweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwNzksIDB4YTYwMCwKKwkweDc4MDMsIDB4MDAwNSwgMHgwMDc4LCAweDEzNTIsIDB4MDA3YywgMHgyMDcxLCAweGE2MDAsIDB4NzE1YywKKwkweDcxMmUsIDB4MjAyMSwgMHgwMDAxLCAweGExOTAsIDB4MDAyZCwgMHhhMjk4LCAweDAwMmQsIDB4MDA0OCwKKwkweDEzNmIsIDB4NzA2MCwgMHhhMzAyLCAweDAwYzgsIDB4MTM2YiwgMHgyMjBhLCAweDIyMDgsIDB4MjMxMCwKKwkweDg0MjAsIDB4MDA3OCwgMHgxMzVkLCAweDIwMGIsIDB4MDAwMCwgMHg3NGFhLCAweDc0YWUsIDB4MDA3YywKKwkweDBlN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNjAwLCAweDcwYWMsIDB4YTBlYSwKKwkweDAwMTAsIDB4MDBjOCwgMHgxMzdlLCAweGEwNmUsIDB4MDA3OCwgMHgxMzg4LCAweDgwMDEsIDB4NzBhZSwKKwkweDcwMmMsIDB4MjA2OCwgMHgyZDA0LCAweDcwMmUsIDB4MjA2YiwgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwKKwkweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAwLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzBhYywgMHg4MDAxLCAweDAwYzgsIDB4MTM5OCwgMHhhMDZlLCAweDAwNzgsIDB4MTNhMSwKKwkweDcwYWUsIDB4NzAyYywgMHgyMDY4LCAweDJkMDQsIDB4NzAyZSwgMHgyMDZiLCAweDAwMDAsIDB4NjgwNywKKwkweDAwMDAsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4YTYwMCwgMHg3MDJjLCAweDIwNmEsIDB4MmQwMCwgMHg3MDJlLCAweDcwYWMsIDB4ODAwMCwKKwkweDcwYWUsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4OGRmZiwgMHgwMDQwLCAweDEzYzAsIDB4NjgwNCwKKwkweDY4MDcsIDB4MDAwMCwgMHgwMDdlLCAweDEwNzgsIDB4MTNhNCwgMHgwZDdmLCAweDAwNzgsIDB4MTNiNCwKKwkweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsIDB4NzBhYywgMHhhMDhhLCAweDAwMTAsIDB4YTAwZCwKKwkweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YThkNiwgMHg3MDA3LCAweDAwMDAsIDB4NzAxYiwKKwkweDAwMDAsIDB4NzAxZiwgMHgwMDAwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDEwLCAweGEwODUsIDB4ODAwNCwKKwkweDcwMTIsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBlN2UsIDB4MjI3MCwKKwkweDcwMGIsIDB4MDAwMCwgMHgyMDcxLCAweGE4ZDYsIDB4NzAxOCwgMHhhMDg4LCAweGE4ZGYsIDB4MjIwYSwKKwkweDgwMDAsIDB4YTA4NCwgMHgwMDA3LCAweDcwMWEsIDB4NzAwNCwgMHhhMDA1LCAweDAwYzAsIDB4MTNmNiwKKwkweDBmN2UsIDB4MjA3OSwgMHgwMDEwLCAweDEwNzgsIDB4MTQwOCwgMHgwZjdmLCAweDBlN2YsIDB4MTI3ZiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE4ZDYsIDB4NzAwNCwgMHhhMDA1LCAweDAwYzAsIDB4MTQwNiwKKwkweDBmN2UsIDB4MjA3OSwgMHgwMDEwLCAweDEwNzgsIDB4MTQwOCwgMHgwZjdmLCAweDBlN2YsIDB4MDA3YywKKwkweDcwMDAsIDB4MDA3OSwgMHgxNDBiLCAweDE0MGYsIDB4MTQ3OSwgMHgxNDk2LCAweDE0OTYsIDB4NzAxOCwKKwkweDcxMWMsIDB4YTEwNiwgMHgwMGMwLCAweDE0MTcsIDB4NzAwNywgMHgwMDAwLCAweDAwN2MsIDB4MGQ3ZSwKKwkweGExODAsIDB4YThkZiwgMHgyMDA0LCAweDcwMGEsIDB4MjA2OCwgMHg4MTA4LCAweGExOGMsIDB4MDAwNywKKwkweDcxMWUsIDB4NzgwMywgMHgwMDI2LCAweDY4MjQsIDB4NzgzMiwgMHg2ODI4LCAweDc4MzYsIDB4NjgyYywKKwkweDc4M2EsIDB4NjgzMCwgMHg3ODNlLCAweDY4MTAsIDB4NzAwZSwgMHg2ODBjLCAweDcwMTYsIDB4NjgwNCwKKwkweDBkN2YsIDB4ZDA4NCwgMHgwMDQwLCAweDE0MzksIDB4NzAwNywgMHgwMDAxLCAweDEwNzgsIDB4MTQzZSwKKwkweDAwN2MsIDB4NzAwNywgMHgwMDAyLCAweDEwNzgsIDB4MTQ1NCwgMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwKKwkweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweGExODIsIDB4MDA0MCwgMHgwMGM4LCAweDE0NDksIDB4MjExMCwKKwkweGEwMDYsIDB4NzAwZSwgMHg3MjEyLCAweDgyMDMsIDB4NzgyMiwgMHg3ODAzLCAweDAwMjAsIDB4NzgwMywKKwkweDAwNDEsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwMjdlLCAweDEzN2UsIDB4MTQ3ZSwKKwkweDE1N2UsIDB4NzAxNCwgMHgyMDk4LCAweDIwYTEsIDB4MDAxNCwgMHg3ODAzLCAweDAwMjYsIDB4NzEwYywKKwkweDIwMTEsIDB4MDA0MCwgMHhhMTgyLCAweDAwNDAsIDB4MDBjOCwgMHgxNDY4LCAweDIxMTAsIDB4YTAwNiwKKwkweDcwMGUsIDB4MjJhOCwgMHg1M2E2LCAweDgyMDMsIDB4NzgyMiwgMHg3ODAzLCAweDAwMjAsIDB4MzMwMCwKKwkweDcwMTYsIDB4NzgwMywgMHgwMDAxLCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDAyN2YsIDB4MDE3ZiwKKwkweDAwN2MsIDB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4MjA5OSwgMHhhNmZhLCAweDIwYTEsIDB4MDAxOCwKKwkweDIwYTksIDB4MDAwOCwgMHg1M2EzLCAweDc4MDMsIDB4MDAyMCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDc4MDMsIDB4MDA0MSwgMHg3MDA3LCAweDAwMDMsIDB4NzAwMCwgMHhjMDg0LCAweDcwMDIsIDB4NzAwYiwKKwkweGE2ZjUsIDB4MTI3ZiwgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgwMDdjLCAweDEzN2UsIDB4MTQ3ZSwKKwkweDE1N2UsIDB4MjAwMSwgMHhhNzI5LCAweDIwOWMsIDB4MjBhMSwgMHgwMDE0LCAweDc4MDMsIDB4MDAyNiwKKwkweDIwMDEsIDB4YTcyYSwgMHgyMGFjLCAweDUzYTYsIDB4MjA5OSwgMHhhNzJiLCAweDIwYTEsIDB4MDAxOCwKKwkweDIwYTksIDB4MDAwOCwgMHg1M2EzLCAweDc4MDMsIDB4MDAyMCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDc4MDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDQsIDB4NzAwMCwgMHhjMDhjLCAweDcwMDIsIDB4NzAwYiwKKwkweGE3MjYsIDB4MTI3ZiwgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MGU3ZSwKKwkweDIwNzEsIDB4YThkNiwgMHgwZjdlLCAweDIwNzksIDB4MDAxMCwgMHg3OTA0LCAweDc4MDMsIDB4MDAwMiwKKwkweGQxZmMsIDB4MDA0MCwgMHgxNGQwLCAweGExOGMsIDB4MDcwMCwgMHg3MDA0LCAweDEwNzksIDB4MTRkNCwKKwkweDBmN2YsIDB4MGU3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MTQwOCwgMHgxNGRjLCAweDE1MDksIDB4MTUzMSwKKwkweDE1NjQsIDB4MTRkYSwgMHgwMDc4LCAweDE0ZGEsIDB4YTE4YywgMHgwNzAwLCAweDAwYzAsIDB4MTUwMiwKKwkweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLCAweDcwMTQsIDB4MjBhMCwgMHgyMDk5LCAweDAwMTQsIDB4NzgwMywKKwkweDAwNDAsIDB4NzAxMCwgMHgyMGE4LCAweDUzYTUsIDB4MzQwMCwgMHg3MDE2LCAweDE1N2YsIDB4MTQ3ZiwKKwkweDEzN2YsIDB4NzAwYywgMHhhMDA1LCAweDAwNDAsIDB4MTUxZSwgMHgxMDc4LCAweDE0M2UsIDB4MDA3YywKKwkweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsIDB4MDEwMCwgMHg3MDA3LCAweDAwMDAsIDB4MTA3OCwKKwkweDE0MDgsIDB4MDA3YywgMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLCAweDAyMDAsIDB4MDA3OCwKKwkweDE0ZmQsIDB4YTE4YywgMHgwNzAwLCAweDAwYzAsIDB4MTUxNCwgMHg3MDBjLCAweGEwMDUsIDB4MDA0MCwKKwkweDE1MWUsIDB4MTA3OCwgMHgxNDU0LCAweDAwN2MsIDB4NzAwOCwgMHhhMDgwLCAweDAwMDIsIDB4MjAwMywKKwkweDAyMDAsIDB4NzAwNywgMHgwMDAwLCAweDEwNzgsIDB4MTQwOCwgMHgwMDdjLCAweDBkN2UsIDB4NzAwOCwKKwkweDIwNjgsIDB4NzgzMCwgMHg2ODI2LCAweDc4MzQsIDB4NjgyYSwgMHg3ODM4LCAweDY4MmUsIDB4NzgzYywKKwkweDY4MzIsIDB4NjgwYiwgMHgwMTAwLCAweDBkN2YsIDB4NzAwNywgMHgwMDAwLCAweDEwNzgsIDB4MTQwOCwKKwkweDAwN2MsIDB4YTE4YywgMHgwNzAwLCAweDAwYzAsIDB4MTU1ZSwgMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwKKwkweDIwMDEsIDB4YTZmOCwgMHgyMDA0LCAweGEwODAsIDB4MDAwZCwgMHgyMGEwLCAweDIwOTksIDB4MDAxNCwKKwkweDc4MDMsIDB4MDA0MCwgMHgyMGE5LCAweDAwMjAsIDB4NTNhNSwgMHgyMDAxLCAweGE2ZmEsIDB4MjAwNCwKKwkweGQwYmMsIDB4MDA0MCwgMHgxNTU0LCAweDIwMDEsIDB4YTcwMywgMHgyMDA0LCAweGEwODAsIDB4MDAwZCwKKwkweDIwYTAsIDB4MjBhOSwgMHgwMDIwLCAweDUzYTUsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsIDB4NzAwNywKKwkweDAwMDAsIDB4MTA3OCwgMHg0ZjhjLCAweDEwNzgsIDB4MTQwOCwgMHgwMDdjLCAweDIwMTEsIDB4ODAwMywKKwkweDEwNzgsIDB4MzYxYiwgMHgwMDc4LCAweDE1NjIsIDB4YTE4YywgMHgwNzAwLCAweDAwYzAsIDB4MTU3MSwKKwkweDIwMDEsIDB4YTcyOCwgMHgyMDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLCAweDEwNzgsIDB4MTQwOCwKKwkweDAwN2MsIDB4MjAxMSwgMHg4MDA0LCAweDEwNzgsIDB4MzYxYiwgMHgwMDc4LCAweDE1NzUsIDB4MTI3ZSwKKwkweDIwOTEsIDB4MjEwMCwgMHgyMDc5LCAweDAwMzAsIDB4MjA3MSwgMHhhOGU3LCAweDc4MDMsIDB4MDAwNCwKKwkweDcwMDMsIDB4MDAwMCwgMHg3MDBmLCAweGE4ZWQsIDB4NzAxMywgMHhhOGVkLCAweDc4MGYsIDB4MDA3NiwKKwkweDc4MDMsIDB4MDAwNCwgMHgxMjdmLCAweDAwN2MsIDB4NjkzNCwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwKKwkweDE1OTEsIDB4MTU5OSwgMHgxNWRmLCAweDE1OTksIDB4MTU5OSwgMHgxNTk5LCAweDE1YzQsIDB4MTVhOCwKKwkweDE1OWQsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MTVmOSwgMHg2ODRjLCAweGQwYmMsIDB4MDA0MCwKKwkweDE1OTksIDB4Njg2MCwgMHg2ODJlLCAweDY4NWMsIDB4NjgyYSwgMHg2ODU4LCAweDAwNzgsIDB4MTVlNywKKwkweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMWUsIDB4MDBjMCwgMHgxNTk5LCAweDY4NGMsIDB4ZDBiYywKKwkweDAwNDAsIDB4MTU5OSwgMHg2ODYwLCAweDY4MmUsIDB4Njg1YywgMHg2ODJhLCAweDY4MDQsIDB4NjgxYSwKKwkweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIwNmEsIDB4MjAwNCwKKwkweDY4MzIsIDB4Njg1OCwgMHgwMDc4LCAweDE1ZWYsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxNSwKKwkweDAwYzAsIDB4MTU5OSwgMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHgxNTk5LCAweDY4MDQsIDB4NjgxYSwKKwkweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIwNmEsIDB4MjAwNCwKKwkweDY4MzIsIDB4YTAwNiwgMHg2ODJlLCAweDY4MmEsIDB4Njg1OCwgMHgwMDc4LCAweDE1ZWYsIDB4Njg0YywKKwkweGQwYWMsIDB4MDA0MCwgMHgxNTk5LCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDY4NTgsIDB4YTE4YywKKwkweDAwMGYsIDB4YTE4OCwgMHgyMDZhLCAweDIxMGMsIDB4NjkzMiwgMHgyZDA4LCAweDY5MWEsIDB4NjgyNiwKKwkweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweGEwMDYsIDB4NjgwYSwgMHg2OTdjLCAweDY5MTIsIDB4Njk4MCwKKwkweDY5MTYsIDB4MDA3YywgMHgyMGUxLCAweDAwMDcsIDB4MjBlMSwgMHgyMDAwLCAweDIwMDEsIDB4MDIwYSwKKwkweDIwMDQsIDB4ODJmZiwgMHgwMDQwLCAweDE2MWMsIDB4YTI4MCwgMHgwMDA0LCAweDBkN2UsIDB4MjA2YywKKwkweDY4NGMsIDB4ZDBkYywgMHgwMGMwLCAweDE2MTgsIDB4MTA3OCwgMHgxNThjLCAweDAwNDAsIDB4MTYxOCwKKwkweDBkN2YsIDB4YTI4MCwgMHgwMDAwLCAweDIwMDMsIDB4MDAwMiwgMHhhMDE2LCAweDAwNzgsIDB4MTYxYywKKwkweDY4MDgsIDB4ODAwMCwgMHg2ODBhLCAweDBkN2YsIDB4MTI3ZSwgMHgwNDdlLCAweDAzN2UsIDB4MDI3ZSwKKwkweDIwOTEsIDB4MjEwMCwgMHgwMjdmLCAweDAzN2YsIDB4MDQ3ZiwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwKKwkweDE2MzAsIDB4NzIwNiwgMHgyMDAxLCAweDE2NTEsIDB4MDA3ZSwgMHgyMjYwLCAweDAwNzgsIDB4MTdlMCwKKwkweDcxMGMsIDB4MjIwYSwgMHg4MTA4LCAweDIzMGEsIDB4ODEwOCwgMHgyNDBhLCAweDgxMDgsIDB4YTE4MiwKKwkweGE5MDgsIDB4MDA0OCwgMHgxNjNkLCAweDIwMDksIDB4YThlZCwgMHg3MTBlLCAweDcwMTAsIDB4YTEwMiwKKwkweGEwODIsIDB4MDAwOSwgMHgwMDQwLCAweDE2NDgsIDB4YTA4MCwgMHgwMDFiLCAweDAwYzAsIDB4MTY0YiwKKwkweDIwMDksIDB4MDEzOCwgMHgyMDBhLCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDE2NTEsIDB4MTA3OCwKKwkweDE3YzEsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDBjN2UsIDB4MDA3ZSwKKwkweDIwOTEsIDB4MjEwMCwgMHgwMDdmLCAweDA0N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDBkN2UsIDB4MGM3ZSwKKwkweDI0NjAsIDB4NjExMCwgMHgyMTY4LCAweDZhNjIsIDB4NmI1ZSwgMHhhMDA1LCAweDAwNDAsIDB4MTZkZCwKKwkweDY4MDgsIDB4YTAwNSwgMHgwMDQwLCAweDE3NGEsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MTY3MiwKKwkweDAwNzgsIDB4MTZkMiwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMGMwLCAweDE3NTMsIDB4NzAwNCwKKwkweGE0MDYsIDB4MDBjMCwgMHgxNmQyLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsIDB4MDA0MCwKKwkweDE2OGYsIDB4MDQ3ZSwgMHgxMDc4LCAweDE5MTMsIDB4MDQ3ZiwgMHgyNDYwLCAweDYwMTAsIDB4YTA4MCwKKwkweDAwMDIsIDB4MjAwNCwgMHhhMDA1LCAweDAwNDAsIDB4MTc0YSwgMHgwMDc4LCAweDE2NmMsIDB4MjAwMSwKKwkweDAyMDcsIDB4MjAwNCwgMHhkMDljLCAweDAwYzAsIDB4MTY3YiwgMHg3ODA0LCAweGEwODQsIDB4NjAwMCwKKwkweDAwNDAsIDB4MTZhMCwgMHhhMDg2LCAweDYwMDAsIDB4MDA0MCwgMHgxNmEwLCAweDAwNzgsIDB4MTY3YiwKKwkweDcxMDAsIDB4YTE4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTZjMCwgMHgwZTdlLCAweDJiNjgsIDB4NjgxOCwKKwkweDIwNjAsIDB4MTA3OCwgMHgyMDNmLCAweDI4MDQsIDB4YWM3MCwgMHg2MDM0LCAweGQwOWMsIDB4MDBjMCwKKwkweDE2YjUsIDB4NzEwOCwgMHg3MjBjLCAweDAwNzgsIDB4MTZiNywgMHg3MTEwLCAweDcyMTQsIDB4NjgxMCwKKwkweGExMDAsIDB4NjgxMiwgMHg2ODE0LCAweGEyMDEsIDB4NjgxNiwgMHgwZTdmLCAweDAwNzgsIDB4MTZjNCwKKwkweGExODYsIDB4MDAwMSwgMHgwMGMwLCAweDE2Y2MsIDB4NzgyMCwgMHg2OTEwLCAweGExMDAsIDB4NjgxMiwKKwkweDc4MjQsIDB4NjkxNCwgMHhhMTAxLCAweDY4MTYsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwKKwkweDcwMDQsIDB4MjA2MCwgMHg2MTAwLCAweGExOGUsIDB4MDAwNCwgMHgwMGMwLCAweDE3NTMsIDB4MjAwOSwKKwkweDAwNDgsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsIDB4MTc1MywgMHg2ODA4LCAweGEwMDUsIDB4MDA0MCwKKwkweDE3NGEsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MTZlNywgMHgwMDc4LCAweDE3NGEsIDB4NzAwYywKKwkweDcxMTAsIDB4YTEwNiwgMHgwMGMwLCAweDE2ZjAsIDB4NzAwNCwgMHhhNDA2LCAweDAwYzAsIDB4MTc0YSwKKwkweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsIDB4MDA0MCwgMHgxNzA0LCAweDA0N2UsIDB4MTA3OCwKKwkweDE5MTMsIDB4MDQ3ZiwgMHgyNDYwLCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDQsIDB4YTAwNSwKKwkweDAwNDAsIDB4MTc0YSwgMHgwMDc4LCAweDE2ZTEsIDB4MjAwMSwgMHgwMjA3LCAweDIwMDQsIDB4ZDA5YywKKwkweDAwYzAsIDB4MTZmMCwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMDhjLCAweDAwYzAsIDB4MTZmNiwKKwkweDc4MDQsIDB4YTA4NCwgMHg2MDAwLCAweDAwNDAsIDB4MTcxYiwgMHhhMDg2LCAweDYwMDAsIDB4MDA0MCwKKwkweDE3MWIsIDB4MDA3OCwgMHgxNmYwLCAweDcwMDcsIDB4MDAwMCwgMHhhMDE2LCAweDIyMTgsIDB4NzAwMCwKKwkweGEwOGUsIDB4MDAwMSwgMHgwMDQwLCAweDE3M2MsIDB4YTA4ZSwgMHgwMDAyLCAweDAwYzAsIDB4MTc0YSwKKwkweDBjN2UsIDB4MGU3ZSwgMHg2ODE4LCAweDIwNjAsIDB4MTA3OCwgMHgyMDNmLCAweDI4MDQsIDB4YWM3MCwKKwkweDYwMzQsIDB4ZDA5YywgMHgwMGMwLCAweDE3MzgsIDB4NzMwOCwgMHg3MjBjLCAweDAwNzgsIDB4MTczYSwKKwkweDczMTAsIDB4NzIxNCwgMHgwZTdmLCAweDBjN2YsIDB4NzgyMCwgMHhhMzE4LCAweDc4MjQsIDB4YTIxMSwKKwkweDY4MTAsIDB4YTMwMCwgMHg2ODEyLCAweDY4MTQsIDB4YTIwMSwgMHg2ODE2LCAweDc4MDMsIDB4MDAwNCwKKwkweDcwMDMsIDB4MDAwMCwgMHg2MTAwLCAweGExOGUsIDB4MDAwNCwgMHgwMGMwLCAweDE3NTMsIDB4MjAwOSwKKwkweDAwNDgsIDB4MTA3OCwgMHg3NzVjLCAweDBjN2YsIDB4MGQ3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MGY3ZSwKKwkweDBlN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MDU3ZSwgMHgyMDcxLCAweGE4ZTcsIDB4NzAwMCwKKwkweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDE3YmEsIDB4NzAwNCwgMHhhYzA2LCAweDAwYzAsIDB4MTdhYiwKKwkweDIwNzksIDB4MDAzMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDE3YWIsIDB4NzgwNCwKKwkweGQwZmMsIDB4MDBjMCwgMHgxN2E3LCAweDIwZTEsIDB4NjAwMCwgMHgyMDExLCAweDAwMzIsIDB4MjAwMSwKKwkweDAyMDgsIDB4MjAwYywgMHgyMDAxLCAweDAyMDksIDB4MjAwNCwgMHhhMTA2LCAweDAwYzAsIDB4MTc2ZiwKKwkweDgyMTEsIDB4MDBjMCwgMHgxNzc3LCAweDc4MDQsIDB4ZDBmYywgMHgwMGMwLCAweDE3YTcsIDB4MTA3OCwKKwkweDFiMjIsIDB4MDI3ZSwgMHgwNTdlLCAweDc4MDMsIDB4MDAwNCwgMHg3ODA0LCAweGQwYWMsIDB4MDBjMCwKKwkweDE3OGQsIDB4NzgwMywgMHgwMDAyLCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDMsIDB4NzAwNywKKwkweDAwMDAsIDB4MDU3ZiwgMHgwMjdmLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDAxNjAsIDB4MjUwMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwgMHgwMDc4LCAweDE3YWIsIDB4MTA3OCwKKwkweDE5MTMsIDB4MDA3OCwgMHgxNzVmLCAweDE1N2UsIDB4MjBhOSwgMHgwMDA5LCAweDIwMDksIDB4YThlZCwKKwkweDIxMDQsIDB4YWMwNiwgMHgwMGMwLCAweDE3YjUsIDB4MjAwYSwgMHhhMTg4LCAweDAwMDMsIDB4MDBmMCwKKwkweDE3YjAsIDB4MTU3ZiwgMHgwNTdmLCAweDA0N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDBlN2YsIDB4MGY3ZiwKKwkweDAwN2MsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDBjMCwgMHgxN2M5LCAweDcwMDMsIDB4MDAwMCwKKwkweDAwN2MsIDB4MjEwNCwgMHg3MDA2LCAweDIwNjAsIDB4ODEwOCwgMHgyMTFjLCAweDgxMDgsIDB4MjEyNCwKKwkweDgxMDgsIDB4YTE4MiwgMHhhOTA4LCAweDAwNDgsIDB4MTdkNywgMHgyMDA5LCAweGE4ZWQsIDB4NzExMiwKKwkweDcwMGMsIDB4YTEwNiwgMHgwMGMwLCAweDE3ZTAsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwOCwKKwkweDhjZmYsIDB4MDBjMCwgMHgxN2U3LCAweDEwNzgsIDB4MWI0ZCwgMHgwMDc4LCAweDE4NTQsIDB4NjAxMCwKKwkweDIwNjgsIDB4MmQ1OCwgMHg2ODI4LCAweGE0MDYsIDB4MDBjMCwgMHgxN2YyLCAweDY4MmMsIDB4YTMwNiwKKwkweDAwNDAsIDB4MTgyZiwgMHg2MDFjLCAweGEwODYsIDB4MDAwOCwgMHgwMDQwLCAweDE4MmYsIDB4NjAyNCwKKwkweGQwZjQsIDB4MDBjMCwgMHgxODFjLCAweGQwZDQsIDB4MDA0MCwgMHgxODE4LCAweDYwMzgsIDB4YTQwMiwKKwkweDYwMzQsIDB4YTMwMywgMHgwMDQwLCAweDE4MDYsIDB4MDBjOCwgMHgxODE4LCAweDY0M2EsIDB4NjMzNiwKKwkweDZjMmEsIDB4NmIyZSwgMHgwNDdlLCAweDAzN2UsIDB4MjQwMCwgMHg2YzdjLCAweGE0MDIsIDB4NjgxMiwKKwkweDIzMDAsIDB4NmI4MCwgMHhhMzAzLCAweDY4MTYsIDB4MDM3ZiwgMHgwNDdmLCAweDAwNzgsIDB4MTgxYywKKwkweDEwNzgsIDB4OTA1MywgMHgwMDQwLCAweDE3ZTMsIDB4MjAwMSwgMHhhNjc0LCAweDIwMDQsIDB4ZDBiNCwKKwkweDAwYzAsIDB4MTgyYiwgMHg2MDE4LCAweDIwMDQsIDB4ZDBiYywgMHgwMGMwLCAweDE4MmIsIDB4NjgxNywKKwkweDdmZmYsIDB4NjgxMywgMHhmZmZmLCAweDEwNzgsIDB4MjA4YSwgMHgwMGMwLCAweDE3ZTMsIDB4MGM3ZSwKKwkweDcwMDQsIDB4MjA2MCwgMHg2MDI0LCAweGMwZDQsIDB4NjAyNiwgMHgwYzdmLCAweDY4NGMsIDB4ZDBmNCwKKwkweDAwNDAsIDB4MTg0MCwgMHg2ODE3LCAweGZmZmYsIDB4NjgxMywgMHhmZmZmLCAweDAwNzgsIDB4MTdlMywKKwkweDY4MjQsIDB4MjA1MCwgMHg2ODE4LCAweDIwNjAsIDB4NjgzMCwgMHgyMDQwLCAweDYwMzQsIDB4YTBjYywKKwkweDAwMGYsIDB4MjAwOSwgMHgwMDExLCAweDEwNzgsIDB4MTg1NSwgMHgwMDQwLCAweDE4NTMsIDB4MjAwOSwKKwkweDAwMDEsIDB4MTA3OCwgMHgxODU1LCAweDJkNTgsIDB4MDA3YywgMHg4YWZmLCAweDAwNDAsIDB4MThlYywKKwkweGEwM2UsIDB4MjczMCwgMHg2ODUwLCAweGQwZmMsIDB4MDBjMCwgMHgxODc3LCAweGQwZjQsIDB4MDBjMCwKKwkweDE4ODcsIDB4MGQ3ZSwgMHgyODA0LCAweGFjNjgsIDB4MjkwMCwgMHgwMDc5LCAweDE4NjcsIDB4MThjZSwKKwkweDE4OGUsIDB4MTg4ZSwgMHgxOGNlLCAweDE4Y2UsIDB4MThjNiwgMHgxOGNlLCAweDE4OGUsIDB4MThjZSwKKwkweDE4OTQsIDB4MTg5NCwgMHgxOGNlLCAweDE4Y2UsIDB4MThjZSwgMHgxOGJkLCAweDE4OTQsIDB4YzBmYywKKwkweDY4NTIsIDB4NmI2YywgMHg2YTcwLCAweDZkMWMsIDB4NmMyMCwgMHgwZDdlLCAweGQ5OWMsIDB4MDA0MCwKKwkweDE4ZDEsIDB4MjgwNCwgMHhhYzY4LCAweDZmMDgsIDB4NmUwYywgMHgwMDc4LCAweDE4ZDEsIDB4YzBmNCwKKwkweDY4NTIsIDB4NmI2YywgMHg2YTcwLCAweDBkN2UsIDB4MDA3OCwgMHgxOGQ4LCAweDZiMDgsIDB4NmEwYywKKwkweDZkMDAsIDB4NmMwNCwgMHgwMDc4LCAweDE4ZDEsIDB4N2IwYywgMHhkM2JjLCAweDAwNDAsIDB4MThiNSwKKwkweDcwMDQsIDB4MGU3ZSwgMHgyMDcwLCAweDcwMWMsIDB4MGU3ZiwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwKKwkweDE4YjUsIDB4N2IwOCwgMHhhMzljLCAweDBmZmYsIDB4MmQyMCwgMHgwZDdmLCAweDBkN2UsIDB4NmExNCwKKwkweDgyZmYsIDB4MDBjMCwgMHgxOGIwLCAweDY4MTAsIDB4YTMwMiwgMHgwMDQ4LCAweDE4YjAsIDB4NmIxMCwKKwkweDIwMTEsIDB4MDAwMCwgMHgyNDY4LCAweDAwNzgsIDB4MThiNywgMHg2YjEwLCAweDZhMTQsIDB4NmQwMCwKKwkweDZjMDQsIDB4NmYwOCwgMHg2ZTBjLCAweDAwNzgsIDB4MThkMSwgMHgwZDdmLCAweDBkN2UsIDB4NjgzNCwKKwkweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MDBjMCwgMHgxOGNlLCAweDBkN2YsIDB4MTA3OCwKKwkweDIwMjYsIDB4MDBjMCwgMHgxODU1LCAweGEwMGUsIDB4MDA3OCwgMHgxOGVjLCAweDBkN2YsIDB4MTA3OCwKKwkweDEzMzIsIDB4N2IyMiwgMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLCAweDdlM2UsIDB4NzkwMiwKKwkweDcwMDAsIDB4ODAwMCwgMHg3MDAyLCAweDBkN2YsIDB4NjgyOCwgMHhhMzAwLCAweDY4MmEsIDB4NjgyYywKKwkweGEyMDEsIDB4NjgyZSwgMHgyMzAwLCAweDZiMTAsIDB4YTMwMiwgMHg2ODEyLCAweDIyMDAsIDB4NmExNCwKKwkweGEyMDMsIDB4NjgxNiwgMHgxMDc4LCAweDIwMjYsIDB4MDA3YywgMHgxMDc4LCAweDEzMzIsIDB4MTA3OCwKKwkweDFjOTcsIDB4NzAwNCwgMHgyMDYwLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDcwMDMsIDB4MDAwMCwKKwkweDEwNzgsIDB4MWFmNCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHgxOTBjLCAweDY4MDgsIDB4ODAwMSwKKwkweDY4MGEsIDB4Njk3YywgMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwgMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwKKwkweGZmZmYsIDB4Njg1MCwgMHhjMGJkLCAweDY4NTIsIDB4MGQ3ZiwgMHgxMDc4LCAweDhhMDEsIDB4MDA3OCwKKwkweDFhZGIsIDB4MTA3OCwgMHgxMzMyLCAweDEyN2UsIDB4MjA5MSwgMHgyMTAwLCAweDAwN2UsIDB4MDE3ZSwKKwkweDJiNjgsIDB4NjgxOCwgMHgyMDYwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLCAweGExODQsIDB4MDcwMCwKKwkweDAwYzAsIDB4MThlZiwgMHhhMTg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4MTkxMSwKKwkweDcwMDAsIDB4MDA3OSwgMHgxOTJiLCAweDE5MzMsIDB4MTkzNSwgMHgxYTM0LCAweDFhYjIsIDB4MWFjOSwKKwkweDE5MzMsIDB4MTkzMywgMHgxOTMzLCAweDEwNzgsIDB4MTMzMiwgMHg4MDAxLCAweDcwMDIsIDB4YTE4NCwKKwkweDA4ODAsIDB4MDBjMCwgMHgxOTRhLCAweDhhZmYsIDB4MDA0MCwgMHgxOWQ0LCAweDIwMDksIDB4MDAwMSwKKwkweDEwNzgsIDB4MTg1NSwgMHgwMDQwLCAweDFhZGIsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MTg1NSwKKwkweDAwNzgsIDB4MWFkYiwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweGQxYmMsIDB4MDBjMCwKKwkweDE5YjIsIDB4MDI3ZSwgMHgwMzdlLCAweDAxN2UsIDB4NzgwOCwgMHhkMGVjLCAweDAwYzAsIDB4MTk2MiwKKwkweDdjMjAsIDB4N2QyNCwgMHg3ZTMwLCAweDdmMzQsIDB4NzgwMywgMHgwMDA5LCAweDcwMDMsIDB4MDAwNCwKKwkweDAwNzgsIDB4MTk2NCwgMHgxMDc4LCAweDFiZDcsIDB4MDE3ZiwgMHhkMTk0LCAweDAwNDAsIDB4MTk2YiwKKwkweDhhZmYsIDB4MDA0MCwgMHgxOWExLCAweDZiMjgsIDB4NmEyYywgMHgyNDAwLCAweDY4NmUsIDB4YTMxYSwKKwkweDI1MDAsIDB4Njg3MiwgMHhhMjEzLCAweDZiMmEsIDB4NmEyZSwgMHgwYzdlLCAweDcwMDQsIDB4MjA2MCwKKwkweDYwMjQsIDB4ZDBmNCwgMHgwMGMwLCAweDE5N2UsIDB4NjMzYSwgMHg2MjM2LCAweDBjN2YsIDB4MjQwMCwKKwkweDY5MTAsIDB4YTEwMCwgMHg2ODEyLCAweDI1MDAsIDB4NjkxNCwgMHhhMTAxLCAweDY4MTYsIDB4MDM3ZiwKKwkweDAyN2YsIDB4MjYwMCwgMHg2ODFlLCAweDI3MDAsIDB4NjgyMiwgMHgxMDc4LCAweDIwM2YsIDB4MmEwMCwKKwkweDY4MjYsIDB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwKKwkweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDAwYzAsIDB4MTlhNywgMHg2ODRjLCAweGQwZTQsIDB4MDA0MCwKKwkweDE5YTcsIDB4NzAwNCwgMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc3NWMsIDB4NzAwMCwKKwkweGEwODYsIDB4MDAwNCwgMHgwMDQwLCAweDFhZGIsIDB4NzAwMywgMHgwMDAwLCAweDEwNzgsIDB4MTdjMSwKKwkweDAwNzgsIDB4MWFkYiwgMHgwNTdlLCAweDdkMGMsIDB4ZDViYywgMHgwMGMwLCAweDE5YjksIDB4MTA3OCwKKwkweGE1N2UsIDB4MDU3ZiwgMHgxMDc4LCAweDFhZjQsIDB4MGY3ZSwgMHg3MDA0LCAweDIwNzgsIDB4MTA3OCwKKwkweDQ5NjMsIDB4MDA0MCwgMHgxOWM2LCAweDc4MjQsIDB4YzBmNSwgMHg3ODI2LCAweDBmN2YsIDB4NjgyYiwKKwkweGZmZmYsIDB4NjgyZiwgMHhmZmZmLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwKKwkweDY5ODAsIDB4NjkxNiwgMHgwMDc4LCAweDFhZGIsIDB4NzAwNCwgMHgwYzdlLCAweDIwNjAsIDB4NjAyNCwKKwkweDBjN2YsIDB4ZDBmNCwgMHgwMDQwLCAweDE5ZTEsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4MDA3OCwKKwkweDE5ZjUsIDB4Njg0YywgMHhjMGY1LCAweDY4NGUsIDB4NzgxNCwgMHhhMDA1LCAweDAwYzAsIDB4MTlmOSwKKwkweDcwMDMsIDB4MDAwMCwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMGMwLCAweDE5ZjUsIDB4NzAwNCwKKwkweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4Nzc1YywgMHgxMDc4LCAweDE3YzEsIDB4MDA3OCwKKwkweDFhZGIsIDB4NzgxNCwgMHg2OTEwLCAweGExMDIsIDB4NjgxMiwgMHg2OTE0LCAweGExODMsIDB4MDAwMCwKKwkweDY4MTYsIDB4NzgxNCwgMHg3OTA4LCAweGExOGMsIDB4MGZmZiwgMHhhMTkyLCAweDA4NDEsIDB4MDBjOCwKKwkweDE4ZWYsIDB4YTE4OCwgMHgwMDA3LCAweDgxMTQsIDB4ODIxNCwgMHg4MjE0LCAweGExMGEsIDB4ODEwNCwKKwkweDgwMDQsIDB4ODAwNCwgMHhhMjBhLCAweDgxMGIsIDB4ODEwYiwgMHg4MTBiLCAweDEwNzgsIDB4MWI1ZSwKKwkweDc4MDMsIDB4MDAwNCwgMHg3ODBmLCAweGZmZmYsIDB4NzgwMywgMHgwMDAxLCAweDc4MDQsIDB4ZDBmYywKKwkweDAwNDAsIDB4MWExZSwgMHg3ODAzLCAweDAwMDIsIDB4NzgwMywgMHgwMDA0LCAweDc4MGYsIDB4MDA3NiwKKwkweDcwMDQsIDB4NzAwNywgMHgwMDAwLCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4Nzc1YywKKwkweDEwNzgsIDB4MWI5MiwgMHgwMDQwLCAweDE5ZjUsIDB4ODAwMSwgMHg3MDAyLCAweGQxOTQsIDB4MDA0MCwKKwkweDFhNDYsIDB4NzgwNCwgMHhkMGZjLCAweDAwYzAsIDB4MTkxYiwgMHg4YWZmLCAweDAwNDAsIDB4MWFkYiwKKwkweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDE4NTUsIDB4MDA3OCwgMHgxYWRiLCAweGExODQsIDB4MDg4MCwKKwkweDAwYzAsIDB4MWE1MywgMHg4YWZmLCAweDAwNDAsIDB4MWFkYiwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwKKwkweDE4NTUsIDB4MDA3OCwgMHgxYWRiLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4ZDFiYywKKwkweDAwYzAsIDB4MWE5MywgMHgwMjdlLCAweDAzN2UsIDB4NzgwOCwgMHhkMGVjLCAweDAwYzAsIDB4MWE2NiwKKwkweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDQsIDB4MDA3OCwgMHgxYTY4LCAweDEwNzgsIDB4MWJkNywKKwkweDZiMjgsIDB4NmEyYywgMHgxMDc4LCAweDIwM2YsIDB4MGQ3ZSwgMHgwZjdlLCAweDJkNzgsIDB4MjgwNCwKKwkweGFjNjgsIDB4NjAzNCwgMHhkMDljLCAweDAwYzAsIDB4MWE4MywgMHg2ODA4LCAweDIwMDgsIDB4YTMxYSwKKwkweDY4MGMsIDB4YTIxMywgMHg3ODEwLCAweGExMDAsIDB4NzgxMiwgMHg2OTBjLCAweDc4MTQsIDB4YTEwMSwKKwkweDc4MTYsIDB4MDA3OCwgMHgxYThmLCAweDY4MTAsIDB4MjAwOCwgMHhhMzFhLCAweDY4MTQsIDB4YTIxMywKKwkweDc4MTAsIDB4YTEwMCwgMHg3ODEyLCAweDY5MTQsIDB4NzgxNCwgMHhhMTAxLCAweDc4MTYsIDB4MGY3ZiwKKwkweDBkN2YsIDB4MDA3OCwgMHgxOTZkLCAweDA1N2UsIDB4N2QwYywgMHgxMDc4LCAweGE1N2UsIDB4MDU3ZiwKKwkweDEwNzgsIDB4MWFmNCwgMHgwZjdlLCAweDcwMDQsIDB4MjA3OCwgMHgxMDc4LCAweDQ5NjMsIDB4MDA0MCwKKwkweDFhYTQsIDB4NzgyNCwgMHhjMGY1LCAweDc4MjYsIDB4MGY3ZiwgMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwKKwkweGZmZmYsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4Njk3YywgMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwKKwkweDAwNzgsIDB4MWFkYiwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4YTAwZCwKKwkweDAwNDAsIDB4MWFjNSwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMGMwLCAweDFhYzUsIDB4NzAwNCwKKwkweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4Nzc1YywgMHgxMDc4LCAweDE3YzEsIDB4MDA3OCwKKwkweDFhZGIsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4NjAxMCwKKwkweGEwMDUsIDB4MDA0MCwgMHgxYWM1LCAweDIwNjgsIDB4NjgwOCwgMHg4MDAwLCAweDY4MGEsIDB4NmMyOCwKKwkweDZiMmMsIDB4MTA3OCwgMHgxN2UwLCAweDAxN2YsIDB4MDA3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwKKwkweDIwOTEsIDB4MjEwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDFhZjIsIDB4NzAwYywKKwkweDcxMTAsIDB4YTEwNiwgMHgwMDQwLCAweDFhZjIsIDB4MjBlMSwgMHg5MDI4LCAweDcwMGYsIDB4YThlZCwKKwkweDcwMTMsIDB4YThlZCwgMHgxMjdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMDc4LCAweDFiMjIsIDB4MjBlMSwKKwkweDkwMjgsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDA0MCwgMHgxYjE5LCAweDIxMDQsIDB4YTAwNSwKKwkweDAwNDAsIDB4MWIwOCwgMHgyMDYwLCAweDYwMTAsIDB4MjA2MCwgMHg2MDA4LCAweDgwMDEsIDB4NjAwYSwKKwkweGExODgsIDB4MDAwMywgMHhhMTgyLCAweGE5MDgsIDB4MDA0OCwgMHgxYjEwLCAweDIwMDksIDB4YThlZCwKKwkweDcxMTIsIDB4NzAwYywgMHhhMTA2LCAweDAwYzAsIDB4MWFmOSwgMHgyMDExLCAweDAwMDgsIDB4MDA3OCwKKwkweDFhZjksIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwKKwkweDBjN2YsIDB4MDA3YywgMHgyMDAxLCAweDAxMzgsIDB4MjAxNCwgMHgyMDAzLCAweDAwMDAsIDB4MjAyMSwKKwkweGIwMTUsIDB4MjAwMSwgMHgwMTQxLCAweDIwMWMsIDB4ZDNkYywgMHgwMGMwLCAweDFiM2YsIDB4MjAwMSwKKwkweDAxMDksIDB4MjAxYywgMHhhMzljLCAweDAwNDgsIDB4MDBjMCwgMHgxYjNmLCAweDIwMDEsIDB4MDExMSwKKwkweDIwMWMsIDB4ODNmZiwgMHgwMGMwLCAweDFiM2YsIDB4ODQyMSwgMHgwMGMwLCAweDFiMjksIDB4MDA3YywKKwkweDIwMTEsIDB4MDIwMSwgMHgyMDA5LCAweDAwM2MsIDB4MjIwNCwgMHhhMDA1LCAweDAwYzAsIDB4MWI0YywKKwkweDgxMDksIDB4MDBjMCwgMHgxYjQ0LCAweDAwN2MsIDB4MDA3YywgMHgxMDc4LCAweDFiNDAsIDB4MDA0MCwKKwkweDFiNTUsIDB4NzgwYywgMHhkMGE0LCAweDAwNDAsIDB4MWI1YiwgMHgxMDc4LCAweDFhZjQsIDB4YTA4NSwKKwkweDAwMDEsIDB4MDA3OCwgMHgxYjVkLCAweDEwNzgsIDB4MWI5MiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwKKwkweDAyMDAsIDB4NzgwOCwgMHhhMDg0LCAweGYwMDAsIDB4YTEwZCwgMHgxMDc4LCAweDFiMjIsIDB4MjAxOSwKKwkweDUwMDAsIDB4ODMxOSwgMHgwMDQwLCAweDFiN2MsIDB4MjAwMSwgMHhhOTA4LCAweDIwMDQsIDB4YTA4NiwKKwkweDAwMDAsIDB4MDA0MCwgMHgxYjdjLCAweDIwMDEsIDB4MDAyMSwgMHhkMGZjLCAweDAwNDAsIDB4MWI2OSwKKwkweDEwNzgsIDB4MWVhYSwgMHgwMDc4LCAweDFiNjcsIDB4MjBlMSwgMHg3MDAwLCAweDczMjQsIDB4NzQyMCwKKwkweDcwMjgsIDB4NzAyOCwgMHg3NDI2LCAweDcwMzcsIDB4MDAwMSwgMHg4MTBmLCAweDcxMmUsIDB4NzAyZiwKKwkweDAxMDAsIDB4NzAzNywgMHgwMDA4LCAweDczMjYsIDB4NzQyMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwKKwkweDBlN2YsIDB4MDA3YywgMHgwMjdlLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAxLCAweDAwMDAsIDB4NzkwOCwKKwkweGExOGMsIDB4MGZmZiwgMHhhMTgyLCAweDBmZmQsIDB4MDA0OCwgMHgxYmEwLCAweDIwMDksIDB4MDAwMCwKKwkweGExOTAsIDB4MDAwNywgMHhhMjk0LCAweDFmZjgsIDB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4MjAwMSwKKwkweDAyMGEsIDB4ODJmZiwgMHgwMDQwLCAweDFiYjUsIDB4MjBlMSwgMHg2MDAwLCAweDIwMGMsIDB4MjAwYywKKwkweDIwMGMsIDB4MjAwYywgMHg4MjExLCAweDAwYzAsIDB4MWJhZSwgMHgyMGUxLCAweDcwMDAsIDB4MjAwYywKKwkweDIwMGMsIDB4NzAwMywgMHgwMDAwLCAweDIwZTEsIDB4NjAwMCwgMHgyMDAxLCAweDAyMDgsIDB4MjAwYywKKwkweDIwMDEsIDB4MDIwOSwgMHgyMDA0LCAweGExMDYsIDB4MDA0MCwgMHgxYmQ0LCAweDEwNzgsIDB4MWI0MCwKKwkweDAwNDAsIDB4MWJkMiwgMHg3OTA4LCAweGQxZWMsIDB4MDBjMCwgMHgxYmQ0LCAweDc5MGMsIDB4ZDFhNCwKKwkweDAwNDAsIDB4MWI5NywgMHgxMDc4LCAweDFhZjQsIDB4YTAwNiwgMHgwMjdmLCAweDAwN2MsIDB4N2MyMCwKKwkweDdkMjQsIDB4N2UzMCwgMHg3ZjM0LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAwNDAsIDB4MWM2OSwKKwkweDcwMDQsIDB4MDE3ZSwgMHgyMTBjLCAweGExMDYsIDB4MDE3ZiwgMHgwMDQwLCAweDFjNjksIDB4MGQ3ZSwKKwkweDBjN2UsIDB4MjE2YywgMHgyZDAwLCAweGEwMDUsIDB4MDA0MCwgMHgxYzY3LCAweDY4MWMsIDB4YTA4NiwKKwkweDAwMDgsIDB4MDA0MCwgMHgxYzY3LCAweDY4MjQsIDB4ZDBkNCwgMHgwMGMwLCAweDFjNjcsIDB4NjgxMCwKKwkweDIwNjgsIDB4Njg1MCwgMHhkMGZjLCAweDAwNDAsIDB4MWMyOSwgMHg4MTA4LCAweDIxMDQsIDB4NmIyYywKKwkweGEzMDYsIDB4MDBjMCwgMHgxYzY3LCAweDgxMDgsIDB4MjEwNCwgMHg2YTI4LCAweGEyMDYsIDB4MDBjMCwKKwkweDFjNjcsIDB4Njg1MCwgMHhjMGZjLCAweGMwZjUsIDB4Njg1MiwgMHg2ODZjLCAweDc4MjIsIDB4Njg3MCwKKwkweDc4MjYsIDB4NjgxYywgMHg3ODMyLCAweDY4MjAsIDB4NzgzNiwgMHg2ODE4LCAweDIwNjAsIDB4NjAzNCwKKwkweGQwOWMsIDB4MDA0MCwgMHgxYzI0LCAweDY4MzAsIDB4MjAwNCwgMHhhYzY4LCAweDY4MDgsIDB4NzgzYSwKKwkweDY4MGMsIDB4NzgzZSwgMHgwMDc4LCAweDFjNjUsIDB4YTAwNiwgMHg3ODNhLCAweDc4M2UsIDB4MDA3OCwKKwkweDFjNjUsIDB4ODEwOCwgMHgyMTA0LCAweGEwMDUsIDB4MDBjMCwgMHgxYzY3LCAweDZiMmMsIDB4YTMwNiwKKwkweDAwYzAsIDB4MWM2NywgMHg4MTA4LCAweDIxMDQsIDB4YTAwNSwgMHgwMGMwLCAweDFjNjcsIDB4NmEyOCwKKwkweGEyMDYsIDB4MDBjMCwgMHgxYzY3LCAweDY4NTAsIDB4YzBmNSwgMHg2ODUyLCAweDY4MzAsIDB4MjAwNCwKKwkweDY5MTgsIDB4YTE2MCwgMHhhMTgwLCAweDAwMGQsIDB4MjAwNCwgMHhkMDljLCAweDAwYzAsIDB4MWM1NywKKwkweDYwMDgsIDB4NzgyMiwgMHg2ODZlLCAweDYwMGMsIDB4NzgyNiwgMHg2ODcyLCAweDYwMDAsIDB4NzgzMiwKKwkweDYwMDQsIDB4NzgzNiwgMHhhMDA2LCAweDc4M2EsIDB4NzgzZSwgMHgwMDc4LCAweDFjNjUsIDB4NjAxMCwKKwkweDc4MjIsIDB4Njg2ZSwgMHg2MDE0LCAweDc4MjYsIDB4Njg3MiwgMHg2MDAwLCAweDc4MzIsIDB4NjAwNCwKKwkweDc4MzYsIDB4NjAwOCwgMHg3ODNhLCAweDYwMGMsIDB4NzgzZSwgMHg3ODAzLCAweDAwMTEsIDB4MGM3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDIwNzEsIDB4YThlNywKKwkweDIwNzksIDB4MDAzMCwgMHgyMDExLCAweDAwNTAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwKKwkweDFjOTIsIDB4ODIxMSwgMHgwMDQwLCAweDFjOTAsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywKKwkweDAwNDAsIDB4MWM3OSwgMHg3OTA0LCAweGExOGMsIDB4MDc4MCwgMHgwMTdlLCAweDEwNzgsIDB4MTkxMywKKwkweDAxN2YsIDB4ODFmZiwgMHgwMGMwLCAweDFjOTAsIDB4MjAxMSwgMHgwMDUwLCAweDAwNzgsIDB4MWM3NCwKKwkweGEwODUsIDB4MDAwMSwgMHgwMjdmLCAweDAxN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4NzgwMywKKwkweDAwMDQsIDB4MjAwOSwgMHgwMDY0LCAweDc4MDQsIDB4ZDBhYywgMHgwMDQwLCAweDFjZTgsIDB4ODEwOSwKKwkweDAwYzAsIDB4MWM5YiwgMHgyMDA5LCAweDAxMDAsIDB4MjEwYywgMHhhMThhLCAweDAwMDMsIDB4MTA0OCwKKwkweDEzMzIsIDB4MTA3OCwgMHgxZmNhLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGE4ZDYsIDB4MjA3OSwKKwkweDAwMTAsIDB4NzAwNCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgxY2UwLCAweDc4MDAsIDB4MDA3ZSwKKwkweDc4MjAsIDB4MDA3ZSwgMHg3ODMwLCAweDAwN2UsIDB4NzgzNCwgMHgwMDdlLCAweDc4MzgsIDB4MDA3ZSwKKwkweDc4M2MsIDB4MDA3ZSwgMHg3ODAzLCAweDAwMDQsIDB4NzgyMywgMHgwMDAwLCAweDAwMDUsIDB4MDAwNSwKKwkweDIwNzksIDB4MDAzMCwgMHg3ODA0LCAweGQwYWMsIDB4MTBjMCwgMHgxMzMyLCAweDIwNzksIDB4MDAxMCwKKwkweDAwN2YsIDB4NzgzZSwgMHgwMDdmLCAweDc4M2EsIDB4MDA3ZiwgMHg3ODM2LCAweDAwN2YsIDB4NzgzMiwKKwkweDAwN2YsIDB4NzgyMiwgMHgwMDdmLCAweDc4MDIsIDB4MGY3ZiwgMHgwZTdmLCAweDAwNzgsIDB4MWNlNiwKKwkweDBmN2YsIDB4MGU3ZiwgMHg3ODA0LCAweGQwYWMsIDB4MTBjMCwgMHgxMzMyLCAweDEwNzgsIDB4NjM5YiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE5MDgsIDB4NzAwMywgMHgwMDAwLCAweDBlN2YsIDB4MDA3YywKKwkweDBkN2UsIDB4YTI4MCwgMHgwMDA0LCAweDIwNmMsIDB4Njk0YywgMHhkMWRjLCAweDAwYzAsIDB4MWQ2YiwKKwkweDY5MzQsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MWNmZCwgMHgxZDA1LCAweDFkNTYsIDB4MWQwNSwKKwkweDFkMDUsIDB4MWQwNSwgMHgxZDNiLCAweDFkMTgsIDB4MWQwNywgMHgxMDc4LCAweDEzMzIsIDB4Njg0YywKKwkweGQwYjQsIDB4MDA0MCwgMHgxZTc5LCAweDY4NjAsIDB4NjgyZSwgMHg2ODE2LCAweDY4NWMsIDB4NjgyYSwKKwkweDY4MTIsIDB4Njg3YywgMHg2ODBhLCAweDY4ODAsIDB4NjgwZSwgMHg2OTU4LCAweDAwNzgsIDB4MWQ1ZSwKKwkweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgwMGMwLCAweDFkMDUsIDB4Njg0YywKKwkweGQwYjQsIDB4MDA0MCwgMHgxZTc5LCAweDY4NjAsIDB4NjgyZSwgMHg2ODE2LCAweDY4NWMsIDB4NjgyYSwKKwkweDY4MTIsIDB4Njg3YywgMHg2ODBhLCAweDY4ODAsIDB4NjgwZSwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwKKwkweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDZhLCAweDIwMDQsIDB4NjgzMiwKKwkweDY5NTgsIDB4MDA3OCwgMHgxZDY3LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTUsIDB4MDBjMCwKKwkweDFkNmIsIDB4Njg0YywgMHhkMGI0LCAweDAwNDAsIDB4MWU3OSwgMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwKKwkweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDZhLCAweDIwMDQsIDB4NjgzMiwKKwkweDY5NTgsIDB4YTAwNiwgMHg2ODJlLCAweDY4MmEsIDB4MDA3OCwgMHgxZDY3LCAweDY4NGMsIDB4ZDBiNCwKKwkweDAwNDAsIDB4MThlZCwgMHg2OTU4LCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDJkMDAsIDB4NjgxYSwKKwkweDY4MzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjA2YSwgMHgyMDA0LCAweDY4MzIsIDB4NjkyNiwKKwkweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweDBkN2YsIDB4MDA3YywgMHgwZjdlLCAweDIwNzksIDB4MDAyMCwKKwkweDc4MDQsIDB4ZDBmYywgMHgxMGMwLCAweDFlYWEsIDB4MGU3ZSwgMHgwZDdlLCAweDIwNzEsIDB4YTkwOCwKKwkweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDFkZjAsIDB4MGM3ZSwgMHg3MjA2LCAweGEyODAsIDB4MDAwNCwKKwkweDIwNWMsIDB4NzAwNCwgMHgyMDY4LCAweDc4MDMsIDB4MDAwNCwgMHg2ODE4LCAweDBkN2UsIDB4MjA2OCwKKwkweDY4NmMsIDB4NzgxMiwgMHg2ODkwLCAweDBmN2UsIDB4MjBlMSwgMHg5MDQwLCAweDIwNzksIDB4MDIwMCwKKwkweDc4MWEsIDB4MjA3OSwgMHgwMTAwLCAweDgwMDQsIDB4NzhkNiwgMHgwZjdmLCAweDBkN2YsIDB4MmI2OCwKKwkweDY4MjQsIDB4MjA1MCwgMHg2ODE4LCAweDIwNjAsIDB4NjgzMCwgMHgyMDQwLCAweDYwMzQsIDB4YTBjYywKKwkweDAwMGYsIDB4NjkwOCwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDcsIDB4MDA0MCwKKwkweDFkYjIsIDB4YTE4NCwgMHgwMDA3LCAweDAwNDAsIDB4MWRiMiwgMHgwMTdlLCAweDIwMDksIDB4MDAwOCwKKwkweGExMDIsIDB4MDE3ZiwgMHhhMTA4LCAweDc5MWEsIDB4NzExNiwgMHg3MDFlLCAweDY4MGMsIDB4YTA4MSwKKwkweDAwMDAsIDB4NzgxZSwgMHg3MDFhLCAweGEwMDYsIDB4NzAwZSwgMHg3MDEyLCAweDcwMDQsIDB4NjkyYywKKwkweDY4MTQsIDB4YTEwNiwgMHgwMGMwLCAweDFkYzksIDB4NjkyOCwgMHg2ODEwLCAweGExMDYsIDB4MDA0MCwKKwkweDFkZDYsIDB4MDM3ZSwgMHgwNDdlLCAweDZiMTQsIDB4NmMxMCwgMHgxMDc4LCAweDIwOGEsIDB4MDQ3ZiwKKwkweDAzN2YsIDB4MDA0MCwgMHgxZGQ2LCAweDBjN2YsIDB4MDA3OCwgMHgxZGYwLCAweDhhZmYsIDB4MDBjMCwKKwkweDFkZGUsIDB4MGM3ZiwgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHgxZGYwLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3OSwgMHgwMDIwLCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDFkZjQsIDB4MDA0MCwKKwkweDFkZWQsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MWRmNCwgMHgxMjdmLCAweDBjN2YsIDB4YTAwNiwKKwkweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MDc3ZSwgMHgwNjdlLCAweDA1N2UsIDB4MDQ3ZSwKKwkweDAzN2UsIDB4MDI3ZSwgMHg4YWZmLCAweDAwNDAsIDB4MWU3MiwgMHg3MDBjLCAweDcyMTQsIDB4YTIzYSwKKwkweDcwMTAsIDB4NzIxOCwgMHhhMjAzLCAweDAwNDgsIDB4MWU3MSwgMHhhNzA1LCAweDAwNDAsIDB4MWU3MSwKKwkweGEwM2UsIDB4MjczMCwgMHg2ODUwLCAweGQwZmMsIDB4MDBjMCwgMHgxZTI0LCAweDBkN2UsIDB4MjgwNCwKKwkweGFjNjgsIDB4MjkwMCwgMHgwMDc5LCAweDFlMTQsIDB4MWU1MywgMHgxZTM0LCAweDFlMzQsIDB4MWU1MywKKwkweDFlNTMsIDB4MWU0YiwgMHgxZTUzLCAweDFlMzQsIDB4MWU1MywgMHgxZTNhLCAweDFlM2EsIDB4MWU1MywKKwkweDFlNTMsIDB4MWU1MywgMHgxZTQyLCAweDFlM2EsIDB4YzBmYywgMHg2ODUyLCAweDZiNmMsIDB4NmE3MCwKKwkweDZkMWMsIDB4NmMyMCwgMHhkOTljLCAweDAwNDAsIDB4MWU1NywgMHgwZDdlLCAweDI4MDQsIDB4YWM2OCwKKwkweDZmMDgsIDB4NmUwYywgMHgwMDc4LCAweDFlNTYsIDB4NmIwOCwgMHg2YTBjLCAweDZkMDAsIDB4NmMwNCwKKwkweDAwNzgsIDB4MWU1NiwgMHg2YjEwLCAweDZhMTQsIDB4NmQwMCwgMHg2YzA0LCAweDZmMDgsIDB4NmUwYywKKwkweDAwNzgsIDB4MWU1NiwgMHgwZDdmLCAweDBkN2UsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwKKwkweDAwMWUsIDB4MDBjMCwgMHgxZTUzLCAweDBkN2YsIDB4MTA3OCwgMHgyMDI2LCAweDAwYzAsIDB4MWRmYSwKKwkweGEwMGUsIDB4MDA3OCwgMHgxZTcyLCAweDBkN2YsIDB4MTA3OCwgMHgxMzMyLCAweDBkN2YsIDB4N2IyMiwKKwkweDdhMjYsIDB4N2QzMiwgMHg3YzM2LCAweDdmM2EsIDB4N2UzZSwgMHg3OTAyLCAweDcwMDAsIDB4ODAwMCwKKwkweDcwMDIsIDB4NjgyOCwgMHhhMzAwLCAweDY4MmEsIDB4NjgyYywgMHhhMjAxLCAweDY4MmUsIDB4NzAwYywKKwkweGEzMDAsIDB4NzAwZSwgMHg3MDEwLCAweGEyMDEsIDB4NzAxMiwgMHgxMDc4LCAweDIwMjYsIDB4MDA3OCwKKwkweDFlNzIsIDB4YTAwNiwgMHgwMjdmLCAweDAzN2YsIDB4MDQ3ZiwgMHgwNTdmLCAweDA2N2YsIDB4MDc3ZiwKKwkweDAwN2MsIDB4MTA3OCwgMHgxMzMyLCAweDAyN2UsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwKKwkweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwKKwkweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDFlOTIsIDB4Njg1MCwKKwkweGMwYmQsIDB4Njg1MiwgMHgwZDdmLCAweDBjN2UsIDB4MTA3OCwgMHg4YTAxLCAweDBjN2YsIDB4MjAwMSwKKwkweGE4YzAsIDB4MjAwNCwgMHhhYzA2LCAweDAwYzAsIDB4MWVhNywgMHgyMGUxLCAweDkwNDAsIDB4MTA3OCwKKwkweDczOGEsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4NzBlYSwgMHgxMDc4LCAweDYzOWIsIDB4MDI3ZiwKKwkweDAwNzgsIDB4MWY3NiwgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgwMDdlLCAweDAxN2UsIDB4MGY3ZSwKKwkweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDIwNzksIDB4MDAyMCwgMHgyMDcxLCAweGE5MDgsIDB4MmI2OCwKKwkweDY4MTgsIDB4MjA2MCwgMHg3OTA0LCAweDc4MDMsIDB4MDAwMiwgMHhhMTg0LCAweDA3MDAsIDB4MDBjMCwKKwkweDFlN2IsIDB4NzAwMCwgMHgwMDc5LCAweDFlYzQsIDB4MWY3NiwgMHgxZWM4LCAweDFmNDMsIDB4MWY3NCwKKwkweDgwMDEsIDB4NzAwMiwgMHhkMTljLCAweDAwYzAsIDB4MWVkYywgMHg4YWZmLCAweDAwNDAsIDB4MWVmYiwKKwkweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDFkZjQsIDB4MDA0MCwgMHgxZjc2LCAweDIwMDksIDB4MDAwMSwKKwkweDEwNzgsIDB4MWRmNCwgMHgwMDc4LCAweDFmNzYsIDB4NzgwMywgMHgwMDA0LCAweGQxOTQsIDB4MDA0MCwKKwkweDFlZWMsIDB4Njg1MCwgMHhjMGZjLCAweDY4NTIsIDB4OGFmZiwgMHgwMGMwLCAweDFlZjEsIDB4Njg0YywKKwkweGMwZjUsIDB4Njg0ZSwgMHgwMDc4LCAweDFlZjEsIDB4MTA3OCwgMHgyMDNmLCAweDY4NTAsIDB4YzBmZCwKKwkweDY4NTIsIDB4MmEwMCwgMHg2ODI2LCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4NzAwMywKKwkweDAwMDAsIDB4MDA3OCwgMHgxZjc2LCAweDcxMWMsIDB4ODFmZiwgMHgwMDQwLCAweDFmMTEsIDB4NzkxOCwKKwkweDc5MjIsIDB4NzgyNywgMHgwMDAwLCAweDc4MDMsIDB4MDAwMSwgMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwKKwkweDcwMGMsIDB4YTEwMCwgMHg3MDBlLCAweDcwMTAsIDB4YTA4MSwgMHgwMDAwLCAweDcwMTIsIDB4MDA3OCwKKwkweDFmNzYsIDB4MGY3ZSwgMHgwMjdlLCAweDc4MWMsIDB4MDA3ZSwgMHg3ODE4LCAweDAwN2UsIDB4MjA3OSwKKwkweDAxMDAsIDB4N2ExNCwgMHhhMjg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MDM3ZSwKKwkweDIwMTksIDB4MTAwMCwgMHg4MzE5LCAweDEwNDAsIDB4MTMzMiwgMHg3ODIwLCAweGQwYmMsIDB4MDBjMCwKKwkweDFmMjIsIDB4MDM3ZiwgMHg3OWM4LCAweDAwN2YsIDB4YTEwMiwgMHgwMTdmLCAweDAwN2UsIDB4MDE3ZSwKKwkweDc5YzQsIDB4MDA3ZiwgMHhhMTAzLCAweDc4YzYsIDB4MDA3ZiwgMHg3OGNhLCAweGEyODQsIDB4MDAwNCwKKwkweGEwODUsIDB4MDAxMiwgMHg3ODE2LCAweDAyN2YsIDB4MGY3ZiwgMHg3ODAzLCAweDAwMDgsIDB4NzAwMywKKwkweDAwMDAsIDB4MDA3OCwgMHgxZjc2LCAweDgwMDEsIDB4NzAwMiwgMHhkMTk0LCAweDAwNDAsIDB4MWY1OCwKKwkweDc4MDQsIDB4ZDBmYywgMHgwMGMwLCAweDFlYmEsIDB4ZDE5YywgMHgwMGMwLCAweDFmNzIsIDB4OGFmZiwKKwkweDAwNDAsIDB4MWY3NiwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxZGY0LCAweDAwNzgsIDB4MWY3NiwKKwkweDAyN2UsIDB4MDM3ZSwgMHg2YjI4LCAweDZhMmMsIDB4MTA3OCwgMHgyMDNmLCAweDBkN2UsIDB4MjgwNCwKKwkweGFjNjgsIDB4NjAzNCwgMHhkMDljLCAweDAwYzAsIDB4MWY2YiwgMHg2ODA4LCAweGEzMWEsIDB4NjgwYywKKwkweGEyMTMsIDB4MDA3OCwgMHgxZjZmLCAweDY4MTAsIDB4YTMxYSwgMHg2ODE0LCAweGEyMTMsIDB4MGQ3ZiwKKwkweDAwNzgsIDB4MWVlYywgMHgwMDc4LCAweDFlZWMsIDB4MTA3OCwgMHgxMzMyLCAweDBjN2YsIDB4MGQ3ZiwKKwkweDBlN2YsIDB4MGY3ZiwgMHgwMTdmLCAweDAwN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwKKwkweDIwNzEsIDB4YTkwOCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDFmYzcsIDB4MjA3OSwKKwkweDAwMjAsIDB4MDE3ZSwgMHgyMDA5LCAweDAyMDcsIDB4MjEwYywgMHhkMTk0LCAweDAwNDAsIDB4MWZhNCwKKwkweDIwMDksIDB4MDIwYywgMHgyMTBjLCAweGExODQsIDB4MDAwMywgMHgwMDQwLCAweDFmYTQsIDB4MTA3OCwKKwkweGE1ZDIsIDB4MjAwMSwgMHgwMTMzLCAweDIwMDQsIDB4YTAwNSwgMHgxMDQwLCAweDEzMzIsIDB4MjBlMSwKKwkweDkwNDAsIDB4MjAwMSwgMHgwMjBjLCAweDIxMDIsIDB4MjAwOSwgMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwKKwkweDAyMDMsIDB4MjEwYywgMHhhMTA2LCAweDAwYzAsIDB4MWZhZiwgMHgyMGUxLCAweDkwNDAsIDB4NzgwNCwKKwkweGQwZmMsIDB4MDA0MCwgMHgxZjhhLCAweDEwNzgsIDB4MWVhYSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwKKwkweDAwYzAsIDB4MWY4YSwgMHgwMTdmLCAweDc4MDMsIDB4MDAwNCwgMHg3ODA0LCAweGQwYWMsIDB4MDBjMCwKKwkweDFmYmQsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MGU3ZiwKKwkweDBmN2YsIDB4MDA3YywgMHgwMjdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwKKwkweGE5MDgsIDB4MjA3OSwgMHgwMDIwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsIDB4MjAwMywKKwkweDcwMDQsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4MWZlZCwKKwkweDY4NTAsIDB4YzBiNSwgMHg2ODUyLCAweDY4MGMsIDB4N2ExYywgMHhhMjA2LCAweDAwYzAsIDB4MWZlZCwKKwkweDY4MDgsIDB4N2ExOCwgMHhhMjA2LCAweDAwNDAsIDB4MjAwOSwgMHgyMDAxLCAweDAxMDUsIDB4MjAwMywKKwkweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwKKwkweDIwNjAsIDB4MTA3OCwgMHg4YTAxLCAweDIwZTEsIDB4OTA0MCwgMHgxMDc4LCAweDczOGEsIDB4MjAxMSwKKwkweDAwMDAsIDB4MTA3OCwgMHg3MGVhLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MDI3ZiwKKwkweDAwN2MsIDB4NjgxMCwgMHg2YTE0LCAweGEyMDUsIDB4MDBjMCwgMHgxZmVkLCAweDY4NGMsIDB4YzBkYywKKwkweDY4NGUsIDB4MmMxMCwgMHgxMDc4LCAweDFjZjAsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwKKwkweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDIwNjksIDB4YThiMSwKKwkweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MDA3OCwgMHgyMDAzLCAweDg4NDAsIDB4MjgwNCwKKwkweGEwMDUsIDB4MDBjMCwgMHgyMDNhLCAweDYwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDIwM2MsIDB4NjgxYSwKKwkweDIwNjAsIDB4NjAzNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHgyMDZhLCAweDIwNDQsIDB4ODhmZiwKKwkweDEwNDAsIDB4MTMzMiwgMHg4YTUxLCAweDAwN2MsIDB4MjA1MSwgMHgwMDAwLCAweDAwN2MsIDB4OGE1MCwKKwkweDg4NDEsIDB4MjgwNCwgMHhhMDA1LCAweDAwYzAsIDB4MjA1OSwgMHgyYzAwLCAweGFkMDYsIDB4MDA0MCwKKwkweDIwNGUsIDB4NjAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MjA0ZSwgMHgyZDAwLCAweDIwNjAsIDB4NjgxYSwKKwkweDYwMzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjA3YSwgMHgyMDQ0LCAweDg4ZmYsIDB4MTA0MCwKKwkweDEzMzIsIDB4MDA3YywgMHgwMDAwLCAweDAwMTEsIDB4MDAxNSwgMHgwMDE5LCAweDAwMWQsIDB4MDAyMSwKKwkweDAwMjUsIDB4MDAyOSwgMHgwMDAwLCAweDAwMGYsIDB4MDAxNSwgMHgwMDFiLCAweDAwMjEsIDB4MDAyNywKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNWYsIDB4MjA1YiwgMHgwMDAwLCAweDAwMDAsIDB4MjA2OSwKKwkweDAwMDAsIDB4MjA1ZiwgMHgwMDAwLCAweDIwNjYsIDB4MjA2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDIwNjksIDB4MjA2NiwgMHgwMDAwLCAweDIwNjEsIDB4MjA2MSwgMHgwMDAwLCAweDAwMDAsIDB4MjA2OSwKKwkweDAwMDAsIDB4MjA2MSwgMHgwMDAwLCAweDIwNjcsIDB4MjA2NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDIwNjksIDB4MjA2NywgMHgwYTdlLCAweDA5N2UsIDB4MDg3ZSwgMHg2YjJlLCAweDZjMmEsIDB4Njg1OCwKKwkweGEwNTUsIDB4MDA0MCwgMHgyMTJkLCAweDJkNjAsIDB4NjAzNCwgMHhhMGNjLCAweDAwMGYsIDB4YTljMCwKKwkweDIwNmEsIDB4YTk4NiwgMHgwMDA3LCAweDAwNDAsIDB4MjBhNSwgMHhhOTg2LCAweDAwMGUsIDB4MDA0MCwKKwkweDIwYTUsIDB4YTk4NiwgMHgwMDBmLCAweDAwYzAsIDB4MjBhOSwgMHg2MDVjLCAweGE0MjIsIDB4NjA2MCwKKwkweGEzMWEsIDB4MjgwNCwgMHhhMDQ1LCAweDAwYzAsIDB4MjBiNywgMHgwMDUwLCAweDIwYjEsIDB4MDA3OCwKKwkweDIxMmQsIDB4NjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4MjEyZCwgMHgwMDc4LCAweDIwOTQsIDB4MjgwNCwKKwkweGEwMDUsIDB4MDA0MCwgMHgyMGQ1LCAweGFjNjgsIDB4ZDk5YywgMHgwMGMwLCAweDIwYzUsIDB4NjgwOCwKKwkweGE0MjIsIDB4NjgwYywgMHhhMzFiLCAweDAwNzgsIDB4MjBjOSwgMHg2ODEwLCAweGE0MjIsIDB4NjgxNCwKKwkweGEzMWIsIDB4MDA0OCwgMHgyMGY0LCAweDIzMDAsIDB4YTQwNSwgMHgwMDQwLCAweDIwZGIsIDB4OGE1MSwKKwkweDAwNDAsIDB4MjEyZCwgMHg4ODQwLCAweDAwNzgsIDB4MjBiNywgMHg2MDA0LCAweGEwNjUsIDB4MDA0MCwKKwkweDIxMmQsIDB4MDA3OCwgMHgyMDk0LCAweDhhNTEsIDB4MDA0MCwgMHgyMTJkLCAweDg4NDAsIDB4MjgwNCwKKwkweGEwMDUsIDB4MDBjMCwgMHgyMGVlLCAweDYwMDQsIDB4YTA2NSwgMHgwMDQwLCAweDIxMmQsIDB4NjAzNCwKKwkweGEwY2MsIDB4MDAwZiwgMHhhOWMwLCAweDIwNmEsIDB4MjgwNCwgMHgyMDQwLCAweDJiNjgsIDB4Njg1MCwKKwkweGMwZmMsIDB4Njg1MiwgMHgwMDc4LCAweDIxMjEsIDB4ODQyMiwgMHg4NDIwLCAweDgzMWEsIDB4YTM5OSwKKwkweDAwMDAsIDB4MGQ3ZSwgMHgyYjY4LCAweDZjNmUsIDB4NmI3MiwgMHgwZDdmLCAweGQ5OWMsIDB4MDBjMCwKKwkweDIxMGYsIDB4NjkwOCwgMHgyNDAwLCAweGExMjIsIDB4NjkwYywgMHgyMzAwLCAweGExMWIsIDB4MTA0OCwKKwkweDEzMzIsIDB4NjgwMCwgMHhhNDIwLCAweDY4MDQsIDB4YTMxOSwgMHgwMDc4LCAweDIxMWIsIDB4NjkxMCwKKwkweDI0MDAsIDB4YTEyMiwgMHg2OTE0LCAweDIzMDAsIDB4YTExYiwgMHgxMDQ4LCAweDEzMzIsIDB4NjgwMCwKKwkweGE0MjAsIDB4NjgwNCwgMHhhMzE5LCAweDJiNjgsIDB4NmMxZSwgMHg2YjIyLCAweDY4NTAsIDB4YzBmZCwKKwkweDY4NTIsIDB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHgyYTAwLCAweDY4MjYsIDB4MDA3ZiwKKwkweDAwN2YsIDB4MDA3ZiwgMHhhMDA2LCAweDAwNzgsIDB4MjEzMiwgMHgwODdmLCAweDA5N2YsIDB4MGE3ZiwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGEwODQsIDB4MDAwNywKKwkweDAwNzksIDB4MjEzYSwgMHgyMTQyLCAweDIxNDMsIDB4MjE0NiwgMHgyMTQ5LCAweDIxNGUsIDB4MjE1MSwKKwkweDIxNTYsIDB4MjE1YiwgMHgwMDdjLCAweDEwNzgsIDB4MWVhYSwgMHgwMDdjLCAweDEwNzgsIDB4MTkxMywKKwkweDAwN2MsIDB4MTA3OCwgMHgxOTEzLCAweDEwNzgsIDB4MWVhYSwgMHgwMDdjLCAweDEwNzgsIDB4MTRiZSwKKwkweDAwN2MsIDB4MTA3OCwgMHgxZWFhLCAweDEwNzgsIDB4MTRiZSwgMHgwMDdjLCAweDEwNzgsIDB4MTkxMywKKwkweDEwNzgsIDB4MTRiZSwgMHgwMDdjLCAweDEwNzgsIDB4MTkxMywgMHgxMDc4LCAweDFlYWEsIDB4MTA3OCwKKwkweDE0YmUsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwKKwkweGFiODAsIDB4MjA2OSwgMHhhNjAwLCAweDIwMDksIDB4MDAwNCwgMHg3OTEyLCAweDc4MTcsIDB4MDAwNCwKKwkweDEwNzgsIDB4MjUxZiwgMHg3ODFiLCAweDAwMDIsIDB4MjBlMSwgMHg4NzAwLCAweDEyN2YsIDB4MDA3YywKKwkweDEyN2UsIDB4MjA5MSwgMHgyMzAwLCAweDc4MWMsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksIDB4MjE4MCwKKwkweDIxYTQsIDB4MjE4OCwgMHgyMThjLCAweDIxOTAsIDB4MjE5NiwgMHgyMTlhLCAweDIxOWUsIDB4MjFhMiwKKwkweDEwNzgsIDB4NTQ4ZSwgMHgwMDc4LCAweDIxYTQsIDB4MTA3OCwgMHg1NGRhLCAweDAwNzgsIDB4MjFhNCwKKwkweDEwNzgsIDB4NTQ4ZSwgMHgxMDc4LCAweDU0ZGEsIDB4MDA3OCwgMHgyMWE0LCAweDEwNzgsIDB4MjFhNiwKKwkweDAwNzgsIDB4MjFhNCwgMHgxMDc4LCAweDIxYTYsIDB4MDA3OCwgMHgyMWE0LCAweDEwNzgsIDB4MjFhNiwKKwkweDAwNzgsIDB4MjFhNCwgMHgxMDc4LCAweDIxYTYsIDB4MTI3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwKKwkweDAyN2UsIDB4MTA3OCwgMHhhNWQyLCAweDc5MzAsIDB4YTE4NCwgMHgwMDAzLCAweDAwNDAsIDB4MjFjOSwKKwkweDIwMDEsIDB4YThjMCwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHgyMWM1LCAweDIwMDEsIDB4MDEzMywKKwkweDIwMDQsIDB4YTAwNSwgMHgxMDQwLCAweDEzMzIsIDB4MGM3ZSwgMHgyMDAxLCAweGE4YzAsIDB4MjA2NCwKKwkweDEwNzgsIDB4OGEwMSwgMHgwYzdmLCAweDAwNzgsIDB4MjFmMiwgMHgyMGUxLCAweDkwNDAsIDB4MDA3OCwKKwkweDIxZjIsIDB4YTE4NCwgMHgwMDMwLCAweDAwNDAsIDB4MjFkYSwgMHg2YTAwLCAweGEyODYsIDB4MDAwMywKKwkweDAwYzAsIDB4MjFkNCwgMHgwMDc4LCAweDIxZDYsIDB4MTA3OCwgMHg0MjI0LCAweDIwZTEsIDB4OTAxMCwKKwkweDAwNzgsIDB4MjFmMiwgMHhhMTg0LCAweDAwYzAsIDB4MDA0MCwgMHgyMWVjLCAweDBlN2UsIDB4MDM3ZSwKKwkweDA0N2UsIDB4MDU3ZSwgMHgyMDcxLCAweGE4ZTcsIDB4MTA3OCwgMHgxYWY0LCAweDA1N2YsIDB4MDQ3ZiwKKwkweDAzN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDIxZjIsIDB4YTE4NCwgMHgwMzAwLCAweDAwNDAsIDB4MjFmMiwKKwkweDIwZTEsIDB4OTAyMCwgMHg3OTMyLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MDE3ZSwKKwkweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGE2MDAsIDB4NzEyOCwgMHgyMDAxLCAweGE4OTAsIDB4MjEwMiwKKwkweDIwMDEsIDB4YTg5OCwgMHgyMTAyLCAweGExODIsIDB4MDIxMSwgMHgwMGM4LCAweDIyMGIsIDB4MjAwOSwKKwkweDAwMDgsIDB4MDA3OCwgMHgyMjM1LCAweGExODIsIDB4MDI1OSwgMHgwMGM4LCAweDIyMTMsIDB4MjAwOSwKKwkweDAwMDcsIDB4MDA3OCwgMHgyMjM1LCAweGExODIsIDB4MDJjMSwgMHgwMGM4LCAweDIyMWIsIDB4MjAwOSwKKwkweDAwMDYsIDB4MDA3OCwgMHgyMjM1LCAweGExODIsIDB4MDM0OSwgMHgwMGM4LCAweDIyMjMsIDB4MjAwOSwKKwkweDAwMDUsIDB4MDA3OCwgMHgyMjM1LCAweGExODIsIDB4MDQyMSwgMHgwMGM4LCAweDIyMmIsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDA3OCwgMHgyMjM1LCAweGExODIsIDB4MDU4MSwgMHgwMGM4LCAweDIyMzMsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDA3OCwgMHgyMjM1LCAweDIwMDksIDB4MDAwMiwgMHgyMDc5LCAweDAyMDAsIDB4NzkxMiwKKwkweDc4MTcsIDB4MDAwNCwgMHgxMDc4LCAweDI1MWYsIDB4MGY3ZiwgMHgwZTdmLCAweDAxN2YsIDB4MDA3YywKKwkweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGE2MDAsIDB4NjAyNCwKKwkweDYwMjYsIDB4NjA1MywgMHgwMDMwLCAweDYwMzMsIDB4MDBlZiwgMHg2MGU3LCAweDAwMDAsIDB4NjBlYiwKKwkweDAwZWYsIDB4NjBlMywgMHgwMDA4LCAweDYwNGIsIDB4ZjdmNywgMHg2MDQzLCAweDAwMDAsIDB4NjAyZiwKKwkweDAwODAsIDB4NjAyZiwgMHgwMDAwLCAweDYwMDcsIDB4MGVhZiwgMHg2MDBmLCAweDAwZmYsIDB4NjAyYiwKKwkweDAwMmYsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YTYzMCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweGE2MmYsIDB4MjAwMywgMHgwMDAxLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MDA3ZSwKKwkweDAxN2UsIDB4MDI3ZSwgMHg2MTI0LCAweGExODQsIDB4MDAyYywgMHgwMGMwLCAweDIyN2IsIDB4YTE4NCwKKwkweDAwMDcsIDB4MDA3OSwgMHgyMjgxLCAweGExOTUsIDB4MDAwNCwgMHhhMjg0LCAweDAwMDcsIDB4MDA3OSwKKwkweDIyODEsIDB4MjJhZCwgMHgyMjg5LCAweDIyOGQsIDB4MjI5MSwgMHgyMjk3LCAweDIyOWIsIDB4MjJhMSwKKwkweDIyYTcsIDB4MTA3OCwgMHg1YzU2LCAweDAwNzgsIDB4MjJhZCwgMHgxMDc4LCAweDVkNDUsIDB4MDA3OCwKKwkweDIyYWQsIDB4MTA3OCwgMHg1ZDQ1LCAweDEwNzgsIDB4NWM1NiwgMHgwMDc4LCAweDIyYWQsIDB4MTA3OCwKKwkweDIyYjIsIDB4MDA3OCwgMHgyMmFkLCAweDEwNzgsIDB4NWM1NiwgMHgxMDc4LCAweDIyYjIsIDB4MDA3OCwKKwkweDIyYWQsIDB4MTA3OCwgMHg1ZDQ1LCAweDEwNzgsIDB4MjJiMiwgMHgwMDc4LCAweDIyYWQsIDB4MTA3OCwKKwkweDVkNDUsIDB4MTA3OCwgMHg1YzU2LCAweDEwNzgsIDB4MjJiMiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwKKwkweDEyN2YsIDB4MDA3YywgMHg2MTI0LCAweGQxYWMsIDB4MDA0MCwgMHgyM2FjLCAweDAxN2UsIDB4MDQ3ZSwKKwkweDBjN2UsIDB4NjQ0YywgMHhhNDg2LCAweGYwZjAsIDB4MDBjMCwgMHgyMmM1LCAweDIwNjEsIDB4MDEwMCwKKwkweDY0NGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg3NGM2LCAweGE0OGMsIDB4ZmYwMCwKKwkweDcwMzQsIDB4ZDA4NCwgMHgwMDQwLCAweDIyZGQsIDB4YTE4NiwgMHhmODAwLCAweDAwYzAsIDB4MjJkZCwKKwkweDcwM2MsIDB4ZDA4NCwgMHgwMGMwLCAweDIyZGQsIDB4YzA4NSwgMHg3MDNlLCAweDAzN2UsIDB4MjQxOCwKKwkweDIwMTEsIDB4ODAxNiwgMHgxMDc4LCAweDM2MWIsIDB4MDM3ZiwgMHhhMTk2LCAweGZmMDAsIDB4MDA0MCwKKwkweDIzMWYsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4ODEwZiwgMHhhMTE2LCAweDAwNDAsIDB4MjMxZiwKKwkweDcxMzAsIDB4ZDE4NCwgMHgwMGMwLCAweDIzMWYsIDB4MjAxMSwgMHhhNjUzLCAweDIyMTQsIDB4ZDJlYywKKwkweDAwNDAsIDB4MjJmYSwgMHhjMThkLCAweDcxMzIsIDB4MjAxMSwgMHhhNjUzLCAweDIyMTQsIDB4ZDJhYywKKwkweDAwYzAsIDB4MjMxZiwgMHg2MjQwLCAweGEyOTQsIDB4MDAxMCwgMHgwMDQwLCAweDIzMDYsIDB4NjI0OCwKKwkweGEyOTQsIDB4ZmYwMCwgMHhhMjk2LCAweGZmMDAsIDB4MDA0MCwgMHgyMzFmLCAweDcwMzAsIDB4ZDA4YywKKwkweDAwNDAsIDB4MjM3MSwgMHg3MDM0LCAweGQwOGMsIDB4MDBjMCwgMHgyMzE2LCAweDIwMDEsIDB4YTYwYywKKwkweDIwMGMsIDB4ZDFhYywgMHgwMGMwLCAweDIzNzEsIDB4YzFhZCwgMHgyMTAyLCAweDAzN2UsIDB4NzNjNCwKKwkweDIwMTEsIDB4ODAxMywgMHgxMDc4LCAweDM2MWIsIDB4MDM3ZiwgMHgwMDc4LCAweDIzNzEsIDB4NzAzNCwKKwkweGQwOGMsIDB4MDBjMCwgMHgyMzJiLCAweDIwMDEsIDB4YTYwYywgMHgyMDBjLCAweGQxYWMsIDB4MDBjMCwKKwkweDIzNzEsIDB4YzFhZCwgMHgyMTAyLCAweDAzN2UsIDB4NzNjNCwgMHgyMDExLCAweDgwMTMsIDB4MTA3OCwKKwkweDM2MWIsIDB4MDM3ZiwgMHg3MTMwLCAweGMxODUsIDB4NzEzMiwgMHgyMDExLCAweGE2NTMsIDB4MjIwYywKKwkweGQxYTQsIDB4MDA0MCwgMHgyMzU1LCAweDAxN2UsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwKKwkweDEwNzgsIDB4NWJmMSwgMHgyMDE5LCAweDAwMGUsIDB4MTA3OCwgMHhhMTk1LCAweGE0ODQsIDB4MDBmZiwKKwkweGEwODAsIDB4MjljMCwgMHgyMDBjLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDgxMjcsIDB4YTAwNiwKKwkweDIwMDksIDB4MDAwZSwgMHgxMDc4LCAweGEyMWQsIDB4MDE3ZiwgMHhkMWFjLCAweDAwYzAsIDB4MjM2MiwKKwkweDAxN2UsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweDI4NGYsIDB4MDE3ZiwKKwkweDAwNzgsIDB4MjM3MSwgMHgxNTdlLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwKKwkweDQ1YzQsIDB4MDBjMCwgMHgyMzZkLCAweDEwNzgsIDB4NDJmOCwgMHg4MTA4LCAweDAwZjAsIDB4MjM2NywKKwkweDE1N2YsIDB4MGM3ZiwgMHgwNDdmLCAweDBmN2UsIDB4MjA3OSwgMHhhOGM0LCAweDc4M2MsIDB4YTA4NiwKKwkweDAwMDAsIDB4MDA0MCwgMHgyMzgzLCAweDYwMjcsIDB4MDAwNCwgMHg3ODNmLCAweDAwMDAsIDB4MjA3OSwKKwkweDAxNDAsIDB4NzgwMywgMHgwMDAwLCAweDBmN2YsIDB4MjAxMSwgMHgwMDAzLCAweDEwNzgsIDB4NzBlMCwKKwkweDIwMTEsIDB4MDAwMiwgMHgxMDc4LCAweDcwZWEsIDB4MTA3OCwgMHg2ZmM0LCAweDAzN2UsIDB4MjAxOSwKKwkweDAwMDAsIDB4MTA3OCwgMHg3MDU4LCAweDAzN2YsIDB4NjBlMywgMHgwMDAwLCAweDAxN2YsIDB4MjAwMSwKKwkweGE2MDAsIDB4MjAxNCwgMHhhMjk2LCAweDAwMDQsIDB4MDBjMCwgMHgyM2E0LCAweGQxOWMsIDB4MDBjMCwKKwkweDIzYWMsIDB4NjIyOCwgMHhjMjlkLCAweDYyMmEsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YTYyMiwKKwkweDIwMDMsIDB4MDAwMCwgMHg2MDI3LCAweDAwMjAsIDB4ZDE5NCwgMHgwMDQwLCAweDI0OTAsIDB4MGY3ZSwKKwkweDIwNzksIDB4YThjNCwgMHg3ODNjLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDIzZDAsIDB4MDE3ZSwKKwkweDYwMjcsIDB4MDAwNCwgMHg3ODNmLCAweDAwMDAsIDB4MjA3OSwgMHgwMTQwLCAweDc4MDMsIDB4MTAwMCwKKwkweDc4MDMsIDB4MDAwMCwgMHgyMDc5LCAweGE4YjEsIDB4NzgwNywgMHgwMDAwLCAweDc4MzMsIDB4MDAwMCwKKwkweDEwNzgsIDB4NjJkMSwgMHgxMDc4LCAweDYzOWIsIDB4MDE3ZiwgMHgwZjdmLCAweDAwNzgsIDB4MjQ5MCwKKwkweDBmN2YsIDB4MDE3ZSwgMHgzOTAwLCAweGEwODIsIDB4YTllMywgMHgwMGM4LCAweDIzZGIsIDB4MDE3ZSwKKwkweDEwNzgsIDB4NzQ3YSwgMHgwMTdmLCAweDYyMjAsIDB4ZDJiNCwgMHgwMDQwLCAweDI0NDYsIDB4MTA3OCwKKwkweDVhY2IsIDB4MTA3OCwgMHg2ZTBmLCAweDYwMjcsIDB4MDAwNCwgMHgwZjdlLCAweDIwMTksIDB4YThiYSwKKwkweDIzMDQsIDB4YTA3ZCwgMHgwMDQwLCAweDI0MWMsIDB4NzgwNCwgMHhhMDg2LCAweDAwMzIsIDB4MDBjMCwKKwkweDI0MWMsIDB4MGQ3ZSwgMHgwYzdlLCAweDBlN2UsIDB4MjA2OSwgMHgwMTQwLCAweDYxOGMsIDB4NjI4OCwKKwkweDc4MTgsIDB4NjA4ZSwgMHg3ODA4LCAweDYwOGEsIDB4NjA0MywgMHgwMDAyLCAweDIwMDEsIDB4MDAwMywKKwkweDgwMDEsIDB4MDBjMCwgMHgyNDAwLCAweDYwNDMsIDB4MDAwMCwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywKKwkweDAwMDAsIDB4NjE4ZSwgMHg2MjhhLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDYyZDEsIDB4NzgxMCwKKwkweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDJmNjAsIDB4MTA3OCwgMHg3NzJkLCAweDBlN2YsIDB4MGM3ZiwKKwkweDBkN2YsIDB4MGY3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGY3ZiwgMHgwZDdlLCAweDIwNjksIDB4MDE0MCwKKwkweDY4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4MjQyOSwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywKKwkweDAwMDAsIDB4MGQ3ZiwgMHgwYzdlLCAweDIwNjEsIDB4YThiMSwgMHg2MDI4LCAweGEwOWEsIDB4MDBjOCwKKwkweDAwYzgsIDB4MjQzOSwgMHg4MDAwLCAweDYwMmEsIDB4MGM3ZiwgMHgxMDc4LCAweDZlMDEsIDB4MDA3OCwKKwkweDI0OGYsIDB4MjAxOSwgMHhhOGJhLCAweDIzMDQsIDB4YTA2NSwgMHgwMDQwLCAweDI0NDMsIDB4MjAwOSwKKwkweDAwMjcsIDB4MTA3OCwgMHg3NzVjLCAweDBjN2YsIDB4MDA3OCwgMHgyNDhmLCAweGQyYmMsIDB4MDA0MCwKKwkweDI0OGYsIDB4MTA3OCwgMHg1YWQ4LCAweDYwMTcsIDB4MDAxMCwgMHg2MDI3LCAweDAwMDQsIDB4MGQ3ZSwKKwkweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDI0NWIsIDB4NjgwMywKKwkweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDBkN2YsIDB4MGM3ZSwgMHgyMDYxLCAweGE4YjEsIDB4NjA0NCwKKwkweGEwOWEsIDB4MDBjOCwgMHgwMGM4LCAweDI0N2UsIDB4ODAwMCwgMHg2MDQ2LCAweDYwM2MsIDB4MGM3ZiwKKwkweGEwMDUsIDB4MDA0MCwgMHgyNDhmLCAweDIwMDksIDB4MDdkMCwgMHgxMDc4LCAweDVhZDAsIDB4YTA4MCwKKwkweDAwMDcsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgyNDdhLCAweDYwMTcsIDB4MDAxMiwKKwkweDAwNzgsIDB4MjQ4ZiwgMHg2MDE3LCAweDAwMTYsIDB4MDA3OCwgMHgyNDhmLCAweDAzN2UsIDB4MjAxOSwKKwkweDAwMDEsIDB4MTA3OCwgMHg3MDU4LCAweDAzN2YsIDB4MjAxOSwgMHhhOGMwLCAweDIzMDQsIDB4YTA2NSwKKwkweDAwNDAsIDB4MjQ4ZSwgMHgyMDA5LCAweDAwNGYsIDB4MTA3OCwgMHg3NzVjLCAweDBjN2YsIDB4MDE3ZiwKKwkweGQxOWMsIDB4MDA0MCwgMHgyNGU0LCAweDcwMzQsIDB4ZDBhYywgMHgwMGMwLCAweDI0YzEsIDB4MDE3ZSwKKwkweDE1N2UsIDB4NjAyNywgMHgwMDA4LCAweDYwMmYsIDB4MDAyMCwgMHgyMGE5LCAweDAwMGEsIDB4MDBmMCwKKwkweDI0OWYsIDB4NjAyZiwgMHgwMDAwLCAweDYxNTAsIDB4YTE4NSwgMHgxNDAwLCAweDYwNTIsIDB4MjBhOSwKKwkweDAzMjAsIDB4MDBlMCwgMHgyNGE5LCAweDIwOTEsIDB4NjAwMCwgMHg2MDIwLCAweGQwOWMsIDB4MDBjMCwKKwkweDI0YjgsIDB4MTU3ZiwgMHg2MTUyLCAweDAxN2YsIDB4NjAyNywgMHgwMDA4LCAweDAwNzgsIDB4MjRlNCwKKwkweDEwNzgsIDB4MjU3NywgMHgwMGYwLCAweDI0YTksIDB4MTU3ZiwgMHg2MTUyLCAweDAxN2YsIDB4NjAyNywKKwkweDAwMDgsIDB4MDE3ZSwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgyMDExLCAweDAwMDMsIDB4MTA3OCwKKwkweDcwZTAsIDB4MjAxMSwgMHgwMDAyLCAweDEwNzgsIDB4NzBlYSwgMHgxMDc4LCAweDZmYzQsIDB4MDM3ZSwKKwkweDIwMTksIDB4MDAwMCwgMHgxMDc4LCAweDcwNTgsIDB4MDM3ZiwgMHg2MGUzLCAweDAwMDAsIDB4MTA3OCwKKwkweGE1YWQsIDB4MTA3OCwgMHhhNWNiLCAweDIwMDEsIDB4YTYwMCwgMHgyMDAzLCAweDAwMDQsIDB4NjAyNywKKwkweDAwMDgsIDB4MTA3OCwgMHgxMjQ2LCAweDAxN2YsIDB4YTE4YywgMHhmZmQwLCAweDYxMjYsIDB4MDA3YywKKwkweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDBlN2UsIDB4MGY3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4YTYwMCwgMHg3MWJjLCAweDcwYmUsIDB4YTExNiwgMHgwMDQwLCAweDI1MTgsIDB4ODFmZiwKKwkweDAwNDAsIDB4MjUwMCwgMHgyMDExLCAweDgwMTEsIDB4MTA3OCwgMHgzNjFiLCAweDAwNzgsIDB4MjUxOCwKKwkweDIwMTEsIDB4ODAxMiwgMHgxMDc4LCAweDM2MWIsIDB4MjAwMSwgMHhhNjcyLCAweDIwMDQsIDB4ZDBmYywKKwkweDAwYzAsIDB4MjUxOCwgMHgwMzdlLCAweDBjN2UsIDB4MTA3OCwgMHg2ZjlmLCAweDIwNjEsIDB4MDEwMCwKKwkweDIwMTksIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHgyODRmLCAweDBjN2YsIDB4MDM3ZiwKKwkweDEyN2YsIDB4MGY3ZiwgMHgwZTdmLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwKKwkweDBmN2UsIDB4MDA3ZSwgMHgwMjdlLCAweDIwNjEsIDB4MDEwMCwgMHhhMTkwLCAweDI1M2IsIDB4MjIwNCwKKwkweDYwZjIsIDB4MjAxMSwgMHgyNTQ4LCAweDYwMDAsIDB4YTA4MiwgMHgwMDAzLCAweDAwYzgsIDB4MjUzNCwKKwkweDIwMDEsIDB4MDBmZiwgMHgwMDc4LCAweDI1MzUsIDB4MjIwNCwgMHg2MGVlLCAweDAyN2YsIDB4MDA3ZiwKKwkweDBmN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDA4NDAsIDB4MDg0MCwgMHgwODQwLCAweDA1ODAsIDB4MDQyMCwKKwkweDAzNDgsIDB4MDJjMCwgMHgwMjU4LCAweDAyMTAsIDB4MDFhOCwgMHgwMWE4LCAweDAxYTgsIDB4MDFhOCwKKwkweDAxNDAsIDB4MDBmOCwgMHgwMGQwLCAweDAwYjAsIDB4MDBhMCwgMHgyMDI4LCAweGExOGMsIDB4MDBmZiwKKwkweDIxMzAsIDB4YTA5NCwgMHhmZjAwLCAweDAwYzAsIDB4MjU1OCwgMHg4MWZmLCAweDAwNDAsIDB4MjU1YywKKwkweDEwNzgsIDB4NTc2MSwgMHgwMDc4LCAweDI1NjMsIDB4YTA4MCwgMHgyOWMwLCAweDIwMGMsIDB4YTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHhhMDA2LCAweDAwN2MsIDB4YTA4MCwgMHgyOWMwLCAweDIwMGMsIDB4YTE4YywKKwkweDAwZmYsIDB4MDA3YywgMHgwYzdlLCAweDIwNjEsIDB4YTYwMCwgMHg2MDMwLCAweDAwNDAsIDB4MjU3MywKKwkweGMwOWQsIDB4MDA3OCwgMHgyNTc0LCAweGMwOWMsIDB4NjAzMiwgMHgwYzdmLCAweDAwN2MsIDB4MDA3ZSwKKwkweDE1N2UsIDB4MGY3ZSwgMHgyMDc5LCAweDAxMDAsIDB4MjBhOSwgMHgwMDBhLCAweDc4NTQsIDB4ZDA4YywKKwkweDAwYzAsIDB4MjU4NCwgMHgwMGYwLCAweDI1N2UsIDB4MGY3ZiwgMHgxNTdmLCAweDAwN2YsIDB4MDA3YywKKwkweDBjN2UsIDB4MDA3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjAzMCwgMHgwMDdlLCAweDYwNDgsIDB4MDA3ZSwKKwkweDYwZTQsIDB4MDA3ZSwgMHg2MGU4LCAweDAwN2UsIDB4NjA1MCwgMHgwMDdlLCAweDYwZjAsIDB4MDA3ZSwKKwkweDYwZWMsIDB4MDA3ZSwgMHg2MDBjLCAweDAwN2UsIDB4NjAwNCwgMHgwMDdlLCAweDYwMjgsIDB4MDA3ZSwKKwkweDYwZTAsIDB4MDA3ZSwgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwMDUsIDB4MDAwNSwKKwkweDAwMDUsIDB4MDAwNSwgMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwN2YsIDB4NjBlMiwKKwkweDAwN2YsIDB4NjAyYSwgMHgwMDdmLCAweDYwMDYsIDB4MDA3ZiwgMHg2MDBlLCAweDAwN2YsIDB4NjBlZSwKKwkweDAwN2YsIDB4NjBmMiwgMHgwMDdmLCAweDYwNTIsIDB4MDA3ZiwgMHg2MGVhLCAweDAwN2YsIDB4NjBlNiwKKwkweDAwN2YsIDB4NjA0YSwgMHgwMDdmLCAweDYwMzIsIDB4MDA3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MjVlNywKKwkweDI1ZWIsIDB4MjVlZiwgMHgyNWY1LCAweDI1ZmIsIDB4MjYwMSwgMHgyNjA3LCAweDI2MGYsIDB4MjYxNywKKwkweDI2MWQsIDB4MjYyMywgMHgyNjJiLCAweDI2MzMsIDB4MjYzYiwgMHgyNjQzLCAweDI2NGQsIDB4MjY1NywKKwkweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsIDB4MjY1NywKKwkweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsIDB4MjY1NywgMHgyNjU3LCAweDI2NTcsIDB4MTA3ZSwKKwkweDAwN2UsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwKKwkweDAwN2UsIDB4MTA3OCwgMHgyMjZjLCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwKKwkweDIyNmMsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIxMzMsIDB4MDA3OCwKKwkweDI2NzAsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsIDB4MjEzMywgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwKKwkweDAwN2UsIDB4MTA3OCwgMHgyMjZjLCAweDEwNzgsIDB4MjEzMywgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwKKwkweDAwN2UsIDB4MTA3OCwgMHgyMjZjLCAweDEwNzgsIDB4MjEzMywgMHgwMDc4LCAweDI2NzAsIDB4MTA3ZSwKKwkweDAwN2UsIDB4MTA3OCwgMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwKKwkweDIxNzgsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIyNmMsIDB4MTA3OCwKKwkweDIxNzgsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIyNmMsIDB4MTA3OCwKKwkweDIxNzgsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIxMzMsIDB4MTA3OCwKKwkweDIxNzgsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIxMzMsIDB4MTA3OCwKKwkweDIxNzgsIDB4MDA3OCwgMHgyNjcwLCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIyNmMsIDB4MTA3OCwKKwkweDIxMzMsIDB4MTA3OCwgMHgyMTc4LCAweDAwNzgsIDB4MjY3MCwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwKKwkweDIyNmMsIDB4MTA3OCwgMHgyMTMzLCAweDEwNzgsIDB4MjE3OCwgMHgwMDc4LCAweDI2NzAsIDB4MDAwNSwKKwkweDAwNzgsIDB4MjY1NywgMHhiMDg0LCAweDAwM2MsIDB4ODAwNCwgMHg4MDA0LCAweDAwNzksIDB4MjY2MCwKKwkweDI2NzAsIDB4MjVlZCwgMHgyNWYxLCAweDI1ZjcsIDB4MjVmZCwgMHgyNjAzLCAweDI2MDksIDB4MjYxMSwKKwkweDI2MTksIDB4MjYxZiwgMHgyNjI1LCAweDI2MmQsIDB4MjYzNSwgMHgyNjNkLCAweDI2NDUsIDB4MjY0ZiwKKwkweDAwMDgsIDB4MjY1YSwgMHgwMDdmLCAweDEwN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MGM3ZSwKKwkweDAyN2UsIDB4MDQ3ZSwgMHgyMDIxLCAweDAwMDAsIDB4MTA3OCwgMHg0OTY3LCAweDAwYzAsIDB4Mjc3MiwKKwkweDcwY2MsIDB4ZDA5YywgMHgwMDQwLCAweDI2OGUsIDB4ZDA4NCwgMHgwMGMwLCAweDI2OGUsIDB4ZDBiYywKKwkweDAwYzAsIDB4Mjc3MiwgMHgxMDc4LCAweDI3NzYsIDB4MDA3OCwgMHgyNzcyLCAweGQwY2MsIDB4MDBjMCwKKwkweDI3NzIsIDB4ZDA5NCwgMHgwMDQwLCAweDI2OTgsIDB4NzA5NywgMHhmZmZmLCAweDAwNzgsIDB4Mjc3MiwKKwkweDIwMDEsIDB4MDEwYywgMHgyMDNjLCAweDcyODQsIDB4ZDI4NCwgMHgwMDQwLCAweDI3MDEsIDB4ZDI4YywKKwkweDAwYzAsIDB4MjcwMSwgMHgwMzdlLCAweDczOTQsIDB4YTM4ZSwgMHhmZmZmLCAweDAwNDAsIDB4MjZhYiwKKwkweDgzZmYsIDB4MDBjMCwgMHgyNmFkLCAweDIwMTksIDB4MDAwMSwgMHg4MzE0LCAweGEyZTAsIDB4YWNjMCwKKwkweDJjMDQsIDB4YTM4YywgMHgwMDAxLCAweDAwNDAsIDB4MjZiYSwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDAwNzgsIDB4MjZiYywgMHhhMDg0LCAweDAwZmYsIDB4YTcwZSwgMHgwMDQwLCAweDI2ZjYsIDB4YTA4ZSwKKwkweDAwMDAsIDB4MDA0MCwgMHgyNmY2LCAweGEwOGUsIDB4MDBmZiwgMHgwMGMwLCAweDI2ZDMsIDB4NzIzMCwKKwkweGQyODQsIDB4MDBjMCwgMHgyNmZjLCAweDcyODQsIDB4YzI4ZCwgMHg3Mjg2LCAweDcwOTcsIDB4ZmZmZiwKKwkweDAzN2YsIDB4MDA3OCwgMHgyNzAxLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDI1NGQsIDB4MTA3OCwKKwkweDQ1NWMsIDB4MDBjMCwgMHgyNmY5LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4MjZmMCwgMHg3MDMwLCAweGQwOGMsIDB4MDA0MCwgMHgyNmVhLCAweDYwMDAsIDB4ZDBiYywKKwkweDAwNDAsIDB4MjZmMCwgMHgxMDc4LCAweDI3OGMsIDB4MDA0MCwgMHgyNmY5LCAweDAwNzgsIDB4MjZmNiwKKwkweDEwNzgsIDB4MjhjNCwgMHgxMDc4LCAweDI3YjksIDB4MDA0MCwgMHgyNmY5LCAweDgzMTgsIDB4MDA3OCwKKwkweDI2YWQsIDB4NzM5NiwgMHgwMDc4LCAweDI2ZmUsIDB4NzA5NywgMHhmZmZmLCAweDAzN2YsIDB4MDA3OCwKKwkweDI3NzIsIDB4YTc4MCwgMHgyOWMwLCAweDIwM2MsIDB4YTdiYywgMHhmZjAwLCAweDg3M2YsIDB4MjA0MSwKKwkweDAwN2UsIDB4NzA5NCwgMHhhMDk2LCAweGZmZmYsIDB4MDBjMCwgMHgyNzEzLCAweDIwMDksIDB4MDAwMCwKKwkweDI4YTgsIDB4MDA3OCwgMHgyNzFmLCAweGE4MTIsIDB4MDA0OCwgMHgyNzFiLCAweDIwMDgsIDB4YTgwMiwKKwkweDIwYTgsIDB4MDA3OCwgMHgyNzFmLCAweDcwOTcsIDB4ZmZmZiwgMHgwMDc4LCAweDI3NzIsIDB4MjcwMCwKKwkweDE1N2UsIDB4MDE3ZSwgMHhhMTA2LCAweDAwNDAsIDB4Mjc2NiwgMHhjNDg0LCAweDEwNzgsIDB4NDVjNCwKKwkweDAwNDAsIDB4MjczMCwgMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwgMHgyNzZmLCAweDAwNzgsIDB4MjczMSwKKwkweGM0ODUsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4Mjc0MCwKKwkweDcwMzAsIDB4ZDA4YywgMHgwMDQwLCAweDI3NWUsIDB4NjAwMCwgMHhkMGJjLCAweDAwYzAsIDB4Mjc1ZSwKKwkweDcyODQsIDB4ZDI4YywgMHgwMDQwLCAweDI3NTYsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4MiwKKwkweDAwMDYsIDB4MDA0OCwgMHgyNzY2LCAweGQ0ODQsIDB4MDBjMCwgMHgyNzUyLCAweDEwNzgsIDB4NDU3ZiwKKwkweDAwNzgsIDB4Mjc1NCwgMHgxMDc4LCAweDI5OGUsIDB4MDA3OCwgMHgyNzY2LCAweDEwNzgsIDB4MjhjNCwKKwkweDEwNzgsIDB4MjdiOSwgMHgwMDQwLCAweDI3NmYsIDB4MDA3OCwgMHgyNzY2LCAweDEwNzgsIDB4Mjk1OSwKKwkweDAwNDAsIDB4Mjc2NiwgMHgxMDc4LCAweDI3OGMsIDB4MDA0MCwgMHgyNzZmLCAweDAxN2YsIDB4ODEwOCwKKwkweDE1N2YsIDB4MDBmMCwgMHgyNzFmLCAweDcwOTcsIDB4ZmZmZiwgMHgwMDc4LCAweDI3NzIsIDB4MDE3ZiwKKwkweDE1N2YsIDB4NzE5NiwgMHgwNDdmLCAweDAyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MDE3ZSwKKwkweDcwOTcsIDB4MDAwMSwgMHgyMDA5LCAweDAwN2UsIDB4MTA3OCwgMHg0NTVjLCAweDAwYzAsIDB4Mjc4OSwKKwkweDEwNzgsIDB4MjhjNCwgMHgxMDc4LCAweDI3YjksIDB4MDA0MCwgMHgyNzg5LCAweDcwY2MsIDB4YzBiZCwKKwkweDcwY2UsIDB4MDE3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwNzdlLCAweDBkN2UsIDB4MGM3ZSwKKwkweDJjNjgsIDB4MjAwMSwgMHhhNjU3LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDY4NDIsIDB4MTA3OCwKKwkweDc2YzcsIDB4MDA0MCwgMHgyN2I0LCAweDJkMDAsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMDAsIDB4MTA3OCwgMHg0NGVlLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ1MDIsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MDkwLCAweDgwMDAsIDB4NzA5MiwgMHgxMjdmLCAweDIwMDksIDB4MDAwNCwKKwkweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MGM3ZiwgMHgwZDdmLCAweDA3N2YsIDB4MDE3ZiwKKwkweDAwN2MsIDB4MDE3ZSwgMHgwNzdlLCAweDBkN2UsIDB4MGM3ZSwgMHgyYzY4LCAweDIwMDEsIDB4YTY1NywKKwkweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDY4NDIsIDB4MTA3OCwgMHg5MTg3LCAweDAwNDAsIDB4MjdmMiwKKwkweDJkMDAsIDB4NjAxYSwgMHg2ODAwLCAweGMwYzQsIDB4NjgwMiwgMHg2OGEwLCAweGEwODYsIDB4MDA3ZSwKKwkweDAwNDAsIDB4MjdkYiwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDI3ZGIsIDB4MTA3OCwgMHgyODgwLCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwKKwkweDQ0ZWUsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDUwMiwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDcwOTAsIDB4ODAwMCwgMHg3MDkyLCAweDEyN2YsIDB4MjAwOSwgMHgwMDAyLCAweDEwNzgsIDB4Nzc1YywKKwkweGEwODUsIDB4MDAwMSwgMHgwYzdmLCAweDBkN2YsIDB4MDc3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGM3ZSwKKwkweDAyN2UsIDB4MjAwOSwgMHgwMDgwLCAweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDI4MDUsIDB4MTA3OCwKKwkweDI4MDgsIDB4MDA0MCwgMHgyODA1LCAweDcwZDMsIDB4ZmZmZiwgMHgwMjdmLCAweDBjN2YsIDB4MDA3YywKKwkweDAxN2UsIDB4MDc3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MmM2OCwgMHgxMDc4LCAweDc2YzcsIDB4MDA0MCwKKwkweDI4MmEsIDB4MmQwMCwgMHg2MDFhLCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwKKwkweDQ0ZWUsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDUwMiwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDcwZDQsIDB4ODAwMCwgMHg3MGQ2LCAweDEyN2YsIDB4MjAwOSwgMHgwMDAyLCAweDEwNzgsIDB4Nzc1YywKKwkweGEwODUsIDB4MDAwMSwgMHgwYzdmLCAweDBkN2YsIDB4MDc3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGM3ZSwKKwkweDBkN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHgwMDdmLCAweDEwNzgsIDB4NDU1YywKKwkweDAwYzAsIDB4Mjg0YiwgMHgyYzY4LCAweDEwNzgsIDB4NzZjNywgMHgwMDQwLCAweDI4NGIsIDB4MmQwMCwKKwkweDYwMWEsIDB4NjMxMiwgMHg2MDFmLCAweDAwMDEsIDB4NjIwYSwgMHgyMDA5LCAweDAwMjIsIDB4MTA3OCwKKwkweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGU3ZSwKKwkweDBjN2UsIDB4MDY3ZSwgMHgwMzdlLCAweDAyN2UsIDB4MTA3OCwgMHg1ZjBlLCAweDEwNzgsIDB4NWVhZSwKKwkweDEwNzgsIDB4ODA2OCwgMHgyMTMwLCAweDgxZmYsIDB4MDA0MCwgMHgyODY0LCAweDIwYTksIDB4MDA3ZSwKKwkweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDI4NjgsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwKKwkweDAxN2UsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4Mjg3MSwgMHgxMDc4LCAweDQ3ZTksIDB4MTA3OCwKKwkweDQyZjgsIDB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsIDB4Mjg2OCwgMHg4NmZmLCAweDAwYzAsIDB4Mjg3YSwKKwkweDEwNzgsIDB4MTE5YiwgMHgwMjdmLCAweDAzN2YsIDB4MDY3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywKKwkweDBlN2UsIDB4MGM3ZSwgMHgwMzdlLCAweDAyN2UsIDB4MDE3ZSwgMHg2MjE4LCAweDIyNzAsIDB4NzJhMCwKKwkweDAyN2UsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4NWYwMSwgMHgwNzdlLCAweDIwMzksIDB4MDAwMCwKKwkweDEwNzgsIDB4NWUwYSwgMHgyYzA4LCAweDEwNzgsIDB4OWY4YiwgMHgwNzdmLCAweDAxN2YsIDB4MmU2MCwKKwkweDEwNzgsIDB4NDdlOSwgMHg2MjEwLCAweDYzMTQsIDB4MTA3OCwgMHg0MmY4LCAweDYyMTIsIDB4NjMxNiwKKwkweDAxN2YsIDB4MDI3ZiwgMHgwMzdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDA3ZSwKKwkweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMGMwLCAweDI4YmEsIDB4MjA3MSwKKwkweGE2MDAsIDB4NzA5MCwgMHhhMDA1LCAweDAwNDAsIDB4MjhiNywgMHg4MDAxLCAweDcwOTIsIDB4MDA3ZiwKKwkweDBlN2YsIDB4MDA3YywgMHgyMDcxLCAweGE2MDAsIDB4NzBkNCwgMHhhMDA1LCAweDAwNDAsIDB4MjhiNywKKwkweDgwMDEsIDB4NzBkNiwgMHgwMDc4LCAweDI4YjcsIDB4NjAwMCwgMHhjMDhjLCAweDYwMDIsIDB4MDA3YywKKwkweDBmN2UsIDB4MGU3ZSwgMHgwYzdlLCAweDAzN2UsIDB4MDI3ZSwgMHgwMTdlLCAweDE1N2UsIDB4MjE3OCwKKwkweDgxZmYsIDB4MDBjMCwgMHgyOGQ3LCAweDIwYTksIDB4MDAwMSwgMHgwMDc4LCAweDI4ZjIsIDB4MjAwMSwKKwkweGE2NTMsIDB4MjAwNCwgMHhkMGM0LCAweDAwNDAsIDB4MjhlZSwgMHhkMGE0LCAweDAwNDAsIDB4MjhlZSwKKwkweDA0N2UsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAyNCwgMHhhNGE0LCAweDAwZmYsIDB4ODQyNywKKwkweGEwMDYsIDB4MjAwOSwgMHgwMDJkLCAweDEwNzgsIDB4YTIxZCwgMHgwNDdmLCAweDIwYTksIDB4MDBmZiwKKwkweDIwMTEsIDB4MDAwMCwgMHgwMjdlLCAweGEyOGUsIDB4MDA3ZSwgMHgwMDQwLCAweDI5MzYsIDB4YTI4ZSwKKwkweDAwN2YsIDB4MDA0MCwgMHgyOTM2LCAweGEyOGUsIDB4MDA4MCwgMHgwMDQwLCAweDI5MzYsIDB4YTI4OCwKKwkweGE3MzUsIDB4MjEwYywgMHg4MWZmLCAweDAwNDAsIDB4MjkzNiwgMHg4ZmZmLCAweDEwNDAsIDB4Mjk0MiwKKwkweDBjN2UsIDB4MjE2MCwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0OTcyLCAweDBjN2YsIDB4MjAxOSwKKwkweDAwMjksIDB4MTA3OCwgMHg1ZjAxLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4NWUwYSwKKwkweDBjN2UsIDB4MDI3ZSwgMHgyMTYwLCAweDYyMDQsIDB4YTI5NCwgMHgwMGZmLCAweGEyODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4MjkyNiwgMHg2MDA3LCAweDA0MDQsIDB4MDA3OCwgMHgyOTJiLCAweDIwMDEsIDB4MDAwNCwKKwkweDgwMDcsIDB4YTIxNSwgMHg2MjA2LCAweDAyN2YsIDB4MGM3ZiwgMHgwMTdlLCAweDJjMDgsIDB4MTA3OCwKKwkweDlmOGIsIDB4MDE3ZiwgMHgwNzdmLCAweDIxNjAsIDB4MTA3OCwgMHg0N2U5LCAweDAyN2YsIDB4ODIxMCwKKwkweDAwZjAsIDB4MjhmMiwgMHgxNTdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwMzdmLCAweDBjN2YsIDB4MGU3ZiwKKwkweDBmN2YsIDB4MDA3YywgMHgwNDdlLCAweDAyN2UsIDB4MDE3ZSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYzQsIDB4MDA0MCwgMHgyOTU1LCAweGQwYTQsIDB4MDA0MCwgMHgyOTU1LCAweGEwMDYsIDB4MjIyMCwKKwkweDg0MjcsIDB4MjAwOSwgMHgwMDI5LCAweDEwNzgsIDB4YTIxZCwgMHgwMTdmLCAweDAyN2YsIDB4MDQ3ZiwKKwkweDAwN2MsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MGM3ZSwgMHg3Mjg0LCAweDgyZmYsIDB4MDA0MCwKKwkweDI5ODcsIDB4YTI5MCwgMHhhNjUzLCAweDIyMTQsIDB4ZDJhYywgMHgwMGMwLCAweDI5ODcsIDB4MjEwMCwKKwkweDEwNzgsIDB4MjU2NCwgMHg4MWZmLCAweDAwNDAsIDB4Mjk4OSwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwKKwkweGEyZTAsIDB4YWNjMCwgMHgyYzA0LCAweGQzODQsIDB4MDA0MCwgMHgyOTdiLCAweGEwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4MDA3OCwgMHgyOTdkLCAweGEwODQsIDB4MDBmZiwgMHhhMTE2LCAweDAwNDAsIDB4Mjk4OSwKKwkweGEwOTYsIDB4MDBmZiwgMHgwMDQwLCAweDI5ODcsIDB4ODMxOCwgMHgwMDc4LCAweDI5NmYsIDB4YTA4NSwKKwkweDAwMDEsIDB4MGM3ZiwgMHgwMzdmLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MGM3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDIxMTAsIDB4MDI3ZSwKKwkweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDczZDAsIDB4MDI3ZiwgMHgxMDc4LCAweGE0ZjEsIDB4MDM3ZiwKKwkweDAyN2YsIDB4MDE3ZiwgMHhhMTgwLCAweGE3MzUsIDB4MjAwNCwgMHhhMDY1LCAweDAwNDAsIDB4MjliNywKKwkweDAxN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDkxODcsIDB4MDE3ZiwgMHgxMDQwLCAweDEzMzIsIDB4NjExYSwKKwkweDEwNzgsIDB4Mjg4MCwgMHgxMDc4LCAweDc3MmQsIDB4MDE3ZiwgMHgxMDc4LCAweDQ1N2YsIDB4MTI3ZiwKKwkweDBjN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YTYzMywgMHgyMDA0LCAweGQwY2MsIDB4MDA3YywKKwkweDdlZWYsIDB4N2RlOCwgMHg3Y2U0LCAweDgwZTIsIDB4N2JlMSwgMHg4MGUwLCAweDgwZGMsIDB4ODBkYSwKKwkweDdhZDksIDB4ODBkNiwgMHg4MGQ1LCAweDgwZDQsIDB4ODBkMywgMHg4MGQyLCAweDgwZDEsIDB4NzljZSwKKwkweDc4Y2QsIDB4ODBjYywgMHg4MGNiLCAweDgwY2EsIDB4ODBjOSwgMHg4MGM3LCAweDgwYzYsIDB4NzdjNSwKKwkweDc2YzMsIDB4ODBiYywgMHg4MGJhLCAweDc1YjksIDB4ODBiNiwgMHg3NGI1LCAweDczYjQsIDB4NzJiMywKKwkweDgwYjIsIDB4ODBiMSwgMHg4MGFlLCAweDcxYWQsIDB4ODBhYywgMHg3MGFiLCAweDZmYWEsIDB4NmVhOSwKKwkweDgwYTcsIDB4NmRhNiwgMHg2Y2E1LCAweDZiYTMsIDB4NmE5ZiwgMHg2OTllLCAweDY4OWQsIDB4ODA5YiwKKwkweDgwOTgsIDB4Njc5NywgMHg2NjkwLCAweDY1OGYsIDB4NjQ4OCwgMHg2Mzg0LCAweDYyODIsIDB4ODA4MSwKKwkweDgwODAsIDB4NjE3YywgMHg2MDdhLCAweDgwNzksIDB4NWY3NiwgMHg4MDc1LCAweDgwNzQsIDB4ODA3MywKKwkweDgwNzIsIDB4ODA3MSwgMHg4MDZlLCAweDVlNmQsIDB4ODA2YywgMHg1ZDZiLCAweDVjNmEsIDB4NWI2OSwKKwkweDgwNjcsIDB4NWE2NiwgMHg1OTY1LCAweDU4NjMsIDB4NTc1YywgMHg1NjVhLCAweDU1NTksIDB4ODA1NiwKKwkweDgwNTUsIDB4NTQ1NCwgMHg1MzUzLCAweDUyNTIsIDB4NTE1MSwgMHg1MDRlLCAweDRmNGQsIDB4ODA0YywKKwkweDgwNGIsIDB4NGU0YSwgMHg0ZDQ5LCAweDgwNDcsIDB4NGM0NiwgMHg4MDQ1LCAweDgwNDMsIDB4ODAzYywKKwkweDgwM2EsIDB4ODAzOSwgMHg4MDM2LCAweDRiMzUsIDB4ODAzNCwgMHg0YTMzLCAweDQ5MzIsIDB4NDgzMSwKKwkweDgwMmUsIDB4NDcyZCwgMHg0NjJjLCAweDQ1MmIsIDB4NDQyYSwgMHg0MzI5LCAweDQyMjcsIDB4ODAyNiwKKwkweDgwMjUsIDB4NDEyMywgMHg0MDFmLCAweDNmMWUsIDB4M2UxZCwgMHgzZDFiLCAweDNjMTgsIDB4ODAxNywKKwkweDgwMTAsIDB4M2IwZiwgMHgzYTA4LCAweDgwMDQsIDB4MzkwMiwgMHg4MDAxLCAweDgwMDAsIDB4ODAwMCwKKwkweDM4MDAsIDB4MzcwMCwgMHgzNjAwLCAweDgwMDAsIDB4MzUwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDM0MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzMwMCwKKwkweDMyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzEwMCwKKwkweDMwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDJmMDAsIDB4ODAwMCwgMHgyZTAwLCAweDJkMDAsIDB4MmMwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDJiMDAsIDB4ODAwMCwgMHgyYTAwLCAweDI5MDAsIDB4MjgwMCwKKwkweDgwMDAsIDB4MjcwMCwgMHgyNjAwLCAweDI1MDAsIDB4MjQwMCwgMHgyMzAwLCAweDIyMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MjEwMCwgMHgyMDAwLCAweDFmMDAsIDB4MWUwMCwgMHgxZDAwLCAweDFjMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MWIwMCwgMHgxYTAwLCAweDgwMDAsIDB4MTkwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDE4MDAsIDB4ODAwMCwgMHgxNzAwLCAweDE2MDAsIDB4MTUwMCwKKwkweDgwMDAsIDB4MTQwMCwgMHgxMzAwLCAweDEyMDAsIDB4MTEwMCwgMHgxMDAwLCAweDBmMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MGUwMCwgMHgwZDAwLCAweDBjMDAsIDB4MGIwMCwgMHgwYTAwLCAweDA5MDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4MDgwMCwgMHgwNzAwLCAweDgwMDAsIDB4MDYwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDA1MDAsIDB4MDQwMCwgMHgwMzAwLCAweDgwMDAsIDB4MDIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDAxMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDIwNzEsIDB4YTY4MiwgMHg3MDAzLCAweDAwMDIsIDB4YTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4NzAzYSwKKwkweDcwM2UsIDB4NzAzMywgMHhhNjkyLCAweDcwMzcsIDB4YTY5MiwgMHg3MDA3LCAweDAwMDEsIDB4MjA2MSwKKwkweGE2ZDIsIDB4NjAwMywgMHgwMDAyLCAweDAwN2MsIDB4MDA5MCwgMHgyYWU3LCAweDAwNjgsIDB4MmFlNywKKwkweDIwNzEsIDB4YTY4MiwgMHgyYjc4LCAweDc4MTgsIDB4ZDA4NCwgMHgwMGMwLCAweDJhZTcsIDB4MmE2MCwKKwkweDc4MjAsIDB4YTA4ZSwgMHgwMDY5LCAweDAwYzAsIDB4MmJkNywgMHgwMDc5LCAweDJiNmIsIDB4MDA3YywKKwkweDIwNzEsIDB4YTY4MiwgMHg3MDA0LCAweDAwNzksIDB4MmFlZCwgMHgyYWYxLCAweDJhZjIsIDB4MmFmYywKKwkweDJiMGUsIDB4MDA3YywgMHgwMDkwLCAweDJhZmIsIDB4MDA2OCwgMHgyYWZiLCAweDJiNzgsIDB4NzgxOCwKKwkweGQwODQsIDB4MDA0MCwgMHgyYjFhLCAweDAwN2MsIDB4MmI3OCwgMHgyMDYxLCAweGE2ZDIsIDB4NjAwOCwKKwkweGEwOGUsIDB4MDEwMCwgMHgwMDQwLCAweDJiMDksIDB4YTA4NiwgMHgwMjAwLCAweDAwNDAsIDB4MmJjZiwKKwkweDAwN2MsIDB4NzAxNCwgMHgyMDY4LCAweDJhNjAsIDB4NzAxOCwgMHgwMDdhLCAweDcwMTAsIDB4MjA2OCwKKwkweDY4MzQsIDB4YTA4NiwgMHgwMTAzLCAweDAwNDAsIDB4MmIxNiwgMHgwMDdjLCAweDJhNjAsIDB4MmI3OCwKKwkweDcwMTgsIDB4MDA3YSwgMHgyYTYwLCAweDc4MjAsIDB4YTA4YSwgMHgwMDQwLCAweDAwYzgsIDB4MmIyMywKKwkweDYxYmMsIDB4MDA3OSwgMHgyYjJiLCAweDIxMDAsIDB4YTA4YSwgMHgwMDNmLCAweDAwYzgsIDB4MmJjYiwKKwkweDYxYmMsIDB4MDA3OSwgMHgyYjZiLCAweDJiYWQsIDB4MmJkZiwgMHgyYmU3LCAweDJiZWIsIDB4MmJmMywKKwkweDJiZjksIDB4MmJmZCwgMHgyYzA5LCAweDJjMGQsIDB4MmMxNywgMHgyYzFiLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmMxZiwgMHgyYmNiLCAweDJjMmYsIDB4MmM0NiwgMHgyYzVkLCAweDJjZGQsIDB4MmNlMiwKKwkweDJkMGYsIDB4MmQ2OSwgMHgyZDdhLCAweDJkOTgsIDB4MmRkOSwgMHgyZGUzLCAweDJkZjAsIDB4MmUwMywKKwkweDJlMjIsIDB4MmUyYiwgMHgyZTY4LCAweDJlNmUsIDB4MmJjYiwgMHgyZThhLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJlOTEsIDB4MmU5YiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyZWEzLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJlYjUsIDB4MmVjZSwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJlZTAsIDB4MmYzNywgMHgyZjk1LCAweDJmYTksIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgzOThlLCAweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJjMTcsIDB4MmMxYiwgMHgyZmMwLCAweDJiY2IsIDB4MmZjZCwKKwkweDNhMjYsIDB4M2E4MywgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwKKwkweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDMwMWEsIDB4MzE0ZiwgMHgzMTZiLCAweDMxNzcsIDB4MzFkYSwKKwkweDMyMzMsIDB4MzIzZSwgMHgzMjdkLCAweDMyOGMsIDB4MzI5YiwgMHgzMjllLCAweDJmZDEsIDB4MzJjMiwKKwkweDMzMWUsIDB4MzMyYiwgMHgzNDNjLCAweDM1NmYsIDB4MzU5OSwgMHgzNmE2LCAweDJiY2IsIDB4MzZiNiwKKwkweDM2ZjAsIDB4MzdiZiwgMHgyYmNiLCAweDJiY2IsIDB4MmJjYiwgMHgyYmNiLCAweDM4MjcsIDB4Mzg0MywKKwkweDM4YmQsIDB4Mzk3NywgMHg3MTNjLCAweDAwNzgsIDB4MmJhZCwgMHgyMDIxLCAweDQwMDAsIDB4MTA3OCwKKwkweDM1ZjUsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHgyYmJhLCAweDc4MTgsIDB4ZDA4NCwKKwkweDAwNDAsIDB4MmJiZCwgMHgxMjdmLCAweDAwNzgsIDB4MmJiMSwgMHg3YzIyLCAweDc5MjYsIDB4N2EyYSwKKwkweDdiMmUsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwKKwkweDUwMDAsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMjEsIDB4NDAwMSwgMHgwMDc4LCAweDJiYWYsIDB4MjAyMSwKKwkweDQwMDIsIDB4MDA3OCwgMHgyYmFmLCAweDIwMjEsIDB4NDAwMywgMHgwMDc4LCAweDJiYWYsIDB4MjAyMSwKKwkweDQwMDUsIDB4MDA3OCwgMHgyYmFmLCAweDIwMjEsIDB4NDAwNiwgMHgwMDc4LCAweDJiYWYsIDB4YTAyZSwKKwkweDI1MjAsIDB4N2IyOCwgMHg3YTJjLCAweDc4MjQsIDB4NzkzMCwgMHgwMDc4LCAweDM2MDQsIDB4NzgyMywKKwkweDAwMDQsIDB4NzgyNCwgMHgwMDdhLCAweGEwMmUsIDB4MjUyMCwgMHg3YjI4LCAweDdhMmMsIDB4NzgyNCwKKwkweDc5MzAsIDB4MDA3OCwgMHgzNjA4LCAweDc5MjQsIDB4NzgyOCwgMHgyMTE0LCAweDIwMGEsIDB4MDA3OCwKKwkweDJiYWQsIDB4NzkyNCwgMHgyMTE0LCAweDAwNzgsIDB4MmJhZCwgMHgyMDk5LCAweDAwMDksIDB4MjBhMSwKKwkweDAwMDksIDB4MjBhOSwgMHgwMDA3LCAweDUzYTMsIDB4NzkyNCwgMHg3YTI4LCAweDdiMmMsIDB4MDA3OCwKKwkweDJiYWQsIDB4NzgyNCwgMHgyMDYwLCAweDAwNzgsIDB4MmMyMSwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwKKwkweDAwMTMsIDB4MjAxOSwgMHgwMDE4LCAweDc4M2IsIDB4MDAxNywgMHgwMDc4LCAweDJiYWQsIDB4N2QzOCwKKwkweDdjM2MsIDB4MDA3OCwgMHgyYmUxLCAweDdkMzgsIDB4N2MzYywgMHgwMDc4LCAweDJiZWQsIDB4MjA2MSwKKwkweDEwMDAsIDB4NjEwYywgMHhhMDA2LCAweDJjMTQsIDB4YTIwMCwgMHg4YzYwLCAweDgxMDksIDB4MDBjMCwKKwkweDJjMjMsIDB4MjAxMCwgMHhhMDA1LCAweDAwNDAsIDB4MmJhZCwgMHgwMDc4LCAweDJiZDMsIDB4MjA2OSwKKwkweGE2NTIsIDB4NzgyNCwgMHg3OTMwLCAweGExMWEsIDB4MDBjOCwgMHgyYmRiLCAweDgwMTksIDB4MDA0MCwKKwkweDJiZGIsIDB4Njg0YSwgMHg2OTQyLCAweDc4MmMsIDB4Njg1MiwgMHg3ODI4LCAweDY4NTYsIDB4YTAwNiwKKwkweDY4NWEsIDB4Njg1ZSwgMHgxMDc4LCAweDRlYWUsIDB4MDA3OCwgMHgyYmFkLCAweDIwNjksIDB4YTY1MiwKKwkweDc4MjQsIDB4NzkzNCwgMHhhMTFhLCAweDAwYzgsIDB4MmJkYiwgMHg4MDE5LCAweDAwNDAsIDB4MmJkYiwKKwkweDY4NGUsIDB4Njk0NiwgMHg3ODJjLCAweDY4NjIsIDB4NzgyOCwgMHg2ODY2LCAweGEwMDYsIDB4Njg2YSwKKwkweDY4NmUsIDB4MTA3OCwgMHg0YTNlLCAweDAwNzgsIDB4MmJhZCwgMHhhMDJlLCAweDI1MjAsIDB4ODFmZiwKKwkweDAwYzAsIDB4MmJkNywgMHg3OTI0LCAweDdiMjgsIDB4N2EyYywgMHgyMGE5LCAweDAwMDUsIDB4MjBhMSwKKwkweGE2ODksIDB4NDFhMSwgMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwgMHgyYmQ3LCAweDIwMDksIDB4MDAyMCwKKwkweDEwNzgsIDB4MzYwNCwgMHg3MDFiLCAweDJjNzUsIDB4MDA3YywgMHg2ODM0LCAweDIwMDgsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTA5NiwgMHgwMDExLCAweDAwNDAsIDB4MmM4NSwgMHhhMDk2LCAweDAwMTksIDB4MDA0MCwKKwkweDJjODUsIDB4YTA5NiwgMHgwMDE1LCAweDAwYzAsIDB4MmJkNywgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwKKwkweDAwNDAsIDB4MmJkNywgMHg3MTBlLCAweDcwMGMsIDB4ODAwMSwgMHgwMDQwLCAweDJjYjYsIDB4NzAwZSwKKwkweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDJiZDcsIDB4MjAwOSwgMHgwMDIwLCAweDIwNjEsIDB4YTZkMiwKKwkweDYyMjQsIDB4NjMyOCwgMHg2NDJjLCAweDY1MzAsIDB4YTI5MCwgMHgwMDQwLCAweGEzOTksIDB4MDAwMCwKKwkweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MTA3OCwgMHgzNjA0LCAweDcwMWIsIDB4MmNhOSwKKwkweDAwN2MsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA5NiwgMHgwMDAyLCAweDAwNDAsIDB4MmNiNCwKKwkweGEwOTYsIDB4MDAwYSwgMHgwMGMwLCAweDJiZDcsIDB4MDA3OCwgMHgyYzhiLCAweDcwMTAsIDB4MjA2OCwKKwkweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDEwNzgsIDB4NDQzMSwgMHgwMGMwLCAweDJjYzQsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxYiwgMHgyY2M2LCAweDAwN2MsIDB4MTA3OCwgMHg0YjUxLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjBhOSwgMHgwMDA1LCAweDIwOTksIDB4YTY4OSwgMHg1MzBhLCAweDIxMDAsIDB4YTIxMCwKKwkweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweGFkODAsIDB4MDAwZCwKKwkweDIwMDksIDB4MDAyMCwgMHgxMjdmLCAweDAwNzgsIDB4MzYwOCwgMHg2MWE0LCAweDc4MjQsIDB4NjBhNiwKKwkweDAwNzgsIDB4MmJhZCwgMHgyMDkxLCAweDgwMDAsIDB4NzgyMywgMHg0MDAwLCAweDc4MjcsIDB4NDk1MywKKwkweDc4MmIsIDB4NTAyMCwgMHg3ODJmLCAweDIwMjAsIDB4MjAwOSwgMHgwMTdmLCAweDIxMDQsIDB4NzgzMiwKKwkweDNmMDAsIDB4NzgzNiwgMHgyMDYxLCAweDAxMDAsIDB4NjIwMCwgMHgyMDYxLCAweDAyMDAsIDB4NjAzYywKKwkweDgwMDcsIDB4YTIwNSwgMHg3ODNhLCAweDIwMDksIDB4MDRmZCwgMHgyMTA0LCAweDc4M2UsIDB4NzgxYiwKKwkweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgyMDcxLCAweDAwMTAsIDB4MjBjMSwKKwkweDAwZjAsIDB4YTA4YSwgMHgwMDAzLCAweDAwYzgsIDB4MDQyNywgMHgwMDc4LCAweDA0MjMsIDB4ODFmZiwKKwkweDAwYzAsIDB4MmJkNywgMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4MmJkYiwgMHg3ZTM4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDA0OCwKKwkweDJkMjMsIDB4MDA3OCwgMHgyYmRiLCAweDdjMjgsIDB4N2QyYywgMHgxMDc4LCAweDQ3YTQsIDB4ZDI4YywKKwkweDAwYzAsIDB4MmQyZSwgMHgxMDc4LCAweDQ3MzYsIDB4MDA3OCwgMHgyZDMwLCAweDEwNzgsIDB4NDc3MiwKKwkweDAwYzAsIDB4MmQ1YSwgMHgyMDYxLCAweGFkMDAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwKKwkweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDJkNDgsIDB4NjAxMCwgMHhhMDZkLCAweDAwNDAsIDB4MmQ0OCwKKwkweDY4M2MsIDB4YTQwNiwgMHgwMGMwLCAweDJkNDgsIDB4Njg0MCwgMHhhNTA2LCAweDAwNDAsIDB4MmQ1MywKKwkweDEyN2YsIDB4YWNlMCwgMHgwMDEwLCAweDIwMDEsIDB4YTYxNiwgMHgyMDA0LCAweGFjMDIsIDB4MDBjOCwKKwkweDJiZDcsIDB4MDA3OCwgMHgyZDM0LCAweDEwNzgsIDB4OGEwMSwgMHgxMjdmLCAweDAwNDAsIDB4MmJkNywKKwkweDAwNzgsIDB4MmJhZCwgMHhhMDBlLCAweDIwMDEsIDB4MDAwNSwgMHgxMDc4LCAweDRiNTEsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDhmODUsIDB4MTA3OCwgMHg0YTczLCAweDEyN2YsIDB4MDA3OCwKKwkweDJiYWQsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWQyLCAweDAwNDAsIDB4MmJkYiwKKwkweDEwNzgsIDB4NDY3MywgMHgwMDQwLCAweDJiZDcsIDB4MTA3OCwgMHg0N2IyLCAweDAwNDAsIDB4MmJkNywKKwkweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwYzAsIDB4MmJkNywgMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwKKwkweDJiZGIsIDB4MTA3OCwgMHg0ODJmLCAweDAwNDAsIDB4MmJkNywgMHgyMDE5LCAweDAwMDUsIDB4MTA3OCwKKwkweDQ3ZDMsIDB4MDA0MCwgMHgyYmQ3LCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDAwYzgsIDB4MmJkYiwKKwkweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4MTA3OCwgMHg1YTUyLCAweDAwNzgsIDB4MmJhZCwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDgxZmYsIDB4MDA0MCwgMHgyZGEyLCAweDIwMDksIDB4MDAwMSwKKwkweDAwNzgsIDB4MmRkMywgMHgyMDI5LCAweDAwZmYsIDB4NjQ1MCwgMHgyNDAwLCAweGE1MDYsIDB4MDA0MCwKKwkweDJkY2QsIDB4MjUwOCwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHgyZGNkLCAweDEwNzgsIDB4NDgyZiwKKwkweDAwYzAsIDB4MmRiOCwgMHgyMDA5LCAweDAwMDIsIDB4NjJhYywgMHgyNTE4LCAweDAwNzgsIDB4MmRkMywKKwkweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweDQ3ZDMsIDB4MDBjMCwgMHgyZGMyLCAweDIwMDksIDB4MDAwNiwKKwkweDAwNzgsIDB4MmRkMywgMHg3ODI0LCAweGEwOGEsIDB4MTAwMCwgMHgwMGM4LCAweDJkZDYsIDB4ODAwMywKKwkweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDEwNzgsIDB4NWE1MiwgMHg4NTI5LCAweDAwYzgsIDB4MmRhNSwKKwkweDEyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDEyN2YsIDB4MDA3OCwgMHgyYmQ3LCAweDEyN2YsIDB4MDA3OCwKKwkweDJiZGIsIDB4MTA3OCwgMHgzNWQyLCAweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ2ZTcsIDB4MTA3OCwKKwkweDQ3YTQsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsIDB4MzVkMiwKKwkweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ2ZDYsIDB4MTA3OCwgMHg0N2E0LCAweDAwNzgsIDB4MmJhZCwKKwkweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsIDB4MzVkMiwgMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwKKwkweDQ3NzUsIDB4MDA0MCwgMHgyYmQ3LCAweDEwNzgsIDB4NDQ4NCwgMHgxMDc4LCAweDQ3MmYsIDB4MTA3OCwKKwkweDQ3YTQsIDB4MDA3OCwgMHgyYmFkLCAweDEwNzgsIDB4MzVkMiwgMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwKKwkweDQ2NzMsIDB4MDA0MCwgMHgyYmQ3LCAweDYyYTAsIDB4MjAxOSwgMHgwMDA1LCAweDBjN2UsIDB4MTA3OCwKKwkweDQ3ZTksIDB4MGM3ZiwgMHgxMDc4LCAweDVmMDEsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwKKwkweDVlMGEsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4OWY4YiwgMHgwNzdmLCAweDEwNzgsIDB4NDdhNCwKKwkweDAwNzgsIDB4MmJhZCwgMHgxMDc4LCAweDM1ZDIsIDB4MDA0MCwgMHgyYmRiLCAweDEwNzgsIDB4NDdhNCwKKwkweDIyMDgsIDB4MDA3OCwgMHgyYmFkLCAweDE1N2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDIwNjksIDB4YTcxNCwKKwkweDY4MTAsIDB4NjkxNCwgMHhhMTBhLCAweDAwYzgsIDB4MmUzNywgMHgyMDA5LCAweDAwMDAsIDB4NjgxNiwKKwkweDIwMTEsIDB4MDAwMCwgMHgyMDE5LCAweDAwMDAsIDB4MjBhOSwgMHgwMGZmLCAweDIwNjksIDB4YTczNSwKKwkweDJkMDQsIDB4YTA3NSwgMHgwMDQwLCAweDJlNGMsIDB4NzA0YywgMHgxMDc4LCAweDJlNTYsIDB4YTIxMCwKKwkweDcwODAsIDB4MTA3OCwgMHgyZTU2LCAweGEzMTgsIDB4OGQ2OCwgMHgwMGYwLCAweDJlNDAsIDB4MjMwMCwKKwkweGEyMTgsIDB4MGU3ZiwgMHgwZDdmLCAweDE1N2YsIDB4MDA3OCwgMHgyYmFkLCAweDBmN2UsIDB4MDE3ZSwKKwkweGEwN2QsIDB4MDA0MCwgMHgyZTY1LCAweDIwMDEsIDB4MDAwMCwgMHg4MDAwLCAweDJmMGMsIDB4ODFmZiwKKwkweDAwNDAsIDB4MmU2NSwgMHgyMTc4LCAweDAwNzgsIDB4MmU1ZCwgMHgwMTdmLCAweDBmN2YsIDB4MDA3YywKKwkweDIwNjksIDB4YTcxNCwgMHg2OTEwLCAweDYyYTgsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MDBjMCwKKwkweDJiZDcsIDB4NjE1MCwgMHhhMTkwLCAweDI5YzAsIDB4MjIxNCwgMHhhMjk0LCAweDAwZmYsIDB4NjA3MCwKKwkweGEwODQsIDB4ZmYwMCwgMHhhMjE1LCAweDYzNmMsIDB4NjdjYywgMHhkNzljLCAweDAwNDAsIDB4MmU4NCwKKwkweDIwMzEsIDB4MDAwMSwgMHgwMDc4LCAweDJlODYsIDB4MjAzMSwgMHgwMDAwLCAweDdlM2EsIDB4N2YzZSwKKwkweDAwNzgsIDB4MmJhZCwgMHg2MTQwLCAweDYyNDQsIDB4MjAxOSwgMHhhOGEyLCAweDIzMWMsIDB4MDA3OCwKKwkweDJiYWQsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjEzNCwgMHg2MzM4LCAweGEwMDYsIDB4MjAxMCwKKwkweDEyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDEwNzgsIDB4MzVlNCwgMHgwMDQwLCAweDJiZGIsIDB4NjI0NCwKKwkweDYzMzgsIDB4MDA3OCwgMHgyYmFkLCAweDYxNDAsIDB4NjI0NCwgMHg3ODI0LCAweDYwNDIsIDB4N2IyOCwKKwkweDYzNDYsIDB4MjA2OSwgMHhhNjUyLCAweDgzMWYsIDB4YTMwNSwgMHg2ODE2LCAweDc4MmMsIDB4MjA2OSwKKwkweGE4YTIsIDB4MmQxYywgMHgyMDZhLCAweDAwNzgsIDB4MmJhZCwgMHgwMTdlLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzgyNCwgMHg2MDM2LCAweGQwOTQsIDB4MDA0MCwgMHgyZWM4LCAweDc4MjgsIDB4YTA4NSwKKwkweDAwMDEsIDB4MjAwOSwgMHhhOGFiLCAweDIwMGEsIDB4MjAwMSwgMHhmZmZmLCAweDEwNzgsIDB4NWFlNiwKKwkweDc4MmMsIDB4NjAzYSwgMHgxMjdmLCAweDAxN2YsIDB4MDA3OCwgMHgyYmFkLCAweDEwNzgsIDB4MzVlNCwKKwkweDAwNDAsIDB4MmJkYiwgMHg3ODI4LCAweGEwMGQsIDB4MDA0MCwgMHgyYmRiLCAweDc4MmMsIDB4YTAwNSwKKwkweDAwNDAsIDB4MmJkYiwgMHg2MjQ0LCAweDYxNDYsIDB4NjMzOCwgMHg2MDNhLCAweDAwNzgsIDB4MmJhZCwKKwkweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDJiZDcsIDB4MGM3ZSwKKwkweDIwNjEsIDB4MDEwMCwgMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweGExOTYsIDB4MDBmZiwKKwkweDAwYzAsIDB4MmVmNywgMHg2MDMwLCAweGEwODUsIDB4ZmYwMCwgMHgwMDc4LCAweDJmMDYsIDB4YTE4MiwKKwkweDAwN2YsIDB4MDBjOCwgMHgyZjMwLCAweGExODgsIDB4MjljMCwgMHgyMTBjLCAweGExOGMsIDB4MDBmZiwKKwkweDYwMzAsIDB4YTExNiwgMHgwMDQwLCAweDJmMzAsIDB4ODEwZiwgMHhhMTA1LCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDA3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDA3ZiwgMHgwMDQwLCAweDJmMmMsIDB4NjAxYSwKKwkweDYwMGIsIDB4YmMwOSwgMHg2MDFmLCAweDAwMDEsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MmYzMywKKwkweDY4MzcsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDMsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwKKwkweDY4M2EsIDB4NzAxYiwgMHgyZjhlLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMzIsIDB4MTA3OCwKKwkweDc3NWMsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MTI3ZiwgMHgwYzdmLCAweDAwNzgsIDB4MmJkNywKKwkweDBjN2YsIDB4MDA3OCwgMHgyYmRiLCAweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDJmMmMsIDB4MjAwMSwKKwkweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYmQ3LCAweDBjN2UsIDB4MjA2MSwKKwkweDAxMDAsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LCAweDAwZmYsIDB4MDBjMCwKKwkweDJmNGUsIDB4NjAzMCwgMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHgyZjVkLCAweGExODIsIDB4MDA3ZiwKKwkweDAwYzgsIDB4MmY4NywgMHhhMTg4LCAweDI5YzAsIDB4MjEwYywgMHhhMThjLCAweDAwZmYsIDB4NjAzMCwKKwkweGExMTYsIDB4MDA0MCwgMHgyZjg3LCAweDgxMGYsIDB4YTEwNSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDAwN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAwN2YsIDB4MDA0MCwgMHgyZjgzLCAweDYwMWEsIDB4NjAwYiwKKwkweGJjMDUsIDB4NjAxZiwgMHgwMDAxLCAweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDJmOGEsIDB4NjgzNywKKwkweDAwMDAsIDB4NzAwNywgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwKKwkweDcwMWIsIDB4MmY4ZSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLCAweDEwNzgsIDB4Nzc1YywKKwkweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDc4LCAweDJiZDcsIDB4MGM3ZiwKKwkweDAwNzgsIDB4MmJkYiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHgyZjgzLCAweDY4MzAsIDB4YTA4NiwKKwkweDAxMDAsIDB4MDA0MCwgMHgyYmQ3LCAweDAwNzgsIDB4MmJhZCwgMHgyMDYxLCAweGE5MzMsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweGQwODQsIDB4MDA0MCwgMHgyZmE2LCAweDYxMDQsIDB4NjIwOCwKKwkweDIwMTksIDB4YTYxMiwgMHgyMzFjLCAweDEyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDEyN2YsIDB4MDA3OCwKKwkweDJiZGIsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjI0OCwKKwkweDYwNjQsIDB4YTIwMiwgMHgwMDQ4LCAweDJmYmQsIDB4YTA4NSwgMHgwMDAxLCAweDEwNzgsIDB4MjU2YSwKKwkweDEwNzgsIDB4M2M5ZSwgMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHgxMjdmLCAweDAwNzgsIDB4MmJkYiwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAxMiwgMHgyMDAxLCAweGE2NDAsIDB4MjBhMCwKKwkweGEwMDYsIDB4NDBhNCwgMHgxMjdmLCAweDAwNzgsIDB4MmJhZCwgMHg3ZDM4LCAweDdjM2MsIDB4MDA3OCwKKwkweDJjNWYsIDB4NzgyNCwgMHhhMDljLCAweDAwZmYsIDB4YTM5YSwgMHgwMDAzLCAweDAwYzgsIDB4MmJkNywKKwkweDYyNTAsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4YTIwNiwgMHgwMGMwLCAweDJmZTksIDB4MjAwMSwKKwkweGE2NDAsIDB4MjAwOSwgMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDA3OCwKKwkweDM2MDgsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWU0LCAweDAwNDAsIDB4MmJkYiwKKwkweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDJiZDcsIDB4MGM3ZSwKKwkweDEwNzgsIDB4MzViYSwgMHgwYzdmLCAweDAwNDAsIDB4MmJkNywgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwKKwkweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDhlNGEsIDB4MDA0MCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWIsIDB4MzAwYiwgMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDAwNDAsIDB4MmJkNywKKwkweGFkODAsIDB4MDAwZSwgMHgyMDA5LCAweDAwMGMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwKKwkweDAwNzgsIDB4MzYwOCwgMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwgMHgyYmQ3LCAweDEwNzgsIDB4NDJkZCwKKwkweDIwMDksIDB4MDAxYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsIDB4MzYwNCwKKwkweDcwMWIsIDB4MzAyYiwgMHgwMDdjLCAweGFkZTgsIDB4MDAwZCwgMHg2ODAwLCAweGEwMDUsIDB4MDA0MCwKKwkweDJiZGIsIDB4NjgwNCwgMHhkMGFjLCAweDAwNDAsIDB4MzAzOCwgMHhkMGE0LCAweDAwNDAsIDB4MmJkYiwKKwkweGQwOTQsIDB4MDA0MCwgMHgzMDQzLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4YTE4YywKKwkweGZmZGYsIDB4NjEwNiwgMHgwYzdmLCAweGQwOGMsIDB4MDA0MCwgMHgzMDRlLCAweDBjN2UsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjEwNCwgMHhhMThkLCAweDAwMTAsIDB4NjEwNiwgMHgwYzdmLCAweDIwMDksIDB4MDEwMCwKKwkweDIxMGMsIDB4YTE4YSwgMHgwMDAyLCAweDAwNDgsIDB4MzA2MywgMHhkMDg0LCAweDAwNDAsIDB4MzA2MywKKwkweDZhMjgsIDB4YTI4YSwgMHgwMDdmLCAweDAwYzgsIDB4MmJkYiwgMHhhMjg4LCAweDI5YzAsIDB4MjEwYywKKwkweGExOGMsIDB4MDBmZiwgMHg2MTU2LCAweGQwZGMsIDB4MDA0MCwgMHgzMDZjLCAweDY4MjgsIDB4YTA4YSwKKwkweDAwN2YsIDB4MDBjOCwgMHgyYmRiLCAweDYwNTIsIDB4NjgwOCwgMHhhMDhhLCAweDAxMDAsIDB4MDA0OCwKKwkweDJiZGIsIDB4YTA4YSwgMHgwODQxLCAweDAwYzgsIDB4MmJkYiwgMHhhMDg0LCAweDAwMDcsIDB4MDBjMCwKKwkweDJiZGIsIDB4NjgwYywgMHhhMDA1LCAweDAwNDAsIDB4MmJkYiwgMHg2ODEwLCAweGEwMDUsIDB4MDA0MCwKKwkweDJiZGIsIDB4Njg0OCwgMHg2OTQwLCAweGExMGEsIDB4MDBjOCwgMHgyYmRiLCAweDgwMDEsIDB4MDA0MCwKKwkweDJiZGIsIDB4Njg0YywgMHg2OTQ0LCAweGExMGEsIDB4MDBjOCwgMHgyYmRiLCAweDgwMDEsIDB4MDA0MCwKKwkweDJiZGIsIDB4NjgwNCwgMHhkMGZjLCAweDAwNDAsIDB4MzBjMiwgMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwKKwkweDJiZDcsIDB4MjAwOSwgMHgwMDE0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4YTI5MCwKKwkweDAwMzgsIDB4YTM5OSwgMHgwMDAwLCAweDEwNzgsIDB4MzYwNCwgMHg3MDFiLCAweDMwYTgsIDB4MDA3YywKKwkweGFkZTgsIDB4MDAwZCwgMHgyMGE5LCAweDAwMTQsIDB4MmQ5OCwgMHgyMDY5LCAweGE2NmUsIDB4MmRhMCwKKwkweDUzYTMsIDB4NzAxMCwgMHhhMGU4LCAweDAwMGQsIDB4MjAwMSwgMHhhNjcyLCAweDIwMGMsIDB4ZDFlNCwKKwkweDAwNDAsIDB4MzBjMiwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweGEwODUsIDB4MGIwMCwKKwkweDYwMDYsIDB4MGM3ZiwgMHgyMGE5LCAweDAwMWMsIDB4MmQ5OCwgMHgyMDY5LCAweGE2NTIsIDB4MmRhMCwKKwkweDUzYTMsIDB4NjgxNCwgMHhhMDhjLCAweDAwZmYsIDB4NjE0MiwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwKKwkweDYwNDYsIDB4MTA3OCwgMHg0ZWFlLCAweDEwNzgsIDB4NDljZSwgMHgxMDc4LCAweDRhM2UsIDB4NjAwMCwKKwkweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDMxNGQsIDB4NjgwOCwgMHg2MDJhLCAweDEwNzgsIDB4MjFmNywKKwkweDY4MTgsIDB4NjkxYywgMHg2YTIwLCAweDZiMjQsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwKKwkweDYwMTYsIDB4NjExYSwgMHg2MjFlLCAweDYzMjIsIDB4NmMwNCwgMHhkNGY0LCAweDAwNDAsIDB4MzBmYSwKKwkweDY4MzAsIDB4NjkzNCwgMHg2YTM4LCAweDZiM2MsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwKKwkweDAwNzgsIDB4MzBmYywgMHhhMDg0LCAweGYwZmYsIDB4NjAwNiwgMHg2MTBhLCAweDYyMGUsIDB4NjMxMiwKKwkweDEwNzgsIDB4NWIxOSwgMHg2OTA0LCAweGQxZmMsIDB4MDA0MCwgMHgzMTJmLCAweDBjN2UsIDB4MjAwOSwKKwkweDAwMDAsIDB4MjBhOSwgMHgwMDAxLCAweDZiNzAsIDB4ZDM4NCwgMHgwMDQwLCAweDMxMmMsIDB4MDA3OCwKKwkweDMxMTYsIDB4ODM5ZCwgMHgwMGM4LCAweDMxMmMsIDB4MzUwOCwgMHg4MTA5LCAweDEwNzgsIDB4NTQ4MCwKKwkweDY4NzgsIDB4NjAxNiwgMHg2ODc0LCAweDIwMDgsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4NjAwYSwKKwkweGExODQsIDB4MDBmZiwgMHg2MDA2LCAweDgxMDgsIDB4MDBjMCwgMHgzMTJhLCAweDYwMDMsIDB4MDAwMywKKwkweDAwNzgsIDB4MzEyYywgMHg2MDAzLCAweDAwMDEsIDB4MDBmMCwgMHgzMTExLCAweDBjN2YsIDB4MGM3ZSwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDBjN2YsIDB4MTA3OCwKKwkweDM4MTksIDB4MDA0MCwgMHgzMTNkLCAweDEwNzgsIDB4MjU2YSwgMHg2MGMwLCAweGEwMDUsIDB4MDA0MCwKKwkweDMxNDksIDB4NjAwMywgMHgwMDAxLCAweDIwOTEsIDB4MzAxZCwgMHgxMDc4LCAweDQyMjQsIDB4MDA3OCwKKwkweDMxNGQsIDB4NjAwMywgMHgwMDA0LCAweDIwOTEsIDB4MzAxZCwgMHgwMDc4LCAweDJiYWQsIDB4NjAwMCwKKwkweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDJiZDcsIDB4MjA2OSwgMHhhNjUyLCAweDc4MzAsIDB4Njg0MiwKKwkweDc4MzQsIDB4Njg0NiwgMHg2ODA0LCAweGQwZmMsIDB4MDA0MCwgMHgzMTYyLCAweDIwMDksIDB4MDAzMCwKKwkweDAwNzgsIDB4MzE2NCwgMHgyMDA5LCAweDAwMWMsIDB4MmQwMCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywKKwkweDdkMzgsIDB4MDA3OCwgMHgzNjA4LCAweGEwMDYsIDB4MTA3OCwgMHgyNTZhLCAweDgxZmYsIDB4MDBjMCwKKwkweDJiZDcsIDB4MTA3OCwgMHg0MmRkLCAweDEwNzgsIDB4NDIyNCwgMHgwMDc4LCAweDJiYWQsIDB4ODFmZiwKKwkweDAwYzAsIDB4MmJkNywgMHg2MTg0LCAweDgxZmYsIDB4MDA0MCwgMHgzMTkxLCAweDcwM2YsIDB4MDAwMCwKKwkweDIwMDEsIDB4YWNjMCwgMHgyMDA5LCAweDAwNDAsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MzYwOCwgMHg3MDFiLCAweDJiYWEsIDB4MTI3ZiwKKwkweDAwN2MsIDB4NzAzZiwgMHgwMDAxLCAweDBkN2UsIDB4MjA2OSwgMHhhY2MwLCAweDIwYTksIDB4MDA0MCwKKwkweDIwYTEsIDB4YWNjMCwgMHgyMDE5LCAweGZmZmYsIDB4NDNhNCwgMHg2NTUwLCAweGE1ODgsIDB4MjljMCwKKwkweDIxMGMsIDB4YTE4YywgMHgwMGZmLCAweDIxNmEsIDB4YTAwZSwgMHgyMDExLCAweDAwMDIsIDB4MjEwMCwKKwkweGE1MDYsIDB4MDA0MCwgMHgzMWMzLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDMxYzMsIDB4NjAxNCwKKwkweDgyMWMsIDB4MDA0OCwgMHgzMWJiLCAweGEzOTgsIDB4YWNjMCwgMHhhMDg1LCAweGZmMDAsIDB4ODAwNywKKwkweDIwMWEsIDB4MDA3OCwgMHgzMWMyLCAweGEzOTgsIDB4YWNjMCwgMHgyMzI0LCAweGE0YTQsIDB4ZmYwMCwKKwkweGE0MDUsIDB4MjAxYSwgMHg4MjEwLCAweDgxMDgsIDB4YTE4MiwgMHgwMDgwLCAweDAwYzgsIDB4MzFjYSwKKwkweDAwNzgsIDB4MzFhNywgMHg4MjAxLCAweDgwMDcsIDB4MmQwYywgMHhhMTA1LCAweDIwNmEsIDB4MGQ3ZiwKKwkweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweGFjYzAsIDB4MjA5OSwgMHhhY2MwLCAweDEwNzgsIDB4NDI4MSwKKwkweDAwNzgsIDB4MzE4MCwgMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDBjN2UsIDB4MTA3OCwKKwkweDM1YmEsIDB4MGM3ZiwgMHgwMGMwLCAweDMxZTgsIDB4MjAwOSwgMHgwMDAyLCAweDAwNzgsIDB4MmJkNywKKwkweDIwMDEsIDB4YTY1MywgMHgyMDA0LCAweGQwYjQsIDB4MDA0MCwgMHgzMjBmLCAweDYwMDAsIDB4ZDA4YywKKwkweDAwYzAsIDB4MzIwZiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDMyMGYsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDEwNzgsIDB4OGU5ZSwKKwkweDAwYzAsIDB4MzIwNiwgMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWIsIDB4MzIwYiwgMHgwMDdjLCAweDEwNzgsIDB4MzVlNCwgMHgwMDQwLCAweDJiZGIsIDB4MjBhOSwKKwkweDAwMmIsIDB4MmM5OCwgMHhhZGU4LCAweDAwMDIsIDB4MmRhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAwNCwKKwkweGFjODAsIDB4MDAwNiwgMHgyMDk4LCAweGFkODAsIDB4MDAwNiwgMHgyMGEwLCAweDEwNzgsIDB4NDI4MSwKKwkweDIwYTksIDB4MDAwNCwgMHhhYzgwLCAweDAwMGEsIDB4MjA5OCwgMHhhZDgwLCAweDAwMGEsIDB4MjBhMCwKKwkweDEwNzgsIDB4NDI4MSwgMHgyZDAwLCAweDIwMDksIDB4MDAyYiwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywKKwkweDdkMzgsIDB4MDA3OCwgMHgzNjA4LCAweDgxZmYsIDB4MDBjMCwgMHgyYmQ3LCAweDEwNzgsIDB4MzVkMiwKKwkweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ3YmQsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MDBjMCwKKwkweDJiZDcsIDB4NzgyOCwgMHhhMDhhLCAweDEwMDAsIDB4MDBjOCwgMHgyYmRiLCAweDEwNzgsIDB4MzVlNCwKKwkweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ4MmYsIDB4MDA0MCwgMHgyYmQ3LCAweDIwMTksIDB4MDAwNCwKKwkweDEwNzgsIDB4NDdkMywgMHg3OTI0LCAweDgxMGYsIDB4N2EyOCwgMHgxMDc4LCAweDMyNTksIDB4MDA3OCwKKwkweDJiYWQsIDB4YTE4NiwgMHgwMGZmLCAweDAwNDAsIDB4MzI2MSwgMHgxMDc4LCAweDMyNzEsIDB4MDA3OCwKKwkweDMyNzAsIDB4MjAyOSwgMHgwMDdlLCAweDIwNjEsIDB4YTYwMCwgMHg2NDUwLCAweDI0MDAsIDB4YTUwNiwKKwkweDAwNDAsIDB4MzI2ZCwgMHgyNTA4LCAweDEwNzgsIDB4MzI3MSwgMHg4NTI5LCAweDAwYzgsIDB4MzI2NiwKKwkweDAwN2MsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4MzI3YywgMHgyMjAwLCAweDgwMDMsIDB4ODAwYiwKKwkweDgxMGIsIDB4YTEwOCwgMHgxMDc4LCAweDVhNTIsIDB4MDA3YywgMHg4MWZmLCAweDAwYzAsIDB4MmJkNywKKwkweDEwNzgsIDB4MzVkMiwgMHgwMDQwLCAweDJiZGIsIDB4MTA3OCwgMHg0NjczLCAweDAwNDAsIDB4MmJkNywKKwkweDEwNzgsIDB4NDdjOCwgMHgwMDc4LCAweDJiYWQsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwKKwkweDM1ZDIsIDB4MDA0MCwgMHgyYmRiLCAweDEwNzgsIDB4NDY3MywgMHgwMDQwLCAweDJiZDcsIDB4MTA3OCwKKwkweDQ3YjIsIDB4MDA3OCwgMHgyYmFkLCAweDYxMDAsIDB4MDA3OCwgMHgyYmFkLCAweDEwNzgsIDB4MzVlNCwKKwkweDAwNDAsIDB4MmJkYiwgMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwKKwkweDJiZDcsIDB4MGQ3ZSwgMHhhY2U4LCAweDAwMGEsIDB4NzkyNCwgMHhkMTg0LCAweDAwNDAsIDB4MzJiMiwKKwkweGFjZTgsIDB4MDAwNiwgMHg2ODBjLCAweDgwMDcsIDB4NzgzZSwgMHg2ODA4LCAweDgwMDcsIDB4NzgzYSwKKwkweDZiMDQsIDB4ODMxZiwgMHg2YTAwLCAweDgyMTcsIDB4MGQ3ZiwgMHg2MTAwLCAweGExOGMsIDB4MDIwMCwKKwkweDAwNzgsIDB4MmJhZCwgMHhhMDA2LCAweDEwNzgsIDB4MjU2YSwgMHg3ODI0LCAweGEwODQsIDB4MDBmZiwKKwkweGEwODYsIDB4MDBmZiwgMHgwMDQwLCAweDMyY2YsIDB4ODFmZiwgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwKKwkweDQyZGQsIDB4NzgyOCwgMHhhMDhhLCAweDEwMDAsIDB4MDBjOCwgMHgyYmRiLCAweDc5MjQsIDB4YTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwZmYsIDB4MDA0MCwgMHgzMmU1LCAweGExODIsIDB4MDA3ZiwKKwkweDAwYzgsIDB4MmJkYiwgMHgyMTAwLCAweDEwNzgsIDB4MjU2NCwgMHgwMjdlLCAweDBjN2UsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDYxLCAweGE4YzQsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwKKwkweDIwMTEsIDB4MDAwMywgMHgxMDc4LCAweDcwZTAsIDB4MjAxMSwgMHgwMDAyLCAweDEwNzgsIDB4NzBlYSwKKwkweDEwNzgsIDB4NmZjNCwgMHgwMzdlLCAweDIwMTksIDB4MDAwMCwgMHgxMDc4LCAweDcwNTgsIDB4MDM3ZiwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MDMwLCAweGEwODQsIDB4MDBmZiwgMHg4MTBmLCAweGExMDUsIDB4NjA0YSwKKwkweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NDI1OSwKKwkweDEwNzgsIDB4NWFkZCwgMHg3OTI0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDdhMjgsIDB4MTA3OCwKKwkweDMyNTksIDB4MTI3ZiwgMHgwYzdmLCAweDAyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDc5MjQsIDB4YTE4YywKKwkweGZmMDAsIDB4ODEwZiwgMHgwYzdlLCAweDEwNzgsIDB4NDU1YywgMHgyYzA4LCAweDBjN2YsIDB4MDBjMCwKKwkweDJiZGIsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MDA0MCwgMHgzMzMyLCAweDIwMDksIDB4MDAwMSwKKwkweDAwNzgsIDB4MmJkNywgMHg2MGNjLCAweGQwOWMsIDB4MDBjMCwgMHgzMzNhLCAweDIwMDksIDB4MDAwNSwKKwkweDAwNzgsIDB4MmJkNywgMHgxMDc4LCAweDM1YmEsIDB4MDBjMCwgMHgzMzQyLCAweDIwMDksIDB4MDAwMiwKKwkweDAwNzgsIDB4MmJkNywgMHg3OTI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTA3OCwKKwkweDM2MDQsIDB4NzAxYiwgMHgzMzRjLCAweDAwN2MsIDB4MjAwOSwgMHgwMDgwLCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4MzM1OSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwKKwkweDMzNWQsIDB4MjAyMSwgMHg0MDBhLCAweDAwNzgsIDB4MmJhZiwgMHgwZDdlLCAweGFkZTgsIDB4MDAwZCwKKwkweDY5MDAsIDB4NmEwOCwgMHg2YjBjLCAweDZjMTAsIDB4NmQxNCwgMHg2ZTE4LCAweDY4MjAsIDB4YTBiZSwKKwkweDAxMDAsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsIDB4MDExMiwgMHgwMDQwLCAweDMzZDAsIDB4YTBiZSwKKwkweDAxMTMsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsIDB4MDExNCwgMHgwMDQwLCAweDMzZDAsIDB4YTBiZSwKKwkweDAxMTcsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsIDB4MDExYSwgMHgwMDQwLCAweDMzZDAsIDB4YTBiZSwKKwkweDAxMjEsIDB4MDA0MCwgMHgzM2M2LCAweGEwYmUsIDB4MDEzMSwgMHgwMDQwLCAweDMzYzYsIDB4YTBiZSwKKwkweDAxNzEsIDB4MDA0MCwgMHgzM2QwLCAweGEwYmUsIDB4MDE3MywgMHgwMDQwLCAweDMzZDAsIDB4YTBiZSwKKwkweDAxYTEsIDB4MDBjMCwgMHgzMzk4LCAweDY4MzAsIDB4ODAwNywgMHg2ODMyLCAweDAwNzgsIDB4MzNkNiwKKwkweGEwYmUsIDB4MDIxMiwgMHgwMDQwLCAweDMzY2MsIDB4YTBiZSwgMHgwMjEzLCAweDAwNDAsIDB4MzNjYywKKwkweGEwYmUsIDB4MDIxNCwgMHgwMDQwLCAweDMzYmUsIDB4YTBiZSwgMHgwMjE3LCAweDAwNDAsIDB4MzNiOCwKKwkweGEwYmUsIDB4MDIxYSwgMHgwMGMwLCAweDMzYjEsIDB4NjgzOCwgMHg4MDA3LCAweDY4M2EsIDB4MDA3OCwKKwkweDMzZDAsIDB4YTBiZSwgMHgwMzAwLCAweDAwNDAsIDB4MzNkMCwgMHgwZDdmLCAweDAwNzgsIDB4MmJkYiwKKwkweGFkODAsIDB4MDAxMCwgMHgyMGE5LCAweDAwMDcsIDB4MTA3OCwgMHgzNDE4LCAweGFkODAsIDB4MDAwZSwKKwkweDIwYTksIDB4MDAwMSwgMHgxMDc4LCAweDM0MTgsIDB4MDA3OCwgMHgzM2QwLCAweGFkODAsIDB4MDAwYywKKwkweDEwNzgsIDB4MzQyNiwgMHgwMDc4LCAweDMzZDYsIDB4YWQ4MCwgMHgwMDBlLCAweDEwNzgsIDB4MzQyNiwKKwkweGFkODAsIDB4MDAwYywgMHgyMGE5LCAweDAwMDEsIDB4MTA3OCwgMHgzNDE4LCAweDBjN2UsIDB4MTA3OCwKKwkweDM1YmEsIDB4MDA0MCwgMHgzNDA5LCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDY4MzcsIDB4MDExOSwKKwkweDY4NTMsIDB4MDAwMCwgMHg2ODRmLCAweDAwMjAsIDB4Njg1YiwgMHgwMDAxLCAweDgxMGIsIDB4Njk3ZSwKKwkweDY4ODMsIDB4MDAwMCwgMHg2YTg2LCAweDZiOGEsIDB4NmM4ZSwgMHg2ZDkyLCAweDY5OTYsIDB4Njg5YiwKKwkweDAwMDAsIDB4MGM3ZiwgMHgwZDdmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwKKwkweDY4MjMsIDB4MDAwMCwgMHg2ODA0LCAweDIwNjgsIDB4MTA3OCwgMHg4ZTY2LCAweDAwYzAsIDB4MzQwNCwKKwkweDIwMDksIDB4MDAwMywgMHgwMDc4LCAweDJiZDcsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzQwZiwKKwkweDAwN2MsIDB4MGM3ZiwgMHgwZDdmLCAweDIwMDksIDB4MDAwMiwgMHgwMDc4LCAweDJiZDcsIDB4NjgyMCwKKwkweGEwODYsIDB4ODAwMSwgMHgwMGMwLCAweDJiYWQsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MmJkNywKKwkweDAxN2UsIDB4MjAwOCwgMHgyMDQ0LCAweDgwMDAsIDB4MjA0YywgMHg4MDAwLCAweDI5MGEsIDB4ODEwOCwKKwkweDI4MGEsIDB4ODEwOCwgMHgwMGYwLCAweDM0MWEsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MGE3ZSwKKwkweDBiN2UsIDB4MjAwOCwgMHgyMDQ0LCAweDgwMDAsIDB4MjA0YywgMHg4MDAwLCAweDIwNTQsIDB4ODAwMCwKKwkweDIwNWMsIDB4MmIwYSwgMHg4MTA4LCAweDJhMGEsIDB4ODEwOCwgMHgyOTBhLCAweDgxMDgsIDB4MjgwYSwKKwkweDBiN2YsIDB4MGE3ZiwgMHgwMTdmLCAweDAwN2MsIDB4ODFmZiwgMHgwMDQwLCAweDM0NDMsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDA3OCwgMHgyYmQ3LCAweDYwY2MsIDB4ZDA5YywgMHgwMGMwLCAweDM0NGIsIDB4MjAwOSwKKwkweDAwMDUsIDB4MDA3OCwgMHgyYmQ3LCAweDc5MjQsIDB4MjE0MCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwKKwkweGExODIsIDB4MDA4MCwgMHgwMDQ4LCAweDJiZGIsIDB4YTE4MiwgMHgwMGZmLCAweDAwYzgsIDB4MmJkYiwKKwkweDdhMmMsIDB4N2IyOCwgMHg2MDZjLCAweGEzMDYsIDB4MDBjMCwgMHgzNDY2LCAweDYwNzAsIDB4YTI0ZSwKKwkweDAwNDAsIDB4MmJkYiwgMHhhOWNjLCAweGZmMDAsIDB4MDA0MCwgMHgyYmRiLCAweDBjN2UsIDB4MTA3OCwKKwkweDM1MGYsIDB4MmM2OCwgMHgwYzdmLCAweDAwNDAsIDB4MzQ5ZSwgMHhhMGM2LCAweDQwMDAsIDB4MDBjMCwKKwkweDM0ODQsIDB4MGM3ZSwgMHgwMDdlLCAweDJkNjAsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4NDg5YiwKKwkweDAwYzAsIDB4MzQ3YiwgMHhjMTg1LCAweDYwMDAsIDB4ZDBiYywgMHgwMDQwLCAweDM0ODAsIDB4YzE4ZCwKKwkweDAwN2YsIDB4MGM3ZiwgMHgwMDc4LCAweDM0OWIsIDB4YTBjNiwgMHg0MDA3LCAweDAwYzAsIDB4MzQ4YiwKKwkweDI0MDgsIDB4MDA3OCwgMHgzNDliLCAweGEwYzYsIDB4NDAwOCwgMHgwMGMwLCAweDM0OTMsIDB4MjcwOCwKKwkweDI2MTAsIDB4MDA3OCwgMHgzNDliLCAweGEwYzYsIDB4NDAwOSwgMHgwMGMwLCAweDM0OTksIDB4MDA3OCwKKwkweDM0OWIsIDB4MjAwMSwgMHg0MDA2LCAweDIwMjAsIDB4MDA3OCwgMHgyYmFmLCAweDJkMDAsIDB4NzAyMiwKKwkweDAxN2UsIDB4MGI3ZSwgMHgwYzdlLCAweDBlN2UsIDB4MmM3MCwgMHgxMDc4LCAweDc2YzcsIDB4MDA0MCwKKwkweDM0ZTQsIDB4MmQwMCwgMHg2MDFhLCAweDIwMDEsIDB4YTY1NywgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwKKwkweDY4NDIsIDB4MmU1OCwgMHgwZTdmLCAweDBlN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDM1YmEsIDB4MGM3ZiwKKwkweDJiNzAsIDB4MDBjMCwgMHgzNGM1LCAweDEwNzgsIDB4NzcyZCwgMHgwZTdmLCAweDBjN2YsIDB4MGI3ZiwKKwkweDAxN2YsIDB4MjAwOSwgMHgwMDAyLCAweDAwNzgsIDB4MmJkNywgMHg2ODM3LCAweDAwMDAsIDB4MmQwMCwKKwkweDYwMTIsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHgyODgwLCAweDEyN2YsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwKKwkweDEwNzgsIDB4NDRlZSwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NTAyLCAweDIwMDksIDB4MDAwMiwKKwkweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwYzdmLCAweDBiN2YsIDB4MDE3ZiwKKwkweDAwYzAsIDB4MzRlZSwgMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWIsIDB4MzRmMywgMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDcwMjAsIDB4MjA2MCwKKwkweDAwYzAsIDB4MzUwMSwgMHgyMDA5LCAweDAwMDQsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4MDA3OCwKKwkweDJiZDcsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4NDg5YiwgMHgwMGMwLCAweDM1MDgsIDB4YzE4NSwKKwkweDYwMDAsIDB4ZDBiYywgMHgwMDQwLCAweDM1MGQsIDB4YzE4ZCwgMHgwMDc4LCAweDJiYWQsIDB4MGU3ZSwKKwkweDBkN2UsIDB4MjAyOSwgMHgwMDAwLCAweDIwMjEsIDB4MDA4MCwgMHgyMGE5LCAweDAwN2YsIDB4MjA3MSwKKwkweGE3YjUsIDB4MmUwNCwgMHhhMDA1LCAweDAwYzAsIDB4MzUyNCwgMHgyMTAwLCAweGE0MDYsIDB4MDBjMCwKKwkweDM1NTUsIDB4MjQyOCwgMHgwMDc4LCAweDM1NTUsIDB4MjA2OCwgMHg2ZjEwLCAweDI3MDAsIDB4YTMwNiwKKwkweDAwYzAsIDB4MzU0NiwgMHg2ZTE0LCAweDI2MDAsIDB4YTIwNiwgMHgwMGMwLCAweDM1NDYsIDB4MjQwMCwKKwkweGExMDYsIDB4MDBjMCwgMHgzNTQyLCAweDJkNjAsIDB4ZDg4NCwgMHgwMDQwLCAweDM1NmEsIDB4NjAwNCwKKwkweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzNTZhLCAweDIwMDEsIDB4NDAwMCwKKwkweDAwNzgsIDB4MzU2YiwgMHgyMDAxLCAweDQwMDcsIDB4MDA3OCwgMHgzNTZiLCAweDI0MDAsIDB4YTEwNiwKKwkweDAwYzAsIDB4MzU1NSwgMHg2ZTE0LCAweDg3ZmYsIDB4MDBjMCwgMHgzNTUxLCAweDg2ZmYsIDB4MDA0MCwKKwkweDM1MjEsIDB4MjAwMSwgMHg0MDA4LCAweDAwNzgsIDB4MzU2YiwgMHg4NDIwLCAweDhlNzAsIDB4MDBmMCwKKwkweDM1MTksIDB4ODVmZiwgMHgwMGMwLCAweDM1NjQsIDB4MjAwMSwgMHg0MDA5LCAweDAwNzgsIDB4MzU2YiwKKwkweDIwMDEsIDB4MDAwMSwgMHgwMDc4LCAweDM1NmIsIDB4MTA3OCwgMHg0NTVjLCAweDAwYzAsIDB4MzU2MCwKKwkweDYzMTIsIDB4NjIxNiwgMHhhMDA2LCAweGEwMDUsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4ODFmZiwKKwkweDAwYzAsIDB4MmJkNywgMHgxMDc4LCAweDM1YmEsIDB4MDA0MCwgMHgyYmQ3LCAweDY4MzcsIDB4MDAwMCwKKwkweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc4MjQsIDB4YTAwNSwgMHgwMDQwLCAweDJiZGIsIDB4YTA5NiwKKwkweDAwZmYsIDB4MDA0MCwgMHgzNTg3LCAweGEwOTIsIDB4MDAwNCwgMHgwMGM4LCAweDJiZGIsIDB4MjAxMCwKKwkweDJkMTgsIDB4MTA3OCwgMHgyODJmLCAweDAwNDAsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwKKwkweDM1OTIsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwMDQwLCAweDJiZDcsIDB4MDA3OCwKKwkweDJiYWQsIDB4NzkyNCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwODAsIDB4MDA0OCwKKwkweDJiZGIsIDB4YTE4MiwgMHgwMGZmLCAweDAwYzgsIDB4MmJkYiwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDEwNzgsIDB4OGQ0YiwgMHgwMGMwLCAweDM1YjcsIDB4YTE5MCwgMHhhNzM1LCAweDIyMDQsIDB4YTA2NSwKKwkweDAwNDAsIDB4MzViNywgMHgxMDc4LCAweDQyZjgsIDB4MTI3ZiwgMHgwMDc4LCAweDJiYWQsIDB4MTI3ZiwKKwkweDAwNzgsIDB4MmJkNywgMHgxMDc4LCAweDEzOGIsIDB4MDA0MCwgMHgzNWQxLCAweGEwMDYsIDB4NjgwMiwKKwkweDcwMTAsIDB4YTAwNSwgMHgwMGMwLCAweDM1YzksIDB4MmQwMCwgMHg3MDEyLCAweDcwMTYsIDB4MDA3OCwKKwkweDM1Y2YsIDB4NzAxNCwgMHg2ODAyLCAweDIwNjAsIDB4MmQwMCwgMHg2MDA2LCAweDcwMTYsIDB4YWQ4MCwKKwkweDAwMGQsIDB4MDA3YywgMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4MzVlMSwgMHg3ZTI4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDA0OCwKKwkweDM1ZTIsIDB4YTA2NiwgMHg4Y2ZmLCAweDAwN2MsIDB4N2UyNCwgMHg4NjBmLCAweGExOGMsIDB4MDBmZiwKKwkweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDM1ZjIsIDB4YTZiNCwgMHgwMGZmLCAweGE2ODIsIDB4NDAwMCwKKwkweDAwNDgsIDB4MzVmMywgMHhhMDY2LCAweDhjZmYsIDB4MDA3YywgMHgwMTdlLCAweDcxMTAsIDB4ODFmZiwKKwkweDAwNDAsIDB4MzYwMCwgMHgyMTY4LCAweDY5MDQsIDB4MTA3OCwgMHgxM2E0LCAweDAwNzgsIDB4MzVmNywKKwkweDcxMTIsIDB4NzExNiwgMHgwMTdmLCAweDAwN2MsIDB4MjAzMSwgMHgwMDAxLCAweDAwNzgsIDB4MzYwYSwKKwkweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweGE2ZDIsIDB4NjYwNiwgMHg2MTEyLCAweDYwMGUsIDB4NjIyNiwKKwkweDYzMmEsIDB4NjQyZSwgMHg2NTMyLCAweDJjMTAsIDB4MTA3OCwgMHgxM2RiLCAweDcwMDcsIDB4MDAwMiwKKwkweDcwMWIsIDB4MmJhZCwgMHgwMDdjLCAweDBmN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwKKwkweDAwMDAsIDB4MjAwMSwgMHhhNjkwLCAweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDM2MzYsIDB4MDA2OCwKKwkweDM2MzYsIDB4NzgxOCwgMHhkMDg0LCAweDAwYzAsIDB4MzYzNiwgMHg3YTIyLCAweDdiMjYsIDB4N2MyYSwKKwkweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHgzNjViLCAweDAxN2UsIDB4MGM3ZSwKKwkweDBlN2UsIDB4MjA3MSwgMHhhNjgyLCAweDcxMzgsIDB4YTE4MiwgMHgwMDA4LCAweDAwNDgsIDB4MzY0NCwKKwkweDcwMzAsIDB4MjA2MCwgMHgwMDc4LCAweDM2NTUsIDB4NzAzMCwgMHhhMGUwLCAweDAwMDgsIDB4YWM4MiwKKwkweGE2ZDIsIDB4MDA0OCwgMHgzNjRkLCAweDIwNjEsIDB4YTY5MiwgMHgyYzAwLCAweDcwMzIsIDB4ODFmZiwKKwkweDAwYzAsIDB4MzY1MywgMHg3MDM2LCAweDgxMDgsIDB4NzEzYSwgMHgyMjYyLCAweDYzMDYsIDB4NjQwYSwKKwkweDBlN2YsIDB4MGM3ZiwgMHgwMTdmLCAweDEyN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwKKwkweGE2ODIsIDB4NzAzOCwgMHhhMDA1LCAweDAwNDAsIDB4MzY5NywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDAwNjgsIDB4MzY5NiwgMHgwZjdlLCAweDIwNzksIDB4MDAwMCwgMHg3ODE4LCAweGQwODQsIDB4MDBjMCwKKwkweDM2OTUsIDB4MGM3ZSwgMHg3MDM0LCAweDIwNjAsIDB4MmMwNCwgMHg3ODIyLCAweDYwMDQsIDB4NzgyNiwKKwkweDYwMDgsIDB4NzgyYSwgMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDcwMzgsIDB4ODAwMSwKKwkweDcwM2EsIDB4YTAwNSwgMHgwMGMwLCAweDM2OGIsIDB4NzAzMywgMHhhNjkyLCAweDcwMzcsIDB4YTY5MiwKKwkweDBjN2YsIDB4MDA3OCwgMHgzNjk1LCAweGFjODAsIDB4MDAwOCwgMHhhMGZhLCAweGE2ZDIsIDB4MDA0OCwKKwkweDM2OTMsIDB4MjAwMSwgMHhhNjkyLCAweDcwMzYsIDB4MGM3ZiwgMHgwZjdmLCAweDEyN2YsIDB4MGU3ZiwKKwkweDAwN2MsIDB4MDI3ZSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGM0LCAweDAwNDAsIDB4MzZhNCwKKwkweDIwMTEsIDB4ODAxNCwgMHgxMDc4LCAweDM2MWIsIDB4MDI3ZiwgMHgwMDdjLCAweDgxZmYsIDB4MDBjMCwKKwkweDJiZDcsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAzMCwgMHhjMDhkLCAweGMwODUsIDB4YzBhYywKKwkweDYwMzIsIDB4MTA3OCwgMHg0MjI0LCAweDEyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MDBjMCwKKwkweDJiZDcsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYmQ3LCAweDIwMDEsIDB4YTY1MywKKwkweDIwMDQsIDB4ZDBhYywgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWU0LCAweDAwNDAsIDB4MmJkYiwKKwkweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDM2ZDMsIDB4NzgyOCwKKwkweGEwMDUsIDB4MDA0MCwgMHgyYmFkLCAweDBjN2UsIDB4MTA3OCwgMHgzNWJhLCAweDBjN2YsIDB4MDA0MCwKKwkweDJiZDcsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwKKwkweDEwNzgsIDB4OGYxMiwgMHgwMDQwLCAweDJiZDcsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzZlOSwKKwkweDAwN2MsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDA0MCwgMHgyYmQ3LCAweDAwNzgsIDB4MmJhZCwKKwkweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDJiZDcsIDB4N2YyNCwKKwkweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MmJkNywKKwkweDIwMDksIDB4MDAwMCwgMHgyMDMxLCAweDAwMDAsIDB4NzAyMywgMHgwMDAwLCAweDcwMmYsIDB4MDAwMCwKKwkweGFkODAsIDB4MDAwNSwgMHg3MDI2LCAweDIwYTAsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4Mzc2ZCwKKwkweDYwMDQsIDB4YTBjNCwgMHgwMGZmLCAweGE4YzYsIDB4MDAwNiwgMHgwMDQwLCAweDM3MWQsIDB4YTBjNCwKKwkweGZmMDAsIDB4YThjNiwgMHgwNjAwLCAweDAwYzAsIDB4Mzc2ZCwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYWMsIDB4MDBjMCwgMHgzNzJhLCAweDEwNzgsIDB4NDg5YiwgMHgwMGMwLCAweDM3MmEsIDB4ZDc5YywKKwkweDAwNDAsIDB4Mzc2ZCwgMHhkNzk0LCAweDAwYzAsIDB4MzczMCwgMHhkNzg0LCAweDAwNDAsIDB4MzczYywKKwkweGFjODAsIDB4MDAwNiwgMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MTA3OCwKKwkweDM0MjYsIDB4ZDc5NCwgMHgwMDQwLCAweDM3NDUsIDB4YWM4MCwgMHgwMDBhLCAweDIwOTgsIDB4MzQwMCwKKwkweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDEwNzgsIDB4MzQyNiwgMHgyMWEyLCAweGQ3OTQsIDB4MDA0MCwKKwkweDM3NjUsIDB4YWM4MCwgMHgwMDAwLCAweDIwOTgsIDB4OTRhMCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywKKwkweGFjODAsIDB4MDAwMywgMHgyMGE2LCAweDk0YTAsIDB4YWM4MCwgMHgwMDA0LCAweDIwOTgsIDB4MzQwMCwKKwkweDIwYTksIDB4MDAwMiwgMHg1M2EzLCAweDEwNzgsIDB4MzQxOCwgMHhhYzgwLCAweDAwMjYsIDB4MjA5OCwKKwkweDIwYTksIDB4MDAwMiwgMHg1M2EzLCAweDAwNzgsIDB4Mzc2NiwgMHg5NGEwLCAweGQ3OTQsIDB4MDA0MCwKKwkweDM3NmIsIDB4YTZiMCwgMHgwMDBiLCAweGE2YjAsIDB4MDAwNSwgMHg4MTA4LCAweGQ3OGMsIDB4MDA0MCwKKwkweDM3NzcsIDB4YTE4NiwgMHgwMTAwLCAweDAwNDAsIDB4Mzc4OCwgMHgwMDc4LCAweDM3N2IsIDB4YTE4NiwKKwkweDAwN2UsIDB4MDA0MCwgMHgzNzg4LCAweGQ3OTQsIDB4MDA0MCwgMHgzNzgyLCAweGE2ODYsIDB4MDAyMCwKKwkweDAwNzgsIDB4Mzc4NCwgMHhhNjg2LCAweDAwMjgsIDB4MDA0MCwgMHgzNzkxLCAweDAwNzgsIDB4MzcwYywKKwkweDg2ZmYsIDB4MDBjMCwgMHgzNzhmLCAweDcxMjAsIDB4ODEwYiwgMHgwMDc4LCAweDJiYWQsIDB4NzAyZiwKKwkweDAwMDEsIDB4NzExZSwgMHg3MDIwLCAweGE2MDAsIDB4NzAyMiwgMHg3NzJhLCAweDIwNjEsIDB4YTZkMiwKKwkweDYwMDcsIDB4MDAwMCwgMHg2NjEyLCAweDcwMjQsIDB4NjAwZSwgMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwKKwkweDY1MzIsIDB4MmMxMCwgMHgxMDc4LCAweDEzZGIsIDB4NzAwNywgMHgwMDAyLCAweDcwMWIsIDB4MzdhOSwKKwkweDAwN2MsIDB4NzAyYywgMHhhMDA1LCAweDAwYzAsIDB4MzdiYiwgMHg3MTFjLCAweDcwMjQsIDB4MjBhMCwKKwkweDc3MjgsIDB4MjAzMSwgMHgwMDAwLCAweDIwNjEsIDB4YTZkMiwgMHg2MjI0LCAweDYzMjgsIDB4NjQyYywKKwkweDY1MzAsIDB4MDA3OCwgMHgzNzBjLCAweDcxMjAsIDB4ODEwYiwgMHgwMDc4LCAweDJiYWQsIDB4MjAyOSwKKwkweDAwN2UsIDB4NzkyNCwgMHg3YTI4LCAweDdiMmMsIDB4N2MzOCwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywKKwkweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiZGIsIDB4YTUwMiwgMHgwMDQ4LCAweDJiZGIsIDB4YTE4NCwKKwkweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsIDB4MmJkYiwgMHhhNTAyLCAweDAwNDgsIDB4MmJkYiwKKwkweGEyODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiZGIsIDB4YTUwMiwKKwkweDAwNDgsIDB4MmJkYiwgMHhhMjg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsIDB4MmJkYiwKKwkweGE1MDIsIDB4MDA0OCwgMHgyYmRiLCAweGEzODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwKKwkweDAwNDgsIDB4MmJkYiwgMHhhNTAyLCAweDAwNDgsIDB4MmJkYiwgMHhhMzg0LCAweDAwZmYsIDB4YTBlMiwKKwkweDAwMjAsIDB4MDA0OCwgMHgyYmRiLCAweGE1MDIsIDB4MDA0OCwgMHgyYmRiLCAweGE0ODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsIDB4MmJkYiwgMHhhNTAyLCAweDAwNDgsIDB4MmJkYiwKKwkweGE0ODQsIDB4MDBmZiwgMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYmRiLCAweGE1MDIsIDB4MDA0OCwKKwkweDJiZGIsIDB4MjA2MSwgMHhhOGE1LCAweDYxMDIsIDB4NjIwNiwgMHg2MzBhLCAweDY0MGUsIDB4MDA3OCwKKwkweDJiYWQsIDB4MDA3ZSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGNjLCAweDAwN2YsIDB4MDA3YywKKwkweDAwN2UsIDB4MjAwMSwgMHhhNjcyLCAweDIwMDQsIDB4ZDBiYywgMHgwMDdmLCAweDAwN2MsIDB4NjE2NCwKKwkweDdhMjQsIDB4NjMwMCwgMHg4MmZmLCAweDAwYzAsIDB4MzgzMCwgMHg3OTI2LCAweDAwNzgsIDB4MmJhZCwKKwkweDgzZmYsIDB4MDBjMCwgMHgyYmRiLCAweDIwMDEsIDB4ZmZmMCwgMHhhMjAwLCAweDAwYzgsIDB4MmJkYiwKKwkweDIwMTksIDB4ZmZmZiwgMHg2MDY4LCAweGEzMDIsIDB4YTIwMCwgMHgwMDQ4LCAweDJiZGIsIDB4NzkyNiwKKwkweDYyNjYsIDB4MDA3OCwgMHgyYmFkLCAweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywKKwkweDAwYzAsIDB4MmJkNywgMHg3YzI4LCAweDdkMjQsIDB4N2UzOCwgMHg3ZjJjLCAweDEwNzgsIDB4MzViYSwKKwkweDAwNDAsIDB4MmJkNywgMHgyMDA5LCAweDAwMDAsIDB4MjAxOSwgMHgwMDAwLCAweDcwMjMsIDB4MDAwMCwKKwkweDcwMmYsIDB4MDAwMCwgMHhhZDgwLCAweDAwMDMsIDB4NzAyNiwgMHgyMGEwLCAweGExZTAsIDB4YTczNSwKKwkweDJjNjQsIDB4OGNmZiwgMHgwMDQwLCAweDM4N2QsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDA0MCwgMHgzODcyLCAweDYwMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MDYwMCwKKwkweDAwYzAsIDB4Mzg3ZCwgMHg2MDE0LCAweDIwYTIsIDB4OTRhMCwgMHg2MDEwLCAweDgwMDcsIDB4YTEwNSwKKwkweDgwMDcsIDB4MjBhMiwgMHg5NGEwLCAweGEzOTgsIDB4MDAwMiwgMHg4MTA4LCAweGExODIsIDB4MDBmZiwKKwkweDAwNDAsIDB4Mzg4OCwgMHhhMzg2LCAweDAwMmEsIDB4MDA0MCwgMHgzODkxLCAweDAwNzgsIDB4Mzg1ZSwKKwkweDgzZmYsIDB4MDBjMCwgMHgzODhmLCAweDcxMjAsIDB4ODEwYywgMHgwMDc4LCAweDJiYWQsIDB4NzAyZiwKKwkweDAwMDEsIDB4NzExZSwgMHg3MDIwLCAweGEzMDAsIDB4NzAyMiwgMHgyMDYxLCAweGE2ZDIsIDB4NjAwNywKKwkweDAwMDAsIDB4NjMxMiwgMHg3MDI0LCAweDYwMGUsIDB4NjQyNiwgMHg2NTJhLCAweDY2MmUsIDB4NjczMiwKKwkweDJjMTAsIDB4MTA3OCwgMHgxM2RiLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLCAweDM4YTgsIDB4MDA3YywKKwkweDcwMmMsIDB4YTAwNSwgMHgwMGMwLCAweDM4YjksIDB4NzExYywgMHg3MDI0LCAweDIwYTAsIDB4MjAxOSwKKwkweDAwMDAsIDB4MjA2MSwgMHhhNmQyLCAweDY0MjQsIDB4NjUyOCwgMHg2NjJjLCAweDY3MzAsIDB4MDA3OCwKKwkweDM4NWUsIDB4NzEyMCwgMHg4MTBjLCAweDAwNzgsIDB4MmJhZCwgMHg4MWZmLCAweDAwYzAsIDB4MmJkNywKKwkweDYwY2MsIDB4ZDA5YywgMHgwMDQwLCAweDJiZDcsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MmJkNywKKwkweDc5MjQsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgxMDc4LCAweDM2MDQsIDB4NzAxYiwKKwkweDM4ZDIsIDB4MDA3YywgMHgwZDdlLCAweGFkZTgsIDB4MDAwZCwgMHg2ODI4LCAweGEwYmUsIDB4NzAwMCwKKwkweDAwNDAsIDB4MzhlNSwgMHhhMGJlLCAweDcxMDAsIDB4MDA0MCwgMHgzOGU1LCAweGEwYmUsIDB4NzIwMCwKKwkweDAwNDAsIDB4MzhlNSwgMHgwZDdmLCAweDAwNzgsIDB4MmJkYiwgMHg2ODIwLCAweDY5MjQsIDB4MTA3OCwKKwkweDI1NGQsIDB4MDBjMCwgMHgzOTEwLCAweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDM5MTAsIDB4NzEyMiwKKwkweDY2MTIsIDB4NjUxNiwgMHg2ZTE4LCAweDBjN2UsIDB4MTA3OCwgMHgzNWJhLCAweDAwNDAsIDB4MzkxMCwKKwkweDEwNzgsIDB4MzViYSwgMHgwMDQwLCAweDM5MTAsIDB4MGM3ZiwgMHgwZDdmLCAweDY4MzcsIDB4MDAwMCwKKwkweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDY4MjMsIDB4MDAwMCwgMHg2ODA0LCAweDIwNjgsIDB4MTA3OCwKKwkweDhlODIsIDB4MDA0MCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM5MTMsIDB4MDA3YywKKwkweDBkN2YsIDB4MDA3OCwgMHgyYmQ3LCAweDcxMjAsIDB4MTA3OCwgMHgyOThlLCAweDY4MjAsIDB4YTA4NiwKKwkweDgwMDEsIDB4MDA0MCwgMHgyYmQ3LCAweDJkMDAsIDB4NzAxZSwgMHg2ODA0LCAweGEwODAsIDB4MDAwMiwKKwkweDAwN2UsIDB4MjBhOSwgMHgwMDJhLCAweDIwOTgsIDB4MjBhMCwgMHgxMDc4LCAweDQyODEsIDB4MDA3ZiwKKwkweGFkZTgsIDB4MDAwZCwgMHg2YTA4LCAweDZiMGMsIDB4NmMxMCwgMHg2ZDE0LCAweDIwNjEsIDB4YTZkMiwKKwkweDYwMDcsIDB4MDAwMCwgMHg2ZTAwLCAweDZmMjgsIDB4YTdjNiwgMHg3MDAwLCAweDAwYzAsIDB4MzkzYSwKKwkweDAwNzgsIDB4MzkzZSwgMHhhN2M2LCAweDcxMDAsIDB4MDBjMCwgMHgzOTQ2LCAweGE2YzIsIDB4MDAwNCwKKwkweDAwNDgsIDB4MmJkYiwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHgzNjA4LCAweGE3YzYsIDB4NzIwMCwKKwkweDAwYzAsIDB4MmJkYiwgMHhhNmMyLCAweDAwNTQsIDB4MDA0OCwgMHgyYmRiLCAweDYwMGUsIDB4NjAxMywKKwkweDAwMmEsIDB4NjIyNiwgMHg2MzJhLCAweDY0MmUsIDB4NjUzMiwgMHgyYzEwLCAweDEwNzgsIDB4MTNkYiwKKwkweDcwMDcsIDB4MDAwMiwgMHg3MDFiLCAweDM5NWQsIDB4MDA3YywgMHg3MDFjLCAweDIwNjgsIDB4NjgwNCwKKwkweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODAsIDB4MDAwMiwgMHgwMDdlLCAweDIwYTksIDB4MDAyYSwKKwkweDIwOTgsIDB4MjBhMCwgMHgxMDc4LCAweDQyODEsIDB4MDA3ZiwgMHgyMDA5LCAweDAwMmEsIDB4MjA2MSwKKwkweGE2ZDIsIDB4NjIyNCwgMHg2MzI4LCAweDY0MmMsIDB4NjUzMCwgMHgwMDc4LCAweDM2MDgsIDB4ODFmZiwKKwkweDAwYzAsIDB4MmJkNywgMHg3OTJjLCAweDIwMDEsIDB4YTg5ZCwgMHgyMTAyLCAweDEwNzgsIDB4MzVkMiwKKwkweDAwNDAsIDB4MmJkYiwgMHgxMDc4LCAweDQ2NzMsIDB4MDA0MCwgMHgyYmQ3LCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHg0N2RlLCAweDEyN2YsIDB4MDA3OCwgMHgyYmFkLCAweDc4MjQsIDB4ZDA4YywKKwkweDAwYzAsIDB4Mzk5NSwgMHhkMDg0LCAweDAwNDAsIDB4MzFkYSwgMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwKKwkweDJiZGIsIDB4MGM3ZSwgMHgxMDc4LCAweDM1YmEsIDB4MGM3ZiwgMHgwMGMwLCAweDM5YTMsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDA3OCwgMHgyYmQ3LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwKKwkweDAwNDAsIDB4MzliMCwgMHhhMDhlLCAweDAwMDQsIDB4MDA0MCwgMHgzOWIwLCAweGEwOGUsIDB4MDAwNSwKKwkweDAwYzAsIDB4MzlkZCwgMHg3ODI0LCAweGQwOGMsIDB4MDA0MCwgMHgzOWJiLCAweDYwMDAsIDB4YzA4YywKKwkweDYwMDIsIDB4MDA3OCwgMHgzOWM1LCAweDIwMDEsIDB4YTY1MywgMHgyMDA0LCAweGQwYjQsIDB4MDA0MCwKKwkweDMyMGYsIDB4NjAwMCwgMHhkMDhjLCAweDAwYzAsIDB4MzIwZiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwKKwkweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDhlOWUsIDB4MDBjMCwgMHgzOWQyLCAweDIwMDksIDB4MDAwMywKKwkweDAwNzgsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzOWQ3LCAweDAwN2MsIDB4MTA3OCwKKwkweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDAwNzgsIDB4MzIwZiwgMHgyMDA5LCAweGE2MmYsIDB4MjEwYywKKwkweDgxZmYsIDB4MDA0MCwgMHgzOWU3LCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LCAweDJiZDcsIDB4MjAwMSwKKwkweGE2MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHgzOWYyLCAweDIwMDksIDB4MDAwNywKKwkweDAwNzgsIDB4MmJkNywgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGFjLCAweDAwNDAsIDB4MzlmYywKKwkweDIwMDksIDB4MDAwOCwgMHgwMDc4LCAweDJiZDcsIDB4NjA5YywgMHhkMGE0LCAweDAwYzAsIDB4M2EwMywKKwkweGQwYWMsIDB4MDBjMCwgMHgzMjBmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwKKwkweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDhmMTIsIDB4MDBjMCwgMHgzYTEyLCAweDIwMDksIDB4MDAwMywKKwkweDAwNzgsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzYTE3LCAweDAwN2MsIDB4NjgzMCwKKwkweGEwODYsIDB4MDEwMCwgMHgwMGMwLCAweDNhMjAsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MmJkNywKKwkweDEwNzgsIDB4MzVlNCwgMHgwMDQwLCAweDJiZGIsIDB4MDA3OCwgMHgzOWIyLCAweDgxZmYsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDBjMCwgMHgyYmQ3LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksIDB4MDAwNywKKwkweDAwYzAsIDB4MmJkNywgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGFjLCAweDIwMDksIDB4MDAwOCwKKwkweDAwYzAsIDB4MmJkNywgMHgxMDc4LCAweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDYwMDQsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgwMGMwLCAweDJiZDcsIDB4MGM3ZSwKKwkweDEwNzgsIDB4MzViYSwgMHgwYzdmLCAweDIwMDksIDB4MDAwMiwgMHgwMDQwLCAweDJiZDcsIDB4NjgzNywKKwkweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc5MjgsIDB4YTE5NCwKKwkweGZmMDAsIDB4YTE4YywgMHgwMGZmLCAweGEwMDYsIDB4ODJmZiwgMHgwMGMwLCAweDNhNjUsIDB4YzBlZCwKKwkweDY5NTIsIDB4NzkyYywgMHg2OTU2LCAweDAwNzgsIDB4M2E2ZSwgMHhhMjhlLCAweDAxMDAsIDB4MDBjMCwKKwkweDJiZGIsIDB4YzBlNSwgMHg2ODUzLCAweDAwMDAsIDB4Njg1NywgMHgwMDAwLCAweDY4M2UsIDB4MTA3OCwKKwkweDkwYmQsIDB4MjAwOSwgMHgwMDAzLCAweDAwNDAsIDB4MmJkNywgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwKKwkweDNhN2EsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwKKwkweDJiZDcsIDB4MDA3OCwgMHgyYmFkLCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDAwYzAsIDB4MmJkNywKKwkweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksIDB4MDAwNywgMHgwMGMwLCAweDJiZDcsIDB4MTA3OCwKKwkweDM1ZTQsIDB4MDA0MCwgMHgyYmRiLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwKKwkweDIwMDksIDB4MDAwOSwgMHgwMGMwLCAweDJiZDcsIDB4MGM3ZSwgMHgxMDc4LCAweDM1YmEsIDB4MGM3ZiwKKwkweDIwMDksIDB4MDAwMiwgMHgwMDQwLCAweDJiZDcsIDB4YWQ4MCwgMHgwMDBmLCAweDIwMDksIDB4MDAwOCwKKwkweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTA3OCwgMHgzNjA0LCAweDcwMWIsIDB4M2FiMSwKKwkweDAwN2MsIDB4MGQ3ZSwgMHhhZGU4LCAweDAwMGYsIDB4NjgwMCwgMHhhMDg2LCAweDA1MDAsIDB4MDBjMCwKKwkweDNhYzQsIDB4NjgwNCwgMHhhMDA1LCAweDAwYzAsIDB4M2FjNCwgMHg2ODA4LCAweGEwODQsIDB4ZmYwMCwKKwkweDAwYzAsIDB4M2FjNCwgMHgwMDc4LCAweDNhYzcsIDB4MGQ3ZiwgMHgwMGMwLCAweDJiZGIsIDB4MGQ3ZiwKKwkweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4MGM3ZSwKKwkweDEwNzgsIDB4MzVlNCwgMHgwMGMwLCAweDNhZDcsIDB4MGM3ZiwgMHgwMDc4LCAweDJiZGIsIDB4MTA3OCwKKwkweDkxMTksIDB4MjAwOSwgMHgwMDAzLCAweDBjN2YsIDB4MDA0MCwgMHgyYmQ3LCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWIsIDB4M2FlMywgMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwKKwkweDAwNDAsIDB4MmJkNywgMHgwMDc4LCAweDJiYWQsIDB4MTI3ZSwgMHgwYzdlLCAweDBlN2UsIDB4MjA2MSwKKwkweDAxMDAsIDB4MjA3MSwgMHhhNjAwLCAweDYwNDQsIDB4ZDBhNCwgMHgwMGMwLCAweDNiMTUsIDB4ZDA4NCwKKwkweDAwNDAsIDB4M2FmZSwgMHgxMDc4LCAweDNjNzUsIDB4MDA3OCwgMHgzYjExLCAweGQwOGMsIDB4MDA0MCwKKwkweDNiMDUsIDB4MTA3OCwgMHgzYjhjLCAweDAwNzgsIDB4M2IxMSwgMHhkMDk0LCAweDAwNDAsIDB4M2IwYywKKwkweDEwNzgsIDB4M2I2MCwgMHgwMDc4LCAweDNiMTEsIDB4ZDA5YywgMHgwMDQwLCAweDNiMTEsIDB4MTA3OCwKKwkweDNiMWYsIDB4MGU3ZiwgMHgwYzdmLCAweDEyN2YsIDB4MDA3YywgMHgwMTdlLCAweDYxMjgsIDB4ZDE5YywKKwkweDAwYzAsIDB4M2IxYywgMHhjMTlkLCAweDYxMmEsIDB4MDE3ZiwgMHgwMDc4LCAweDNiMTEsIDB4NjI0YywKKwkweGEyODYsIDB4ZjBmMCwgMHgwMGMwLCAweDNiMzAsIDB4NjA0OCwgMHhhMDg2LCAweGYwZjAsIDB4MDA0MCwKKwkweDNiMzAsIDB4NjI0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDAwNzgsIDB4M2I1ZiwKKwkweGEyOTQsIDB4ZmYwMCwgMHhhMjk2LCAweGY3MDAsIDB4MDA0MCwgMHgzYjQ1LCAweDcxMzQsIDB4ZDFhNCwKKwkweDAwYzAsIDB4M2I0NSwgMHg2MjQwLCAweGEyOTQsIDB4MDAxMCwgMHgwMDQwLCAweDNiNDUsIDB4MjAwOSwKKwkweDAwZjcsIDB4MTA3OCwgMHg0MmExLCAweDAwNzgsIDB4M2I1ZiwgMHg2MDQzLCAweDAwNDAsIDB4NjA0MywKKwkweDAwMDAsIDB4NzA3NywgMHgwMDAwLCAweDcwOGYsIDB4MDAwMSwgMHg3MGIzLCAweDAwMDAsIDB4NzBjZiwKKwkweDAwMDAsIDB4MjAwOSwgMHhhY2MwLCAweDIwMGIsIDB4MDAwMCwgMHg3MDg3LCAweDAwMDAsIDB4NzA3YiwKKwkweDAwMGYsIDB4MjAwOSwgMHgwMDBmLCAweDIwMTEsIDB4NDFkNSwgMHgxMDc4LCAweDVhZGQsIDB4MDA3YywKKwkweDE1N2UsIDB4NzA3OCwgMHhhMDA1LCAweDAwYzAsIDB4M2I4YSwgMHgyMDExLCAweDQxZDUsIDB4MTA3OCwKKwkweDVhNDUsIDB4NjA0MCwgMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDIwLCAweDYwNDIsIDB4MjBhOSwKKwkweDAwYzgsIDB4NjA0NCwgMHhkMDhjLCAweDAwYzAsIDB4M2I4MywgMHgwMGYwLCAweDNiNzEsIDB4NjI0MiwKKwkweDcwOGIsIDB4MDAwMCwgMHg2MDQwLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwODAsIDB4NjA0MiwKKwkweDYyNDIsIDB4MDA3OCwgMHgzYjhhLCAweDYyNDIsIDB4NzA4YiwgMHgwMDAwLCAweDcwN2YsIDB4MDAwMCwKKwkweDAwNzgsIDB4M2I4YSwgMHgxNTdmLCAweDAwN2MsIDB4NzA3YywgMHhhMDhhLCAweDAwMDMsIDB4MDBjOCwKKwkweDNiOTUsIDB4MTA3OSwgMHgzYjk4LCAweDAwNzgsIDB4M2I5NywgMHgxMDc4LCAweDEzMzIsIDB4MDA3YywKKwkweDNiOWIsIDB4M2JlYSwgMHgzYzc0LCAweDBmN2UsIDB4NzA3ZiwgMHgwMDAxLCAweDIwZTEsIDB4YTAwMCwKKwkweDIwZTEsIDB4ODcwMCwgMHgxMDc4LCAweDIxZjcsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwKKwkweDIwNzksIDB4YWIwMCwgMHgyMDdiLCAweDIyMDAsIDB4NzgwNywgMHgwMGVmLCAweDc4MGIsIDB4MDAwMCwKKwkweDc4MGYsIDB4MDBlZiwgMHg3ODEzLCAweDAxMzgsIDB4NzgxNywgMHgwMDAwLCAweDc4MWIsIDB4MDAwMCwKKwkweDc4MWYsIDB4MDAwMCwgMHg3ODIzLCAweGZmZmYsIDB4NzgyNywgMHhmZmZmLCAweDc4MmIsIDB4MDAwMCwKKwkweDc4MmYsIDB4MDAwMCwgMHgyMDc5LCAweGFiMGMsIDB4MjA3YiwgMHgxMTAxLCAweDc4MDcsIDB4MDAwMCwKKwkweDIwOTksIDB4YTYwNSwgMHgyMGExLCAweGFiMGUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MjA3OSwKKwkweGFiMTIsIDB4MjA3YiwgMHgwMDAwLCAweDc4MDcsIDB4MDAwMCwgMHgyMDk5LCAweGFiMDAsIDB4MjBhMSwKKwkweDAyMGIsIDB4MjBhOSwgMHgwMDE0LCAweDUzYTYsIDB4NjBjMywgMHgwMDBjLCAweDYwMGYsIDB4MDAwMCwKKwkweDEwNzgsIDB4NDIwYiwgMHgwZjdmLCAweDcwODMsIDB4MDAwMCwgMHg2MDQzLCAweDAwMDgsIDB4NjA0MywKKwkweDAwMDAsIDB4MDA3YywgMHgwZDdlLCAweDcwODAsIDB4NzA4MywgMHgwMDAwLCAweGEwMjUsIDB4MDA0MCwKKwkweDNjNWUsIDB4NjAyMCwgMHhkMGI0LCAweDAwYzAsIDB4M2M1YywgMHg3MThjLCAweDgxZmYsIDB4MDA0MCwKKwkweDNjNGIsIDB4YTQ4NiwgMHgwMDBjLCAweDAwYzAsIDB4M2M1NiwgMHhhNDgwLCAweDAwMTgsIDB4ODAwNCwKKwkweDIwYTgsIDB4MjAxMSwgMHhhYjgwLCAweDIwMTksIDB4YWIwMCwgMHgyMjBjLCAweDIzMDQsIDB4YTEwNiwKKwkweDAwYzAsIDB4M2MyMiwgMHg4MjEwLCAweDgzMTgsIDB4MDBmMCwgMHgzYzA1LCAweDYwNDMsIDB4MDAwNCwKKwkweDYwOGIsIDB4YmM5NCwgMHg2MDhmLCAweGYwZjAsIDB4NjA0MywgMHgwMDA2LCAweDcwN2YsIDB4MDAwMiwKKwkweDcwOGIsIDB4MDAwMiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWFkZCwKKwkweDAwNzgsIDB4M2M1YywgMHgyMDY5LCAweGFiODAsIDB4NjkzMCwgMHhhMThlLCAweDExMDEsIDB4MDBjMCwKKwkweDNjNTYsIDB4NjgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2M1NiwgMHg2OTAwLCAweGExOGMsIDB4MDBmZiwKKwkweDAwYzAsIDB4M2MzNiwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgzYzRiLCAweDIwMTEsIDB4YWI4ZSwKKwkweDIwMTksIDB4YTYwNSwgMHgyMGE5LCAweDAwMDQsIDB4MjIwYywgMHgyMzA0LCAweGExMDIsIDB4MDA0OCwKKwkweDNjNDksIDB4MDBjMCwgMHgzYzU2LCAweDgyMTAsIDB4ODMxOCwgMHgwMGYwLCAweDNjM2MsIDB4MDA3OCwKKwkweDNjNTYsIDB4NzA4ZiwgMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwKKwkweGFiODAsIDB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAxNCwgMHg1M2E2LCAweDYwNDMsIDB4MDAwOCwKKwkweDYwNDMsIDB4MDAwMCwgMHgwMDc4LCAweDNjNWUsIDB4MGQ3ZiwgMHgwMDdjLCAweDYwMjAsIDB4ZDBiNCwKKwkweDAwYzAsIDB4M2M1YywgMHg2MGMzLCAweDAwMGMsIDB4MjAxMSwgMHhhOGJiLCAweDIwMTMsIDB4MDAwMCwKKwkweDcwODMsIDB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwKKwkweDEwNzgsIDB4NmUwNiwgMHgwMDc4LCAweDNjNWMsIDB4MDA3YywgMHg3MDg4LCAweGEwOGEsIDB4MDAxZCwKKwkweDAwYzgsIDB4M2M3ZSwgMHgxMDc5LCAweDNjODEsIDB4MDA3OCwgMHgzYzgwLCAweDEwNzgsIDB4MTMzMiwKKwkweDAwN2MsIDB4M2NhYiwgMHgzY2JhLCAweDNjZTksIDB4M2QwMiwgMHgzZDJlLCAweDNkNWEsIDB4M2Q4NiwKKwkweDNkYmMsIDB4M2RlOCwgMHgzZTEwLCAweDNlNTMsIDB4M2U3ZCwgMHgzZTlmLCAweDNlYjUsIDB4M2VkYiwKKwkweDNlZWUsIDB4M2VmNywgMHgzZjJiLCAweDNmNTcsIDB4M2Y4MywgMHgzZmFmLCAweDNmZTUsIDB4NDAzMCwKKwkweDQwNWYsIDB4NDA4MSwgMHg0MGMzLCAweDQwZTksIDB4NDEwMiwgMHg0MTAzLCAweDBjN2UsIDB4MjA2MSwKKwkweGE2MDAsIDB4NjAwMywgMHgwMDA3LCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweGEwODQsIDB4ZmZmOSwKKwkweDYwMDYsIDB4MGM3ZiwgMHgwMDdjLCAweDYwOGIsIDB4YmM5NCwgMHg2MDhmLCAweGYwZjAsIDB4NjA0MywKKwkweDAwMDIsIDB4NzA4YiwgMHgwMDAxLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwKKwkweDVhZGQsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2NlNywKKwkweDYwNDMsIDB4MDAwMCwgMHg2MDIwLCAweGQwYjQsIDB4MDBjMCwgMHgzY2U3LCAweDIwNzksIDB4YWI4MCwKKwkweDdhMzAsIDB4YTI5NiwgMHgxMTAyLCAweDAwYzAsIDB4M2NlNSwgMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwKKwkweDNjZTUsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2NkYiwgMHg3MGIwLCAweGEwMDUsIDB4MDBjMCwKKwkweDNjZGIsIDB4NzBiMywgMHgwMDAxLCAweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsIDB4NzA4YiwKKwkweDAwMTAsIDB4MTA3OCwgMHgzZWY3LCAweDAwNzgsIDB4M2NlNywgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwKKwkweDAwN2MsIDB4NzA4YiwgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwKKwkweDVhNDUsIDB4MTA3OCwgMHg0Mjg5LCAweDIwYTMsIDB4MTEwMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwKKwkweDAwMGEsIDB4MjBhMywgMHgwMDAwLCAweDAwZjAsIDB4M2NmOSwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwKKwkweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDNkMmMsIDB4MjAxMSwKKwkweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNkMmEsIDB4MjA3OSwKKwkweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDIsIDB4MDBjMCwgMHgzZDJhLCAweDc4MzQsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2QyYSwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZDI0LCAweDcwYjAsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2QyNCwgMHg3MGIzLCAweDAwMDEsIDB4NzA4YiwgMHgwMDA0LCAweDEwNzgsIDB4M2QyZSwKKwkweDAwNzgsIDB4M2QyYywgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsIDB4MDAwNSwKKwkweDEwNzgsIDB4NDI4OSwgMHgyMGEzLCAweDExMDMsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwKKwkweGFiOGUsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4M2Q0YywgMHg3MDc0LCAweGEwMDUsIDB4MDBjMCwKKwkweDNkNGMsIDB4NzE1MCwgMHhhMTg2LCAweGZmZmYsIDB4MDA0MCwgMHgzZDRjLCAweDEwNzgsIDB4NDE5ZCwKKwkweDAwNDAsIDB4M2Q0YywgMHgxMDc4LCAweDQyYjgsIDB4MjBhOSwgMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwKKwkweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwKKwkweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDNkODQsIDB4MjAxMSwKKwkweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNkODIsIDB4MjA3OSwKKwkweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDMsIDB4MDBjMCwgMHgzZDgyLCAweDc4MzQsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2Q4MiwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZDdjLCAweDcwYjAsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2Q3YywgMHg3MGIzLCAweDAwMDEsIDB4NzA4YiwgMHgwMDA2LCAweDEwNzgsIDB4M2Q4NiwKKwkweDAwNzgsIDB4M2Q4NCwgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsIDB4MDAwNywKKwkweDEwNzgsIDB4NDI4OSwgMHgyMGEzLCAweDExMDQsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwKKwkweGFiOGUsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4M2RhZSwgMHg3MDc0LCAweGEwMDUsIDB4MDBjMCwKKwkweDNkYWUsIDB4NzE1NCwgMHhhMTg2LCAweGZmZmYsIDB4MDA0MCwgMHgzZGFlLCAweGExODAsIDB4MjljMCwKKwkweDIwMGMsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MTA3OCwgMHg0MTlkLCAweDAwNDAsIDB4M2RhZSwKKwkweDEwNzgsIDB4MzgyMCwgMHgwMDQwLCAweDNkYWUsIDB4MTA3OCwgMHgyNTZhLCAweDIwYTksIDB4MDAwOCwKKwkweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywKKwkweDAwMTQsIDB4MTA3OCwgMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwgMHg3MDgwLCAweGEwMDUsIDB4MDA0MCwKKwkweDNkZTYsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwKKwkweDNkZTQsIDB4MjA3OSwgMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA0LCAweDAwYzAsIDB4M2RlNCwKKwkweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNkZTQsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2RkZSwKKwkweDcwYjAsIDB4YTAwNSwgMHgwMGMwLCAweDNkZGUsIDB4NzBiMywgMHgwMDAxLCAweDcwOGIsIDB4MDAwOCwKKwkweDEwNzgsIDB4M2RlOCwgMHgwMDc4LCAweDNkZTYsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsIDB4MDA3YywKKwkweDcwOGIsIDB4MDAwOSwgMHgxMDc4LCAweDQyODksIDB4MjBhMywgMHgxMTA1LCAweDIwYTMsIDB4MDEwMCwKKwkweDM0MzAsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4M2UwMSwgMHg3MDc0LCAweGEwMDUsIDB4MDBjMCwKKwkweDNlMDEsIDB4MTA3OCwgMHg0MTA0LCAweDAwYzAsIDB4M2UwYiwgMHhhMDg1LCAweDAwMDEsIDB4MTA3OCwKKwkweDI1NmEsIDB4MjBhOSwgMHgwMDA4LCAweDIwOTksIDB4YWI4ZSwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQyMGIsIDB4MDA3YywKKwkweDBmN2UsIDB4NzA4MCwgMHhhMDA1LCAweDAwNDAsIDB4M2U1MSwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwKKwkweDVhNDUsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2U0ZiwgMHgyMDc5LCAweGFiODAsIDB4N2EzMCwKKwkweGEyOTYsIDB4MTEwNSwgMHgwMGMwLCAweDNlNGYsIDB4NzgzNCwgMHgyMDExLCAweDAxMDAsIDB4YTIxZSwKKwkweDAwYzAsIDB4M2UzYSwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZTM0LCAweDcwYjAsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2UzNCwgMHg3MGIzLCAweDAwMDEsIDB4NzA4YiwgMHgwMDBhLCAweDEwNzgsIDB4M2U1MywKKwkweDAwNzgsIDB4M2U1MSwgMHhhMDA1LCAweDAwYzAsIDB4M2U0ZiwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwKKwkweDNlNDcsIDB4NzBiMCwgMHhhMDA1LCAweDAwYzAsIDB4M2U0NywgMHg3MGIzLCAweDAwMDEsIDB4NzA4NywKKwkweDAwMDAsIDB4NzA4YiwgMHgwMDBlLCAweDEwNzgsIDB4M2VkYiwgMHgwMDc4LCAweDNlNTEsIDB4MTA3OCwKKwkweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsIDB4MDAwYiwgMHgyMDExLCAweGFiMGUsIDB4MjJhMCwKKwkweDIwYTksIDB4MDA0MCwgMHgyMDE5LCAweGZmZmYsIDB4NDNhNCwgMHgyMGE5LCAweDAwMDIsIDB4MjAwOSwKKwkweDAwMDAsIDB4NDFhNCwgMHgxMDc4LCAweDQyODksIDB4MjBhMywgMHgxMTA2LCAweDIwYTMsIDB4MDAwMCwKKwkweDEwNzgsIDB4NDJkNCwgMHgwMDQwLCAweDNlNzAsIDB4MjAxMywgMHgwMDAwLCAweDAwNzgsIDB4M2U3NCwKKwkweDYwMzAsIDB4YTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4MjI5OCwgMHgyMGE5LCAweDAwNDIsIDB4NTNhNiwKKwkweDYwYzMsIDB4MDA4NCwgMHgxMDc4LCAweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwKKwkweDAwNDAsIDB4M2U5ZCwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDA4NCwKKwkweDAwYzAsIDB4M2U5YiwgMHgyMDc5LCAweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDYsIDB4MDBjMCwKKwkweDNlOWIsIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2U5YiwgMHg3MDhiLCAweDAwMGMsIDB4MTA3OCwKKwkweDNlOWYsIDB4MDA3OCwgMHgzZTlkLCAweDEwNzgsIDB4NDIyNCwgMHgwZjdmLCAweDAwN2MsIDB4NzA4YiwKKwkweDAwMGQsIDB4MTA3OCwgMHg0Mjg5LCAweDIwYTMsIDB4MTEwNywgMHgyMGEzLCAweDAwMDAsIDB4MjA5OSwKKwkweGFiOGUsIDB4MjBhOSwgMHgwMDQwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwYzMsIDB4MDA4NCwgMHgxMDc4LCAweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwKKwkweDAwNDAsIDB4M2VkOSwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDA4NCwKKwkweDAwYzAsIDB4M2VkNywgMHgyMDc5LCAweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDcsIDB4MDBjMCwKKwkweDNlZDcsIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2VkNywgMHg3MDg3LCAweDAwMDEsIDB4MTA3OCwKKwkweDQyN2IsIDB4NzA4YiwgMHgwMDBlLCAweDEwNzgsIDB4M2VkYiwgMHgwMDc4LCAweDNlZDksIDB4MTA3OCwKKwkweDQyMjQsIDB4MGY3ZiwgMHgwMDdjLCAweDcwOGIsIDB4MDAwZiwgMHg3MDgzLCAweDAwMDAsIDB4NjA4YiwKKwkweGJjODUsIDB4NjA4ZiwgMHhiNWI1LCAweDYwNDMsIDB4MDAwNSwgMHg2MDQzLCAweDAwMDQsIDB4MjAwOSwKKwkweDA3ZDAsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWEzOCwgMHgwMDdjLCAweDcwODAsIDB4YTAwNSwKKwkweDAwNDAsIDB4M2VmNiwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweDAwN2MsIDB4NzA4YiwKKwkweDAwMTEsIDB4MTA3OCwgMHg0MmQ0LCAweDAwYzAsIDB4M2YxNCwgMHg3MTZjLCAweDgxZmYsIDB4MDA0MCwKKwkweDNmMTQsIDB4MjAwOSwgMHgwMDAwLCAweDcwNzAsIDB4YTA4NCwgMHgwMGZmLCAweDEwNzgsIDB4MjU0ZCwKKwkweGExODYsIDB4MDA3ZSwgMHgwMDQwLCAweDNmMTQsIDB4YTE4NiwgMHgwMDgwLCAweDAwNDAsIDB4M2YxNCwKKwkweDIwMTEsIDB4YWI4ZSwgMHgxMDc4LCAweDQxOWQsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwKKwkweDIwOTksIDB4YWI4MCwgMHgyMGExLCAweDAyMGIsIDB4NzQ4MCwgMHhhNDgwLCAweDAwMTgsIDB4YTA4MCwKKwkweDAwMDcsIDB4YTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHg1M2E2LCAweDYwYzMsIDB4MDAxNCwKKwkweDEwNzgsIDB4NDIwYiwgMHgwMDdjLCAweDBmN2UsIDB4NzA4MCwgMHhhMDA1LCAweDAwNDAsIDB4M2Y1NSwKKwkweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2Y1MywKKwkweDIwNzksIDB4YWI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwMywgMHgwMGMwLCAweDNmNTMsIDB4NzgzNCwKKwkweGEwMDUsIDB4MDBjMCwgMHgzZjUzLCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNmNGQsIDB4NzBiMCwKKwkweGEwMDUsIDB4MDBjMCwgMHgzZjRkLCAweDcwYjMsIDB4MDAwMSwgMHg3MDhiLCAweDAwMTIsIDB4MTA3OCwKKwkweDNmNTcsIDB4MDA3OCwgMHgzZjU1LCAweDEwNzgsIDB4NDIyNCwgMHgwZjdmLCAweDAwN2MsIDB4NzA4YiwKKwkweDAwMTMsIDB4MTA3OCwgMHg0Mjk1LCAweDIwYTMsIDB4MTEwMywgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwKKwkweDIwMTEsIDB4YWI4ZSwgMHgxMDc4LCAweDQyZDQsIDB4MDBjMCwgMHgzZjc1LCAweDcwNzQsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2Y3NSwgMHg3MTUwLCAweGExODYsIDB4ZmZmZiwgMHgwMDQwLCAweDNmNzUsIDB4MTA3OCwKKwkweDQxOWQsIDB4MDA0MCwgMHgzZjc1LCAweDEwNzgsIDB4NDJiOCwgMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwKKwkweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwKKwkweDEwNzgsIDB4NDIwYiwgMHgwMDdjLCAweDBmN2UsIDB4NzA4MCwgMHhhMDA1LCAweDAwNDAsIDB4M2ZhZCwKKwkweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2ZhYiwKKwkweDIwNzksIDB4YWI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNCwgMHgwMGMwLCAweDNmYWIsIDB4NzgzNCwKKwkweGEwMDUsIDB4MDBjMCwgMHgzZmFiLCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNmYTUsIDB4NzBiMCwKKwkweGEwMDUsIDB4MDBjMCwgMHgzZmE1LCAweDcwYjMsIDB4MDAwMSwgMHg3MDhiLCAweDAwMTQsIDB4MTA3OCwKKwkweDNmYWYsIDB4MDA3OCwgMHgzZmFkLCAweDEwNzgsIDB4NDIyNCwgMHgwZjdmLCAweDAwN2MsIDB4NzA4YiwKKwkweDAwMTUsIDB4MTA3OCwgMHg0Mjk1LCAweDIwYTMsIDB4MTEwNCwgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwKKwkweDIwMTEsIDB4YWI4ZSwgMHgxMDc4LCAweDQyZDQsIDB4MDBjMCwgMHgzZmQ3LCAweDcwNzQsIDB4YTAwNSwKKwkweDAwYzAsIDB4M2ZkNywgMHg3MTU0LCAweGExODYsIDB4ZmZmZiwgMHgwMDQwLCAweDNmZDcsIDB4YTE4MCwKKwkweDI5YzAsIDB4MjAwYywgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgxMDc4LCAweDQxOWQsIDB4MDA0MCwKKwkweDNmZDcsIDB4MTA3OCwgMHgzODIwLCAweDAwNDAsIDB4M2ZkNywgMHgxMDc4LCAweDI1NmEsIDB4MjBhOSwKKwkweDAwMDgsIDB4MjI5OCwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQyMGIsIDB4MDA3YywgMHgwZjdlLCAweDcwODAsIDB4YTAwNSwKKwkweDAwNDAsIDB4NDAyZSwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwgMHg1YTQ1LCAweGEwODYsIDB4MDAxNCwKKwkweDAwYzAsIDB4NDAyYywgMHgyMDc5LCAweGFiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDUsIDB4MDBjMCwKKwkweDQwMmMsIDB4NzgzNCwgMHgyMDExLCAweDAxMDAsIDB4YTIxZSwgMHgwMGMwLCAweDQwMGIsIDB4N2EzOCwKKwkweGQyZmMsIDB4MDA0MCwgMHg0MDA5LCAweDcwYjAsIDB4YTAwNSwgMHgwMGMwLCAweDQwMDksIDB4NzBiMywKKwkweDAwMDEsIDB4MDA3OCwgMHg0MDFhLCAweGEwMDUsIDB4MDBjMCwgMHg0MDJjLCAweDdhMzgsIDB4ZDJmYywKKwkweDAwNDAsIDB4NDAxOCwgMHg3MGIwLCAweGEwMDUsIDB4MDBjMCwgMHg0MDE4LCAweDcwYjMsIDB4MDAwMSwKKwkweDcwODcsIDB4MDAwMCwgMHg3YTM4LCAweGQyZjQsIDB4MDA0MCwgMHg0MDI2LCAweDIwMDEsIDB4YTY3NCwKKwkweDIwMDQsIDB4ZDBhNCwgMHgwMGMwLCAweDQwMjYsIDB4NzBjZiwgMHgwMDA4LCAweDcwOGIsIDB4MDAxNiwKKwkweDEwNzgsIDB4NDAzMCwgMHgwMDc4LCAweDQwMmUsIDB4MTA3OCwgMHg0MjI0LCAweDBmN2YsIDB4MDA3YywKKwkweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhhYjgwLCAweDIwYTEsIDB4MDIwYiwKKwkweDIwYTksIDB4MDAwZSwgMHg1M2E2LCAweDM0MzAsIDB4MjAxMSwgMHhhYjhlLCAweDcwOGIsIDB4MDAxNywKKwkweDEwNzgsIDB4NDJkNCwgMHgwMGMwLCAweDQwNTAsIDB4NzA3NCwgMHhhMDA1LCAweDAwYzAsIDB4NDA1MCwKKwkweDEwNzgsIDB4NDEwNCwgMHgwMGMwLCAweDQwNWEsIDB4YTA4NSwgMHgwMDAxLCAweDEwNzgsIDB4MjU2YSwKKwkweDIwYTksIDB4MDAwOCwgMHgyMDk5LCAweGFiOGUsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MjBiLCAweDAwN2MsIDB4MGY3ZSwKKwkweDcwODAsIDB4YTAwNSwgMHgwMDQwLCAweDQwN2YsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwKKwkweGEwODYsIDB4MDA4NCwgMHgwMGMwLCAweDQwN2QsIDB4MjA3OSwgMHhhYjgwLCAweDdhMzAsIDB4YTI5NiwKKwkweDExMDYsIDB4MDBjMCwgMHg0MDdkLCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDQwN2QsIDB4NzA4YiwKKwkweDAwMTgsIDB4MTA3OCwgMHg0MDgxLCAweDAwNzgsIDB4NDA3ZiwgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwKKwkweDAwN2MsIDB4NzA4YiwgMHgwMDE5LCAweDEwNzgsIDB4NDI5NSwgMHgyMGEzLCAweDExMDYsIDB4MjBhMywKKwkweDAwMDAsIDB4MzQzMCwgMHgyMDk5LCAweGFiOGUsIDB4MjAzOSwgMHhhYjBlLCAweDI3YTAsIDB4MjBhOSwKKwkweDAwNDAsIDB4NTNhMywgMHgxMDc4LCAweDQyZDQsIDB4MDBjMCwgMHg0MGI1LCAweDI3MjgsIDB4MjUxNCwKKwkweDgyMDcsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDAsIDB4MjAxOCwgMHhhMjk0LCAweDAwZmYsIDB4ODAwNywKKwkweGEyMDUsIDB4MjAyYSwgMHg2MDMwLCAweDIzMTAsIDB4ODIxNCwgMHhhMmEwLCAweGFiMGUsIDB4MjQxNCwKKwkweGEzOGMsIDB4MDAwMSwgMHgwMDQwLCAweDQwYjAsIDB4YTI5NCwgMHhmZjAwLCAweDAwNzgsIDB4NDBiMywKKwkweGEyOTQsIDB4MDBmZiwgMHg4MDA3LCAweGEyMTUsIDB4MjIyMiwgMHgyNzk4LCAweDI2YTAsIDB4MjBhOSwKKwkweDAwNDAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDA4NCwKKwkweDEwNzgsIDB4NDIwYiwgMHgwMDdjLCAweDBmN2UsIDB4NzA4MCwgMHhhMDA1LCAweDAwNDAsIDB4NDBlNywKKwkweDIwMTEsIDB4NDFkYywgMHgxMDc4LCAweDVhNDUsIDB4YTA4NiwgMHgwMDg0LCAweDAwYzAsIDB4NDBlNSwKKwkweDIwNzksIDB4YWI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNywgMHgwMGMwLCAweDQwZTUsIDB4NzgzNCwKKwkweGEwMDUsIDB4MDBjMCwgMHg0MGU1LCAweDcwODcsIDB4MDAwMSwgMHgxMDc4LCAweDQyN2IsIDB4NzA4YiwKKwkweDAwMWEsIDB4MTA3OCwgMHg0MGU5LCAweDAwNzgsIDB4NDBlNywgMHgxMDc4LCAweDQyMjQsIDB4MGY3ZiwKKwkweDAwN2MsIDB4NzA4YiwgMHgwMDFiLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwKKwkweGFiODAsIDB4MjBhMSwgMHgwMjBiLCAweDc0ODAsIDB4YTQ4MCwgMHgwMDE4LCAweGEwODAsIDB4MDAwNywKKwkweGEwODQsIDB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4NTNhNiwgMHg2MGMzLCAweDAwODQsIDB4MTA3OCwKKwkweDQyMGIsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MDg3ZSwgMHgwOTdlLCAweDIwMjksIDB4YTY1MywKKwkweDI1MmMsIDB4MjBhOSwgMHgwMDA4LCAweDIwNDEsIDB4YWIwZSwgMHgyOGEwLCAweDIwOTksIDB4YWI4ZSwKKwkweDUzYTMsIDB4MjBhOSwgMHgwMDA4LCAweDIwMTEsIDB4MDAwNywgMHhkNWQ0LCAweDAwNDAsIDB4NDExYSwKKwkweDIwMTEsIDB4MDAwMCwgMHgyODAwLCAweGEyMDAsIDB4MjAwYywgMHhhMWE2LCAweGZmZmYsIDB4MDBjMCwKKwkweDQxMmMsIDB4ZDVkNCwgMHgwMDQwLCAweDQxMjcsIDB4ODIxMCwgMHgwMDc4LCAweDQxMjgsIDB4ODIxMSwKKwkweDAwZjAsIDB4NDExYSwgMHgwMDc4LCAweDQxOTQsIDB4ODJmZiwgMHgwMGMwLCAweDQxM2UsIDB4ZDVkNCwKKwkweDAwNDAsIDB4NDEzOCwgMHhhMWE2LCAweDNmZmYsIDB4MDA0MCwgMHg0MTI0LCAweDAwNzgsIDB4NDEzYywKKwkweGExYTYsIDB4M2ZmZiwgMHgwMDQwLCAweDQxOTQsIDB4YTE4ZCwgMHhjMDAwLCAweDIwYTksIDB4MDAxMCwKKwkweDIwMTksIDB4MDAwMSwgMHhkNWQ0LCAweDAwNDAsIDB4NDE0NywgMHgyMDE5LCAweDAwMTAsIDB4MjEyMCwKKwkweGQ1ZDQsIDB4MDA0MCwgMHg0MTRlLCAweDg0MjMsIDB4MDA3OCwgMHg0MTRmLCAweDg0MjQsIDB4MDBjOCwKKwkweDQxNWMsIDB4ZDVkNCwgMHgwMDQwLCAweDQxNTcsIDB4ODMxOSwgMHgwMDc4LCAweDQxNTgsIDB4ODMxOCwKKwkweDAwZjAsIDB4NDE0OCwgMHgwMDc4LCAweDQxOTQsIDB4MjNhOCwgMHgyMDIxLCAweDAwMDEsIDB4ODQyNiwKKwkweDg0MjUsIDB4MDBmMCwgMHg0MTYwLCAweDIzMjgsIDB4ODUyOSwgMHhhMmJlLCAweDAwMDcsIDB4MDA0MCwKKwkweDQxNzQsIDB4MDA3ZSwgMHgyMDM5LCAweDAwMDcsIDB4MjIwMCwgMHhhNzNhLCAweDAwN2YsIDB4MjdhOCwKKwkweGE1YTgsIDB4MDAxMCwgMHgwMGYwLCAweDQxNzAsIDB4NzU1MiwgMHhhNWM4LCAweDI5YzAsIDB4MjkyYywKKwkweGE1YWMsIDB4MDBmZiwgMHg2NTMyLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLCAweDcwNmYsIDB4MDAwMCwKKwkweDc1NzIsIDB4MjAxOCwgMHgyMzA0LCAweGE0MDUsIDB4MjAxYSwgMHg3MDc3LCAweDAwMDEsIDB4MjZhMCwKKwkweDI4OTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDQxOWEsIDB4YTAwNiwgMHgwMDc4LCAweDQxOWEsIDB4YTAwNiwKKwkweDEwNzgsIDB4MTMzMiwgMHgwOTdmLCAweDA4N2YsIDB4MDA3YywgMHgyMTE4LCAweDIwMjEsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDAwNywgMHhhMzlhLCAweDAwMTAsIDB4MDA0OCwgMHg0MWFhLCAweDg0MjAsIDB4ODAwMSwKKwkweDAwNzgsIDB4NDFhMiwgMHgyMTE4LCAweDg0ZmYsIDB4MDA0MCwgMHg0MWIzLCAweGEzOWEsIDB4MDAxMCwKKwkweDg0MjEsIDB4MDBjMCwgMHg0MWFlLCAweDIwMjEsIDB4MDAwMSwgMHg4M2ZmLCAweDAwNDAsIDB4NDFiYywKKwkweDg0MjMsIDB4ODMxOSwgMHgwMGMwLCAweDQxYjgsIDB4YTIzOCwgMHgyNzA0LCAweGE0MmMsIDB4MDBjMCwKKwkweDQxZDQsIDB4YTQwNSwgMHgyMDNhLCAweDcxNTIsIDB4YTFhMCwgMHgyOWMwLCAweDI0MmMsIDB4YTVhYywKKwkweDAwZmYsIDB4NjUzMiwgMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwgMHg3MDZmLCAweDAwMDAsIDB4NzU3MiwKKwkweDcwNzcsIDB4MDAwMSwgMHhhMDg0LCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTYwMCwKKwkweDcwN2IsIDB4MDAwMCwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwZjdlLCAweDIwMDEsIDB4MDAwMiwKKwkweDEwNzgsIDB4NWFlNiwgMHgyMDc5LCAweDAxMDAsIDB4MjA3MSwgMHgwMTQwLCAweDEwNzgsIDB4NmUwZiwKKwkweDcwMDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NDFmMSwgMHg3MDAzLCAweDEwMDAsIDB4NzAwMywKKwkweDAwMDAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNjIyLCAweDIwNzMsIDB4MDAwMCwKKwkweDc4NDAsIDB4MDI3ZSwgMHgwMTdlLCAweDIwMDksIDB4MDBmNywgMHgxMDc4LCAweDQyYTEsIDB4MDE3ZiwKKwkweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwODAsIDB4Nzg0MiwgMHg3YTQyLCAweDAyN2YsIDB4MTI3ZiwKKwkweDBmN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMTEsIDB4YThiYiwKKwkweDIwMTMsIDB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMGUxLCAweDkwODAsIDB4NjBhMywKKwkweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDEwNzgsIDB4NmUwNiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwKKwkweDQxZGMsIDB4MTA3OCwgMHg1YWRkLCAweDAwN2MsIDB4MDE3ZSwgMHgwMjdlLCAweDBjN2UsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDExLCAweDAwMDMsIDB4MTA3OCwgMHg3MGUwLCAweDIwMTEsIDB4MDAwMiwKKwkweDEwNzgsIDB4NzBlYSwgMHgxMDc4LCAweDZmYzQsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwKKwkweDcwNTgsIDB4MDM3ZiwgMHgyMDA5LCAweDAwZjcsIDB4MTA3OCwgMHg0MmExLCAweDIwNjEsIDB4YThjNCwKKwkweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsIDB4MjA2MSwgMHhhNjAwLCAweDYwMDMsIDB4MDAwMSwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDIwMDksIDB4MDAyZCwKKwkweDIwMTEsIDB4NDI1OSwgMHgxMDc4LCAweDVhMzgsIDB4MTI3ZiwgMHgwYzdmLCAweDAyN2YsIDB4MDE3ZiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsIDB4MDAwMSwKKwkweDEwNzgsIDB4NWFlNiwgMHgyMDcxLCAweDAxMDAsIDB4MTA3OCwgMHg2ZTBmLCAweDIwNzEsIDB4MDE0MCwKKwkweDcwMDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NDI3MSwgMHg3MDAzLCAweDEwMDAsIDB4NzAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4MjRlOCwgMHgxMDc4LCAweDQyMjQsIDB4MTI3ZiwKKwkweDAwN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweGFjYzAsIDB4MjA5OSwKKwkweGFiOGUsIDB4MzMwNCwgMHg4MDA3LCAweDIwYTIsIDB4OTM5OCwgMHg5NGEwLCAweDAwZjAsIDB4NDI4MSwKKwkweDAwN2MsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGFiMDAsIDB4MjBhMSwKKwkweDAyMGIsIDB4MjBhOSwgMHgwMDBjLCAweDUzYTYsIDB4MDA3YywgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwKKwkweDQwMDAsIDB4MjA5OSwgMHhhYjgwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMGMsIDB4NTNhNiwKKwkweDAwN2MsIDB4MGM3ZSwgMHgwMDdlLCAweDIwNjEsIDB4MDEwMCwgMHg4MTBmLCAweDIwMDEsIDB4YTYyZiwKKwkweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDQyYjIsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4YTEwNSwKKwkweDAwNzgsIDB4NDJiNCwgMHhhMTg1LCAweDAwZjcsIDB4NjA0YSwgMHgwMDdmLCAweDBjN2YsIDB4MDA3YywKKwkweDAxN2UsIDB4MDQ3ZSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAwNDAsIDB4NDJjYiwKKwkweGEwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsIDB4MTA3OCwgMHhhMjFkLCAweDIwMDEsIDB4YTYwYywKKwkweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksIDB4MDAyYSwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwKKwkweDI4NGYsIDB4MDQ3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MDA3ZSwgMHgyMDAxLCAweGE2MGMsIDB4MjAwNCwKKwkweGQwOWMsIDB4MDA0MCwgMHg0MmRiLCAweDAwN2YsIDB4MDA3YywgMHgwMDdlLCAweDAxN2UsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHhhMThkLCAweDAwMDYsIDB4MjEwMiwKKwkweDEyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MTU3ZSwgMHgyMGE5LCAweDAwZmYsIDB4MjAwOSwKKwkweGE3MzUsIDB4YTAwNiwgMHgyMDBhLCAweDgxMDgsIDB4MDBmMCwgMHg0MmYyLCAweDE1N2YsIDB4MDA3YywKKwkweDBkN2UsIDB4MDM3ZSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMDY5LCAweGE2NTIsIDB4YTAwNiwKKwkweDYwMDIsIDB4NjAwNywgMHgwNzA3LCAweDYwMGEsIDB4NjAwZSwgMHg2MDEyLCAweGExOTgsIDB4MjljMCwKKwkweDIzMWMsIDB4YTM5YywgMHgwMGZmLCAweDYzMTYsIDB4MjBhOSwgMHgwMDA0LCAweGFjOTgsIDB4MDAwNiwKKwkweDIzYTAsIDB4NDBhNCwgMHgyMGE5LCAweDAwMDQsIDB4YWM5OCwgMHgwMDBhLCAweDIzYTAsIDB4NDBhNCwKKwkweDYwM2UsIDB4NjA0MiwgMHg2MDRlLCAweDYwNTIsIDB4NjA1NiwgMHg2MDVhLCAweDYwNWUsIDB4NjA2MiwKKwkweDYwNjYsIDB4NjA2YSwgMHg2MDZlLCAweDYwNzIsIDB4NjA3NiwgMHg2MDdhLCAweDYwN2UsIDB4NjA4MiwKKwkweDYwODYsIDB4NjA4YSwgMHg2MDhlLCAweDYwOTIsIDB4NjA5NiwgMHg2MDlhLCAweDYwOWUsIDB4NjBhZSwKKwkweDYxYTIsIDB4MGQ3ZSwgMHg2MGE0LCAweGEwNmQsIDB4MDA0MCwgMHg0MzM4LCAweDEwNzgsIDB4MTNhNCwKKwkweDYwYTcsIDB4MDAwMCwgMHg2MGE4LCAweGEwNmQsIDB4MDA0MCwgMHg0MzQwLCAweDEwNzgsIDB4MTNhNCwKKwkweDYwYWIsIDB4MDAwMCwgMHgwZDdmLCAweGEwMDYsIDB4NjA0YSwgMHg2ODEwLCAweDYwM2EsIDB4NjgwYywKKwkweDYwNDYsIDB4NjgxNCwgMHhhMDg0LCAweDAwZmYsIDB4NjA0MiwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwKKwkweDAzN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDY5NDQsIDB4NmU0OCwKKwkweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDBjOCwgMHg0NDI0LCAweGExOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4YTE4MiwgMHgwMGZmLCAweDAwYzgsIDB4NDQyYSwgMHgyMDAxLCAweGE2MGMsIDB4MjAwNCwKKwkweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDQzODUsIDB4MjAwMSwgMHhhNjBjLCAweDIwMDQsIDB4ZDA4NCwKKwkweDAwYzAsIDB4NDQwNSwgMHhhMTg4LCAweGE3MzUsIDB4MjEwNCwgMHhhMDY1LCAweDAwNDAsIDB4NDQwNSwKKwkweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgwMGMwLCAweDQ0MDUsIDB4NjAwMCwKKwkweGQwYzQsIDB4MDA0MCwgMHg0NDA1LCAweDAwNzgsIDB4NDM5MiwgMHhhMTg4LCAweGE3MzUsIDB4MjEwNCwKKwkweGEwNjUsIDB4MDA0MCwgMHg0M2U5LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwKKwkweDAwYzAsIDB4NDNlZiwgMHg2MGE0LCAweGEwMGQsIDB4MDA0MCwgMHg0MzlhLCAweDEwNzgsIDB4NDgxNywKKwkweDAwNDAsIDB4NDNlMywgMHg2MGE4LCAweGEwMGQsIDB4MDA0MCwgMHg0M2I0LCAweDEwNzgsIDB4NDg2YSwKKwkweDAwYzAsIDB4NDNiNCwgMHg2OTRjLCAweGQxZmMsIDB4MDBjMCwgMHg0M2FhLCAweDEwNzgsIDB4NDRkZiwKKwkweDAwNzgsIDB4NDNkZSwgMHgxMDc4LCAweDQ0ODQsIDB4Njk0YywgMHhkMWVjLCAweDAwYzAsIDB4NDNkZSwKKwkweDEwNzgsIDB4NDZkNiwgMHgwMDc4LCAweDQzZGUsIDB4Njk0YywgMHhhMTg0LCAweGEwMDAsIDB4MDA0MCwKKwkweDQzY2UsIDB4ZDFlYywgMHgwMDQwLCAweDQzYzcsIDB4ZDFmYywgMHgwMDQwLCAweDQzYzMsIDB4MTA3OCwKKwkweDQ2ZTcsIDB4MDA3OCwgMHg0M2NhLCAweDEwNzgsIDB4NDZlNywgMHgwMDc4LCAweDQzY2UsIDB4ZDFmYywKKwkweDAwNDAsIDB4NDNjZSwgMHgxMDc4LCAweDQ0ODQsIDB4MDA3OCwgMHg0M2RlLCAweDYwNTAsIDB4YTAwZCwKKwkweDAwNDAsIDB4NDNkOSwgMHgyZDAwLCAweDIwMGEsIDB4NjgwMywgMHgwMDAwLCAweDYwNTIsIDB4MDA3OCwKKwkweDQzZGUsIDB4MmQwMCwgMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDEwNzgsIDB4NWRhOSwKKwkweGEwMDYsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwKKwkweDQ0MmUsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDQ0MmUsIDB4YTA4MiwKKwkweDAwMDYsIDB4MDBjOCwgMHg0NDA1LCAweDYwYTAsIDB4ZDBiYywgMHgwMGMwLCAweDQ0MDEsIDB4NjEwMCwKKwkweGQxZmMsIDB4MDA0MCwgMHg0MzkyLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDA3OCwKKwkweDQ0MmUsIDB4MjAwMSwgMHgwMDI4LCAweDAwNzgsIDB4NDQyMCwgMHgyMDA5LCAweGE2MGMsIDB4MjEwYywKKwkweGQxOGMsIDB4MDA0MCwgMHg0NDBmLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDQ0MjAsIDB4ZDE4NCwKKwkweDAwNDAsIDB4NDQxNiwgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg0NDIwLCAweDIwMDEsIDB4MDAyOSwKKwkweDYxMDAsIDB4ZDFmYywgMHgwMDQwLCAweDQ0MjAsIDB4MjAwOSwgMHgxMDAwLCAweDAwNzgsIDB4NDQyZSwKKwkweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDQ0MmUsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwKKwkweDAwNzgsIDB4NDQyZSwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgwMDAwLCAweGEwMDUsIDB4MTI3ZiwKKwkweDAwN2MsIDB4Njk0NCwgMHg2ZTQ4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDBjOCwKKwkweDQ0N2UsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMGZmLCAweDAwYzgsIDB4NDQ2NCwKKwkweGExODgsIDB4YTczNSwgMHgyMTA0LCAweGEwNjUsIDB4MDA0MCwgMHg0NDY0LCAweDYwMDQsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDAwYzAsIDB4NDQ2YSwgMHg2ODRjLCAweGQwZWMsIDB4MDA0MCwKKwkweDQ0NTcsIDB4MTA3OCwgMHg0NmU3LCAweDEwNzgsIDB4NDQ4NCwgMHgwMDc4LCAweDQ0NWYsIDB4MTA3OCwKKwkweDQ0ODQsIDB4Njg0YywgMHhkMGZjLCAweDAwNDAsIDB4NDQ1ZiwgMHgxMDc4LCAweDQ2ZDYsIDB4MTA3OCwKKwkweDQ3MmYsIDB4YTAwNiwgMHgwMDc4LCAweDQ0ODIsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksIDB4MDAwMCwKKwkweDAwNzgsIDB4NDQ4MiwgMHhhMDgyLCAweDAwMDYsIDB4MDBjOCwgMHg0NDc4LCAweDYxMDAsIDB4ZDFmYywKKwkweDAwNDAsIDB4NDQ0ZCwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwNzgsIDB4NDQ4MiwKKwkweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg0NDgyLCAweDIwMDEsIDB4MDAyOSwKKwkweDIwMDksIDB4MDAwMCwgMHhhMDA1LCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjA1MCwKKwkweGEwMGQsIDB4MDA0MCwgMHg0NDkyLCAweDJkMDAsIDB4MjAwYSwgMHg2ODAzLCAweDAwMDAsIDB4NjA1MiwKKwkweDEyN2YsIDB4MDA3YywgMHgyZDAwLCAweDYwNTIsIDB4NjA0ZSwgMHg2ODAzLCAweDAwMDAsIDB4MDA3OCwKKwkweDQ0OTAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjA0YywgMHhhMDA1LCAweDAwNDAsIDB4NDRhZiwKKwkweDBlN2UsIDB4MjA3MSwgMHhhOGIxLCAweDcwMDQsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4NDRiNiwKKwkweDBlN2YsIDB4NjA0YywgMHg2ODAyLCAweDJkMDAsIDB4NjA0ZSwgMHgxMjdmLCAweDAwN2MsIDB4MmQwMCwKKwkweDYwNTIsIDB4NjA0ZSwgMHg2ODAzLCAweDAwMDAsIDB4MDA3OCwgMHg0NGFkLCAweDcwMWMsIDB4YWMwNiwKKwkweDAwYzAsIDB4NDRhOCwgMHg2MDRjLCAweDIwNzAsIDB4NzAwMCwgMHg2ODAyLCAweDJkMDAsIDB4NzAwMiwKKwkweDBlN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwNGMsIDB4YTA2ZCwKKwkweDAwNDAsIDB4NDRkMSwgMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHg0NGNmLCAweDYwNTIsIDB4NjA0ZSwKKwkweGFkMDUsIDB4MTI3ZiwgMHgwMDdjLCAweDYwNGMsIDB4YTA2ZCwgMHgwMDQwLCAweDQ0ZGUsIDB4NjgwMCwKKwkweGEwMDUsIDB4MDBjMCwgMHg0NGRjLCAweDYwNTIsIDB4NjA0ZSwgMHhhZDA1LCAweDAwN2MsIDB4NjgwMywKKwkweDAwMDAsIDB4NjA4NCwgMHhhMDBkLCAweDAwNDAsIDB4NDRlOSwgMHgyZDAwLCAweDIwMGEsIDB4NjA4NiwKKwkweDAwN2MsIDB4MmQwMCwgMHg2MDg2LCAweDYwODIsIDB4MDA3OCwgMHg0NGU4LCAweDEyN2UsIDB4MGM3ZSwKKwkweDAyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTgsIDB4MjI2MCwgMHg2MjAwLCAweGEwMDUsIDB4MDA0MCwKKwkweDQ0ZmMsIDB4YzI4NSwgMHgwMDc4LCAweDQ0ZmQsIDB4YzI4NCwgMHg2MjAyLCAweDAyN2YsIDB4MGM3ZiwKKwkweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDBjN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTgsIDB4MjI2MCwKKwkweDYyMDQsIDB4MDA3ZSwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg0NTIxLCAweDYwOWMsIDB4ZDBhYywKKwkweDAwNDAsIDB4NDUyMSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAwNDAsIDB4NDUyMSwKKwkweGEyODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwODYsIDB4MDAwNywgMHgwMGMwLCAweDQ1MjEsIDB4MjAxMSwKKwkweDA2MDAsIDB4MDA3ZiwgMHhhMjk0LCAweGZmMDAsIDB4YTIxNSwgMHg2MjA2LCAweDAwN2UsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDBjMCwgMHg0NTMxLCAweDYyOTAsIDB4ODJmZiwgMHgwMGMwLCAweDQ1MzEsIDB4MTA3OCwKKwkweDEzMzIsIDB4MDA3ZiwgMHgwYzdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDBjN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4NjIxOCwgMHgyMjYwLCAweDYyMDQsIDB4MDA3ZSwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDQ1NTMsIDB4NjA5YywgMHhkMGE0LCAweDAwNDAsIDB4NDU1MywgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYWMsIDB4MDBjMCwgMHg0NTUzLCAweGEyODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwKKwkweDQ1NTMsIDB4MjAxMSwgMHgwMDA2LCAweDAwN2YsIDB4YTI5NCwgMHgwMGZmLCAweDgwMDcsIDB4YTIxNSwKKwkweDYyMDYsIDB4MGM3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MDI3ZSwgMHhhMTgyLCAweDAwZmYsIDB4MDA0OCwKKwkweDQ1NjUsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4NDU3ZCwgMHhhMTkwLCAweGE3MzUsIDB4MjIwNCwKKwkweGEwNjUsIDB4MDBjMCwgMHg0NTdjLCAweDAxN2UsIDB4MGQ3ZSwgMHgxMDc4LCAweDEzNzAsIDB4MmQ2MCwKKwkweDBkN2YsIDB4MDE3ZiwgMHgwMDQwLCAweDQ1NjEsIDB4MmMwMCwgMHgyMDEyLCAweDYwYTcsIDB4MDAwMCwKKwkweDYwYWIsIDB4MDAwMCwgMHgxMDc4LCAweDQyZjgsIDB4YTAwNiwgMHgwMjdmLCAweDAwN2MsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMjdlLCAweGExODIsIDB4MDBmZiwgMHgwMDQ4LCAweDQ1OGIsIDB4YTA4NSwKKwkweDAwMDEsIDB4MDA3OCwgMHg0NWMxLCAweDBkN2UsIDB4YTE5MCwgMHhhNzM1LCAweDIyMDQsIDB4YTA2ZCwKKwkweDAwNDAsIDB4NDViZiwgMHgyMDEzLCAweDAwMDAsIDB4MGQ3ZSwgMHgwYzdlLCAweDJkNjAsIDB4NjBhNCwKKwkweGEwNmQsIDB4MDA0MCwgMHg0NTlkLCAweDEwNzgsIDB4MTNhNCwgMHg2MGE4LCAweGEwNmQsIDB4MDA0MCwKKwkweDQ1YTMsIDB4MTA3OCwgMHgxM2E0LCAweDBjN2YsIDB4MGQ3ZiwgMHgwZDdlLCAweDBjN2UsIDB4NjhhYywKKwkweDIwNjAsIDB4OGNmZiwgMHgwMDQwLCAweDQ1YmIsIDB4NjAwYywgMHgwMDdlLCAweDYwMTAsIDB4MjA2OCwKKwkweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDQ1YjYsIDB4MTA3OCwgMHgxM2I0LCAweDEwNzgsIDB4NzcyZCwKKwkweDBjN2YsIDB4MDA3OCwgMHg0NWE5LCAweDBjN2YsIDB4MGQ3ZiwgMHgxMDc4LCAweDEzYTQsIDB4MGQ3ZiwKKwkweGEwMDYsIDB4MDI3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MDE3ZSwgMHhhMTgyLCAweDAwZmYsIDB4MDA0OCwKKwkweDQ1Y2QsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4NDVkNCwgMHhhMTg4LCAweGE3MzUsIDB4MjEwNCwKKwkweGEwNjUsIDB4MDA0MCwgMHg0NWM5LCAweGEwMDYsIDB4MDE3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MTU3ZSwKKwkweDEzN2UsIDB4MTQ3ZSwgMHg2MDBiLCAweDAwMDAsIDB4NjAwZiwgMHgwMDAwLCAweDYwMDAsIDB4YzA4YywKKwkweDYwMDIsIDB4MjA2OSwgMHhhYjhlLCAweDY4MDgsIDB4NjA1ZSwgMHg2ODEwLCAweDYwNjIsIDB4NjEzOCwKKwkweGExMGEsIDB4MDA0OCwgMHg0NWVjLCAweDYwM2EsIDB4NjgxNCwgMHg2MDY2LCAweDIwOTksIDB4YWI5NiwKKwkweGFjODgsIDB4MDAwYSwgMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwOTksIDB4YWI5YSwKKwkweGFjODgsIDB4MDAwNiwgMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwNjksIDB4YWJhZSwKKwkweDY4MDgsIDB4NjA2YSwgMHg2OTBjLCAweDYxNmUsIDB4NjgxMCwgMHg2MDcyLCAweDY4MTgsIDB4NjA3NiwKKwkweDYwYTAsIDB4YTA4NiwgMHgwMDdlLCAweDAwYzAsIDB4NDYxMSwgMHgyMDY5LCAweGFiOGUsIDB4NjkwYywKKwkweDYxNmUsIDB4YTE4MiwgMHgwMjExLCAweDAwYzgsIDB4NDYxOSwgMHgyMDA5LCAweDAwMDgsIDB4MDA3OCwKKwkweDQ2NDMsIDB4YTE4MiwgMHgwMjU5LCAweDAwYzgsIDB4NDYyMSwgMHgyMDA5LCAweDAwMDcsIDB4MDA3OCwKKwkweDQ2NDMsIDB4YTE4MiwgMHgwMmMxLCAweDAwYzgsIDB4NDYyOSwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwKKwkweDQ2NDMsIDB4YTE4MiwgMHgwMzQ5LCAweDAwYzgsIDB4NDYzMSwgMHgyMDA5LCAweDAwMDUsIDB4MDA3OCwKKwkweDQ2NDMsIDB4YTE4MiwgMHgwNDIxLCAweDAwYzgsIDB4NDYzOSwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwKKwkweDQ2NDMsIDB4YTE4MiwgMHgwNTgxLCAweDAwYzgsIDB4NDY0MSwgMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwKKwkweDQ2NDMsIDB4MjAwOSwgMHgwMDAyLCAweDYxOTIsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MDE3ZSwgMHgwMjdlLCAweDBlN2UsIDB4MjA3MSwgMHhhYjhkLCAweDJlMDQsIDB4Njg5NiwKKwkweDIwNzEsIDB4YWI4ZSwgMHg3MDA0LCAweDY4OWEsIDB4NzAxYywgMHg2ODllLCAweDZhMDAsIDB4MjAwOSwKKwkweGE2NzIsIDB4MjEwYywgMHhkMGJjLCAweDAwNDAsIDB4NDY2MywgMHhkMWVjLCAweDAwNDAsIDB4NDY2MywKKwkweGMyYWQsIDB4MDA3OCwgMHg0NjY0LCAweGMyYWMsIDB4ZDBjNCwgMHgwMDQwLCAweDQ2NmQsIDB4ZDFlNCwKKwkweDAwNDAsIDB4NDY2ZCwgMHhjMmJkLCAweDAwNzgsIDB4NDY2ZSwgMHhjMmJjLCAweDZhMDIsIDB4MGU3ZiwKKwkweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwKKwkweGEwNmQsIDB4MDA0MCwgMHg0Njk3LCAweDY5MDAsIDB4ODFmZiwgMHgwMGMwLCAweDQ2YWIsIDB4NmEwNCwKKwkweGEyODIsIDB4MDAxMCwgMHgwMGM4LCAweDQ2YjAsIDB4YWQ4OCwgMHgwMDA0LCAweDIwYTksIDB4MDAxMCwKKwkweDIxMDQsIDB4YTA4NiwgMHhmZmZmLCAweDAwNDAsIDB4NDY5MiwgMHg4MTA4LCAweDAwZjAsIDB4NDY4OCwKKwkweDEwNzgsIDB4MTMzMiwgMHgyNjBhLCAweDgyMTAsIDB4NmEwNiwgMHgwMDc4LCAweDQ2YWIsIDB4MTA3OCwKKwkweDEzOGIsIDB4MDA0MCwgMHg0NmIwLCAweDJkMDAsIDB4NjBhNiwgMHg2ODAzLCAweDAwMDAsIDB4YWQ4OCwKKwkweDAwMDQsIDB4MjBhOSwgMHgwMDEwLCAweDIwMGIsIDB4ZmZmZiwgMHg4MTA4LCAweDAwZjAsIDB4NDZhMywKKwkweDY4MDcsIDB4MDAwMSwgMHg2ZTEyLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBkN2YsIDB4MDA3YywKKwkweGEwMDYsIDB4MDA3OCwgMHg0NmFkLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBkN2UsIDB4NjBhNCwKKwkweGEwMGQsIDB4MDA0MCwgMHg0NmQzLCAweDIxNjgsIDB4NjgwMCwgMHhhMDA1LCAweDAwYzAsIDB4NDZjZiwKKwkweDEwNzgsIDB4NDgxNywgMHgwMGMwLCAweDQ2ZDMsIDB4MjAwYiwgMHhmZmZmLCAweDY4MDQsIDB4YTA4YSwKKwkweDAwMDIsIDB4MDA0OCwgMHg0NmNmLCAweDgwMDEsIDB4NjgwNiwgMHgwMDc4LCAweDQ2ZDMsIDB4MTA3OCwKKwkweDEzYTQsIDB4NjBhNywgMHgwMDAwLCAweDBkN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHg0ODdmLCAweDAwNzgsIDB4NDZkZiwgMHgxMDc4LCAweDQ0ODQsIDB4MTA3OCwKKwkweDQ3NzUsIDB4MDBjMCwgMHg0NmRkLCAweDEwNzgsIDB4NDcyZiwgMHgxMjdmLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTgsIDB4YTA2ZCwgMHgwMDQwLCAweDQ3MGIsIDB4Njk1MCwKKwkweDgxZmYsIDB4MDBjMCwgMHg0NzFmLCAweDZhNTQsIDB4YTI4MiwgMHgwMDEwLCAweDAwYzgsIDB4NDcyYywKKwkweGFkODgsIDB4MDAxOCwgMHgyMGE5LCAweDAwMTAsIDB4MjEwNCwgMHhhMDg2LCAweGZmZmYsIDB4MDA0MCwKKwkweDQ3MDYsIDB4ODEwOCwgMHgwMGYwLCAweDQ2ZmMsIDB4MTA3OCwgMHgxMzMyLCAweDI2MGEsIDB4ODIxMCwKKwkweDZhNTYsIDB4MDA3OCwgMHg0NzFmLCAweDEwNzgsIDB4MTM4YiwgMHgwMDQwLCAweDQ3MmMsIDB4MmQwMCwKKwkweDYwYWEsIDB4Njg1MywgMHgwMDAwLCAweGFkODgsIDB4MDAxOCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwYiwKKwkweGZmZmYsIDB4ODEwOCwgMHgwMGYwLCAweDQ3MTcsIDB4Njg1NywgMHgwMDAxLCAweDZlNjIsIDB4MDA3OCwKKwkweDQ3MjMsIDB4MTA3OCwgMHg0NGRmLCAweDEwNzgsIDB4NDczOSwgMHgwMGMwLCAweDQ3MjEsIDB4YTA4NSwKKwkweDAwMDEsIDB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDQ3MjksIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDVkYTksIDB4MTI3ZiwgMHgwMDdjLCAweGEwMWUsIDB4MDA3OCwKKwkweDQ3M2IsIDB4MjAxOSwgMHgwMDAxLCAweGEwMGUsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjA0YywKKwkweDIwNjgsIDB4NjAwMCwgMHhkMGRjLCAweDAwYzAsIDB4NDc1OSwgMHg4ZGZmLCAweDAwNDAsIDB4NDc3MCwKKwkweDgzZmYsIDB4MDA0MCwgMHg0NzUxLCAweDY4NDgsIDB4YTYwNiwgMHgwMDQwLCAweDQ3NWUsIDB4MDA3OCwKKwkweDQ3NTksIDB4NjgzYywgMHhhNDA2LCAweDAwYzAsIDB4NDc1OSwgMHg2ODQwLCAweGE1MDYsIDB4MDA0MCwKKwkweDQ3NWUsIDB4MmQwOCwgMHg2ODAwLCAweDIwNjgsIDB4MDA3OCwgMHg0NzQ1LCAweDEwNzgsIDB4NzIzMywKKwkweDZhMDAsIDB4NjA0YywgMHhhZDA2LCAweDAwYzAsIDB4NDc2OCwgMHg2MjRlLCAweDAwNzgsIDB4NDc2YiwKKwkweGExODAsIDB4MDAwMCwgMHgyMjAyLCAweDgyZmYsIDB4MDBjMCwgMHg0NzcwLCAweDYxNTIsIDB4OGRmZiwKKwkweDEyN2YsIDB4MDA3YywgMHhhMDFlLCAweDAwNzgsIDB4NDc3NywgMHgyMDE5LCAweDAwMDEsIDB4YTAwZSwKKwkweDYwODAsIDB4MjA2OCwgMHg4ZGZmLCAweDAwNDAsIDB4NDdhMywgMHg4M2ZmLCAweDAwNDAsIDB4NDc4NiwKKwkweDY4NDgsIDB4YTYwNiwgMHgwMDQwLCAweDQ3OTMsIDB4MDA3OCwgMHg0NzhlLCAweDY4M2MsIDB4YTQwNiwKKwkweDAwYzAsIDB4NDc4ZSwgMHg2ODQwLCAweGE1MDYsIDB4MDA0MCwgMHg0NzkzLCAweDJkMDgsIDB4NjgwMCwKKwkweDIwNjgsIDB4MDA3OCwgMHg0NzdhLCAweDZhMDAsIDB4NjA4MCwgMHhhZDA2LCAweDAwYzAsIDB4NDc5YiwKKwkweDYyODIsIDB4MDA3OCwgMHg0NzllLCAweGExODAsIDB4MDAwMCwgMHgyMjAyLCAweDgyZmYsIDB4MDBjMCwKKwkweDQ3YTMsIDB4NjE4NiwgMHg4ZGZmLCAweDAwN2MsIDB4YTAxNiwgMHgxMDc4LCAweDQ4MTAsIDB4MDBjMCwKKwkweDQ3YWIsIDB4MjAxMSwgMHgwMDAxLCAweDEwNzgsIDB4NDg2MywgMHgwMGMwLCAweDQ3YjEsIDB4YTI5NSwKKwkweDAwMDIsIDB4MDA3YywgMHgxMDc4LCAweDQ4OWIsIDB4MDA0MCwgMHg0N2JhLCAweDEwNzgsIDB4OGRjYSwKKwkweDAwNzgsIDB4NDdiYywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgxMDc4LCAweDQ4OWIsIDB4MDA0MCwKKwkweDQ3YzUsIDB4MTA3OCwgMHg4ZDYyLCAweDAwNzgsIDB4NDdjNywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywKKwkweDEwNzgsIDB4NDg5YiwgMHgwMDQwLCAweDQ3ZDAsIDB4MTA3OCwgMHg4ZGFjLCAweDAwNzgsIDB4NDdkMiwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDEwNzgsIDB4NDg5YiwgMHgwMDQwLCAweDQ3ZGIsIDB4MTA3OCwKKwkweDhkN2UsIDB4MDA3OCwgMHg0N2RkLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDEwNzgsIDB4NDg5YiwKKwkweDAwNDAsIDB4NDdlNiwgMHgxMDc4LCAweDhkZTgsIDB4MDA3OCwgMHg0N2U4LCAweGEwODUsIDB4MDAwMSwKKwkweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDBkN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwODAsIDB4YTA2ZCwKKwkweDAwNDAsIDB4NDgwOCwgMHg2ODAwLCAweDAwN2UsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywKKwkweDAwMDAsIDB4MTA3OCwgMHg4ZjdkLCAweDAwN2UsIDB4NjAwMCwgMHhkMGZjLCAweDAwNDAsIDB4NDgwMiwKKwkweDEwNzgsIDB4YTRlZCwgMHgwMDdmLCAweDEwNzgsIDB4NGE3MywgMHgwMDdmLCAweDAwNzgsIDB4NDdlZiwKKwkweDYwODMsIDB4MDAwMCwgMHg2MDg3LCAweDAwMDAsIDB4MGQ3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywKKwkweDYwYTQsIDB4YTAwZCwgMHgwMGMwLCAweDQ4MTcsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MGU3ZSwKKwkweDIxNzAsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4NDgyYywgMHgyMGE5LCAweDAwMTAsIDB4YWU4OCwKKwkweDAwMDQsIDB4MjEwNCwgMHhhNjA2LCAweDAwNDAsIDB4NDgyYywgMHg4MTA4LCAweDAwZjAsIDB4NDgyMSwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDQ4MmQsIDB4YTAwNiwgMHgwZTdmLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMGMwLCAweDQ4M2QsIDB4MTA3OCwKKwkweDEzOGIsIDB4MDA0MCwgMHg0ODRmLCAweDJkMDAsIDB4NjBhNiwgMHg2ODAzLCAweDAwMDEsIDB4NjgwNywKKwkweDAwMDAsIDB4YWQ4OCwgMHgwMDA0LCAweDIwYTksIDB4MDAxMCwgMHgyMDBiLCAweGZmZmYsIDB4ODEwOCwKKwkweDAwZjAsIDB4NDg0NSwgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4YTAwNiwKKwkweDAwNzgsIDB4NDg0YywgMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwKKwkweDAwNDAsIDB4NDg2MCwgMHg2MGE3LCAweDAwMDAsIDB4MTA3OCwgMHgxM2E0LCAweGEwODUsIDB4MDAwMSwKKwkweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDYwYTgsIDB4YTAwZCwgMHgwMGMwLCAweDQ4NmEsIDB4YTA4NSwKKwkweDAwMDEsIDB4MDA3YywgMHgwZTdlLCAweDIxNzAsIDB4NzA1MCwgMHhhMDA1LCAweDAwYzAsIDB4NDg3ZCwKKwkweDIwYTksIDB4MDAxMCwgMHhhZTg4LCAweDAwMTgsIDB4MjEwNCwgMHhhNjA2LCAweDAwNDAsIDB4NDg3ZCwKKwkweDgxMDgsIDB4MDBmMCwgMHg0ODc0LCAweGEwODUsIDB4MDAwMSwgMHgwZTdmLCAweDAwN2MsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDQ4NjMsIDB4MDBjMCwgMHg0ODk5LCAweDIwMGIsIDB4ZmZmZiwKKwkweDBkN2UsIDB4NjBhOCwgMHgyMDY4LCAweDY4NTQsIDB4YTA4YSwgMHgwMDAyLCAweDAwNDgsIDB4NDg5NCwKKwkweDgwMDEsIDB4Njg1NiwgMHgwMDc4LCAweDQ4OTgsIDB4MTA3OCwgMHgxM2E0LCAweDYwYWIsIDB4MDAwMCwKKwkweDBkN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDYwOWMsIDB4ZDBhNCwgMHgwMDdjLCAweDBmN2UsIDB4NzFiMCwKKwkweDgxZmYsIDB4MDBjMCwgMHg0OGI5LCAweDcxY2MsIDB4ZDE5YywgMHgwMDQwLCAweDQ4YjksIDB4MjAwMSwKKwkweDAwN2UsIDB4YTA4MCwgMHhhNzM1LCAweDIwMDQsIDB4YTA3ZCwgMHgwMDQwLCAweDQ4YjksIDB4NzgwNCwKKwkweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg0OGI5LCAweDc4MDAsIDB4YzBlZCwKKwkweDc4MDIsIDB4MjA3OSwgMHhhNjUyLCAweDc4MDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQ4ZGYsIDB4MTU3ZSwKKwkweDBjN2UsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4NDhkOSwgMHg2MDA0LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwOTYsIDB4MDAwNCwKKwkweDAwNDAsIDB4NDhkNiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg0OGQ5LCAweDYwMDAsIDB4YzBlZCwKKwkweDYwMDIsIDB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsIDB4NDhjNSwgMHgwYzdmLCAweDE1N2YsIDB4MTA3OCwKKwkweDQ5NjcsIDB4MDA0MCwgMHg0OGU4LCAweDIwMDEsIDB4YThhMSwgMHgyMDBjLCAweDAwNzgsIDB4NDhmMCwKKwkweDIwNzksIDB4YTY1MiwgMHg3ODA0LCAweGQwYTQsIDB4MDA0MCwgMHg0OGY0LCAweDIwMDksIDB4MDdkMCwKKwkweDIwMTEsIDB4NDhmNiwgMHgxMDc4LCAweDVhZGQsIDB4MGY3ZiwgMHgwMDdjLCAweDIwMTEsIDB4NDhmNiwKKwkweDEwNzgsIDB4NWE0NSwgMHgxMDc4LCAweDQ5NjcsIDB4MDA0MCwgMHg0OTFlLCAweDIwMDEsIDB4YTdiMywKKwkweDIwMDQsIDB4YTA4MCwgMHgwMDAwLCAweDIwMGMsIDB4YzFlYywgMHgyMTAyLCAweDIwMDEsIDB4YTY1MywKKwkweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQ5MTIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NDhmNiwKKwkweDEwNzgsIDB4NWFkZCwgMHgwZTdlLCAweDIwNzEsIDB4YTYwMCwgMHg3MDZmLCAweDAwMDAsIDB4NzA3MywKKwkweDAwMDAsIDB4MTA3OCwgMHgyNjc3LCAweDBlN2YsIDB4MDA3OCwgMHg0OTU2LCAweDE1N2UsIDB4MGM3ZSwKKwkweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwKKwkweDQ5NTAsIDB4NjAwMCwgMHhkMGVjLCAweDAwNDAsIDB4NDk1MCwgMHgwNDdlLCAweDYyYTAsIDB4YTI5NCwKKwkweDAwZmYsIDB4ODIyNywgMHhhMDA2LCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweGEyMWQsIDB4NjAwMCwKKwkweGMwZTUsIDB4YzBlYywgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODUsIDB4MDcwMCwKKwkweDYwMDYsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4NWYwMSwgMHgwNzdlLCAweDIwMzksIDB4MDAwMCwKKwkweDEwNzgsIDB4NWUwYSwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHg5ZjhiLCAweDA3N2YsIDB4MDQ3ZiwKKwkweDAxN2YsIDB4ODEwOCwgMHgwMGYwLCAweDQ5MjQsIDB4MGM3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MGM3ZSwKKwkweDYwMTgsIDB4MjA2MCwgMHg2MDAwLCAweGMwZWMsIDB4NjAwMiwgMHgwYzdmLCAweDAwN2MsIDB4NzgxOCwKKwkweDIwMDQsIDB4ZDBhYywgMHgwMDdjLCAweDc4MTgsIDB4MjAwNCwgMHhkMGJjLCAweDAwN2MsIDB4MGY3ZSwKKwkweDIwMDEsIDB4YTdiMywgMHgyMDA0LCAweGEwN2QsIDB4MDA0MCwgMHg0OTcwLCAweDc4MDAsIDB4ZDBlYywKKwkweDBmN2YsIDB4MDA3YywgMHgxMjdlLCAweDAyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAwN2UsIDB4NjJhMCwKKwkweGEyOTAsIDB4YTczNSwgMHgyMjA0LCAweGFjMDYsIDB4MTBjMCwgMHgxMzMyLCAweDAwN2YsIDB4NjIwMCwKKwkweGEwMDUsIDB4MDA0MCwgMHg0OTg2LCAweGMyZmQsIDB4MDA3OCwgMHg0OTg3LCAweGMyZmMsIDB4NjIwMiwKKwkweDAyN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMTEsIDB4YTYzMywgMHgyMjA0LCAweGQwY2MsIDB4MDA0MCwKKwkweDQ5OTgsIDB4MjAwMSwgMHhhODlmLCAweDIwMGMsIDB4MjAxMSwgMHg0OTk5LCAweDEwNzgsIDB4NWFkZCwKKwkweDAwN2MsIDB4MjAxMSwgMHg0OTk5LCAweDEwNzgsIDB4NWE0NSwgMHgyMDExLCAweGE2MzMsIDB4MjIwNCwKKwkweGMwY2MsIDB4MjAxMiwgMHgwMDdjLCAweDIwNzEsIDB4YTcxNCwgMHg3MDAzLCAweDAwMDEsIDB4NzAwNywKKwkweDAwMDAsIDB4NzAxMywgMHgwMDAwLCAweDcwMTcsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwKKwkweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDcwNGIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1YiwKKwkweDAwMjAsIDB4NzA1ZiwgMHgwMDQwLCAweDcwN2YsIDB4MDAwMCwgMHgyMDcxLCAweGE4N2QsIDB4NzAwMywKKwkweGE3MTQsIDB4NzAwNywgMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHg3MDBmLCAweGE4NWQsIDB4NzAxMywKKwkweDAwMjAsIDB4NzAxNywgMHgwMDQwLCAweDcwMzcsIDB4MDAwMCwgMHgwMDdjLCAweDAxN2UsIDB4MGU3ZSwKKwkweDIwNzEsIDB4YTgzNSwgMHhhMDBlLCAweDcxODYsIDB4NzE4YSwgMHg3MDk3LCAweDAwMDEsIDB4MjAwMSwKKwkweGE2NTMsIDB4MjAwNCwgMHhkMGZjLCAweDAwYzAsIDB4NDllOCwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGEwMGUsIDB4ZDA5YywgMHgwMDQwLCAweDQ5ZTUsIDB4ODEwOCwgMHg3MTAyLCAweDAwNzgsIDB4NGEzYiwKKwkweDIwMDEsIDB4YTY3MiwgMHgyMDBjLCAweGExODQsIDB4MDAwZiwgMHgyMDA5LCAweGE2NzMsIDB4MjEwYywKKwkweDAwNzksIDB4NDlmMiwgMHg0OWRkLCAweDRhMTMsIDB4NGExYiwgMHg0YTI2LCAweDRhMmMsIDB4NDlkZCwKKwkweDQ5ZGQsIDB4NDlkZCwgMHg0YTAyLCAweDQ5ZGQsIDB4NDlkZCwgMHg0OWRkLCAweDQ5ZGQsIDB4NDlkZCwKKwkweDQ5ZGQsIDB4NDlkZCwgMHg3MDAzLCAweDAwMDQsIDB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4MjA5OSwKKwkweGE2NzYsIDB4MjBhMSwgMHhhODg2LCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDE1N2YsIDB4MTQ3ZiwKKwkweDEzN2YsIDB4MDA3OCwgMHg0YTNiLCAweDcwOGYsIDB4MDAwNSwgMHg3MDA3LCAweDAxMjIsIDB4MjAwMSwKKwkweDAwMDIsIDB4MDA3OCwgMHg0YTIxLCAweDcwOGYsIDB4MDAwMiwgMHg3MDA3LCAweDAxMjEsIDB4MjAwMSwKKwkweDAwMDMsIDB4NzAwMiwgMHg3MDk3LCAweDAwMDEsIDB4MDA3OCwgMHg0YTM4LCAweDcwMDcsIDB4MDEyMiwKKwkweDIwMDEsIDB4MDAwMiwgMHgwMDc4LCAweDRhMzAsIDB4NzAwNywgMHgwMTIxLCAweDIwMDEsIDB4MDAwMywKKwkweDcwMDIsIDB4YTAwNiwgMHg3MDk2LCAweDcwOGUsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4NzA5YSwKKwkweGExODQsIDB4MDBmZiwgMHg3MDkyLCAweDBlN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwKKwkweGE3MTQsIDB4Njg0YywgMHhhMDA1LCAweDAwYzAsIDB4NGE0YywgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDRhNzEsIDB4NmE2MCwgMHg3MjM2LCAweDZiNjQsIDB4NzMzYSwKKwkweDY4NjgsIDB4NzAzZSwgMHg3MDc2LCAweDY4NmMsIDB4NzA0MiwgMHg3MDdhLCAweDY4NGMsIDB4NzAyZSwKKwkweDY4NDQsIDB4NzAzMiwgMHgyMDA5LCAweDAwMGQsIDB4MjAwYSwgMHg3MDBiLCAweDAwMDAsIDB4ODAwNywKKwkweDgwMDYsIDB4ODAwNiwgMHhhMDhjLCAweDAwM2YsIDB4YTA4NCwgMHhmZmMwLCAweGEyMTAsIDB4MjEwMCwKKwkweGEzMTksIDB4NzI2ZSwgMHg3MzcyLCAweDcwMjgsIDB4YzA4NCwgMHg3MDJhLCAweDcwMDcsIDB4MDAwMSwKKwkweGEwMDYsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDI3ZSwgMHg2ODM4LCAweGQwZmMsIDB4MDBjMCwKKwkweDRhYzksIDB4NjgwNCwgMHhhMDBkLCAweDAwNDAsIDB4NGE4ZiwgMHgwZDdlLCAweDIwNzEsIDB4YTYwMCwKKwkweGEwMTYsIDB4NzAyYywgMHgyMTY4LCAweDY5MDQsIDB4MjA2YSwgMHg4MjEwLCAweDJkMDAsIDB4ODFmZiwKKwkweDAwYzAsIDB4NGE4MiwgMHg3MDJlLCAweDcwYWMsIDB4YTIwMCwgMHg3MGFlLCAweDBkN2YsIDB4MjA3MSwKKwkweGE3MTQsIDB4NzAxYywgMHhhMDA1LCAweDAwYzAsIDB4NGFkYiwgMHgwMDY4LCAweDRhZDksIDB4MjA3MSwKKwkweGE4MzUsIDB4NzIwMCwgMHg4MmZmLCAweDAwNDAsIDB4NGFkOSwgMHg2OTM0LCAweGExODYsIDB4MDEwMywKKwkweDAwYzAsIDB4NGFlYywgMHg2OTQ4LCAweDY4NDQsIDB4YTEwNSwgMHgwMGMwLCAweDRhY2MsIDB4MjAwOSwKKwkweDgwMjAsIDB4MjIwMCwgMHgwMDc5LCAweDRhYWMsIDB4NGFkOSwgMHg0YWIxLCAweDRiMDksIDB4NGIxNywKKwkweDRhZDksIDB4MjA3MSwgMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDRhZDksIDB4NzEyMiwKKwkweDY4M2MsIDB4NzAyNiwgMHg2ODQwLCAweDcwMmEsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwNzEsIDB4YTYwMCwgMHg3MDJjLCAweDIwNmEsIDB4MmQwMCwgMHg3MDJlLCAweDcwYWMsIDB4ODAwMCwKKwkweDcwYWUsIDB4MDI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4Njg0NCwgMHhhMDg2LCAweDAxMDAsIDB4MDBjMCwKKwkweDRhZDksIDB4Njg2OCwgMHhhMDA1LCAweDAwYzAsIDB4NGFkOSwgMHgyMDA5LCAweDgwMjAsIDB4MDA3OCwKKwkweDRhYTksIDB4MjA3MSwgMHhhNzE0LCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLCAweDcwMTAsIDB4ODAwMCwKKwkweDcwMTIsIDB4NzAxOCwgMHhhMDZkLCAweDcxMWEsIDB4MDA0MCwgMHg0YWU5LCAweDY5MDIsIDB4MDA3OCwKKwkweDRhZWEsIDB4NzExZSwgMHgwMDc4LCAweDRhYzksIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxNywKKwkweDAwNDAsIDB4NGFmYSwgMHhhMTg2LCAweDAwMWUsIDB4MDA0MCwgMHg0YWZhLCAweGExOGUsIDB4MDAxZiwKKwkweDAwYzAsIDB4NGFkOSwgMHg2ODRjLCAweGQwY2MsIDB4MDA0MCwgMHg0YWQ5LCAweDY4NTAsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4NGFkOSwgMHgyMDA5LCAweDgwMjEsIDB4MDA3OCwKKwkweDRhYTksIDB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgwMGM4LCAweDRhZDksIDB4NzE4NiwKKwkweGFlOTAsIDB4MDAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHgwMDc4LCAweDRiMjcsIDB4NzA4NCwKKwkweDgwMDgsIDB4YTA5MiwgMHgwMDBmLCAweDAwYzgsIDB4NGFkOSwgMHg3MTg2LCAweGFlOTAsIDB4MDAwMywKKwkweDgwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwgMHg2ODQwLCAweDIwMTIsIDB4NzA4OCwKKwkweGExMGEsIDB4MDA0OCwgMHg0YWMwLCAweDcxOGMsIDB4NzA4NCwgMHhhMTBhLCAweDAwNDgsIDB4NGFjMCwKKwkweDIwNzEsIDB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MDBjMCwgMHg0YWMwLCAweDIwNzEsIDB4YTgzNSwKKwkweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4NGI0NywgMHgxMDc4LCAweDRkYzMsIDB4MjA3MSwKKwkweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDc4LCAweDRhYzAsIDB4MTA3OCwKKwkweDRkZWUsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwKKwkweDRhYzAsIDB4MDA3ZSwgMHg2ODRjLCAweDAwN2UsIDB4NjgzNywgMHgwMTAzLCAweDIwYTksIDB4MDAxYywKKwkweGFkODAsIDB4MDAxMSwgMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LCAweDAwN2YsIDB4YTA4NCwKKwkweDAwZmYsIDB4Njg0ZSwgMHgwMDdmLCAweDY4NGEsIDB4Njk1MiwgMHgwMDdjLCAweDIwNzEsIDB4YTcxNCwKKwkweDcwMDQsIDB4MDA3OSwgMHg0YjZiLCAweDRiNzUsIDB4NGI4NiwgMHg0ZDk0LCAweDRkOTUsIDB4NGRiYywKKwkweDRkYzIsIDB4NGI3NiwgMHg0ZDgyLCAweDRkMjMsIDB4NGRhNSwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDA2OCwgMHg0Yjg1LCAweDIwMDksIDB4MDAwZCwgMHg3MDMwLCAweDIwMGEsIDB4MjA5MSwKKwkweDQwODAsIDB4NzAwNywgMHgwMDAxLCAweDcwMGIsIDB4MDAwMCwgMHgxMjdmLCAweDIwNjksIDB4YThjNCwKKwkweDY4NDQsIDB4YTAwNSwgMHgwMDUwLCAweDRiYWUsIDB4MDBjMCwgMHg0YmFlLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2OSwgMHgwMDAwLCAweDY5MzQsIDB4MjAwMSwgMHhhNzIwLCAweDIwMDQsIDB4YTEwYSwKKwkweDAwNDAsIDB4NGJhOSwgMHgwMDY4LCAweDRiYWQsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwKKwkweDAwYzAsIDB4NGJhZCwgMHgyMDA5LCAweDgwNDAsIDB4NjkyMiwgMHg2ODFiLCAweDAwMDEsIDB4MjA5MSwKKwkweDQwODAsIDB4MjA2OSwgMHhhOGM0LCAweDY4NDcsIDB4ZmZmZiwgMHgxMjdmLCAweDIwNjksIDB4YTYwMCwKKwkweDY4NDgsIDB4Njk2NCwgMHhhMTAyLCAweDIwNjksIDB4YTgzNSwgMHg2ODhhLCAweDY5ODQsIDB4NzAxYywKKwkweGEwNmQsIDB4MDA0MCwgMHg0YmMwLCAweDgxZmYsIDB4MDA0MCwgMHg0YzA4LCAweDAwNzgsIDB4NGJkNiwKKwkweDgxZmYsIDB4MDA0MCwgMHg0Y2RhLCAweDIwNzEsIDB4YTgzNSwgMHg3MTg0LCAweDcwODgsIDB4YTEwYSwKKwkweDAwYzgsIDB4NGJkNiwgMHg3MTkwLCAweDIwNzEsIDB4YThjNCwgMHg3MDQwLCAweGEwMDUsIDB4MDA0MCwKKwkweDRiZDYsIDB4MDBkMCwgMHg0Y2RhLCAweDcxNDIsIDB4MDA3OCwgMHg0Y2RhLCAweDIwNzEsIDB4YTgzNSwKKwkweDcxOGMsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzA4NCwgMHhhMTBhLCAweDAwNDgsIDB4NGNmNywKKwkweDAwNjgsIDB4NGM4YywgMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDAwYzAsIDB4NGM4YywKKwkweDIwMDEsIDB4ZmZmZiwgMHgyMDcxLCAweGE4YzQsIDB4NzA0MiwgMHgyMDcxLCAweGE4MzUsIDB4NzAwMCwKKwkweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDRiZmUsIDB4MTA3OCwgMHg0ZGMzLCAweDIwNzEsIDB4MDAwMCwKKwkweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHg0YzhjLCAweDEwNzgsIDB4NGRlZSwKKwkweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAwNzgsIDB4NGM4YywKKwkweDIwNzEsIDB4YTgzNSwgMHg3MDAwLCAweGEwMDUsIDB4MDA0MCwgMHg0Y2I5LCAweDY5MzQsIDB4YTE4NiwKKwkweDAxMDMsIDB4MDBjMCwgMHg0YzhmLCAweDY4NGMsIDB4ZDBiYywgMHgwMGMwLCAweDRjYjksIDB4Njk0OCwKKwkweDY4NDQsIDB4YTEwNSwgMHgwMGMwLCAweDRjYWMsIDB4MjAwOSwgMHg4MDIwLCAweDIwNzEsIDB4YTgzNSwKKwkweDcwMDAsIDB4MDA3OSwgMHg0YzIzLCAweDRjYjksIDB4NGM3MSwgMHg0YzQ5LCAweDRjNWIsIDB4NGMyOCwKKwkweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLCAweDIwOTksIDB4YTY3NiwgMHgyMGExLCAweGE4ODYsIDB4MjBhOSwKKwkweDAwMDQsIDB4NTNhMywgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgyMDcxLCAweGE4N2QsIDB4YWQ4MCwKKwkweDAwMGYsIDB4NzAwZSwgMHg3MDEzLCAweDAwMDIsIDB4NzAwNywgMHgwMDAyLCAweDcwMGIsIDB4MDAwMCwKKwkweDJlMTAsIDB4MTA3OCwgMHgxM2RiLCAweDIwNzEsIDB4YTcxNCwgMHg3MDA3LCAweDAwMDksIDB4MDA3OCwKKwkweDRjZGEsIDB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgwMGM4LCAweDRjZGEsIDB4YWU5MCwKKwkweDAwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4NzE4NiwgMHgyMDcxLCAweGE3MTQsIDB4MTA3OCwKKwkweDRlNGMsIDB4MDA3OCwgMHg0Y2RhLCAweDcwODQsIDB4ODAwOCwgMHhhMDkyLCAweDAwMGYsIDB4MDBjOCwKKwkweDRjZGEsIDB4YWU5MCwgMHgwMDAzLCAweDgwMDMsIDB4YTIxMCwgMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwKKwkweDY4NDAsIDB4MjAxMiwgMHg3MTg2LCAweDIwNzEsIDB4YTcxNCwgMHgxMDc4LCAweDRlNGMsIDB4MDA3OCwKKwkweDRjZGEsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHg0YzhjLCAweDIwNzEsIDB4MDAwMCwKKwkweDcwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDRjOGMsIDB4NzEyMiwgMHg2ODNjLCAweDcwMjYsIDB4Njg0MCwKKwkweDcwMmEsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgxMjdmLCAweDIwNzEsIDB4YTcxNCwKKwkweDEwNzgsIDB4NGU0YywgMHgwMDc4LCAweDRjZGEsIDB4MTI3ZiwgMHgwMDc4LCAweDRjZGEsIDB4YTE4YywKKwkweDAwZmYsIDB4YTE4NiwgMHgwMDE3LCAweDAwNDAsIDB4NGM5ZCwgMHhhMTg2LCAweDAwMWUsIDB4MDA0MCwKKwkweDRjOWQsIDB4YTE4ZSwgMHgwMDFmLCAweDAwYzAsIDB4NGNiOSwgMHg2ODRjLCAweGQwY2MsIDB4MDA0MCwKKwkweDRjYjksIDB4Njg1MCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4NGNiOSwKKwkweDIwMDksIDB4ODAyMSwgMHgwMDc4LCAweDRjMWUsIDB4Njg0NCwgMHhhMDg2LCAweDAxMDAsIDB4MDBjMCwKKwkweDRjYjksIDB4Njg2OCwgMHhhMDA1LCAweDAwYzAsIDB4NGNiOSwgMHgyMDA5LCAweDgwMjAsIDB4MDA3OCwKKwkweDRjMWUsIDB4MjA3MSwgMHhhNzE0LCAweDEwNzgsIDB4NGU2MCwgMHgwMDQwLCAweDRjZGEsIDB4MjA3MSwKKwkweGE3MTQsIDB4NzAwZiwgMHgwMDAxLCAweDY5MzQsIDB4YTE4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMywKKwkweDAwYzAsIDB4NGNkMSwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHg4MTAxLCAweDAwNDAsIDB4NGNkMSwKKwkweDcxMGUsIDB4NzAwNywgMHgwMDAzLCAweDEwNzgsIDB4NGU4MCwgMHg3MDUwLCAweGEwODYsIDB4MDEwMCwKKwkweDAwNDAsIDB4NGQ5NSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE3MTQsIDB4NzAwOCwKKwkweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDRjZjUsIDB4MDA2OCwgMHg0Y2Y1LCAweDIwMDksIDB4MDAwZCwKKwkweDcwMzAsIDB4MjAwYSwgMHgyMDkxLCAweDQwODAsIDB4NzAwYiwgMHgwMDAwLCAweDcwMDQsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDBjMCwgMHg0Y2Y1LCAweDcwMDcsIDB4MDAwMSwgMHgxMjdmLCAweDAwN2MsIDB4MjA3MSwKKwkweGE3MTQsIDB4MTA3OCwgMHg0ZTYwLCAweDAwNDAsIDB4NGQyMCwgMHgyMDcxLCAweGE4MzUsIDB4NzA4NCwKKwkweDcwMGEsIDB4MjBhOSwgMHgwMDIwLCAweDIwOTksIDB4YTgzNiwgMHgyMGExLCAweGE4NWQsIDB4NTNhMywKKwkweDcwODcsIDB4MDAwMCwgMHgyMDcxLCAweGE3MTQsIDB4MjA2OSwgMHhhODdkLCAweDcwNmMsIDB4NjgyNiwKKwkweDcwNzAsIDB4NjgyYSwgMHg3MDc0LCAweDY4MmUsIDB4NzA3OCwgMHg2ODMyLCAweDJkMTAsIDB4MTA3OCwKKwkweDEzZGIsIDB4NzAwNywgMHgwMDA4LCAweDIwMDEsIDB4ZmZmZiwgMHgyMDcxLCAweGE4YzQsIDB4NzA0MiwKKwkweDEyN2YsIDB4MDA3OCwgMHg0Y2RhLCAweDIwNjksIDB4YTg3ZCwgMHg2ODA4LCAweGEwOGUsIDB4MDAwMCwKKwkweDAwNDAsIDB4NGQ4MSwgMHhhMDhlLCAweDAyMDAsIDB4MDA0MCwgMHg0ZDdmLCAweGEwOGUsIDB4MDEwMCwKKwkweDAwYzAsIDB4NGQ4MSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDY4LCAweDRkN2MsIDB4MjA2OSwKKwkweDAwMDAsIDB4NjgxOCwgMHhkMDg0LCAweDAwYzAsIDB4NGQ3YywgMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwKKwkweGExMDIsIDB4MDA0OCwgMHg0ZDRhLCAweGEwMGUsIDB4NzAzNCwgMHg3MDZlLCAweDcwMzgsIDB4NzA3MiwKKwkweDAwNzgsIDB4NGQ1NCwgMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLCAweDAwYzgsIDB4NGQ1NCwKKwkweDcwNzAsIDB4YTA4MSwgMHgwMDAwLCAweDcwNzIsIDB4NzEzMiwgMHg2OTM2LCAweDcwMGIsIDB4MDAwMCwKKwkweDIwMDEsIDB4YTg1YSwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg0ZDczLCAweDY5MzQsIDB4MjA2OSwKKwkweGE4MzUsIDB4Njg5YywgMHg2OTllLCAweDIwNjksIDB4YThjNCwgMHhhMTAyLCAweDAwYzAsIDB4NGQ2YywKKwkweDY4NDQsIDB4YTAwNSwgMHgwMGQwLCAweDRkN2EsIDB4MjAwMSwgMHhhODViLCAweDIwMGMsIDB4ODEwZCwKKwkweDY5NDYsIDB4MDA3OCwgMHg0ZDdhLCAweDIwMDksIDB4ODA0MCwgMHg2OTIyLCAweDY4MWIsIDB4MDAwMSwKKwkweDIwOTEsIDB4NDA4MCwgMHg3MDA3LCAweDAwMDEsIDB4MTI3ZiwgMHgwMDc4LCAweDRkODEsIDB4NzAwNywKKwkweDAwMDUsIDB4MDA3YywgMHg3MDFjLCAweGEwNmQsIDB4MDA0MCwgMHg0ZDkzLCAweDEwNzgsIDB4NGU2MCwKKwkweDAwNDAsIDB4NGQ5MywgMHg3MDA3LCAweDAwMDMsIDB4MTA3OCwgMHg0ZTgwLCAweDcwNTAsIDB4YTA4NiwKKwkweDAxMDAsIDB4MDA0MCwgMHg0ZDk1LCAweDAwN2MsIDB4MDA3YywgMHg3MDUwLCAweGEwOWUsIDB4MDEwMCwKKwkweDAwYzAsIDB4NGQ5ZSwgMHg3MDA3LCAweDAwMDQsIDB4MDA3OCwgMHg0ZGJjLCAweGEwODYsIDB4MDIwMCwKKwkweDAwYzAsIDB4NGRhNCwgMHg3MDA3LCAweDAwMDUsIDB4MDA3YywgMHgyMDAxLCAweGE4N2YsIDB4MjAwNCwKKwkweGEwOGUsIDB4MDEwMCwgMHgwMGMwLCAweDRkYjEsIDB4NzAwNywgMHgwMDAxLCAweDEwNzgsIDB4NGU0YywKKwkweDAwN2MsIDB4YTA4ZSwgMHgwMDAwLCAweDAwNDAsIDB4NGRiMCwgMHhhMDhlLCAweDAyMDAsIDB4MDBjMCwKKwkweDRkYjAsIDB4NzAwNywgMHgwMDA1LCAweDAwN2MsIDB4MTA3OCwgMHg0ZTE2LCAweDcwMDYsIDB4MTA3OCwKKwkweDRlNGMsIDB4MDA3YywgMHgwMDdjLCAweDBlN2UsIDB4MTU3ZSwgMHgyMDcxLCAweGE4MzUsIDB4NzE4NCwKKwkweDgxZmYsIDB4MDA0MCwgMHg0ZGViLCAweGEwMDYsIDB4NzA4NiwgMHhhZTgwLCAweDAwMDMsIDB4MjA3MSwKKwkweDAwMDAsIDB4MjFhOCwgMHgyMDE0LCAweDcyMjYsIDB4ODAwMCwgMHgwMDcwLCAweDRkZTgsIDB4MjAxNCwKKwkweDcyMmEsIDB4ODAwMCwgMHgwMDcwLCAweDRkZTgsIDB4MjAxNCwgMHg3MjJlLCAweDgwMDAsIDB4MDA3MCwKKwkweDRkZTgsIDB4MjAxNCwgMHg3MjNhLCAweDgwMDAsIDB4MDA3MCwgMHg0ZGU4LCAweDIwMTQsIDB4NzIzZSwKKwkweGExODAsIDB4ODAzMCwgMHg3MDIyLCAweDE1N2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MTU3ZSwKKwkweDIwNzEsIDB4YTgzNSwgMHg3MTg0LCAweDgxZmYsIDB4MDA0MCwgMHg0ZTEzLCAweGEwMDYsIDB4NzA4NiwKKwkweGFlODAsIDB4MDAwMywgMHgyMDcxLCAweDAwMDAsIDB4MjFhOCwgMHgyMDE0LCAweDcyMjYsIDB4ODAwMCwKKwkweDIwMTQsIDB4NzIyYSwgMHg4MDAwLCAweDAwNzAsIDB4NGUwYywgMHgyMDE0LCAweDcyM2EsIDB4ODAwMCwKKwkweDIwMTQsIDB4NzIzZSwgMHgwMDc4LCAweDRlMTAsIDB4MjAwMSwgMHg4MDIwLCAweDAwNzgsIDB4NGUxMiwKKwkweDIwMDEsIDB4ODA0MiwgMHg3MDIyLCAweDE1N2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcwMmMsIDB4NzEzMCwKKwkweDgxMDgsIDB4YTEwMiwgMHgwMDQ4LCAweDRlMjMsIDB4YTAwZSwgMHg3MDM0LCAweDcwNmUsIDB4NzAzOCwKKwkweDcwNzIsIDB4MDA3OCwgMHg0ZTJkLCAweDcwNmMsIDB4YTA4MCwgMHgwMDQwLCAweDcwNmUsIDB4MDBjOCwKKwkweDRlMmQsIDB4NzA3MCwgMHhhMDgxLCAweDAwMDAsIDB4NzA3MiwgMHg3MTMyLCAweDcwMGMsIDB4ODAwMSwKKwkweDcwMGUsIDB4MDBjMCwgMHg0ZTQzLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4NGU0NiwKKwkweDIwMDEsIDB4MDAwZCwgMHgyMTAyLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwMDEsIDB4NzAwYiwKKwkweDAwMDAsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsIDB4MDAwNywgMHgwMDdjLCAweDIwMDEsIDB4MDAwNiwKKwkweDcwMGIsIDB4MDAwMSwgMHgxMjdmLCAweDAwN2MsIDB4NzAxYywgMHhhMDZkLCAweDAwNDAsIDB4NGU1ZiwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDJkMDQsIDB4NzAxZSwKKwkweGEwMDUsIDB4MDBjMCwgMHg0ZTVjLCAweDcwMWEsIDB4MTI3ZiwgMHgxMDc4LCAweDEzYTQsIDB4MDA3YywKKwkweDIwMTksIDB4MDAwZCwgMHgyMzA0LCAweDIzMGMsIDB4YTEwZSwgMHgwMDQwLCAweDRlNmYsIDB4MjMwNCwKKwkweDIzMGMsIDB4YTEwZSwgMHgwMDQwLCAweDRlNmYsIDB4YTAwNiwgMHgwMDc4LCAweDRlN2YsIDB4NzMyYywKKwkweDgzMTksIDB4NzEzMCwgMHhhMTAyLCAweDAwYzAsIDB4NGU3OSwgMHgyMzAwLCAweGEwMDUsIDB4MDA3OCwKKwkweDRlN2YsIDB4MDA0OCwgMHg0ZTdlLCAweGEzMDIsIDB4MDA3OCwgMHg0ZTdmLCAweDgwMDIsIDB4MDA3YywKKwkweDJkMDAsIDB4NzAyNiwgMHhhMDgwLCAweDAwMGQsIDB4NzA1NiwgMHg3MDUzLCAweDAwMDAsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweGE4ZDYsIDB4MjEwNCwgMHhjMDhkLCAweDIwMGEsIDB4MTI3ZiwKKwkweDEwNzgsIDB4MTNmOSwgMHgwMDdjLCAweDIwNzEsIDB4YTZlMiwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywKKwkweDAwMDAsIDB4NzAwZiwgMHgwMDAwLCAweDcwMmIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1MywKKwkweDAwMDEsIDB4NzA1ZiwgMHgwMDIwLCAweDcwNjMsIDB4MDA0MCwgMHg3MDgzLCAweDAwMDAsIDB4NzA4YiwKKwkweDAwMDAsIDB4NzA4ZiwgMHgwMDAxLCAweDcwYmYsIDB4MDAwMCwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwKKwkweGE2ZTIsIDB4Njg0OCwgMHhhMDA1LCAweDAwYzAsIDB4NGViYywgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDRlZTEsIDB4NmE1MCwgMHg3MjM2LCAweDZiNTQsIDB4NzMzYSwKKwkweDY4NTgsIDB4NzAzZSwgMHg3MDdhLCAweDY4NWMsIDB4NzA0MiwgMHg3MDdlLCAweDY4NDgsIDB4NzAyZSwKKwkweDY4NDAsIDB4NzAzMiwgMHgyMDA5LCAweDAwMGMsIDB4MjAwYSwgMHg4MDA3LCAweDgwMDYsIDB4ODAwNiwKKwkweGEwOGMsIDB4MDAzZiwgMHhhMDg0LCAweGZmYzAsIDB4YTIxMCwgMHgyMTAwLCAweGEzMTksIDB4NzI3MiwKKwkweDczNzYsIDB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLCAweDcwMGYsIDB4MDAwMCwKKwkweGEwMDYsIDB4MGU3ZiwgMHgwMDdjLCAweDJiNzgsIDB4MjA3MSwgMHhhNmUyLCAweDcwMDQsIDB4MTA3OSwKKwkweDRmNDEsIDB4NzAwYywgMHgwMDc5LCAweDRlZWMsIDB4NGVmMSwgMHg0ZWU2LCAweDRlZTYsIDB4NGVlNiwKKwkweDRlZTYsIDB4MDA3YywgMHg3MDBjLCAweDAwNzksIDB4NGVmNSwgMHg0ZWZhLCAweDRmM2YsIDB4NGYzZiwKKwkweDRmNDAsIDB4NGY0MCwgMHg3ODMwLCAweDc5MzAsIDB4YTEwNiwgMHgwMDQwLCAweDRmMDQsIDB4NzgzMCwKKwkweDc5MzAsIDB4YTEwNiwgMHgwMGMwLCAweDRmMmEsIDB4NzAzMCwgMHhhMTBhLCAweDAwNDAsIDB4NGYyYSwKKwkweDAwYzgsIDB4NGYwYywgMHg3MTJjLCAweGExMGEsIDB4YTE4YSwgMHgwMDAyLCAweDAwYzgsIDB4NGYyYiwKKwkweDEwNzgsIDB4MTM3MCwgMHgwMDQwLCAweDRmMmEsIDB4MmQwMCwgMHg3MDVhLCAweDcwNjMsIDB4MDA0MCwKKwkweDIwMDEsIDB4MDAwMywgMHg3MDU3LCAweDAwMDAsIDB4MTI3ZSwgMHgwMDdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDIwMDksIDB4YThkNiwgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwgMHgwMDdmLCAweDcwMGUsIDB4MTI3ZiwKKwkweDEwNzgsIDB4MTNmOSwgMHgwMDdjLCAweDEwNzgsIDB4MTM3MCwgMHgwMDQwLCAweDRmMmEsIDB4MmQwMCwKKwkweDcwNWEsIDB4MTA3OCwgMHgxMzcwLCAweDAwYzAsIDB4NGYzNywgMHgwMDc4LCAweDRmMTYsIDB4MmQwMCwKKwkweDcwODYsIDB4NzA2MywgMHgwMDgwLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDRmMWEsIDB4MDA3YywKKwkweDAwN2MsIDB4NGY1MiwgMHg0ZjUzLCAweDRmOGEsIDB4NGY4YiwgMHg0ZjNmLCAweDRmYzEsIDB4NGZjNiwKKwkweDRmZmQsIDB4NGZmZSwgMHg1MDE5LCAweDUwMWEsIDB4NTAxYiwgMHg1MDFjLCAweDUwMWQsIDB4NTAxZSwKKwkweDUwOWUsIDB4NTBjOCwgMHgwMDdjLCAweDcwMGMsIDB4MDA3OSwgMHg0ZjU2LCAweDRmNWIsIDB4NGY1ZSwKKwkweDRmNmUsIDB4NGY4OSwgMHg0Zjg5LCAweDEwNzgsIDB4NGVmMiwgMHgwMDdjLCAweDEyN2UsIDB4ODAwMSwKKwkweDcwMGUsIDB4NzA1OCwgMHgwMDdlLCAweDEwNzgsIDB4NTQ2NCwgMHgwMDQwLCAweDRmNmIsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHg0ZWYyLCAweDBkN2YsIDB4MDA3OCwgMHg0Zjc3LCAweDEyN2UsIDB4ODAwMSwKKwkweDcwMGUsIDB4MTA3OCwgMHg1NDY0LCAweDcwNTgsIDB4MjA2OCwgMHg3MDg0LCAweDcwNWEsIDB4NjgwMywKKwkweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAyMCwKKwkweDAwYzgsIDB4NGY4NiwgMHgxMDc5LCAweDRmYTEsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MTA3OCwKKwkweDUwMWYsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE2ZTIsIDB4NzAwYywKKwkweDAwNzksIDB4NGY5MiwgMHg0Zjk3LCAweDRmOTcsIDB4NGY5NywgMHg0Zjk5LCAweDRmOWQsIDB4MGU3ZiwKKwkweDAwN2MsIDB4NzAwZiwgMHgwMDAxLCAweDAwNzgsIDB4NGY5ZiwgMHg3MDBmLCAweDAwMDIsIDB4MGU3ZiwKKwkweDAwN2MsIDB4NTAxZiwgMHg1MDFmLCAweDUwM2IsIDB4NTAxZiwgMHg1MTcxLCAweDUwMWYsIDB4NTAxZiwKKwkweDUwMWYsIDB4NTAxZiwgMHg1MDFmLCAweDUwM2IsIDB4NTFiYiwgMHg1MjA4LCAweDUyNjEsIDB4NTI3NywKKwkweDUwMWYsIDB4NTAxZiwgMHg1MDU3LCAweDUwM2IsIDB4NTAxZiwgMHg1MDFmLCAweDUwNzgsIDB4NTMzOCwKKwkweDUzNTYsIDB4NTAxZiwgMHg1MDU3LCAweDUwMWYsIDB4NTAxZiwgMHg1MDFmLCAweDUwMWYsIDB4NTA2ZCwKKwkweDUzNTYsIDB4NzAyMCwgMHgyMDY4LCAweDEwNzgsIDB4MTNhNCwgMHgwMDdjLCAweDcwMGMsIDB4MDA3OSwKKwkweDRmYzksIDB4NGZjZSwgMHg0ZmQxLCAweDRmZTEsIDB4NGZmYywgMHg0ZmZjLCAweDEwNzgsIDB4NGVmMiwKKwkweDAwN2MsIDB4MTI3ZSwgMHg4MDAxLCAweDcwMGUsIDB4NzA1OCwgMHgwMDdlLCAweDEwNzgsIDB4NTQ2NCwKKwkweDAwNDAsIDB4NGZkZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0ZWYyLCAweDBkN2YsIDB4MDA3OCwKKwkweDRmZWEsIDB4MTI3ZSwgMHg4MDAxLCAweDcwMGUsIDB4MTA3OCwgMHg1NDY0LCAweDcwNTgsIDB4MjA2OCwKKwkweDcwODQsIDB4NzA1YSwgMHg2ODAzLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDY4MzQsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTA4YSwgMHgwMDFhLCAweDAwYzgsIDB4NGZmOSwgMHgxMDc5LCAweDRmZmYsIDB4MTI3ZiwKKwkweDAwN2MsIDB4MTI3ZiwgMHgxMDc4LCAweDUwMWYsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4NTAxZiwKKwkweDUwM2IsIDB4NTE1YiwgMHg1MDFmLCAweDUwM2IsIDB4NTAxZiwgMHg1MDNiLCAweDUwM2IsIDB4NTAxZiwKKwkweDUwM2IsIDB4NTE1YiwgMHg1MDNiLCAweDUwM2IsIDB4NTAzYiwgMHg1MDNiLCAweDUwM2IsIDB4NTAxZiwKKwkweDUwM2IsIDB4NTE1YiwgMHg1MDFmLCAweDUwMWYsIDB4NTAzYiwgMHg1MDFmLCAweDUwMWYsIDB4NTAxZiwKKwkweDUwM2IsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4NzAwNywKKwkweDAwMDEsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4YzBkNSwgMHg2ODNhLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEyN2YsIDB4MDA3YywgMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwKKwkweGEwODQsIDB4MDBmZiwgMHhjMGU1LCAweDY4M2EsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDRhNzMsIDB4MTI3ZiwgMHgwMDdjLCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwKKwkweGMwZWQsIDB4NjgzYSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDRhNzMsIDB4MTI3ZiwKKwkweDAwN2MsIDB4NzAwNywgMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZGQsIDB4NjgzYSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMjdmLCAweDAwN2MsIDB4NjgzNCwKKwkweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4NTAyZCwgMHg4MDAxLCAweDAwYzAsIDB4NTA2NCwKKwkweDcwMDcsIDB4MDAwMSwgMHgwMDc4LCAweDUxM2EsIDB4NzAwNywgMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwKKwkweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDUxM2EsIDB4MDA3YywgMHg2ODRjLCAweGEwODQsIDB4MDBjMCwKKwkweGEwODYsIDB4MDBjMCwgMHgwMGMwLCAweDUwNzgsIDB4NzAwNywgMHgwMDAxLCAweDAwNzgsIDB4NTM3MywKKwkweDJkMDAsIDB4NzAxNiwgMHg3MDFhLCAweDIwYTksIDB4MDAwNCwgMHhhMDgwLCAweDAwMjQsIDB4MjA5OCwKKwkweDIwYTEsIDB4YTcwZCwgMHg1M2EzLCAweDY4NTgsIDB4NzAxMiwgMHhhMDgyLCAweDA0MDEsIDB4MDBjOCwKKwkweDUwNDksIDB4Njg4NCwgMHhhMDhhLCAweDAwMDIsIDB4MDBjOCwgMHg1MDQ5LCAweDgyZmYsIDB4MDBjMCwKKwkweDUwOWEsIDB4Njg4OCwgMHg2OThjLCAweGExMDUsIDB4MDA0MCwgMHg1MDlhLCAweDIwMDEsIDB4NTEwYSwKKwkweDAwNzgsIDB4NTA5ZCwgMHhhMjgwLCAweDUxMDAsIDB4MjAwNCwgMHg3MGM2LCAweDcwMTAsIDB4YTAxNSwKKwkweDAwNDAsIDB4NTBlOCwgMHgxMDc4LCAweDEzNzAsIDB4MDBjMCwgMHg1MGE5LCAweDcwMDcsIDB4MDAwZiwKKwkweDAwN2MsIDB4MmQwMCwgMHg3MDIyLCAweDcwYzQsIDB4MjA2MCwgMHg2MDAwLCAweDY4MzYsIDB4NjAwNCwKKwkweGFkMDAsIDB4NzA5NiwgMHg2MDA4LCAweGEyMGEsIDB4MDBjOCwgMHg1MGI4LCAweGEwMGUsIDB4MjIwMCwKKwkweDcxMTIsIDB4NjIwYywgMHg4MDAzLCAweDgwMGIsIDB4YTI5NiwgMHgwMDA0LCAweDAwNDAsIDB4NTBjMSwKKwkweGExMDgsIDB4NzE5YSwgMHg4MTBiLCAweDcxOWUsIDB4YWU5MCwgMHgwMDIyLCAweDEwNzgsIDB4MTNkYiwKKwkweDcwOTAsIDB4YTA4ZSwgMHgwMTAwLCAweDAwNDAsIDB4NTBkYywgMHhhMDg2LCAweDAyMDAsIDB4MDA0MCwKKwkweDUwZDQsIDB4NzAwNywgMHgwMDEwLCAweDAwN2MsIDB4NzAyMCwgMHgyMDY4LCAweDEwNzgsIDB4MTNhNCwKKwkweDcwMTQsIDB4MjA2OCwgMHgwMDc4LCAweDUwNDksIDB4NzAyMCwgMHgyMDY4LCAweDcwMTgsIDB4NjgwMiwKKwkweDY4MDcsIDB4MDAwMCwgMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwgMHg3MTFhLCAweDAwNzgsIDB4NTA5ZSwKKwkweDcwMTQsIDB4MjA2OCwgMHg3MDA3LCAweDAwMDEsIDB4Njg4NCwgMHhhMDA1LCAweDAwYzAsIDB4NTBmNywKKwkweDY4ODgsIDB4Njk4YywgMHhhMTA1LCAweDAwNDAsIDB4NTBmNywgMHgxMDc4LCAweDUxMGUsIDB4NjgzNCwKKwkweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MDA0MCwgMHg1MzczLCAweDAwNzgsIDB4NTEzYSwKKwkweDUxMDIsIDB4NTEwNiwgMHgwMDAyLCAweDAwMTEsIDB4MDAwNywgMHgwMDA0LCAweDAwMGEsIDB4MDAwZiwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDBhLCAweDAwMTEsIDB4MDAwNSwgMHgwMDA0LCAweDBmN2UsIDB4MGU3ZSwKKwkweDBjN2UsIDB4MDc3ZSwgMHgwNjdlLCAweDZmODgsIDB4NmU4YywgMHg2ODA0LCAweDIwNjAsIDB4YWNmMCwKKwkweDAwMjEsIDB4YWNmOCwgMHgwMDI3LCAweDIwMDksIDB4MDAwNSwgMHg3MDBjLCAweDc4MTYsIDB4NzAwOCwKKwkweDc4MTIsIDB4NzAwNCwgMHg3ODA2LCAweDcwMDAsIDB4NzgwMiwgMHg3ZTBlLCAweDdmMGEsIDB4ODEwOSwKKwkweDAwNDAsIDB4NTEzMCwgMHhhZWYyLCAweDAwMDQsIDB4YWZmYSwgMHgwMDA2LCAweDAwNzgsIDB4NTExZCwKKwkweDYwMDQsIDB4YTA2NSwgMHgwMGMwLCAweDUxMTcsIDB4MDY3ZiwgMHgwNzdmLCAweDBjN2YsIDB4MGU3ZiwKKwkweDBmN2YsIDB4MDA3YywgMHgyMDA5LCAweGE2MmYsIDB4MjEwYywgMHg4MWZmLCAweDAwYzAsIDB4NTE1NSwKKwkweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweDY4M2EsIDB4MTA3OCwgMHg0MzUzLCAweDAwYzAsIDB4NTE0OSwKKwkweDAwN2MsIDB4MTA3OCwgMHg0YjUxLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4OGY3ZCwKKwkweDEwNzgsIDB4NGE3MywgMHgxMjdmLCAweDAwNzgsIDB4NTE0OCwgMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwKKwkweDAwMDAsIDB4MDA3OCwgMHg1MTQ5LCAweDcwMTgsIDB4NjgwMiwgMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwKKwkweDcxMWEsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4MDA0MCwgMHg1MTZhLCAweDcwMDcsIDB4MDAwNiwKKwkweDAwNzgsIDB4NTE3MCwgMHg3MDE0LCAweDIwNjgsIDB4NzAwNywgMHgwMDAxLCAweDcwNDgsIDB4MTA3YSwKKwkweDAwN2MsIDB4NzAwNywgMHgwMDAxLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4Njg0OCwKKwkweGEwODQsIDB4MDBmZiwgMHgyMGE5LCAweDAwMDEsIDB4YTA5NiwgMHgwMDAxLCAweDAwNDAsIDB4NTE5YSwKKwkweDIwMDksIDB4MDAwMCwgMHgyMGE5LCAweDAwZmYsIDB4YTA5NiwgMHgwMDAyLCAweDAwNDAsIDB4NTE5YSwKKwkweGEwMDUsIDB4MDBjMCwgMHg1MWFkLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MTA3OCwKKwkweDQ1YzQsIDB4MDBjMCwgMHg1MWFkLCAweDA2N2UsIDB4NmU1MCwgMHgxMDc4LCAweDQ2YjMsIDB4MDY3ZiwKKwkweDAwNzgsIDB4NTFhZCwgMHgwNDdlLCAweDIwMTEsIDB4YTYwYywgMHgyMjI0LCAweGM0ODQsIDB4YzQ4YywKKwkweDI0MTIsIDB4MDQ3ZiwgMHgwYzdlLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDUxYTksIDB4MTA3OCwKKwkweDQ4NTIsIDB4ODEwOCwgMHgwMGYwLCAweDUxYTMsIDB4MGM3ZiwgMHg2ODRjLCAweGQwODQsIDB4MDBjMCwKKwkweDUxYjQsIDB4MTA3OCwgMHgxM2E0LCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDRhNzMsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwKKwkweDIwMDEsIDB4YTY1MywgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg1MWZmLCAweDIwNjEsIDB4YTkzMywKKwkweDYxMDAsIDB4ZDE4NCwgMHgwMDQwLCAweDUxZGYsIDB4Njg1OCwgMHhhMDg0LCAweDAwZmYsIDB4MDBjMCwKKwkweDUyMDIsIDB4NjAwMCwgMHhkMDg0LCAweDAwNDAsIDB4NTFmZiwgMHg2MDA0LCAweGEwMDUsIDB4MDBjMCwKKwkweDUyMDUsIDB4NjAwMywgMHgwMDAwLCAweDYwMGIsIDB4MDAwMCwgMHgwMDc4LCAweDUxZmMsIDB4MjAxMSwKKwkweDAwMDEsIDB4Njg2MCwgMHhhMDA1LCAweDAwYzAsIDB4NTFlNywgMHgyMDAxLCAweDAwMWUsIDB4ODAwMCwKKwkweDYwMTYsIDB4Njg1OCwgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHg1MWZmLCAweDYwMDYsIDB4Njg1OCwKKwkweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4NTFmZiwgMHg2MDBhLCAweDY4NTgsIDB4ODAwMCwKKwkweDAwYzAsIDB4NTFmYiwgMHhjMjhkLCAweDYyMDIsIDB4MTI3ZiwgMHgwMDc4LCAweDU0NTMsIDB4MTI3ZiwKKwkweDAwNzgsIDB4NTQ0YiwgMHgxMjdmLCAweDAwNzgsIDB4NTQ0MywgMHgxMjdmLCAweDAwNzgsIDB4NTQ0NywKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYTQsIDB4MDA0MCwgMHg1MjVlLCAweDIwNjEsIDB4YTkzMywgMHg2MDAwLCAweGQwODQsIDB4MDA0MCwKKwkweDUyNWUsIDB4NjIwNCwgMHg2MzA4LCAweGQwOGMsIDB4MDBjMCwgMHg1MjUwLCAweDZjNDgsIDB4YTQ4NCwKKwkweDAwMDMsIDB4MDA0MCwgMHg1MjM2LCAweDY5NTgsIDB4YTE4YywgMHgwMGZmLCAweDgwMDEsIDB4MDBjMCwKKwkweDUyMmYsIDB4MjEwMCwgMHhhMjEwLCAweDAwNDgsIDB4NTI1YiwgMHgwMDc4LCAweDUyMzYsIDB4ODAwMSwKKwkweDAwYzAsIDB4NTI1YiwgMHgyMTAwLCAweGEyMTIsIDB4MDA0OCwgMHg1MjViLCAweGE0ODQsIDB4MDAwYywKKwkweDAwNDAsIDB4NTI1MCwgMHg2OTU4LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweGEwODIsIDB4MDAwNCwKKwkweDAwYzAsIDB4NTI0OCwgMHgyMTAwLCAweGEzMTgsIDB4MDA0OCwgMHg1MjViLCAweDAwNzgsIDB4NTI1MCwKKwkweGEwODIsIDB4MDAwNCwgMHgwMGMwLCAweDUyNWIsIDB4MjEwMCwgMHhhMzFhLCAweDAwNDgsIDB4NTI1YiwKKwkweDY4NjAsIDB4YTAwNSwgMHgwMDQwLCAweDUyNTYsIDB4ODAwMCwgMHg2MDE2LCAweDYyMDYsIDB4NjMwYSwKKwkweDEyN2YsIDB4MDA3OCwgMHg1NDUzLCAweDEyN2YsIDB4MDA3OCwgMHg1NDRmLCAweDEyN2YsIDB4MDA3OCwKKwkweDU0NGIsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4YTkzMywKKwkweDYzMDAsIDB4ZDM4YywgMHgwMGMwLCAweDUyNzEsIDB4NjMwOCwgMHg4MzE4LCAweDAwNDgsIDB4NTI3NCwKKwkweDYzMGEsIDB4MTI3ZiwgMHgwMDc4LCAweDU0NjEsIDB4MTI3ZiwgMHgwMDc4LCAweDU0NGYsIDB4MTI3ZSwKKwkweDBjN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsIDB4MDAwMSwgMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwKKwkweDUyOGIsIDB4MGM3ZSwgMHgyMDYxLCAweGE5MzMsIDB4NjAwMCwgMHhhMDg0LCAweGZjZmYsIDB4NjAwMiwKKwkweDBjN2YsIDB4MDA3OCwgMHg1MmJhLCAweDY4NTgsIDB4YTAwNSwgMHgwMDQwLCAweDUyZDEsIDB4Njg1YywKKwkweGEwNjUsIDB4MDA0MCwgMHg1MmNkLCAweDIwMDEsIDB4YTYyZiwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwKKwkweDUyOWQsIDB4MTA3OCwgMHg4ZWM2LCAweDAwNzgsIDB4NTJhYiwgMHg2MDEzLCAweDA0MDAsIDB4NjAzNywKKwkweDAwMDAsIDB4Njk0YywgMHhkMWE0LCAweDAwNDAsIDB4NTJhNywgMHg2OTUwLCAweDYxMzYsIDB4MjAwOSwKKwkweDAwNDEsIDB4MTA3OCwgMHg3NzVjLCAweDY5NTgsIDB4YTE4YywgMHhmZjAwLCAweGExODYsIDB4MjAwMCwKKwkweDAwYzAsIDB4NTJiYSwgMHgwMjdlLCAweDIwMDksIDB4MDAwMCwgMHgyMDExLCAweGZkZmYsIDB4MTA3OCwKKwkweDViZjEsIDB4MDI3ZiwgMHg2ODRjLCAweGQwYzQsIDB4MDA0MCwgMHg1MmM5LCAweDIwNjEsIDB4YTkzMywKKwkweDYwMDAsIDB4ZDA4YywgMHgwMGMwLCAweDUyYzksIDB4NjAwOCwgMHg4MDAwLCAweDAwNDgsIDB4NTJjZCwKKwkweDYwMGEsIDB4MGM3ZiwgMHgxMjdmLCAweDAwNzgsIDB4NTQ1MywgMHgwYzdmLCAweDEyN2YsIDB4MDA3OCwKKwkweDU0NGIsIDB4Njk1NCwgMHhhMTg2LCAweDAwNDUsIDB4MDA0MCwgMHg1MzA2LCAweGExODYsIDB4MDAyYSwKKwkweDAwYzAsIDB4NTJlMSwgMHgyMDAxLCAweGE2MGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsIDB4MDA3OCwKKwkweDUyYmEsIDB4YTE4NiwgMHgwMDIwLCAweDAwNDAsIDB4NTJmYSwgMHhhMTg2LCAweDAwMjksIDB4MDA0MCwKKwkweDUyZWQsIDB4YTE4NiwgMHgwMDJkLCAweDAwYzAsIDB4NTJjZCwgMHg2OTQ0LCAweGExOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4NTJiYSwgMHg2MDAwLCAweGMwZTQsIDB4NjAwMiwKKwkweDAwNzgsIDB4NTJiYSwgMHg2ODVjLCAweGEwNjUsIDB4MDA0MCwgMHg1MmNkLCAweDYwMDcsIDB4MDAyNCwKKwkweDIwMDEsIDB4YThhMywgMHgyMDA0LCAweDYwMTYsIDB4MDA3OCwgMHg1MmJhLCAweDY4NWMsIDB4YTA2NSwKKwkweDAwNDAsIDB4NTJjZCwgMHgwZTdlLCAweDY4NjAsIDB4YTA3NSwgMHgyMDAxLCAweGE2MmYsIDB4MjAwNCwKKwkweGEwMDUsIDB4MDA0MCwgMHg1MzFlLCAweDEwNzgsIDB4OGVjNiwgMHg4ZWZmLCAweDAwNDAsIDB4NTMxYiwKKwkweDJlNjAsIDB4MTA3OCwgMHg4ZWM2LCAweDBlN2YsIDB4MDA3OCwgMHg1MmJhLCAweDYwMjQsIDB4YzBkYywKKwkweGMwZDUsIDB4NjAyNiwgMHgyZTYwLCAweDYwMDcsIDB4MDAzYSwgMHg2ODcwLCAweGEwMDUsIDB4MDA0MCwKKwkweDUzMmYsIDB4NjAwNywgMHgwMDNiLCAweDY4NzQsIDB4NjAyYSwgMHg2ODc4LCAweDYwMTIsIDB4NjAwMywKKwkweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwZTdmLCAweDAwNzgsIDB4NTJiYSwKKwkweDIwNjEsIDB4YTkzMywgMHg2MDAwLCAweGQwODQsIDB4MDA0MCwgMHg1MzUyLCAweGQwOGMsIDB4MDBjMCwKKwkweDU0NjEsIDB4MjA5MSwgMHg4MDAwLCAweDYyMDQsIDB4ODIxMCwgMHgwMDQ4LCAweDUzNGMsIDB4NjIwNiwKKwkweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDU0NjEsIDB4MjA5MSwgMHg4MDAxLCAweDY4NTMsIDB4MDAxNiwKKwkweDAwNzgsIDB4NTQ1YSwgMHg2ODUzLCAweDAwMDcsIDB4MDA3OCwgMHg1NDVhLCAweDY4MzQsIDB4ODAwNywKKwkweGEwODQsIDB4MDBmZiwgMHgwMGMwLCAweDUzNjAsIDB4MTA3OCwgMHg1MDJkLCAweDAwNzgsIDB4NTM3MiwKKwkweDIwMzAsIDB4ODAwMSwgMHgwMGMwLCAweDUzNmEsIDB4NzAwNywgMHgwMDAxLCAweDEwNzgsIDB4NTM3MywKKwkweDAwNzgsIDB4NTM3MiwgMHg3MDA3LCAweDAwMDYsIDB4NzAxMiwgMHgyZDAwLCAweDcwMTYsIDB4NzAxYSwKKwkweDcwNGIsIDB4NTM3MywgMHgwMDdjLCAweDBlN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4YTAzZSwKKwkweDIwMDksIDB4YTYyZiwgMHgyMTBjLCAweDgxZmYsIDB4MDBjMCwgMHg1M2ZmLCAweDIwMDksIDB4YTYwYywKKwkweDIxMGMsIDB4ZDE5NCwgMHgwMGMwLCAweDU0MzEsIDB4Njg0OCwgMHgyMDcwLCAweGFlODIsIDB4YWQwMCwKKwkweDAwNDgsIDB4NTNlZiwgMHgyMDAxLCAweGE2MTYsIDB4MjAwNCwgMHhhZTAyLCAweDAwYzgsIDB4NTNlZiwKKwkweDIwNjEsIDB4YTkzMywgMHg2MTAwLCAweGExODQsIDB4MDMwMSwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwKKwkweDUzZDIsIDB4NzExYywgMHhhMTg2LCAweDAwMDYsIDB4MDBjMCwgMHg1M2RhLCAweDcwMTgsIDB4YTAwNSwKKwkweDAwNDAsIDB4NTNmZiwgMHgyMDA0LCAweGQwZTQsIDB4MDBjMCwgMHg1NDJiLCAweDcwMjQsIDB4ZDBkYywKKwkweDAwYzAsIDB4NTQzNSwgMHg2ODUzLCAweDAwMDAsIDB4NjgwMywgMHgwMDAwLCAweDJkMDgsIDB4NzAxMCwKKwkweGEwMDUsIDB4MDBjMCwgMHg1M2JlLCAweDcxMTIsIDB4Njg0YywgMHhkMGY0LCAweDAwYzAsIDB4NTQzOSwKKwkweDJlNjAsIDB4MTA3OCwgMHg1YjI3LCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwNjgsIDB4NjgwMCwKKwkweGEwMDUsIDB4MDBjMCwgMHg1M2JlLCAweDY5MDIsIDB4MjE2OCwgMHg2ODRjLCAweGQwZjQsIDB4MDBjMCwKKwkweDU0MzksIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MTI3ZiwgMHgwZTdmLCAweDY4NTMsIDB4MDAwNiwKKwkweDAwNzgsIDB4NTQ1YSwgMHhkMTg0LCAweDAwNDAsIDB4NTNjYywgMHhkMWM0LCAweDAwYzAsIDB4NTNmMywKKwkweDAwNzgsIDB4NTNmNywgMHg2OTQ0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4NTQyYiwgMHg2MDAwLCAweGQwZTQsIDB4MDBjMCwgMHg1NDJiLCAweDcxMWMsIDB4YTE4NiwKKwkweDAwMDcsIDB4MDBjMCwgMHg1M2VmLCAweDY4NTMsIDB4MDAwMiwgMHgwMDc4LCAweDU0MmQsIDB4Njg1MywKKwkweDAwMDgsIDB4MDA3OCwgMHg1NDJkLCAweDY4NTMsIDB4MDAwZSwgMHgwMDc4LCAweDU0MmQsIDB4Njg1MywKKwkweDAwMTcsIDB4MDA3OCwgMHg1NDJkLCAweDY4NTMsIDB4MDAzNSwgMHgwMDc4LCAweDU0MmQsIDB4MjAwMSwKKwkweGE2NzIsIDB4MjAwNCwgMHhkMGZjLCAweDAwNDAsIDB4NTQyNywgMHg2ODQ4LCAweDIwNzAsIDB4YWU4MiwKKwkweGFkMDAsIDB4MDA0OCwgMHg1NDI3LCAweDYwNTgsIDB4YWUwMiwgMHgwMGM4LCAweDU0MjcsIDB4NzExYywKKwkweGExODYsIDB4MDAwNiwgMHgwMGMwLCAweDU0MjcsIDB4NzAxOCwgMHhhMDA1LCAweDAwNDAsIDB4NTQyNywKKwkweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDU0MjcsIDB4MjAzOSwgMHgwMDAxLCAweDcwMDAsIDB4YTA4NiwKKwkweDAwMDcsIDB4MDBjMCwgMHg1MzdlLCAweDcwMDMsIDB4MDAwMiwgMHgwMDc4LCAweDUzN2UsIDB4Njg1MywKKwkweDAwMjgsIDB4MDA3OCwgMHg1NDJkLCAweDY4NTMsIDB4MDAyOSwgMHgxMjdmLCAweDBlN2YsIDB4MDA3OCwKKwkweDU0NWEsIDB4Njg1MywgMHgwMDJhLCAweDAwNzgsIDB4NTQyZCwgMHg2ODUzLCAweDAwNDUsIDB4MDA3OCwKKwkweDU0MmQsIDB4MmU2MCwgMHgyMDE5LCAweDAwMDIsIDB4NjAxNywgMHgwMDE0LCAweDEwNzgsIDB4OWRjNywKKwkweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwMDksIDB4MDAzZSwgMHgwMDc4LCAweDU0NTUsIDB4MjAwOSwKKwkweDAwMDQsIDB4MDA3OCwgMHg1NDU1LCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDU0NTUsIDB4MjAwOSwKKwkweDAwMTYsIDB4MDA3OCwgMHg1NDU1LCAweDIwMDksIDB4MDAwMSwgMHg2ODU0LCAweGEwODQsIDB4ZmYwMCwKKwkweGExMDUsIDB4Njg1NiwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0YTczLCAweDIwOTEsIDB4ODAwMSwKKwkweDAwN2MsIDB4MTA3OCwgMHgxM2E0LCAweDAwN2MsIDB4NzAyYywgMHg3MTMwLCAweDgxMDgsIDB4YTEwMiwKKwkweDAwNDgsIDB4NTQ3MSwgMHhhMDBlLCAweDcwMzQsIDB4NzA3MiwgMHg3MDM4LCAweDcwNzYsIDB4MDA3OCwKKwkweDU0N2QsIDB4NzA3MCwgMHhhMDgwLCAweDAwNDAsIDB4NzA3MiwgMHgwMGM4LCAweDU0N2QsIDB4NzA3NCwKKwkweGEwODEsIDB4MDAwMCwgMHg3MDc2LCAweGEwODUsIDB4MDAwMSwgMHg3OTMyLCAweDcxMzIsIDB4MDA3YywKKwkweDBkN2UsIDB4MTA3OCwgMHg1YjFlLCAweDBkN2YsIDB4MDA3YywgMHgwZDdlLCAweDIwMTEsIDB4MDAwNCwKKwkweDIyMDQsIDB4YTA4NSwgMHg4MDAyLCAweDIwMTIsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwZTEsIDB4MDAwMiwKKwkweDNkMDgsIDB4MjBlMSwgMHgyMDAwLCAweDNkMDAsIDB4YTA4NCwgMHg3MDAwLCAweDAwNDAsIDB4NTQ5YywKKwkweGEwODYsIDB4MTAwMCwgMHgwMGMwLCAweDU0ZDMsIDB4MjBlMSwgMHgwMDAwLCAweDNkMDAsIDB4YTA5NCwKKwkweGZmMDAsIDB4ODIxNywgMHhhMDg0LCAweGYwMDAsIDB4YTA4NiwgMHgzMDAwLCAweDAwYzAsIDB4NTRiNywKKwkweGExODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDU0ZDMsIDB4MTA3OCwKKwkweDI5YmIsIDB4MDBjMCwgMHg1NGQzLCAweDEwNzgsIDB4NTZiMiwgMHgwMDc4LCAweDU0Y2UsIDB4MjBlMSwKKwkweDAwMDQsIDB4M2Q2MCwgMHhkMWJjLCAweDAwYzAsIDB4NTRiZSwgMHgzZTYwLCAweGFjODQsIDB4MDAwZiwKKwkweDAwYzAsIDB4NTRkMywgMHhhYzgyLCAweGFkMDAsIDB4MDA0OCwgMHg1NGQzLCAweDY4NTgsIDB4YWMwMiwKKwkweDAwYzgsIDB4NTRkMywgMHgyMDA5LCAweDAwNDcsIDB4MTA3OCwgMHg3NzVjLCAweDdhMWMsIDB4ZDI4NCwKKwkweDAwYzAsIDB4NTQ4ZSwgMHgwMDdjLCAweGEwMTYsIDB4MTA3OCwgMHgxNWZhLCAweDAwNzgsIDB4NTRjZSwKKwkweDAwNzgsIDB4NTRkMywgMHg3ODFjLCAweGQwOGMsIDB4MDA0MCwgMHg1NTAyLCAweDE1N2UsIDB4MTM3ZSwKKwkweDE0N2UsIDB4MjBlMSwgMHgzMDAwLCAweDNkMjAsIDB4M2UyOCwgMHhhNTg0LCAweDAwNzYsIDB4MDBjMCwKKwkweDU1MTgsIDB4YTQ4NCwgMHg3MDAwLCAweGEwODYsIDB4MTAwMCwgMHgwMGMwLCAweDU1MDcsIDB4MTA3OCwKKwkweDU1NGUsIDB4MDA0MCwgMHg1NTE4LCAweDIwZTEsIDB4MzAwMCwgMHg3ODI4LCAweDc4MjgsIDB4MTA3OCwKKwkweDU1NmMsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MjAwOSwgMHhhOGI5LCAweDIxMDQsIDB4YTAwNSwKKwkweDAwYzAsIDB4NTUwMywgMHgwMDdjLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDU1MDIsIDB4YTQ4NCwKKwkweDcwMDAsIDB4MDBjMCwgMHg1NTE4LCAweDEwNzgsIDB4NTU0ZSwgMHgwMDQwLCAweDU1MmMsIDB4NzAwMCwKKwkweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDgxMDAsIDB4MDA0MCwgMHg1NGYzLCAweDAwNzgsIDB4NTUyYywKKwkweDEwNzgsIDB4YTU0ZiwgMHhkNWE0LCAweDAwNDAsIDB4NTUyOCwgMHgwNDdlLCAweDEwNzgsIDB4MWIyMiwKKwkweDA0N2YsIDB4MjBlMSwgMHg5MDEwLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwNzgsIDB4NTUzMCwKKwkweDEwNzgsIDB4NTU0ZSwgMHg2ODgzLCAweDAwMDAsIDB4MjBlMSwgMHgzMDAwLCAweDc4MjgsIDB4NzgyOCwKKwkweDEwNzgsIDB4NTUzNywgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwMDc4LCAweDU1MDIsIDB4MjAwMSwKKwkweGE2MGUsIDB4MjAwNCwgMHhkMDhjLCAweDAwNDAsIDB4NTU0ZCwgMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwKKwkweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDU1NGQsIDB4MDI3ZSwgMHgwMzdlLCAweDIwMTEsIDB4ODA0OCwKKwkweDI1MTgsIDB4MTA3OCwgMHgzNjFiLCAweDAzN2YsIDB4MDI3ZiwgMHgwMDdjLCAweGE0ODQsIDB4MDFmZiwKKwkweDY4ODIsIDB4YTAwNSwgMHgwMDQwLCAweDU1NjAsIDB4YTA4MCwgMHgwMDFmLCAweGEwODQsIDB4MDNmOCwKKwkweDgwYWMsIDB4MjBlMSwgMHgxMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4MDA3YywKKwkweDIwYTksIDB4MDAwYywgMHgyMGUxLCAweDEwMDAsIDB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDU1NWYsIDB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4YywKKwkweGYwMDAsIDB4ODAwNywgMHhhMTk2LCAweDAwMDAsIDB4MDBjMCwgMHg1NTc5LCAweDAwNzgsIDB4NTdiYSwKKwkweDAwN2MsIDB4YTE5NiwgMHgyMDAwLCAweDAwYzAsIDB4NTU4YSwgMHg2OTAwLCAweGExOGUsIDB4MDAwMSwKKwkweDAwYzAsIDB4NTU4NiwgMHgxMDc4LCAweDNhZWMsIDB4MDA3OCwgMHg1NTc4LCAweDEwNzgsIDB4NTU5MiwKKwkweDAwNzgsIDB4NTU3OCwgMHhhMTk2LCAweDgwMDAsIDB4MDBjMCwgMHg1NTc4LCAweDEwNzgsIDB4NTg3MSwKKwkweDAwNzgsIDB4NTU3OCwgMHgwYzdlLCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE5NiwKKwkweDAwMDEsIDB4MDA0MCwgMHg1NTlmLCAweGExOTYsIDB4MDAyMywgMHgwMGMwLCAweDU2YWEsIDB4YTA4ZSwKKwkweDAwMjMsIDB4MDBjMCwgMHg1NWQ0LCAweDEwNzgsIDB4NTkxZCwgMHgwMDQwLCAweDU2YWEsIDB4NzEyNCwKKwkweDYxMGEsIDB4NzAzMCwgMHhhMDhlLCAweDAyMDAsIDB4MDBjMCwgMHg1NWI4LCAweDcwMzQsIDB4YTAwNSwKKwkweDAwYzAsIDB4NTZhYSwgMHgyMDA5LCAweDAwMTUsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsIDB4NTZhYSwKKwkweGEwOGUsIDB4MDIxNCwgMHgwMDQwLCAweDU1YzAsIDB4YTA4ZSwgMHgwMjEwLCAweDAwYzAsIDB4NTVjNiwKKwkweDIwMDksIDB4MDAxNSwgMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwgMHg1NmFhLCAweGEwOGUsIDB4MDEwMCwKKwkweDAwYzAsIDB4NTZhYSwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NmFhLCAweDIwMDksIDB4MDAxNiwKKwkweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDU2YWEsIDB4YTA4ZSwgMHgwMDIyLCAweDAwYzAsIDB4NTZhYSwKKwkweDcwMzAsIDB4YTA4ZSwgMHgwMzAwLCAweDAwYzAsIDB4NTVlNSwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwKKwkweDU2YWEsIDB4MjAwOSwgMHgwMDE3LCAweDAwNzgsIDB4NTY3NiwgMHhhMDhlLCAweDA1MDAsIDB4MDBjMCwKKwkweDU1ZjEsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTZhYSwgMHgyMDA5LCAweDAwMTgsIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHgyMDEwLCAweDAwYzAsIDB4NTVmOSwgMHgyMDA5LCAweDAwMTksIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHgyMTEwLCAweDAwYzAsIDB4NTYwMSwgMHgyMDA5LCAweDAwMWEsIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHg1MjAwLCAweDAwYzAsIDB4NTYwZCwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwKKwkweDU2YWEsIDB4MjAwOSwgMHgwMDFiLCAweDAwNzgsIDB4NTY3NiwgMHhhMDhlLCAweDUwMDAsIDB4MDBjMCwKKwkweDU2MTksIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTZhYSwgMHgyMDA5LCAweDAwMWMsIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHgxMzAwLCAweDAwYzAsIDB4NTYyMSwgMHgyMDA5LCAweDAwMzQsIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHgxMjAwLCAweDAwYzAsIDB4NTYyZCwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwKKwkweDU2YWEsIDB4MjAwOSwgMHgwMDI0LCAweDAwNzgsIDB4NTY3NiwgMHhhMDhjLCAweGZmMDAsIDB4YTE4ZSwKKwkweDI0MDAsIDB4MDBjMCwgMHg1NjM3LCAweDIwMDksIDB4MDAyZCwgMHgwMDc4LCAweDU2NzYsIDB4YTA4YywKKwkweGZmMDAsIDB4YTE4ZSwgMHg1MzAwLCAweDAwYzAsIDB4NTY0MSwgMHgyMDA5LCAweDAwMmEsIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHgwZjAwLCAweDAwYzAsIDB4NTY0OSwgMHgyMDA5LCAweDAwMjAsIDB4MDA3OCwKKwkweDU2NzYsIDB4YTA4ZSwgMHg1MzAwLCAweDAwYzAsIDB4NTY0ZiwgMHgwMDc4LCAweDU2NmMsIDB4YTA4ZSwKKwkweDYxMDQsIDB4MDBjMCwgMHg1NjZjLCAweDIwMTEsIDB4YWI4ZCwgMHg4MjA4LCAweDIyMDQsIDB4YTA4MiwKKwkweDAwMDQsIDB4MjBhOCwgMHg5NWFjLCAweDk1YWMsIDB4MjAxMSwgMHg4MDE1LCAweDIxMWMsIDB4ODEwOCwKKwkweDA0N2UsIDB4MjEyNCwgMHgxMDc4LCAweDM2MWIsIDB4MDQ3ZiwgMHg4MTA4LCAweDAwZjAsIDB4NTY1YywKKwkweDIwMDksIDB4MDAyMywgMHgwMDc4LCAweDU2NzYsIDB4YTA4ZSwgMHg2MDAwLCAweDAwYzAsIDB4NTY3NCwKKwkweDIwMDksIDB4MDAzZiwgMHgwMDc4LCAweDU2NzYsIDB4MjAwOSwgMHgwMDFkLCAweDAxN2UsIDB4MjAxMSwKKwkweGFiODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MTA3OCwgMHgyNTRkLCAweDAwYzAsIDB4NTZhYywKKwkweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDU2YWMsIDB4NjYxMiwgMHg2NTE2LCAweDg2ZmYsIDB4MDA0MCwKKwkweDU2OWMsIDB4MDE3ZiwgMHgwMTdlLCAweGExODYsIDB4MDAxNywgMHgwMGMwLCAweDU2OWMsIDB4Njg2YywKKwkweGE2MDYsIDB4MDBjMCwgMHg1NjljLCAweDY4NzAsIDB4YTUwNiwgMHhhMDg0LCAweGZmMDAsIDB4MDBjMCwKKwkweDU2OWMsIDB4NjAwMCwgMHhjMGY1LCAweDYwMDIsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDA0MCwKKwkweDU2YWYsIDB4MDE3ZiwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDE3ZiwKKwkweDEwNzgsIDB4Nzc1YywgMHgwYzdmLCAweDAwN2MsIDB4MDE3ZiwgMHgwMDc4LCAweDU2YWEsIDB4MGM3ZiwKKwkweDAwNzgsIDB4NTZhYywgMHgwYzdlLCAweDEwNzgsIDB4NTcwZiwgMHgwMGMwLCAweDU3MGQsIDB4YTI4ZSwKKwkweDAwMzMsIDB4MDBjMCwgMHg1NmRlLCAweDEwNzgsIDB4NTkxZCwgMHgwMDQwLCAweDU3MGQsIDB4NzEyNCwKKwkweDYxMGEsIDB4NzAzMCwgMHhhMDhlLCAweDAyMDAsIDB4MDBjMCwgMHg1NmQwLCAweDcwMzQsIDB4YTAwNSwKKwkweDAwYzAsIDB4NTcwZCwgMHgyMDA5LCAweDAwMTUsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsIDB4NTcwZCwKKwkweGEwOGUsIDB4MDEwMCwgMHgwMGMwLCAweDU3MGQsIDB4NzAzNCwgMHhhMDA1LCAweDAwYzAsIDB4NTcwZCwKKwkweDIwMDksIDB4MDAxNiwgMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwgMHg1NzBkLCAweGEyOGUsIDB4MDAzMiwKKwkweDAwYzAsIDB4NTcwZCwgMHg3MDMwLCAweGEwOGUsIDB4MTQwMCwgMHgwMGMwLCAweDU3MGQsIDB4MjAwOSwKKwkweDAwMzgsIDB4MDE3ZSwgMHgyMDExLCAweGFiODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MTA3OCwKKwkweDI1NGQsIDB4MDBjMCwgMHg1NzBjLCAweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDU3MGMsIDB4NjYxMiwKKwkweDY1MTYsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDA0MCwgMHg1NzBiLCAweDAxN2YsIDB4NjExYSwKKwkweDYwMWYsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDE3ZiwgMHgxMDc4LCAweDc3NWMsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3OCwgMHg1NzBkLCAweDBjN2YsIDB4MDE3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGY3ZSwKKwkweDBkN2UsIDB4MDI3ZSwgMHgwMTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLCAweDNjMDAsIDB4MDA3ZSwKKwkweDIwNzksIDB4MDAzMCwgMHgyMDY5LCAweDAyMDAsIDB4MTA3OCwgMHgxYzZhLCAweDAwYzAsIDB4NTc1MCwKKwkweDEwNzgsIDB4MWI0MCwgMHgwMDQwLCAweDU3NWQsIDB4NzkwOCwgMHhhMThjLCAweDFmZmYsIDB4YTE4MiwKKwkweDAwMTEsIDB4MDBjOCwgMHg1NzVhLCAweDIwYTksIDB4MDAwYywgMHgyMGUxLCAweDAwMDAsIDB4MmVhMCwKKwkweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweDIwZTEsIDB4MjAwMCwgMHgyMDAxLCAweDAyMGEsIDB4MjAwNCwKKwkweDdhMGMsIDB4NzgwOCwgMHhhMDgwLCAweDAwMDcsIDB4YTA4NCwgMHgxZmY4LCAweGEwOGEsIDB4MDE0MCwKKwkweDEwYzgsIDB4MTMzMiwgMHg4MGFjLCAweDIwZTEsIDB4NjAwMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwKKwkweDIwZTEsIDB4NzAwMCwgMHg2ODI4LCAweDY4MjgsIDB4NzgwMywgMHgwMDA0LCAweGEyOTQsIDB4MDA3MCwKKwkweDAwN2YsIDB4MjBlMCwgMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MGQ3ZiwKKwkweDBmN2YsIDB4MDA3YywgMHhhMDE2LCAweDEwNzgsIDB4MTVmYSwgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwKKwkweDU3NTAsIDB4MDQ3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MjAyOCwgMHgyMTMwLCAweGE2OTYsIDB4MDBmZiwKKwkweDAwYzAsIDB4NTc4MiwgMHhhNTk2LCAweGZmZmQsIDB4MDBjMCwgMHg1NzcyLCAweDIwMDksIDB4MDA3ZiwKKwkweDAwNzgsIDB4NTdiNSwgMHhhNTk2LCAweGZmZmUsIDB4MDBjMCwgMHg1NzdhLCAweDIwMDksIDB4MDA3ZSwKKwkweDAwNzgsIDB4NTdiNSwgMHhhNTk2LCAweGZmZmMsIDB4MDBjMCwgMHg1NzgyLCAweDIwMDksIDB4MDA4MCwKKwkweDAwNzgsIDB4NTdiNSwgMHgyMDExLCAweDAwMDAsIDB4MjAyMSwgMHgwMDgxLCAweDIwYTksIDB4MDA3ZSwKKwkweDIwNzEsIDB4YTdiNiwgMHgyZTFjLCAweDgzZmYsIDB4MDBjMCwgMHg1Nzk0LCAweDgyZmYsIDB4MDBjMCwKKwkweDU3YTksIDB4MjQxMCwgMHgwMDc4LCAweDU3YTksIDB4MjM2OCwgMHg2ZjEwLCAweDAwN2UsIDB4MjEwMCwKKwkweGE3MDYsIDB4MDA3ZiwgMHg2YjE0LCAweDAwYzAsIDB4NTdhMywgMHhhMzQ2LCAweDAwYzAsIDB4NTdhMywKKwkweDI0MDgsIDB4MDA3OCwgMHg1N2I1LCAweDg3ZmYsIDB4MDBjMCwgMHg1N2E5LCAweDgzZmYsIDB4MDA0MCwKKwkweDU3OGUsIDB4ODQyMCwgMHg4ZTcwLCAweDAwZjAsIDB4NTc4YSwgMHg4MmZmLCAweDAwYzAsIDB4NTdiNCwKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDU3YjYsIDB4MjIwOCwgMHhhMDA2LCAweDBkN2YsIDB4MGU3ZiwKKwkweDA0N2YsIDB4MDA3YywgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHg1N2JmLCAweDAwN2MsIDB4NTdjNywKKwkweDU3YzcsIDB4NTdjNywgMHg1OTMzLCAweDU3YzcsIDB4NTdjOCwgMHg1N2UxLCAweDU4NTgsIDB4MDA3YywKKwkweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU3ZTAsIDB4NzEyMCwgMHgyMTYwLCAweGFjOGMsIDB4MDAwZiwKKwkweDAwYzAsIDB4NTdlMCwgMHhhYzhhLCAweGFkMDAsIDB4MDA0OCwgMHg1N2UwLCAweDY4NTgsIDB4YWMwMiwKKwkweDAwYzgsIDB4NTdlMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ2LCAweDEwNzgsIDB4Nzc1YywKKwkweDAwN2MsIDB4MGM3ZSwgMHhhNDg0LCAweDAxZmYsIDB4MDA0MCwgMHg1ODMzLCAweDcxMTAsIDB4ZDFiYywKKwkweDAwYzAsIDB4NTgzMywgMHgyMDExLCAweGFiODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MTA3OCwKKwkweDI1NGQsIDB4MDBjMCwgMHg1ODMzLCAweDEwNzgsIDB4NDU1YywgMHgwMGMwLCAweDU4MzMsIDB4NjYxMiwKKwkweDY1MTYsIDB4NjAwMCwgMHhkMGVjLCAweDAwYzAsIDB4NTgzMywgMHg2MjA0LCAweGEyOTQsIDB4ZmYwMCwKKwkweDgyMTcsIDB4YTI4NiwgMHgwMDA2LCAweDAwYzAsIDB4NTgxOCwgMHgwYzdlLCAweDEwNzgsIDB4NzZjNywKKwkweDAxN2YsIDB4MDA0MCwgMHg1ODM1LCAweDYxMWEsIDB4NjAxZiwgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwKKwkweDcxMzAsIDB4NjEyMiwgMHgyMDA5LCAweDAwNDQsIDB4MTA3OCwgMHg3NzVjLCAweDAwNzgsIDB4NTgzMywKKwkweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg1ODMzLCAweDYxMWEsIDB4NjAxZiwKKwkweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweGEyODYsIDB4MDAwNCwgMHgwMGMwLCAweDU4MmIsIDB4NjAwNywKKwkweDAwMDUsIDB4MDA3OCwgMHg1ODJkLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwKKwkweDVkZDcsIDB4MTA3OCwgMHg2MmQxLCAweDBjN2YsIDB4MDA3YywgMHgyMDAxLCAweGE2MGQsIDB4MjAwNCwKKwkweGQwZWMsIDB4MDA0MCwgMHg1ODNmLCAweDIwMTEsIDB4ODA0OSwgMHgxMDc4LCAweDM2MWIsIDB4MGM3ZSwKKwkweDEwNzgsIDB4OTE4NywgMHgwMTdmLCAweDAwNDAsIDB4NTgzMywgMHg2MTFhLCAweDYwMWYsIDB4MDAwNiwKKwkweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxMjIsIDB4NjAxMywgMHgwMzAwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDA0MSwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4NTgzMywKKwkweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU4NzAsIDB4NzAyMCwgMHgyMDYwLCAweGFjODQsIDB4MDAwZiwKKwkweDAwYzAsIDB4NTg3MCwgMHhhYzgyLCAweGFkMDAsIDB4MDA0OCwgMHg1ODcwLCAweDY4NTgsIDB4YWMwMiwKKwkweDAwYzgsIDB4NTg3MCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ1LCAweDEwNzgsIDB4Nzc1YywKKwkweDAwN2MsIDB4MDA3ZSwgMHgxMDc4LCAweDI5YmIsIDB4MDA3ZiwgMHgwMGMwLCAweDU4ODcsIDB4NzExMCwKKwkweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExOGUsIDB4MDAwMCwgMHgwMGMwLCAweDU4ODcsIDB4YTA4NCwKKwkweDAwMGYsIDB4YTA4YSwgMHgwMDA2LCAweDAwYzgsIDB4NTg4NywgMHgxMDc5LCAweDU4ODgsIDB4MDA3YywKKwkweDU4OGUsIDB4NTg4ZiwgMHg1ODhlLCAweDU4OGUsIDB4NThmZiwgMHg1OTBlLCAweDAwN2MsIDB4NzExMCwKKwkweGQxYmMsIDB4MDA0MCwgMHg1ODk3LCAweDcwMmMsIDB4ZDA4NCwgMHgwMDQwLCAweDU4ZmUsIDB4NzAwYywKKwkweDcxMDgsIDB4MTA3OCwgMHgyNTRkLCAweDAwYzAsIDB4NThmZSwgMHgxMDc4LCAweDQ1NWMsIDB4MDBjMCwKKwkweDU4ZmUsIDB4NjYxMiwgMHg2NTE2LCAweDYyMDQsIDB4NzExMCwgMHhkMWJjLCAweDAwNDAsIDB4NThjOSwKKwkweGEyOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDQsIDB4MDA0MCwgMHg1OGIyLCAweGExODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4NThlZiwgMHgwYzdlLCAweDEwNzgsIDB4NTkxZCwgMHgwYzdmLCAweDAwNDAsIDB4NThmZSwKKwkweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDAxN2YsIDB4MDA0MCwgMHg1OGZlLCAweDYxMWEsIDB4NjAxZiwKKwkweDAwMDIsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgxMDc4LCAweDc3NWMsIDB4MDA3OCwKKwkweDU4ZmUsIDB4YTI4YywgMHgwMGZmLCAweGExODYsIDB4MDAwNiwgMHgwMDQwLCAweDU4ZGUsIDB4YTE4NiwKKwkweDAwMDQsIDB4MDA0MCwgMHg1OGRlLCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweGEyODYsIDB4MDAwNCwKKwkweDAwNDAsIDB4NThkZSwgMHhhMjg2LCAweDAwMDYsIDB4MDBjMCwgMHg1OGVmLCAweDBjN2UsIDB4MTA3OCwKKwkweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDU4ZmUsIDB4NjExYSwgMHg2MDFmLCAweDAwMDUsIDB4NzEyMCwKKwkweDYxMGEsIDB4MjAwOSwgMHgwMDg4LCAweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDU4ZmUsIDB4MGM3ZSwKKwkweDEwNzgsIDB4NzZjNywgMHgwMTdmLCAweDAwNDAsIDB4NThmZSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwKKwkweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHg3NzVjLCAweDAwN2MsIDB4NzExMCwKKwkweGQxYmMsIDB4MDA0MCwgMHg1OTBkLCAweDEwNzgsIDB4NTkxZCwgMHgwMDQwLCAweDU5MGQsIDB4NzEyNCwKKwkweDYxMGEsIDB4MjAwOSwgMHgwMDg5LCAweDEwNzgsIDB4Nzc1YywgMHgwMDdjLCAweDcxMTAsIDB4ZDFiYywKKwkweDAwNDAsIDB4NTkxYywgMHgxMDc4LCAweDU5MWQsIDB4MDA0MCwgMHg1OTFjLCAweDcxMjQsIDB4NjEwYSwKKwkweDIwMDksIDB4MDA4YSwgMHgxMDc4LCAweDc3NWMsIDB4MDA3YywgMHg3MDIwLCAweDIwNjAsIDB4YWM4NCwKKwkweDAwMGYsIDB4MDBjMCwgMHg1OTMwLCAweGFjODIsIDB4YWQwMCwgMHgwMDQ4LCAweDU5MzAsIDB4MjAwMSwKKwkweGE2MTYsIDB4MjAwNCwgMHhhYzAyLCAweDAwYzgsIDB4NTkzMCwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywKKwkweGEwMDYsIDB4MDA3OCwgMHg1OTJmLCAweDcxMTAsIDB4ZDFiYywgMHgwMGMwLCAweDU5NDksIDB4NzAyNCwKKwkweDIwNjAsIDB4YWM4NCwgMHgwMDBmLCAweDAwYzAsIDB4NTk0OSwgMHhhYzgyLCAweGFkMDAsIDB4MDA0OCwKKwkweDU5NDksIDB4Njg1OCwgMHhhYzAyLCAweDAwYzgsIDB4NTk0OSwgMHgyMDA5LCAweDAwNTEsIDB4MTA3OCwKKwkweDc3NWMsIDB4MDA3YywgMHgyMDcxLCAweGE4YzQsIDB4NzAwMywgMHgwMDAzLCAweDcwMGYsIDB4MDM2MSwKKwkweGEwMDYsIDB4NzAxYSwgMHg3MDEyLCAweDcwMTcsIDB4YWQwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNiwKKwkweDcwMmIsIDB4NmUxYywgMHg3MDMyLCAweDcwMzcsIDB4NmU3MCwgMHg3MDNiLCAweDAwMDIsIDB4NzAzZiwKKwkweDAwMDAsIDB4NzA0MywgMHhmZmZmLCAweDcwNDcsIDB4ZmZmZiwgMHgwMDdjLCAweDIwNzEsIDB4YThjNCwKKwkweDAwZTAsIDB4NWEzMiwgMHgyMDkxLCAweDYwMDAsIDB4NzAwYywgMHg4MDAxLCAweDcwMGUsIDB4MDBjMCwKKwkweDU5ZGUsIDB4NzAwZiwgMHgwMzYxLCAweDcwMDcsIDB4MDAwMSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDcxMzgsIDB4ODEwOSwgMHg3MTNhLCAweDAwYzAsIDB4NTlkYywgMHg3MDNiLCAweDAwMDIsIDB4MjAwOSwKKwkweDAxMDAsIDB4MjEwNCwgMHhhMDgyLCAweDAwMDMsIDB4MDBjOCwgMHg1OWRjLCAweDcwM2MsIDB4YTA4NiwKKwkweDAwMDEsIDB4MDBjMCwgMHg1OWI5LCAweDBkN2UsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDQsIDB4YTA4NCwKKwkweDQwMDAsIDB4MDA0MCwgMHg1OTk3LCAweDY4MDMsIDB4MTAwMCwgMHgwMDc4LCAweDU5OWUsIDB4NjgwNCwKKwkweGEwODQsIDB4MTAwMCwgMHgwMDQwLCAweDU5OWUsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwKKwkweDcwM2YsIDB4MDAwMCwgMHgyMDY5LCAweGE4YjEsIDB4NjgwNCwgMHhhMDgyLCAweDAwMDYsIDB4MDBjMCwKKwkweDU5YWIsIDB4NjgwNywgMHgwMDAwLCAweDY4MzAsIDB4YTA4MiwgMHgwMDAzLCAweDAwYzAsIDB4NTliMiwKKwkweDY4MzMsIDB4MDAwMCwgMHgxMDc4LCAweDYyZDEsIDB4MTA3OCwgMHg2MzliLCAweDBkN2YsIDB4MDA3OCwKKwkweDU5ZGMsIDB4MGQ3ZSwgMHgyMDY5LCAweGE2MDAsIDB4Njk0OCwgMHg2ODY0LCAweGExMDIsIDB4MDBjOCwKKwkweDU5ZGIsIDB4MjA2OSwgMHhhOGIxLCAweDY4MDQsIDB4YTA4NiwgMHgwMDAwLCAweDAwYzAsIDB4NTlkYiwKKwkweDY4MzAsIDB4YTA4NiwgMHgwMDAwLCAweDAwYzAsIDB4NTlkYiwgMHg3MDNmLCAweDAwMDEsIDB4NjgwNywKKwkweDAwMDYsIDB4NjgzMywgMHgwMDAzLCAweDIwNjksIDB4MDEwMCwgMHg2ODMwLCAweDY4OWUsIDB4MjA2OSwKKwkweDAxNDAsIDB4NjgwMywgMHgwNjAwLCAweDBkN2YsIDB4MDA3OCwgMHg1OWUxLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzAyNCwgMHhhMDBkLCAweDAwNDAsIDB4NTlmOSwgMHg3MDIwLCAweDgwMDEsIDB4NzAyMiwKKwkweDAwYzAsIDB4NTlmOSwgMHg3MDIzLCAweDAwMDksIDB4ODEwOSwgMHg3MTI2LCAweGExODYsIDB4MDNlOCwKKwkweDAwYzAsIDB4NTlmNCwgMHg3MDI4LCAweDEwN2EsIDB4ODFmZiwgMHgwMGMwLCAweDU5ZjksIDB4NzAyOCwKKwkweDEwN2EsIDB4NzAzMCwgMHhhMDBkLCAweDAwNDAsIDB4NWExMCwgMHg3MDJjLCAweDgwMDEsIDB4NzAyZSwKKwkweDAwYzAsIDB4NWExMCwgMHg3MDJmLCAweDAwMDksIDB4ODEwOSwgMHg3MTMyLCAweDAwNDAsIDB4NWEwZSwKKwkweGExODQsIDB4MDA3ZiwgMHgxMDQwLCAweDZlYTIsIDB4MDA3OCwgMHg1YTEwLCAweDcwMzQsIDB4MTA3YSwKKwkweDcwNDAsIDB4YTAwNSwgMHgwMDQwLCAweDVhMTgsIDB4MDA1MCwgMHg1YTE4LCAweDgwMDEsIDB4NzA0MiwKKwkweDcwNDQsIDB4YTAwNSwgMHgwMDQwLCAweDVhMjAsIDB4MDA1MCwgMHg1YTIwLCAweDgwMDEsIDB4NzA0NiwKKwkweDcwMTgsIDB4YTAwZCwgMHgwMDQwLCAweDVhMzEsIDB4NzAwOCwgMHg4MDAxLCAweDcwMGEsIDB4MDBjMCwKKwkweDVhMzEsIDB4NzAwYiwgMHgwMDA5LCAweDgxMDksIDB4NzExYSwgMHgwMGMwLCAweDVhMzEsIDB4NzAxYywKKwkweDEwN2EsIDB4MTI3ZiwgMHg3MDA0LCAweDAwNzksIDB4NWEzNSwgMHg1YTVjLCAweDVhNWQsIDB4NWE3OSwKKwkweDBlN2UsIDB4MjA3MSwgMHhhOGM0LCAweDcwMTgsIDB4YTAwNSwgMHgwMGMwLCAweDVhNDMsIDB4NzExYSwKKwkweDcyMWUsIDB4NzAwYiwgMHgwMDA5LCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDAwN2UsIDB4MjA3MSwKKwkweGE4YzQsIDB4NzAxYywgMHhhMjA2LCAweDAwYzAsIDB4NWE0ZiwgMHg3MDFhLCAweDcwMWUsIDB4MDA3ZiwKKwkweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YThjNCwgMHg2MDg4LCAweGExMDIsIDB4MDA0OCwKKwkweDVhNWEsIDB4NjE4YSwgMHgwZTdmLCAweDAwN2MsIDB4MDA3YywgMHg3MTEwLCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4NWE2ZiwgMHg2MDg4LCAweDgwMDEsIDB4MDA0OCwgMHg1YTZmLCAweDYwOGEsIDB4MDBjMCwKKwkweDVhNmYsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg2MmQxLCAweDEyN2YsIDB4ODEwOCwKKwkweGExODIsIDB4MDBmZiwgMHgwMDQ4LCAweDVhNzcsIDB4YTAwZSwgMHg3MDA3LCAweDAwMDIsIDB4NzExMiwKKwkweDAwN2MsIDB4NzAxNCwgMHgyMDYwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwM2MsIDB4YTAwNSwKKwkweDAwNDAsIDB4NWE4OCwgMHg4MDAxLCAweDYwM2UsIDB4MDBjMCwgMHg1YTg4LCAweDEwNzgsIDB4OGY5YywKKwkweDYwMTQsIDB4YTAwNSwgMHgwMDQwLCAweDVhYjIsIDB4ODAwMSwgMHg2MDE2LCAweDAwYzAsIDB4NWFiMiwKKwkweDYxMWMsIDB4YTE4NiwgMHgwMDAzLCAweDAwNDAsIDB4NWE5OSwgMHhhMTg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDVhYjAsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTQsIDB4YTA4YSwgMHgxOTlhLCAweDAwNDgsIDB4NWFiMCwKKwkweGEwODIsIDB4MTk5OSwgMHg2ODU2LCAweGEwOGEsIDB4MTk5YSwgMHgwMDQ4LCAweDVhYTksIDB4MjAwMSwKKwkweDE5OTksIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LCAweDAwNzgsIDB4NWFiMiwKKwkweDEwNzgsIDB4OGFiZSwgMHgxMjdmLCAweGFjODgsIDB4MDAxMCwgMHg3MTE2LCAweDIwMDEsIDB4Y2QwMCwKKwkweGExMDIsIDB4MDA0OCwgMHg1YWJmLCAweDcwMTcsIDB4YWQwMCwgMHg3MDA3LCAweDAwMDAsIDB4MDA3YywKKwkweDBlN2UsIDB4MjA3MSwgMHhhOGM0LCAweDcwMjcsIDB4MDdkMCwgMHg3MDIzLCAweDAwMDksIDB4NzAzYiwKKwkweDAwMDIsIDB4MGU3ZiwgMHgwMDdjLCAweDIwMDEsIDB4YThjZCwgMHgyMDAzLCAweDAwMDAsIDB4MDA3YywKKwkweDBlN2UsIDB4MjA3MSwgMHhhOGM0LCAweDcxMzIsIDB4NzAyZiwgMHgwMDA5LCAweDBlN2YsIDB4MDA3YywKKwkweDIwMTEsIDB4YThkMCwgMHgyMDEzLCAweDAwMDAsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YThjNCwKKwkweDcxMWEsIDB4NzIxZSwgMHg3MDBiLCAweDAwMDksIDB4MGU3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MGU3ZSwKKwkweDBmN2UsIDB4MjA3OSwgMHhhNjAwLCAweDdhMzQsIDB4ZDI5NCwgMHgwMDQwLCAweDViMTUsIDB4MjA3MSwKKwkweGE4YWMsIDB4MmUxNCwgMHhhMGZlLCAweDAwMDAsIDB4MDA0MCwgMHg1YjAyLCAweGEwZmUsIDB4MDAwMSwKKwkweDAwNDAsIDB4NWIwNiwgMHhhMGZlLCAweDAwMDIsIDB4MDBjMCwgMHg1YjExLCAweGEyOTIsIDB4MDA4NSwKKwkweDAwNzgsIDB4NWIwOCwgMHhhMjkyLCAweDAwMDUsIDB4MDA3OCwgMHg1YjA4LCAweGEyOTIsIDB4MDAwMiwKKwkweDIyNzIsIDB4MDA0MCwgMHg1YjBkLCAweDAwYzgsIDB4NWIxNSwgMHgyMDExLCAweDgwMzcsIDB4MTA3OCwKKwkweDM2MWIsIDB4MjAxMSwgMHhhOGFiLCAweDIyMDQsIDB4MjA3MiwgMHgwZjdmLCAweDBlN2YsIDB4MDI3ZiwKKwkweDAwN2MsIDB4MGM3ZSwgMHgyMDYxLCAweGE5MzMsIDB4MGM3ZiwgMHgwMDdjLCAweGExODQsIDB4MDAwZiwKKwkweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4YTkzMywgMHgyMDYwLCAweDAwN2MsIDB4Njg1NCwKKwkweGEwOGEsIDB4MTk5YSwgMHgwMDQ4LCAweDViMmUsIDB4MjAwMSwgMHgxOTk5LCAweGEwMDUsIDB4MDBjMCwKKwkweDViM2QsIDB4MGM3ZSwgMHgyMDYxLCAweGE5MzMsIDB4NjAxNCwgMHgwYzdmLCAweGEwMDUsIDB4MDBjMCwKKwkweDViNDIsIDB4MjAwMSwgMHgwMDFlLCAweDAwNzgsIDB4NWI0MiwgMHhhMDhlLCAweGZmZmYsIDB4MDBjMCwKKwkweDViNDIsIDB4YTAwNiwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDYxMTYsIDB4Njg0YywKKwkweGEwOGMsIDB4MDBjMCwgMHhhMThlLCAweDAwYzAsIDB4MDA0MCwgMHg1YjllLCAweGQwYjQsIDB4MDBjMCwKKwkweDViNTksIDB4ZDBiYywgMHgwMGMwLCAweDViOGIsIDB4MjAwOSwgMHgwMDA2LCAweDEwNzgsIDB4NWJjMywKKwkweDAwN2MsIDB4ZDBmYywgMHgwMDQwLCAweDViNjQsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4NWI2NCwKKwkweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDViYmMsIDB4NjAyNCwgMHhkMGQ0LCAweDAwNDAsIDB4NWI2ZSwKKwkweGMwZDQsIDB4NjAyNiwgMHg2ODYwLCAweDYwMmEsIDB4Njg1YywgMHg2MDJlLCAweDIwMDksIDB4YTY3NCwKKwkweDIxMDQsIDB4ZDA4NCwgMHgwMDQwLCAweDViODMsIDB4NjExOCwgMHhhMTg4LCAweDAwMjcsIDB4MjEwNCwKKwkweGQwOGMsIDB4MDBjMCwgMHg1YjgzLCAweDg3ZmYsIDB4MDBjMCwgMHg1YjgyLCAweDIwMDksIDB4MDA0MiwKKwkweDEwNzgsIDB4Nzc1YywgMHgwMDdjLCAweDg3ZmYsIDB4MDBjMCwgMHg1YjhhLCAweDIwMDksIDB4MDA0MywKKwkweDEwNzgsIDB4Nzc1YywgMHgwMDdjLCAweGQwZmMsIDB4MDA0MCwgMHg1Yjk2LCAweGEwODQsIDB4MDAwMywKKwkweDAwNDAsIDB4NWI5NiwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1YmJjLCAweDg3ZmYsIDB4MDBjMCwKKwkweDViOWQsIDB4MjAwOSwgMHgwMDQyLCAweDEwNzgsIDB4Nzc1YywgMHgwMDdjLCAweGQwZmMsIDB4MDA0MCwKKwkweDViYWYsIDB4YTA4NCwgMHgwMDAzLCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLCAweDViYjMsIDB4ODdmZiwKKwkweDAwYzAsIDB4NWJhZSwgMHgyMDA5LCAweDAwNDEsIDB4MTA3OCwgMHg3NzVjLCAweDAwN2MsIDB4MTA3OCwKKwkweDViYzEsIDB4MDA3OCwgMHg1YmFlLCAweDg3ZmYsIDB4MDBjMCwgMHg1YmFlLCAweDIwMDksIDB4MDA0MywKKwkweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDViYWUsIDB4MjAwOSwgMHgwMDA0LCAweDEwNzgsIDB4NWJjMywKKwkweDAwN2MsIDB4MjAwOSwgMHgwMDAxLCAweDBkN2UsIDB4NjAxMCwgMHhhMGVjLCAweGYwMDAsIDB4MDA0MCwKKwkweDViZWYsIDB4MjA2OCwgMHg2OTUyLCAweDY4MDAsIDB4NjAxMiwgMHhhMTg2LCAweDAwMDEsIDB4MDBjMCwKKwkweDViZTUsIDB4Njk0YywgMHhhMThjLCAweDgxMDAsIDB4YTE4ZSwgMHg4MTAwLCAweDAwYzAsIDB4NWJlNSwKKwkweDBjN2UsIDB4MjA2MSwgMHhhOTMzLCAweDYyMDAsIDB4ZDI4YywgMHgwMGMwLCAweDViZTQsIDB4NjIwNCwKKwkweDgyMTAsIDB4MDA0OCwgMHg1YmU0LCAweDYyMDYsIDB4MGM3ZiwgMHgxMDc4LCAweDRhNzMsIDB4NjAxMCwKKwkweGEwNmQsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTBjMCwgMHg1YjI3LCAweDA3N2YsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MTU3ZSwgMHgwYzdlLCAweDIwNjEsIDB4YTkzMywgMHg2MDAwLCAweDgxZmYsIDB4MDA0MCwKKwkweDViZmMsIDB4YTIwNSwgMHgwMDc4LCAweDViZmQsIDB4YTIwNCwgMHg2MDAyLCAweDBjN2YsIDB4MTU3ZiwKKwkweDAwN2MsIDB4NjgwMCwgMHhkMDhjLCAweDAwYzAsIDB4NWMwZCwgMHg2ODA4LCAweGEwMDUsIDB4MDA0MCwKKwkweDVjMGQsIDB4ODAwMSwgMHg2ODBhLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDIwYTksIDB4MDAxMCwKKwkweGEwMDYsIDB4ODAwNCwgMHg4MDg2LCAweDgxOGUsIDB4MDBjOCwgMHg1YzE3LCAweGEyMDAsIDB4MDBmMCwKKwkweDVjMTIsIDB4ODA4NiwgMHg4MThlLCAweDAwN2MsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNSwKKwkweDAwNDAsIDB4NWMzZCwgMHhhMTFhLCAweDAwYzgsIDB4NWMzZCwgMHg4MjEzLCAweDgxOGQsIDB4MDA0OCwKKwkweDVjMzAsIDB4YTExYSwgMHgwMGM4LCAweDVjMzEsIDB4MDBmMCwgMHg1YzI1LCAweDAwNzgsIDB4NWMzNSwKKwkweGExMWEsIDB4MjMwOCwgMHg4MjEwLCAweDAwZjAsIDB4NWMyNSwgMHgwMDdlLCAweDMyMDAsIDB4YTA4NCwKKwkweGY3ZmYsIDB4MjA4MCwgMHgwMDdmLCAweDE1N2YsIDB4MDA3YywgMHgwMDdlLCAweDMyMDAsIDB4YTA4NSwKKwkweDA4MDAsIDB4MDA3OCwgMHg1YzM5LCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksIDB4YThiMSwKKwkweDEyN2YsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4YjEsIDB4NjgwMywgMHgwMDA1LCAweDIwNjksIDB4MDAwNCwKKwkweDJkMDQsIDB4YTA4NSwgMHg4MDAxLCAweDIwNmEsIDB4MGQ3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NjAyNywKKwkweDAwMDEsIDB4NzgwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHg1YzVlLCAweDVjNjgsIDB4NWM4ZCwKKwkweDVjZTgsIDB4NWM2ZSwgMHg1YzhkLCAweDVjNjgsIDB4NWM2NiwgMHg1YzY2LCAweDEwNzgsIDB4MTMzMiwKKwkweDEwNzgsIDB4NWFjYiwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZiwgMHgwMDdjLCAweDYyYzAsIDB4ODJmZiwKKwkweDAwYzAsIDB4NWM3NCwgMHgwYzdmLCAweDAwN2MsIDB4MjAxMSwgMHg0MWRjLCAweDEwNzgsIDB4NWE0NSwKKwkweDc4MjgsIDB4YTA5MiwgMHgwMGM4LCAweDAwYzgsIDB4NWM4MywgMHg4MDAwLCAweDc4MmEsIDB4MTA3OCwKKwkweDQyMWIsIDB4MDA3OCwgMHg1YzcyLCAweDEwNzgsIDB4NDFkYywgMHg3ODA3LCAweDAwMDMsIDB4NzgyNywKKwkweDAwMDAsIDB4NzgyYiwgMHgwMDAwLCAweDAwNzgsIDB4NWM3MiwgMHgxMDc4LCAweDVhY2IsIDB4M2MwMCwKKwkweDAwN2UsIDB4MjAxMSwgMHgwMjA5LCAweDIwZTEsIDB4NDAwMCwgMHgyMjE0LCAweDAwN2YsIDB4MjBlMCwKKwkweDgyZmYsIDB4MDA0MCwgMHg1Y2FiLCAweDYyYzAsIDB4ODJmZiwgMHgwMGMwLCAweDVjYWIsIDB4NzgyYiwKKwkweDAwMDAsIDB4NzgyNCwgMHhhMDY1LCAweDEwNDAsIDB4MTMzMiwgMHgyMDA5LCAweDAwMTMsIDB4MTA3OCwKKwkweDc3NWMsIDB4MGM3ZiwgMHgwMDdjLCAweDM5MDAsIDB4YTA4MiwgMHhhOWUzLCAweDAwYzgsIDB4NWNiMiwKKwkweDEwNzgsIDB4NzQ3YSwgMHgwYzdlLCAweDc4MjQsIDB4YTA2NSwgMHgxMDQwLCAweDEzMzIsIDB4NzgwNCwKKwkweGEwODYsIDB4MDAwNCwgMHgwMDQwLCAweDVkMmQsIDB4NzgyOCwgMHhhMDkyLCAweDI3MTAsIDB4MDBjOCwKKwkweDVjYzgsIDB4ODAwMCwgMHg3ODJhLCAweDBjN2YsIDB4MTA3OCwgMHg2ZTAxLCAweDAwNzgsIDB4NWNhOSwKKwkweDYxMDQsIDB4YTE4NiwgMHgwMDAzLCAweDAwYzAsIDB4NWNkZiwgMHgwZTdlLCAweDIwNzEsIDB4YTYwMCwKKwkweDcwZDgsIDB4MGU3ZiwgMHhkMDhjLCAweDAwNDAsIDB4NWNkZiwgMHgwYzdlLCAweDBlN2UsIDB4MjA2MSwKKwkweDAxMDAsIDB4MjA3MSwgMHhhNjAwLCAweDEwNzgsIDB4NDIyNCwgMHgwZTdmLCAweDBjN2YsIDB4MTA3OCwKKwkweGE1YzQsIDB4MjAwOSwgMHgwMDE0LCAweDEwNzgsIDB4Nzc1YywgMHgwYzdmLCAweDAwNzgsIDB4NWNhOSwKKwkweDIwMDEsIDB4YThjZCwgMHgyMDAzLCAweDAwMDAsIDB4NjJjMCwgMHg4MmZmLCAweDAwYzAsIDB4NWNmYywKKwkweDc4MmIsIDB4MDAwMCwgMHg3ODI0LCAweGEwNjUsIDB4MTA0MCwgMHgxMzMyLCAweDIwMDksIDB4MDAxMywKKwkweDEwNzgsIDB4NzdiMywgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLCAweDM5MDAsIDB4YTA4MiwKKwkweGE5ZTMsIDB4MDBjOCwgMHg1ZDA1LCAweDEwNzgsIDB4NzQ3YSwgMHg3ODI0LCAweGEwMDUsIDB4MTA0MCwKKwkweDEzMzIsIDB4NzgxYywgMHhhMDZkLCAweDEwNDAsIDB4MTMzMiwgMHg2ODAwLCAweGMwZGMsIDB4NjgwMiwKKwkweDc5MjQsIDB4MjE2MCwgMHgxMDc4LCAweDc3MmQsIDB4NjkzYywgMHg4MWZmLCAweDEwNDAsIDB4MTMzMiwKKwkweDgxMDksIDB4NjkzZSwgMHg2ODU0LCAweGEwMTUsIDB4MDA0MCwgMHg1ZDIxLCAweDdhMWUsIDB4MDA3OCwKKwkweDVkMjMsIDB4NzkxOCwgMHg3OTFlLCAweDc4MDcsIDB4MDAwMCwgMHg3ODI3LCAweDAwMDAsIDB4MGQ3ZiwKKwkweDBjN2YsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4NWNmYSwgMHg2MTA0LCAweGExODYsIDB4MDAwMiwKKwkweDAwNDAsIDB4NWQzOCwgMHhhMTg2LCAweDAwMDQsIDB4MDA0MCwgMHg1ZDM4LCAweDAwNzgsIDB4NWNiYywKKwkweDc4MDgsIDB4YWMwNiwgMHgwMDQwLCAweDVjYmMsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4NWRkNywKKwkweDBjN2YsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4NWNhOSwgMHgwYzdlLCAweDYwMjcsIDB4MDAwMiwKKwkweDYyYzgsIDB4ODJmZiwgMHgwMGMwLCAweDVkNjEsIDB4NjJjNCwgMHg4MmZmLCAweDAwYzAsIDB4NWQ2MSwKKwkweDc5M2MsIDB4YTFlNSwgMHgwMDAwLCAweDAwNDAsIDB4NWQ1YiwgMHgyMDA5LCAweDAwNDksIDB4MTA3OCwKKwkweDc3NWMsIDB4MGM3ZiwgMHgwMDdjLCAweDIwMTEsIDB4YThkMCwgMHgyMDEzLCAweDAwMDAsIDB4MDA3OCwKKwkweDVkNTksIDB4MzkwOCwgMHhhMTkyLCAweGE5ZTMsIDB4MDBjOCwgMHg1ZDY4LCAweDEwNzgsIDB4NzQ3YSwKKwkweDYwMTcsIDB4MDAxMCwgMHg3OTNjLCAweDgxZmYsIDB4MDA0MCwgMHg1ZDViLCAweDc5NDQsIDB4YTE5MiwKKwkweDc1MzAsIDB4MDBjOCwgMHg1ZDg1LCAweDgxMDgsIDB4Nzk0NiwgMHg3OTNjLCAweGExODgsIDB4MDAwNywKKwkweDIxMGMsIDB4YTE4ZSwgMHgwMDA2LCAweDAwYzAsIDB4NWQ4MSwgMHg2MDE3LCAweDAwMTIsIDB4MDA3OCwKKwkweDVkNTksIDB4NjAxNywgMHgwMDE2LCAweDAwNzgsIDB4NWQ1OSwgMHg3ODQ4LCAweGMwODUsIDB4Nzg0YSwKKwkweDAwNzgsIDB4NWQ1OSwgMHgwMDdlLCAweDAxN2UsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDYwMGYsIDB4MDAwMCwgMHgyYzA4LCAweDIwNjEsIDB4YThiMSwgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwKKwkweDYwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDVkYTUsIDB4YTA4MCwgMHgwMDAzLCAweDIxMDIsIDB4NjExMiwKKwkweDEyN2YsIDB4MGM3ZiwgMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHg2MTE2LCAweDYxMTIsIDB4MDA3OCwKKwkweDVkYTAsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4YjEsIDB4NjAwMCwgMHhkMGQ0LCAweDAwNDAsIDB4NWRiZSwKKwkweDY4MjAsIDB4ODAwMCwgMHg2ODIyLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDVkYjksIDB4MmMwMCwKKwkweDY4MWUsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHg2MmQ5LCAweGMwZDUsIDB4NjAwMiwKKwkweDY4MTgsIDB4YTAwNSwgMHgwMDQwLCAweDVkZDAsIDB4NjA1NiwgMHg2MDViLCAweDAwMDAsIDB4MDA3ZSwKKwkweDJjMDAsIDB4NjgxYSwgMHgwZDdmLCAweDY4NWEsIDB4MjA2OSwgMHhhOGIxLCAweDAwNzgsIDB4NWRiMCwKKwkweDYwNTYsIDB4NjA1YSwgMHgyYzAwLCAweDY4MWEsIDB4NjgxZSwgMHgwMDc4LCAweDVkYjAsIDB4MDA3ZSwKKwkweDAxN2UsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwKKwkweDIwNjEsIDB4YThiMSwgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDA4LCAweGEwMDUsIDB4MDA0MCwKKwkweDVkZjIsIDB4YTA4MCwgMHgwMDAzLCAweDIxMDIsIDB4NjEwYSwgMHgxMjdmLCAweDBjN2YsIDB4MDE3ZiwKKwkweDAwN2YsIDB4MDA3YywgMHg2MTBlLCAweDYxMGEsIDB4MDA3OCwgMHg1ZGVkLCAweDBjN2UsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweGE4YjEsIDB4NjAzNCwgMHhhMDA1LCAweDAwNDAsIDB4NWUwNiwKKwkweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMzYsIDB4MGM3ZiwgMHgwMDdjLCAweDYxM2EsIDB4NjEzNiwKKwkweDAwNzgsIDB4NWUwNCwgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDU3ZSwKKwkweDAzN2UsIDB4MDI3ZSwgMHgwMTdlLCAweDAwN2UsIDB4MTI3ZSwgMHhhMDJlLCAweDIwNzEsIDB4YThiMSwKKwkweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLCAweDAwNDAsIDB4NWU4YywKKwkweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgwMGMwLCAweDVlODcsIDB4ODdmZiwKKwkweDAwNDAsIDB4NWUyZSwgMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHg1ZTg3LCAweDcwM2MsIDB4YWMwNiwKKwkweDAwYzAsIDB4NWU0NCwgMHgwMzdlLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LCAweDcwNTgsIDB4NzAzMywKKwkweDAwMDAsIDB4NzAzZiwgMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDQ3LCAweDAwMDAsIDB4NzA0YiwKKwkweDAwMDAsIDB4MDM3ZiwgMHgyMDI5LCAweDAwMDEsIDB4NzAzOCwgMHhhYzM2LCAweDAwYzAsIDB4NWU0YSwKKwkweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweGFjMzYsIDB4MDBjMCwgMHg1ZTU4LCAweDJjMDAsIDB4YWYzNiwKKwkweDAwNDAsIDB4NWU1NiwgMHgyZjAwLCAweDcwMzYsIDB4MDA3OCwgMHg1ZTU4LCAweDcwMzcsIDB4MDAwMCwKKwkweDY2MGMsIDB4MDY3ZSwgMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg1ZTYxLCAweDdlMGUsIDB4MDA3OCwKKwkweDVlNjIsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4NWU4MiwKKwkweDYwMTAsIDB4MjA2OCwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDVlOWQsIDB4NjgzNywKKwkweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDE3ZSwgMHgwMzdlLCAweDA3N2UsIDB4MTA3OCwKKwkweDhmN2QsIDB4MTA3OCwgMHhhNGUyLCAweDEwNzgsIDB4NGE3MywgMHgwNzdmLCAweDAzN2YsIDB4MDE3ZiwKKwkweDEwNzgsIDB4OGViOSwgMHgxMDc4LCAweDhlYzYsIDB4MGM3ZiwgMHgwMDc4LCAweDVlMWQsIDB4MmM3OCwKKwkweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDVlMWQsIDB4ODVmZiwgMHgwMDQwLCAweDVlOTEsIDB4MTA3OCwKKwkweDYzOWIsIDB4MTI3ZiwgMHgwMDdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwMzdmLCAweDA1N2YsIDB4MDY3ZiwKKwkweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4NWU2ZiwgMHgwMTdlLCAweDAzN2UsIDB4MDc3ZSwgMHgxMDc4LCAweGE0ZTIsIDB4MTA3OCwKKwkweGExY2EsIDB4MDc3ZiwgMHgwMzdmLCAweDAxN2YsIDB4MDA3OCwgMHg1ZTgyLCAweDAwN2UsIDB4MDY3ZSwKKwkweDBjN2UsIDB4MGQ3ZSwgMHgwZjdlLCAweDIwMzEsIDB4MDAwMCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzksIDB4YThiMSwgMHg3ODM4LCAweGEwNjUsIDB4MDA0MCwgMHg1ZWVmLCAweDYwMGMsIDB4MDA3ZSwKKwkweDYwMGYsIDB4MDAwMCwgMHg3ODNjLCAweGFjMDYsIDB4MDBjMCwgMHg1ZWQ2LCAweDAzN2UsIDB4MjAxOSwKKwkweDAwMDEsIDB4MTA3OCwgMHg3MDU4LCAweDc4MzMsIDB4MDAwMCwgMHg3ODNmLCAweDAwMDAsIDB4Nzg0MywKKwkweDAwMDAsIDB4Nzg0NywgMHgwMDAwLCAweDc4NGIsIDB4MDAwMCwgMHgwMzdmLCAweDEwNzgsIDB4OGQwNiwKKwkweDAwNDAsIDB4NWVlYSwgMHg2MDEwLCAweDIwNjgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwKKwkweDVlZjgsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4NGE3MywKKwkweDEwNzgsIDB4OGViOSwgMHgxMDc4LCAweDhlYzYsIDB4MDA3ZiwgMHgwMDc4LCAweDVlYmIsIDB4N2UzYSwKKwkweDdlMzYsIDB4MTI3ZiwgMHgwZjdmLCAweDBkN2YsIDB4MGM3ZiwgMHgwNjdmLCAweDAwN2YsIDB4MDA3YywKKwkweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NWVlMSwgMHgxMDc4LCAweGExY2EsIDB4MDA3OCwKKwkweDVlZWEsIDB4MDE3ZSwgMHgwMjdlLCAweDA4N2UsIDB4MjA0MSwgMHgwMDAwLCAweDEwNzgsIDB4NWYxYiwKKwkweDEwNzgsIDB4NWZkYiwgMHgwODdmLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MTI3ZSwKKwkweDIwNzksIDB4YThiMSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg2MDc2LCAweDEwNzgsIDB4NjBlYywKKwkweDEyN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MDY3ZSwKKwkweDAxN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE4YjEsIDB4NzYxNCwKKwkweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsIDB4NWZiNSwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4YTIwNiwgMHgwMGMwLCAweDVmYjAsIDB4ODhmZiwgMHgwMDQwLCAweDVmM2IsIDB4NjAyMCwKKwkweGExMDYsIDB4MDBjMCwgMHg1ZmIwLCAweDcwMjQsIDB4YWMwNiwgMHgwMGMwLCAweDVmNmIsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4NWY2NiwgMHgxMDc4LCAweDVhY2IsIDB4MTA3OCwKKwkweDZlMGYsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzM3OCwgMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwKKwkweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDVmNWIsIDB4NjgwMywKKwkweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwKKwkweDVmNjMsIDB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4MDA3OCwgMHg1ZjZiLCAweDYwMDMsIDB4MDAwOSwKKwkweDYzMGEsIDB4MDA3OCwgMHg1ZmIwLCAweDcwMTQsIDB4YWMzNiwgMHgwMGMwLCAweDVmNzEsIDB4NjYwYywKKwkweDc2MTYsIDB4NzAxMCwgMHhhYzM2LCAweDAwYzAsIDB4NWY3ZiwgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwKKwkweDVmN2QsIDB4MmYwMCwgMHg3MDEyLCAweDAwNzgsIDB4NWY3ZiwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywKKwkweDA2N2UsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsIDB4NWY4OCwgMHg3ZTBlLCAweDAwNzgsIDB4NWY4OSwKKwkweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwKKwkweDVmYTksIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1ZmJlLCAweDY4MzcsIDB4MDEwMywKKwkweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDAxN2UsIDB4MDM3ZSwgMHgwODdlLCAweDEwNzgsIDB4OGY3ZCwKKwkweDEwNzgsIDB4YTRlMiwgMHgxMDc4LCAweDRhNzMsIDB4MDg3ZiwgMHgwMzdmLCAweDAxN2YsIDB4MTA3OCwKKwkweDhlYjksIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsIDB4NzIzMywgMHgwYzdmLCAweDAwNzgsIDB4NWYyYSwKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsIDB4NWYyYSwgMHgxMjdmLCAweDAwN2YsIDB4MDE3ZiwKKwkweDA2N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDYwMWMsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDBjMCwgMHg1ZmNmLCAweDAxN2UsIDB4MDM3ZSwgMHgwODdlLCAweDEwNzgsIDB4YTRlMiwKKwkweDEwNzgsIDB4YTFjYSwgMHgwODdmLCAweDAzN2YsIDB4MDE3ZiwgMHgwMDc4LCAweDVmYTksIDB4NjAxYywKKwkweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDVmYTksIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsIDB4MDA0MCwKKwkweDVmOTYsIDB4MDA3OCwgMHg1ZmE5LCAweDBjN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweGEyODAsIDB4YTczNSwgMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHg2MDcyLCAweDBmN2UsIDB4MGU3ZSwKKwkweDBkN2UsIDB4MDY3ZSwgMHgyMDcxLCAweGE4YjEsIDB4NjY1NCwgMHg3MDE4LCAweGFjMDYsIDB4MDBjMCwKKwkweDVmZjIsIDB4NzYxYSwgMHg3MDFjLCAweGFjMDYsIDB4MDBjMCwgMHg1ZmZlLCAweDg2ZmYsIDB4MDBjMCwKKwkweDVmZmQsIDB4NzAxOCwgMHg3MDFlLCAweDAwNzgsIDB4NWZmZSwgMHg3NjFlLCAweDYwNTgsIDB4YTA3ZCwKKwkweDAwNDAsIDB4NjAwMywgMHg3ZTU2LCAweGE2ZWQsIDB4MDAwMCwgMHgwMDQwLCAweDYwMDksIDB4MmYwMCwKKwkweDY4NWEsIDB4NjA1NywgMHgwMDAwLCAweDYwNWIsIDB4MDAwMCwgMHg2MDAwLCAweGMwZDQsIDB4YzBkYywKKwkweDYwMDIsIDB4MTA3OCwgMHg0NGQzLCAweDAwNDAsIDB4NjA2ZSwgMHg3NjI0LCAweDg2ZmYsIDB4MDA0MCwKKwkweDYwNWMsIDB4YTY4MCwgMHgwMDA0LCAweDIwMDQsIDB4YWQwNiwgMHgwMGMwLCAweDYwNWMsIDB4MGQ3ZSwKKwkweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHg2MDUzLCAweDEwNzgsIDB4NWFjYiwKKwkweDEwNzgsIDB4NmUwZiwgMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3Mzc4LCAweDcwMjcsIDB4MDAwMCwKKwkweDAzN2UsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NjAzYywKKwkweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwKKwkweDAwNDAsIDB4NjA0NCwgMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHgwZDdmLCAweDBjN2UsIDB4NjAzYywKKwkweGEwMDUsIDB4MDA0MCwgMHg2MDRkLCAweDgwMDEsIDB4NjAzZSwgMHgyNjYwLCAweDEwNzgsIDB4OGVjNiwKKwkweDBjN2YsIDB4MDA3OCwgMHg2MDVjLCAweDBkN2YsIDB4MGM3ZSwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwKKwkweDYzMGEsIDB4MGM3ZiwgMHgwMDc4LCAweDYwMTEsIDB4OGRmZiwgMHgwMDQwLCAweDYwNmEsIDB4NjgzNywKKwkweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg4ZjdkLCAweDEwNzgsIDB4YTRlMiwKKwkweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDcyMzMsIDB4MDA3OCwgMHg2MDExLCAweDA2N2YsIDB4MGQ3ZiwKKwkweDBlN2YsIDB4MGY3ZiwgMHgxMjdmLCAweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDY3ZSwKKwkweDBjN2UsIDB4MGQ3ZSwgMHgyMDMxLCAweDAwMDAsIDB4NzgxNCwgMHhhMDY1LCAweDAwNDAsIDB4NjBkMCwKKwkweDYwMGMsIDB4MDA3ZSwgMHg2MDBmLCAweDAwMDAsIDB4NzgyNCwgMHhhYzA2LCAweDAwYzAsIDB4NjBiNSwKKwkweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHg2MGFmLCAweDEwNzgsIDB4NWFjYiwKKwkweDEwNzgsIDB4NmUwZiwgMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3Mzc4LCAweDc4MjcsIDB4MDAwMCwKKwkweDAzN2UsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NjBhNCwKKwkweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwKKwkweDAwNDAsIDB4NjBhYywgMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHgwMDc4LCAweDYwYjUsIDB4NjAwMywKKwkweDAwMDksIDB4NjMwYSwgMHgyYzMwLCAweDAwNzgsIDB4NjBjZCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwKKwkweDhkMDYsIDB4MDA0MCwgMHg2MGM5LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NjBkNywKKwkweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwKKwkweDhlYjksIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsIDB4NzIzMywgMHgwMDdmLCAweDAwNzgsIDB4NjA3ZCwKKwkweDdlMTYsIDB4N2UxMiwgMHgwZDdmLCAweDBjN2YsIDB4MDY3ZiwgMHgwMDdmLCAweDAwN2MsIDB4NjAxYywKKwkweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDYwZTAsIDB4MTA3OCwgMHhhMWNhLCAweDAwNzgsIDB4NjBjOSwKKwkweDYwMWMsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4NjBjOSwgMHg2MDA0LCAweGEwODYsIDB4MDA4NSwKKwkweDAwNDAsIDB4NjBjMCwgMHgwMDc4LCAweDYwYzksIDB4MDA3ZSwgMHgwNjdlLCAweDBjN2UsIDB4MGQ3ZSwKKwkweDc4MTgsIDB4YTA2NSwgMHgwMDQwLCAweDYxNWEsIDB4NjA1NCwgMHgwMDdlLCAweDYwNTcsIDB4MDAwMCwKKwkweDYwNWIsIDB4MDAwMCwgMHg2MDAwLCAweGMwZDQsIDB4YzBkYywgMHg2MDAyLCAweDEwNzgsIDB4NDRkMywKKwkweDAwNDAsIDB4NjE1NywgMHg3ZTI0LCAweDg2ZmYsIDB4MDA0MCwgMHg2MTQ5LCAweGE2ODAsIDB4MDAwNCwKKwkweDIwMDQsIDB4YWQwNiwgMHgwMGMwLCAweDYxNDksIDB4MGQ3ZSwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwKKwkweGEwMDUsIDB4MDA0MCwgMHg2MTQwLCAweDEwNzgsIDB4NWFjYiwgMHgxMDc4LCAweDZlMGYsIDB4NjhjMywKKwkweDAwMDAsIDB4MTA3OCwgMHg3Mzc4LCAweDc4MjcsIDB4MDAwMCwgMHgwMzdlLCAweDIwNjksIDB4MDE0MCwKKwkweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NjEyOSwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywKKwkweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDYxMzEsIDB4NjgyNywKKwkweDAwMDEsIDB4MDM3ZiwgMHgwZDdmLCAweDBjN2UsIDB4NjAzYywgMHhhMDA1LCAweDAwNDAsIDB4NjEzYSwKKwkweDgwMDEsIDB4NjAzZSwgMHgyNjYwLCAweDEwNzgsIDB4OGVjNiwgMHgwYzdmLCAweDAwNzgsIDB4NjE0OSwKKwkweDBkN2YsIDB4MGM3ZSwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDBjN2YsIDB4MDA3OCwKKwkweDYwZmUsIDB4OGRmZiwgMHgwMDQwLCAweDYxNTMsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywKKwkweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4NzIzMywgMHgwMDc4LCAweDYwZmUsIDB4MDA3ZiwKKwkweDAwNzgsIDB4NjBmMSwgMHg3ODFlLCAweDc4MWEsIDB4MGQ3ZiwgMHgwYzdmLCAweDA2N2YsIDB4MDA3ZiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgwZDdlLCAweDA2N2UsIDB4NjAwMCwgMHhkMGRjLCAweDAwNDAsIDB4NjE4MSwKKwkweDYwNGMsIDB4YTA2ZCwgMHgwMDQwLCAweDYxODEsIDB4Njg0OCwgMHhhNjA2LCAweDAwYzAsIDB4NjE4MSwKKwkweDIwNzEsIDB4YThiMSwgMHg3MDI0LCAweGEwMzUsIDB4MDA0MCwgMHg2MTgxLCAweGEwODAsIDB4MDAwNCwKKwkweDIwMDQsIDB4YWQwNiwgMHgwMGMwLCAweDYxODEsIDB4NjAwMCwgMHhjMGRjLCAweDYwMDIsIDB4MTA3OCwKKwkweDYxODUsIDB4MDY3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHgwZjdlLCAweDIwNzksIDB4MDEwMCwKKwkweDc4YzAsIDB4YTAwNSwgMHgwMGMwLCAweDYxOTQsIDB4MGM3ZSwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwKKwkweDYzMGEsIDB4MGM3ZiwgMHgwMDc4LCAweDYxY2IsIDB4MTA3OCwgMHg2ZTBmLCAweDc4YzMsIDB4MDAwMCwKKwkweDEwNzgsIDB4NzM3OCwgMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDc5LCAweDAxNDAsIDB4N2IwNCwKKwkweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDYxYTgsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwKKwkweDIwNzksIDB4MDEwMCwgMHg3ODI0LCAweGQwODQsIDB4MDA0MCwgMHg2MWIwLCAweDc4MjcsIDB4MDAwMSwKKwkweDEwNzgsIDB4NzM3OCwgMHgwMzdmLCAweDEwNzgsIDB4NDRkMywgMHgwYzdlLCAweDYwM2MsIDB4YTAwNSwKKwkweDAwNDAsIDB4NjFiYywgMHg4MDAxLCAweDYwM2UsIDB4MjY2MCwgMHgxMDc4LCAweDc3MmQsIDB4MGM3ZiwKKwkweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDhmN2QsIDB4MTA3OCwKKwkweDRhNzMsIDB4MTA3OCwgMHg3MjMzLCAweDBmN2YsIDB4MDA3YywgMHgwZTdlLCAweDBjN2UsIDB4MjA3MSwKKwkweGE4YjEsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHg2MWQ2LCAweDYxZTAsIDB4NjFlMywKKwkweDYxZmMsIDB4NjIxOCwgMHg2MjYyLCAweDYxZTAsIDB4NjFlMCwgMHg2MWRlLCAweDEwNzgsIDB4MTMzMiwKKwkweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcwMjQsIDB4YTA2NSwgMHgwMDQwLCAweDYxZjEsIDB4NzAyMCwKKwkweDgwMDEsIDB4NzAyMiwgMHg2MDBjLCAweGEwMTUsIDB4MDA0MCwgMHg2MWY4LCAweDcyMTYsIDB4NjAwZiwKKwkweDAwMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywKKwkweDcyMTYsIDB4NzIxMiwgMHgwMDc4LCAweDYxZjEsIDB4NjAxOCwgMHgyMDYwLCAweDEwNzgsIDB4NDRkMywKKwkweDYwMDAsIDB4YzBkYywgMHg2MDAyLCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDAwNDAsIDB4NjIwZCwKKwkweDYwNTQsIDB4YTAxNSwgMHgwMDQwLCAweDYyMTQsIDB4NzIxZSwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywKKwkweDAwMDAsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzIxOCwgMHg3MjFlLCAweDAwNzgsIDB4NjIwZCwKKwkweDcwMjQsIDB4YTA2NSwgMHgwMDQwLCAweDYyNWYsIDB4NzAwYywgMHhhYzA2LCAweDAwYzAsIDB4NjIyZiwKKwkweDEwNzgsIDB4NzIzMywgMHg2MDBjLCAweGEwMTUsIDB4MDA0MCwgMHg2MjJiLCAweDcyMGUsIDB4NjAwZiwKKwkweDAwMDAsIDB4MDA3OCwgMHg2MjVkLCAweDcyMGUsIDB4NzIwYSwgMHgwMDc4LCAweDYyNWQsIDB4NzAxNCwKKwkweGFjMDYsIDB4MDBjMCwgMHg2MjQyLCAweDEwNzgsIDB4NzIzMywgMHg2MDBjLCAweGEwMTUsIDB4MDA0MCwKKwkweDYyM2UsIDB4NzIxNiwgMHg2MDBmLCAweDAwMDAsIDB4MDA3OCwgMHg2MjVkLCAweDcyMTYsIDB4NzIxMiwKKwkweDAwNzgsIDB4NjI1ZCwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDYyNWQsIDB4NjAxOCwKKwkweDIwNjAsIDB4MTA3OCwgMHg0NGQzLCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLCAweDEwNzgsIDB4NzIzMywKKwkweDcwMWMsIDB4YTA2NSwgMHgwMDQwLCAweDYyNWQsIDB4NjA1NCwgMHhhMDE1LCAweDAwNDAsIDB4NjI1YiwKKwkweDcyMWUsIDB4MDA3OCwgMHg2MjVkLCAweDcyMTgsIDB4NzIxZSwgMHg3MDI3LCAweDAwMDAsIDB4MGM3ZiwKKwkweDBlN2YsIDB4MDA3YywgMHg3MDI0LCAweGEwNjUsIDB4MDA0MCwgMHg2MjZmLCAweDEwNzgsIDB4NzIzMywKKwkweDYwMGMsIDB4YTAxNSwgMHgwMDQwLCAweDYyNzYsIDB4NzIwZSwgMHg2MDBmLCAweDAwMDAsIDB4MTA3OCwKKwkweDczNzgsIDB4NzAyNywgMHgwMDAwLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcyMGUsIDB4NzIwYSwKKwkweDAwNzgsIDB4NjI2ZiwgMHgwZDdlLCAweDIwNjksIDB4YThiMSwgMHg2ODMwLCAweGEwODQsIDB4MDAwMywKKwkweDAwNzksIDB4NjI4MiwgMHg2Mjg4LCAweDYyOGEsIDB4NjJiNCwgMHg2Mjg4LCAweDEwNzgsIDB4MTMzMiwKKwkweDBkN2YsIDB4MDA3YywgMHgwYzdlLCAweDY4NDAsIDB4YTA4NiwgMHgwMDAxLCAweDAwNDAsIDB4NjJhYSwKKwkweDY4M2MsIDB4YTA2NSwgMHgwMDQwLCAweDYyOWIsIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsIDB4NjJhNiwKKwkweDZhM2EsIDB4NjAwZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MjAxMSwKKwkweGE4ZDAsIDB4MjAxMywgMHgwMDAwLCAweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDY4M2EsIDB4NjgzNiwKKwkweDAwNzgsIDB4NjI5YiwgMHg2ODQzLCAweDAwMDAsIDB4NjgzOCwgMHhhMDY1LCAweDAwNDAsIDB4NjI5YiwKKwkweDYwMDMsIDB4MDAwMywgMHgwMDc4LCAweDYyOWIsIDB4MGM3ZSwgMHg2ODQzLCAweDAwMDAsIDB4Njg0NywKKwkweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDY4M2MsIDB4YTA2NSwgMHgwMDQwLCAweDYyY2UsIDB4NjAwYywKKwkweGEwMTUsIDB4MDA0MCwgMHg2MmNhLCAweDZhM2EsIDB4NjAwZiwgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwKKwkweDAwNzgsIDB4NjJjZSwgMHg2ODNmLCAweDAwMDAsIDB4NjgzYSwgMHg2ODM2LCAweDBjN2YsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4YjEsIDB4NjgwNCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwKKwkweDYyZDksIDB4NjJlMywgMHg2MzhhLCAweDYzOGEsIDB4NjM4YSwgMHg2MzhhLCAweDYzOGMsIDB4NjM4YSwKKwkweDYyZTEsIDB4MTA3OCwgMHgxMzMyLCAweDY4MjAsIDB4YTAwNSwgMHgwMGMwLCAweDYyZTksIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MGM3ZSwgMHg2ODBjLCAweGEwNjUsIDB4MDA0MCwgMHg2MmY4LCAweDY4MDcsIDB4MDAwNCwKKwkweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDEwNzgsIDB4NjNkNCwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywKKwkweDY4MTQsIDB4YTA2NSwgMHgwMDQwLCAweDYzMDYsIDB4NjgwNywgMHgwMDAxLCAweDY4MjYsIDB4NjgyYiwKKwkweDAwMDAsIDB4MTA3OCwgMHg2M2Q0LCAweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDM3ZSwKKwkweDZhMWMsIDB4YTJmNSwgMHgwMDAwLCAweDAwNDAsIDB4NjM4NSwgMHg3MDRjLCAweGEwMGQsIDB4MDA0MCwKKwkweDYzMTUsIDB4NzA4OCwgMHhhMDA1LCAweDAwNDAsIDB4NjMyZCwgMHg3MDU0LCAweGEwNzUsIDB4MDA0MCwKKwkweDYzMWUsIDB4YTIwZSwgMHgwMDQwLCAweDYzODUsIDB4MDA3OCwgMHg2MzIzLCAweDY4MTgsIDB4YTIwZSwKKwkweDAwNDAsIDB4NjM4NSwgMHgyMDcwLCAweDcwNGMsIDB4YTAwZCwgMHgwMDQwLCAweDYzMTUsIDB4NzA4OCwKKwkweGEwMDUsIDB4MDBjMCwgMHg2MzE1LCAweDJlMDAsIDB4NjgxZSwgMHg3MzNjLCAweDcwMzgsIDB4YTMwMiwKKwkweDAwYzgsIDB4NjMxNSwgMHgxMDc4LCAweDc2ZmMsIDB4MDA0MCwgMHg2Mzg1LCAweDgzMTgsIDB4NzMzZSwKKwkweDYxMTIsIDB4MmUxMCwgMHg2MjFhLCAweGExODAsIDB4MDAxNCwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwKKwkweDYwMzIsIDB4YTE4MCwgMHgwMDE0LCAweDIwMDMsIDB4MDAwMCwgMHhhMTgwLCAweDAwMTUsIDB4MjAwNCwKKwkweGEwOGEsIDB4MTk5YSwgMHgwMDQ4LCAweDYzNGUsIDB4MjAwMSwgMHgxOTk5LCAweDgwMDMsIDB4ODAxYiwKKwkweDgzMWIsIDB4YTMxOCwgMHg2MzE2LCAweDAzN2YsIDB4MGY3ZSwgMHgyYzc4LCAweDcxYTAsIDB4ZDFiYywKKwkweDAwNDAsIDB4NjM2NywgMHg3MTAwLCAweGQxZjQsIDB4MDA0MCwgMHg2MzYzLCAweDcxMTQsIDB4YTE4YywKKwkweDAwZmYsIDB4MDA3OCwgMHg2MzZjLCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDYzNmMsIDB4YTFlMCwKKwkweDI5YzAsIDB4MmMwYywgMHhhMThjLCAweDAwZmYsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4MTA3OCwKKwkweDY5NjUsIDB4NzMwMCwgMHhjM2RkLCAweDczMDIsIDB4NjgwNywgMHgwMDAyLCAweDJmMTgsIDB4NmIyNiwKKwkweDY4MmIsIDB4MDAwMCwgMHg3ODFmLCAweDAwMDMsIDB4NzgwMywgMHgwMDAxLCAweDc4MDcsIDB4MDA0MCwKKwkweDBmN2YsIDB4MGU3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHgwMzdmLCAweDBlN2YsIDB4MGM3ZiwKKwkweDAwNzgsIDB4NjM4MywgMHgwZDdmLCAweDAwN2MsIDB4MGM3ZSwgMHg2ODBjLCAweGEwNjUsIDB4MDA0MCwKKwkweDYzOTgsIDB4NjgwNywgMHgwMDA0LCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDEwNzgsIDB4NjNkNCwKKwkweDBjN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4YjEsIDB4NjgzMCwKKwkweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDYzYmIsIDB4NjgzOCwgMHhhMDdkLCAweDAwNDAsIDB4NjNiYiwKKwkweDY4MzMsIDB4MDAwMSwgMHg2ODNlLCAweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDAsIDB4MTI3ZSwKKwkweDBmN2UsIDB4MjA5MSwgMHgyMjAwLCAweDAyN2YsIDB4MTA3OCwgMHgxZDZkLCAweDAwYzAsIDB4NjNiZSwKKwkweDEyN2YsIDB4MTA3OCwgMHg2Y2IzLCAweDBkN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDEyN2YsIDB4Njg0MywKKwkweDAwMDAsIDB4NzgwMywgMHgwMDAyLCAweDc4MGMsIDB4YTAxNSwgMHgwMDQwLCAweDYzZDAsIDB4NmEzYSwKKwkweDc4MGYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDAwNzgsIDB4NjNiYiwKKwkweDY4M2EsIDB4NjgzNiwgMHgwMDc4LCAweDYzY2EsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwKKwkweDYzZGEsIDB4MDA3YywgMHg2M2UzLCAweDYzZTgsIDB4NjgwOSwgMHg2OTIyLCAweDYzZTgsIDB4NjgwOSwKKwkweDY5MjIsIDB4NjNlMywgMHg2M2U4LCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywKKwkweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDBjN2UsIDB4MGY3ZSwgMHg2MDA0LCAweGEwOGEsIDB4MDA0NCwKKwkweDEwYzgsIDB4MTMzMiwgMHg2MTE4LCAweDIxNzgsIDB4NzlhMCwgMHhkMWJjLCAweDAwNDAsIDB4NjQwNSwKKwkweDc5MDAsIDB4ZDFmNCwgMHgwMDQwLCAweDY0MDEsIDB4NzkxNCwgMHhhMThjLCAweDAwZmYsIDB4MDA3OCwKKwkweDY0MGEsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NjQwYSwgMHhhMWY4LCAweDI5YzAsIDB4MmYwYywKKwkweGExOGMsIDB4MDBmZiwgMHgyYzc4LCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweGEwOGEsIDB4MDA0MCwKKwkweDAwYzgsIDB4NjQ1YywgMHgxMDc5LCAweDY0MWEsIDB4MGY3ZiwgMHgwYzdmLCAweDE0N2YsIDB4MTM3ZiwKKwkweDE1N2YsIDB4MDA3YywgMHg2NGMyLCAweDY1MGEsIDB4NjUzMiwgMHg2NWNkLCAweDY1ZmQsIDB4NjYwNSwKKwkweDY2MmMsIDB4NjYzZCwgMHg2NjRlLCAweDY2NTYsIDB4NjY2ZSwgMHg2NjU2LCAweDY2ZDksIDB4NjYzZCwKKwkweDY2ZmEsIDB4NjcwMiwgMHg2NjRlLCAweDY3MDIsIDB4NjcxMywgMHg2NDVhLCAweDY0NWEsIDB4NjQ1YSwKKwkweDY0NWEsIDB4NjQ1YSwgMHg2NDVhLCAweDY0NWEsIDB4NjQ1YSwgMHg2NDVhLCAweDY0NWEsIDB4NjQ1YSwKKwkweDZlZWYsIDB4NmYxNCwgMHg2ZjI5LCAweDZmNGMsIDB4NmY2ZCwgMHg2NjJjLCAweDY0NWEsIDB4NjYyYywKKwkweDY2NTYsIDB4NjQ1YSwgMHg2NTMyLCAweDY1Y2QsIDB4NjQ1YSwgMHg3NDljLCAweDY2NTYsIDB4NjQ1YSwKKwkweDc0YmMsIDB4NjY1NiwgMHg2NDVhLCAweDY0NWEsIDB4NjRiZCwgMHg2NDZiLCAweDY0NWEsIDB4NzRlMSwKKwkweDc1NTgsIDB4NzY0MCwgMHg2NDVhLCAweDc2NTEsIDB4NjYyNiwgMHg3NjZkLCAweDY0NWEsIDB4NmY4MiwKKwkweDY0NWEsIDB4NjQ1YSwgMHgxMDc4LCAweDEzMzIsIDB4MjEwMCwgMHgxMDc5LCAweDY0NjUsIDB4MGY3ZiwKKwkweDBjN2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3YywgMHg2NDY5LCAweDY0NjksIDB4NjQ2OSwKKwkweDY0OWYsIDB4MTA3OCwgMHgxMzMyLCAweDBkN2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjczMSwKKwkweDc4MTAsIDB4MjA2OCwgMHgyMGEzLCAweDI0MTQsIDB4MjBhMywgMHgwMDE4LCAweDIwYTMsIDB4MDgwMCwKKwkweDY4M2MsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg2ODUwLCAweDIwYTIsIDB4Njg1NCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTgsIDB4MTA3OCwgMHg2ZGZiLCAweDBkN2YsIDB4MDA3YywKKwkweDBkN2UsIDB4NzgxOCwgMHgyMDY4LCAweDY4YTAsIDB4YTA4MiwgMHgwMDdlLCAweDAwNDgsIDB4NjQ5YywKKwkweGEwODUsIDB4MDAwMSwgMHgwZDdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDY0OWEsIDB4MGQ3ZSwKKwkweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3MzEsIDB4MjBhMywgMHgwNTAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDc4MTAsIDB4YTBlOCwgMHgwMDBmLCAweDY4MDgsIDB4MjBhMiwgMHg2ODBjLCAweDIwYTIsIDB4NjgxMCwKKwkweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDY4MTgsIDB4MjBhMiwgMHg2ODFjLCAweDIwYTIsIDB4NjBjMywKKwkweDAwMTAsIDB4MTA3OCwgMHg2ZGZiLCAweDBkN2YsIDB4MDA3YywgMHg2MDMwLCAweDYwOWEsIDB4MTA3OCwKKwkweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDIwYTMsIDB4NTIwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHgwZDdlLCAweDIwNjksIDB4YTY1MiwgMHg2ODA0LCAweGQwODQsIDB4MDA0MCwKKwkweDY0ZGMsIDB4NjgyOCwgMHgyMGEzLCAweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDI1NjQsIDB4MjFhMiwKKwkweDAxN2YsIDB4MGQ3ZiwgMHgwMDc4LCAweDY0ZTEsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YTYwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwKKwkweDIwOTksIDB4YTYwMSwgMHg1M2E2LCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4MiwKKwkweDAwN2YsIDB4MDA0OCwgMHg2NGZiLCAweDIwMDEsIDB4YTYxYiwgMHgyMGE2LCAweDIwMDEsIDB4YTYxYywKKwkweDIwYTYsIDB4MDA3OCwgMHg2NTAxLCAweDIwYTMsIDB4MDAwMCwgMHg2MDMwLCAweGEwODQsIDB4MDBmZiwKKwkweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsIDB4MTA3OCwKKwkweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDIwYTMsIDB4MDUwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsIDB4MDA3ZiwKKwkweDAwNDgsIDB4NjUyMiwgMHgyMDAxLCAweGE2MWIsIDB4MjBhNiwgMHgyMDAxLCAweGE2MWMsIDB4MjBhNiwKKwkweDAwNzgsIDB4NjUyOCwgMHgyMGEzLCAweDAwMDAsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGE2MDUsIDB4NTNhNiwgMHg2MGMzLCAweDAwMTAsIDB4MTA3OCwKKwkweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDBjN2UsIDB4NzgxOCwKKwkweDIwNjAsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDk3MiwgMHgwYzdmLCAweDc4MTgsIDB4YTA4MCwKKwkweDAwMjgsIDB4MjAwNCwgMHhhMDg2LCAweDAwN2UsIDB4MDBjMCwgMHg2NTRkLCAweDIwYTMsIDB4MDQwMCwKKwkweDYyMGMsIDB4YzJiNCwgMHg2MjBlLCAweDAwNzgsIDB4NjU0ZiwgMHgyMGEzLCAweDAzMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDg2LCAweDAwN2UsIDB4MDBjMCwKKwkweDY1OWMsIDB4MjA5OSwgMHhhODhkLCAweDMzYTYsIDB4OTM5OCwgMHgzM2E2LCAweDkzOTgsIDB4MzMwNCwKKwkweGEwODQsIDB4M2ZmZiwgMHgyMGEyLCAweDkzOTgsIDB4MzNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwKKwkweGE2MDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhNjAxLCAweDUzYTYsIDB4MjBhOSwKKwkweDAwMTAsIDB4MjBhMywgMHgwMDAwLCAweDAwZjAsIDB4NjU3OSwgMHgyMDk5LCAweGE4OTUsIDB4MzMwNCwKKwkweGMwZGQsIDB4MjBhMiwgMHgyMDAxLCAweGE2NzIsIDB4MjAwNCwgMHhkMGU0LCAweDAwNDAsIDB4NjU5NCwKKwkweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4OTM5OCwgMHg5Mzk4LCAweDkzOTgsIDB4MzNhNiwKKwkweDIwYTksIDB4MDAwNCwgMHgwMDc4LCAweDY1OTYsIDB4MjBhOSwgMHgwMDA3LCAweDIwYTMsIDB4MDAwMCwKKwkweDAwZjAsIDB4NjU5NiwgMHgwMDc4LCAweDY1YmMsIDB4MjA5OSwgMHhhODhkLCAweDIwYTksIDB4MDAwOCwKKwkweDUzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YTYwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwKKwkweDIwOTksIDB4YTYwMSwgMHg1M2E2LCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwKKwkweDY1YWQsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDY1YjMsIDB4MjA5OSwKKwkweGE4OTUsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwKKwkweDAwZjAsIDB4NjViZSwgMHgyMGE5LCAweDAwMGEsIDB4MjBhMywgMHgwMDAwLCAweDAwZjAsIDB4NjVjNCwKKwkweDYwYzMsIDB4MDA3NCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY3MzEsIDB4MjBhMywgMHgyMDEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLCAweDA4MDAsIDB4MjBhMywKKwkweDIwMDAsIDB4YTAwNiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MGY3ZSwKKwkweDIwNzksIDB4YTY1MiwgMHg3OTA0LCAweDBmN2YsIDB4ZDFhYywgMHgwMGMwLCAweDY1ZTksIDB4YTA4NSwKKwkweDAwMjAsIDB4ZDFhNCwgMHgwMDQwLCAweDY1ZWUsIDB4YTA4NSwgMHgwMDEwLCAweGEwODUsIDB4MDAwMiwKKwkweDBkN2UsIDB4MDA3OCwgMHg2NmI3LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY3MzEsIDB4MjBhMywgMHg1MDAwLCAweDAwNzgsIDB4NjU0ZiwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY3MzEsIDB4MjBhMywgMHgyMTEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwKKwkweDEwNzgsIDB4NjdiOSwgMHgwMDc4LCAweDY2MzAsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwKKwkweDIwYTMsIDB4MDIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwYzMsIDB4MDAwNCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY3YzIsIDB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywKKwkweDJhMDAsIDB4NjBjMywgMHgwMDA4LCAweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwKKwkweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAyMDAsIDB4MDA3OCwgMHg2NTRmLCAweDIwYTEsIDB4MDIwYiwKKwkweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MjgsIDB4YTAwNSwKKwkweDAwNDAsIDB4NjY2NSwgMHgyMGEyLCAweDAwNzgsIDB4NjY2NywgMHgyMGEzLCAweDAwMDMsIDB4NzgxMCwKKwkweDIwYTIsIDB4NjBjMywgMHgwMDA4LCAweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDBkN2UsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg2N2MyLCAweDIwYTMsIDB4MDIxMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywKKwkweDA4MDAsIDB4NzgxOCwgMHgyMDY4LCAweDY4OTQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4NjY5NCwKKwkweDY5OTgsIDB4YTE4NCwgMHhjMDAwLCAweDAwYzAsIDB4NjY5MCwgMHhkMWVjLCAweDAwNDAsIDB4NjY4YywKKwkweDIwYTMsIDB4MjEwMCwgMHgwMDc4LCAweDY2OTYsIDB4MjBhMywgMHgwMTAwLCAweDAwNzgsIDB4NjY5NiwKKwkweDIwYTMsIDB4MDQwMCwgMHgwMDc4LCAweDY2OTYsIDB4MjBhMywgMHgwNzAwLCAweGEwMDYsIDB4MjBhMiwKKwkweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MGY3ZSwgMHgyMDc5LCAweGE2NTIsIDB4NzkwNCwKKwkweDBmN2YsIDB4ZDFhYywgMHgwMGMwLCAweDY2YTYsIDB4YTA4NSwgMHgwMDIwLCAweGQxYTQsIDB4MDA0MCwKKwkweDY2YWIsIDB4YTA4NSwgMHgwMDEwLCAweDIwMDksIDB4YTY3NCwgMHgyMTBjLCAweGQxODQsIDB4MDA0MCwKKwkweDY2YjUsIDB4Njk5YywgMHhkMThjLCAweDAwNDAsIDB4NjZiNywgMHhhMDg1LCAweDAwMDIsIDB4MDI3ZSwKKwkweDIwMDksIDB4YTY3MiwgMHgyMTBjLCAweGQxZTQsIDB4MDA0MCwgMHg2NmM1LCAweGMwYzUsIDB4YTA5NCwKKwkweDAwMzAsIDB4YTI5NiwgMHgwMDEwLCAweDAwNDAsIDB4NjZjZiwgMHhkMWVjLCAweDAwNDAsIDB4NjZjZiwKKwkweGEwOTQsIDB4MDAzMCwgMHhhMjk2LCAweDAwMTAsIDB4MDA0MCwgMHg2NmNmLCAweGMwYmQsIDB4MDI3ZiwKKwkweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDZkZmIsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwgMHgyMGEzLCAweDAyMTAsIDB4MjBhMywKKwkweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwKKwkweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2N2MyLCAweDIwYTMsIDB4MDIwMCwKKwkweDAwNzgsIDB4NjRjOCwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2N2MyLCAweDIwYTMsIDB4MDEwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwKKwkweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg2N2MyLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMGIsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywKKwkweDAyN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDIwMTksIDB4MzIwMCwgMHgyMDIxLCAweDA4MDAsIDB4MDA3OCwKKwkweDY3MzgsIDB4MDI3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MjAxOSwgMHgyMjAwLCAweDIwMjEsIDB4MDEwMCwKKwkweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAxNCwKKwkweGEyODYsIDB4MDA3ZSwgMHgwMGMwLCAweDY3NGIsIDB4YTM4NSwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywKKwkweGZmZmUsIDB4MDA3OCwgMHg2NzgwLCAweGEyODYsIDB4MDA3ZiwgMHgwMGMwLCAweDY3NTcsIDB4MGQ3ZSwKKwkweGEzODUsIDB4MDBmZiwgMHgyMGEyLCAweDIwYTMsIDB4ZmZmZCwgMHgwMDc4LCAweDY3NmUsIDB4ZDJiYywKKwkweDAwNDAsIDB4Njc3NiwgMHhhMjg2LCAweDAwODAsIDB4MGQ3ZSwgMHgwMGMwLCAweDY3NjYsIDB4YTM4NSwKKwkweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmMsIDB4MDA3OCwgMHg2NzZlLCAweGEyZTgsIDB4YTczNSwKKwkweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2Nzg0LCAweDBkN2UsIDB4YTJlOCwKKwkweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwKKwkweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4YTQ4NSwgMHgwMDI5LCAweDIwYTIsIDB4MDQ3ZiwKKwkweDAzN2YsIDB4MjBhMywgMHgwMDAwLCAweDEwNzgsIDB4NmRlYSwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwKKwkweDJmYTIsIDB4MjBhMywgMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwKKwkweDAwN2MsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwYTMsIDB4MDJmZiwKKwkweDIwMTEsIDB4ZmZmYywgMHgyMmEyLCAweDBkN2UsIDB4MjA2OSwgMHhhNjFiLCAweDJkYTYsIDB4OGQ2OCwKKwkweDJkYTYsIDB4MGQ3ZiwgMHgyMGEzLCAweDIwMjksIDB4MjBhMywgMHgwMDAwLCAweDAwNzgsIDB4Njc4YiwKKwkweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhmYzAyLCAweDIwYTMsIDB4MDAwMCwKKwkweDAwN2MsIDB4MDI3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MjAxOSwgMHgzMzAwLCAweDIwMjEsIDB4MDgwMCwKKwkweDAwNzgsIDB4NjdjOSwgMHgwMjdlLCAweDAzN2UsIDB4MDQ3ZSwgMHgyMDE5LCAweDIzMDAsIDB4MjAyMSwKKwkweDAxMDAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4YTA5MiwgMHgwMDdlLCAweDAwNDgsIDB4NjdlNiwgMHgwZDdlLCAweGEwZTgsIDB4YTczNSwKKwkweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2N2Y0LCAweDBkN2UsIDB4YTBlOCwKKwkweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwKKwkweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4YTQ4NSwgMHgwMDk4LCAweDIwYTIsIDB4MjBhMywKKwkweDAwMDAsIDB4MDQ3ZiwgMHgwMzdmLCAweDEwNzgsIDB4NmRlYSwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwKKwkweDdhMDgsIDB4MjJhMiwgMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwKKwkweDAwN2MsIDB4MGM3ZSwgMHgwZjdlLCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LCAweDEwNDgsIDB4MTMzMiwKKwkweGEwOGEsIDB4MDA4YywgMHgxMGM4LCAweDEzMzIsIDB4NjExOCwgMHgyMTc4LCAweDc5YTAsIDB4ZDFiYywKKwkweDAwNDAsIDB4NjgyNywgMHg3OTAwLCAweGQxZjQsIDB4MDA0MCwgMHg2ODIzLCAweDc5MTQsIDB4YTE4YywKKwkweDAwZmYsIDB4MDA3OCwgMHg2ODJjLCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDY4MmMsIDB4YTFmOCwKKwkweDI5YzAsIDB4MmYwYywgMHhhMThjLCAweDAwZmYsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwKKwkweGEwODIsIDB4MDA4NSwgMHgxMDc5LCAweDY4MzcsIDB4MGY3ZiwgMHgwYzdmLCAweDAwN2MsIDB4Njg0MCwKKwkweDY4NGIsIDB4Njg2NiwgMHg2ODNlLCAweDY4M2UsIDB4NjgzZSwgMHg2ODQwLCAweDEwNzgsIDB4MTMzMiwKKwkweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4Njg3OSwgMHg2MGMzLCAweDAwMDAsIDB4MTA3OCwKKwkweDZkZmIsIDB4MTQ3ZiwgMHgwMDdjLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjhhZCwKKwkweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLCAweDc4MTAsIDB4MjBhMiwKKwkweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwYzMsIDB4MDAwYywgMHgxMDc4LCAweDZkZmIsIDB4MTQ3ZiwgMHgwMDdjLCAweDE0N2UsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg2OGVlLCAweDIwYTMsIDB4MDAwMywgMHgyMGEzLCAweDAzMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwNCwgMHgxMDc4LCAweDZkZmIsIDB4MTQ3ZiwKKwkweDAwN2MsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwKKwkweDAwMjgsIDB4MjAwNCwgMHhhMDkyLCAweDAwN2UsIDB4MDA0OCwgMHg2ODk4LCAweDBkN2UsIDB4YTBlOCwKKwkweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4ODEwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwKKwkweDIwNjksIDB4YTYxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjhhNywKKwkweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDgxMDAsIDB4MjBhMiwKKwkweDY4MTQsIDB4MjBhMiwgMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4MjBhMywKKwkweDAwMDksIDB4MjBhMywgMHgwMDAwLCAweDAwNzgsIDB4Njc4YiwgMHgwMjdlLCAweDIwZTEsIDB4OTA4MCwKKwkweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwOTIsIDB4MDA3ZSwKKwkweDAwNDgsIDB4NjhjYywgMHgwZDdlLCAweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwKKwkweDg0MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhNjFiLCAweDJkYTYsIDB4OGQ2OCwKKwkweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDY4ZGIsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywKKwkweDY4MTAsIDB4YTA4NSwgMHg4NDAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywKKwkweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDIwYTMsIDB4MDA5OSwgMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwKKwkweDZkZWEsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDdhMTAsIDB4MjJhMiwKKwkweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MjBlMSwKKwkweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA5MiwKKwkweDAwN2UsIDB4MDA0OCwgMHg2OTBkLCAweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwKKwkweGEwODUsIDB4ODUwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsIDB4MmRhNiwKKwkweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjkxYywgMHgwZDdlLCAweGEwZTgsIDB4YTczNSwKKwkweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwKKwkweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4MjBhMywgMHgwMDk5LCAweDIwYTMsIDB4MDAwMCwKKwkweDAwNzgsIDB4NjhkZiwgMHgwYzdlLCAweDBmN2UsIDB4MmM3OCwgMHg3ODA0LCAweGEwOGEsIDB4MDA0MCwKKwkweDEwNDgsIDB4MTMzMiwgMHhhMDhhLCAweDAwNTMsIDB4MTBjOCwgMHgxMzMyLCAweDc5MTgsIDB4MjE2MCwKKwkweDYxYTAsIDB4ZDFiYywgMHgwMDQwLCAweDY5NDEsIDB4NjEwMCwgMHhkMWY0LCAweDAwNDAsIDB4NjkzZCwKKwkweDYxMTQsIDB4YTE4YywgMHgwMGZmLCAweDAwNzgsIDB4Njk0NiwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwKKwkweDY5NDYsIDB4YTFlMCwgMHgyOWMwLCAweDJjMGMsIDB4YTE4YywgMHgwMGZmLCAweDIwNjEsIDB4MDEwMCwKKwkweDYxOWEsIDB4YTA4MiwgMHgwMDQwLCAweDEwNzksIDB4Njk1MCwgMHgwZjdmLCAweDBjN2YsIDB4MDA3YywKKwkweDY5NjUsIDB4NmE3MywgMHg2YTE0LCAweDZjMjcsIDB4Njk2MywgMHg2OTYzLCAweDY5NjMsIDB4Njk2MywKKwkweDY5NjMsIDB4Njk2MywgMHg2OTYzLCAweDcxNGMsIDB4NzE1ZCwgMHg3MTZlLCAweDcxN2YsIDB4Njk2MywKKwkweDc2N2UsIDB4Njk2MywgMHg3MTNiLCAweDEwNzgsIDB4MTMzMiwgMHgwZDdlLCAweDE1N2UsIDB4MTQ3ZSwKKwkweDc4MGIsIDB4ZmZmZiwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2OWQwLCAweDc5MTAsIDB4MjE2OCwKKwkweDY5NDgsIDB4NzkyMiwgMHgyMWEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4Njk0YywKKwkweGExODQsIDB4MDAwZiwgMHgwMGMwLCAweDY5ODAsIDB4MjAwMSwgMHgwMDA1LCAweDAwNzgsIDB4Njk4YSwKKwkweGQxODQsIDB4MDA0MCwgMHg2OTg3LCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDY5OGEsIDB4YTA4NCwKKwkweDAwMDYsIDB4ODAwNCwgMHgwMTdlLCAweDIwMDgsIDB4NzgzMCwgMHhhMDg0LCAweDAwZmYsIDB4ODAwNywKKwkweGExMDUsIDB4MDE3ZiwgMHgyMGEyLCAweGQxYWMsIDB4MDA0MCwgMHg2OTlhLCAweDIwYTMsIDB4MDAwMiwKKwkweDAwNzgsIDB4NjlhNiwgMHhkMWI0LCAweDAwNDAsIDB4NjlhMSwgMHgyMGEzLCAweDAwMDEsIDB4MDA3OCwKKwkweDY5YTYsIDB4MjBhMywgMHgwMDAwLCAweDIyMzAsIDB4MDA3OCwgMHg2OWE4LCAweDZhODAsIDB4NmU3YywKKwkweDIwYTksIDB4MDAwOCwgMHhhZDgwLCAweDAwMTcsIDB4MjAwYywgMHg4MTBmLCAweDIxYTIsIDB4ODAwMCwKKwkweDAwZjAsIDB4NjlhYywgMHgyMmEyLCAweDI2YTIsIDB4NjBjMywgMHgwMDIwLCAweDIwZTEsIDB4OTA4MCwKKwkweDYwMTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAwOSwgMHg2MDE2LCAweDIwMDEsIDB4YThjZCwKKwkweDIwMDMsIDB4MDdkMCwgMHgyMDAxLCAweGE4Y2MsIDB4MjAwMywgMHgwMDA5LCAweDIwMDEsIDB4YThkMiwKKwkweDIwMDMsIDB4MDAwMiwgMHgxMDc4LCAweDE1OGMsIDB4MTQ3ZiwgMHgxNTdmLCAweDBkN2YsIDB4MDA3YywKKwkweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4N2ExOCwgMHhhMjgwLCAweDAwMjMsIDB4MjAxNCwKKwkweDgyMTAsIDB4YTI5NCwgMHgwMGZmLCAweDIyMDIsIDB4ODIxNywgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDY5ZjYsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywKKwkweDY4MTAsIDB4YTA4NSwgMHgwNjAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2YTA1LCAweDBkN2UsIDB4YTBlOCwKKwkweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDYwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwKKwkweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYxMzAsIDB4MjFhMiwgMHgyMGEzLCAweDA4MjksIDB4MjBhMywKKwkweDAwMDAsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwN2MsIDB4MGQ3ZSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwKKwkweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDZhMzQsIDB4NzgxMCwgMHgyMDY4LCAweDY4NjAsIDB4MjBhMiwKKwkweDY4NWMsIDB4MjBhMiwgMHg2ODgwLCAweDIwYTIsIDB4Njg3YywgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwKKwkweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsIDB4MDAwYywgMHgxMDc4LCAweDZkZmIsIDB4MTQ3ZiwKKwkweDEzN2YsIDB4MTU3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwKKwkweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLCAweDAwNDAsIDB4NmE1MiwKKwkweDBkN2UsIDB4YTBlOCwgMHhhNzM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA1MDAsIDB4MjBhMiwKKwkweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGE2MWIsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwKKwkweDAwNzgsIDB4NmE2MSwgMHgwZDdlLCAweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwKKwkweDA1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwKKwkweDIyYTIsIDB4MjBhMywgMHgwODg5LCAweDIwYTMsIDB4MDAwMCwgMHgxMDc4LCAweDZkZWEsIDB4MjJhMiwKKwkweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4NzgxMCwKKwkweGEwZWMsIDB4ZjAwMCwgMHgwMDQwLCAweDZhOGIsIDB4YTA2ZCwgMHgxMDc4LCAweDQ5NWYsIDB4MDA0MCwKKwkweDZhOGIsIDB4Njg0YywgMHhhMDg0LCAweDIwMjAsIDB4YTA4NiwgMHgyMDIwLCAweDAwYzAsIDB4NmE4YiwKKwkweDc4MjQsIDB4YzBjZCwgMHg3ODI2LCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDZiZTAsIDB4YTAxNiwKKwkweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg3ODEwLCAweGEwODQsIDB4ZjAwMCwKKwkweDAwYzAsIDB4NmFhMiwgMHg3ODEwLCAweGEwODQsIDB4MDcwMCwgMHg4MDA3LCAweDEwNzksIDB4NmFhYSwKKwkweDAwNzgsIDB4NmFhNSwgMHhhMDA2LCAweDEwNzksIDB4NmFhYSwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHg2YWI0LCAweDZiNGMsIDB4NmI1NywgMHg2YjgxLCAweDZiOTUsIDB4NmJiMSwKKwkweDZiYmMsIDB4NmFiMiwgMHgxMDc4LCAweDEzMzIsIDB4MDE3ZSwgMHgwMzdlLCAweDY5NGMsIDB4YTE4YywKKwkweDAwMDMsIDB4MDA0MCwgMHg2YWJmLCAweGExODYsIDB4MDAwMywgMHgwMGMwLCAweDZhY2UsIDB4NmI3OCwKKwkweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDZhYzUsIDB4YzNlNSwgMHgyM2EyLCAweDY4NjgsIDB4MjBhMiwKKwkweDY4NjQsIDB4MjBhMiwgMHgwMzdmLCAweDAxN2YsIDB4MDA3OCwgMHg2YjhjLCAweGExODYsIDB4MDAwMSwKKwkweDEwYzAsIDB4MTMzMiwgMHg2Yjc4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDZhZDgsIDB4YzNlNSwKKwkweDIzYTIsIDB4Njg2OCwgMHgyMGEyLCAweDY4NjQsIDB4MjBhMiwgMHgyMmEyLCAweDY4NzQsIDB4MjBhMiwKKwkweDIyYTIsIDB4Njg3YywgMHgyMGEyLCAweDIwMDksIDB4MDAxOCwgMHhhMzg0LCAweDAzMDAsIDB4MDA0MCwKKwkweDZiNDYsIDB4ZDNjNCwgMHgwMDQwLCAweDZhZWUsIDB4Njg3YywgMHhhMTA4LCAweGQzY2MsIDB4MDA0MCwKKwkweDZhZjMsIDB4Njg3NCwgMHhhMTA4LCAweDE1N2UsIDB4MjBhOSwgMHgwMDBkLCAweGFkODAsIDB4MDAyMCwKKwkweDIwMWMsIDB4ODMxZiwgMHgyM2EyLCAweDgwMDAsIDB4MDBmMCwgMHg2YWY4LCAweDE1N2YsIDB4MjJhMiwKKwkweDIyYTIsIDB4MjJhMiwgMHhhMTg0LCAweDAwMDMsIDB4MDA0MCwgMHg2YjQ2LCAweDIwYTEsIDB4MDIwYiwKKwkweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MDA3ZSwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDZiMjYsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywKKwkweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2YjM1LCAweDBkN2UsIDB4YTBlOCwKKwkweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwKKwkweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHgwMDdmLCAweDdiMjQsIDB4ZDNjYywKKwkweDAwNDAsIDB4NmIzZSwgMHgyMGEzLCAweDA4ODksIDB4MDA3OCwgMHg2YjQwLCAweDIwYTMsIDB4MDg5OCwKKwkweDIwYTIsIDB4MTA3OCwgMHg2ZGVhLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDYxYzIsIDB4MDM3ZiwKKwkweDAxN2YsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MjAxMSwgMHgwMDA4LCAweDc4MjQsIDB4ZDBjYywKKwkweDAwNDAsIDB4NmI1MywgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwgMHgwMDc4LCAweDZiOGEsIDB4MjAxMSwKKwkweDAzMDIsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsIDB4NmI1ZSwgMHhjMmU1LCAweDIyYTIsIDB4YTAxNiwKKwkweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4MDAxMiwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOCwKKwkweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHg3MDAwLCAweDIwYTMsIDB4MDUwMCwKKwkweDIyYTIsIDB4MjBhMywgMHgwMDBhLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDI1MDAsIDB4MjJhMiwKKwkweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDMyLCAweDEwNzgsIDB4NmRmYiwKKwkweDAwN2MsIDB4MjAxMSwgMHgwMDI4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDZiODgsIDB4YzJlNSwKKwkweDIyYTIsIDB4YTAxNiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwKKwkweDYwYzMsIDB4MDAxOCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMDExLCAweDAxMDAsIDB4NzgyNCwKKwkweGQwY2MsIDB4MDA0MCwgMHg2YjljLCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwKKwkweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOCwgMHgyMmEyLCAweDc4MzQsIDB4YTA4NCwKKwkweDAwZmYsIDB4MjBhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDIwLCAweDEwNzgsIDB4NmRmYiwKKwkweDAwN2MsIDB4MjAxMSwgMHgwMDA4LCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDZiYjgsIDB4YzJlNSwKKwkweDIyYTIsIDB4YTAxNiwgMHgwMDc4LCAweDZiOGEsIDB4MDM3ZSwgMHg3YjEwLCAweGEzODQsIDB4ZmYwMCwKKwkweDc4MTIsIDB4YTM4NCwgMHgwMGZmLCAweDgwMDEsIDB4MDBjMCwgMHg2YmNmLCAweDc4MjQsIDB4ZDBjYywKKwkweDAwNDAsIDB4NmJjYiwgMHhjMmU1LCAweDIyYTIsIDB4MDM3ZiwgMHgwMDc4LCAweDZiOGEsIDB4MDQ3ZSwKKwkweDIwMjEsIDB4MDgwMCwgMHgwMDdlLCAweDc4MjQsIDB4ZDBjYywgMHgwMDdmLCAweDAwNDAsIDB4NmJkOSwKKwkweGM0ZTUsIDB4MjRhMiwgMHgwNDdmLCAweDIyYTIsIDB4MjBhMiwgMHgwMzdmLCAweDAwNzgsIDB4NmI4YywKKwkweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDZiZmUsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywKKwkweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2YzBkLCAweDBkN2UsIDB4YTBlOCwKKwkweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwKKwkweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwKKwkweDZjMTUsIDB4MjBhMywgMHgwODg5LCAweDAwNzgsIDB4NmMxNywgMHgyMGEzLCAweDA4OTgsIDB4MjBhMywKKwkweDAwMDAsIDB4MTA3OCwgMHg2ZGVhLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwKKwkweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMjdmLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MDM3ZSwgMHg3ODEwLCAweGEwODQsIDB4MDcwMCwKKwkweDgwMDcsIDB4MTA3OSwgMHg2YzNhLCAweDAzN2YsIDB4MDE3ZiwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHg2YzQyLCAweDZjNDIsIDB4NmM0NCwgMHg2YzQyLCAweDZjNDIsIDB4NmM0MiwKKwkweDZjNjksIDB4NmM0MiwgMHgxMDc4LCAweDEzMzIsIDB4NzkxMCwgMHhhMThjLCAweGY4ZmYsIDB4YTE4ZCwKKwkweDA2MDAsIDB4NzkxMiwgMHgyMGExLCAweDAyMGIsIDB4MjAwOSwgMHgwMDAzLCAweDEwNzgsIDB4NmM3MywKKwkweDBkN2UsIDB4MjA2OSwgMHhhNjUyLCAweDY4MDQsIDB4ZDBiYywgMHgwMDQwLCAweDZjNWUsIDB4NjgyYywKKwkweGEwODQsIDB4MDBmZiwgMHg4MDA3LCAweDIwYTIsIDB4MDA3OCwgMHg2YzYwLCAweDIwYTMsIDB4M2YwMCwKKwkweDBkN2YsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDAxLCAweDEwNzgsIDB4NmRmYiwKKwkweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDIwMDksIDB4MDAwMywgMHgxMDc4LCAweDZjNzMsIDB4MjBhMywKKwkweDdmMDAsIDB4MDA3OCwgMHg2YzYxLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwKKwkweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDZjOTEsIDB4MGQ3ZSwKKwkweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwMTAwLCAweDIwYTIsIDB4NjgxNCwKKwkweDIwYTIsIDB4MjA2OSwgMHhhNjFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwKKwkweDZjYTAsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDEwMCwKKwkweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwKKwkweDIwYTMsIDB4MDg4OCwgMHhhMThkLCAweDAwMDgsIDB4MjFhMiwgMHgxMDc4LCAweDZkZWEsIDB4MjJhMiwKKwkweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA1N2UsIDB4MDQ3ZSwKKwkweDAzN2UsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YTYwMCwgMHg2MTMwLCAweDc4MTgsIDB4MjA2OCwKKwkweDY4YTAsIDB4MjAyOCwgMHhkMGJjLCAweDAwYzAsIDB4NmNjYSwgMHg2OTEwLCAweDZhMTQsIDB4NjQzMCwKKwkweDAwNzgsIDB4NmNjZSwgMHg2OTEwLCAweDZhMTQsIDB4NzM2YywgMHg3NDcwLCAweDc4MWMsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDA0MCwgMHg2ZDJkLCAweGQ1YmMsIDB4MDA0MCwgMHg2Y2RlLCAweGExODUsIDB4MDEwMCwKKwkweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4MDA3OCwgMHg2Y2U1LCAweGExODUsIDB4MDEwMCwKKwkweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwgMHg2MDczLCAweDA4MDksIDB4NjA3NywKKwkweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLCAweDgwMDcsIDB4NjA3YSwKKwkweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwgMHg2MDg2LCAweDc4MTAsIDB4MjA3MCwKKwkweDcwMTQsIDB4NjA4YSwgMHg3MDEwLCAweDYwOGUsIDB4NzAwYywgMHg2MGM2LCAweDcwMDgsIDB4NjBjYSwKKwkweDY4NmMsIDB4NjBjZSwgMHg2MGFiLCAweDAwMzYsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwKKwkweGE1ODIsIDB4MDA4MCwgMHgwMDQ4LCAweDZkMTcsIDB4NmEwMCwgMHhkMmY0LCAweDAwNDAsIDB4NmQxNSwKKwkweDZhMTQsIDB4YTI5NCwgMHgwMGZmLCAweDAwNzgsIDB4NmQxNywgMHgyMDExLCAweDAwMDAsIDB4NjI5ZSwKKwkweDYwMTcsIDB4MDAxNiwgMHgyMDA5LCAweDA3ZDAsIDB4NjBjNCwgMHhhMDg0LCAweGZmZjAsIDB4YTAwNSwKKwkweDAwNDAsIDB4NmQyNCwgMHgyMDA5LCAweDFiNTgsIDB4MTA3OCwgMHg1YWQwLCAweDAzN2YsIDB4MDQ3ZiwKKwkweDA1N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MDA3YywgMHg3ODEwLCAweDIwNzAsIDB4NzA0YywKKwkweGEwODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDIsIDB4MDA0MCwgMHg2ZDg1LCAweGQ1YmMsIDB4MDA0MCwKKwkweDZkNDEsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4MDA3OCwKKwkweDZkNDgsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwKKwkweDYwNzMsIDB4MDg4MCwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwKKwkweDY4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwKKwkweDYwODIsIDB4NzA2MCwgMHg2MDhhLCAweDcwNWMsIDB4NjA4ZSwgMHg3MDgwLCAweDYwYzYsIDB4NzA3YywKKwkweDYwY2EsIDB4NzA3YywgMHg3OTJjLCAweGExMDgsIDB4NzkyZSwgMHg3MDgwLCAweDc5MjgsIDB4YTEwOSwKKwkweDc5MmEsIDB4Njg2YywgMHg2MGNlLCAweDYwYWIsIDB4MDAzNiwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywKKwkweDAwMDAsIDB4YTU4MiwgMHgwMDgwLCAweDAwNDgsIDB4NmQ4MCwgMHg2YTAwLCAweGQyZjQsIDB4MDA0MCwKKwkweDZkN2UsIDB4NmExNCwgMHhhMjk0LCAweDAwZmYsIDB4MDA3OCwgMHg2ZDgwLCAweDIwMTEsIDB4MDAwMCwKKwkweDYyOWUsIDB4NjAxNywgMHgwMDEyLCAweDAwNzgsIDB4NmQxYSwgMHhkNWJjLCAweDAwNDAsIDB4NmQ5MCwKKwkweGExODUsIDB4MDcwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDAwNzgsIDB4NmQ5NywKKwkweGExODUsIDB4MDcwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLCAweDY0NmUsIDB4MTA3OCwKKwkweDQ5NWYsIDB4MDA0MCwgMHg2ZGFkLCAweDBkN2UsIDB4NzgxMCwgMHhhMDZkLCAweDY4NGMsIDB4MGQ3ZiwKKwkweGEwODQsIDB4MjAyMCwgMHhhMDg2LCAweDIwMjAsIDB4MDBjMCwgMHg2ZGFkLCAweDc4MjQsIDB4YzBjZCwKKwkweDc4MjYsIDB4NjA3MywgMHgwODg5LCAweDAwNzgsIDB4NmRhZiwgMHg2MDczLCAweDA4OTgsIDB4NjA3NywKKwkweDAwMDAsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsIDB4MDBmZiwgMHg2ODhlLCAweDgwMDcsIDB4NjA3YSwKKwkweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwgMHg2MDgyLCAweDcwMTQsIDB4NjA4YSwKKwkweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsIDB4NzAwOCwgMHg2MGNhLCAweDY4NmMsIDB4NjBjZSwKKwkweDYwYWIsIDB4MDAzNiwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGE1ODIsIDB4MDA4MCwKKwkweDAwNDgsIDB4NmRkZCwgMHg2YTAwLCAweGQyZjQsIDB4MDA0MCwgMHg2ZGRiLCAweDZhMTQsIDB4YTI5NCwKKwkweDAwZmYsIDB4MDA3OCwgMHg2ZGRkLCAweDIwMTEsIDB4MDAwMCwgMHg2MjllLCAweDc4MjQsIDB4ZDBjYywKKwkweDAwNDAsIDB4NmRlNiwgMHg2MDE3LCAweDAwMTYsIDB4MDA3OCwgMHg2ZDFhLCAweDYwMTcsIDB4MDAxMiwKKwkweDAwNzgsIDB4NmQxYSwgMHg3YTE4LCAweGEyODAsIDB4MDAyMywgMHgyMDE0LCAweDgyMTAsIDB4YTI5NCwKKwkweDAwZmYsIDB4MjIwMiwgMHg4MjE3LCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4YjEsIDB4Njg0MywKKwkweDAwMDEsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywKKwkweDk1NzUsIDB4MTA3OCwgMHg2ZTA2LCAweDEwNzgsIDB4NWFjMCwgMHgwMDdjLCAweDAwN2UsIDB4NjAxNCwKKwkweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMDksIDB4NjAxNiwgMHgwMDdmLCAweDAwN2MsIDB4MDA3ZSwKKwkweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwMTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAwOCwKKwkweDYwMTYsIDB4MGM3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLCAweDAxN2UsIDB4MDI3ZSwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4NjkwNCwgMHhhMTk0LCAweDQwMDAsIDB4MDA0MCwKKwkweDZlNTksIDB4MTA3OCwgMHg2ZTBmLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLCAweDAwMDAsIDB4MGM3ZSwKKwkweDIwNjEsIDB4YThiMSwgMHg2MTI4LCAweGExOTIsIDB4MDBjOCwgMHgwMGM4LCAweDZlNDQsIDB4ODEwOCwKKwkweDYxMmEsIDB4NjEyNCwgMHgwYzdmLCAweDgxZmYsIDB4MDA0MCwgMHg2ZTU0LCAweDEwNzgsIDB4NWFjMCwKKwkweDEwNzgsIDB4NmUwNiwgMHgwMDc4LCAweDZlNTQsIDB4NjEyNCwgMHhhMWU1LCAweDAwMDAsIDB4MDA0MCwKKwkweDZlNTEsIDB4MTA3OCwgMHhhNWM0LCAweDEwNzgsIDB4NWFjYiwgMHgyMDA5LCAweDAwMTQsIDB4MTA3OCwKKwkweDc3NWMsIDB4MGM3ZiwgMHgwMDc4LCAweDZlNTQsIDB4MDI3ZiwgMHgwMTdmLCAweDBkN2YsIDB4MGM3ZiwKKwkweDAwN2MsIDB4MjAwMSwgMHhhOGNkLCAweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDZlNTQsIDB4MGM3ZSwKKwkweDIwNjEsIDB4YThiMSwgMHg2MTI4LCAweGExOTIsIDB4MDAwMywgMHgwMGM4LCAweDZlNDQsIDB4ODEwOCwKKwkweDYxMmEsIDB4MGM3ZiwgMHgxMDc4LCAweDVhYzAsIDB4MTA3OCwgMHg0MjI0LCAweDAwNzgsIDB4NmU1NCwKKwkweDBjN2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDAxN2UsIDB4MDI3ZSwgMHgxMDc4LCAweDVhZDgsIDB4MjA3MSwKKwkweGE4YjEsIDB4NzEzYywgMHg4MWZmLCAweDAwNDAsIDB4NmU5YSwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwKKwkweDAxNDAsIDB4NjkwNCwgMHhhMTk0LCAweDQwMDAsIDB4MDA0MCwgMHg2ZWEwLCAweDY4MDMsIDB4MTAwMCwKKwkweDY4MDMsIDB4MDAwMCwgMHgwMzdlLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LCAweDcwNTgsIDB4MDM3ZiwKKwkweDcxM2MsIDB4MjE2MCwgMHgxMDc4LCAweGE1YzQsIDB4MjAwOSwgMHgwMDRhLCAweDEwNzgsIDB4Nzc1YywKKwkweDAwNzgsIDB4NmU5YSwgMHgwMjdmLCAweDAxN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MDA3YywKKwkweDAwNzgsIDB4NmU4YSwgMHgwZTdlLCAweDIwNzEsIDB4YThiMSwgMHg3MDQ4LCAweGQwODQsIDB4MDA0MCwKKwkweDZlYmMsIDB4NzEzYywgMHg4MWZmLCAweDAwNDAsIDB4NmViYywgMHgyMDcxLCAweDAxMDAsIDB4YTE4OCwKKwkweDAwMDcsIDB4MjEwYywgMHhhMThlLCAweDAwMDYsIDB4MDBjMCwgMHg2ZWJhLCAweDcwMTcsIDB4MDAxMiwKKwkweDAwNzgsIDB4NmViYywgMHg3MDE3LCAweDAwMTYsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwKKwkweDBjN2UsIDB4MDY3ZSwgMHgwNTdlLCAweDA0N2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDYwMTgsIDB4MjA2OCwgMHg2Y2EwLCAweDIwNzEsIDB4YThiMSwgMHg3MDE4LCAweDIwNjgsIDB4OGRmZiwKKwkweDAwNDAsIDB4NmVlNiwgMHg2OGEwLCAweGE0MDYsIDB4MDA0MCwgMHg2ZWRhLCAweDY4NTQsIDB4MjA2OCwKKwkweDAwNzgsIDB4NmVjZiwgMHg2MDEwLCAweDIwNjAsIDB4NjQzYywgMHg2NTQwLCAweDY2NDgsIDB4MmQ2MCwKKwkweDEwNzgsIDB4NDczNiwgMHgwMDQwLCAweDZlZTYsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MDA3ZiwKKwkweDA0N2YsIDB4MDU3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDIwYTMsIDB4MTIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4NzgxYywgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg2ZjAxLCAweDYwOTgsIDB4MDA3OCwKKwkweDZmMDIsIDB4NjAzMCwgMHgyMGEyLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4MjBhOSwKKwkweDAwMTAsIDB4YTAwNiwgMHgyMGEyLCAweDAwZjAsIDB4NmYwYSwgMHgyMGEyLCAweDIwYTIsIDB4NjBjMywKKwkweDAwMmMsIDB4MTA3OCwgMHg2ZGZiLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwKKwkweDEwNzgsIDB4NjczMSwgMHgyMGEzLCAweDBmMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDc4MDgsIDB4MjBhMiwgMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2ZGZiLCAweDE0N2YsIDB4MTU3ZiwKKwkweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3YzIsIDB4MjBhMywKKwkweDAyMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweGE2NDAsIDB4MjAxOSwKKwkweGE2NDEsIDB4MjNhNiwgMHgyMmE2LCAweGEzOTgsIDB4MDAwMiwgMHhhMjkwLCAweDAwMDIsIDB4MDBmMCwKKwkweDZmMzksIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsIDB4MTA3OCwKKwkweDZkZmIsIDB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MDI3ZSwKKwkweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3OTksIDB4MTA3OCwgMHg2N2IwLCAweDc4MTAsIDB4YTA4MCwKKwkweDAwMDAsIDB4MjAwNCwgMHhhMDgwLCAweDAwMTUsIDB4MjA5OCwgMHg3ODA4LCAweGEwODgsIDB4MDAwMiwKKwkweDIxYTgsIDB4NTNhNiwgMHhhMDgwLCAweDAwMDQsIDB4ODAwMywgMHg2MGMyLCAweDEwNzgsIDB4NmRmYiwKKwkweDAyN2YsIDB4MDE3ZiwgMHgxNDdmLCAweDE1N2YsIDB4MDA3YywgMHgxNTdlLCAweDE0N2UsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDIwYTMsIDB4NjIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywKKwkweDAwMDAsIDB4NzgwOCwgMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZkZmIsIDB4MTQ3ZiwKKwkweDE1N2YsIDB4MDA3YywgMHgxNTdlLCAweDE0N2UsIDB4MDE3ZSwgMHgwMjdlLCAweDIwYTEsIDB4MDIwYiwKKwkweDEwNzgsIDB4NjczMSwgMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LCAweGEwODAsIDB4MDAxNywKKwkweDIwOTgsIDB4NzgwOCwgMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LCAweDgwMDMsIDB4NjBjMiwKKwkweDEwNzgsIDB4NmRmYiwgMHgwMjdmLCAweDAxN2YsIDB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MGU3ZSwKKwkweDBjN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE4YjEsIDB4NzAwYywKKwkweDIwNjAsIDB4OGNmZiwgMHgwMDQwLCAweDZmYmIsIDB4MTA3OCwgMHg4ZjAwLCAweDAwYzAsIDB4NmZiMiwKKwkweDEwNzgsIDB4N2M4MywgMHg2MDBjLCAweDAwN2UsIDB4MTA3OCwgMHg3NzJkLCAweDEwNzgsIDB4NzIzMywKKwkweDBjN2YsIDB4MDA3OCwgMHg2ZmE5LCAweDcwMGYsIDB4MDAwMCwgMHg3MDBiLCAweDAwMDAsIDB4MTI3ZiwKKwkweDAwN2YsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MTI3ZSwgMHgxNTdlLCAweDBmN2UsIDB4MGU3ZSwKKwkweDBkN2UsIDB4MGM3ZSwgMHgwMjdlLCAweDAxN2UsIDB4MDA3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwKKwkweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsIDB4YThiMSwgMHg3MDI0LCAweDIwNjAsIDB4OGNmZiwKKwkweDAwNDAsIDB4NzAxNCwgMHgxMDc4LCAweDZlMGYsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NWFjYiwKKwkweDIwMDksIDB4MDAxMywgMHgxMDc4LCAweDc3NWMsIDB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwKKwkweDAwNDAsIDB4NmZmNywgMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwKKwkweDcwMDksIDB4NzgwMywgMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDcwMDksIDB4ZDA4NCwKKwkweDAwNDAsIDB4NmZmZSwgMHg2ODI3LCAweDAwMDEsIDB4MDA3OCwgMHg3MDAwLCAweDAwZjAsIDB4NmZlNiwKKwkweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAwNDAsIDB4NzAwOSwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywKKwkweDAwMDAsIDB4NjgyNCwgMHgwMDdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwKKwkweDBmN2YsIDB4MTU3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MjAwMSwgMHhhNjAwLCAweDIwMDQsIDB4YTA5NiwKKwkweDAwMDEsIDB4MDA0MCwgMHg3MDRlLCAweGEwOTYsIDB4MDAwNCwgMHgwMDQwLCAweDcwNGUsIDB4MTA3OCwKKwkweDVhY2IsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgyMDExLCAweDQxZGMsIDB4MTA3OCwKKwkweDVhNDUsIDB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwgMHgwMDQwLCAweDcwM2MsIDB4NjgyNywKKwkweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHg3MDRlLCAweDc4MDMsIDB4MTAwMCwKKwkweDc4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDcwNGUsIDB4ZDA4NCwgMHgwMDQwLCAweDcwNDMsIDB4NjgyNywKKwkweDAwMDEsIDB4MDA3OCwgMHg3MDQ1LCAweDAwZjAsIDB4NzAyYiwgMHg3ODA0LCAweGEwODQsIDB4MTAwMCwKKwkweDAwNDAsIDB4NzA0ZSwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDAwN2YsIDB4MDE3ZiwKKwkweDAyN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgxNTdmLCAweDEyN2YsIDB4MDA3YywKKwkweDEyN2UsIDB4MTU3ZSwgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDAyN2UsIDB4MDE3ZSwKKwkweDAwN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwKKwkweGE4YjEsIDB4NzAzYywgMHgyMDYwLCAweDhjZmYsIDB4MDA0MCwgMHg3MGQ2LCAweDY4YWYsIDB4OTVmNSwKKwkweDY4MTcsIDB4MDAxMCwgMHgyMDA5LCAweDAwZmEsIDB4ODEwOSwgMHgwMGMwLCAweDcwNzQsIDB4NjhjNywKKwkweDAwMDAsIDB4NjhjYiwgMHgwMDA4LCAweDEwNzgsIDB4NWFkOCwgMHgxMDc4LCAweDFmN2UsIDB4MDQ3ZSwKKwkweDA1N2UsIDB4MjAwOSwgMHgwMTdmLCAweDIxMmMsIDB4MjAwYiwgMHgwMGE1LCAweDIwMjEsIDB4MDE2OSwKKwkweDI0MDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDcwYTUsIDB4NjhjNywKKwkweDAwMDAsIDB4NjhjYiwgMHgwMDA4LCAweDBlN2UsIDB4MGY3ZSwgMHgyMDc5LCAweDAwMjAsIDB4MjA3MSwKKwkweGE5MDgsIDB4NjgxNCwgMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDEyLCAweDY4MTYsIDB4NzgwMywKKwkweDAwMDgsIDB4NzAwMywgMHgwMDAwLCAweDBmN2YsIDB4MGU3ZiwgMHgyNTBhLCAweDA1N2YsIDB4MDQ3ZiwKKwkweGEzOWQsIDB4MDAwMCwgMHgwMGMwLCAweDcwYjAsIDB4MjAwOSwgMHgwMDQ5LCAweDEwNzgsIDB4Nzc1YywKKwkweDIwYTksIDB4MDNlOCwgMHg2ODI0LCAweGQwOTQsIDB4MDA0MCwgMHg3MGMzLCAweDY4MjcsIDB4MDAwNCwKKwkweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NzBkNSwgMHg3ODAzLCAweDEwMDAsIDB4NzgwMywKKwkweDAwMDAsIDB4MDA3OCwgMHg3MGQ1LCAweGQwOGMsIDB4MDA0MCwgMHg3MGNhLCAweDY4MjcsIDB4MDAwMiwKKwkweDAwNzgsIDB4NzBjYywgMHgwMGYwLCAweDcwYjIsIDB4NzgwNCwgMHhhMDg0LCAweDEwMDAsIDB4MDA0MCwKKwkweDcwZDUsIDB4NzgwMywgMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHg2ODI0LCAweDAwN2YsIDB4MDE3ZiwKKwkweDAyN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgxNTdmLCAweDEyN2YsIDB4MDA3YywKKwkweDBkN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHhhOGIxLCAweDZhMDYsIDB4MTI3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4YThiMSwKKwkweDZhMzIsIDB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsIDB4MDY3ZSwKKwkweDAwN2UsIDB4MTI3ZSwgMHgyMDcxLCAweGE4YjEsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4MjA5MSwKKwkweDgwMDAsIDB4OGNmZiwgMHgwMDQwLCAweDcxMzQsIDB4NjAxYywgMHhhMjA2LCAweDAwYzAsIDB4NzEyZiwKKwkweDcwMTQsIDB4YWMzNiwgMHgwMGMwLCAweDcxMGUsIDB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4YWMzNiwKKwkweDAwYzAsIDB4NzExYywgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg3MTFhLCAweDJmMDAsIDB4NzAxMiwKKwkweDAwNzgsIDB4NzExYywgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwNjdlLCAweDJjMDAsIDB4YWYwNiwKKwkweDAwNDAsIDB4NzEyNSwgMHg3ZTBlLCAweDAwNzgsIDB4NzEyNiwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDcyMzMsIDB4MGM3ZiwgMHgwMDc4LCAweDcxMDEsIDB4MmM3OCwKKwkweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDcxMDEsIDB4MTI3ZiwgMHgwMDdmLCAweDA2N2YsIDB4MGM3ZiwKKwkweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY5ZDAsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwKKwkweDIwYTMsIDB4MTAwMCwgMHgwMDc4LCAweDcxOGUsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwKKwkweDEwNzgsIDB4NjlkMCwgMHg3ODEwLCAweDIwYTIsIDB4YTAwNiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwKKwkweDIwYTIsIDB4MjBhMywgMHg0MDAwLCAweDAwNzgsIDB4NzE4ZSwgMHgxNTdlLCAweDE0N2UsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg2OWQwLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwKKwkweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDIwMDAsIDB4MDA3OCwgMHg3MThlLCAweDE1N2UsIDB4MTQ3ZSwKKwkweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY5ZDAsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwKKwkweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MDQwMCwgMHgwMDc4LCAweDcxOGUsIDB4MTU3ZSwKKwkweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjlkMCwgMHg3ODEwLCAweDIwYTIsIDB4YTAwNiwKKwkweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgwMjAwLCAweDEwNzgsIDB4NzIzZSwKKwkweDYwYzMsIDB4MDAyMCwgMHgxMDc4LCAweDZkZmIsIDB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MTI3ZSwKKwkweDBjN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsIDB4MDEwMCwgMHg2MTIwLCAweGQxYjQsIDB4MDBjMCwKKwkweDcxYTYsIDB4ZDFiYywgMHgwMGMwLCAweDcxZjAsIDB4MDA3OCwgMHg3MjMwLCAweDIwMDksIDB4MDE3ZiwKKwkweDIwMGIsIDB4MDBhMSwgMHgxNTdlLCAweDAwN2UsIDB4MGQ3ZSwgMHgyMDY5LCAweDAxNDAsIDB4MjBhOSwKKwkweDAwMWUsIDB4MjAwOSwgMHgwMTY5LCAweDY4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAwNDAsIDB4NzFlNywKKwkweDYwMjAsIDB4ZDBiNCwgMHgwMDQwLCAweDcxZTcsIDB4NjAyNCwgMHhkMDk0LCAweDAwYzAsIDB4NzFlNywKKwkweDIxMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDcxZTcsIDB4MDBmMCwKKwkweDcxYjMsIDB4MDI3ZSwgMHg2MTk4LCAweGExOGMsIDB4MDBmZiwgMHg4MTA3LCAweDYxMzAsIDB4YTE4YywKKwkweDAwZmYsIDB4YTEwZCwgMHg2MDg4LCAweDYyOGMsIDB4NjE4ZSwgMHg2MDhiLCAweGJjOTEsIDB4NjA0MywKKwkweDAwMDEsIDB4NjA0MywgMHgwMDAwLCAweDYwOGEsIDB4NjI4ZSwgMHg2MDI0LCAweGQwOTQsIDB4MDBjMCwKKwkweDcxZTYsIDB4NmEwNCwgMHhhMjk0LCAweDQwMDAsIDB4MDBjMCwgMHg3MWRkLCAweDAyN2YsIDB4MGQ3ZiwKKwkweDAwN2YsIDB4MTU3ZiwgMHgyMDA5LCAweDAxN2YsIDB4MjAwYiwgMHgwMDAwLCAweDAwNzgsIDB4NzIzMCwKKwkweDIwMDksIDB4MDE3ZiwgMHgyMDBiLCAweDAwYTEsIDB4MTU3ZSwgMHgwMDdlLCAweDBkN2UsIDB4MjA2OSwKKwkweDAxNDAsIDB4MjBhOSwgMHgwMDFlLCAweDIwMDksIDB4MDE2OSwgMHg2ODA0LCAweGEwODQsIDB4NDAwMCwKKwkweDAwNDAsIDB4NzIyOSwgMHg2MDIwLCAweGQwYmMsIDB4MDA0MCwgMHg3MjI5LCAweDIxMDQsIDB4YTA4NCwKKwkweDAwMGYsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4NzIyOSwgMHgwMGYwLCAweDcxZmQsIDB4MDI3ZSwKKwkweDYxNjQsIDB4YTE4YywgMHgwMGZmLCAweDgxMDcsIDB4NjEzMCwgMHhhMThjLCAweDAwZmYsIDB4YTEwZCwKKwkweDYwODgsIDB4NjI4YywgMHg2MDhiLCAweGJjOTEsIDB4NjE4ZSwgMHg2MDQzLCAweDAwMDEsIDB4NjA0MywKKwkweDAwMDAsIDB4NjA4YSwgMHg2MjhlLCAweDZhMDQsIDB4YTI5NCwgMHg0MDAwLCAweDAwYzAsIDB4NzIyMywKKwkweDAyN2YsIDB4MGQ3ZiwgMHgwMDdmLCAweDE1N2YsIDB4MjAwOSwgMHgwMTdmLCAweDIwMGIsIDB4MDAwMCwKKwkweDBjN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhOGIxLCAweDcwMjAsIDB4YTAwNSwKKwkweDAwNDAsIDB4NzIzYywgMHg4MDAxLCAweDcwMjIsIDB4MGU3ZiwgMHgwMDdjLCAweDIwYTksIDB4MDAwOCwKKwkweDIwYTIsIDB4MDBmMCwgMHg3MjQwLCAweDIwYTIsIDB4MjBhMiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwKKwkweDBkN2UsIDB4MGM3ZSwgMHgwNzdlLCAweDA2N2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4YThiMSwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHgyMDM5LCAweDAwMDEsIDB4ODdmZiwKKwkweDAwNDAsIDB4NzJlMiwgMHg4Y2ZmLCAweDAwNDAsIDB4NzJlMiwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4NzJkZCwgMHg4OGZmLCAweDAwNDAsIDB4NzI2ZCwgMHgyODAwLCAweGFjMDYsIDB4MDBjMCwKKwkweDcyZGQsIDB4MjAzOSwgMHgwMDAwLCAweDAwNzgsIDB4NzI3OCwgMHg2MDE4LCAweGEyMDYsIDB4MDBjMCwKKwkweDcyZGQsIDB4ODVmZiwgMHgwMDQwLCAweDcyNzgsIDB4NjAyMCwgMHhhMTA2LCAweDAwYzAsIDB4NzJkZCwKKwkweDcwMjQsIDB4YWMwNiwgMHgwMGMwLCAweDcyYTgsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwKKwkweDAwNDAsIDB4NzJhMywgMHgxMDc4LCAweDVhY2IsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwKKwkweDEwNzgsIDB4NzM3OCwgMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwKKwkweGEzODQsIDB4MTAwMCwgMHgwMDQwLCAweDcyOTgsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg3MmEwLCAweDY4MjcsIDB4MDAwMSwKKwkweDAzN2YsIDB4MDA3OCwgMHg3MmE4LCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDAwNzgsIDB4NzJkZCwKKwkweDcwMTQsIDB4YWMzNiwgMHgwMGMwLCAweDcyYWUsIDB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4YWMzNiwKKwkweDAwYzAsIDB4NzJiYywgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg3MmJhLCAweDJmMDAsIDB4NzAxMiwKKwkweDAwNzgsIDB4NzJiYywgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwNjdlLCAweDJjMDAsIDB4YWYwNiwKKwkweDAwNDAsIDB4NzJjNSwgMHg3ZTBlLCAweDAwNzgsIDB4NzJjNiwgMHgyNjc4LCAweDg5ZmYsIDB4MDBjMCwKKwkweDcyZDUsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwKKwkweDcyZDMsIDB4MTA3OCwgMHhhMWNhLCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDcyMzMsIDB4ODhmZiwKKwkweDAwYzAsIDB4NzJlYywgMHgwYzdmLCAweDAwNzgsIDB4NzI1NywgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwKKwkweDAwNzgsIDB4NzI1NywgMHhhMDA2LCAweDEyN2YsIDB4MDA3ZiwgMHgwNjdmLCAweDA3N2YsIDB4MGM3ZiwKKwkweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4NjAxNywgMHgwMDAwLCAweDBjN2YsIDB4YThjNSwKKwkweDAwMDEsIDB4MDA3OCwgMHg3MmUzLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MDY3ZSwKKwkweDAyN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE4YjEsIDB4NzYzOCwKKwkweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsIDB4NzM2NywgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4NzM2MiwgMHg4N2ZmLCAweDAwNDAsIDB4NzMxMywgMHgyNzAwLCAweGFjMDYsIDB4MDBjMCwKKwkweDczNjIsIDB4MDA3OCwgMHg3MzFlLCAweDYwMTgsIDB4YTIwNiwgMHgwMGMwLCAweDczNjIsIDB4ODVmZiwKKwkweDAwNDAsIDB4NzMxZSwgMHg2MDIwLCAweGExMDYsIDB4MDBjMCwgMHg3MzYyLCAweDcwM2MsIDB4YWMwNiwKKwkweDAwYzAsIDB4NzMzMiwgMHgwMzdlLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LCAweDcwNTgsIDB4NzAzMywKKwkweDAwMDAsIDB4NzAzZiwgMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDQ3LCAweDAwMDAsIDB4NzA0YiwKKwkweDAwMDAsIDB4MDM3ZiwgMHg3MDM4LCAweGFjMzYsIDB4MDBjMCwgMHg3MzM4LCAweDY2MGMsIDB4NzYzYSwKKwkweDcwMzQsIDB4YWMzNiwgMHgwMGMwLCAweDczNDYsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsIDB4NzM0NCwKKwkweDJmMDAsIDB4NzAzNiwgMHgwMDc4LCAweDczNDYsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsIDB4MDY3ZSwKKwkweDJjMDAsIDB4YWYwNiwgMHgwMDQwLCAweDczNGYsIDB4N2UwZSwgMHgwMDc4LCAweDczNTAsIDB4MjY3OCwKKwkweDYwMGYsIDB4MDAwMCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4NzM1YSwKKwkweDEwNzgsIDB4YTFjYSwgMHgxMDc4LCAweDhlYzYsIDB4ODdmZiwgMHgwMGMwLCAweDczNzEsIDB4MGM3ZiwKKwkweDAwNzgsIDB4NzMwMiwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDczMDIsIDB4YTAwNiwKKwkweDEyN2YsIDB4MDA3ZiwgMHgwMjdmLCAweDA2N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwKKwkweDAwN2MsIDB4NjAxNywgMHgwMDAwLCAweDBjN2YsIDB4YTdiZCwgMHgwMDAxLCAweDAwNzgsIDB4NzM2OCwKKwkweDBlN2UsIDB4MjA3MSwgMHhhOGIxLCAweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMiwKKwkweDAwYzAsIDB4NzM4NiwgMHg3MDA3LCAweDAwMDUsIDB4MDA3OCwgMHg3Mzg4LCAweDcwMDcsIDB4MDAwMCwKKwkweDBlN2YsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MGM3ZSwgMHgwNjdlLCAweDAyN2UsIDB4MDA3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YThiMSwgMHgyYzEwLCAweDc2MzgsIDB4MjY2MCwKKwkweDI2NzgsIDB4OGNmZiwgMHgwMDQwLCAweDczYzgsIDB4MjIwMCwgMHhhYzA2LCAweDAwYzAsIDB4NzNjMywKKwkweDcwMzgsIDB4YWMzNiwgMHgwMGMwLCAweDczYTYsIDB4NjYwYywgMHg3NjNhLCAweDcwMzQsIDB4YWMzNiwKKwkweDAwYzAsIDB4NzNiNCwgMHgyYzAwLCAweGFmMzYsIDB4MDA0MCwgMHg3M2IyLCAweDJmMDAsIDB4NzAzNiwKKwkweDAwNzgsIDB4NzNiNCwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywgMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwKKwkweDczYmMsIDB4N2UwZSwgMHgwMDc4LCAweDczYmQsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4YTA4NSwKKwkweDAwMDEsIDB4MDA3OCwgMHg3M2M4LCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsIDB4NzM5OSwKKwkweDEyN2YsIDB4MDA3ZiwgMHgwMjdmLCAweDA2N2YsIDB4MGM3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywKKwkweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MDY3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHhhOGIxLCAweDc2MGMsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDA0MCwKKwkweDc0NjksIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMjA2LCAweDAwYzAsIDB4NzQ2NCwKKwkweDcwMjQsIDB4YWMwNiwgMHgwMGMwLCAweDc0MGYsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwKKwkweDAwNDAsIDB4NzQzZCwgMHgxMDc4LCAweDZlMGYsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NzM3OCwKKwkweDcwMjcsIDB4MDAwMCwgMHgwMzdlLCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwKKwkweDAwNDAsIDB4NzQwNiwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwKKwkweDY4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDc0MGUsIDB4NjgyNywgMHgwMDAxLCAweDAzN2YsIDB4NzAwYywKKwkweGFjMzYsIDB4MDBjMCwgMHg3NDE1LCAweDY2MGMsIDB4NzYwZSwgMHg3MDA4LCAweGFjMzYsIDB4MDBjMCwKKwkweDc0MjMsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsIDB4NzQyMSwgMHgyZjAwLCAweDcwMGEsIDB4MDA3OCwKKwkweDc0MjMsIDB4NzAwYiwgMHgwMDAwLCAweDY2MGMsIDB4MDY3ZSwgMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwKKwkweDc0MmMsIDB4N2UwZSwgMHgwMDc4LCAweDc0MmQsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4MTA3OCwKKwkweDhlZWMsIDB4MDBjMCwgMHg3NDQxLCAweDEwNzgsIDB4MjhhNiwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwKKwkweDc0NWQsIDB4MTA3OCwgMHg3YzgzLCAweDAwNzgsIDB4NzQ1ZCwgMHgxMDc4LCAweDczNzgsIDB4MDA3OCwKKwkweDc0MGYsIDB4MTA3OCwgMHg4ZjAwLCAweDAwYzAsIDB4NzQ0OSwgMHgxMDc4LCAweDdjODMsIDB4MDA3OCwKKwkweDc0NWQsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDc0NWQsIDB4NjAxYywKKwkweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDc0NzEsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywKKwkweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4OGViOSwgMHgxMDc4LCAweDhlYzYsIDB4MTA3OCwKKwkweDcyMzMsIDB4MGM3ZiwgMHgwMDc4LCAweDczZGUsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwKKwkweDczZGUsIDB4MTI3ZiwgMHgwMDdmLCAweDA2N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwKKwkweDAwN2MsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg3NDVkLCAweDEwNzgsIDB4YTFjYSwKKwkweDAwNzgsIDB4NzQ1ZCwgMHgwMzdlLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDM5MDgsIDB4YTAwNiwKKwkweGExOTAsIDB4MDAyMCwgMHgyMjFjLCAweGEzOWUsIDB4MjY3NiwgMHgwMGMwLCAweDc0OGIsIDB4ODIxMCwKKwkweDgwMDAsIDB4MDA3OCwgMHg3NDgyLCAweGEwMDUsIDB4MDA0MCwgMHg3NDk3LCAweDIwYTksIDB4MDAyMCwKKwkweDIxOTgsIDB4ODIxMSwgMHhhMjgyLCAweDAwMjAsIDB4MjBjOCwgMHgyMGEwLCAweDUzYTMsIDB4MTQ3ZiwKKwkweDEzN2YsIDB4MTU3ZiwgMHgwMzdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY3YzIsIDB4MjBhMywgMHgwMjAwLCAweDIwYTMsIDB4MDAxNCwgMHg2MGMzLCAweDAwMTQsIDB4MjBhMywKKwkweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwOTksIDB4YThhNSwgMHgyMGE5LCAweDAwMDQsIDB4NTNhNiwKKwkweDIwYTMsIDB4MDAwNCwgMHgyMGEzLCAweDc4NzgsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDEwNzgsIDB4NmRmYiwgMHgwZDdmLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwKKwkweDIwYTMsIDB4MDIxNCwgMHgyMGEzLCAweDAwMTgsIDB4MjBhMywgMHgwODAwLCAweDc4MTAsIDB4YTA4NCwKKwkweGZmMDAsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg3ODEwLCAweGEwODQsIDB4MDBmZiwgMHgyMGEyLCAweDc4MjgsIDB4MjBhMiwKKwkweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE4LCAweDEwNzgsIDB4NmRmYiwKKwkweDAwN2MsIDB4MGQ3ZSwgMHgwMTdlLCAweDJmNjgsIDB4MjAwOSwgMHgwMDM1LCAweDEwNzgsIDB4OTFiYywKKwkweDAwYzAsIDB4NzU1MSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NzMxLCAweDIwYTMsIDB4MTMwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg3ODI4LCAweDIwNjgsIDB4NjgxYywgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwKKwkweDc1MmQsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAxNCwgMHhhMjg2LCAweDAwN2UsIDB4MDBjMCwKKwkweDc1MDcsIDB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmZSwgMHgwMDc4LCAweDc1NDIsIDB4YTI4NiwKKwkweDAwN2YsIDB4MDBjMCwgMHg3NTExLCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmQsIDB4MDA3OCwKKwkweDc1NDIsIDB4ZDJiYywgMHgwMDQwLCAweDc1MjcsIDB4YTI4NiwgMHgwMDgwLCAweDAwYzAsIDB4NzUxZSwKKwkweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmMsIDB4MDA3OCwgMHg3NTQyLCAweGEyZTgsIDB4YTczNSwKKwkweDJkNmMsIDB4NjgxMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMDc4LCAweDc1NDIsIDB4MjBhMywKKwkweDAwMDAsIDB4NjA5OCwgMHgyMGEyLCAweDAwNzgsIDB4NzU0MiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4YTA4MiwgMHgwMDdlLCAweDAwNDgsIDB4NzUzZSwgMHgwZDdlLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg3NTQyLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwMzAsIDB4MjBhMiwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwKKwkweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMGMsIDB4MTA3OCwgMHg2ZGZiLCAweDAxN2YsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4NzgxNywgMHgwMDAxLCAweDc4MDMsIDB4MDAwNiwgMHgwMTdmLCAweDBkN2YsIDB4MDA3YywKKwkweDBkN2UsIDB4MDI3ZSwgMHg3OTI4LCAweDIxNjgsIDB4NjkxYywgMHhhMTg2LCAweDAwMDYsIDB4MDA0MCwKKwkweDc1N2EsIDB4YTE4NiwgMHgwMDAzLCAweDAwNDAsIDB4NzVkNSwgMHhhMTg2LCAweDAwMDUsIDB4MDA0MCwKKwkweDc1YjgsIDB4YTE4NiwgMHgwMDA0LCAweDAwNDAsIDB4NzVhOCwgMHhhMTg2LCAweDAwMDgsIDB4MDA0MCwKKwkweDc1YzIsIDB4NzgwNywgMHgwMDM3LCAweDc4MTMsIDB4MTcwMCwgMHgxMDc4LCAweDc2NDAsIDB4MDI3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDc1ZmQsIDB4MjAwOSwgMHg0MDAwLCAweDY4MDAsIDB4MDA3OSwKKwkweDc1ODEsIDB4NzU5NCwgMHg3NWEyLCAweDc1OTYsIDB4NzVhMiwgMHg3NTlkLCAweDc1OTQsIDB4NzU5NCwKKwkweDc1YTIsIDB4NzVhMiwgMHg3NWEyLCAweDc1YTIsIDB4NzU5NCwgMHg3NTk0LCAweDc1OTQsIDB4NzU5NCwKKwkweDc1OTQsIDB4NzVhMiwgMHg3NTk0LCAweDc1YTIsIDB4MTA3OCwgMHgxMzMyLCAweDY4MjQsIDB4ZDBlNCwKKwkweDAwNDAsIDB4NzU5ZCwgMHhkMGNjLCAweDAwNDAsIDB4NzVhMCwgMHhhMDBlLCAweDAwNzgsIDB4NzVhMiwKKwkweDIwMDksIDB4MjAwMCwgMHg2ODI4LCAweDIwYTIsIDB4NjgyYywgMHgyMGEyLCAweDAwNzgsIDB4NzVmMywKKwkweDEwNzgsIDB4NzVmZCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwMDksIDB4NDAwMCwKKwkweDZhMDAsIDB4YTI4NiwgMHgwMDAyLCAweDAwYzAsIDB4NzViNiwgMHhhMDBlLCAweDAwNzgsIDB4NzVmMywKKwkweDEwNzgsIDB4NzVmZCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwMDksIDB4NDAwMCwKKwkweDAwNzgsIDB4NzVmMywgMHgxMDc4LCAweDc1ZmQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDIwMDksIDB4NDAwMCwgMHhhMjg2LCAweDAwMDUsIDB4MDA0MCwgMHg3NWQyLCAweGEyODYsIDB4MDAwMiwKKwkweDAwYzAsIDB4NzVkMywgMHhhMDBlLCAweDAwNzgsIDB4NzVmMywgMHgxMDc4LCAweDc1ZmQsIDB4NjgxMCwKKwkweDIwNjgsIDB4Njk3YywgMHg2ODEwLCAweGExMTIsIDB4Njk4MCwgMHg2ODE0LCAweGExMDMsIDB4MjBhMiwKKwkweDIyYTIsIDB4NzkyOCwgMHhhMTgwLCAweDAwMDAsIDB4MjAwNCwgMHhhMDhlLCAweDAwMDIsIDB4MDA0MCwKKwkweDc1ZjEsIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4NzVmMSwgMHgyMDA5LCAweDQwMDAsIDB4MDA3OCwKKwkweDc1ZjMsIDB4MjAwOSwgMHgwMDAwLCAweDIxYTIsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxOCwKKwkweDEwNzgsIDB4NmRmYiwgMHgwMjdmLCAweDBkN2YsIDB4MDA3YywgMHgwMzdlLCAweDA0N2UsIDB4MDU3ZSwKKwkweDA2N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjdjMiwgMHhhMDA2LCAweDIwYTMsIDB4MDIwMCwKKwkweDIwYTIsIDB4NzkzNCwgMHgyMWEyLCAweDc5MzgsIDB4MjFhMiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4YTA5MiwgMHgwMDdlLCAweDAwNDgsIDB4NzYyMywgMHgwZDdlLCAweDIwNjksIDB4YTYxYiwKKwkweDJkMmMsIDB4OGQ2OCwgMHgyZDM0LCAweGEwZTgsIDB4YTczNSwgMHgyZDZjLCAweDZiMTAsIDB4NmMxNCwKKwkweDBkN2YsIDB4MDA3OCwgMHg3NjI5LCAweDIwMTksIDB4MDAwMCwgMHg2NDk4LCAweDIwMjksIDB4MDAwMCwKKwkweDY2MzAsIDB4NzgyOCwgMHhhMDgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwKKwkweDc2MzcsIDB4MjVhMiwgMHgyNmEyLCAweDIzYTIsIDB4MjRhMiwgMHgwMDc4LCAweDc2M2IsIDB4MjNhMiwKKwkweDI0YTIsIDB4MjVhMiwgMHgyNmEyLCAweDA2N2YsIDB4MDU3ZiwgMHgwNDdmLCAweDAzN2YsIDB4MDA3YywKKwkweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY3YzIsIDB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwKKwkweDIwYTMsIDB4MDAwOSwgMHg3ODEwLCAweDIwYTIsIDB4NjBjMywgMHgwMDA4LCAweDEwNzgsIDB4NmRmYiwKKwkweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjcyOCwgMHgyMGEzLCAweDE0MDAsIDB4MjBhMywKKwkweDAwMDAsIDB4NzgzNCwgMHgyMGEyLCAweDc4MzgsIDB4MjBhMiwgMHg3ODI4LCAweDIwYTIsIDB4NzgyYywKKwkweDIwYTIsIDB4NzgzMCwgMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwKKwkweDYwYzMsIDB4MDAxMCwgMHgxMDc4LCAweDZkZmIsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwKKwkweDY3YjksIDB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODI4LCAweDIwYTIsIDB4NzgxMCwKKwkweDIwYTIsIDB4NjBjMywgMHgwMDA4LCAweDEwNzgsIDB4NmRmYiwgMHgwMDdjLCAweDE0N2UsIDB4MjBhMSwKKwkweDAyMGIsIDB4MTA3OCwgMHg3Njg5LCAweDYwYzMsIDB4MDAwMCwgMHgxMDc4LCAweDZkZmIsIDB4MTQ3ZiwKKwkweDAwN2MsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDc2YTYsIDB4MGQ3ZSwgMHhhMGU4LCAweGE3MzUsIDB4MmQ2YywKKwkweDY4MTAsIDB4YTA4NSwgMHgwMzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTYxYiwKKwkweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg3NmFlLCAweDIwYTMsIDB4MDMwMCwKKwkweDYyOTgsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDIwYTMsIDB4MDgxOSwKKwkweDIwYTMsIDB4MDAwMCwgMHgxMDc4LCAweDZkZWEsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwKKwkweDdhMDgsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwN2MsIDB4MjA2MSwKKwkweGFkMDAsIDB4MmE3MCwgMHg3MDY0LCAweDcwNGEsIDB4NzA0ZiwgMHhhZDAwLCAweDAwN2MsIDB4MGU3ZSwKKwkweDEyN2UsIDB4MjA3MSwgMHhhNjAwLCAweDIwOTEsIDB4ODAwMCwgMHg3NTQ4LCAweGE1ODIsIDB4MDAxMCwKKwkweDAwNDgsIDB4NzZmOSwgMHg3MDRjLCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwKKwkweDc2ZTUsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTgsIDB4YWMwMiwgMHgwMGM4LCAweDc2ZTEsIDB4MDA3OCwKKwkweDc2ZDQsIDB4MjA2MSwgMHhhZDAwLCAweDAwNzgsIDB4NzZkNCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwKKwkweDc1NGEsIDB4YWNhOCwgMHgwMDEwLCAweDcwNTgsIDB4YTUwMiwgMHgwMGM4LCAweDc2ZjUsIDB4NzU0ZSwKKwkweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHg3MDRmLCAweGFkMDAsIDB4MDA3OCwKKwkweDc2ZjAsIDB4YTAwNiwgMHgwMDc4LCAweDc2ZjIsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsIDB4NzU0OCwKKwkweGE1ODIsIDB4MDAxMCwgMHgwMDQ4LCAweDc3MmEsIDB4NzA0YywgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwKKwkweDAwMDAsIDB4MDA0MCwgMHg3NzE3LCAweGFjZTAsIDB4MDAxMCwgMHg3MDU4LCAweGFjMDIsIDB4MDBjOCwKKwkweDc3MTMsIDB4MDA3OCwgMHg3NzA2LCAweDIwNjEsIDB4YWQwMCwgMHgwMDc4LCAweDc3MDYsIDB4NjAwMywKKwkweDAwMDgsIDB4ODUyOSwgMHg3NTRhLCAweGFjYTgsIDB4MDAxMCwgMHg3MDU4LCAweGE1MDIsIDB4MDBjOCwKKwkweDc3MjYsIDB4NzU0ZSwgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwMDdjLCAweDcwNGYsIDB4YWQwMCwKKwkweDAwNzgsIDB4NzcyMiwgMHhhMDA2LCAweDAwNzgsIDB4NzcyNCwgMHhhYzgyLCAweGFkMDAsIDB4MTA0OCwKKwkweDEzMzIsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsIDB4YWMwMiwgMHgxMGM4LCAweDEzMzIsIDB4YTAwNiwKKwkweDYwMDYsIDB4NjAwYSwgMHg2MDBlLCAweDYwMTIsIDB4NjAxNiwgMHg2MDFhLCAweDYwMWYsIDB4MDAwMCwKKwkweDYwMDMsIDB4MDAwMCwgMHg2MDIyLCAweDYwMjYsIDB4NjAyYSwgMHg2MDJlLCAweDYwMzIsIDB4NjAzNiwKKwkweDYwM2EsIDB4NjAzZSwgMHgyMDYxLCAweGE2MDAsIDB4NjA0OCwgMHg4MDAwLCAweDYwNGEsIDB4YTA4NiwKKwkweDAwMDEsIDB4MDA0MCwgMHg3NzU0LCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDYyZDEsIDB4MTI3ZiwgMHgwMDc4LCAweDc3NTMsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MDA3OSwKKwkweDc3NjEsIDB4Nzc2YSwgMHg3NzdiLCAweDc3OTcsIDB4NzdiMywgMHg5MjBlLCAweDkyMmEsIDB4OTI0NiwKKwkweDc3NmEsIDB4Nzc3YiwgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg3NzczLCAweDEwNzgsIDB4NjFjZCwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExOGUsIDB4MDA0NywgMHgwMGMwLCAweDc3N2EsIDB4YTAxNiwKKwkweDEwNzgsIDB4MTVmYSwgMHgwMDdjLCAweDA2N2UsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MTBjOCwKKwkweDEzMzIsIDB4MTA3OSwgMHg3Nzg1LCAweDA2N2YsIDB4MDA3YywgMHg3Nzk1LCAweDdiMDAsIDB4N2NiMiwKKwkweDc3OTUsIDB4N2QzNiwgMHg3N2NmLCAweDc3OTUsIDB4Nzc5NSwgMHg3YTkyLCAweDgwZjYsIDB4Nzc5NSwKKwkweDc3OTUsIDB4Nzc5NSwgMHg3Nzk1LCAweDc3OTUsIDB4Nzc5NSwgMHgxMDc4LCAweDEzMzIsIDB4MDY3ZSwKKwkweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsIDB4MTMzMiwgMHgxMDc5LCAweDc3YTEsIDB4MDY3ZiwKKwkweDAwN2MsIDB4NzdiMSwgMHg4N2MzLCAweDc3YjEsIDB4NzdiMSwgMHg3N2IxLCAweDc3YjEsIDB4NzdiMSwKKwkweDc3YjEsIDB4ODc2NiwgMHg4OTUxLCAweDc3YjEsIDB4ODdmMywgMHg4ODc5LCAweDg3ZjMsIDB4ODg3OSwKKwkweDc3YjEsIDB4MTA3OCwgMHgxMzMyLCAweDA2N2UsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MTBjOCwKKwkweDEzMzIsIDB4MTA3OSwgMHg3N2JkLCAweDA2N2YsIDB4MDA3YywgMHg3N2NkLCAweDgxM2QsIDB4ODIwZSwKKwkweDgzNjgsIDB4ODRlNCwgMHg3N2NkLCAweDc3Y2QsIDB4NzdjZCwgMHg4MTE2LCAweDg3MGUsIDB4ODcxMiwKKwkweDc3Y2QsIDB4NzdjZCwgMHg3N2NkLCAweDc3Y2QsIDB4ODc0MiwgMHgxMDc4LCAweDEzMzIsIDB4YTFiNiwKKwkweDAwMTUsIDB4MDBjMCwgMHg3N2Q3LCAweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDc3ZGQsIDB4YTFiNiwKKwkweDAwMTYsIDB4MTBjMCwgMHgxMzMyLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDIwYTksIDB4MDAwZSwKKwkweDJlOTgsIDB4NjAxMCwgMHgyMGEwLCAweDUzYTMsIDB4MjBhOSwgMHgwMDA2LCAweDMzMTAsIDB4MzQyMCwKKwkweDkzOTgsIDB4OTRhMCwgMHgzMzE4LCAweDM0MjgsIDB4MjIyZSwgMHgyMzI2LCAweGEyOTAsIDB4MDAwMiwKKwkweGE1YTgsIDB4MDAwMiwgMHhhMzk4LCAweDAwMDIsIDB4YTRhMCwgMHgwMDAyLCAweDAwZjAsIDB4NzdlYywKKwkweDBlN2UsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4NzgwMywgMHg2MDEwLCAweDIwNzAsIDB4NzAwNywKKwkweDAwMDAsIDB4NzAzNywgMHgwMTAzLCAweDBlN2YsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDAzN2UsIDB4NzMzMCwgMHhhMzg2LCAweDAyMDAsIDB4MDBjMCwgMHg3ODE0LCAweDYwMTgsIDB4MjA2OCwKKwkweDY4MTMsIDB4MDBmZiwgMHg2ODE3LCAweGZmZmQsIDB4NjAxMCwgMHhhMDA1LCAweDAwNDAsIDB4NzgxZSwKKwkweDIwNjgsIDB4NjgwNywgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2YjMyLCAweDEwNzgsIDB4NzcyZCwKKwkweDAzN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MjBhOSwgMHgwMDJhLCAweGFlODAsIDB4MDAwYywKKwkweDIwOTgsIDB4NjAxMCwgMHhhMDgwLCAweDAwMDIsIDB4MjBhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAyYSwKKwkweDYwMTAsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4MCwgMHgwMDAyLCAweDIwYTAsIDB4NTNhMywKKwkweDBlN2UsIDB4NjAxMCwgMHgyMDA0LCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDBlN2YsIDB4MTA3OCwKKwkweDc3MmQsIDB4MDE3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGQ3ZSwgMHg2MDNmLCAweDAwMDAsIDB4MmM2OCwKKwkweDAxN2UsIDB4MjAwOSwgMHgwMDM1LCAweDEwNzgsIDB4OTFiYywgMHgwMTdmLCAweDAwYzAsIDB4Nzg1ZiwKKwkweDAyN2UsIDB4NjIyOCwgMHgyMjY4LCAweDAyN2YsIDB4MjA3MSwgMHhhYjhjLCAweDZiMWMsIDB4YTM4NiwKKwkweDAwMDMsIDB4MDA0MCwgMHg3ODYzLCAweGEzODYsIDB4MDAwNiwgMHgwMDQwLCAweDc4NjcsIDB4MTA3OCwKKwkweDc3MmQsIDB4MDA3OCwgMHg3ODY5LCAweDEwNzgsIDB4Nzg2YywgMHgwMDc4LCAweDc4NjksIDB4MTA3OCwKKwkweDc5MzgsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGY3ZSwgMHg2ODEwLCAweDIwNzgsIDB4YTE4NiwKKwkweDAwMTUsIDB4MDA0MCwgMHg3OTFkLCAweGExOGUsIDB4MDAxNiwgMHgwMGMwLCAweDc5MzYsIDB4NzAwYywKKwkweGEwOGMsIDB4ZmYwMCwgMHhhMTg2LCAweDE3MDAsIDB4MDA0MCwgMHg3ODgyLCAweGExODYsIDB4MDMwMCwKKwkweDAwYzAsIDB4NzhmOCwgMHg4ZmZmLCAweDAwYzAsIDB4Nzg4YywgMHg2ODAwLCAweGEwODYsIDB4MDAwZiwKKwkweDAwNDAsIDB4NzhkYiwgMHgwMDc4LCAweDc5MzQsIDB4NjgwOCwgMHhhMDg2LCAweGZmZmYsIDB4MDBjMCwKKwkweDc5MjEsIDB4Nzg0YywgMHhhMDg0LCAweDAwNjAsIDB4YTA4NiwgMHgwMDIwLCAweDAwYzAsIDB4NzhhMiwKKwkweDc5N2MsIDB4NzgxMCwgMHhhMTA2LCAweDAwYzAsIDB4NzkyMSwgMHg3OTgwLCAweDc4MTQsIDB4YTEwNiwKKwkweDAwYzAsIDB4NzkyMSwgMHgxMDc4LCAweDhlYjksIDB4NjgzMCwgMHg3ODUyLCAweDc4NGMsIDB4YzBkYywKKwkweGMwZjQsIDB4YzBkNCwgMHg3ODRlLCAweDAyN2UsIDB4YTAwZSwgMHg2YTE0LCAweDIwMDEsIDB4MDAwYSwKKwkweDEwNzgsIDB4NWMxYywgMHg3ODU0LCAweGEyMGEsIDB4MDA0OCwgMHg3OGI3LCAweDgwMTEsIDB4N2E1NiwKKwkweDgyZmYsIDB4MDI3ZiwgMHgwMGMwLCAweDc4YzMsIDB4MGM3ZSwgMHgyZDYwLCAweDEwNzgsIDB4OGFlMCwKKwkweDBjN2YsIDB4MDA3OCwgMHg3OTM0LCAweDBjN2UsIDB4MGQ3ZSwgMHgyZjY4LCAweDY4MzgsIDB4ZDBmYywKKwkweDAwYzAsIDB4NzhjZSwgMHgxMDc4LCAweDQzNTMsIDB4MDA3OCwgMHg3OGQwLCAweDEwNzgsIDB4NDQzMSwKKwkweDBkN2YsIDB4MGM3ZiwgMHgwMGMwLCAweDc5MjEsIDB4MGM3ZSwgMHgyZDYwLCAweDEwNzgsIDB4NzcyZCwKKwkweDBjN2YsIDB4MDA3OCwgMHg3OTM0LCAweDBjN2UsIDB4MTA3OCwgMHg5MTg3LCAweDAwNDAsIDB4NzhmMSwKKwkweDYwMTMsIDB4MDAwMCwgMHg2ODE4LCAweDYwMWEsIDB4NjAxZiwgMHgwMDAzLCAweDY5MDQsIDB4MGM3ZSwKKwkweDJkNjAsIDB4MTA3OCwgMHg3NzJkLCAweDBjN2YsIDB4MTA3OCwgMHg3NzVjLCAweDBjN2YsIDB4MDA3OCwKKwkweDc5MzQsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjgzZSwgMHgwYzdmLCAweDAwNzgsIDB4NzkzNCwKKwkweDcwMDgsIDB4YTA4NiwgMHgwMDBiLCAweDAwYzAsIDB4NzkxMiwgMHg2MDE4LCAweDIwMGMsIDB4YzFiYywKKwkweDIxMDIsIDB4MGM3ZSwgMHgyZDYwLCAweDc4NTMsIDB4MDAwMywgMHg2MDA3LCAweDAwODUsIDB4NjAwMywKKwkweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZiwKKwkweDAwNzgsIDB4NzkzNCwgMHg3MDBjLCAweGEwODYsIDB4MmEwMCwgMHgwMGMwLCAweDc5MjEsIDB4MjAwMSwKKwkweGE4YTQsIDB4MjAwNCwgMHg2ODNlLCAweDAwNzgsIDB4NzkzNCwgMHgxMDc4LCAweDc5NTMsIDB4MDA3OCwKKwkweDc5MzYsIDB4OGZmZiwgMHgxMDQwLCAweDEzMzIsIDB4MGM3ZSwgMHgwZDdlLCAweDJkNjAsIDB4MmY2OCwKKwkweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMDMsIDB4MTA3OCwgMHg4OWNmLCAweDEwNzgsIDB4OGViOSwKKwkweDEwNzgsIDB4OGVjNiwgMHgwZDdmLCAweDBjN2YsIDB4MTA3OCwgMHg3NzJkLCAweDBmN2YsIDB4MDA3YywKKwkweGExODYsIDB4MDAxNSwgMHgwMGMwLCAweDc5NDIsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjgzZSwKKwkweDAwNzgsIDB4Nzk1MCwgMHhhMThlLCAweDAwMTYsIDB4MDBjMCwgMHg3OTUyLCAweDBjN2UsIDB4MmQwMCwKKwkweDIwNjAsIDB4MTA3OCwgMHhhNDk1LCAweDEwNzgsIDB4NWJjMSwgMHgxMDc4LCAweDc3MmQsIDB4MGM3ZiwKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDAyN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDcyMjgsIDB4N2M4MCwKKwkweDdiN2MsIDB4ZDJmNCwgMHgwMDQwLCAweDc5NjIsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjgzZSwKKwkweDAwNzgsIDB4NzljNiwgMHgwYzdlLCAweDJkNjAsIDB4MTA3OCwgMHg4OWYzLCAweDBjN2YsIDB4NjgwNCwKKwkweGEwODYsIDB4MDA1MCwgMHgwMGMwLCAweDc5N2EsIDB4MGM3ZSwgMHgyZDAwLCAweDIwNjAsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDUwLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZiwKKwkweDAwNzgsIDB4NzljNiwgMHg2ODAwLCAweGEwODYsIDB4MDAwZiwgMHgwMDQwLCAweDc5OWMsIDB4OGZmZiwKKwkweDEwNDAsIDB4MTMzMiwgMHg2ODI0LCAweGQwZGMsIDB4MDBjMCwgMHg3OTljLCAweDY4MDAsIDB4YTA4NiwKKwkweDAwMDQsIDB4MDBjMCwgMHg3OWExLCAweDc4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDc5YTEsIDB4Nzg0YywKKwkweGMwZGMsIDB4YzBmNCwgMHg3ODRlLCAweDc4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDc4NTIsIDB4MjAwMSwKKwkweDAwMDEsIDB4NjgyZSwgMHgwMDc4LCAweDc5YzAsIDB4MjAwMSwgMHgwMDA3LCAweDY4MmUsIDB4MDA3OCwKKwkweDc5YzAsIDB4Nzg0YywgMHhkMGI0LCAweDAwYzAsIDB4NzlhZSwgMHhkMGFjLCAweDAwNDAsIDB4Nzk5YywKKwkweDc4NGMsIDB4ZDBmNCwgMHgwMGMwLCAweDc5OWMsIDB4MDA3OCwgMHg3OThmLCAweGQyZWMsIDB4MDBjMCwKKwkweDc5OWMsIDB4NzAyNCwgMHhhMzA2LCAweDAwYzAsIDB4NzliOSwgMHg3MDIwLCAweGE0MDYsIDB4MDA0MCwKKwkweDc5OWMsIDB4NzAyMCwgMHg2ODM2LCAweDcwMjQsIDB4NjgzYSwgMHgyMDAxLCAweDAwMDUsIDB4NjgyZSwKKwkweDEwNzgsIDB4OGZmMCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg3OWM4LCAweDEwNzgsIDB4NzcyZCwKKwkweDA0N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwZDdlLCAweDAyN2UsIDB4NjAzNCwKKwkweDIwNjgsIDB4NmExYywgMHhhMjg2LCAweDAwMDcsIDB4MDA0MCwgMHg3YTM1LCAweGEyODYsIDB4MDAwMiwKKwkweDAwNDAsIDB4N2EzNSwgMHhhMjg2LCAweDAwMDAsIDB4MDA0MCwgMHg3YTM1LCAweDY4MDgsIDB4NjMzOCwKKwkweGEzMDYsIDB4MDBjMCwgMHg3YTM1LCAweDIwNzEsIDB4YWI4YywgMHhhMTg2LCAweDAwMTUsIDB4MDA0MCwKKwkweDdhMmYsIDB4YTE4ZSwgMHgwMDE2LCAweDAwYzAsIDB4N2EwMiwgMHg2MDMwLCAweGEwODQsIDB4MDBmZiwKKwkweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDdhMDIsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsIDB4MDBjMCwKKwkweDdhMDIsIDB4NjAzNCwgMHhhMDgwLCAweDAwMDksIDB4MjAwYywgMHhjMWRkLCAweGMxZjUsIDB4MjEwMiwKKwkweDAwNzgsIDB4N2EyZiwgMHgwYzdlLCAweDYwMzQsIDB4MjA2MCwgMHg2MTA0LCAweGExODYsIDB4MDA0YiwKKwkweDAwNDAsIDB4N2EyMiwgMHhhMTg2LCAweDAwNGMsIDB4MDA0MCwgMHg3YTIyLCAweGExODYsIDB4MDA0ZCwKKwkweDAwNDAsIDB4N2EyMiwgMHhhMTg2LCAweDAwNGUsIDB4MDA0MCwgMHg3YTIyLCAweGExODYsIDB4MDA1MiwKKwkweDAwNDAsIDB4N2EyMiwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDEwNDAsIDB4MTMzMiwKKwkweDY4NTMsIDB4MDAwMywgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwKKwkweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZiwgMHgwMDc4LCAweDdhMzUsIDB4NjAzNCwKKwkweDIwNjgsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjgzZSwgMHgxMDc4LCAweDc3MmQsIDB4MDI3ZiwKKwkweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MjBhOSwgMHgwMDBlLCAweDJlOTgsIDB4NjAxMCwKKwkweDIwYTAsIDB4NTNhMywgMHhhMWI2LCAweDAwMTUsIDB4MDBjMCwgMHg3YTczLCAweDYwMTgsIDB4MjA2OCwKKwkweDE1N2UsIDB4MDM3ZSwgMHgwMjdlLCAweGFlOTAsIDB4MDAwYywgMHhhMjkwLCAweDAwMDQsIDB4MjBhOSwKKwkweDAwMDQsIDB4YWQ5OCwgMHgwMDBhLCAweDEwNzgsIDB4ODBkZSwgMHgwMjdmLCAweDAzN2YsIDB4MTU3ZiwKKwkweDAwYzAsIDB4N2E3NiwgMHgxNTdlLCAweDAzN2UsIDB4MDI3ZSwgMHhhZTkwLCAweDAwMGMsIDB4YTI5MCwKKwkweDAwMDgsIDB4MjBhOSwgMHgwMDA0LCAweGFkOTgsIDB4MDAwNiwgMHgxMDc4LCAweDgwZGUsIDB4MDI3ZiwKKwkweDAzN2YsIDB4MTU3ZiwgMHgwMGMwLCAweDdhNzYsIDB4NzAzOCwgMHg2ODBhLCAweDcwM2MsIDB4NjgwZSwKKwkweDY4MDAsIDB4YzA4ZCwgMHg2ODAyLCAweDBkN2YsIDB4MDA3OCwgMHg3N2Y4LCAweDEwNzgsIDB4Mjg4MCwKKwkweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDJmMDAsIDB4NjAxYSwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwKKwkweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwKKwkweDQ1MDIsIDB4MTA3OCwgMHg0NTM1LCAweDEwNzgsIDB4NWRkNywgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZiwKKwkweDAwNzgsIDB4N2E3MywgMHgyMTAwLCAweGExYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMzIsIDB4YTFiMiwKKwkweDAwNDAsIDB4MDBjOCwgMHg3YWY3LCAweDAwNzksIDB4N2E5ZCwgMHg3YWViLCAweDdhZGYsIDB4N2FlYiwKKwkweDdhZWIsIDB4N2FlYiwgMHg3YWViLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwKKwkweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwKKwkweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwKKwkweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FlYiwgMHg3YWRkLCAweDdhZWIsIDB4N2FlYiwKKwkweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWViLCAweDdhZGQsIDB4N2FkZCwKKwkweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FlYiwKKwkweDdhZWIsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwgMHg3YWRkLCAweDdhZGQsIDB4N2FkZCwKKwkweDdhZGQsIDB4N2FkZCwgMHg3YWViLCAweDdhZGQsIDB4N2FkZCwgMHgxMDc4LCAweDEzMzIsIDB4NjAwMywKKwkweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDVkZDcsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDYyZDEsIDB4MTI3ZiwgMHgwMDdjLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWRkNywKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjJkMSwgMHgxMjdmLCAweDAwN2MsIDB4MjYwMCwKKwkweDAwNzksIDB4N2FmYSwgMHg3YWZlLCAweDdhZmUsIDB4N2FmZSwgMHg3YWViLCAweDEwNzgsIDB4MTMzMiwKKwkweDYwMDQsIDB4YTBiMiwgMHgwMDQ0LCAweDEwYzgsIDB4MTMzMiwgMHhhMWI2LCAweDAwMTMsIDB4MDBjMCwKKwkweDdiMTAsIDB4YTBiMiwgMHgwMDQwLCAweDAwYzgsIDB4N2M3OSwgMHgyMDA4LCAweDAwNzksIDB4N2JiZiwKKwkweGExYjYsIDB4MDAyNywgMHgwMGMwLCAweDdiN2MsIDB4MTA3OCwgMHg2MWNkLCAweDYwMDQsIDB4MTA3OCwKKwkweDhlZWMsIDB4MDA0MCwgMHg3YjJkLCAweDEwNzgsIDB4OGYwMCwgMHgwMDQwLCAweDdiNzQsIDB4YTA4ZSwKKwkweDAwMjEsIDB4MDA0MCwgMHg3Yjc4LCAweGEwOGUsIDB4MDAyMiwgMHgwMDQwLCAweDdiNzQsIDB4YTA4ZSwKKwkweDAwM2QsIDB4MDA0MCwgMHg3Yjc4LCAweDAwNzgsIDB4N2I2ZiwgMHgxMDc4LCAweDI4YTYsIDB4MjAwMSwKKwkweDAwMDcsIDB4MTA3OCwgMHg0NTAyLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMGMsIDB4MTA3OCwKKwkweDdjODMsIDB4YTE4NiwgMHgwMDdlLCAweDAwYzAsIDB4N2I0MiwgMHgyMDAxLCAweGE2MzMsIDB4MjAxNCwKKwkweGMyODUsIDB4MjIwMiwgMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgyMTEwLCAweDAyN2UsIDB4MjAxOSwKKwkweDAwMjgsIDB4MTA3OCwgMHg3M2QwLCAweDAyN2YsIDB4MTA3OCwgMHhhNGYxLCAweDAzN2YsIDB4MDI3ZiwKKwkweDAxN2YsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjExMCwgMHgyMDE5LCAweDAwMjgsIDB4MTA3OCwKKwkweDVmMDEsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1ZTBhLCAweDBjN2UsIDB4NjAxOCwKKwkweGEwNjUsIDB4MDA0MCwgMHg3YjY1LCAweDEwNzgsIDB4NDdlOSwgMHgwYzdmLCAweDJjMDgsIDB4MTA3OCwKKwkweDlmOGIsIDB4MDc3ZiwgMHgwMzdmLCAweDAyN2YsIDB4MDE3ZiwgMHgxMDc4LCAweDQ1N2YsIDB4MTA3OCwKKwkweDc3MmQsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwgMHg3YzgzLCAweDAwNzgsIDB4N2I2ZiwKKwkweDEwNzgsIDB4N2NhNiwgMHgwMDc4LCAweDdiNmYsIDB4YTE4NiwgMHgwMDE0LCAweDAwYzAsIDB4N2I3MywKKwkweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDI4ODAsIDB4MTA3OCwgMHg4ZWVjLCAweDAwYzAsIDB4N2I5YiwKKwkweDEwNzgsIDB4MjhhNiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDBjLCAweDEwNzgsIDB4N2M4MywKKwkweGExODYsIDB4MDA3ZSwgMHgwMGMwLCAweDdiOTksIDB4MjAwMSwgMHhhNjMzLCAweDIwMGMsIDB4YzE4NSwKKwkweDIxMDIsIDB4MDA3OCwgMHg3YjZmLCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweDdiYTMsIDB4MTA3OCwKKwkweDdjODMsIDB4MDA3OCwgMHg3YjZmLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDMyLCAweDAwYzAsIDB4N2JiNCwKKwkweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGE2ODIsIDB4MjA3OSwgMHgwMDAwLCAweDEwNzgsIDB4MmJkNywKKwkweDBmN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDdiNmYsIDB4NjAwNCwgMHhhMDhlLCAweDAwMjEsIDB4MDA0MCwKKwkweDdiOWYsIDB4YTA4ZSwgMHgwMDIyLCAweDEwNDAsIDB4N2M4MywgMHgwMDc4LCAweDdiNmYsIDB4N2MwMSwKKwkweDdjMDMsIDB4N2MwNywgMHg3YzBiLCAweDdjMGYsIDB4N2MxMywgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwKKwkweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwKKwkweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwKKwkweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YzE3LCAweDdjMjksIDB4N2JmZiwKKwkweDdjMmIsIDB4N2MyOSwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2MyOSwKKwkweDdjMjksIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwKKwkweDdiZmYsIDB4N2M1YywgMHg3YzI5LCAweDdiZmYsIDB4N2MyMywgMHg3YmZmLCAweDdiZmYsIDB4N2JmZiwKKwkweDdjMjUsIDB4N2JmZiwgMHg3YmZmLCAweDdiZmYsIDB4N2MyOSwgMHg3YmZmLCAweDdiZmYsIDB4MTA3OCwKKwkweDEzMzIsIDB4MDA3OCwgMHg3YzI5LCAweDIwMDEsIDB4MDAwYiwgMHgwMDc4LCAweDdjMzYsIDB4MjAwMSwKKwkweDAwMDMsIDB4MDA3OCwgMHg3YzM2LCAweDIwMDEsIDB4MDAwNSwgMHgwMDc4LCAweDdjMzYsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDA3OCwgMHg3YzM2LCAweDIwMDEsIDB4MDAwOSwgMHgwMDc4LCAweDdjMzYsIDB4MTA3OCwKKwkweDYxY2QsIDB4NjAwMywgMHgwMDA1LCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3OCwgMHg3YzM1LCAweDAwNzgsIDB4N2MyOSwgMHgwMDc4LCAweDdjMjksIDB4MTA3OCwKKwkweDQ1MDIsIDB4MDA3OCwgMHg3YzZlLCAweDEwNzgsIDB4NjFjZCwgMHg2MDAzLCAweDAwMDQsIDB4MjAwMSwKKwkweGE4YTIsIDB4MjAwNCwgMHg2MDE2LCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsIDB4NDUwMiwKKwkweDEwNzgsIDB4NjFjZCwgMHgyMDAxLCAweGE4YTQsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwKKwkweDAzN2UsIDB4MjAxOSwgMHhhNjVkLCAweDIzMDQsIDB4YTA4NCwgMHhmZjAwLCAweDAwYzAsIDB4N2M0ZCwKKwkweDIwMTksIDB4YThhMiwgMHgyMzFjLCAweDAwNzgsIDB4N2M1NiwgMHg4MDA3LCAweGEwOWEsIDB4MDAwNCwKKwkweDAwNDgsIDB4N2M0OCwgMHg4MDAzLCAweDgwMWIsIDB4ODMxYiwgMHhhMzE4LCAweDYzMTYsIDB4MDM3ZiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDdjMzUsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsIDB4YTY4MiwKKwkweDIwNzksIDB4MDAwMCwgMHgxMDc4LCAweDJiZDcsIDB4MGY3ZiwgMHgwZTdmLCAweDEwNzgsIDB4NjFjZCwKKwkweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwgMHg3YzM1LCAweDEwNzgsIDB4NjFjZCwKKwkweDYwMDMsIDB4MDAwMiwgMHgyMDAxLCAweGE4YTIsIDB4MjAwNCwgMHg2MDE2LCAweDEwNzgsIDB4NjJkMSwKKwkweDAwN2MsIDB4MjYwMCwgMHgyMDA4LCAweDAwNzksIDB4N2M3ZCwgMHg3YzgxLCAweDdjODEsIDB4N2M4MSwKKwkweDdjNmUsIDB4MTA3OCwgMHgxMzMyLCAweDBlN2UsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4N2M5ZiwKKwkweDYwMTAsIDB4MjA3MCwgMHg3MDM4LCAweGQwZmMsIDB4MDA0MCwgMHg3YzlmLCAweDcwMDcsIDB4MDAwMCwKKwkweDAxN2UsIDB4NjAwNCwgMHhhMDhlLCAweDAwMjEsIDB4MDA0MCwgMHg3Y2ExLCAweGEwOGUsIDB4MDAzZCwKKwkweDAwNDAsIDB4N2NhMSwgMHgwMTdmLCAweDcwMzcsIDB4MDEwMywgMHg3MDMzLCAweDAxMDAsIDB4MGU3ZiwKKwkweDAwN2MsIDB4MDE3ZiwgMHgxMDc4LCAweDdjYTYsIDB4MDA3OCwgMHg3YzlmLCAweDBlN2UsIDB4YWNmMCwKKwkweDAwMDQsIDB4MmU3NCwgMHg3MDAwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDcwMjMsIDB4ODAwMSwKKwkweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwKKwkweDBkN2YsIDB4YTBiMiwgMHgwMDBjLCAweDEwYzgsIDB4MTMzMiwgMHg2NjA0LCAweGE2YjYsIDB4MDA0MywKKwkweDAwYzAsIDB4N2NjNiwgMHgxMDc4LCAweDkxMzQsIDB4MDA3OCwgMHg3ZDI1LCAweDY2MDQsIDB4YTZiNiwKKwkweDAwMzMsIDB4MDBjMCwgMHg3Y2NmLCAweDEwNzgsIDB4OTBkOCwgMHgwMDc4LCAweDdkMjUsIDB4NjYwNCwKKwkweGE2YjYsIDB4MDAyOCwgMHgwMGMwLCAweDdjZDgsIDB4MTA3OCwgMHg4ZjJmLCAweDAwNzgsIDB4N2QyNSwKKwkweDY2MDQsIDB4YTZiNiwgMHgwMDI5LCAweDAwYzAsIDB4N2NlMSwgMHgxMDc4LCAweDhmNDksIDB4MDA3OCwKKwkweDdkMjUsIDB4NjYwNCwgMHhhNmI2LCAweDAwMWYsIDB4MDBjMCwgMHg3Y2VhLCAweDEwNzgsIDB4NzdkZSwKKwkweDAwNzgsIDB4N2QyNSwgMHg2NjA0LCAweGE2YjYsIDB4MDAwMCwgMHgwMGMwLCAweDdjZjMsIDB4MTA3OCwKKwkweDdhM2IsIDB4MDA3OCwgMHg3ZDI1LCAweDY2MDQsIDB4YTZiNiwgMHgwMDIyLCAweDAwYzAsIDB4N2NmYywKKwkweDEwNzgsIDB4NzgwNywgMHgwMDc4LCAweDdkMjUsIDB4NjYwNCwgMHhhNmI2LCAweDAwMzUsIDB4MDBjMCwKKwkweDdkMDUsIDB4MTA3OCwgMHg3ODQzLCAweDAwNzgsIDB4N2QyNSwgMHg2NjA0LCAweGE2YjYsIDB4MDAzOSwKKwkweDAwYzAsIDB4N2QwZSwgMHgxMDc4LCAweDc5Y2MsIDB4MDA3OCwgMHg3ZDI1LCAweDY2MDQsIDB4YTZiNiwKKwkweDAwM2QsIDB4MDBjMCwgMHg3ZDE3LCAweDEwNzgsIDB4NzgyMywgMHgwMDc4LCAweDdkMjUsIDB4YTFiNiwKKwkweDAwMTUsIDB4MDBjMCwgMHg3ZDFmLCAweDEwNzksIDB4N2QyYSwgMHgwMDc4LCAweDdkMjUsIDB4YTFiNiwKKwkweDAwMTYsIDB4MDBjMCwgMHg3ZDI2LCAweDEwNzksIDB4N2U3ZiwgMHgwMDdjLCAweDEwNzgsIDB4Nzc3MywKKwkweDAwNzgsIDB4N2QyNSwgMHg3ZDRlLCAweDdkNTEsIDB4N2Q0ZSwgMHg3ZDljLCAweDdkNGUsIDB4N2UxMywKKwkweDdlOGIsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdlNTcsIDB4N2Q0ZSwgMHg3ZTZkLCAweGExYjYsIDB4MDA0OCwKKwkweDAwNDAsIDB4N2Q0MiwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MTA3OCwKKwkweDE1ZmEsIDB4MDA3YywgMHgwZTdlLCAweGFjZjAsIDB4MDAwNCwgMHgyZTc0LCAweDcwMDAsIDB4MjA3MCwKKwkweDcwMzcsIDB4MDEwMywgMHgwZTdmLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDAwMDUsIDB4MDAwNSwKKwkweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsIDB4NzA4MCwgMHhhMDg2LCAweDAwNzQsIDB4MDBjMCwKKwkweDdkODUsIDB4MTA3OCwgMHg5ZjVmLCAweDAwYzAsIDB4N2Q3NywgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwKKwkweDcwMzAsIDB4ZDA4YywgMHgwMDQwLCAweDdkNmEsIDB4NjgwMCwgMHhkMGJjLCAweDAwNDAsIDB4N2Q2YSwKKwkweGMwYzUsIDB4NjgwMiwgMHgxMDc4LCAweDdkODksIDB4MGQ3ZiwgMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwKKwkweDQ1MDIsIDB4MTA3OCwgMHgyOGE2LCAweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDdkODcsIDB4MjAwMSwKKwkweDAwMGEsIDB4MTA3OCwgMHg0NTAyLCAweDEwNzgsIDB4MjhhNiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDEsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwNzgsIDB4N2Q4NywgMHgxMDc4LCAweDdkZmYsIDB4MGU3ZiwKKwkweDAwN2MsIDB4NjgwMCwgMHhkMDg0LCAweDAwNDAsIDB4N2Q5YiwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwKKwkweDQ0ZWUsIDB4MjA2OSwgMHhhNjUyLCAweDY4MDQsIDB4ZDBhNCwgMHgwMDQwLCAweDdkOWIsIDB4MjAwMSwKKwkweDAwMDYsIDB4MTA3OCwgMHg0NTM1LCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDExLCAweGE2MjAsIDB4MjIwNCwKKwkweGEwODYsIDB4MDA3NCwgMHgwMGMwLCAweDdkZmIsIDB4NjAxOCwgMHgyMDY4LCAweDZhYTAsIDB4YTI4NiwKKwkweDAwN2UsIDB4MDBjMCwgMHg3ZGFmLCAweDEwNzgsIDB4N2Y5YiwgMHgwMDc4LCAweDdkZmQsIDB4MTA3OCwKKwkweDdmOTEsIDB4NjAxOCwgMHgyMDY4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LCAweGEyODYsIDB4MDA4MCwKKwkweDAwYzAsIDB4N2RkMywgMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZjLCAweDYwMTAsIDB4YTAwNSwKKwkweDAwNDAsIDB4N2RjOSwgMHgyMDY4LCAweDY4MDcsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NjgzMywKKwkweDAyMDAsIDB4MjAwMSwgMHgwMDA2LCAweDEwNzgsIDB4NDUwMiwgMHgxMDc4LCAweDI4YTYsIDB4MTA3OCwKKwkweDc3MmQsIDB4MDA3OCwgMHg3ZGZkLCAweDBlN2UsIDB4MjA3MSwgMHhhNjMzLCAweDJlMDQsIDB4ZDA5YywKKwkweDAwNDAsIDB4N2RlZSwgMHgyMDcxLCAweGFiODAsIDB4NzEwOCwgMHg3MjBjLCAweGExOGMsIDB4MDBmZiwKKwkweDAwYzAsIDB4N2RlNiwgMHhhMjg0LCAweGZmMDAsIDB4MDA0MCwgMHg3ZGVlLCAweDYwMTgsIDB4MjA3MCwKKwkweDcwYTAsIDB4ZDBiYywgMHgwMGMwLCAweDdkZWUsIDB4NzExMiwgMHg3MjE2LCAweDBlN2YsIDB4MjAwMSwKKwkweDAwMDQsIDB4MTA3OCwgMHg0NTAyLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDMsIDB4MTA3OCwKKwkweDVkZDcsIDB4MDA3OCwgMHg3ZGZkLCAweDEwNzgsIDB4N2RmZiwgMHgwZDdmLCAweDAwN2MsIDB4MjAwMSwKKwkweDAwMDcsIDB4MTA3OCwgMHg0NTAyLCAweDIwMDEsIDB4YTYwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywKKwkweDAwYzAsIDB4N2UwZSwgMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NTM1LCAweDEwNzgsIDB4MjhhNiwKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAwLCAweDcwODAsIDB4YTA4NiwKKwkweDAwMTQsIDB4MDBjMCwgMHg3ZTUxLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4N2UyNiwKKwkweDYwMTAsIDB4YTAwNSwgMHgwMGMwLCAweDdlMjYsIDB4MTA3OCwgMHgzNjk5LCAweDBkN2UsIDB4NjAxOCwKKwkweDIwNjgsIDB4MTA3OCwgMHg0NjQ5LCAweDEwNzgsIDB4N2Q4OSwgMHgwZDdmLCAweDEwNzgsIDB4ODA0MywKKwkweDAwYzAsIDB4N2U1MSwgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHg2ODkwLCAweDBkN2YsIDB4YTAwNSwKKwkweDAwNDAsIDB4N2U1MSwgMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwgMHg0NTAyLCAweDBlN2UsIDB4NjAxMCwKKwkweGEwMDUsIDB4MDA0MCwgMHg3ZTRhLCAweDIwNzAsIDB4NzAwNywgMHgwMDAwLCAweDcwMzcsIDB4MDEwMywKKwkweDcwMzMsIDB4MDIwMCwgMHgwZTdmLCAweDEwNzgsIDB4MjhhNiwgMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwKKwkweDdlNTUsIDB4MTA3OCwgMHg3YzgzLCAweDEwNzgsIDB4N2RmZiwgMHgwZTdmLCAweDAwN2MsIDB4MjAxMSwKKwkweGE2MjAsIDB4MjIwNCwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHg3ZTZhLCAweDIwMDEsIDB4MDAwMiwKKwkweDEwNzgsIDB4NDUwMiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDEwNzgsIDB4NWRkNywKKwkweDAwNzgsIDB4N2U2YywgMHgxMDc4LCAweDdkZmYsIDB4MDA3YywgMHgyMDExLCAweGE2MjAsIDB4MjIwNCwKKwkweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDdlN2MsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDUwMiwKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDdlN2UsIDB4MTA3OCwgMHg3ZGZmLCAweDAwN2MsIDB4N2Q0ZSwKKwkweDdlOTcsIDB4N2Q0ZSwgMHg3ZWQyLCAweDdkNGUsIDB4N2Y0NCwgMHg3ZThiLCAweDdkNGUsIDB4N2Q0ZSwKKwkweDdmNTksIDB4N2Q0ZSwgMHg3ZjZjLCAweDY2MDQsIDB4YTY4NiwgMHgwMDAzLCAweDAwNDAsIDB4N2UxMywKKwkweGE2YjYsIDB4MDAxZSwgMHgwMGMwLCAweDdlOTYsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDBjN2UsIDB4MTA3OCwgMHg3ZjdmLCAweDAwYzAsIDB4N2VhZCwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwKKwkweDQ0ZWUsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsIDB4NDUwMiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDIsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwNzgsIDB4N2VjZiwgMHgyMDA5LCAweGFiOGUsIDB4MjEwNCwKKwkweGEwODYsIDB4MDAwOSwgMHgwMGMwLCAweDdlYzIsIDB4NjAxOCwgMHgyMDY4LCAweDY4NDAsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTAwNSwgMHgwMDQwLCAweDdlY2QsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTcsIDB4MDAwYSwKKwkweDAwNzgsIDB4N2VjZiwgMHgyMDA5LCAweGFiOGYsIDB4MjEwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwKKwkweDE5MDAsIDB4MDBjMCwgMHg3ZWNkLCAweDAwNzgsIDB4N2VhMSwgMHgxMDc4LCAweDdkZmYsIDB4MGM3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDdmOGUsIDB4MDBjMCwgMHg3ZWU2LCAweDIwMDEsIDB4MDAwMCwKKwkweDEwNzgsIDB4NDRlZSwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NTAyLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDVkZDcsIDB4MDA3OCwgMHg3ZjEyLCAweDEwNzgsIDB4N2M4MywKKwkweDIwMDksIDB4YWI4ZSwgMHgyMTM0LCAweGE2YjQsIDB4MDBmZiwgMHhhNjg2LCAweDAwMDUsIDB4MDA0MCwKKwkweDdmMTMsIDB4YTY4NiwgMHgwMDBiLCAweDAwNDAsIDB4N2YxMCwgMHgyMDA5LCAweGFiOGYsIDB4MjEwNCwKKwkweGEwODQsIDB4ZmYwMCwgMHgwMGMwLCAweDdmMDAsIDB4YTY4NiwgMHgwMDA5LCAweDAwNDAsIDB4N2YxMywKKwkweGEwODYsIDB4MTkwMCwgMHgwMGMwLCAweDdmMTAsIDB4YTY4NiwgMHgwMDA5LCAweDAwNDAsIDB4N2YxMywKKwkweDIwMDEsIDB4MDAwNCwgMHgxMDc4LCAweDQ1MDIsIDB4MTA3OCwgMHg3NzJkLCAweDAwNzgsIDB4N2YxMiwKKwkweDEwNzgsIDB4N2RmZiwgMHgwMDdjLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGQwNiwKKwkweDAwNDAsIDB4N2YyMSwgMHg2ODM4LCAweGQwZmMsIDB4MDA0MCwgMHg3ZjIxLCAweDBkN2YsIDB4MDA3OCwKKwkweDdmMTAsIDB4NjAxOCwgMHgyMDY4LCAweDY4NDAsIDB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDA0MCwKKwkweDdmMzIsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTcsIDB4MDAwYSwgMHg2MDA3LCAweDAwMTYsIDB4MGQ3ZiwKKwkweDAwNzgsIDB4N2YxMiwgMHg2OGEwLCAweGEwODYsIDB4MDA3ZSwgMHgwMGMwLCAweDdmM2YsIDB4MGU3ZSwKKwkweDIwNzEsIDB4YTYwMCwgMHgxMDc4LCAweDQyYjgsIDB4MGU3ZiwgMHgwMDc4LCAweDdmNDEsIDB4MTA3OCwKKwkweDI4ODAsIDB4MGQ3ZiwgMHgwMDc4LCAweDdmMTAsIDB4MTA3OCwgMHg3ZjhlLCAweDAwYzAsIDB4N2Y1NCwKKwkweDIwMDEsIDB4MDAwNCwgMHgxMDc4LCAweDQ1MDIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMywKKwkweDEwNzgsIDB4NWRkNywgMHgwMDc4LCAweDdmNTgsIDB4MTA3OCwgMHg3YzgzLCAweDEwNzgsIDB4N2RmZiwKKwkweDAwN2MsIDB4MTA3OCwgMHg3ZjhlLCAweDAwYzAsIDB4N2Y2OSwgMHgyMDAxLCAweDAwMDgsIDB4MTA3OCwKKwkweDQ1MDIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwNSwgMHgxMDc4LCAweDVkZDcsIDB4MDA3OCwKKwkweDdmNmIsIDB4MTA3OCwgMHg3ZGZmLCAweDAwN2MsIDB4MTA3OCwgMHg3ZjhlLCAweDAwYzAsIDB4N2Y3YywKKwkweDIwMDEsIDB4MDAwYSwgMHgxMDc4LCAweDQ1MDIsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwKKwkweDEwNzgsIDB4NWRkNywgMHgwMDc4LCAweDdmN2UsIDB4MTA3OCwgMHg3ZGZmLCAweDAwN2MsIDB4MjAwOSwKKwkweGFiOGUsIDB4MjEwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg3ZjhkLCAweDIwMDksIDB4YWI4ZiwKKwkweDIxMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MmEwMCwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwKKwkweDAwN2MsIDB4MGM3ZSwgMHgwMTdlLCAweGFjODgsIDB4MDAwNiwgMHgyMTY0LCAweDEwNzgsIDB4NDVkNiwKKwkweDAxN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDAzN2UsIDB4MDE3ZSwKKwkweDYwMTgsIDB4MjA2OCwgMHgyMDcxLCAweGE2MzMsIDB4MmUwNCwgMHhhMDg1LCAweDAwMDMsIDB4MjA3MiwKKwkweDEwNzgsIDB4ODAxNCwgMHgwMDQwLCAweDdmZDksIDB4MjAwOSwgMHhhNjMzLCAweDIxMDQsIDB4YzBjZCwKKwkweDIwMGEsIDB4MjAwMSwgMHhhNjUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDdmYzIsIDB4YTAwNiwKKwkweDIwMjAsIDB4MjAwOSwgMHgwMDJhLCAweDEwNzgsIDB4YTIxZCwgMHgyMDAxLCAweGE2MGMsIDB4MjAwYywKKwkweGMxOTUsIDB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4Mjg0ZiwKKwkweDIwNzEsIDB4YTYwMCwgMHgxMDc4LCAweDI2NzcsIDB4MGM3ZSwgMHgxNTdlLCAweDIwYTksIDB4MDA4MSwKKwkweDIwMDksIDB4MDA3ZiwgMHgxMDc4LCAweDI5OGUsIDB4ODEwOCwgMHgwMGYwLCAweDdmZDIsIDB4MTU3ZiwKKwkweDBjN2YsIDB4MTA3OCwgMHg3ZjkxLCAweDY4MTMsIDB4MDBmZiwgMHg2ODE3LCAweGZmZmUsIDB4MjA3MSwKKwkweGFiODAsIDB4MjA3OSwgMHgwMTAwLCAweDJlMDQsIDB4YTA4NCwgMHgwMGZmLCAweDIwNjksIDB4YTYxYiwKKwkweDIwNmEsIDB4NzhlNiwgMHgwMDdlLCAweDhlNzAsIDB4MmUwNCwgMHgyMDY5LCAweGE2MWMsIDB4MjA2YSwKKwkweDc4ZWEsIDB4YTA4NCwgMHhmZjAwLCAweDAxN2YsIDB4YTEwNSwgMHgyMDA5LCAweGE2MjYsIDB4MjAwYSwKKwkweDIwNjksIDB4YWI4ZSwgMHgyMDcxLCAweGE4OWUsIDB4NjgxMCwgMHgyMDcyLCAweDY4MTQsIDB4NzAwNiwKKwkweDY4MTgsIDB4NzAwYSwgMHg2ODFjLCAweDcwMGUsIDB4MTA3OCwgMHg5MDZlLCAweDIwMDEsIDB4MDAwNiwKKwkweDEwNzgsIDB4NDUwMiwgMHgxMDc4LCAweDI4YTYsIDB4MTA3OCwgMHg3NzJkLCAweDAxN2YsIDB4MDM3ZiwKKwkweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwMzdlLCAweDBlN2UsIDB4MTU3ZSwKKwkweDIwMTksIDB4YTYyNiwgMHgyMzFjLCAweDgzZmYsIDB4MDA0MCwgMHg4MDNlLCAweDIwNzEsIDB4YWI4MCwKKwkweDJlMTQsIDB4YTI5NCwgMHgwMGZmLCAweDcwMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEyMDUsIDB4YTMwNiwKKwkweDAwYzAsIDB4ODAzZSwgMHgyMDExLCAweGFiOTYsIDB4YWQ5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwKKwkweDEwNzgsIDB4ODBkZSwgMHgwMGMwLCAweDgwM2UsIDB4MjAxMSwgMHhhYjlhLCAweGFkOTgsIDB4MDAwNiwKKwkweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDgwZGUsIDB4MDBjMCwgMHg4MDNlLCAweDE1N2YsIDB4MGU3ZiwKKwkweDAzN2YsIDB4MDI3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhYjhjLCAweDcwMDQsIDB4YTA4NiwKKwkweDAwMTQsIDB4MDBjMCwgMHg4MDY2LCAweDcwMDgsIDB4YTA4NiwgMHgwODAwLCAweDAwYzAsIDB4ODA2NiwKKwkweDcwMGMsIDB4ZDBlYywgMHgwMDQwLCAweDgwNjQsIDB4YTA4NCwgMHgwZjAwLCAweGEwODYsIDB4MDEwMCwKKwkweDAwYzAsIDB4ODA2NCwgMHg3MDI0LCAweGQwYTQsIDB4MDBjMCwgMHg4MDYxLCAweGQwYWMsIDB4MDA0MCwKKwkweDgwNjQsIDB4YTAwNiwgMHgwMDc4LCAweDgwNjYsIDB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MDA3YywKKwkweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA3N2UsIDB4MDU3ZSwgMHgwNDdlLCAweDAyN2UsIDB4MDA3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4YThiYSwgMHgyNTJjLCAweDIwMjEsIDB4YThjMCwKKwkweDI0MjQsIDB4MjA2MSwgMHhhZDAwLCAweDIwNzEsIDB4YTYwMCwgMHg3MjQ4LCAweDcwNjQsIDB4YTIwMiwKKwkweDAwYzgsIDB4ODBjYywgMHgxMDc4LCAweGEyNDIsIDB4MDA0MCwgMHg4MGM0LCAweDY3MWMsIDB4YTc4NiwKKwkweDAwMDEsIDB4MDA0MCwgMHg4MGM0LCAweGE3ODYsIDB4MDAwNywgMHgwMDQwLCAweDgwYzQsIDB4MjUwMCwKKwkweGFjMDYsIDB4MDA0MCwgMHg4MGM0LCAweDI0MDAsIDB4YWMwNiwgMHgwMDQwLCAweDgwYzQsIDB4MGM3ZSwKKwkweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4ODA5ZiwgMHgxMDc4LCAweDE3NTcsIDB4YTc4NiwKKwkweDAwMDgsIDB4MDBjMCwgMHg4MGFlLCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweDgwYWUsIDB4MGM3ZiwKKwkweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDhlYzYsIDB4MDA3OCwgMHg4MGM0LCAweDYwMTAsIDB4MjA2OCwKKwkweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDgwYzEsIDB4YTc4NiwgMHgwMDAzLCAweDAwYzAsIDB4ODBkNiwKKwkweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwKKwkweDhlYjksIDB4MTA3OCwgMHg4ZWM2LCAweDBjN2YsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTgsIDB4YWMwMiwKKwkweDAwYzgsIDB4ODBjYywgMHgwMDc4LCAweDgwN2QsIDB4MTI3ZiwgMHgwMDdmLCAweDAyN2YsIDB4MDQ3ZiwKKwkweDA1N2YsIDB4MDc3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweGE3ODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4ODBiOCwgMHgxMDc4LCAweGExY2EsIDB4MDA3OCwgMHg4MGMxLCAweDIyMGMsIDB4MjMwNCwKKwkweGExMDYsIDB4MDBjMCwgMHg4MGU5LCAweDgyMTAsIDB4ODMxOCwgMHgwMGYwLCAweDgwZGUsIDB4YTAwNiwKKwkweDAwN2MsIDB4MjMwNCwgMHhhMTAyLCAweDAwNDgsIDB4ODBmMSwgMHgyMDAxLCAweDAwMDEsIDB4MDA3OCwKKwkweDgwZjMsIDB4MjAwMSwgMHgwMDAwLCAweGExOGQsIDB4MDAwMSwgMHgwMDdjLCAweDYwMDQsIDB4YTA4YSwKKwkweDAwNDQsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzgsIDB4OGVlYywgMHgwMDQwLCAweDgxMDUsIDB4MTA3OCwKKwkweDhmMDAsIDB4MDA0MCwgMHg4MTEyLCAweDAwNzgsIDB4ODEwYiwgMHgxMDc4LCAweDI4YTYsIDB4MTA3OCwKKwkweDhmMDAsIDB4MDA0MCwgMHg4MTEyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3YywgMHgxMDc4LCAweDdjODMsIDB4MDA3OCwgMHg4MTBiLCAweGExODIsIDB4MDA0MCwKKwkweDAwNzksIDB4ODExYSwgMHg4MTJkLCAweDgxMmQsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmQsIDB4ODEyZCwKKwkweDgxMmQsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmQsIDB4ODEyZCwgMHg4MTJmLCAweDgxMmYsIDB4ODEyZiwKKwkweDgxMmYsIDB4ODEyZCwgMHg4MTJkLCAweDgxMmQsIDB4ODEyZiwgMHgxMDc4LCAweDEzMzIsIDB4NjAwYiwKKwkweGZmZmYsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1ZDhhLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MTA3OCwgMHg2MmQxLCAweDEyN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwKKwkweDgxNDYsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsIDB4MDA3OSwgMHg4MWQxLCAweGExODYsIDB4MDAyNywKKwkweDAwYzAsIDB4ODE2OCwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHgyODgwLCAweDBkN2UsIDB4NjExMCwKKwkweDIxNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4ODE2MiwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwKKwkweDAwMjksIDB4Njg0NywgMHgwMDAwLCAweDY5NGMsIDB4YzFjNSwgMHg2OTRlLCAweDEwNzgsIDB4NGE3MywKKwkweDEwNzgsIDB4OGViOSwgMHgwZDdmLCAweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywKKwkweGExODYsIDB4MDAxNCwgMHgwMGMwLCAweDgxNzEsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsIDB4MDA3OSwKKwkweDgxOTksIDB4YTE4NiwgMHgwMDQ2LCAweDAwNDAsIDB4ODE3ZCwgMHhhMTg2LCAweDAwNDUsIDB4MDA0MCwKKwkweDgxN2QsIDB4YTE4NiwgMHgwMDQ3LCAweDEwYzAsIDB4MTMzMiwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwKKwkweGQwODQsIDB4MDA0MCwgMHg4MTk2LCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDAwN2UsIDB4MDE3ZSwKKwkweDAyN2UsIDB4MTA3OCwgMHg1YzU2LCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsIDB4NjAwMCwKKwkweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDgxOTYsIDB4MDA3OCwgMHg4MjBlLCAweDEwNzgsIDB4Nzc3MywKKwkweDAwN2MsIDB4ODFhZSwgMHg4MWFjLCAweDgxYWMsIDB4ODFhYywgMHg4MWFjLCAweDgxYWMsIDB4ODFhYywKKwkweDgxYWMsIDB4ODFhYywgMHg4MWFjLCAweDgxYWMsIDB4ODFjYSwgMHg4MWNhLCAweDgxY2EsIDB4ODFjYSwKKwkweDgxYWMsIDB4ODFjYSwgMHg4MWFjLCAweDgxY2EsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwKKwkweDBkN2UsIDB4NjExMCwgMHgyMTY4LCAweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDgxYzQsIDB4NjgzNywKKwkweDAxMDMsIDB4Njg0YiwgMHgwMDA2LCAweDY4NDcsIDB4MDAwMCwgMHg2ODUwLCAweGMwZWMsIDB4Njg1MiwKKwkweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDhlYjksIDB4MGQ3ZiwgMHgxMDc4LCAweDc3MmQsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3YywgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg3NzJkLCAweDEwNzgsIDB4NjJkMSwKKwkweDAwN2MsIDB4ODFlNiwgMHg4MWU0LCAweDgxZTQsIDB4ODFlNCwgMHg4MWU0LCAweDgxZTQsIDB4ODFlNCwKKwkweDgxZTQsIDB4ODFlNCwgMHg4MWU0LCAweDgxZTQsIDB4ODFmOCwgMHg4MWY4LCAweDgxZjgsIDB4ODFmOCwKKwkweDgxZTQsIDB4ODIwNywgMHg4MWU0LCAweDgxZjgsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwKKwkweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDAyLCAweDEwNzgsIDB4NjJkMSwKKwkweDYwMTAsIDB4YTA4OCwgMHgwMDEzLCAweDIxMDQsIDB4YTA4NSwgMHgwNDAwLCAweDIwMGEsIDB4MDA3YywKKwkweDEwNzgsIDB4NjFjZCwgMHgyMDAxLCAweGE4YTIsIDB4MjAwNCwgMHg2MDE2LCAweDIwMDEsIDB4YThhNCwKKwkweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMGYsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwKKwkweDYxY2QsIDB4MTA3OCwgMHg3NzJkLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExODIsIDB4MDA0MCwKKwkweDAwNzksIDB4ODIxMiwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNywKKwkweDgzMjcsIDB4ODM1OSwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwKKwkweDgyMjUsIDB4ODIyNSwgMHg4MjI1LCAweDgyMjUsIDB4ODIyNSwgMHgxMDc4LCAweDEzMzIsIDB4MGU3ZSwKKwkweDBkN2UsIDB4NjAzZiwgMHgwMDAwLCAweDIwNzEsIDB4YWI4MCwgMHg3MTI0LCAweDYxMGEsIDB4MjA3MSwKKwkweGFiOGMsIDB4NjExMCwgMHgyMTY4LCAweDc2MTQsIDB4YTZiNCwgMHgwZmZmLCAweDg2ZmYsIDB4MDA0MCwKKwkweDgyZTksIDB4YTY4YywgMHgwYzAwLCAweDAwNDAsIDB4ODI1ZSwgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwKKwkweDQ5NjMsIDB4MGY3ZiwgMHgwMDQwLCAweDgyNWEsIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODI1YSwKKwkweDYwMjQsIDB4ZDBkYywgMHgwMGMwLCAweDgyNWEsIDB4Njg1MCwgMHhkMGJjLCAweDAwYzAsIDB4ODI1YSwKKwkweDczMTgsIDB4NjgxNCwgMHhhMzA2LCAweDAwYzAsIDB4ODMwMSwgMHg3MzFjLCAweDY4MTAsIDB4YTMwNiwKKwkweDAwYzAsIDB4ODMwMSwgMHg3MzE4LCAweDZiNjIsIDB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwKKwkweGExODYsIDB4MDAwMiwgMHgwMDQwLCAweDgyOTEsIDB4YTE4NiwgMHgwMDI4LCAweDAwYzAsIDB4ODI2ZSwKKwkweDEwNzgsIDB4OGVkYSwgMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwgMHg4MjkzLCAweGQ2ZGMsIDB4MDA0MCwKKwkweDgyOGEsIDB4Njg0YiwgMHgwMDE1LCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDgyODgsIDB4NjkxNCwKKwkweDZhMTAsIDB4MjEwMCwgMHhhMjA1LCAweDAwNDAsIDB4ODI4OCwgMHg3MDE4LCAweGExMDYsIDB4MDBjMCwKKwkweDgyODUsIDB4NzAxYywgMHhhMjA2LCAweDAwNDAsIDB4ODI4OCwgMHg2OTYyLCAweDZhNWUsIDB4YzZkYywKKwkweDAwNzgsIDB4ODI5MywgMHhkNmQ0LCAweDAwNDAsIDB4ODI5MSwgMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwKKwkweDgyOTMsIDB4Njg0YiwgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ZTQ2LCAweGEwMWUsIDB4ZDZjNCwKKwkweDAwNDAsIDB4ODJiYywgMHhhNjg2LCAweDAxMDAsIDB4MDBjMCwgMHg4MmE3LCAweDIwMDEsIDB4YWI5OSwKKwkweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDgyYTcsIDB4YzZjNCwgMHgwMDc4LCAweDgyMzYsIDB4NzMyOCwKKwkweDczMmMsIDB4NmI1NiwgMHg4M2ZmLCAweDAwNDAsIDB4ODJiYywgMHhhMzhhLCAweDAwMDksIDB4MDA0OCwKKwkweDgyYjMsIDB4MjAxOSwgMHgwMDA4LCAweDAzN2UsIDB4MjMwOCwgMHgyMDE5LCAweGFiOTgsIDB4YWQ5MCwKKwkweDAwMTksIDB4MTA3OCwgMHg4OWUyLCAweDAzN2YsIDB4ZDZjYywgMHgwMDQwLCAweDgzMTcsIDB4NzEyNCwKKwkweDY5NWEsIDB4ODFmZiwgMHgwMDQwLCAweDgzMTcsIDB4YTE5MiwgMHgwMDIxLCAweDAwYzgsIDB4ODJkNSwKKwkweDIwNzEsIDB4YWI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MTA3OCwKKwkweDg5ZTIsIDB4MTA3OCwgMHg5MWY0LCAweDAwNzgsIDB4ODMxNywgMHg2ODM4LCAweGQwZmMsIDB4MDA0MCwKKwkweDgyZGUsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsIDB4MDA3OCwgMHg4MmM4LCAweDBmN2UsIDB4MmQ3OCwKKwkweDEwNzgsIDB4ODk3YSwgMHgwZjdmLCAweDEwNzgsIDB4OTFmNCwgMHgxMDc4LCAweDg5Y2YsIDB4MDA3OCwKKwkweDgzMTksIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDk2MywgMHgwZjdmLCAweDAwNDAsIDB4ODMwNywKKwkweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDgzMDcsIDB4NjAyNCwgMHhkMGRjLCAweDAwYzAsIDB4ODMwNywKKwkweDY4NTAsIDB4ZDBiYywgMHgwMGMwLCAweDgzMDcsIDB4NjgxMCwgMHg2OTE0LCAweGExMDUsIDB4MDA0MCwKKwkweDgzMDcsIDB4MTA3OCwgMHg4ZmJmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDgzMjYsIDB4Njg0YiwKKwkweDAwMDAsIDB4NjgzNywgMHgwMTAzLCAweDZlNDYsIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODMxNywKKwkweDY4MTAsIDB4NjkxNCwgMHhhMTE1LCAweDAwNDAsIDB4ODMxNywgMHgxMDc4LCAweDg0ZDUsIDB4MTA3OCwKKwkweDRhNzMsIDB4NjIxOCwgMHgyMjY4LCAweDZhM2MsIDB4ODIxMSwgMHg2YTNlLCAweDEwNzgsIDB4OGY4OSwKKwkweDBkN2YsIDB4MGU3ZiwgMHgwMGMwLCAweDgzMjYsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4MGY3ZSwKKwkweDYwMDMsIDB4MDAwMywgMHgyMDc5LCAweGFiOGMsIDB4N2MwNCwgMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwKKwkweDYwMTAsIDB4MjA3OCwgMHg3ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg4MzNlLCAweDYwMDMsIDB4MDAwMiwKKwkweDBmN2YsIDB4MDA3YywgMHgyMTMwLCAweDIyMjgsIDB4MDA3OCwgMHg4MzRhLCAweDI0MDAsIDB4Nzk3YywKKwkweGExMGEsIDB4MjMwMCwgMHg3YTgwLCAweGEyMTMsIDB4MjYwMCwgMHhhMTAyLCAweDI1MDAsIDB4YTIwMywKKwkweDAwNDgsIDB4ODMzYSwgMHg3YzEyLCAweDdiMTYsIDB4N2UwYSwgMHg3ZDBlLCAweDBmN2YsIDB4NjAzZiwKKwkweDAwMDAsIDB4MmMxMCwgMHgxMDc4LCAweDFjZjAsIDB4MTA3OCwgMHg1ZGY2LCAweDEwNzgsIDB4NjM5YiwKKwkweDAwN2MsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDQsIDB4NjExMCwKKwkweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgxMDc4LCAweDE1ZmEsIDB4MDA3YywKKwkweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDgzNmMsIDB4ODM3ZiwgMHg4MzdmLCAweDgzN2YsIDB4ODM3ZiwKKwkweDgzN2YsIDB4ODM4MSwgMHg4NDI0LCAweDgzN2YsIDB4ODM3ZiwgMHg4NDNhLCAweDg0YWIsIDB4ODM3ZiwKKwkweDgzN2YsIDB4ODM3ZiwgMHg4MzdmLCAweDg0YmEsIDB4ODM3ZiwgMHg4MzdmLCAweDgzN2YsIDB4MTA3OCwKKwkweDEzMzIsIDB4MDc3ZSwgMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgyMDcxLCAweGFiOGMsIDB4NjExMCwKKwkweDIxNzgsIDB4NzYxNCwgMHhhNmI0LCAweDBmZmYsIDB4N2U0NiwgMHg3ZjRjLCAweGM3ZTUsIDB4N2Y0ZSwKKwkweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLCAweDAwNDAsIDB4ODQxZiwKKwkweGE2OTQsIDB4ZmYwMCwgMHhhMjg0LCAweDBjMDAsIDB4MDA0MCwgMHg4M2EyLCAweDcwMTgsIDB4Nzg2MiwKKwkweDcwMWMsIDB4Nzg1ZSwgMHhhMjg0LCAweDAzMDAsIDB4MDA0MCwgMHg4NDFmLCAweDEwNzgsIDB4MTM4YiwKKwkweDEwNDAsIDB4MTMzMiwgMHgyZDAwLCAweDc4NGEsIDB4N2Y0YywgMHhjN2NkLCAweDdmNGUsIDB4NjgzNywKKwkweDAxMDMsIDB4NzgzOCwgMHg2ODNhLCAweDc4M2MsIDB4NjgzZSwgMHg3ODQwLCAweDY4NDIsIDB4NmU0NiwKKwkweGE2OGMsIDB4MGMwMCwgMHgwMDQwLCAweDgzYzAsIDB4NzMxOCwgMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwKKwkweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg4M2RjLCAweGExODYsIDB4MDAyOCwKKwkweDAwYzAsIDB4ODNjZSwgMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwgMHg4M2RlLCAweGQ2ZGMsIDB4MDA0MCwKKwkweDgzZDUsIDB4Njg0YiwgMHgwMDE1LCAweDAwNzgsIDB4ODNkZSwgMHhkNmQ0LCAweDAwNDAsIDB4ODNkYywKKwkweDY4NGIsIDB4MDAwNywgMHgwMDc4LCAweDgzZGUsIDB4Njg0YiwgMHgwMDAwLCAweDZmNGUsIDB4Nzg1MCwKKwkweDY4NTIsIDB4Nzg1NCwgMHg2ODU2LCAweGEwMWUsIDB4ZDZjNCwgMHgwMDQwLCAweDgzZmMsIDB4NzMyOCwKKwkweDczMmMsIDB4NmI1NiwgMHg4M2ZmLCAweDAwNDAsIDB4ODNmYywgMHhhMzhhLCAweDAwMDksIDB4MDA0OCwKKwkweDgzZjMsIDB4MjAxOSwgMHgwMDA4LCAweDAzN2UsIDB4MjMwOCwgMHgyMDE5LCAweGFiOTgsIDB4YWQ5MCwKKwkweDAwMTksIDB4MTA3OCwgMHg4OWUyLCAweDAzN2YsIDB4ZDZjYywgMHgwMDQwLCAweDg0MWYsIDB4NzEyNCwKKwkweDY5NWEsIDB4ODFmZiwgMHgwMDQwLCAweDg0MWYsIDB4YTE5MiwgMHgwMDIxLCAweDAwYzgsIDB4ODQxMywKKwkweDIwNzEsIDB4YWI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MTA3OCwKKwkweDg5ZTIsIDB4MDA3OCwgMHg4NDFmLCAweDc4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDg0MWMsIDB4MjAwOSwKKwkweDAwMjAsIDB4Njk1YSwgMHgwMDc4LCAweDg0MDgsIDB4MmQ3OCwgMHgxMDc4LCAweDg5N2EsIDB4MGQ3ZiwKKwkweDBlN2YsIDB4MGY3ZiwgMHgwNzdmLCAweDAwN2MsIDB4MGY3ZSwgMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwKKwkweGFiOGMsIDB4N2MwNCwgMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHg2MDEwLCAweDIwNzgsIDB4N2MxMiwKKwkweDdiMTYsIDB4N2UwYSwgMHg3ZDBlLCAweDBmN2YsIDB4MmMxMCwgMHgxMDc4LCAweDFjZjAsIDB4MTA3OCwKKwkweDZkZjQsIDB4MDA3YywgMHgwZDdlLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NjMsIDB4MGY3ZiwKKwkweDAwNDAsIDB4ODQ0NiwgMHgyMDAxLCAweGE4YTQsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwKKwkweDEwNzgsIDB4NjI3YSwgMHgxMDc4LCAweDYzOWIsIDB4NjExMCwgMHgyMTY4LCAweDY5NGMsIDB4ZDFlNCwKKwkweDAwNDAsIDB4ODRhOSwgMHhkMWNjLCAweDAwNDAsIDB4ODQ4MCwgMHg2OTQ4LCAweDY4MzgsIDB4ZDBmYywKKwkweDAwNDAsIDB4ODQ3OCwgMHgwMTdlLCAweDY4NGMsIDB4MDA3ZSwgMHg2ODUwLCAweDAwN2UsIDB4YWQ5MCwKKwkweDAwMGQsIDB4YTE5OCwgMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgxNTdlLCAweDIxYTgsIDB4MjMwNCwKKwkweDIwMTIsIDB4ODMxOCwgMHg4MjEwLCAweDAwZjAsIDB4ODQ2NywgMHgxNTdmLCAweDAwN2YsIDB4Njg1MiwKKwkweDAwN2YsIDB4Njg0ZSwgMHgwMTdmLCAweDIxNjgsIDB4MTA3OCwgMHgxM2I0LCAweDAwNzgsIDB4ODRhMywKKwkweDAxN2UsIDB4MTA3OCwgMHgxM2I0LCAweDBkN2YsIDB4MTA3OCwgMHg4OWNmLCAweDAwNzgsIDB4ODRhMywKKwkweDY4MzcsIDB4MDEwMywgMHg2OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsIDB4MDA0MCwKKwkweDg0OWYsIDB4YTA4NiwgMHgwMDI4LCAweDAwYzAsIDB4ODQ5MSwgMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwKKwkweDg0YTEsIDB4ZDFkYywgMHgwMDQwLCAweDg0OTgsIDB4Njg0YiwgMHgwMDE1LCAweDAwNzgsIDB4ODRhMSwKKwkweGQxZDQsIDB4MDA0MCwgMHg4NDlmLCAweDY4NGIsIDB4MDAwNywgMHgwMDc4LCAweDg0YTEsIDB4Njg0YiwKKwkweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4OGY4OSwgMHgwMGMwLCAweDg0YTksIDB4MTA3OCwKKwkweDc3MmQsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LCAweDcwNTgsIDB4NjAwMywKKwkweDAwMDIsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjAzZSwgMHgxMDc4LCAweDYyN2EsIDB4MTA3OCwKKwkweDYzOWIsIDB4MDA3YywgMHgxMDc4LCAweDYyN2EsIDB4MTA3OCwgMHgyODgwLCAweDBkN2UsIDB4NjExMCwKKwkweDIxNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4ODRjZiwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwKKwkweDAwMjksIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4NGE3MywgMHgxMDc4LCAweDhlYjksIDB4MGQ3ZiwKKwkweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYzOWIsIDB4MDA3YywgMHg2ODRiLCAweDAwMTUsIDB4ZDFmYywKKwkweDAwNDAsIDB4ODRlMSwgMHg2ODRiLCAweDAwMDcsIDB4ODAwMiwgMHg4MDAwLCAweDgxMGEsIDB4YTE4OSwKKwkweDAwMDAsIDB4Njk2MiwgMHg2ODVlLCAweDAwN2MsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4ODRlOCwKKwkweDg0ZmIsIDB4ODRmYiwgMHg4NGZiLCAweDg0ZmIsIDB4ODRmYiwgMHg4NGZkLCAweDg0ZmIsIDB4ODVkMCwKKwkweDg1ZGMsIDB4ODRmYiwgMHg4NGZiLCAweDg0ZmIsIDB4ODRmYiwgMHg4NGZiLCAweDg0ZmIsIDB4ODRmYiwKKwkweDg0ZmIsIDB4ODRmYiwgMHg4NGZiLCAweDEwNzgsIDB4MTMzMiwgMHgwNzdlLCAweDBmN2UsIDB4MGU3ZSwKKwkweDBkN2UsIDB4MjA3MSwgMHhhYjhjLCAweDYxMTAsIDB4MjE3OCwgMHg3NjE0LCAweGE2YjQsIDB4MGZmZiwKKwkweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NjMsIDB4MGY3ZiwgMHgwMDQwLCAweDg1MWIsIDB4YTY4NCwKKwkweDAwZmYsIDB4MDBjMCwgMHg4NTFiLCAweDYwMjQsIDB4ZDBmNCwgMHgwMDQwLCAweDg1MWIsIDB4MTA3OCwKKwkweDhmYmYsIDB4MDA3OCwgMHg4NWNiLCAweDdlNDYsIDB4N2Y0YywgMHhjN2U1LCAweDdmNGUsIDB4NjIxOCwKKwkweDIyNjgsIDB4NmEzYywgMHg4MjExLCAweDZhM2UsIDB4ODZmZiwgMHgwMDQwLCAweDg1YzAsIDB4YTY5NCwKKwkweGZmMDAsIDB4YTI4NCwgMHgwYzAwLCAweDAwNDAsIDB4ODUzMSwgMHg3MDE4LCAweDc4NjIsIDB4NzAxYywKKwkweDc4NWUsIDB4YTI4NCwgMHgwMzAwLCAweDAwNDAsIDB4ODViZCwgMHhhNjg2LCAweDAxMDAsIDB4MDBjMCwKKwkweDg1NDMsIDB4MjAwMSwgMHhhYjk5LCAweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDg1NDMsIDB4YzZjNCwKKwkweDdlNDYsIDB4MDA3OCwgMHg4NTI0LCAweDEwNzgsIDB4MTM4YiwgMHgxMDQwLCAweDEzMzIsIDB4MmQwMCwKKwkweDc4NGEsIDB4N2Y0YywgMHhhN2JkLCAweDAyMDAsIDB4N2Y0ZSwgMHg2ODM3LCAweDAxMDMsIDB4NzgzOCwKKwkweDY4M2EsIDB4NzgzYywgMHg2ODNlLCAweDc4NDAsIDB4Njg0MiwgMHg2ZTQ2LCAweGE2OGMsIDB4MGMwMCwKKwkweDAwNDAsIDB4ODU1ZSwgMHg3MzE4LCAweDZiNjIsIDB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwKKwkweGExODYsIDB4MDAwMiwgMHgwMDQwLCAweDg1N2EsIDB4YTE4NiwgMHgwMDI4LCAweDAwYzAsIDB4ODU2YywKKwkweDY4NGIsIDB4MDAxYywgMHgwMDc4LCAweDg1N2MsIDB4ZDZkYywgMHgwMDQwLCAweDg1NzMsIDB4Njg0YiwKKwkweDAwMTUsIDB4MDA3OCwgMHg4NTdjLCAweGQ2ZDQsIDB4MDA0MCwgMHg4NTdhLCAweDY4NGIsIDB4MDAwNywKKwkweDAwNzgsIDB4ODU3YywgMHg2ODRiLCAweDAwMDAsIDB4NmY0ZSwgMHg3ODUwLCAweDY4NTIsIDB4Nzg1NCwKKwkweDY4NTYsIDB4YTAxZSwgMHhkNmM0LCAweDAwNDAsIDB4ODU5YSwgMHg3MzI4LCAweDczMmMsIDB4NmI1NiwKKwkweDgzZmYsIDB4MDA0MCwgMHg4NTlhLCAweGEzOGEsIDB4MDAwOSwgMHgwMDQ4LCAweDg1OTEsIDB4MjAxOSwKKwkweDAwMDgsIDB4MDM3ZSwgMHgyMzA4LCAweDIwMTksIDB4YWI5OCwgMHhhZDkwLCAweDAwMTksIDB4MTA3OCwKKwkweDg5ZTIsIDB4MDM3ZiwgMHhkNmNjLCAweDAwNDAsIDB4ODViZCwgMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwKKwkweDAwNDAsIDB4ODViZCwgMHhhMTkyLCAweDAwMjEsIDB4MDBjOCwgMHg4NWIxLCAweDIwNzEsIDB4YWI5OCwKKwkweDgzMWMsIDB4MjMwMCwgMHhhZTE4LCAweGFkOTAsIDB4MDAxZCwgMHgxMDc4LCAweDg5ZTIsIDB4MDA3OCwKKwkweDg1YmQsIDB4NzgzOCwgMHhkMGZjLCAweDAwNDAsIDB4ODViYSwgMHgyMDA5LCAweDAwMjAsIDB4Njk1YSwKKwkweDAwNzgsIDB4ODVhNiwgMHgyZDc4LCAweDEwNzgsIDB4ODk3YSwgMHhkNmRjLCAweDAwYzAsIDB4ODVjMywKKwkweGEwMDYsIDB4MDA3OCwgMHg4NWM5LCAweDIwMDEsIDB4MDAwMSwgMHgyMDcxLCAweGFiOGMsIDB4NzIxOCwKKwkweDczMWMsIDB4MTA3OCwgMHgxNjUzLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDA3N2YsIDB4MDA3YywKKwkweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwKKwkweDJjMTAsIDB4MTA3OCwgMHgxNWZhLCAweDAwN2MsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NjAzZSwKKwkweDBkN2UsIDB4NjAwMywgMHgwMDAyLCAweDYxMTAsIDB4MjE2OCwgMHg2OTRjLCAweGQxZTQsIDB4MDA0MCwKKwkweDg3MGMsIDB4NjAzZiwgMHgwMDAwLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NjMsIDB4MGY3ZiwKKwkweDAwNDAsIDB4ODYyMiwgMHg2ODE0LCAweDY5MTAsIDB4YTExNSwgMHgwMDQwLCAweDg2MjIsIDB4NmE2MCwKKwkweGEyMDYsIDB4MDBjMCwgMHg4NWZmLCAweDY4NWMsIDB4YTEwNiwgMHgwMDQwLCAweDg2MjIsIDB4Njg0YywKKwkweGMwZTQsIDB4Njg0ZSwgMHg2ODQ3LCAweDAwMDAsIDB4Njg2MywgMHgwMDAwLCAweDY4NWYsIDB4MDAwMCwKKwkweDYwMjQsIDB4ZDBmNCwgMHgwMGMwLCAweDg2MTcsIDB4Njk3YywgMHg2ODEwLCAweGExMDIsIDB4NjAzYSwKKwkweDY5ODAsIDB4NjgxNCwgMHhhMTAzLCAweDYwMzYsIDB4NjAyNCwgMHhjMGY1LCAweDYwMjYsIDB4MGQ3ZSwKKwkweDYwMTgsIDB4MjA2OCwgMHg2ODNjLCAweDgwMDAsIDB4NjgzZSwgMHgwZDdmLCAweDEwNzgsIDB4OGZiZiwKKwkweDAwNzgsIDB4ODcwYywgMHg2OTRjLCAweGQxY2MsIDB4MDA0MCwgMHg4NmQxLCAweDY5NDgsIDB4NjgzOCwKKwkweGQwZmMsIDB4MDA0MCwgMHg4Njg5LCAweDAxN2UsIDB4Njg0YywgMHgwMDdlLCAweDY4NTAsIDB4MDA3ZSwKKwkweDBmN2UsIDB4MjE3OCwgMHg3OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsIDB4MDA0MCwKKwkweDg2NWMsIDB4YTA4NiwgMHgwMDI4LCAweDAwYzAsIDB4ODY0MywgMHg2ODRiLCAweDAwMWMsIDB4Nzg0YiwKKwkweDAwMWMsIDB4MDA3OCwgMHg4NjY3LCAweGQxZGMsIDB4MDA0MCwgMHg4NjUzLCAweDY4NGIsIDB4MDAxNSwKKwkweDc4NGIsIDB4MDAxNSwgMHgxMDc4LCAweDkxNmMsIDB4MDA0MCwgMHg4NjUxLCAweDc5NDQsIDB4YzFkYywKKwkweDc5NDYsIDB4MDA3OCwgMHg4NjY3LCAweGQxZDQsIDB4MDA0MCwgMHg4NjVjLCAweDY4NGIsIDB4MDAwNywKKwkweDc4NGIsIDB4MDAwNywgMHgwMDc4LCAweDg2NjcsIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODY2NywKKwkweDY4MTAsIDB4NjkxNCwgMHhhMTE1LCAweDAwNDAsIDB4ODY2NywgMHgxMDc4LCAweDg0ZDUsIDB4Njg0OCwKKwkweDc4NGEsIDB4Njg2MCwgMHg3ODYyLCAweDY4NWMsIDB4Nzg1ZSwgMHhhZDkwLCAweDAwMGQsIDB4YWY5OCwKKwkweDAwMGQsIDB4MjAwOSwgMHgwMDIwLCAweDE1N2UsIDB4MjFhOCwgMHgyMzA0LCAweDIwMTIsIDB4ODMxOCwKKwkweDgyMTAsIDB4MDBmMCwgMHg4Njc1LCAweDE1N2YsIDB4MGY3ZiwgMHgwMDdmLCAweDY4NTIsIDB4MDA3ZiwKKwkweDY4NGUsIDB4MTA3OCwgMHg5MWY0LCAweDAxN2YsIDB4MjE2OCwgMHgxMDc4LCAweDEzYjQsIDB4MDA3OCwKKwkweDg3MDYsIDB4MDE3ZSwgMHgwZjdlLCAweDIxNzgsIDB4Nzk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwKKwkweDAwMDIsIDB4MDA0MCwgMHg4NmI2LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDg2OWQsIDB4Njg0YiwKKwkweDAwMWMsIDB4Nzg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODZjMSwgMHhkMWRjLCAweDAwNDAsIDB4ODZhZCwKKwkweDY4NGIsIDB4MDAxNSwgMHg3ODRiLCAweDAwMTUsIDB4MTA3OCwgMHg5MTZjLCAweDAwNDAsIDB4ODZhYiwKKwkweDc5NDQsIDB4YzFkYywgMHg3OTQ2LCAweDAwNzgsIDB4ODZjMSwgMHhkMWQ0LCAweDAwNDAsIDB4ODZiNiwKKwkweDY4NGIsIDB4MDAwNywgMHg3ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4NmMxLCAweDY4NGMsIDB4ZDBhYywKKwkweDAwNDAsIDB4ODZjMSwgMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMDQwLCAweDg2YzEsIDB4MTA3OCwKKwkweDg0ZDUsIDB4Njg2MCwgMHg3ODYyLCAweDY4NWMsIDB4Nzg1ZSwgMHg2ODRjLCAweDc4NGUsIDB4MGY3ZiwKKwkweDEwNzgsIDB4MTNiNCwgMHgwZDdmLCAweDEwNzgsIDB4OTFmNCwgMHgxMDc4LCAweDg5Y2YsIDB4MDA3OCwKKwkweDg3MDYsIDB4NjgzNywgMHgwMTAzLCAweDY5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsIDB4MDAwMiwKKwkweDAwNDAsIDB4ODZmNywgMHhhMDg2LCAweDAwMjgsIDB4MDBjMCwgMHg4NmUyLCAweDY4NGIsIDB4MDAxYywKKwkweDAwNzgsIDB4ODcwNCwgMHhkMWRjLCAweDAwNDAsIDB4ODZmMCwgMHg2ODRiLCAweDAwMTUsIDB4MTA3OCwKKwkweDkxNmMsIDB4MDA0MCwgMHg4NmVlLCAweDY5NDQsIDB4YzFkYywgMHg2OTQ2LCAweDAwNzgsIDB4ODcwNCwKKwkweGQxZDQsIDB4MDA0MCwgMHg4NmY3LCAweDY4NGIsIDB4MDAwNywgMHgwMDc4LCAweDg3MDQsIDB4Njg0YiwKKwkweDAwMDAsIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODcwNCwgMHg2ODEwLCAweDY5MTQsIDB4YTExNSwKKwkweDAwNDAsIDB4ODcwNCwgMHgxMDc4LCAweDg0ZDUsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4OGY4OSwKKwkweDAwYzAsIDB4ODcwYywgMHgxMDc4LCAweDc3MmQsIDB4MGQ3ZiwgMHgwMDdjLCAweDEwNzgsIDB4NjFjZCwKKwkweDAwNzgsIDB4ODcxNCwgMHgxMDc4LCAweDYyN2EsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4ODczMywKKwkweDBkN2UsIDB4NjExMCwgMHgyMTY4LCAweDY4MzcsIDB4MDEwMywgMHgyMDA5LCAweGE2MGMsIDB4MjEwYywKKwkweGQxOGMsIDB4MDBjMCwgMHg4NzNlLCAweGQxODQsIDB4MDBjMCwgMHg4NzNhLCAweDYxMDgsIDB4Njk0YSwKKwkweGExOGUsIDB4MDAyOSwgMHgwMGMwLCAweDg3MmUsIDB4MTA3OCwgMHhhNGUyLCAweDY4NDcsIDB4MDAwMCwKKwkweDEwNzgsIDB4NGE3MywgMHgwZDdmLCAweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsIDB4MTA3OCwKKwkweDYzOWIsIDB4MDA3YywgMHg2ODRiLCAweDAwMDQsIDB4MDA3OCwgMHg4NzJlLCAweDY4NGIsIDB4MDAwNCwKKwkweDAwNzgsIDB4ODcyZSwgMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg4NzQ2LCAweDg3NTksIDB4ODc1OSwKKwkweDg3NTksIDB4ODc1OSwgMHg4NzU5LCAweDg3NWIsIDB4ODc1OSwgMHg4NzVlLCAweDg3NTksIDB4ODc1OSwKKwkweDg3NTksIDB4ODc1OSwgMHg4NzU5LCAweDg3NTksIDB4ODc1OSwgMHg4NzU5LCAweDg3NTksIDB4ODc1OSwKKwkweDg3NTksIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDAwN2UsIDB4MDI3ZSwKKwkweGEwMTYsIDB4MTA3OCwgMHgxNWZhLCAweDAyN2YsIDB4MDA3ZiwgMHgwMDdjLCAweGExODIsIDB4MDA4NSwKKwkweDAwNzksIDB4ODc2YSwgMHg4NzczLCAweDg3NzEsIDB4ODc3MSwgMHg4NzdmLCAweDg3NzEsIDB4ODc3MSwKKwkweDg3NzEsIDB4MTA3OCwgMHgxMzMyLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWQ4YSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjJkMSwgMHgxMjdmLCAweDAwN2MsIDB4MDI3ZSwKKwkweDA1N2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDIwNzEsIDB4YWI4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwKKwkweDEwNzgsIDB4OGNmMiwgMHgwMDQwLCAweDg3YTQsIDB4MjI2OCwgMHg2ODAwLCAweGEwODYsIDB4MDAwMCwKKwkweDAwNDAsIDB4ODdhNCwgMHg2MDE4LCAweDZkMTgsIDB4YTUyZSwgMHgwMGMwLCAweDg3YTQsIDB4MGM3ZSwKKwkweDJkNjAsIDB4MTA3OCwgMHg4OWYzLCAweDBjN2YsIDB4MDA0MCwgMHg4N2E0LCAweDY4MDMsIDB4MDAwMiwKKwkweDYwMDcsIDB4MDA4NiwgMHgwMDc4LCAweDg3YTYsIDB4NjAwNywgMHgwMDg3LCAweDYwMDMsIDB4MDAwMSwKKwkweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGY3ZSwgMHgyMjc4LCAweDEwNzgsIDB4NDk2MywKKwkweDBmN2YsIDB4MDA0MCwgMHg4N2JlLCAweDY4MjQsIDB4ZDBlYywgMHgwMDQwLCAweDg3YmUsIDB4MGM3ZSwKKwkweDIyNjAsIDB4NjAzZiwgMHgwMDAwLCAweDEwNzgsIDB4OGZiZiwgMHgwYzdmLCAweDBlN2YsIDB4MGQ3ZiwKKwkweDA1N2YsIDB4MDI3ZiwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDg3ZDQsIDB4NjAwNCwKKwkweGEwOGEsIDB4MDA4NSwgMHgxMDQ4LCAweDEzMzIsIDB4YTA4YSwgMHgwMDhjLCAweDEwYzgsIDB4MTMzMiwKKwkweGEwODIsIDB4MDA4NSwgMHgwMDc5LCAweDg3ZTMsIDB4YTE4NiwgMHgwMDI3LCAweDAwNDAsIDB4ODdkYywKKwkweGExODYsIDB4MDAxNCwgMHgxMGMwLCAweDEzMzIsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDg3ZWEsIDB4ODdlYywgMHg4N2VjLCAweDg3ZWEsIDB4ODdlYSwKKwkweDg3ZWEsIDB4ODdlYSwgMHgxMDc4LCAweDEzMzIsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDg3ZmQsIDB4NjAwNCwKKwkweGEwODIsIDB4MDA4NSwgMHgyMDA4LCAweDAwNzgsIDB4ODgzOCwgMHhhMTg2LCAweDAwMjcsIDB4MDBjMCwKKwkweDg4MjAsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4Mjg4MCwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwKKwkweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDg4MTYsIDB4NjgzNywgMHgwMTAzLCAweDY4NDcsIDB4MDAwMCwKKwkweDY4NGIsIDB4MDAyOSwgMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwgMHg4ZWI5LCAweDBkN2YsIDB4MTA3OCwKKwkweDc3MmQsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwgMHg3NzczLCAweDAwNzgsIDB4ODgxYiwKKwkweGExODYsIDB4MDAxNCwgMHgwMGMwLCAweDg4MWMsIDB4MTA3OCwgMHg2MWNkLCAweDBkN2UsIDB4NjAxMCwKKwkweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4ODgxNiwgMHg2ODM3LCAweDAxMDMsIDB4Njg0NywKKwkweDAwMDAsIDB4Njg0YiwgMHgwMDA2LCAweDY4NTAsIDB4YzBlYywgMHg2ODUyLCAweDAwNzgsIDB4ODgxMiwKKwkweDAwNzksIDB4ODgzYSwgMHg4ODQzLCAweDg4NDEsIDB4ODg0MSwgMHg4ODQxLCAweDg4NDEsIDB4ODg0MSwKKwkweDg4NWUsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4YTE4NiwgMHgwMDM5LCAweDAwNDAsIDB4ODg1MSwgMHhhMTg2LCAweDAwMzUsIDB4MDBjMCwKKwkweDg4NTUsIDB4MjAwMSwgMHhhOGEyLCAweDAwNzgsIDB4ODg1NywgMHgyMDAxLCAweGE4YTMsIDB4MjAwNCwKKwkweDYwMTYsIDB4NjAwMywgMHgwMDBjLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsIDB4NjFjZCwKKwkweDYwMzAsIDB4YTA4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDM5LCAweDAwNDAsIDB4ODg2YywKKwkweGExODYsIDB4MDAzNSwgMHgwMGMwLCAweDg4NzAsIDB4MjAwMSwgMHhhOGEyLCAweDAwNzgsIDB4ODg3MiwKKwkweDIwMDEsIDB4YThhMywgMHgyMDA0LCAweDYwMTYsIDB4NjAwMywgMHgwMDBlLCAweDEwNzgsIDB4NjJkMSwKKwkweDAwN2MsIDB4YTE4MiwgMHgwMDhjLCAweDAwYzgsIDB4ODg4MywgMHhhMTgyLCAweDAwODUsIDB4MDA0OCwKKwkweDg4ODMsIDB4MDA3OSwgMHg4ODg2LCAweDEwNzgsIDB4Nzc3MywgMHgwMDdjLCAweDg4OGQsIDB4ODg4ZCwKKwkweDg4OGQsIDB4ODg4ZCwgMHg4ODhmLCAweDg4ZWMsIDB4ODg4ZCwgMHgxMDc4LCAweDEzMzIsIDB4MGY3ZSwKKwkweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDBmN2YsIDB4MDA0MCwgMHg4OGEyLCAweDYwMzAsIDB4YTA4YywKKwkweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDA0MCwgMHg4OTAzLCAweGExODYsIDB4MDAzNSwKKwkweDAwNDAsIDB4ODkwMywgMHgwZDdlLCAweDEwNzgsIDB4OGQwNiwgMHgwMGMwLCAweDg4YWIsIDB4MTA3OCwKKwkweDhlYjksIDB4MDA3OCwgMHg4OGNlLCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGQwZTQsIDB4MDBjMCwKKwkweDg4YjMsIDB4MTA3OCwgMHg4ZWI5LCAweDY4MzcsIDB4MDEwMywgMHg2ODUwLCAweGQwYjQsIDB4MDA0MCwKKwkweDg4YmYsIDB4Njg0YiwgMHgwMDA2LCAweGMwZWMsIDB4Njg1MiwgMHgwMDc4LCAweDg4Y2EsIDB4ZDBiYywKKwkweDAwNDAsIDB4ODhjNiwgMHg2ODRiLCAweDAwMDIsIDB4MDA3OCwgMHg4OGNhLCAweDY4NGIsIDB4MDAwNSwKKwkweDEwNzgsIDB4OGY4NSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDJjNjgsIDB4MTA3OCwKKwkweDc2YzcsIDB4MDA0MCwgMHg4OGU3LCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4MjAwOSwKKwkweGFiOGUsIDB4MjEwYywgMHg2MTM2LCAweDIwMDksIDB4YWI4ZiwgMHgyMTBjLCAweDYxM2EsIDB4NjkxOCwKKwkweDYxMWEsIDB4NjkyMCwgMHg2MTIyLCAweDYwMWYsIDB4MDAwMSwgMHgxMDc4LCAweDVkOGEsIDB4MmQ2MCwKKwkweDEwNzgsIDB4NzcyZCwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDk2MywKKwkweDBmN2YsIDB4MDA0MCwgMHg4OTI5LCAweDYwMzAsIDB4YTA4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwKKwkweDAwMzUsIDB4MDA0MCwgMHg4OTAzLCAweGExODYsIDB4MDAxZSwgMHgwMDQwLCAweDg5MDMsIDB4YTE4NiwKKwkweDAwMzksIDB4MDBjMCwgMHg4OTI5LCAweDBkN2UsIDB4MmM2OCwgMHgxMDc4LCAweDkxYmMsIDB4MDBjMCwKKwkweDg5NGQsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsIDB4ODkyNiwgMHg2MTA2LCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMWYsIDB4MDAwMSwgMHg2OTE4LCAweDYxMWEsIDB4NjkyOCwgMHg2MTJhLCAweDY5MmMsIDB4NjEyZSwKKwkweDY5MzAsIDB4YTE4YywgMHgwMGZmLCAweDYxMzIsIDB4NjkzNCwgMHg2MTM2LCAweDY5MzgsIDB4NjEzYSwKKwkweDY5MjAsIDB4NjEyMiwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDJkNjAsIDB4MDA3OCwKKwkweDg5NGQsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4ODk0ZCwKKwkweDY4MzcsIDB4MDEwMywgMHg2ODUwLCAweGQwYjQsIDB4MDA0MCwgMHg4OTNjLCAweGMwZWMsIDB4Njg1MiwKKwkweDY4NGIsIDB4MDAwNiwgMHgwMDc4LCAweDg5NDcsIDB4ZDBiYywgMHgwMDQwLCAweDg5NDMsIDB4Njg0YiwKKwkweDAwMDIsIDB4MDA3OCwgMHg4OTQ3LCAweDY4NGIsIDB4MDAwNSwgMHgxMDc4LCAweDhmODUsIDB4Njg0NywKKwkweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDEwNzgsIDB4OGViOSwgMHgwZDdmLCAweDEwNzgsIDB4NzcyZCwKKwkweDAwN2MsIDB4MDE3ZSwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwKKwkweDg5NjEsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsIDB4MDAyOCwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwKKwkweDRhNzMsIDB4MGQ3ZiwgMHgwMTdmLCAweGExODYsIDB4MDAxMywgMHgwMDQwLCAweDg5NzMsIDB4YTE4NiwKKwkweDAwMTQsIDB4MDA0MCwgMHg4OTczLCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDg5NzMsIDB4MTA3OCwKKwkweDc3NzMsIDB4MDA3OCwgMHg4OTc5LCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3YywgMHgwNTdlLCAweDA2N2UsIDB4MGQ3ZSwgMHgwZjdlLCAweDIwMjksIDB4MDAwMSwKKwkweGExODIsIDB4MDEwMSwgMHgwMGM4LCAweDg5ODYsIDB4MDA3OCwgMHg4OTg4LCAweDIwMDksIDB4MDEwMCwKKwkweDIxMzAsIDB4MjA2OSwgMHhhYjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZDE4LCAweDIwMDksIDB4MDAyMCwKKwkweGFmOTAsIDB4MDAxZCwgMHgxMDc4LCAweDg5ZTIsIDB4YTZiMiwgMHgwMDIwLCAweDc4MDQsIDB4YTA2ZCwKKwkweDAwNDAsIDB4ODk5YywgMHgxMDc4LCAweDEzYjQsIDB4MTA3OCwgMHgxMzhiLCAweDAwNDAsIDB4ODljNiwKKwkweDg1MjgsIDB4NjgzNywgMHgwMTEwLCAweDY4M2IsIDB4MDAwMCwgMHgyZDIwLCAweDdjMDYsIDB4YTY4YSwKKwkweDAwM2QsIDB4MDBjOCwgMHg4OWIyLCAweDI2MDgsIDB4YWQ5MCwgMHgwMDBmLCAweDEwNzgsIDB4ODllMiwKKwkweDAwNzgsIDB4ODljNiwgMHhhNmIyLCAweDAwM2MsIDB4MjAwOSwgMHgwMDNjLCAweDJkNzgsIDB4YWQ5MCwKKwkweDAwMGYsIDB4MTA3OCwgMHg4OWUyLCAweDAwNzgsIDB4ODk5YywgMHgwZjdmLCAweDg1MmYsIDB4YTVhZCwKKwkweDAwMDMsIDB4N2QzNiwgMHhhNWFjLCAweDAwMDAsIDB4MDA3OCwgMHg4OWNiLCAweDBmN2YsIDB4ODUyZiwKKwkweGE1YWQsIDB4MDAwMywgMHg3ZDM2LCAweDBkN2YsIDB4MDY3ZiwgMHgwNTdmLCAweDAwN2MsIDB4MGY3ZSwKKwkweDhkZmYsIDB4MDA0MCwgMHg4OWUwLCAweDY4MDQsIDB4YTA3ZCwgMHgwMDQwLCAweDg5ZGUsIDB4NjgwNywKKwkweDAwMDAsIDB4MTA3OCwgMHg0YTczLCAweDJmNjgsIDB4MDA3OCwgMHg4OWQzLCAweDEwNzgsIDB4NGE3MywKKwkweDBmN2YsIDB4MDA3YywgMHgxNTdlLCAweGExODQsIDB4MDAwMSwgMHgwMDQwLCAweDg5ZTgsIDB4ODEwOCwKKwkweDgxMGMsIDB4MjFhOCwgMHgyMzA0LCAweDgwMDcsIDB4MjAxMiwgMHg4MzE4LCAweDgyMTAsIDB4MDBmMCwKKwkweDg5ZWEsIDB4MTU3ZiwgMHgwMDdjLCAweDA2N2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAzMSwKKwkweDAwMDEsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg4YTBmLCAweDEyN2YsIDB4MDY3ZiwKKwkweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDY3ZSwgMHgyMDMxLCAweDAwMDAsIDB4NjAxYywKKwkweGEwODQsIDB4MDAwZiwgMHgxMDc5LCAweDhhMGYsIDB4MDY3ZiwgMHgxMjdmLCAweDAwN2MsIDB4OGEyOSwKKwkweDhhMTcsIDB4OGEyNCwgMHg4YTQ1LCAweDhhMTcsIDB4OGEyNCwgMHg4YTQ1LCAweDhhMjQsIDB4MTA3OCwKKwkweDEzMzIsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMTAsIDB4MTA3OCwgMHg5ZGM3LCAweDYwMWYsIDB4MDAwNiwKKwkweDYwMDMsIDB4MDAwNywgMHgwMzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwKKwkweDAwN2MsIDB4MGQ3ZSwgMHg4NmZmLCAweDAwYzAsIDB4OGE0MCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwKKwkweDhkMDYsIDB4MDA0MCwgMHg4YTQyLCAweGEwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDEwNzgsIDB4NGI1MSwKKwkweDEwNzgsIDB4OGY4NSwgMHgxMDc4LCAweDRhNzMsIDB4MTA3OCwgMHg3NzJkLCAweGEwODUsIDB4MDAwMSwKKwkweDBkN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGE0MCwgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwKKwkweDEwYzgsIDB4MTMzMiwgMHgxMDc5LCAweDhhNGQsIDB4MDA3YywgMHg4YTVkLCAweDhhODIsIDB4OGE1ZiwKKwkweDhhYTUsIDB4OGE3ZSwgMHg4YTVkLCAweDhhMjQsIDB4OGEyOSwgMHg4YTI5LCAweDhhMjQsIDB4OGEyNCwKKwkweDhhMjQsIDB4OGEyNCwgMHg4YTI0LCAweDhhMjQsIDB4OGEyNCwgMHgxMDc4LCAweDEzMzIsIDB4ODZmZiwKKwkweDAwYzAsIDB4OGE3YiwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDhhN2IsIDB4MGQ3ZSwKKwkweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwgMHg4YTcwLCAweDEwNzgsIDB4OGY4NSwKKwkweDBkN2YsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4MTA3OCwKKwkweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDEwNzgsIDB4MTc1NywKKwkweDAwNzgsIDB4OGE1ZiwgMHgwZTdlLCAweDIwNzEsIDB4YThiMSwgMHg3MDI0LCAweGFjMDYsIDB4MDBjMCwKKwkweDhhOGIsIDB4MTA3OCwgMHg2ZmM0LCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4OGE5ZCwgMHgwODdlLCAweDA5N2UsIDB4MjA0OSwgMHgwMDAxLCAweDJjNDAsIDB4MTA3OCwKKwkweDcyNDYsIDB4MDk3ZiwgMHgwODdmLCAweDAwNzgsIDB4OGE5ZiwgMHgxMDc4LCAweDZlYmUsIDB4MGU3ZiwKKwkweDAwYzAsIDB4OGE1ZiwgMHgxMDc4LCAweDhhMjQsIDB4MDA3YywgMHgwMzdlLCAweDBlN2UsIDB4MjA3MSwKKwkweGE4YjEsIDB4NzAzYywgMHhhYzA2LCAweDAwYzAsIDB4OGFiNSwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwKKwkweDcwNTgsIDB4MGU3ZiwgMHgwMzdmLCAweDAwNzgsIDB4OGE1ZiwgMHgxMDc4LCAweDczOGEsIDB4MGU3ZiwKKwkweDAzN2YsIDB4MDBjMCwgMHg4YTVmLCAweDEwNzgsIDB4OGEyNCwgMHgwMDdjLCAweDBjN2UsIDB4NjAxYywKKwkweGEwODQsIDB4MDAwZiwgMHgxMDc5LCAweDhhYzYsIDB4MGM3ZiwgMHgwMDdjLCAweDhhZDUsIDB4OGI0NywKKwkweDhjN2YsIDB4OGFlMCwgMHg4ZWM2LCAweDhhZDUsIDB4OWRiOCwgMHg3NzJkLCAweDhiNDcsIDB4MTA3OCwKKwkweDhmMDAsIDB4MDBjMCwgMHg4YWQ1LCAweDEwNzgsIDB4N2M4MywgMHgwMDdjLCAweDEwNzgsIDB4NjFjZCwKKwkweDEwNzgsIDB4NjJkMSwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHg2MDE3LCAweDAwMDEsIDB4MDA3YywKKwkweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDhhZTgsIDB4NjAxMCwgMHhhMDgwLCAweDAwMTksIDB4MmMwMiwKKwkweDYwMDAsIDB4YTA4YSwgMHgwMDEwLCAweDEwYzgsIDB4MTMzMiwgMHgxMDc5LCAweDhhZjAsIDB4MDA3YywKKwkweDhiMDAsIDB4OGIwMiwgMHg4YjI0LCAweDhiMzYsIDB4OGI0MywgMHg4YjAwLCAweDhhZDUsIDB4OGFkNSwKKwkweDhhZDUsIDB4OGIzNiwgMHg4YjM2LCAweDhiMDAsIDB4OGIwMCwgMHg4YjAwLCAweDhiMDAsIDB4OGI0MCwKKwkweDEwNzgsIDB4MTMzMiwgMHgwZTdlLCAweDYwMTAsIDB4MjA3MCwgMHg3MDUwLCAweGMwYjUsIDB4NzA1MiwKKwkweDIwNzEsIDB4YThiMSwgMHg3MDI0LCAweGFjMDYsIDB4MDA0MCwgMHg4YjIwLCAweDEwNzgsIDB4NmViZSwKKwkweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDIwMDEsIDB4YThhMywKKwkweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDBlN2YsIDB4MDA3YywKKwkweDYwMTcsIDB4MDAwMSwgMHgwMDc4LCAweDhiMWUsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4Njg1MCwKKwkweGMwYjUsIDB4Njg1MiwgMHgwZDdmLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwKKwkweDAwMDIsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDBkN2UsIDB4NjAxNywKKwkweDAwMDEsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTAsIDB4YzBiNSwgMHg2ODUyLCAweDBkN2YsIDB4MDA3YywKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDEwNzgsIDB4MTc1NywgMHgwMDc4LCAweDhiMjQsIDB4NjAwMCwKKwkweGEwOGEsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg4YjRmLCAweDAwN2MsIDB4OGI1ZiwKKwkweDhhZGQsIDB4OGI2MSwgMHg4YjVmLCAweDhiNjEsIDB4OGI2MSwgMHg4YWQ2LCAweDhiNWYsIDB4OGFjZiwKKwkweDhhY2YsIDB4OGI1ZiwgMHg4YjVmLCAweDhiNWYsIDB4OGI1ZiwgMHg4YjVmLCAweDhiNWYsIDB4MTA3OCwKKwkweDEzMzIsIDB4MGQ3ZSwgMHg2MDE4LCAweDIwNjgsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4MGQ3ZiwKKwkweGEwOGEsIDB4MDAwYywgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg4YjZmLCAweDAwN2MsIDB4OGI3YiwKKwkweDhjMjMsIDB4OGI3ZCwgMHg4YmJkLCAweDhiN2QsIDB4OGJiZCwgMHg4YjdkLCAweDhiOGEsIDB4OGI3YiwKKwkweDhiYmQsIDB4OGI3YiwgMHg4YmE3LCAweDEwNzgsIDB4MTMzMiwgMHg2MDA0LCAweGEwOGUsIDB4MDAxNiwKKwkweDAwNDAsIDB4OGJiOCwgMHhhMDhlLCAweDAwMDQsIDB4MDA0MCwgMHg4YmI4LCAweGEwOGUsIDB4MDAwMiwKKwkweDAwNDAsIDB4OGJiOCwgMHg2MDA0LCAweDEwNzgsIDB4OGYwMCwgMHgwMDQwLCAweDhjM2UsIDB4YTA4ZSwKKwkweDAwMjEsIDB4MDA0MCwgMHg4YzQyLCAweGEwOGUsIDB4MDAyMiwgMHgwMDQwLCAweDhjM2UsIDB4YTA4ZSwKKwkweDAwM2QsIDB4MDA0MCwgMHg4YzQyLCAweGEwOGUsIDB4MDAzOSwgMHgwMDQwLCAweDhjNDYsIDB4YTA4ZSwKKwkweDAwMzUsIDB4MDA0MCwgMHg4YzQ2LCAweGEwOGUsIDB4MDAxZSwgMHgwMDQwLCAweDhiYmEsIDB4YTA4ZSwKKwkweDAwMDEsIDB4MDBjMCwgMHg4YmI2LCAweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDQsIDB4YTA4NCwKKwkweDAwZmYsIDB4MGQ3ZiwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHg4YmI4LCAweDEwNzgsIDB4Mjg4MCwKKwkweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDhlYzYsIDB4MDA3YywgMHgwYzdlLCAweDBkN2UsIDB4NjEwNCwKKwkweGExODYsIDB4MDAxNiwgMHgwMDQwLCAweDhjMTMsIDB4YTE4NiwgMHgwMDAyLCAweDAwYzAsIDB4OGJlNiwKKwkweDYwMTgsIDB4MjA2OCwgMHg2OGEwLCAweGQwYmMsIDB4MDBjMCwgMHg4YzZhLCAweDY4NDAsIDB4YTA4NCwKKwkweDAwZmYsIDB4YTAwNSwgMHgwMDQwLCAweDhiZTYsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTMsIDB4MDAwMCwKKwkweDYwMWYsIDB4MDAwNywgMHg2MDE3LCAweDAzOTgsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsIDB4OGJlNiwKKwkweDJkMDAsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDEsIDB4MDA3OCwgMHg4YzEzLCAweDBkN2YsIDB4MGM3ZiwKKwkweDYwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAwYzAsIDB4OGMwNCwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwKKwkweDIwMDQsIDB4YTA4NiwgMHgwMDdlLCAweDAwYzAsIDB4OGMwNCwgMHgyMDA5LCAweGE2MzMsIDB4MjEwNCwKKwkweGMwODUsIDB4MjAwYSwgMHgwZTdlLCAweDIwNzEsIDB4YTYwMCwgMHgxMDc4LCAweDQyYjgsIDB4MGU3ZiwKKwkweDEwNzgsIDB4N2M4MywgMHgwMDc4LCAweDhjMDgsIDB4MTA3OCwgMHg3YzgzLCAweDEwNzgsIDB4Mjg4MCwKKwkweDBlN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyOGE2LCAweDEyN2YsIDB4MGU3ZiwKKwkweDEwNzgsIDB4OGVjNiwgMHgwMDdjLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ1MDIsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDEwNzgsIDB4NWRkNywgMHgxMDc4LCAweDYyZDEsIDB4MGQ3ZiwKKwkweDBjN2YsIDB4MDA3OCwgMHg4YzEyLCAweDBjN2UsIDB4MGQ3ZSwgMHg2MTA0LCAweGExODYsIDB4MDAxNiwKKwkweDAwNDAsIDB4OGMxMywgMHg2MDE4LCAweDIwNjgsIDB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwKKwkweDAwNDAsIDB4OGJlNiwgMHg4MDAxLCAweDY4NDIsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWRkNywKKwkweDEwNzgsIDB4NjJkMSwgMHgwZDdmLCAweDBjN2YsIDB4MDA3OCwgMHg4YzEyLCAweDEwNzgsIDB4N2M4MywKKwkweDAwNzgsIDB4OGJiYSwgMHgxMDc4LCAweDdjYTYsIDB4MDA3OCwgMHg4YmJhLCAweDBkN2UsIDB4MmM2OCwKKwkweDYxMDQsIDB4MTA3OCwgMHg5MWJjLCAweDBkN2YsIDB4MDA0MCwgMHg4YzUyLCAweDEwNzgsIDB4NzcyZCwKKwkweDAwNzgsIDB4OGM2OSwgMHg2MDA0LCAweDgwMDcsIDB4NjEzMCwgMHhhMThjLCAweDAwZmYsIDB4YTEwNSwKKwkweDYwMzIsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4NjAzOCwKKwkweDYwMGEsIDB4MjAwMSwgMHhhOGEzLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3YywgMHgwZDdmLCAweDBjN2YsIDB4MTA3OCwgMHg3YzgzLCAweDEwNzgsIDB4Mjg4MCwKKwkweDBlN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyOGE2LCAweDYwMTMsIDB4MDAwMCwKKwkweDYwMWYsIDB4MDAwNywgMHg2MDE3LCAweDAzOTgsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NjAwMCwKKwkweGEwOGEsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg4Yzg3LCAweDAwN2MsIDB4OGM5NywKKwkweDhjOTcsIDB4OGM5NywgMHg4Yzk3LCAweDhjOTcsIDB4OGM5NywgMHg4Yzk3LCAweDhjOTcsIDB4OGM5NywKKwkweDhhZDUsIDB4OGM5NywgMHg4YWRkLCAweDhjOTksIDB4OGFkZCwgMHg4Y2E3LCAweDhjOTcsIDB4MTA3OCwKKwkweDEzMzIsIDB4NjAwNCwgMHhhMDg2LCAweDAwOGIsIDB4MDA0MCwgMHg4Y2E3LCAweDYwMDcsIDB4MDA4YiwKKwkweDYwMDMsIDB4MDAwZCwgMHgxMDc4LCAweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwKKwkweDhlYjksIDB4MTA3OCwgMHg4ZDA2LCAweDAwNDAsIDB4OGNkZiwgMHgxMDc4LCAweDI4ODAsIDB4MGQ3ZSwKKwkweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweDhjYzEsIDB4NjAxMCwgMHgyMDY4LCAweDY4MzcsIDB4MDEwMywKKwkweDY4NGIsIDB4MDAwNiwgMHg2ODQ3LCAweDAwMDAsIDB4Njg1MCwgMHhjMGVkLCAweDY4NTIsIDB4MTA3OCwKKwkweDRhNzMsIDB4MmM2OCwgMHgxMDc4LCAweDc2YzcsIDB4MDA0MCwgMHg4Y2NmLCAweDY4MTgsIDB4NjAxYSwKKwkweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDhlYzYsIDB4MGM3ZiwgMHgwMDc4LCAweDhjZDAsIDB4MmQ2MCwKKwkweDBkN2YsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywKKwkweDAwMDEsIDB4MTA3OCwgMHg1ZGQ3LCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDhjZjEsIDB4NjAzMCwKKwkweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMDQwLCAweDhjZWIsIDB4YTE4NiwKKwkweDAwMzUsIDB4MDBjMCwgMHg4Y2VmLCAweDEwNzgsIDB4Mjg4MCwgMHgwMDc4LCAweDhjYzEsIDB4MTA3OCwKKwkweDhlYzYsIDB4MDA3YywgMHhhMjg0LCAweDAwMGYsIDB4MDBjMCwgMHg4ZDAzLCAweGEyODIsIDB4YWQwMCwKKwkweDAwNDgsIDB4OGQwMywgMHgyMDAxLCAweGE2MTYsIDB4MjAwNCwgMHhhMjAyLCAweDAwYzgsIDB4OGQwMywKKwkweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZDAyLCAweDAyN2UsIDB4MGU3ZSwKKwkweDIwNzEsIDB4YTYwMCwgMHg2MjEwLCAweDcwNWMsIDB4YTIwMiwgMHgwMDQ4LCAweDhkMTgsIDB4NzA2MCwKKwkweGEyMDIsIDB4MDBjOCwgMHg4ZDE4LCAweGEwODUsIDB4MDAwMSwgMHgwZTdmLCAweDAyN2YsIDB4MDA3YywKKwkweGEwMDYsIDB4MDA3OCwgMHg4ZDE1LCAweDBlN2UsIDB4MGM3ZSwgMHgwMzdlLCAweDAwN2UsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDYxLCAweGFkMDAsIDB4MjA3MSwgMHhhNjAwLCAweDczNDgsIDB4NzA2NCwKKwkweGEzMDIsIDB4MDBjOCwgMHg4ZDQ1LCAweDYwMWMsIDB4YTIwNiwgMHgwMGMwLCAweDhkM2QsIDB4MTA3OCwKKwkweDkwMmIsIDB4MDA0MCwgMHg4ZDNkLCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweDhkMzksIDB4MTA3OCwKKwkweDdjODMsIDB4MGM3ZSwgMHgxMDc4LCAweDc3MmQsIDB4MGM3ZiwgMHhhY2UwLCAweDAwMTAsIDB4NzA1OCwKKwkweGFjMDIsIDB4MDBjOCwgMHg4ZDQ1LCAweDAwNzgsIDB4OGQyNiwgMHgxMjdmLCAweDAwN2YsIDB4MDM3ZiwKKwkweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGM3ZSwgMHgwMTdlLCAweGExODgsIDB4YTczNSwKKwkweDIxMGMsIDB4ODFmZiwgMHgwMDQwLCAweDhkNTksIDB4MjA2MSwgMHhhOWIzLCAweDYxMWEsIDB4MTA3OCwKKwkweDI4ODAsIDB4YTAwNiwgMHgwMDc4LCAweDhkNWUsIDB4YTA4NSwgMHgwMDAxLCAweDAxN2YsIDB4MGM3ZiwKKwkweDBlN2YsIDB4MDA3YywgMHgwYzdlLCAweDA1N2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwKKwkweDEwNzgsIDB4NzZjNywgMHgwNTdmLCAweDAwNDAsIDB4OGQ3YiwgMHg2NjEyLCAweDY1MWEsIDB4NjAxZiwKKwkweDAwMDMsIDB4MjAwOSwgMHgwMDRiLCAweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwKKwkweDA1N2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZDc3LCAweDBjN2UsIDB4MDU3ZSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYyYTAsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDU3ZiwKKwkweDAwNDAsIDB4OGRhOSwgMHg2MDEzLCAweDAwMDAsIDB4NjUxYSwgMHg2MDFmLCAweDAwMDMsIDB4MGM3ZSwKKwkweDI1NjAsIDB4MTA3OCwgMHg0N2U5LCAweDBjN2YsIDB4MTA3OCwgMHg1ZjAxLCAweDA3N2UsIDB4MjAzOSwKKwkweDAwMDAsIDB4MTA3OCwgMHg1ZTBhLCAweDJjMDgsIDB4MTA3OCwgMHg5ZjhiLCAweDA3N2YsIDB4MjAwOSwKKwkweDAwNGMsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDA1N2YsIDB4MGM3ZiwKKwkweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDhkYTUsIDB4MGY3ZSwgMHgwYzdlLCAweDA0N2UsIDB4MGM3ZSwKKwkweDEwNzgsIDB4NzZjNywgMHgyYzc4LCAweDBjN2YsIDB4MDA0MCwgMHg4ZGM2LCAweDdlMTIsIDB4MmMwMCwKKwkweDc4MWEsIDB4NzgxZiwgMHgwMDAzLCAweDIwMjEsIDB4MDAwNSwgMHgxMDc4LCAweDhlMTEsIDB4MmY2MCwKKwkweDIwMDksIDB4MDA0ZCwgMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDA0N2YsIDB4MGM3ZiwKKwkweDBmN2YsIDB4MDA3YywgMHgwZjdlLCAweDBjN2UsIDB4MDQ3ZSwgMHgwYzdlLCAweDEwNzgsIDB4NzZjNywKKwkweDJjNzgsIDB4MGM3ZiwgMHgwMDQwLCAweDhkZTQsIDB4N2UxMiwgMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwKKwkweDAwMDMsIDB4MjAyMSwgMHgwMDA1LCAweDEwNzgsIDB4OGUxMSwgMHgyZjYwLCAweDIwMDksIDB4MDA0ZSwKKwkweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MDQ3ZiwgMHgwYzdmLCAweDBmN2YsIDB4MDA3YywKKwkweDBmN2UsIDB4MGM3ZSwgMHgwNDdlLCAweDBjN2UsIDB4MTA3OCwgMHg3NmM3LCAweDJjNzgsIDB4MGM3ZiwKKwkweDAwNDAsIDB4OGUwZCwgMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLCAweDAwMDMsIDB4MjAyMSwKKwkweDAwMDQsIDB4MTA3OCwgMHg4ZTExLCAweDIwMDEsIDB4YTg5ZCwgMHgyMDA0LCAweGQwZmMsIDB4MDA0MCwKKwkweDhlMDYsIDB4MmY2MCwgMHgxMDc4LCAweDc3MmQsIDB4MDA3OCwgMHg4ZTBiLCAweDJmNjAsIDB4MjAwOSwKKwkweDAwNTIsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsIDB4MDAwMSwgMHgwNDdmLCAweDBjN2YsIDB4MGY3ZiwKKwkweDAwN2MsIDB4MDk3ZSwgMHgwNzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NDc3NSwKKwkweDAwNDAsIDB4OGUxZSwgMHgyMDAxLCAweDhlMTYsIDB4MDA3OCwgMHg4ZTI0LCAweDEwNzgsIDB4NDczOSwKKwkweDAwNDAsIDB4OGUyZCwgMHgyMDAxLCAweDhlMWUsIDB4MDA3ZSwgMHhhMDBlLCAweDI0MDAsIDB4MTA3OCwKKwkweDRiNTEsIDB4MTA3OCwgMHg0YTczLCAweDAwN2YsIDB4MDA3YSwgMHgyNDE4LCAweDEwNzgsIDB4NjE2MSwKKwkweDYyYTAsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDEsIDB4MjAzOSwgMHgwMDAxLCAweDI2MDgsIDB4MTA3OCwKKwkweDVmMWIsIDB4MDg3ZiwgMHgxMDc4LCAweDVlMGEsIDB4MmYwOCwgMHgyNjQ4LCAweDEwNzgsIDB4OWY4YiwKKwkweDYxM2MsIDB4ODFmZiwgMHgxMDQwLCAweDVmZGIsIDB4MTA3OCwgMHg2MmQxLCAweDEyN2YsIDB4MDc3ZiwKKwkweDA5N2YsIDB4MDA3YywgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwKKwkweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDhlNjMsIDB4NjYwYSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwKKwkweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMWYsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsIDB4MDAwMSwKKwkweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZTYwLCAweDBjN2UsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsIDB4NzZjNywgMHgwMTdmLCAweDAwNDAsIDB4OGU3ZiwKKwkweDY2MGEsIDB4NjExYSwgMHg2MDFmLCAweDAwMDgsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAyMSwKKwkweDEwNzgsIDB4Nzc1YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwKKwkweDAwNzgsIDB4OGU3YywgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwKKwkweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDhlOWIsIDB4NjYwYSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwKKwkweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwM2QsIDB4MTA3OCwgMHg3NzVjLCAweGEwODUsIDB4MDAwMSwKKwkweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4ZTk4LCAweDBjN2UsIDB4MTI3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsIDB4NzZjNywgMHgwMTdmLCAweDAwNDAsIDB4OGViNiwKKwkweDYxMWEsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwKKwkweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwKKwkweDhlYjMsIDB4MDI3ZSwgMHgwZDdlLCAweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyZmYsIDB4MDA0MCwKKwkweDhlYzMsIDB4ODIxMSwgMHg2YTNlLCAweDBkN2YsIDB4MDI3ZiwgMHgwMDdjLCAweDAwN2UsIDB4NjAwMCwKKwkweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDhlZDgsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDAwNywKKwkweDIwMDEsIDB4YThhMywgMHgyMDA0LCAweDYwMTYsIDB4MTA3OCwgMHhhNDk1LCAweDYwM2YsIDB4MDAwMCwKKwkweDAwN2YsIDB4MDA3YywgMHgwNjdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgyMDMxLCAweGE2NTMsIDB4MjYzNCwKKwkweGQ2ZTQsIDB4MDA0MCwgMHg4ZWU4LCAweDY2MTgsIDB4MjY2MCwgMHg2ZTQ4LCAweDEwNzgsIDB4NDZlNywKKwkweDBkN2YsIDB4MGM3ZiwgMHgwNjdmLCAweDAwN2MsIDB4MDA3ZSwgMHgwMTdlLCAweDYwMDQsIDB4YTA4ZSwKKwkweDAwMDIsIDB4MDA0MCwgMHg4ZWZkLCAweGEwOGUsIDB4MDAwMywgMHgwMDQwLCAweDhlZmQsIDB4YTA4ZSwKKwkweDAwMDQsIDB4MDA0MCwgMHg4ZWZkLCAweGEwODUsIDB4MDAwMSwgMHgwMTdmLCAweDAwN2YsIDB4MDA3YywKKwkweDAwN2UsIDB4MGQ3ZSwgMHg2MDEwLCAweGEwNmQsIDB4MDA0MCwgMHg4ZjBkLCAweDY4MzgsIDB4ZDBmYywKKwkweDAwNDAsIDB4OGYwZCwgMHhhMDA2LCAweDAwNzgsIDB4OGYwZiwgMHhhMDg1LCAweDAwMDEsIDB4MGQ3ZiwKKwkweDAwN2YsIDB4MDA3YywgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwKKwkweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDhmMmMsIDB4NjExYSwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwKKwkweDYwMTIsIDB4MTA3OCwgMHgyODgwLCAweDIwMDksIDB4MDAyOCwgMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwKKwkweDAwMDEsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDhmMjksIDB4YTE4NiwKKwkweDAwMTUsIDB4MDBjMCwgMHg4ZjQ0LCAweDIwMTEsIDB4YTYyMCwgMHgyMjA0LCAweGEwODYsIDB4MDA3NCwKKwkweDAwYzAsIDB4OGY0NCwgMHgxMDc4LCAweDdmOTEsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAyOSwKKwkweDEwNzgsIDB4NWRkNywgMHgwMDc4LCAweDhmNDgsIDB4MTA3OCwgMHg3YzgzLCAweDEwNzgsIDB4NzcyZCwKKwkweDAwN2MsIDB4YTE4NiwgMHgwMDE2LCAweDAwYzAsIDB4OGY1MywgMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwKKwkweDQ1MDIsIDB4MDA3OCwgMHg4Zjc0LCAweGExODYsIDB4MDAxNSwgMHgwMGMwLCAweDhmNzgsIDB4MjAxMSwKKwkweGE2MjAsIDB4MjIwNCwgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHg4Zjc4LCAweDBkN2UsIDB4NjAxOCwKKwkweDIwNjgsIDB4MTA3OCwgMHg0NjQ5LCAweDBkN2YsIDB4MTA3OCwgMHg4MDQzLCAweDAwYzAsIDB4OGY3OCwKKwkweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDY4OTAsIDB4MGQ3ZiwgMHhhMDA1LCAweDAwNDAsIDB4OGY3OCwKKwkweDIwMDEsIDB4MDAwNiwgMHgxMDc4LCAweDQ1MDIsIDB4MTA3OCwgMHg3N2Y4LCAweDAwNzgsIDB4OGY3YywKKwkweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHg2ODQ4LCAweGEwODYsIDB4MDAwNSwKKwkweDAwYzAsIDB4OGY4NCwgMHgxMDc4LCAweDhmODUsIDB4MDA3YywgMHg2ODUwLCAweGMwYWQsIDB4Njg1MiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGFiOGMsIDB4NzAxNCwgMHhkMGU0LCAweDAwNDAsIDB4OGY5YSwKKwkweDYwMTMsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDUwLCAweDEwNzgsIDB4NWQ4YSwKKwkweDEwNzgsIDB4NjJkMSwgMHgwZTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwKKwkweDQ5NjMsIDB4MGY3ZiwgMHgwMDQwLCAweDhmYTksIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwKKwkweDhmYWIsIDB4MGM3ZiwgMHgwMDdjLCAweDhhZDUsIDB4OGZiNiwgMHg4ZmI5LCAweDhmYmMsIDB4YTI1ZCwKKwkweGEyNzksIDB4YTI3YywgMHg4YWQ1LCAweDhhZDUsIDB4MTA3OCwgMHgxMzMyLCAweDAwMDUsIDB4MDAwNSwKKwkweDAwN2MsIDB4MDAwNSwgMHgwMDA1LCAweDAwN2MsIDB4MTA3OCwgMHg4ZmJmLCAweDAwN2MsIDB4MGY3ZSwKKwkweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDAwNDAsIDB4OGZlZSwgMHgxMDc4LCAweDc2YzcsIDB4MDBjMCwKKwkweDhmY2YsIDB4MjAwMSwgMHhhOGE0LCAweDIwMDQsIDB4NzgzZSwgMHgwMDc4LCAweDhmZWUsIDB4NzgxOCwKKwkweDYwMWEsIDB4NzgxYywgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHg4ZmRjLCAweDc4MDgsIDB4NjAzNiwKKwkweDJmMDAsIDB4NjAzYSwgMHgwMDc4LCAweDhmZTAsIDB4NzgwOCwgMHg2MDNhLCAweDJmMDAsIDB4NjAzNiwKKwkweDYwMmEsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDcsIDB4MDAzNSwgMHg2MDAzLCAweDAwMDEsIDB4NzkyMCwKKwkweDYxMjIsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgyZjYwLCAweDBmN2YsIDB4MDA3YywKKwkweDAxN2UsIDB4MGY3ZSwgMHg2ODJjLCAweDYwMzIsIDB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsIDB4OTAwMSwKKwkweGEwODYsIDB4MDAwNSwgMHgwMDQwLCAweDkwMDUsIDB4YTAwNiwgMHg2MDJhLCAweDYwMmUsIDB4MDA3OCwKKwkweDkwMTYsIDB4NjgyNCwgMHhjMGY0LCAweGMwZDUsIDB4NjgyNiwgMHg2ODEwLCAweDIwNzgsIDB4Nzg3YywKKwkweDY5MzgsIDB4YTEwMiwgMHg3ODgwLCAweDY5MzQsIDB4YTEwMywgMHgwMGM4LCAweDhmZmMsIDB4NjgzNCwKKwkweDYwMmEsIDB4NjgzOCwgMHhhMDg0LCAweGZmZmMsIDB4NjgzYSwgMHg2MDJlLCAweDJkMDAsIDB4NjAzNiwKKwkweDY4MDgsIDB4NjAzYSwgMHg2OTE4LCAweDYxMWEsIDB4NjkyMCwgMHg2MTIyLCAweDYwMWYsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAzOSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDY4MDMsIDB4MDAwMiwKKwkweDBmN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwgMHg2MDA0LCAweGEwOGUsIDB4MDAzNCwKKwkweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwMzUsIDB4MDA0MCwgMHg5MDUwLCAweGEwOGUsIDB4MDAzNiwKKwkweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwMzcsIDB4MDA0MCwgMHg5MDUwLCAweGEwOGUsIDB4MDAzOCwKKwkweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwMzksIDB4MDA0MCwgMHg5MDUwLCAweGEwOGUsIDB4MDAzYSwKKwkweDAwNDAsIDB4OTA1MCwgMHhhMDhlLCAweDAwM2IsIDB4MDA0MCwgMHg5MDUwLCAweGEwODUsIDB4MDAwMSwKKwkweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ5NjMsIDB4MDBjMCwKKwkweDkwNWQsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4OTA2YywgMHg2MDI0LCAweGQwZjQsIDB4MDBjMCwKKwkweDkwNmIsIDB4YzBmNSwgMHg2MDI2LCAweDYwMTAsIDB4MjA3OCwgMHg3ODI4LCAweDYwM2EsIDB4NzgyYywKKwkweDYwMzYsIDB4MTA3OCwgMHgxNzU3LCAweGEwMDYsIDB4MGY3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwKKwkweDAyN2UsIDB4MDM3ZSwgMHgwZTdlLCAweDIwMDEsIDB4YTg5ZSwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwKKwkweDIwMDEsIDB4MDAzMiwgMHgxMDc4LCAweDVjMWMsIDB4MjAwMSwgMHhhOGEyLCAweDgyZmYsIDB4MDBjMCwKKwkweDkwODMsIDB4MjAxMSwgMHgwMDE0LCAweDIyMDIsIDB4MjAwMSwgMHhhOGEwLCAweDIwMGMsIDB4ODAwMCwKKwkweDIwMTQsIDB4MjA3MSwgMHhhODhkLCAweDcxMWEsIDB4NzIxZSwgMHgyMDAxLCAweDAwNjQsIDB4MTA3OCwKKwkweDVjMWMsIDB4MjAwMSwgMHhhOGEzLCAweDgyZmYsIDB4MDBjMCwgMHg5MDk4LCAweDIwMTEsIDB4MDAxNCwKKwkweDIyMDIsIDB4MjAwOSwgMHhhOGE0LCAweGEyODAsIDB4MDAwYSwgMHgyMDBhLCAweDEwNzgsIDB4NDk4YiwKKwkweDBlN2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MGU3ZSwKKwkweDIwMDEsIDB4YThhMiwgMHgyMDAzLCAweDAwMjgsIDB4MjAwMSwgMHhhOGEzLCAweDIwMDMsIDB4MDAxNCwKKwkweDIwNzEsIDB4YTg4ZCwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwN2QwLCAweDIwMDEsIDB4YThhNCwKKwkweDIwMDMsIDB4MDAxZSwgMHgwZTdmLCAweDAwN2YsIDB4MDA3YywgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc2YzcsIDB4MDE3ZiwgMHgwMDQwLCAweDkwZDUsIDB4NjExYSwKKwkweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMzLCAweDEwNzgsIDB4Nzc1YywKKwkweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OTBkMiwKKwkweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsIDB4YTYwMCwgMHhhMTg2LCAweDAwMTUsIDB4MDBjMCwKKwkweDkxMDcsIDB4NzA4MCwgMHhhMDg2LCAweDAwMTgsIDB4MDBjMCwgMHg5MTA3LCAweDYwMTAsIDB4MjA2OCwKKwkweDZhM2MsIDB4ZDJlNCwgMHgwMGMwLCAweDkwZmIsIDB4MmM3OCwgMHgxMDc4LCAweDY0OTAsIDB4MDA0MCwKKwkweDkxMGYsIDB4NzA2YywgMHg2YTUwLCAweGEyMDYsIDB4MDBjMCwgMHg5MTAzLCAweDcwNzAsIDB4NmE1NCwKKwkweGEyMDYsIDB4MDBjMCwgMHg5MTAzLCAweDYyMTgsIDB4YTI5MCwgMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwKKwkweDAwMDAsIDB4MTA3OCwgMHgyOGM4LCAweDEwNzgsIDB4NzdmOCwgMHgwMDc4LCAweDkxMGIsIDB4MTA3OCwKKwkweDdjODMsIDB4MTA3OCwgMHg3NzJkLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDAwN2MsIDB4NzA1MCwKKwkweGEwODAsIDB4MjljMCwgMHgyMDA0LCAweDZhNTQsIDB4YTIwNiwgMHgwMDQwLCAweDkwZmIsIDB4MDA3OCwKKwkweDkxMDMsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsIDB4NzZjNywKKwkweDAxN2YsIDB4MDA0MCwgMHg5MTMxLCAweDYxMWEsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwKKwkweDIwMDksIDB4MDA0MywgMHgxMDc4LCAweDc3NWMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGM3ZiwKKwkweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDkxMmUsIDB4MGQ3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwKKwkweGE2MDAsIDB4YTE4NiwgMHgwMDE1LCAweDAwYzAsIDB4OTE1YSwgMHg3MDgwLCAweGEwODYsIDB4MDAwNCwKKwkweDAwYzAsIDB4OTE1YSwgMHg2MDEwLCAweGEwZTgsIDB4MDAwZiwgMHgyYzc4LCAweDEwNzgsIDB4NjQ5MCwKKwkweDAwNDAsIDB4OTE2MiwgMHg3MDZjLCAweDZhMDgsIDB4YTIwNiwgMHgwMGMwLCAweDkxNTYsIDB4NzA3MCwKKwkweDZhMGMsIDB4YTIwNiwgMHgwMGMwLCAweDkxNTYsIDB4MTA3OCwgMHgyODgwLCAweDEwNzgsIDB4NzdmOCwKKwkweDAwNzgsIDB4OTE1ZSwgMHgxMDc4LCAweDdjODMsIDB4MTA3OCwgMHg3NzJkLCAweDBmN2YsIDB4MGU3ZiwKKwkweDBkN2YsIDB4MDA3YywgMHg3MDUwLCAweGEwODAsIDB4MjljMCwgMHgyMDA0LCAweDZhMGMsIDB4YTIwNiwKKwkweDAwNDAsIDB4OTE1NCwgMHgwMDc4LCAweDkxNTYsIDB4MDE3ZSwgMHgwMjdlLCAweDY4NGMsIDB4ZDBhYywKKwkweDAwNDAsIDB4OTE4NCwgMHg2OTE0LCAweDZhMTAsIDB4MjEwMCwgMHhhMjA1LCAweDAwNDAsIDB4OTE4NCwKKwkweDY4NjAsIDB4YTEwNiwgMHgwMGMwLCAweDkxODAsIDB4Njg1YywgMHhhMjA2LCAweDAwNDAsIDB4OTE4NCwKKwkweDY5NjIsIDB4NmE1ZSwgMHhhMDg1LCAweDAwMDEsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGU3ZSwKKwkweDEyN2UsIDB4MjA3MSwgMHhhNjAwLCAweDIwOTEsIDB4ODAwMCwgMHg3NTQ4LCAweGE1ODIsIDB4MDAwMSwKKwkweDAwNDgsIDB4OTFiOSwgMHg3MDRjLCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwKKwkweDkxYTUsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTgsIDB4YWMwMiwgMHgwMGM4LCAweDkxYTEsIDB4MDA3OCwKKwkweDkxOTQsIDB4MjA2MSwgMHhhZDAwLCAweDAwNzgsIDB4OTE5NCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwKKwkweDc1NGEsIDB4YWNhOCwgMHgwMDEwLCAweDcwNTgsIDB4YTUwMiwgMHgwMGM4LCAweDkxYjUsIDB4NzU0ZSwKKwkweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHg3MDRmLCAweGFkMDAsIDB4MDA3OCwKKwkweDkxYjAsIDB4YTAwNiwgMHgwMDc4LCAweDkxYjIsIDB4MGM3ZSwgMHgwMjdlLCAweDAxN2UsIDB4YTE4NiwKKwkweDAwMzUsIDB4MDA0MCwgMHg5MWM2LCAweDZhMzQsIDB4MDA3OCwgMHg5MWM3LCAweDZhMjgsIDB4MTA3OCwKKwkweDhjZjIsIDB4MDA0MCwgMHg5MWYwLCAweDIyNjAsIDB4NjExYywgMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwKKwkweDkxZDUsIDB4YTE4NiwgMHgwMDA2LCAweDAwYzAsIDB4OTFlYywgMHg2ODM0LCAweGEyMDYsIDB4MDA0MCwKKwkweDkxZTQsIDB4NjgzOCwgMHhhMjA2LCAweDAwYzAsIDB4OTFlYywgMHg2MTA4LCAweDY4MzQsIDB4YTEwNiwKKwkweDAwYzAsIDB4OTFlYywgMHgwMDc4LCAweDkxZTksIDB4NjAwOCwgMHg2OTM4LCAweGExMDYsIDB4MDBjMCwKKwkweDkxZWMsIDB4NjAxOCwgMHg2OTE4LCAweGExMDYsIDB4MDE3ZiwgMHgwMjdmLCAweDBjN2YsIDB4MDA3YywKKwkweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDkxZWMsIDB4Njk0NCwgMHhkMWNjLCAweDAwNDAsIDB4OTIwZCwKKwkweGExOGMsIDB4MDBmZiwgMHhhMThlLCAweDAwMDIsIDB4MDBjMCwgMHg5MjBkLCAweGFkODgsIDB4MDAxZSwKKwkweDIxMGMsIDB4YTE4YywgMHgwZjAwLCAweDgxMGYsIDB4YTE4ZSwgMHgwMDAxLCAweDAwYzAsIDB4OTIwZCwKKwkweDY4MTAsIDB4NjkxNCwgMHhhMTE1LCAweDEwYzAsIDB4ODRkNSwgMHgwMDdjLCAweDA2N2UsIDB4NjAwMCwKKwkweGEwYjIsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg5MjE4LCAweDA2N2YsIDB4MDA3YywKKwkweDkyMjgsIDB4OTZkZiwgMHg5N2ZiLCAweDkyMjgsIDB4OTIyOCwgMHg5MjI4LCAweDkyMjgsIDB4OTIyOCwKKwkweDkyNjIsIDB4OTg4ZSwgMHg5MjI4LCAweDkyMjgsIDB4OTIyOCwgMHg5MjI4LCAweDkyMjgsIDB4OTIyOCwKKwkweDEwNzgsIDB4MTMzMiwgMHgwNjdlLCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsIDB4MTMzMiwKKwkweDEwNzksIDB4OTIzNCwgMHgwNjdmLCAweDAwN2MsIDB4OTI0NCwgMHg5ZDUzLCAweDkyNDQsIDB4OTI0NCwKKwkweDkyNDQsIDB4OTI0NCwgMHg5MjQ0LCAweDkyNDQsIDB4OWQxMSwgMHg5ZGExLCAweDkyNDQsIDB4YTNiMCwKKwkweGEzZTQsIDB4YTNiMCwgMHhhM2U0LCAweDkyNDQsIDB4MTA3OCwgMHgxMzMyLCAweDA2N2UsIDB4NjAwMCwKKwkweGEwYjIsIDB4MDAxMCwgMHgxMGM4LCAweDEzMzIsIDB4MTA3OSwgMHg5MjUwLCAweDA2N2YsIDB4MDA3YywKKwkweDkyNjAsIDB4OTllYiwgMHg5YWM3LCAweDlhZjUsIDB4OWI3MCwgMHg5MjYwLCAweDljNzYsIDB4OWMxZSwKKwkweDk4OWEsIDB4OWNlNSwgMHg5Y2ZiLCAweDkyNjAsIDB4OTI2MCwgMHg5MjYwLCAweDkyNjAsIDB4OTI2MCwKKwkweDEwNzgsIDB4MTMzMiwgMHhhMWIyLCAweDAwNDQsIDB4MTBjOCwgMHgxMzMyLCAweDIxMDAsIDB4MDA3OSwKKwkweDkyNjksIDB4OTJhOSwgMHg5NDk4LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDk0YTAsIDB4OTJhOSwKKwkweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwKKwkweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwKKwkweDkyYWIsIDB4OTMxMSwgMHg5MzIwLCAweDkzNzcsIDB4OTM5NiwgMHg5NDE1LCAweDk0ODUsIDB4OTJhOSwKKwkweDkyYTksIDB4OTRhNCwgMHg5MmE5LCAweDkyYTksIDB4OTRiNywgMHg5NGMyLCAweDkyYTksIDB4OTJhOSwKKwkweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDk0ZmEsIDB4OTJhOSwgMHg5MmE5LCAweDk1MDksIDB4OTJhOSwKKwkweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5NTIyLCAweDkyYTksIDB4OTJhOSwKKwkweDkyYTksIDB4OTVhZiwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwgMHg5MmE5LCAweDkyYTksIDB4OTJhOSwKKwkweDk2MjksIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4NDk2NywgMHgwMGMwLCAweDkyYmIsIDB4MjAwMSwKKwkweGE2MzMsIDB4MjAwNCwgMHhkMGNjLCAweDAwYzAsIDB4OTJiYiwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwKKwkweDAwMDgsIDB4MDBjMCwgMHg5MmMzLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywKKwkweDAwMDAsIDB4MDA3OCwgMHg5NDkzLCAweDEwNzgsIDB4NDk1NywgMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwKKwkweDAyN2UsIDB4MDE3ZSwgMHg2MjE4LCAweDIyNzAsIDB4NzJhMCwgMHgwMjdlLCAweDIwMTksIDB4MDAyOSwKKwkweDEwNzgsIDB4NWYwMSwgMHgwNzdlLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDVlMGEsIDB4MmMwOCwKKwkweDEwNzgsIDB4OWY4YiwgMHgwNzdmLCAweDAxN2YsIDB4MmU2MCwgMHgxMDc4LCAweDQ3ZTksIDB4MDE3ZiwKKwkweDAyN2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsIDB4NjYxOCwgMHgwYzdlLCAweDI2NjAsIDB4MTA3OCwKKwkweDQ1ZDYsIDB4MGM3ZiwgMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwKKwkweDAwMDYsIDB4MDA0OCwgMHg5MzAzLCAweDEwNzgsIDB4OWViZiwgMHgwMGMwLCAweDkzNzEsIDB4MTA3OCwKKwkweDllNTAsIDB4MDBjMCwgMHg5MmZmLCAweDYwMDcsIDB4MDAwOCwgMHgwMDc4LCAweDk0OTMsIDB4NjAwNywKKwkweDAwMDksIDB4MDA3OCwgMHg5NDkzLCAweDEwNzgsIDB4YTA5ZiwgMHgwMDQwLCAweDkzMGQsIDB4MTA3OCwKKwkweDllYmYsIDB4MDA0MCwgMHg5MmY3LCAweDAwNzgsIDB4OTM3MSwgMHg2MDEzLCAweDE5MDAsIDB4MDA3OCwKKwkweDkyZmYsIDB4MTA3OCwgMHgyOWJiLCAweDAwYzAsIDB4OTY2NCwgMHg2MTA2LCAweDEwNzgsIDB4OWUwNSwKKwkweDYwMDcsIDB4MDAwNiwgMHgwMDc4LCAweDk0OTMsIDB4NjAwNywgMHgwMDA3LCAweDAwNzgsIDB4OTQ5MywKKwkweDEwNzgsIDB4YTQxYywgMHgwMGMwLCAweDk2NjQsIDB4MTA3OCwgMHgyOWJiLCAweDAwYzAsIDB4OTY2NCwKKwkweDBkN2UsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsIDB4YTY4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwKKwkweDAwYzgsIDB4OTMzNiwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0NGVlLCAweGE2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTM1MywgMHhhNjg2LCAweDAwMDQsIDB4MDA0MCwKKwkweDkzNTMsIDB4NmUwNCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTM1MywKKwkweGE2ODYsIDB4MDAwNCwgMHgwMDQwLCAweDkzNTMsIDB4YTY4NiwgMHgwMDA1LCAweDAwNDAsIDB4OTM1MywKKwkweDBkN2YsIDB4MDA3OCwgMHg5MzcxLCAweDEwNzgsIDB4OWYyNSwgMHgwMGMwLCAweDkzNmMsIDB4YTY4NiwKKwkweDAwMDYsIDB4MDBjMCwgMHg5MzY1LCAweDAyN2UsIDB4NjIxOCwgMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwKKwkweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDI4YzgsIDB4MDI3ZiwgMHgxMDc4LCAweDQ2NDksIDB4NjAwNywKKwkweDAwMGEsIDB4MGQ3ZiwgMHgwMDc4LCAweDk0OTMsIDB4NjAwNywgMHgwMDBiLCAweDBkN2YsIDB4MDA3OCwKKwkweDk0OTMsIDB4MTA3OCwgMHgyODgwLCAweDYwMDcsIDB4MDAwMSwgMHgwMDc4LCAweDk0OTMsIDB4MTA3OCwKKwkweGE0MWMsIDB4MDBjMCwgMHg5NjY0LCAweDEwNzgsIDB4MjliYiwgMHgwMGMwLCAweDk2NjQsIDB4NjYxOCwKKwkweDBkN2UsIDB4MjY2OCwgMHg2ZTA0LCAweDBkN2YsIDB4YTY4NiwgMHgwNzA3LCAweDAwNDAsIDB4OTM3MSwKKwkweDAyN2UsIDB4NjIxOCwgMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwKKwkweDI4YzgsIDB4MDI3ZiwgMHg2MDA3LCAweDAwMGMsIDB4MDA3OCwgMHg5NDkzLCAweDEwNzgsIDB4NDk2NywKKwkweDAwYzAsIDB4OTNhMywgMHgyMDAxLCAweGE2MzMsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwKKwkweDAwMDgsIDB4MDBjMCwgMHg5M2FiLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywKKwkweDAwMDAsIDB4MDA3OCwgMHg5NDkzLCAweDEwNzgsIDB4NDk1NywgMHg2NjE4LCAweGE2YjAsIDB4MDAwMSwKKwkweDI2MzQsIDB4YTY4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwMDQ4LCAweDkzZWYsIDB4YTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDQsIDB4MDA0MCwgMHg5M2MyLCAweGE2ODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4OTM3MSwgMHgxMDc4LCAweDlmMzQsIDB4MDBjMCwgMHg5M2NhLCAweDYwMDcsIDB4MDAwZSwKKwkweDAwNzgsIDB4OTQ5MywgMHgwNDdlLCAweDY0MTgsIDB4YTRhMCwgMHgwMDI4LCAweDI0MjQsIDB4YTRhNCwKKwkweDAwZmYsIDB4ODQyNywgMHgwNDdlLCAweDEwNzgsIDB4Mjg4MCwgMHgwNDdmLCAweDAxN2UsIDB4YTAwNiwKKwkweDIwMDksIDB4YTY1MywgMHgyMTBjLCAweGQxYTQsIDB4MDA0MCwgMHg5M2U5LCAweDIwMDksIDB4MDAyOSwKKwkweDEwNzgsIDB4YTIxZCwgMHg2MDE4LCAweDBkN2UsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwKKwkweDBkN2YsIDB4MDE3ZiwgMHgwNDdmLCAweDYwMDcsIDB4MDAwMSwgMHgwMDc4LCAweDk0OTMsIDB4MjAwMSwKKwkweDAwMDEsIDB4MTA3OCwgMHg0NGVlLCAweDE1N2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjAxOSwgMHhhNjA1LCAweDIwMTEsIDB4YWI5MCwgMHgxMDc4LCAweDgwZGUsIDB4MDM3ZiwKKwkweDAyN2YsIDB4MDE3ZiwgMHgxNTdmLCAweGEwMDUsIDB4MDA0MCwgMHg5NDBmLCAweGE2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTNjMiwgMHgwMDc4LCAweDkzNzEsIDB4NjAxMywKKwkweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDQ5NjcsIDB4MDBjMCwKKwkweDk0MjIsIDB4MjAwMSwgMHhhNjMzLCAweDIwMDQsIDB4YTA4NCwgMHgwMDA5LCAweGEwODYsIDB4MDAwOCwKKwkweDAwYzAsIDB4OTQyYSwgMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MDAwMCwKKwkweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDQ5NTcsIDB4NjYxOCwgMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwKKwkweGE2ODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHg5NDcyLCAweGE2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsIDB4OTQ0MSwgMHhhNjg2LCAweDAwMDYsIDB4MDBjMCwKKwkweDkzNzEsIDB4MTA3OCwgMHg5ZjVmLCAweDAwYzAsIDB4OTQ0ZCwgMHgxMDc4LCAweDllNTAsIDB4MDBjMCwKKwkweDk0NGQsIDB4NjAwNywgMHgwMDEwLCAweDAwNzgsIDB4OTQ5MywgMHgwNDdlLCAweDY0MTgsIDB4YTRhMCwKKwkweDAwMjgsIDB4MjQyNCwgMHhhNGE0LCAweDAwZmYsIDB4ODQyNywgMHgwNDdlLCAweDEwNzgsIDB4Mjg4MCwKKwkweDA0N2YsIDB4MDE3ZSwgMHhhMDA2LCAweDIwMDksIDB4YTY1MywgMHgyMTBjLCAweGQxYTQsIDB4MDA0MCwKKwkweDk0NmMsIDB4MjAwOSwgMHgwMDI5LCAweDEwNzgsIDB4YTIxZCwgMHg2MDE4LCAweDBkN2UsIDB4MjA2OCwKKwkweDY4MDAsIDB4YzBlNSwgMHg2ODAyLCAweDBkN2YsIDB4MDE3ZiwgMHgwNDdmLCAweDYwMDcsIDB4MDAwMSwKKwkweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweGEwOWYsIDB4MDA0MCwgMHg5NDdmLCAweGE2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTQ0MSwgMHgwMDc4LCAweDkzNzEsIDB4NjAxMywKKwkweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDI5YmIsIDB4MDBjMCwKKwkweDk2NjQsIDB4MTA3OCwgMHhhNDFjLCAweDAwYzAsIDB4OTY2NCwgMHgxMDc4LCAweDk2NjcsIDB4MDBjMCwKKwkweDkzNzEsIDB4NjAwNywgMHgwMDEyLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVkZDcsIDB4MDA3YywKKwkweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwNzgsIDB4OTQ5NywKKwkweDYwMDcsIDB4MDAwNSwgMHgwMDc4LCAweDk0OWEsIDB4MTA3OCwgMHhhNDFjLCAweDAwYzAsIDB4OTY2NCwKKwkweDEwNzgsIDB4MjliYiwgMHgwMGMwLCAweDk2NjQsIDB4MTA3OCwgMHg5NjY3LCAweDAwYzAsIDB4OTM3MSwKKwkweDYwMDcsIDB4MDAyMCwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZGQ3LCAweDAwN2MsIDB4MTA3OCwKKwkweDI5YmIsIDB4MDBjMCwgMHg5NjY0LCAweDYwMDcsIDB4MDAyMywgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwKKwkweDVkZDcsIDB4MDA3YywgMHgxMDc4LCAweGE0MWMsIDB4MDBjMCwgMHg5NjY0LCAweDEwNzgsIDB4MjliYiwKKwkweDAwYzAsIDB4OTY2NCwgMHgxMDc4LCAweDk2NjcsIDB4MDBjMCwgMHg5MzcxLCAweDAxN2UsIDB4MDI3ZSwKKwkweDIwMTEsIDB4YWI5MCwgMHgyMjE0LCAweDJjMDgsIDB4YTAwNiwgMHgxMDc4LCAweGExZTYsIDB4MDBjMCwKKwkweDk0ZTksIDB4MjE2MCwgMHg2MDA3LCAweDAwMjYsIDB4NjAxMywgMHgxNzAwLCAweDIwMTEsIDB4YWI4OSwKKwkweDIyMTQsIDB4YTI5NiwgMHhmZmZmLCAweDAwYzAsIDB4OTRmMywgMHg2MDA3LCAweDAwMjUsIDB4MDA3OCwKKwkweDk0ZjMsIDB4NjAwNCwgMHhhMDg2LCAweDAwMjQsIDB4MDBjMCwgMHg5NGYwLCAweDEwNzgsIDB4NzcyZCwKKwkweDIxNjAsIDB4NjAwNywgMHgwMDI1LCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVkZDcsIDB4MDI3ZiwKKwkweDAxN2YsIDB4MDA3YywgMHgxMDc4LCAweDI5YmIsIDB4MDBjMCwgMHg5NjY0LCAweDYxMDYsIDB4MTA3OCwKKwkweDk2ODcsIDB4NjAwNywgMHgwMDJiLCAweDAwNzgsIDB4OTQ5MywgMHg2MDA3LCAweDAwMmMsIDB4MDA3OCwKKwkweDk0OTMsIDB4MTA3OCwgMHhhNDFjLCAweDAwYzAsIDB4OTY2NCwgMHgxMDc4LCAweDI5YmIsIDB4MDBjMCwKKwkweDk2NjQsIDB4MTA3OCwgMHg5NjY3LCAweDAwYzAsIDB4OTM3MSwgMHg2MTA2LCAweDEwNzgsIDB4OTY4YywKKwkweDAwYzAsIDB4OTUxZSwgMHg2MDA3LCAweDAwMmUsIDB4MDA3OCwgMHg5NDkzLCAweDYwMDcsIDB4MDAyZiwKKwkweDAwNzgsIDB4OTQ5MywgMHgxMDc4LCAweDI5YmIsIDB4MDBjMCwgMHg5NjY0LCAweDBlN2UsIDB4MGQ3ZSwKKwkweDBjN2UsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDEsIDB4MjAwYywgMHhhMTg0LCAweDAwZmYsIDB4YTA4NiwKKwkweDAwMDYsIDB4MDA0MCwgMHg5NTNmLCAweGExODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwODYsIDB4MDAwNiwKKwkweDAwNDAsIDB4OTUzZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDk0OTgsIDB4MjAwMSwKKwkweGE2NzIsIDB4MjAwNCwgMHhkMGU0LCAweDAwNDAsIDB4OTVhYiwgMHgyMDcxLCAweGFiOGMsIDB4NzAxMCwKKwkweDYwMzYsIDB4NzAxNCwgMHg2MDNhLCAweDcxMDgsIDB4NzIwYywgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYTQsIDB4MDA0MCwgMHg5NTVkLCAweDYwMTgsIDB4MjA2OCwgMHg2ODEwLCAweGExMDYsIDB4MDBjMCwKKwkweDk1NWQsIDB4NjgxNCwgMHhhMjA2LCAweDAwNDAsIDB4OTU4MSwgMHgyMDAxLCAweGE2NTMsIDB4MjAwNCwKKwkweGQwYWMsIDB4MDBjMCwgMHg5NTlmLCAweDIwNjksIDB4YTYwMCwgMHg2ODcwLCAweGEyMDYsIDB4MDBjMCwKKwkweDk1OWYsIDB4Njg2YywgMHhhMTA2LCAweDAwYzAsIDB4OTU5ZiwgMHg3MjEwLCAweDEwNzgsIDB4OGNmMiwKKwkweDAwNDAsIDB4OTVhNSwgMHgxMDc4LCAweGEyOGUsIDB4MDA0MCwgMHg5NWE1LCAweDYyMmEsIDB4NjAwNywKKwkweDAwMzYsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwKKwkweDAwN2MsIDB4NzIxNCwgMHhhMjg2LCAweGZmZmYsIDB4MDA0MCwgMHg5NTkzLCAweDEwNzgsIDB4OGNmMiwKKwkweDAwNDAsIDB4OTVhNSwgMHhhMjgwLCAweDAwMDIsIDB4MjAwNCwgMHg3MTEwLCAweGExMDYsIDB4MDBjMCwKKwkweDk1YTUsIDB4MDA3OCwgMHg5NTZlLCAweDcyMTAsIDB4MmMwOCwgMHhhMDg1LCAweDAwMDEsIDB4MTA3OCwKKwkweGExZTYsIDB4MmMxMCwgMHgyMTYwLCAweDAwNDAsIDB4OTVhNSwgMHgwMDc4LCAweDk1NmUsIDB4NjAwNywKKwkweDAwMzcsIDB4NjAxMywgMHgxNTAwLCAweDAwNzgsIDB4OTU3OSwgMHg2MDA3LCAweDAwMzcsIDB4NjAxMywKKwkweDE3MDAsIDB4MDA3OCwgMHg5NTc5LCAweDYwMDcsIDB4MDAxMiwgMHgwMDc4LCAweDk1NzksIDB4MTA3OCwKKwkweDI5YmIsIDB4MDBjMCwgMHg5NjY0LCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4NCwKKwkweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg5NDk4LCAweDBlN2UsIDB4MGQ3ZSwKKwkweDBjN2UsIDB4MjAwMSwgMHhhNjcyLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDQwLCAweDk2MjEsIDB4MjA2OSwKKwkweGE2MDAsIDB4MjA3MSwgMHhhYjhjLCAweDcwMDgsIDB4NjAzNiwgMHg3MjBjLCAweDYyM2EsIDB4YTI4NiwKKwkweGZmZmYsIDB4MDBjMCwgMHg5NWRlLCAweDcyMDgsIDB4MGM3ZSwgMHgyYzA4LCAweGEwODUsIDB4MDAwMSwKKwkweDEwNzgsIDB4YTFlNiwgMHgyYzEwLCAweDBjN2YsIDB4MDA0MCwgMHg5NjE1LCAweDEwNzgsIDB4OGNmMiwKKwkweDAwNDAsIDB4OTYxNSwgMHgwYzdlLCAweDAyN2UsIDB4MjI2MCwgMHgxMDc4LCAweDg5ZjMsIDB4MDI3ZiwKKwkweDBjN2YsIDB4NzExOCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMDEsIDB4MDA0MCwKKwkweDk1ZmYsIDB4YTE4NiwgMHgwMDA1LCAweDAwNDAsIDB4OTVmOSwgMHhhMTg2LCAweDAwMDcsIDB4MDBjMCwKKwkweDk2MDksIDB4YTI4MCwgMHgwMDA0LCAweDIwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDk2MDksIDB4MDU3ZSwKKwkweDc1MTAsIDB4NzYxNCwgMHgxMDc4LCAweGEyYTMsIDB4MDU3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwKKwkweDAwN2MsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDJhMDAsIDB4NjAwMywKKwkweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDAwNzgsIDB4OTYwNSwgMHg2MDA3LCAweDAwM2IsIDB4NjAyYiwKKwkweDAwMDksIDB4NjAxMywgMHgxNzAwLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVkOGEsIDB4MDA3OCwKKwkweDk2MDUsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwYiwgMHg2MDEzLCAweDAwMDAsIDB4MDA3OCwKKwkweDk1NzksIDB4MGU3ZSwgMHgwMjdlLCAweDEwNzgsIDB4NDk2NywgMHgwMDQwLCAweDk2NWUsIDB4MTA3OCwKKwkweDQ5NTcsIDB4MTA3OCwgMHhhNGE5LCAweDAwYzAsIDB4OTY1YywgMHgyMDcxLCAweGE2MDAsIDB4NzBjYywKKwkweGMwODUsIDB4NzBjZSwgMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHg3Mjk4LCAweGEyODQsIDB4MDBmZiwKKwkweDcwNmUsIDB4NzhlNiwgMHhhMjg0LCAweGZmMDAsIDB4NzI3MCwgMHhhMjA1LCAweDcwNzIsIDB4NzhlYSwKKwkweDBmN2YsIDB4NzBkNywgMHgwMDAwLCAweDIwMDEsIDB4YTY1MywgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwKKwkweDk2NTUsIDB4MjAxMSwgMHhhOGNhLCAweDIwMTMsIDB4MDdkMCwgMHhkMGFjLCAweDAwYzAsIDB4OTY1ZSwKKwkweDEwNzgsIDB4MjY3NywgMHgwMDc4LCAweDk2NWUsIDB4MTA3OCwgMHhhNGQ5LCAweDAyN2YsIDB4MGU3ZiwKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDk0OTcsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDA2N2UsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwKKwkweDAwMDYsIDB4MDA0MCwgMHg5Njg0LCAweGE2ODYsIDB4MDAwNCwgMHgwMDQwLCAweDk2ODQsIDB4NmUwNCwKKwkweGE2YjQsIDB4MDBmZiwgMHhhNjg2LCAweDAwMDYsIDB4MDA0MCwgMHg5Njg0LCAweGE2ODYsIDB4MDAwNCwKKwkweDAwNDAsIDB4OTY4NCwgMHhhMDg1LCAweDAwMDEsIDB4MDY3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGQ3ZSwKKwkweDEwNzgsIDB4OTZiYiwgMHgwZDdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgxMDc4LCAweDk2Y2EsIDB4MDBjMCwKKwkweDk2YjQsIDB4NjgwYywgMHhhMDhjLCAweGZmMDAsIDB4NjgyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTExNSwKKwkweDYyMTIsIDB4NjgyNCwgMHg2MDJhLCAweGQxZTQsIDB4MDA0MCwgMHg5NmEyLCAweDIwMDksIDB4MDAwMSwKKwkweDAwNzgsIDB4OTZiMCwgMHhkMWVjLCAweDAwNDAsIDB4OTZiNCwgMHg2OTIwLCAweGExOGMsIDB4MDBmZiwKKwkweDY4MjQsIDB4MTA3OCwgMHgyNTRkLCAweDAwYzAsIDB4OTZiNCwgMHgyMTEwLCAweDIwMDksIDB4MDAwMCwKKwkweDEwNzgsIDB4MjhjOCwgMHgwMDc4LCAweDk2YjgsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4OTZiOSwKKwkweGEwMDYsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwNjksIDB4YWI4ZCwgMHg2ODAwLCAweGEwODIsIDB4MDAxMCwKKwkweDAwYzgsIDB4OTZjOCwgMHg2MDEzLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4OTZjOSwKKwkweGEwMDYsIDB4MDA3YywgMHg2MDEzLCAweDAwMDAsIDB4MjA2OSwgMHhhYjhjLCAweDY4MDgsIDB4YTA4NCwKKwkweGZmMDAsIDB4YTA4NiwgMHgwODAwLCAweDAwYzAsIDB4OTZkZSwgMHg2ODAwLCAweGEwODQsIDB4MDBmZiwKKwkweGEwOGUsIDB4MDAxNCwgMHgwMDQwLCAweDk2ZGUsIDB4YTA4ZSwgMHgwMDEwLCAweDAwN2MsIDB4NjAwNCwKKwkweGEwYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMzIsIDB4YTFiNiwgMHgwMDEzLCAweDAwYzAsIDB4OTZlYiwKKwkweDIwMDgsIDB4MDA3OSwgMHg5NmZlLCAweGExYjYsIDB4MDAyNywgMHgwMDQwLCAweDk2ZjMsIDB4YTFiNiwKKwkweDAwMTQsIDB4MTBjMCwgMHgxMzMyLCAweDIwMDEsIDB4MDAwNywgMHgxMDc4LCAweDQ1MzUsIDB4MTA3OCwKKwkweDYxY2QsIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDk3M2UsIDB4OTc0MCwKKwkweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3NDAsIDB4OTc0YywgMHg5N2Q2LCAweDk3OTksIDB4OTdkNiwKKwkweDk3YWQsIDB4OTdkNiwgMHg5NzRjLCAweDk3ZDYsIDB4OTdjZSwgMHg5N2Q2LCAweDk3Y2UsIDB4OTdkNiwKKwkweDk3ZDYsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsIDB4OTczZSwKKwkweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3M2UsIDB4OTc0MCwgMHg5NzNlLCAweDk3ZDYsIDB4OTczZSwKKwkweDk3M2UsIDB4OTdkNiwgMHg5NzNlLCAweDk3ZDYsIDB4OTdkNiwgMHg5NzNlLCAweDk3M2UsIDB4OTczZSwKKwkweDk3M2UsIDB4OTdkNiwgMHg5N2Q2LCAweDk3M2UsIDB4OTdkNiwgMHg5N2Q2LCAweDk3M2UsIDB4OTczZSwKKwkweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDk3NDAsIDB4OTdkNiwgMHg5N2Q2LCAweDk3M2UsIDB4OTczZSwKKwkweDk3ZDYsIDB4OTdkNiwgMHg5NzNlLCAweDk3M2UsIDB4OTczZSwgMHg5NzNlLCAweDEwNzgsIDB4MTMzMiwKKwkweDEwNzgsIDB4NjFjZCwgMHgyMDAxLCAweGE4YTIsIDB4MjAwNCwgMHg2MDE2LCAweDYwMDMsIDB4MDAwMiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDk3ZGMsIDB4MGY3ZSwgMHgyMDc5LCAweGE2NTIsIDB4NzgwNCwKKwkweDBmN2YsIDB4ZDBhYywgMHgwMGMwLCAweDk3ZDYsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDRlZSwKKwkweDYwMTgsIDB4YTA4MCwgMHgwMDA0LCAweDIwMDQsIDB4YTA4NiwgMHgwMGZmLCAweDAwNDAsIDB4OTdkNiwKKwkweDBjN2UsIDB4NjAxOCwgMHgyMDYwLCAweDYwMDAsIDB4ZDBmNCwgMHgwMGMwLCAweDk3NzAsIDB4NjAxMCwKKwkweGEwMDUsIDB4MDA0MCwgMHg5NzcwLCAweDBjN2YsIDB4MTA3OCwgMHgzNjk5LCAweDAwNzgsIDB4OTdkNiwKKwkweDBjN2YsIDB4MjAwMSwgMHhhNjAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4OTc3ZiwKKwkweDBmN2UsIDB4MjA3OSwgMHhhNjAwLCAweDc4OTAsIDB4ODAwMCwgMHg3ODkyLCAweDBmN2YsIDB4MjAwMSwKKwkweDAwMDIsIDB4MTA3OCwgMHg0NTAyLCAweDEwNzgsIDB4NjFjZCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDEwNzgsIDB4NWRkNywgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZSwKKwkweDYxMTgsIDB4MjE2MCwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHg1YTUyLCAweDBjN2YsIDB4MDA3OCwKKwkweDk3ZGMsIDB4NjYxOCwgMHgwZDdlLCAweDI2NjgsIDB4NmUwNCwgMHgwZDdmLCAweGE2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTdkNiwgMHhhNjg2LCAweDAwMDQsIDB4MDA0MCwKKwkweDk3ZDYsIDB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4OTdkNCwgMHgyMDAxLCAweGE2MDAsIDB4MjAwNCwKKwkweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDk3YjYsIDB4MTA3OCwgMHgzNjk5LCAweDIwMDEsIDB4MDAwNiwKKwkweDEwNzgsIDB4OTdkZCwgMHg2NjE4LCAweDBkN2UsIDB4MjY2OCwgMHg2ZTA0LCAweDBkN2YsIDB4YTZiNCwKKwkweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDA0MCwgMHg5N2Q2LCAweDIwMDEsIDB4MDAwNiwKKwkweDAwNzgsIDB4OTdkNCwgMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg5N2Q0LCAweDIwMDEsIDB4MDAwNiwKKwkweDEwNzgsIDB4OTdkZCwgMHgwMDc4LCAweDk3ZDYsIDB4MTA3OCwgMHg0NTM1LCAweDEwNzgsIDB4NjFjZCwKKwkweDEwNzgsIDB4NzcyZCwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHgwMTdlLCAweDBkN2UsIDB4NjExOCwKKwkweDIxNjgsIDB4NjkwMCwgMHhkMTg0LCAweDAwNDAsIDB4OTdmOCwgMHg2MTA0LCAweGExOGUsIDB4MDAwYSwKKwkweDAwYzAsIDB4OTdmMCwgMHg2OTljLCAweGQxYTQsIDB4MDBjMCwgMHg5N2YwLCAweDIwMDEsIDB4MDAwNywKKwkweDEwNzgsIDB4NDUwMiwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NGVlLCAweDEwNzgsIDB4MjhhNiwKKwkweDBkN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBkN2UsIDB4NjYxOCwgMHgyNjY4LCAweDY4MDQsIDB4YTA4NCwKKwkweGZmMDAsIDB4ODAwNywgMHgwZDdmLCAweGEwYjIsIDB4MDAwYywgMHgxMGM4LCAweDEzMzIsIDB4YTFiNiwKKwkweDAwMTUsIDB4MDBjMCwgMHg5ODBmLCAweDEwNzksIDB4OTgxNiwgMHgwMDc4LCAweDk4MTUsIDB4YTFiNiwKKwkweDAwMTYsIDB4MTBjMCwgMHgxMzMyLCAweDEwNzksIDB4OTgyMiwgMHgwMDdjLCAweDdkNGUsIDB4N2Q0ZSwKKwkweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdkNGUsIDB4OTg3NywgMHg5ODJlLCAweDdkNGUsIDB4N2Q0ZSwKKwkweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwKKwkweDk4NzcsIDB4OTg3ZiwgMHg3ZDRlLCAweDdkNGUsIDB4N2Q0ZSwgMHg3ZDRlLCAweDBmN2UsIDB4MjA3OSwKKwkweGE2NTIsIDB4NzgwNCwgMHhkMGFjLCAweDAwYzAsIDB4OTg1NSwgMHg2MDE4LCAweGEwN2QsIDB4MDA0MCwKKwkweDk4NTUsIDB4NzgwMCwgMHhkMGY0LCAweDAwYzAsIDB4OTg0MSwgMHg3ODEwLCAweGEwMDUsIDB4MDBjMCwKKwkweDk4NTUsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDRlZSwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwKKwkweDQ1MDIsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MTA3OCwKKwkweDVkZDcsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4OTg3NSwgMHgyMDExLCAweGFiODMsIDB4MjIwNCwKKwkweDgyMTEsIDB4MjIwYywgMHgxMDc4LCAweDI1NGQsIDB4MDBjMCwgMHg5ODc1LCAweDBjN2UsIDB4MTA3OCwKKwkweDQ1YzQsIDB4MDA0MCwgMHg5ODY4LCAweDBjN2YsIDB4MTA3OCwgMHg3NzJkLCAweDAwNzgsIDB4OTg3NSwKKwkweDYwMTAsIDB4MDA3ZSwgMHg2MDE0LCAweDAwN2UsIDB4MTA3OCwgMHg0MmY4LCAweDAwN2YsIDB4NjAxNiwKKwkweDAwN2YsIDB4NjAxMiwgMHgwYzdmLCAweDEwNzgsIDB4NzcyZCwgMHgwZjdmLCAweDAwN2MsIDB4NjYwNCwKKwkweGE2YjYsIDB4MDAxZSwgMHgwMGMwLCAweDk4N2UsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4MTA3OCwKKwkweDdmOGUsIDB4MDBjMCwgMHg5ODhiLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MTA3OCwKKwkweDVkZDcsIDB4MDA3OCwgMHg5ODhkLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweDYwMDQsIDB4YTA4YSwKKwkweDAwNDQsIDB4MTBjOCwgMHgxMzMyLCAweDEwNzgsIDB4NjFjZCwgMHgxMDc4LCAweDhlYzYsIDB4MTA3OCwKKwkweDYyZDEsIDB4MDA3YywgMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg5ODllLCAweDk4YjEsIDB4OThiMSwKKwkweDk4YjEsIDB4OThiMSwgMHg5OGIzLCAweDk4YjEsIDB4OThiMSwgMHg5OGIxLCAweDk4YjEsIDB4OThiMSwKKwkweDk4YjEsIDB4OThiMSwgMHg5OGIxLCAweDk4YjEsIDB4OThiMSwgMHg5OGIxLCAweDk4YjEsIDB4OThiMSwKKwkweDk4YjEsIDB4MTA3OCwgMHgxMzMyLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDE1N2UsIDB4MDQ3ZSwKKwkweDAyN2UsIDB4NjIxOCwgMHhhMjgwLCAweDAwMmIsIDB4MjAwNCwgMHhhMDA1LCAweDAwNDAsIDB4OThjNCwKKwkweDIwMjEsIDB4MDAwMCwgMHgxMDc4LCAweGE0NzIsIDB4NjEwNiwgMHgyMDcxLCAweGFiODAsIDB4NzQ0NCwKKwkweGE0YTQsIDB4ZmYwMCwgMHgwMDQwLCAweDk5MWIsIDB4YTQ4NiwgMHgyMDAwLCAweDAwYzAsIDB4OThkNiwKKwkweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAyMDAsIDB4MTA3OCwgMHg1YmYxLCAweDEwNzgsIDB4MTM4YiwKKwkweDEwNDAsIDB4MTMzMiwgMHg2MDAzLCAweDAwMDcsIDB4MmQwMCwgMHg2ODM3LCAweDAxMGQsIDB4NjgwMywKKwkweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDZjNWEsIDB4MmMwMCwgMHg2ODVlLCAweDYwMDgsIDB4NjhiMiwKKwkweDYwMTgsIDB4MjA3OCwgMHg3OGEwLCAweDgwMDcsIDB4NzEzMCwgMHg2OTRhLCAweDAxN2UsIDB4YTA4NCwKKwkweGZmMDAsIDB4Njg0NiwgMHg2ODRmLCAweDAwMDAsIDB4Njg1NywgMHgwMDM2LCAweDEwNzgsIDB4NGE3MywKKwkweDAxN2YsIDB4YTQ4NiwgMHgyMDAwLCAweDAwYzAsIDB4OTkwMywgMHgyMDE5LCAweDAwMTcsIDB4MTA3OCwKKwkweGExOTUsIDB4MDA3OCwgMHg5OTdkLCAweGE0ODYsIDB4MDQwMCwgMHgwMGMwLCAweDk5MGQsIDB4MjAxOSwKKwkweDAwMDIsIDB4MTA3OCwgMHhhMTQ2LCAweDAwNzgsIDB4OTk3ZCwgMHhhNDg2LCAweDAyMDAsIDB4MDBjMCwKKwkweDk5MTMsIDB4MTA3OCwgMHhhMTJiLCAweGE0ODYsIDB4MTAwMCwgMHgwMGMwLCAweDk5MTksIDB4MTA3OCwKKwkweGExN2EsIDB4MDA3OCwgMHg5OTdkLCAweDIwNjksIDB4YTkzMywgMHg2YTAwLCAweGQyODQsIDB4MDA0MCwKKwkweDk5ZTcsIDB4YTI4NCwgMHgwMzAwLCAweDAwYzAsIDB4OTlkZiwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwKKwkweDk5YzUsIDB4MmQ3OCwgMHg2MDAzLCAweDAwMDcsIDB4MTA3OCwgMHgxMzcwLCAweDAwNDAsIDB4OTk4NCwKKwkweDc4MDAsIDB4ZDA4YywgMHgwMGMwLCAweDk5MzcsIDB4NzgwNCwgMHg4MDAxLCAweDc4MDYsIDB4NjAxMywKKwkweDAwMDAsIDB4NjgwMywgMHgwMDAwLCAweDY4MzcsIDB4MDExNiwgMHg2ODNiLCAweDAwMDAsIDB4NjAwOCwKKwkweDY4YjIsIDB4MmMwMCwgMHg2ODRhLCAweDYwMTgsIDB4MjA3OCwgMHg3OGEwLCAweDgwMDcsIDB4NzEzMCwKKwkweDY5ODYsIDB4Njg0NiwgMHg3OTI4LCAweDY5OGEsIDB4NzkyYywgMHg2OThlLCAweDc5MzAsIDB4Njk5MiwKKwkweDc5MzQsIDB4Njk5NiwgMHg2ODUzLCAweDAwM2QsIDB4NzI0NCwgMHhhMjk0LCAweDAwMDMsIDB4YTI4NiwKKwkweDAwMDIsIDB4MDBjMCwgMHg5OTVmLCAweDY4NGYsIDB4MDA0MCwgMHgwMDc4LCAweDk5NjksIDB4YTI4NiwKKwkweDAwMDEsIDB4MDBjMCwgMHg5OTY3LCAweDY4NGYsIDB4MDA4MCwgMHgwMDc4LCAweDk5NjksIDB4Njg0ZiwKKwkweDAwMDAsIDB4MjBhOSwgMHgwMDBhLCAweDIwMDEsIDB4YWI5MCwgMHhhZDkwLCAweDAwMTUsIDB4MjAwYywKKwkweDgxMGYsIDB4MjExMiwgMHg4MDAwLCAweDgyMTAsIDB4MDBmMCwgMHg5OTZmLCAweDIwMGMsIDB4Njk4MiwKKwkweDgwMDAsIDB4MjAwYywgMHg2OTdlLCAweDEwNzgsIDB4NGE3MywgMHgwMjdmLCAweDA0N2YsIDB4MTU3ZiwKKwkweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MjAwMSwgMHhhNjBlLCAweDIwMDQsIDB4ZDA4NCwKKwkweDAwNDAsIDB4OTk4ZSwgMHgxMDc4LCAweDEzOGIsIDB4MDBjMCwgMHg5OTMwLCAweDYwMTMsIDB4MDEwMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwKKwkweDAwNzgsIDB4OTk3ZCwgMHgyMDY5LCAweGFiOTIsIDB4MmQwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwKKwkweDEyMDAsIDB4MDBjMCwgMHg5OWI5LCAweDIwNjksIDB4YWI4MCwgMHg2ODZjLCAweGEwODQsIDB4MDBmZiwKKwkweDAxN2UsIDB4NjExMCwgMHhhMThjLCAweDA3MDAsIDB4YTEwZCwgMHg2MTEyLCAweDAxN2YsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDQzLCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MDA3OCwKKwkweDk5N2QsIDB4NjAxMywgMHgwMjAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MTA3OCwKKwkweDVkOGEsIDB4MTA3OCwgMHg2MmQxLCAweDAwNzgsIDB4OTk3ZCwgMHgyMDAxLCAweGE2MGQsIDB4MjAwNCwKKwkweGQwZWMsIDB4MDA0MCwgMHg5OWNmLCAweDIwMTEsIDB4ODA0OSwgMHgxMDc4LCAweDM2MWIsIDB4NjAxMywKKwkweDAzMDAsIDB4MDA3OCwgMHg5OWQ1LCAweDYwMTMsIDB4MDEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNDEsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDk5N2QsIDB4NjAxMywKKwkweDA1MDAsIDB4MDA3OCwgMHg5OWQ1LCAweDYwMTMsIDB4MDYwMCwgMHgwMDc4LCAweDk5OWEsIDB4NjAxMywKKwkweDAyMDAsIDB4MDA3OCwgMHg5OTlhLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDk5ZmQsIDB4NjAwNCwKKwkweGEwOGEsIDB4MDA0MCwgMHgxMDQ4LCAweDEzMzIsIDB4YTA4YSwgMHgwMDUzLCAweDEwYzgsIDB4MTMzMiwKKwkweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwNzksIDB4OWE4MiwgMHhhMTg2LCAweDAwNTEsIDB4MDA0MCwKKwkweDlhMGEsIDB4YTE4NiwgMHgwMDQ3LCAweDAwYzAsIDB4OWEyMywgMHg2MDA0LCAweGEwODYsIDB4MDA0MSwKKwkweDAwNDAsIDB4OWEzMSwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDAwNDAsIDB4OWEzMSwKKwkweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDEwNzgsIDB4NWM1NiwKKwkweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwKKwkweDlhMzEsIDB4MDA3OCwgMHg5YWM3LCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDlhMmIsIDB4YTE4NiwKKwkweDAwMTQsIDB4MTBjMCwgMHgxMzMyLCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDA3OSwKKwkweDlhMzQsIDB4MTA3OCwgMHg3NzczLCAweDAwN2MsIDB4OWE0NywgMHg5YTQ5LCAweDlhNDksIDB4OWE3MSwKKwkweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywKKwkweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsIDB4OWE0NywgMHg5YTQ3LCAweDlhNDcsIDB4MTA3OCwKKwkweDEzMzIsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4NjJkMSwgMHgwMzdlLCAweDBkN2UsIDB4NjAxMCwKKwkweGEwNmQsIDB4MDA0MCwgMHg5YTZlLCAweGFkODQsIDB4ZjAwMCwgMHgwMDQwLCAweDlhNmUsIDB4NjAwMywKKwkweDAwMDIsIDB4NjAxOCwgMHgyMDA0LCAweGQwYmMsIDB4MDBjMCwgMHg5YTZlLCAweDIwMTksIDB4MDAwNCwKKwkweDEwNzgsIDB4YTFjYSwgMHg2MDEzLCAweDAwMDAsIDB4NjAxNCwgMHhhMDA1LCAweDAwYzAsIDB4OWE2YywKKwkweDIwMDEsIDB4YThhMywgMHgyMDA0LCAweDYwMTYsIDB4NjAwMywgMHgwMDA3LCAweDBkN2YsIDB4MDM3ZiwKKwkweDAwN2MsIDB4MGQ3ZSwgMHgxMDc4LCAweDYxY2QsIDB4MTA3OCwgMHg2MmQxLCAweDEwNzgsIDB4OGQwNiwKKwkweDAwNDAsIDB4OWE3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHgxM2E0LCAweDEwNzgsIDB4OGVjNiwKKwkweDBkN2YsIDB4MDA3YywgMHg5YTk1LCAweDlhYjQsIDB4OWE5ZSwgMHg5YWMxLCAweDlhOTUsIDB4OWE5NSwKKwkweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwKKwkweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHgxMDc4LCAweDEzMzIsIDB4NjAxMCwKKwkweGEwODgsIDB4MDAxMywgMHgyMTA0LCAweGEwODUsIDB4MDQwMCwgMHgyMDBhLCAweDEwNzgsIDB4NjFjZCwKKwkweDYwMTAsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4ZDBiNCwgMHgwMDQwLCAweDlhYWYsIDB4NjAwMywKKwkweDAwMDcsIDB4MjAwOSwgMHgwMDQzLCAweDEwNzgsIDB4Nzc1YywgMHgwMDc4LCAweDlhYjEsIDB4NjAwMywKKwkweDAwMDIsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4YTQyMywKKwkweDAwYzAsIDB4OWFiZSwgMHgxMDc4LCAweDViYzEsIDB4MTA3OCwgMHg3NzJkLCAweDEwNzgsIDB4NjJkMSwKKwkweDAwN2MsIDB4MTA3OCwgMHg2MWNkLCAweDIwMDksIDB4MDA0MSwgMHgwMDc4LCAweDljMWUsIDB4YTE4MiwKKwkweDAwNDAsIDB4MDA3OSwgMHg5YWNiLCAweDlhZGUsIDB4OWFlMCwgMHg5YWRlLCAweDlhZGUsIDB4OWFkZSwKKwkweDlhZGUsIDB4OWFkZSwgMHg5YWUxLCAweDlhZGUsIDB4OWFkZSwgMHg5YWRlLCAweDlhZGUsIDB4OWFkZSwKKwkweDlhZGUsIDB4OWFkZSwgMHg5YWRlLCAweDlhZGUsIDB4OWFlYywgMHg5YWRlLCAweDEwNzgsIDB4MTMzMiwKKwkweDAwN2MsIDB4NjAwMywgMHgwMDA0LCAweDYxMTAsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwKKwkweDJjMTAsIDB4MTA3OCwgMHgxNWZhLCAweDAwN2MsIDB4MGQ3ZSwgMHgxMDc4LCAweDViYzEsIDB4MGQ3ZiwKKwkweDEwNzgsIDB4YTQ5NSwgMHgxMDc4LCAweDc3MmQsIDB4MDA3YywgMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwKKwkweDlhZjksIDB4OWIwYywgMHg5YjBjLCAweDliMGMsIDB4OWIwYywgMHg5YjBjLCAweDliMGMsIDB4OWIwYywKKwkweDliMGUsIDB4OWIwYywgMHg5YjExLCAweDliM2MsIDB4OWIwYywgMHg5YjBjLCAweDliMGMsIDB4OWIwYywKKwkweDliM2MsIDB4OWIwYywgMHg5YjBjLCAweDliMGMsIDB4MTA3OCwgMHgxMzMyLCAweDEwNzgsIDB4Nzc3MywKKwkweDAwN2MsIDB4MTA3OCwgMHg2MjdhLCAweDEwNzgsIDB4NjM5YiwgMHg2MDEwLCAweDBkN2UsIDB4MjA2OCwKKwkweDY4NGMsIDB4ZDBmYywgMHgwMDQwLCAweDliMjcsIDB4YTA4YywgMHgwMDAzLCAweGExOGUsIDB4MDAwMiwKKwkweDAwNDAsIDB4OWIyZiwgMHgyMDA5LCAweDAwNDEsIDB4MGQ3ZiwgMHgwMDc4LCAweDljMWUsIDB4NjAwMywKKwkweDAwMDcsIDB4NjAxNywgMHgwMDAwLCAweDEwNzgsIDB4NWJjMSwgMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwKKwkweGE0MjMsIDB4MDA0MCwgMHg5YjM1LCAweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDViYzEsIDB4MTA3OCwKKwkweDc3MmQsIDB4MGQ3ZiwgMHgwMDc4LCAweDliMmUsIDB4MDM3ZSwgMHgxMDc4LCAweDYyN2EsIDB4MTA3OCwKKwkweDYzOWIsIDB4NjAxMCwgMHgwZDdlLCAweDIwNjgsIDB4NjAxOCwgMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwKKwkweDliNWMsIDB4Njg0YywgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4OWI1OCwKKwkweDY4N2MsIDB4NjMyYywgMHhhMzFhLCAweDYzMmUsIDB4Njg4MCwgMHg2MzI4LCAweGEzMWIsIDB4NjMyYSwKKwkweDYwMDMsIDB4MDAwMiwgMHgwMDc4LCAweDliNmQsIDB4MjAxOSwgMHgwMDA0LCAweDEwNzgsIDB4YTFjYSwKKwkweDYwMTQsIDB4YTAwNSwgMHgwMGMwLCAweDliNjksIDB4MjAwMSwgMHhhOGEzLCAweDIwMDQsIDB4ODAwMywKKwkweDYwMTYsIDB4NjAxMywgMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgwZDdmLCAweDAzN2YsIDB4MDA3YywKKwkweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDliN2UsIDB4NjAwNCwgMHhhMDg2LCAweDAwNDIsIDB4MTBjMCwKKwkweDEzMzIsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExODYsIDB4MDAyNywKKwkweDAwNDAsIDB4OWI4NiwgMHhhMTg2LCAweDAwMTQsIDB4MDBjMCwgMHg5Yjk2LCAweDYwMDQsIDB4YTA4NiwKKwkweDAwNDIsIDB4MTBjMCwgMHgxMzMyLCAweDIwMDEsIDB4MDAwNywgMHgxMDc4LCAweDQ1MzUsIDB4MTA3OCwKKwkweDYxY2QsIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExODIsIDB4MDA0MCwKKwkweDAwNzksIDB4OWI5YSwgMHg5YmFkLCAweDliYWQsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsIDB4OWJhZCwKKwkweDliYWQsIDB4OWJhZiwgMHg5YmJiLCAweDliYWQsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsIDB4OWJhZCwKKwkweDliYWQsIDB4OWJhZCwgMHg5YmFkLCAweDliYWQsIDB4OWJhZCwgMHgxMDc4LCAweDEzMzIsIDB4MDM3ZSwKKwkweDA0N2UsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDEwNzgsIDB4MTVmYSwKKwkweDA0N2YsIDB4MDM3ZiwgMHgwMDdjLCAweDYwMTAsIDB4MGQ3ZSwgMHgyMDY4LCAweDY4MTAsIDB4NmExNCwKKwkweDYxMTgsIDB4MjEwYywgMHhkMWJjLCAweDAwNDAsIDB4OWJkYSwgMHg2MTI0LCAweGQxZjQsIDB4MDBjMCwKKwkweDliZGEsIDB4MDA3ZSwgMHgwNDdlLCAweDA1N2UsIDB4NmM3YywgMHhhNDIyLCAweDZkODAsIDB4MjIwMCwKKwkweGE1MmIsIDB4NjAyYywgMHhhNDIwLCAweDY0MmUsIDB4NjAyOCwgMHhhNTI5LCAweDY1MmEsIDB4MDU3ZiwKKwkweDA0N2YsIDB4MDA3ZiwgMHhhMjBkLCAweDAwYzAsIDB4OWJlZSwgMHg2ODRjLCAweGQwZmMsIDB4MDA0MCwKKwkweDliZTYsIDB4MjAwOSwgMHgwMDQxLCAweDBkN2YsIDB4MDA3OCwgMHg5YzFlLCAweDYwMDMsIDB4MDAwNywKKwkweDYwMTcsIDB4MDAwMCwgMHgxMDc4LCAweDViYzEsIDB4MGQ3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MGY3ZSwKKwkweDJjNzgsIDB4MTA3OCwgMHg0OTYzLCAweDBmN2YsIDB4MDA3ZiwgMHgwMDQwLCAweDliZmIsIDB4NjAwMywKKwkweDAwMDIsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwMDksIDB4YTYwZCwgMHgyMTBjLCAweGQxOWMsIDB4MDA0MCwKKwkweDljMDUsIDB4NjAwMywgMHgwMDA3LCAweDAwNzgsIDB4OWMwNywgMHg2MDAzLCAweDAwMDYsIDB4MTA3OCwKKwkweDljMGQsIDB4MTA3OCwgMHg1YmMzLCAweDBkN2YsIDB4MDA3YywgMHhkMmZjLCAweDAwNDAsIDB4OWMxOSwKKwkweDgwMDIsIDB4ODAwMCwgMHg4MjEyLCAweGEyOTEsIDB4MDAwMCwgMHgyMDA5LCAweDAwMDksIDB4MDA3OCwKKwkweDljMWIsIDB4MjAwOSwgMHgwMDE1LCAweDZhNmEsIDB4Njg2NiwgMHgwMDdjLCAweGExODIsIDB4MDA0MCwKKwkweDAwNDgsIDB4OWMyNCwgMHgwMDc5LCAweDljMzEsIDB4YTE4NiwgMHgwMDEzLCAweDAwNDAsIDB4OWMyYywKKwkweGExODYsIDB4MDAxNCwgMHgxMGMwLCAweDEzMzIsIDB4NjAyNCwgMHhkMGRjLCAweDEwNDAsIDB4MTMzMiwKKwkweDAwN2MsIDB4OWM0NCwgMHg5YzRiLCAweDljNTcsIDB4OWM2MywgMHg5YzQ0LCAweDljNDQsIDB4OWM0NCwKKwkweDljNzIsIDB4OWM0NCwgMHg5YzQ2LCAweDljNDYsIDB4OWM0NCwgMHg5YzQ0LCAweDljNDQsIDB4OWM0NCwKKwkweDljNDQsIDB4OWM0NCwgMHg5YzQ0LCAweDljNDQsIDB4MTA3OCwgMHgxMzMyLCAweDYwMjQsIDB4ZDBkYywKKwkweDEwNDAsIDB4MTMzMiwgMHgwMDdjLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWQ4YSwKKwkweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjJkMSwgMHgxMjdmLCAweDAwN2MsIDB4NjAwMywKKwkweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDVkOGEsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwKKwkweDYyZDEsIDB4MTI3ZiwgMHgwMDdjLCAweDYwMDMsIDB4MDAwMywgMHg2MTA2LCAweDJjMTAsIDB4MTA3OCwKKwkweDFjZjAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg1ZGY2LCAweDEwNzgsIDB4NjM5YiwKKwkweDEyN2YsIDB4MDA3YywgMHhhMDE2LCAweDEwNzgsIDB4MTVmYSwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDM3ZSwgMHgwZDdlLCAweGExODIsIDB4MDA0MCwgMHgxMDc5LCAweDljODMsIDB4MGQ3ZiwKKwkweDAzN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDljOTMsIDB4OWM5NSwgMHg5Y2FhLCAweDljYzksIDB4OWM5MywKKwkweDljOTMsIDB4OWM5MywgMHg5Y2UxLCAweDljOTMsIDB4OWM5MywgMHg5YzkzLCAweDljOTMsIDB4OWM5MywKKwkweDljOTMsIDB4OWM5MywgMHg5YzkzLCAweDEwNzgsIDB4MTMzMiwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywKKwkweGQwZmMsIDB4MDA0MCwgMHg5Y2JmLCAweGEwOWMsIDB4MDAwMywgMHhhMzllLCAweDAwMDMsIDB4MDA0MCwKKwkweDljYmYsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwKKwkweDAwNzgsIDB4OWNlNCwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAwNDAsIDB4OWNiZiwKKwkweGEwOWMsIDB4MDAwMywgMHhhMzllLCAweDAwMDMsIDB4MDA0MCwgMHg5Y2JmLCAweDYwMDMsIDB4MDAwMSwKKwkweDYxMDYsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwMDc4LCAweDljZTQsIDB4NjAxMywKKwkweDAwMDAsIDB4NjAxNywgMHgwMDAwLCAweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweGExY2EsIDB4MDA3OCwKKwkweDljZTQsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsIDB4ZDBmYywgMHgwMDQwLCAweDljYmYsIDB4YTA5YywKKwkweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDAwNDAsIDB4OWNiZiwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwKKwkweDJjMTAsIDB4MTA3OCwgMHgxY2YwLCAweDEwNzgsIDB4NWRmNiwgMHgxMDc4LCAweDYzOWIsIDB4MDA3OCwKKwkweDljZTQsIDB4YTAxNiwgMHgxMDc4LCAweDE1ZmEsIDB4MDA3YywgMHgxMDc4LCAweDYxY2QsIDB4NjExMCwKKwkweDgxZmYsIDB4MDA0MCwgMHg5Y2Y2LCAweDBkN2UsIDB4MjE2OCwgMHgxMDc4LCAweGE0ZTIsIDB4MDM3ZSwKKwkweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweGExY2EsIDB4MDM3ZiwgMHgwZDdmLCAweDEwNzgsIDB4OGVjNiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDEwNzgsIDB4NjI3YSwgMHg2MTEwLCAweDgxZmYsIDB4MDA0MCwKKwkweDlkMGMsIDB4MGQ3ZSwgMHgyMTY4LCAweDEwNzgsIDB4YTRlMiwgMHgwMzdlLCAweDIwMTksIDB4MDAyOSwKKwkweDEwNzgsIDB4YTFjYSwgMHgwMzdmLCAweDBkN2YsIDB4MTA3OCwgMHg4ZWM2LCAweDEwNzgsIDB4NjM5YiwKKwkweDAwN2MsIDB4YTE4MiwgMHgwMDg1LCAweDAwNzksIDB4OWQxNSwgMHg5ZDFlLCAweDlkMWMsIDB4OWQxYywKKwkweDlkMmEsIDB4OWQxYywgMHg5ZDFjLCAweDlkMWMsIDB4MTA3OCwgMHgxMzMyLCAweDYwMDMsIDB4MDAwYiwKKwkweDYxMDYsIDB4MTA3OCwgMHg1ZDhhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjJkMSwKKwkweDEyN2YsIDB4MDA3YywgMHgwMjdlLCAweDBlN2UsIDB4MTA3OCwgMHhhNDFjLCAweDAwNDAsIDB4OWQzNCwKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweDlkNTAsIDB4MjA3MSwgMHhhYjgwLCAweDcyMjQsIDB4NjIxMiwKKwkweDcyMjAsIDB4MTA3OCwgMHhhMDY5LCAweDAwNDAsIDB4OWQ0MSwgMHg2MDA3LCAweDAwODYsIDB4MDA3OCwKKwkweDlkNGEsIDB4NjAwNywgMHgwMDg3LCAweDcyMjQsIDB4YTI5NiwgMHhmZmZmLCAweDAwYzAsIDB4OWQ0YSwKKwkweDYwMDcsIDB4MDA4NiwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwKKwkweDBlN2YsIDB4MDI3ZiwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDlkNjQsIDB4NjAwNCwKKwkweGEwOGEsIDB4MDA4NSwgMHgxMDQ4LCAweDEzMzIsIDB4YTA4YSwgMHgwMDhjLCAweDEwYzgsIDB4MTMzMiwKKwkweGEwODIsIDB4MDA4NSwgMHgwMDc5LCAweDlkN2IsIDB4YTE4NiwgMHgwMDI3LCAweDAwNDAsIDB4OWQ3MCwKKwkweGExODYsIDB4MDAxNCwgMHgwMDQwLCAweDlkNzAsIDB4MTA3OCwgMHg3NzczLCAweDAwNzgsIDB4OWQ3YSwKKwkweDIwMDEsIDB4MDAwNywgMHgxMDc4LCAweDQ1MzUsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweDlkODIsIDB4OWQ4NCwgMHg5ZDg0LCAweDlkODIsIDB4OWQ4MiwKKwkweDlkODIsIDB4OWQ4MiwgMHgxMDc4LCAweDEzMzIsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwKKwkweDEwNzgsIDB4NjJkMSwgMHgwMDdjLCAweGExODIsIDB4MDA4NSwgMHgxMDQ4LCAweDEzMzIsIDB4YTE4MiwKKwkweDAwOGMsIDB4MTBjOCwgMHgxMzMyLCAweGExODIsIDB4MDA4NSwgMHgwMDc5LCAweDlkOTcsIDB4OWQ5ZSwKKwkweDlkOWUsIDB4OWQ5ZSwgMHg5ZGEwLCAweDlkOWUsIDB4OWQ5ZSwgMHg5ZDllLCAweDEwNzgsIDB4MTMzMiwKKwkweDAwN2MsIDB4YTE4NiwgMHgwMDEzLCAweDAwNDAsIDB4OWRiMSwgMHhhMTg2LCAweDAwMTQsIDB4MDA0MCwKKwkweDlkYjEsIDB4YTE4NiwgMHgwMDI3LCAweDAwNDAsIDB4OWRiMSwgMHgxMDc4LCAweDc3NzMsIDB4MDA3OCwKKwkweDlkYjcsIDB4MTA3OCwgMHg2MWNkLCAweDEwNzgsIDB4OGVjNiwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywKKwkweDAzN2UsIDB4MTA3OCwgMHhhNDk1LCAweDYwM2YsIDB4MDAwMCwgMHgyMDE5LCAweDAwMGIsIDB4MTA3OCwKKwkweDlkYzcsIDB4NjAxZiwgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMzdmLCAweDAwN2MsIDB4MTI3ZSwKKwkweDAzN2UsIDB4MjA5MSwgMHg4MDAwLCAweDA4N2UsIDB4MmM0MCwgMHgwOTdlLCAweDIwNDksIDB4MDAwMCwKKwkweDEwNzgsIDB4NzI0NiwgMHgwOTdmLCAweDA4N2YsIDB4MDBjMCwgMHg5ZTAyLCAweDA3N2UsIDB4MmMzOCwKKwkweDEwNzgsIDB4NzJmMywgMHgwNzdmLCAweDAwYzAsIDB4OWUwMiwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwKKwkweDAwNDAsIDB4OWUwMiwgMHg2MDFjLCAweGEwODYsIDB4MDAwNywgMHgwMDQwLCAweDllMDIsIDB4MGQ3ZSwKKwkweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4OWRmMywgMHgxMDc4LCAweGE0OTUsIDB4NjAxZiwKKwkweDAwMDcsIDB4MTA3OCwgMHgxNzU3LCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwKKwkweDlkZmIsIDB4MTA3OCwgMHhhMWNhLCAweDBkN2YsIDB4NjAxMywgMHgwMDAwLCAweDEwNzgsIDB4YTQ5NSwKKwkweDYwMWYsIDB4MDAwNywgMHgwMzdmLCAweDEyN2YsIDB4MDA3YywgMHgwZjdlLCAweDBjN2UsIDB4MDM3ZSwKKwkweDE1N2UsIDB4MjA3OSwgMHhhYjgwLCAweDc5MzgsIDB4NzgzYywgMHgxMDc4LCAweDI1NGQsIDB4MDBjMCwKKwkweDllNDksIDB4MDE3ZSwgMHgwYzdlLCAweDEwNzgsIDB4NDVjNCwgMHgwMGMwLCAweDllNDksIDB4MDE3ZiwKKwkweDAyN2YsIDB4MDI3ZSwgMHgwMTdlLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDczZDAsIDB4MTA3OCwKKwkweDVmMDEsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1ZTBhLCAweDA3N2YsIDB4MDE3ZiwKKwkweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsIDB4OWY4YiwgMHgwNzdmLCAweDEwNzgsIDB4NDdlOSwKKwkweDAyN2UsIDB4NjIwNCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LCAweDAwMDYsIDB4MDA0MCwKKwkweDllM2QsIDB4YTI4NiwgMHgwMDA0LCAweDAwYzAsIDB4OWU0MCwgMHg2MmEwLCAweDEwNzgsIDB4Mjk0MiwKKwkweDAyN2YsIDB4MDE3ZiwgMHgxMDc4LCAweDQyZjgsIDB4NjYxMiwgMHg2NTE2LCAweGEwMDYsIDB4MDA3OCwKKwkweDllNGIsIDB4MGM3ZiwgMHgwMTdmLCAweDE1N2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBmN2YsIDB4MDA3YywKKwkweDBjN2UsIDB4MGQ3ZSwgMHgwZTdlLCAweDAxN2UsIDB4MjAwOSwgMHhhNjIwLCAweDIxMDQsIDB4YTA4NiwKKwkweDAwNzQsIDB4MDBjMCwgMHg5ZWIzLCAweDIwNjksIDB4YWI4ZSwgMHg2OTBjLCAweGExODIsIDB4MDEwMCwKKwkweDAwNDgsIDB4OWVhMywgMHg2OTA4LCAweGExODQsIDB4ODAwMCwgMHgwMDQwLCAweDllYWYsIDB4NjAxOCwKKwkweDIwNzAsIDB4NzAxMCwgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHg5ZTcyLCAweDcwMDAsIDB4ZDBmNCwKKwkweDAwNDAsIDB4OWU3NiwgMHhhMTg0LCAweDA4MDAsIDB4MDA0MCwgMHg5ZWFmLCAweDY5MTAsIDB4YTE4YSwKKwkweDAwMDEsIDB4MDA0OCwgMHg5ZWE3LCAweDY5MTQsIDB4MjA2OSwgMHhhYmFlLCAweDY5MDQsIDB4ODFmZiwKKwkweDAwYzAsIDB4OWU5YiwgMHg2OTBjLCAweGExODIsIDB4MDEwMCwgMHgwMDQ4LCAweDllYTMsIDB4NjkwOCwKKwkweDgxZmYsIDB4MDBjMCwgMHg5ZTlmLCAweDY5MTAsIDB4YTE4YSwgMHgwMDAxLCAweDAwNDgsIDB4OWVhNywKKwkweDY5MTgsIDB4YTE4YSwgMHgwMDAxLCAweDAwNDgsIDB4OWVhZiwgMHgwMDc4LCAweDllYjksIDB4NjAxMywKKwkweDAxMDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsIDB4MDMwMCwgMHgwMDc4LCAweDllYjUsIDB4NjAxMywKKwkweDA1MDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsIDB4MDcwMCwgMHgwMDc4LCAweDllYjUsIDB4NjAxMywKKwkweDA5MDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsIDB4MGIwMCwgMHgwMDc4LCAweDllYjUsIDB4NjAxMywKKwkweDBmMDAsIDB4MDA3OCwgMHg5ZWI1LCAweDYwMTMsIDB4MmQwMCwgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwKKwkweDllYmEsIDB4YTAwNiwgMHgwMTdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwKKwkweDBkN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDE1N2UsIDB4NjIxOCwgMHgyMjY4LCAweDZiMDQsIDB4YTM5NCwKKwkweDAwZmYsIDB4YTI4NiwgMHgwMDA2LCAweDAwNDAsIDB4OWVlMywgMHhhMjg2LCAweDAwMDQsIDB4MDA0MCwKKwkweDllZTMsIDB4YTM5NCwgMHhmZjAwLCAweDgyMTcsIDB4YTI4NiwgMHgwMDA2LCAweDAwNDAsIDB4OWVlMywKKwkweGEyODYsIDB4MDAwNCwgMHgwMDQwLCAweDllZTMsIDB4MGM3ZSwgMHgyZDYwLCAweDEwNzgsIDB4NDVkNiwKKwkweDBjN2YsIDB4MDA3OCwgMHg5ZjFlLCAweDIwMTEsIDB4YWI5NiwgMHhhZDk4LCAweDAwMGEsIDB4MjBhOSwKKwkweDAwMDQsIDB4MTA3OCwgMHg4MGRlLCAweDAwYzAsIDB4OWYxZiwgMHgyMDExLCAweGFiOWEsIDB4YWQ5OCwKKwkweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsIDB4ODBkZSwgMHgwMGMwLCAweDlmMWYsIDB4MDQ3ZSwKKwkweDAxN2UsIDB4NmFhMCwgMHhhMjk0LCAweDAwZmYsIDB4ODIyNywgMHhhMDA2LCAweDIwMDksIDB4YTY1MywKKwkweDIxMGMsIDB4ZDFhNCwgMHgwMDQwLCAweDlmMGIsIDB4MjAwOSwgMHgwMDI5LCAweDEwNzgsIDB4YTIxZCwKKwkweDY4MDAsIDB4YzBlNSwgMHg2ODAyLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVmMDEsIDB4MDc3ZSwKKwkweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDVlMGEsIDB4MmMwOCwgMHgxMDc4LCAweDlmOGIsIDB4MDc3ZiwKKwkweDIwMDEsIDB4MDAwNywgMHgxMDc4LCAweDQ1MzUsIDB4MDE3ZiwgMHgwNDdmLCAweGEwMDYsIDB4MTU3ZiwKKwkweDAzN2YsIDB4MDI3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MDA3YywgMHgwZDdlLCAweDIwNjksIDB4YWI4ZSwKKwkweDY4MDAsIDB4YTA4NiwgMHgwODAwLCAweDAwNDAsIDB4OWYzMSwgMHg2MDEzLCAweDAwMDAsIDB4MDA3OCwKKwkweDlmMzIsIDB4YTAwNiwgMHgwZDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZjdlLCAweDAxN2UsIDB4MDI3ZSwKKwkweDAzN2UsIDB4MTU3ZSwgMHgyMDc5LCAweGFiOGMsIDB4NzkzMCwgMHg3ODM0LCAweDEwNzgsIDB4MjU0ZCwKKwkweDAwYzAsIDB4OWY1OCwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHg5ZjU4LCAweDIwMTEsIDB4YWI5MCwKKwkweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg4MGRlLCAweDAwYzAsIDB4OWY1OCwKKwkweDIwMTEsIDB4YWI5NCwgMHhhYzk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsIDB4ODBkZSwKKwkweDE1N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MGY3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwKKwkweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MTU3ZSwgMHgyMDExLCAweGFiODMsIDB4MjIwNCwKKwkweDgyMTEsIDB4MjIwYywgMHgxMDc4LCAweDI1NGQsIDB4MDBjMCwgMHg5Zjg0LCAweDEwNzgsIDB4NDVjNCwKKwkweDAwYzAsIDB4OWY4NCwgMHgyMDExLCAweGFiOTYsIDB4YWM5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwKKwkweDEwNzgsIDB4ODBkZSwgMHgwMGMwLCAweDlmODQsIDB4MjAxMSwgMHhhYjlhLCAweGFjOTgsIDB4MDAwNiwKKwkweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDgwZGUsIDB4MTU3ZiwgMHgwMzdmLCAweDAyN2YsIDB4MDE3ZiwKKwkweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MGM3ZSwgMHgwODdlLCAweDA3N2UsIDB4MDY3ZSwKKwkweDA1N2UsIDB4MDQ3ZSwgMHgwMjdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDI3NDAsIDB4MjAyOSwKKwkweGE4YmEsIDB4MjUyYywgMHgyMDIxLCAweGE4YzAsIDB4MjQyNCwgMHgyMDYxLCAweGFkMDAsIDB4MjA3MSwKKwkweGE2MDAsIDB4NzY0OCwgMHg3MDY0LCAweDgxZmYsIDB4MDA0MCwgMHg5ZmIyLCAweDAwN2UsIDB4YTE4NiwKKwkweGE5YjMsIDB4MDA3ZiwgMHgwMDQwLCAweDlmYjIsIDB4ODAwMSwgMHhhNjAyLCAweDAwYzgsIDB4YTAxYywKKwkweDAwNzgsIDB4OWZiNSwgMHhhNjA2LCAweDAwNDAsIDB4YTAxYywgMHgyMTAwLCAweGFjMDYsIDB4MDA0MCwKKwkweGEwMTIsIDB4MTA3OCwgMHhhMjQyLCAweDAwNDAsIDB4YTAxMiwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwKKwkweDAwNDAsIDB4YTAzNywgMHhhNzg2LCAweDAwMDQsIDB4MDA0MCwgMHhhMDM3LCAweGE3ODYsIDB4MDAwNywKKwkweDAwNDAsIDB4YTAxMiwgMHgyNTAwLCAweGFjMDYsIDB4MDA0MCwgMHhhMDEyLCAweDI0MDAsIDB4YWMwNiwKKwkweDAwNDAsIDB4YTAxMiwgMHgxMDc4LCAweGEyNTYsIDB4MDBjMCwgMHhhMDEyLCAweDg4ZmYsIDB4MDA0MCwKKwkweDlmZGQsIDB4NjAyMCwgMHhhOTA2LCAweDAwYzAsIDB4YTAxMiwgMHgwZDdlLCAweDYwMDAsIDB4YTA4NiwKKwkweDAwMDQsIDB4MDBjMCwgMHg5ZmU3LCAweDAxN2UsIDB4MTA3OCwgMHgxNzU3LCAweDAxN2YsIDB4YTc4NiwKKwkweDAwMDgsIDB4MDBjMCwgMHg5ZmY2LCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweDlmZjYsIDB4MTA3OCwKKwkweDdjODMsIDB4MGQ3ZiwgMHgxMDc4LCAweDhlYzYsIDB4MDA3OCwgMHhhMDEyLCAweDYwMTAsIDB4MjA2OCwKKwkweDEwNzgsIDB4OGQwNiwgMHgwMDQwLCAweGEwMGYsIDB4YTc4NiwgMHgwMDAzLCAweDAwYzAsIDB4YTAyNiwKKwkweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweGE0ZTIsIDB4MDE3ZSwKKwkweDEwNzgsIDB4OGY3ZCwgMHgxMDc4LCAweDRhNzMsIDB4MDE3ZiwgMHgxMDc4LCAweDhlYjksIDB4MGQ3ZiwKKwkweDEwNzgsIDB4OGVjNiwgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsIDB4YWMwMiwKKwkweDAwYzgsIDB4YTAxYywgMHgwMDc4LCAweDlmOWYsIDB4MTI3ZiwgMHgwMjdmLCAweDA0N2YsIDB4MDU3ZiwKKwkweDA2N2YsIDB4MDc3ZiwgMHgwODdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweGE3ODYsIDB4MDAwNiwKKwkweDAwYzAsIDB4YTAwMCwgMHhhMzg2LCAweDAwMDUsIDB4MDA0MCwgMHhhMDM0LCAweDEwNzgsIDB4YTRlMiwKKwkweDEwNzgsIDB4YTFjYSwgMHgwMDc4LCAweGEwMGYsIDB4MGQ3ZiwgMHgwMDc4LCAweGEwMTIsIDB4MTA3OCwKKwkweGEyNTYsIDB4MDBjMCwgMHhhMDEyLCAweDgxZmYsIDB4MDA0MCwgMHhhMDEyLCAweGExODAsIDB4MDAwMSwKKwkweDIwMDQsIDB4YTA4NiwgMHgwMDE4LCAweDAwNDAsIDB4YTA0YywgMHhhMTgwLCAweDAwMDEsIDB4MjAwNCwKKwkweGEwODYsIDB4MDAyZCwgMHgwMGMwLCAweGEwMTIsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwKKwkweGEwMTIsIDB4MTA3OCwgMHg4ZWVjLCAweDAwNDAsIDB4YTA1ZCwgMHgxMDc4LCAweDhmMDAsIDB4MDBjMCwKKwkweGEwMTIsIDB4MTA3OCwgMHg3YzgzLCAweDAwNzgsIDB4YTA2NSwgMHgxMDc4LCAweDI4YTYsIDB4MTA3OCwKKwkweDhmMDAsIDB4MDBjMCwgMHhhMDY1LCAweDEwNzgsIDB4N2M4MywgMHgxMDc4LCAweDhlYzYsIDB4MDA3OCwKKwkweGEwMTIsIDB4MGM3ZSwgMHgwZTdlLCAweDAxN2UsIDB4MmMwOCwgMHgyMTcwLCAweGEwMDYsIDB4MTA3OCwKKwkweGExZTYsIDB4MDE3ZiwgMHgwMDQwLCAweGEwNzksIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwKKwkweGEwN2MsIDB4MGU3ZiwgMHgwYzdmLCAweDAwN2MsIDB4YTA4NCwgMHhhMDg0LCAweGEwODQsIDB4YTA4NCwKKwkweGEwODQsIDB4YTA4NCwgMHhhMDg2LCAweGEwODQsIDB4YTAwNiwgMHgwMDdjLCAweDA0N2UsIDB4MDE3ZSwKKwkweDcwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMjQsIDB4YTRhNCwgMHgwMGZmLCAweDg0MjcsIDB4MmMwMCwKKwkweDIwMDksIDB4MDAyMCwgMHgxMDc4LCAweGEyMWQsIDB4MDE3ZiwgMHgwNDdmLCAweDAzN2UsIDB4MjAxOSwKKwkweDAwMDIsIDB4MTA3OCwgMHg5ZGM3LCAweDAzN2YsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MjAwMSwKKwkweDAwMDEsIDB4MTA3OCwgMHg0NGVlLCAweDE1N2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjAxOSwgMHhhNjA1LCAweDIwMTEsIDB4YWI5NiwgMHgxMDc4LCAweDgwZGUsIDB4MDM3ZiwKKwkweDAyN2YsIDB4MDE3ZiwgMHgxNTdmLCAweGEwMDUsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MGM3ZSwKKwkweDA4N2UsIDB4MDc3ZSwgMHgwNjdlLCAweDAyN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwKKwkweDIwNjEsIDB4YWQwMCwgMHgyMDc5LCAweDAwMDEsIDB4OGZmZiwgMHgwMDQwLCAweGExMWQsIDB4MjA3MSwKKwkweGE2MDAsIDB4NzY0OCwgMHg3MDY0LCAweDgwMDEsIDB4YTYwMiwgMHgwMGM4LCAweGExMWQsIDB4ODhmZiwKKwkweDAwNDAsIDB4YTBkOCwgMHgyODAwLCAweGFjMDYsIDB4MDBjMCwgMHhhMTEzLCAweDIwNzksIDB4MDAwMCwKKwkweDEwNzgsIDB4YTI0MiwgMHgwMDQwLCAweGExMTMsIDB4MjQwMCwgMHhhYzA2LCAweDAwNDAsIDB4YTExMywKKwkweDY3MWMsIDB4YTc4NiwgMHgwMDA2LCAweDAwYzAsIDB4YTExMywgMHhhNzg2LCAweDAwMDcsIDB4MDA0MCwKKwkweGExMTMsIDB4ODhmZiwgMHgwMGMwLCAweGEwZjcsIDB4NjAxOCwgMHhhMjA2LCAweDAwYzAsIDB4YTExMywKKwkweDg1ZmYsIDB4MDA0MCwgMHhhMGY3LCAweDYwMjAsIDB4YTEwNiwgMHgwMGMwLCAweGExMTMsIDB4MGQ3ZSwKKwkweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4YTEwMywgMHgxMDc4LCAweGE0OTUsIDB4NjAxZiwKKwkweDAwMDcsIDB4MTA3OCwgMHgxNzU3LCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhkMDYsIDB4MDA0MCwKKwkweGExMGQsIDB4MDQ3ZSwgMHgxMDc4LCAweGExY2EsIDB4MDQ3ZiwgMHgwZDdmLCAweDEwNzgsIDB4OGVjNiwKKwkweDg4ZmYsIDB4MDBjMCwgMHhhMTI3LCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGE2MTYsIDB4MjAwNCwKKwkweGFjMDIsIDB4MDBjOCwgMHhhMTFkLCAweDAwNzgsIDB4YTBjNCwgMHhhMDA2LCAweDEyN2YsIDB4MDI3ZiwKKwkweDA2N2YsIDB4MDc3ZiwgMHgwODdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4YThjNSwKKwkweDAwMDEsIDB4MDA3OCwgMHhhMTFlLCAweDA3N2UsIDB4MDU3ZSwgMHgwODdlLCAweDIwNDEsIDB4MDAwMCwKKwkweDIwMjksIDB4MDAwMSwgMHgyYzIwLCAweDIwMTksIDB4MDAwMiwgMHg2MjE4LCAweDA5N2UsIDB4MjA0OSwKKwkweDAwMDAsIDB4MTA3OCwgMHg3MjQ2LCAweDA5N2YsIDB4MDg3ZiwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwKKwkweDcyZjMsIDB4MTA3OCwgMHhhMGI1LCAweDA1N2YsIDB4MDc3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MDQ3ZSwKKwkweDA1N2UsIDB4MDc3ZSwgMHgwYzdlLCAweDE1N2UsIDB4MmMyMCwgMHgyMTI4LCAweDIwYTksIDB4MDA3ZiwKKwkweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDAzN2UsIDB4MTA3OCwgMHg0NWM0LCAweDAwYzAsIDB4YTE2ZSwKKwkweDJjMTAsIDB4MDU3ZSwgMHgwODdlLCAweDIwNDEsIDB4MDAwMCwgMHgyNTA4LCAweDIwMjksIDB4MDAwMSwKKwkweDA5N2UsIDB4MjA0OSwgMHgwMDAwLCAweDEwNzgsIDB4NzI0NiwgMHgwOTdmLCAweDA4N2YsIDB4MjAzOSwKKwkweDAwMDAsIDB4MTA3OCwgMHg3MmYzLCAweDEwNzgsIDB4YTBiNSwgMHgwNTdmLCAweDAzN2YsIDB4MDE3ZiwKKwkweDgxMDgsIDB4MDBmMCwgMHhhMTUyLCAweDE1N2YsIDB4MGM3ZiwgMHgwNzdmLCAweDA1N2YsIDB4MDQ3ZiwKKwkweDAyN2YsIDB4MDA3YywgMHgwNzdlLCAweDA1N2UsIDB4NjIxOCwgMHgwODdlLCAweDIwNDEsIDB4MDAwMCwKKwkweDIwMjksIDB4MDAwMSwgMHgyMDE5LCAweDAwNDgsIDB4MDk3ZSwgMHgyMDQ5LCAweDAwMDAsIDB4MTA3OCwKKwkweDcyNDYsIDB4MDk3ZiwgMHgwODdmLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDcyZjMsIDB4MmMyMCwKKwkweDEwNzgsIDB4YTBiNSwgMHgwNTdmLCAweDA3N2YsIDB4MDA3YywgMHgwMjdlLCAweDA0N2UsIDB4MDU3ZSwKKwkweDA3N2UsIDB4MGM3ZSwgMHgxNTdlLCAweDJjMjAsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwKKwkweDAxN2UsIDB4MDM3ZSwgMHgxMDc4LCAweDQ1YzQsIDB4MDBjMCwgMHhhMWJlLCAweDJjMTAsIDB4MDg3ZSwKKwkweDIwNDEsIDB4MDAwMCwgMHgyODI4LCAweDA0N2UsIDB4MjAyMSwgMHgwMDAxLCAweDEwNzgsIDB4YTQ3MiwKKwkweDA0N2YsIDB4MDk3ZSwgMHgyMDQ5LCAweDAwMDAsIDB4MTA3OCwgMHg3MjQ2LCAweDA5N2YsIDB4MDg3ZiwKKwkweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDcyZjMsIDB4MTA3OCwgMHhhMGI1LCAweDAzN2YsIDB4MDE3ZiwKKwkweDgxMDgsIDB4MDBmMCwgMHhhMWEwLCAweDE1N2YsIDB4MGM3ZiwgMHgwNzdmLCAweDA1N2YsIDB4MDQ3ZiwKKwkweDAyN2YsIDB4MDA3YywgMHgwMTdlLCAweDBmN2UsIDB4YWQ4MiwgMHhjZDAwLCAweDAwNDgsIDB4YTFlMywKKwkweGFkODIsIDB4ZmZmZiwgMHgwMGM4LCAweGExZTMsIDB4NjgwMCwgMHhhMDdkLCAweDAwNDAsIDB4YTFlMCwKKwkweDY4MDMsIDB4MDAwMCwgMHg2YjUyLCAweDEwNzgsIDB4NGE3MywgMHgyZjY4LCAweDAwNzgsIDB4YTFkNCwKKwkweDZiNTIsIDB4MTA3OCwgMHg0YTczLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDQ3ZSwKKwkweDAzN2UsIDB4MjA2MSwgMHhhZDAwLCAweGEwMDUsIDB4MDBjMCwgMHhhMWY2LCAweDIwNzEsIDB4YTYwMCwKKwkweDc0NDgsIDB4NzA2NCwgMHg4MDAxLCAweGE0MDIsIDB4MDBjOCwgMHhhMjE4LCAweDIxMDAsIDB4YWMwNiwKKwkweDAwNDAsIDB4YTIwYSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweGEyMGEsIDB4NjAwOCwKKwkweGEyMDYsIDB4MDBjMCwgMHhhMjBhLCAweDYwMTgsIDB4YTFhMCwgMHgwMDA2LCAweDI0MjQsIDB4YTQwNiwKKwkweDAwNDAsIDB4YTIxNCwgMHhhY2UwLCAweDAwMTAsIDB4MjAwMSwgMHhhNjE2LCAweDIwMDQsIDB4YWMwMiwKKwkweDAwYzgsIDB4YTIxOCwgMHgwMDc4LCAweGExZjYsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4YTIxOSwKKwkweGEwMDYsIDB4MDM3ZiwgMHgwNDdmLCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweDAwN2UsIDB4MTA3OCwKKwkweDEzOGIsIDB4MDA3ZiwgMHgxMDQwLCAweDEzMzIsIDB4NjgzNywgMHgwMTBkLCAweDY4NWUsIDB4MDI3ZSwKKwkweDIwMTAsIDB4MTA3OCwgMHg4Y2YyLCAweDIwMDEsIDB4MDAwMCwgMHgwMDQwLCAweGEyMzMsIDB4MjIwMCwKKwkweGEwODAsIDB4MDAwOCwgMHgyMDA0LCAweDAyN2YsIDB4Njg0YSwgMHg2OTU2LCAweDZjNDYsIDB4Njg0ZiwKKwkweDAwMDAsIDB4YTAwNiwgMHg2OGIyLCAweDY4MDIsIDB4NjgzYSwgMHg2ODVhLCAweDEwNzgsIDB4NGE3MywKKwkweDBkN2YsIDB4MDA3YywgMHg2NzAwLCAweGE3ODYsIDB4MDAwMCwgMHgwMDQwLCAweGEyNTUsIDB4YTc4NiwKKwkweDAwMDEsIDB4MDA0MCwgMHhhMjU1LCAweGE3ODYsIDB4MDAwYSwgMHgwMDQwLCAweGEyNTUsIDB4YTc4NiwKKwkweDAwMDksIDB4MDA0MCwgMHhhMjU1LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDBlN2UsIDB4NjAxOCwKKwkweDIwNzAsIDB4NzBhMCwgMHhhMjA2LCAweDBlN2YsIDB4MDA3YywgMHgwMTdlLCAweDYwMDQsIDB4YTA4ZSwKKwkweDAwMWUsIDB4MDBjMCwgMHhhMjc3LCAweDgwMDcsIDB4NjEzMCwgMHhhMThjLCAweDAwZmYsIDB4YTEwNSwKKwkweDYwMzIsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDUsIDB4MjAwMSwKKwkweGE4YTMsIDB4MjAwNCwgMHg2MDE2LCAweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MDE3ZiwKKwkweDAwN2MsIDB4MDAwNSwgMHgwMDA1LCAweDAwN2MsIDB4NjAyNCwgMHhkMGU0LCAweDAwNDAsIDB4YTI4ZCwKKwkweGQwY2MsIDB4MDA0MCwgMHhhMjg3LCAweDEwNzgsIDB4OGZiZiwgMHgwMDc4LCAweGEyOGQsIDB4MTA3OCwKKwkweGE0OTUsIDB4MTA3OCwgMHg1YmMxLCAweDEwNzgsIDB4NzcyZCwgMHgwMDdjLCAweGEyODAsIDB4MDAwNywKKwkweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksIDB4YTI5NSwgMHhhMjllLCAweGEyOWUsIDB4YTI5ZSwKKwkweGEyYTAsIDB4YTI5ZSwgMHhhMmEwLCAweGEyYTAsIDB4YTI5ZSwgMHhhMmEwLCAweGEwMDYsIDB4MDA3YywKKwkweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweGEyODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwKKwkweDAwNzksIDB4YTJhYSwgMHhhMmIzLCAweGEyYjMsIDB4YTJiMywgMHhhMmIzLCAweGEyYjMsIDB4YTJiMywKKwkweGEyYmUsIDB4YTJiMywgMHhhMmIzLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywKKwkweDJhMDAsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWQ4YSwgMHgwMDdjLCAweDBjN2UsIDB4MjI2MCwKKwkweDEwNzgsIDB4YTQ5NSwgMHg2MDNmLCAweDAwMDAsIDB4NjAyNCwgMHhjMGY0LCAweGMwY2MsIDB4NjAyNiwKKwkweDBjN2YsIDB4MGQ3ZSwgMHgyMjY4LCAweGExODYsIDB4MDAwNywgMHgwMGMwLCAweGEzMWYsIDB4NjgxMCwKKwkweGEwMDUsIDB4MDA0MCwgMHhhMmRjLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwZmMsIDB4MDBjMCwKKwkweGEyZGMsIDB4MGQ3ZiwgMHgwMDc4LCAweGEyYjMsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwKKwkweDEwNzgsIDB4NWQ4YSwgMHgxMDc4LCAweDYyZDEsIDB4MGM3ZSwgMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwKKwkweDAwMDIsIDB4MDBjMCwgMHhhM2FkLCAweDYwMTAsIDB4YTAwNSwgMHgwMGMwLCAweGEyZjYsIDB4NjAwMCwKKwkweGEwODYsIDB4MDAwNywgMHgxMGMwLCAweDEzMzIsIDB4MDA3OCwgMHhhM2FkLCAweGEwOGMsIDB4ZjAwMCwKKwkweDAwYzAsIDB4YTMwMiwgMHgwMDc4LCAweGEzMDIsIDB4MjA2OCwgMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwKKwkweGEyZmMsIDB4MmQwMCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwKKwkweDAwMDIsIDB4MDBjMCwgMHhhMzFiLCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGMwZGMsIDB4YzBmNCwKKwkweDY4NGUsIDB4Njg1MCwgMHhjMGY0LCAweGMwZmMsIDB4Njg1MiwgMHgyMDA5LCAweDAwNDMsIDB4MTA3OCwKKwkweDljMWUsIDB4MDA3OCwgMHhhM2FkLCAweDIwMDksIDB4MDA0MSwgMHgwMDc4LCAweGEzYTcsIDB4YTE4NiwKKwkweDAwMDUsIDB4MDBjMCwgMHhhMzY2LCAweDY4MTAsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4ZDBiYywKKwkweDAwYzAsIDB4YTMyZCwgMHgwZDdmLCAweDAwNzgsIDB4YTJiMywgMHhkMGI0LCAweDAwNDAsIDB4YTMzNSwKKwkweGQwZmMsIDB4MTA0MCwgMHgxMzMyLCAweDAwNzgsIDB4YTJjZiwgMHg2MDA3LCAweDAwM2EsIDB4NjAwMywKKwkweDAwMDEsIDB4MTA3OCwgMHg1ZDhhLCAweDEwNzgsIDB4NjJkMSwgMHgwYzdlLCAweDJkNjAsIDB4NjEwMCwKKwkweGExODYsIDB4MDAwMiwgMHgwMDQwLCAweGEzNDgsIDB4YTE4NiwgMHgwMDA0LCAweDAwYzAsIDB4YTNhZCwKKwkweDIwNzEsIDB4YThlNywgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweGEzNTUsIDB4NzAwNCwKKwkweGFjMDYsIDB4MDBjMCwgMHhhMzU1LCAweDcwMDMsIDB4MDAwMCwgMHg2ODEwLCAweGEwODAsIDB4MDAxMywKKwkweDIwMGMsIDB4YzFmNCwgMHhjMWRjLCAweDIxMDIsIDB4ODAwMCwgMHgyMDBjLCAweGMxZjQsIDB4YzFmYywKKwkweGMxYmMsIDB4MjEwMiwgMHgyMDA5LCAweDAwNDIsIDB4MDA3OCwgMHhhM2E3LCAweDAzN2UsIDB4MGQ3ZSwKKwkweDBkN2UsIDB4MTA3OCwgMHgxMzhiLCAweDAzN2YsIDB4MTA0MCwgMHgxMzMyLCAweDY4MzcsIDB4MDEwZCwKKwkweDY4MDMsIDB4MDAwMCwgMHg2ODNiLCAweDAwMDAsIDB4Njg1YiwgMHgwMDAwLCAweDZiNWUsIDB4Njg1NywKKwkweDAwNDUsIDB4MmMwMCwgMHg2ODYyLCAweDYwMzQsIDB4Njg3MiwgMHgyMzYwLCAweDYwMjQsIDB4YzBkZCwKKwkweDYwMjYsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4ODAwNywKKwkweDYzMjAsIDB4NmI0YSwgMHg2ODQ2LCAweDY4NGYsIDB4MDAwMCwgMHg2ZDZhLCAweDZlNjYsIDB4Njg2ZiwKKwkweDAwMDEsIDB4MTA3OCwgMHg0YTczLCAweDIwMTksIDB4MDA0NSwgMHg2MDA4LCAweDIwNjgsIDB4MTA3OCwKKwkweDlkYzcsIDB4MmQwMCwgMHg2MDBhLCAweDYwMWYsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4NjAxNywKKwkweDAwMDAsIDB4NjAzZiwgMHgwMDAwLCAweDBkN2YsIDB4MDM3ZiwgMHgwMDc4LCAweGEzYWUsIDB4NjAzZiwKKwkweDAwMDAsIDB4NjAwMywgMHgwMDA3LCAweDEwNzgsIDB4OWMxZSwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywKKwkweGExODYsIDB4MDAxMywgMHgwMGMwLCAweGEzYmEsIDB4NjAwNCwgMHhhMDgyLCAweDAwODUsIDB4MjAwOCwKKwkweDAwNzksIDB4YTNkNCwgMHhhMTg2LCAweDAwMjcsIDB4MDBjMCwgMHhhM2NkLCAweDEwNzgsIDB4NjFjZCwKKwkweDAzN2UsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MjAxOSwgMHgwMDA0LCAweDEwNzgsIDB4YTFjYSwKKwkweDBkN2YsIDB4MDM3ZiwgMHgxMDc4LCAweDYyZDEsIDB4MDA3YywgMHhhMTg2LCAweDAwMTQsIDB4MDA0MCwKKwkweGEzYmUsIDB4MTA3OCwgMHg3NzczLCAweDAwN2MsIDB4YTNkZCwgMHhhM2RiLCAweGEzZGIsIDB4YTNkYiwKKwkweGEzZGIsIDB4YTNkYiwgMHhhM2RkLCAweDEwNzgsIDB4MTMzMiwgMHgxMDc4LCAweDYxY2QsIDB4NjAwMywKKwkweDAwMGMsIDB4MTA3OCwgMHg2MmQxLCAweDAwN2MsIDB4YTE4MiwgMHgwMDhjLCAweDAwYzgsIDB4YTNlZSwKKwkweGExODIsIDB4MDA4NSwgMHgwMDQ4LCAweGEzZWUsIDB4MDA3OSwgMHhhM2YxLCAweDEwNzgsIDB4Nzc3MywKKwkweDAwN2MsIDB4YTNmOCwgMHhhM2Y4LCAweGEzZjgsIDB4YTNmOCwgMHhhM2ZhLCAweGE0MTksIDB4YTNmOCwKKwkweDEwNzgsIDB4MTMzMiwgMHgwZDdlLCAweDJjNjgsIDB4MTA3OCwgMHg3NmM3LCAweDAwNDAsIDB4YTQxNCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4MjAwOSwgMHhhYjhlLCAweDIxMGMsIDB4NjEzNiwKKwkweDIwMDksIDB4YWI4ZiwgMHgyMTBjLCAweDYxM2EsIDB4NjAwYiwgMHhmZmZmLCAweDY5MTgsIDB4NjExYSwKKwkweDYwMWYsIDB4MDAwNCwgMHgxMDc4LCAweDVkOGEsIDB4MmQ2MCwgMHgxMDc4LCAweDc3MmQsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MTA3OCwgMHg3NzJkLCAweDAwN2MsIDB4MGU3ZSwgMHg2MDE4LCAweDIwNzAsIDB4NzAwMCwKKwkweGQwZWMsIDB4MGU3ZiwgMHgwMDdjLCAweDYwMTAsIDB4YTA4YywgMHhmMDAwLCAweDAwNDAsIDB4YTQ3MSwKKwkweGEwODAsIDB4MDAxMywgMHgyMDBjLCAweGQxZWMsIDB4MDA0MCwgMHhhNDcxLCAweDIwMDEsIDB4YTY3MiwKKwkweDIwMDQsIDB4ZDBlYywgMHgwMDQwLCAweGE0NzEsIDB4NjAwMywgMHgwMDAyLCAweDYwMjQsIDB4YzBlNSwKKwkweDYwMjYsIDB4ZDFhYywgMHgwMDQwLCAweGE0NGYsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDk1ZiwKKwkweDBmN2YsIDB4MDA0MCwgMHhhNDRmLCAweDIwMDEsIDB4YThhNCwgMHgyMDA0LCAweDYwM2UsIDB4MjAwOSwKKwkweGE2NzIsIDB4MjEwYywgMHhkMWY0LCAweDAwYzAsIDB4YTQ2ZiwgMHgwMDc4LCAweGE0NjEsIDB4MjAwOSwKKwkweGE2NzIsIDB4MjEwYywgMHhkMWY0LCAweDAwNDAsIDB4YTQ1YiwgMHg2MDI0LCAweGMwZTQsIDB4NjAyNiwKKwkweGEwMDYsIDB4MDA3OCwgMHhhNDcxLCAweDIwMDEsIDB4YThhNCwgMHgyMDBjLCAweDgxMDMsIDB4YTEwMCwKKwkweDYwM2UsIDB4NjAxOCwgMHhhMDg4LCAweDAwMmIsIDB4MjEwNCwgMHhhMDA1LCAweDAwNDAsIDB4YTQ2YywKKwkweGEwODgsIDB4MDAwMywgMHgwMDc4LCAweGE0NjQsIDB4MmMwYSwgMHg2MDBmLCAweDAwMDAsIDB4YTA4NSwKKwkweDAwMDEsIDB4MDA3YywgMHgwMTdlLCAweDBjN2UsIDB4MGU3ZSwgMHg2MTIwLCAweGEyZjAsIDB4MDAyYiwKKwkweDJlMDQsIDB4MjA2MCwgMHg4Y2ZmLCAweDAwNDAsIDB4YTQ5MSwgMHg4NGZmLCAweDAwYzAsIDB4YTQ4NCwKKwkweDYwMjAsIDB4YTEwNiwgMHgwMGMwLCAweGE0OGMsIDB4NjAwYywgMHgyMDcyLCAweDEwNzgsIDB4NWJjMSwKKwkweDEwNzgsIDB4NzcyZCwgMHgwMDc4LCAweGE0OGUsIDB4YWNmMCwgMHgwMDAzLCAweDJlNjQsIDB4MDA3OCwKKwkweGE0N2EsIDB4MGU3ZiwgMHgwYzdmLCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDYwMTgsIDB4YTBlOCwKKwkweDAwMmIsIDB4MmQwNCwgMHhhMDA1LCAweDAwNDAsIDB4YTRhNywgMHhhYzA2LCAweDAwNDAsIDB4YTRhNSwKKwkweDJkMDQsIDB4YTBlOCwgMHgwMDAzLCAweDAwNzgsIDB4YTQ5OSwgMHg2MDBjLCAweDIwNmEsIDB4MGQ3ZiwKKwkweDAwN2MsIDB4MDI3ZSwgMHgwMzdlLCAweDE1N2UsIDB4MjAxMSwgMHhhNjI2LCAweDIyMDQsIDB4YTA4NCwKKwkweDAwZmYsIDB4MjAxOSwgMHhhYjhlLCAweDIzMzQsIDB4YTYzNiwgMHgwMGMwLCAweGE0ZDUsIDB4ODMxOCwKKwkweDIzMzQsIDB4MjIwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTYzNiwgMHgwMGMwLCAweGE0ZDUsIDB4MjAxMSwKKwkweGFiOTAsIDB4NjAxOCwgMHhhMDk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsIDB4ODBkZSwKKwkweDAwYzAsIDB4YTRkNSwgMHgyMDExLCAweGFiOTQsIDB4NjAxOCwgMHhhMDk4LCAweDAwMDYsIDB4MjBhOSwKKwkweDAwMDQsIDB4MTA3OCwgMHg4MGRlLCAweDAwYzAsIDB4YTRkNSwgMHgxNTdmLCAweDAzN2YsIDB4MDI3ZiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDAsIDB4MTA3OCwgMHg0MmI4LCAweDEwNzgsIDB4MjY3NywKKwkweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDYwMTgsIDB4MjA3MCwgMHg3MDAwLCAweGQwZmMsIDB4MDA0MCwKKwkweGE0ZWIsIDB4MTA3OCwgMHhhNGVkLCAweDBlN2YsIDB4MDA3YywgMHg2ODUwLCAweGMwZTUsIDB4Njg1MiwKKwkweDAwN2MsIDB4MGU3ZSwgMHgwYzdlLCAweDA3N2UsIDB4MDY3ZSwgMHgwNTdlLCAweDA0N2UsIDB4MDI3ZSwKKwkweDAxN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwgMHhhOGJhLCAweDI1MmMsIDB4MjAyMSwKKwkweGE4YzAsIDB4MjQyNCwgMHgyMDYxLCAweGFkMDAsIDB4MjA3MSwgMHhhNjAwLCAweDc2NDgsIDB4NzA2NCwKKwkweGE2MDYsIDB4MDA0MCwgMHhhNTQ1LCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLCAweDAwNDAsIDB4YTUxNCwKKwkweGE3ODYsIDB4MDAwOCwgMHgwMGMwLCAweGE1M2IsIDB4MjUwMCwgMHhhYzA2LCAweDAwNDAsIDB4YTUzYiwKKwkweDI0MDAsIDB4YWMwNiwgMHgwMDQwLCAweGE1M2IsIDB4MTA3OCwgMHhhMjQyLCAweDAwNDAsIDB4YTUzYiwKKwkweDEwNzgsIDB4YTI1NiwgMHgwMGMwLCAweGE1M2IsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwKKwkweGE1MmQsIDB4MDE3ZSwgMHgxMDc4LCAweDE3NTcsIDB4MDE3ZiwgMHgxMDc4LCAweDhlZWMsIDB4MDBjMCwKKwkweGE1MzMsIDB4MTA3OCwgMHgyOGE2LCAweDEwNzgsIDB4OGYwMCwgMHgwMGMwLCAweGE1MzksIDB4MTA3OCwKKwkweDdjODMsIDB4MTA3OCwgMHg4ZWM2LCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGE2MTYsIDB4MjAwNCwKKwkweGFjMDIsIDB4MDBjOCwgMHhhNTQ1LCAweDAwNzgsIDB4YTUwNCwgMHgxMjdmLCAweDAxN2YsIDB4MDI3ZiwKKwkweDA0N2YsIDB4MDU3ZiwgMHgwNjdmLCAweDA3N2YsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MTI3ZSwKKwkweDAwN2UsIDB4MGU3ZSwgMHgwMTdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE2NDAsIDB4ZDVhNCwKKwkweDAwNDAsIDB4YTU1ZCwgMHg3MDM0LCAweDgwMDAsIDB4NzAzNiwgMHhkNWI0LCAweDAwNDAsIDB4YTU2MywKKwkweDcwMzAsIDB4ODAwMCwgMHg3MDMyLCAweGQ1YWMsIDB4MDA0MCwgMHhhNTc5LCAweDI1MDAsIDB4YTA4NCwKKwkweDAwMDcsIDB4YTA4ZSwgMHgwMDAzLCAweDAwNDAsIDB4YTU3OSwgMHhhMDhlLCAweDAwMDQsIDB4MDA0MCwKKwkweGE1NzksIDB4YTA4ZSwgMHgwMDA1LCAweDAwNDAsIDB4YTU3OSwgMHgyMDcxLCAweGE2NGEsIDB4MTA3OCwKKwkweGE1YmEsIDB4MDE3ZiwgMHgwZTdmLCAweDAwN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwKKwkweDBlN2UsIDB4MDE3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNjQwLCAweGQ1YTQsIDB4MDA0MCwKKwkweGE1OGMsIDB4NzAzNCwgMHg4MDAwLCAweDcwMzYsIDB4ZDViNCwgMHgwMDQwLCAweGE1OTIsIDB4NzAzMCwKKwkweDgwMDAsIDB4NzAzMiwgMHhkNWFjLCAweDAwNDAsIDB4YTVhOCwgMHgyNTAwLCAweGEwODQsIDB4MDAwNywKKwkweGEwOGUsIDB4MDAwMywgMHgwMDQwLCAweGE1YTgsIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4YTVhOCwKKwkweGEwOGUsIDB4MDAwNSwgMHgwMDQwLCAweGE1YTgsIDB4MjA3MSwgMHhhNjRhLCAweDEwNzgsIDB4YTViYSwKKwkweDAxN2YsIDB4MGU3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGU3ZSwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE2NDIsIDB4MTA3OCwgMHhhNWJhLCAweDBlN2YsIDB4MDA3ZiwKKwkweDEyN2YsIDB4MDA3YywgMHgyZTA0LCAweDgwMDAsIDB4MjA3MiwgMHgwMGM4LCAweGE1YzMsIDB4OGU3MCwKKwkweDJlMDQsIDB4ODAwMCwgMHgyMDcyLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE2NDAsIDB4MTA3OCwKKwkweGE1YmEsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjQ0LCAweDEwNzgsIDB4YTViYSwKKwkweDBlN2YsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGU3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweGE2NDAsIDB4NzA0NCwgMHg4MDAwLCAweDcwNDYsIDB4MGU3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywKKwkweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKKwkweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMCwKKwkweGE1MGMKK307CisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjEwMHRwX2xlbmd0aDAxID0gMHg5NWYxOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4OTVmMTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIyMDAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTY5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIyMDAuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogUUxvZ2ljIElTUDIyMDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbiAod3d3LnFsb2dpYy5jb20pCisgKgorICogUmVsZWFzZWQgdW5kZXIgR1BMIHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKK3N0YXRpYyBjaGFyIHFsYV9kcml2ZXJfbmFtZVtdID0gInFsYTIyMDAiOworCitleHRlcm4gdW5zaWduZWQgY2hhciAgZncyMjAwdHBfdmVyc2lvbltdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjIwMHRwX3ZlcnNpb25fc3RyW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMjAwdHBfYWRkcjAxOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjIwMHRwX2NvZGUwMVtdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjIwMHRwX2xlbmd0aDAxOworCitzdGF0aWMgc3RydWN0IHFsYV9md19pbmZvIHFsYV9md190YmxbXSA9IHsKKwl7CisJCS5hZGRyZXNzaW5nCT0gRldfSU5GT19BRERSX05PUk1BTCwKKwkJLmZ3Y29kZQkJPSAmZncyMjAwdHBfY29kZTAxWzBdLAorCQkuZndsZW4JCT0gJmZ3MjIwMHRwX2xlbmd0aDAxLAorCQkuZndzdGFydAk9ICZmdzIyMDB0cF9hZGRyMDEsCisJfSwKKworCXsgRldfSU5GT19BRERSX05PTU9SRSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gcWxhX2JvYXJkX3RibCA9IHsKKwkuZHJ2X25hbWUJPSBxbGFfZHJpdmVyX25hbWUsCisKKwkuaXNwX25hbWUJPSAiSVNQMjIwMCIsCisJLmZ3X2luZm8JPSBxbGFfZndfdGJsLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHFsYTIyMDBfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMjAwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZxbGFfYm9hcmRfdGJsLAorCX0sCisKKwl7MCwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTIyMDBfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitxbGEyMjAwX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBxbGEyeDAwX3Byb2JlX29uZShwZGV2LAorCSAgICAoc3RydWN0IHFsYV9ib2FyZF9pbmZvICopaWQtPmRyaXZlcl9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitxbGEyMjAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcWxhMngwMF9yZW1vdmVfb25lKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcWxhMjIwMF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJxbGEyMjAwIiwKKwkuaWRfdGFibGUJPSBxbGEyMjAwX3BjaV90YmwsCisJLnByb2JlCQk9IHFsYTIyMDBfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocWxhMjIwMF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitxbGEyMjAwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZxbGEyMjAwX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3FsYTIyMDBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcWxhMjIwMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocWxhMjIwMF9pbml0KTsKK21vZHVsZV9leGl0KHFsYTIyMDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlFMb2dpYyBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgSVNQMjJ4eCBGQy1TQ1NJIEhvc3QgQnVzIEFkYXB0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihRTEEyWFhYX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMjAwX2Z3LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIyMDBfZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDEyZGNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMjAwX2Z3LmMKQEAgLTAsMCArMSw1MzIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaXJtd2FyZSBWZXJzaW9uIDIuMDIuMDYgKDA4OjQ2IEp1biAyNiwgMjAwMykKKyAqLworCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjIwMHRwX3ZlcnNpb24gPSAyKjEwMjQrMjsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfdmVyc2lvbiA9IDIqMTAyNCsyOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgY2hhciBmdzIyMDB0cF92ZXJzaW9uX3N0cltdID0gezIsMiw2fTsKKyNlbHNlCit1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHsyLDIsNn07CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCisjZGVmaW5lIGZ3MjIwMHRwX1ZFUlNJT05fU1RSSU5HICIyLjAyLjA2IgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjIuMDIuMDYiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIyMDB0cF9hZGRyMDEgPSAweDEwMDAgOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDEwMDAgOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMjAwdHBfY29kZTAxW10gPSB7IAorI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZTAxW10gPSB7IAorI2VuZGlmCisJMHgwNDcwLCAweDAwMDAsIDB4MDAwMCwgMHhhNDZmLCAweDAwMDAsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDYsCisJMHgwMDE3LCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLCAweDQ5NDcsIDB4NDg1NCwgMHgyMDMyLCAweDMwMzAsCisJMHgzMTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLCAweDIwNDMsIDB4NGY1MiwgMHg1MDRmLCAweDUyNDEsCisJMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLCAweDMyMzIsIDB4MzAzMCwgMHgyMDQ2LCAweDY5NzIsCisJMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsCisJMHgzMjJlLCAweDMwMzIsIDB4MmUzMCwgMHgzNjIwLCAweDIwMjAsIDB4MjAyMCwgMHgyNDAwLCAweDIwYzEsCisJMHgwMDA1LCAweDIwMDEsIDB4MDE3ZiwgMHgyMDAzLCAweDAwMDAsIDB4MjBjOSwgMHhiYWZmLCAweDIwOTEsCisJMHgyMDAwLCAweDIwNTksIDB4MDAwMCwgMHgyYjc4LCAweDc4MjMsIDB4MDAwNCwgMHgyMDg5LCAweDI5NmEsCisJMHgyMDUxLCAweGI1MDAsIDB4MmE3MCwgMHgyMDI5LCAweGVkMDAsIDB4MjAzMSwgMHhmZmZmLCAweDIwMzksCisJMHhlY2U5LCAweDIwMjEsIDB4MDIwMCwgMHgwODA0LCAweDE0NjgsIDB4MjBhMSwgMHhiNDZmLCAweGEwMGUsCisJMHgyMGE5LCAweDA4OTEsIDB4NDFhNCwgMHgzNDAwLCAweDc1NjIsIDB4NzY2NiwgMHg3NzVlLCAweDc0NmEsCisJMHg3NDZlLCAweDIwYTEsIDB4YmQwMCwgMHg3MTY0LCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsCisJMHhhMThjLCAweDAwMGYsIDB4MjAwMSwgMHgwMDBiLCAweGExMTIsIDB4YTAwZSwgMHgyMWE4LCAweDQxYTQsCisJMHgzNDAwLCAweDgyMTEsIDB4MWRkOCwgMHg3MTY0LCAweDM0MDAsIDB4YTEwMiwgMHgwMTIwLCAweDAyMTgsCisJMHgyMGE4LCAweGEwMGUsIDB4NDFhNCwgMHgzODAwLCAweGQwOGMsIDB4MDFkOCwgMHgyMDA5LCAweGI1MDAsCisJMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweGExOGMsIDB4MDAwZiwgMHgyMDAxLCAweDAwMDEsCisJMHhhMTEyLCAweDIwYTEsIDB4MTAwMCwgMHhhMDBlLCAweDIxYTgsIDB4NDFhNCwgMHg4MjExLCAweDFkZTAsCisJMHgyMDA5LCAweGI1MDAsIDB4MzQwMCwgMHhhMTAyLCAweDAxMjAsIDB4MDIxOCwgMHgyMGE4LCAweGEwMGUsCisJMHg0MWE0LCAweDA4MGMsIDB4MTQxMSwgMHgwODBjLCAweDE2MzIsIDB4MDgwYywgMHgxN2NmLCAweDA4MGMsCisJMHgxZmEyLCAweDA4MGMsIDB4NGJmZiwgMHgwODBjLCAweDg1YmYsIDB4MDgwYywgMHgxNWJiLCAweDA4MGMsCisJMHgyZWM0LCAweDA4MGMsIDB4NWQ4YSwgMHgwODBjLCAweDUzNDEsIDB4MDgwYywgMHg2OGNlLCAweDA4MGMsCisJMHgyNTEwLCAweDA4MGMsIDB4NmI2MSwgMHgwODBjLCAweDYzYmIsIDB4MDgwYywgMHgyM2NhLCAweDA4MGMsCisJMHgyNGRlLCAweDIwOTEsIDB4MzAwOSwgMHg3ODIzLCAweDAwMDAsIDB4MTAwNCwgMHgxMGM1LCAweDc4MjAsCisJMHhhMDg2LCAweDAwMDIsIDB4MTE1MCwgMHg3ODIzLCAweDQwMDAsIDB4MGUwNCwgMHgxMGJkLCAweDc4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MmE3MCwgMHg3MDAzLCAweDAwMDAsCisJMHgyYTcwLCAweDcwMDAsIDB4YTA4ZSwgMHgwMDAzLCAweDExNTgsIDB4MDgwYywgMHgzZjA4LCAweDA4MGMsCisJMHgyZWViLCAweDA4MGMsIDB4NWRkOCwgMHgwODBjLCAweDU0ZjAsIDB4MDgwYywgMHg2OGY5LCAweDBjODAsCisJMHgwMDBiLCAweDBjOTgsIDB4MTBlNCwgMHgxMGU1LCAweDEyMTAsIDB4MTBlMiwgMHgxMmRkLCAweDE0MGUsCisJMHgxNDBmLCAweDE0MTAsIDB4MDgwYywgMHgxNTE1LCAweDAwMDUsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MTFlZCwgMHgwODBjLCAweDE1ODgsCisJMHgwODBjLCAweDVhY2YsIDB4MDE1MCwgMHgwODBjLCAweDVhZjUsIDB4MTVjMCwgMHgyMDc5LCAweDAxMDAsCisJMHg3ODI4LCAweGEwODUsIDB4MTgwMCwgMHg3ODJhLCAweDA0ODgsIDB4MDgwYywgMHg1YTA3LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDEsIDB4MTkwNCwgMHgxMWVkLCAweDcwOGMsIDB4YTA4NiwgMHgwMDI4LCAweDE5MDQsCisJMHgxMWVkLCAweDIwMDEsIDB4MDE2MSwgMHgyMDAzLCAweDAwMDEsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjcsCisJMHhmZmZmLCAweDdhMjgsIDB4YTI5NSwgMHgxZTJmLCAweDdhMmEsIDB4MjAxMSwgMHg1OWEyLCAweDA4MGMsCisJMHg2OTljLCAweDIwMTEsIDB4NTk5NSwgMHgwODBjLCAweDZhNWMsIDB4MjAxMSwgMHg1OWU0LCAweDA4MGMsCisJMHg2OTljLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4MjAxMSwgMHg4MDMwLCAweDIwMTksCisJMHgwMDAwLCAweDcwOGIsIDB4MDAwMCwgMHgwODBjLCAweDFkZTksIDB4MDBlOCwgMHgwODBjLCAweDQ0OGYsCisJMHgyMDc5LCAweDAxMDAsIDB4Nzg0NCwgMHhhMDA1LCAweDE5MDQsIDB4MTFlZCwgMHgyMDExLCAweDRhZGMsCisJMHgwODBjLCAweDY5OWMsIDB4MjAxMSwgMHg1OWU0LCAweDA4MGMsIDB4Njk5YywgMHgwODBjLCAweDFkZTksCisJMHgyMDAxLCAweGI3OGQsIDB4MjAwNCwgMHg3ODBlLCAweDc4NDAsIDB4YTA4NCwgMHhmZmZiLCAweDc4NDIsCisJMHgyMDExLCAweDgwMTAsIDB4NzNjYywgMHgwODBjLCAweDNlY2MsIDB4NzIzYywgMHhjMjg0LCAweDcyM2UsCisJMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhjMWFjLCAweDIxMDIsIDB4MDgwYywgMHg3ZjM1LCAweDIwMTEsCisJMHgwMDA0LCAweDA4MGMsIDB4OWM2MCwgMHgwODBjLCAweDUyNGQsIDB4MDgwYywgMHg1YWNmLCAweDAxNTgsCisJMHgwODBjLCAweDRiZTgsIDB4MDE0MCwgMHg3MDhiLCAweDAwMDEsIDB4NzBjNywgMHgwMDAwLCAweDA4MGMsCisJMHg0NjJjLCAweDA4MDQsIDB4MTFlZCwgMHgwODBjLCAweDUzMDksIDB4MDEyMCwgMHg3YTBjLCAweGMyYjQsCisJMHg3YTBlLCAweDAwNjAsIDB4NzA3MywgMHgwMDAwLCAweDA4MGMsIDB4YTAwOCwgMHg3MGQ0LCAweGQwOWMsCisJMHgxMTI4LCAweDcwYTAsIDB4YTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NGJjNiwgMHg3MGRmLCAweDAwMDAsCisJMHg3MGRiLCAweDAwMDAsIDB4NzJkNCwgMHgwODBjLCAweDVhY2YsIDB4MTE3OCwgMHgyMDExLCAweDAwMDAsCisJMHgwMDE2LCAweDA4MGMsIDB4MjhlYiwgMHgyMDE5LCAweGI3OGYsIDB4MjExYSwgMHgwMDFlLCAweDcwNTMsCisJMHhmZmZmLCAweDcwNTcsIDB4MDBlZiwgMHg3MDc3LCAweDAwMDAsIDB4MjA3OSwgMHhiNTUyLCAweDc4MDQsCisJMHhkMGFjLCAweDAxMDgsIDB4YzI5NSwgMHg3MmQ2LCAweDA4MGMsIDB4NWFjZiwgMHgwMTE4LCAweGEyOTYsCisJMHgwMDA0LCAweDA1NDgsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4OWM2MCwgMHg3MDliLCAweDAwMDAsCisJMHg3MDlmLCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweDAwMDMsCisJMHg3ODI4LCAweGEwODUsIDB4MDAwMywgMHg3ODJhLCAweDAwZmUsIDB4MDgwYywgMHgyYWI4LCAweDIwMTEsCisJMHgwMDA1LCAweDA4MGMsIDB4ODA3NSwgMHgwODBjLCAweDcxNzMsIDB4MDgwYywgMHg1YWNmLCAweDAxNDgsCisJMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHgwMDE2LCAweDA4MGMsIDB4MjhlYiwgMHg2MWUyLCAweDAwMWUsCisJMHgwMGNlLCAweDAxMmUsIDB4MDQyMCwgMHg3MDliLCAweDAwMDAsIDB4NzA5ZiwgMHhmZmZmLCAweDcwMDMsCisJMHgwMDAyLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjcsIDB4MDAwMywgMHg3ODI4LCAweGEwODUsCisJMHgwMDAzLCAweDc4MmEsIDB4MDBmZSwgMHgyMDExLCAweDAwMDUsIDB4MDgwYywgMHg4MDc1LCAweDA4MGMsCisJMHg3MTczLCAweDA4MGMsIDB4NWFjZiwgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDAwMTYsCisJMHgwODBjLCAweDI4ZWIsIDB4NjFlMiwgMHgwMDFlLCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMGM2LCAweDA4MGMsIDB4NWFjZiwgMHgxMTE4LCAweDIwYTksIDB4MDEwMCwgMHgwMDEwLCAweDIwYTksCisJMHgwMDgyLCAweDA4MGMsIDB4NWFjZiwgMHgxMTE4LCAweDIwMDksIDB4MDAwMCwgMHgwMDEwLCAweDIwMDksCisJMHgwMDdlLCAweDA4MGMsIDB4MmQ5NywgMHg4MTA4LCAweDFmMDQsIDB4MTIwMSwgMHgwMGNlLCAweDcwNzMsCisJMHgwMDAwLCAweDcwNzQsIDB4YTA4NCwgMHgwMGZmLCAweDcwNzYsIDB4NzBhMywgMHgwMDAwLCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxOTA0LCAweDEyZGIsCisJMHg3MDljLCAweGEwODYsIDB4ZmZmZiwgMHgwMTMwLCAweDA4MGMsIDB4MmFiOCwgMHgwODBjLCAweDcxNzMsCisJMHgwODA0LCAweDEyZGIsIDB4NzBkNCwgMHhkMGFjLCAweDExMTAsIDB4ZDA5YywgMHgwNTQwLCAweGQwODQsCisJMHgwNTMwLCAweDAwMDYsIDB4MDAxNiwgMHgyMDAxLCAweDAxMDMsIDB4MjAwOSwgMHhiNzhkLCAweDIxMGMsCisJMHgyMTAyLCAweDAwMWUsIDB4MDAwZSwgMHhkMDhjLCAweDAxZDAsIDB4NzBkOCwgMHhhMDg2LCAweGZmZmYsCisJMHgwMTkwLCAweDA4MGMsIDB4MmMxNywgMHgwODBjLCAweDcxNzMsIDB4NzBkNCwgMHhkMDk0LCAweDE5MDQsCisJMHgxMmRiLCAweDIwMTEsIDB4MDAwMSwgMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHgyYzRmLCAweDA4MGMsCisJMHg3MTczLCAweDA4MDQsIDB4MTJkYiwgMHg3MGRjLCAweGEwMDUsIDB4MTkwNCwgMHgxMmRiLCAweDcwOTgsCisJMHhhMDA1LCAweDE5MDQsIDB4MTJkYiwgMHg3MGQ0LCAweGQwYTQsIDB4MDExOCwgMHhkMGI0LCAweDA5MDQsCisJMHgxMmRiLCAweDA4MGMsIDB4NTMwOSwgMHgxOTA0LCAweDEyZGIsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsCisJMHhkMGFjLCAweDAxYzgsIDB4MDE1NiwgMHgwMGM2LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDE2LCAweDA4MGMsIDB4NGZhOSwgMHgxMTE4LCAweDYwMDAsIDB4ZDBlYywgMHgxMTM4LCAweDAwMWUsCisJMHg4MTA4LCAweDFmMDQsIDB4MTI2OCwgMHgwMGNlLCAweDAxNWUsIDB4MDAyOCwgMHgwMDFlLCAweDAwY2UsCisJMHgwMTVlLCAweDA4MDQsIDB4MTJkYiwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHgwMTAzLCAweDIwMDksCisJMHhiNzhkLCAweDIxMGMsIDB4MjEwMiwgMHgwMDFlLCAweDAwMGUsIDB4NzFhOCwgMHg4MWZmLCAweDExYjAsCisJMHhhMDA2LCAweDIwMDksIDB4MDIwMCwgMHgyMGE5LCAweDAwMDIsIDB4MjBhMSwgMHhiN2RlLCAweDQwYTEsCisJMHgyMDA5LCAweDA3MDAsIDB4MjBhOSwgMHgwMDAyLCAweDIwYTEsIDB4YjdjZSwgMHg0MGExLCAweDcwNzAsCisJMHg4MDA3LCAweDcxNzQsIDB4ODEwZiwgMHgyMGE5LCAweDAwMDIsIDB4NDBhMSwgMHgyMGExLCAweGI3ZDIsCisJMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgxNGZiLCAweDIwMDEsIDB4MDAwMCwgMHg4MTBmLCAweDIwYTksCisJMHgwMDAyLCAweDQwYTEsIDB4NzAzMCwgMHhjMDhjLCAweDcwMzIsIDB4NzAwMywgMHgwMDAzLCAweDcwOWYsCisJMHhmZmZmLCAweDA4MGMsIDB4MTU4MSwgMHhhMDA2LCAweDA4MGMsIDB4MjdjMywgMHgwODBjLCAweDNmM2UsCisJMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwODBjLCAweDVhZjUsIDB4MDE1MCwgMHgwODBjLCAweDVhY2YsCisJMHg3ODI4LCAweDAxMTgsIDB4YTA4NCwgMHhlMWZmLCAweDAwMTAsIDB4YTA4NCwgMHhmZmRmLCAweDc4MmEsCisJMHgwMGZlLCAweDIwMDEsIDB4YjdlMSwgMHgyMDA0LCAweGEwODYsIDB4MDAwNSwgMHgxMTIwLCAweDIwMTEsCisJMHgwMDAwLCAweDA4MGMsIDB4ODA3NSwgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsCisJMHg3MTczLCAweDA4MGMsIDB4NzIzMCwgMHgwMTJlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDQ2LCAweDAwZjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwOSwgMHhiNTM0LCAweDIxMDQsCisJMHhhMDA1LCAweDExMTAsIDB4MDgwYywgMHgyOTE3LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDRiYWYsCisJMHg3OTQwLCAweGExOGMsIDB4MDAxMCwgMHg3OTQyLCAweDc5MjQsIDB4ZDFiNCwgMHgwMTEwLCAweDc4MjcsCisJMHgwMDQwLCAweGQxOWMsIDB4MDExMCwgMHg3ODI3LCAweDAwMDgsIDB4MDAwNiwgMHgwMDM2LCAweDAxNTYsCisJMHg3OTU0LCAweGQxYWMsIDB4MTkwNCwgMHgxMzRiLCAweDA4MGMsIDB4NWFlMSwgMHgwMTU4LCAweDA4MGMsCisJMHg1YWY1LCAweDExMjgsIDB4MjAwMSwgMHhiNzllLCAweDIwMDMsIDB4MDAwMCwgMHgwMDcwLCAweDA4MGMsCisJMHg1YWQ3LCAweDBkYzAsIDB4MjAwMSwgMHhiNzllLCAweDIwMDMsIDB4YWFhYSwgMHgyMDAxLCAweGI3OWYsCisJMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg1YTA3LCAweDAwNTgsIDB4MDgwYywgMHg1YWNmLCAweDAxNDAsCisJMHgyMDA5LCAweDAwZjgsIDB4MDgwYywgMHg0YmFmLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsCisJMHgyMGE5LCAweDA5YzQsIDB4NzgyMCwgMHhkMDljLCAweDExMzgsIDB4MDgwYywgMHg1YWNmLCAweDAxMzgsCisJMHg3ODI0LCAweGQwYWMsIDB4MTkwNCwgMHgxM2Y1LCAweDFmMDQsIDB4MTMyYSwgMHgwMDcwLCAweDc4MjQsCisJMHgwODBjLCAweDVhZWIsIDB4MDExOCwgMHhkMGFjLCAweDE5MDQsIDB4MTNmNSwgMHhhMDg0LCAweDE4MDAsCisJMHgwZDk4LCAweDcwMDMsIDB4MDAwMSwgMHgwODA0LCAweDEzZjUsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHgyN2MzLCAweDA4MDQsIDB4MTQwNCwgMHg3ODUwLCAweGEwODQsIDB4MDE4MCwgMHg3ODUyLCAweDc4MmYsCisJMHgwMDIwLCAweDIwYTksIDB4MDA0NiwgMHgxZDA0LCAweDEzNTMsIDB4MDgwYywgMHg2YTQ0LCAweDFmMDQsCisJMHgxMzUzLCAweDc4NTAsIDB4YTA4NCwgMHgwMTgwLCAweGEwODUsIDB4MDQwMCwgMHg3ODUyLCAweDc4MmYsCisJMHgwMDAwLCAweDA4MGMsIDB4NWFlMSwgMHgwMTU4LCAweDA4MGMsIDB4NWFmNSwgMHgxMTI4LCAweDIwMDEsCisJMHhiNzllLCAweDIwMDMsIDB4MDAwMCwgMHgwMDcwLCAweDA4MGMsIDB4NWFkNywgMHgwZGMwLCAweDIwMDEsCisJMHhiNzllLCAweDIwMDMsIDB4YWFhYSwgMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg1YTA3LCAweDAwMjAsIDB4MjAwOSwgMHgwMGY4LCAweDA4MGMsIDB4NGJhZiwgMHgyMGE5LCAweDAwMGUsCisJMHhlMDAwLCAweDFmMDQsIDB4MTM4MCwgMHg3ODUwLCAweGEwODQsIDB4MDE4MCwgMHhhMDg1LCAweDE0MDAsCisJMHg3ODUyLCAweDA4MGMsIDB4NWFjZiwgMHgwMTIwLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsCisJMHgyMDIxLCAweGU2NzgsIDB4MjAxOSwgMHhlYTYwLCAweDc4MjAsIDB4ZDA5YywgMHgxNTU4LCAweDA4MGMsCisJMHg1YWNmLCAweDA1ZDgsIDB4NzgyNCwgMHhkMGFjLCAweDE5MDQsIDB4MTNmNSwgMHgwODBjLCAweDVhZjUsCisJMHgxNTA4LCAweDAwNDYsIDB4MjAyMSwgMHgwMTkwLCAweDg0MjEsIDB4MWRmMCwgMHgwMDRlLCAweDg0MjEsCisJMHgxMWM4LCAweDc4MjcsIDB4MDA0OCwgMHgyMGE5LCAweDAxZjQsIDB4MWQwNCwgMHgxM2FkLCAweDA4MGMsCisJMHg2YTQ0LCAweDFmMDQsIDB4MTNhZCwgMHg3ODI0LCAweGEwODQsIDB4MDA2OCwgMHgxNWM4LCAweDIwMDEsCisJMHhiNzllLCAweDIwMDMsIDB4YWFhYSwgMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDcwMDMsCisJMHgwMDAxLCAweDA0OTgsIDB4MWQwNCwgMHgxM2M2LCAweDA4MGMsIDB4NmE0NCwgMHg4MzE5LCAweDE5NjAsCisJMHgyMDA5LCAweGI1MzQsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4YTA4NCwgMHhmZmYwLCAweDAxMjAsCisJMHgyMDBiLCAweDAwMDAsIDB4MDgwYywgMHgyOTE3LCAweDAwZDgsIDB4MDgwYywgMHg1YWUxLCAweDExNDAsCisJMHhhNGEyLCAweDAwNjQsIDB4MTEyOCwgMHgwODBjLCAweDVhYTYsIDB4NzAwMywgMHgwMDAxLCAweDAwYTgsCisJMHg3ODI3LCAweDE4MDAsIDB4ZTAwMCwgMHhlMDAwLCAweDc4MjQsIDB4MDgwYywgMHg1YWViLCAweDAxMTAsCisJMHhkMGFjLCAweDExNTgsIDB4YTA4NCwgMHgxODAwLCAweDA5YTgsIDB4NzAwMywgMHgwMDAxLCAweDAwMjgsCisJMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyN2MzLCAweDAwNDgsIDB4MjAwMSwgMHhiNTM0LCAweDIwMDMsCisJMHgwMDAwLCAweDc4MjcsIDB4MDA0OCwgMHg3ODI4LCAweGMwOWQsIDB4NzgyYSwgMHg3ODUwLCAweGEwODQsCisJMHgwMTgwLCAweGEwODUsIDB4MDQwMCwgMHg3ODUyLCAweDAxNWUsIDB4MDAzZSwgMHgwMDBlLCAweDA4MGMsCisJMHgxNTU4LCAweDAxMmUsIDB4MDBmZSwgMHgwMDRlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsCisJMHgwMDA1LCAweDJhNzAsIDB4MjA2MSwgMHhiN2MxLCAweDIwNjMsIDB4MDAwMiwgMHg2MDA3LCAweDAwMDIsCisJMHg2MDBiLCAweDAwMDYsIDB4NjAwZiwgMHgwMDE3LCAweDIwMDEsIDB4Yjc5ZSwgMHgyMDAzLCAweDAwMDAsCisJMHg3MDhiLCAweDAwMDAsIDB4MjAwOSwgMHgwMTAwLCAweDIxMDQsIDB4YTA4MiwgMHgwMDAyLCAweDAyMTgsCisJMHg3MDUzLCAweGZmZmYsIDB4MDAxMCwgMHg3MDUzLCAweDAwMDAsIDB4NzA1YiwgMHhmZmZmLCAweDcwNzMsCisJMHgwMDAwLCAweDcwNzcsIDB4MDAwMCwgMHgwODBjLCAweGEwMDgsIDB4MjA2MSwgMHhiNzhlLCAweDYwMDMsCisJMHgwOTA5LCAweDYwMDcsIDB4MDAwMCwgMHg2MDBiLCAweDg4MDAsIDB4NjAwZiwgMHgwMjAwLCAweDYwMTMsCisJMHgwMGZmLCAweDYwMTcsIDB4MDAwZiwgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwN2QwLCAweDIwNjEsCisJMHhiNzk2LCAweDYwMDMsIDB4ODAwMCwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLCAweDYwMGYsCisJMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MDE3LCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLCAweDYwMWYsCisJMHgwMDAwLCAweDIwNjEsIDB4YjdiOSwgMHg2MDAzLCAweDUxNGMsIDB4NjAwNywgMHg0ZjQ3LCAweDYwMGIsCisJMHg0OTQzLCAweDYwMGYsIDB4MjAyMCwgMHgyMDAxLCAweGI1MjgsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsCisJMHgwNGEwLCAweDIwMTEsIDB4MDAwMCwgMHg4MWZmLCAweDA1NzAsIDB4YTE4NiwgMHgwMDAxLCAweDExNDgsCisJMHgyMDMxLCAweDhmZmYsIDB4MjAzOSwgMHhkNTAxLCAweDIwMjEsIDB4MDEwMCwgMHgyMDI5LCAweGQ1MDAsCisJMHgwMGU4LCAweGExODYsIDB4MDAwMiwgMHgxMTE4LCAweDIwMTEsIDB4MDAwMCwgMHgwMGI4LCAweGExODYsCisJMHgwMDA1LCAweDExMTgsIDB4MjAxMSwgMHgwMDAxLCAweDAwODgsIDB4YTE4NiwgMHgwMDA5LCAweDExMTgsCisJMHgyMDExLCAweDAwMDIsIDB4MDA1OCwgMHhhMTg2LCAweDAwMGEsIDB4MTExOCwgMHgyMDExLCAweDAwMDIsCisJMHgwMDI4LCAweGExODYsIDB4MDA1NSwgMHgxMTEwLCAweDIwMTEsIDB4MDAwMywgMHgzODAwLCAweGEwODQsCisJMHhmZmZjLCAweGEyMDUsIDB4MjBjMCwgMHgwODA0LCAweDEwNGQsIDB4YTAwZSwgMHgyMDExLCAweDAwMDMsCisJMHgyMDE5LCAweDE0YTQsIDB4MDgwNCwgMHgxNGY1LCAweDIwMTksIDB4YWFhYSwgMHgyMDYxLCAweGZmZmYsCisJMHgyYzE0LCAweDIzNjIsIDB4ZTAwMCwgMHhlMDAwLCAweDJjMDQsIDB4YTMwNiwgMHgyMjYyLCAweDExMTAsCisJMHhjMWI1LCAweGMxYTUsIDB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4MTRiNywgMHgwNGYwLCAweDIwMTksCisJMHhhYWFhLCAweDIwNjEsIDB4ZmZmZiwgMHgyYzE0LCAweDIzNjIsIDB4ZTAwMCwgMHhlMDAwLCAweDJjMWMsCisJMHgyMDYxLCAweDdmZmYsIDB4ZTAwMCwgMHhlMDAwLCAweDJjMDQsIDB4MjA2MSwgMHhmZmZmLCAweDIyNjIsCisJMHhhMzA2LCAweDAxMTAsIDB4YzE4ZCwgMHgwMDA4LCAweGMxODUsIDB4MjAxMSwgMHgwMDAyLCAweDIwMTksCisJMHgxNGQyLCAweDA0MTgsIDB4MjA2MSwgMHhmZmZmLCAweDIwMTksIDB4YWFhYSwgMHgyYzE0LCAweDIzNjIsCisJMHhlMDAwLCAweGUwMDAsIDB4MmMwNCwgMHgyMjYyLCAweGEzMDYsIDB4MTE4MCwgMHgyYzE0LCAweDIzNjIsCisJMHhlMDAwLCAweGUwMDAsIDB4MmMxYywgMHgyMDYxLCAweDdmZmYsIDB4MmMwNCwgMHgyMDYxLCAweGZmZmYsCisJMHgyMjYyLCAweGEzMDYsIDB4MTExMCwgMHhjMTk1LCAweDAwMDgsIDB4YzE5ZCwgMHgyMDExLCAweDAwMDEsCisJMHgyMDE5LCAweDE0ZjMsIDB4MDAxMCwgMHgwODA0LCAweDE0NjksIDB4MzgwMCwgMHhhMDg0LCAweGZmZmMsCisJMHhhMjA1LCAweDIwYzAsIDB4MDgzNywgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg0ZmE5LCAweDExNzgsCisJMHg2MDA0LCAweGEwYzQsIDB4MDBmZiwgMHhhOGM2LCAweDAwMDYsIDB4MDEyOCwgMHhhMGM0LCAweGZmMDAsCisJMHhhOGM2LCAweDA2MDAsIDB4MTEyMCwgMHhhMTg2LCAweDAwODAsIDB4MDEwOCwgMHg4MjEwLCAweDgxMDgsCisJMHhhMTg2LCAweDAxMDAsIDB4MWQ1MCwgMHgyMjA4LCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsCisJMHgxNTE3LCAweDAwMDYsIDB4MDAxNiwgMHgyMDc5LCAweDAwMDAsIDB4NzgxOCwgMHhkMDg0LCAweDFkZTgsCisJMHgwMDFlLCAweDc5MmUsIDB4MDAwZSwgMHg3ODJhLCAweDAwMGUsIDB4NzgyNiwgMHgzOTAwLCAweDc4M2EsCisJMHg3ODIzLCAweDgwMDIsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgwMTI2LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTksIDB4MDAxMCwgMHgyMGExLCAweGI5MGMsIDB4MjA5MSwgMHgyMDAwLCAweDQwYTEsCisJMHgyMGE5LCAweDAwMTAsIDB4MjA5MSwgMHgyMjAwLCAweDQwYTEsIDB4MjBhOSwgMHgwMDEwLCAweDIwOTEsCisJMHgyNDAwLCAweDQwYTEsIDB4MjBhOSwgMHgwMDEwLCAweDIwOTEsIDB4MjYwMCwgMHg0MGExLCAweDIwYTksCisJMHgwMDEwLCAweDIwOTEsIDB4MjgwMCwgMHg0MGExLCAweDAxNGUsIDB4MDE1ZSwgMHgwMTJlLCAweDIwNzksCisJMHhiNTAwLCAweDc4MDMsIDB4MDAwNSwgMHgyMDkxLCAweDQwODAsIDB4MDRjOSwgMHgwY2Y4LCAweDAwMDUsCisJMHgwMDA2LCAweDA4MGMsIDB4MTVhMywgMHgxNTE4LCAweDAwZjYsIDB4MjA3OSwgMHhiNTI0LCAweDJmMDQsCisJMHg4MDAwLCAweDIwN2EsIDB4YTA4MiwgMHgwMDBmLCAweDAyNTgsIDB4YTAwNiwgMHgyMDdhLCAweDIwNzksCisJMHhiNTI2LCAweDJmMDQsIDB4YTA4NCwgMHgwMDAxLCAweGEwODYsIDB4MDAwMSwgMHgyMDdhLCAweDAwNzAsCisJMHgyMDc5LCAweGI1MjYsIDB4MmY3YywgMHg4ZmZmLCAweDExMjgsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsCisJMHgwMDQwLCAweDAwMjAsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDBjMCwgMHgwMGZlLCAweDAwMGUsCisJMHgwMDA1LCAweDA0MDksIDB4MTEyMCwgMHgyMDAxLCAweDBjMDMsIDB4MjAwMywgMHgwMDgwLCAweDAwMDUsCisJMHgwMGQxLCAweDExMjAsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDA0MCwgMHgwMDA1LCAweDAwMDYsCisJMHgwMDkxLCAweDExNzgsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDA0MCwgMHgyMDA5LCAweDBmZmYsCisJMHgwMGExLCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLCAweDAwODAsIDB4MjAwOSwgMHgwZmZmLCAweDAwNjksCisJMHgwYzg4LCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4MGMwMCwgMHgyYzA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDBhYSwgMHgwMGNlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTI2LCAweGExOGMsCisJMHgwZmZmLCAweDIxYTgsIDB4MWQwNCwgMHgxNWIyLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDE1YjIsCisJMHgwMTJlLCAweDAxNWUsIDB4MDAwNSwgMHgyMDcxLCAweGI1MDAsIDB4NzE2MCwgMHg3MTJlLCAweDIwMjEsCisJMHgwMDAxLCAweGExOTAsIDB4MDAzMCwgMHhhMjk4LCAweDAwMzAsIDB4MDI0MCwgMHg3MDY0LCAweGEzMDIsCisJMHgxMjI4LCAweDIyMGEsIDB4MjIwOCwgMHgyMzEwLCAweDg0MjAsIDB4MGNhOCwgMHgzODAwLCAweGQwOGMsCisJMHgwMTQ4LCAweDcwNjQsIDB4YTA4NiwgMHhiNTAwLCAweDAxMjgsIDB4NzA2NywgMHhiNTAwLCAweDIwMTEsCisJMHgxMDAwLCAweDBjNDgsIDB4MjAwYiwgMHgwMDAwLCAweDc0YjIsIDB4NzRiNiwgMHgwMDA1LCAweDAwZTYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGI1MDAsIDB4NzBiNCwgMHhhMGVhLCAweDAwMTAsCisJMHgwMjY4LCAweDgwMDEsIDB4NzBiNiwgMHg3MDJjLCAweDIwNjgsIDB4MmQwNCwgMHg3MDJlLCAweDIwNmIsCisJMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHhhMDZlLCAweDBjZDgsCisJMHgwMGU2LCAweDIwNzEsIDB4YjUwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGI0LCAweDgwMDEsCisJMHgwMjYwLCAweDcwYjYsIDB4NzAyYywgMHgyMDY4LCAweDJkMDQsIDB4NzAyZSwgMHgyMDZiLCAweDAwMDAsCisJMHg2ODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4YTA2ZSwgMHgwY2Q4LCAweDAwZTYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGI1MDAsIDB4NzAyYywgMHgyMDZhLCAweDJkMDAsCisJMHg3MDJlLCAweDcwYjQsIDB4ODAwMCwgMHg3MGI2LCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDhkZmYsCisJMHgwMTM4LCAweDY4MDQsIDB4NjgwNywgMHgwMDAwLCAweDAwMDYsIDB4MGM0OSwgMHgwMGRlLCAweDBjYjgsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNTAwLCAweDcwYjQsIDB4YTA4YSwgMHgwMDEwLCAweGEwMGQsCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI4MTIsIDB4NzAwNywgMHgwMDAwLCAweDcwMWIsCisJMHgwMDAwLCAweDcwMWYsIDB4MDAwMCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxMCwgMHhhMDg1LCAweDgwMDQsCisJMHg3MDEyLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGU2LCAweDIyNzAsCisJMHg3MDBiLCAweDAwMDAsIDB4MjA3MSwgMHhiODEyLCAweDcwMTgsIDB4YTA4OCwgMHhiODFiLCAweDIyMGEsCisJMHg4MDAwLCAweGEwODQsIDB4MDAwNywgMHg3MDFhLCAweDcwMDQsIDB4YTAwNSwgMHgxMTI4LCAweDAwZjYsCisJMHgyMDc5LCAweDAwMTAsIDB4MDA4OSwgMHgwMGZlLCAweDAwZWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweGI4MTIsIDB4NzAwNCwgMHhhMDA1LCAweDExMjgsIDB4MDBmNiwgMHgyMDc5LCAweDAwMTAsCisJMHgwMDE5LCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwMDAsIDB4MDAwMiwgMHgxNjcyLCAweDE2ZDYsCisJMHgxNmYzLCAweDE2ZjMsIDB4NzAxOCwgMHg3MTFjLCAweGExMDYsIDB4MTExOCwgMHg3MDA3LCAweDAwMDAsCisJMHgwMDA1LCAweDAwZDYsIDB4YTE4MCwgMHhiODFiLCAweDIwMDQsIDB4NzAwYSwgMHgyMDY4LCAweDgxMDgsCisJMHhhMThjLCAweDAwMDcsIDB4NzExZSwgMHg3ODAzLCAweDAwMjYsIDB4NjgyNCwgMHg3ODMyLCAweDY4MjgsCisJMHg3ODM2LCAweDY4MmMsIDB4NzgzYSwgMHg2ODMwLCAweDc4M2UsIDB4NjgxMCwgMHg3MDBlLCAweDY4MGMsCisJMHg3MDE2LCAweDY4MDQsIDB4MDBkZSwgMHhkMDg0LCAweDAxMjAsIDB4NzAwNywgMHgwMDAxLCAweDAwMjksCisJMHgwMDA1LCAweDcwMDcsIDB4MDAwMiwgMHgwMGIxLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDcxMGMsCisJMHgyMDExLCAweDAwNDAsIDB4YTE4MiwgMHgwMDQwLCAweDEyMTAsIDB4MjExMCwgMHhhMDA2LCAweDcwMGUsCisJMHg3MjEyLCAweDgyMDMsIDB4NzgyMiwgMHg3ODAzLCAweDAwMjAsIDB4NzgwMywgMHgwMDQxLCAweDAwMmUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDcwMTQsCisJMHgyMDk4LCAweDIwYTEsIDB4MDAxNCwgMHg3ODAzLCAweDAwMjYsIDB4NzEwYywgMHgyMDExLCAweDAwNDAsCisJMHhhMTgyLCAweDAwNDAsIDB4MTIxMCwgMHgyMTEwLCAweGEwMDYsIDB4NzAwZSwgMHgyMmE4LCAweDUzYTYsCisJMHg4MjAzLCAweDc4MjIsIDB4NzgwMywgMHgwMDIwLCAweDMzMDAsIDB4NzAxNiwgMHg3ODAzLCAweDAwMDEsCisJMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMTM2LCAweDAxNDYsCisJMHgwMTU2LCAweDIwOTksIDB4YjVmYSwgMHgyMGExLCAweDAwMTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTMsCisJMHg3ODAzLCAweDAwMjAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzgwMywgMHgwMDQxLCAweDcwMDcsCisJMHgwMDAzLCAweDcwMDAsIDB4YzA4NCwgMHg3MDAyLCAweDcwMGIsIDB4YjVmNSwgMHgwMTJlLCAweDAxNWUsCisJMHgwMTRlLCAweDAxM2UsIDB4MDAwNSwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgyMDAxLCAweGI2MjksCisJMHgyMDljLCAweDIwYTEsIDB4MDAxNCwgMHg3ODAzLCAweDAwMjYsIDB4MjAwMSwgMHhiNjJhLCAweDIwYWMsCisJMHg1M2E2LCAweDIwOTksIDB4YjYyYiwgMHgyMGExLCAweDAwMTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTMsCisJMHg3ODAzLCAweDAwMjAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzgwMywgMHgwMDAxLCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDAsIDB4YzA4YywgMHg3MDAyLCAweDcwMGIsIDB4YjYyNiwgMHgwMTJlLCAweDAxNWUsCisJMHgwMTRlLCAweDAxM2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwgMHhiODEyLCAweDAwZjYsCisJMHgyMDc5LCAweDAwMTAsIDB4NzkwNCwgMHg3ODAzLCAweDAwMDIsIDB4ZDFmYywgMHgwMTIwLCAweGExOGMsCisJMHgwNzAwLCAweDcwMDQsIDB4MDAyMywgMHgwMGZlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDE2NmMsCisJMHgxNzM2LCAweDE3NjQsIDB4MTc4ZSwgMHgxN2JlLCAweDE3MzUsIDB4MGNmOCwgMHhhMThjLCAweDA3MDAsCisJMHgxNTI4LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDcwMTQsIDB4MjBhMCwgMHgyMDk5LCAweDAwMTQsCisJMHg3ODAzLCAweDAwNDAsIDB4NzAxMCwgMHgyMGE4LCAweDUzYTUsIDB4MzQwMCwgMHg3MDE2LCAweDAxNWUsCisJMHgwMTRlLCAweDAxM2UsIDB4NzAwYywgMHhhMDA1LCAweDA1NzAsIDB4NzgzMCwgMHg3ODMyLCAweDc4MzQsCisJMHg3ODM2LCAweDA4MGMsIDB4MTY5ZCwgMHgwMDA1LCAweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsCisJMHgwMTAwLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDE2NmMsIDB4MDAwNSwgMHg3MDA4LCAweGEwODAsCisJMHgwMDAyLCAweDIwMDMsIDB4MDIwMCwgMHgwY2E4LCAweGExOGMsIDB4MDcwMCwgMHgxMTUwLCAweDcwMGMsCisJMHhhMDA1LCAweDAxODgsIDB4NzgzMCwgMHg3ODMyLCAweDc4MzQsIDB4NzgzNiwgMHgwODBjLCAweDE2YjIsCisJMHgwMDA1LCAweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsIDB4MDIwMCwgMHg3MDA3LCAweDAwMDAsCisJMHgwODBjLCAweDE2NmMsIDB4MDAwNSwgMHgwMGQ2LCAweDcwMDgsIDB4MjA2OCwgMHg3ODMwLCAweDY4MjYsCisJMHg3ODM0LCAweDY4MmEsIDB4NzgzOCwgMHg2ODJlLCAweDc4M2MsIDB4NjgzMiwgMHg2ODBiLCAweDAxMDAsCisJMHgwMGRlLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDE2NmMsIDB4MDAwNSwgMHhhMThjLCAweDA3MDAsCisJMHgxNTQwLCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDIwMDEsIDB4YjVmOCwgMHgyMDA0LCAweGEwODAsCisJMHgwMDBkLCAweDIwYTAsIDB4MjA5OSwgMHgwMDE0LCAweDc4MDMsIDB4MDA0MCwgMHgyMGE5LCAweDAwMjAsCisJMHg1M2E1LCAweDIwMDEsIDB4YjVmYSwgMHgyMDA0LCAweGQwYmMsIDB4MDE0OCwgMHgyMDAxLCAweGI2MDMsCisJMHgyMDA0LCAweGEwODAsIDB4MDAwZCwgMHgyMGEwLCAweDIwYTksIDB4MDAyMCwgMHg1M2E1LCAweDAxNWUsCisJMHgwMTRlLCAweDAxM2UsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4NWU2ZiwgMHgwODBjLCAweDE2NmMsCisJMHgwMDA1LCAweDIwMTEsIDB4ODAwMywgMHgwODBjLCAweDNlY2MsIDB4MGNmOCwgMHhhMThjLCAweDA3MDAsCisJMHgxMTQ4LCAweDIwMDEsIDB4YjYyOCwgMHgyMDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsCisJMHgxNjZjLCAweDAwMDUsIDB4MjAxMSwgMHg4MDA0LCAweDA4MGMsIDB4M2VjYywgMHgwY2Y4LCAweDAxMjYsCisJMHgyMDkxLCAweDIyMDAsIDB4MjA3OSwgMHgwMDMwLCAweDIwNzEsIDB4YjgyMywgMHg3MDAzLCAweDAwMDAsCisJMHg3MDBmLCAweGI4MmYsIDB4NzAxMywgMHhiODJmLCAweDc4MGYsIDB4MDBmNiwgMHg3ODAzLCAweDAwMDQsCisJMHgwMTJlLCAweDAwMDUsIDB4NjkzNCwgMHhhMTg0LCAweDAwMDcsIDB4MDAwMiwgMHgxN2VlLCAweDE4MmMsCisJMHgxN2VlLCAweDE3ZWUsIDB4MTdlZSwgMHgxODE0LCAweDE3ZmIsIDB4MTdmMiwgMHhhMDg1LCAweDAwMDEsCisJMHgwODA0LCAweDE4NDYsIDB4Njg0YywgMHhkMGJjLCAweDBkYzgsIDB4Njg2MCwgMHg2ODJlLCAweDY4NWMsCisJMHg2ODJhLCAweDY4NTgsIDB4MDRjOCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDFlLCAweDFkNzAsCisJMHg2ODRjLCAweGQwYmMsIDB4MGQ1OCwgMHg2ODYwLCAweDY4MmUsIDB4Njg1YywgMHg2ODJhLCAweDY4MDQsCisJMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIyZTUsCisJMHgyMDA1LCAweDY4MzIsIDB4Njg1OCwgMHgwNDQwLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTUsCisJMHgxOWE4LCAweDY4NGMsIDB4ZDBhYywgMHgwOTkwLCAweDY4MDQsIDB4NjgxYSwgMHhhMDgwLCAweDAwMGQsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIyZTUsIDB4MjAwNSwgMHg2ODMyLCAweGEwMDYsCisJMHg2ODJlLCAweDY4MmEsIDB4Njg1OCwgMHgwMDgwLCAweDY4NGMsIDB4ZDBhYywgMHgwOTA0LCAweDE3ZWUsCisJMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHg2ODU4LCAweGExOGMsIDB4MDAwZiwgMHhhMTg4LCAweDIyZTUsCisJMHgyMTBkLCAweDY5MzIsIDB4MmQwOCwgMHg2OTFhLCAweDY4MjYsIDB4Njg0YywgMHhjMGRkLCAweDY4NGUsCisJMHhhMDA2LCAweDY4MGEsIDB4Njk3YywgMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwgMHgwMDA1LCAweDY4NGMsCisJMHhkMGFjLCAweDA5MGMsIDB4MTUxNSwgMHg2ODMzLCAweDIyZTIsIDB4MmQwOCwgMHg2OTFhLCAweDY4NTgsCisJMHg4MDAxLCAweDY4MjYsIDB4Njg0YywgMHhjMGRkLCAweDY4NGUsIDB4YTAwNiwgMHg2ODBhLCAweDY4MmUsCisJMHg2ODJhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLCAweDY5MTYsIDB4MDAwNSwgMHgyMGUxLCAweDAwMDcsCisJMHgyMGUxLCAweDIwMDAsIDB4MjAwMSwgMHgwMjBhLCAweDIwMDQsIDB4ODJmZiwgMHgwMWU4LCAweGEyODAsCisJMHgwMDA0LCAweDAwZDYsIDB4MjA2YywgMHg2ODRjLCAweGQwZGMsIDB4MTE5MCwgMHhhMjgwLCAweDAwMDcsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwYSwgMHgxMTEwLCAweDA4OTEsIDB4MDAxMCwgMHgwODBjLCAweDE3ZTIsCisJMHgwMTM4LCAweDAwZGUsIDB4YTI4MCwgMHgwMDAwLCAweDIwMDMsIDB4MDAwMiwgMHhhMDE2LCAweDAwMjAsCisJMHg2ODA4LCAweDgwMDAsIDB4NjgwYSwgMHgwMGRlLCAweDAxMjYsIDB4MDA0NiwgMHgwMDM2LCAweDAwMjYsCisJMHgyMDkxLCAweDIyMDAsIDB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4NzAwMCwgMHhhMDA1LCAweDAxZDAsCisJMHg3MTBjLCAweDIyMGEsIDB4ODEwOCwgMHgyMzBhLCAweDgxMDgsIDB4MjQwYSwgMHg4MTA4LCAweGExODIsCisJMHhiODRhLCAweDAyMTAsIDB4MjAwOSwgMHhiODJmLCAweDcxMGUsIDB4NzAxMCwgMHhhMTAyLCAweGEwODIsCisJMHgwMDA5LCAweDAxMTgsIDB4YTA4MCwgMHgwMDFiLCAweDExMTgsIDB4MjAwOSwgMHgwMTM4LCAweDIwMGEsCisJMHgwMTJlLCAweDAwMDUsIDB4NzIwNiwgMHgyMDAxLCAweDE4YTgsIDB4MDAwNiwgMHgyMjYwLCAweDA4MDQsCisJMHgxOWQ1LCAweDAxMjYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDAwNiwgMHgyMDkxLCAweDIyMDAsCisJMHgwMDBlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwZDYsIDB4MDBjNiwgMHgyNDYwLCAweDYxMTAsCisJMHgyMTY4LCAweDZhNjIsIDB4NmI1ZSwgMHhhMDA1LCAweDA5MDQsIDB4MTkwYSwgMHg2ODA4LCAweGEwMDUsCisJMHgwOTA0LCAweDE5NDEsIDB4NzAwMCwgMHhhMDA1LCAweDExMDgsIDB4MDQ4OCwgMHg3MDBjLCAweDcxMTAsCisJMHhhMTA2LCAweDE5MDQsIDB4MTk0OSwgMHg3MDA0LCAweGE0MDYsIDB4MTU0OCwgMHgyMDAxLCAweDAwMDUsCisJMHgyMDA0LCAweGQwOGMsIDB4MDE2OCwgMHgwMDQ2LCAweDA4MGMsIDB4MWIwNiwgMHgwMDRlLCAweDI0NjAsCisJMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMDA0LCAweGEwMDUsIDB4MDkwNCwgMHgxOTQxLCAweDBjMTAsCisJMHgyMDAxLCAweDAyMDcsIDB4MjAwNCwgMHhkMDljLCAweDFkNDgsIDB4NzgwNCwgMHhhMDg0LCAweDYwMDAsCisJMHgwMTIwLCAweGEwODYsIDB4NjAwMCwgMHgwMTA4LCAweDBjMDgsIDB4NzgxOCwgMHg2ODEyLCAweDc4MWMsCisJMHg2ODE2LCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDYxMDAsCisJMHhhMThlLCAweDAwMDQsIDB4MTkwNCwgMHgxOTQ5LCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweDg2NGMsCisJMHgwODA0LCAweDE5NDksIDB4NjgwOCwgMHhhMDA1LCAweDA1YTAsIDB4NzAwMCwgMHhhMDA1LCAweDA1ODgsCisJMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgxMTE4LCAweDcwMDQsIDB4YTQwNiwgMHgxNTUwLCAweDIwMDEsCisJMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywgMHgwMTYwLCAweDAwNDYsIDB4MDgwYywgMHgxYjA2LCAweDAwNGUsCisJMHgyNDYwLCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDQsIDB4YTAwNSwgMHgwMWQwLCAweDBjMjgsCisJMHgyMDAxLCAweDAyMDcsIDB4MjAwNCwgMHhkMDljLCAweDFkNTAsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsCisJMHhkMDhjLCAweDFkNTAsIDB4NzgwNCwgMHhhMDg0LCAweDYwMDAsIDB4MDExOCwgMHhhMDg2LCAweDYwMDAsCisJMHgxOWYwLCAweDc4MTgsIDB4NjgxMiwgMHg3ODFjLCAweDY4MTYsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDYxMDAsIDB4YTE4ZSwgMHgwMDA0LCAweDExMjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsCisJMHg4NjRjLCAweDAwY2UsIDB4MDBkZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwMjYsCisJMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgyMDcxLCAweGI4MjMsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwOTA0LCAweDE5YjMsIDB4NzAwNCwgMHhhYzA2LCAweDE5MDQsIDB4MTlhNSwgMHgyMDc5LCAweDAwMzAsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwOTA0LCAweDE5YTUsIDB4NzgwNCwgMHhkMGZjLCAweDE1YzgsCisJMHgyMGUxLCAweDYwMDAsIDB4MjAxMSwgMHgwMDMyLCAweDIwMDEsIDB4MDIwOCwgMHgyMDBjLCAweDIwMDEsCisJMHgwMjA5LCAweDIwMDQsIDB4YTEwNiwgMHgxZDg4LCAweDgyMTEsIDB4MWRiMCwgMHg3ODA0LCAweGQwZmMsCisJMHgxNTQwLCAweDA4MGMsIDB4MWU2ZSwgMHgwMDI2LCAweDAwNTYsIDB4NzgwMywgMHgwMDA0LCAweDc4MDQsCisJMHhkMGFjLCAweDFkZTgsIDB4NzgwMywgMHgwMDAyLCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDMsCisJMHg3MDA3LCAweDAwMDAsIDB4MDA1ZSwgMHgwMDJlLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsCisJMHgwODBjLCAweDVhY2YsIDB4MTEzOCwgMHgwMDY2LCAweDIwMzEsIDB4MDAwMSwgMHgwODBjLCAweDViNTEsCisJMHgwMDZlLCAweDAwNTgsIDB4MjAwMSwgMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsCisJMHgwMDIwLCAweDA4MGMsIDB4MWIwNiwgMHgwODA0LCAweDE5NTUsIDB4MDE1NiwgMHgyMGE5LCAweDAwMDksCisJMHgyMDA5LCAweGI4MmYsIDB4MjEwNCwgMHhhYzA2LCAweDExMDgsIDB4MjAwYSwgMHhhMTg4LCAweDAwMDMsCisJMHgxZjA0LCAweDE5YWEsIDB4MDE1ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDkwNCwgMHgxYTQ5LCAweDIxMDQsCisJMHg3MDA2LCAweDIwNjAsIDB4ODEwOCwgMHgyMTFjLCAweDgxMDgsIDB4MjEyNCwgMHg4MTA4LCAweGExODIsCisJMHhiODRhLCAweDAyMTAsIDB4MjAwOSwgMHhiODJmLCAweDcxMTIsIDB4NzAwYywgMHhhMTA2LCAweDExMjgsCisJMHgwODBjLCAweDI4ZWIsIDB4MjAwMSwgMHgwMTM4LCAweDIxMDIsIDB4OGNmZiwgMHgwNTk4LCAweDYwMTAsCisJMHgyMDY4LCAweDJkNTgsIDB4NjgyOCwgMHhhNDA2LCAweDE1OTAsIDB4NjgyYywgMHhhMzA2LCAweDE1NzgsCisJMHg3MDA0LCAweDIwNjAsIDB4NjAyMCwgMHhjMGQ0LCAweDYwMjIsIDB4Njg0YywgMHhkMGY0LCAweDAxMjgsCisJMHg2ODE3LCAweGZmZmYsIDB4NjgxMywgMHhmZmZmLCAweDAwZTgsIDB4Njg1MCwgMHhkMGY0LCAweDExMzAsCisJMHg3ODAzLCAweDAwMDQsIDB4NjgxMCwgMHg3ODFhLCAweDY4MTQsIDB4NzgxZSwgMHg2ODI0LCAweDIwNTAsCisJMHg2ODE4LCAweDIwNjAsIDB4NjgzMCwgMHgyMDQwLCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweDIwMDksCisJMHgwMDExLCAweDA4MGMsIDB4MWE0YywgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDFhNGMsCisJMHgyZDU4LCAweDAwMDUsIDB4MDgwYywgMHgxZGRkLCAweDA5MDQsIDB4MTliYSwgMHgwY2QwLCAweDYwMjAsCisJMHhkMGY0LCAweDExZTAsIDB4ZDBkNCwgMHgwMWI4LCAweDYwMzgsIDB4YTQwMiwgMHg2MDM0LCAweGEzMDMsCisJMHgwMTA4LCAweDEyODgsIDB4NjQzYSwgMHg2MzM2LCAweDZjMmEsIDB4NmIyZSwgMHgwMDQ2LCAweDAwMzYsCisJMHgyNDAwLCAweDZjN2MsIDB4YTQwMiwgMHg2ODEyLCAweDIzMDAsIDB4NmI4MCwgMHhhMzAzLCAweDY4MTYsCisJMHgwMDNlLCAweDAwNGUsIDB4MDAxOCwgMHgwODBjLCAweDlmOWEsIDB4MDllMCwgMHg2MDFjLCAweGEwOGUsCisJMHgwMDA4LCAweDA5MDQsIDB4MTllMCwgMHhhMDhlLCAweDAwMGEsIDB4MDkwNCwgMHgxOWUwLCAweDIwMDEsCisJMHhiNTc0LCAweDIwMDQsIDB4ZDBiNCwgMHgxMTQwLCAweDYwMTgsIDB4MjAwNCwgMHhkMGJjLCAweDExMjAsCisJMHg2ODE3LCAweDdmZmYsIDB4NjgxMywgMHhmZmZmLCAweDA4MGMsIDB4MjMwNSwgMHgxOTE4LCAweDA4MDQsCisJMHgxOWUwLCAweDcwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDhhZmYsIDB4MDkwNCwgMHgxYWUwLCAweGEwM2UsCisJMHgyNzMwLCAweGM5ZmMsIDB4Njg1MCwgMHhkMGZjLCAweDExYjgsIDB4ZDBmNCwgMHgxNTI4LCAweDAwZDYsCisJMHgyODA1LCAweGFjNjgsIDB4MjkwMCwgMHgwMDAyLCAweDFhOWUsIDB4MWE4MiwgMHgxYTgyLCAweDFhOWUsCisJMHgxYTllLCAweDFhOTYsIDB4MWE5ZSwgMHgxYTgyLCAweDFhOWUsIDB4MWE4NywgMHgxYTg3LCAweDFhOWUsCisJMHgxYTllLCAweDFhOWUsIDB4MWE4ZSwgMHgxYTg3LCAweDc4MDMsIDB4MDAwNCwgMHhjMGZjLCAweDY4NTIsCisJMHg2YjZjLCAweDZhNzAsIDB4NmQxYywgMHg2YzIwLCAweDAwZDYsIDB4ZDk5YywgMHgwNTUwLCAweDI4MDUsCisJMHhhYzY4LCAweDZmMDgsIDB4NmUwYywgMHgwNDMwLCAweGMwZjQsIDB4Njg1MiwgMHg2YjZjLCAweDZhNzAsCisJMHgwMGQ2LCAweDA0NjgsIDB4NmIwOCwgMHg2YTBjLCAweDZkMDAsIDB4NmMwNCwgMHgwMGQwLCAweDZiMTAsCisJMHg2YTE0LCAweDZkMDAsIDB4NmMwNCwgMHg2ZjA4LCAweDZlMGMsIDB4MDBhMCwgMHgwMGRlLCAweDAwZDYsCisJMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MTE0MCwgMHgwMGRlLCAweDA4MGMsCisJMHgyMmE3LCAweDE5MDQsIDB4MWE0YywgMHhhMDBlLCAweDA4MDQsIDB4MWFlMCwgMHgwMGRlLCAweDA4MGMsCisJMHgxNTE1LCAweGM5ZmQsIDB4N2IyMiwgMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLCAweDdlM2UsCisJMHg3MzE2LCAweDcyMWEsIDB4NzUxZSwgMHg3NDIyLCAweDc3MjYsIDB4NzYyYSwgMHg3OTAyLCAweDcxMDAsCisJMHg4MTA4LCAweDcxMDIsIDB4MDBkZSwgMHg2ODI4LCAweGEzMDAsIDB4NjgyYSwgMHg2ODJjLCAweGEyMDEsCisJMHg2ODJlLCAweDgxMDksIDB4MmQwOCwgMHgxNTAwLCAweGQ5ZmMsIDB4MDE2MCwgMHhjOWZjLCAweDA4MGMsCisJMHgyMmE3LCAweDAxZTgsIDB4MjgwNSwgMHhhYzY4LCAweDY4MDAsIDB4YTUwNiwgMHgxMWMwLCAweDY4MDQsCisJMHhhNDA2LCAweDAwYTgsIDB4YzlmYywgMHgwODBjLCAweDIyYTcsIDB4MDE4OCwgMHgyODA1LCAweGFjNjgsCisJMHg2ODAwLCAweGE1MDYsIDB4MTE2MCwgMHg2ODA0LCAweGE0MDYsIDB4MTE0OCwgMHg2ODA4LCAweGE3MDYsCisJMHgxMTMwLCAweDY4MGMsIDB4YTYwNiwgMHgwMDE4LCAweGM5ZmMsIDB4MDgwYywgMHgyMmE3LCAweDIxNjgsCisJMHgwMDA1LCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDFmNTUsIDB4NzAwNCwgMHgyMDYwLCAweDAwZDYsCisJMHg2MDEwLCAweDIwNjgsIDB4NzAwMywgMHgwMDAwLCAweDA4MGMsIDB4MWRmZSwgMHgwODBjLCAweDljNWEsCisJMHgwMTcwLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDY5N2MsIDB4NjkxMiwgMHg2OTgwLCAweDY5MTYsCisJMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwgMHhmZmZmLCAweDY4NTAsIDB4YzBiZCwgMHg2ODUyLCAweDAwZGUsCisJMHgwODBjLCAweDk5MmEsIDB4MDgwNCwgMHgxZDJiLCAweDA4MGMsIDB4MTUxNSwgMHgwMTI2LCAweDIwOTEsCisJMHgyMjAwLCAweDAwMDYsIDB4MDAxNiwgMHgyYjY4LCAweDY4MTgsIDB4MjA2MCwgMHg3OTA0LCAweDc4MDMsCisJMHgwMDAyLCAweGExODQsIDB4MDcwMCwgMHgxOTc4LCAweGExODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDMsCisJMHgwZDU4LCAweDcwMDAsIDB4MDAwMiwgMHgxYjIzLCAweDFiMjksIDB4MWMzYSwgMHgxZDA2LCAweDFkMWEsCisJMHgxYjIzLCAweDFiMjMsIDB4MWIyMywgMHg3ODA0LCAweGQwOWMsIDB4MTkwNCwgMHgxZDJiLCAweDA4MGMsCisJMHgxNTE1LCAweDgwMDEsIDB4NzAwMiwgMHhkMWJjLCAweDExYTAsIDB4ZDE5YywgMHgxOTA0LCAweDFiYmUsCisJMHhkMWRjLCAweDExNzgsIDB4OGFmZiwgMHgwOTA0LCAweDFiYmUsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsCisJMHgxYTRjLCAweDA5MDQsIDB4MWQyYiwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgxYTRjLCAweDA4MDQsCisJMHgxZDJiLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4ZDFiYywgMHgxOTA0LCAweDFiOWUsCisJMHgwMDI2LCAweDAwMzYsIDB4N2MyMCwgMHg3ZDI0LCAweDdlMzAsIDB4N2YzNCwgMHg3ODE4LCAweDY4MTIsCisJMHg3ODFjLCAweDY4MTYsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsIDB4YTAwNSwgMHgwMTQwLCAweDc4MDgsCisJMHhkMGVjLCAweDExMjgsIDB4NzgwMywgMHgwMDA5LCAweDcwMDMsIDB4MDAwNCwgMHgwMDEwLCAweDA4MGMsCisJMHgxZDJmLCAweDZiMjgsIDB4NmEyYywgMHgyNDAwLCAweDY4NmUsIDB4YTMxYSwgMHgyNTAwLCAweDY4NzIsCisJMHhhMjEzLCAweDZiMmEsIDB4NmEyZSwgMHgwMGM2LCAweDcwMDQsIDB4MjA2MCwgMHg2MDIwLCAweGQwZjQsCisJMHgxMTEwLCAweDYzM2EsIDB4NjIzNiwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHg2ZTFlLCAweDZmMjIsCisJMHgyNTAwLCAweGE0MDUsIDB4MDEyOCwgMHgwODBjLCAweDIyYmQsIDB4Njg1MCwgMHhjMGZkLCAweDY4NTIsCisJMHgyYTAwLCAweDY4MjYsIDB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg2ODA4LCAweDgwMDEsCisJMHg2ODBhLCAweDExNDgsIDB4Njg0YywgMHhkMGU0LCAweDAxMzAsIDB4NzAwNCwgMHgyMDYwLCAweDIwMDksCisJMHgwMDQ4LCAweDA4MGMsIDB4ODY0YywgMHg3MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwOTA0LCAweDFkMmIsCisJMHg3MDAzLCAweDAwMDAsIDB4MDgwYywgMHgxOWJhLCAweDA4MDQsIDB4MWQyYiwgMHgwMDU2LCAweDdkMGMsCisJMHhkNWJjLCAweDExMTAsIDB4MDgwYywgMHhiNDA3LCAweDAwNWUsIDB4MDgwYywgMHgxZGZlLCAweDAwZjYsCisJMHg3MDA0LCAweDIwNzgsIDB4MDgwYywgMHg1MzA1LCAweDAxMTgsIDB4NzgyMCwgMHhjMGY1LCAweDc4MjIsCisJMHgwMGZlLCAweDY4MmIsIDB4ZmZmZiwgMHg2ODJmLCAweGZmZmYsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsCisJMHg2OTdjLCAweDc5MWEsIDB4Njk4MCwgMHg3OTFlLCAweDA4MDQsIDB4MWQyYiwgMHg3MDA0LCAweDAwYzYsCisJMHgyMDYwLCAweDYwMjAsIDB4MDBjZSwgMHhkMGY0LCAweDAxMjAsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsCisJMHgwNGMwLCAweDc4MTgsIDB4NjgxMiwgMHg3YTFjLCAweDZhMTYsIDB4ZDE5YywgMHgwMTYwLCAweGEyMDUsCisJMHgwMTUwLCAweDcwMDQsIDB4YTA4MCwgMHgwMDA3LCAweDIwMDQsIDB4YTA4NCwgMHhmZmZkLCAweGEwODYsCisJMHgwMDA4LCAweDE5MDQsIDB4MWI0MSwgMHg2ODRjLCAweGMwZjUsIDB4Njg0ZSwgMHg3ODE0LCAweGEwMDUsCisJMHgxNTIwLCAweDcwMDMsIDB4MDAwMCwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMWEwLCAweDcwMDQsCisJMHgyMDYwLCAweDYwMWMsIDB4YTA4NiwgMHgwMDBhLCAweDExYTAsIDB4MDE1NiwgMHgyMGE5LCAweDAwMDksCisJMHgyMDA5LCAweGI4MmYsIDB4MjEwNCwgMHhhYzA2LCAweDExMDgsIDB4MjAwYSwgMHhhMTg4LCAweDAwMDMsCisJMHgxZjA0LCAweDFiZjIsIDB4MDE1ZSwgMHg3MDA0LCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsCisJMHg4NjRjLCAweDA4MGMsIDB4MTliYSwgMHgwODA0LCAweDFkMmIsIDB4NzgxOCwgMHg2ODEyLCAweDc4MWMsCisJMHg2ODE2LCAweDc4MTQsIDB4NzkwOCwgMHhhMThjLCAweDBmZmYsIDB4YTE5MiwgMHgwODQxLCAweDFhMDQsCisJMHgxYWUzLCAweGExODgsIDB4MDAwNywgMHg4MTE0LCAweDgyMTQsIDB4ODIxNCwgMHhhMTBhLCAweDgxMDQsCisJMHg4MDA0LCAweDgwMDQsIDB4YTIwYSwgMHg4MTBiLCAweDgxMGIsIDB4ODEwYiwgMHgwODBjLCAweDFlOTksCisJMHg3ODAzLCAweDAwMDQsIDB4NzgwZiwgMHhmZmZmLCAweDc4MDMsIDB4MDAwMSwgMHg3ODA0LCAweGQwZmMsCisJMHgwZGU4LCAweDc4MDMsIDB4MDAwMiwgMHg3ODAzLCAweDAwMDQsIDB4NzgwZiwgMHgwMGY2LCAweDcwMDQsCisJMHg3MDA3LCAweDAwMDAsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHg4NjRjLCAweDA4MGMsCisJMHgxZWVmLCAweDA4MzgsIDB4ODAwMSwgMHg3MDAyLCAweGQxOTQsIDB4MDFiMCwgMHg3ODA0LCAweGQwZmMsCisJMHgxOTA0LCAweDFjZDYsIDB4ZDA5YywgMHgwMTM4LCAweDc4MDQsIDB4ZDBmYywgMHgxOTA0LCAweDFjZDYsCisJMHhkMDljLCAweDE5MDQsIDB4MWNkYSwgMHg4YWZmLCAweDA5MDQsIDB4MWQyYiwgMHgyMDA5LCAweDAwMDEsCisJMHgwODBjLCAweDFhNGMsIDB4MDgwNCwgMHgxZDJiLCAweGExODQsIDB4MDg4OCwgMHgxMTQ4LCAweDhhZmYsCisJMHgwOTA0LCAweDFkMmIsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MWE0YywgMHgwODA0LCAweDFkMmIsCisJMHg3ODE4LCAweDY4MTIsIDB4N2ExYywgMHg2YTE2LCAweGEyMDUsIDB4MDkwNCwgMHgxYmRiLCAweDc4MDMsCisJMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHhkMWJjLCAweDE5MDQsIDB4MWNiOCwgMHg2ODM0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAyOSwgMHgxMTE4LCAweGQxOWMsIDB4MTkwNCwgMHgxYmRiLCAweDAwMjYsCisJMHgwMDM2LCAweDdjMjAsIDB4N2QyNCwgMHg3ZTMwLCAweDdmMzQsIDB4NzgxOCwgMHg2ODEyLCAweDc4MWMsCisJMHg2ODE2LCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LCAweGEwMDUsIDB4MDE0MCwgMHg3ODA4LCAweGQwZWMsCisJMHgxMTI4LCAweDc4MDMsIDB4MDAwOSwgMHg3MDAzLCAweDAwMDQsIDB4MDAyMCwgMHgwMDE2LCAweDA4MGMsCisJMHgxZDJmLCAweDAwMWUsIDB4NmIyOCwgMHg2YTJjLCAweDA4MGMsIDB4MjJiZCwgMHgwMGQ2LCAweDI4MDUsCisJMHhhYzY4LCAweDYwMzQsIDB4ZDA5YywgMHgxMTI4LCAweDY4MDgsIDB4YTMxYSwgMHg2ODBjLCAweGEyMTMsCisJMHgwMDIwLCAweDY4MTAsIDB4YTMxYSwgMHg2ODE0LCAweGEyMTMsIDB4MDBkZSwgMHhkMTk0LCAweDA5MDQsCisJMHgxYjYzLCAweDJhMDAsIDB4NjgyNiwgMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLCAweDY4MDgsCisJMHg4MDAxLCAweDY4MGEsIDB4NmIyYSwgMHg2YTJlLCAweDAwM2UsIDB4MDAyZSwgMHgwODA0LCAweDFjMDEsCisJMHgwMDU2LCAweDdkMGMsIDB4MDgwYywgMHhiNDA3LCAweDAwNWUsIDB4MDgwYywgMHgxZGZlLCAweDAwZjYsCisJMHg3MDA0LCAweDIwNzgsIDB4MDgwYywgMHg1MzA1LCAweDAxMTgsIDB4NzgyMCwgMHhjMGY1LCAweDc4MjIsCisJMHgwMGZlLCAweDY4MmIsIDB4ZmZmZiwgMHg2ODJmLCAweGZmZmYsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsCisJMHg2OTdjLCAweDc5MWEsIDB4Njk4MCwgMHg3OTFlLCAweDA4MDQsIDB4MWQyYiwgMHg3ODA0LCAweGQwOWMsCisJMHgwOTA0LCAweDFiMGUsIDB4N2MyMCwgMHg3ODI0LCAweGE0MDUsIDB4MTkwNCwgMHgxYjBlLCAweDc4MTgsCisJMHg2ODEyLCAweDdjMWMsIDB4NmMxNiwgMHhhNDA1LCAweDExMjAsIDB4NzgwMywgMHgwMDAyLCAweDA4MDQsCisJMHgxYmRiLCAweDc1MWMsIDB4NzQyMCwgMHg3NzI0LCAweDc2MjgsIDB4NzAxNCwgMHhhNTI4LCAweDcwMTgsCisJMHhhNDIxLCAweGE3YjksIDB4MDAwMCwgMHhhNmIxLCAweDAwMDAsIDB4NzgzMCwgMHhhNTA2LCAweDExNTAsCisJMHg3ODM0LCAweGE0MDYsIDB4MTEzOCwgMHg3ODM4LCAweGE3MDYsIDB4MTEyMCwgMHg3ODNjLCAweGE2MDYsCisJMHgwOTA0LCAweDFiMGUsIDB4NzgwMywgMHgwMDAyLCAweDA4MDQsIDB4MWM2NywgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHhhMDBkLCAweDAxNTAsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsCisJMHgxMTMwLCAweDcwMDQsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHg4NjRjLCAweDA4MGMsCisJMHgxOWJhLCAweDAwODgsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDIwNjAsCisJMHg2MDEwLCAweGEwMDUsIDB4MGRhMCwgMHgyMDY4LCAweDY4MDgsIDB4ODAwMCwgMHg2ODBhLCAweDZjMjgsCisJMHg2YjJjLCAweDA4MGMsIDB4MTlkNSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDcwMGMsCisJMHg3MTEwLCAweGExMDYsIDB4MDkwNCwgMHgxZGQxLCAweDcwMDQsIDB4MDAxNiwgMHgyMTBjLCAweGExMDYsCisJMHgwMDFlLCAweDA5MDQsIDB4MWRkMSwgMHgwMGQ2LCAweDAwYzYsIDB4MjE2YywgMHgyZDAwLCAweGEwMDUsCisJMHgwOTA0LCAweDFkY2YsIDB4NjgxYywgMHhhMDg2LCAweDAwMDgsIDB4MDkwNCwgMHgxZGNmLCAweDY4MjAsCisJMHhkMGQ0LCAweDE5MDQsIDB4MWRjZiwgMHg2ODEwLCAweDIwNjgsIDB4Njg1MCwgMHhkMGZjLCAweDA1YTgsCisJMHg4MTA4LCAweDIxMDQsIDB4NmIyYywgMHhhMzA2LCAweDE5MDQsIDB4MWRjZiwgMHg4MTA4LCAweDIxMDQsCisJMHg2YTI4LCAweGEyMDYsIDB4MTkwNCwgMHgxZGNmLCAweDY4NTAsIDB4YzBmYywgMHhjMGY1LCAweDY4NTIsCisJMHg2ODZjLCAweDc4MjIsIDB4NzAxNiwgMHg2ODcwLCAweDc4MjYsIDB4NzAxYSwgMHg2ODFjLCAweDc4MzIsCisJMHg3MDFlLCAweDY4MjAsIDB4NzgzNiwgMHg3MDIyLCAweDY4MTgsIDB4MjA2MCwgMHg2MDM0LCAweGQwOWMsCisJMHgwMTY4LCAweDY4MzAsIDB4MjAwNSwgMHgwMGQ2LCAweGFjNjgsIDB4NjgwOCwgMHg3ODNhLCAweDcwMjYsCisJMHg2ODBjLCAweDc4M2UsIDB4NzAyYSwgMHgwMGRlLCAweDA4MDQsIDB4MWRjOSwgMHhhMDA2LCAweDc4M2EsCisJMHg3ODNlLCAweDcwMjYsIDB4NzAyYSwgMHgwODA0LCAweDFkYzksIDB4ODEwOCwgMHgyMTA0LCAweGEwMDUsCisJMHgxOTA0LCAweDFkY2YsIDB4NmIyYywgMHhhMzA2LCAweDE5MDQsIDB4MWRjZiwgMHg4MTA4LCAweDIxMDQsCisJMHhhMDA1LCAweDE1ZTgsIDB4NmEyOCwgMHhhMjA2LCAweDE1ZDAsIDB4Njg1MCwgMHhjMGY1LCAweDY4NTIsCisJMHg2ODMwLCAweDIwMDUsIDB4NjkxOCwgMHhhMTYwLCAweGExODAsIDB4MDAwZCwgMHgyMDA0LCAweGQwOWMsCisJMHgxMWEwLCAweDYwMDgsIDB4NzgyMiwgMHg3MDE2LCAweDY4NmUsIDB4NjAwYywgMHg3ODI2LCAweDcwMWEsCisJMHg2ODcyLCAweDYwMDAsIDB4NzgzMiwgMHg3MDFlLCAweDYwMDQsIDB4NzgzNiwgMHg3MDIyLCAweGEwMDYsCisJMHg3ODNhLCAweDc4M2UsIDB4NzAyNiwgMHg3MDJhLCAweDAwYTAsIDB4NjAxMCwgMHg3ODIyLCAweDcwMTYsCisJMHg2ODZlLCAweDYwMTQsIDB4NzgyNiwgMHg3MDFhLCAweDY4NzIsIDB4NjAwMCwgMHg3ODMyLCAweDcwMWUsCisJMHg2MDA0LCAweDc4MzYsIDB4NzAyMiwgMHg2MDA4LCAweDc4M2EsIDB4NzAyNiwgMHg2MDBjLCAweDc4M2UsCisJMHg3MDJhLCAweDY4MTAsIDB4NzgxYSwgMHg2ODE0LCAweDc4MWUsIDB4NzgwMywgMHgwMDExLCAweDAwY2UsCisJMHgwMGRlLCAweDAwMDUsIDB4MjAxMSwgMHgwMjAxLCAweDIwMDksIDB4MDAzYywgMHgyMjA0LCAweGEwMDUsCisJMHgxMTE4LCAweDgxMDksIDB4MWRkOCwgMHgwMDA1LCAweDAwMDUsIDB4MGNhMSwgMHgwMTE4LCAweDc4MGMsCisJMHhkMGE0LCAweDAxMjAsIDB4MDBkOSwgMHhhMDg1LCAweDAwMDEsIDB4MDAxMCwgMHgwODBjLCAweDFlZWYsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDExNjAsCisJMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMTQwLCAweDA4MGMsIDB4Mjk1YywgMHgyMGUxLCAweDkwMjgsCisJMHg3MDBmLCAweGI4MmYsIDB4NzAxMywgMHhiODJmLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LCAweDA4MGMsCisJMHg1YWNmLCAweDExYjgsIDB4MjAwMSwgMHgwMTYwLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxMzgsCisJMHgyMDAzLCAweDAwMDAsIDB4MjAxMSwgMHgwMGM4LCAweGUwMDAsIDB4ZTAwMCwgMHg4MjExLCAweDFkZTAsCisJMHgwNGIxLCAweDAwNjYsIDB4MjAzMSwgMHgwMDAwLCAweDA4MGMsIDB4NWI1MSwgMHgwMDZlLCAweDAwY2UsCisJMHgwMDA1LCAweDA4MGMsIDB4MWU2ZSwgMHgwODBjLCAweDI5NWMsIDB4MjBlMSwgMHg5MDI4LCAweDcwMGMsCisJMHg3MTEwLCAweGExMDYsIDB4MDFjMCwgMHgyMTA0LCAweGEwMDUsIDB4MDEzMCwgMHgyMDYwLCAweDYwMTAsCisJMHgyMDYwLCAweDYwMDgsIDB4ODAwMSwgMHg2MDBhLCAweGExODgsIDB4MDAwMywgMHhhMTgyLCAweGI4NGEsCisJMHgwMjEwLCAweDIwMDksIDB4YjgyZiwgMHg3MTEyLCAweDcwMGMsIDB4YTEwNiwgMHgxZDQwLCAweDA4MGMsCisJMHgyOGViLCAweDIxMTAsIDB4MGMyMCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDBjZSwgMHgwMDA1LCAweDA4MGMsCisJMHgyOTVjLCAweDIwZTEsIDB4OTAyOCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDAwZTYsCisJMHgwMGM2LCAweDAwMTYsIDB4MjA3MSwgMHhiODIzLCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAxOTAsCisJMHgyMTA0LCAweGEwMDUsIDB4MDEzMCwgMHgyMDYwLCAweDYwMTAsIDB4MjA2MCwgMHg2MDA4LCAweDgwMDEsCisJMHg2MDBhLCAweGExODgsIDB4MDAwMywgMHhhMTgyLCAweGI4NGEsIDB4MDIxMCwgMHgyMDA5LCAweGI4MmYsCisJMHg3MTEyLCAweDBjNTAsIDB4MDAxZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDAxMzgsCisJMHgyMDE0LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxNjAsIDB4MjAyYywgMHgyMDAzLCAweDAwMDAsCisJMHgwODBjLCAweDVhY2YsIDB4MTE0OCwgMHgyMDIxLCAweDAwMDIsIDB4MWQwNCwgMHgxZTdkLCAweDIwOTEsCisJMHg2MDAwLCAweDg0MjEsIDB4MWRkMCwgMHgwMDA1LCAweDIwMjEsIDB4YjAxNSwgMHgyMDAxLCAweDAxNDEsCisJMHgyMDFjLCAweGQzZGMsIDB4MTE2OCwgMHgyMDAxLCAweDAxMDksIDB4MjAxYywgMHhhMzljLCAweDAwNDgsCisJMHgxMTM4LCAweDIwMDEsIDB4MDExMSwgMHgyMDFjLCAweDgzZmYsIDB4MTExMCwgMHg4NDIxLCAweDFkNzAsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLCAweDc4MDgsIDB4YTA4NCwgMHhmMDAwLCAweGExMGQsCisJMHgwODY5LCAweDIwMDEsIDB4MDEwNSwgMHgyMDA0LCAweGEwODQsIDB4MDAwMywgMHgxMTMwLCAweDIwMDEsCisJMHhiODRhLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAwLCAweDA1NDgsIDB4YTAyNiwgMHgyMDE5LCAweGYwMDAsCisJMHg4MzE5LCAweDExNDgsIDB4MjAwMSwgMHgwMTJiLCAweDIwMDMsIDB4OTVmNSwgMHgyMDAxLCAweDAxMjksCisJMHgyMDAzLCAweDk1ZjUsIDB4MDBkOCwgMHgyMDAxLCAweDAxMDUsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDMsCisJMHgxMTMwLCAweDIwMDEsIDB4Yjg0YSwgMHgyMDA0LCAweGEwODYsIDB4MDAwMCwgMHgwMTc4LCAweDIwMDEsCisJMHgwMTMyLCAweDIwMDQsIDB4YTQzNiwgMHgwMTEwLCAweDIwMjAsIDB4MGMwMCwgMHgyMDAxLCAweDAwMjEsCisJMHgyMDA0LCAweGQwZmMsIDB4MDllOCwgMHgwODBjLCAweDIxNGEsIDB4MDhjMCwgMHgyMGUxLCAweDcwMDAsCisJMHg3MzI0LCAweDc0MjAsIDB4NzAyOCwgMHg3MDI4LCAweDc0MjYsIDB4NzAzNywgMHgwMDAxLCAweDgxMGYsCisJMHg3MTJlLCAweDcwMmYsIDB4MDEwMCwgMHg3MDM3LCAweDAwMDgsIDB4NzMyNiwgMHg3NDIyLCAweDIwMDEsCisJMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDBlZSwgMHgwMDA1LCAweDAwMjYsCisJMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDc5MDgsIDB4YTE4YywgMHgwZmZmLCAweGExODIsCisJMHgwZmZkLCAweDAyMTAsIDB4MjAwOSwgMHgwMDAwLCAweGExOTAsIDB4MDAwNywgMHhhMjk0LCAweDFmZjgsCisJMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHgyMDAxLCAweDAyMGEsIDB4ODJmZiwgMHgwMTQwLCAweDIwZTEsCisJMHg2MDAwLCAweDIwMGMsIDB4MjAwYywgMHgyMDBjLCAweDIwMGMsIDB4ODIxMSwgMHgxZGQwLCAweDIwZTEsCisJMHg3MDAwLCAweDIwMGMsIDB4MjAwYywgMHg3MDAzLCAweDAwMDAsIDB4MjBlMSwgMHg2MDAwLCAweDIwMDEsCisJMHgwMjA4LCAweDIwMGMsIDB4MjAwMSwgMHgwMjA5LCAweDIwMDQsIDB4YTEwNiwgMHgwMTU4LCAweDA4MGMsCisJMHgxZGQyLCAweDAxMzAsIDB4NzkwOCwgMHhkMWVjLCAweDExMjgsIDB4NzkwYywgMHhkMWE0LCAweDA5NjAsCisJMHgwODBjLCAweDFkZmUsIDB4YTAwNiwgMHgwMDJlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwMTYsCisJMHgwMDI2LCAweDIwNzEsIDB4YjgyMywgMHgyMDc5LCAweDAwMzAsIDB4MjAxMSwgMHgwMDUwLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDFhOCwgMHg4MjExLCAweDAxODgsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsCisJMHhkMDhjLCAweDBkYzgsIDB4NzkwNCwgMHhhMThjLCAweDA3ODAsIDB4MDAxNiwgMHgwODBjLCAweDFiMDYsCisJMHgwMDFlLCAweDgxZmYsIDB4MTExOCwgMHgyMDExLCAweDAwNTAsIDB4MGM0OCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NzgwMywgMHgwMDA0LCAweDIwMDksCisJMHgwMDY0LCAweDc4MDQsIDB4ZDBhYywgMHgwOTA0LCAweDFmYTEsIDB4ODEwOSwgMHgxZGQwLCAweDIwMDksCisJMHgwMTAwLCAweDIxMGMsIDB4YTE4YSwgMHgwMDAzLCAweDBhMGMsIDB4MTUxNSwgMHgwODBjLCAweDIyNTEsCisJMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhiODEyLCAweDIwNzksIDB4MDAxMCwgMHg3MDA0LCAweGEwODYsCisJMHgwMDAwLCAweDA1MzgsIDB4NzgwMCwgMHgwMDA2LCAweDc4MjAsIDB4MDAwNiwgMHg3ODMwLCAweDAwMDYsCisJMHg3ODM0LCAweDAwMDYsIDB4NzgzOCwgMHgwMDA2LCAweDc4M2MsIDB4MDAwNiwgMHg3ODAzLCAweDAwMDQsCisJMHhlMDAwLCAweGUwMDAsIDB4MjA3OSwgMHgwMDMwLCAweDc4MDQsIDB4ZDBhYywgMHgxOTBjLCAweDE1MTUsCisJMHgyMDc5LCAweDAwMTAsIDB4MDAwZSwgMHg3ODNlLCAweDAwMGUsIDB4NzgzYSwgMHgwMDBlLCAweDc4MzYsCisJMHgwMDBlLCAweDc4MzIsIDB4MDAwZSwgMHg3ODIyLCAweDAwMGUsIDB4NzgwMiwgMHgwMGZlLCAweDAwZWUsCisJMHgwMDMwLCAweDAwZmUsIDB4MDBlZSwgMHg3ODA0LCAweGQwYWMsIDB4MTkwYywgMHgxNTE1LCAweDA4MGMsCisJMHg3MjMwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI4NGEsIDB4NzAwMywgMHgwMDAwLCAweDAwZWUsCisJMHgwMDA1LCAweDAwZDYsIDB4YTI4MCwgMHgwMDA0LCAweDIwNmMsIDB4Njk0YywgMHhkMWRjLCAweDE5MDQsCisJMHgyMDFmLCAweDY5MzQsIDB4YTE4NCwgMHgwMDA3LCAweDAwMDIsIDB4MWZiZCwgMHgyMDBhLCAweDFmYmQsCisJMHgxZmJkLCAweDFmYmQsIDB4MWZmMSwgMHgxZmQwLCAweDFmYmYsIDB4MDgwYywgMHgxNTE1LCAweDY4NGMsCisJMHhkMGI0LCAweDA5MDQsIDB4MjEwNywgMHg2ODYwLCAweDY4MmUsIDB4NjgxNiwgMHg2ODVjLCAweDY4MmEsCisJMHg2ODEyLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLCAweDY4MGUsIDB4Njk1OCwgMHgwODA0LCAweDIwMTIsCisJMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsIDB4MWQzOCwgMHg2ODRjLCAweGQwYjQsCisJMHgwOTA0LCAweDIxMDcsIDB4Njg2MCwgMHg2ODJlLCAweDY4MTYsIDB4Njg1YywgMHg2ODJhLCAweDY4MTIsCisJMHg2ODdjLCAweDY4MGEsIDB4Njg4MCwgMHg2ODBlLCAweDY4MDQsIDB4NjgxYSwgMHhhMDgwLCAweDAwMGQsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIyZTUsIDB4MjAwNSwgMHg2ODMyLCAweDY5NTgsCisJMHgwNDUwLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTUsIDB4MTU0OCwgMHg2ODRjLCAweGQwYjQsCisJMHgwOTA0LCAweDIxMDcsIDB4NjgwNCwgMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsCisJMHgwMDBmLCAweGEwODAsIDB4MjJlNSwgMHgyMDA1LCAweDY4MzIsIDB4Njk1OCwgMHhhMDA2LCAweDY4MmUsCisJMHg2ODJhLCAweDAwODgsIDB4Njg0YywgMHhkMGI0LCAweDA5MDQsIDB4MWFlMSwgMHg2OTU4LCAweGEwMDYsCisJMHg2ODJlLCAweDY4MmEsIDB4MmQwMCwgMHg2ODFhLCAweDY4MzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMmU1LCAweDIwMDUsIDB4NjgzMiwgMHg2OTI2LCAweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMDIwLCAweDc4MDQsIDB4ZDBmYywgMHgxOTBjLCAweDIxNGEsCisJMHgwMGU2LCAweDAwZDYsIDB4MjA3MSwgMHhiODRhLCAweDcwMDAsIDB4YTAwNSwgMHgxOTA0LCAweDIwODcsCisJMHgwMGM2LCAweDcyMDYsIDB4YTI4MCwgMHgwMDA0LCAweDIwNWMsIDB4NzAwNCwgMHgyMDY4LCAweDc4MDMsCisJMHgwMDA0LCAweDY4MTgsIDB4MDBkNiwgMHgyMDY4LCAweDY4NmMsIDB4NzgxMiwgMHg2ODkwLCAweDAwZjYsCisJMHgyMGUxLCAweDkwNDAsIDB4MjA3OSwgMHgwMjAwLCAweDc4MWEsIDB4MjA3OSwgMHgwMTAwLCAweDgwMDQsCisJMHg3OGQ2LCAweDAwZmUsIDB4MDBkZSwgMHgyYjY4LCAweDY4MjQsIDB4MjA1MCwgMHg2ODE4LCAweDIwNjAsCisJMHg2ODMwLCAweDIwNDAsIDB4NjAzNCwgMHhhMGNjLCAweDAwMGYsIDB4NjkwOCwgMHg3OTFhLCAweDcxMTYsCisJMHg2ODBjLCAweDc4MWUsIDB4NzAxYSwgMHhhMDA2LCAweDcwMGUsIDB4NzAxMiwgMHg3MDA0LCAweDY5MmMsCisJMHg2ODE0LCAweGExMDYsIDB4MTEyMCwgMHg2OTI4LCAweDY4MTAsIDB4YTEwNiwgMHgwMTU4LCAweDAwMzYsCisJMHgwMDQ2LCAweDZiMTQsIDB4NmMxMCwgMHgwODBjLCAweDIzMDUsIDB4MDA0ZSwgMHgwMDNlLCAweDAxMTAsCisJMHgwMGNlLCAweDAwYTgsIDB4OGFmZiwgMHgxMTIwLCAweDAwY2UsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAwMjAsIDB4MjAwOSwgMHgwMDAxLCAweDAwNTksCisJMHgwMTE4LCAweDIwMDksIDB4MDAwMSwgMHgwMDM5LCAweDAxMmUsIDB4MDBjZSwgMHhhMDA2LCAweDAwZGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsCisJMHgwMDI2LCAweDhhZmYsIDB4MDkwNCwgMHgyMTAwLCAweDcwMGMsIDB4NzIxNCwgMHhhMjNhLCAweDcwMTAsCisJMHg3MjE4LCAweGEyMDMsIDB4MGEwNCwgMHgyMGZmLCAweGE3MDUsIDB4MDkwNCwgMHgyMGZmLCAweGEwM2UsCisJMHgyNzMwLCAweDY4NTAsIDB4ZDBmYywgMHgxMWE4LCAweDAwZDYsIDB4MjgwNSwgMHhhYzY4LCAweDI5MDAsCisJMHgwMDAyLCAweDIwZTIsIDB4MjBjNywgMHgyMGM3LCAweDIwZTIsIDB4MjBlMiwgMHgyMGRiLCAweDIwZTIsCisJMHgyMGM3LCAweDIwZTIsIDB4MjBjYywgMHgyMGNjLCAweDIwZTIsIDB4MjBlMiwgMHgyMGUyLCAweDIwZDMsCisJMHgyMGNjLCAweGMwZmMsIDB4Njg1MiwgMHg2YjZjLCAweDZhNzAsIDB4NmQxYywgMHg2YzIwLCAweGQ5OWMsCisJMHgwNTI4LCAweDAwZDYsIDB4MjgwNSwgMHhhYzY4LCAweDZmMDgsIDB4NmUwYywgMHgwMGYwLCAweDZiMDgsCisJMHg2YTBjLCAweDZkMDAsIDB4NmMwNCwgMHgwMGM4LCAweDZiMTAsIDB4NmExNCwgMHg2ZDAwLCAweDZjMDQsCisJMHg2ZjA4LCAweDZlMGMsIDB4MDA5MCwgMHgwMGRlLCAweDAwZDYsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMWUsIDB4MTEzOCwgMHgwMGRlLCAweDA4MGMsIDB4MjJhNywgMHgxOTA0LCAweDIwOTEsCisJMHhhMDBlLCAweDAwZjAsIDB4MDBkZSwgMHgwODBjLCAweDE1MTUsIDB4MDBkZSwgMHg3YjIyLCAweDdhMjYsCisJMHg3ZDMyLCAweDdjMzYsIDB4N2YzYSwgMHg3ZTNlLCAweDc5MDIsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsCisJMHg2ODI4LCAweGEzMDAsIDB4NjgyYSwgMHg2ODJjLCAweGEyMDEsIDB4NjgyZSwgMHg3MDBjLCAweGEzMDAsCisJMHg3MDBlLCAweDcwMTAsIDB4YTIwMSwgMHg3MDEyLCAweDA4MGMsIDB4MjJhNywgMHgwMDA4LCAweGEwMDYsCisJMHgwMDJlLCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDA1LCAweDA4MGMsCisJMHgxNTE1LCAweDAwMjYsIDB4MjAwMSwgMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsCisJMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHgwMGQ2LCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTE4LCAweDY4NTAsIDB4YzBiZCwgMHg2ODUyLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MTE4MCwgMHgyMDYxLCAweDAxMDAsIDB4NjJjOCwgMHgyMDAxLCAweDAwZmEsCisJMHg4MDAxLCAweDFkZjAsIDB4NjBjOCwgMHhhMjA2LCAweDFkYzAsIDB4NjBjNCwgMHg2ODZhLCAweDYwYzgsCisJMHg2ODY2LCAweDcwMDQsIDB4MjA2MCwgMHgwMGRlLCAweDAwYzYsIDB4MDgwYywgMHg5OTJhLCAweDAwY2UsCisJMHgyMDAxLCAweGI3ZWYsIDB4MjAwNCwgMHhhYzA2LCAweDExNTAsIDB4MjBlMSwgMHg5MDQwLCAweDA4MGMsCisJMHg4MjVkLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3MjMwLCAweDAwMmUsCisJMHgwODA0LCAweDIyMDQsIDB4MDEyNiwgMHgyMDkxLCAweDI0MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwZjYsCisJMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgyMDc5LCAweDAwMjAsIDB4MjA3MSwgMHhiODRhLCAweDJiNjgsCisJMHg2ODE4LCAweDIwNjAsIDB4NzkwNCwgMHg3ODAzLCAweDAwMDIsIDB4YTE4NCwgMHgwNzAwLCAweDE5MDQsCisJMHgyMTA5LCAweDcwMDAsIDB4MDAwMiwgMHgyMjA0LCAweDIxNjcsIDB4MjFkNywgMHgyMjAyLCAweDgwMDEsCisJMHg3MDAyLCAweGQxOWMsIDB4MTE3MCwgMHg4YWZmLCAweDA1ZDAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsCisJMHgyMDhiLCAweDA5MDQsIDB4MjIwNCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgyMDhiLCAweDA4MDQsCisJMHgyMjA0LCAweDc4MDMsIDB4MDAwNCwgMHhkMTk0LCAweDAxNDgsIDB4Njg1MCwgMHhjMGZjLCAweDY4NTIsCisJMHg4YWZmLCAweDExZDgsIDB4Njg0YywgMHhjMGY1LCAweDY4NGUsIDB4MDBiOCwgMHgwMDI2LCAweDAwMzYsCisJMHg2YjI4LCAweDZhMmMsIDB4NzgyMCwgMHg2ODZlLCAweGEzMWEsIDB4NzgyNCwgMHg2ODcyLCAweGEyMTMsCisJMHg3ODMwLCAweDY4MWUsIDB4NzgzNCwgMHg2ODIyLCAweDZiMmEsIDB4NmEyZSwgMHgwMDNlLCAweDAwMmUsCisJMHgwODBjLCAweDIyYmQsIDB4Njg1MCwgMHhjMGZkLCAweDY4NTIsIDB4MmEwMCwgMHg2ODI2LCAweDJjMDAsCisJMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg3MDAzLCAweDAwMDAsIDB4MDgwNCwgMHgyMjA0LCAweDAwZjYsCisJMHgwMDI2LCAweDc4MWMsIDB4MDAwNiwgMHg3ODE4LCAweDAwMDYsIDB4MjA3OSwgMHgwMTAwLCAweDdhMTQsCisJMHhhMjg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MDAzNiwgMHgyMDE5LCAweDEwMDAsCisJMHg4MzE5LCAweDA5MGMsIDB4MTUxNSwgMHg3ODIwLCAweGQwYmMsIDB4MWRkMCwgMHgwMDNlLCAweDc5YzgsCisJMHgwMDBlLCAweGExMDIsIDB4MDAxZSwgMHgwMDA2LCAweDAwMTYsIDB4NzljNCwgMHgwMDBlLCAweGExMDMsCisJMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHhhMjg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLCAweDc4MTYsCisJMHgwMDJlLCAweDAwZmUsIDB4NzgwMywgMHgwMDA4LCAweDcwMDMsIDB4MDAwMCwgMHgwNDY4LCAweDgwMDEsCisJMHg3MDAyLCAweGQxOTQsIDB4MDE2OCwgMHg3ODA0LCAweGQwZmMsIDB4MTkwNCwgMHgyMTVhLCAweGQxOWMsCisJMHgxMWY4LCAweDhhZmYsIDB4MDUwOCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgyMDhiLCAweDAwZTAsCisJMHgwMDI2LCAweDAwMzYsIDB4NmIyOCwgMHg2YTJjLCAweDA4MGMsIDB4MjJiZCwgMHgwMGQ2LCAweDI4MDUsCisJMHhhYzY4LCAweDYwMzQsIDB4ZDA5YywgMHgxMTI4LCAweDY4MDgsIDB4YTMxYSwgMHg2ODBjLCAweGEyMTMsCisJMHgwMDIwLCAweDY4MTAsIDB4YTMxYSwgMHg2ODE0LCAweGEyMTMsIDB4MDBkZSwgMHgwODA0LCAweDIxOGEsCisJMHgwODA0LCAweDIxODYsIDB4MDgwYywgMHgxNTE1LCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweGI4NGEsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwNWQwLCAweDIwNzksIDB4MDAyMCwgMHgwMDE2LCAweDIwMDksCisJMHgwMjA3LCAweDIxMGMsIDB4ZDE5NCwgMHgwMTk4LCAweDIwMDksIDB4MDIwYywgMHgyMTBjLCAweGExODQsCisJMHgwMDAzLCAweDAxNjgsIDB4MDgwYywgMHhiNDUwLCAweDIwMDEsIDB4MDEzMywgMHgyMDA0LCAweGEwMDUsCisJMHgwOTBjLCAweDE1MTUsIDB4MjBlMSwgMHg5MDQwLCAweDIwMDEsIDB4MDIwYywgMHgyMTAyLCAweDIwMDksCisJMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4YTEwNiwgMHgxMTEwLCAweDIwZTEsCisJMHg5MDQwLCAweDc4MDQsIDB4ZDBmYywgMHgwOWQ4LCAweDA4MGMsIDB4MjE0YSwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDE5YTgsIDB4MDAxZSwgMHg3ODAzLCAweDAwMDQsIDB4NzgwNCwgMHhkMGFjLCAweDFkZTgsCisJMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweDAwMjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweGI4NGEsCisJMHgyMDc5LCAweDAwMjAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDU0MCwgMHg3MDA0LCAweDIwNjAsCisJMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNTgsIDB4Njg1MCwgMHhjMGI1LCAweDY4NTIsCisJMHg2ODBjLCAweDdhMWMsIDB4YTIwNiwgMHgxMTIwLCAweDY4MDgsIDB4N2ExOCwgMHhhMjA2LCAweDAxZTAsCisJMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDA4MGMsIDB4OTkyYSwgMHgyMGUxLCAweDkwNDAsCisJMHgwODBjLCAweDgyNWQsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4ODA3ZiwgMHgwMGZlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDAyZSwgMHgwMDA1LCAweDY4MTAsIDB4NmExNCwgMHhhMjA1LCAweDFkMDAsCisJMHg2ODRjLCAweGMwZGMsIDB4Njg0ZSwgMHgyYzEwLCAweDA4MGMsIDB4MWZhOSwgMHgyMDAxLCAweDAxMDUsCisJMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsCisJMHgyMDY5LCAweGI3ZTAsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwOGY4LCAweDg4NDAsCisJMHgyODA1LCAweGEwMDUsIDB4MTE3MCwgMHg2MDA0LCAweGEwMDUsIDB4MDE2OCwgMHg2ODFhLCAweDIwNjAsCisJMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIyZTUsIDB4MjA0NSwgMHg4OGZmLCAweDA5MGMsCisJMHgxNTE1LCAweDhhNTEsIDB4MDAwNSwgMHgyMDUwLCAweDAwMDUsIDB4OGE1MCwgMHg4ODQxLCAweDI4MDUsCisJMHhhMDA1LCAweDExOTAsIDB4MmMwMCwgMHhhZDA2LCAweDAxMjAsIDB4NjAwMCwgMHhhMDA1LCAweDExMDgsCisJMHgyZDAwLCAweDIwNjAsIDB4NjgxYSwgMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIyZjUsCisJMHgyMDQ1LCAweDg4ZmYsIDB4MDkwYywgMHgxNTE1LCAweDAwMDUsIDB4MDAwMCwgMHgwMDExLCAweDAwMTUsCisJMHgwMDE5LCAweDAwMWQsIDB4MDAyMSwgMHgwMDI1LCAweDAwMjksIDB4MDAwMCwgMHgwMDBmLCAweDAwMTUsCisJMHgwMDFiLCAweDAwMjEsIDB4MDAyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMmRhLCAweDIyZDYsCisJMHgwMDAwLCAweDAwMDAsIDB4MjJlNCwgMHgwMDAwLCAweDIyZGEsIDB4MDAwMCwgMHgyMmUxLCAweDIyZGUsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMmU0LCAweDIyZTEsIDB4MDAwMCwgMHgyMmRjLCAweDIyZGMsCisJMHgwMDAwLCAweDAwMDAsIDB4MjJlNCwgMHgwMDAwLCAweDIyZGMsIDB4MDAwMCwgMHgyMmUyLCAweDIyZTIsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMmU0LCAweDIyZTIsIDB4MDBhNiwgMHgwMDk2LCAweDAwODYsCisJMHg2YjJlLCAweDZjMmEsIDB4Njg1OCwgMHhhMDU1LCAweDA5MDQsIDB4MjM5NiwgMHgyZDYwLCAweDYwMzQsCisJMHhhMGNjLCAweDAwMGYsIDB4YTljMCwgMHgyMmU1LCAweGE5ODYsIDB4MDAwNywgMHgwMTMwLCAweGE5ODYsCisJMHgwMDBlLCAweDAxMTgsIDB4YTk4NiwgMHgwMDBmLCAweDExMjAsIDB4NjA1YywgMHhhNDIyLCAweDYwNjAsCisJMHhhMzFiLCAweDI4MDUsIDB4YTA0NSwgMHgxMTQwLCAweDAzMTAsIDB4MDgwNCwgMHgyMzk2LCAweDYwMDQsCisJMHhhMDY1LCAweDA5MDQsIDB4MjM5NiwgMHgwYzE4LCAweDI4MDUsIDB4YTAwNSwgMHgwMWE4LCAweGFjNjgsCisJMHhkOTljLCAweDExMjgsIDB4NjgwOCwgMHhhNDIyLCAweDY4MGMsIDB4YTMxYiwgMHgwMDIwLCAweDY4MTAsCisJMHhhNDIyLCAweDY4MTQsIDB4YTMxYiwgMHgwNjIwLCAweDIzMDAsIDB4YTQwNSwgMHgwMTUwLCAweDhhNTEsCisJMHgwOTA0LCAweDIzOTYsIDB4ODg0MCwgMHgwYzQwLCAweDYwMDQsIDB4YTA2NSwgMHgwOTA0LCAweDIzOTYsCisJMHgwODMwLCAweDhhNTEsIDB4MDkwNCwgMHgyMzk2LCAweDg4NDAsIDB4MjgwNSwgMHhhMDA1LCAweDExNTgsCisJMHg2MDA0LCAweGEwNjUsIDB4MDkwNCwgMHgyMzk2LCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweGE5YzAsCisJMHgyMmU1LCAweDI4MDUsIDB4MjA0MCwgMHgyYjY4LCAweDY4NTAsIDB4YzBmYywgMHg2ODUyLCAweDA0NTgsCisJMHg4NDIyLCAweDg0MjAsIDB4ODMxYSwgMHhhMzk5LCAweDAwMDAsIDB4MDBkNiwgMHgyYjY4LCAweDZjNmUsCisJMHg2YjcyLCAweDAwZGUsIDB4ZDk5YywgMHgxMTY4LCAweDY5MDgsIDB4MjQwMCwgMHhhMTIyLCAweDY5MGMsCisJMHgyMzAwLCAweGExMWIsIDB4MGEwYywgMHgxNTE1LCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LCAweGEzMTksCisJMHgwMDYwLCAweDY5MTAsIDB4MjQwMCwgMHhhMTIyLCAweDY5MTQsIDB4MjMwMCwgMHhhMTFiLCAweDBhMGMsCisJMHgxNTE1LCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LCAweGEzMTksIDB4MmI2OCwgMHg2YzFlLCAweDZiMjIsCisJMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwgMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLCAweDJhMDAsCisJMHg2ODI2LCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweGEwMDYsIDB4MDAyOCwgMHgwMDhlLCAweDAwOWUsCisJMHgwMGFlLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGEwODQsCisJMHgwMDA3LCAweDAwMDIsIDB4MjNhYSwgMHgyM2FiLCAweDIzYWUsIDB4MjNiMSwgMHgyM2I2LCAweDIzYjksCisJMHgyM2JlLCAweDIzYzMsIDB4MDAwNSwgMHgwODBjLCAweDIxNGEsIDB4MDAwNSwgMHgwODBjLCAweDFiMDYsCisJMHgwMDA1LCAweDA4MGMsIDB4MWIwNiwgMHgwODBjLCAweDIxNGEsIDB4MDAwNSwgMHgwODBjLCAweDE3MWIsCisJMHgwMDA1LCAweDA4MGMsIDB4MjE0YSwgMHgwODBjLCAweDE3MWIsIDB4MDAwNSwgMHgwODBjLCAweDFiMDYsCisJMHgwODBjLCAweDE3MWIsIDB4MDAwNSwgMHgwODBjLCAweDFiMDYsIDB4MDgwYywgMHgyMTRhLCAweDA4MGMsCisJMHgxNzFiLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI2MDAsIDB4MjA3OSwgMHgwMjAwLCAweDIwNzEsCisJMHhiYjgwLCAweDIwNjksIDB4YjUwMCwgMHgwODBjLCAweDI0YzAsIDB4MDgwYywgMHgyNGIwLCAweDIwMDksCisJMHgwMDA0LCAweDc5MTIsIDB4NzgxNywgMHgwMDA0LCAweDA4MGMsIDB4MjdmOCwgMHg3ODFiLCAweDAwMDIsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwYTksIDB4MDA4MCwgMHg3ODJmLCAweDAwMDAsCisJMHgxZjA0LCAweDIzZTYsIDB4MjBlMSwgMHg5MDgwLCAweDc4M2IsIDB4MDAxZiwgMHgyMGUxLCAweDg3MDAsCisJMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDI2MDAsIDB4NzgxYywgMHhkMGE0LCAweDE5MGMsCisJMHgyNGFkLCAweGEwODQsIDB4MDAwNywgMHgwMDAyLCAweDI0MTYsIDB4MjQwNCwgMHgyNDA3LCAweDI0MGEsCisJMHgyNDBmLCAweDI0MTEsIDB4MjQxMywgMHgyNDE1LCAweDA4MGMsIDB4NjNjNCwgMHgwMDc4LCAweDA4MGMsCisJMHg2NDAzLCAweDAwNjAsIDB4MDgwYywgMHg2M2M0LCAweDA4MGMsIDB4NjQwMywgMHgwMDM4LCAweDAwNDEsCisJMHgwMDI4LCAweDAwMzEsIDB4MDAxOCwgMHgwMDIxLCAweDAwMDgsIDB4MDAxMSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweGI0NTAsIDB4NzkzMCwgMHhhMTg0LCAweDAwMDMsCisJMHgwMWIwLCAweDIwMDEsIDB4YjdlZiwgMHgyMDA0LCAweGEwMDUsIDB4MDE3MCwgMHgyMDAxLCAweDAxMzMsCisJMHgyMDA0LCAweGEwMDUsIDB4MDkwYywgMHgxNTE1LCAweDAwYzYsIDB4MjAwMSwgMHhiN2VmLCAweDIwNjQsCisJMHgwODBjLCAweDk5MmEsIDB4MDBjZSwgMHgwNGI4LCAweDIwZTEsIDB4OTA0MCwgMHgwNGEwLCAweGExODQsCisJMHgwMDMwLCAweDAxZTAsIDB4NmEwMCwgMHhhMjg2LCAweDAwMDMsIDB4MTEwOCwgMHgwMGEwLCAweDA4MGMsCisJMHg1YWNmLCAweDExNzgsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsCisJMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgwODBjLCAweDVhMDcsCisJMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwODBjLCAweDI0YjAsIDB4MDBhOCwgMHhhMTg0LCAweDAwYzAsCisJMHgwMTY4LCAweDAwZTYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHhiODIzLCAweDA4MGMsCisJMHgxZGZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDAyOCwgMHhhMTg0LCAweDAzMDAsCisJMHgwMTEwLCAweDIwZTEsIDB4OTAyMCwgMHg3OTMyLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDE2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweGI1MDAsIDB4NzEyOCwgMHgyMDAxLCAweGI3OTEsCisJMHgyMTAyLCAweDIwMDEsIDB4Yjc5OSwgMHgyMTAyLCAweGExODIsIDB4MDIxMSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDA4LCAweDA0MDAsIDB4YTE4MiwgMHgwMjU5LCAweDEyMTgsIDB4MjAwOSwgMHgwMDA3LCAweDAwZDAsCisJMHhhMTgyLCAweDAyYzEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDYsIDB4MDBhMCwgMHhhMTgyLCAweDAzNDksCisJMHgxMjE4LCAweDIwMDksIDB4MDAwNSwgMHgwMDcwLCAweGExODIsIDB4MDQyMSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDA0LCAweDAwNDAsIDB4YTE4MiwgMHgwNTgxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDAzLCAweDAwMTAsCisJMHgyMDA5LCAweDAwMDIsIDB4MjA3OSwgMHgwMjAwLCAweDc5MTIsIDB4NzgxNywgMHgwMDA0LCAweDA4MGMsCisJMHgyN2Y4LCAweDAwZmUsIDB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4NzkzOCwgMHgwODBjLCAweDE1MTUsCisJMHgwMGU2LCAweDAwMjYsIDB4MjA3MSwgMHgwMjAwLCAweDIwZTEsIDB4MTAwMCwgMHg3MjIwLCAweDcwMjgsCisJMHg3MDIwLCAweGEyMDYsIDB4MGRlMCwgMHgyMGUxLCAweDkwMTAsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsCisJMHgyMGUxLCAweGEwMDAsIDB4NzgzNywgMHgwMDAxLCAweDc4MmYsIDB4MDAwMCwgMHg3ODJmLCAweDAwMDAsCisJMHg3ODJmLCAweDAwMDAsIDB4NzgyZiwgMHgwMDAwLCAweDc4MzcsIDB4MDAwNSwgMHgyMGE5LCAweDAyMTAsCisJMHg3ODMwLCAweGQwYmMsIDB4MTExMCwgMHgxZjA0LCAweDI0ZDAsIDB4NzgzNywgMHgwMDAxLCAweDc4MzcsCisJMHgwMDAwLCAweGUwMDAsIDB4ZTAwMCwgMHgyMGUxLCAweGEwMDAsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHgyODAwLCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGI1MDAsIDB4NjAyNCwgMHg2MDI2LCAweDYwNTMsCisJMHgwMDMwLCAweDA4MGMsIDB4MjgzNywgMHg2MDUwLCAweGEwODQsIDB4ZmU3ZiwgMHg2MDUyLCAweDIwMDksCisJMHgwMGVmLCAweDYxMzIsIDB4NjEzNiwgMHgwODBjLCAweDI4NDcsIDB4NjBlNywgMHgwMDAwLCAweDYxZWEsCisJMHg2MGUzLCAweDAwMDgsIDB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDAwMCwgMHg2MDJmLCAweDAwODAsCisJMHg2MDJmLCAweDAwMDAsIDB4NjAwNywgMHgwZTlmLCAweDYwMWIsIDB4MDAxZSwgMHg2MDBmLCAweDAwZmYsCisJMHgyMDAxLCAweGI3OGQsIDB4MjAwMywgMHgwMGZmLCAweDYwMmIsIDB4MDAyZiwgMHgwMTJlLCAweDAwMDUsCisJMHgyMDAxLCAweGI1MzIsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4YjUzMSwgMHgyMDAzLCAweDAwMDEsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDYxMjQsCisJMHhhMTg0LCAweDFlMmMsIDB4MTExOCwgMHhhMTg0LCAweDAwMDcsIDB4MDAyYSwgMHhhMTk1LCAweDAwMDQsCisJMHhhMjg0LCAweDAwMDcsIDB4MDAwMiwgMHgyNTRkLCAweDI1MzMsIDB4MjUzNiwgMHgyNTM5LCAweDI1M2UsCisJMHgyNTQwLCAweDI1NDQsIDB4MjU0OCwgMHgwODBjLCAweDZiNzQsIDB4MDBiOCwgMHgwODBjLCAweDZjNGYsCisJMHgwMGEwLCAweDA4MGMsIDB4NmM0ZiwgMHgwODBjLCAweDZiNzQsIDB4MDA3OCwgMHgwMDk5LCAweDAwNjgsCisJMHgwODBjLCAweDZiNzQsIDB4MDA3OSwgMHgwMDQ4LCAweDA4MGMsIDB4NmM0ZiwgMHgwMDU5LCAweDAwMjgsCisJMHgwODBjLCAweDZjNGYsIDB4MDgwYywgMHg2Yjc0LCAweDAwMjksIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMTJlLCAweDAwMDUsIDB4NjEyNCwgMHg2MDI4LCAweGQwOWMsIDB4MDExOCwgMHhkMTljLCAweDE5MDQsCisJMHgyNzY2LCAweDA4MGMsIDB4NWFjZiwgMHgwNTc4LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAxOTgsCisJMHg2MDI0LCAweGEwODQsIDB4MTgwMCwgMHgwMTc4LCAweDA4MGMsIDB4NWFmNSwgMHgwMTE4LCAweDA4MGMsCisJMHg1YWUxLCAweDExNDgsIDB4NjAyNywgMHgwMDIwLCAweDYwNDMsIDB4MDAwMCwgMHgyMDAxLCAweGI3OWUsCisJMHgyMDAzLCAweGFhYWEsIDB4MDQ1OCwgMHgwODBjLCAweDVhZjUsIDB4MTVkMCwgMHg2MDI0LCAweGEwODQsCisJMHgxODAwLCAweDExMDgsIDB4MDRhOCwgMHgyMDAxLCAweGI3OWUsIDB4MjAwMywgMHhhYWFhLCAweDIwMDEsCisJMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg1YTA3LCAweDA4MDQsIDB4Mjc2NiwgMHhkMWFjLCAweDE1MTgsIDB4NjAyNCwgMHhkMGRjLCAweDExNzAsCisJMHhkMGU0LCAweDExODgsIDB4ZDBkNCwgMHgxMWEwLCAweGQwY2MsIDB4MDEzMCwgMHg3MDhjLCAweGEwODYsCisJMHgwMDI4LCAweDExMTAsIDB4MDgwYywgMHg1YzVlLCAweDA4MDQsIDB4Mjc2NiwgMHgyMDAxLCAweGI3OWYsCisJMHgyMDAzLCAweDAwMDAsIDB4MDA0OCwgMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAyLCAweDAwMjAsCisJMHgwODBjLCAweDViZDEsIDB4MDgwNCwgMHgyNzY2LCAweDA4MGMsIDB4NWQwMywgMHgwODA0LCAweDI3NjYsCisJMHhkMWFjLCAweDA5MDQsIDB4MjZhZSwgMHgwODBjLCAweDVhY2YsIDB4MTFkOCwgMHg2MDI3LCAweDAwMjAsCisJMHgwMDA2LCAweDAwMjYsIDB4MDAzNiwgMHgwODBjLCAweDVhZWIsIDB4MTE3MCwgMHgyMDAxLCAweGI3OWYsCisJMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDVhMDcsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwMDA1LCAweDAwM2UsIDB4MDAyZSwgMHgwMDBlLCAweDA4MGMsCisJMHg1YWE2LCAweDAwMTYsIDB4MDA0NiwgMHgwMGM2LCAweDY0NGMsIDB4YTQ4NiwgMHhmMGYwLCAweDExMzgsCisJMHgyMDYxLCAweDAxMDAsIDB4NjQ0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDc0Y2UsCisJMHhhNDhjLCAweGZmMDAsIDB4NzAzNCwgMHhkMDg0LCAweDAxNzgsIDB4YTE4NiwgMHhmODAwLCAweDExNjAsCisJMHg3MDNjLCAweGQwODQsIDB4MTE0OCwgMHhjMDg1LCAweDcwM2UsIDB4MDAzNiwgMHgyNDE4LCAweDIwMTEsCisJMHg4MDE2LCAweDA4MGMsIDB4M2VjYywgMHgwMDNlLCAweGExOTYsIDB4ZmYwMCwgMHgwNWI4LCAweDcwNTQsCisJMHhhMDg0LCAweDAwZmYsIDB4ODEwZiwgMHhhMTE2LCAweDA1ODgsIDB4NzEzMCwgMHhkMTg0LCAweDE1NzAsCisJMHgyMDExLCAweGI1NTMsIDB4MjIxNCwgMHhkMmVjLCAweDAxMzgsIDB4YzE4ZCwgMHg3MTMyLCAweDIwMTEsCisJMHhiNTUzLCAweDIyMTQsIDB4ZDJhYywgMHgxNTEwLCAweDYyNDAsIDB4YTI5NCwgMHgwMDEwLCAweDAxMzAsCisJMHg2MjQ4LCAweGEyOTQsIDB4ZmYwMCwgMHhhMjk2LCAweGZmMDAsIDB4MDFjMCwgMHg3MDMwLCAweGQwOGMsCisJMHgwOTA0LCAweDI2N2IsIDB4NzAzNCwgMHhkMDhjLCAweDExNDAsIDB4MjAwMSwgMHhiNTBjLCAweDIwMGMsCisJMHhkMWFjLCAweDE5MDQsIDB4MjY3YiwgMHhjMWFkLCAweDIxMDIsIDB4MDAzNiwgMHg3M2NjLCAweDIwMTEsCisJMHg4MDEzLCAweDA4MGMsIDB4M2VjYywgMHgwMDNlLCAweDA4MDQsIDB4MjY3YiwgMHg3MDM0LCAweGQwOGMsCisJMHgxMTQwLCAweDIwMDEsIDB4YjUwYywgMHgyMDBjLCAweGQxYWMsIDB4MTkwNCwgMHgyNjdiLCAweGMxYWQsCisJMHgyMTAyLCAweDAwMzYsIDB4NzNjYywgMHgyMDExLCAweDgwMTMsIDB4MDgwYywgMHgzZWNjLCAweDAwM2UsCisJMHg3MTMwLCAweGMxODUsIDB4NzEzMiwgMHgyMDExLCAweGI1NTMsIDB4MjIwYywgMHhkMWE0LCAweDAxZDAsCisJMHgwMDE2LCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAxMDAsIDB4MDgwYywgMHg2YjFhLCAweDIwMTksCisJMHgwMDBlLCAweDA4MGMsIDB4YjA2NSwgMHhhNDg0LCAweDAwZmYsIDB4YTA4MCwgMHgyZGM0LCAweDIwMGQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHg4MTI3LCAweGEwMDYsIDB4MjAwOSwgMHgwMDBlLCAweDA4MGMsCisJMHhiMGU4LCAweDAwMWUsIDB4ZDFhYywgMHgxMTQ4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTksCisJMHgwMDA0LCAweDA4MGMsIDB4MmM2ZiwgMHgwMDFlLCAweDAwNzAsIDB4MDE1NiwgMHgyMGE5LCAweDAwN2YsCisJMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHg0ZmE5LCAweDExMTAsIDB4MDgwYywgMHg0YzBiLCAweDgxMDgsCisJMHgxZjA0LCAweDI2NzIsIDB4MDE1ZSwgMHgwMGNlLCAweDAwNGUsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsCisJMHg4MDc1LCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3ZjU5LCAweDAwMzYsCisJMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3ZmU0LCAweDAwM2UsIDB4NjBlMywgMHgwMDAwLCAweDAwMWUsCisJMHgyMDAxLCAweGI1MDAsIDB4MjAxNCwgMHhhMjk2LCAweDAwMDQsIDB4MTEyOCwgMHhkMTljLCAweDExYjAsCisJMHg2MjI4LCAweGMyOWQsIDB4NjIyYSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTIzLCAweDIwMDMsCisJMHgwMDAwLCAweDYwMjcsIDB4MDAyMCwgMHgwODBjLCAweDVhZjUsIDB4MTE0MCwgMHgwMDE2LCAweDIwMDksCisJMHgwN2QwLCAweDIwMTEsIDB4NTllNCwgMHgwODBjLCAweDZhMjIsIDB4MDAxZSwgMHhkMTk0LCAweDA5MDQsCisJMHgyNzY2LCAweDAwMTYsIDB4NjIyMCwgMHhkMmI0LCAweDA5MDQsIDB4MjcxNywgMHgwODBjLCAweDZhMTAsCisJMHgwODBjLCAweDdkN2EsIDB4NjAyNywgMHgwMDA0LCAweDAwZjYsIDB4MjAxOSwgMHhiN2U5LCAweDIzMDQsCisJMHhhMDdkLCAweDA1NzAsIDB4NzgwNCwgMHhhMDg2LCAweDAwMzIsIDB4MTU1MCwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMGU2LCAweDIwNjksIDB4MDE0MCwgMHg2MThjLCAweDYyODgsIDB4NzgxOCwgMHg2MDhlLCAweDc4MDgsCisJMHg2MDhhLCAweDYwNDMsIDB4MDAwMiwgMHgyMDAxLCAweDAwMDMsIDB4ODAwMSwgMHgxZGYwLCAweDYwNDMsCisJMHgwMDAwLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLCAweDAwMDAsIDB4NjE4ZSwgMHg2MjhhLCAweDA4MGMsCisJMHg3MDkwLCAweDA4MGMsIDB4NzE3MywgMHg3ODEwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDJmNjAsCisJMHgwODBjLCAweDg2MWQsIDB4MDBlZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBmZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMGZlLCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAxMjAsCisJMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDAwZGUsIDB4MDBjNiwgMHgyMDYxLCAweGI3ZTAsCisJMHg2MDI4LCAweGEwOWEsIDB4MDBjOCwgMHgxMjM4LCAweDgwMDAsIDB4NjAyYSwgMHgwMGNlLCAweDA4MGMsCisJMHg3ZDZkLCAweDA4MDQsIDB4Mjc2NSwgMHgyMDE5LCAweGI3ZTksIDB4MjMwNCwgMHhhMDY1LCAweDAxMjAsCisJMHgyMDA5LCAweDAwMjcsIDB4MDgwYywgMHg4NjRjLCAweDAwY2UsIDB4MDgwNCwgMHgyNzY1LCAweGQyYmMsCisJMHgwOTA0LCAweDI3NjUsIDB4MDgwYywgMHg2YTFkLCAweDYwMTQsIDB4YTA4NCwgMHgwMTg0LCAweGEwODUsCisJMHgwMDEwLCAweDYwMTYsIDB4NjAyNywgMHgwMDA0LCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDY4MDQsCisJMHhhMDg0LCAweDQwMDAsIDB4MDEyMCwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDAwZGUsCisJMHgwMGM2LCAweDIwNjEsIDB4YjdlMCwgMHg2MDQ0LCAweGEwOWEsIDB4MDBjOCwgMHgxMmYwLCAweDgwMDAsCisJMHg2MDQ2LCAweDYwM2MsIDB4MDBjZSwgMHhhMDA1LCAweDA1NDAsIDB4MjAwOSwgMHgwN2QwLCAweDA4MGMsCisJMHg2YTE1LCAweGEwODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODYsIDB4MDAwNiwgMHgxMTM4LCAweDYxMTQsCisJMHhhMThjLCAweDAxODQsIDB4YTE4ZCwgMHgwMDEyLCAweDYxMTYsIDB4MDBiOCwgMHg2MTE0LCAweGExOGMsCisJMHgwMTg0LCAweGExOGQsIDB4MDAxNiwgMHg2MTE2LCAweDAwODAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsCisJMHgwODBjLCAweDdmZTQsIDB4MDAzZSwgMHgyMDE5LCAweGI3ZWYsIDB4MjMwNCwgMHhhMDY1LCAweDAxMjAsCisJMHgyMDA5LCAweDAwNGYsIDB4MDgwYywgMHg4NjRjLCAweDAwY2UsIDB4MDAxZSwgMHhkMTljLCAweDA5MDQsCisJMHgyN2JmLCAweDcwMzQsIDB4ZDBhYywgMHgxNTYwLCAweDAwMTYsIDB4MDE1NiwgMHg2MDI3LCAweDAwMDgsCisJMHg2MDJmLCAweDAwMjAsIDB4MjBhOSwgMHgwMDA2LCAweDFkMDQsIDB4Mjc3NCwgMHgyMDkxLCAweDYwMDAsCisJMHgxZjA0LCAweDI3NzQsIDB4NjAyZiwgMHgwMDAwLCAweDYxNTAsIDB4YTE4NSwgMHgxNDAwLCAweDYwNTIsCisJMHgyMGE5LCAweDAzNjYsIDB4MWQwNCwgMHgyNzgyLCAweDIwOTEsIDB4NjAwMCwgMHg2MDIwLCAweGQwOWMsCisJMHgxMTMwLCAweDAxNWUsIDB4NjE1MiwgMHgwMDFlLCAweDYwMjcsIDB4MDAwOCwgMHgwNDgwLCAweDA4MGMsCisJMHgyOTA3LCAweDFmMDQsIDB4Mjc4MiwgMHgwMTVlLCAweDYxNTIsIDB4MDAxZSwgMHg2MDI3LCAweDAwMDgsCisJMHgwMDE2LCAweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDgwNzUsCisJMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgwMDM2LCAweDIwMTksCisJMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweGI0MmYsCisJMHgwODBjLCAweGI0NGEsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgyMDAxLCAweGI1MDAsCisJMHgyMDAzLCAweDAwMDQsIDB4NjAyNywgMHgwMDA4LCAweDA4MGMsIDB4MTJkZCwgMHgwMDFlLCAweGExOGMsCisJMHhmZmQwLCAweDYxMjYsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDAwZjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGI1MDAsIDB4NzFjNCwgMHg3MGM2LCAweGExMTYsCisJMHgwNTAwLCAweDgxZmYsIDB4MDEyOCwgMHgyMDExLCAweDgwMTEsIDB4MDgwYywgMHgzZWNjLCAweDAwYzgsCisJMHgyMDExLCAweDgwMTIsIDB4MDgwYywgMHgzZWNjLCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGQwZmMsCisJMHgxMTgwLCAweDAwMzYsIDB4MDBjNiwgMHgwODBjLCAweDI4OTIsIDB4MDgwYywgMHg3ZjM1LCAweDIwNjEsCisJMHgwMTAwLCAweDIwMTksIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYzZmLCAweDAwY2UsCisJMHgwMDNlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMGM2LCAweDAwZjYsIDB4MDAwNiwgMHgwMDI2LCAweDIwNjEsIDB4MDEwMCwgMHhhMTkwLCAweDI4MGIsCisJMHgyMjA1LCAweDYwZjIsIDB4MjAxMSwgMHgyODE4LCAweDIyMDUsIDB4NjBlZSwgMHgwMDJlLCAweDAwMGUsCisJMHgwMGZlLCAweDAwY2UsIDB4MDAwNSwgMHgwODQwLCAweDA4NDAsIDB4MDg0MCwgMHgwNTgwLCAweDA0MjAsCisJMHgwMzQ4LCAweDAyYzAsIDB4MDI1OCwgMHgwMjEwLCAweDAxYTgsIDB4MDFhOCwgMHgwMWE4LCAweDAxYTgsCisJMHgwMTQwLCAweDAwZjgsIDB4MDBkMCwgMHgwMGIwLCAweDAwYTAsIDB4MjAyOCwgMHhhMThjLCAweDAwZmYsCisJMHgyMTMwLCAweGEwOTQsIDB4ZmYwMCwgMHgxMTEwLCAweDgxZmYsIDB4MDExOCwgMHgwODBjLCAweDY2YjEsCisJMHgwMDM4LCAweGEwODAsIDB4MmRjNCwgMHgyMDBkLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGEwMDYsCisJMHgwMDA1LCAweGEwODAsIDB4MmRjNCwgMHgyMDBkLCAweGExOGMsIDB4MDBmZiwgMHgwMDA1LCAweDAwZDYsCisJMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHhiNTE1LCAweDIwMDMsIDB4MDBlZiwgMHgyMGE5LCAweDAwMTAsCisJMHhhMDA2LCAweDY4NTIsIDB4Njg1NiwgMHgxZjA0LCAweDI4NDIsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwMGQ2LCAweDAwMjYsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4YjUxNSwgMHgyMTAyLCAweDgxMTQsCisJMHg4MjE0LCAweDgyMTQsIDB4ODIxNCwgMHgyMGE5LCAweDAwMTAsIDB4Njg1MywgMHgwMDAwLCAweGEwMDYsCisJMHg4MmZmLCAweDExMjgsIDB4YTE4NCwgMHgwMDBmLCAweGEwODAsIDB4YjQ1ZSwgMHgyMDA1LCAweDY4NTYsCisJMHg4MjExLCAweDFmMDQsIDB4Mjg1NywgMHgwMDJlLCAweDAwZGUsIDB4MDAwZSwgMHgwMDA1LCAweDAwYzYsCisJMHgyMDYxLCAweGI1MDAsIDB4NjAzMCwgMHgwMTEwLCAweGMwOWQsIDB4MDAwOCwgMHhjMDljLCAweDYwMzIsCisJMHgwMGNlLCAweDAwMDUsIDB4MDE1NiwgMHgwMGQ2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDIwNjksCisJMHgwMTQwLCAweDY5ODAsIDB4YTExNiwgMHgwMTgwLCAweGExMTIsIDB4MTIzMCwgMHg4MjEyLCAweDgyMTAsCisJMHgyMmE4LCAweDIwMDEsIDB4MDQwMiwgMHgwMDE4LCAweDIyYTgsIDB4MjAwMSwgMHgwNDA0LCAweDY4MGUsCisJMHgxZjA0LCAweDI4ODcsIDB4NjgwZiwgMHgwMDAwLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwZGUsCisJMHgwMTVlLCAweDAwMDUsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTUwLCAweGQwYTQsCisJMHgwMTQwLCAweGEwMDYsIDB4MDA0NiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZSwgMHgwODBjLCAweGIwZTgsCisJMHgwMDRlLCAweDAwMDUsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA3OSwgMHgwMTQwLCAweDc4YzQsCisJMHhkMGRjLCAweDA1NDgsIDB4YTA4NCwgMHgwNzAwLCAweGEwOGUsIDB4MDMwMCwgMHgxNTIwLCAweDIwMTEsCisJMHgwMDAwLCAweDIwMDksIDB4MDAwMiwgMHgyMzAwLCAweGEwODAsIDB4MDAyMCwgMHgyMDE4LCAweDIzMDAsCisJMHgwODBjLCAweDZiNDAsIDB4MjAxMSwgMHgwMDMwLCAweDIyMDAsIDB4ODAwNywgMHhhMDg1LCAweDAwNGMsCisJMHg3OGMyLCAweDIwMDksIDB4MDIwNCwgMHgyMTBjLCAweDIyMDAsIDB4YTEwMCwgMHgyMDA5LCAweDAxMzgsCisJMHgyMDBhLCAweDA4MGMsIDB4NWFjZiwgMHgxMTE4LCAweDIwMDksIDB4Yjc4ZiwgMHgyMDBhLCAweDAwMmUsCisJMHgwMDFlLCAweDAwZmUsIDB4MDAwNSwgMHg3OGMzLCAweDAwMDAsIDB4MGNjOCwgMHgwMTI2LCAweDIwOTEsCisJMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDIwMDEsIDB4MDE3MCwgMHgyMDBjLCAweDgwMDAsCisJMHgyMDE0LCAweGExODQsIDB4MDAwMywgMHgwMTEwLCAweDA4MDQsIDB4MWIwNCwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweGEwODIsCisJMHgwMDA1LCAweDAwMGUsIDB4MDI2OCwgMHgyMDAxLCAweDAxNzAsIDB4MjAwYywgMHhhMThjLCAweDAwZmYsCisJMHhhMThlLCAweDAwNGMsIDB4MTEyOCwgMHgyMDBjLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDAwMTAsCisJMHgyMDA5LCAweDAwMDAsIDB4MjAwMSwgMHgwMjA0LCAweDIwMDQsIDB4YTEwOCwgMHgwMDA1LCAweDAwMDYsCisJMHgwMTU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LCAweGQwOGMsCisJMHgxMTEwLCAweDFmMDQsIDB4MjkwZSwgMHgwMGZlLCAweDAxNWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMGM2LCAweDAwMDYsIDB4MjA2MSwgMHgwMTAwLCAweDYwMzAsIDB4MDAwNiwgMHg2MDQ4LCAweDAwMDYsCisJMHg2MGU0LCAweDAwMDYsIDB4NjBlOCwgMHgwMDA2LCAweDYwNTAsIDB4MDAwNiwgMHg2MGYwLCAweDAwMDYsCisJMHg2MGVjLCAweDAwMDYsIDB4NjAwYywgMHgwMDA2LCAweDYwMDQsIDB4MDAwNiwgMHg2MDI4LCAweDAwMDYsCisJMHg2MGUwLCAweDAwMDYsIDB4NjAyZiwgMHgwMTAwLCAweDYwMmYsIDB4MDAwMCwgMHhlMDAwLCAweGUwMDAsCisJMHhlMDAwLCAweGUwMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMDBlLCAweDYwZTIsCisJMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LCAweDAwMGUsIDB4NjAwZSwgMHgwMDBlLCAweDYwZWUsCisJMHgwMDBlLCAweDYwZjIsIDB4MDAwZSwgMHg2MDUyLCAweDAwMGUsIDB4NjBlYSwgMHgwMDBlLCAweDYwZTYsCisJMHgwMDBlLCAweDYwNGEsIDB4MDAwZSwgMHg2MDMyLCAweDYwMzYsIDB4MjAwOCwgMHgwODBjLCAweDI4NDcsCisJMHgwMDBlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDksIDB4MDE3MSwgMHgyMTA0LCAweGQwZGMsCisJMHgwMTQwLCAweDIwMDksIDB4MDE3MCwgMHgyMTA0LCAweDIwMGIsIDB4MDA4MCwgMHhlMDAwLCAweGUwMDAsCisJMHgyMDBhLCAweDAwMDUsIDB4MjlmYSwgMHgyOWZlLCAweDJhMDIsIDB4MmEwOCwgMHgyYTBlLCAweDJhMTQsCisJMHgyYTFhLCAweDJhMjIsIDB4MmEyYSwgMHgyYTMwLCAweDJhMzYsIDB4MmEzZSwgMHgyYTQ2LCAweDJhNGUsCisJMHgyYTU2LCAweDJhNjAsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsCisJMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsCisJMHgyYTZhLCAweDJhNmEsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmE2YywgMHgyYTZjLCAweDJhNzIsIDB4MmE3MiwgMHgyYTc5LCAweDJhNzksCisJMHgyYTgwLCAweDJhODAsIDB4MmE4OSwgMHgyYTg5LCAweDJhOTAsIDB4MmE5MCwgMHgyYTk5LCAweDJhOTksCisJMHgyYWEyLCAweDJhYTIsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsCisJMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsCisJMHgyYTZhLCAweDJhNmEsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsIDB4MmFhZCwgMHgyYWFkLCAweDJhYWQsCisJMHgyYWFkLCAweDJhYWQsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsCisJMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsIDB4MmE2YSwgMHgyYTZhLCAweDJhNmEsCisJMHgyYTZhLCAweDJhNmEsIDB4MDEwNiwgMHgwMDA2LCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjUxOSwgMHgwODA0LCAweDJhYjUsCisJMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNTE5LCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODBjLCAweDIzOWMsIDB4MDgwNCwgMHgyYWI1LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIzOWMsCisJMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjUxOSwgMHgwODBjLCAweDIzOWMsCisJMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjUxOSwgMHgwODBjLCAweDIzOWMsCisJMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsCisJMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyM2YyLCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyM2YyLCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyM2YyLCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODBjLCAweDIzOWMsIDB4MDgwYywgMHgyM2YyLCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODBjLCAweDIzOWMsIDB4MDgwYywgMHgyM2YyLCAweDA4MDQsIDB4MmFiNSwgMHgwMTA2LCAweDAwMDYsCisJMHgwODBjLCAweDI1MTksIDB4MDgwYywgMHgyMzljLCAweDA4MGMsIDB4MjNmMiwgMHgwODA0LCAweDJhYjUsCisJMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNTE5LCAweDA4MGMsIDB4MjM5YywgMHgwODBjLCAweDIzZjIsCisJMHgwODA0LCAweDJhYjUsIDB4ZTAwMCwgMHgwY2YwLCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI4ZDYsCisJMHgwODA0LCAweDJhYjUsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjhkNiwgMHgwODBjLCAweDI1MTksCisJMHgwNGUwLCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI4ZDYsIDB4MDgwYywgMHgyMzljLCAweDA0YTgsCisJMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyOGQ2LCAweDA4MGMsIDB4MjUxOSwgMHgwODBjLCAweDIzOWMsCisJMHgwNDYwLCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI4ZDYsIDB4MDgwYywgMHgyM2YyLCAweDA0MjgsCisJMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyOGQ2LCAweDA4MGMsIDB4MjUxOSwgMHgwODBjLCAweDIzZjIsCisJMHgwMGUwLCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI4ZDYsIDB4MDgwYywgMHgyMzljLCAweDA4MGMsCisJMHgyM2YyLCAweDAwOTgsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjhkNiwgMHgwODBjLCAweDI1MTksCisJMHgwODBjLCAweDIzOWMsIDB4MDgwYywgMHgyM2YyLCAweDAwNDAsIDB4MjBkMSwgMHgwMDAwLCAweDIwZDEsCisJMHgwMDAxLCAweDIwZDEsIDB4MDAwMCwgMHgwODBjLCAweDE1MTUsIDB4MDAwZSwgMHgwMTBlLCAweDAwMGQsCisJMHgwMGM2LCAweDAwMjYsIDB4MDA0NiwgMHgyMDIxLCAweDAwMDAsIDB4MDgwYywgMHg1MzA5LCAweDE5MDQsCisJMHgyYjk1LCAweDcyZDQsIDB4MjAwMSwgMHhiNzllLCAweDIwMDQsIDB4YTAwNSwgMHgxMTEwLCAweGQyOWMsCisJMHgwMTQ4LCAweGQyODQsIDB4MTEzOCwgMHhkMmJjLCAweDE5MDQsIDB4MmI5NSwgMHgwODBjLCAweDJiOTksCisJMHgwODA0LCAweDJiOTUsIDB4ZDJjYywgMHgxOTA0LCAweDJiOTUsIDB4MDgwYywgMHg1YWNmLCAweDExMjAsCisJMHg3MDlmLCAweGZmZmYsIDB4MDgwNCwgMHgyYjk1LCAweGQyOTQsIDB4MDEyMCwgMHg3MDlmLCAweGZmZmYsCisJMHgwODA0LCAweDJiOTUsIDB4MjAwMSwgMHhiNTE1LCAweDIwM2MsIDB4NzI4OCwgMHhkMjg0LCAweDA5MDQsCisJMHgyYjM3LCAweGQyOGMsIDB4MTkwNCwgMHgyYjM3LCAweDAwMzYsIDB4NzM5YywgMHhhMzhlLCAweGZmZmYsCisJMHgxMTEwLCAweDIwMTksIDB4MDAwMSwgMHg4MzE0LCAweGEyZTAsIDB4YmNjMCwgMHgyYzA0LCAweGEzOGMsCisJMHgwMDAxLCAweDAxMjAsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4MDAxMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhNzBlLCAweDA1NjAsIDB4YTA4ZSwgMHgwMDAwLCAweDA1NDgsIDB4YTA4ZSwgMHgwMGZmLCAweDExNTAsCisJMHg3MjMwLCAweGQyODQsIDB4MTUzOCwgMHg3Mjg4LCAweGMyOGQsIDB4NzI4YSwgMHg3MDlmLCAweGZmZmYsCisJMHgwMDNlLCAweDA0MjgsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MjgxZCwgMHgwODBjLCAweDRmNGQsCisJMHgxMWI4LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTUwLCAweDcwMzAsCisJMHhkMDhjLCAweDAxMTgsIDB4NjAwMCwgMHhkMGJjLCAweDAxMjAsIDB4MDgwYywgMHgyYmFjLCAweDAxNDAsCisJMHgwMDI4LCAweDA4MGMsIDB4MmNkZCwgMHgwODBjLCAweDJiZGEsIDB4MDExMCwgMHg4MzE4LCAweDA4MTgsCisJMHg3MzllLCAweDAwMTAsIDB4NzA5ZiwgMHhmZmZmLCAweDAwM2UsIDB4MDgwNCwgMHgyYjk1LCAweGE3ODAsCisJMHgyZGM0LCAweDIwM2QsIDB4YTdiYywgMHhmZjAwLCAweDg3M2YsIDB4MjA0MSwgMHgwMDdlLCAweDcwOWMsCisJMHhhMDk2LCAweGZmZmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDAsIDB4MjhhOCwgMHgwMDUwLCAweGE4MTIsCisJMHgwMjIwLCAweDIwMDgsIDB4YTgwMiwgMHgyMGE4LCAweDAwMjAsIDB4NzA5ZiwgMHhmZmZmLCAweDA4MDQsCisJMHgyYjk1LCAweDI3MDAsIDB4MDE1NiwgMHgwMDE2LCAweGExMDYsIDB4MDVhMCwgMHhjNDg0LCAweDA4MGMsCisJMHg0ZmE5LCAweDAxMjAsIDB4MDgwYywgMHg0ZjRkLCAweDE1YTgsIDB4MDAwOCwgMHhjNDg1LCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExMzAsIDB4NzAzMCwgMHhkMDhjLCAweDAxZTgsCisJMHg2MDAwLCAweGQwYmMsIDB4MTFkMCwgMHg3Mjg4LCAweGQyOGMsIDB4MDE4OCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwMmIwLCAweGQ0ODQsIDB4MTExOCwgMHgwODBjLCAweDRmNmMsCisJMHgwMDI4LCAweDA4MGMsIDB4MmQ2YSwgMHgwMTcwLCAweDA4MGMsIDB4MmQ5NywgMHgwMDU4LCAweDA4MGMsCisJMHgyY2RkLCAweDA4MGMsIDB4MmJkYSwgMHgwMTcwLCAweDAwMjgsIDB4MDgwYywgMHgyZDZhLCAweDAxMTAsCisJMHgwNDE5LCAweDAxNDAsIDB4MDAxZSwgMHg4MTA4LCAweDAxNWUsIDB4MWYwNCwgMHgyYjUxLCAweDcwOWYsCisJMHhmZmZmLCAweDAwMTgsIDB4MDAxZSwgMHgwMTVlLCAweDcxOWUsIDB4MDA0ZSwgMHgwMDJlLCAweDAwY2UsCisJMHgwMDA1LCAweDAwYzYsIDB4MDAxNiwgMHg3MDlmLCAweDAwMDEsIDB4MjAwOSwgMHgwMDdlLCAweDA4MGMsCisJMHg0ZjRkLCAweDExMzgsIDB4MDgwYywgMHgyY2RkLCAweDA0YTksIDB4MDExOCwgMHg3MGQ0LCAweGMwYmQsCisJMHg3MGQ2LCAweDAwMWUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsCisJMHgyYzY4LCAweDIwMDEsIDB4YjU1NywgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDA4MGMsCisJMHg5ZWQ2LCAweDAxZDgsIDB4MmQwMCwgMHg2MDFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDEsCisJMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRlZmQsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDk4LCAweDgwMDAsIDB4NzA5YSwgMHgwMTJlLCAweDIwMDksCisJMHgwMDA0LCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsCisJMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwgMHgyYzY4LCAweDIwMDEsCisJMHhiNTU3LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDY4NDIsIDB4MDgwYywgMHg5ZWQ2LCAweDA1NTAsCisJMHgyZDAwLCAweDYwMWEsIDB4NjgwMCwgMHhjMGM0LCAweDY4MDIsIDB4NjhhMCwgMHhhMDg2LCAweDAwN2UsCisJMHgwMTQwLCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTEwLCAweDA4MGMsCisJMHgyYzljLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsCisJMHg0ZWViLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDRlZmQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg3MDk4LCAweDgwMDAsIDB4NzA5YSwgMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweDg2NGMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMDI2LCAweDIwMDksIDB4MDA4MCwgMHgwODBjLCAweDRmNGQsIDB4MTEyMCwgMHgwMDMxLCAweDAxMTAsCisJMHg3MGRiLCAweGZmZmYsIDB4MDAyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDc2LCAweDAwZDYsCisJMHgwMGM2LCAweDJjNjgsIDB4MDgwYywgMHg4NWM3LCAweDAxZTgsIDB4MmQwMCwgMHg2MDFhLCAweDA4MGMsCisJMHhhMDI3LCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLCAweDIwMDEsCisJMHgwMDAyLCAweDA4MGMsIDB4NGVmZCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDJjOWMsCisJMHg3MGRjLCAweDgwMDAsIDB4NzBkZSwgMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweDg2NGMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLCAweDRmNGQsCisJMHgxMTkwLCAweDJjNjgsIDB4MDgwYywgMHg4NWM3LCAweDAxNzAsIDB4MmQwMCwgMHg2MDFhLCAweDYzMTIsCisJMHg2MDFmLCAweDAwMDEsIDB4NjIwYSwgMHgwODBjLCAweGEwMjcsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsCisJMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZTYsCisJMHgwMGM2LCAweDAwNjYsIDB4MDAzNiwgMHgwMDI2LCAweDA4MGMsIDB4NmUwMSwgMHgwODBjLCAweDZkYTQsCisJMHgwODBjLCAweDkwNmYsIDB4MjEzMCwgMHg4MWZmLCAweDAxMjgsIDB4MjBhOSwgMHgwMDdlLCAweDIwMDksCisJMHgwMDAwLCAweDAwMjAsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsCisJMHg0ZmE5LCAweDExMjAsIDB4MDgwYywgMHg1MWFhLCAweDA4MGMsIDB4NGMwYiwgMHgwMDFlLCAweDgxMDgsCisJMHgxZjA0LCAweDJjODYsIDB4ODZmZiwgMHgxMTEwLCAweDA4MGMsIDB4MTFmMCwgMHgwMDJlLCAweDAwM2UsCisJMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMjYsCisJMHgwMDE2LCAweDYyMTgsIDB4MjI3MCwgMHg3MmEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsCisJMHg2ZGY1LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NmQwMiwgMHgyYzA4LCAweDA4MGMsCisJMHhhZTgyLCAweDAwN2UsIDB4MDAxZSwgMHgyZTYwLCAweDA4MGMsIDB4NTFhYSwgMHg2MjEwLCAweDYzMTQsCisJMHgwODBjLCAweDRjMGIsIDB4NjIxMiwgMHg2MzE2LCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwY2UsCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg2LCAweDAwODAsIDB4MDE1MCwgMHgyMDcxLCAweGI1MDAsIDB4NzA5OCwgMHhhMDA1LCAweDAxMTAsCisJMHg4MDAxLCAweDcwOWEsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHhiNTAwLCAweDcwZGMsCisJMHhhMDA1LCAweDBkYzAsIDB4ODAwMSwgMHg3MGRlLCAweDBjYTgsIDB4NjAwMCwgMHhjMDhjLCAweDYwMDIsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAxNTYsCisJMHgyMTc4LCAweDgxZmYsIDB4MTExOCwgMHgyMGE5LCAweDAwMDEsIDB4MDA5OCwgMHgyMDAxLCAweGI1NTMsCisJMHgyMDA0LCAweGQwYzQsIDB4MDE1MCwgMHhkMGE0LCAweDAxNDAsIDB4YTAwNiwgMHgwMDQ2LCAweDIwMjAsCisJMHgyMDA5LCAweDAwMmQsIDB4MDgwYywgMHhiMGU4LCAweDAwNGUsIDB4MjBhOSwgMHgwMGZmLCAweDIwMTEsCisJMHgwMDAwLCAweDAwMjYsIDB4YTI4ZSwgMHgwMDdlLCAweDA5MDQsIDB4MmQ0OSwgMHhhMjhlLCAweDAwN2YsCisJMHgwOTA0LCAweDJkNDksIDB4YTI4ZSwgMHgwMDgwLCAweDA1ZTAsIDB4YTI4OCwgMHhiNjM1LCAweDIxMGMsCisJMHg4MWZmLCAweDA1YjgsIDB4OGZmZiwgMHgxMTQ4LCAweDIwMDEsIDB4YjdiZSwgMHgwMDA2LCAweDIwMDMsCisJMHgwMDAxLCAweDA0ZDksIDB4MDAwZSwgMHgyMDAzLCAweDAwMDAsIDB4MDBjNiwgMHgyMTYwLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4NTMxMywgMHgwMGNlLCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDZkZjUsCisJMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDZkMDIsIDB4MDBjNiwgMHgwMDI2LCAweDIxNjAsCisJMHg2MjA0LCAweGEyOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDYsIDB4MTExOCwgMHg2MDA3LCAweDA0MDQsCisJMHgwMDI4LCAweDIwMDEsIDB4MDAwNCwgMHg4MDA3LCAweGEyMTUsIDB4NjIwNiwgMHgwMDJlLCAweDAwY2UsCisJMHgwMDE2LCAweDJjMDgsIDB4MDgwYywgMHhhZTgyLCAweDAwMWUsIDB4MDA3ZSwgMHgyMTYwLCAweDA4MGMsCisJMHg1MWFhLCAweDAwMmUsIDB4ODIxMCwgMHgxZjA0LCAweDJkMDEsIDB4MDE1ZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMDNlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA0NiwgMHgwMDI2LCAweDAwMTYsCisJMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGM0LCAweDAxNDgsIDB4ZDBhNCwgMHgwMTM4LCAweGEwMDYsCisJMHgyMjIwLCAweDg0MjcsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4YjBlOCwgMHgwMDFlLCAweDAwMmUsCisJMHgwMDRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHg3Mjg4LCAweDgyZmYsCisJMHgwMWY4LCAweDIwMTEsIDB4YjU1MywgMHgyMjE0LCAweGQyYWMsIDB4MTFkMCwgMHgyMTAwLCAweDA4MGMsCisJMHgyODMxLCAweDgxZmYsIDB4MDFiOCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHhhMmUwLCAweGJjYzAsCisJMHgyYzA0LCAweGQzODQsIDB4MDEyMCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMDEwLCAweGEwODQsCisJMHgwMGZmLCAweGExMTYsIDB4MDEzOCwgMHhhMDk2LCAweDAwZmYsIDB4MDExMCwgMHg4MzE4LCAweDBjNjgsCisJMHhhMDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIxMTAsCisJMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDgyOTksIDB4MDAyZSwgMHgwODBjLCAweGIzOGQsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHhhMTgwLCAweGI2MzUsIDB4MjAwNCwgMHhhMDY1LCAweDAxNTgsCisJMHgwMDE2LCAweDAwYzYsIDB4MjA2MSwgMHhiOGY0LCAweDAwMWUsIDB4NjExYSwgMHgwODBjLCAweDJjOWMsCisJMHgwMDFlLCAweDA4MGMsIDB4NGY2YywgMHgwMTJlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDEsCisJMHhiNTM1LCAweDIwMDQsIDB4ZDBjYywgMHgwMDA1LCAweDdlZWYsIDB4N2RlOCwgMHg3Y2U0LCAweDgwZTIsCisJMHg3YmUxLCAweDgwZTAsIDB4ODBkYywgMHg4MGRhLCAweDdhZDksIDB4ODBkNiwgMHg4MGQ1LCAweDgwZDQsCisJMHg4MGQzLCAweDgwZDIsIDB4ODBkMSwgMHg3OWNlLCAweDc4Y2QsIDB4ODBjYywgMHg4MGNiLCAweDgwY2EsCisJMHg4MGM5LCAweDgwYzcsIDB4ODBjNiwgMHg3N2M1LCAweDc2YzMsIDB4ODBiYywgMHg4MGJhLCAweDc1YjksCisJMHg4MGI2LCAweDc0YjUsIDB4NzNiNCwgMHg3MmIzLCAweDgwYjIsIDB4ODBiMSwgMHg4MGFlLCAweDcxYWQsCisJMHg4MGFjLCAweDcwYWIsIDB4NmZhYSwgMHg2ZWE5LCAweDgwYTcsIDB4NmRhNiwgMHg2Y2E1LCAweDZiYTMsCisJMHg2YTlmLCAweDY5OWUsIDB4Njg5ZCwgMHg4MDliLCAweDgwOTgsIDB4Njc5NywgMHg2NjkwLCAweDY1OGYsCisJMHg2NDg4LCAweDYzODQsIDB4NjI4MiwgMHg4MDgxLCAweDgwODAsIDB4NjE3YywgMHg2MDdhLCAweDgwNzksCisJMHg1Zjc2LCAweDgwNzUsIDB4ODA3NCwgMHg4MDczLCAweDgwNzIsIDB4ODA3MSwgMHg4MDZlLCAweDVlNmQsCisJMHg4MDZjLCAweDVkNmIsIDB4NWM2YSwgMHg1YjY5LCAweDgwNjcsIDB4NWE2NiwgMHg1OTY1LCAweDU4NjMsCisJMHg1NzVjLCAweDU2NWEsIDB4NTU1OSwgMHg4MDU2LCAweDgwNTUsIDB4NTQ1NCwgMHg1MzUzLCAweDUyNTIsCisJMHg1MTUxLCAweDUwNGUsIDB4NGY0ZCwgMHg4MDRjLCAweDgwNGIsIDB4NGU0YSwgMHg0ZDQ5LCAweDgwNDcsCisJMHg0YzQ2LCAweDgwNDUsIDB4ODA0MywgMHg4MDNjLCAweDgwM2EsIDB4ODAzOSwgMHg4MDM2LCAweDRiMzUsCisJMHg4MDM0LCAweDRhMzMsIDB4NDkzMiwgMHg0ODMxLCAweDgwMmUsIDB4NDcyZCwgMHg0NjJjLCAweDQ1MmIsCisJMHg0NDJhLCAweDQzMjksIDB4NDIyNywgMHg4MDI2LCAweDgwMjUsIDB4NDEyMywgMHg0MDFmLCAweDNmMWUsCisJMHgzZTFkLCAweDNkMWIsIDB4M2MxOCwgMHg4MDE3LCAweDgwMTAsIDB4M2IwZiwgMHgzYTA4LCAweDgwMDQsCisJMHgzOTAyLCAweDgwMDEsIDB4ODAwMCwgMHg4MDAwLCAweDM4MDAsIDB4MzcwMCwgMHgzNjAwLCAweDgwMDAsCisJMHgzNTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDM0MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzMzAwLCAweDMyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzMTAwLCAweDMwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDJmMDAsCisJMHg4MDAwLCAweDJlMDAsIDB4MmQwMCwgMHgyYzAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDJiMDAsCisJMHg4MDAwLCAweDJhMDAsIDB4MjkwMCwgMHgyODAwLCAweDgwMDAsIDB4MjcwMCwgMHgyNjAwLCAweDI1MDAsCisJMHgyNDAwLCAweDIzMDAsIDB4MjIwMCwgMHg4MDAwLCAweDgwMDAsIDB4MjEwMCwgMHgyMDAwLCAweDFmMDAsCisJMHgxZTAwLCAweDFkMDAsIDB4MWMwMCwgMHg4MDAwLCAweDgwMDAsIDB4MWIwMCwgMHgxYTAwLCAweDgwMDAsCisJMHgxOTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDE4MDAsCisJMHg4MDAwLCAweDE3MDAsIDB4MTYwMCwgMHgxNTAwLCAweDgwMDAsIDB4MTQwMCwgMHgxMzAwLCAweDEyMDAsCisJMHgxMTAwLCAweDEwMDAsIDB4MGYwMCwgMHg4MDAwLCAweDgwMDAsIDB4MGUwMCwgMHgwZDAwLCAweDBjMDAsCisJMHgwYjAwLCAweDBhMDAsIDB4MDkwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDgwMCwgMHgwNzAwLCAweDgwMDAsCisJMHgwNjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDA1MDAsIDB4MDQwMCwgMHgwMzAwLCAweDgwMDAsCisJMHgwMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDAxMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDIwNzEsIDB4YjU4MiwgMHg3MDAzLCAweDAwMDIsCisJMHhhMDA2LCAweDcwMTIsIDB4NzAxNiwgMHg3MDNhLCAweDcwM2UsIDB4NzAzMywgMHhiNTkyLCAweDcwMzcsCisJMHhiNTkyLCAweDcwMDcsIDB4MDAwMSwgMHgyMDYxLCAweGI1ZDIsIDB4NjAwMywgMHgwMDAyLCAweDAwMDUsCisJMHgxMDA0LCAweDJlZWEsIDB4MGUwNCwgMHgyZWVhLCAweDIwNzEsIDB4YjU4MiwgMHgyYjc4LCAweDc4MTgsCisJMHhkMDg0LCAweDExNDAsIDB4MmE2MCwgMHg3ODIwLCAweGEwOGUsIDB4MDA2OSwgMHgxOTA0LCAweDJmY2YsCisJMHgwODA0LCAweDJmNjgsIDB4MDAwNSwgMHgyMDcxLCAweGI1ODIsIDB4NzAwNCwgMHgwMDAyLCAweDJlZjMsCisJMHgyZWY0LCAweDJlZmQsIDB4MmYwZSwgMHgwMDA1LCAweDEwMDQsIDB4MmVmYywgMHgwZTA0LCAweDJlZmMsCisJMHgyYjc4LCAweDc4MTgsIDB4ZDA4NCwgMHgwMWU4LCAweDAwMDUsIDB4MmI3OCwgMHgyMDYxLCAweGI1ZDIsCisJMHg2MDA4LCAweGEwOGUsIDB4MDEwMCwgMHgwMTI4LCAweGEwODYsIDB4MDIwMCwgMHgwOTA0LCAweDJmYzksCisJMHgwMDA1LCAweDcwMTQsIDB4MjA2OCwgMHgyYTYwLCAweDcwMTgsIDB4MDgwNywgMHg3MDEwLCAweDIwNjgsCisJMHg2ODM0LCAweGEwODYsIDB4MDEwMywgMHgwMTA4LCAweDAwMDUsIDB4MmE2MCwgMHgyYjc4LCAweDcwMTgsCisJMHgwODA3LCAweDJhNjAsIDB4NzgyMCwgMHhhMDhhLCAweDAwNDAsIDB4MTIxMCwgMHg2MWM0LCAweDAwNDIsCisJMHgyMTAwLCAweGEwOGEsIDB4MDAzZiwgMHgxYTA0LCAweDJmYzYsIDB4NjFjNCwgMHgwODA0LCAweDJmNjgsCisJMHgyZmFhLCAweDJmZDUsIDB4MmZkZCwgMHgyZmUxLCAweDJmZTksIDB4MmZlZiwgMHgyZmYzLCAweDJmZmYsCisJMHgzMDAyLCAweDMwMGMsIDB4MzAwZiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgzMDEyLCAweDJmYzYsCisJMHgzMDIxLCAweDMwMzgsIDB4MzA0ZiwgMHgzMGM5LCAweDMwY2UsIDB4MzBmNywgMHgzMTQ4LCAweDMxNTksCisJMHgzMTc4LCAweDMxYjAsIDB4MzFiYSwgMHgzMWM3LCAweDMxZGEsIDB4MzFmYiwgMHgzMjA0LCAweDMyM2EsCisJMHgzMjQwLCAweDJmYzYsIDB4MzI2OSwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsCisJMHgzMjcwLCAweDMyN2EsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsCisJMHgyZmM2LCAweDJmYzYsIDB4MzI4MiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsCisJMHgzMjk0LCAweDMyOWUsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsCisJMHgwMDAyLCAweDMyYzgsIDB4MzMxYywgMHgzMzc3LCAweDMzOTEsIDB4MmZjNiwgMHgzM2MyLCAweDM3ZjUsCisJMHg0MjMzLCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDJmYzYsCisJMHgyZmM2LCAweDMwMGMsIDB4MzAwZiwgMHgzN2Y3LCAweDJmYzYsIDB4MzgwNCwgMHg0MmNjLCAweDQzMjcsCisJMHg0MzhiLCAweDJmYzYsIDB4NDNlZSwgMHg0NDE4LCAweDQ0MzcsIDB4NDQ2OSwgMHgyZmM2LCAweDJmYzYsCisJMHgyZmM2LCAweDM4MDgsIDB4MzlhZCwgMHgzOWM3LCAweDM5ZTUsIDB4M2E0NiwgMHgzYWE2LCAweDNhYjEsCisJMHgzYWU5LCAweDNhZjgsIDB4M2IwNywgMHgzYjBhLCAweDNiMmQsIDB4M2I3OSwgMHgzYmVmLCAweDNiZmMsCisJMHgzY2ZkLCAweDNlMjMsIDB4M2U0YywgMHgzZjRhLCAweDNmNmMsIDB4M2Y3OCwgMHgzZmIxLCAweDQwNzUsCisJMHgyZmM2LCAweDJmYzYsIDB4MmZjNiwgMHgyZmM2LCAweDQwZGQsIDB4NDBmOCwgMHg0MTZhLCAweDQyMWMsCisJMHg3MTNjLCAweDAwMDAsIDB4MjAyMSwgMHg0MDAwLCAweDA4MGMsIDB4M2VhOSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDBlMDQsIDB4MmZiNiwgMHg3ODE4LCAweGQwODQsIDB4MDExMCwgMHgwMTJlLCAweDBjYjAsCisJMHg3YzIyLCAweDc5MjYsIDB4N2EyYSwgMHg3YjJlLCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDAxMmUsIDB4MDAwNSwgMHgyMDIxLCAweDQwMDEsCisJMHgwYzE4LCAweDIwMjEsIDB4NDAwMiwgMHgwYzAwLCAweDIwMjEsIDB4NDAwMywgMHgwOGU4LCAweDIwMjEsCisJMHg0MDA1LCAweDA4ZDAsIDB4MjAyMSwgMHg0MDA2LCAweDA4YjgsIDB4YTAyZSwgMHgyNTIwLCAweDdiMjgsCisJMHg3YTJjLCAweDc4MjQsIDB4NzkzMCwgMHgwODA0LCAweDNlYjYsIDB4NzgyMywgMHgwMDA0LCAweDc4MjQsCisJMHgwODA3LCAweGEwMmUsIDB4MjUyMCwgMHg3YjI4LCAweDdhMmMsIDB4NzgyNCwgMHg3OTMwLCAweDA4MDQsCisJMHgzZWI5LCAweDc5MjQsIDB4NzgyOCwgMHgyMTE0LCAweDIwMGEsIDB4MDgwNCwgMHgyZmFhLCAweDc5MjQsCisJMHgyMTE0LCAweDA4MDQsIDB4MmZhYSwgMHgyMDk5LCAweDAwMDksIDB4MjBhMSwgMHgwMDA5LCAweDIwYTksCisJMHgwMDA3LCAweDUzYTMsIDB4NzkyNCwgMHg3YTI4LCAweDdiMmMsIDB4MDgwNCwgMHgyZmFhLCAweDc4MjQsCisJMHgyMDYwLCAweDAwOTAsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LCAweDAwMDYsCisJMHg3ODNiLCAweDAwMTcsIDB4MDgwNCwgMHgyZmFhLCAweDdkMzgsIDB4N2MzYywgMHgwODQwLCAweDdkMzgsCisJMHg3YzNjLCAweDA4ODgsIDB4MjA2MSwgMHgxMDAwLCAweGUxMGMsIDB4YTAwNiwgMHgyYzE1LCAweGEyMDAsCisJMHg4YzYwLCAweDgxMDksIDB4MWRkOCwgMHgyMDEwLCAweGEwMDUsIDB4MDkwNCwgMHgyZmFhLCAweDA4MDQsCisJMHgyZmNjLCAweDIwNjksIDB4YjU1MiwgMHg3ODI0LCAweDc5MzAsIDB4YTExYSwgMHgxYTA0LCAweDJmZDIsCisJMHg4MDE5LCAweDA5MDQsIDB4MmZkMiwgMHg2ODRhLCAweDY5NDIsIDB4NzgyYywgMHg2ODUyLCAweDc4MjgsCisJMHg2ODU2LCAweGEwMDYsIDB4Njg1YSwgMHg2ODVlLCAweDA4MGMsIDB4NWRhNSwgMHgwODA0LCAweDJmYWEsCisJMHgyMDY5LCAweGI1NTIsIDB4NzgyNCwgMHg3OTM0LCAweGExMWEsIDB4MWEwNCwgMHgyZmQyLCAweDgwMTksCisJMHgwOTA0LCAweDJmZDIsIDB4Njg0ZSwgMHg2OTQ2LCAweDc4MmMsIDB4Njg2MiwgMHg3ODI4LCAweDY4NjYsCisJMHhhMDA2LCAweDY4NmEsIDB4Njg2ZSwgMHgwODBjLCAweDUzZDUsIDB4MDgwNCwgMHgyZmFhLCAweGEwMmUsCisJMHgyNTIwLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDc5MjQsIDB4N2IyOCwgMHg3YTJjLCAweDIwYTksCisJMHgwMDA1LCAweDIwYTEsIDB4YjU4OSwgMHg0MWExLCAweDA4MGMsIDB4M2U3NSwgMHgwOTA0LCAweDJmY2YsCisJMHgyMDA5LCAweDAwMjAsIDB4MDgwYywgMHgzZWI2LCAweDcwMWIsIDB4MzA2NywgMHgwMDA1LCAweDY4MzQsCisJMHgyMDA4LCAweGEwODQsIDB4MDBmZiwgMHhhMDk2LCAweDAwMTEsIDB4MDEzOCwgMHhhMDk2LCAweDAwMTksCisJMHgwMTIwLCAweGEwOTYsIDB4MDAxNSwgMHgxOTA0LCAweDJmY2YsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsCisJMHgwOTA0LCAweDJmY2YsIDB4NzEwZSwgMHg3MDBjLCAweDgwMDEsIDB4MDUyOCwgMHg3MDBlLCAweDA4MGMsCisJMHgzZTc1LCAweDA5MDQsIDB4MmZjZiwgMHgyMDA5LCAweDAwMjAsIDB4MjA2MSwgMHhiNWQyLCAweDYyMjQsCisJMHg2MzI4LCAweDY0MmMsIDB4NjUzMCwgMHhhMjkwLCAweDAwNDAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsCisJMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHgwODBjLCAweDNlYjYsIDB4NzAxYiwgMHgzMDk4LCAweDAwMDUsCisJMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDk2LCAweDAwMDIsIDB4MDEyMCwgMHhhMDk2LCAweDAwMGEsCisJMHgxOTA0LCAweDJmY2YsIDB4MDhjMCwgMHg3MDEwLCAweDIwNjgsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHgwODBjLCAweDRlNDksIDB4MTEyOCwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzMGIyLCAweDAwMDUsCisJMHgwODBjLCAweDU0ZGIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjBhOSwgMHgwMDA1LCAweDIwOTksCisJMHhiNTg5LCAweDUzMGEsIDB4MjEwMCwgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsCisJMHhhNWE5LCAweDAwMDAsIDB4YWQ4MCwgMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgwMTJlLCAweDA4MDQsCisJMHgzZWI5LCAweDYxYWMsIDB4NzgyNCwgMHg2MGFlLCAweDA4MDQsIDB4MmZhYSwgMHgyMDkxLCAweDgwMDAsCisJMHg3ODIzLCAweDQwMDAsIDB4NzgyNywgMHg0OTUzLCAweDc4MmIsIDB4NTAyMCwgMHg3ODJmLCAweDIwMjAsCisJMHgyMDA5LCAweDAxN2YsIDB4MjEwNCwgMHg3ODMyLCAweDNmMDAsIDB4NzgzNiwgMHgyMDYxLCAweDAxMDAsCisJMHg2MjAwLCAweDIwNjEsIDB4MDIwMCwgMHg2MDNjLCAweDgwMDcsIDB4YTIwNSwgMHg3ODNhLCAweDIwMDksCisJMHgwNGZkLCAweDIxMDQsIDB4NzgzZSwgMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsCisJMHg0MDgwLCAweDIwNzEsIDB4MDAxMCwgMHgyMGMxLCAweDAwZjAsIDB4MDgwNCwgMHgwNDI3LCAweDgxZmYsCisJMHgxOTA0LCAweDJmY2YsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgwODBjLCAweDRmYTksCisJMHgxOTA0LCAweDJmZDIsIDB4N2UzOCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAyMTAsCisJMHgwODA0LCAweDJmZDIsIDB4N2MyOCwgMHg3ZDJjLCAweDA4MGMsIDB4NTE3MSwgMHhkMjhjLCAweDExMTgsCisJMHgwODBjLCAweDUxMWEsIDB4MDAxMCwgMHgwODBjLCAweDUxNGEsIDB4MTUxOCwgMHgyMDYxLCAweGJkMDAsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDYwMTAsCisJMHhhMDZkLCAweDAxMzAsIDB4NjgzYywgMHhhNDA2LCAweDExMTgsIDB4Njg0MCwgMHhhNTA2LCAweDAxNTAsCisJMHgwMTJlLCAweGFjZTAsIDB4MDAxOCwgMHgyMDAxLCAweGI1MTcsIDB4MjAwNCwgMHhhYzAyLCAweDFhMDQsCisJMHgyZmNmLCAweDBjMzAsIDB4MDgwYywgMHg5OTJhLCAweDAxMmUsIDB4MDkwNCwgMHgyZmNmLCAweDA4MDQsCisJMHgyZmFhLCAweGEwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NTRkYiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4OWVkMiwgMHgwODBjLCAweDU0MDgsIDB4MDEyZSwgMHgwODA0LCAweDJmYWEsCisJMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsCisJMHg1MDZmLCAweDA5MDQsIDB4MmZjZiwgMHgwODBjLCAweDUxN2QsIDB4MDkwNCwgMHgyZmNmLCAweDA4MDQsCisJMHgyZmFhLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4M2U5YSwgMHgwOTA0LCAweDJmZDIsCisJMHgwODBjLCAweDUxZTksIDB4MDkwNCwgMHgyZmNmLCAweDIwMTksIDB4MDAwNSwgMHg3OTI0LCAweDA4MGMsCisJMHg1MTk4LCAweDA5MDQsIDB4MmZjZiwgMHg3ODI4LCAweGEwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDJmZDIsCisJMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDA4MGMsIDB4NjlhOCwgMHgwODA0LCAweDJmYWEsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAxMTgsIDB4MjAwOSwgMHgwMDAxLCAweDA0NTAsCisJMHgyMDI5LCAweDAwZmYsIDB4NjQ1MCwgMHgyNDAwLCAweGE1MDYsIDB4MDFmOCwgMHgyNTA4LCAweDA4MGMsCisJMHg0ZmE5LCAweDExZDgsIDB4MDgwYywgMHg1MWU5LCAweDExMjgsIDB4MjAwOSwgMHgwMDAyLCAweDYyYjQsCisJMHgyNTE4LCAweDAwYzAsIDB4MjAxOSwgMHgwMDA0LCAweGEwMGUsIDB4MDgwYywgMHg1MTk4LCAweDExMTgsCisJMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHg3ODI0LCAweGEwOGEsIDB4MTAwMCwgMHgxMjcwLCAweDgwMDMsCisJMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgwODBjLCAweDY5YTgsIDB4ODUyOSwgMHgxYWUwLCAweDAxMmUsCisJMHgwODA0LCAweDJmYWEsIDB4MDEyZSwgMHgwODA0LCAweDJmY2YsIDB4MDEyZSwgMHgwODA0LCAweDJmZDIsCisJMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsIDB4NTBkNSwgMHgwODBjLCAweDUxNzEsCisJMHgwODA0LCAweDJmYWEsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsCisJMHgyZmQyLCAweDA4MGMsIDB4NTBjNiwgMHgwODBjLCAweDUxNzEsIDB4MDgwNCwgMHgyZmFhLCAweDgxZmYsCisJMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLCAweDUxNGMsCisJMHgwOTA0LCAweDJmY2YsIDB4MDgwYywgMHg0ZThkLCAweDA4MGMsIDB4NTExMywgMHgwODBjLCAweDUxNzEsCisJMHgwODA0LCAweDJmYWEsIDB4MDgwYywgMHgzZThhLCAweDA5MDQsIDB4MmZkMiwgMHgwODBjLCAweDUwNmYsCisJMHgwOTA0LCAweDJmY2YsIDB4NjJhMCwgMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwgMHgwODBjLCAweDUxYWEsCisJMHgyMDYxLCAweDAwMDAsIDB4MDgwYywgMHg2ZGY1LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDAyLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweGFlODIsIDB4MDA3ZSwgMHgwMGNlLCAweDA4MGMsCisJMHg1MTcxLCAweDA4MDQsIDB4MmZhYSwgMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsCisJMHg1MTcxLCAweDIyMDgsIDB4MDgwNCwgMHgyZmFhLCAweDAxNTYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjksCisJMHhiNjE0LCAweDY4MTAsIDB4NjkxNCwgMHhhMTBhLCAweDEyMTAsIDB4MjAwOSwgMHgwMDAwLCAweDY4MTYsCisJMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHgwMDAwLCAweDIwYTksIDB4MDA3ZSwgMHgyMDY5LCAweGI2MzUsCisJMHgyZDA0LCAweGEwNzUsIDB4MDEzMCwgMHg3MDRjLCAweDAwNzEsIDB4YTIxMCwgMHg3MDgwLCAweDAwNTksCisJMHhhMzE4LCAweDhkNjgsIDB4MWYwNCwgMHgzMjE4LCAweDIzMDAsIDB4YTIxOCwgMHgwMGVlLCAweDAwZGUsCisJMHgwMTVlLCAweDA4MDQsIDB4MmZhYSwgMHgwMGY2LCAweDAwMTYsIDB4YTA3ZCwgMHgwMTQwLCAweDIwMDEsCisJMHgwMDAwLCAweDgwMDAsIDB4MmYwYywgMHg4MWZmLCAweDAxMTAsIDB4MjE3OCwgMHgwY2QwLCAweDAwMWUsCisJMHgwMGZlLCAweDAwMDUsIDB4MjA2OSwgMHhiNjE0LCAweDY5MTAsIDB4NjJiMCwgMHgwODA0LCAweDJmYWEsCisJMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHg2MTUwLCAweGExOTAsIDB4MmRjNCwgMHgyMjE1LCAweGEyOTQsCisJMHgwMGZmLCAweDYzNzAsIDB4ODNmZiwgMHgwMTA4LCAweDYyNzQsIDB4NjdkNCwgMHhkNzljLCAweDAxMTgsCisJMHgyMDMxLCAweDAwMDEsIDB4MDA5MCwgMHhkN2FjLCAweDAxMTgsIDB4MjAzMSwgMHgwMDAzLCAweDAwNjgsCisJMHhkN2E0LCAweDAxMTgsIDB4MjAzMSwgMHgwMDAyLCAweDAwNDAsIDB4MDgwYywgMHg1YWNmLCAweDExMTgsCisJMHgyMDMxLCAweDAwMDQsIDB4MDAxMCwgMHgyMDMxLCAweDAwMDAsIDB4N2UzYSwgMHg3ZjNlLCAweDA4MDQsCisJMHgyZmFhLCAweDYxNDAsIDB4NjI0NCwgMHgyMDE5LCAweGI3YjYsIDB4MjMxYywgMHgwODA0LCAweDJmYWEsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MTM0LCAweGEwMDYsIDB4MjAxMCwgMHg2MzM4LCAweDAxMmUsCisJMHgwODA0LCAweDJmYWEsIDB4MDgwYywgMHgzZTlhLCAweDA5MDQsIDB4MmZkMiwgMHg2MjQ0LCAweDYzMzgsCisJMHgwODA0LCAweDJmYWEsIDB4NjE0MCwgMHg2MjQ0LCAweDc4MjQsIDB4NjA0MiwgMHg3YjI4LCAweDYzNDYsCisJMHgyMDY5LCAweGI1NTIsIDB4ODMxZiwgMHhhMzA1LCAweDY4MTYsIDB4NzgyYywgMHgyMDY5LCAweGI3YjYsCisJMHgyZDFjLCAweDIwNmEsIDB4MDgwNCwgMHgyZmFhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjQsCisJMHg2MDM2LCAweDc4MmMsIDB4NjAzYSwgMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHg3ODM4LCAweGEwMDUsCisJMHgwMWE4LCAweDc4MjgsIDB4YTAyNSwgMHgwOTA0LCAweDJmZDIsIDB4NzgyYywgMHhhMDJkLCAweDA5MDQsCisJMHgyZmQyLCAweGEwMGUsIDB4MDgwYywgMHg0ZmE5LCAweDExMjAsIDB4NjI0NCwgMHg2MzM4LCAweDY0NDYsCisJMHg2NTNhLCAweGExODYsIDB4MDBmZiwgMHgwMTkwLCAweDgxMDgsIDB4MGNhMCwgMHgwODBjLCAweDNlOWEsCisJMHgwOTA0LCAweDJmZDIsIDB4NzgyOCwgMHhhMDBkLCAweDA5MDQsIDB4MmZkMiwgMHg3ODJjLCAweGEwMDUsCisJMHgwOTA0LCAweDJmZDIsIDB4NjI0NCwgMHg2MTQ2LCAweDYzMzgsIDB4NjAzYSwgMHgwODA0LCAweDJmYWEsCisJMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZmNmLCAweDAwYzYsCisJMHgyMDYxLCAweDAxMDAsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LCAweDAwZmYsCisJMHgxMTMwLCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LCAweGEwODUsIDB4ZmYwMCwgMHgwMDc4LCAweGExODIsCisJMHgwMDdmLCAweDE2YTAsIDB4YTE4OCwgMHgyZGM0LCAweDIxMGQsIDB4YTE4YywgMHgwMGZmLCAweDIwMDEsCisJMHhiNTE1LCAweDIwMDQsIDB4YTExNiwgMHgwNTUwLCAweDgxMGYsIDB4YTEwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDAwMDYsIDB4MDgwYywgMHg4NWM3LCAweDAwMGUsIDB4MDFlMCwgMHg2MDFhLCAweDYwMGIsCisJMHhiYzA5LCAweDYwMWYsIDB4MDAwMSwgMHgwODBjLCAweDNlNzUsIDB4MDFkOCwgMHg2ODM3LCAweDAwMDAsCisJMHg3MDA3LCAweDAwMDMsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDcwMWIsCisJMHgzMzcwLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMzIsIDB4MDgwYywgMHg4NjRjLCAweDAxMmUsCisJMHgwMGNlLCAweDAwMDUsIDB4MDEyZSwgMHgwMGNlLCAweDA4MDQsIDB4MmZjZiwgMHgwMGNlLCAweDA4MDQsCisJMHgyZmQyLCAweDA4MGMsIDB4ODYxZCwgMHgwY2IwLCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwODYsCisJMHgwMDAzLCAweDE5MDQsIDB4MmZjZiwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg3OTI0LCAweDgxMGYsCisJMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMGZmLCAweDExMzAsIDB4MjAwMSwgMHhiNTE1LCAweDIwMDQsCisJMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHhhMTgyLCAweDAwN2YsIDB4MTZhMCwgMHhhMTg4LCAweDJkYzQsCisJMHgyMTBkLCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHhhMTE2LCAweDA1NTAsCisJMHg4MTBmLCAweGExMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAwNiwgMHgwODBjLCAweDg1YzcsCisJMHgwMDBlLCAweDAxZTAsIDB4NjAxYSwgMHg2MDBiLCAweGJjMDUsIDB4NjAxZiwgMHgwMDAxLCAweDA4MGMsCisJMHgzZTc1LCAweDAxZDgsIDB4NjgzNywgMHgwMDAwLCAweDcwMDcsIDB4MDAwMywgMHg2ODMzLCAweDAwMDAsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3MDFiLCAweDMzNzAsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksCisJMHgwMDMyLCAweDA4MGMsIDB4ODY0YywgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMTJlLCAweDAwY2UsCisJMHgwODA0LCAweDJmY2YsIDB4MDBjZSwgMHgwODA0LCAweDJmZDIsIDB4MDgwYywgMHg4NjFkLCAweDBjYjAsCisJMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwOTA0LCAweDJmY2YsIDB4MDgwNCwgMHgyZmFhLCAweDIwNjEsCisJMHhiODc0LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4ZDA4NCwgMHgwMTc4LCAweDYxMDQsCisJMHg2MjA4LCAweDJhNjAsIDB4NjA2OCwgMHg3ODNhLCAweDYwYjQsIDB4NzgzZSwgMHg2MGIwLCAweDIwMTksCisJMHgwMDcyLCAweDIwMWEsIDB4NjM0OCwgMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHhhMDBlLCAweDIxMTAsCisJMHgwYzgwLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4NWFjZiwgMHgwOTA0LCAweDJmY2YsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjQ4LCAweDYwNjgsIDB4YTIwMiwgMHgwMjQ4LCAweGEwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4Mjg2NywgMHgwODBjLCAweDQ2MmMsIDB4MDEyZSwgMHgwODA0LCAweDJmYWEsCisJMHgwMTJlLCAweDA4MDQsIDB4MmZkMiwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMGU2LCAweDIwMDEsCisJMHhiN2JmLCAweDIwNzAsIDB4MjA2MSwgMHhiNTUyLCAweDYwMDgsIDB4MjA3MiwgMHgyMDA5LCAweDAwMDAsCisJMHgyMDExLCAweDEwMDAsIDB4MDgwYywgMHg2YjQwLCAweDcyMDYsIDB4MDBlZSwgMHgwMGNlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzgyNCwgMHhhMDg0LCAweDAwMDcsCisJMHgwMDAyLCAweDMzZDQsIDB4MzNkZCwgMHgzM2U0LCAweDMzZDEsIDB4MzNkMSwgMHgzM2QxLCAweDMzZDEsCisJMHgzM2QxLCAweDAxMmUsIDB4MDgwNCwgMHgyZmQyLCAweDIwMDksIDB4MDExNCwgMHgyMTA0LCAweGEwODUsCisJMHgwODAwLCAweDIwMGEsIDB4MDgwYywgMHgzNTRmLCAweDAwNzAsIDB4MjAwOSwgMHgwMTBiLCAweDIwMGIsCisJMHgwMDEwLCAweDA4MGMsIDB4MzU0ZiwgMHgwMDM4LCAweDgxZmYsIDB4MDEyOCwgMHgwMTJlLCAweDIwMjEsCisJMHg0MDBiLCAweDA4MDQsIDB4MmZhYywgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwODBjLCAweDMzYWIsIDB4MjAwOSwgMHgwMTAxLCAweDIxMGMsCisJMHgwMDE2LCAweDIwMDEsIDB4MDEzOCwgMHgyMDBjLCAweDIwMDMsIDB4MDAwMSwgMHgwMDE2LCAweDIwMDEsCisJMHgwMDdhLCAweDIwMzQsIDB4MjAwMSwgMHgwMDdiLCAweDIwMmMsIDB4YTAwNiwgMHgyMDQ4LCAweDIwNTAsCisJMHgyMDU4LCAweDA4MGMsIDB4Mzc5YSwgMHgwODBjLCAweDM2ZmUsIDB4YTAzZSwgMHgyNzIwLCAweDAwZjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MmQ2MCwgMHgyMDcxLCAweGI4NGEsIDB4MjA3OSwgMHgwMDIwLCAweDAwZDYsCisJMHgyMDY5LCAweDAwMDAsIDB4NjgyNCwgMHhkMGI0LCAweDAxNDAsIDB4MjAwMSwgMHgwMDdkLCAweDIwMDQsCisJMHg3ODNlLCAweDIwMDEsIDB4MDA3YywgMHgyMDA0LCAweDc4M2EsIDB4MDBkZSwgMHgyMDExLCAweDAwMDEsCisJMHgwODBjLCAweDM2YWEsIDB4MDgwYywgMHgzNmFhLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDA4MGMsCisJMHgzNWY1LCAweDA4MGMsIDB4MzZkMiwgMHgwODBjLCAweDM2NGYsIDB4MDgwYywgMHgzNWI0LCAweDA4MGMsCisJMHgzNWU1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDA5NCwgMHgwNTMwLCAweDc4MTQsCisJMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEwLCAweDc4MTYsIDB4MjA3OSwgMHgwMTQwLCAweDA4MGMsCisJMHgzNTJkLCAweDExMTAsIDB4MDBmZSwgMHgwNDMwLCAweDc4MDQsIDB4ZDBkYywgMHgwZGMwLCAweDIwNzksCisJMHgwMTAwLCAweDc4MjcsIDB4MDA4NiwgMHg3ODE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMzIsCisJMHg3ODE2LCAweDA4MGMsIDB4MzUyZCwgMHgxMTEwLCAweDAwZmUsIDB4MDBhMCwgMHg3ODI0LCAweGQwYmMsCisJMHgwZGMwLCAweDc4MjcsIDB4MDA4MCwgMHhhMDI2LCAweDdjMTYsIDB4NzgyNCwgMHhkMGFjLCAweDAxMzAsCisJMHg4YjU4LCAweDA4MGMsIDB4MzUzNywgMHgwMGZlLCAweDA4MDQsIDB4MzRmNywgMHgwMGZlLCAweDA4MGMsCisJMHgzNTJkLCAweDExNTAsIDB4ODk0OCwgMHgyMDAxLCAweDAwN2EsIDB4MjYwMiwgMHgyMDAxLCAweDAwN2IsCisJMHgyNTAyLCAweDA4MGMsIDB4MzUzNywgMHgwMDg4LCAweDg3ZmYsIDB4MDE0MCwgMHgyMDAxLCAweDAyMDEsCisJMHgyMDA0LCAweGEwMDUsIDB4MTkwNCwgMHgzNDMxLCAweDg3MzksIDB4MDAzOCwgMHgyMDAxLCAweGI4MjMsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwMCwgMHgxOTA0LCAweDM0MzEsIDB4MjAwMSwgMHgwMDMzLCAweDIwMDMsCisJMHgwMGY2LCAweDg2MzEsIDB4MTIwOCwgMHg4NTI5LCAweDI1MDAsIDB4YTYwNSwgMHgwOTA0LCAweDM0ZjcsCisJMHg3ODI0LCAweGQwYmMsIDB4MDEyOCwgMHgyOTAwLCAweGFhMDUsIDB4YWIwNSwgMHgxOTA0LCAweDM0ZjcsCisJMHg2MDMzLCAweDAwMGQsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsIDB4MDAwNCwgMHg3ODI0LCAweGQwYWMsCisJMHgxMTQ4LCAweDIwMDEsIDB4YjgyMywgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsCisJMHgwMDA5LCAweDAwNDAsIDB4NjAyNywgMHgwMDAxLCAweDIwMDEsIDB4MDA3NSwgMHgyMDA0LCAweGEwMDUsCisJMHgwMTA4LCAweDYwMjYsIDB4MmMwMCwgMHg2MDFhLCAweDIwZTEsIDB4OTA0MCwgMHgyZDAwLCAweDY4MWEsCisJMHg2ODMzLCAweDAwMGQsIDB4NzgyNCwgMHhkMGE0LCAweDExODAsIDB4NjgyNywgMHgwMDAwLCAweDAwYzYsCisJMHgyMGE5LCAweDAwMDQsIDB4MjA2MSwgMHgwMDIwLCAweDYwMDMsIDB4MDAwOCwgMHgyMDAxLCAweDAyMDMsCisJMHgyMDA0LCAweDFmMDQsIDB4MzRjYywgMHgwMGNlLCAweDAwNDAsIDB4NjgyNywgMHgwMDAxLCAweDIwMDEsCisJMHgwMDc0LCAweDIwMDQsIDB4YTAwNSwgMHgwMTA4LCAweDY4MjYsIDB4MDBmNiwgMHgwMGM2LCAweDIwNzksCisJMHgwMTAwLCAweDIwNjEsIDB4MDAyMCwgMHg3ODI3LCAweDAwMDIsIDB4MjAwMSwgMHgwMDcyLCAweDIwMDQsCisJMHhhMDg0LCAweGZmZjgsIDB4NjAxYSwgMHgwMDA2LCAweDIwMDEsIDB4MDA3MywgMHgyMDA0LCAweDYwMWUsCisJMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHgwMGNlLCAweDAwZmUsIDB4MDgwNCwgMHgzNDBmLCAweDIwNjEsCisJMHgwMTAwLCAweDYwMjcsIDB4MDAwMiwgMHgwMDFlLCAweDYxZTIsIDB4MDAxZSwgMHg2MTA2LCAweDc4MjQsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAxODgsIDB4MjBlMSwgMHg5MDI4LCAweDYwNTAsCisJMHhhMDg0LCAweGY3ZWYsIDB4NjA1MiwgMHg2MDJmLCAweDAwMDAsIDB4NjAyYywgMHhjMGFjLCAweDYwMmUsCisJMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyOTA4LCAweDJhMTAsCisJMHgyYjE4LCAweDJiMDAsIDB4YWEwNSwgMHhhOTA1LCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLCAweDExMTgsIDB4MDEyZSwgMHgwODA0LCAweDJmYWEsCisJMHgwMTJlLCAweDIwMjEsIDB4NDAwYywgMHgwODA0LCAweDJmYWMsIDB4YTA4NSwgMHgwMDAxLCAweDFkMDQsCisJMHgzNTM2LCAweDIwOTEsIDB4NjAwMCwgMHg4NDIwLCAweGE0ODYsIDB4MDA2NCwgMHgwMDA1LCAweDIwMDEsCisJMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMDAxLCAweDAwMzAsIDB4MjAwMywgMHgwMDA0LCAweDIwMDEsCisJMHgwMDIwLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLCAweGI4MjMsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHhiODRhLCAweDIwMDMsIDB4MDAwMCwgMHgyMGUxLCAweGYwMDAsIDB4YTAyNiwgMHgwMDA1LCAweDAwZjYsCisJMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHhiNTE1LCAweDIwMGMsIDB4NzkzMiwgMHg3OTM2LCAweDA4MGMsCisJMHgyODQ3LCAweDc4NTAsIDB4YTA4NCwgMHgwOTgwLCAweGEwODUsIDB4MDAzMCwgMHg3ODUyLCAweDIwMTksCisJMHgwMWY0LCAweDgzMTksIDB4MWRmMCwgMHhhMDg0LCAweDA5ODAsIDB4Nzg1MiwgMHg3ODJjLCAweGMwYWQsCisJMHg3ODJlLCAweDIwYTksIDB4MDA0NiwgMHgxZDA0LCAweDM1NmIsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsCisJMHgzNTZiLCAweDc4NTAsIDB4YTA4NSwgMHgwNDAwLCAweDc4NTIsIDB4MjAwMSwgMHgwMDA5LCAweDIwMDQsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAxLCAweDExMTgsIDB4NzgyYywgMHhjMGFjLCAweDc4MmUsCisJMHg3ODRiLCAweGY3ZjcsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMGE5LCAweDAwMGUsCisJMHhlMDAwLCAweDFmMDQsIDB4MzU4OCwgMHg3ODUwLCAweGEwODUsIDB4MTQwMCwgMHg3ODUyLCAweDIwMTksCisJMHg2MWE4LCAweDc4NTQsIDB4ZTAwMCwgMHhlMDAwLCAweGQwOGMsIDB4MTExMCwgMHg4MzE5LCAweDFkYzgsCisJMHg3ODI3LCAweDAwNDgsIDB4Nzg1MCwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1MiwgMHg3ODQzLCAweDAwNDAsCisJMHgyMDE5LCAweDAxZjQsIDB4ZTAwMCwgMHhlMDAwLCAweDgzMTksIDB4MWRlMCwgMHgyMDAxLCAweDAxNDAsCisJMHgyMDAzLCAweDAxMDAsIDB4NzgyNywgMHgwMDIwLCAweDc4NDMsIDB4MDAwMCwgMHgyMDAzLCAweDAwMDAsCisJMHg3ODI3LCAweDAwNDgsIDB4MDBmZSwgMHgwMDA1LCAweDc4MjQsIDB4ZDBhYywgMHgxMWM4LCAweDAwZjYsCisJMHgwMGU2LCAweDIwNzEsIDB4YjgyMywgMHgyMDc5LCAweDAwMzAsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsCisJMHhhMDA1LCAweDAxNjAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MTE0MCwgMHgwMDUxLCAweGQwYmMsCisJMHgwMTA4LCAweDg3MzgsIDB4NzAwMywgMHgwMDAzLCAweDc4MDMsIDB4MDAxOSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweDc4MGMsIDB4YTA4YywgMHgwMDcwLCAweDAxNzgsIDB4MjAwOSwgMHgwMDdhLCAweDI2MGEsCisJMHgyMDA5LCAweDAwN2IsIDB4MjUwYSwgMHhkMGI0LCAweDAxMDgsIDB4OGE1MCwgMHhkMGFjLCAweDAxMDgsCisJMHg4OTQ4LCAweGQwYTQsIDB4MDEwOCwgMHg4YjU4LCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAyMDAsCisJMHg3ODFjLCAweGQwODQsIDB4MDE0MCwgMHgyMGUxLCAweDAwMDcsIDB4MjBlMSwgMHgyMDAwLCAweDIwMDEsCisJMHgwMjBhLCAweDIwMDQsIDB4MGNhOCwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAxMDAsCisJMHgyMDAxLCAweGI3YzAsIDB4MjAwNCwgMHg3MGUyLCAweDIwMDksIDB4YjUxNSwgMHgyMTBjLCAweDcxNmUsCisJMHg3MDYzLCAweDAxMDAsIDB4NzE2NiwgMHg3MTllLCAweDcwNmIsIDB4MDAwMCwgMHg3MDczLCAweDA4MDksCisJMHg3MDc3LCAweDAwMDgsIDB4NzA3OCwgMHhhMDgwLCAweDAxMDAsIDB4NzA3YSwgMHg3MDgwLCAweDgwMDAsCisJMHg3MDgyLCAweDcwODcsIDB4YWFhYSwgMHhhMDA2LCAweDcwOGEsIDB4NzA4ZSwgMHg3MDdlLCAweDcwZDYsCisJMHg3MGFiLCAweDAwMzYsIDB4NzBhZiwgMHg5NWQ1LCAweDcwMjcsIDB4MDA4MCwgMHg3MDE0LCAweGEwODQsCisJMHgwMTg0LCAweGEwODUsIDB4MDAzMiwgMHg3MDE2LCAweDA4MGMsIDB4MzZkMiwgMHgwODBjLCAweDM1MmQsCisJMHgxMTEwLCAweDg0MjEsIDB4MDAyOCwgMHg3MDI0LCAweGQwYmMsIDB4MGRiMCwgMHg3MDI3LCAweDAwODAsCisJMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHhiODIzLCAweDIwNzksIDB4MDAzMCwgMHgwMGQ2LCAweDIwNjksCisJMHgwMDAwLCAweDY4MjQsIDB4ZDBiNCwgMHgwMTIwLCAweDY4M2MsIDB4NzgzZSwgMHg2ODM4LCAweDc4M2EsCisJMHgwMGRlLCAweDIwMTEsIDB4MDAxMSwgMHgwODBjLCAweDM2YWEsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsCisJMHgzNmFhLCAweDAwZWUsIDB4MDBmZSwgMHg3MDE3LCAweDAwMDAsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGU2LCAweDIwNzEsIDB4YjgyMywgMHgyMDc5LCAweDAwMzAsIDB4NzkwNCwgMHhkMWZjLCAweDA5MDQsCisJMHgzNmE3LCAweDc4MDMsIDB4MDAwMiwgMHhhMDI2LCAweGQxOWMsIDB4MTkwNCwgMHgzNmEzLCAweDcwMDAsCisJMHgwMDAyLCAweDM2YTcsIDB4MzY2NSwgMHgzNjg5LCAweDM2YTMsIDB4ZDFiYywgMHgxMTUwLCAweGQxZGMsCisJMHgxMTUwLCAweDgwMDEsIDB4NzAwMiwgMHgyMDExLCAweDAwMDEsIDB4MDRlMSwgMHgwNWMwLCAweDA0ZDEsCisJMHgwNGIwLCAweDc4MGYsIDB4MDAwMCwgMHg3ODIwLCAweDc5MjQsIDB4NzgwMywgMHgwMDA0LCAweDc4MjIsCisJMHg3OTI2LCAweDIwMDEsIDB4MDIwMSwgMHgyMDBjLCAweDgxZmYsIDB4MGRlOCwgMHgwODBjLCAweDM1ZDEsCisJMHgyMDA5LCAweDAwMDEsIDB4NzgwOCwgMHhkMGVjLCAweDAxMTAsIDB4MjAwOSwgMHgwMDExLCAweDc5MDIsCisJMHgwMGYwLCAweDgwMDEsIDB4NzAwMiwgMHhhMTg0LCAweDA4ODAsIDB4MTEzOCwgMHg3ODA0LCAweGQwZmMsCisJMHgxOTQwLCAweDIwMTEsIDB4MDAwMSwgMHgwMGIxLCAweDAwOTAsIDB4NjAzMCwgMHhhMDkyLCAweDAwMDQsCisJMHhhMDg2LCAweDAwMDksIDB4MTEyMCwgMHg2MDAwLCAweDYwMWEsIDB4MjAxMSwgMHgwMDI1LCAweDYyMzIsCisJMHhkMWRjLCAweDE5ODgsIDB4MDg3MCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NjAyNCwgMHhhMDA1LCAweDA1MjAsIDB4ODAwMSwgMHg2MDI2LCAweDYwMTgsCisJMHg2MTMwLCAweGExNDAsIDB4MjgwNCwgMHg3ODMyLCAweDg4NDAsIDB4MjgwNCwgMHg3ODM2LCAweDg4NDAsCisJMHgyODA0LCAweDc4MjIsIDB4ODg0MCwgMHgyODA0LCAweDc4MjYsIDB4ODg0MCwgMHg3YTAyLCAweDcwMDAsCisJMHg4MDAwLCAweDcwMDIsIDB4NjAxOCwgMHhhODAyLCAweGEwOGEsIDB4MDAyOSwgMHgxMTM4LCAweDYwMTgsCisJMHhhMDgwLCAweDAwMDEsIDB4MjAwNCwgMHg2MDFhLCAweDIwMDEsIDB4MDAwZCwgMHg2MDMyLCAweGEwODUsCisJMHgwMDAxLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MjA3MSwgMHhiODRhLCAweDIwNzksCisJMHgwMDIwLCAweDc5MDQsIDB4ZDFmYywgMHgwMWYwLCAweDc4MDMsIDB4MDAwMiwgMHgyZDYwLCAweGEwMjYsCisJMHg3MDAwLCAweDAwMDIsIDB4MzZmYSwgMHgzNmU1LCAweDM2ZjEsIDB4ODAwMSwgMHg3MDAyLCAweGQxOWMsCisJMHgxMTg4LCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDM2YWEsIDB4MDE2MCwgMHgwODBjLCAweDM2YWEsCisJMHgwMDQ4LCAweDgwMDEsIDB4NzAwMiwgMHg3ODA0LCAweGQwZmMsIDB4MWQzMCwgMHgyMDExLCAweDAwMDEsCisJMHgwODBjLCAweDM2YWEsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGM2LCAweDIwNjEsIDB4MDIwMCwgMHgyMDAxLCAweGI3YzAsIDB4MjAwNCwgMHg2MDFhLCAweDIwNjEsCisJMHgwMTAwLCAweDIwMDEsIDB4YjdiZiwgMHgyMDA0LCAweDYwY2UsIDB4NjAwNCwgMHhjMGFjLCAweGEwODUsCisJMHgwMjAwLCAweDYwMDYsIDB4MjAwMSwgMHgwMDc0LCAweDIwMDQsIDB4YTAwNSwgMHgwMWY4LCAweDIwMzgsCisJMHgyMDAxLCAweDAwNzYsIDB4MjAyNCwgMHgyMDAxLCAweDAwNzcsIDB4MjAxYywgMHgwODBjLCAweDNlNzUsCisJMHg2ODMzLCAweDAwMGQsIDB4NmYyNiwgMHgyZDAwLCAweDY4MWEsIDB4YTc4YSwgMHgwMDA3LCAweDAyMjAsCisJMHgyMTM4LCAweDIwMDksIDB4MDAwNywgMHgwMDEwLCAweDI3MDgsIDB4YTAzZSwgMHg2ODE4LCAweGEwODAsCisJMHgwMDBkLCAweDA0YjEsIDB4MWQ5MCwgMHgyZDAwLCAweDY4MWEsIDB4MDA4OCwgMHgwODBjLCAweDNlNzUsCisJMHg2ODMzLCAweDAwMGQsIDB4MjA3MCwgMHg2ODI3LCAweDAwMDEsIDB4MmQwMCwgMHg2ODFhLCAweDIwMDEsCisJMHgwMDc2LCAweDIwMDQsIDB4MjA3MiwgMHgyMDAxLCAweDAwNzcsIDB4MjAwNCwgMHg3MDA2LCAweDIwNjEsCisJMHgwMDIwLCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweGI3YmYsIDB4MjAwNCwgMHg2MDEyLCAweDIwZTEsCisJMHg5MDQwLCAweDIwMDEsIDB4MDA3MiwgMHgyMDA0LCAweGEwODQsIDB4ZmZmOCwgMHg3MDBhLCAweDYwMWEsCisJMHgwMDA2LCAweDIwMDEsIDB4MDA3MywgMHgyMDA0LCAweDcwMGUsIDB4NjAxZSwgMHg3OGM2LCAweDAwMGUsCisJMHg3OGNhLCAweGEwMDYsIDB4NjAzYSwgMHg2MDNlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4MDAxMCwgMHgyMGEwLCAweDIwOTksIDB4MDAxNCwgMHg3MDAzLCAweDAwMjYsCisJMHg3NDMyLCAweDczMzYsIDB4YTAwNiwgMHg3MDNhLCAweDcwM2UsIDB4ODEwYiwgMHg4MTBiLCAweDIxYTgsCisJMHg4MTBiLCAweDcxMjIsIDB4NzAwMywgMHgwMDQxLCAweDcwMDQsIDB4ZDBmYywgMHgwZGU4LCAweDcwMDMsCisJMHgwMDAyLCAweDcwMDMsIDB4MDA0MCwgMHg1M2E1LCAweDc0MzAsIDB4NzMzNCwgMHg4N2ZmLCAweDAxODAsCisJMHgwMGM2LCAweDAwZDYsIDB4MmQ2MCwgMHgwMGM2LCAweDA4MGMsIDB4M2U3NSwgMHgwMGNlLCAweDYwMTgsCisJMHgyMDcwLCAweDJkMDAsIDB4NzAwNiwgMHg2MDFhLCAweDAwZGUsIDB4MDBjZSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDAxLCAweDAwNzUsIDB4MjAwNCwgMHhhMDA1LCAweDA1MDgsCisJMHgyMDM4LCAweDIwMDEsIDB4MDA3OCwgMHgyMDI0LCAweDIwMDEsIDB4MDA3OSwgMHgyMDFjLCAweDA4MGMsCisJMHgzZTc1LCAweDJkNjAsIDB4NjgzMywgMHgwMDBkLCAweDZmMjYsIDB4MmQwMCwgMHg2ODFhLCAweGE3OGEsCisJMHgwMDA3LCAweDAyMjAsIDB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwgMHgyNzA4LCAweGEwM2UsCisJMHg2ODE4LCAweGEwODAsIDB4MDAwZCwgMHgwODBjLCAweDM3NjgsIDB4MWQ4OCwgMHgyZDAwLCAweDY4MWEsCisJMHgwMGUwLCAweDA4MGMsIDB4M2U3NSwgMHgyZDYwLCAweDYwMzMsIDB4MDAwZCwgMHgyMDcwLCAweDYwMjcsCisJMHgwMDAxLCAweDJjMDAsIDB4NjAxYSwgMHgyMDAxLCAweDAwNzgsIDB4MjAwNCwgMHgyMDcyLCAweDIwMDEsCisJMHgwMDc5LCAweDIwMDQsIDB4NzAwNiwgMHgyMDAxLCAweDAwNzIsIDB4MjAwNCwgMHhhMDg0LCAweGZmZjgsCisJMHg3MDBhLCAweDIwMDEsIDB4MDA3MywgMHgyMDA0LCAweDcwMGUsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsCisJMHgwMDA0LCAweDc4MjQsIDB4ZDBhYywgMHgxMTc4LCAweDIwMDEsIDB4MDEwMSwgMHgyMDBjLCAweGMxZWQsCisJMHgyMTAyLCAweDYwMjcsIDB4MDAwMCwgMHgyMDAxLCAweGI4MjMsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsCisJMHgwMDMwLCAweDIwMDMsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDgwNCwgMHgyZmFhLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjBhOSwgMHgwMDEyLCAweDIwMDEsIDB4YjU0MCwgMHgyMGEwLCAweGEwMDYsCisJMHg0MGE0LCAweDAxMmUsIDB4MDgwNCwgMHgyZmFhLCAweDdkMzgsIDB4N2MzYywgMHgwODA0LCAweDMwNTEsCisJMHgwODBjLCAweDNlNzUsIDB4MDkwNCwgMHgyZmNmLCAweDA4MGMsIDB4NWFjZiwgMHgwMTEwLCAweDA4MGMsCisJMHg0YmYwLCAweDIwMDksIDB4MDAxYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsCisJMHgzZWI2LCAweDcwMWIsIDB4MzgxYywgMHgwMDA1LCAweGFkZTgsIDB4MDAwZCwgMHg2ODAwLCAweGEwMDUsCisJMHgwOTA0LCAweDJmZDIsIDB4NjgwNCwgMHhkMGFjLCAweDAxMTgsIDB4ZDBhNCwgMHgwOTA0LCAweDJmZDIsCisJMHhkMDk0LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDEzOCwgMHg2MjAwLCAweGEyOTIsCisJMHgwMDA1LCAweDAyMTgsIDB4YTE4YywgMHhmZmRmLCAweDAwMTAsIDB4YTE4ZCwgMHgwMDIwLCAweDYxMDYsCisJMHgwMGNlLCAweGQwOGMsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMTE4LCAweGExOGQsCisJMHgwMDEwLCAweDAwMTAsIDB4YTE4YywgMHhmZmVmLCAweDYxMDYsIDB4MDBjZSwgMHgyMDA5LCAweDAxMDAsCisJMHgyMTBjLCAweGExOGEsIDB4MDAwMiwgMHgwMjY4LCAweGQwODQsIDB4MDE1OCwgMHg2YTI4LCAweGEyOGEsCisJMHgwMDdmLCAweDFhMDQsIDB4MmZkMiwgMHhhMjg4LCAweDJkYzQsIDB4MjEwZCwgMHhhMThjLCAweDAwZmYsCisJMHg2MTVhLCAweGQwZGMsIDB4MDEzMCwgMHg2ODI4LCAweGEwOGEsIDB4MDA3ZiwgMHgxYTA0LCAweDJmZDIsCisJMHg2MDUyLCAweDY4MDgsIDB4YTA4YSwgMHgwMTAwLCAweDBhMDQsIDB4MmZkMiwgMHhhMDhhLCAweDA4NDEsCisJMHgxYTA0LCAweDJmZDIsIDB4YTA4NCwgMHgwMDA3LCAweDE5MDQsIDB4MmZkMiwgMHg2ODBjLCAweGEwMDUsCisJMHgwOTA0LCAweDJmZDIsIDB4NjgxMCwgMHhhMDA1LCAweDA5MDQsIDB4MmZkMiwgMHg2ODQ4LCAweDY5NDAsCisJMHhhMTBhLCAweDFhMDQsIDB4MmZkMiwgMHg4MDAxLCAweDA5MDQsIDB4MmZkMiwgMHg2ODRjLCAweDY5NDQsCisJMHhhMTBhLCAweDFhMDQsIDB4MmZkMiwgMHg4MDAxLCAweDA5MDQsIDB4MmZkMiwgMHg2ODA0LCAweGQwZmMsCisJMHgwNTYwLCAweDA4MGMsIDB4M2U3NSwgMHgwOTA0LCAweDJmY2YsIDB4MjAwOSwgMHgwMDE0LCAweDdhMmMsCisJMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHhhMjkwLCAweDAwMzgsIDB4YTM5OSwgMHgwMDAwLCAweDA4MGMsCisJMHgzZWI2LCAweDcwMWIsIDB4Mzg5YywgMHgwMDA1LCAweGFkZTgsIDB4MDAwZCwgMHgyMGE5LCAweDAwMTQsCisJMHgyZDk4LCAweDIwNjksIDB4YjU2ZSwgMHgyZGEwLCAweDUzYTMsIDB4NzAxMCwgMHhhMGU4LCAweDAwMGQsCisJMHgyMDAxLCAweGI1NzIsIDB4MjAwYywgMHhkMWU0LCAweDAxNDAsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsCisJMHg2MDA0LCAweGEwODUsIDB4MGIwMCwgMHg2MDA2LCAweDAwY2UsIDB4MjAwOSwgMHhiN2IxLCAweDIwMGIsCisJMHgwMDAwLCAweDIwMDEsIDB4YjU3NCwgMHgyMDA0LCAweGQwYWMsIDB4MDE1OCwgMHg3ODI0LCAweDIwMGEsCisJMHgyMDA5LCAweDAxN2YsIDB4MjAwYSwgMHgzMjAwLCAweGEwODQsIDB4MDAzZiwgMHhhMDg1LCAweDMwMjAsCisJMHgyMDkwLCAweDIwYTksIDB4MDAxYywgMHgyZDk4LCAweDIwNjksIDB4YjU1MiwgMHgyZGEwLCAweDUzYTMsCisJMHg2ODE0LCAweGEwOGMsIDB4MDBmZiwgMHg2MTQyLCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDYwNDYsCisJMHgwODBjLCAweDVkYTUsIDB4MDgwYywgMHg1MzZjLCAweDA4MGMsIDB4NTNkNSwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDE5MDQsIDB4Mzk5NywgMHg2ODA4LCAweDYwMmEsIDB4MDgwYywgMHgyNDcwLCAweDAwMDYsCisJMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDAwZSwgMHgwMjY4LCAweDIwMDksCisJMHgwMTcwLCAweDIwMGIsIDB4MDA4MCwgMHhlMDAwLCAweGUwMDAsIDB4MjAwYiwgMHgwMDAwLCAweDAwMzYsCisJMHg2YjA4LCAweDA4MGMsIDB4MjhhMiwgMHgwMDNlLCAweDY4MTgsIDB4NjkxYywgMHg2YTIwLCAweDZiMjQsCisJMHg4MDA3LCAweDgxMGYsIDB4ODIxNywgMHg4MzFmLCAweDYwMTYsIDB4NjExYSwgMHg2MjFlLCAweDYzMjIsCisJMHg2YzA0LCAweGQ0ZjQsIDB4MDE0OCwgMHg2ODMwLCAweDY5MzQsIDB4NmEzOCwgMHg2YjNjLCAweDgwMDcsCisJMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHgwMDEwLCAweGEwODQsIDB4ZjBmZiwgMHg2MDA2LCAweDYxMGEsCisJMHg2MjBlLCAweDYzMTIsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMGExLCAweGI3YzYsIDB4NDBhMSwgMHgwODBjLCAweDZhNjgsIDB4NjkwNCwgMHhkMWZjLCAweDA1MjAsCisJMHgwMGM2LCAweDIwMDksIDB4MDAwMCwgMHgyMGE5LCAweDAwMDEsIDB4NmI3MCwgMHhkMzg0LCAweDAxYzgsCisJMHgwMDIwLCAweDgzOWQsIDB4MTJiMCwgMHgzNTA4LCAweDgxMDksIDB4MDgwYywgMHg2MzVjLCAweDY4NzgsCisJMHg2MDE2LCAweDY4NzQsIDB4MjAwOCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHg2MDBhLCAweGExODQsCisJMHgwMGZmLCAweDYwMDYsIDB4ODEwOCwgMHgxMTE4LCAweDYwMDMsIDB4MDAwMywgMHgwMDEwLCAweDYwMDMsCisJMHgwMDAxLCAweDFmMDQsIDB4MzkzMSwgMHgwMGNlLCAweDIwNjksIDB4YjU1MiwgMHgyMDAxLCAweGI3OWUsCisJMHg2YTgwLCAweGEyOTQsIDB4MDAzMCwgMHhhMjhlLCAweDAwMDAsIDB4MDE3MCwgMHhhMjhlLCAweDAwMTAsCisJMHgwMTE4LCAweGEyOGUsIDB4MDAyMCwgMHgwMTQwLCAweDIwMDMsIDB4YWFhYSwgMHgwODBjLCAweDI4ZWIsCisJMHgyMDAxLCAweGI3OGYsIDB4MjEwMiwgMHgwMDA4LCAweDIxMDIsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsCisJMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwY2UsIDB4MDgwYywgMHg1YWNmLCAweDAxMjgsCisJMHgwODBjLCAweDQwY2YsIDB4MDExMCwgMHgwODBjLCAweDI4NjcsIDB4NjBjOCwgMHhhMDA1LCAweDAxZDAsCisJMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHgzOTdkLCAweDAwZTAsIDB4MDgwYywgMHg1YWNmLCAweDExNzgsCisJMHgyMDExLCAweDU5YTIsIDB4MDgwYywgMHg2OTljLCAweDIwMTEsIDB4NTk5NSwgMHgwODBjLCAweDZhNWMsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NWEwNywgMHgwMDQwLCAweDA4MGMsCisJMHg0YjFmLCAweDAwMjgsIDB4NjAwMywgMHgwMDA0LCAweDIwMDksIDB4Mzk5NywgMHgwMDEwLCAweDA4MDQsCisJMHgyZmFhLCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMjU4LCAweDIwMDEsCisJMHgwMTcwLCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDA0YywgMHgxMTE4LCAweDIwOTEsCisJMHgzMDlkLCAweDA4MTcsIDB4MjA5MSwgMHgzMDFkLCAweDA4MTcsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwOTA0LCAweDJmY2YsIDB4MjA2OSwgMHhiNTUyLCAweDc4MzAsIDB4Njg0MiwgMHg3ODM0LCAweDY4NDYsCisJMHg2ODA0LCAweGQwZmMsIDB4MDExOCwgMHgyMDA5LCAweDAwMzAsIDB4MDAxMCwgMHgyMDA5LCAweDAwMWMsCisJMHgyZDAwLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzZWI5LCAweGEwMDYsCisJMHgwODBjLCAweDI4NjcsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHg1YWNmLCAweDExNzgsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLCAweDAwMDEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHg1YjEzLCAweDA4MGMsIDB4NWEwNywgMHgwMDIwLCAweDA4MGMsCisJMHg0YmYwLCAweDA4MGMsIDB4NGIxZiwgMHgwODA0LCAweDJmYWEsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsCisJMHgwODBjLCAweDVhY2YsIDB4MTExMCwgMHgwODA0LCAweDJmY2YsIDB4NjE4OCwgMHg4MWZmLCAweDAxOTgsCisJMHg3MDNmLCAweDAwMDAsIDB4MjAwMSwgMHhiY2MwLCAweDIwMDksIDB4MDA0MCwgMHg3YTJjLCAweDdiMjgsCisJMHg3YzNjLCAweDdkMzgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgzZWI5LCAweDcwMWIsCisJMHgyZmE4LCAweDAxMmUsIDB4MDAwNSwgMHg3MDNmLCAweDAwMDEsIDB4MDBkNiwgMHgyMDY5LCAweGJjYzAsCisJMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhiY2MwLCAweDIwMTksIDB4ZmZmZiwgMHg0M2E0LCAweDY1NTAsCisJMHhhNTg4LCAweDJkYzQsIDB4MjEwZCwgMHhhMThjLCAweDAwZmYsIDB4MjE2YSwgMHhhMDBlLCAweDIwMTEsCisJMHgwMDAyLCAweDIxMDAsIDB4YTUwNiwgMHgwMWE4LCAweDA4MGMsIDB4NGZhOSwgMHgxMTkwLCAweDYwMTQsCisJMHg4MjFjLCAweDAyMzgsIDB4YTM5OCwgMHhiY2MwLCAweGEwODUsIDB4ZmYwMCwgMHg4MDA3LCAweDIwMWEsCisJMHgwMDM4LCAweGEzOTgsIDB4YmNjMCwgMHgyMzI0LCAweGE0YTQsIDB4ZmYwMCwgMHhhNDA1LCAweDIwMWEsCisJMHg4MjEwLCAweDgxMDgsIDB4YTE4MiwgMHgwMDgwLCAweDEyMDgsIDB4MGMxOCwgMHg4MjAxLCAweDgwMDcsCisJMHgyZDBjLCAweGExMDUsIDB4MjA2YSwgMHgwMGRlLCAweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweGJjYzAsCisJMHgyMDk5LCAweGJjYzAsIDB4MDgwYywgMHg0YjhmLCAweDA4MDQsIDB4MzlmMiwgMHgwODBjLCAweDNlOWEsCisJMHgwOTA0LCAweDJmZDIsIDB4MDBjNiwgMHgwODBjLCAweDNlNzUsIDB4MDBjZSwgMHgxMTIwLCAweDIwMDksCisJMHgwMDAyLCAweDA4MDQsIDB4MmZjZiwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGI0LCAweDA1NTAsCisJMHg3ODI0LCAweGEwODQsIDB4ZmYwMCwgMHhhMDhlLCAweDdlMDAsIDB4MDUyMCwgMHhhMDhlLCAweDdmMDAsCisJMHgwNTA4LCAweGEwOGUsIDB4ODAwMCwgMHgwMWYwLCAweDYwMDAsIDB4ZDA4YywgMHgxMWQ4LCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExYTgsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4MDgwYywgMHg5ZGRhLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsCisJMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDNhN2UsIDB4MDAwNSwgMHgwODBjLCAweDNlOWEsCisJMHgwOTA0LCAweDJmZDIsIDB4MjBhOSwgMHgwMDJiLCAweDJjOTgsIDB4YWRlOCwgMHgwMDAyLCAweDJkYTAsCisJMHg1M2EzLCAweDIwYTksIDB4MDAwNCwgMHhhYzgwLCAweDAwMDYsIDB4MjA5OCwgMHhhZDgwLCAweDAwMDYsCisJMHgyMGEwLCAweDA4MGMsIDB4NGI4ZiwgMHgyMGE5LCAweDAwMDQsIDB4YWM4MCwgMHgwMDBhLCAweDIwOTgsCisJMHhhZDgwLCAweDAwMGEsIDB4MjBhMCwgMHgwODBjLCAweDRiOGYsIDB4MmQwMCwgMHgyMDA5LCAweDAwMmIsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsIDB4M2ViOSwgMHg4MWZmLCAweDE5MDQsCisJMHgyZmNmLCAweDA4MGMsIDB4M2U4YSwgMHgwOTA0LCAweDJmZDIsIDB4MDgwYywgMHg1MTg2LCAweDA4MDQsCisJMHgyZmFhLCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDFhMDQsCisJMHgyZmQyLCAweDA4MGMsIDB4M2U5YSwgMHgwOTA0LCAweDJmZDIsIDB4MDgwYywgMHg1MWU5LCAweDA5MDQsCisJMHgyZmNmLCAweDIwMTksIDB4MDAwNCwgMHhhMDBlLCAweDA4MGMsIDB4NTE5OCwgMHg3OTI0LCAweDgxMGYsCisJMHg3YTI4LCAweDAwMTEsIDB4MDgwNCwgMHgyZmFhLCAweGExODYsIDB4MDBmZiwgMHgwMTEwLCAweDAwNzEsCisJMHgwMDYwLCAweDIwMjksIDB4MDA3ZSwgMHgyMDYxLCAweGI1MDAsIDB4NjQ1MCwgMHgyNDAwLCAweGE1MDYsCisJMHgwMTEwLCAweDI1MDgsIDB4MDAxOSwgMHg4NTI5LCAweDFlYzgsIDB4MDAwNSwgMHgwODBjLCAweDRmYTksCisJMHgxMTM4LCAweDIyMDAsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgwODBjLCAweDY5YTgsCisJMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDA4MGMsIDB4M2U4YSwgMHgwOTA0LCAweDJmZDIsCisJMHgwODBjLCAweDUwNmYsIDB4MDkwNCwgMHgyZmNmLCAweDA4MGMsIDB4NTE4ZiwgMHgwODA0LCAweDJmYWEsCisJMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsCisJMHg1MDZmLCAweDA5MDQsIDB4MmZjZiwgMHgwODBjLCAweDUxN2QsIDB4MDgwNCwgMHgyZmFhLCAweDYxMDAsCisJMHgwODA0LCAweDJmYWEsIDB4MDgwYywgMHgzZTlhLCAweDA5MDQsIDB4MmZkMiwgMHgyMDAxLCAweGI1MDAsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJmY2YsIDB4MDBkNiwgMHhhY2U4LCAweDAwMGEsCisJMHg3OTI0LCAweGQxODQsIDB4MDExMCwgMHhhY2U4LCAweDAwMDYsIDB4NjgwYywgMHg4MDA3LCAweDc4M2UsCisJMHg2ODA4LCAweDgwMDcsIDB4NzgzYSwgMHg2YjA0LCAweDgzMWYsIDB4NmEwMCwgMHg4MjE3LCAweDAwZGUsCisJMHg2MTAwLCAweGExOGMsIDB4MDIwMCwgMHgwODA0LCAweDJmYWEsIDB4NzgyNCwgMHhhMDljLCAweDAwMDMsCisJMHhkMGI0LCAweDExNjAsIDB4YTM5YSwgMHgwMDAzLCAweDFhMDQsIDB4MmZjZiwgMHg2MjUwLCAweGEyOTQsCisJMHgwMGZmLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEyMDYsIDB4MTE1MCwgMHgyMDAxLCAweGI1NDAsCisJMHgyMDA5LCAweDAwMGMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LCAweDNlYjksCisJMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4MmZjZiwgMHgwMGM2LCAweDA4MGMsCisJMHgzZTc1LCAweDAwY2UsIDB4MDkwNCwgMHgyZmNmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDA4MGMsIDB4OWQ4NiwgMHgwOTA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzYjZhLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDkwNCwgMHgyZmNmLCAweGFkODAsCisJMHgwMDBlLCAweDIwMDksIDB4MDAwYywgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsCisJMHgzZWI5LCAweGEwMDYsIDB4MDgwYywgMHgyODY3LCAweDc4MjQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMGZmLCAweDAxMTgsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDgwYywgMHg1YWNmLCAweDAxMTAsCisJMHgwODBjLCAweDRiZjAsIDB4NzgyOCwgMHhhMDhhLCAweDEwMDAsIDB4MWEwNCwgMHgyZmQyLCAweDc5MjQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwZmYsIDB4MDEzOCwgMHhhMTgyLCAweDAwN2YsCisJMHgxYTA0LCAweDJmZDIsIDB4MjEwMCwgMHgwODBjLCAweDI4MzEsIDB4MDAyNiwgMHgwMGM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHhiN2YzLCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDAsCisJMHgwODBjLCAweDVhY2YsIDB4MTE3OCwgMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsCisJMHhiNTAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHg1YjEzLCAweDA4MGMsCisJMHg1YTA3LCAweDA0MjAsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4ODA3NSwgMHgyMDExLCAweDAwMDIsCisJMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3ZjU5LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3ZmU0LCAweDAwM2UsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LCAweGEwODQsCisJMHgwMGZmLCAweDgxMGYsIDB4YTEwNSwgMHg2MDRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsCisJMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwgMHg0YjU0LCAweDA4MGMsIDB4NmEyMiwgMHg3OTI0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHg1YWNmLCAweDExMTAsIDB4MjAwOSwgMHgwMGZmLCAweDdhMjgsCisJMHgwODBjLCAweDNhY2MsIDB4MDEyZSwgMHgwMGNlLCAweDAwMmUsIDB4MDgwNCwgMHgyZmFhLCAweDc5MjQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwMGM2LCAweDA4MGMsIDB4NGY0ZCwgMHgyYzA4LCAweDAwY2UsCisJMHgxOTA0LCAweDJmZDIsIDB4MDgwNCwgMHgyZmFhLCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODA0LCAweDJmY2YsIDB4NjBkNCwgMHhkMGFjLCAweDExMzAsIDB4ZDA5YywgMHgxMTIwLCAweDIwMDksCisJMHgwMDA1LCAweDA4MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlNzUsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsCisJMHgwODA0LCAweDJmY2YsIDB4NzkyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsCisJMHgzZWI2LCAweDcwMWIsIDB4M2MxYywgMHgwMDA1LCAweDIwMDksIDB4MDA4MCwgMHgwODBjLCAweDRmYTksCisJMHgxMTMwLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMTIwLCAweDIwMjEsCisJMHg0MDBhLCAweDA4MDQsIDB4MmZhYywgMHgwMGQ2LCAweGFkZTgsIDB4MDAwZCwgMHg2OTAwLCAweDZhMDgsCisJMHg2YjBjLCAweDZjMTAsIDB4NmQxNCwgMHg2ZTE4LCAweDY4MjAsIDB4YTBiZSwgMHgwMTAwLCAweDA5MDQsCisJMHgzYzkzLCAweGEwYmUsIDB4MDExMiwgMHgwOTA0LCAweDNjOTMsIDB4YTBiZSwgMHgwMTEzLCAweDA5MDQsCisJMHgzYzkzLCAweGEwYmUsIDB4MDExNCwgMHgwOTA0LCAweDNjOTMsIDB4YTBiZSwgMHgwMTE3LCAweDA5MDQsCisJMHgzYzkzLCAweGEwYmUsIDB4MDExYSwgMHgwOTA0LCAweDNjOTMsIDB4YTBiZSwgMHgwMTFjLCAweDA5MDQsCisJMHgzYzkzLCAweGEwYmUsIDB4MDEyMSwgMHgwNWIwLCAweGEwYmUsIDB4MDEzMSwgMHgwNTk4LCAweGEwYmUsCisJMHgwMTcxLCAweDA1YzgsIDB4YTBiZSwgMHgwMTczLCAweDA1YjAsIDB4YTBiZSwgMHgwMWExLCAweDExMjAsCisJMHg2ODMwLCAweDgwMDcsIDB4NjgzMiwgMHgwNGE4LCAweGEwYmUsIDB4MDIxMiwgMHgwNTQwLCAweGEwYmUsCisJMHgwMjEzLCAweDA1MjgsIDB4YTBiZSwgMHgwMjE0LCAweDAxYjAsIDB4YTBiZSwgMHgwMjE3LCAweDAxNjgsCisJMHhhMGJlLCAweDAyMWEsIDB4MTEyMCwgMHg2ODM4LCAweDgwMDcsIDB4NjgzYSwgMHgwMGUwLCAweGEwYmUsCisJMHgwMzAwLCAweDAxYzgsIDB4MDBkZSwgMHgwODA0LCAweDJmZDIsIDB4YWQ4MCwgMHgwMDEwLCAweDIwYTksCisJMHgwMDA3LCAweDA4MGMsIDB4M2NkOSwgMHhhZDgwLCAweDAwMGUsIDB4MjBhOSwgMHgwMDAxLCAweDA4MGMsCisJMHgzY2Q5LCAweDAwNDgsIDB4YWQ4MCwgMHgwMDBjLCAweDA4MGMsIDB4M2NlNywgMHgwMDUwLCAweGFkODAsCisJMHgwMDBlLCAweDA4MGMsIDB4M2NlNywgMHhhZDgwLCAweDAwMGMsIDB4MjBhOSwgMHgwMDAxLCAweDA4MGMsCisJMHgzY2Q5LCAweDAwYzYsIDB4MDgwYywgMHgzZTc1LCAweDA1NjgsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHg2ODM3LCAweDAxMTksIDB4Njg1MywgMHgwMDAwLCAweDY4NGYsIDB4MDAyMCwgMHg2ODViLCAweDAwMDEsCisJMHg4MTBiLCAweDY5N2UsIDB4Njg4MywgMHgwMDAwLCAweDZhODYsIDB4NmI4YSwgMHg2YzhlLCAweDZkOTIsCisJMHg2OTk2LCAweDY4OWIsIDB4MDAwMCwgMHgwMGNlLCAweDAwZGUsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4NjgyMywgMHgwMDAwLCAweDY4MDQsIDB4MjA2OCwgMHgwODBjLCAweDlkYTIsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzY2QwLCAweDAwMDUsIDB4MDBjZSwgMHgwMGRlLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDJmY2YsCisJMHg2ODIwLCAweGEwODYsIDB4ODAwMSwgMHgxOTA0LCAweDJmYWEsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsCisJMHgyZmNmLCAweDAwMTYsIDB4MjAwOCwgMHgyMDQ0LCAweDgwMDAsIDB4MjA0YywgMHg4MDAwLCAweDI5MGEsCisJMHg4MTA4LCAweDI4MGEsIDB4ODEwOCwgMHgxZjA0LCAweDNjZGIsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMGE2LCAweDAwYjYsIDB4MjAwOCwgMHgyMDQ0LCAweDgwMDAsIDB4MjA0YywgMHg4MDAwLCAweDIwNTQsCisJMHg4MDAwLCAweDIwNWMsIDB4MmIwYSwgMHg4MTA4LCAweDJhMGEsIDB4ODEwOCwgMHgyOTBhLCAweDgxMDgsCisJMHgyODBhLCAweDAwYmUsIDB4MDBhZSwgMHgwMDFlLCAweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksCisJMHgwMDAxLCAweDA4MDQsIDB4MmZjZiwgMHg2MGQ0LCAweGQwYWMsIDB4MTEzMCwgMHhkMDljLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDUsIDB4MDgwNCwgMHgyZmNmLCAweDc5MjQsIDB4MjE0MCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweDYwZDQsIDB4ZDBhYywgMHgxMTIwLCAweGExODIsIDB4MDA4MCwgMHgwYTA0LCAweDJmZDIsCisJMHhhMTgyLCAweDAwZmYsIDB4MWEwNCwgMHgyZmQyLCAweDdhMmMsIDB4N2IyOCwgMHg2MDcwLCAweGEzMDYsCisJMHgxMTQwLCAweDYwNzQsIDB4YTI0ZSwgMHgwOTA0LCAweDJmZDIsIDB4YTljYywgMHhmZjAwLCAweDA5MDQsCisJMHgyZmQyLCAweDAwYzYsIDB4MDgwYywgMHgzZGM1LCAweDJjNjgsIDB4MDBjZSwgMHgwNTMwLCAweGEwYzYsCisJMHg0MDAwLCAweDExNzgsIDB4MDBjNiwgMHgwMDA2LCAweDJkNjAsIDB4YTAwZSwgMHgwODBjLCAweDUyNGEsCisJMHgxMTA4LCAweGMxODUsIDB4NjAwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwMDBlLCAweDAwY2UsCisJMHgwMDg4LCAweGEwYzYsIDB4NDAwNywgMHgxMTEwLCAweDI0MDgsIDB4MDA2MCwgMHhhMGM2LCAweDQwMDgsCisJMHgxMTE4LCAweDI3MDgsIDB4MjYxMCwgMHgwMDMwLCAweGEwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwMTAsCisJMHgyMDAxLCAweDQwMDYsIDB4MjAyMCwgMHgwODA0LCAweDJmYWMsIDB4MmQwMCwgMHg3MDIyLCAweDAwMTYsCisJMHgwMGI2LCAweDAwYzYsIDB4MDBlNiwgMHgyYzcwLCAweDA4MGMsIDB4ODVjNywgMHgwNWQ4LCAweDJkMDAsCisJMHg2MDFhLCAweDA4MGMsIDB4YTAyNywgMHgyZTU4LCAweDAwZWUsIDB4MDBlNiwgMHgwMGM2LCAweDA4MGMsCisJMHgzZTc1LCAweDAwY2UsIDB4MmI3MCwgMHgxMTUwLCAweDA4MGMsIDB4ODYxZCwgMHgwMGVlLCAweDAwY2UsCisJMHgwMGJlLCAweDAwMWUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MmZjZiwgMHg2ODM3LCAweDAwMDAsCisJMHg2ODNiLCAweDAwMDAsIDB4MmQwMCwgMHg2MDEyLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHhkODhjLCAweDAxMDgsIDB4YzBmNSwgMHg2ODNhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHgyYzljLCAweDAxMmUsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRlZWIsCisJMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0ZWZkLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweDg2NGMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAxZSwgMHgxMTIwLCAweDIwMDksCisJMHgwMDAzLCAweDA4MDQsIDB4MmZjZiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzZGE4LCAweDAwMDUsCisJMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHg3MDIwLCAweDIwNjAsIDB4MTEzOCwgMHgyMDA5LCAweDAwMDQsCisJMHg2MjA0LCAweGEyOTQsIDB4MDBmZiwgMHgwODA0LCAweDJmY2YsIDB4MjAwOSwgMHgwMDAwLCAweDY4MzgsCisJMHhkMGY0LCAweDE5MDQsIDB4MmZhYSwgMHgwODBjLCAweDUyNGEsIDB4MTEwOCwgMHhjMTg1LCAweDYwMDAsCisJMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwODA0LCAweDJmYWEsIDB4MDBlNiwgMHgwMGQ2LCAweGEwMmUsCisJMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDAxMzAsIDB4YTAyNiwgMHgyMGE5LCAweDAwZmYsCisJMHgyMDcxLCAweGI2MzUsIDB4MDAzMCwgMHgyMDIxLCAweDAwODAsIDB4MjBhOSwgMHgwMDdmLCAweDIwNzEsCisJMHhiNmI1LCAweDJlMDQsIDB4YTAwNSwgMHgxMTMwLCAweDIxMDAsIDB4YTQwNiwgMHgxNTcwLCAweDI0MjgsCisJMHhjNWZkLCAweDA0NTgsIDB4MjA2OCwgMHg2ZjEwLCAweDI3MDAsIDB4YTMwNiwgMHgxMWIwLCAweDZlMTQsCisJMHgyNjAwLCAweGEyMDYsIDB4MTE5MCwgMHgyNDAwLCAweGExMDYsIDB4MTE2MCwgMHgyZDYwLCAweGQ4ODQsCisJMHgwNTY4LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxNTM4LCAweDIwMDEsCisJMHg0MDAwLCAweDA0MjgsIDB4MjAwMSwgMHg0MDA3LCAweDA0MTAsIDB4MjQwMCwgMHhhMTA2LCAweDExNjgsCisJMHg2ZTE0LCAweDg3ZmYsIDB4MTEzOCwgMHg4NmZmLCAweDA5ZDAsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsCisJMHhkMGFjLCAweDE5YTgsIDB4MjAwMSwgMHg0MDA4LCAweDAwOTAsIDB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsCisJMHgzZGQ5LCAweDg1ZmYsIDB4MTEzMCwgMHgyMDAxLCAweDQwMDksIDB4MDA0OCwgMHgyMDAxLCAweDAwMDEsCisJMHgwMDMwLCAweDA4MGMsIDB4NGY0ZCwgMHgxZGQwLCAweDYzMTIsIDB4NjIxNiwgMHhhMDA2LCAweGEwMDUsCisJMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlNzUsCisJMHgwOTA0LCAweDJmY2YsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc4MjQsCisJMHhhMDA1LCAweDA5MDQsIDB4MmZkMiwgMHhhMDk2LCAweDAwZmYsIDB4MDEyMCwgMHhhMDkyLCAweDAwMDQsCisJMHgxYTA0LCAweDJmZDIsIDB4MjAxMCwgMHgyZDE4LCAweDA4MGMsIDB4MmM0ZiwgMHgwOTA0LCAweDJmY2YsCisJMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzZTQ1LCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsCisJMHgwOTA0LCAweDJmY2YsIDB4MDgwNCwgMHgyZmFhLCAweDc5MjQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHg2MGQ0LCAweGQwYWMsIDB4MTEyMCwgMHhhMTgyLCAweDAwODAsIDB4MGEwNCwgMHgyZmQyLCAweGExODIsCisJMHgwMGZmLCAweDFhMDQsIDB4MmZkMiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDljOGEsCisJMHgxMTg4LCAweGExOTAsIDB4YjYzNSwgMHgyMjA0LCAweGEwNjUsIDB4MDE2MCwgMHgwODBjLCAweDRjMGIsCisJMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDAxMTAsIDB4NjAxNywgMHgwMDAwLCAweDAxMmUsCisJMHgwODA0LCAweDJmYWEsIDB4MDEyZSwgMHgwODA0LCAweDJmY2YsIDB4MDgwYywgMHgxNWY4LCAweDAxODgsCisJMHhhMDA2LCAweDY4MDIsIDB4NzAxMCwgMHhhMDA1LCAweDExMjAsIDB4MmQwMCwgMHg3MDEyLCAweDcwMTYsCisJMHgwMDMwLCAweDcwMTQsIDB4NjgwMiwgMHgyMDYwLCAweDJkMDAsIDB4NjAwNiwgMHg3MDE2LCAweGFkODAsCisJMHgwMDBkLCAweDAwMDUsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgwODBjLCAweDRmYTksCisJMHgxMTMwLCAweDdlMjgsIDB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgwMjA4LCAweGEwNjYsCisJMHg4Y2ZmLCAweDAwMDUsIDB4N2UyNCwgMHg4NjBmLCAweGExOGMsIDB4MDBmZiwgMHgwODBjLCAweDRmYTksCisJMHgxMTI4LCAweGE2YjQsIDB4MDBmZiwgMHhhNjgyLCAweDQwMDAsIDB4MDIwOCwgMHhhMDY2LCAweDhjZmYsCisJMHgwMDA1LCAweDAwMTYsIDB4NzExMCwgMHg4MWZmLCAweDAxMjgsIDB4MjE2OCwgMHg2OTA0LCAweDA4MGMsCisJMHgxNjBmLCAweDBjYzgsIDB4NzExMiwgMHg3MTE2LCAweDAwMWUsIDB4MDAwNSwgMHgyMDMxLCAweDAwMDEsCisJMHgwMDEwLCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweGI1ZDIsIDB4NjYwNiwgMHg2MTEyLCAweDYwMGUsCisJMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwgMHg2NTMyLCAweDJjMTAsIDB4MDgwYywgMHgxNjQzLCAweDcwMDcsCisJMHgwMDAyLCAweDcwMWIsIDB4MmZhYSwgMHgwMDA1LCAweDAwZjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDc5LCAweDAwMDAsIDB4MjAwMSwgMHhiNTkwLCAweDIwMDQsIDB4YTAwNSwgMHgxMTY4LCAweDBlMDQsCisJMHgzZWU0LCAweDc4MTgsIDB4ZDA4NCwgMHgxMTQwLCAweDdhMjIsIDB4N2IyNiwgMHg3YzJhLCAweDc4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwNDA4LCAweDAwMTYsIDB4MDBjNiwgMHgwMGU2LCAweDIwNzEsCisJMHhiNTgyLCAweDcxMzgsIDB4YTE4MiwgMHgwMDEwLCAweDAyMTgsIDB4NzAzMCwgMHgyMDYwLCAweDAwNzgsCisJMHg3MDMwLCAweGEwZTAsIDB4MDAwNCwgMHhhYzgyLCAweGI1ZDIsIDB4MDIxMCwgMHgyMDYxLCAweGI1OTIsCisJMHgyYzAwLCAweDcwMzIsIDB4ODFmZiwgMHgxMTA4LCAweDcwMzYsIDB4ODEwOCwgMHg3MTNhLCAweDIyNjIsCisJMHg2MzA2LCAweDY0MGEsIDB4MDBlZSwgMHgwMGNlLCAweDAwMWUsIDB4MDEyZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4YjU4MiwgMHg3MDM4LCAweGEwMDUsIDB4MDU3MCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDBlMDQsIDB4M2YzYiwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwgMHg3ODE4LCAweGQwODQsCisJMHgxNTA4LCAweDAwYzYsIDB4NzAzNCwgMHgyMDYwLCAweDJjMDQsIDB4NzgyMiwgMHg2MDA0LCAweDc4MjYsCisJMHg2MDA4LCAweDc4MmEsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDM4LCAweDgwMDEsCisJMHg3MDNhLCAweGEwMDUsIDB4MTEzMCwgMHg3MDMzLCAweGI1OTIsIDB4NzAzNywgMHhiNTkyLCAweDAwY2UsCisJMHgwMDQ4LCAweGFjODAsIDB4MDAwNCwgMHhhMGZhLCAweGI1ZDIsIDB4MDIxMCwgMHgyMDAxLCAweGI1OTIsCisJMHg3MDM2LCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDI2LCAweDIwMDEsCisJMHhiNTUzLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTIwLCAweDIwMTEsIDB4ODAxNCwgMHgwODBjLCAweDNlY2MsCisJMHgwMDJlLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDMwLCAweGMwOGQsIDB4YzA4NSwgMHhjMGFjLCAweDYwMzIsIDB4MDgwYywgMHg1YWNmLCAweDExNzgsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLCAweDAwMDEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHg1YjEzLCAweDA4MGMsIDB4NWEwNywgMHgwMDEwLCAweDA4MGMsCisJMHg0YjFmLCAweDAxMmUsIDB4MDgwNCwgMHgyZmFhLCAweDc4MjQsIDB4MjAwOCwgMHhhMThjLCAweGZmZmQsCisJMHgxMTI4LCAweDYxZTAsIDB4YTEwZCwgMHg2MWUyLCAweDA4MDQsIDB4MmZhYSwgMHgwODA0LCAweDJmZDIsCisJMHg4MWZmLCAweDE5MDQsIDB4MmZjZiwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJmY2YsCisJMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGFjLCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOWEsCisJMHgwOTA0LCAweDJmZDIsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExMjAsCisJMHg3ODI4LCAweGEwMDUsIDB4MDkwNCwgMHgyZmFhLCAweDAwYzYsIDB4MDgwYywgMHgzZTc1LCAweDAwY2UsCisJMHgwOTA0LCAweDJmY2YsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDA4MGMsIDB4OWU2YiwgMHgwOTA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzZmFhLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDkwNCwgMHgyZmNmLCAweDA4MDQsCisJMHgyZmFhLCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJmY2YsCisJMHg3ZjI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwYywgMHgzZTc1LCAweDA5MDQsCisJMHgyZmNmLCAweDIwMDksIDB4MDAwMCwgMHgyMDMxLCAweDAwMDAsIDB4NzAyMywgMHgwMDAwLCAweDcwMmYsCisJMHgwMDAwLCAweGFkODAsIDB4MDAwNSwgMHg3MDI2LCAweDIwYTAsIDB4MDgwYywgMHg0ZmE5LCAweDE5MDQsCisJMHg0MDI0LCAweDYwMDQsIDB4YTBjNCwgMHgwMGZmLCAweGE4YzYsIDB4MDAwNiwgMHgwMTMwLCAweGEwYzQsCisJMHhmZjAwLCAweGE4YzYsIDB4MDYwMCwgMHgxOTA0LCAweDQwMjQsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsCisJMHhkMGFjLCAweDExMjgsIDB4MDgwYywgMHg1MjRhLCAweDExMTAsIDB4ZDc5YywgMHgwNWU4LCAweGQ3OTQsCisJMHgxMTEwLCAweGQ3ODQsIDB4MDE1OCwgMHhhYzgwLCAweDAwMDYsIDB4MjA5OCwgMHgzNDAwLCAweDIwYTksCisJMHgwMDA0LCAweDUzYTMsIDB4MDgwYywgMHgzY2U3LCAweGQ3OTQsIDB4MDE0OCwgMHhhYzgwLCAweDAwMGEsCisJMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MDgwYywgMHgzY2U3LCAweDIxYTIsCisJMHhkNzk0LCAweDAxZDgsIDB4YWM4MCwgMHgwMDAwLCAweDIwOTgsIDB4OTRhMCwgMHgyMGE5LCAweDAwMDIsCisJMHg1M2EzLCAweGFjODAsIDB4MDAwMywgMHgyMGE2LCAweDk0YTAsIDB4YWM4MCwgMHgwMDA0LCAweDIwOTgsCisJMHgzNDAwLCAweDIwYTksIDB4MDAwMiwgMHg1M2EzLCAweDA4MGMsIDB4M2NkOSwgMHhhYzgwLCAweDAwMjYsCisJMHgyMDk4LCAweDIwYTksIDB4MDAwMiwgMHg1M2EzLCAweDAwMDgsIDB4OTRhMCwgMHhkNzk0LCAweDAxMTAsCisJMHhhNmIwLCAweDAwMGIsIDB4YTZiMCwgMHgwMDA1LCAweDgxMDgsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsCisJMHhkMGFjLCAweDAxMTgsIDB4YTE4NiwgMHgwMTAwLCAweDAwNDAsIDB4ZDc4YywgMHgwMTIwLCAweGExODYsCisJMHgwMTAwLCAweDAxNzAsIDB4MDAxOCwgMHhhMTg2LCAweDAwN2UsIDB4MDE1MCwgMHhkNzk0LCAweDAxMTgsCisJMHhhNjg2LCAweDAwMjAsIDB4MDAxMCwgMHhhNjg2LCAweDAwMjgsIDB4MDE1MCwgMHgwODA0LCAweDNmY2QsCisJMHg4NmZmLCAweDExMjAsIDB4NzEyMCwgMHg4MTBiLCAweDA4MDQsIDB4MmZhYSwgMHg3MDJmLCAweDAwMDEsCisJMHg3MTFlLCAweDcwMjAsIDB4YTYwMCwgMHg3MDIyLCAweDc3MmEsIDB4MjA2MSwgMHhiNWQyLCAweDYwMDcsCisJMHgwMDAwLCAweDY2MTIsIDB4NzAyNCwgMHg2MDBlLCAweDYyMjYsIDB4NjMyYSwgMHg2NDJlLCAweDY1MzIsCisJMHgyYzEwLCAweDA4MGMsIDB4MTY0MywgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHg0MDYwLCAweDAwMDUsCisJMHg3MDJjLCAweGEwMDUsIDB4MTE3MCwgMHg3MTFjLCAweDcwMjQsIDB4MjBhMCwgMHg3NzI4LCAweDIwMzEsCisJMHgwMDAwLCAweDIwNjEsIDB4YjVkMiwgMHg2MjI0LCAweDYzMjgsIDB4NjQyYywgMHg2NTMwLCAweDA4MDQsCisJMHgzZmNkLCAweDcxMjAsIDB4ODEwYiwgMHgwODA0LCAweDJmYWEsIDB4MjAyOSwgMHgwMDdlLCAweDc5MjQsCisJMHg3YTI4LCAweDdiMmMsIDB4N2MzOCwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsCisJMHgwYTA0LCAweDJmZDIsIDB4YTUwMiwgMHgwYTA0LCAweDJmZDIsIDB4YTE4NCwgMHgwMGZmLCAweGEwZTIsCisJMHgwMDIwLCAweDBhMDQsIDB4MmZkMiwgMHhhNTAyLCAweDBhMDQsIDB4MmZkMiwgMHhhMjg0LCAweGZmMDAsCisJMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDJmZDIsIDB4YTUwMiwgMHgwYTA0LCAweDJmZDIsCisJMHhhMjg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MmZkMiwgMHhhNTAyLCAweDBhMDQsCisJMHgyZmQyLCAweGEzODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDJmZDIsCisJMHhhNTAyLCAweDBhMDQsIDB4MmZkMiwgMHhhMzg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDBhMDQsCisJMHgyZmQyLCAweGE1MDIsIDB4MGEwNCwgMHgyZmQyLCAweGE0ODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsCisJMHgwMDIwLCAweDBhMDQsIDB4MmZkMiwgMHhhNTAyLCAweDBhMDQsIDB4MmZkMiwgMHhhNDg0LCAweDAwZmYsCisJMHhhMGUyLCAweDAwMjAsIDB4MGEwNCwgMHgyZmQyLCAweGE1MDIsIDB4MGEwNCwgMHgyZmQyLCAweDIwNjEsCisJMHhiN2I5LCAweDYxMDIsIDB4NjIwNiwgMHg2MzBhLCAweDY0MGUsIDB4MDgwNCwgMHgyZmFhLCAweDAwMDYsCisJMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGNjLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsCisJMHhiNTcyLCAweDIwMDQsIDB4ZDBiYywgMHgwMDBlLCAweDAwMDUsIDB4NjE2OCwgMHg3YTI0LCAweDYzMDAsCisJMHg4MmZmLCAweDExMTgsIDB4NzkyNiwgMHgwODA0LCAweDJmYWEsIDB4ODNmZiwgMHgxOTA0LCAweDJmZDIsCisJMHgyMDAxLCAweGZmZjAsIDB4YTIwMCwgMHgxYTA0LCAweDJmZDIsIDB4MjAxOSwgMHhmZmZmLCAweDYwNmMsCisJMHhhMzAyLCAweGEyMDAsIDB4MGEwNCwgMHgyZmQyLCAweDc5MjYsIDB4NjI2YSwgMHgwODA0LCAweDJmYWEsCisJMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZmNmLCAweDdjMjgsCisJMHg3ZDI0LCAweDdlMzgsIDB4N2YyYywgMHgwODBjLCAweDNlNzUsIDB4MDkwNCwgMHgyZmNmLCAweDIwMDksCisJMHgwMDAwLCAweDIwMTksIDB4MDAwMCwgMHg3MDIzLCAweDAwMDAsIDB4NzAyZiwgMHgwMDAwLCAweGFkODAsCisJMHgwMDAzLCAweDcwMjYsIDB4MjBhMCwgMHhhMWUwLCAweGI2MzUsIDB4MmM2NCwgMHg4Y2ZmLCAweDAxYjgsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEzMCwgMHg2MDA0LCAweGEwODQsCisJMHhmZjAwLCAweGEwODYsIDB4MDYwMCwgMHgxMTU4LCAweDYwMTQsIDB4MjBhMiwgMHg5NGEwLCAweDYwMTAsCisJMHg4MDA3LCAweGExMDUsIDB4ODAwNywgMHgyMGEyLCAweDk0YTAsIDB4YTM5OCwgMHgwMDAyLCAweDgxMDgsCisJMHhhMTgyLCAweDAwZmYsIDB4MDEyMCwgMHhhMzg2LCAweDAwMmEsIDB4MDE0OCwgMHgwOGUwLCAweDgzZmYsCisJMHgxMTIwLCAweDcxMjAsIDB4ODEwYywgMHgwODA0LCAweDJmYWEsIDB4NzAyZiwgMHgwMDAxLCAweDcxMWUsCisJMHg3MDIwLCAweGEzMDAsIDB4NzAyMiwgMHgyMDYxLCAweGI1ZDIsIDB4NjAwNywgMHgwMDAwLCAweDYzMTIsCisJMHg3MDI0LCAweDYwMGUsIDB4NjQyNiwgMHg2NTJhLCAweDY2MmUsIDB4NjczMiwgMHgyYzEwLCAweDA4MGMsCisJMHgxNjQzLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLCAweDQxNTYsIDB4MDAwNSwgMHg3MDJjLCAweGEwMDUsCisJMHgxMTY4LCAweDcxMWMsIDB4NzAyNCwgMHgyMGEwLCAweDIwMTksIDB4MDAwMCwgMHgyMDYxLCAweGI1ZDIsCisJMHg2NDI0LCAweDY1MjgsIDB4NjYyYywgMHg2NzMwLCAweDA4MDQsIDB4NDExMywgMHg3MTIwLCAweDgxMGMsCisJMHgwODA0LCAweDJmYWEsIDB4ODFmZiwgMHgxOTA0LCAweDJmY2YsIDB4NjBkNCwgMHhkMGFjLCAweDExMTgsCisJMHhkMDljLCAweDA5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlNzUsIDB4MDkwNCwgMHgyZmNmLCAweDc5MjQsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsIDB4M2ViNiwgMHg3MDFiLCAweDQxODEsCisJMHgwMDA1LCAweDAwZDYsIDB4YWRlOCwgMHgwMDBkLCAweDY4MjgsIDB4YTBiZSwgMHg3MDAwLCAweDAxNDgsCisJMHhhMGJlLCAweDcxMDAsIDB4MDEzMCwgMHhhMGJlLCAweDcyMDAsIDB4MDExOCwgMHgwMGRlLCAweDA4MDQsCisJMHgyZmQyLCAweDY4MjAsIDB4NjkyNCwgMHgwODBjLCAweDI4MWQsIDB4MTUxMCwgMHgwODBjLCAweDRmNGQsCisJMHgxMWY4LCAweDcxMjIsIDB4NjYxMiwgMHg2NTE2LCAweDZlMTgsIDB4MDBjNiwgMHgwODBjLCAweDNlNzUsCisJMHgwMWI4LCAweDA4MGMsIDB4M2U3NSwgMHgwMWEwLCAweDAwY2UsIDB4MDBkZSwgMHg2ODM3LCAweDAwMDAsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODIzLCAweDAwMDAsIDB4NjgwNCwgMHgyMDY4LCAweDA4MGMsCisJMHg5ZGJlLCAweDA5MDQsIDB4MmZjZiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHg0MWJiLCAweDAwMDUsCisJMHgwMGRlLCAweDA4MDQsIDB4MmZjZiwgMHg3MTIwLCAweDA4MGMsIDB4MmQ5NywgMHg2ODIwLCAweGEwODYsCisJMHg4MDAxLCAweDA5MDQsIDB4MmZjZiwgMHgyZDAwLCAweDcwMWUsIDB4NjgwNCwgMHhhMDgwLCAweDAwMDIsCisJMHgwMDA2LCAweDIwYTksIDB4MDAyYSwgMHgyMDk4LCAweDIwYTAsIDB4MDgwYywgMHg0YjhmLCAweDAwMGUsCisJMHhhZGU4LCAweDAwMGQsIDB4NmEwOCwgMHg2YjBjLCAweDZjMTAsIDB4NmQxNCwgMHgyMDYxLCAweGI1ZDIsCisJMHg2MDA3LCAweDAwMDAsIDB4NmUwMCwgMHg2ZjI4LCAweGE3YzYsIDB4NzAwMCwgMHgxMTA4LCAweDAwMTgsCisJMHhhN2M2LCAweDcxMDAsIDB4MTE0MCwgMHhhNmMyLCAweDAwMDQsIDB4MGEwNCwgMHgyZmQyLCAweDIwMDksCisJMHgwMDA0LCAweDA4MDQsIDB4M2ViOSwgMHhhN2M2LCAweDcyMDAsIDB4MTkwNCwgMHgyZmQyLCAweGE2YzIsCisJMHgwMDU0LCAweDBhMDQsIDB4MmZkMiwgMHg2MDBlLCAweDYwMTMsIDB4MDAyYSwgMHg2MjI2LCAweDYzMmEsCisJMHg2NDJlLCAweDY1MzIsIDB4MmMxMCwgMHgwODBjLCAweDE2NDMsIDB4NzAwNywgMHgwMDAyLCAweDcwMWIsCisJMHg0MjAyLCAweDAwMDUsIDB4NzAxYywgMHgyMDY4LCAweDY4MDQsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsCisJMHhhMDgwLCAweDAwMDIsIDB4MDAwNiwgMHgyMGE5LCAweDAwMmEsIDB4MjA5OCwgMHgyMGEwLCAweDA4MGMsCisJMHg0YjhmLCAweDAwMGUsIDB4MjAwOSwgMHgwMDJhLCAweDIwNjEsIDB4YjVkMiwgMHg2MjI0LCAweDYzMjgsCisJMHg2NDJjLCAweDY1MzAsIDB4MDgwNCwgMHgzZWI5LCAweDgxZmYsIDB4MTkwNCwgMHgyZmNmLCAweDc5MmMsCisJMHgyMDAxLCAweGI3YTAsIDB4MjEwMiwgMHgwODBjLCAweDNlOGEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MGMsCisJMHg1MDZmLCAweDA5MDQsIDB4MmZjZiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDUxYTEsCisJMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHg3ODI0LCAweGQwOGMsIDB4MTExOCwgMHhkMDg0LCAweDA5MDQsCisJMHgzYTQ2LCAweDA4MGMsIDB4M2U5YSwgMHgwOTA0LCAweDJmZDIsIDB4MDBjNiwgMHgwODBjLCAweDNlNzUsCisJMHgwMGNlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MmZjZiwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMTI4LCAweGEwOGUsIDB4MDAwNCwgMHgwMTEwLCAweGEwOGUsCisJMHgwMDA1LCAweDE1YjgsIDB4NzgyNCwgMHhkMDhjLCAweDAxMjAsIDB4NjAwMCwgMHhjMDhjLCAweDYwMDIsCisJMHgwMDMwLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYjQsIDB4MDkwNCwgMHgzYTgyLCAweDc4MjQsCisJMHhhMDg0LCAweGZmMDAsIDB4YTA4ZSwgMHg3ZTAwLCAweDA5MDQsIDB4M2E4MiwgMHhhMDhlLCAweDdmMDAsCisJMHgwOTA0LCAweDNhODIsIDB4YTA4ZSwgMHg4MDAwLCAweDA5MDQsIDB4M2E4MiwgMHg2MDAwLCAweGQwOGMsCisJMHgxOTA0LCAweDNhODIsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDA4MGMsCisJMHg5ZGRhLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MmZjZiwgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDQyODMsIDB4MDAwNSwgMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLCAweDA4MDQsCisJMHgzYTgyLCAweDIwMDksIDB4YjUzMSwgMHgyMTBjLCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODA0LCAweDJmY2YsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwgMHgyZmNmLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYWMsCisJMHgwMTIwLCAweDIwMDksIDB4MDAwOCwgMHgwODA0LCAweDJmY2YsIDB4NjA5YywgMHhkMGE0LCAweDExMTgsCisJMHhkMGFjLCAweDE5MDQsIDB4M2E4MiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4MDgwYywgMHg5ZTZiLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsCisJMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDQyYmUsIDB4MDAwNSwgMHg2ODMwLCAweGEwODYsCisJMHgwMTAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOWEsCisJMHgwOTA0LCAweDJmZDIsIDB4MDgwNCwgMHg0MjUyLCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDE5MDQsCisJMHgyZmNmLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LCAweDJmY2YsCisJMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGFjLCAweDIwMDksIDB4MDAwOCwgMHgxOTA0LCAweDJmY2YsCisJMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDJmY2YsIDB4MDBjNiwgMHgwODBjLCAweDNlNzUsCisJMHgwMGNlLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LCAweDJmY2YsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsCisJMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc5MjgsIDB4YTE5NCwgMHhmZjAwLCAweGExOGMsCisJMHgwMGZmLCAweGEwMDYsIDB4ODJmZiwgMHgxMTI4LCAweGMwZWQsIDB4Njk1MiwgMHg3OTJjLCAweDY5NTYsCisJMHgwMDQ4LCAweGEyOGUsIDB4MDEwMCwgMHgxOTA0LCAweDJmZDIsIDB4YzBlNSwgMHg2ODUzLCAweDAwMDAsCisJMHg2ODU3LCAweDAwMDAsIDB4NjgzZSwgMHgwODBjLCAweGEwMjgsIDB4MjAwOSwgMHgwMDAzLCAweDA5MDQsCisJMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDQzMWUsIDB4MDAwNSwgMHg2ODMwLCAweGEwODYsCisJMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwOTA0LCAweDJmY2YsIDB4MDgwNCwgMHgyZmFhLCAweDgxZmYsCisJMHgyMDA5LCAweDAwMDEsIDB4MTkwNCwgMHgyZmNmLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksCisJMHgwMDA3LCAweDE5MDQsIDB4MmZjZiwgMHgwODBjLCAweDNlOWEsIDB4MDkwNCwgMHgyZmQyLCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDJmY2YsCisJMHgwMGM2LCAweDA4MGMsIDB4M2U3NSwgMHgwMGNlLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LCAweDJmY2YsCisJMHhhZDgwLCAweDAwMGYsIDB4MjAwOSwgMHgwMDA4LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgwODBjLCAweDNlYjYsIDB4NzAxYiwgMHg0MzU1LCAweDAwMDUsIDB4MDBkNiwgMHhhZGU4LCAweDAwMGYsCisJMHg2ODAwLCAweGEwODYsIDB4MDUwMCwgMHgxMTQwLCAweDY4MDQsIDB4YTAwNSwgMHgxMTI4LCAweDY4MDgsCisJMHhhMDg0LCAweGZmMDAsIDB4MTEwOCwgMHgwMDE4LCAweDAwZGUsIDB4MTkwNCwgMHgyZmQyLCAweDAwZGUsCisJMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDAwYzYsCisJMHgwODBjLCAweDNlOWEsIDB4MTExOCwgMHgwMGNlLCAweDA4MDQsIDB4MmZkMiwgMHgwODBjLCAweGEwNzcsCisJMHgyMDA5LCAweDAwMDMsIDB4MDBjZSwgMHgwOTA0LCAweDJmY2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHg0MzgyLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MjAwOSwgMHgwMDA0LCAweDA5MDQsCisJMHgyZmNmLCAweDA4MDQsIDB4MmZhYSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsCisJMHgyZmNmLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsCisJMHgyZmNmLCAweDdlMjQsIDB4ODYwZiwgMHhhMThjLCAweDAwZmYsIDB4YTZiNCwgMHgwMGZmLCAweDA4MGMsCisJMHg0ZmE5LCAweDE5MDQsIDB4MmZkMiwgMHhhMTg2LCAweDAwN2YsIDB4MDE1MCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMTIwLCAweDIwMDksIDB4MDAwOSwgMHgwODA0LCAweDJmY2YsCisJMHgwMGM2LCAweDA4MGMsIDB4M2U3NSwgMHgwMGNlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgyZmNmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgyMDAxLCAweDAxMDAsCisJMHg4MDA3LCAweDY4MGEsIDB4MDgwYywgMHg5ZGY1LCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsCisJMHgyZmNmLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDQzY2UsIDB4MDAwNSwgMHg2ODA4LCAweDgwMDcsCisJMHhhMDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgyZmNmLCAweDY4YjAsCisJMHg2ODM2LCAweDY4MTAsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4ODAwYywgMHg2ODE0LCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwNCwgMHhhMDgwLCAweDAwMDIsIDB4YTEwOCwgMHhhZDgwLCAweDAwMDQsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MDQsIDB4M2ViOSwgMHgwODBjLCAweDNlNzUsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDJmY2YsIDB4NzkyNCwgMHhhMTk0LCAweGZmMDAsCisJMHhhMThjLCAweDAwZmYsIDB4ODIxNywgMHg4MmZmLCAweDAxMTAsIDB4MDgwNCwgMHgyZmQyLCAweDIwMDksCisJMHgwMDFhLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwYywgMHgzZWI2LCAweDcwMWIsCisJMHg0NDBhLCAweDAwMDUsIDB4MjAwMSwgMHhiNTJhLCAweDIwMDMsIDB4MDAwMSwgMHhhZDgwLCAweDAwMGQsCisJMHgyMDk4LCAweDIwYTksIDB4MDAxYSwgMHgyMGExLCAweGI3YzYsIDB4NTNhMywgMHgwODA0LCAweDJmYWEsCisJMHgwODBjLCAweDNlNzUsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZmNmLCAweDc5MjQsCisJMHhhMTk0LCAweGZmMDAsIDB4YTE4YywgMHgwMGZmLCAweDgyMTcsIDB4ODJmZiwgMHgwMTEwLCAweDA4MDQsCisJMHgyZmQyLCAweDIwOTksIDB4YjdjNiwgMHgyMGEwLCAweDIwYTksIDB4MDAxYSwgMHg1M2EzLCAweDIwMDksCisJMHgwMDFhLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzZWI5LCAweDc4MjQsCisJMHhhMDhhLCAweDEwMDAsIDB4MWEwNCwgMHgyZmQyLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgwMDMsCisJMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgwMGM2LCAweDIwNjEsIDB4YjdmMywgMHg2MTQyLCAweDAwY2UsCisJMHgwMTJlLCAweDA4MDQsIDB4MmZhYSwgMHgwMGM2LCAweDA4MGMsIDB4NWFjZiwgMHgxMTg4LCAweDIwMDEsCisJMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLCAweGEwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgwODBjLCAweDVhMDcsIDB4MDgwYywgMHgxNTE1LCAweDAwMzgsCisJMHgyMDYxLCAweGI1MDAsIDB4NjAzMCwgMHhjMDlkLCAweDYwMzIsIDB4MDgwYywgMHg0YjFmLCAweDAwY2UsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MjA2MSwgMHhiN2YzLCAweDc5MjQsCisJMHg2MTUyLCAweDYxNGUsIDB4NjA1NywgMHgwMDAwLCAweDYwNGIsIDB4MDAwOSwgMHg3ODM4LCAweDYwNmEsCisJMHg3ODNjLCAweDYwNjYsIDB4NzgyOCwgMHg2MDYyLCAweDc4MmMsIDB4NjA1ZSwgMHgyMDYxLCAweGI3YTEsCisJMHgyMDAxLCAweGI4MDgsIDB4NjAwZSwgMHg2MDEzLCAweDAwMDEsIDB4NjAxNywgMHgwMDAyLCAweDYwMDcsCisJMHgwMDAwLCAweDYwMzcsIDB4MDAwMCwgMHgwMGNlLCAweDAxMmUsIDB4MDgwNCwgMHgyZmFhLCAweDAxMjYsCisJMHgwMGM2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YjUwMCwgMHg2MDQ0LCAweGQwYTQsCisJMHgxMWIwLCAweGQwODQsIDB4MDExOCwgMHgwODBjLCAweDQ2MDYsIDB4MDA2OCwgMHhkMDhjLCAweDAxMTgsCisJMHgwODBjLCAweDQ1MjcsIDB4MDA0MCwgMHhkMDk0LCAweDAxMTgsIDB4MDgwYywgMHg0NGY4LCAweDAwMTgsCisJMHhkMDljLCAweDAxMDgsIDB4MDA2MSwgMHgwMGVlLCAweDAwY2UsIDB4MDEyZSwgMHgwMDA1LCAweDAwMTYsCisJMHg2MTI4LCAweGQxOWMsIDB4MTExMCwgMHhjMTlkLCAweDYxMmEsIDB4MDAxZSwgMHgwY2EwLCAweDYyNGMsCisJMHhhMjg2LCAweGYwZjAsIDB4MTE1MCwgMHg2MDQ4LCAweGEwODYsIDB4ZjBmMCwgMHgwMTMwLCAweDYyNGEsCisJMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDA0OTAsIDB4YTI5NCwgMHhmZjAwLCAweGEyOTYsCisJMHhmNzAwLCAweDAxNzgsIDB4NzEzNCwgMHhkMWE0LCAweDExNjAsIDB4NjI0MCwgMHhhMjk1LCAweDAxMDAsCisJMHg2MjQyLCAweGEyOTQsIDB4MDAxMCwgMHgwMTI4LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDRiYWYsCisJMHgwMGYwLCAweDYwNDAsIDB4YTA4NCwgMHgwMDEwLCAweGEwODUsIDB4MDE0MCwgMHg2MDQyLCAweDYwNDMsCisJMHgwMDAwLCAweDcwN2IsIDB4MDAwMCwgMHg3MDk3LCAweDAwMDEsIDB4NzBiYiwgMHgwMDAwLCAweDcwZDcsCisJMHgwMDAwLCAweDIwMDksIDB4YmNjMCwgMHgyMDBiLCAweDAwMDAsIDB4NzA4YiwgMHgwMDAwLCAweDcwN2YsCisJMHgwMDBhLCAweDIwMDksIDB4MDAwYSwgMHgyMDExLCAweDRhZDUsIDB4MDgwYywgMHg2YTIyLCAweDAwMDUsCisJMHgwMTU2LCAweDIwMDEsIDB4YjU3NCwgMHgyMDA0LCAweGQwOGMsIDB4MDExMCwgMHg3MDUzLCAweGZmZmYsCisJMHg3MDdjLCAweGEwMDUsIDB4MTUxMCwgMHgyMDExLCAweDRhZDUsIDB4MDgwYywgMHg2OTljLCAweDYwNDAsCisJMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDIwLCAweDYwNDIsIDB4MjBhOSwgMHgwMGM4LCAweDYwNDQsCisJMHhkMDhjLCAweDExNjgsIDB4MWYwNCwgMHg0NTBmLCAweDYyNDIsIDB4NzA4ZiwgMHgwMDAwLCAweDYwNDAsCisJMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDgwLCAweDYwNDIsIDB4NjI0MiwgMHgwMDMwLCAweDYyNDIsCisJMHg3MDhmLCAweDAwMDAsIDB4NzA4MywgMHgwMDAwLCAweDAwMDAsIDB4MDE1ZSwgMHgwMDA1LCAweDcwODAsCisJMHhhMDhhLCAweDAwMDMsIDB4MTIxMCwgMHgwMDIzLCAweDAwMTAsIDB4MDgwYywgMHgxNTE1LCAweDAwMDUsCisJMHg0NTMzLCAweDQ1ODMsIDB4NDYwNSwgMHgwMGY2LCAweDcwODMsIDB4MDAwMSwgMHgyMGUxLCAweGEwMDAsCisJMHhlMDAwLCAweDIwZTEsIDB4ODcwMCwgMHgwODBjLCAweDI0NzAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDIwNzksIDB4YmIwMCwgMHgyMDdiLCAweDIyMDAsIDB4NzgwNywgMHgwMGVmLCAweDc4MGIsCisJMHgwMDAwLCAweDc4MGYsIDB4MDBlZiwgMHg3ODEzLCAweDAxMzgsIDB4NzgxNywgMHgwMDAwLCAweDc4MWIsCisJMHgwMDAwLCAweDc4MWYsIDB4MDAwMCwgMHg3ODIzLCAweGZmZmYsIDB4NzgyNywgMHhmZmZmLCAweDc4MmIsCisJMHgwMDAwLCAweDc4MmYsIDB4MDAwMCwgMHgyMDc5LCAweGJiMGMsIDB4MjA3YiwgMHgxMTAxLCAweDc4MDcsCisJMHgwMDAwLCAweDIwOTksIDB4YjUwNSwgMHgyMGExLCAweGJiMGUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsCisJMHgyMDc5LCAweGJiMTIsIDB4MjA3YiwgMHgwMDAwLCAweDc4MDcsIDB4MDAwMCwgMHgyMDk5LCAweGJiMDAsCisJMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDE0LCAweDUzYTYsIDB4NjBjMywgMHgwMDBjLCAweDYwMGYsCisJMHgwMDAwLCAweDA4MGMsIDB4NGIwNiwgMHgwMGZlLCAweDcwODcsIDB4MDAwMCwgMHg2MDQzLCAweDAwMDgsCisJMHg2MDQzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGQ2LCAweDcwODQsIDB4NzA4NywgMHgwMDAwLCAweGEwMjUsCisJMHgwOTA0LCAweDQ1ZWQsIDB4NjAyMCwgMHhkMGI0LCAweDE5MDQsIDB4NDVlYiwgMHg3MTk0LCAweDgxZmYsCisJMHgwOTA0LCAweDQ1ZGIsIDB4YTQ4NiwgMHgwMDBjLCAweDE5MDQsIDB4NDVlNiwgMHhhNDgwLCAweDAwMTgsCisJMHg4MDA0LCAweDIwYTgsIDB4MjAxMSwgMHhiYjgwLCAweDIwMTksIDB4YmIwMCwgMHgyMjBjLCAweDIzMDQsCisJMHhhMTA2LCAweDExYjgsIDB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4NDU5ZSwgMHg2MDQzLCAweDAwMDQsCisJMHg2MDhiLCAweGJjOTQsIDB4NjA4ZiwgMHhmMGYwLCAweDYwNDMsIDB4MDAwNiwgMHg3MDgzLCAweDAwMDIsCisJMHg3MDhmLCAweDAwMDIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDZhMjIsCisJMHgwNDkwLCAweDIwNjksIDB4YmI4MCwgMHg2OTMwLCAweGExOGUsIDB4MTEwMSwgMHgxNTM4LCAweDY4MzQsCisJMHhhMDA1LCAweDE1MjAsIDB4NjkwMCwgMHhhMThjLCAweDAwZmYsIDB4MTExOCwgMHg2ODA0LCAweGEwMDUsCisJMHgwMTkwLCAweDIwMTEsIDB4YmI4ZSwgMHgyMDE5LCAweGI1MDUsIDB4MjBhOSwgMHgwMDA0LCAweDIyMGMsCisJMHgyMzA0LCAweGExMDIsIDB4MDIzMCwgMHgxMTkwLCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweDQ1Y2YsCisJMHgwMDY4LCAweDcwOTcsIDB4MDAwMCwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksCisJMHhiYjgwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMTQsIDB4NTNhNiwgMHg2MDQzLCAweDAwMDgsCisJMHg2MDQzLCAweDAwMDAsIDB4MDAxMCwgMHgwMGRlLCAweDAwMDUsIDB4NjA0MCwgMHhhMDg1LCAweDAxMDAsCisJMHg2MDQyLCAweDYwMjAsIDB4ZDBiNCwgMHgxZGI4LCAweDYwYzMsIDB4MDAwYywgMHgyMDExLCAweGI3ZWEsCisJMHgyMDEzLCAweDAwMDAsIDB4NzA4NywgMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHg2MGEzLCAweDAwNTYsCisJMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg3ZDcxLCAweDBjMzAsIDB4MDAwNSwgMHg3MDhjLCAweGEwOGEsCisJMHgwMDFkLCAweDEyMTAsIDB4MDAyMywgMHgwMDEwLCAweDA4MGMsIDB4MTUxNSwgMHgwMDA1LCAweDQ2MzksCisJMHg0NjQ4LCAweDQ2NzAsIDB4NDY4OSwgMHg0NmFkLCAweDQ2ZDUsIDB4NDZmOSwgMHg0NzJhLCAweDQ3NGUsCisJMHg0Nzc2LCAweDQ3YWQsIDB4NDdkNSwgMHg0N2YxLCAweDQ4MDcsIDB4NDgyNywgMHg0ODNhLCAweDQ4NDIsCisJMHg0ODcyLCAweDQ4OTYsIDB4NDhiZSwgMHg0OGUyLCAweDQ5MTMsIDB4NDk1MCwgMHg0OTdmLCAweDQ5OWIsCisJMHg0OWRhLCAweDQ5ZmEsIDB4NGExMywgMHg0YTE0LCAweDAwYzYsIDB4MjA2MSwgMHhiNTAwLCAweDYwMDMsCisJMHgwMDA3LCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweGEwODQsIDB4ZmZmOSwgMHg2MDA2LCAweDAwY2UsCisJMHgwMDA1LCAweDYwOGIsIDB4YmM5NCwgMHg2MDhmLCAweGYwZjAsIDB4NjA0MywgMHgwMDAyLCAweDcwOGYsCisJMHgwMDAxLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2YTIyLCAweDAwMDUsCisJMHgwMGY2LCAweDcwODQsIDB4YTA4NiwgMHgwMDE0LCAweDE1MDgsIDB4NjA0MywgMHgwMDAwLCAweDYwMjAsCisJMHhkMGI0LCAweDExZTAsIDB4MjA3OSwgMHhiYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTAyLCAweDExYTAsCisJMHg3ODM0LCAweGEwMDUsIDB4MTE4OCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI4LCAweGEwMDUsCisJMHgxMTEwLCAweDcwYmIsIDB4MDAwMSwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweDcwOGYsCisJMHgwMDEwLCAweDA4MGMsIDB4NDg0MiwgMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLCAweDAwMDUsCisJMHg3MDhmLCAweDAwMDMsIDB4NjA0MywgMHgwMDA0LCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDY5OWMsCisJMHgwODBjLCAweDRiOTcsIDB4MjBhMywgMHgxMTAyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGE5LCAweDAwMGEsCisJMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg0NjgwLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDRiMDYsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA4NCwgMHhhMDA1LCAweDAxZjAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsCisJMHg2OTljLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTAyLCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsCisJMHg3MGI4LCAweGEwMDUsIDB4MTExMCwgMHg3MGJiLCAweDAwMDEsIDB4NzA4ZiwgMHgwMDA0LCAweDAwMjksCisJMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDA1LCAweDA4MGMsCisJMHg0Yjk3LCAweDIwYTMsIDB4MTEwMywgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGJiOGUsCisJMHgwODBjLCAweDRiZTgsIDB4MTE2MCwgMHg3MDc4LCAweGEwMDUsIDB4MTE0OCwgMHg3MTUwLCAweGExODYsCisJMHhmZmZmLCAweDAxMjgsIDB4MDgwYywgMHg0YWEwLCAweDAxMTAsIDB4MDgwYywgMHg0YmM2LCAweDIwYTksCisJMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LCAweGEwMDUsCisJMHgwMWYwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsCisJMHgyMDc5LCAweGJiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDMsIDB4MTE3OCwgMHg3ODM0LCAweGEwMDUsCisJMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjgsIDB4YTAwNSwgMHgxMTEwLCAweDcwYmIsCisJMHgwMDAxLCAweDcwOGYsIDB4MDAwNiwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLCAweDAwZmUsCisJMHgwMDA1LCAweDcwOGYsIDB4MDAwNywgMHgwODBjLCAweDRiOTcsIDB4MjBhMywgMHgxMTA0LCAweDIwYTMsCisJMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhiYjhlLCAweDA4MGMsIDB4NGJlOCwgMHgxMWE4LCAweDcwNzgsCisJMHhhMDA1LCAweDExOTAsIDB4NzE1OCwgMHhhMTg2LCAweGZmZmYsIDB4MDE3MCwgMHhhMTgwLCAweDJkYzQsCisJMHgyMDBkLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDA4MGMsIDB4NGFhMCwgMHgwMTI4LCAweDA4MGMsCisJMHg0MGQ2LCAweDAxMTAsIDB4MDgwYywgMHgyODY3LCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LCAweDI2YTAsCisJMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsCisJMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LCAweGEwMDUsIDB4MDFmMCwgMHgyMDExLCAweDRhZGMsCisJMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsIDB4MjA3OSwgMHhiYjgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDQsIDB4MTE3OCwgMHg3ODM0LCAweGEwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsCisJMHgwMTI4LCAweDcwYjgsIDB4YTAwNSwgMHgxMTEwLCAweDcwYmIsIDB4MDAwMSwgMHg3MDhmLCAweDAwMDgsCisJMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhmLCAweDAwMDksCisJMHgwODBjLCAweDRiOTcsIDB4MjBhMywgMHgxMTA1LCAweDIwYTMsIDB4MDEwMCwgMHgzNDMwLCAweDA4MGMsCisJMHg0YmU4LCAweDExNTAsIDB4NzA3OCwgMHhhMDA1LCAweDExMzgsIDB4MDgwYywgMHg0YTE1LCAweDExNzAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHgyODY3LCAweDIwYTksIDB4MDAwOCwgMHgyMDk5LCAweGJiOGUsCisJMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDRiMDYsIDB4MDAxMCwgMHgwODBjLCAweDQ2MmMsIDB4MDAwNSwgMHgwMGY2LCAweDcwODQsCisJMHhhMDA1LCAweDA1ODgsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHhhMDg2LCAweDAwMTQsCisJMHgxNTQwLCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNSwgMHgxNTEwLCAweDc4MzQsCisJMHgyMDExLCAweDAxMDAsIDB4YTIxZSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjgsCisJMHhhMDA1LCAweDExMTAsIDB4NzBiYiwgMHgwMDAxLCAweDcwOGYsIDB4MDAwYSwgMHgwMGIxLCAweDAwOTgsCisJMHhhMDA1LCAweDExNzgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiOCwgMHhhMDA1LCAweDExMTAsCisJMHg3MGJiLCAweDAwMDEsIDB4NzA4YiwgMHgwMDAwLCAweDcwOGYsIDB4MDAwZSwgMHgwODBjLCAweDQ4MjcsCisJMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDBiLCAweDIwMTEsCisJMHhiYjBlLCAweDIyYTAsIDB4MjBhOSwgMHgwMDQwLCAweDIwMTksIDB4ZmZmZiwgMHg0M2E0LCAweDIwYTksCisJMHgwMDAyLCAweDIwMDksIDB4MDAwMCwgMHg0MWE0LCAweDA4MGMsIDB4NGI5NywgMHgyMGEzLCAweDExMDYsCisJMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg0YmU4LCAweDAxMTgsIDB4MjAxMywgMHgwMDAwLCAweDAwMjAsCisJMHg3MDU0LCAweGEwODUsIDB4MDEwMCwgMHgyMDEyLCAweDIyOTgsIDB4MjBhOSwgMHgwMDQyLCAweDUzYTYsCisJMHg2MGMzLCAweDAwODQsIDB4MDgwYywgMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LCAweGEwMDUsCisJMHgwMWIwLCAweDIwMTEsIDB4NGFkYywgMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDg0LCAweDExNjgsCisJMHgyMDc5LCAweGJiODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDYsIDB4MTEzOCwgMHg3ODM0LCAweGEwMDUsCisJMHgxMTIwLCAweDcwOGYsIDB4MDAwYywgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLCAweDAwZmUsCisJMHgwMDA1LCAweDcwOGYsIDB4MDAwZCwgMHgwODBjLCAweDRiOTcsIDB4MjBhMywgMHgxMTA3LCAweDIwYTMsCisJMHgwMDAwLCAweDIwOTksIDB4YmI4ZSwgMHgyMGE5LCAweDAwNDAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NGIwNiwgMHgwMDA1LCAweDAwZjYsCisJMHg3MDg0LCAweGEwMDUsIDB4MDFkMCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweGEwODYsCisJMHgwMDg0LCAweDExODgsIDB4MjA3OSwgMHhiYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA3LCAweDExNTgsCisJMHg3ODM0LCAweGEwMDUsIDB4MTE0MCwgMHg3MDhiLCAweDAwMDEsIDB4MDgwYywgMHg0Yjg5LCAweDcwOGYsCisJMHgwMDBlLCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDRiMWYsIDB4MDBmZSwgMHgwMDA1LCAweDcwOGYsCisJMHgwMDBmLCAweDcwODcsIDB4MDAwMCwgMHg2MDhiLCAweGJjODUsIDB4NjA4ZiwgMHhiNWI1LCAweDYwNDMsCisJMHgwMDA1LCAweDYwNDMsIDB4MDAwNCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsCisJMHg2OTkwLCAweDAwMDUsIDB4NzA4NCwgMHhhMDA1LCAweDAxMjAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsCisJMHg2OTljLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDExLCAweDA4MGMsIDB4NGJlOCwgMHgxMWEwLCAweDcxNzAsCisJMHg4MWZmLCAweDAxODgsIDB4MjAwOSwgMHgwMDAwLCAweDcwNzQsIDB4YTA4NCwgMHgwMGZmLCAweDA4MGMsCisJMHgyODFkLCAweGExODYsIDB4MDA3ZSwgMHgwMTM4LCAweGExODYsIDB4MDA4MCwgMHgwMTIwLCAweDIwMTEsCisJMHhiYjhlLCAweDA4MGMsIDB4NGFhMCwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksCisJMHhiYjgwLCAweDIwYTEsIDB4MDIwYiwgMHg3NDg0LCAweGE0ODAsIDB4MDAxOCwgMHhhMDgwLCAweDAwMDcsCisJMHhhMDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LCAweDUzYTYsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsCisJMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LCAweGEwMDUsIDB4MDFmMCwgMHgyMDExLCAweDRhZGMsCisJMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsIDB4MjA3OSwgMHhiYjgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDMsIDB4MTE3OCwgMHg3ODM0LCAweGEwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsCisJMHgwMTI4LCAweDcwYjgsIDB4YTAwNSwgMHgxMTEwLCAweDcwYmIsIDB4MDAwMSwgMHg3MDhmLCAweDAwMTIsCisJMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0YjFmLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhmLCAweDAwMTMsCisJMHgwODBjLCAweDRiYTMsIDB4MjBhMywgMHgxMTAzLCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLCAweDIwMTEsCisJMHhiYjhlLCAweDA4MGMsIDB4NGJlOCwgMHgxMTYwLCAweDcwNzgsIDB4YTAwNSwgMHgxMTQ4LCAweDcxNTAsCisJMHhhMTg2LCAweGZmZmYsIDB4MDEyOCwgMHgwODBjLCAweDRhYTAsIDB4MDExMCwgMHgwODBjLCAweDRiYzYsCisJMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDRiMDYsIDB4MDAwNSwgMHgwMGY2LCAweDcwODQsCisJMHhhMDA1LCAweDAxZjAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHhhMDg2LCAweDAwMTQsCisJMHgxMWE4LCAweDIwNzksIDB4YmI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNCwgMHgxMTc4LCAweDc4MzQsCisJMHhhMDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBiOCwgMHhhMDA1LCAweDExMTAsCisJMHg3MGJiLCAweDAwMDEsIDB4NzA4ZiwgMHgwMDE0LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDRiMWYsCisJMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDE1LCAweDA4MGMsIDB4NGJhMywgMHgyMGEzLCAweDExMDQsCisJMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGJiOGUsIDB4MDgwYywgMHg0YmU4LCAweDExYTgsCisJMHg3MDc4LCAweGEwMDUsIDB4MTE5MCwgMHg3MTU4LCAweGExODYsIDB4ZmZmZiwgMHgwMTcwLCAweGExODAsCisJMHgyZGM0LCAweDIwMGQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHg0YWEwLCAweDAxMjgsCisJMHgwODBjLCAweDQwZDYsIDB4MDExMCwgMHgwODBjLCAweDI4NjcsIDB4MjBhOSwgMHgwMDA4LCAweDIyOTgsCisJMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDRiMDYsIDB4MDAwNSwgMHgwMGY2LCAweDcwODQsIDB4YTAwNSwgMHgwNWI4LCAweDIwMTEsCisJMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHhhMDg2LCAweDAwMTQsIDB4MTU3MCwgMHgyMDc5LCAweGJiODAsCisJMHg3YTMwLCAweGEyOTYsIDB4MTEwNSwgMHgxNTQwLCAweDc4MzQsIDB4MjAxMSwgMHgwMTAwLCAweGEyMWUsCisJMHgxMTQ4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjgsIDB4YTAwNSwgMHgxMTEwLCAweDcwYmIsCisJMHgwMDAxLCAweDAwNjAsIDB4YTAwNSwgMHgxMWMwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjgsCisJMHhhMDA1LCAweDExMTAsIDB4NzBiYiwgMHgwMDAxLCAweDcwOGIsIDB4MDAwMCwgMHg3YTM4LCAweGQyZjQsCisJMHgwMTM4LCAweDIwMDEsIDB4YjU3NCwgMHgyMDA0LCAweGQwYTQsIDB4MTExMCwgMHg3MGQ3LCAweDAwMDgsCisJMHg3MDhmLCAweDAwMTYsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NGIxZiwgMHgwMGZlLCAweDAwMDUsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksIDB4YmI4MCwgMHgyMGExLCAweDAyMGIsCisJMHgyMGE5LCAweDAwMGUsIDB4NTNhNiwgMHgzNDMwLCAweDIwMTEsIDB4YmI4ZSwgMHg3MDhmLCAweDAwMTcsCisJMHgwODBjLCAweDRiZTgsIDB4MTE1MCwgMHg3MDc4LCAweGEwMDUsIDB4MTEzOCwgMHgwODBjLCAweDRhMTUsCisJMHgxMTcwLCAweGEwODUsIDB4MDAwMSwgMHgwODBjLCAweDI4NjcsIDB4MjBhOSwgMHgwMDA4LCAweDIwOTksCisJMHhiYjhlLCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE0LCAweDA4MGMsIDB4NGIwNiwgMHgwMDEwLCAweDA4MGMsIDB4NDYyYywgMHgwMDA1LCAweDAwZjYsCisJMHg3MDg0LCAweGEwMDUsIDB4MDFiMCwgMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweGEwODYsCisJMHgwMDg0LCAweDExNjgsIDB4MjA3OSwgMHhiYjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA2LCAweDExMzgsCisJMHg3ODM0LCAweGEwMDUsIDB4MTEyMCwgMHg3MDhmLCAweDAwMTgsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsCisJMHg0YjFmLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhmLCAweDAwMTksIDB4MDgwYywgMHg0YmEzLCAweDIwYTMsCisJMHgxMTA2LCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLCAweDIwOTksIDB4YmI4ZSwgMHgyMDM5LCAweGJiMGUsCisJMHgyN2EwLCAweDIwYTksIDB4MDA0MCwgMHg1M2EzLCAweDA4MGMsIDB4NGJlOCwgMHgxMWU4LCAweDI3MjgsCisJMHgyNTE0LCAweDgyMDcsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDAsIDB4MjAxOCwgMHhhMjk0LCAweDAwZmYsCisJMHg4MDA3LCAweGEyMDUsIDB4MjAyYSwgMHg3MDU0LCAweDIzMTAsIDB4ODIxNCwgMHhhMmEwLCAweGJiMGUsCisJMHgyNDE0LCAweGEzOGMsIDB4MDAwMSwgMHgwMTE4LCAweGEyOTQsIDB4ZmYwMCwgMHgwMDE4LCAweGEyOTQsCisJMHgwMGZmLCAweDgwMDcsIDB4YTIxNSwgMHgyMjIyLCAweDI3OTgsIDB4MjZhMCwgMHgyMGE5LCAweDAwNDAsCisJMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsCisJMHg0YjA2LCAweDAwMDUsIDB4MDBmNiwgMHg3MDg0LCAweGEwMDUsIDB4MDFkMCwgMHgyMDExLCAweDRhZGMsCisJMHgwODBjLCAweDY5OWMsIDB4YTA4NiwgMHgwMDg0LCAweDExODgsIDB4MjA3OSwgMHhiYjgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDcsIDB4MTE1OCwgMHg3ODM0LCAweGEwMDUsIDB4MTE0MCwgMHg3MDhiLCAweDAwMDEsCisJMHgwODBjLCAweDRiODksIDB4NzA4ZiwgMHgwMDFhLCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDRiMWYsCisJMHgwMGZlLCAweDAwMDUsIDB4NzA4ZiwgMHgwMDFiLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHgyMDk5LCAweGJiODAsIDB4MjBhMSwgMHgwMjBiLCAweDc0ODQsIDB4YTQ4MCwgMHgwMDE4LCAweGEwODAsCisJMHgwMDA3LCAweGEwODQsIDB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4NTNhNiwgMHg2MGMzLCAweDAwODQsCisJMHgwODBjLCAweDRiMDYsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDA4NiwgMHgwMDk2LCAweDIwMjksCisJMHhiNTUzLCAweDI1MmMsIDB4MjBhOSwgMHgwMDA4LCAweDIwNDEsIDB4YmIwZSwgMHgyOGEwLCAweDIwOTksCisJMHhiYjhlLCAweDUzYTMsIDB4MjBhOSwgMHgwMDA4LCAweDIwMTEsIDB4MDAwNywgMHhkNWQ0LCAweDAxMTAsCisJMHgyMDExLCAweDAwMDAsIDB4MjgwMCwgMHhhMjAwLCAweDIwMGMsIDB4YTFhNiwgMHhmZmZmLCAweDExNDgsCisJMHhkNWQ0LCAweDAxMTAsIDB4ODIxMCwgMHgwMDA4LCAweDgyMTEsIDB4MWYwNCwgMHg0YTJhLCAweDA4MDQsCisJMHg0YTk4LCAweDgyZmYsIDB4MTE2MCwgMHhkNWQ0LCAweDAxMjAsIDB4YTFhNiwgMHgzZmZmLCAweDBkOTAsCisJMHgwMDIwLCAweGExYTYsIDB4M2ZmZiwgMHgwOTA0LCAweDRhOTgsIDB4YTE4ZCwgMHhjMDAwLCAweDIwYTksCisJMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHhkNWQ0LCAweDAxMTAsIDB4MjAxOSwgMHgwMDEwLCAweDIxMjAsCisJMHhkNWQ0LCAweDAxMTAsIDB4ODQyMywgMHgwMDA4LCAweDg0MjQsIDB4MTI0MCwgMHhkNWQ0LCAweDAxMTAsCisJMHg4MzE5LCAweDAwMDgsIDB4ODMxOCwgMHgxZjA0LCAweDRhNTAsIDB4MDRkMCwgMHgyM2E4LCAweDIwMjEsCisJMHgwMDAxLCAweDg0MjYsIDB4ODQyNSwgMHgxZjA0LCAweDRhNjIsIDB4MjMyOCwgMHg4NTI5LCAweGEyYmUsCisJMHgwMDA3LCAweDAxNTgsIDB4MDAwNiwgMHgyMDM5LCAweDAwMDcsIDB4MjIwMCwgMHhhNzNhLCAweDAwMGUsCisJMHgyN2E4LCAweGE1YTgsIDB4MDAxMCwgMHgxZjA0LCAweDRhNzEsIDB4NzU1MiwgMHhhNWM4LCAweDJkYzQsCisJMHgyOTJkLCAweGE1YWMsIDB4MDBmZiwgMHg3NTc2LCAweDY1MzIsIDB4NjUzNiwgMHgwMDE2LCAweDI1MDgsCisJMHgwODBjLCAweDI4NDcsIDB4MDAxZSwgMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwgMHgyMDE4LCAweDIzMDQsCisJMHhhNDA1LCAweDIwMWEsIDB4NzA3YiwgMHgwMDAxLCAweDI2YTAsIDB4Mjg5OCwgMHgyMGE5LCAweDAwMDgsCisJMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMjgsCisJMHhhMDA2LCAweDAwMTgsIDB4YTAwNiwgMHgwODBjLCAweDE1MTUsIDB4MDA5ZSwgMHgwMDhlLCAweDAwMDUsCisJMHgyMTE4LCAweDIwMjEsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDcsIDB4YTM5YSwgMHgwMDEwLCAweDAyMTgsCisJMHg4NDIwLCAweDgwMDEsIDB4MGNkMCwgMHgyMTE4LCAweDg0ZmYsIDB4MDEyMCwgMHhhMzlhLCAweDAwMTAsCisJMHg4NDIxLCAweDFkZTAsIDB4MjAyMSwgMHgwMDAxLCAweDgzZmYsIDB4MDExOCwgMHg4NDIzLCAweDgzMTksCisJMHgxZGU4LCAweGEyMzgsIDB4MjcwNCwgMHhhNDJjLCAweDExYjgsIDB4YTQwNSwgMHgyMDNhLCAweDcxNTIsCisJMHhhMWEwLCAweDJkYzQsIDB4MjQyZCwgMHhhNWFjLCAweDAwZmYsIDB4NzU3NiwgMHg2NTMyLCAweDY1MzYsCisJMHgwMDE2LCAweDI1MDgsIDB4MDgwYywgMHgyODQ3LCAweDAwMWUsIDB4NjBlNywgMHgwMDAwLCAweDY1ZWEsCisJMHg3MDdiLCAweDAwMDEsIDB4YTA4NCwgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI1MDAsCisJMHg3MDdmLCAweDAwMDAsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsCisJMHgyMDcxLCAweDAxNDAsIDB4MDgwYywgMHg3ZDdhLCAweDcwMDQsIDB4YTA4NCwgMHg0MDAwLCAweDAxMjAsCisJMHg3MDAzLCAweDEwMDAsIDB4NzAwMywgMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHhiNTIzLCAweDIwNzMsIDB4MDAwMCwgMHg3ODQwLCAweDAwMjYsIDB4MDAxNiwgMHgyMDA5LCAweDAwZjcsCisJMHgwODBjLCAweDRiYWYsIDB4MDAxZSwgMHhhMDk0LCAweDAwMTAsIDB4YTI4NSwgMHgwMDgwLCAweDc4NDIsCisJMHg3YTQyLCAweDAwMmUsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwMTEsIDB4YjdlYSwgMHgyMDEzLCAweDAwMDAsIDB4NzA4NywgMHgwMDAwLCAweDAxMmUsCisJMHgyMGUxLCAweDkwODAsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwODBjLCAweDdkNzEsCisJMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0YWRjLCAweDA4MGMsIDB4NmEyMiwgMHgwMDA1LCAweDAwMTYsCisJMHgwMDI2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsCisJMHg4MDc1LCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3ZjU5LCAweDAwMzYsCisJMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3ZmU0LCAweDAwM2UsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsCisJMHg0YmFmLCAweDIwNjEsIDB4YjdmMywgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwMDAwLCAweDIwNjEsCisJMHhiNTAwLCAweDYwMDMsIDB4MDAwMSwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsCisJMHgwMDEwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDRiNTQsIDB4MDgwYywgMHg2OTkwLCAweDAxMmUsCisJMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4MDEwMCwgMHgwODBjLCAweDdkN2EsIDB4MjA3MSwgMHgwMTQwLCAweDcwMDQsCisJMHhhMDg0LCAweDQwMDAsIDB4MDEyMCwgMHg3MDAzLCAweDEwMDAsIDB4NzAwMywgMHgwMDAwLCAweDA4MGMsCisJMHg1YWQ3LCAweDAxYTgsIDB4MDgwYywgMHg1YWY1LCAweDExOTAsIDB4MjAwMSwgMHhiNzllLCAweDIwMDMsCisJMHhhYWFhLCAweDAwMTYsIDB4MDgwYywgMHgyOGViLCAweDIwMDEsIDB4Yjc4ZiwgMHgyMTAyLCAweDAwMWUsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NWEwNywgMHgwMDMwLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4MjdjMywgMHgwODBjLCAweDRiMWYsIDB4MDEyZSwgMHgwMDBlLCAweDAwZWUsCisJMHgwMDA1LCAweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweGJjYzAsIDB4MjA5OSwgMHhiYjhlLCAweDMzMDQsCisJMHg4MDA3LCAweDIwYTIsIDB4OTM5OCwgMHg5NGEwLCAweDFmMDQsIDB4NGI4ZiwgMHgwMDA1LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGJiMDAsIDB4MjBhMSwgMHgwMjBiLCAweDIwYTksCisJMHgwMDBjLCAweDUzYTYsIDB4MDAwNSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksCisJMHhiYjgwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMGMsIDB4NTNhNiwgMHgwMDA1LCAweDAwYzYsCisJMHgwMDA2LCAweDIwNjEsIDB4MDEwMCwgMHg4MTBmLCAweDIwMDEsIDB4YjUzMSwgMHgyMDA0LCAweGEwMDUsCisJMHgxMTM4LCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMTA1LCAweDAwMTAsCisJMHhhMTg1LCAweDAwZjcsIDB4NjA0YSwgMHgwMDBlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwNDYsCisJMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAxNTgsIDB4YTAwNiwgMHgyMDIwLCAweDIwMDksCisJMHgwMDJhLCAweDA4MGMsIDB4YjBlOCwgMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhjMTk1LCAweDIxMDIsCisJMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmM2ZiwgMHgwMDRlLCAweDAwMWUsCisJMHgwMDA1LCAweDA4MGMsIDB4NGIxZiwgMHg3MDhmLCAweDAwMDAsIDB4NzA4NywgMHgwMDAwLCAweDAwMDUsCisJMHgwMDA2LCAweDIwMDEsIDB4YjUwYywgMHgyMDA0LCAweGQwOWMsIDB4MDEwMCwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgwMTAxLCAweDIwMGMsCisJMHhhMThkLCAweDAwMDYsIDB4MjEwMiwgMHgwMTJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAxNTYsCisJMHgyMGE5LCAweDAwZmYsIDB4MjAwOSwgMHhiNjM1LCAweGEwMDYsIDB4MjAwYSwgMHg4MTA4LCAweDFmMDQsCisJMHg0YzA1LCAweDAxNWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsCisJMHgyMDY5LCAweGI1NTIsIDB4YTAwNiwgMHg2MDAyLCAweDYwMDcsIDB4MDcwNywgMHg2MDBhLCAweDYwMGUsCisJMHg2MDEyLCAweGExOTgsIDB4MmRjNCwgMHgyMzFkLCAweGEzOWMsIDB4MDBmZiwgMHg2MzE2LCAweDIwYTksCisJMHgwMDA0LCAweGFjOTgsIDB4MDAwNiwgMHgyM2EwLCAweDQwYTQsIDB4MjBhOSwgMHgwMDA0LCAweGFjOTgsCisJMHgwMDBhLCAweDIzYTAsIDB4NDBhNCwgMHg2MDNlLCAweDYwNDIsIDB4NjA0ZSwgMHg2MDUyLCAweDYwNTYsCisJMHg2MDVhLCAweDYwNWUsIDB4NjA2MiwgMHg2MDY2LCAweDYwNmEsIDB4NjA2ZSwgMHg2MDcyLCAweDYwNzYsCisJMHg2MDdhLCAweDYwN2UsIDB4NjA4MiwgMHg2MDg2LCAweDYwOGEsIDB4NjA4ZSwgMHg2MDkyLCAweDYwOTYsCisJMHg2MDlhLCAweDYwOWUsIDB4NjBhZSwgMHg2MWEyLCAweDAwZDYsIDB4NjBhNCwgMHhhMDZkLCAweDAxMTAsCisJMHgwODBjLCAweDE2MGYsIDB4NjBhNywgMHgwMDAwLCAweDYwYTgsIDB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsCisJMHgxNjBmLCAweDYwYWIsIDB4MDAwMCwgMHgwMGRlLCAweGEwMDYsIDB4NjA0YSwgMHg2ODEwLCAweDYwM2EsCisJMHg2ODBjLCAweDYwNDYsIDB4NjgxNCwgMHhhMDg0LCAweDAwZmYsIDB4NjA0MiwgMHgwMTRlLCAweDAxM2UsCisJMHgwMTVlLCAweDAwM2UsIDB4MDBkZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDY5NDQsCisJMHg2ZTQ4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MWEwNCwgMHg0ZDFhLCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4YTE4MiwgMHgwMGZmLCAweDFhMDQsIDB4NGQxZiwgMHgyMDAxLCAweGI1MGMsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwMywgMHgwMWMwLCAweDIwMDEsIDB4YjUwYywgMHgyMDA0LCAweGQwODQsCisJMHgxOTA0LCAweDRkMDIsIDB4YTE4OCwgMHhiNjM1LCAweDIxMDQsIDB4YTA2NSwgMHgwOTA0LCAweDRkMDIsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsIDB4MTkwNCwgMHg0ZDAyLCAweDYwMDAsCisJMHhkMGM0LCAweDA5MDQsIDB4NGQwMiwgMHgwMDY4LCAweGExODgsIDB4YjYzNSwgMHgyMTA0LCAweGEwNjUsCisJMHgwOTA0LCAweDRjZTYsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDE5MDQsCisJMHg0Y2ViLCAweDYwYTQsIDB4YTAwZCwgMHgwMTE4LCAweDA4MGMsIDB4NTFkNCwgMHgwNWQwLCAweDYwYTgsCisJMHhhMDBkLCAweDAxODgsIDB4MDgwYywgMHg1MjFmLCAweDExNzAsIDB4Njk0YywgMHhkMWZjLCAweDExMTgsCisJMHgwODBjLCAweDRlZGUsIDB4MDQ0OCwgMHgwODBjLCAweDRlOGQsIDB4Njk0YywgMHhkMWVjLCAweDE1MjAsCisJMHgwODBjLCAweDUwYzYsIDB4MDQwOCwgMHg2OTRjLCAweGExODQsIDB4YTAwMCwgMHgwMTc4LCAweGQxZWMsCisJMHgwMTQwLCAweGQxZmMsIDB4MDExOCwgMHgwODBjLCAweDUwZDUsIDB4MDAyOCwgMHgwODBjLCAweDUwZDUsCisJMHgwMDI4LCAweGQxZmMsIDB4MDExOCwgMHgwODBjLCAweDRlOGQsIDB4MDA3MCwgMHg2MDUwLCAweGEwMGQsCisJMHgwMTMwLCAweDJkMDAsIDB4MjAwYSwgMHg2ODAzLCAweDAwMDAsIDB4NjA1MiwgMHgwMDI4LCAweDJkMDAsCisJMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDA4MGMsIDB4NmNhYSwgMHhhMDA2LCAweDAxMmUsCisJMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA5LCAweDAwMDAsIDB4MDRlOCwgMHgyMDAxLCAweDAwMjgsCisJMHgyMDA5LCAweDAwMDAsIDB4MDRjMCwgMHhhMDgyLCAweDAwMDYsIDB4MTJhMCwgMHgyMDAxLCAweGI1MzUsCisJMHgyMDA0LCAweGQwYWMsIDB4MTE2MCwgMHg2MGEwLCAweGQwYmMsIDB4MTE0OCwgMHg2MTAwLCAweGQxZmMsCisJMHgwOTA0LCAweDRjYTEsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwNDIwLCAweDIwMDEsCisJMHgwMDI4LCAweDAwYTgsIDB4MjAwOSwgMHhiNTBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsCisJMHgwMDA0LCAweDAwNjgsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDQwLCAweDIwMDEsCisJMHgwMDI5LCAweDYxMDAsIDB4ZDFmYywgMHgwMTE4LCAweDIwMDksIDB4MTAwMCwgMHgwMDYwLCAweDIwMDksCisJMHgwMDAwLCAweDAwNDgsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHgwMDIwLCAweDIwMDEsCisJMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHhhMDA1LCAweDAxMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4Njg0NCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgyMDA4LCAweGExODIsCisJMHgwMGZmLCAweDFhMDQsIDB4NGQ3OSwgMHhhMTg4LCAweGI2MzUsIDB4MjEwNCwgMHhhMDY1LCAweDAxYzAsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsIDB4MTFhOCwgMHgyYzcwLCAweDA4MGMsCisJMHg4NWM3LCAweDA1ZTgsIDB4MmUwMCwgMHg2MDFhLCAweDJkMDAsIDB4NjAxMiwgMHg2MDBiLCAweGZmZmYsCisJMHg2MDFmLCAweDAwMGEsIDB4MjAwOSwgMHgwMDAzLCAweDA4MGMsIDB4ODY0YywgMHhhMDA2LCAweDA0NjAsCisJMHgyMDAxLCAweDAwMjgsIDB4MDQ0MCwgMHhhMDgyLCAweDAwMDYsIDB4MTI5OCwgMHgyMDAxLCAweGI1MzUsCisJMHgyMDA0LCAweGQwYWMsIDB4MTE1OCwgMHg2MGEwLCAweGQwYmMsIDB4MTE0MCwgMHg2MTAwLCAweGQxZmMsCisJMHgwOWU4LCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDBhOCwgMHgyMDAxLCAweDAwMjgsCisJMHgwMDkwLCAweDIwMDksIDB4YjUwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsCisJMHgwMDUwLCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMjksCisJMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHhhMDA1LCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsCisJMHgwMDJjLCAweDBjYzgsIDB4MDBmNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMTEsCisJMHgwMDAwLCAweDIwNzksIDB4YjUwMCwgMHg2OTQ0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODIsCisJMHgwMGZmLCAweDFhMDQsIDB4NGU0NCwgMHgwODBjLCAweDRmYTksIDB4MTFhMCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgxMjcwLCAweDY4NjQsIDB4YTBjNiwgMHgwMDZmLCAweDAxNTAsCisJMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDE5MDQsIDB4NGUyZCwgMHg2MGEwLCAweGQwYmMsCisJMHgxOTA0LCAweDRlMmQsIDB4Njg2NCwgMHhhMGM2LCAweDAwNmYsIDB4MDExOCwgMHgyMDA4LCAweDA4MDQsCisJMHg0ZGY2LCAweDY5NjgsIDB4MjE0MCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHg3OGQ0LCAweGQwYWMsCisJMHgxMTE4LCAweGExODIsIDB4MDA4MCwgMHgwNmQwLCAweGExODIsIDB4MDBmZiwgMHgxNmI4LCAweDZhNzAsCisJMHg2YjZjLCAweDc4NzAsIDB4YTMwNiwgMHgxMTYwLCAweDc4NzQsIDB4YTI0ZSwgMHgxMTE4LCAweDIyMDgsCisJMHgyMzEwLCAweDA0NjAsIDB4YTljYywgMHhmZjAwLCAweDExMTgsIDB4MjIwOCwgMHgyMzEwLCAweDA0MzAsCisJMHgwODBjLCAweDNkYzUsIDB4MmM3MCwgMHgwNTUwLCAweDIwMDksIDB4MDAwMCwgMHgyMDExLCAweDAwMDAsCisJMHhhMGM2LCAweDQwMDAsIDB4MTE2MCwgMHgwMDA2LCAweDJlNjAsIDB4MDgwYywgMHg1MjRhLCAweDExMDgsCisJMHhjMTg1LCAweDcwMDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDAwZSwgMHgwMDg4LCAweGEwYzYsCisJMHg0MDA3LCAweDExMTAsIDB4MjQwOCwgMHgwMDYwLCAweGEwYzYsIDB4NDAwOCwgMHgxMTE4LCAweDI3MDgsCisJMHgyNjEwLCAweDAwMzAsIDB4YTBjNiwgMHg0MDA5LCAweDExMDgsIDB4MDAxMCwgMHgyMDAxLCAweDQwMDYsCisJMHg2ODY2LCAweDY5NmEsIDB4NmE2ZSwgMHgyMDAxLCAweDAwMzAsIDB4MDQ1MCwgMHgwODBjLCAweDg1YzcsCisJMHgxMTM4LCAweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMDMsIDB4MjAxMSwgMHgwMDAwLCAweDBjODAsCisJMHgyZTAwLCAweDYwMWEsIDB4MDgwYywgMHhhMDI3LCAweDJkMDAsIDB4NjAxMiwgMHg2MDFmLCAweDAwMDEsCisJMHg2ODM4LCAweGQ4OGMsIDB4MDEwOCwgMHhjMGY1LCAweDY4M2EsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDJjOWMsIDB4MDEyZSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLCAweDIwMDEsCisJMHgwMDAyLCAweDA4MGMsIDB4NGVmZCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4NjRjLCAweGEwMDYsCisJMHhhMDA1LCAweDAxMmUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksCisJMHgwMDAwLCAweDBjYjAsIDB4MjAwOSwgMHhiNTBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsCisJMHgwMDA0LCAweDAwMzgsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsCisJMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHgwYzIwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsCisJMHgwOGY4LCAweDY5NDQsIDB4NmU0OCwgMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDE2YjgsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwZmYsIDB4MTJlMCwgMHhhMTg4LCAweGI2MzUsCisJMHgyMTA0LCAweGEwNjUsIDB4MDFiOCwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsCisJMHgxMWIwLCAweDY4NGMsIDB4ZDBlYywgMHgwMTIwLCAweDA4MGMsIDB4NTBkNSwgMHgwNDMxLCAweDAwMzAsCisJMHgwNDIxLCAweDY4NGMsIDB4ZDBmYywgMHgwMTEwLCAweDA4MGMsIDB4NTBjNiwgMHgwODBjLCAweDUxMTMsCisJMHhhMDA2LCAweDAwYzgsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksIDB4MDAwMCwgMHgwMGEwLCAweGEwODIsCisJMHgwMDA2LCAweDEyNDAsIDB4NjEwMCwgMHhkMWZjLCAweDBkMjAsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksCisJMHgxMDAwLCAweDAwNDgsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHgwMDIwLCAweDIwMDEsCisJMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHhhMDA1LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDUwLCAweGEwMGQsIDB4MDEzOCwgMHgyZDAwLCAweDIwMGEsIDB4NjgwMywgMHgwMDAwLCAweDYwNTIsCisJMHgwMTJlLCAweDAwMDUsIDB4MmQwMCwgMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDBjYzAsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDRjLCAweGEwMDUsIDB4MDE3MCwgMHgwMGU2LCAweDIwNzEsCisJMHhiN2UwLCAweDcwMDQsIDB4YTA4NiwgMHgwMDAyLCAweDAxNjgsIDB4MDBlZSwgMHg2MDRjLCAweDY4MDIsCisJMHgyZDAwLCAweDYwNGUsIDB4MDEyZSwgMHgwMDA1LCAweDJkMDAsIDB4NjA1MiwgMHg2MDRlLCAweDY4MDMsCisJMHgwMDAwLCAweDBjYzAsIDB4NzAxYywgMHhhYzA2LCAweDFkODAsIDB4NjA0YywgMHgyMDcwLCAweDcwMDAsCisJMHg2ODAyLCAweDJkMDAsIDB4NzAwMiwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwNGMsIDB4YTA2ZCwgMHgwMTMwLCAweDY4MDAsIDB4YTAwNSwgMHgxMTA4LCAweDYwNTIsCisJMHg2MDRlLCAweGFkMDUsIDB4MDEyZSwgMHgwMDA1LCAweDYwNGMsIDB4YTA2ZCwgMHgwMTMwLCAweDY4MDAsCisJMHhhMDA1LCAweDExMDgsIDB4NjA1MiwgMHg2MDRlLCAweGFkMDUsIDB4MDAwNSwgMHg2ODAzLCAweDAwMDAsCisJMHg2MDg0LCAweGEwMGQsIDB4MDEyMCwgMHgyZDAwLCAweDIwMGEsIDB4NjA4NiwgMHgwMDA1LCAweDJkMDAsCisJMHg2MDg2LCAweDYwODIsIDB4MGNkOCwgMHgwMTI2LCAweDAwYzYsIDB4MDAyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MjE4LCAweDIyNjAsIDB4NjIwMCwgMHhhMDA1LCAweDAxMTAsIDB4YzI4NSwgMHgwMDA4LCAweGMyODQsCisJMHg2MjAyLCAweDAwMmUsIDB4MDBjZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsCisJMHg4MDAwLCAweDYyMTgsIDB4MjI2MCwgMHg2MjA0LCAweDAwMDYsIDB4YTA4NiwgMHgwMDA2LCAweDExODAsCisJMHg2MDljLCAweGQwYWMsIDB4MDE2OCwgMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGE0LCAweDAxNDAsCisJMHhhMjg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDcsIDB4MTExMCwgMHgyMDExLCAweDA2MDAsCisJMHgwMDBlLCAweGEyOTQsIDB4ZmYwMCwgMHhhMjE1LCAweDYyMDYsIDB4MDAwNiwgMHhhMDg2LCAweDAwMDYsCisJMHgxMTI4LCAweDYyOTAsIDB4ODJmZiwgMHgxMTEwLCAweDA4MGMsIDB4MTUxNSwgMHgwMDBlLCAweDAwY2UsCisJMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsCisJMHg2MjA0LCAweDAwMDYsIDB4YTA4NiwgMHgwMDA2LCAweDExNzgsIDB4NjA5YywgMHhkMGE0LCAweDAxNjAsCisJMHgyMDAxLCAweGI1NTMsIDB4MjAwNCwgMHhkMGFjLCAweDExMzgsIDB4YTI4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwMDA2LCAweDAwMGUsIDB4YTI5NCwgMHgwMGZmLCAweDgwMDcsCisJMHhhMjE1LCAweDYyMDYsIDB4MDBjZSwgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwgMHhhMTgyLCAweDAwZmYsCisJMHgwMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMGIwLCAweGExOTAsIDB4YjYzNSwgMHgyMjA0LCAweGEwNjUsCisJMHgxMTgwLCAweDAwMTYsIDB4MDBkNiwgMHgwODBjLCAweDE1ZGYsIDB4MmQ2MCwgMHgwMGRlLCAweDAwMWUsCisJMHgwZDgwLCAweDJjMDAsIDB4MjAxMiwgMHg2MGE3LCAweDAwMDAsIDB4NjBhYiwgMHgwMDAwLCAweDA4MGMsCisJMHg0YzBiLCAweGEwMDYsIDB4MDAyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMjYsCisJMHhhMTgyLCAweDAwZmYsIDB4MDIxOCwgMHhhMDg1LCAweDAwMDEsIDB4MDQ4MCwgMHgwMGQ2LCAweGExOTAsCisJMHhiNjM1LCAweDIyMDQsIDB4YTA2ZCwgMHgwNTQwLCAweDIwMTMsIDB4MDAwMCwgMHgwMGQ2LCAweDAwYzYsCisJMHgyZDYwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTYwZiwgMHg2MGE4LCAweGEwNmQsCisJMHgwMTEwLCAweDA4MGMsIDB4MTYwZiwgMHgwMGNlLCAweDAwZGUsIDB4MDBkNiwgMHgwMGM2LCAweDY4YWMsCisJMHgyMDYwLCAweDhjZmYsIDB4MDE2OCwgMHg2MDBjLCAweDAwMDYsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsCisJMHg5YzVhLCAweDAxMTAsIDB4MDgwYywgMHgxNjFmLCAweDA4MGMsIDB4ODYxZCwgMHgwMGNlLCAweDBjODgsCisJMHgwMGNlLCAweDAwZGUsIDB4MDgwYywgMHgxNjBmLCAweDAwZGUsIDB4YTAwNiwgMHgwMDJlLCAweDAxMmUsCisJMHgwMDA1LCAweDAwMTYsIDB4YTE4MiwgMHgwMGZmLCAweDAyMTgsIDB4YTA4NSwgMHgwMDAxLCAweDAwMzAsCisJMHhhMTg4LCAweGI2MzUsIDB4MjEwNCwgMHhhMDY1LCAweDBkYzAsIDB4YTAwNiwgMHgwMDFlLCAweDAwMDUsCisJMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDYwMGIsIDB4MDAwMCwgMHg2MDBmLCAweDAwMDAsCisJMHg2MDAwLCAweGMwOGMsIDB4NjAwMiwgMHgwODBjLCAweDVhY2YsIDB4MTU1OCwgMHg2MGEwLCAweGEwODYsCisJMHgwMDdlLCAweDIwNjksIDB4YmI5MCwgMHgwMTMwLCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LCAweGQwYWMsCisJMHgxNTAwLCAweDAwOTgsIDB4MmQwNCwgMHhkMGU0LCAweDAxZTAsIDB4MDBkNiwgMHgyMDY5LCAweGJiOGUsCisJMHgwMGM2LCAweDIwNjEsIDB4YjdiMiwgMHg2ODEwLCAweDIwNjIsIDB4NjgxNCwgMHg2MDA2LCAweDY4MTgsCisJMHg2MDBhLCAweDY4MWMsIDB4NjAwZSwgMHgwMGNlLCAweDAwZGUsIDB4OGQ2OSwgMHgyZDA0LCAweDIwNjksCisJMHgwMTQwLCAweGEwMDUsIDB4MTExMCwgMHgyMDAxLCAweDAwMDEsIDB4Njg4NiwgMHgyMDY5LCAweGI1MDAsCisJMHg2OGE2LCAweDIwNjksIDB4YmI4ZSwgMHg2ODA4LCAweDYwNWUsIDB4NjgxMCwgMHg2MDYyLCAweDYxMzgsCisJMHhhMTBhLCAweDAyMDgsIDB4NjAzYSwgMHg2ODE0LCAweDYwNjYsIDB4MjA5OSwgMHhiYjk2LCAweGFjODgsCisJMHgwMDBhLCAweDIxYTAsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MjA5OSwgMHhiYjlhLCAweGFjODgsCisJMHgwMDA2LCAweDIxYTAsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MjA2OSwgMHhiYmFlLCAweDY4MDgsCisJMHg2MDZhLCAweDY5MGMsIDB4NjE2ZSwgMHg2ODEwLCAweDYwNzIsIDB4NjgxOCwgMHg2MDc2LCAweDYwYTAsCisJMHhhMDg2LCAweDAwN2UsIDB4MTEyMCwgMHgyMDY5LCAweGJiOGUsIDB4NjkwYywgMHg2MTZlLCAweGExODIsCisJMHgwMjExLCAweDEyMTgsIDB4MjAwOSwgMHgwMDA4LCAweDA0MDAsIDB4YTE4MiwgMHgwMjU5LCAweDEyMTgsCisJMHgyMDA5LCAweDAwMDcsIDB4MDBkMCwgMHhhMTgyLCAweDAyYzEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDYsCisJMHgwMGEwLCAweGExODIsIDB4MDM0OSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNSwgMHgwMDcwLCAweGExODIsCisJMHgwNDIxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDA0LCAweDAwNDAsIDB4YTE4MiwgMHgwNTgxLCAweDEyMTgsCisJMHgyMDA5LCAweDAwMDMsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDIsIDB4NjE5MiwgMHgwMTRlLCAweDAxM2UsCisJMHgwMTVlLCAweDAwZGUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwgMHgyMDcxLCAweGJiOGQsCisJMHgyZTA0LCAweDY4OTYsIDB4MjA3MSwgMHhiYjhlLCAweDcwMDQsIDB4Njg5YSwgMHg3MDFjLCAweDY4OWUsCisJMHg2YTAwLCAweDIwMDksIDB4YjU3MiwgMHgyMTBjLCAweGQwYmMsIDB4MDEyMCwgMHhkMWVjLCAweDAxMTAsCisJMHhjMmFkLCAweDAwMDgsIDB4YzJhYywgMHhkMGM0LCAweDAxMjAsIDB4ZDFlNCwgMHgwMTEwLCAweGMyYmQsCisJMHgwMDA4LCAweGMyYmMsIDB4NmEwMiwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MGE0LCAweGEwNmQsIDB4MDFjMCwgMHg2OTAwLCAweDgxZmYsCisJMHgxNTQwLCAweDZhMDQsIDB4YTI4MiwgMHgwMDEwLCAweDE2NDgsIDB4YWQ4OCwgMHgwMDA0LCAweDIwYTksCisJMHgwMDEwLCAweDIxMDQsIDB4YTA4NiwgMHhmZmZmLCAweDAxMjgsIDB4ODEwOCwgMHgxZjA0LCAweDUwODEsCisJMHgwODBjLCAweDE1MTUsIDB4MjYwYSwgMHg4MjEwLCAweDZhMDYsIDB4MDA5OCwgMHgwODBjLCAweDE1ZjgsCisJMHgwMWE4LCAweDJkMDAsIDB4NjBhNiwgMHg2ODAzLCAweDAwMDAsIDB4YWQ4OCwgMHgwMDA0LCAweDIwYTksCisJMHgwMDEwLCAweDIwMGIsIDB4ZmZmZiwgMHg4MTA4LCAweDFmMDQsIDB4NTA5OSwgMHg2ODA3LCAweDAwMDEsCisJMHg2ZTEyLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDgsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGQ2LCAweDYwYTQsIDB4YTAwZCwgMHgwMWEwLCAweDIxNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MTE2MCwgMHgwODBjLCAweDUxZDQsIDB4MTE2OCwgMHgyMDBiLCAweGZmZmYsCisJMHg2ODA0LCAweGEwOGEsIDB4MDAwMiwgMHgwMjE4LCAweDgwMDEsIDB4NjgwNiwgMHgwMDIwLCAweDA4MGMsCisJMHgxNjBmLCAweDYwYTcsIDB4MDAwMCwgMHgwMGRlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NTIzMiwgMHgwMDEwLCAweDA4MGMsIDB4NGU4ZCwgMHgwODBjLCAweDUxNGMsCisJMHgxZGQ4LCAweDA4MGMsIDB4NTExMywgMHgwMTJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwYTgsIDB4YTA2ZCwgMHgwMWMwLCAweDY5NTAsIDB4ODFmZiwgMHgxNTQwLCAweDZhNTQsCisJMHhhMjgyLCAweDAwMTAsIDB4MTY3MCwgMHhhZDg4LCAweDAwMTgsIDB4MjBhOSwgMHgwMDEwLCAweDIxMDQsCisJMHhhMDg2LCAweGZmZmYsIDB4MDEyOCwgMHg4MTA4LCAweDFmMDQsIDB4NTBlNywgMHgwODBjLCAweDE1MTUsCisJMHgyNjBhLCAweDgyMTAsIDB4NmE1NiwgMHgwMDk4LCAweDA4MGMsIDB4MTVmOCwgMHgwMWQwLCAweDJkMDAsCisJMHg2MGFhLCAweDY4NTMsIDB4MDAwMCwgMHhhZDg4LCAweDAwMTgsIDB4MjBhOSwgMHgwMDEwLCAweDIwMGIsCisJMHhmZmZmLCAweDgxMDgsIDB4MWYwNCwgMHg1MGZmLCAweDY4NTcsIDB4MDAwMSwgMHg2ZTYyLCAweDAwMTAsCisJMHgwODBjLCAweDRlZGUsIDB4MDA4OSwgMHgxZGUwLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsCisJMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZjYWEsCisJMHgwMTJlLCAweDAwMDUsIDB4YTAxZSwgMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHhhMDBlLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NjA0YywgMHgyMDY4LCAweDYwMDAsIDB4ZDBkYywgMHgxMTcwLCAweDhkZmYsCisJMHgwMWY4LCAweDgzZmYsIDB4MDEyMCwgMHg2ODQ4LCAweGE2MDYsIDB4MDE1OCwgMHgwMDMwLCAweDY4M2MsCisJMHhhNDA2LCAweDExMTgsIDB4Njg0MCwgMHhhNTA2LCAweDAxMjAsIDB4MmQwOCwgMHg2ODAwLCAweDIwNjgsCisJMHgwYzcwLCAweDA4MGMsIDB4ODExZSwgMHg2YTAwLCAweDYwNGMsIDB4YWQwNiwgMHgxMTEwLCAweDYyNGUsCisJMHgwMDE4LCAweGExODAsIDB4MDAwMCwgMHgyMjAyLCAweDgyZmYsIDB4MTExMCwgMHg2MTUyLCAweDhkZmYsCisJMHgwMTJlLCAweDAwMDUsIDB4YTAxZSwgMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHhhMDBlLCAweDYwODAsCisJMHgyMDY4LCAweDhkZmYsIDB4MDFlOCwgMHg4M2ZmLCAweDAxMjAsIDB4Njg0OCwgMHhhNjA2LCAweDAxNTgsCisJMHgwMDMwLCAweDY4M2MsIDB4YTQwNiwgMHgxMTE4LCAweDY4NDAsIDB4YTUwNiwgMHgwMTIwLCAweDJkMDgsCisJMHg2ODAwLCAweDIwNjgsIDB4MGM3MCwgMHg2YTAwLCAweDYwODAsIDB4YWQwNiwgMHgxMTEwLCAweDYyODIsCisJMHgwMDE4LCAweGExODAsIDB4MDAwMCwgMHgyMjAyLCAweDgyZmYsIDB4MTExMCwgMHg2MTg2LCAweDhkZmYsCisJMHgwMDA1LCAweGEwMTYsIDB4MDgwYywgMHg1MWNlLCAweDExMTAsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsCisJMHg1MjE5LCAweDExMTAsIDB4YTI5NSwgMHgwMDAyLCAweDAwMDUsIDB4MDgwYywgMHg1MjRhLCAweDAxMTgsCisJMHgwODBjLCAweDlkMGYsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDUyNGEsCisJMHgwMTE4LCAweDA4MGMsIDB4OWM5ZiwgMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsCisJMHg1MjRhLCAweDAxMTgsIDB4MDgwYywgMHg5Y2YyLCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHgwODBjLCAweDUyNGEsIDB4MDExOCwgMHgwODBjLCAweDljYmIsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDA1LCAweDA4MGMsIDB4NTI0YSwgMHgwMTE4LCAweDA4MGMsIDB4OWQyYiwgMHgwMDEwLCAweGEwODUsCisJMHgwMDAxLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZDYsIDB4MjA5MSwgMHg4MDAwLCAweDYwODAsCisJMHhhMDZkLCAweDAxYTAsIDB4NjgwMCwgMHgwMDA2LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDA4MGMsIDB4OWVjYywgMHgwMDA2LCAweDYwMDAsIDB4ZDBmYywgMHgwMTEwLCAweDA4MGMsCisJMHhiMzg5LCAweDAwMGUsIDB4MDgwYywgMHg1NDA4LCAweDAwMGUsIDB4MGM1MCwgMHg2MDgzLCAweDAwMDAsCisJMHg2MDg3LCAweDAwMDAsIDB4MDBkZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHg2MGE0LCAweGEwMGQsCisJMHgxMTE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZTYsIDB4MjE3MCwgMHg3MDAwLCAweGEwMDUsCisJMHgxMTY4LCAweDIwYTksIDB4MDAxMCwgMHhhZTg4LCAweDAwMDQsIDB4MjEwNCwgMHhhNjA2LCAweDAxMzAsCisJMHg4MTA4LCAweDFmMDQsIDB4NTFkZCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwOCwgMHhhMDA2LCAweDAwZWUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLCAweDExMjgsCisJMHgwODBjLCAweDE1ZjgsIDB4MDFhMCwgMHgyZDAwLCAweDYwYTYsIDB4NjgwMywgMHgwMDAxLCAweDY4MDcsCisJMHgwMDAwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwYiwgMHhmZmZmLCAweDgxMDgsCisJMHgxZjA0LCAweDUxZmQsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweGEwMDYsCisJMHgwY2Q4LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLCAweDAxMzAsCisJMHg2MGE3LCAweDAwMDAsIDB4MDgwYywgMHgxNjBmLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsCisJMHgwMDA1LCAweDYwYTgsIDB4YTAwZCwgMHgxMTE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMTcwLCAweDcwNTAsIDB4YTAwNSwgMHgxMTYwLCAweDIwYTksIDB4MDAxMCwgMHhhZTg4LCAweDAwMTgsCisJMHgyMTA0LCAweGE2MDYsIDB4MDEyOCwgMHg4MTA4LCAweDFmMDQsIDB4NTIyOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGMxOSwgMHgxMTg4LCAweDIwMGIsCisJMHhmZmZmLCAweDAwZDYsIDB4NjBhOCwgMHgyMDY4LCAweDY4NTQsIDB4YTA4YSwgMHgwMDAyLCAweDAyMTgsCisJMHg4MDAxLCAweDY4NTYsIDB4MDAyMCwgMHgwODBjLCAweDE2MGYsIDB4NjBhYiwgMHgwMDAwLCAweDAwZGUsCisJMHgwMTJlLCAweDAwMDUsIDB4NjA5YywgMHhkMGE0LCAweDAwMDUsIDB4MDBmNiwgMHgwODBjLCAweDVhY2YsCisJMHgwMWIwLCAweDcxYjgsIDB4ODFmZiwgMHgxMTk4LCAweDcxZDQsIDB4ZDE5YywgMHgwMTgwLCAweDIwMDEsCisJMHgwMDdlLCAweGEwODAsIDB4YjYzNSwgMHgyMDA0LCAweGEwN2QsIDB4MDE0OCwgMHg3ODA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTE4LCAweDc4MDAsIDB4YzBlZCwgMHg3ODAyLCAweDIwNzksCisJMHhiNTUyLCAweDc4MDQsIDB4ZDBhNCwgMHgwMWU4LCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LCAweDAwN2YsCisJMHgyMDA5LCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLCAweDRmYTksIDB4MTE2OCwgMHg2MDA0LCAweGEwODQsCisJMHhmZjAwLCAweDgwMDcsIDB4YTA5NiwgMHgwMDA0LCAweDAxMTgsIDB4YTA4NiwgMHgwMDA2LCAweDExMTgsCisJMHg2MDAwLCAweGMwZWQsIDB4NjAwMiwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg1MjcyLCAweDAwY2UsCisJMHgwMTVlLCAweDA4MGMsIDB4NTMwOSwgMHgwMTIwLCAweDIwMDEsIDB4YjdiNSwgMHgyMDBjLCAweDAwMzgsCisJMHgyMDc5LCAweGI1NTIsIDB4NzgwNCwgMHhkMGE0LCAweDAxMzAsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg1MjlkLCAweDA4MGMsIDB4NmEyMiwgMHgwMGZlLCAweDAwMDUsIDB4MjAxMSwgMHg1MjlkLCAweDA4MGMsCisJMHg2OTljLCAweDA4MGMsIDB4NTMwOSwgMHgwMWYwLCAweDIwMDEsIDB4YjZiMywgMHgyMDA0LCAweGEwODAsCisJMHgwMDAwLCAweDIwMGMsIDB4YzFlYywgMHgyMTAyLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYTQsCisJMHgwMTMwLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDUyOWQsIDB4MDgwYywgMHg2YTIyLCAweDAwZTYsCisJMHgyMDcxLCAweGI1MDAsIDB4NzA3MywgMHgwMDAwLCAweDcwNzcsIDB4MDAwMCwgMHgwODBjLCAweDJhYjgsCisJMHgwMGVlLCAweDA0YjAsIDB4MDE1NiwgMHgwMGM2LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDE2LCAweDA4MGMsIDB4NGZhOSwgMHgxNTMwLCAweDYwMDAsIDB4ZDBlYywgMHgwNTE4LCAweDAwNDYsCisJMHg2MmEwLCAweGEyOTQsIDB4MDBmZiwgMHg4MjI3LCAweGEwMDYsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsCisJMHhiMGU4LCAweDYwMDAsIDB4YzBlNSwgMHhjMGVjLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg1LCAweDA3MDAsIDB4NjAwNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg2ZGY1LCAweDAwNzYsCisJMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ZDAyLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweGFlODIsCisJMHgwMDdlLCAweDAwNGUsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NTJjOCwgMHgwMGNlLCAweDAxNWUsCisJMHgwMDA1LCAweDAwYzYsIDB4NjAxOCwgMHgyMDYwLCAweDYwMDAsIDB4YzBlYywgMHg2MDAyLCAweDAwY2UsCisJMHgwMDA1LCAweDc4MTgsIDB4MjAwNCwgMHhkMGFjLCAweDAwMDUsIDB4NzgxOCwgMHgyMDA0LCAweGQwYmMsCisJMHgwMDA1LCAweDAwZjYsIDB4MjAwMSwgMHhiNmIzLCAweDIwMDQsIDB4YTA3ZCwgMHgwMTEwLCAweDc4MDAsCisJMHhkMGVjLCAweDAwZmUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMDYsCisJMHg2MmEwLCAweGEyOTAsIDB4YjYzNSwgMHgyMjA0LCAweGFjMDYsIDB4MTkwYywgMHgxNTE1LCAweDAwMGUsCisJMHg2MjAwLCAweGEwMDUsIDB4MDExMCwgMHhjMmZkLCAweDAwMDgsIDB4YzJmYywgMHg2MjAyLCAweDAwMmUsCisJMHgwMTJlLCAweDAwMDUsIDB4MjAxMSwgMHhiNTM1LCAweDIyMDQsIDB4ZDBjYywgMHgwMTM4LCAweDIwMDEsCisJMHhiN2IzLCAweDIwMGMsIDB4MjAxMSwgMHg1MzM3LCAweDA4MGMsIDB4NmEyMiwgMHgwMDA1LCAweDIwMTEsCisJMHg1MzM3LCAweDA4MGMsIDB4Njk5YywgMHgyMDExLCAweGI1MzUsIDB4MjIwNCwgMHhjMGNjLCAweDIwMTIsCisJMHgwMDA1LCAweDIwNzEsIDB4YjYxNCwgMHg3MDAzLCAweDAwMDEsIDB4NzAwNywgMHgwMDAwLCAweDcwMTMsCisJMHgwMDAwLCAweDcwMTcsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwMDAwLCAweDcwMGIsCisJMHgwMDAwLCAweDcwNGIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1YiwgMHgwMDIwLCAweDcwNWYsCisJMHgwMDQwLCAweDcwN2YsIDB4MDAwMCwgMHgyMDcxLCAweGI3N2QsIDB4NzAwMywgMHhiNjE0LCAweDcwMDcsCisJMHgwMDAwLCAweDcwMGIsIDB4MDAwMCwgMHg3MDBmLCAweGI3NWQsIDB4NzAxMywgMHgwMDIwLCAweDcwMTcsCisJMHgwMDQwLCAweDcwMzcsIDB4MDAwMCwgMHgwMDA1LCAweDAwMTYsIDB4MDBlNiwgMHgyMDcxLCAweGI3MzUsCisJMHhhMDBlLCAweDcxODYsIDB4NzE4YSwgMHg3MDk3LCAweDAwMDEsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsCisJMHhkMGZjLCAweDExNTAsIDB4MjAwMSwgMHhiNTUzLCAweDIwMDQsIDB4YTAwZSwgMHhkMDljLCAweDAxMDgsCisJMHg4MTA4LCAweDcxMDIsIDB4MDgwNCwgMHg1M2QyLCAweDIwMDEsIDB4YjU3MiwgMHgyMDBjLCAweGExODQsCisJMHgwMDBmLCAweDIwMDksIDB4YjU3MywgMHgyMTBjLCAweDAwMDIsIDB4NTM3YSwgMHg1M2FkLCAweDUzYjQsCisJMHg1M2JlLCAweDUzYzMsIDB4NTM3YSwgMHg1MzdhLCAweDUzN2EsIDB4NTM5ZCwgMHg1MzdhLCAweDUzN2EsCisJMHg1MzdhLCAweDUzN2EsIDB4NTM3YSwgMHg1MzdhLCAweDUzN2EsIDB4NzAwMywgMHgwMDA0LCAweDAxMzYsCisJMHgwMTQ2LCAweDAxNTYsIDB4MjA5OSwgMHhiNTc2LCAweDIwYTEsIDB4Yjc4NiwgMHgyMGE5LCAweDAwMDQsCisJMHg1M2EzLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDA0MjgsIDB4NzA4ZiwgMHgwMDA1LCAweDcwMDcsCisJMHgwMTIyLCAweDIwMDEsIDB4MDAwMiwgMHgwMDMwLCAweDcwOGYsIDB4MDAwMiwgMHg3MDA3LCAweDAxMjEsCisJMHgyMDAxLCAweDAwMDMsIDB4NzAwMiwgMHg3MDk3LCAweDAwMDEsIDB4MDA4OCwgMHg3MDA3LCAweDAxMjIsCisJMHgyMDAxLCAweDAwMDIsIDB4MDAyMCwgMHg3MDA3LCAweDAxMjEsIDB4MjAwMSwgMHgwMDAzLCAweDcwMDIsCisJMHhhMDA2LCAweDcwOTYsIDB4NzA4ZSwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHg3MDlhLCAweGExODQsCisJMHgwMGZmLCAweDcwOTIsIDB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI2MTQsCisJMHg2ODRjLCAweGEwMDUsIDB4MTEzMCwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHhhMDg1LCAweDAwMDEsCisJMHgwNDI4LCAweDZhNjAsIDB4NzIzNiwgMHg2YjY0LCAweDczM2EsIDB4Njg2OCwgMHg3MDNlLCAweDcwNzYsCisJMHg2ODZjLCAweDcwNDIsIDB4NzA3YSwgMHg2ODRjLCAweDcwMmUsIDB4Njg0NCwgMHg3MDMyLCAweDIwMDksCisJMHgwMDBkLCAweDIwMGEsIDB4NzAwYiwgMHgwMDAwLCAweDgwMDcsIDB4ODAwNiwgMHg4MDA2LCAweGEwOGMsCisJMHgwMDNmLCAweGEwODQsIDB4ZmZjMCwgMHhhMjEwLCAweDIxMDAsIDB4YTMxOSwgMHg3MjZlLCAweDczNzIsCisJMHg3MDI4LCAweGMwODQsIDB4NzAyYSwgMHg3MDA3LCAweDAwMDEsIDB4YTAwNiwgMHgwMGVlLCAweDAwMDUsCisJMHgwMTU2LCAweDAwZTYsIDB4MDAyNiwgMHg2ODM4LCAweGQwZmMsIDB4MTkwNCwgMHg1NDYxLCAweDY4MDQsCisJMHhhMDBkLCAweDAxODgsIDB4MDBkNiwgMHgyMDcxLCAweGI1MDAsIDB4YTAxNiwgMHg3MDJjLCAweDIxNjgsCisJMHg2OTA0LCAweDIwNmEsIDB4ODIxMCwgMHgyZDAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYjQsCisJMHhhMjAwLCAweDcwYjYsIDB4MDBkZSwgMHgyMDcxLCAweGI2MTQsIDB4NzAxYywgMHhhMDA1LCAweDE5MDQsCisJMHg1NDcxLCAweDIwYTksIDB4MDAzMiwgMHgwZjA0LCAweDU0NmYsIDB4MGUwNCwgMHg1NDJiLCAweDIwNzEsCisJMHhiNzM1LCAweDcyMDAsIDB4ODJmZiwgMHgwNWQ4LCAweDY5MzQsIDB4YTE4NiwgMHgwMTAzLCAweDE5MDQsCisJMHg1NDdmLCAweDY5NDgsIDB4Njg0NCwgMHhhMTA1LCAweDE1NDAsIDB4MjAwOSwgMHg4MDIwLCAweDIyMDAsCisJMHgwMDAyLCAweDU0NmYsIDB4NTQ0NiwgMHg1NDk3LCAweDU0YTMsIDB4NTQ2ZiwgMHgyMDcxLCAweDAwMDAsCisJMHgyMGE5LCAweDAwMzIsIDB4MGYwNCwgMHg1NDZmLCAweDcwMTgsIDB4ZDA4NCwgMHgxZGQ4LCAweDcxMjIsCisJMHg2ODNjLCAweDcwMjYsIDB4Njg0MCwgMHg3MDJhLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgyMDcxLCAweGI1MDAsIDB4NzAyYywgMHgyMDZhLCAweDJkMDAsIDB4NzAyZSwgMHg3MGI0LCAweDgwMDAsCisJMHg3MGI2LCAweDAwMmUsIDB4MDBlZSwgMHgwMTVlLCAweDAwMDUsIDB4Njg0NCwgMHhhMDg2LCAweDAxMDAsCisJMHgxMTMwLCAweDY4NjgsIDB4YTAwNSwgMHgxMTE4LCAweDIwMDksIDB4ODAyMCwgMHgwODgwLCAweDIwNzEsCisJMHhiNjE0LCAweDJkMDgsIDB4MjA2YiwgMHgwMDAwLCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMTgsCisJMHhhMDZkLCAweDcxMWEsIDB4MDExMCwgMHg2OTAyLCAweDAwMDgsIDB4NzExZSwgMHgwYzEwLCAweGExOGMsCisJMHgwMGZmLCAweGExODYsIDB4MDAxNywgMHgwMTMwLCAweGExODYsIDB4MDAxZSwgMHgwMTE4LCAweGExOGUsCisJMHgwMDFmLCAweDFkMjgsIDB4Njg0YywgMHhkMGNjLCAweDBkMTAsIDB4Njg1MCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDEsIDB4MTllMCwgMHgyMDA5LCAweDgwMjEsIDB4MDgwNCwgMHg1NDNmLCAweDcwODQsCisJMHg4MDA4LCAweGEwOTIsIDB4MDAxZSwgMHgxYTk4LCAweDcxODYsIDB4YWU5MCwgMHgwMDAzLCAweGEyMTAsCisJMHg2ODNjLCAweDIwMTIsIDB4MDA3OCwgMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDBmLCAweDFhMzgsCisJMHg3MTg2LCAweGFlOTAsIDB4MDAwMywgMHg4MDAzLCAweGEyMTAsIDB4NjgzYywgMHgyMDEyLCAweDgyMTAsCisJMHg2ODQwLCAweDIwMTIsIDB4NzA4OCwgMHhhMTBhLCAweDBhMDQsIDB4NTQ1OCwgMHg3MThjLCAweDcwODQsCisJMHhhMTBhLCAweDBhMDQsIDB4NTQ1OCwgMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDE5MDQsCisJMHg1NDU4LCAweDIwNzEsIDB4YjczNSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTUwLCAweDA4MGMsCisJMHg1NzIyLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDA4MDQsCisJMHg1NDU4LCAweDA4MGMsIDB4NTc0YywgMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsCisJMHg0MDgwLCAweDA4MDQsIDB4NTQ1OCwgMHgwMDA2LCAweDY4NGMsIDB4MDAwNiwgMHg2ODM3LCAweDAxMDMsCisJMHgyMGE5LCAweDAwMWMsIDB4YWQ4MCwgMHgwMDExLCAweDIwYTAsIDB4MjAwMSwgMHgwMDAwLCAweDQwYTQsCisJMHgwMDBlLCAweGEwODQsIDB4MDBmZiwgMHg2ODRlLCAweDAwMGUsIDB4Njg0YSwgMHg2OTUyLCAweDAwMDUsCisJMHgyMDcxLCAweGI2MTQsIDB4NzAwNCwgMHgwMDAyLCAweDU0ZmUsIDB4NTUwZiwgMHg1NzBkLCAweDU3MGUsCisJMHg1NzFiLCAweDU3MjEsIDB4NTRmZiwgMHg1NmZlLCAweDU2OTQsIDB4NTZlYSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1NTBlLCAweDIwMDksIDB4MDAwZCwgMHg3MDMwLCAweDIwMGEsCisJMHgyMDkxLCAweDQwODAsIDB4NzAwNywgMHgwMDAxLCAweDcwMGIsIDB4MDAwMCwgMHgwMTJlLCAweDIwNjksCisJMHhiN2YzLCAweDY4M2MsIDB4YTAwNSwgMHgwM2Y4LCAweDExZjAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDY5LCAweDAwMDAsIDB4NjkzNCwgMHgyMDAxLCAweGI2MjAsIDB4MjAwNCwgMHhhMTBhLCAweDAxNzAsCisJMHgwZTA0LCAweDU1MzIsIDB4MjA2OSwgMHgwMDAwLCAweDY4MTgsIDB4ZDA4NCwgMHgxMTU4LCAweDIwMDksCisJMHg4MDQwLCAweDY5MjIsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgyMDY5LCAweGI3ZjMsCisJMHg2ODNmLCAweGZmZmYsIDB4MDEyZSwgMHgyMDY5LCAweGI1MDAsIDB4Njg0OCwgMHg2OTY4LCAweGExMDIsCisJMHgyMDY5LCAweGI3MzUsIDB4Njg4YSwgMHg2OTg0LCAweDcwMWMsIDB4YTA2ZCwgMHgwMTIwLCAweDgxZmYsCisJMHgwOTA0LCAweDU1ODgsIDB4MDBhMCwgMHg4MWZmLCAweDA5MDQsIDB4NTY0ZSwgMHgyMDcxLCAweGI3MzUsCisJMHg3MTg0LCAweDcwODgsIDB4YTEwYSwgMHgxMjU4LCAweDcxOTAsIDB4MjA3MSwgMHhiN2YzLCAweDcwMzgsCisJMHhhMDA1LCAweDAxMjgsIDB4MWIwNCwgMHg1NjRlLCAweDcxM2EsIDB4MDgwNCwgMHg1NjRlLCAweDIwNzEsCisJMHhiNzM1LCAweDcxOGMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzA4NCwgMHhhMTBhLCAweDBhMDQsCisJMHg1NjY5LCAweDBlMDQsIDB4NTYwYSwgMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDE5MDQsCisJMHg1NjBhLCAweDIwMDEsIDB4ZmZmZiwgMHgyMDcxLCAweGI3ZjMsIDB4NzAzYSwgMHgyMDcxLCAweGI3MzUsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTUwLCAweDA4MGMsIDB4NTcyMiwgMHgyMDcxLCAweDAwMDAsCisJMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDA4MDQsIDB4NTYwYSwgMHgwODBjLCAweDU3NGMsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwODA0LCAweDU2MGEsCisJMHgyMDcxLCAweGI3MzUsIDB4NzAwMCwgMHhhMDA1LCAweDA5MDQsIDB4NTYzMCwgMHg2OTM0LCAweGExODYsCisJMHgwMTAzLCAweDE5MDQsIDB4NTYwZCwgMHg2ODRjLCAweGQwYmMsIDB4MTkwNCwgMHg1NjMwLCAweDY5NDgsCisJMHg2ODQ0LCAweGExMDUsIDB4MTkwNCwgMHg1NjI1LCAweDIwMDksIDB4ODAyMCwgMHgyMDcxLCAweGI3MzUsCisJMHg3MDAwLCAweDAwMDIsIDB4NTYzMCwgMHg1NWYwLCAweDU1YzgsIDB4NTVkYSwgMHg1NWE3LCAweDAxMzYsCisJMHgwMTQ2LCAweDAxNTYsIDB4MjA5OSwgMHhiNTc2LCAweDIwYTEsIDB4Yjc4NiwgMHgyMGE5LCAweDAwMDQsCisJMHg1M2EzLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDIwNzEsIDB4Yjc3ZCwgMHhhZDgwLCAweDAwMGYsCisJMHg3MDBlLCAweDcwMTMsIDB4MDAwMiwgMHg3MDA3LCAweDAwMDIsIDB4NzAwYiwgMHgwMDAwLCAweDJlMTAsCisJMHgwODBjLCAweDE2NDMsIDB4MjA3MSwgMHhiNjE0LCAweDcwMDcsIDB4MDAwOSwgMHgwODA0LCAweDU2NGUsCisJMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDFlLCAweDFhMDQsIDB4NTY0ZSwgMHhhZTkwLCAweDAwMDMsCisJMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg3MTg2LCAweDIwNzEsIDB4YjYxNCwgMHgwODBjLCAweDU3YTMsCisJMHgwODA0LCAweDU2NGUsIDB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAwZiwgMHgxYTA0LCAweDU2NGUsCisJMHhhZTkwLCAweDAwMDMsIDB4ODAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg4MjEwLCAweDY4NDAsCisJMHgyMDEyLCAweDcxODYsIDB4MjA3MSwgMHhiNjE0LCAweDA4MGMsIDB4NTdhMywgMHgwODA0LCAweDU2NGUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDU2MGEsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTgsCisJMHhkMDg0LCAweDExODAsIDB4NzEyMiwgMHg2ODNjLCAweDcwMjYsIDB4Njg0MCwgMHg3MDJhLCAweDcwMWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMTJlLCAweDIwNzEsIDB4YjYxNCwgMHgwODBjLCAweDU3YTMsCisJMHgwODA0LCAweDU2NGUsIDB4MDEyZSwgMHgwODA0LCAweDU2NGUsIDB4YTE4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDE3LCAweDAxMzAsIDB4YTE4NiwgMHgwMDFlLCAweDAxMTgsIDB4YTE4ZSwgMHgwMDFmLCAweDExYzAsCisJMHg2ODRjLCAweGQwY2MsIDB4MDFhOCwgMHg2ODUwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDEsCisJMHgxMTc4LCAweDIwMDksIDB4ODAyMSwgMHgwODA0LCAweDU1OWUsIDB4Njg0NCwgMHhhMDg2LCAweDAxMDAsCisJMHgxMTM4LCAweDY4NjgsIDB4YTAwNSwgMHgxMTIwLCAweDIwMDksIDB4ODAyMCwgMHgwODA0LCAweDU1OWUsCisJMHgyMDcxLCAweGI2MTQsIDB4MDgwYywgMHg1N2I1LCAweDAxYzgsIDB4MjA3MSwgMHhiNjE0LCAweDcwMGYsCisJMHgwMDAxLCAweDY5MzQsIDB4YTE4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMywgMHgxMTMwLCAweDgxMGYsCisJMHhhMThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LCAweDcxMGUsIDB4NzAwNywgMHgwMDAzLCAweDA4MGMsCisJMHg1N2NlLCAweDcwNTAsIDB4YTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4NTcwZSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4YjYxNCwgMHg3MDA4LCAweGEwODYsIDB4MDAwMSwgMHgxMTgwLCAweDBlMDQsCisJMHg1NjY3LCAweDIwMDksIDB4MDAwZCwgMHg3MDMwLCAweDIwMGEsIDB4MjA5MSwgMHg0MDgwLCAweDcwMGIsCisJMHgwMDAwLCAweDcwMDQsIDB4YTA4NiwgMHgwMDA2LCAweDExMTAsIDB4NzAwNywgMHgwMDAxLCAweDAxMmUsCisJMHgwMDA1LCAweDIwNzEsIDB4YjYxNCwgMHgwODBjLCAweDU3YjUsIDB4MDUxOCwgMHgyMDcxLCAweGI3MzUsCisJMHg3MDg0LCAweDcwMGEsIDB4MjBhOSwgMHgwMDIwLCAweDIwOTksIDB4YjczNiwgMHgyMGExLCAweGI3NWQsCisJMHg1M2EzLCAweDcwODcsIDB4MDAwMCwgMHgyMDcxLCAweGI2MTQsIDB4MjA2OSwgMHhiNzdkLCAweDcwNmMsCisJMHg2ODI2LCAweDcwNzAsIDB4NjgyYSwgMHg3MDc0LCAweDY4MmUsIDB4NzA3OCwgMHg2ODMyLCAweDJkMTAsCisJMHgwODBjLCAweDE2NDMsIDB4NzAwNywgMHgwMDA4LCAweDIwMDEsIDB4ZmZmZiwgMHgyMDcxLCAweGI3ZjMsCisJMHg3MDNhLCAweDAxMmUsIDB4MDgwNCwgMHg1NjRlLCAweDIwNjksIDB4Yjc3ZCwgMHg2ODA4LCAweGEwOGUsCisJMHgwMDAwLCAweDA5MDQsIDB4NTZlOSwgMHhhMDhlLCAweDAyMDAsIDB4MDkwNCwgMHg1NmU3LCAweGEwOGUsCisJMHgwMTAwLCAweDE5MDQsIDB4NTZlOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDU2ZTUsCisJMHgyMDY5LCAweDAwMDAsIDB4NjgxOCwgMHhkMDg0LCAweDE1YzAsIDB4NzAyYywgMHg3MTMwLCAweDgxMDgsCisJMHhhMTAyLCAweDAyMzAsIDB4YTAwZSwgMHg3MDM0LCAweDcwNmUsIDB4NzAzOCwgMHg3MDcyLCAweDAwNDgsCisJMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLCAweDEyMjAsIDB4NzA3MCwgMHhhMDgxLCAweDAwMDAsCisJMHg3MDcyLCAweDcxMzIsIDB4NjkzNiwgMHg3MDBiLCAweDAwMDAsIDB4MjAwMSwgMHhiNzVhLCAweDIwMDQsCisJMHhhMDA1LCAweDExOTAsIDB4NjkzNCwgMHgyMDY5LCAweGI3MzUsIDB4Njg5YywgMHg2OTllLCAweDIwNjksCisJMHhiN2YzLCAweGExMDIsIDB4MTExOCwgMHg2ODNjLCAweGEwMDUsIDB4MTM2OCwgMHgyMDAxLCAweGI3NWIsCisJMHgyMDBjLCAweDgxMGQsIDB4NjkzZSwgMHgwMDM4LCAweDIwMDksIDB4ODA0MCwgMHg2OTIyLCAweDY4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDA3LCAweDAwMDEsIDB4MDEyZSwgMHgwMDEwLCAweDcwMDcsCisJMHgwMDA1LCAweDAwMDUsIDB4MjAwMSwgMHhiNzdmLCAweDIwMDQsIDB4YTA4ZSwgMHgwMTAwLCAweDExMjgsCisJMHg3MDA3LCAweDAwMDEsIDB4MDgwYywgMHg1N2EzLCAweDAwMDUsIDB4YTA4ZSwgMHgwMDAwLCAweDBkZTAsCisJMHhhMDhlLCAweDAyMDAsIDB4MWRjOCwgMHg3MDA3LCAweDAwMDUsIDB4MDAwNSwgMHg3MDFjLCAweGEwNmQsCisJMHgwMTU4LCAweDA4MGMsIDB4NTdiNSwgMHgwMTQwLCAweDcwMDcsIDB4MDAwMywgMHgwODBjLCAweDU3Y2UsCisJMHg3MDUwLCAweGEwODYsIDB4MDEwMCwgMHgwMTEwLCAweDAwMDUsIDB4MDAwNSwgMHg3MDUwLCAweGEwOWUsCisJMHgwMTAwLCAweDExMTgsIDB4NzAwNywgMHgwMDA0LCAweDAwMzAsIDB4YTA4NiwgMHgwMjAwLCAweDExMTAsCisJMHg3MDA3LCAweDAwMDUsIDB4MDAwNSwgMHgwODBjLCAweDU3NzEsIDB4NzAwNiwgMHgwODBjLCAweDU3YTMsCisJMHgwMDA1LCAweDAwMDUsIDB4MDBlNiwgMHgwMTU2LCAweDIwNzEsIDB4YjczNSwgMHg3MTg0LCAweDgxZmYsCisJMHgwNTAwLCAweGEwMDYsIDB4NzA4NiwgMHhhZTgwLCAweDAwMDMsIDB4MjA3MSwgMHgwMDAwLCAweDIxYTgsCisJMHgyMDE0LCAweDcyMjYsIDB4ODAwMCwgMHgwZjA0LCAweDU3NDYsIDB4MjAxNCwgMHg3MjJhLCAweDgwMDAsCisJMHgwZjA0LCAweDU3NDYsIDB4MjAxNCwgMHg3MjJlLCAweDgwMDAsIDB4MGYwNCwgMHg1NzQ2LCAweDIwMTQsCisJMHg3MjNhLCAweDgwMDAsIDB4MGYwNCwgMHg1NzQ2LCAweDIwMTQsIDB4NzIzZSwgMHhhMTgwLCAweDgwMzAsCisJMHg3MDIyLCAweDAxNWUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDE1NiwgMHgyMDcxLCAweGI3MzUsCisJMHg3MTg0LCAweDgxZmYsIDB4MDFkOCwgMHhhMDA2LCAweDcwODYsIDB4YWU4MCwgMHgwMDAzLCAweDIwNzEsCisJMHgwMDAwLCAweDIxYTgsIDB4MjAxNCwgMHg3MjI2LCAweDgwMDAsIDB4MjAxNCwgMHg3MjJhLCAweDgwMDAsCisJMHgwZjA0LCAweDU3NjgsIDB4MjAxNCwgMHg3MjNhLCAweDgwMDAsIDB4MjAxNCwgMHg3MjNlLCAweDAwMTgsCisJMHgyMDAxLCAweDgwMjAsIDB4MDAxMCwgMHgyMDAxLCAweDgwNDIsIDB4NzAyMiwgMHgwMTVlLCAweDAwZWUsCisJMHgwMDA1LCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LCAweGExMDIsIDB4MDIzMCwgMHhhMDBlLCAweDcwMzQsCisJMHg3MDZlLCAweDcwMzgsIDB4NzA3MiwgMHgwMDQ4LCAweDcwNmMsIDB4YTA4MCwgMHgwMDQwLCAweDcwNmUsCisJMHgxMjIwLCAweDcwNzAsIDB4YTA4MSwgMHgwMDAwLCAweDcwNzIsIDB4NzEzMiwgMHg3MDBjLCAweDgwMDEsCisJMHg3MDBlLCAweDExODAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1NzlkLCAweDIwMDEsCisJMHgwMDBkLCAweDIxMDIsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDAwMSwgMHg3MDBiLCAweDAwMDAsCisJMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDA3LCAweDAwMDUsIDB4MjAwMSwgMHgwMDA2LCAweDcwMGIsCisJMHgwMDAxLCAweDAxMmUsIDB4MDAwNSwgMHg3MDFjLCAweGEwNmQsIDB4MDE3MCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDJkMDQsIDB4NzAxZSwgMHhhMDA1LCAweDExMDgsCisJMHg3MDFhLCAweDAxMmUsIDB4MDgwYywgMHgxNjBmLCAweDAwMDUsIDB4MjAxOSwgMHgwMDBkLCAweDIzMDQsCisJMHgyMzBjLCAweGExMGUsIDB4MDEzMCwgMHgyMzA0LCAweDIzMGMsIDB4YTEwZSwgMHgwMTEwLCAweGEwMDYsCisJMHgwMDYwLCAweDczMmMsIDB4ODMxOSwgMHg3MTMwLCAweGExMDIsIDB4MTExOCwgMHgyMzAwLCAweGEwMDUsCisJMHgwMDIwLCAweDAyMTAsIDB4YTMwMiwgMHgwMDA4LCAweDgwMDIsIDB4MDAwNSwgMHgyZDAwLCAweDcwMjYsCisJMHhhMDgwLCAweDAwMGQsIDB4NzA1NiwgMHg3MDUzLCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDA5LCAweGI4MTIsIDB4MjEwNCwgMHhjMDhkLCAweDIwMGEsIDB4MDEyZSwgMHgwODBjLCAweDE2NWYsCisJMHgwMDA1LCAweDcwOGMsIDB4YTA4YSwgMHgwMDI5LCAweDEyMjAsIDB4YTA4MiwgMHgwMDFkLCAweDAwMzMsCisJMHgwMDEwLCAweDA4MGMsIDB4MTUxNSwgMHg2MDI3LCAweDFlMDAsIDB4MDAwNSwgMHg1OGRjLCAweDU4NTcsCisJMHg1ODZmLCAweDU4YWMsIDB4NThjZCwgMHg1OTA3LCAweDU5MTksIDB4NTg2ZiwgMHg1OGYzLCAweDU3ZmIsCisJMHg1ODI5LCAweDU3ZmEsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweGEwMDUsCisJMHgxMTgwLCAweDY4MDgsIDB4YTAwNSwgMHgxNTE4LCAweDcwOGYsIDB4MDAyOCwgMHgyMDY5LCAweGI3YzUsCisJMHgyZDA0LCAweDcwMDIsIDB4MDgwYywgMHg1YmQxLCAweDYwMjgsIDB4YTA4NSwgMHgwNjAwLCAweDYwMmEsCisJMHgwMGIwLCAweDcwOGYsIDB4MDAyOCwgMHgyMDY5LCAweGI3YzUsIDB4MmQwNCwgMHg3MDAyLCAweDYwMjgsCisJMHhhMDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDIwNzEsCisJMHhiODIzLCAweDA4MGMsIDB4MWRmZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4YTAwNSwgMHgxMTgwLCAweDY4MDgsCisJMHhhMDA1LCAweDE1MTgsIDB4NzA4ZiwgMHgwMDI4LCAweDIwNjksIDB4YjdjNSwgMHgyZDA0LCAweDcwMDIsCisJMHgwODBjLCAweDVjNWUsIDB4NjAyOCwgMHhhMDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGIwLCAweDcwOGYsCisJMHgwMDI4LCAweDIwNjksIDB4YjdjNSwgMHgyZDA0LCAweDcwMDIsIDB4NjAyOCwgMHhhMDg1LCAweDA2MDAsCisJMHg2MDJhLCAweDAwZTYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHhiODIzLCAweDA4MGMsCisJMHgxZGZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDA1LCAweDY4MDMsCisJMHgwMDkwLCAweDYxMjQsIDB4ZDFlNCwgMHgxMTkwLCAweDA4MGMsIDB4NTk4NCwgMHhkMWQ0LCAweDExNjAsCisJMHhkMWRjLCAweDExMzgsIDB4ZDFjYywgMHgwMTUwLCAweDcwOGYsIDB4MDAyMCwgMHgwODBjLCAweDU5ODQsCisJMHgwMDI4LCAweDcwOGYsIDB4MDAxZCwgMHgwMDEwLCAweDcwOGYsIDB4MDAxZiwgMHgwMDA1LCAweDY4MDMsCisJMHgwMDg4LCAweDYxMjQsIDB4ZDFjYywgMHgxNTkwLCAweGQxZGMsIDB4MTU2OCwgMHhkMWU0LCAweDE1NDAsCisJMHhhMTg0LCAweDFlMDAsIDB4MTU4MCwgMHg2MGUzLCAweDAwMDEsIDB4NjAwYywgMHhjMGI0LCAweDYwMGUsCisJMHgwODBjLCAweDVhZmYsIDB4MDgwYywgMHgyNGIwLCAweDAxNTYsIDB4NjgwMywgMHgwMTAwLCAweDIwYTksCisJMHgwMDE0LCAweDY4MDQsIDB4ZDBkYywgMHgxMTE4LCAweDFmMDQsIDB4NTg4OSwgMHgwMDQ4LCAweDIwYTksCisJMHgwMDE0LCAweDY4MDMsIDB4MDA4MCwgMHg2ODA0LCAweGQwZDQsIDB4MTEzMCwgMHgxZjA0LCAweDU4OTMsCisJMHgwODBjLCAweDViMjAsIDB4MDE1ZSwgMHgwMDc4LCAweDAxNWUsIDB4NzA4ZiwgMHgwMDI4LCAweDAwNTgsCisJMHg3MDhmLCAweDAwMWUsIDB4MDA0MCwgMHg3MDhmLCAweDAwMWQsIDB4MDAyOCwgMHg3MDhmLCAweDAwMjAsCisJMHgwMDEwLCAweDcwOGYsIDB4MDAxZiwgMHgwMDA1LCAweDYwZTMsIDB4MDAwMSwgMHg2MDBjLCAweGMwYjQsCisJMHg2MDBlLCAweDA4MGMsIDB4NWFmZiwgMHgwODBjLCAweDI0YjAsIDB4NjgwMywgMHgwMDgwLCAweDYxMjQsCisJMHhkMWQ0LCAweDExODAsIDB4ZDFkYywgMHgxMTU4LCAweGQxZTQsIDB4MTEzMCwgMHhhMTg0LCAweDFlMDAsCisJMHgxMTU4LCAweDcwOGYsIDB4MDAyOCwgMHgwMDQwLCAweDcwOGYsIDB4MDAxZSwgMHgwMDI4LCAweDcwOGYsCisJMHgwMDFkLCAweDAwMTAsIDB4NzA4ZiwgMHgwMDFmLCAweDAwMDUsIDB4NjgwMywgMHgwMGEwLCAweDYxMjQsCisJMHhkMWRjLCAweDExMzgsIDB4ZDFlNCwgMHgwMTM4LCAweDA4MGMsIDB4MWU0NywgMHg3MDhmLCAweDAwMWUsCisJMHgwMDEwLCAweDcwOGYsIDB4MDAxZCwgMHgwMDA1LCAweDA4MGMsIDB4NTlmNiwgMHg2MTI0LCAweGQxZGMsCisJMHgxMTg4LCAweDA4MGMsIDB4NTk4NCwgMHgwMDE2LCAweDA4MGMsIDB4MWU0NywgMHgwMDFlLCAweGQxZDQsCisJMHgxMTI4LCAweGQxZTQsIDB4MDEzOCwgMHg3MDhmLCAweDAwMWUsIDB4MDAyMCwgMHg3MDhmLCAweDAwMWYsCisJMHgwODBjLCAweDU5ODQsIDB4MDAwNSwgMHg2ODAzLCAweDAwYTAsIDB4NjEyNCwgMHhkMWQ0LCAweDExNjAsCisJMHhkMWNjLCAweDExNTAsIDB4ZDFkYywgMHgxMTI4LCAweGQxZTQsIDB4MDE0MCwgMHg3MDhmLCAweDAwMWUsCisJMHgwMDI4LCAweDcwOGYsIDB4MDAxZCwgMHgwMDEwLCAweDcwOGYsIDB4MDAyMSwgMHgwMDA1LCAweDA4MGMsCisJMHg1OWY2LCAweDYxMjQsIDB4ZDFkNCwgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwgMHhkMWU0LCAweDAxNDAsCisJMHg3MDhmLCAweDAwMWUsIDB4MDAyOCwgMHg3MDhmLCAweDAwMWQsIDB4MDAxMCwgMHg3MDhmLCAweDAwMWYsCisJMHgwMDA1LCAweDY4MDMsIDB4MDA5MCwgMHg2MTI0LCAweGQxZDQsIDB4MTE3OCwgMHhkMWNjLCAweDExNTAsCisJMHhkMWRjLCAweDExMjgsIDB4ZDFlNCwgMHgwMTU4LCAweDcwOGYsIDB4MDAxZSwgMHgwMDQwLCAweDcwOGYsCisJMHgwMDFkLCAweDAwMjgsIDB4NzA4ZiwgMHgwMDIwLCAweDAwMTAsIDB4NzA4ZiwgMHgwMDFmLCAweDAwMDUsCisJMHgwMDE2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDIwNzEsIDB4YjUwMCwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1YWNmLCAweDExZTgsCisJMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhkMWI0LCAweDAxYzAsIDB4YzFiNCwgMHgyMTAyLCAweDYwMjcsCisJMHgwMjAwLCAweGUwMDAsIDB4ZTAwMCwgMHg2MDI0LCAweGQwY2MsIDB4MDE1OCwgMHg2ODAzLCAweDAwYTAsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLCAweDAwMDEsCisJMHgwNDI4LCAweDYwMjgsIDB4YzBjZCwgMHg2MDJhLCAweDA0MDgsIDB4MDgwYywgMHg1YWViLCAweDAxNTAsCisJMHgwODBjLCAweDVhZTEsIDB4MTEzOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyN2MzLCAweDA4MGMsCisJMHg1YWE2LCAweDAwYTAsIDB4MDgwYywgMHg1OWYzLCAweDAxNzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHgyN2MzLCAweDcwOGMsIDB4YTA4NiwgMHgwMDFlLCAweDAxMjAsIDB4NzA4YywgMHhhMDg2LCAweDAwMjIsCisJMHgxMTE4LCAweDcwOGYsIDB4MDAyNSwgMHgwMDEwLCAweDcwOGYsIDB4MDAyMSwgMHgwMTJlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwMjYsIDB4MjAxMSwgMHg1OTk1LCAweDA4MGMsCisJMHg2YTVjLCAweDAwMmUsIDB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MDA2NCwgMHgyMDExLCAweDU5OTUsCisJMHgwODBjLCAweDZhNTMsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGY2LCAweDAwMTYsCisJMHgwODBjLCAweDdkN2EsIDB4MjA3MSwgMHhiNTAwLCAweDA4MGMsIDB4NTkzMCwgMHgwMDFlLCAweDAwZmUsCisJMHgwMGVlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgwMGY2LCAweDAxMjYsIDB4MDgwYywgMHg3ZDdhLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsCisJMHgyMDcxLCAweGI1MDAsIDB4MjA5MSwgMHg4MDAwLCAweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDIwMTEsCisJMHgwMDAzLCAweDA4MGMsIDB4ODA3NSwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsCisJMHg3ZjU5LCAweDA4MGMsIDB4NmExMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDdmZTQsCisJMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweGI0MmYsIDB4MDgwYywgMHhiNDRhLCAweDIwMDEsCisJMHhiNTAwLCAweDIwMDMsIDB4MDAwNCwgMHg2MDI3LCAweDAwMDgsIDB4MDgwYywgMHgxMmRkLCAweDIwMDEsCisJMHgwMDAxLCAweDA4MGMsIDB4MjdjMywgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwODYsCisJMHgwMDA0LCAweDAxNDAsIDB4MjAwMSwgMHhiNzllLCAweDIwMDMsIDB4YWFhYSwgMHgyMDAxLCAweGI3OWYsCisJMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHg2MDIwLCAweGQwOWMsIDB4MDAwNSwgMHg2ODAwLCAweGEwODYsCisJMHgwMGMwLCAweDAxNjAsIDB4NjgwMywgMHgwMGMwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDJkLCAweDFkMDQsCisJMHg1OWZmLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDU5ZmYsIDB4MDE1ZSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweGI1MDAsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwYywgMHhhMTg2LCAweDAwMDAsIDB4MDE1OCwgMHhhMTg2LCAweDAwMDEsCisJMHgwMTU4LCAweGExODYsIDB4MDAwMiwgMHgwMTU4LCAweGExODYsIDB4MDAwMywgMHgwMTU4LCAweDA4MDQsCisJMHg1YTk0LCAweDcwOGYsIDB4MDAyMiwgMHgwMDQwLCAweDcwOGYsIDB4MDAyMSwgMHgwMDI4LCAweDcwOGYsCisJMHgwMDIzLCAweDAwMjAsIDB4NzA4ZiwgMHgwMDI0LCAweDYwNDMsIDB4MDAwMCwgMHg2MGUzLCAweDAwMDAsCisJMHg2ODg3LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4Mjg3MiwgMHgwMDI2LCAweDIwMTEsCisJMHgwMDAzLCAweDA4MGMsIDB4ODA3NSwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg4MDdmLCAweDA4MGMsCisJMHg3ZjU5LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHgwMDNlLCAweDAwMmUsCisJMHg3MDAwLCAweGEwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDYwMmIsIDB4MDAyOCwgMHgwMDEwLCAweDYwMmIsCisJMHgwMDIwLCAweDAxNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjBhOSwgMHgwMDA1LCAweDYwMjQsCisJMHhkMGFjLCAweDAxMjAsIDB4MDEyZSwgMHgwMTVlLCAweDA4MDQsIDB4NWFhMiwgMHg2ODAwLCAweGEwODQsCisJMHgwMGEwLCAweGMwYmQsIDB4NjgwMiwgMHg2OTA0LCAweGQxZDQsIDB4MTEzMCwgMHg2ODAzLCAweDAxMDAsCisJMHgxZjA0LCAweDVhNTcsIDB4MDgwYywgMHg1YjIwLCAweDAxMmUsIDB4MDE1ZSwgMHgwODBjLCAweDVhZTEsCisJMHgwMWE4LCAweDYwNDQsIDB4YTAwNSwgMHgwMTY4LCAweDYwNTAsIDB4MDAwNiwgMHhhMDg1LCAweDAwMjAsCisJMHg2MDUyLCAweDA4MGMsIDB4NWIyMCwgMHhhMDA2LCAweDgwMDEsIDB4MWRmMCwgMHgwMDBlLCAweDYwNTIsCisJMHgwMDI4LCAweDY4MDQsIDB4ZDBkNCwgMHgxMTEwLCAweDA4MGMsIDB4NWIyMCwgMHgwMDE2LCAweDAwMjYsCisJMHgyMDA5LCAweDAwYzgsIDB4MjAxMSwgMHg1OWEyLCAweDA4MGMsIDB4NmEyMiwgMHgwMDJlLCAweDAwMWUsCisJMHgyMDAxLCAweGI3OWYsIDB4MjAwMywgMHgwMDA0LCAweDA4MGMsIDB4NTdlMSwgMHgwODBjLCAweDVhZTEsCisJMHgwMTQ4LCAweDY4MDQsIDB4ZDBkNCwgMHgxMTMwLCAweGQwZGMsIDB4MTEwMCwgMHgyMDAxLCAweGI3OWYsCisJMHgyMDAzLCAweDAwMDAsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHhiNTAwLCAweDIwMDEsCisJMHhiNzllLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweGI3OGYsIDB4MjAwMywgMHgwMDAwLCAweDcwOGYsCisJMHgwMDAwLCAweDYwZTMsIDB4MDAwMCwgMHg2ODg3LCAweDAwMDAsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsCisJMHgyODcyLCAweDY4MDMsIDB4MDAwMCwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDYwMjcsCisJMHhmZmZmLCAweDYwMmIsIDB4MTgyZiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMDYsCisJMHgyMDAxLCAweGI3OWUsIDB4MjAwNCwgMHhhMDg2LCAweGFhYWEsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsCisJMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhhMDg0LCAweDAwMzAsIDB4YTA4NiwgMHgwMDAwLCAweDAwMGUsCisJMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHhiNTcyLCAweDIwMDQsIDB4YTA4NCwgMHgwMDMwLCAweGEwODYsCisJMHgwMDMwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGEwODQsCisJMHgwMDMwLCAweGEwODYsIDB4MDAxMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweGI1NzIsCisJMHgyMDA0LCAweGEwODQsIDB4MDAzMCwgMHhhMDg2LCAweDAwMjAsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDEsCisJMHhiNTBjLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTcwLCAweDA4MGMsIDB4Mjg5MiwgMHgwMDM2LCAweDAwMTYsCisJMHgyMDA5LCAweDAwMDAsIDB4MjAxOSwgMHgwMDI4LCAweDA4MGMsIDB4MmM2ZiwgMHgwMDFlLCAweDAwM2UsCisJMHhhMDA2LCAweDAwMDksIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YjUwYywgMHgyZTA0LCAweDAxMTgsCisJMHhhMDg1LCAweDAwMTAsIDB4MDAxMCwgMHhhMDg0LCAweGZmZWYsIDB4MjA3MiwgMHgwMGVlLCAweDAwMDUsCisJMHg2MDUwLCAweDAwMDYsIDB4NjBmMCwgMHgwMDA2LCAweDYwZWMsIDB4MDAwNiwgMHg2MDBjLCAweDAwMDYsCisJMHg2MDA0LCAweDAwMDYsIDB4NjAyOCwgMHgwMDA2LCAweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsCisJMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwMGUsIDB4NjAyYSwgMHgwMDBlLCAweDYwMDYsCisJMHgwMDBlLCAweDYwMGUsIDB4MDAwZSwgMHg2MGVlLCAweDAwMGUsIDB4NjBmMiwgMHg2MGUzLCAweDAwMDAsCisJMHg2ODg3LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4Mjg3MiwgMHg2ODAwLCAweGEwODQsCisJMHgwMGEwLCAweGMwYmQsIDB4NjgwMiwgMHg2ODAzLCAweDAwYTAsIDB4MDAwZSwgMHg2MDUyLCAweDYwNTAsCisJMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4YjUwMCwgMHg2MDIwLCAweGEwODQsCisJMHgwMDgwLCAweDAxMzgsIDB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4YzFiZCwgMHgyMTAyLCAweDA4MDQsCisJMHg1YmM5LCAweDIwMDEsIDB4YjUwYywgMHgyMDBjLCAweGMxYmMsIDB4MjEwMiwgMHg2MDI4LCAweGEwODQsCisJMHhlMWZmLCAweDYwMmEsIDB4NjAyNywgMHgwMjAwLCAweDY4MDMsIDB4MDA5MCwgMHgyMGE5LCAweDAzODQsCisJMHg2MDI0LCAweGQwY2MsIDB4MTUwOCwgMHgxZDA0LCAweDViNzgsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsCisJMHg1Yjc4LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDgwNzUsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsCisJMHg4MDdmLCAweDA4MGMsIDB4N2Y1OSwgMHgyMDE5LCAweDAwMDAsIDB4MDgwYywgMHg3ZmU0LCAweDY4MDMsCisJMHgwMGEwLCAweDIwMDEsIDB4Yjc5ZiwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDMsCisJMHgwMDAxLCAweGEwODUsIDB4MDAwMSwgMHgwNDY4LCAweDg2ZmYsIDB4MTEyMCwgMHgwODBjLCAweDFlNDcsCisJMHgwODBjLCAweDI0YjAsIDB4NjBlMywgMHgwMDAwLCAweDIwMDEsIDB4Yjc4ZiwgMHgyMDA0LCAweDA4MGMsCisJMHgyODcyLCAweDYwZTIsIDB4NjgwMywgMHgwMDgwLCAweDIwYTksIDB4MDM4NCwgMHg2MDI3LCAweDFlMDAsCisJMHgyMDA5LCAweDFlMDAsIDB4ZTAwMCwgMHg2MDI0LCAweGExMGMsIDB4MDEzOCwgMHgxZDA0LCAweDViYWUsCisJMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1YmFlLCAweDA4MjAsIDB4NjAyOCwgMHhhMDg1LCAweDFlMDAsCisJMHg2MDJhLCAweDcwYTQsIDB4YTAwNSwgMHgxMTE4LCAweDY4ODcsIDB4MDAwMSwgMHgwMDA4LCAweDY4ODYsCisJMHhhMDA2LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsCisJMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhiNTAwLCAweDIwNjksIDB4MDE0MCwgMHg2MDIwLCAweGEwODQsCisJMHgwMGMwLCAweDAxMjAsIDB4Njg4NCwgMHhhMDA1LCAweDE5MDQsIDB4NWMyNSwgMHg2ODAzLCAweDAwODgsCisJMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDI4NzIsCisJMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHhhMDA1LCAweDExMTgsIDB4NjgwOCwgMHhhMDA1LCAweDAxYzAsCisJMHg2MDI4LCAweGEwODQsIDB4ZmJmZiwgMHg2MDJhLCAweDYwMjcsIDB4MDQwMCwgMHgyMDY5LCAweGI3YzUsCisJMHg3MDAwLCAweDIwNmEsIDB4NzA4ZiwgMHgwMDI2LCAweDcwMDMsIDB4MDAwMSwgMHgyMGE5LCAweDAwMDIsCisJMHgxZDA0LCAweDVjMDgsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NWMwOCwgMHgwODA0LCAweDVjNTYsCisJMHgyMDY5LCAweDAxNDAsIDB4MjBhOSwgMHgwMzg0LCAweDYwMjcsIDB4MWUwMCwgMHgyMDA5LCAweDFlMDAsCisJMHhlMDAwLCAweDYwMjQsIDB4YTEwYywgMHgwNTIwLCAweGEwODQsIDB4MWEwMCwgMHgxNTA4LCAweDFkMDQsCisJMHg1YzE0LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDVjMTQsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsCisJMHg4MDc1LCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3ZjU5LCAweDIwMTksCisJMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHg2ODAzLCAweDAwYTAsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsCisJMHgwMDAxLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDAwYjAsCisJMHgwODBjLCAweDI0YjAsIDB4NjgwMywgMHgwMDgwLCAweDIwNjksIDB4MDE0MCwgMHg2MGUzLCAweDAwMDAsCisJMHg3MGE0LCAweGEwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LCAweDIwMDEsCisJMHhiNzhmLCAweDIwMDQsIDB4MDgwYywgMHgyODcyLCAweDYwZTIsIDB4YTAwNiwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsCisJMHhiNTAwLCAweDYwMjAsIDB4YTA4NCwgMHgwMGMwLCAweDAxZTAsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsCisJMHg4MDc1LCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3ZjU5LCAweDIwMTksCisJMHgwMDAwLCAweDA4MGMsIDB4N2ZlNCwgMHgyMDY5LCAweDAxNDAsIDB4NjgwMywgMHgwMGEwLCAweDIwMDEsCisJMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MDQsCisJMHg1Y2ZiLCAweDIwMDEsIDB4YjUwYywgMHgyMDBjLCAweGQxYjQsIDB4MTE2MCwgMHhjMWI1LCAweDIxMDIsCisJMHgwODBjLCAweDU5OGEsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4MjRiMCwgMHg2ODAzLCAweDAwODAsCisJMHg2MGUzLCAweDAwMDAsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4YTAwNSwgMHgxMTE4LCAweDY4MDgsCisJMHhhMDA1LCAweDAxYzAsIDB4NjAyOCwgMHhhMDg0LCAweGZkZmYsIDB4NjAyYSwgMHg2MDI3LCAweDAyMDAsCisJMHgyMDY5LCAweGI3YzUsIDB4NzAwMCwgMHgyMDZhLCAweDcwOGYsIDB4MDAyNywgMHg3MDAzLCAweDAwMDEsCisJMHgyMGE5LCAweDAwMDIsIDB4MWQwNCwgMHg1Y2IyLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDVjYjIsCisJMHgwODA0LCAweDVjZmIsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwgMHhlMDAwLCAweDYwMjQsCisJMHhhMTBjLCAweDAxYzgsIDB4YTA4NCwgMHgxYzAwLCAweDExYjAsIDB4MWQwNCwgMHg1Y2JhLCAweDAwMDYsCisJMHgwMDE2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDA4MGMsIDB4NjhmOSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMGU2LCAweDIwNzEsIDB4YjdmMywgMHg3MDE4LCAweDAwZWUsCisJMHhhMDA1LCAweDFkMDAsIDB4MDUwMCwgMHgwMDI2LCAweDIwMTEsIDB4NTlhMiwgMHgwODBjLCAweDY5OWMsCisJMHgyMDExLCAweDU5OTUsIDB4MDgwYywgMHg2YTVjLCAweDAwMmUsIDB4MjA2OSwgMHgwMTQwLCAweDYwZTMsCisJMHgwMDAwLCAweDcwYTQsIDB4YTAwNSwgMHgxMTE4LCAweDY4ODcsIDB4MDAwMSwgMHgwMDA4LCAweDY4ODYsCisJMHgyMDAxLCAweGI3OGYsIDB4MjAwNCwgMHgwODBjLCAweDI4NzIsIDB4NjBlMiwgMHgyMDAxLCAweGI1MGMsCisJMHgyMDBjLCAweGMxYjQsIDB4MjEwMiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsCisJMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsCisJMHgwMGM2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4YjUwMCwgMHg3MTMwLCAweGQxODQsCisJMHgxMTgwLCAweDIwMTEsIDB4YjU1MywgMHgyMjE0LCAweGQyZWMsIDB4MDEzOCwgMHhjMThkLCAweDcxMzIsCisJMHgyMDExLCAweGI1NTMsIDB4MjIxNCwgMHhkMmFjLCAweDExMjAsIDB4NzAzMCwgMHhkMDhjLCAweDA5MDQsCisJMHg1ZDY4LCAweDcxMzAsIDB4YzE4NSwgMHg3MTMyLCAweDIwMTEsIDB4YjU1MywgMHgyMjBjLCAweGQxYTQsCisJMHgwNTMwLCAweDAwMTYsIDB4MjAxOSwgMHgwMDBlLCAweDA4MGMsIDB4YjA2NSwgMHgwMTU2LCAweDIwYTksCisJMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHhhMTg2LCAweDAwN2UsIDB4MDFhMCwgMHhhMTg2LCAweDAwODAsCisJMHgwMTg4LCAweDA4MGMsIDB4NGZhOSwgMHgxMTcwLCAweDgxMjcsIDB4YTAwNiwgMHgwMDE2LCAweDIwMDksCisJMHgwMDBlLCAweDA4MGMsIDB4YjBlOCwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsCisJMHg2YjFhLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDVkMzMsIDB4MDE1ZSwgMHgwMDFlLCAweGQxYWMsCisJMHgxMTQ4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweDJjNmYsCisJMHgwMDFlLCAweDAwNzAsIDB4MDE1NiwgMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsCisJMHg0ZmE5LCAweDExMTAsIDB4MDgwYywgMHg0YzBiLCAweDgxMDgsIDB4MWYwNCwgMHg1ZDVmLCAweDAxNWUsCisJMHgwODBjLCAweDFlNDcsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4ODA3NSwgMHgyMDExLCAweDAwMDIsCisJMHgwODBjLCAweDgwN2YsIDB4MDgwYywgMHg3ZjU5LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3ZmU0LCAweDAwM2UsIDB4NjBlMywgMHgwMDAwLCAweDIwMDEsIDB4YjUwMCwgMHgyMDAzLCAweDAwMDEsCisJMHgwODBjLCAweDVhMDcsIDB4MDBlZSwgMHgwMGNlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweDAwMDUsIDB4MjA3MSwgMHhiNWUyLCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDAsCisJMHg3MDBmLCAweDAwMDAsIDB4NzAyYiwgMHgwMDAxLCAweDcwNGYsIDB4MDAwMCwgMHg3MDUzLCAweDAwMDEsCisJMHg3MDVmLCAweDAwMjAsIDB4NzA2MywgMHgwMDQwLCAweDcwODMsIDB4MDAwMCwgMHg3MDhiLCAweDAwMDAsCisJMHg3MDhmLCAweDAwMDEsIDB4NzBiZiwgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI1ZTIsCisJMHg2ODQ4LCAweGEwMDUsIDB4MTEzMCwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHhhMDg1LCAweDAwMDEsCisJMHgwNDI4LCAweDZhNTAsIDB4NzIzNiwgMHg2YjU0LCAweDczM2EsIDB4Njg1OCwgMHg3MDNlLCAweDcwN2EsCisJMHg2ODVjLCAweDcwNDIsIDB4NzA3ZSwgMHg2ODQ4LCAweDcwMmUsIDB4Njg0MCwgMHg3MDMyLCAweDIwMDksCisJMHgwMDBjLCAweDIwMGEsIDB4ODAwNywgMHg4MDA2LCAweDgwMDYsIDB4YTA4YywgMHgwMDNmLCAweGEwODQsCisJMHhmZmMwLCAweGEyMTAsIDB4MjEwMCwgMHhhMzE5LCAweDcyNzIsIDB4NzM3NiwgMHg3MDI4LCAweGMwODQsCisJMHg3MDJhLCAweDcwMDcsIDB4MDAwMSwgMHg3MDBmLCAweDAwMDAsIDB4YTAwNiwgMHgwMGVlLCAweDAwMDUsCisJMHgyYjc4LCAweDIwNzEsIDB4YjVlMiwgMHg3MDA0LCAweDAwNDMsIDB4NzAwYywgMHgwMDAyLCAweDVkZTQsCisJMHg1ZGRiLCAweDVkZGIsIDB4NWRkYiwgMHg1ZGRiLCAweDAwMDUsIDB4NWUzYSwgMHg1ZTNiLCAweDVlNmQsCisJMHg1ZTZlLCAweDVlMzgsIDB4NWViYywgMHg1ZWMxLCAweDVlZjIsIDB4NWVmMywgMHg1ZjBlLCAweDVmMGYsCisJMHg1ZjEwLCAweDVmMTEsIDB4NWYxMiwgMHg1ZjEzLCAweDVmYzksIDB4NWZmMCwgMHg3MDBjLCAweDAwMDIsCisJMHg1ZGZkLCAweDVlMzgsIDB4NWUzOCwgMHg1ZTM5LCAweDVlMzksIDB4NzgzMCwgMHg3OTMwLCAweGExMDYsCisJMHgwMTIwLCAweDc4MzAsIDB4NzkzMCwgMHhhMTA2LCAweDE1MTAsIDB4NzAzMCwgMHhhMTBhLCAweDAxZjgsCisJMHgxMjEwLCAweDcxMmMsIDB4YTEwYSwgMHhhMThhLCAweDAwMDIsIDB4MTJkMCwgMHgwODBjLCAweDE1ZGYsCisJMHgwMWIwLCAweDJkMDAsIDB4NzA1YSwgMHg3MDYzLCAweDAwNDAsIDB4MjAwMSwgMHgwMDAzLCAweDcwNTcsCisJMHgwMDAwLCAweDAxMjYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHhiODEyLCAweDIxMDQsCisJMHhjMDg1LCAweDIwMGEsIDB4MDAwZSwgMHg3MDBlLCAweDAxMmUsIDB4MDgwYywgMHgxNjVmLCAweDAwMDUsCisJMHgwODBjLCAweDE1ZGYsIDB4MGRlMCwgMHgyZDAwLCAweDcwNWEsIDB4MDgwYywgMHgxNWRmLCAweDExMDgsCisJMHgwYzEwLCAweDJkMDAsIDB4NzA4NiwgMHg3MDYzLCAweDAwODAsIDB4MjAwMSwgMHgwMDA0LCAweDA4ZjgsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3MDBjLCAweDAwMDIsIDB4NWU0MiwgMHg1ZTQ1LCAweDVlNTMsCisJMHg1ZTZjLCAweDVlNmMsIDB4MDgwYywgMHg1ZGY2LCAweDAwMDUsIDB4MDEyNiwgMHg4MDAxLCAweDcwMGUsCisJMHg3MDU4LCAweDAwMDYsIDB4MDgwYywgMHg2MzQzLCAweDAxMjAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg1ZGY2LCAweDAwZGUsIDB4MDA0OCwgMHgwMTI2LCAweDgwMDEsIDB4NzAwZSwgMHgwODBjLCAweDYzNDMsCisJMHg3MDU4LCAweDIwNjgsIDB4NzA4NCwgMHg3MDVhLCAweDY4MDMsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsCisJMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwM2EsIDB4MTIxOCwgMHgwMGRiLCAweDAxMmUsCisJMHgwMDA1LCAweDAxMmUsIDB4MDgwYywgMHg1ZjE0LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweGI1ZTIsIDB4NzAwYywgMHgwMDAyLCAweDVlNzksIDB4NWU3OSwgMHg1ZTc5LCAweDVlN2IsCisJMHg1ZTdlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDBmLCAweDAwMDEsIDB4MDAxMCwgMHg3MDBmLCAweDAwMDIsCisJMHgwMGVlLCAweDAwMDUsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMzAsIDB4NWYxNCwgMHg2MGFkLCAweDVmMTQsCisJMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMzAsIDB4NjBlZiwgMHg2MTMyLCAweDYxN2IsCisJMHg2MThmLCAweDVmMTQsIDB4NWYxNCwgMHg1ZjRjLCAweDVmMzAsIDB4NWYxNCwgMHg1ZjE0LCAweDVmYTYsCisJMHg2MjNiLCAweDYyNTYsIDB4NWYxNCwgMHg1ZjRjLCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsCisJMHg1ZjljLCAweDYyNTYsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsCisJMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjYwLCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsCisJMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NjM2MSwgMHg1ZjE0LCAweDVmMTQsCisJMHg1ZjE0LCAweDVmMTQsIDB4NWYxNCwgMHg1Zjc1LCAweDcwMjAsIDB4MjA2OCwgMHgwODBjLCAweDE2MGYsCisJMHgwMDA1LCAweDcwMGMsIDB4MDAwMiwgMHg1ZWM4LCAweDVlY2IsIDB4NWVkOSwgMHg1ZWYxLCAweDVlZjEsCisJMHgwODBjLCAweDVkZjYsIDB4MDAwNSwgMHgwMTI2LCAweDgwMDEsIDB4NzAwZSwgMHg3MDU4LCAweDAwMDYsCisJMHgwODBjLCAweDYzNDMsIDB4MDEyMCwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1ZGY2LCAweDAwZGUsCisJMHgwMDQ4LCAweDAxMjYsIDB4ODAwMSwgMHg3MDBlLCAweDA4MGMsIDB4NjM0MywgMHg3MDU4LCAweDIwNjgsCisJMHg3MDg0LCAweDcwNWEsIDB4NjgwMywgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHg2ODM0LCAweGEwODQsCisJMHgwMGZmLCAweGEwOGEsIDB4MDAxYSwgMHgxMjE4LCAweDAwM2IsIDB4MDEyZSwgMHgwMDA1LCAweDAxMmUsCisJMHgwNDE5LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDVmMTQsIDB4NWYzMCwgMHg2MDk5LCAweDVmMTQsCisJMHg1ZjMwLCAweDVmMTQsIDB4NWYzMCwgMHg1ZjMwLCAweDVmMTQsIDB4NWYzMCwgMHg2MDk5LCAweDVmMzAsCisJMHg1ZjMwLCAweDVmMzAsIDB4NWYzMCwgMHg1ZjMwLCAweDVmMTQsIDB4NWYzMCwgMHg2MDk5LCAweDVmMTQsCisJMHg1ZjE0LCAweDVmMzAsIDB4NWYxNCwgMHg1ZjE0LCAweDVmMTQsIDB4NWYzMCwgMHgwMDA1LCAweDAwMDUsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsCisJMHgwMGZmLCAweGMwZDUsIDB4NjgzYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU0MDgsCisJMHgwMTJlLCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZTUsCisJMHg2ODNhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwMTJlLCAweDAwMDUsCisJMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4YzBlZCwgMHg2ODNhLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsIDB4MDAwNSwgMHg3MDA3LCAweDAwMDEsCisJMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGRkLCAweDY4M2EsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDU0MDgsIDB4MDEyZSwgMHgwMDA1LCAweDY4MzQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsCisJMHgwOTg4LCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg2MDU5LCAweDcwMDcsCisJMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg2MDU5LCAweDAwMDUsCisJMHg2ODM0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDA5MDQsIDB4NWYyMiwgMHg4MDAxLCAweDExMjAsCisJMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg2MDc2LCAweDcwMDcsIDB4MDAwNiwgMHg3MDEyLCAweDJkMDAsCisJMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg2MDc2LCAweDAwMDUsIDB4NjgzNCwgMHg4MDA3LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwMSwgMHgxOTA0LCAweDVmMjIsIDB4NzAwNywgMHgwMDAxLCAweDIwMDksCisJMHhiNTMxLCAweDIxMGMsIDB4ODFmZiwgMHgxMWE4LCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweDY4M2EsCisJMHg2ODUzLCAweDAwMDAsIDB4MDgwYywgMHg0ZDgyLCAweDExMDgsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDY4MzcsIDB4MDEzOSwgMHg2ODRhLCAweDY5NTIsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsCisJMHgwY2EwLCAweDIwMDEsIDB4MDAyOCwgMHgwYzkwLCAweDY4NGMsIDB4YTA4NCwgMHgwMGMwLCAweGEwODYsCisJMHgwMGMwLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4NjI2ZSwgMHgyZDAwLCAweDcwMTYsCisJMHg3MDFhLCAweDIwYTksIDB4MDAwNCwgMHhhMDgwLCAweDAwMjQsIDB4MjA5OCwgMHgyMGExLCAweGI2MGQsCisJMHg1M2EzLCAweDY4NTgsIDB4NzAxMiwgMHhhMDgyLCAweDA0MDEsIDB4MWEwNCwgMHg1ZjNlLCAweDZhODQsCisJMHhhMjhhLCAweDAwMDIsIDB4MWEwNCwgMHg1ZjNlLCAweDgyZmYsIDB4MTEzOCwgMHg2ODg4LCAweDY5OGMsCisJMHhhMTA1LCAweDAxMTgsIDB4MjAwMSwgMHg2MDJjLCAweDAwMTgsIDB4YTI4MCwgMHg2MDIyLCAweDIwMDUsCisJMHg3MGM2LCAweDcwMTAsIDB4YTAxNSwgMHgwOTA0LCAweDYwMGUsIDB4MDgwYywgMHgxNWRmLCAweDExMTgsCisJMHg3MDA3LCAweDAwMGYsIDB4MDAwNSwgMHgyZDAwLCAweDcwMjIsIDB4NzBjNCwgMHgyMDYwLCAweDJjMDUsCisJMHg2ODM2LCAweGUwMDQsIDB4YWQwMCwgMHg3MDk2LCAweGUwMDgsIDB4YTIwYSwgMHgxMjEwLCAweGEwMGUsCisJMHgyMjAwLCAweDcxMTIsIDB4ZTIwYywgMHg4MDAzLCAweDgwMGIsIDB4YTI5NiwgMHgwMDA0LCAweDAxMDgsCisJMHhhMTA4LCAweDcxOWEsIDB4ODEwYiwgMHg3MTllLCAweGFlOTAsIDB4MDAyMiwgMHgwODBjLCAweDE2NDMsCisJMHg3MDkwLCAweGEwOGUsIDB4MDEwMCwgMHgwMTcwLCAweGEwODYsIDB4MDIwMCwgMHgwMTE4LCAweDcwMDcsCisJMHgwMDEwLCAweDAwMDUsIDB4NzAyMCwgMHgyMDY4LCAweDA4MGMsIDB4MTYwZiwgMHg3MDE0LCAweDIwNjgsCisJMHgwODA0LCAweDVmM2UsIDB4NzAyMCwgMHgyMDY4LCAweDcwMTgsIDB4NjgwMiwgMHg2ODA3LCAweDAwMDAsCisJMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwgMHg3MTFhLCAweDA4MDQsIDB4NWZjOSwgMHg3MDE0LCAweDIwNjgsCisJMHg3MDA3LCAweDAwMDEsIDB4Njg4NCwgMHhhMDA1LCAweDExMjgsIDB4Njg4OCwgMHg2OThjLCAweGExMDUsCisJMHgwMTA4LCAweDAwYjEsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDA5MDQsCisJMHg2MjZlLCAweDA0YjgsIDB4NjAyNCwgMHg2MDI4LCAweDAwMDIsIDB4MDAxMSwgMHgwMDA3LCAweDAwMDQsCisJMHgwMDBhLCAweDAwMGYsIDB4MDAwNSwgMHgwMDA2LCAweDAwMGEsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDQsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNjYsIDB4NmY4OCwgMHg2ZThjLCAweDY4MDQsCisJMHgyMDYwLCAweGFjZjAsIDB4MDAyMSwgMHhhY2Y4LCAweDAwMjcsIDB4MjAwOSwgMHgwMDA1LCAweDcwMGMsCisJMHg3ODE2LCAweDcwMDgsIDB4NzgxMiwgMHg3MDA0LCAweDc4MDYsIDB4NzAwMCwgMHg3ODAyLCAweDdlMGUsCisJMHg3ZjBhLCAweDgxMDksIDB4MDEyOCwgMHhhZWYyLCAweDAwMDQsIDB4YWZmYSwgMHgwMDA2LCAweDBjNzgsCisJMHg2MDA0LCAweGEwNjUsIDB4MWQzMCwgMHgwMDZlLCAweDAwN2UsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweDIwMDksIDB4YjUzMSwgMHgyMTBjLCAweDgxZmYsIDB4MTE5OCwgMHg2ODM4LCAweGEwODQsCisJMHgwMGZmLCAweDY4M2EsIDB4MDgwYywgMHg0YzY0LCAweDExMDgsIDB4MDAwNSwgMHgwODBjLCAweDU0ZGIsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDllY2MsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsCisJMHgwY2EwLCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MGM4MCwgMHgyMDA5LCAweGI1MzEsCisJMHgyMTBjLCAweDgxZmYsIDB4MTFiMCwgMHg2ODU4LCAweGEwMDUsIDB4MDFjMCwgMHg2ODM4LCAweGEwODQsCisJMHgwMGZmLCAweDY4M2EsIDB4Njg1MywgMHgwMDAwLCAweDA4MGMsIDB4NGQyNiwgMHgxMTA4LCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2ODRhLCAweDY5NTIsIDB4MDgwYywgMHg1NDA4LCAweDAxMmUsCisJMHgwY2IwLCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MGM5MCwgMHgyMDAxLCAweDAwMDAsCisJMHgwYzc4LCAweDcwMTgsIDB4NjgwMiwgMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwgMHg3MTFhLCAweDcwMTAsCisJMHg4MDAxLCAweDcwMTIsIDB4MDExOCwgMHg3MDA3LCAweDAwMDYsIDB4MDAzMCwgMHg3MDE0LCAweDIwNjgsCisJMHg3MDA3LCAweDAwMDEsIDB4NzA0OCwgMHgwODBmLCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLCAweDY5NDQsCisJMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHg2ODQ4LCAweGEwODQsIDB4MDBmZiwgMHgyMGE5LCAweDAwMDEsCisJMHhhMDk2LCAweDAwMDEsIDB4MDFiMCwgMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwMGZmLCAweGEwOTYsCisJMHgwMDAyLCAweDAxNzgsIDB4YTAwNSwgMHgxMWYwLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsCisJMHgwODBjLCAweDRmYTksIDB4MTFiOCwgMHgwMDY2LCAweDZlNTAsIDB4MDgwYywgMHg1MGE4LCAweDAwNmUsCisJMHgwMDg4LCAweDAwNDYsIDB4MjAxMSwgMHhiNTBjLCAweDIyMjQsIDB4YzQ4NCwgMHgyNDEyLCAweDAwNGUsCisJMHgwMGM2LCAweDA4MGMsIDB4NGZhOSwgMHgxMTEwLCAweDA4MGMsIDB4NTIwOSwgMHg4MTA4LCAweDFmMDQsCisJMHg2MGQ5LCAweDAwY2UsIDB4Njg0YywgMHhkMDg0LCAweDExMTgsIDB4MDgwYywgMHgxNjBmLCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYTQsCisJMHgwNTgwLCAweDIwNjEsIDB4Yjg3NCwgMHg2MTAwLCAweGQxODQsIDB4MDE3OCwgMHg2ODU4LCAweGEwODQsCisJMHgwMGZmLCAweDE1NTAsIDB4NjAwMCwgMHhkMDg0LCAweDA1MjAsIDB4NjAwNCwgMHhhMDA1LCAweDE1MzgsCisJMHg2MDAzLCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLCAweDAwYzgsIDB4MjAxMSwgMHgwMDAxLCAweDY4NjAsCisJMHhhMDA1LCAweDExMTAsIDB4MjAwMSwgMHgwMDFlLCAweDgwMDAsIDB4NjAxNiwgMHg2ODU4LCAweGEwODQsCisJMHgwMGZmLCAweDAxNzgsIDB4NjAwNiwgMHg2ODU4LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAxNDgsCisJMHg2MDBhLCAweDY4NTgsIDB4ODAwMCwgMHgxMTA4LCAweGMyOGQsIDB4NjIwMiwgMHgwMTJlLCAweDA4MDQsCisJMHg2MzMyLCAweDAxMmUsIDB4MDgwNCwgMHg2MzJjLCAweDAxMmUsIDB4MDgwNCwgMHg2MzI2LCAweDAxMmUsCisJMHgwODA0LCAweDYzMjksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsCisJMHhiNTUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwNWUwLCAweDIwNjEsIDB4Yjg3NCwgMHg2MDAwLCAweGQwODQsCisJMHgwNWI4LCAweDYyMDQsIDB4NjMwOCwgMHhkMDhjLCAweDE1MzAsIDB4NmM0OCwgMHhhNDg0LCAweDAwMDMsCisJMHgwMTcwLCAweDY5NTgsIDB4YTE4YywgMHgwMGZmLCAweDgwMDEsIDB4MTEyMCwgMHgyMTAwLCAweGEyMTAsCisJMHgwNjIwLCAweDAwMjgsIDB4ODAwMSwgMHgxNTA4LCAweDIxMDAsIDB4YTIxMiwgMHgwMmYwLCAweGE0ODQsCisJMHgwMDBjLCAweDAxODgsIDB4Njk1OCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDQsCisJMHgxMTIwLCAweDIxMDAsIDB4YTMxOCwgMHgwMjg4LCAweDAwMzAsIDB4YTA4MiwgMHgwMDA0LCAweDExNjgsCisJMHgyMTAwLCAweGEzMWEsIDB4MDI1MCwgMHg2ODYwLCAweGEwMDUsIDB4MDExMCwgMHg4MDAwLCAweDYwMTYsCisJMHg2MjA2LCAweDYzMGEsIDB4MDEyZSwgMHgwODA0LCAweDYzMzIsIDB4MDEyZSwgMHgwODA0LCAweDYzMmYsCisJMHgwMTJlLCAweDA4MDQsIDB4NjMyYywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsCisJMHgyMDYxLCAweGI4NzQsIDB4NjMwMCwgMHhkMzhjLCAweDExMjAsIDB4NjMwOCwgMHg4MzE4LCAweDAyMjAsCisJMHg2MzBhLCAweDAxMmUsIDB4MDgwNCwgMHg2MzQwLCAweDAxMmUsIDB4MDgwNCwgMHg2MzJmLCAweDAxMjYsCisJMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4Njg0YywgMHhkMGFjLCAweDAxNDgsCisJMHgwMGM2LCAweDIwNjEsIDB4Yjg3NCwgMHg2MDAwLCAweGEwODQsIDB4ZmNmZiwgMHg2MDAyLCAweDAwY2UsCisJMHgwNDQ4LCAweDY4NTgsIDB4YTAwNSwgMHgwNWQwLCAweDY4NWMsIDB4YTA2NSwgMHgwNTk4LCAweDIwMDEsCisJMHhiNTMxLCAweDIwMDQsIDB4YTAwNSwgMHgwMTE4LCAweDA4MGMsIDB4OWUxZCwgMHgwMDY4LCAweDYwMTMsCisJMHgwNDAwLCAweDYwNTcsIDB4MDAwMCwgMHg2OTRjLCAweGQxYTQsIDB4MDExMCwgMHg2OTUwLCAweDYxNTYsCisJMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHg4NjRjLCAweDY5NTgsIDB4YTE4YywgMHhmZjAwLCAweGExODYsCisJMHgyMDAwLCAweDExNDAsIDB4MDAyNiwgMHgyMDA5LCAweDAwMDAsIDB4MjAxMSwgMHhmZGZmLCAweDA4MGMsCisJMHg2YjFhLCAweDAwMmUsIDB4Njg0YywgMHhkMGM0LCAweDAxNDgsIDB4MjA2MSwgMHhiODc0LCAweDYwMDAsCisJMHhkMDhjLCAweDExMjAsIDB4NjAwOCwgMHg4MDAwLCAweDAyMDgsIDB4NjAwYSwgMHgwMGNlLCAweDAxMmUsCisJMHgwODA0LCAweDYzMzIsIDB4MDBjZSwgMHgwMTJlLCAweDA4MDQsIDB4NjMyYywgMHg2OTU0LCAweGExODYsCisJMHgwMDJlLCAweDBkNDAsIDB4YTE4NiwgMHgwMDJkLCAweDBkMjgsIDB4YTE4NiwgMHgwMDQ1LCAweDA1MjgsCisJMHhhMTg2LCAweDAwMmEsIDB4MTEzMCwgMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsCisJMHgwOGM4LCAweGExODYsIDB4MDAyMCwgMHgwMTcwLCAweGExODYsIDB4MDAyOSwgMHgxZDE4LCAweDY5NDQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwODBjLCAweDRmYTksIDB4MTk2MCwgMHg2MDAwLCAweGMwZTQsCisJMHg2MDAyLCAweDA4NDAsIDB4Njg1YywgMHhhMDY1LCAweDA5YTgsIDB4NjAwNywgMHgwMDI0LCAweDIwMDEsCisJMHhiN2I2LCAweDIwMDQsIDB4NjAxNiwgMHgwODA0LCAweDYxY2EsIDB4Njg1YywgMHhhMDY1LCAweDA5NTAsCisJMHgwMGU2LCAweDY4NjAsIDB4YTA3NSwgMHgyMDAxLCAweGI1MzEsIDB4MjAwNCwgMHhhMDA1LCAweDAxNTAsCisJMHgwODBjLCAweDllMWQsIDB4OGVmZiwgMHgwMTE4LCAweDJlNjAsIDB4MDgwYywgMHg5ZTFkLCAweDAwZWUsCisJMHgwODA0LCAweDYxY2EsIDB4NjAyMCwgMHhjMGRjLCAweGMwZDUsIDB4NjAyMiwgMHgyZTYwLCAweDYwMDcsCisJMHgwMDNhLCAweDY4NzAsIDB4YTAwNSwgMHgwMTMwLCAweDYwMDcsIDB4MDAzYiwgMHg2ODc0LCAweDYwMmEsCisJMHg2ODc4LCAweDYwMTIsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsCisJMHgwMGVlLCAweDA4MDQsIDB4NjFjYSwgMHgyMDYxLCAweGI4NzQsIDB4NjAwMCwgMHhkMDg0LCAweDAxOTAsCisJMHhkMDhjLCAweDE5MDQsIDB4NjM0MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjA0LCAweDgyMTAsCisJMHgwMjIwLCAweDYyMDYsIDB4MDEyZSwgMHgwODA0LCAweDYzNDAsIDB4MDEyZSwgMHg2ODUzLCAweDAwMTYsCisJMHgwODA0LCAweDYzMzksIDB4Njg1MywgMHgwMDA3LCAweDA4MDQsIDB4NjMzOSwgMHg2ODM0LCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4MTExOCwgMHgwODBjLCAweDVmMjIsIDB4MDA3OCwgMHgyMDMwLCAweDgwMDEsCisJMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwMDUxLCAweDAwNDAsIDB4NzAwNywgMHgwMDA2LCAweDcwMTIsCisJMHgyZDAwLCAweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDYyNmUsIDB4MDAwNSwgMHgwMGU2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4YTAzZSwgMHgyMDA5LCAweGI1MzEsIDB4MjEwYywgMHg4MWZmLCAweDE5MDQsCisJMHg2MmVjLCAweDIwMDksIDB4YjUwYywgMHgyMTBjLCAweGQxOTQsIDB4MTkwNCwgMHg2MzE2LCAweDY4NDgsCisJMHgyMDcwLCAweGFlODIsIDB4YmQwMCwgMHgwYTA0LCAweDYyZTAsIDB4MjAwMSwgMHhiNTE3LCAweDIwMDQsCisJMHhhZTAyLCAweDFhMDQsIDB4NjJlMCwgMHg3MTFjLCAweGExODYsIDB4MDAwNiwgMHgxOTA0LCAweDYyY2YsCisJMHg3MDE4LCAweGEwMDUsIDB4MDkwNCwgMHg2MmVjLCAweDIwMDQsIDB4ZDBlNCwgMHgxOTA0LCAweDYzMTEsCisJMHgyMDYxLCAweGI4NzQsIDB4NjEwMCwgMHhhMTg0LCAweDAzMDEsIDB4YTA4NiwgMHgwMDAxLCAweDE1NTAsCisJMHg3MDIwLCAweGQwZGMsIDB4MTkwNCwgMHg2MzE5LCAweDY4NTMsIDB4MDAwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgyZDA4LCAweDcwMTAsIDB4YTAwNSwgMHgxMTU4LCAweDcxMTIsIDB4Njg0YywgMHhkMGY0LCAweDE5MDQsCisJMHg2MzFjLCAweDJlNjAsIDB4MDgwYywgMHg2YTc2LCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MWRlMCwgMHg2OTAyLCAweDIxNjgsIDB4Njg0YywgMHhkMGY0LCAweDE5MDQsCisJMHg2MzFjLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAxMmUsIDB4MDBlZSwgMHg2ODUzLCAweDAwMDYsCisJMHgwODA0LCAweDYzMzksIDB4ZDE4NCwgMHgwZGMwLCAweGQxYzQsIDB4MTFhOCwgMHgwMGI4LCAweDY5NDQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwODBjLCAweDRmYTksIDB4MTVkOCwgMHg2MDAwLCAweGQwZTQsCisJMHgxNWMwLCAweDcxMWMsIDB4YTE4NiwgMHgwMDA3LCAweDExMTgsIDB4Njg1MywgMHgwMDAyLCAweDA0OTgsCisJMHg2ODUzLCAweDAwMDgsIDB4MDQ4MCwgMHg2ODUzLCAweDAwMGUsIDB4MDQ2OCwgMHg2ODUzLCAweDAwMTcsCisJMHgwNDUwLCAweDY4NTMsIDB4MDAzNSwgMHgwNDM4LCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGQwZmMsCisJMHgwMWU4LCAweDY4NDgsIDB4MjA3MCwgMHhhZTgyLCAweGJkMDAsIDB4MDJjMCwgMHg2MDVjLCAweGFlMDIsCisJMHgxMmE4LCAweDcxMWMsIDB4YTE4NiwgMHgwMDA2LCAweDExODgsIDB4NzAxOCwgMHhhMDA1LCAweDAxNzAsCisJMHgyMDA0LCAweGQwYmMsIDB4MDE1OCwgMHgyMDM5LCAweDAwMDEsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDcsCisJMHgxOTA0LCAweDYyNzksIDB4NzAwMywgMHgwMDAyLCAweDA4MDQsIDB4NjI3OSwgMHg2ODUzLCAweDAwMjgsCisJMHgwMDEwLCAweDY4NTMsIDB4MDAyOSwgMHgwMTJlLCAweDAwZWUsIDB4MDQxOCwgMHg2ODUzLCAweDAwMmEsCisJMHgwY2QwLCAweDY4NTMsIDB4MDA0NSwgMHgwY2I4LCAweDJlNjAsIDB4MjAxOSwgMHgwMDAyLCAweDYwMTcsCisJMHgwMDE0LCAweDA4MGMsIDB4YWNlMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDA5LCAweDAwM2UsCisJMHgwMDU4LCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLCAweDIwMDksIDB4MDAwNiwgMHgwMDI4LCAweDIwMDksCisJMHgwMDE2LCAweDAwMTAsIDB4MjAwOSwgMHgwMDAxLCAweDY4NTQsIDB4YTA4NCwgMHhmZjAwLCAweGExMDUsCisJMHg2ODU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwMTJlLCAweDAwMDUsCisJMHgwODBjLCAweDE2MGYsIDB4MDAwNSwgMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwgMHhhMTAyLCAweDAyMzAsCisJMHhhMDBlLCAweDcwMzQsIDB4NzA3MiwgMHg3MDM4LCAweDcwNzYsIDB4MDA1OCwgMHg3MDcwLCAweGEwODAsCisJMHgwMDQwLCAweDcwNzIsIDB4MTIzMCwgMHg3MDc0LCAweGEwODEsIDB4MDAwMCwgMHg3MDc2LCAweGEwODUsCisJMHgwMDAxLCAweDc5MzIsIDB4NzEzMiwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg2YTZkLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHg3MDA3LCAweDAwMDEsCisJMHg2YTQ0LCAweGEyODIsIDB4MDAwNCwgMHgxYTA0LCAweDYzYWMsIDB4ZDI4NCwgMHgwMTcwLCAweDZhNGMsCisJMHhhMjkwLCAweGI2MzUsIDB4MjIwNCwgMHhhMDY1LCAweDYwMDQsIDB4MDVlMCwgMHg4MDA3LCAweGEwODQsCisJMHgwMGZmLCAweGEwODQsIDB4MDAwNiwgMHgxMTA4LCAweDA0YTgsIDB4MmMxMCwgMHgwODBjLCAweDg1YzcsCisJMHgxMTE4LCAweDA4MGMsIDB4OWVkNiwgMHgwNWEwLCAweDYyMWEsIDB4Njg0NCwgMHgwMDAyLCAweDYzOGIsCisJMHg2MzkwLCAweDYzOTMsIDB4NjM5OSwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhiMDY1LCAweDAwNjAsCisJMHgwODBjLCAweGFmZmMsIDB4MDA0OCwgMHgyMDE5LCAweDAwMDIsIDB4Njk1MCwgMHgwODBjLCAweGIwMTcsCisJMHgwMDE4LCAweDY5NTAsIDB4MDgwYywgMHhhZmZjLCAweDA4MGMsIDB4ODYxZCwgMHg2ODU3LCAweDAwMDAsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDEyZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMDNlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4NTcsIDB4MDAwNiwgMHgwYzg4LCAweDY4NTcsCisJMHgwMDAyLCAweDBjNzAsIDB4Njg1NywgMHgwMDA1LCAweDBjNTgsIDB4Njg1NywgMHgwMDA0LCAweDBjNDAsCisJMHg2ODU3LCAweDAwMDcsIDB4MGMyOCwgMHgwMGQ2LCAweDIwMTEsIDB4MDAwNCwgMHgyMjA0LCAweGEwODUsCisJMHg4MDAyLCAweDIwMTIsIDB4MDBkZSwgMHgwMDA1LCAweDIwZTEsIDB4MDAwMiwgMHgzZDA4LCAweDIwZTEsCisJMHgyMDAwLCAweDNkMDAsIDB4YTA4NCwgMHg3MDAwLCAweDAxMTgsIDB4YTA4NiwgMHgxMDAwLCAweDE1NzAsCisJMHgyMGUxLCAweDAwMDAsIDB4M2QwMCwgMHhhMDk0LCAweGZmMDAsIDB4ODIxNywgMHhhMDg0LCAweGYwMDAsCisJMHhhMDg2LCAweDMwMDAsIDB4MTE2MCwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDgsCisJMHgxMWU4LCAweDA4MGMsIDB4MmRiZiwgMHgxMWQwLCAweDA4MGMsIDB4NjYwMywgMHgwMDk4LCAweDIwZTEsCisJMHgwMDA0LCAweDNkNjAsIDB4ZDFiYywgMHgxMTA4LCAweDNlNjAsIDB4YWM4NCwgMHgwMDA3LCAweDExNzAsCisJMHhhYzgyLCAweGJkMDAsIDB4MDI1OCwgMHg2ODVjLCAweGFjMDIsIDB4MTI0MCwgMHgyMDA5LCAweDAwNDcsCisJMHgwODBjLCAweDg2NGMsIDB4N2ExYywgMHhkMjg0LCAweDE5MzgsIDB4MDAwNSwgMHhhMDE2LCAweDA4MGMsCisJMHgxODVlLCAweDBjYzAsIDB4MGNkOCwgMHg3ODFjLCAweGQwOGMsIDB4MDUwMCwgMHgwMTU2LCAweDAxMzYsCisJMHgwMTQ2LCAweDIwZTEsIDB4MzAwMCwgMHgzZDIwLCAweDNlMjgsIDB4YTU4NCwgMHgwMDc2LCAweDE1MzgsCisJMHhhNDg0LCAweDcwMDAsIDB4YTA4NiwgMHgxMDAwLCAweDExYTgsIDB4MDgwYywgMHg2NDdlLCAweDAxZjgsCisJMHgyMGUxLCAweDMwMDAsIDB4NzgyOCwgMHg3ODI4LCAweDA4MGMsIDB4NjQ5YSwgMHgwMTRlLCAweDAxM2UsCisJMHgwMTVlLCAweDIwMDksIDB4YjdlOCwgMHgyMTA0LCAweGEwMDUsIDB4MTEwOCwgMHgwMDA1LCAweDA4MGMsCisJMHg3MTczLCAweDBjZTAsIDB4YTQ4NCwgMHg3MDAwLCAweDE1NDgsIDB4MDgwYywgMHg2NDdlLCAweDAxZDgsCisJMHg3MDAwLCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDgxMDAsIDB4MGQxMCwgMHgwMGEwLCAweGQ1YTQsCisJMHgwMTc4LCAweDAwNTYsIDB4MDA0NiwgMHgwODBjLCAweDFlNmUsIDB4MDgwYywgMHgyNGIwLCAweDIwMDEsCisJMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNDgsCisJMHgwNGE5LCAweDY4ODcsIDB4MDAwMCwgMHgwODBjLCAweGIzZGYsIDB4MjBlMSwgMHgzMDAwLCAweDc4MjgsCisJMHg3ODI4LCAweDAwYjksIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDg4MCwgMHgwNDM5LCAweDExMzAsCisJMHg3MDAwLCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDgxMDAsIDB4MWQ2OCwgMHgwODBjLCAweGIzZGYsCisJMHgyMGUxLCAweDMwMDAsIDB4NzgyOCwgMHg3ODI4LCAweDAwNTYsIDB4MDgwYywgMHg2ODc0LCAweDAwNWUsCisJMHgwYzQwLCAweDIwMDEsIDB4YjUwZSwgMHgyMDA0LCAweGQwOGMsIDB4MDE3OCwgMHgyMDAxLCAweGI1MDAsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxMTQ4LCAweDAwMjYsIDB4MDAzNiwgMHgyMDExLCAweDgwNDgsCisJMHgyNTE4LCAweDA4MGMsIDB4M2VjYywgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHhhNDg0LCAweDAxZmYsCisJMHg2ODg2LCAweGEwMDUsIDB4MDE2MCwgMHhhMDgwLCAweDAwMWYsIDB4YTA4NCwgMHgwM2Y4LCAweDgwYWMsCisJMHgyMGUxLCAweDEwMDAsIDB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHgwMDA1LCAweDIwYTksCisJMHgwMDBjLCAweDIwZTEsIDB4MTAwMCwgMHgyZWEwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweGEwODUsCisJMHgwMDAxLCAweDBjYTAsIDB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4YywgMHhmMDAwLCAweDgwMDcsCisJMHhhMTk2LCAweDAwMDAsIDB4MTExOCwgMHgwODA0LCAweDY3MDgsIDB4MDAwNSwgMHhhMTk2LCAweDIwMDAsCisJMHgxMTQ4LCAweDY5MDAsIDB4YTE4ZSwgMHgwMDAxLCAweDExMTgsIDB4MDgwYywgMHg0NDhmLCAweDBjYTgsCisJMHgwMDM5LCAweDBjOTgsIDB4YTE5NiwgMHg4MDAwLCAweDFkODAsIDB4MDgwYywgMHg2N2I0LCAweDBjNjgsCisJMHgwMGM2LCAweDZhODQsIDB4ODJmZiwgMHgwOTA0LCAweDY1ZmQsIDB4NzExMCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweGExOTYsIDB4MDAwMSwgMHgwMTIwLCAweGExOTYsIDB4MDAyMywgMHgxOTA0LCAweDY1ZmQsCisJMHhhMDhlLCAweDAwMjMsIDB4MTU3MCwgMHgwODBjLCAweDY4NGYsIDB4MDkwNCwgMHg2NWZkLCAweDcxMjQsCisJMHg2MTBhLCAweDcwMzAsIDB4YTA4ZSwgMHgwMjAwLCAweDExNTAsIDB4NzAzNCwgMHhhMDA1LCAweDE5MDQsCisJMHg2NWZkLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweDg2NGMsIDB4MDgwNCwgMHg2NWZkLCAweGEwOGUsCisJMHgwMjE0LCAweDAxMTgsIDB4YTA4ZSwgMHgwMjEwLCAweDExMzAsIDB4MjAwOSwgMHgwMDE1LCAweDA4MGMsCisJMHg4NjRjLCAweDA4MDQsIDB4NjVmZCwgMHhhMDhlLCAweDAxMDAsIDB4MTkwNCwgMHg2NWZkLCAweDcwMzQsCisJMHhhMDA1LCAweDE5MDQsIDB4NjVmZCwgMHgyMDA5LCAweDAwMTYsIDB4MDgwYywgMHg4NjRjLCAweDA4MDQsCisJMHg2NWZkLCAweGEwOGUsIDB4MDAyMiwgMHgxOTA0LCAweDY1ZmQsIDB4NzAzMCwgMHhhMDhlLCAweDAzMDAsCisJMHgxNTgwLCAweDY4ZDQsIDB4ZDBhNCwgMHgwNTI4LCAweGMwYjUsIDB4NjhkNiwgMHg3MTAwLCAweGExOGMsCisJMHgwMGZmLCAweDY5NzIsIDB4NzAwNCwgMHg2ODc2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZTYsCisJMHg3OGVhLCAweDAwMDYsIDB4YTA4NCwgMHgwMGZmLCAweDAwMTYsIDB4MjAwOCwgMHgwODBjLCAweDI4NDcsCisJMHg3OTMyLCAweDc5MzYsIDB4MDAxZSwgMHgwMDBlLCAweDAwZmUsIDB4MDgwYywgMHgyODFkLCAweDY5NTIsCisJMHg3MDNjLCAweDAwZTYsIDB4MjA3MSwgMHgwMTQwLCAweDcwODYsIDB4MjA3MSwgMHhiNTAwLCAweDcwYTYsCisJMHgwMGVlLCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LCAweDY1ZmQsIDB4MjAwOSwgMHgwMDE3LCAweDA4MDQsCisJMHg2NWMzLCAweGEwOGUsIDB4MDQwMCwgMHgxMTU4LCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LCAweDY1ZmQsCisJMHg2OGQ0LCAweGMwYTUsIDB4NjhkNiwgMHgyMDA5LCAweDAwMzAsIDB4MDgwNCwgMHg2NWMzLCAweGEwOGUsCisJMHgwNTAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LCAweDE5MDQsIDB4NjVmZCwgMHgyMDA5LCAweDAwMTgsCisJMHgwODA0LCAweDY1YzMsIDB4YTA4ZSwgMHgyMDEwLCAweDExMjAsIDB4MjAwOSwgMHgwMDE5LCAweDA4MDQsCisJMHg2NWMzLCAweGEwOGUsIDB4MjExMCwgMHgxMTIwLCAweDIwMDksIDB4MDAxYSwgMHgwODA0LCAweDY1YzMsCisJMHhhMDhlLCAweDUyMDAsIDB4MTE0MCwgMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2NWZkLCAweDIwMDksCisJMHgwMDFiLCAweDA4MDQsIDB4NjVjMywgMHhhMDhlLCAweDUwMDAsIDB4MTE0MCwgMHg3MDM0LCAweGEwMDUsCisJMHgxOTA0LCAweDY1ZmQsIDB4MjAwOSwgMHgwMDFjLCAweDA4MDQsIDB4NjVjMywgMHhhMDhlLCAweDEzMDAsCisJMHgxMTIwLCAweDIwMDksIDB4MDAzNCwgMHgwODA0LCAweDY1YzMsIDB4YTA4ZSwgMHgxMjAwLCAweDExNDAsCisJMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2NWZkLCAweDIwMDksIDB4MDAyNCwgMHgwODA0LCAweDY1YzMsCisJMHhhMDhjLCAweGZmMDAsIDB4YTE4ZSwgMHgyNDAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDJkLCAweDA0ZDgsCisJMHhhMDhjLCAweGZmMDAsIDB4YTE4ZSwgMHg1MzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDJhLCAweDA0OTgsCisJMHhhMDhlLCAweDBmMDAsIDB4MTExOCwgMHgyMDA5LCAweDAwMjAsIDB4MDQ2OCwgMHhhMDhlLCAweDUzMDAsCisJMHgxMTA4LCAweDAwZDgsIDB4YTA4ZSwgMHg2MTA0LCAweDExYzAsIDB4MjAxMSwgMHhiYjhkLCAweDgyMDgsCisJMHgyMjA0LCAweGEwODIsIDB4MDAwNCwgMHgyMGE4LCAweDk1YWMsIDB4OTVhYywgMHgyMDExLCAweDgwMTUsCisJMHgyMTFjLCAweDgxMDgsIDB4MDA0NiwgMHgyMTI0LCAweDA4MGMsIDB4M2VjYywgMHgwMDRlLCAweDgxMDgsCisJMHgxZjA0LCAweDY1YTYsIDB4MjAwOSwgMHgwMDIzLCAweDAwNzAsIDB4YTA4ZSwgMHg2MDAwLCAweDExMTgsCisJMHgyMDA5LCAweDAwM2YsIDB4MDA0MCwgMHhhMDhlLCAweDc4MDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNDUsCisJMHgwMDEwLCAweDIwMDksIDB4MDAxZCwgMHgwMDE2LCAweDIwMTEsIDB4YmI4MywgMHgyMjA0LCAweDgyMTEsCisJMHgyMjBjLCAweDA4MGMsIDB4MjgxZCwgMHgxNTk4LCAweDA4MGMsIDB4NGY0ZCwgMHgxNTgwLCAweDY2MTIsCisJMHg2NTE2LCAweDg2ZmYsIDB4MDFlOCwgMHgwMDFlLCAweDAwMTYsIDB4YTE4NiwgMHgwMDE3LCAweDExNTgsCisJMHg2ODcwLCAweGE2MDYsIDB4MTFhOCwgMHg2ODc0LCAweGE1MDYsIDB4YTA4NCwgMHhmZjAwLCAweDExODAsCisJMHg2MDAwLCAweGMwZjUsIDB4NjAwMiwgMHhhMTg2LCAweDAwNDYsIDB4MTE1MCwgMHg2ODcwLCAweGE2MDYsCisJMHgxMTM4LCAweDY4NzQsIDB4YTUwNiwgMHhhMDg0LCAweGZmMDAsIDB4MTExMCwgMHgwMDFlLCAweDAwNjgsCisJMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMTY4LCAweDAwMWUsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsCisJMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwODBjLCAweDg2NGMsIDB4MDBjZSwgMHgwMDA1LCAweDAwMWUsCisJMHgwY2UwLCAweDAwY2UsIDB4MGNlMCwgMHgwMGM2LCAweDAwNDYsIDB4MDgwYywgMHg2NjU3LCAweDE5MDQsCisJMHg2NjU0LCAweGEyOGUsIDB4MDAzMywgMHgxMWU4LCAweDA4MGMsIDB4Njg0ZiwgMHgwOTA0LCAweDY2NTQsCisJMHg3MTI0LCAweDYxMGEsIDB4NzAzMCwgMHhhMDhlLCAweDAyMDAsIDB4MTE0MCwgMHg3MDM0LCAweGEwMDUsCisJMHgxNWQ4LCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweDg2NGMsIDB4MDRiMCwgMHhhMDhlLCAweDAxMDAsCisJMHgxNTk4LCAweDcwMzQsIDB4YTAwNSwgMHgxNTgwLCAweDIwMDksIDB4MDAxNiwgMHgwODBjLCAweDg2NGMsCisJMHgwNDU4LCAweGEyOGUsIDB4MDAzMiwgMHgxNTQwLCAweDcwMzAsIDB4YTA4ZSwgMHgxNDAwLCAweDE1MjAsCisJMHgyMDA5LCAweDAwMzgsIDB4MDAxNiwgMHgyMDExLCAweGJiODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsCisJMHgwODBjLCAweDI4MWQsIDB4MTFjMCwgMHgwODBjLCAweDRmNGQsIDB4MTFhOCwgMHg2NjEyLCAweDY1MTYsCisJMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMTcwLCAweDAwMWUsIDB4NjExYSwgMHgwODBjLCAweGEwMjcsCisJMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4MDgwYywgMHg4NjRjLCAweDA4MGMsCisJMHg3MTczLCAweDAwMTAsIDB4MDBjZSwgMHgwMDFlLCAweDAwNGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGQ2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgzYzAwLCAweDAwMDYsCisJMHgyMDc5LCAweDAwMzAsIDB4MjA2OSwgMHgwMjAwLCAweDA4MGMsIDB4MWYyZCwgMHgxNTkwLCAweDA4MGMsCisJMHgxZGQyLCAweDA1ZTAsIDB4MDRmMSwgMHgxMTMwLCAweDc5MDgsIDB4YTE4YywgMHgxZmZmLCAweGExODIsCisJMHgwMDExLCAweDE2ODgsIDB4MjBhOSwgMHgwMDBjLCAweDIwZTEsIDB4MDAwMCwgMHgyZWEwLCAweDIwOTksCisJMHgwMjBhLCAweDUzYTUsIDB4MjBlMSwgMHgyMDAwLCAweDIwMDEsIDB4MDIwYSwgMHgyMDA0LCAweDdhMGMsCisJMHg3ODA4LCAweGEwODAsIDB4MDAwNywgMHhhMDg0LCAweDFmZjgsIDB4MDQxOSwgMHgxMTIwLCAweGEwOGEsCisJMHgwMTQwLCAweDFhMGMsIDB4MTUxNSwgMHg4MGFjLCAweDIwZTEsIDB4NjAwMCwgMHgyMDk5LCAweDAyMGEsCisJMHg1M2E1LCAweDIwZTEsIDB4NzAwMCwgMHg2ODI4LCAweDY4MjgsIDB4NzgwMywgMHgwMDA0LCAweGEyOTQsCisJMHgwMDcwLCAweDAwMGUsIDB4MjBlMCwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMGRlLCAweDAwZmUsIDB4MDAwNSwgMHhhMDE2LCAweDA4MGMsIDB4MTg1ZSwgMHhhMDg1LCAweDAwMDEsCisJMHgwYzgwLCAweDAwMDYsIDB4MjAwMSwgMHgwMTExLCAweDIwMDQsIDB4YTA4NCwgMHgwMDAzLCAweDAwMGUsCisJMHgwMDA1LCAweDAwNDYsIDB4MDBlNiwgMHgwMGQ2LCAweDIwMjgsIDB4MjEzMCwgMHhhNjk2LCAweDAwZmYsCisJMHgxMTk4LCAweGE1OTYsIDB4ZmZmZCwgMHgxMTIwLCAweDIwMDksIDB4MDA3ZiwgMHgwODA0LCAweDY3MDMsCisJMHhhNTk2LCAweGZmZmUsIDB4MTExOCwgMHgyMDA5LCAweDAwN2UsIDB4MDRlOCwgMHhhNTk2LCAweGZmZmMsCisJMHgxMTE4LCAweDIwMDksIDB4MDA4MCwgMHgwNGI4LCAweDIwMTEsIDB4MDAwMCwgMHgyMDE5LCAweGI1MzUsCisJMHgyMzFjLCAweGQzYWMsIDB4MDEzOCwgMHgyMDIxLCAweDAwMDAsIDB4MjBhOSwgMHgwMGZmLCAweDIwNzEsCisJMHhiNjM1LCAweDAwMzAsIDB4MjAyMSwgMHgwMDgxLCAweDIwYTksIDB4MDA3ZSwgMHgyMDcxLCAweGI2YjYsCisJMHgyZTFjLCAweDgzZmYsIDB4MTEyOCwgMHg4MmZmLCAweDExOTgsIDB4MjQxMCwgMHhjMmZkLCAweDAwODAsCisJMHgyMzY4LCAweDZmMTAsIDB4MDAwNiwgMHgyMTAwLCAweGE3MDYsIDB4MDAwZSwgMHg2YjE0LCAweDExMjAsCisJMHhhMzQ2LCAweDExMTAsIDB4MjQwOCwgMHgwMDc4LCAweDg3ZmYsIDB4MTExMCwgMHg4M2ZmLCAweDBkNTgsCisJMHg4NDIwLCAweDhlNzAsIDB4MWYwNCwgMHg2NmUwLCAweDgyZmYsIDB4MTExOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDE4LCAweGMyZmMsIDB4MjIwOCwgMHhhMDA2LCAweDAwZGUsIDB4MDBlZSwgMHgwMDRlLCAweDAwMDUsCisJMHhhMDg0LCAweDAwMDcsIDB4MDAwYSwgMHgwMDA1LCAweDY3MTQsIDB4NjcxNCwgMHg2NzE0LCAweDY4NjEsCisJMHg2NzE0LCAweDY3MTUsIDB4NjcyYSwgMHg2NzlmLCAweDAwMDUsIDB4NzExMCwgMHhkMWJjLCAweDAxODgsCisJMHg3MTIwLCAweDIxNjAsIDB4YWM4YywgMHgwMDA3LCAweDExNjAsIDB4YWM4YSwgMHhiZDAwLCAweDAyNDgsCisJMHg2ODVjLCAweGFjMDIsIDB4MTIzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ2LCAweDA4MGMsCisJMHg4NjRjLCAweDAwMDUsIDB4MDBjNiwgMHhhNDg0LCAweDAxZmYsIDB4MDkwNCwgMHg2NzdkLCAweDcxMTAsCisJMHhkMWJjLCAweDE5MDQsIDB4Njc3ZCwgMHgyMDExLCAweGJiODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsCisJMHgwODBjLCAweDI4MWQsIDB4MTkwNCwgMHg2NzdkLCAweDA4MGMsIDB4NGY0ZCwgMHgxNWYwLCAweDY2MTIsCisJMHg2NTE2LCAweDYwMDAsIDB4ZDBlYywgMHgxNWM4LCAweDYyMDQsIDB4YTI5NCwgMHhmZjAwLCAweDgyMTcsCisJMHhhMjg2LCAweDAwMDYsIDB4MDE0OCwgMHg2MjA0LCAweGEyOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDYsCisJMHgxMWEwLCAweGEyOTUsIDB4MDYwMCwgMHg2MjA2LCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDAwMWUsCisJMHgwNTMwLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxNTIsCisJMHgyMDA5LCAweDAwNDQsIDB4MDgwYywgMHg4NjRjLCAweDAwYzAsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsCisJMHgwMDFlLCAweDAxOTgsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweGEyODYsCisJMHgwMDA0LCAweDExMTgsIDB4NjAwNywgMHgwMDA1LCAweDAwMTAsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwODBjLCAweDcxNzMsIDB4MDBjZSwgMHgwMDA1LCAweDIwMDEsCisJMHhiNTBkLCAweDIwMDQsIDB4ZDBlYywgMHgwMTIwLCAweDIwMTEsIDB4ODA0OSwgMHgwODBjLCAweDNlY2MsCisJMHgwMGM2LCAweDA4MGMsIDB4OWVkNiwgMHgwMDFlLCAweDBkODAsIDB4NjExYSwgMHg2MDFmLCAweDAwMDYsCisJMHg3MTIwLCAweDYxMGEsIDB4NzEzMCwgMHg2MTUyLCAweDYwMTMsIDB4MDMwMCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwNDEsIDB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwOGYwLCAweDcxMTAsCisJMHhkMWJjLCAweDAxODgsIDB4NzAyMCwgMHgyMDYwLCAweGFjODQsIDB4MDAwNywgMHgxMTYwLCAweGFjODIsCisJMHhiZDAwLCAweDAyNDgsIDB4Njg1YywgMHhhYzAyLCAweDEyMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDQ1LCAweDA4MGMsIDB4ODY0YywgMHgwMDA1LCAweDAwMDYsIDB4MDgwYywgMHgyZGJmLCAweDAwMGUsCisJMHgxMTY4LCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE4ZSwgMHgwMDAwLCAweDExMzAsCisJMHhhMDg0LCAweDAwMGYsIDB4YTA4YSwgMHgwMDA2LCAweDEyMDgsIDB4MDAwYiwgMHgwMDA1LCAweDY3Y2QsCisJMHg2N2NlLCAweDY3Y2QsIDB4NjdjZCwgMHg2ODM3LCAweDY4NDMsIDB4MDAwNSwgMHg3MTEwLCAweGQxYmMsCisJMHgwMTIwLCAweDcwMmMsIDB4ZDA4NCwgMHgwOTA0LCAweDY4MzYsIDB4NzAwYywgMHg3MTA4LCAweDA4MGMsCisJMHgyODFkLCAweDE5MDQsIDB4NjgzNiwgMHgwODBjLCAweDRmNGQsIDB4MTkwNCwgMHg2ODM2LCAweDY2MTIsCisJMHg2NTE2LCAweDYyMDQsIDB4NzExMCwgMHhkMWJjLCAweDAxZjgsIDB4YTI4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDA0LCAweDAxMTgsIDB4YTE4NiwgMHgwMDA2LCAweDE1YzgsIDB4MDBjNiwgMHgwODBjLCAweDY4NGYsCisJMHgwMGNlLCAweDA5MDQsIDB4NjgzNiwgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMDFlLCAweDA1ZjAsCisJMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDIsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDg4LCAweDA4MGMsIDB4ODY0YywgMHgwNDkwLCAweGEyOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDYsCisJMHgwMTYwLCAweGExODYsIDB4MDAwNCwgMHgwMTQ4LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweGEyODYsCisJMHgwMDA0LCAweDAxMTgsIDB4YTI4NiwgMHgwMDA2LCAweDExODgsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsCisJMHgwMDFlLCAweDAxZTAsIDB4NjExYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDA1LCAweDcxMjAsCisJMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgwODBjLCAweDg2NGMsIDB4MDA4MCwgMHgwMGM2LCAweDA4MGMsCisJMHg4NWM3LCAweDAwMWUsIDB4MDE1OCwgMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDQsCisJMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4ODY0YywgMHgwMDA1LCAweDcxMTAsCisJMHhkMWJjLCAweDAxNDAsIDB4MDBhMSwgMHgwMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwODksCisJMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHg3MTEwLCAweGQxYmMsIDB4MDE0MCwgMHgwMDQxLCAweDAxMzAsCisJMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDhhLCAweDA4MGMsIDB4ODY0YywgMHgwMDA1LCAweDcwMjAsCisJMHgyMDYwLCAweGFjODQsIDB4MDAwNywgMHgxMTU4LCAweGFjODIsIDB4YmQwMCwgMHgwMjQwLCAweDIwMDEsCisJMHhiNTE3LCAweDIwMDQsIDB4YWMwMiwgMHgxMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweGEwMDYsCisJMHgwY2U4LCAweDcxMTAsIDB4ZDFiYywgMHgxMTc4LCAweDcwMjQsIDB4MjA2MCwgMHhhYzg0LCAweDAwMDcsCisJMHgxMTUwLCAweGFjODIsIDB4YmQwMCwgMHgwMjM4LCAweDY4NWMsIDB4YWMwMiwgMHgxMjIwLCAweDIwMDksCisJMHgwMDUxLCAweDA4MGMsIDB4ODY0YywgMHgwMDA1LCAweDIwMzEsIDB4MDEwNSwgMHgwMDY5LCAweDAwMDUsCisJMHgyMDMxLCAweDAyMDYsIDB4MDA0OSwgMHgwMDA1LCAweDIwMzEsIDB4MDIwNywgMHgwMDI5LCAweDAwMDUsCisJMHgyMDMxLCAweDAyMTMsIDB4MDAwOSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMGY2LCAweDcwMDAsCisJMHhhMDg0LCAweGYwMDAsIDB4YTA4NiwgMHhjMDAwLCAweDA1YjAsIDB4MDgwYywgMHg4NWM3LCAweDA1OTgsCisJMHgwMDY2LCAweDAwYzYsIDB4MDA0NiwgMHgyMDExLCAweGJiODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsCisJMHgwODBjLCAweDI4MWQsIDB4MTU4MCwgMHgwODBjLCAweDRmNGQsIDB4MTU2OCwgMHg2NjEyLCAweDY1MTYsCisJMHgyYzAwLCAweDAwNGUsIDB4MDBjZSwgMHg2MDFhLCAweDA4MGMsIDB4YTAyNywgMHgwODBjLCAweDE1ZjgsCisJMHgwMWYwLCAweDJkMDAsIDB4NjA1NiwgMHg2ODAzLCAweDAwMDAsIDB4NjgzNywgMHgwMDAwLCAweDZjM2EsCisJMHhhZGY4LCAweDAwMGYsIDB4MjBhOSwgMHgwMDBlLCAweDJmYTAsIDB4MmU5OCwgMHg1M2EzLCAweDAwNmUsCisJMHg2NjEyLCAweDYwMDcsIDB4MDAzZSwgMHg2MDFmLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg2Y2QzLCAweDA4MGMsIDB4NzE3MywgMHgwMGZlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDA4MGMsCisJMHg4NjFkLCAweDAwNmUsIDB4MGNjMCwgMHgwMDRlLCAweDAwY2UsIDB4MGNjOCwgMHgyMDcxLCAweGI3ZjMsCisJMHg3MDAzLCAweDAwMDMsIDB4NzAwZiwgMHgwMzYxLCAweGEwMDYsIDB4NzAxYSwgMHg3MDc2LCAweDcwMTIsCisJMHg3MDE3LCAweGJkMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjYsIDB4NzAyYiwgMHg3ZDkxLCAweDcwMzIsCisJMHg3MDM3LCAweDdkZjEsIDB4NzAzYiwgMHhmZmZmLCAweDcwM2YsIDB4ZmZmZiwgMHg3MDQyLCAweDcwNDcsCisJMHg0NDRiLCAweDcwNGEsIDB4NzA1YiwgMHg2YTJiLCAweDIwMDEsIDB4YjdhMSwgMHgyMDAzLCAweDAwMDMsCisJMHgyMDAxLCAweGI3YTMsIDB4MjAwMywgMHgwMTAwLCAweDNhMDAsIDB4YTA4NCwgMHgwMDA1LCAweDcwNmUsCisJMHgwMDA1LCAweDIwNzEsIDB4YjdmMywgMHgxZDA0LCAweDY5OGIsIDB4MjA5MSwgMHg2MDAwLCAweDcwMGMsCisJMHg4MDAxLCAweDcwMGUsIDB4MTUxOCwgMHg3MDBmLCAweDAzNjEsIDB4NzAwNywgMHgwMDAxLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzA0MCwgMHhhMDBkLCAweDAxMjgsIDB4ODEwOSwgMHg3MTQyLCAweDExMTAsCisJMHg3MDQ0LCAweDA4MGYsIDB4MDBjNiwgMHgyMDYxLCAweGI1MDAsIDB4NjAzNCwgMHgwMGNlLCAweGQwY2MsCisJMHgwMTgwLCAweDNhMDAsIDB4YTA4NCwgMHgwMDA1LCAweDcyNmMsIDB4YTIxNiwgMHgwMTUwLCAweDcwNmUsCisJMHgyMDExLCAweDgwNDMsIDB4MjAxOCwgMHgwODBjLCAweDNlY2MsIDB4MDAxOCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwMjQsIDB4YTAwZCwgMHgwMTg4LCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDExNjgsCisJMHg3MDIzLCAweDAwMDksIDB4ODEwOSwgMHg3MTI2LCAweGExODYsIDB4MDNlOCwgMHgxMTEwLCAweDcwMjgsCisJMHgwODBmLCAweDgxZmYsIDB4MTExMCwgMHg3MDI4LCAweDA4MGYsIDB4NzAzMCwgMHhhMDBkLCAweDAxODAsCisJMHg3MDJjLCAweDgwMDEsIDB4NzAyZSwgMHgxMTYwLCAweDcwMmYsIDB4MDAwOSwgMHg4MTA5LCAweDcxMzIsCisJMHgwMTI4LCAweGExODQsIDB4MDA3ZiwgMHgwOTBjLCAweDdlMzYsIDB4MDAxMCwgMHg3MDM0LCAweDA4MGYsCisJMHg3MDM4LCAweGEwMDUsIDB4MDExOCwgMHgwMzEwLCAweDgwMDEsIDB4NzAzYSwgMHg3MDNjLCAweGEwMDUsCisJMHgwMTE4LCAweDAzMTAsIDB4ODAwMSwgMHg3MDNlLCAweDcwNGMsIDB4YTAwZCwgMHgwMTY4LCAweDcwNDgsCisJMHg4MDAxLCAweDcwNGEsIDB4MTE0OCwgMHg3MDRiLCAweDAwMDksIDB4ODEwOSwgMHg3MTRlLCAweDExMjAsCisJMHg3MTUwLCAweDcxNGUsIDB4NzA1OCwgMHgwODBmLCAweDcwMTgsIDB4YTAwZCwgMHgwMWQ4LCAweDAwMTYsCisJMHg3MDc0LCAweGEwMGQsIDB4MDE1OCwgMHg3MDcwLCAweDgwMDEsIDB4NzA3MiwgMHgxMTM4LCAweDcwNzMsCisJMHgwMDA5LCAweDgxMDksIDB4NzE3NiwgMHgxMTEwLCAweDcwNzgsIDB4MDgwZiwgMHgwMDFlLCAweDcwMDgsCisJMHg4MDAxLCAweDcwMGEsIDB4MTEzOCwgMHg3MDBiLCAweDAwMDksIDB4ODEwOSwgMHg3MTFhLCAweDExMTAsCisJMHg3MDFjLCAweDA4MGYsIDB4MDEyZSwgMHg3MDA0LCAweDAwMDIsIDB4NjliMSwgMHg2OWIyLCAweDY5Y2EsCisJMHgwMGU2LCAweDIwNzEsIDB4YjdmMywgMHg3MDE4LCAweGEwMDUsIDB4MTEyMCwgMHg3MTFhLCAweDcyMWUsCisJMHg3MDBiLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHgyMDcxLCAweGI3ZjMsCisJMHg3MDFjLCAweGEyMDYsIDB4MTExMCwgMHg3MDFhLCAweDcwMWUsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4YjdmMywgMHg2MDg4LCAweGExMDIsIDB4MDIwOCwgMHg2MThhLCAweDAwZWUsCisJMHgwMDA1LCAweDAwMDUsIDB4NzExMCwgMHgwODBjLCAweDRmYTksIDB4MTE1OCwgMHg2MDg4LCAweDgwMDEsCisJMHgwMjQwLCAweDYwOGEsIDB4MTEzMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDcxNzMsCisJMHgwMTJlLCAweDgxMDgsIDB4YTE4MiwgMHgwMGZmLCAweDAyMTgsIDB4YTAwZSwgMHg3MDA3LCAweDAwMDIsCisJMHg3MTEyLCAweDAwMDUsIDB4NzAxNCwgMHgyMDYwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwM2MsCisJMHhhMDA1LCAweDAxMjgsIDB4ODAwMSwgMHg2MDNlLCAweDExMTAsIDB4MDgwYywgMHg5ZjE1LCAweDYwMTQsCisJMHhhMDA1LCAweDA1MDAsIDB4ODAwMSwgMHg2MDE2LCAweDExZTgsIDB4NjExYywgMHhhMTg2LCAweDAwMDMsCisJMHgwMTE4LCAweGExODYsIDB4MDAwNiwgMHgxMWEwLCAweDYwMTAsIDB4MjA2OCwgMHg2ODU0LCAweGEwOGEsCisJMHgxOTlhLCAweDAyNzAsIDB4YTA4MiwgMHgxOTk5LCAweDY4NTYsIDB4YTA4YSwgMHgxOTlhLCAweDAyMTAsCisJMHgyMDAxLCAweDE5OTksIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHg2MTE2LCAweDAwMTAsCisJMHgwODBjLCAweDk5ZTUsIDB4MDEyZSwgMHhhYzg4LCAweDAwMTgsIDB4NzExNiwgMHgyMDAxLCAweGVkMDAsCisJMHhhMTAyLCAweDAyMjAsIDB4NzAxNywgMHhiZDAwLCAweDcwMDcsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweGI3ZjMsIDB4NzAyNywgMHgwN2QwLCAweDcwMjMsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsCisJMHgyMDAxLCAweGI3ZmMsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI3ZjMsCisJMHg3MTMyLCAweDcwMmYsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MjAxMSwgMHhiN2ZmLCAweDIwMTMsCisJMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI3ZjMsIDB4NzExYSwgMHg3MjFlLCAweDcwMGIsCisJMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwMjYsIDB4NzA1NCwgMHg4MDAwLCAweDcwNTYsCisJMHgyMDYxLCAweGI3YTEsIDB4NjAwOCwgMHhhMDg2LCAweDAwMDAsIDB4MDE1OCwgMHg3MDY4LCAweDYwMzIsCisJMHg3MDY0LCAweDYwMmUsIDB4NzA2MCwgMHg2MDJhLCAweDcwNWMsIDB4NjAyNiwgMHgyYzEwLCAweDA4MGMsCisJMHgxNjQzLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDAwZjYsIDB4MDgwYywgMHg2OGY5LCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YjdmMywgMHg3MTc2LCAweDcyN2EsCisJMHg3MDczLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHgyMDcxLCAweGI3ZjMsCisJMHg3MDc4LCAweGEyMDYsIDB4MTExMCwgMHg3MDc2LCAweDcwN2EsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGM2LCAweDIwNjEsIDB4Yjg3NCwgMHgwMGNlLCAweDAwMDUsIDB4YTE4NCwgMHgwMDBmLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHhiODc0LCAweDIwNjAsIDB4MDAwNSwgMHg2ODU0LCAweGEwOGEsCisJMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LCAweGEwMDUsIDB4MTE1MCwgMHgwMGM2LCAweDIwNjEsCisJMHhiODc0LCAweDYwMTQsIDB4MDBjZSwgMHhhMDA1LCAweDExMzgsIDB4MjAwMSwgMHgwMDFlLCAweDAwMjAsCisJMHhhMDhlLCAweGZmZmYsIDB4MTEwOCwgMHhhMDA2LCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsCisJMHg2MTE2LCAweDY4NGMsIDB4YTA4YywgMHgwMGMwLCAweGExOGUsIDB4MDBjMCwgMHgwNWU4LCAweGQwYjQsCisJMHgxMTM4LCAweGQwYmMsIDB4MTU1MCwgMHgyMDA5LCAweDAwMDYsIDB4MDgwYywgMHg2YWYxLCAweDAwMDUsCisJMHhkMGZjLCAweDAxMzgsIDB4YTA4NCwgMHgwMDAzLCAweDAxMjAsIDB4YTA4NiwgMHgwMDAzLCAweDE5MDQsCisJMHg2YWViLCAweDYwMjAsIDB4ZDBkNCwgMHgwMTMwLCAweGMwZDQsIDB4NjAyMiwgMHg2ODYwLCAweDYwMmEsCisJMHg2ODVjLCAweDYwMmUsIDB4MjAwOSwgMHhiNTc0LCAweDIxMDQsIDB4ZDA4NCwgMHgwMTM4LCAweDg3ZmYsCisJMHgxMTIwLCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweDg2NGMsIDB4MDAwNSwgMHg4N2ZmLCAweDExMjAsCisJMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHg4NjRjLCAweDAwMDUsIDB4ZDBmYywgMHgwMTMwLCAweGEwODQsCisJMHgwMDAzLCAweDAxMTgsIDB4YTA4NiwgMHgwMDAzLCAweDExZjAsIDB4ODdmZiwgMHgxMTIwLCAweDIwMDksCisJMHgwMDQyLCAweDA4MGMsIDB4ODY0YywgMHgwMDA1LCAweGQwZmMsIDB4MDE2MCwgMHhhMDg0LCAweDAwMDMsCisJMHhhMDhlLCAweDAwMDIsIDB4MDE0OCwgMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsCisJMHg4NjRjLCAweDAwMDUsIDB4MDA2MSwgMHgwY2U4LCAweDg3ZmYsIDB4MWRkOCwgMHgyMDA5LCAweDAwNDMsCisJMHgwODBjLCAweDg2NGMsIDB4MGNiMCwgMHgyMDA5LCAweDAwMDQsIDB4MDAxOSwgMHgwMDA1LCAweDIwMDksCisJMHgwMDAxLCAweDAwZDYsIDB4NjAxMCwgMHhhMGVjLCAweGYwMDAsIDB4MDUxMCwgMHgyMDY4LCAweDY5NTIsCisJMHg2ODAwLCAweDYwMTIsIDB4YTE4NiwgMHgwMDAxLCAweDExODgsIDB4Njk0YywgMHhhMThjLCAweDgxMDAsCisJMHhhMThlLCAweDgxMDAsIDB4MTE1OCwgMHgwMGM2LCAweDIwNjEsIDB4Yjg3NCwgMHg2MjAwLCAweGQyOGMsCisJMHgxMTIwLCAweDYyMDQsIDB4ODIxMCwgMHgwMjA4LCAweDYyMDYsIDB4MDBjZSwgMHgwODBjLCAweDU0MDgsCisJMHg2MDEwLCAweGEwNmQsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MTkwYywgMHg2YTc2LCAweDAwN2UsCisJMHgwMGRlLCAweDAwMDUsIDB4MDE1NiwgMHgwMGM2LCAweDIwNjEsIDB4Yjg3NCwgMHg2MDAwLCAweDgxZmYsCisJMHgwMTEwLCAweGEyMDUsIDB4MDAwOCwgMHhhMjA0LCAweDYwMDIsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsCisJMHg2ODAwLCAweGQwOGMsIDB4MTEzOCwgMHg2ODA4LCAweGEwMDUsIDB4MDEyMCwgMHg4MDAxLCAweDY4MGEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMGE5LCAweDAwMTAsIDB4YTAwNiwgMHg4MDA0LCAweDgwODYsCisJMHg4MThlLCAweDEyMDgsIDB4YTIwMCwgMHgxZjA0LCAweDZiMzcsIDB4ODA4NiwgMHg4MThlLCAweDAwMDUsCisJMHgwMTU2LCAweDIwYTksIDB4MDAxMCwgMHhhMDA1LCAweDAxYjgsIDB4YTExYSwgMHgxMmE4LCAweDgyMTMsCisJMHg4MThkLCAweDAyMjgsIDB4YTExYSwgMHgxMjIwLCAweDFmMDQsIDB4NmI0NywgMHgwMDI4LCAweGExMWEsCisJMHgyMzA4LCAweDgyMTAsIDB4MWYwNCwgMHg2YjQ3LCAweDAwMDYsIDB4MzIwMCwgMHhhMDg0LCAweGVmZmYsCisJMHgyMDgwLCAweDAwMGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAwMDYsIDB4MzIwMCwgMHhhMDg1LCAweDEwMDAsCisJMHgwY2I4LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDIwNzksIDB4YjdlMCwgMHgwMTJlLCAweDAwZDYsCisJMHgyMDY5LCAweGI3ZTAsIDB4NjgwMywgMHgwMDA1LCAweDIwNjksIDB4MDAwNCwgMHgyZDA0LCAweGEwODUsCisJMHg4MDAxLCAweDIwNmEsIDB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4NjAyNywgMHgwMDAxLCAweDc4MDQsCisJMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHg2Yjg1LCAweDZiYTYsIDB4NmJmOSwgMHg2YjhiLCAweDZiYTYsCisJMHg2Yjg1LCAweDZiODMsIDB4NmI4MywgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg2YTEwLCAweDA4MGMsCisJMHg3MTczLCAweDAwY2UsIDB4MDAwNSwgMHg2MmMwLCAweDgyZmYsIDB4MTExMCwgMHgwMGNlLCAweDAwMDUsCisJMHgyMDExLCAweDRhZGMsIDB4MDgwYywgMHg2OTljLCAweDc4MjgsIDB4YTA5MiwgMHgwMGM4LCAweDEyMjgsCisJMHg4MDAwLCAweDc4MmEsIDB4MDgwYywgMHg0YjE2LCAweDBjODgsIDB4MDgwYywgMHg0YWRjLCAweDc4MDcsCisJMHgwMDAzLCAweDc4MjcsIDB4MDAwMCwgMHg3ODJiLCAweDAwMDAsIDB4MGM0MCwgMHgwODBjLCAweDZhMTAsCisJMHgzYzAwLCAweDAwMDYsIDB4MjAxMSwgMHgwMjA5LCAweDIwZTEsIDB4NDAwMCwgMHgyMjE0LCAweDAwMGUsCisJMHgyMGUwLCAweDgyZmYsIDB4MDE3OCwgMHg2MmMwLCAweDgyZmYsIDB4MTE2MCwgMHg3ODJiLCAweDAwMDAsCisJMHg3ODI0LCAweGEwNjUsIDB4MDkwYywgMHgxNTE1LCAweDIwMDksIDB4MDAxMywgMHgwODBjLCAweDg2NGMsCisJMHgwMGNlLCAweDAwMDUsIDB4MzkwMCwgMHhhMDgyLCAweGI5MmMsIDB4MTIxMCwgMHgwODBjLCAweDgzMzIsCisJMHgwMGM2LCAweDc4MjQsIDB4YTA2NSwgMHgwOTBjLCAweDE1MTUsIDB4NzgwNCwgMHhhMDg2LCAweDAwMDQsCisJMHgwOTA0LCAweDZjMzksIDB4NzgyOCwgMHhhMDkyLCAweDI3MTAsIDB4MTIzMCwgMHg4MDAwLCAweDc4MmEsCisJMHgwMGNlLCAweDA4MGMsIDB4N2Q2ZCwgMHgwYzIwLCAweDYxMDQsIDB4YTE4NiwgMHgwMDAzLCAweDExODgsCisJMHgwMGU2LCAweDIwNzEsIDB4YjUwMCwgMHg3MGUwLCAweDAwZWUsIDB4ZDA4YywgMHgwMTUwLCAweDAwYzYsCisJMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGI1MDAsIDB4MDgwYywgMHg0YjFmLCAweDAwZWUsCisJMHgwMGNlLCAweDA4MGMsIDB4YjQ0NCwgMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHg4NjRjLCAweDAwY2UsCisJMHgwODM4LCAweDIwMDEsIDB4YjdmYywgMHgyMDAzLCAweDAwMDAsIDB4NjJjMCwgMHg4MmZmLCAweDExNjAsCisJMHg3ODJiLCAweDAwMDAsIDB4NzgyNCwgMHhhMDY1LCAweDA5MGMsIDB4MTUxNSwgMHgyMDA5LCAweDAwMTMsCisJMHgwODBjLCAweDg2YTAsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgzOTAwLCAweGEwODIsCisJMHhiOTJjLCAweDEyMTAsIDB4MDgwYywgMHg4MzMyLCAweDc4MjQsIDB4YTAwNSwgMHgwOTBjLCAweDE1MTUsCisJMHg3ODFjLCAweGEwNmQsIDB4MDkwYywgMHgxNTE1LCAweDY4MDAsIDB4YzBkYywgMHg2ODAyLCAweDc5MjQsCisJMHgyMTYwLCAweDA4MGMsIDB4ODYxZCwgMHg2OTNjLCAweDgxZmYsIDB4MDkwYywgMHgxNTE1LCAweDgxMDksCisJMHg2OTNlLCAweDY4NTQsIDB4YTAxNSwgMHgwMTEwLCAweDdhMWUsIDB4MDAxMCwgMHg3OTE4LCAweDc5MWUsCisJMHg3ODA3LCAweDAwMDAsIDB4NzgyNywgMHgwMDAwLCAweDAwZGUsIDB4MDBjZSwgMHgwODBjLCAweDcxNzMsCisJMHgwODg4LCAweDYxMDQsIDB4YTE4NiwgMHgwMDAyLCAweDAxMjgsIDB4YTE4NiwgMHgwMDA0LCAweDAxMTAsCisJMHgwODA0LCAweDZiZDIsIDB4NzgwOCwgMHhhYzA2LCAweDA5MDQsIDB4NmJkMiwgMHgwODBjLCAweDcwOTAsCisJMHgwODBjLCAweDZjZDMsIDB4MDBjZSwgMHgwODBjLCAweDcxNzMsIDB4MDgwNCwgMHg2YmMwLCAweDAwYzYsCisJMHg2MDI3LCAweDAwMDIsIDB4NjJjOCwgMHg2MGM0LCAweGEyMDUsIDB4MTE3OCwgMHg3OTNjLCAweGExZTUsCisJMHgwMDAwLCAweDAxMzAsIDB4MjAwOSwgMHgwMDQ5LCAweDA4MGMsIDB4ODY0YywgMHgwMGNlLCAweDAwMDUsCisJMHgyMDExLCAweGI3ZmYsIDB4MjAxMywgMHgwMDAwLCAweDBjYzgsIDB4MzkwOCwgMHhhMTkyLCAweGI5MmMsCisJMHgxMjEwLCAweDA4MGMsIDB4ODMzMiwgMHg3OTNjLCAweDgxZmYsIDB4MGQ5MCwgMHg3OTQ0LCAweGExOTIsCisJMHg3NTMwLCAweDEyYjgsIDB4ODEwOCwgMHg3OTQ2LCAweDc5M2MsIDB4YTE4OCwgMHgwMDA3LCAweDIxMGMsCisJMHhhMThlLCAweDAwMDYsIDB4MTEzOCwgMHg2MDE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMTIsCisJMHg2MDE2LCAweDA4ZTAsIDB4NjAxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDE2LCAweDYwMTYsCisJMHgwOGE4LCAweDc4NDgsIDB4YzA4NSwgMHg3ODRhLCAweDA4ODgsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweGI3ZTAsCisJMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDEwLCAweGEwMDUsIDB4MDE0OCwgMHhhMDgwLCAweDAwMDMsCisJMHgyMTAyLCAweDYxMTIsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDYxMTYsCisJMHg2MTEyLCAweDBjYzAsIDB4MDBkNiwgMHgyMDY5LCAweGI3ZTAsIDB4NjAwMCwgMHhkMGQ0LCAweDAxNjgsCisJMHg2ODIwLCAweDgwMDAsIDB4NjgyMiwgMHhhMDg2LCAweDAwMDEsIDB4MTExMCwgMHgyYzAwLCAweDY4MWUsCisJMHg2ODA0LCAweGEwODQsIDB4MDAwNywgMHgwODA0LCAweDcxNzksIDB4YzBkNSwgMHg2MDAyLCAweDY4MTgsCisJMHhhMDA1LCAweDAxNTgsIDB4NjA1NiwgMHg2MDViLCAweDAwMDAsIDB4MDAwNiwgMHgyYzAwLCAweDY4MWEsCisJMHgwMGRlLCAweDY4NWEsIDB4MjA2OSwgMHhiN2UwLCAweDBjMTgsIDB4NjA1NiwgMHg2MDVhLCAweDJjMDAsCisJMHg2ODFhLCAweDY4MWUsIDB4MDhlOCwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwMGYsIDB4MDAwMCwgMHgyYzA4LCAweDIwNjEsIDB4YjdlMCwgMHg2MDIwLCAweDgwMDAsCisJMHg2MDIyLCAweDYwMDgsIDB4YTAwNSwgMHgwMTQ4LCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMGEsCisJMHgwMTJlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4NjEwZSwgMHg2MTBhLCAweDBjYzAsCisJMHgwMGM2LCAweDYwMGYsIDB4MDAwMCwgMHgyYzA4LCAweDIwNjEsIDB4YjdlMCwgMHg2MDM0LCAweGEwMDUsCisJMHgwMTMwLCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMzYsIDB4MDBjZSwgMHgwMDA1LCAweDYxM2EsCisJMHg2MTM2LCAweDBjZDgsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNjYsCisJMHgwMDU2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwgMHhhMDJlLCAweDIwNzEsCisJMHhiN2UwLCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLCAweDA5MDQsCisJMHg2ZDdiLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgxOTA0LCAweDZkNzYsCisJMHg4N2ZmLCAweDAxMjAsIDB4NjA1MCwgMHhhMTA2LCAweDE5MDQsIDB4NmQ3NiwgMHg3MDNjLCAweGFjMDYsCisJMHgxMTkwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2ZlNCwgMHg3MDMzLCAweDAwMDAsCisJMHg3MDNmLCAweDAwMDAsIDB4NzA0MywgMHgwMDAwLCAweDcwNDcsIDB4MDAwMCwgMHg3MDRiLCAweDAwMDAsCisJMHgwMDNlLCAweDIwMjksIDB4MDAwMSwgMHg3MDM4LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsCisJMHg3MDM0LCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsCisJMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsCisJMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHg5YzVhLCAweDAxYzgsCisJMHg2MDEwLCAweDIwNjgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsIDB4MTU4MCwgMHg2ODM3LCAweDAxMDMsCisJMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDA3NiwgMHgwODBjLCAweDllY2MsCisJMHgwODBjLCAweGIzODAsIDB4MDgwYywgMHg1NDA4LCAweDAwN2UsIDB4MDAzZSwgMHgwMDFlLCAweDA4MGMsCisJMHg5ZTExLCAweDA4MGMsIDB4OWUxZCwgMHgwMGNlLCAweDA4MDQsIDB4NmQxNiwgMHgyYzc4LCAweDYwMGMsCisJMHgyMDYwLCAweDA4MDQsIDB4NmQxNiwgMHg4NWZmLCAweDAxMjAsIDB4MDAzNiwgMHgwODBjLCAweDcyMzAsCisJMHgwMDNlLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMDVlLCAweDAwNmUsCisJMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFjLCAweGEwODYsCisJMHgwMDA2LCAweDExNTgsIDB4MDAxNiwgMHgwMDM2LCAweDAwNzYsIDB4MDgwYywgMHhiMzgwLCAweDA4MGMsCisJMHhiMDk5LCAweDAwN2UsIDB4MDAzZSwgMHgwMDFlLCAweDA4YTAsIDB4NjAxYywgMHhhMDg2LCAweDAwMGEsCisJMHgwOTA0LCAweDZkNjAsIDB4MDgwNCwgMHg2ZDVlLCAweDAwMDYsIDB4MDA2NiwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGY2LCAweDIwMzEsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweGI3ZTAsCisJMHg3ODM4LCAweGEwNjUsIDB4MDU2OCwgMHg2MDBjLCAweDAwMDYsIDB4NjAwZiwgMHgwMDAwLCAweDc4M2MsCisJMHhhYzA2LCAweDExODAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg3ZmU0LCAweDc4MzMsCisJMHgwMDAwLCAweDc4M2YsIDB4MDAwMCwgMHg3ODQzLCAweDAwMDAsIDB4Nzg0NywgMHgwMDAwLCAweDc4NGIsCisJMHgwMDAwLCAweDAwM2UsIDB4MDgwYywgMHg5YzVhLCAweDAxNzgsIDB4NjAxMCwgMHgyMDY4LCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDMsIDB4MTFiMCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsCisJMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZTExLCAweDA4MGMsIDB4OWUxZCwgMHgwMDBlLCAweDA4ODgsCisJMHg3ZTNhLCAweDdlMzYsIDB4MDEyZSwgMHgwMGZlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDZlLCAweDAwMGUsCisJMHgwMDA1LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhiMDk5LCAweDBjNjAsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwYSwgMHgwZDA4LCAweDA4ZjAsIDB4MDAxNiwgMHgwMDI2LCAweDAwODYsCisJMHgyMDQxLCAweDAwMDAsIDB4MDA5OSwgMHgwODBjLCAweDZlYzMsIDB4MDA4ZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDEyNiwgMHgyMDc5LCAweGI3ZTAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg2ZjUwLCAweDA4MGMsIDB4NmZjMiwgMHgwMTJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGI3ZTAsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDZlOTksCisJMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEyMDYsIDB4MTkwNCwgMHg2ZTk0LCAweDg4ZmYsCisJMHgwMTIwLCAweDYwNTAsIDB4YTEwNiwgMHgxOTA0LCAweDZlOTQsIDB4NzAyNCwgMHhhYzA2LCAweDE1MzgsCisJMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAxZjAsIDB4MDgwYywgMHg2YTEwLCAweDA4MGMsCisJMHg3ZDdhLCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsCisJMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg2ODAzLCAweDAxMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsCisJMHgwMDAxLCAweDAwM2UsIDB4MDAyMCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwNGU4LCAweDcwMTQsCisJMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4YWMzNiwgMHgxMTQwLCAweDJjMDAsCisJMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDEyLCAweDAwMTAsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsCisJMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsCisJMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDFiOCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAzLCAweDE1NDAsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDAwMTYsCisJMHgwMDM2LCAweDAwODYsIDB4MDgwYywgMHg5ZWNjLCAweDA4MGMsIDB4YjM4MCwgMHgwODBjLCAweDU0MDgsCisJMHgwMDhlLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLCAweDllMTEsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsCisJMHg4MTFlLCAweDAwY2UsIDB4MDgwNCwgMHg2ZTFkLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsCisJMHg2ZTFkLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MTE1OCwgMHgwMDE2LCAweDAwMzYsCisJMHgwMDg2LCAweDA4MGMsIDB4YjM4MCwgMHgwODBjLCAweGIwOTksIDB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsCisJMHgwOGUwLCAweDYwMWMsIDB4YTA4NiwgMHgwMDAyLCAweDExMjgsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsCisJMHgwOTA4LCAweDA4OTgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDUsIDB4MTk3OCwgMHg2MDA0LCAweGEwODYsCisJMHgwMDg1LCAweDBkMjAsIDB4MDg1MCwgMHgwMGM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHhhMjgwLCAweGI2MzUsIDB4MjAwNCwgMHhhMDY1LCAweDA5MDQsIDB4NmY0YywgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwNjYsIDB4MjA3MSwgMHhiN2UwLCAweDY2NTQsIDB4NzAxOCwgMHhhYzA2LCAweDExMDgsCisJMHg3NjFhLCAweDcwMWMsIDB4YWMwNiwgMHgxMTMwLCAweDg2ZmYsIDB4MTExOCwgMHg3MDE4LCAweDcwMWUsCisJMHgwMDA4LCAweDc2MWUsIDB4NjA1OCwgMHhhMDdkLCAweDAxMDgsIDB4N2U1NiwgMHhhNmVkLCAweDAwMDAsCisJMHgwMTEwLCAweDJmMDAsIDB4Njg1YSwgMHg2MDU3LCAweDAwMDAsIDB4NjA1YiwgMHgwMDAwLCAweDYwMDAsCisJMHhjMGQ0LCAweGMwZGMsIDB4NjAwMiwgMHgwODBjLCAweDRlZDQsIDB4MDkwNCwgMHg2ZjQ4LCAweDc2MjQsCisJMHg4NmZmLCAweDA1ZTgsIDB4YTY4MCwgMHgwMDA0LCAweDIwMDQsIDB4YWQwNiwgMHgxNWMwLCAweDAwZDYsCisJMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDA1NDgsIDB4MDgwYywgMHg2YTEwLCAweDA4MGMsCisJMHg3ZDdhLCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsCisJMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDEyMCwgMHg2ODAzLCAweDAxMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsCisJMHgwMDAxLCAweDAwM2UsIDB4MDBkZSwgMHgwMGM2LCAweDYwM2MsIDB4YTAwNSwgMHgwMTEwLCAweDgwMDEsCisJMHg2MDNlLCAweDI2NjAsIDB4MDgwYywgMHg5ZTFkLCAweDAwY2UsIDB4MDA0OCwgMHgwMGRlLCAweDAwYzYsCisJMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDAwY2UsIDB4MDgwNCwgMHg2ZWYzLCAweDhkZmYsCisJMHgwMTU4LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDllY2MsCisJMHgwODBjLCAweGIzODAsIDB4MDgwYywgMHg1NDA4LCAweDA4MGMsIDB4ODExZSwgMHgwODA0LCAweDZlZjMsCisJMHgwMDZlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwNjYsIDB4MDBjNiwgMHgwMGQ2LCAweDIwMzEsIDB4MDAwMCwgMHg3ODE0LCAweGEwNjUsCisJMHgwOTA0LCAweDZmYTIsIDB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODI0LCAweGFjMDYsCisJMHgxNTQwLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDFmMCwgMHgwODBjLCAweDZhMTAsCisJMHgwODBjLCAweDdkN2EsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4ODI0ZCwgMHg3ODI3LCAweDAwMDAsCisJMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDY4MDMsCisJMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsCisJMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMDI4LCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDJjMzAsCisJMHgwMGIwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDE2OCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAzLCAweDExYjgsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsCisJMHg1NDA4LCAweDA4MGMsIDB4OWUxMSwgMHgwODBjLCAweDllMWQsIDB4MDgwYywgMHg4MTFlLCAweDAwMGUsCisJMHgwODA0LCAweDZmNTcsIDB4N2UxNiwgMHg3ZTEyLCAweDAwZGUsIDB4MDBjZSwgMHgwMDZlLCAweDAwMGUsCisJMHgwMDA1LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhiMDk5LCAweDBjNTgsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwMiwgMHgxMTI4LCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LCAweDA5ZDAsCisJMHgwYzEwLCAweDYwMWMsIDB4YTA4NiwgMHgwMDA1LCAweDE5ZjAsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsCisJMHgwZDYwLCAweDA4YzgsIDB4MDAwNiwgMHgwMDY2LCAweDAwYzYsIDB4MDBkNiwgMHg3ODE4LCAweGEwNjUsCisJMHgwOTA0LCAweDcwMjgsIDB4NjA1NCwgMHgwMDA2LCAweDYwNTcsIDB4MDAwMCwgMHg2MDViLCAweDAwMDAsCisJMHg2MDAwLCAweGMwZDQsIDB4YzBkYywgMHg2MDAyLCAweDA4MGMsIDB4NGVkNCwgMHgwOTA0LCAweDcwMjUsCisJMHg3ZTI0LCAweDg2ZmYsIDB4MDVlOCwgMHhhNjgwLCAweDAwMDQsIDB4MjAwNCwgMHhhZDA2LCAweDE1YzAsCisJMHgwMGQ2LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDU0OCwgMHgwODBjLCAweDZhMTAsCisJMHgwODBjLCAweDdkN2EsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4ODI0ZCwgMHg3ODI3LCAweDAwMDAsCisJMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDY4MDMsCisJMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsCisJMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMGRlLCAweDAwYzYsIDB4NjAzYywgMHhhMDA1LCAweDAxMTAsCisJMHg4MDAxLCAweDYwM2UsIDB4MjY2MCwgMHgwODBjLCAweDllMWQsIDB4MDBjZSwgMHgwMDQ4LCAweDAwZGUsCisJMHgwMGM2LCAweDI2NjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwODA0LCAweDZmZDQsCisJMHg4ZGZmLCAweDAxMzgsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsCisJMHg1NDA4LCAweDA4MGMsIDB4ODExZSwgMHgwODA0LCAweDZmZDQsIDB4MDAwZSwgMHgwODA0LCAweDZmYzcsCisJMHg3ODFlLCAweDc4MWEsIDB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwNjYsIDB4NjAwMCwgMHhkMGRjLCAweDAxYTAsIDB4NjA0YywgMHhhMDZkLCAweDAxODgsCisJMHg2ODQ4LCAweGE2MDYsIDB4MTE3MCwgMHgyMDcxLCAweGI3ZTAsIDB4NzAyNCwgMHhhMDM1LCAweDAxNDgsCisJMHhhMDgwLCAweDAwMDQsIDB4MjAwNCwgMHhhZDA2LCAweDExMjAsIDB4NjAwMCwgMHhjMGRjLCAweDYwMDIsCisJMHgwMDIxLCAweDAwNmUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsCisJMHg3OGMwLCAweGEwMDUsIDB4MTEzOCwgMHgwMGM2LCAweDI2NjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsCisJMHgwMGNlLCAweDA0YTAsIDB4MDgwYywgMHg3ZDdhLCAweDc4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsCisJMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDc5LCAweDAxNDAsIDB4N2IwNCwgMHhhMzg0LCAweDEwMDAsCisJMHgwMTIwLCAweDc4MDMsIDB4MDEwMCwgMHg3ODAzLCAweDAwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsCisJMHhkMDg0LCAweDAxMTAsIDB4NzgyNywgMHgwMDAxLCAweDA4MGMsIDB4ODI0ZCwgMHgwMDNlLCAweDA4MGMsCisJMHg0ZWQ0LCAweDAwYzYsIDB4NjAzYywgMHhhMDA1LCAweDAxMTAsIDB4ODAwMSwgMHg2MDNlLCAweDI2NjAsCisJMHgwODBjLCAweDg2MWQsIDB4MDBjZSwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsCisJMHgwODBjLCAweDllY2MsIDB4MDgwYywgMHg1NDA4LCAweDA4MGMsIDB4ODExZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGU2LCAweDAwYzYsIDB4MjA3MSwgMHhiN2UwLCAweDcwMDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwMDIsCisJMHg3MGEyLCAweDcwYTUsIDB4NzBiYiwgMHg3MGQ0LCAweDcxMTEsIDB4NzBhMiwgMHg3MGEwLCAweDcwYTAsCisJMHgwODBjLCAweDE1MTUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4NzAyNCwgMHhhMDY1LCAweDAxNDgsCisJMHg3MDIwLCAweDgwMDEsIDB4NzAyMiwgMHg2MDBjLCAweGEwMTUsIDB4MDE1MCwgMHg3MjE2LCAweDYwMGYsCisJMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsCisJMHg3MjE2LCAweDcyMTIsIDB4MGNiMCwgMHg2MDE4LCAweDIwNjAsIDB4MDgwYywgMHg0ZWQ0LCAweDYwMDAsCisJMHhjMGRjLCAweDYwMDIsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4MDEyMCwgMHg2MDU0LCAweGEwMTUsCisJMHgwMTQwLCAweDcyMWUsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDcyMTgsIDB4NzIxZSwgMHgwY2IwLCAweDcwMjQsIDB4YTA2NSwgMHgwNWI4LCAweDcwMGMsCisJMHhhYzA2LCAweDExNjAsIDB4MDgwYywgMHg4MTFlLCAweDYwMGMsIDB4YTAxNSwgMHgwMTIwLCAweDcyMGUsCisJMHg2MDBmLCAweDAwMDAsIDB4MDQ0OCwgMHg3MjBlLCAweDcyMGEsIDB4MDQzMCwgMHg3MDE0LCAweGFjMDYsCisJMHgxMTYwLCAweDA4MGMsIDB4ODExZSwgMHg2MDBjLCAweGEwMTUsIDB4MDEyMCwgMHg3MjE2LCAweDYwMGYsCisJMHgwMDAwLCAweDAwZDAsIDB4NzIxNiwgMHg3MjEyLCAweDAwYjgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDMsCisJMHgxMTk4LCAweDYwMTgsIDB4MjA2MCwgMHgwODBjLCAweDRlZDQsIDB4NjAwMCwgMHhjMGRjLCAweDYwMDIsCisJMHgwODBjLCAweDgxMWUsIDB4NzAxYywgMHhhMDY1LCAweDAxMzgsIDB4NjA1NCwgMHhhMDE1LCAweDAxMTAsCisJMHg3MjFlLCAweDAwMTAsIDB4NzIxOCwgMHg3MjFlLCAweDcwMjcsIDB4MDAwMCwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDcwMjQsIDB4YTA2NSwgMHgwMTQwLCAweDA4MGMsIDB4ODExZSwgMHg2MDBjLCAweGEwMTUsCisJMHgwMTUwLCAweDcyMGUsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4ODI0ZCwgMHg3MDI3LCAweDAwMDAsCisJMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHg3MjBlLCAweDcyMGEsIDB4MGNiMCwgMHgwMGQ2LCAweDIwNjksCisJMHhiN2UwLCAweDY4MzAsIDB4YTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4NzEzMywgMHg3MTM1LCAweDcxNTksCisJMHg3MTMxLCAweDA4MGMsIDB4MTUxNSwgMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwgMHg2ODQwLCAweGEwODYsCisJMHgwMDAxLCAweDAxYjgsIDB4NjgzYywgMHhhMDY1LCAweDAxMzAsIDB4NjAwYywgMHhhMDE1LCAweDAxNzAsCisJMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDIwMTEsCisJMHhiN2ZmLCAweDIwMTMsIDB4MDAwMCwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODNhLCAweDY4MzYsCisJMHgwYzkwLCAweDY4NDMsIDB4MDAwMCwgMHg2ODM4LCAweGEwNjUsIDB4MGQ2OCwgMHg2MDAzLCAweDAwMDMsCisJMHgwYzUwLCAweDAwYzYsIDB4Njg0MywgMHgwMDAwLCAweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDAsCisJMHg2ODNjLCAweGEwNjUsIDB4MDE2OCwgMHg2MDBjLCAweGEwMTUsIDB4MDEzMCwgMHg2YTNhLCAweDYwMGYsCisJMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgwMDIwLCAweDY4M2YsIDB4MDAwMCwgMHg2ODNhLCAweDY4MzYsCisJMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4YjdlMCwgMHg2ODA0LCAweGEwODQsCisJMHgwMDA3LCAweDAwMDIsIDB4NzE4NCwgMHg3MjIwLCAweDcyMjAsIDB4NzIyMCwgMHg3MjIwLCAweDcyMjIsCisJMHg3MTgyLCAweDcxODIsIDB4MDgwYywgMHgxNTE1LCAweDY4MjAsIDB4YTAwNSwgMHgxMTEwLCAweDAwZGUsCisJMHgwMDA1LCAweDAwYzYsIDB4NjgwYywgMHhhMDY1LCAweDAxNTAsIDB4NjgwNywgMHgwMDA0LCAweDY4MjYsCisJMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg3MjcyLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4MTQsCisJMHhhMDY1LCAweDAxNTAsIDB4NjgwNywgMHgwMDAxLCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsCisJMHg3MjcyLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAzNiwgMHg2YTFjLCAweGEyZjUsCisJMHgwMDAwLCAweDA5MDQsIDB4NzIxYywgMHg3MDRjLCAweGEwMGQsIDB4MDExOCwgMHg3MDg4LCAweGEwMDUsCisJMHgwMWEwLCAweDcwNTQsIDB4YTA3NSwgMHgwMTIwLCAweGEyMGUsIDB4MDkwNCwgMHg3MjFjLCAweDAwMjgsCisJMHg2ODE4LCAweGEyMGUsIDB4MDkwNCwgMHg3MjFjLCAweDIwNzAsIDB4NzA0YywgMHhhMDBkLCAweDBkODgsCisJMHg3MDg4LCAweGEwMDUsIDB4MWQ3MCwgMHgyZTAwLCAweDY4MWUsIDB4NzMzYywgMHg3MDM4LCAweGEzMDIsCisJMHgxZTQwLCAweDA4MGMsIDB4ODVmNCwgMHgwOTA0LCAweDcyMWMsIDB4ODMxOCwgMHg3MzNlLCAweDYxMTIsCisJMHgyZTEwLCAweDYyMWEsIDB4YTE4MCwgMHgwMDE0LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDYwNWEsCisJMHhhMTgwLCAweDAwMTQsIDB4MjAwMywgMHgwMDAwLCAweGExODAsIDB4MDAxNSwgMHgyMDA0LCAweGEwOGEsCisJMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LCAweDgwMDMsIDB4ODAxYiwgMHg4MzFiLCAweGEzMTgsCisJMHg2MzE2LCAweDAwM2UsIDB4MDBmNiwgMHgyYzc4LCAweDcxYTAsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsCisJMHhkMGFjLCAweDExMTAsIDB4ZDFiYywgMHgwMTUwLCAweDcxMDAsIDB4ZDFmNCwgMHgwMTIwLCAweDcxMTQsCisJMHhhMThjLCAweDAwZmYsIDB4MDA0MCwgMHgyMDA5LCAweDAwMDAsIDB4MDAyOCwgMHhhMWUwLCAweDJkYzQsCisJMHgyYzBkLCAweGExOGMsIDB4MDBmZiwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHgwODBjLCAweDc4YTIsCisJMHg3MzAwLCAweGMzZGQsIDB4NzMwMiwgMHg2ODA3LCAweDAwMDIsIDB4MmYxOCwgMHg2YjI2LCAweDY4MmIsCisJMHgwMDAwLCAweDc4MWYsIDB4MDAwMywgMHg3ODAzLCAweDAwMDEsIDB4NzgwNywgMHgwMDQwLCAweDAwZmUsCisJMHgwMGVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwM2UsIDB4MDBlZSwgMHgwMGNlLCAweDBjZDAsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwgMHg2ODBjLCAweGEwNjUsIDB4MDEzOCwgMHg2ODA3LCAweDAwMDQsCisJMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLCAweDcyNzIsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMGY2LCAweDAwZDYsIDB4MjA2OSwgMHhiN2UwLCAweDY4MzAsIDB4YTA4NiwgMHgwMDAwLCAweDExZDAsCisJMHgyMDAxLCAweGI1MGMsIDB4MjAwYywgMHhkMWJjLCAweDE1NjAsIDB4NjgzOCwgMHhhMDdkLCAweDAxOTAsCisJMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwgMHg2ODQ3LCAweDAwMDAsIDB4Njg0YiwgMHgwMDAwLCAweDAxMjYsCisJMHgwMGY2LCAweDIwOTEsIDB4MjQwMCwgMHgwMDJlLCAweDA4MGMsIDB4MjAyMSwgMHgxMTMwLCAweDAxMmUsCisJMHgwODBjLCAweDdiZWIsIDB4MDBkZSwgMHgwMGZlLCAweDAwMDUsIDB4MDEyZSwgMHhlMDAwLCAweDY4NDMsCisJMHgwMDAwLCAweDc4MDMsIDB4MDAwMiwgMHg3ODBjLCAweGEwMTUsIDB4MDE0MCwgMHg2YTNhLCAweDc4MGYsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MGM2MCwgMHg2ODNhLCAweDY4MzYsCisJMHgwY2MwLCAweGMxYmMsIDB4MjEwMiwgMHgwMDY2LCAweDIwMzEsIDB4MDAwMSwgMHgwODBjLCAweDViNTEsCisJMHgwMDZlLCAweDA4NTgsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MDAwYiwgMHgwMDA1LCAweDcyODAsCisJMHg3Mjg1LCAweDc3NDMsIDB4Nzg1ZiwgMHg3Mjg1LCAweDc3NDMsIDB4Nzg1ZiwgMHg3MjgwLCAweDcyODUsCisJMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsCisJMHgwMGM2LCAweDAwZjYsIDB4NjAwNCwgMHhhMDhhLCAweDAwODAsIDB4MWEwYywgMHgxNTE1LCAweDYxMTgsCisJMHgyMTc4LCAweDc5YTAsIDB4MjAxMSwgMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLCAweGQxYmMsCisJMHgwMTUwLCAweDc5MDAsIDB4ZDFmNCwgMHgwMTIwLCAweDc5MTQsIDB4YTE4YywgMHgwMGZmLCAweDAwNDAsCisJMHgyMDA5LCAweDAwMDAsIDB4MDAyOCwgMHhhMWY4LCAweDJkYzQsIDB4MmYwZCwgMHhhMThjLCAweDAwZmYsCisJMHgyYzc4LCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweGEwOGEsIDB4MDA0MCwgMHgxYTA0LCAweDcyZjksCisJMHgwMDMzLCAweDAwZmUsIDB4MDBjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMDA1LCAweDczYTgsCisJMHg3M2YzLCAweDc0MjAsIDB4NzRlZCwgMHg3NTFiLCAweDc1MjMsIDB4NzU0OSwgMHg3NTVhLCAweDc1NmIsCisJMHg3NTczLCAweDc1ODksIDB4NzU3MywgMHg3NWVhLCAweDc1NWEsIDB4NzYwYiwgMHg3NjEzLCAweDc1NmIsCisJMHg3NjEzLCAweDc2MjQsIDB4NzJmNywgMHg3MmY3LCAweDcyZjcsIDB4NzJmNywgMHg3MmY3LCAweDcyZjcsCisJMHg3MmY3LCAweDcyZjcsIDB4NzJmNywgMHg3MmY3LCAweDcyZjcsIDB4N2U4NSwgMHg3ZWFhLCAweDdlYmYsCisJMHg3ZWUyLCAweDdmMDMsIDB4NzU0OSwgMHg3MmY3LCAweDc1NDksIDB4NzU3MywgMHg3MmY3LCAweDc0MjAsCisJMHg3NGVkLCAweDcyZjcsIDB4ODM0ZiwgMHg3NTczLCAweDcyZjcsIDB4ODM2ZiwgMHg3NTczLCAweDcyZjcsCisJMHg3NTZiLCAweDczYTEsIDB4NzMwYywgMHg3MmY3LCAweDgzOTQsIDB4ODQwOSwgMHg4NGUwLCAweDcyZjcsCisJMHg4NGYxLCAweDc1NDQsIDB4ODUwZCwgMHg3MmY3LCAweDdmMTgsIDB4ODU2OCwgMHg3MmY3LCAweDA4MGMsCisJMHgxNTE1LCAweDIxMDAsIDB4MDAzMywgMHgwMGZlLCAweDAwY2UsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMDA1LCAweDczMGEsIDB4NzMwYSwgMHg3MzBhLCAweDczNDAsIDB4NzM1ZSwgMHg3Mzc0LCAweDczMGEsCisJMHg3MzBhLCAweDczMGEsIDB4MDgwYywgMHgxNTE1LCAweDAwZDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NjQxLCAweDc4MTAsIDB4MjA2OCwgMHgyMGEzLCAweDI0MTQsIDB4MjBhMywgMHgwMDE4LCAweDIwYTMsCisJMHgwODAwLCAweDY4M2MsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2ODUwLCAweDIwYTIsIDB4Njg1NCwgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTgsIDB4MDgwYywgMHg3ZDY3LCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4NzgxOCwgMHgyMDY4LCAweDY4YTAsIDB4MjA2OSwgMHhiNTAwLCAweDZhZDQsCisJMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTEwLCAweGEwODUsIDB4MDAwMSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMGQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2NDEsIDB4MjBhMywgMHgwNTAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MTAsIDB4YTBlOCwgMHgwMDBmLCAweDY4MDgsIDB4MjBhMiwgMHg2ODBjLCAweDIwYTIsCisJMHg2ODEwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDY4MTgsIDB4MjBhMiwgMHg2ODFjLCAweDIwYTIsCisJMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg3ZDY3LCAweDAwZGUsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDIwYTMsIDB4NzgwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODA4LCAweDgwMDcsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDA4LCAweDA4MGMsCisJMHg3ZDY3LCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsCisJMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMjAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweGRmMTAsCisJMHgyMGEzLCAweDAwMzQsIDB4MjA5OSwgMHhiNTA1LCAweDIwYTksIDB4MDAwNCwgMHg1M2E2LCAweDIwOTksCisJMHhiNTAxLCAweDIwYTksIDB4MDAwNCwgMHg1M2E2LCAweDIwOTksIDB4YjdjNiwgMHgyMGE5LCAweDAwMWEsCisJMHgzMzA0LCAweDgwMDcsIDB4MjBhMiwgMHg5Mzk4LCAweDFmMDQsIDB4NzM5MCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDRjLCAweDA4MGMsIDB4N2Q2NywgMHgwMTRlLCAweDAxNWUsCisJMHgwMDA1LCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LCAweDYwOWEsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDIwYTMsIDB4NTIwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgwMGQ2LCAweDIwNjksIDB4YjU1MiwgMHg2ODA0LCAweGQwODQsIDB4MDE1MCwgMHg2ODI4LCAweDIwYTMsCisJMHgwMDAwLCAweDAwMTYsIDB4MDgwYywgMHgyODMxLCAweDIxYTIsIDB4MDAxZSwgMHgwMGRlLCAweDAwMjgsCisJMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksCisJMHhiNTA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YjUwMSwgMHg1M2E2LCAweDIwMDEsCisJMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDgyLCAweDAwN2YsIDB4MDIzOCwgMHgyMDAxLCAweGI1MWMsIDB4MjBhNiwgMHgyMDAxLCAweGI1MWQsCisJMHgyMGE2LCAweDAwNDAsIDB4MjBhMywgMHgwMDAwLCAweDIwMDEsIDB4YjUxNSwgMHgyMDA0LCAweGEwODQsCisJMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsCisJMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDIwYTMsCisJMHgwNTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDExMzgsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsIDB4MDA3ZiwgMHgwMjM4LCAweDIwMDEsCisJMHhiNTFjLCAweDIwYTYsIDB4MjAwMSwgMHhiNTFkLCAweDIwYTYsIDB4MDA0MCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDAxLCAweGI1MTUsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGI1MDUsIDB4NTNhNiwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDAwYzYsIDB4NzgxOCwgMHgyMDYwLCAweDIwMDEsCisJMHgwMDAwLCAweDA4MGMsIDB4NTMxMywgMHgwMGNlLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg2LCAweDAwN2UsIDB4MTEzMCwgMHgyMGEzLCAweDA0MDAsIDB4NjIwYywgMHhjMmI0LCAweDYyMGUsCisJMHgwMDEwLCAweDIwYTMsIDB4MDMwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwODYsIDB4MDA3ZSwgMHgxOTA0LCAweDc0YWYsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsCisJMHhkMGE0LCAweDAxYzgsIDB4MjA5OSwgMHhiNzhlLCAweDMzYTYsIDB4OTM5OCwgMHgyMGEzLCAweDAwMDAsCisJMHg5Mzk4LCAweDMzMDQsIDB4YTA4NCwgMHgyMDAwLCAweDIwYTIsIDB4OTM5OCwgMHgzM2E2LCAweDkzOTgsCisJMHgyMGEzLCAweDAwMDAsIDB4OTM5OCwgMHgyMDAxLCAweDI3MTAsIDB4MjBhMiwgMHg5Mzk4LCAweDMzYTYsCisJMHg5Mzk4LCAweDMzYTYsIDB4MDBkMCwgMHgyMDk5LCAweGI3OGUsIDB4MzNhNiwgMHg5Mzk4LCAweDMzYTYsCisJMHg5Mzk4LCAweDMzMDQsIDB4MDgwYywgMHg1YWNmLCAweDExMTgsIDB4YTA4NCwgMHgzN2ZmLCAweDAwMTAsCisJMHhhMDg0LCAweDNmZmYsIDB4MjBhMiwgMHg5Mzk4LCAweDMzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksCisJMHhiNTA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YjUwMSwgMHg1M2E2LCAweDIwYTksCisJMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LCAweDc0ODksIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsCisJMHgwMDAwLCAweDFmMDQsIDB4NzQ4ZiwgMHgyMDk5LCAweGI3OTYsIDB4MzMwNCwgMHhjMGRkLCAweDIwYTIsCisJMHgyMDAxLCAweGI1NzIsIDB4MjAwNCwgMHhkMGU0LCAweDAxNTgsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDkzOTgsIDB4OTM5OCwgMHg5Mzk4LCAweDMzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDAwMTAsCisJMHgyMGE5LCAweDAwMDcsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NzRhYSwgMHgwNDY4LCAweDIwMDEsCisJMHhiNTM1LCAweDIwMDQsIDB4ZDBhNCwgMHgwMTQwLCAweDIwMDEsIDB4Yjc4ZiwgMHgyMDA0LCAweDYwZTMsCisJMHgwMDAwLCAweDA4MGMsIDB4Mjg3MiwgMHg2MGUyLCAweDIwOTksIDB4Yjc4ZSwgMHgyMGE5LCAweDAwMDgsCisJMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGI1MDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGI1MDEsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsCisJMHg3NGNkLCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg3NGQzLCAweDIwOTksCisJMHhiNzk2LCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsCisJMHgxZjA0LCAweDc0ZGUsIDB4MjBhOSwgMHgwMDBhLCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LCAweDc0ZTQsCisJMHg2MGMzLCAweDAwNzQsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NjQxLCAweDIwYTMsIDB4MjAxMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwODAwLCAweDIwYTMsCisJMHgyMDAwLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDAwZjYsCisJMHgyMDc5LCAweGI1NTIsIDB4NzkwNCwgMHgwMGZlLCAweGQxYWMsIDB4MTExMCwgMHhhMDg1LCAweDAwMjAsCisJMHhkMWE0LCAweDAxMTAsIDB4YTA4NSwgMHgwMDEwLCAweGEwODUsIDB4MDAwMiwgMHgwMGQ2LCAweDA4MDQsCisJMHg3NWNjLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDIwYTMsCisJMHg1MDAwLCAweDA4MDQsIDB4NzQzYiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NjQxLCAweDIwYTMsCisJMHgyMTEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE0LCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2ZDUsCisJMHgwMDIwLCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMjAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDA0LCAweDA4MGMsCisJMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAxMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAzLCAweDIwYTMsIDB4MmEwMCwgMHg2MGMzLCAweDAwMDgsCisJMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsCisJMHgwMjAwLCAweDA4MDQsIDB4NzQzYiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsCisJMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODI4LCAweGEwMDUsIDB4MDExMCwgMHgyMGEyLCAweDAwMTAsCisJMHgyMGEzLCAweDAwMDMsIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDdkNjcsCisJMHgwMDA1LCAweDAwZDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAyMTAsCisJMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwODAwLCAweDc4MTgsIDB4MjA2OCwgMHg2ODk0LCAweGEwODYsCisJMHgwMDE0LCAweDExOTgsIDB4Njk5YywgMHhhMTg0LCAweDAwMzAsIDB4MDE5MCwgMHg2OTk4LCAweGExODQsCisJMHhjMDAwLCAweDExNDAsIDB4ZDFlYywgMHgwMTE4LCAweDIwYTMsIDB4MjEwMCwgMHgwMDU4LCAweDIwYTMsCisJMHgwMTAwLCAweDAwNDAsIDB4MjBhMywgMHgwNDAwLCAweDAwMjgsIDB4MjBhMywgMHgwNzAwLCAweDAwMTAsCisJMHg3MDBmLCAweDA4MDAsIDB4YTAwNiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsCisJMHgwMGY2LCAweDIwNzksIDB4YjU1MiwgMHg3OTA0LCAweDAwZmUsIDB4ZDFhYywgMHgxMTEwLCAweGEwODUsCisJMHgwMDIwLCAweGQxYTQsIDB4MDExMCwgMHhhMDg1LCAweDAwMTAsIDB4MjAwOSwgMHhiNTc0LCAweDIxMGMsCisJMHhkMTg0LCAweDExMTAsIDB4YTA4NSwgMHgwMDAyLCAweDAwMjYsIDB4MjAwOSwgMHhiNTcyLCAweDIxMGMsCisJMHhkMWU0LCAweDAxMzAsIDB4YzBjNSwgMHhhMDk0LCAweDAwMzAsIDB4YTI5NiwgMHgwMDEwLCAweDAxNDAsCisJMHhkMWVjLCAweDAxMzAsIDB4YTA5NCwgMHgwMDMwLCAweGEyOTYsIDB4MDAxMCwgMHgwMTA4LCAweGMwYmQsCisJMHgwMDJlLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDdkNjcsCisJMHgwMGRlLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAyMTAsCisJMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsCisJMHgwMjAwLCAweDA4MDQsIDB4NzNhZSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsCisJMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgyYTAwLCAweDYwYzMsCisJMHgwMDA4LCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMGIsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDdkNjcsCisJMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MzIwMCwgMHgyMDIxLCAweDA4MDAsCisJMHgwMDM4LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MjIwMCwgMHgyMDIxLCAweDAxMDAsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsCisJMHhhMjg2LCAweDAwN2UsIDB4MTFhMCwgMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmUsCisJMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhiNTE1LCAweDIyMTQsIDB4MjAwMSwgMHhiNzllLCAweDIwMDQsCisJMHhhMDA1LCAweDAxMTgsIDB4MjAxMSwgMHhiNTFkLCAweDIyMTQsIDB4MjJhMiwgMHgwNGQwLCAweGEyODYsCisJMHgwMDdmLCAweDExMzgsIDB4MDBkNiwgMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmQsCisJMHgwMGM4LCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LCAweGQwYWMsIDB4MTExMCwgMHhkMmJjLCAweDAxYzgsCisJMHhhMjg2LCAweDAwODAsIDB4MDBkNiwgMHgxMTMwLCAweGEzODUsIDB4MDBmZiwgMHgyMGEyLCAweDIwYTMsCisJMHhmZmZjLCAweDAwNDAsIDB4YTJlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhiNTFjLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsCisJMHgwMDgwLCAweDAwZDYsIDB4YTJlOCwgMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhiNTE1LCAweDIyMTQsCisJMHgyMmEyLCAweGE0ODUsIDB4MDAyOSwgMHgyMGEyLCAweDAwNGUsIDB4MDAzZSwgMHgyMGEzLCAweDAwMDAsCisJMHgwODBjLCAweDdkNTYsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHgyMGEzLCAweGZmZmYsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMDI2LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMGEzLCAweDAyZmYsIDB4MjAxMSwgMHhmZmZjLCAweDIyYTIsCisJMHgwMGQ2LCAweDIwNjksIDB4YjUxYywgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDIwYTMsCisJMHgyMDI5LCAweDIwYTMsIDB4MDAwMCwgMHgwOGUwLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweGZjMDIsIDB4MjBhMywgMHgwMDAwLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsCisJMHgyMDE5LCAweDMzMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwMzgsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsCisJMHgyMDE5LCAweDIzMDAsIDB4MjAyMSwgMHgwMTAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweDIwMTEsIDB4YjUzNSwgMHgyMjE0LCAweGQyYWMsCisJMHgxMTE4LCAweGEwOTIsIDB4MDA3ZSwgMHgwMmQ4LCAweDAwZDYsIDB4YTBlOCwgMHhiNjM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4NjgxMCwgMHhhMDA1LCAweDExNDAsCisJMHg2ODE0LCAweGEwMDUsIDB4MTEyOCwgMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZlLCAweDAwMjgsCisJMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDgwLCAweDAwZDYsCisJMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLCAweGE0ODUsCisJMHgwMDk4LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDAwNGUsIDB4MDAzZSwgMHgwODBjLCAweDdkNTYsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MDAyZSwgMHgwMDA1LCAweDA4MGMsIDB4N2Q1NiwgMHgyMmEyLCAweDIwYTMsCisJMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHg3ODEwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZjYsIDB4NjAwNCwgMHhhMDhhLCAweDAwODUsCisJMHgwYTBjLCAweDE1MTUsIDB4YTA4YSwgMHgwMDhjLCAweDFhMGMsIDB4MTUxNSwgMHg2MTE4LCAweDIxNzgsCisJMHg3OWEwLCAweDIwMTEsIDB4YjUzNSwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMWJjLCAweDAxNTAsCisJMHg3OTAwLCAweGQxZjQsIDB4MDEyMCwgMHg3OTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLCAweDIwMDksCisJMHgwMDAwLCAweDAwMjgsIDB4YTFmOCwgMHgyZGM0LCAweDJmMGQsIDB4YTE4YywgMHgwMGZmLCAweDJjNzgsCisJMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDgyLCAweDAwODUsIDB4MDAxYiwgMHgwMGZlLCAweDAwY2UsCisJMHgwMDA1LCAweDc3N2EsIDB4Nzc4NCwgMHg3NzlmLCAweDc3NzgsIDB4Nzc3OCwgMHg3Nzc4LCAweDc3N2EsCisJMHgwODBjLCAweDE1MTUsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDRhMSwgMHg2MGMzLCAweDAwMDAsCisJMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMDA1LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3N2ViLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLCAweDc4MTAsCisJMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwYywgMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMDA1LCAweDAxNDYsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3ODI1LCAweDIwYTMsIDB4MDAwMywgMHgyMGEzLCAweDAzMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAwNCwgMHgwODBjLCAweDdkNjcsCisJMHgwMTRlLCAweDAwMDUsIDB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsCisJMHhhMDkyLCAweDAwN2UsIDB4MDI4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDgxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhiNTFjLCAweDJkYTYsCisJMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhiNjM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4ODEwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsCisJMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIyYTIsIDB4MjBhMywgMHgwMDA5LCAweDIwYTMsCisJMHgwMDAwLCAweDA4MDQsIDB4NzZhOCwgMHgwMDI2LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweDIwMTEsIDB4YjUzNSwgMHgyMjE0LCAweGQyYWMsCisJMHgxMTE4LCAweGEwOTIsIDB4MDA3ZSwgMHgwMjg4LCAweDAwZDYsIDB4YTBlOCwgMHhiNjM1LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4ODQwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGI1MWMsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDAwODgsIDB4MDBkNiwgMHhhMGU4LCAweGI2MzUsCisJMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4NDAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsCisJMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhiNTE1LCAweDIyMTQsIDB4MjJhMiwgMHgyMDAxLCAweDAwOTksCisJMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgwODA0LCAweDc3MzQsIDB4MDAyNiwgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGI1MzUsCisJMHgyMjE0LCAweGQyYWMsIDB4MTExOCwgMHhhMDkyLCAweDAwN2UsIDB4MDI4OCwgMHgwMGQ2LCAweGEwZTgsCisJMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsCisJMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4ODUwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIyYTIsCisJMHgyMDAxLCAweDAwOTksIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MDgwNCwgMHg3NzM0LCAweDAwYzYsCisJMHgwMGY2LCAweDJjNzgsIDB4NzgwNCwgMHhhMDhhLCAweDAwNDAsIDB4MGEwYywgMHgxNTE1LCAweGEwOGEsCisJMHgwMDUzLCAweDFhMGMsIDB4MTUxNSwgMHg3OTE4LCAweDIxNjAsIDB4NjFhMCwgMHgyMDExLCAweGI1MzUsCisJMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMWJjLCAweDAxNTAsIDB4NjEwMCwgMHhkMWY0LCAweDAxMjAsCisJMHg2MTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLCAweDIwMDksIDB4MDAwMCwgMHgwMDI4LCAweGExZTAsCisJMHgyZGM0LCAweDJjMGQsIDB4YTE4YywgMHgwMGZmLCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweGEwODIsCisJMHgwMDQwLCAweDAwMWIsIDB4MDBmZSwgMHgwMGNlLCAweDAwMDUsIDB4NzhhMiwgMHg3OWFlLCAweDc5NGIsCisJMHg3YjYwLCAweDc4YTAsIDB4NzhhMCwgMHg3OGEwLCAweDc4YTAsIDB4NzhhMCwgMHg3OGEwLCAweDc4YTAsCisJMHg4MGQ3LCAweDgwZTcsIDB4ODBmNywgMHg4MTA3LCAweDc4YTAsIDB4ODUxZSwgMHg3OGEwLCAweDgwYzYsCisJMHgwODBjLCAweDE1MTUsIDB4MDBkNiwgMHgwMTU2LCAweDAxNDYsIDB4NzgwYiwgMHhmZmZmLCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzkwMiwgMHg3OTEwLCAweDIxNjgsIDB4Njk0OCwgMHg3OTUyLCAweDIxYTIsCisJMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDY5NGMsIDB4YTE4NCwgMHgwMDBmLCAweDExMTgsCisJMHgyMDAxLCAweDAwMDUsIDB4MDA0MCwgMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMTgsCisJMHhhMDg0LCAweDAwMDYsIDB4ODAwNCwgMHgwMDE2LCAweDIwMDgsIDB4Nzg1OCwgMHhhMDg0LCAweDAwZmYsCisJMHg4MDA3LCAweGExMDUsIDB4MDAxZSwgMHgyMGEyLCAweGQxYWMsIDB4MDExOCwgMHgyMGEzLCAweDAwMDIsCisJMHgwMDQ4LCAweGQxYjQsIDB4MDExOCwgMHgyMGEzLCAweDAwMDEsIDB4MDAyMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMjMwLCAweDAwMTAsIDB4NmE4MCwgMHg2ZTdjLCAweDIwYTksIDB4MDAwOCwgMHgwMTM2LCAweGFkODgsCisJMHgwMDE3LCAweDIxOTgsIDB4MjBhMSwgMHgwMjFiLCAweDUzYTYsIDB4MDEzZSwgMHgyMGExLCAweDAyMGIsCisJMHgyMmEyLCAweDI2YTIsIDB4NjBjMywgMHgwMDIwLCAweDIwZTEsIDB4OTA4MCwgMHg2MDE0LCAweGEwODQsCisJMHgwMDA0LCAweGEwODUsIDB4MDAwOSwgMHg2MDE2LCAweDIwMDEsIDB4YjdmYywgMHgyMDAzLCAweDA3ZDAsCisJMHgyMDAxLCAweGI3ZmIsIDB4MjAwMywgMHgwMDA5LCAweDA4MGMsIDB4MTdlMiwgMHgwMTRlLCAweDAxNWUsCisJMHgwMGRlLCAweDAwMDUsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3YTE4LCAweGEyODAsCisJMHgwMDIzLCAweDIwMTQsIDB4ODIxMCwgMHhhMjk0LCAweDAwZmYsIDB4MjIwMiwgMHg4MjE3LCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDE5LCAweGI1MzUsIDB4MjMxYywgMHhkM2FjLCAweDExMTAsCisJMHhkMGJjLCAweDAxODgsIDB4MDBkNiwgMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHgwNjAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YjUxYywgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDA2MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDA5LCAweGI1MTUsIDB4MjEwYywgMHgyMWEyLCAweDIwYTMsIDB4MDgyOSwgMHgyMGEzLCAweDAwMDAsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyZmEyLCAweDIwYTMsIDB4ZmZmZiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDIwYTEsCisJMHgwMjBiLCAweDAwYzEsIDB4NzgxMCwgMHgyMDY4LCAweDY4NjAsIDB4MjBhMiwgMHg2ODVjLCAweDIwYTIsCisJMHg2ODgwLCAweDIwYTIsIDB4Njg3YywgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwYywgMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMGRlLCAweDAwMDUsIDB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsCisJMHhkMGJjLCAweDAxODgsIDB4MDBkNiwgMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHgwNTAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YjUxYywgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDAwZGUsIDB4MDA4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDA1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDExLCAweGI1MTUsIDB4MjIxNCwgMHgyMmEyLCAweDIwYTMsIDB4MDg4OSwgMHgyMGEzLCAweDAwMDAsCisJMHgwODBjLCAweDdkNTYsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDJmYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxNTYsCisJMHgwMTM2LCAweDAxNDYsIDB4NzgxMCwgMHhhMGVjLCAweGYwMDAsIDB4MDE2OCwgMHhhMDZkLCAweDA4MGMsCisJMHg1MzAxLCAweDAxNDgsIDB4Njg0YywgMHhhMDg0LCAweDIwMjAsIDB4YTA4NiwgMHgyMDIwLCAweDExMTgsCisJMHg3ODIwLCAweGMwY2QsIDB4NzgyMiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3YjE2LCAweGEwMTYsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NzgxMCwgMHhhMDg0LCAweGYwMDAsCisJMHgxMTMwLCAweDc4MTAsIDB4YTA4NCwgMHgwNzAwLCAweDgwMDcsIDB4MDA0MywgMHgwMDEwLCAweGEwMDYsCisJMHgwMDJiLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwZGUsIDB4MDAwNSwgMHg3OWU4LCAweDdhN2QsCisJMHg3YThkLCAweDdhYmYsIDB4N2FkMiwgMHg3YWVkLCAweDdhZjYsIDB4NzllNiwgMHgwODBjLCAweDE1MTUsCisJMHgwMDE2LCAweDAwMzYsIDB4Njk0YywgMHhhMThjLCAweDAwMDMsIDB4MDExOCwgMHhhMTg2LCAweDAwMDMsCisJMHgxMTcwLCAweDZiNzgsIDB4NzgyMCwgMHhkMGNjLCAweDAxMDgsIDB4YzNlNSwgMHgyM2EyLCAweDY4NjgsCisJMHgyMGEyLCAweDY4NjQsIDB4MjBhMiwgMHgwMDNlLCAweDAwMWUsIDB4MDgwNCwgMHg3YWM5LCAweGExODYsCisJMHgwMDAxLCAweDE5MGMsIDB4MTUxNSwgMHg2Yjc4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMzZTUsCisJMHgyM2EyLCAweDY4NjgsIDB4MjBhMiwgMHg2ODY0LCAweDIwYTIsIDB4MjJhMiwgMHg2ODc0LCAweDIwYTIsCisJMHgyMmEyLCAweDY4N2MsIDB4MjBhMiwgMHgyMDA5LCAweDAwMTgsIDB4YTM4NCwgMHgwMzAwLCAweDA5MDQsCisJMHg3YTc3LCAweGQzYzQsIDB4MDExMCwgMHg2ODdjLCAweGExMDgsIDB4ZDNjYywgMHgwMTEwLCAweDY4NzQsCisJMHhhMTA4LCAweDAxNTYsIDB4MjBhOSwgMHgwMDBkLCAweGFkODAsIDB4MDAyMCwgMHgyMDFjLCAweDgzMWYsCisJMHgyM2EyLCAweDgwMDAsIDB4MWYwNCwgMHg3YTI2LCAweDAxNWUsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsCisJMHhhMTg0LCAweDAwMDMsIDB4MDkwNCwgMHg3YTc3LCAweDIwYTEsIDB4MDIwYiwgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4MDAwNiwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweDIwMTEsCisJMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLCAweGQwYmMsIDB4MDE4OCwgMHgwMGQ2LCAweGEwZTgsCisJMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsCisJMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIyYTIsCisJMHgwMDBlLCAweDdiMjAsIDB4ZDNjYywgMHgwMTE4LCAweDIwYTMsIDB4MDg4OSwgMHgwMDEwLCAweDIwYTMsCisJMHgwODk4LCAweDIwYTIsIDB4MDgwYywgMHg3ZDU2LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDYxYzIsCisJMHgwMDNlLCAweDAwMWUsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjAxMSwgMHgwMDA4LCAweDIwMDEsCisJMHhiNTBkLCAweDIwMDQsIDB4ZDBmNCwgMHgwMTEwLCAweDIwMTEsIDB4MDAyOCwgMHg3ODIwLCAweGQwY2MsCisJMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDA0ZDAsIDB4MjAxMSwgMHgwMzAyLCAweDAwMTYsCisJMHgwMDM2LCAweDc4MjgsIDB4NzkyYywgMHhhMTFkLCAweDAxMDgsIDB4YzJkZCwgMHg3YjIwLCAweGQzY2MsCisJMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHgyMGEyLCAweDIxYTIsIDB4MDAzZSwgMHgwMDFlLCAweGEwMTYsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAxMiwgMHgyMmEyLCAweDIwYTMsIDB4MDAwOCwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHg3MDAwLCAweDIwYTMsIDB4MDUwMCwgMHgyMmEyLCAweDIwYTMsCisJMHgwMDBhLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDI1MDAsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDMyLCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDIwMTEsCisJMHgwMDI4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDE4LCAweDA4MGMsCisJMHg3ZDY3LCAweDAwMDUsIDB4MjAxMSwgMHgwMTAwLCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsCisJMHgyMmEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsCisJMHgwMDA4LCAweDIyYTIsIDB4Nzg1NCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHgyMmEyLCAweDIyYTIsCisJMHg2MGMzLCAweDAwMjAsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjAxMSwgMHgwMDA4LCAweDc4MjAsCisJMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwgMHgyMmEyLCAweGEwMTYsIDB4MDg4OCwgMHgwMDM2LCAweDdiMTAsCisJMHhhMzg0LCAweGZmMDAsIDB4NzgxMiwgMHhhMzg0LCAweDAwZmYsIDB4ODAwMSwgMHgxMTM4LCAweDc4MjAsCisJMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwgMHgyMmEyLCAweDAwM2UsIDB4MDgwOCwgMHgwMDQ2LCAweDIwMjEsCisJMHgwODAwLCAweDAwMDYsIDB4NzgyMCwgMHhkMGNjLCAweDAwMGUsIDB4MDEwOCwgMHhjNGU1LCAweDI0YTIsCisJMHgwMDRlLCAweDIyYTIsIDB4MjBhMiwgMHgwMDNlLCAweDA4MDQsIDB4N2FjOSwgMHgwMDI2LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweDIwMTEsCisJMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLCAweGQwYmMsIDB4MDE4OCwgMHgwMGQ2LCAweGEwZTgsCisJMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsCisJMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDcwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIyYTIsCisJMHg3ODIwLCAweGQwY2MsIDB4MDExOCwgMHgyMGEzLCAweDA4ODksIDB4MDAxMCwgMHgyMGEzLCAweDA4OTgsCisJMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ZDU2LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDdhMDgsCisJMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDUsCisJMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAwMTYsIDB4MDAzNiwgMHg3ODEwLCAweGEwODQsCisJMHgwNzAwLCAweDgwMDcsIDB4MDAzYiwgMHgwMDNlLCAweDAwMWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMGRlLCAweDAwMDUsIDB4N2I3YSwgMHg3YjdhLCAweDdiN2MsIDB4N2I3YSwgMHg3YjdhLCAweDdiN2EsCisJMHg3YjllLCAweDdiN2EsIDB4MDgwYywgMHgxNTE1LCAweDc5MTAsIDB4YTE4YywgMHhmOGZmLCAweGExOGQsCisJMHgwNjAwLCAweDc5MTIsIDB4MjBhMSwgMHgwMjBiLCAweDIwMDksIDB4MDAwMywgMHgwMGY5LCAweDAwZDYsCisJMHgyMDY5LCAweGI1NTIsIDB4NjgwNCwgMHhkMGJjLCAweDAxMzAsIDB4NjgyYywgMHhhMDg0LCAweDAwZmYsCisJMHg4MDA3LCAweDIwYTIsIDB4MDAxMCwgMHgyMGEzLCAweDNmMDAsIDB4MDBkZSwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDYwYzMsIDB4MDAwMSwgMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsCisJMHgyMDA5LCAweDAwMDMsIDB4MDAxOSwgMHgyMGEzLCAweDdmMDAsIDB4MGM4MCwgMHgwMDI2LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweDIwMTEsCisJMHhiNTM1LCAweDIyMTQsIDB4ZDJhYywgMHgxMTEwLCAweGQwYmMsIDB4MDE4OCwgMHgwMGQ2LCAweGEwZTgsCisJMHhiNjM1LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDAxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsCisJMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDEwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsIDB4YjUxNSwgMHgyMjE0LCAweDIyYTIsCisJMHgyMGEzLCAweDA4ODgsIDB4YTE4ZCwgMHgwMDA4LCAweDIxYTIsIDB4MDgwYywgMHg3ZDU2LCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDU2LCAweDAwNDYsCisJMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGI1MDAsIDB4NzE1NCwgMHg3ODE4LCAweDIwNjgsCisJMHg2OGEwLCAweDIwMjgsIDB4NzZkNCwgMHhkNmFjLCAweDExMzAsIDB4ZDBiYywgMHgxMTIwLCAweDY5MTAsCisJMHg2YTE0LCAweDc0NTQsIDB4MDAyMCwgMHg2OTEwLCAweDZhMTQsIDB4NzM3MCwgMHg3NDc0LCAweDc4MWMsCisJMHhhMGJlLCAweDAwMDYsIDB4MDkwNCwgMHg3Y2ExLCAweGEwYmUsIDB4MDAwYSwgMHgxNWU4LCAweGExODUsCisJMHgwMjAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NjA3MywgMHgyMDI5LCAweDYwNzcsCisJMHgwMDAwLCAweDY4OGMsIDB4ODAwMCwgMHhhMDg0LCAweDAwZmYsIDB4Njg4ZSwgMHg4MDA3LCAweDYwN2EsCisJMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwgMHg2MDgyLCAweDc4MDgsIDB4NjA4NiwgMHg3ODEwLCAweDIwNzAsCisJMHg3MDE0LCAweDYwOGEsIDB4NzAxMCwgMHg2MDhlLCAweDcwMGMsIDB4NjBjNiwgMHg3MDA4LCAweDYwY2EsCisJMHg2ODZjLCAweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHg2MDlmLCAweDAwMDAsCisJMHgwODBjLCAweDg1YjksIDB4MjAwOSwgMHgwN2QwLCAweDYwYzQsIDB4YTA4NCwgMHhmZmYwLCAweGEwMDUsCisJMHgwMTEwLCAweDIwMDksIDB4MWI1OCwgMHgwODBjLCAweDZhMTUsIDB4MDAzZSwgMHgwMDRlLCAweDAwNWUsCisJMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDcwZDQsIDB4ZDBhYywgMHgxMTEwLCAweGQ1YmMsCisJMHgwMTM4LCAweGExODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDAwMzgsCisJMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2NDZlLCAweDYwNzMsCisJMHgwODA5LCAweDYwNzcsIDB4MDAwOCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsCisJMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsIDB4NjA4MiwgMHg3ODA4LCAweDYwODYsCisJMHg3ODEwLCAweDIwNzAsIDB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsCisJMHg3MDA4LCAweDYwY2EsIDB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsCisJMHhhNTgyLCAweDAwODAsIDB4MDI0OCwgMHg2YTAwLCAweGQyZjQsIDB4MDEyMCwgMHg2YTE0LCAweGEyOTQsCisJMHgwMGZmLCAweDAwMTAsIDB4MjAxMSwgMHgwMDAwLCAweDYyOWUsIDB4MDgwYywgMHg4NWI5LCAweDIwMDksCisJMHgwN2QwLCAweDYwYzQsIDB4YTA4NCwgMHhmZmYwLCAweGEwMDUsIDB4MDExMCwgMHgyMDA5LCAweDFiNTgsCisJMHgwODBjLCAweDZhMTUsIDB4MDAzZSwgMHgwMDRlLCAweDAwNWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMDA1LCAweDc4MTAsIDB4MjA3MCwgMHg3MDRjLCAweGEwODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDIsCisJMHgwOTA0LCAweDdjZjcsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxMTEwLCAweGQ1YmMsCisJMHgwMTM4LCAweGExODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDAwMzgsCisJMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2NDZlLCAweDYwNzMsCisJMHgwODgwLCAweDYwNzcsIDB4MDAwOCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsCisJMHg4MDA3LCAweDYwN2EsIDB4NzgzNCwgMHg2MDdlLCAweDJmMDAsIDB4NjA4NiwgMHg3ODA4LCAweDYwODIsCisJMHg3MDYwLCAweDYwOGEsIDB4NzA1YywgMHg2MDhlLCAweDcwODAsIDB4NjBjNiwgMHg3MDdjLCAweDYwY2EsCisJMHg3MDdjLCAweDc5MmMsIDB4YTEwOCwgMHg3OTJlLCAweDcwODAsIDB4NzkyOCwgMHhhMTA5LCAweDc5MmEsCisJMHg2ODZjLCAweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhhNTgyLCAweDAwODAsCisJMHgwMjQ4LCAweDZhMDAsIDB4ZDJmNCwgMHgwMTIwLCAweDZhMTQsIDB4YTI5NCwgMHgwMGZmLCAweDAwMTAsCisJMHgyMDExLCAweDAwMDAsIDB4NjI5ZSwgMHgwODBjLCAweDg1YjYsIDB4MDgwNCwgMHg3YzhmLCAweDIwMDEsCisJMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxMTEwLCAweGQ1YmMsIDB4MDEzOCwgMHhhMTg1LCAweDA3MDAsCisJMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDAwMzgsIDB4YTE4NSwgMHgwNzAwLCAweDYwNjIsCisJMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2NDZlLCAweDA4MGMsIDB4NTMwMSwgMHgwMTgwLCAweDAwZDYsCisJMHg3ODEwLCAweGEwNmQsIDB4Njg0YywgMHgwMGRlLCAweGEwODQsIDB4MjAyMCwgMHhhMDg2LCAweDIwMjAsCisJMHgxMTMwLCAweDc4MjAsIDB4YzBjZCwgMHg3ODIyLCAweDYwNzMsIDB4MDg4OSwgMHgwMDEwLCAweDYwNzMsCisJMHgwODk4LCAweDYwNzcsIDB4MDAwMCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsCisJMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsIDB4NjA4NiwgMHg3ODA4LCAweDYwODIsCisJMHg3MDE0LCAweDYwOGEsIDB4NzAxMCwgMHg2MDhlLCAweDcwMGMsIDB4NjBjNiwgMHg3MDA4LCAweDYwY2EsCisJMHg2ODZjLCAweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhhNTgyLCAweDAwODAsCisJMHgwMjQ4LCAweDZhMDAsIDB4ZDJmNCwgMHgwMTIwLCAweDZhMTQsIDB4YTI5NCwgMHgwMGZmLCAweDAwMTAsCisJMHgyMDExLCAweDAwMDAsIDB4NjI5ZSwgMHg3ODIwLCAweGQwY2MsIDB4MDEyMCwgMHgwODBjLCAweDg1YjksCisJMHgwODA0LCAweDdjOGYsIDB4MDgwYywgMHg4NWI2LCAweDA4MDQsIDB4N2M4ZiwgMHg3YTE4LCAweGEyODAsCisJMHgwMDIzLCAweDIwMTQsIDB4ODIxMCwgMHhhMjk0LCAweDAwZmYsIDB4MjIwMiwgMHg4MjE3LCAweDAwMDUsCisJMHgwMGQ2LCAweDIwNjksIDB4YjdlMCwgMHg2ODQzLCAweDAwMDEsIDB4MDBkZSwgMHgwMDA1LCAweDIwZTEsCisJMHg5MDgwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDAxOSwgMHgwODBjLCAweDZhMDcsCisJMHgwMDA1LCAweDAwMDYsIDB4NjAxNCwgMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDA5LCAweDYwMTYsCisJMHgwMDBlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LCAweDAwMDYsIDB4MjA2MSwgMHgwMTAwLCAweDYxYTQsCisJMHg2MGE3LCAweDk1ZjUsIDB4NjAxNCwgMHhhMDg0LCAweDAwMDQsIDB4YTA4NSwgMHgwMDA4LCAweDYwMTYsCisJMHgwMDBlLCAweGUwMDAsIDB4ZTAwMCwgMHhlMDAwLCAweGUwMDAsIDB4NjFhNiwgMHgwMGNlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDA4MGMsIDB4NWFjZiwgMHgxMTk4LCAweDIwMDEsIDB4YjdmYywgMHgyMDA0LCAweGEwMDUsCisJMHgxNWI4LCAweDAwNjYsIDB4MjAzMSwgMHgwMDAxLCAweDA4MGMsIDB4NWI1MSwgMHgwMDZlLCAweDExMTgsCisJMHgwODBjLCAweDZhMDcsIDB4MDQ2OCwgMHgwMGM2LCAweDIwNjEsIDB4YjdlMCwgMHgwMGQ4LCAweDY5MDQsCisJMHhhMTk0LCAweDQwMDAsIDB4MDU1MCwgMHgwODMxLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgwMGM2LCAweDIwNjEsIDB4YjdlMCwgMHg2MTI4LCAweGExOTIsIDB4MDBjOCwgMHgxMjU4LCAweDgxMDgsCisJMHg2MTJhLCAweDYxMjQsIDB4MDBjZSwgMHg4MWZmLCAweDAxOTgsIDB4MDgwYywgMHg2YTA3LCAweDA4MGMsCisJMHg3ZDcxLCAweDAwNzAsIDB4NjEyNCwgMHhhMWU1LCAweDAwMDAsIDB4MDE0MCwgMHgwODBjLCAweGI0NDQsCisJMHgwODBjLCAweDZhMTAsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4ODY0YywgMHgwMGNlLCAweDAwMDAsCisJMHgwMDJlLCAweDAwMWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MjAwMSwgMHhiN2ZjLCAweDIwMDQsCisJMHhhMDA1LCAweDFkYjAsIDB4MDBjNiwgMHgyMDYxLCAweGI3ZTAsIDB4NjEyOCwgMHhhMTkyLCAweDAwMDMsCisJMHgxZTA4LCAweDgxMDgsIDB4NjEyYSwgMHgwMGNlLCAweDA4MGMsIDB4NmEwNywgMHgwODBjLCAweDRiMWYsCisJMHgwYzM4LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDZhMWQsCisJMHgyMDcxLCAweGI3ZTAsIDB4NzEzYywgMHg4MWZmLCAweDA1OTAsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDA4MGMsIDB4NWFjZiwgMHgxMWE4LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsCisJMHg3ZmU0LCAweDAwM2UsIDB4NzEzYywgMHgyMTYwLCAweDA4MGMsIDB4YjQ0NCwgMHgyMDA5LCAweDAwNGEsCisJMHgwODBjLCAweDg2NGMsIDB4MDA2NiwgMHgyMDMxLCAweDAwMDEsIDB4MDgwYywgMHg1YjUxLCAweDAwNmUsCisJMHgwMGIwLCAweDY5MDQsIDB4YTE5NCwgMHg0MDAwLCAweDAxYzAsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsCisJMHgwMDAwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2ZlNCwgMHgwMDNlLCAweDcxM2MsCisJMHgyMTYwLCAweDA4MGMsIDB4YjQ0NCwgMHgyMDA5LCAweDAwNGEsIDB4MDgwYywgMHg4NjRjLCAweDAwMmUsCisJMHgwMDFlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MGM1OCwgMHgwMDI2LCAweDAwZTYsCisJMHgyMDcxLCAweGI3ZTAsIDB4NzA0OCwgMHhkMDg0LCAweDAxYzAsIDB4NzEzYywgMHg4MWZmLCAweDAxYTgsCisJMHgyMDcxLCAweDAxMDAsIDB4YTE4OCwgMHgwMDA3LCAweDIxMTQsIDB4YTI4ZSwgMHgwMDA2LCAweDExMzgsCisJMHg3MDE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMTIsIDB4NzAxNiwgMHgwMDMwLCAweDcwMTQsCisJMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDE2LCAweDcwMTYsIDB4MDBlZSwgMHgwMDJlLCAweDAwMDUsCisJMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDA2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NjAxOCwgMHgyMDY4LCAweDZjYTAsIDB4MjA3MSwgMHhiN2UwLCAweDcwMTgsCisJMHgyMDY4LCAweDhkZmYsIDB4MDE4OCwgMHg2OGEwLCAweGE0MDYsIDB4MDExOCwgMHg2ODU0LCAweDIwNjgsCisJMHgwY2MwLCAweDYwMTAsIDB4MjA2MCwgMHg2NDNjLCAweDY1NDAsIDB4NjY0OCwgMHgyZDYwLCAweDA4MGMsCisJMHg1MTFhLCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDAwZSwgMHgwMDRlLCAweDAwNWUsCisJMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NjQxLCAweDIwYTMsIDB4MTIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MWMsCisJMHhhMDg2LCAweDAwMDQsIDB4MTExMCwgMHg2MDk4LCAweDAwMTgsIDB4MjAwMSwgMHhiNTE1LCAweDIwMDQsCisJMHgyMGEyLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsCisJMHgyMGEyLCAweDFmMDQsIDB4N2VhMCwgMHgyMGEyLCAweDIwYTIsIDB4NjBjMywgMHgwMDJjLCAweDA4MGMsCisJMHg3ZDY3LCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2NDEsCisJMHgyMGEzLCAweDBmMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LCAweDIwYTIsCisJMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ZDY3LCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2ZGQsIDB4MjBhMywgMHgwMjAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweGI1NDAsIDB4MjAxOSwgMHhiNTQxLCAweDIzYTYsCisJMHgyMmE2LCAweGEzOTgsIDB4MDAwMiwgMHhhMjkwLCAweDAwMDIsIDB4MWYwNCwgMHg3ZWNmLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsIDB4MDgwYywgMHg3ZDY3LCAweDAxNGUsCisJMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDAwMTYsIDB4MDAyNiwgMHgyMGExLCAweDAyMGIsCisJMHgwODBjLCAweDc2YjYsIDB4MDgwYywgMHg3NmNjLCAweDc4MTAsIDB4YTA4MCwgMHgwMDAwLCAweDIwMDQsCisJMHhhMDgwLCAweDAwMTUsIDB4MjA5OCwgMHg3ODA4LCAweGEwODgsIDB4MDAwMiwgMHgyMWE4LCAweDUzYTYsCisJMHhhMDgwLCAweDAwMDQsIDB4ODAwMywgMHg2MGMyLCAweDA4MGMsIDB4N2Q2NywgMHgwMDJlLCAweDAwMWUsCisJMHgwMTRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NjQxLCAweDIwYTMsIDB4NjIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MDgsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDdkNjcsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsCisJMHgwMTU2LCAweDAxNDYsIDB4MDAxNiwgMHgwMDI2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2NDEsCisJMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LCAweGEwODAsIDB4MDAxNywgMHgyMDk4LCAweDc4MDgsCisJMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LCAweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweDdkNjcsCisJMHgwMDJlLCAweDAwMWUsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwMDYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGI3ZTAsIDB4NzAwYywgMHgyMDYwLCAweDhjZmYsCisJMHgwMTc4LCAweDA4MGMsIDB4OWU1OCwgMHgxMTEwLCAweDA4MGMsIDB4OGMxOSwgMHg2MDBjLCAweDAwMDYsCisJMHgwODBjLCAweGEwMWYsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4ODExZSwgMHgwMGNlLCAweDBjNzgsCisJMHg3MDBmLCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwMjYsCisJMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDEwMCwgMHgyMDc5LCAweDAxNDAsCisJMHgyMDcxLCAweGI3ZTAsIDB4NzAyNCwgMHgyMDYwLCAweDhjZmYsIDB4MDVhMCwgMHgwODBjLCAweDdkN2EsCisJMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg2YTEwLCAweDIwMDksIDB4MDAxMywgMHgwODBjLCAweDg2NGMsCisJMHgyMGE5LCAweDAxZjQsIDB4NjgyNCwgMHhkMDk0LCAweDAxNTgsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsCisJMHhhMDg0LCAweDQwMDAsIDB4MDFhMCwgMHg3ODAzLCAweDEwMDAsIDB4NzgwMywgMHgwMDAwLCAweDAwNzgsCisJMHhkMDg0LCAweDAxMTgsIDB4NjgyNywgMHgwMDAxLCAweDAwMTAsIDB4MWYwNCwgMHg3ZjdhLCAweDc4MDQsCisJMHhhMDg0LCAweDEwMDAsIDB4MDEyMCwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDY4MjQsCisJMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxNWUsCisJMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA5NiwgMHgwMDAxLCAweDA1OTAsCisJMHhhMDk2LCAweDAwMDQsIDB4MDU3OCwgMHgwODBjLCAweDZhMTAsIDB4NjgxNCwgMHhhMDg0LCAweDAwMDEsCisJMHgwMTEwLCAweDY4YTcsIDB4OTVmNSwgMHg2ODE3LCAweDAwMDgsIDB4NjhjMywgMHgwMDAwLCAweDIwMTEsCisJMHg0YWRjLCAweDA4MGMsIDB4Njk5YywgMHgyMGE5LCAweDAxZjQsIDB4NjgyNCwgMHhkMDk0LCAweDAxNTgsCisJMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDFhMCwgMHg3ODAzLCAweDEwMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHhkMDg0LCAweDAxMTgsIDB4NjgyNywgMHgwMDAxLCAweDAwMTAsCisJMHgxZjA0LCAweDdmYmQsIDB4NzgwNCwgMHhhMDg0LCAweDEwMDAsIDB4MDEyMCwgMHg3ODAzLCAweDAxMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksCisJMHgwMTAwLCAweDIwNzksIDB4MDE0MCwgMHgyMDcxLCAweGI3ZTAsIDB4NzAzYywgMHgyMDYwLCAweDhjZmYsCisJMHgwOTA0LCAweDgwNmIsIDB4YTM4NiwgMHgwMDAyLCAweDExMjgsIDB4NjgxNCwgMHhhMDg0LCAweDAwMDIsCisJMHgwOTA0LCAweDgwNmIsIDB4NjhhZiwgMHg5NWY1LCAweDY4MTcsIDB4MDAxMCwgMHgyMDA5LCAweDAwZmEsCisJMHg4MTA5LCAweDFkZjAsIDB4NjhjNywgMHgwMDAwLCAweDY4Y2IsIDB4MDAwOCwgMHgwODBjLCAweDZhMWQsCisJMHgwODBjLCAweDIyMGMsIDB4MDA0NiwgMHgyMDA5LCAweDAxN2YsIDB4MjAwYiwgMHgwMGE1LCAweDIwMjEsCisJMHgwMTY5LCAweDI0MDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNCwgMHgxNTAwLCAweDY4YWYsCisJMHg5NWY1LCAweDY4YzcsIDB4MDAwMCwgMHg2OGNiLCAweDAwMDgsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzksCisJMHgwMDIwLCAweDIwNzEsIDB4Yjg0YSwgMHg2ODE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMTIsCisJMHg2ODE2LCAweDc4MDMsIDB4MDAwOCwgMHg3MDAzLCAweDAwMDAsIDB4MDBmZSwgMHgwMGVlLCAweGEzODYsCisJMHgwMDAyLCAweDExMjgsIDB4Nzg4NCwgMHhhMDA1LCAweDExMTAsIDB4Nzg4NywgMHgwMDAxLCAweDIwMDEsCisJMHhiN2IxLCAweDIwMDQsIDB4MjAwYSwgMHgwMDRlLCAweGEzOWQsIDB4MDAwMCwgMHgxMTIwLCAweDIwMDksCisJMHgwMDQ5LCAweDA4MGMsIDB4ODY0YywgMHgyMGE5LCAweDAzZTgsIDB4NjgyNCwgMHhkMDk0LCAweDAxNTgsCisJMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDFhMCwgMHg3ODAzLCAweDEwMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHhkMDhjLCAweDAxMTgsIDB4NjgyNywgMHgwMDAyLCAweDAwMTAsCisJMHgxZjA0LCAweDgwNGQsIDB4NzgwNCwgMHhhMDg0LCAweDEwMDAsIDB4MDEyMCwgMHg3ODAzLCAweDAxMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4NjgyNCwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNjksIDB4YjdlMCwgMHg2YTA2LCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweGI3ZTAsIDB4NmEzMiwgMHgwMTJlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwNzEsCisJMHhiN2UwLCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLCAweDA1MzgsCisJMHg2MDFjLCAweGEyMDYsIDB4MTUwMCwgMHg3MDE0LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MTYsCisJMHg3MDEwLCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMTIsCisJMHgwMDEwLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsCisJMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsCisJMHg4MTFlLCAweDAwY2UsIDB4MDhkOCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwOGI4LCAweDAxMmUsCisJMHgwMDBlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3OTAyLCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDEwMDAsIDB4MDgwNCwgMHg4MTE2LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc5MDIsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4NDAwMCwgMHgwNDc4LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc5MDIsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MjAwMCwgMHgwMGY4LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc5MDIsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MDQwMCwgMHgwMDc4LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc5MDIsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MDIwMCwgMHgwMDg5LCAweDYwYzMsCisJMHgwMDIwLCAweDA4MGMsIDB4N2Q2NywgMHgwMTRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHhiN2UwLCAweDcwMjAsIDB4YTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NzAyMiwgMHgwMGVlLCAweDAwMDUsCisJMHgyMGE5LCAweDAwMDgsIDB4MjBhMiwgMHgxZjA0LCAweDgxMmEsIDB4MjBhMiwgMHgyMGEyLCAweDAwMDUsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDA2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiN2UwLCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDIwMzksCisJMHgwMDAxLCAweDg3ZmYsIDB4MDkwNCwgMHg4MWM2LCAweDhjZmYsIDB4MDkwNCwgMHg4MWM2LCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MTkwNCwgMHg4MWMxLCAweDg4ZmYsIDB4MDEzOCwgMHgyODAwLCAweGFjMDYsCisJMHgxOTA0LCAweDgxYzEsIDB4MjAzOSwgMHgwMDAwLCAweDAwNTAsIDB4NjAxOCwgMHhhMjA2LCAweDE5MDQsCisJMHg4MWMxLCAweDg1ZmYsIDB4MDEyMCwgMHg2MDUwLCAweGExMDYsIDB4MTkwNCwgMHg4MWMxLCAweDcwMjQsCisJMHhhYzA2LCAweDE1OTgsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgxMTYwLCAweDY4MjQsCisJMHhkMDg0LCAweDAxNDgsIDB4NjgyNywgMHgwMDAxLCAweDA4MGMsIDB4NmExMCwgMHgwODBjLCAweDgyNGQsCisJMHg3MDI3LCAweDAwMDAsIDB4MDQxMCwgMHgwODBjLCAweDZhMTAsIDB4NjgyMCwgMHhkMGI0LCAweDAxMTAsCisJMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsCisJMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsCisJMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsCisJMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4NzAxNCwgMHhhYzM2LCAweDExMTAsCisJMHg2NjBjLCAweDc2MTYsIDB4NzAxMCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsCisJMHgyZjAwLCAweDcwMTIsIDB4MDAxMCwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsCisJMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4ODlmZiwgMHgxMTU4LCAweDYwMGYsCisJMHgwMDAwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDljNWEsIDB4MDExMCwgMHgwODBjLCAweGIwOTksCisJMHgwODBjLCAweDllMWQsIDB4MDgwYywgMHg4MTFlLCAweDg4ZmYsIDB4MTE5MCwgMHgwMGNlLCAweDA4MDQsCisJMHg4MTQxLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4ODE0MSwgMHhhMDA2LCAweDAxMmUsCisJMHgwMDBlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHg2MDE3LCAweDAwMDAsIDB4MDBjZSwgMHhhOGM1LCAweDAwMDEsIDB4MGM4OCwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGI3ZTAsIDB4NzYzOCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDgyM2QsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxOTA0LCAweDgyMzgsIDB4ODdmZiwgMHgwMTI4LCAweDI3MDAsCisJMHhhYzA2LCAweDE5MDQsIDB4ODIzOCwgMHgwMDQ4LCAweDYwMTgsIDB4YTIwNiwgMHgxOTA0LCAweDgyMzgsCisJMHg4NWZmLCAweDAxMTgsIDB4NjA1MCwgMHhhMTA2LCAweDE1ZDgsIDB4NzAzYywgMHhhYzA2LCAweDExODAsCisJMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdmZTQsIDB4NzAzMywgMHgwMDAwLCAweDcwM2YsCisJMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDQ3LCAweDAwMDAsIDB4NzA0YiwgMHgwMDAwLCAweDAwM2UsCisJMHg3MDM4LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHhhYzM2LCAweDExNDAsCisJMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsIDB4MDAxMCwgMHg3MDM3LCAweDAwMDAsCisJMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTEwLCAweDA4MGMsCisJMHhiMDk5LCAweDA4MGMsIDB4OWUxZCwgMHg4N2ZmLCAweDExOTAsIDB4MDBjZSwgMHgwODA0LCAweDgxZTUsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDgxZTUsIDB4YTAwNiwgMHgwMTJlLCAweDAwMGUsCisJMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDYwMTcsCisJMHgwMDAwLCAweDAwY2UsIDB4YTdiZCwgMHgwMDAxLCAweDBjODgsIDB4MDBlNiwgMHgyMDcxLCAweGI3ZTAsCisJMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDIsIDB4MTExOCwgMHg3MDA3LCAweDAwMDUsCisJMHgwMDEwLCAweDcwMDcsIDB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsCisJMHgwMDY2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGI3ZTAsCisJMHgyYzEwLCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDUxOCwgMHgyMjAwLCAweGFjMDYsCisJMHgxMWUwLCAweDcwMzgsIDB4YWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweGFjMzYsCisJMHgxMTQwLCAweDJjMDAsIDB4YWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAzNiwgMHgwMDEwLCAweDcwMzcsCisJMHgwMDAwLCAweDY2MGMsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMjAsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsCisJMHgwOGQ4LCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDA2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiN2UwLCAweDc2MGMsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsCisJMHgwOTA0LCAweDgzMjMsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMjA2LCAweDE5MDQsCisJMHg4MzFlLCAweDcwMjQsIDB4YWMwNiwgMHgxNTA4LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsCisJMHgwOTA0LCAweDgyZmEsIDB4MDgwYywgMHg3ZDdhLCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweDgyNGQsCisJMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsCisJMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsCisJMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4NzAwYywgMHhhYzM2LCAweDExMTAsCisJMHg2NjBjLCAweDc2MGUsIDB4NzAwOCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsCisJMHgyZjAwLCAweDcwMGEsIDB4MDAxMCwgMHg3MDBiLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsCisJMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsCisJMHg5ZTQ3LCAweDExNTgsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4OWU1OCwgMHgxMWYwLCAweDA4MGMsCisJMHg4YzE5LCAweDAwZDgsIDB4MDgwYywgMHg4MjRkLCAweDA4YzAsIDB4MDgwYywgMHg5ZTU4LCAweDExMTgsCisJMHgwODBjLCAweDhjMTksIDB4MDA5MCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNjgsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgxMWY4LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDllMTEsIDB4MDgwYywgMHhhMDFmLCAweDA4MGMsCisJMHg5ZTFkLCAweDA4MGMsIDB4ODExZSwgMHgwMGNlLCAweDA4MDQsIDB4ODJhNywgMHgyYzc4LCAweDYwMGMsCisJMHgyMDYwLCAweDA4MDQsIDB4ODJhNywgMHgwMTJlLCAweDAwMGUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxZDMwLCAweDA4MGMsCisJMHhiMDk5LCAweDBjMTgsIDB4MDAzNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgzOTA4LCAweGEwMDYsCisJMHhhMTkwLCAweDAwMjAsIDB4MjIxYywgMHhhMzllLCAweDJhYjcsIDB4MTExOCwgMHg4MjEwLCAweDgwMDAsCisJMHgwY2M4LCAweGEwMDUsIDB4MDEzOCwgMHgyMGE5LCAweDAwMjAsIDB4MjE5OCwgMHhhMTEwLCAweDIyYTAsCisJMHgyMmM4LCAweDUzYTMsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDAzZSwgMHgwMDA1LCAweDAwZDYsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLCAweDAwMTQsCisJMHg2MGMzLCAweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDk5LCAweGI3YjksCisJMHgyMGE5LCAweDAwMDQsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDQsIDB4MjBhMywgMHg3ODc4LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwODBjLCAweDdkNjcsIDB4MDBkZSwgMHgwMDA1LCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzZkZCwgMHgyMGEzLCAweDAyMTQsIDB4MjBhMywgMHgwMDE4LCAweDIwYTMsCisJMHgwODAwLCAweDc4MTAsIDB4YTA4NCwgMHhmZjAwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgxMCwgMHhhMDg0LCAweDAwZmYsCisJMHgyMGEyLCAweDc4MjgsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE4LCAweDA4MGMsIDB4N2Q2NywgMHgwMDA1LCAweDAwZDYsIDB4MDAxNiwgMHgyZjY4LCAweDIwMDksCisJMHgwMDM1LCAweDA4MGMsIDB4YTEwYSwgMHgxOTA0LCAweDg0MDIsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NjQxLCAweDIwYTMsIDB4MTMwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHgyMDY4LCAweDY4MWMsCisJMHhhMDg2LCAweDAwMDMsIDB4MDU4MCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LCAweDIwMDEsCisJMHhiNTM1LCAweDIwMDQsIDB4ZDBhYywgMHgxMWQwLCAweGEyODYsIDB4MDA3ZSwgMHgxMTI4LCAweDIwYTMsCisJMHgwMGZmLCAweDIwYTMsIDB4ZmZmZSwgMHgwNGI4LCAweGEyODYsIDB4MDA3ZiwgMHgxMTI4LCAweDIwYTMsCisJMHgwMGZmLCAweDIwYTMsIDB4ZmZmZCwgMHgwNDc4LCAweGQyYmMsIDB4MDE4MCwgMHhhMjg2LCAweDAwODAsCisJMHgxMTI4LCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmMsIDB4MDQyOCwgMHhhMmU4LCAweGI2MzUsCisJMHgyZDZjLCAweDY4MTAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBlOCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MDk4LCAweDIwYTIsIDB4MDBjMCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhkMGFjLCAweDExMzgsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsIDB4MDA3ZSwgMHgwMjQwLCAweDAwZDYsCisJMHgyMDY5LCAweGI1MWMsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDIwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwMzQsIDB4MjBhMiwgMHg3ODM0LCAweDIwYTIsIDB4NzgzOCwgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMGMsIDB4MDgwYywgMHg3ZDY3LCAweDAwMWUsCisJMHgwMGRlLCAweDAwMDUsIDB4NzgxNywgMHgwMDAxLCAweDc4MDMsIDB4MDAwNiwgMHgwMDFlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDAyNiwgMHg3OTI4LCAweDIxNjgsIDB4NjkxYywgMHhhMTg2LCAweDAwMDYsCisJMHgwMWMwLCAweGExODYsIDB4MDAwMywgMHgwOTA0LCAweDg0NzgsIDB4YTE4NiwgMHgwMDA1LCAweDA5MDQsCisJMHg4NDYxLCAweGExODYsIDB4MDAwNCwgMHgwNWI4LCAweGExODYsIDB4MDAwOCwgMHgwOTA0LCAweDg0NjksCisJMHg3ODA3LCAweDAwMzcsIDB4NzgxMywgMHgxNzAwLCAweDA4MGMsIDB4ODRlMCwgMHgwMDJlLCAweDAwZGUsCisJMHgwMDA1LCAweDA4MGMsIDB4ODQ5YywgMHgyMDA5LCAweDQwMDAsIDB4NjgwMCwgMHgwMDAyLCAweDg0NDIsCisJMHg4NDRkLCAweDg0NDQsIDB4ODQ0ZCwgMHg4NDQ5LCAweDg0NDIsIDB4ODQ0MiwgMHg4NDRkLCAweDg0NGQsCisJMHg4NDRkLCAweDg0NGQsIDB4ODQ0MiwgMHg4NDQyLCAweDg0NDIsIDB4ODQ0MiwgMHg4NDQyLCAweDg0NGQsCisJMHg4NDQyLCAweDg0NGQsIDB4MDgwYywgMHgxNTE1LCAweDY4MjAsIDB4ZDBlNCwgMHgwMTEwLCAweGQwY2MsCisJMHgwMTEwLCAweGEwMGUsIDB4MDAxMCwgMHgyMDA5LCAweDIwMDAsIDB4NjgyOCwgMHgyMGEyLCAweDY4MmMsCisJMHgyMGEyLCAweDA4MDQsIDB4ODQ5MiwgMHgwODBjLCAweDg0OWMsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwMDksIDB4NDAwMCwgMHg2YTAwLCAweGEyODYsIDB4MDAwMiwgMHgxMTA4LCAweGEwMGUsCisJMHgwNDg4LCAweDA0ZDEsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsCisJMHgwNDQ4LCAweDA0OTEsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsCisJMHhhMjg2LCAweDAwMDUsIDB4MDExOCwgMHhhMjg2LCAweDAwMDIsIDB4MTEwOCwgMHhhMDBlLCAweDAwZDAsCisJMHgwNDE5LCAweDY4MTAsIDB4MjA2OCwgMHg2OTdjLCAweDY4MTAsIDB4YTExMiwgMHg2OTgwLCAweDY4MTQsCisJMHhhMTAzLCAweDIwYTIsIDB4MjJhMiwgMHg3OTI4LCAweGExODAsIDB4MDAwMCwgMHgyMDA0LCAweGEwOGUsCisJMHgwMDAyLCAweDAxMzAsIDB4YTA4ZSwgMHgwMDA0LCAweDAxMTgsIDB4MjAwOSwgMHg0MDAwLCAweDAwMTAsCisJMHgyMDA5LCAweDAwMDAsIDB4MjFhMiwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE4LCAweDA4MGMsCisJMHg3ZDY3LCAweDAwMmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNjYsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweGEwMDYsIDB4MjBhMywgMHgwMjAwLCAweDIwYTIsCisJMHg3OTM0LCAweDIxYTIsIDB4NzkzOCwgMHgyMWEyLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsIDB4YTA5MiwgMHgwMDdlLCAweDAyNjgsCisJMHgwMGQ2LCAweDIwNjksIDB4YjUxYywgMHgyZDJjLCAweDhkNjgsIDB4MmQzNCwgMHhhMGU4LCAweGI2MzUsCisJMHgyZDZjLCAweDZiMTAsIDB4NmMxNCwgMHgwMGRlLCAweDAwMzAsIDB4MjAxOSwgMHgwMDAwLCAweDY0OTgsCisJMHgyMDI5LCAweDAwMDAsIDB4NjYzNCwgMHg3ODI4LCAweGEwODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODYsCisJMHgwMDAzLCAweDExMjgsIDB4MjVhMiwgMHgyNmEyLCAweDIzYTIsIDB4MjRhMiwgMHgwMDIwLCAweDIzYTIsCisJMHgyNGEyLCAweDI1YTIsIDB4MjZhMiwgMHgwMDZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3NmRkLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDksIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDdkNjcsCisJMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDc2MzksIDB4MjBhMywgMHgxNDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4NzgyOCwgMHgyMGEyLCAweDc4MmMsCisJMHgyMGEyLCAweDc4MzAsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg3ZDY3LCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NmQ1LCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHgyMGEyLCAweDc4MTAsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDdkNjcsIDB4MDAwNSwgMHgwMTQ2LCAweDIwYTEsCisJMHgwMjBiLCAweDAwMzEsIDB4NjBjMywgMHgwMDAwLCAweDA4MGMsIDB4N2Q2NywgMHgwMTRlLCAweDAwMDUsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHgyMDExLCAweGI1MzUsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTg4LCAweDAwZDYsCisJMHhhMGU4LCAweGI2MzUsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDMwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDIwNjksIDB4YjUxYywgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDAwNzgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YjYzNSwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwMzAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4NjIzNCwgMHgyMmEyLCAweDIwYTMsCisJMHgwODE5LCAweDIwYTMsIDB4MDAwMCwgMHgwODBjLCAweDdkNTYsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyZmEyLCAweDdhMDgsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDA3OSwgMHg3OTEwLCAweDIxYTIsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg3ZDcxLCAweDA4MGMsCisJMHg2YTA3LCAweDAwMDUsIDB4MDE1NiwgMHgwMTM2LCAweDAwMzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODU0LCAweDIwNjgsIDB4YWRmMCwgMHgwMDBmLCAweDcyMTAsCisJMHhhMjk2LCAweDAwYzAsIDB4YTI5NCwgMHhmZmZkLCAweDcyMTIsIDB4NzIxNCwgMHhhMjk0LCAweDAzMDAsCisJMHg3MjE2LCAweDcxMDAsIDB4YTE5NCwgMHgwMGZmLCAweDczMDgsIDB4YTM4NCwgMHgwMGZmLCAweGEwOGQsCisJMHhjMjAwLCAweDcxMDIsIDB4YTM4NCwgMHhmZjAwLCAweGEyMTUsIDB4NzIwYSwgMHg3MDA0LCAweDcyMGMsCisJMHg3MDBlLCAweDcyMDYsIDB4MjBhOSwgMHgwMDBhLCAweDJlOTgsIDB4NTNhNiwgMHg2MGEzLCAweDAwMzUsCisJMHg2YTM4LCAweGEyOTQsIDB4NzAwMCwgMHhhMjg2LCAweDMwMDAsIDB4MDExMCwgMHg2MGEzLCAweDAwMzcsCisJMHgwMGVlLCAweDAwZGUsIDB4MDAzZSwgMHgwMTNlLCAweDAxNWUsIDB4MDAwNSwgMHgyMDA5LCAweDAwOTIsCisJMHgwMDEwLCAweDIwMDksIDB4MDA5NiwgMHg2MGFiLCAweDAwMzYsIDB4NjExNiwgMHgwMDA1LCAweDIwNjEsCisJMHhiZDAwLCAweDJhNzAsIDB4NzA2OCwgMHg3MDRhLCAweDcwNGYsIDB4YmQwMCwgMHgwMDA1LCAweDAwZTYsCisJMHgwMTI2LCAweDIwNzEsIDB4YjUwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU0OCwgMHhhNTgyLCAweDAwMTAsCisJMHgwNjA4LCAweDcwNGMsIDB4MjA2MCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMTQ4LCAweGFjZTAsCisJMHgwMDE4LCAweDcwNWMsIDB4YWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHhiZDAwLCAweDBjOTgsCisJMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTRhLCAweGFjYTgsIDB4MDAxOCwgMHg3MDVjLCAweGE1MDIsCisJMHgxMjMwLCAweDc1NGUsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNGYsCisJMHhiZDAwLCAweDBjYzAsIDB4YTAwNiwgMHgwY2MwLCAweDAwZTYsIDB4MjA3MSwgMHhiNTAwLCAweDc1NDgsCisJMHhhNTgyLCAweDAwMTAsIDB4MDYwMCwgMHg3MDRjLCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMTQ4LCAweGFjZTAsIDB4MDAxOCwgMHg3MDVjLCAweGFjMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsCisJMHhiZDAwLCAweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU0YSwgMHhhY2E4LCAweDAwMTgsCisJMHg3MDVjLCAweGE1MDIsIDB4MTIyOCwgMHg3NTRlLCAweGEwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsCisJMHg3MDRmLCAweGJkMDAsIDB4MGNjOCwgMHhhMDA2LCAweDBjYzgsIDB4YWM4MiwgMHhiZDAwLCAweDBhMGMsCisJMHgxNTE1LCAweDIwMDEsIDB4YjUxNywgMHgyMDA0LCAweGFjMDIsIDB4MWEwYywgMHgxNTE1LCAweGEwMDYsCisJMHg2MDA2LCAweDYwMGEsIDB4NjAwZSwgMHg2MDEyLCAweDYwMTYsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDAsCisJMHg2MDAzLCAweDAwMDAsIDB4NjA1MiwgMHg2MDU2LCAweDYwMjIsIDB4NjAyNiwgMHg2MDJhLCAweDYwMmUsCisJMHg2MDMyLCAweDYwMzYsIDB4NjAzYSwgMHg2MDNlLCAweDIwNjEsIDB4YjUwMCwgMHg2MDQ4LCAweDgwMDAsCisJMHg2MDRhLCAweGEwODYsIDB4MDAwMSwgMHgwMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwY2MwLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMDIsCisJMHg4NjViLCAweDg2NmEsIDB4ODY4NSwgMHg4NmEwLCAweGExNTIsIDB4YTE2ZCwgMHhhMTg4LCAweDg2NWIsCisJMHg4NjZhLCAweDg2NWIsIDB4ODZiYiwgMHhhMTg2LCAweDAwMTMsIDB4MTEyOCwgMHgwODBjLCAweDcwOTAsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMThlLCAweDAwNDcsIDB4MTExOCwgMHhhMDE2LCAweDA4MGMsCisJMHgxODVlLCAweDAwMDUsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsCisJMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHg4NjgzLCAweDhhOWIsIDB4OGM1MywgMHg4NjgzLCAweDhjYzgsCisJMHg4Nzc5LCAweDg2ODMsIDB4ODY4MywgMHg4YTJkLCAweDkwZWYsIDB4ODY4MywgMHg4NjgzLCAweDg2ODMsCisJMHg4NjgzLCAweDg2ODMsIDB4ODY4MywgMHgwODBjLCAweDE1MTUsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsCisJMHgwMDEwLCAweDFhMGMsIDB4MTUxNSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHg4NjllLCAweDk3MjIsCisJMHg4NjllLCAweDg2OWUsIDB4ODY5ZSwgMHg4NjllLCAweDg2OWUsIDB4ODY5ZSwgMHg5NmNkLCAweDk4OGUsCisJMHg4NjllLCAweDk3NGYsIDB4OTdjNiwgMHg5NzRmLCAweDk3YzYsIDB4ODY5ZSwgMHgwODBjLCAweDE1MTUsCisJMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDFhMGMsIDB4MTUxNSwgMHgwMDEzLCAweDAwNmUsCisJMHgwMDA1LCAweDg2YjksIDB4OTEzMCwgMHg5MWZhLCAweDkzMzUsIDB4OTQ5MSwgMHg4NmI5LCAweDg2YjksCisJMHg4NmI5LCAweDkxMGEsIDB4OTY3ZCwgMHg5NjgwLCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LCAweDg2YjksCisJMHg5NmFhLCAweDA4MGMsIDB4MTUxNSwgMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDFhMGMsCisJMHgxNTE1LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweDg2ZDQsIDB4ODZkNCwgMHg4NmQ0LCAweDg3MDIsCisJMHg4NzRmLCAweDg2ZDQsIDB4ODZkNCwgMHg4NmQ0LCAweDg2ZDYsIDB4ODZkNCwgMHg4NmQ0LCAweDg2ZDQsCisJMHg4NmQ0LCAweDg2ZDQsIDB4ODZkNCwgMHg4NmQ0LCAweDA4MGMsIDB4MTUxNSwgMHhhMTg2LCAweDAwMDMsCisJMHgxOTBjLCAweDE1MTUsIDB4MDBkNiwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODRmLCAweDAwNDAsIDB4Njg3YywgMHg2ODBhLCAweDY4ODAsIDB4NjgwZSwgMHg2ODEzLCAweDAwMDAsCisJMHg2ODE3LCAweDAwMDAsIDB4Njg1NCwgMHhhMDkyLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLCAweDE5OTksCisJMHg4MDAzLCAweDgwMTMsIDB4ODIxMywgMHhhMjEwLCAweDYyMTYsIDB4MDBkZSwgMHgyYzEwLCAweDA4MGMsCisJMHgxZmE5LCAweDA4MGMsIDB4NmNmMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDcyMzAsCisJMHgwMTJlLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQ3LCAweDAwMDIsIDB4ODcwZSwgMHg4NzBlLCAweDg3MTAsCisJMHg4NzI5LCAweDg3MGUsIDB4ODcwZSwgMHg4NzBlLCAweDg3MGUsIDB4ODczYiwgMHgwODBjLCAweDE1MTUsCisJMHgwMGQ2LCAweDAwMTYsIDB4MDgwYywgMHg3MTI2LCAweDA4MGMsIDB4NzIzMCwgMHg2MDAzLCAweDAwMDQsCisJMHg2MTEwLCAweDIxNjgsIDB4Njg0ZiwgMHgwMDIwLCAweDY4NWMsIDB4Njg1YSwgMHg2ODc0LCAweDY4N2UsCisJMHg2ODc4LCAweDY4ODIsIDB4Njg5NywgMHgwMDAwLCAweDY4OWIsIDB4MDAwMCwgMHgwMDFlLCAweDAwZGUsCisJMHgwMDA1LCAweDA4MGMsIDB4NzEyNiwgMHgwMGQ2LCAweDYxMTAsIDB4MjE2OCwgMHgwODBjLCAweDljNWEsCisJMHgwMTIwLCAweDY4NGIsIDB4MDAwNiwgMHgwODBjLCAweDU0MDgsIDB4MDBkZSwgMHgwODBjLCAweDg2MWQsCisJMHgwODBjLCAweDcyMzAsIDB4MDAwNSwgMHgwODBjLCAweDcxMjYsIDB4MDgwYywgMHgyYzljLCAweDAwZDYsCisJMHg2MTEwLCAweDIxNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxMjAsIDB4Njg0YiwgMHgwMDI5LCAweDA4MGMsCisJMHg1NDA4LCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4NzIzMCwgMHgwMDA1LCAweGExODIsCisJMHgwMDQ3LCAweDAwMDIsIDB4ODc1ZCwgMHg4NzZjLCAweDg3NWIsIDB4ODc1YiwgMHg4NzViLCAweDg3NWIsCisJMHg4NzViLCAweDg3NWIsIDB4ODc1YiwgMHgwODBjLCAweDE1MTUsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODRjLCAweGMwZjQsIDB4Njg0ZSwgMHgwMGRlLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsCisJMHgyYzEwLCAweDA4MGMsIDB4MTg1ZSwgMHgwMDA1LCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LCAweDY4NGIsCisJMHgwMDAwLCAweDY4NTMsIDB4MDAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDBkZSwgMHgwODBjLCAweDg2MWQsCisJMHgwMDA1LCAweGExYjYsIDB4MDAxNSwgMHgxMTE4LCAweDA4MGMsIDB4ODYxZCwgMHgwMDMwLCAweGExYjYsCisJMHgwMDE2LCAweDE5MGMsIDB4MTUxNSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHgyMGE5LCAweDAwMGUsCisJMHgyZTk4LCAweDYwMTAsIDB4MjBhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAwNiwgMHgzMzEwLCAweDM0MjAsCisJMHg5Mzk4LCAweDk0YTAsIDB4MzMxOCwgMHgzNDI4LCAweDIyMmUsIDB4MjMyNiwgMHhhMjkwLCAweDAwMDIsCisJMHhhNWE4LCAweDAwMDIsIDB4YTM5OCwgMHgwMDAyLCAweGE0YTAsIDB4MDAwMiwgMHgxZjA0LCAweDg3OTQsCisJMHgwMGU2LCAweDA4MGMsIDB4OWM1YSwgMHgwMTMwLCAweDYwMTAsIDB4MjA3MCwgMHg3MDA3LCAweDAwMDAsCisJMHg3MDM3LCAweDAxMDMsIDB4MDBlZSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsCisJMHg3MzMwLCAweGEzODYsIDB4MDIwMCwgMHgxMTMwLCAweDYwMTgsIDB4MjA2OCwgMHg2ODEzLCAweDAwZmYsCisJMHg2ODE3LCAweGZmZmQsIDB4NjAxMCwgMHhhMDA1LCAweDAxMzAsIDB4MjA2OCwgMHg2ODA3LCAweDAwMDAsCisJMHg2ODM3LCAweDAxMDMsIDB4NmIzMiwgMHgwODBjLCAweDg2MWQsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMDE2LCAweDIwYTksIDB4MDAyYSwgMHhhZTgwLCAweDAwMGMsIDB4MjA5OCwgMHg2MDEwLCAweGEwODAsCisJMHgwMDAyLCAweDIwYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMmEsIDB4NjAxMCwgMHhhMDgwLCAweDAwMDEsCisJMHgyMDA0LCAweGEwODAsIDB4MDAwMiwgMHgyMGEwLCAweDUzYTMsIDB4MDBlNiwgMHg2MDEwLCAweDIwMDQsCisJMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgwMGVlLCAweDA4MGMsIDB4ODYxZCwgMHgwMDFlLCAweDAwMDUsCisJMHgwMDE2LCAweDIwMDksIDB4MDAwMCwgMHg3MDMwLCAweGEwODYsIDB4MDEwMCwgMHgwMTQwLCAweDcwMzgsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwYywgMHg3MDNjLCAweGEwODQsIDB4MDBmZiwgMHg4MDA0LCAweGEwODAsCisJMHgwMDA0LCAweGExMDgsIDB4MjFhOCwgMHhhZTgwLCAweDAwMGMsIDB4MjA5OCwgMHg2MDEwLCAweGEwODAsCisJMHgwMDAyLCAweDIwYTAsIDB4MDgwYywgMHg0YjhmLCAweDAwZTYsIDB4MDgwYywgMHg5YzVhLCAweDAxNDAsCisJMHg2MDEwLCAweDIwNzAsIDB4NzAwNywgMHgwMDAwLCAweDcwMzQsIDB4NzBiMiwgMHg3MDM3LCAweDAxMDMsCisJMHgwMGVlLCAweDA4MGMsIDB4ODYxZCwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDYwM2YsCisJMHgwMDAwLCAweDJjNjgsIDB4MDAxNiwgMHgyMDA5LCAweDAwMzUsIDB4MDgwYywgMHhhMTBhLCAweDAwMWUsCisJMHgxMTY4LCAweDAwMjYsIDB4NjIyOCwgMHgyMjY4LCAweDAwMmUsIDB4MjA3MSwgMHhiYjhjLCAweDZiMWMsCisJMHhhMzg2LCAweDAwMDMsIDB4MDEzMCwgMHhhMzg2LCAweDAwMDYsIDB4MDEyOCwgMHgwODBjLCAweDg2MWQsCisJMHgwMDIwLCAweDAwMzEsIDB4MDAxMCwgMHgwODBjLCAweDg4ZjYsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGY2LCAweDY4MTAsIDB4MjA3OCwgMHhhMTg2LCAweDAwMTUsIDB4MDkwNCwgMHg4OGRkLCAweGExOGUsCisJMHgwMDE2LCAweDE5MDQsIDB4ODhmNCwgMHg3MDBjLCAweGEwOGMsIDB4ZmYwMCwgMHhhMTg2LCAweDE3MDAsCisJMHgwMTIwLCAweGExODYsIDB4MDMwMCwgMHgxOTA0LCAweDg4YmMsIDB4OGZmZiwgMHgxMTM4LCAweDY4MDAsCisJMHhhMDg2LCAweDAwMGYsIDB4MDkwNCwgMHg4OGEwLCAweDA4MDQsIDB4ODhmMiwgMHg2ODA4LCAweGEwODYsCisJMHhmZmZmLCAweDE5MDQsIDB4ODhkZiwgMHg3ODRjLCAweGEwODQsIDB4MDA2MCwgMHhhMDg2LCAweDAwMjAsCisJMHgxMTUwLCAweDc5N2MsIDB4NzgxMCwgMHhhMTA2LCAweDE5MDQsIDB4ODhkZiwgMHg3OTgwLCAweDc4MTQsCisJMHhhMTA2LCAweDE5MDQsIDB4ODhkZiwgMHgwODBjLCAweDllMTEsIDB4Njg1OCwgMHg3ODUyLCAweDc4NGMsCisJMHhjMGRjLCAweGMwZjQsIDB4YzBkNCwgMHg3ODRlLCAweDAwMjYsIDB4YTAwZSwgMHg2YTE0LCAweDIwMDEsCisJMHgwMDBhLCAweDA4MGMsIDB4NmI0MCwgMHg3ODU0LCAweGEyMGEsIDB4MDIwOCwgMHg4MDExLCAweDdhNTYsCisJMHg4MmZmLCAweDAwMmUsIDB4MTEzOCwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHg5YTA5LCAweDAwY2UsCisJMHgwODA0LCAweDg4ZjIsIDB4MDBjNiwgMHgwMGQ2LCAweDJmNjgsIDB4NjgzOCwgMHhkMGZjLCAweDExMTgsCisJMHgwODBjLCAweDRjNjQsIDB4MDAxMCwgMHgwODBjLCAweDRlNDksIDB4MDBkZSwgMHgwMGNlLCAweDE5MDQsCisJMHg4OGRmLCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweDg2MWQsIDB4MDBjZSwgMHgwODA0LCAweDg4ZjIsCisJMHgwMGM2LCAweDA4MGMsIDB4OWVkNiwgMHgwMTkwLCAweDYwMTMsIDB4MDAwMCwgMHg2ODE4LCAweDYwMWEsCisJMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAzLCAweDY5MDQsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsCisJMHg4NjFkLCAweDAwY2UsIDB4MDgwYywgMHg4NjRjLCAweDAwY2UsIDB4MDRlMCwgMHgyMDAxLCAweGI3YjgsCisJMHgyMDA0LCAweDY4M2UsIDB4MDBjZSwgMHgwNGIwLCAweDcwMDgsIDB4YTA4NiwgMHgwMDBiLCAweDExYTAsCisJMHg2MDE4LCAweDIwMGMsIDB4YzFiYywgMHgyMTAyLCAweDAwYzYsIDB4MmQ2MCwgMHg3ODUzLCAweDAwMDMsCisJMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgwODBjLCAweDZjOGQsCisJMHgwODBjLCAweDcxNzMsIDB4MDBjZSwgMHgwMGYwLCAweDcwMGMsIDB4YTA4NiwgMHgyYTAwLCAweDExMzgsCisJMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2ODNlLCAweDAwYTgsIDB4MDQ4MSwgMHgwMGE4LCAweDhmZmYsCisJMHgwOTBjLCAweDE1MTUsIDB4MDBjNiwgMHgwMGQ2LCAweDJkNjAsIDB4MmY2OCwgMHg2ODM3LCAweDAxMDMsCisJMHg2ODRiLCAweDAwMDMsIDB4MDgwYywgMHg5OGZkLCAweDA4MGMsIDB4OWUxMSwgMHgwODBjLCAweDllMWQsCisJMHgwMGRlLCAweDAwY2UsIDB4MDgwYywgMHg4NjFkLCAweDAwZmUsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTUsCisJMHgxMTI4LCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDY4M2UsIDB4MDA2OCwgMHhhMThlLCAweDAwMTYsCisJMHgxMTYwLCAweDAwYzYsIDB4MmQwMCwgMHgyMDYwLCAweDA4MGMsIDB4YjMzYSwgMHgwODBjLCAweDZhZWYsCisJMHgwODBjLCAweDg2MWQsIDB4MDBjZSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsCisJMHgwMDQ2LCAweDcyMjgsIDB4N2M4MCwgMHg3YjdjLCAweGQyZjQsIDB4MDEzMCwgMHgyMDAxLCAweGI3YjgsCisJMHgyMDA0LCAweDY4M2UsIDB4MDgwNCwgMHg4OTcwLCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweDk5MWQsCisJMHgwMGNlLCAweDY4MDQsIDB4YTA4NiwgMHgwMDUwLCAweDExNjgsIDB4MDBjNiwgMHgyZDAwLCAweDIwNjAsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDUwLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsCisJMHgwMGNlLCAweDA0ZjAsIDB4NjgwMCwgMHhhMDg2LCAweDAwMGYsIDB4MDFjOCwgMHg4ZmZmLCAweDA5MGMsCisJMHgxNTE1LCAweDY4MjAsIDB4ZDBkYywgMHgxMTk4LCAweDY4MDAsIDB4YTA4NiwgMHgwMDA0LCAweDExOTgsCisJMHg3ODRjLCAweGQwYWMsIDB4MDE4MCwgMHg3ODRjLCAweGMwZGMsIDB4YzBmNCwgMHg3ODRlLCAweDc4NTAsCisJMHhjMGY0LCAweGMwZmMsIDB4Nzg1MiwgMHgyMDAxLCAweDAwMDEsIDB4NjgyZSwgMHgwMGUwLCAweDIwMDEsCisJMHgwMDA3LCAweDY4MmUsIDB4MDBjMCwgMHg3ODRjLCAweGQwYjQsIDB4MTEzMCwgMHhkMGFjLCAweDBkYjgsCisJMHg3ODRjLCAweGQwZjQsIDB4MWRhMCwgMHgwYzM4LCAweGQyZWMsIDB4MWQ4OCwgMHg3MDI0LCAweGEzMDYsCisJMHgxMTE4LCAweDcwMjAsIDB4YTQwNiwgMHgwZDU4LCAweDcwMjAsIDB4NjgzNiwgMHg3MDI0LCAweDY4M2EsCisJMHgyMDAxLCAweDAwMDUsIDB4NjgyZSwgMHgwODBjLCAweDlmNjMsIDB4MDgwYywgMHg3MTczLCAweDAwMTAsCisJMHgwODBjLCAweDg2MWQsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsCisJMHgwMDI2LCAweDYwMzQsIDB4MjA2OCwgMHg2YTFjLCAweGEyODYsIDB4MDAwNywgMHgwOTA0LCAweDg5ZDQsCisJMHhhMjg2LCAweDAwMDIsIDB4MDkwNCwgMHg4OWQ0LCAweGEyODYsIDB4MDAwMCwgMHgwOTA0LCAweDg5ZDQsCisJMHg2ODA4LCAweDYzMzgsIDB4YTMwNiwgMHgxOTA0LCAweDg5ZDQsIDB4MjA3MSwgMHhiYjhjLCAweGExODYsCisJMHgwMDE1LCAweDA1ZTAsIDB4YTE4ZSwgMHgwMDE2LCAweDExOTAsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDEsIDB4MTE2MCwgMHg3MDBjLCAweGEwODYsIDB4MmEwMCwgMHgxMTQwLCAweDYwMzQsCisJMHhhMDgwLCAweDAwMDgsIDB4MjAwYywgMHhjMWRkLCAweGMxZjUsIDB4MjEwMiwgMHgwNDM4LCAweDAwYzYsCisJMHg2MDM0LCAweDIwNjAsIDB4NjEwNCwgMHhhMTg2LCAweDAwNGIsIDB4MDFhMCwgMHhhMTg2LCAweDAwNGMsCisJMHgwMTg4LCAweGExODYsIDB4MDA0ZCwgMHgwMTcwLCAweGExODYsIDB4MDA0ZSwgMHgwMTU4LCAweGExODYsCisJMHgwMDUyLCAweDAxNDAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwOTBjLCAweDE1MTUsCisJMHg2ODUzLCAweDAwMDMsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsCisJMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLCAweDAwY2UsIDB4MDAzMCwgMHg2MDM0LCAweDIwNzAsCisJMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg3MDNlLCAweDA4MGMsIDB4ODYxZCwgMHgwMDJlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwMDUsIDB4MDBkNiwgMHgyMGE5LCAweDAwMGUsIDB4MmU5OCwgMHg2MDEwLCAweDIwYTAsCisJMHg1M2EzLCAweGExYjYsIDB4MDAxNSwgMHgxNTU4LCAweDYwMTgsIDB4MjA2OCwgMHgwMTU2LCAweDAwMzYsCisJMHgwMDI2LCAweGFlOTAsIDB4MDAwYywgMHhhMjkwLCAweDAwMDQsIDB4MjBhOSwgMHgwMDA0LCAweGFkOTgsCisJMHgwMDBhLCAweDA4MGMsIDB4OTBkYSwgMHgwMDJlLCAweDAwM2UsIDB4MDE1ZSwgMHgxMWQ4LCAweDAxNTYsCisJMHgwMDM2LCAweDAwMjYsIDB4YWU5MCwgMHgwMDBjLCAweGEyOTAsIDB4MDAwOCwgMHgyMGE5LCAweDAwMDQsCisJMHhhZDk4LCAweDAwMDYsIDB4MDgwYywgMHg5MGRhLCAweDAwMmUsIDB4MDAzZSwgMHgwMTVlLCAweDExNTAsCisJMHg3MDM4LCAweDY4MGEsIDB4NzAzYywgMHg2ODBlLCAweDY4MDAsIDB4YzA4ZCwgMHg2ODAyLCAweDAwZGUsCisJMHgwODA0LCAweDg3YTAsIDB4MDgwYywgMHgyYzljLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDJmMDAsCisJMHg2MDFhLCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHg0ZjJhLCAweDA4MGMsCisJMHg2Y2QzLCAweDA4MGMsIDB4NzE3MywgMHgwMGNlLCAweDBjMTAsIDB4MjEwMCwgMHhhMWIyLCAweDAwODAsCisJMHgxYTBjLCAweDE1MTUsIDB4YTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4OGE5MSwgMHgwMDAyLCAweDhhODUsCisJMHg4YTc5LCAweDhhODUsIDB4OGE4NSwgMHg4YTg1LCAweDhhODUsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsCisJMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsCisJMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsCisJMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTg1LCAweDhhNzcsCisJMHg4YTg1LCAweDhhODUsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhODUsCisJMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsCisJMHg4YTc3LCAweDhhODUsIDB4OGE4NSwgMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhNzcsCisJMHg4YTc3LCAweDhhNzcsIDB4OGE3NywgMHg4YTc3LCAweDhhODUsIDB4OGE3NywgMHg4YTc3LCAweDA4MGMsCisJMHgxNTE1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4NmNkMywgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NzE3MywgMHgwMTJlLCAweDAwMDUsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsCisJMHgwODBjLCAweDZjZDMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg3MTczLCAweDAxMmUsCisJMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHg4YTg1LCAweDhhODUsIDB4OGE5OSwgMHg4YTg1LCAweDhhODUsCisJMHg4YTk5LCAweDA4MGMsIDB4MTUxNSwgMHg2MDA0LCAweGEwYjIsIDB4MDA4MCwgMHgxYTBjLCAweDE1MTUsCisJMHhhMWI2LCAweDAwMTMsIDB4MDkwNCwgMHg4YjRiLCAweGExYjYsIDB4MDAyNywgMHgxOTA0LCAweDhiMTEsCisJMHgwODBjLCAweDcwOTAsIDB4NjAwNCwgMHgwODBjLCAweDllNDcsIDB4MDE5MCwgMHgwODBjLCAweDllNTgsCisJMHgwOTA0LCAweDhiMGIsIDB4YTA4ZSwgMHgwMDIxLCAweDA5MDQsIDB4OGIwZSwgMHhhMDhlLCAweDAwMjIsCisJMHgwOTA0LCAweDhiMGIsIDB4YTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4OGIwZSwgMHgwODA0LCAweDhiMDQsCisJMHgwODBjLCAweDJjYzIsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NGVmZCwgMHg2MDE4LCAweGEwODAsCisJMHgwMDI4LCAweDIwMGMsIDB4MDgwYywgMHg4YzE5LCAweGExODYsIDB4MDA3ZSwgMHgxMTQ4LCAweDIwMDEsCisJMHhiNTM1LCAweDIwMTQsIDB4YzI4NSwgMHgwODBjLCAweDVhY2YsIDB4MTEwOCwgMHhjMmFkLCAweDIyMDIsCisJMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMTEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI4LCAweDA4MGMsCisJMHg4Mjk5LCAweDAwMmUsIDB4MDgwYywgMHhiMzhkLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMTYsCisJMHgwMDI2LCAweDAwMzYsIDB4MjExMCwgMHgyMDE5LCAweDAwMjgsIDB4MDgwYywgMHg2ZGY1LCAweDAwNzYsCisJMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ZDAyLCAweDAwYzYsIDB4NjAxOCwgMHhhMDY1LCAweDAxMTAsCisJMHgwODBjLCAweDUxYWEsIDB4MDBjZSwgMHgyYzA4LCAweDA4MGMsIDB4YWU4MiwgMHgwMDdlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDgwYywgMHg0ZjZjLCAweDA4MGMsIDB4YTAxZiwgMHgwODBjLCAweDg2MWQsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDhjMTksIDB4MGNiMCwgMHgwODBjLCAweDhjNDcsCisJMHgwYzk4LCAweGExODYsIDB4MDAxNCwgMHgxZGIwLCAweDA4MGMsIDB4NzA5MCwgMHgwODBjLCAweDJjOWMsCisJMHgwODBjLCAweDllNDcsIDB4MTE4OCwgMHgwODBjLCAweDJjYzIsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDBjLCAweDA4MGMsIDB4OGMxOSwgMHhhMTg2LCAweDAwN2UsIDB4MTEyOCwgMHgyMDAxLCAweGI1MzUsCisJMHgyMDBjLCAweGMxODUsIDB4MjEwMiwgMHgwOGMwLCAweDA4MGMsIDB4OWU1OCwgMHgxMTE4LCAweDA4MGMsCisJMHg4YzE5LCAweDA4OTAsIDB4NjAwNCwgMHhhMDhlLCAweDAwMzIsIDB4MTE1OCwgMHgwMGU2LCAweDAwZjYsCisJMHgyMDcxLCAweGI1ODIsIDB4MjA3OSwgMHgwMDAwLCAweDA4MGMsIDB4MmZjZiwgMHgwMGZlLCAweDAwZWUsCisJMHgwODE4LCAweDYwMDQsIDB4YTA4ZSwgMHgwMDIxLCAweDBkNTAsIDB4YTA4ZSwgMHgwMDIyLCAweDA5MGMsCisJMHg4YzE5LCAweDA4MDQsIDB4OGIwNCwgMHhhMGIyLCAweDAwNDAsIDB4MWEwNCwgMHg4YzBlLCAweDIwMDgsCisJMHgwMDAyLCAweDhiOTMsIDB4OGI5NCwgMHg4Yjk3LCAweDhiOWEsIDB4OGI5ZCwgMHg4YmEwLCAweDhiOTEsCisJMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsCisJMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsCisJMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiYTMsCisJMHg4YmIyLCAweDhiOTEsIDB4OGJiNCwgMHg4YmIyLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsCisJMHg4YjkxLCAweDhiYjIsIDB4OGJiMiwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YjkxLCAweDhiOTEsCisJMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YmVlLCAweDhiYjIsIDB4OGI5MSwgMHg4YmFlLCAweDhiOTEsCisJMHg4YjkxLCAweDhiOTEsIDB4OGJhZiwgMHg4YjkxLCAweDhiOTEsIDB4OGI5MSwgMHg4YmIyLCAweDhiZTUsCisJMHg4YjkxLCAweDA4MGMsIDB4MTUxNSwgMHgwMGYwLCAweDIwMDEsIDB4MDAwYiwgMHgwNDYwLCAweDIwMDEsCisJMHgwMDAzLCAweDA0NDgsIDB4MjAwMSwgMHgwMDA1LCAweDA0MzAsIDB4MjAwMSwgMHgwMDAxLCAweDA0MTgsCisJMHgyMDAxLCAweDAwMDksIDB4MDQwMCwgMHgwODBjLCAweDcwOTAsIDB4NjAwMywgMHgwMDA1LCAweDIwMDEsCisJMHhiN2I4LCAweDIwMDQsIDB4NjAzZSwgMHgwODBjLCAweDcxNzMsIDB4MDBhMCwgMHgwMDE4LCAweDAwMTAsCisJMHgwODBjLCAweDRlZmQsIDB4MDgwNCwgMHg4YmZmLCAweDA4MGMsIDB4NzA5MCwgMHgyMDAxLCAweGI3YjYsCisJMHgyMDA0LCAweDYwMTYsIDB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDQsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHg3MDkwLCAweDYwMDMsCisJMHgwMDAyLCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDYwM2UsIDB4MDAzNiwgMHgyMDE5LCAweGI1NWQsCisJMHgyMzA0LCAweGEwODQsIDB4ZmYwMCwgMHgxMTIwLCAweDIwMDEsIDB4YjdiNiwgMHgyMDFjLCAweDAwNDAsCisJMHg4MDA3LCAweGEwOWEsIDB4MDAwNCwgMHgwZWMwLCAweDgwMDMsIDB4ODAxYiwgMHg4MzFiLCAweGEzMTgsCisJMHg2MzE2LCAweDAwM2UsIDB4MDgwYywgMHg3MTczLCAweDA4ZTgsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsCisJMHhhMDFmLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDhhMCwgMHgwMGU2LCAweDAwZjYsCisJMHgyMDcxLCAweGI1ODIsIDB4MjA3OSwgMHgwMDAwLCAweDA4MGMsIDB4MmZjZiwgMHgwMGZlLCAweDAwZWUsCisJMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwODE4LCAweDA4MGMsCisJMHg3MDkwLCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDAyLCAweDIwMDEsCisJMHhiN2I2LCAweDIwMDQsIDB4NjAxNiwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgyNjAwLCAweDIwMDgsCisJMHgwMDAyLCAweDhjMTcsIDB4OGMxNywgMHg4YzE3LCAweDhiZmYsIDB4OGJmZiwgMHg4YzE3LCAweDA4MGMsCisJMHgxNTE1LCAweDAwZTYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4OWM1YSwgMHgwNTA4LCAweDYwMTAsCisJMHgyMDcwLCAweDcwMzQsIDB4YTA4NiwgMHgwMTM5LCAweDExNDgsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDksCisJMHgwMDAwLCAweDIwMTEsIDB4NDAwNSwgMHgwODBjLCAweGEwZDYsIDB4MDA5MCwgMHg3MDM4LCAweGQwZmMsCisJMHgwMTc4LCAweDcwMDcsIDB4MDAwMCwgMHgwMDE2LCAweDYwMDQsIDB4YTA4ZSwgMHgwMDIxLCAweDAxNjAsCisJMHhhMDhlLCAweDAwM2QsIDB4MDE0OCwgMHgwMDFlLCAweDcwMzcsIDB4MDEwMywgMHg3MDMzLCAweDAxMDAsCisJMHgwMDFlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwMWUsIDB4MDAwOSwgMHgwY2M4LCAweDAwZTYsCisJMHhhY2YwLCAweDAwMDQsIDB4MmU3NCwgMHg3MDAwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDcwMjMsCisJMHg4MDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweDY2MTgsIDB4MjY2OCwgMHg2ODA0LCAweGEwODQsCisJMHgwMGZmLCAweDAwZGUsIDB4YTBiMiwgMHgwMDBjLCAweDFhMGMsIDB4MTUxNSwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDQzLCAweDExMjAsIDB4MDgwYywgMHhhMDkyLCAweDA4MDQsIDB4OGNiOCwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDMzLCAweDExMjAsIDB4MDgwYywgMHhhMDQyLCAweDA4MDQsIDB4OGNiOCwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDI4LCAweDExMjAsIDB4MDgwYywgMHg5ZTg4LCAweDA4MDQsIDB4OGNiOCwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDI5LCAweDExMTgsIDB4MDgwYywgMHg5ZTlmLCAweDA0ZDgsIDB4NjYwNCwgMHhhNmI2LCAweDAwMWYsCisJMHgxMTE4LCAweDA4MGMsIDB4ODc4NiwgMHgwNGEwLCAweDY2MDQsIDB4YTZiNiwgMHgwMDAwLCAweDExMTgsCisJMHgwODBjLCAweDg5ZGEsIDB4MDQ2OCwgMHg2NjA0LCAweGE2YjYsIDB4MDAyMiwgMHgxMTE4LCAweDA4MGMsCisJMHg4N2FlLCAweDA0MzAsIDB4NjYwNCwgMHhhNmI2LCAweDAwMzUsIDB4MTExOCwgMHgwODBjLCAweDg4MTUsCisJMHgwMGY4LCAweDY2MDQsIDB4YTZiNiwgMHgwMDM5LCAweDExMTgsIDB4MDgwYywgMHg4OTc2LCAweDAwYzAsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAzZCwgMHgxMTE4LCAweDA4MGMsIDB4ODdjOCwgMHgwMDg4LCAweDY2MDQsCisJMHhhNmI2LCAweDAwNDQsIDB4MTExOCwgMHgwODBjLCAweDg3ZTgsIDB4MDA1MCwgMHhhMWI2LCAweDAwMTUsCisJMHgxMTEwLCAweDAwNTMsIDB4MDAyOCwgMHhhMWI2LCAweDAwMTYsIDB4MTExOCwgMHgwODA0LCAweDhlN2MsCisJMHgwMDA1LCAweDA4MGMsIDB4ODY2MywgMHgwY2UwLCAweDhjZGYsIDB4OGNlMiwgMHg4Y2RmLCAweDhkMjQsCisJMHg4Y2RmLCAweDhlMDksIDB4OGU4YSwgMHg4Y2RmLCAweDhjZGYsIDB4OGU1OCwgMHg4Y2RmLCAweDhlNmMsCisJMHhhMWI2LCAweDAwNDgsIDB4MDE0MCwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsCisJMHgwODBjLCAweDE4NWUsIDB4MDAwNSwgMHgwMGU2LCAweGFjZjAsIDB4MDAwNCwgMHgyZTc0LCAweDcwMDAsCisJMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgwMGVlLCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweGUwMDAsCisJMHhlMDAwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI1MDAsIDB4NzA4NCwgMHhhMDg2LCAweDAwNzQsCisJMHgxNTMwLCAweDA4MGMsIDB4YWU1OSwgMHgxMWIwLCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDcwMzAsCisJMHhkMDhjLCAweDAxMjgsIDB4NjgwMCwgMHhkMGJjLCAweDAxMTAsIDB4YzBjNSwgMHg2ODAyLCAweDAwZDksCisJMHgwMGRlLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsCisJMHg4NjFkLCAweDAwNzgsIDB4MjAwMSwgMHgwMDBhLCAweDA4MGMsIDB4NGVmZCwgMHgwODBjLCAweDJjYzIsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDEwLCAweDA4MGMsCisJMHg4ZGY2LCAweDAwZWUsIDB4MDAwNSwgMHg2ODAwLCAweGQwODQsIDB4MDE2OCwgMHgyMDAxLCAweDAwMDAsCisJMHgwODBjLCAweDRlZWIsIDB4MjA2OSwgMHhiNTUyLCAweDY4MDQsIDB4ZDBhNCwgMHgwMTIwLCAweDIwMDEsCisJMHgwMDA2LCAweDA4MGMsIDB4NGYyYSwgMHgwMDA1LCAweDAwZDYsIDB4MjAxMSwgMHhiNTIxLCAweDIyMDQsCisJMHhhMDg2LCAweDAwNzQsIDB4MTkwNCwgMHg4ZGYzLCAweDYwMTgsIDB4MjA2OCwgMHg2YWEwLCAweGEyODYsCisJMHgwMDdlLCAweDExMjAsIDB4MDgwYywgMHg4ZmEyLCAweDA4MDQsIDB4OGQ5MiwgMHgwODBjLCAweDhmOTgsCisJMHg2MDE4LCAweDIwNjgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsIDB4YTI4NiwgMHgwMDgwLCAweDExYzAsCisJMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZjLCAweDYwMTAsIDB4YTAwNSwgMHgwMTM4LCAweDIwNjgsCisJMHg2ODA3LCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLCAweDY4MzMsIDB4MDIwMCwgMHgyMDAxLCAweDAwMDYsCisJMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4ODYxZCwgMHgwODA0LCAweDhkZjQsCisJMHgwMGU2LCAweDIwNzEsIDB4YjUzNSwgMHgyZTA0LCAweGQwOWMsIDB4MDE4OCwgMHgyMDcxLCAweGJiODAsCisJMHg3MTA4LCAweDcyMGMsIDB4YTE4YywgMHgwMGZmLCAweDExMTgsIDB4YTI4NCwgMHhmZjAwLCAweDAxMzgsCisJMHg2MDE4LCAweDIwNzAsIDB4NzBhMCwgMHhkMGJjLCAweDExMTAsIDB4NzExMiwgMHg3MjE2LCAweDAwZWUsCisJMHg2MDEwLCAweGEwMDUsIDB4MDE5OCwgMHgyMDY4LCAweDY4MzgsIDB4ZDBmNCwgMHgwMTc4LCAweDY4MzQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDM5LCAweDE5NTgsIDB4MjAwMSwgMHgwMDAwLCAweDIwMDksCisJMHgwMDAwLCAweDIwMTEsIDB4NDAwMCwgMHgwODBjLCAweGEwZDYsIDB4MDg0MCwgMHgyMDAxLCAweDAwMDQsCisJMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMywgMHgwODBjLCAweDZjZDMsCisJMHgwODA0LCAweDhkZjQsIDB4Njg1YywgMHhkMGU0LCAweDAxZDgsIDB4MDgwYywgMHg5ZmQyLCAweDA4MGMsCisJMHg1YWNmLCAweDAxMTgsIDB4ZDBkYywgMHgxOTA0LCAweDhkNGUsIDB4MjAxMSwgMHhiNTM1LCAweDIyMDQsCisJMHhjMGFkLCAweDIwMTIsIDB4MjAwMSwgMHhiNzhmLCAweDIwMDQsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsCisJMHg3OGUzLCAweDAwMDAsIDB4MDgwYywgMHgyODcyLCAweDc4ZTIsIDB4MDBmZSwgMHgwODA0LCAweDhkNGUsCisJMHgwODBjLCAweGEwMDgsIDB4MjAxMSwgMHhiNTM1LCAweDIyMDQsIDB4YzBhNSwgMHgyMDEyLCAweDAwMDYsCisJMHgwODBjLCAweGFmN2IsIDB4MDAwZSwgMHgxOTA0LCAweDhkNGUsIDB4YzBiNSwgMHgyMDEyLCAweDIwMDEsCisJMHgwMDA2LCAweDA4MGMsIDB4NGVmZCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLCAweDAwYzYsCisJMHgyMDA5LCAweDAwZWYsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzllYSwgMHg3OTMyLCAweDc5MzYsCisJMHgwMGZlLCAweDA4MGMsIDB4Mjg0NywgMHgwMGY2LCAweDIwNzksIDB4YjUwMCwgMHg3OTc2LCAweDIxMDAsCisJMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyODFkLCAweDc5NTIsIDB4MDBmZSwgMHg4MTA4LCAweDA4MGMsCisJMHg0ZjRkLCAweDJjMDAsIDB4MDBjZSwgMHgxOTA0LCAweDhkNGUsIDB4NjAxYSwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDRlZmQsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsCisJMHgwODBjLCAweDZjZDMsIDB4MDAwOCwgMHgwMDExLCAweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDcsCisJMHgwODBjLCAweDRlZmQsIDB4MjAwMSwgMHhiNTAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDExMjAsCisJMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg0ZjJhLCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDg2MWQsCisJMHgwMDA1LCAweDAwZTYsIDB4MDAyNiwgMHgwMDE2LCAweDIwNzEsIDB4YjUwMCwgMHg3MDg0LCAweGEwODYsCisJMHgwMDE0LCAweDE1ZjAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MTEyOCwgMHg2MDEwLCAweGEwMDUsCisJMHgxMTEwLCAweDA4MGMsIDB4M2YzZSwgMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHgwODBjLCAweDUwNGIsCisJMHgwODBjLCAweDhkMTMsIDB4MDBkZSwgMHgwODBjLCAweDkwNTEsIDB4MTU1MCwgMHgwMGQ2LCAweDYwMTgsCisJMHgyMDY4LCAweDY4OTAsIDB4MDBkZSwgMHhhMDA1LCAweDA1MTgsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsCisJMHg0ZWZkLCAweDAwZTYsIDB4NjAxMCwgMHhhMDc1LCAweDAxYTgsIDB4NzAzNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMzksIDB4MTE0OCwgMHgyMDAxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTEsCisJMHg0MDAwLCAweDA4MGMsIDB4YTBkNiwgMHgwMDMwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDM3LCAweDAxMDMsCisJMHg3MDMzLCAweDAyMDAsIDB4MDBlZSwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHg4NjFkLCAweDAwMjAsCisJMHgwODBjLCAweDhjMTksIDB4MDgwYywgMHg4ZGY2LCAweDAwMWUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsCisJMHgyMDExLCAweGI1MjEsIDB4MjIwNCwgMHhhMDg2LCAweDAwMTQsIDB4MTE1OCwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDZjZDMsCisJMHgwMDEwLCAweDA4MGMsIDB4OGRmNiwgMHgwMDA1LCAweDIwMTEsIDB4YjUyMSwgMHgyMjA0LCAweGEwODYsCisJMHgwMDA0LCAweDExMzgsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NGVmZCwgMHgwODBjLCAweDg2MWQsCisJMHgwMDEwLCAweDA4MGMsIDB4OGRmNiwgMHgwMDA1LCAweDAwMGIsIDB4MDAwNSwgMHg4Y2RmLCAweDhlOTUsCisJMHg4Y2RmLCAweDhlYzksIDB4OGNkZiwgMHg4ZjU0LCAweDhlOGEsIDB4OGNkZiwgMHg4Y2RmLCAweDhmNjcsCisJMHg4Y2RmLCAweDhmNzcsIDB4NjYwNCwgMHhhNjg2LCAweDAwMDMsIDB4MDkwNCwgMHg4ZTA5LCAweGE2YjYsCisJMHgwMDFlLCAweDExMTAsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MDBkNiwgMHgwMGM2LCAweDA4MGMsCisJMHg4Zjg3LCAweDExNzgsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDZjZDMsCisJMHgwMGU4LCAweDIwMDksIDB4YmI4ZSwgMHgyMTA0LCAweGEwODYsIDB4MDAwOSwgMHgxMTYwLCAweDYwMTgsCisJMHgyMDY4LCAweDY4NDAsIDB4YTA4NCwgMHgwMGZmLCAweGEwMDUsIDB4MDE3MCwgMHg4MDAxLCAweDY4NDIsCisJMHg2MDE3LCAweDAwMGEsIDB4MDA1OCwgMHgyMDA5LCAweGJiOGYsIDB4MjEwNCwgMHhhMDg0LCAweGZmMDAsCisJMHhhMDg2LCAweDE5MDAsIDB4MTEwOCwgMHgwOGQwLCAweDA4MGMsIDB4OGRmNiwgMHgwMGNlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwMjYsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4OGY5NSwgMHgwMGQ2LCAweDIwNjksCisJMHhiNzllLCAweDJkMDQsIDB4YTAwNSwgMHgwMTY4LCAweDYwMTgsIDB4MjA2OCwgMHg2OGEwLCAweGEwODYsCisJMHgwMDdlLCAweDExMzgsIDB4MjA2OSwgMHhiNTFkLCAweDJkMDQsIDB4ODAwMCwgMHgyMDZhLCAweDAwZGUsCisJMHgwMDEwLCAweDAwZGUsIDB4MDA3OCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLCAweDIwMDEsCisJMHgwMDAyLCAweDA4MGMsIDB4NGVmZCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsCisJMHg2Y2QzLCAweDA0ODAsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAwZGUsCisJMHgwMTA4LCAweDZhMzQsIDB4MDgwYywgMHg4YzE5LCAweDIwMDksIDB4YmI4ZSwgMHgyMTM0LCAweGE2YjQsCisJMHgwMGZmLCAweGE2ODYsIDB4MDAwNSwgMHgwNTAwLCAweGE2ODYsIDB4MDAwYiwgMHgwMWM4LCAweDIwMDksCisJMHhiYjhmLCAweDIxMDQsIDB4YTA4NCwgMHhmZjAwLCAweDExMTgsIDB4YTY4NiwgMHgwMDA5LCAweDAxYTAsCisJMHhhMDg2LCAweDE5MDAsIDB4MTE2OCwgMHhhNjg2LCAweDAwMDksIDB4MDE3MCwgMHgyMDAxLCAweDAwMDQsCisJMHgwODBjLCAweDRlZmQsIDB4MjAwMSwgMHgwMDI4LCAweDYwMTYsIDB4NjAwNywgMHgwMDRiLCAweDAwMTAsCisJMHgwODBjLCAweDhkZjYsIDB4MDAyZSwgMHgwMDA1LCAweDAwZDYsIDB4YTI4NiwgMHgwMTM5LCAweDAxNjAsCisJMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNDgsIDB4NjgzNCwgMHhhMDg2LCAweDAxMzksCisJMHgwMTE4LCAweDY4MzgsIDB4ZDBmYywgMHgwMTEwLCAweDAwZGUsIDB4MGM1MCwgMHg2MDE4LCAweDIwNjgsCisJMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAxNDAsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTcsCisJMHgwMDBhLCAweDYwMDcsIDB4MDAxNiwgMHgwMGRlLCAweDA4ZTgsIDB4NjhhMCwgMHhhMDg2LCAweDAwN2UsCisJMHgxMTM4LCAweDAwZTYsIDB4MjA3MSwgMHhiNTAwLCAweDA4MGMsIDB4NGJjNiwgMHgwMGVlLCAweDAwMTAsCisJMHgwODBjLCAweDJjOWMsIDB4MDBkZSwgMHgwODYwLCAweDA4MGMsIDB4OGY5NSwgMHgxMTU4LCAweDIwMDEsCisJMHgwMDA0LCAweDA4MGMsIDB4NGVmZCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAzLCAweDA4MGMsCisJMHg2Y2QzLCAweDAwMjAsIDB4MDgwYywgMHg4YzE5LCAweDA4MGMsIDB4OGRmNiwgMHgwMDA1LCAweDA0NjksCisJMHgxMTU4LCAweDIwMDEsIDB4MDAwOCwgMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDA1LCAweDA4MGMsIDB4NmNkMywgMHgwMDEwLCAweDA4MGMsIDB4OGRmNiwgMHgwMDA1LCAweDAwZTksCisJMHgxMTU4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDRlZmQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDEwLCAweDA4MGMsIDB4OGRmNiwgMHgwMDA1LCAweDIwMDksCisJMHhiYjhlLCAweDIxMDQsIDB4YTA4NiwgMHgwMDAzLCAweDExMzgsIDB4MjAwOSwgMHhiYjhmLCAweDIxMDQsCisJMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgyYTAwLCAweDAwMDUsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHgwMGM2LCAweDAwMTYsIDB4YWM4OCwgMHgwMDA2LCAweDIxNjQsIDB4MDgwYywgMHg0ZmI4LCAweDAwMWUsCisJMHgwMGNlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDE2LCAweDYwMTgsCisJMHgyMDY4LCAweDIwNzEsIDB4YjUzNSwgMHgyZTA0LCAweGEwODUsIDB4MDAwMywgMHgyMDcyLCAweDA4MGMsCisJMHg5MDI2LCAweDA1NjAsIDB4MjAwOSwgMHhiNTM1LCAweDIxMDQsIDB4YzBjZCwgMHgyMDBhLCAweDIwMDEsCisJMHhiNTUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTU4LCAweGEwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsCisJMHgwODBjLCAweGIwZTgsIDB4MjAwMSwgMHhiNTBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksCisJMHgwMDJhLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDJjNmYsIDB4MjA3MSwgMHhiNTAwLCAweDA4MGMsCisJMHgyYWI4LCAweDAwYzYsIDB4MDE1NiwgMHgyMGE5LCAweDAwODEsIDB4MjAwOSwgMHgwMDdmLCAweDA4MGMsCisJMHgyZDk3LCAweDgxMDgsIDB4MWYwNCwgMHg4ZmQ3LCAweDAxNWUsIDB4MDBjZSwgMHgwODBjLCAweDhmOTgsCisJMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZlLCAweDIwNzEsIDB4YmI4MCwgMHgyMDc5LCAweDAxMDAsCisJMHgyZTA0LCAweGEwODQsIDB4MDBmZiwgMHgyMDY5LCAweGI1MWMsIDB4MjA2YSwgMHg3OGU2LCAweDAwMDYsCisJMHg4ZTcwLCAweDJlMDQsIDB4MjA2OSwgMHhiNTFkLCAweDIwNmEsIDB4NzhlYSwgMHg3ODMyLCAweDc4MzYsCisJMHgyMDEwLCAweGEwODQsIDB4ZmYwMCwgMHgwMDFlLCAweGExMDUsIDB4MjAwOSwgMHhiNTI4LCAweDIwMGEsCisJMHgyMjAwLCAweGEwODQsIDB4MDBmZiwgMHgyMDA4LCAweDA4MGMsIDB4Mjg0NywgMHgwODBjLCAweDVhY2YsCisJMHgwMTcwLCAweDIwNjksIDB4YmI4ZSwgMHgyMDcxLCAweGI3YjIsIDB4NjgxMCwgMHgyMDcyLCAweDY4MTQsCisJMHg3MDA2LCAweDY4MTgsIDB4NzAwYSwgMHg2ODFjLCAweDcwMGUsIDB4MDgwYywgMHg5ZmQyLCAweDAwNDAsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDg2MWQsCisJMHgwMDFlLCAweDAwM2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsCisJMHgwMGU2LCAweDAxNTYsIDB4MjAxOSwgMHhiNTI4LCAweDIzMWMsIDB4ODNmZiwgMHgwMWU4LCAweDIwNzEsCisJMHhiYjgwLCAweDJlMTQsIDB4YTI5NCwgMHgwMGZmLCAweDcwMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEyMDUsCisJMHhhMzA2LCAweDExOTAsIDB4MjAxMSwgMHhiYjk2LCAweGFkOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDkwZGEsIDB4MTE0OCwgMHgyMDExLCAweGJiOWEsIDB4YWQ5OCwgMHgwMDA2LCAweDIwYTksCisJMHgwMDA0LCAweDA4MGMsIDB4OTBkYSwgMHgxMTAwLCAweDAxNWUsIDB4MDBlZSwgMHgwMDNlLCAweDAwMmUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiYjhjLCAweDcwMDQsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsCisJMHg3MDA4LCAweGEwODYsIDB4MDgwMCwgMHgxMTg4LCAweDcwMGMsIDB4ZDBlYywgMHgwMTYwLCAweGEwODQsCisJMHgwZjAwLCAweGEwODYsIDB4MDEwMCwgMHgxMTM4LCAweDcwMjQsIDB4ZDBhNCwgMHgxMTEwLCAweGQwYWMsCisJMHgwMTEwLCAweGEwMDYsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwgMHhiN2U5LCAweDI1MmMsIDB4MjAyMSwgMHhiN2VmLCAweDI0MjQsCisJMHgyMDYxLCAweGJkMDAsIDB4MjA3MSwgMHhiNTAwLCAweDcyNDgsIDB4NzA2OCwgMHhhMjAyLCAweDE2ZjAsCisJMHgwODBjLCAweGIxMTAsIDB4MDVhMCwgMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwNTgwLCAweGE3ODYsCisJMHgwMDA3LCAweDA1NjgsIDB4MjUwMCwgMHhhYzA2LCAweDA1NTAsIDB4MjQwMCwgMHhhYzA2LCAweDA1MzgsCisJMHgwMGM2LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDExMTAsIDB4MDgwYywgMHgxOTRkLCAweGE3ODYsCisJMHgwMDA4LCAweDExNDgsIDB4MDgwYywgMHg5ZTU4LCAweDExMzAsIDB4MDBjZSwgMHgwODBjLCAweDhjMTksCisJMHgwODBjLCAweDllMWQsIDB4MDBhMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNjAsCisJMHhhNzg2LCAweDAwMDMsIDB4MTFlOCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsCisJMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZTExLCAweDA4MGMsIDB4OWUxZCwgMHgwMGNlLCAweGFjZTAsCisJMHgwMDE4LCAweDcwNWMsIDB4YWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4OTA4NCwgMHgwMTJlLCAweDAwMGUsCisJMHgwMDJlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsCisJMHhhNzg2LCAweDAwMDYsIDB4MTExOCwgMHgwODBjLCAweGIwOTksIDB4MGMzMCwgMHhhNzg2LCAweDAwMGEsCisJMHgwOWUwLCAweDA4YzgsIDB4MjIwYywgMHgyMzA0LCAweGExMDYsIDB4MTEzMCwgMHg4MjEwLCAweDgzMTgsCisJMHgxZjA0LCAweDkwZGEsIDB4YTAwNiwgMHgwMDA1LCAweDIzMDQsIDB4YTEwMiwgMHgwMjE4LCAweDIwMDEsCisJMHgwMDAxLCAweDAwMTAsIDB4MjAwMSwgMHgwMDAwLCAweGExOGQsIDB4MDAwMSwgMHgwMDA1LCAweDYwMDQsCisJMHhhMDhhLCAweDAwODAsIDB4MWEwYywgMHgxNTE1LCAweDA4MGMsIDB4OWU0NywgMHgwMTIwLCAweDA4MGMsCisJMHg5ZTU4LCAweDAxNjgsIDB4MDAyOCwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHg5ZTU4LCAweDAxMzgsCisJMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDA4MGMsCisJMHg4YzE5LCAweDBjYjAsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OTEyMCwgMHg5MTIwLCAweDkxMjAsCisJMHg5MTIwLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIwLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIwLCAweDkxMjAsCisJMHg5MTIyLCAweDkxMjIsIDB4OTEyMiwgMHg5MTIyLCAweDkxMjAsIDB4OTEyMCwgMHg5MTIwLCAweDkxMjIsCisJMHgwODBjLCAweDE1MTUsIDB4NjAwYiwgMHhmZmZmLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsCisJMHg2YzhkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NzE3MywgMHgwMTJlLCAweDAwMDUsCisJMHhhMTg2LCAweDAwMTMsIDB4MTEyOCwgMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgwODA0LCAweDkxYmMsCisJMHhhMTg2LCAweDAwMjcsIDB4MTFlOCwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHgyYzljLCAweDAwZDYsCisJMHg2MTEwLCAweDIxNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNjgsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsCisJMHgwMDI5LCAweDY4NDcsIDB4MDAwMCwgMHg2OTRjLCAweGMxYzUsIDB4Njk0ZSwgMHgwODBjLCAweDU0MDgsCisJMHgwODBjLCAweDllMTEsIDB4MDBkZSwgMHgwODBjLCAweDg2MWQsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsCisJMHhhMTg2LCAweDAwMTQsIDB4MTEyMCwgMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgwNDI4LCAweGExODYsCisJMHgwMDQ2LCAweDAxMzgsIDB4YTE4NiwgMHgwMDQ1LCAweDAxMjAsIDB4YTE4NiwgMHgwMDQ3LCAweDE5MGMsCisJMHgxNTE1LCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwODQsIDB4MDE5OCwgMHgwMTI2LCAweDIwOTEsCisJMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4NmI3NCwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDBlLCAweDAxMmUsIDB4ZTAwMCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMiwgMHgxMTEwLCAweDA4MDQsCisJMHg5MWZhLCAweDA4MGMsIDB4ODY2MywgMHgwMDA1LCAweDAwMDIsIDB4OTE5YSwgMHg5MTk4LCAweDkxOTgsCisJMHg5MTk4LCAweDkxOTgsIDB4OTE5OCwgMHg5MTk4LCAweDkxOTgsIDB4OTE5OCwgMHg5MTk4LCAweDkxOTgsCisJMHg5MWI1LCAweDkxYjUsIDB4OTFiNSwgMHg5MWI1LCAweDkxOTgsIDB4OTFiNSwgMHg5MTk4LCAweDkxYjUsCisJMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LCAweDA4MGMsCisJMHg5YzVhLCAweDAxNjgsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsIDB4MDAwNiwgMHg2ODQ3LCAweDAwMDAsCisJMHg2ODUwLCAweGMwZWMsIDB4Njg1MiwgMHgwODBjLCAweDU0MDgsIDB4MDgwYywgMHg5ZTExLCAweDAwZGUsCisJMHgwODBjLCAweDg2MWQsIDB4MDgwYywgMHg3MTczLCAweDAwMDUsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsCisJMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDAwMDIsIDB4OTFkMiwgMHg5MWQwLCAweDkxZDAsCisJMHg5MWQwLCAweDkxZDAsIDB4OTFkMCwgMHg5MWQwLCAweDkxZDAsIDB4OTFkMCwgMHg5MWQwLCAweDkxZDAsCisJMHg5MWU0LCAweDkxZTQsIDB4OTFlNCwgMHg5MWU0LCAweDkxZDAsIDB4OTFmMywgMHg5MWQwLCAweDkxZTQsCisJMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDYwM2UsCisJMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHg3MTczLCAweDYwMTAsIDB4YTA4OCwgMHgwMDEzLCAweDIxMDQsCisJMHhhMDg1LCAweDA0MDAsIDB4MjAwYSwgMHgwMDA1LCAweDA4MGMsIDB4NzA5MCwgMHgyMDAxLCAweGI3YjYsCisJMHgyMDA0LCAweDYwMTYsIDB4MjAwMSwgMHhiN2I4LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMGYsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OTIxMCwgMHg5MjEwLCAweDkyMTAsCisJMHg5MjEwLCAweDkyMTAsIDB4OTIxMiwgMHg5MmY3LCAweDkzMjYsIDB4OTIxMCwgMHg5MjEwLCAweDkyMTAsCisJMHg5MjEwLCAweDkyMTAsIDB4OTIxMCwgMHg5MjEwLCAweDkyMTAsIDB4OTIxMCwgMHg5MjEwLCAweDkyMTAsCisJMHgwODBjLCAweDE1MTUsIDB4MDBlNiwgMHgwMGQ2LCAweDYwM2YsIDB4MDAwMCwgMHgyMDcxLCAweGJiODAsCisJMHg3MTI0LCAweDYxMGEsIDB4MjA3MSwgMHhiYjhjLCAweDYxMTAsIDB4MjE2OCwgMHg3NjE0LCAweGE2YjQsCisJMHgwZmZmLCAweDg2ZmYsIDB4MDkwNCwgMHg5MmMwLCAweGE2OGMsIDB4MGMwMCwgMHgwNTE4LCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMGZlLCAweDAxYzgsIDB4Njg0YywgMHhkMGFjLCAweDAxYjAsCisJMHg2MDIwLCAweGQwZGMsIDB4MTE5OCwgMHg2ODUwLCAweGQwYmMsIDB4MTE4MCwgMHg3MzE4LCAweDY4MTQsCisJMHhhMzA2LCAweDE5MDQsIDB4OTJkMywgMHg3MzFjLCAweDY4MTAsIDB4YTMxZSwgMHgwMTM4LCAweGQ2ZDQsCisJMHgwOTA0LCAweDkyZDMsIDB4NmIxNCwgMHhhMzA1LCAweDE5MDQsIDB4OTJkMywgMHg3MzE4LCAweDZiNjIsCisJMHg3MzFjLCAweDZiNWUsIDB4YTY4YywgMHgwMGZmLCAweGExODYsIDB4MDAwMiwgMHgwNTE4LCAweGExODYsCisJMHgwMDI4LCAweDExMjgsIDB4MDgwYywgMHg5ZTM2LCAweDY4NGIsIDB4MDAxYywgMHgwMGU4LCAweGQ2ZGMsCisJMHgwMWEwLCAweDY4NGIsIDB4MDAxNSwgMHg2ODRjLCAweGQwYWMsIDB4MDE3MCwgMHg2OTE0LCAweDZhMTAsCisJMHgyMTAwLCAweGEyMDUsIDB4MDE0OCwgMHg3MDE4LCAweGExMDYsIDB4MTExOCwgMHg3MDFjLCAweGEyMDYsCisJMHgwMTE4LCAweDY5NjIsIDB4NmE1ZSwgMHhjNmRjLCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweDY4NGIsCisJMHgwMDA3LCAweDAwMTAsIDB4Njg0YiwgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ZTQ2LCAweGEwMWUsCisJMHhkNmM0LCAweDAxZjAsIDB4YTY4NiwgMHgwMTAwLCAweDExNDAsIDB4MjAwMSwgMHhiYjk5LCAweDIwMDQsCisJMHhhMDA1LCAweDExMTgsIDB4YzZjNCwgMHgwODA0LCAweDkyMjEsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsCisJMHg4M2ZmLCAweDAxNzAsIDB4YTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsCisJMHgyMzA4LCAweDIwMTksIDB4YmI5OCwgMHhhZDkwLCAweDAwMTksIDB4MDgwYywgMHg5OTBkLCAweDAwM2UsCisJMHhkNmNjLCAweDA5MDQsIDB4OTJlNiwgMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwgMHgwOTA0LCAweDkyZTYsCisJMHhhMTkyLCAweDAwMjEsIDB4MTI2MCwgMHgyMDcxLCAweGJiOTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsCisJMHhhZDkwLCAweDAwMWQsIDB4MDgwYywgMHg5OTBkLCAweDA4MGMsIDB4YTEzNywgMHgwNGI4LCAweDY4MzgsCisJMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsIDB4MGM2OCwgMHgwMGY2LCAweDJkNzgsCisJMHgwODBjLCAweDk4YjIsIDB4MDBmZSwgMHgwODBjLCAweGExMzcsIDB4MDgwYywgMHg5OGZkLCAweDA0NDAsCisJMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg1MzA1LCAweDAwZmUsIDB4MDE5MCwgMHg2ODRjLCAweGQwYWMsCisJMHgwMTc4LCAweDYwMjAsIDB4ZDBkYywgMHgxMTYwLCAweDY4NTAsIDB4ZDBiYywgMHgxMTQ4LCAweDY4MTAsCisJMHg2OTE0LCAweGExMDUsIDB4MDEyOCwgMHgwODBjLCAweDlmMzUsIDB4MDBkZSwgMHgwMGVlLCAweDAwZjAsCisJMHg2ODRiLCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLCAweDZlNDYsIDB4Njg0YywgMHhkMGFjLCAweDAxMzAsCisJMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMTEwLCAweDA4MGMsIDB4OTQ4MywgMHgwODBjLCAweDU0MDgsCisJMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MmZmLCAweDAxMTAsIDB4ODIxMSwgMHg2YTNlLCAweDA4MGMsCisJMHg5ZjAzLCAweDAwZGUsIDB4MDBlZSwgMHgxMTEwLCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweDAwZjYsCisJMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHhiYjhjLCAweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsCisJMHg2MDEwLCAweDIwNzgsIDB4Nzg0YywgMHhkMGFjLCAweDAxMzgsIDB4NjAwMywgMHgwMDAyLCAweDAwZmUsCisJMHgwMDA1LCAweDIxMzAsIDB4MjIyOCwgMHgwMDU4LCAweDI0MDAsIDB4Nzk3YywgMHhhMTBhLCAweDIzMDAsCisJMHg3YTgwLCAweGEyMTMsIDB4MjYwMCwgMHhhMTAyLCAweDI1MDAsIDB4YTIwMywgMHgwZTkwLCAweDdjMTIsCisJMHg3YjE2LCAweDdlMGEsIDB4N2QwZSwgMHgwMGZlLCAweDYwM2YsIDB4MDAwMCwgMHgyYzEwLCAweDA4MGMsCisJMHgxZmE5LCAweDA4MGMsIDB4NmNmMCwgMHgwODBjLCAweDcyMzAsIDB4MDAwNSwgMHgyMDAxLCAweGI3YjgsCisJMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDA0LCAweDYxMTAsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsCisJMHgzZTIwLCAweDJjMTAsIDB4MDgwYywgMHgxODVlLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsCisJMHg5MzRiLCAweDkzNGIsIDB4OTM0YiwgMHg5MzRiLCAweDkzNGIsIDB4OTM0ZCwgMHg5M2UwLCAweDkzNGIsCisJMHg5MzRiLCAweDkzZjYsIDB4OTQ1YSwgMHg5MzRiLCAweDkzNGIsIDB4OTM0YiwgMHg5MzRiLCAweDk0NjksCisJMHg5MzRiLCAweDkzNGIsIDB4OTM0YiwgMHgwODBjLCAweDE1MTUsIDB4MDA3NiwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDIwNzEsIDB4YmI4YywgMHg2MTEwLCAweDIxNzgsIDB4NzYxNCwgMHhhNmI0LCAweDBmZmYsCisJMHg3ZTQ2LCAweDdmNGMsIDB4YzdlNSwgMHg3ZjRlLCAweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyZmYsCisJMHgwMTEwLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLCAweDA5MDQsIDB4OTNkYiwgMHhhNjk0LCAweGZmMDAsCisJMHhhMjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDE4LCAweDc4NjIsIDB4NzAxYywgMHg3ODVlLCAweGEyODQsCisJMHgwMzAwLCAweDA5MDQsIDB4OTNkYiwgMHgwODBjLCAweDE1ZjgsIDB4MDkwYywgMHgxNTE1LCAweDJkMDAsCisJMHg3ODRhLCAweDdmNGMsIDB4YzdjZCwgMHg3ZjRlLCAweDY4MzcsIDB4MDEwMywgMHg3ODM4LCAweDY4M2EsCisJMHg3ODNjLCAweDY4M2UsIDB4Nzg0MCwgMHg2ODQyLCAweDZlNDYsIDB4YTY4YywgMHgwYzAwLCAweDAxMjAsCisJMHg3MzE4LCAweDZiNjIsIDB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsCisJMHgwMTgwLCAweGExODYsIDB4MDAyOCwgMHgxMTE4LCAweDY4NGIsIDB4MDAxYywgMHgwMDYwLCAweGQ2ZGMsCisJMHgwMTE4LCAweDY4NGIsIDB4MDAxNSwgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHg2ODRiLCAweDAwMDcsCisJMHgwMDEwLCAweDY4NGIsIDB4MDAwMCwgMHg2ZjRlLCAweDc4NTAsIDB4Njg1MiwgMHg3ODU0LCAweDY4NTYsCisJMHhhMDFlLCAweGQ2YzQsIDB4MDE5OCwgMHg3MzI4LCAweDczMmMsIDB4NmI1NiwgMHg4M2ZmLCAweDAxNzAsCisJMHhhMzhhLCAweDAwMDksIDB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwgMHgyMzA4LCAweDIwMTksCisJMHhiYjk4LCAweGFkOTAsIDB4MDAxOSwgMHgwODBjLCAweDk5MGQsIDB4MDAzZSwgMHhkNmNjLCAweDAxZDgsCisJMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwgMHgwMWI4LCAweGExOTIsIDB4MDAyMSwgMHgxMjUwLCAweDIwNzEsCisJMHhiYjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZTE4LCAweGFkOTAsIDB4MDAxZCwgMHgwODBjLCAweDk5MGQsCisJMHgwMDUwLCAweDc4MzgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLCAweDBjNzgsCisJMHgyZDc4LCAweDA4MGMsIDB4OThiMiwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDdlLCAweDAwMDUsCisJMHgwMGY2LCAweDYwMDMsIDB4MDAwMywgMHgyMDc5LCAweGJiOGMsIDB4N2MwNCwgMHg3YjAwLCAweDdlMGMsCisJMHg3ZDA4LCAweDYwMTAsIDB4MjA3OCwgMHg3YzEyLCAweDdiMTYsIDB4N2UwYSwgMHg3ZDBlLCAweDAwZmUsCisJMHgyYzEwLCAweDA4MGMsIDB4MWZhOSwgMHgwODBjLCAweDdkNjAsIDB4MDAwNSwgMHgwMGQ2LCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMGZlLCAweDAxMjAsIDB4MjAwMSwgMHhiN2I4LCAweDIwMDQsCisJMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLCAweDcxMjYsIDB4MDgwYywgMHg3MjMwLCAweDYxMTAsCisJMHgyMTY4LCAweDY5NGMsIDB4ZDFlNCwgMHgwOTA0LCAweDk0NTgsIDB4ZDFjYywgMHgwNTQwLCAweDY5NDgsCisJMHg2ODM4LCAweGQwZmMsIDB4MDFlOCwgMHgwMDE2LCAweDY4NGMsIDB4MDAwNiwgMHg2ODUwLCAweDAwMDYsCisJMHhhZDkwLCAweDAwMGQsIDB4YTE5OCwgMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgwMTU2LCAweDIxYTgsCisJMHgyMzA0LCAweDIwMTIsIDB4ODMxOCwgMHg4MjEwLCAweDFmMDQsIDB4OTQyMCwgMHgwMTVlLCAweDAwMGUsCisJMHg2ODUyLCAweDAwMGUsIDB4Njg0ZSwgMHgwMDFlLCAweDIxNjgsIDB4MDgwYywgMHgxNjFmLCAweDA0MTgsCisJMHgwMDE2LCAweDA4MGMsIDB4MTYxZiwgMHgwMGRlLCAweDA4MGMsIDB4OThmZCwgMHgwMGUwLCAweDY4MzcsCisJMHgwMTAzLCAweDY5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsIDB4MDAwMiwgMHgwMTgwLCAweGEwODYsCisJMHgwMDI4LCAweDExMTgsIDB4Njg0YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDFkYywgMHgwMTE4LCAweDY4NGIsCisJMHgwMDE1LCAweDAwMzgsIDB4ZDFkNCwgMHgwMTE4LCAweDY4NGIsIDB4MDAwNywgMHgwMDEwLCAweDY4NGIsCisJMHgwMDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDlmMDMsIDB4MTExMCwgMHgwODBjLCAweDg2MWQsCisJMHgwMGRlLCAweDAwMDUsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2ZlNCwgMHg2MDAzLCAweDAwMDIsCisJMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLCAweDA4MGMsIDB4NzEyNiwgMHgwODBjLCAweDcyMzAsCisJMHgwMDA1LCAweDA4MGMsIDB4NzEyNiwgMHgwODBjLCAweDJjOWMsIDB4MDBkNiwgMHg2MTEwLCAweDIxNjgsCisJMHgwODBjLCAweDljNWEsIDB4MDE1MCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDI5LCAweDY4NDcsCisJMHgwMDAwLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDllMTEsIDB4MDBkZSwgMHgwODBjLCAweDg2MWQsCisJMHgwODBjLCAweDcyMzAsIDB4MDAwNSwgMHg2ODRiLCAweDAwMTUsIDB4ZDFmYywgMHgwMTM4LCAweDY4NGIsCisJMHgwMDA3LCAweDgwMDIsIDB4ODAwMCwgMHg4MTBhLCAweGExODksIDB4MDAwMCwgMHg2OTYyLCAweDY4NWUsCisJMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDk0YTcsIDB4OTRhNywgMHg5NGE3LCAweDk0YTcsCisJMHg5NGE3LCAweDk0YTksIDB4OTRhNywgMHg5NTY0LCAweDk1NzAsIDB4OTRhNywgMHg5NGE3LCAweDk0YTcsCisJMHg5NGE3LCAweDk0YTcsIDB4OTRhNywgMHg5NGE3LCAweDk0YTcsIDB4OTRhNywgMHg5NGE3LCAweDA4MGMsCisJMHgxNTE1LCAweDAwNzYsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MjA3MSwgMHhiYjhjLCAweDYxMTAsCisJMHgyMTc4LCAweDc2MTQsIDB4YTZiNCwgMHgwZmZmLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUzMDUsCisJMHgwMGZlLCAweDAxNTAsIDB4YTY4NCwgMHgwMGZmLCAweDExMzgsIDB4NjAyMCwgMHhkMGY0LCAweDAxMjAsCisJMHgwODBjLCAweDlmMzUsIDB4MDgwNCwgMHg5NTVmLCAweDdlNDYsIDB4N2Y0YywgMHhjN2U1LCAweDdmNGUsCisJMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MmZmLCAweDAxMTAsIDB4ODIxMSwgMHg2YTNlLCAweDg2ZmYsCisJMHgwOTA0LCAweDk1NTUsIDB4YTY5NCwgMHhmZjAwLCAweGEyODQsIDB4MGMwMCwgMHgwMTIwLCAweDcwMTgsCisJMHg3ODYyLCAweDcwMWMsIDB4Nzg1ZSwgMHhhMjg0LCAweDAzMDAsIDB4MDkwNCwgMHg5NTUzLCAweGE2ODYsCisJMHgwMTAwLCAweDExNDAsIDB4MjAwMSwgMHhiYjk5LCAweDIwMDQsIDB4YTAwNSwgMHgxMTE4LCAweGM2YzQsCisJMHg3ZTQ2LCAweDBjMjgsIDB4MDgwYywgMHgxNWY4LCAweDA5MGMsIDB4MTUxNSwgMHgyZDAwLCAweDc4NGEsCisJMHg3ZjRjLCAweGE3YmQsIDB4MDIwMCwgMHg3ZjRlLCAweDY4MzcsIDB4MDEwMywgMHg3ODM4LCAweDY4M2EsCisJMHg3ODNjLCAweDY4M2UsIDB4Nzg0MCwgMHg2ODQyLCAweDZlNDYsIDB4YTY4YywgMHgwYzAwLCAweDAxMjAsCisJMHg3MzE4LCAweDZiNjIsIDB4NzMxYywgMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsCisJMHgwMTgwLCAweGExODYsIDB4MDAyOCwgMHgxMTE4LCAweDY4NGIsIDB4MDAxYywgMHgwMDYwLCAweGQ2ZGMsCisJMHgwMTE4LCAweDY4NGIsIDB4MDAxNSwgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHg2ODRiLCAweDAwMDcsCisJMHgwMDEwLCAweDY4NGIsIDB4MDAwMCwgMHg2ZjRlLCAweDc4NTAsIDB4Njg1MiwgMHg3ODU0LCAweDY4NTYsCisJMHhhMDFlLCAweGQ2YzQsIDB4MDE5OCwgMHg3MzI4LCAweDczMmMsIDB4NmI1NiwgMHg4M2ZmLCAweDAxNzAsCisJMHhhMzhhLCAweDAwMDksIDB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwgMHgyMzA4LCAweDIwMTksCisJMHhiYjk4LCAweGFkOTAsIDB4MDAxOSwgMHgwODBjLCAweDk5MGQsIDB4MDAzZSwgMHhkNmNjLCAweDAxZDgsCisJMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwgMHgwMWI4LCAweGExOTIsIDB4MDAyMSwgMHgxMjUwLCAweDIwNzEsCisJMHhiYjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZTE4LCAweGFkOTAsIDB4MDAxZCwgMHgwODBjLCAweDk5MGQsCisJMHgwMDUwLCAweDc4MzgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHg2OTVhLCAweDBjNzgsCisJMHgyZDc4LCAweDA4MGMsIDB4OThiMiwgMHhkNmRjLCAweDExMTAsIDB4YTAwNiwgMHgwMDMwLCAweDIwMDEsCisJMHgwMDAxLCAweDIwNzEsIDB4YmI4YywgMHg3MjE4LCAweDczMWMsIDB4MDgwYywgMHgxOGIxLCAweDAwZGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDA3ZSwgMHgwMDA1LCAweDIwMDEsIDB4YjdiOCwgMHgyMDA0LCAweDYwM2UsCisJMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MDgwYywgMHgxODVlLCAweDAwMDUsCisJMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLCAweDAwZDYsIDB4NjAwMywgMHgwMDAyLCAweDYxMTAsCisJMHgyMTY4LCAweDY5NGMsIDB4ZDFlNCwgMHgwOTA0LCAweDk2N2IsIDB4NjAzZiwgMHgwMDAwLCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMGZlLCAweDA1NjAsIDB4NjgxNCwgMHg2OTEwLCAweGExMTUsCisJMHgwNTQwLCAweDZhNjAsIDB4YTIwNiwgMHgxMTE4LCAweDY4NWMsIDB4YTEwNiwgMHgwNTEwLCAweDY4NGMsCisJMHhjMGU0LCAweDY4NGUsIDB4Njg0NywgMHgwMDAwLCAweDY4NjMsIDB4MDAwMCwgMHg2ODVmLCAweDAwMDAsCisJMHg2MDIwLCAweGQwZjQsIDB4MTE1OCwgMHg2OTdjLCAweDY4MTAsIDB4YTEwMiwgMHg2MDNhLCAweDY5ODAsCisJMHg2ODE0LCAweGExMDMsIDB4NjAzNiwgMHg2MDIwLCAweGMwZjUsIDB4NjAyMiwgMHgwMGQ2LCAweDYwMTgsCisJMHgyMDY4LCAweDY4M2MsIDB4ODAwMCwgMHg2ODNlLCAweDAwZGUsIDB4MDgwYywgMHg5ZjM1LCAweDA4MDQsCisJMHg5NjdiLCAweDY5NGMsIDB4ZDFjYywgMHgwOTA0LCAweDk2NGIsIDB4Njk0OCwgMHg2ODM4LCAweGQwZmMsCisJMHgwOTA0LCAweDk2MGUsIDB4MDAxNiwgMHg2ODRjLCAweDAwMDYsIDB4Njg1MCwgMHgwMDA2LCAweDAwZjYsCisJMHgyMTc4LCAweDc5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsIDB4MDAwMiwgMHgwMWUwLCAweGEwODYsCisJMHgwMDI4LCAweDExMjgsIDB4Njg0YiwgMHgwMDFjLCAweDc4NGIsIDB4MDAxYywgMHgwMGU4LCAweGQxZGMsCisJMHgwMTU4LCAweDY4NGIsIDB4MDAxNSwgMHg3ODRiLCAweDAwMTUsIDB4MDgwYywgMHhhMGJmLCAweDAxMTgsCisJMHg3OTQ0LCAweGMxZGMsIDB4Nzk0NiwgMHgwMDgwLCAweGQxZDQsIDB4MDEyOCwgMHg2ODRiLCAweDAwMDcsCisJMHg3ODRiLCAweDAwMDcsIDB4MDA0OCwgMHg2ODRjLCAweGQwYWMsIDB4MDEzMCwgMHg2ODEwLCAweDY5MTQsCisJMHhhMTE1LCAweDAxMTAsIDB4MDgwYywgMHg5NDgzLCAweDY4NDgsIDB4Nzg0YSwgMHg2ODYwLCAweDc4NjIsCisJMHg2ODVjLCAweDc4NWUsIDB4YWQ5MCwgMHgwMDBkLCAweGFmOTgsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsCisJMHgwMTU2LCAweDIxYTgsIDB4MjMwNCwgMHgyMDEyLCAweDgzMTgsIDB4ODIxMCwgMHgxZjA0LCAweDk1ZmEsCisJMHgwMTVlLCAweDAwZmUsIDB4MDAwZSwgMHg2ODUyLCAweDAwMGUsIDB4Njg0ZSwgMHgwODBjLCAweGExMzcsCisJMHgwMDFlLCAweDIxNjgsIDB4MDgwYywgMHgxNjFmLCAweDA4MDQsIDB4OTY3NiwgMHgwMDE2LCAweDAwZjYsCisJMHgyMTc4LCAweDc5NDQsIDB4YTE4NCwgMHgwMGZmLCAweGEwYjYsIDB4MDAwMiwgMHgwMWUwLCAweGEwODYsCisJMHgwMDI4LCAweDExMjgsIDB4Njg0YiwgMHgwMDFjLCAweDc4NGIsIDB4MDAxYywgMHgwMGU4LCAweGQxZGMsCisJMHgwMTU4LCAweDY4NGIsIDB4MDAxNSwgMHg3ODRiLCAweDAwMTUsIDB4MDgwYywgMHhhMGJmLCAweDAxMTgsCisJMHg3OTQ0LCAweGMxZGMsIDB4Nzk0NiwgMHgwMDgwLCAweGQxZDQsIDB4MDEyOCwgMHg2ODRiLCAweDAwMDcsCisJMHg3ODRiLCAweDAwMDcsIDB4MDA0OCwgMHg2ODRjLCAweGQwYWMsIDB4MDEzMCwgMHg2ODEwLCAweDY5MTQsCisJMHhhMTE1LCAweDAxMTAsIDB4MDgwYywgMHg5NDgzLCAweDY4NjAsIDB4Nzg2MiwgMHg2ODVjLCAweDc4NWUsCisJMHg2ODRjLCAweDc4NGUsIDB4MDBmZSwgMHgwODBjLCAweDE2MWYsIDB4MDBkZSwgMHgwODBjLCAweGExMzcsCisJMHgwODBjLCAweDk4ZmQsIDB4MDQ1OCwgMHg2ODM3LCAweDAxMDMsIDB4Njk0NCwgMHhhMTg0LCAweDAwZmYsCisJMHhhMGI2LCAweDAwMDIsIDB4MDFiMCwgMHhhMDg2LCAweDAwMjgsIDB4MTExOCwgMHg2ODRiLCAweDAwMWMsCisJMHgwMGQ4LCAweGQxZGMsIDB4MDE0OCwgMHg2ODRiLCAweDAwMTUsIDB4MDgwYywgMHhhMGJmLCAweDAxMTgsCisJMHg2OTQ0LCAweGMxZGMsIDB4Njk0NiwgMHgwMDgwLCAweGQxZDQsIDB4MDExOCwgMHg2ODRiLCAweDAwMDcsCisJMHgwMDU4LCAweDY4NGIsIDB4MDAwMCwgMHg2ODRjLCAweGQwYWMsIDB4MDEzMCwgMHg2ODEwLCAweDY5MTQsCisJMHhhMTE1LCAweDAxMTAsIDB4MDgwYywgMHg5NDgzLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDlmMDMsCisJMHgxMTEwLCAweDA4MGMsIDB4ODYxZCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg3MDkwLCAweDAwMTAsCisJMHgwODBjLCAweDcxMjYsIDB4MDgwYywgMHg5YzVhLCAweDAxYzAsIDB4MDBkNiwgMHg2MTEwLCAweDIxNjgsCisJMHg2ODM3LCAweDAxMDMsIDB4MjAwOSwgMHhiNTBjLCAweDIxMGMsIDB4ZDE4YywgMHgxMWMwLCAweGQxODQsCisJMHgxMTk4LCAweDYxMDgsIDB4Njk0YSwgMHhhMThlLCAweDAwMjksIDB4MTExMCwgMHgwODBjLCAweGIzODAsCisJMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1NDA4LCAweDAwZGUsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsCisJMHg3MTczLCAweDA4MGMsIDB4NzIzMCwgMHgwMDA1LCAweDY4NGIsIDB4MDAwNCwgMHgwYzg4LCAweDY4NGIsCisJMHgwMDA0LCAweDBjNzAsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OTZjMCwgMHg5NmMwLCAweDk2YzAsCisJMHg5NmMwLCAweDk2YzAsIDB4OTZjMiwgMHg5NmMwLCAweDk2YzUsIDB4OTZjMCwgMHg5NmMwLCAweDk2YzAsCisJMHg5NmMwLCAweDk2YzAsIDB4OTZjMCwgMHg5NmMwLCAweDk2YzAsIDB4OTZjMCwgMHg5NmMwLCAweDk2YzAsCisJMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsIDB4MDAwNiwgMHgwMDI2LCAweGEwMTYsCisJMHgwODBjLCAweDE4NWUsIDB4MDAyZSwgMHgwMDBlLCAweDAwMDUsIDB4YTE4MiwgMHgwMDg1LCAweDAwMDIsCisJMHg5NmQ5LCAweDk2ZDcsIDB4OTZkNywgMHg5NmU1LCAweDk2ZDcsIDB4OTZkNywgMHg5NmQ3LCAweDA4MGMsCisJMHgxNTE1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4NmM4ZCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NzE3MywgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDU2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNzEsIDB4YmI4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwgMHgwODBjLCAweDljNGEsCisJMHgwMWEwLCAweDIyNjgsIDB4NjgwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE3OCwgMHg2MDE4LCAweDZkMTgsCisJMHhhNTJlLCAweDExNTgsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4OTkxZCwgMHgwMGNlLCAweDAxMjgsCisJMHg2ODAzLCAweDAwMDIsIDB4NjAwNywgMHgwMDg2LCAweDAwMTAsIDB4NjAwNywgMHgwMDg3LCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsIDB4MDBmNiwgMHgyMjc4LCAweDA4MGMsCisJMHg1MzA1LCAweDAwZmUsIDB4MDE1MCwgMHg2ODIwLCAweGQwZWMsIDB4MDEzOCwgMHgwMGM2LCAweDIyNjAsCisJMHg2MDNmLCAweDAwMDAsIDB4MDgwYywgMHg5ZjM1LCAweDAwY2UsIDB4MDBlZSwgMHgwMGRlLCAweDAwNWUsCisJMHgwMDJlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHhhMDhhLCAweDAwODUsCisJMHgwYTBjLCAweDE1MTUsIDB4YTA4YSwgMHgwMDhjLCAweDFhMGMsIDB4MTUxNSwgMHhhMDgyLCAweDAwODUsCisJMHgwMDcyLCAweGExODYsIDB4MDAyNywgMHgwMTIwLCAweGExODYsIDB4MDAxNCwgMHgxOTBjLCAweDE1MTUsCisJMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDk3NDYsCisJMHg5NzQ4LCAweDk3NDgsIDB4OTc0NiwgMHg5NzQ2LCAweDk3NDYsIDB4OTc0NiwgMHgwODBjLCAweDE1MTUsCisJMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweGExODYsCisJMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHhhMDgyLCAweDAwODUsIDB4MjAwOCwgMHgwNGE4LCAweGExODYsCisJMHgwMDI3LCAweDExZTgsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4MmM5YywgMHgwMGQ2LCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMTUwLCAweDY4MzcsIDB4MDEwMywgMHg2ODQ3LCAweDAwMDAsCisJMHg2ODRiLCAweDAwMjksIDB4MDgwYywgMHg1NDA4LCAweDA4MGMsIDB4OWUxMSwgMHgwMGRlLCAweDA4MGMsCisJMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDA4MGMsIDB4ODY2MywgMHgwY2UwLCAweGExODYsCisJMHgwMDE0LCAweDFkZDAsIDB4MDgwYywgMHg3MDkwLCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsCisJMHg5YzVhLCAweDBkNjAsIDB4NjgzNywgMHgwMTAzLCAweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDYsCisJMHg2ODUwLCAweGMwZWMsIDB4Njg1MiwgMHgwOGYwLCAweDAwMDIsIDB4OTc5NiwgMHg5Nzk0LCAweDk3OTQsCisJMHg5Nzk0LCAweDk3OTQsIDB4OTc5NCwgMHg5N2FlLCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDcwOTAsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMTE4LCAweGExODYsCisJMHgwMDM1LCAweDExMTgsIDB4MjAwMSwgMHhiN2I2LCAweDAwMTAsIDB4MjAwMSwgMHhiN2I3LCAweDIwMDQsCisJMHg2MDE2LCAweDYwMDMsIDB4MDAwYywgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDcwOTAsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMTE4LCAweGExODYsCisJMHgwMDM1LCAweDExMTgsIDB4MjAwMSwgMHhiN2I2LCAweDAwMTAsIDB4MjAwMSwgMHhiN2I3LCAweDIwMDQsCisJMHg2MDE2LCAweDYwMDMsIDB4MDAwZSwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMTgyLCAweDAwOGMsCisJMHgxMjIwLCAweGExODIsIDB4MDA4NSwgMHgwMjA4LCAweDAwMWEsIDB4MDgwYywgMHg4NjYzLCAweDAwMDUsCisJMHg5N2Q3LCAweDk3ZDcsIDB4OTdkNywgMHg5N2Q3LCAweDk3ZDksIDB4OTgzMiwgMHg5N2Q3LCAweDA4MGMsCisJMHgxNTE1LCAweDAwZDYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMGZlLCAweDAxNjgsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMTE4LCAweGExODYsCisJMHgwMDM1LCAweDExMTgsIDB4MDBkZSwgMHgwODA0LCAweDk4NDUsIDB4MDgwYywgMHg5YzVhLCAweDExMTgsCisJMHgwODBjLCAweDllMTEsIDB4MDBmMCwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGU0LCAweDExMTAsCisJMHgwODBjLCAweDllMTEsIDB4NjgzNywgMHgwMTAzLCAweDY4NTAsIDB4ZDBiNCwgMHgwMTI4LCAweDY4NGIsCisJMHgwMDA2LCAweGMwZWMsIDB4Njg1MiwgMHgwMDQ4LCAweGQwYmMsIDB4MDExOCwgMHg2ODRiLCAweDAwMDIsCisJMHgwMDIwLCAweDY4NGIsIDB4MDAwNSwgMHgwODBjLCAweDllZDIsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsCisJMHg1NDA4LCAweDJjNjgsIDB4MDgwYywgMHg4NWM3LCAweDAxYzAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDFlLCAweDYwMGIsIDB4ZmZmZiwgMHgyMDA5LCAweGJiOGUsIDB4MjEwYywgMHg2MTM2LCAweDIwMDksCisJMHhiYjhmLCAweDIxMGMsIDB4NjEzYSwgMHg2OTE4LCAweDYxMWEsIDB4MDgwYywgMHhhMDI3LCAweDY5NTAsCisJMHg2MTUyLCAweDYwMWYsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsIDB4MmQ2MCwgMHgwODBjLCAweDg2MWQsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgwMGZlLCAweDA1OTgsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzNSwgMHgwMTMwLCAweGExODYsCisJMHgwMDFlLCAweDAxMTgsIDB4YTE4NiwgMHgwMDM5LCAweDE1MzAsIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsCisJMHhhMTBhLCAweDE5MDQsIDB4OTg4YSwgMHgwODBjLCAweDg1YzcsIDB4MDFkOCwgMHg2MTA2LCAweDYwMDMsCisJMHgwMDAxLCAweDYwMWYsIDB4MDAwMSwgMHg2OTE4LCAweDYxMWEsIDB4NjkyOCwgMHg2MTJhLCAweDY5MmMsCisJMHg2MTJlLCAweDY5MzAsIDB4YTE4YywgMHgwMGZmLCAweDYxMzIsIDB4NjkzNCwgMHg2MTM2LCAweDY5MzgsCisJMHg2MTNhLCAweDY5NTAsIDB4NjE1MiwgMHgwODBjLCAweGEwMjcsIDB4MDgwYywgMHg2YzhkLCAweDA4MGMsCisJMHg3MTczLCAweDJkNjAsIDB4MDBmOCwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDljNWEsCisJMHgwMWM4LCAweDY4MzcsIDB4MDEwMywgMHg2ODUwLCAweGQwYjQsIDB4MDEyOCwgMHhjMGVjLCAweDY4NTIsCisJMHg2ODRiLCAweDAwMDYsIDB4MDA0OCwgMHhkMGJjLCAweDAxMTgsIDB4Njg0YiwgMHgwMDAyLCAweDAwMjAsCisJMHg2ODRiLCAweDAwMDUsIDB4MDgwYywgMHg5ZWQyLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDU0MDgsCisJMHgwODBjLCAweDllMTEsIDB4MDBkZSwgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHgwMDE2LCAweDAwZDYsCisJMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxNDAsIDB4NjgzNywgMHgwMTAzLCAweDY4NGIsCisJMHgwMDI4LCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDU0MDgsIDB4MDBkZSwgMHgwMDFlLCAweGExODYsCisJMHgwMDEzLCAweDAxNDgsIDB4YTE4NiwgMHgwMDE0LCAweDAxMzAsIDB4YTE4NiwgMHgwMDI3LCAweDAxMTgsCisJMHgwODBjLCAweDg2NjMsIDB4MDAzMCwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4MDA1NiwgMHgwMDY2LCAweDAwZDYsIDB4MDBmNiwgMHgyMDI5LCAweDAwMDEsCisJMHhhMTgyLCAweDAxMDEsIDB4MTIwOCwgMHgwMDEwLCAweDIwMDksIDB4MDEwMCwgMHgyMTMwLCAweDIwNjksCisJMHhiYjk4LCAweDgzMWMsIDB4MjMwMCwgMHhhZDE4LCAweDIwMDksIDB4MDAyMCwgMHhhZjkwLCAweDAwMWQsCisJMHgwODBjLCAweDk5MGQsIDB4YTZiMiwgMHgwMDIwLCAweDc4MDQsIDB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsCisJMHgxNjFmLCAweDA4MGMsIDB4MTVmOCwgMHgwNTAwLCAweDg1MjgsIDB4NjgzNywgMHgwMTEwLCAweDY4M2IsCisJMHgwMDAwLCAweDJkMjAsIDB4N2MwNiwgMHhhNjhhLCAweDAwM2QsIDB4MTIyOCwgMHgyNjA4LCAweGFkOTAsCisJMHgwMDBmLCAweDA0NTksIDB4MDA4OCwgMHhhNmIyLCAweDAwM2MsIDB4MjAwOSwgMHgwMDNjLCAweDJkNzgsCisJMHhhZDkwLCAweDAwMGYsIDB4MDQxMSwgMHgwYzI4LCAweDAwZmUsIDB4ODUyZiwgMHhhNWFkLCAweDAwMDMsCisJMHg3ZDM2LCAweGE1YWMsIDB4MDAwMCwgMHgwMDI4LCAweDAwZmUsIDB4ODUyZiwgMHhhNWFkLCAweDAwMDMsCisJMHg3ZDM2LCAweDAwZGUsIDB4MDA2ZSwgMHgwMDVlLCAweDAwMDUsIDB4MDBmNiwgMHg4ZGZmLCAweDAxNTgsCisJMHg2ODA0LCAweGEwN2QsIDB4MDEzMCwgMHg2ODA3LCAweDAwMDAsIDB4MDgwYywgMHg1NDA4LCAweDJmNjgsCisJMHgwY2I4LCAweDA4MGMsIDB4NTQwOCwgMHgwMGZlLCAweDAwMDUsIDB4MDE1NiwgMHhhMTg0LCAweDAwMDEsCisJMHgwMTA4LCAweDgxMDgsIDB4ODEwYywgMHgyMWE4LCAweDIzMDQsIDB4ODAwNywgMHgyMDEyLCAweDgzMTgsCisJMHg4MjEwLCAweDFmMDQsIDB4OTkxNCwgMHgwMTVlLCAweDAwMDUsIDB4MDA2NiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwMzEsIDB4MDAwMSwgMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDgzLCAweDAxMmUsCisJMHgwMDZlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA2NiwgMHgyMDMxLCAweDAwMDAsCisJMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgwMDFiLCAweDAwNmUsIDB4MDEyZSwgMHgwMDA1LCAweDk5NTQsCisJMHg5OTU0LCAweDk5NGYsIDB4OTk3NiwgMHg5OTQyLCAweDk5NGYsIDB4OTk3NiwgMHg5OTRmLCAweDk5NGYsCisJMHg5OTQyLCAweDk5NGYsIDB4MDgwYywgMHgxNTE1LCAweDAwMzYsIDB4MjAxOSwgMHgwMDEwLCAweDA4MGMsCisJMHhhY2UwLCAweDYwMWYsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDAzZSwgMHgwMDA1LCAweGEwMDYsCisJMHgwMDA1LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZDYsIDB4ODZmZiwgMHgxMWQ4LCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OWM1YSwgMHgwMWMwLCAweDY4MzQsIDB4YTA4NiwgMHgwMTM5LCAweDExMjgsCisJMHg2ODRiLCAweDAwMDUsIDB4Njg1MywgMHgwMDAwLCAweDAwMjgsIDB4YTAwZSwgMHgyMDAxLCAweDAwMDUsCisJMHgwODBjLCAweDU0ZGIsIDB4MDgwYywgMHg5ZWQyLCAweDA4MGMsIDB4NTQwOCwgMHgwODBjLCAweDg2MWQsCisJMHhhMDg1LCAweDAwMDEsIDB4MDBkZSwgMHgwMDA1LCAweGEwMDYsIDB4MGNlMCwgMHg2MDAwLCAweGEwOGEsCisJMHgwMDEwLCAweDFhMGMsIDB4MTUxNSwgMHgwMDBiLCAweDAwMDUsIDB4OTk4ZCwgMHg5OWFlLCAweDk5OGYsCisJMHg5OWNkLCAweDk5YWIsIDB4OTk4ZCwgMHg5OTRmLCAweDk5NTQsIDB4OTk1NCwgMHg5OTRmLCAweDk5NGYsCisJMHg5OTRmLCAweDk5NGYsIDB4OTk0ZiwgMHg5OTRmLCAweDk5NGYsIDB4MDgwYywgMHgxNTE1LCAweDg2ZmYsCisJMHgxMWI4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDAxOTgsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsCisJMHgwODBjLCAweDljNWEsIDB4MDExMCwgMHgwODBjLCAweDllZDIsIDB4MDBkZSwgMHg2MDA3LCAweDAwODUsCisJMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDE5NGQsIDB4MGMwOCwgMHgwMGU2LCAweDIwNzEsCisJMHhiN2UwLCAweDcwMjQsIDB4YWMwNiwgMHgxMTEwLCAweDA4MGMsIDB4N2Y1OSwgMHg2MDFjLCAweGEwODQsCisJMHgwMDBmLCAweGEwODYsIDB4MDAwNiwgMHgxMTUwLCAweDAwODYsIDB4MDA5NiwgMHgyMDQ5LCAweDAwMDEsCisJMHgyYzQwLCAweDA4MGMsIDB4ODEzMCwgMHgwMDllLCAweDAwOGUsIDB4MDAxMCwgMHgwODBjLCAweDdlNTgsCisJMHgwMGVlLCAweDE5MjgsIDB4MDgwYywgMHg5OTRmLCAweDAwMDUsIDB4MDAzNiwgMHgwMGU2LCAweDIwNzEsCisJMHhiN2UwLCAweDcwM2MsIDB4YWMwNiwgMHgxMTQwLCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDdmZTQsCisJMHgwMGVlLCAweDAwM2UsIDB4MDgwNCwgMHg5OThmLCAweDA4MGMsIDB4ODI1ZCwgMHgwMGVlLCAweDAwM2UsCisJMHgxOTA0LCAweDk5OGYsIDB4MDgwYywgMHg5OTRmLCAweDAwMDUsIDB4MDBjNiwgMHg2MDFjLCAweGEwODQsCisJMHgwMDBmLCAweDAwMTMsIDB4MDBjZSwgMHgwMDA1LCAweDk5ZmUsIDB4OWE2YiwgMHg5YmI5LCAweDlhMDksCisJMHg5ZTFkLCAweDk5ZmUsIDB4YWNkMiwgMHhhMTRlLCAweDlhNmIsIDB4OTlmNywgMHg5YzI0LCAweDA4MGMsCisJMHgxNTE1LCAweDA4MGMsIDB4OWU1OCwgMHgxMTEwLCAweDA4MGMsIDB4OGMxOSwgMHgwMDA1LCAweDA4MGMsCisJMHg3MDkwLCAweDA4MGMsIDB4NzE3MywgMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDEsCisJMHgwMDA1LCAweDA4MGMsIDB4OWM1YSwgMHgwMTIwLCAweDYwMTAsIDB4YTA4MCwgMHgwMDE5LCAweDJjMDIsCisJMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsIDB4MDAwYiwgMHgwMDA1LCAweDlhMjcsCisJMHg5YTI5LCAweDlhNDksIDB4OWE1YiwgMHg5YTY4LCAweDlhMjcsIDB4OTlmZSwgMHg5OWZlLCAweDk5ZmUsCisJMHg5YTViLCAweDlhNWIsIDB4OWEyNywgMHg5YTI3LCAweDlhMjcsIDB4OWEyNywgMHg5YTY1LCAweDA4MGMsCisJMHgxNTE1LCAweDAwZTYsIDB4NjAxMCwgMHgyMDcwLCAweDcwNTAsIDB4YzBiNSwgMHg3MDUyLCAweDIwNzEsCisJMHhiN2UwLCAweDcwMjQsIDB4YWMwNiwgMHgwMTkwLCAweDA4MGMsIDB4N2U1OCwgMHg2MDA3LCAweDAwODUsCisJMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDIwMDEsIDB4YjdiNywgMHgyMDA0LCAweDYwMTYsCisJMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLCAweDAwZWUsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDEsCisJMHgwY2Q4LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTAsIDB4YzBiNSwgMHg2ODUyLCAweDAwZGUsCisJMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgwODBjLCAweDZjOGQsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwMGQ2LCAweDYwMTcsIDB4MDAwMSwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsCisJMHgwODBjLCAweDE5NGQsIDB4MDhmMCwgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsCisJMHgwMDBiLCAweDAwMDUsIDB4OWE4MiwgMHg5YTA2LCAweDlhODQsIDB4OWE4MiwgMHg5YTg0LCAweDlhODQsCisJMHg5OWZmLCAweDlhODIsIDB4OTlmOSwgMHg5OWY5LCAweDlhODIsIDB4OWE4MiwgMHg5YTgyLCAweDlhODIsCisJMHg5YTgyLCAweDlhODIsIDB4MDgwYywgMHgxNTE1LCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDQsCisJMHhhMDg0LCAweDAwZmYsIDB4MDBkZSwgMHhhMDhhLCAweDAwMGMsIDB4MWEwYywgMHgxNTE1LCAweDAwMGIsCisJMHgwMDA1LCAweDlhOWQsIDB4OWI1ZiwgMHg5YTlmLCAweDlhZGQsIDB4OWE5ZiwgMHg5YWRkLCAweDlhOWYsCisJMHg5YWFkLCAweDlhOWQsIDB4OWFkZCwgMHg5YTlkLCAweDlhYzksIDB4MDgwYywgMHgxNTE1LCAweDYwMDQsCisJMHhhMDhlLCAweDAwMTYsIDB4MDVhOCwgMHhhMDhlLCAweDAwMDQsIDB4MDU5MCwgMHhhMDhlLCAweDAwMDIsCisJMHgwNTc4LCAweGEwOGUsIDB4MDA0YiwgMHgwOTA0LCAweDliNWIsIDB4NjAwNCwgMHgwODBjLCAweDllNTgsCisJMHgwOTA0LCAweDliNzgsIDB4YTA4ZSwgMHgwMDIxLCAweDA5MDQsIDB4OWI3YywgMHhhMDhlLCAweDAwMjIsCisJMHgwOTA0LCAweDliNzgsIDB4YTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4OWI3YywgMHhhMDhlLCAweDAwMzksCisJMHgwOTA0LCAweDliODAsIDB4YTA4ZSwgMHgwMDM1LCAweDA5MDQsIDB4OWI4MCwgMHhhMDhlLCAweDAwMWUsCisJMHgwMTg4LCAweGEwOGUsIDB4MDAwMSwgMHgxMTUwLCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDQsCisJMHhhMDg0LCAweDAwZmYsIDB4MDBkZSwgMHhhMDg2LCAweDAwMDYsIDB4MDExMCwgMHgwODBjLCAweDJjOWMsCisJMHgwODBjLCAweDhjMTksIDB4MDgwYywgMHg5ZTFkLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDYxMDQsCisJMHhhMTg2LCAweDAwMTYsIDB4MDkwNCwgMHg5YjRjLCAweGExODYsIDB4MDAwMiwgMHgxNWQ4LCAweDIwMDEsCisJMHhiNTM1LCAweDIwMDQsIDB4ZDA4YywgMHgxMTk4LCAweDA4MGMsIDB4NWFjZiwgMHgxMTgwLCAweDIwMDEsCisJMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsIDB4MjAwMywgMHgwMDAxLCAweGEwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4NWIxMywgMHgwODBjLCAweDVhMDcsIDB4MDgwNCwgMHg5YmEyLCAweDYwMTgsCisJMHgyMDY4LCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LCAweGQwYWMsIDB4MTkwNCwgMHg5YmEyLCAweDY4YTAsCisJMHhkMGJjLCAweDE5MDQsIDB4OWJhMiwgMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAxOTAsCisJMHg4MDAxLCAweDY4NDIsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDAwNywgMHg2MDE3LCAweDAzOTgsCisJMHg2MDNmLCAweDAwMDAsIDB4MDgwYywgMHg4NWM3LCAweDAxMjgsIDB4MmQwMCwgMHg2MDFhLCAweDYwMWYsCisJMHgwMDAxLCAweDA0NTAsIDB4MDBkZSwgMHgwMGNlLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDExYTgsCisJMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODYsIDB4MDA3ZSwgMHgxMTcwLCAweDIwMDksCisJMHhiNTM1LCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDAwZTYsIDB4MjA3MSwgMHhiNTAwLCAweDA4MGMsCisJMHg0YmM2LCAweDAwZWUsIDB4MDgwYywgMHg4YzE5LCAweDAwMjAsIDB4MDgwYywgMHg4YzE5LCAweDA4MGMsCisJMHgyYzljLCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgyY2MyLCAweDAxMmUsCisJMHgwMGVlLCAweDA4MGMsIDB4OWUxZCwgMHgwMDA1LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDRlZmQsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4NmNkMywgMHgwODBjLCAweDcxNzMsCisJMHgwMGRlLCAweDAwY2UsIDB4MGM4MCwgMHgwODBjLCAweDJjYzIsIDB4MDgwNCwgMHg5YWQ4LCAweDAwYzYsCisJMHgwMGQ2LCAweDYxMDQsIDB4YTE4NiwgMHgwMDE2LCAweDBkMzgsIDB4NjAxOCwgMHgyMDY4LCAweDY4NDAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwOTA0LCAweDliMjIsIDB4ODAwMSwgMHg2ODQyLCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwODBjLCAweDcxNzMsIDB4MDBkZSwgMHgwMGNlLCAweDA4OTgsCisJMHgwODBjLCAweDhjMTksIDB4MDgwNCwgMHg5YWRhLCAweDA4MGMsIDB4OGM0NywgMHgwODA0LCAweDlhZGEsCisJMHgwMGQ2LCAweDJjNjgsIDB4NjEwNCwgMHgwODBjLCAweGExMGEsIDB4MDBkZSwgMHgwMTE4LCAweDA4MGMsCisJMHg4NjFkLCAweDAwYjgsIDB4NjAwNCwgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLCAweGExMDUsCisJMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDYwMzgsCisJMHg2MDBhLCAweDIwMDEsIDB4YjdiNywgMHgyMDA0LCAweDYwMTYsIDB4MDgwYywgMHg2YzhkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4MDBkZSwgMHgwMGNlLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDJjOWMsCisJMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MmNjMiwgMHg2MDEzLCAweDAwMDAsCisJMHg2MDFmLCAweDAwMDcsIDB4NjAxNywgMHgwMzk4LCAweDYwM2YsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsCisJMHgwMDA1LCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLCAweDFhMGMsIDB4MTUxNSwgMHgwMDBiLCAweDAwMDUsCisJMHg5YmQwLCAweDliZDAsIDB4OWJkMCwgMHg5YmQwLCAweDliZDAsIDB4OWJkMCwgMHg5YmQwLCAweDliZDAsCisJMHg5YmQwLCAweDk5ZmUsIDB4OWJkMCwgMHg5YTA2LCAweDliZDIsIDB4OWEwNiwgMHg5YmRmLCAweDliZDAsCisJMHgwODBjLCAweDE1MTUsIDB4NjAwNCwgMHhhMDg2LCAweDAwOGIsIDB4MDE0OCwgMHg2MDA3LCAweDAwOGIsCisJMHg2MDAzLCAweDAwMGQsIDB4MDgwYywgMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDA4MGMsCisJMHg5ZTExLCAweDA4MGMsIDB4OWM1YSwgMHgwNTgwLCAweDA4MGMsIDB4MmM5YywgMHgwMGQ2LCAweDA4MGMsCisJMHg5YzVhLCAweDAxNjgsIDB4NjAxMCwgMHgyMDY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMDYsCisJMHg2ODQ3LCAweDAwMDAsIDB4Njg1MCwgMHhjMGVkLCAweDY4NTIsIDB4MDgwYywgMHg1NDA4LCAweDJjNjgsCisJMHgwODBjLCAweDg1YzcsIDB4MDE1MCwgMHg2ODE4LCAweDYwMWEsIDB4MDgwYywgMHhhMDI3LCAweDAwYzYsCisJMHgyZDYwLCAweDA4MGMsIDB4OWUxZCwgMHgwMGNlLCAweDAwMDgsIDB4MmQ2MCwgMHgwMGRlLCAweDYwMTMsCisJMHgwMDAwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg2Y2QzLCAweDA4MGMsIDB4NzE3MywgMHgwMDc4LCAweDYwMzAsIDB4YTA4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMTg2LCAweDAwMzksIDB4MDExOCwgMHhhMTg2LCAweDAwMzUsIDB4MTExOCwgMHgwODBjLCAweDJjOWMsCisJMHgwOGIwLCAweDA4MGMsIDB4OWUxZCwgMHgwMDA1LCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLCAweDFhMGMsCisJMHgxNTE1LCAweDAwMGIsIDB4MDAwNSwgMHg5YzNiLCAweDljM2IsIDB4OWMzYiwgMHg5YzNkLCAweDljM2QsCisJMHg5YzNiLCAweDljM2IsIDB4OWMzYiwgMHg5YzNiLCAweDljM2IsIDB4OWMzYiwgMHg5YzNiLCAweDljM2IsCisJMHg5YzNiLCAweDljM2IsIDB4OWMzYiwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg4MjVkLCAweDE5MGMsCisJMHgxNTE1LCAweDYxMTAsIDB4MjE2OCwgMHg2ODRiLCAweDAwMDYsIDB4MDgwYywgMHg1NDA4LCAweDA4MGMsCisJMHg4NjFkLCAweDAwMDUsIDB4YTI4NCwgMHgwMDA3LCAweDExNTgsIDB4YTI4MiwgMHhiZDAwLCAweDAyNDAsCisJMHgyMDAxLCAweGI1MTcsIDB4MjAwNCwgMHhhMjAyLCAweDEyMTgsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZTgsIDB4MDAyNiwgMHg2MjEwLCAweGEyOTQsIDB4ZjAwMCwgMHgwMDJlLCAweDAwMDUsCisJMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsCisJMHhiZDAwLCAweDIwNzEsIDB4YjUwMCwgMHg3MzQ4LCAweDcwNjgsIDB4YTMwMiwgMHgxMmE4LCAweDYwMWMsCisJMHhhMjA2LCAweDExNjAsIDB4MDgwYywgMHg5ZmIyLCAweDAxNDgsIDB4MDgwYywgMHg5ZTU4LCAweDExMTAsCisJMHgwODBjLCAweDhjMTksIDB4MDBjNiwgMHgwODBjLCAweDg2MWQsIDB4MDBjZSwgMHhhY2UwLCAweDAwMTgsCisJMHg3MDVjLCAweGFjMDIsIDB4MTIwOCwgMHgwYzM4LCAweDAxMmUsIDB4MDAwZSwgMHgwMDNlLCAweDAwY2UsCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwMTYsIDB4YTE4OCwgMHhiNjM1LCAweDIxMGMsCisJMHg4MWZmLCAweDAxMjgsIDB4MjA2MSwgMHhiOGY0LCAweDYxMWEsIDB4MDgwYywgMHgyYzljLCAweGEwMDYsCisJMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMDU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDAwNWUsCisJMHgwMTgwLCAweDY2MTIsIDB4NjUxYSwgMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAzLCAweDIwMDksCisJMHgwMDRiLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDVlLCAweDAwY2UsCisJMHgwMDA1LCAweGEwMDYsIDB4MGNkMCwgMHgwMGM2LCAweDAwNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MmEwLCAweDAwYzYsIDB4MDgwYywgMHg5ZWQ2LCAweDAwNWUsIDB4MDU1MCwgMHg2MDEzLCAweDAwMDAsCisJMHg2NTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDMsIDB4MDAxNiwgMHgwMGM2LCAweDI1NjAsCisJMHgwODBjLCAweDUxYWEsIDB4MDBjZSwgMHgwODBjLCAweDZkZjUsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsCisJMHgwODBjLCAweDZkMDIsIDB4MmMwOCwgMHgwODBjLCAweGFlODIsIDB4MDA3ZSwgMHgwMDFlLCAweGQxODQsCisJMHgwMTI4LCAweDA4MGMsIDB4ODYxZCwgMHhhMDg1LCAweDAwMDEsIDB4MDAzMCwgMHgyMDA5LCAweDAwNGMsCisJMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA1ZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDAsIDB4MDBmNiwgMHgwMGM2LCAweDAwNDYsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsCisJMHgyYzc4LCAweDAwY2UsIDB4MDE4MCwgMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLCAweDAwMDMsCisJMHgyMDIxLCAweDAwMDUsIDB4MDgwYywgMHg5ZDUwLCAweDJmNjAsIDB4MjAwOSwgMHgwMDRkLCAweDA4MGMsCisJMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMDRlLCAweDAwY2UsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGM2LCAweDAwNDYsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MmM3OCwgMHgwMGNlLCAweDAxNzgsCisJMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLCAweDAwMDMsIDB4MjAyMSwgMHgwMDA1LCAweDA0ODEsCisJMHgyZjYwLCAweDIwMDksIDB4MDA0ZSwgMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAwNGUsCisJMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsIDB4MDA0NiwgMHgwMGM2LCAweDA4MGMsCisJMHg4NWM3LCAweDJjNzgsIDB4MDBjZSwgMHgwMWMwLCAweDdlMTIsIDB4MmMwMCwgMHg3ODFhLCAweDc4MWYsCisJMHgwMDAzLCAweDIwMjEsIDB4MDAwNCwgMHgwMGExLCAweDIwMDEsIDB4YjdhMCwgMHgyMDA0LCAweGQwZmMsCisJMHgwMTIwLCAweDJmNjAsIDB4MDgwYywgMHg4NjFkLCAweDAwMjgsIDB4MmY2MCwgMHgyMDA5LCAweDAwNTIsCisJMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAwNGUsIDB4MDBjZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMDk2LCAweDAwNzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1MTRjLCAweDAxMTgsCisJMHgyMDAxLCAweDlkNTUsIDB4MDAyOCwgMHgwODBjLCAweDUxMWMsIDB4MDE1OCwgMHgyMDAxLCAweDlkNWIsCisJMHgwMDA2LCAweGEwMGUsIDB4MjQwMCwgMHgwODBjLCAweDU0ZGIsIDB4MDgwYywgMHg1NDA4LCAweDAwMGUsCisJMHgwODA3LCAweDI0MTgsIDB4MDgwYywgMHg3MDJmLCAweDYyYTAsIDB4MDA4NiwgMHgyMDQxLCAweDAwMDEsCisJMHgyMDM5LCAweDAwMDEsIDB4MjYwOCwgMHgwODBjLCAweDZlMGUsIDB4MDA4ZSwgMHgwODBjLCAweDZkMDIsCisJMHgyZjA4LCAweDI2NDgsIDB4MDgwYywgMHhhZTgyLCAweDYxM2MsIDB4ODFmZiwgMHgwOTBjLCAweDZlYzMsCisJMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwMDdlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MDAxZSwgMHgwMTg4LCAweDY2MGEsCisJMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksCisJMHgwMDFmLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsCisJMHg4NWM3LCAweDAwMWUsIDB4MDE4OCwgMHg2NjBhLCAweDYxMWEsIDB4MDgwYywgMHhhMDI3LCAweDYwMWYsCisJMHgwMDA4LCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMjEsIDB4MDgwYywgMHg4NjRjLCAweGEwODUsCisJMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDg1YzcsIDB4MDAxZSwgMHgwMTg4LCAweDY2MGEsCisJMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksCisJMHgwMDNkLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsCisJMHg5ZWQ2LCAweDAwMWUsIDB4MDE4MCwgMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDEsCisJMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsCisJMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDAwMWUsIDB4MDE4OCwgMHg2NjBhLCAweDYxMWEsCisJMHgwODBjLCAweGEwMjcsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwNDQsCisJMHgwODBjLCAweDg2NGMsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsCisJMHgwY2Q4LCAweDAwMjYsIDB4MDBkNiwgMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MmZmLCAweDAxMTAsCisJMHg4MjExLCAweDZhM2UsIDB4MDBkZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAwNiwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDAxOTAsIDB4NjAxMywgMHgwMDAwLCAweDYwMWYsIDB4MDAwNywgMHgyMDAxLCAweGI3YjYsCisJMHgyMDA0LCAweDAwMDYsIDB4YTA4MiwgMHgwMDUxLCAweDAwMGUsIDB4MDIwOCwgMHg4MDA0LCAweDYwMTYsCisJMHgwODBjLCAweGIzM2EsIDB4NjAzZiwgMHgwMDAwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDY2LCAweDAwYzYsCisJMHgwMGQ2LCAweDIwMzEsIDB4YjU1MywgMHgyNjM0LCAweGQ2ZTQsIDB4MDEyOCwgMHg2NjE4LCAweDI2NjAsCisJMHg2ZTQ4LCAweDA4MGMsIDB4NTBkNSwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwMDE2LCAweDYwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAxNDAsIDB4YTA4ZSwgMHgwMDAzLCAweDAxMjgsCisJMHhhMDhlLCAweDAwMDQsIDB4MDExMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwZDYsIDB4NjAxMCwgMHhhMDZkLCAweDAxNDgsIDB4NjgzNCwgMHhhMDg2LCAweDAxMzksCisJMHgwMTM4LCAweDY4MzgsIDB4ZDBmYywgMHgwMTEwLCAweGEwMDYsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsCisJMHgwODBjLCAweDg1YzcsIDB4MDAxZSwgMHgwMTkwLCAweDYxMWEsIDB4MDgwYywgMHhhMDI3LCAweDYwMWYsCisJMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgwODBjLCAweDJjOWMsIDB4MjAwOSwgMHgwMDI4LCAweDA4MGMsCisJMHg4NjRjLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDgsCisJMHhhMTg2LCAweDAwMTUsIDB4MTE3OCwgMHgyMDExLCAweGI1MjEsIDB4MjIwNCwgMHhhMDg2LCAweDAwNzQsCisJMHgxMTQ4LCAweDA4MGMsIDB4OGY5OCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDI5LCAweDA4MGMsCisJMHg2Y2QzLCAweDAwMjAsIDB4MDgwYywgMHg4YzE5LCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweGExODYsCisJMHgwMDE2LCAweDExMjgsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NGVmZCwgMHgwMGU4LCAweGExODYsCisJMHgwMDE1LCAweDExZTgsIDB4MjAxMSwgMHhiNTIxLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LCAweDExYjgsCisJMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHgwODBjLCAweDUwNGIsIDB4MDBkZSwgMHgwODBjLCAweDkwNTEsCisJMHgxMTcwLCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4OTAsIDB4MDBkZSwgMHhhMDA1LCAweDAxMzgsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0ZWZkLCAweDA4MGMsIDB4ODdhMCwgMHgwMDIwLCAweDA4MGMsCisJMHg4YzE5LCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweDY4NDgsIDB4YTA4NiwgMHgwMDA1LCAweDExMDgsCisJMHgwMDA5LCAweDAwMDUsIDB4Njg1MCwgMHhjMGFkLCAweDY4NTIsIDB4MDAwNSwgMHgwMGU2LCAweDAxMjYsCisJMHgyMDcxLCAweGI1MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NDgsIDB4YTU4MiwgMHgwMDAxLCAweDA2MDgsCisJMHg3MDRjLCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHhhY2UwLCAweDAwMTgsCisJMHg3MDVjLCAweGFjMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4YmQwMCwgMHgwYzk4LCAweDYwMDMsCisJMHgwMDA4LCAweDg1MjksIDB4NzU0YSwgMHhhY2E4LCAweDAwMTgsIDB4NzA1YywgMHhhNTAyLCAweDEyMzAsCisJMHg3NTRlLCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDRmLCAweGJkMDAsCisJMHgwY2MwLCAweGEwMDYsIDB4MGNjMCwgMHgwMGU2LCAweDIwNzEsIDB4YmI4YywgMHg3MDE0LCAweGQwZTQsCisJMHgwMTUwLCAweDYwMTMsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDUwLCAweDA4MGMsCisJMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwMGVlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGY2LCAweDJjNzgsCisJMHgwODBjLCAweDUzMDUsIDB4MDBmZSwgMHgwMTIwLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMTMsCisJMHgwMGNlLCAweDAwMDUsIDB4OTlmZSwgMHg5ZjJkLCAweDlmMzAsIDB4OWYzMywgMHhiMTI3LCAweGIxNDIsCisJMHhiMTQ1LCAweDk5ZmUsIDB4OTlmZSwgMHgwODBjLCAweDE1MTUsIDB4ZTAwMCwgMHhlMDAwLCAweDAwMDUsCisJMHhlMDAwLCAweGUwMDAsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDUsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHg1MzA1LCAweDA1MzgsIDB4MDgwYywgMHg4NWM3LCAweDExMjgsIDB4MjAwMSwgMHhiN2I4LCAweDIwMDQsCisJMHg3ODNlLCAweDAwZjgsIDB4NzgxOCwgMHg2MDFhLCAweDA4MGMsIDB4YTAyNywgMHg3ODFjLCAweGEwODYsCisJMHgwMDAzLCAweDAxMjgsIDB4NzgwOCwgMHg2MDM2LCAweDJmMDAsIDB4NjAzYSwgMHgwMDIwLCAweDc4MDgsCisJMHg2MDNhLCAweDJmMDAsIDB4NjAzNiwgMHg2MDJhLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzUsCisJMHg2MDAzLCAweDAwMDEsIDB4Nzk1MCwgMHg2MTUyLCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsCisJMHgyZjYwLCAweDAwZmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwZjYsIDB4NjgyYywgMHg2MDMyLCAweGEwOGUsCisJMHgwMDAxLCAweDAxMzgsIDB4YTA4NiwgMHgwMDA1LCAweDAxNDAsIDB4YTAwNiwgMHg2MDJhLCAweDYwMmUsCisJMHgwMGEwLCAweDY4MjAsIDB4YzBmNCwgMHhjMGQ1LCAweDY4MjIsIDB4NjgxMCwgMHgyMDc4LCAweDc4N2MsCisJMHg2OTM4LCAweGExMDIsIDB4Nzg4MCwgMHg2OTM0LCAweGExMDMsIDB4MWU3OCwgMHg2ODM0LCAweDYwMmEsCisJMHg2ODM4LCAweGEwODQsIDB4ZmZmYywgMHg2ODNhLCAweDYwMmUsIDB4MmQwMCwgMHg2MDM2LCAweDY4MDgsCisJMHg2MDNhLCAweDY5MTgsIDB4NjExYSwgMHg2OTUwLCAweDYxNTIsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDcsCisJMHgwMDM5LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsIDB4NjgwMywgMHgwMDAyLCAweDAwZmUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTMwNSwgMHgxMTE4LCAweGEwODUsCisJMHgwMDAxLCAweDAwNzAsIDB4NjAyMCwgMHhkMGY0LCAweDExNTAsIDB4YzBmNSwgMHg2MDIyLCAweDYwMTAsCisJMHgyMDc4LCAweDc4MjgsIDB4NjAzYSwgMHg3ODJjLCAweDYwMzYsIDB4MDgwYywgMHgxOTRkLCAweGEwMDYsCisJMHgwMGZlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDYwMDQsIDB4YTA4ZSwgMHgwMDM0LCAweDAxYjgsCisJMHhhMDhlLCAweDAwMzUsIDB4MDFhMCwgMHhhMDhlLCAweDAwMzYsIDB4MDE4OCwgMHhhMDhlLCAweDAwMzcsCisJMHgwMTcwLCAweGEwOGUsIDB4MDAzOCwgMHgwMTU4LCAweGEwOGUsIDB4MDAzOSwgMHgwMTQwLCAweGEwOGUsCisJMHgwMDNhLCAweDAxMjgsIDB4YTA4ZSwgMHgwMDNiLCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGU2LCAweDIwMDEsCisJMHhiN2IyLCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwMDEsIDB4MDAzMiwgMHgwODBjLCAweDZiNDAsCisJMHgyMDAxLCAweGI3YjYsIDB4ODJmZiwgMHgxMTEwLCAweDIwMTEsIDB4MDAxNCwgMHgyMjAyLCAweDIwMDEsCisJMHhiN2I0LCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwNzEsIDB4Yjc4ZSwgMHg3MTFhLCAweDcyMWUsCisJMHgyMDAxLCAweDAwNjQsIDB4MDgwYywgMHg2YjQwLCAweDIwMDEsIDB4YjdiNywgMHg4MmZmLCAweDExMTAsCisJMHgyMDExLCAweDAwMTQsIDB4MjIwMiwgMHgyMDA5LCAweGI3YjgsIDB4YTI4MCwgMHgwMDBhLCAweDIwMGEsCisJMHgwODBjLCAweDUzMmEsIDB4MDBlZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwZTYsIDB4MjAwMSwgMHhiN2I2LCAweDIwMDMsIDB4MDAyOCwgMHgyMDAxLCAweGI3YjcsCisJMHgyMDAzLCAweDAwMTQsIDB4MjA3MSwgMHhiNzhlLCAweDcwMWIsIDB4MDAwMCwgMHg3MDFmLCAweDA3ZDAsCisJMHgyMDAxLCAweGI3YjgsIDB4MjAwMywgMHgwMDFlLCAweDAwZWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZDYsCisJMHg2MDU0LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLCAweDE2MGYsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDUsCisJMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4NWM3LCAweDAwMWUsCisJMHgwMTc4LCAweDYxMWEsIDB4MGNhMSwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksCisJMHgwMDMzLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDgsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhiNTAwLCAweGExODYsCisJMHgwMDE1LCAweDE1MDAsIDB4NzA4NCwgMHhhMDg2LCAweDAwMTgsIDB4MTFlMCwgMHg2MDEwLCAweDIwNjgsCisJMHg2YTNjLCAweGQyZTQsIDB4MTE2MCwgMHgyYzc4LCAweDA4MGMsIDB4NzMzMSwgMHgwMWQ4LCAweDcwNzAsCisJMHg2YTUwLCAweGEyMDYsIDB4MTE2MCwgMHg3MDc0LCAweDZhNTQsIDB4YTIwNiwgMHgxMTQwLCAweDYyMTgsCisJMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyY2UxLCAweDA4MGMsCisJMHg4N2EwLCAweDAwMjAsIDB4MDgwYywgMHg4YzE5LCAweDA4MGMsIDB4ODYxZCwgMHgwMGZlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwMDUsIDB4NzA1NCwgMHg2YTU0LCAweGEyMDYsIDB4MGQ0OCwgMHgwYzgwLCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODVjNywgMHgwMDFlLCAweDAxODAsCisJMHg2MTFhLCAweDA4MGMsIDB4YTAyNywgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksCisJMHgwMDQzLCAweDA4MGMsIDB4ODY0YywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDgsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhiNTAwLCAweGExODYsCisJMHgwMDE1LCAweDExYzAsIDB4NzA4NCwgMHhhMDg2LCAweDAwMDQsIDB4MTFhMCwgMHg2MDEwLCAweGEwZTgsCisJMHgwMDBmLCAweDJjNzgsIDB4MDgwYywgMHg3MzMxLCAweDAxYTgsIDB4NzA3MCwgMHg2YTA4LCAweGEyMDYsCisJMHgxMTMwLCAweDcwNzQsIDB4NmEwYywgMHhhMjA2LCAweDExMTAsIDB4MDgwYywgMHgyYzljLCAweDA4MGMsCisJMHg4N2EwLCAweDAwMjAsIDB4MDgwYywgMHg4YzE5LCAweDA4MGMsIDB4ODYxZCwgMHgwMGZlLCAweDAwZWUsCisJMHgwMGRlLCAweDAwMDUsIDB4NzA1NCwgMHg2YTBjLCAweGEyMDYsIDB4MGQ3OCwgMHgwYzgwLCAweDAwMTYsCisJMHgwMDI2LCAweDY4NGMsIDB4ZDBhYywgMHgwMTc4LCAweDY5MTQsIDB4NmExMCwgMHgyMTAwLCAweGEyMDUsCisJMHgwMTUwLCAweDY4NjAsIDB4YTEwNiwgMHgxMTE4LCAweDY4NWMsIDB4YTIwNiwgMHgwMTIwLCAweDY5NjIsCisJMHg2YTVlLCAweGEwODUsIDB4MDAwMSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsCisJMHg2MzEwLCAweDIzNjgsIDB4Njg0YSwgMHg2OTUyLCAweGEyOWUsIDB4NDAwMCwgMHgxMWEwLCAweDAwYzYsCisJMHg2MzE4LCAweDIzNjAsIDB4MjAwOSwgMHgwMDAwLCAweDY4MzgsIDB4ZDBmNCwgMHgxMTQwLCAweDA4MGMsCisJMHg1MjRhLCAweDExMDgsIDB4YzE4NSwgMHg2MDAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDZhNjYsCisJMHg2OTZhLCAweDAwY2UsIDB4MDA4MCwgMHg2YTY2LCAweDM5MTgsIDB4YTM5OCwgMHgwMDA2LCAweDIzMWMsCisJMHg2ODZiLCAweDAwMDQsIDB4NmI3MiwgMHgwMGM2LCAweDYzMTgsIDB4MjM2MCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweDY4NmUsIDB4MDBjZSwgMHgwODBjLCAweDU0MDgsIDB4NjAxMywgMHgwMDAwLCAweDAwM2UsCisJMHgwMGRlLCAweDAwMDUsIDB4MDBjNiwgMHgwMDI2LCAweDAwMTYsIDB4YTE4NiwgMHgwMDM1LCAweDAxMTAsCisJMHg2YTM0LCAweDAwMDgsIDB4NmEyOCwgMHgwODBjLCAweDljNGEsIDB4MDFmMCwgMHgyMjYwLCAweDYxMWMsCisJMHhhMTg2LCAweDAwMDMsIDB4MDExOCwgMHhhMTg2LCAweDAwMDYsIDB4MTE5MCwgMHg2ODM0LCAweGEyMDYsCisJMHgwMTQwLCAweDY4MzgsIDB4YTIwNiwgMHgxMTYwLCAweDYxMDgsIDB4NjgzNCwgMHhhMTA2LCAweDExNDAsCisJMHgwMDIwLCAweDYwMDgsIDB4NjkzOCwgMHhhMTA2LCAweDExMTgsIDB4NjAxOCwgMHg2OTE4LCAweGExMDYsCisJMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwODUsIDB4MDAwMSwgMHgwY2M4LCAweDY5NDQsCisJMHhkMWNjLCAweDAxOTgsIDB4YTE4YywgMHgwMGZmLCAweGExOGUsIDB4MDAwMiwgMHgxMTcwLCAweGFkODgsCisJMHgwMDFlLCAweDIxMGMsIDB4YTE4YywgMHgwZjAwLCAweDgxMGYsIDB4YTE4ZSwgMHgwMDAxLCAweDExMjgsCisJMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgxOTBjLCAweDk0ODMsIDB4MDAwNSwgMHgwODBjLCAweDg2MWQsCisJMHgwODA0LCAweDcxNzMsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLCAweDE1MTUsCisJMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhMTZiLCAweGE2NDYsIDB4YTc2YywgMHhhMTZiLCAweGExNmIsCisJMHhhMTZiLCAweGExNmIsIDB4YTE2YiwgMHhhMWEzLCAweGE3ZjAsIDB4YTE2YiwgMHhhMTZiLCAweGExNmIsCisJMHhhMTZiLCAweGExNmIsIDB4YTE2YiwgMHgwODBjLCAweDE1MTUsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsCisJMHgwMDEwLCAweDFhMGMsIDB4MTUxNSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhMTg2LCAweGFjNzcsCisJMHhhMTg2LCAweGExODYsIDB4YTE4NiwgMHhhMTg2LCAweGExODYsIDB4YTE4NiwgMHhhYzM5LCAweGFjYmYsCisJMHhhMTg2LCAweGIyNmMsIDB4YjI5YywgMHhiMjZjLCAweGIyOWMsIDB4YTE4NiwgMHgwODBjLCAweDE1MTUsCisJMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDFhMGMsIDB4MTUxNSwgMHgwMDEzLCAweDAwNmUsCisJMHgwMDA1LCAweGExYTEsIDB4YTk0MCwgMHhhYTBkLCAweGFhM2EsIDB4YWFiZSwgMHhhMWExLCAweGFiYWIsCisJMHhhYjU2LCAweGE3ZmMsIDB4YWMwZiwgMHhhYzI0LCAweGExYTEsIDB4YTFhMSwgMHhhMWExLCAweGExYTEsCisJMHhhMWExLCAweDA4MGMsIDB4MTUxNSwgMHhhMWIyLCAweDAwODAsIDB4MWEwYywgMHgxNTE1LCAweDIxMDAsCisJMHhhMWIyLCAweDAwNDAsIDB4MWEwNCwgMHhhNWJhLCAweDAwMDIsIDB4YTFlZCwgMHhhM2I4LCAweGExZWQsCisJMHhhMWVkLCAweGExZWQsIDB4YTNiZiwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsCisJMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsCisJMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGExZWYsIDB4YTI0ZCwgMHhhMjVjLCAweGEyYWEsCisJMHhhMmM4LCAweGEzNDYsIDB4YTNhNSwgMHhhMWVkLCAweGExZWQsIDB4YTNjMiwgMHhhMWVkLCAweGExZWQsCisJMHhhM2Q1LCAweGEzZTAsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGE0NmIsCisJMHhhMWVkLCAweGExZWQsIDB4YTQ3ZSwgMHhhMWVkLCAweGExZWQsIDB4YTQzNiwgMHhhMWVkLCAweGExZWQsCisJMHhhMWVkLCAweGE0OTYsIDB4YTFlZCwgMHhhMWVkLCAweGExZWQsIDB4YTUxMCwgMHhhMWVkLCAweGExZWQsCisJMHhhMWVkLCAweGExZWQsIDB4YTFlZCwgMHhhMWVkLCAweGE1ODEsIDB4MDgwYywgMHgxNTE1LCAweDA4MGMsCisJMHg1MzA5LCAweDExNTAsIDB4MjAwMSwgMHhiNTM1LCAweDIwMDQsIDB4ZDBjYywgMHgxMTI4LCAweGEwODQsCisJMHgwMDA5LCAweGEwODYsIDB4MDAwOCwgMHgxMTQwLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJiLCAweDAwMDksCisJMHg2MDEzLCAweDAwMDAsIDB4MDgwNCwgMHhhM2IzLCAweDA4MGMsIDB4NTJmOSwgMHgwMGU2LCAweDAwYzYsCisJMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHg2MjE4LCAweDIyNzAsIDB4NzJhMCwgMHgwMDI2LCAweDIwMTksCisJMHgwMDI5LCAweDA4MGMsIDB4NmRmNSwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDZkMDIsCisJMHgyYzA4LCAweDA4MGMsIDB4YWU4MiwgMHgwMDdlLCAweDAwMWUsIDB4MmU2MCwgMHgwODBjLCAweDUxYWEsCisJMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4NjYxOCwgMHgwMGM2LCAweDI2NjAsCisJMHgwODBjLCAweDRmYjgsIDB4MDBjZSwgMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LCAweDAwZmYsCisJMHhhMDgyLCAweDAwMDYsIDB4MDI3OCwgMHgwODBjLCAweGFkYzYsIDB4MTkwNCwgMHhhMmE0LCAweDA4MGMsCisJMHhhZDY2LCAweDExMjAsIDB4NjAwNywgMHgwMDA4LCAweDA4MDQsIDB4YTNiMywgMHg2MDA3LCAweDAwMDksCisJMHgwODA0LCAweGEzYjMsIDB4MDgwYywgMHhhZjdiLCAweDAxMjgsIDB4MDgwYywgMHhhZGM2LCAweDBkNzgsCisJMHgwODA0LCAweGEyYTQsIDB4NjAxMywgMHgxOTAwLCAweDBjODgsIDB4MDgwYywgMHgyZGJmLCAweDE5MDQsCisJMHhhNWI3LCAweDYxMDYsIDB4MDgwYywgMHhhZDIwLCAweDYwMDcsIDB4MDAwNiwgMHgwODA0LCAweGEzYjMsCisJMHg2MDA3LCAweDAwMDcsIDB4MDgwNCwgMHhhM2IzLCAweDA4MGMsIDB4YjJkMCwgMHgxOTA0LCAweGE1YjcsCisJMHgwODBjLCAweDJkYmYsIDB4MTkwNCwgMHhhNWI3LCAweDAwZDYsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsCisJMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDEyMjAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHg0ZWViLCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMTg4LCAweGE2ODYsCisJMHgwMDA0LCAweDAxNzAsIDB4NmUwNCwgMHhhNmI0LCAweDAwZmYsIDB4YTY4NiwgMHgwMDA2LCAweDAxNDAsCisJMHhhNjg2LCAweDAwMDQsIDB4MDEyOCwgMHhhNjg2LCAweDAwMDUsIDB4MDExMCwgMHgwMGRlLCAweDAwZTAsCisJMHgwODBjLCAweGFlMjQsIDB4MTFhMCwgMHhhNjg2LCAweDAwMDYsIDB4MTE1MCwgMHgwMDI2LCAweDYyMTgsCisJMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyY2UxLCAweDAwMmUsCisJMHgwODBjLCAweDUwNGIsIDB4NjAwNywgMHgwMDBhLCAweDAwZGUsIDB4MDgwNCwgMHhhM2IzLCAweDYwMDcsCisJMHgwMDBiLCAweDAwZGUsIDB4MDgwNCwgMHhhM2IzLCAweDA4MGMsIDB4MmM5YywgMHg2MDA3LCAweDAwMDEsCisJMHgwODA0LCAweGEzYjMsIDB4MDgwYywgMHhiMmQwLCAweDE5MDQsIDB4YTViNywgMHgwODBjLCAweDJkYmYsCisJMHgxOTA0LCAweGE1YjcsIDB4NjYxOCwgMHgwMGQ2LCAweDI2NjgsIDB4NmUwNCwgMHgwMGRlLCAweGE2ODYsCisJMHgwNzA3LCAweDBkNTAsIDB4MDAyNiwgMHg2MjE4LCAweGEyOTAsIDB4MDAyOCwgMHgyMjE0LCAweDIwMDksCisJMHgwMDAwLCAweDA4MGMsIDB4MmNlMSwgMHgwMDJlLCAweDYwMDcsIDB4MDAwYywgMHgwODA0LCAweGEzYjMsCisJMHgwODBjLCAweDUzMDksIDB4MTE0MCwgMHgyMDAxLCAweGI1MzUsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksCisJMHhhMDg2LCAweDAwMDgsIDB4MTExMCwgMHgwODA0LCAweGExZmMsIDB4MDgwYywgMHg1MmY5LCAweDY2MTgsCisJMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDA2ZTgsCisJMHgxMTM4LCAweDAwMjYsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGYyYSwgMHgwMDJlLCAweDAwNTAsCisJMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDQsIDB4MDEyMCwgMHhhNjg2LCAweDAwMDYsCisJMHgxOTA0LCAweGEyYTQsIDB4MDgwYywgMHhhZTMxLCAweDExMjAsIDB4NjAwNywgMHgwMDBlLCAweDA4MDQsCisJMHhhM2IzLCAweDAwNDYsIDB4NjQxOCwgMHhhNGEwLCAweDAwMjgsIDB4MjQyNCwgMHhhNGE0LCAweDAwZmYsCisJMHg4NDI3LCAweDAwNDYsIDB4MDgwYywgMHgyYzljLCAweDAwNGUsIDB4MDAxNiwgMHhhMDA2LCAweDIwMDksCisJMHhiNTUzLCAweDIxMGMsIDB4ZDFhNCwgMHgwMTU4LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGIwZTgsCisJMHg2MDE4LCAweDAwZDYsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgwMGRlLCAweDAwMWUsCisJMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwgMHgwODA0LCAweGEzYjMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHg0ZWViLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHhiNTA1LCAweDIwMTEsIDB4YmI5MCwgMHgwODBjLCAweDkwZGEsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweGEwMDUsIDB4MDE2OCwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjgyLCAweDAwMDQsCisJMHgwYTA0LCAweGEyYTQsIDB4YTY4MiwgMHgwMDA3LCAweDBhMDQsIDB4YTJmMiwgMHgwODA0LCAweGEyYTQsCisJMHg2MDEzLCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDA4MDQsIDB4YTNiMywgMHgwODBjLCAweDUzMDksCisJMHgxMTQwLCAweDIwMDEsIDB4YjUzNSwgMHgyMDA0LCAweGEwODQsIDB4MDAwOSwgMHhhMDg2LCAweDAwMDgsCisJMHgxMTEwLCAweDA4MDQsIDB4YTFmYywgMHgwODBjLCAweDUyZjksIDB4NjYxOCwgMHhhNmIwLCAweDAwMDEsCisJMHgyNjM0LCAweGE2ODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDZiOCwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNCwgMHgwMTIwLCAweGE2ODYsIDB4MDAwNiwgMHgxOTA0LCAweGEyYTQsCisJMHgwODBjLCAweGFlNTksIDB4MTEzOCwgMHgwODBjLCAweGFkNjYsIDB4MTEyMCwgMHg2MDA3LCAweDAwMTAsCisJMHgwODA0LCAweGEzYjMsIDB4MDA0NiwgMHg2NDE4LCAweGE0YTAsIDB4MDAyOCwgMHgyNDI0LCAweGE0YTQsCisJMHgwMGZmLCAweDg0MjcsIDB4MDA0NiwgMHgwODBjLCAweDJjOWMsIDB4MDA0ZSwgMHgwMDE2LCAweGEwMDYsCisJMHgyMDA5LCAweGI1NTMsIDB4MjEwYywgMHhkMWE0LCAweDAxNTgsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsCisJMHhiMGU4LCAweDYwMTgsIDB4MDBkNiwgMHgyMDY4LCAweDY4MDAsIDB4YzBlNSwgMHg2ODAyLCAweDAwZGUsCisJMHgwMDFlLCAweDAwNGUsIDB4NjAwNywgMHgwMDAxLCAweDAwZjAsIDB4MDgwYywgMHhhZjdiLCAweDAxNDAsCisJMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDk1MCwgMHgwODA0LCAweGEyYTQsCisJMHg2MDEzLCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDAwNzAsIDB4MDgwYywgMHgyZGJmLCAweDE5MDQsCisJMHhhNWI3LCAweDA4MGMsIDB4YjJkMCwgMHgxOTA0LCAweGE1YjcsIDB4MDgwYywgMHhhNWRmLCAweDE5MDQsCisJMHhhMmE0LCAweDYwMDcsIDB4MDAxMiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2Y2QzLCAweDAwMDUsCisJMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwY2MwLCAweDYwMDcsCisJMHgwMDA1LCAweDBjYzAsIDB4MDgwYywgMHhiMmQwLCAweDE5MDQsIDB4YTViNywgMHgwODBjLCAweDJkYmYsCisJMHgxOTA0LCAweGE1YjcsIDB4MDgwYywgMHhhNWRmLCAweDE5MDQsIDB4YTJhNCwgMHg2MDA3LCAweDAwMjAsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2Y2QzLCAweDAwMDUsIDB4MDgwYywgMHgyZGJmLCAweDE5MDQsCisJMHhhNWI3LCAweDYwMDcsIDB4MDAyMywgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2Y2QzLCAweDAwMDUsCisJMHgwODBjLCAweGIyZDAsIDB4MTkwNCwgMHhhNWI3LCAweDA4MGMsIDB4MmRiZiwgMHgxOTA0LCAweGE1YjcsCisJMHgwODBjLCAweGE1ZGYsIDB4MTkwNCwgMHhhMmE0LCAweDAwMTYsIDB4MDAyNiwgMHgyMDExLCAweGJiOTEsCisJMHgyMjE0LCAweGEyODYsIDB4ZmZmZiwgMHgwMTkwLCAweDJjMDgsIDB4MDgwYywgMHg5YzRhLCAweDAxZTAsCisJMHgyMjYwLCAweDIwMTEsIDB4YmI5MCwgMHgyMjE0LCAweDYwMDgsIDB4YTIwNiwgMHgxMWE4LCAweDYwMTgsCisJMHhhMTkwLCAweDAwMDYsIDB4MjIxNCwgMHhhMjA2LCAweDAxZTgsIDB4MDA3MCwgMHgyMDExLCAweGJiOTAsCisJMHgyMjE0LCAweDJjMDgsIDB4YTAwNiwgMHgwODBjLCAweGIwYmEsIDB4MTFhMCwgMHgyMDExLCAweGJiOTEsCisJMHgyMjE0LCAweGEyODYsIDB4ZmZmZiwgMHgwMWMwLCAweDIxNjAsIDB4NjAwNywgMHgwMDI2LCAweDYwMTMsCisJMHgxNzAwLCAweDIwMTEsIDB4YmI4OSwgMHgyMjE0LCAweGEyOTYsIDB4ZmZmZiwgMHgxMTgwLCAweDYwMDcsCisJMHgwMDI1LCAweDAwNjgsIDB4NjAxYywgMHhhMDg2LCAweDAwMDcsIDB4MWQ3MCwgMHg2MDA0LCAweGEwODYsCisJMHgwMDI0LCAweDExMTAsIDB4MDgwYywgMHg4NjFkLCAweDIxNjAsIDB4NjAwNywgMHgwMDI1LCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweDRlZWIsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDE5LCAweGI1MDUsIDB4MjAxMSwgMHhiYjk2LCAweDA4MGMsIDB4OTBkYSwgMHgwMDNlLCAweDAwMmUsCisJMHgwMDFlLCAweDAxNWUsIDB4MDEyMCwgMHg2MDA3LCAweDAwMzEsIDB4MDgwNCwgMHhhM2IzLCAweDA4MGMsCisJMHg4ZGY2LCAweDA4MGMsIDB4NWFjZiwgMHgxMWIwLCAweDAwMDYsIDB4MDAyNiwgMHgwMDM2LCAweDA4MGMsCisJMHg1YWViLCAweDExNTgsIDB4MjAwMSwgMHhiNzlmLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGI1MDAsCisJMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg1YTA3LCAweDAwMTAsIDB4MDgwYywgMHg1YWE2LCAweDAwM2UsCisJMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHgwODBjLCAweDJkYmYsIDB4MTkwNCwgMHhhNWI3LCAweDA4MGMsCisJMHhhNWRmLCAweDE5MDQsIDB4YTJhNCwgMHg2MTA2LCAweDA4MGMsIDB4YTVmYiwgMHg2MDA3LCAweDAwMmIsCisJMHgwODA0LCAweGEzYjMsIDB4NjAwNywgMHgwMDJjLCAweDA4MDQsIDB4YTNiMywgMHgwODBjLCAweGIyZDAsCisJMHgxOTA0LCAweGE1YjcsIDB4MDgwYywgMHgyZGJmLCAweDE5MDQsIDB4YTViNywgMHgwODBjLCAweGE1ZGYsCisJMHgxOTA0LCAweGEyYTQsIDB4NjEwNiwgMHgwODBjLCAweGE1ZmYsIDB4MTEyMCwgMHg2MDA3LCAweDAwMmUsCisJMHgwODA0LCAweGEzYjMsIDB4NjAwNywgMHgwMDJmLCAweDA4MDQsIDB4YTNiMywgMHgwODBjLCAweDJkYmYsCisJMHgxOTA0LCAweGE1YjcsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDEsCisJMHgyMDBjLCAweGExODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDE1OCwgMHhhMTg0LCAweGZmMDAsCisJMHg4MDA3LCAweGEwODYsIDB4MDAwNiwgMHgwMTI4LCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDA4MDQsCisJMHhhM2I4LCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGQwZTQsIDB4MDkwNCwgMHhhNTBkLCAweDIwNzEsCisJMHhiYjhjLCAweDcwMTAsIDB4NjAzNiwgMHg3MDE0LCAweDYwM2EsIDB4NzEwOCwgMHg3MjBjLCAweDIwMDEsCisJMHhiNTUzLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTQwLCAweDYwMTgsIDB4MjA2OCwgMHg2ODEwLCAweGExMDYsCisJMHgxMTE4LCAweDY4MTQsIDB4YTIwNiwgMHgwMWY4LCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYWMsCisJMHgxNTkwLCAweDIwNjksIDB4YjUwMCwgMHg2ODc0LCAweGEyMDYsIDB4MTU2OCwgMHg2ODcwLCAweGExMDYsCisJMHgxNTUwLCAweDcyMTAsIDB4MDgwYywgMHg5YzRhLCAweDA1NTgsIDB4MDgwYywgMHhiMTU0LCAweDA1NDAsCisJMHg2MjJhLCAweDYwMDcsIDB4MDAzNiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLCAweDAwY2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg3MjE0LCAweGEyODYsIDB4ZmZmZiwgMHgwMTUwLCAweDA4MGMsCisJMHg5YzRhLCAweDAxYjAsIDB4YTI4MCwgMHgwMDAyLCAweDIwMDQsIDB4NzExMCwgMHhhMTA2LCAweDExODAsCisJMHgwYzA4LCAweDcyMTAsIDB4MmMwOCwgMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHhiMGJhLCAweDJjMTAsCisJMHgyMTYwLCAweDAxMzAsIDB4MDhiOCwgMHg2MDA3LCAweDAwMzcsIDB4NjAxMywgMHgxNTAwLCAweDA4ZDgsCisJMHg2MDA3LCAweDAwMzcsIDB4NjAxMywgMHgxNzAwLCAweDA4YjAsIDB4NjAwNywgMHgwMDEyLCAweDA4OTgsCisJMHgwODBjLCAweDJkYmYsIDB4MTkwNCwgMHhhNWI3LCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsCisJMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDYsIDB4MTkwNCwgMHhhM2I4LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MjAwMSwgMHhiNTcyLCAweDIwMDQsIDB4ZDBlNCwgMHgwOTA0LCAweGE1NzksCisJMHgyMDY5LCAweGI1MDAsIDB4MjA3MSwgMHhiYjhjLCAweDcwMDgsIDB4NjAzNiwgMHg3MjBjLCAweDYyM2EsCisJMHhhMjg2LCAweGZmZmYsIDB4MTE1MCwgMHg3MjA4LCAweDAwYzYsIDB4MmMwOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwODBjLCAweGIwYmEsIDB4MmMxMCwgMHgwMGNlLCAweDA1ODgsIDB4MDgwYywgMHg5YzRhLCAweDA1NzAsCisJMHgwMGM2LCAweDAwMjYsIDB4MjI2MCwgMHgwODBjLCAweDk5MWQsIDB4MDAyZSwgMHgwMGNlLCAweDcxMTgsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMDEsIDB4MDE1OCwgMHhhMTg2LCAweDAwMDUsCisJMHgwMTE4LCAweGExODYsIDB4MDAwNywgMHgxMTc4LCAweGEyODAsIDB4MDAwNCwgMHgyMDA0LCAweGEwMDUsCisJMHgwMTUwLCAweDAwNTYsIDB4NzUxMCwgMHg3NjE0LCAweDA4MGMsIDB4YjE2YiwgMHgwMDVlLCAweDAwY2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg2MDA3LCAweDAwM2IsIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsCisJMHgyYTAwLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsIDB4MGM4OCwgMHg2MDA3LCAweDAwM2IsCisJMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgxNzAwLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsCisJMHgwYzMwLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMGIsIDB4NjAxMywgMHgwMDAwLCAweDA4MDQsCisJMHhhNGUzLCAweDAwZTYsIDB4MDAyNiwgMHgwODBjLCAweDUzMDksIDB4MDU1OCwgMHgwODBjLCAweDUyZjksCisJMHgwODBjLCAweGIzNGIsIDB4MTUyMCwgMHgyMDcxLCAweGI1MDAsIDB4NzBkNCwgMHhjMDg1LCAweDcwZDYsCisJMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3MmEwLCAweGEyODQsIDB4MDBmZiwgMHg3MDcyLCAweDc4ZTYsCisJMHhhMjg0LCAweGZmMDAsIDB4NzI3NCwgMHhhMjA1LCAweDcwNzYsIDB4NzhlYSwgMHgwMGZlLCAweDcwZGYsCisJMHgwMDAwLCAweDIwMDEsIDB4YjU1MywgMHgyMDA0LCAweGQwYTQsIDB4MDEyMCwgMHgyMDExLCAweGI3ZjksCisJMHgyMDEzLCAweDA3ZDAsIDB4ZDBhYywgMHgxMTI4LCAweDA4MGMsIDB4MmFiOCwgMHgwMDEwLCAweDA4MGMsCisJMHhiMzc3LCAweDAwMmUsIDB4MDBlZSwgMHgwODBjLCAweDg2MWQsIDB4MDgwNCwgMHhhM2I3LCAweDA4MGMsCisJMHg4NjFkLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLCAweGE1YzUsIDB4YTVjNSwgMHhhNWM1LCAweGE1YzUsCisJMHhhNWM1LCAweGE1YzcsIDB4YTVjNSwgMHhhNWM1LCAweGE1YzUsIDB4MDgwYywgMHgxNTE1LCAweDA4MGMsCisJMHhiMmQwLCAweDFkNjgsIDB4MDgwYywgMHgyZGJmLCAweDFkNTAsIDB4MDA4OSwgMHgxMTM4LCAweDYwMDcsCisJMHgwMDQ1LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjZDMsIDB4MDAwNSwgMHgwODBjLCAweDJjOWMsCisJMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NmNkMywgMHgwMDA1LCAweDAwZDYsCisJMHgwMDY2LCAweDY2MTgsIDB4MjY2OCwgMHg2ZTA0LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsCisJMHgwMDA2LCAweDAxNzAsIDB4YTY4NiwgMHgwMDA0LCAweDAxNTgsIDB4NmUwNCwgMHhhNmI0LCAweDAwZmYsCisJMHhhNjg2LCAweDAwMDYsIDB4MDEyOCwgMHhhNjg2LCAweDAwMDQsIDB4MDExMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDZlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDA0NDksIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwNDkxLCAweDExZjAsIDB4NjgwYywgMHhhMDhjLCAweGZmMDAsIDB4NjgyMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMTE1LCAweDYyMTIsIDB4NjgyNCwgMHg2MDJhLCAweGQxZTQsIDB4MDExOCwgMHgyMDA5LCAweDAwMDEsCisJMHgwMDYwLCAweGQxZWMsIDB4MDE2OCwgMHg2OTIwLCAweGExOGMsIDB4MDBmZiwgMHg2ODI0LCAweDA4MGMsCisJMHgyODFkLCAweDExMzAsIDB4MjExMCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyY2UxLCAweDAwMTgsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwOCwgMHhhMDA2LCAweDAwZGUsIDB4MDAwNSwgMHgyMDY5LCAweGJiOGQsCisJMHg2ODAwLCAweGEwODIsIDB4MDAxMCwgMHgxMjI4LCAweDYwMTMsIDB4MDAwMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDA4LCAweGEwMDYsIDB4MDAwNSwgMHg2MDEzLCAweDAwMDAsIDB4MjA2OSwgMHhiYjhjLCAweDY4MDgsCisJMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgwODAwLCAweDExNDAsIDB4NjgwMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhlLCAweDAwMTQsIDB4MDExMCwgMHhhMDhlLCAweDAwMTAsIDB4MDAwNSwgMHg2MDA0LCAweGEwYjIsCisJMHgwMDgwLCAweDFhMGMsIDB4MTUxNSwgMHhhMWI2LCAweDAwMTMsIDB4MTEzMCwgMHgyMDA4LCAweGExYjIsCisJMHgwMDQwLCAweDFhMDQsIDB4YTc0NiwgMHgwMDkyLCAweGExYjYsIDB4MDAyNywgMHgwMTIwLCAweGExYjYsCisJMHgwMDE0LCAweDE5MGMsIDB4MTUxNSwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg0ZjJhLCAweDA4MGMsCisJMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhNmE2LCAweGE2YTgsCisJMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE4LCAweGE2YmEsIDB4YTczZiwgMHhhNzBhLCAweGE3M2YsCisJMHhhNzFiLCAweGE3M2YsIDB4YTZiYSwgMHhhNzNmLCAweGE3MzcsIDB4YTczZiwgMHhhNzM3LCAweGE3M2YsCisJMHhhNzNmLCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTYsCisJMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTgsIDB4YTZhNiwgMHhhNzNmLCAweGE2YTYsCisJMHhhNmE2LCAweGE3M2YsIDB4YTZhNiwgMHhhNzNjLCAweGE3M2YsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTYsCisJMHhhNmE2LCAweGE3M2YsIDB4YTczZiwgMHhhNmE2LCAweGE3M2YsIDB4YTczZiwgMHhhNmE2LCAweGE2YjQsCisJMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHhhNmE2LCAweGE3M2IsIDB4YTczZiwgMHhhNmE2LCAweGE2YTYsCisJMHhhNzNmLCAweGE3M2YsIDB4YTZhNiwgMHhhNmE2LCAweGE2YTYsIDB4YTZhNiwgMHgwODBjLCAweDE1MTUsCisJMHgwODBjLCAweDcwOTAsIDB4MjAwMSwgMHhiN2I2LCAweDIwMDQsIDB4NjAxNiwgMHg2MDAzLCAweDAwMDIsCisJMHgwODBjLCAweDcxNzMsIDB4MDgwNCwgMHhhNzQ1LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRlZWIsCisJMHgwODA0LCAweGE3M2YsIDB4MDBmNiwgMHgyMDc5LCAweGI1NTIsIDB4NzgwNCwgMHgwMGZlLCAweGQwYWMsCisJMHgxOTA0LCAweGE3M2YsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHg2MDE4LCAweGEwODAsCisJMHgwMDA0LCAweDIwMDQsIDB4YTA4NiwgMHgwMGZmLCAweDExNDAsIDB4MDBmNiwgMHgyMDc5LCAweGI1MDAsCisJMHg3ODk4LCAweDgwMDAsIDB4Nzg5YSwgMHgwMGZlLCAweDAwZTAsIDB4MDBjNiwgMHg2MDE4LCAweDIwNjAsCisJMHg2MDAwLCAweGQwZjQsIDB4MTE0MCwgMHg2MDEwLCAweGEwMDUsIDB4MDEyOCwgMHgwMGNlLCAweDA4MGMsCisJMHgzZjNlLCAweDA4MDQsIDB4YTczZiwgMHgwMGNlLCAweDIwMDEsIDB4YjUwMCwgMHgyMDA0LCAweGEwODYsCisJMHgwMDAyLCAweDExMzgsIDB4MDBmNiwgMHgyMDc5LCAweGI1MDAsIDB4Nzg5OCwgMHg4MDAwLCAweDc4OWEsCisJMHgwMGZlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDRlZmQsIDB4MDgwYywgMHg3MDkwLCAweDYwMWYsCisJMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg2Y2QzLCAweDA4MGMsCisJMHg3MTczLCAweDAwYzYsIDB4NjExOCwgMHgyMTYwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDY5YTgsCisJMHgwMGNlLCAweDA0ZDgsIDB4NjYxOCwgMHgwMGQ2LCAweDI2NjgsIDB4NmUwNCwgMHgwMGRlLCAweGE2YjQsCisJMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDA1NTAsIDB4YTY4NiwgMHgwMDA0LCAweDA1MzgsCisJMHgyMDAxLCAweDAwMDQsIDB4MDQxMCwgMHgyMDAxLCAweGI1MDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsCisJMHgxMTEwLCAweDA4MGMsIDB4M2YzZSwgMHgyMDAxLCAweDAwMDYsIDB4MDRhMSwgMHg2NjE4LCAweDAwZDYsCisJMHgyNjY4LCAweDZlMDQsIDB4MDBkZSwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsCisJMHgwMTcwLCAweDIwMDEsIDB4MDAwNiwgMHgwMDQ4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDMwLCAweDIwMDEsCisJMHgwMDA2LCAweDA0MDEsIDB4MDAyMCwgMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg0ZjJhLCAweDA4MGMsCisJMHg3MDkwLCAweDA4MGMsIDB4ODYxZCwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgyNjAwLCAweDAwMDIsCisJMHhhNzUxLCAweGE3NTEsIDB4YTc1MSwgMHhhNzUxLCAweGE3NTEsIDB4YTc1MywgMHhhNzUxLCAweGE3NTEsCisJMHhhNzUxLCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4MDAxNiwgMHgwMGQ2LCAweDYxMTgsIDB4MjE2OCwgMHg2OTAwLCAweGQxODQsCisJMHgwMTQwLCAweDA4MGMsIDB4NGVmZCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0ZWViLCAweDA4MGMsCisJMHgyY2MyLCAweDAwZGUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4NjYxOCwgMHgyNjY4LCAweDY4MDQsCisJMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMGRlLCAweGEwYjIsIDB4MDAwYywgMHgxYTBjLCAweDE1MTUsCisJMHhhMWI2LCAweDAwMTUsIDB4MTExMCwgMHgwMDNiLCAweDAwMjgsIDB4YTFiNiwgMHgwMDE2LCAweDE5MGMsCisJMHgxNTE1LCAweDAwNmIsIDB4MDAwNSwgMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsCisJMHg4Y2RmLCAweGE3ZGMsIDB4YTc5YiwgMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsCisJMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHg4Y2RmLCAweDhjZGYsIDB4YTdkYywgMHhhN2UzLCAweDhjZGYsCisJMHg4Y2RmLCAweDhjZGYsIDB4OGNkZiwgMHgwMGY2LCAweDIwNzksIDB4YjU1MiwgMHg3ODA0LCAweGQwYWMsCisJMHgxMWUwLCAweDYwMTgsIDB4YTA3ZCwgMHgwMWM4LCAweDc4MDAsIDB4ZDBmNCwgMHgxMTE4LCAweDc4MTAsCisJMHhhMDA1LCAweDExOTgsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGVlYiwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDRlZmQsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsCisJMHgwODBjLCAweDZjZDMsIDB4MDgwYywgMHg3MTczLCAweDAwZTgsIDB4MjAxMSwgMHhiYjgzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyODFkLCAweDExYTgsIDB4MDBjNiwgMHgwODBjLCAweDRmYTksCisJMHgwMTIwLCAweDAwY2UsIDB4MDgwYywgMHg4NjFkLCAweDAwNjgsIDB4NjAxMCwgMHgwMDA2LCAweDYwMTQsCisJMHgwMDA2LCAweDA4MGMsIDB4NGMwYiwgMHgwMDBlLCAweDYwMTYsIDB4MDAwZSwgMHg2MDEyLCAweDAwY2UsCisJMHgwODBjLCAweDg2MWQsIDB4MDBmZSwgMHgwMDA1LCAweDY2MDQsIDB4YTZiNiwgMHgwMDFlLCAweDExMTAsCisJMHgwODBjLCAweDg2MWQsIDB4MDAwNSwgMHgwODBjLCAweDhmOTUsIDB4MTEzOCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDEsIDB4MDgwYywgMHg2Y2QzLCAweDAwMTAsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsCisJMHg2MDA0LCAweGEwOGEsIDB4MDA4MCwgMHgxYTBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsCisJMHg5ZTFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweGE4MTIsCisJMHhhODEyLCAweGE4MTIsIDB4YTgxMiwgMHhhODE0LCAweGE4MTIsIDB4YTgxMiwgMHhhODEyLCAweGE4MTIsCisJMHhhODEyLCAweGE4MTIsIDB4YTgxMiwgMHhhODEyLCAweGE4MTIsIDB4YTgxMiwgMHhhODEyLCAweGE4MTIsCisJMHhhODEyLCAweGE4MTIsIDB4MDgwYywgMHgxNTE1LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsCisJMHgwMDQ2LCAweDAwMjYsIDB4NjIxOCwgMHhhMjgwLCAweDAwMmIsIDB4MjAwNCwgMHhhMDA1LCAweDAxMjAsCisJMHgyMDIxLCAweDAwMDAsIDB4MDgwYywgMHhiMzFjLCAweDYxMDYsIDB4MjA3MSwgMHhiYjgwLCAweDc0NDQsCisJMHhhNGE0LCAweGZmMDAsIDB4MDkwNCwgMHhhODc4LCAweGE0ODYsIDB4MjAwMCwgMHgxMTMwLCAweDIwMDksCisJMHgwMDAxLCAweDIwMTEsIDB4MDIwMCwgMHgwODBjLCAweDZiMWEsIDB4MDgwYywgMHgxNWY4LCAweDA5MGMsCisJMHgxNTE1LCAweDYwMDMsIDB4MDAwNywgMHgyZDAwLCAweDY4MzcsIDB4MDEwZCwgMHg2ODAzLCAweDAwMDAsCisJMHg2ODNiLCAweDAwMDAsIDB4NmM1YSwgMHgyYzAwLCAweDY4NWUsIDB4NjAwOCwgMHg2OGIyLCAweDYwMTgsCisJMHgyMDc4LCAweDc4YTAsIDB4ODAwNywgMHg3MTMwLCAweDY5NGEsIDB4MDAxNiwgMHhhMDg0LCAweGZmMDAsCisJMHg2ODQ2LCAweDY4NGYsIDB4MDAwMCwgMHg2ODUzLCAweDAwMDAsIDB4Njg1NywgMHgwMDM2LCAweDA4MGMsCisJMHg1NDA4LCAweDAwMWUsIDB4YTQ4NiwgMHgyMDAwLCAweDExMzAsIDB4MjAxOSwgMHgwMDE3LCAweDA4MGMsCisJMHhiMDY1LCAweDA4MDQsIDB4YThkNSwgMHhhNDg2LCAweDA0MDAsIDB4MTEzMCwgMHgyMDE5LCAweDAwMDIsCisJMHgwODBjLCAweGIwMTcsIDB4MDgwNCwgMHhhOGQ1LCAweGE0ODYsIDB4MDIwMCwgMHgxMTEwLCAweDA4MGMsCisJMHhhZmZjLCAweGE0ODYsIDB4MTAwMCwgMHgxMTEwLCAweDA4MGMsIDB4YjA0YSwgMHgwODA0LCAweGE4ZDUsCisJMHgyMDY5LCAweGI4NzQsIDB4NmEwMCwgMHhkMjg0LCAweDA5MDQsIDB4YTkzYywgMHhhMjg0LCAweDAzMDAsCisJMHgxOTA0LCAweGE5MzUsIDB4NjgwNCwgMHhhMDA1LCAweDA5MDQsIDB4YTkxZCwgMHgyZDc4LCAweDYwMDMsCisJMHgwMDA3LCAweDA4MGMsIDB4MTVkZiwgMHgwOTA0LCAweGE4ZGMsIDB4NzgwMCwgMHhkMDhjLCAweDExMTgsCisJMHg3ODA0LCAweDgwMDEsIDB4NzgwNiwgMHg2MDEzLCAweDAwMDAsIDB4NjgwMywgMHgwMDAwLCAweDY4MzcsCisJMHgwMTE2LCAweDY4M2IsIDB4MDAwMCwgMHg2MDA4LCAweDY4YjIsIDB4MmMwMCwgMHg2ODRhLCAweDYwMTgsCisJMHgyMDc4LCAweDc4YTAsIDB4ODAwNywgMHg3MTMwLCAweDY5ODYsIDB4Njg0NiwgMHg3OTI4LCAweDY5OGEsCisJMHg3OTJjLCAweDY5OGUsIDB4NzkzMCwgMHg2OTkyLCAweDc5MzQsIDB4Njk5NiwgMHg2ODUzLCAweDAwM2QsCisJMHg3MjQ0LCAweGEyOTQsIDB4MDAwMywgMHhhMjg2LCAweDAwMDIsIDB4MTExOCwgMHg2ODRmLCAweDAwNDAsCisJMHgwMDQwLCAweGEyODYsIDB4MDAwMSwgMHgxMTE4LCAweDY4NGYsIDB4MDA4MCwgMHgwMDEwLCAweDY4NGYsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwYSwgMHgyMDAxLCAweGJiOTAsIDB4YWQ5MCwgMHgwMDE1LCAweDIwMGMsCisJMHg4MTBmLCAweDIxMTIsIDB4ODAwMCwgMHg4MjEwLCAweDFmMDQsIDB4YThjNywgMHgyMDBjLCAweDY5ODIsCisJMHg4MDAwLCAweDIwMGMsIDB4Njk3ZSwgMHgwODBjLCAweDU0MDgsIDB4MDAyZSwgMHgwMDRlLCAweDAxNWUsCisJMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDA1LCAweDIwMDEsIDB4YjUwZSwgMHgyMDA0LCAweGQwODQsCisJMHgwMTIwLCAweDA4MGMsIDB4MTVmOCwgMHgxOTA0LCAweGE4OGQsIDB4NjAxMywgMHgwMTAwLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLCAweDBjMjgsCisJMHgyMDY5LCAweGJiOTIsIDB4MmQwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgxMjAwLCAweDExYTgsCisJMHgyMDY5LCAweGJiODAsIDB4Njg2YywgMHhhMDg0LCAweDAwZmYsIDB4MDAxNiwgMHg2MTEwLCAweGExOGMsCisJMHgwNzAwLCAweGExMGQsIDB4NjExMiwgMHgwMDFlLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDMsCisJMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLCAweDA4NDAsIDB4Njg2OCwgMHg2MDJhLCAweDY4NmMsCisJMHg2MDJlLCAweDYwMTMsIDB4MDIwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDA4MGMsCisJMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwODA0LCAweGE4ZDUsIDB4MjAwMSwgMHhiNTBkLCAweDIwMDQsCisJMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4M2VjYywgMHg2MDEzLCAweDAzMDAsCisJMHgwMDEwLCAweDYwMTMsIDB4MDEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDA4MGMsCisJMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwODA0LCAweGE4ZDUsIDB4NjAxMywgMHgwNTAwLCAweDBjOTgsCisJMHg2MDEzLCAweDA2MDAsIDB4MDgwNCwgMHhhOGYwLCAweDYwMTMsIDB4MDIwMCwgMHgwODA0LCAweGE4ZjAsCisJMHhhMTg2LCAweDAwMTMsIDB4MTE3MCwgMHg2MDA0LCAweGEwOGEsIDB4MDA0MCwgMHgwYTBjLCAweDE1MTUsCisJMHhhMDhhLCAweDAwNTMsIDB4MWEwYywgMHgxNTE1LCAweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDA4MDQsCisJMHhhOWNhLCAweGExODYsIDB4MDA1MSwgMHgwMTM4LCAweGExODYsIDB4MDA0NywgMHgxMWQ4LCAweDYwMDQsCisJMHhhMDg2LCAweDAwNDEsIDB4MDUxOCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDAxZjAsCisJMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDZiNzQsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDExNzAsCisJMHgwODA0LCAweGFhMGQsIDB4YTE4NiwgMHgwMDI3LCAweDAxMjAsIDB4YTE4NiwgMHgwMDE0LCAweDE5MGMsCisJMHgxNTE1LCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDAxYSwgMHgwODBjLCAweDg2NjMsCisJMHgwMDA1LCAweGE5OTQsIDB4YTk5NiwgMHhhOTk2LCAweGE5YmEsIDB4YTk5NCwgMHhhOTk0LCAweGE5OTQsCisJMHhhOTk0LCAweGE5OTQsIDB4YTk5NCwgMHhhOTk0LCAweGE5OTQsIDB4YTk5NCwgMHhhOTk0LCAweGE5OTQsCisJMHhhOTk0LCAweGE5OTQsIDB4YTk5NCwgMHhhOTk0LCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDcwOTAsCisJMHgwODBjLCAweDcxNzMsIDB4MDAzNiwgMHgwMGQ2LCAweDYwMTAsIDB4YTA2ZCwgMHgwMWMwLCAweGFkODQsCisJMHhmMDAwLCAweDAxYTgsIDB4NjAwMywgMHgwMDAyLCAweDYwMTgsIDB4MjAwNCwgMHhkMGJjLCAweDExNzgsCisJMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhiMDk5LCAweDYwMTMsIDB4MDAwMCwgMHg2MDE0LCAweGEwMDUsCisJMHgxMTIwLCAweDIwMDEsIDB4YjdiNywgMHgyMDA0LCAweDYwMTYsIDB4NjAwMywgMHgwMDA3LCAweDAwZGUsCisJMHgwMDNlLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg3MTczLCAweDA4MGMsCisJMHg5YzVhLCAweDAxMjAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4MTYwZiwgMHgwODBjLCAweDllMWQsCisJMHgwMGRlLCAweDAwMDUsIDB4MDAwMiwgMHhhOWRlLCAweGE5ZmIsIDB4YTllNywgMHhhYTA3LCAweGE5ZGUsCisJMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsCisJMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHhhOWRlLCAweGE5ZGUsIDB4YTlkZSwgMHgwODBjLCAweDE1MTUsCisJMHg2MDEwLCAweGEwODgsIDB4MDAxMywgMHgyMTA0LCAweGEwODUsIDB4MDQwMCwgMHgyMDBhLCAweDA4MGMsCisJMHg3MDkwLCAweDYwMTAsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4ZDBiNCwgMHgwMTM4LCAweDYwMDMsCisJMHgwMDA3LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweDg2NGMsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDIsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHhiMmQ3LCAweDExMjAsCisJMHgwODBjLCAweDZhZWYsIDB4MDgwYywgMHg4NjFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDA4MGMsCisJMHg3MDkwLCAweDIwMDksIDB4MDA0MSwgMHgwODA0LCAweGFiNTYsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsCisJMHhhYTIzLCAweGFhMjUsIDB4YWEyMywgMHhhYTIzLCAweGFhMjMsIDB4YWEyMywgMHhhYTIzLCAweGFhMjYsCisJMHhhYTIzLCAweGFhMjMsIDB4YWEyMywgMHhhYTIzLCAweGFhMjMsIDB4YWEyMywgMHhhYTIzLCAweGFhMjMsCisJMHhhYTIzLCAweGFhMzEsIDB4YWEyMywgMHgwODBjLCAweDE1MTUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDQsCisJMHg2MTEwLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgwODBjLCAweDE4NWUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg2YWVmLCAweDAwZGUsIDB4MDgwYywgMHhiMzNhLCAweDA4MGMsCisJMHg4NjFkLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4YWE1MCwgMHhhYTUwLCAweGFhNTAsCisJMHhhYTUwLCAweGFhNTAsIDB4YWE1MCwgMHhhYTUwLCAweGFhNTIsIDB4YWE1MCwgMHhhYTU1LCAweGFhOGUsCisJMHhhYTUwLCAweGFhNTAsIDB4YWE1MCwgMHhhYTUwLCAweGFhOGUsIDB4YWE1MCwgMHhhYTUwLCAweGFhNTAsCisJMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg4NjYzLCAweDAwMDUsIDB4MjAwMSwgMHhiNTcyLCAweDIwMDQsCisJMHhkMGU0LCAweDAxNTgsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAyMjgsCisJMHgyMDAxLCAweDAxMWYsIDB4MjAwNCwgMHg2MDM2LCAweDAwMTAsIDB4NjAzNywgMHgwMDAwLCAweDA4MGMsCisJMHg3MTI2LCAweDA4MGMsIDB4NzIzMCwgMHg2MDEwLCAweDAwZDYsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsCisJMHgwMTUwLCAweGEwOGMsIDB4MDAwMywgMHhhMThlLCAweDAwMDIsIDB4MDE2OCwgMHgyMDA5LCAweDAwNDEsCisJMHgwMGRlLCAweDA4MDQsIDB4YWI1NiwgMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLCAweDA4MGMsCisJMHg2YWVmLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweGIyZDcsIDB4MDExMCwgMHgwMGRlLCAweDAwMDUsCisJMHgwODBjLCAweDZhZWYsIDB4MDgwYywgMHg4NjFkLCAweDAwZGUsIDB4MGNhMCwgMHgwMDM2LCAweDA4MGMsCisJMHg3MTI2LCAweDA4MGMsIDB4NzIzMCwgMHg2MDEwLCAweDAwZDYsIDB4MjA2OCwgMHg2MDE4LCAweDIwMDQsCisJMHhkMGJjLCAweDAxODgsIDB4Njg0YywgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAxNDAsCisJMHg2ODdjLCAweDYzMmMsIDB4YTMxYSwgMHg2MzJlLCAweDY4ODAsIDB4NjMyOCwgMHhhMzFiLCAweDYzMmEsCisJMHg2MDAzLCAweDAwMDIsIDB4MDA4MCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhiMDk5LCAweDYwMTQsCisJMHhhMDA1LCAweDExMjgsIDB4MjAwMSwgMHhiN2I3LCAweDIwMDQsIDB4ODAwMywgMHg2MDE2LCAweDYwMTMsCisJMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgwMGRlLCAweDAwM2UsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTMsCisJMHgxMTUwLCAweDYwMDQsIDB4YTA4NiwgMHgwMDQyLCAweDE5MGMsIDB4MTUxNSwgMHgwODBjLCAweDcwOTAsCisJMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMTg2LCAweDAwMjcsIDB4MDExOCwgMHhhMTg2LCAweDAwMTQsCisJMHgxMTgwLCAweDYwMDQsIDB4YTA4NiwgMHgwMDQyLCAweDE5MGMsIDB4MTUxNSwgMHgyMDAxLCAweDAwMDcsCisJMHgwODBjLCAweDRmMmEsIDB4MDgwYywgMHg3MDkwLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLCAweDcxNzMsCisJMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweGFhZjcsIDB4YWFmNywgMHhhYWY3LCAweGFhZjcsCisJMHhhYWY3LCAweGFhZjcsIDB4YWFmNywgMHhhYWY5LCAweGFiMDUsIDB4YWFmNywgMHhhYWY3LCAweGFhZjcsCisJMHhhYWY3LCAweGFhZjcsIDB4YWFmNywgMHhhYWY3LCAweGFhZjcsIDB4YWFmNywgMHhhYWY3LCAweDA4MGMsCisJMHgxNTE1LCAweDAwMzYsIDB4MDA0NiwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsCisJMHgwODBjLCAweDE4NWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4NjAxMCwgMHgwMGQ2LCAweDIwNjgsCisJMHg2ODEwLCAweDZhMTQsIDB4MDAwNiwgMHgwMDQ2LCAweDAwNTYsIDB4NmM3YywgMHhhNDIyLCAweDZkODAsCisJMHgyMjAwLCAweGE1MmIsIDB4NjAyYywgMHhhNDIwLCAweDY0MmUsIDB4NjAyOCwgMHhhNTI5LCAweDY1MmEsCisJMHgwMDVlLCAweDAwNGUsIDB4MDAwZSwgMHhhMjBkLCAweDExNzgsIDB4Njg0YywgMHhkMGZjLCAweDAxMjAsCisJMHgyMDA5LCAweDAwNDEsIDB4MDBkZSwgMHgwNDkwLCAweDYwMDMsIDB4MDAwNywgMHg2MDE3LCAweDAwMDAsCisJMHgwODBjLCAweDZhZWYsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHg1MzA1LCAweDAwZmUsIDB4MDAwZSwgMHgwMTIwLCAweDYwMDMsIDB4MDAwMiwgMHgwMGRlLCAweDAwMDUsCisJMHgyMDA5LCAweGI1MGQsIDB4MjEwYywgMHhkMTljLCAweDAxMTgsIDB4NjAwMywgMHgwMDA3LCAweDAwMTAsCisJMHg2MDAzLCAweDAwMDYsIDB4MDAyMSwgMHgwODBjLCAweDZhZjEsIDB4MDBkZSwgMHgwMDA1LCAweGQyZmMsCisJMHgwMTQwLCAweDgwMDIsIDB4ODAwMCwgMHg4MjEyLCAweGEyOTEsIDB4MDAwMCwgMHgyMDA5LCAweDAwMDksCisJMHgwMDEwLCAweDIwMDksIDB4MDAxNSwgMHg2YTZhLCAweDY4NjYsIDB4MDAwNSwgMHhhMTgyLCAweDAwNDAsCisJMHgwMjA4LCAweDAwNjIsIDB4YTE4NiwgMHgwMDEzLCAweDAxMjAsIDB4YTE4NiwgMHgwMDE0LCAweDE5MGMsCisJMHgxNTE1LCAweDYwMjAsIDB4ZDBkYywgMHgwOTBjLCAweDE1MTUsIDB4MDAwNSwgMHhhYjc5LCAweGFiODAsCisJMHhhYjhjLCAweGFiOTgsIDB4YWI3OSwgMHhhYjc5LCAweGFiNzksIDB4YWJhNywgMHhhYjc5LCAweGFiN2IsCisJMHhhYjdiLCAweGFiNzksIDB4YWI3OSwgMHhhYjc5LCAweGFiNzksIDB4YWI3YiwgMHhhYjc5LCAweGFiN2IsCisJMHhhYjc5LCAweDA4MGMsIDB4MTUxNSwgMHg2MDIwLCAweGQwZGMsIDB4MDkwYywgMHgxNTE1LCAweDAwMDUsCisJMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDZjOGQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDcxNzMsIDB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsCisJMHg2YzhkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NzE3MywgMHgwMTJlLCAweDAwMDUsCisJMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDA4MGMsIDB4MWZhOSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NmNmMCwgMHgwODBjLCAweDcyMzAsIDB4MDEyZSwgMHgwMDA1LCAweGEwMTYsCisJMHgwODBjLCAweDE4NWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDM2LCAweDAwZDYsCisJMHhhMTgyLCAweDAwNDAsIDB4MDAyMywgMHgwMGRlLCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LCAweGFiYzcsCisJMHhhYmM5LCAweGFiZGIsIDB4YWJmNiwgMHhhYmM3LCAweGFiYzcsIDB4YWJjNywgMHhhYzBiLCAweGFiYzcsCisJMHhhYmM3LCAweGFiYzcsIDB4YWJjNywgMHhhYmM3LCAweGFiYzcsIDB4YWJjNywgMHhhYmM3LCAweDA4MGMsCisJMHgxNTE1LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsIDB4MDFmOCwgMHhhMDljLCAweDAwMDMsCisJMHhhMzllLCAweDAwMDMsIDB4MDFkMCwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDZjOGQsCisJMHgwODBjLCAweDcxNzMsIDB4MDQ5OCwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAxNjgsCisJMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDAxNDAsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsCisJMHgwODBjLCAweDZjOGQsIDB4MDgwYywgMHg3MTczLCAweDA0MDgsIDB4NjAxMywgMHgwMDAwLCAweDYwMTcsCisJMHgwMDAwLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGIwOTksIDB4MDBjMCwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODRjLCAweGQwZmMsIDB4MGQ5MCwgMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDBkNjgsCisJMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDA4MGMsIDB4MWZhOSwgMHgwODBjLCAweDZjZjAsCisJMHgwODBjLCAweDcyMzAsIDB4MDAxOCwgMHhhMDE2LCAweDA4MGMsIDB4MTg1ZSwgMHgwMDA1LCAweDA4MGMsCisJMHg3MDkwLCAweDYxMTAsIDB4ODFmZiwgMHgwMTU4LCAweDAwZDYsIDB4MjE2OCwgMHgwODBjLCAweGIzODAsCisJMHgwMDM2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweGIwOTksIDB4MDAzZSwgMHgwMGRlLCAweDA4MGMsCisJMHg5ZTFkLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweDA4MGMsIDB4NzEyNiwgMHg2MTEwLCAweDgxZmYsCisJMHgwMTU4LCAweDAwZDYsIDB4MjE2OCwgMHgwODBjLCAweGIzODAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMjksCisJMHgwODBjLCAweGIwOTksIDB4MDAzZSwgMHgwMGRlLCAweDA4MGMsIDB4OWUxZCwgMHgwODBjLCAweDcyMzAsCisJMHgwMDA1LCAweGExODIsIDB4MDA4NSwgMHgwMDAyLCAweGFjNDUsIDB4YWM0MywgMHhhYzQzLCAweGFjNTEsCisJMHhhYzQzLCAweGFjNDMsIDB4YWM0MywgMHgwODBjLCAweDE1MTUsIDB4NjAwMywgMHgwMDBiLCAweDYxMDYsCisJMHgwODBjLCAweDZjOGQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg3MTczLCAweDAxMmUsCisJMHgwMDA1LCAweDAwMjYsIDB4MDBlNiwgMHgwODBjLCAweGIyZDAsIDB4MDExOCwgMHgwODBjLCAweDg2MWQsCisJMHgwMGQ4LCAweDIwNzEsIDB4YmI4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwgMHgwODBjLCAweGFmNDcsCisJMHgwMTE4LCAweDYwMDcsIDB4MDA4NiwgMHgwMDQwLCAweDYwMDcsIDB4MDA4NywgMHg3MjI0LCAweGEyOTYsCisJMHhmZmZmLCAweDExMTAsIDB4NjAwNywgMHgwMDg2LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsCisJMHgwODBjLCAweDcxNzMsIDB4MDgwYywgMHg3MjMwLCAweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweGExODYsCisJMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHhhMDhhLCAweDAwODUsIDB4MGEwYywgMHgxNTE1LCAweGEwOGEsCisJMHgwMDhjLCAweDFhMGMsIDB4MTUxNSwgMHhhMDgyLCAweDAwODUsIDB4MDBhMiwgMHhhMTg2LCAweDAwMjcsCisJMHgwMTMwLCAweGExODYsIDB4MDAxNCwgMHgwMTE4LCAweDA4MGMsIDB4ODY2MywgMHgwMDUwLCAweDIwMDEsCisJMHgwMDA3LCAweDA4MGMsIDB4NGYyYSwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4YWNhMSwgMHhhY2EzLCAweGFjYTMsIDB4YWNhMSwgMHhhY2ExLCAweGFjYTEsCisJMHhhY2ExLCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4YTE4MiwgMHgwMDg1LCAweDBhMGMsIDB4MTUxNSwgMHhhMTgyLCAweDAwOGMsCisJMHgxYTBjLCAweDE1MTUsIDB4YTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4YWNiYywgMHhhY2JjLCAweGFjYmMsCisJMHhhY2JlLCAweGFjYmMsIDB4YWNiYywgMHhhY2JjLCAweDA4MGMsIDB4MTUxNSwgMHgwMDA1LCAweGExODYsCisJMHgwMDEzLCAweDAxNDgsIDB4YTE4NiwgMHgwMDE0LCAweDAxMzAsIDB4YTE4NiwgMHgwMDI3LCAweDAxMTgsCisJMHgwODBjLCAweDg2NjMsIDB4MDAzMCwgMHgwODBjLCAweDcwOTAsIDB4MDgwYywgMHg5ZTFkLCAweDA4MGMsCisJMHg3MTczLCAweDAwMDUsIDB4MDAzNiwgMHgwODBjLCAweGIzM2EsIDB4NjAzZiwgMHgwMDAwLCAweDIwMTksCisJMHgwMDBiLCAweDAwMzEsIDB4NjAxZiwgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLCAweDAwMDUsCisJMHgwMTI2LCAweDAwMzYsIDB4MjA5MSwgMHg4MDAwLCAweDAwODYsIDB4MmM0MCwgMHgwMDk2LCAweDIwNDksCisJMHgwMDAwLCAweDA4MGMsIDB4ODEzMCwgMHgwMDllLCAweDAwOGUsIDB4MTU3OCwgMHgwMDc2LCAweDJjMzgsCisJMHgwODBjLCAweDgxZDYsIDB4MDA3ZSwgMHgxNTQ4LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDA1MjgsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwNywgMHgwNTA4LCAweDAwZDYsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsCisJMHgxMTUwLCAweDA4MGMsIDB4YjMzYSwgMHg2MDFmLCAweDAwMDcsIDB4MjAwMSwgMHhiN2I2LCAweDIwMDQsCisJMHg2MDE2LCAweDA4MGMsIDB4MTk0ZCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxMTAsCisJMHgwODBjLCAweGIwOTksIDB4MDBkZSwgMHg2MDEzLCAweDAwMDAsIDB4MDgwYywgMHhiMzNhLCAweDYwMWYsCisJMHgwMDA3LCAweDIwMDEsIDB4YjdiNiwgMHgyMDA0LCAweDYwMTYsIDB4MDAzZSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMGY2LCAweDAwYzYsIDB4MDAzNiwgMHgwMTU2LCAweDIwNzksIDB4YmI4MCwgMHg3OTM4LCAweDc4M2MsCisJMHgwODBjLCAweDI4MWQsIDB4MTViMCwgMHgwMDE2LCAweDAwYzYsIDB4MDgwYywgMHg0ZmE5LCAweDE1NzgsCisJMHgwMDFlLCAweDAwMmUsIDB4MDAyNiwgMHgwMDE2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDgyOTksCisJMHgwODBjLCAweDZkZjUsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ZDAyLCAweDAwN2UsCisJMHgwMDFlLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4YWU4MiwgMHgwMDdlLCAweDA4MGMsCisJMHg1MWFhLCAweDAwMjYsIDB4NjIwNCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LCAweDAwMDYsCisJMHgwMTE4LCAweGEyODYsIDB4MDAwNCwgMHgxMTE4LCAweDYyYTAsIDB4MDgwYywgMHgyZDU1LCAweDAwMmUsCisJMHgwMDFlLCAweDA4MGMsIDB4NGMwYiwgMHg2NjEyLCAweDY1MTYsIDB4YTAwNiwgMHgwMDEwLCAweDAwY2UsCisJMHgwMDFlLCAweDAxNWUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDAwMTYsIDB4MjAwOSwgMHhiNTIxLCAweDIxMDQsIDB4YTA4NiwgMHgwMDc0LCAweDE5MDQsCisJMHhhZGJiLCAweDIwNjksIDB4YmI4ZSwgMHg2OTBjLCAweGExODIsIDB4MDEwMCwgMHgwNmMwLCAweDY5MDgsCisJMHhhMTg0LCAweDgwMDAsIDB4MDVlOCwgMHgyMDAxLCAweGI3OWUsIDB4MjAwNCwgMHhhMDA1LCAweDExNjAsCisJMHg2MDE4LCAweDIwNzAsIDB4NzAxMCwgMHhhMDg0LCAweDAwZmYsIDB4MDExOCwgMHg3MDAwLCAweGQwZjQsCisJMHgwMTE4LCAweGExODQsIDB4MDgwMCwgMHgwNTYwLCAweDY5MTAsIDB4YTE4YSwgMHgwMDAxLCAweDA2MTAsCisJMHg2OTE0LCAweDIwNjksIDB4YmJhZSwgMHg2OTA0LCAweDgxZmYsIDB4MTE5OCwgMHg2OTBjLCAweGExODIsCisJMHgwMTAwLCAweDAyYTgsIDB4NjkwOCwgMHg4MWZmLCAweDExNzgsIDB4NjkxMCwgMHhhMThhLCAweDAwMDEsCisJMHgwMjg4LCAweDY5MTgsIDB4YTE4YSwgMHgwMDAxLCAweDAyOTgsIDB4MDBkMCwgMHg2MDEzLCAweDAxMDAsCisJMHgwMGEwLCAweDYwMTMsIDB4MDMwMCwgMHgwMDg4LCAweDYwMTMsIDB4MDUwMCwgMHgwMDcwLCAweDYwMTMsCisJMHgwNzAwLCAweDAwNTgsIDB4NjAxMywgMHgwOTAwLCAweDAwNDAsIDB4NjAxMywgMHgwYjAwLCAweDAwMjgsCisJMHg2MDEzLCAweDBmMDAsIDB4MDAxMCwgMHg2MDEzLCAweDJkMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDgsCisJMHhhMDA2LCAweDAwMWUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHg2MjE4LCAweDIyNjgsIDB4NmIwNCwgMHhhMzk0LCAweDAwZmYsCisJMHhhMjg2LCAweDAwMDYsIDB4MDE5MCwgMHhhMjg2LCAweDAwMDQsIDB4MDE3OCwgMHhhMzk0LCAweGZmMDAsCisJMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMTQ4LCAweGEyODYsIDB4MDAwNCwgMHgwMTMwLCAweDAwYzYsCisJMHgyZDYwLCAweDA4MGMsIDB4NGZiOCwgMHgwMGNlLCAweDA0YzAsIDB4MjAxMSwgMHhiYjk2LCAweGFkOTgsCisJMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweDkwZGEsIDB4MTU4MCwgMHgyMDExLCAweGJiOWEsCisJMHhhZDk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4OTBkYSwgMHgxNTM4LCAweDAwNDYsCisJMHgwMDE2LCAweDZhYTAsIDB4YTI5NCwgMHgwMGZmLCAweDgyMjcsIDB4YTAwNiwgMHgyMDA5LCAweGI1NTMsCisJMHgyMTBjLCAweGQxYTQsIDB4MDEzOCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhiMGU4LCAweDY4MDAsCisJMHhjMGU1LCAweDY4MDIsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4NmRmNSwgMHgwMDc2LCAweDIwMzksCisJMHgwMDAwLCAweDA4MGMsIDB4NmQwMiwgMHgyYzA4LCAweDA4MGMsIDB4YWU4MiwgMHgwMDdlLCAweDIwMDEsCisJMHgwMDA3LCAweDA4MGMsIDB4NGYyYSwgMHgwMDFlLCAweDAwNGUsIDB4YTAwNiwgMHgwMTVlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHhiYjhlLCAweDY4MDAsCisJMHhhMDg2LCAweDA4MDAsIDB4MDExOCwgMHg2MDEzLCAweDAwMDAsIDB4MDAwOCwgMHhhMDA2LCAweDAwZGUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwNzksCisJMHhiYjhjLCAweDc5MzAsIDB4NzgzNCwgMHgwODBjLCAweDI4MWQsIDB4MTFhMCwgMHgwODBjLCAweDRmYTksCisJMHgxMTg4LCAweDIwMTEsIDB4YmI5MCwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsCisJMHg5MGRhLCAweDExNDAsIDB4MjAxMSwgMHhiYjk0LCAweGFjOTgsIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDkwZGEsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwY2UsCisJMHgwMDA1LCAweDAwYzYsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsCisJMHhiYjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjgxZCwgMHgxMWEwLCAweDA4MGMsCisJMHg0ZmE5LCAweDExODgsIDB4MjAxMSwgMHhiYjk2LCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDkwZGEsIDB4MTE0MCwgMHgyMDExLCAweGJiOWEsIDB4YWM5OCwgMHgwMDA2LCAweDIwYTksCisJMHgwMDA0LCAweDA4MGMsIDB4OTBkYSwgMHgwMTVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMGNlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsCisJMHgwMDQ2LCAweDAwMjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDI5LCAweGI3ZTksCisJMHgyNTJjLCAweDIwMjEsIDB4YjdlZiwgMHgyNDI0LCAweDIwNjEsIDB4YmQwMCwgMHgyMDcxLCAweGI1MDAsCisJMHg3NjQ4LCAweDcwNjgsIDB4ODFmZiwgMHgwMTUwLCAweDAwMDYsIDB4YTE4NiwgMHhiOGY0LCAweDAwMGUsCisJMHgwMTI4LCAweDgwMDEsIDB4YTYwMiwgMHgxYTA0LCAweGFmMDMsIDB4MDAxOCwgMHhhNjA2LCAweDA5MDQsCisJMHhhZjAzLCAweDIxMDAsIDB4YWMwNiwgMHgwOTA0LCAweGFlZmEsIDB4MDgwYywgMHhiMTEwLCAweDA5MDQsCisJMHhhZWZhLCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLCAweDA5MDQsIDB4YWYxZSwgMHhhNzg2LCAweDAwMDQsCisJMHgwOTA0LCAweGFmMWUsIDB4YTc4NiwgMHgwMDA3LCAweDA1ZTgsIDB4MjUwMCwgMHhhYzA2LCAweDA1ZDAsCisJMHgyNDAwLCAweGFjMDYsIDB4MDViOCwgMHgwODBjLCAweGIxMjAsIDB4MTVhMCwgMHg4OGZmLCAweDAxMTgsCisJMHg2MDUwLCAweGE5MDYsIDB4MTU3OCwgMHgwMGQ2LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDExMjAsCisJMHgwMDE2LCAweDA4MGMsIDB4MTk0ZCwgMHgwMDFlLCAweGE3ODYsIDB4MDAwOCwgMHgxMTQ4LCAweDA4MGMsCisJMHg5ZTU4LCAweDExMzAsIDB4MDgwYywgMHg4YzE5LCAweDAwZGUsIDB4MDgwYywgMHg5ZTFkLCAweDAwZDAsCisJMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxOTAsIDB4YTc4NiwgMHgwMDAzLCAweDE1MjgsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHhiMzgwLCAweDAwMTYsCisJMHgwODBjLCAweDllY2MsIDB4MDgwYywgMHg1NDA4LCAweDAwMWUsIDB4MDgwYywgMHg5ZTExLCAweDAwZGUsCisJMHgwODBjLCAweDllMWQsIDB4YWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4YjUxNywgMHgyMDA0LCAweGFjMDIsCisJMHgxMjEwLCAweDA4MDQsIDB4YWU5NiwgMHgwMTJlLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsCisJMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4YTc4NiwgMHgwMDA2LCAweDExNTAsCisJMHhhMzg2LCAweDAwMDUsIDB4MDEyOCwgMHgwODBjLCAweGIzODAsIDB4MDgwYywgMHhiMDk5LCAweDA4ZjgsCisJMHgwMGRlLCAweDBjMDAsIDB4YTc4NiwgMHgwMDBhLCAweDA5NjgsIDB4MDg1MCwgMHgwODBjLCAweGIxMjAsCisJMHgxOWM4LCAweDgxZmYsIDB4MDliOCwgMHhhMTgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDg2LCAweDAwMTgsCisJMHgwMTMwLCAweGExODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODYsIDB4MDAyZCwgMHgxOTU4LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDIsIDB4MTkzOCwgMHgwODBjLCAweDllNDcsIDB4MDEzMCwgMHgwODBjLCAweDllNTgsCisJMHgxOTA4LCAweDA4MGMsIDB4OGMxOSwgMHgwMDM4LCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDllNTgsCisJMHgxMTEwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDllMWQsIDB4MDgwNCwgMHhhZWZhLCAweDAwYzYsCisJMHgwMGU2LCAweDAwMTYsIDB4MmMwOCwgMHgyMTcwLCAweGEwMDYsIDB4MDgwYywgMHhiMGJhLCAweDAwMWUsCisJMHgwMTIwLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDBlZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhZjYwLCAweGFmNjAsIDB4YWY2MCwgMHhhZjYwLCAweGFmNjAsIDB4YWY2MCwgMHhhZjYyLCAweGFmNjAsCisJMHhhMDA2LCAweDAwMDUsIDB4MDA0NiwgMHgwMDE2LCAweDcwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMjQsCisJMHhhNGE0LCAweDAwZmYsIDB4ODQyNywgMHgyYzAwLCAweDIwMDksIDB4MDAyMCwgMHgwODBjLCAweGIwZTgsCisJMHgwMDFlLCAweDAwNGUsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhhY2UwLCAweDAwM2UsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg0ZWViLCAweDAxNTYsCisJMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHhiNTA1LCAweDIwMTEsCisJMHhiYjk2LCAweDA4MGMsIDB4OTBkYSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweGEwMDUsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MDA3NiwgMHgwMDY2LCAweDAwMjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyNzQwLCAweDIwNjEsIDB4YmQwMCwgMHgyMDc5LCAweDAwMDEsCisJMHg4ZmZmLCAweDA5MDQsIDB4YWZlZiwgMHgyMDcxLCAweGI1MDAsIDB4NzY0OCwgMHg3MDY4LCAweDgwMDEsCisJMHhhNjAyLCAweDFhMDQsIDB4YWZlZiwgMHg4OGZmLCAweDAxMjgsIDB4MjgwMCwgMHhhYzA2LCAweDE1YjAsCisJMHgyMDc5LCAweDAwMDAsIDB4MDgwYywgMHhiMTEwLCAweDA1ODgsIDB4MjQwMCwgMHhhYzA2LCAweDA1NzAsCisJMHg2NzFjLCAweGE3ODYsIDB4MDAwNiwgMHgxNTUwLCAweGE3ODYsIDB4MDAwNywgMHgwNTM4LCAweDg4ZmYsCisJMHgxMTQwLCAweDYwMTgsIDB4YTIwNiwgMHgxNTEwLCAweDg1ZmYsIDB4MDExOCwgMHg2MDUwLCAweGExMDYsCisJMHgxMWU4LCAweDAwZDYsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MTE1MCwgMHgwODBjLCAweGIzM2EsCisJMHg2MDFmLCAweDAwMDcsIDB4MjAwMSwgMHhiN2I2LCAweDIwMDQsIDB4NjAxNiwgMHgwODBjLCAweDE5NGQsCisJMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5YzVhLCAweDAxMjAsIDB4MDA0NiwgMHgwODBjLCAweGIwOTksCisJMHgwMDRlLCAweDAwZGUsIDB4MDgwYywgMHg5ZTFkLCAweDg4ZmYsIDB4MTE5OCwgMHhhY2UwLCAweDAwMTgsCisJMHgyMDAxLCAweGI1MTcsIDB4MjAwNCwgMHhhYzAyLCAweDEyMTAsIDB4MDgwNCwgMHhhZmEwLCAweGEwMDYsCisJMHgwMTJlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweGE4YzUsIDB4MDAwMSwgMHgwY2EwLCAweDAwNzYsIDB4MDA1NiwgMHgwMDg2LCAweDIwNDEsCisJMHgwMDAwLCAweDIwMjksIDB4MDAwMSwgMHgyYzIwLCAweDIwMTksIDB4MDAwMiwgMHg2MjE4LCAweDAwOTYsCisJMHgyMDQ5LCAweDAwMDAsIDB4MDgwYywgMHg4MTMwLCAweDAwOWUsIDB4MDA4ZSwgMHgyMDM5LCAweDAwMDAsCisJMHgwODBjLCAweDgxZDYsIDB4MDgwYywgMHhhZjkxLCAweDAwNWUsIDB4MDA3ZSwgMHgwMDA1LCAweDAwMjYsCisJMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwgMHgyMTI4LCAweDIwYTksCisJMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg0ZmE5LCAweDExYjAsCisJMHgyYzEwLCAweDAwNTYsIDB4MDA4NiwgMHgyMDQxLCAweDAwMDAsIDB4MjUwOCwgMHgyMDI5LCAweDAwMDEsCisJMHgwMDk2LCAweDIwNDksIDB4MDAwMCwgMHgwODBjLCAweDgxMzAsIDB4MDA5ZSwgMHgwMDhlLCAweDIwMzksCisJMHgwMDAwLCAweDA4MGMsIDB4ODFkNiwgMHgwODBjLCAweGFmOTEsIDB4MDA1ZSwgMHgwMDNlLCAweDAwMWUsCisJMHg4MTA4LCAweDFmMDQsIDB4YjAyMywgMHgwMTVlLCAweDAwY2UsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsCisJMHgwMDJlLCAweDAwMDUsIDB4MDA3NiwgMHgwMDU2LCAweDYyMTgsIDB4MDA4NiwgMHgyMDQxLCAweDAwMDAsCisJMHgyMDI5LCAweDAwMDEsIDB4MjAxOSwgMHgwMDQ4LCAweDAwOTYsIDB4MjA0OSwgMHgwMDAwLCAweDA4MGMsCisJMHg4MTMwLCAweDAwOWUsIDB4MDA4ZSwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg4MWQ2LCAweDJjMjAsCisJMHgwODBjLCAweGFmOTEsIDB4MDA1ZSwgMHgwMDdlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDQ2LCAweDAwNTYsCisJMHgwMDc2LCAweDAwYzYsIDB4MDE1NiwgMHgyYzIwLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg0ZmE5LCAweDExYzAsIDB4MmMxMCwgMHgwMDg2LCAweDIwNDEsCisJMHgwMDAwLCAweDI4MjgsIDB4MDA0NiwgMHgyMDIxLCAweDAwMDEsIDB4MDgwYywgMHhiMzFjLCAweDAwNGUsCisJMHgwMDk2LCAweDIwNDksIDB4MDAwMCwgMHgwODBjLCAweDgxMzAsIDB4MDA5ZSwgMHgwMDhlLCAweDIwMzksCisJMHgwMDAwLCAweDA4MGMsIDB4ODFkNiwgMHgwODBjLCAweGFmOTEsIDB4MDAzZSwgMHgwMDFlLCAweDgxMDgsCisJMHgxZjA0LCAweGIwNzAsIDB4MDE1ZSwgMHgwMGNlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwMmUsCisJMHgwMDA1LCAweDAwMTYsIDB4MDBmNiwgMHgzODAwLCAweGQwOGMsIDB4MDEzMCwgMHhhZDgyLCAweDEwMDAsCisJMHgwMmIwLCAweGFkODIsIDB4YjUwMCwgMHgwMjMwLCAweGFkODIsIDB4ZWQwMCwgMHgwMjgwLCAweGFkODIsCisJMHhmZmZmLCAweDEyNjgsIDB4NjgwMCwgMHhhMDdkLCAweDAxMzgsIDB4NjgwMywgMHgwMDAwLCAweDZiNTIsCisJMHgwODBjLCAweDU0MDgsIDB4MmY2OCwgMHgwY2IwLCAweDZiNTIsIDB4MDgwYywgMHg1NDA4LCAweDAwZmUsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwgMHhiZDAwLCAweGEwMDUsCisJMHgxMTM4LCAweDIwNzEsIDB4YjUwMCwgMHg3NDQ4LCAweDcwNjgsIDB4ODAwMSwgMHhhNDAyLCAweDEyZDgsCisJMHgyMTAwLCAweGFjMDYsIDB4MDE2OCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDYwMDgsCisJMHhhMjA2LCAweDExMzAsIDB4NjAxOCwgMHhhMWEwLCAweDAwMDYsIDB4MjQyNCwgMHhhNDA2LCAweDAxNDAsCisJMHhhY2UwLCAweDAwMTgsIDB4MjAwMSwgMHhiNTE3LCAweDIwMDQsIDB4YWMwMiwgMHgxMjIwLCAweDBjNDAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwOCwgMHhhMDA2LCAweDAwM2UsIDB4MDA0ZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGQ2LCAweDAwMDYsIDB4MDgwYywgMHgxNWY4LCAweDAwMGUsIDB4MDkwYywgMHgxNTE1LCAweDY4MzcsCisJMHgwMTBkLCAweDY4NWUsIDB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4OWM0YSwgMHgyMDAxLCAweDAwMDAsCisJMHgwMTIwLCAweDIyMDAsIDB4YTA4MCwgMHgwMDE0LCAweDIwMDQsIDB4MDAyZSwgMHg2ODRhLCAweDY5NTYsCisJMHg2YzQ2LCAweDY4NGYsIDB4MDAwMCwgMHgyMDAxLCAweGI3YmUsIDB4MjAwNCwgMHg2ODUyLCAweGEwMDYsCisJMHg2OGIyLCAweDY4MDIsIDB4NjgzYSwgMHg2ODVhLCAweDA4MGMsIDB4NTQwOCwgMHgwMGRlLCAweDAwMDUsCisJMHg2NzAwLCAweGE3ODYsIDB4MDAwMCwgMHgwMTU4LCAweGE3ODYsIDB4MDAwMSwgMHgwMTQwLCAweGE3ODYsCisJMHgwMDBhLCAweDAxMjgsIDB4YTc4NiwgMHgwMDA5LCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHgwMGU2LCAweDYwMTgsIDB4MjA3MCwgMHg3MGEwLCAweGEyMDYsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsCisJMHg2MDA0LCAweGEwOGUsIDB4MDAxZSwgMHgxMWEwLCAweDgwMDcsIDB4NjEzMCwgMHhhMThjLCAweDAwZmYsCisJMHhhMTA1LCAweDYwMzIsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDUsCisJMHgyMDAxLCAweGI3YjcsIDB4MjAwNCwgMHg2MDE2LCAweDA4MGMsIDB4NmM4ZCwgMHgwODBjLCAweDcxNzMsCisJMHgwMDFlLCAweDAwMDUsIDB4ZTAwMCwgMHhlMDAwLCAweDAwMDUsIDB4NjAyMCwgMHhkMGU0LCAweDAxNTgsCisJMHhkMGNjLCAweDAxMTgsIDB4MDgwYywgMHg5ZjM1LCAweDAwMzAsIDB4MDgwYywgMHhiMzNhLCAweDA4MGMsCisJMHg2YWVmLCAweDA4MGMsIDB4ODYxZCwgMHgwMDA1LCAweGEyODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODQsCisJMHgwMDBmLCAweDAwMDIsIDB4YjE2MywgMHhiMTYzLCAweGIxNjMsIDB4YjE2OCwgMHhiMTYzLCAweGIxNjUsCisJMHhiMTY1LCAweGIxNjMsIDB4YjE2NSwgMHhhMDA2LCAweDAwMDUsIDB4MDBjNiwgMHgyMjYwLCAweDAwY2UsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHhhMjgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMDAyLCAweGIxN2EsIDB4YjE3YSwgMHhiMTdhLCAweGIxN2EsIDB4YjE3YSwgMHhiMTdhLCAweGIxODUsCisJMHhiMTdhLCAweGIxN2EsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDJhMDAsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2YzhkLCAweDAwMDUsIDB4MDBjNiwgMHgyMjYwLCAweDA4MGMsCisJMHhiMzNhLCAweDYwM2YsIDB4MDAwMCwgMHg2MDIwLCAweGMwZjQsIDB4YzBjYywgMHg2MDIyLCAweDYwMzcsCisJMHgwMDAwLCAweDAwY2UsIDB4MDBkNiwgMHgyMjY4LCAweGExODYsIDB4MDAwNywgMHgxOTA0LCAweGIxZTAsCisJMHg2ODEwLCAweGEwMDUsIDB4MDEzOCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhkMGZjLCAweDExMTAsCisJMHgwMGRlLCAweDA4YzAsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDZjOGQsCisJMHgwODBjLCAweDcxNzMsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwgMHgwMDAyLCAweDE5MDQsCisJMHhiMjY5LCAweDYwMTAsIDB4YTAwNSwgMHgxMTM4LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA3LCAweDE5MGMsCisJMHgxNTE1LCAweDA4MDQsIDB4YjI2OSwgMHhhMDhjLCAweGYwMDAsIDB4MTEzMCwgMHgwMDI4LCAweDIwNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MWRlMCwgMHgyZDAwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGEwODQsCisJMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgxMTgwLCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGMwZGMsCisJMHhjMGY0LCAweDY4NGUsIDB4Njg1MCwgMHhjMGY0LCAweGMwZmMsIDB4Njg1MiwgMHgyMDA5LCAweDAwNDMsCisJMHgwODBjLCAweGFiNTYsIDB4MDgwNCwgMHhiMjY5LCAweDIwMDksIDB4MDA0MSwgMHgwODA0LCAweGIyNjMsCisJMHhhMTg2LCAweDAwMDUsIDB4MTVmMCwgMHg2ODEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYmMsCisJMHgxMTE4LCAweDAwZGUsIDB4MDgwNCwgMHhiMTdhLCAweGQwYjQsIDB4MDEyOCwgMHhkMGZjLCAweDA5MGMsCisJMHgxNTE1LCAweDA4MDQsIDB4YjE5OCwgMHg2MDA3LCAweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg2YzhkLCAweDA4MGMsIDB4NzE3MywgMHgwMGM2LCAweDJkNjAsIDB4NjEwMCwgMHhhMTg2LCAweDAwMDIsCisJMHgwMTIwLCAweGExODYsIDB4MDAwNCwgMHgxOTA0LCAweGIyNjksIDB4MjA3MSwgMHhiODIzLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDMsIDB4MTEyOCwgMHg3MDA0LCAweGFjMDYsIDB4MTExMCwgMHg3MDAzLCAweDAwMDAsCisJMHg2ODEwLCAweGEwODAsIDB4MDAxMywgMHgyMDBjLCAweGMxZjQsIDB4YzFkYywgMHgyMTAyLCAweDgwMDAsCisJMHgyMDBjLCAweGMxZjQsIDB4YzFmYywgMHhjMWJjLCAweDIxMDIsIDB4MjAwOSwgMHgwMDQyLCAweDA4MDQsCisJMHhiMjYzLCAweDAwMzYsIDB4MDBkNiwgMHgwMGQ2LCAweDA4MGMsIDB4MTVmOCwgMHgwMDNlLCAweDA5MGMsCisJMHgxNTE1LCAweDY4MzcsIDB4MDEwZCwgMHg2ODAzLCAweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDY4NWIsCisJMHgwMDAwLCAweDZiNWUsIDB4Njg1NywgMHgwMDQ1LCAweDJjMDAsIDB4Njg2MiwgMHg2MDM0LCAweDY4NzIsCisJMHgyMzYwLCAweDYwMjAsIDB4YzBkZCwgMHg2MDIyLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHg2MzUwLCAweDZiNGEsIDB4Njg0NiwgMHg2ODRmLCAweDAwMDAsCisJMHg2ODUzLCAweDAwMDAsIDB4NmQ2YSwgMHg2ZTY2LCAweDY4NmYsIDB4MDAwMSwgMHgwODBjLCAweDU0MDgsCisJMHgyMDE5LCAweDAwNDUsIDB4NjAwOCwgMHgyMDY4LCAweDA4MGMsIDB4YWNlMCwgMHgyZDAwLCAweDYwMGEsCisJMHg2MDFmLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHg2MDNmLCAweDAwMDAsCisJMHgwMGRlLCAweDAwM2UsIDB4MDAzOCwgMHg2MDNmLCAweDAwMDAsIDB4NjAwMywgMHgwMDA3LCAweDA4MGMsCisJMHhhYjU2LCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweGExODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsCisJMHhhMDgyLCAweDAwODUsIDB4MjAwOCwgMHgwMGMyLCAweGExODYsIDB4MDAyNywgMHgxMTc4LCAweDA4MGMsCisJMHg3MDkwLCAweDAwMzYsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsCisJMHhiMDk5LCAweDAwZGUsIDB4MDAzZSwgMHgwODBjLCAweDcxNzMsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTQsCisJMHgwZDcwLCAweDA4MGMsIDB4ODY2MywgMHgwMDA1LCAweGIyOTUsIDB4YjI5MywgMHhiMjkzLCAweGIyOTMsCisJMHhiMjkzLCAweGIyOTMsIDB4YjI5NSwgMHgwODBjLCAweDE1MTUsIDB4MDgwYywgMHg3MDkwLCAweDYwMDMsCisJMHgwMDBjLCAweDA4MGMsIDB4NzE3MywgMHgwMDA1LCAweGExODIsIDB4MDA4YywgMHgxMjIwLCAweGExODIsCisJMHgwMDg1LCAweDAyMDgsIDB4MDAxYSwgMHgwODBjLCAweDg2NjMsIDB4MDAwNSwgMHhiMmFkLCAweGIyYWQsCisJMHhiMmFkLCAweGIyYWQsIDB4YjJhZiwgMHhiMmNkLCAweGIyYWQsIDB4MDgwYywgMHgxNTE1LCAweDAwZDYsCisJMHgyYzY4LCAweDA4MGMsIDB4ODVjNywgMHgwMWEwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsCisJMHgyMDA5LCAweGJiOGUsIDB4MjEwYywgMHg2MTM2LCAweDIwMDksIDB4YmI4ZiwgMHgyMTBjLCAweDYxM2EsCisJMHg2MDBiLCAweGZmZmYsIDB4NjkxOCwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHgwODBjLCAweDZjOGQsCisJMHgyZDYwLCAweDA4MGMsIDB4ODYxZCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg4NjFkLCAweDAwMDUsCisJMHgwMGU2LCAweDYwMTgsIDB4MjA3MCwgMHg3MDAwLCAweGQwZWMsIDB4MDBlZSwgMHgwMDA1LCAweDYwMTAsCisJMHhhMDhjLCAweGYwMDAsIDB4MDkwNCwgMHhiMzFiLCAweGEwODAsIDB4MDAxMywgMHgyMDBjLCAweGQxZWMsCisJMHgwNWQwLCAweDIwMDEsIDB4YjU3MiwgMHgyMDA0LCAweGQwZWMsIDB4MDVhOCwgMHg2MDAzLCAweDAwMDIsCisJMHg2MDIwLCAweGMwZTUsIDB4NjAyMiwgMHhkMWFjLCAweDAxODAsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHg1MzAxLCAweDAwZmUsIDB4MDE1MCwgMHgyMDAxLCAweGI3YjgsIDB4MjAwNCwgMHg2MDNlLCAweDIwMDksCisJMHhiNTcyLCAweDIxMGMsIDB4ZDFmNCwgMHgxMWU4LCAweDAwODAsIDB4MjAwOSwgMHhiNTcyLCAweDIxMGMsCisJMHhkMWY0LCAweDAxMjgsIDB4NjAyMCwgMHhjMGU0LCAweDYwMjIsIDB4YTAwNiwgMHgwMGEwLCAweDIwMDEsCisJMHhiN2I4LCAweDIwMGMsIDB4ODEwMywgMHhhMTAwLCAweDYwM2UsIDB4NjAxOCwgMHhhMDg4LCAweDAwMmIsCisJMHgyMTA0LCAweGEwMDUsIDB4MDExOCwgMHhhMDg4LCAweDAwMDMsIDB4MGNkMCwgMHgyYzBhLCAweDYwMGYsCisJMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwgMHgwMGU2LCAweDYxNTAsCisJMHhhMmYwLCAweDAwMmIsIDB4MmUwNCwgMHgyMDYwLCAweDhjZmYsIDB4MDE4MCwgMHg4NGZmLCAweDExMTgsCisJMHg2MDUwLCAweGExMDYsIDB4MTEzOCwgMHg2MDBjLCAweDIwNzIsIDB4MDgwYywgMHg2YWVmLCAweDA4MGMsCisJMHg4NjFkLCAweDAwMTAsIDB4YWNmMCwgMHgwMDAzLCAweDJlNjQsIDB4MGM3MCwgMHgwMGVlLCAweDAwY2UsCisJMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHg2MDE4LCAweGEwZTgsIDB4MDAyYiwgMHgyZDA0LCAweGEwMDUsCisJMHgwMTQwLCAweGFjMDYsIDB4MDEyMCwgMHgyZDA0LCAweGEwZTgsIDB4MDAwMywgMHgwY2I4LCAweDYwMGMsCisJMHgyMDZhLCAweDAwZGUsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLCAweGI1MjgsCisJMHgyMjA0LCAweGEwODQsIDB4MDBmZiwgMHgyMDE5LCAweGJiOGUsIDB4MjMzNCwgMHhhNjM2LCAweDExZDgsCisJMHg4MzE4LCAweDIzMzQsIDB4MjIwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTYzNiwgMHgxMWEwLCAweDIwMTEsCisJMHhiYjkwLCAweDYwMTgsIDB4YTA5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweDkwZGEsCisJMHgxMTUwLCAweDIwMTEsIDB4YmI5NCwgMHg2MDE4LCAweGEwOTgsIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDkwZGEsIDB4MTEwMCwgMHgwMTVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweGI1MDAsIDB4MDgwYywgMHg0YmM2LCAweDA4MGMsIDB4MmFiOCwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGU2LCAweDYwMTgsIDB4MjA3MCwgMHg3MDAwLCAweGQwZmMsIDB4MDEwOCwgMHgwMDExLCAweDAwZWUsCisJMHgwMDA1LCAweDY4NTAsIDB4YzBlNSwgMHg2ODUyLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwNzYsCisJMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDAwMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDI5LCAweGI3ZTksIDB4MjUyYywgMHgyMDIxLCAweGI3ZWYsIDB4MjQyNCwgMHgyMDYxLCAweGJkMDAsCisJMHgyMDcxLCAweGI1MDAsIDB4NzY0OCwgMHg3MDY4LCAweGE2MDYsIDB4MDU3OCwgMHg2NzFjLCAweGE3ODYsCisJMHgwMDAxLCAweDAxMTgsIDB4YTc4NiwgMHgwMDA4LCAweDE1MDAsIDB4MjUwMCwgMHhhYzA2LCAweDAxZTgsCisJMHgyNDAwLCAweGFjMDYsIDB4MDFkMCwgMHgwODBjLCAweGIxMTAsIDB4MDFiOCwgMHgwODBjLCAweGIxMjAsCisJMHgxMWEwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MDAxNiwgMHgwODBjLCAweDE5NGQsCisJMHgwMDFlLCAweDA4MGMsIDB4OWU0NywgMHgxMTEwLCAweDA4MGMsIDB4MmNjMiwgMHgwODBjLCAweDllNTgsCisJMHgxMTEwLCAweDA4MGMsIDB4OGMxOSwgMHgwODBjLCAweDllMWQsIDB4YWNlMCwgMHgwMDE4LCAweDIwMDEsCisJMHhiNTE3LCAweDIwMDQsIDB4YWMwMiwgMHgxMjA4LCAweDA4NTgsIDB4MDEyZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsCisJMHgwMDA2LCAweDAwZTYsIDB4MDAxNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiNTQwLCAweGQ1YTQsCisJMHgwMTE4LCAweDcwMzQsIDB4ODAwMCwgMHg3MDM2LCAweGQ1YjQsIDB4MDExOCwgMHg3MDMwLCAweDgwMDAsCisJMHg3MDMyLCAweGQ1YWMsIDB4MDE3OCwgMHgyNTAwLCAweGEwODQsIDB4MDAwNywgMHhhMDhlLCAweDAwMDMsCisJMHgwMTQ4LCAweGEwOGUsIDB4MDAwNCwgMHgwMTMwLCAweGEwOGUsIDB4MDAwNSwgMHgwMTE4LCAweDIwNzEsCisJMHhiNTRhLCAweDA0YzksIDB4MDAxZSwgMHgwMGVlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsCisJMHgwMDA2LCAweDAwZTYsIDB4MDAxNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiNTQwLCAweGQ1YTQsCisJMHgwMTE4LCAweDcwMzQsIDB4ODAwMCwgMHg3MDM2LCAweGQ1YjQsIDB4MDExOCwgMHg3MDMwLCAweDgwMDAsCisJMHg3MDMyLCAweGQ1YWMsIDB4MDE3OCwgMHgyNTAwLCAweGEwODQsIDB4MDAwNywgMHhhMDhlLCAweDAwMDMsCisJMHgwMTQ4LCAweGEwOGUsIDB4MDAwNCwgMHgwMTMwLCAweGEwOGUsIDB4MDAwNSwgMHgwMTE4LCAweDIwNzEsCisJMHhiNTRhLCAweDAwODksIDB4MDAxZSwgMHgwMGVlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsCisJMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YjU0MiwgMHgwMDIxLCAweDAwZWUsCisJMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgyZTA0LCAweDgwMDAsIDB4MjA3MiwgMHgxMjIwLCAweDhlNzAsCisJMHgyZTA0LCAweDgwMDAsIDB4MjA3MiwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhiNTQwLCAweDBjOTksCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGI1NDQsIDB4MGM2OSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhiNTQwLCAweDcwNDQsCisJMHg4MDAwLCAweDcwNDYsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDAxLCAweDAwMDIsCisJMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwgMHgwMTAwLCAweDAyMDAsCisJMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMCwgMHgyNDQwCit9OworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIyMDB0cF9sZW5ndGgwMSA9IDB4YTQ2ZjsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfbGVuZ3RoMDEgPSAweGE0NmY7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzAwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDk4OGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzAwLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBRTG9naWMgSVNQMjMwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzdG9waCBIZWxsd2lnLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworc3RhdGljIGNoYXIgcWxhX2RyaXZlcl9uYW1lW10gPSAicWxhMjMwMCI7CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIzMDBpcHhfdmVyc2lvbltdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjMwMGlweF92ZXJzaW9uX3N0cltdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMwMGlweF9hZGRyMDE7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMzAwaXB4X2NvZGUwMVtdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMwMGlweF9sZW5ndGgwMTsKKworc3RhdGljIHN0cnVjdCBxbGFfZndfaW5mbyBxbGFfZndfdGJsW10gPSB7CisJeworCQkuYWRkcmVzc2luZwk9IEZXX0lORk9fQUREUl9OT1JNQUwsCisJCS5md2NvZGUJCT0gJmZ3MjMwMGlweF9jb2RlMDFbMF0sCisJCS5md2xlbgkJPSAmZncyMzAwaXB4X2xlbmd0aDAxLAorCQkuZndzdGFydAk9ICZmdzIzMDBpcHhfYWRkcjAxLAorCX0sCisJeyBGV19JTkZPX0FERFJfTk9NT1JFLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBxbGFfYm9hcmRfaW5mbyBxbGFfYm9hcmRfdGJsW10gPSB7CisJeworCQkuZHJ2X25hbWUJPSBxbGFfZHJpdmVyX25hbWUsCisJCS5pc3BfbmFtZQk9ICJJU1AyMzAwIiwKKwkJLmZ3X2luZm8JPSBxbGFfZndfdGJsLAorCX0sCisJeworCQkuZHJ2X25hbWUJPSBxbGFfZHJpdmVyX25hbWUsCisJCS5pc3BfbmFtZQk9ICJJU1AyMzEyIiwKKwkJLmZ3X2luZm8JPSBxbGFfZndfdGJsLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcWxhMjMwMF9wY2lfdGJsW10gPSB7CisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUUxPR0lDLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMDAsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJnFsYV9ib2FyZF90YmxbMF0sCisJfSwKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMxMiwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmcWxhX2JvYXJkX3RibFsxXSwKKwl9LAorCXswLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWxhMjMwMF9wY2lfdGJsKTsKKworc3RhdGljIGludCBfX2RldmluaXQKK3FsYTIzMDBfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHFsYTJ4MDBfcHJvYmVfb25lKHBkZXYsCisJICAgIChzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gKilpZC0+ZHJpdmVyX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3FsYTIzMDBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlxbGEyeDAwX3JlbW92ZV9vbmUocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBxbGEyMzAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInFsYTIzMDAiLAorCS5pZF90YWJsZQk9IHFsYTIzMDBfcGNpX3RibCwKKwkucHJvYmUJCT0gcWxhMjMwMF9wcm9iZV9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChxbGEyMzAwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3FsYTIzMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnFsYTIzMDBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcWxhMjMwMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxbGEyMzAwX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChxbGEyMzAwX2luaXQpOworbW9kdWxlX2V4aXQocWxhMjMwMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUUxvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBJU1AyM3h4IEZDLVNDU0kgSG9zdCBCdXMgQWRhcHRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFFMQTJYWFhfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMDBfZncuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMwMF9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjA2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMDBfZncuYwpAQCAtMCwwICsxLDc1OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMyBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZpcm13YXJlIFZlcnNpb24gMy4wMy4wOCAoMTA6MDIgTm92IDEyLCAyMDA0KQorICovCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzAwaXB4X3ZlcnNpb24gPSAzKjEwMjQrMzsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfdmVyc2lvbiA9IDMqMTAyNCszOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgY2hhciBmdzIzMDBpcHhfdmVyc2lvbl9zdHJbXSA9IHszLCAzLCA4fTsKKyNlbHNlCit1bnNpZ25lZCBjaGFyIGZpcm13YXJlX3ZlcnNpb25bXSA9IHszLCAzLCA4fTsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKKyNkZWZpbmUgZncyMzAwaXB4X1ZFUlNJT05fU1RSSU5HICIzLjAzLjA4IgorI2Vsc2UKKyNkZWZpbmUgRldfVkVSU0lPTl9TVFJJTkcgIjMuMDMuMDgiCisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMDBpcHhfYWRkcjAxID0gMHgwODAwIDsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgwODAwIDsKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMwMGlweF9jb2RlMDFbXSA9IHsgCisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlMDFbXSA9IHsgCisjZW5kaWYKKwkweDA0NzAsIDB4MDAwMCwgMHgwMDAwLCAweGViNTcsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDMsIDB4MDAwOCwKKwkweDAxMzcsIDB4MjA0MywgMHg0ZjUwLCAweDU5NTIsIDB4NDk0NywgMHg0ODU0LCAweDIwMzIsIDB4MzAzMCwKKwkweDMxMjAsIDB4NTE0YywgMHg0ZjQ3LCAweDQ5NDMsIDB4MjA0MywgMHg0ZjUyLCAweDUwNGYsIDB4NTI0MSwKKwkweDU0NDksIDB4NGY0ZSwgMHgyMDQ5LCAweDUzNTAsIDB4MzIzMywgMHgzMDMwLCAweDIwNDYsIDB4Njk3MiwKKwkweDZkNzcsIDB4NjE3MiwgMHg2NTIwLCAweDIwNTYsIDB4NjU3MiwgMHg3MzY5LCAweDZmNmUsIDB4MjAzMCwKKwkweDMzMmUsIDB4MzAzMywgMHgyZTMwLCAweDM4MjAsIDB4MjAyMCwgMHgyMDIwLCAweDI0MDAsIDB4MjBhOSwKKwkweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyMjAwLCAweDIwYTksIDB4MDAwZiwKKwkweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjQwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwKKwkweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDI2MDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwKKwkweDQwMGYsIDB4MjA5MSwgMHgyODAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwKKwkweDIwOTEsIDB4MmEwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwKKwkweDJjMDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MmUwMCwKKwkweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDIwMDAsIDB4MjAwMSwKKwkweDAwMDAsIDB4MjBjMSwgMHgwMDA0LCAweDIwYzksIDB4MWJmZiwgMHgyMDU5LCAweDAwMDAsIDB4MmI3OCwKKwkweDc4ODMsIDB4MDAwNCwgMHgyMDg5LCAweDJkODgsIDB4MjA1MSwgMHgxODAwLCAweDJhNzAsIDB4MjBlMSwKKwkweDAwMDEsIDB4MjBlOSwgMHgwMDAxLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDBlNTEsIDB4MjAyOSwKKwkweDRkMDAsIDB4MjAzMSwgMHhmZmZmLCAweDIwMzksIDB4NGNkMCwgMHgyMDIxLCAweDAyMDAsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgwMDAwLCAweDIwYTksIDB4MDgwMCwgMHg5MDBlLCAweDQxMDQsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgxMDAwLCAweDkwMGUsIDB4MjAwMSwgMHgwY2MwLCAweDkwODQsIDB4MGZmZiwKKwkweDIwYTgsIDB4NDEwNCwgMHgyMDAxLCAweDAwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxMjAsIDB4MjFhOCwKKwkweDQxMDQsIDB4ODAwMSwgMHgxZGUwLCAweDc1NmUsIDB4NzY3MiwgMHg3NzZhLCAweDc0NzYsIDB4NzQ3YSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxYWNhLCAweDI0NzIsIDB4MDBlZSwgMHgyMGExLCAweDFjZDAsIDB4NzE3MCwKKwkweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4OTE4YywgMHgwMDBmLCAweDIwMDEsIDB4MDAwMSwKKwkweDkxMTIsIDB4OTAwZSwgMHgyMWE4LCAweDQxMDQsIDB4ODIxMSwgMHgxZGUwLCAweDcxNzAsIDB4MzQwMCwKKwkweDgwMDEsIDB4OTEwMiwgMHgwMTIwLCAweDAyMTgsIDB4MjBhOCwgMHg5MDBlLCAweDQxMDQsIDB4MjAwOSwKKwkweDE4MDAsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDkxOGMsIDB4MDAxZiwKKwkweDIwMDEsIDB4MDAwMSwgMHg5MTEyLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDA4MDAsIDB4OTAwZSwKKwkweDIwYTksIDB4MDgwMCwgMHg0MTA0LCAweDgyMTEsIDB4MWRkOCwgMHgwODBjLCAweDBmMTcsIDB4MDgwYywKKwkweDYwYmIsIDB4MDgwYywgMHhhZWQ5LCAweDA4MGMsIDB4MTBjZSwgMHgwODBjLCAweDEyZWQsIDB4MDgwYywKKwkweDFiZTIsIDB4MDgwYywgMHgwZDY5LCAweDA4MGMsIDB4MTA1MywgMHgwODBjLCAweDM0ODQsIDB4MDgwYywKKwkweDc3MzgsIDB4MDgwYywgMHg2YTMwLCAweDA4MGMsIDB4ODdiMywgMHgwODBjLCAweDg0ZTcsIDB4MDgwYywKKwkweDI0YjYsIDB4MDgwYywgMHg5MDU3LCAweDA4MGMsIDB4N2UwMywgMHgwODBjLCAweDIyZWYsIDB4MDgwYywKKwkweDI0MjMsIDB4MDgwYywgMHgyNGFiLCAweDIwOTEsIDB4MzAwOSwgMHg3ODgzLCAweDAwMDAsIDB4MTAwNCwKKwkweDA5MWYsIDB4Nzg4MCwgMHg5MDg2LCAweDAwMDIsIDB4MTE5MCwgMHg3ODgzLCAweDQwMDAsIDB4NzgzNywKKwkweDQwMDAsIDB4NzgzMywgMHgwMDEwLCAweDBlMDQsIDB4MDkxMywgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwKKwkweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAwMywgMHgwMDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MDAwLCAweDkwOGUsIDB4MDAwMywKKwkweDExNzgsIDB4MDgwYywgMHg0YzQ0LCAweDA4MGMsIDB4MzRhYiwgMHgwODBjLCAweDc3YTksIDB4MDgwYywKKwkweDZmNjEsIDB4MDgwYywgMHg4ODk2LCAweDA4MGMsIDB4ODUxMCwgMHgwODBjLCAweDJjZjIsIDB4MGM1OCwKKwkweDAwMGIsIDB4MGM3OCwgMHgwOTQ0LCAweDA5NDUsIDB4MGFlNywgMHgwOTQyLCAweDBiYWUsIDB4MGQ2OCwKKwkweDBkNjgsIDB4MGQ2OCwgMHgwODBjLCAweDBkZDUsIDB4MDAwNSwgMHgwMTI2LCAweDAwZjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDEsIDB4MTkwNCwgMHgwYWJhLCAweDA4MGMsIDB4NTc2YywKKwkweDExMzAsIDB4MDAyNiwgMHgyMDExLCAweDAwODAsIDB4MDgwYywgMHgwZWRmLCAweDAwMmUsIDB4MDgwYywKKwkweDc0M2UsIDB4MDE1MCwgMHgwODBjLCAweDc0NjEsIDB4MTVhMCwgMHgyMDc5LCAweDAxMDAsIDB4NzgyOCwKKwkweDkwODUsIDB4MTgwMCwgMHg3ODJhLCAweDA0NjgsIDB4MDgwYywgMHg3MzZhLCAweDcwMDAsIDB4OTA4NiwKKwkweDAwMDEsIDB4MTkwNCwgMHgwYWJhLCAweDcwOTgsIDB4OTA4NiwgMHgwMDI4LCAweDE5MDQsIDB4MGFiYSwKKwkweDA4MGMsIDB4ODRkMCwgMHgwODBjLCAweDg0YzIsIDB4MjAwMSwgMHgwMTYxLCAweDIwMDMsIDB4MDAwMSwKKwkweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweGZmZmYsIDB4N2EyOCwgMHg5Mjk1LCAweDVlMmYsIDB4N2EyYSwKKwkweDIwMTEsIDB4NzJjZSwgMHgwODBjLCAweDg1YjAsIDB4MjAxMSwgMHg3MmMxLCAweDA4MGMsIDB4ODY4YSwKKwkweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4MjAxMSwgMHg4MDMwLCAweDkwMWUsIDB4NzM5NiwKKwkweDA0ZDAsIDB4MDgwYywgMHg1N2MzLCAweDIwNzksIDB4MDEwMCwgMHg3ODQ0LCAweDkwMDUsIDB4MTkwNCwKKwkweDBhYmEsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwgMHgyMDExLCAweDcyY2UsIDB4MDgwYywKKwkweDg1YjAsIDB4MjAxMSwgMHg3MmMxLCAweDA4MGMsIDB4ODY4YSwgMHgyMDAxLCAweDAyNjUsIDB4MjAwMSwKKwkweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDc4NDAsIDB4OTA4NCwgMHhmZmZiLCAweDc4NDIsIDB4MjAwMSwKKwkweDE5YTUsIDB4MjAwNCwgMHg5MDA1LCAweDExNDAsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDgwYywKKwkweDYwNjMsIDB4MDBjZSwgMHgwODA0LCAweDBhYmEsIDB4NzgwZiwgMHgwMDZiLCAweDdhMjgsIDB4MDgwYywKKwkweDc0NDYsIDB4MDExOCwgMHg5Mjk1LCAweDVlMmYsIDB4MDAxMCwgMHg5Mjk1LCAweDQwMmYsIDB4N2EyYSwKKwkweDIwMTEsIDB4ODAxMCwgMHg3M2Q4LCAweDIwMDEsIDB4MTlhNiwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDJiOTcsIDB4MDgwYywgMHg0YjdmLCAweDcyNDgsIDB4YzI4NCwgMHg3MjRhLCAweDIwMDEsIDB4MTgwYywKKwkweDIwMGMsIDB4YzFhYywgMHhjMWNjLCAweDIxMDIsIDB4MDgwYywgMHhhNjEzLCAweDIwMTEsIDB4MDAwNCwKKwkweDA4MGMsIDB4Y2M5NiwgMHgwODBjLCAweDY4YmMsIDB4MDgwYywgMHg3NDNlLCAweDExMjAsIDB4MDgwYywKKwkweDJiZGIsIDB4MDJlMCwgMHgwNDAwLCAweDA4MGMsIDB4NjA2YSwgMHgwMTQwLCAweDcwOTcsIDB4MDAwMSwKKwkweDcwZDMsIDB4MDAwMCwgMHgwODBjLCAweDU5OTAsIDB4MDgwNCwgMHgwYWJhLCAweDA4MGMsIDB4NTc1ZCwKKwkweGQwOTQsIDB4MDE4OCwgMHgyMDExLCAweDE4MGMsIDB4MjIwNCwgMHhjMGNkLCAweDIwMTIsIDB4MDgwYywKKwkweDU3NjEsIDB4ZDBkNCwgMHgxMTE4LCAweDA4MGMsIDB4MmJkYiwgMHgxMjcwLCAweDIwMTEsIDB4MTgwYywKKwkweDIyMDQsIDB4YzBiYywgMHgwMGE4LCAweDA4MGMsIDB4NTc2MSwgMHhkMGQ0LCAweDFkYjgsIDB4MjAxMSwKKwkweDE4MGMsIDB4MjIwNCwgMHhjMGJkLCAweDAwNjAsIDB4MjAxMSwgMHgxODBjLCAweDIyMDQsIDB4YzBiZCwKKwkweDIwMTIsIDB4MDgwYywgMHg2YTA0LCAweDExMjgsIDB4ZDBhNCwgMHgwMTE4LCAweDIyMDQsIDB4YzBmZCwKKwkweDIwMTIsIDB4MDgwYywgMHg2OWNhLCAweDAxMjAsIDB4N2EwYywgMHhjMmI0LCAweDdhMGUsIDB4MDBhOCwKKwkweDcwN2YsIDB4MDAwMCwgMHgwODBjLCAweDc0M2UsIDB4MTEzMCwgMHg3MGIwLCAweDkwMDUsIDB4MTE2OCwKKwkweDA4MGMsIDB4ZDBkOSwgMHgwMDUwLCAweDA4MGMsIDB4ZDBkOSwgMHg3MGRjLCAweGQwOWMsIDB4MTEyOCwKKwkweDcwYjAsIDB4OTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NjA0MCwgMHg3MGU3LCAweDAwMDAsIDB4NzBlMywKKwkweDAwMDAsIDB4NzBhNywgMHgwMDAwLCAweDA4MGMsIDB4MmJlMywgMHgwMjI4LCAweDIwMTEsIDB4MDEwMSwKKwkweDIyMDQsIDB4YzBjNCwgMHgyMDEyLCAweDcyZGMsIDB4MDgwYywgMHg3NDNlLCAweDExNzgsIDB4OTAxNiwKKwkweDAwMTYsIDB4MDgwYywgMHgyOTk0LCAweDIwMTksIDB4MTk2YywgMHgyMTFhLCAweDAwMWUsIDB4NzA1ZiwKKwkweGZmZmYsIDB4NzA2MywgMHgwMGVmLCAweDcwODMsIDB4MDAwMCwgMHgwMDIwLCAweDIwMTksIDB4MTk2YywKKwkweDIwMWIsIDB4MDAwMCwgMHgyMDc5LCAweDE4NDcsIDB4NzgwNCwgMHhkMGFjLCAweDAxMDgsIDB4YzI5NSwKKwkweDcyZGUsIDB4MDgwYywgMHg3NDNlLCAweDAxMTgsIDB4OTI5NiwgMHgwMDA0LCAweDA1NDgsIDB4MjAxMSwKKwkweDAwMDEsIDB4MDgwYywgMHhjYzk2LCAweDcwYWIsIDB4MDAwMCwgMHg3MGFmLCAweGZmZmYsIDB4NzAwMywKKwkweDAwMDIsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjcsIDB4MDAwMywgMHg3ODI4LCAweDkwODUsIDB4MDAwMywKKwkweDc4MmEsIDB4MDBmZSwgMHgwODBjLCAweDJmZjUsIDB4MjAxMSwgMHgwMDA1LCAweDA4MGMsIDB4YTcyMiwKKwkweDA4MGMsIDB4OTc2MywgMHgwODBjLCAweDc0M2UsIDB4MDE0OCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDAwMTYsIDB4MDgwYywgMHgyOTk0LCAweDYxZTIsIDB4MDAxZSwgMHgwMGNlLCAweDAxMmUsIDB4MDQyMCwKKwkweDcwYWIsIDB4MDAwMCwgMHg3MGFmLCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDAwZjYsIDB4MjA3OSwKKwkweDAxMDAsIDB4NzgyNywgMHgwMDAzLCAweDc4MjgsIDB4OTA4NSwgMHgwMDAzLCAweDc4MmEsIDB4MDBmZSwKKwkweDIwMTEsIDB4MDAwNSwgMHgwODBjLCAweGE3MjIsIDB4MDgwYywgMHg5NzYzLCAweDA4MGMsIDB4NzQzZSwKKwkweDAxNDgsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDAxNiwgMHgwODBjLCAweDI5OTQsIDB4NjFlMiwKKwkweDAwMWUsIDB4MDBjZSwgMHgwMGZlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwYjYsIDB4MDgwYywKKwkweDc0M2UsIDB4MTExOCwgMHgyMGE5LCAweDA4MDAsIDB4MDAxMCwgMHgyMGE5LCAweDA3ODIsIDB4MDgwYywKKwkweDc0M2UsIDB4MTExMCwgMHg5MDBlLCAweDAwMTAsIDB4MjAwOSwgMHgwMDdlLCAweDg2ZmYsIDB4MDEzOCwKKwkweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDExMCwgMHhiODAwLCAweGQwYmMsIDB4MDkwYywKKwkweDMzMWEsIDB4ODEwOCwgMHgxZjA0LCAweDBhY2UsIDB4NzA3ZiwgMHgwMDAwLCAweDcwODAsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzA4MiwgMHg3MGIzLCAweDAwMDAsIDB4MDBiZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAyLCAweDE5MDQsIDB4MGJhYiwKKwkweDcwYWMsIDB4OTA4NiwgMHhmZmZmLCAweDAxMzAsIDB4MDgwYywgMHgyZmY1LCAweDA4MGMsIDB4OTc2MywKKwkweDA4MDQsIDB4MGJhYiwgMHg3MGRjLCAweGQwYWMsIDB4MTExMCwgMHhkMDljLCAweDA1NTgsIDB4ZDA4NCwKKwkweDA1NDgsIDB4MDAwNiwgMHgyMDAxLCAweDAxMDMsIDB4MjAwMywgMHgwMDJiLCAweDAwMGUsIDB4ZDA4YywKKwkweDA1MDgsIDB4MDgwYywgMHgzMzdkLCAweDExZDAsIDB4NzBlMCwgMHg5MDg2LCAweGZmZmYsIDB4MDFiMCwKKwkweDA4MGMsIDB4MzE4YSwgMHgwODBjLCAweDk3NjMsIDB4NzBkYywgMHhkMDk0LCAweDE5MDQsIDB4MGJhYiwKKwkweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweGQzODgsIDB4MDExMCwgMHgyMDExLCAweDAwMDMsIDB4OTAxZSwKKwkweDA4MGMsIDB4MzFjNCwgMHgwODBjLCAweDk3NjMsIDB4MDgwNCwgMHgwYmFiLCAweDcwZTQsIDB4OTAwNSwKKwkweDE5MDQsIDB4MGJhYiwgMHg3MGE4LCAweDkwMDUsIDB4MTkwNCwgMHgwYmFiLCAweDcwZGMsIDB4ZDBhNCwKKwkweDAxMTgsIDB4ZDBiNCwgMHgwOTA0LCAweDBiYWIsIDB4MDgwYywgMHg2OWNhLCAweDE5MDQsIDB4MGJhYiwKKwkweDA4MGMsIDB4NmExZCwgMHgxOTA0LCAweDBiYWIsIDB4MDgwYywgMHg2YTA0LCAweDAxYzAsIDB4MDE1NiwKKwkweDAwYzYsIDB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4MDAxNiwgMHgwODBjLCAweDY2OTksIDB4MTExOCwKKwkweGI4MDAsIDB4ZDBlYywgMHgxMTM4LCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDBiNDQsIDB4MDBjZSwKKwkweDAxNWUsIDB4MDAyOCwgMHgwMDFlLCAweDAwY2UsIDB4MDE1ZSwgMHgwODA0LCAweDBiYWIsIDB4MDAwNiwKKwkweDIwMDEsIDB4MDEwMywgMHgyMDAzLCAweDAwMmIsIDB4MDAwZSwgMHgyMDExLCAweDE5YjIsIDB4MDgwYywKKwkweDBmODcsIDB4MjAxMSwgMHgxOWNjLCAweDA4MGMsIDB4MGY4NywgMHg3MDMwLCAweGMwOGMsIDB4NzAzMiwKKwkweDcwMDMsIDB4MDAwMywgMHg3MGFmLCAweGZmZmYsIDB4MDgwYywgMHg1NzZjLCAweDExMzAsIDB4MDAyNiwKKwkweDIwMTEsIDB4MDA0MCwgMHgwODBjLCAweDBlZGYsIDB4MDAyZSwgMHg5MDA2LCAweDA4MGMsIDB4MjgyOCwKKwkweDA4MGMsIDB4MzM3ZCwgMHgwMTE4LCAweDA4MGMsIDB4NGQxYywgMHgwMDUwLCAweDAwMzYsIDB4MDA0NiwKKwkweDIwMTksIDB4ZmZmZiwgMHgyMDIxLCAweDAwMDYsIDB4MDgwYywgMHg0ZDM2LCAweDAwNGUsIDB4MDAzZSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDA4MGMsIDB4NzQ2MSwgMHgwMTUwLCAweDA4MGMsIDB4NzQzZSwKKwkweDc4MjgsIDB4MDExOCwgMHg5MDg0LCAweGUxZmYsIDB4MDAxMCwgMHg5MDg0LCAweGZmZGYsIDB4NzgyYSwKKwkweDAwZmUsIDB4MjAwMSwgMHgxOWU3LCAweDIwMDQsIDB4OTA4NiwgMHgwMDA1LCAweDExMjAsIDB4MjAxMSwKKwkweDAwMDAsIDB4MDgwYywgMHhhNzIyLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweGE3MmMsIDB4MDgwYywKKwkweDk3NjMsIDB4MDgwYywgMHg5ODkxLCAweDAxMmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA0NiwKKwkweDAwZjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDc5MDQsIDB4OTE4YywKKwkweGZmZmQsIDB4NzkwNiwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg2MDI5LCAweDc5NDAsIDB4OTE4YywKKwkweDAwMTAsIDB4Nzk0MiwgMHg3OTI0LCAweGQxYjQsIDB4MDExMCwgMHg3ODI3LCAweDAwNDAsIDB4ZDE5YywKKwkweDAxMTAsIDB4NzgyNywgMHgwMDA4LCAweDAwMDYsIDB4MDAzNiwgMHgwMTU2LCAweDc5NTQsIDB4ZDFhYywKKwkweDE5MDQsIDB4MGMzYiwgMHgyMDAxLCAweDE5YTYsIDB4MjAwNCwgMHg5MDA1LCAweDE1MTgsIDB4MDgwYywKKwkweDJjNWUsIDB4MTE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyYmM2LCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MmJhOSwgMHgwMGI4LCAweDA4MGMsIDB4MmM2NiwgMHgxMTM4LCAweDkwMDYsIDB4MDgwYywKKwkweDJiYzYsIDB4OTAwNiwgMHgwODBjLCAweDJiYTksIDB4MDA2OCwgMHgwODBjLCAweDJjNmUsIDB4MWQ1MCwKKwkweDIwMDEsIDB4MTk5NywgMHgyMDA0LCAweGQwZmMsIDB4MDEwOCwgMHgwMDIwLCAweDA4MGMsIDB4MjljMCwKKwkweDA4MDQsIDB4MGQxYSwgMHgwODBjLCAweDc0NGYsIDB4MDE0OCwgMHgwODBjLCAweDc0NjEsIDB4MTExOCwKKwkweDA4MGMsIDB4NzczMywgMHgwMDUwLCAweDA4MGMsIDB4NzQ0NiwgMHgwZGQwLCAweDA4MGMsIDB4NzcyZSwKKwkweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDczNmEsIDB4MDA1OCwgMHgwODBjLCAweDc0M2UsIDB4MDE0MCwKKwkweDIwMDksIDB4MDBmOCwgMHgwODBjLCAweDYwMjksIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwKKwkweDIwYTksIDB4MDljNCwgMHg3ODIwLCAweGQwOWMsIDB4MTEzOCwgMHgwODBjLCAweDc0M2UsIDB4MDEzOCwKKwkweDc4MjQsIDB4ZDBhYywgMHgxOTA0LCAweDBkMWYsIDB4MWYwNCwgMHgwYzFhLCAweDAwNzAsIDB4NzgyNCwKKwkweDA4MGMsIDB4NzQ1OCwgMHgwMTE4LCAweGQwYWMsIDB4MTkwNCwgMHgwZDFmLCAweDkwODQsIDB4MTgwMCwKKwkweDBkOTgsIDB4NzAwMywgMHgwMDAxLCAweDA4MDQsIDB4MGQxZiwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDI4MjgsIDB4MDgwNCwgMHgwZDMyLCAweDIwMDEsIDB4MTlhNiwgMHgyMDA0LCAweDkwMDUsIDB4MTUxOCwKKwkweDA4MGMsIDB4MmM1ZSwgMHgxMTQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJiYzYsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyYmE5LCAweDAwYjgsIDB4MDgwYywgMHgyYzY2LCAweDExMzgsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmJjNiwgMHg5MDA2LCAweDA4MGMsIDB4MmJhOSwgMHgwMDY4LCAweDA4MGMsIDB4MmM2ZSwKKwkweDFkNTAsIDB4MjAwMSwgMHgxOTk3LCAweDIwMDQsIDB4ZDBmYywgMHgwMTA4LCAweDAwMjAsIDB4MDgwYywKKwkweDI5YzAsIDB4MDgwNCwgMHgwZDFhLCAweDc4NTAsIDB4OTA4NSwgMHgwMDQwLCAweDc4NTIsIDB4NzkzOCwKKwkweDc4NTAsIDB4OTA4NCwgMHhmYmNmLCAweDc4NTIsIDB4MDgwYywgMHgyYzc2LCAweDkwODUsIDB4MjAwMCwKKwkweDc4NTIsIDB4NzkzYSwgMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgwYzc0LCAweDA4MGMsIDB4ODY2YSwKKwkweDFmMDQsIDB4MGM3NCwgMHg3ODUwLCAweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGRmYmYsIDB4Nzg1MiwKKwkweDc5M2EsIDB4MDgwYywgMHg3NDRmLCAweDAxNDgsIDB4MDgwYywgMHg3NDYxLCAweDExMTgsIDB4MDgwYywKKwkweDc3MzMsIDB4MDA1MCwgMHgwODBjLCAweDc0NDYsIDB4MGRkMCwgMHgwODBjLCAweDc3MmUsIDB4MDgwYywKKwkweDc3MjQsIDB4MDgwYywgMHg3MzZhLCAweDAwMjAsIDB4MjAwOSwgMHgwMGY4LCAweDA4MGMsIDB4NjAyOSwKKwkweDIwYTksIDB4MDAyOCwgMHhhMDAxLCAweDFmMDQsIDB4MGM5YSwgMHg3ODUwLCAweDkwODUsIDB4MTQwMCwKKwkweDc4NTIsIDB4MDgwYywgMHg3NDNlLCAweDAxMjAsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwKKwkweDIwMjEsIDB4ZTY3OCwgMHgyMDE5LCAweGVhNjAsIDB4MGQwYywgMHg4NjZhLCAweDc4MjAsIDB4ZDA5YywKKwkweDE1ODAsIDB4MDgwYywgMHg3NDNlLCAweDA5MDQsIDB4MGNmZiwgMHg3ODI0LCAweGQwYWMsIDB4MTkwNCwKKwkweDBkMWYsIDB4MDgwYywgMHg3NDYxLCAweDE1MjgsIDB4MDA0NiwgMHgyMDIxLCAweDAzMjAsIDB4ODQyMSwKKwkweDFkZjAsIDB4MDA0ZSwgMHg3ODI3LCAweDE4MDAsIDB4MDgwYywgMHgyYzc2LCAweDc4MjQsIDB4OTA4NCwKKwkweDE4MDAsIDB4MTE2MCwgMHg5NDg0LCAweDBmZmYsIDB4MTEzOCwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwKKwkweGQwZmMsIDB4MDExMCwgMHgwODBjLCAweDBkNDUsIDB4ODQyMSwgMHgxMTU4LCAweDFkMDQsIDB4MGNkYSwKKwkweDA4MGMsIDB4ODY2YSwgMHgwODBjLCAweDc3MmUsIDB4MDgwYywgMHg3NzI0LCAweDcwMDMsIDB4MDAwMSwKKwkweDA0ZjAsIDB4ODMxOSwgMHgxOTQ4LCAweDFkMDQsIDB4MGNlNywgMHgwODBjLCAweDg2NmEsIDB4MjAwOSwKKwkweDE5OWEsIDB4MjEwNCwgMHg5MDA1LCAweDAxMTgsIDB4ODAwMSwgMHgyMDBhLCAweDExNzgsIDB4MjAwYiwKKwkweDAwMGEsIDB4NzgyNywgMHgwMDQ4LCAweDIwYTksIDB4MDAwMiwgMHgwODBjLCAweDJjNTcsIDB4NzkyNCwKKwkweDA4MGMsIDB4MmM3NiwgMHhkMTljLCAweDAxMTAsIDB4MDgwYywgMHgyYjk3LCAweDAwZDgsIDB4MDgwYywKKwkweDc0NGYsIDB4MTE0MCwgMHg5NGEyLCAweDAzZTgsIDB4MTEyOCwgMHgwODBjLCAweDc0MTYsIDB4NzAwMywKKwkweDAwMDEsIDB4MDBhOCwgMHg3ODI3LCAweDE4MDAsIDB4MDgwYywgMHgyYzc2LCAweDc4MjQsIDB4MDgwYywKKwkweDc0NTgsIDB4MDExMCwgMHhkMGFjLCAweDExNTgsIDB4OTA4NCwgMHgxODAwLCAweDA5NTAsIDB4NzAwMywKKwkweDAwMDEsIDB4MDAyOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyODI4LCAweDAwNzgsIDB4MjAwOSwKKwkweDE4MGMsIDB4MjEwYywgMHhkMTljLCAweDExMjAsIDB4NzkwNCwgMHg5MThkLCAweDAwMDIsIDB4NzkwNiwKKwkweDc4MjcsIDB4MDA0OCwgMHg3ODI4LCAweDkwODUsIDB4MDAyOCwgMHg3ODJhLCAweDc4NTAsIDB4OTA4NSwKKwkweDA0MDAsIDB4Nzg1MiwgMHgyMDAxLCAweDE5YTYsIDB4MjAwMywgMHgwMDAwLCAweDkwMDYsIDB4NzhmMiwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMDBlLCAweDA4MGMsIDB4NTc2YywgMHgxMTEwLCAweDA4MGMsIDB4MGU2MiwKKwkweDAxMmUsIDB4MDBmZSwgMHgwMDRlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDA2OSwKKwkweDBkMGMsIDB4ODY2YSwgMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwKKwkweDAwNGUsIDB4MDAzZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTg5ZSwKKwkweDcwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDExMTAsIDB4MDgwYywgMHgzNGFiLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwMDUsIDB4MmE3MCwgMHgyMDYxLCAweDE5YWEsIDB4MjA2MywgMHgwMDAzLCAweDYwMDcsIDB4MDAwMywKKwkweDYwMGIsIDB4MDAwOCwgMHg2MDBmLCAweDAxMzcsIDB4MjAwMSwgMHgxOTdiLCAweDkwMGUsIDB4MjEwMiwKKwkweDcxOTYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4MiwgMHgwMDAyLCAweDAyMTgsIDB4NzA1ZiwKKwkweGZmZmYsIDB4MDAwOCwgMHg3MTVlLCAweDcwNjcsIDB4ZmZmZiwgMHg3MTdlLCAweDcxODIsIDB4MDgwYywKKwkweGQwZDksIDB4MjA2MSwgMHgxOTZiLCAweDYwMDMsIDB4MDkwOSwgMHg2MTA2LCAweDYwMGIsIDB4ODgwMCwKKwkweDYwMGYsIDB4MDIwMCwgMHg2MDEzLCAweDAwZmYsIDB4NjAxNywgMHgwMDFmLCAweDYxMWEsIDB4NjAxZiwKKwkweDA3ZDAsIDB4MjA2MSwgMHgxOTczLCAweDYwMDMsIDB4ODAwMCwgMHg2MTA2LCAweDYxMGEsIDB4NjAwZiwKKwkweDAyMDAsIDB4NjAxMywgMHgwMGZmLCAweDYxMTYsIDB4NjAxYiwgMHgwMDAxLCAweDYxMWUsIDB4MjA2MSwKKwkweDE5ODgsIDB4NjAwMywgMHg1MTRjLCAweDYwMDcsIDB4NGY0NywgMHg2MDBiLCAweDQ5NDMsIDB4NjAwZiwKKwkweDIwMjAsIDB4MjAwMSwgMHgxODJjLCAweDIxMDIsIDB4MDAwNSwgMHg5MDE2LCAweDA4MGMsIDB4NjY5OSwKKwkweDExNzgsIDB4YjgwNCwgMHg5MGM0LCAweDAwZmYsIDB4OThjNiwgMHgwMDA2LCAweDAxMjgsIDB4OTBjNCwKKwkweGZmMDAsIDB4OThjNiwgMHgwNjAwLCAweDExMjAsIDB4OTE4NiwgMHgwMDgwLCAweDAxMDgsIDB4ODIxMCwKKwkweDgxMDgsIDB4OTE4NiwgMHgwODAwLCAweDFkNTAsIDB4MjIwOCwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzksIDB4MDAwMCwgMHgwMDBlLCAweDAwZjYsIDB4MDAxMCwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwKKwkweDBkZDcsIDB4MDAwNiwgMHgwMDE2LCAweDIwMDEsIDB4ODAwMiwgMHgwMDA2LCAweDIwNzksIDB4MDAwMCwKKwkweDAwMGUsIDB4Nzg4MiwgMHg3ODM2LCAweDAwMWUsIDB4Nzk4ZSwgMHgwMDBlLCAweDc4OGEsIDB4MDAwZSwKKwkweDc4ODYsIDB4MzkwMCwgMHg3ODlhLCAweDc4MzMsIDB4MDAxMiwgMHgyMDkxLCAweDUwMDAsIDB4MDE1NiwKKwkweDAwZDYsIDB4MDAzNiwgMHgwMDI2LCAweDIwNzksIDB4MDMwMCwgMHgyMDY5LCAweDFhYTQsIDB4N2EwOCwKKwkweDIyNmEsIDB4MjA2OSwgMHgxYWE1LCAweDdhMTgsIDB4MjI2YSwgMHg4ZDY4LCAweDdhMWMsIDB4MjI2YSwKKwkweDc4MmMsIDB4MjAxOSwgMHgxYWIyLCAweDIwMWEsIDB4MjAxOSwgMHgxYWI1LCAweDkwMTYsIDB4NzgwOCwKKwkweGQwOWMsIDB4MDE2OCwgMHg3ODIwLCAweDIwMWEsIDB4ODIxMCwgMHg4MzE4LCAweDkzODYsIDB4MWFjYSwKKwkweDAxMDgsIDB4MGNhOCwgMHg3ODA4LCAweGQwOWMsIDB4MDExMCwgMHgyMDExLCAweGRlYWQsIDB4MjAxOSwKKwkweDFhYjMsIDB4NzgyYywgMHgyMDFhLCAweDgzMTgsIDB4MjIxYSwgMHg3ODAzLCAweDAwMDAsIDB4MjA2OSwKKwkweDFhODQsIDB4OTAxZSwgMHgyMGE5LCAweDAwMjAsIDB4N2IyNiwgMHg3YTI4LCAweDIyNmEsIDB4OGQ2OCwKKwkweDgzMTgsIDB4MWYwNCwgMHgwZTI0LCAweDAwMmUsIDB4MDAzZSwgMHgwMGRlLCAweDAxNWUsIDB4MjA3OSwKKwkweDE4MDAsIDB4NzgwMywgMHgwMDA1LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwKKwkweGQwODQsIDB4MDE4MCwgMHgyMDAxLCAweDFhMTgsIDB4MjAwNCwgMHg5MDA1LCAweDAxMjgsIDB4MjAwMSwKKwkweDAwOGIsIDB4MjAwNCwgMHhkMGZjLCAweDBkZDgsIDB4MjAwMSwgMHgwMDhhLCAweDIwMDMsIDB4MDAwMiwKKwkweDIwMDMsIDB4MTAwMSwgMHgwODBjLCAweDU3NmMsIDB4MTExMCwgMHgwODBjLCAweDBlOTksIDB4MGNkMCwKKwkweDAwMDUsIDB4OTE4YywgMHgwM2ZmLCAweDIwMDEsIDB4MDAwMywgMHgyMDA0LCAweDkwODQsIDB4MDYwMCwKKwkweDExMTgsIDB4OTE4ZCwgMHgyODAwLCAweDAwMTAsIDB4OTE4ZCwgMHgyMDAwLCAweDIwMDEsIDB4MDE3ZiwKKwkweDIxMDIsIDB4MDAwNSwgMHgwMGY2LCAweDAwMDYsIDB4MjA3OSwgMHgxODI3LCAweDJmMDQsIDB4ODAwMCwKKwkweDIwN2EsIDB4MDgwYywgMHgyYzZlLCAweDExNTAsIDB4MDAwNiwgMHgyMDAxLCAweDE5OTcsIDB4MjAwNCwKKwkweGQwZmMsIDB4MDAwZSwgMHgxMTE4LCAweDkwODIsIDB4NzUzMCwgMHgwMDEwLCAweDkwODIsIDB4MDAwZiwKKwkweDAyNTgsIDB4OTAwNiwgMHgyMDdhLCAweDIwNzksIDB4MTgyYSwgMHgyZjA0LCAweDkwODQsIDB4MDAwMSwKKwkweDkwODYsIDB4MDAwMSwgMHgyMDdhLCAweDAwOTAsIDB4MjA3OSwgMHgxODJhLCAweDJmN2MsIDB4OGZmZiwKKwkweDExMzgsIDB4MDAyNiwgMHgyMDExLCAweDAwODAsIDB4MDgwYywgMHgwZWRmLCAweDAwMmUsIDB4MDAzMCwKKwkweDAwMjYsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4MGVkZiwgMHgwMDJlLCAweDAwMGUsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDAyNiwgMHgwMTI2LCAweDIwMTEsIDB4MDA4MCwgMHgwODBjLCAweDBlZGYsIDB4MjBhOSwKKwkweDBmZmYsIDB4MDgwYywgMHgwZjAwLCAweDIwMTEsIDB4MDA0MCwgMHgwNGM5LCAweDIwYTksIDB4MGZmZiwKKwkweDA4MGMsIDB4MGYwMCwgMHgwYzgwLCAweDcwMzgsIDB4ZDBiNCwgMHgxMTI4LCAweDAwMjYsIDB4MjAxMSwKKwkweDAwNDAsIDB4MDQ2OSwgMHgwMDJlLCAweDAwMDUsIDB4NzAzOCwgMHhkMGI0LCAweDExMjgsIDB4MDAyNiwKKwkweDIwMTEsIDB4MDA4MCwgMHgwNDIxLCAweDAwMmUsIDB4MDAwNSwgMHgwMDI2LCAweDcwZWYsIDB4MDAwMCwKKwkweDA0NTksIDB4MTE0OCwgMHgwODBjLCAweDJjNmUsIDB4MTExOCwgMHgyMDExLCAweDg0ODQsIDB4MDA1OCwKKwkweDIwMTEsIDB4ODI4MiwgMHgwMDQwLCAweDA4MGMsIDB4MmM2ZSwgMHgxMTE4LCAweDIwMTEsIDB4Y2RjNSwKKwkweDAwMTAsIDB4MjAxMSwgMHhjYWMyLCAweDAwZTksIDB4MDAyZSwgMHgwMDA1LCAweGQwYjQsIDB4MDEzMCwKKwkweDAwMDYsIDB4M2IwMCwgMHg5MDg0LCAweGZmM2YsIDB4MjBkOCwgMHgwMDBlLCAweDAwMDUsIDB4MDAxNiwKKwkweDNiMDgsIDB4M2EwMCwgMHg5MTA0LCAweDkxOGQsIDB4MDBjMCwgMHgyMWQ4LCAweDkwODQsIDB4ZmYzZiwKKwkweDkyMDUsIDB4MjBkMCwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgxODNhLCAweDIwMDQsIDB4ZDBkYywKKwkweDAwMDUsIDB4OWU4NiwgMHgxODAwLCAweDE5MGMsIDB4MGRkNSwgMHg3MGU4LCAweGQwZTQsIDB4MDEwOCwKKwkweGMyZTUsIDB4NzJlYSwgMHhkMGU0LCAweDExMTgsIDB4OTI5NCwgMHgwMGMwLCAweDBjMDEsIDB4MDAwNSwKKwkweDFkMDQsIDB4MGYwMCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHgwZjAwLCAweDAwMDUsIDB4ODkwZSwKKwkweDgxMGUsIDB4ODEwZiwgMHg5MTk0LCAweDAwM2YsIDB4OTE4YywgMHhmZmMwLCAweDAwMDUsIDB4MDAwNiwKKwkweDIyMDAsIDB4OTE0ZCwgMHg4OTRmLCAweDg5NGQsIDB4ODk0ZCwgMHgwMDBlLCAweDAwMDUsIDB4MDFkNiwKKwkweDAxNDYsIDB4MDAzNiwgMHgwMDk2LCAweDIwNjEsIDB4MTg4ZCwgMHg2MDBiLCAweDAwMDAsIDB4NjAwZiwKKwkweDAwMDAsIDB4NjAwMywgMHgwMDAwLCAweDYwMDcsIDB4MDAwMCwgMHgyMDA5LCAweGZmYzAsIDB4MjEwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHhhYWFhLCAweDIwMGYsIDB4MjAxOSwgMHg1NTU1LCAweDkwMTYsIDB4MjA0OSwKKwkweDBiZmYsIDB4YWIwMiwgMHhhMDAxLCAweGEwMDEsIDB4YTgwMCwgMHg5MzA2LCAweDExMzgsIDB4MjEwNSwKKwkweDkzMDYsIDB4MDEyMCwgMHg4MjEwLCAweDk5YzgsIDB4MDQwMCwgMHgwYzk4LCAweDAwMGUsIDB4MjAwZiwKKwkweDIwMDEsIDB4MTg5ZCwgMHg5MjhhLCAweDAwMGUsIDB4MTYzOCwgMHg5MjhhLCAweDAwMDYsIDB4MjAxMSwKKwkweDAwMDYsIDB4MTIxMCwgMHgyMDExLCAweDAwMDAsIDB4MjIwMiwgMHg5MDA2LCAweDIwMDgsIDB4ODJmZiwKKwkweDAxYjAsIDB4ODIwMCwgMHg2MDBhLCAweDYwMGYsIDB4ZmZmZiwgMHg2MDAzLCAweDAwMDIsIDB4NjAwNywKKwkweDAwMDAsIDB4MDAyNiwgMHgyMDE5LCAweDAwMTAsIDB4OTI4MCwgMHgwMDAxLCAweDIwZTgsIDB4MjFhMCwKKwkweDIxYTgsIDB4NDEwNCwgMHg4MzE5LCAweDFkZTAsIDB4ODIxMSwgMHgxZGEwLCAweDAwMmUsIDB4MDA5ZSwKKwkweDAwM2UsIDB4MDE0ZSwgMHgwMWRlLCAweDAwMDUsIDB4MjAxMSwgMHgwMDBlLCAweDA4ZTgsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDA5NiwgMHgzMzQ4LCAweDA4MGMsIDB4MGYwNywgMHgyMTAwLCAweDkzMDAsIDB4MjA5OCwKKwkweDIyZTAsIDB4MDA5ZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAzNiwgMHgzNTE4LCAweDIwYTksIDB4MDAwMSwKKwkweDQwMDIsIDB4ODAwNywgMHg0MDA0LCAweDgzMTksIDB4MWRkOCwgMHgwMDNlLCAweDAwMDUsIDB4MjBlOSwKKwkweDAwMDEsIDB4NzFiOCwgMHg4MWZmLCAweDExYzAsIDB4OTAwNiwgMHgyMDA5LCAweDAyMDAsIDB4MjBhOSwKKwkweDAwMDIsIDB4OTI5OCwgMHgwMDE4LCAweDIzYTAsIDB4NDAwMSwgMHgyMDA5LCAweDA3MDAsIDB4MjBhOSwKKwkweDAwMDIsIDB4OTI5OCwgMHgwMDA4LCAweDIzYTAsIDB4NDAwMSwgMHg3MDdjLCAweDgwMDcsIDB4NzE4MCwKKwkweDgxMGYsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDEsIDB4OTI5OCwgMHgwMDBjLCAweDIzYTAsIDB4OTAwZSwKKwkweDA4MGMsIDB4MGRiNSwgMHgyMDAxLCAweDAwMDAsIDB4ODEwZiwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMSwKKwkweDAwMDUsIDB4ODlmZiwgMHgwMTQwLCAweGE4MDQsIDB4YTgwNywgMHgwMDAwLCAweDAwMDYsIDB4MDgwYywKKwkweDEwMzEsIDB4MDA5ZSwgMHgwY2IwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywKKwkweDEwYWEsIDB4MDkwYywgMHgwZGQ1LCAweDAwZWUsIDB4MDAwNSwgMHgwMDg2LCAweDAwZTYsIDB4MDAwNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM5LCAweDIwNzEsIDB4MTgwMCwKKwkweDczYzAsIDB4NzAyYywgMHg5MDE2LCAweDkwNDUsIDB4MDE1OCwgMHg4MjEwLCAweDk5MDYsIDB4MDkwYywKKwkweDBkZDUsIDB4MjMwMCwgMHg5MjAyLCAweDAxMjAsIDB4MWEwYywgMHgwZGQ1LCAweGEwMDAsIDB4MGM5OCwKKwkweDAxMmUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDhlLCAweDAwMDUsIDB4MDA4NiwKKwkweDAwZTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5MTAsIDB4NzAxMCwKKwkweDkwMDUsIDB4MDE0MCwgMHg3MDE4LCAweDkwNDUsIDB4MDEyOCwgMHg5OTA2LCAweDA5MGMsIDB4MGRkNSwKKwkweGEwMDAsIDB4MGNjOCwgMHgwMTJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDhlLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGMwLCAweDgwMDEsIDB4MDI3MCwKKwkweDcwYzIsIDB4NzAyYywgMHgyMDQ4LCAweDkwODUsIDB4MDAwMSwgMHhhODAwLCAweDcwMmUsIDB4YTgwMywKKwkweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwNGUsIDB4MGNkOCwKKwkweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcwYzAsIDB4OTBjYSwKKwkweDAwMjAsIDB4MDI2OCwgMHg4MDAxLCAweDcwYzIsIDB4NzAyYywgMHgyMDQ4LCAweGE4MDAsIDB4NzAyZSwKKwkweGE4MDMsIDB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTA0ZSwKKwkweDBjZDgsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDE2LCAweDg5MGUsIDB4ODEwZSwKKwkweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweGE4NjIsIDB4OTE4NCwgMHhmZmMwLCAweGE4NWUsIDB4MDAxZSwKKwkweDAwMjAsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzAyYywKKwkweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwKKwkweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDI2LCAweDIwMDksIDB4MDAwMCwKKwkweDIwNDksIDB4MDQwMCwgMHgyOTAwLCAweDcwMmUsIDB4ODk0MCwgMHgyODAwLCAweGE4MDIsIDB4YTk1ZSwKKwkweGE4NjMsIDB4MDAwMSwgMHg4NDIwLCAweDk4ODYsIDB4MDQ0MCwgMHgwMTIwLCAweDI4NDgsIDB4OTE4OCwKKwkweDAwNDAsIDB4MGM5MCwgMHgyMDcxLCAweDE4OGQsIDB4NzAwMCwgMHg5MDA1LCAweDExYTAsIDB4MjAwMSwKKwkweDA1MzQsIDB4YTgwMiwgMHgyMDQ4LCAweDIwMDksIDB4NGQwMCwgMHg4OTQwLCAweDI4MDAsIDB4YTgwMiwKKwkweGE5NWUsIDB4YTg2MywgMHgwMDAxLCAweDg0MjAsIDB4OTg4NiwgMHgwODAwLCAweDAxMjAsIDB4Mjg0OCwKKwkweDkxODgsIDB4MDA0MCwgMHgwYzkwLCAweDIwNzEsIDB4MTg4ZCwgMHg3MTA0LCAweDcyMDAsIDB4ODJmZiwKKwkweDAxZDAsIDB4NzMwOCwgMHg4MzE4LCAweDgzMWYsIDB4ODMxYiwgMHg4MzFiLCAweDczMTIsIDB4ODMxOSwKKwkweDIwMDEsIDB4MDgwMCwgMHhhODAyLCAweDIwNDgsIDB4ODkwMCwgMHhhODAyLCAweDIwNDAsIDB4YTk1ZSwKKwkweGFhNjIsIDB4ODQyMCwgMHgyMzAwLCAweDk5MDYsIDB4MDEzMCwgMHgyODQ4LCAweDkxODgsIDB4MDA0MCwKKwkweDkyOTEsIDB4MDAwMCwgMHgwYzg4LCAweGE4MDMsIDB4MDAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzRiZSwKKwkweDc0YzIsIDB4MDAwNSwgMHgwMGU2LCAweDAwMTYsIDB4OTk4NCwgMHhmYzAwLCAweDAxZTgsIDB4OTA4YywKKwkweGY4MDAsIDB4MTE2OCwgMHg5OTgyLCAweDA0MDAsIDB4MDJiOCwgMHg5OTgyLCAweDA0NDAsIDB4MDI3OCwKKwkweDk5ODIsIDB4MDUzNCwgMHgwMjg4LCAweDk5ODIsIDB4MDgwMCwgMHgxMjcwLCAweDAwNDAsIDB4OTk4MiwKKwkweDA4MDAsIDB4MDI1MCwgMHgyMDcxLCAweDE4OGQsIDB4NzAxMCwgMHg5OTAyLCAweDEyMjgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAxZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwZTYsIDB4MjA3MSwKKwkweDFhMTcsIDB4NzAwNywgMHgwMDAwLCAweDkwMDYsIDB4NzAxZSwgMHg3MDIyLCAweDcwMDIsIDB4MjA3MSwKKwkweDAwMDAsIDB4NzAxMCwgMHg5MDg1LCAweDgwNDQsIDB4NzAxMiwgMHgyMDcxLCAweDAwODAsIDB4OTAwNiwKKwkweDIwYTksIDB4MDA0MCwgMHg3MDIyLCAweDFmMDQsIDB4MTBlMiwgMHg3MDJiLCAweDAwMjAsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBlNiwgMHhhMDZmLCAweDAwMDAsIDB4MjA3MSwKKwkweDFhMTcsIDB4NzAxYywgMHg5MDg4LCAweDFhMjEsIDB4MjgwYSwgMHg4MDAwLCAweDkwODQsIDB4MDAzZiwKKwkweDcwMWUsIDB4NzEyMCwgMHg5MTA2LCAweDA5MGMsIDB4MGRkNSwgMHg3MDA0LCAweDkwMDUsIDB4MTEyOCwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMDgwLCAweDAwYTksIDB4MDBmZSwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwZTYsIDB4MjA3MSwgMHgxYTE3LCAweDcwMDQsIDB4OTAwNSwKKwkweDExMjgsIDB4MDBmNiwgMHgyMDc5LCAweDAwODAsIDB4MDAyMSwgMHgwMGZlLCAweDAwZWUsIDB4MDEyZSwKKwkweDAwMDUsIDB4NzAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MTExMCwgMHg3MDA3LCAweDAwMDYsIDB4NzAwMCwKKwkweDAwMDIsIDB4MTEyYiwgMHgxMmFlLCAweDExMjksIDB4MTEyOSwgMHgxMmEyLCAweDEyYTIsIDB4MTJhMiwKKwkweDEyYTIsIDB4MDgwYywgMHgwZGQ1LCAweDcwMWMsIDB4NzEyMCwgMHg5MTA2LCAweDExNDgsIDB4NzkyYywKKwkweDkxODQsIDB4MDAwMSwgMHgxMTIwLCAweGQxZmMsIDB4MTExMCwgMHg3MDA3LCAweDAwMDAsIDB4MDAwNSwKKwkweDAwOTYsIDB4OTE4MCwgMHgxYTIxLCAweDIwMDQsIDB4NzAwYSwgMHgyMDQ4LCAweDgxMDgsIDB4OTE4YywKKwkweDAwM2YsIDB4NzEyMiwgMHg3ODJiLCAweDAwMjYsIDB4YTg4YywgMHg3ODAyLCAweGE4OTAsIDB4NzgwNiwKKwkweGE4OTQsIDB4NzgwYSwgMHhhODk4LCAweDc4MGUsIDB4YTg3OCwgMHg3MDBlLCAweGE4NzAsIDB4NzAxNiwKKwkweGE4NzQsIDB4NzAxYSwgMHhhODY4LCAweDAwOWUsIDB4ZDA4NCwgMHgwMTIwLCAweDcwMDcsIDB4MDAwMSwKKwkweDAwMjksIDB4MDAwNSwgMHg3MDA3LCAweDAwMDIsIDB4MDBiMSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweDkxODIsIDB4MDA0MCwgMHgxMjEwLCAweDIxMTAsIDB4OTAwNiwKKwkweDcwMGUsIDB4NzIxMiwgMHg4MjAzLCAweDc4MTIsIDB4NzgyYiwgMHgwMDIwLCAweDc4MmIsIDB4MDA0MSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDcwMTQsIDB4MjBlMCwgMHg3MDE4LCAweDIwOTgsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDA4OCwKKwkweDc4MmIsIDB4MDAyNiwgMHg3MTBjLCAweDIwMTEsIDB4MDA0MCwgMHg5MTgyLCAweDAwNDAsIDB4MTIxMCwKKwkweDIxMTAsIDB4OTAwNiwgMHg3MDBlLCAweDIyYTgsIDB4NDAwNiwgMHg4MjAzLCAweDc4MTIsIDB4NzgyYiwKKwkweDAwMjAsIDB4MzMwMCwgMHg3MDFhLCAweDc4MmIsIDB4MDAwMSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDIwMDksIDB4MWExNywgMHgyMTA0LCAweGMwOTUsIDB4MjAwYSwKKwkweDA4MGMsIDB4MTEwOCwgMHgwMDA1LCAweDAwMTYsIDB4MDBlNiwgMHgyMDcxLCAweDFhMTcsIDB4MDBmNiwKKwkweDIwNzksIDB4MDA4MCwgMHg3OTJjLCAweGQxYmMsIDB4MTkwYywgMHgwZGNlLCAweDc4MmIsIDB4MDAwMiwKKwkweGQxZmMsIDB4MDEyMCwgMHg5MThjLCAweDA3MDAsIDB4NzAwNCwgMHgwMDIzLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgxMTE5LCAweDExYzEsIDB4MTFmNSwgMHgxMmNkLCAweDBkZDUsIDB4MTJlOCwKKwkweDBkZDUsIDB4OTE4YywgMHgwNzAwLCAweDE1NTAsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4NzAxNCwKKwkweDIwZTgsIDB4NzAxOCwgMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAwODgsIDB4NzgyYiwKKwkweDAwNDAsIDB4NzAxMCwgMHgyMGE4LCAweDQwMDUsIDB4MzQwMCwgMHg3MDFhLCAweDAxNWUsIDB4MDE0ZSwKKwkweDAxM2UsIDB4NzAwYywgMHg5MDA1LCAweDA1NzgsIDB4NzgwMCwgMHg3ODAyLCAweDc4MDQsIDB4NzgwNiwKKwkweDA4MGMsIDB4MTE1ZSwgMHgwMDA1LCAweDcwMDgsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NmYsIDB4MDEwMCwKKwkweDAwOWUsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTExOSwgMHgwMDA1LCAweDcwMDgsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTg2ZiwgMHgwMjAwLCAweDAwOWUsIDB4MGNhMCwgMHg5MThjLCAweDA3MDAsIDB4MTE1MCwKKwkweDcwMGMsIDB4OTAwNSwgMHgwMTgwLCAweDc4MDAsIDB4NzgwMiwgMHg3ODA0LCAweDc4MDYsIDB4MDgwYywKKwkweDExNzMsIDB4MDAwNSwgMHg3MDA4LCAweDAwOTYsIDB4MjA0OCwgMHhhODZmLCAweDAyMDAsIDB4MDA5ZSwKKwkweDcwMDcsIDB4MDAwMCwgMHgwMDgwLCAweDAwOTYsIDB4NzAwOCwgMHgyMDQ4LCAweDc4MDAsIDB4YTg4ZSwKKwkweDc4MDQsIDB4YTg5MiwgMHg3ODA4LCAweGE4OTYsIDB4NzgwYywgMHhhODlhLCAweGE4NmYsIDB4MDEwMCwKKwkweDAwOWUsIDB4NzAwNywgMHgwMDAwLCAweDAwOTYsIDB4MDBkNiwgMHg3MDA4LCAweDIwNDgsIDB4MjAwMSwKKwkweDE4YjksIDB4MjAwNCwgMHg5OTA2LCAweDExMjgsIDB4YTg5YywgMHgwODBmLCAweDAwZGUsIDB4MDA5ZSwKKwkweDAwYTAsIDB4MDBkZSwgMHgwMDllLCAweDAwOTYsIDB4MDBkNiwgMHg3MDA4LCAweDIwNDgsIDB4MDA4MSwKKwkweDAxNTAsIDB4YTg5YywgMHgwMDg2LCAweDI5NDAsIDB4MDgwZiwgMHgwMDhlLCAweDAwZGUsIDB4MDA5ZSwKKwkweDA4MGMsIDB4MTEwOCwgMHgwMDA1LCAweDAwZGUsIDB4MDA5ZSwgMHgwODBjLCAweDExMDgsIDB4MDAwNSwKKwkweGE4YTgsIDB4ZDA4YywgMHgwMDA1LCAweDAwOTYsIDB4YTBhMCwgMHg5MDRkLCAweDA5MGMsIDB4MGRkNSwKKwkweGEwNmMsIDB4OTA4ZSwgMHgwMTAwLCAweDAxMzAsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwKKwkweGE4OTcsIDB4NDAwMiwgMHgwODBjLCAweDZkMGIsIDB4YTA5ZiwgMHgwMDAwLCAweGEwYTMsIDB4MDAwMCwKKwkweDI4NDgsIDB4MDgwYywgMHgxMDMxLCAweDAwOWUsIDB4MDAwNSwgMHgwMGE2LCAweGEwYTAsIDB4OTA0ZCwKKwkweDA5MGMsIDB4MGRkNSwgMHhhMDZjLCAweDkwOGUsIDB4MDEwMCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwMSwKKwkweGE4ODMsIDB4MDAwMCwgMHgwMGMwLCAweGE4MGMsIDB4MjA1MCwgMHhiMDA0LCAweDkwMDUsIDB4MDE5OCwKKwkweGE4MGUsIDB4MjA1MCwgMHg4MDA2LCAweDgwMDYsIDB4ODAwNywgMHg5MDhjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDAyLCAweGEwNzYsIDB4YTE3MiwgMHhiMDAwLCAweGEwN2EsIDB4MjgxMCwKKwkweDA4MGMsIDB4MTBlOSwgMHgwMGU4LCAweGE5N2MsIDB4YTg5NCwgMHgwMDE2LCAweDAwMDYsIDB4MDgwYywKKwkweDZkMGIsIDB4MDAwZSwgMHgwMDFlLCAweGQxZmMsIDB4MTEzOCwgMHhkMWY0LCAweDAxMjgsIDB4MDBjNiwKKwkweDIwNjAsIDB4MDgwYywgMHhhZjQzLCAweDAwY2UsIDB4NzAwOCwgMHgyMDQ4LCAweGE4OWYsIDB4MDAwMCwKKwkweGE4YTMsIDB4MDAwMCwgMHgwODBjLCAweDEwMzEsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTEwOCwKKwkweDAwYWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3ODJiLCAweDEwMDEsIDB4NzAwNywKKwkweDAwMDUsIDB4NzAwMCwgMHhjMDk0LCAweDcwMDIsIDB4MDEyZSwgMHgwMDA1LCAweDAwOTYsIDB4MjAwMSwKKwkweDE5MmUsIDB4MjA0YywgMHhhODdjLCAweDc4MTIsIDB4YTg4YywgMHg3ODAyLCAweGE4OTAsIDB4NzgwNiwKKwkweGE4OTQsIDB4NzgwYSwgMHhhODk4LCAweDc4MGUsIDB4NzgyYiwgMHgwMDIwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzgyYiwgMHgwMDQxLCAweDcwMDcsIDB4MDAwMywgMHg3MDAwLCAweGMwODQsIDB4NzAwMiwKKwkweDI5MDAsIDB4NzAwYSwgMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAwODgsIDB4NzgyYiwgMHgwMDQwLCAweDAwOTYsIDB4MjAwMSwgMHgxOTJlLCAweDIwNGMsIDB4YWE3YywKKwkweDAwOWUsIDB4MDgwYywgMHg4YWQwLCAweDIwMDksIDB4MTg4YywgMHgyMTA0LCAweDkwODQsIDB4ZmZmYywKKwkweDIwMGEsIDB4MDgwYywgMHg4OTM5LCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDExMTksIDB4MDAwNSwKKwkweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDExMTksIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwKKwkweDIwNzksIDB4MDMwMCwgMHgyMDcxLCAweDFhNjEsIDB4NzAwMywgMHgwMDAwLCAweDc4YmYsIDB4MDBmNiwKKwkweDc4MWIsIDB4NDgwMCwgMHgwMGMxLCAweDc4MDMsIDB4MDAwMywgMHg3ODBmLCAweDAwMDAsIDB4MjBhOSwKKwkweDAzZDAsIDB4MjA2MSwgMHhlYmE4LCAweDJjMGQsIDB4NzkxMiwgMHhlMTA0LCAweDljZTAsIDB4MDAwMiwKKwkweDc5MTYsIDB4MWYwNCwgMHgxMzAzLCAweDc4MDcsIDB4MDAwNywgMHg3ODAzLCAweDAwMDAsIDB4NzgwMywKKwkweDAwMDEsIDB4MDEyZSwgMHgwMDA1LCAweDAwYzYsIDB4NzgwMywgMHgwMDAwLCAweDc4MDgsIDB4ZDA5YywKKwkweDAxMjAsIDB4NzgyMCwgMHgwODBjLCAweDEzNjIsIDB4MGNjOCwgMHgyMDAxLCAweDFhNjIsIDB4MjAwMywKKwkweDAwMDAsIDB4NzhhYiwgMHgwMDA0LCAweDc4YWMsIDB4ZDBhYywgMHgxZGU4LCAweDc4YWIsIDB4MDAwMiwKKwkweDc4MDcsIDB4MDAwNywgMHg3ODI3LCAweDAwMzAsIDB4NzgyYiwgMHgwNDAwLCAweDc4MjcsIDB4MDAzMSwKKwkweDc4MmIsIDB4MWE4NCwgMHg3ODFmLCAweGZmMDAsIDB4NzgxYiwgMHhiNzAwLCAweDIwMDEsIDB4MDIwMCwKKwkweDIwMDQsIDB4ZDBkYywgMHgwMTEwLCAweDc4MWYsIDB4MDMwMywgMHgyMDYxLCAweDFhODQsIDB4NjAyZiwKKwkweDFjZDAsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OTA4MiwgMHgxY2QwLCAweDYwMzIsIDB4NjAzYiwKKwkweDIwY2UsIDB4MjAwMSwgMHgzMzg0LCAweGQwZmMsIDB4MTkwYywgMHgwZGQ1LCAweDIwMDEsIDB4MDAwMywKKwkweDIwMDQsIDB4ZDBkNCwgMHgxMTE4LCAweDc4M2YsIDB4MzM4NCwgMHgwMDIwLCAweDkwODQsIDB4YzAwMCwKKwkweDc4M2YsIDB4YjM4NCwgMHg2MDRmLCAweDE5M2MsIDB4MjAwMSwgMHgxOTI3LCAweDIwMDQsIDB4NjA0MiwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDg2LCAweDAwMGQsIDB4MTFkMCwgMHg3ODA4LCAweGQwOWMsIDB4MDFiOCwKKwkweDc4MjAsIDB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4Y2M3NCwgMHgwMTgwLCAweDIyNjAsIDB4NjAwMCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTU4LCAweDAwMTYsIDB4NjEyMCwgMHg5MTg2LCAweDAwMDksIDB4MDEwOCwKKwkweDAwMjAsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4YWZiZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDc5MDgsIDB4OTE4NCwgMHgwMDcwLCAweDE5MGMsIDB4MGRjZSwKKwkweGQxOWMsIDB4MDE1OCwgMHg3ODIwLCAweDkwOGMsIDB4ZjAwMCwgMHgxNWU4LCAweDkwOGEsIDB4MDAyNCwKKwkweDFhMGMsIDB4MGRkNSwgMHgwMDIzLCAweDAxMmUsIDB4MDAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MTNiYiwKKwkweDEzYmIsIDB4MTNkMiwgMHgxM2Q3LCAweDEzZGIsIDB4MTNlMCwgMHgxNDA4LCAweDE0MGMsIDB4MTQxYSwKKwkweDE0MWUsIDB4MTNiYiwgMHgxNGViLCAweDE0ZWYsIDB4MTU2MSwgMHgxNTY4LCAweDEzYmIsIDB4MTU2OSwKKwkweDE1NmEsIDB4MTU3NSwgMHgxNTdjLCAweDEzYmIsIDB4MTNiYiwgMHgxM2JiLCAweDEzYmIsIDB4MTNiYiwKKwkweDEzYmIsIDB4MTNiYiwgMHgxM2UyLCAweDEzYmIsIDB4MTNiYiwgMHgxM2JiLCAweDEzYmIsIDB4MTNiYiwKKwkweDEzYmIsIDB4MTNiZiwgMHgxM2JkLCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDBkY2UsIDB4MDgwYywKKwkweDE1ODcsIDB4MjAwOSwgMHgxYTdhLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweDA4MGMsIDB4N2VkNywKKwkweDA4MGMsIDB4MWFlYywgMHgwMDA1LCAweDIwMDksIDB4MDA0OCwgMHgyMDYwLCAweDA4MGMsIDB4YWZiZSwKKwkweDAxMmUsIDB4MDAwNSwgMHg3MDA0LCAweGMwODUsIDB4YzBiNSwgMHg3MDA2LCAweDAwMDUsIDB4NzAwNCwKKwkweGMwODUsIDB4NzAwNiwgMHgwMDA1LCAweDA4MGMsIDB4MTU4NywgMHgwODBjLCAweDE2ZTcsIDB4MDAwNSwKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDE1ODcsIDB4MjA2MCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4M2IsIDB4ZmZmZiwgMHgwMDllLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGFmYmUsIDB4MjAwMSwKKwkweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDksIDB4MDNlOCwgMHg4MTA5LCAweDAxNjAsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4MjAwMSwgMHgwMjE4LCAweDIwMDQsIDB4ZDBlYywKKwkweDExMTAsIDB4MDgwYywgMHgxNThjLCAweDIwMDEsIDB4MDMwNywgMHgyMDAzLCAweDgwMDAsIDB4MDAwNSwKKwkweDcwMDQsIDB4YzA5NSwgMHg3MDA2LCAweDAwMDUsIDB4MDgwYywgMHgxNTg3LCAweDIwNjAsIDB4NjAxNCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODNiLCAweGZmZmYsIDB4MDA5ZSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywKKwkweGFmYmUsIDB4MDAwNSwgMHgwODBjLCAweDE1ODcsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4MTU4NywKKwkweDA4MGMsIDB4MTRkNiwgMHg3ODI3LCAweDAwMTgsIDB4NzlhYywgMHhkMWRjLCAweDA5MDQsIDB4MTQ4NywKKwkweDc4MjcsIDB4MDAxNSwgMHg3ODI4LCAweDc4MmIsIDB4MDAwMCwgMHg5MDY1LCAweDAxNDAsIDB4MjAwMSwKKwkweDAyMGQsIDB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwODA0LCAweDE0OGQsIDB4NzAwNCwKKwkweDkwMDUsIDB4MDFjOCwgMHgxMTg4LCAweDc4YWIsIDB4MDAwNCwgMHg3ODI3LCAweDAwMTgsIDB4NzgyYiwKKwkweDAwMDAsIDB4ZDFiYywgMHgwOTBjLCAweDBkZDUsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDA1MCwKKwkweDIwMDMsIDB4MDAyMCwgMHgwODA0LCAweDE0YmIsIDB4NzhhYiwgMHgwMDA0LCAweDc4MDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4MTRlZiwgMHgwMDA1LCAweDc4MjcsIDB4MDAxOCwgMHhhMDAxLCAweDc4MjgsIDB4NzgyNywKKwkweDAwMTEsIDB4YTAwMSwgMHg3OTI4LCAweDkxMDYsIDB4MDExMCwgMHg3OWFjLCAweDA4ZTAsIDB4MDBlNiwKKwkweDIwNzEsIDB4MDIwMCwgMHg3MDJjLCAweGQwYzQsIDB4MDE0MCwgMHgwMGVlLCAweDA4MGMsIDB4MWFlYywKKwkweDA4MGMsIDB4MTMxMywgMHg3ODAzLCAweDAwMDEsIDB4MDAwNSwgMHg3MDM3LCAweDAwMDEsIDB4YTAwMSwKKwkweDcxNTAsIDB4MDBlZSwgMHg5MThjLCAweGZmMDAsIDB4OTE4NiwgMHgwNTAwLCAweDAxMTAsIDB4NzlhYywKKwkweDA4MTAsIDB4NzAwNCwgMHhjMDlkLCAweDcwMDYsIDB4NzhhYiwgMHgwMDA0LCAweDc4MDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4MTRlZiwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDIwLCAweDAwMDUsIDB4NzgyOCwKKwkweDc4MmIsIDB4MDAwMCwgMHg5MDY1LCAweDA5MGMsIDB4MGRkNSwgMHg2MDE0LCAweDIwNDgsIDB4NzhhYiwKKwkweDAwMDQsIDB4OTE4YywgMHgwNzAwLCAweDAxYTgsIDB4MDgwYywgMHg3ZWQ3LCAweDA4MGMsIDB4MWFlYywKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMTU4LCAweGE5YWMsIDB4YTkzNiwgMHhhOWIwLCAweGE5M2EsIDB4YTgzZiwKKwkweGZmZmYsIDB4YTg0MywgMHhmZmZmLCAweGE4ODAsIDB4YzBiZCwgMHhhODgyLCAweDA4MGMsIDB4YzhhNSwKKwkweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MTEyOCwgMHgyMDA5LCAweDAwNGMsIDB4MDgwYywKKwkweGFmYmUsIDB4MDA0OCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywKKwkweDYwMjQsIDB4MTkwYywgMHhkMDcyLCAweDIwMjksIDB4MDBjOCwgMHg4NTI5LCAweDAxMjgsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4N2RiYywgMHgwODBjLCAweGViNTEsIDB4ZDVhNCwKKwkweDExMTgsIDB4MDgwYywgMHgxNThjLCAweDAwMDUsIDB4MDgwYywgMHg3ZWQ3LCAweDA4MGMsIDB4MWFlYywKKwkweDAwMDUsIDB4NzgxZiwgMHgwMzAwLCAweDc4MDMsIDB4MDAwMSwgMHgwMDA1LCAweDAwMTYsIDB4MDA2NiwKKwkweDAwNzYsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzkwOCwgMHg5MThjLCAweDAwMDcsIDB4OTE4NiwKKwkweDAwMDMsIDB4MDEyMCwgMHgyMDAxLCAweDAwMTYsIDB4MDgwYywgMHgxNWZkLCAweDAwZmUsIDB4MDA3ZSwKKwkweDAwNmUsIDB4MDAxZSwgMHgwMDA1LCAweDcwMDQsIDB4YzA5ZCwgMHg3MDA2LCAweDAwMDUsIDB4NzEwNCwKKwkweDkxODQsIDB4MDAwNCwgMHgxOTBjLCAweDBkZDUsIDB4ZDE4NCwgMHgxMWIxLCAweGQxOWMsIDB4MDE4MCwKKwkweGMxOWMsIDB4NzEwNiwgMHgwMDE2LCAweDA4MGMsIDB4MTZjYSwgMHgwMDFlLCAweDAxNDgsIDB4MjAwMSwKKwkweDAyMGQsIDB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwODBjLCAweDE1OGMsIDB4MDAwNSwKKwkweDgxZmYsIDB4MTkwYywgMHgwZGQ1LCAweDAwMDUsIDB4MjEwMCwgMHhjMTg0LCAweGMxYjQsIDB4NzEwNiwKKwkweGQwYjQsIDB4MDAxNiwgMHgwMGU2LCAweDE5MDQsIDB4MTU1NiwgMHgyMDcxLCAweDAyMDAsIDB4MDgwYywKKwkweDE2YjcsIDB4MDVlMCwgMHgwODBjLCAweDE2Y2EsIDB4MDViMCwgMHg2MDE0LCAweDkwMDUsIDB4MDViMCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODY0LCAweDAwOWUsIDB4OTA4NCwgMHgwMGZmLCAweDkwOGUsIDB4MDAyOSwKKwkweDAxNjAsIDB4OTA4ZSwgMHgwMDQ4LCAweDE1NTAsIDB4NjAxYywgMHhkMDg0LCAweDExZTAsIDB4MDBmNiwKKwkweDJjNzgsIDB4MDgwYywgMHgxNzU0LCAweDAwZmUsIDB4MDBiMCwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywKKwkweDE4ZGQsIDB4MDBmZSwgMHgyMDA5LCAweDAxZjQsIDB4ODEwOSwgMHgwMTY4LCAweDIwMDEsIDB4MDIwMSwKKwkweDIwMDQsIDB4OTAwNSwgMHgwZGM4LCAweDIwMDEsIDB4MDIxOCwgMHgyMDA0LCAweGQwZWMsIDB4MTExOCwKKwkweDA4MGMsIDB4MTU4YywgMHgwMDQwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMjAsIDB4MDgwYywKKwkweDEzMTMsIDB4NzgwMywgMHgwMDAxLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDA4MGMsIDB4MTZjYSwKKwkweDBkZDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDA1MCwgMHgyMDAzLCAweDAwMjAsIDB4MDQ2MSwKKwkweDBjOTAsIDB4MDQyOSwgMHgyMDYwLCAweDIwMDksIDB4MDA1MywgMHgwODBjLCAweGFmYmUsIDB4MDAwNSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMGUxLCAweDIwMDgsIDB4MDBkMSwgMHgwMDA2LCAweDcwMDQsIDB4YzA5ZCwKKwkweDcwMDYsIDB4MDAwZSwgMHgwODBjLCAweDhlMjEsIDB4MDAwNSwgMHgwMDg5LCAweDkwMDUsIDB4MDExOCwKKwkweDA4MGMsIDB4OGEyOCwgMHgwY2QwLCAweDAwMDUsIDB4MjAwMSwgMHgwMDM2LCAweDIwMDksIDB4MTgyMCwKKwkweDIxMGMsIDB4MjAxMSwgMHgxODFmLCAweDIyMTQsIDB4MDgwYywgMHgxNWZkLCAweDAwMDUsIDB4NzgwOCwKKwkweGQwOWMsIDB4MGRlOCwgMHg3ODIwLCAweDAwMDUsIDB4MDgwYywgMHgxNGQ2LCAweDAwZDYsIDB4MjA2OSwKKwkweDAyMDAsIDB4MjAwOSwgMHgwMWY0LCAweDgxMDksIDB4MDUxMCwgMHg2ODA0LCAweDkwMDUsIDB4MGRkOCwKKwkweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4NzliYywgMHhkMWE0LCAweDE1MjgsIDB4NzliOCwKKwkweDkxOGMsIDB4MGZmZiwgMHgwMTgwLCAweDkxODIsIDB4MDg0MSwgMHgxMjY4LCAweDkxODgsIDB4MDAwNywKKwkweDkxOGMsIDB4MGZmOCwgMHg4MTBjLCAweDgxMGMsIDB4ODEwYywgMHgwODBjLCAweDE1ZWYsIDB4NjgyNywKKwkweDAwMDEsIDB4ODEwOSwgMHgxZGQwLCAweDA0ZDksIDB4NjgyNywgMHgwMDAyLCAweDA0YzEsIDB4NjgwNCwKKwkweDkwMDUsIDB4MTEzMCwgMHg2ODJjLCAweGQwZTQsIDB4MTUwMCwgMHg2ODA0LCAweDkwMDUsIDB4MGRlOCwKKwkweDc5YjgsIDB4ZDFlYywgMHgxMTMwLCAweDA4YzAsIDB4MDgwYywgMHg3ZWQ3LCAweDA4MGMsIDB4MWFlYywKKwkweDAwOTAsIDB4NzgyNywgMHgwMDE1LCAweDc4MmIsIDB4MDAwMCwgMHg3ODI3LCAweDAwMTgsIDB4NzgyYiwKKwkweDAwMDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAyMCwgMHgyMDAxLCAweDAzMDcsIDB4MjAwMywKKwkweDAzMDAsIDB4NzgwMywgMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwgMHg2ODJjLCAweDkwODQsIDB4NTQwMCwKKwkweDkwODYsIDB4NTQwMCwgMHgwZDMwLCAweDc4MjcsIDB4MDAxNSwgMHg3ODJiLCAweDAwMDAsIDB4NzgwMywKKwkweDAwMDEsIDB4NjgwMCwgMHg5MDg1LCAweDE4MDAsIDB4NjgwMiwgMHgwMGRlLCAweDAwMDUsIDB4NjgyNCwKKwkweDkwODQsIDB4MDAwMywgMHgxZGUwLCAweDAwMDUsIDB4MjAwMSwgMHgwMDMwLCAweDJjMDgsIDB4NjIxYywKKwkweDAwMjEsIDB4NzgzMCwgMHg5MDg2LCAweDAwNDEsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwKKwkweDAwMDYsIDB4NzgwOCwgMHhkMDljLCAweDAxNDAsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsIDB4MDgwYywKKwkweDEzODAsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA2LCAweDc4MzIsIDB4NzkzNiwKKwkweDdhM2EsIDB4NzgxYiwgMHg4MDgwLCAweDAwNTksIDB4MTExOCwgMHgwMDBlLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwMGUsIDB4NzkyYywgMHgzOTAwLCAweDgwMDAsIDB4MjAwNCwgMHgwODBjLCAweDBkZDUsIDB4MjAwOSwKKwkweDE4MGMsIDB4MjEwNCwgMHhjMGY0LCAweDIwMGEsIDB4MjAwOSwgMHhmZjAwLCAweDgxMDksIDB4MDkwNCwKKwkweDE2N2IsIDB4N2ExOCwgMHg5Mjg0LCAweDAwMzAsIDB4MDkwNCwgMHgxNjc2LCAweDkyODQsIDB4MDA0OCwKKwkweDkwODYsIDB4MDAwOCwgMHgxOTA0LCAweDE2NzYsIDB4MjAwMSwgMHgwMTA5LCAweDIwMDQsIDB4ZDA4YywKKwkweDAxZjAsIDB4MDAwNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjgwMCwgMHgwMGY2LCAweDAwMjYsIDB4MDAxNiwgMHgyMDA5LCAweDFhN2QsIDB4MjEwNCwKKwkweDgwMDAsIDB4MDIwOCwgMHgyMDBhLCAweDA4MGMsIDB4OTE2MywgMHgwMDFlLCAweDAwMmUsIDB4MDBmZSwKKwkweDAxMmUsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLCAweDAwMGUsIDB4MjAwMSwKKwkweDAwOWIsIDB4MjAwNCwgMHhkMGZjLCAweDAxZDAsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwKKwkweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDAwZjYsIDB4MDAxNiwgMHgyMDA5LCAweDFhN2UsIDB4MjEwNCwKKwkweDgwMDAsIDB4MDIwOCwgMHgyMDBhLCAweDA4MGMsIDB4MWVmMiwgMHgwMDFlLCAweDAwZmUsIDB4MDE1ZSwKKwkweDAxNGUsIDB4MDEzZSwgMHgwMWRlLCAweDAxY2UsIDB4MDEyZSwgMHgwMDBlLCAweDc4MTgsIDB4ZDBiYywKKwkweDE5MDQsIDB4MTYyNiwgMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwZjQsIDB4MTUyOCwKKwkweDdhMTgsIDB4OTI4NCwgMHgwMDMwLCAweDA1MDgsIDB4OTI4NCwgMHgwMDQ4LCAweDkwODYsIDB4MDAwOCwKKwkweDExZTAsIDB4MjAwMSwgMHgxOWY1LCAweDIwMDQsIDB4OTAwNSwgMHgwMWI4LCAweDIwMDEsIDB4MWE2NSwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDAxODgsIDB4MjAwOSwgMHgxYTdjLCAweDIxMDQsIDB4ODAwMCwKKwkweDAyMDgsIDB4MjAwYSwgMHgwODBjLCAweGEzZDQsIDB4MjAwOSwgMHgxODBjLCAweDIxMDQsIDB4YzBmNSwKKwkweDIwMGEsIDB4MjAwOSwgMHhmZjAwLCAweDA4MDQsIDB4MTYyNiwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwKKwkweDc4MzIsIDB4NzkzNiwgMHg3YTNhLCAweDc4MWIsIDB4ODA4MCwgMHgwODBjLCAweDE2MWYsIDB4MTEwOCwKKwkweDAwMDUsIDB4NzkyYywgMHgzOTAwLCAweDgwMDAsIDB4MjAwNCwgMHgwODBjLCAweDBkZDUsIDB4NzAzNywKKwkweDAwMDEsIDB4NzE1MCwgMHg3MDM3LCAweDAwMDIsIDB4NzA1MCwgMHgyMDYwLCAweGQxYmMsIDB4MTExMCwKKwkweDcwNTQsIDB4MjA2MCwgMHg5MThjLCAweGZmMDAsIDB4OTE4NiwgMHgwNTAwLCAweDAxMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwMDA2LCAweDAwNDYsIDB4MDBlNiwgMHgyMDcxLCAweDAyMDAsIDB4NzAzNywKKwkweDAwMDIsIDB4NzA1OCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDg2LCAweDAwYmMsIDB4MTE1OCwKKwkweDIwMjEsIDB4MWE3YiwgMHgyNDA0LCAweDgwMDAsIDB4MDIwOCwgMHgyMDIyLCAweDA4MGMsIDB4N2VkNywKKwkweDA4MGMsIDB4MWFlYywgMHg5MDA2LCAweDAwZWUsIDB4MDA0ZSwgMHgwMDBlLCAweDAwMDUsIDB4MGMxMSwKKwkweDExMDgsIDB4MDAwNSwgMHgwMGU2LCAweDAwMTYsIDB4MjA3MSwgMHgwMjAwLCAweDA4NDEsIDB4NjEyNCwKKwkweGQxZGMsIDB4MDFmOCwgMHg3MDFjLCAweGQwOGMsIDB4MDkwNCwgMHgxNzQ5LCAweDcwMTcsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDI2NCwgMHgyMDA0LCAweGQwYmMsIDB4MDkwNCwgMHgxNzQ5LCAweDIwMDEsIDB4MDI2OCwKKwkweDAwYzYsIDB4MjA2NCwgMHg2MTA0LCAweDYwMzgsIDB4MDBjZSwgMHg5MThlLCAweDAwMzksIDB4MTkwNCwKKwkweDE3NDksIDB4OWMwNiwgMHgxNWYwLCAweDAxMjYsIDB4MjA5MSwgMHgyNjAwLCAweDA4MGMsIDB4N2UxZSwKKwkweDAxMmUsIDB4NzM1OCwgMHg3NDVjLCAweDYwMTQsIDB4OTA1ZCwgMHgwNTk4LCAweDJiNDgsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxOTBjLCAweGQwNGQsIDB4YWI0MiwKKwkweGFjM2UsIDB4MjAwMSwgMHgxODY5LCAweDIwMDQsIDB4ZDBiNCwgMHgxMTcwLCAweDYwMWMsIDB4ZDBlNCwKKwkweDExNTgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTEyMCwKKwkweGE4M2IsIDB4N2ZmZiwgMHhhODM3LCAweGZmZmYsIDB4MDgwYywgMHgyMGVlLCAweDExOTAsIDB4MDgwYywKKwkweDE5M2EsIDB4MmEwMCwgMHhhODE2LCAweDAxMzAsIDB4MjgwMCwgMHhhODBlLCAweDJjMDUsIDB4YTgwYSwKKwkweDJjMDAsIDB4YTgxMiwgMHg3MDM3LCAweDAwMjAsIDB4NzgxZiwgMHgwMzAwLCAweDAwMWUsIDB4MDBlZSwKKwkweDAwMDUsIDB4NzAzNywgMHgwMDUwLCAweDcwMzcsIDB4MDAyMCwgMHgwMDFlLCAweDAwZWUsIDB4MDgwYywKKwkweDE1OGMsIDB4MDAwNSwgMHgwODBjLCAweDBkZDUsIDB4MmZmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwKKwkweDAwMTYsIDB4MDBjNiwgMHgzZTYwLCAweDYwMTQsIDB4MjA0OCwgMHgyOTQwLCAweDkwM2UsIDB4MjczMCwKKwkweGE4NjQsIDB4MjA2OCwgMHhhODFhLCAweDlkODQsIDB4MDAwZiwgMHg5MDg4LCAweDIwY2UsIDB4MjE2NSwKKwkweDAwMDIsIDB4MTc4MCwgMHgxN2VlLCAweDE3ODAsIDB4MTc4MCwgMHgxNzg0LCAweDE3Y2YsIDB4MTc4MCwKKwkweDE3YTQsIDB4MTc3OSwgMHgxN2U1LCAweDE3ODAsIDB4MTc4MCwgMHgxNzg5LCAweDE4ZGIsIDB4MTdiOCwKKwkweDE3YWUsIDB4YTk2NCwgMHg5MThjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDQ4LCAweDA5MDQsIDB4MTdlNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwODA0LCAweDE4ZDEsIDB4YTg3YywgMHhkMGFjLCAweDBkYzgsIDB4MDgwNCwKKwkweDE3ZjUsIDB4YTg3YywgMHhkMGFjLCAweDBkYTAsIDB4MDgwNCwgMHgxODYwLCAweGE4OTgsIDB4OTAxZCwKKwkweDExMDgsIDB4YWI5YywgMHg5MDE2LCAweGFhYjIsIDB4YWEzZSwgMHhhYTQyLCAweDNlMDAsIDB4OTA4MCwKKwkweDAwMDgsIDB4MjAwNCwgMHg5MDgwLCAweDhmZWYsIDB4MjAwNSwgMHg5MDA1LCAweDA5MGMsIDB4MGRkNSwKKwkweDIwMDQsIDB4YThhZSwgMHgwODA0LCAweDE4YjksIDB4YTg3YywgMHhkMGJjLCAweDA5YzgsIDB4YTg5MCwKKwkweGE4NDIsIDB4YTg4YywgMHhhODNlLCAweGE4ODgsIDB4MDgwNCwgMHgxN2Y1LCAweGE4N2MsIDB4ZDBiYywKKwkweDA5NzgsIDB4YTg5MCwgMHhhODQyLCAweGE4OGMsIDB4YTgzZSwgMHhhODg4LCAweDA4MDQsIDB4MTg2MCwKKwkweGE4N2MsIDB4ZDBiYywgMHgwOTI4LCAweGE4OTAsIDB4YTg0MiwgMHhhODhjLCAweGE4M2UsIDB4YTgwNCwKKwkweDkwNDUsIDB4MDkwYywgMHgwZGQ1LCAweGExNjQsIDB4YTkxYSwgMHg5MWVjLCAweDAwMGYsIDB4OWQ4MCwKKwkweDIwY2UsIDB4MjA2NSwgMHhhODg4LCAweGQxOWMsIDB4MTkwNCwgMHgxODYwLCAweDA0MzAsIDB4YTg3YywKKwkweGQwYWMsIDB4MDkwNCwgMHgxNzgwLCAweGE4MDQsIDB4OTA0NSwgMHgwOTBjLCAweDBkZDUsIDB4YTE2NCwKKwkweGE5MWEsIDB4OTFlYywgMHgwMDBmLCAweDlkODAsIDB4MjBjZSwgMHgyMDY1LCAweDkwMDYsIDB4YTg0MiwKKwkweGE4M2UsIDB4ZDE5YywgMHgxOTA0LCAweDE4NjAsIDB4MDA4MCwgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwKKwkweDE3ODAsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MDgwNCwgMHgxODYwLCAweGE4N2MsIDB4ZDBhYywKKwkweDA5MDQsIDB4MTc4MCwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwKKwkweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxODE4LCAweDE4MTgsIDB4MTgxYSwKKwkweDE4MTgsIDB4MTgxOCwgMHgxODE4LCAweDE4MjQsIDB4MTgxOCwgMHgxODE4LCAweDE4MTgsIDB4MTgyZSwKKwkweDE4MTgsIDB4MTgxOCwgMHgxODE4LCAweDE4MzgsIDB4MTgxOCwgMHgxODE4LCAweDE4MTgsIDB4MTg0MiwKKwkweDE4MTgsIDB4MTgxOCwgMHgxODE4LCAweDE4NGMsIDB4MTgxOCwgMHgxODE4LCAweDE4MTgsIDB4MTg1NiwKKwkweDA4MGMsIDB4MGRkNSwgMHhhNTc0LCAweGE0NzgsIDB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTc4ZSwKKwkweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDE4YjksIDB4YTU4NCwgMHhhNDg4LCAweDlkODYsIDB4MDAyNCwKKwkweDA5MDQsIDB4MTc4ZSwgMHhhMzhjLCAweGEyOTAsIDB4MDgwNCwgMHgxOGI5LCAweGE1OTQsIDB4YTQ5OCwKKwkweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3OGUsIDB4YTM5YywgMHhhMmEwLCAweDA4MDQsIDB4MThiOSwKKwkweGE1YTQsIDB4YTRhOCwgMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxNzhlLCAweGEzYWMsIDB4YTJiMCwKKwkweDA4MDQsIDB4MThiOSwgMHhhNWI0LCAweGE0YjgsIDB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTc4ZSwKKwkweGEzYmMsIDB4YTJjMCwgMHgwODA0LCAweDE4YjksIDB4YTVjNCwgMHhhNGM4LCAweDlkODYsIDB4MDAyNCwKKwkweDA5MDQsIDB4MTc4ZSwgMHhhM2NjLCAweGEyZDAsIDB4MDgwNCwgMHgxOGI5LCAweGE1ZDQsIDB4YTRkOCwKKwkweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3OGUsIDB4YTNkYywgMHhhMmUwLCAweDA4MDQsIDB4MThiOSwKKwkweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwKKwkweDE4ODMsIDB4MTg4MSwgMHgxODgxLCAweDE4ODEsIDB4MTg4MSwgMHgxODgxLCAweDE4OGUsIDB4MTg4MSwKKwkweDE4ODEsIDB4MTg4MSwgMHgxODgxLCAweDE4ODEsIDB4MTg5OSwgMHgxODgxLCAweDE4ODEsIDB4MTg4MSwKKwkweDE4ODEsIDB4MTg4MSwgMHgxOGE0LCAweDE4ODEsIDB4MTg4MSwgMHgxODgxLCAweDE4ODEsIDB4MTg4MSwKKwkweDE4YWYsIDB4MDgwYywgMHgwZGQ1LCAweGE1NmMsIDB4YTQ3MCwgMHhhNzc0LCAweGE2NzgsIDB4OWQ4NiwKKwkweDAwMmMsIDB4MDkwNCwgMHgxNzhlLCAweGEzN2MsIDB4YTI4MCwgMHgwNDU4LCAweGE1ODQsIDB4YTQ4OCwKKwkweGE3OGMsIDB4YTY5MCwgMHg5ZDg2LCAweDAwMmMsIDB4MDkwNCwgMHgxNzhlLCAweGEzOTQsIDB4YTI5OCwKKwkweDA0MDAsIDB4YTU5YywgMHhhNGEwLCAweGE3YTQsIDB4YTZhOCwgMHg5ZDg2LCAweDAwMmMsIDB4MDkwNCwKKwkweDE3OGUsIDB4YTNhYywgMHhhMmIwLCAweDAwYTgsIDB4YTViNCwgMHhhNGI4LCAweGE3YmMsIDB4YTZjMCwKKwkweDlkODYsIDB4MDAyYywgMHgwOTA0LCAweDE3OGUsIDB4YTNjNCwgMHhhMmM4LCAweDAwNTAsIDB4YTVjYywKKwkweGE0ZDAsIDB4YTdkNCwgMHhhNmQ4LCAweDlkODYsIDB4MDAyYywgMHgwOTA0LCAweDE3OGUsIDB4YTNkYywKKwkweGEyZTAsIDB4YWIyZSwgMHhhYTMyLCAweGFkMWUsIDB4YWMyMiwgMHhhZjI2LCAweGFlMmEsIDB4YTk4OCwKKwkweDhjNjAsIDB4MmMxZCwgMHhhOGFjLCAweGFhYjAsIDB4YTgzNiwgMHhhYTNhLCAweDgxMDksIDB4YTkxNiwKKwkweDExNjAsIDB4M2U2MCwgMHg2MDFjLCAweGMwODUsIDB4NjAxZSwgMHhhODdjLCAweGMwZGQsIDB4YTg3ZSwKKwkweDkwMDYsIDB4MDBjZSwgMHgwMDFlLCAweDAxMmUsIDB4MDAwNSwgMHgyODAwLCAweGE4MGUsIDB4YWIwYSwKKwkweDJjMDAsIDB4YTgxMiwgMHgwYzcwLCAweDA4MDQsIDB4MTc4MCwgMHgyZmYwLCAweDAxMjYsIDB4MjA5MSwKKwkweDIyMDAsIDB4MDAxNiwgMHgwMGM2LCAweDNlNjAsIDB4NjAxNCwgMHgyMDQ4LCAweDI5NDAsIDB4YTgwZSwKKwkweDIwNjEsIDB4MjBjOSwgMHhhODEzLCAweDIwYzksIDB4MmMwNSwgMHhhODBhLCAweGE5NjQsIDB4YTkxYSwKKwkweGE4N2MsIDB4ZDBhYywgMHgwOTBjLCAweDBkZDUsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MmMwNSwKKwkweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZDUsIDB4YWRjYywgMHhhY2QwLCAweGFmZDQsIDB4YWVkOCwKKwkweGFiZGMsIDB4YWFlMCwgMHhhYjJlLCAweGFhMzIsIDB4YWQxZSwgMHhhYzIyLCAweGFmMjYsIDB4YWUyYSwKKwkweGE4YWMsIDB4YWFiMCwgMHhhODM2LCAweGFhM2EsIDB4YTk4OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwOCwgMHgxMTIwLCAweDgxMDksIDB4YTkxNiwgMHgwMTI4LCAweDAwODAsIDB4OTE4YSwKKwkweDAwMDIsIDB4YTkxNiwgMHgxMTYwLCAweDNlNjAsIDB4NjAxYywgMHhjMDg1LCAweDYwMWUsIDB4YTg3YywKKwkweGMwZGQsIDB4YTg3ZSwgMHg5MDA2LCAweDAwY2UsIDB4MDAxZSwgMHgwMTJlLCAweDAwMDUsIDB4YTgwNCwKKwkweDkwNDUsIDB4MDkwYywgMHgwZGQ1LCAweGE4MGUsIDB4YTA2NCwgMHhhODFhLCAweDkwODQsIDB4MDAwZiwKKwkweDkwODAsIDB4MjBjZSwgMHgyMDE1LCAweDgyZmYsIDB4MDkwYywgMHgwZGQ1LCAweGFhMTIsIDB4MjIwNSwKKwkweGE4MGEsIDB4MGMwOCwgMHg5MDNlLCAweDI3MzAsIDB4YTg4MCwgMHhkMGZjLCAweDExOTAsIDB4MmQwMCwKKwkweDAwMDIsIDB4MWE2NCwgMHgxOTkxLCAweDE5OTEsIDB4MWE2NCwgMHgxOTkxLCAweDFhNWUsIDB4MWE2NCwKKwkweDE5OTEsIDB4MWEwMSwgMHgxYTAxLCAweDFhMDEsIDB4MWE2NCwgMHgxYTAxLCAweDFhNjQsIDB4MWE1YiwKKwkweDFhMDEsIDB4YzBmYywgMHhhODgyLCAweGFiMmMsIDB4YWEzMCwgMHhhZDFjLCAweGFjMjAsIDB4ZGQ5YywKKwkweDA5MDQsIDB4MWE2NiwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgxOTdkLCAweDE5N2IsIDB4MTk3YiwgMHgxOTdiLCAweDE5N2IsIDB4MTk3YiwKKwkweDE5ODEsIDB4MTk3YiwgMHgxOTdiLCAweDE5N2IsIDB4MTk3YiwgMHgxOTdiLCAweDE5ODUsIDB4MTk3YiwKKwkweDE5N2IsIDB4MTk3YiwgMHgxOTdiLCAweDE5N2IsIDB4MTk4OSwgMHgxOTdiLCAweDE5N2IsIDB4MTk3YiwKKwkweDE5N2IsIDB4MTk3YiwgMHgxOThkLCAweDA4MGMsIDB4MGRkNSwgMHhhNzc0LCAweGE2NzgsIDB4MDgwNCwKKwkweDFhNjYsIDB4YTc4YywgMHhhNjkwLCAweDA4MDQsIDB4MWE2NiwgMHhhN2E0LCAweGE2YTgsIDB4MDgwNCwKKwkweDFhNjYsIDB4YTdiYywgMHhhNmMwLCAweDA4MDQsIDB4MWE2NiwgMHhhN2Q0LCAweGE2ZDgsIDB4MDgwNCwKKwkweDFhNjYsIDB4YTg5OCwgMHg5MDFkLCAweDExMDgsIDB4YWI5YywgMHg5MDE2LCAweDJjMDUsIDB4OTA4YSwKKwkweDAwMzYsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDE5YjksIDB4MTliOSwKKwkweDE5YmIsIDB4MTliOSwgMHgxOWI5LCAweDE5YjksIDB4MTljNSwgMHgxOWI5LCAweDE5YjksIDB4MTliOSwKKwkweDE5Y2YsIDB4MTliOSwgMHgxOWI5LCAweDE5YjksIDB4MTlkOSwgMHgxOWI5LCAweDE5YjksIDB4MTliOSwKKwkweDE5ZTMsIDB4MTliOSwgMHgxOWI5LCAweDE5YjksIDB4MTllZCwgMHgxOWI5LCAweDE5YjksIDB4MTliOSwKKwkweDE5ZjcsIDB4MDgwYywgMHgwZGQ1LCAweGE1NzQsIDB4YTQ3OCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwKKwkweDFhNjYsIDB4YTM3YywgMHhhMjgwLCAweDA4MDQsIDB4MWE2NiwgMHhhNTg0LCAweGE0ODgsIDB4OWQ4NiwKKwkweDAwMDQsIDB4MDkwNCwgMHgxYTY2LCAweGEzOGMsIDB4YTI5MCwgMHgwODA0LCAweDFhNjYsIDB4YTU5NCwKKwkweGE0OTgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsIDB4MWE2NiwgMHhhMzljLCAweGEyYTAsIDB4MDgwNCwKKwkweDFhNjYsIDB4YTVhNCwgMHhhNGE4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LCAweDFhNjYsIDB4YTNhYywKKwkweGEyYjAsIDB4MDgwNCwgMHgxYTY2LCAweGE1YjQsIDB4YTRiOCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwKKwkweDFhNjYsIDB4YTNiYywgMHhhMmMwLCAweDA4MDQsIDB4MWE2NiwgMHhhNWM0LCAweGE0YzgsIDB4OWQ4NiwKKwkweDAwMDQsIDB4MDkwNCwgMHgxYTY2LCAweGEzY2MsIDB4YTJkMCwgMHgwODA0LCAweDFhNjYsIDB4YTVkNCwKKwkweGE0ZDgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsIDB4MWE2NiwgMHhhM2RjLCAweGEyZTAsIDB4MDgwNCwKKwkweDFhNjYsIDB4YTg5OCwgMHg5MDFkLCAweDExMDgsIDB4YWI5YywgMHg5MDE2LCAweDJjMDUsIDB4OTA4YSwKKwkweDAwMzQsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFhMjksIDB4MWEyNywKKwkweDFhMjcsIDB4MWEyNywgMHgxYTI3LCAweDFhMjcsIDB4MWEzMywgMHgxYTI3LCAweDFhMjcsIDB4MWEyNywKKwkweDFhMjcsIDB4MWEyNywgMHgxYTNkLCAweDFhMjcsIDB4MWEyNywgMHgxYTI3LCAweDFhMjcsIDB4MWEyNywKKwkweDFhNDcsIDB4MWEyNywgMHgxYTI3LCAweDFhMjcsIDB4MWEyNywgMHgxYTI3LCAweDFhNTEsIDB4MDgwYywKKwkweDBkZDUsIDB4YTU2YywgMHhhNDcwLCAweGE3NzQsIDB4YTY3OCwgMHg5ZDg2LCAweDAwMGMsIDB4MDViMCwKKwkweGEzN2MsIDB4YTI4MCwgMHgwNDk4LCAweGE1ODQsIDB4YTQ4OCwgMHhhNzhjLCAweGE2OTAsIDB4OWQ4NiwKKwkweDAwMGMsIDB4MDU2MCwgMHhhMzk0LCAweGEyOTgsIDB4MDQ0OCwgMHhhNTljLCAweGE0YTAsIDB4YTdhNCwKKwkweGE2YTgsIDB4OWQ4NiwgMHgwMDBjLCAweDA1MTAsIDB4YTNhYywgMHhhMmIwLCAweDAwZjgsIDB4YTViNCwKKwkweGE0YjgsIDB4YTdiYywgMHhhNmMwLCAweDlkODYsIDB4MDAwYywgMHgwMWMwLCAweGEzYzQsIDB4YTJjOCwKKwkweDAwYTgsIDB4YTVjYywgMHhhNGQwLCAweGE3ZDQsIDB4YTZkOCwgMHg5ZDg2LCAweDAwMGMsIDB4MDE3MCwKKwkweGEzZGMsIDB4YTJlMCwgMHgwMDU4LCAweDlkODYsIDB4MDAwZSwgMHgxMTMwLCAweDA4MGMsIDB4MjA4NiwKKwkweDE5MDQsIDB4MTkzYSwgMHg5MDBlLCAweDAwNTAsIDB4MDgwYywgMHgwZGQ1LCAweGFiMmUsIDB4YWEzMiwKKwkweGFkMWUsIDB4YWMyMiwgMHhhZjI2LCAweGFlMmEsIDB4MDgwYywgMHgyMDg2LCAweDAwMDUsIDB4NjAxNCwKKwkweDIwNDgsIDB4NjExOCwgMHg4MTBjLCAweDgxMGMsIDB4ODEwYywgMHg4MWZmLCAweDExMTgsIDB4YTg4NywKKwkweDAwMDEsIDB4MDAwOCwgMHhhOTg2LCAweDYwMWIsIDB4MDAwMiwgMHhhODc0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODQsIDB4MDAwOCwgMHgwMTUwLCAweDAwZTksIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGFmYmUsIDB4MDAwNSwgMHhhOTc0LCAweGQxZGMsIDB4MTEwOCwKKwkweDAwMDUsIDB4YTkzNCwgMHhhODhjLCAweDkxMDYsIDB4MTE1OCwgMHhhOTM4LCAweGE4OTAsIDB4OTEwNiwKKwkweDExMzgsIDB4NjAxYywgMHhjMDg0LCAweDYwMWUsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MDQsIDB4YWZiZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4MjIwMCwgMHgwMGNlLCAweDc5MDgsIDB4OTE4YywKKwkweDAwMDcsIDB4OTE4NiwgMHgwMDAwLCAweDA1YjAsIDB4OTE4NiwgMHgwMDAzLCAweDA1OTgsIDB4NjAyMCwKKwkweDYwMjMsIDB4MDAwMCwgMHgwMDA2LCAweDIwMzEsIDB4MDAwOCwgMHgwMGM2LCAweDc4MWYsIDB4MDgwOCwKKwkweDc4MDgsIDB4ZDA5YywgMHgwMTIwLCAweDA4MGMsIDB4MTM4MCwgMHg4NjMxLCAweDFkYjgsIDB4MDBjZSwKKwkweDc4MWYsIDB4MDgwMCwgMHgyMDMxLCAweDAxNjgsIDB4MDBjNiwgMHg3ODA4LCAweGQwOWMsIDB4MTkwYywKKwkweDEzODAsIDB4MDBjZSwgMHgyMDAxLCAweDAwMzgsIDB4MDgwYywgMHgxYjc0LCAweDc5MzAsIDB4OTE4NiwKKwkweDAwNDAsIDB4MDE2MCwgMHg5MTg2LCAweDAwNDIsIDB4MTkwYywgMHgwZGQ1LCAweDIwMDEsIDB4MDAxZSwKKwkweDgwMDEsIDB4MWRmMCwgMHg4NjMxLCAweDFkNDAsIDB4MDgwYywgMHgxYjgzLCAweDAwMGUsIDB4NjAyMiwKKwkweDAxMmUsIDB4MDAwNSwgMHgwODBjLCAweDFiNzAsIDB4NzgyNywgMHgwMDE1LCAweDc4MjgsIDB4OWMwNiwKKwkweDFkYjgsIDB4NzgyYiwgMHgwMDAwLCAweDBjYTAsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzgwMywKKwkweDAwMDAsIDB4NzhhYiwgMHgwMDA0LCAweDAwZmUsIDB4MDgwYywgMHg3NDNlLCAweDExODgsIDB4MjAwMSwKKwkweDAxMzgsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDE2MCwgMHgyMDAzLCAweDAwMDAsIDB4MjAxMSwKKwkweDAxMmMsIDB4YTAwMSwgMHhhMDAxLCAweDgyMTEsIDB4MWRlMCwgMHgwMDU5LCAweDA4MDQsIDB4NzRlZSwKKwkweDA0NzksIDB4MDAzOSwgMHgyMDAxLCAweDAxNjAsIDB4MjUwMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAyMDAsIDB4MDgwYywgMHgyYzgyLCAweDIwMDksIDB4MDAzYywKKwkweDA4MGMsIDB4MjQxMCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDcwMDAsIDB4OTA4NCwKKwkweDAwM2MsIDB4MWRlMCwgMHgwODBjLCAweDg0YzIsIDB4NzBhMCwgMHg3MGEyLCAweDcwOTgsIDB4NzA5YSwKKwkweDcwOWMsIDB4NzA5ZSwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDIwLCAweDAwZjYsIDB4MjA3OSwKKwkweDAzMDAsIDB4MDgwYywgMHgxMzEzLCAweDc4MDMsIDB4MDAwMSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwKKwkweDIwMDEsIDB4MDEzOCwgMHgyMDE0LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxNjAsIDB4MjAyYywKKwkweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDc0M2UsIDB4MTEwOCwgMHgwMDA1LCAweDIwMjEsIDB4MDI2MCwKKwkweDIwMDEsIDB4MDE0MSwgMHgyMDFjLCAweGQzZGMsIDB4MTE2OCwgMHgyMDAxLCAweDAxMDksIDB4MjAxYywKKwkweDkzOWMsIDB4MDA0OCwgMHgxMTYwLCAweDIwMDEsIDB4MDExMSwgMHgyMDFjLCAweDgzZmYsIDB4MTExMCwKKwkweDg0MjEsIDB4MWQ3MCwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MDA0NiwKKwkweDIwMjEsIDB4MDAxOSwgMHgyMDAzLCAweDAwNDgsIDB4YTAwMSwgMHhhMDAxLCAweDIwMWMsIDB4OTM5YywKKwkweDAwNDgsIDB4MDEyMCwgMHg4NDIxLCAweDFkYjAsIDB4MDA0ZSwgMHgwYzYwLCAweDAwNGUsIDB4MGM0MCwKKwkweDYwMWMsIDB4YzA4NCwgMHg2MDFlLCAweDAwMDUsIDB4MmMwOCwgMHg2MjFjLCAweDA4MGMsIDB4MTVmZCwKKwkweDc5MzAsIDB4MDAwNSwgMHgyYzA4LCAweDYyMWMsIDB4MDgwYywgMHgxNmE4LCAweDc5MzAsIDB4MDAwNSwKKwkweDgwMDEsIDB4MWRmMCwgMHgwMDA1LCAweDIwMzEsIDB4MDA2NCwgMHg3ODFjLCAweDkwODQsIDB4MDAwNywKKwkweDAxNzAsIDB4MjAwMSwgMHgwMDM4LCAweDBjNDEsIDB4OTE4NiwgMHgwMDQwLCAweDA5MDQsIDB4MWJlMSwKKwkweDIwMDEsIDB4MDAxZSwgMHgwYzY5LCAweDg2MzEsIDB4MWQ4MCwgMHgwODBjLCAweDBkZDUsIDB4NzgxZiwKKwkweDAyMDIsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDBkYWMsIDB4MGMwMSwKKwkweDc4MWMsIDB4ZDA4NCwgMHgwMTEwLCAweDA4NjEsIDB4MDRlMCwgMHgyMDAxLCAweDAwMzAsIDB4MDg5MSwKKwkweDkxODYsIDB4MDA0MCwgMHgwNTY4LCAweDc4MWMsIDB4ZDA4NCwgMHgxZGE4LCAweDc4MWYsIDB4MDEwMSwKKwkweDIwMDEsIDB4MDAxNCwgMHgwODY5LCAweDIwMDEsIDB4MDAzNywgMHgwODIxLCAweDkxODYsIDB4MDA0MCwKKwkweDAxNDAsIDB4MjAwMSwgMHgwMDMwLCAweDA4MGMsIDB4MWI3YSwgMHg5MTg2LCAweDAwNDAsIDB4MTkwYywKKwkweDBkZDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjkyYywgMHhkMWY0LCAweDExNzAsIDB4ZDFjNCwKKwkweDAxNjAsIDB4ZDE5YywgMHgwMTMwLCAweDY4MDAsIDB4OTA4NSwgMHgxODAwLCAweDY4MDIsIDB4MDBkZSwKKwkweDAwODAsIDB4NjkwOCwgMHg5MTg0LCAweDAwMDcsIDB4MWRiMCwgMHgwMGRlLCAweDc4MWYsIDB4MDEwMCwKKwkweDc5MWMsIDB4OTE4NCwgMHgwMDA3LCAweDA5MGMsIDB4MGRkNSwgMHhhMDAxLCAweGEwMDEsIDB4NzgxZiwKKwkweDAyMDAsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHgyMDcxLCAweDFhNjUsIDB4MjA3OSwKKwkweDAwOTAsIDB4MDEyZSwgMHgwMDA1LCAweDkyODAsIDB4MDAwNSwgMHgyMDA0LCAweDIwNDgsIDB4YTk3YywKKwkweGQxZGMsIDB4MTkwNCwgMHgxYzgzLCAweGE5NjQsIDB4OTE4NCwgMHgwMDA3LCAweDAwMDIsIDB4MWJmZiwKKwkweDFjNmUsIDB4MWMxNiwgMHgxYzE4LCAweDFjMTYsIDB4MWM1NiwgMHgxYzM2LCAweDFjMjUsIDB4OTE4YywKKwkweDAwZmYsIDB4OTE4NiwgMHgwMDA4LCAweDExNzAsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWVhZCwKKwkweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweGE5ODgsIDB4MjkwMCwgMHhhODVhLCAweGE4MTMsIDB4MjBjOSwKKwkweDA4MDQsIDB4MWM3ZiwgMHg5MTg2LCAweDAwNDgsIDB4MDkwNCwgMHgxYzZlLCAweDA4MGMsIDB4MGRkNSwKKwkweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMTMsIDB4MDkwNCwgMHgxYzZlLCAweDkxODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAxYiwgMHgwOTA0LCAweDFjNmUsIDB4MGM4OCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwKKwkweDFlYWQsIDB4YTg5MCwgMHhhODQyLCAweGE4M2EsIDB4YTg4YywgMHhhODNlLCAweGE4MzYsIDB4YThhYywKKwkweGE4NDYsIDB4YThiMCwgMHhhODRhLCAweGE5ODgsIDB4MDgwNCwgMHgxYzc2LCAweGE4NjQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDFlLCAweDE5ZDAsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWVhZCwKKwkweGE4OTAsIDB4YTg0MiwgMHhhODNhLCAweGE4OGMsIDB4YTgzZSwgMHhhODM2LCAweGE4YWMsIDB4YTg0NiwKKwkweGE4YjAsIDB4YTg0YSwgMHhhODA0LCAweGE4NWEsIDB4MjA0MCwgMHhhMDY0LCAweDkwODQsIDB4MDAwZiwKKwkweDkwODAsIDB4MjBjZSwgMHgyMDA1LCAweGE4MTIsIDB4YTk4OCwgMHgwNDQ4LCAweDkxOGMsIDB4MDBmZiwKKwkweDkxODYsIDB4MDAxNSwgMHgxNTQwLCAweGE4N2MsIDB4ZDBiNCwgMHgwOTA0LCAweDFlYWQsIDB4YTgwNCwKKwkweGE4NWEsIDB4MjA0MCwgMHhhMDY0LCAweDkwODQsIDB4MDAwZiwgMHg5MDgwLCAweDIwY2UsIDB4MjAwNSwKKwkweGE4MTIsIDB4YTk4OCwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgwMDg4LCAweGE4N2MsIDB4ZDBiNCwKKwkweDA5MDQsIDB4MWVhZCwgMHhhOTg4LCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweDI5MDAsIDB4YTg1YSwKKwkweGE4NjQsIDB4OTA4NCwgMHgwMDBmLCAweDkwODAsIDB4MjBjZSwgMHgyMDA1LCAweGE4MTIsIDB4YTkxNiwKKwkweGE4N2MsIDB4YzBkZCwgMHhhODdlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAwOTAsIDB4NzgyYywKKwkweGQwZmMsIDB4MTkwYywgMHgxZWYyLCAweDAwZTYsIDB4MjA3MSwgMHgxYTY1LCAweDcwMDAsIDB4OTAwNSwKKwkweDE5MDQsIDB4MWNlYywgMHg3MjA2LCAweDkyODAsIDB4MDAwNSwgMHgyMDRjLCAweDkyODAsIDB4MDAwNCwKKwkweDIwMDQsIDB4NzgyYiwgMHgwMDA0LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc4MDMsIDB4MDA0MCwKKwkweDAwZmUsIDB4MDBiNiwgMHgyMDU4LCAweGI4NmMsIDB4NzgzNiwgMHhiODkwLCAweDAwYmUsIDB4MDBmNiwKKwkweDIwNzksIDB4MDIwMCwgMHg3ODAzLCAweDAwNDAsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHg3ODFhLCAweDIwNzksIDB4MDEwMCwgMHg4MDA0LCAweDc4ZDYsIDB4MDBmZSwKKwkweGE4MTQsIDB4MjA1MCwgMHhhODU4LCAweDIwNDAsIDB4YTgxMCwgMHgyMDYwLCAweGEwNjQsIDB4OTBlYywKKwkweDAwMGYsIDB4YTk0NCwgMHg3OTFhLCAweDcxMTYsIDB4YTg0OCwgMHg3ODFlLCAweDcwMWEsIDB4OTAwNiwKKwkweDcwMGUsIDB4NzAxMiwgMHg3MDA0LCAweGE5NDAsIDB4YTgzOCwgMHg5MTA2LCAweDE1MDAsIDB4YTkzYywKKwkweGE4MzQsIDB4OTEwNiwgMHgxMWUwLCAweDAwMDYsIDB4MDAxNiwgMHhhOTM4LCAweGE4MzQsIDB4OTEwNSwKKwkweDAxMTgsIDB4MDAxZSwgMHgwMDBlLCAweDAwOTgsIDB4MDAxZSwgMHgwMDBlLCAweDhhZmYsIDB4MDFjOCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MDMwNiwgMHgyMDBiLCAweDA4MDgsIDB4MDBkOSwKKwkweDAxMDgsIDB4MDBjOSwgMHgwMTJlLCAweDkwMDYsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDAzNiwKKwkweDAwNDYsIDB4YWIzOCwgMHhhYzM0LCAweDA4MGMsIDB4MjBlZSwgMHgwMDRlLCAweDAwM2UsIDB4MGQzMCwKKwkweDBjOTgsIDB4OTA4NSwgMHgwMDAxLCAweDBjODAsIDB4MjAwOSwgMHgwMzA2LCAweDIwMGIsIDB4NDgwMCwKKwkweDcwMjcsIDB4MDAwMCwgMHgwMDA1LCAweDAwNzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAzNiwKKwkweDAwMjYsIDB4OGFmZiwgMHgwOTA0LCAweDFlYTYsIDB4NzAwYywgMHg3MjE0LCAweDkyM2EsIDB4NzAxMCwKKwkweDcyMTgsIDB4OTIwMywgMHgwYTA0LCAweDFlYTUsIDB4OTcwNSwgMHgwOTA0LCAweDFlYTUsIDB4OTAzZSwKKwkweDI3MzAsIDB4YTg4MCwgMHhkMGZjLCAweDExOTAsIDB4MmQwMCwgMHgwMDAyLCAweDFlMmYsIDB4MWQ2ZSwKKwkweDFkNmUsIDB4MWUyZiwgMHgxZTJmLCAweDFlMGMsIDB4MWUyZiwgMHgxZDZlLCAweDFlMTMsIDB4MWRiZCwKKwkweDFkYmQsIDB4MWUyZiwgMHgxZTJmLCAweDFlMmYsIDB4MWUwNiwgMHgxZGJkLCAweGMwZmMsIDB4YTg4MiwKKwkweGFiMmMsIDB4YWEzMCwgMHhhZDFjLCAweGFjMjAsIDB4ZGQ5YywgMHgwOTA0LCAweDFlM2MsIDB4MmMwNSwKKwkweDkwOGEsIDB4MDAzNCwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MWQ1YSwKKwkweDFkNTgsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNTgsIDB4MWQ1OCwgMHgxZDVlLCAweDFkNTgsIDB4MWQ1OCwKKwkweDFkNTgsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNjIsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNTgsIDB4MWQ1OCwKKwkweDFkNTgsIDB4MWQ2NiwgMHgxZDU4LCAweDFkNTgsIDB4MWQ1OCwgMHgxZDU4LCAweDFkNTgsIDB4MWQ2YSwKKwkweDA4MGMsIDB4MGRkNSwgMHhhNzc0LCAweGE2NzgsIDB4MDgwNCwgMHgxZTNjLCAweGE3OGMsIDB4YTY5MCwKKwkweDA4MDQsIDB4MWUzYywgMHhhN2E0LCAweGE2YTgsIDB4MDgwNCwgMHgxZTNjLCAweGE3YmMsIDB4YTZjMCwKKwkweDA4MDQsIDB4MWUzYywgMHhhN2Q0LCAweGE2ZDgsIDB4MDgwNCwgMHgxZTNjLCAweDJjMDUsIDB4OTA4YSwKKwkweDAwMzYsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFkOTEsIDB4MWQ5MSwKKwkweDFkOTMsIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTEsIDB4MWQ5OSwgMHgxZDkxLCAweDFkOTEsIDB4MWQ5MSwKKwkweDFkOWYsIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTEsIDB4MWRhNSwgMHgxZDkxLCAweDFkOTEsIDB4MWQ5MSwKKwkweDFkYWIsIDB4MWQ5MSwgMHgxZDkxLCAweDFkOTEsIDB4MWRiMSwgMHgxZDkxLCAweDFkOTEsIDB4MWQ5MSwKKwkweDFkYjcsIDB4MDgwYywgMHgwZGQ1LCAweGE1NzQsIDB4YTQ3OCwgMHhhMzdjLCAweGEyODAsIDB4MDgwNCwKKwkweDFlM2MsIDB4YTU4NCwgMHhhNDg4LCAweGEzOGMsIDB4YTI5MCwgMHgwODA0LCAweDFlM2MsIDB4YTU5NCwKKwkweGE0OTgsIDB4YTM5YywgMHhhMmEwLCAweDA4MDQsIDB4MWUzYywgMHhhNWE0LCAweGE0YTgsIDB4YTNhYywKKwkweGEyYjAsIDB4MDgwNCwgMHgxZTNjLCAweGE1YjQsIDB4YTRiOCwgMHhhM2JjLCAweGEyYzAsIDB4MDgwNCwKKwkweDFlM2MsIDB4YTVjNCwgMHhhNGM4LCAweGEzY2MsIDB4YTJkMCwgMHgwODA0LCAweDFlM2MsIDB4YTVkNCwKKwkweGE0ZDgsIDB4YTNkYywgMHhhMmUwLCAweDA4MDQsIDB4MWUzYywgMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwKKwkweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxZGUwLCAweDFkZGUsIDB4MWRkZSwKKwkweDFkZGUsIDB4MWRkZSwgMHgxZGRlLCAweDFkZTgsIDB4MWRkZSwgMHgxZGRlLCAweDFkZGUsIDB4MWRkZSwKKwkweDFkZGUsIDB4MWRmMCwgMHgxZGRlLCAweDFkZGUsIDB4MWRkZSwgMHgxZGRlLCAweDFkZGUsIDB4MWRmOCwKKwkweDFkZGUsIDB4MWRkZSwgMHgxZGRlLCAweDFkZGUsIDB4MWRkZSwgMHgxZGZmLCAweDA4MGMsIDB4MGRkNSwKKwkweGE1NmMsIDB4YTQ3MCwgMHhhNzc0LCAweGE2NzgsIDB4YTM3YywgMHhhMjgwLCAweDA4MDQsIDB4MWUzYywKKwkweGE1ODQsIDB4YTQ4OCwgMHhhNzhjLCAweGE2OTAsIDB4YTM5NCwgMHhhMjk4LCAweDA4MDQsIDB4MWUzYywKKwkweGE1OWMsIDB4YTRhMCwgMHhhN2E0LCAweGE2YTgsIDB4YTNhYywgMHhhMmIwLCAweDA4MDQsIDB4MWUzYywKKwkweGE1YjQsIDB4YTRiOCwgMHhhN2JjLCAweGE2YzAsIDB4YTNjNCwgMHhhMmM4LCAweDA0ZTgsIDB4YTVjYywKKwkweGE0ZDAsIDB4YTdkNCwgMHhhNmQ4LCAweGEzZGMsIDB4YTJlMCwgMHgwNGIwLCAweGE4NjQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDFlLCAweDE1MTgsIDB4MDgwYywgMHgyMDg2LCAweDE5MDQsIDB4MWQwOSwKKwkweDkwMGUsIDB4MDgwNCwgMHgxZWE2LCAweGFiNjQsIDB4OTM5YywgMHgwMGZmLCAweDkzODYsIDB4MDA0OCwKKwkweDExODAsIDB4MDBjNiwgMHg3MDA0LCAweDIwNjAsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDMsIDB4MDBjZSwKKwkweDA5MDQsIDB4MWRiZCwgMHhhYjljLCAweDkwMTYsIDB4YWQ4YywgMHhhYzkwLCAweGFmOTQsIDB4YWU5OCwKKwkweDAwOTgsIDB4OTM4NiwgMHgwMDA4LCAweDA5MDQsIDB4MWRiZCwgMHgwODBjLCAweDBkZDUsIDB4YTk2NCwKKwkweDkxOGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMTMsIDB4MDkwNCwgMHgxZDZlLCAweDkxODYsIDB4MDAxYiwKKwkweDA5MDQsIDB4MWRiZCwgMHgwODBjLCAweDBkZDUsIDB4MjAwOSwgMHgwMzBmLCAweDIxMDQsIDB4ZDBmYywKKwkweDA1MzAsIDB4MDA2NiwgMHgyMDA5LCAweDAzMDYsIDB4MjEwNCwgMHg5MDg0LCAweDAwMzAsIDB4MTVjOCwKKwkweDIwMzEsIDB4MTAwMCwgMHgyMDBiLCAweDQwMDAsIDB4MjYwMCwgMHg5MzAyLCAweDkyOGIsIDB4MDAwMCwKKwkweGE4MmUsIDB4YTkzMiwgMHgwMjc4LCAweDkxMDUsIDB4MDE2OCwgMHgyMDExLCAweDAwMDAsIDB4MjYxOCwKKwkweDI2MDAsIDB4OTUwMCwgMHhhODFlLCAweDk0ODEsIDB4MDAwMCwgMHhhODIyLCAweGE4ODAsIDB4YzBmZCwKKwkweGE4ODIsIDB4MDAyMCwgMHhhODJmLCAweDAwMDAsIDB4YTgzMywgMHgwMDAwLCAweDAwNmUsIDB4N2IxMiwKKwkweDdhMTYsIDB4N2QwMiwgMHg3YzA2LCAweDdmMGEsIDB4N2UwZSwgMHg3ODJiLCAweDAwMDEsIDB4NzAwMCwKKwkweDgwMDAsIDB4NzAwMiwgMHhhODNjLCAweDkzMDAsIDB4YTgzZSwgMHhhODQwLCAweDkyMDEsIDB4YTg0MiwKKwkweDcwMGMsIDB4OTMwMCwgMHg3MDBlLCAweDcwMTAsIDB4OTIwMSwgMHg3MDEyLCAweDA4MGMsIDB4MjA4NiwKKwkweDA0MjgsIDB4MjAzMSwgMHgwMDgwLCAweDk1ODQsIDB4MDA3ZiwgMHgwMTA4LCAweDk2MzIsIDB4NzEyNCwKKwkweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDExOTgsIDB4YzE4NSwgMHg3MTI2LCAweDIwMDksIDB4MDMwNiwKKwkweDIxMDQsIDB4ZDBiNCwgMHgxOTA0LCAweDFlNGMsIDB4MjAwYiwgMHg0MDQwLCAweDIwMDksIDB4MWE3ZiwKKwkweDIxMDQsIDB4ODAwMCwgMHgwYTA0LCAweDFlNGMsIDB4MjAwYSwgMHgwODA0LCAweDFlNGMsIDB4YzE4ZCwKKwkweDcxMjYsIDB4ZDE4NCwgMHgxZDU4LCAweDA4MDQsIDB4MWU0YywgMHg5MDA2LCAweDAwMmUsIDB4MDAzZSwKKwkweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDAwNSwgMHgwODBjLCAweDBkZDUsIDB4MDAyNiwKKwkweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4NzgyYiwgMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwKKwkweDcwMDQsIDB4MDAxNiwgMHgwODBjLCAweDFjZmMsIDB4MDAxZSwgMHgyMDYwLCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMTE4LCAweGE4ODAsIDB4YzBiZCwgMHhhODgyLCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDYsIDB4MTE4MCwgMHgyMDYxLCAweDAxMDAsIDB4NjJjOCwgMHgyMDAxLCAweDAwZmEsIDB4ODAwMSwKKwkweDFkZjAsIDB4NjBjOCwgMHg5MjA2LCAweDFkYzAsIDB4NjBjNCwgMHhhODlhLCAweDYwYzgsIDB4YTg5NiwKKwkweDcwMDQsIDB4MjA2MCwgMHgwMGM2LCAweDA4MGMsIDB4YzhhNSwgMHgwMGNlLCAweDIwMDEsIDB4MTlmNSwKKwkweDIwMDQsIDB4OWMwNiwgMHgxMTYwLCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDI0MTAsIDB4MDgwYywKKwkweGE4OWIsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4YTcyYywgMHgwODBjLCAweDk4OTEsIDB4MDAyZSwKKwkweDA4MDQsIDB4MjAzNiwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHhhODU4LCAweDIwNDAsIDB4NzkyYywKKwkweDc4MmIsIDB4MDAwMiwgMHg5MTg0LCAweDA3MDAsIDB4MTkwNCwgMHgxZWFmLCAweDcwMDAsIDB4MDAwMiwKKwkweDIwMzYsIDB4MWYwNCwgMHgxZjg0LCAweDIwMzQsIDB4ODAwMSwgMHg3MDAyLCAweDcwMjcsIDB4MDAwMCwKKwkweGQxOWMsIDB4MTE1OCwgMHg4YWZmLCAweDA5MDQsIDB4MWY1MSwgMHgwODBjLCAweDFkMDMsIDB4MDkwNCwKKwkweDIwMzYsIDB4MDgwYywgMHgxZDAzLCAweDA4MDQsIDB4MjAzNiwgMHg3ODJiLCAweDAwMDQsIDB4ZDE5NCwKKwkweDAxNDgsIDB4YTg4MCwgMHhjMGZjLCAweGE4ODIsIDB4OGFmZiwgMHgxNTE4LCAweGE4N2MsIDB4YzBmNSwKKwkweGE4N2UsIDB4MDBmOCwgMHgwMDI2LCAweDAwMzYsIDB4YWIzYywgMHhhYTQwLCAweDAwMTYsIDB4NzkxMCwKKwkweGE4MmMsIDB4OTEwMCwgMHhhODJlLCAweDc5MTQsIDB4YTgzMCwgMHg5MTAxLCAweGE4MzIsIDB4MDAxZSwKKwkweDc4MTAsIDB4OTMxYSwgMHg3ODE0LCAweDkyMTMsIDB4NzgwMCwgMHhhODFlLCAweDc4MDQsIDB4YTgyMiwKKwkweGFiM2UsIDB4YWE0MiwgMHgwMDNlLCAweDAwMmUsIDB4MDgwYywgMHgyMGExLCAweGE4ODAsIDB4YzBmZCwKKwkweGE4ODIsIDB4MmEwMCwgMHhhODE2LCAweDI4MDAsIDB4YTg1YSwgMHgyYzAwLCAweGE4MTIsIDB4NzAwMywKKwkweDAwMDAsIDB4MjAwOSwgMHgwMzA2LCAweDIwMGIsIDB4NDgwMCwgMHg3MDI3LCAweDAwMDAsIDB4MDgwNCwKKwkweDIwMzYsIDB4MDBmNiwgMHgwMDI2LCAweDc4MWMsIDB4MDAwNiwgMHg3ODE4LCAweDAwMDYsIDB4MjA3OSwKKwkweDAxMDAsIDB4N2ExNCwgMHg5Mjg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MDAzNiwKKwkweDIwMTksIDB4MTAwMCwgMHg4MzE5LCAweDA5MGMsIDB4MGRkNSwgMHg3ODIwLCAweGQwYmMsIDB4MWRkMCwKKwkweDAwM2UsIDB4NzljOCwgMHgwMDBlLCAweDkxMDIsIDB4MDAxZSwgMHgwMDA2LCAweDAwMTYsIDB4NzljNCwKKwkweDAwMGUsIDB4OTEwMywgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHg5Mjg0LCAweDE5ODQsIDB4OTA4NSwKKwkweDAwMTIsIDB4NzgxNiwgMHgwMDJlLCAweDAwZmUsIDB4NzgyYiwgMHgwMDA4LCAweDcwMDMsIDB4MDAwMCwKKwkweDA4MGMsIDB4MWNmYywgMHgwODA0LCAweDIwMzYsIDB4ODAwMSwgMHg3MDAyLCAweDcwMjQsIDB4ODAwNCwKKwkweDcwMjYsIDB4ZDE5NCwgMHgwMTcwLCAweDc4MmMsIDB4ZDBmYywgMHgxOTA0LCAweDFlZjcsIDB4ZDE5YywKKwkweDE5MDQsIDB4MjAzMiwgMHg4YWZmLCAweDA5MDQsIDB4MjAzNiwgMHgwODBjLCAweDFkMDMsIDB4MDgwNCwKKwkweDIwMzYsIDB4MDAyNiwgMHgwMDM2LCAweGFiM2MsIDB4YWE0MCwgMHgwODBjLCAweDIwYTEsIDB4ZGQ5YywKKwkweDE5MDQsIDB4MWZmMSwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgxZmM1LCAweDFmYzUsIDB4MWZjNywgMHgxZmM1LCAweDFmYzUsIDB4MWZjNSwKKwkweDFmY2QsIDB4MWZjNSwgMHgxZmM1LCAweDFmYzUsIDB4MWZkMywgMHgxZmM1LCAweDFmYzUsIDB4MWZjNSwKKwkweDFmZDksIDB4MWZjNSwgMHgxZmM1LCAweDFmYzUsIDB4MWZkZiwgMHgxZmM1LCAweDFmYzUsIDB4MWZjNSwKKwkweDFmZTUsIDB4MWZjNSwgMHgxZmM1LCAweDFmYzUsIDB4MWZlYiwgMHgwODBjLCAweDBkZDUsIDB4YTA3YywKKwkweDkzMWEsIDB4YTA4MCwgMHg5MjEzLCAweDA4MDQsIDB4MWYyNiwgMHhhMDhjLCAweDkzMWEsIDB4YTA5MCwKKwkweDkyMTMsIDB4MDgwNCwgMHgxZjI2LCAweGEwOWMsIDB4OTMxYSwgMHhhMGEwLCAweDkyMTMsIDB4MDgwNCwKKwkweDFmMjYsIDB4YTBhYywgMHg5MzFhLCAweGEwYjAsIDB4OTIxMywgMHgwODA0LCAweDFmMjYsIDB4YTBiYywKKwkweDkzMWEsIDB4YTBjMCwgMHg5MjEzLCAweDA4MDQsIDB4MWYyNiwgMHhhMGNjLCAweDkzMWEsIDB4YTBkMCwKKwkweDkyMTMsIDB4MDgwNCwgMHgxZjI2LCAweGEwZGMsIDB4OTMxYSwgMHhhMGUwLCAweDkyMTMsIDB4MDgwNCwKKwkweDFmMjYsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4MjAxNCwgMHgyMDEyLCAweDIwMTIsIDB4MjAxMiwgMHgyMDEyLCAweDIwMTIsIDB4MjAxYSwKKwkweDIwMTIsIDB4MjAxMiwgMHgyMDEyLCAweDIwMTIsIDB4MjAxMiwgMHgyMDIwLCAweDIwMTIsIDB4MjAxMiwKKwkweDIwMTIsIDB4MjAxMiwgMHgyMDEyLCAweDIwMjYsIDB4MjAxMiwgMHgyMDEyLCAweDIwMTIsIDB4MjAxMiwKKwkweDIwMTIsIDB4MjAyYywgMHgwODBjLCAweDBkZDUsIDB4YTA3YywgMHg5MzFhLCAweGEwODAsIDB4OTIxMywKKwkweDA4MDQsIDB4MWYyNiwgMHhhMDk0LCAweDkzMWEsIDB4YTA5OCwgMHg5MjEzLCAweDA4MDQsIDB4MWYyNiwKKwkweGEwYWMsIDB4OTMxYSwgMHhhMGIwLCAweDkyMTMsIDB4MDgwNCwgMHgxZjI2LCAweGEwYzQsIDB4OTMxYSwKKwkweGEwYzgsIDB4OTIxMywgMHgwODA0LCAweDFmMjYsIDB4YTBkYywgMHg5MzFhLCAweGEwZTAsIDB4OTIxMywKKwkweDA4MDQsIDB4MWYyNiwgMHgwODA0LCAweDFmMjIsIDB4MDgwYywgMHgwZGQ1LCAweDAxMmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweDFhNjUsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDkwNCwKKwkweDIwODEsIDB4MjA3OSwgMHgwMDkwLCAweDIwMDksIDB4MDIwNywgMHgyMTBjLCAweGQxOTQsIDB4MDFiOCwKKwkweDIwMDksIDB4MDIwYywgMHgyMTBjLCAweDkxODQsIDB4MDAwMywgMHgwMTg4LCAweDA4MGMsIDB4ZWI5YSwKKwkweDIwMDEsIDB4MDEzMywgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHgwZGQ1LCAweDAwMTYsIDB4MjAwOSwKKwkweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDAwMWUsIDB4MjAwMSwgMHgwMjBjLCAweDIxMDIsIDB4MjAwOSwKKwkweDAyMDYsIDB4MjEwNCwgMHgyMDA5LCAweDAyMDMsIDB4MjEwYywgMHg5MTA2LCAweDExMjAsIDB4MjAwOSwKKwkweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDc4MmMsIDB4ZDBmYywgMHgwOWE4LCAweDA4MGMsIDB4MWVmMiwKKwkweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDE5NzgsIDB4NzgyYiwgMHgwMDA0LCAweDc4MmMsIDB4ZDBhYywKKwkweDFkZTgsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHg3ODJiLCAweDAwMDIsIDB4NzAwMywKKwkweDAwMDAsIDB4MDgwYywgMHgxY2ZjLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweGE4ODAsIDB4ZDBmYywKKwkweDExYTgsIDB4OGM2MCwgMHgyYzA1LCAweDkwMDUsIDB4MDExMCwgMHg4YTUxLCAweDAwMDUsIDB4YTAwNCwKKwkweDkwMDUsIDB4MDE2OCwgMHhhODVhLCAweDIwNDAsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwKKwkweDIwY2UsIDB4MjA2NSwgMHg4Y2ZmLCAweDA5MGMsIDB4MGRkNSwgMHg4YTUxLCAweDAwMDUsIDB4MjA1MCwKKwkweDAwMDUsIDB4YTg4MCwgMHhkMGZjLCAweDExYjgsIDB4OGE1MCwgMHg4YzYxLCAweDJjMDUsIDB4OTAwNSwKKwkweDExOTAsIDB4MjgwMCwgMHg5OTA2LCAweDAxMjAsIDB4YTAwMCwgMHg5MDA1LCAweDExMDgsIDB4MjkwMCwKKwkweDIwNDAsIDB4YTg1YSwgMHhhMDY0LCAweDkwODQsIDB4MDAwZiwgMHg5MDgwLCAweDIwZGUsIDB4MjA2NSwKKwkweDhjZmYsIDB4MDkwYywgMHgwZGQ1LCAweDAwMDUsIDB4MDAwMCwgMHgwMDFkLCAweDAwMjEsIDB4MDAyNSwKKwkweDAwMjksIDB4MDAyZCwgMHgwMDMxLCAweDAwMzUsIDB4MDAwMCwgMHgwMDFiLCAweDAwMjEsIDB4MDAyNywKKwkweDAwMmQsIDB4MDAzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAyMywgMHgwMDAwLCAweDAwMDAsIDB4MjBjMSwKKwkweDIwYmQsIDB4MjBjMSwgMHgyMGMxLCAweDIwY2IsIDB4MDAwMCwgMHgyMGMxLCAweDIwYzgsIDB4MjBjOCwKKwkweDIwYzUsIDB4MjBjOCwgMHgyMGM4LCAweDAwMDAsIDB4MjBjYiwgMHgyMGM4LCAweDAwMDAsIDB4MjBjMywKKwkweDIwYzMsIDB4MDAwMCwgMHgyMGMzLCAweDIwY2IsIDB4MDAwMCwgMHgyMGMzLCAweDIwYzksIDB4MjBjOSwKKwkweDIwYzksIDB4MDAwMCwgMHgyMGM5LCAweDAwMDAsIDB4MjBjYiwgMHgyMGM5LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwODYsIDB4YWI0MiwgMHhhYzNlLCAweGE4ODgsIDB4OTA1NSwgMHgwOTA0LCAweDIyY2QsIDB4Mjk0MCwKKwkweGEwNjQsIDB4OTBlYywgMHgwMDBmLCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDgsIDB4MTExOCwKKwkweDIwNjEsIDB4MjBjOSwgMHgwMGQwLCAweDlkZTAsIDB4MjBjZSwgMHg5ZDg2LCAweDAwMDcsIDB4MDEzMCwKKwkweDlkODYsIDB4MDAwZSwgMHgwMTE4LCAweDlkODYsIDB4MDAwZiwgMHgxMTIwLCAweGEwOGMsIDB4OTQyMiwKKwkweGEwOTAsIDB4OTMxYiwgMHgyYzA1LCAweDkwNjUsIDB4MTE0MCwgMHgwMzEwLCAweDA4MDQsIDB4MjJjZCwKKwkweGEwMDQsIDB4OTA0NSwgMHgwOTA0LCAweDIyY2QsIDB4MDhkOCwgMHgyYzA1LCAweDkwMDUsIDB4MDkwNCwKKwkweDIxYjUsIDB4ZGQ5YywgMHgxOTA0LCAweDIxNzEsIDB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGRkNSwKKwkweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDIxNDYsIDB4MjE0NiwgMHgyMTQ4LCAweDIxNDYsIDB4MjE0NiwKKwkweDIxNDYsIDB4MjE0ZSwgMHgyMTQ2LCAweDIxNDYsIDB4MjE0NiwgMHgyMTU0LCAweDIxNDYsIDB4MjE0NiwKKwkweDIxNDYsIDB4MjE1YSwgMHgyMTQ2LCAweDIxNDYsIDB4MjE0NiwgMHgyMTYwLCAweDIxNDYsIDB4MjE0NiwKKwkweDIxNDYsIDB4MjE2NiwgMHgyMTQ2LCAweDIxNDYsIDB4MjE0NiwgMHgyMTZjLCAweDA4MGMsIDB4MGRkNSwKKwkweGEwN2MsIDB4OTQyMiwgMHhhMDgwLCAweDkzMWIsIDB4MDgwNCwgMHgyMWFiLCAweGEwOGMsIDB4OTQyMiwKKwkweGEwOTAsIDB4OTMxYiwgMHgwODA0LCAweDIxYWIsIDB4YTA5YywgMHg5NDIyLCAweGEwYTAsIDB4OTMxYiwKKwkweDA4MDQsIDB4MjFhYiwgMHhhMGFjLCAweDk0MjIsIDB4YTBiMCwgMHg5MzFiLCAweDA4MDQsIDB4MjFhYiwKKwkweGEwYmMsIDB4OTQyMiwgMHhhMGMwLCAweDkzMWIsIDB4MDgwNCwgMHgyMWFiLCAweGEwY2MsIDB4OTQyMiwKKwkweGEwZDAsIDB4OTMxYiwgMHgwODA0LCAweDIxYWIsIDB4YTBkYywgMHg5NDIyLCAweGEwZTAsIDB4OTMxYiwKKwkweDA0ZDAsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRkNSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwKKwkweDIxOTMsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTEsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTgsIDB4MjE5MSwKKwkweDIxOTEsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTEsIDB4MjE5ZCwgMHgyMTkxLCAweDIxOTEsIDB4MjE5MSwKKwkweDIxOTEsIDB4MjE5MSwgMHgyMWEyLCAweDIxOTEsIDB4MjE5MSwgMHgyMTkxLCAweDIxOTEsIDB4MjE5MSwKKwkweDIxYTcsIDB4MDgwYywgMHgwZGQ1LCAweGEwN2MsIDB4OTQyMiwgMHhhMDgwLCAweDkzMWIsIDB4MDA5OCwKKwkweGEwOTQsIDB4OTQyMiwgMHhhMDk4LCAweDkzMWIsIDB4MDA3MCwgMHhhMGFjLCAweDk0MjIsIDB4YTBiMCwKKwkweDkzMWIsIDB4MDA0OCwgMHhhMGM0LCAweDk0MjIsIDB4YTBjOCwgMHg5MzFiLCAweDAwMjAsIDB4YTBkYywKKwkweDk0MjIsIDB4YTBlMCwgMHg5MzFiLCAweDA2MzAsIDB4MjMwMCwgMHg5NDA1LCAweDAxNjAsIDB4OGE1MSwKKwkweDA5MDQsIDB4MjJjZCwgMHg4YzYwLCAweDA4MDQsIDB4MjExZCwgMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwKKwkweDIyY2QsIDB4MDgwNCwgMHgyMGY4LCAweDhhNTEsIDB4MDkwNCwgMHgyMmNkLCAweDhjNjAsIDB4MmMwNSwKKwkweDkwMDUsIDB4MTE1OCwgMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwgMHgyMmNkLCAweGEwNjQsIDB4OTBlYywKKwkweDAwMGYsIDB4OWRlMCwgMHgyMGNlLCAweDJjMDUsIDB4MjA2MCwgMHhhODgwLCAweGMwZmMsIDB4YTg4MiwKKwkweDA4MDQsIDB4MjJjMiwgMHgyYzA1LCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLCAweDkzOTksIDB4MDAwMCwKKwkweGFjMmUsIDB4YWIzMiwgMHhkZDljLCAweDE5MDQsIDB4MjI1ZiwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwKKwkweDIxZmIsIDB4MjFmYiwgMHgyMWZkLCAweDIxZmIsIDB4MjFmYiwgMHgyMWZiLCAweDIyMGIsIDB4MjFmYiwKKwkweDIxZmIsIDB4MjFmYiwgMHgyMjE5LCAweDIxZmIsIDB4MjFmYiwgMHgyMWZiLCAweDIyMjcsIDB4MjFmYiwKKwkweDIxZmIsIDB4MjFmYiwgMHgyMjM1LCAweDIxZmIsIDB4MjFmYiwgMHgyMWZiLCAweDIyNDMsIDB4MjFmYiwKKwkweDIxZmIsIDB4MjFmYiwgMHgyMjUxLCAweDA4MGMsIDB4MGRkNSwgMHhhMTdjLCAweDI0MDAsIDB4OTEyMiwKKwkweGExODAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRkNSwgMHhhMDc0LCAweDk0MjAsIDB4YTA3OCwKKwkweDkzMTksIDB4MDgwNCwgMHgyMmJkLCAweGExOGMsIDB4MjQwMCwgMHg5MTIyLCAweGExOTAsIDB4MjMwMCwKKwkweDkxMWIsIDB4MGEwYywgMHgwZGQ1LCAweGEwODQsIDB4OTQyMCwgMHhhMDg4LCAweDkzMTksIDB4MDgwNCwKKwkweDIyYmQsIDB4YTE5YywgMHgyNDAwLCAweDkxMjIsIDB4YTFhMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywKKwkweDBkZDUsIDB4YTA5NCwgMHg5NDIwLCAweGEwOTgsIDB4OTMxOSwgMHgwODA0LCAweDIyYmQsIDB4YTFhYywKKwkweDI0MDAsIDB4OTEyMiwgMHhhMWIwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZDUsIDB4YTBhNCwKKwkweDk0MjAsIDB4YTBhOCwgMHg5MzE5LCAweDA4MDQsIDB4MjJiZCwgMHhhMWJjLCAweDI0MDAsIDB4OTEyMiwKKwkweGExYzAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRkNSwgMHhhMGI0LCAweDk0MjAsIDB4YTBiOCwKKwkweDkzMTksIDB4MDgwNCwgMHgyMmJkLCAweGExY2MsIDB4MjQwMCwgMHg5MTIyLCAweGExZDAsIDB4MjMwMCwKKwkweDkxMWIsIDB4MGEwYywgMHgwZGQ1LCAweGEwYzQsIDB4OTQyMCwgMHhhMGM4LCAweDkzMTksIDB4MDgwNCwKKwkweDIyYmQsIDB4YTFkYywgMHgyNDAwLCAweDkxMjIsIDB4YTFlMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywKKwkweDBkZDUsIDB4YTBkNCwgMHg5NDIwLCAweGEwZDgsIDB4OTMxOSwgMHgwODA0LCAweDIyYmQsIDB4OTA4MiwKKwkweDAwMWIsIDB4MDAwMiwgMHgyMjdkLCAweDIyN2IsIDB4MjI3YiwgMHgyMjdiLCAweDIyN2IsIDB4MjI3YiwKKwkweDIyOGEsIDB4MjI3YiwgMHgyMjdiLCAweDIyN2IsIDB4MjI3YiwgMHgyMjdiLCAweDIyOTcsIDB4MjI3YiwKKwkweDIyN2IsIDB4MjI3YiwgMHgyMjdiLCAweDIyN2IsIDB4MjJhNCwgMHgyMjdiLCAweDIyN2IsIDB4MjI3YiwKKwkweDIyN2IsIDB4MjI3YiwgMHgyMmIxLCAweDA4MGMsIDB4MGRkNSwgMHhhMTdjLCAweDI0MDAsIDB4OTEyMiwKKwkweGExODAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRkNSwgMHhhMDZjLCAweDk0MjAsIDB4YTA3MCwKKwkweDkzMTksIDB4MDQ5OCwgMHhhMTk0LCAweDI0MDAsIDB4OTEyMiwgMHhhMTk4LCAweDIzMDAsIDB4OTExYiwKKwkweDBhMGMsIDB4MGRkNSwgMHhhMDg0LCAweDk0MjAsIDB4YTA4OCwgMHg5MzE5LCAweDA0MzAsIDB4YTFhYywKKwkweDI0MDAsIDB4OTEyMiwgMHhhMWIwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZDUsIDB4YTA5YywKKwkweDk0MjAsIDB4YTBhMCwgMHg5MzE5LCAweDAwYzgsIDB4YTFjNCwgMHgyNDAwLCAweDkxMjIsIDB4YTFjOCwKKwkweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZDUsIDB4YTBiNCwgMHg5NDIwLCAweGEwYjgsIDB4OTMxOSwKKwkweDAwNjAsIDB4YTFkYywgMHgyNDAwLCAweDkxMjIsIDB4YTFlMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywKKwkweDBkZDUsIDB4YTBjYywgMHg5NDIwLCAweGEwZDAsIDB4OTMxOSwgMHhhYzFlLCAweGFiMjIsIDB4YTg4MCwKKwkweGMwZmQsIDB4YTg4MiwgMHgyODAwLCAweGE4NWEsIDB4MmMwMCwgMHhhODEyLCAweDJhMDAsIDB4YTgxNiwKKwkweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDkwMDYsIDB4MDAyOCwgMHgwMDhlLCAweDAwZGUsIDB4MDBjZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwYmMsIDB4MTkwYywKKwkweDBkY2UsIDB4OTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4MjJlZSwgMHgxZWYyLCAweDIyZWUsIDB4MjJlNCwKKwkweDIyZTcsIDB4MjJlYSwgMHgyMmU3LCAweDIyZWEsIDB4MDgwYywgMHgxZWYyLCAweDAwMDUsIDB4MDgwYywKKwkweDExYTMsIDB4MDAwNSwgMHgwODBjLCAweDFlZjIsIDB4MDgwYywgMHgxMWEzLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjYwMCwgMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwgMHgwMjYwLCAweDIwNjksIDB4MTgwMCwKKwkweDc4MTcsIDB4MDAwMCwgMHg3ODliLCAweDA4MTQsIDB4NzhhMywgMHgwNDA2LCAweDc4OWYsIDB4MDQxMCwKKwkweDIwMDksIDB4MDEzYiwgMHgyMDBiLCAweDA0MDAsIDB4NzgxYiwgMHgwMDAyLCAweDc4M2IsIDB4MDAxZiwKKwkweDc4MzcsIDB4MDAyMCwgMHg3ODAzLCAweDE2MDAsIDB4MDEyZSwgMHgwMDA1LCAweDIwOTEsIDB4MjYwMCwKKwkweDc4MWMsIDB4ZDBhNCwgMHgxOTBjLCAweDI0MGQsIDB4NzkwMCwgMHhkMWRjLCAweDExMTgsIDB4OTA4NCwKKwkweDAwMDYsIDB4MDAxYSwgMHg5MDg0LCAweDAwMGUsIDB4MDAwMiwgMHgyMzM1LCAweDIzMmQsIDB4N2UxZSwKKwkweDIzMmQsIDB4MjMyZiwgMHgyMzJmLCAweDIzMmYsIDB4MjMyZiwgMHg3ZTA0LCAweDIzMmQsIDB4MjMzMSwKKwkweDIzMmQsIDB4MjMyZiwgMHgyMzJkLCAweDIzMmYsIDB4MjMyZCwgMHgwODBjLCAweDBkZDUsIDB4MDAzMSwKKwkweDAwMjAsIDB4MDgwYywgMHg3ZTA0LCAweDA4MGMsIDB4N2UxZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDgwYywgMHhlYjlhLCAweDc5MzAsIDB4OTE4NCwgMHgwMDAzLCAweDAxYzAsIDB4MjAwMSwKKwkweDE5ZjUsIDB4MjAwNCwgMHg5MDA1LCAweDAxNzAsIDB4MjAwMSwgMHgwMTMzLCAweDIwMDQsIDB4OTAwNSwKKwkweDA5MGMsIDB4MGRkNSwgMHgwMGM2LCAweDIwMDEsIDB4MTlmNSwgMHgyMDY0LCAweDA4MGMsIDB4YzhhNSwKKwkweDAwY2UsIDB4MDBmOCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDAwZDAsIDB4OTE4NCwKKwkweDAwMTQsIDB4MDFhMCwgMHg2YTAwLCAweDkyODYsIDB4MDAwMywgMHgwMTYwLCAweDA4MGMsIDB4NzQzZSwKKwkweDExMzgsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwgMHgwODBjLCAweDczNmEsIDB4MDAxMCwKKwkweDA4MGMsIDB4NWY2YywgMHgwODBjLCAweDdlY2QsIDB4MDA0MSwgMHgwMDE4LCAweDkxODQsIDB4OTU0MCwKKwkweDFkYzgsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwKKwkweDAwNTYsIDB4MjA3MSwgMHgxYTYxLCAweDA4MGMsIDB4MWFlYywgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MmUwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzEyOCwKKwkweDIwMDEsIDB4MTk2ZSwgMHgyMTAyLCAweDIwMDEsIDB4MTk3NiwgMHgyMTAyLCAweDIwMDEsIDB4MDEzYiwKKwkweDIxMDIsIDB4MjA3OSwgMHgwMjAwLCAweDIwMDEsIDB4MDIwMSwgMHg3ODllLCAweDc4YTMsIDB4MDIwMCwKKwkweDkxOTgsIDB4MDAwNywgMHg4MzFjLCAweDgzMWMsIDB4ODMxYywgMHg5Mzk4LCAweDAwMDUsIDB4MjMyMCwKKwkweDkxODIsIDB4MDIwNCwgMHgxMjMwLCAweDIwMTEsIDB4MDAwOCwgMHg4NDIzLCAweDg0MjMsIDB4ODQyMywKKwkweDA0ODgsIDB4OTE4MiwgMHgwMjRjLCAweDEyNDAsIDB4MjAxMSwgMHgwMDA3LCAweDg0MDMsIDB4ODAwMywKKwkweDk0MDAsIDB4OTQwMCwgMHg5NDIwLCAweDA0MzAsIDB4OTE4MiwgMHgwMmJjLCAweDEyMzgsIDB4MjAxMSwKKwkweDAwMDYsIDB4ODQwMywgMHg4MDAzLCAweDk0MDAsIDB4OTQyMCwgMHgwMGUwLCAweDkxODIsIDB4MDM0YywKKwkweDEyMzAsIDB4MjAxMSwgMHgwMDA1LCAweDg0MDMsIDB4ODAwMywgMHg5NDIwLCAweDAwOTgsIDB4OTE4MiwKKwkweDA0MmMsIDB4MTIyOCwgMHgyMDExLCAweDAwMDQsIDB4ODQyMywgMHg4NDIzLCAweDAwNTgsIDB4OTE4MiwKKwkweDA1OWMsIDB4MTIyOCwgMHgyMDExLCAweDAwMDMsIDB4ODQwMywgMHg5NDIwLCAweDAwMTgsIDB4MjAxMSwKKwkweDAwMDIsIDB4ODQyMywgMHg5NDgyLCAweDAyMjgsIDB4ODAwMiwgMHg4MDIwLCAweDgzMDEsIDB4OTQwMiwKKwkweDAxMTAsIDB4MDIwOCwgMHg4MzIxLCAweDgyMTcsIDB4ODIwMywgMHg5NDA1LCAweDc4OWEsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODE0LCAweDkwODQsIDB4ZmZjMCwKKwkweDkxMGQsIDB4NjkxNiwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwKKwkweDkwMDUsIDB4NjgxMCwgMHgwMTEwLCAweGMwYTUsIDB4MDAwOCwgMHhjMGE0LCAweDY4MTIsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODEwLCAweDkwODQsIDB4ZmZmOCwKKwkweDkxMGQsIDB4NjkxMiwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHg3OTM4LCAweDA4MGMsIDB4MGRjZSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc5MDIsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHg3OTAyLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4MDBmZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDIwNjEsIDB4MDEwMCwKKwkweDIwNzEsIDB4MTgwMCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYzdjLCAweDA4MGMsIDB4MmI5NywKKwkweDYwNTQsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg5MDg0LCAweDAwMGMsIDB4NjE1MCwKKwkweDkxOGMsIDB4ZmZmMywgMHg5MTA1LCAweDYwNTIsIDB4NjA1MCwgMHg5MDg0LCAweGIxN2YsIDB4OTA4NSwKKwkweDIwMDAsIDB4NjA1MiwgMHgyMDA5LCAweDE5OWMsIDB4MjAxMSwgMHgxOTlkLCAweDYzNTgsIDB4OTM5YywKKwkweDM4ZjAsIDB4MjMyMCwgMHgwODBjLCAweDJiZGIsIDB4MTIzOCwgMHg5MzlkLCAweDQwMDMsIDB4OTRhNSwKKwkweDg2MDMsIDB4MjMwYSwgMHgyNDEyLCAweDAwMzAsIDB4OTM5ZCwgMHgwMjAzLCAweDk0YTUsIDB4ODYwMywKKwkweDIzMGEsIDB4MjQxMiwgMHg5MDA2LCAweDA4MGMsIDB4MmJjNiwgMHg5MDA2LCAweDA4MGMsIDB4MmJhOSwKKwkweDIwYTksIDB4MDAxMiwgMHgxZDA0LCAweDI0NjIsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4MjQ2MiwKKwkweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjA1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwKKwkweGRmZmYsIDB4NjA1MiwgMHg2MDI0LCAweDYwMjYsIDB4MDgwYywgMHgyOGI1LCAweDIwMDksIDB4MDBlZiwKKwkweDYxMzIsIDB4NjEzNiwgMHgwODBjLCAweDI4YzUsIDB4NjBlNywgMHgwMDAwLCAweDYxZWEsIDB4NjBlMywKKwkweDAwMDgsIDB4NjA0YiwgMHhmN2Y3LCAweDYwNDMsIDB4MDAwMCwgMHg2MDJmLCAweDAwODAsIDB4NjAyZiwKKwkweDAwMDAsIDB4NjAwNywgMHgzNDlmLCAweDYwYmIsIDB4MDAwMCwgMHgyMGE5LCAweDAwMTgsIDB4NjBiZiwKKwkweDAwMDAsIDB4MWYwNCwgMHgyNDhmLCAweDYwYmIsIDB4MDAwMCwgMHg2MGJmLCAweDAxMDgsIDB4NjBiZiwKKwkweDAwMTIsIDB4NjBiZiwgMHgwNDA1LCAweDYwYmYsIDB4MDAxNCwgMHg2MGJmLCAweDAzMjAsIDB4NjBiZiwKKwkweDAwMTgsIDB4NjAxYiwgMHgwMGYwLCAweDYwMWYsIDB4MDAxZSwgMHg2MDBmLCAweDAwNmIsIDB4NjAyYiwKKwkweDQwMmYsIDB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTQwLCAweDc4YzMsIDB4MDA4MCwKKwkweDc4YzMsIDB4MDA4MywgMHg3OGMzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzNSwKKwkweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDE4MzQsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHg2MTI0LCAweDAwNjYsIDB4MjAzMSwKKwkweDE4MzcsIDB4MjYzNCwgMHg5NmI0LCAweDAwMjgsIDB4MDA2ZSwgMHgxMTM4LCAweDYwMjAsIDB4ZDFiYywKKwkweDAxMjAsIDB4ZDBiYywgMHgxMTY4LCAweGQwYjQsIDB4MTE5OCwgMHg5MTg0LCAweDVlMmMsIDB4MTExOCwKKwkweDkxODQsIDB4MDAwNywgMHgwMGFhLCAweDkxOTUsIDB4MDAwNCwgMHg5Mjg0LCAweDAwMDcsIDB4MDA4MiwKKwkweDAwMTYsIDB4MjAwMSwgMHgxODhiLCAweDIwMGMsIDB4ZDE4NCwgMHgwMDFlLCAweDBkNzAsIDB4MGM5OCwKKwkweDAwMTYsIDB4MjAwMSwgMHgxODhiLCAweDIwMGMsIDB4ZDE5NCwgMHgwMDFlLCAweDBkMzAsIDB4MGM1OCwKKwkweDI1MTIsIDB4MjRmOCwgMHgyNGZiLCAweDI0ZmUsIDB4MjUwMywgMHgyNTA1LCAweDI1MDksIDB4MjUwZCwKKwkweDA4MGMsIDB4OTA5NCwgMHgwMGI4LCAweDA4MGMsIDB4OTE2MywgMHgwMGEwLCAweDA4MGMsIDB4OTE2MywKKwkweDA4MGMsIDB4OTA5NCwgMHgwMDc4LCAweDAwOTksIDB4MDA2OCwgMHgwODBjLCAweDkwOTQsIDB4MDA3OSwKKwkweDAwNDgsIDB4MDgwYywgMHg5MTYzLCAweDAwNTksIDB4MDAyOCwgMHgwODBjLCAweDkxNjMsIDB4MDgwYywKKwkweDkwOTQsIDB4MDAyOSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBhNiwKKwkweDYxMjQsIDB4NjAyOCwgMHhkMDljLCAweDAxMTgsIDB4ZDE5YywgMHgxOTA0LCAweDI3N2EsIDB4ZDFmNCwKKwkweDE5MGMsIDB4MGRjZSwgMHgwODBjLCAweDc0M2UsIDB4MDkwNCwgMHgyNTZkLCAweDA4MGMsIDB4ZDM4OCwKKwkweDExMjAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDMsIDB4MDU3MCwgMHg2MDI0LCAweDkwODQsIDB4MTgwMCwKKwkweDA1NTAsIDB4MDgwYywgMHg3NDYxLCAweDAxMTgsIDB4MDgwYywgMHg3NDRmLCAweDE1MjAsIDB4NjAyNywKKwkweDAwMjAsIDB4NjA0MywgMHgwMDAwLCAweDA4MGMsIDB4ZDM4OCwgMHgwMTY4LCAweDA4MGMsIDB4NzQ2MSwKKwkweDExNTAsIDB4MjAwMSwgMHgxOWE2LCAweDIwMDMsIDB4MDAwMSwgMHg2MDI3LCAweDE4MDAsIDB4MDgwYywKKwkweDcyY2UsIDB4MDgwNCwgMHgyNzdkLCAweDcwYTQsIDB4OTAwNSwgMHgxMTUwLCAweDcwYTcsIDB4MDAwMSwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NzQ5NSwgMHgwMGRlLCAweDE5MDQsIDB4Mjc3ZCwKKwkweDA4MGMsIDB4NzcyZSwgMHgwNDI4LCAweDA4MGMsIDB4NzQ2MSwgMHgxNTkwLCAweDYwMjQsIDB4OTA4NCwKKwkweDE4MDAsIDB4MTEwOCwgMHgwNDY4LCAweDA4MGMsIDB4NzcyZSwgMHgwODBjLCAweDc3MjQsIDB4MDgwYywKKwkweDYwYWQsIDB4MDgwYywgMHg3MzZhLCAweDA4MDQsIDB4Mjc3YSwgMHhkMWFjLCAweDE1MDgsIDB4NjAyNCwKKwkweGQwZGMsIDB4MTE3MCwgMHhkMGU0LCAweDExNzgsIDB4ZDBkNCwgMHgxMTkwLCAweGQwY2MsIDB4MDEzMCwKKwkweDcwOTgsIDB4OTA4NiwgMHgwMDI4LCAweDExMTAsIDB4MDgwYywgMHg3NjExLCAweDA4MDQsIDB4Mjc3YSwKKwkweDA4MGMsIDB4NzcyOSwgMHgwMDQ4LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLCAweDAwMDIsIDB4MDAyMCwKKwkweDA4MGMsIDB4NzU3NiwgMHgwODA0LCAweDI3N2EsIDB4MDgwYywgMHg3NmFjLCAweDA4MDQsIDB4Mjc3YSwKKwkweDYyMjAsIDB4ZDFiYywgMHgwMTM4LCAweGQyYmMsIDB4MTkwNCwgMHgyN2VkLCAweGQyYjQsIDB4MTkwNCwKKwkweDI4MDAsIDB4MDAwMCwgMHhkMWFjLCAweDA5MDQsIDB4MjY4ZiwgMHgwMDM2LCAweDYzMjgsIDB4YzNiYywKKwkweDYzMmEsIDB4MDAzZSwgMHgwODBjLCAweDc0M2UsIDB4MTFjMCwgMHg2MDI3LCAweDAwMjAsIDB4MDAwNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwODBjLCAweDc0NTgsIDB4MTE1OCwgMHgwODBjLCAweDc3MjQsIDB4MDgwYywKKwkweDYwYWQsIDB4MDgwYywgMHg3MzZhLCAweDAwM2UsIDB4MDAyZSwgMHgwMDBlLCAweDAwYWUsIDB4MDAwNSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMDBlLCAweDA4MGMsIDB4NzQxNiwgMHgwMDE2LCAweDAwNDYsIDB4MDBjNiwKKwkweDY0NGMsIDB4OTQ4NiwgMHhmMGYwLCAweDExMzgsIDB4MjA2MSwgMHgwMTAwLCAweDY0NGEsIDB4NjA0MywKKwkweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDc0ZGEsIDB4OTQ4YywgMHhmZjAwLCAweDcwMzgsIDB4ZDA4NCwKKwkweDAxNzgsIDB4OTE4NiwgMHhmODAwLCAweDExNjAsIDB4NzA0OCwgMHhkMDg0LCAweDExNDgsIDB4YzA4NSwKKwkweDcwNGEsIDB4MDAzNiwgMHgyNDE4LCAweDIwMTEsIDB4ODAxNiwgMHgwODBjLCAweDRiN2YsIDB4MDAzZSwKKwkweDA4MGMsIDB4ZDM4MSwgMHgxOTA0LCAweDI2NmMsIDB4OTE5NiwgMHhmZjAwLCAweDA1YTgsIDB4NzA2MCwKKwkweDkwODQsIDB4MDBmZiwgMHg4MTBmLCAweDgxZmYsIDB4MDExMCwgMHg5MTE2LCAweDA1NjgsIDB4NzEzMCwKKwkweGQxODQsIDB4MTU1MCwgMHgwODBjLCAweDMzNzgsIDB4MDEyOCwgMHhjMThkLCAweDcxMzIsIDB4MDgwYywKKwkweDZhMDQsIDB4MTUxMCwgMHg2MjQwLCAweDkyOTQsIDB4MDAxMCwgMHgwMTMwLCAweDYyNDgsIDB4OTI5NCwKKwkweGZmMDAsIDB4OTI5NiwgMHhmZjAwLCAweDAxYzAsIDB4NzAzMCwgMHhkMDhjLCAweDA5MDQsIDB4MjY2YywKKwkweDcwMzgsIDB4ZDA4YywgMHgxMTQwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxYWMsIDB4MTkwNCwKKwkweDI2NmMsIDB4YzFhZCwgMHgyMTAyLCAweDAwMzYsIDB4NzNkOCwgMHgyMDExLCAweDgwMTMsIDB4MDgwYywKKwkweDRiN2YsIDB4MDAzZSwgMHgwODA0LCAweDI2NmMsIDB4NzAzOCwgMHhkMDhjLCAweDExNDAsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhkMWFjLCAweDE5MDQsIDB4MjY2YywgMHhjMWFkLCAweDIxMDIsIDB4MDAzNiwKKwkweDczZDgsIDB4MjAxMSwgMHg4MDEzLCAweDA4MGMsIDB4NGI3ZiwgMHgwMDNlLCAweDcxMzAsIDB4YzE4NSwKKwkweDcxMzIsIDB4MjAxMSwgMHgxODQ4LCAweDIyMGMsIDB4ZDFhNCwgMHgwMWYwLCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsIDB4ODc5YSwgMHgyMDE5LCAweDAwMGUsIDB4MDBjNiwKKwkweDIwNjEsIDB4MDAwMCwgMHgwODBjLCAweGU2YWUsIDB4MDBjZSwgMHg5NDg0LCAweDAwZmYsIDB4OTA4MCwKKwkweDMzODQsIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMTIwLCAweDkwMDYsIDB4MjAwOSwKKwkweDAwMGUsIDB4MDgwYywgMHhlNzNhLCAweDAwMWUsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDIsIDB4MjAxOSwKKwkweDAwMDQsIDB4MDgwYywgMHgzMWU5LCAweDAwMWUsIDB4MDA3OCwgMHgwMTU2LCAweDAwYjYsIDB4MjBhOSwKKwkweDAwN2YsIDB4OTAwZSwgMHgwODBjLCAweDY2OTksIDB4MTExMCwgMHgwODBjLCAweDYwYzcsIDB4ODEwOCwKKwkweDFmMDQsIDB4MjY2MiwgMHgwMGJlLCAweDAxNWUsIDB4MDBjZSwgMHgwMDRlLCAweDA4MGMsIDB4YWViNCwKKwkweDYwZTMsIDB4MDAwMCwgMHgwMDFlLCAweDIwMDEsIDB4MTgwMCwgMHgyMDE0LCAweDkyOTYsIDB4MDAwNCwKKwkweDExNzAsIDB4ZDE5YywgMHgxMWEwLCAweDIwMTEsIDB4MTgwYywgMHgyMjE0LCAweGQyOWMsIDB4MTEyMCwKKwkweDYyMDQsIDB4OTI5NSwgMHgwMDAyLCAweDYyMDYsIDB4NjIyOCwgMHhjMjlkLCAweDYyMmEsIDB4MjAwMywKKwkweDAwMDEsIDB4MjAwMSwgMHgxODI2LCAweDIwMDMsIDB4MDAwMCwgMHg2MDI3LCAweDAwMjAsIDB4ZDE5NCwKKwkweDA5MDQsIDB4Mjc3YSwgMHgwMDE2LCAweDYyMjAsIDB4ZDJiNCwgMHgwOTA0LCAweDI3MTcsIDB4MDgwYywKKwkweDg2MzYsIDB4MDgwYywgMHhhMzU2LCAweDYwMjcsIDB4MDAwNCwgMHgwMGY2LCAweDIwMTksIDB4MTllZiwKKwkweDIzMDQsIDB4OTA3ZCwgMHgwOTA0LCAweDI2ZTYsIDB4NzgwNCwgMHg5MDg2LCAweDAwMzIsIDB4MTVmMCwKKwkweDAwZDYsIDB4MDBjNiwgMHgwMGU2LCAweDAwOTYsIDB4MjA2OSwgMHgwMTQwLCAweDc4MmMsIDB4Njg1ZSwKKwkweDc4MDgsIDB4Njg1YSwgMHg2MDQzLCAweDAwMDIsIDB4MjAwMSwgMHgwMDAzLCAweDgwMDEsIDB4MWRmMCwKKwkweDYwNDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwM2MsIDB4ODAwMSwgMHgxZGYwLCAweDA4MGMsIDB4MmQ1ZSwKKwkweDIwMDEsIDB4MDAxZSwgMHg4MDAxLCAweDAyNDAsIDB4MjBhOSwgMHgwMDA5LCAweDA4MGMsIDB4MmM1NywKKwkweDY5MDQsIDB4ZDFkYywgMHgxMTQwLCAweDBjYjAsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwKKwkweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsIDB4NzgxNCwKKwkweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDJmNjAsIDB4MDgwYywgMHhhZjQzLCAweDAwOWUsIDB4MDBlZSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMGZlLCAweDAwMWUsIDB4MDBhZSwgMHgwMDA1LCAweDAwZmUsIDB4MDBkNiwKKwkweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmQ1ZSwKKwkweDAwZGUsIDB4MDBjNiwgMHgyMDYxLCAweDE5ZTYsIDB4NjAyOCwgMHgwODBjLCAweGQzODgsIDB4MDEyMCwKKwkweDkwOWEsIDB4MDAwMywgMHgxMjU4LCAweDAwMTgsIDB4OTA5YSwgMHgwMGM4LCAweDEyMzgsIDB4ODAwMCwKKwkweDYwMmEsIDB4MDBjZSwgMHgwODBjLCAweGEzMzIsIDB4MDgwNCwgMHgyNzc5LCAweDIwNjEsIDB4MDEwMCwKKwkweDYyYzAsIDB4MDgwYywgMHhhZDNhLCAweDIwMTksIDB4MTllZiwgMHgyMzA0LCAweDkwNjUsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAyNywgMHgwODBjLCAweGFmYmUsIDB4MDBjZSwgMHgwODA0LCAweDI3NzksIDB4ZDJiYywKKwkweDA5MDQsIDB4Mjc2MCwgMHgwODBjLCAweDg2NDMsIDB4NjAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwKKwkweDAwMTAsIDB4NjAxNiwgMHg2MDI3LCAweDAwMDQsIDB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwKKwkweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmQ1ZSwgMHgwMGRlLCAweDAwYzYsIDB4MjA2MSwKKwkweDE5ZTYsIDB4NjA0NCwgMHgwODBjLCAweGQzODgsIDB4MDEyMCwgMHg5MDlhLCAweDAwMDMsIDB4MTY1OCwKKwkweDAwMTgsIDB4OTA5YSwgMHgwMGM4LCAweDE2MzgsIDB4ODAwMCwgMHg2MDQ2LCAweDYwM2MsIDB4MDBjZSwKKwkweDkwMDUsIDB4MDViOCwgMHgyMDA5LCAweDA3ZDAsIDB4MDgwYywgMHg4NjNiLCAweDkwODAsIDB4MDAwOCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDA2LCAweDExMzgsIDB4NjExNCwgMHg5MThjLCAweDE5ODQsIDB4OTE4ZCwKKwkweDAwMTIsIDB4NjExNiwgMHgwNDMwLCAweDkwODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODYsIDB4MDAwOSwKKwkweDBkOTgsIDB4NjExNCwgMHg5MThjLCAweDE5ODQsIDB4OTE4ZCwgMHgwMDE2LCAweDYxMTYsIDB4MDBjOCwKKwkweDYwMjcsIDB4MDAwNCwgMHgwMGIwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTZhYywKKwkweDAwM2UsIDB4MjAxOSwgMHgxOWY1LCAweDIzMDQsIDB4OTA2NSwgMHgwMTUwLCAweDIwMDksIDB4MDA0ZiwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA5LCAweDExMTAsIDB4MjAwOSwgMHgwMDRmLCAweDA4MGMsIDB4YWZiZSwKKwkweDAwY2UsIDB4MDAxZSwgMHhkMTljLCAweDA5MDQsIDB4MjdlOCwgMHg3MDM4LCAweGQwYWMsIDB4MTkwNCwKKwkweDI3YzEsIDB4MDAxNiwgMHgwMTU2LCAweDYwMjcsIDB4MDAwOCwgMHg2MDUwLCAweDkwODUsIDB4MDA0MCwKKwkweDYwNTIsIDB4NjA1MCwgMHg5MDg0LCAweGZiY2YsIDB4NjA1MiwgMHgwODBjLCAweDJjNzYsIDB4OTA4NSwKKwkweDIwMDAsIDB4NjA1MiwgMHgyMGE5LCAweDAwMTIsIDB4MWQwNCwgMHgyNzk0LCAweDA4MGMsIDB4ODY2YSwKKwkweDFmMDQsIDB4Mjc5NCwgMHg2MDUwLCAweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGRmYmYsIDB4NjA1MiwKKwkweDIwYTksIDB4MDAyOCwgMHhhMDAxLCAweDFmMDQsIDB4MjdhMiwgMHg2MTUwLCAweDkxODUsIDB4MTQwMCwKKwkweDYwNTIsIDB4MjBhOSwgMHgwMzY2LCAweDFkMDQsIDB4MjdhYiwgMHgwODBjLCAweDg2NmEsIDB4NjAyMCwKKwkweGQwOWMsIDB4MTEzMCwgMHgwMTVlLCAweDYxNTIsIDB4MDAxZSwgMHg2MDI3LCAweDAwMDgsIDB4MDQ4MCwKKwkweDA4MGMsIDB4MmMzZSwgMHgxZjA0LCAweDI3YWIsIDB4MDE1ZSwgMHg2MTUyLCAweDAwMWUsIDB4NjAyNywKKwkweDAwMDgsIDB4MDAxNiwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgwODBjLCAweGFlYjQsIDB4NjBlMywKKwkweDAwMDAsIDB4MDgwYywgMHhlYjc5LCAweDA4MGMsIDB4ZWI5NCwgMHgwODBjLCAweDU3NjEsIDB4ZDBmYywKKwkweDExMzgsIDB4MDgwYywgMHhkMzgxLCAweDExMjAsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NzQ4NSwKKwkweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweDJjN2MsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwMywgMHgwMDA0LCAweDYwMjcsIDB4MDAwOCwgMHgwODBjLCAweDBiYWUsIDB4MDAxZSwKKwkweDkxOGMsIDB4ZmZkMCwgMHg2MTI2LCAweDAwYWUsIDB4MDAwNSwgMHgwMDE2LCAweDIwMDEsIDB4MTg4YiwKKwkweDIwMGMsIDB4ZDE4NCwgMHgwMDFlLCAweDA5MDQsIDB4MjU5YSwgMHgwMDE2LCAweDIwMDksIDB4MjdmOSwKKwkweDAwZDAsIDB4MjAwMSwgMHgxODhiLCAweDIwMGMsIDB4YzE4NCwgMHgyMTAyLCAweDAwMWUsIDB4MGM0MCwKKwkweDAwMTYsIDB4MjAwMSwgMHgxODhiLCAweDIwMGMsIDB4ZDE5NCwgMHgwMDFlLCAweDA5MDQsIDB4MjU5YSwKKwkweDAwMTYsIDB4MjAwOSwgMHgyODBjLCAweDAwMzgsIDB4MjAwMSwgMHgxODhiLCAweDIwMGMsIDB4YzE5NCwKKwkweDIxMDIsIDB4MDAxZSwgMHgwOGE4LCAweDYwMjgsIDB4YzBiYywgMHg2MDJhLCAweDIwMDEsIDB4MDE1NiwKKwkweDIwMDMsIDB4YmM5MSwgMHg4MDAwLCAweDIwMDMsIDB4ZmZmZiwgMHg2MDQzLCAweDAwMDEsIDB4MDgwYywKKwkweDJjNzYsIDB4NjAyNywgMHgwMDgwLCAweDYwMTcsIDB4MDAwMCwgMHg2MDQzLCAweDAwMDAsIDB4MDgxNywKKwkweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBlNiwgMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcxZDAsIDB4NzBkMiwgMHg5MTE2LCAweDA1ZTgsIDB4ODFmZiwKKwkweDAxYTAsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmM3YywgMHgyMDExLCAweDgwMTEsIDB4MjAxOSwKKwkweDAxMGUsIDB4MjMxYywgMHg5MzllLCAweDAwMDcsIDB4MTExOCwgMHgyMDE5LCAweDAwMDEsIDB4MDAxMCwKKwkweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDRiN2YsIDB4MDQzOCwgMHgyMDAxLCAweDE5YTcsIDB4MjAwYywKKwkweDgxZmYsIDB4MTE0MCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMGI0LCAweDAxMTgsIDB4MjAxOSwKKwkweDAwMDMsIDB4MDAwOCwgMHgyMTE4LCAweDIwMTEsIDB4ODAxMiwgMHgwODBjLCAweDRiN2YsIDB4MDgwYywKKwkweDU3NjEsIDB4ZDBmYywgMHgxMTg4LCAweDA4MGMsIDB4ZDM4MSwgMHgxMTcwLCAweDAwYzYsIDB4MDgwYywKKwkweDI5MTAsIDB4MDgwYywgMHhhNjEzLCAweDIwNjEsIDB4MDEwMCwgMHgyMDE5LCAweDAwMjgsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwYywgMHgzMWU5LCAweDAwY2UsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MjAyOCwgMHg5MThjLCAweDAwZmYsIDB4MjEzMCwKKwkweDkwOTQsIDB4ZmYwMCwgMHgxMWYwLCAweDIwMTEsIDB4MTgzNywgMHgyMjE0LCAweGQyYWMsIDB4MTFjOCwKKwkweDgxZmYsIDB4MDFlOCwgMHgyMDExLCAweDE4MWYsIDB4MjIwNCwgMHg5MTA2LCAweDExOTAsIDB4MjAxMSwKKwkweDE4MjAsIDB4MjIxNCwgMHg5Mjk0LCAweGZmMDAsIDB4OTU4NCwgMHhmZjAwLCAweDkyMDYsIDB4MTE0OCwKKwkweDIwMTEsIDB4MTgyMCwgMHgyMjE0LCAweDkyOTQsIDB4MDBmZiwgMHg5NTg0LCAweDAwZmYsIDB4OTIwNiwKKwkweDExMjAsIDB4MjUwMCwgMHgwODBjLCAweDgxNDIsIDB4MDA0OCwgMHg5NTg0LCAweDAwZmYsIDB4OTA4MCwKKwkweDMzODQsIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHg5MDA2LCAweDAwMDUsIDB4OTA4MCwKKwkweDMzODQsIDB4MjAwZCwgMHg5MThjLCAweDAwZmYsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwKKwkweDIwMDEsIDB4MTgxOCwgMHgyMDAzLCAweDAwZWYsIDB4MjBhOSwgMHgwMDEwLCAweDkwMDYsIDB4Njg1MiwKKwkweDY4NTYsIDB4MWYwNCwgMHgyOGMwLCAweDAwZGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwZDYsIDB4MDAyNiwKKwkweDIwNjksIDB4MDE0MCwgMHgyMDAxLCAweDE4MTgsIDB4MjEwMiwgMHg4MTE0LCAweDgyMTQsIDB4ODIxNCwKKwkweDgyMTQsIDB4MjBhOSwgMHgwMDEwLCAweDY4NTMsIDB4MDAwMCwgMHg5MDA2LCAweDgyZmYsIDB4MTEyOCwKKwkweDkxODQsIDB4MDAwZiwgMHg5MDgwLCAweGYzNDYsIDB4MjAwNSwgMHg2ODU2LCAweDgyMTEsIDB4MWYwNCwKKwkweDI4ZDUsIDB4MDAyZSwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LCAweDIwNjEsIDB4MTgwMCwKKwkweDYwMzAsIDB4MDExMCwgMHhjMDlkLCAweDAwMDgsIDB4YzA5YywgMHg2MDMyLCAweDAwY2UsIDB4MDAwNSwKKwkweDAxNTYsIDB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDY5LCAweDAxNDAsIDB4Njk4MCwKKwkweDkxMTYsIDB4MDE4MCwgMHg5MTEyLCAweDEyMzAsIDB4ODIxMiwgMHg4MjEwLCAweDIyYTgsIDB4MjAwMSwKKwkweDA0MDIsIDB4MDAxOCwgMHgyMmE4LCAweDIwMDEsIDB4MDQwNCwgMHg2ODBlLCAweDFmMDQsIDB4MjkwNSwKKwkweDY4MGYsIDB4MDAwMCwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMGRlLCAweDAxNWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4NTc1ZCwgMHhkMGM0LCAweDAxNTAsIDB4ZDBhNCwgMHgwMTQwLCAweDkwMDYsIDB4MDA0NiwKKwkweDIwMjAsIDB4MjAwOSwgMHgwMDJlLCAweDA4MGMsIDB4ZTczYSwgMHgwMDRlLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgyMDc5LCAweDAxNDAsIDB4NzhjNCwgMHhkMGRjLCAweDA5MDQsIDB4Mjk3YywKKwkweDA4MGMsIDB4MmJkYiwgMHgwNjYwLCAweDkwODQsIDB4MDcwMCwgMHg5MDhlLCAweDA2MDAsIDB4MTEyMCwKKwkweDIwMTEsIDB4NDAwMCwgMHg5MDBlLCAweDA0NTgsIDB4OTA4ZSwgMHgwNTAwLCAweDExMjAsIDB4MjAxMSwKKwkweDgwMDAsIDB4OTAwZSwgMHgwNDIwLCAweDkwOGUsIDB4MDQwMCwgMHgxMTIwLCAweDkwMTYsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDBlOCwgMHg5MDhlLCAweDAzMDAsIDB4MTEyMCwgMHg5MDE2LCAweDIwMDksIDB4MDAwMiwKKwkweDAwYjAsIDB4OTA4ZSwgMHgwMjAwLCAweDExMjAsIDB4OTAxNiwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwKKwkweDkwOGUsIDB4MDEwMCwgMHgxNTQ4LCAweDkwMTYsIDB4MjAwOSwgMHgwMDA4LCAweDAwNDAsIDB4OTA4NCwKKwkweDA3MDAsIDB4OTA4ZSwgMHgwMzAwLCAweDE1MDAsIDB4MjAxMSwgMHgwMDMwLCAweDAwNTgsIDB4MjMwMCwKKwkweDkwODAsIDB4MDAyMCwgMHgyMDE4LCAweDA4MGMsIDB4OTAyNywgMHg5MjhjLCAweGZmMDAsIDB4MDExMCwKKwkweDIwMTEsIDB4MDBmZiwgMHgyMjAwLCAweDgwMDcsIDB4OTA4NSwgMHgwMDRjLCAweDc4YzIsIDB4MjAwOSwKKwkweDAxMzgsIDB4MjIwYSwgMHgwODBjLCAweDc0M2UsIDB4MTExOCwgMHgyMDA5LCAweDE5NmMsIDB4MjIwYSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwMDUsIDB4NzhjMywgMHgwMDAwLCAweDBjYzgsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDAxLCAweDAxNzAsIDB4MjAwYywKKwkweDgwMDAsIDB4MjAxNCwgMHg5MTg0LCAweDAwMDMsIDB4MDExMCwgMHgwODBjLCAweDBkY2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMTcxLCAweDIwMDQsIDB4ZDBkYywKKwkweDAxNjgsIDB4MjAwMSwgMHgwMTcwLCAweDIwMGMsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDA0YywKKwkweDExMjgsIDB4MjAwYywgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgwMDA1LCAweDkwMGUsIDB4MjAwMSwKKwkweDAyMjcsIDB4MjAwNCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDA0LCAweDkxMDgsIDB4MjAwMSwKKwkweDAyMjYsIDB4MjAwNCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDA0LCAweDkxMDgsIDB4MDAwNSwKKwkweDAwMTgsIDB4MDAwYywgMHgwMDE4LCAweDAwMjAsIDB4MTAwMCwgMHgwODAwLCAweDEwMDAsIDB4MTgwMCwKKwkweDAxNTYsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwgMHgyMDAxLCAweDE5OGYsIDB4MjAwNCwKKwkweDkwOGEsIDB4MDAwNywgMHgxYTBjLCAweDBkZDUsIDB4MDAzMywgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDE1ZSwgMHgwMDA1LCAweDI5ZGEsIDB4MjlmOCwgMHgyYTFjLCAweDJhMWUsIDB4MmE0NywKKwkweDJhNDksIDB4MmE0YiwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyODI4LCAweDA4MGMsIDB4MmMzOSwKKwkweDIwMDEsIDB4MTk5MSwgMHgyMDAzLCAweDAwMDAsIDB4NzgyOCwgMHg5MDg0LCAweGUxZDcsIDB4NzgyYSwKKwkweDkwMDYsIDB4MjBhOSwgMHgwMDA5LCAweDA4MGMsIDB4MmJmNywgMHgyMDAxLCAweDE5OGYsIDB4MjAwMywKKwkweDAwMDYsIDB4MjAwOSwgMHgwMDFlLCAweDIwMTEsIDB4MmE0YywgMHgwODBjLCAweDg2NDgsIDB4MDAwNSwKKwkweDIwMDksIDB4MTk5NCwgMHgyMDBiLCAweDAwMDAsIDB4MjAwMSwgMHgxOTk5LCAweDIwMDMsIDB4MDAzNiwKKwkweDIwMDEsIDB4MTk5OCwgMHgyMDAzLCAweDAwMmEsIDB4MjAwMSwgMHgxOTkxLCAweDIwMDMsIDB4MDAwMSwKKwkweDkwMDYsIDB4MDgwYywgMHgyYmE5LCAweDIwMDEsIDB4ZmZmZiwgMHgyMGE5LCAweDAwMDksIDB4MDgwYywKKwkweDJiZjcsIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsIDB4MDAwNiwgMHgyMDA5LCAweDAwMWUsIDB4MjAxMSwKKwkweDJhNGMsIDB4MDgwYywgMHg4NjQ4LCAweDAwMDUsIDB4MDgwYywgMHgwZGQ1LCAweDIwMDEsIDB4MTk5OSwKKwkweDIwMDMsIDB4MDAzNiwgMHgyMDAxLCAweDE5OTEsIDB4MjAwMywgMHgwMDAzLCAweDdhMzgsIDB4OTI5NCwKKwkweDAwMDUsIDB4OTI5NiwgMHgwMDA0LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MmJhOSwgMHgyMDAxLCAweDE5OTUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4ZmZmZiwKKwkweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDJiZjcsIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsIDB4MDAwNiwKKwkweDIwMDksIDB4MDAxZSwgMHgyMDExLCAweDJhNGMsIDB4MDgwYywgMHg4NjQ4LCAweDAwMDUsIDB4MDgwYywKKwkweDBkZDUsIDB4MDgwYywgMHgwZGQ1LCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwKKwkweDAwZjYsIDB4MDE1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwKKwkweDE5OTEsIDB4MjAwNCwgMHg5MDhhLCAweDAwMDcsIDB4MWEwYywgMHgwZGQ1LCAweDAwNDMsIDB4MDEyZSwKKwkweDAxNWUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MmE2ZSwKKwkweDJhOGUsIDB4MmFjZSwgMHgyYWZlLCAweDJiMjIsIDB4MmIzMiwgMHgyYjM0LCAweDA4MGMsIDB4MmJlYiwKKwkweDExYjAsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgyMDA5LCAweDE5OTcsIDB4MjEwNCwKKwkweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNCwgMHgwMTEwLCAweGMwOGQsIDB4MDAwOCwKKwkweGMwODUsIDB4MjAwYSwgMHgyMDAxLCAweDE5OGYsIDB4MjAwMywgMHgwMDAxLCAweDAwMzAsIDB4MDgwYywKKwkweDJiNTgsIDB4MjAwMSwgMHhmZmZmLCAweDA4MGMsIDB4MjllOSwgMHgwMDA1LCAweDA4MGMsIDB4MmIzNiwKKwkweDA1ZTAsIDB4MjAwOSwgMHgxOTk4LCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDA4MGMsIDB4MmJlYiwKKwkweDExNzgsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNSwKKwkweDkyOTYsIDB4MDAwNSwgMHgwNTE4LCAweDIwMDksIDB4MTk5NywgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwKKwkweDIwMDksIDB4MTk5NCwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwgMHg5MDg2LCAweDAwMDUsIDB4MDExOCwKKwkweDA4MGMsIDB4MmIzZSwgMHgwMGMwLCAweDIwMGIsIDB4MDAwMCwgMHg3YTM4LCAweDkyOTQsIDB4MDAwNiwKKwkweDkyOTYsIDB4MDAwNCwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDJiYzYsIDB4MjAwMSwgMHgxOTkxLCAweDIwMDMsIDB4MDAwMiwgMHgwMDI4LCAweDIwMDEsIDB4MTk4ZiwKKwkweDIwMDMsIDB4MDAwMywgMHgwMDEwLCAweDA4MGMsIDB4MmEwYiwgMHgwMDA1LCAweDA4MGMsIDB4MmIzNiwKKwkweDA1NjAsIDB4MjAwOSwgMHgxOTk4LCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDA4MGMsIDB4MmJlYiwKKwkweDExNjgsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgyMDAxLCAweDE5OGYsIDB4MjAwMywKKwkweDAwMDMsIDB4MjAwMSwgMHgxOTkwLCAweDIwMDMsIDB4MDAwMCwgMHgwMGI4LCAweDIwMDksIDB4MTk5OCwKKwkweDIxMDQsIDB4OTAwNSwgMHgxMTE4LCAweDA4MGMsIDB4MmI3YiwgMHgwMDEwLCAweDA4MGMsIDB4MmI0YiwKKwkweDA4MGMsIDB4MmIzZSwgMHgyMDA5LCAweDE5OTQsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDEsIDB4MTk5MSwKKwkweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDJhMGIsIDB4MDAwMCwgMHgwMDA1LCAweDA0YjksIDB4MDUwOCwKKwkweDA4MGMsIDB4MmJlYiwgMHgxMWI4LCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLCAweDc4NTIsIDB4MjAwOSwKKwkweDE5OTUsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4OTA4NiwgMHgwMDA3LCAweDAxMDgsIDB4MDA3OCwKKwkweDIwMDEsIDB4MTk5YSwgMHgyMDAzLCAweDAwMGEsIDB4MjAwOSwgMHgxOTk3LCAweDIxMDQsIDB4YzBmZCwKKwkweDIwMGEsIDB4MDAzOCwgMHgwNDE5LCAweDIwMDEsIDB4MTk5MSwgMHgyMDAzLCAweDAwMDQsIDB4MDgwYywKKwkweDJhMzYsIDB4MDAwNSwgMHgwMDk5LCAweDAxNjgsIDB4MDgwYywgMHgyYmViLCAweDExMzgsIDB4Nzg1MCwKKwkweDkwODQsIDB4ZWZmZiwgMHg3ODUyLCAweDA4MGMsIDB4MmEyMiwgMHgwMDE4LCAweDAwNzksIDB4MDgwYywKKwkweDJhMzYsIDB4MDAwNSwgMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHgwZGQ1LCAweDIwMDksIDB4MTk5OSwKKwkweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDA5MGMsIDB4MmI5NywgMHgwMDA1LCAweDdhMzgsIDB4OTI5NCwKKwkweDAwMDUsIDB4OTI5NiwgMHgwMDA1LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MmJjNiwgMHgwMDA1LCAweDdhMzgsIDB4OTI5NCwgMHgwMDA2LCAweDkyOTYsIDB4MDAwNiwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJiYTksIDB4MDAwNSwKKwkweDIwMDksIDB4MTk5NCwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwgMHg5MDg2LCAweDAwMDUsIDB4MDEwOCwKKwkweDAwNjgsIDB4MjAwYiwgMHgwMDAwLCAweDdhMzgsIDB4OTI5NCwgMHgwMDA2LCAweDkyOTYsIDB4MDAwNiwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwNGQ5LCAweDdhMzgsIDB4OTI5NCwKKwkweDAwMDUsIDB4OTI5NiwgMHgwMDA1LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4MmJjNiwgMHgwMDA1LCAweDAwODYsIDB4MjAwMSwgMHgxOTk3LCAweDIwMDQsIDB4OTA4NCwKKwkweDdmZmYsIDB4MDkwYywgMHgwZGQ1LCAweDIwMDksIDB4MTk5NiwgMHgyMTQ0LCAweDg4NDYsIDB4MjgwYSwKKwkweDk4NDQsIDB4MGRkOCwgMHhkMDhjLCAweDExMjAsIDB4ZDA4NCwgMHgxMTIwLCAweDA4MGMsIDB4MGRkNSwKKwkweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDBhMSwgMHgwMDhlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAxNTYsIDB4MjAwMSwgMHgxOThmLCAweDIwYTksIDB4MDAwOSwgMHgyMDAzLCAweDAwMDAsIDB4ODAwMCwKKwkweDFmMDQsIDB4MmI5ZCwgMHgyMDAxLCAweDE5OTYsIDB4MjAwMywgMHg4MDAwLCAweDAxNWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4OTA4NSwgMHgwMDAwLCAweDAxNTgsIDB4NzgzOCwKKwkweDkwODQsIDB4ZmZmOSwgMHg5MDg1LCAweDAwMDQsIDB4NzgzYSwgMHgyMDA5LCAweDE5OWMsIDB4MjEwYywKKwkweDc5NWEsIDB4MDA1MCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmYiwgMHg5MDg1LCAweDAwMDYsIDB4NzgzYSwKKwkweDIwMDksIDB4MTk5ZCwgMHgyMTBjLCAweDc5NWEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwKKwkweDAxMDAsIDB4OTA4NSwgMHgwMDAwLCAweDAxMzgsIDB4NzgzOCwgMHg5MDg0LCAweGZmZmEsIDB4OTA4NSwKKwkweDAwMDQsIDB4NzgzYSwgMHgwMDMwLCAweDc4MzgsIDB4OTA4NCwgMHhmZmZiLCAweDkwODUsIDB4MDAwNSwKKwkweDc4M2EsIDB4MDBmZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4MiwKKwkweDAwMDcsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4MiwKKwkweDAwMDksIDB4MDAwZSwgMHgwMDA1LCAweDAxNTYsIDB4MjBhOSwgMHgwMDY0LCAweDc4MjAsIDB4MDgwYywKKwkweDJjNzYsIDB4ZDA5YywgMHgxMTEwLCAweDFmMDQsIDB4MmJlZSwgMHgwMTVlLCAweDAwMDUsIDB4MDEyNiwKKwkweDAwMTYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4Nzg1MCwgMHg5MDg1LCAweDAwNDAsIDB4Nzg1MiwKKwkweDc4NTAsIDB4OTA4NCwgMHhmYmNmLCAweDc4NTIsIDB4MDgwYywgMHgyYzc2LCAweDkwODUsIDB4MjAwMCwKKwkweDc4NTIsIDB4MDAwZSwgMHgyMDA4LCAweDkxODYsIDB4MDAwMCwgMHgxMTE4LCAweDc4M2IsIDB4MDAwNywKKwkweDAwOTAsIDB4OTE4NiwgMHgwMDAxLCAweDExMTgsIDB4NzgzYiwgMHgwMDA2LCAweDAwNjAsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTExOCwgMHg3ODNiLCAweDAwMDUsIDB4MDAzMCwgMHg5MTg2LCAweDAwMDMsIDB4MTExOCwKKwkweDc4M2IsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDYsIDB4MWQwNCwgMHgyYzI0LCAweDA4MGMsIDB4ODY2YSwKKwkweDFmMDQsIDB4MmMyNCwgMHg3ODUwLCAweDkwODUsIDB4MDQwMCwgMHg5MDg0LCAweGRmYmYsIDB4Nzg1MiwKKwkweDA4MGMsIDB4MmM3NiwgMHg5MDg1LCAweDEwMDAsIDB4Nzg1MiwgMHgwMDBlLCAweDAwMWUsIDB4MDEyZSwKKwkweDAwMDUsIDB4Nzg1MCwgMHg5MDg0LCAweGZmY2YsIDB4Nzg1MiwgMHgwMDA1LCAweDAwMDYsIDB4MDE1NiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LCAweGQwYWMsIDB4MTEzMCwKKwkweDc4MjAsIDB4ZDBlNCwgMHgxMTQwLCAweDFmMDQsIDB4MmM0OCwgMHgwMDI4LCAweDc4NTQsIDB4ZDA4YywKKwkweDExMTAsIDB4MWYwNCwgMHgyYzRlLCAweDAwZmUsIDB4MDE1ZSwgMHgwMDBlLCAweDAwMDUsIDB4MWQwNCwKKwkweDJjNTcsIDB4MDgwYywgMHg4NjZhLCAweDFmMDQsIDB4MmM1NywgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE5OWIsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE5OWIsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE5OWIsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MDAwZSwgMHgwMDA1LCAweGEwMDEsIDB4YTAwMSwKKwkweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE5YTcsIDB4MjEwMiwKKwkweDAwMGUsIDB4MDAwNSwgMHgyMDA5LCAweDAxNzEsIDB4MjEwNCwgMHhkMGRjLCAweDAxNDAsIDB4MjAwOSwKKwkweDAxNzAsIDB4MjEwNCwgMHgyMDBiLCAweDAwODAsIDB4YTAwMSwgMHhhMDAxLCAweDIwMGEsIDB4MDAwNSwKKwkweDAwMzYsIDB4MDA0NiwgMHgyMDAxLCAweDAxNDEsIDB4MjAwYywgMHg5MThjLCAweGZmMDAsIDB4OTE4NiwKKwkweDIxMDAsIDB4MDE0MCwgMHg5MTg2LCAweDIwMDAsIDB4MDE3MCwgMHg5MTg2LCAweDAxMDAsIDB4MTkwNCwKKwkweDJjZWYsIDB4MDA0OCwgMHgwMDE2LCAweDIwMDksIDB4MWE4MiwgMHgyMTA0LCAweDgwMDAsIDB4MDIwOCwKKwkweDIwMGEsIDB4MDAxZSwgMHgwNGYwLCAweDIwMDksIDB4MDBhMiwgMHgwODBjLCAweDBlNTEsIDB4MjAxOSwKKwkweDAxNjAsIDB4MjMyNCwgMHgyMDExLCAweDAwMDMsIDB4MjAwOSwgMHgwMTY5LCAweDIxMDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4MjEwYywgMHg5MThjLCAweDAwMDcsIDB4OTEwZSwgMHgxZGIwLCAweDkwODYsIDB4MDAwMywKKwkweDE1NDgsIDB4MjMwNCwgMHgwMDY2LCAweDAwNzYsIDB4MjAzMSwgMHgwMDAyLCAweDIzM2MsIDB4OTczZSwKKwkweDAxNDgsIDB4ODYzMSwgMHgxZGQ4LCAweDIwMzEsIDB4MWE4MywgMHgyNjNjLCAweDg3MzgsIDB4MDIwOCwKKwkweDI3MzIsIDB4MjMwNCwgMHgwMDdlLCAweDAwNmUsIDB4OTQwMiwgMHgwMmEwLCAweDE5ZDAsIDB4ODIxMSwKKwkweDE5ZDgsIDB4ODRmZiwgMHgwMTcwLCAweDIwMDEsIDB4MDE0MSwgMHgyMDBjLCAweDkxOGMsIDB4ZmYwMCwKKwkweDkxODYsIDB4MDEwMCwgMHgwMTMwLCAweDIwMDksIDB4MTgwYywgMHgyMTA0LCAweGMwZGQsIDB4MjAwYSwKKwkweDAwMDgsIDB4MDQyMSwgMHgyMDAxLCAweDE5ODAsIDB4MjAwYywgMHgwODBjLCAweDBlNTEsIDB4MDA0ZSwKKwkweDAwM2UsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGRjLCAweDAxYjAsIDB4MjAwMSwKKwkweDAxNjAsIDB4MjAwNCwgMHg5MDA1LCAweDAxNDAsIDB4MjAwMSwgMHgwMTQxLCAweDIwMDQsIDB4OTA4NCwKKwkweGZmMDAsIDB4OTA4NiwgMHgwMTAwLCAweDExNDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAyMSwgMHgwMDJlLCAweDAwMWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjAxNCwgMHgwMDA2LCAweDIwMDEsIDB4MDE2MSwgMHgyMDAzLCAweDAwMDAsIDB4NjAxNywKKwkweDAwMTgsIDB4YTAwMSwgMHhhMDAxLCAweDYwMmYsIDB4MDAwOCwgMHg2MTA0LCAweDkxOGUsIDB4MDAxMCwKKwkweDYxMDYsIDB4OTE4ZSwgMHgwMDEwLCAweDYxMDYsIDB4NjAxNywgMHgwMDQwLCAweDA0YjksIDB4MDAxZSwKKwkweDkxODQsIDB4MDAwMywgMHgwMWUwLCAweDAwMzYsIDB4MDAxNiwgMHgyMDE5LCAweDAxNDEsIDB4NjEyNCwKKwkweDkxOGMsIDB4MDAyOCwgMHgxMTIwLCAweDIzMDQsIDB4OTA4NCwgMHgyODAwLCAweDBkYzAsIDB4MDAxZSwKKwkweDkxOWMsIDB4ZmZlNCwgMHg5MTg0LCAweDAwMDEsIDB4MDExOCwgMHg5Mzg1LCAweDAwMDksIDB4NjAxNiwKKwkweDkxODQsIDB4MDAwMiwgMHgwMTE4LCAweDkzODUsIDB4MDAxMiwgMHg2MDE2LCAweDAwM2UsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMWRjLCAweDIxMDIsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDA4MGMsIDB4NzQ1OCwgMHgwMTA4LCAweGMwYmMsIDB4MjAwOSwgMHgwMTQwLCAweDIxMTQsIDB4OTI5NCwKKwkweDAwMDEsIDB4OTIxNSwgMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDIwMDksIDB4MDE0MCwgMHgyMTE0LCAweDkyOTQsIDB4MDAwMSwgMHg5Mjg1LCAweDEwMDAsIDB4MjAwYSwKKwkweDIyMGEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MDE0MCwKKwkweDIxMTQsIDB4OTI5NCwgMHgwMDAxLCAweDkyMTUsIDB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDAxNiwgMHgyMDA5LCAweDAxNDAsIDB4MjEwNCwgMHgxMTI4LCAweDA4MGMsIDB4NzQ1OCwKKwkweDAxMTAsIDB4YzBiYywgMHgwMDA4LCAweGMwYmQsIDB4MjAwYSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwKKwkweDJmZjQsIDB4MmZmNCwgMHgyZTE4LCAweDJlMTgsIDB4MmUyNCwgMHgyZTI0LCAweDJlMzAsIDB4MmUzMCwKKwkweDJlM2UsIDB4MmUzZSwgMHgyZTRhLCAweDJlNGEsIDB4MmU1OCwgMHgyZTU4LCAweDJlNjYsIDB4MmU2NiwKKwkweDJlNzgsIDB4MmU3OCwgMHgyZTg0LCAweDJlODQsIDB4MmU5MiwgMHgyZTkyLCAweDJlYjAsIDB4MmViMCwKKwkweDJlZDAsIDB4MmVkMCwgMHgyZWEwLCAweDJlYTAsIDB4MmVjMCwgMHgyZWMwLCAweDJlZGUsIDB4MmVkZSwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlZjAsIDB4MmVmMCwgMHgyZWZjLCAweDJlZmMsIDB4MmYwYSwgMHgyZjBhLCAweDJmMTgsIDB4MmYxOCwKKwkweDJmMjgsIDB4MmYyOCwgMHgyZjM2LCAweDJmMzYsIDB4MmY0NiwgMHgyZjQ2LCAweDJmNTYsIDB4MmY1NiwKKwkweDJmNjgsIDB4MmY2OCwgMHgyZjc2LCAweDJmNzYsIDB4MmY4NiwgMHgyZjg2LCAweDJmYTgsIDB4MmZhOCwKKwkweDJmY2EsIDB4MmZjYSwgMHgyZjk2LCAweDJmOTYsIDB4MmZiOSwgMHgyZmI5LCAweDJmZDksIDB4MmZkOSwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwgMHgyZTc2LCAweDJlNzYsIDB4MmU3NiwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjRiZiwgMHgwODA0LCAweDJmZWMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMmQzLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDI0YmYsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjMwZSwKKwkweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDIzMGUsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjJkMywKKwkweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDIzMGUsIDB4MDgwNCwgMHgyZmVjLCAweGEwMDEsIDB4MGNmMCwKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MTM4MCwgMHgwODA0LCAweDJmZWMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNGJmLCAweDA4MGMsIDB4MTM4MCwKKwkweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgxMzgwLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDEzODAsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgxMzgwLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDEzODAsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4MTM4MCwgMHgwODBjLCAweDIzMGUsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjJkMywKKwkweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDEzODAsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjk3ZiwgMHgwODA0LCAweDJmZWMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyOTdmLCAweDA4MGMsIDB4MjRiZiwKKwkweDA4MDQsIDB4MmZlYywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsIDB4MDgwYywgMHgyMmQzLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyNGJmLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDIzMGUsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwKKwkweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDIzMGUsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDIzMGUsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDI0YmYsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDEzODAsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwKKwkweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDEzODAsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwKKwkweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDEzODAsIDB4MDgwNCwgMHgyZmVjLCAweDAxMDYsIDB4MDAwNiwKKwkweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjk3ZiwKKwkweDA4MGMsIDB4MjRiZiwgMHgwODBjLCAweDEzODAsIDB4MDgwYywgMHgyMzBlLCAweDA4MDQsIDB4MmZlYywKKwkweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwKKwkweDA4MGMsIDB4Mjk3ZiwgMHgwODBjLCAweDIyZDMsIDB4MDgwYywgMHgyNGJmLCAweDA4MGMsIDB4MTM4MCwKKwkweDA0OTgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDgwYywgMHgyOTdmLCAweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDEzODAsIDB4MDgwYywKKwkweDIzMGUsIDB4MDQxMCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI5N2YsIDB4MDgwYywgMHgxMzgwLCAweDA4MGMsIDB4MjMwZSwKKwkweDAwOTgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxNTYsIDB4MDgwYywgMHgyOTdmLCAweDA4MGMsIDB4MjJkMywgMHgwODBjLCAweDI0YmYsIDB4MDgwYywKKwkweDEzODAsIDB4MDgwYywgMHgyMzBlLCAweDAwMDAsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwKKwkweDAxY2UsIDB4MDEyZSwgMHgwMDBlLCAweDAxMGUsIDB4MDAwZCwgMHgwMGI2LCAweDAwYzYsIDB4MDAyNiwKKwkweDAwNDYsIDB4OTAyNiwgMHgwODBjLCAweDY5Y2EsIDB4MTkwNCwgMHgzMTA1LCAweDcyZGMsIDB4MjAwMSwKKwkweDE5N2IsIDB4MjAwNCwgMHg5MDA1LCAweDExMTAsIDB4ZDI5YywgMHgwMTQ4LCAweGQyODQsIDB4MTEzOCwKKwkweGQyYmMsIDB4MTkwNCwgMHgzMTA1LCAweDA4MGMsIDB4MzEwYSwgMHgwODA0LCAweDMxMDUsIDB4ZDJjYywKKwkweDE5MDQsIDB4MzEwNSwgMHgwODBjLCAweDc0M2UsIDB4MTEyMCwgMHg3MGFmLCAweGZmZmYsIDB4MDgwNCwKKwkweDMxMDUsIDB4ZDI5NCwgMHgwMTIwLCAweDcwYWYsIDB4ZmZmZiwgMHgwODA0LCAweDMxMDUsIDB4MDgwYywKKwkweDMzNzMsIDB4MDE2MCwgMHgwODBjLCAweGQzODgsIDB4MDEyOCwgMHgyMDAxLCAweDE4MTgsIDB4MjAzYywKKwkweDA4MDQsIDB4MzA5MiwgMHg3MGFmLCAweGZmZmYsIDB4MDgwNCwgMHgzMTA1LCAweDIwMDEsIDB4MTgxOCwKKwkweDIwM2MsIDB4NzI5NCwgMHhkMjg0LCAweDA5MDQsIDB4MzA5MiwgMHhkMjhjLCAweDE5MDQsIDB4MzA5MiwKKwkweDAwMzYsIDB4NzNhYywgMHg5MzhlLCAweGZmZmYsIDB4MTExMCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwKKwkweDkyZTAsIDB4MWM4MCwgMHgyYzA0LCAweDkzOGMsIDB4MDAwMSwgMHgwMTIwLCAweDkwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4MDAxMCwgMHg5MDg0LCAweDAwZmYsIDB4OTcwZSwgMHgwNWQwLCAweDkwOGUsIDB4MDAwMCwKKwkweDA1YjgsIDB4OTA4ZSwgMHgwMGZmLCAweDExNTAsIDB4NzIzMCwgMHhkMjg0LCAweDE1YjAsIDB4NzI5NCwKKwkweGMyOGQsIDB4NzI5NiwgMHg3MGFmLCAweGZmZmYsIDB4MDAzZSwgMHgwNGEwLCAweDkwMGUsIDB4MDgwYywKKwkweDI4N2MsIDB4MDgwYywgMHg2NjM4LCAweDE1MzgsIDB4OTAwNiwgMHhiOGJiLCAweDA1MjAsIDB4YjhhYywKKwkweDkwMDUsIDB4MDE0OCwgMHgwMGM2LCAweDIwNjAsIDB4MDgwYywgMHg4YTNkLCAweDAwY2UsIDB4MDkwYywKKwkweDhkZGEsIDB4YjhhZiwgMHgwMDAwLCAweDA4MGMsIDB4NmEwYywgMHgxMTY4LCAweDcwMzAsIDB4ZDA4YywKKwkweDAxMzAsIDB4YjgwMCwgMHhkMGJjLCAweDAxMzgsIDB4MDgwYywgMHg2OGI5LCAweDAxMjAsIDB4MDgwYywKKwkweDMxMjMsIDB4MDE0OCwgMHgwMDI4LCAweDA4MGMsIDB4MzI2MywgMHgwODBjLCAweDMxNGYsIDB4MDExOCwKKwkweDgzMTgsIDB4MDgwNCwgMHgzMDNmLCAweDczYWUsIDB4MDAxMCwgMHg3MGFmLCAweGZmZmYsIDB4MDAzZSwKKwkweDA4MDQsIDB4MzEwNSwgMHg5NzgwLCAweDMzODQsIDB4MjAzZCwgMHg5N2JjLCAweGZmMDAsIDB4ODczZiwKKwkweDIwNDEsIDB4MDA3ZSwgMHg3MGFjLCAweDkwOTYsIDB4ZmZmZiwgMHgxMTE4LCAweDkwMGUsIDB4MjhhOCwKKwkweDAwNTAsIDB4OTgxMiwgMHgwMjIwLCAweDIwMDgsIDB4OTgwMiwgMHgyMGE4LCAweDAwMjAsIDB4NzBhZiwKKwkweGZmZmYsIDB4MDgwNCwgMHgzMTA1LCAweDI3MDAsIDB4MDE1NiwgMHgwMDE2LCAweDkxMDYsIDB4MDkwNCwKKwkweDMwZmEsIDB4YzQ4NCwgMHgwODBjLCAweDY2OTksIDB4MDE0OCwgMHgwODBjLCAweGQzODgsIDB4MTkwNCwKKwkweDMwZmEsIDB4MDgwYywgMHg2NjM4LCAweDE5MDQsIDB4MzEwMiwgMHgwMDA4LCAweGM0ODUsIDB4YjhiYiwKKwkweDA1MjAsIDB4YjhhYywgMHg5MDA1LCAweDAxNDgsIDB4MDBjNiwgMHgyMDYwLCAweDA4MGMsIDB4OGEzZCwKKwkweDAwY2UsIDB4MDkwYywgMHg4ZGRhLCAweGI4YWYsIDB4MDAwMCwgMHgwODBjLCAweDZhMGMsIDB4MTEzMCwKKwkweDcwMzAsIDB4ZDA4YywgMHgwMWY4LCAweGI4MDAsIDB4ZDBiYywgMHgxMWUwLCAweDcyOTQsIDB4ZDI4YywKKwkweDAxODAsIDB4MDgwYywgMHg2YTBjLCAweDkwODIsIDB4MDAwNiwgMHgwMmUwLCAweGQ0ODQsIDB4MTExOCwKKwkweDA4MGMsIDB4NjY1ZCwgMHgwMDI4LCAweDA4MGMsIDB4MzJlZiwgMHgwMWEwLCAweDA4MGMsIDB4MzMxYSwKKwkweDAwODgsIDB4MDgwYywgMHgzMjYzLCAweDA4MGMsIDB4ZDM4OCwgMHgxMTYwLCAweDA4MGMsIDB4MzE0ZiwKKwkweDAxODgsIDB4MDA0MCwgMHgwODBjLCAweGQzODgsIDB4MTExOCwgMHgwODBjLCAweDMyZWYsIDB4MDExMCwKKwkweDA0NTEsIDB4MDE0MCwgMHgwMDFlLCAweDgxMDgsIDB4MDE1ZSwgMHgxZjA0LCAweDMwYWIsIDB4NzBhZiwKKwkweGZmZmYsIDB4MDAxOCwgMHgwMDFlLCAweDAxNWUsIDB4NzFhZSwgMHgwMDRlLCAweDAwMmUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwMTYsIDB4NzBhZiwgMHgwMDAxLCAweDIwMDksIDB4MDA3ZSwKKwkweDA4MGMsIDB4NjYzOCwgMHgxMTY4LCAweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmUsIDB4MDgwYywKKwkweDMyNjMsIDB4MDRhOSwgMHgwMTI4LCAweDcwZGMsIDB4YzBiZCwgMHg3MGRlLCAweDA4MGMsIDB4ZDBkOSwKKwkweDAwMWUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MjAwMSwKKwkweDE4NGMsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg0MiwgMHgwODBjLCAweGFmOTEsIDB4MDFkMCwKKwkweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywKKwkweDY1ZDUsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NjVlOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDcwYTgsIDB4ODAwMCwgMHg3MGFhLCAweDAxMmUsIDB4MjAwOSwgMHgwMDA0LCAweDA4MGMsIDB4YWZiZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwNzYsIDB4MDBkNiwgMHgwMGM2LCAweDIwMDEsIDB4MTg0YywgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweGI4NDIsIDB4MDgwYywgMHhhZjkxLCAweDA1NDgsIDB4MmIwMCwgMHg2MDEyLCAweGI4MDAsIDB4YzBjNCwKKwkweGI4MDIsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MDE0MCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTEwLCAweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywKKwkweDAwMDEsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwYTgsIDB4ODAwMCwgMHg3MGFhLCAweDAxMmUsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDAyNiwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywKKwkweDY2MzgsIDB4MTE0MCwgMHhiODEzLCAweDAwZmYsIDB4YjgxNywgMHhmZmZjLCAweDAwMzksIDB4MDExMCwKKwkweDcwZTMsIDB4ZmZmZiwgMHgwMDJlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwKKwkweDAwZDYsIDB4MDBjNiwgMHgwODBjLCAweGFlZWQsIDB4MDFkMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywKKwkweGQxMDIsIDB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDIwMDEsIDB4MDAwMiwKKwkweDA4MGMsIDB4NjVlOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGU0LCAweDgwMDAsIDB4NzBlNiwKKwkweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjAwOSwgMHgwMDdmLCAweDA4MGMsIDB4NjYzOCwgMHgxMWI4LCAweGI4MTMsIDB4MDBmZiwKKwkweGI4MTcsIDB4ZmZmZCwgMHhiOGNmLCAweDAwMDQsIDB4MDgwYywgMHhhZWVkLCAweDAxNzAsIDB4MmIwMCwKKwkweDYwMTIsIDB4NjMxNiwgMHg2MDIzLCAweDAwMDEsIDB4NjIwYSwgMHgwODBjLCAweGQxMDIsIDB4MjAwOSwKKwkweDAwMjIsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAzNiwgMHgwMDI2LCAweDAwYjYsIDB4MjFmMCwKKwkweDA4MGMsIDB4OTM2MSwgMHgwODBjLCAweDkyZTEsIDB4MDgwYywgMHhhZDgxLCAweDA4MGMsIDB4YmU2YiwKKwkweDNlMDgsIDB4MjEzMCwgMHg4MWZmLCAweDAxMjAsIDB4MjBhOSwgMHgwMDdlLCAweDkwMGUsIDB4MDAxOCwKKwkweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2Njk5LCAweDExNDAsIDB4OTY4NiwKKwkweDAwMDIsIDB4MTExOCwgMHhiODAwLCAweGQwYmMsIDB4MTExMCwgMHgwODBjLCAweDYwYzcsIDB4MDAxZSwKKwkweDgxMDgsIDB4MWYwNCwgMHgzMjAzLCAweDk2ODYsIDB4MDAwMSwgMHgxOTBjLCAweDMzNDcsIDB4MDBiZSwKKwkweDAwMmUsIDB4MDAzZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwKKwkweDAwNDYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDBiNiwgMHg2MjEwLCAweDIyNTgsIDB4YmFhMCwKKwkweDAwMjYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwKKwkweDA4MGMsIDB4OTIyOSwgMHgyYzA4LCAweDA4MGMsIDB4ZTQ3NywgMHgwMDdlLCAweDAwMWUsIDB4YmExMCwKKwkweGJiMTQsIDB4YmNjMCwgMHgwODBjLCAweDYwYzcsIDB4YmExMiwgMHhiYjE2LCAweGJjYzIsIDB4MDBiZSwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwMDYsIDB4MDBiNiwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkwODYsIDB4MDA4MCwKKwkweDAxNTAsIDB4MjA3MSwgMHgxODAwLCAweDcwYTgsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4NzBhYSwKKwkweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg3MGU0LCAweDkwMDUsIDB4MGRjMCwKKwkweDgwMDEsIDB4NzBlNiwgMHgwY2E4LCAweGI4MDAsIDB4YzA4YywgMHhiODAyLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBjNiwgMHgwMGI2LCAweDAwNDYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDE1NiwKKwkweDIxNzgsIDB4ODFmZiwgMHgxMTE4LCAweDIwYTksIDB4MDAwMSwgMHgwMDc4LCAweDA4MGMsIDB4NTc1ZCwKKwkweGQwYzQsIDB4MDE0MCwgMHhkMGE0LCAweDAxMzAsIDB4OTAwNiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZCwKKwkweDA4MGMsIDB4ZTczYSwgMHgyMGE5LCAweDA4MDAsIDB4OTAxNiwgMHgwMDI2LCAweDkyOGUsIDB4MDA3ZSwKKwkweDA5MDQsIDB4MzJjZSwgMHg5MjhlLCAweDAwN2YsIDB4MDkwNCwgMHgzMmNlLCAweDkyOGUsIDB4MDA4MCwKKwkweDA1ZTgsIDB4OTI4OCwgMHgxMDAwLCAweDIxMGMsIDB4ODFmZiwgMHgwNWMwLCAweDhmZmYsIDB4MTE0OCwKKwkweDIwMDEsIDB4MTk4ZCwgMHgwMDA2LCAweDIwMDMsIDB4MDAwMSwgMHgwNGYxLCAweDAwMGUsIDB4MjAwMywKKwkweDAwMDAsIDB4MDBiNiwgMHgwMGM2LCAweDIxNTgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjlkNiwKKwkweDAwY2UsIDB4MDBiZSwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg5MzU2LCAweDAwNzYsIDB4MjAzOSwKKwkweDAwMDAsIDB4MDgwYywgMHg5MjI5LCAweDAwYjYsIDB4MDBjNiwgMHgwMDI2LCAweDIxNTgsIDB4YmEwNCwKKwkweDkyOTQsIDB4MDBmZiwgMHg5Mjg2LCAweDAwMDYsIDB4MTExOCwgMHhiODA3LCAweDA0MDQsIDB4MDAyOCwKKwkweDIwMDEsIDB4MDAwNCwgMHg4MDA3LCAweDkyMTUsIDB4YmEwNiwgMHgwMDJlLCAweDAwY2UsIDB4MDBiZSwKKwkweDAwMTYsIDB4MmMwOCwgMHgwODBjLCAweGU0NzcsIDB4MDAxZSwgMHgwMDdlLCAweDAwMmUsIDB4ODIxMCwKKwkweDFmMDQsIDB4MzI4NSwgMHgwMTVlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDBiZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA0NiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywKKwkweDU3NWQsIDB4ZDBjNCwgMHgwMTQwLCAweGQwYTQsIDB4MDEzMCwgMHg5MDA2LCAweDIyMjAsIDB4MjAwOSwKKwkweDAwMjksIDB4MDgwYywgMHhlNzNhLCAweDAwMWUsIDB4MDAyZSwgMHgwMDRlLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDcyOTQsIDB4ODJmZiwgMHgwMWU4LCAweDA4MGMsIDB4NmEwNCwKKwkweDExZDAsIDB4MjEwMCwgMHgwODBjLCAweDI4YWYsIDB4ODFmZiwgMHgwMWI4LCAweDIwMTksIDB4MDAwMSwKKwkweDgzMTQsIDB4OTJlMCwgMHgxYzgwLCAweDJjMDQsIDB4ZDM4NCwgMHgwMTIwLCAweDkwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4MDAxMCwgMHg5MDg0LCAweDAwZmYsIDB4OTExNiwgMHgwMTM4LCAweDkwOTYsIDB4MDBmZiwKKwkweDAxMTAsIDB4ODMxOCwgMHgwYzY4LCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAyOSwgMHgwMGE5LCAweDAwM2UsIDB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA2NSwKKwkweDAxNTgsIDB4MDAxNiwgMHgwMGM2LCAweDIwNjEsIDB4MWFiMiwgMHgwMDFlLCAweDYxMTIsIDB4MDgwYywKKwkweDMyMWUsIDB4MDAxZSwgMHgwODBjLCAweDY2NWQsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDAyNiwgMHgyMTEwLCAweDA4MGMsIDB4YThkYywgMHgwODBjLCAweGVhYTMsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHhkMGNjLCAweDAwMDUsIDB4MDBjNiwKKwkweDAwYjYsIDB4MDgwYywgMHg3NDNlLCAweDExMTgsIDB4MjBhOSwgMHgwODAwLCAweDAwMTAsIDB4MjBhOSwKKwkweDA3ODIsIDB4MDgwYywgMHg3NDNlLCAweDExMTAsIDB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MDA3ZSwKKwkweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDEzMCwgMHg4NmZmLCAweDAxMTAsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDkwYywgMHg2NjVkLCAweDgxMDgsIDB4MWYwNCwgMHgzMzU4LCAweDIwNjEsIDB4MTgwMCwKKwkweDYwN2YsIDB4MDAwMCwgMHg2MDgwLCAweDkwODQsIDB4MDBmZiwgMHg2MDgyLCAweDYwYjMsIDB4MDAwMCwKKwkweDAwYmUsIDB4MDBjZSwgMHgwMDA1LCAweDIwMDEsIDB4MTg2OSwgMHgyMDA0LCAweGQwYmMsIDB4MDAwNSwKKwkweDIwMTEsIDB4MTg0OCwgMHgyMjE0LCAweGQyZWMsIDB4MDAwNSwgMHgwMDI2LCAweDIwMTEsIDB4MTg2NywKKwkweDIyMTQsIDB4ZDJkYywgMHgwMDJlLCAweDAwMDUsIDB4N2VlZiwgMHg3ZGU4LCAweDdjZTQsIDB4ODBlMiwKKwkweDdiZTEsIDB4ODBlMCwgMHg4MGRjLCAweDgwZGEsIDB4N2FkOSwgMHg4MGQ2LCAweDgwZDUsIDB4ODBkNCwKKwkweDgwZDMsIDB4ODBkMiwgMHg4MGQxLCAweDc5Y2UsIDB4NzhjZCwgMHg4MGNjLCAweDgwY2IsIDB4ODBjYSwKKwkweDgwYzksIDB4ODBjNywgMHg4MGM2LCAweDc3YzUsIDB4NzZjMywgMHg4MGJjLCAweDgwYmEsIDB4NzViOSwKKwkweDgwYjYsIDB4NzRiNSwgMHg3M2I0LCAweDcyYjMsIDB4ODBiMiwgMHg4MGIxLCAweDgwYWUsIDB4NzFhZCwKKwkweDgwYWMsIDB4NzBhYiwgMHg2ZmFhLCAweDZlYTksIDB4ODBhNywgMHg2ZGE2LCAweDZjYTUsIDB4NmJhMywKKwkweDZhOWYsIDB4Njk5ZSwgMHg2ODlkLCAweDgwOWIsIDB4ODA5OCwgMHg2Nzk3LCAweDY2OTAsIDB4NjU4ZiwKKwkweDY0ODgsIDB4NjM4NCwgMHg2MjgyLCAweDgwODEsIDB4ODA4MCwgMHg2MTdjLCAweDYwN2EsIDB4ODA3OSwKKwkweDVmNzYsIDB4ODA3NSwgMHg4MDc0LCAweDgwNzMsIDB4ODA3MiwgMHg4MDcxLCAweDgwNmUsIDB4NWU2ZCwKKwkweDgwNmMsIDB4NWQ2YiwgMHg1YzZhLCAweDViNjksIDB4ODA2NywgMHg1YTY2LCAweDU5NjUsIDB4NTg2MywKKwkweDU3NWMsIDB4NTY1YSwgMHg1NTU5LCAweDgwNTYsIDB4ODA1NSwgMHg1NDU0LCAweDUzNTMsIDB4NTI1MiwKKwkweDUxNTEsIDB4NTA0ZSwgMHg0ZjRkLCAweDgwNGMsIDB4ODA0YiwgMHg0ZTRhLCAweDRkNDksIDB4ODA0NywKKwkweDRjNDYsIDB4ODA0NSwgMHg4MDQzLCAweDgwM2MsIDB4ODAzYSwgMHg4MDM5LCAweDgwMzYsIDB4NGIzNSwKKwkweDgwMzQsIDB4NGEzMywgMHg0OTMyLCAweDQ4MzEsIDB4ODAyZSwgMHg0NzJkLCAweDQ2MmMsIDB4NDUyYiwKKwkweDQ0MmEsIDB4NDMyOSwgMHg0MjI3LCAweDgwMjYsIDB4ODAyNSwgMHg0MTIzLCAweDQwMWYsIDB4M2YxZSwKKwkweDNlMWQsIDB4M2QxYiwgMHgzYzE4LCAweDgwMTcsIDB4ODAxMCwgMHgzYjBmLCAweDNhMDgsIDB4ODAwNCwKKwkweDM5MDIsIDB4ODAwMSwgMHg4MDAwLCAweDgwMDAsIDB4MzgwMCwgMHgzNzAwLCAweDM2MDAsIDB4ODAwMCwKKwkweDM1MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzQwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDMzMDAsIDB4MzIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDMxMDAsIDB4MzAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MmYwMCwKKwkweDgwMDAsIDB4MmUwMCwgMHgyZDAwLCAweDJjMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MmIwMCwKKwkweDgwMDAsIDB4MmEwMCwgMHgyOTAwLCAweDI4MDAsIDB4ODAwMCwgMHgyNzAwLCAweDI2MDAsIDB4MjUwMCwKKwkweDI0MDAsIDB4MjMwMCwgMHgyMjAwLCAweDgwMDAsIDB4ODAwMCwgMHgyMTAwLCAweDIwMDAsIDB4MWYwMCwKKwkweDFlMDAsIDB4MWQwMCwgMHgxYzAwLCAweDgwMDAsIDB4ODAwMCwgMHgxYjAwLCAweDFhMDAsIDB4ODAwMCwKKwkweDE5MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MTgwMCwKKwkweDgwMDAsIDB4MTcwMCwgMHgxNjAwLCAweDE1MDAsIDB4ODAwMCwgMHgxNDAwLCAweDEzMDAsIDB4MTIwMCwKKwkweDExMDAsIDB4MTAwMCwgMHgwZjAwLCAweDgwMDAsIDB4ODAwMCwgMHgwZTAwLCAweDBkMDAsIDB4MGMwMCwKKwkweDBiMDAsIDB4MGEwMCwgMHgwOTAwLCAweDgwMDAsIDB4ODAwMCwgMHgwODAwLCAweDA3MDAsIDB4ODAwMCwKKwkweDA2MDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDUwMCwgMHgwNDAwLCAweDAzMDAsIDB4ODAwMCwKKwkweDAyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDEwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKKwkweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MjA3MSwgMHgxODllLCAweDcwMDMsIDB4MDAwMiwKKwkweDkwMDYsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGEsIDB4NzA0ZSwgMHg3MDBlLCAweDcwNDIsIDB4NzA0NiwKKwkweDcwM2IsIDB4MThiYSwgMHg3MDNmLCAweDE4YmEsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4MTAxOCwKKwkweDA5MGMsIDB4MGRkNSwgMHgyOTAwLCAweDcwNmEsIDB4YTg2NywgMHgwMDAyLCAweGE4YWIsIDB4ZGNiMCwKKwkweDA4MGMsIDB4MTAxOCwgMHgwOTBjLCAweDBkZDUsIDB4MjkwMCwgMHg3MDZlLCAweGE4NjcsIDB4MDAwMiwKKwkweGE4YWIsIDB4ZGNiMCwgMHgwMDA1LCAweDIwNzEsIDB4MTg5ZSwgMHg3MDA0LCAweDAwMDIsIDB4MzRiMywKKwkweDM0YjQsIDB4MzRjNywgMHgzNGRiLCAweDAwMDUsIDB4MTAwNCwgMHgzNGM0LCAweDBlMDQsIDB4MzRjNCwKKwkweDIwNzksIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDBjLCAweDkwMDUsIDB4MTEyOCwKKwkweDcwMGYsIDB4MDAwMSwgMHgwMTJlLCAweDA0NjgsIDB4MDAwNSwgMHgwMTJlLCAweDBjZTgsIDB4MjA3OSwKKwkweDAwMDAsIDB4MjA2MSwgMHgxOGI4LCAweDJjNGMsIDB4YTg2YywgMHg5MDhlLCAweDAxMDAsIDB4MDEyOCwKKwkweDkwODYsIDB4MDIwMCwgMHgwOTA0LCAweDM1YWYsIDB4MDAwNSwgMHg3MDE4LCAweDIwNDgsIDB4MjA2MSwKKwkweDE4MDAsIDB4NzAxYywgMHgwODA3LCAweDcwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwOTQsIDB4MDBmZiwKKwkweDkyOTYsIDB4MDAyOSwgMHgxMTIwLCAweGFhNzgsIDB4ZDJmYywgMHgwMTI4LCAweDAwMDUsIDB4OTA4NiwKKwkweDAxMDMsIDB4MDEwOCwgMHgwMDA1LCAweDIwNzksIDB4MDAwMCwgMHgyMDYxLCAweDE4MDAsIDB4NzAxYywKKwkweDA4MDcsIDB4MjA2MSwgMHgxODAwLCAweDc4ODAsIDB4OTA4YSwgMHgwMDQwLCAweDEyMTAsIDB4NjFkMCwKKwkweDAwNDIsIDB4MjEwMCwgMHg5MDhhLCAweDAwM2YsIDB4MWEwNCwgMHgzNWFjLCAweDYxZDAsIDB4MDgwNCwKKwkweDM1NDEsIDB4MzU4MywgMHgzNWJiLCAweDM1YWMsIDB4MzVjNSwgMHgzNWNmLCAweDM1ZDUsIDB4MzVkOSwKKwkweDM1ZTksIDB4MzVlZCwgMHgzNjAzLCAweDM2MDksIDB4MzYwZiwgMHgzNjFhLCAweDM2MjUsIDB4MzYzNCwKKwkweDM2NDMsIDB4MzY1MSwgMHgzNjY4LCAweDM2ODMsIDB4MzVhYywgMHgzNzJjLCAweDM3NmEsIDB4MzgxMCwKKwkweDM4MjEsIDB4Mzg0NCwgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywgMHgzODdjLCAweDM4OTgsIDB4MzhhMSwKKwkweDM4ZDAsIDB4MzhkNiwgMHgzNWFjLCAweDM5MWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywKKwkweDM1YWMsIDB4MzkyNywgMHgzOTMwLCAweDM5MzgsIDB4MzkzYSwgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywKKwkweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM5NjYsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywKKwkweDM1YWMsIDB4Mzk4MywgMHgzOWU0LCAweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywKKwkweDM1YWMsIDB4MDAwMiwgMHgzYTBlLCAweDNhMTEsIDB4M2E3MCwgMHgzYTg5LCAweDNhYjksIDB4M2Q1NywKKwkweDM1YWMsIDB4NTMyMSwgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywgMHgzNWFjLCAweDM1YWMsIDB4MzVhYywKKwkweDM1YWMsIDB4MzVhYywgMHgzNjAzLCAweDM2MDksIDB4NDI3OCwgMHg1NzgxLCAweDQyOTYsIDB4NTNiMCwKKwkweDU0MDEsIDB4NTUwYywgMHgzNWFjLCAweDU1NmUsIDB4NTVhYSwgMHg1NWRiLCAweDU2ZTMsIDB4NTYwOCwKKwkweDU2NjMsIDB4MzVhYywgMHg0MjlhLCAweDQ0NWIsIDB4NDQ3MSwgMHg0NDk2LCAweDQ0ZmIsIDB4NDU2ZiwKKwkweDQ1OGYsIDB4NDYwNiwgMHg0NjYyLCAweDQ2YmUsIDB4NDZjMSwgMHg0NmU2LCAweDQ3OTEsIDB4NDdmNywKKwkweDQ3ZmYsIDB4NDkzMSwgMHg0YWE5LCAweDRhZGQsIDB4NGQ0MSwgMHgzNWFjLCAweDRkNWYsIDB4NGUwNSwKKwkweDRlZTcsIDB4NGY0MSwgMHgzNWFjLCAweDRmZjgsIDB4MzVhYywgMHg1MDYwLCAweDUwN2IsIDB4NDdmZiwKKwkweDUyYzEsIDB4NzE0YywgMHgwMDAwLCAweDIwMjEsIDB4NDAwMCwgMHgwODBjLCAweDRiNWIsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDM1OGQsIDB4MDAxMCwgMHgwMTJlLCAweDBjYzAsIDB4N2MzNiwKKwkweDk0ODYsIDB4NDAwMCwgMHgwMTE4LCAweDc4MzMsIDB4MDAxMSwgMHgwMDEwLCAweDc4MzMsIDB4MDAxMCwKKwkweDdjODIsIDB4Nzk4NiwgMHg3YThhLCAweDdiOGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwKKwkweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4NzAwNywgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwKKwkweDcwMGYsIDB4MDAwMCwgMHgwMTJlLCAweDAwMDUsIDB4MjAyMSwgMHg0MDAxLCAweDA4YjAsIDB4MjAyMSwKKwkweDQwMDIsIDB4MDg5OCwgMHgyMDIxLCAweDQwMDMsIDB4MDg4MCwgMHgyMDIxLCAweDQwMDUsIDB4MDg2OCwKKwkweDIwMjEsIDB4NDAwNiwgMHgwODUwLCAweDIwMzksIDB4MDAwMSwgMHg5MDJlLCAweDI1MjAsIDB4N2I4OCwKKwkweDdhOGMsIDB4Nzg4NCwgMHg3OTkwLCAweDA4MDQsIDB4NGI2OCwgMHgyMDM5LCAweDAwMDEsIDB4OTAyZSwKKwkweDI1MjAsIDB4N2I4OCwgMHg3YThjLCAweDc4ODQsIDB4Nzk5MCwgMHgwODA0LCAweDRiNmIsIDB4Nzk4NCwKKwkweDc4ODgsIDB4MjExNCwgMHgyMDBhLCAweDA4MDQsIDB4MzU4MywgMHg3OTg0LCAweDIxMTQsIDB4MDgwNCwKKwkweDM1ODMsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDAyMSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAwMjEsIDB4MjBhOSwgMHgwMDFmLCAweDQwMDMsIDB4Nzk4NCwgMHg3YTg4LCAweDdiOGMsIDB4MDgwNCwKKwkweDM1ODMsIDB4Nzg4NCwgMHgyMDYwLCAweDA4MDQsIDB4MzYzNiwgMHgyMDA5LCAweDAwMDMsIDB4MjAxMSwKKwkweDAwMDMsIDB4MjAxOSwgMHgwMDA4LCAweDc4OWIsIDB4MDEzNywgMHg3ODkzLCAweGZmZmYsIDB4MjAwMSwKKwkweDE4OGYsIDB4MjAwNCwgMHg5MDA1LCAweDAxMTgsIDB4Nzg5NiwgMHgwODA0LCAweDM1ODMsIDB4Nzg5NywKKwkweDAwMDEsIDB4MDgwNCwgMHgzNTgzLCAweDIwMzksIDB4MDAwMSwgMHg3ZDk4LCAweDdjOWMsIDB4MDgwNCwKKwkweDM1YmYsIDB4MjAzOSwgMHgwMDAxLCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1YzksIDB4NzlhMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsIDB4MzViOCwgMHgyMTM4LCAweDdkOTgsIDB4N2M5YywKKwkweDA4MDQsIDB4MzViZiwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwgMHgwMjEwLCAweDA4MDQsIDB4MzViOCwKKwkweDIxMzgsIDB4N2Q5OCwgMHg3YzljLCAweDA4MDQsIDB4MzVjOSwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwKKwkweDAyMTAsIDB4MDgwNCwgMHgzNWI4LCAweDIxZTgsIDB4Nzk4NCwgMHg3ODg4LCAweDIwYTksIDB4MDAwMSwKKwkweDIxYTAsIDB4NDAwNCwgMHgwODA0LCAweDM1ODMsIDB4MjA2MSwgMHgwODAwLCAweGUxMGMsIDB4OTAwNiwKKwkweDJjMTUsIDB4OTIwMCwgMHg4YzYwLCAweDgxMDksIDB4MWRkOCwgMHgyMDEwLCAweDkwMDUsIDB4MDkwNCwKKwkweDM1ODMsIDB4MDgwNCwgMHgzNWIyLCAweDc5YTAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwKKwkweDM1YjgsIDB4MjFlMCwgMHgyMGE5LCAweDAwMDEsIDB4Nzk4NCwgMHgyMTk4LCAweDQwMTIsIDB4MDgwNCwKKwkweDM1ODMsIDB4MjA2OSwgMHgxODQ3LCAweDc4ODQsIDB4Nzk5MCwgMHg5MTFhLCAweDFhMDQsIDB4MzViOCwKKwkweDgwMTksIDB4MDkwNCwgMHgzNWI4LCAweDY4NGEsIDB4Njk0MiwgMHg3ODhjLCAweDY4NTIsIDB4Nzg4OCwKKwkweDY4NTYsIDB4OTAwNiwgMHg2ODVhLCAweDY4NWUsIDB4MDgwYywgMHg3NzU1LCAweDA4MDQsIDB4MzU4MywKKwkweDIwNjksIDB4MTg0NywgMHg3ODg0LCAweDc5OTQsIDB4OTExYSwgMHgxYTA0LCAweDM1YjgsIDB4ODAxOSwKKwkweDA5MDQsIDB4MzViOCwgMHg2ODRlLCAweDY5NDYsIDB4Nzg4YywgMHg2ODYyLCAweDc4ODgsIDB4Njg2NiwKKwkweDkwMDYsIDB4Njg2YSwgMHg2ODZlLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmE3MiwKKwkweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDkwMmUsIDB4MjUyMCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDgwNCwgMHgzNWI1LCAweDc5ODQsIDB4N2I4OCwgMHg3YThjLCAweDIwYTksIDB4MDAwNSwKKwkweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDE4YTYsIDB4NDEwMSwgMHgwODBjLCAweDRiMWYsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsIDB4MjAwOSwgMHgwMDIwLCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4YWY2MCwgMHgwODBjLCAweDRiNjgsIDB4NzAxZiwgMHgzNmE3LCAweDAwMDUsIDB4YTg2NCwKKwkweDIwMDgsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAxMSwgMHgwMTY4LCAweDkwOTYsIDB4MDAxOSwKKwkweDAxNTAsIDB4OTA5NiwgMHgwMDE1LCAweDAxMzgsIDB4OTA5NiwgMHgwMDQ4LCAweDAxMjAsIDB4OTA5NiwKKwkweDAwMjksIDB4MTkwNCwgMHgzNWI1LCAweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDA5MDQsIDB4MzViNSwKKwkweDcxMTIsIDB4NzAxMCwgMHg4MDAxLCAweDA1NjAsIDB4NzAxMiwgMHgwODBjLCAweDRiMWYsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1YjUsIDB4MjAwOSwgMHgwMDIwLCAweDcwNjgsIDB4MjA0MCwKKwkweGEyOGMsIDB4YTM5MCwgMHhhNDk0LCAweGE1OTgsIDB4OTI5MCwgMHgwMDQwLCAweDkzOTksIDB4MDAwMCwKKwkweDk0YTEsIDB4MDAwMCwgMHg5NWE5LCAweDAwMDAsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwKKwkweDA4MGMsIDB4NGI2OCwgMHg3MDFmLCAweDM2ZTUsIDB4MDAwNSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwOTYsIDB4MDAwMiwgMHgwMTIwLCAweDkwOTYsIDB4MDAwYSwgMHgxOTA0LCAweDM1YjUsIDB4MDg4OCwKKwkweDcwMTQsIDB4MjA0OCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwOTYsIDB4MDAyOSwgMHgxMTYwLCAweGMyZmQsIDB4YWE3YSwgMHgwODBjLCAweDYyMWUsIDB4MDE1MCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4N2EsIDB4YTk4MiwgMHgwMTJlLCAweDAwNTAsIDB4MDgwYywKKwkweDY1NGUsIDB4MTEyOCwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHgzNzExLCAweDAwMDUsIDB4MDgwYywKKwkweDZmNGEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjBhOSwgMHgwMDA1LCAweDIwZTEsIDB4MDAwMSwKKwkweDIwOTksIDB4MThhNiwgMHg0MDBhLCAweDIxMDAsIDB4OTIxMCwgMHg5Mzk5LCAweDAwMDAsIDB4OTRhMSwKKwkweDAwMDAsIDB4OTVhOSwgMHgwMDAwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwMDksIDB4MDAyMCwKKwkweDAxMmUsIDB4YWY2MCwgMHgwODA0LCAweDRiNmIsIDB4MjA5MSwgMHg4MDAwLCAweDc4MzcsIDB4NDAwMCwKKwkweDc4MzMsIDB4MDAxMCwgMHg3ODgzLCAweDQwMDAsIDB4Nzg4NywgMHg0OTUzLCAweDc4OGIsIDB4NTAyMCwKKwkweDc4OGYsIDB4MjAyMCwgMHgyMDA5LCAweDAxN2YsIDB4MjEwNCwgMHg3ODkyLCAweDNmMDAsIDB4Nzg5NiwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MjAwLCAweDIwNjEsIDB4MDIwMCwgMHg2MDNjLCAweDgwMDcsIDB4OTIwNSwKKwkweDc4OWEsIDB4MjAwOSwgMHgwNGZkLCAweDIxMDQsIDB4Nzg5ZSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwKKwkweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgwMTgwLCAweDIwMDEsIDB4MWExOCwKKwkweDIwMDQsIDB4OTAwNSwgMHgwMTI4LCAweDIwMDEsIDB4MDA4YiwgMHgyMDA0LCAweGQwZmMsIDB4MGRkOCwKKwkweDIwMDEsIDB4MDA4YSwgMHgyMDAzLCAweDAwMDIsIDB4MjAwMywgMHgxMDAxLCAweDIwNzEsIDB4MDA4MCwKKwkweDA4MDQsIDB4MDQyNywgMHg4MWZmLCAweDE5MDQsIDB4MzViNSwgMHg3OTg0LCAweDA4MGMsIDB4NjY5OSwKKwkweDE5MDQsIDB4MzViOCwgMHg3ZTk4LCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MWEwNCwKKwkweDM1YjgsIDB4N2M4OCwgMHg3ZDhjLCAweDA4MGMsIDB4NjdmYywgMHgwODBjLCAweDY3Y2IsIDB4MDAwMCwKKwkweDE1MTgsIDB4MjA2MSwgMHgxY2QwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4OTA4NiwKKwkweDAwMDAsIDB4MDE0OCwgMHg2MDE0LCAweDkwNGQsIDB4MDEzMCwgMHhhODZjLCAweDk0MDYsIDB4MTExOCwKKwkweGE4NzAsIDB4OTUwNiwgMHgwMTUwLCAweDAxMmUsIDB4OWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4MTgxYSwKKwkweDIwMDQsIDB4OWMwMiwgMHgxYTA0LCAweDM1YjUsIDB4MGMzMCwgMHgwODBjLCAweGM4YTUsIDB4MDEyZSwKKwkweDA5MDQsIDB4MzViNSwgMHgwODA0LCAweDM1ODMsIDB4OTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MDgwYywKKwkweDZmNGEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhjZjgyLCAweDA4MGMsIDB4NmQxNywKKwkweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDAwYTYsIDB4Mjk1MCwgMHhiMTk4LCAweDA4MGMsIDB4NjY5OSwKKwkweDE5MDQsIDB4MzdmZCwgMHhiNmE0LCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MTZlOCwKKwkweGI0OWMsIDB4YjVhMCwgMHgwODBjLCAweDY3ZmMsIDB4MDgwYywgMHg2N2NiLCAweDE1MjAsIDB4MjA2MSwKKwkweDFjZDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwKKwkweDYwMTQsIDB4OTA0ZCwgMHgwMTMwLCAweGE4NmMsIDB4OTQwNiwgMHgxMTE4LCAweGE4NzAsIDB4OTUwNiwKKwkweDAxNTgsIDB4MDEyZSwgMHg5Y2UwLCAweDAwMTgsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwKKwkweDIwMDksIDB4MDAwZCwgMHgxMmIwLCAweDBjMjgsIDB4MDgwYywgMHhjOGE1LCAweDAxMmUsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDE3OCwgMHgwMGUwLCAweDkwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NmY0YSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4Y2Y4MiwgMHgwODBjLCAweDZkMGIsIDB4MDEyZSwKKwkweDAwNzAsIDB4YjA5NywgMHg0MDA1LCAweGIxOWEsIDB4MDAxMCwgMHhiMDk3LCAweDQwMDYsIDB4OTAwZSwKKwkweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MmE0OCwgMHgwMGFlLCAweDAwMDUsIDB4YjA5NywKKwkweDQwMDAsIDB4OTAwNiwgMHg5MThkLCAweDAwMDEsIDB4MjAwOCwgMHgyYTQ4LCAweDAwYWUsIDB4MDAwNSwKKwkweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NGIzNiwgMHgwOTA0LCAweDM1YjgsIDB4MDgwYywKKwkweDY3NjAsIDB4MDkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NjgwMiwgMHgwOTA0LCAweDM1YjUsIDB4MDgwNCwKKwkweDQ1ODYsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwKKwkweDA4MGMsIDB4Njg5MCwgMHgwOTA0LCAweDM1YjUsIDB4MjAxOSwgMHgwMDA1LCAweDc5YTgsIDB4MDgwYywKKwkweDY4MWQsIDB4MDkwNCwgMHgzNWI1LCAweDc4ODgsIDB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzViOCwKKwkweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4MDgwYywgMHg4NWJlLCAweDc5ODQsIDB4ZDE4NCwKKwkweDE5MDQsIDB4MzU4MywgMHgwODA0LCAweDQ1ODYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwKKwkweDAxMTgsIDB4MjAwOSwgMHgwMDAxLCAweDA0NTAsIDB4MjAyOSwgMHgwN2ZmLCAweDY0NWMsIDB4MjQwMCwKKwkweDk1MDYsIDB4MDFmOCwgMHgyNTA4LCAweDA4MGMsIDB4NjY5OSwgMHgxMWQ4LCAweDA4MGMsIDB4Njg5MCwKKwkweDExMjgsIDB4MjAwOSwgMHgwMDAyLCAweDYyYzAsIDB4MjUxOCwgMHgwMGMwLCAweDIwMTksIDB4MDAwNCwKKwkweDkwMGUsIDB4MDgwYywgMHg2ODFkLCAweDExMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwNzgsIDB4Nzg4NCwKKwkweDkwOGEsIDB4MTAwMCwgMHgxMjcwLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4MDgwYywKKwkweDg1YmUsIDB4ODUyOSwgMHgxYWUwLCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDAxMmUsIDB4MDgwNCwKKwkweDM1YjUsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MDgwYywgMHg0YjM2LCAweDA5MDQsIDB4MzViOCwKKwkweDA4MGMsIDB4Njc2MCwgMHgwOTA0LCAweDM1YjUsIDB4YmFhMCwgMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwKKwkweDkwNjYsIDB4MDgwYywgMHg5MzU2LCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDkyMjksIDB4OTAwZSwKKwkweDA4MGMsIDB4ZTQ3NywgMHgwMDdlLCAweDAwY2UsIDB4MDgwYywgMHg2N2ZjLCAweDA4MDQsIDB4MzU4MywKKwkweDA4MGMsIDB4NGIzNiwgMHgwOTA0LCAweDM1YjgsIDB4MDgwYywgMHg2N2ZjLCAweDIyMDgsIDB4MDgwNCwKKwkweDM1ODMsIDB4MDE1NiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2OSwgMHgxOTEwLCAweDY4MTAsIDB4NjkxNCwKKwkweDkxMGEsIDB4MTIwOCwgMHg5MDBlLCAweDY4MTYsIDB4OTAxNiwgMHg5MDFlLCAweDIwYTksIDB4MDA3ZSwKKwkweDIwNjksIDB4MTAwMCwgMHgyZDA0LCAweDkwNWQsIDB4MDExOCwgMHhiODRjLCAweDAwNTksIDB4OTIxMCwKKwkweDhkNjgsIDB4MWYwNCwgMHgzOGIyLCAweDIzMDAsIDB4OTIxOCwgMHgwMGVlLCAweDAwZGUsIDB4MDE1ZSwKKwkweDA4MDQsIDB4MzU4MywgMHgwMGY2LCAweDAwMTYsIDB4OTA3ZCwgMHgwMTM4LCAweDkwMDYsIDB4ODAwMCwKKwkweDJmMGMsIDB4ODFmZiwgMHgwMTEwLCAweDIxNzgsIDB4MGNkMCwgMHgwMDFlLCAweDAwZmUsIDB4MDAwNSwKKwkweDIwNjksIDB4MTkxMCwgMHg2OTEwLCAweDYyYmMsIDB4MDgwNCwgMHgzNTgzLCAweDgxZmYsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1YjUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDU3NzEsIDB4MDEyOCwgMHgyMDA5LCAweDAwMDcsIDB4MDEyZSwgMHgwODA0LCAweDM1YjUsIDB4MDEyZSwKKwkweDYxNWMsIDB4OTE5MCwgMHgzMzg0LCAweDIyMTUsIDB4OTI5NCwgMHgwMGZmLCAweDYzN2MsIDB4ODNmZiwKKwkweDAxMDgsIDB4NjI4MCwgMHg2N2RjLCAweDk3YzQsIDB4MDAwYSwgMHg5OGM2LCAweDAwMGEsIDB4MTExOCwKKwkweDIwMzEsIDB4MDAwMSwgMHgwMGU4LCAweDk3YzQsIDB4MDAyMiwgMHg5OGM2LCAweDAwMjIsIDB4MTExOCwKKwkweDIwMzEsIDB4MDAwMywgMHgwMGE4LCAweDk3YzQsIDB4MDAxMiwgMHg5OGM2LCAweDAwMTIsIDB4MTExOCwKKwkweDIwMzEsIDB4MDAwMiwgMHgwMDY4LCAweDA4MGMsIDB4NzQzZSwgMHgxMTE4LCAweDIwMzEsIDB4MDAwNCwKKwkweDAwMzgsIDB4ZDc5YywgMHgwMTIwLCAweDIwMDksIDB4MDAwNSwgMHgwODA0LCAweDM1YjUsIDB4OTAzNiwKKwkweDdlOWEsIDB4N2Y5ZSwgMHgwODA0LCAweDM1ODMsIDB4NjE0YywgMHg2MjUwLCAweDIwMTksIDB4MTk4NSwKKwkweDIzMWMsIDB4MjAwMSwgMHgxOTg2LCAweDIwMDQsIDB4Nzg5YSwgMHgwODA0LCAweDM1ODMsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MTM4LCAweDYyM2MsIDB4NjM0MCwgMHgwMTJlLCAweDA4MDQsIDB4MzU4MywKKwkweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsIDB4YmE0NCwgMHhiYjM4LCAweDA4MDQsIDB4MzU4MywKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDRiNTIsIDB4MjExMCwgMHgwOTA0LCAweDM1YjgsIDB4YjgwNCwKKwkweDkwOGMsIDB4MDBmZiwgMHg5MThlLCAweDAwMDYsIDB4MDE0MCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwKKwkweDA2MDAsIDB4MjAwOSwgMHgwMDA5LCAweDE5MDQsIDB4MzViNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwMTksIDB4MDAwNSwgMHgwMGM2LCAweDkwNjYsIDB4MDgwYywgMHhhOGRjLCAweDA4MGMsIDB4OTM1NiwKKwkweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDkyMjksIDB4OTAwZSwgMHgwODBjLCAweGU0NzcsIDB4MDA3ZSwKKwkweDAwY2UsIDB4YjgwNywgMHgwNDA3LCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDYxNGMsIDB4NjI1MCwKKwkweDc4ODQsIDB4NjA0ZSwgMHg3Yjg4LCAweDYzNTIsIDB4MjA2OSwgMHgxODQ3LCAweDgzMWYsIDB4OTMwNSwKKwkweDY4MTYsIDB4Nzg4YywgMHgyMDY5LCAweDE5ODUsIDB4MmQxYywgMHgyMDZhLCAweDdlOTgsIDB4OTY4MiwKKwkweDAwMTQsIDB4MTIxMCwgMHgyMDMxLCAweDA3ZDAsIDB4MjA2OSwgMHgxOTg2LCAweDJkMDQsIDB4MjY2YSwKKwkweDc4OWEsIDB4MDgwNCwgMHgzNTgzLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4ODQsIDB4NjAzYSwKKwkweGQwYzQsIDB4MDFhOCwgMHgwMGQ2LCAweDc4YTgsIDB4MjAwOSwgMHgxOTljLCAweDIwMGEsIDB4NzhhYywKKwkweDIwMTEsIDB4MTk5ZCwgMHgyMDEyLCAweDIwNjksIDB4MDEwMCwgMHg2ODM4LCAweDkwODYsIDB4MDAwNywKKwkweDExMTgsIDB4MjIxNCwgMHg2YTVhLCAweDAwMTAsIDB4MjEwYywgMHg2OTVhLCAweDAwZGUsIDB4Nzg4NCwKKwkweGQwYjQsIDB4MDEyMCwgMHgzYjAwLCAweDkwODQsIDB4ZmYzZiwgMHgyMGQ4LCAweDc4ODgsIDB4NjAzZSwKKwkweDIwMTEsIDB4MDExNCwgMHgyMjBjLCAweDc4ODgsIDB4ZDA4YywgMHgwMTE4LCAweDkxOGQsIDB4MDA4MCwKKwkweDAwMTAsIDB4OTE4YywgMHhmZjdmLCAweDIxMTIsIDB4Nzg4YywgMHg2MDQyLCAweDkwODQsIDB4MDAyMCwKKwkweDAxMzAsIDB4NzhiNCwgMHg2MDQ2LCAweDkwODQsIDB4MDAwMSwgMHgwOTBjLCAweDQyNzgsIDB4NjA0MCwKKwkweGQwY2MsIDB4MDEyMCwgMHg3OGIwLCAweDIwMTEsIDB4MDExNCwgMHgyMDEyLCAweDAxMmUsIDB4MDgwNCwKKwkweDM1ODMsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4N2EzOCwgMHhhODk4LCAweDkwODQsIDB4ZmViZiwKKwkweDkyMTUsIDB4YTg5YywgMHg5MDg0LCAweGZlYmYsIDB4ODAwMiwgMHg5MjE0LCAweDc4MzgsIDB4OTA4NCwKKwkweDAxNDAsIDB4OTIxNSwgMHg3YTNhLCAweGE4OTcsIDB4NDAwMCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwKKwkweDIwMDEsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4Nzg5OCwgMHg5MDA1LCAweDAxYTgsIDB4Nzg4OCwKKwkweDkwMjUsIDB4MDkwNCwgMHgzNWI4LCAweDc4OGMsIDB4OTAyZCwgMHgwOTA0LCAweDM1YjgsIDB4OTAwZSwKKwkweDA4MGMsIDB4NjY5OSwgMHgxMTIwLCAweGJhNDQsIDB4YmIzOCwgMHhiYzQ2LCAweGJkM2EsIDB4OTE4NiwKKwkweDA3ZmYsIDB4MDE5MCwgMHg4MTA4LCAweDBjYTAsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwKKwkweDc4ODgsIDB4OTAwZCwgMHgwOTA0LCAweDM1YjgsIDB4Nzg4YywgMHg5MDA1LCAweDA5MDQsIDB4MzViOCwKKwkweGJhNDQsIDB4Yjk0NiwgMHhiYjM4LCAweGI4M2EsIDB4MDgwNCwgMHgzNTgzLCAweDIwMTEsIDB4YmMwOSwKKwkweDAwMTAsIDB4MjAxMSwgMHhiYzA1LCAweDA4MGMsIDB4NTc3MSwgMHgxOTA0LCAweDM1YjUsIDB4MDBjNiwKKwkweDIwNjEsIDB4MDEwMCwgMHg3OTg0LCAweDkxODYsIDB4MDBmZiwgMHgxMTMwLCAweDIwMDEsIDB4MTgxOCwKKwkweDIwMDQsIDB4OTA4NSwgMHhmZjAwLCAweDAwODgsIDB4OTE4MiwgMHgwMDdmLCAweDE2ZTAsIDB4OTE4OCwKKwkweDMzODQsIDB4MjEwZCwgMHg5MThjLCAweDAwZmYsIDB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4MDAyNiwKKwkweDkxMTYsIDB4MDAyZSwgMHgwNTgwLCAweDgxMGYsIDB4OTEwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAwMDYsIDB4MDgwYywgMHhhZWVkLCAweDAwMGUsIDB4MDUxMCwgMHg2MDJlLCAweDYyMGEsIDB4Nzk4NCwKKwkweDAwYjYsIDB4MDgwYywgMHg2NjNlLCAweDJiMDgsIDB4MDBiZSwgMHgxNTAwLCAweDYxMTIsIDB4NjAyMywKKwkweDAwMDEsIDB4MDgwYywgMHg0YjFmLCAweDAxZDAsIDB4OTAwNiwgMHhhODY2LCAweDcwMDcsIDB4MDAwMywKKwkweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4NzAxZiwgMHgzYTY5LCAweDI5MDAsIDB4NjAxNiwKKwkweDIwMDksIDB4MDAzMiwgMHgwODBjLCAweGFmYmUsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDgwNCwgMHgzNWI1LCAweDAwY2UsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4YWY0MywKKwkweDBjYjAsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDkwNCwgMHgzNWI1LCAweDA4MDQsIDB4MzU4MywKKwkweDIwNjEsIDB4MWE3MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweGQwODQsIDB4MDE3MCwKKwkweDYxMDQsIDB4NjIwOCwgMHgyMDYxLCAweDE4MDAsIDB4NjM1NCwgMHg2MDc0LCAweDc4OWEsIDB4NjBjMCwKKwkweDc4OWUsIDB4NjBiYywgMHg3OGFhLCAweDAxMmUsIDB4MDgwNCwgMHgzNTgzLCAweDkwMGUsIDB4MjExMCwKKwkweDBjODgsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg3NDNlLCAweDA5MDQsIDB4MzViNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyNTQsIDB4NjA3NCwgMHg5MjAyLCAweDAyNDgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHgyOGU1LCAweDA4MGMsIDB4NTk5MCwgMHgwMTJlLCAweDA4MDQsIDB4MzU4MywKKwkweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZTYsIDB4MjAwMSwKKwkweDE5YTgsIDB4MjA3MCwgMHgyMDYxLCAweDE4NDcsIDB4NjAwOCwgMHgyMDcyLCAweDkwMGUsIDB4MjAxMSwKKwkweDE0MDAsIDB4MDgwYywgMHg5MDI3LCAweDcyMDYsIDB4MDBlZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTI4LCAweDAxMmUsIDB4MjAyMSwKKwkweDQwMGIsIDB4MDgwNCwgMHgzNTg1LCAweDc4ODQsIDB4ZDBmYywgMHgwMTQ4LCAweDIwMDEsIDB4MDAyYSwKKwkweDIwMDQsIDB4OTA4MiwgMHgwMGUxLCAweDAyODgsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MjAwMSwKKwkweDAwMmEsIDB4MjAwNCwgMHgyMDY5LCAweDE4NDcsIDB4NjkwOCwgMHg5MTAyLCAweDEyMzAsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzViOCwgMHgwMTJlLCAweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweGFlYWQsIDB4MGRkMCwKKwkweDc4ODQsIDB4ZDBmYywgMHgwOTA0LCAweDNiMzQsIDB4MDBjNiwgMHgwODBjLCAweDRiMWYsIDB4MDBjZSwKKwkweDBkODgsIDB4YTg2NywgMHgwMDAwLCAweDc4ODQsIDB4YTgwYSwgMHg3ODk4LCAweGE4MGUsIDB4Nzg5YywKKwkweGE4MTIsIDB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTgxYSwgMHgyMDAxLCAweDAwMmYsIDB4MjAwNCwKKwkweGE4MWUsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTgyMiwgMHgyMDAxLCAweDAwMzEsIDB4MjAwNCwKKwkweGE4MjYsIDB4MjAwMSwgMHgwMDM0LCAweDIwMDQsIDB4YTgyYSwgMHgyMDAxLCAweDAwMzUsIDB4MjAwNCwKKwkweGE4MmUsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4MCwgMHgwMDAzLCAweDkwODQsIDB4MDBmYywKKwkweDgwMDQsIDB4YTgxNiwgMHgwODBjLCAweDNjYmEsIDB4MDkyOCwgMHg3MDE0LCAweDIwNDgsIDB4YWQyYywKKwkweGFjMjgsIDB4YWIxYywgMHhhYTE4LCAweGE5MzAsIDB4YTgwOCwgMHhkMGI0LCAweDExMjAsIDB4MjAyOSwKKwkweDAwMDAsIDB4MjAyMSwgMHgwMDAwLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsIDB4M2JmNywKKwkweDcwMjMsIDB4MDAwMSwgMHgwMTJlLCAweDAwMDUsIDB4MDA0NiwgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwODBjLCAweDNhYTMsIDB4MjAwMSwKKwkweDE5OWUsIDB4MjAwMywgMHgwMDAwLCAweDIwMjEsIDB4MDAwYSwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwKKwkweDAwMTYsIDB4NjBiYiwgMHgwMDAwLCAweDYwYmYsIDB4MzJlMSwgMHg2MGJmLCAweDAwMTIsIDB4MDgwYywKKwkweDNkMjksIDB4MDgwYywgMHgzY2U4LCAweDAwZjYsIDB4MDBlNiwgMHgwMDg2LCAweDI5NDAsIDB4MjA3MSwKKwkweDFhNjUsIDB4MjA3OSwgMHgwMDkwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4ODQsIDB4ZDBiNCwKKwkweDAxNDAsIDB4MjAwMSwgMHgwMDM1LCAweDIwMDQsIDB4NzgwZSwgMHgyMDAxLCAweDAwMzQsIDB4MjAwNCwKKwkweDc4MGEsIDB4MDBkZSwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGJjLCAweDAwOGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDgwYywgMHgzZmU5LCAweDA4MGMsIDB4M2VlZSwgMHgwNWI4LCAweDIwMDEsIDB4MDIwYiwKKwkweDIwMDQsIDB4OTA4NCwgMHgwMTQwLCAweDFkYjgsIDB4MDgwYywgMHg0MTMwLCAweDAwZjYsIDB4MjA3OSwKKwkweDAzMDAsIDB4NzhiYywgMHgwMGZlLCAweDkwOGMsIDB4MDA3MCwgMHgxNTYwLCAweDIwNzEsIDB4MDIwMCwKKwkweDcwMzcsIDB4MDAwMCwgMHg3MDUwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDMyMDAsIDB4MTUxMCwKKwkweDcwMzcsIDB4MDAwMSwgMHg3MDUwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweGUxMDAsIDB4MTFkMCwKKwkweDcwMzcsIDB4MDAwMCwgMHg3MDU0LCAweDcwMzcsIDB4MDAwMCwgMHg3MTVjLCAweDkxMDYsIDB4MTE5MCwKKwkweDIwMDEsIDB4MTgyMCwgMHgyMDA0LCAweDkxMDYsIDB4MTE2OCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDYwMjQsIDB4OTA4NCwgMHgxZTAwLCAweDAwY2UsIDB4MDEzOCwgMHgwODBjLCAweDNlZjgsIDB4MDgwYywKKwkweDNjZTMsIDB4MDA1OCwgMHgwODBjLCAweDNjZTMsIDB4MDgwYywgMHg0MDU0LCAweDA4MGMsIDB4M2ZkZiwKKwkweDIwMDEsIDB4MDIwYiwgMHgyMDA0LCAweGQwZTQsIDB4MGRkOCwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDQsIDB4MjA2MSwgMHgwMTAwLCAweDYwMjcsIDB4MDAwMiwgMHgwMDFlLCAweDYxMDYsIDB4MjAxMSwKKwkweDAyMGQsIDB4MjAxMywgMHgwMDIwLCAweDYwYmIsIDB4MDAwMCwgMHg2MGJmLCAweDAxMDgsIDB4NjBiZiwKKwkweDAwMTIsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywgMHhmZmZkLCAweDIxMDIsIDB4MDgwYywKKwkweDEyZWQsIDB4MjAwOSwgMHgwMDI4LCAweDA4MGMsIDB4MjQxMCwgMHgyMDAxLCAweDAyMjcsIDB4MjAwYywKKwkweDIxMDIsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwKKwkweDAwOGUsIDB4MDA0ZSwgMHgyMDAxLCAweDE5OWUsIDB4MjAwNCwgMHg5MDA1LCAweDExMTgsIDB4MDEyZSwKKwkweDA4MDQsIDB4MzU4MywgMHgwMTJlLCAweDIwMjEsIDB4NDAwYywgMHgwODA0LCAweDM1ODUsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMDg2LCAweDAwOTYsIDB4MDBkNiwKKwkweDAxNTYsIDB4NzAxNCwgMHgyMDQ4LCAweDcwMjAsIDB4MjBhOCwgMHg4MDAwLCAweDcwMjIsIDB4YTgwNCwKKwkweDkwMDUsIDB4MDkwNCwgMHgzYzUzLCAweDIwNDgsIDB4MWYwNCwgMHgzYzA3LCAweDcwNjgsIDB4MjA0MCwKKwkweGEyOGMsIDB4YTM5MCwgMHhhNDk0LCAweGE1OTgsIDB4YTkzMCwgMHhhODA4LCAweGQwYjQsIDB4MTEyMCwKKwkweDIwMjksIDB4MDAwMCwgMHgyMDIxLCAweDAwMDAsIDB4MDA5NiwgMHg3MDE0LCAweDIwNDgsIDB4YTg2NCwKKwkweDAwOWUsIDB4OTA4NiwgMHgwMTAzLCAweDAxNzAsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywKKwkweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwgMHgwODBjLCAweDRiNjgsIDB4NzAxZiwKKwkweDNiZjcsIDB4MDBiMCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDIxYTgsIDB4MjdlMCwgMHgyMDk4LCAweDI3ZTgsIDB4MjBhMCwKKwkweDAwMDYsIDB4MDgwYywgMHgwZjdjLCAweDAwMGUsIDB4MDgwYywgMHg0YjZiLCAweDcwMWYsIDB4M2JmNywKKwkweDAxNWUsIDB4MDBkZSwgMHgwMDllLCAweDAwOGUsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDcwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODYsIDB4MDEwMywKKwkweDExMTgsIDB4NzAxZiwgMHgzY2I4LCAweDA0NTAsIDB4NzAxNCwgMHgyMDQ4LCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4MjAwOSwgMHgwMDdmLCAweDA4MGMsIDB4NjYzOCwgMHgwMTEwLCAweDkwMDYsIDB4MDAzMCwKKwkweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmQsIDB4MDgwYywgMHhkMTUxLCAweDAxNWUsIDB4MDBkZSwKKwkweDAwOWUsIDB4MDA4ZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDA5MDQsIDB4MzViNSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwKKwkweDAwODYsIDB4MDA5NiwgMHgwMGQ2LCAweDAxNTYsIDB4NzAxZiwgMHgzYzhhLCAweDcwMDcsIDB4MDAwMywKKwkweDA4MDQsIDB4M2M0OCwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgyMDIxLCAweDQwMGMsIDB4MDkwNCwKKwkweDM1ODUsIDB4MDA3NiwgMHhhZDEwLCAweGFjMGMsIDB4YWIyNCwgMHhhYTIwLCAweGE5MzAsIDB4YTgwOCwKKwkweGQwYjQsIDB4MTEyMCwgMHgyMDI5LCAweDAwMDAsIDB4MjAyMSwgMHgwMDAwLCAweDg5MDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MjFhOCwKKwkweDI3ZTAsIDB4MjA5OCwgMHgyN2U4LCAweDIwYTAsIDB4MDAwNiwgMHgwODBjLCAweDBmN2MsIDB4MDAwZSwKKwkweDA4MGMsIDB4NGI2YiwgMHgwMDdlLCAweDcwMWYsIDB4M2JmNywgMHg3MDIzLCAweDAwMDEsIDB4MDAwNSwKKwkweDA4MDQsIDB4MzU4MywgMHgwMTU2LCAweDAwYzYsIDB4YTgxNCwgMHg5MDhhLCAweDAwMWUsIDB4MDIxOCwKKwkweGE4MzMsIDB4MDAxZSwgMHgwMDEwLCAweGE4MzIsIDB4MDA3OCwgMHg4MWZmLCAweDAxNjgsIDB4MDAxNiwKKwkweDA4MGMsIDB4NGIxZiwgMHgwMDFlLCAweDAxMzAsIDB4YTgwMCwgMHgyMDQwLCAweGEwMDgsIDB4YTgwYSwKKwkweDIxMDAsIDB4MGM1OCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwgMHg3ODgwLCAweDkwODYsIDB4MDA0NCwKKwkweDAwZmUsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDEsIDB4MTk5ZSwgMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDIwNjEsIDB4MDIwMCwgMHgyMDAxLCAweDE5YTksIDB4MjAwNCwKKwkweDYwMWEsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4MTlhOCwgMHgyMDA0LCAweDYwY2UsIDB4NjEwNCwKKwkweGMxYWMsIDB4NjEwNiwgMHgwODBjLCAweDRiMWYsIDB4YTgxMywgMHgwMDE5LCAweGE4MTcsIDB4MDAwMSwKKwkweDI5MDAsIDB4YTg1YSwgMHgyMDAxLCAweDAwMmUsIDB4MjAwNCwgMHhhODY2LCAweDIwMDEsIDB4MDAyZiwKKwkweDIwMDQsIDB4YTg2YSwgMHgyMDYxLCAweDAwOTAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDEsIDB4MTlhOCwKKwkweDIwMDQsIDB4NjAzNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDIwMDEsIDB4MDAyYSwKKwkweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGE4NmUsIDB4NjAxYSwgMHhhODczLCAweDAwMDAsIDB4NjAxZiwKKwkweDAwMDAsIDB4NzhjYSwgMHg5MDA2LCAweDYwMGEsIDB4NjAwZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwODBjLCAweDRiMWYsIDB4Mjk0MCwgMHhhMDEzLCAweDAwMTksIDB4YTAxNywKKwkweDAwMDEsIDB4MjgwMCwgMHhhMDVhLCAweDIwMDEsIDB4MDAzMCwgMHgyMDA0LCAweGE4NjYsIDB4MjAwMSwKKwkweDAwMzEsIDB4MjAwNCwgMHhhODZhLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwKKwkweGE4NmUsIDB4YTg3MywgMHgwMDAwLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4MjAwMSwKKwkweDAzMDAsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDAwMDQsIDB4MjAwYywgMHg5MThkLCAweDAwMDIsIDB4MjEwMiwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAxNDgsIDB4MDgwYywgMHgyYzZlLCAweDExMzAsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmJjNiwgMHg5MDA2LCAweDA4MGMsIDB4MmJhOSwgMHg3ODg0LCAweDkwODQsIDB4MDAwNywKKwkweDAwMDIsIDB4M2Q3NCwgMHgzZDdkLCAweDNkODYsIDB4M2Q3MSwgMHgzZDcxLCAweDNkNzEsIDB4M2Q3MSwKKwkweDNkNzEsIDB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MjAwOSwgMHgwMTE0LCAweDIxMDQsIDB4OTA4NSwKKwkweDA4MDAsIDB4MjAwYSwgMHgwODBjLCAweDNmNDIsIDB4MDBjMCwgMHgyMDA5LCAweDAxMTQsIDB4MjEwNCwKKwkweDkwODUsIDB4NDAwMCwgMHgyMDBhLCAweDA4MGMsIDB4M2Y0MiwgMHgwMDc4LCAweDA4MGMsIDB4NzQzZSwKKwkweDExMjgsIDB4MDEyZSwgMHgyMDA5LCAweDAwMTYsIDB4MDgwNCwgMHgzNWI1LCAweDgxZmYsIDB4MDEyOCwKKwkweDAxMmUsIDB4MjAyMSwgMHg0MDBiLCAweDA4MDQsIDB4MzU4NSwgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwODBjLCAweDNhYTMsIDB4MjAwOSwKKwkweDAxMDEsIDB4MjEwYywgMHgwMDE2LCAweDdlYzgsIDB4N2RjYywgMHg5MDA2LCAweDIwNjgsIDB4MjA2MCwKKwkweDIwNTgsIDB4MDgwYywgMHg0MjBiLCAweDA4MGMsIDB4NDE1YiwgMHg5MDNlLCAweDI3MjAsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDA4NiwgMHgyOTQwLCAweDIwNzEsIDB4MWE2NSwgMHgyMDc5LCAweDAwOTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDAwMCwgMHg2ODg0LCAweGQwYjQsIDB4MDEyMCwgMHg2OGQ0LCAweDc4MGUsIDB4NjhkMCwKKwkweDc4MGEsIDB4MDBkZSwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGJjLCAweDA4MGMsIDB4MmM3NiwKKwkweDA4MGMsIDB4MmM3NiwgMHgwODBjLCAweDJjNzYsIDB4MDgwYywgMHgyYzc2LCAweDA4MGMsIDB4NDBiYywKKwkweDAwOGUsIDB4MDBlZSwgMHgwMGZlLCAweDA4MGMsIDB4M2ZlOSwgMHgyMDA5LCAweDljNDAsIDB4ODEwOSwKKwkweDExYjAsIDB4MDgwYywgMHgzZWY4LCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmZCwKKwkweDIxMDIsIDB4MDAxZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwKKwkweDAwOWUsIDB4MDA4ZSwgMHgyMDA5LCAweDAwMTcsIDB4MDgwYywgMHgzNWI1LCAweDBjZjgsIDB4MjAwMSwKKwkweDAyMGIsIDB4MjAwNCwgMHg5MDg0LCAweDAxNDAsIDB4MWQxMCwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwKKwkweDc4ODQsIDB4MDBmZSwgMHhkMGJjLCAweDAxNzgsIDB4MjAwMSwgMHgwMjAxLCAweDIwMGMsIDB4ODFmZiwKKwkweDAxNTAsIDB4MDgwYywgMHgzZmM3LCAweDJkMDAsIDB4OWMwNSwgMHg5YjA1LCAweDAxMjAsIDB4MDgwYywKKwkweDNlZjgsIDB4MDgwNCwgMHgzZWE1LCAweDA4MGMsIDB4NDEzMCwgMHgwODBjLCAweDQwNTQsIDB4MDgwYywKKwkweDNmYWEsIDB4MDgwYywgMHgzZmRmLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDBhYywKKwkweDAxMzAsIDB4OGI1OCwgMHgwODBjLCAweDNlZjgsIDB4MDBmZSwgMHgwODA0LCAweDNlYTUsIDB4MDBmZSwKKwkweDA4MGMsIDB4M2VlZSwgMHgxMTUwLCAweDhkNjgsIDB4MjAwMSwgMHgwMDMyLCAweDI2MDIsIDB4MjAwMSwKKwkweDAwMzMsIDB4MjUwMiwgMHgwODBjLCAweDNlZjgsIDB4MDA4MCwgMHg4N2ZmLCAweDAxMzgsIDB4MjAwMSwKKwkweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDE5MDgsIDB4ODczOSwgMHgwMDM4LCAweDIwMDEsIDB4MWE2MSwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAwLCAweDE5MDQsIDB4M2RmNSwgMHgyMDAxLCAweDAzMmYsIDB4MjAwMywKKwkweDAwZjYsIDB4ODYzMSwgMHgxMjA4LCAweDg1MjksIDB4MjUwMCwgMHg5NjA1LCAweDA5MDQsIDB4M2VhNSwKKwkweDc4ODQsIDB4ZDBiYywgMHgwMTI4LCAweDJkMDAsIDB4OWMwNSwgMHg5YjA1LCAweDE5MDQsIDB4M2VhNSwKKwkweGEwMTMsIDB4MDAxOSwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDc4ODQsIDB4ZDBhYywKKwkweDExNDgsIDB4MjAwMSwgMHgxYTYxLCAweDIwMDMsIDB4MDAwMywgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywKKwkweDAwMDksIDB4MDAzMCwgMHhhMDE3LCAweDAwMDEsIDB4NzhiNCwgMHg5MDA1LCAweDAxMDgsIDB4YTAxNiwKKwkweDI4MDAsIDB4YTA1YSwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDI5MDAsIDB4YTg1YSwKKwkweGE4MTMsIDB4MDAxOSwgMHg3ODg0LCAweGQwYTQsIDB4MTE4MCwgMHhhODE3LCAweDAwMDAsIDB4MDBjNiwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDYxLCAweDAwOTAsIDB4NjAyYiwgMHgwMDA4LCAweDIwMDEsIDB4MDIwMywKKwkweDIwMDQsIDB4MWYwNCwgMHgzZTdjLCAweDAwY2UsIDB4MDAzMCwgMHhhODE3LCAweDAwMDEsIDB4NzhiMCwKKwkweDkwMDUsIDB4MDEwOCwgMHhhODE2LCAweDAwZjYsIDB4MDBjNiwgMHgyMDc5LCAweDAxMDAsIDB4MjA2MSwKKwkweDAwOTAsIDB4NzgyNywgMHgwMDAyLCAweDIwMDEsIDB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwKKwkweDYwMWEsIDB4MDAwNiwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwgMHg2MDFlLCAweDc4YzYsIDB4MDAwZSwKKwkweDc4Y2EsIDB4MDBjZSwgMHgwMGZlLCAweDA4MDQsIDB4M2RhZiwgMHgwMDFlLCAweDAwYzYsIDB4MjAwMSwKKwkweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDIwNjEsIDB4MDEwMCwgMHg2MDI3LCAweDAwMDIsIDB4NjEwNiwKKwkweDIwMTEsIDB4MDIwZCwgMHgyMDEzLCAweDAwMjAsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywKKwkweGZmZmQsIDB4MjEwMiwgMHgwODBjLCAweDEyZWQsIDB4Nzg4NCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDFhMCwgMHgyMDA5LCAweDAwMjgsIDB4MDgwYywgMHgyNDEwLCAweDIwMDEsIDB4MDIyNywKKwkweDIwMGMsIDB4MjEwMiwgMHg2MDUwLCAweDkwODQsIDB4YjdlZiwgMHg2MDUyLCAweDYwMmYsIDB4MDAwMCwKKwkweDYwNGIsIDB4ZjdmNywgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDAwY2UsIDB4MmQwOCwKKwkweDJjMTAsIDB4MmIxOCwgMHgyYjAwLCAweDljMDUsIDB4OWQwNSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA4ZSwgMHgxMTE4LCAweDAxMmUsIDB4MDgwNCwKKwkweDM1ODMsIDB4MDEyZSwgMHgyMDIxLCAweDQwMGMsIDB4MDgwNCwgMHgzNTg1LCAweDkwODUsIDB4MDAwMSwKKwkweDFkMDQsIDB4M2VmNywgMHgyMDkxLCAweDYwMDAsIDB4ODQyMCwgMHg5NDg2LCAweDAwNjQsIDB4MDAwNSwKKwkweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwKKwkweDIwMDEsIDB4MWE2MSwgMHgyMDAzLCAweDAwMDAsIDB4MDA3MSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywKKwkweDI0MTAsIDB4MjAwMSwgMHgwMjI3LCAweDIwMjQsIDB4MjQwMiwgMHgyMDAxLCAweDAxMDksIDB4MjAwMywKKwkweDQwMDAsIDB4OTAyNiwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweDFhNjUsIDB4NzAwMCwKKwkweDkwODYsIDB4MDAwMCwgMHgwNTIwLCAweDIwNzksIDB4MDA5MCwgMHgyMDA5LCAweDAyMDYsIDB4MjEwNCwKKwkweDIwMDksIDB4MDIwMywgMHgyMTBjLCAweDkxMDYsIDB4MTEyMCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywKKwkweDI0MTAsIDB4NzgyYywgMHhkMGZjLCAweDBkODgsIDB4MDgwYywgMHg0MTMwLCAweDcwMDAsIDB4OTA4NiwKKwkweDAwMDAsIDB4MWQ1OCwgMHg3ODJiLCAweDAwMDQsIDB4NzgyYywgMHhkMGFjLCAweDFkZTgsIDB4MjAwOSwKKwkweDAwNDAsIDB4MDgwYywgMHgyNDEwLCAweDc4MmIsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwYywKKwkweDc5MzIsIDB4NzkzNiwgMHgwODBjLCAweDI4YzUsIDB4Nzg1MCwgMHg5MDg0LCAweGZiZmYsIDB4OTA4NSwKKwkweDAwMzAsIDB4Nzg1MiwgMHgyMDE5LCAweDAxZjQsIDB4ODMxOSwgMHgxZGYwLCAweDkwODQsIDB4ZmZjZiwKKwkweDkwODUsIDB4MjAwMCwgMHg3ODUyLCAweDIwYTksIDB4MDA0NiwgMHgxZDA0LCAweDNmNWQsIDB4MjA5MSwKKwkweDYwMDAsIDB4MWYwNCwgMHgzZjVkLCAweDc4NTAsIDB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZGZmZiwKKwkweDc4NTIsIDB4MjAwMSwgMHgwMDIxLCAweDIwMDQsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMSwKKwkweDExMjAsIDB4Nzg1MCwgMHg5MDg0LCAweGRmZmYsIDB4Nzg1MiwgMHg3ODRiLCAweGY3ZjcsIDB4Nzg0MywKKwkweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDIwYTksIDB4MDAyOCwgMHhhMDAxLCAweDFmMDQsIDB4M2Y3ZCwKKwkweDc4NTAsIDB4OTA4NSwgMHgxNDAwLCAweDc4NTIsIDB4MjAxOSwgMHg2MWE4LCAweDc4NTQsIDB4YTAwMSwKKwkweGEwMDEsIDB4ZDA4YywgMHgxMTEwLCAweDgzMTksIDB4MWRjOCwgMHg3ODI3LCAweDAwNDgsIDB4Nzg1MCwKKwkweDkwODUsIDB4MDQwMCwgMHg3ODUyLCAweDc4NDMsIDB4MDA0MCwgMHgyMDE5LCAweDAxZjQsIDB4YTAwMSwKKwkweGEwMDEsIDB4ODMxOSwgMHgxZGUwLCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4NzgyNywKKwkweDAwMjAsIDB4Nzg0MywgMHgwMDAwLCAweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDc4MjcsIDB4MDA0OCwKKwkweDAwZmUsIDB4MDAwNSwgMHg3ODg0LCAweGQwYWMsIDB4MTFjOCwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwKKwkweDFhNjEsIDB4MjA3OSwgMHgwMzIwLCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MDE2MCwKKwkweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDExNDAsIDB4MDA1MSwgMHhkMGJjLCAweDAxMDgsIDB4ODczOCwKKwkweDcwMDMsIDB4MDAwMywgMHg3ODJiLCAweDAwMTksIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDIwNzksIDB4MDMwMCwgMHg3OGJjLCAweDAwZmUsIDB4OTA4YywgMHgwMDcwLCAweDAxNzgsIDB4MjAwOSwKKwkweDAwMzIsIDB4MjYwYSwgMHgyMDA5LCAweDAwMzMsIDB4MjUwYSwgMHhkMGI0LCAweDAxMDgsIDB4OGM2MCwKKwkweGQwYWMsIDB4MDEwOCwgMHg4ZDY4LCAweGQwYTQsIDB4MDEwOCwgMHg4YjU4LCAweDAwMDUsIDB4MDBmNiwKKwkweDIwNzksIDB4MDIwMCwgMHg3ODFjLCAweGQwODQsIDB4MDExMCwgMHg3ODM3LCAweDAwNTAsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAxMDAsIDB4MjAwMSwgMHgxOWE5LCAweDIwMDQsIDB4NzBlMiwKKwkweDA4MGMsIDB4M2NkOSwgMHgxMTg4LCAweDIwMDEsIDB4MTgyMCwgMHgyMDA0LCAweDIwMDksIDB4MTgxZiwKKwkweDIxMGMsIDB4OTE4YywgMHgwMGZmLCAweDcwNmUsIDB4NzE2YSwgMHg3MDY2LCAweDkxOGQsIDB4MzIwMCwKKwkweDcxNjIsIDB4NzA3MywgMHhlMTA5LCAweDAwODAsIDB4NzAyYywgMHg5MDg1LCAweDAwMDIsIDB4NzAyZSwKKwkweDIwMDksIDB4MTgxOCwgMHgyMTBjLCAweDcxNmUsIDB4NzA2MywgMHgwMTAwLCAweDcxNjYsIDB4NzE5ZSwKKwkweDcwNmIsIDB4MDAwMCwgMHg3MDczLCAweDA4MDksIDB4NzA3NywgMHgwMDA4LCAweDcwNzgsIDB4OTA4MCwKKwkweDAxMDAsIDB4NzA3YSwgMHg3MDgwLCAweDgwMDAsIDB4NzA4MiwgMHg3MDg3LCAweGFhYWEsIDB4OTAwNiwKKwkweDcwOGEsIDB4NzA4ZSwgMHg3MDdlLCAweDcwZDYsIDB4NzBhYiwgMHgwMDM2LCAweDcwYWYsIDB4OTVkNSwKKwkweDcwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDA5MiwgMHg3MDE2LCAweDA4MGMsIDB4NDEzMCwKKwkweDAwZjYsIDB4MjA3MSwgMHgxYTYxLCAweDIwNzksIDB4MDMyMCwgMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwKKwkweDY4ODQsIDB4ZDBiNCwgMHgwMTIwLCAweDY4OWMsIDB4NzgwZSwgMHg2ODk4LCAweDc4MGEsIDB4MDBkZSwKKwkweDIwMDksIDB4MDNlOCwgMHg4MTA5LCAweDFkZjAsIDB4NzkyYywgMHhkMWZjLCAweDAxMTAsIDB4NzgyYiwKKwkweDAwMDQsIDB4MjAxMSwgMHgwMDExLCAweDA4MGMsIDB4NDBiYywgMHgyMDExLCAweDAwMDEsIDB4MDgwYywKKwkweDQwYmMsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDIwNzEsIDB4MWE2MSwKKwkweDIwNzksIDB4MDMyMCwgMHg3OTJjLCAweGQxZmMsIDB4MDkwNCwgMHg0MGI5LCAweDc4MmIsIDB4MDAwMiwKKwkweDkwMjYsIDB4ZDE5YywgMHgxOTA0LCAweDQwYjUsIDB4NzAwMCwgMHgwMDAyLCAweDQwYjksIDB4NDA2YSwKKwkweDQwOWEsIDB4NDBiNSwgMHhkMWJjLCAweDExNzAsIDB4ZDFkYywgMHgxMTkwLCAweDgwMDEsIDB4NzAwMiwKKwkweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDQwYmMsIDB4MDkwNCwgMHg0MGI5LCAweDA4MGMsIDB4NDBiYywKKwkweDA4MDQsIDB4NDBiOSwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwgMHg3OGJmLCAweDAwMDAsIDB4MDBmZSwKKwkweDc4MTAsIDB4NzkxNCwgMHg3ODJiLCAweDAwMDQsIDB4NzgxMiwgMHg3OTE2LCAweDIwMDEsIDB4MDIwMSwKKwkweDIwMGMsIDB4ODFmZiwgMHgwZGU4LCAweDA4MGMsIDB4M2ZjNywgMHgyMDA5LCAweDAwMDEsIDB4MDBmNiwKKwkweDIwNzksIDB4MDMwMCwgMHg3OGI4LCAweDAwZmUsIDB4ZDBlYywgMHgwMTEwLCAweDIwMDksIDB4MDAxMSwKKwkweDc5MmEsIDB4MDBmOCwgMHg4MDAxLCAweDcwMDIsIDB4OTE4NCwgMHgwODgwLCAweDExNDAsIDB4NzgyYywKKwkweGQwZmMsIDB4MTkwNCwgMHg0MDVlLCAweDIwMTEsIDB4MDAwMSwgMHgwMGIxLCAweDAwOTAsIDB4YTAxMCwKKwkweDkwOTIsIDB4MDAwNCwgMHg5MDg2LCAweDAwMTUsIDB4MTEyMCwgMHhhMDAwLCAweGEwNWEsIDB4MjAxMSwKKwkweDAwMzEsIDB4YTIxMiwgMHhkMWRjLCAweDE5NjAsIDB4MDgyOCwgMHg3ODJiLCAweDAwMDQsIDB4NzAwMywKKwkweDAwMDAsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4YTAxNCwgMHg5MDA1LCAweDA1NTAsIDB4ODAwMSwKKwkweDAwMzYsIDB4MDA5NiwgMHhhMDE2LCAweGEwNTgsIDB4MjA0OCwgMHhhMDEwLCAweDIwMDksIDB4MDAzMSwKKwkweDkxMWEsIDB4ODMxYywgMHg4MzFjLCAweDkzOGEsIDB4MDAwNywgMHgxYTBjLCAweDBkZDUsIDB4OTM5OCwKKwkweDQwZWEsIDB4MjMxZCwgMHgwODNmLCAweDkwODAsIDB4MDAwNCwgMHg3YTJhLCAweDcxMDAsIDB4ODEwOCwKKwkweDcxMDIsIDB4MDA5ZSwgMHgwMDNlLCAweDkwOGEsIDB4MDAzNSwgMHgxMTQwLCAweDAwOTYsIDB4YTA1OCwKKwkweDIwNDgsIDB4YTgwNCwgMHhhMDVhLCAweDIwMDEsIDB4MDAxOSwgMHgwMDllLCAweGEwMTIsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHg0MTI3LCAweDQxMWUsIDB4NDExNSwgMHg0MTBjLCAweDQxMDMsIDB4NDBmYSwKKwkweDQwZjEsIDB4YTk2NCwgMHg3OTAyLCAweGE5NjgsIDB4NzkwNiwgMHhhOTZjLCAweDc5MTIsIDB4YTk3MCwKKwkweDc5MTYsIDB4MDAwNSwgMHhhOTc0LCAweDc5MDIsIDB4YTk3OCwgMHg3OTA2LCAweGE5N2MsIDB4NzkxMiwKKwkweGE5ODAsIDB4NzkxNiwgMHgwMDA1LCAweGE5ODQsIDB4NzkwMiwgMHhhOTg4LCAweDc5MDYsIDB4YTk4YywKKwkweDc5MTIsIDB4YTk5MCwgMHg3OTE2LCAweDAwMDUsIDB4YTk5NCwgMHg3OTAyLCAweGE5OTgsIDB4NzkwNiwKKwkweGE5OWMsIDB4NzkxMiwgMHhhOWEwLCAweDc5MTYsIDB4MDAwNSwgMHhhOWE0LCAweDc5MDIsIDB4YTlhOCwKKwkweDc5MDYsIDB4YTlhYywgMHg3OTEyLCAweGE5YjAsIDB4NzkxNiwgMHgwMDA1LCAweGE5YjQsIDB4NzkwMiwKKwkweGE5YjgsIDB4NzkwNiwgMHhhOWJjLCAweDc5MTIsIDB4YTljMCwgMHg3OTE2LCAweDAwMDUsIDB4YTljNCwKKwkweDc5MDIsIDB4YTljOCwgMHg3OTA2LCAweGE5Y2MsIDB4NzkxMiwgMHhhOWQwLCAweDc5MTYsIDB4MDAwNSwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMDg2LCAweDIwNzEsIDB4MWE2NSwgMHgyMDc5LCAweDAwOTAsIDB4NzkyYywKKwkweGQxZmMsIDB4MDFlOCwgMHg3ODJiLCAweDAwMDIsIDB4Mjk0MCwgMHg5MDI2LCAweDcwMDAsIDB4MDAwMiwKKwkweDQxNTcsIDB4NDE0MywgMHg0MTRlLCAweDgwMDEsIDB4NzAwMiwgMHhkMTljLCAweDExODAsIDB4MjAxMSwKKwkweDAwMDEsIDB4MDgwYywgMHg0MGJjLCAweDE5MGMsIDB4NDBiYywgMHgwMDQ4LCAweDgwMDEsIDB4NzAwMiwKKwkweDc4MmMsIDB4ZDBmYywgMHgxZDM4LCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDQwYmMsIDB4MDA4ZSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MjA2MSwKKwkweDAyMDAsIDB4MjAwMSwgMHgxOWE5LCAweDIwMDQsIDB4NjAxYSwgMHgyMDYxLCAweDAxMDAsIDB4MjAwMSwKKwkweDE5YTgsIDB4MjAwNCwgMHg2MGNlLCAweDYxMDQsIDB4YzFhYywgMHg2MTA2LCAweDIwMDEsIDB4MDAyYywKKwkweDIwMDQsIDB4OTAwNSwgMHgwNTIwLCAweDIwMzgsIDB4MjAwMSwgMHgwMDJlLCAweDIwMjQsIDB4MjAwMSwKKwkweDAwMmYsIDB4MjAxYywgMHgwODBjLCAweDRiMWYsIDB4YTgxMywgMHgwMDE5LCAweGFmMTYsIDB4MjkwMCwKKwkweGE4NWEsIDB4OTc4YSwgMHgwMDA3LCAweDAyMjAsIDB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwKKwkweDI3MDgsIDB4OTAzZSwgMHgwMDk2LCAweGE4NTgsIDB4MjA0OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwKKwkweDAwOWUsIDB4MDgwYywgMHg0MWQzLCAweDFkNjgsIDB4MjkwMCwgMHhhODVhLCAweDAwZDAsIDB4MDgwYywKKwkweDRiMWYsIDB4YTgxMywgMHgwMDE5LCAweGE4MTcsIDB4MDAwMSwgMHgyOTAwLCAweGE4NWEsIDB4MjAwMSwKKwkweDAwMmUsIDB4MjAwNCwgMHhhODY2LCAweDIwMDEsIDB4MDAyZiwgMHgyMDA0LCAweGE4NmEsIDB4MjAwMSwKKwkweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4YTg2ZSwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwKKwkweGE4NzIsIDB4MjA2MSwgMHgwMDkwLCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweDE5YTgsIDB4MjAwNCwKKwkweDYwMzYsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjQxMCwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwKKwkweDkwODQsIDB4ZmZmOCwgMHg2MDFhLCAweDAwMDYsIDB4MjAwMSwgMHgwMDJiLCAweDIwMDQsIDB4NjAxZSwKKwkweDc4YzYsIDB4MDAwZSwgMHg3OGNhLCAweDkwMDYsIDB4NjAwYSwgMHg2MDBlLCAweDAwOGUsIDB4MDBjZSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMDgwLCAweGFhNjAsIDB4MjJlOCwKKwkweDIwYTAsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDA4OCwgMHg3MDJiLCAweDAwMjYsIDB4NzQwMiwKKwkweDczMDYsIDB4OTAwNiwgMHg3MDBhLCAweDcwMGUsIDB4ODEwYiwgMHg4MTBiLCAweDIxYTgsIDB4ODEwYiwKKwkweDcxMTIsIDB4NzAyYiwgMHgwMDQxLCAweDcwMmMsIDB4ZDBmYywgMHgwZGU4LCAweDcwMmIsIDB4MDAwMiwKKwkweDcwMmIsIDB4MDA0MCwgMHg0MDA1LCAweDc0MDAsIDB4NzMwNCwgMHg4N2ZmLCAweDAxOTAsIDB4MDA4NiwKKwkweDAwOTYsIDB4Mjk0MCwgMHgwMDg2LCAweDA4MGMsIDB4NGIxZiwgMHgwMDhlLCAweGEwNTgsIDB4MDBhNiwKKwkweDIwNTAsIDB4MjkwMCwgMHhiMDA2LCAweGEwNWEsIDB4MDBhZSwgMHgwMDllLCAweDAwOGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjAwMSwgMHgwMDJkLCAweDIwMDQsIDB4OTAwNSwKKwkweDA1MjgsIDB4MjAzOCwgMHgyMDAxLCAweDAwMzAsIDB4MjAyNCwgMHgyMDAxLCAweDAwMzEsIDB4MjAxYywKKwkweDA4MGMsIDB4NGIxZiwgMHgyOTQwLCAweGE4MTMsIDB4MDAxOSwgMHhhZjE2LCAweDI5MDAsIDB4YTg1YSwKKwkweDk3OGEsIDB4MDAwNywgMHgwMjIwLCAweDIxMzgsIDB4MjAwOSwgMHgwMDA3LCAweDAwMTAsIDB4MjcwOCwKKwkweDkwM2UsIDB4MDA5NiwgMHhhODU4LCAweDIwNDgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MDA5ZSwKKwkweDA4MGMsIDB4NDFkMywgMHgxZDY4LCAweDI5MDAsIDB4YTg1YSwgMHgwMGQ4LCAweDA4MGMsIDB4NGIxZiwKKwkweDI5NDAsIDB4YTAxMywgMHgwMDE5LCAweGEwMTcsIDB4MDAwMSwgMHgyODAwLCAweGEwNWEsIDB4MjAwMSwKKwkweDAwMzAsIDB4MjAwNCwgMHhhMDY2LCAweDIwMDEsIDB4MDAzMSwgMHgyMDA0LCAweGEwNmEsIDB4MjAwMSwKKwkweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4YTA2ZSwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwKKwkweGEwNzIsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHg3ODg0LCAweGQwYWMsIDB4MTE4MCwKKwkweDIwMDEsIDB4MDEwMSwgMHgyMDBjLCAweDkxOGQsIDB4MDIwMCwgMHgyMTAyLCAweGEwMTcsIDB4MDAwMCwKKwkweDIwMDEsIDB4MWE2MSwgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwOSwKKwkweDIwMDEsIDB4MDMwMCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGQsIDB4MDAwMiwgMHgyMTAyLCAweDAwZWUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNywgMHgyMGExLCAweDE4NDAsIDB4MjBlOSwKKwkweDAwMDEsIDB4OTAwNiwgMHg0MDA0LCAweDIwYTksIDB4MDAxNCwgMHgyMGExLCAweGZmZWMsIDB4MjBlOSwKKwkweDAwMDAsIDB4OTAwNiwgMHg0MDA0LCAweDIwMDksIDB4MDEzYywgMHgyMDBhLCAweDAxMmUsIDB4Nzg4MCwKKwkweDkwODYsIDB4MDA1MiwgMHgwMTA4LCAweDAwMDUsIDB4MDgwNCwgMHgzNTgzLCAweDdkOTgsIDB4N2M5YywKKwkweDA4MDQsIDB4MzY4NSwgMHgwODBjLCAweDc0M2UsIDB4MTkwYywgMHg2MDcyLCAweDYwNDAsIDB4OTA4NCwKKwkweDAwMjAsIDB4MDliMSwgMHgyMDY5LCAweDE4NDcsIDB4MmQwMCwgMHgyMDA5LCAweDAwMzAsIDB4N2E4YywKKwkweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDIwMzksIDB4MDAwMSwgMHgwODBjLCAweDRiNjgsIDB4NzAxZiwKKwkweDQyYjIsIDB4MDAwNSwgMHgwODBjLCAweDU3NmMsIDB4MTEzMCwgMHgzYjAwLCAweDNhMDgsIDB4YzE5NCwKKwkweGMwOTUsIDB4MjBkOCwgMHgyMWQwLCAweDIwNjksIDB4MTg0NywgMHg2ODAwLCAweDkwMDUsIDB4MDkwNCwKKwkweDM1YjgsIDB4NjgwNCwgMHhkMGFjLCAweDAxMTgsIDB4ZDBhNCwgMHgwOTA0LCAweDM1YjgsIDB4ZDA5NCwKKwkweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4MDEzOCwgMHg2MjAwLCAweDkyOTIsIDB4MDAwNSwKKwkweDAyMTgsIDB4OTE4YywgMHhmZmRmLCAweDAwMTAsIDB4OTE4ZCwgMHgwMDIwLCAweDYxMDYsIDB4MDBjZSwKKwkweGQwOGMsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMTE4LCAweDkxOGQsIDB4MDAxMCwKKwkweDAwMTAsIDB4OTE4YywgMHhmZmVmLCAweDYxMDYsIDB4MDBjZSwgMHhkMDg0LCAweDAxNTgsIDB4NmEyOCwKKwkweDkyOGEsIDB4MDA3ZiwgMHgxYTA0LCAweDM1YjgsIDB4OTI4OCwgMHgzMzg0LCAweDIxMGQsIDB4OTE4YywKKwkweDAwZmYsIDB4NjE2NiwgMHhkMGRjLCAweDAxMzAsIDB4NjgyOCwgMHg5MDhhLCAweDAwN2YsIDB4MWEwNCwKKwkweDM1YjgsIDB4NjA1ZSwgMHg2ODg4LCAweDkwODQsIDB4MDAzMCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwKKwkweDgwMDQsIDB4MDAwNiwgMHgyMDA5LCAweDE5YjAsIDB4OTA4MCwgMHgyOWI4LCAweDIwMDUsIDB4MjAwYSwKKwkweDAwMGUsIDB4MjAwOSwgMHgxOWIxLCAweDkwODAsIDB4MjliYywgMHgyMDA1LCAweDIwMGEsIDB4NjgwOCwKKwkweDkwOGEsIDB4MDEwMCwgMHgwYTA0LCAweDM1YjgsIDB4OTA4YSwgMHgwODQxLCAweDFhMDQsIDB4MzViOCwKKwkweDkwODQsIDB4MDAwNywgMHgxOTA0LCAweDM1YjgsIDB4NjgwYywgMHg5MDA1LCAweDA5MDQsIDB4MzViOCwKKwkweDY4MTAsIDB4OTAwNSwgMHgwOTA0LCAweDM1YjgsIDB4Njg0OCwgMHg2OTQwLCAweDkxMGEsIDB4MWEwNCwKKwkweDM1YjgsIDB4ODAwMSwgMHgwOTA0LCAweDM1YjgsIDB4Njg0YywgMHg2OTQ0LCAweDkxMGEsIDB4MWEwNCwKKwkweDM1YjgsIDB4ODAwMSwgMHgwOTA0LCAweDM1YjgsIDB4MjAwOSwgMHgxOTgwLCAweDIwMGIsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTg2OSwgMHgyMDA0LCAweGQwYzQsIDB4MDE0MCwgMHg3ODg0LCAweDIwMGEsIDB4MjAwOSwKKwkweDAxN2YsIDB4MjAwYSwgMHgzYjAwLCAweGMwODUsIDB4MjBkOCwgMHg2ODE0LCAweDkwOGMsIDB4MDBmZiwKKwkweDYxNGUsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4NjA1MiwgMHgwODBjLCAweDc3NTUsIDB4MDgwYywKKwkweDZhM2UsIDB4MDgwYywgMHg2YTcyLCAweDY4MDgsIDB4NjAyYSwgMHgwODBjLCAweDIzODIsIDB4MjAwOSwKKwkweDAxNzAsIDB4MjAwYiwgMHgwMDgwLCAweGEwMDEsIDB4YTAwMSwgMHgyMDBiLCAweDAwMDAsIDB4MDAzNiwKKwkweDZiMDgsIDB4MDgwYywgMHgyOTFmLCAweDAwM2UsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwNCwKKwkweDQ0NDksIDB4NjgxOCwgMHg2OTFjLCAweDZhMjAsIDB4NmIyNCwgMHg4MDA3LCAweDgxMGYsIDB4ODIxNywKKwkweDgzMWYsIDB4NjAxNiwgMHg2MTFhLCAweDYyMWUsIDB4NjMyMiwgMHg2YzA0LCAweGQ0ZjQsIDB4MDE0OCwKKwkweDY4MzAsIDB4NjkzNCwgMHg2YTM4LCAweDZiM2MsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwKKwkweDAwMTAsIDB4OTA4NCwgMHhmMGZmLCAweDYwMDYsIDB4NjEwYSwgMHg2MjBlLCAweDYzMTIsIDB4ODAwNywKKwkweDgxMGYsIDB4ODIxNywgMHg4MzFmLCAweDIwYTksIDB4MDAwNCwgMHgyMGExLCAweDE5YjIsIDB4MjBlOSwKKwkweDAwMDEsIDB4NDAwMSwgMHgyMGE5LCAweDAwMDQsIDB4MjBhMSwgMHgxOWNjLCAweDIwZTksIDB4MDAwMSwKKwkweDQwMDEsIDB4MDgwYywgMHg4NmFjLCAweDAwYzYsIDB4OTAwZSwgMHgyMGE5LCAweDAwMDEsIDB4NmI3MCwKKwkweGQzODQsIDB4MDUxMCwgMHgwMDY4LCAweDIwMDksIDB4MDEwMCwgMHgyMTBjLCAweDkxOGUsIDB4MDAwOCwKKwkweDExMTAsIDB4ODM5ZCwgMHgwMDEwLCAweDgzZjUsIDB4M2UxOCwgMHgxMmIwLCAweDM1MDgsIDB4ODEwOSwKKwkweDA4MGMsIDB4N2QwYywgMHg2ODc4LCAweDYwMTYsIDB4Njg3NCwgMHgyMDA4LCAweDkwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4NjAwYSwgMHg5MTg0LCAweDAwZmYsIDB4NjAwNiwgMHg4MTA4LCAweDExMTgsIDB4NjAwMywKKwkweDAwMDMsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDEsIDB4MWYwNCwgMHg0M2EzLCAweDAwY2UsIDB4MDBjNiwKKwkweDIwNjEsIDB4MTk5YiwgMHg2YTg4LCAweDkyODQsIDB4YzAwMCwgMHgyMDEwLCAweDkyODYsIDB4MDAwMCwKKwkweDExNTgsIDB4MjA2MywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJiYzYsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyYmE5LCAweDAwODgsIDB4OTI4NiwgMHg0MDAwLCAweDExNDgsIDB4MjA2MywKKwkweDAwMDEsIDB4OTAwNiwgMHgwODBjLCAweDJiYzYsIDB4OTAwNiwgMHgwODBjLCAweDJiYTksIDB4MDAyOCwKKwkweDkyODYsIDB4ODAwMCwgMHgxZDMwLCAweDIwNjMsIDB4MDAwMiwgMHgwMGNlLCAweDY4ODgsIDB4ZDBlYywKKwkweDAxMzAsIDB4MjAxMSwgMHgwMTE0LCAweDIyMDQsIDB4OTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4NmE4MCwKKwkweDkyODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMzAsIDB4MTEyOCwgMHg5Mjk0LCAweGZmY2YsIDB4OTI5NSwKKwkweDAwMjAsIDB4NmE4MiwgMHgyMDAxLCAweDE5N2IsIDB4NmE4MCwgMHg5Mjk0LCAweDAwMzAsIDB4OTI4ZSwKKwkweDAwMDAsIDB4MDE3MCwgMHg5MjhlLCAweDAwMTAsIDB4MDExOCwgMHg5MjhlLCAweDAwMjAsIDB4MDE0MCwKKwkweDIwMDMsIDB4YWFhYSwgMHgwODBjLCAweDI5OTQsIDB4MjAwMSwgMHgxOTZjLCAweDIxMDIsIDB4MDAwOCwKKwkweDIxMDIsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDgwYywgMHg3NDNlLCAweDAxMjgsIDB4MDgwYywgMHg1MDU0LCAweDAxMTAsIDB4MDgwYywKKwkweDI4ZTUsIDB4NjBkNCwgMHg5MDA1LCAweDAxYzAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4NDQzMSwKKwkweDAwZTAsIDB4MDgwYywgMHg3NDNlLCAweDExNjgsIDB4MjAxMSwgMHg3MmNlLCAweDA4MGMsIDB4ODViMCwKKwkweDIwMTEsIDB4NzJjMSwgMHgwODBjLCAweDg2OGEsIDB4MDgwYywgMHg3NzI5LCAweDA4MGMsIDB4NzM2YSwKKwkweDAwNDAsIDB4MDgwYywgMHg1ZjZjLCAweDAwMjgsIDB4NjAwMywgMHgwMDA0LCAweDIwMDksIDB4NDQ0OSwKKwkweDAwMjAsIDB4MDgwYywgMHg2OTZlLCAweDA4MDQsIDB4MzU4MywgMHgyMDAxLCAweDAxNzAsIDB4MjAwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwNGMsIDB4MTExOCwgMHgyMDkxLCAweDMwYmQsIDB4MDgxNywKKwkweDIwOTEsIDB4MzAzZCwgMHgwODE3LCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA5MDQsIDB4MzViNSwKKwkweDIwNjksIDB4MTg0NywgMHg3ODkwLCAweDY4NDIsIDB4Nzg5NCwgMHg2ODQ2LCAweDJkMDAsIDB4MjAwOSwKKwkweDAwMzAsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgyMDM5LCAweDAwMDEsIDB4MDgwNCwKKwkweDRiNmIsIDB4OTAwNiwgMHgwODBjLCAweDI4ZTUsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywKKwkweDc0M2UsIDB4MTFiMCwgMHgwODBjLCAweDc3MjQsIDB4MDgwYywgMHg2MGFkLCAweDA4MGMsIDB4MzM3OCwKKwkweDAxMTgsIDB4NjEzMCwgMHhjMThkLCAweDYxMzIsIDB4MDgwYywgMHhkMzg4LCAweDAxMzAsIDB4MDgwYywKKwkweDc0NjEsIDB4MTExOCwgMHgwODBjLCAweDc0MTYsIDB4MDAzOCwgMHgwODBjLCAweDczNmEsIDB4MDAyMCwKKwkweDA4MGMsIDB4NjA3MiwgMHgwODBjLCAweDVmNmMsIDB4MDgwNCwgMHgzNTgzLCAweDgxZmYsIDB4MTkwNCwKKwkweDM1YjUsIDB4MDgwYywgMHg3NDNlLCAweDExMTAsIDB4MDgwNCwgMHgzNWI1LCAweDYxOTQsIDB4ODFmZiwKKwkweDAxYTgsIDB4NzA0ZiwgMHgwMDAwLCAweDIwMDEsIDB4MWM4MCwgMHgyMDA5LCAweDAwNDAsIDB4N2E4YywKKwkweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzksIDB4MDAwMSwKKwkweDA4MGMsIDB4NGI2YiwgMHg3MDFmLCAweDM1ODEsIDB4MDEyZSwgMHgwMDA1LCAweDcwNGYsIDB4MDAwMSwKKwkweDAwZDYsIDB4MjA2OSwgMHgxYzgwLCAweDIwYTksIDB4MDA0MCwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDFjODAsIDB4MjAxOSwgMHhmZmZmLCAweDQzMDQsIDB4NjU1YywgMHg5NTg4LCAweDMzODQsIDB4MjEwZCwKKwkweDkxOGMsIDB4MDBmZiwgMHgyMTZhLCAweDkwMGUsIDB4MjAxMSwgMHgwMDAyLCAweDIxMDAsIDB4OTUwNiwKKwkweDAxYTgsIDB4MDgwYywgMHg2Njk5LCAweDExOTAsIDB4YjgxNCwgMHg4MjFjLCAweDAyMzgsIDB4OTM5OCwKKwkweDFjODAsIDB4OTA4NSwgMHhmZjAwLCAweDgwMDcsIDB4MjAxYSwgMHgwMDM4LCAweDkzOTgsIDB4MWM4MCwKKwkweDIzMjQsIDB4OTRhNCwgMHhmZjAwLCAweDk0MDUsIDB4MjAxYSwgMHg4MjEwLCAweDgxMDgsIDB4OTE4MiwKKwkweDAwODAsIDB4MTIwOCwgMHgwYzE4LCAweDgyMDEsIDB4ODAwNywgMHgyZDBjLCAweDkxMDUsIDB4MjA2YSwKKwkweDAwZGUsIDB4MjBhOSwgMHgwMDQwLCAweDIwYTEsIDB4MWM4MCwgMHgyMDk5LCAweDFjODAsIDB4MDgwYywKKwkweDVmZmQsIDB4MDgwNCwgMHg0NGEzLCAweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsIDB4MDgwYywKKwkweDRiMWYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsIDB4NTc1ZCwKKwkweGQwYjQsIDB4MDU1OCwgMHg3ODg0LCAweDkwOGUsIDB4MDA3ZSwgMHgwNTM4LCAweDkwOGUsIDB4MDA3ZiwKKwkweDA1MjAsIDB4OTA4ZSwgMHgwMDgwLCAweDA1MDgsIDB4MDgwYywgMHgzMzczLCAweDExNDgsIDB4YjgwMCwKKwkweGQwOGMsIDB4MTFkOCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MTFhOCwKKwkweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNlNTEsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDUzMSwKKwkweDAwMDUsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgyMGE5LCAweDAwMmIsIDB4YjhjNCwKKwkweDIwZTAsIDB4YjhjOCwgMHgyMDk4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwKKwkweDIwYTAsIDB4NDAwMywgMHgyMGE5LCAweDAwMDgsIDB4OTA4MCwgMHgwMDA2LCAweDIwYTAsIDB4YjhjNCwKKwkweDIwZTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwgMHgwODBjLCAweDBmN2MsIDB4MDA3MCwKKwkweDIwYTksIDB4MDAwNCwgMHhhODVjLCAweDkwODAsIDB4MDAwYSwgMHgyMGEwLCAweGI4YzQsIDB4MjBlMCwKKwkweGI4YzgsIDB4OTA4MCwgMHgwMDBhLCAweDIwOTgsIDB4MDgwYywgMHgwZjdjLCAweDg5MDYsIDB4ODAwNiwKKwkweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4MjAwOSwKKwkweDAwMmIsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwODA0LCAweDRiNmIsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDRiMzYsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NjgwYiwKKwkweDA5MDQsIDB4MzViNSwgMHgwMDU4LCAweGE4NzgsIDB4OTAwNSwgMHgwMTIwLCAweDIwMDksIDB4MDAwNCwKKwkweDA4MDQsIDB4MzViNSwgMHhhOTc0LCAweGFhOTQsIDB4MDgwNCwgMHgzNTgzLCAweDA4MGMsIDB4NTc2NSwKKwkweDA5MDQsIDB4MzU4MywgMHg3MDFmLCAweDQ1N2IsIDB4NzAwNywgMHgwMDAzLCAweDAwMDUsIDB4ODFmZiwKKwkweDE5MDQsIDB4MzViNSwgMHg3ODg4LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1YjgsIDB4MDgwYywKKwkweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NmEwYywgMHgwMTIwLCAweDA4MGMsIDB4NmExNCwKKwkweDE5MDQsIDB4MzViOCwgMHgwODBjLCAweDY4OTAsIDB4MDkwNCwgMHgzNWI1LCAweDIwMTksIDB4MDAwNCwKKwkweDkwMGUsIDB4MDgwYywgMHg2ODFkLCAweDA5MDQsIDB4MzViNSwgMHg3OTg0LCAweDdhODgsIDB4MDRjOSwKKwkweDA4YTgsIDB4YTg5YywgMHg5MDhhLCAweDEwMDAsIDB4MTJmOCwgMHgwODBjLCAweDRiNTAsIDB4MDFlMCwKKwkweDA4MGMsIDB4NmEwYywgMHgwMTE4LCAweDA4MGMsIDB4NmExNCwgMHgxMWIwLCAweDA4MGMsIDB4Njg5MCwKKwkweDIwMDksIDB4MDAwMiwgMHgwMTY4LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweDY4MWQsIDB4MjAwOSwgMHgwMDAzLCAweDAxMjAsIDB4YTk5OCwgMHhhYTljLCAweDAwZDEsIDB4MDA2MCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDA4MGMsIDB4NTc2NSwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDE4LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwKKwkweDAwMDUsIDB4OTE4NiwgMHgwMGZmLCAweDAxMTAsIDB4MDA3MSwgMHgwMDYwLCAweDIwMjksIDB4MDA3ZSwKKwkweDIwNjEsIDB4MTgwMCwgMHg2NDVjLCAweDI0MDAsIDB4OTUwNiwgMHgwMTEwLCAweDI1MDgsIDB4MDAxOSwKKwkweDg1MjksIDB4MWVjOCwgMHgwMDA1LCAweDA4MGMsIDB4NjY5OSwgMHgxMTM4LCAweDIyMDAsIDB4ODAwMywKKwkweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDA4MGMsIDB4ODViZSwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwKKwkweDM1YjUsIDB4Nzk4YywgMHgyMDAxLCAweDE5N2YsIDB4OTE4YywgMHg4MDAwLCAweDIxMDIsIDB4MDgwYywKKwkweDRiMzYsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NmEwYywgMHgwMTIwLCAweDA4MGMsIDB4NmExNCwKKwkweDE5MDQsIDB4MzViOCwgMHgwODBjLCAweDY3NjAsIDB4MDkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NjgxNCwKKwkweDA5MDQsIDB4MzViNSwgMHgyMDAxLCAweDE5N2YsIDB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MzU4MywKKwkweDA4MDQsIDB4NDU4NiwgMHhhOWEwLCAweDIwMDEsIDB4MTk3ZiwgMHg5MThjLCAweDgwMDAsIDB4YzE4ZCwKKwkweDIxMDIsIDB4MDgwYywgMHg0YjQzLCAweDAxYTAsIDB4MDgwYywgMHg2YTBjLCAweDAxMTgsIDB4MDgwYywKKwkweDZhMTQsIDB4MTE3MCwgMHgwODBjLCAweDY3NjAsIDB4MjAwOSwgMHgwMDAyLCAweDAxMjgsIDB4MDgwYywKKwkweDY4MTQsIDB4MTE3MCwgMHgyMDA5LCAweDAwMDMsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwKKwkweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwKKwkweGE4OTcsIDB4NDAwMCwgMHgyMDAxLCAweDE5N2YsIDB4MjAwNCwgMHhkMGZjLCAweDExMjgsIDB4MDgwYywKKwkweDU3NjUsIDB4MDExMCwgMHg5MDA2LCAweDAwMTgsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMDAsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzViNSwgMHg3OThjLCAweDIwMDEsIDB4MTk3ZSwKKwkweDkxOGMsIDB4ODAwMCwgMHgyMTAyLCAweDA4MGMsIDB4NGIzNiwgMHgwOTA0LCAweDM1YjgsIDB4MDgwYywKKwkweDZhMGMsIDB4MDEyMCwgMHgwODBjLCAweDZhMTQsIDB4MTkwNCwgMHgzNWI4LCAweDA4MGMsIDB4Njc2MCwKKwkweDA5MDQsIDB4MzViNSwgMHgwODBjLCAweDY4MDIsIDB4MDkwNCwgMHgzNWI1LCAweDIwMDEsIDB4MTk3ZSwKKwkweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDM1ODMsIDB4MDgwNCwgMHg0NTg2LCAweGE5YTAsIDB4MjAwMSwKKwkweDE5N2UsIDB4OTE4YywgMHg4MDAwLCAweGMxOGQsIDB4MjEwMiwgMHgwODBjLCAweDRiNDMsIDB4MDFhMCwKKwkweDA4MGMsIDB4NmEwYywgMHgwMTE4LCAweDA4MGMsIDB4NmExNCwgMHgxMTcwLCAweDA4MGMsIDB4Njc2MCwKKwkweDIwMDksIDB4MDAwMiwgMHgwMTI4LCAweDA4MGMsIDB4NjgwMiwgMHgxMTcwLCAweDIwMDksIDB4MDAwMywKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDIwMDEsIDB4MTk3ZSwKKwkweDIwMDQsIDB4ZDBmYywgMHgxMTI4LCAweDA4MGMsIDB4NTc2NSwgMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwKKwkweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwMDA1LCAweDYxMDAsIDB4MDgwNCwKKwkweDM1ODMsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDU3NzEsIDB4MTkwNCwKKwkweDM1YjUsIDB4NzlhOCwgMHhkMTg0LCAweDExNTgsIDB4YjgzNCwgMHg4MDA3LCAweDc4OWUsIDB4YjgzMCwKKwkweDgwMDcsIDB4Nzg5YSwgMHhiYjJjLCAweDgzMWYsIDB4YmEyOCwgMHg4MjE3LCAweDAwNTAsIDB4YjgyNCwKKwkweDgwMDcsIDB4Nzg5ZSwgMHhiODIwLCAweDgwMDcsIDB4Nzg5YSwgMHhiYjFjLCAweDgzMWYsIDB4YmExOCwKKwkweDgyMTcsIDB4YjkwMCwgMHg5MThjLCAweDAyMDIsIDB4MDgwNCwgMHgzNTgzLCAweDc4YTgsIDB4OTA5YywKKwkweDAwMDMsIDB4ZDBhYywgMHgxMTU4LCAweGQwYjQsIDB4MTE0OCwgMHg5MzlhLCAweDAwMDMsIDB4MWEwNCwKKwkweDM1YjUsIDB4NjI1YywgMHg3ODg0LCAweDkyMDYsIDB4MTkwNCwgMHg0NzNiLCAweDA4MGMsIDB4ODY5NiwKKwkweDIwMDEsIDB4ZmZlYywgMHgyMDA5LCAweDAwMGMsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwKKwkweDIwMzksIDB4MDAwMCwgMHgwMDA2LCAweDc4YTgsIDB4OTA4NCwgMHgwMDgwLCAweDExZjgsIDB4MDAwNiwKKwkweDAwMzYsIDB4MjAwMSwgMHgxYTdmLCAweDIwMWMsIDB4N2I5YSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwKKwkweDFhODAsIDB4MjAxYywgMHg3YjllLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDFhODEsIDB4MjAxYywKKwkweDdiYTIsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE3YiwgMHgyMDFjLCAweDdiYWEsIDB4MjAwMywKKwkweDAwMDAsIDB4MDAzZSwgMHgwMDBlLCAweDAwMGUsIDB4MDgwNCwgMHg0YjZiLCAweDAwMGUsIDB4MjAzMSwKKwkweDAwMDAsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTY2YSwgMHhhMTdhLCAweGE3NzIsIDB4YTA3NiwKKwkweGEyOGUsIDB4YTM5MiwgMHhhNDk2LCAweGE1OWEsIDB4MDgwYywgMHgxMGU5LCAweDcwMDcsIDB4MDAwMiwKKwkweDcwMWYsIDB4NDc1YiwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NGI1MiwKKwkweDA5MDQsIDB4MzViOCwgMHgwODBjLCAweDZhMGMsIDB4MTkwNCwgMHgzNWI1LCAweDAwYzYsIDB4MDgwYywKKwkweDRiMWYsIDB4MDBjZSwgMHgwOTA0LCAweDM1YjUsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwKKwkweGE4NmEsIDB4N2VhOCwgMHgwODBjLCAweGNkZjcsIDB4MDkwNCwgMHgzNWI1LCAweDcwMDcsIDB4MDAwMywKKwkweDcwMWYsIDB4NDc3YiwgMHgwMDA1LCAweDA4MGMsIDB4NDI3OCwgMHgwMDA2LCAweDAwMzYsIDB4MjAwMSwKKwkweDFhN2YsIDB4MjAxYywgMHg3YjlhLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDFhODAsIDB4MjAxYywKKwkweDdiOWUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE4MSwgMHgyMDFjLCAweDdiYTIsIDB4MjAwMywKKwkweDAwMDAsIDB4MjAwMSwgMHgxYTdiLCAweDIwMWMsIDB4N2JhYSwgMHgyMDAzLCAweDAwMDAsIDB4MDAzZSwKKwkweDAwMGUsIDB4MDgwNCwgMHgzNTgzLCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MzViNSwKKwkweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMWIsIDB4MjAwOSwgMHgwMDBjLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwNCwKKwkweDRiNmIsIDB4OTAwNiwgMHgwODBjLCAweDI4ZTUsIDB4NzhhOCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwZmYsIDB4MDExOCwgMHg4MWZmLCAweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDc0M2UsIDB4MDExMCwKKwkweDA4MGMsIDB4NjA3MiwgMHg3ODg4LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1YjgsIDB4Nzk4NCwKKwkweDkxODYsIDB4MDBmZiwgMHgwMTM4LCAweDkxODIsIDB4MDA3ZiwgMHgxYTA0LCAweDM1YjgsIDB4MjEwMCwKKwkweDA4MGMsIDB4MjhhZiwgMHgwMDI2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwKKwkweDE5ZjksIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHg2MDczLCAweDAwMDAsIDB4NjA3NywKKwkweDAwMDAsIDB4MDgwYywgMHg3NDNlLCAweDExNTgsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDc0ODUsIDB4MDgwYywgMHg3MzZhLCAweDAwZDAsIDB4MDgwYywKKwkweGFlYjQsIDB4MjA2MSwgMHgwMTAwLCAweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweDgxMGYsIDB4OTEwNSwgMHg2MDRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwKKwkweDE5OTgsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDVmOTgsIDB4MDgwYywKKwkweDg2NDgsIDB4Nzk4NCwgMHgwODBjLCAweDc0M2UsIDB4MTExMCwgMHgyMDA5LCAweDAwZmYsIDB4N2E4OCwKKwkweDA4MGMsIDB4NDVlOSwgMHgwMTJlLCAweDAwY2UsIDB4MDAyZSwgMHgwODA0LCAweDM1ODMsIDB4Nzk4NCwKKwkweDA4MGMsIDB4NjYzOCwgMHgyYjA4LCAweDE5MDQsIDB4MzViOCwgMHgwODA0LCAweDM1ODMsIDB4ODFmZiwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzViNSwgMHg2MGRjLCAweGQwYWMsIDB4MTEzMCwKKwkweGQwOWMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDUsIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsIDB4NGIxZiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwgMHg3OTg0LCAweDkxOTIsIDB4MDAyMSwKKwkweDFhMDQsIDB4MzViOCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4NzAyYSwgMHhhZjYwLCAweDc3MzYsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsIDB4NDgyZiwKKwkweDc4ODAsIDB4OTA4NiwgMHgwMDZlLCAweDAxMTAsIDB4NzAxZiwgMHg1MjA2LCAweDAwMDUsIDB4MjAwOSwKKwkweDAwODAsIDB4MDgwYywgMHg2Njk5LCAweDExMTgsIDB4MDgwYywgMHg2YTBjLCAweDAxMjAsIDB4MjAyMSwKKwkweDQwMGEsIDB4MDgwNCwgMHgzNTg1LCAweDAwZDYsIDB4MDA5NiwgMHhhOTY0LCAweGFhNmMsIDB4YWI3MCwKKwkweGFjNzQsIDB4YWQ3OCwgMHhhZTdjLCAweGE4ODQsIDB4OTBiZSwgMHgwMTAwLCAweDA5MDQsIDB4NDhjOCwKKwkweDkwYmUsIDB4MDExMiwgMHgwOTA0LCAweDQ4YzgsIDB4OTBiZSwgMHgwMTEzLCAweDA5MDQsIDB4NDhjOCwKKwkweDkwYmUsIDB4MDExNCwgMHgwOTA0LCAweDQ4YzgsIDB4OTBiZSwgMHgwMTE3LCAweDA5MDQsIDB4NDhjOCwKKwkweDkwYmUsIDB4MDExYSwgMHgwOTA0LCAweDQ4YzgsIDB4OTBiZSwgMHgwMTFjLCAweDA5MDQsIDB4NDhjOCwKKwkweDkwYmUsIDB4MDEyMSwgMHgwOTA0LCAweDQ4YWYsIDB4OTBiZSwgMHgwMTMxLCAweDA5MDQsIDB4NDhhZiwKKwkweDkwYmUsIDB4MDE3MSwgMHgwOTA0LCAweDQ4YzgsIDB4OTBiZSwgMHgwMTczLCAweDA5MDQsIDB4NDhjOCwKKwkweDkwYmUsIDB4MDFhMSwgMHgxMTI4LCAweGE4OTQsIDB4ODAwNywgMHhhODk2LCAweDA4MDQsIDB4NDhkMywKKwkweDkwYmUsIDB4MDIxMiwgMHgwOTA0LCAweDQ4YmMsIDB4OTBiZSwgMHgwMjEzLCAweDA1ZTgsIDB4OTBiZSwKKwkweDAyMTQsIDB4MDUwMCwgMHg5MGJlLCAweDAyMTcsIDB4MDE4OCwgMHg5MGJlLCAweDAyMWEsIDB4MTEyMCwKKwkweGE4OWMsIDB4ODAwNywgMHhhODllLCAweDA0ZTAsIDB4OTBiZSwgMHgwMjFmLCAweDA1YzgsIDB4OTBiZSwKKwkweDAzMDAsIDB4MDViMCwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHgzNWI4LCAweDcwMjgsIDB4OTA4MCwKKwkweDAwMTAsIDB4MjA5OCwgMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwNywKKwkweDA4MGMsIDB4NDkxMSwgMHg3MDI4LCAweDkwODAsIDB4MDAwZSwgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwKKwkweDIwZTAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywgMHg0OTExLCAweDAwYzgsIDB4NzAyOCwKKwkweDkwODAsIDB4MDAwYywgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwKKwkweDAwMDEsIDB4MDgwYywgMHg0OTFlLCAweDAwYjgsIDB4NzAyOCwgMHg5MDgwLCAweDAwMGUsIDB4MjA5OCwKKwkweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwgMHgwMDAxLCAweDA4MGMsIDB4NDkxZSwKKwkweDcwMjgsIDB4OTA4MCwgMHgwMDBjLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwKKwkweDIwYTksIDB4MDAwMSwgMHgwNGYxLCAweDAwYzYsIDB4MDgwYywgMHg0YjFmLCAweDA1NTAsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHhhODY3LCAweDAxMTksIDB4OTAwNiwgMHhhODgyLCAweGE4N2YsIDB4MDAyMCwKKwkweGE4OGIsIDB4MDAwMSwgMHg4MTBiLCAweGE5YWUsIDB4YThiMiwgMHhhYWI2LCAweGFiYmEsIDB4YWNiZSwKKwkweGFkYzIsIDB4YTljNiwgMHhhOGNhLCAweDAwY2UsIDB4MDA5ZSwgMHgwMGRlLCAweGE4NjYsIDB4YTgyMiwKKwkweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweGE4MDQsIDB4MjA0OCwgMHgwODBjLCAweGNlMTIsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDkwOCwKKwkweDAwMDUsIDB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwKKwkweGE4MjAsIDB4OTA4NiwgMHg4MDAxLCAweDE5MDQsIDB4MzU4MywgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwKKwkweDM1YjUsIDB4MDAxNiwgMHgwMDI2LCAweDM1MTAsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDIsIDB4NDEwNCwKKwkweDQwMDQsIDB4ODIxMSwgMHgxZGM4LCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgzNTIwLCAweDIwYTksIDB4MDAwNCwgMHg0MDAyLCAweDQzMDQsIDB4NDIwNCwKKwkweDQxMDQsIDB4NDAwNCwgMHg4NDIxLCAweDFkYjgsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1YjUsIDB4NjBkYywKKwkweGQwYWMsIDB4MTEzMCwgMHhkMDljLCAweDExMjAsIDB4MjAwOSwgMHgwMDA1LCAweDA4MDQsIDB4MzViNSwKKwkweDc5ODQsIDB4NzhhOCwgMHgyMDQwLCAweDA4MGMsIDB4YWVhZCwgMHgxMTIwLCAweDkxODIsIDB4MDA3ZiwKKwkweDBhMDQsIDB4MzViOCwgMHg5MTg2LCAweDAwZmYsIDB4MDkwNCwgMHgzNWI4LCAweDkxODIsIDB4MDgwMCwKKwkweDFhMDQsIDB4MzViOCwgMHg3YThjLCAweDdiODgsIDB4NjA3YywgMHg5MzA2LCAweDExNTgsIDB4NjA4MCwKKwkweDkyNGUsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4YWVhZCwgMHgxMTIwLCAweDk5Y2MsIDB4ZmYwMCwKKwkweDA5MDQsIDB4MzViOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDRhMzIsIDB4MDkwNCwKKwkweDQ5YjIsIDB4MDA4NiwgMHg5MGM2LCAweDQwMDAsIDB4MDA4ZSwgMHgxNTM4LCAweDAwYzYsIDB4MDAwNiwKKwkweDAwMzYsIDB4YjgxOCwgMHhiYjFjLCAweDkzMDUsIDB4YmIyMCwgMHg5MzA1LCAweGJiMjQsIDB4OTMwNSwKKwkweGJiMjgsIDB4OTMwNSwgMHhiYjJjLCAweDkzMDUsIDB4YmIzMCwgMHg5MzA1LCAweGJiMzQsIDB4OTMwNSwKKwkweDAwM2UsIDB4MDU3MCwgMHhkODhjLCAweDExMjgsIDB4MDgwYywgMHg2YTBjLCAweDAxMTAsIDB4Yzg5ZCwKKwkweDA0MzgsIDB4OTAwZSwgMHgwODBjLCAweDY4YjksIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywKKwkweDAxMDgsIDB4YzE4ZCwgMHgwMDBlLCAweDAwY2UsIDB4MDBiOCwgMHg5MGM2LCAweDQwMDcsIDB4MTExMCwKKwkweDI0MDgsIDB4MDA5MCwgMHg5MGM2LCAweDQwMDgsIDB4MTExOCwgMHgyNzA4LCAweDI2MTAsIDB4MDA2MCwKKwkweDkwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwNDAsIDB4OTBjNiwgMHg0MDA2LCAweDExMDgsIDB4MDAyMCwKKwkweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMGEsIDB4MjAyMCwgMHgwMTJlLCAweDA4MDQsIDB4MzU4NSwKKwkweDAwMGUsIDB4MDBjZSwgMHgyYjAwLCAweDcwMjYsIDB4MDAxNiwgMHgwMGI2LCAweDAwYzYsIDB4MDBlNiwKKwkweDJjNzAsIDB4MDgwYywgMHhhZjkxLCAweDA5MDQsIDB4NGEwNywgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywKKwkweGQxMDIsIDB4MmU1OCwgMHgwMGVlLCAweDAwZTYsIDB4MDBjNiwgMHgwODBjLCAweDRiMWYsIDB4MDBjZSwKKwkweDJiNzAsIDB4MTE1OCwgMHgwODBjLCAweGFmNDMsIDB4MDBlZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAxZSwKKwkweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwgMHg5MDBlLCAweGE5NjYsIDB4YTk2YSwKKwkweDI5MDAsIDB4NjAxNiwgMHhhOTMyLCAweGE4NjgsIDB4YzBmZCwgMHhkODhjLCAweDAxMDgsIDB4YzBmNSwKKwkweGE4NmEsIDB4ZDg5YywgMHgxMTEwLCAweDA4MGMsIDB4MzIxZSwgMHg2MDIzLCAweDAwMDEsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjVkNSwgMHhkODljLCAweDAxMzgsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjVlOSwKKwkweDIwMDksIDB4MDAwMywgMHgwMDMwLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksIDB4MjAwOSwKKwkweDAwMDIsIDB4MDgwYywgMHhhZmJlLCAweDc4YTgsIDB4ZDA5NCwgMHgwMTM4LCAweDAwZWUsIDB4NzAyNCwKKwkweDAwZTYsIDB4MjA1OCwgMHhiOGNjLCAweGMwOGQsIDB4YjhjZSwgMHg5MDg1LCAweDAwMDEsIDB4MDBlZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMDFlLCAweDAxMmUsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwKKwkweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NGExNiwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwKKwkweDAxMDAsIDB4NzAyNCwgMHgyMDU4LCAweDExMzgsIDB4MjAwOSwgMHgwMDA0LCAweGJhMDQsIDB4OTI5NCwKKwkweDAwZmYsIDB4MDgwNCwgMHg1NmIxLCAweDkwMGUsIDB4YTg2OCwgMHhkMGY0LCAweDE5MDQsIDB4MzU4MywKKwkweDA4MGMsIDB4NjhiOSwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwKKwkweDA4MDQsIDB4MzU4MywgMHgwMGU2LCAweDAwZDYsIDB4MDA5NiwgMHg4M2ZmLCAweDA5MDQsIDB4NGE4MSwKKwkweDkwMmUsIDB4MDgwYywgMHhhZWFkLCAweDAxMzAsIDB4OTAyNiwgMHgyMGE5LCAweDA4MDAsIDB4MjA3MSwKKwkweDEwMDAsIDB4MDAzMCwgMHgyMDIxLCAweDAwN2YsIDB4MjBhOSwgMHgwNzgxLCAweDIwNzEsIDB4MTA3ZiwKKwkweDJlMDQsIDB4OTAwNSwgMHgxMWI4LCAweDIxMDAsIDB4OTQwNiwgMHgxOTA0LCAweDRhOTIsIDB4MjQyOCwKKwkweDk0Y2UsIDB4MDA3ZiwgMHgxMTIwLCAweDkyY2UsIDB4ZmZmZCwgMHgxNTU4LCAweDAwMzAsIDB4OTRjZSwKKwkweDAwODAsIDB4MTEzMCwgMHg5MmNlLCAweGZmZmMsIDB4MTUyMCwgMHg5M2NlLCAweDAwZmYsIDB4MTUwOCwKKwkweGM1ZmQsIDB4MDQ4MCwgMHgyMDU4LCAweGJmMTAsIDB4MjcwMCwgMHg5MzA2LCAweDExZTgsIDB4YmUxNCwKKwkweDI2MDAsIDB4OTIwNiwgMHgxMWM4LCAweDI0MDAsIDB4OTEwNiwgMHgxMTgwLCAweGQ4ODQsIDB4MDU5OCwKKwkweGQ4OTQsIDB4MTU4OCwgMHgwODBjLCAweDY5YWMsIDB4MTU3MCwgMHgyMDAxLCAweDQwMDAsIDB4MDQ2MCwKKwkweDA4MGMsIDB4NmEwYywgMHgxNTQwLCAweDIwMDEsIDB4NDAwMCwgMHgwNDMwLCAweDIwMDEsIDB4NDAwNywKKwkweDA0MTgsIDB4MjAwMSwgMHg0MDA2LCAweDA0MDAsIDB4MjQwMCwgMHg5MTA2LCAweDExNTgsIDB4YmUxNCwKKwkweDg3ZmYsIDB4MTEyOCwgMHg4NmZmLCAweDA5MTgsIDB4MDgwYywgMHhhZWFkLCAweDE5MDAsIDB4MjAwMSwKKwkweDQwMDgsIDB4MDA5MCwgMHg4NDIwLCAweDhlNzAsIDB4MWYwNCwgMHg0YTQ4LCAweDg1ZmYsIDB4MTEzMCwKKwkweDIwMDEsIDB4NDAwOSwgMHgwMDQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDMwLCAweDA4MGMsIDB4NjYzOCwKKwkweDFkZDAsIDB4YmIxMiwgMHhiYTE2LCAweDkwMDYsIDB4OTAwNSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1YjUsIDB4MDgwYywKKwkweDRiMWYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWI1LCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDc4ODQsIDB4OTAwNSwgMHgwOTA0LCAweDM1YjgsIDB4OTA5NiwKKwkweDAwZmYsIDB4MDEyMCwgMHg5MDkyLCAweDAwMDQsIDB4MWEwNCwgMHgzNWI4LCAweDIwMTAsIDB4MjkxOCwKKwkweDA4MGMsIDB4MzFjNCwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHg0YWQ0LCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTkwNCwKKwkweDM1ODMsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzViNSwgMHg3OTg0LCAweDA4MGMsIDB4YWVhZCwKKwkweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4MzViOCwgMHg5MTg2LCAweDAwZmYsIDB4MDkwNCwKKwkweDM1YjgsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4MzViOCwgMHgyMDAxLCAweDk0MDAsIDB4MDgwYywKKwkweDU3MGMsIDB4MTkwNCwgMHgzNWI1LCAweDA4MDQsIDB4MzU4MywgMHhhOTk4LCAweDA4MGMsIDB4YWVhZCwKKwkweDExMTgsIDB4OTE4MiwgMHgwMDdmLCAweDAyODAsIDB4OTE4NiwgMHgwMGZmLCAweDAxNjgsIDB4OTE4MiwKKwkweDA4MDAsIDB4MTI1MCwgMHgyMDAxLCAweDk0MDAsIDB4MDgwYywgMHg1NzBjLCAweDExYTgsIDB4MDA2MCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4MjAwOSwgMHgwMDBhLCAweDBjNDgsIDB4MDgwYywKKwkweDBmZmYsIDB4MDE5OCwgMHg5MDA2LCAweGE4MDIsIDB4NzAxNCwgMHg5MDA1LCAweDExMjAsIDB4MjkwMCwKKwkweDcwMTYsIDB4NzAxYSwgMHgwMDQwLCAweDcwMTgsIDB4YTgwMiwgMHgwMDg2LCAweDIwNDAsIDB4MjkwMCwKKwkweGEwMDYsIDB4NzAxYSwgMHgwMDhlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDc5ODQsIDB4MDgwYywKKwkweDY2OTksIDB4MTEzMCwgMHg3ZTg4LCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MDIwOCwKKwkweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweGE5OTgsIDB4MDgwYywgMHg2Njk5LCAweDExMzAsIDB4YWU5YywKKwkweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MDIwOCwgMHg5MDVlLCAweDhiZmYsIDB4MDAwNSwKKwkweGFlOTgsIDB4MDAwOCwgMHg3ZTg0LCAweDI2MDgsIDB4MDgwYywgMHg2Njk5LCAweDExMDgsIDB4MDAwOCwKKwkweDkwNWUsIDB4OGJmZiwgMHgwMDA1LCAweDAwMTYsIDB4NzExNCwgMHg4MWZmLCAweDAxMjgsIDB4MjE0OCwKKwkweGE5MDQsIDB4MDgwYywgMHgxMDMxLCAweDBjYzgsIDB4NzExNiwgMHg3MTFhLCAweDAwMWUsIDB4MDAwNSwKKwkweDIwMzEsIDB4MDAwMSwgMHgwMDEwLCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwKKwkweGE2NmEsIDB4YTE3YSwgMHhhNzcyLCAweGEwNzYsIDB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwKKwkweDA4MGMsIDB4MTBlOSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHgzNTgzLCAweDAwMDUsIDB4MDBmNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDAwMCwgMHgyMDAxLCAweDE4YjAsIDB4MjAwNCwKKwkweDkwMDUsIDB4MTE5MCwgMHgwZTA0LCAweDRiOWMsIDB4N2EzNiwgMHg3ODMzLCAweDAwMTIsIDB4N2E4MiwKKwkweDdiODYsIDB4N2M4YSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTE5YiwgMHgwODA0LCAweDRjMDIsIDB4MDAxNiwgMHgwMDg2LCAweDAwOTYsIDB4MDBjNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODllLCAweDcwNDQsIDB4OTAwNSwgMHgxNTQwLCAweDcxNDgsIDB4OTE4MiwKKwkweDAwMTAsIDB4MDI4OCwgMHg3MDM4LCAweDIwNjAsIDB4MDgwYywgMHgwZmZmLCAweDA5MDQsIDB4NGJmYSwKKwkweGE4NGIsIDB4MDAwMCwgMHgyOTAwLCAweDcwNDYsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MjBjZSwKKwkweDIwMDUsIDB4YTg0NiwgMHgwMDk4LCAweDcwMzgsIDB4OTBlMCwgMHgwMDA0LCAweDIwMDEsIDB4MThiYSwKKwkweDljODIsIDB4MThmYSwgMHgwMjEwLCAweDIwNjEsIDB4MThiYSwgMHgyYzAwLCAweDcwM2EsIDB4NzE0OCwKKwkweDgxZmYsIDB4MTEwOCwgMHg3MDNlLCAweDgxMDgsIDB4NzE0YSwgMHgwNDYwLCAweDcxNDgsIDB4ODEwOCwKKwkweDcxNGEsIDB4NzA0NCwgMHgyMDQwLCAweGExNDQsIDB4MjEwNSwgMHgwMDE2LCAweDkwOGEsIDB4MDAzNiwKKwkweDFhMGMsIDB4MGRkNSwgMHgyMDYwLCAweDAwMWUsIDB4ODEwOCwgMHgyMTA1LCAweDkwMDUsIDB4YTE0NiwKKwkweDE1MjAsIDB4MDgwYywgMHgwZmZmLCAweDExMzAsIDB4ODEwOSwgMHhhOTQ2LCAweDcxNDgsIDB4ODEwOSwKKwkweDcxNGEsIDB4MDBkOCwgMHg5MDA2LCAweGE4MDYsIDB4YTg0YSwgMHhhMDQ2LCAweDI4MDAsIDB4YTgwMiwKKwkweDI5MDAsIDB4YTAwNiwgMHg3MDQ2LCAweDIwMDEsIDB4MDAwMiwgMHg5MDgwLCAweDIwY2UsIDB4MjAwNSwKKwkweGE4NDYsIDB4MDA1OCwgMHgyMjYyLCAweDYzMDYsIDB4NjQwYSwgMHgwMGVlLCAweDAwY2UsIDB4MDA5ZSwKKwkweDAwOGUsIDB4MDAxZSwgMHgwMTJlLCAweDAwZmUsIDB4MDAwNSwgMHgyYzAwLCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4NGMyNCwgMHg0YzI0LCAweDRjMjYsIDB4NGMyNCwgMHg0YzI0LCAweDRjMjQsIDB4NGMyYSwKKwkweDRjMjQsIDB4NGMyNCwgMHg0YzI0LCAweDRjMmUsIDB4NGMyNCwgMHg0YzI0LCAweDRjMjQsIDB4NGMzMiwKKwkweDRjMjQsIDB4NGMyNCwgMHg0YzI0LCAweDRjMzYsIDB4NGMyNCwgMHg0YzI0LCAweDRjMjQsIDB4NGMzYSwKKwkweDRjMjQsIDB4NGMyNCwgMHg0YzI0LCAweDRjM2YsIDB4MDgwYywgMHgwZGQ1LCAweGEyNzYsIDB4YTM3YSwKKwkweGE0N2UsIDB4MDg5OCwgMHhhMjg2LCAweGEzOGEsIDB4YTQ4ZSwgMHgwODc4LCAweGEyOTYsIDB4YTM5YSwKKwkweGE0OWUsIDB4MDg1OCwgMHhhMmE2LCAweGEzYWEsIDB4YTRhZSwgMHgwODM4LCAweGEyYjYsIDB4YTNiYSwKKwkweGE0YmUsIDB4MDgxOCwgMHhhMmM2LCAweGEzY2EsIDB4YTRjZSwgMHgwODA0LCAweDRiZmQsIDB4YTJkNiwKKwkweGEzZGEsIDB4YTRkZSwgMHgwODA0LCAweDRiZmQsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsIDB4NzA0OCwKKwkweDkwMDUsIDB4MDkwNCwgMHg0Y2Q2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NGNkNSwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMDAwLCAweDAwYzYsIDB4MDA5NiwgMHgwMDg2LCAweDAwNzYsIDB4OTAwNiwKKwkweDIwMzgsIDB4NzA0MCwgMHgyMDQ4LCAweDkwMDUsIDB4MDUwMCwgMHhhOTQ4LCAweDIxMDUsIDB4MDAxNiwKKwkweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkZDUsIDB4MjA2MCwgMHgwMDFlLCAweDgxMDgsIDB4MjEwNSwKKwkweDkwMDUsIDB4YTk0YSwgMHgxOTA0LCAweDRjZDgsIDB4YTgwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGRkNSwKKwkweDcwNDIsIDB4MjkzOCwgMHgyMDQwLCAweGEwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4OTA4MCwKKwkweDIwY2UsIDB4MjAwNSwgMHhhMDRhLCAweDA4MDQsIDB4NGNkOCwgMHg3MDNjLCAweDIwNjAsIDB4MmMxNCwKKwkweDYzMDQsIDB4NjQwOCwgMHg2NTBjLCAweDIyMDAsIDB4NzgzNiwgMHg3ODMzLCAweDAwMTIsIDB4Nzg4MiwKKwkweDIzMDAsIDB4Nzg4NiwgMHgyNDAwLCAweDc4OGEsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwKKwkweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4ODdmZiwgMHgwMTE4LCAweDI3NDgsIDB4MDgwYywKKwkweDEwMzEsIDB4NzA0OCwgMHg4MDAxLCAweDcwNGEsIDB4OTAwNSwgMHgxMTcwLCAweDcwNDAsIDB4MjA0OCwKKwkweDkwMDUsIDB4MDEyOCwgMHgwODBjLCAweDEwMzEsIDB4OTAwNiwgMHg3MDQyLCAweDcwNDYsIDB4NzAzYiwKKwkweDE4YmEsIDB4NzAzZiwgMHgxOGJhLCAweDA0MjAsIDB4NzA0MCwgMHg5MDA1LCAweDE1MDgsIDB4NzIzOCwKKwkweDJjMDAsIDB4OTIwNiwgMHgwMTQ4LCAweDljODAsIDB4MDAwNCwgMHg5MGZhLCAweDE4ZmEsIDB4MDIxMCwKKwkweDIwMDEsIDB4MThiYSwgMHg3MDNlLCAweDAwYTAsIDB4OTAwNiwgMHg3MDNlLCAweDcwM2EsIDB4NzA0NCwKKwkweDkwMDUsIDB4MDkwYywgMHgwZGQ1LCAweDIwNDgsIDB4YTgwMCwgMHg5MDA1LCAweDFkZTAsIDB4MjkwMCwKKwkweDcwNDIsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MjBjZSwgMHgyMDA1LCAweGE4NGEsIDB4MDAwMCwKKwkweDAwN2UsIDB4MDA4ZSwgMHgwMDllLCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDJjMDAsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4NGNmNywgMHg0Y2Y3LCAweDRjZjksIDB4NGNmNywKKwkweDRjZjcsIDB4NGNmNywgMHg0Y2ZlLCAweDRjZjcsIDB4NGNmNywgMHg0Y2Y3LCAweDRkMDMsIDB4NGNmNywKKwkweDRjZjcsIDB4NGNmNywgMHg0ZDA4LCAweDRjZjcsIDB4NGNmNywgMHg0Y2Y3LCAweDRkMGQsIDB4NGNmNywKKwkweDRjZjcsIDB4NGNmNywgMHg0ZDEyLCAweDRjZjcsIDB4NGNmNywgMHg0Y2Y3LCAweDRkMTcsIDB4MDgwYywKKwkweDBkZDUsIDB4YWE3NCwgMHhhYjc4LCAweGFjN2MsIDB4MDgwNCwgMHg0YzgzLCAweGFhODQsIDB4YWI4OCwKKwkweGFjOGMsIDB4MDgwNCwgMHg0YzgzLCAweGFhOTQsIDB4YWI5OCwgMHhhYzljLCAweDA4MDQsIDB4NGM4MywKKwkweGFhYTQsIDB4YWJhOCwgMHhhY2FjLCAweDA4MDQsIDB4NGM4MywgMHhhYWI0LCAweGFiYjgsIDB4YWNiYywKKwkweDA4MDQsIDB4NGM4MywgMHhhYWM0LCAweGFiYzgsIDB4YWNjYywgMHgwODA0LCAweDRjODMsIDB4YWFkNCwKKwkweGFiZDgsIDB4YWNkYywgMHgwODA0LCAweDRjODMsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBiNiwKKwkweDAwYzYsIDB4MjAwOSwgMHgwMDdlLCAweDA4MGMsIDB4NjY5OSwgMHgyMDE5LCAweDAwMDEsIDB4Yjg1YywKKwkweGQwYWMsIDB4MDExMCwgMHgyMDE5LCAweDAwMDAsIDB4MjAxMSwgMHg4MDFiLCAweDA4MGMsIDB4NGI3ZiwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMjYsIDB4MDgwYywKKwkweDU3NWQsIDB4ZDBjNCwgMHgwMTIwLCAweDIwMTEsIDB4ODAxNCwgMHgwODBjLCAweDRiN2YsIDB4MDAyZSwKKwkweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAzMCwKKwkweGMwOGQsIDB4YzA4NSwgMHhjMGFjLCAweDYwMzIsIDB4MDgwYywgMHg3NDNlLCAweDExNTgsIDB4MDgwYywKKwkweDc3MjQsIDB4MDgwYywgMHg2MGFkLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDc0ODUsIDB4MDgwYywKKwkweDczNmEsIDB4MDAxMCwgMHgwODBjLCAweDVmNmMsIDB4MDEyZSwgMHgwODA0LCAweDM1ODMsIDB4ODFmZiwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDU3NzEsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg2YTA0LCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMDgsIDB4MDgwNCwgMHgzNWI1LCAweDc5ODQsIDB4MDgwYywgMHg2NjM4LCAweDE5MDQsIDB4MzViOCwKKwkweDA4MGMsIDB4NGI1MiwgMHgwOTA0LCAweDM1YjgsIDB4MmIwMCwgMHg3MDI2LCAweDA4MGMsIDB4NmEwYywKKwkweDc4ODgsIDB4MTE3MCwgMHg5MDg0LCAweDAwMDUsIDB4MTE1OCwgMHg5MDBlLCAweDA4MGMsIDB4NjhiOSwKKwkweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDA4MDQsIDB4MzU4MywKKwkweDA4MGMsIDB4NGIxZiwgMHgwOTA0LCAweDM1YjUsIDB4OTAwNiwgMHhhODY2LCAweGE4MzIsIDB4YTg2OCwKKwkweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNlYjAsIDB4MDkwNCwgMHgzNWI1LCAweDc4ODgsIDB4ZDA5NCwKKwkweDAxMTgsIDB4YjhjYywgMHhjMDhkLCAweGI4Y2UsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NGRmMiwKKwkweDAwMDUsIDB4MjA2MSwgMHgxODAwLCAweDA4MGMsIDB4NTc3MSwgMHgyMDA5LCAweDAwMDcsIDB4MTU2MCwKKwkweDA4MGMsIDB4NmEwNCwgMHgwMTE4LCAweDIwMDksIDB4MDAwOCwgMHgwNDMwLCAweGE5OTgsIDB4MDgwYywKKwkweDY2MzgsIDB4MTUzMCwgMHgwODBjLCAweDRiNTAsIDB4MDUxOCwgMHgwODBjLCAweDZhMGMsIDB4YTg5YywKKwkweDExNjgsIDB4OTA4NCwgMHgwMDA1LCAweDExNTAsIDB4OTAwZSwgMHgwODBjLCAweDY4YjksIDB4MTEwOCwKKwkweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwMGQwLCAweGE4NjgsIDB4YzBmYywKKwkweGE4NmEsIDB4MDgwYywgMHhjZWIwLCAweDExZTAsIDB4YTg5YywgMHhkMDk0LCAweDAxMTgsIDB4YjhjYywKKwkweGMwOGQsIDB4YjhjZSwgMHgyMDA5LCAweDAwMDMsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwKKwkweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwKKwkweGE4OTcsIDB4NDAwMCwgMHhhOTlhLCAweDkwMDYsIDB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4MDAwNSwKKwkweDkwMDYsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHg3MDI0LCAweDIwNTgsIDB4MTExMCwKKwkweDA4MDQsIDB4NTZiMSwgMHg5MDBlLCAweDA4MGMsIDB4NjhiOSwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDA4MDQsIDB4MzU4MywgMHgwODBjLCAweDU3NzEsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1YjUsIDB4N2Y4NCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywKKwkweDdkOTgsIDB4MDgwYywgMHg0YjFmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwKKwkweDkwMGUsIDB4MjEzMCwgMHg3MTI2LCAweDcxMzIsIDB4YTg2MCwgMHgyMGU4LCAweDcwMzYsIDB4YTg1YywKKwkweDkwODAsIDB4MDAwNSwgMHg3MDJhLCAweDIwYTAsIDB4MDgwYywgMHg2Njk5LCAweDE5MDQsIDB4NGU5NCwKKwkweDA4MGMsIDB4NmEwYywgMHgwMTM4LCAweDA4MGMsIDB4NmExNCwgMHgwMTIwLCAweDA4MGMsIDB4NjlhYywKKwkweDE5MDQsIDB4NGU5NCwgMHhkNzk0LCAweDExMTAsIDB4ZDc4NCwgMHgwMWE4LCAweGI4YzQsIDB4MjBlMCwKKwkweGI4YzgsIDB4OTA4MCwgMHgwMDA2LCAweDIwOTgsIDB4MzQwMCwgMHhkNzk0LCAweDAxNjAsIDB4MjBhOSwKKwkweDAwMDgsIDB4NDAwMywgMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwgMHgyMGUwLCAweDIwYTksIDB4MDAwMiwKKwkweDA4MGMsIDB4NDkxZSwgMHgwMDQ4LCAweDIwYTksIDB4MDAwNCwgMHg0MDAzLCAweDIwOTgsIDB4MjBhMCwKKwkweDNkMDAsIDB4MjBlMCwgMHgwODBjLCAweDQ5MWUsIDB4OTE4NiwgMHgwMDdlLCAweDAxNzAsIDB4OTE4NiwKKwkweDAwODAsIDB4MDE1OCwgMHgwODBjLCAweDZhMGMsIDB4OTBjMiwgMHgwMDA2LCAweDEyMTAsIDB4YzFmZCwKKwkweDAwMjAsIDB4MDgwYywgMHg2OGI5LCAweDExMDgsIDB4YzFmZCwgMHg0MTA0LCAweGMxZmMsIDB4ZDc5NCwKKwkweDA1MjgsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4MjA2MCwgMHg5YzgwLCAweDAwMDAsIDB4MjA5OCwKKwkweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweDljODAsIDB4MDAwMywgMHgyMDk4LCAweDIwYTksIDB4MDAwMSwKKwkweDQwMDUsIDB4OWM4MCwgMHgwMDA0LCAweDIwOTgsIDB4MzQwMCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMywKKwkweDIwOTgsIDB4MjBhMCwgMHgzZDAwLCAweDIwZTAsIDB4MDgwYywgMHg0OTExLCAweDljODAsIDB4MDAyNiwKKwkweDIwOTgsIDB4YjhjNCwgMHgyMGUwLCAweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweGQ3OTQsIDB4MDExMCwKKwkweDk2YjAsIDB4MDAwYiwgMHg5NmIwLCAweDAwMDUsIDB4ODEwOCwgMHgwODBjLCAweGFlYWQsIDB4MDExOCwKKwkweDkxODYsIDB4MDgwMCwgMHgwMDQwLCAweGQ3OGMsIDB4MDEyMCwgMHg5MTg2LCAweDA4MDAsIDB4MDE3MCwKKwkweDAwMTgsIDB4OTE4NiwgMHgwMDdlLCAweDAxNTAsIDB4ZDc5NCwgMHgwMTE4LCAweDk2ODYsIDB4MDAyMCwKKwkweDAwMTAsIDB4OTY4NiwgMHgwMDI4LCAweDAxNTAsIDB4MDgwNCwgMHg0ZTI0LCAweDg2ZmYsIDB4MTEyMCwKKwkweDcxMjQsIDB4ODEwYiwgMHgwODA0LCAweDM1ODMsIDB4NzAzMywgMHgwMDAxLCAweDcxMjIsIDB4NzAyNCwKKwkweDk2MDAsIDB4NzAyNiwgMHg3NzJlLCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGEwNmIsIDB4MDAwMCwKKwkweGE2N2EsIDB4NzAzNCwgMHhhMDcyLCAweDcwMjgsIDB4YTA3NiwgMHhhMjhlLCAweGEzOTIsIDB4YTQ5NiwKKwkweGE1OWEsIDB4MDgwYywgMHgxMGU5LCAweDcwMDcsIDB4MDAwMiwgMHg3MDFmLCAweDRlZDAsIDB4MDAwNSwKKwkweDcwMzAsIDB4OTAwNSwgMHgxMTgwLCAweDcxMjAsIDB4NzAyOCwgMHgyMGEwLCAweDc3MmMsIDB4OTAzNiwKKwkweDcwMzQsIDB4MjBlOCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhMjhjLCAweGEzOTAsIDB4YTQ5NCwKKwkweGE1OTgsIDB4MDgwNCwgMHg0ZTI0LCAweDcxMjQsIDB4ODEwYiwgMHgwODA0LCAweDM1ODMsIDB4MjAyOSwKKwkweDAwN2UsIDB4Nzk4NCwgMHg3YTg4LCAweDdiOGMsIDB4N2M5OCwgMHg5MTg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1YjgsIDB4OTUwMiwgMHgwYTA0LCAweDM1YjgsIDB4OTE4NCwKKwkweDAwZmYsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzViOCwgMHg5NTAyLCAweDBhMDQsIDB4MzViOCwKKwkweDkyODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1YjgsIDB4OTUwMiwKKwkweDBhMDQsIDB4MzViOCwgMHg5Mjg0LCAweDAwZmYsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzViOCwKKwkweDk1MDIsIDB4MGEwNCwgMHgzNWI4LCAweDkzODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwZTIsIDB4MDAyMCwKKwkweDBhMDQsIDB4MzViOCwgMHg5NTAyLCAweDBhMDQsIDB4MzViOCwgMHg5Mzg0LCAweDAwZmYsIDB4OTBlMiwKKwkweDAwMjAsIDB4MGEwNCwgMHgzNWI4LCAweDk1MDIsIDB4MGEwNCwgMHgzNWI4LCAweDk0ODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzViOCwgMHg5NTAyLCAweDBhMDQsIDB4MzViOCwKKwkweDk0ODQsIDB4MDBmZiwgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWI4LCAweDk1MDIsIDB4MGEwNCwKKwkweDM1YjgsIDB4MjA2MSwgMHgxOTg4LCAweDYxMDIsIDB4NjIwNiwgMHg2MzBhLCAweDY0MGUsIDB4MDgwNCwKKwkweDM1ODMsIDB4MDgwYywgMHg0YjFmLCAweDA5MDQsIDB4MzViNSwgMHgyMDA5LCAweDAwMTYsIDB4N2E4YywKKwkweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweGFmNjAsIDB4MDgwYywKKwkweDRiNjgsIDB4NzAxZiwgMHg0ZjU0LCAweDAwMDUsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwMCwKKwkweDAwZTYsIDB4MjA3MSwgMHgwMzAwLCAweDcwMWMsIDB4ZDBhNCwgMHgxZGU4LCAweDAwZWUsIDB4MjBhOSwKKwkweDAwMTYsIDB4ODk2ZSwgMHg4ZDZlLCAweDhkNmYsIDB4OWQ4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxOSwKKwkweDIwOTgsIDB4OWQ4NCwgMHgwMDNmLCAweDIwZTAsIDB4MjA2OSwgMHgxODc3LCAweDIwZTksIDB4MDAwMSwKKwkweDJkYTAsIDB4NDAwMywgMHg2ODAwLCAweDkwMDUsIDB4MDkwNCwgMHg0ZmQ1LCAweDY4MDQsIDB4MjAwOCwKKwkweDkxOGMsIDB4ZmZmOCwgMHgxOTA0LCAweDRmZDUsIDB4NjgwYywgMHg5MDA1LCAweDA5MDQsIDB4NGZkNSwKKwkweDkwODIsIDB4ZmYwMSwgMHgxYTA0LCAweDRmZDUsIDB4NjgxMCwgMHg5MDgyLCAweDAwNWMsIDB4MGEwNCwKKwkweDRmZDUsIDB4NjgyNCwgMHgyMDA4LCAweDkwODIsIDB4MDAwOCwgMHgwYTA0LCAweDRmZDUsIDB4OTE4MiwKKwkweDA0MDAsIDB4MWEwNCwgMHg0ZmQ1LCAweDAwNTYsIDB4MjAyOSwgMHgwMDAwLCAweDA4MGMsIDB4OGJiZiwKKwkweDAwNWUsIDB4Njk0NCwgMHg2ODIwLCAweDkxMDIsIDB4MDZjMCwgMHg2ODIwLCAweDkwODIsIDB4MDAxOSwKKwkweDE2YTAsIDB4NjgyOCwgMHg2OTQ0LCAweDgxMGMsIDB4OTEwMiwgMHgwNjc4LCAweDY4NDAsIDB4OTA4MiwKKwkweDAwMGYsIDB4MTY1OCwgMHgwODBjLCAweDEwMTgsIDB4MjkwMCwgMHgwOTA0LCAweDRmZjEsIDB4Njg0ZSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOTMwLCAweDAwYjYsIDB4MjA1OSwgMHgwMDAwLCAweDA4MGMsIDB4OGE3YiwKKwkweDAwYmUsIDB4MDBlZSwgMHgwNTY4LCAweDA4MGMsIDB4ODdjZSwgMHgwODBjLCAweDg4MTksIDB4MTFlMCwKKwkweDY4NTcsIDB4MDAwMCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweDkxOGQsIDB4MjAwMCwKKwkweDYxMDYsIDB4NmIxMCwgMHgyMDYxLCAweDFhNjEsIDB4NjMwYSwgMHgwMGNlLCAweDA4MGMsIDB4Mjk5NCwKKwkweDIwMDEsIDB4MDEzOCwgMHgyMTAyLCAweDA4MDQsIDB4MzU4MywgMHgwODBjLCAweDI5OTQsIDB4MjAwMSwKKwkweDAxMzgsIDB4MjEwMiwgMHgwODA0LCAweDM1YjgsIDB4MDgwYywgMHg4ODEyLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5MzAsIDB4MDgwYywgMHg4YzNmLCAweDA4MGMsIDB4OGM0ZSwgMHgwODBjLCAweDhhNjIsIDB4MDBlZSwKKwkweDIwMDEsIDB4MTg4YSwgMHgyMDRjLCAweDA4MGMsIDB4MTAzMSwgMHgyMDAxLCAweDE4OGEsIDB4MjAwMywKKwkweDAwMDAsIDB4MDgwYywgMHgyOTk0LCAweDIwMDEsIDB4MDEzOCwgMHgyMTAyLCAweDA4MDQsIDB4MzViNSwKKwkweDIwMDEsIDB4MTkyNCwgMHgyMDBjLCAweDkxOGUsIDB4MDAwMCwgMHgwOTA0LCAweDUwNTIsIDB4MDgwYywKKwkweDhhNWQsIDB4MDkwNCwgMHg1MDUyLCAweDIwMDEsIDB4MDEwMSwgMHgyMDBjLCAweDkxOGMsIDB4ZGZmZiwKKwkweDIxMDIsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwMCwgMHgwMGU2LCAweDIwNzEsIDB4MDMwMCwKKwkweDcwMWMsIDB4ZDBhNCwgMHgxZGU4LCAweDAwZWUsIDB4MDgwYywgMHg4YTYyLCAweDIwMDEsIDB4MDAzNSwKKwkweDA4MGMsIDB4MTVmZCwgMHgwMGM2LCAweDIwNjEsIDB4MTkzYywgMHg2MDA0LCAweDYxMDAsIDB4OTEwNiwKKwkweDFkZTAsIDB4MDBjZSwgMHgwODBjLCAweDI5OTQsIDB4MjAwMSwgMHgwMTM4LCAweDIxMDIsIDB4MDBlNiwKKwkweDAwZjYsIDB4MjA3MSwgMHgxOTIzLCAweDA4MGMsIDB4ODk5YywgMHgwMTIwLCAweDJmMDAsIDB4MDgwYywKKwkweDhhMjgsIDB4MGNjOCwgMHgwMGZlLCAweDAwZWUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwKKwkweDE4OGEsIDB4MjAwYywgMHg4MWZmLCAweDAxMzgsIDB4MjE0OCwgMHgwODBjLCAweDEwMzEsIDB4MjAwMSwKKwkweDE4OGEsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MTgzYywgMHgyMDAzLCAweDAwMjAsIDB4MDgwYywKKwkweDg4MTIsIDB4MDBlNiwgMHgyMDcxLCAweDE5MzAsIDB4MDgwYywgMHg4YzNmLCAweDA4MGMsIDB4OGM0ZSwKKwkweDAwZWUsIDB4MDEyZSwgMHgwODA0LCAweDM1ODMsIDB4MDAwNiwgMHgwODBjLCAweDU3NWQsIDB4ZDBjYywKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4NTc2MSwgMHhkMGJjLCAweDAwMGUsIDB4MDAwNSwKKwkweDYxNzQsIDB4N2E4NCwgMHg2MzAwLCAweDgyZmYsIDB4MTExOCwgMHg3OTg2LCAweDA4MDQsIDB4MzU4MywKKwkweDgzZmYsIDB4MTkwNCwgMHgzNWI4LCAweDIwMDEsIDB4ZmZmMCwgMHg5MjAwLCAweDFhMDQsIDB4MzViOCwKKwkweDIwMTksIDB4ZmZmZiwgMHg2MDc4LCAweDkzMDIsIDB4OTIwMCwgMHgwYTA0LCAweDM1YjgsIDB4Nzk4NiwKKwkweDYyNzYsIDB4MDgwNCwgMHgzNTgzLCAweDA4MGMsIDB4NTc3MSwgMHgxOTA0LCAweDM1YjUsIDB4N2M4OCwKKwkweDdkODQsIDB4N2U5OCwgMHg3ZjhjLCAweDA4MGMsIDB4NGIxZiwgMHgwOTA0LCAweDM1YjUsIDB4OTAwZSwKKwkweDkwMWUsIDB4NzMyNiwgMHg3MzMyLCAweGE4NjAsIDB4MjBlOCwgMHg3MDM2LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDMsIDB4NzAyYSwgMHgyMGEwLCAweDkxZDgsIDB4MTAwMCwgMHgyYjVjLCAweDhiZmYsIDB4MDE3OCwKKwkweDA4MGMsIDB4NmEwYywgMHgwMTE4LCAweDA4MGMsIDB4NmExNCwgMHgxMTQ4LCAweDIwYTksIDB4MDAwMSwKKwkweGI4MTQsIDB4NDAwNCwgMHhiODEwLCAweDQwMDQsIDB4NDEwNCwgMHg5Mzk4LCAweDAwMDMsIDB4ODEwOCwKKwkweDkxODIsIDB4MDgwMCwgMHgwMTIwLCAweDkzODYsIDB4MDAzYywgMHgwMTcwLCAweDBjMjAsIDB4ODNmZiwKKwkweDExNDgsIDB4NzIyNCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwMywgMHgwODBjLCAweDkwMjcsIDB4MjIwOCwKKwkweDA4MDQsIDB4MzU4MywgMHg3MDMzLCAweDAwMDEsIDB4NzEyMiwgMHg3MDI0LCAweDkzMDAsIDB4NzAyNiwKKwkweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGEwNmIsIDB4MDAwMCwgMHhhMzdhLCAweDcwMjgsIDB4YTA3NiwKKwkweDcwMzQsIDB4YTA3MiwgMHhhNDhlLCAweGE1OTIsIDB4YTY5NiwgMHhhNzlhLCAweDA4MGMsIDB4MTBlOSwKKwkweDcwMDcsIDB4MDAwMiwgMHg3MDFmLCAweDUwZDUsIDB4MDAwNSwgMHg3MDMwLCAweDkwMDUsIDB4MTE3OCwKKwkweDcxMjAsIDB4NzAyOCwgMHgyMGEwLCAweDkwMWUsIDB4NzAzNCwgMHgyMGU4LCAweDIwNjEsIDB4MThiOCwKKwkweDJjNDQsIDB4YTQ4YywgMHhhNTkwLCAweGE2OTQsIDB4YTc5OCwgMHgwODA0LCAweDUwOTMsIDB4NzIyNCwKKwkweDkwMGUsIDB4MjAwMSwgMHgwMDAzLCAweDA4MGMsIDB4OTAyNywgMHgyMjA4LCAweDA4MDQsIDB4MzU4MywKKwkweDAwZjYsIDB4MDBlNiwgMHgwODBjLCAweDU3NzEsIDB4MjAwOSwgMHgwMDA3LCAweDE5MDQsIDB4NTE2OCwKKwkweDIwNzEsIDB4MTg5ZSwgMHg3NDVjLCAweDg0ZmYsIDB4MjAwOSwgMHgwMDBlLCAweDE5MDQsIDB4NTE2OCwKKwkweGFjOWMsIDB4YWQ5OCwgMHhhZWE0LCAweGFmYTAsIDB4MDA5NiwgMHgwODBjLCAweDEwMTgsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDkwNCwgMHg1MTY4LCAweDI5MDAsIDB4NzA1ZSwgMHg5MDBlLCAweDkwMWUsIDB4NzM1NiwKKwkweDczNjIsIDB4YTg2MCwgMHg3MDY2LCAweGE4NWMsIDB4OTA4MCwgMHgwMDAzLCAweDcwNWEsIDB4MjBhMCwKKwkweDkxZDgsIDB4MTAwMCwgMHgyYjVjLCAweDhiZmYsIDB4MDE3OCwgMHgwODBjLCAweDZhMGMsIDB4MDExOCwKKwkweDA4MGMsIDB4NmExNCwgMHgxMTQ4LCAweGI4MTQsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDQsIDB4YjgxMCwKKwkweDQwMDQsIDB4NDEwNCwgMHg5Mzk4LCAweDAwMDMsIDB4ODEwOCwgMHg5MTgyLCAweDA4MDAsIDB4MDEyMCwKKwkweDkzODYsIDB4MDAzYywgMHgwMWU4LCAweDBjMjAsIDB4ODNmZiwgMHgxMWMwLCAweDcyNTQsIDB4OTAwZSwKKwkweDIwMDEsIDB4MDAwMywgMHgwODBjLCAweDkwMjcsIDB4MjIwOCwgMHgwMDllLCAweGE4OTcsIDB4NDAwMCwKKwkweGE5OWEsIDB4NzE1YywgMHg4MWZmLCAweDA5MGMsIDB4MGRkNSwgMHgyMTQ4LCAweDA4MGMsIDB4MTAzMSwKKwkweDkwMDYsIDB4NzA1ZSwgMHg5MThkLCAweDAwMDEsIDB4MjAwOCwgMHgwNDE4LCAweDcwNjMsIDB4MDAwMSwKKwkweDcxNTIsIDB4NzA1NCwgMHg5MzAwLCAweDcwNTYsIDB4MjA2MSwgMHgxOGI5LCAweDJjNDQsIDB4YTM3YSwKKwkweDcwNTgsIDB4YTA3NiwgMHg3MDY0LCAweGEwNzIsIDB4YTQ4ZSwgMHhhNTkyLCAweGE2OTYsIDB4YTc5YSwKKwkweGEwOWYsIDB4NTE3NCwgMHgwMDBlLCAweGEwYTIsIDB4MDgwYywgMHgxMGU5LCAweDkwMDYsIDB4MDA0OCwKKwkweDAwOWUsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwKKwkweDAwMzAsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHhhMGEwLCAweDkwNGQsIDB4MDkwYywKKwkweDBkZDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsIDB4YTA2YywgMHg5MDhlLCAweDAxMDAsIDB4MDEzOCwKKwkweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAyLCAweDAwZDgsIDB4NzA2MCwKKwkweDkwMDUsIDB4MTE1OCwgMHg3MTUwLCAweDcwNTgsIDB4MjBhMCwgMHg5MDFlLCAweDcwNjQsIDB4MjBlOCwKKwkweGE0OGMsIDB4YTU5MCwgMHhhNjk0LCAweGE3OTgsIDB4MDQyOCwgMHhhODdiLCAweDAwMDAsIDB4YTg4MywKKwkweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDcyNTQsIDB4OTAwZSwgMHgyMDAxLCAweDAwMDMsIDB4MDgwYywKKwkweDkwMjcsIDB4YWE5YSwgMHg3MTVjLCAweDgxZmYsIDB4MDkwYywgMHgwZGQ1LCAweDIxNDgsIDB4MDgwYywKKwkweDEwMzEsIDB4NzA1ZiwgMHgwMDAwLCAweGEwYTAsIDB4MjA0OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweGEwOWYsIDB4MDAwMCwgMHhhMGEzLCAweDAwMDAsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg5MWQ4LCAweDEwMDAsIDB4MmI1YywgMHg4YmZmLCAweDAxNzgsIDB4MDgwYywKKwkweDZhMGMsIDB4MDExOCwgMHgwODBjLCAweDZhMTQsIDB4MTE0OCwgMHhiODE0LCAweDIwYTksIDB4MDAwMSwKKwkweDQwMDQsIDB4YjgxMCwgMHg0MDA0LCAweDQxMDQsIDB4OTM5OCwgMHgwMDAzLCAweDgxMDgsIDB4OTE4MiwKKwkweDA4MDAsIDB4MDEyMCwgMHg5Mzg2LCAweDAwM2MsIDB4MDUxOCwgMHgwYzIwLCAweDgzZmYsIDB4MTFmMCwKKwkweDcxNTQsIDB4ODEwYywgMHhhOTlhLCAweGE4OTcsIDB4NDAwMCwgMHg3MTVjLCAweDgxZmYsIDB4MDkwYywKKwkweDBkZDUsIDB4MjE0OCwgMHgwODBjLCAweDEwMzEsIDB4OTAwNiwgMHg3MDVlLCAweDkxOGQsIDB4MDAwMSwKKwkweDIwMDgsIDB4YTBhMCwgMHgyMDQ4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmQxNywKKwkweDAxMmUsIDB4YTA5ZiwgMHgwMDAwLCAweGEwYTMsIDB4MDAwMCwgMHgwMDcwLCAweDcwNjMsIDB4MDAwMSwKKwkweDcxNTIsIDB4NzA1NCwgMHg5MzAwLCAweDcwNTYsIDB4YTM3YSwgMHhhNDhlLCAweGE1OTIsIDB4YTY5NiwKKwkweGE3OWEsIDB4MDgwYywgMHgxMGU5LCAweDkwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDAwOTYsIDB4YTg4YywKKwkweDkwYmUsIDB4NzAwMCwgMHgwMTQ4LCAweDkwYmUsIDB4NzEwMCwgMHgwMTMwLCAweDkwYmUsIDB4NzIwMCwKKwkweDAxMTgsIDB4MDA5ZSwgMHgwODA0LCAweDM1YjgsIDB4YTg4NCwgMHhhOTg4LCAweDA4MGMsIDB4Mjg3YywKKwkweDE1MTgsIDB4MDgwYywgMHg2NjM4LCAweDE1MDAsIDB4NzEyNiwgMHhiZTEyLCAweGJkMTYsIDB4YWU3YywKKwkweDA4MGMsIDB4NGIxZiwgMHgwMWM4LCAweDA4MGMsIDB4NGIxZiwgMHgwMWIwLCAweDAwOWUsIDB4YTg2NywKKwkweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4YTgyMywgMHgwMDAwLCAweGE4MDQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2UzMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywKKwkweDAwMDMsIDB4NzAxZiwgMHg1MjQxLCAweDAwMDUsIDB4MDA5ZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1YjUsIDB4NzEyNCwgMHgwODBjLCAweDMzMWEsIDB4YTgyMCwgMHg5MDg2LCAweDgwMDEsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1YjUsIDB4MjkwMCwgMHg3MDIyLCAweGE4MDQsIDB4MDA5NiwKKwkweDIwNDgsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwKKwkweDAwOWUsIDB4OTA4MCwgMHgwMDAyLCAweDAwNzYsIDB4MDAwNiwgMHgyMDk4LCAweDIwYTAsIDB4MjdlMCwKKwkweDI3ZTgsIDB4MjBhOSwgMHgwMDJhLCAweDA4MGMsIDB4MGY3YywgMHhhYTZjLCAweGFiNzAsIDB4YWM3NCwKKwkweGFkNzgsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTA2YiwgMHgwMDAwLCAweGFlNjQsIDB4YWY4YywKKwkweDk3YzYsIDB4NzAwMCwgMHgwMTE4LCAweDk3YzYsIDB4NzEwMCwgMHgxMTQ4LCAweDk2YzIsIDB4MDAwNCwKKwkweDA2MDAsIDB4MjAwOSwgMHgwMDA0LCAweDAwMGUsIDB4MDA3ZSwgMHgwODA0LCAweDRiNmIsIDB4OTdjNiwKKwkweDcyMDAsIDB4MTFiOCwgMHg5NmMyLCAweDAwNTQsIDB4MDJhMCwgMHgwMDBlLCAweDAwN2UsIDB4MjA2MSwKKwkweDE4YjgsIDB4MmM0NCwgMHhhMDc2LCAweGE3NzIsIDB4YTA3YiwgMHgwMDJhLCAweGEyOGUsIDB4YTM5MiwKKwkweGE0OTYsIDB4YTU5YSwgMHgwODBjLCAweDEwZTksIDB4NzAwNywgMHgwMDAyLCAweDcwMWYsIDB4NTI5ZCwKKwkweDAwMDUsIDB4MDAwZSwgMHgwMDdlLCAweDA4MDQsIDB4MzViOCwgMHg3MDIwLCAweDIwNDgsIDB4YTgwNCwKKwkweDIwNDgsIDB4YTgwNCwgMHgyMDQ4LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4MjA5OCwgMHgyMGEwLCAweDI3ZTAsIDB4MjdlOCwKKwkweDIwYTksIDB4MDAyYSwgMHgwODBjLCAweDBmN2MsIDB4MjEwMCwgMHgyMjM4LCAweDIwNjEsIDB4MThiOCwKKwkweDJjNDQsIDB4YTI4YywgMHhhMzkwLCAweGE0OTQsIDB4YTU5OCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwNCwKKwkweDRiNmIsIDB4ODFmZiwgMHgxOTA0LCAweDM1YjUsIDB4Nzk4YywgMHgyMDAxLCAweDE5N2QsIDB4OTE4YywKKwkweDgwMDAsIDB4MjEwMiwgMHgwODBjLCAweDRiMzYsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NmEwYywKKwkweDAxMjAsIDB4MDgwYywgMHg2YTE0LCAweDE5MDQsIDB4MzViOCwgMHgwODBjLCAweDY3NjAsIDB4MDkwNCwKKwkweDM1YjUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ODI2LCAweDAxMmUsIDB4MDkwNCwKKwkweDM1YjUsIDB4MjAwMSwgMHgxOTdkLCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LCAweDM1ODMsIDB4MDgwNCwKKwkweDQ1ODYsIDB4YTlhMCwgMHgyMDAxLCAweDE5N2QsIDB4OTE4YywgMHg4MDAwLCAweGMxOGQsIDB4MjEwMiwKKwkweDA4MGMsIDB4NGI0MywgMHgwMWEwLCAweDA4MGMsIDB4NmEwYywgMHgwMTE4LCAweDA4MGMsIDB4NmExNCwKKwkweDExNzAsIDB4MDgwYywgMHg2NzYwLCAweDIwMDksIDB4MDAwMiwgMHgwMTI4LCAweDA4MGMsIDB4NjgyNiwKKwkweDExNzAsIDB4MjAwOSwgMHgwMDAzLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywKKwkweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywKKwkweDQwMDAsIDB4MjAwMSwgMHgxOTdkLCAweDIwMDQsIDB4ZDBmYywgMHgxMTI4LCAweDA4MGMsIDB4NTc2NSwKKwkweDAxMTAsIDB4OTAwNiwgMHgwMDE4LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwKKwkweDAwMDUsIDB4NzhhOCwgMHhkMDhjLCAweDExMTgsIDB4ZDA4NCwgMHgwOTA0LCAweDQ0ZmIsIDB4MDgwYywKKwkweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NGIxZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwKKwkweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDZhMGMsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDQsIDB4MDExOCwKKwkweDkwOGUsIDB4MDAwNSwgMHgxNWEwLCAweDc4YTgsIDB4ZDA4YywgMHgwMTIwLCAweGI4MDAsIDB4YzA4YywKKwkweGI4MDIsIDB4MDAyOCwgMHgwODBjLCAweDU3NWQsIDB4ZDBiNCwgMHgwOTA0LCAweDQ1MzUsIDB4Nzg4NCwKKwkweDkwOGUsIDB4MDA3ZSwgMHgwOTA0LCAweDQ1MzUsIDB4OTA4ZSwgMHgwMDdmLCAweDA5MDQsIDB4NDUzNSwKKwkweDkwOGUsIDB4MDA4MCwgMHgwOTA0LCAweDQ1MzUsIDB4YjgwMCwgMHhkMDhjLCAweDE5MDQsIDB4NDUzNSwKKwkweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGNlNTEsIDB4MTEyMCwKKwkweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDM1YjUsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTM2OSwKKwkweDAwMDUsIDB4MDgwYywgMHg0YjUyLCAweDA5MDQsIDB4MzViOCwgMHgwODA0LCAweDQ1MzUsIDB4MDgwYywKKwkweDMzNzMsIDB4MDEwOCwgMHgwMDA1LCAweDIwMDksIDB4MTgzNCwgMHgyMTBjLCAweDgxZmYsIDB4MDEyMCwKKwkweDIwMDksIDB4MDAwMSwgMHgwODA0LCAweDM1YjUsIDB4MDgwYywgMHg1NzcxLCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMDcsIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsIDB4NmEwNCwgMHgwMTIwLCAweDIwMDksIDB4MDAwOCwKKwkweDA4MDQsIDB4MzViNSwgMHhiODljLCAweGQwYTQsIDB4MTExOCwgMHhkMGFjLCAweDE5MDQsIDB4NDUzNSwKKwkweDkwMDYsIDB4YTg2NiwgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4Y2ViMCwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzViNSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwKKwkweDUzYTIsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwKKwkweDA4MDQsIDB4NTZiMSwgMHgwODBjLCAweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweDA4MDQsIDB4NTMzYiwKKwkweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDU3NzEsIDB4MjAwOSwKKwkweDAwMDcsIDB4MTkwNCwgMHgzNWI1LCAweDA4MGMsIDB4NmEwNCwgMHgwMTIwLCAweDIwMDksIDB4MDAwOCwKKwkweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweDA4MGMsIDB4NmEwYywKKwkweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDM1YjUsIDB4MDgwYywgMHg0YjFmLCAweDIwMDksIDB4MDAwMiwKKwkweDA5MDQsIDB4MzViNSwgMHg5MDA2LCAweGE4NjYsIDB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwKKwkweDc5ODgsIDB4OTE5NCwgMHhmZjAwLCAweDkxOGMsIDB4MDBmZiwgMHg5MDA2LCAweDgyZmYsIDB4MTEyOCwKKwkweGMwZWQsIDB4YTk1MiwgMHg3OThjLCAweGE5NTYsIDB4MDAzOCwgMHg5MjhlLCAweDAxMDAsIDB4MTkwNCwKKwkweDM1YjgsIDB4YzBlNSwgMHhhOTUyLCAweGE5NTYsIDB4YTgzZSwgMHgwODBjLCAweGQxMDMsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDkwNCwgMHgzNWI1LCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUzZjgsIDB4MDAwNSwKKwkweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwOTA0LCAweDM1YjUsIDB4MDgwNCwKKwkweDM1ODMsIDB4N2FhOCwgMHg5Mjg0LCAweGMwMDAsIDB4MDE0OCwgMHhkMmVjLCAweDAxYTAsIDB4MDgwYywKKwkweDU3NzEsIDB4MTE4OCwgMHgyMDA5LCAweDAwMTQsIDB4MDgwNCwgMHgzNWI1LCAweGQyZGMsIDB4MTU3OCwKKwkweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDE5MDQsIDB4MzViNSwgMHgwODBjLCAweDU3NzEsIDB4MjAwOSwKKwkweDAwMDcsIDB4MTkwNCwgMHgzNWI1LCAweGQyZjQsIDB4MDEzOCwgMHg5Mjg0LCAweDUwMDAsIDB4YzBkNSwKKwkweDA4MGMsIDB4NTczNywgMHgwODA0LCAweDM1ODMsIDB4ZDJmYywgMHgwMTYwLCAweDA4MGMsIDB4NGI1MiwKKwkweDA5MDQsIDB4MzViOCwgMHg3OTg0LCAweDkyODQsIDB4OTAwMCwgMHhjMGQ1LCAweDA4MGMsIDB4NTcwYywKKwkweDA4MDQsIDB4MzU4MywgMHgwODBjLCAweDRiNTIsIDB4MDkwNCwgMHgzNWI4LCAweGI4MDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDU0ZTcsIDB4MDgwYywKKwkweDRiMWYsIDB4MjAwOSwgMHgwMDAyLCAweDA5MDQsIDB4NTRlNywgMHhhODVjLCAweDkwODAsIDB4MDAxYiwKKwkweGFmNjAsIDB4MjAwOSwgMHgwMDA4LCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwYywKKwkweDRiNjgsIDB4NzAxZiwgMHg1NDU0LCAweDAwMDUsIDB4YTg2YywgMHg5MDg2LCAweDA1MDAsIDB4MTEzOCwKKwkweGE4NzAsIDB4OTAwNSwgMHgxMTIwLCAweGE4NzQsIDB4OTA4NCwgMHhmZjAwLCAweDAxMTAsIDB4MTkwNCwKKwkweDM1YjgsIDB4YTg2NiwgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4NGI1MiwKKwkweDExMTAsIDB4MDgwNCwgMHgzNWI4LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGQxNmIsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDkwNCwgMHg1NGU3LCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDU0NzgsIDB4MDAwNSwKKwkweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwOTA0LCAweDU0ZTcsIDB4Nzk4NCwKKwkweDdhYTgsIDB4OTI4NCwgMHgxMDAwLCAweGUwODUsIDB4MDgwYywgMHg1NzBjLCAweDA4MDQsIDB4MzU4MywKKwkweDAwYzYsIDB4YWFiMCwgMHg5Mjg0LCAweGMwMDAsIDB4MDE0OCwgMHhkMmVjLCAweDAxNzAsIDB4MDgwYywKKwkweDU3NzEsIDB4MTE1OCwgMHgyMDA5LCAweDAwMTQsIDB4MDgwNCwgMHg1NGQ2LCAweDIwNjEsIDB4MTgwMCwKKwkweDA4MGMsIDB4NTc3MSwgMHgyMDA5LCAweDAwMDcsIDB4MTVjOCwgMHhkMmY0LCAweDAxMzAsIDB4OTI4NCwKKwkweDUwMDAsIDB4YzBkNSwgMHgwODBjLCAweDU3MzcsIDB4MDA1OCwgMHhkMmZjLCAweDAxODAsIDB4MDgwYywKKwkweDRiNTAsIDB4MDU5MCwgMHhhOTk4LCAweDkyODQsIDB4OTAwMCwgMHhjMGQ1LCAweDA4MGMsIDB4NTcwYywKKwkweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDA0MzgsIDB4MDgwYywKKwkweDRiNTAsIDB4MDUxMCwgMHgwODBjLCAweDZhMGMsIDB4MjAwOSwgMHgwMDA5LCAweDExYjgsIDB4YThjNCwKKwkweDkwODYsIDB4MDUwMCwgMHgxMWM4LCAweGE4YzgsIDB4OTAwNSwgMHgxMWIwLCAweGE4Y2MsIDB4OTA4NCwKKwkweGZmMDAsIDB4MTE5MCwgMHgwODBjLCAweDRiNTAsIDB4MTEwOCwgMHgwMDcwLCAweDIwMDksIDB4MDA0YiwKKwkweDA4MGMsIDB4ZDE2YiwgMHgyMDA5LCAweDAwMDMsIDB4MDEwOCwgMHgwMDc4LCAweDA0MzEsIDB4MTljMCwKKwkweGE4OTcsIDB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZTAsIDB4N2FhOCwKKwkweGQyZGMsIDB4MDkwNCwgMHgzNWI1LCAweDAwMTYsIDB4Nzk4NCwgMHg5Mjg0LCAweDEwMDAsIDB4YzBmZCwKKwkweDA4MGMsIDB4NTcwYywgMHgwMDFlLCAweDE5MDQsIDB4MzViNSwgMHgwODA0LCAweDM1ODMsIDB4MDBmNiwKKwkweDJkNzgsIDB4YWFiMCwgMHgwMDIxLCAweDAwZmUsIDB4MDAwNSwgMHhhYWIwLCAweGMyZDUsIDB4ZDJkYywKKwkweDAxNTAsIDB4MDAxNiwgMHhhOTk4LCAweDkyODQsIDB4MTQwMCwgMHhjMGZkLCAweDA4MGMsIDB4NTcwYywKKwkweDAwMWUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwKKwkweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDU3NzEsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwKKwkweDM1YjUsIDB4Nzk4NCwgMHg3ZWE4LCAweDk2YjQsIDB4MDBmZiwgMHgwODBjLCAweDY2OTksIDB4MTkwNCwKKwkweDM1YjgsIDB4OTE4NiwgMHgwMDdmLCAweDAxMzgsIDB4MDgwYywgMHg2YTBjLCAweDAxMjAsIDB4MjAwOSwKKwkweDAwMDksIDB4MDgwNCwgMHgzNWI1LCAweDA4MGMsIDB4NGIxZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwKKwkweDA4MDQsIDB4MzViNSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MjAwMSwKKwkweDAxMDAsIDB4ODAwNywgMHhhODBhLCAweDA4MGMsIDB4Y2U2YiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywKKwkweDA4MDQsIDB4MzViNSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1NTQ3LCAweDAwMDUsIDB4YTgwOCwKKwkweDgwMDcsIDB4OTA4NiwgMHgwMTAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzViNSwKKwkweGE4ZTAsIDB4YTg2NiwgMHhhODEwLCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDgwMGMsIDB4YTgxNCwKKwkweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4OTA4MCwgMHgwMDAyLCAweDkxMDgsIDB4ODkwNiwKKwkweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwNCwKKwkweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwNCwgMHg0YjZiLCAweDA4MGMsIDB4NGIxZiwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwgMHg3OTg0LCAweDkxOTQsIDB4ZmYwMCwKKwkweDkxOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsIDB4MTExOCwgMHg3MDIzLCAweDE5YjIsIDB4MDA0MCwKKwkweDkyYzYsIDB4MDAwMSwgMHgxMTE4LCAweDcwMjMsIDB4MTljYywgMHgwMDEwLCAweDA4MDQsIDB4MzViOCwKKwkweDIwMDksIDB4MDAxYSwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMTksIDB4YWY2MCwgMHgwODBjLCAweDRiNjgsIDB4NzAxZiwgMHg1NTk3LCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MmUsIDB4MjAwMywgMHgwMDAxLCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwOTgsIDB4YTg2MCwKKwkweDIwZTAsIDB4MjBhOSwgMHgwMDFhLCAweDcwMjAsIDB4MjBhMCwgMHgyMGU5LCAweDAwMDEsIDB4NDAwMywKKwkweDA4MDQsIDB4MzU4MywgMHgwODBjLCAweDRiMWYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1YjUsIDB4Nzk4NCwgMHg5MTk0LCAweGZmMDAsIDB4OTE4YywgMHgwMGZmLCAweDgyMTcsIDB4ODJmZiwKKwkweDExMTgsIDB4MjA5OSwgMHgxOWIyLCAweDAwNDAsIDB4OTJjNiwgMHgwMDAxLCAweDExMTgsIDB4MjA5OSwKKwkweDE5Y2MsIDB4MDAxMCwgMHgwODA0LCAweDM1YjgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjBhMCwKKwkweGE4NjAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMWEsIDB4MjBlMSwgMHgwMDAxLCAweDQwMDMsIDB4MjAwOSwKKwkweDAwMWEsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwKKwkweGFmNjAsIDB4MDgwNCwgMHg0YjZiLCAweDc4ODQsIDB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzViOCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4MDBjNiwKKwkweDIwNjEsIDB4MTlmOSwgMHg2MTQyLCAweDAwY2UsIDB4MDEyZSwgMHgwODA0LCAweDM1ODMsIDB4MDBjNiwKKwkweDA4MGMsIDB4NzQzZSwgMHgxMTYwLCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHg3NDg1LCAweDA4MGMsIDB4NzM2YSwgMHgwODBjLCAweDBkZDUsIDB4MjA2MSwKKwkweDE4MDAsIDB4NjAzMCwgMHhjMDlkLCAweDYwMzIsIDB4MDgwYywgMHg1ZjZjLCAweDAwY2UsIDB4MDAwNSwKKwkweDAwYzYsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4ZSwgMHgwMDAwLCAweDA5MDQsIDB4MzViNSwKKwkweDc4ODQsIDB4OTAwNSwgMHgwMTg4LCAweDc4ODgsIDB4MjA2MSwgMHgxOTliLCAweDJjMGMsIDB4MjA2MiwKKwkweDA4MGMsIDB4MmM1ZSwgMHgwMWEwLCAweDA4MGMsIDB4MmM2NiwgMHgwMTg4LCAweDA4MGMsIDB4MmM2ZSwKKwkweDAxNzAsIDB4MjE2MiwgMHgwODA0LCAweDM1YjgsIDB4MjA2MSwgMHgwMTAwLCAweDYwMzgsIDB4OTA4NiwKKwkweDAwMDcsIDB4MTExOCwgMHgyMDA5LCAweDAwMDEsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDAsIDB4Nzg4NCwKKwkweDkwODYsIDB4MDAwMiwgMHgxNTY4LCAweDIwNjEsIDB4MDEwMCwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwKKwkweDAwMjYsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4YTcyMiwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywKKwkweGE3MmMsIDB4MDAyZSwgMHgwODBjLCAweGE2MzYsIDB4MDAzNiwgMHg5MDFlLCAweDA4MGMsIDB4YTZhYywKKwkweDAwM2UsIDB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4ZWI3OSwgMHgwODBjLCAweGViOTQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHg3NDg1LCAweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMDMsIDB4MDAwNCwgMHgyMDAxLCAweDE5YTYsIDB4MjAwMywgMHgwMDAwLCAweDYwMjcsIDB4MDAwOCwKKwkweDAwY2UsIDB4MDgwNCwgMHgzNTgzLCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwKKwkweDM1YjUsIDB4MDgwYywgMHg1NzcxLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MzViNSwKKwkweDc5ODQsIDB4N2VhOCwgMHg5NmI0LCAweDAwZmYsIDB4MDgwYywgMHg2Njk5LCAweDE5MDQsIDB4MzViOCwKKwkweDkxODYsIDB4MDA3ZiwgMHgwMTM4LCAweDA4MGMsIDB4NmEwYywgMHgwMTIwLCAweDIwMDksIDB4MDAwOSwKKwkweDA4MDQsIDB4MzViNSwgMHgwODBjLCAweDRiMWYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwKKwkweDM1YjUsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4Y2U2ZSwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzViNSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwKKwkweDU2OWEsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwKKwkweDA4MDQsIDB4MzViNSwgMHhhOGUwLCAweGE4NjYsIDB4YTgzNCwgMHg4MDA3LCAweDgwMGMsIDB4YTg1YywKKwkweDkwODAsIDB4MDAwYywgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweGFmNjAsIDB4MDgwNCwKKwkweDRiNmIsIDB4YTg5OCwgMHg5MDg2LCAweDAwMGQsIDB4MTkwNCwgMHgzNWI1LCAweDIwMjEsIDB4NDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsIDB4NTZiZSwgMHgwMDEwLCAweDAxMmUsIDB4MGNjMCwKKwkweDdjMzYsIDB4OTQ4NiwgMHg0MDAwLCAweDAxMTgsIDB4NzgzMywgMHgwMDExLCAweDAwMTAsIDB4NzgzMywKKwkweDAwMTAsIDB4Nzg4MywgMHg0MDA1LCAweGE5OTgsIDB4Nzk4NiwgMHhhOWE0LCAweDc5OWEsIDB4YTlhOCwKKwkweDc5OWUsIDB4MDgwYywgMHg0YjViLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwKKwkweGQwODQsIDB4MTkwYywgMHgxMTliLCAweDcwMDcsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4NzAwZiwKKwkweDAwMDAsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsIDB4MjA2MSwKKwkweDE5ZjksIDB4Nzk4NCwgMHg2MTUyLCAweDYxNGUsIDB4NjA1NywgMHgwMDAwLCAweDYwNGIsIDB4MDAwOSwKKwkweDc4OTgsIDB4NjA2YSwgMHg3ODljLCAweDYwNjYsIDB4Nzg4OCwgMHg2MDYyLCAweDc4OGMsIDB4NjA1ZSwKKwkweDIwMDEsIDB4MWEwNywgMHgyMDQ0LCAweDIwMDEsIDB4MWEwZSwgMHhhMDc2LCAweGEwNjAsIDB4YTA3MiwKKwkweGEwN2IsIDB4MDAwMSwgMHhhMDdmLCAweDAwMDIsIDB4YTA2YiwgMHgwMDAwLCAweGEwOWYsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDEyZSwgMHgwODA0LCAweDM1ODMsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBiNiwKKwkweDAwYzYsIDB4OTBlNCwgMHhjMDAwLCAweDAxNjgsIDB4MDAwNiwgMHhkMGQ0LCAweDAxMzAsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDMzMzgsIDB4MDAzZSwgMHgwODBjLCAweGNjZDMsIDB4MDAwZSwKKwkweDExOTgsIDB4ZDBlNCwgMHgwMTYwLCAweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDE2MCwKKwkweDA4MGMsIDB4NjBjNywgMHgwODBjLCAweGFlYWQsIDB4MDExMCwgMHhiODE3LCAweDAwMDAsIDB4OTAwNiwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMTJlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjYzgsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMTU2LCAweDIwMTAsIDB4OTAwZSwgMHgyMGE5LCAweDA4MDAsIDB4MDAxNiwKKwkweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwMDUsIDB4MDE4OCwgMHg5MTg2LCAweDAwN2UsIDB4MDE3MCwKKwkweDkxODYsIDB4MDA3ZiwgMHgwMTU4LCAweDkxODYsIDB4MDA4MCwgMHgwMTQwLCAweDkxODYsIDB4MDBmZiwKKwkweDAxMjgsIDB4MDAyNiwgMHgyMjAwLCAweDA4MGMsIDB4NTcwYywgMHgwMDJlLCAweDAwMWUsIDB4ODEwOCwKKwkweDFmMDQsIDB4NTczZiwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4NDgsIDB4MjAwNCwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODY3LCAweDIwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTgxMCwKKwkweDIwMDQsIDB4ZDBkNCwgMHgwMDBlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBiNCwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAzLCAweDAwMDUsIDB4MDAxNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODllLCAweDcxMDgsIDB4OTEwZCwgMHg3MTBhLCAweDAwZWUsIDB4MDAxZSwKKwkweDAwMDUsIDB4NzlhNCwgMHg5MTgyLCAweDAwODEsIDB4MWEwNCwgMHgzNWI4LCAweDgxMGMsIDB4MDAxNiwKKwkweDA4MGMsIDB4NGIxZiwgMHgwMTcwLCAweDA4MGMsIDB4MGYwNywgMHgyMTAwLCAweDIyMzgsIDB4N2Q4NCwKKwkweDdjODgsIDB4N2I4YywgMHg3YTkwLCAweDAwMWUsIDB4MDgwYywgMHg0YjY4LCAweDcwMWYsIDB4NTc5ZCwKKwkweDAwMDUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzViNSwgMHgyMDc5LCAweDAwMDAsIDB4N2Q5NCwKKwkweDdjOTgsIDB4N2JhOCwgMHg3YWFjLCAweDc5YTQsIDB4ODEwYywgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwKKwkweGE3NzAsIDB4YTA3NCwgMHgyMDcxLCAweDE4OWUsIDB4MDgwYywgMHg0YjZiLCAweDcwMWYsIDB4NTdiMSwKKwkweDAwMDUsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4MDAxNiwgMHgwMDI2LCAweGEyNzAsIDB4YTE3NCwKKwkweDA4MGMsIDB4MGYwZiwgMHgwMDJlLCAweDAwMWUsIDB4MDgwYywgMHgwZmJjLCAweDkwMDYsIDB4YTgwMiwKKwkweGE4MDYsIDB4MDgwNCwgMHgzNTgzLCAweDAxMjYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwKKwkweDAyMDAsIDB4MjA3MSwgMHgxODAwLCAweDYwNDQsIDB4ZDBhNCwgMHgxMWU4LCAweGQwODQsIDB4MDExOCwKKwkweDA4MGMsIDB4NTk2YywgMHgwMDY4LCAweGQwOGMsIDB4MDExOCwgMHgwODBjLCAweDU4NzUsIDB4MDA0MCwKKwkweGQwOTQsIDB4MDExOCwgMHgwODBjLCAweDU4NDUsIDB4MDAxOCwgMHhkMDljLCAweDAxMDgsIDB4MDA5OSwKKwkweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxNGUsIDB4MDEzZSwKKwkweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwMTYsIDB4NjEyOCwgMHhkMTljLCAweDExMTAsIDB4YzE5ZCwKKwkweDYxMmEsIDB4MDAxZSwgMHgwYzY4LCAweDAwMDYsIDB4NzA5OCwgMHg5MDA1LCAweDAwMGUsIDB4MDEyMCwKKwkweDcwOWIsIDB4MDAwMCwgMHg3MDkzLCAweDAwMDAsIDB4NjI0YywgMHg5Mjg2LCAweGYwZjAsIDB4MTE1MCwKKwkweDYwNDgsIDB4OTA4NiwgMHhmMGYwLCAweDAxMzAsIDB4NjI0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywKKwkweDAwMTAsIDB4MDQ5MCwgMHg5Mjk0LCAweGZmMDAsIDB4OTI5NiwgMHhmNzAwLCAweDAxNzgsIDB4NzEzOCwKKwkweGQxYTQsIDB4MTE2MCwgMHg2MjQwLCAweDkyOTUsIDB4MDEwMCwgMHg2MjQyLCAweDkyOTQsIDB4MDAxMCwKKwkweDAxMjgsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NjAyOSwgMHgwMGYwLCAweDYwNDAsIDB4OTA4NCwKKwkweDAwMTAsIDB4OTA4NSwgMHgwMTQwLCAweDYwNDIsIDB4NjA0MywgMHgwMDAwLCAweDcwODcsIDB4MDAwMCwKKwkweDcwYTMsIDB4MDAwMSwgMHg3MGM3LCAweDAwMDAsIDB4NzBkZiwgMHgwMDAwLCAweDIwMDksIDB4MWM4MCwKKwkweDIwMGIsIDB4MDAwMCwgMHg3MDk3LCAweDAwMDAsIDB4NzA4YiwgMHgwMDBmLCAweDIwMDksIDB4MDAwZiwKKwkweDIwMTEsIDB4NWYwZiwgMHgwODBjLCAweDg2NDgsIDB4MDAwNSwgMHgyMDAxLCAweDE4NjksIDB4MjAwNCwKKwkweGQwOGMsIDB4MDExMCwgMHg3MDVmLCAweGZmZmYsIDB4NzA4OCwgMHg5MDA1LCAweDE1MjgsIDB4MjAxMSwKKwkweDVmMGYsIDB4MDgwYywgMHg4NWIwLCAweDYwNDAsIDB4OTA5NCwgMHgwMDEwLCAweDkyODUsIDB4MDAyMCwKKwkweDYwNDIsIDB4MjBhOSwgMHgwMGM4LCAweDYwNDQsIDB4ZDA4YywgMHgxMTY4LCAweDFmMDQsIDB4NTg1YiwKKwkweDYyNDIsIDB4NzA5YiwgMHgwMDAwLCAweDYwNDAsIDB4OTA5NCwgMHgwMDEwLCAweDkyODUsIDB4MDA4MCwKKwkweDYwNDIsIDB4NjI0MiwgMHgwMDQ4LCAweDYyNDIsIDB4NzA5YiwgMHgwMDAwLCAweDcwOGYsIDB4MDAwMCwKKwkweDkwMDYsIDB4MDgwYywgMHg2MGIyLCAweDAwMDAsIDB4MDAwNSwgMHg3MDhjLCAweDkwOGEsIDB4MDAwMywKKwkweDFhMGMsIDB4MGRkNSwgMHgwMDBiLCAweDAwMDUsIDB4NTg3ZiwgMHg1OGQwLCAweDU5NmIsIDB4MDBmNiwKKwkweDAwMTYsIDB4NjkwMCwgMHg5MThjLCAweDA4MDAsIDB4NzA4ZiwgMHgwMDAxLCAweDIwMDEsIDB4MDE1ZCwKKwkweDIwMDMsIDB4MDAwMCwgMHg2ODAzLCAweDAwZmMsIDB4MjBhOSwgMHgwMDA0LCAweDY4MDAsIDB4OTA4NCwKKwkweDAwZmMsIDB4MDEyMCwgMHgxZjA0LCAweDU4OGUsIDB4MDgwYywgMHgwZGQ1LCAweDY4YTAsIDB4NjhhMiwKKwkweDY4OWMsIDB4Njg5ZSwgMHg2ODk4LCAweDY4OWEsIDB4YTAwMSwgMHg5MThkLCAweDE2MDAsIDB4NjkwMiwKKwkweDAwMWUsIDB4NjgzNywgMHgwMDIwLCAweDA4MGMsIDB4NjA4ZSwgMHgyMDc5LCAweDFjMDAsIDB4NzgzMywKKwkweDExMDEsIDB4NzgzNywgMHgwMDAwLCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE4MDUsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgxYzBlLCAweDIwYTksIDB4MDAwNCwgMHg0MDAzLCAweDA4MGMsIDB4YWJmZSwKKwkweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDFjMDAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwKKwkweDIwYTksIDB4MDAxNCwgMHg0MDAzLCAweDYwYzMsIDB4MDAwYywgMHg2MDBmLCAweDAwMDAsIDB4MDgwYywKKwkweDVmNDAsIDB4MDBmZSwgMHg5MDA2LCAweDcwOTIsIDB4NjA0MywgMHgwMDA4LCAweDYwNDIsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5MCwgMHg3MDkzLCAweDAwMDAsIDB4OTAyNSwgMHgwOTA0LCAweDU5NDgsIDB4NjAyMCwKKwkweGQwYjQsIDB4MTkwNCwgMHg1OTQ2LCAweDcxYTAsIDB4ODFmZiwgMHgwOTA0LCAweDU5MzQsIDB4OTQ4NiwKKwkweDAwMGMsIDB4MTkwNCwgMHg1OTQxLCAweDk0ODAsIDB4MDAxOCwgMHg4MDA0LCAweDIwYTgsIDB4MDgwYywKKwkweDYwODcsIDB4MjAxMSwgMHgwMjYwLCAweDIwMTksIDB4MWMwMCwgMHgyMjBjLCAweDIzMDQsIDB4OTEwNiwKKwkweDExZTgsIDB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4NThlZCwgMHg2MDQzLCAweDAwMDQsIDB4MjA2MSwKKwkweDAxNDAsIDB4NjA1YiwgMHhiYzk0LCAweDYwNWYsIDB4ZjBmMCwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywKKwkweDAwMDYsIDB4NzA4ZiwgMHgwMDAyLCAweDcwOWIsIDB4MDAwMiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwKKwkweDVmMTYsIDB4MDgwYywgMHg4NjQ4LCAweDA4MGMsIDB4NjA4ZSwgMHgwNGMwLCAweDA4MGMsIDB4NjA4NywKKwkweDIwNzksIDB4MDI2MCwgMHg3OTMwLCAweDkxOGUsIDB4MTEwMSwgMHgxNTU4LCAweDc4MzQsIDB4OTAwNSwKKwkweDE1NDAsIDB4NzkwMCwgMHg5MThjLCAweDAwZmYsIDB4MTExOCwgMHg3ODA0LCAweDkwMDUsIDB4MDE5MCwKKwkweDA4MGMsIDB4NjA4NywgMHgyMDExLCAweDAyNmUsIDB4MjAxOSwgMHgxODA1LCAweDIwYTksIDB4MDAwNCwKKwkweDIyMGMsIDB4MjMwNCwgMHg5MTAyLCAweDAyMzAsIDB4MTFhMCwgMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwKKwkweDU5MjgsIDB4MDA3OCwgMHg3MGEzLCAweDAwMDAsIDB4MDgwYywgMHg2MDg3LCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDI2MCwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwgMHgxYzAwLCAweDIwYTksIDB4MDAxNCwKKwkweDQwMDMsIDB4NjA0MywgMHgwMDA4LCAweDYwNDMsIDB4MDAwMCwgMHgwMDEwLCAweDAwZmUsIDB4MDAwNSwKKwkweDYwNDAsIDB4OTA4NSwgMHgwMTAwLCAweDYwNDIsIDB4NjAyMCwgMHhkMGI0LCAweDFkYjgsIDB4MDgwYywKKwkweGFiZmUsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MWMwMCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNDAsIDB4MjBhOSwgMHgwMDE0LCAweDQwMDMsIDB4NjBjMywgMHgwMDBjLCAweDIwMTEsIDB4MTlmMCwKKwkweDIwMTMsIDB4MDAwMCwgMHg3MDkzLCAweDAwMDAsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwKKwkweDA4MGMsIDB4YTM0ZCwgMHgwOGQ4LCAweDAwMDUsIDB4NzA5OCwgMHg5MDhhLCAweDAwMWQsIDB4MWEwYywKKwkweDBkZDUsIDB4MDAwYiwgMHgwMDA1LCAweDU5OWQsIDB4NTliMCwgMHg1OWQ5LCAweDU5ZjksIDB4NWExZiwKKwkweDVhNGUsIDB4NWE3NCwgMHg1YWFjLCAweDVhZDIsIDB4NWIwMCwgMHg1YjNiLCAweDViNzMsIDB4NWI5MSwKKwkweDViYmMsIDB4NWJkZSwgMHg1YmY5LCAweDVjMDMsIDB4NWMzNywgMHg1YzVkLCAweDVjOGMsIDB4NWNiMiwKKwkweDVjZWEsIDB4NWQyZSwgMHg1ZDZiLCAweDVkOGMsIDB4NWRlNSwgMHg1ZTA3LCAweDVlMzUsIDB4NWUzNSwKKwkweDAwYzYsIDB4MjA2MSwgMHgxODAwLCAweDYwMDMsIDB4MDAwNywgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwKKwkweDkwODQsIDB4ZmZmOSwgMHg2MDA2LCAweDAwY2UsIDB4MDAwNSwgMHgyMDYxLCAweDAxNDAsIDB4NjA1YiwKKwkweGJjOTQsIDB4NjA1ZiwgMHhmMGYwLCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwMDIsIDB4NzA5YiwKKwkweDAwMDEsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg2NDgsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5MCwgMHg5MDg2LCAweDAwMTQsIDB4MTUxMCwgMHg2MDQyLCAweDYwMjAsIDB4ZDBiNCwKKwkweDExZjAsIDB4MDgwYywgMHg2MDg3LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwMiwKKwkweDExYTAsIDB4NzgzNCwgMHg5MDA1LCAweDExODgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwKKwkweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwKKwkweDcwOWIsIDB4MDAxMCwgMHgwODBjLCAweDVjMDMsIDB4MDAxMCwgMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMDMsIDB4NjA0MywgMHgwMDA0LCAweDIwMTEsIDB4NWYxNiwKKwkweDA4MGMsIDB4ODViMCwgMHgwODBjLCAweDYwMGIsIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwMiwKKwkweDc4MzcsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDgsIDB4OWY4OCwgMHgwMDBlLCAweDIwMGIsIDB4MDAwMCwKKwkweDgxMDgsIDB4MWYwNCwgMHg1OWVlLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVmNDAsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDUwMCwgMHgyMDExLCAweDVmMTYsIDB4MDgwYywKKwkweDg1YjAsIDB4OTA4NiwgMHgwMDE0LCAweDExYjgsIDB4MDgwYywgMHg2MDg3LCAweDIwNzksIDB4MDI2MCwKKwkweDdhMzAsIDB4OTI5NiwgMHgxMTAyLCAweDExNzgsIDB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwKKwkweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwKKwkweDAwMDQsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NjA2MywgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwKKwkweDcwOWIsIDB4MDAwNSwgMHgwODBjLCAweDYwMGIsIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwMywKKwkweDc4MzcsIDB4MDAwMCwgMHgwODBjLCAweDYwODcsIDB4MDgwYywgMHg2MDZhLCAweDExNzAsIDB4NzA4NCwKKwkweDkwMDUsIDB4MTE1OCwgMHg3MTVjLCAweDkxODYsIDB4ZmZmZiwgMHgwMTM4LCAweDIwMTEsIDB4MDAwOCwKKwkweDA4MGMsIDB4NWVjMywgMHgwMTY4LCAweDA4MGMsIDB4NjA0MCwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwKKwkweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywKKwkweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVmNDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwKKwkweDkwMDUsIDB4MDUwMCwgMHgyMDExLCAweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsIDB4MDAxNCwKKwkweDExYjgsIDB4MDgwYywgMHg2MDg3LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwMywKKwkweDExNzgsIDB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwKKwkweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDA2LCAweDAwMjksIDB4MDAxMCwKKwkweDA4MGMsIDB4NjA2MywgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMDcsIDB4MDgwYywKKwkweDYwMGIsIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNCwgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywKKwkweDYwODcsIDB4MDgwYywgMHg2MDZhLCAweDExYjgsIDB4NzA4NCwgMHg5MDA1LCAweDExYTAsIDB4NzE2NCwKKwkweDkxODYsIDB4ZmZmZiwgMHgwMTgwLCAweDkxODAsIDB4MzM4NCwgMHgyMDBkLCAweDkxOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4NWVjMywgMHgwMTgwLCAweDA4MGMsIDB4NTA1YSwKKwkweDAxMTAsIDB4MDgwYywgMHgyOGU1LCAweDIwYTksIDB4MDAwOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwKKwkweDA4MGMsIDB4NWY0MCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDUwMCwKKwkweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4OTA4NiwgMHgwMDE0LCAweDExYjgsIDB4MDgwYywKKwkweDYwODcsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA0LCAweDExNzgsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwKKwkweDcwYzcsIDB4MDAwMSwgMHg3MDliLCAweDAwMDgsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NjA2MywKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAwOSwgMHgwODBjLCAweDYwMGIsIDB4MjA3OSwKKwkweDAyNDAsIDB4NzgzMywgMHgxMTA1LCAweDc4MzcsIDB4MDEwMCwgMHgwODBjLCAweDYwNmEsIDB4MTE1MCwKKwkweDcwODQsIDB4OTAwNSwgMHgxMTM4LCAweDA4MGMsIDB4NWUzNiwgMHgxMTg4LCAweDkwODUsIDB4MDAwMSwKKwkweDA4MGMsIDB4MjhlNSwgMHgyMGE5LCAweDAwMDgsIDB4MDgwYywgMHg2MDg3LCAweDIwZTEsIDB4MDAwMCwKKwkweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywKKwkweDAwMTQsIDB4MDgwYywgMHg1ZjQwLCAweDAwMTAsIDB4MDgwYywgMHg1OTkwLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1YTgsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwKKwkweDkwODYsIDB4MDAxNCwgMHgxNTYwLCAweDA4MGMsIDB4NjA4NywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwKKwkweDkyOTYsIDB4MTEwNSwgMHgxNTIwLCAweDc4MzQsIDB4OTA4NCwgMHgwMTAwLCAweDIwMTEsIDB4MDEwMCwKKwkweDkyMWUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwKKwkweDcwYzcsIDB4MDAwMSwgMHg3MDliLCAweDAwMGEsIDB4MDBiMSwgMHgwMDk4LCAweDkwMDUsIDB4MTE3OCwKKwkweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwKKwkweDcwOTcsIDB4MDAwMCwgMHg3MDliLCAweDAwMGUsIDB4MDgwYywgMHg1YmRlLCAweDAwMTAsIDB4MDgwYywKKwkweDYwNjMsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDBiLCAweDIwMTEsIDB4MWMwZSwKKwkweDIwZTksIDB4MDAwMSwgMHgyMmEwLCAweDIwYTksIDB4MDA0MCwgMHgyMDE5LCAweGZmZmYsIDB4NDMwNCwKKwkweDA4MGMsIDB4NjAwYiwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTA2LCAweDc4MzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NjA2YSwgMHgwMTE4LCAweDIwMTMsIDB4MDAwMCwgMHgwMDIwLCAweDcwNjAsIDB4OTA4NSwKKwkweDAxMDAsIDB4MjAxMiwgMHgyMGE5LCAweDAwNDAsIDB4MjAwOSwgMHgwMjRlLCAweDIwMTEsIDB4MWMwZSwKKwkweDIyMGUsIDB4ODIxMCwgMHg4MTA4LCAweDkxODYsIDB4MDI2MCwgMHgxMTI4LCAweDY4MTAsIDB4ODAwMCwKKwkweDY4MTIsIDB4MjAwOSwgMHgwMjQwLCAweDFmMDQsIDB4NWI2MCwgMHg2MGMzLCAweDAwODQsIDB4MDgwYywKKwkweDVmNDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDAxYzAsIDB4MjAxMSwKKwkweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsIDB4MDA4NCwgMHgxMTc4LCAweDA4MGMsIDB4NjA4NywKKwkweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNiwgMHgxMTM4LCAweDc4MzQsIDB4OTAwNSwKKwkweDExMjAsIDB4NzA5YiwgMHgwMDBjLCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDYwNjMsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMGQsIDB4MDgwYywgMHg2MDBiLCAweDIwNzksIDB4MDI0MCwKKwkweDc4MzMsIDB4MTEwNywgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg2MDg3LCAweDIwYTksIDB4MDA0MCwKKwkweDIwMTEsIDB4MDI2ZSwgMHgyMDA5LCAweDAyNGUsIDB4MjIwZSwgMHg4MjEwLCAweDgxMDgsIDB4OTE4NiwKKwkweDAyNjAsIDB4MTE1MCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDA5LCAweDAyNDAsIDB4NjgxNCwKKwkweDgwMDAsIDB4NjgxNiwgMHgyMDExLCAweDAyNjAsIDB4MWYwNCwgMHg1YmE0LCAweDYwYzMsIDB4MDA4NCwKKwkweDA4MGMsIDB4NWY0MCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDFlMCwKKwkweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4OTA4NiwgMHgwMDg0LCAweDExOTgsIDB4MDgwYywKKwkweDYwODcsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA3LCAweDExNTgsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTE0MCwgMHg3MDk3LCAweDAwMDEsIDB4MDgwYywgMHg1ZmRkLCAweDcwOWIsIDB4MDAwZSwKKwkweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDYwNjMsIDB4MDBmZSwgMHgwMDA1LCAweDkxOGQsIDB4MDAwMSwKKwkweDA4MGMsIDB4NjBiMiwgMHg3MDliLCAweDAwMGYsIDB4NzA5MywgMHgwMDAwLCAweDIwNjEsIDB4MDE0MCwKKwkweDYwNWIsIDB4YmM4NSwgMHg2MDVmLCAweGI1YjUsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDAwNSwKKwkweDYwNDMsIDB4MDAwNCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODVhNCwKKwkweDAwMDUsIDB4NzA5MCwgMHg5MDA1LCAweDAxMzAsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwKKwkweDcwOWIsIDB4MDAwMCwgMHgwMDA1LCAweDcwOWIsIDB4MDAxMSwgMHgwODBjLCAweGFiZmUsIDB4MDgwYywKKwkweDYwODcsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2MCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAyNDAsIDB4NzQ5MCwgMHg5NDgwLCAweDAwMTgsIDB4OTA4MCwgMHgwMDA3LCAweDkwODQsIDB4MDNmOCwKKwkweDgwMDQsIDB4MjBhOCwgMHg0MDAzLCAweDA4MGMsIDB4NjA2YSwgMHgxMWEwLCAweDcxN2MsIDB4ODFmZiwKKwkweDAxODgsIDB4OTAwZSwgMHg3MDgwLCAweDkwODQsIDB4MDBmZiwgMHgwMTYwLCAweDA4MGMsIDB4Mjg3YywKKwkweDkxODYsIDB4MDA3ZSwgMHgwMTM4LCAweDkxODYsIDB4MDA4MCwgMHgwMTIwLCAweDIwMTEsIDB4MDAwOCwKKwkweDA4MGMsIDB4NWVjMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjQwLCAweDAwMDUsIDB4MDBmNiwKKwkweDcwOTAsIDB4OTAwNSwgMHgwNTAwLCAweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4OTA4NiwKKwkweDAwMTQsIDB4MTFiOCwgMHgwODBjLCAweDYwODcsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwKKwkweDExMDMsIDB4MTE3OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwKKwkweDcwYzQsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwgMHg3MDliLCAweDAwMTIsIDB4MDAyOSwKKwkweDAwMTAsIDB4NzA5MywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAxMywKKwkweDA4MGMsIDB4NjAxOSwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTAzLCAweDc4MzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NjA4NywgMHgwODBjLCAweDYwNmEsIDB4MTE3MCwgMHg3MDg0LCAweDkwMDUsIDB4MTE1OCwKKwkweDcxNWMsIDB4OTE4NiwgMHhmZmZmLCAweDAxMzgsIDB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4NWVjMywKKwkweDAxNjgsIDB4MDgwYywgMHg2MDQwLCAweDIwYTksIDB4MDAwOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwKKwkweDA4MGMsIDB4NWY0MCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDUwMCwKKwkweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4OTA4NiwgMHgwMDE0LCAweDExYjgsIDB4MDgwYywKKwkweDYwODcsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA0LCAweDExNzgsIDB4NzgzNCwKKwkweDkwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwKKwkweDcwYzcsIDB4MDAwMSwgMHg3MDliLCAweDAwMTQsIDB4MDAyOSwgMHgwMDEwLCAweDcwOTMsIDB4MDAwMCwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAxNSwgMHgwODBjLCAweDYwMTksIDB4MjA3OSwKKwkweDAyNDAsIDB4NzgzMywgMHgxMTA0LCAweDc4MzcsIDB4MDAwMCwgMHgwODBjLCAweDYwODcsIDB4MDgwYywKKwkweDYwNmEsIDB4MTFiOCwgMHg3MDg0LCAweDkwMDUsIDB4MTFhMCwgMHg3MTY0LCAweDkxODYsIDB4ZmZmZiwKKwkweDAxODAsIDB4OTE4MCwgMHgzMzg0LCAweDIwMGQsIDB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjAxMSwKKwkweDAwMDgsIDB4MDgwYywgMHg1ZWMzLCAweDAxODAsIDB4MDgwYywgMHg1MDVhLCAweDAxMTAsIDB4MDgwYywKKwkweDI4ZTUsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWY0MCwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwNWYwLCAweDIwMTEsIDB4NWYxNiwKKwkweDA4MGMsIDB4ODViMCwgMHg5MDg2LCAweDAwMTQsIDB4MTVhOCwgMHgwODBjLCAweDYwODcsIDB4MjA3OSwKKwkweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDUsIDB4MTU2OCwgMHg3ODM0LCAweDkwODQsIDB4MDEwMCwKKwkweDIwMTEsIDB4MDEwMCwgMHg5MjFlLCAweDExNjgsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NjBiMiwKKwkweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwKKwkweDAwODAsIDB4OTAwNSwgMHgxMWI4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzQsIDB4OTAwNSwKKwkweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDYwYjIsIDB4NzA5NywKKwkweDAwMDAsIDB4N2EzOCwgMHhkMmY0LCAweDAxMTAsIDB4NzBkZiwgMHgwMDA4LCAweDcwOWIsIDB4MDAxNiwKKwkweDAwMjksIDB4MDAxMCwgMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDA4MGMsIDB4YWJmZSwKKwkweDA4MGMsIDB4NjA4NywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjYwLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMGUsIDB4NDAwMywgMHgyMDExLCAweDAyNmQsIDB4MjIwNCwKKwkweDkwODQsIDB4MDEwMCwgMHgyMDExLCAweDAyNGQsIDB4MjAxMiwgMHgyMDExLCAweDAyNmUsIDB4NzA5YiwKKwkweDAwMTcsIDB4MDgwYywgMHg2MDZhLCAweDExNTAsIDB4NzA4NCwgMHg5MDA1LCAweDExMzgsIDB4MDgwYywKKwkweDVlMzYsIDB4MTE4OCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHgyOGU1LCAweDIwYTksIDB4MDAwOCwKKwkweDA4MGMsIDB4NjA4NywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVmNDAsIDB4MDAxMCwKKwkweDA4MGMsIDB4NTk5MCwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDAxZDgsIDB4MjAxMSwKKwkweDVmMTYsIDB4MDgwYywgMHg4NWIwLCAweDkwODYsIDB4MDA4NCwgMHgxMTkwLCAweDA4MGMsIDB4NjA4NywKKwkweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNiwgMHgxMTUwLCAweDc4MzQsIDB4OTAwNSwKKwkweDExMzgsIDB4OTAwNiwgMHgwODBjLCAweDYwYjIsIDB4NzA5YiwgMHgwMDE4LCAweDAwMjksIDB4MDAxMCwKKwkweDcwOTMsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMTksIDB4MDgwYywKKwkweDYwMTksIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNiwgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywKKwkweDYwODcsIDB4MjAwOSwgMHgwMjZlLCAweDIwMzksIDB4MWMwZSwgMHgyMGE5LCAweDAwNDAsIDB4MjEzZSwKKwkweDg3MzgsIDB4ODEwOCwgMHg5MTg2LCAweDAyODAsIDB4MTEyOCwgMHg2ODE0LCAweDgwMDAsIDB4NjgxNiwKKwkweDIwMDksIDB4MDI2MCwgMHgxZjA0LCAweDVkOWYsIDB4MjAzOSwgMHgxYzBlLCAweDA4MGMsIDB4NjA2YSwKKwkweDExZTgsIDB4MjcyOCwgMHgyNTE0LCAweDgyMDcsIDB4OTA4NCwgMHgwMGZmLCAweDgwMDAsIDB4MjAxOCwKKwkweDkyOTQsIDB4MDBmZiwgMHg4MDA3LCAweDkyMDUsIDB4MjAyYSwgMHg3MDYwLCAweDIzMTAsIDB4ODIxNCwKKwkweDkyYTAsIDB4MWMwZSwgMHgyNDE0LCAweDkzOGMsIDB4MDAwMSwgMHgwMTE4LCAweDkyOTQsIDB4ZmYwMCwKKwkweDAwMTgsIDB4OTI5NCwgMHgwMGZmLCAweDgwMDcsIDB4OTIxNSwgMHgyMjIyLCAweDIwYTksIDB4MDA0MCwKKwkweDIwMDksIDB4MDI0ZSwgMHgyNzBlLCAweDg3MzgsIDB4ODEwOCwgMHg5MTg2LCAweDAyNjAsIDB4MTEyOCwKKwkweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwMDksIDB4MDI0MCwgMHgxZjA0LCAweDVkZDIsIDB4NjBjMywKKwkweDAwODQsIDB4MDgwYywgMHg1ZjQwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwKKwkweDAxZTAsIDB4MjAxMSwgMHg1ZjE2LCAweDA4MGMsIDB4ODViMCwgMHg5MDg2LCAweDAwODQsIDB4MTE5OCwKKwkweDA4MGMsIDB4NjA4NywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDcsIDB4MTE1OCwKKwkweDc4MzQsIDB4OTAwNSwgMHgxMTQwLCAweDcwOTcsIDB4MDAwMSwgMHgwODBjLCAweDVmZGQsIDB4NzA5YiwKKwkweDAwMWEsIDB4MDAyOSwgMHgwMDEwLCAweDcwOTMsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDgwYywgMHg2MGIyLCAweDcwOWIsIDB4MDAxYiwgMHgwODBjLCAweGFiZmUsIDB4MDgwYywKKwkweDYwODcsIDB4MjAxMSwgMHgwMjYwLCAweDIwMDksIDB4MDI0MCwgMHg3NDkwLCAweDk0ODAsIDB4MDAxOCwKKwkweDkwODAsIDB4MDAwNywgMHg5MDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LCAweDIyMGUsIDB4ODIxMCwKKwkweDgxMDgsIDB4OTE4NiwgMHgwMjYwLCAweDExNTAsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAwOSwKKwkweDAyNDAsIDB4NjgxNCwgMHg4MDAwLCAweDY4MTYsIDB4MjAxMSwgMHgwMjYwLCAweDFmMDQsIDB4NWUxZSwKKwkweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDVmNDAsIDB4MDAwNSwgMHgwMDA1LCAweDAwODYsIDB4MDA5NiwKKwkweDIwMjksIDB4MTg0OCwgMHgyNTJjLCAweDIwYTksIDB4MDAwOCwgMHgyMDQxLCAweDFjMGUsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjhhMCwgMHgwODBjLCAweDYwODcsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwKKwkweDQwMDMsIDB4MjBhOSwgMHgwMDA4LCAweDIwMTEsIDB4MDAwNywgMHhkNWQ0LCAweDAxMDgsIDB4OTAxNiwKKwkweDI4MDAsIDB4OTIwMCwgMHgyMDBjLCAweDkxYTYsIDB4ZmZmZiwgMHgxMTQ4LCAweGQ1ZDQsIDB4MDExMCwKKwkweDgyMTAsIDB4MDAwOCwgMHg4MjExLCAweDFmMDQsIDB4NWU1MCwgMHgwODA0LCAweDVlYmYsIDB4ODJmZiwKKwkweDExNjAsIDB4ZDVkNCwgMHgwMTIwLCAweDkxYTYsIDB4M2ZmZiwgMHgwZDkwLCAweDAwMjAsIDB4OTFhNiwKKwkweDNmZmYsIDB4MDkwNCwgMHg1ZWJmLCAweDkxOGQsIDB4YzAwMCwgMHgyMGE5LCAweDAwMTAsIDB4MjAxOSwKKwkweDAwMDEsIDB4ZDVkNCwgMHgwMTEwLCAweDIwMTksIDB4MDAxMCwgMHgyMTIwLCAweGQ1ZDQsIDB4MDExMCwKKwkweDg0MjMsIDB4MDAwOCwgMHg4NDI0LCAweDEyNDAsIDB4ZDVkNCwgMHgwMTEwLCAweDgzMTksIDB4MDAwOCwKKwkweDgzMTgsIDB4MWYwNCwgMHg1ZTc2LCAweDA0ZDgsIDB4MjNhOCwgMHgyMDIxLCAweDAwMDEsIDB4ODQyNiwKKwkweDg0MjUsIDB4MWYwNCwgMHg1ZTg4LCAweDIzMjgsIDB4ODUyOSwgMHg5MmJlLCAweDAwMDcsIDB4MDE1OCwKKwkweDAwMDYsIDB4MjAzOSwgMHgwMDA3LCAweDIyMDAsIDB4OTczYSwgMHgwMDBlLCAweDI3YTgsIDB4OTVhOCwKKwkweDAwMTAsIDB4MWYwNCwgMHg1ZTk3LCAweDc1NWUsIDB4OTVjOCwgMHgzMzg0LCAweDI5MmQsIDB4OTVhYywKKwkweDAwZmYsIDB4NzU4MiwgMHg2NTMyLCAweDY1MzYsIDB4MDAxNiwgMHgyNTA4LCAweDA4MGMsIDB4MjhjNSwKKwkweDAwMWUsIDB4NjBlNywgMHgwMDAwLCAweDY1ZWEsIDB4MjAxOCwgMHgyMzA0LCAweDk0MDUsIDB4MjAxYSwKKwkweDcwODcsIDB4MDAwMSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDIwZTEsIDB4MDAwMSwKKwkweDI4OTgsIDB4MjBhOSwgMHgwMDA4LCAweDQwMDMsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwKKwkweDAwOWUsIDB4MDA4ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwKKwkweDIyYTgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjAxMSwKKwkweDAyNGUsIDB4MjJhMCwgMHg0MDAzLCAweDAxNGUsIDB4MDEzZSwgMHgwMWRlLCAweDAxY2UsIDB4MDE1ZSwKKwkweDIxMTgsIDB4OTAyNiwgMHgyMDAxLCAweDAwMDcsIDB4OTM5YSwgMHgwMDEwLCAweDAyMTgsIDB4ODQyMCwKKwkweDgwMDEsIDB4MGNkMCwgMHgyMTE4LCAweDg0ZmYsIDB4MDEyMCwgMHg5MzlhLCAweDAwMTAsIDB4ODQyMSwKKwkweDFkZTAsIDB4MjAyMSwgMHgwMDAxLCAweDgzZmYsIDB4MDExOCwgMHg4NDIzLCAweDgzMTksIDB4MWRlOCwKKwkweDkyMzgsIDB4MjAyOSwgMHgwMjZlLCAweDk1MjgsIDB4MjUwNCwgMHg5NDJjLCAweDExYjgsIDB4OTQwNSwKKwkweDIwM2EsIDB4NzE1ZSwgMHg5MWEwLCAweDMzODQsIDB4MjQyZCwgMHg5NWFjLCAweDAwZmYsIDB4NzU4MiwKKwkweDY1MzIsIDB4NjUzNiwgMHgwMDE2LCAweDI1MDgsIDB4MDgwYywgMHgyOGM1LCAweDAwMWUsIDB4NjBlNywKKwkweDAwMDAsIDB4NjVlYSwgMHg3MDg3LCAweDAwMDEsIDB4OTA4NCwgMHgwMDAwLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MDhiLCAweDAwMDAsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBmNiwKKwkweDIwNzksIDB4MDEwMCwgMHgyMDcxLCAweDAxNDAsIDB4MDgwYywgMHg1ZmNjLCAweDA4MGMsIDB4YTM1NiwKKwkweDcwMDQsIDB4OTA4NCwgMHg0MDAwLCAweDAxMTAsIDB4MDgwYywgMHgyZDVlLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxODI2LCAweDIwNzMsIDB4MDAwMCwgMHg3ODQwLCAweDAwMjYsIDB4MDAxNiwKKwkweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDYwMjksIDB4MDAxZSwgMHg5MDk0LCAweDAwMTAsIDB4OTI4NSwKKwkweDAwODAsIDB4Nzg0MiwgMHg3YTQyLCAweDAwMmUsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MmJlMywgMHgwMjI4LCAweDIwMTEsIDB4MDEwMSwKKwkweDIyMDQsIDB4YzBjNSwgMHgyMDEyLCAweDIwMTEsIDB4MTlmMCwgMHgyMDEzLCAweDAwMDAsIDB4NzA5MywKKwkweDAwMDAsIDB4MDEyZSwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4YTM0ZCwKKwkweDYxNDQsIDB4ZDE4NCwgMHgwMTIwLCAweDcxOTgsIDB4OTE4ZCwgMHgyMDAwLCAweDAwMTgsIDB4NzE4YywKKwkweDkxOGQsIDB4MTAwMCwgMHgyMDExLCAweDE5OTgsIDB4MjExMiwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwKKwkweDVmMTYsIDB4MDgwYywgMHg4NjQ4LCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwYzYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFlYjQsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NjAyOSwKKwkweDIwNjEsIDB4MTlmOSwgMHg5MDBlLCAweDYxMWEsIDB4NjExZSwgMHg2MTcyLCAweDYxNzYsIDB4MjA2MSwKKwkweDE4MDAsIDB4NjAwMywgMHgwMDAxLCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywKKwkweDAwMTAsIDB4MjAwOSwgMHgxOTk4LCAweDIwMGIsIDB4MDAwMCwgMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwKKwkweDVmOTgsIDB4MDgwYywgMHg4NWE0LCAweDAxMmUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwNDcxLCAweDIwNzEsIDB4MDEwMCwKKwkweDA4MGMsIDB4YTM1NiwgMHgyMDcxLCAweDAxNDAsIDB4NzAwNCwgMHg5MDg0LCAweDQwMDAsIDB4MDExMCwKKwkweDA4MGMsIDB4MmQ1ZSwgMHgwODBjLCAweDc0NDYsIDB4MDE4OCwgMHgwODBjLCAweDc0NjEsIDB4MTE3MCwKKwkweDA4MGMsIDB4NzcyZSwgMHgwMDE2LCAweDA4MGMsIDB4Mjk5NCwgMHgyMDAxLCAweDE5NmMsIDB4MjEwMiwKKwkweDAwMWUsIDB4MDgwYywgMHg3NzI5LCAweDA4MGMsIDB4NzM2YSwgMHgwMDUwLCAweDIwMDksIDB4MDAwMSwKKwkweDA4MGMsIDB4MmM3YywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyODI4LCAweDA4MGMsIDB4NWY2YywKKwkweDAxMmUsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBiYywKKwkweDAxNTgsIDB4MDAyNiwgMHgwMDM2LCAweDIwMTEsIDB4ODAxNywgMHgyMDAxLCAweDE5OTgsIDB4MjAxYywKKwkweDA4MGMsIDB4NGI3ZiwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgyMGE5LCAweDAwMTIsIDB4MjBlOSwKKwkweDAwMDEsIDB4MjBhMSwgMHgxYzgwLCAweDA4MGMsIDB4NjA4NywgMHgyMGU5LCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNmUsIDB4MDA5OSwgMHgyMGE5LCAweDAwMjAsIDB4MDgwYywgMHg2MDgxLCAweDIwOTksIDB4MDI2MCwKKwkweDIwYTEsIDB4MWM5MiwgMHgwMDUxLCAweDIwYTksIDB4MDAwZSwgMHgwODBjLCAweDYwODQsIDB4MjA5OSwKKwkweDAyNjAsIDB4MjBhMSwgMHgxY2IyLCAweDAwMDksIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MzQxMCwKKwkweDMzMDgsIDB4MjEwNCwgMHg4MDA3LCAweDIwMTIsIDB4ODEwOCwgMHg4MjEwLCAweDFmMDQsIDB4NjAwMSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDA4MGMsIDB4YWJmZSwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwKKwkweDFjMDAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMGMsIDB4NDAwMywKKwkweDAwMDUsIDB4MDgwYywgMHhhYmZlLCAweDA4MGMsIDB4NjA4NywgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNjAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMGMsIDB4NDAwMywKKwkweDAwMDUsIDB4MDBjNiwgMHgwMDA2LCAweDIwNjEsIDB4MDEwMCwgMHg4MTBmLCAweDIwMDEsIDB4MTgzNCwKKwkweDIwMDQsIDB4OTAwNSwgMHgxMTM4LCAweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweDkxMDUsIDB4MDAxMCwgMHg5MTg1LCAweDAwZjcsIDB4NjA0YSwgMHgwMDBlLCAweDAwY2UsIDB4MDAwNSwKKwkweDAwMTYsIDB4MDA0NiwgMHgwODBjLCAweDZhMDgsIDB4MDE1OCwgMHg5MDA2LCAweDIwMjAsIDB4MjAwOSwKKwkweDAwMmEsIDB4MDgwYywgMHhlNzNhLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxOTUsIDB4MjEwMiwKKwkweDIwMTksIDB4MDAyYSwgMHg5MDBlLCAweDA4MGMsIDB4MzFlOSwgMHgwODBjLCAweGQzODgsIDB4MDE0MCwKKwkweDAwMzYsIDB4MjAxOSwgMHhmZmZmLCAweDIwMjEsIDB4MDAwNywgMHgwODBjLCAweDRkMzYsIDB4MDAzZSwKKwkweDAwNGUsIDB4MDAxZSwgMHgwMDA1LCAweDA4MGMsIDB4NWY2YywgMHg3MDliLCAweDAwMDAsIDB4NzA5MywKKwkweDAwMDAsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwOWMsIDB4MDEwMCwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwKKwkweDAxMDEsIDB4MjAwYywgMHg5MThkLCAweDAwMDYsIDB4MjEwMiwgMHgwMTJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MjAwOSwgMHgwMDAxLCAweDAwMjAsIDB4MjAwOSwgMHgwMDAyLCAweDAwMDgsIDB4OTAwZSwKKwkweDY4MTQsIDB4OTA4NCwgMHhmZmMwLCAweDkxMGQsIDB4NjkxNiwgMHgwMDA1LCAweDAwZjYsIDB4MDE1NiwKKwkweDAxNDYsIDB4MDFkNiwgMHg5MDA2LCAweDIwYTksIDB4MDA4MCwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwKKwkweDFjMDAsIDB4NDAwNCwgMHgyMDc5LCAweDFjMDAsIDB4NzgwMywgMHgyMjAwLCAweDc4MDcsIDB4MDBlZiwKKwkweDc4MGYsIDB4MDBlZiwgMHg3ODEzLCAweDAxMzgsIDB4NzgyMywgMHhmZmZmLCAweDc4MjcsIDB4ZmZmZiwKKwkweDAxZGUsIDB4MDE0ZSwgMHgwMTVlLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywKKwkweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDE5YTUsIDB4MDExOCwgMHgyMDAzLCAweDAwMDEsIDB4MDAxMCwKKwkweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAxNTYsIDB4MjBhOSwgMHgwODAwLCAweDIwMDksIDB4MTAwMCwKKwkweDkwMDYsIDB4MjAwYSwgMHg4MTA4LCAweDFmMDQsIDB4NjBjMSwgMHgwMTVlLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwMzYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MjA2OSwgMHgxODQ3LCAweDkwMDYsIDB4YjgwMiwKKwkweGI4Y2UsIDB4YjgwNywgMHgwNzA3LCAweGI4MGEsIDB4YjgwZSwgMHhiODEyLCAweDkxOTgsIDB4MzM4NCwKKwkweDIzMWQsIDB4OTM5YywgMHgwMGZmLCAweGJiMTYsIDB4MDAxNiwgMHgwMDI2LCAweGI4YzIsIDB4MDgwYywKKwkweGFlYWQsIDB4MTEyMCwgMHg5MTkyLCAweDAwN2UsIDB4MTIwOCwgMHhiYmMyLCAweDIwYTksIDB4MDAwNCwKKwkweGI4YzQsIDB4MjBlOCwgMHhiOWM4LCAweDkxOTgsIDB4MDAwNiwgMHg5MDA2LCAweDIzYTAsIDB4NDAwNCwKKwkweDIwYTksIDB4MDAwNCwgMHg5MTk4LCAweDAwMGEsIDB4MjNhMCwgMHg0MDA0LCAweDAwMmUsIDB4MDAxZSwKKwkweGI4M2UsIDB4Yjg0MiwgMHhiODRlLCAweGI4NTIsIDB4Yjg1NiwgMHhiODVhLCAweGI4NWUsIDB4Yjg2MiwKKwkweGI4NjYsIDB4Yjg2YSwgMHhiODZmLCAweDAxMDAsIDB4Yjg3MiwgMHhiODc2LCAweGI4N2EsIDB4Yjg4YSwKKwkweGI4OGUsIDB4Yjg5MywgMHgwMDA4LCAweGI4OTYsIDB4Yjg5YSwgMHhiODllLCAweGI4YmUsIDB4YjlhMiwKKwkweDAwOTYsIDB4YjhhNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywgMHgxMDMxLCAweGI4YTcsIDB4MDAwMCwKKwkweDAwOWUsIDB4OTAwNiwgMHhiODRhLCAweDY4MTAsIDB4YjgzYSwgMHg2ODBjLCAweGI4NDYsIDB4YjhiYiwKKwkweDA1MjAsIDB4YjhhYywgMHg5MDA1LCAweDAxOTgsIDB4MDBjNiwgMHgyMDYwLCAweDljODIsIDB4MWNkMCwKKwkweDBhMGMsIDB4MGRkNSwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDFhMGMsIDB4MGRkNSwKKwkweDA4MGMsIDB4OGEzZCwgMHgwMGNlLCAweDA5MGMsIDB4OGRkYSwgMHhiOGFmLCAweDAwMDAsIDB4NjgxNCwKKwkweDkwODQsIDB4MDBmZiwgMHhiODQyLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwM2UsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTk3NCwgMHhhZTc4LCAweDk2ODQsIDB4M2ZmZiwKKwkweDkwODIsIDB4NDAwMCwgMHgxYTA0LCAweDYxYWYsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjFiMywKKwkweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweDkwODQsIDB4MDAwMywgMHgxOTA0LCAweDYxYjksIDB4OTE4OCwKKwkweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDA1MTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4ZSwKKwkweDAwMDYsIDB4MTUwOCwgMHhiOGE0LCAweDkwMGQsIDB4MTkwNCwgMHg2MWNiLCAweGI4NTAsIDB4OTAwZCwKKwkweDExNDgsIDB4YTgwMiwgMHgyOTAwLCAweGI4NTIsIDB4Yjg0ZSwgMHgwODBjLCAweDkxY2UsIDB4OTAwNiwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGE2LCAweDIxNTAsIDB4MjkwMCwgMHhiMDAyLCAweGE4MDMsIDB4MDAwMCwKKwkweDAwYWUsIDB4Yjg1MiwgMHgwYzkwLCAweDIwMDEsIDB4MDAwNSwgMHg5MDBlLCAweDA0YjgsIDB4MjAwMSwKKwkweDAwMjgsIDB4OTAwZSwgMHgwNDk4LCAweDkwODIsIDB4MDAwNiwgMHgxMjkwLCAweDA4MGMsIDB4YWVhZCwKKwkweDExNjAsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTE0MCwgMHhiOTAwLCAweGQxZmMsIDB4MDk5MCwKKwkweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDQwOCwgMHgyMDAxLCAweDAwMjgsIDB4MDBhOCwKKwkweDIwMDksIDB4MTgwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA2OCwKKwkweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA0MCwgMHgyMDAxLCAweDAwMjksIDB4YjkwMCwKKwkweGQxZmMsIDB4MDExOCwgMHgyMDA5LCAweDEwMDAsIDB4MDA0OCwgMHg5MDBlLCAweDAwMzgsIDB4MjAwMSwKKwkweDAwMjksIDB4OTAwZSwgMHgwMDE4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDkwMDUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDA4NCwgMHgxOWQwLCAweDkxODgsIDB4MTAwMCwKKwkweDIxMDQsIDB4OTA1ZCwgMHgwOWE4LCAweDA4MGMsIDB4NmEwYywgMHgxOTkwLCAweGI4MDAsIDB4ZDBiYywKKwkweDA5NzgsIDB4MDgwNCwgMHg2MTYyLCAweDA4MGMsIDB4NjgzNSwgMHgwOTA0LCAweDYxN2IsIDB4MDgwNCwKKwkweDYxNjYsIDB4MDBiNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4NzQsIDB4OTA4ZSwKKwkweDAwZmYsIDB4MTEyMCwgMHgyMDAxLCAweDE5NmEsIDB4MjA1YywgMHgwMDYwLCAweGE5NzQsIDB4OTE4MiwKKwkweDA4MDAsIDB4MTY5MCwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDAxZDAsIDB4MDgwYywKKwkweDY5YWMsIDB4MTFkMCwgMHgwODBjLCAweGFlZWQsIDB4MDU3MCwgMHgyYjAwLCAweDYwMTIsIDB4MjkwMCwKKwkweDYwMTYsIDB4NjAyMywgMHgwMDA5LCAweDYwMGIsIDB4MDAwMCwgMHhhODc0LCAweDkwOGUsIDB4MDBmZiwKKwkweDExMTAsIDB4NjAwYiwgMHg4MDAwLCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGFmYmUsIDB4OTAwNiwKKwkweDAwYjAsIDB4MjAwMSwgMHgwMDI4LCAweDAwOTAsIDB4MjAwOSwgMHgxODBjLCAweDIxMGMsIDB4ZDE4YywKKwkweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwKKwkweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDkwMDUsIDB4MDEyZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MDAyYywgMHgwY2MwLCAweDAwYjYsIDB4MDBlNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE5NzQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjI5YywKKwkweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MDkwNCwgMHg2Mjc0LCAweGI4YTAsIDB4OTA4NiwKKwkweDAwN2YsIDB4MDE5MCwgMHhhODdjLCAweGQwZmMsIDB4MTE3OCwgMHgwODBjLCAweDZhMTQsIDB4MDE2MCwKKwkweGE5OTQsIDB4ODFmZiwgMHgwMTMwLCAweDkwOGUsIDB4MDAwNCwgMHgwMTMwLCAweDkwOGUsIDB4MDAwNSwKKwkweDAxMTgsIDB4MDgwYywgMHg2YTBjLCAweDE1OTgsIDB4YTg3YywgMHhkMGZjLCAweDAxZTAsIDB4YTg5NCwKKwkweDkwMDUsIDB4MDFjOCwgMHgyMDYwLCAweDAwMjYsIDB4MjAxMCwgMHgwODBjLCAweGNjNzQsIDB4MDAyZSwKKwkweDExMjAsIDB4MjAwMSwgMHgwMDA4LCAweDA4MDQsIDB4NjI5ZSwgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwKKwkweDAxMjAsIDB4MjAwMSwgMHgwMDA4LCAweDA4MDQsIDB4NjI5ZSwgMHg2MDFhLCAweDYwMDMsIDB4MDAwOCwKKwkweDI5MDAsIDB4NjAxNiwgMHgwMDU4LCAweDA4MGMsIDB4YWVlZCwgMHgwNWU4LCAweDJiMDAsIDB4NjAxMiwKKwkweDI5MDAsIDB4NjAxNiwgMHg2MDBiLCAweGZmZmYsIDB4NjAyMywgMHgwMDBhLCAweDIwMDksIDB4MDAwMywKKwkweDA4MGMsIDB4YWZiZSwgMHg5MDA2LCAweDA0NTgsIDB4MjAwMSwgMHgwMDI4LCAweDA0MzgsIDB4OTA4MiwKKwkweDAwMDYsIDB4MTI5MCwgMHgwODBjLCAweGFlYWQsIDB4MTE2MCwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwKKwkweDExNDAsIDB4YjkwMCwgMHhkMWZjLCAweDA5MDAsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwKKwkweDAwYTgsIDB4MjAwMSwgMHgwMDI4LCAweDAwOTAsIDB4MjAwOSwgMHgxODBjLCAweDIxMGMsIDB4ZDE4YywKKwkweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwNTAsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwKKwkweDAwMjgsIDB4MjAwMSwgMHgwMDI5LCAweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDkwMDUsIDB4MDEyZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MDAyYywgMHgwY2MwLCAweDAwZjYsIDB4MDBiNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4ZTAsIDB4OTAwNSwgMHgxNTUwLCAweGE4ZGMsIDB4OTA4MiwKKwkweDAxMDEsIDB4MTYzMCwgMHhhOGM4LCAweDkwMDUsIDB4MTUxOCwgMHhhOGM0LCAweDkwODIsIDB4MDEwMSwKKwkweDEyZjgsIDB4YTk3NCwgMHgyMDc5LCAweDE4MDAsIDB4OTE4MiwgMHgwODAwLCAweDEyZTgsIDB4NzgzMCwKKwkweDkwODQsIDB4MDAwMywgMHgxMTMwLCAweGFhOTgsIDB4YWI5NCwgMHhhODc4LCAweDkwODQsIDB4MDAwNywKKwkweDAwZWEsIDB4NzkzMCwgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDE4NCwKKwkweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDAzOCwKKwkweDIwMDEsIDB4MDAyYywgMHg5MDBlLCAweDAwMTgsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4OTAwNiwKKwkweDAwMDgsIDB4OTAwNSwgMHgwMTJlLCAweDAwYmUsIDB4MDBmZSwgMHgwMDA1LCAweDYzMzMsIDB4NjJlZSwKKwkweDYzMDUsIDB4NjMzMywgMHg2MzMzLCAweDYzMzMsIDB4NjMzMywgMHg2MzMzLCAweDIxMDAsIDB4OTA4MiwKKwkweDAwN2UsIDB4MTI3OCwgMHgwODBjLCAweDY2MzgsIDB4MDE0OCwgMHg5MDQ2LCAweGI4MTAsIDB4OTMwNiwKKwkweDE5MDQsIDB4NjMzYiwgMHhiODE0LCAweDkyMDYsIDB4MTVmMCwgMHgwMDI4LCAweGJiMTIsIDB4YmExNiwKKwkweDAwMTAsIDB4MDgwYywgMHg0YTMyLCAweDAxNTAsIDB4MDRiMCwgMHgwODBjLCAweDY2OTksIDB4MTU5OCwKKwkweGI4MTAsIDB4OTMwNiwgMHgxNTgwLCAweGI4MTQsIDB4OTIwNiwgMHgxNTY4LCAweDA4MGMsIDB4YWVlZCwKKwkweDA1MzAsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4ZDEwMiwgMHgyOTAwLCAweDYwMTYsIDB4NjAwYiwKKwkweGZmZmYsIDB4NjAyMywgMHgwMDBhLCAweGE4NzgsIDB4OTA4NiwgMHgwMDAxLCAweDExNzAsIDB4MDgwYywKKwkweDMyMWUsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwKKwkweDIwMDEsIDB4MDIwMCwgMHhiODZlLCAweGI4OTMsIDB4MDAwMiwgMHgyMDA5LCAweDAwMDMsIDB4MDgwYywKKwkweGFmYmUsIDB4OTAwNiwgMHgwMDY4LCAweDIwMDEsIDB4MDAwMSwgMHg5MDBlLCAweDAwMzgsIDB4MjAwMSwKKwkweDAwMmMsIDB4OTAwZSwgMHgwMDE4LCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLCAweDkwMDUsIDB4MDAwMCwKKwkweDAxMmUsIDB4MDBiZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDAwZTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHhhODk0LCAweDkwYzYsIDB4MDAxNSwgMHgwOTA0LCAweDY1MjYsIDB4OTBjNiwKKwkweDAwNTYsIDB4MDkwNCwgMHg2NTJhLCAweDkwYzYsIDB4MDA2NiwgMHgwOTA0LCAweDY1MmUsIDB4OTBjNiwKKwkweDAwNjcsIDB4MDkwNCwgMHg2NTMyLCAweDkwYzYsIDB4MDA2OCwgMHgwOTA0LCAweDY1MzYsIDB4OTBjNiwKKwkweDAwNzEsIDB4MDkwNCwgMHg2NTNhLCAweDkwYzYsIDB4MDA3NCwgMHgwOTA0LCAweDY1M2UsIDB4OTBjNiwKKwkweDAwN2MsIDB4MDkwNCwgMHg2NTQyLCAweDkwYzYsIDB4MDA3ZSwgMHgwOTA0LCAweDY1NDYsIDB4OTBjNiwKKwkweDAwMzcsIDB4MDkwNCwgMHg2NTRhLCAweDkwMTYsIDB4MjA3OSwgMHgxODAwLCAweGE5NzQsIDB4OTE4NiwKKwkweDAwZmYsIDB4MDkwNCwgMHg2NTIxLCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDY1MjEsIDB4MDgwYywKKwkweDY2OTksIDB4MTE5OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDgyLCAweDAwMDYsIDB4MTI2OCwKKwkweGE4OTQsIDB4OTBjNiwgMHgwMDZmLCAweDAxNDgsIDB4MDgwYywgMHhhZWFkLCAweDE5MDQsIDB4NjUwYSwKKwkweGI4YTAsIDB4OTA4NCwgMHhmZjgwLCAweDE5MDQsIDB4NjUwYSwgMHhhODk0LCAweDkwYzYsIDB4MDA2ZiwKKwkweDAxNTgsIDB4OTBjNiwgMHgwMDVlLCAweDA5MDQsIDB4NjQ2YSwgMHg5MGM2LCAweDAwNjQsIDB4MDkwNCwKKwkweDY0OTMsIDB4MjAwOCwgMHgwODA0LCAweDY0MmMsIDB4YTk5OCwgMHhhOGIwLCAweDIwNDAsIDB4MDgwYywKKwkweGFlYWQsIDB4MTEyMCwgMHg5MTgyLCAweDAwN2YsIDB4MGEwNCwgMHg2NDJjLCAweDkxODYsIDB4MDBmZiwKKwkweDA5MDQsIDB4NjQyYywgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHg2NDJjLCAweGFhYTAsIDB4YWI5YywKKwkweDc4N2MsIDB4OTMwNiwgMHgxMWE4LCAweDc4ODAsIDB4MDA5NiwgMHg5MjRlLCAweDExMjgsIDB4MjIwOCwKKwkweDIzMTAsIDB4MDA5ZSwgMHgwODA0LCAweDY0MmMsIDB4MDgwYywgMHhhZWFkLCAweDExNDAsIDB4OTljYywKKwkweGZmMDAsIDB4MDA5ZSwgMHgxMTI4LCAweDIyMDgsIDB4MjMxMCwgMHgwODA0LCAweDY0MmMsIDB4MDA5ZSwKKwkweDA4MGMsIDB4NGEzMiwgMHgwOTA0LCAweDY0MzYsIDB4OTAwZSwgMHg5MDE2LCAweDkwYzYsIDB4NDAwMCwKKwkweDE1ZTAsIDB4MDAwNiwgMHgwODBjLCAweDY4YjksIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywKKwkweDAxMDgsIDB4YzE4ZCwgMHgyMGE5LCAweDAwMDQsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMzEsIDB4MjBhMCwgMHhiOGM0LCAweDIwZTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwKKwkweDA4MGMsIDB4MGY3YywgMHgyMGE5LCAweDAwMDQsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMzUsIDB4MjBhMCwgMHhiOGM0LCAweDIwZTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMGEsIDB4MjA5OCwKKwkweDA4MGMsIDB4MGY3YywgMHhhOGM0LCAweGFiYzgsIDB4OTMwNSwgMHhhYmNjLCAweDkzMDUsIDB4YWJkMCwKKwkweDkzMDUsIDB4YWJkNCwgMHg5MzA1LCAweGFiZDgsIDB4OTMwNSwgMHhhYmRjLCAweDkzMDUsIDB4YWJlMCwKKwkweDkzMDUsIDB4OTAwNSwgMHgwNTEwLCAweDAwMGUsIDB4MDBjOCwgMHg5MGM2LCAweDQwMDcsIDB4MTExMCwKKwkweDI0MDgsIDB4MDBhMCwgMHg5MGM2LCAweDQwMDgsIDB4MTExOCwgMHgyNzA4LCAweDI2MTAsIDB4MDA3MCwKKwkweDkwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwNTAsIDB4OTBjNiwgMHg0MDA2LCAweDAxMzgsIDB4MjAwMSwKKwkweDQwMDUsIDB4MjAwOSwgMHgwMDBhLCAweDAwMTAsIDB4MjAwMSwgMHg0MDA2LCAweGE4OTYsIDB4YTk5YSwKKwkweGFhOWUsIDB4MjAwMSwgMHgwMDMwLCAweDkwMGUsIDB4MDQ3OCwgMHgwMDBlLCAweDA4MGMsIDB4YWVlZCwKKwkweDExMzAsIDB4MjAwMSwgMHg0MDA1LCAweDIwMDksIDB4MDAwMywgMHg5MDE2LCAweDBjNzgsIDB4MmIwMCwKKwkweDYwMTIsIDB4MDgwYywgMHhkMTAyLCAweDI5MDAsIDB4NjAxNiwgMHg2MDIzLCAweDAwMDEsIDB4YTg2OCwKKwkweGQ4OGMsIDB4MDEwOCwgMHhjMGY1LCAweGE4NmEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDMyMWUsIDB4MDEyZSwgMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywKKwkweDY1ZTksIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4YWZiZSwgMHhhOGIwLCAweGQwOTQsIDB4MDExOCwKKwkweGI4Y2MsIDB4YzA4ZCwgMHhiOGNlLCAweDkwMDYsIDB4OTAwNSwgMHgwMTJlLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwODBjLCAweDU3NzEsIDB4MDExOCwgMHgyMDA5LCAweDAwMDcsIDB4MDBmOCwKKwkweGE5OTgsIDB4YWViMCwgMHgwODBjLCAweDY2OTksIDB4MTkwNCwgMHg2NDI3LCAweDkxODYsIDB4MDA3ZiwKKwkweDAxMzAsIDB4MDgwYywgMHg2YTBjLCAweDAxMTgsIDB4MjAwOSwgMHgwMDA5LCAweDAwODAsIDB4MDA5NiwKKwkweDA4MGMsIDB4MGZmZiwgMHgxMTIwLCAweDAwOWUsIDB4MjAwOSwgMHgwMDAyLCAweDAwNDAsIDB4MjkwMCwKKwkweDAwOWUsIDB4YTgwNiwgMHgwODBjLCAweGNlNmUsIDB4MTliMCwgMHgyMDA5LCAweDAwMDMsIDB4MjAwMSwKKwkweDQwMDUsIDB4MDgwNCwgMHg2NDJlLCAweGE5OTgsIDB4YWViMCwgMHgwODBjLCAweDY2OTksIDB4MTkwNCwKKwkweDY0MjcsIDB4MDA5NiwgMHgwODBjLCAweDBmZmYsIDB4MTEyOCwgMHgwMDllLCAweDIwMDksIDB4MDAwMiwKKwkweDA4MDQsIDB4NjRlNywgMHgyOTAwLCAweDAwOWUsIDB4YTgwNiwgMHgwMDk2LCAweDIwNDgsIDB4MjBhOSwKKwkweDAwMmIsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4MjA5OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAwMiwgMHgyMGEwLCAweDQwMDMsIDB4MjBhOSwgMHgwMDA4LCAweDkwODAsIDB4MDAwNiwKKwkweDIwYTAsIDB4YmJjOCwgMHg5Mzk4LCAweDAwMDYsIDB4MjM5OCwgMHgwODBjLCAweDBmN2MsIDB4MDA5ZSwKKwkweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweGQ2ODQsIDB4MTE2OCwKKwkweDA4MGMsIDB4NTc1ZCwgMHhkMGI0LCAweDExMTgsIDB4YTg5YiwgMHgwMDBiLCAweDAwZTAsIDB4YjgwMCwKKwkweGQwOGMsIDB4MDExOCwgMHhhODliLCAweDAwMGMsIDB4MDBiMCwgMHgwODBjLCAweDZhMGMsIDB4MDExOCwKKwkweGE4OWIsIDB4MDAwOSwgMHgwMDgwLCAweDA4MGMsIDB4NTc3MSwgMHgwMTE4LCAweGE4OWIsIDB4MDAwNywKKwkweDAwNTAsIDB4MDgwYywgMHhjZTUxLCAweDE5MDQsIDB4NjQ2MywgMHgyMDA5LCAweDAwMDMsIDB4MjAwMSwKKwkweDQwMDUsIDB4MDgwNCwgMHg2NDJlLCAweGE4N2IsIDB4MDAzMCwgMHhhODk3LCAweDQwMDUsIDB4YTgwNCwKKwkweDgwMDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMDIsIDB4MjAwOSwgMHgwMDJiLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsIDB4MjAzMSwKKwkweDAwMDAsIDB4MjA0MSwgMHgxMjQzLCAweDA4MGMsIDB4YjQ1ZCwgMHgxOTA0LCAweDY0NjMsIDB4MjAwOSwKKwkweDAwMDIsIDB4MDhlOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHgwODA0LCAweDY0NjQsIDB4MjAwOSwKKwkweDE4MGMsIDB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDE4NCwKKwkweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDgwNCwKKwkweDY0NjQsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDgwNCwgMHg2NDY0LCAweDA4MGMsIDB4MzdiMywKKwkweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDU0ODgsIDB4MDgwNCwgMHg2NDY1LCAweDA4MGMsIDB4NDViMSwKKwkweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDQ2MmEsIDB4MDgwNCwgMHg2NDY1LCAweDA4MGMsIDB4NDY4NiwKKwkweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDRhZjUsIDB4MDgwNCwgMHg2NDY1LCAweDA4MGMsIDB4NGRhOSwKKwkweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDUwZjAsIDB4MDgwNCwgMHg2NDY1LCAweDA4MGMsIDB4NTJlOSwKKwkweDA4MDQsIDB4NjQ2NSwgMHgwODBjLCAweDM5YzksIDB4MDgwNCwgMHg2NDY1LCAweDAwYjYsIDB4YTk3NCwKKwkweGFlNzgsIDB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgxNjE4LCAweDkxODIsIDB4MDgwMCwKKwkweDEyNjgsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwMTQwLCAweDA4MGMsIDB4NmEwYywKKwkweDExNDgsIDB4MDBlOSwgMHgwODBjLCAweDY3YzQsIDB4OTAwNiwgMHgwMGIwLCAweDIwMDEsIDB4MDAyOCwKKwkweDkwMGUsIDB4MDA5MCwgMHg5MDgyLCAweDAwMDYsIDB4MTI0MCwgMHhiOTAwLCAweGQxZmMsIDB4MGQ4OCwKKwkweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDAzOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwKKwkweDAwMTgsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4OTAwNSwgMHgwMGJlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHhiODUwLCAweDkwMGQsIDB4MDE1MCwgMHgyOTAwLCAweDAwOTYsIDB4MjE0OCwKKwkweGE4MDIsIDB4MDA5ZSwgMHhhODAzLCAweDAwMDAsIDB4Yjg1MiwgMHgwMTJlLCAweDAwMDUsIDB4MjkwMCwKKwkweGI4NTIsIDB4Yjg0ZSwgMHhhODAzLCAweDAwMDAsIDB4MGNjMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweGI4NGMsIDB4OTAwNSwgMHgwMTcwLCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDcwMDQsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDE2OCwgMHgwMGVlLCAweGI4NGMsIDB4YTgwMiwgMHgyOTAwLCAweGI4NGUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjkwMCwgMHhiODUyLCAweGI4NGUsIDB4YTgwMywgMHgwMDAwLCAweDBjYzAsIDB4NzAxYywKKwkweDliMDYsIDB4MWQ4MCwgMHhiODRjLCAweDAwYTYsIDB4MjA1MCwgMHhiMDAwLCAweGE4MDIsIDB4MjkwMCwKKwkweGIwMDIsIDB4MDBhZSwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweGI4NGMsIDB4OTA0ZCwgMHgwMTMwLCAweGE4MDAsIDB4OTAwNSwgMHgxMTA4LCAweGI4NTIsIDB4Yjg0ZSwKKwkweDk5MDUsIDB4MDEyZSwgMHgwMDA1LCAweGI4NGMsIDB4OTA0ZCwgMHgwMTMwLCAweGE4MDAsIDB4OTAwNSwKKwkweDExMDgsIDB4Yjg1MiwgMHhiODRlLCAweDk5MDUsIDB4MDAwNSwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwKKwkweDAwMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTAsIDB4MjI1OCwgMHhiYTAwLCAweDkwMDUsIDB4MDExMCwKKwkweGMyODUsIDB4MDAwOCwgMHhjMjg0LCAweGJhMDIsIDB4MDAyZSwgMHgwMGNlLCAweDAxMmUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTAsIDB4MjI1OCwKKwkweGJhMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwMDYsIDB4MTE3MCwgMHhiODljLCAweGQwYWMsIDB4MDE1OCwKKwkweDA4MGMsIDB4NmEwOCwgMHgwMTQwLCAweDkyODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwNywKKwkweDExMTAsIDB4MjAxMSwgMHgwNjAwLCAweDAwMGUsIDB4OTI5NCwgMHhmZjAwLCAweDkyMTUsIDB4YmEwNiwKKwkweDAwMDYsIDB4OTA4NiwgMHgwMDA2LCAweDExMjAsIDB4YmE5MCwgMHg4MmZmLCAweDA5MGMsIDB4MGRkNSwKKwkweDAwMGUsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwNCwgMHgwMDA2LCAweDkwODYsIDB4MDAwNiwKKwkweDExNjgsIDB4Yjg5YywgMHhkMGE0LCAweDAxNTAsIDB4MDgwYywgMHg2YTA0LCAweDExMzgsIDB4OTI4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwMDA2LCAweDAwMGUsIDB4OTI5NCwKKwkweDAwZmYsIDB4ODAwNywgMHg5MjE1LCAweGJhMDYsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwKKwkweDkxODIsIDB4MDgwMCwgMHgwMjE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZDYsIDB4MDAyNiwKKwkweDkxOTAsIDB4MTAwMCwgMHgyMjA0LCAweDkwNWQsIDB4MTE4OCwgMHgwMDk2LCAweDA4MGMsIDB4MGZmZiwKKwkweDI5NTgsIDB4MDA5ZSwgMHgwMTY4LCAweDJiMDAsIDB4MjAxMiwgMHhiODVjLCAweGI4Y2EsIDB4Yjg2MCwKKwkweGI4YzYsIDB4OTAwNiwgMHhiOGE2LCAweGI4YWUsIDB4MDgwYywgMHg2MGM3LCAweDkwMDYsIDB4MDAxMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwOTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDI2LCAweDkxODIsIDB4MDgwMCwgMHgwMjE4LCAweDkwODUsIDB4MDAwMSwKKwkweDA0NTgsIDB4MDBkNiwgMHg5MTkwLCAweDEwMDAsIDB4MjIwNCwgMHg5MDVkLCAweDA1MTgsIDB4MjAxMywKKwkweDAwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywgMHgxMDMxLCAweDAwZDYsIDB4MDBjNiwKKwkweGI4YmMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxNjgsIDB4NjAwYywgMHgwMDA2LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMTEwLCAweDA4MGMsIDB4MGZiMSwgMHgwODBjLCAweGFmNDMsIDB4MDBjZSwKKwkweDBjODgsIDB4MDBjZSwgMHgwMGRlLCAweDJiNDgsIDB4YjhjOCwgMHhiODVlLCAweGI4YzQsIDB4Yjg2MiwKKwkweDA4MGMsIDB4MTA0MSwgMHgwMGRlLCAweDkwMDYsIDB4MDAyZSwgMHgwMTJlLCAweDAwOWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDAxNiwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAzMCwKKwkweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MGRjMCwgMHg5MDA2LCAweDAwMWUsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4OTAwNiwgMHhiODBhLCAweGI4MGUsIDB4YjgwMCwKKwkweGMwOGMsIDB4YjgwMiwgMHgwODBjLCAweDc0M2UsIDB4MTUxMCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwKKwkweDAxMjAsIDB4MDgwYywgMHhhZWFkLCAweDExZDgsIDB4MDA3OCwgMHg3MDQwLCAweGQwZTQsIDB4MDFiOCwKKwkweDAwYzYsIDB4MjA2MSwgMHgxOTgxLCAweDcwNDgsIDB4MjA2MiwgMHg3MDRjLCAweDYwMDYsIDB4NzA1MCwKKwkweDYwMGEsIDB4NzA1NCwgMHg2MDBlLCAweDAwY2UsIDB4NzAzYywgMHgyMDY5LCAweDAxNDAsIDB4OTAwNSwKKwkweDExMTAsIDB4MjAwMSwgMHgwMDAxLCAweDY4ODYsIDB4MjA2OSwgMHgxODAwLCAweDY4YjYsIDB4NzA0MCwKKwkweGI4NWUsIDB4NzA0OCwgMHhiODYyLCAweDcwNGMsIDB4Yjg2NiwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwKKwkweDAyNzYsIDB4YjhjNCwgMHgyMGU4LCAweGI4YzgsIDB4OTA4OCwgMHgwMDBhLCAweDIxYTAsIDB4MjBhOSwKKwkweDAwMDQsIDB4NDAwMywgMHgyMDk5LCAweDAyN2EsIDB4OTA4OCwgMHgwMDA2LCAweDIxYTAsIDB4MjBhOSwKKwkweDAwMDQsIDB4NDAwMywgMHgyMDY5LCAweDAyMDAsIDB4NjgxNywgMHgwMDAxLCAweDcwNDAsIDB4Yjg2YSwKKwkweDcxNDQsIDB4Yjk2ZSwgMHg3MDQ4LCAweGI4NzIsIDB4NzA1MCwgMHhiODc2LCAweDIwNjksIDB4MDIwMCwKKwkweDY4MTcsIDB4MDAwMCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxMTEwLCAweDcxNDQsIDB4Yjk2ZSwKKwkweDkxODIsIDB4MDIxMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwOCwgMHgwNDAwLCAweDkxODIsIDB4MDI1OSwKKwkweDEyMTgsIDB4MjAwOSwgMHgwMDA3LCAweDAwZDAsIDB4OTE4MiwgMHgwMmMxLCAweDEyMTgsIDB4MjAwOSwKKwkweDAwMDYsIDB4MDBhMCwgMHg5MTgyLCAweDAzNDksIDB4MTIxOCwgMHgyMDA5LCAweDAwMDUsIDB4MDA3MCwKKwkweDkxODIsIDB4MDQyMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLCAweDkxODIsIDB4MDU4MSwKKwkweDEyMTgsIDB4MjAwOSwgMHgwMDAzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAyLCAweGI5OTIsIDB4MDE0ZSwKKwkweDAxM2UsIDB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwKKwkweDAyNjAsIDB4NzAzNCwgMHhiODk2LCAweDcwM2MsIDB4Yjg5YSwgMHg3MDU0LCAweGI4OWUsIDB4MDAzNiwKKwkweGJiY2MsIDB4YzM4NCwgMHhiYTAwLCAweDIwMDksIDB4MTg2NywgMHgyMTBjLCAweGQwYmMsIDB4MDEyMCwKKwkweGQxZWMsIDB4MDExMCwgMHhjMmFkLCAweDAwMDgsIDB4YzJhYywgMHhkMGM0LCAweDAxNDgsIDB4ZDFlNCwKKwkweDAxMzgsIDB4YzJiZCwgMHhkMGNjLCAweDAxMjgsIDB4ZDM4YywgMHgxMTA4LCAweGMzODUsIDB4MDAwOCwKKwkweGMyYmMsIDB4YmEwMiwgMHhiYmNlLCAweDAwM2UsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDA1NzgsIDB4YTkwMCwKKwkweDgxZmYsIDB4MTVjMCwgMHhhYTA0LCAweDkyODIsIDB4MDAxMCwgMHgxNmM4LCAweDAxMzYsIDB4MDE0NiwKKwkweDAxYzYsIDB4MDFkNiwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MDhjLCAweDAwM2YsIDB4MjFlMCwKKwkweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDQsIDB4MjA5OCwgMHgyMDA5LCAweDAwMTAsIDB4MjBhOSwKKwkweDAwMDEsIDB4NDAwMiwgMHg5MDg2LCAweGZmZmYsIDB4MDEyMCwgMHg4MTA5LCAweDFkZDAsIDB4MDgwYywKKwkweDBkZDUsIDB4M2MwMCwgMHgyMGU4LCAweDMzMDAsIDB4ODAwMSwgMHgyMGEwLCAweDQ2MDQsIDB4ODIxMCwKKwkweGFhMDYsIDB4MDFkZSwgMHgwMWNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDYwLCAweDA4MGMsIDB4MGZmZiwKKwkweDAxNzAsIDB4MjkwMCwgMHhiOGE2LCAweGE4MDMsIDB4MDAwMCwgMHgwODBjLCAweDY4NTUsIDB4YTgwNywKKwkweDAwMDEsIDB4YWUxMiwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4OTAwNiwKKwkweDBjZDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA5NiwgMHhiOGE0LCAweDkwNGQsIDB4MDE4OCwKKwkweGE4MDAsIDB4OTAwNSwgMHgxMTUwLCAweDA4MGMsIDB4Njg2NCwgMHgxMTU4LCAweGE4MDQsIDB4OTA4YSwKKwkweDAwMDIsIDB4MDIxOCwgMHg4MDAxLCAweGE4MDYsIDB4MDAyMCwgMHgwODBjLCAweDEwMzEsIDB4YjhhNywKKwkweDAwMDAsIDB4MDA5ZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDkxY2UsIDB4MDEyZSwgMHgwMDA1LCAweDkwMWUsIDB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4OTAwZSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGI4NGMsIDB4MjA0OCwgMHhiODAwLCAweGQwZGMsIDB4MTE3MCwKKwkweDg5ZmYsIDB4MDUwMCwgMHg4M2ZmLCAweDAxMjAsIDB4YTg3OCwgMHg5NjA2LCAweDAxNTgsIDB4MDAzMCwKKwkweGE4NmMsIDB4OTQwNiwgMHgxMTE4LCAweGE4NzAsIDB4OTUwNiwgMHgwMTIwLCAweDI5MDgsIDB4YTgwMCwKKwkweDIwNDgsIDB4MGM3MCwgMHgwODBjLCAweGE3NjEsIDB4YWEwMCwgMHhiODRjLCAweDk5MDYsIDB4MTExMCwKKwkweGJhNGUsIDB4MDAyMCwgMHgwMGE2LCAweDIxNTAsIDB4YjIwMiwgMHgwMGFlLCAweDgyZmYsIDB4MTExMCwKKwkweGI5NTIsIDB4ODlmZiwgMHgwMTJlLCAweDAwMDUsIDB4OTAxNiwgMHgwNDg5LCAweDExMTAsIDB4MjAxMSwKKwkweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY4YjksIDB4MDEyOCwgMHgwODBjLCAweGNkNDMsIDB4MDAxMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NjhiOSwgMHgwMTI4LCAweDA4MGMsIDB4Y2NlOCwKKwkweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2OGI5LCAweDAxMjgsIDB4MDgwYywKKwkweGNkNDAsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY4YjksIDB4MDEyOCwKKwkweDA4MGMsIDB4Y2QwNywgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NjhiOSwKKwkweDAxMjgsIDB4MDgwYywgMHhjZDg2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4YjhhNCwKKwkweDkwMGQsIDB4MTExOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMTM2LCAweDAxYzYsIDB4YTgwMCwKKwkweDkwMDUsIDB4MTFiOCwgMHg4OTBlLCAweDgxMGUsIDB4ODEwZiwgMHg5MTg0LCAweDAwM2YsIDB4MjBlMCwKKwkweDkxODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDQsIDB4MjA5OCwgMHgyMGE5LCAweDAwMDEsIDB4MjAwOSwKKwkweDAwMTAsIDB4NDAwMiwgMHg5NjA2LCAweDAxMjgsIDB4ODEwOSwgMHgxZGQ4LCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDgsIDB4OTAwNiwgMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwgMHgwMTQ2LCAweDAxZDYsIDB4YTg2MCwKKwkweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMDQsIDB4MjBhMCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwOSwKKwkweGZmZmYsIDB4NDEwNCwgMHgwMWRlLCAweDAxNGUsIDB4MDEzNiwgMHgwMWM2LCAweGE4MDAsIDB4OTAwNSwKKwkweDExYjgsIDB4ODkwZSwgMHg4MTBlLCAweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweDIwZTAsIDB4OTE4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDA0LCAweDIwOTgsIDB4MjBhOSwgMHgwMDAxLCAweDIwMDksIDB4MDAxMCwKKwkweDQwMDIsIDB4OTYwNiwgMHgwMTI4LCAweDgxMDksIDB4MWRkOCwgMHg5MDg1LCAweDAwMDEsIDB4MDA2OCwKKwkweDAxNDYsIDB4MDFkNiwgMHgzMzAwLCAweDgwMDEsIDB4MjBhMCwgMHgzYzAwLCAweDIwZTgsIDB4MjAwMSwKKwkweGZmZmYsIDB4NDAwNCwgMHgwMWRlLCAweDAxNGUsIDB4OTAwNiwgMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDExMjgsIDB4MDgwYywKKwkweDBmZmYsIDB4MDE2OCwgMHgyOTAwLCAweGI4YTYsIDB4MDgwYywgMHg2ODU1LCAweGE4MDMsIDB4MDAwMSwKKwkweGE4MDcsIDB4MDAwMCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4OTAwNiwKKwkweDBjZDgsIDB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiOGE0LCAweDkwNGQsIDB4MDEzMCwKKwkweGI4YTcsIDB4MDAwMCwgMHgwODBjLCAweDEwMzEsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4Yjg5YywgMHhkMGE0LCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDA4MGMsIDB4NzQzZSwKKwkweDAxYjAsIDB4NzFjNCwgMHg4MWZmLCAweDExOTgsIDB4NzFkYywgMHhkMTljLCAweDAxODAsIDB4MjAwMSwKKwkweDAwN2UsIDB4OTA4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwgMHgwMTQ4LCAweGI4MDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4YjgwMCwgMHhjMGVkLCAweGI4MDIsIDB4MjA3OSwKKwkweDE4NDcsIDB4NzgwNCwgMHhkMGE0LCAweDAxZDAsIDB4MDE1NiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDAwMTYsIDB4MDgwYywgMHg2Njk5LCAweDExNjgsIDB4YjgwNCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwOTYsIDB4MDAwNCwgMHgwMTE4LCAweDkwODYsIDB4MDAwNiwgMHgxMTE4LCAweGI4MDAsIDB4YzBlZCwKKwkweGI4MDIsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NjhlMCwgMHgwMTVlLCAweDA4MGMsIDB4NjljYSwKKwkweDAxMjAsIDB4MjAwMSwgMHgxOTg0LCAweDIwMGMsIDB4MDAzOCwgMHgyMDc5LCAweDE4NDcsIDB4NzgwNCwKKwkweGQwYTQsIDB4MDEzMCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg2OTBiLCAweDA4MGMsIDB4ODY0OCwKKwkweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MjAxMSwgMHg2OTBiLCAweDA4MGMsIDB4ODViMCwKKwkweDA4MGMsIDB4NjljYSwgMHgwMWQ4LCAweDIwMDEsIDB4MTA3ZSwgMHgyMDA0LCAweDIwNTgsIDB4YjkwMCwKKwkweGMxZWMsIDB4YjkwMiwgMHgwODBjLCAweDZhMDgsIDB4MDEzMCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwKKwkweDY5MGIsIDB4MDgwYywgMHg4NjQ4LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDkwMDYsIDB4NzA3ZSwKKwkweDcwNjAsIDB4NzA4MiwgMHgwODBjLCAweDJmZjUsIDB4MDBlZSwgMHgwNGIwLCAweDAxNTYsIDB4MDBjNiwKKwkweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2Njk5LCAweDE1MzgsIDB4YjgwMCwKKwkweGQwZWMsIDB4MDUyMCwgMHgwMDQ2LCAweGJhYTAsIDB4MjIyMCwgMHg5MDA2LCAweDIwMDksIDB4MDAyOSwKKwkweDA4MGMsIDB4ZTczYSwgMHhiODAwLCAweGMwZTUsIDB4YzBlYywgMHhiODAyLCAweDA4MGMsIDB4NmEwNCwKKwkweDIwMDEsIDB4MDcwNywgMHgxMTI4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODUsIDB4MDcwMCwKKwkweGI4MDYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywKKwkweDkyMjksIDB4OTAwZSwgMHgwODBjLCAweGU0NzcsIDB4MDA3ZSwgMHgwMDRlLCAweDAwMWUsIDB4ODEwOCwKKwkweDFmMDQsIDB4NjkzMywgMHgwMGNlLCAweDAxNWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjgwMCwgMHhjMGVjLCAweGI4MDIsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwKKwkweDAwOTYsIDB4MDgwYywgMHgxMDE4LCAweDA5MGMsIDB4MGRkNSwgMHgyOTU4LCAweDAwOWUsIDB4MjAwMSwKKwkweDE5NmEsIDB4MmIwMiwgMHg4YjA3LCAweDgwMDYsIDB4ODAwNiwgMHg5MDhjLCAweDAwM2YsIDB4YjljNiwKKwkweDkwOGMsIDB4ZmZjMCwgMHhiOWNhLCAweGI4YWYsIDB4MDAwMCwgMHgyMDA5LCAweDAwZmYsIDB4MDgwYywKKwkweDYwYzcsIDB4YjgwNywgMHgwMDA2LCAweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmYsIDB4Yjg2ZiwKKwkweDAyMDAsIDB4Yjg2YywgMHhiODkzLCAweDAwMDIsIDB4YjhiYiwgMHgwNTIwLCAweGI4YTMsIDB4MDBmZiwKKwkweGI4YWYsIDB4MDAwMCwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwgMHg3ODEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGFjLCAweDAwMDUsIDB4NjAxMCwgMHgwMGI2LCAweDkwNWQsIDB4MDEwOCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4YjgwNCwKKwkweDkwOGMsIDB4MDBmZiwgMHg5MTk2LCAweDAwMDYsIDB4MDE4OCwgMHg5MTk2LCAweDAwMDQsIDB4MDE3MCwKKwkweDkxOTYsIDB4MDAwNSwgMHgwMTU4LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxOTYsIDB4MDAwNiwKKwkweDAxMjgsIDB4OTE5NiwgMHgwMDA0LCAweDAxMTAsIDB4OTE5NiwgMHgwMDA1LCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MjAwMSwgMHgxMDdlLCAweDIwMDQsIDB4OTA1ZCwKKwkweDAxMTAsIDB4YjgwMCwgMHhkMGVjLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDA2LCAweGJhYTAsIDB4OTI5MCwgMHgxMDAwLCAweDIyMDQsIDB4OWIwNiwKKwkweDE5MGMsIDB4MGRkNSwgMHgwMDBlLCAweGJhMDAsIDB4OTAwNSwgMHgwMTEwLCAweGMyZmQsIDB4MDAwOCwKKwkweGMyZmMsIDB4YmEwMiwgMHgwMDJlLCAweDAxMmUsIDB4MDAwNSwgMHgyMDExLCAweDE4MzcsIDB4MjIwNCwKKwkweGQwY2MsIDB4MDEzOCwgMHgyMDAxLCAweDE5ODIsIDB4MjAwYywgMHgyMDExLCAweDY5ZmEsIDB4MDgwYywKKwkweDg2NDgsIDB4MDAwNSwgMHgyMDExLCAweDY5ZmEsIDB4MDgwYywgMHg4NWIwLCAweDIwMTEsIDB4MTgzNywKKwkweDIyMDQsIDB4YzBjYywgMHgyMDEyLCAweDAwMDUsIDB4MDgwYywgMHg1NzVkLCAweGQwYWMsIDB4MDAwNSwKKwkweDA4MGMsIDB4NTc1ZCwgMHhkMGE0LCAweDAwMDUsIDB4MDAxNiwgMHhiOTA0LCAweDkxODQsIDB4MDBmZiwKKwkweDkwOGUsIDB4MDAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHhiOTA0LCAweDkxODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTA4ZSwgMHgwMDA2LCAweDAwMWUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDgwYywKKwkweGQzODgsIDB4MDE1OCwgMHg3MGRjLCAweDkwODQsIDB4MDAyOCwgMHgwMTM4LCAweDIwMDEsIDB4MTA3ZiwKKwkweDIwMDQsIDB4OTA1ZCwgMHgwMTEwLCAweGI4Y2MsIDB4ZDA5NCwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwKKwkweDIwNzEsIDB4MTkxMCwgMHg3MDAzLCAweDAwMDEsIDB4NzAwNywgMHgwMDAwLCAweDkwMDYsIDB4NzAxMiwKKwkweDcwMTYsIDB4NzAxYSwgMHg3MDFlLCAweDcwMGEsIDB4NzA0NiwgMHgwMDA1LCAweDAwMTYsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTk0NywgMHg5MDBlLCAweDcxMGEsIDB4MDgwYywgMHg1NzVkLCAweGQwZmMsIDB4MTE0MCwKKwkweDA4MGMsIDB4NTc1ZCwgMHg5MDBlLCAweGQwOWMsIDB4MDEwOCwgMHg4MTA4LCAweDcxMDIsIDB4MDBmOCwKKwkweDIwMDEsIDB4MTg2NywgMHgyMDBjLCAweDkxODQsIDB4MDAwNywgMHgwMDAyLCAweDZhNDgsIDB4NmE0OCwKKwkweDZhNDgsIDB4NmE0OCwgMHg2YTQ4LCAweDZhNWUsIDB4NmE2YywgMHg2YTQ4LCAweDcwMDMsIDB4MDAwMywKKwkweDIwMDksIDB4MTg2OCwgMHgyMTBjLCAweDkxODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwMDUsIDB4MTExMCwKKwkweDIwMDEsIDB4MDAwMiwgMHg3MDA2LCAweDAwMTgsIDB4NzAwMywgMHgwMDA1LCAweDBjODgsIDB4MDBlZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA1MCwgMHg2ODRjLCAweDkwMDUsIDB4MTE1MCwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOTEwLCAweDcwMjgsIDB4YzA4NSwgMHg3MDJhLCAweDAwZWUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDQ4OCwgMHg2ODQ0LCAweDkwMDUsIDB4MDE1OCwgMHgwODBjLCAweDc3OTYsIDB4NmE2MCwKKwkweDkyMDAsIDB4NzAwMiwgMHg2ODY0LCAweDkxMDEsIDB4NzAwNiwgMHg5MDA2LCAweDcwMTIsIDB4NzAxNiwKKwkweDY4NjAsIDB4NzAwMiwgMHg2ODY0LCAweDcwMDYsIDB4Njg2OCwgMHg3MDBhLCAweDY4NmMsIDB4NzAwZSwKKwkweDY4NDQsIDB4OTAwNSwgMHgxMTEwLCAweDcwMTIsIDB4NzAxNiwgMHg2ODRjLCAweDcwMWEsIDB4NzAxYywKKwkweDkwODUsIDB4MDA0MCwgMHg3MDFlLCAweDcwMzcsIDB4MDAxOSwgMHg3MDJiLCAweDAwMDEsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTkxMCwgMHg3MDI4LCAweGMwODQsIDB4NzAyYSwgMHg3MDA3LCAweDAwMDEsIDB4NzAwYiwKKwkweDAwMDAsIDB4MDBlZSwgMHg5MDA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMjYsIDB4MjA3MSwKKwkweDE5NDcsIDB4NzAwMCwgMHg5MDE1LCAweDA5MDQsIDB4NmQxYywgMHg5Mjg2LCAweDAwMDMsIDB4MDkwNCwKKwkweDZiYjIsIDB4OTI4NiwgMHgwMDA1LCAweDA5MDQsIDB4NmJiMiwgMHgyMDcxLCAweDE4NzcsIDB4YTg3YywKKwkweDkwMDUsIDB4MDkwNCwgMHg2YjEzLCAweDcxNDAsIDB4YTg2OCwgMHg5MTAyLCAweDBhMDQsIDB4NmQxYywKKwkweGE4NzgsIDB4ZDA4NCwgMHgxNWQ4LCAweGE4NTMsIDB4MDAxOSwgMHgyMDAxLCAweDgwMjMsIDB4YTg0ZSwKKwkweDIwNzEsIDB4MTkxMCwgMHg3MDFjLCAweDkwMDUsIDB4MTkwNCwgMHg2ZWIyLCAweDBlMDQsIDB4NmYyMCwKKwkweDIwNzEsIDB4MDAwMCwgMHhhODUwLCAweDcwMzIsIDB4YTg0YywgMHg3MDgyLCAweGE4NzAsIDB4NzA4NiwKKwkweGE4NmMsIDB4NzA4YSwgMHhhODgwLCAweDcwOGUsIDB4NzAzNiwgMHgwMTQ2LCAweDAxZDYsIDB4MDEzNiwKKwkweDAxYzYsIDB4MDE1NiwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMDJhLCAweGE4NjgsIDB4MjBhOCwKKwkweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMSwgMHgyMDk4LCAweDQwMDMsIDB4MDE1ZSwKKwkweDAxY2UsIDB4MDEzZSwgMHgwMWRlLCAweDAxNGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwKKwkweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExOWIsIDB4MDgwNCwgMHg2Yjk1LCAweGE4NTMsIDB4MDAxYiwKKwkweDIwMDEsIDB4ODAyNywgMHgwODIwLCAweDcwMDQsIDB4ZDA4YywgMHgxOTA0LCAweDZkMWMsIDB4YTg1MywKKwkweDAwMWEsIDB4MjAwMSwgMHg4MDI0LCAweDA4MDQsIDB4NmFkNywgMHgwMGU2LCAweDAwMjYsIDB4MjA3MSwKKwkweDE5NDcsIDB4NzAwMCwgMHg5MDE1LCAweDA5MDQsIDB4NmQxYywgMHg5Mjg2LCAweDAwMDMsIDB4MDkwNCwKKwkweDZiYjIsIDB4OTI4NiwgMHgwMDA1LCAweDA5MDQsIDB4NmJiMiwgMHhhODRmLCAweDgwMjIsIDB4YTg1MywKKwkweDAwMTgsIDB4MDgwNCwgMHg2YjdhLCAweGE4NjgsIDB4ZDBmYywgMHgxMWQ4LCAweDAwZTYsIDB4MDAyNiwKKwkweDIwMDEsIDB4MTk0NywgMHgyMDA0LCAweDkwMDUsIDB4MDkwNCwgMHg2ZDFjLCAweGE4N2MsIDB4ZDBiYywKKwkweDE5MDQsIDB4NmQxYywgMHhhOTc4LCAweGE4NzQsIDB4OTEwNSwgMHgxOTA0LCAweDZkMWMsIDB4MjAwMSwKKwkweDE5NDcsIDB4MjAwNCwgMHgwMDAyLCAweDZkMWMsIDB4NmI3NiwgMHg2YmIyLCAweDZiYjIsIDB4NmQxYywKKwkweDZiYjIsIDB4MDAwNSwgMHhhODY4LCAweGQwZmMsIDB4MTUwMCwgMHgwMGU2LCAweDAwMjYsIDB4MjAwOSwKKwkweDE5NDcsIDB4MjEwYywgMHg4MWZmLCAweDA5MDQsIDB4NmQxYywgMHhhODdjLCAweGQwY2MsIDB4MDkwNCwKKwkweDZkMWMsIDB4YTg4MCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4NmQxYywKKwkweDkxODYsIDB4MDAwMywgMHgwOTA0LCAweDZiYjIsIDB4OTE4NiwgMHgwMDA1LCAweDA5MDQsIDB4NmJiMiwKKwkweGE4NGYsIDB4ODAyMSwgMHhhODUzLCAweDAwMTcsIDB4MDAyOCwgMHgwMDA1LCAweGE4NGYsIDB4ODAyMCwKKwkweGE4NTMsIDB4MDAxNiwgMHgyMDcxLCAweDE5MTAsIDB4NzAxYywgMHg5MDA1LCAweDE5MDQsIDB4NmViMiwKKwkweDBlMDQsIDB4NmYyMCwgMHgyMDcxLCAweDAwMDAsIDB4YTg0YywgMHg3MDgyLCAweGE4NTAsIDB4NzAzMiwKKwkweGE4NmMsIDB4NzA4NiwgMHg3MDM2LCAweGE4NzAsIDB4NzA4YSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHgyMDcxLCAweDE4MDAsIDB4MjAxMSwKKwkweDAwMDEsIDB4YTgwNCwgMHg5MDBkLCAweDcwMmMsIDB4MTE1OCwgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwKKwkweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwKKwkweDAwOWUsIDB4MGM1OCwgMHhhODRmLCAweDAwMDAsIDB4MDBmNiwgMHgyMDc5LCAweDAwNTAsIDB4MjA3MSwKKwkweDE5MTAsIDB4YTgwMywgMHgwMDAwLCAweDcwMTAsIDB4OTAwNSwgMHgxOTA0LCAweDZjYTEsIDB4NzgyYywKKwkweDkwOGMsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4OTA4NCwKKwkweDAwMDMsIDB4MDAwMiwgMHg2YmQwLCAweDZjYTEsIDB4NmJmNSwgMHg2YzNjLCAweDA4MGMsIDB4MGRkNSwKKwkweDIwNzEsIDB4MTgwMCwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDExNzAsIDB4MjA3MSwKKwkweDE5ZjksIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTQ4LCAweDIwMDQsIDB4ODAwNSwKKwkweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwKKwkweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MGMxMCwgMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwKKwkweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDE1ODAsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwKKwkweDcxMmMsIDB4ZDE5YywgMHgxMTQ4LCAweDIwMDksIDB4MTgzMCwgMHgyMTBjLCAweDkxOGEsIDB4MDAyMCwKKwkweDAyMTgsIDB4NzAyMiwgMHgwMGVlLCAweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwKKwkweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4NzgyYywKKwkweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDBhNCwgMHgxOWYwLCAweDIwNzEsIDB4MTlmOSwKKwkweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTk0OCwgMHgyMDA0LCAweDgwMDUsIDB4NzAzZSwKKwkweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwKKwkweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwKKwkweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDA4MDAsIDB4MDA5NiwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwKKwkweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwKKwkweGQwYTQsIDB4MWQ2MCwgMHgwMGVlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwKKwkweGQwOWMsIDB4MTFhMCwgMHgwMDllLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTU2MCwKKwkweDIwNzEsIDB4MTlmOSwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwKKwkweDgwMDUsIDB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwOWUsIDB4MjkwOCwKKwkweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsIDB4YTkwMiwKKwkweDAwMDgsIDB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxMTcwLCAweDIwNzEsIDB4MTlmOSwKKwkweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTk0OCwgMHgyMDA0LCAweDgwMDUsIDB4NzAzZSwKKwkweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywKKwkweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwKKwkweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwKKwkweDAxMTAsIDB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwKKwkweDZjZjYsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwOWMsIDB4MTE5OCwKKwkweDcwMWMsIDB4OTA0ZCwgMHgwMTgwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDExMDgsIDB4NzAxYSwKKwkweGE4MDAsIDB4NzAxZSwgMHgyOTAwLCAweDc4MjIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDcwNmUsIDB4ZDA5YywgMHgwZDY4LCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwKKwkweGQwYTQsIDB4MDFiMCwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLCAweDE4MDAsIDB4NzAyYywKKwkweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwgMHhkMGE0LCAweDFkNjAsIDB4MDBlZSwKKwkweDIwNzEsIDB4MTlmOSwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwKKwkweDgwMDUsIDB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwKKwkweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwKKwkweDAwZWUsIDB4MDgwNCwgMHg2Y2IxLCAweGE4NjgsIDB4ZDBmYywgMHgxNTYwLCAweDAwOTYsIDB4YTgwNCwKKwkweGE4MDcsIDB4MDAwMCwgMHg5MDRkLCAweDE5MGMsIDB4MGZiMSwgMHgwMDllLCAweDAwMTgsIDB4YTg2OCwKKwkweGQwZmMsIDB4MTUwMCwgMHgwMGU2LCAweDAwMjYsIDB4YTg0ZiwgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwKKwkweDAwNTAsIDB4MjA3MSwgMHgxOTEwLCAweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDkwMDUsIDB4MTkwNCwKKwkweDZlMzAsIDB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweDgwMDQsIDB4ODAwNCwKKwkweDgwMDQsIDB4OTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4NmQzYiwgMHg2ZTMwLCAweDZkNTYsIDB4NmRjMywKKwkweDA4MGMsIDB4MGRkNSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwKKwkweDkwMGQsIDB4MTEyMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywKKwkweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwKKwkweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODRjMiwgMHgwYzYwLCAweDIwNzEsIDB4MTgwMCwKKwkweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwgMHg2ZGIyLCAweDc4MzAsIDB4ODAwNywKKwkweDkwODQsIDB4MDAxZiwgMHg5MDgyLCAweDAwMDEsIDB4MTIyMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE0OCwKKwkweDIwMDksIDB4MTgzMCwgMHgyMTBjLCAweDkxOGEsIDB4MDAyMCwgMHgwMjE4LCAweDcwMjIsIDB4MDBlZSwKKwkweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwKKwkweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDcwNmUsIDB4ZDBhNCwgMHgxOWYwLCAweDBlMDQsIDB4NmRhOSwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwKKwkweDFkZTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwKKwkweDIwMDEsIDB4MTkyMSwgMHgyMDBjLCAweGMxODQsIDB4MjEwMiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTIxLCAweDIwMGMsIDB4YzE4NSwgMHgyMTAyLCAweDAwZmUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwKKwkweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywKKwkweDg0YzIsIDB4MDgwNCwgMHg2ZDY5LCAweDAwOTYsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwKKwkweDA4MGMsIDB4ODRjMiwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHgwZTA0LCAweDZlMDMsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4NzA0NCwKKwkweGMwODQsIDB4NzA0NiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTE5YiwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDA5YywKKwkweDExNzAsIDB4MDA5ZSwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLCAweDExZTAsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNDQsIDB4YzA4NSwgMHg3MDQ2LCAweDBjNTgsIDB4MDA5ZSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDExMjAsIDB4MDBmZSwKKwkweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwKKwkweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwKKwkweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwKKwkweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwKKwkweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLCAweDE5MDQsIDB4NmU5ZCwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzA2ZSwgMHhkMDljLCAweDExYjAsIDB4NzAxYywKKwkweDkwNGQsIDB4MDE5OCwgMHhhODRjLCAweDkwMDUsIDB4MTE4MCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwKKwkweDExMDgsIDB4NzAxYSwgMHhhODAwLCAweDcwMWUsIDB4MjkwMCwgMHg3ODIyLCAweDc4MmMsIDB4OTA5NCwKKwkweDA3ODAsIDB4MTkwYywgMHg3MDZlLCAweGQwOWMsIDB4MGQ1MCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NzA2ZSwgMHhkMGE0LCAweDA1YTgsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwKKwkweDA4MGMsIDB4ODRjMiwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDBhNCwKKwkweDFkNjAsIDB4MDBlZSwgMHgwZTA0LCAweDZlOTYsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4NzA0NCwKKwkweGMwODQsIDB4NzA0NiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTE5YiwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNDQsIDB4YzA4NSwKKwkweDcwNDYsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MDBlZSwKKwkweDA4MDQsIDB4NmU0MCwgMHgyMDcxLCAweDE5MTAsIDB4YTgwMywgMHgwMDAwLCAweDI5MDgsIDB4NzAxMCwKKwkweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwKKwkweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTEyOCwgMHgxZTA0LCAweDZlZGQsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgyMDcxLCAweDE4MDAsIDB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwKKwkweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwKKwkweDcwYzIsIDB4MDgwYywgMHg4NGMyLCAweDBlMDQsIDB4NmVjNywgMHgyMDcxLCAweDE5MTAsIDB4NzAxYywKKwkweDIwNDgsIDB4YTg0YywgMHg5MDBkLCAweDBkMTgsIDB4MjA3MSwgMHgwMDAwLCAweDcxODIsIDB4YTg1MCwKKwkweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwgMHg3MDhhLCAweGE4NTAsIDB4OTA4MiwKKwkweDAwMTksIDB4MTI3OCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwKKwkweDE5MGMsIDB4MTE5YiwgMHgyMDcxLCAweDE5MTAsIDB4MDgwYywgMHg3MDVhLCAweDAwMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4YTg1MCwgMHg5MDgyLCAweDAwMWMsIDB4MWU2OCwgMHhhODgwLCAweDcwOGUsIDB4NzAzNiwKKwkweDAxNDYsIDB4MDFkNiwgMHgwMTM2LCAweDAxYzYsIDB4MDE1NiwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwKKwkweDAwMmEsIDB4YTg2OCwgMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMSwKKwkweDIwOTgsIDB4NDAwMywgMHgwMTVlLCAweDAxY2UsIDB4MDEzZSwgMHgwMWRlLCAweDAxNGUsIDB4MDg5MCwKKwkweDIwNzEsIDB4MTkxMCwgMHhhODAzLCAweDAwMDAsIDB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwKKwkweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsIDB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwKKwkweGE4MDQsIDB4OTAwZCwgMHgxMTE4LCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwKKwkweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwKKwkweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMDA2LCAweGE4N2MsIDB4MDAwNiwgMHhhODY3LCAweDAxMDMsIDB4MjBhOSwKKwkweDAwMWMsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFkLCAweDIwYTAsIDB4OTAwNiwKKwkweDQwMDQsIDB4MDAwZSwgMHg5MDg0LCAweDAwZmYsIDB4YTg3ZSwgMHgwMDBlLCAweGE4N2EsIDB4YTk4MiwKKwkweDAwMDUsIDB4MjA3MSwgMHgxOTEwLCAweDcwMDQsIDB4MDAwMiwgMHg2ZjZkLCAweDZmNmUsIDB4NzA1OSwKKwkweDZmNmUsIDB4NmY2YiwgMHg3MDU5LCAweDA4MGMsIDB4MGRkNSwgMHgwMDA1LCAweDIwMDEsIDB4MTk0NywKKwkweDIwMDQsIDB4MDAwMiwgMHg2Zjc4LCAweDZmNzgsIDB4NmZmMiwgMHg2ZmYzLCAweDZmNzgsIDB4NmZmMywKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDFlMGMsIDB4NzA3OSwgMHg3MDFjLCAweDkwNGQsIDB4MDUwOCwKKwkweGE4NGMsIDB4OTAwNSwgMHgwOTA0LCAweDZmYzMsIDB4MGUwNCwgMHg2ZmExLCAweGE5NGMsIDB4MjA3MSwKKwkweDAwMDAsIDB4NzE4MiwgMHhhODUwLCAweDcwMzIsIDB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwKKwkweDcwOGEsIDB4YTg1MCwgMHg5MDgyLCAweDAwMTksIDB4MTI3OCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHgyMDcxLCAweDE5MTAsIDB4MDgwYywKKwkweDcwNWEsIDB4MDEyZSwgMHgwODA0LCAweDZmZjEsIDB4YTg1MCwgMHg5MDgyLCAweDAwMWMsIDB4MWU2OCwKKwkweGE4ODAsIDB4NzA4ZSwgMHg3MDM2LCAweDAxNDYsIDB4MDFkNiwgMHgwMTM2LCAweDAxYzYsIDB4MDE1NiwKKwkweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAwMmEsIDB4YTg2OCwgMHgyMGE4LCAweGE4NjAsIDB4MjBlMCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDIxLCAweDIwOTgsIDB4NDAwMywgMHgwMTVlLCAweDAxY2UsIDB4MDEzZSwKKwkweDAxZGUsIDB4MDE0ZSwgMHgwODkwLCAweDIwMDEsIDB4MDA1YiwgMHgyMDA0LCAweDkwOTQsIDB4MDc4MCwKKwkweDE5MGMsIDB4NzA2ZSwgMHhkMDljLCAweDIwNzEsIDB4MTkxMCwgMHgxNTEwLCAweDIwNzEsIDB4MTkxMCwKKwkweDcwMGYsIDB4MDAwMSwgMHhhOTY0LCAweDkxODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDMsIDB4MTEzMCwKKwkweDgxMGYsIDB4OTE4YywgMHgwMGZmLCAweDgxMDEsIDB4MDEwOCwgMHg3MTBlLCAweDI5MDAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDA1MCwgMHg2ODIyLCAweDAwZGUsIDB4MjA3MSwgMHgxOTEwLCAweDcwMWMsIDB4MjA0OCwKKwkweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZDYsIDB4MjAwOCwgMHgyMDY5LCAweDE5ZjksIDB4NjgzYywKKwkweDkwMDUsIDB4MDc2MCwgMHgwMTU4LCAweDkxODYsIDB4MDAwMywgMHgwNTQwLCAweDIwMDEsIDB4MTgxNSwKKwkweDIwMDQsIDB4MjAwOSwgMHgxYWNhLCAweDIxMGMsIDB4OTEwMiwgMHgxNTAwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA2OSwgMHgwMDUwLCAweDY5M2MsIDB4NjgzOCwgMHg5MTA2LCAweDAxOTAsIDB4MGUwNCwKKwkweDcwMjUsIDB4MjA2OSwgMHgwMDAwLCAweDY4MzcsIDB4ODA0MCwgMHg2ODMzLCAweDAwMTIsIDB4Njg4MywKKwkweDgwNDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywKKwkweDExOWIsIDB4MjA2OSwgMHgxOWY5LCAweDY4M2YsIDB4ZmZmZiwgMHgwMTJlLCAweDAwZGUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgxZTBjLCAweDcwZGEsIDB4NzAxYywgMHg5MDRkLCAweDA1NDAsIDB4MjAwMSwKKwkweDAwNWIsIDB4MjAwNCwgMHg5MDk0LCAweDA3ODAsIDB4MTVjOSwgMHhkMDljLCAweDE1MDAsIDB4MjA3MSwKKwkweDE5MTAsIDB4NzAwZiwgMHgwMDAxLCAweGE5NjQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMywKKwkweDExMzAsIDB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LCAweDcxMGUsIDB4MjkwMCwKKwkweDAwZDYsIDB4MjA2OSwgMHgwMDUwLCAweDY4MjIsIDB4MDBkZSwgMHg3MDFjLCAweDIwNDgsIDB4NzAxMCwKKwkweDgwMDEsIDB4NzAxMiwgMHhhODAwLCAweDcwMWUsIDB4OTAwNSwgMHgxMTA4LCAweDcwMWEsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDFjLCAweDkwNGQsIDB4MDE2MCwKKwkweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwKKwkweDAxMmUsIDB4MDgwYywgMHgxMDMxLCAweDAwMDUsIDB4MDEyZSwgMHgwMDA1LCAweDIwOTEsIDB4ODAwMCwKKwkweDBlMDQsIDB4NzA3MCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHg4MDA0LCAweDAwMDYsIDB4MDgwNCwKKwkweDBkZGUsIDB4MDA5NiwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwgMHg3MDQ0LCAweGQwODQsIDB4MDFjMCwKKwkweGMwODQsIDB4NzA0NiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwKKwkweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwKKwkweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5OTEsIDB4ZDBhNCwgMHgwZGI4LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzgyNCwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE0OCwKKwkweDIwMDksIDB4MTgzMCwgMHgyMTBjLCAweDkxOGEsIDB4MDAyMCwgMHgwMjE4LCAweDcwMjIsIDB4MDBlZSwKKwkweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwKKwkweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDcwNmUsIDB4ZDBhNCwgMHgxOWYwLCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwKKwkweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMTliLCAweDAwZWUsIDB4MDBmZSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDA1MCwgMHg3MDQ0LCAweGQwODQsIDB4MDFiOCwKKwkweGMwODQsIDB4NzA0NiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLCAweDAwZDYsIDB4MjA2OSwKKwkweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwKKwkweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTE5YiwgMHgwMGZlLCAweDAwMDUsIDB4NzgyYywKKwkweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcwNmUsIDB4ZDBhNCwgMHgwZGI4LCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzgyNCwgMHgyMDQ4LCAweDcwMmMsIDB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwKKwkweDgwMDAsIDB4NzBjMiwgMHgwODBjLCAweDg0YzIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywKKwkweDcwNmUsIDB4ZDBhNCwgMHgxZDcwLCAweDAwZDYsIDB4MjA2OSwgMHgwMDUwLCAweDY5M2MsIDB4MjA2OSwKKwkweDE5NDcsIDB4NjgwOCwgMHg2OTBhLCAweDIwNjksIDB4MTlmOSwgMHg5MTAyLCAweDExMTgsIDB4NjgzYywKKwkweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwYywgMHg4MTBkLCAweDY5M2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDcwOTgsIDB4OTA4YSwgMHgwMDI5LCAweDFhMGMsIDB4MGRkNSwKKwkweDkwODIsIDB4MDAxZCwgMHgwMDFiLCAweDYwMjcsIDB4MWUwMCwgMHgwMDA1LCAweDcyMDIsIDB4NzE4OCwKKwkweDcxYTQsIDB4NzFjZSwgMHg3MWYxLCAweDcyMzEsIDB4NzI0MywgMHg3MWE0LCAweDcyMTksIDB4NzE0MywKKwkweDcxNzEsIDB4NzE0MiwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwKKwkweDExODAsIDB4NjgwOCwgMHg5MDA1LCAweDE1MTgsIDB4NzA5YiwgMHgwMDI4LCAweDIwNjksIDB4MTk4ZSwKKwkweDJkMDQsIDB4NzAwMiwgMHgwODBjLCAweDc1NzYsIDB4NjAyOCwgMHg5MDg1LCAweDA2MDAsIDB4NjAyYSwKKwkweDAwYjAsIDB4NzA5YiwgMHgwMDI4LCAweDIwNjksIDB4MTk4ZSwgMHgyZDA0LCAweDcwMDIsIDB4NjAyOCwKKwkweDkwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwZTYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwKKwkweDFhNjEsIDB4MDgwYywgMHgxYWVjLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHg5MDA1LCAweDExNzgsIDB4NjgwOCwKKwkweDkwMDUsIDB4MTE2MCwgMHg3MDliLCAweDAwMjgsIDB4MjA2OSwgMHgxOThlLCAweDJkMDQsIDB4NzAwMiwKKwkweDA4MGMsIDB4NzYxMSwgMHg2MDI4LCAweDkwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgwMDkwLCAweDA4MGMsIDB4MmQ0ZSwgMHgwMDBlLCAweDYxMjQsIDB4ZDFlNCwKKwkweDExOTAsIDB4MDgwYywgMHg3MmIwLCAweGQxZDQsIDB4MTE2MCwgMHhkMWRjLCAweDExMzgsIDB4ZDFjYywKKwkweDAxNTAsIDB4NzA5YiwgMHgwMDIwLCAweDA4MGMsIDB4NzJiMCwgMHgwMDI4LCAweDcwOWIsIDB4MDAxZCwKKwkweDAwMTAsIDB4NzA5YiwgMHgwMDFmLCAweDAwMDUsIDB4MjAwMSwgMHgwMDg4LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDYxMjQsIDB4ZDFjYywgMHgxMWU4LCAweGQxZGMsIDB4MTFjMCwgMHhkMWU0LCAweDExOTgsIDB4OTE4NCwKKwkweDFlMDAsIDB4MTFkOCwgMHgwODBjLCAweDFiMTEsIDB4NjBlMywgMHgwMDAxLCAweDYwMGMsIDB4YzBiNCwKKwkweDYwMGUsIDB4MDgwYywgMHg3NDZhLCAweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJkNGUsIDB4NzA5YiwKKwkweDAwMjgsIDB4MDA1OCwgMHg3MDliLCAweDAwMWUsIDB4MDA0MCwgMHg3MDliLCAweDAwMWQsIDB4MDAyOCwKKwkweDcwOWIsIDB4MDAyMCwgMHgwMDEwLCAweDcwOWIsIDB4MDAxZiwgMHgwMDA1LCAweDA4MGMsIDB4MWIxMSwKKwkweDYwZTMsIDB4MDAwMSwgMHg2MDBjLCAweGMwYjQsIDB4NjAwZSwgMHgwODBjLCAweDc0NmEsIDB4MjAwMSwKKwkweDAwODAsIDB4MDgwYywgMHgyZDRlLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTgwLCAweGQxZGMsIDB4MTE1OCwKKwkweGQxZTQsIDB4MTEzMCwgMHg5MTg0LCAweDFlMDAsIDB4MTE1OCwgMHg3MDliLCAweDAwMjgsIDB4MDA0MCwKKwkweDcwOWIsIDB4MDAxZSwgMHgwMDI4LCAweDcwOWIsIDB4MDAxZCwgMHgwMDEwLCAweDcwOWIsIDB4MDAxZiwKKwkweDAwMDUsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmQ0ZSwgMHg2MTI0LCAweGQxZGMsIDB4MTEzOCwKKwkweGQxZTQsIDB4MDEzOCwgMHgwODBjLCAweDFiMTEsIDB4NzA5YiwgMHgwMDFlLCAweDAwMTAsIDB4NzA5YiwKKwkweDAwMWQsIDB4MDAwNSwgMHgwODBjLCAweDczMzMsIDB4NjEyNCwgMHhkMWRjLCAweDExODgsIDB4MDgwYywKKwkweDcyYjAsIDB4MDAxNiwgMHgwODBjLCAweDFiMTEsIDB4MDAxZSwgMHhkMWQ0LCAweDExMjgsIDB4ZDFlNCwKKwkweDAxMzgsIDB4NzA5YiwgMHgwMDFlLCAweDAwMjAsIDB4NzA5YiwgMHgwMDFmLCAweDA4MGMsIDB4NzJiMCwKKwkweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyZDRlLCAweDAwMGUsIDB4NjEyNCwKKwkweGQxZDQsIDB4MTE2MCwgMHhkMWNjLCAweDExNTAsIDB4ZDFkYywgMHgxMTI4LCAweGQxZTQsIDB4MDE0MCwKKwkweDcwOWIsIDB4MDAxZSwgMHgwMDI4LCAweDcwOWIsIDB4MDAxZCwgMHgwMDEwLCAweDcwOWIsIDB4MDAyMSwKKwkweDAwMDUsIDB4MDgwYywgMHg3MzMzLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwKKwkweGQxZTQsIDB4MDE0MCwgMHg3MDliLCAweDAwMWUsIDB4MDAyOCwgMHg3MDliLCAweDAwMWQsIDB4MDAxMCwKKwkweDcwOWIsIDB4MDAxZiwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMDkwLCAweDA4MGMsIDB4MmQ0ZSwKKwkweDAwMGUsIDB4NjEyNCwgMHhkMWQ0LCAweDExNzgsIDB4ZDFjYywgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwKKwkweGQxZTQsIDB4MDE1OCwgMHg3MDliLCAweDAwMWUsIDB4MDA0MCwgMHg3MDliLCAweDAwMWQsIDB4MDAyOCwKKwkweDcwOWIsIDB4MDAyMCwgMHgwMDEwLCAweDcwOWIsIDB4MDAxZiwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NzQzZSwgMHgxMWQ4LCAweDIwMDEsIDB4MTgwYywKKwkweDIwMGMsIDB4ZDFiNCwgMHgwMWIwLCAweGMxYjQsIDB4MjEwMiwgMHg2MDI3LCAweDAyMDAsIDB4MDgwYywKKwkweDJjNzYsIDB4NjAyNCwgMHhkMGNjLCAweDAxNDgsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmQ0ZSwKKwkweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsIDB4MDQyOCwgMHg2MDI4LCAweGMwY2QsIDB4NjAyYSwKKwkweDA0MDgsIDB4MDgwYywgMHg3NDU4LCAweDAxNTAsIDB4MDgwYywgMHg3NDRmLCAweDExMzgsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHgyODI4LCAweDA4MGMsIDB4NzQxNiwgMHgwMGEwLCAweDA4MGMsIDB4NzMzMCwKKwkweDAxNzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjgyOCwgMHg3MDk4LCAweDkwODYsIDB4MDAxZSwKKwkweDAxMjAsIDB4NzA5OCwgMHg5MDg2LCAweDAwMjIsIDB4MTExOCwgMHg3MDliLCAweDAwMjUsIDB4MDAxMCwKKwkweDcwOWIsIDB4MDAyMSwgMHgwMTJlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwKKwkweDAwMjYsIDB4MjAxMSwgMHg3MmMxLCAweDA4MGMsIDB4ODY4YSwgMHgwMDJlLCAweDAwMTYsIDB4MDAyNiwKKwkweDIwMDksIDB4MDA2NCwgMHgyMDExLCAweDcyYzEsIDB4MDgwYywgMHg4NjgxLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMGY2LCAweDAwMTYsIDB4MDgwYywgMHhhMzU2LCAweDIwNzEsIDB4MTgwMCwKKwkweDA4MGMsIDB4NzI1ZSwgMHgwMDFlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDA4MGMsIDB4YTM1NiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDIwOTEsIDB4ODAwMCwKKwkweDYwMjgsIDB4YzA5YywgMHg2MDJhLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGE3MjIsIDB4MjAxMSwKKwkweDAwMDIsIDB4MDgwYywgMHhhNzJjLCAweDA4MGMsIDB4YTYzNiwgMHgwODBjLCAweDg2MzYsIDB4MDAzNiwKKwkweDkwMWUsIDB4MDgwYywgMHhhNmFjLCAweDAwM2UsIDB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4ZWI3OSwKKwkweDA4MGMsIDB4ZWI5NCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwYywgMHgyYzdjLCAweDA4MGMsIDB4MmI5NywKKwkweDIwMDEsIDB4MTgwMCwgMHgyMDAzLCAweDAwMDQsIDB4NjAyNywgMHgwMDA4LCAweDIwMTEsIDB4NzJjMSwKKwkweDA4MGMsIDB4ODY4YSwgMHgwODBjLCAweDc0NTgsIDB4MDExOCwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDA4MGMsIDB4MGJhZSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyODI4LCAweDAxMmUsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAyNiwKKwkweDAwZTYsIDB4MjAxMSwgMHg3MmNlLCAweDIwNzEsIDB4MTlmOSwgMHg3MDFjLCAweDkyMDYsIDB4MTExOCwKKwkweDcwMTgsIDB4OTAwNSwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwKKwkweDYwMjAsIDB4ZDA5YywgMHgwMDA1LCAweDY4MDAsIDB4OTA4NCwgMHhmZmZlLCAweDkwODYsIDB4MDBjMCwKKwkweDAxNzAsIDB4MjAwMSwgMHgwMGMwLCAweDA4MGMsIDB4MmQ0ZSwgMHgwMTU2LCAweDIwYTksIDB4MDAyZCwKKwkweDFkMDQsIDB4NzM0MCwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg3MzQwLCAweDAxNWUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4MDgwYywgMHg3NzMzLCAweDIwMDEsIDB4MTk2YywgMHgyMDAzLCAweDAwMDAsIDB4OTAwNiwKKwkweDcwOWEsIDB4NjBlMiwgMHg2ODg2LCAweDA4MGMsIDB4MjhmMCwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDA4MGMsIDB4NWY2YywgMHg2MDI3LCAweGZmZmYsIDB4NjAyYiwgMHgxODJmLCAweDAwZWUsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwKKwkweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDIwMDEsIDB4MTk3YywgMHgyMDBjLCAweDkxODYsIDB4MDAwMCwKKwkweDAxNTgsIDB4OTE4NiwgMHgwMDAxLCAweDAxNTgsIDB4OTE4NiwgMHgwMDAyLCAweDAxNTgsIDB4OTE4NiwKKwkweDAwMDMsIDB4MDE1OCwgMHgwODA0LCAweDc0MDYsIDB4NzA5YiwgMHgwMDIyLCAweDAwNDAsIDB4NzA5YiwKKwkweDAwMjEsIDB4MDAyOCwgMHg3MDliLCAweDAwMjMsIDB4MDAxMCwgMHg3MDliLCAweDAwMjQsIDB4NjBlMywKKwkweDAwMDAsIDB4Njg4NywgMHgwMDAxLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI4ZjAsIDB4MDAyNiwKKwkweDA4MGMsIDB4YWViNCwgMHgwMDJlLCAweDcwMDAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsIDB4NjAyYiwKKwkweDAwMjgsIDB4MDAxMCwgMHg2MDJiLCAweDAwMjAsIDB4MDE1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwYTksIDB4MDAwNSwgMHg2MDI0LCAweGQwYWMsIDB4MDE1MCwgMHgwMTJlLCAweDAxNWUsIDB4MDgwYywKKwkweGQzODgsIDB4MDExOCwgMHg5MDA2LCAweDA4MGMsIDB4MmQ3OCwgMHgwODA0LCAweDc0MTIsIDB4NjgwMCwKKwkweDkwODQsIDB4MDBhMSwgMHhjMGJkLCAweDY4MDIsIDB4MDgwYywgMHgyYzc2LCAweDY5MDQsIDB4ZDFkNCwKKwkweDExNDAsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwgMHgxZjA0LCAweDczYWEsIDB4MDgwYywKKwkweDc0OTUsIDB4MDEyZSwgMHgwMTVlLCAweDA4MGMsIDB4NzQ0ZiwgMHgwMWQ4LCAweDYwNDQsIDB4OTAwNSwKKwkweDAxOTgsIDB4MjAxMSwgMHgwMTE0LCAweDIyMDQsIDB4OTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4NjA1MCwKKwkweDAwMDYsIDB4OTA4NSwgMHgwMDIwLCAweDYwNTIsIDB4MDgwYywgMHg3NDk1LCAweDkwMDYsIDB4ODAwMSwKKwkweDFkZjAsIDB4MDAwZSwgMHg2MDUyLCAweDAwMjgsIDB4NjgwNCwgMHhkMGQ0LCAweDExMTAsIDB4MDgwYywKKwkweDc0OTUsIDB4MDgwYywgMHhkMzg4LCAweDAxMTgsIDB4OTAwNiwgMHgwODBjLCAweDJkNzgsIDB4MDAxNiwKKwkweDAwMjYsIDB4NzAwMCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwgMHgyMDA5LCAweDAwYzgsIDB4MjAxMSwKKwkweDcyY2UsIDB4MDgwYywgMHg4NjQ4LCAweDAwMmUsIDB4MDAxZSwgMHgwODBjLCAweDg0YjksIDB4NzAzNCwKKwkweGMwODUsIDB4NzAzNiwgMHgyMDAxLCAweDE5N2MsIDB4MjAwMywgMHgwMDA0LCAweDA4MGMsIDB4NzEyYiwKKwkweDA4MGMsIDB4NzQ0ZiwgMHgwMTM4LCAweDY4MDQsIDB4ZDBkNCwgMHgxMTIwLCAweGQwZGMsIDB4MTEwMCwKKwkweDA4MGMsIDB4NzcyOSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywKKwkweDg0ZDAsIDB4MDgwYywgMHg4NGMyLCAweDA4MGMsIDB4NzczMywgMHgyMDAxLCAweDE5NmMsIDB4MjAwMywKKwkweDAwMDAsIDB4OTAwNiwgMHg3MDlhLCAweDYwZTIsIDB4Njg4NiwgMHgwODBjLCAweDI4ZjAsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmQ0ZSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDYwMjcsIDB4ZmZmZiwKKwkweDYwMmIsIDB4MTgyZiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwKKwkweDE5N2IsIDB4MjAwNCwgMHg5MDg2LCAweGFhYWEsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDgwYywKKwkweDU3NjEsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAwMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDA4MGMsIDB4NTc2MSwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDMwLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MDgwYywgMHg1NzYxLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMTAsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwODBjLCAweDU3NjEsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAyMCwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDM2LCAweDAwMTYsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4OTA4YywKKwkweDAwMTMsIDB4MDE4MCwgMHgwMDIwLCAweDA4MGMsIDB4MjkxMCwgMHg5MDBlLCAweDAwMjgsIDB4MDgwYywKKwkweDZhMDQsIDB4MWRjOCwgMHgyMDA5LCAweDAwMDIsIDB4MjAxOSwgMHgwMDI4LCAweDA4MGMsIDB4MzFlOSwKKwkweDkwMDYsIDB4MDAxOSwgMHgwMDFlLCAweDAwM2UsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwYywKKwkweDJlMDQsIDB4MDEzMCwgMHgwODBjLCAweGQzODEsIDB4MTEyOCwgMHg5MDg1LCAweDAwMTAsIDB4MDAxMCwKKwkweDkwODQsIDB4ZmZlZiwgMHgyMDcyLCAweDAwZWUsIDB4MDAwNSwgMHg2MDUwLCAweDAwMDYsIDB4NjBlYywKKwkweDAwMDYsIDB4NjAwYywgMHgwMDA2LCAweDYwMDQsIDB4MDAwNiwgMHg2MDI4LCAweDAwMDYsIDB4MDAxNiwKKwkweDYxMzgsIDB4NjA1MCwgMHg5MDg0LCAweGZiZmYsIDB4OTA4NSwgMHgyMDAwLCAweDYwNTIsIDB4NjEzYSwKKwkweDIwYTksIDB4MDAxMiwgMHgxZDA0LCAweDc0YWEsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzRhYSwKKwkweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjA1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwKKwkweGRmZmYsIDB4NjA1MiwgMHg2MTNhLCAweDAwMWUsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwKKwkweDAwMGUsIDB4NjAyYSwgMHgwMDBlLCAweDYwMDYsIDB4MDAwZSwgMHg2MDBlLCAweDAwMGUsIDB4NjBlZSwKKwkweDYwZTMsIDB4MDAwMCwgMHg2ODg3LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjhmMCwKKwkweDIwMDEsIDB4MDBhMCwgMHgwMDA2LCAweDA4MGMsIDB4ZDM4OCwgMHgwMDBlLCAweDAxMzAsIDB4MDgwYywKKwkweDJkNmMsIDB4OTAwNiwgMHgwODBjLCAweDJkNzgsIDB4MDAxMCwgMHgwODBjLCAweDJkNGUsIDB4MDAwZSwKKwkweDYwNTIsIDB4NjA1MCwgMHgwMDA2LCAweGMwZTUsIDB4NjA1MiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwKKwkweDA4MGMsIDB4MmJlYiwgMHgwMGZlLCAweDAwMGUsIDB4NjA1MiwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwKKwkweDAxNDAsIDB4MjA3MSwgMHgxODAwLCAweDYwMjAsIDB4OTA4NCwgMHgwMDgwLCAweDAxMzgsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMWM1LCAweDIxMDIsIDB4MDgwNCwgMHg3NTY4LCAweDIwMDEsIDB4MTgwYywKKwkweDIwMGMsIDB4YzFjNCwgMHgyMTAyLCAweDYwMjgsIDB4OTA4NCwgMHhlMWZmLCAweDYwMmEsIDB4NjAyNywKKwkweDAyMDAsIDB4MjAwMSwgMHgwMDkwLCAweDA4MGMsIDB4MmQ0ZSwgMHgyMGE5LCAweDAzNjYsIDB4NjAyNCwKKwkweGQwY2MsIDB4MTUxOCwgMHgxZDA0LCAweDc1MTcsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzUxNywKKwkweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGE3MjIsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4YTcyYywKKwkweDA4MGMsIDB4YTYzNiwgMHg5MDFlLCAweDA4MGMsIDB4YTZhYywgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywKKwkweDJkNGUsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwgMHgwODBjLCAweGQzODgsIDB4MDExMCwKKwkweDA4MGMsIDB4MGQ0NSwgMHg5MDg1LCAweDAwMDEsIDB4MDQ4OCwgMHgwODBjLCAweDFiMTEsIDB4NjBlMywKKwkweDAwMDAsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDQsIDB4MDgwYywgMHgyOGYwLCAweDYwZTIsIDB4MjAwMSwKKwkweDAwODAsIDB4MDgwYywgMHgyZDRlLCAweDIwYTksIDB4MDM2NiwgMHg2MDI3LCAweDFlMDAsIDB4MjAwOSwKKwkweDFlMDAsIDB4MDgwYywgMHgyYzc2LCAweDYwMjQsIDB4OTEwYywgMHgwMTM4LCAweDFkMDQsIDB4NzU0ZCwKKwkweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDc1NGQsIDB4MDgxOCwgMHg2MDI4LCAweDkwODUsIDB4MWUwMCwKKwkweDYwMmEsIDB4NzBiNCwgMHg5MDA1LCAweDExMTgsIDB4Njg4NywgMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwKKwkweDA4MGMsIDB4ZDM4OCwgMHgwMTEwLCAweDA4MGMsIDB4MGQ0NSwgMHg5MDA2LCAweDAwZWUsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDMsIDB4MTE2OCwgMHgyMDAxLCAweDAyMGIsIDB4MjAwNCwKKwkweDkwODQsIDB4NTU0MCwgMHg5MDg2LCAweDU1NDAsIDB4MTEyOCwgMHgyMDY5LCAweDFhNzgsIDB4MmQwNCwKKwkweDgwMDAsIDB4MjA2YSwgMHgyMDY5LCAweDAxNDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwYzAsIDB4MDEyMCwKKwkweDY4ODQsIDB4OTAwNSwgMHgxOTA0LCAweDc1ZGIsIDB4MjAwMSwgMHgwMDg4LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDkwMDYsIDB4NjBlMiwgMHg2ODg2LCAweDA4MGMsIDB4MjhmMCwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwKKwkweDkwMDUsIDB4MTExOCwgMHg2ODA4LCAweDkwMDUsIDB4MDFjMCwgMHg2MDI4LCAweDkwODQsIDB4ZmJmZiwKKwkweDYwMmEsIDB4NjAyNywgMHgwNDAwLCAweDIwNjksIDB4MTk4ZSwgMHg3MDAwLCAweDIwNmEsIDB4NzA5YiwKKwkweDAwMjYsIDB4NzAwMywgMHgwMDAxLCAweDIwYTksIDB4MDAwMiwgMHgxZDA0LCAweDc1YmQsIDB4MjA5MSwKKwkweDYwMDAsIDB4MWYwNCwgMHg3NWJkLCAweDA4MDQsIDB4NzYwOSwgMHgyMDY5LCAweDAxNDAsIDB4MjBhOSwKKwkweDAzODQsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwgMHgwODBjLCAweDJjNzYsIDB4NjAyNCwKKwkweDkxMGMsIDB4MDUwOCwgMHg5MDg0LCAweDFhMDAsIDB4MTFmMCwgMHgxZDA0LCAweDc1YzksIDB4MjA5MSwKKwkweDYwMDAsIDB4MWYwNCwgMHg3NWM5LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGE3MjIsIDB4MjAxMSwKKwkweDAwMDIsIDB4MDgwYywgMHhhNzJjLCAweDA4MGMsIDB4YTYzNiwgMHg5MDFlLCAweDA4MGMsIDB4YTZhYywKKwkweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJkNGUsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMGIwLCAweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJkNGUsIDB4MjA2OSwKKwkweDAxNDAsIDB4NjBlMywgMHgwMDAwLCAweDcwYjQsIDB4OTAwNSwgMHgxMTE4LCAweDY4ODcsIDB4MDAwMSwKKwkweDAwMDgsIDB4Njg4NiwgMHgyMDAxLCAweDE5NmMsIDB4MjAwNCwgMHgwODBjLCAweDI4ZjAsIDB4NjBlMiwKKwkweDkwMDYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NjAyMCwgMHg5MDg0LCAweDAwYzAsIDB4MDFjOCwKKwkweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGE3MjIsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4YTcyYywKKwkweDA4MGMsIDB4YTYzNiwgMHg5MDFlLCAweDA4MGMsIDB4YTZhYywgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwKKwkweDAwYTAsIDB4MDgwYywgMHgyZDRlLCAweDA4MGMsIDB4NzcyNCwgMHgwODBjLCAweDYwYWQsIDB4MDgwNCwKKwkweDc2YTQsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFiNCwgMHgxMTYwLCAweGMxYjUsIDB4MjEwMiwKKwkweDA4MGMsIDB4NzJiNiwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmQ0ZSwKKwkweDYwZTMsIDB4MDAwMCwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHg5MDA1LCAweDExMTgsIDB4NjgwOCwKKwkweDkwMDUsIDB4MDE4MCwgMHg2MDI4LCAweDkwODQsIDB4ZmRmZiwgMHg2MDJhLCAweDYwMjcsIDB4MDIwMCwKKwkweDIwNjksIDB4MTk4ZSwgMHg3MDAwLCAweDIwNmEsIDB4NzA5YiwgMHgwMDI3LCAweDcwMDMsIDB4MDAwMSwKKwkweDA4MDQsIDB4NzZhNCwgMHg2MDI3LCAweDFlMDAsIDB4MjAwOSwgMHgxZTAwLCAweDA4MGMsIDB4MmM3NiwKKwkweDYwMjQsIDB4OTEwYywgMHgwMWM4LCAweDkwODQsIDB4MWMwMCwgMHgxMWIwLCAweDFkMDQsIDB4NzY2MiwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwODBjLCAweDg1MTAsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZjksIDB4NzA3MCwKKwkweDAwZWUsIDB4OTAwNSwgMHgxOWY4LCAweDA0MDAsIDB4MDAyNiwgMHgyMDExLCAweDcyY2UsIDB4MDgwYywKKwkweDg1YjAsIDB4MjAxMSwgMHg3MmMxLCAweDA4MGMsIDB4ODY4YSwgMHgwMDJlLCAweDIwNjksIDB4MDE0MCwKKwkweDYwZTMsIDB4MDAwMCwgMHg3MGI0LCAweDkwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwKKwkweDY4ODYsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDQsIDB4MDgwYywgMHgyOGYwLCAweDYwZTIsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMWI0LCAweDIxMDIsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDBjNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywKKwkweGQzODEsIDB4MTkwNCwgMHg3NzEyLCAweDcxMzAsIDB4ZDE4NCwgMHgxMTcwLCAweDA4MGMsIDB4MzM3OCwKKwkweDAxMzgsIDB4YzE4ZCwgMHg3MTMyLCAweDIwMTEsIDB4MTg0OCwgMHgyMjE0LCAweGQyYWMsIDB4MTEyMCwKKwkweDcwMzAsIDB4ZDA4YywgMHgwOTA0LCAweDc3MTIsIDB4MjAxMSwgMHgxODQ4LCAweDIyMGMsIDB4ZDFhNCwKKwkweDA1MzgsIDB4MDAxNiwgMHgyMDE5LCAweDAwMGUsIDB4MDgwYywgMHhlNmFlLCAweDAxNTYsIDB4MDBiNiwKKwkweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDkxODYsIDB4MDA3ZSwgMHgwMWEwLCAweDkxODYsIDB4MDA4MCwKKwkweDAxODgsIDB4MDgwYywgMHg2Njk5LCAweDExNzAsIDB4MjEyMCwgMHg5MDA2LCAweDAwMTYsIDB4MjAwOSwKKwkweDAwMGUsIDB4MDgwYywgMHhlNzNhLCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAxMDAsIDB4MDgwYywKKwkweDg3OWEsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4NzZkYiwgMHgwMGJlLCAweDAxNWUsIDB4MDAxZSwKKwkweGQxYWMsIDB4MTE0OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweDMxZTksIDB4MDAxZSwgMHgwMDc4LCAweDAxNTYsIDB4MDBiNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDA4MGMsIDB4NjY5OSwgMHgxMTEwLCAweDA4MGMsIDB4NjBjNywgMHg4MTA4LCAweDFmMDQsIDB4NzcwOCwKKwkweDAwYmUsIDB4MDE1ZSwgMHgwODBjLCAweDFiMTEsIDB4MDgwYywgMHhhZWI0LCAweDYwZTMsIDB4MDAwMCwKKwkweDA4MGMsIDB4NjBhZCwgMHgwODBjLCAweDczNmEsIDB4MDBlZSwgMHgwMGNlLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MjAwMSwgMHgxOTdjLCAweDIwMDMsIDB4MDAwMSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxOTdjLCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDIwMDEsIDB4MTk3YiwKKwkweDIwMDMsIDB4YWFhYSwgMHgwMDA1LCAweDIwMDEsIDB4MTk3YiwgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwKKwkweDIwNzEsIDB4MThmYSwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTAxOCwKKwkweDA5MGMsIDB4MGRkNSwgMHhhOGFiLCAweGRjYjAsIDB4MjkwMCwgMHg3MDRlLCAweDA4MGMsIDB4MTAxOCwKKwkweDA5MGMsIDB4MGRkNSwgMHhhOGFiLCAweGRjYjAsIDB4MjkwMCwgMHg3MDUyLCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NmIsIDB4MDAwMSwgMHhhODlmLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwKKwkweDY4NDgsIDB4OTAwNSwgMHgxMTE4LCAweDkwODUsIDB4MDAwMSwgMHgwNGIwLCAweDY4NDAsIDB4OTAwNSwKKwkweDAxNTAsIDB4MDRhMSwgMHg2YTUwLCAweDkyMDAsIDB4NzAwMiwgMHg2ODU0LCAweDkxMDEsIDB4NzAwNiwKKwkweDkwMDYsIDB4NzAxMiwgMHg3MDE2LCAweDY4NTAsIDB4NzAwMiwgMHg2ODU0LCAweDcwMDYsIDB4Njg1OCwKKwkweDcwMGEsIDB4Njg1YywgMHg3MDBlLCAweDY4NDAsIDB4OTAwNSwgMHgxMTEwLCAweDcwMTIsIDB4NzAxNiwKKwkweDY4NDgsIDB4NzAxYSwgMHg3MDFjLCAweDkwODUsIDB4MDA0MCwgMHg3MDFlLCAweDIwMDEsIDB4MDAxOSwKKwkweDcwMzYsIDB4NzAyYiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmNywKKwkweDkxOGQsIDB4ODAwMCwgMHgyMTAyLCAweDAwZDYsIDB4MjA2OSwgMHgxOGZhLCAweDY4MDcsIDB4MDAwMSwKKwkweDAwZGUsIDB4MDgwYywgMHg3ZDExLCAweDkwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDkwMGUsIDB4MDE1NiwKKwkweDIwYTksIDB4MDAwNiwgMHg4MDAzLCAweDIwMTEsIDB4MDEwMCwgMHgyMjE0LCAweDkyOTYsIDB4MDAwOCwKKwkweDExMTAsIDB4ODE4ZCwgMHgwMDEwLCAweDgxZjUsIDB4M2UwOCwgMHgxZjA0LCAweDc3OWEsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MjA3OSwgMHgwMDQwLCAweDIwNzEsIDB4MThmYSwgMHg3MDA0LCAweDAwMDIsIDB4NzdiOSwKKwkweDc3YmEsIDB4NzdmMiwgMHg3ODRkLCAweDc5NWQsIDB4NzdiNywgMHg3N2I3LCAweDc5ODcsIDB4MDgwYywKKwkweDBkZDUsIDB4MDAwNSwgMHgyMDc5LCAweDAwNDAsIDB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywKKwkweDdkZjMsIDB4ZDBhNCwgMHgwMWY4LCAweDc4MjQsIDB4MjA0OCwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwKKwkweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOGEsIDB4MDA0MCwgMHgwNjEwLCAweDAwYzAsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwYywgMHg5MTg2LCAweDAwMDMsIDB4MTE2OCwgMHg3MDA0LCAweDAwMDIsIDB4NzdlMiwKKwkweDc3YmMsIDB4NzdlMiwgMHg3N2UwLCAweDc3ZTIsIDB4NzdlMiwgMHg3N2UyLCAweDc3ZTIsIDB4NzdlMiwKKwkweDA4MGMsIDB4Nzg0ZCwgMHg3ODJjLCAweGQwOWMsIDB4MDkwYywgMHg3ZDExLCAweDAwMDUsIDB4OTA4MiwKKwkweDAwNWEsIDB4MTIxOCwgMHgyMTAwLCAweDAwM2IsIDB4MGMxMCwgMHgwODBjLCAweDc4ODMsIDB4MGM5MCwKKwkweDAwZTMsIDB4MDhlOCwgMHgwMDA1LCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4YTUsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4ZiwKKwkweDc4ODMsIDB4N2E3OCwgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3OGE1LCAweDc4ODMsIDB4Nzg4ZiwKKwkweDdhYjksIDB4N2FmYSwgMHg3YjQxLCAweDdiNTUsIDB4Nzg4MywgMHg3ODgzLCAweDc4YTUsIDB4Nzg4ZiwKKwkweDc4YjksIDB4Nzg4MywgMHg3OTMxLCAweDdjMDAsIDB4N2MxYiwgMHg3ODgzLCAweDc4YTUsIDB4Nzg4MywKKwkweDc4YjksIDB4Nzg4MywgMHg3ODgzLCAweDc5MjcsIDB4N2MxYiwgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4Y2QsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywKKwkweDdkOTcsIDB4Nzg4MywgMHg3ZDQxLCAweDc4ODMsIDB4N2Q0MSwgMHg3ODgzLCAweDc4ZTIsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODgzLCAweDc4ODMsIDB4Nzg4MywgMHgyMDc5LCAweDAwNDAsIDB4NzAwNCwKKwkweDkwODYsIDB4MDAwMywgMHgxMTk4LCAweDc4MmMsIDB4MDgwYywgMHg3ZDNhLCAweGQwYTQsIDB4MDE3MCwKKwkweDc4MjQsIDB4MjA0OCwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwOGEsIDB4MDAxYSwgMHgxMjEwLCAweDAwMmIsIDB4MGM1MCwgMHgwMGU5LCAweDA4MGMsIDB4N2QxMSwKKwkweDAwMDUsIDB4Nzg4MywgMHg3ODhmLCAweDdhNjQsIDB4Nzg4MywgMHg3ODhmLCAweDc4ODMsIDB4Nzg4ZiwKKwkweDc4OGYsIDB4Nzg4MywgMHg3ODhmLCAweDdhNjQsIDB4Nzg4ZiwgMHg3ODhmLCAweDc4OGYsIDB4Nzg4ZiwKKwkweDc4OGYsIDB4Nzg4MywgMHg3ODhmLCAweDdhNjQsIDB4Nzg4MywgMHg3ODgzLCAweDc4OGYsIDB4Nzg4MywKKwkweDc4ODMsIDB4Nzg4MywgMHg3ODhmLCAweDAwZTYsIDB4MjA3MSwgMHgxOGZhLCAweDIwMDksIDB4MDQwMCwKKwkweDAwNzEsIDB4MDBlZSwgMHgwMDA1LCAweDIwMDksIDB4MTAwMCwgMHgwMDQ5LCAweDAwMDUsIDB4MjAwOSwKKwkweDIwMDAsIDB4MDAyOSwgMHgwMDA1LCAweDIwMDksIDB4MDgwMCwgMHgwMDA5LCAweDAwMDUsIDB4NzAwNywKKwkweDAwMDEsIDB4YTg2OCwgMHg5MDg0LCAweDAwZmYsIDB4OTEwNSwgMHhhODZhLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwKKwkweDAwZmYsIDB4MGQwOCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4N2EwNiwKKwkweDcwMDcsIDB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4N2EwNiwKKwkweDAwMDUsIDB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHgwOTY4LCAweDgwMDEsIDB4MTEyMCwKKwkweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDdhMjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwKKwkweDcwMTYsIDB4NzAxYSwgMHg3MDRiLCAweDdhMjEsIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwKKwkweDAwZmYsIDB4MDkwNCwgMHg3ODhiLCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwKKwkweDdhM2QsIDB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwKKwkweDdhM2QsIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMSwKKwkweDE5MDQsIDB4Nzg4YiwgMHg3MDA3LCAweDAwMDEsIDB4MjAwOSwgMHgxODM0LCAweDIxMGMsIDB4ODFmZiwKKwkweDExYTgsIDB4YTg2OCwgMHg5MDg0LCAweDAwZmYsIDB4YTg2YSwgMHhhODgzLCAweDAwMDAsIDB4MDgwYywKKwkweDYzNDQsIDB4MTEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4NjcsIDB4MDEzOSwKKwkweGE4N2EsIDB4YTk4MiwgMHgwODBjLCAweDZkMTcsIDB4MDEyZSwgMHgwY2EwLCAweGE5OTQsIDB4OTE4NiwKKwkweDAwNzEsIDB4MGQzOCwgMHg5MTg2LCAweDAwNjQsIDB4MGQyMCwgMHg5MTg2LCAweDAwN2MsIDB4MGQwOCwKKwkweDkxODYsIDB4MDAyOCwgMHgwOWYwLCAweDkxODYsIDB4MDAzOCwgMHgwOWQ4LCAweDkxODYsIDB4MDA3OCwKKwkweDA5YzAsIDB4OTE4NiwgMHgwMDVmLCAweDA5YTgsIDB4OTE4NiwgMHgwMDU2LCAweDA5OTAsIDB4YTg5NywKKwkweDQwMDUsIDB4YTg5YiwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDA4YTAsIDB4YTg3YywKKwkweDkwODQsIDB4MDBjMCwgMHg5MDg2LCAweDAwYzAsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwKKwkweDdjMzIsIDB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlMCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDMwLCAweDIwOTgsIDB4NzA1MCwgMHgyMDQwLCAweGEwNjAsIDB4MjBlOCwKKwkweGEwNWMsIDB4OTA4MCwgMHgwMDIzLCAweDIwYTAsIDB4NDAwMywgMHhhODg4LCAweDcwMTIsIDB4OTA4MiwKKwkweDA0MDEsIDB4MWEwNCwgMHg3ODkzLCAweGFhYjQsIDB4OTI4YSwgMHgwMDAyLCAweDFhMDQsIDB4Nzg5MywKKwkweDgyZmYsIDB4MTEzOCwgMHhhOGI4LCAweGE5YmMsIDB4OTEwNSwgMHgwMTE4LCAweDIwMDEsIDB4NzljNCwKKwkweDAwMTgsIDB4OTI4MCwgMHg3OWJhLCAweDIwMDUsIDB4NzA1NiwgMHg3MDEwLCAweDkwMTUsIDB4MDkwNCwKKwkweDc5YTUsIDB4MDgwYywgMHgxMDE4LCAweDExMTgsIDB4NzAwNywgMHgwMDA0LCAweDAwMDUsIDB4MjkwMCwKKwkweDcwMjIsIDB4NzA1NCwgMHgyMDYwLCAweGUwMDAsIDB4YTg2NiwgMHg3MDUwLCAweDIwNDAsIDB4YTk1YywKKwkweGUwMDQsIDB4OTEwMCwgMHhhMDc2LCAweGE4NjAsIDB4YTA3MiwgMHhlMDA4LCAweDkyMGEsIDB4MTIxMCwKKwkweDkwMGUsIDB4MjIwMCwgMHg3MTEyLCAweGUyMGMsIDB4ODAwMywgMHg4MDBiLCAweDkyOTYsIDB4MDAwNCwKKwkweDAxMDgsIDB4OTEwOCwgMHhhMTdhLCAweDgxMGIsIDB4YTE3ZSwgMHgwODBjLCAweDEwZTksIDB4YTA2YywKKwkweDkwOGUsIDB4MDEwMCwgMHgwMTcwLCAweDkwODYsIDB4MDIwMCwgMHgwMTE4LCAweDcwMDcsIDB4MDAwNywKKwkweDAwMDUsIDB4NzAyMCwgMHgyMDQ4LCAweDA4MGMsIDB4MTAzMSwgMHg3MDE0LCAweDIwNDgsIDB4MDgwNCwKKwkweDc4OTMsIDB4NzAyMCwgMHgyMDQ4LCAweDcwMTgsIDB4YTgwMiwgMHhhODA3LCAweDAwMDAsIDB4MjkwOCwKKwkweDIwNDgsIDB4YTkwNiwgMHg3MTFhLCAweDA4MDQsIDB4Nzk1ZCwgMHg3MDE0LCAweDIwNDgsIDB4NzAwNywKKwkweDAwMDEsIDB4YThiNCwgMHg5MDA1LCAweDExMjgsIDB4YThiOCwgMHhhOWJjLCAweDkxMDUsIDB4MDEwOCwKKwkweDAwYjksIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDFlLCAweDA5MDQsIDB4N2MzMiwKKwkweDA4MDQsIDB4N2EwNiwgMHg3OWJjLCAweDc5YzAsIDB4MDAwMiwgMHgwMDFkLCAweDAwMDcsIDB4MDAwNCwKKwkweDAwMGEsIDB4MDAxYiwgMHgwMDA1LCAweDAwMDYsIDB4MDAwYSwgMHgwMDFkLCAweDAwMDUsIDB4MDAwNCwKKwkweDAwNzYsIDB4MDA2NiwgMHhhZmI4LCAweGFlYmMsIDB4YTgwNCwgMHgyMDUwLCAweGIwYzAsIDB4YjBlMiwKKwkweGIwYmMsIDB4YjBkZSwgMHhiMGI4LCAweGIwZDIsIDB4YjBiNCwgMHhiMGNlLCAweGI2ZGEsIDB4YjdkNiwKKwkweGIwYjAsIDB4YjBjYSwgMHhiMGFjLCAweGIwYzYsIDB4YjBhOCwgMHhiMGJhLCAweGIwYTQsIDB4YjBiNiwKKwkweGI2YzIsIDB4YjdiZSwgMHhiMGEwLCAweGIwYjIsIDB4YjA5YywgMHhiMGFlLCAweGIwOTgsIDB4YjBhMiwKKwkweGIwOTQsIDB4YjA5ZSwgMHhiNmFhLCAweGI3YTYsIDB4YjA5MCwgMHhiMDlhLCAweGIwOGMsIDB4YjA5NiwKKwkweGIwODgsIDB4YjA4YSwgMHhiMDg0LCAweGIwODYsIDB4YjY5MiwgMHhiNzhlLCAweGIwODAsIDB4YjA4MiwKKwkweGIwN2MsIDB4YjA3ZSwgMHhiMDc4LCAweGIwNzIsIDB4YjA3NCwgMHhiMDZlLCAweGI2N2EsIDB4Yjc3NiwKKwkweGIwMDQsIDB4OTA1NSwgMHgxOTU4LCAweDAwNmUsIDB4MDA3ZSwgMHgwMDA1LCAweDIwMDksIDB4MTgzNCwKKwkweDIxMGMsIDB4ODFmZiwgMHgxMTc4LCAweDA4MGMsIDB4NjE0MSwgMHgxMTA4LCAweDAwMDUsIDB4MDgwYywKKwkweDZmNGEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhjZjdjLCAweDA4MGMsIDB4NmQxNywKKwkweDAxMmUsIDB4MGNhMCwgMHgwODBjLCAweGQzODEsIDB4MWQ3MCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwKKwkweDBjNzAsIDB4MjAwOSwgMHgxODM0LCAweDIxMGMsIDB4ODFmZiwgMHgxMTg4LCAweGE4ODgsIDB4OTAwNSwKKwkweDAxODgsIDB4YTg4MywgMHgwMDAwLCAweDA4MGMsIDB4NjFkMSwgMHgxMTA4LCAweDAwMDUsIDB4YTg3YSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweDBjYjgsIDB4MjAwMSwKKwkweDAwMjgsIDB4MGNhOCwgMHgyMDAxLCAweDAwMDAsIDB4MGM5MCwgMHgyMDA5LCAweDE4MzQsIDB4MjEwYywKKwkweDgxZmYsIDB4MTFkOCwgMHhhODg4LCAweDkwMDUsIDB4MDFlMCwgMHhhODgzLCAweDAwMDAsIDB4YTg3YywKKwkweGQwZjQsIDB4MDEyMCwgMHgwODBjLCAweDYyYTYsIDB4MTEzOCwgMHgwMDA1LCAweDkwMDYsIDB4YTg3YSwKKwkweDA4MGMsIDB4NjIxZSwgMHgxMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg3YSwKKwkweGE5ODIsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MGNiMCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwKKwkweDBjOTgsIDB4MjAwMSwgMHgwMDAwLCAweDBjODAsIDB4NzAxOCwgMHhhODAyLCAweDI5MDgsIDB4MjA0OCwKKwkweGE5MDYsIDB4NzExYSwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgwMTE4LCAweDcwMDcsIDB4MDAwMywKKwkweDAwMzAsIDB4NzAxNCwgMHgyMDQ4LCAweDcwMDcsIDB4MDAwMSwgMHg3MDQ4LCAweDA4MGYsIDB4MDAwNSwKKwkweDAwYjYsIDB4NzAwNywgMHgwMDAxLCAweGE5NzQsIDB4YTg3OCwgMHg5MDg0LCAweDAwZmYsIDB4OTA5NiwKKwkweDAwMDQsIDB4MDU0MCwgMHgyMGE5LCAweDAwMDEsIDB4OTA5NiwgMHgwMDAxLCAweDAxOTAsIDB4OTAwZSwKKwkweDIwYTksIDB4MDgwMCwgMHg5MDk2LCAweDAwMDIsIDB4MDE2MCwgMHg5MDA1LCAweDExZDgsIDB4YTk3NCwKKwkweDA4MGMsIDB4NjY5OSwgMHgxMWI4LCAweDAwNjYsIDB4YWU4MCwgMHgwODBjLCAweDY3YTksIDB4MDA2ZSwKKwkweDAwODgsIDB4MDA0NiwgMHgyMDExLCAweDE4MGMsIDB4MjIyNCwgMHhjNDg0LCAweDI0MTIsIDB4MDA0ZSwKKwkweDAwYzYsIDB4MDgwYywgMHg2Njk5LCAweDExMTAsIDB4MDgwYywgMHg2OGE5LCAweDgxMDgsIDB4MWYwNCwKKwkweDdhYTEsIDB4MDBjZSwgMHhhODdjLCAweGQwODQsIDB4MTEyMCwgMHgwODBjLCAweDEwMzEsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4NmEwOCwKKwkweDA1ODAsIDB4MjA2MSwgMHgxYTcwLCAweDYxMDAsIDB4ZDE4NCwgMHgwMTc4LCAweGE4ODgsIDB4OTA4NCwKKwkweDAwZmYsIDB4MTU1MCwgMHg2MDAwLCAweGQwODQsIDB4MDUyMCwgMHg2MDA0LCAweDkwMDUsIDB4MTUzOCwKKwkweDYwMDMsIDB4MDAwMCwgMHg2MDBiLCAweDAwMDAsIDB4MDBjOCwgMHgyMDExLCAweDAwMDEsIDB4YTg5MCwKKwkweDkwMDUsIDB4MTExMCwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMCwgMHg2MDE2LCAweGE4ODgsIDB4OTA4NCwKKwkweDAwZmYsIDB4MDE3OCwgMHg2MDA2LCAweGE4ODgsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDE0OCwKKwkweDYwMGEsIDB4YTg4OCwgMHg4MDAwLCAweDExMDgsIDB4YzI4ZCwgMHg2MjAyLCAweDAxMmUsIDB4MDgwNCwKKwkweDdjZmIsIDB4MDEyZSwgMHgwODA0LCAweDdjZjUsIDB4MDEyZSwgMHgwODA0LCAweDdjZWYsIDB4MDEyZSwKKwkweDA4MDQsIDB4N2NmMiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwYywKKwkweDZhMDgsIDB4MDVlMCwgMHgyMDYxLCAweDFhNzAsIDB4NjAwMCwgMHhkMDg0LCAweDA1YjgsIDB4NjIwNCwKKwkweDYzMDgsIDB4ZDA4YywgMHgxNTMwLCAweGFjNzgsIDB4OTQ4NCwgMHgwMDAzLCAweDAxNzAsIDB4YTk4OCwKKwkweDkxOGMsIDB4MDBmZiwgMHg4MDAxLCAweDExMjAsIDB4MjEwMCwgMHg5MjEwLCAweDA2MjAsIDB4MDAyOCwKKwkweDgwMDEsIDB4MTUwOCwgMHgyMTAwLCAweDkyMTIsIDB4MDJmMCwgMHg5NDg0LCAweDAwMGMsIDB4MDE4OCwKKwkweGE5ODgsIDB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4OTA4MiwgMHgwMDA0LCAweDExMjAsIDB4MjEwMCwKKwkweDkzMTgsIDB4MDI4OCwgMHgwMDMwLCAweDkwODIsIDB4MDAwNCwgMHgxMTY4LCAweDIxMDAsIDB4OTMxYSwKKwkweDAyNTAsIDB4YTg5MCwgMHg5MDA1LCAweDAxMTAsIDB4ODAwMCwgMHg2MDE2LCAweDYyMDYsIDB4NjMwYSwKKwkweDAxMmUsIDB4MDgwNCwgMHg3Y2ZiLCAweDAxMmUsIDB4MDgwNCwgMHg3Y2Y4LCAweDAxMmUsIDB4MDgwNCwKKwkweDdjZjUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4MWE3MCwKKwkweDYzMDAsIDB4ZDM4YywgMHgxMTIwLCAweDYzMDgsIDB4ODMxOCwgMHgwMjIwLCAweDYzMGEsIDB4MDEyZSwKKwkweDA4MDQsIDB4N2QwOSwgMHgwMTJlLCAweDA4MDQsIDB4N2NmOCwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4YTg3YywgMHhkMGFjLCAweDAxNDgsIDB4MDBjNiwKKwkweDIwNjEsIDB4MWE3MCwgMHg2MDAwLCAweDkwODQsIDB4ZmNmZiwgMHg2MDAyLCAweDAwY2UsIDB4MDQ0MCwKKwkweGE4ODgsIDB4OTAwNSwgMHgwNWQ4LCAweGE4OGMsIDB4OTA2NSwgMHgwNTk4LCAweDIwMDEsIDB4MTgzNCwKKwkweDIwMDQsIDB4OTAwNSwgMHgwMTE4LCAweDA4MGMsIDB4YWY3NCwgMHgwMDY4LCAweDYwMTcsIDB4ZjQwMCwKKwkweDYwNWIsIDB4MDAwMCwgMHhhOTdjLCAweGQxYTQsIDB4MDExMCwgMHhhOTgwLCAweDYxNWEsIDB4MjAwOSwKKwkweDAwNDEsIDB4MDgwYywgMHhhZmJlLCAweGE5ODgsIDB4OTE4YywgMHhmZjAwLCAweDkxODYsIDB4MjAwMCwKKwkweDExMzgsIDB4MDAyNiwgMHg5MDBlLCAweDIwMTEsIDB4ZmRmZiwgMHgwODBjLCAweDg3OWEsIDB4MDAyZSwKKwkweGE4N2MsIDB4ZDBjNCwgMHgwMTQ4LCAweDIwNjEsIDB4MWE3MCwgMHg2MDAwLCAweGQwOGMsIDB4MTEyMCwKKwkweDYwMDgsIDB4ODAwMCwgMHgwMjA4LCAweDYwMGEsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDgwNCwKKwkweDdjZmIsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDgwNCwgMHg3Y2Y1LCAweGE5ODQsIDB4OTE4NiwKKwkweDAwMmUsIDB4MGQzMCwgMHg5MTg2LCAweDAwMmQsIDB4MGQxOCwgMHg5MTg2LCAweDAwNDUsIDB4MDUxMCwKKwkweDkxODYsIDB4MDAyYSwgMHgxMTMwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxOTQsIDB4MjEwMiwKKwkweDA4YjgsIDB4OTE4NiwgMHgwMDIwLCAweDAxNTgsIDB4OTE4NiwgMHgwMDI5LCAweDFkMTAsIDB4YTk3NCwKKwkweDA4MGMsIDB4NjY5OSwgMHgxOTY4LCAweGI4MDAsIDB4YzBlNCwgMHhiODAyLCAweDA4NDgsIDB4YTg4YywKKwkweDkwNjUsIDB4MDliOCwgMHg2MDA3LCAweDAwMjQsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDQsIDB4NjAxYSwKKwkweDA4MDQsIDB4N2I5MCwgMHhhODhjLCAweDkwNjUsIDB4MDk2MCwgMHgwMGU2LCAweGE4OTAsIDB4OTA3NSwKKwkweDIwMDEsIDB4MTgzNCwgMHgyMDA0LCAweDkwMDUsIDB4MDE1MCwgMHgwODBjLCAweGFmNzQsIDB4OGVmZiwKKwkweDAxMTgsIDB4MmU2MCwgMHgwODBjLCAweGFmNzQsIDB4MDBlZSwgMHgwODA0LCAweDdiOTAsIDB4NjAyNCwKKwkweGMwZGMsIDB4YzBkNSwgMHg2MDI2LCAweDJlNjAsIDB4NjAwNywgMHgwMDNhLCAweGE4YTAsIDB4OTAwNSwKKwkweDAxMzAsIDB4NjAwNywgMHgwMDNiLCAweGE4YTQsIDB4NjAyZSwgMHhhOGE4LCAweDYwMTYsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwMGVlLCAweDA4MDQsIDB4N2I5MCwKKwkweDIwNjEsIDB4MWE3MCwgMHg2MDAwLCAweGQwODQsIDB4MDE5MCwgMHhkMDhjLCAweDE5MDQsIDB4N2QwOSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyMDQsIDB4ODIxMCwgMHgwMjIwLCAweDYyMDYsIDB4MDEyZSwKKwkweDA4MDQsIDB4N2QwOSwgMHgwMTJlLCAweGE4ODMsIDB4MDAxNiwgMHgwODA0LCAweDdkMDIsIDB4YTg4MywKKwkweDAwMDcsIDB4MDgwNCwgMHg3ZDAyLCAweGE4NjQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDEzMCwKKwkweDgwMDEsIDB4MTEzOCwgMHg3MDA3LCAweDAwMDEsIDB4MDA2OSwgMHgwMDA1LCAweDA4MGMsIDB4Nzg4YiwKKwkweDAwNDAsIDB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwKKwkweDdjMzIsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTAzZSwKKwkweDIwNjEsIDB4MTgwMCwgMHg2MWQwLCAweDgxZmYsIDB4MTkwNCwgMHg3Y2I0LCAweDYxMzAsIDB4ZDE5NCwKKwkweDE5MDQsIDB4N2NkZSwgMHhhODc4LCAweDIwNzAsIDB4OWU4MiwgMHgxY2QwLCAweDBhMDQsIDB4N2NhOCwKKwkweDYwNjgsIDB4OWUwMiwgMHgxYTA0LCAweDdjYTgsIDB4NzEyMCwgMHg5MTg2LCAweDAwMDYsIDB4MTkwNCwKKwkweDdjOWEsIDB4NzAxMCwgMHg5MDVkLCAweDA5MDQsIDB4N2NiNCwgMHhiODAwLCAweGQwZTQsIDB4MTkwNCwKKwkweDdjZDgsIDB4MjA2MSwgMHgxYTcwLCAweDYxMDAsIDB4OTE4NCwgMHgwMzAxLCAweDkwODYsIDB4MDAwMSwKKwkweDE1YTAsIDB4NzAyNCwgMHhkMGRjLCAweDE5MDQsIDB4N2NlMSwgMHhhODgzLCAweDAwMDAsIDB4YTgwMywKKwkweDAwMDAsIDB4MjkwOCwgMHg3MDE0LCAweDkwMDUsIDB4MTE5OCwgMHg3MTE2LCAweGE4N2MsIDB4ZDBmNCwKKwkweDE5MDQsIDB4N2NlNCwgMHgwODBjLCAweDU3NWQsIDB4ZDA5YywgMHgxMTE4LCAweGE4N2MsIDB4YzBjYywKKwkweGE4N2UsIDB4MmU2MCwgMHgwODBjLCAweDg2YmEsIDB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwKKwkweDIwNDgsIDB4YTgwMCwgMHg5MDA1LCAweDFkZTAsIDB4YTkwMiwgMHgyMTQ4LCAweGE4N2MsIDB4ZDBmNCwKKwkweDE5MDQsIDB4N2NlNCwgMHgwMTJlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMmUsIDB4MDBlZSwKKwkweGE4ODMsIDB4MDAwNiwgMHgwMGJlLCAweDA4MDQsIDB4N2QwMiwgMHhkMTg0LCAweDBkYjgsIDB4ZDFjNCwKKwkweDExOTAsIDB4MDBhMCwgMHhhOTc0LCAweDA4MGMsIDB4NjY5OSwgMHgxNWQwLCAweGI4MDAsIDB4ZDBlNCwKKwkweDE1YjgsIDB4NzEyMCwgMHg5MTg2LCAweDAwMDcsIDB4MTExOCwgMHhhODgzLCAweDAwMDIsIDB4MDQ5MCwKKwkweGE4ODMsIDB4MDAwOCwgMHgwNDc4LCAweGE4ODMsIDB4MDAwZSwgMHgwNDYwLCAweGE4ODMsIDB4MDAxNywKKwkweDA0NDgsIDB4YTg4MywgMHgwMDM1LCAweDA0MzAsIDB4MDgwYywgMHg1NzYxLCAweGQwZmMsIDB4MDFlOCwKKwkweGE4NzgsIDB4MjA3MCwgMHg5ZTgyLCAweDFjZDAsIDB4MDJjMCwgMHg2MDY4LCAweDllMDIsIDB4MTJhOCwKKwkweDcxMjAsIDB4OTE4NiwgMHgwMDA2LCAweDExODgsIDB4NzAxMCwgMHg5MDVkLCAweDAxNzAsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDE1OCwgMHgyMDM5LCAweDAwMDEsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDcsIDB4MTkwNCwKKwkweDdjM2UsIDB4NzAwMywgMHgwMDAyLCAweDA4MDQsIDB4N2MzZSwgMHhhODgzLCAweDAwMjgsIDB4MDAxMCwKKwkweGE4ODMsIDB4MDAyOSwgMHgwMTJlLCAweDAwZWUsIDB4MDBiZSwgMHgwNDIwLCAweGE4ODMsIDB4MDAyYSwKKwkweDBjYzgsIDB4YTg4MywgMHgwMDQ1LCAweDBjYjAsIDB4MmU2MCwgMHgyMDE5LCAweDAwMDIsIDB4NjAxYiwKKwkweDAwMTQsIDB4MDgwYywgMHhlMmMwLCAweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwOSwKKwkweDAwM2UsIDB4MDA1OCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHgyMDA5LCAweDAwMDYsIDB4MDAyOCwKKwkweDIwMDksIDB4MDAxNiwgMHgwMDEwLCAweDIwMDksIDB4MDAwMSwgMHhhODg0LCAweDkwODQsIDB4ZmYwMCwKKwkweDkxMDUsIDB4YTg4NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDgwYywgMHgxMDMxLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweDg2YjEsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDA0MCwKKwkweDcwMmMsIDB4ZDA4NCwgMHgwMWQ4LCAweDkwOGMsIDB4MDc4MCwgMHgxOTBjLCAweDdkZjMsIDB4ZDA5YywKKwkweDExYTgsIDB4MjA3MSwgMHgxODAwLCAweDcwYzAsIDB4OTBlYSwgMHgwMDIwLCAweDAyNzgsIDB4ODAwMSwKKwkweDcwYzIsIDB4NzAyYywgMHgyMDQ4LCAweGE4MDAsIDB4NzAyZSwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwKKwkweDIwNzEsIDB4MDA0MCwgMHgyOTAwLCAweDcwMjIsIDB4NzAyYywgMHgwYzI4LCAweDAxMmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMDA2LCAweDkwODQsIDB4MDc4MCwgMHgxOTBjLCAweDdkZjMsIDB4MDAwZSwKKwkweDAwMDUsIDB4YTg5OCwgMHg5MDg0LCAweDAwMDMsIDB4MDVhOCwgMHgwODBjLCAweGFlZWQsIDB4MDVkOCwKKwkweDI5MDAsIDB4NjAxNiwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMzUsIDB4MTEzOCwKKwkweDYwMDgsIDB4YzBmZCwgMHg2MDBhLCAweDIwMDEsIDB4MTk2YSwgMHgyMDA0LCAweDAwOTgsIDB4YThhMCwKKwkweDkwODQsIDB4MDBmZiwgMHhhOTljLCAweDkxOGMsIDB4ZmYwMCwgMHg5MTA1LCAweGE5OWMsIDB4OTE4YywKKwkweDAwZmYsIDB4MDgwYywgMHgyODdjLCAweDE1NDAsIDB4MDBiNiwgMHgwODBjLCAweDY2OTksIDB4MmIwMCwKKwkweDAwYmUsIDB4MTUxMCwgMHg2MDEyLCAweDYwMjMsIDB4MDAwMSwgMHgyMDA5LCAweDAwNDAsIDB4YTg2NCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMzUsIDB4MDExMCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywKKwkweGFmYmUsIDB4MDAwNSwgMHhhODdiLCAweDAxMDEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDZkMTcsIDB4MDEyZSwgMHgwMDA1LCAweGE4N2IsIDB4MDAyYywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4NmQxNywgMHgwMTJlLCAweDAwMDUsIDB4YTg3YiwgMHgwMDI4LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg2ZDE3LCAweDAxMmUsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwYzYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDBiNiwgMHg3MDA3LCAweDAwMDEsIDB4YWE3NCwKKwkweDkyODIsIDB4MDAwNCwgMHgxYTA0LCAweDdkZTQsIDB4YTk3YywgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwKKwkweDkwNWQsIDB4YjgwNCwgMHhkMjg0LCAweDAxNDAsIDB4MDVlOCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODQsIDB4MDAwNiwgMHgxMTA4LCAweDA0YjAsIDB4MmIxMCwgMHgwODBjLCAweGFlZWQsIDB4MTExOCwKKwkweDA4MGMsIDB4YWY5MSwgMHgwNWE4LCAweDYyMTIsIDB4YTg3NCwgMHgwMDAyLCAweDdkYzIsIDB4N2RjNywKKwkweDdkY2EsIDB4N2RkMCwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhlNmFlLCAweDAwNjAsIDB4MDgwYywKKwkweGU2NGEsIDB4MDA0OCwgMHgyMDE5LCAweDAwMDIsIDB4YTk4MCwgMHgwODBjLCAweGU2NjUsIDB4MDAxOCwKKwkweGE5ODAsIDB4MDgwYywgMHhlNjRhLCAweDA4MGMsIDB4YWY0MywgMHhhODg3LCAweDAwMDAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMTcsIDB4MDEyZSwgMHgwMGJlLCAweDAwMWUsIDB4MDAyZSwKKwkweDAwM2UsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4YTg4NywgMHgwMDA2LCAweDBjODAsIDB4YTg4NywKKwkweDAwMDIsIDB4MGM2OCwgMHhhODg3LCAweDAwMDUsIDB4MGM1MCwgMHhhODg3LCAweDAwMDQsIDB4MGMzOCwKKwkweGE4ODcsIDB4MDAwNywgMHgwYzIwLCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDdkZjUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MjAwMSwgMHg4MDAzLCAweDAwMDYsIDB4MDgwNCwgMHgwZGRlLCAweDIwMDEsIDB4MTgzNCwKKwkweDIwMDQsIDB4OTAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4MjAwMSwKKwkweDAyMDAsIDB4MjAwYywgMHhjMWU1LCAweGMxZGMsIDB4MjEwMiwgMHgyMDA5LCAweDAyMTgsIDB4MjEwYywKKwkweGQxZWMsIDB4MTEyMCwgMHgwODBjLCAweDE1OGMsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MDIwZCwKKwkweDIwMDMsIDB4MDAyMCwgMHg3ODFmLCAweDAzMDAsIDB4MDBmZSwgMHgwMDA1LCAweDc4MWMsIDB4ZDA4YywKKwkweDA5MDQsIDB4N2U3NSwgMHg2OGMwLCAweDkwYWEsIDB4MDAwNSwgMHgwYTA0LCAweDg0YjksIDB4N2Q0NCwKKwkweDdjNDAsIDB4OTU4NCwgMHgwMGY2LCAweDE1MTAsIDB4OTQ4NCwgMHg3MDAwLCAweDAxNDAsIDB4OTA4YSwKKwkweDIwMDAsIDB4MTI2MCwgMHg5NTg0LCAweDA3MDAsIDB4ODAwNywgMHgwODA0LCAweDdlN2MsIDB4NzAwMCwKKwkweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDgxMDAsIDB4MGRhOCwgMHgwMGIwLCAweDk0ODQsIDB4MGZmZiwKKwkweDExMzAsIDB4NzAwMCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHg4MTAwLCAweDExYzAsIDB4MDgwYywKKwkweGViNTEsIDB4MDgwYywgMHg4MzllLCAweDc4MTcsIDB4MDE0MCwgMHgwMGE4LCAweDk1ODQsIDB4MDA3NiwKKwkweDExMTgsIDB4MDgwYywgMHg4M2ZjLCAweDE5YzAsIDB4ZDVhNCwgMHgwMTQ4LCAweDAwNDYsIDB4MDA1NiwKKwkweDA4MGMsIDB4N2VkNywgMHgwODBjLCAweDIzNzUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwMjAsIDB4MDgwYywKKwkweGViNTEsIDB4NzgxNywgMHgwMTQwLCAweDA4MGMsIDB4NzQzZSwgMHgwMTY4LCAweDIwMDEsIDB4MDExMSwKKwkweDIwMDQsIDB4ZDA4YywgMHgwMTQwLCAweDY4OTMsIDB4MDAwMCwgMHgyMDAxLCAweDAxMTAsIDB4MjAwMywKKwkweDAwMDgsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4N2ViOCwgMHgyMDAxLCAweDE5ZWYsIDB4MjAwNCwKKwkweDkwMDUsIDB4MDkwYywgMHg5NzYzLCAweDAwMDUsIDB4MDAwMiwgMHg3ZThlLCAweDgxYTYsIDB4N2U4NSwKKwkweDdlODUsIDB4N2U4NSwgMHg3ZTg1LCAweDdlODUsIDB4N2U4NSwgMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwKKwkweDE5ZWYsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OTc2MywgMHgwMDA1LCAweDcwMDAsIDB4OTA4YywKKwkweGZmMDAsIDB4OTE5NCwgMHhmMDAwLCAweDgxMGYsIDB4OTQ4NCwgMHgwZmZmLCAweDY4OTIsIDB4OTI4NiwKKwkweDIwMDAsIDB4MTE1MCwgMHg2ODAwLCAweDkwODYsIDB4MDAwMSwgMHgxMTE4LCAweDA4MGMsIDB4NTdjMywKKwkweDAwNzAsIDB4MDgwYywgMHg3ZWY3LCAweDAwNTgsIDB4OTI4NiwgMHgzMDAwLCAweDExMTgsIDB4MDgwYywKKwkweDgwZGUsIDB4MDAyOCwgMHg5Mjg2LCAweDgwMDAsIDB4MTExMCwgMHgwODBjLCAweDgyYzUsIDB4NzgxNywKKwkweDAxNDAsIDB4MjAwMSwgMHgxOWVmLCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwOGMsIDB4MDE3OCwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwMywgMHgxMTQ4LCAweDAwMjYsIDB4MDAzNiwgMHgyMDExLCAweDgwNDgsIDB4MjUxOCwKKwkweDA4MGMsIDB4NGI3ZiwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwKKwkweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDIwMTksIDB4ZmZmZSwgMHg3YzMwLCAweDAwNTAsIDB4MDAzNiwKKwkweDAwNDYsIDB4MDA1NiwgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHg3ZDQ0LCAweDdjNDAsIDB4MjAxOSwKKwkweGZmZmYsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDA4YywgMHgwMTYwLCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAzLCAweDExMzAsIDB4MDAyNiwgMHgyMDExLCAweDgwNDgsIDB4MDgwYywKKwkweDRiN2YsIDB4MDAyZSwgMHgwMGZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwYzYsIDB4NzAxMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDk2LCAweDAwMDEsIDB4MDEyMCwKKwkweDkwOTYsIDB4MDAyMywgMHgxOTA0LCAweDgwYWYsIDB4OTE4NiwgMHgwMDIzLCAweDE1YzAsIDB4MDgwYywKKwkweDgzNjMsIDB4MDkwNCwgMHg4MGFmLCAweDYxMjAsIDB4OTE4NiwgMHgwMDAxLCAweDAxNTAsIDB4OTE4NiwKKwkweDAwMDQsIDB4MDEzOCwgMHg5MTg2LCAweDAwMDgsIDB4MDEyMCwgMHg5MTg2LCAweDAwMGEsIDB4MTkwNCwKKwkweDgwYWYsIDB4NzEyNCwgMHg2MTBhLCAweDcwMzAsIDB4OTA4ZSwgMHgwMjAwLCAweDExMzAsIDB4MjAwOSwKKwkweDAwMTUsIDB4MDgwYywgMHhhZmJlLCAweDA4MDQsIDB4ODBhZiwgMHg5MDhlLCAweDAyMTQsIDB4MDExOCwKKwkweDkwOGUsIDB4MDIxMCwgMHgxMTMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweGFmYmUsIDB4MDgwNCwKKwkweDgwYWYsIDB4OTA4ZSwgMHgwMTAwLCAweDE5MDQsIDB4ODBhZiwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwKKwkweDgwYWYsIDB4MjAwOSwgMHgwMDE2LCAweDA4MGMsIDB4YWZiZSwgMHgwODA0LCAweDgwYWYsIDB4OTE4NiwKKwkweDAwMjIsIDB4MTkwNCwgMHg4MGFmLCAweDcwMzAsIDB4OTA4ZSwgMHgwMzAwLCAweDE1ODAsIDB4NjhkYywKKwkweGQwYTQsIDB4MDUyOCwgMHhjMGI1LCAweDY4ZGUsIDB4NzEwMCwgMHg5MThjLCAweDAwZmYsIDB4Njk3ZSwKKwkweDcwMDQsIDB4Njg4MiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OWU2LCAweDc4ZWEsIDB4MDAwNiwKKwkweDkwODQsIDB4MDBmZiwgMHgwMDE2LCAweDIwMDgsIDB4MDgwYywgMHgyOGM1LCAweDc5MzIsIDB4NzkzNiwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMGZlLCAweDA4MGMsIDB4Mjg3YywgMHg2OTVlLCAweDcwM2MsIDB4MDBlNiwKKwkweDIwNzEsIDB4MDE0MCwgMHg3MDg2LCAweDIwNzEsIDB4MTgwMCwgMHg3MGI2LCAweDAwZWUsIDB4NzAzNCwKKwkweDkwMDUsIDB4MTkwNCwgMHg4MGFmLCAweDIwMDksIDB4MDAxNywgMHgwODA0LCAweDgwNWYsIDB4OTA4ZSwKKwkweDA0MDAsIDB4MTE5MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwgMHg4MGFmLCAweDA4MGMsIDB4NzQzZSwKKwkweDAxMjAsIDB4MjAwOSwgMHgwMDFkLCAweDA4MDQsIDB4ODA1ZiwgMHg2OGRjLCAweGMwYTUsIDB4NjhkZSwKKwkweDIwMDksIDB4MDAzMCwgMHgwODA0LCAweDgwNWYsIDB4OTA4ZSwgMHgwNTAwLCAweDExNDAsIDB4NzAzNCwKKwkweDkwMDUsIDB4MTkwNCwgMHg4MGFmLCAweDIwMDksIDB4MDAxOCwgMHgwODA0LCAweDgwNWYsIDB4OTA4ZSwKKwkweDIwMTAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMTksIDB4MDgwNCwgMHg4MDVmLCAweDkwOGUsIDB4MjExMCwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDFhLCAweDA4MDQsIDB4ODA1ZiwgMHg5MDhlLCAweDUyMDAsIDB4MTE0MCwKKwkweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDgwYWYsIDB4MjAwOSwgMHgwMDFiLCAweDA4MDQsIDB4ODA1ZiwKKwkweDkwOGUsIDB4NTAwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LCAweDgwYWYsIDB4MjAwOSwKKwkweDAwMWMsIDB4MDgwNCwgMHg4MDVmLCAweDkwOGUsIDB4MTMwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAzNCwKKwkweDA4MDQsIDB4ODA1ZiwgMHg5MDhlLCAweDEyMDAsIDB4MTE0MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwKKwkweDgwYWYsIDB4MjAwOSwgMHgwMDI0LCAweDA4MDQsIDB4ODA1ZiwgMHg5MDhjLCAweGZmMDAsIDB4OTE4ZSwKKwkweDI0MDAsIDB4MTE3MCwgMHgyMDA5LCAweDAwMmQsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDA5YywKKwkweDA5MDQsIDB4ODA1ZiwgMHgwODBjLCAweGRhODUsIDB4MTkwNCwgMHg4MGFmLCAweDA4MDQsIDB4ODA1ZCwKKwkweDkwOGMsIDB4ZmYwMCwgMHg5MThlLCAweDUzMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwNCwKKwkweDgwNWYsIDB4OTA4ZSwgMHgwZjAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDIwLCAweDA4MDQsIDB4ODA1ZiwKKwkweDkwOGUsIDB4NjEwNCwgMHgxNTMwLCAweDIwMjksIDB4MDIwNSwgMHgyMDExLCAweDAyNmQsIDB4ODIwOCwKKwkweDIyMDQsIDB4OTA4MiwgMHgwMDA0LCAweDgwMDQsIDB4ODAwNCwgMHgyMGE4LCAweDIwMTEsIDB4ODAxNSwKKwkweDIxMWMsIDB4ODEwOCwgMHgwMDQ2LCAweDIxMjQsIDB4MDgwYywgMHg0YjdmLCAweDAwNGUsIDB4ODEwOCwKKwkweDBmMDQsIDB4ODAxMywgMHg5MTg2LCAweDAyODAsIDB4MWQ4OCwgMHgyNTA0LCAweDgwMDAsIDB4MjAyYSwKKwkweDIwMDksIDB4MDI2MCwgMHgwYzU4LCAweDIwMmIsIDB4MDAwMCwgMHgyMDA5LCAweDAwMjMsIDB4MDgwNCwKKwkweDgwNWYsIDB4OTA4ZSwgMHg2MDAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDNmLCAweDA4MDQsIDB4ODA1ZiwKKwkweDkwOGUsIDB4NTQwMCwgMHgxMTM4LCAweDA4MGMsIDB4ODQ2OSwgMHgxOTA0LCAweDgwYWYsIDB4MjAwOSwKKwkweDAwNDYsIDB4MDRhOCwgMHg5MDhlLCAweDU1MDAsIDB4MTE0OCwgMHgwODBjLCAweDg0OTEsIDB4MTExOCwKKwkweDIwMDksIDB4MDA0MSwgMHgwNDYwLCAweDIwMDksIDB4MDA0MiwgMHgwNDQ4LCAweDkwOGUsIDB4NzgwMCwKKwkweDExMTgsIDB4MjAwOSwgMHgwMDQ1LCAweDA0MTgsIDB4OTA4ZSwgMHgxMDAwLCAweDExMTgsIDB4MjAwOSwKKwkweDAwNGUsIDB4MDBlOCwgMHg5MDhlLCAweDYzMDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNGEsIDB4MDBiOCwKKwkweDkwOGMsIDB4ZmYwMCwgMHg5MThlLCAweDU2MDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNGYsIDB4MDA3OCwKKwkweDkwOGMsIDB4ZmYwMCwgMHg5MThlLCAweDU3MDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNTAsIDB4MDAzOCwKKwkweDIwMDksIDB4MDAxZCwgMHg2ODM4LCAweGQwZDQsIDB4MDExMCwgMHgyMDA5LCAweDAwNGMsIDB4MDAxNiwKKwkweDIwMTEsIDB4MDI2MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4N2MsIDB4MTkwNCwKKwkweDgwYjIsIDB4MDgwYywgMHg2NjM4LCAweDE5MDQsIDB4ODBiMiwgMHhiZTEyLCAweGJkMTYsIDB4MDAxZSwKKwkweDAwMTYsIDB4MDgwYywgMHg3NDNlLCAweDAxYzAsIDB4NjhkYywgMHhkMDhjLCAweDExNDgsIDB4NzAwMCwKKwkweDkwODQsIDB4MDBmZiwgMHgxMTg4LCAweDcwMDQsIDB4OTA4NCwgMHhmZjAwLCAweDExNjgsIDB4MDA0MCwKKwkweDY4N2MsIDB4OTYwNiwgMHgxMTQ4LCAweDY4ODAsIDB4OTUwNiwgMHg5MDg0LCAweGZmMDAsIDB4MTEyMCwKKwkweDk1ODQsIDB4MDBmZiwgMHhiOGMyLCAweDAwODAsIDB4YjhjMCwgMHg5MDA1LCAweDExNjgsIDB4OTE4NiwKKwkweDAwNDYsIDB4MTE1MCwgMHg2ODdjLCAweDk2MDYsIDB4MTEzOCwgMHg2ODgwLCAweDk1MDYsIDB4OTA4NCwKKwkweGZmMDAsIDB4MTExMCwgMHgwMDFlLCAweDAwOTgsIDB4MDgwYywgMHhhZWVkLCAweDAxYTgsIDB4MmIwOCwKKwkweDYxMTIsIDB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDkxODYsIDB4MDA0YywKKwkweDExMTAsIDB4NjAyMywgMHgwMDBhLCAweDAwMTYsIDB4MDAxZSwgMHgwODBjLCAweGFmYmUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMDFlLCAweDBjZDgsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBlYywKKwkweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4NGI3ZiwgMHgwODBjLCAweGFmOTEsIDB4MGQ5MCwKKwkweDJiMDgsIDB4NjExMiwgMHg2MDIzLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4MDAxNiwKKwkweDkxODYsIDB4MDAxNywgMHgwMTE4LCAweDkxODYsIDB4MDAzMCwgMHgxMTI4LCAweDYwMDcsIDB4MDAwOSwKKwkweDYwMTcsIDB4MjkwMCwgMHgwMDIwLCAweDYwMDcsIDB4MDA1MSwgMHg2MDE3LCAweDAwMDAsIDB4NjAyZiwKKwkweDAwMDksIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwOGEwLCAweDA4MGMsIDB4ODRkOCwKKwkweDExNTgsIDB4MDgwYywgMHgzMzQyLCAweDExNDAsIDB4NzAxMCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywKKwkweDkwOGUsIDB4MDAwOCwgMHgxMTA4LCAweDAwMDksIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDA0NiwKKwkweDcwMDAsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwgMHgwMDMzLCAweDExZTgsIDB4MDgwYywKKwkweDgzNjMsIDB4MDkwNCwgMHg4MTNlLCAweDcxMjQsIDB4NjEwYSwgMHg3MDMwLCAweDkwOGUsIDB4MDIwMCwKKwkweDExNDAsIDB4NzAzNCwgMHg5MDA1LCAweDE1ZDAsIDB4MjAwOSwgMHgwMDE1LCAweDA4MGMsIDB4YWZiZSwKKwkweDA0YTgsIDB4OTA4ZSwgMHgwMTAwLCAweDE1OTAsIDB4NzAzNCwgMHg5MDA1LCAweDE1NzgsIDB4MjAwOSwKKwkweDAwMTYsIDB4MDgwYywgMHhhZmJlLCAweDA0NTAsIDB4OTE4NiwgMHgwMDMyLCAweDE1MzgsIDB4NzAzMCwKKwkweDkwOGUsIDB4MTQwMCwgMHgxNTE4LCAweDIwMDksIDB4MDAzOCwgMHgwMDE2LCAweDIwMTEsIDB4MDI2MywKKwkweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4Mjg3YywgMHgxMWI4LCAweDA4MGMsIDB4NjYzOCwKKwkweDExYTAsIDB4YmUxMiwgMHhiZDE2LCAweDA4MGMsIDB4YWVlZCwgMHgwMTc4LCAweDJiMDgsIDB4NjExMiwKKwkweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDAwMWUsIDB4MDgwYywKKwkweGFmYmUsIDB4MDgwYywgMHg5NzYzLCAweDAwMTAsIDB4MDBjZSwgMHgwMDFlLCAweDAwNGUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwNDYsIDB4MDBlNiwgMHgwMGQ2LCAweDIwMjgsIDB4MjEzMCwKKwkweDk2OTYsIDB4MDBmZiwgMHgxMWI4LCAweDk1OTIsIDB4ZmZmYywgMHgwMmEwLCAweDk1OTYsIDB4ZmZmZCwKKwkweDExMjAsIDB4MjAwOSwgMHgwMDdmLCAweDA4MDQsIDB4ODFhMCwgMHg5NTk2LCAweGZmZmUsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA3ZSwgMHgwODA0LCAweDgxYTAsIDB4OTU5NiwgMHhmZmZjLCAweDExMTgsIDB4MjAwOSwKKwkweDAwODAsIDB4MDRmMCwgMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHgxODM3LCAweDIzMWMsIDB4ZDNhYywKKwkweDAxMzAsIDB4OTAyNiwgMHgyMGE5LCAweDA4MDAsIDB4MjA3MSwgMHgxMDAwLCAweDAwMzAsIDB4MjAyMSwKKwkweDAwODEsIDB4MjBhOSwgMHgwNzdmLCAweDIwNzEsIDB4MTA4MSwgMHgyZTFjLCAweDkzZGQsIDB4MDAwMCwKKwkweDExNDAsIDB4ODJmZiwgMHgxMWQwLCAweDk0OTYsIDB4MDBmZiwgMHgwMWI4LCAweDI0MTAsIDB4YzJmZCwKKwkweDAwYTAsIDB4YmYxMCwgMHgyNjAwLCAweDk3MDYsIDB4YjgxNCwgMHgxMTIwLCAweDk1NDYsIDB4MTExMCwKKwkweDI0MDgsIDB4MDBiMCwgMHg5NzQ1LCAweDExNDgsIDB4OTRjNiwgMHgwMDdlLCAweDAxMzAsIDB4OTRjNiwKKwkweDAwN2YsIDB4MDExOCwgMHg5NGM2LCAweDAwODAsIDB4MWQyMCwgMHg4NDIwLCAweDhlNzAsIDB4MWYwNCwKKwkweDgxNzUsIDB4ODJmZiwgMHgxMTE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDE4LCAweGMyZmMsIDB4MjIwOCwKKwkweDkwMDYsIDB4MDBkZSwgMHgwMGVlLCAweDAwNGUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzNywKKwkweDIwMGMsIDB4OTE4NCwgMHgwMDgwLCAweDAxMTAsIDB4ZDE4YywgMHgwMTM4LCAweDcwMDAsIDB4OTA4YywKKwkweGZmMDAsIDB4ODEwZiwgMHg5MTg0LCAweDAwMGYsIDB4MDA0YSwgMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwKKwkweDE5ZWYsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OTc2MywgMHgwMDA1LCAweDgxY2UsIDB4ODFjZSwKKwkweDgxY2UsIDB4ODM3NSwgMHg4MWNlLCAweDgxZDcsIDB4ODIwMiwgMHg4MjkwLCAweDgxY2UsIDB4ODFjZSwKKwkweDgxY2UsIDB4ODFjZSwgMHg4MWNlLCAweDgxY2UsIDB4ODFjZSwgMHg4MWNlLCAweDc4MTcsIDB4MDE0MCwKKwkweDIwMDEsIDB4MTllZiwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHg5NzYzLCAweDAwMDUsIDB4MDBiNiwKKwkweDcxMTAsIDB4ZDFiYywgMHgwMWU4LCAweDcxMjAsIDB4MjE2MCwgMHg5YzhjLCAweDAwMDcsIDB4MTFjMCwKKwkweDljOGEsIDB4MWNkMCwgMHgwMmE4LCAweDY4NjgsIDB4OWMwMiwgMHgxMjkwLCAweDcwMDgsIDB4OTA4NCwKKwkweDAwZmYsIDB4NjExMCwgMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwgMHgxMTUwLCAweDcwMGMsIDB4YjkxNCwKKwkweDkxMDYsIDB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ2LCAweDA4MGMsIDB4YWZiZSwKKwkweDc4MTcsIDB4MDE0MCwgMHgyMDAxLCAweDE5ZWYsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OTc2MywKKwkweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4OTQ4NCwgMHgwZmZmLCAweDA5MDQsIDB4ODI2NiwKKwkweDcxMTAsIDB4ZDFiYywgMHgxOTA0LCAweDgyNjYsIDB4NzEwOCwgMHg3MDBjLCAweDIwMjgsIDB4OTE4YywKKwkweDAwZmYsIDB4MjEzMCwgMHg5MDk0LCAweGZmMDAsIDB4MTViMCwgMHg4MWZmLCAweDE1YTAsIDB4OTA4MCwKKwkweDMzODQsIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMDAxLCAweDAwODAsIDB4OTEwNiwKKwkweDA5MDQsIDB4ODI2NiwgMHgwODBjLCAweDY2MzgsIDB4MTkwNCwgMHg4MjY2LCAweGJlMTIsIDB4YmQxNiwKKwkweGI4MDAsIDB4ZDBlYywgMHgxNWQ4LCAweGJhMDQsIDB4OTI5NCwgMHhmZjAwLCAweDkyODYsIDB4MDYwMCwKKwkweDExYTAsIDB4MDgwYywgMHhhZWVkLCAweDA1ZTgsIDB4MmIwOCwgMHg3MDI4LCAweDYwNDYsIDB4NzAyYywKKwkweDYwNGEsIDB4NjExMiwgMHg2MDIzLCAweDAwMDYsIDB4NzEyMCwgMHg2MTBhLCAweDcxMzAsIDB4NjE1NiwKKwkweDIwMDksIDB4MDA0NCwgMHgwODBjLCAweGRjZTUsIDB4MDQwOCwgMHgwODBjLCAweDZhMGMsIDB4MTEzOCwKKwkweGI4MDcsIDB4MDYwNiwgMHgwYzMwLCAweDE5MGMsIDB4ODE0MiwgMHgxMWMwLCAweDA4OTgsIDB4MDgwYywKKwkweGFlZWQsIDB4MmIwOCwgMHgwMTk4LCAweDYxMTIsIDB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwKKwkweDkyODYsIDB4MDQwMCwgMHgxMTE4LCAweDYwMDcsIDB4MDAwNSwgMHgwMDEwLCAweDYwMDcsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDc4MTcsIDB4MDE0MCwKKwkweDIwMDEsIDB4MTllZiwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHg5NzYzLCAweDAwY2UsIDB4MDBiZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODBlLCAweDIwMDQsIDB4ZDBlYywgMHgwMTIwLCAweDIwMTEsIDB4ODA0OSwKKwkweDA4MGMsIDB4NGI3ZiwgMHgwODBjLCAweGFmOTEsIDB4MGQ0OCwgMHgyYjA4LCAweDYxMTIsIDB4NjAyMywKKwkweDAwMDYsIDB4NzEyMCwgMHg2MTBhLCAweDcxMzAsIDB4NjE1NiwgMHg2MDE3LCAweGYzMDAsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDQxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDhiMCwKKwkweDAwYjYsIDB4NzExMCwgMHhkMWJjLCAweDAxZTgsIDB4NzAyMCwgMHgyMDYwLCAweDljODQsIDB4MDAwNywKKwkweDExYzAsIDB4OWM4MiwgMHgxY2QwLCAweDAyYTgsIDB4Njg2OCwgMHg5YzAyLCAweDEyOTAsIDB4NzAwOCwKKwkweDkwODQsIDB4MDBmZiwgMHg2MTEwLCAweDIxNTgsIDB4YjkxMCwgMHg5MTA2LCAweDExNTAsIDB4NzAwYywKKwkweGI5MTQsIDB4OTEwNiwgMHgxMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwNDUsIDB4MDgwYywKKwkweGFmYmUsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsIDB4MTllZiwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywKKwkweDk3NjMsIDB4MDBiZSwgMHgwMDA1LCAweDYxMjAsIDB4OTE4NiwgMHgwMDAyLCAweDAxMjgsIDB4OTE4NiwKKwkweDAwMDUsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDg0ZDgsIDB4MTE4MCwKKwkweDA4MGMsIDB4MzM0MiwgMHgxMTY4LCAweDcwMTAsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4NiwKKwkweDAwMDAsIDB4MTEzMCwgMHg5MTg0LCAweDAwMGYsIDB4OTA4YSwgMHgwMDA2LCAweDEyMDgsIDB4MDAwYiwKKwkweDAwMDUsIDB4ODJkZiwgMHg4MmUwLCAweDgyZGYsIDB4ODJkZiwgMHg4MzQ1LCAweDgzNTQsIDB4MDAwNSwKKwkweDAwYjYsIDB4NzAwYywgMHg3MTA4LCAweDA4MGMsIDB4Mjg3YywgMHgxOTA0LCAweDgzNDMsIDB4MDgwYywKKwkweDY2MzgsIDB4MTkwNCwgMHg4MzQzLCAweGJlMTIsIDB4YmQxNiwgMHg3MTEwLCAweGQxYmMsIDB4MDU0MCwKKwkweDcwMmMsIDB4ZDA4NCwgMHgxMTIwLCAweGI4MDAsIDB4ZDBiYywgMHgxOTA0LCAweDgzNDMsIDB4MDgwYywKKwkweDZhMGMsIDB4MDE0OCwgMHg5MDg2LCAweDAwMDQsIDB4MDEzMCwgMHgwODBjLCAweDZhMTQsIDB4MDExOCwKKwkweDkwODYsIDB4MDAwNCwgMHgxNTg4LCAweDAwYzYsIDB4MDgwYywgMHg4MzYzLCAweDAwY2UsIDB4MDVkOCwKKwkweDA4MGMsIDB4YWVlZCwgMHgyYjA4LCAweDA1YjgsIDB4NjExMiwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywKKwkweDAwMDIsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgwODBjLCAweGFmYmUsIDB4MDQ1OCwKKwkweDA4MGMsIDB4NmEwYywgMHgwMTQ4LCAweDkwODYsIDB4MDAwNCwgMHgwMTMwLCAweDA4MGMsIDB4NmExNCwKKwkweDAxMTgsIDB4OTA4NiwgMHgwMDA0LCAweDExODAsIDB4MDgwYywgMHhhZWVkLCAweDJiMDgsIDB4MDFkOCwKKwkweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwNSwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwKKwkweDAwODgsIDB4MDgwYywgMHhhZmJlLCAweDAwNzgsIDB4MDgwYywgMHhhZWVkLCAweDJiMDgsIDB4MDE1OCwKKwkweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDgwYywgMHhhZmJlLCAweDAwYmUsIDB4MDAwNSwgMHg3MTEwLCAweGQxYmMsIDB4MDE1OCwKKwkweDAwZDEsIDB4MDE0OCwgMHgwODBjLCAweDgyYmIsIDB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwKKwkweDAwODksIDB4MDgwYywgMHhhZmJlLCAweDAwMDUsIDB4NzExMCwgMHhkMWJjLCAweDAxNTgsIDB4MDA1OSwKKwkweDAxNDgsIDB4MDgwYywgMHg4MmJiLCAweDExMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA4YSwKKwkweDA4MGMsIDB4YWZiZSwgMHgwMDA1LCAweDcwMjAsIDB4MjA2MCwgMHg5Yzg0LCAweDAwMDcsIDB4MTE1OCwKKwkweDljODIsIDB4MWNkMCwgMHgwMjQwLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MTIxOCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDkwMDYsIDB4MGNlOCwgMHgwMGI2LCAweDcxMTAsIDB4ZDFiYywKKwkweDExZDgsIDB4NzAyNCwgMHgyMDYwLCAweDljODQsIDB4MDAwNywgMHgxMWIwLCAweDljODIsIDB4MWNkMCwKKwkweDAyOTgsIDB4Njg2OCwgMHg5YzAyLCAweDEyODAsIDB4NzAwOCwgMHg5MDg0LCAweDAwZmYsIDB4NjExMCwKKwkweDIxNTgsIDB4YjkxMCwgMHg5MTA2LCAweDExNDAsIDB4NzAwYywgMHhiOTE0LCAweDkxMDYsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA1MSwgMHgwODBjLCAweGFmYmUsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsIDB4MTllZiwKKwkweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDk3NjMsIDB4MDBiZSwgMHgwMDA1LCAweDIwMzEsIDB4MDEwNSwKKwkweDAwNjksIDB4MDAwNSwgMHgyMDMxLCAweDAyMDYsIDB4MDA0OSwgMHgwMDA1LCAweDIwMzEsIDB4MDIwNywKKwkweDAwMjksIDB4MDAwNSwgMHgyMDMxLCAweDAyMTMsIDB4MDAwOSwgMHgwMDA1LCAweDAwYzYsIDB4MDA5NiwKKwkweDAwZjYsIDB4NzAwMCwgMHg5MDg0LCAweGYwMDAsIDB4OTA4NiwgMHhjMDAwLCAweDA1ZDAsIDB4MDgwYywKKwkweGFlZWQsIDB4MDViOCwgMHgwMDY2LCAweDAwYzYsIDB4MDA0NiwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwKKwkweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4N2MsIDB4MTVhMCwgMHgwODBjLCAweDY2MzgsIDB4MTU4OCwKKwkweGJlMTIsIDB4YmQxNiwgMHgyYjAwLCAweDAwNGUsIDB4MDBjZSwgMHg2MDEyLCAweDA4MGMsIDB4ZDEwMiwKKwkweDA4MGMsIDB4MGZmZiwgMHgwNTEwLCAweDI5MDAsIDB4NjA1YSwgMHg5MDA2LCAweGE4MDIsIDB4YTg2NiwKKwkweGFjNmEsIDB4YTg1YywgMHg5MGY4LCAweDAwMWIsIDB4MjBhOSwgMHgwMDBlLCAweGE4NjAsIDB4MjBlOCwKKwkweDIwZTEsIDB4MDAwMCwgMHgyZmEwLCAweDJlOTgsIDB4NDAwMywgMHgwMDZlLCAweDY2MTYsIDB4NjAwNywKKwkweDAwM2UsIDB4NjAyMywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywKKwkweDk3NjMsIDB4MDBmZSwgMHgwMDllLCAweDAwY2UsIDB4MDAwNSwgMHgwODBjLCAweGFmNDMsIDB4MDA2ZSwKKwkweDBjYzAsIDB4MDA0ZSwgMHgwMGNlLCAweDBjYzgsIDB4MDBjNiwgMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwKKwkweDkxODQsIDB4ZjAwMCwgMHg4MTBmLCAweDkwODYsIDB4MjAwMCwgMHgxOTA0LCAweDg0NTMsIDB4OTE4NiwKKwkweDAwMjIsIDB4MTVmMCwgMHgyMDAxLCAweDAxMTEsIDB4MjAwNCwgMHg5MDA1LCAweDE5MDQsIDB4ODQ1NSwKKwkweDcwMzAsIDB4OTA4ZSwgMHgwNDAwLCAweDA5MDQsIDB4ODQ1NSwgMHg5MDhlLCAweDYwMDAsIDB4MDVlOCwKKwkweDkwOGUsIDB4NTQwMCwgMHgwNWQwLCAweDkwOGUsIDB4MDMwMCwgMHgxMWQ4LCAweDIwMDksIDB4MTgzNywKKwkweDIxMGMsIDB4ZDE4YywgMHgxNTkwLCAweGQxYTQsIDB4MTU4MCwgMHgwODBjLCAweDY5Y2EsIDB4MDU4OCwKKwkweDY4YjAsIDB4OTA4NCwgMHgwMGZmLCAweDcxMDAsIDB4OTE4YywgMHgwMGZmLCAweDkxMDYsIDB4MTUxOCwKKwkweDY4ODAsIDB4NjliMCwgMHg5MThjLCAweGZmMDAsIDB4OTEwNSwgMHg3MTA0LCAweDkxMDYsIDB4MTFkOCwKKwkweDAwZTAsIDB4MjAwOSwgMHgwMTAzLCAweDIxMGMsIDB4ZDFiNCwgMHgxMWE4LCAweDkwOGUsIDB4NTIwMCwKKwkweDA5ZTgsIDB4OTA4ZSwgMHgwNTAwLCAweDA5ZDAsIDB4OTA4ZSwgMHg1MDAwLCAweDA5YjgsIDB4MDA1OCwKKwkweDkxODYsIDB4MDAyMywgMHgxMTQwLCAweDA4MGMsIDB4ODM2MywgMHgwMTI4LCAweDYwMDQsIDB4OTA4NiwKKwkweDAwMDIsIDB4MDExOCwgMHgwMDAwLCAweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwKKwkweDAwMDUsIDB4NzAzMCwgMHg5MDhlLCAweDAzMDAsIDB4MDExOCwgMHg5MDhlLCAweDUyMDAsIDB4MWQ5OCwKKwkweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweDkwODQsIDB4MDAwOSwgMHg5MDg2LCAweDAwMDgsIDB4MGQ2OCwKKwkweDBjNTAsIDB4MDE1NiwgMHgwMDQ2LCAweDAwMTYsIDB4MDAzNiwgMHg3MDM4LCAweDIwMjAsIDB4ODQyNywKKwkweDk0YTQsIDB4MDAwNywgMHhkNDg0LCAweDAxNDgsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwKKwkweDIwMTEsIDB4MDI3YSwgMHgwODBjLCAweGJlZmQsIDB4MTE3OCwgMHhkNDhjLCAweDAxNDgsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjAxOSwgMHgxODAxLCAweDIwMTEsIDB4MDI3ZSwgMHgwODBjLCAweGJlZmQsIDB4MTEyMCwKKwkweGQ0OTQsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAzZSwgMHgwMDFlLCAweDAwNGUsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDE1NiwgMHgwMDQ2LCAweDAwMTYsIDB4MDAzNiwgMHg3MDM4LCAweDIwMjAsIDB4ODQyNywKKwkweDk0YTQsIDB4MDAwNywgMHhkNDg0LCAweDAxNDgsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwKKwkweDIwMTEsIDB4MDI3MiwgMHgwODBjLCAweGJlZmQsIDB4MTE3OCwgMHhkNDhjLCAweDAxNDgsIDB4MjBhOSwKKwkweDAwMDQsIDB4MjAxOSwgMHgxODAxLCAweDIwMTEsIDB4MDI3NiwgMHgwODBjLCAweGJlZmQsIDB4MTEyMCwKKwkweGQ0OTQsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAzZSwgMHgwMDFlLCAweDAwNGUsIDB4MDE1ZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4NzgwMCwgMHhjMGU1LCAweGMwY2MsIDB4NzgwMiwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3ODM0LCAweGQwODQsIDB4MTEzMCwKKwkweDIwNzksIDB4MDIwMCwgMHg3ODAwLCAweDkwODUsIDB4MTIwMCwgMHg3ODAyLCAweDAwZmUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDcwMzQsIDB4YzA4NCwgMHg3MDM2LCAweDAwZWUsIDB4MDAwNSwKKwkweDAwMTYsIDB4MjAwMSwgMHgxODM3LCAweDIwMGMsIDB4OTE4NCwgMHgwMDgwLCAweDAxMTgsIDB4ZDE4YywKKwkweDAxMTgsIDB4OTAwNiwgMHgwMDFlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDgsIDB4MjA3MSwKKwkweDE5ZjksIDB4NzAwMywgMHgwMDAzLCAweDcwMGYsIDB4MDM2MSwgMHg5MDA2LCAweDcwMWEsIDB4NzA3MiwKKwkweDcwMTIsIDB4NzAxNywgMHgxY2QwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI2LCAweDcwMmIsIDB4YTM2YywKKwkweDcwMzIsIDB4NzAzNywgMHhhM2Q0LCAweDcwM2YsIDB4ZmZmZiwgMHg3MDQyLCAweDcwNDcsIDB4NTVlZiwKKwkweDcwNGEsIDB4NzA1YiwgMHg4NjUxLCAweDA4MGMsIDB4MTAxOCwgMHgwOTBjLCAweDBkZDUsIDB4MjkwMCwKKwkweDcwM2EsIDB4YTg2NywgMHgwMDAzLCAweGE4NmYsIDB4MDEwMCwgMHhhOGFiLCAweGRjYjAsIDB4MDAwNSwKKwkweDIwNzEsIDB4MTlmOSwgMHgxZDA0LCAweDg1OWYsIDB4MjA5MSwgMHg2MDAwLCAweDcwMGMsIDB4ODAwMSwKKwkweDcwMGUsIDB4MTUzMCwgMHgyMDAxLCAweDAxM2MsIDB4MjAwNCwgMHg5MDA1LCAweDE5MGMsIDB4ODY5NiwKKwkweDIwMDEsIDB4MTg2OSwgMHgyMDA0LCAweGQwYzQsIDB4MDE1OCwgMHgzYTAwLCAweGQwOGMsIDB4MTE0MCwKKwkweDIwZDEsIDB4MDAwMCwgMHgyMGQxLCAweDAwMDEsIDB4MjBkMSwgMHgwMDAwLCAweDA4MGMsIDB4MGRkNSwKKwkweDcwMGYsIDB4MDM2MSwgMHg3MDA3LCAweDAwMDEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzA0MCwKKwkweDkwMGQsIDB4MDE0OCwgMHg4MTA5LCAweDcxNDIsIDB4MTEzMCwgMHg3MDQ0LCAweDA4MGYsIDB4MDAxOCwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMjQsIDB4OTAwZCwgMHgwMTg4LCAweDcwMjAsIDB4ODAwMSwKKwkweDcwMjIsIDB4MTE2OCwgMHg3MDIzLCAweDAwMDksIDB4ODEwOSwgMHg3MTI2LCAweDkxODYsIDB4MDNlOCwKKwkweDExMTAsIDB4NzAyOCwgMHgwODBmLCAweDgxZmYsIDB4MTExMCwgMHg3MDI4LCAweDA4MGYsIDB4NzAzMCwKKwkweDkwMGQsIDB4MDE4MCwgMHg3MDJjLCAweDgwMDEsIDB4NzAyZSwgMHgxMTYwLCAweDcwMmYsIDB4MDAwOSwKKwkweDgxMDksIDB4NzEzMiwgMHgwMTI4LCAweDkxODQsIDB4MDA3ZiwgMHgwOTBjLCAweGE1MGUsIDB4MDAxMCwKKwkweDcwMzQsIDB4MDgwZiwgMHg3MDNjLCAweDkwMDUsIDB4MDExOCwgMHgwMzEwLCAweDgwMDEsIDB4NzAzZSwKKwkweDcwNGMsIDB4OTAwZCwgMHgwMTY4LCAweDcwNDgsIDB4ODAwMSwgMHg3MDRhLCAweDExNDgsIDB4NzA0YiwKKwkweDAwMDksIDB4ODEwOSwgMHg3MTRlLCAweDExMjAsIDB4NzE1MCwgMHg3MTRlLCAweDcwNTgsIDB4MDgwZiwKKwkweDcwMTgsIDB4OTAwZCwgMHgwMWQ4LCAweDAwMTYsIDB4NzA3MCwgMHg5MDBkLCAweDAxNTgsIDB4NzA2YywKKwkweDgwMDEsIDB4NzA2ZSwgMHgxMTM4LCAweDcwNmYsIDB4MDAwOSwgMHg4MTA5LCAweDcxNzIsIDB4MTExMCwKKwkweDcwNzQsIDB4MDgwZiwgMHgwMDFlLCAweDcwMDgsIDB4ODAwMSwgMHg3MDBhLCAweDExMzgsIDB4NzAwYiwKKwkweDAwMDksIDB4ODEwOSwgMHg3MTFhLCAweDExMTAsIDB4NzAxYywgMHgwODBmLCAweDAxMmUsIDB4NzAwNCwKKwkweDAwMDIsIDB4ODVjNywgMHg4NWM4LCAweDg1ZTQsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZjksIDB4NzAxOCwKKwkweDkwMDUsIDB4MTEyMCwgMHg3MTFhLCAweDcyMWUsIDB4NzAwYiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZTYsIDB4MDAwNiwgMHgyMDcxLCAweDE5ZjksIDB4NzAxYywgMHg5MjA2LCAweDExMjAsIDB4NzAxYSwKKwkweDcwMWUsIDB4NzA3MiwgMHg3MDc2LCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweDE5ZjksIDB4Yjg4OCwgMHg5MTAyLCAweDAyMDgsIDB4Yjk4YSwgMHgwMGVlLCAweDAwMDUsIDB4MDAwNSwKKwkweDAwYjYsIDB4NzExMCwgMHgwODBjLCAweDY2OTksIDB4MTE2OCwgMHhiODg4LCAweDgwMDEsIDB4MDI1MCwKKwkweGI4OGEsIDB4MTE0MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDE2LCAweDA4MGMsIDB4OTc2MywKKwkweDAwMWUsIDB4MDEyZSwgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgwMjE4LCAweDkwMGUsIDB4NzAwNywKKwkweDAwMDIsIDB4NzExMiwgMHgwMGJlLCAweDAwMDUsIDB4NzAxNCwgMHgyMDYwLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NjA0MCwgMHg5MDA1LCAweDAxMjgsIDB4ODAwMSwgMHg2MDQyLCAweDExMTAsIDB4MDgwYywKKwkweGNmOTMsIDB4NjAxOCwgMHg5MDA1LCAweDA1NTgsIDB4ODAwMSwgMHg2MDFhLCAweDE1NDAsIDB4NjEyMCwKKwkweDkxODYsIDB4MDAwMywgMHgwMTQ4LCAweDkxODYsIDB4MDAwNiwgMHgwMTMwLCAweDkxODYsIDB4MDAwOSwKKwkweDExZTAsIDB4NjExYywgMHhkMWM0LCAweDExMDAsIDB4MDgwYywgMHhjYzg2LCAweDAxYjAsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg4NCwgMHg5MDhhLCAweDE5OWEsIDB4MDI4MCwgMHg5MDgyLCAweDE5OTksIDB4YTg4NiwKKwkweDkwOGEsIDB4MTk5YSwgMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwKKwkweDkxMDgsIDB4NjExYSwgMHhhODdjLCAweGQwZTQsIDB4MDExMCwgMHgwODBjLCAweGM5NzIsIDB4MDEyZSwKKwkweDljODgsIDB4MDAxOCwgMHg3MTE2LCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDkxMDIsIDB4MDIyMCwKKwkweDcwMTcsIDB4MWNkMCwgMHg3MDA3LCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTlmOSwKKwkweDcwMjcsIDB4MDdkMCwgMHg3MDIzLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4MWEwMiwKKwkweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxOWY5LCAweDcxMzIsIDB4NzAyZiwKKwkweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDIwMTEsIDB4MWEwNSwgMHgyMDEzLCAweDAwMDAsIDB4MDAwNSwKKwkweDAwZTYsIDB4MjA3MSwgMHgxOWY5LCAweDcxMWEsIDB4NzIxZSwgMHg3MDBiLCAweDAwMDksIDB4MDBlZSwKKwkweDAwMDUsIDB4MDA4NiwgMHgwMDI2LCAweDcwNTQsIDB4ODAwMCwgMHg3MDU2LCAweDIwMDEsIDB4MWEwNywKKwkweDIwNDQsIDB4YTA2YywgMHg5MDg2LCAweDAwMDAsIDB4MDE1MCwgMHg3MDY4LCAweGEwOWEsIDB4NzA2NCwKKwkweGEwOTYsIDB4NzA2MCwgMHhhMDkyLCAweDcwNWMsIDB4YTA4ZSwgMHgwODBjLCAweDEwZTksIDB4MDAyZSwKKwkweDAwOGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDA5NiwgMHgwMGE2LCAweDAwYjYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDgwYywgMHg4NTEwLCAweDAxNWUsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZjksIDB4NzE3MiwgMHg3Mjc2LCAweDcwNmYsIDB4MDAwOSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHgxOWY5LCAweDcwNzQsIDB4OTIwNiwKKwkweDExMTAsIDB4NzA3MiwgMHg3MDc2LCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDIwMDksIDB4ZmZmNCwgMHgyMTBkLCAweDIwNjEsIDB4MDEwMCwgMHg2MGYwLCAweDkxMDAsIDB4NjBmMywKKwkweDAwMDAsIDB4MjAwOSwgMHhmZmY0LCAweDIwMGYsIDB4MTIyMCwgMHg4MTA4LCAweDIxMDUsIDB4ODAwMCwKKwkweDIwMGYsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDFhNzAsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTE4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDkwODAsIDB4MWE3MCwKKwkweDIwNjAsIDB4MDAwNSwgMHhhODg0LCAweDkwOGEsIDB4MTk5YSwgMHgxNjM4LCAweDkwMDUsIDB4MTE1MCwKKwkweDAwYzYsIDB4MjA2MSwgMHgxYTcwLCAweDYwMTQsIDB4MDBjZSwgMHg5MDA1LCAweDExMzAsIDB4MjAwMSwKKwkweDAwMWUsIDB4MDAxOCwgMHg5MDhlLCAweGZmZmYsIDB4MDFiMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwKKwkweDkxMDgsIDB4NjExYSwgMHhhODdjLCAweDkwOGMsIDB4MDBjMCwgMHg5MThlLCAweDAwYzAsIDB4MDkwNCwKKwkweDg3NDQsIDB4ZDBiNCwgMHgxMTY4LCAweGQwYmMsIDB4MTkwNCwgMHg4NzFkLCAweDIwMDksIDB4MDAwNiwKKwkweDA4MGMsIDB4ODc3MSwgMHgwMDA1LCAweDkwMGUsIDB4MGM2MCwgMHgyMDAxLCAweDE5OTksIDB4MDhiMCwKKwkweGQwZmMsIDB4MDE2MCwgMHg5MDhjLCAweDAwMDMsIDB4MDEyMCwgMHg5MThlLCAweDAwMDMsIDB4MTkwNCwKKwkweDg3NmIsIDB4OTA4YywgMHgyMDIwLCAweDkxOGUsIDB4MjAyMCwgMHgwMWE4LCAweDYwMjQsIDB4ZDBkNCwKKwkweDExZTgsIDB4MjAwOSwgMHgxODY5LCAweDIxMDQsIDB4ZDA4NCwgMHgxMTM4LCAweDg3ZmYsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA0MywgMHgwODA0LCAweGFmYmUsIDB4MDAwNSwgMHg4N2ZmLCAweDFkZTgsIDB4MjAwOSwKKwkweDAwNDIsIDB4MDgwNCwgMHhhZmJlLCAweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwKKwkweGQxYWMsIDB4MGQyMCwgMHg2MDI0LCAweGMwY2QsIDB4NjAyNiwgMHgwYzAwLCAweGMwZDQsIDB4NjAyNiwKKwkweGE4OTAsIDB4NjAyZSwgMHhhODhjLCAweDYwMzIsIDB4MDhlMCwgMHhkMGZjLCAweDAxNjAsIDB4OTA4YywKKwkweDAwMDMsIDB4MDEyMCwgMHg5MThlLCAweDAwMDMsIDB4MTkwNCwgMHg4NzZiLCAweDkwOGMsIDB4MjAyMCwKKwkweDkxOGUsIDB4MjAyMCwgMHgwMTcwLCAweDAwNzYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTc1NCwKKwkweDAwZmUsIDB4MDA3ZSwgMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDQyLCAweDA4MGMsIDB4YWZiZSwKKwkweDAwMDUsIDB4NjExMCwgMHgwMGI2LCAweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYWMsIDB4MGQ1OCwKKwkweDYxMjQsIDB4YzFjZCwgMHg2MTI2LCAweDBjMzgsIDB4ZDBmYywgMHgwMTg4LCAweDkwOGMsIDB4MjAyMCwKKwkweDkxOGUsIDB4MjAyMCwgMHgwMWE4LCAweDkwODQsIDB4MDAwMywgMHg5MDhlLCAweDAwMDIsIDB4MDE0OCwKKwkweDg3ZmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHhhZmJlLCAweDAwMDUsIDB4MDBiOSwKKwkweDBjZTgsIDB4ODdmZiwgMHgxZGQ4LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGFmYmUsIDB4MGNiMCwKKwkweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLCAweDBkMjAsIDB4NjEyNCwKKwkweGMxY2QsIDB4NjEyNiwgMHgwYzAwLCAweDIwMDksIDB4MDAwNCwgMHgwMDE5LCAweDAwMDUsIDB4MjAwOSwKKwkweDAwMDEsIDB4MDA5NiwgMHgwODBjLCAweGNjODYsIDB4MDUxOCwgMHg2MDE0LCAweDIwNDgsIDB4YTk4MiwKKwkweGE4MDAsIDB4NjAxNiwgMHg5MTg2LCAweDAwMDEsIDB4MTE4OCwgMHhhOTdjLCAweDkxOGMsIDB4ODEwMCwKKwkweDkxOGUsIDB4ODEwMCwgMHgxMTU4LCAweDAwYzYsIDB4MjA2MSwgMHgxYTcwLCAweDYyMDAsIDB4ZDI4YywKKwkweDExMjAsIDB4NjIwNCwgMHg4MjEwLCAweDAyMDgsIDB4NjIwNiwgMHgwMGNlLCAweDA4MGMsIDB4NmI1MiwKKwkweDYwMTQsIDB4OTA0ZCwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgxOTBjLCAweDg2YmEsIDB4MDA3ZSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwYzYsIDB4MjA2MSwgMHgxYTcwLCAweDYwMDAsIDB4ODFmZiwKKwkweDAxMTAsIDB4OTIwNSwgMHgwMDA4LCAweDkyMDQsIDB4NjAwMiwgMHgwMGNlLCAweDAxNWUsIDB4MDAwNSwKKwkweDY4MDAsIDB4ZDA4YywgMHgxMTM4LCAweDY4MDgsIDB4OTAwNSwgMHgwMTIwLCAweDgwMDEsIDB4NjgwYSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDIwNzEsIDB4MTkyMywgMHg3MDAzLCAweDAwMDYsIDB4NzAwNywKKwkweDAwMDAsIDB4NzAwZiwgMHgwMDAwLCAweDcwMTMsIDB4MDAwMSwgMHgwODBjLCAweDEwMTgsIDB4MDkwYywKKwkweDBkZDUsIDB4YTg2NywgMHgwMDA2LCAweGE4NmIsIDB4MDAwMSwgMHhhOGFiLCAweGRjYjAsIDB4YTg5ZiwKKwkweDAwMDAsIDB4MjkwMCwgMHg3MDJlLCAweDcwMzMsIDB4MDAwMCwgMHgwMDA1LCAweDAwOTYsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTkyMywgMHg3MDJjLCAweDIwNDgsIDB4NmEyYywgMHg3MjFlLCAweDZiMzAsIDB4NzMyMiwKKwkweDY4MzQsIDB4NzAyNiwgMHhhODk2LCAweDY4MzgsIDB4NzAyYSwgMHhhODlhLCAweDY4MjQsIDB4NzAxNiwKKwkweDY4M2MsIDB4NzAxYSwgMHgyMDA5LCAweDAwMjgsIDB4MjAwYSwgMHg5MDA1LCAweDAxNDgsIDB4OTAwZSwKKwkweDkxODgsIDB4MDAwYywgMHg4MDAxLCAweDFkZTAsIDB4MjEwMCwgMHg5MjEwLCAweDEyMDgsIDB4ODMxOCwKKwkweGFhOGUsIDB4YWI5MiwgMHg3MDEwLCAweGQwODQsIDB4MDE2OCwgMHhjMDg0LCAweDcwMDcsIDB4MDAwMSwKKwkweDcwMGYsIDB4MDAwMCwgMHgwMDA2LCAweDIwMDksIDB4MWFjYSwgMHgyMTA0LCAweDkwODIsIDB4MDAwNywKKwkweDIwMGEsIDB4MDAwZSwgMHhjMDk1LCAweDcwMTIsIDB4MjAwOCwgMHgyMDAxLCAweDAwM2IsIDB4MDgwYywKKwkweDE1ZmQsIDB4OTAwNiwgMHgyMDcxLCAweDE5M2MsIDB4NzAwMiwgMHg3MDA2LCAweDcwMmEsIDB4MDBlZSwKKwkweDAwOWUsIDB4MDAwNSwgMHgyMDA5LCAweDFhY2EsIDB4MjEwNCwgMHg5MDgwLCAweDAwMDcsIDB4MjAwYSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMTI2LCAweDAxNTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcxNTQsIDB4MjAwMSwgMHgwMDA4LCAweDkxMGEsIDB4MDYzOCwgMHgyMDAxLCAweDE4N2QsIDB4MjBhYywKKwkweDkwMDYsIDB4OTA4MCwgMHgwMDA4LCAweDFmMDQsIDB4ODgyOSwgMHg3MWMwLCAweDkxMDIsIDB4MDJlMCwKKwkweDIwNzEsIDB4MTg3NywgMHgyMGE5LCAweDAwMDcsIDB4MDBjNiwgMHgwODBjLCAweGFlZWQsIDB4NjAyMywKKwkweDAwMDksIDB4NjAwMywgMHgwMDA0LCAweDYwMWYsIDB4MDEwMSwgMHgwMDg5LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg4OWE3LCAweDAxMmUsIDB4MWYwNCwgMHg4ODM1LCAweDkwMDYsIDB4MDBjZSwKKwkweDAxNWUsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjYzgsIDB4MDBlNiwKKwkweDAwYjYsIDB4MDA5NiwgMHgwMDg2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDcxMTgsIDB4NzIwYywKKwkweDc2MjAsIDB4NzAwNCwgMHhkMDg0LCAweDExMjgsIDB4MjAyMSwgMHgwMDI0LCAweDIwMjksIDB4MDAwMiwKKwkweDAwMjAsIDB4MjAyMSwgMHgwMDJjLCAweDIwMjksIDB4MDAwYSwgMHgwODBjLCAweDBmZmYsIDB4MDkwYywKKwkweDBkZDUsIDB4MjkwMCwgMHg2MDE2LCAweDIwNTgsIDB4YWM2NiwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwKKwkweGE4NmEsIDB4YTg3YSwgMHhhOGFhLCAweGE4ODcsIDB4MDAwNSwgMHhhODdmLCAweDAwMjAsIDB4NzAwOCwKKwkweGE4OWEsIDB4NzAxMCwgMHhhODllLCAweGFlOGEsIDB4YThhZiwgMHhmZmZmLCAweGE4YjMsIDB4MDAwMCwKKwkweDgxMDksIDB4MDE2MCwgMHgwODBjLCAweDBmZmYsIDB4MDkwYywgMHgwZGQ1LCAweGFkNjYsIDB4MmIwMCwKKwkweGE4MDIsIDB4MjkwMCwgMHhiODA2LCAweDIwNTgsIDB4ODEwOSwgMHgxZGEwLCAweDAwMmUsIDB4MDA0ZSwKKwkweDAwNWUsIDB4MDA4ZSwgMHgwMDllLCAweDAwYmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzksIDB4MDAwMCwKKwkweDIwNzEsIDB4MTkyMywgMHg3MDA0LCAweDAwNGIsIDB4NzAwYywgMHgwMDAyLCAweDg4YTEsIDB4ODg5YSwKKwkweDg4OWEsIDB4MDAwNSwgMHg4OGFiLCAweDg5MDEsIDB4ODkwMSwgMHg4OTAxLCAweDg5MDIsIDB4ODkxMywKKwkweDg5MTMsIDB4NzAwYywgMHgwY2JhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4YTAsIDB4NzlhMCwKKwkweDkxMDYsIDB4MTkwNCwgMHg4OGYzLCAweDc4MTQsIDB4ZDBiYywgMHgxOTA0LCAweDg4ZmMsIDB4MDEyZSwKKwkweDcwMTgsIDB4OTEwYSwgMHgxMTI4LCAweDcwMzAsIDB4OTAwNSwgMHgxOTA0LCAweDg5NDUsIDB4MDAwNSwKKwkweDEyMTAsIDB4NzExNCwgMHg5MTBhLCAweDkxOTIsIDB4MDAwYSwgMHgwMjEwLCAweDIwMDksIDB4MDAwYSwKKwkweDIwMDEsIDB4MTg4OCwgMHgyMDE0LCAweDIwMDEsIDB4MTkzNSwgMHgyMDA0LCAweDkxMDAsIDB4OTIwMiwKKwkweDBlNTAsIDB4MDgwYywgMHg4YTliLCAweDIyMDAsIDB4OTEwMiwgMHgwMjA4LCAweDIyMDgsIDB4MDA5NiwKKwkweDcwMmMsIDB4MjA0OCwgMHhhODczLCAweDAwMDEsIDB4YTk3NiwgMHgwODBjLCAweDhiYTQsIDB4MjEwMCwKKwkweGE4N2UsIDB4YTg2ZiwgMHgwMDAwLCAweDAwOWUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwKKwkweDFhMTcsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsIDB4NzAwZiwgMHgwMDAyLCAweDAxMmUsIDB4MDgwYywKKwkweDExMDgsIDB4MWRlOCwgMHgwMDA1LCAweDc4YTAsIDB4NzlhMCwgMHg5MTA2LCAweDA5MDQsIDB4ODhiMywKKwkweDA4MGMsIDB4OGE3MywgMHgwMTJlLCAweDAwMDUsIDB4NzgxMCwgMHhjMGM1LCAweDc4MTIsIDB4MDgwNCwKKwkweDg4YjMsIDB4MDAwNSwgMHg3MDBjLCAweDAwMDIsIDB4ODkwNywgMHg4OTBhLCAweDg5MDksIDB4MDgwYywKKwkweDg4YTksIDB4MDAwNSwgMHg4MDAxLCAweDcwMGUsIDB4MDA5NiwgMHg3MDJjLCAweDIwNDgsIDB4YTk3NCwKKwkweDAwOWUsIDB4MDAxMSwgMHgwY2EwLCAweDAwMDUsIDB4MDA5NiwgMHg3MDJjLCAweDIwNDgsIDB4NzAxOCwKKwkweDkxMDAsIDB4NzIxNCwgMHg5MjFhLCAweDExMzAsIDB4NzAxYywgMHhhODhlLCAweDcwMjAsIDB4YTg5MiwKKwkweDkwMDYsIDB4MDA2OCwgMHgwMDA2LCAweDA4MGMsIDB4OGJhNCwgMHgyMTAwLCAweGFhOGMsIDB4OTIxMCwKKwkweGFhOGUsIDB4MTIyMCwgMHhhODkwLCAweDkwODEsIDB4MDAwMCwgMHhhODkyLCAweDAwMGUsIDB4MDA5ZSwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4YTIsIDB4NzAxYSwgMHgwODBjLCAweDhhNzMsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE5MjMsIDB4NzAwYywgMHgwMDAyLCAweDg5NDMsIDB4ODk0MywKKwkweDg5NDEsIDB4NzAwZiwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDcwMzAsIDB4OTAwNSwgMHgwNTA4LCAweDIwNzgsIDB4NzgxNCwgMHgyMDQ4LCAweGFlODgsIDB4MDBiNiwKKwkweDIwNTksIDB4MDAwMCwgMHgwODBjLCAweDg5YjAsIDB4MDBiZSwgMHgwMWIwLCAweDAwZTYsIDB4MjA3MSwKKwkweDE5M2MsIDB4MDgwYywgMHg4OWY3LCAweDAwZWUsIDB4MDE3OCwgMHgwMDk2LCAweDA4MGMsIDB4MTAxOCwKKwkweDI5MDAsIDB4MDA5ZSwgMHgwMTQ4LCAweGE4YWEsIDB4MDRiOSwgMHgwMDQxLCAweDIwMDEsIDB4MTk0NiwKKwkweDIwMDMsIDB4MDAwMCwgMHgwMTJlLCAweDA4YzgsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwODYsIDB4MDBhNiwgMHgyOTQwLCAweDI2NTAsIDB4MjYwMCwgMHg5MDA1LCAweDAxODAsIDB4YTg2NCwKKwkweDkwODQsIDB4MDAwZiwgMHgyMDY4LCAweDlkODgsIDB4MjBjZSwgMHgyMTY1LCAweDAwNTYsIDB4MjAyOSwKKwkweDAwMDAsIDB4MDgwYywgMHg4YjI5LCAweDA4MGMsIDB4MjA4NiwgMHgxZGQ4LCAweDAwNWUsIDB4MDBhZSwKKwkweDIwMDEsIDB4MTg3ZiwgMHgyMDA0LCAweGE4OGEsIDB4MDgwYywgMHgxNzU0LCAweDc4MWYsIDB4MDEwMSwKKwkweDc4MTMsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDhhMDYsIDB4MDEyZSwKKwkweDAwOGUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NzAzMCwgMHg5MDA1LCAweDAxMzgsIDB4MjA3OCwKKwkweDc4MGMsIDB4NzAzMiwgMHgyMDAxLCAweDE5NDYsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTkyMywgMHg3MDMwLCAweDYwMGUsIDB4MmMwMCwgMHg3MDMyLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDBjNiwgMHgwMDI2LCAweDliODAsIDB4OGM3MiwgMHgyMDA1LCAweDkwNmQsIDB4MDkwYywKKwkweDBkZDUsIDB4OWI4MCwgMHg4YzZhLCAweDIwMDUsIDB4OTA2NSwgMHgwOTBjLCAweDBkZDUsIDB4NjExNCwKKwkweDI2MDAsIDB4OTEwMiwgMHgwMjQ4LCAweDY4MjgsIDB4OTEwMiwgMHgwMmYwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgwNCwgMHhkMDk0LCAweDAxNDgsIDB4Njg1NCwKKwkweGQwODQsIDB4MTE3OCwgMHhjMDg1LCAweDY4NTYsIDB4MjAxMSwgMHg4MDI2LCAweDA4MGMsIDB4NGI3ZiwKKwkweDY4NGMsIDB4MDA5NiwgMHg5MDRkLCAweDA5MGMsIDB4MGRkNSwgMHhhODA0LCAweDgwMDAsIDB4YTgwNiwKKwkweDAwOWUsIDB4OTAwNiwgMHgyMDMwLCAweDBjMjAsIDB4Njg1NCwgMHhkMDhjLCAweDFkMDgsIDB4YzA4ZCwKKwkweDY4NTYsIDB4MjAxMSwgMHg4MDI1LCAweDA4MGMsIDB4NGI3ZiwgMHg2ODRjLCAweDAwOTYsIDB4OTA0ZCwKKwkweDA5MGMsIDB4MGRkNSwgMHhhODAwLCAweDgwMDAsIDB4YTgwMiwgMHgwMDllLCAweDA4ODgsIDB4NzAwMCwKKwkweDIwMTksIDB4MDAwOCwgMHg4MzE5LCAweDcxMDQsIDB4OTEwMiwgMHgxMTE4LCAweDIzMDAsIDB4OTAwNSwKKwkweDAwMjAsIDB4MDIxMCwgMHg5MzAyLCAweDAwMDgsIDB4ODAwMiwgMHgwMDA1LCAweDAwZDYsIDB4NzgxNCwKKwkweDkwMDUsIDB4MDkwYywgMHgwZGQ1LCAweDc4MWMsIDB4OTA4NCwgMHgwMTAxLCAweDkwODYsIDB4MDEwMSwKKwkweDE5MGMsIDB4MGRkNSwgMHg3ODI3LCAweDAwMDAsIDB4MjA2OSwgMHgxOTNjLCAweDY4MDQsIDB4OTA4MCwKKwkweDE5M2UsIDB4MmYwOCwgMHgyMTAyLCAweDY5MDQsIDB4ODEwOCwgMHg5MTgyLCAweDAwMDgsIDB4MDIwOCwKKwkweDkwMGUsIDB4NjkwNiwgMHg5MTgwLCAweDE5M2UsIDB4MjAwMywgMHgwMDAwLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDBjNiwgMHgyMDYwLCAweDYwMTQsIDB4MjA0OCwgMHhhOGE4LCAweDAwOTYsIDB4MjA0OCwKKwkweDkwMDUsIDB4MTkwYywgMHgxMDMxLCAweDAwOWUsIDB4YThhYiwgMHgwMDAwLCAweDA4MGMsIDB4MGZiMSwKKwkweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDAwOWUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwOSwKKwkweDExMjgsIDB4NjAxYywgMHhkMGM0LCAweDAxMTAsIDB4OTAwNiwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDUsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE3OCwgMHg2MDEwLCAweDkwMDUsIDB4MDE1MCwKKwkweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDhkYTcsIDB4MDBiZSwgMHg2MDEzLCAweDAwMDAsIDB4NjAxYiwKKwkweDAwMDAsIDB4MDAxMCwgMHgyYzAwLCAweDA4NjEsIDB4MDAwNSwgMHgyMDA5LCAweDE5MjcsIDB4MjEwYywKKwkweGQxOTQsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTkyMywgMHg3MTEwLCAweGMxOTQsIDB4ZDE5YywKKwkweDExMTgsIDB4YzE4NSwgMHg3MDA3LCAweDAwMDAsIDB4NzExMiwgMHgyMDAxLCAweDAwM2IsIDB4MDgwYywKKwkweDE1ZmQsIDB4MDBlZSwgMHgwMDA1LCAweDc4MTQsIDB4ZDBiYywgMHgxMTA4LCAweDAwMDUsIDB4NzgxMCwKKwkweGMwYzUsIDB4NzgxMiwgMHgwY2MwLCAweDAwOTYsIDB4MDBkNiwgMHg5MDA2LCAweDcwMDYsIDB4NzAwZSwKKwkweDcwMWEsIDB4NzAxZSwgMHg3MDIyLCAweDcwMTYsIDB4NzAyYSwgMHg3MDI2LCAweDcwMmYsIDB4MDAwMCwKKwkweDA4MGMsIDB4OGJmMiwgMHgwMTcwLCAweDA4MGMsIDB4OGMyNywgMHgwMTU4LCAweDI5MDAsIDB4NzAwMiwKKwkweDcwMGEsIDB4NzAxYSwgMHg3MDEzLCAweDAwMDEsIDB4NzAxZiwgMHgwMDBhLCAweDAwZGUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4OTAwZSwgMHgwY2Q4LCAweDAwZTYsIDB4MDA5NiwgMHgwMDg2LCAweDAwZDYsIDB4MDBjNiwKKwkweDIwNzEsIDB4MTkzMCwgMHg3MjFjLCAweDIxMDAsIDB4OTIwMiwgMHgxNjE4LCAweDA4MGMsIDB4OGMyNywKKwkweDA5MGMsIDB4MGRkNSwgMHg3MDE4LCAweDkwMDUsIDB4MTE2MCwgMHgyOTAwLCAweDcwMDIsIDB4NzAwYSwKKwkweDcwMWEsIDB4OTAwNiwgMHg3MDA2LCAweDcwMGUsIDB4YTgwNiwgMHhhODAyLCAweDcwMTIsIDB4NzAxZSwKKwkweDAwMzgsIDB4MjA0MCwgMHhhODA2LCAweDI5MDAsIDB4YTAwMiwgMHg3MDFhLCAweGE4MDMsIDB4MDAwMCwKKwkweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMWMsIDB4OTA4MCwgMHgwMDBhLCAweDcwMWUsIDB4NzIxYywKKwkweDA4ZDAsIDB4NzIxYywgMHgwMGNlLCAweDAwZGUsIDB4MDA4ZSwgMHgwMDllLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNzEsIDB4MTkzMCwgMHg3MzAwLCAweDgzMWYsIDB4ODMxZSwgMHg4MzFlLCAweDkzODQsIDB4MDAzZiwKKwkweDIwZTgsIDB4OTM5YywgMHhmZmMwLCAweDkzOTgsIDB4MDAwMywgMHg3MTA0LCAweDA4MGMsIDB4OGJhNCwKKwkweDgxMGMsIDB4MjEwMCwgMHg5MzE4LCAweDgwMDMsIDB4MjIyOCwgMHgyMDIxLCAweDAwNzgsIDB4OTQwMiwKKwkweDk1MzIsIDB4MDIwOCwgMHgyMDI4LCAweDI1MDAsIDB4ODAwNCwgMHgyMGE4LCAweDIzYTAsIDB4YTAwMSwKKwkweGEwMDEsIDB4NDAwNSwgMHgyNTA4LCAweDA4MGMsIDB4OGJhZCwgMHgyMTMwLCAweDcwMTQsIDB4OTYwMCwKKwkweDcwMTYsIDB4MjYwMCwgMHg3MTFjLCAweDkxMDIsIDB4NzAxZSwgMHg3MDA0LCAweDk2MDAsIDB4MjAwOCwKKwkweDkwODIsIDB4MDAwYSwgMHgxMTkwLCAweDcwMDAsIDB4MjA0OCwgMHhhODAwLCAweDkwMDUsIDB4MTE0OCwKKwkweDIwMDksIDB4MDAwMSwgMHgwMDI2LCAweDA4MGMsIDB4OGE5YiwgMHgwMDJlLCAweDcwMDAsIDB4MjA0OCwKKwkweGE4MDAsIDB4NzAwMiwgMHg3MDA3LCAweDAwMDAsIDB4MDAwOCwgMHg3MTA2LCAweDI1MDAsIDB4OTIxMiwKKwkweDE5MDQsIDB4OGFkYSwgMHgwMTJlLCAweDAwZWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTU4MCwKKwkweDhjNmEsIDB4MjAwNSwgMHg5MDc1LCAweDA5MGMsIDB4MGRkNSwgMHgwODBjLCAweDhiN2YsIDB4MDEyZSwKKwkweDk1ODAsIDB4OGM2NiwgMHgyMDA1LCAweDkwNzUsIDB4MDkwYywgMHgwZGQ1LCAweDAxNTYsIDB4MDEzNiwKKwkweDAxYzYsIDB4MDE0NiwgMHgwMWQ2LCAweDgzMWYsIDB4ODMxZSwgMHg4MzFlLCAweDkzODQsIDB4MDAzZiwKKwkweDIwZTAsIDB4OTM4NCwgMHhmZmMwLCAweDkxMDAsIDB4MjA5OCwgMHhhODYwLCAweDIwZTgsIDB4YTk1YywKKwkweDJjMDUsIDB4OTEwMCwgMHgyMGEwLCAweDIwYTksIDB4MDAwMiwgMHg0MDAzLCAweDJlMGMsIDB4MmQwMCwKKwkweDAwMDIsIDB4OGI2OSwgMHg4YjY5LCAweDhiNmIsIDB4OGI2OSwgMHg4YjZiLCAweDhiNjksIDB4OGI2OSwKKwkweDhiNjksIDB4OGI2OSwgMHg4YjY5LCAweDhiNzEsIDB4OGI2OSwgMHg4YjcxLCAweDhiNjksIDB4OGI2OSwKKwkweDhiNjksIDB4MDgwYywgMHgwZGQ1LCAweDQxMDQsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDIsIDB4NDAwMywKKwkweDAwMjgsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDMsIDB4NDEwNCwgMHg0MDAzLCAweDAxZGUsIDB4MDE0ZSwKKwkweDAxY2UsIDB4MDEzZSwgMHgwMTVlLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDA5NiwKKwkweDcwMTQsIDB4ODAwMSwgMHg3MDE2LCAweDcxMGMsIDB4MjExMCwgMHgwMGYxLCAweDgxMGMsIDB4OTE4OCwKKwkweDAwMDMsIDB4NzMwOCwgMHg4MjEwLCAweDkyODIsIDB4MDAwYSwgMHgxMTk4LCAweDcwMDgsIDB4MjA0OCwKKwkweGE4MDAsIDB4OTAwNSwgMHgwMTU4LCAweDAwMDYsIDB4MDgwYywgMHg4YzM2LCAweDAwOWUsIDB4YTgwNywKKwkweDAwMDAsIDB4MjkwMCwgMHg3MDBhLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDcwMGYsIDB4MDAwMCwKKwkweDAwMDgsIDB4NzIwZSwgMHgwMDllLCAweDAwMDUsIDB4MDAwNiwgMHg4MTBiLCAweDgxMGIsIDB4MjEwMCwKKwkweDgxMGIsIDB4OTEwMCwgMHgyMDA4LCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMjYsIDB4MjEwMCwKKwkweDkwMDUsIDB4MDE1OCwgMHg5MDkyLCAweDAwMGMsIDB4MDI0MCwgMHg5MDBlLCAweDgxMDgsIDB4OTA4MiwKKwkweDAwMGMsIDB4MWRlMCwgMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHg5MDBlLCAweDBjZDgsIDB4MmQwMCwKKwkweDkwYjgsIDB4MDAwOCwgMHgyMDMxLCAweDhiZjAsIDB4OTAxZSwgMHg2ODA4LCAweDkwMDUsIDB4MDEwOCwKKwkweDgzMTgsIDB4NjkwYywgMHg5MTBhLCAweDAyNDgsIDB4MDE0MCwgMHg4MzE4LCAweDY4MTAsIDB4OTExMiwKKwkweDAyMjAsIDB4MDExOCwgMHg4MzE4LCAweDIyMDgsIDB4MGNkMCwgMHgyMzNhLCAweDY4MDQsIDB4ZDA4NCwKKwkweDIzMDAsIDB4MjAyMSwgMHgwMDAxLCAweDExNTAsIDB4OTA4MiwgMHgwMDAzLCAweDA5NjcsIDB4MGE2NywKKwkweDg0MjAsIDB4OTA4MiwgMHgwMDA3LCAweDA5NjcsIDB4MGE2NywgMHgwY2QwLCAweDkwODIsIDB4MDAwMiwKKwkweDA5NjcsIDB4MGE2NywgMHg4NDIwLCAweDkwODIsIDB4MDAwNSwgMHgwOTY3LCAweDBhNjcsIDB4MGNkMCwKKwkweDZjMWEsIDB4MDAwNSwgMHgwMDk2LCAweDAwNDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MmIwMCwKKwkweDkwODAsIDB4OGM2ZSwgMHgyMDA1LCAweDkwMDUsIDB4MDkwYywgMHgwZGQ1LCAweDIwMDQsIDB4OTBhMCwKKwkweDAwMGEsIDB4MDgwYywgMHgxMDE4LCAweDAxZDAsIDB4MjkwMCwgMHg3MDI2LCAweGE4MDMsIDB4MDAwMCwKKwkweGE4MDcsIDB4MDAwMCwgMHgwODBjLCAweDEwMTgsIDB4MDE4OCwgMHg3MDI0LCAweGE4MDIsIDB4YTgwNywKKwkweDAwMDAsIDB4MjkwMCwgMHg3MDI2LCAweDk0YTIsIDB4MDAwYSwgMHgwMTEwLCAweDAyMDgsIDB4MGM5MCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwNGUsIDB4MDA5ZSwgMHgwMDA1LCAweDcwMjQsIDB4OTAwNSwKKwkweDBkYzgsIDB4MjA0OCwgMHhhYzAwLCAweDA4MGMsIDB4MTAzMSwgMHgyNDAwLCAweDBjYzAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHg3MDI0LCAweDIwNDgsIDB4OTAwNSwgMHgwMTMwLCAweGE4MDAsIDB4NzAyNiwKKwkweGE4MDMsIDB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4NzAyNCwgMHhhODAyLCAweDI5MDAsIDB4NzAyNiwgMHgwMTJlLCAweDAwMDUsIDB4MDA5NiwKKwkweDllODAsIDB4MDAwOSwgMHgyMDA0LCAweDkwMDUsIDB4MDEzOCwgMHgyMDQ4LCAweGE4MDAsIDB4MDAwNiwKKwkweDA4MGMsIDB4MTAzMSwgMHgwMDBlLCAweDBjYjgsIDB4MDA5ZSwgMHgwMDA1LCAweDAwOTYsIDB4NzAwOCwKKwkweDkwMDUsIDB4MDEzOCwgMHgyMDQ4LCAweGE4MDAsIDB4MDAwNiwgMHgwODBjLCAweDEwMzEsIDB4MDAwZSwKKwkweDBjYjgsIDB4OTAwNiwgMHg3MDAyLCAweDcwMGEsIDB4NzAwNiwgMHg3MDBlLCAweDcwMWEsIDB4NzAxZSwKKwkweDcwMjIsIDB4NzAyYSwgMHg3MDI2LCAweDcwMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDFhNjMsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgxOTMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDE4ODgsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgxODc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwZTYsIDB4MDBjNiwKKwkweDAwYjYsIDB4MDBhNiwgMHhhOGE4LCAweDIwNDAsIDB4MjA3MSwgMHgxODc3LCAweDA4MGMsIDB4OGQ5MiwKKwkweGEwNjcsIDB4MDAyMywgMHg2MDEwLCAweDkwNWQsIDB4MDkwNCwgMHg4ZDY3LCAweGI4MTQsIDB4YTA2ZSwKKwkweGI5MTAsIDB4YTE3MiwgMHhiOWEwLCAweGExNzYsIDB4MjAwMSwgMHgwMDAzLCAweGEwN2UsIDB4YTgzNCwKKwkweGEwODIsIDB4YTA3YiwgMHgwMDAwLCAweGE4OTgsIDB4OTAwNSwgMHgwMTE4LCAweGEwNzgsIDB4YzA4NSwKKwkweGEwN2EsIDB4Mjg1OCwgMHgyMDMxLCAweDAwMTgsIDB4YTA2OCwgMHg5MDhhLCAweDAwMTksIDB4MWEwYywKKwkweDBkZDUsIDB4MjAyMCwgMHgyMDUwLCAweDI5NDAsIDB4YTg2NCwgMHg5MGJjLCAweDAwZmYsIDB4OTA4YywKKwkweDAwMGYsIDB4OTFlMCwgMHgyMGNlLCAweDJjNjUsIDB4OTc4NiwgMHgwMDI0LCAweDJjMDUsIDB4MTU5MCwKKwkweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4OGNkMiwKKwkweDhjZDIsIDB4OGNkNCwgMHg4Y2QyLCAweDhjZDIsIDB4OGNkMiwgMHg4Y2Q2LCAweDhjZDIsIDB4OGNkMiwKKwkweDhjZDIsIDB4OGNkOCwgMHg4Y2QyLCAweDhjZDIsIDB4OGNkMiwgMHg4Y2RhLCAweDhjZDIsIDB4OGNkMiwKKwkweDhjZDIsIDB4OGNkYywgMHg4Y2QyLCAweDhjZDIsIDB4OGNkMiwgMHg4Y2RlLCAweDhjZDIsIDB4OGNkMiwKKwkweDhjZDIsIDB4OGNlMCwgMHgwODBjLCAweDBkZDUsIDB4YTE4MCwgMHgwNGI4LCAweGExOTAsIDB4MDRhOCwKKwkweGExYTAsIDB4MDQ5OCwgMHhhMWIwLCAweDA0ODgsIDB4YTFjMCwgMHgwNDc4LCAweGExZDAsIDB4MDQ2OCwKKwkweGExZTAsIDB4MDQ1OCwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGQ1LCAweDkwODIsIDB4MDAxYiwKKwkweDAwMDIsIDB4OGQwNCwgMHg4ZDAyLCAweDhkMDIsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDIsIDB4OGQwNiwKKwkweDhkMDIsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDIsIDB4OGQwMiwgMHg4ZDA4LCAweDhkMDIsIDB4OGQwMiwKKwkweDhkMDIsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMGEsIDB4OGQwMiwgMHg4ZDAyLCAweDhkMDIsIDB4OGQwMiwKKwkweDhkMDIsIDB4OGQwYywgMHgwODBjLCAweDBkZDUsIDB4YTE4MCwgMHgwMDM4LCAweGExOTgsIDB4MDAyOCwKKwkweGExYjAsIDB4MDAxOCwgMHhhMWM4LCAweDAwMDgsIDB4YTFlMCwgMHgyNjAwLCAweDAwMDIsIDB4OGQyOCwKKwkweDhkMmEsIDB4OGQyYywgMHg4ZDJlLCAweDhkMzAsIDB4OGQzMiwgMHg4ZDM0LCAweDhkMzYsIDB4OGQzOCwKKwkweDhkM2EsIDB4OGQzYywgMHg4ZDNlLCAweDhkNDAsIDB4OGQ0MiwgMHg4ZDQ0LCAweDhkNDYsIDB4OGQ0OCwKKwkweDhkNGEsIDB4OGQ0YywgMHg4ZDRlLCAweDhkNTAsIDB4OGQ1MiwgMHg4ZDU0LCAweDhkNTYsIDB4OGQ1OCwKKwkweDA4MGMsIDB4MGRkNSwgMHhiOWUyLCAweDA0NjgsIDB4YjlkZSwgMHgwNDU4LCAweGI5ZGEsIDB4MDQ0OCwKKwkweGI5ZDYsIDB4MDQzOCwgMHhiOWQyLCAweDA0MjgsIDB4YjljZSwgMHgwNDE4LCAweGI5Y2EsIDB4MDQwOCwKKwkweGI5YzYsIDB4MDBmOCwgMHhiOWMyLCAweDAwZTgsIDB4YjliZSwgMHgwMGQ4LCAweGI5YmEsIDB4MDBjOCwKKwkweGI5YjYsIDB4MDBiOCwgMHhiOWIyLCAweDAwYTgsIDB4YjlhZSwgMHgwMDk4LCAweGI5YWEsIDB4MDA4OCwKKwkweGI5YTYsIDB4MDA3OCwgMHhiOWEyLCAweDAwNjgsIDB4Yjk5ZSwgMHgwMDU4LCAweGI5OWEsIDB4MDA0OCwKKwkweGI5OTYsIDB4MDAzOCwgMHhiOTkyLCAweDAwMjgsIDB4Yjk4ZSwgMHgwMDE4LCAweGI5OGEsIDB4MDAwOCwKKwkweGI5ODYsIDB4ODYzMSwgMHg4NDIxLCAweDAxMzAsIDB4MDgwYywgMHgyMDg2LCAweDA5MGMsIDB4MGRkNSwKKwkweDA4MDQsIDB4OGNhYywgMHgwMGFlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4YTg2YywKKwkweGEwNmUsIDB4YTg3MCwgMHhhMDcyLCAweGEwNzcsIDB4MDBmZiwgMHg5MDA2LCAweDA4MDQsIDB4OGM4ZSwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkwMDUsIDB4MDFiMCwKKwkweDIwMDEsIDB4MTkyNCwgMHgyMDA0LCAweDkwMDUsIDB4MDE4OCwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwMywgMHgxMTU4LCAweDAwMzYsIDB4MDA0NiwgMHhiYmEwLCAweDIwMjEsIDB4MDAwNCwKKwkweDIwMTEsIDB4ODAxNCwgMHgwODBjLCAweDRiN2YsIDB4MDA0ZSwgMHgwMDNlLCAweDAwYmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHg5MDE2LCAweDcxMGMsIDB4YTgzNCwgMHg5MTBhLCAweGE5MzYsIDB4NzAwOCwKKwkweDkwMDUsIDB4MDEyMCwgMHg4MjEwLCAweDkxMGEsIDB4MDIzOCwgMHgwMTMwLCAweDcwMTAsIDB4ODIxMCwKKwkweDkxMGEsIDB4MDIxMCwgMHgwMTA4LCAweDBjZDgsIDB4YWE4YSwgMHhhMjZhLCAweDAwMDUsIDB4MDBmNiwKKwkweDAwZDYsIDB4MDAzNiwgMHgyMDc5LCAweDAzMDAsIDB4NzgxYiwgMHgwMjAwLCAweDc4MTgsIDB4ZDA5NCwKKwkweDFkZDgsIDB4NzgxYiwgMHgwMjAyLCAweGEwMDEsIDB4YTAwMSwgMHg3ODE4LCAweGQwOTQsIDB4MWRhMCwKKwkweGI4YWMsIDB4OTAwNSwgMHgwMWI4LCAweDIwNjgsIDB4MjA3OSwgMHgwMDAwLCAweDJjMDgsIDB4OTExZSwKKwkweDExMTgsIDB4NjgwYywgMHhiOGFlLCAweDAwNjAsIDB4OTEwNiwgMHgwMTQwLCAweDJkMDAsIDB4MjA3OCwKKwkweDY4MGMsIDB4OTAwNSwgMHgwOTBjLCAweDBkZDUsIDB4MjA2OCwgMHgwY2IwLCAweDZiMGMsIDB4N2IwZSwKKwkweDYwMGYsIDB4MDAwMCwgMHgyMDc5LCAweDAzMDAsIDB4NzgxYiwgMHgwMjAwLCAweDAwM2UsIDB4MDBkZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDA5NiwgMHgwMGM2LCAweDAwMzYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMTU2LCAweDIwYTksIDB4MDFmZiwgMHgyMDcxLCAweDAzMDAsIDB4NzAxYiwKKwkweDAyMDAsIDB4NzAxOCwgMHhkMDk0LCAweDAxMTAsIDB4MWYwNCwgMHg4ZGU3LCAweDcwMWIsIDB4MDIwMiwKKwkweGEwMDEsIDB4YTAwMSwgMHg3MDE4LCAweGQwOTQsIDB4MWQ5MCwgMHhiOGFjLCAweDkwMDUsIDB4MDFlOCwKKwkweDIwNjAsIDB4NjAwYywgMHhiOGFlLCAweDYwMjQsIDB4YzA4ZCwgMHg2MDI2LCAweDYwMDMsIDB4MDAwNCwKKwkweDYwMWIsIDB4MDAwMCwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwgMHgwMTAxLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4OGIsIDB4MDAwMCwgMHhhOGE4LCAweGE4YWIsIDB4MDAwMCwgMHg5MDRkLCAweDA5MGMsIDB4MGRkNSwKKwkweDA4MGMsIDB4MTAzMSwgMHgwODBjLCAweDg5YTcsIDB4MGMwMCwgMHgyMDcxLCAweDAzMDAsIDB4NzAxYiwKKwkweDAyMDAsIDB4MDE1ZSwgMHgwMTJlLCAweDAwM2UsIDB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDAwMTYsIDB4MDAwNiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3YywKKwkweDAxNWUsIDB4MTFiMCwgMHgwODBjLCAweDY2MzgsIDB4MTkwYywgMHgwZGQ1LCAweDAwMGUsIDB4MDAxZSwKKwkweGI5MTIsIDB4YjgxNiwgMHgwODBjLCAweGFlZWQsIDB4MDE0MCwgMHgyYjAwLCAweDYwMTIsIDB4NjAyMywKKwkweDAwMDEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4YWZiZSwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwKKwkweDAwMGUsIDB4MDAxZSwgMHgwY2QwLCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywKKwkweDBkZDUsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4OGU1YywgMHg4ZTVjLCAweDhlNWMsIDB4OGU1ZSwKKwkweDhlYWYsIDB4OGU1YywgMHg4ZTVjLCAweDhlNWMsIDB4OGYxNiwgMHg4ZTVjLCAweDhmNTMsIDB4OGU1YywKKwkweDhlNWMsIDB4OGU1YywgMHg4ZTVjLCAweDhlNWMsIDB4MDgwYywgMHgwZGQ1LCAweDkxODIsIDB4MDA0MCwKKwkweDAwMDIsIDB4OGU3MSwgMHg4ZTcxLCAweDhlNzEsIDB4OGU3MSwgMHg4ZTcxLCAweDhlNzEsIDB4OGU3MSwKKwkweDhlNzEsIDB4OGU3MSwgMHg4ZTczLCAweDhlODgsIDB4OGU3MSwgMHg4ZTcxLCAweDhlNzEsIDB4OGU3MSwKKwkweDhlOWIsIDB4MDgwYywgMHgwZGQ1LCAweDAwOTYsIDB4MDgwYywgMHg5NzEzLCAweDA4MGMsIDB4OTg5MSwKKwkweDYxMTQsIDB4MjE0OCwgMHhhODdiLCAweDAwMDAsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhiYiwKKwkweDA1MDAsIDB4MDBiZSwgMHgwODBjLCAweDZiMWQsIDB4MDgwYywgMHhhZjQzLCAweDAwOWUsIDB4MDAwNSwKKwkweDA4MGMsIDB4OTcxMywgMHgwMGQ2LCAweDYxMTQsIDB4MDgwYywgMHhjYzg2LCAweDAxMzAsIDB4MDA5NiwKKwkweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwMGRlLCAweDA4MGMsIDB4YWY0MywKKwkweDA4MGMsIDB4OTg5MSwgMHgwMDA1LCAweDA4MGMsIDB4OTcxMywgMHgwODBjLCAweDMyMWUsIDB4NjExNCwKKwkweDAwOTYsIDB4MjE0OCwgMHgwODBjLCAweGNjODYsIDB4MDEyMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywKKwkweDZkMTcsIDB4MDA5ZSwgMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5ODkxLCAweDAwMDUsIDB4NjAxYiwKKwkweDAwMDAsIDB4OTE4MiwgMHgwMDQwLCAweDAwOTYsIDB4MDAwMiwgMHg4ZWNhLCAweDhlY2EsIDB4OGVjYSwKKwkweDhlY2EsIDB4OGVjYSwgMHg4ZWNhLCAweDhlY2EsIDB4OGVjYSwgMHg4ZWNjLCAweDhlY2EsIDB4OGVjYSwKKwkweDhlY2EsIDB4OGYxMiwgMHg4ZWNhLCAweDhlY2EsIDB4OGVjYSwgMHg4ZWNhLCAweDhlY2EsIDB4OGVjYSwKKwkweDhlZDMsIDB4OGVjYSwgMHgwODBjLCAweDBkZDUsIDB4NjExNCwgMHgyMTQ4LCAweGE5MzgsIDB4OTE4ZSwKKwkweGZmZmYsIDB4MDkwNCwgMHg4ZjEyLCAweDYwMjQsIDB4ZDA4YywgMHgxNWMwLCAweDAwZTYsIDB4NjExNCwKKwkweDIxNDgsIDB4MDgwYywgMHg4Yzc2LCAweDAwOTYsIDB4YThhOCwgMHgyMDQ4LCAweDA4MGMsIDB4NmFiNSwKKwkweDAwOWUsIDB4YThhYiwgMHgwMDAwLCAweDYwMTAsIDB4OTAwNSwgMHgwMTI4LCAweDAwYjYsIDB4MjA1OCwKKwkweDA4MGMsIDB4OGRhNywgMHgwMGJlLCAweGFlODgsIDB4MDBiNiwgMHgyMDU5LCAweDAwMDAsIDB4MDgwYywKKwkweDg5YjAsIDB4MDBiZSwgMHgwMWUwLCAweDIwNzEsIDB4MTkzYywgMHgwODBjLCAweDg5ZjcsIDB4MDFiOCwKKwkweDkwODYsIDB4MDAwMSwgMHgxMTI4LCAweDIwMDEsIDB4MTk0NiwgMHgyMDA0LCAweDkwMDUsIDB4MTE3OCwKKwkweDAwOTYsIDB4MDgwYywgMHgwZmZmLCAweDI5MDAsIDB4MDA5ZSwgMHgwMTQ4LCAweGE4YWEsIDB4MDBmNiwKKwkweDJjNzgsIDB4MDgwYywgMHg4OTZlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwMDUsIDB4MDgwYywKKwkweDg5YTcsIDB4MGNkMCwgMHgwODBjLCAweDhmYzAsIDB4MDA5ZSwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwKKwkweDAwOTYsIDB4MDAwMiwgMHg4ZjJhLCAweDhmMmEsIDB4OGYyYSwgMHg4ZjJjLCAweDhmMmEsIDB4OGYyYSwKKwkweDhmMmEsIDB4OGY1MSwgMHg4ZjJhLCAweDhmMmEsIDB4OGYyYSwgMHg4ZjJhLCAweDhmMmEsIDB4OGYyYSwKKwkweDhmMmEsIDB4OGYyYSwgMHgwODBjLCAweDBkZDUsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4NjAxNCwKKwkweDIwNDgsIDB4YThhYywgMHhhODQ2LCAweGE4YjAsIDB4YTg0YSwgMHhhODM3LCAweDAwMDAsIDB4YTgzYiwKKwkweDAwMDAsIDB4YTg4NCwgMHg5MDkyLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLCAweDE5OTksIDB4ODAwMywKKwkweDgwMTMsIDB4ODIxMywgMHg5MjEwLCAweDYyMWEsIDB4MmMxMCwgMHgwODBjLCAweDFiZWIsIDB4MDgwYywKKwkweDkyMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5ODkxLCAweDAxMmUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4OTcxMywgMHgwODBjLCAweDk4OTEsIDB4NjExNCwKKwkweDIxNDgsIDB4YTg3YiwgMHgwMDAwLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmIsIDB4MDUwMCwKKwkweDAwYmUsIDB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsIDB4NjAwMCwKKwkweDkwOGEsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsIDB4MDA5NiwgMHgwMDEzLCAweDAwOWUsIDB4MDAwNSwKKwkweDhmODAsIDB4OGY4MCwgMHg4ZjgwLCAweDhmODIsIDB4OGY5MywgMHg4ZjgwLCAweDhmODAsIDB4OGY4MCwKKwkweDhmODAsIDB4OGY4MCwgMHg4ZjgwLCAweDhmODAsIDB4OGY4MCwgMHg4ZjgwLCAweDhmODAsIDB4OGY4MCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweGE4OWIsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwNiwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmIsIDB4MDUwMCwgMHgwMGJlLCAweDA4MGMsIDB4NmQxNywKKwkweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDA0NjEsIDB4MDAwNSwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwKKwkweDFhMGMsIDB4MGRkNSwgMHgwMDk2LCAweDAwMTMsIDB4MDA5ZSwgMHgwMDA1LCAweDhmYWUsIDB4OGZhZSwKKwkweDhmYWUsIDB4OGZiMCwgMHg4ZmMwLCAweDhmYWUsIDB4OGZhZSwgMHg4ZmFlLCAweDhmYWUsIDB4OGZhZSwKKwkweDhmYWUsIDB4OGZhZSwgMHg4ZmFlLCAweDhmYWUsIDB4OGZhZSwgMHg4ZmFlLCAweDA4MGMsIDB4MGRkNSwKKwkweDAwMzYsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZTYsIDB4NzAzYywgMHg5YzA2LCAweDExMjAsIDB4MjAxOSwKKwkweDAwMDAsIDB4MDgwYywgMHhhNmFjLCAweDA4MGMsIDB4YTg5YiwgMHgwMGVlLCAweDAwM2UsIDB4MDAwNSwKKwkweDYwMjQsIDB4ZDA4YywgMHgxMWYwLCAweDAwZjYsIDB4MDBlNiwgMHg2MDFiLCAweDAwMDAsIDB4NjAxNCwKKwkweDIwNDgsIDB4NjAxMCwgMHg5MDA1LCAweDAxMjgsIDB4MDBiNiwgMHgyMDU4LCAweDA4MGMsIDB4OGRhNywKKwkweDAwYmUsIDB4MjA3MSwgMHgxOTNjLCAweDA4MGMsIDB4ODlmNywgMHgwMTYwLCAweDIwMDEsIDB4MTg3ZiwKKwkweDIwMDQsIDB4YTg4YSwgMHgyMDMxLCAweDAwMDAsIDB4MmM3OCwgMHgwODBjLCAweDg5NmUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgwMDk2LCAweGE4OGIsIDB4MDAwMCwgMHhhOGE4LCAweDIwNDgsIDB4MDgwYywKKwkweDEwMzEsIDB4MDA5ZSwgMHhhOGFiLCAweDAwMDAsIDB4MDgwYywgMHg4OWE3LCAweDBjODAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDE4N2EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDM2LCAweDAwNDYsIDB4MjBhOSwgMHgwMDEwLCAweDkwMDYsIDB4ODAwNCwKKwkweDIwMTksIDB4MDEwMCwgMHgyMzFjLCAweDkzYTYsIDB4MDAwOCwgMHgxMTE4LCAweDgwODYsIDB4ODE4ZSwKKwkweDAwMjAsIDB4ODBmNiwgMHgzZTAwLCAweDgxZjYsIDB4M2UwOCwgMHgxMjA4LCAweDkyMDAsIDB4MWYwNCwKKwkweDkwMDgsIDB4OTNhNiwgMHgwMDA4LCAweDExMTgsIDB4ODA4NiwgMHg4MThlLCAweDAwMjAsIDB4ODBmNiwKKwkweDNlMDAsIDB4ODFmNiwgMHgzZTA4LCAweDAwNGUsIDB4MDAzZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwMDc2LCAweDAxNTYsIDB4MjBhOSwgMHgwMDEwLCAweDkwMDUsIDB4MDUxMCwKKwkweDkxMWEsIDB4MTYwMCwgMHg4MjEzLCAweDIwMzksIDB4MDEwMCwgMHgyNzNjLCAweDk3YmUsIDB4MDAwOCwKKwkweDExMTAsIDB4ODE4ZCwgMHgwMDEwLCAweDgxZjUsIDB4M2UwOCwgMHgwMjI4LCAweDkxMWEsIDB4MTIyMCwKKwkweDFmMDQsIDB4OTAzMiwgMHgwMDI4LCAweDkxMWEsIDB4MjMwOCwgMHg4MjEwLCAweDFmMDQsIDB4OTAzMiwKKwkweDAwMDYsIDB4MzIwMCwgMHg5MDg0LCAweGVmZmYsIDB4MjA4MCwgMHgwMDBlLCAweDAxNWUsIDB4MDA3ZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMDA2LCAweDMyMDAsIDB4OTA4NSwgMHgxMDAwLCAweDBjYTgsIDB4MDEyNiwKKwkweDIwOTEsIDB4MjgwMCwgMHgyMDc5LCAweDE5ZTYsIDB4MDEyZSwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwKKwkweDY4MDMsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsIDB4MDFkNiwgMHgyMGU5LCAweDAwMDAsIDB4MjA2OSwKKwkweDAyMDAsIDB4MDgwYywgMHhhYmZlLCAweDA0MDEsIDB4MDgwYywgMHhhYmU5LCAweDAwZTksIDB4MDgwYywKKwkweGFiZWMsIDB4MDBkMSwgMHgwODBjLCAweGFiZWYsIDB4MDBiOSwgMHgwODBjLCAweGFiZjIsIDB4MDBhMSwKKwkweDA4MGMsIDB4YWJmNSwgMHgwMDg5LCAweDA4MGMsIDB4YWJmOCwgMHgwMDcxLCAweDA4MGMsIDB4YWJmYiwKKwkweDAwNTksIDB4MDFkZSwgMHgwMTRlLCAweDAxNWUsIDB4MjA2OSwgMHgwMDA0LCAweDJkMDQsIDB4OTA4NSwKKwkweDgwMDEsIDB4MjA2YSwgMHgwMGRlLCAweDAwMDUsIDB4MjBhOSwgMHgwMDIwLCAweDIwYTEsIDB4MDI0MCwKKwkweDIwMDEsIDB4MDAwMCwgMHg0MDA0LCAweDAwMDUsIDB4MDBjNiwgMHg2MDI3LCAweDAwMDEsIDB4NzgwNCwKKwkweDkwODQsIDB4MDAwNywgMHgwMDAyLCAweDkwYTUsIDB4OTBjOSwgMHg5MTBhLCAweDkwYWIsIDB4OTBjOSwKKwkweDkwYTUsIDB4OTBhMywgMHg5MGEzLCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDg2MzYsIDB4MDgwYywKKwkweDk3NjMsIDB4MDBjZSwgMHgwMDA1LCAweDYyYzAsIDB4ODJmZiwgMHgxMTEwLCAweDAwY2UsIDB4MDAwNSwKKwkweDIwMTEsIDB4NWYxNiwgMHgwODBjLCAweDg1YjAsIDB4NzgyOCwgMHg5MDkyLCAweDAwYzgsIDB4MTIyOCwKKwkweDgwMDAsIDB4NzgyYSwgMHgwODBjLCAweDVmNTYsIDB4MGM4OCwgMHg2MmMwLCAweDA4MGMsIDB4YWQzYSwKKwkweDA4MGMsIDB4NWYxNiwgMHg3ODA3LCAweDAwMDMsIDB4NzgyNywgMHgwMDAwLCAweDc4MmIsIDB4MDAwMCwKKwkweDBjMjgsIDB4MDgwYywgMHg4NjM2LCAweDYyMjAsIDB4ZDJhNCwgMHgwMTcwLCAweGQyY2MsIDB4MDE2MCwKKwkweDc4MmIsIDB4MDAwMCwgMHg3ODI0LCAweDkwNjUsIDB4MDkwYywgMHgwZGQ1LCAweDIwMDksIDB4MDAxMywKKwkweDA4MGMsIDB4YWZiZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHg3ODI0LCAweDkwNjUsIDB4MDkwYywKKwkweDBkZDUsIDB4NzgyOCwgMHg5MDkyLCAweGMzNTAsIDB4MTJjMCwgMHg4MDAwLCAweDc4MmEsIDB4MDBjZSwKKwkweDA4MGMsIDB4MmJlMywgMHgwMjc4LCAweDAwYzYsIDB4NzkyNCwgMHgyMTYwLCAweDYwMTAsIDB4OTA2ZCwKKwkweDA5MGMsIDB4MGRkNSwgMHg3ODA3LCAweDAwMDAsIDB4NzgyNywgMHgwMDAwLCAweDAwY2UsIDB4MDgwYywKKwkweDk3NjMsIDB4MGMwMCwgMHgwODBjLCAweGEzMzIsIDB4MDhlOCwgMHgyMDExLCAweDAxMzAsIDB4MjIxNCwKKwkweDA4MGMsIDB4YWQzYSwgMHgwODBjLCAweGViOGUsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4YWZiZSwKKwkweDAwY2UsIDB4MDg4MCwgMHgyMDAxLCAweDFhMDIsIDB4MjAwMywgMHgwMDAwLCAweDYyYzAsIDB4ODJmZiwKKwkweDExNjAsIDB4NzgyYiwgMHgwMDAwLCAweDc4MjQsIDB4OTA2NSwgMHgwOTBjLCAweDBkZDUsIDB4MjAwOSwKKwkweDAwMTMsIDB4MDgwYywgMHhiMDEwLCAweDAwY2UsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwKKwkweDc4MjQsIDB4OTAwNSwgMHgwOTBjLCAweDBkZDUsIDB4NzgyOCwgMHg5MDkyLCAweGMzNTAsIDB4MTY0OCwKKwkweDgwMDAsIDB4NzgyYSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwODBjLCAweDJiZTMsIDB4MDJmMCwKKwkweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDc4MWMsIDB4OTA1ZCwgMHgwOTBjLCAweDBkZDUsIDB4YjgwMCwKKwkweGMwZGMsIDB4YjgwMiwgMHg3OTI0LCAweDIxNjAsIDB4MDgwYywgMHhhZjQzLCAweGI5M2MsIDB4ODFmZiwKKwkweDA5MGMsIDB4MGRkNSwgMHg4MTA5LCAweGI5M2UsIDB4NzgwNywgMHgwMDAwLCAweDc4MjcsIDB4MDAwMCwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDA4MGMsIDB4OTc2MywgMHgwODY4LCAweDA4MGMsIDB4YTMzMiwKKwkweDA4NTAsIDB4MjAxMSwgMHgwMTMwLCAweDIyMTQsIDB4MDgwYywgMHhhZDNhLCAweDA4MGMsIDB4ZWI4ZSwKKwkweDc4MjQsIDB4OTA2NSwgMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHhhZmJlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwYmUsIDB4MDgwNCwgMHg5MTFiLCAweDAwYzYsIDB4MjAwMSwgMHgwMDliLCAweDIwMDQsIDB4ZDBmYywKKwkweDE5MGMsIDB4MWVmMiwgMHg2MDI0LCAweDYwMjcsIDB4MDAwMiwgMHhkMGY0LCAweDE1YjgsIDB4NjJjOCwKKwkweDYwYzQsIDB4OTIwNSwgMHgxMTcwLCAweDc4M2MsIDB4OTA2NSwgMHgwMTMwLCAweDIwMDksIDB4MDA0OSwKKwkweDA4MGMsIDB4YWZiZSwgMHgwMGNlLCAweDAwMDUsIDB4MjAxMSwgMHgxYTA1LCAweDIwMTMsIDB4MDAwMCwKKwkweDBjYzgsIDB4NzkzYywgMHg4MWZmLCAweDBkYzAsIDB4Nzk0NCwgMHg5MTkyLCAweDc1MzAsIDB4MTYyOCwKKwkweDgxMDgsIDB4Nzk0NiwgMHg3OTNjLCAweDkxODgsIDB4MDAwOCwgMHgyMTBjLCAweDkxOGUsIDB4MDAwNiwKKwkweDExMzgsIDB4NjAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDEyLCAweDYwMTYsIDB4MGMxMCwKKwkweDc5M2MsIDB4OTE4OCwgMHgwMDA4LCAweDIxMGMsIDB4OTE4ZSwgMHgwMDA5LCAweDBkOTAsIDB4NjAxNCwKKwkweDkwODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwMTYsIDB4NjAxNiwgMHgwOGEwLCAweDc5M2MsIDB4MjE2MCwKKwkweDIwMDksIDB4MDA0YSwgMHgwODBjLCAweGFmYmUsIDB4MDg2OCwgMHg3ODQ4LCAweGMwODUsIDB4Nzg0YSwKKwkweDA4NDgsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweDE5ZTYsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAxMCwKKwkweDkwMDUsIDB4MDE0OCwgMHg5MDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTEyLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDYxMTYsIDB4NjExMiwgMHgwY2MwLCAweDAwZDYsIDB4MjA2OSwKKwkweDE5ZTYsIDB4YjgwMCwgMHhkMGQ0LCAweDAxNjgsIDB4NjgyMCwgMHg4MDAwLCAweDY4MjIsIDB4OTA4NiwKKwkweDAwMDEsIDB4MTExMCwgMHgyYjAwLCAweDY4MWUsIDB4MDBkZSwgMHgwODA0LCAweDk3NjMsIDB4MDBkZSwKKwkweDAwMDUsIDB4YzBkNSwgMHhiODAyLCAweDY4MTgsIDB4OTAwNSwgMHgwMTY4LCAweGI4NTYsIDB4Yjg1YiwKKwkweDAwMDAsIDB4MDA4NiwgMHgwMDA2LCAweDJiMDAsIDB4NjgxYSwgMHgwMDhlLCAweGEwNWEsIDB4MDA4ZSwKKwkweDIwNjksIDB4MTllNiwgMHgwYzA4LCAweGI4NTYsIDB4Yjg1YSwgMHgyYjAwLCAweDY4MWEsIDB4NjgxZSwKKwkweDA4ZDgsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweDE5ZTYsIDB4NjAyMCwgMHg4MDAwLCAweDYwMjIsIDB4NjAwOCwKKwkweDkwMDUsIDB4MDE0OCwgMHg5MDgwLCAweDAwMDMsIDB4MjEwMiwgMHg2MTBhLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDYxMGUsIDB4NjEwYSwgMHgwY2MwLCAweDAwYzYsIDB4NjAwZiwKKwkweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweDE5ZTYsIDB4NjAzNCwgMHg5MDA1LCAweDAxMzAsIDB4OTA4MCwKKwkweDAwMDMsIDB4MjEwMiwgMHg2MTM2LCAweDAwY2UsIDB4MDAwNSwgMHg2MTNhLCAweDYxMzYsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMGI2LCAweDAwOTYsIDB4MDA3NiwKKwkweDAwNjYsIDB4MDA1NiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsIDB4OTAyZSwKKwkweDIwNzEsIDB4MTllNiwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsIDB4OGNmZiwKKwkweDA5MDQsIDB4OTJhNSwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDE5MDQsIDB4OTJhMCwKKwkweDg3ZmYsIDB4MDEyMCwgMHg2MDU0LCAweDkxMDYsIDB4MTkwNCwgMHg5MmEwLCAweDcwM2MsIDB4OWMwNiwKKwkweDExNzgsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHhhNmFjLCAweDcwMzMsIDB4MDAwMCwKKwkweDkwMDYsIDB4NzAzZSwgMHg3MDQyLCAweDcwNDYsIDB4NzA0YSwgMHgwMDNlLCAweDIwMjksIDB4MDAwMSwKKwkweDcwMzgsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweDljMzYsIDB4MTE0MCwKKwkweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAzNiwgMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwKKwkweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwKKwkweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweGNjODYsIDB4MDFmMCwgMHg2MDE0LCAweDIwNDgsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwMywgMHgxNWI4LCAweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4YTg4YiwKKwkweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDA3NiwKKwkweDA4MGMsIDB4Y2Y3YywgMHgwODBjLCAweGVhOTQsIDB4MDgwYywgMHg2ZDE3LCAweDAwN2UsIDB4MDAzZSwKKwkweDAwMWUsIDB4MDgwYywgMHhjZTcxLCAweDA4MGMsIDB4YWY3NCwgMHgwMGNlLCAweDA4MDQsIDB4OTIzZiwKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4OTIzZiwgMHg4NWZmLCAweDAxMjAsIDB4MDAzNiwKKwkweDA4MGMsIDB4OTg5MSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwKKwkweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOWUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTU4LCAweDAwMTYsIDB4MDAzNiwKKwkweDAwNzYsIDB4MDgwYywgMHhlYTk0LCAweDA4MGMsIDB4ZTZkZCwgMHgwMDdlLCAweDAwM2UsIDB4MDAxZSwKKwkweDA4OTAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MTE2OCwgMHhhODdiLCAweDAwMDYsIDB4MDAxNiwKKwkweDAwMzYsIDB4MDA3NiwgMHgwODBjLCAweDZkMTcsIDB4MDgwYywgMHhhZjQzLCAweDAwN2UsIDB4MDAzZSwKKwkweDAwMWUsIDB4MDgxOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwgMHgwOTA0LCAweDkyOGEsIDB4MDgwNCwKKwkweDkyODMsIDB4MDAwNiwgMHgwMDY2LCAweDAwOTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZjYsIDB4OTAzNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MTllNiwgMHg3ODM4LCAweDkwNjUsIDB4MDkwNCwKKwkweDkzMzYsIDB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODNjLCAweDljMDYsIDB4MTE2OCwKKwkweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTZhYywgMHg3ODMzLCAweDAwMDAsIDB4OTAxZSwKKwkweDdiM2UsIDB4N2I0MiwgMHg3YjQ2LCAweDdiNGEsIDB4MDAzZSwgMHgwODBjLCAweGNjODYsIDB4MDU0OCwKKwkweDYwMTQsIDB4MjA0OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxNTkwLCAweDNlMDgsIDB4OTE4ZSwKKwkweDAwMDIsIDB4MTE4OCwgMHg2MDEwLCAweDkwMDUsIDB4MDE3MCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwKKwkweDAwYmUsIDB4ZDBiYywgMHgwMTQwLCAweDYwNDAsIDB4OTAwNSwgMHgxMWE4LCAweDIwMDEsIDB4MTk4NywKKwkweDIwMDQsIDB4NjA0MiwgMHgwMDgwLCAweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4YTg4YiwKKwkweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkMGIsIDB4MDgwYywKKwkweGNlNzEsIDB4MDgwYywgMHhhZjc0LCAweDAwMGUsIDB4MDgwNCwgMHg5MmVlLCAweDdlM2EsIDB4N2UzNiwKKwkweDAxMmUsIDB4MDBmZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMDZlLCAweDAwMGUsIDB4MDAwNSwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhlNmRkLCAweDBjNTAsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwOSwgMHgxMTMwLCAweGFiN2EsIDB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4YWY0MywKKwkweDBjMTAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MDlhOCwgMHgwODY4LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwODYsIDB4OTA0NiwgMHgwMDk5LCAweDA4MGMsIDB4OTQ0MSwgMHgwMDhlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMTI2LCAweDIwNzksIDB4MTllNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDk0ZDgsIDB4MDgwYywgMHg5NTY4LCAweDAxMmUsIDB4MDBmZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4NzYxNCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwKKwkweDA5MDQsIDB4OTQwNiwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDE5MDQsIDB4OTQwMSwKKwkweDg4ZmYsIDB4MDEyMCwgMHg2MDU0LCAweDkxMDYsIDB4MTkwNCwgMHg5NDAxLCAweDcwMjQsIDB4OWMwNiwKKwkweDE1NjgsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjAsIDB4ZDBhNCwgMHgwMTEwLCAweGQwY2MsIDB4MTUwOCwKKwkweDA4MGMsIDB4ODYzNiwgMHgwODBjLCAweGEzNTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTg4YiwKKwkweDcwMjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwKKwkweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwKKwkweDAwMjgsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDgwNCwgMHg5NDAxLCAweDcwMTQsIDB4OWMzNiwKKwkweDExMTAsIDB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwKKwkweDAxMTgsIDB4MmYwMCwgMHg3MDEyLCAweDAwMTAsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MDFlOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywKKwkweDE1ODAsIDB4MDgwYywgMHhjZThlLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwOTgsIDB4YTg2NywKKwkweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwODYsIDB4MDgwYywKKwkweGNmN2MsIDB4MDgwYywgMHhlYTk0LCAweDA4MGMsIDB4NmQxNywgMHgwMDhlLCAweDAwM2UsIDB4MDAxZSwKKwkweDA4MGMsIDB4Y2U3MSwgMHgwODBjLCAweGFmNzQsIDB4MDgwYywgMHhhNzYxLCAweDAwY2UsIDB4MDgwNCwKKwkweDkzN2YsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg5MzdmLCAweDAxMmUsIDB4MDAwZSwKKwkweDAwMWUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwOWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTE1OCwgMHgwMDE2LCAweDAwMzYsIDB4MDA4NiwKKwkweDA4MGMsIDB4ZWE5NCwgMHgwODBjLCAweGU2ZGQsIDB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDhkMCwKKwkweDA4MGMsIDB4YjkwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwMiwgMHgxMTYwLCAweDYwMDQsIDB4MDAwNiwKKwkweDkwODYsIDB4MDA4NSwgMHgwMDBlLCAweDA5MDQsIDB4OTNlNywgMHg5MDg2LCAweDAwOGIsIDB4MDkwNCwKKwkweDkzZTcsIDB4MDg0MCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNSwgMHgxOTIwLCAweDYwMDQsIDB4MDAwNiwKKwkweDkwODYsIDB4MDA4NSwgMHgwMDBlLCAweDA5YzgsIDB4OTA4NiwgMHgwMDhiLCAweDA5YjAsIDB4MDgwNCwKKwkweDkzZmEsIDB4MDBiNiwgMHgwMGE2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4OTI4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwgMHgwOTA0LCAweDk0ZDEsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBkNiwgMHgwMDY2LCAweDIwNzEsIDB4MTllNiwgMHhiZTU0LCAweDcwMTgsIDB4OWIwNiwKKwkweDExMDgsIDB4NzYxYSwgMHg3MDFjLCAweDliMDYsIDB4MTEzMCwgMHg4NmZmLCAweDExMTgsIDB4NzAxOCwKKwkweDcwMWUsIDB4MDAwOCwgMHg3NjFlLCAweGI4NTgsIDB4OTA0ZCwgMHgwMTA4LCAweGFlNTYsIDB4OTZkNSwKKwkweDAwMDAsIDB4MDExMCwgMHgyOTAwLCAweGIwNWEsIDB4Yjg1NywgMHgwMDAwLCAweGI4NWIsIDB4MDAwMCwKKwkweGI4MDAsIDB4YzBkNCwgMHhjMGRjLCAweGI4MDIsIDB4MDgwYywgMHg2NWNiLCAweDA5MDQsIDB4OTRjZCwKKwkweDc2MjQsIDB4ODZmZiwgMHgwOTA0LCAweDk0YmMsIDB4OTY4MCwgMHgwMDA1LCAweDIwMDQsIDB4OTkwNiwKKwkweDE1ZDgsIDB4MDBkNiwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA1NjAsIDB4MDgwYywKKwkweDg2MzYsIDB4MDgwYywgMHhhMzU2LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGE4OGIsIDB4NzAyNywKKwkweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwKKwkweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsIDB4MjA2OSwKKwkweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4MDBkZSwKKwkweDAwYzYsIDB4YjgzYywgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwgMHhiODNlLCAweDI2NjAsIDB4MDgwYywKKwkweGFmNzQsIDB4MDBjZSwgMHgwMDQ4LCAweDAwZGUsIDB4MDBjNiwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwKKwkweDYzMGEsIDB4MDBjZSwgMHgwODA0LCAweDk0NzQsIDB4ODlmZiwgMHgwMTU4LCAweGE4NjcsIDB4MDEwMywKKwkweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4Y2Y3YywgMHgwODBjLCAweGVhOTQsIDB4MDgwYywKKwkweDZkMTcsIDB4MDgwYywgMHhhNzYxLCAweDA4MDQsIDB4OTQ3NCwgMHgwMDZlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDEyZSwgMHgwMDBlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMGFlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDAwNiwgMHgwMDY2LCAweDAwYzYsIDB4MDBkNiwgMHg5MDM2LCAweDc4MTQsIDB4OTA2NSwKKwkweDA5MDQsIDB4OTUzYiwgMHg2MDBjLCAweDAwMDYsIDB4NjAwZiwgMHgwMDAwLCAweDc4MjQsIDB4OWMwNiwKKwkweDE1ODAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjAsIDB4ZDBhNCwgMHgwMTEwLCAweGQwY2MsIDB4MTUwOCwKKwkweDA4MGMsIDB4ODYzNiwgMHgwODBjLCAweGEzNTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTg4YiwKKwkweDc4MjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwKKwkweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwKKwkweDAwNDAsIDB4MDgwYywgMHg2OWE0LCAweDE1MjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MmMzMCwKKwkweDAwZjgsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NCwgMHgwMWIwLCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTUwOCwgMHgwODBjLCAweGNlOGUsIDB4MTExOCwgMHgwODBjLCAweGI5MDUsIDB4MDA2MCwKKwkweDA4MGMsIDB4NjlhNCwgMHgxMTY4LCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGNlNzEsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsIDB4YTc2MSwKKwkweDAwMGUsIDB4MDgwNCwgMHg5NGRmLCAweDdlMTYsIDB4N2UxMiwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwKKwkweDAwMGUsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywKKwkweGU2ZGQsIDB4MGM1MCwgMHgwODBjLCAweGI5MDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE1MCwKKwkweDYwMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwODUsIDB4MDAwZSwgMHgwOTkwLCAweDkwODYsIDB4MDA4YiwKKwkweDA5NzgsIDB4MDhkMCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNSwgMHgxOWIwLCAweDYwMDQsIDB4MDAwNiwKKwkweDkwODYsIDB4MDA4NSwgMHgwMDBlLCAweDBkMTgsIDB4OTA4NiwgMHgwMDhiLCAweDBkMDAsIDB4MDg2MCwKKwkweDAwMDYsIDB4MDA2NiwgMHgwMDk2LCAweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDc4MTgsIDB4OTA1ZCwKKwkweDA5MDQsIDB4OTVlOCwgMHhiODU0LCAweDAwMDYsIDB4OTAwNiwgMHhiODU2LCAweGI4NWEsIDB4YjgwMCwKKwkweGMwZDQsIDB4YzBkYywgMHhiODAyLCAweDA4MGMsIDB4NjVjYiwgMHgwOTA0LCAweDk1ZTUsIDB4N2UyNCwKKwkweDg2ZmYsIDB4MDkwNCwgMHg5NWQ4LCAweDk2ODAsIDB4MDAwNSwgMHgyMDA0LCAweDk5MDYsIDB4MTkwNCwKKwkweDk1ZDgsIDB4MDBkNiwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA5MDQsIDB4OTVjZiwKKwkweDA4MGMsIDB4ODYzNiwgMHgwODBjLCAweGEzNTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTg4YiwKKwkweDc4MjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwKKwkweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwgMHg5MDA2LCAweDA4MGMsIDB4MmQ0ZSwKKwkweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwKKwkweDAwZGUsIDB4MDBjNiwgMHgzZTA4LCAweDkxOGUsIDB4MDAwMiwgMHgxMTY4LCAweGI4MDAsIDB4ZDBiYywKKwkweDAxNTAsIDB4OTY4MCwgMHgwMDEwLCAweDIwMGMsIDB4ODFmZiwgMHgxNTE4LCAweDIwMDksIDB4MTk4NywKKwkweDIxMGMsIDB4MjEwMiwgMHgwMGYwLCAweGI4M2MsIDB4OTAwNSwgMHgwMTEwLCAweDgwMDEsIDB4YjgzZSwKKwkweDI2NjAsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4YWY3NCwgMHgwMGNlLCAweDAwNDgsIDB4MDBkZSwKKwkweDAwYzYsIDB4MjY2MCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwMGNlLCAweDA4MDQsIDB4OTU3YiwKKwkweDg5ZmYsIDB4MDEzOCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkMTcsIDB4MDgwYywgMHhhNzYxLCAweDA4MDQsIDB4OTU3YiwgMHgwMDBlLCAweDA4MDQsIDB4OTU2ZiwKKwkweDc4MWUsIDB4NzgxYSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDllLCAweDAwNmUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4MDA2NiwgMHhiODAwLCAweGQwZGMsIDB4MDFhMCwKKwkweGI4NGMsIDB4OTA0ZCwgMHgwMTg4LCAweGE4NzgsIDB4OTYwNiwgMHgxMTcwLCAweDIwNzEsIDB4MTllNiwKKwkweDcwMjQsIDB4OTAzNSwgMHgwMTQ4LCAweDkwODAsIDB4MDAwNSwgMHgyMDA0LCAweDk5MDYsIDB4MTEyMCwKKwkweGI4MDAsIDB4YzBkYywgMHhiODAyLCAweDAwMjksIDB4MDA2ZSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzhjMCwgMHg5MDA1LCAweDExMzgsIDB4MDBjNiwKKwkweDI2NjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwNGI4LCAweDA4MGMsIDB4YTM1NiwKKwkweDc4YzMsIDB4MDAwMCwgMHgwODBjLCAweGE4OGIsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA3OSwKKwkweDAxNDAsIDB4N2IwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywKKwkweDJkNGUsIDB4OTAwNiwgMHgwODBjLCAweDJkNGUsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDA4NCwKKwkweDAxMTAsIDB4NzgyNywgMHgwMDAxLCAweDA4MGMsIDB4YTg4YiwgMHgwMDNlLCAweDA4MGMsIDB4NjVjYiwKKwkweDAwYzYsIDB4YjgzYywgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwgMHhiODNlLCAweDI2NjAsIDB4MDgwYywKKwkweGFmNDMsIDB4MDBjZSwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweGNmN2MsIDB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4YTc2MSwgMHgwMGZlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwZTYsIDB4MDBjNiwgMHgyMDExLCAweDAxMDEsIDB4MjIwNCwgMHhjMGM0LCAweDIwMTIsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAxNCwgMHhjMmU0LCAweDIyMDIsIDB4MjA3MSwgMHgxOWU2LCAweDcwMDQsIDB4OTA4NCwKKwkweDAwMDcsIDB4MDAwMiwgMHg5Njc0LCAweDk2NzgsIDB4OTY5NiwgMHg5NmJmLCAweDk2ZmQsIDB4OTY3NCwKKwkweDk2OGYsIDB4OTY3MiwgMHgwODBjLCAweDBkZDUsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwKKwkweDcwMjQsIDB4OTA2NSwgMHgwMTQ4LCAweDcwMjAsIDB4ODAwMSwgMHg3MDIyLCAweDYwMGMsIDB4OTAxNSwKKwkweDAxNTgsIDB4NzIxNiwgMHg2MDBmLCAweDAwMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4NzIxNiwgMHg3MjEyLCAweDBjYTgsIDB4NzAwNywKKwkweDAwMDAsIDB4NzAyNywgMHgwMDAwLCAweDcwMjAsIDB4OTAwNSwgMHgwMDcwLCAweDYwMTAsIDB4MjA1OCwKKwkweDA4MGMsIDB4NjVjYiwgMHhiODAwLCAweGMwZGMsIDB4YjgwMiwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywKKwkweDAwMDAsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4MTE0OCwgMHgyMDAxLCAweDE4MGMsIDB4MjAxNCwKKwkweGQyZWMsIDB4MTE4MCwgMHgwMGNlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweGI4NTQsIDB4OTAxNSwKKwkweDAxMjAsIDB4NzIxZSwgMHgwODBjLCAweDk3NjMsIDB4MGNhOCwgMHg3MjE4LCAweDcyMWUsIDB4MDgwYywKKwkweDk3NjMsIDB4MGM4MCwgMHhjMmVjLCAweDIyMDIsIDB4MDgwYywgMHg5ODkxLCAweDBjNTgsIDB4NzAyNCwKKwkweDkwNjUsIDB4MDViOCwgMHg3MDBjLCAweDljMDYsIDB4MTE2MCwgMHgwODBjLCAweGE3NjEsIDB4NjAwYywKKwkweDkwMTUsIDB4MDEyMCwgMHg3MjBlLCAweDYwMGYsIDB4MDAwMCwgMHgwNDQ4LCAweDcyMGUsIDB4NzIwYSwKKwkweDA0MzAsIDB4NzAxNCwgMHg5YzA2LCAweDExNjAsIDB4MDgwYywgMHhhNzYxLCAweDYwMGMsIDB4OTAxNSwKKwkweDAxMjAsIDB4NzIxNiwgMHg2MDBmLCAweDAwMDAsIDB4MDBkMCwgMHg3MjE2LCAweDcyMTIsIDB4MDBiOCwKKwkweDYwMjAsIDB4OTA4NiwgMHgwMDAzLCAweDExOTgsIDB4NjAxMCwgMHgyMDU4LCAweDA4MGMsIDB4NjVjYiwKKwkweGI4MDAsIDB4YzBkYywgMHhiODAyLCAweDA4MGMsIDB4YTc2MSwgMHg3MDFjLCAweDkwNjUsIDB4MDEzOCwKKwkweGI4NTQsIDB4OTAxNSwgMHgwMTEwLCAweDcyMWUsIDB4MDAxMCwgMHg3MjE4LCAweDcyMWUsIDB4NzAyNywKKwkweDAwMDAsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHg3MDI0LCAweDkwNjUsIDB4MDE0MCwKKwkweDA4MGMsIDB4YTc2MSwgMHg2MDBjLCAweDkwMTUsIDB4MDE1OCwgMHg3MjBlLCAweDYwMGYsIDB4MDAwMCwKKwkweDA4MGMsIDB4YTg4YiwgMHg3MDI3LCAweDAwMDAsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwKKwkweDcyMGUsIDB4NzIwYSwgMHgwY2E4LCAweDAwZDYsIDB4MjA2OSwgMHgxOWU2LCAweDY4MzAsIDB4OTA4NCwKKwkweDAwMDMsIDB4MDAwMiwgMHg5NzIwLCAweDk3MjIsIDB4OTc0NiwgMHg5NzFlLCAweDA4MGMsIDB4MGRkNSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDY4NDAsIDB4OTA4NiwgMHgwMDAxLCAweDAxYjgsIDB4NjgzYywKKwkweDkwNjUsIDB4MDEzMCwgMHg2MDBjLCAweDkwMTUsIDB4MDE3MCwgMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwKKwkweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MjAxMSwgMHgxYTA1LCAweDIwMTMsIDB4MDAwMCwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4M2EsIDB4NjgzNiwgMHgwYzkwLCAweDY4NDMsIDB4MDAwMCwKKwkweDY4MzgsIDB4OTA2NSwgMHgwZDY4LCAweDYwMDMsIDB4MDAwMywgMHgwYzUwLCAweDAwYzYsIDB4OTAwNiwKKwkweDY4NDIsIDB4Njg0NiwgMHg2ODRhLCAweDY4M2MsIDB4OTA2NSwgMHgwMTYwLCAweDYwMGMsIDB4OTAxNSwKKwkweDAxMzAsIDB4NmEzYSwgMHg2MDBmLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDAwMTgsIDB4NjgzZSwKKwkweDY4M2EsIDB4NjgzNiwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywKKwkweGMxZTUsIDB4MjEwMiwgMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGQxZWMsIDB4MDEyMCwKKwkweGMxZWMsIDB4MjEwMiwgMHgwODBjLCAweDk4OTEsIDB4MjAwMSwgMHgxOWYyLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMDEsIDB4MGQ1OCwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwgMHg2ODA0LCAweDkwODQsIDB4MDAwNywKKwkweDAwMDYsIDB4OTAwNSwgMHgxMWM4LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweDkwODQsIDB4MDAyOCwKKwkweDExOTgsIDB4MjAwMSwgMHgxOTdiLCAweDIwMDQsIDB4OTA4NiwgMHhhYWFhLCAweDAxNjgsIDB4MjAwMSwKKwkweDE4OGIsIDB4MjAwNCwgMHhkMDhjLCAweDExMTgsIDB4ZDA4NCwgMHgxMTE4LCAweDAwMjgsIDB4MDgwYywKKwkweDk4OTEsIDB4MDAwZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAwZSwgMHgwMDAyLCAweDk3YTAsIDB4OTg1ZiwKKwkweDk4NWYsIDB4OTg1ZiwgMHg5ODVmLCAweDk4NjEsIDB4OTg1ZiwgMHg5NzllLCAweDA4MGMsIDB4MGRkNSwKKwkweDY4MjAsIDB4OTAwNSwgMHgxMTEwLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDY4MGMsIDB4OTA2NSwKKwkweDA1MjAsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk2NCwgMHgwMDllLCAweDkxOGMsIDB4MDBmZiwKKwkweDkxOGUsIDB4MDAzNSwgMHgxMTgwLCAweDIwMDksIDB4MTgzNywgMHgyMTBjLCAweDkxOGMsIDB4MDAyOCwKKwkweDExNTAsIDB4MDgwYywgMHg3NDNlLCAweDAxMzgsIDB4MDAwNiwgMHgyMDA5LCAweDE4OGIsIDB4MjEwNCwKKwkweGMwOTUsIDB4MjAwYSwgMHgwMDBlLCAweDY4MDcsIDB4MDAwNCwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwKKwkweDA4MGMsIDB4OTkzYSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODE0LCAweDkwNjUsIDB4MDE1MCwKKwkweDY4MDcsIDB4MDAwMSwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLCAweDk5M2EsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4NmExYywgMHg5MmRkLCAweDAwMDAsIDB4MDkwNCwKKwkweDk4NDksIDB4Yjg0YywgMHg5MDBkLCAweDAxMTgsIDB4Yjg4OCwgMHg5MDA1LCAweDAxYTAsIDB4Yjg1NCwKKwkweDkwNWQsIDB4MDEyMCwgMHg5MjBlLCAweDA5MDQsIDB4OTg0OSwgMHgwMDI4LCAweDY4MTgsIDB4OTIwZSwKKwkweDA5MDQsIDB4OTg0OSwgMHgyMDU4LCAweGI4NGMsIDB4OTAwZCwgMHgwZDg4LCAweGI4ODgsIDB4OTAwNSwKKwkweDFkNzAsIDB4MmIwMCwgMHg2ODFlLCAweGJiM2MsIDB4YjgzOCwgMHg5MzAyLCAweDFlNDAsIDB4MDgwYywKKwkweGFmMWEsIDB4MDkwNCwgMHg5ODQ5LCAweDgzMTgsIDB4YmIzZSwgMHg2MTE2LCAweDJiMTAsIDB4NjIxMiwKKwkweDAwOTYsIDB4MjE0OCwgMHhhODgwLCAweDkwODQsIDB4MDBmZiwgMHg2MDVlLCAweGE4ODMsIDB4MDAwMCwKKwkweGE4ODQsIDB4MDA5ZSwgMHg5MDhhLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLCAweDE5OTksIDB4ODAwMywKKwkweDgwMWIsIDB4ODMxYiwgMHg5MzE4LCAweDYzMWEsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk2NCwKKwkweDAwOWUsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDA0OCwgMHgwNTM4LCAweDAwZjYsIDB4MmM3OCwKKwkweDIwNjEsIDB4MDEwMCwgMHhiYWMwLCAweDYyOWEsIDB4MjA2OSwgMHgwMjAwLCAweDIwNzEsIDB4MDI0MCwKKwkweDA4MGMsIDB4OWU5MSwgMHgyMDY5LCAweDE5ZTYsIDB4YmIwMCwgMHhjM2RkLCAweGJiMDIsIDB4NjgwNywKKwkweDAwMDIsIDB4MmYxOCwgMHg2YjI2LCAweDY4MmIsIDB4MDAwMCwgMHg3ODIzLCAweDAwMDMsIDB4NzgwMywKKwkweDAwMDEsIDB4NzgwNywgMHgwMDQwLCAweDAwZmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBlZSwgMHgwMGJlLCAweDAwY2UsIDB4MGNkMCwgMHg2ODA3LCAweDAwMDYsIDB4MmMxOCwKKwkweDZiMjYsIDB4NjgyMCwgMHg4MDAxLCAweDY4MjIsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsIDB4NjVjYiwKKwkweDA4MGMsIDB4YWQ1YSwgMHgwMGVlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBjNiwgMHg2ODBjLCAweDkwNjUsIDB4MDUwOCwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwKKwkweGE5NjQsIDB4MDA5ZSwgMHg5MThjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDM1LCAweDExODAsIDB4MjAwOSwKKwkweDE4MzcsIDB4MjEwYywgMHg5MThjLCAweDAwMjgsIDB4MTE1MCwgMHgwODBjLCAweDc0M2UsIDB4MDEzOCwKKwkweDAwMDYsIDB4MjAwOSwgMHgxODhiLCAweDIxMDQsIDB4YzA5NSwgMHgyMDBhLCAweDAwMGUsIDB4NjgwNywKKwkweDAwMDQsIDB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg5OTNhLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMTQsIDB4YzJlZCwgMHgyMjAyLCAweDAwZGUsIDB4MDBmZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGQ2LCAweDIwNjksIDB4MTllNiwgMHg2ODMwLCAweDkwODYsIDB4MDAwMCwKKwkweDE1NzAsIDB4MjAwMSwgMHgxODBjLCAweDIwMTQsIDB4ZDJlNCwgMHgwMTMwLCAweGMyZTQsIDB4MjIwMiwKKwkweDA4MGMsIDB4OTc3MiwgMHgyMDY5LCAweDE5ZTYsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFjNCwKKwkweDE1MDgsIDB4NjgzOCwgMHg5MDdkLCAweDAxZDgsIDB4NmEwNCwgMHg5Mjk2LCAweDAwMDAsIDB4MTkwNCwKKwkweDk5MmUsIDB4NzkyMCwgMHg5MThlLCAweDAwMDksIDB4MDU2OCwgMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwKKwkweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDAsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsIDB4MjQwMCwKKwkweDAwMmUsIDB4MDgwYywgMHgxYzg0LCAweDExNTgsIDB4MDEyZSwgMHgwODBjLCAweGExYjMsIDB4MDBkZSwKKwkweDAwZmUsIDB4MDAwNSwgMHhjMWM0LCAweDIxMDIsIDB4MDgwYywgMHg3NGVlLCAweDA4ZDAsIDB4MDEyZSwKKwkweDY4NDMsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwYywgMHg5MDE1LCAweDAxNDAsIDB4NmEzYSwKKwkweDc4MGYsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDBjNDAsIDB4NjgzYSwKKwkweDY4MzYsIDB4MGNjMCwgMHg3OTA4LCAweGQxZmMsIDB4MTE5OCwgMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwKKwkweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDAsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsIDB4MjQwMCwKKwkweDAwMmUsIDB4MDgwYywgMHgxYzg0LCAweDE5ZDgsIDB4MDEyZSwgMHgwODBjLCAweGExMzQsIDB4MDg3OCwKKwkweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweDkwODQsIDB4MDAyOCwgMHgxMTg4LCAweDIwMDEsIDB4MTk3YiwKKwkweDIwMDQsIDB4OTA4NiwgMHhhYWFhLCAweDAxNTgsIDB4MjAwMSwgMHgxOWU3LCAweDIwMDQsIDB4OTAwNSwKKwkweDExZjAsIDB4MjAwMSwgMHgxODhiLCAweDIwMGMsIDB4YzE4NSwgMHhjMThjLCAweDIxMDIsIDB4MmYwMCwKKwkweDY4MzMsIDB4MDAwMSwgMHg2ODNlLCAweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDAsIDB4MDEyNiwKKwkweDAwZjYsIDB4MjA5MSwgMHgyNDAwLCAweDAwMmUsIDB4MDgwYywgMHgxYzg0LCAweDE5MDQsIDB4OThjZiwKKwkweDAxMmUsIDB4NmEzYywgMHgyMjc4LCAweDA4MGMsIDB4YTBiZSwgMHgwODA0LCAweDk4YzcsIDB4MjAxMSwKKwkweDE4OGIsIDB4MjIwNCwgMHhjMDhkLCAweDIwMTIsIDB4MDgwNCwgMHg5OGM3LCAweDZhMDQsIDB4OTI5NiwKKwkweDAwMDYsIDB4MTkwNCwgMHg5ODg5LCAweDZhMzAsIDB4OTI5NiwgMHgwMDAwLCAweDA5MDQsIDB4OThiMSwKKwkweDA4MDQsIDB4OTg4OSwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDBiLCAweDAwMDUsIDB4OTk0ZSwKKwkweDk5NTMsIDB4OWRjMSwgMHg5ZTVhLCAweDk5NTMsIDB4OWRjMSwgMHg5ZTVhLCAweDk5NGUsIDB4OTk1MywKKwkweDk5NGUsIDB4OTk0ZSwgMHg5OTRlLCAweDk5NGUsIDB4OTk0ZSwgMHg5OTRlLCAweDA4MGMsIDB4OTY1NywKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDAwYjYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MDFjNiwKKwkweDAxZDYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDY5LCAweDAyMDAsIDB4MjA3MSwKKwkweDAyNDAsIDB4NjAwNCwgMHg5MDhhLCAweDAwNTMsIDB4MWEwYywgMHgwZGQ1LCAweDYxMTAsIDB4MjE1OCwKKwkweGI5YzAsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHg5MDhhLCAweDAwNDAsIDB4MWEwNCwKKwkweDk5YmYsIDB4MDA1YiwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAxZGUsIDB4MDFjZSwKKwkweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwYmUsIDB4MDAwNSwgMHg5YjQ0LCAweDliN2YsIDB4OWJhOCwKKwkweDljNTAsIDB4OWM3MiwgMHg5Yzc4LCAweDljODUsIDB4OWM4ZCwgMHg5Yzk5LCAweDljOWYsIDB4OWNiMCwKKwkweDljOWYsIDB4OWQwOCwgMHg5YzhkLCAweDlkMTQsIDB4OWQxYSwgMHg5Yzk5LCAweDlkMWEsIDB4OWQyNiwKKwkweDk5YmQsIDB4OTliZCwgMHg5OWJkLCAweDk5YmQsIDB4OTliZCwgMHg5OWJkLCAweDk5YmQsIDB4OTliZCwKKwkweDk5YmQsIDB4OTliZCwgMHg5OWJkLCAweGE1NjMsIDB4YTU4NiwgMHhhNTk3LCAweGE1YjcsIDB4YTVlOSwKKwkweDljODUsIDB4OTliZCwgMHg5Yzg1LCAweDljOWYsIDB4OTliZCwgMHg5YmE4LCAweDljNTAsIDB4OTliZCwKKwkweGE5ODIsIDB4OWM5ZiwgMHg5OWJkLCAweGE5OWUsIDB4OWM5ZiwgMHg5OWJkLCAweDljOTksIDB4OWIzZSwKKwkweDk5ZTAsIDB4OTliZCwgMHhhOWJhLCAweGFhMjcsIDB4YWIwMiwgMHg5OWJkLCAweGFiMGYsIDB4OWM4MiwKKwkweGFiM2EsIDB4OTliZCwgMHhhNWYzLCAweGFiNjcsIDB4OTliZCwgMHgwODBjLCAweDBkZDUsIDB4MjEwMCwKKwkweDAwNWIsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMWRlLCAweDAxY2UsIDB4MDE0ZSwKKwkweDAxM2UsIDB4MDE1ZSwgMHgwMGJlLCAweDAwMDUsIDB4YWMwMiwgMHhhY2I0LCAweDk5ZGUsIDB4OWEwNywKKwkweDlhYjMsIDB4OWFiZSwgMHg5OWRlLCAweDljODUsIDB4OTlkZSwgMHg5YjA1LCAweDliMTEsIDB4OWEyMiwKKwkweDk5ZGUsIDB4OWEzZCwgMHg5YTcxLCAweGFlMjEsIDB4YWU2NiwgMHg5YzlmLCAweDA4MGMsIDB4MGRkNSwKKwkweDAwZDYsIDB4MDA5NiwgMHgwODBjLCAweDlkMzksIDB4NzAwMywgMHgyNDE0LCAweDcwMDcsIDB4MDAxOCwKKwkweDcwMGIsIDB4MDgwMCwgMHg3ODE0LCAweDIwNDgsIDB4YTgzYywgMHg3MDBlLCAweGE4NTAsIDB4NzAyMiwKKwkweGE4NTQsIDB4NzAyNiwgMHg2MGMzLCAweDAwMTgsIDB4MDgwYywgMHhhMzJhLCAweDAwOWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4NzgxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDA4MGMsIDB4YWVhZCwKKwkweDExMTgsIDB4OTA4NCwgMHhmZjgwLCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwOTYsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsIDB4MDUwMCwgMHg3ODE0LCAweDIwNDgsIDB4YTg3NCwKKwkweDcwMGEsIDB4YTg3OCwgMHg3MDBlLCAweGE4N2MsIDB4NzAxMiwgMHhhODgwLCAweDcwMTYsIDB4YTg4NCwKKwkweDcwMWEsIDB4YTg4OCwgMHg3MDFlLCAweDYwYzMsIDB4MDAxMCwgMHgwODBjLCAweGEzMmEsIDB4MDA5ZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsIDB4MDUwMCwKKwkweDc4MTQsIDB4MjA0OCwgMHhhOGNjLCAweDcwMGEsIDB4YThkMCwgMHg3MDBlLCAweGE4ZDQsIDB4NzAxMiwKKwkweGE4ZDgsIDB4NzAxNiwgMHhhOGRjLCAweDcwMWEsIDB4YThlMCwgMHg3MDFlLCAweDYwYzMsIDB4MDAxMCwKKwkweDA4MGMsIDB4YTMyYSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDlkMzksIDB4MjBlOSwgMHgwMDAwLCAweDIwMDEsIDB4MTlhMiwKKwkweDIwMDMsIDB4MDAwMCwgMHg3ODE0LCAweDIwNDgsIDB4YTgxNCwgMHg4MDAzLCAweDYwYzIsIDB4YTgzMCwKKwkweDIwYTgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwOTgsIDB4MjAwMSwKKwkweDE5YTIsIDB4MDAxNiwgMHgyMDBjLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDIzZjUsIDB4MDgwYywKKwkweGQ5ZTcsIDB4OTAwNiwgMHgwODBjLCAweDIzZjUsIDB4MDAxZSwgMHhhODA0LCAweDkwMDUsIDB4MDExMCwKKwkweDIwNDgsIDB4MGMyOCwgMHgwNGQ5LCAweDA4MGMsIDB4YTMyYSwgMHgwMTJlLCAweDAwOWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OWQ4NCwKKwkweDIwZTksIDB4MDAwMCwgMHgyMDAxLCAweDE5YTIsIDB4MjAwMywgMHgwMDAwLCAweDc4MTQsIDB4MjA0OCwKKwkweGE4NmYsIDB4MDIwMCwgMHhhODczLCAweDAwMDAsIDB4YTgxNCwgMHg4MDAzLCAweDYwYzIsIDB4YTgzMCwKKwkweDIwYTgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwOTgsIDB4MjAwMSwKKwkweDE5YTIsIDB4MDAxNiwgMHgyMDBjLCAweDA4MGMsIDB4ZDllNywgMHgwMDFlLCAweGE4MDQsIDB4OTAwNSwKKwkweDAxMTAsIDB4MjA0OCwgMHgwYzYwLCAweDAwNTEsIDB4NzgxNCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZiMSwKKwkweDA4MGMsIDB4YTMyYSwgMHgwMTJlLCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LCAweDYwYzAsIDB4ODAwNCwKKwkweDkwODQsIDB4MDAwMywgMHg5MDA1LCAweDAxMzAsIDB4OTA4MiwgMHgwMDA0LCAweDIwYTMsIDB4MDAwMCwKKwkweDgwMDAsIDB4MWRlMCwgMHgwMDA1LCAweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDc4MDAsIDB4NzgwOCwKKwkweDgwMDcsIDB4NzAwYSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHhhMzJhLCAweDAwZDYsIDB4MDBlNiwKKwkweDA4MGMsIDB4OWQ4NCwgMHg3ODE0LCAweDkwODQsIDB4ZmYwMCwgMHgyMDczLCAweDAyMDAsIDB4OGU3MCwKKwkweDhlNzAsIDB4OTA5NSwgMHgwMDEwLCAweDIyNzIsIDB4OGU3MCwgMHgyMDczLCAweDAwMzQsIDB4OGU3MCwKKwkweDIwNjksIDB4MTgwNSwgMHgyMGE5LCAweDAwMDQsIDB4MmQ3NiwgMHg4ZDY4LCAweDhlNzAsIDB4MWYwNCwKKwkweDlhZDQsIDB4MjA2OSwgMHgxODAxLCAweDIwYTksIDB4MDAwNCwgMHgyZDc2LCAweDhkNjgsIDB4OGU3MCwKKwkweDFmMDQsIDB4OWFkZCwgMHgyMDY5LCAweDE5YjIsIDB4OTA4NiwgMHhkZjAwLCAweDAxMTAsIDB4MjA2OSwKKwkweDE5Y2MsIDB4MjBhOSwgMHgwMDFhLCAweDllODYsIDB4MDI2MCwgMHgxMTQ4LCAweDAwYzYsIDB4MjA2MSwKKwkweDAyMDAsIDB4NjAxMCwgMHg4MDAwLCAweDYwMTIsIDB4MDBjZSwgMHgyMDcxLCAweDAyNDAsIDB4MmQwNCwKKwkweDgwMDcsIDB4MjA3MiwgMHg4ZDY4LCAweDhlNzAsIDB4MWYwNCwgMHg5YWViLCAweDYwYzMsIDB4MDA0YywKKwkweDA4MGMsIDB4YTMyYSwgMHgwMGVlLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweDlkMzksIDB4NzAwMywKKwkweDYzMDAsIDB4NzAwNywgMHgwMDI4LCAweDc4MDgsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwKKwkweGEzMmEsIDB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsIDB4MDIwMCwKKwkweDc4MTQsIDB4NzAwZSwgMHgwMGU2LCAweDllZjAsIDB4MDAwNCwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwKKwkweDAwMGMsIDB4MjA2OSwgMHgxOTIzLCAweDY4MTAsIDB4ZDA4NCwgMHgxMTQ4LCAweDIwNzMsIDB4MDUwMCwKKwkweDhlNzAsIDB4MjA3MywgMHgwMDAwLCAweDhlNzAsIDB4ODEwOCwgMHg5MjkwLCAweDAwMDQsIDB4MjA3MywKKwkweDA4MDAsIDB4OGU3MCwgMHgyMDczLCAweDAwMDAsIDB4MDBlZSwgMHg3MjA2LCAweDcxMGEsIDB4NjJjMiwKKwkweDA4MGMsIDB4YTMyYSwgMHgwMDFlLCAweDAwMmUsIDB4MDBkZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgxOCwKKwkweDIwMDQsIDB4NjA5YSwgMHgwODA0LCAweGEzMmEsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsIDB4NTIwMCwKKwkweDIwNjksIDB4MTg0NywgMHg2ODA0LCAweGQwODQsIDB4MDEzMCwgMHg2ODI4LCAweDAwMTYsIDB4MDgwYywKKwkweDI4YWYsIDB4NzEwZSwgMHgwMDFlLCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwKKwkweDE4MDUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1MCwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwKKwkweDIwOTksIDB4MTgwMSwgMHgyMGExLCAweDAyNTQsIDB4NDAwMywgMHgwODBjLCAweGFlYWQsIDB4MTEyMCwKKwkweGI4YTAsIDB4OTA4MiwgMHgwMDdmLCAweDAyNDgsIDB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4NzAzMiwKKwkweDIwMDEsIDB4MTgyMCwgMHgyMDA0LCAweDcwMzYsIDB4MDAzMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg3MDM2LCAweDYwYzMsIDB4MDAxYywgMHgwODA0LCAweGEzMmEsIDB4MDgwYywKKwkweDlkMzksIDB4NzAwMywgMHgwNTAwLCAweDA4MGMsIDB4YWVhZCwgMHgxMTIwLCAweGI4YTAsIDB4OTA4MiwKKwkweDAwN2YsIDB4MDI0OCwgMHgyMDAxLCAweDE4MWYsIDB4MjAwNCwgMHg3MDBhLCAweDIwMDEsIDB4MTgyMCwKKwkweDIwMDQsIDB4NzAwZSwgMHgwMDMwLCAweDIwMDEsIDB4MTgxOCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwKKwkweDcwMGUsIDB4MjBhOSwgMHgwMDA0LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE4MDUsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjUwLCAweDQwMDMsIDB4NjBjMywgMHgwMDEwLCAweDA4MDQsIDB4YTMyYSwKKwkweDA4MGMsIDB4OWQzOSwgMHg5MDA2LCAweDA4MGMsIDB4NjlkNiwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwKKwkweDExMzAsIDB4NzAwMywgMHgwNDAwLCAweDYyMGMsIDB4YzJiNCwgMHg2MjBlLCAweDAwNTgsIDB4NzgxNCwKKwkweDAwOTYsIDB4OTA0ZCwgMHgwMTIwLCAweDkwMDYsIDB4YTg5YSwgMHhhOGE2LCAweGE4YWEsIDB4MDA5ZSwKKwkweDcwMDMsIDB4MDMwMCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxOTA0LCAweDljMTcsIDB4MDBkNiwKKwkweDIwNjksIDB4MTk2YiwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHhkMGE0LCAweDAxODgsIDB4NjgwMCwKKwkweDcwMGEsIDB4NjgwOCwgMHg5MDg0LCAweDIwMDAsIDB4NzAxMiwgMHgwODBjLCAweGFlYzQsIDB4NjgwYywKKwkweDcwMTYsIDB4NzAxZiwgMHgyNzEwLCAweDY4MTgsIDB4NzAyMiwgMHg2ODFjLCAweDcwMjYsIDB4MDA5MCwKKwkweDY4MDAsIDB4NzAwYSwgMHg2ODA0LCAweDcwMGUsIDB4NjgwOCwgMHgwODBjLCAweDc0M2UsIDB4MTExOCwKKwkweDkwODQsIDB4MzdmZiwgMHgwMDEwLCAweDkwODQsIDB4M2ZmZiwgMHg3MDEyLCAweDA4MGMsIDB4YWVjNCwKKwkweDY4MGMsIDB4NzAxNiwgMHgwMGRlLCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwKKwkweDE4MDUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1NiwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwKKwkweDIwOTksIDB4MTgwMSwgMHgyMGExLCAweDAyNWEsIDB4NDAwMywgMHgwMGQ2LCAweDA4MGMsIDB4YWJlOSwKKwkweDIwNjksIDB4MTk3MywgMHgyMDcxLCAweDAyNGUsIDB4NjgwMCwgMHhjMGRkLCAweDcwMDIsIDB4MDgwYywKKwkweDU3NjEsIDB4ZDBlNCwgMHgwMTEwLCAweDY4MGMsIDB4NzAwZSwgMHgwMGRlLCAweDA0YTgsIDB4MjAwMSwKKwkweDE4MzcsIDB4MjAwNCwgMHhkMGE0LCAweDAxNzAsIDB4MDAxNiwgMHgyMDAxLCAweDE5NmMsIDB4MjAwYywKKwkweDYwZTAsIDB4OTEwNiwgMHgwMTMwLCAweDIxMDAsIDB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4MjhmMCwKKwkweDYxZTIsIDB4MDAxZSwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxOTZiLCAweDIwZTksIDB4MDAwMCwKKwkweDIwYTEsIDB4MDI0ZSwgMHgyMGE5LCAweDAwMDgsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwKKwkweDE4MDUsIDB4MjBhMSwgMHgwMjU2LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4MTgwMSwKKwkweDIwYTEsIDB4MDI1YSwgMHg0MDAzLCAweDA4MGMsIDB4YWJlOSwgMHgyMGExLCAweDAyNGUsIDB4MjBhOSwKKwkweDAwMDgsIDB4MjA5OSwgMHgxOTczLCAweDQwMDMsIDB4NjBjMywgMHgwMDc0LCAweDA4MDQsIDB4YTMyYSwKKwkweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDIwMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGIsIDB4MDgwMCwKKwkweDcwMGYsIDB4MjAwMCwgMHg5MDA2LCAweDAwZjYsIDB4MjA3OSwgMHgxODQ3LCAweDc5MDQsIDB4MDBmZSwKKwkweGQxYWMsIDB4MTExMCwgMHg5MDg1LCAweDAwMjAsIDB4ZDFhNCwgMHgwMTEwLCAweDkwODUsIDB4MDAxMCwKKwkweDkwODUsIDB4MDAwMiwgMHgwMGQ2LCAweDA4MDQsIDB4OWNlOSwgMHg3MDI2LCAweDYwYzMsIDB4MDAxNCwKKwkweDA4MDQsIDB4YTMyYSwgMHgwODBjLCAweDlkMzksIDB4NzAwMywgMHg1MDAwLCAweDA4MDQsIDB4OWJjMiwKKwkweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDIxMTAsIDB4NzAwNywgMHgwMDE0LCAweDYwYzMsIDB4MDAxNCwKKwkweDA4MDQsIDB4YTMyYSwgMHgwODBjLCAweDlkN2IsIDB4MDAxMCwgMHgwODBjLCAweDlkODQsIDB4NzAwMywKKwkweDAyMDAsIDB4NjBjMywgMHgwMDA0LCAweDA4MDQsIDB4YTMyYSwgMHgwODBjLCAweDlkODQsIDB4NzAwMywKKwkweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDcwMGYsIDB4MmEwMCwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwKKwkweGEzMmEsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsIDB4MDIwMCwgMHgwODA0LCAweDliYzIsIDB4MDgwYywKKwkweDlkODQsIDB4NzAwMywgMHgwMTAwLCAweDc4MmMsIDB4OTAwNSwgMHgwMTEwLCAweDcwMGEsIDB4MDAxMCwKKwkweDcwMGIsIDB4MDAwMywgMHg3ODE0LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4YTMyYSwKKwkweDAwZDYsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsIDB4MDIxMCwgMHg3MDA3LCAweDAwMTQsIDB4NzAwYiwKKwkweDA4MDAsIDB4Yjg5NCwgMHg5MDg2LCAweDAwMTQsIDB4MTE5OCwgMHhiOTljLCAweDkxODQsIDB4MDAzMCwKKwkweDAxOTAsIDB4Yjk5OCwgMHg5MTg0LCAweGMwMDAsIDB4MTE0MCwgMHhkMWVjLCAweDAxMTgsIDB4NzAwZiwKKwkweDIxMDAsIDB4MDA1OCwgMHg3MDBmLCAweDAxMDAsIDB4MDA0MCwgMHg3MDBmLCAweDA0MDAsIDB4MDAyOCwKKwkweDcwMGYsIDB4MDcwMCwgMHgwMDEwLCAweDcwMGYsIDB4MDgwMCwgMHgwMGY2LCAweDIwNzksIDB4MTg0NywKKwkweDc5MDQsIDB4MDBmZSwgMHhkMWFjLCAweDExMTAsIDB4OTA4NSwgMHgwMDIwLCAweGQxYTQsIDB4MDExMCwKKwkweDkwODUsIDB4MDAxMCwgMHgyMDA5LCAweDE4NjksIDB4MjEwYywgMHhkMTg0LCAweDExMTAsIDB4OTA4NSwKKwkweDAwMDIsIDB4MDAyNiwgMHgyMDA5LCAweDE4NjcsIDB4MjEwYywgMHhkMWU0LCAweDAxNTAsIDB4YzBjNSwKKwkweGJhY2MsIDB4ZDI4YywgMHgxMTA4LCAweGMwY2QsIDB4OTA5NCwgMHgwMDMwLCAweDkyOTYsIDB4MDAxMCwKKwkweDAxNDAsIDB4ZDFlYywgMHgwMTMwLCAweDkwOTQsIDB4MDAzMCwgMHg5Mjk2LCAweDAwMTAsIDB4MDEwOCwKKwkweGMwYmQsIDB4MDAyZSwgMHg3MDI2LCAweDYwYzMsIDB4MDAxNCwgMHgwMGRlLCAweDA4MDQsIDB4YTMyYSwKKwkweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGYsIDB4MDEwMCwKKwkweDYwYzMsIDB4MDAxNCwgMHgwODA0LCAweGEzMmEsIDB4MDgwYywgMHg5ZDg0LCAweDcwMDMsIDB4MDIwMCwKKwkweDA4MDQsIDB4OWI0OCwgMHgwODBjLCAweDlkODQsIDB4NzAwMywgMHgwMTAwLCAweDcwMGIsIDB4MDAwMywKKwkweDcwMGYsIDB4MmEwMCwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHhhMzJhLCAweDA4MGMsIDB4OWQ4NCwKKwkweDcwMDMsIDB4MDEwMCwgMHg3MDBiLCAweDAwMGIsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4YTMyYSwKKwkweDAwMjYsIDB4MDBkNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgzMjAwLCAweDIwMjEsIDB4MDgwMCwKKwkweDAwNDAsIDB4MDAyNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDIyMDAsIDB4MjAyMSwKKwkweDAxMDAsIDB4MDgwYywgMHhhYmZlLCAweGI4MTAsIDB4OTMwNSwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDk0ODUsIDB4MDAyOSwKKwkweDcwMTIsIDB4MDA0ZSwgMHgwMDNlLCAweDAwZGUsIDB4MDgwYywgMHhhMzE4LCAweDcyMWEsIDB4OWY5NSwKKwkweDAwMDAsIDB4NzIyMiwgMHg3MDI3LCAweGZmZmYsIDB4MjA3MSwgMHgwMjRjLCAweDAwMmUsIDB4MDAwNSwKKwkweDAwMjYsIDB4MDgwYywgMHhhYmZlLCAweDcwMDMsIDB4MDJmZiwgMHg3MDA3LCAweGZmZmMsIDB4MDBkNiwKKwkweDIwNjksIDB4MTgwMCwgMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDAwZGUsIDB4NzAxMywKKwkweDIwMjksIDB4MGMxMCwgMHg3MDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMGIsIDB4ZmMwMiwKKwkweDcwMGYsIDB4MDAwMCwgMHgwMDA1LCAweDAwMjYsIDB4MDBkNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwKKwkweDMzMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwNDAsIDB4MDAyNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDA0NiwKKwkweDIwMTksIDB4MjMwMCwgMHgyMDIxLCAweDAxMDAsIDB4MDgwYywgMHhhYmZlLCAweGI4MTAsIDB4OTMwNSwKKwkweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHhiODEwLCAweDkwMDUsIDB4MTE0MCwKKwkweGI4MTQsIDB4OTAwNSwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmUsIDB4MDAyMCwKKwkweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4MDAwMCwgMHg5NDg1LCAweDAwOTgsIDB4NzAxMiwKKwkweDAwNGUsIDB4MDAzZSwgMHgwMGRlLCAweDA4MGMsIDB4YTMxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwKKwkweDJmMTAsIDB4NzIyNiwgMHgyMDcxLCAweDAyNGMsIDB4MDAyZSwgMHgwMDA1LCAweDA4MGMsIDB4YTMxOCwKKwkweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDc4MTQsIDB4NzAyNiwgMHgyMDcxLCAweDAyNGMsIDB4MDAyZSwKKwkweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNjksIDB4MDIwMCwKKwkweDIwNzEsIDB4MDI0MCwgMHg2MDA0LCAweDkwOGEsIDB4MDA4NSwgMHgwYTBjLCAweDBkZDUsIDB4OTA4YSwKKwkweDAwOTIsIDB4MWEwYywgMHgwZGQ1LCAweDYxMTAsIDB4MjE1OCwgMHhiOWMwLCAweDJjNzgsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjE5YSwgMHg5MDgyLCAweDAwODUsIDB4MDAzMywgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDlkZjIsIDB4OWUwMSwgMHg5ZTBjLCAweDlkZjAsIDB4OWRmMCwKKwkweDlkZjAsIDB4OWRmMiwgMHg5ZGYwLCAweDlkZjAsIDB4OWRmMCwgMHg5ZGYwLCAweDlkZjAsIDB4OWRmMCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwNDExLCAweDYwYzMsIDB4MDAwMCwgMHgwMDI2LCAweDA4MGMsIDB4MmJlMywKKwkweDAyMjgsIDB4MjAxMSwgMHgwMTAxLCAweDIyMDQsIDB4YzBjNSwgMHgyMDEyLCAweDAwMmUsIDB4MDgwNCwKKwkweGEzMmEsIDB4MDQzMSwgMHg3ODA4LCAweDcwMGEsIDB4NzgxNCwgMHg3MDBlLCAweDcwMTcsIDB4ZmZmZiwKKwkweDYwYzMsIDB4MDAwYywgMHgwODA0LCAweGEzMmEsIDB4MDRhMSwgMHg3MDAzLCAweDAwMDMsIDB4NzAwNywKKwkweDAzMDAsIDB4NjBjMywgMHgwMDA0LCAweDA4MDQsIDB4YTMyYSwgMHgwMDI2LCAweDA4MGMsIDB4YWJmZSwKKwkweGI4MTAsIDB4OTA4NSwgMHg4MTAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwKKwkweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4NzAxMywgMHgwMDA5LCAweDA4MDQsIDB4OWQ1NCwKKwkweDAwMjYsIDB4MDgwYywgMHhhYmZlLCAweGI4MTAsIDB4OTA4NSwgMHg4NDAwLCAweDcwMDIsIDB4YjgxNCwKKwkweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4MjAwMSwKKwkweDAwOTksIDB4N2EyMCwgMHg5Mjk2LCAweDAwMDUsIDB4MDEwOCwgMHhjMGJjLCAweDcwMTIsIDB4MDgwNCwKKwkweDlkYjYsIDB4MDAyNiwgMHgwODBjLCAweGFiZmUsIDB4YjgxMCwgMHg5MDg1LCAweDg1MDAsIDB4NzAwMiwKKwkweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4Njg3YywgMHg3MDBhLCAweDY4ODAsIDB4NzAwZSwKKwkweDIwMDEsIDB4MDA5OSwgMHg3YTIwLCAweDkyOTYsIDB4MDAwNSwgMHgwMTA4LCAweGMwYmMsIDB4NzAxMiwKKwkweDA4MDQsIDB4OWRiNiwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MmM3OCwKKwkweDIwNjksIDB4MDIwMCwgMHgyMDcxLCAweDAyNDAsIDB4NzgwNCwgMHg5MDhhLCAweDAwNDAsIDB4MGEwYywKKwkweDBkZDUsIDB4OTA4YSwgMHgwMDU0LCAweDFhMGMsIDB4MGRkNSwgMHg3OTEwLCAweDIxNTgsIDB4YjljMCwKKwkweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweDkwODIsIDB4MDA0MCwgMHgwMDMzLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4OWU5MSwgMHg5ZjRkLCAweDlmMjAsIDB4YTA2ZiwKKwkweDllOGYsIDB4OWU4ZiwgMHg5ZThmLCAweDllOGYsIDB4OWU4ZiwgMHg5ZThmLCAweDllOGYsIDB4YTczZSwKKwkweGE3NDYsIDB4YTc0ZSwgMHhhNzU2LCAweDllOGYsIDB4YWI0NiwgMHg5ZThmLCAweGE3MzYsIDB4MDgwYywKKwkweDBkZDUsIDB4MDA5NiwgMHg3ODBiLCAweGZmZmYsIDB4MDgwYywgMHg5ZWZjLCAweDc5MTQsIDB4MjE0OCwKKwkweGE5NzgsIDB4Nzk1NiwgMHhhZTY0LCAweDk2YjQsIDB4MDBmZiwgMHg5Njg2LCAweDAwMDgsIDB4MTE0OCwKKwkweGE4YjQsIDB4NzAzMiwgMHhhOGI4LCAweDcwMzYsIDB4YThiYywgMHg3MDNhLCAweGE4YzAsIDB4NzAzZSwKKwkweDAwMDgsIDB4NzEzMiwgMHhhOTdjLCAweDkxODQsIDB4MDAwZiwgMHgxMTE4LCAweDIwMDEsIDB4MDAwNSwKKwkweDAwNDAsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDE4LCAweDkwODQsIDB4MDAwNiwKKwkweDgwMDQsIDB4MjAxMCwgMHg3ODVjLCAweDkwODQsIDB4MDBmZiwgMHg4MDA3LCAweDkyMDUsIDB4NzA0MiwKKwkweGQxYWMsIDB4MDE1OCwgMHg3MDQ3LCAweDAwMDIsIDB4OTY4NiwgMHgwMDA4LCAweDExMTgsIDB4MDgwYywKKwkweDE4ZGQsIDB4MDAxMCwgMHgwODBjLCAweDE3NTQsIDB4MDA1MCwgMHhkMWI0LCAweDAxMTgsIDB4NzA0NywKKwkweDAwMDEsIDB4MDAyOCwgMHg3MDQ3LCAweDAwMDAsIDB4OTAxNiwgMHgyMjMwLCAweDAwMTAsIDB4YWFiMCwKKwkweGFlYWMsIDB4NzI2YSwgMHg3NjZlLCAweDIwYTksIDB4MDAwOCwgMHgyMGU5LCAweDAwMDAsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjMsIDB4MjA5OCwgMHgyMGExLCAweDAyNTIsIDB4MjA2OSwKKwkweDAyMDAsIDB4NjgxMywgMHgwMDE4LCAweDQwMDMsIDB4NjgxMywgMHgwMDA4LCAweDYwYzMsIDB4MDAyMCwKKwkweDYwMTcsIDB4MDAwOSwgMHgyMDAxLCAweDFhMDIsIDB4MjAwMywgMHgwN2QwLCAweDIwMDEsIDB4MWEwMSwKKwkweDIwMDMsIDB4MDAwOSwgMHgwMDllLCAweDAwMDUsIDB4NjgxMywgMHgwMDA4LCAweGJhOGMsIDB4ODIxMCwKKwkweGI4Y2MsIDB4ZDA4NCwgMHgwMTI4LCAweDdhNGEsIDB4N2IxNCwgMHg3YjQ2LCAweDcyMmUsIDB4NzMyYSwKKwkweDkyOTQsIDB4MDBmZiwgMHhiYThlLCAweDgyMTcsIDB4NzIxYSwgMHhiYTEwLCAweDkyOTUsIDB4MDYwMCwKKwkweDcyMDIsIDB4YmExNCwgMHg3MjA2LCAweDIwNjksIDB4MTgwMCwgMHg2YTdjLCAweDcyMGEsIDB4NmE4MCwKKwkweDcyMGUsIDB4NzAxMywgMHgwODI5LCAweDJmMTAsIDB4NzIyMiwgMHg3MDI3LCAweGZmZmYsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDA5NiwgMHgwMDgxLCAweDc4MTQsIDB4MjA0OCwgMHhhODkwLCAweDcwMDIsIDB4YTg4YywKKwkweDcwMDYsIDB4YThiMCwgMHg3MDBhLCAweGE4YWMsIDB4NzAwZSwgMHg2MGMzLCAweDAwMGMsIDB4MDA5ZSwKKwkweDAwZGUsIDB4MDgwNCwgMHhhMzJhLCAweDY4MTMsIDB4MDAwOCwgMHhiODEwLCAweDkwODUsIDB4MDUwMCwKKwkweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwKKwkweDcwMGUsIDB4NzAxMywgMHgwODg5LCAweDA4MGMsIDB4YTMxOCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwKKwkweDJmMTAsIDB4NzIyNiwgMHgyMDcxLCAweDAyNGMsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywKKwkweGEwNGQsIDB4NzgxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NCwgMHgxMTMwLCAweDc4MTQsIDB4OTA4NCwKKwkweDA3MDAsIDB4ODAwNywgMHgwMDMzLCAweDAwMTAsIDB4OTAwNiwgMHgwMDFiLCAweDAwOWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4OWY2YiwgMHg5ZmQ0LCAweDlmZTQsIDB4YTAwYSwgMHhhMDE2LCAweGEwMjcsIDB4YTAyZiwKKwkweDlmNjksIDB4MDgwYywgMHgwZGQ1LCAweDAwMTYsIDB4MDAzNiwgMHhhOTdjLCAweDkxOGMsIDB4MDAwMywKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDAzLCAweDExOTgsIDB4YWJhOCwgMHg3ODI0LCAweGQwY2MsIDB4MTE2OCwKKwkweDczMTYsIDB4YTg5OCwgMHg3MDFhLCAweGE4OTQsIDB4NzAxZSwgMHgwMDNlLCAweDAwMWUsIDB4MjAwMSwKKwkweDE5YjAsIDB4MjAwNCwgMHg2MGMyLCAweDA4MDQsIDB4YTMyYSwgMHhjM2U1LCAweDBjODgsIDB4OTE4NiwKKwkweDAwMDEsIDB4MTkwYywgMHgwZGQ1LCAweGFiYTgsIDB4NzgyNCwgMHhkMGNjLCAweDE5MDQsIDB4OWZkMSwKKwkweDczMTYsIDB4YTg5OCwgMHg3MDFhLCAweGE4OTQsIDB4NzAxZSwgMHhhOGE0LCAweDcwMjYsIDB4YThhYywKKwkweDcwMmUsIDB4MjAwOSwgMHgwMDE4LCAweDkzODQsIDB4MDMwMCwgMHgwNTcwLCAweGQzYzQsIDB4MDExMCwKKwkweGE4YWMsIDB4OTEwOCwgMHhkM2NjLCAweDAxMTAsIDB4YThhNCwgMHg5MTA4LCAweDY4MTAsIDB4OTA4NSwKKwkweDAwMTAsIDB4NjgxMiwgMHgyMDExLCAweDAyNTgsIDB4MjBlOSwgMHgwMDAwLCAweDIyYTAsIDB4MDE1NiwKKwkweDIwYTksIDB4MDAwOCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMmMsIDB4MjA5OCwKKwkweDQwMDMsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAxMSwgMHgwMjQwLCAweDIyYTAsIDB4MjBhOSwKKwkweDAwMDUsIDB4NDAwMywgMHg2ODEwLCAweGMwODQsIDB4NjgxMiwgMHgwMTVlLCAweDkxODQsIDB4MDAwMywKKwkweDAxMTgsIDB4MjAxOSwgMHgwMjQ1LCAweDIwMWEsIDB4NjFjMiwgMHgwMDNlLCAweDAwMWUsIDB4MDgwNCwKKwkweGEzMmEsIDB4YzNlNSwgMHgwODA0LCAweDlmOTAsIDB4MjAxMSwgMHgwMDA4LCAweDIwMDEsIDB4MTgwZiwKKwkweDIwMDQsIDB4ZDBhNCwgMHgwMTEwLCAweDIwMTEsIDB4MDAyOCwgMHg3ODI0LCAweGQwY2MsIDB4MTExMCwKKwkweDcyMTYsIDB4MDQ3MCwgMHgwY2U4LCAweGMyZTUsIDB4MjAxMSwgMHgwMzAyLCAweDAwMTYsIDB4NzgyYywKKwkweDcwMWEsIDB4NzkzMCwgMHg3MTFlLCAweDkxMDUsIDB4MDEwOCwgMHhjMmRkLCAweDAwMWUsIDB4NzgyNCwKKwkweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDcyMTYsIDB4NzAyNywgMHgwMDEyLCAweDcwMmYsIDB4MDAwOCwKKwkweDcwNDMsIDB4NzAwMCwgMHg3MDQ3LCAweDA1MDAsIDB4NzA0ZiwgMHgwMDBhLCAweDIwNjksIDB4MDIwMCwKKwkweDY4MTMsIDB4MDAwOSwgMHgyMDcxLCAweDAyNDAsIDB4NzAwYiwgMHgyNTAwLCAweDYwYzMsIDB4MDAzMiwKKwkweDA4MDQsIDB4YTMyYSwgMHgyMDExLCAweDAwMjgsIDB4NzgyNCwgMHhkMGNjLCAweDExMjgsIDB4NzIxNiwKKwkweDYwYzMsIDB4MDAxOCwgMHgwODA0LCAweGEzMmEsIDB4MGNkMCwgMHhjMmU1LCAweDIwMTEsIDB4MDEwMCwKKwkweDc4MjQsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4NzIxNiwgMHg3MDJmLCAweDAwMDgsIDB4Nzg1OCwKKwkweDkwODQsIDB4MDBmZiwgMHg3MDM2LCAweDYwYzMsIDB4MDAyMCwgMHgwODA0LCAweGEzMmEsIDB4MjAxMSwKKwkweDAwMDgsIDB4NzgyNCwgMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwgMHg3MjE2LCAweDBjMDgsIDB4MDAzNiwKKwkweDdiMTQsIDB4OTM4NCwgMHhmZjAwLCAweDc4MTYsIDB4OTM4NCwgMHgwMGZmLCAweDgwMDEsIDB4MTEzOCwKKwkweDc4MjQsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4NzIxNiwgMHgwMDNlLCAweDA4ODgsIDB4MDA0NiwKKwkweDIwMjEsIDB4MDgwMCwgMHgwMDA2LCAweDc4MjQsIDB4ZDBjYywgMHgwMDBlLCAweDAxMDgsIDB4YzRlNSwKKwkweDc0MTYsIDB4MDA0ZSwgMHg3MDFlLCAweDAwM2UsIDB4MDgxOCwgMHgwMGQ2LCAweDY4MTMsIDB4MDAwOCwKKwkweGI4MTAsIDB4OTA4NSwgMHgwNzAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwKKwkweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4NzgyNCwgMHhkMGNjLCAweDExNjgsIDB4NzAxMywKKwkweDA4OTgsIDB4MDgwYywgMHhhMzE4LCAweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDJmMTAsIDB4NzIyNiwKKwkweDIwNzEsIDB4MDI0YywgMHgwMGRlLCAweDAwMDUsIDB4NzAxMywgMHgwODg5LCAweDBjOTAsIDB4MDAxNiwKKwkweDc4MTQsIDB4OTA4NCwgMHgwNzAwLCAweDgwMDcsIDB4MDAxMywgMHgwMDFlLCAweDAwMDUsIDB4YTA3ZiwKKwkweGEwN2YsIDB4YTA4MSwgMHhhMDdmLCAweGEwN2YsIDB4YTA3ZiwgMHhhMDliLCAweGEwN2YsIDB4MDgwYywKKwkweDBkZDUsIDB4NzkxNCwgMHg5MThjLCAweDA4ZmYsIDB4OTE4ZCwgMHhmNjAwLCAweDc5MTYsIDB4MjAwOSwKKwkweDAwMDMsIDB4MDBiOSwgMHgyMDY5LCAweDE4NDcsIDB4NjgwNCwgMHhkMGJjLCAweDAxMzAsIDB4NjgyYywKKwkweDkwODQsIDB4MDBmZiwgMHg4MDA3LCAweDcwMzIsIDB4MDAxMCwgMHg3MDMzLCAweDNmMDAsIDB4NjBjMywKKwkweDAwMDEsIDB4MDgwNCwgMHhhMzJhLCAweDIwMDksIDB4MDAwMywgMHgwMDE5LCAweDcwMzMsIDB4N2YwMCwKKwkweDBjYjAsIDB4MDAxNiwgMHgwODBjLCAweGFiZmUsIDB4MDAxZSwgMHhiODEwLCAweDkwODUsIDB4MDEwMCwKKwkweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2YTdjLCAweDcyMGEsIDB4NmE4MCwKKwkweDcyMGUsIDB4NzAxMywgMHgwODg4LCAweDkxOGQsIDB4MDAwOCwgMHg3MTE2LCAweDA4MGMsIDB4YTMxOCwKKwkweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDJmMTAsIDB4NzIyNiwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwKKwkweDAwZDYsIDB4MDBjNiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MTYwLCAweDc4MTAsIDB4MjA1OCwgMHg3NmRjLCAweDk2YjQsIDB4MDAyOCwKKwkweDAxMTAsIDB4NzM3YywgMHg3NDgwLCAweDI1MDAsIDB4NzZkYywgMHg5NmI0LCAweDAwMjgsIDB4MDE0MCwKKwkweDIwMDEsIDB4MDRmZiwgMHg2MDYyLCAweDYwNjcsIDB4ZmZmZiwgMHg2MzZhLCAweDY0NmUsIDB4MDA1MCwKKwkweDIwMDEsIDB4MDBmZiwgMHg5MDg1LCAweDA0MDAsIDB4NjA2MiwgMHg2MDY3LCAweGZmZmYsIDB4NjA2YiwKKwkweDAwMDAsIDB4NjE2ZSwgMHhiOGI4LCAweDYwNzMsIDB4MDUzMCwgMHg2MDc3LCAweDAwMDgsIDB4Yjg4YywKKwkweDgwMDAsIDB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywgMHg5MDg1LCAweDAwMjAsIDB4NjA3YSwKKwkweDYwN2YsIDB4MDAwMCwgMHgyYjAwLCAweDYwODIsIDB4NjA4NywgMHhmZmZmLCAweDc4MTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4YTgzOCwgMHg2MDhhLCAweGE4MzQsIDB4NjA4ZSwgMHhhODQ4LCAweDYwYzYsIDB4YTg0NCwKKwkweDYwY2EsIDB4MDA5ZSwgMHhiODZjLCAweDYwY2UsIDB4NjBhYiwgMHgwMDM2LCAweDYwYWYsIDB4OTVkNSwKKwkweDYwZDcsIDB4MDAwMCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMjgsIDB4MDEyOCwKKwkweDYwOWYsIDB4MDAwMCwgMHgyMDAxLCAweDAwOTIsIDB4MDA0OCwgMHg2MDI4LCAweGMwYmQsIDB4NjAyYSwKKwkweDYwOWYsIDB4MDBmZiwgMHg2MDI3LCAweGZmZmYsIDB4MjAwMSwgMHgwMGIyLCAweDYwMTYsIDB4MjAwOSwKKwkweDA3ZDAsIDB4MDgwYywgMHg4NjNiLCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcxNjAsIDB4NzgxMCwgMHgyMDU4LCAweGI4YTAsIDB4MjAyOCwgMHg3NmRjLCAweGQ2YWMsIDB4MTE2OCwKKwkweDk1ODIsIDB4MDA3ZSwgMHgxMjUwLCAweDI1MDAsIDB4OTA5NCwgMHhmZjgwLCAweDExMzAsIDB4OTA4MCwKKwkweDMzODQsIDB4MjAxNSwgMHg5Mjk0LCAweDAwZmYsIDB4MDAyMCwgMHhiOTEwLCAweGJhMTQsIDB4NzM3YywKKwkweDc0ODAsIDB4NzBkYywgMHhkMGFjLCAweDExMzAsIDB4OTU4MiwgMHgwMDdlLCAweDEyMTgsIDB4OTU4NCwKKwkweGZmODAsIDB4MDEzOCwgMHg5MTg1LCAweDA0MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwKKwkweDAwMzAsIDB4NjA2MywgMHgwNDAwLCAweDYyNjYsIDB4NjA2YiwgMHgwMDAwLCAweDYxNmUsIDB4YjhiOCwKKwkweDYwNzIsIDB4NjA3NywgMHgwMDAwLCAweGI4NjQsIDB4ZDBhNCwgMHgwMTEwLCAweDYwNzcsIDB4MDAwOCwKKwkweGI4OGMsIDB4ODAwMCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwgMHg4MDA3LCAweDkwODUsIDB4MDAyMCwKKwkweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJiMDAsIDB4NjA4MiwgMHg2MDg3LCAweGZmZmYsIDB4NzgxNCwKKwkweDAwOTYsIDB4MjA0OCwgMHhhODM4LCAweDYwOGEsIDB4YTgzNCwgMHg2MDhlLCAweGE4NDgsIDB4NjBjNiwKKwkweGE4NDQsIDB4NjBjYSwgMHgwMDllLCAweGI4NmMsIDB4NjBjZSwgMHg2MGFiLCAweDAwMzYsIDB4NjBhZiwKKwkweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGJhYzAsIDB4NjI5ZSwgMHgwMGY2LCAweDIwNzksIDB4MDE0MCwKKwkweDc4MDMsIDB4MDAwMCwgMHgwMGZlLCAweDIwMDksIDB4MDA5MiwgMHg2MTE2LCAweDIwMDksIDB4MDdkMCwKKwkweDA4MGMsIDB4ODYzYiwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzgxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHgyMDI4LCAweGI5MTAsIDB4YmExNCwgMHg3MzdjLCAweDc0ODAsIDB4NzgyMCwKKwkweDkwYmUsIDB4MDAwNiwgMHgwOTA0LCAweGEyODcsIDB4OTBiZSwgMHgwMDBhLCAweDE5MDQsIDB4YTI0MywKKwkweGI4YzAsIDB4NjA5ZSwgMHg3ODE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDA1NTgsIDB4YWY5MCwKKwkweDk3ODQsIDB4ZmYwMCwgMHg5MTA1LCAweDYwNjIsIDB4ODczZiwgMHg5Nzg0LCAweGZmMDAsIDB4MDAwNiwKKwkweDc4MTQsIDB4MjA0OCwgMHhhODc4LCAweGMwZmMsIDB4OTAwNSwgMHgwMDBlLCAweDExNjAsIDB4YWY5NCwKKwkweDg3ZmYsIDB4MDE5OCwgMHgyMDM5LCAweDAwOTgsIDB4OTcwNSwgMHg2MDcyLCAweDc4MDgsIDB4NjA4MiwKKwkweDJmMDAsIDB4NjA4NiwgMHgwMDM4LCAweDkxODUsIDB4MjIwMCwgMHg2MDYyLCAweDYwNzMsIDB4MDEyOSwKKwkweDYwNzcsIDB4MDAwMCwgMHhiOGMwLCAweDYwOWUsIDB4MDA1MCwgMHgyMDM5LCAweDAwMjksIDB4OTcwNSwKKwkweDYwNzIsIDB4MGNjMCwgMHg5MTg1LCAweDAyMDAsIDB4NjA2MiwgMHg2MDczLCAweDIwMjksIDB4YTg3YywKKwkweGQwZmMsIDB4MDExOCwgMHhhZjk0LCAweDg3ZmYsIDB4MTEyMCwgMHgyZjAwLCAweDYwODIsIDB4NzgwOCwKKwkweDYwODYsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NjA3NywgMHgwMDAwLCAweGI4OGMsIDB4ODAwMCwKKwkweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4YTgzOCwKKwkweDYwOGEsIDB4YTgzNCwgMHg2MDhlLCAweGE4NDgsIDB4NjBjNiwgMHhhODQ0LCAweDYwY2EsIDB4Yjg2YywKKwkweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHgwODBjLCAweGFiZTMsIDB4MjAwOSwKKwkweDA3ZDAsIDB4NjBjNCwgMHg5MDg0LCAweGZmZjAsIDB4OTAwNSwgMHgwMTEwLCAweDIwMDksIDB4MWI1OCwKKwkweDA4MGMsIDB4ODYzYiwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDc4MDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MDQsIDB4YTJjMywKKwkweDkxODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsIDB4MDgwOSwKKwkweDYwNzcsIDB4MDAwOCwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGI4OGMsIDB4ODAwMCwKKwkweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmYwMCwKKwkweDYwODIsIDB4NzgwOCwgMHg2MDg2LCAweDc4MTQsIDB4MjA0OCwgMHhhODM4LCAweDYwOGEsIDB4YTgzNCwKKwkweDYwOGUsIDB4YTg0OCwgMHg2MGM2LCAweGE4NDQsIDB4NjBjYSwgMHhiODZjLCAweDYwY2UsIDB4YmFjMCwKKwkweDYyOWUsIDB4MDgwYywgMHhhYmUzLCAweDIwMDksIDB4MDdkMCwgMHg2MGM0LCAweDkwODQsIDB4ZmZmMCwKKwkweDkwMDUsIDB4MDExMCwgMHgyMDA5LCAweDFiNTgsIDB4MDgwYywgMHg4NjNiLCAweDAwM2UsIDB4MDA0ZSwKKwkweDAwNWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4NzgxNCwKKwkweDIwNDgsIDB4YTg3YywgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwgMHgwMDAyLCAweDA5MDQsIDB4YTJkZiwKKwkweDkxODUsIDB4MDEwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsIDB4MDg4MCwKKwkweDYwNzcsIDB4MDAwOCwgMHhiODhjLCAweDgwMDAsIDB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywKKwkweDYwN2EsIDB4NzgzOCwgMHg2MDdlLCAweDJmMDAsIDB4NjA4NiwgMHg3ODA4LCAweDYwODIsIDB4YTg5MCwKKwkweDYwOGEsIDB4YTg4YywgMHg2MDhlLCAweGE4YjAsIDB4NjBjNiwgMHhhOGFjLCAweDYwY2EsIDB4YThhYywKKwkweDc5MzAsIDB4OTEwOCwgMHg3OTMyLCAweGE4YjAsIDB4NzkyYywgMHg5MTA5LCAweDc5MmUsIDB4Yjg2YywKKwkweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhiYWMwLCAweDYyOWUsIDB4MDgwYywKKwkweGFiYzAsIDB4MDgwNCwgMHhhMjczLCAweGI4Y2MsIDB4ZDA4NCwgMHgwMTQ4LCAweGI4OGMsIDB4NzgxNCwKKwkweDIwNDgsIDB4Yjg4YywgMHg3ODRhLCAweGE4MzYsIDB4MjkwMCwgMHhhODNhLCAweGIwNDYsIDB4OTE4NSwKKwkweDA2MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg2MDczLCAweDA4MjksIDB4NjA3NywKKwkweDAwMDAsIDB4NjBhZiwgMHg5NTc1LCAweDYwZDcsIDB4MDAwMCwgMHgwODA0LCAweGEyNTYsIDB4OTE4NSwKKwkweDA3MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg3ODI0LCAweGQwY2MsIDB4NzgyNiwKKwkweDAxMTgsIDB4NjA3MywgMHgwODg5LCAweDAwMTAsIDB4NjA3MywgMHgwODk4LCAweDYwNzcsIDB4MDAwMCwKKwkweGI4OGMsIDB4ODAwMCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwgMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwKKwkweDAwMDAsIDB4MmYwMCwgMHg2MDg2LCAweDc4MDgsIDB4NjA4MiwgMHhhODM4LCAweDYwOGEsIDB4YTgzNCwKKwkweDYwOGUsIDB4YTg0OCwgMHg2MGM2LCAweGE4NDQsIDB4NjBjYSwgMHhiODZjLCAweDYwY2UsIDB4NjBhZiwKKwkweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGJhYzAsIDB4NjI5ZSwgMHg3ODI0LCAweGQwY2MsIDB4MDEyMCwKKwkweDA4MGMsIDB4YWJlMywgMHgwODA0LCAweGEyNzMsIDB4MDgwYywgMHhhYmMwLCAweDA4MDQsIDB4YTI3MywKKwkweDdhMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhOGMsIDB4ODIxMCwgMHg5Mjk0LCAweDAwZmYsIDB4YmE4ZSwKKwkweDAwYmUsIDB4ODIxNywgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgxOWU2LCAweDY4NDMsIDB4MDAwMSwKKwkweDAwZGUsIDB4MDAwNSwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDAwZjEsIDB4MDgwYywKKwkweDg2MmQsIDB4MDAwNSwgMHgwMDE2LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweDkxODQsIDB4MDYwMCwKKwkweDkwODYsIDB4MDYwMCwgMHgwMTI4LCAweDAwODksIDB4MDgwYywgMHg4NjJkLCAweDAwMWUsIDB4MDAwNSwKKwkweGMxZTUsIDB4MjAwMSwgMHgxODBjLCAweDIxMDIsIDB4MjAwMSwgMHgxOWU3LCAweDIwMDMsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTllZiwgMHgyMDAzLCAweDAwMDAsIDB4MGM4OCwgMHgwMDA2LCAweDYwMTQsIDB4OTA4NCwKKwkweDE4MDQsIDB4OTA4NSwgMHgwMDA5LCAweDYwMTYsIDB4MDAwZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwKKwkweDAwMDYsIDB4MjA2MSwgMHgwMTAwLCAweDYxYTQsIDB4NjBhNywgMHg5NWY1LCAweDYwMTQsIDB4OTA4NCwKKwkweDE4MDQsIDB4OTA4NSwgMHgwMDA4LCAweDYwMTYsIDB4MDAwZSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwKKwkweDYxYTYsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwMTYsIDB4MDAyNiwKKwkweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg3NDNlLCAweDExYzAsIDB4MjAwMSwKKwkweDFhMDIsIDB4MjAwNCwgMHg5MDA1LCAweDE1ZDAsIDB4MDgwYywgMHg3NGVlLCAweDExNjAsIDB4MjA2MSwKKwkweDAxMDAsIDB4NjAyMCwgMHhkMGI0LCAweDExMjAsIDB4NjAyNCwgMHhkMDg0LCAweDA5MGMsIDB4MGRkNSwKKwkweDA4MGMsIDB4ODYyZCwgMHgwNDU4LCAweDAwYzYsIDB4MjA2MSwgMHgxOWU2LCAweDAwYzgsIDB4NjkwNCwKKwkweDkxOTQsIDB4NDAwMCwgMHgwNTQwLCAweDA4MTEsIDB4MDgwYywgMHgyZDVlLCAweDAwYzYsIDB4MjA2MSwKKwkweDE5ZTYsIDB4NjEyOCwgMHg5MTkyLCAweDAwMDgsIDB4MTI1OCwgMHg4MTA4LCAweDYxMmEsIDB4NjEyNCwKKwkweDAwY2UsIDB4ODFmZiwgMHgwMTk4LCAweDA4MGMsIDB4ODYyZCwgMHgwODBjLCAweGEzNGQsIDB4MDA3MCwKKwkweDYxMjQsIDB4OTFlNSwgMHgwMDAwLCAweDAxNDAsIDB4MDgwYywgMHhlYjhlLCAweDA4MGMsIDB4ODYzNiwKKwkweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweGFmYmUsIDB4MDBjZSwgMHgwMDAwLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDIwMDEsIDB4MWEwMiwgMHgyMDA0LCAweDkwMDUsIDB4MWRiMCwKKwkweDAwYzYsIDB4MjA2MSwgMHgxOWU2LCAweDYxMjgsIDB4OTE5MiwgMHgwMDAzLCAweDFlMDgsIDB4ODEwOCwKKwkweDYxMmEsIDB4MDBjZSwgMHgwODBjLCAweDg2MmQsIDB4MDgwYywgMHg1ZjZjLCAweDIwMDksIDB4MTg0NiwKKwkweDIxMTQsIDB4ODIxMCwgMHgyMjBhLCAweDBjMTAsIDB4MDA5NiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDg2NDMsIDB4MjA3MSwgMHgxOWU2LCAweDcxM2MsIDB4ODFmZiwKKwkweDA5MDQsIDB4YTQ1NiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDA4MGMsIDB4NzQzZSwKKwkweDExZTAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhhNmFjLCAweDAwM2UsIDB4NzEzYywKKwkweDIxNjAsIDB4MDgwYywgMHhlYjhlLCAweDIwMDksIDB4MDA0YSwgMHg2MjIwLCAweDkyOTYsIDB4MDAwOSwKKwkweDExMzAsIDB4NjExNCwgMHgyMTQ4LCAweGE4N2IsIDB4MDAwNiwgMHgyMDA5LCAweDAwNGEsIDB4MDgwYywKKwkweGFmYmUsIDB4MDgwYywgMHg3NGVlLCAweDA4MDQsIDB4YTQ1NiwgMHgwODBjLCAweGE0NjIsIDB4MDkwNCwKKwkweGE0NTYsIDB4NjkwNCwgMHhkMWY0LCAweDA5MDQsIDB4YTQ1ZCwgMHgwODBjLCAweDJkNWUsIDB4MDBjNiwKKwkweDcwM2MsIDB4OTA2NSwgMHgwOTBjLCAweDBkZDUsIDB4NjAyMCwgMHgwMGNlLCAweDkwODYsIDB4MDAwNiwKKwkweDE1MjgsIDB4NjFjOCwgMHg2MGM0LCAweDkxMDUsIDB4MTUwOCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwKKwkweGQwZDQsIDB4MDFlMCwgMHg2MjE0LCAweDkyOTQsIDB4MTgwMCwgMHgxMTI4LCAweDYyMjQsIDB4OTI5NCwKKwkweDAwMDIsIDB4MTU2MCwgMHgwMDMwLCAweGMwZDQsIDB4MjAwYSwgMHhkMGNjLCAweDAxMTAsIDB4MDgwYywKKwkweDJjOTAsIDB4NjAxNCwgMHg5MDg0LCAweGU3ZmQsIDB4OTA4NSwgMHgwMDEwLCAweDYwMTYsIDB4NzAzYywKKwkweDIwNjAsIDB4MjAwOSwgMHgwMDQ5LCAweDA4MGMsIDB4YWZiZSwgMHgwMGMwLCAweDAwMzYsIDB4MjAxOSwKKwkweDAwMDEsIDB4MDgwYywgMHhhNmFjLCAweDAwM2UsIDB4NzEzYywgMHgyMTYwLCAweDA4MGMsIDB4ZWI4ZSwKKwkweDIwMDksIDB4MDA0YSwgMHg2MjIwLCAweDkyOTYsIDB4MDAwOSwgMHgxMTMwLCAweDYxMTQsIDB4MjE0OCwKKwkweGE4N2IsIDB4MDAwNiwgMHgyMDA5LCAweDAwNGEsIDB4MDgwYywgMHhhZmJlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwOWUsIDB4MDAwNSwgMHhkMWVjLCAweDE5MDQsIDB4YTQwZCwKKwkweDA4MDQsIDB4YTQwZiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA5NiwgMHg3MDNjLCAweDkwNjUsIDB4MDkwYywKKwkweDBkZDUsIDB4MjAwMSwgMHgwMzA2LCAweDIwMGMsIDB4OTE4NCwgMHgwMDMwLCAweDA5MDQsIDB4YTUwYiwKKwkweDkxODQsIDB4MDA0OCwgMHg5MDg2LCAweDAwMDgsIDB4MTkwNCwgMHhhNTBiLCAweDIwMDksIDB4MDIwNiwKKwkweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4OTEwNiwgMHgxOTA0LCAweGE1MGIsIDB4MjAwOSwKKwkweDAyMmEsIDB4MjEwNCwgMHgyMDA5LCAweDAyMmYsIDB4MjEwYywgMHg5MTE2LCAweDkwODQsIDB4MDNmZiwKKwkweDkxOGMsIDB4MDNmZiwgMHg5Mjk0LCAweDA0MDAsIDB4MDExMCwgMHg5MTAyLCAweDAwMzAsIDB4MjAxMCwKKwkweDIxMDAsIDB4OTIwMiwgMHgyMDA5LCAweDAyMjgsIDB4OTEwMiwgMHg5MDgyLCAweDAwMDUsIDB4MDI1MCwKKwkweDIwMDgsIDB4MjAwMSwgMHgwMTNiLCAweDIwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4OTEwMiwKKwkweDFhMDQsIDB4YTUwYiwgMHgyMDA5LCAweDFhODAsIDB4MjEwNCwgMHg4MDAwLCAweDAyMDgsIDB4MjAwYSwKKwkweDIwNjksIDB4MDEwMCwgMHg2OTE0LCAweDkxOGMsIDB4MDE4NCwgMHg5MThkLCAweDAwMTAsIDB4NjkxNiwKKwkweDY5YzgsIDB4MjAxMSwgMHgwMDIwLCAweDY4YzgsIDB4OTEwNiwgMHgxNTcwLCAweDgyMTEsIDB4MWRkOCwKKwkweDIwMDEsIDB4MDMwNiwgMHgyMDAzLCAweDQ4MDAsIDB4MjAwMSwgMHgwMDlhLCAweDIwMDMsIDB4MDAwNCwKKwkweDIwMDEsIDB4MWE2NSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxYTZlLCAweDIwMDMsIDB4MDAwMCwKKwkweDZhODgsIDB4Njk4YywgMHgyMjAwLCAweDkxMDUsIDB4MTEyMCwgMHgyYzEwLCAweDA4MGMsIDB4MWJlYiwKKwkweDAwNDAsIDB4NjAxNCwgMHgyMDQ4LCAweGFhM2EsIDB4YTkzNiwgMHg2YWM0LCAweDY5YzgsIDB4YTk0NiwKKwkweGFhNGEsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4MjQwMCwgMHgwMDJlLCAweDA4MGMsIDB4MWM4NCwKKwkweDE5MGMsIDB4MGRkNSwgMHgwMTJlLCAweDAwOTAsIDB4MjAwOSwgMHgxYTgxLCAweDIxMDQsIDB4ODAwMCwKKwkweDAyMDgsIDB4MjAwYSwgMHg2OWM4LCAweDIwMTEsIDB4MDAyMCwgMHg4MjExLCAweDFkZjAsIDB4NjhjOCwKKwkweDkxMDYsIDB4MWRjMCwgMHg2OWM0LCAweDY4YzgsIDB4OTEwNSwgMHgwMTYwLCAweDY4MjQsIDB4ZDA4YywKKwkweDAxMTAsIDB4NjgyNywgMHgwMDAyLCAweDcwNDgsIDB4YzA4NSwgMHg3MDRhLCAweDAwNzksIDB4NzA0OCwKKwkweGMwODQsIDB4NzA0YSwgMHgyMDA5LCAweDA3ZDAsIDB4MDgwYywgMHg4NjNiLCAweDkwMDYsIDB4MDA5ZSwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LCAweDAwMjYsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTllNiwgMHg3MDQ4LCAweGQwODQsIDB4MDFkOCwgMHg3MTNjLCAweDgxZmYsIDB4MDFjMCwKKwkweDIwNzEsIDB4MDEwMCwgMHg5MTg4LCAweDAwMDgsIDB4MjExNCwgMHg5MjhlLCAweDAwMDYsIDB4MTEzOCwKKwkweDcwMTQsIDB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwgMHg3MDE2LCAweDAwNDgsIDB4OTI4ZSwKKwkweDAwMDksIDB4MGRiMCwgMHg3MDE0LCAweDkwODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwMTYsIDB4NzAxNiwKKwkweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwKKwkweDAwNTYsIDB4MDA0NiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMTAsIDB4MjA1OCwKKwkweGJjYTAsIDB4MjA3MSwgMHgxOWU2LCAweDcwMTgsIDB4MjA1OCwgMHg4YmZmLCAweDAxOTAsIDB4YjhhMCwKKwkweDk0MDYsIDB4MDExOCwgMHhiODU0LCAweDIwNTgsIDB4MGNjMCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGFjNmMsIDB4YWQ3MCwgMHhhZTc4LCAweDAwOWUsIDB4MDgwYywgMHg2N2NiLCAweDAxMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDEyZSwgMHgwMDBlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4OWQzOSwgMHg3MDAzLCAweDEyMDAsIDB4NzgzOCwKKwkweDcwMTIsIDB4NzgzYywgMHg3MDE2LCAweDAwYzYsIDB4NzgyMCwgMHg5MDg2LCAweDAwMDQsIDB4MTE0OCwKKwkweDc4MTAsIDB4OTAwNSwgMHgwMTMwLCAweDAwYjYsIDB4MjA1OCwgMHhiODEwLCAweGI5MTQsIDB4MDBiZSwKKwkweDAwMjAsIDB4MjA2MSwgMHgxODAwLCAweDYwN2MsIDB4NjE4MCwgMHg5MDg0LCAweDAwZmYsIDB4NzAwYSwKKwkweDcxMGUsIDB4MDBjZSwgMHg2MGMzLCAweDAwMmMsIDB4MDgwNCwgMHhhMzJhLCAweDA4MGMsIDB4OWQzOSwKKwkweDcwMDMsIDB4MGYwMCwgMHg3ODA4LCAweGQwOWMsIDB4MDEyOCwgMHhiODEwLCAweDkwODQsIDB4MDBmZiwKKwkweDcwMGEsIDB4YjgxNCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweGEzMmEsIDB4MDE1NiwKKwkweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMDAsIDB4MDgwYywgMHg4Njk2LCAweDIwYTksIDB4MDAwNiwKKwkweDIwMTEsIDB4ZmZlYywgMHgyMDE5LCAweGZmZWQsIDB4OWVmMCwgMHgwMDAyLCAweDIzMDUsIDB4MjA3MiwKKwkweDhlNzAsIDB4MjIwNSwgMHgyMDcyLCAweDhlNzAsIDB4OTM5OCwgMHgwMDAyLCAweDkyOTAsIDB4MDAwMiwKKwkweDFmMDQsIDB4YTVhNiwgMHg2MGMzLCAweDAwMWMsIDB4MDE1ZSwgMHgwODA0LCAweGEzMmEsIDB4MDAxNiwKKwkweDAwMjYsIDB4MDgwYywgMHg5ZDYwLCAweDA4MGMsIDB4OWQ3MiwgMHg5ZTgwLCAweDAwMDQsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMCwgMHg3ODE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODAwLCAweDIwNDgsIDB4YTg2MCwKKwkweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjEsIDB4MjA5OCwgMHgwMDllLCAweDc4MDgsIDB4OTA4OCwKKwkweDAwMDIsIDB4MjFhOCwgMHg5MTkyLCAweDAwMTAsIDB4MTI1MCwgMHg0MDAzLCAweDkwODAsIDB4MDAwNCwKKwkweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweGEzMmEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjBhOSwKKwkweDAwMTAsIDB4NDAwMywgMHgwODBjLCAweGFiZTksIDB4MjBhMSwgMHgwMjQwLCAweDIyYTgsIDB4NDAwMywKKwkweDBjNjgsIDB4MDgwYywgMHg5ZDM5LCAweDcwMDMsIDB4NjIwMCwgMHg3ODA4LCAweDcwMGUsIDB4NjBjMywKKwkweDAwMDgsIDB4MDgwNCwgMHhhMzJhLCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDlkMzksIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjRjLCAweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwKKwkweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMywgMHgyMDk4LCAweDAwOWUsIDB4NzgwOCwKKwkweDkwODgsIDB4MDAwMiwgMHgyMWE4LCAweDQwMDMsIDB4ODAwMywgMHg2MGMyLCAweDA4MGMsIDB4YTMyYSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDcwMGMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxNzgsIDB4MDgwYywKKwkweGNlOGUsIDB4MTExMCwgMHgwODBjLCAweGI5MDUsIDB4NjAwYywgMHgwMDA2LCAweDA4MGMsIDB4ZDBmYSwKKwkweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweGE3NjEsIDB4MDBjZSwgMHgwYzc4LCAweDJjMDAsIDB4NzAwZSwKKwkweDcwMGEsIDB4MDEyZSwgMHgwMDBlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHg5MThjLCAweGU3ZmYsIDB4MjEwMiwKKwkweDIwNjksIDB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHgxOWU2LCAweDcwMjQsIDB4MjA2MCwKKwkweDhjZmYsIDB4MDFmOCwgMHgwODBjLCAweGEzNTYsIDB4NmFjMCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywKKwkweDg2MzYsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDgwYywgMHhhZDNhLCAweDAwY2UsIDB4MjBhOSwKKwkweDAxZjQsIDB4MDQ2MSwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywgMHhhZmJlLCAweDAwMGUsIDB4MDAxZSwKKwkweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxNWUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA5NiwgMHgwMDAxLCAweDBkNzgsIDB4OTA5NiwKKwkweDAwMDQsIDB4MGQ2MCwgMHgwODBjLCAweDg2MzYsIDB4NjgxNCwgMHg5MDg0LCAweDAwMDEsIDB4MDExMCwKKwkweDY4YTcsIDB4OTVmNSwgMHg2ODE3LCAweDAwMDgsIDB4NjhjMywgMHgwMDAwLCAweDIwMTEsIDB4NWYxNiwKKwkweDA4MGMsIDB4ODViMCwgMHgyMGE5LCAweDAxZjQsIDB4MDAwOSwgMHgwOGMwLCAweDY4MjQsIDB4ZDA5NCwKKwkweDAxNDAsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4OTA4NCwgMHg0MDAwLCAweDE5MGMsIDB4MmQ1ZSwKKwkweDAwOTAsIDB4ZDA4NCwgMHgwMTE4LCAweDY4MjcsIDB4MDAwMSwgMHgwMDEwLCAweDFmMDQsIDB4YTY4ZSwKKwkweDc4MDQsIDB4OTA4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwKKwkweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDAwMDUsIDB4MDEyNiwgMHgwMTU2LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwZDYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMjYsIDB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweDkxOGMsIDB4ZGJmZiwgMHgyMTAyLCAweDIwNjksIDB4MDEwMCwKKwkweDIwNzksIDB4MDE0MCwgMHgyMDcxLCAweDE5ZTYsIDB4NzAzYywgMHgyMDYwLCAweDhjZmYsIDB4MDkwNCwKKwkweGE3MTcsIDB4OTM4NiwgMHgwMDAyLCAweDExMjgsIDB4NjgxNCwgMHg5MDg0LCAweDAwMDIsIDB4MDkwNCwKKwkweGE3MTcsIDB4NjhhZiwgMHg5NWY1LCAweDY4MTcsIDB4MDAxMCwgMHgyMDA5LCAweDAwZmEsIDB4ODEwOSwKKwkweDFkZjAsIDB4NjljNiwgMHg2OGNiLCAweDAwMDgsIDB4MDgwYywgMHg4NjQzLCAweDA4MGMsIDB4MjAzOCwKKwkweDIwMDEsIDB4MDAzMiwgMHg2OTIwLCAweGQxYmMsIDB4MDEzMCwgMHg4MDAxLCAweDFkZDgsIDB4NjkyYywKKwkweDkxOGQsIDB4MDAwOCwgMHg2OTJlLCAweDIwYTksIDB4MDNlOCwgMHg2ODI0LCAweGQwOTQsIDB4MDE0MCwKKwkweDY4MjcsIDB4MDAwNCwgMHg3ODA0LCAweDkwODQsIDB4NDAwMCwgMHgxOTBjLCAweDJkNWUsIDB4MDA5MCwKKwkweGQwOGMsIDB4MDExOCwgMHg2ODI3LCAweDAwMDIsIDB4MDAxMCwgMHgxZjA0LCAweGE2ZWQsIDB4NzgwNCwKKwkweDkwODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmQ0ZSwgMHg2ODI3LCAweDQwMDAsIDB4NjgyNCwgMHg4M2ZmLCAweDExNDAsIDB4MjAwOSwKKwkweDAwNDksIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MDExMCwgMHgwODBjLCAweGFmYmUsIDB4MDAwZSwKKwkweDAwMWUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDE1ZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MTllNiwKKwkweDZhMDYsIDB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDIwNjksIDB4MTllNiwgMHg2YTMyLCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4OWVmYywKKwkweDc4NTQsIDB4NzAzMiwgMHg3MDQyLCAweDcwNDcsIDB4MTAwMCwgMHgwMGY4LCAweDA4MGMsIDB4OWVmYywKKwkweDc4NTQsIDB4NzAzMiwgMHg3MDQyLCAweDcwNDcsIDB4NDAwMCwgMHgwMGI4LCAweDA4MGMsIDB4OWVmYywKKwkweDc4NTQsIDB4NzAzMiwgMHg3MDQyLCAweDcwNDcsIDB4MjAwMCwgMHgwMDc4LCAweDA4MGMsIDB4OWVmYywKKwkweDc4NTQsIDB4NzAzMiwgMHg3MDQyLCAweDcwNDcsIDB4MDQwMCwgMHgwMDM4LCAweDA4MGMsIDB4OWVmYywKKwkweDc4NTQsIDB4NzAzMiwgMHg3MDQyLCAweDcwNDcsIDB4MDIwMCwgMHg2MGMzLCAweDAwMjAsIDB4MDgwNCwKKwkweGEzMmEsIDB4MDBlNiwgMHgyMDcxLCAweDE5ZTYsIDB4NzAyMCwgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwKKwkweDcwMjIsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA3NiwKKwkweDAwNjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4NzYxNCwKKwkweDI2NjAsIDB4MjY3OCwgMHgyMDM5LCAweDAwMDEsIDB4ODdmZiwgMHgwOTA0LCAweGE4MDYsIDB4OGNmZiwKKwkweDA5MDQsIDB4YTgwNiwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxOTA0LCAweGE4MDEsIDB4ODhmZiwKKwkweDAxMzgsIDB4MjgwMCwgMHg5YzA2LCAweDE5MDQsIDB4YTgwMSwgMHgyMDM5LCAweDAwMDAsIDB4MDA1MCwKKwkweDYwMTAsIDB4OWIwNiwgMHgxOTA0LCAweGE4MDEsIDB4ODVmZiwgMHgwMTIwLCAweDYwNTQsIDB4OTEwNiwKKwkweDE5MDQsIDB4YTgwMSwgMHg3MDI0LCAweDljMDYsIDB4MTViMCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwKKwkweDkwMDUsIDB4MTE2MCwgMHg2ODI0LCAweGQwODQsIDB4MDE0OCwgMHg2ODI3LCAweDAwMDEsIDB4MDgwYywKKwkweDg2MzYsIDB4MDgwYywgMHhhODhiLCAweDcwMjcsIDB4MDAwMCwgMHgwNDI4LCAweDA4MGMsIDB4ODYzNiwKKwkweDY4MjAsIDB4ZDBiNCwgMHgwMTEwLCAweDY4YTcsIDB4OTVmNSwgMHg2ODE3LCAweDAwMDgsIDB4NjhjMywKKwkweDAwMDAsIDB4MDgwYywgMHhhODhiLCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwKKwkweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmQ0ZSwKKwkweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwKKwkweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDcwMTQsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYxNiwKKwkweDcwMTAsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAxMiwKKwkweDAwMTAsIDB4NzAxMywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwKKwkweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDg5ZmYsIDB4MTE2OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxNCwKKwkweDAwOTYsIDB4MjA0OCwgMHgwODBjLCAweGNjODQsIDB4MDExMCwgMHgwODBjLCAweGU2ZGQsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweGE3NjEsIDB4ODhmZiwgMHgxMTkwLCAweDAwY2UsIDB4MDgwNCwKKwkweGE3N2MsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHhhNzdjLCAweDkwMDYsIDB4MDEyZSwKKwkweDAwMGUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwKKwkweDYwMWIsIDB4MDAwMCwgMHgwMGNlLCAweDk4YzUsIDB4MDAwMSwgMHgwYzg4LCAweDAwZjYsIDB4MDBlNiwKKwkweDAwZDYsIDB4MDA5NiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwKKwkweGE4N2EsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTkwNCwgMHhhODc1LCAweDg3ZmYsIDB4MDEyOCwKKwkweDI3MDAsIDB4OWMwNiwgMHgxOTA0LCAweGE4NzUsIDB4MDA0MCwgMHg2MDEwLCAweDliMDYsIDB4MTVlOCwKKwkweDg1ZmYsIDB4MDExOCwgMHg2MDU0LCAweDkxMDYsIDB4MTVjMCwgMHg3MDNjLCAweDljMDYsIDB4MTE2OCwKKwkweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTZhYywgMHg3MDMzLCAweDAwMDAsIDB4OTAwNiwKKwkweDcwM2UsIDB4NzA0MiwgMHg3MDQ2LCAweDcwNGEsIDB4MDAzZSwgMHg3MDM4LCAweDljMzYsIDB4MTExMCwKKwkweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwKKwkweDJmMDAsIDB4NzAzNiwgMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwKKwkweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjYzg0LCAweDAxMTAsIDB4MDgwYywgMHhlNmRkLCAweDA4MGMsIDB4YWY3NCwKKwkweDg3ZmYsIDB4MTE5OCwgMHgwMGNlLCAweDA4MDQsIDB4YTgyNiwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwKKwkweDA4MDQsIDB4YTgyNiwgMHg5MDA2LCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwKKwkweDAwOWUsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFiLCAweDAwMDAsIDB4MDBjZSwKKwkweDk3YmQsIDB4MDAwMSwgMHgwYzgwLCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDExMTgsIDB4NzAwNywgMHgwMDA1LCAweDAwMTAsIDB4NzAwNywKKwkweDAwMDAsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwKKwkweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDJjMTAsIDB4NzYzOCwKKwkweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA1NDAsIDB4MjIwMCwgMHg5YzA2LCAweDE1MDgsIDB4NzAzOCwKKwkweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsIDB4NzAzNCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwKKwkweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsIDB4MDAxMCwgMHg3MDM3LCAweDAwMDAsIDB4NjYwYywKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4OTY1NywgMHg5MDg1LCAweDAwMDEsIDB4MDAyMCwKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4YjAsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA5NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwKKwkweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE5ZTYsIDB4NzYwYywgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweGE5NzEsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4OTIwNiwgMHgxOTA0LCAweGE5NmMsIDB4NzAyNCwKKwkweDljMDYsIDB4MTUyMCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHg5MDA1LCAweDA5MDQsIDB4YTk0MywKKwkweDA4MGMsIDB4YTM1NiwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHhhODhiLCAweDcwMjcsIDB4MDAwMCwKKwkweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwKKwkweDAxMDAsIDB4MDgwYywgMHgyZDRlLCAweDkwMDYsIDB4MDgwYywgMHgyZDRlLCAweDIwNjksIDB4MDEwMCwKKwkweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDcwMGMsIDB4OWMzNiwKKwkweDExMTAsIDB4NjYwYywgMHg3NjBlLCAweDcwMDgsIDB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwKKwkweDAxMTgsIDB4MmYwMCwgMHg3MDBhLCAweDAwMTAsIDB4NzAwYiwgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwKKwkweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwKKwkweDA4MGMsIDB4Y2U3ZCwgMHgxMTgwLCAweDA4MGMsIDB4MzI0NywgMHgwODBjLCAweGNlOGUsIDB4MTUxOCwKKwkweDA4MGMsIDB4YjkwNSwgMHgwNDAwLCAweDA4MGMsIDB4YTg4YiwgMHg2ODI0LCAweGQwODQsIDB4MDliMCwKKwkweDY4MjcsIDB4MDAwMSwgMHgwODk4LCAweDA4MGMsIDB4Y2U4ZSwgMHgxMTE4LCAweDA4MGMsIDB4YjkwNSwKKwkweDAwOTAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NCwgMHgwMTY4LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MTUwOCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkMGIsIDB4MDgwYywgMHhjZTcxLCAweDA4MGMsIDB4ZDBmYSwgMHgwODBjLCAweGFmNzQsIDB4MDgwYywKKwkweGE3NjEsIDB4MDBjZSwgMHgwODA0LCAweGE4ZWMsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwKKwkweGE4ZWMsIDB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDFkMjAsIDB4MDgwYywKKwkweGU2ZGQsIDB4MGMwOCwgMHgwMGQ2LCAweDA4MGMsIDB4OWQ4NCwgMHg3MDAzLCAweDAyMDAsIDB4NzAwNywKKwkweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDE5ODgsIDB4MjBlOSwKKwkweDAwMDAsIDB4MjBhMSwgMHgwMjUwLCAweDIwYTksIDB4MDAwNCwgMHg0MDAzLCAweDcwMjMsIDB4MDAwNCwKKwkweDcwMjcsIDB4Nzg3OCwgMHgwODBjLCAweGEzMmEsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4OWQ4NCwKKwkweDcwMGIsIDB4MDgwMCwgMHg3ODE0LCAweDkwODQsIDB4ZmYwMCwgMHg3MDBlLCAweDc4MTQsIDB4OTA4NCwKKwkweDAwZmYsIDB4NzAyMiwgMHg3ODJjLCAweDcwMjYsIDB4Nzg1OCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NSwKKwkweDAyMDAsIDB4NzAwMiwgMHg3ODU4LCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDcwMDYsIDB4NjBjMiwKKwkweDA4MDQsIDB4YTMyYSwgMHgwMGI2LCAweDAwZDYsIDB4MDAxNiwgMHgwMGQ2LCAweDJmNjgsIDB4MjAwOSwKKwkweDAwMzUsIDB4MDgwYywgMHhkMzAwLCAweDAwZGUsIDB4MTkwNCwgMHhhYTFmLCAweDA4MGMsIDB4OWQzOSwKKwkweDcwMDMsIDB4MTMwMCwgMHg3ODJjLCAweDA4MGMsIDB4YWIyNSwgMHgyMDY4LCAweDY4MjAsIDB4OTA4NiwKKwkweDAwMDMsIDB4MDU2MCwgMHg3ODEwLCAweDIwNTgsIDB4YmFhMCwgMHgwODBjLCAweGFlYWQsIDB4MTFkOCwKKwkweDkyODYsIDB4MDA3ZSwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmUsIDB4MDQ5OCwKKwkweDkyODYsIDB4MDA3ZiwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwgMHg3MDBmLCAweGZmZmQsIDB4MDQ1OCwKKwkweDkyODQsIDB4ZmY4MCwgMHgwMTgwLCAweDkyODYsIDB4MDA4MCwgMHgxMTI4LCAweDcwMGIsIDB4MDBmZiwKKwkweDcwMGYsIDB4ZmZmYywgMHgwNDAwLCAweDkyZDgsIDB4MTAwMCwgMHgyYjVjLCAweGI4MTAsIDB4NzAwYSwKKwkweGI4MTQsIDB4NzAwZSwgMHgwMGMwLCAweDYwOTgsIDB4NzAwZSwgMHgwMGE4LCAweDA4MGMsIDB4YWVhZCwKKwkweDExMzAsIDB4NzgxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4MiwgMHgwMDdlLCAweDAyNTAsIDB4MDBkNiwKKwkweDIwNjksIDB4MTgxZiwgMHgyZDA0LCAweDcwMGEsIDB4OGQ2OCwgMHgyZDA0LCAweDcwMGUsIDB4MDBkZSwKKwkweDAwMTAsIDB4NjAzNCwgMHg3MDBlLCAweDc4MzgsIDB4NzAxMiwgMHg3ODNjLCAweDcwMTYsIDB4NjBjMywKKwkweDAwMGMsIDB4MDAxZSwgMHgwMGRlLCAweDA4MGMsIDB4YTMyYSwgMHgwMGJlLCAweDAwMDUsIDB4NzgxYiwKKwkweDAwMDEsIDB4NzgwMywgMHgwMDA2LCAweDAwMWUsIDB4MDBkZSwgMHgwMGJlLCAweDAwMDUsIDB4NzkyYywKKwkweDkxODAsIDB4MDAwOCwgMHgyMDBjLCAweDkxODYsIDB4MDAwNiwgMHgwMWMwLCAweDkxODYsIDB4MDAwMywKKwkweDA5MDQsIDB4YWE5YSwgMHg5MTg2LCAweDAwMDUsIDB4MDkwNCwgMHhhYTgyLCAweDkxODYsIDB4MDAwNCwKKwkweDA1ZDgsIDB4OTE4NiwgMHgwMDA4LCAweDA5MDQsIDB4YWE4YiwgMHg3ODA3LCAweDAwMzcsIDB4NzgyZiwKKwkweDAwMDMsIDB4NzgxNywgMHgxNzAwLCAweDA4MGMsIDB4YWIwMiwgMHgwMDA1LCAweDA4MGMsIDB4YWFjMywKKwkweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4MjAwOSwgMHg0MDAwLCAweDY4MDAsIDB4MDAwMiwKKwkweGFhNjMsIDB4YWE2ZSwgMHhhYTY1LCAweGFhNmUsIDB4YWE2YSwgMHhhYTYzLCAweGFhNjMsIDB4YWE2ZSwKKwkweGFhNmUsIDB4YWE2ZSwgMHhhYTZlLCAweGFhNjMsIDB4YWE2MywgMHhhYTYzLCAweGFhNjMsIDB4YWE2MywKKwkweGFhNmUsIDB4YWE2MywgMHhhYTZlLCAweDA4MGMsIDB4MGRkNSwgMHg2ODI0LCAweGQwZTQsIDB4MDExMCwKKwkweGQwY2MsIDB4MDExMCwgMHg5MDBlLCAweDAwMTAsIDB4MjAwOSwgMHgyMDAwLCAweDY4MmMsIDB4NzAyMiwKKwkweDY4MzAsIDB4NzAyNiwgMHgwODA0LCAweGFhYmMsIDB4MDgwYywgMHhhYWMzLCAweDAwZDYsIDB4MDAyNiwKKwkweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4NmEwMCwgMHg5Mjg2LCAweDAwMDIsIDB4MTEwOCwKKwkweDkwMGUsIDB4MDRkMCwgMHgwODBjLCAweGFhYzMsIDB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwKKwkweDIwMDksIDB4NDAwMCwgMHgwNDg4LCAweDA0YjksIDB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwKKwkweDIwMDksIDB4NDAwMCwgMHg5Mjg2LCAweDAwMDUsIDB4MDExOCwgMHg5Mjg2LCAweDAwMDIsIDB4MTEwOCwKKwkweDkwMGUsIDB4MDQxMCwgMHgwNDQxLCAweDAwZDYsIDB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4NjgxNCwKKwkweDY5MjQsIDB4YzE4NSwgMHg2OTI2LCAweDAwOTYsIDB4MjA0OCwgMHhhOWFjLCAweGE4MzQsIDB4OTExMiwKKwkweGE5YjAsIDB4YTgzOCwgMHgwMDllLCAweDkxMDMsIDB4NzAyMiwgMHg3MjI2LCAweDc5MmMsIDB4OTE4MCwKKwkweDAwMDAsIDB4MjAwNCwgMHg5MDhlLCAweDAwMDIsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDQsIDB4MDExOCwKKwkweDIwMDksIDB4NDAwMCwgMHgwMDA4LCAweDkwMGUsIDB4NzEyYSwgMHg2MGMzLCAweDAwMTgsIDB4MDAyZSwKKwkweDAwZGUsIDB4MDgwNCwgMHhhMzJhLCAweDAwYjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA2NiwKKwkweDA4MGMsIDB4OWQ4NCwgMHg5MDA2LCAweDcwMDMsIDB4MDIwMCwgMHg3OTM4LCAweDcxMGEsIDB4NzkzYywKKwkweDcxMGUsIDB4NzgxMCwgMHgyMDU4LCAweGI4YTAsIDB4MDgwYywgMHhhZWFkLCAweDExMTgsIDB4OTA5MiwKKwkweDAwN2UsIDB4MDI2OCwgMHgwMGQ2LCAweDIwNjksIDB4MTgxZiwgMHgyZDJjLCAweDhkNjgsIDB4MmQzNCwKKwkweDkwZDgsIDB4MTAwMCwgMHgyYjVjLCAweGJiMTAsIDB4YmMxNCwgMHgwMGRlLCAweDAwMjgsIDB4OTAxZSwKKwkweDY0OTgsIDB4MjAyOSwgMHgwMDAwLCAweDY2MzQsIDB4NzgyYywgMHg5MDgwLCAweDAwMDgsIDB4MjAwNCwKKwkweDkwODYsIDB4MDAwMywgMHgxMTI4LCAweDc1MTIsIDB4NzYxNiwgMHg3MzFhLCAweDc0MWUsIDB4MDAyMCwKKwkweDczMTIsIDB4NzQxNiwgMHg3NTFhLCAweDc2MWUsIDB4MDA2ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwODBjLCAweDlkODQsIDB4NzAwMywgMHgwMTAwLCAweDc4MmMsIDB4NzAwYSwKKwkweDc4MTQsIDB4NzAwZSwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweGEzMmEsIDB4MDgwYywKKwkweDlkMzAsIDB4NzAwMywgMHgxNDAwLCAweDc4MzgsIDB4NzAwYSwgMHgwMDc5LCAweDc4M2MsIDB4NzAwZSwKKwkweDc4MmMsIDB4NzAxMiwgMHg3ODMwLCAweDcwMTYsIDB4NzgzNCwgMHg5MDg0LCAweDAwZmYsIDB4ODAwNywKKwkweDcwMWEsIDB4NjBjMywgMHgwMDEwLCAweDA4MDQsIDB4YTMyYSwgMHgwMGU2LCAweDIwNzEsIDB4MDI0MCwKKwkweDAwMDYsIDB4MDBmNiwgMHgyMDc4LCAweDc4MTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4Y2MsIDB4ZDA4NCwKKwkweDAxMjAsIDB4Nzg0NCwgMHg3MDJhLCAweDc4NDgsIDB4NzAyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwZSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwODBjLCAweDlkN2IsIDB4NzAwMywgMHgwMTAwLCAweDc4MmMsIDB4NzAwYSwKKwkweDc4MTQsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHhhMzJhLCAweDAwMjEsIDB4NjBjMywKKwkweDAwMDAsIDB4MDgwNCwgMHhhMzJhLCAweDAwZDYsIDB4MDgwYywgMHhhYmZlLCAweGI4MTAsIDB4OTA4NSwKKwkweDAzMDAsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4N2MsIDB4NzAwYSwKKwkweDY4ODAsIDB4NzAwZSwgMHg3MDEzLCAweDA4MTksIDB4MDgwYywgMHhhMzE4LCAweDcyMWEsIDB4MmYxMCwKKwkweDcyMjIsIDB4N2EwOCwgMHg3MjI2LCAweDIwNzEsIDB4MDI0YywgMHgwMGRlLCAweDAwMDUsIDB4MDBhOSwKKwkweDc5MTQsIDB4NzEyYSwgMHg2MGMzLCAweDAwMDAsIDB4NjBhNywgMHg5NTc1LCAweDAwMjYsIDB4MDgwYywKKwkweDJiZTMsIDB4MDIyOCwgMHgyMDExLCAweDAxMDEsIDB4MjIwNCwgMHhjMGM1LCAweDIwMTIsIDB4MDAyZSwKKwkweDA4MGMsIDB4YTM0ZCwgMHgwODBjLCAweDg2MmQsIDB4MDAwNSwgMHgwMDM2LCAweDAwOTYsIDB4MDBkNiwKKwkweDAwZTYsIDB4Nzg1OCwgMHgyMDQ4LCAweGFhN2MsIDB4OTI5NiwgMHgwMGMwLCAweDkyOTQsIDB4ZmZmZCwKKwkweGFhN2UsIDB4YWE4MCwgMHg5Mjk0LCAweDAzMDAsIDB4YWE4MiwgMHhhOTZjLCAweDkxOTQsIDB4MDBmZiwKKwkweGFiNzQsIDB4OTM4NCwgMHgwMGZmLCAweDkwOGQsIDB4YzIwMCwgMHhhOTZlLCAweDkzODQsIDB4ZmYwMCwKKwkweDkyMTUsIDB4YWE3NiwgMHhhODcwLCAweGFhNzgsIDB4YTg3YSwgMHhhYTcyLCAweDAwZDYsIDB4MjA2OSwKKwkweDAyMDAsIDB4MDgwYywgMHhhYmZlLCAweDAwZGUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwKKwkweDIwYTksIDB4MDAwYSwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjA5OCwKKwkweDQwMDMsIDB4NjBhMywgMHgwMDM1LCAweGFhNjgsIDB4OTI5NCwgMHg3MDAwLCAweDkyODYsIDB4MzAwMCwKKwkweDAxMTAsIDB4NjBhMywgMHgwMDM3LCAweDAwZWUsIDB4MDBkZSwgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwKKwkweDkwMGUsIDB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDAxYzAsIDB4OTA4NCwKKwkweDAwMDMsIDB4MTFhOCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGJjLCAweDAxODAsIDB4NzgyNCwKKwkweGQwY2MsIDB4MTE2OCwgMHhkMGM0LCAweDExNTgsIDB4YThhOCwgMHg5MDA1LCAweDExNDAsIDB4MjAwMSwKKwkweDE4MGMsIDB4MjAwYywgMHhjMWQ1LCAweDIxMDIsIDB4MjAwOSwgMHgxOWIxLCAweDIxMGMsIDB4MDA5ZSwKKwkweDkxOGQsIDB4MDA5MiwgMHgwMDEwLCAweDIwMDksIDB4MDA5NiwgMHg2MGFiLCAweDAwMzYsIDB4NjExNiwKKwkweDAwMDUsIDB4MjAwOSwgMHgwMDA5LCAweDAwYTAsIDB4MjAwOSwgMHgwMDBhLCAweDAwODgsIDB4MjAwOSwKKwkweDAwMGIsIDB4MDA3MCwgMHgyMDA5LCAweDAwMGMsIDB4MDA1OCwgMHgyMDA5LCAweDAwMGQsIDB4MDA0MCwKKwkweDIwMDksIDB4MDAwZSwgMHgwMDI4LCAweDIwMDksIDB4MDAwZiwgMHgwMDEwLCAweDIwMDksIDB4MDAwOCwKKwkweDY5MTIsIDB4MDAwNSwgMHgwODBjLCAweDlkMzksIDB4MDAxNiwgMHgwMDI2LCAweDAwOTYsIDB4MDBkNiwKKwkweDc4MTQsIDB4MjA0OCwgMHg3MDEzLCAweDAxMzgsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwKKwkweDAwMjgsIDB4MTEzOCwgMHgyMDAxLCAweDE5N2IsIDB4MjAwNCwgMHg5MDg2LCAweGFhYWEsIDB4MTkwNCwKKwkweGFjYTMsIDB4NzAwMywgMHg1NDAwLCAweDAwYzYsIDB4MjA2MSwgMHgxODAwLCAweDYwN2MsIDB4OTA4NCwKKwkweDAwZmYsIDB4YTk5OCwgMHg4MTBmLCAweDkxOGMsIDB4ZmYwMCwgMHg5MTA1LCAweDcwMGEsIDB4NjA4MCwKKwkweDcwMGUsIDB4YTk5OCwgMHg5MThjLCAweGZmMDAsIDB4NzExMiwgMHgyMGE5LCAweDAwMDQsIDB4MjAwOSwKKwkweDE4MDUsIDB4MmUxMCwgMHg5MjkwLCAweDAwMDYsIDB4MjEwNCwgMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwKKwkweDFmMDQsIDB4YWMzNCwgMHgyMGE5LCAweDAwMDQsIDB4MjAwOSwgMHgxODAxLCAweDIxMDQsIDB4MjAxMiwKKwkweDgxMDgsIDB4ODIxMCwgMHgxZjA0LCAweGFjM2UsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMjksIDB4MjA5OCwgMHgyMDA5LCAweDAwMDYsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDIsIDB4ODAwNywKKwkweDIwMTIsIDB4ODIxMCwgMHg4MTA5LCAweDFkYzAsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4MDgwYywKKwkweGFiZTksIDB4MDBkZSwgMHgyMDcxLCAweDAyNDAsIDB4MjAxMSwgMHgwMjQwLCAweDIwMDksIDB4MDAwMiwKKwkweDIwYTksIDB4MDAwMSwgMHg0MDAyLCAweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksIDB4MWRjMCwKKwkweDIwMDksIDB4MDAwOCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwgMHg4MDA3LCAweDIwMTIsIDB4ODIxMCwKKwkweDgxMDksIDB4MWRjMCwgMHhhODVjLCAweDkwODAsIDB4MDAzMSwgMHgyMDk4LCAweDIwMDksIDB4MDAwOCwKKwkweDIwYTksIDB4MDAwMSwgMHg0MDAyLCAweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksIDB4MWRjMCwKKwkweDAwY2UsIDB4NjBjMywgMHgwMDRjLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MjAwMSwKKwkweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMjgsIDB4MTE2OCwgMHgwODBjLCAweDc0M2UsIDB4MDE1MCwKKwkweDYwMjgsIDB4YzBiZCwgMHg2MDJhLCAweDYwMTQsIDB4OTA4NCwgMHgxODA0LCAweDkwODUsIDB4MDAyOSwKKwkweDYwMTYsIDB4MDAxMCwgMHgwODBjLCAweGEzMmEsIDB4MDgwYywgMHg4NjJkLCAweDAwZGUsIDB4MDA5ZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMjQwLCAweDIwMDEsIDB4MjIwMCwKKwkweDkwODUsIDB4MDBmZiwgMHg3MDAyLCAweDcwMDcsIDB4ZmZmZiwgMHgyMDcxLCAweDAxMDAsIDB4NzA5YiwKKwkweDAwZmYsIDB4MDBlZSwgMHgwODA0LCAweGFjMTksIDB4MDgwYywgMHg5ZDM5LCAweDAwMTYsIDB4MDAyNiwKKwkweDAwOTYsIDB4MDBkNiwgMHg3ODE0LCAweDIwNDgsIDB4NzAxMywgMHgwMTM4LCAweDcwMDMsIDB4NTUwMCwKKwkweDAwYzYsIDB4YTg5YywgMHg5MDg0LCAweDAwZmYsIDB4YTk5OCwgMHg4MTBmLCAweDkxOGMsIDB4ZmYwMCwKKwkweDkxMDUsIDB4NzAwYSwgMHhhOTljLCAweDkxOGMsIDB4ZmYwMCwgMHhhOGEwLCAweDkwODQsIDB4MDBmZiwKKwkweDkxMDUsIDB4NzAwZSwgMHhhOTk4LCAweDkxOGMsIDB4ZmYwMCwgMHgyMDYxLCAweDE4MDAsIDB4NjA3YywKKwkweDkwODQsIDB4MDBmZiwgMHg5MTBkLCAweDcxMTIsIDB4NjE4MCwgMHg3MTE2LCAweDIwMDksIDB4MDAwOCwKKwkweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyOSwgMHgyMDk4LCAweDJlMTAsIDB4OTI5MCwKKwkweDAwMDYsIDB4MjBhOSwgMHgwMDAxLCAweDQwMDIsIDB4ODAwNywgMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwKKwkweDFkYzAsIDB4MjBhOSwgMHgwMDA0LCAweDIwMDksIDB4MTgwNSwgMHgyMTA0LCAweDIwMTIsIDB4ODEwOCwKKwkweDgyMTAsIDB4MWYwNCwgMHhhY2Y1LCAweDIwYTksIDB4MDAwMiwgMHgyMDA5LCAweDE4MDEsIDB4MjEwNCwKKwkweDIwMTIsIDB4ODEwOCwgMHg4MjEwLCAweDFmMDQsIDB4YWNmZiwgMHgwMGQ2LCAweDAwMTYsIDB4MjA2OSwKKwkweDAyMDAsIDB4MDgwYywgMHhhYmU5LCAweDAwMWUsIDB4MDBkZSwgMHgyMDcxLCAweDAyNDAsIDB4MjBhOSwKKwkweDAwMDIsIDB4MjAwOSwgMHgxODAzLCAweDIwMTEsIDB4MDI0MCwgMHgyMTA0LCAweDIwMTIsIDB4ODEwOCwKKwkweDgyMTAsIDB4MWYwNCwgMHhhZDE1LCAweDIwMDksIDB4MDAwOCwgMHg0MDAyLCAweDgwMDcsIDB4MjAxMiwKKwkweDgyMTAsIDB4ODEwOSwgMHgxZGQwLCAweDkwMDYsIDB4MjBhOSwgMHgwMDA4LCAweDIwMTIsIDB4ODIxMCwKKwkweDFmMDQsIDB4YWQyNiwgMHgwMGNlLCAweDYwYzMsIDB4MDA0YywgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywKKwkweDk1NzUsIDB4MDgwYywgMHhhMzJhLCAweDA4MGMsIDB4ODYyZCwgMHgwMGRlLCAweDAwOWUsIDB4MDAyZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDkyOTAsIDB4MDAxOCwgMHg4MjE0LCAweDIwZTksIDB4MDAwMCwKKwkweDIwNjksIDB4MDIwMCwgMHg2ODEzLCAweDAwMDAsIDB4MjJhOCwgMHg5Mjg0LCAweDAwZTAsIDB4MDEyOCwKKwkweDIwYTksIDB4MDAyMCwgMHg5MjkyLCAweDAwMjAsIDB4MDAwOCwgMHg5MDE2LCAweDIwYTEsIDB4MDI0MCwKKwkweDkwMDYsIDB4NDAwNCwgMHg4MmZmLCAweDAxMjAsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MGM2MCwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NzgsIDB4NjA1NiwKKwkweDkwMDYsIDB4YTgzNiwgMHhhODNhLCAweGE5OWMsIDB4YTk0NiwgMHhhODRhLCAweDYwMjMsIDB4MDAwMywKKwkweDYwMDcsIDB4MDA0MCwgMHg2MDAzLCAweDAwMDMsIDB4NjAwYiwgMHhmZmZmLCAweGE4MTcsIDB4MDAwMSwKKwkweGE4NDIsIDB4YTgzZSwgMHgyOTAwLCAweGE4NWEsIDB4YTgxMywgMHgyMGNjLCAweDA4MGMsIDB4OTIxNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OTg5MSwgMHgwMTJlLCAweDAwOWUsIDB4MDBkZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMGE2LCAweDAwOTYsIDB4MDA2NiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTllNiwgMHg3NjBjLCAweDI2NjAsIDB4MjY3OCwKKwkweDhjZmYsIDB4MDkwNCwgMHhhZTBkLCAweDcwMjQsIDB4OWMwNiwgMHgxNTIwLCAweDIwNjksIDB4MDEwMCwKKwkweDY4YzAsIDB4OTAwNSwgMHgwOTA0LCAweGFkZGYsIDB4MDgwYywgMHhhMzU2LCAweDY4YzMsIDB4MDAwMCwKKwkweDA4MGMsIDB4YTg4YiwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwKKwkweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJkNGUsIDB4OTAwNiwKKwkweDA4MGMsIDB4MmQ0ZSwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywKKwkweDAwMDEsIDB4MDAzZSwgMHg3MDBjLCAweDljMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MGUsIDB4NzAwOCwKKwkweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMGEsIDB4MDAxMCwKKwkweDcwMGIsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwKKwkweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHhjZTdkLCAweDExODAsIDB4MDgwYywKKwkweDMyNDcsIDB4MDgwYywgMHhjZThlLCAweDE1MTgsIDB4MDgwYywgMHhiOTA1LCAweDA0MDAsIDB4MDgwYywKKwkweGE4OGIsIDB4NjgyNCwgMHhkMDg0LCAweDA5YjAsIDB4NjgyNywgMHgwMDAxLCAweDA4OTgsIDB4MDgwYywKKwkweGNlOGUsIDB4MTExOCwgMHgwODBjLCAweGI5MDUsIDB4MDA5MCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywKKwkweGNjODQsIDB4MDE2OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxNTIwLCAweGE4NjcsIDB4MDEwMywKKwkweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGNlNzEsIDB4MDgwYywKKwkweGQwZmEsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsIDB4YTc2MSwgMHgwMGNlLCAweDA4MDQsIDB4YWQ5MCwKKwkweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4YWQ5MCwgMHg3MDBmLCAweDAwMDAsIDB4NzAwYiwKKwkweDAwMDAsIDB4MDEyZSwgMHgwMDZlLCAweDAwOWUsIDB4MDBhZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwKKwkweDAwZmUsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxZDA4LCAweDA4MGMsIDB4ZTZkZCwKKwkweDA4ZjAsIDB4MDBkNiwgMHgwMTU2LCAweDA4MGMsIDB4OWQ4NCwgMHg3YTE0LCAweDgyZmYsIDB4MDEzOCwKKwkweDcwMDMsIDB4MDEwMCwgMHg3MDBiLCAweDAwMDMsIDB4NjBjMywgMHgwMDA4LCAweDA0OTAsIDB4NzAwMywKKwkweDAyMDAsIDB4NzAwNywgMHgwMDAwLCAweDIwNjksIDB4MTgwMCwgMHg5MDFlLCAweDY4MDAsIDB4OTA4NiwKKwkweDAwMDQsIDB4MTExMCwgMHhjMzhkLCAweDAwNjAsIDB4MDgwYywgMHg3NDNlLCAweDExMTAsIDB4YzNhZCwKKwkweDAwMDgsIDB4YzNhNSwgMHg2YWRjLCAweGQyOWMsIDB4MTExMCwgMHhkMmFjLCAweDAxMDgsIDB4YzM5ZCwKKwkweDczMGUsIDB4MDgwYywgMHg4Njk2LCAweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweGZmZWMsIDB4MjAxOSwKKwkweGZmZWQsIDB4MjA3MSwgMHgwMjUwLCAweDIzMDUsIDB4MjA3MiwgMHg4ZTcwLCAweDIyMDUsIDB4MjA3MiwKKwkweDhlNzAsIDB4OTM5OCwgMHgwMDAyLCAweDkyOTAsIDB4MDAwMiwgMHgxZjA0LCAweGFlNTMsIDB4NjBjMywKKwkweDAwMjAsIDB4MDgwYywgMHhhMzJhLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDAxNTYsIDB4MDgwYywKKwkweDlkODQsIDB4N2ExNCwgMHg4MmZmLCAweDAxNjgsIDB4OTI4NiwgMHhmZmZmLCAweDAxMTgsIDB4OTI4MiwKKwkweDAwMGUsIDB4MTIzOCwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDYwYzMsIDB4MDAwOCwKKwkweDA0ODgsIDB4NzAwMywgMHgwMjAwLCAweDcwMDcsIDB4MDAxYywgMHg3MDBmLCAweDAwMDEsIDB4MjAxMSwKKwkweDE5YmMsIDB4MjIwNCwgMHg4MDA3LCAweDcwMWEsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4NzAxZSwKKwkweDA0MjEsIDB4MTEyMCwgMHhiOGEwLCAweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LCAweDIwMDEsIDB4MTgxZiwKKwkweDIwMDQsIDB4NzAyMiwgMHgyMDAxLCAweDE4MjAsIDB4MjAwNCwgMHg3MDI2LCAweDAwMzAsIDB4MjAwMSwKKwkweDE4MTgsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4NzAyNiwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwKKwkweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNTYsIDB4NDAwMywKKwkweDYwYzMsIDB4MDAxYywgMHgwMTVlLCAweDA4MDQsIDB4YTMyYSwgMHgwMDA2LCAweDIwMDEsIDB4MTgzNywKKwkweDIwMDQsIDB4ZDBhYywgMHgwMDBlLCAweDAwMDUsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4YTcyMiwKKwkweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweGE3MmMsIDB4MDgwYywgMHhhNjM2LCAweDAwMzYsIDB4OTAxZSwKKwkweDA4MGMsIDB4YTZhYywgMHgwMDNlLCAweDAwMDUsIDB4MDgwYywgMHgzMzdkLCAweDAxODgsIDB4MDAxNiwKKwkweDAwYjYsIDB4MDBjNiwgMHg3MDEwLCAweDkwODUsIDB4MDAyMCwgMHg3MDEyLCAweDIwMDksIDB4MDA3ZSwKKwkweDA4MGMsIDB4NjY5OSwgMHhiODVjLCAweGMwYWMsIDB4Yjg1ZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAxZSwKKwkweDAwMDUsIDB4MjA3MSwgMHgxODhkLCAweDcwMDAsIDB4OTAwNSwgMHgwMTQwLCAweDIwMDEsIDB4MDk3NiwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MDc2LCAweDcwN2EsIDB4NzA2YiwgMHhmZmUwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcwNzQsIDB4NzA1NiwgMHg3MDViLCAweDFjZDAsIDB4MDAwNSwgMHgwMGU2LCAweDAxMjYsIDB4MjA3MSwKKwkweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDc1NTQsIDB4OTU4MiwgMHgwMDEwLCAweDA2MDgsIDB4NzA1OCwKKwkweDIwNjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg5Y2UwLCAweDAwMTgsIDB4NzA2OCwKKwkweDljMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4MWNkMCwgMHgwYzk4LCAweDYwMDMsIDB4MDAwOCwKKwkweDg1MjksIDB4NzU1NiwgMHg5Y2E4LCAweDAwMTgsIDB4NzA2OCwgMHg5NTAyLCAweDEyMzAsIDB4NzU1YSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg3MDViLCAweDFjZDAsIDB4MGNjMCwKKwkweDkwMDYsIDB4MGNjMCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHg3NTU0LCAweDk1ODIsIDB4MDAxMCwKKwkweDA2MDAsIDB4NzA1OCwgMHgyMDYwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4OWNlMCwKKwkweDAwMTgsIDB4NzA2OCwgMHg5YzAyLCAweDEyMDgsIDB4MGNiMCwgMHgyMDYxLCAweDFjZDAsIDB4MGM5OCwKKwkweDYwMDMsIDB4MDAwOCwgMHg4NTI5LCAweDc1NTYsIDB4OWNhOCwgMHgwMDE4LCAweDcwNjgsIDB4OTUwMiwKKwkweDEyMjgsIDB4NzU1YSwgMHg5MDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDcwNWIsIDB4MWNkMCwKKwkweDBjYzgsIDB4OTAwNiwgMHgwY2M4LCAweDljODIsIDB4MWNkMCwgMHgwYTBjLCAweDBkZDUsIDB4MjAwMSwKKwkweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDFhMGMsIDB4MGRkNSwgMHg5MDA2LCAweDYwMDYsIDB4NjAwYSwKKwkweDYwMGUsIDB4NjAxNiwgMHg2MDFhLCAweDYwMTIsIDB4NjAyMywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMCwKKwkweDYwMWUsIDB4NjA1NiwgMHg2MDVhLCAweDYwMjYsIDB4NjAyYSwgMHg2MDJlLCAweDYwMzIsIDB4NjAzNiwKKwkweDYwM2EsIDB4NjAzZSwgMHg2MDQyLCAweDYwMmEsIDB4MjA2MSwgMHgxODAwLCAweDYwNTQsIDB4ODAwMCwKKwkweDYwNTYsIDB4OTA4NiwgMHgwMDAxLCAweDAxMDgsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OTc2MywgMHgwMTJlLCAweDBjYzAsIDB4MDAwNiwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwKKwkweDAxYjAsIDB4NjAxYywgMHhkMDg0LCAweDE5MGMsIDB4MWFhMSwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywKKwkweDAwMDcsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDQsIDB4MDAwNiwgMHg5MDgyLCAweDAwNTEsIDB4MDAwZSwKKwkweDAyMDgsIDB4ODAwNCwgMHg2MDFhLCAweDA4MGMsIDB4ZTk5NywgMHg2MDQzLCAweDAwMDAsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDBlNiwgMHgwMTI2LCAweDIwNzEsIDB4MTgwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU1NCwKKwkweDk1ODIsIDB4MDAwMSwgMHgwNjA4LCAweDcwNTgsIDB4MjA2MCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwKKwkweDAxNDgsIDB4OWNlMCwgMHgwMDE4LCAweDcwNjgsIDB4OWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwKKwkweDFjZDAsIDB4MGM5OCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTU2LCAweDljYTgsIDB4MDAxOCwKKwkweDcwNjgsIDB4OTUwMiwgMHgxMjMwLCAweDc1NWEsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBlZSwKKwkweDAwMDUsIDB4NzA1YiwgMHgxY2QwLCAweDBjYzAsIDB4OTAwNiwgMHgwY2MwLCAweDYwMjAsIDB4OTA4NCwKKwkweDAwMGYsIDB4MDAwMiwgMHhhZmQxLCAweGFmZGEsIDB4YWZmNSwgMHhiMDEwLCAweGQzYWUsIDB4ZDNjYiwKKwkweGQzZTYsIDB4YWZkMSwgMHhhZmRhLCAweDhlNDMsIDB4YjAyYywgMHhhZmQxLCAweGFmZDEsIDB4YWZkMSwKKwkweGFmZDEsIDB4OTE4NiwgMHgwMDEzLCAweDExMjgsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4OTc2MywKKwkweDAwMDUsIDB4MDAwNSwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwgMHgwMDE2LCAweDFhMGMsIDB4MGRkNSwKKwkweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweGFmZjMsIDB4Yjc2ZiwgMHhiOTRjLCAweGFmZjMsIDB4YjllMiwKKwkweGIzMGYsIDB4YWZmMywgMHhhZmYzLCAweGI2ZjEsIDB4YmY0OSwgMHhhZmYzLCAweGFmZjMsIDB4YWZmMywKKwkweGFmZjMsIDB4YWZmMywgMHhhZmYzLCAweDA4MGMsIDB4MGRkNSwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwKKwkweDAwMTYsIDB4MWEwYywgMHgwZGQ1LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweGIwMGUsIDB4YzYzMCwKKwkweGIwMGUsIDB4YjAwZSwgMHhiMDBlLCAweGIwMGUsIDB4YjAwZSwgMHhiMDBlLCAweGM1YzcsIDB4YzdiMiwKKwkweGIwMGUsIDB4YzY3MSwgMHhjNmYwLCAweGM2NzEsIDB4YzZmMCwgMHhiMDBlLCAweDA4MGMsIDB4MGRkNSwKKwkweDYwMDAsIDB4OTA4MiwgMHgwMDE2LCAweDFhMGMsIDB4MGRkNSwgMHg2MDAwLCAweDAwMDIsIDB4YjAyYSwKKwkweGJmOTAsIDB4YzA3NSwgMHhjMWE1LCAweGMzNTQsIDB4YjAyYSwgMHhiMDJhLCAweGIwMmEsIDB4YmY2NCwKKwkweGM1NTMsIDB4YzU1NiwgMHhiMDJhLCAweGIwMmEsIDB4YjAyYSwgMHhiMDJhLCAweGM1ODUsIDB4YjAyYSwKKwkweGIwMmEsIDB4YjAyYSwgMHgwODBjLCAweDBkZDUsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwKKwkweDFhMGMsIDB4MGRkNSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhiMDQ1LCAweGIwNDUsIDB4YjA4OCwKKwkweGIxMjcsIDB4YjFiYywgMHhiMDQ1LCAweGIwNDUsIDB4YjA0NSwgMHhiMDQ3LCAweGIwNDUsIDB4YjA0NSwKKwkweGIwNDUsIDB4YjA0NSwgMHhiMDQ1LCAweGIwNDUsIDB4YjA0NSwgMHgwODBjLCAweDBkZDUsIDB4OTE4NiwKKwkweDAwNGMsIDB4MDU4OCwgMHg5MTg2LCAweDAwMDMsIDB4MTkwYywgMHgwZGQ1LCAweDAwOTYsIDB4NjAxYywKKwkweGMwZWQsIDB4NjAxZSwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywKKwkweDkwODQsIDB4YTAwMCwgMHhjMGI1LCAweGE4N2UsIDB4YThhYywgMHhhODQ2LCAweGE4YjAsIDB4YTg0YSwKKwkweDkwMDYsIDB4YTgzNiwgMHhhODNhLCAweGE4ODQsIDB4OTA5MiwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwKKwkweDE5OTksIDB4ODAwMywgMHg4MDEzLCAweDgyMTMsIDB4OTIxMCwgMHg2MjFhLCAweDAwOWUsIDB4MmMxMCwKKwkweDA4MGMsIDB4MWJlYiwgMHgwODBjLCAweDkyMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDk4OTEsIDB4MDEyZSwgMHgwMDA1LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJjYTAsIDB4MDBiZSwKKwkweDJjMDAsIDB4MDgwYywgMHhiMWRlLCAweDA4MGMsIDB4ZDNhMCwgMHg2MDAzLCAweDAwMDcsIDB4MDAwNSwKKwkweDAwZDYsIDB4MDA5NiwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3YTkwLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4N2MsIDB4ZDBlYywgMHgxMTEwLCAweDkyOTAsIDB4MDAxOCwgMHhhYzc4LCAweGM0ZmMsIDB4MDA0NiwKKwkweGE4ZTAsIDB4OTAwNSwgMHgxMTQwLCAweGE4ZGMsIDB4OTIxYSwgMHgwMTQwLCAweDAyMjAsIDB4YTg3YiwKKwkweDAwMDcsIDB4MjAxMCwgMHgwMDI4LCAweGE4N2IsIDB4MDAxNSwgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwKKwkweDgyMTQsIDB4YTg4MywgMHgwMDAwLCAweGFhMDIsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDI0MDAsIDB4OTAwNSwgMHgxMTA4LCAweDAwOWEsIDB4MjEwMCwKKwkweDkwODYsIDB4MDAxNSwgMHgxMTE4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDM4LCAweDIxMDAsIDB4OTA4NiwKKwkweDAwMTYsIDB4MDExOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAyYSwgMHg5NGE0LCAweDAwMDcsIDB4ODQyMywKKwkweDk0MDUsIDB4MDAwMiwgMHhiMGVmLCAweGIwZWYsIDB4YjBlYSwgMHhiMGVkLCAweGIwZWYsIDB4YjBlNywKKwkweGIwZGEsIDB4YjBkYSwgMHhiMGRhLCAweGIwZGEsIDB4YjBkYSwgMHhiMGRhLCAweGIwZGEsIDB4YjBkYSwKKwkweGIwZGEsIDB4YjBkYSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDA0ZSwgMHgwMGZlLCAweDAwOWUsIDB4MDBkZSwgMHgwODBjLCAweDBkZDUsIDB4MDgwYywKKwkweGJiYTEsIDB4MDAyOCwgMHgwODBjLCAweGJjODYsIDB4MDAxMCwgMHgwODBjLCAweGJkN2MsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgyYzAwLCAweGE4OTYsIDB4MDAwZSwKKwkweDA4MGMsIDB4YjI5YywgMHgwNTMwLCAweGE4MDQsIDB4YTgwZSwgMHgwMGE2LCAweDIwNTAsIDB4YjEwMCwKKwkweDAwYWUsIDB4ODAwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwMiwgMHhhYWNjLCAweGFiZDAsIDB4YWNkNCwgMHhhZGQ4LCAweDIwMzEsIDB4MDAwMCwKKwkweDIwNDEsIDB4MTI1ZCwgMHgwODBjLCAweGI0NWQsIDB4MDE2MCwgMHgwMDBlLCAweDkwMDUsIDB4MDEyMCwKKwkweDAwZmUsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBmZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwKKwkweGFmNDMsIDB4MjAwMSwgMHgwMDJjLCAweDkwMGUsIDB4MDgwYywgMHhiMzAyLCAweDBjNzAsIDB4OTFiNiwKKwkweDAwMTUsIDB4MDE3MCwgMHg5MWI2LCAweDAwMTYsIDB4MDE1OCwgMHg5MWIyLCAweDAwNDcsIDB4MGEwYywKKwkweDBkZDUsIDB4OTFiMiwgMHgwMDUwLCAweDFhMGMsIDB4MGRkNSwgMHg5MTgyLCAweDAwNDcsIDB4MDBjYSwKKwkweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwOGMsIDB4MDE5OCwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwKKwkweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4OTE2MywgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAxMmUsIDB4YTAwMSwgMHg2MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxMTEwLCAweDA4MDQsIDB4YjA4OCwKKwkweDAwMDUsIDB4YjE1YSwgMHhiMTVhLCAweGIxNWMsIDB4YjE5MiwgMHhiMTVhLCAweGIxNWEsIDB4YjE1YSwKKwkweGIxNWEsIDB4YjFhNSwgMHgwODBjLCAweDBkZDUsIDB4MDBkNiwgMHgwMDE2LCAweDAwOTYsIDB4MDgwYywKKwkweDk3MTMsIDB4MDgwYywgMHg5ODkxLCAweDYwMDMsIDB4MDAwNCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YywKKwkweGQwZmMsIDB4MDFjMCwgMHhhODc4LCAweGMwZmMsIDB4OTAwNSwgMHgxMTU4LCAweGE4OTQsIDB4OTAwNSwKKwkweDAxNDAsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MDgwYywgMHhiMzAyLCAweDA4MGMsIDB4YWY0MywKKwkweDAwYTgsIDB4NjAwMywgMHgwMDAyLCAweGE4YTQsIDB4YTlhOCwgMHg5MTA1LCAweDExNzgsIDB4YThhZSwKKwkweGE4YjIsIDB4MGM3OCwgMHhhODdmLCAweDAwMjAsIDB4YTg4YywgMHhhODhhLCAweGE4YTQsIDB4YThhZSwKKwkweGE4YTgsIDB4YThiMiwgMHhhOGM3LCAweDAwMDAsIDB4YThjYiwgMHgwMDAwLCAweDAwOWUsIDB4MDAxZSwKKwkweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweDk3MTMsIDB4MDBkNiwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMTIwLCAweGE4N2IsIDB4MDAwNiwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwKKwkweDAwZGUsIDB4MDgwYywgMHhhZjQzLCAweDA4MDQsIDB4OTg5MSwgMHgwODBjLCAweDk3MTMsIDB4MDgwYywKKwkweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwZDYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywKKwkweGNjODYsIDB4MDEyMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsIDB4MDBkZSwKKwkweDA4MGMsIDB4YWY0MywgMHgwODA0LCAweDk4OTEsIDB4OTE4MiwgMHgwMDQ3LCAweDAwMDIsIDB4YjFjYywKKwkweGIxY2UsIDB4YjFjYywgMHhiMWNjLCAweGIxY2MsIDB4YjFjYywgMHhiMWNjLCAweGIxY2MsIDB4YjFjYywKKwkweGIxY2MsIDB4YjFjYywgMHhiMWNjLCAweGIxY2UsIDB4MDgwYywgMHgwZGQ1LCAweDAwZDYsIDB4MDA5NiwKKwkweDYwMWYsIDB4MDAwMCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwKKwkweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHhhZjQzLCAweDAwMjYsIDB4MDAzNiwKKwkweDAwNTYsIDB4MDA2NiwgMHgwMDk2LCAweDAwYTYsIDB4MDBmNiwgMHgwMDA2LCAweDA4MGMsIDB4MGZmZiwKKwkweDAwMGUsIDB4MDkwYywgMHgwZGQ1LCAweGE5NjAsIDB4MjFlOCwgMHhhOTVjLCAweDkxODgsIDB4MDAxOSwKKwkweDIxYTAsIDB4OTAwZSwgMHgyMGE5LCAweDAwMjAsIDB4NDEwNCwgMHhhODdhLCAweDIwNzksIDB4MTgwMCwKKwkweDc5OTAsIDB4OTE4OCwgMHgwMDE4LCAweDkxOGMsIDB4MGZmZiwgMHhhOTcyLCAweGFjNzYsIDB4Mjk1MCwKKwkweDAwYTYsIDB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHg5MDFlLCAweDIwMjksIDB4MDAwMSwKKwkweDkxODIsIDB4MDAzNCwgMHgxMjI4LCAweDIwMTEsIDB4MDAxZiwgMHgwODBjLCAweGM4MzcsIDB4MDRjMCwKKwkweDIxMzAsIDB4MjAwOSwgMHgwMDM0LCAweDIwMTEsIDB4MDAxZiwgMHgwODBjLCAweGM4MzcsIDB4OTZiMiwKKwkweDAwMzQsIDB4YjAwNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywgMHgwZmIxLCAweDA4MGMsIDB4MGZmZiwKKwkweDAxZDAsIDB4ODUyOCwgMHhhODY3LCAweDAxMTAsIDB4YTg2YiwgMHgwMDAwLCAweDI5MjAsIDB4YjQwNiwKKwkweDk2OGEsIDB4MDAzZCwgMHgxMjMwLCAweDI2MDgsIDB4MjAxMSwgMHgwMDFiLCAweDA4MGMsIDB4YzgzNywKKwkweDAwYjgsIDB4OTZiMiwgMHgwMDNjLCAweDIwMDksIDB4MDAzYywgMHgyOTUwLCAweDIwMTEsIDB4MDAxYiwKKwkweDA4MGMsIDB4YzgzNywgMHgwYzE4LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwKKwkweDg1MmYsIDB4OTVhZCwgMHgwMDUwLCAweGI1NjYsIDB4YjA3MCwgMHhjMGZkLCAweGIwNzIsIDB4MDA0OCwKKwkweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLCAweDk1YWQsIDB4MDA1MCwKKwkweGI1NjYsIDB4MmE0OCwgMHhhODA0LCAweGE4MDcsIDB4MDAwMCwgMHgwMDA2LCAweDA4MGMsIDB4NmQxNywKKwkweDAwMGUsIDB4MjA0OCwgMHg5MDA1LCAweDFkYjAsIDB4MDBmZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA2ZSwKKwkweDAwNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMGY2LCAweDAwOTYsIDB4MDAwNiwKKwkweDA4MGMsIDB4MGZmZiwgMHgwMDBlLCAweDA5MGMsIDB4MGRkNSwgMHhhOTYwLCAweDIxZTgsIDB4YTk1YywKKwkweDkxODgsIDB4MDAxOSwgMHgyMWEwLCAweDkwMGUsIDB4MjBhOSwgMHgwMDIwLCAweDQxMDQsIDB4YWE2NiwKKwkweGE4N2EsIDB4MjA3OSwgMHgxODAwLCAweDc5OTAsIDB4ODEwYywgMHg5MTg4LCAweDAwMGMsIDB4OTE4MiwKKwkweDAwMWEsIDB4MDIxMCwgMHgyMDA5LCAweDAwMWEsIDB4MjFhOCwgMHg4MTBiLCAweGE5NzIsIDB4YWM3NiwKKwkweDJlOTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMWYsIDB4MjBhMCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwYywKKwkweDkxOGQsIDB4MDA4MCwgMHgyMTAyLCAweDQwMDMsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NmQxNywKKwkweDAwOWUsIDB4MDBmZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGQ2LCAweDAwZjYsIDB4MDA5NiwKKwkweDAwMTYsIDB4MjAwMSwgMHgwMjA1LCAweDIwMGMsIDB4OTE4ZCwgMHgwMDgwLCAweDIxMDIsIDB4MDAxZSwKKwkweDIwNzksIDB4MDIwMCwgMHgyZTk4LCAweGE4N2MsIDB4ZDBlYywgMHgwMTE4LCAweDllODAsIDB4MDAwYywKKwkweDIwOTgsIDB4MjAyMSwgMHgwMDNlLCAweDkwMWUsIDB4OTI4MiwgMHgwMDIwLCAweDAyMTgsIDB4MjAxMSwKKwkweDAwMjAsIDB4MjAxOCwgMHg5NDg2LCAweDAwM2UsIDB4MTE3MCwgMHgwMDk2LCAweDA4MGMsIDB4MGZmZiwKKwkweDI5MDAsIDB4MDA5ZSwgMHgwNWMwLCAweGE4MDYsIDB4MjA0OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywKKwkweDkwODAsIDB4MDAwMiwgMHgyMGEwLCAweDMzMDAsIDB4OTA4ZSwgMHgwMjYwLCAweDAxNDAsIDB4MjAwOSwKKwkweDAyODAsIDB4OTEwMiwgMHg5MjBhLCAweDAyMTgsIDB4MjAxMCwgMHgyMTAwLCAweDkzMTgsIDB4MjIwMCwKKwkweDk0MDIsIDB4MTIyOCwgMHgyNDAwLCAweDkyMDIsIDB4MjQxMCwgMHg5MzE4LCAweDkwMDYsIDB4MjAyMCwKKwkweDIyYTgsIDB4YTgwMCwgMHg5MjAwLCAweGE4MDIsIDB4MjBlMSwgMHgwMDAwLCAweDQwMDMsIDB4ODNmZiwKKwkweDAxODAsIDB4MzMwMCwgMHg5MDg2LCAweDAyODAsIDB4MTEzMCwgMHg3ODE0LCAweDgwMDAsIDB4OTA4NSwKKwkweDAwODAsIDB4NzgxNiwgMHgyZTk4LCAweDIzMTAsIDB4ODRmZiwgMHgwOTA0LCAweGIyYjEsIDB4MDgwNCwKKwkweGIyYjMsIDB4OTA4NSwgMHgwMDAxLCAweDc4MTcsIDB4MDAwMCwgMHgwMDllLCAweDAwZmUsIDB4MDBkZSwKKwkweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4MDA5NiwgMHg2MzE0LCAweDIzNDgsIDB4YTg3YSwKKwkweGE5ODIsIDB4MDgwYywgMHg2ZDBiLCAweDAwOWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4OTFiNiwKKwkweDAwMTUsIDB4MTExOCwgMHgwODBjLCAweGFmNDMsIDB4MDAzMCwgMHg5MWI2LCAweDAwMTYsIDB4MTkwYywKKwkweDBkZDUsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MjBhOSwgMHgwMDBlLCAweDIwZTEsIDB4MDAwMCwKKwkweDJlOTgsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4MjBhMCwKKwkweDAwOWUsIDB4NDAwMywgMHgwMTM2LCAweDkwODAsIDB4MDAxYiwgMHgyMGEwLCAweDIwMTEsIDB4MDAwNiwKKwkweDIwYTksIDB4MDAwMSwgMHgzNDE4LCAweDgzMTgsIDB4MjNhMCwgMHg0MDAzLCAweDMzMTgsIDB4ODMxOCwKKwkweDIzOTgsIDB4ODIxMSwgMHgxZGI4LCAweDIwMTEsIDB4MDAwNiwgMHgwMTNlLCAweDIwYTAsIDB4MzMxOCwKKwkweDgzMTgsIDB4MjM5OCwgMHg0MDAzLCAweDM0MTgsIDB4ODMxOCwgMHgyM2EwLCAweDgyMTEsIDB4MWRiOCwKKwkweDAwOTYsIDB4MDgwYywgMHhjYzg2LCAweDAxMzAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwKKwkweGE4NjcsIDB4MDEwMywgMHgwMDllLCAweDA4MDQsIDB4YWY0MywgMHgwMDk2LCAweDAwZDYsIDB4MDAzNiwKKwkweDczMzAsIDB4OTM4NiwgMHgwMjAwLCAweDExYTgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhjZiwKKwkweDAwMDAsIDB4MDBiZSwgMHg2MDE0LCAweDkwMDUsIDB4MDEzMCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwKKwkweGE4NjcsIDB4MDEwMywgMHhhYjMyLCAweDA4MGMsIDB4YWY0MywgMHgwMDNlLCAweDAwZGUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDAxMSwgMHgxZDQ4LCAweDBjYzgsIDB4MDAwNiwgMHgwMDE2LCAweDA4MGMsIDB4ZDM4OCwKKwkweDAxODgsIDB4NjAxNCwgMHg5MDA1LCAweDExNzAsIDB4NjAwYiwgMHgwMDAzLCAweDYwMWIsIDB4MDAwMCwKKwkweDYwNDMsIDB4MDAwMCwgMHgyMDA5LCAweDAwMjIsIDB4MDgwYywgMHhiNzQ3LCAweDkwMDYsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNkMCwgMHgwMDk2LCAweDAwMTYsIDB4MjBhOSwKKwkweDAwMTQsIDB4OWU4MCwgMHgwMDBjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk4LCAweDYwMTQsIDB4MjA0OCwKKwkweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwgMHgyMGEwLCAweDQwMDMsIDB4MjAwMSwKKwkweDAyMDUsIDB4MjAwMywgMHgwMDAxLCAweDIwOTksIDB4MDI2MCwgMHgyMGE5LCAweDAwMTYsIDB4NDAwMywKKwkweDIwYTksIDB4MDAwYSwgMHhhODA0LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDIsIDB4MjA5OSwKKwkweDAyNjAsIDB4MjBhOSwgMHgwMDIwLCAweDQwMDMsIDB4MjAwMywgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwKKwkweGE4MDAsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywgMHhhZjQzLCAweDAwMWUsIDB4MDA5ZSwKKwkweDAwMDUsIDB4MDA5NiwgMHgwMDE2LCAweDkwMGUsIDB4NzAzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDE0MCwKKwkweDcwMzgsIDB4OTA4NCwgMHgwMGZmLCAweDgwMGMsIDB4NzAzYywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwKKwkweDkwODAsIDB4MDAwNCwgMHg5MTA4LCAweDgxMGIsIDB4MjAxMSwgMHgwMDAyLCAweDIwMTksIDB4MDAwYywKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM4MzcsIDB4MDgwYywgMHhjYzg2LCAweDAxNDAsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTgwNywgMHgwMDAwLCAweGE4NjQsIDB4YThlMiwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywKKwkweGFmNDMsIDB4MDAxZSwgMHgwMDllLCAweDAwMDUsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDAsIDB4NzAzMCwKKwkweDkwODYsIDB4MDIwMCwgMHgwMTEwLCAweDIwMDksIDB4MDAwMSwgMHgwMDk2LCAweDYwMTQsIDB4OTA0ZCwKKwkweDA5MGMsIDB4MGRkNSwgMHhhOTdhLCAweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDA4MGMsIDB4YWY0MywKKwkweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwOTYsIDB4NzAzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTExOCwKKwkweDIwMDksIDB4MDAwNCwgMHgwMDEwLCAweDcwMzQsIDB4ODAwYywgMHg4MTBiLCAweDIwMTEsIDB4MDAwYywKKwkweDIwMTksIDB4MDAwYywgMHg2MDE0LCAweDIwNDgsIDB4YTgwNCwgMHgwMDk2LCAweDkwMDUsIDB4MDEwOCwKKwkweDIwNDgsIDB4MDgwYywgMHhjODM3LCAweDAwOWUsIDB4MDgwYywgMHhjYzg2LCAweDAxNDgsIDB4YTgwNCwKKwkweDkwMDUsIDB4MTE1OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NCwgMHhhOGUyLCAweGE4NjcsIDB4MDEwMywKKwkweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMWUsIDB4MDAwNSwgMHgwMDg2LCAweDIwNDAsIDB4YTAzMCwKKwkweDgwMDcsIDB4OTA4NiwgMHgwMTAwLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwZTAsIDB4YTAzNCwKKwkweDgwMDcsIDB4ODAwYywgMHg4ODA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwKKwkweGZmYzAsIDB4OTA4MCwgMHgwMDBjLCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywKKwkweDQwMDAsIDB4YWFhMCwgMHhhYjljLCAweGFjYTgsIDB4YWRhNCwgMHgyMDMxLCAweDAwMDAsIDB4MjA0MSwKKwkweDEyNDMsIDB4MDAxOSwgMHgwZDA4LCAweDAwOGUsIDB4MDg5OCwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywKKwkweDBmZmYsIDB4MDAwZSwgMHgwMWIwLCAweGE4YWIsIDB4MGRjYiwgMHhhODc2LCAweDAwMGUsIDB4YThhMiwKKwkweDAwMDYsIDB4YWU2YSwgMHgyODAwLCAweGE4OWUsIDB4YTk3YSwgMHhhZjcyLCAweGFhOGUsIDB4YWI5MiwKKwkweGFjOTYsIDB4YWQ5YSwgMHgwMDg2LCAweDI5NDAsIDB4MDgwYywgMHgxMGU5LCAweDAwOGUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDI2LCAweDcwMDgsIDB4OTA4NCwKKwkweDAwZmYsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExMCwgMHgwMGJlLCAweDkyMDYsIDB4MTUyMCwKKwkweDcwMGMsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExNCwgMHgwMGJlLCAweDkyMDYsIDB4MTFlMCwKKwkweDYwNDMsIDB4MDAwMCwgMHgyYzY4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDM1LCAweDA4MGMsIDB4ZDMwMCwKKwkweDAwMWUsIDB4MTE1OCwgMHg2MjJjLCAweDIyNjgsIDB4MjA3MSwgMHgwMjZjLCAweDZiMjAsIDB4OTM4NiwKKwkweDAwMDMsIDB4MDEzMCwgMHg5Mzg2LCAweDAwMDYsIDB4MDEyOCwgMHgwODBjLCAweGFmNDMsIDB4MDAyMCwKKwkweDAwMzksIDB4MDAxMCwgMHgwODBjLCAweGI1N2MsIDB4MDAyZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwOTYsIDB4NjgxNCwgMHgyMDQ4LCAweDkxODYsIDB4MDAxNSwgMHgwOTA0LCAweGI1NjQsIDB4OTE4ZSwKKwkweDAwMTYsIDB4MTkwNCwgMHhiNTdhLCAweDcwMGMsIDB4OTA4YywgMHhmZjAwLCAweDkxODYsIDB4MTcwMCwKKwkweDAxMjAsIDB4OTE4NiwgMHgwMzAwLCAweDE5MDQsIDB4YjUzZSwgMHg4OWZmLCAweDExMzgsIDB4NjgwMCwKKwkweDkwODYsIDB4MDAwZiwgMHgwOTA0LCAweGI1MjEsIDB4MDgwNCwgMHhiNTc4LCAweDY4MDgsIDB4OTA4NiwKKwkweGZmZmYsIDB4MTkwNCwgMHhiNTY2LCAweGE4N2MsIDB4OTA4NCwgMHgwMDYwLCAweDkwODYsIDB4MDAyMCwKKwkweDExMjgsIDB4YTgzYywgMHhhOTQwLCAweDkxMDUsIDB4MTkwNCwgMHhiNTY2LCAweDY4MjQsIDB4ZDA4NCwKKwkweDE5MDQsIDB4YjU2NiwgMHhkMGI0LCAweDAxNTgsIDB4MDAxNiwgMHgyMDAxLCAweDE5ODUsIDB4MjAwYywKKwkweDYwMTgsIDB4OTEwMiwgMHg5MDgyLCAweDAwMDUsIDB4MDAxZSwgMHgxYTA0LCAweGI1NjYsIDB4MDgwYywKKwkweGNlNzEsIDB4Njg1YywgMHhhODgyLCAweGE4N2MsIDB4YzBkYywgMHhjMGY0LCAweGMwZDQsIDB4YTg3ZSwKKwkweDAwMjYsIDB4OTAwZSwgMHg2YTE4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDkwMjcsIDB4YTg4NCwKKwkweDkyMGEsIDB4MDIwOCwgMHg4MDExLCAweGFhODYsIDB4ODJmZiwgMHgwMDJlLCAweDExMzgsIDB4MDBjNiwKKwkweDJkNjAsIDB4MDgwYywgMHhjOTk5LCAweDAwY2UsIDB4MDgwNCwgMHhiNTc4LCAweDAwYzYsIDB4YTg2OCwKKwkweGQwZmMsIDB4MTExOCwgMHgwODBjLCAweDYxNDEsIDB4MDAxMCwgMHgwODBjLCAweDY1NGUsIDB4MDBjZSwKKwkweDE5MDQsIDB4YjU2NiwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHhhZjQzLCAweDAwY2UsIDB4MDgwNCwKKwkweGI1NzgsIDB4MDBjNiwgMHgwODBjLCAweGFmOTEsIDB4MDE5OCwgMHg2MDE3LCAweDAwMDAsIDB4NjgxMCwKKwkweDYwMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwMywgMHg2OTA0LCAweDAwYzYsIDB4MmQ2MCwKKwkweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDA4MGMsIDB4YWZiZSwgMHgwMGNlLCAweDA4MDQsIDB4YjU3OCwKKwkweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDY4NDIsIDB4MDBjZSwgMHgwNGQwLCAweDcwMDgsIDB4OTA4NiwKKwkweDAwMGIsIDB4MTFjOCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOTAwLCAweGMxYmMsIDB4YjkwMiwKKwkweDAwYmUsIDB4MDBjNiwgMHgyZDYwLCAweGE4N2IsIDB4MDAwMywgMHgwODBjLCAweGQzNDIsIDB4NjAwNywKKwkweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywKKwkweDk3NjMsIDB4MDBjZSwgMHgwMGU4LCAweDcwMGMsIDB4OTA4NiwgMHgyYTAwLCAweDExMzgsIDB4MjAwMSwKKwkweDE5ODcsIDB4MjAwNCwgMHg2ODQyLCAweDAwYTAsIDB4MDQ3OSwgMHgwMGEwLCAweDg5ZmYsIDB4MDkwYywKKwkweDBkZDUsIDB4MDBjNiwgMHgwMGQ2LCAweDJkNjAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAwMywKKwkweDA4MGMsIDB4NmIzMywgMHgwODBjLCAweGNlNzEsIDB4MDgwYywgMHhhZjc0LCAweDAwZGUsIDB4MDBjZSwKKwkweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsIDB4OTE4NiwgMHgwMDE1LCAweDExMjgsIDB4MjAwMSwKKwkweDE5ODcsIDB4MjAwNCwgMHg2ODQyLCAweDAwNjgsIDB4OTE4ZSwgMHgwMDE2LCAweDExNjAsIDB4MDBjNiwKKwkweDJkMDAsIDB4MjA2MCwgMHgwODBjLCAweGU5OTcsIDB4MDgwYywgMHg4NzZmLCAweDA4MGMsIDB4YWY0MywKKwkweDAwY2UsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4NzIyOCwKKwkweGFjYjAsIDB4YWJhYywgMHhkMmY0LCAweDAxMzAsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4Njg0MiwKKwkweDA4MDQsIDB4YjVmNiwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHhjODk4LCAweDAwY2UsIDB4NjgwNCwKKwkweDkwODYsIDB4MDA1MCwgMHgxMTY4LCAweDAwYzYsIDB4MmQwMCwgMHgyMDYwLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDA1MCwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDAwY2UsIDB4MDRmMCwKKwkweDY4MDAsIDB4OTA4NiwgMHgwMDBmLCAweDAxYTgsIDB4ODlmZiwgMHgwOTBjLCAweDBkZDUsIDB4NjgwMCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTkwLCAweGE4N2MsIDB4ZDBhYywgMHgwMTc4LCAweGE4NDMsIDB4MGZmZiwKKwkweGE4M2YsIDB4MGZmZiwgMHhhODgwLCAweGMwZmMsIDB4YTg4MiwgMHgyMDAxLCAweDAwMDEsIDB4NjgzMiwKKwkweDA0MDAsIDB4MjAwMSwgMHgwMDA3LCAweDY4MzIsIDB4MDBlMCwgMHhhODdjLCAweGQwYjQsIDB4MTE1MCwKKwkweGQwYWMsIDB4MGRiOCwgMHg2ODI0LCAweGQwZjQsIDB4MWQ0OCwgMHhhODM4LCAweGE5MzQsIDB4OTEwNSwKKwkweDBkODAsIDB4MGMyMCwgMHhkMmVjLCAweDFkNjgsIDB4NzAyNCwgMHg5MzA2LCAweDExMTgsIDB4NzAyMCwKKwkweDk0MDYsIDB4MGQzOCwgMHg3MDIwLCAweDY4M2UsIDB4NzAyNCwgMHg2ODNhLCAweDIwMDEsIDB4MDAwNSwKKwkweDY4MzIsIDB4MDgwYywgMHhjZmY5LCAweDA4MGMsIDB4OTc2MywgMHgwMDEwLCAweDA4MGMsIDB4YWY0MywKKwkweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwMjYsIDB4NzAwOCwKKwkweDkwODQsIDB4MDBmZiwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTEwLCAweDAwYmUsIDB4OTIwNiwKKwkweDE5MDQsIDB4YjY2MSwgMHg3MDBjLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTQsIDB4MDBiZSwKKwkweDkyMDYsIDB4MTkwNCwgMHhiNjYxLCAweDYwMzgsIDB4MjA2OCwgMHg2ODI0LCAweGMwZGMsIDB4NjgyNiwKKwkweDZhMjAsIDB4OTI4NiwgMHgwMDA3LCAweDA5MDQsIDB4YjY2MSwgMHg5Mjg2LCAweDAwMDIsIDB4MDkwNCwKKwkweGI2NjEsIDB4OTI4NiwgMHgwMDAwLCAweDA1ZTgsIDB4NjgwOCwgMHg2MzNjLCAweDkzMDYsIDB4MTVjOCwKKwkweDIwNzEsIDB4MDI2YywgMHg5MTg2LCAweDAwMTUsIDB4MDU3MCwgMHg5MThlLCAweDAwMTYsIDB4MTEwMCwKKwkweDAwYzYsIDB4NjAzOCwgMHgyMDYwLCAweDYxMDQsIDB4OTE4NiwgMHgwMDRiLCAweDAxYzAsIDB4OTE4NiwKKwkweDAwNGMsIDB4MDFhOCwgMHg5MTg2LCAweDAwNGQsIDB4MDE5MCwgMHg5MTg2LCAweDAwNGUsIDB4MDE3OCwKKwkweDkxODYsIDB4MDA1MiwgMHgwMTYwLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwKKwkweDA5MGMsIDB4MGRkNSwgMHhhODdiLCAweDAwMDMsIDB4MDA5ZSwgMHgwODBjLCAweGQzNDIsIDB4NjAwNywKKwkweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywKKwkweDk3NjMsIDB4MDBjZSwgMHgwMDMwLCAweDYwMzgsIDB4MjA3MCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwKKwkweDcwNDIsIDB4MDgwYywgMHhhZjQzLCAweDAwMmUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwOTYsIDB4MDBmNiwgMHg2MDE0LCAweDIwNDgsIDB4NjAxMCwgMHgyMDU4LCAweDkxYjYsIDB4MDAxNSwKKwkweDAxMzAsIDB4YmEwOCwgMHhiYjBjLCAweGJjMDAsIDB4YzQ4YywgMHhiYzAyLCAweDA0NjAsIDB4MDA5NiwKKwkweDAxNTYsIDB4MDAzNiwgMHgwMDI2LCAweDJiNDgsIDB4OWU5MCwgMHgwMDEwLCAweDIwMTksIDB4MDAwYSwKKwkweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweGJmMTEsIDB4MDAyZSwgMHgwMDNlLCAweDAxNWUsIDB4MDA5ZSwKKwkweDE5MDQsIDB4YjZkMCwgMHgwMDk2LCAweDAxNTYsIDB4MDAzNiwgMHgwMDI2LCAweDJiNDgsIDB4OWU5MCwKKwkweDAwMTQsIDB4MjAxOSwgMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweGJmMTEsIDB4MDAyZSwKKwkweDAwM2UsIDB4MDE1ZSwgMHgwMDllLCAweDE1YTAsIDB4NzIzOCwgMHhiYTBhLCAweDczM2MsIDB4YmIwZSwKKwkweGJjMDAsIDB4YzQ4ZCwgMHhiYzAyLCAweGE4MDQsIDB4OTAwNSwgMHgxMTI4LCAweDAwZmUsIDB4MDA5ZSwKKwkweDAwYmUsIDB4MDgwNCwgMHhiMzQ4LCAweDAwOTYsIDB4MjA0OCwgMHhhYTEyLCAweGFiMTYsIDB4YWMwYSwKKwkweDAwOWUsIDB4ODAwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAwMiwgMHgyMDA5LCAweDAwMmIsIDB4YWFhMCwgMHhhYjljLCAweGFjYTgsIDB4YWRhNCwKKwkweDIwMzEsIDB4MDAwMCwgMHgyMDQxLCAweDEyNDMsIDB4MDgwYywgMHhiNDVkLCAweDAxMzAsIDB4MDBmZSwKKwkweDAwOWUsIDB4MDgwYywgMHhhZjQzLCAweDAwYmUsIDB4MDAwNSwgMHgwODBjLCAweGI5MDUsIDB4MGNiOCwKKwkweDJiNzgsIDB4MDBmNiwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwZmUsIDB4MDBjNiwKKwkweDA4MGMsIDB4YWVlZCwgMHgyZjAwLCAweDYwMTIsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlOSwKKwkweDA4MGMsIDB4NjYxNSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwY2UsIDB4MDgwNCwKKwkweGI2YTMsIDB4MjEwMCwgMHg5MWIyLCAweDAwNTMsIDB4MWEwYywgMHgwZGQ1LCAweDkxYjIsIDB4MDA0MCwKKwkweDFhMDQsIDB4Yjc1OSwgMHgwMDAyLCAweGI3NDcsIDB4Yjc0NywgMHhiNzNkLCAweGI3NDcsIDB4Yjc0NywKKwkweGI3NDcsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwKKwkweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwKKwkweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwKKwkweGI3M2IsIDB4YjczYiwgMHhiNzQ3LCAweGI3M2IsIDB4Yjc0NywgMHhiNzQ3LCAweGI3M2IsIDB4YjczYiwKKwkweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2QsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwKKwkweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzQ3LCAweGI3NDcsIDB4YjczYiwKKwkweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwgMHhiNzNiLCAweGI3M2IsIDB4YjczYiwKKwkweGI3NDcsIDB4YjczYiwgMHhiNzNiLCAweDA4MGMsIDB4MGRkNSwgMHgwMDY2LCAweDAwYjYsIDB4NjYxMCwKKwkweDI2NTgsIDB4YjhjYywgMHhjMDhjLCAweGI4Y2UsIDB4MDBiZSwgMHgwMDZlLCAweDAwMDAsIDB4NjAwMywKKwkweDAwMDEsIDB4NjEwNiwgMHg5MTg2LCAweDAwMzIsIDB4MDExOCwgMHgwODBjLCAweDkxZjksIDB4MDAxMCwKKwkweDA4MGMsIDB4OTFiMSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDk3NjMsIDB4MDEyZSwKKwkweDAwMDUsIDB4MjYwMCwgMHgwMDAyLCAweGI3NDcsIDB4Yjc0NywgMHhiNzZkLCAweGI3NDcsIDB4Yjc0NywKKwkweGI3NmQsIDB4Yjc2ZCwgMHhiNzZkLCAweGI3NmQsIDB4Yjc0NywgMHhiNzZkLCAweGI3NDcsIDB4Yjc2ZCwKKwkweGI3NDcsIDB4Yjc2ZCwgMHhiNzZkLCAweGI3NmQsIDB4Yjc2ZCwgMHgwODBjLCAweDBkZDUsIDB4NjAwNCwKKwkweDkwYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkZDUsIDB4OTFiNiwgMHgwMDEzLCAweDA5MDQsIDB4YjgzMSwKKwkweDkxYjYsIDB4MDAyNywgMHgxOTA0LCAweGI3ZWMsIDB4MDgwYywgMHg5NjU3LCAweDYwMDQsIDB4MDgwYywKKwkweGNlN2QsIDB4MDFiMCwgMHgwODBjLCAweGNlOGUsIDB4MDFhOCwgMHg5MDhlLCAweDAwMjEsIDB4MDkwNCwKKwkweGI3ZTksIDB4OTA4ZSwgMHgwMDIyLCAweDExMzAsIDB4MDgwYywgMHhiMzc0LCAweDA5MDQsIDB4YjdlNSwKKwkweDA4MDQsIDB4YjdlNiwgMHg5MDhlLCAweDAwM2QsIDB4MDkwNCwgMHhiN2U5LCAweDA4MDQsIDB4YjdkZiwKKwkweDA4MGMsIDB4MzI0NywgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWU5LCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjlhMCwgMHgwMGJlLCAweDA4MGMsIDB4YjkwNSwgMHg5MTg2LCAweDAwN2UsIDB4MTE0OCwKKwkweDIwMDEsIDB4MTgzNywgMHgyMDE0LCAweGMyODUsIDB4MDgwYywgMHg3NDNlLCAweDExMDgsIDB4YzJhZCwKKwkweDIyMDIsIDB4MDAzNiwgMHgwMDI2LCAweDIwMTksIDB4MDAyOCwgMHgyMTEwLCAweDA4MGMsIDB4ZWFhMywKKwkweDAwMmUsIDB4MDAzZSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMTEwLCAweDIwMTksIDB4MDAyOCwKKwkweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MjI5LCAweDYwMTAsIDB4MDBiNiwKKwkweDkwNWQsIDB4MDEwMCwgMHgwMGJlLCAweDJjMDgsIDB4MDgwYywgMHhlNDc3LCAweDAwN2UsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAxZSwgMHgwODBjLCAweGQzOWQsIDB4MDAxNiwgMHgwODBjLCAweGQwZmEsIDB4MDgwYywKKwkweGFmNDMsIDB4MDAxZSwgMHgwODBjLCAweDMzMWEsIDB4MDgwYywgMHg5NzYzLCAweDAwMzAsIDB4MDgwYywKKwkweGQwZmEsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsIDB4YjkwNSwKKwkweDBjYjAsIDB4MDgwYywgMHhiOTQxLCAweDBjOTgsIDB4OTE4NiwgMHgwMDE0LCAweDFkYjAsIDB4MDgwYywKKwkweDk2NTcsIDB4NjAwNCwgMHg5MDhlLCAweDAwMjIsIDB4MTExOCwgMHgwODBjLCAweGIzNzQsIDB4MGQ2OCwKKwkweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGQzOWQsIDB4MDgwYywgMHhjZTdkLCAweDExOTAsIDB4MDgwYywKKwkweDMyNDcsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjlhMCwgMHgwMGJlLCAweDA4MGMsIDB4YjkwNSwKKwkweDkxODYsIDB4MDA3ZSwgMHgxMTI4LCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLCAweGMxODUsIDB4MjEwMiwKKwkweDA4NzAsIDB4MDgwYywgMHhjZThlLCAweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDA4NDAsIDB4NjAwNCwKKwkweDkwOGUsIDB4MDAzMiwgMHgxMTYwLCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4OWUsIDB4MjA3OSwKKwkweDAwMDAsIDB4MDgwYywgMHgzNWI1LCAweDAwZmUsIDB4MDBlZSwgMHgwODA0LCAweGI3ZGYsIDB4NjAwNCwKKwkweDkwOGUsIDB4MDAyMSwgMHgwZDQ4LCAweDkwOGUsIDB4MDAyMiwgMHgwOTBjLCAweGI5MDUsIDB4MDgwNCwKKwkweGI3ZGYsIDB4OTBiMiwgMHgwMDQwLCAweDFhMDQsIDB4YjhlMSwgMHgyMDA4LCAweDAwMDIsIDB4Yjg3OSwKKwkweGI4N2EsIDB4Yjg3ZCwgMHhiODgwLCAweGI4ODMsIDB4Yjg4NiwgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywKKwkweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywKKwkweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywKKwkweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODg5LCAweGI4OTYsIDB4Yjg3NywKKwkweGI4OTgsIDB4Yjg5NiwgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg5NiwKKwkweGI4OTYsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywKKwkweGI4NzcsIDB4YjhjOCwgMHhiODk2LCAweGI4NzcsIDB4Yjg5MiwgMHhiODc3LCAweGI4NzcsIDB4Yjg3NywKKwkweGI4OTMsIDB4Yjg3NywgMHhiODc3LCAweGI4NzcsIDB4Yjg5NiwgMHhiOGJmLCAweGI4NzcsIDB4MDgwYywKKwkweDBkZDUsIDB4MDBlMCwgMHgyMDAxLCAweDAwMGIsIDB4MDQyMCwgMHgyMDAxLCAweDAwMDMsIDB4MDQwOCwKKwkweDIwMDEsIDB4MDAwNSwgMHgwMGYwLCAweDIwMDEsIDB4MDAwMSwgMHgwMGQ4LCAweDIwMDEsIDB4MDAwOSwKKwkweDAwYzAsIDB4MDgwYywgMHg5NjU3LCAweDYwMDMsIDB4MDAwNSwgMHgwODBjLCAweGQzYTAsIDB4MDgwYywKKwkweDk3NjMsIDB4MDA3MCwgMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg2NWU5LCAweDA4MDQsIDB4YjhkOSwKKwkweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweGQzYTAsIDB4NjAwMywgMHgwMDA0LCAweDA4MGMsIDB4OTc2MywKKwkweDAwMDUsIDB4MDgwYywgMHg2NWU5LCAweDA4MGMsIDB4OTY1NywgMHg2MDAzLCAweDAwMDIsIDB4MDAzNiwKKwkweDIwMTksIDB4MTg1MiwgMHgyMzA0LCAweDkwODQsIDB4ZmYwMCwgMHgxMTIwLCAweDIwMDEsIDB4MTk4NSwKKwkweDIwMWMsIDB4MDA0MCwgMHg4MDA3LCAweDkwOWEsIDB4MDAwNCwgMHgwZWMwLCAweDgwMDMsIDB4ODAxYiwKKwkweDgzMWIsIDB4OTMxOCwgMHg2MzFhLCAweDAwM2UsIDB4MDgwYywgMHg5NzYzLCAweDBjMDgsIDB4MDgwYywKKwkweDk2NTcsIDB4MDgwYywgMHhkMGZhLCAweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsIDB4MDhjMCwKKwkweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4OWUsIDB4MjA3OSwgMHgwMDAwLCAweDA4MGMsIDB4MzViNSwKKwkweDAwZmUsIDB4MDBlZSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTc2MywKKwkweDA4MzgsIDB4MDgwYywgMHg5NjU3LCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLCAweGQzYTAsIDB4MDgwNCwKKwkweDk3NjMsIDB4MjYwMCwgMHgyMDA4LCAweDAwMDIsIDB4YjhmOCwgMHhiOGQ5LCAweGI4ZjYsIDB4YjhkOSwKKwkweGI4ZDksIDB4YjhmNiwgMHhiOGY2LCAweGI4ZjYsIDB4YjhmNiwgMHhiOGQ5LCAweGI4ZjYsIDB4YjhkOSwKKwkweGI4ZjYsIDB4YjhkOSwgMHhiOGY2LCAweGI4ZjYsIDB4YjhmNiwgMHhiOGY2LCAweDA4MGMsIDB4MGRkNSwKKwkweDA4MGMsIDB4OTY1NywgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgwMGU2LCAweDAwOTYsIDB4MDAyNiwKKwkweDAwMTYsIDB4MDgwYywgMHhjYzg2LCAweDA1NjgsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NiwKKwkweDAxMzksIDB4MTFhOCwgMHhhODk0LCAweDkwODYsIDB4MDA1NiwgMHgxMTQ4LCAweDA4MGMsIDB4NTRmNywKKwkweDAxMzAsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDAwLCAweDAwMjgsIDB4MjAwMSwKKwkweDAwMzAsIDB4OTAwZSwgMHgyMDExLCAweDQwMDUsIDB4MDgwYywgMHhkMjY3LCAweDAwOTAsIDB4YTg2OCwKKwkweGQwZmMsIDB4MDE3OCwgMHhhODA3LCAweDAwMDAsIDB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAyMSwKKwkweDAxNjgsIDB4OTA4ZSwgMHgwMDNkLCAweDAxNTAsIDB4MDAxZSwgMHhhODY3LCAweDAxMDMsIDB4YTgzMywKKwkweDAxMDAsIDB4MDAxZSwgMHgwMDJlLCAweDAwOWUsIDB4MDBlZSwgMHgwMDA1LCAweDAwMWUsIDB4MDAwOSwKKwkweDBjYzAsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4YTgwMCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywKKwkweGE4MjMsIDB4ODAwMSwgMHgwMDllLCAweDAwMDUsIDB4MDBiNiwgMHg2NjEwLCAweDI2NTgsIDB4YjgwNCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MGIyLCAweDAwMGMsIDB4MWEwYywgMHgwZGQ1LCAweDY2MDQsIDB4OTZiNiwKKwkweDAwNGQsIDB4MTEyMCwgMHgwODBjLCAweGQxODYsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwNDMsIDB4MTEyMCwgMHgwODBjLCAweGQxY2YsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwNGIsIDB4MTEyMCwgMHgwODBjLCAweGQxZmIsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwMzMsIDB4MTEyMCwgMHgwODBjLCAweGQxMWMsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwMjgsIDB4MTEyMCwgMHgwODBjLCAweGNlY2MsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwMjksIDB4MTEyMCwgMHgwODBjLCAweGNmMGQsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwMWYsIDB4MTEyMCwgMHgwODBjLCAweGIzMWMsIDB4MDgwNCwgMHhiOWQxLCAweDY2MDQsIDB4OTZiNiwKKwkweDAwMDAsIDB4MTExOCwgMHgwODBjLCAweGI2NjcsIDB4MDRlMCwgMHg2NjA0LCAweDk2YjYsIDB4MDAyMiwKKwkweDExMTgsIDB4MDgwYywgMHhiMzU1LCAweDA0YTgsIDB4NjYwNCwgMHg5NmI2LCAweDAwMzUsIDB4MTExOCwKKwkweDA4MGMsIDB4YjQ3YiwgMHgwNDcwLCAweDY2MDQsIDB4OTZiNiwgMHgwMDM5LCAweDExMTgsIDB4MDgwYywKKwkweGI1ZmMsIDB4MDQzOCwgMHg2NjA0LCAweDk2YjYsIDB4MDAzZCwgMHgxMTE4LCAweDA4MGMsIDB4YjM4ZCwKKwkweDA0MDAsIDB4NjYwNCwgMHg5NmI2LCAweDAwNDQsIDB4MTExOCwgMHgwODBjLCAweGIzYzksIDB4MDBjOCwKKwkweDY2MDQsIDB4OTZiNiwgMHgwMDQ5LCAweDExMTgsIDB4MDgwYywgMHhiNDBhLCAweDAwOTAsIDB4NjYwNCwKKwkweDk2YjYsIDB4MDA0MSwgMHgxMTE4LCAweDA4MGMsIDB4YjNmNCwgMHgwMDU4LCAweDkxYjYsIDB4MDAxNSwKKwkweDExMTAsIDB4MDA2MywgMHgwMDMwLCAweDkxYjYsIDB4MDAxNiwgMHgxMTI4LCAweDAwYmUsIDB4MDgwNCwKKwkweGJjMmQsIDB4MDBiZSwgMHgwMDA1LCAweDA4MGMsIDB4YWZkOSwgMHgwY2Q4LCAweGI5ZWUsIDB4YjlmMSwKKwkweGI5ZWUsIDB4YmEzOCwgMHhiOWVlLCAweGJiYTEsIDB4YmMzYSwgMHhiOWVlLCAweGI5ZWUsIDB4YmMwMywKKwkweGI5ZWUsIDB4YmMxOSwgMHgwMDk2LCAweDYwMWYsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4YTgwMCwKKwkweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDAwOWUsIDB4MDgwNCwgMHhhZjQzLCAweGEwMDEsIDB4YTAwMSwKKwkweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4NzA5MCwgMHg5MDg2LCAweDAwNzQsIDB4MTU0MCwKKwkweDA4MGMsIDB4ZTQ0OCwgMHgxMWIwLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweDcwMzAsIDB4ZDA4YywKKwkweDAxMjgsIDB4YjgwMCwgMHhkMGJjLCAweDAxMTAsIDB4YzBjNSwgMHhiODAyLCAweDAwZjksIDB4MDBiZSwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTksIDB4MDgwYywgMHgzMjQ3LCAweDA4MGMsIDB4YWY0MywKKwkweDAwOTgsIDB4MjAwMSwgMHgwMDBhLCAweDA4MGMsIDB4NjVlOSwgMHgwODBjLCAweDMyNDcsIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsIDB4MDAyMCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweGJiNzEsIDB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4YjgwMCwKKwkweGQwODQsIDB4MDE2MCwgMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwgMHgyMDY5LCAweDE4NDcsIDB4NjgwNCwKKwkweGQwYTQsIDB4MDEyMCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2NjE1LCAweDAwZGUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDA5NiwgMHgwMGQ2LCAweDIwMTEsIDB4MTgyNCwgMHgyMjA0LCAweDkwODYsIDB4MDA3NCwKKwkweDE5MDQsIDB4YmI0NiwgMHg2MDEwLCAweDIwNTgsIDB4YmFhMCwgMHg5Mjg2LCAweDAwN2UsIDB4MTEyMCwKKwkweDA4MGMsIDB4YmQ4NywgMHgwODA0LCAweGJhYWEsIDB4MDgwYywgMHhiZDdjLCAweDYwMTAsIDB4MjA1OCwKKwkweGJhYTAsIDB4OTI4NiwgMHgwMDgwLCAweDE1MTAsIDB4NjAxNCwgMHg5MDA1LCAweDAxYTgsIDB4MjA0OCwKKwkweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAzOSwgMHgxMTQwLCAweDIwMDEsIDB4MDAwMCwKKwkweDkwMGUsIDB4MjAxMSwgMHg0MDAwLCAweDA4MGMsIDB4ZDI2NywgMHgwMDMwLCAweGE4MDcsIDB4MDAwMCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODMzLCAweDAyMDAsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjVlOSwKKwkweDA4MGMsIDB4MzI0NywgMHgwODBjLCAweGFmNDMsIDB4MDgwNCwgMHhiYjRiLCAweDA4MGMsIDB4YmI1OSwKKwkweDYwMTQsIDB4OTAwNSwgMHgwMTkwLCAweDIwNDgsIDB4YTg2OCwgMHhkMGY0LCAweDAxZTgsIDB4YTg2NCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMzksIDB4MWQwOCwgMHgyMDAxLCAweDAwMDAsIDB4OTAwZSwKKwkweDIwMTEsIDB4NDAwMCwgMHgwODBjLCAweGQyNjcsIDB4MDhmOCwgMHgwODBjLCAweGJiNGYsIDB4MDE2MCwKKwkweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDY2MTUsIDB4MjAwMSwKKwkweDAwMDcsIDB4MDgwYywgMHg2NWU5LCAweDA4YTAsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjVlOSwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDMsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywKKwkweDA4MDQsIDB4YmI0YiwgMHhiODVjLCAweGQwZTQsIDB4MDFkOCwgMHgwODBjLCAweGQwOWMsIDB4MDgwYywKKwkweDc0M2UsIDB4MDExOCwgMHhkMGRjLCAweDE5MDQsIDB4YmE2YywgMHgyMDExLCAweDE4MzcsIDB4MjIwNCwKKwkweGMwYWQsIDB4MjAxMiwgMHgyMDAxLCAweDE5NmMsIDB4MjAwNCwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwKKwkweDc4ZTMsIDB4MDAwMCwgMHgwODBjLCAweDI4ZjAsIDB4NzhlMiwgMHgwMGZlLCAweDA4MDQsIDB4YmE2YywKKwkweDA4MGMsIDB4ZDBkOSwgMHgyMDExLCAweDE4MzcsIDB4MjIwNCwgMHhjMGE1LCAweDIwMTIsIDB4MDAwNiwKKwkweDA4MGMsIDB4ZTVjZCwgMHgwMDBlLCAweDE5MDQsIDB4YmE2YywgMHhjMGI1LCAweDIwMTIsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDgwYywgMHg2NWU5LCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDAwYzYsIDB4MjAwMSwKKwkweDE4MGYsIDB4MjAwNCwgMHhkMDljLCAweDA1MjAsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDBlNiwKKwkweDIwNzEsIDB4MTgwMCwgMHg3MDBjLCAweDkwODQsIDB4MDBmZiwgMHg3OGU2LCAweDcwN2UsIDB4NzAxMCwKKwkweDc4ZWEsIDB4NzA4MiwgMHg5MDhjLCAweDAwZmYsIDB4MDBlZSwgMHg3ODBjLCAweGMwYjUsIDB4NzgwZSwKKwkweDAwZmUsIDB4MDgwYywgMHgyOGM1LCAweDAwZjYsIDB4MjEwMCwgMHg5MDBlLCAweDA4MGMsIDB4Mjg3YywKKwkweDc5NWUsIDB4MDBmZSwgMHg5MTg2LCAweDAwODEsIDB4MDFkOCwgMHgyMDA5LCAweDAwODEsIDB4MDBjOCwKKwkweDIwMDksIDB4MDBlZiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OWVhLCAweDc5MzIsIDB4NzkzNiwKKwkweDc4MGMsIDB4YzBiNSwgMHg3ODBlLCAweDAwZmUsIDB4MDgwYywgMHgyOGM1LCAweDAwZjYsIDB4MjA3OSwKKwkweDE4MDAsIDB4Nzk4MiwgMHgyMTAwLCAweDkwMGUsIDB4MDgwYywgMHgyODdjLCAweDc5NWUsIDB4MDBmZSwKKwkweDgxMDgsIDB4MDgwYywgMHg2NjM4LCAweDJiMDAsIDB4MDBjZSwgMHgxOTA0LCAweGJhNmMsIDB4NjAxMiwKKwkweDIwMDksIDB4MTgwZiwgMHgyMTBjLCAweGQxOWMsIDB4MDE1MCwgMHgyMDA5LCAweDAyN2MsIDB4MjEwYywKKwkweDkxOGMsIDB4MDBmZiwgMHhiOTEyLCAweDIwMDksIDB4MDI3ZCwgMHgyMTBjLCAweGI5MTYsIDB4MjAwMSwKKwkweDAwMDIsIDB4MDgwYywgMHg2NWU5LCAweDYwMjMsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDIsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwMDI4LCAweDA4MGMsIDB4YjkwNSwKKwkweDIwMDEsIDB4MDAwMSwgMHgwNDMxLCAweDAwZGUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MTAsIDB4MjAwNCwgMHhkMGE0LCAweDAxMjAsIDB4MjAwMSwgMHgxODQ4LCAweDIwMDQsIDB4ZDBhYywKKwkweDAwMDUsIDB4MDBlNiwgMHgwODBjLCAweGVhZmMsIDB4MDE5MCwgMHgyMDcxLCAweDAyNjAsIDB4NzEwOCwKKwkweDcyMGMsIDB4OTE4YywgMHgwMGZmLCAweDExMTgsIDB4OTI4NCwgMHhmZjAwLCAweDAxNDAsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTExMCwgMHhiOTEyLCAweGJhMTYsIDB4MDBlZSwKKwkweDAwMDUsIDB4MjAzMCwgMHg5MDA1LCAweDAxNTgsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlOSwKKwkweDA4MGMsIDB4NTc3MSwgMHgxMTIwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY2MTUsIDB4MjYwMCwKKwkweDkwMDUsIDB4MTFiMCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODY4LCAweDAwOWUsIDB4ZDBmYywKKwkweDExNzgsIDB4MDAzNiwgMHgwMDQ2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJiYTAsIDB4MDBiZSwKKwkweDIwMjEsIDB4MDAwNCwgMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHg0YjdmLCAweDAwNGUsIDB4MDAzZSwKKwkweDA4MGMsIDB4MzI0NywgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwgMHgxMTA4LCAweDAwMDUsIDB4MDgwNCwKKwkweGFmNDMsIDB4MDBiNiwgMHgwMGU2LCAweDAwMjYsIDB4MDAxNiwgMHgyMDcxLCAweDE4MDAsIDB4NzA5MCwKKwkweDkwODYsIDB4MDAxNCwgMHgxOTA0LCAweGJiZjksIDB4MDgwYywgMHg1NzcxLCAweDExNzAsIDB4NjAxNCwKKwkweDkwMDUsIDB4MTE1OCwgMHgwMDM2LCAweDAwNDYsIDB4NjAxMCwgMHgyMDU4LCAweGJiYTAsIDB4MjAyMSwKKwkweDAwMDYsIDB4MDgwYywgMHg0ZDM2LCAweDAwNGUsIDB4MDAzZSwgMHgwMGQ2LCAweDYwMTAsIDB4MjA1OCwKKwkweDA4MGMsIDB4NjczNCwgMHgwODBjLCAweGJhMjYsIDB4MDBkZSwgMHgwODBjLCAweGJlNGQsIDB4MTU4OCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiODkwLCAweDkwMDUsIDB4MDU2MCwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywKKwkweDY1ZTksIDB4MDA5NiwgMHg2MDE0LCAweDkwNGQsIDB4MDFkMCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAzOSwgMHgxMTQwLCAweDIwMDEsIDB4MDAwMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwKKwkweDA4MGMsIDB4ZDI2NywgMHgwMDYwLCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAyOSwKKwkweDAxMzAsIDB4YTgwNywgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywgMHhhODMzLCAweDAyMDAsIDB4MDA5ZSwKKwkweDA4MGMsIDB4MzI0NywgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwgMHgwMTQwLCAweDA4MGMsIDB4YWY0MywKKwkweDAwMjgsIDB4MDgwYywgMHhiOTA1LCAweDkwMDYsIDB4MDgwYywgMHhiYjcxLCAweDAwMWUsIDB4MDAyZSwKKwkweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMTEsIDB4MTgyNCwgMHgyMjA0LCAweDkwODYsIDB4MDAxNCwKKwkweDExNjAsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MDQsIDB4OTc2MywgMHgyMDAxLCAweDAwMDEsIDB4MDgwNCwKKwkweGJiNzEsIDB4MjAzMCwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwMDQsIDB4MTE0OCwKKwkweDk2YjYsIDB4MDAwYiwgMHgxMTIwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTksIDB4MDgwNCwKKwkweGFmNDMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MDQsIDB4YmI3MSwgMHgwMDAyLCAweGI5ZWUsIDB4YmM0NSwKKwkweGI5ZWUsIDB4YmM4NiwgMHhiOWVlLCAweGJkMzMsIDB4YmMzYSwgMHhiOWVlLCAweGI5ZWUsIDB4YmQ0NywKKwkweGI5ZWUsIDB4YmQ1OSwgMHg2NjA0LCAweDk2ODYsIDB4MDAwMywgMHgwOTA0LCAweGJiYTEsIDB4OTZiNiwKKwkweDAwMWUsIDB4MTExMCwgMHgwODBjLCAweGFmNDMsIDB4MDAwNSwgMHgwMGI2LCAweDAwZDYsIDB4MDBjNiwKKwkweDA4MGMsIDB4YmQ2YiwgMHgxMWEwLCAweDkwMDYsIDB4MDgwYywgMHg2NWQ1LCAweDA4MGMsIDB4MzIxZSwKKwkweDA4MGMsIDB4ZDM5ZCwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWU5LCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDA0MTgsIDB4MjAwOSwKKwkweDAyNmUsIDB4MjEwNCwgMHg5MDg2LCAweDAwMDksIDB4MTE2MCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg0MCwKKwkweDkwODQsIDB4MDBmZiwgMHg5MDA1LCAweDAxNzAsIDB4ODAwMSwgMHhiODQyLCAweDYwMWIsIDB4MDAwYSwKKwkweDAwODgsIDB4MjAwOSwgMHgwMjZmLCAweDIxMDQsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MTkwMCwKKwkweDExMDgsIDB4MDhhMCwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4YmI3MSwgMHgwMGNlLCAweDAwZGUsIDB4MDBiZSwgMHgwMDA1LCAweDAwOTYsIDB4MDBiNiwKKwkweDAwMjYsIDB4OTAxNiwgMHgwODBjLCAweGJkNzksIDB4MDBkNiwgMHgyMDY5LCAweDE5N2IsIDB4MmQwNCwKKwkweDkwMDUsIDB4MDE2OCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTEzOCwKKwkweDIwNjksIDB4MTgyMCwgMHgyZDA0LCAweDgwMDAsIDB4MjA2YSwgMHgwMGRlLCAweDAwMTAsIDB4MDBkZSwKKwkweDAwODgsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlOSwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywKKwkweDA4MDQsIDB4YmQwMywgMHgwODBjLCAweGNjODYsIDB4MDFiMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NCwKKwkweDIwMTAsIDB4OTA4NiwgMHgwMTM5LCAweDExMzgsIDB4NjAwNywgMHgwMDE2LCAweDIwMDEsIDB4MDAwMiwKKwkweDA4MGMsIDB4ZDJjMSwgMHgwMGIwLCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweGQwZmMsIDB4MDExOCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwY2E4LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwZGMsIDB4MDE0OCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiODQwLCAweDkwODQsIDB4MDBmZiwgMHg5MDA1LCAweDExMTAsIDB4OTAwNiwKKwkweDBjMzgsIDB4MDgwYywgMHhiOTA1LCAweDIwMDksIDB4MDI2ZSwgMHgyMTM0LCAweDk2YjQsIDB4MDBmZiwKKwkweDk2ODYsIDB4MDAwNSwgMHgwNTIwLCAweDk2ODYsIDB4MDAwYiwgMHgwMWM4LCAweDIwMDksIDB4MDI2ZiwKKwkweDIxMDQsIDB4OTA4NCwgMHhmZjAwLCAweDExMTgsIDB4OTY4NiwgMHgwMDA5LCAweDAxYzAsIDB4OTA4NiwKKwkweDE5MDAsIDB4MTE2OCwgMHg5Njg2LCAweDAwMDksIDB4MDE5MCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywKKwkweDY1ZTksIDB4MjAwMSwgMHgwMDI4LCAweDYwMWEsIDB4NjAwNywgMHgwMDUyLCAweDAwMjAsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHhiYjcxLCAweDAwMmUsIDB4MDBiZSwgMHgwMDllLCAweDAwMDUsIDB4OTI4NiwKKwkweDAxMzksIDB4MDE2MCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxNDAsIDB4YTg2NCwKKwkweDkwODYsIDB4MDEzOSwgMHgwMTE4LCAweGE4NjgsIDB4ZDBmYywgMHgwMTA4LCAweDBjNDAsIDB4NjAxMCwKKwkweDIwNTgsIDB4Yjg0MCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwgMHgwMTM4LCAweDgwMDEsIDB4Yjg0MiwKKwkweDYwMWIsIDB4MDAwYSwgMHg2MDA3LCAweDAwMTYsIDB4MDhmMCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwKKwkweDExMzgsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywgMHg2MDQwLCAweDAwZWUsIDB4MDAxMCwKKwkweDA4MGMsIDB4MzIxZSwgMHgwODYwLCAweDA4MGMsIDB4YmQ3OSwgMHgxMTYwLCAweDIwMDEsIDB4MDAwNCwKKwkweDA4MGMsIDB4NjVlOSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4OTFmOSwKKwkweDA4MDQsIDB4OTc2MywgMHgwODBjLCAweGI5MDUsIDB4OTAwNiwgMHgwODA0LCAweGJiNzEsIDB4MDQ4OSwKKwkweDExNjAsIDB4MjAwMSwgMHgwMDA4LCAweDA4MGMsIDB4NjVlOSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMDUsIDB4MDgwYywgMHg5MWY5LCAweDA4MDQsIDB4OTc2MywgMHgyMDAxLCAweDAwMDEsIDB4MDgwNCwKKwkweGJiNzEsIDB4MDBmOSwgMHgxMTYwLCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDY1ZTksIDB4NjAwMywKKwkweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwODA0LCAweDk3NjMsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwNCwgMHhiYjcxLCAweDIwMDksIDB4MDI2ZSwgMHgyMTA0LCAweDkwODYsIDB4MDAwMywKKwkweDExMzgsIDB4MjAwOSwgMHgwMjZmLCAweDIxMDQsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MmEwMCwKKwkweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwMTYsIDB4NjExMCwKKwkweDIxNTgsIDB4MDgwYywgMHg2NmE4LCAweDAwMWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDAxNiwgMHg2MDEwLCAweDIwNTgsIDB4MjAwOSwKKwkweDE4MzcsIDB4MjEwNCwgMHg5MDg1LCAweDAwMDMsIDB4MjAwYSwgMHgwODBjLCAweGJlMWYsIDB4MDU2MCwKKwkweDIwMDksIDB4MTgzNywgMHgyMTA0LCAweGMwY2QsIDB4MjAwYSwgMHgwODBjLCAweDZhMDgsIDB4MDE1OCwKKwkweDkwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwYywgMHhlNzNhLCAweDIwMDEsIDB4MTgwYywKKwkweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksIDB4MDAyYSwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywKKwkweDMxZTksIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywgMHgyZmY1LCAweDAwZWUsIDB4MDBjNiwKKwkweDAxNTYsIDB4MjBhOSwgMHgwNzgxLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLCAweDMzMWEsIDB4ODEwOCwKKwkweDFmMDQsIDB4YmRiZCwgMHgwMTVlLCAweDAwY2UsIDB4MDgwYywgMHhiZDdjLCAweDIwNzEsIDB4MDI2MCwKKwkweDIwNzksIDB4MDIwMCwgMHg3ODE3LCAweDAwMDEsIDB4MjAwMSwgMHgxODM3LCAweDIwMGMsIDB4YzFjNSwKKwkweDcwMTgsIDB4ZDBmYywgMHgwMTEwLCAweGQwZGMsIDB4MDExOCwgMHg3MDM4LCAweGQwZGMsIDB4MTEwOCwKKwkweGMxYzQsIDB4NzgxNywgMHgwMDAwLCAweDIwMDEsIDB4MTgzNywgMHgyMTAyLCAweDIwNzksIDB4MDEwMCwKKwkweDJlMDQsIDB4OTA4NCwgMHgwMGZmLCAweDIwNjksIDB4MTgxZiwgMHgyMDZhLCAweDc4ZTYsIDB4MDAwNiwKKwkweDhlNzAsIDB4MmUwNCwgMHgyMDY5LCAweDE4MjAsIDB4MjA2YSwgMHg3OGVhLCAweDc4MzIsIDB4NzgzNiwKKwkweDIwMTAsIDB4OTA4NCwgMHhmZjAwLCAweDAwMWUsIDB4OTEwNSwgMHgyMDA5LCAweDE4MmMsIDB4MjAwYSwKKwkweDIyMDAsIDB4OTA4NCwgMHgwMGZmLCAweDIwMDgsIDB4MDgwYywgMHgyOGM1LCAweDA4MGMsIDB4NzQzZSwKKwkweDAxNzAsIDB4MjA3MSwgMHgwMjYwLCAweDIwNjksIDB4MTk4MSwgMHg3MDQ4LCAweDIwNmEsIDB4NzA0YywKKwkweDY4MDYsIDB4NzA1MCwgMHg2ODBhLCAweDcwNTQsIDB4NjgwZSwgMHgwODBjLCAweGQwOWMsIDB4MDA0MCwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTksIDB4MDgwYywgMHgzMjQ3LCAweDA4MGMsIDB4YWY0MywKKwkweDAwMWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDA5NiwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMGU2LCAweDAxNTYsIDB4MjAxOSwgMHgxODJjLCAweDIzMWMsIDB4ODNmZiwKKwkweDAxZjAsIDB4MjA3MSwgMHgwMjYwLCAweDcyMDAsIDB4OTI5NCwgMHgwMGZmLCAweDcwMDQsIDB4OTA4NCwKKwkweGZmMDAsIDB4OTIwNSwgMHg5MzA2LCAweDExOTgsIDB4MjAxMSwgMHgwMjc2LCAweDIwYTksIDB4MDAwNCwKKwkweDJiNDgsIDB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YmYxMSwgMHgxMTQ4LCAweDIwMTEsIDB4MDI3YSwKKwkweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiZjExLCAweDExMDAsIDB4MDE1ZSwKKwkweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwKKwkweDcwMzQsIDB4OTA4NiwgMHgwMDE0LCAweDExYTgsIDB4NzAzOCwgMHg5MDg2LCAweDA4MDAsIDB4MTE4OCwKKwkweDcwM2MsIDB4ZDBlYywgMHgwMTYwLCAweDkwODQsIDB4MGYwMCwgMHg5MDg2LCAweDAxMDAsIDB4MTEzOCwKKwkweDcwNTQsIDB4ZDBhNCwgMHgxMTEwLCAweGQwYWMsIDB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDA5NiwgMHgwMGM2LCAweDAwNzYsIDB4MDA1NiwKKwkweDAwNDYsIDB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4MTllZiwKKwkweDI1MmMsIDB4MjAyMSwgMHgxOWY1LCAweDI0MjQsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzEsIDB4MTgwMCwKKwkweDcyNTQsIDB4NzA3NCwgMHg5MjAyLCAweDFhMDQsIDB4YmVkZCwgMHgwODBjLCAweDhhM2QsIDB4MDkwNCwKKwkweGJlZDYsIDB4MDgwYywgMHhlNzZiLCAweDA5MDQsIDB4YmVkNiwgMHg2NzIwLCAweDk3ODYsIDB4MDAwNywKKwkweDA5MDQsIDB4YmVkNiwgMHgyNTAwLCAweDljMDYsIDB4MDkwNCwgMHhiZWQ2LCAweDI0MDAsIDB4OWMwNiwKKwkweDA1ZTgsIDB4M2UwOCwgMHg5MTg2LCAweDAwMDIsIDB4MTE0OCwgMHg2MDEwLCAweDkwMDUsIDB4MDEzMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxNTgwLCAweDAwYzYsIDB4NjAwMCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTEwLCAweDA4MGMsIDB4MWFhMSwgMHg5Nzg2LCAweDAwMGEsIDB4MDE0OCwKKwkweDA4MGMsIDB4Y2U4ZSwgMHgxMTMwLCAweDAwY2UsIDB4MDgwYywgMHhiOTA1LCAweDA4MGMsIDB4YWY3NCwKKwkweDAwZTgsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMWE4LCAweDk3ODYsIDB4MDAwMywKKwkweDE1MzAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2MsIDB4ZDBjYywgMHgwMTMwLCAweDAwOTYsIDB4YTg3OCwKKwkweDIwNDgsIDB4MDgwYywgMHgwZmIxLCAweDAwOWUsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkMGIsIDB4MDgwYywgMHhjZTcxLCAweDA4MGMsIDB4YWY3NCwgMHgwMGNlLCAweDljZTAsIDB4MDAxOCwKKwkweDcwNjgsIDB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4YmU4MCwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwKKwkweDAwNGUsIDB4MDA1ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMGVlLCAweDAwMDUsIDB4OTc4NiwKKwkweDAwMDYsIDB4MTExOCwgMHgwODBjLCAweGU2ZGQsIDB4MGMzMCwgMHg5Nzg2LCAweDAwMDksIDB4MTE0OCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDBkMDgsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4YWZiZSwKKwkweDA4ZTAsIDB4OTc4NiwgMHgwMDBhLCAweDA5ODAsIDB4MDgyMCwgMHgyMjBjLCAweDIzMDQsIDB4OTEwNiwKKwkweDExMzAsIDB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4YmVmZCwgMHg5MDA2LCAweDAwMDUsIDB4MjMwNCwKKwkweDkxMDIsIDB4MDIxOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDkxOGQsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDEzNiwgMHgwMWM2LCAweDAwMTYsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA4YywKKwkweDAwM2YsIDB4MjFlMCwgMHg5MDg0LCAweGZmYzAsIDB4OTMwMCwgMHgyMDk4LCAweDM1MTgsIDB4MjBhOSwKKwkweDAwMDEsIDB4MjIwYywgMHg0MDAyLCAweDkxMGUsIDB4MTE0MCwgMHg4MjEwLCAweDgzMTksIDB4MWRjOCwKKwkweDkwMDYsIDB4MDAxZSwgMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwgMHgyMjBjLCAweDkxMDIsIDB4MDIxOCwKKwkweDIwMDEsIDB4MDAwMSwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMCwgMHg5MThkLCAweDAwMDEsIDB4MDAxZSwKKwkweDAxY2UsIDB4MDEzZSwgMHgwMDA1LCAweDIyMGMsIDB4ODEwZiwgMHgyMzA0LCAweDkxMDYsIDB4MTEzMCwKKwkweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweGJmM2IsIDB4OTAwNiwgMHgwMDA1LCAweDkxOGQsIDB4MDAwMSwKKwkweDAwMDUsIDB4NjAwNCwgMHg5MDhhLCAweDAwNTMsIDB4MWEwYywgMHgwZGQ1LCAweDA4MGMsIDB4Y2U3ZCwKKwkweDAxMjAsIDB4MDgwYywgMHhjZThlLCAweDAxNjgsIDB4MDAyOCwgMHgwODBjLCAweDMyNDcsIDB4MDgwYywKKwkweGNlOGUsIDB4MDEzOCwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTc2MywKKwkweDAwMDUsIDB4MDgwYywgMHhiOTA1LCAweDBjYjAsIDB4OTE4MiwgMHgwMDU0LCAweDEyMjAsIDB4OTE4MiwKKwkweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YmY4MCwgMHhiZjgwLCAweGJmODAsIDB4YmY4MCwKKwkweGJmODAsIDB4YmY4MCwgMHhiZjgwLCAweGJmODAsIDB4YmY4MCwgMHhiZjgwLCAweGJmODAsIDB4YmY4MiwKKwkweGJmODIsIDB4YmY4MiwgMHhiZjgyLCAweGJmODAsIDB4YmY4MCwgMHhiZjgwLCAweGJmODIsIDB4YmY4MCwKKwkweDA4MGMsIDB4MGRkNSwgMHg2MDBiLCAweGZmZmYsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywKKwkweDkxYjEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NzYzLCAweDAxMmUsIDB4MDAwNSwKKwkweDkxODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4OTA4MiwgMHgwMDQwLCAweDA4MDQsIDB4YzAzNywKKwkweDkxODYsIDB4MDAyNywgMHgxNTIwLCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDMyMWUsIDB4MDgwYywKKwkweGQzOWQsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxOTgsIDB4MDgwYywKKwkweGNlOGUsIDB4MTExOCwgMHgwODBjLCAweGI5MDUsIDB4MDA2OCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwKKwkweDAwMjksIDB4YTg3NywgMHgwMDAwLCAweGE5N2MsIDB4YzFjNSwgMHhhOTdlLCAweDA4MGMsIDB4NmQxNywKKwkweDA4MGMsIDB4Y2U3MSwgMHgwMDllLCAweDA4MGMsIDB4YWY0MywgMHgwODA0LCAweDk3NjMsIDB4OTE4NiwKKwkweDAwMTQsIDB4MTEyMCwgMHg2MDA0LCAweDkwODIsIDB4MDA0MCwgMHgwNGEwLCAweDkxODYsIDB4MDA0NiwKKwkweDAxNTAsIDB4OTE4NiwgMHgwMDQ1LCAweDAxMzgsIDB4OTE4NiwgMHgwMDUzLCAweDAxMjAsIDB4OTE4NiwKKwkweDAwNDgsIDB4MTkwYywgMHgwZGQ1LCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwODQsIDB4MDUwOCwKKwkweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBmNiwKKwkweDAwZTYsIDB4MDBjNiwgMHgyMDc5LCAweDE5ZTYsIDB4MjA3MSwgMHgxODAwLCAweDIwNjEsIDB4MDEwMCwKKwkweDA4MGMsIDB4OTA5NCwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDEyZSwgMHhhMDAxLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAyLCAweDExMTAsIDB4MDgwNCwKKwkweGMwNzUsIDB4MDAwNSwgMHgwMDAyLCAweGMwMTEsIDB4YzAwZiwgMHhjMDBmLCAweGMwMGYsIDB4YzAwZiwKKwkweGMwMGYsIDB4YzAwZiwgMHhjMDBmLCAweGMwMGYsIDB4YzAwZiwgMHhjMDBmLCAweGMwMmMsIDB4YzAyYywKKwkweGMwMmMsIDB4YzAyYywgMHhjMDBmLCAweGMwMmMsIDB4YzAwZiwgMHhjMDJjLCAweGMwMGYsIDB4MDgwYywKKwkweDBkZDUsIDB4MDgwYywgMHg5NjU3LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Y2M4NiwKKwkweDAxNjgsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAwNiwgMHhhODc3LCAweDAwMDAsIDB4YTg4MCwKKwkweGMwZWMsIDB4YTg4MiwgMHgwODBjLCAweDZkMTcsIDB4MDgwYywgMHhjZTcxLCAweDAwOWUsIDB4MDgwYywKKwkweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4Y2U4ZSwKKwkweDA5MGMsIDB4YjkwNSwgMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4MDAwMiwKKwkweGMwNGUsIDB4YzA0YywgMHhjMDRjLCAweGMwNGMsIDB4YzA0YywgMHhjMDRjLCAweGMwNGMsIDB4YzA0YywKKwkweGMwNGMsIDB4YzA0YywgMHhjMDRjLCAweGMwNjUsIDB4YzA2NSwgMHhjMDY1LCAweGMwNjUsIDB4YzA0YywKKwkweGMwNmYsIDB4YzA0YywgMHhjMDY1LCAweGMwNGMsIDB4MDgwYywgMHgwZGQ1LCAweDAwOTYsIDB4MDgwYywKKwkweDk2NTcsIDB4NjAxNCwgMHgyMDQ4LCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNDIsIDB4YTk3YywKKwkweGQxYWMsIDB4MDE0MCwgMHg2MDAzLCAweDAwMDQsIDB4YTg3YywgMHg5MDg1LCAweDA0MDAsIDB4YTg3ZSwKKwkweDAwOWUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDIsIDB4MGNiOCwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywKKwkweGQzYTAsIDB4MDgwYywgMHhkM2E1LCAweDYwMDMsIDB4MDAwZiwgMHgwODA0LCAweDk3NjMsIDB4MDgwYywKKwkweDk2NTcsIDB4MDgwYywgMHhhZjQzLCAweDA4MDQsIDB4OTc2MywgMHg5MTgyLCAweDAwNTQsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhjMDkxLCAweGMwOTEsIDB4YzA5MSwKKwkweGMwOTEsIDB4YzA5MSwgMHhjMDkzLCAweGMxNzAsIDB4YzA5MSwgMHhjMWE0LCAweGMwOTEsIDB4YzA5MSwKKwkweGMwOTEsIDB4YzA5MSwgMHhjMDkxLCAweGMwOTEsIDB4YzA5MSwgMHhjMDkxLCAweGMwOTEsIDB4YzA5MSwKKwkweGMxYTQsIDB4MDgwYywgMHgwZGQ1LCAweDAwYjYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4NzY0NCwKKwkweDk2YjQsIDB4MGZmZiwgMHg4NmZmLCAweDE1MjgsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4ZDBiYywKKwkweDE5MDQsIDB4YzE1ZiwgMHhhODdiLCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLCAweGFlNzYsIDB4YTg3YywKKwkweGQwYWMsIDB4MDEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwgMHgxOTBjLCAweGMzM2QsIDB4MDgwYywKKwkweDZiMzMsIDB4NjIxMCwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwgMHgwMTEwLCAweDgyMTEsIDB4YmEzZSwKKwkweDcwNDQsIDB4ZDBlNCwgMHgxOTA0LCAweGMxNDMsIDB4MDgwYywgMHhhZjQzLCAweDAwOWUsIDB4MDBiZSwKKwkweDAwMDUsIDB4OTY4YywgMHgwYzAwLCAweDAxNTAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4ZDBiYywKKwkweDE5MDQsIDB4YzE0NywgMHg3MzQ4LCAweGFiOTIsIDB4NzM0YywgMHhhYjhlLCAweDk2OGMsIDB4MDBmZiwKKwkweDkxODYsIDB4MDAwMiwgMHgwNTA4LCAweDkxODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywKKwkweDAwZTgsIDB4ZDZkYywgMHgwMWEwLCAweGE4N2IsIDB4MDAxNSwgMHhhODdjLCAweGQwYWMsIDB4MDE3MCwKKwkweGE5MzgsIDB4YWEzNCwgMHgyMTAwLCAweDkyMDUsIDB4MDE0OCwgMHg3MDQ4LCAweDkxMDYsIDB4MTExOCwKKwkweDcwNGMsIDB4OTIwNiwgMHgwMTE4LCAweGE5OTIsIDB4YWE4ZSwgMHhjNmRjLCAweDAwMzgsIDB4ZDZkNCwKKwkweDAxMTgsIDB4YTg3YiwgMHgwMDA3LCAweDAwMTAsIDB4YTg3YiwgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywKKwkweGFlNzYsIDB4OTAxZSwgMHhkNmM0LCAweDAxZDgsIDB4OTY4NiwgMHgwMTAwLCAweDExMzAsIDB4NzA2NCwKKwkweDkwMDUsIDB4MTExOCwgMHhjNmM0LCAweDA4MDQsIDB4YzA5YSwgMHg3MzVjLCAweGFiODYsIDB4ODNmZiwKKwkweDAxNzAsIDB4OTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwKKwkweDIwMTksIDB4MDAxOCwgMHgyMDExLCAweDAwMjUsIDB4MDgwYywgMHhjODM3LCAweDAwM2UsIDB4ZDZjYywKKwkweDA5MDQsIDB4YzBhZiwgMHg3MTU0LCAweGE5OGEsIDB4ODFmZiwgMHgwOTA0LCAweGMwYWYsIDB4OTE5MiwKKwkweDAwMjEsIDB4MTI3OCwgMHg4MzA0LCAweDkwOTgsIDB4MDAxOCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywKKwkweGM4MzcsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMCwgMHgwODBjLCAweGQzMmQsIDB4MDgwNCwKKwkweGMwYWYsIDB4YTg2OCwgMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweGE5OGEsIDB4MGM1MCwKKwkweDAwYTYsIDB4Mjk1MCwgMHgwODBjLCAweGM3ZDYsIDB4MDBhZSwgMHgwODBjLCAweGQzMmQsIDB4MDgwYywKKwkweGM4MjcsIDB4MDgwNCwgMHhjMGIxLCAweDA4MGMsIDB4Y2Y4NiwgMHgwODA0LCAweGMwYmUsIDB4YTg3YywKKwkweGQwYWMsIDB4MDkwNCwgMHhjMGNhLCAweGE4ODAsIDB4ZDBiYywgMHgxOTA0LCAweGMwY2EsIDB4NzM0OCwKKwkweGE4MzgsIDB4OTMwNiwgMHgxMWM4LCAweDczNGMsIDB4YTgzNCwgMHg5MzFlLCAweDA5MDQsIDB4YzBjYSwKKwkweGQ2ZDQsIDB4MDE5MCwgMHhhYjM4LCAweDkzMDUsIDB4MDkwNCwgMHhjMGNhLCAweDAwNjgsIDB4YTg3YywKKwkweGQwYWMsIDB4MDkwNCwgMHhjMGEyLCAweGE4MzgsIDB4YTkzNCwgMHg5MTA1LCAweDA5MDQsIDB4YzBhMiwKKwkweGE4ODAsIDB4ZDBiYywgMHgxOTA0LCAweGMwYTIsIDB4MDgwYywgMHhjZmMwLCAweDA4MDQsIDB4YzBiZSwKKwkweDAwOTYsIDB4MDBmNiwgMHg2MDAzLCAweDAwMDMsIDB4NjAwNywgMHgwMDQzLCAweDIwNzksIDB4MDI2YywKKwkweDdjMDQsIDB4N2IwMCwgMHg3ZTBjLCAweDdkMDgsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBhYywKKwkweDAxNDAsIDB4NjAwMywgMHgwMDAyLCAweDAwZmUsIDB4MDA5ZSwgMHgwMDA1LCAweDIxMzAsIDB4MjIyOCwKKwkweDAwNTgsIDB4MjQwMCwgMHhhOWFjLCAweDkxMGEsIDB4MjMwMCwgMHhhYWIwLCAweDkyMTMsIDB4MjYwMCwKKwkweDkxMDIsIDB4MjUwMCwgMHg5MjAzLCAweDBlOTAsIDB4YWMzNiwgMHhhYjNhLCAweGFlNDYsIDB4YWQ0YSwKKwkweDAwZmUsIDB4NjA0MywgMHgwMDAwLCAweDJjMTAsIDB4MDgwYywgMHgxYmViLCAweDA4MGMsIDB4OTIxNiwKKwkweDA4MGMsIDB4OTg5MSwgMHgwMDllLCAweDAwMDUsIDB4MDAwNSwgMHg5MTgyLCAweDAwNTQsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhjMWMxLCAweGMxYzEsIDB4YzFjMSwKKwkweGMxYzEsIDB4YzFjMSwgMHhjMWMzLCAweGMyNTksIDB4YzFjMSwgMHhjMWMxLCAweGMyNzAsIDB4YzMwMCwKKwkweGMxYzEsIDB4YzFjMSwgMHhjMWMxLCAweGMxYzEsIDB4YzMxNSwgMHhjMWMxLCAweGMxYzEsIDB4YzFjMSwKKwkweGMxYzEsIDB4MDgwYywgMHgwZGQ1LCAweDAwNzYsIDB4MDBhNiwgMHgwMGU2LCAweDAwOTYsIDB4MjA3MSwKKwkweDAyNjAsIDB4NjExNCwgMHgyMTUwLCAweDc2NDQsIDB4YjY3NiwgMHg5NmI0LCAweDBmZmYsIDB4Yjc3YywKKwkweGM3ZTUsIDB4Yjc3ZSwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTNjLCAweDgyZmYsIDB4MDExMCwKKwkweDgyMTEsIDB4YmEzZSwgMHgwMGJlLCAweDg2ZmYsIDB4MDkwNCwgMHhjMjU0LCAweDk2OTQsIDB4ZmYwMCwKKwkweDkyODQsIDB4MGMwMCwgMHgwMTIwLCAweDcwNDgsIDB4YjA5MiwgMHg3MDRjLCAweGIwOGUsIDB4OTI4NCwKKwkweDAzMDAsIDB4MDkwNCwgMHhjMjU0LCAweDA4MGMsIDB4MGZmZiwgMHgwOTBjLCAweDBkZDUsIDB4MjkwMCwKKwkweGIwN2EsIDB4Yjc3YywgMHhjN2NkLCAweGI3N2UsIDB4YTg2NywgMHgwMTAzLCAweGIwNjgsIDB4YTg2YSwKKwkweGIwNmMsIDB4YTg2ZSwgMHhiMDcwLCAweGE4NzIsIDB4YWU3NiwgMHg5NjhjLCAweDBjMDAsIDB4MDEyMCwKKwkweDczNDgsIDB4YWI5MiwgMHg3MzRjLCAweGFiOGUsIDB4OTY4YywgMHgwMGZmLCAweDkxODYsIDB4MDAwMiwKKwkweDAxODAsIDB4OTE4NiwgMHgwMDI4LCAweDExMTgsIDB4YTg3YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDZkYywKKwkweDAxMTgsIDB4YTg3YiwgMHgwMDE1LCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywKKwkweDAwMTAsIDB4YTg3YiwgMHgwMDAwLCAweGFmN2UsIDB4YjA4MCwgMHhhODgyLCAweGIwODQsIDB4YTg4NiwKKwkweDkwMWUsIDB4ZDZjNCwgMHgwMTkwLCAweDczNWMsIDB4YWI4NiwgMHg4M2ZmLCAweDAxNzAsIDB4OTM4YSwKKwkweDAwMDksIDB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwgMHgyMzA4LCAweDIwMTksIDB4MDAxOCwKKwkweDIwMTEsIDB4MDAyNSwgMHgwODBjLCAweGM4MzcsIDB4MDAzZSwgMHhkNmNjLCAweDAxZTgsIDB4NzE1NCwKKwkweGE5OGEsIDB4ODFmZiwgMHgwMWM4LCAweDkxOTIsIDB4MDAyMSwgMHgxMjYwLCAweDgzMDQsIDB4OTA5OCwKKwkweDAwMTgsIDB4MjAxMSwgMHgwMDI5LCAweDA4MGMsIDB4YzgzNywgMHgyMDExLCAweDAyMDUsIDB4MjAxMywKKwkweDAwMDAsIDB4MDA1MCwgMHhiMDY4LCAweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4YTk4YSwKKwkweDBjNjgsIDB4Mjk1MCwgMHgwODBjLCAweGM3ZDYsIDB4MDA5ZSwgMHgwMGVlLCAweDAwYWUsIDB4MDA3ZSwKKwkweDAwMDUsIDB4MDBmNiwgMHgwMGE2LCAweDYwMDMsIDB4MDAwMywgMHgyMDc5LCAweDAyNmMsIDB4N2MwNCwKKwkweDdiMDAsIDB4N2UwYywgMHg3ZDA4LCAweDYwMTQsIDB4MjA1MCwgMHhiNDM2LCAweGIzM2EsIDB4YjY0NiwKKwkweGI1NGEsIDB4MDBhZSwgMHgwMGZlLCAweDJjMTAsIDB4MDgwYywgMHgxYmViLCAweDA4MDQsIDB4YTMyMywKKwkweDYwMDMsIDB4MDAwMiwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgxMWM4LCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGFjLCAweDAxNjAsIDB4NjAxYywgMHhkMDg0LCAweDExMzAsIDB4MDBmNiwKKwkweDJjMDAsIDB4MjA3OCwgMHgwODBjLCAweDE3NTQsIDB4MDBmZSwgMHg2MDAzLCAweDAwMDQsIDB4MDAxMCwKKwkweDYwMDMsIDB4MDAwMiwgMHgwMDllLCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsIDB4MDA5NiwKKwkweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNDIsIDB4MDgwYywgMHg5NzEzLCAweDA4MGMsIDB4OTg5MSwKKwkweDYxMTQsIDB4MjE0OCwgMHhhOTdjLCAweGQxZTQsIDB4MDkwNCwgMHhjMmZiLCAweGQxY2MsIDB4MDVjOCwKKwkweGE5NzgsIDB4YTg2OCwgMHhkMGZjLCAweDA1NDAsIDB4MDAxNiwgMHhhODdjLCAweDAwMDYsIDB4YTg4MCwKKwkweDAwMDYsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwYTAsIDB4ODEwZSwKKwkweDgxMGUsIDB4ODEwZiwgMHg5MTg0LCAweDAwM2YsIDB4MjBlMCwgMHg5MTg0LCAweGZmYzAsIDB4OTA4MCwKKwkweDAwMTksIDB4MjA5OCwgMHgwMTU2LCAweDIwYTksIDB4MDAyMCwgMHg0MDAzLCAweDAxNWUsIDB4MDAwZSwKKwkweGE4ODIsIDB4MDAwZSwgMHhjMGNjLCAweGE4N2UsIDB4MDAxZSwgMHhhODc0LCAweDAwMDYsIDB4MjE0OCwKKwkweDA4MGMsIDB4MGZiMSwgMHgwMDFlLCAweDA0NTgsIDB4MDAxNiwgMHgwODBjLCAweDBmYjEsIDB4MDA5ZSwKKwkweGE4N2MsIDB4YzBjYywgMHhhODdlLCAweGE5NzQsIDB4MDAxNiwgMHgwODBjLCAweGM4MjcsIDB4MDAxZSwKKwkweDAwZjAsIDB4YTg2NywgMHgwMTAzLCAweGE5NzQsIDB4OTE4NCwgMHgwMGZmLCAweDkwYjYsIDB4MDAwMiwKKwkweDAxODAsIDB4OTA4NiwgMHgwMDI4LCAweDExMTgsIDB4YTg3YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDFkYywKKwkweDAxMTgsIDB4YTg3YiwgMHgwMDE1LCAweDAwMzgsIDB4ZDFkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywKKwkweDAwMTAsIDB4YTg3YiwgMHgwMDAwLCAweDAwMTYsIDB4MDgwYywgMHg2YjMzLCAweDAwMWUsIDB4ZDFlNCwKKwkweDExMjAsIDB4MDgwYywgMHhhZjQzLCAweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweGNmODYsIDB4MGNkOCwKKwkweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDExMjAsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4OTc2MywKKwkweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGE2YWMsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4ZDNhNSwKKwkweDA4MGMsIDB4OTcxMywgMHgwODBjLCAweDk4OTEsIDB4MDAwNSwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwKKwkweDExMjAsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4OTc2MywgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywKKwkweGE2YWMsIDB4MDgwYywgMHg5NzEzLCAweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGQzOWQsIDB4MDA5NiwKKwkweDYxMTQsIDB4MjE0OCwgMHgwODBjLCAweGNjODYsIDB4MDE1MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwKKwkweDAwMjksIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGNlNzEsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk4OTEsIDB4MDAwNSwgMHhhODdiLCAweDAwMTUsIDB4ZDFmYywKKwkweDAxODAsIDB4YTg3YiwgMHgwMDA3LCAweDgwMDIsIDB4ODAwMCwgMHg4MTBhLCAweDkxODksIDB4MDAwMCwKKwkweDAwMDYsIDB4MDAxNiwgMHgyMDA5LCAweDFhNzksIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4MDAxZSwKKwkweDAwMGUsIDB4YTk5MiwgMHhhODhlLCAweDAwMDUsIDB4OTE4MiwgMHgwMDU0LCAweDEyMjAsIDB4OTE4MiwKKwkweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YzM3MCwgMHhjMzcwLCAweGMzNzAsIDB4YzM3MCwKKwkweGMzNzAsIDB4YzM3MiwgMHhjMzcwLCAweGMzNzAsIDB4YzQxOCwgMHhjMzcwLCAweGMzNzAsIDB4YzM3MCwKKwkweGMzNzAsIDB4YzM3MCwgMHhjMzcwLCAweGMzNzAsIDB4YzM3MCwgMHhjMzcwLCAweGMzNzAsIDB4YzU0YSwKKwkweDA4MGMsIDB4MGRkNSwgMHgwMDc2LCAweDAwYTYsIDB4MDBlNiwgMHgwMDk2LCAweDIwNzEsIDB4MDI2MCwKKwkweDYxMTQsIDB4MjE1MCwgMHg3NjQ0LCAweGI2NzYsIDB4OTZiNCwgMHgwZmZmLCAweGI3N2MsIDB4YzdlNSwKKwkweGI3N2UsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLCAweDAxMTAsIDB4ODIxMSwKKwkweGJhM2UsIDB4MDBiZSwgMHg4NmZmLCAweDA5MDQsIDB4YzQxMSwgMHg5Njk0LCAweGZmMDAsIDB4OTI4NCwKKwkweDBjMDAsIDB4MDEyMCwgMHg3MDQ4LCAweGIwOTIsIDB4NzA0YywgMHhiMDhlLCAweDkyODQsIDB4MDMwMCwKKwkweDA5MDQsIDB4YzQxMSwgMHg5Njg2LCAweDAxMDAsIDB4MTEzMCwgMHg3MDY0LCAweDkwMDUsIDB4MTExOCwKKwkweGM2YzQsIDB4YjY3NiwgMHgwYzM4LCAweDA4MGMsIDB4MGZmZiwgMHgwOTBjLCAweDBkZDUsIDB4MjkwMCwKKwkweGIwN2EsIDB4Yjc3YywgMHg5N2JkLCAweDAyMDAsIDB4Yjc3ZSwgMHhhODY3LCAweDAxMDMsIDB4YjA2OCwKKwkweGE4NmEsIDB4YjA2YywgMHhhODZlLCAweGIwNzAsIDB4YTg3MiwgMHg3MDQ0LCAweDkwODQsIDB4ZjAwMCwKKwkweDk2MzUsIDB4YWU3NiwgMHg5NjhjLCAweDBjMDAsIDB4MDEyMCwgMHg3MzQ4LCAweGFiOTIsIDB4NzM0YywKKwkweGFiOGUsIDB4OTY4YywgMHgwMGZmLCAweDkxODYsIDB4MDAwMiwgMHgwMTgwLCAweDkxODYsIDB4MDAyOCwKKwkweDExMTgsIDB4YTg3YiwgMHgwMDFjLCAweDAwNjAsIDB4ZDZkYywgMHgwMTE4LCAweGE4N2IsIDB4MDAxNSwKKwkweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwKKwkweGFmN2UsIDB4YjA4MCwgMHhhODgyLCAweGIwODQsIDB4YTg4NiwgMHg5MDFlLCAweGQ2YzQsIDB4MDE5MCwKKwkweDczNWMsIDB4YWI4NiwgMHg4M2ZmLCAweDAxNzAsIDB4OTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwKKwkweDAwMDgsIDB4MDAzNiwgMHgyMzA4LCAweDIwMTksIDB4MDAxOCwgMHgyMDExLCAweDAwMjUsIDB4MDgwYywKKwkweGM4MzcsIDB4MDAzZSwgMHhkNmNjLCAweDAxZTgsIDB4NzE1NCwgMHhhOThhLCAweDgxZmYsIDB4MDFjOCwKKwkweDkxOTIsIDB4MDAyMSwgMHgxMjYwLCAweDgzMDQsIDB4OTA5OCwgMHgwMDE4LCAweDIwMTEsIDB4MDAyOSwKKwkweDA4MGMsIDB4YzgzNywgMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAwLCAweDAwNTAsIDB4YjA2OCwKKwkweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4YTk4YSwgMHgwYzY4LCAweDI5NTAsIDB4MDgwYywKKwkweGM3ZDYsIDB4MDgwYywgMHgxYTZmLCAweDAwOWUsIDB4MDBlZSwgMHgwMGFlLCAweDAwN2UsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNDIsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4YTgzYywKKwkweGE5NDAsIDB4OTEwNSwgMHgxMTE4LCAweGE4N2MsIDB4YzBkYywgMHhhODdlLCAweDYwMDMsIDB4MDAwMiwKKwkweGE5N2MsIDB4ZDFlNCwgMHgwOTA0LCAweGM1NDUsIDB4NjA0MywgMHgwMDAwLCAweDYwMTAsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTUwMCwgMHhkMWNjLCAweDA5MDQsIDB4YzUxNCwKKwkweGE5NzgsIDB4YTg2OCwgMHhkMGZjLCAweDA5MDQsIDB4YzRkNSwgMHgwMDE2LCAweGE4N2MsIDB4MDAwNiwKKwkweGE4ODAsIDB4MDAwNiwgMHgwMGE2LCAweDIxNTAsIDB4YjE3NCwgMHg5MTg0LCAweDAwZmYsIDB4OTBiNiwKKwkweDAwMDIsIDB4MDkwNCwgMHhjNGEyLCAweDkwODYsIDB4MDAyOCwgMHgxOTA0LCAweGM0OGUsIDB4YTg3YiwKKwkweDAwMWMsIDB4YjA3YiwgMHgwMDFjLCAweDA4MDQsIDB4YzRhYSwgMHg2MDI0LCAweGQwZjQsIDB4MTFkMCwKKwkweGE4MzgsIDB4YWEzNCwgMHg5MjA1LCAweDA5YzgsIDB4YTgzOCwgMHhhYTkwLCAweDkyMDYsIDB4MTEyMCwKKwkweGE4OGMsIDB4YWEzNCwgMHg5MjA2LCAweDA5ODgsIDB4NjAyNCwgMHhkMGQ0LCAweDExNDgsIDB4YTlhYywKKwkweGE4MzQsIDB4OTEwMiwgMHg2MDNhLCAweGE5YjAsIDB4YTgzOCwgMHg5MTAzLCAweDYwM2UsIDB4NjAyNCwKKwkweGMwZjUsIDB4NjAyNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODNjLCAweDgwMDAsIDB4YjgzZSwKKwkweDAwYmUsIDB4OTAwNiwgMHhhODc2LCAweGE4OTIsIDB4YTg4ZSwgMHhhODdjLCAweGMwZTQsIDB4YTg3ZSwKKwkweGQwY2MsIDB4MDE0MCwgMHhjMGNjLCAweGE4N2UsIDB4MDA5NiwgMHhhODc4LCAweDIwNDgsIDB4MDgwYywKKwkweDBmYjEsIDB4MDA5ZSwgMHgwODBjLCAweGNmYzAsIDB4MDgwNCwgMHhjNTQ1LCAweGQxZGMsIDB4MDE1OCwKKwkweGE4N2IsIDB4MDAxNSwgMHhiMDdiLCAweDAwMTUsIDB4MDgwYywgMHhkMjUwLCAweDAxMTgsIDB4YjE3NCwKKwkweGMxZGMsIDB4YjE3NiwgMHgwMDc4LCAweGQxZDQsIDB4MDEyOCwgMHhhODdiLCAweDAwMDcsIDB4YjA3YiwKKwkweDAwMDcsIDB4MDA0MCwgMHhhODdjLCAweGQwYWMsIDB4MDEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwKKwkweDE5MGMsIDB4YzMzZCwgMHhhODdjLCAweGIwN2UsIDB4YTg5MCwgMHhiMDkyLCAweGE4OGMsIDB4YjA4ZSwKKwkweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMGEwLCAweDIwYTksIDB4MDAyMCwKKwkweDhhMDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwOTQsIDB4MDAzZiwgMHgyMmUwLCAweDkwODQsIDB4ZmZjMCwKKwkweDkwODAsIDB4MDAxOSwgMHgyMDk4LCAweDQwMDMsIDB4MDBhZSwgMHgwMDBlLCAweGE4ODIsIDB4MDAwZSwKKwkweGMwY2MsIDB4YTg3ZSwgMHgwODBjLCAweGQzMmQsIDB4MDAxZSwgMHhhODc0LCAweDAwMDYsIDB4MjE0OCwKKwkweDA4MGMsIDB4MGZiMSwgMHgwMDFlLCAweDA4MDQsIDB4YzU0MSwgMHgwMDE2LCAweDAwYTYsIDB4MjE1MCwKKwkweGIxNzQsIDB4OTE4NCwgMHgwMGZmLCAweDkwYjYsIDB4MDAwMiwgMHgwMWUwLCAweDkwODYsIDB4MDAyOCwKKwkweDExMjgsIDB4YTg3YiwgMHgwMDFjLCAweGIwN2IsIDB4MDAxYywgMHgwMGUwLCAweGQxZGMsIDB4MDE1OCwKKwkweGE4N2IsIDB4MDAxNSwgMHhiMDdiLCAweDAwMTUsIDB4MDgwYywgMHhkMjUwLCAweDAxMTgsIDB4YjE3NCwKKwkweGMxZGMsIDB4YjE3NiwgMHgwMDc4LCAweGQxZDQsIDB4MDEyOCwgMHhhODdiLCAweDAwMDcsIDB4YjA3YiwKKwkweDAwMDcsIDB4MDA0MCwgMHhhODdjLCAweGQwYWMsIDB4MDEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwKKwkweDE5MGMsIDB4YzMzZCwgMHhhODkwLCAweGIwOTIsIDB4YTg4YywgMHhiMDhlLCAweGE4N2MsIDB4YjA3ZSwKKwkweDAwYWUsIDB4MDgwYywgMHgwZmIxLCAweDAwOWUsIDB4MDgwYywgMHhkMzJkLCAweGE5NzQsIDB4MDAxNiwKKwkweDA4MGMsIDB4YzgyNywgMHgwMDFlLCAweDA0NjgsIDB4YTg2NywgMHgwMTAzLCAweGE5NzQsIDB4OTE4NCwKKwkweDAwZmYsIDB4OTBiNiwgMHgwMDAyLCAweDAxYjAsIDB4OTA4NiwgMHgwMDI4LCAweDExMTgsIDB4YTg3YiwKKwkweDAwMWMsIDB4MDBkMCwgMHhkMWRjLCAweDAxNDgsIDB4YTg3YiwgMHgwMDE1LCAweDA4MGMsIDB4ZDI1MCwKKwkweDAxMTgsIDB4YTk3NCwgMHhjMWRjLCAweGE5NzYsIDB4MDA3OCwgMHhkMWQ0LCAweDAxMTgsIDB4YTg3YiwKKwkweDAwMDcsIDB4MDA1MCwgMHhhODdiLCAweDAwMDAsIDB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwKKwkweGE5MzgsIDB4OTExNSwgMHgxOTBjLCAweGMzM2QsIDB4YTk3NCwgMHgwMDE2LCAweDA4MGMsIDB4NmIzMywKKwkweDAwMWUsIDB4ZDFlNCwgMHgxMTIwLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywKKwkweGNmODYsIDB4MGNkOCwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwgMHhhOTdjLCAweGQxZTQsIDB4MTkwYywKKwkweDFhOGQsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4OTY1NywgMHgwMDEwLCAweDA4MGMsIDB4OTcxMywKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMWYwLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Y2U4ZSwKKwkweDExMTgsIDB4MDgwYywgMHhiOTA1LCAweDAwYTAsIDB4YTg2NywgMHgwMTAzLCAweDIwMDksIDB4MTgwYywKKwkweDIxMGMsIDB4ZDE4YywgMHgxMWI4LCAweGQxODQsIDB4MTE5MCwgMHg2MTA4LCAweGE5N2EsIDB4OTE4ZSwKKwkweDAwMjksIDB4MTExMCwgMHgwODBjLCAweGVhOTQsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmQxNywKKwkweDAwOWUsIDB4MDgwYywgMHhhZjQzLCAweDA4MGMsIDB4OTc2MywgMHgwODA0LCAweDk4OTEsIDB4YTg3YiwKKwkweDAwMDQsIDB4MGM5MCwgMHhhODdiLCAweDAwMDQsIDB4MGM3OCwgMHg5MTgyLCAweDAwNTQsIDB4MTIyMCwKKwkweDkxODIsIDB4MDA0MCwgMHgwMjA4LCAweDAwMGEsIDB4MDAwNSwgMHhjNWExLCAweGM1YTEsIDB4YzVhMSwKKwkweGM1YTEsIDB4YzVhMSwgMHhjNWEzLCAweGM1YTEsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsIDB4YzVhMSwKKwkweGM1YTEsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsIDB4YzVhMSwgMHhjNWExLCAweGM1YTEsIDB4YzVhMSwKKwkweGM1YTEsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4NTc2NSwgMHgwMWY4LCAweDYwMTQsIDB4NzE0NCwKKwkweDkxOGMsIDB4MGZmZiwgMHg5MDE2LCAweGQxYzQsIDB4MDExOCwgMHg3MjY0LCAweDkyOTQsIDB4MDBmZiwKKwkweDAwOTYsIDB4OTA0ZCwgMHgwMTg4LCAweGE4N2IsIDB4MDAwMCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwKKwkweDAxMjgsIDB4YTg2NywgMHgwMTAzLCAweGE5NzYsIDB4YWE5NiwgMHgwMDMwLCAweGE4OTcsIDB4NDAwMCwKKwkweGE5OWEsIDB4YWE5ZSwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwgMHgwODA0LCAweGFmNDMsIDB4OTE4MiwKKwkweDAwODUsIDB4MDAwMiwgMHhjNWQ5LCAweGM1ZDcsIDB4YzVkNywgMHhjNWU1LCAweGM1ZDcsIDB4YzVkNywKKwkweGM1ZDcsIDB4YzVkNywgMHhjNWQ3LCAweGM1ZDcsIDB4YzVkNywgMHhjNWQ3LCAweGM1ZDcsIDB4MDgwYywKKwkweDBkZDUsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg5MWIxLCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHg5NzYzLCAweDAxMmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwNTYsIDB4MDBkNiwKKwkweDAwZTYsIDB4MjA3MSwgMHgwMjYwLCAweDcyMjQsIDB4NjIxNiwgMHg3MjIwLCAweDA4MGMsIDB4Y2M3NCwKKwkweDAxZjgsIDB4MjI2OCwgMHg2ODAwLCAweDkwODYsIDB4MDAwMCwgMHgwMWQwLCAweDYwMTAsIDB4NmQxMCwKKwkweDk1MmUsIDB4MTFiMCwgMHgwMGM2LCAweDJkNjAsIDB4MDBkNiwgMHgwODBjLCAweGM4OTgsIDB4MDBkZSwKKwkweDAwY2UsIDB4MDE1OCwgMHg3MDJjLCAweGQwODQsIDB4MTExOCwgMHgwODBjLCAweGM4NjIsIDB4MDAxMCwKKwkweDY4MDMsIDB4MDAwMiwgMHg2MDA3LCAweDAwODYsIDB4MDAyOCwgMHgwODBjLCAweGM4ODQsIDB4MGQ5MCwKKwkweDYwMDcsIDB4MDA4NywgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywKKwkweDcyMjAsIDB4MDgwYywgMHhjYzc0LCAweDAxNzgsIDB4NjgxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwKKwkweDAwYmUsIDB4ZDBiYywgMHgwMTQwLCAweDY4MjQsIDB4ZDBlYywgMHgwMTI4LCAweDAwYzYsIDB4MmQ2MCwKKwkweDA4MGMsIDB4Y2ZjMCwgMHgwMGNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDVlLCAweDAwMmUsIDB4MDAwNSwKKwkweDkxODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4OTA4YSwgMHgwMDg1LCAweDBhMGMsIDB4MGRkNSwKKwkweDkwOGEsIDB4MDA5MiwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwgMHgwMDg1LCAweDAwZTIsIDB4OTE4NiwKKwkweDAwMjcsIDB4MDEyMCwgMHg5MTg2LCAweDAwMTQsIDB4MTkwYywgMHgwZGQ1LCAweDA4MGMsIDB4OTY1NywKKwkweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTQwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4NzcsIDB4MDAwMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywgMHg2ZDE3LCAweDAwOWUsIDB4MDgwYywKKwkweGFmNzQsIDB4MDgwNCwgMHg5NzYzLCAweGM2NjgsIDB4YzY2YSwgMHhjNjZhLCAweGM2NjgsIDB4YzY2OCwKKwkweGM2NjgsIDB4YzY2OCwgMHhjNjY4LCAweGM2NjgsIDB4YzY2OCwgMHhjNjY4LCAweGM2NjgsIDB4YzY2OCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsIDB4OTc2MywKKwkweDAwMDUsIDB4OTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHg5MDgyLCAweDAwODUsIDB4MjAwOCwKKwkweDA0YjgsIDB4OTE4NiwgMHgwMDI3LCAweDExZjgsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4MzIxZSwKKwkweDA4MGMsIDB4ZDM5ZCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MDE1MCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmQxNywKKwkweDA4MGMsIDB4Y2U3MSwgMHgwMDllLCAweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDA4MGMsIDB4YWZkOSwgMHgwY2UwLCAweDkxODYsIDB4MDAxNCwgMHgxZGQwLCAweDA4MGMsIDB4OTY1NywKKwkweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwZDYwLCAweGE4NjcsIDB4MDEwMywKKwkweGE4NzcsIDB4MDAwMCwgMHhhODdiLCAweDAwMDYsIDB4YTg4MCwgMHhjMGVjLCAweGE4ODIsIDB4MDhmMCwKKwkweDAwMDIsIDB4YzZjMCwgMHhjNmJlLCAweGM2YmUsIDB4YzZiZSwgMHhjNmJlLCAweGM2YmUsIDB4YzZkOCwKKwkweGM2YmUsIDB4YzZiZSwgMHhjNmJlLCAweGM2YmUsIDB4YzZiZSwgMHhjNmJlLCAweDA4MGMsIDB4MGRkNSwKKwkweDA4MGMsIDB4OTY1NywgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDM1LCAweDExMTgsIDB4MjAwMSwgMHgxOTg1LCAweDAwMTAsIDB4MjAwMSwKKwkweDE5ODYsIDB4MjAwNCwgMHg2MDFhLCAweDYwMDMsIDB4MDAwYywgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDA4MGMsIDB4OTY1NywgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDM1LCAweDExMTgsIDB4MjAwMSwgMHgxOTg1LCAweDAwMTAsIDB4MjAwMSwKKwkweDE5ODYsIDB4MjAwNCwgMHg2MDFhLCAweDYwMDMsIDB4MDAwZSwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDkxODIsIDB4MDA5MiwgMHgxMjIwLCAweDkxODIsIDB4MDA4NSwgMHgwMjA4LCAweDAwMTIsIDB4MDgwNCwKKwkweGFmZDksIDB4YzcwNiwgMHhjNzA2LCAweGM3MDYsIDB4YzcwNiwgMHhjNzA4LCAweGM3NTUsIDB4YzcwNiwKKwkweGM3MDYsIDB4YzcwNiwgMHhjNzA2LCAweGM3MDYsIDB4YzcwNiwgMHhjNzA2LCAweDA4MGMsIDB4MGRkNSwKKwkweDAwOTYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDE2OCwKKwkweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwgMHgwMDM5LCAweDAxMTgsIDB4OTE4NiwKKwkweDAwMzUsIDB4MTExOCwgMHgwMDllLCAweDA4MDQsIDB4Yzc2OSwgMHgwODBjLCAweGNjODYsIDB4MTExOCwKKwkweDA4MGMsIDB4Y2U3MSwgMHgwMDY4LCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZTQsIDB4MTExMCwKKwkweDA4MGMsIDB4Y2U3MSwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywgMHhkMzY4LCAweDA4MGMsIDB4NmQxNywKKwkweDAwZDYsIDB4MmM2OCwgMHgwODBjLCAweGFlZWQsIDB4MDFkMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwMWUsIDB4NjAwYiwgMHhmZmZmLCAweDIwMDksIDB4MDI2ZSwgMHgyMTBjLCAweDYxM2EsIDB4MjAwOSwKKwkweDAyNmYsIDB4MjEwYywgMHg2MTNlLCAweDY5MTAsIDB4NjExMiwgMHgwODBjLCAweGQxMDIsIDB4Njk1NCwKKwkweDYxNTYsIDB4NjAyMywgMHgwMDAxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MmQ2MCwKKwkweDAwZGUsIDB4MDgwYywgMHhhZjQzLCAweDAwOWUsIDB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDA1YTAsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwKKwkweDkxODYsIDB4MDAzNSwgMHgwMTMwLCAweDkxODYsIDB4MDAxZSwgMHgwMTE4LCAweDkxODYsIDB4MDAzOSwKKwkweDE1MzgsIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsIDB4ZDMwMCwgMHgxMWYwLCAweDA4MGMsIDB4YWVlZCwKKwkweDAxZDgsIDB4NjEwNiwgMHg2MDAzLCAweDAwMDEsIDB4NjAyMywgMHgwMDAxLCAweDY5MTAsIDB4NjExMiwKKwkweDY5MmMsIDB4NjEyZSwgMHg2OTMwLCAweDYxMzIsIDB4NjkzNCwgMHg5MThjLCAweDAwZmYsIDB4NjEzNiwKKwkweDY5MzgsIDB4NjEzYSwgMHg2OTNjLCAweDYxM2UsIDB4Njk1NCwgMHg2MTU2LCAweDA4MGMsIDB4ZDEwMiwKKwkweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MmQ2MCwgMHgwMGRlLCAweDA4MDQsIDB4YWY0MywKKwkweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMWM4LCAweGE4NjcsIDB4MDEwMywKKwkweGE4ODAsIDB4ZDBiNCwgMHgwMTI4LCAweGMwZWMsIDB4YTg4MiwgMHhhODdiLCAweDAwMDYsIDB4MDA0OCwKKwkweGQwYmMsIDB4MDExOCwgMHhhODdiLCAweDAwMDIsIDB4MDAyMCwgMHhhODdiLCAweDAwMDUsIDB4MDgwYywKKwkweGNmODIsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLCAweGNlNzEsIDB4MDA5ZSwKKwkweDA4MDQsIDB4YWY0MywgMHgwMDE2LCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwKKwkweDAxNDAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAyOCwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkMTcsIDB4MDA5ZSwgMHgwMDFlLCAweDkxODYsIDB4MDAxMywgMHgwMTQ4LCAweDkxODYsIDB4MDAxNCwKKwkweDAxMzAsIDB4OTE4NiwgMHgwMDI3LCAweDAxMTgsIDB4MDgwYywgMHhhZmQ5LCAweDAwMzAsIDB4MDgwYywKKwkweDk2NTcsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDAwNTYsIDB4MDA2NiwKKwkweDAwOTYsIDB4MDBhNiwgMHgyMDI5LCAweDAwMDEsIDB4OTE4MiwgMHgwMTAxLCAweDEyMDgsIDB4MDAxMCwKKwkweDIwMDksIDB4MDEwMCwgMHgyMTMwLCAweDgzMDQsIDB4OTA5OCwgMHgwMDE4LCAweDIwMDksIDB4MDAyMCwKKwkweDIwMTEsIDB4MDAyOSwgMHgwODBjLCAweGM4MzcsIDB4OTZiMiwgMHgwMDIwLCAweGIwMDQsIDB4OTA0ZCwKKwkweDAxMTAsIDB4MDgwYywgMHgwZmIxLCAweDA4MGMsIDB4MGZmZiwgMHgwNTIwLCAweDg1MjgsIDB4YTg2NywKKwkweDAxMTAsIDB4YTg2YiwgMHgwMDAwLCAweDI5MjAsIDB4YjQwNiwgMHg5NjhhLCAweDAwM2QsIDB4MTIyOCwKKwkweDI2MDgsIDB4MjAxMSwgMHgwMDFiLCAweDA0OTksIDB4MDBhOCwgMHg5NmIyLCAweDAwM2MsIDB4MjAwOSwKKwkweDAwM2MsIDB4Mjk1MCwgMHgyMDExLCAweDAwMWIsIDB4MDQ1MSwgMHgwYzI4LCAweDIwMDEsIDB4MDIwNSwKKwkweDIwMDMsIDB4MDAwMCwgMHgwMGFlLCAweDg1MmYsIDB4OTVhZCwgMHgwMDAzLCAweGI1NjYsIDB4OTVhYywKKwkweDAwMDAsIDB4MDA0OCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAwLCAweDAwYWUsIDB4ODUyZiwKKwkweDk1YWQsIDB4MDAwMywgMHhiNTY2LCAweDAwOWUsIDB4MDA2ZSwgMHgwMDVlLCAweDAwMDUsIDB4MDBhNiwKKwkweDg5ZmYsIDB4MDE1OCwgMHhhODA0LCAweDkwNTUsIDB4MDEzMCwgMHhhODA3LCAweDAwMDAsIDB4MDgwYywKKwkweDZkMTcsIDB4MmE0OCwgMHgwY2I4LCAweDA4MGMsIDB4NmQxNywgMHgwMGFlLCAweDAwMDUsIDB4MDBmNiwKKwkweDIwNzksIDB4MDIwMCwgMHg3ODE0LCAweDkwODUsIDB4MDA4MCwgMHg3ODE2LCAweGQxODQsIDB4MDEwOCwKKwkweDgxMDgsIDB4ODEwYywgMHgyMGE5LCAweDAwMDEsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTIwMCwKKwkweDIwYTAsIDB4MjBlMSwgMHgwMDAwLCAweDIzMDAsIDB4OWUwMCwgMHgyMDk4LCAweDQwMDMsIDB4ODMxOCwKKwkweDkzODYsIDB4MDAyMCwgMHgxMTQ4LCAweDIwMTgsIDB4MjMwMCwgMHg5ZTAwLCAweDIwOTgsIDB4NzgxNCwKKwkweDgwMDAsIDB4OTA4NSwgMHgwMDgwLCAweDc4MTYsIDB4ODEwOSwgMHgxZDgwLCAweDc4MTcsIDB4MDAwMCwKKwkweDAwZmUsIDB4MDAwNSwgMHg2OTIwLCAweDkxODYsIDB4MDAwMywgMHgwMTE4LCAweDkxODYsIDB4MDAwMiwKKwkweDExZDAsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MmQ2MCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMTUwLCAweDIwMDEsIDB4MDAwNiwgMHhhOTgwLCAweGMxZDUsIDB4MDgwYywKKwkweDZmNGEsIDB4MDgwYywgMHg2ZDBiLCAweDA4MGMsIDB4Y2U3MSwgMHgwMDllLCAweDA4MGMsIDB4YWY3NCwKKwkweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHg3MDJjLCAweGQwODQsIDB4MTE3MCwKKwkweDYwMDgsIDB4MjA2MCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMiwgMHgxMTQwLCAweDYxMDQsIDB4OTE4NiwKKwkweDAwODUsIDB4MDExOCwgMHg5MTg2LCAweDAwOGIsIDB4MTEwOCwgMHg5MDA2LCAweDAwY2UsIDB4MDAwNSwKKwkweDAwNjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAzMSwgMHgwMDAxLCAweDYwMjAsIDB4OTA4NCwKKwkweDAwMGYsIDB4MDA4MywgMHgwMTJlLCAweDAwNmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDAwNjYsIDB4MjAzMSwgMHgwMDAwLCAweDYwMjAsIDB4OTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDA2ZSwKKwkweDAxMmUsIDB4MDAwNSwgMHhjOGQzLCAweGM4ZDMsIDB4YzhjZSwgMHhjOGY1LCAweGM4YzEsIDB4YzhjZSwKKwkweGM4ZjUsIDB4YzhjZSwgMHhjOGMxLCAweDhmOTUsIDB4YzhjZSwgMHhjOGNlLCAweGM4Y2UsIDB4YzhjMSwKKwkweGM4YzEsIDB4MDgwYywgMHgwZGQ1LCAweDAwMzYsIDB4MjAxOSwgMHgwMDEwLCAweDA4MGMsIDB4ZTJjMCwKKwkweDYwMjMsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDAzZSwgMHgwMDA1LCAweDkwMDYsIDB4MDAwNSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwOTYsIDB4ODZmZiwgMHgxMWQ4LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMWMwLCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LCAweDExMjgsIDB4YTg3YiwKKwkweDAwMDUsIDB4YTg4MywgMHgwMDAwLCAweDAwMjgsIDB4OTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MDgwYywKKwkweDZmNGEsIDB4MDgwYywgMHhjZjgyLCAweDA4MGMsIDB4NmQwYiwgMHgwODBjLCAweGFmNzQsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNlMCwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwKKwkweDFhMGMsIDB4MGRkNSwgMHgwMDAyLCAweGM5MGIsIDB4YzkzYiwgMHhjOTBkLCAweGM5NWMsIDB4YzkzNiwKKwkweGM5MGIsIDB4YzhjZSwgMHhjOGQzLCAweGM4ZDMsIDB4YzhjZSwgMHhjOGNlLCAweGM4Y2UsIDB4YzhjZSwKKwkweGM4Y2UsIDB4YzhjZSwgMHhjOGNlLCAweDA4MGMsIDB4MGRkNSwgMHg4NmZmLCAweDE1MjAsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNiwgMHgwNTAwLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Y2M4NiwKKwkweDAxNjgsIDB4YTg3YywgMHhkMGNjLCAweDAxNDAsIDB4MDA5NiwgMHhjMGNjLCAweGE4N2UsIDB4YTg3OCwKKwkweDIwNDgsIDB4MDgwYywgMHgwZmIxLCAweDAwOWUsIDB4MDgwYywgMHhjZjgyLCAweDAwOWUsIDB4MDgwYywKKwkweGQzNDIsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywKKwkweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwNjYsIDB4MDgwYywKKwkweDFhYTEsIDB4MDA2ZSwgMHgwODkwLCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDcwMjQsIDB4OWMwNiwKKwkweDExMjAsIDB4MDgwYywgMHhhNjM2LCAweDAwZWUsIDB4MDg0MCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwKKwkweDkwODYsIDB4MDAwNiwgMHgxMTUwLCAweDAwODYsIDB4MDA5NiwgMHgyMDQ5LCAweDAwMDEsIDB4MmM0MCwKKwkweDA4MGMsIDB4YTc2YiwgMHgwMDllLCAweDAwOGUsIDB4MDAxMCwgMHgwODBjLCAweGE1MzMsIDB4MDBlZSwKKwkweDE5MDQsIDB4YzkwZCwgMHgwODA0LCAweGM4Y2UsIDB4MDAzNiwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwKKwkweDcwM2MsIDB4OWMwNiwgMHgxMTM4LCAweDkwMWUsIDB4MDgwYywgMHhhNmFjLCAweDAwZWUsIDB4MDAzZSwKKwkweDA4MDQsIDB4YzkwZCwgMHgwODBjLCAweGE4OWIsIDB4MDBlZSwgMHgwMDNlLCAweDE5MDQsIDB4YzkwZCwKKwkweDA4MDQsIDB4YzhjZSwgMHgwMGM2LCAweDYwMjAsIDB4OTA4NCwgMHgwMDBmLCAweDAwMTMsIDB4MDBjZSwKKwkweDAwMDUsIDB4Yzk4ZiwgMHhjYTVhLCAweGNiYzQsIDB4Yzk5OSwgMHhhZjc0LCAweGM5OGYsIDB4ZTJiMiwKKwkweGQzYWEsIDB4Y2E1YSwgMHg4ZjY3LCAweGNjNTAsIDB4Yzk4OCwgMHhjOTg4LCAweGM5ODgsIDB4Yzk4OCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweGNlOGUsIDB4MTExMCwgMHgwODBjLCAweGI5MDUsIDB4MDAwNSwKKwkweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweDk3NjMsIDB4MDgwNCwgMHhhZjQzLCAweDYwMWIsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDgwYywgMHhjYzg2LCAweDAxMzAsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4MmMwMCwKKwkweGE4OTYsIDB4MDA5ZSwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsIDB4MDAwMiwKKwkweGM5YjgsIDB4YzliYSwgMHhjOWRlLCAweGM5ZjIsIDB4Y2ExOCwgMHhjOWI4LCAweGM5OGYsIDB4Yzk4ZiwKKwkweGM5OGYsIDB4YzlmMiwgMHhjOWYyLCAweGM5YjgsIDB4YzliOCwgMHhjOWI4LCAweGM5YjgsIDB4YzlmYywKKwkweDA4MGMsIDB4MGRkNSwgMHgwMGU2LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4ODAsIDB4YzBiNSwKKwkweGE4ODIsIDB4MDA5ZSwgMHgyMDcxLCAweDE5ZTYsIDB4NzAyNCwgMHg5YzA2LCAweDAxYTAsIDB4MDgwYywKKwkweGE1MzMsIDB4MDgwYywgMHhkMzQyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywKKwkweDAwMDIsIDB4MjAwMSwgMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywKKwkweDk3NjMsIDB4MDBlZSwgMHgwMDA1LCAweDYwMWIsIDB4MDAwMSwgMHgwY2Q4LCAweDAwOTYsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg4MCwgMHhjMGI1LCAweGE4ODIsIDB4MDA5ZSwgMHgwODBjLCAweGQzNDIsIDB4NjAwNywKKwkweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywKKwkweDk3NjMsIDB4MDAwNSwgMHgwMDk2LCAweDYwMWIsIDB4MDAwMSwgMHg2MDE0LCAweDIwNDgsIDB4YTg4MCwKKwkweGMwYjUsIDB4YTg4MiwgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHg1NzY1LCAweDAxYjgsIDB4NjAxNCwKKwkweDAwOTYsIDB4OTA0ZCwgMHgwMTkwLCAweGE4NjQsIDB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAwNiwKKwkweDkwODYsIDB4MDEzOSwgMHgxMTUwLCAweGE4NjcsIDB4MDEzOSwgMHhhODdiLCAweDAwMzAsIDB4YTg5NywKKwkweDQwMDUsIDB4YTg5YiwgMHgwMDA0LCAweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDA4MDQsIDB4YWY0MywKKwkweDYwMTQsIDB4MDA5NiwgMHg5MDRkLCAweDA1YzgsIDB4YTk3YywgMHhkMWU0LCAweDA1YjAsIDB4MjAwMSwKKwkweDE4MGYsIDB4MjAwNCwgMHhkMGM0LCAweDAxMTAsIDB4MDA5ZSwgMHgwMDA1LCAweGE4ODQsIDB4MDA5ZSwKKwkweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4NjExYSwgMHgyMDAxLCAweDAwMzAsIDB4MmMwOCwKKwkweDA4MGMsIDB4MTVmZCwgMHgyMDAxLCAweDAzMGMsIDB4MjAwNCwgMHg5MDg2LCAweDAwNDEsIDB4MTFhMCwKKwkweDYwMTQsIDB4MDA5NiwgMHg5MDRkLCAweDA5MGMsIDB4MGRkNSwgMHhhODgwLCAweGQwZjQsIDB4MTEzMCwKKwkweGMwZjUsIDB4YTg4MiwgMHgwMDllLCAweDYwMWIsIDB4MDAwMiwgMHgwMDcwLCAweDAwOWUsIDB4MjAwMSwKKwkweDAwMzcsIDB4MmMwOCwgMHgwODBjLCAweDE1ZmQsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwKKwkweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweGFmYmUsIDB4MDAwNSwgMHgwMDllLCAweDA4MGMsIDB4MWFhMSwKKwkweDA4MDQsIDB4YzlkZSwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwgMHgxYTBjLCAweDBkZDUsIDB4MDAwYiwKKwkweDAwMDUsIDB4Y2E3MSwgMHhjOTk2LCAweGNhNzMsIDB4Y2E3MSwgMHhjYTczLCAweGNhNzMsIDB4Yzk5MCwKKwkweGNhNzEsIDB4Yzk4YSwgMHhjOThhLCAweGNhNzEsIDB4Y2E3MSwgMHhjYTcxLCAweGNhNzEsIDB4Y2E3MSwKKwkweGNhNzEsIDB4MDgwYywgMHgwZGQ1LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDQsIDB4OTA4NCwKKwkweDAwZmYsIDB4MDBiZSwgMHg5MDhhLCAweDAwMGMsIDB4MWEwYywgMHgwZGQ1LCAweDAwYjYsIDB4MDAxMywKKwkweDAwYmUsIDB4MDAwNSwgMHhjYThlLCAweGNiNWIsIDB4Y2E5MCwgMHhjYWQwLCAweGNhOTAsIDB4Y2FkMCwKKwkweGNhOTAsIDB4Y2E5ZSwgMHhjYThlLCAweGNhZDAsIDB4Y2E4ZSwgMHhjYWJmLCAweDA4MGMsIDB4MGRkNSwKKwkweDYwMDQsIDB4OTA4ZSwgMHgwMDE2LCAweDA1YzAsIDB4OTA4ZSwgMHgwMDA0LCAweDA1YTgsIDB4OTA4ZSwKKwkweDAwMDIsIDB4MDU5MCwgMHg5MDhlLCAweDAwNTIsIDB4MDkwNCwgMHhjYjU3LCAweDYwMDQsIDB4MDgwYywKKwkweGNlOGUsIDB4MDkwNCwgMHhjYjc0LCAweDkwOGUsIDB4MDAwNCwgMHgxMTEwLCAweDA4MGMsIDB4MzI0NywKKwkweDkwOGUsIDB4MDAyMSwgMHgwOTA0LCAweGNiNzgsIDB4OTA4ZSwgMHgwMDIyLCAweDA5MDQsIDB4Y2JiZiwKKwkweDkwOGUsIDB4MDAzZCwgMHgwOTA0LCAweGNiNzgsIDB4OTA4ZSwgMHgwMDM5LCAweDA5MDQsIDB4Y2I3YywKKwkweDkwOGUsIDB4MDAzNSwgMHgwOTA0LCAweGNiN2MsIDB4OTA4ZSwgMHgwMDFlLCAweDAxNzgsIDB4OTA4ZSwKKwkweDAwMDEsIDB4MTE0MCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwKKwkweDAwMDYsIDB4MDExMCwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhiOTA1LCAweDA4MDQsIDB4YWY3NCwKKwkweDAwYzYsIDB4MDBkNiwgMHg2MTA0LCAweDkxODYsIDB4MDAxNiwgMHgwOTA0LCAweGNiNDgsIDB4OTE4NiwKKwkweDAwMDIsIDB4MTkwNCwgMHhjYjFkLCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweGQwOGMsIDB4MTFjOCwKKwkweDA4MGMsIDB4NzQzZSwgMHgxMWIwLCAweDA4MGMsIDB4ZDM4OCwgMHgwMTM4LCAweDA4MGMsIDB4NzQ2MSwKKwkweDExMjAsIDB4MDgwYywgMHg3MzQ4LCAweDA4MDQsIDB4Y2JhOCwgMHgyMDAxLCAweDE5N2MsIDB4MjAwMywKKwkweDAwMDEsIDB4MjAwMSwgMHgxODAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDczNmEsIDB4MDgwNCwKKwkweGNiYTgsIDB4NjAxMCwgMHgyMDU4LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweGQwYWMsIDB4MTkwNCwKKwkweGNiYTgsIDB4YjhhMCwgMHg5MDg0LCAweGZmODAsIDB4MTkwNCwgMHhjYmE4LCAweGI4NDAsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTAwNSwgMHgwMTkwLCAweDgwMDEsIDB4Yjg0MiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywKKwkweDAwMDcsIDB4NjAxYiwgMHgwMzk4LCAweDYwNDMsIDB4MDAwMCwgMHgwODBjLCAweGFlZWQsIDB4MDEyOCwKKwkweDJiMDAsIDB4NjAxMiwgMHg2MDIzLCAweDAwMDEsIDB4MDQ1OCwgMHgwMGRlLCAweDAwY2UsIDB4NjAwNCwKKwkweDkwOGUsIDB4MDAwMiwgMHgxMWEwLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwKKwkweDExNzAsIDB4MjAwOSwgMHgxODM3LCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDAwZTYsIDB4MjA3MSwKKwkweDE4MDAsIDB4MDgwYywgMHg2MDQwLCAweDAwZWUsIDB4MDgwYywgMHhiOTA1LCAweDAwMzAsIDB4MDgwYywKKwkweGI5MDUsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHgzMjQ3LCAweDAxMmUsIDB4MDBlZSwgMHgwODBjLCAweGFmNzQsIDB4MDAwNSwKKwkweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwKKwkweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsIDB4MDBkZSwgMHgwMGNlLCAweDBjODAsIDB4MDgwYywKKwkweDMyNDcsIDB4MDgwNCwgMHhjYWNjLCAweDAwYzYsIDB4MDBkNiwgMHg2MTA0LCAweDkxODYsIDB4MDAxNiwKKwkweDBkMzgsIDB4NjAxMCwgMHgyMDU4LCAweGI4NDAsIDB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MDkwNCwKKwkweGNiMWQsIDB4ODAwMSwgMHhiODQyLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywKKwkweDk3NjMsIDB4MDBkZSwgMHgwMGNlLCAweDA4OTgsIDB4MDgwYywgMHhiOTA1LCAweDA4MDQsIDB4Y2FjZSwKKwkweDA4MGMsIDB4Yjk0MSwgMHgwODA0LCAweGNhY2UsIDB4MDBkNiwgMHgyYzY4LCAweDYxMDQsIDB4MDgwYywKKwkweGQzMDAsIDB4MDBkZSwgMHgwMTE4LCAweDA4MGMsIDB4YWY0MywgMHgwNDA4LCAweDYwMDQsIDB4ODAwNywKKwkweDYxMzQsIDB4OTE4YywgMHgwMGZmLCAweDkxMDUsIDB4NjAzNiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywKKwkweDAwMGIsIDB4NjAyMywgMHgwMDAyLCAweDYwM2MsIDB4NjAwYSwgMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwKKwkweDYwMWEsIDB4NjAyYywgMHgyYzA4LCAweDIwNjAsIDB4NjAyNCwgMHhkMGI0LCAweDAxMDgsIDB4YzA4NSwKKwkweGMwYjUsIDB4NjAyNiwgMHgyMTYwLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDAwZGUsIDB4MDBjZSwgMHgwODBjLCAweGI5MDUsIDB4MDgwYywgMHgzMjFlLCAweDAwZTYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDMyNDcsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwNywKKwkweDYwMWIsIDB4MDM5OCwgMHg2MDQzLCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MDgwYywKKwkweGIzNzQsIDB4MTkwNCwgMHhjYjc0LCAweDAwMDUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywKKwkweDBkZDUsIDB4MDA5NiwgMHgwMGQ2LCAweDAwMWIsIDB4MDBkZSwgMHgwMDllLCAweDAwMDUsIDB4Y2JkZiwKKwkweGNiZGYsIDB4Y2JkZiwgMHhjYmRmLCAweGNiZGYsIDB4Y2JkZiwgMHhjYmRmLCAweGNiZGYsIDB4Y2JkZiwKKwkweGM5OGYsIDB4Y2JkZiwgMHhjOTk2LCAweGNiZTEsIDB4Yzk5NiwgMHhjYmZiLCAweGNiZGYsIDB4MDgwYywKKwkweDBkZDUsIDB4NjAwNCwgMHg5MDg2LCAweDAwOGIsIDB4MDFiMCwgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwKKwkweDgxMGYsIDB4OTE4NiwgMHgwMDM1LCAweDExMzAsIDB4NjAyYywgMHg5MDgwLCAweDAwMDksIDB4MjAwYywKKwkweGMxODUsIDB4MjEwMiwgMHg2MDA3LCAweDAwOGIsIDB4NjAwMywgMHgwMDBkLCAweDA4MGMsIDB4OTFiMSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsIDB4ZDM3YywgMHgwMTE4LCAweDA4MGMsIDB4ZDM4ZiwKKwkweDAwMTAsIDB4MDgwYywgMHhkMzlkLCAweDA4MGMsIDB4Y2U3MSwgMHgwODBjLCAweGNjODYsIDB4MDU3MCwKKwkweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGNjODYsIDB4MDE2OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NywKKwkweDAxMDMsIDB4YTg3YiwgMHgwMDA2LCAweGE4NzcsIDB4MDAwMCwgMHhhODgwLCAweGMwZWQsIDB4YTg4MiwKKwkweDA4MGMsIDB4NmQxNywgMHgyYzY4LCAweDA4MGMsIDB4YWVlZCwgMHgwMTUwLCAweDY4MTAsIDB4NjAxMiwKKwkweDA4MGMsIDB4ZDEwMiwgMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHhhZjc0LCAweDAwY2UsIDB4MDAwOCwKKwkweDJkNjAsIDB4NjAxNywgMHgwMDAwLCAweDYwMjMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywgMHgwMGM4LCAweDA4MGMsIDB4ZDM3YywKKwkweDAxMzgsIDB4NjAzNCwgMHg5MDg2LCAweDQwMDAsIDB4MTExOCwgMHgwODBjLCAweDMyMWUsIDB4MDhkMCwKKwkweDYwMzQsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwgMHgwMDM5LCAweDAxMTgsIDB4OTE4NiwKKwkweDAwMzUsIDB4MTExOCwgMHgwODBjLCAweDMyMWUsIDB4MDg2OCwgMHgwODBjLCAweGFmNzQsIDB4MDAwNSwKKwkweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGRkNSwgMHgwMDAyLCAweGNjNjYsIDB4Y2M2NiwKKwkweGNjNjgsIDB4Y2M2OCwgMHhjYzY4LCAweGNjNjYsIDB4Y2M2NiwgMHhhZjc0LCAweGNjNjYsIDB4Y2M2NiwKKwkweGNjNjYsIDB4Y2M2NiwgMHhjYzY2LCAweGNjNjYsIDB4Y2M2NiwgMHhjYzY2LCAweDA4MGMsIDB4MGRkNSwKKwkweDA4MGMsIDB4YTg5YiwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwgMHhhODdiLCAweDAwMDYsIDB4MDgwYywKKwkweDZkMTcsIDB4MDA5ZSwgMHgwODA0LCAweGFmNDMsIDB4OTI4NCwgMHgwMDA3LCAweDExNTgsIDB4OTI4MiwKKwkweDFjZDAsIDB4MDI0MCwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5MjAyLCAweDEyMTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwNSwgMHg5MDA2LCAweDBjZTgsIDB4MDA5NiwgMHgwMDI4LCAweDAwOTYsIDB4MDAwNiwKKwkweDYwMTQsIDB4MjA0OCwgMHgwMDBlLCAweDAwMDYsIDB4OTk4NCwgMHhmMDAwLCAweDkwODYsIDB4ZjAwMCwKKwkweDAxMTAsIDB4MDgwYywgMHgxMGFhLCAweDAwMGUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwKKwkweDAwMzYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDYxLCAweDFjZDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzM1NCwgMHg3MDc0LCAweDkzMDIsIDB4MTY0MCwgMHg2MDIwLCAweDkyMDYsIDB4MTFmOCwKKwkweDA4MGMsIDB4ZDM4OCwgMHgwMTgwLCAweDkyODYsIDB4MDAwMSwgMHgxMTY4LCAweDYwMDQsIDB4OTA4NiwKKwkweDAwMDQsIDB4MTE0OCwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwYzYsIDB4MDgwYywKKwkweGFmNzQsIDB4MDBjZSwgMHgwMDYwLCAweDA4MGMsIDB4ZDA3YywgMHgwMTQ4LCAweDA4MGMsIDB4Y2U4ZSwKKwkweDExMTAsIDB4MDgwYywgMHhiOTA1LCAweDAwYzYsIDB4MDgwYywgMHhhZjQzLCAweDAwY2UsIDB4OWNlMCwKKwkweDAwMTgsIDB4NzA2OCwgMHg5YzAyLCAweDEyMDgsIDB4MDhhMCwgMHgwMTJlLCAweDAwMGUsIDB4MDAzZSwKKwkweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDE2LCAweDkxODgsIDB4MTAwMCwKKwkweDIxMGMsIDB4ODFmZiwgMHgwMTI4LCAweDIwNjEsIDB4MWFiMiwgMHg2MTEyLCAweDA4MGMsIDB4MzIxZSwKKwkweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhZWVkLCAweDAxYjAsIDB4NjY1NiwKKwkweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweDU3NjUsIDB4MDExOCwgMHgwODBjLCAweGNkYjUsIDB4MDE2OCwKKwkweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDMsIDB4MjAwOSwgMHgwMDRiLCAweDA4MGMsIDB4YWZiZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGJhYTAsIDB4MDgwYywgMHhhZjkxLCAweDA1NjAsIDB4NjA1NywKKwkweDAwMDAsIDB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4ZDEwMiwgMHg2MDIzLCAweDAwMDMsIDB4MDAxNiwKKwkweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MjI5LCAweDJjMDgsIDB4MDgwYywKKwkweGU0NzcsIDB4MDA3ZSwgMHgwMDFlLCAweGQxODQsIDB4MDEyOCwgMHgwODBjLCAweGFmNDMsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDA3MCwgMHgwODBjLCAweDU3NjUsIDB4MDEyOCwgMHhkMThjLCAweDExNzAsIDB4MDgwYywKKwkweGNkYjUsIDB4MDE0OCwgMHgyMDA5LCAweDAwNGMsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgyOTAwLCAweDYwMTYsIDB4MGM5MCwKKwkweDIwMDksIDB4MDA0ZCwgMHgwMDEwLCAweDIwMDksIDB4MDA0ZSwgMHgwMGY2LCAweDAwYzYsIDB4MDA0NiwKKwkweDAwMTYsIDB4MDgwYywgMHhhZWVkLCAweDJjNzgsIDB4MDVhMCwgMHg3ZTU2LCAweDJiMDAsIDB4NzgxMiwKKwkweDc4MjMsIDB4MDAwMywgMHgwMDE2LCAweDIwMjEsIDB4MDAwNSwgMHgwODBjLCAweGNkYzcsIDB4MDAxZSwKKwkweDkxODYsIDB4MDA0ZCwgMHgwMTE4LCAweDkxODYsIDB4MDA0ZSwgMHgwMTQ4LCAweDIwMDEsIDB4MTk3ZiwKKwkweDIwMGMsIDB4ZDFmYywgMHgwMTY4LCAweDJmNjAsIDB4MDgwYywgMHhhZjQzLCAweDAwZDAsIDB4MjAwMSwKKwkweDE5N2UsIDB4MjAwYywgMHhkMWZjLCAweDAxMjAsIDB4MmY2MCwgMHgwODBjLCAweGFmNDMsIDB4MDA4OCwKKwkweDJmNjAsIDB4MDgwYywgMHg1NzY1LCAweDAxMzgsIDB4ZDE4YywgMHgxMTE4LCAweDA0ZjEsIDB4MDE0OCwKKwkweDAwMTAsIDB4MjkwMCwgMHg3ODE2LCAweDAwMWUsIDB4MDAxNiwgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBjNiwKKwkweDAwNDYsIDB4MDgwYywgMHhhZWVkLCAweDJjNzgsIDB4MDUwOCwgMHg3ZTU2LCAweDJiMDAsIDB4NzgxMiwKKwkweDc4MjMsIDB4MDAwMywgMHgwMDk2LCAweDIwMjEsIDB4MDAwNCwgMHgwNDg5LCAweDAwOWUsIDB4MjAwMSwKKwkweDE5N2QsIDB4MjAwYywgMHhkMWZjLCAweDAxMjAsIDB4MmY2MCwgMHgwODBjLCAweGFmNDMsIDB4MDA2MCwKKwkweDJmNjAsIDB4MDgwYywgMHg1NzY1LCAweDAxMjAsIDB4ZDE4YywgMHgxMTYwLCAweDAwNzEsIDB4MDEzMCwKKwkweDIwMDksIDB4MDA1MiwgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAwNGUsIDB4MDBjZSwKKwkweDAwZmUsIDB4MDAwNSwgMHgyOTAwLCAweDc4MTYsIDB4MGM5OCwgMHgwMGM2LCAweDA4MGMsIDB4NGIxZiwKKwkweDAwY2UsIDB4MTEyMCwgMHgwODBjLCAweGFmNDMsIDB4OTAwNiwgMHgwMDA1LCAweGE4NjcsIDB4MDAwMCwKKwkweGE4NmIsIDB4ODAwMCwgMHgyOTAwLCAweDYwMTYsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA5NiwKKwkweDAwNzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2N2NkLCAweDAxNTgsIDB4MjAwMSwKKwkweGNkY2MsIDB4MDAwNiwgMHg5MDBlLCAweDI0MDAsIDB4MDgwYywgMHg2ZjRhLCAweDA4MGMsIDB4NmQxNywKKwkweDAwMGUsIDB4MDgwNywgMHgyNDE4LCAweDA4MGMsIDB4OTVmMSwgMHhiYWEwLCAweDAwODYsIDB4MjA0MSwKKwkweDAwMDEsIDB4MjAzOSwgMHgwMDAxLCAweDI2MDgsIDB4MDgwYywgMHg5MzZlLCAweDAwOGUsIDB4MDgwYywKKwkweDkyMjksIDB4MmYwOCwgMHgyNjQ4LCAweDA4MGMsIDB4ZTQ3NywgMHhiOTNjLCAweDgxZmYsIDB4MDkwYywKKwkweDk0NDEsIDB4MDgwYywgMHg5NzYzLCAweDAxMmUsIDB4MDA3ZSwgMHgwMDllLCAweDAwMDUsIDB4MDBjNiwKKwkweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWVlZCwgMHgwMTkwLCAweDY2MGEsIDB4MmIwOCwKKwkweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MjAwOSwKKwkweDAwMWYsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwKKwkweDkwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWY5MSwKKwkweDAxYjgsIDB4NjYwYSwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwOCwKKwkweDI5MDAsIDB4NjAxNiwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHgxNzU0LCAweDAwZmUsIDB4MjAwOSwKKwkweDAwMjEsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwKKwkweDkwMDYsIDB4MGNkOCwgMHgyMDA5LCAweDAwM2QsIDB4MDBjNiwgMHgwMTI2LCAweDAwMTYsIDB4MjA5MSwKKwkweDgwMDAsIDB4MDgwYywgMHhhZWVkLCAweDAxOTgsIDB4NjYwYSwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywKKwkweGQxMDIsIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwgMHgwMDFlLCAweDAwMTYsIDB4MDgwYywKKwkweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwKKwkweDBjZDAsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFmOTEsIDB4MDE4OCwKKwkweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwKKwkweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDIwMDksIDB4MDA0NCwgMHgwODMwLCAweDIwMDksIDB4MDA0OSwKKwkweDA4MTgsIDB4MDAyNiwgMHgwMGI2LCAweDYyMTAsIDB4MjI1OCwgMHhiYTNjLCAweDgyZmYsIDB4MDExMCwKKwkweDgyMTEsIDB4YmEzZSwgMHgwMGJlLCAweDAwMmUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4NjAwNCwKKwkweDkwOGUsIDB4MDAwMiwgMHgwMTQwLCAweDkwOGUsIDB4MDAwMywgMHgwMTI4LCAweDkwOGUsIDB4MDAwNCwKKwkweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDA4NiwKKwkweDAwOTYsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDQsIDB4MDFhOCwgMHg2MDE0LCAweDkwNGQsIDB4MDgwYywKKwkweGNjODYsIDB4MDE4MCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwgMHgwMTcwLCAweDYwMjAsIDB4OTBjNiwKKwkweDAwMDMsIDB4MDE0MCwgMHg5MGM2LCAweDAwMDIsIDB4MDEyOCwgMHhhODY4LCAweGQwZmMsIDB4MDExMCwKKwkweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDA5ZSwgMHgwMDhlLCAweDAwMGUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhZjkxLCAweDAxOTgsIDB4MmIwOCwKKwkweDYxMTIsIDB4MDgwYywgMHhkMTAyLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MDgwYywKKwkweDMyMWUsIDB4MjAwOSwgMHgwMDI4LCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4OTE4NiwgMHgwMDE1LCAweDExYTgsIDB4MjAxMSwKKwkweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwNzQsIDB4MTE3OCwgMHgwMGI2LCAweDA4MGMsIDB4YmI1OSwKKwkweDAwYmUsIDB4MDgwYywgMHhiZDdjLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMjksIDB4MDgwYywKKwkweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwNzgsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2OCwKKwkweDAwOWUsIDB4ZDBmYywgMHgwMTQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweGQyYzEsIDB4MDgwYywKKwkweGI5MDUsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MDA5NiwgMHg2MDE0LCAweDkwNGQsIDB4MDkwYywKKwkweDBkZDUsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwKKwkweDAwMDQsIDB4YTg2NywgMHgwMTM5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmQxNywKKwkweDAxMmUsIDB4MDA5ZSwgMHgwODBjLCAweGFmNDMsIDB4MGMzMCwgMHgwMDk2LCAweDkxODYsIDB4MDAxNiwKKwkweDExMjgsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjVlOSwgMHgwMGU4LCAweDkxODYsIDB4MDAxNSwKKwkweDE1MTAsIDB4MjAxMSwgMHgxODI0LCAweDIyMDQsIDB4OTA4NiwgMHgwMDE0LCAweDExZTAsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDY3MzQsIDB4MDBiZSwgMHgwODBjLCAweGJlNGQsIDB4MTE5OCwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4OTAsIDB4MDBiZSwgMHg5MDA1LCAweDAxNjAsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDgwYywgMHg2NWU5LCAweDYwMTQsIDB4MjA0OCwgMHhhODY4LCAweGQwZmMsIDB4MDE3MCwKKwkweDA4MGMsIDB4YjM0OCwgMHgwMDQ4LCAweDYwMTQsIDB4MjA0OCwgMHhhODY4LCAweGQwZmMsIDB4MDUyOCwKKwkweDA4MGMsIDB4YjkwNSwgMHgwODBjLCAweGFmNDMsIDB4MDA5ZSwgMHgwMDA1LCAweDYwMTQsIDB4NjMxMCwKKwkweDIzNTgsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZDUsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwKKwkweGE4OTcsIDB4NDAwMCwgMHg5MDBlLCAweDA4MGMsIDB4NjhiOSwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwKKwkweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweGE5OWEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweDZkMTcsIDB4MDEyZSwgMHgwODBjLCAweGFmNDMsIDB4MDhmOCwgMHg2MDE0LCAweDkwNGQsIDB4MDkwYywKKwkweDBkZDUsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwKKwkweDAwMDQsIDB4YTg2NywgMHgwMTM5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmQxNywKKwkweDAxMmUsIDB4MDgwYywgMHhhZjQzLCAweDA4NDAsIDB4YTg3OCwgMHg5MDg2LCAweDAwMDUsIDB4MTEwOCwKKwkweDAwMDksIDB4MDAwNSwgMHhhODgwLCAweGMwYWQsIDB4YTg4MiwgMHgwMDA1LCAweDYwNDMsIDB4MDAwMCwKKwkweDYwMTcsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDUwLCAweDA4MGMsIDB4OTFiMSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDAwYzYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwKKwkweDAwYmUsIDB4ZDBiYywgMHgwMTIwLCAweDYwMjAsIDB4OTA4NCwgMHgwMDBmLCAweDAwMTMsIDB4MDBjZSwKKwkweDAwMDUsIDB4Yzk4ZiwgMHhjZmIyLCAweGNmYjIsIDB4Y2ZiNSwgMHhlNzg5LCAweGU3YTQsIDB4ZTdhNywKKwkweGM5OGYsIDB4Yzk4ZiwgMHhjOThmLCAweGM5OGYsIDB4Yzk4ZiwgMHhjOThmLCAweGM5OGYsIDB4Yzk4ZiwKKwkweDA4MGMsIDB4MGRkNSwgMHhhMDAxLCAweGEwMDEsIDB4MDAwNSwgMHgwMDk2LCAweDYwMTQsIDB4OTA0ZCwKKwkweDAxMTgsIDB4YTg3YywgMHhkMGU0LCAweDExMTAsIDB4MDA5ZSwgMHgwMDEwLCAweDAwOWUsIDB4MDAwNSwKKwkweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDA1NTAsIDB4MjAwMSwKKwkweDE4MzQsIDB4MjAwNCwgMHg5MDA1LCAweDE1NDAsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4YWVlZCwKKwkweDA1MDgsIDB4NzgxMCwgMHg2MDEyLCAweDA4MGMsIDB4ZDEwMiwgMHg3ODIwLCAweDkwODYsIDB4MDAwMywKKwkweDAxMjgsIDB4NzgwOCwgMHg2MDNhLCAweDJmMDAsIDB4NjAzZSwgMHgwMDIwLCAweDc4MDgsIDB4NjAzZSwKKwkweDJmMDAsIDB4NjAzYSwgMHg2MDJlLCAweDYwMjMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzUsIDB4NjAwMywKKwkweDAwMDEsIDB4Nzk1NCwgMHg2MTU2LCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MmY2MCwKKwkweDAwZmUsIDB4MDAwNSwgMHgyZjYwLCAweDAwZmUsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4NjA0MiwKKwkweDAwMDUsIDB4MDAxNiwgMHgwMDk2LCAweDY4MTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZTQsIDB4MDE4MCwKKwkweGMwZTQsIDB4YTg3ZSwgMHhhODc3LCAweDAwMDAsIDB4YTg5MywgMHgwMDAwLCAweGE4OGYsIDB4MDAwMCwKKwkweGQwY2MsIDB4MDEzMCwgMHhjMGNjLCAweGE4N2UsIDB4YTg3OCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZiMSwKKwkweDY4MzAsIDB4NjAzNiwgMHg5MDhlLCAweDAwMDEsIDB4MDE0OCwgMHg2ODAzLCAweDAwMDIsIDB4OTA4NiwKKwkweDAwMDUsIDB4MDE3MCwgMHg5MDA2LCAweDYwMmUsIDB4NjAzMiwgMHgwMGQwLCAweDY4MWMsIDB4YzA4NSwKKwkweDY4MWUsIDB4NjgwMywgMHgwMDA0LCAweDY4MjQsIDB4YzBmNCwgMHg5MDg1LCAweDBjMDAsIDB4NjgyNiwKKwkweDY4MTQsIDB4MjA0OCwgMHhhOGFjLCAweDY5MzgsIDB4OTEwMiwgMHhhOGIwLCAweDY5M2MsIDB4OTEwMywKKwkweDFlNDgsIDB4NjgzYywgMHg2MDJlLCAweDY4MzgsIDB4OTA4NCwgMHhmZmZjLCAweDY4M2EsIDB4NjAzMiwKKwkweDJkMDAsIDB4NjAzYSwgMHg2ODA4LCAweDYwM2UsIDB4NjkxMCwgMHg2MTEyLCAweDY5NTQsIDB4NjE1NiwKKwkweDYwMjMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzksIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFiMSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDllLCAweDAwMWUsIDB4MDAwNSwgMHg2MDI0LCAweGQwZDQsIDB4MDUxMCwKKwkweGQwZjQsIDB4MTFmOCwgMHg2MDM4LCAweDk0MGEsIDB4NjAzYywgMHg5MzAzLCAweDAyMzAsIDB4OTEwNSwKKwkweDAxMjAsIDB4NjAyNCwgMHhjMGQ0LCAweGMwZjUsIDB4MDA5OCwgMHg2NDNhLCAweDYzM2UsIDB4YWMzZSwKKwkweGFiNDIsIDB4MDA0NiwgMHgwMDM2LCAweDI0MDAsIDB4YWNhYywgMHg5NDAyLCAweGE4MzYsIDB4MjMwMCwKKwkweGFiYjAsIDB4OTMwMywgMHhhODNhLCAweDAwM2UsIDB4MDA0ZSwgMHg2MDI0LCAweGMwZDQsIDB4MDAwMCwKKwkweDYwMjYsIDB4MDAwNSwgMHhkMGY0LCAweDExMzgsIDB4YTgzYywgMHg2MDNhLCAweGE4NDAsIDB4NjAzZSwKKwkweDYwMjQsIDB4YzBmNSwgMHg2MDI2LCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDYwMDQsIDB4OTA4ZSwKKwkweDAwMzQsIDB4MDFiOCwgMHg5MDhlLCAweDAwMzUsIDB4MDFhMCwgMHg5MDhlLCAweDAwMzYsIDB4MDE4OCwKKwkweDkwOGUsIDB4MDAzNywgMHgwMTcwLCAweDkwOGUsIDB4MDAzOCwgMHgwMTU4LCAweDkwOGUsIDB4MDAzOSwKKwkweDAxNDAsIDB4OTA4ZSwgMHgwMDNhLCAweDAxMjgsIDB4OTA4ZSwgMHgwMDNiLCAweDAxMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwKKwkweDAwZTYsIDB4MjAwMSwgMHgxOTgxLCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwMDEsIDB4MDAzMiwKKwkweDA4MGMsIDB4OTAyNywgMHgyMDAxLCAweDE5ODUsIDB4ODJmZiwgMHgxMTEwLCAweDIwMTEsIDB4MDAxNCwKKwkweDIyMDIsIDB4MjAwMSwgMHgxOTgzLCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwNzEsIDB4MTk2YiwKKwkweDcxMWEsIDB4NzIxZSwgMHgyMDAxLCAweDAwNjQsIDB4MDgwYywgMHg5MDI3LCAweDIwMDEsIDB4MTk4NiwKKwkweDgyZmYsIDB4MTExMCwgMHgyMDExLCAweDAwMTQsIDB4MjIwMiwgMHgyMDAxLCAweDE5ODcsIDB4OTI4OCwKKwkweDAwMGEsIDB4MjEwMiwgMHgyMDAxLCAweDFhOTMsIDB4MjEwMiwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywKKwkweDE1ZmQsIDB4MDgwYywgMHg2OWVkLCAweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwKKwkweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwZTYsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDMsIDB4MDAyOCwKKwkweDIwMDEsIDB4MTk4NiwgMHgyMDAzLCAweDAwMTQsIDB4MjA3MSwgMHgxOTZiLCAweDcwMWIsIDB4MDAwMCwKKwkweDcwMWYsIDB4MDdkMCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwOSwgMHgwMDFlLCAweDIxMDIsIDB4MjAwMSwKKwkweDFhOTMsIDB4MjEwMiwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywgMHgxNWZkLCAweDAwZWUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDAwNSwgMHgwMDk2LCAweDYwNTgsIDB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTAzMSwKKwkweDAwOWUsIDB4MDAwNSwgMHgwMDA1LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywKKwkweGFlZWQsIDB4MDE4MCwgMHgyYjA4LCAweDYxMTIsIDB4MGNhOSwgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwKKwkweDYwMTYsIDB4MjAwOSwgMHgwMDMzLCAweDA4MGMsIDB4YWZiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDA5NiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwKKwkweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDE1MDAsIDB4NzA5MCwgMHg5MDg2LCAweDAwMTgsIDB4MTFlMCwKKwkweDYwMTQsIDB4MjA0OCwgMHhhYTNjLCAweGQyZTQsIDB4MTE2MCwgMHgyYzc4LCAweDA4MGMsIDB4OTlmOSwKKwkweDAxZDgsIDB4NzA3YywgMHhhYTUwLCAweDkyMDYsIDB4MTE2MCwgMHg3MDgwLCAweGFhNTQsIDB4OTIwNiwKKwkweDExNDAsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmFhMCwgMHgwMGJlLCAweDkwMGUsIDB4MDgwYywKKwkweDMyNjcsIDB4MDgwYywgMHhiMzQ4LCAweDAwMjAsIDB4MDgwYywgMHhiOTA1LCAweDA4MGMsIDB4YWY0MywKKwkweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwMDUsIDB4NzA2MCwgMHhhYTU0LCAweDkyMDYsIDB4MGQ0OCwKKwkweDBjODAsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGFlZWQsIDB4MDE4OCwKKwkweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwKKwkweDIwMDksIDB4MDA0ZCwgMHgwODBjLCAweGFmYmUsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwKKwkweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAxNiwKKwkweDA4MGMsIDB4YWVlZCwgMHgwMTgwLCAweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGQxMDIsIDB4NjAyMywKKwkweDAwMDEsIDB4MjkwMCwgMHg2MDE2LCAweDAwMWUsIDB4MDgwYywgMHhhZmJlLCAweDkwODUsIDB4MDAwMSwKKwkweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMWUsIDB4OTAwNiwgMHgwY2QwLCAweDAwMTYsIDB4MDAyNiwKKwkweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNjYsIDB4MDA5NiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwKKwkweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDE1NjgsIDB4NzE5MCwgMHg2MDE0LCAweDIwNDgsIDB4YTgxNCwKKwkweDgwMDMsIDB4OTEwNiwgMHgxNTMwLCAweDIwZTEsIDB4MDAwMCwgMHgyMDAxLCAweDE5OWYsIDB4MjAwMywKKwkweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MzAsIDB4MjBhOCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywKKwkweDkwOTQsIDB4MDAzZiwgMHgyMmU4LCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwKKwkweDIwMDEsIDB4MTk5ZiwgMHgwMDE2LCAweDIwMGMsIDB4MDgwYywgMHhkOTliLCAweDAwMWUsIDB4YTgwNCwKKwkweDkwMDUsIDB4MDExMCwgMHgyMDQ4LCAweDBjMzgsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywKKwkweDAwMTAsIDB4MDgwYywgMHhiOTA1LCAweDA4MGMsIDB4YWY0MywgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwKKwkweDAwNmUsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDA5NiwKKwkweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDExYjgsIDB4NzA5MCwKKwkweDkwODYsIDB4MDAwNCwgMHgxMTk4LCAweDYwMTQsIDB4MjA0OCwgMHgyYzc4LCAweDA4MGMsIDB4OTlmOSwKKwkweDAxYTgsIDB4NzA3YywgMHhhYTc0LCAweDkyMDYsIDB4MTEzMCwgMHg3MDgwLCAweGFhNzgsIDB4OTIwNiwKKwkweDExMTAsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4YjM0OCwgMHgwMDIwLCAweDA4MGMsIDB4YjkwNSwKKwkweDA4MGMsIDB4YWY0MywgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDcwNjAsIDB4YWE3OCwKKwkweDkyMDYsIDB4MGQ3OCwgMHgwYzgwLCAweDAwOTYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTgwMCwKKwkweDkxODYsIDB4MDAxNSwgMHgxNTUwLCAweDcwOTAsIDB4OTA4NiwgMHgwMDA0LCAweDE1MzAsIDB4NjAxNCwKKwkweDIwNDgsIDB4MmM3OCwgMHgwODBjLCAweDk5ZjksIDB4MDVmMCwgMHg3MDdjLCAweGFhY2MsIDB4OTIwNiwKKwkweDExODAsIDB4NzA4MCwgMHhhYWQwLCAweDkyMDYsIDB4MTE2MCwgMHgwODBjLCAweDMyMWUsIDB4MDAxNiwKKwkweGE5OTgsIDB4YWFiMCwgMHg5Mjg0LCAweDEwMDAsIDB4YzBmZCwgMHgwODBjLCAweDU3MGMsIDB4MDAxZSwKKwkweDAwMTAsIDB4MDgwYywgMHg1NGY3LCAweDA4MGMsIDB4Y2M4NiwgMHgwNTA4LCAweGE4N2IsIDB4MDAwMCwKKwkweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDAsIDB4MDA4MCwgMHgwODBjLCAweGNjODYsIDB4MDFiOCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDU0ZjcsIDB4MWQ3MCwgMHhhODdiLCAweDAwMzAsIDB4YTg4MywKKwkweDAwMDAsIDB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweGE4NjcsIDB4MDEzOSwgMHgwODBjLCAweDZkMTcsIDB4MDEyZSwgMHgwODBjLCAweGFmNDMsIDB4MDBmZSwKKwkweDAwZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDcwNjAsIDB4YWFkMCwgMHg5MjA2LCAweDA5MzAsIDB4MDg4OCwKKwkweDAwMTYsIDB4MDAyNiwgMHhhODdjLCAweGQwYWMsIDB4MDE3OCwgMHhhOTM4LCAweGFhMzQsIDB4MjEwMCwKKwkweDkyMDUsIDB4MDE1MCwgMHhhODkwLCAweDkxMDYsIDB4MTExOCwgMHhhODhjLCAweDkyMDYsIDB4MDEyMCwKKwkweGE5OTIsIDB4YWE4ZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwKKwkweDAwZDYsIDB4MDAzNiwgMHgwODBjLCAweGNjODYsIDB4MDkwNCwgMHhkMmJkLCAweDAwOTYsIDB4NjMxNCwKKwkweDIzNDgsIDB4YTg3YSwgMHhhOTgyLCAweDkyOWUsIDB4NDAwMCwgMHgxNTgwLCAweDYzMTAsIDB4MDBjNiwKKwkweDIzNTgsIDB4MjAwOSwgMHgwMDAwLCAweGE4NjgsIDB4ZDBmNCwgMHgxMTQwLCAweDA4MGMsIDB4NjhiOSwKKwkweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweGFhOTYsIDB4YTk5YSwKKwkweDIwYTksIDB4MDAwNCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMzEsIDB4MjBhMCwKKwkweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDkwODAsIDB4MDAwNiwgMHgyMDk4LCAweDA4MGMsIDB4MGY3YywKKwkweDIwYTksIDB4MDAwNCwgMHhhODVjLCAweDkwODAsIDB4MDAzNSwgMHgyMGEwLCAweGI4YzgsIDB4OTA4MCwKKwkweDAwMGEsIDB4MjA5OCwgMHgwODBjLCAweDBmN2MsIDB4MDBjZSwgMHgwMDkwLCAweGFhOTYsIDB4MzkxOCwKKwkweDkzOTgsIDB4MDAwNywgMHgyMzFjLCAweDYwMDQsIDB4OTA4NiwgMHgwMDE2LCAweDAxMTAsIDB4YTg5YiwKKwkweDAwMDQsIDB4YWJhMiwgMHg2MzEwLCAweDIzNTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4YTg5ZSwKKwkweDA4MGMsIDB4NmQwYiwgMHg2MDE3LCAweDAwMDAsIDB4MDA5ZSwgMHgwMDNlLCAweDAwZGUsIDB4MDBiZSwKKwkweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDBiNiwgMHgwMDk2LCAweDAwZjYsIDB4NjIxNCwKKwkweDIyNDgsIDB4NjIxMCwgMHgyMjU4LCAweDIwNzksIDB4MDI2MCwgMHg5MDk2LCAweDAwMDAsIDB4MTFhMCwKKwkweGI4MTQsIDB4OTA4NCwgMHgwMGZmLCAweDkwMGUsIDB4MDgwYywgMHgyODdjLCAweDIxMTgsIDB4ODMxZiwKKwkweDkzOWMsIDB4ZmYwMCwgMHg3ODM4LCAweDkwODQsIDB4MDBmZiwgMHg5MzFkLCAweDdjM2MsIDB4MjAxMSwKKwkweDgwMTgsIDB4MDgwYywgMHg0YjdmLCAweDAwYTgsIDB4OTA5NiwgMHgwMDAxLCAweDExNDgsIDB4ODlmZiwKKwkweDAxODAsIDB4YTg5YiwgMHgwMDBkLCAweDc4MzgsIDB4YThhNiwgMHg3ODNjLCAweGE4YWEsIDB4MDA0OCwKKwkweDkwOTYsIDB4MDAwMiwgMHgxMTMwLCAweGE4OWIsIDB4MDAwZCwgMHg3ODM4LCAweGE4YTYsIDB4NzgzYywKKwkweGE4YWEsIDB4MDBmZSwgMHgwMDllLCAweDAwYmUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwKKwkweDAwYzYsIDB4MDAyNiwgMHgwMDE2LCAweDkxODYsIDB4MDAzNSwgMHgwMTEwLCAweDZhMzgsIDB4MDAwOCwKKwkweDZhMmMsIDB4MDgwYywgMHhjYzc0LCAweDAxZjAsIDB4MjI2MCwgMHg2MTIwLCAweDkxODYsIDB4MDAwMywKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDA2LCAweDExOTAsIDB4NjgzOCwgMHg5MjA2LCAweDAxNDAsIDB4NjgzYywKKwkweDkyMDYsIDB4MTE2MCwgMHg2MTA4LCAweDY4MzgsIDB4OTEwNiwgMHgxMTQwLCAweDAwMjAsIDB4NjAwOCwKKwkweDY5M2MsIDB4OTEwNiwgMHgxMTE4LCAweDYwMTAsIDB4NjkxMCwgMHg5MTA2LCAweDAwMWUsIDB4MDAyZSwKKwkweDAwY2UsIDB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNjOCwgMHhhOTc0LCAweGQxY2MsIDB4MDE4OCwKKwkweDkxOGMsIDB4MDBmZiwgMHg5MThlLCAweDAwMDIsIDB4MTE2MCwgMHhhOWE4LCAweDkxOGMsIDB4MGYwMCwKKwkweDgxMGYsIDB4OTE4ZSwgMHgwMDAxLCAweDExMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywKKwkweGMzM2QsIDB4MDAwNSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwMDEwLCAweDAwMzYsIDB4OTAxZSwKKwkweDA0OTksIDB4MDFlMCwgMHgwODBjLCAweGNjODYsIDB4MDFjOCwgMHgwODBjLCAweGNlNzEsIDB4NjAzNywKKwkweDQwMDAsIDB4NjAxNCwgMHg2MDE3LCAweDAwMDAsIDB4MDA5NiwgMHgyMDQ4LCAweGE4N2MsIDB4MDgwYywKKwkweGNlOGUsIDB4MTExOCwgMHgwODBjLCAweGI5MDUsIDB4MDA0MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3NywKKwkweDAwMDAsIDB4ODNmZiwgMHgxMTI5LCAweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwKKwkweGE4ODAsIDB4ZDBiNCwgMHgwMTI4LCAweGE4N2IsIDB4MDAwNiwgMHhjMGVjLCAweGE4ODIsIDB4MDA0OCwKKwkweGQwYmMsIDB4MDExOCwgMHhhODdiLCAweDAwMDIsIDB4MDAyMCwgMHhhODdiLCAweDAwMDUsIDB4MDgwYywKKwkweGNmODIsIDB4YTg3NywgMHgwMDAwLCAweDAwMDUsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBlYywKKwkweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMGY0LCAweDAwMGUsIDB4MDAwNSwKKwkweDAwMDYsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDBlLCAweDAwMDUsIDB4MDAzNiwKKwkweDAwNDYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YmJhMCwgMHgwMGJlLCAweDIwMjEsIDB4MDAwNywKKwkweDA4MGMsIDB4NGQzNiwgMHgwMDRlLCAweDAwM2UsIDB4MDAwNSwgMHgwYzUxLCAweDFkODEsIDB4MDAwNSwKKwkweDIwMDEsIDB4MTk4NSwgMHgyMDA0LCAweDYwMWEsIDB4MDAwNSwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwKKwkweDYwNDIsIDB4MDAwNSwgMHgwODBjLCAweGFmNDMsIDB4MDgwNCwgMHg5NzYzLCAweDAwYjYsIDB4MDA2NiwKKwkweDYwMDAsIDB4OTBiMiwgMHgwMDE2LCAweDFhMGMsIDB4MGRkNSwgMHgwMDFiLCAweDAwNmUsIDB4MDBiZSwKKwkweDAwMDUsIDB4ZDNjOSwgMHhkYWY4LCAweGRjNTUsIDB4ZDNjOSwgMHhkM2M5LCAweGQzYzksIDB4ZDNjOSwKKwkweGQzYzksIDB4ZDQwMCwgMHhkY2Q5LCAweGQzYzksIDB4ZDNjOSwgMHhkM2M5LCAweGQzYzksIDB4ZDNjOSwKKwkweGQzYzksIDB4MDgwYywgMHgwZGQ1LCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywKKwkweDBkZDUsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4ZDNlNCwgMHhlMjRiLCAweGQzZTQsIDB4ZDNlNCwKKwkweGQzZTQsIDB4ZDNlNCwgMHhkM2U0LCAweGQzZTQsIDB4ZTFmOCwgMHhlMjlmLCAweGQzZTQsIDB4ZThjNCwKKwkweGU4ZmEsIDB4ZThjNCwgMHhlOGZhLCAweGQzZTQsIDB4MDgwYywgMHgwZGQ1LCAweDYwMDAsIDB4OTA4MiwKKwkweDAwMTYsIDB4MWEwYywgMHgwZGQ1LCAweDYwMDAsIDB4MDAwYSwgMHgwMDA1LCAweGQzZmUsIDB4ZGViNywKKwkweGRmYTksIDB4ZGZjYywgMHhlMDhjLCAweGQzZmUsIDB4ZTE2YiwgMHhlMTE0LCAweGRjZTUsIDB4ZTFjZSwKKwkweGUxZTMsIDB4ZDNmZSwgMHhkM2ZlLCAweGQzZmUsIDB4ZDNmZSwgMHhkM2ZlLCAweDA4MGMsIDB4MGRkNSwKKwkweDkxYjIsIDB4MDA1MywgMHgxYTBjLCAweDBkZDUsIDB4MjEwMCwgMHg5MWIyLCAweDAwNDAsIDB4MWEwNCwKKwkweGQ4NmMsIDB4MDAwMiwgMHhkNDRhLCAweGQ2M2EsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDY0MywKKwkweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwKKwkweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwKKwkweGQ0NGEsIDB4ZDQ0YywgMHhkNGFmLCAweGQ0YmUsIDB4ZDUyMiwgMHhkNTRkLCAweGQ1YzYsIDB4ZDYyNSwKKwkweGQ0NGEsIDB4ZDQ0YSwgMHhkNjQ2LCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNjViLCAweGQ2NjgsIDB4ZDQ0YSwKKwkweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDcwZSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDcyMiwKKwkweGQ0NGEsIDB4ZDQ0YSwgMHhkNmRkLCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ3M2EsIDB4ZDQ0YSwKKwkweGQ0NGEsIDB4ZDQ0YSwgMHhkN2I3LCAweGQ0NGEsIDB4ZDQ0YSwgMHhkNDRhLCAweGQ0NGEsIDB4ZDQ0YSwKKwkweGQ0NGEsIDB4ZDgzNCwgMHgwODBjLCAweDBkZDUsIDB4MDgwYywgMHg2OWNhLCAweDExNTAsIDB4MjAwMSwKKwkweDE4MzcsIDB4MjAwNCwgMHhkMGNjLCAweDExMjgsIDB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwKKwkweDExNDAsIDB4NjAwNywgMHgwMDA5LCAweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDAwMDAsIDB4MDgwNCwKKwkweGQ2MzMsIDB4MDgwYywgMHg2OTY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwKKwkweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4OTM1NiwKKwkweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDkyMjksIDB4MmMwOCwgMHgwODBjLCAweGU0NzcsIDB4MDA3ZSwKKwkweDAwMWUsIDB4MDAxZSwgMHgwMDJlLCAweDAwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDY2MTAsIDB4MjY1OCwKKwkweDA4MGMsIDB4NjZhOCwgMHhiZTA0LCAweDk2ODQsIDB4MDBmZiwgMHg5MDgyLCAweDAwMDYsIDB4MTI2OCwKKwkweDAwMTYsIDB4MDAyNiwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYWEwLCAweDAwYmUsIDB4MmMwOCwKKwkweDA4MGMsIDB4ZWIyMywgMHgwMDJlLCAweDAwMWUsIDB4MTE3OCwgMHgwODBjLCAweGUzYTksIDB4MTkwNCwKKwkweGQ1MWEsIDB4MDgwYywgMHhlMzQ1LCAweDExMjAsIDB4NjAwNywgMHgwMDA4LCAweDA4MDQsIDB4ZDYzMywKKwkweDYwMDcsIDB4MDAwOSwgMHgwODA0LCAweGQ2MzMsIDB4MDgwYywgMHhlNWNkLCAweDAxMjgsIDB4MDgwYywKKwkweGUzYTksIDB4MGQ3OCwgMHgwODA0LCAweGQ1MWEsIDB4NjAxNywgMHgxOTAwLCAweDBjODgsIDB4MDgwYywKKwkweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDYxMDYsIDB4MDgwYywgMHhlMmZhLCAweDYwMDcsIDB4MDAwNiwKKwkweDA4MDQsIDB4ZDYzMywgMHg2MDA3LCAweDAwMDcsIDB4MDgwNCwgMHhkNjMzLCAweDA4MGMsIDB4ZTkzNiwKKwkweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDAwZDYsIDB4NjYxMCwKKwkweDI2NTgsIDB4YmUwNCwgMHg5Njg0LCAweDAwZmYsIDB4OTA4MiwgMHgwMDA2LCAweDEyMjAsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHg2NWQ1LCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwKKwkweDAxODgsIDB4OTY4NiwgMHgwMDA0LCAweDAxNzAsIDB4YmUwNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDE0MCwgMHg5Njg2LCAweDAwMDQsIDB4MDEyOCwgMHg5Njg2LCAweDAwMDUsIDB4MDExMCwKKwkweDAwZGUsIDB4MDQ4MCwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHg3MDM0LCAweDkwODQsIDB4MDAwMywKKwkweDExNDAsIDB4NzAzNCwgMHg5MDgyLCAweDAwMTQsIDB4MDIyMCwgMHg3MDMwLCAweDkwODQsIDB4MDAwMywKKwkweDAxMzAsIDB4MDBlZSwgMHg2MDE3LCAweDAwMDAsIDB4NjAyZiwgMHgwMDA3LCAweDAwYjAsIDB4MDBlZSwKKwkweDA4MGMsIDB4ZTQwZCwgMHgxMTkwLCAweDk2ODYsIDB4MDAwNiwgMHgxMTQwLCAweDAwMjYsIDB4NjIxMCwKKwkweDIyNTgsIDB4YmFhMCwgMHg5MDBlLCAweDA4MGMsIDB4MzI2NywgMHgwMDJlLCAweDA4MGMsIDB4NjczNCwKKwkweDYwMDcsIDB4MDAwYSwgMHgwMGRlLCAweDA4MDQsIDB4ZDYzMywgMHg2MDA3LCAweDAwMGIsIDB4MDBkZSwKKwkweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDYwMDcsIDB4MDAwMSwKKwkweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweGU5MzYsIDB4MTkwNCwgMHhkODY5LCAweDA4MGMsIDB4MzM0MiwKKwkweDE5MDQsIDB4ZDg2OSwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwgMHg5MGI0LCAweDAwMDMsIDB4MTk0OCwKKwkweDkwYjIsIDB4MDAxNCwgMHgwYTMwLCAweDcwMzAsIDB4OTA4NCwgMHgwMDAzLCAweDE5MTAsIDB4NjYxMCwKKwkweDI2NTgsIDB4YmUwNCwgMHg5Njg2LCAweDA3MDcsIDB4MDllOCwgMHgwMDI2LCAweDYyMTAsIDB4MjI1OCwKKwkweGJhYTAsIDB4OTAwZSwgMHgwODBjLCAweDMyNjcsIDB4MDAyZSwgMHg2MDA3LCAweDAwMGMsIDB4MjAwMSwKKwkweDAwMDEsIDB4MDgwYywgMHhlYjAzLCAweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweDY5Y2EsIDB4MTE0MCwKKwkweDIwMDEsIDB4MTgzNywgMHgyMDA0LCAweDkwODQsIDB4MDAwOSwgMHg5MDg2LCAweDAwMDgsIDB4MTExMCwKKwkweDA4MDQsIDB4ZDQ1OSwgMHgwODBjLCAweDY5NjYsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NCwKKwkweDAwZmYsIDB4OTA4MiwgMHgwMDA2LCAweDA2YzgsIDB4MTEzOCwgMHgwMDI2LCAweDIwMDEsIDB4MDAwNiwKKwkweDA4MGMsIDB4NjYxNSwgMHgwMDJlLCAweDAwNTAsIDB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwKKwkweDAwMDQsIDB4MDEyMCwgMHg5Njg2LCAweDAwMDYsIDB4MTkwNCwgMHhkNTFhLCAweDA4MGMsIDB4ZTQxYSwKKwkweDExMjAsIDB4NjAwNywgMHgwMDBlLCAweDA4MDQsIDB4ZDYzMywgMHgwMDQ2LCAweDY0MTAsIDB4MjQ1OCwKKwkweGJjYTAsIDB4MDA0NiwgMHgwODBjLCAweDMyMWUsIDB4MDgwYywgMHhkMzlkLCAweDAwNGUsIDB4MDAxNiwKKwkweDkwMDYsIDB4MjAwOSwgMHgxODQ4LCAweDIxMGMsIDB4ZDFhNCwgMHgwMTQ4LCAweDIwMDksIDB4MDAyOSwKKwkweDA4MGMsIDB4ZTczYSwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MDAxZSwKKwkweDAwNGUsIDB4NjAwNywgMHgwMDAxLCAweDA4MDQsIDB4ZDYzMywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDY1ZDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwKKwkweDE4MDUsIDB4MjAxMSwgMHgwMjcwLCAweDA4MGMsIDB4YmVmZCwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAxNWUsIDB4OTAwNSwgMHgwMTY4LCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODIsIDB4MDAwNCwKKwkweDBhMDQsIDB4ZDUxYSwgMHg5NjgyLCAweDAwMDcsIDB4MGEwNCwgMHhkNTc2LCAweDA4MDQsIDB4ZDUxYSwKKwkweDYwMTcsIDB4MTkwMCwgMHg2MDA3LCAweDAwMDksIDB4MDgwNCwgMHhkNjMzLCAweDA4MGMsIDB4NjljYSwKKwkweDExNDAsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwKKwkweDExMTAsIDB4MDgwNCwgMHhkNDU5LCAweDA4MGMsIDB4Njk2NiwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwKKwkweDk2ODQsIDB4MDBmZiwgMHgwMDA2LCAweDkwODYsIDB4MDAwMSwgMHgwMDBlLCAweDAxNzAsIDB4OTA4MiwKKwkweDAwMDYsIDB4MDY5OCwgMHgwMTUwLCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNCwKKwkweDAxMjAsIDB4OTY4NiwgMHgwMDA2LCAweDE5MDQsIDB4ZDUxYSwgMHgwODBjLCAweGU0NDgsIDB4MTEzMCwKKwkweDA4MGMsIDB4ZTM0NSwgMHgxMTE4LCAweDYwMDcsIDB4MDAxMCwgMHgwNGU4LCAweDAwNDYsIDB4NjQxMCwKKwkweDI0NTgsIDB4YmNhMCwgMHgwMDQ2LCAweDA4MGMsIDB4MzIxZSwgMHgwODBjLCAweGQzOWQsIDB4MDA0ZSwKKwkweDAwMTYsIDB4OTAwNiwgMHgyMDA5LCAweDE4NDgsIDB4MjEwYywgMHhkMWE0LCAweDAxNDgsIDB4MjAwOSwKKwkweDAwMjksIDB4MDgwYywgMHhlNzNhLCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGMwZTUsIDB4YjgwMiwKKwkweDAwMWUsIDB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDBmMCwgMHgwODBjLCAweGU1Y2QsIDB4MDE0MCwKKwkweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwOTc4LCAweDA4MDQsIDB4ZDUxYSwKKwkweDYwMTcsIDB4MTkwMCwgMHg2MDA3LCAweDAwMDksIDB4MDA3MCwgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwKKwkweGQ4NjksIDB4MDgwYywgMHhlOTM2LCAweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweGRhMzYsIDB4MTkwNCwKKwkweGQ1MWEsIDB4NjAwNywgMHgwMDEyLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywKKwkweDk3NjMsIDB4MDAwNSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwKKwkweDA4MGMsIDB4OTc2MywgMHgwY2IwLCAweDYwMDcsIDB4MDAwNSwgMHgwYzY4LCAweDA4MGMsIDB4ZTkzNiwKKwkweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDA4MGMsIDB4ZGEzNiwKKwkweDE5MDQsIDB4ZDUxYSwgMHg2MDA3LCAweDAwMjAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsIDB4MzM0MiwgMHgxOTA0LCAweGQ4NjksIDB4NjAwNywKKwkweDAwMjMsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDA4MGMsIDB4ZTkzNiwgMHgxOTA0LCAweGQ4NjksIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwKKwkweDA4MGMsIDB4ZGEzNiwgMHgxOTA0LCAweGQ1MWEsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwKKwkweDAyNjAsIDB4MmMwOCwgMHgyMDExLCAweDE4MjAsIDB4MjIxNCwgMHg3MDNjLCAweDkyMDYsIDB4MTFlMCwKKwkweDIwMTEsIDB4MTgxZiwgMHgyMjE0LCAweDcwMzgsIDB4OTA4NCwgMHgwMGZmLCAweDkyMDYsIDB4MTFhMCwKKwkweDcyNDAsIDB4MDgwYywgMHhjYzc0LCAweDA1NzAsIDB4MjI2MCwgMHg2MDA4LCAweDkwODYsIDB4ZmZmZiwKKwkweDAxMjAsIDB4NzI0NCwgMHg2MDA4LCAweDkyMDYsIDB4MTUyOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNywKKwkweDE1MDgsIDB4MDgwYywgMHhhZjQzLCAweDA0YTAsIDB4NzI0NCwgMHg5Mjg2LCAweGZmZmYsIDB4MDE4MCwKKwkweDJjMDgsIDB4MDgwYywgMHhjYzc0LCAweDAxYjAsIDB4MjI2MCwgMHg3MjQwLCAweDYwMDgsIDB4OTIwNiwKKwkweDExODgsIDB4NjAxMCwgMHg5MTkwLCAweDAwMDQsIDB4MjIxNCwgMHg5MjA2LCAweDAxYjgsIDB4MDA1MCwKKwkweDcyNDAsIDB4MmMwOCwgMHg5MDA2LCAweDA4MGMsIDB4ZTcwNCwgMHgxMTgwLCAweDcyNDQsIDB4OTI4NiwKKwkweGZmZmYsIDB4MDFiMCwgMHgyMTYwLCAweDYwMDcsIDB4MDAyNiwgMHg2MDE3LCAweDE3MDAsIDB4NzIxNCwKKwkweDkyOTYsIDB4ZmZmZiwgMHgxMTgwLCAweDYwMDcsIDB4MDAyNSwgMHgwMDY4LCAweDYwMjAsIDB4OTA4NiwKKwkweDAwMDcsIDB4MWQ4MCwgMHg2MDA0LCAweDkwODYsIDB4MDAyNCwgMHgxMTEwLCAweDA4MGMsIDB4YWY0MywKKwkweDIxNjAsIDB4NjAwNywgMHgwMDI1LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywKKwkweDk3NjMsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDY1ZDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwKKwkweDE4MDUsIDB4MjAxMSwgMHgwMjc2LCAweDA4MGMsIDB4YmVmZCwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAxNWUsIDB4MDEyMCwgMHg2MDA3LCAweDAwMzEsIDB4MDgwNCwgMHhkNjMzLCAweDA4MGMsIDB4YmI3MSwKKwkweDA4MGMsIDB4NzQzZSwgMHgxMTkwLCAweDAwMDYsIDB4MDAyNiwgMHgwMDM2LCAweDA4MGMsIDB4NzQ1OCwKKwkweDExMzgsIDB4MDgwYywgMHg3NzI0LCAweDA4MGMsIDB4NjBhZCwgMHgwODBjLCAweDczNmEsIDB4MDAxMCwKKwkweDA4MGMsIDB4NzQxNiwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwMDA1LCAweDA4MGMsIDB4MzM0MiwKKwkweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweGRhMzYsIDB4MTkwNCwgMHhkNTFhLCAweDYxMDYsIDB4MDgwYywKKwkweGRhNTIsIDB4MTEyMCwgMHg2MDA3LCAweDAwMmIsIDB4MDgwNCwgMHhkNjMzLCAweDYwMDcsIDB4MDAyYywKKwkweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweGU5MzYsIDB4MTkwNCwgMHhkODY5LCAweDA4MGMsIDB4MzM0MiwKKwkweDE5MDQsIDB4ZDg2OSwgMHgwODBjLCAweGRhMzYsIDB4MTkwNCwgMHhkNTFhLCAweDYxMDYsIDB4MDgwYywKKwkweGRhNTcsIDB4MTEyMCwgMHg2MDA3LCAweDAwMmUsIDB4MDgwNCwgMHhkNjMzLCAweDYwMDcsIDB4MDAyZiwKKwkweDA4MDQsIDB4ZDYzMywgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDAwZTYsIDB4MDBkNiwKKwkweDAwYzYsIDB4NjAxMCwgMHgyMDU4LCAweGI5MDQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwKKwkweDAxNTgsIDB4OTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDBjZSwKKwkweDAwZGUsIDB4MDBlZSwgMHgwODA0LCAweGQ2M2EsIDB4MDgwYywgMHg1NzYxLCAweGQwZTQsIDB4MDkwNCwKKwkweGQ3YjQsIDB4MjA3MSwgMHgwMjZjLCAweDcwMTAsIDB4NjAzYSwgMHg3MDE0LCAweDYwM2UsIDB4NzEwOCwKKwkweDcyMGMsIDB4MDgwYywgMHg2YTA4LCAweDAxNDAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MTAsIDB4OTEwNiwKKwkweDExMTgsIDB4YjgxNCwgMHg5MjA2LCAweDA1MTAsIDB4MDgwYywgMHg2YTA0LCAweDE1YjgsIDB4MjA2OSwKKwkweDE4MDAsIDB4Njg4MCwgMHg5MjA2LCAweDE1OTAsIDB4Njg3YywgMHg5MTA2LCAweDE1NzgsIDB4NzIxMCwKKwkweDA4MGMsIDB4Y2M3NCwgMHgwNTkwLCAweDA4MGMsIDB4ZDkyMSwgMHgwNTc4LCAweDA4MGMsIDB4ZTdiNiwKKwkweDA1NjAsIDB4NjIyZSwgMHg2MDA3LCAweDAwMzYsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFiMSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDcyMTQsIDB4OTI4NiwKKwkweGZmZmYsIDB4MDE1MCwgMHgwODBjLCAweGNjNzQsIDB4MDFjMCwgMHg5MjgwLCAweDAwMDIsIDB4MjAwNCwKKwkweDcxMTAsIDB4OTEwNiwgMHgxMTkwLCAweDA4ZTAsIDB4NzIxMCwgMHgyYzA4LCAweDkwODUsIDB4MDAwMSwKKwkweDA4MGMsIDB4ZTcwNCwgMHgyYzEwLCAweDIxNjAsIDB4MDE0MCwgMHgwODkwLCAweDYwMDcsIDB4MDAzNywKKwkweDYwMmYsIDB4MDAwOSwgMHg2MDE3LCAweDE1MDAsIDB4MDhiOCwgMHg2MDA3LCAweDAwMzcsIDB4NjAyZiwKKwkweDAwMDMsIDB4NjAxNywgMHgxNzAwLCAweDA4ODAsIDB4NjAwNywgMHgwMDEyLCAweDA4NjgsIDB4MDgwYywKKwkweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDYwMTAsIDB4MjA1OCwgMHhiODA0LCAweDkwODQsIDB4ZmYwMCwKKwkweDgwMDcsIDB4OTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4ZDYzYSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwKKwkweDA4MGMsIDB4NTc2MSwgMHhkMGU0LCAweDA5MDQsIDB4ZDgyYywgMHgyMDY5LCAweDE4MDAsIDB4MjA3MSwKKwkweDAyNmMsIDB4NzAwOCwgMHg2MDNhLCAweDcyMGMsIDB4NjIzZSwgMHg5Mjg2LCAweGZmZmYsIDB4MTE1MCwKKwkweDcyMDgsIDB4MDBjNiwgMHgyYzA4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweGU3MDQsIDB4MmMxMCwKKwkweDAwY2UsIDB4MDVlOCwgMHgwODBjLCAweGNjNzQsIDB4MDVkMCwgMHg3MTA4LCAweDkyODAsIDB4MDAwMiwKKwkweDIwMDQsIDB4OTEwNiwgMHgxNWEwLCAweDAwYzYsIDB4MDAyNiwgMHgyMjYwLCAweDA4MGMsIDB4Yzg5OCwKKwkweDAwMmUsIDB4MDBjZSwgMHg3MTE4LCAweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAwMSwKKwkweDAxNzgsIDB4OTE4NiwgMHgwMDA1LCAweDAxMTgsIDB4OTE4NiwgMHgwMDA3LCAweDExOTgsIDB4OTI4MCwKKwkweDAwMDUsIDB4MjAwNCwgMHg5MDA1LCAweDAxNzAsIDB4MDgwYywgMHhkOTIxLCAweDA5MDQsIDB4ZDdhZCwKKwkweDAwNTYsIDB4NzUxMCwgMHg3NjE0LCAweDA4MGMsIDB4ZTdjZiwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwKKwkweDAwZWUsIDB4MDAwNSwgMHg2MDA3LCAweDAwM2IsIDB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MmEwMCwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDBjNzgsIDB4NjAwNywKKwkweDAwM2IsIDB4NjAyZiwgMHgwMDAzLCAweDYwMTcsIDB4MDMwMCwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDBjMTAsIDB4NjAwNywgMHgwMDNiLCAweDYwMmYsIDB4MDAwYiwKKwkweDYwMTcsIDB4MDAwMCwgMHgwODA0LCAweGQ3ODQsIDB4MDBlNiwgMHgwMDI2LCAweDA4MGMsIDB4NjljYSwKKwkweDA1NTAsIDB4MDgwYywgMHg2OTY2LCAweDA4MGMsIDB4ZTlhOCwgMHgxNTE4LCAweDIwNzEsIDB4MTgwMCwKKwkweDcwZGMsIDB4OTA4NSwgMHgwMDAzLCAweDcwZGUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzJiMCwKKwkweDkyODQsIDB4MDBmZiwgMHg3MDdlLCAweDc4ZTYsIDB4OTI4NCwgMHhmZjAwLCAweDcyODAsIDB4OTIwNSwKKwkweDcwODIsIDB4NzhlYSwgMHgwMGZlLCAweDcwZTcsIDB4MDAwMCwgMHgwODBjLCAweDZhMDgsIDB4MDEyMCwKKwkweDIwMTEsIDB4MTlmZiwgMHgyMDEzLCAweDA3ZDAsIDB4ZDBhYywgMHgxMTI4LCAweDA4MGMsIDB4MmZmNSwKKwkweDAwMTAsIDB4MDgwYywgMHhlOWRhLCAweDAwMmUsIDB4MDBlZSwgMHgwODBjLCAweGFmNDMsIDB4MDgwNCwKKwkweGQ2MzksIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLCAweGQ4ODAsIDB4ZDhiMSwKKwkweGQ4YzIsIDB4ZDg4MCwgMHhkODgwLCAweGQ4ODIsIDB4ZDhkMywgMHhkODgwLCAweGQ4ODAsIDB4ZDg4MCwKKwkweGQ4OWYsIDB4ZDg4MCwgMHhkODgwLCAweGQ4ODAsIDB4ZDhkZSwgMHhkOGViLCAweGQ5MWMsIDB4ZDg4MCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweGU5MzYsIDB4MWQyMCwgMHgwODBjLCAweDMzNDIsIDB4MWQwOCwKKwkweDA4MGMsIDB4ZGEzNiwgMHgxMTQ4LCAweDcwMzgsIDB4NjAxNiwgMHg2MDA3LCAweDAwNDUsIDB4NjAwMywKKwkweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDAwMDUsIDB4MDgwYywgMHgzMjFlLCAweDA4MGMsIDB4ZDM5ZCwKKwkweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MWY5LCAweDAwMDUsIDB4MDgwYywKKwkweGU5MzYsIDB4MTkzOCwgMHgwODBjLCAweDMzNDIsIDB4MTkyMCwgMHgwODBjLCAweGRhMzYsIDB4MWQ2MCwKKwkweDcwM2MsIDB4NjAxNiwgMHg2MDA3LCAweDAwNGEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwKKwkweDAwMDUsIDB4MDgwYywgMHgzMzQyLCAweDE5MDQsIDB4ZDg2OSwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywKKwkweGU5ZTMsIDB4NjAwNywgMHgwMDQ3LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxZjksIDB4MDgwYywKKwkweDk3NjMsIDB4MDAwNSwgMHgwODBjLCAweDMzNDIsIDB4MTkwNCwgMHhkODY5LCAweDIwMDksIDB4MDA0MiwKKwkweDA4MGMsIDB4ZTllMywgMHg2MDA3LCAweDAwNDcsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsIDB4MzM0MiwgMHgxOTA0LCAweGQ4NjksIDB4MjAwOSwKKwkweDAwNDYsIDB4MDgwYywgMHhlOWUzLCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDA4MGMsIDB4ZDkzZSwKKwkweDA5MDQsIDB4ZDg2OSwgMHg2MDA3LCAweDAwNGUsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFmOSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDYwMDcsIDB4MDA0ZiwgMHg2MDE3LCAweDAwMDAsIDB4NzEzNCwKKwkweDkxOGMsIDB4MDBmZiwgMHg4MWZmLCAweDA1MDgsIDB4OTE4NiwgMHgwMDAxLCAweDExNjAsIDB4NzE0MCwKKwkweDIwMDEsIDB4MTliYywgMHgyMDA0LCAweDkxMDYsIDB4MTFiMCwgMHg3MTQ0LCAweDIwMDEsIDB4MTliZCwKKwkweDIwMDQsIDB4OTEwNiwgMHgwMTkwLCAweDkxODYsIDB4MDAwMiwgMHgxMTY4LCAweDIwMTEsIDB4MDI3NiwKKwkweDIwYTksIDB4MDAwNCwgMHg2MDEwLCAweDAwOTYsIDB4MjA0OCwgMHgyMDE5LCAweDAwMGEsIDB4MDgwYywKKwkweGJmMTEsIDB4MDA5ZSwgMHgwMTEwLCAweDYwMTcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywKKwkweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4NjAwNywgMHgwMDUwLCAweDcwM2MsIDB4NjAxNiwKKwkweDBjYTAsIDB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHgwMGI2LCAweDAwYzYsIDB4MjI2MCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGNjLCAweGQwODQsIDB4MDE1MCwgMHg3MTI4LCAweDYwNDQsIDB4OTEwNiwKKwkweDExMjAsIDB4NzEyYywgMHg2MDQ4LCAweDkxMDYsIDB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBjZSwgMHgwMGJlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA5NiwKKwkweDAwODYsIDB4MDBlNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzA5MCwgMHg5MDhhLCAweDAwZjksIDB4MTZlOCwgMHgyMGUxLCAweDAwMDAsIDB4MjAwMSwKKwkweDE5OWYsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4MTAxOCwgMHgwNWEwLCAweDI5MDAsIDB4NjAxNiwKKwkweDcwOTAsIDB4ODAwNCwgMHhhODE2LCAweDkwOGEsIDB4MDAxZSwgMHgwMmQwLCAweGE4MzMsIDB4MDAxZSwKKwkweDIwYTksIDB4MDAxZSwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwKKwkweDIwMDEsIDB4MTk5ZiwgMHgwMDE2LCAweDIwMGMsIDB4MDQ3MSwgMHgwMDFlLCAweDI5NDAsIDB4MDgwYywKKwkweDEwMTgsIDB4MDFjMCwgMHgyOTAwLCAweGEwMDYsIDB4MjEwMCwgMHg4MWZmLCAweDAxODAsIDB4MGMxOCwKKwkweGE4MzIsIDB4MjBhOCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwKKwkweDIwMDEsIDB4MTk5ZiwgMHgwMDE2LCAweDIwMGMsIDB4MDBiMSwgMHgwMDFlLCAweDAwMDAsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDA0OCwgMHgyMDcxLCAweDE4MDAsIDB4NzA5MywgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4MGZiMSwgMHg5MDA2LCAweDAxMmUsIDB4MDFkZSwgMHgwMWNlLCAweDAwZWUsIDB4MDA4ZSwKKwkweDAwOWUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwKKwkweDkxOGMsIDB4ZmZmZiwgMHgxMWE4LCAweDA4MGMsIDB4MjNlOSwgMHgyMDk5LCAweDAyNmMsIDB4MjAwMSwKKwkweDAwMTQsIDB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDAwZjgsIDB4MjBhOCwKKwkweDQwMDMsIDB4MjJhOCwgMHg4MTA4LCAweDA4MGMsIDB4MjNlOSwgMHgyMDk5LCAweDAyNjAsIDB4MGNhOCwKKwkweDA4MGMsIDB4MjNlOSwgMHgyMDYxLCAweDE5OWYsIDB4NjAwNCwgMHgyMDk4LCAweDYwMDgsIDB4MzUxOCwKKwkweDkzMTIsIDB4MTIxOCwgMHgyM2E4LCAweDQwMDMsIDB4MDA0OCwgMHgyMGE4LCAweDQwMDMsIDB4MjJhOCwKKwkweDgxMDgsIDB4MDgwYywgMHgyM2U5LCAweDIwOTksIDB4MDI2MCwgMHgwY2E4LCAweDIwNjEsIDB4MTk5ZiwKKwkweDIwMTksIDB4MDI4MCwgMHgzMzAwLCAweDkzMWUsIDB4MDExMCwgMHg2MDA2LCAweDAwMjAsIDB4MjAwMSwKKwkweDAyNjAsIDB4NjAwNiwgMHg4MTA4LCAweDIxNjIsIDB4OTI5MiwgMHgwMDIxLCAweDkyOTYsIDB4ZmZmZiwKKwkweDYyMGEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwKKwkweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4ODFmZiwgMHgxMWI4LCAweDA4MGMsIDB4MjQwMSwKKwkweDIwYTEsIDB4MDI0YywgMHgyMDAxLCAweDAwMTQsIDB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwKKwkweDQwMDMsIDB4MDQxOCwgMHgyMGE4LCAweDQwMDMsIDB4ODJmZiwgMHgwMWY4LCAweDIyYTgsIDB4ODEwOCwKKwkweDA4MGMsIDB4MjQwMSwgMHgyMGExLCAweDAyNDAsIDB4MGM5OCwgMHgwODBjLCAweDI0MDEsIDB4MjA2MSwKKwkweDE5YTIsIDB4NjAwNCwgMHgyMGEwLCAweDYwMDgsIDB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwKKwkweDQwMDMsIDB4MDA1OCwgMHgyMGE4LCAweDQwMDMsIDB4ODJmZiwgMHgwMTM4LCAweDIyYTgsIDB4ODEwOCwKKwkweDA4MGMsIDB4MjQwMSwgMHgyMGExLCAweDAyNDAsIDB4MGM5OCwgMHgyMDYxLCAweDE5YTIsIDB4MjAxOSwKKwkweDAyNjAsIDB4MzQwMCwgMHg5MzFlLCAweDAxMTAsIDB4NjAwNiwgMHgwMDIwLCAweDIwMDEsIDB4MDI0MCwKKwkweDYwMDYsIDB4ODEwOCwgMHgyMTYyLCAweDkyOTIsIDB4MDAyMSwgMHg5Mjk2LCAweGZmZmYsIDB4NjIwYSwKKwkweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA2NiwKKwkweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwKKwkweDAxNzAsIDB4OTY4NiwgMHgwMDA0LCAweDAxNTgsIDB4YmUwNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDEyOCwgMHg5Njg2LCAweDAwMDQsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDA2ZSwKKwkweDAwYmUsIDB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4ZGFjZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwKKwkweDA4MGMsIDB4ZGFkYiwgMHgxNTIwLCAweDY4MGMsIDB4OTA4YywgMHhmZjAwLCAweDY4MjAsIDB4OTA4NCwKKwkweDAwZmYsIDB4OTExNSwgMHg2MjE2LCAweDY4MjQsIDB4NjAyZSwgMHhkMWU0LCAweDAxMzAsIDB4OTAwNiwKKwkweDA4MGMsIDB4ZWIwMywgMHgyMDA5LCAweDAwMDEsIDB4MDA3OCwgMHhkMWVjLCAweDAxODAsIDB4NjkyMCwKKwkweDkxOGMsIDB4MDBmZiwgMHg2ODI0LCAweDA4MGMsIDB4Mjg3YywgMHgxMTQ4LCAweDIwMDEsIDB4MDAwMSwKKwkweDA4MGMsIDB4ZWIwMywgMHgyMTEwLCAweDkwMGUsIDB4MDgwYywgMHgzMjY3LCAweDAwMTgsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwZGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDgwYywKKwkweGFmOTEsIDB4MDVhOCwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwKKwkweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI4N2MsIDB4MTU3OCwgMHgwODBjLCAweDY2MzgsIDB4MTU2MCwKKwkweGJlMTIsIDB4YmQxNiwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywKKwkweGU5MzYsIDB4MTFkOCwgMHgwODBjLCAweDMzNDIsIDB4MTFjMCwgMHgwODBjLCAweGRhMzYsIDB4MDUxMCwKKwkweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTksIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjYxNSwKKwkweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4OTFmOSwgMHgwODBjLCAweDk3NjMsIDB4MDAxMCwgMHgwODBjLCAweGFmNDMsIDB4OTA4NSwKKwkweDAwMDEsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHhhZjQzLCAweDAwY2UsIDB4MDAyZSwKKwkweDAwMWUsIDB4MGNhOCwgMHgwODBjLCAweGFmNDMsIDB4OTAwNiwgMHgwYzk4LCAweDIwNjksIDB4MDI2ZCwKKwkweDY4MDAsIDB4OTA4MiwgMHgwMDEwLCAweDEyMjgsIDB4NjAxNywgMHgwMDAwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDgsIDB4OTAwNiwgMHgwMDA1LCAweDYwMTcsIDB4MDAwMCwgMHgyMDY5LCAweDAyNmMsIDB4NjgwOCwKKwkweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDA4MDAsIDB4MTE5MCwgMHg2OTA0LCAweDkxODYsIDB4MDAxOCwKKwkweDAxMTgsIDB4OTE4NiwgMHgwMDE0LCAweDExNTgsIDB4ODEwZiwgMHg2ODAwLCAweDkwODQsIDB4MDBmZiwKKwkweDkxMGQsIDB4NjE1YSwgMHg5MDhlLCAweDAwMTQsIDB4MDExMCwgMHg5MDhlLCAweDAwMTAsIDB4MDAwNSwKKwkweDYwMDQsIDB4OTBiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGRkNSwgMHg5MWI2LCAweDAwMTMsIDB4MTEzMCwKKwkweDIwMDgsIDB4OTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4ZGMyNSwgMHgwMDkyLCAweDkxYjYsIDB4MDAyNywKKwkweDAxMjAsIDB4OTFiNiwgMHgwMDE0LCAweDE5MGMsIDB4MGRkNSwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywKKwkweDY2MTUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweGRiNTgsIDB4ZGI1YSwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYjVhLCAweGRiNjksIDB4ZGMxZSwKKwkweGRiYmIsIDB4ZGMxZSwgMHhkYmNmLCAweGRjMWUsIDB4ZGI2OSwgMHhkYzFlLCAweGRjMTYsIDB4ZGMxZSwKKwkweGRjMTYsIDB4ZGMxZSwgMHhkYzFlLCAweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwKKwkweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNWEsIDB4ZGI1OCwKKwkweGRjMWUsIDB4ZGI1OCwgMHhkYjU4LCAweGRjMWUsIDB4ZGI1OCwgMHhkYzFiLCAweGRjMWUsIDB4ZGI1OCwKKwkweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRjMWUsIDB4ZGMxZSwgMHhkYjU4LCAweGRjMWUsIDB4ZGMxZSwKKwkweGRiNTgsIDB4ZGI2NCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwgMHhkYjU4LCAweGRjMWEsIDB4ZGMxZSwKKwkweGRiNTgsIDB4ZGI1OCwgMHhkYzFlLCAweGRjMWUsIDB4ZGI1OCwgMHhkYjU4LCAweGRiNTgsIDB4ZGI1OCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywgMHhkM2EwLCAweDYwMDMsIDB4MDAwMiwKKwkweDA4MGMsIDB4OTc2MywgMHgwODA0LCAweGRjMjQsIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MDgwNCwKKwkweGRjMWUsIDB4MDgwYywgMHg2YTA0LCAweDE5MDQsIDB4ZGMxZSwgMHg5MDA2LCAweDA4MGMsIDB4NjVkNSwKKwkweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkwODYsIDB4MDBmZiwgMHgxMTQwLCAweDAwZjYsIDB4MjA3OSwKKwkweDE4MDAsIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4MDBmZSwgMHgwNDI4LCAweDYwMTAsIDB4MjA1OCwKKwkweGI4YzAsIDB4OTAwNSwgMHgxMTc4LCAweDA4MGMsIDB4ZDM4OCwgMHgxOTA0LCAweGRjMWUsIDB4MDAzNiwKKwkweDAwNDYsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDcsIDB4MDgwYywgMHg0ZDM2LCAweDAwNGUsIDB4MDAzZSwKKwkweDA4MDQsIDB4ZGMxZSwgMHgwODBjLCAweDMzNzMsIDB4MTkwNCwgMHhkYzFlLCAweDIwMDEsIDB4MTgwMCwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDExMzgsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzhhOCwKKwkweDgwMDAsIDB4NzhhYSwgMHgwMGZlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTksIDB4MDgwYywKKwkweDk2NTcsIDB4NjAyMywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywKKwkweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDYxMTAsIDB4MjE1OCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywKKwkweDg1YmUsIDB4MDgwNCwgMHhkYzI0LCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2YjQsIDB4ZmYwMCwKKwkweDg2MzcsIDB4OTY4NiwgMHgwMDA2LCAweDA5MDQsIDB4ZGMxZSwgMHg5Njg2LCAweDAwMDQsIDB4MDkwNCwKKwkweGRjMWUsIDB4MDgwYywgMHg4ZDcwLCAweDIwMDEsIDB4MDAwNCwgMHgwODA0LCAweGRjMWMsIDB4MjAwMSwKKwkweDE4MDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTE1OCwgMHgwMDM2LCAweDAwNDYsIDB4NjAxMCwKKwkweDIwNTgsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDYsIDB4MDgwYywgMHg0ZDM2LCAweDAwNGUsIDB4MDAzZSwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweGRjNDIsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4MDA2NiwKKwkweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwMDZlLCAweDAxNjgsIDB4MjAwMSwKKwkweDAwMDYsIDB4MDgwYywgMHg2NjE1LCAweDkyODQsIDB4MDBmZiwgMHg5MDhlLCAweDAwMDcsIDB4MTEyMCwKKwkweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTksIDB4MDgwYywgMHg2YTA0LCAweDExZjgsIDB4MjAwMSwKKwkweDE4MzcsIDB4MjAwNCwgMHhkMGE0LCAweDAxZDAsIDB4YmUwNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwKKwkweDAwMDYsIDB4MDFhMCwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3OGE4LCAweDgwMDAsIDB4NzhhYSwKKwkweDAwZmUsIDB4MDgwNCwgMHhkYmEzLCAweDIwMDEsIDB4MDAwNCwgMHgwMDMwLCAweDIwMDEsIDB4MDAwNiwKKwkweDA0NDksIDB4MDAyMCwgMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg2NjE1LCAweDA4MGMsIDB4OTY1NywKKwkweDA4MGMsIDB4YWY0MywgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHgyNjAwLCAweDAwMDIsIDB4ZGMzOSwKKwkweGRjMzksIDB4ZGMzOSwgMHhkYzM5LCAweGRjMzksIDB4ZGMzYiwgMHhkYzM5LCAweGRjM2IsIDB4ZGMzOSwKKwkweGRjMzksIDB4ZGMzYiwgMHhkYzM5LCAweGRjMzksIDB4ZGMzOSwgMHhkYzNiLCAweGRjM2IsIDB4ZGMzYiwKKwkweGRjM2IsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweGFmNDMsIDB4MDgwYywKKwkweDk3NjMsIDB4MDAwNSwgMHgwMDE2LCAweDAwYjYsIDB4MDBkNiwgMHg2MTEwLCAweDIxNTgsIDB4YjkwMCwKKwkweGQxODQsIDB4MDEzOCwgMHgwODBjLCAweDY1ZTksIDB4OTAwNiwgMHgwODBjLCAweDY1ZDUsIDB4MDgwYywKKwkweDMyNDcsIDB4MDBkZSwgMHgwMGJlLCAweDAwMWUsIDB4MDAwNSwgMHg2NjEwLCAweDI2NTgsIDB4YjgwNCwKKwkweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwYjIsIDB4MDAwYywgMHgxYTBjLCAweDBkZDUsIDB4OTFiNiwKKwkweDAwMTUsIDB4MTExMCwgMHgwMDNiLCAweDAwMjgsIDB4OTFiNiwgMHgwMDE2LCAweDE5MGMsIDB4MGRkNSwKKwkweDAwNmIsIDB4MDAwNSwgMHhiOWVlLCAweGI5ZWUsIDB4YjllZSwgMHhiOWVlLCAweGRjZDcsIDB4YjllZSwKKwkweGRjYzEsIDB4ZGM4MiwgMHhiOWVlLCAweGI5ZWUsIDB4YjllZSwgMHhiOWVlLCAweGI5ZWUsIDB4YjllZSwKKwkweGI5ZWUsIDB4YjllZSwgMHhkY2Q3LCAweGI5ZWUsIDB4ZGNjMSwgMHhkY2M4LCAweGI5ZWUsIDB4YjllZSwKKwkweGI5ZWUsIDB4YjllZSwgMHgwMGY2LCAweDA4MGMsIDB4NmEwNCwgMHgxMWQ4LCAweDA4MGMsIDB4ZDM4OCwKKwkweDExYzAsIDB4NjAxMCwgMHg5MDVkLCAweDAxYTgsIDB4YjhjMCwgMHg5MDA1LCAweDAxOTAsIDB4OTAwNiwKKwkweDA4MGMsIDB4NjVkNSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2NWU5LCAweDYwMjMsIDB4MDAwMSwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg5MWY5LCAweDA4MGMsIDB4OTc2MywKKwkweDAwZjAsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4Mjg3YywKKwkweDExYjAsIDB4MDgwYywgMHg2Njk5LCAweDAxMTgsIDB4MDgwYywgMHhhZjQzLCAweDAwODAsIDB4YjgxMCwKKwkweDAwMDYsIDB4YjgxNCwgMHgwMDA2LCAweGI4YzAsIDB4MDAwNiwgMHgwODBjLCAweDYwYzcsIDB4MDAwZSwKKwkweGI4YzIsIDB4MDAwZSwgMHhiODE2LCAweDAwMGUsIDB4YjgxMiwgMHgwODBjLCAweGFmNDMsIDB4MDBmZSwKKwkweDAwMDUsIDB4NjYwNCwgMHg5NmI2LCAweDAwMWUsIDB4MTExMCwgMHgwODBjLCAweGFmNDMsIDB4MDAwNSwKKwkweDA4MGMsIDB4YmQ3OSwgMHgxMTQ4LCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywKKwkweDkxZjksIDB4MDgwYywgMHg5NzYzLCAweDAwMTAsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4MDgwNCwKKwkweGFmNDMsIDB4NjAwNCwgMHg5MDhhLCAweDAwNTMsIDB4MWEwYywgMHgwZGQ1LCAweDA4MGMsIDB4OTY1NywKKwkweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwKKwkweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsIDB4ZGNmZSwgMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywKKwkweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsIDB4ZGNmYywKKwkweGRjZmMsIDB4ZGNmYywgMHhkY2ZjLCAweGRjZmMsIDB4MDgwYywgMHgwZGQ1LCAweDAwOTYsIDB4MDBiNiwKKwkweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAwNDYsIDB4MDAyNiwgMHg2MjEwLCAweDIyNTgsIDB4YjhiYywKKwkweDkwMDUsIDB4MTFhOCwgMHg2MTA2LCAweDIwNzEsIDB4MDI2MCwgMHg3NDQ0LCAweDk0YTQsIDB4ZmYwMCwKKwkweDA5MDQsIDB4ZGQ2NCwgMHgwODBjLCAweGVhZjcsIDB4MTE3MCwgMHg5NDg2LCAweDIwMDAsIDB4MTE1OCwKKwkweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAyMDAsIDB4MDgwYywgMHg4NzlhLCAweDAwMjAsIDB4OTAyNiwKKwkweDA4MGMsIDB4ZTk3YiwgMHgwYzM4LCAweDA4MGMsIDB4MGZmZiwgMHgwOTBjLCAweDBkZDUsIDB4NjAwMywKKwkweDAwMDcsIDB4YTg2NywgMHgwMTBkLCAweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGFjOGEsIDB4MmMwMCwKKwkweGE4OGUsIDB4NjAwOCwgMHhhOGUyLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDcxMzAsIDB4YTk3YSwKKwkweDAwMTYsIDB4YTg3NiwgMHhhODdmLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4ODcsIDB4MDAzNiwKKwkweDA4MGMsIDB4NmQxNywgMHgwMDFlLCAweDA4MGMsIDB4ZWFmNywgMHgxOTA0LCAweGRkYzQsIDB4OTQ4NiwKKwkweDIwMDAsIDB4MTEzMCwgMHgyMDE5LCAweDAwMTcsIDB4MDgwYywgMHhlNmFlLCAweDA4MDQsIDB4ZGRjNCwKKwkweDk0ODYsIDB4MDIwMCwgMHgxMTIwLCAweDA4MGMsIDB4ZTY0YSwgMHgwODA0LCAweGRkYzQsIDB4OTQ4NiwKKwkweDA0MDAsIDB4MDEyMCwgMHg5NDg2LCAweDEwMDAsIDB4MTkwNCwgMHhkZGM0LCAweDIwMTksIDB4MDAwMiwKKwkweDA4MGMsIDB4ZTY2NSwgMHgwODA0LCAweGRkYzQsIDB4MjA2OSwgMHgxYTcwLCAweDZhMDAsIDB4ZDI4NCwKKwkweDA5MDQsIDB4ZGUyZSwgMHg5Mjg0LCAweDAzMDAsIDB4MTkwNCwgMHhkZTI3LCAweDY4MDQsIDB4OTAwNSwKKwkweDA5MDQsIDB4ZGUwZiwgMHgyZDc4LCAweDYwMDMsIDB4MDAwNywgMHgwODBjLCAweDEwMTgsIDB4MDkwNCwKKwkweGRkZDAsIDB4NzgwMCwgMHhkMDhjLCAweDExMTgsIDB4NzgwNCwgMHg4MDAxLCAweDc4MDYsIDB4NjAxNywKKwkweDAwMDAsIDB4MjAwMSwgMHgxODBmLCAweDIwMDQsIDB4ZDA4NCwgMHgxOTA0LCAweGRlMzIsIDB4OTAwNiwKKwkweGE4MDIsIDB4YTg2NywgMHgwMTE2LCAweGE4NmEsIDB4NjAwOCwgMHhhOGUyLCAweDJjMDAsIDB4YTg3YSwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDcxMzAsIDB4YTliNiwgMHhhODc2LCAweGI5MjgsIDB4YTliYSwKKwkweGI5MmMsIDB4YTliZSwgMHhiOTMwLCAweGE5YzIsIDB4YjkzNCwgMHhhOWM2LCAweGE4ODMsIDB4MDAzZCwKKwkweDcwNDQsIDB4OTA4NCwgMHgwMDAzLCAweDkwODAsIDB4ZGRjYywgMHgyMDA1LCAweGE4N2UsIDB4MjBhOSwKKwkweDAwMGEsIDB4MjAwMSwgMHgwMjcwLCAweGFhNWMsIDB4OTI5MCwgMHgwMDIxLCAweDIwMDksIDB4MDIwNSwKKwkweDIwMGIsIDB4MDA4MCwgMHgyMGUxLCAweDAwMDAsIDB4YWI2MCwgMHgyM2U4LCAweDIwOTgsIDB4MjJhMCwKKwkweDQwMDMsIDB4MjAwYiwgMHgwMDAwLCAweDIwMDEsIDB4MDI3YSwgMHgyMDBjLCAweGE5YjIsIDB4ODAwMCwKKwkweDIwMGMsIDB4YTlhZSwgMHgwODBjLCAweDZkMTcsIDB4MDAyZSwgMHgwMDRlLCAweDAwZmUsIDB4MDBlZSwKKwkweDAwZGUsIDB4MDBiZSwgMHgwMDllLCAweDAwMDUsIDB4MDAwMCwgMHgwMDgwLCAweDAwNDAsIDB4MDAwMCwKKwkweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwODQsIDB4MDEyMCwgMHgwODBjLCAweDBmZmYsIDB4MTkwNCwKKwkweGRkNzksIDB4NjAxNywgMHhmMTAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MDgwYywKKwkweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDBjMDAsIDB4MjA2OSwgMHgwMjYwLCAweDY4NDgsIDB4OTA4NCwKKwkweGZmMDAsIDB4OTA4NiwgMHgxMjAwLCAweDExOTgsIDB4Njg2YywgMHg5MDg0LCAweDAwZmYsIDB4MDAxNiwKKwkweDYxMTQsIDB4OTE4YywgMHhmNzAwLCAweDkxMGQsIDB4NjExNiwgMHgwMDFlLCAweDYwMDMsIDB4MDAwMSwKKwkweDYwMDcsIDB4MDA0MywgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDA4MjgsIDB4Njg2OCwKKwkweDYwMmUsIDB4Njg2YywgMHg2MDMyLCAweDYwMTcsIDB4ZjIwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwODA0LCAweGRkYzQsIDB4MjAwMSwKKwkweDE4MGUsIDB4MjAwNCwgMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4NGI3ZiwKKwkweDYwMTcsIDB4ZjMwMCwgMHgwMDEwLCAweDYwMTcsIDB4ZjEwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywKKwkweDAwNDEsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywgMHgwODA0LCAweGRkYzQsIDB4NjAxNywKKwkweGY1MDAsIDB4MGM5OCwgMHg2MDE3LCAweGY2MDAsIDB4MDgwNCwgMHhkZGU0LCAweDYwMTcsIDB4ZjIwMCwKKwkweDA4MDQsIDB4ZGRlNCwgMHhhODY3LCAweDAxNDYsIDB4YTg2YiwgMHgwMDAwLCAweDYwMDgsIDB4YTg4NiwKKwkweDJjMDAsIDB4YTg3YSwgMHg3MDQ0LCAweDkwODQsIDB4MDAwMywgMHg5MDgwLCAweGRkY2MsIDB4MjAwNSwKKwkweGE4N2UsIDB4MjkyOCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHhhODc2LCAweGI4MjgsIDB4YTg4YSwKKwkweGI4MmMsIDB4YTg4ZSwgMHhiODMwLCAweGE4OTIsIDB4YjgzNCwgMHhhODk2LCAweGE4ODMsIDB4MDAzZCwKKwkweDIwMDksIDB4MDIwNSwgMHgyMTA0LCAweDkwODUsIDB4MDA4MCwgMHgyMDBhLCAweDIwZTEsIDB4MDAwMCwKKwkweDIwMTEsIDB4MDIxMCwgMHgyMjE0LCAweDkyOTQsIDB4MGZmZiwgMHhhYWEyLCAweDkyODIsIDB4MDExMSwKKwkweDFhMGMsIDB4MGRkNSwgMHg4MjEwLCAweDgyMWMsIDB4MjAwMSwgMHgwMjZjLCAweDIwOTgsIDB4YTg2MCwKKwkweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMjksIDB4MjBhMCwgMHgyMDExLCAweGRlYWUsIDB4MjA0MSwKKwkweDAwMDEsIDB4MjIzZCwgMHg5Nzg0LCAweDAwZmYsIDB4OTMyMiwgMHgxMjA4LCAweDIzMDAsIDB4MjBhOCwKKwkweDQwMDMsIDB4OTMxYSwgMHgwNTMwLCAweDgyMTAsIDB4ZDdmYywgMHgxMTMwLCAweDhkNjgsIDB4MmQwYSwKKwkweDIwMDEsIDB4MDI2MCwgMHgyMDk4LCAweDBjNjgsIDB4Mjk1MCwgMHgwODBjLCAweDEwMTgsIDB4MDE3MCwKKwkweDI5MDAsIDB4YjAwMiwgMHhhODY3LCAweDAxNDcsIDB4YTg2YiwgMHgwMDAwLCAweGE4NjAsIDB4MjBlOCwKKwkweGE4NWMsIDB4OTA4MCwgMHgwMDFiLCAweDIwYTAsIDB4ODg0MCwgMHgwOGQ4LCAweDI1NDgsIDB4YTgwMCwKKwkweDkwMmQsIDB4MDExOCwgMHgwODBjLCAweDEwMzEsIDB4MGNjOCwgMHgwODBjLCAweDEwMzEsIDB4MDgwNCwKKwkweGRkZDAsIDB4MjU0OCwgMHg4ODQ3LCAweDk4ODUsIDB4MDA0NiwgMHhhODY2LCAweDIwMDksIDB4MDIwNSwKKwkweDIwMGIsIDB4MDAwMCwgMHgwODBjLCAweGU2ZGQsIDB4MDgwNCwgMHhkZGM0LCAweDgwMTAsIDB4MDAwNCwKKwkweDgwMWEsIDB4MDAwNiwgMHg4MDE4LCAweDAwMDgsIDB4ODAxNiwgMHgwMDBhLCAweDgwMTQsIDB4OTE4NiwKKwkweDAwMTMsIDB4MTE2MCwgMHg2MDA0LCAweDkwOGEsIDB4MDA1NCwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwKKwkweDAwNDAsIDB4MGEwYywgMHgwZGQ1LCAweDIwMDgsIDB4MDgwNCwgMHhkZjYwLCAweDkxODYsIDB4MDA1MSwKKwkweDAxMDgsIDB4MDBjMCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDA5MDQsIDB4ZGYxMCwKKwkweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4OTA5NCwKKwkweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTU4MCwKKwkweDA4MDQsIDB4ZGZhOSwgMHg5MTg2LCAweDAwMjcsIDB4MDUzMCwgMHg5MTg2LCAweDAwNDgsIDB4MDEyOCwKKwkweDkxODYsIDB4MDAxNCwgMHgwNTAwLCAweDE5MGMsIDB4MGRkNSwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwKKwkweGQwODQsIDB4MDFmMCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwYzYsIDB4MjA2MSwKKwkweDAxMDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg5MDk0LCAweDAwMmUsIDB4MDAxZSwKKwkweDAwMGUsIDB4MDBjZSwgMHgwMTJlLCAweDAwY2UsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTkwYywKKwkweDBkZDUsIDB4MDgwNCwgMHhlMDhjLCAweDYwMDQsIDB4OTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDAxYSwKKwkweDA4MGMsIDB4YWZkOSwgMHgwMDA1LCAweGRmMjcsIDB4ZGYyOSwgMHhkZjI5LCAweGRmNTAsIDB4ZGYyNywKKwkweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywKKwkweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsIDB4ZGYyNywgMHhkZjI3LCAweGRmMjcsIDB4MDgwYywKKwkweDBkZDUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4OTc2MywgMHgwMDM2LCAweDAwOTYsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDFkOCwgMHgwODBjLCAweGNjODYsIDB4MDFjMCwgMHg2MDAzLCAweDAwMDIsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxMTc4LCAweDIwMTksIDB4MDAwNCwKKwkweDA4MGMsIDB4ZTZkZCwgMHg2MDE3LCAweDAwMDAsIDB4NjAxOCwgMHg5MDA1LCAweDExMjAsIDB4MjAwMSwKKwkweDE5ODYsIDB4MjAwNCwgMHg2MDFhLCAweDYwMDMsIDB4MDAwNywgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4OTc2MywgMHgwODBjLCAweGNjODYsIDB4MDEyMCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDEwMzEsIDB4MDgwYywgMHhhZjc0LCAweDAwOWUsIDB4MDAwNSwKKwkweDAwMDIsIDB4ZGY3NSwgMHhkZjhjLCAweGRmNzcsIDB4ZGZhMywgMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwKKwkweGRmNzUsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwKKwkweGRmNzUsIDB4ZGY3NSwgMHhkZjc1LCAweGRmNzUsIDB4ZGY3NSwgMHgwODBjLCAweDBkZDUsIDB4MDA5NiwKKwkweDA4MGMsIDB4OTY1NywgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGI0LCAweDAxMzgsIDB4NjAwMywKKwkweDAwMDcsIDB4MjAwOSwgMHgwMDQzLCAweDA4MGMsIDB4YWZiZSwgMHgwMDEwLCAweDYwMDMsIDB4MDAwNCwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHg5NjU3LCAweDA4MGMsIDB4Y2M4NiwKKwkweDAxMzgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk3YywgMHgwMDllLCAweGQxZWMsIDB4MTEzOCwKKwkweDA4MGMsIDB4ODc2ZiwgMHgwODBjLCAweGFmNDMsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4MDgwYywKKwkweGU5M2YsIDB4MGRiMCwgMHgwY2M4LCAweDA4MGMsIDB4OTY1NywgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwKKwkweGUxMTQsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZGZjMCwgMHhkZmMyLCAweGRmYzAsIDB4ZGZjMCwKKwkweGRmYzAsIDB4ZGZjMCwgMHhkZmMwLCAweGRmYzAsIDB4ZGZjMCwgMHhkZmMwLCAweGRmYzAsIDB4ZGZjMCwKKwkweGRmYzAsIDB4ZGZjMCwgMHhkZmMwLCAweGRmYzAsIDB4ZGZjMCwgMHhkZmMzLCAweGRmYzAsIDB4ZGZjMCwKKwkweDA4MGMsIDB4MGRkNSwgMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg4NzZmLCAweDAwZGUsIDB4MDgwYywKKwkweGU5OTcsIDB4MDgwYywgMHhhZjQzLCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZGZlMywKKwkweGRmZTMsIDB4ZGZlMywgMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywgMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywKKwkweGRmZTUsIDB4ZTA1NCwgMHhkZmUzLCAweGRmZTMsIDB4ZGZlMywgMHhkZmUzLCAweGUwNTQsIDB4ZGZlMywKKwkweGRmZTMsIDB4ZGZlMywgMHhkZmUzLCAweDA4MGMsIDB4MGRkNSwgMHgyMDAxLCAweDAxMDUsIDB4MjAwNCwKKwkweDkwODQsIDB4MTgwMCwgMHgwMWM4LCAweDIwMDEsIDB4MDEzMiwgMHgyMDBjLCAweDIwMDEsIDB4MDEzMSwKKwkweDIwMDQsIDB4OTEwNSwgMHgxOTA0LCAweGUwNTQsIDB4MjAwOSwgMHgxODBjLCAweDIxMDQsIDB4ZDBkNCwKKwkweDA5MDQsIDB4ZTA1NCwgMHhjMGQ0LCAweDIwMGEsIDB4MjAwOSwgMHgwMTA1LCAweDIxMDQsIDB4OTA4NCwKKwkweGU3ZmQsIDB4OTA4NSwgMHgwMDEwLCAweDIwMGEsIDB4MjAwMSwgMHgxODY3LCAweDIwMDQsIDB4ZDBlNCwKKwkweDE1MjgsIDB4NjAzYiwgMHgwMDAwLCAweDA4MGMsIDB4OTcxMywgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4N2MsIDB4ZDBmYywgMHgwMTg4LCAweDkwOGMsIDB4MDAwMywgMHg5MThlLCAweDAwMDIsIDB4MDUwOCwKKwkweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwZDQsIDB4MTFlMCwgMHgwODBjLCAweDk4OTEsIDB4MjAwOSwKKwkweDAwNDEsIDB4MDA5ZSwgMHgwODA0LCAweGUxMTQsIDB4MDgwYywgMHg5ODkxLCAweDYwMDMsIDB4MDAwNywKKwkweDYwMWIsIDB4MDAwMCwgMHgwODBjLCAweDg3NmYsIDB4MDA5ZSwgMHgwMDA1LCAweDIwMDEsIDB4MDEwMCwKKwkweDIwMDQsIDB4OTA4MiwgMHgwMDA1LCAweDBhYTgsIDB4MjAwMSwgMHgwMTFmLCAweDIwMDQsIDB4NjAzYSwKKwkweDA4OTAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFkNCwgMHgyMTAyLCAweGQxY2MsIDB4MDExMCwKKwkweDA4MGMsIDB4MmM5MCwgMHgwODBjLCAweDk4OTEsIDB4NjAxNCwgMHgyMDQ4LCAweGE5N2MsIDB4ZDFlYywKKwkweDExMzAsIDB4MDgwYywgMHg4NzZmLCAweDA4MGMsIDB4YWY0MywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywKKwkweGU5M2YsIDB4MGRiOCwgMHgwMDllLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFkNCwKKwkweDIxMDIsIDB4MDAzNiwgMHgwODBjLCAweDk3MTMsIDB4MDgwYywgMHg5ODkxLCAweDYwMTQsIDB4MDA5NiwKKwkweDIwNDgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDE4OCwKKwkweGE4N2MsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMiwgMHgwMTQwLCAweGE4YWMsIDB4NjMzMCwKKwkweDkzMWEsIDB4NjMzMiwgMHhhOGIwLCAweDYzMmMsIDB4OTMxYiwgMHg2MzJlLCAweDYwMDMsIDB4MDAwMiwKKwkweDAwODAsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZTZkZCwgMHg2MDE4LCAweDkwMDUsIDB4MTEyOCwKKwkweDIwMDEsIDB4MTk4NiwgMHgyMDA0LCAweDgwMDMsIDB4NjAxYSwgMHg2MDE3LCAweDAwMDAsIDB4NjAwMywKKwkweDAwMDcsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4ZTBhMywKKwkweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsIDB4ZTBhNSwKKwkweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywgMHhlMGEzLCAweGUwYTMsIDB4ZTBhMywKKwkweGUwYTMsIDB4ZTBhMywgMHhlMGYwLCAweDA4MGMsIDB4MGRkNSwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwKKwkweGE4MzQsIDB4YWEzOCwgMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFiYywKKwkweDExOTAsIDB4OTIwZCwgMHgxNTE4LCAweGE4N2MsIDB4ZDBmYywgMHgwMTI4LCAweDIwMDksIDB4MDA0MSwKKwkweDAwOWUsIDB4MDgwNCwgMHhlMTE0LCAweDYwMDMsIDB4MDAwNywgMHg2MDFiLCAweDAwMDAsIDB4MDgwYywKKwkweDg3NmYsIDB4MDA5ZSwgMHgwMDA1LCAweDYxMjQsIDB4ZDFmNCwgMHgxZDU4LCAweDAwMDYsIDB4MDA0NiwKKwkweGFjYWMsIDB4OTQyMiwgMHhhOWIwLCAweDIyMDAsIDB4OTEwYiwgMHg2MDMwLCAweDk0MjAsIDB4NjQzMiwKKwkweDYwMmMsIDB4OTEwOSwgMHg2MTJlLCAweDAwNGUsIDB4MDAwZSwgMHgwOGQ4LCAweDYxMTAsIDB4MDBiNiwKKwkweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYmMsIDB4MTE3OCwgMHgyMDA5LCAweDE4MGUsIDB4MjEwYywKKwkweGQxOWMsIDB4MDExOCwgMHg2MDAzLCAweDAwMDcsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDYsIDB4MDBlOSwKKwkweDA4MGMsIDB4ODc3MSwgMHgwMDllLCAweDAwMDUsIDB4NjAwMywgMHgwMDAyLCAweDAwOWUsIDB4MDAwNSwKKwkweDYwMjQsIDB4ZDBmNCwgMHgwMTI4LCAweDA4MGMsIDB4MTVmNCwgMHgxOTA0LCAweGUwYTUsIDB4MDAwNSwKKwkweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MzQsIDB4YTkzOCwgMHgwMDllLCAweDkxMDUsIDB4MTEyMCwKKwkweDA4MGMsIDB4MTVmNCwgMHgxOTA0LCAweGUwYTUsIDB4MDAwNSwgMHhkMmZjLCAweDAxNDAsIDB4ODAwMiwKKwkweDgwMDAsIDB4ODIxMiwgMHg5MjkxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDA5LCAweDAwMTAsIDB4MjAwOSwKKwkweDAwMTUsIDB4YWE5YSwgMHhhODk2LCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDA2MiwKKwkweDkxODYsIDB4MDAxMywgMHgwMTIwLCAweDkxODYsIDB4MDAxNCwgMHgxOTBjLCAweDBkZDUsIDB4NjAyNCwKKwkweGQwZGMsIDB4MDkwYywgMHgwZGQ1LCAweDAwMDUsIDB4ZTEzOCwgMHhlMTQ0LCAweGUxNTAsIDB4ZTE1YywKKwkweGUxMzgsIDB4ZTEzOCwgMHhlMTM4LCAweGUxMzgsIDB4ZTEzZiwgMHhlMTNhLCAweGUxM2EsIDB4ZTEzOCwKKwkweGUxMzgsIDB4ZTEzOCwgMHhlMTM4LCAweGUxM2EsIDB4ZTEzOCwgMHhlMTNhLCAweGUxMzgsIDB4ZTEzZiwKKwkweDA4MGMsIDB4MGRkNSwgMHg2MDI0LCAweGQwZGMsIDB4MDkwYywgMHgwZGQ1LCAweDAwMDUsIDB4NjAxNCwKKwkweDkwMDUsIDB4MTkwYywgMHgwZGQ1LCAweDAwMDUsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywKKwkweDkxYjEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NzYzLCAweDAxMmUsIDB4MDAwNSwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4OTFiMSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwKKwkweDA4MGMsIDB4OTc2MywgMHgwMTJlLCAweDAwMDUsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwKKwkweDA4MGMsIDB4MWJlYiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDkyMTYsIDB4MDgwYywKKwkweDk4OTEsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMzYsIDB4MDA5NiwKKwkweDkxODIsIDB4MDA0MCwgMHgwMDIzLCAweDAwOWUsIDB4MDAzZSwgMHgwMTJlLCAweDAwMDUsIDB4ZTE4YiwKKwkweGUxOGQsIDB4ZTE5ZiwgMHhlMWI5LCAweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwKKwkweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweGUxOGIsIDB4ZTE4YiwKKwkweGUxOGIsIDB4ZTE4YiwgMHhlMThiLCAweDA4MGMsIDB4MGRkNSwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywKKwkweGQwZmMsIDB4MDFmOCwgMHg5MDljLCAweDAwMDMsIDB4OTM5ZSwgMHgwMDAzLCAweDAxZDAsIDB4NjAwMywKKwkweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDA0NzAsIDB4NjAxNCwKKwkweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDAxNjgsIDB4OTA5YywgMHgwMDAzLCAweDkzOWUsIDB4MDAwMywKKwkweDAxNDAsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg5MWIxLCAweDA4MGMsIDB4OTc2MywKKwkweDAwZTAsIDB4OTAxZSwgMHg2MzE2LCAweDYzMWEsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZTZkZCwKKwkweDAwYTAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwZDk4LCAweDkwOWMsIDB4MDAwMywKKwkweDkzOWUsIDB4MDAwMywgMHgwZDcwLCAweDYwMDMsIDB4MDAwMywgMHg2MTA2LCAweDJjMTAsIDB4MDgwYywKKwkweDFiZWIsIDB4MDgwYywgMHg5MjE2LCAweDA4MGMsIDB4OTg5MSwgMHgwMDA1LCAweDA4MGMsIDB4OTY1NywKKwkweDYxMTQsIDB4ODFmZiwgMHgwMTU4LCAweDAwOTYsIDB4MjE0OCwgMHgwODBjLCAweGVhOTQsIDB4MDAzNiwKKwkweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweGU2ZGQsIDB4MDAzZSwgMHgwMDllLCAweDA4MGMsIDB4YWY3NCwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDA4MGMsIDB4OTcxMywgMHg2MTE0LCAweDgxZmYsIDB4MDE1OCwKKwkweDAwOTYsIDB4MjE0OCwgMHgwODBjLCAweGVhOTQsIDB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywKKwkweGU2ZGQsIDB4MDAzZSwgMHgwMDllLCAweDA4MGMsIDB4YWY3NCwgMHgwODBjLCAweDk4OTEsIDB4MDAwNSwKKwkweDkxODIsIDB4MDA4NSwgMHgwMDAyLCAweGUyMGEsIDB4ZTIwOCwgMHhlMjA4LCAweGUyMTYsIDB4ZTIwOCwKKwkweGUyMDgsIDB4ZTIwOCwgMHhlMjA4LCAweGUyMDgsIDB4ZTIwOCwgMHhlMjA4LCAweGUyMDgsIDB4ZTIwOCwKKwkweDA4MGMsIDB4MGRkNSwgMHg2MDAzLCAweDAwMGIsIDB4NjEwNiwgMHgwODBjLCAweDkxYjEsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDk3NjMsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDBlNiwKKwkweDA4MGMsIDB4ZTkzNiwgMHgwMTE4LCAweDA4MGMsIDB4YWY0MywgMHgwNDUwLCAweDIwNzEsIDB4MDI2MCwKKwkweDcyMjQsIDB4NjIxNiwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGU0LCAweDAxNTAsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwgMHgyMDExLCAweDAxNGUsIDB4MDgwYywKKwkweGIyNjQsIDB4NzIyMCwgMHgwODBjLCAweGU1ODMsIDB4MDExOCwgMHg2MDA3LCAweDAwODYsIDB4MDA0MCwKKwkweDYwMDcsIDB4MDA4NywgMHg3MjI0LCAweDkyOTYsIDB4ZmZmZiwgMHgxMTEwLCAweDYwMDcsIDB4MDA4NiwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDA4MGMsIDB4OTg5MSwKKwkweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4OTA4YSwKKwkweDAwODUsIDB4MGEwYywgMHgwZGQ1LCAweDkwOGEsIDB4MDA5MiwgMHgxYTBjLCAweDBkZDUsIDB4OTA4MiwKKwkweDAwODUsIDB4MDBhMiwgMHg5MTg2LCAweDAwMjcsIDB4MDEzMCwgMHg5MTg2LCAweDAwMTQsIDB4MDExOCwKKwkweDA4MGMsIDB4YWZkOSwgMHgwMDUwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY2MTUsIDB4MDgwYywKKwkweDk2NTcsIDB4MDgwYywgMHhhZjc0LCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweGUyN2IsIDB4ZTI3ZCwKKwkweGUyN2QsIDB4ZTI3YiwgMHhlMjdiLCAweGUyN2IsIDB4ZTI3YiwgMHhlMjdiLCAweGUyN2IsIDB4ZTI3YiwKKwkweGUyN2IsIDB4ZTI3YiwgMHhlMjdiLCAweDA4MGMsIDB4MGRkNSwgMHgwODBjLCAweDk2NTcsIDB4MDgwYywKKwkweGFmNzQsIDB4MDgwYywgMHg5NzYzLCAweDAwMDUsIDB4OTE4MiwgMHgwMDg1LCAweDBhMGMsIDB4MGRkNSwKKwkweDkxODIsIDB4MDA5MiwgMHgxYTBjLCAweDBkZDUsIDB4OTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4ZTI5YywKKwkweGUyOWMsIDB4ZTI5YywgMHhlMjllLCAweGUyOWMsIDB4ZTI5YywgMHhlMjljLCAweGUyOWMsIDB4ZTI5YywKKwkweGUyOWMsIDB4ZTI5YywgMHhlMjljLCAweGUyOWMsIDB4MDgwYywgMHgwZGQ1LCAweDAwMDUsIDB4OTE4NiwKKwkweDAwMTMsIDB4MDE0OCwgMHg5MTg2LCAweDAwMTQsIDB4MDEzMCwgMHg5MTg2LCAweDAwMjcsIDB4MDExOCwKKwkweDA4MGMsIDB4YWZkOSwgMHgwMDMwLCAweDA4MGMsIDB4OTY1NywgMHgwODBjLCAweGFmNzQsIDB4MDgwYywKKwkweDk3NjMsIDB4MDAwNSwgMHgwMDM2LCAweDA4MGMsIDB4ZTk5NywgMHg2MDQzLCAweDAwMDAsIDB4MjAxOSwKKwkweDAwMGIsIDB4MDAzMSwgMHg2MDIzLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwKKwkweDAxMjYsIDB4MDAzNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA4NiwgMHgyYzQwLCAweDAwOTYsIDB4OTA0ZSwKKwkweDA4MGMsIDB4YTc2YiwgMHgwMDllLCAweDAwOGUsIDB4MTU1MCwgMHgwMDc2LCAweDJjMzgsIDB4MDgwYywKKwkweGE4MTYsIDB4MDA3ZSwgMHgxNTIwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDA1MDAsIDB4NjAyMCwKKwkweDkwODYsIDB4MDAwNywgMHgwMWUwLCAweDAwOTYsIDB4NjAxYywgMHhkMDg0LCAweDAxNDAsIDB4MDgwYywKKwkweGU5OTcsIDB4MDgwYywgMHhkM2EwLCAweDA4MGMsIDB4MWFhMSwgMHg2MDIzLCAweDAwMDcsIDB4NjAxNCwKKwkweDIwNDgsIDB4MDgwYywgMHhjYzg2LCAweDAxMTAsIDB4MDgwYywgMHhlNmRkLCAweDAwOWUsIDB4NjAxNywKKwkweDAwMDAsIDB4MDgwYywgMHhlOTk3LCAweDYwMjMsIDB4MDAwNywgMHgwODBjLCAweGQzYTAsIDB4MDAzZSwKKwkweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDM2LCAweDAxNTYsIDB4MjA3OSwKKwkweDAyNjAsIDB4NzkzOCwgMHg3ODNjLCAweDA4MGMsIDB4Mjg3YywgMHgxNWM4LCAweDAwMTYsIDB4MDBjNiwKKwkweDA4MGMsIDB4NjY5OSwgMHgxNTkwLCAweDAwMWUsIDB4MDBjNiwgMHgyMTYwLCAweDA4MGMsIDB4ZDM5ZCwKKwkweDAwY2UsIDB4MDAyZSwgMHgwMDI2LCAweDAwMTYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4YThkYywKKwkweDA4MGMsIDB4OTM1NiwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MjI5LCAweDAwN2UsIDB4MDAxZSwKKwkweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweGU0NzcsIDB4MDA3ZSwgMHgwMDI2LCAweGJhMDQsIDB4OTI5NCwKKwkweGZmMDAsIDB4ODIxNywgMHg5Mjg2LCAweDAwMDYsIDB4MDExOCwgMHg5Mjg2LCAweDAwMDQsIDB4MTExOCwKKwkweGJhYTAsIDB4MDgwYywgMHgzMmRjLCAweDAwMmUsIDB4YmNjMCwgMHgwMDFlLCAweDA4MGMsIDB4NjBjNywKKwkweGJlMTIsIDB4YmQxNiwgMHhiY2MyLCAweDkwMDYsIDB4MDAxMCwgMHgwMGNlLCAweDAwMWUsIDB4MDE1ZSwKKwkweDAwM2UsIDB4MDBiZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDBiNiwKKwkweDAwMTYsIDB4MjAwOSwgMHgxODI0LCAweDIxMDQsIDB4OTA4NiwgMHgwMDc0LCAweDE5MDQsIDB4ZTM5ZSwKKwkweDIwNjksIDB4MDI2MCwgMHg2OTQ0LCAweDkxODIsIDB4MDEwMCwgMHgwNmUwLCAweDY5NDAsIDB4OTE4NCwKKwkweDgwMDAsIDB4MDkwNCwgMHhlMzliLCAweDIwMDEsIDB4MTk3YiwgMHgyMDA0LCAweDkwMDUsIDB4MTE0MCwKKwkweDYwMTAsIDB4MjA1OCwgMHhiOGMwLCAweDkwMDUsIDB4MDExOCwgMHg5MTg0LCAweDA4MDAsIDB4MDU5OCwKKwkweDY5NDgsIDB4OTE4YSwgMHgwMDAxLCAweDA2NDgsIDB4MDgwYywgMHhlYWZjLCAweDAxMTgsIDB4Njk3OCwKKwkweGQxZmMsIDB4MTFiOCwgMHgyMDA5LCAweDAyMDUsIDB4MjAwYiwgMHgwMDAxLCAweDY5M2MsIDB4ODFmZiwKKwkweDExOTgsIDB4Njk0NCwgMHg5MTgyLCAweDAxMDAsIDB4MDJhOCwgMHg2OTQwLCAweDgxZmYsIDB4MTE3OCwKKwkweDY5NDgsIDB4OTE4YSwgMHgwMDAxLCAweDAyODgsIDB4Njk1MCwgMHg5MThhLCAweDAwMDEsIDB4MDI5OCwKKwkweDAwZDAsIDB4NjAxNywgMHgwMTAwLCAweDAwYTAsIDB4NjAxNywgMHgwMzAwLCAweDAwODgsIDB4NjAxNywKKwkweDA1MDAsIDB4MDA3MCwgMHg2MDE3LCAweDA3MDAsIDB4MDA1OCwgMHg2MDE3LCAweDA5MDAsIDB4MDA0MCwKKwkweDYwMTcsIDB4MGIwMCwgMHgwMDI4LCAweDYwMTcsIDB4MGYwMCwgMHgwMDEwLCAweDYwMTcsIDB4MmQwMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDAxZSwgMHgwMGJlLCAweDAwZGUsIDB4MDBjZSwKKwkweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDYyMTAsIDB4MjI1OCwKKwkweGJiMDQsIDB4OTM5NCwgMHgwMGZmLCAweDkyODYsIDB4MDAwNiwgMHgwMTgwLCAweDkyODYsIDB4MDAwNCwKKwkweDAxNjgsIDB4OTM5NCwgMHhmZjAwLCAweDgyMTcsIDB4OTI4NiwgMHgwMDA2LCAweDAxMzgsIDB4OTI4NiwKKwkweDAwMDQsIDB4MDEyMCwgMHgwODBjLCAweDY2YTgsIDB4MDgwNCwgMHhlNDA2LCAweDIwMTEsIDB4MDI3NiwKKwkweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YmYxMSwKKwkweDAwOWUsIDB4MTVhOCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwKKwkweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGJmMTEsIDB4MDA5ZSwgMHgxNTQ4LCAweDAwNDYsIDB4MDAxNiwKKwkweGJhYTAsIDB4MjIyMCwgMHg5MDA2LCAweDIwMDksIDB4MTg0OCwgMHgyMTBjLCAweGQxYTQsIDB4MDEzOCwKKwkweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGU3M2EsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MjAxOSwKKwkweDAwMjksIDB4MDgwYywgMHg5MzU2LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4OTIyOSwKKwkweDJjMDgsIDB4MDgwYywgMHhlNDc3LCAweDAwN2UsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjYxNSwKKwkweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTksIDB4MDAxZSwgMHgwMDRlLCAweDkwMDYsIDB4MDE1ZSwKKwkweDAwM2UsIDB4MDAyZSwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDI2ZSwKKwkweDY4MDAsIDB4OTA4NiwgMHgwODAwLCAweDAxMTgsIDB4NjAxNywgMHgwMDAwLCAweDAwMDgsIDB4OTAwNiwKKwkweDAwZGUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwKKwkweDIwNzksIDB4MDI2YywgMHg3OTMwLCAweDc4MzQsIDB4MDgwYywgMHgyODdjLCAweDExZDAsIDB4MDgwYywKKwkweDY2OTksIDB4MTFiOCwgMHgyMDExLCAweDAyNzAsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwKKwkweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGJmMTEsIDB4MDA5ZSwgMHgxMTU4LCAweDIwMTEsIDB4MDI3NCwKKwkweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmYxMSwKKwkweDAwOWUsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwKKwkweDAwYjYsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsIDB4MDI2MywKKwkweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4Mjg3YywgMHgxMWQwLCAweDA4MGMsIDB4NjY5OSwKKwkweDExYjgsIDB4MjAxMSwgMHgwMjc2LCAweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwKKwkweDAwMGEsIDB4MDgwYywgMHhiZjExLCAweDAwOWUsIDB4MTE1OCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwKKwkweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGJmMTEsIDB4MDA5ZSwKKwkweDAxNWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBlNiwKKwkweDAwYzYsIDB4MDA4NiwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMjYsIDB4MDEyNiwKKwkweDIwOTEsIDB4ODAwMCwgMHgyNzQwLCAweDIwMjksIDB4MTllZiwgMHgyNTJjLCAweDIwMjEsIDB4MTlmNSwKKwkweDI0MjQsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzEsIDB4MTgwMCwgMHg3NjU0LCAweDcwNzQsIDB4ODFmZiwKKwkweDAxNTAsIDB4MDAwNiwgMHg5MTg2LCAweDFhYjIsIDB4MDAwZSwgMHgwMTI4LCAweDgwMDEsIDB4OTYwMiwKKwkweDFhMDQsIDB4ZTUxNCwgMHgwMDE4LCAweDk2MDYsIDB4MDkwNCwgMHhlNTE0LCAweDA4MGMsIDB4OGEzZCwKKwkweDA5MDQsIDB4ZTUwYiwgMHgyMTAwLCAweDljMDYsIDB4MDkwNCwgMHhlNTBiLCAweDA4MGMsIDB4ZTc3YiwKKwkweDE5MDQsIDB4ZTUwYiwgMHgwODBjLCAweGViMTksIDB4MDkwNCwgMHhlNTBiLCAweDA4MGMsIDB4ZTc2YiwKKwkweDA5MDQsIDB4ZTUwYiwgMHg2NzIwLCAweDk3ODYsIDB4MDAwMSwgMHgxMTQ4LCAweDA4MGMsIDB4MzM3MywKKwkweDA5MDQsIDB4ZTU1MywgMHg2MDA0LCAweDkwODYsIDB4MDAwMCwgMHgxOTA0LCAweGU1NTMsIDB4OTc4NiwKKwkweDAwMDQsIDB4MDkwNCwgMHhlNTUzLCAweDk3ODYsIDB4MDAwNywgMHgwOTA0LCAweGU1MGIsIDB4MjUwMCwKKwkweDljMDYsIDB4MDkwNCwgMHhlNTBiLCAweDI0MDAsIDB4OWMwNiwgMHgwNWU4LCAweDg4ZmYsIDB4MDExOCwKKwkweDYwNTQsIDB4OTkwNiwgMHgxNWMwLCAweDAwOTYsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwKKwkweDAwMTYsIDB4MDgwYywgMHgxYWExLCAweDAwMWUsIDB4OTc4NiwgMHgwMDBhLCAweDAxNDgsIDB4MDgwYywKKwkweGNlOGUsIDB4MTEzMCwgMHgwODBjLCAweGI5MDUsIDB4MDA5ZSwgMHgwODBjLCAweGFmNzQsIDB4MDQxOCwKKwkweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGNjODYsIDB4MDFkOCwgMHg5Nzg2LCAweDAwMDMsIDB4MTU3MCwKKwkweGE4NjcsIDB4MDEwMywgMHhhODdjLCAweGQwY2MsIDB4MDEzMCwgMHgwMDk2LCAweGE4NzgsIDB4MjA0OCwKKwkweDA4MGMsIDB4MGZiMSwgMHgwMDllLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4ZWE5NCwKKwkweDAwMTYsIDB4MDgwYywgMHhjZjdjLCAweDA4MGMsIDB4NmQwYiwgMHgwMDFlLCAweDA4MGMsIDB4Y2U3MSwKKwkweDAwOWUsIDB4MDgwYywgMHhhZjc0LCAweDljZTAsIDB4MDAxOCwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwKKwkweDljMDIsIDB4MTIxMCwgMHgwODA0LCAweGU0OGIsIDB4MDEyZSwgMHgwMDJlLCAweDAwNGUsIDB4MDA1ZSwKKwkweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDk3ODYsIDB4MDAwNiwKKwkweDExNTAsIDB4OTM4NiwgMHgwMDA1LCAweDAxMjgsIDB4MDgwYywgMHhlYTk0LCAweDA4MGMsIDB4ZTZkZCwKKwkweDA4ZjgsIDB4MDA5ZSwgMHgwYzAwLCAweDk3ODYsIDB4MDAwOSwgMHgxMWY4LCAweDYwMDAsIDB4OTA4NiwKKwkweDAwMDQsIDB4MDFjMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMywgMHgxMWEwLCAweDA4MGMsIDB4OTcxMywKKwkweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Y2M4NiwgMHgwMTE4LCAweDYwMTAsIDB4MDgwYywKKwkweDZkMTcsIDB4MDA5ZSwgMHgwMGM2LCAweDA4MGMsIDB4YWY0MywgMHgwMGNlLCAweDAwMzYsIDB4MDgwYywKKwkweDk4OTEsIDB4MDAzZSwgMHgwMDllLCAweDA4MDQsIDB4ZTUwYiwgMHg5Nzg2LCAweDAwMGEsIDB4MDkwNCwKKwkweGU0ZmIsIDB4MDgwNCwgMHhlNGYwLCAweDgxZmYsIDB4MDkwNCwgMHhlNTBiLCAweDkxODAsIDB4MDAwMSwKKwkweDIwMDQsIDB4OTA4NiwgMHgwMDE4LCAweDAxMzgsIDB4OTE4MCwgMHgwMDAxLCAweDIwMDQsIDB4OTA4NiwKKwkweDAwMmQsIDB4MTkwNCwgMHhlNTBiLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAyLCAweDE5MDQsIDB4ZTUwYiwKKwkweDA4MGMsIDB4Y2U3ZCwgMHgwMTM4LCAweDA4MGMsIDB4Y2U4ZSwgMHgxOTA0LCAweGU1MGIsIDB4MDgwYywKKwkweGI5MDUsIDB4MDAzOCwgMHgwODBjLCAweDMyNDcsIDB4MDgwYywgMHhjZThlLCAweDExMTAsIDB4MDgwYywKKwkweGI5MDUsIDB4MDgwYywgMHhhZjc0LCAweDA4MDQsIDB4ZTUwYiwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwKKwkweDkwODYsIDB4MDAzOSwgMHgwMDA1LCAweDAwYzYsIDB4MDBlNiwgMHgwMDE2LCAweDJjMDgsIDB4MjE3MCwKKwkweDkwMDYsIDB4MDgwYywgMHhlNzA0LCAweDAwMWUsIDB4MDEyMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwKKwkweDAwMWIsIDB4MDBlZSwgMHgwMGNlLCAweDAwMDUsIDB4ZTVhMiwgMHhlNWEyLCAweGU1YTIsIDB4ZTVhMiwKKwkweGU1YTIsIDB4ZTVhMiwgMHhlNWE0LCAweGU1YTIsIDB4ZTVhMiwgMHhlNWEyLCAweGU1YTIsIDB4YWY3NCwKKwkweGFmNzQsIDB4ZTVhMiwgMHg5MDA2LCAweDAwMDUsIDB4MDAzNiwgMHgwMDQ2LCAweDAwMTYsIDB4NzAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwgMHgyMDA5LCAweDAwMjAsIDB4MDgwYywKKwkweGU3M2EsIDB4MDAxZSwgMHgwMDRlLCAweDIwMTksIDB4MDAwMiwgMHgwODBjLCAweGUyYzAsIDB4MDAzZSwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwOTYsIDB4MDgwYywgMHhjYzg2LCAweDAxNDAsIDB4NjAxNCwKKwkweDkwNGQsIDB4MDgwYywgMHhjOGE1LCAweDY4N2IsIDB4MDAwNSwgMHgwODBjLCAweDZkMTcsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWY3NCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywKKwkweDY1ZDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwKKwkweDE4MDUsIDB4MjAxMSwgMHgwMjc2LCAweDA4MGMsIDB4YmVmZCwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwKKwkweDAxNWUsIDB4OTAwNSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MDA3NiwKKwkweDAwNjYsIDB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyNzQwLCAweDIwNjEsIDB4MWNkMCwKKwkweDIwNzksIDB4MDAwMSwgMHg4ZmZmLCAweDA5MDQsIDB4ZTYzZCwgMHgyMDcxLCAweDE4MDAsIDB4NzY1NCwKKwkweDcwNzQsIDB4ODAwMSwgMHg5NjAyLCAweDFhMDQsIDB4ZTYzZCwgMHg4OGZmLCAweDAxMjAsIDB4MjgwMCwKKwkweDljMDYsIDB4MTU5MCwgMHgyMDc4LCAweDA4MGMsIDB4ZTc2YiwgMHgwNTcwLCAweDI0MDAsIDB4OWMwNiwKKwkweDA1NTgsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDYsIDB4MTUzOCwgMHg5Nzg2LCAweDAwMDcsIDB4MDUyMCwKKwkweDg4ZmYsIDB4MTE0MCwgMHg2MDEwLCAweDliMDYsIDB4MTFmOCwgMHg4NWZmLCAweDAxMTgsIDB4NjA1NCwKKwkweDkxMDYsIDB4MTFkMCwgMHgwMDk2LCAweDYwMWMsIDB4ZDA4NCwgMHgwMTQwLCAweDA4MGMsIDB4ZTk5NywKKwkweDA4MGMsIDB4ZDNhMCwgMHgwODBjLCAweDFhYTEsIDB4NjAyMywgMHgwMDA3LCAweDYwMTQsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgwMTIwLCAweDAwNDYsIDB4MDgwYywgMHhlNmRkLCAweDAwNGUsIDB4MDA5ZSwKKwkweDA4MGMsIDB4YWY3NCwgMHg4OGZmLCAweDExOTgsIDB4OWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4MTgxYSwKKwkweDIwMDQsIDB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4ZTVmMiwgMHg5MDA2LCAweDAxMmUsIDB4MDBiZSwKKwkweDAwNmUsIDB4MDA3ZSwgMHgwMDhlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4OThjNSwKKwkweDAwMDEsIDB4MGNhMCwgMHgwMGI2LCAweDAwNzYsIDB4MDA1NiwgMHgwMDg2LCAweDkwNDYsIDB4MjAyOSwKKwkweDAwMDEsIDB4MmMyMCwgMHgyMDE5LCAweDAwMDIsIDB4NjIxMCwgMHgyMjU4LCAweDAwOTYsIDB4OTA0ZSwKKwkweDA4MGMsIDB4YTc2YiwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweGE4MTYsIDB4MDgwYywKKwkweGU1ZTMsIDB4MDA1ZSwgMHgwMDdlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwNDYsIDB4MDA1NiwKKwkweDAwNzYsIDB4MDBjNiwgMHgwMTU2LCAweDJjMjAsIDB4MjEyOCwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwKKwkweDAwMTYsIDB4MDAzNiwgMHgwODBjLCAweDY2OTksIDB4MTE5MCwgMHgwMDU2LCAweDAwODYsIDB4OTA0NiwKKwkweDI1MDgsIDB4MjAyOSwgMHgwMDAxLCAweDAwOTYsIDB4OTA0ZSwgMHgwODBjLCAweGE3NmIsIDB4MDA5ZSwKKwkweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweGE4MTYsIDB4MDgwYywgMHhlNWUzLCAweDAwNWUsIDB4MDAzZSwKKwkweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweGU2NzAsIDB4MDE1ZSwgMHgwMGNlLCAweDAwN2UsIDB4MDA1ZSwKKwkweDAwNGUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA3NiwgMHgwMDU2LCAweDYyMTAsIDB4MjI1OCwKKwkweDAwODYsIDB4OTA0NiwgMHgyMDI5LCAweDAwMDEsIDB4MjAxOSwgMHgwMDQ4LCAweDAwOTYsIDB4OTA0ZSwKKwkweDA4MGMsIDB4YTc2YiwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweGE4MTYsIDB4MmMyMCwKKwkweDA4MGMsIDB4ZTVlMywgMHgwMDVlLCAweDAwN2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA0NiwKKwkweDAwNTYsIDB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwgMHgyMGE5LCAweDA4MDAsIDB4OTAwZSwKKwkweDAwMTYsIDB4MDAzNiwgMHgwODBjLCAweDY2OTksIDB4MTFhMCwgMHgwMDg2LCAweDkwNDYsIDB4MjgyOCwKKwkweDAwNDYsIDB4MjAyMSwgMHgwMDAxLCAweDA4MGMsIDB4ZTk3YiwgMHgwMDRlLCAweDAwOTYsIDB4OTA0ZSwKKwkweDA4MGMsIDB4YTc2YiwgMHgwMDllLCAweDAwOGUsIDB4OTAzZSwgMHgwODBjLCAweGE4MTYsIDB4MDgwYywKKwkweGU1ZTMsIDB4MDAzZSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHhlNmI4LCAweDAxNWUsIDB4MDBjZSwKKwkweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDE2LCAweDAwZjYsIDB4MDgwYywKKwkweGNjODQsIDB4MDE5OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwNDYsIDB4MDE4MCwKKwkweGE4MDAsIDB4OTA3ZCwgMHgwMTM4LCAweGE4MDMsIDB4MDAwMCwgMHhhYjgyLCAweDA4MGMsIDB4NmQxNywKKwkweDJmNDgsIDB4MGNiMCwgMHhhYjgyLCAweDA4MGMsIDB4NmQxNywgMHgwMGZlLCAweDAwMWUsIDB4MDAwNSwKKwkweGE4MDAsIDB4OTA3ZCwgMHgwMTMwLCAweGE4MDMsIDB4MDAwMCwgMHgwODBjLCAweDZkMTcsIDB4MmY0OCwKKwkweDBjYjgsIDB4MDgwYywgMHg2ZDE3LCAweDBjODgsIDB4MDBlNiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwKKwkweDFjZDAsIDB4OTAwNSwgMHgxMTM4LCAweDIwNzEsIDB4MTgwMCwgMHg3NDU0LCAweDcwNzQsIDB4ODAwMSwKKwkweDk0MDIsIDB4MTJmOCwgMHgyMTAwLCAweDljMDYsIDB4MDE4OCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwKKwkweDAxNjgsIDB4NjAwOCwgMHg5MjA2LCAweDExNTAsIDB4NjMyMCwgMHg5Mzg2LCAweDAwMDksIDB4MDFiMCwKKwkweDYwMTAsIDB4OTFhMCwgMHgwMDA0LCAweDI0MjQsIDB4OTQwNiwgMHgwMTQwLCAweDljZTAsIDB4MDAxOCwKKwkweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MTIyMCwgMHgwYzIwLCAweDkwODUsIDB4MDAwMSwKKwkweDAwMDgsIDB4OTAwNiwgMHgwMDNlLCAweDAwNGUsIDB4MDBlZSwgMHgwMDA1LCAweDYzMWMsIDB4ZDNjNCwKKwkweDFkNjgsIDB4MGMzMCwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywgMHgwZmZmLCAweDAwMGUsIDB4MDkwYywKKwkweDBkZDUsIDB4YWFlMiwgMHhhODY3LCAweDAxMGQsIDB4YTg4ZSwgMHgwMDI2LCAweDIwMTAsIDB4MDgwYywKKwkweGNjNzQsIDB4MjAwMSwgMHgwMDAwLCAweDAxMjAsIDB4MjIwMCwgMHg5MDgwLCAweDAwMTUsIDB4MjAwNCwKKwkweDAwMmUsIDB4YTg3YSwgMHg5MTg2LCAweDAwMjAsIDB4MDExMCwgMHhhOGUzLCAweGZmZmYsIDB4YTk4NiwKKwkweGFjNzYsIDB4YTg3ZiwgMHgwMDAwLCAweDIwMDEsIDB4MTk4ZCwgMHgyMDA0LCAweGE4ODIsIDB4OTAwNiwKKwkweGE4MDIsIDB4YTg2YSwgMHhhODhhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmQxNywKKwkweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDY3MDAsIDB4OTc4NiwgMHgwMDAwLCAweDAxNTgsIDB4OTc4NiwKKwkweDAwMDEsIDB4MDE0MCwgMHg5Nzg2LCAweDAwMGEsIDB4MDEyOCwgMHg5Nzg2LCAweDAwMDksIDB4MDExMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwgMHg5MDc1LCAweDAxMzgsIDB4MDBiNiwKKwkweDIwNTgsIDB4YjhhMCwgMHgwMGJlLCAweDkyMDYsIDB4MDBlZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwKKwkweDBjZDgsIDB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAxZSwgMHgxMWEwLCAweDgwMDcsIDB4NjEzNCwKKwkweDkxOGMsIDB4MDBmZiwgMHg5MTA1LCAweDYwMzYsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwKKwkweDYwMjMsIDB4MDAwNSwgMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwgMHg2MDFhLCAweDA4MGMsIDB4OTFiMSwKKwkweDA4MGMsIDB4OTc2MywgMHgwMDFlLCAweDAwMDUsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4NjAyNCwKKwkweGQwZTQsIDB4MDE1OCwgMHhkMGNjLCAweDAxMTgsIDB4MDgwYywgMHhjZmMwLCAweDAwMzAsIDB4MDgwYywKKwkweGU5OTcsIDB4MDgwYywgMHg4NzZmLCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDkyODAsIDB4MDAwOCwKKwkweDIwMDQsIDB4OTA4NCwgMHgwMDBmLCAweDAwMDIsIDB4ZTdjYSwgMHhlN2NhLCAweGU3Y2EsIDB4ZTdjYywKKwkweGU3Y2EsIDB4ZTdjYywgMHhlN2NjLCAweGU3Y2EsIDB4ZTdjYywgMHhlN2NhLCAweGU3Y2EsIDB4ZTdjYSwKKwkweGU3Y2EsIDB4ZTdjYSwgMHg5MDA2LCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4OTI4MCwKKwkweDAwMDgsIDB4MjAwNCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwMiwgMHhlN2UzLCAweGU3ZTMsIDB4ZTdlMywKKwkweGU3ZTMsIDB4ZTdlMywgMHhlN2UzLCAweGU3ZjAsIDB4ZTdlMywgMHhlN2UzLCAweGU3ZTMsIDB4ZTdlMywKKwkweGU3ZTMsIDB4ZTdlMywgMHhlN2UzLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJmLCAweDAwMDksIDB4NjAxNywKKwkweDJhMDAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDAwNSwKKwkweDAwOTYsIDB4MDBjNiwgMHgyMjYwLCAweDA4MGMsIDB4ZTk5NywgMHg2MDQzLCAweDAwMDAsIDB4NjAyNCwKKwkweGMwZjQsIDB4YzBlNCwgMHg2MDI2LCAweDYwM2IsIDB4MDAwMCwgMHgwMGNlLCAweDAwZDYsIDB4MjI2OCwKKwkweDkxODYsIDB4MDAwNywgMHgxOTA0LCAweGU4NDksIDB4NjgxNCwgMHg5MDA1LCAweDAxMzgsIDB4MjA0OCwKKwkweGE4N2MsIDB4ZDBmYywgMHgxMTE4LCAweDAwZGUsIDB4MDA5ZSwgMHgwOGE4LCAweDYwMDcsIDB4MDAzYSwKKwkweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDAwYzYsIDB4MmQ2MCwKKwkweDYxMDAsIDB4OTE4NiwgMHgwMDAyLCAweDE5MDQsIDB4ZThjMCwgMHg2MDE0LCAweDkwMDUsIDB4MTEzOCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDA3LCAweDE5MGMsIDB4MGRkNSwgMHgwODA0LCAweGU4YzAsIDB4MjA0OCwKKwkweDA4MGMsIDB4Y2M4NiwgMHgxMTMwLCAweDAwMjgsIDB4MjA0OCwgMHhhODAwLCAweDkwMDUsIDB4MWRlMCwKKwkweDI5MDAsIDB4MjA0OCwgMHhhODdjLCAweDkwODQsIDB4MDAwMywgMHg5MDg2LCAweDAwMDIsIDB4MTE2OCwKKwkweGE4N2MsIDB4YzBkYywgMHhjMGY0LCAweGE4N2UsIDB4YTg4MCwgMHhjMGZjLCAweGE4ODIsIDB4MjAwOSwKKwkweDAwNDMsIDB4MDgwYywgMHhlMTE0LCAweDA4MDQsIDB4ZThjMCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwNCwKKwkweGU4YmEsIDB4OTE4NiwgMHgwMDA1LCAweDE1YTAsIDB4NjgxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBiYywKKwkweDExMjAsIDB4MDBkZSwgMHgwMDllLCAweDA4MDQsIDB4ZTdlMywgMHhkMGI0LCAweDAxMjgsIDB4ZDBmYywKKwkweDA5MGMsIDB4MGRkNSwgMHgwODA0LCAweGU4MDQsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwKKwkweDA4MGMsIDB4OTFiMSwgMHgwODBjLCAweDk3NjMsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4OTE4NiwKKwkweDAwMDIsIDB4MDEyMCwgMHg5MTg2LCAweDAwMDQsIDB4MTkwNCwgMHhlOGMwLCAweDY4MTQsIDB4MjA0OCwKKwkweGE5N2MsIDB4YzFmNCwgMHhjMWRjLCAweGE5N2UsIDB4YTk4MCwgMHhjMWZjLCAweGMxYmMsIDB4YTk4MiwKKwkweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE3NTQsIDB4MDBmZSwgMHgyMDA5LCAweDAwNDIsIDB4MDRkMCwKKwkweDAwMzYsIDB4MDgwYywgMHgwZmZmLCAweDA5MGMsIDB4MGRkNSwgMHhhODY3LCAweDAxMGQsIDB4OTAwNiwKKwkweGE4MDIsIDB4YTg2YSwgMHhhODhhLCAweDJkMTgsIDB4YWI4ZSwgMHhhODg3LCAweDAwNDUsIDB4MmMwMCwKKwkweGE4OTIsIDB4NjAzOCwgMHhhOGEyLCAweDIzNjAsIDB4NjAyNCwgMHhjMGRkLCAweDYwMjYsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4MjAwNCwgMHg2MzU0LCAweGFiN2EsIDB4YTg3NiwKKwkweDkwMDYsIDB4YTg3ZSwgMHhhODgyLCAweGFkOWEsIDB4YWU5NiwgMHhhODlmLCAweDAwMDEsIDB4MDgwYywKKwkweDZkMTcsIDB4MjAxOSwgMHgwMDQ1LCAweDYwMDgsIDB4MjA2OCwgMHgwODBjLCAweGUyYzAsIDB4MmQwMCwKKwkweDYwMGEsIDB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHg5MDFlLCAweDYzMWEsIDB4NjM0MiwKKwkweDAwM2UsIDB4MDAzOCwgMHg2MDQzLCAweDAwMDAsIDB4NjAwMywgMHgwMDA3LCAweDA4MGMsIDB4ZTExNCwKKwkweDAwY2UsIDB4MDBkZSwgMHgwMDllLCAweDAwMDUsIDB4OTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwKKwkweDkwODIsIDB4MDA4NSwgMHgyMDA4LCAweDAwYzIsIDB4OTE4NiwgMHgwMDI3LCAweDExNzgsIDB4MDgwYywKKwkweDk2NTcsIDB4MDAzNiwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywKKwkweGU2ZGQsIDB4MDA5ZSwgMHgwMDNlLCAweDA4MGMsIDB4OTc2MywgMHgwMDA1LCAweDkxODYsIDB4MDAxNCwKKwkweDBkNzAsIDB4MDgwYywgMHhhZmQ5LCAweDAwMDUsIDB4ZThmMywgMHhlOGYxLCAweGU4ZjEsIDB4ZThmMSwKKwkweGU4ZjEsIDB4ZThmMSwgMHhlOGYzLCAweGU4ZjEsIDB4ZThmMSwgMHhlOGYxLCAweGU4ZjEsIDB4ZThmMSwKKwkweGU4ZjEsIDB4MDgwYywgMHgwZGQ1LCAweDA4MGMsIDB4OTY1NywgMHg2MDAzLCAweDAwMGMsIDB4MDgwYywKKwkweDk3NjMsIDB4MDAwNSwgMHg5MTgyLCAweDAwOTIsIDB4MTIyMCwgMHg5MTgyLCAweDAwODUsIDB4MDIwOCwKKwkweDAwMWEsIDB4MDgwYywgMHhhZmQ5LCAweDAwMDUsIDB4ZTkxMSwgMHhlOTExLCAweGU5MTEsIDB4ZTkxMSwKKwkweGU5MTMsIDB4ZTkzMywgMHhlOTExLCAweGU5MTEsIDB4ZTkxMSwgMHhlOTExLCAweGU5MTEsIDB4ZTkxMSwKKwkweGU5MTEsIDB4MDgwYywgMHgwZGQ1LCAweDAwZDYsIDB4MmM2OCwgMHgwODBjLCAweGFlZWQsIDB4MDFiMCwKKwkweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMWUsIDB4MjAwOSwgMHgwMjZlLCAweDIxMGMsIDB4NjEzYSwKKwkweDIwMDksIDB4MDI2ZiwgMHgyMTBjLCAweDYxM2UsIDB4NjAwYiwgMHhmZmZmLCAweDY5MTAsIDB4NjExMiwKKwkweDYwMjMsIDB4MDAwNCwgMHgwODBjLCAweDkxYjEsIDB4MDgwYywgMHg5NzYzLCAweDJkNjAsIDB4MDgwYywKKwkweGFmNDMsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4YWY0MywgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwKKwkweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBlYywgMHgwMGVlLCAweDAwMDUsIDB4MjAwOSwKKwkweDE4NjcsIDB4MjEwYywgMHhkMWVjLCAweDA1YjAsIDB4NjAwMywgMHgwMDAyLCAweDYwMjQsIDB4YzBlNSwKKwkweDYwMjYsIDB4ZDBjYywgMHgwMTUwLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNDIsIDB4MjAwOSwKKwkweDE4NjcsIDB4MjEwYywgMHhkMWY0LCAweDE1MjAsIDB4MDBhMCwgMHgyMDA5LCAweDE4NjcsIDB4MjEwYywKKwkweGQxZjQsIDB4MDEyOCwgMHg2MDI0LCAweGMwZTQsIDB4NjAyNiwgMHg5MDA2LCAweDAwZDgsIDB4MjAwMSwKKwkweDE5ODcsIDB4MjAwYywgMHgyMDAxLCAweDE5ODUsIDB4MjAwNCwgMHg5MTAwLCAweDkwODAsIDB4MDAwYSwKKwkweDYwNDIsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhiYywgMHgwMGJlLCAweDAwMDgsIDB4MjEwNCwKKwkweDkwMDUsIDB4MDExOCwgMHg5MDg4LCAweDAwMDMsIDB4MGNkMCwgMHgyYzBhLCAweDYwMGYsIDB4MDAwMCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwgMHgwMGU2LCAweDYxNTQsIDB4YjhiYywKKwkweDIwNjAsIDB4OGNmZiwgMHgwMTgwLCAweDg0ZmYsIDB4MTExOCwgMHg2MDU0LCAweDkxMDYsIDB4MTEzOCwKKwkweDYwMGMsIDB4MjA3MiwgMHgwODBjLCAweDg3NmYsIDB4MDgwYywgMHhhZjQzLCAweDAwMTAsIDB4OWNmMCwKKwkweDAwMDMsIDB4MmU2NCwgMHgwYzcwLCAweDAwZWUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwKKwkweDAwYjYsIDB4NjAxMCwgMHgyMDU4LCAweGI4YmMsIDB4MjA2OCwgMHg5MDA1LCAweDAxMzAsIDB4OWMwNiwKKwkweDAxMTAsIDB4NjgwYywgMHgwY2QwLCAweDYwMGMsIDB4NjgwZSwgMHgwMGJlLCAweDAwZGUsIDB4MDAwNSwKKwkweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsIDB4MTgyYywgMHgyMjA0LCAweDkwODQsIDB4MDBmZiwKKwkweDIwMTksIDB4MDI2ZSwgMHgyMzM0LCAweDk2MzYsIDB4MTUwOCwgMHg4MzE4LCAweDIzMzQsIDB4MjIwNCwKKwkweDkwODQsIDB4ZmYwMCwgMHg5NjM2LCAweDExZDAsIDB4MjAxMSwgMHgwMjcwLCAweDIwYTksIDB4MDAwNCwKKwkweDYwMTAsIDB4MDA5NiwgMHgyMDQ4LCAweDIwMTksIDB4MDAwYSwgMHgwODBjLCAweGJmMTEsIDB4MDA5ZSwKKwkweDExNjgsIDB4MjAxMSwgMHgwMjc0LCAweDIwYTksIDB4MDAwNCwgMHg2MDEwLCAweDAwOTYsIDB4MjA0OCwKKwkweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGJmMTEsIDB4MDA5ZSwgMHgxMTAwLCAweDAxNWUsIDB4MDAzZSwKKwkweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHgwODBjLCAweDYwNDAsIDB4MDgwYywKKwkweDJmZjUsIDB4MDBlZSwgMHgwMDA1LCAweDAwOTYsIDB4MDAyNiwgMHgwODBjLCAweDBmZmYsIDB4MDkwYywKKwkweDBkZDUsIDB4YTg1YywgMHg5MDgwLCAweDAwMWEsIDB4MjBhMCwgMHgyMGE5LCAweDAwMGMsIDB4YTg2MCwKKwkweDIwZTgsIDB4OTAwNiwgMHg0MDA0LCAweDkxODYsIDB4MDA0NiwgMHgxMTE4LCAweGE4NjcsIDB4MDEzNiwKKwkweDAwMzgsIDB4YTg2NywgMHgwMTM4LCAweDkxODYsIDB4MDA0MSwgMHgwMTEwLCAweGE4N2IsIDB4MDAwMSwKKwkweDcwMzgsIDB4OTA4NCwgMHhmZjAwLCAweDcyNDAsIDB4OTI5NCwgMHhmZjAwLCAweDgwMDcsIDB4OTIxNSwKKwkweGFhOWEsIDB4OTE4NiwgMHgwMDQ2LCAweDExNjgsIDB4NzAzOCwgMHg5MDg0LCAweDAwZmYsIDB4NzIzYywKKwkweDkyOTQsIDB4ZmYwMCwgMHg5MjE1LCAweGFhOWUsIDB4NzIzYywgMHg5Mjk0LCAweDAwZmYsIDB4YWFhMiwKKwkweDAwNjAsIDB4NzA0MCwgMHg5MDg0LCAweDAwZmYsIDB4NzI0NCwgMHg5Mjk0LCAweGZmMDAsIDB4OTIxNSwKKwkweGFhOWUsIDB4NzI0NCwgMHg5Mjk0LCAweDAwZmYsIDB4YWFhMiwgMHg5MTg2LCAweDAwNDYsIDB4MTExOCwKKwkweDllOTAsIDB4MDAxMiwgMHgwMDEwLCAweDllOTAsIDB4MDAxYSwgMHgyMjA0LCAweDgwMDcsIDB4YThhNiwKKwkweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YWEsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4YThhZSwKKwkweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YjIsIDB4ODIxMCwgMHg5MTg2LCAweDAwNDYsIDB4MTFiOCwKKwkweDllOTAsIDB4MDAxNiwgMHgyMjA0LCAweDgwMDcsIDB4YThiNiwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywKKwkweGE4YmEsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4YThiZSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywKKwkweGE4YzIsIDB4ODIxMCwgMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAxLCAweDAwYjAsIDB4OWU5MCwKKwkweDAwMWUsIDB4MjIwNCwgMHg4MDA3LCAweGE4YjYsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4YThiYSwKKwkweDIwMTEsIDB4MDIwNSwgMHgyMDEzLCAweDAwMDEsIDB4MjAxMSwgMHgwMjYwLCAweDIyMDQsIDB4ODAwNywKKwkweGE4YmUsIDB4ODIxMCwgMHgyMjA0LCAweDgwMDcsIDB4YThjMiwgMHg5MTg2LCAweDAwNDYsIDB4MTExOCwKKwkweDIwMTEsIDB4MDI2MiwgMHgwMDEwLCAweDIwMTEsIDB4MDI2YSwgMHgwMTQ2LCAweDAxZDYsIDB4MDAzNiwKKwkweDIwYTksIDB4MDAwMSwgMHgyMDE5LCAweDAwMDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwKKwkweDAwMzEsIDB4MjBhMCwgMHgyMjA0LCAweDgwMDcsIDB4NDAwNCwgMHg4MjEwLCAweDgzMTksIDB4MWRkMCwKKwkweDAwM2UsIDB4MDFjZSwgMHgwMTNlLCAweDIwMTEsIDB4MDIwNSwgMHgyMDEzLCAweDAwMDAsIDB4MDAyZSwKKwkweDA4MGMsIDB4NmQxNywgMHgwMDllLCAweDAwMDUsIDB4MDBlNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGI4MDAsIDB4MDBiZSwgMHhkMGZjLCAweDAxMDgsIDB4MDAxMSwgMHgwMGVlLCAweDAwMDUsIDB4YTg4MCwKKwkweGMwZTUsIDB4YTg4MiwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNzYsIDB4MDA2NiwKKwkweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDAwMTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwKKwkweDE5ZWYsIDB4MjUyYywgMHgyMDIxLCAweDE5ZjUsIDB4MjQyNCwgMHgyMDYxLCAweDFjZDAsIDB4MjA3MSwKKwkweDE4MDAsIDB4NzY1NCwgMHg3MDc0LCAweDk2MDYsIDB4MDU3OCwgMHg2NzIwLCAweDk3ODYsIDB4MDAwMSwKKwkweDAxMTgsIDB4OTc4NiwgMHgwMDA4LCAweDE1MDAsIDB4MjUwMCwgMHg5YzA2LCAweDAxZTgsIDB4MjQwMCwKKwkweDljMDYsIDB4MDFkMCwgMHgwODBjLCAweGU3NmIsIDB4MDFiOCwgMHgwODBjLCAweGU3N2IsIDB4MTFhMCwKKwkweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MDAxNiwgMHgwODBjLCAweDFhYTEsIDB4MDAxZSwKKwkweDA4MGMsIDB4Y2U3ZCwgMHgxMTEwLCAweDA4MGMsIDB4MzI0NywgMHgwODBjLCAweGNlOGUsIDB4MTExMCwKKwkweDA4MGMsIDB4YjkwNSwgMHgwODBjLCAweGFmNzQsIDB4OWNlMCwgMHgwMDE4LCAweDIwMDEsIDB4MTgxYSwKKwkweDIwMDQsIDB4OWMwMiwgMHgxMjA4LCAweDA4NTgsIDB4MDEyZSwgMHgwMDFlLCAweDAwMmUsIDB4MDA0ZSwKKwkweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwKKwkweDE4MTAsIDB4MjAwNCwgMHhkMGRjLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwKKwkweGQwOWMsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAzNiwgMHgwMDQ2LCAweDA4MGMsIDB4ZDM4OCwKKwkweDAxNjgsIDB4MjAxOSwgMHhmZmZmLCAweDkwMDUsIDB4MDEyOCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwKKwkweGJiYTAsIDB4MDBiZSwgMHgyMDIxLCAweDAwMDQsIDB4MDgwYywgMHg0ZDM2LCAweDAwNGUsIDB4MDAzZSwKKwkweDAwMGUsIDB4NjAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MTEyOCwgMHgwODBjLCAweGE4ZGMsIDB4MDgwYywKKwkweGFmNzQsIDB4OTAwNiwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMGI2LCAweDAwNDYsIDB4MjA2MSwKKwkweDFjZDAsIDB4MjA3MSwgMHgxODAwLCAweDc0NTQsIDB4NzA3NCwgMHg4MDAxLCAweDk0MDIsIDB4MTJkOCwKKwkweDIxMDAsIDB4OWMwNiwgMHgwMTY4LCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAxMCwKKwkweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDExMjAsIDB4NjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MDE0MCwKKwkweDljZTAsIDB4MDAxOCwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDEyMjAsIDB4MGM0MCwKKwkweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDA0ZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBlZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MDAxNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE4NDAsIDB4ZDVhNCwgMHgwMTE4LCAweDcwMDQsIDB4ODAwMCwgMHg3MDA2LCAweGQ1YjQsIDB4MDExOCwKKwkweDcwMDAsIDB4ODAwMCwgMHg3MDAyLCAweGQ1YWMsIDB4MDE3OCwgMHgyNTAwLCAweDkwODQsIDB4MDAwNywKKwkweDkwOGUsIDB4MDAwMywgMHgwMTQ4LCAweDkwOGUsIDB4MDAwNCwgMHgwMTMwLCAweDkwOGUsIDB4MDAwNSwKKwkweDAxMTgsIDB4MjA3MSwgMHhmZmY2LCAweDAwODksIDB4MDAxZSwgMHgwMGVlLCAweDAwMGUsIDB4MDEyZSwKKwkweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4ZmZlZSwKKwkweDAwMjEsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgyZTA1LCAweDgwMDAsIDB4MjA3NywKKwkweDEyMjAsIDB4OGU3MCwgMHgyZTA1LCAweDgwMDAsIDB4MjA3NywgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwKKwkweGZmZWMsIDB4MGM5OSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGZmZjAsIDB4MGM2OSwKKwkweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwKKwkweDE4NDAsIDB4NzAxNCwgMHg4MDAwLCAweDcwMTYsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwKKwkweDAwMDMsIDB4MDAwYiwgMHgwNzllLCAweDAwMDAsIDB4YzAwMCwgMHgwMDAxLCAweDgwNjQsIDB4MDAwOCwKKwkweDAwMTAsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDEwMSwgMHgwMDA4LCAweDQ0MDcsIDB4MDAwMywKKwkweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4NTgwZCwgMHgwMDBiLCAweDc5YTgsIDB4MDAwYiwKKwkweDUwZWUsIDB4MDAwYiwgMHg0YzBhLCAweDAwMDMsIDB4YmFjMCwgMHgwMDA5LCAweDAwOGEsIDB4MDAwMCwKKwkweDBjMGEsIDB4MDAwYiwgMHgxNWZlLCAweDAwMDgsIDB4MzQwYSwgMHgwMDAzLCAweGM0YzAsIDB4MDAwOSwKKwkweDcwMDAsIDB4MDAwMCwgMHhmZmEwLCAweDAwMDEsIDB4MjAwMCwgMHgwMDAwLCAweDE2NjgsIDB4MDAwYiwKKwkweDgwOGMsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDA3LCAweDQwMjgsIDB4MDAwMCwKKwkweDQwNDcsIDB4MDAwYSwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDA4MjIsIDB4MDAwMywKKwkweDQwMjIsIDB4MDAwMCwgMHgwMDI4LCAweDAwMGIsIDB4NDEyMiwgMHgwMDA4LCAweDk0YzAsIDB4MDAwOSwKKwkweGZmMDAsIDB4MDAwOCwgMHhmZmUwLCAweDAwMDksIDB4MDUwMCwgMHgwMDA4LCAweDBhOTMsIDB4MDAwYiwKKwkweDQ0NDcsIDB4MDAwMiwgMHgwZTkwLCAweDAwMDMsIDB4MGJmZSwgMHgwMDA4LCAweDExYTAsIDB4MDAwMSwKKwkweDEyNmUsIDB4MDAwMywgMHgwY2EwLCAweDAwMDEsIDB4MTI2ZSwgMHgwMDAzLCAweDkxODAsIDB4MDAwMSwKKwkweDAwMDQsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4NDQzNiwgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwKKwkweDAwMDAsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwNDExLCAweDAwMDAsIDB4NDQzZSwgMHgwMDAzLCAweDAzZmUsIDB4MDAwMCwKKwkweDQzZTAsIDB4MDAwMSwgMHgwZTZiLCAweDAwMGIsIDB4YzJjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwKKwkweDAyZTAsIDB4MDAwMSwgMHgwZTZiLCAweDAwMGIsIDB4OTE4MCwgMHgwMDAxLCAweDAwMDUsIDB4MDAwOCwKKwkweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMTksIDB4MDAwMCwgMHg0NDRkLCAweDAwMGIsIDB4MDI0MCwgMHgwMDAyLCAweDBhNjgsIDB4MDAwMywKKwkweDAwZmUsIDB4MDAwMCwgMHgzMjZiLCAweDAwMGIsIDB4MDI0OCwgMHgwMDBhLCAweDA4NWMsIDB4MDAwMywKKwkweDkxODAsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDgsIDB4N2Y2MiwgMHgwMDA4LCAweDgwMDIsIDB4MDAwOCwKKwkweDAwMDMsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDIwYSwgMHgwMDAwLCAweDQ0NWIsIDB4MDAwMywKKwkweDExMmEsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDgsIDB4MDIyYywgMHgwMDA4LCAweDNhNDQsIDB4MDAwMiwKKwkweDBjMGEsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLCAweDE3NjAsIDB4MDAwOCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDBmLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAwMTEsIDB4MDAwOCwKKwkweDQ0NjgsIDB4MDAwMywgMHgwMWZlLCAweDAwMDgsIDB4NDJlMCwgMHgwMDA5LCAweDBlNWMsIDB4MDAwMywKKwkweDAwZmUsIDB4MDAwMCwgMHg0M2UwLCAweDAwMDEsIDB4MGU1YywgMHgwMDAzLCAweDE3MzQsIDB4MDAwMCwKKwkweDE1MzAsIDB4MDAwMCwgMHgxNjMyLCAweDAwMDgsIDB4MGQyYSwgMHgwMDA4LCAweDk4ODAsIDB4MDAwMSwKKwkweDAwMTAsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgxZTBhLCAweDAwMDgsIDB4NDQ3YSwgMHgwMDAzLCAweDgwOGEsIDB4MDAwOCwKKwkweDAwMDMsIDB4MDAwOCwgMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwKKwkweDU4ODAsIDB4MDAwYiwgMHg4MDY2LCAweDAwMDAsIDB4MzY3OSwgMHgwMDAwLCAweDQ0ODMsIDB4MDAwMywKKwkweDU4ODQsIDB4MDAwMywgMHgzZWZlLCAweDAwMDgsIDB4N2Y0ZiwgMHgwMDAyLCAweDA4OGEsIDB4MDAwYiwKKwkweDBkMDAsIDB4MDAwMCwgMHgwMDkyLCAweDAwMGMsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTEsIDB4MDAwOCwKKwkweDgwNzQsIDB4MDAwMCwgMHgxMDEwLCAweDAwMDgsIDB4MWVmZSwgMHgwMDAwLCAweDMwMGEsIDB4MDAwYiwKKwkweDAwYzgsIDB4MDAwYywgMHgwMDBhLCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLCAweDM0OWEsIDB4MDAwMywKKwkweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDAyMzEsIDB4MDAwOCwgMHg0NDk5LCAweDAwMGIsIDB4MDNmZSwgMHgwMDAwLCAweDA0ZDAsIDB4MDAwMSwKKwkweDBjYzAsIDB4MDAwYiwgMHg4MmMwLCAweDAwMDEsIDB4MWYwMCwgMHgwMDAwLCAweGZmYTAsIDB4MDAwMSwKKwkweDA0MDAsIDB4MDAwMCwgMHgwOGFmLCAweDAwMDMsIDB4MTRjMCwgMHgwMDBiLCAweDAxZmUsIDB4MDAwOCwKKwkweDA1ODAsIDB4MDAwOSwgMHg3ZjA2LCAweDAwMDAsIDB4MDJmZSwgMHgwMDA4LCAweGZmYzAsIDB4MDAwMSwKKwkweDAwZmYsIDB4MDAwOCwgMHgwNjkwLCAweDAwMDEsIDB4MTBhZiwgMHgwMDAzLCAweDdmMDgsIDB4MDAwOCwKKwkweDg0YzAsIDB4MDAwMSwgMHhmZjAwLCAweDAwMDgsIDB4MDhjMCwgMHgwMDAzLCAweDAwZmUsIDB4MDAwMCwKKwkweDM0YjYsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4MTAxMCwgMHgwMDA4LCAweDM5NDQsIDB4MDAwMiwKKwkweDA4YjEsIDB4MDAwMywgMHgwMGJhLCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDIwMjAsIDB4MDAwOCwKKwkweDM5NDUsIDB4MDAwYSwgMHgwOGI2LCAweDAwMGIsIDB4Mzk0NiwgMHgwMDBhLCAweDBjYzcsIDB4MDAwMywKKwkweDAwMDAsIDB4MDAwNywgMHgzOTQzLCAweDAwMGEsIDB4MDhjNywgMHgwMDBiLCAweDAwYmEsIDB4MDAwMywKKwkweDAwZmUsIDB4MDAwMCwgMHgzNGM1LCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDEwMDAsIDB4MDAwMCwKKwkweDAwYzcsIDB4MDAwMywgMHg4MDcyLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLCAweDQwMDAsIDB4MDAwZiwKKwkweDFjNjAsIDB4MDAwMCwgMHgxYjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAyMzEsIDB4MDAwOCwKKwkweDQ0Y2MsIDB4MDAwYiwgMHg1OGNkLCAweDAwMGIsIDB4MDE0MCwgMHgwMDA4LCAweDAyNDIsIDB4MDAwMCwKKwkweDFmNDMsIDB4MDAwMiwgMHgwY2RiLCAweDAwMGIsIDB4MGQ0NCwgMHgwMDAwLCAweDBkNDYsIDB4MDAwOCwKKwkweDAzNDgsIDB4MDAwOCwgMHgwNDRhLCAweDAwMDgsIDB4MDMwYSwgMHgwMDA4LCAweDA0MGMsIDB4MDAwMCwKKwkweDBkMDYsIDB4MDAwMCwgMHgwZDA4LCAweDAwMDgsIDB4MDBkZiwgMHgwMDAzLCAweDAzNDQsIDB4MDAwOCwKKwkweDA0NDYsIDB4MDAwOCwgMHgwNTQ4LCAweDAwMDgsIDB4MDY0YSwgMHgwMDAwLCAweDE5NDgsIDB4MDAwYSwKKwkweDA4ZTIsIDB4MDAwMywgMHgwZDRhLCAweDAwMDgsIDB4NThlMiwgMHgwMDAzLCAweDNlZmUsIDB4MDAwOCwKKwkweDdmNGYsIDB4MDAwMiwgMHgwOGU5LCAweDAwMGIsIDB4ODAwMCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMCwKKwkweDAwOTIsIDB4MDAwYywgMHg4MDU0LCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwKKwkweDIwMjAsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsIDB4M2E0MCwgMHgwMDBhLCAweDBjMGQsIDB4MDAwMywKKwkweDJiMjQsIDB4MDAwOCwgMHgyYjI0LCAweDAwMDgsIDB4NThmMiwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDIsIDB4MDAwMCwgMHgxMjQyLCAweDAwMDIsIDB4MDk0MCwgMHgwMDAzLCAweDNhNDUsIDB4MDAwYSwKKwkweDA5MmYsIDB4MDAwMywgMHg4MDcyLCAweDAwMDAsIDB4MTAwMCwgMHgwMDAwLCAweDM5NDUsIDB4MDAwYSwKKwkweDA4ZmYsIDB4MDAwMywgMHg4MDcyLCAweDAwMDAsIDB4MzAxMCwgMHgwMDAwLCAweDFlMTAsIDB4MDAwYSwKKwkweDdmM2MsIDB4MDAwMCwgMHgwOTJhLCAweDAwMDMsIDB4MWQwMCwgMHgwMDAyLCAweDdmM2EsIDB4MDAwMCwKKwkweDBkNjAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwKKwkweDQ1MDgsIDB4MDAwYiwgMHgwMGZlLCAweDAwMDAsIDB4MzUyNywgMHgwMDBiLCAweDFjNjAsIDB4MDAwMCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwKKwkweDQ1MTAsIDB4MDAwYiwgMHgwMGZlLCAweDAwMDAsIDB4MzI0MywgMHgwMDBiLCAweDAwMzgsIDB4MDAwMCwKKwkweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAxOSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMDksIDB4MDAwOCwgMHg0NTE5LCAweDAwMGIsIDB4ODBjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwKKwkweDdmM2UsIDB4MDAwOCwgMHgwZDYwLCAweDAwMDAsIDB4MGVmZSwgMHgwMDA4LCAweDFmODAsIDB4MDAwMSwKKwkweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LCAweDQ1MjMsIDB4MDAwYiwKKwkweDAwM2EsIDB4MDAwOCwgMHgxZGZlLCAweDAwMDAsIDB4MDEwNCwgMHgwMDBiLCAweDAwMzYsIDB4MDAwOCwKKwkweDAwYzgsIDB4MDAwYywgMHgwMTQwLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4MDE0MCwgMHgwMDBiLCAweDNhNDQsIDB4MDAwMiwKKwkweDBhNzEsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsIDB4MTAwMCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwKKwkweDEwMDAsIDB4MDAwMCwgMHgyZDBlLCAweDAwMDAsIDB4MmQwZSwgMHgwMDAwLCAweDM2NDAsIDB4MDAwMywKKwkweDI2ZmUsIDB4MDAwOCwgMHgyNmZlLCAweDAwMDgsIDB4MjcwMCwgMHgwMDA4LCAweDI3MDAsIDB4MDAwOCwKKwkweDAwZDAsIDB4MDAwOSwgMHgwZDUyLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweDQwNDAsIDB4MDAwOCwKKwkweDU5NDAsIDB4MDAwMywgMHg1MGVlLCAweDAwMGIsIDB4M2E0NiwgMHgwMDBhLCAweDBkNTIsIDB4MDAwYiwKKwkweDNhNDcsIDB4MDAwMiwgMHgwOTRkLCAweDAwMGIsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwKKwkweDgwNzQsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwKKwkweDAxOWMsIDB4MDAwMywgMHg5MmMwLCAweDAwMDksIDB4MGZjOCwgMHgwMDAwLCAweDA4MGEsIDB4MDAwMywKKwkweDEyNDYsIDB4MDAwYSwgMHgwZTNhLCAweDAwMDMsIDB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMDIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MzYyYSwgMHgwMDAwLCAweDQ1NTcsIDB4MDAwYiwKKwkweDIwMDAsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4MjEwMiwgMHgwMDAwLCAweDIxMDIsIDB4MDAwMCwKKwkweDIyMDQsIDB4MDAwMCwgMHgyMjA0LCAweDAwMDAsIDB4MjMwNiwgMHgwMDAwLCAweDIzMDYsIDB4MDAwMCwKKwkweDI0MDgsIDB4MDAwMCwgMHgyNDA4LCAweDAwMDAsIDB4MjUwYSwgMHgwMDAwLCAweDI1MGEsIDB4MDAwMCwKKwkweDI2MGMsIDB4MDAwMCwgMHgyNjBjLCAweDAwMDAsIDB4MjcwZSwgMHgwMDAwLCAweDI3MGUsIDB4MDAwMCwKKwkweDI4MTAsIDB4MDAwMCwgMHgyODEwLCAweDAwMDAsIDB4MjkxMiwgMHgwMDAwLCAweDI5MTIsIDB4MDAwMCwKKwkweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwKKwkweDAwNTIsIDB4MDAwMCwgMHg0NTcxLCAweDAwMDMsIDB4OTJjMCwgMHgwMDA5LCAweDA3ODAsIDB4MDAwOCwKKwkweDBlNTYsIDB4MDAwMywgMHgxMjRiLCAweDAwMDIsIDB4MDk3YSwgMHgwMDAzLCAweDJlNGQsIDB4MDAwMiwKKwkweDJlNGQsIDB4MDAwMiwgMHgwYTQwLCAweDAwMDMsIDB4M2E0NiwgMHgwMDBhLCAweDBkOGEsIDB4MDAwYiwKKwkweDU5N2MsIDB4MDAwMywgMHg4MDU0LCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLCAweDEyNDMsIDB4MDAwYSwKKwkweDA5OTgsIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsIDB4MDAwZCwgMHgwMDAwLCAweDAyMWIsIDB4MDAwYywKKwkweDE5NDgsIDB4MDAwYSwgMHgwOTg3LCAweDAwMGIsIDB4MDIxMCwgMHgwMDA0LCAweDE4MTAsIDB4MDAwMCwKKwkweDAyMWIsIDB4MDAwYywgMHgwMTk4LCAweDAwMGIsIDB4MTk0OCwgMHgwMDBhLCAweDA5OGUsIDB4MDAwYiwKKwkweDEyNDMsIDB4MDAwYSwgMHgwYTQzLCAweDAwMDMsIDB4MTk0ZCwgMHgwMDBhLCAweDA5OTIsIDB4MDAwMywKKwkweDEyNDMsIDB4MDAwYSwgMHgwYTRhLCAweDAwMDMsIDB4NTk5MiwgMHgwMDAzLCAweDgwNTQsIDB4MDAwOCwKKwkweDAwMDQsIDB4MDAwMCwgMHgwMjEwLCAweDAwMDQsIDB4MTgxMCwgMHgwMDAwLCAweDAyMWIsIDB4MDAwYywKKwkweDgwNzQsIDB4MDAwMCwgMHhmMDAwLCAweDAwMDgsIDB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwKKwkweDBkMzAsIDB4MDAwMCwgMHgzYTQyLCAweDAwMDIsIDB4MGRhMiwgMHgwMDBiLCAweDE1ZmUsIDB4MDAwOCwKKwkweDM0NjEsIDB4MDAwYiwgMHgwMDBhLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweDA1MDEsIDB4MDAwMCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDBjLCAweDAwMDgsIDB4MDIxYiwgMHgwMDBjLCAweDAwMGEsIDB4MDAwYiwKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDMwLCAweDAwMDgsIDB4MGRiOCwgMHgwMDAzLCAweDE4ZmUsIDB4MDAwMCwKKwkweDNjZTAsIDB4MDAwOSwgMHgwOWI1LCAweDAwMDMsIDB4MTVmZSwgMHgwMDA4LCAweDNjZTAsIDB4MDAwOSwKKwkweDA5YjUsIDB4MDAwMywgMHgwMjBiLCAweDAwMDQsIDB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwKKwkweDAyMDgsIDB4MDAwYiwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MSwgMHgwMDA4LCAweDAyMDgsIDB4MDAwYiwKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDMyLCAweDAwMDAsIDB4MGRiZCwgMHgwMDAzLCAweDNjMWUsIDB4MDAwOCwKKwkweDAyMDgsIDB4MDAwYiwgMHhiYmUwLCAweDAwMDksIDB4MDAzYiwgMHgwMDAwLCAweDBkYzIsIDB4MDAwYiwKKwkweDNjMjAsIDB4MDAwMCwgMHgwMjA4LCAweDAwMGIsIDB4YmJlMCwgMHgwMDA5LCAweDAwMzUsIDB4MDAwOCwKKwkweDBkYzgsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAzODQsIDB4MDAwYiwKKwkweGJiZTAsIDB4MDAwOSwgMHgwMDM2LCAweDAwMDgsIDB4MGFhNSwgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMzcsIDB4MDAwMCwgMHgwZGU5LCAweDAwMGIsIDB4MThmZSwgMHgwMDAwLCAweDNjZTAsIDB4MDAwOSwKKwkweDBkYjUsIDB4MDAwYiwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MCwgMHgwMDAwLCAweDFhNjAsIDB4MDAwMCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDBkLCAweDAwMDAsIDB4MjYwNCwgMHgwMDA4LCAweDI2MDQsIDB4MDAwOCwKKwkweDI3MDYsIDB4MDAwOCwgMHgyNzA2LCAweDAwMDgsIDB4MjgwOCwgMHgwMDAwLCAweDI4MDgsIDB4MDAwMCwKKwkweDI5MGEsIDB4MDAwMCwgMHgyOTBhLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA0MjIsIDB4MDAwMCwKKwkweDQ1ZTAsIDB4MDAwYiwgMHgwMjEwLCAweDAwMDQsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwKKwkweDgwNzQsIDB4MDAwMCwgMHhmMDAwLCAweDAwMDgsIDB4ODA3MiwgMHgwMDAwLCAweGIwMDAsIDB4MDAwMCwKKwkweDAxOWMsIDB4MDAwMywgMHhiYmUwLCAweDAwMDksIDB4MDAzOCwgMHgwMDAwLCAweDBkZmIsIDB4MDAwYiwKKwkweDE4ZmUsIDB4MDAwMCwgMHgzY2UwLCAweDAwMDksIDB4MDlmOCwgMHgwMDAzLCAweDE1ZmUsIDB4MDAwOCwKKwkweDNjZTAsIDB4MDAwOSwgMHgwZGIxLCAweDAwMDMsIDB4MDIwYiwgMHgwMDA0LCAweDgwNzYsIDB4MDAwOCwKKwkweDAwNDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAyNjgsIDB4MDAwYiwKKwkweDgwNzYsIDB4MDAwOCwgMHgwMDQyLCAweDAwMDgsIDB4MDIwOCwgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMTYsIDB4MDAwMCwgMHgwZTA4LCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweDA4MDgsIDB4MDAwOCwKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBjLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweDA4MDAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDBmLCAweDAwMGEsIDB4MDAwYiwKKwkweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLCAweDNkMzAsIDB4MDAwYSwKKwkweDdmMDAsIDB4MDAwMCwgMHhiYzgwLCAweDAwMDEsIDB4MDAwNywgMHgwMDAwLCAweDAyMTQsIDB4MDAwMywKKwkweDE5MzAsIDB4MDAwYSwgMHg3ZjAwLCAweDAwMDAsIDB4OTg4MCwgMHgwMDAxLCAweDAwMDcsIDB4MDAwMCwKKwkweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwKKwkweDAwMGEsIDB4MDAwOCwgMHg0NjE5LCAweDAwMGIsIDB4NDAwMCwgMHgwMDBmLCAweDIyMWUsIDB4MDAwYiwKKwkweDA4NzAsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsIDB4N2UxYiwgMHgwMDBiLCAweGJiZTAsIDB4MDAwOSwKKwkweDAwMzAsIDB4MDAwOCwgMHgwZTFiLCAweDAwMDMsIDB4MThmZSwgMHgwMDAwLCAweDNjZTAsIDB4MDAwOSwKKwkweDBhMmMsIDB4MDAwMywgMHgxNWZlLCAweDAwMDgsIDB4M2NlMCwgMHgwMDA5LCAweDBhMmMsIDB4MDAwMywKKwkweDAyMGIsIDB4MDAwNCwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MCwgMHgwMDAwLCAweDAyMmUsIDB4MDAwMywKKwkweDgwNzYsIDB4MDAwOCwgMHgwMDQxLCAweDAwMDgsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDAyMWIsIDB4MDAwMywgMHhiYWMwLCAweDAwMDksIDB4MDA5MCwgMHgwMDA4LCAweDBhMzcsIDB4MDAwMywKKwkweDgwNzQsIDB4MDAwMCwgMHgwNzA2LCAweDAwMDAsIDB4MDIzOSwgMHgwMDAzLCAweDgwNzQsIDB4MDAwMCwKKwkweDA3MDMsIDB4MDAwMCwgMHg0MDAwLCAweDAwMGYsIDB4ODAxMCwgMHgwMDA4LCAweDAwMjMsIDB4MDAwMCwKKwkweDAyNzYsIDB4MDAwYiwgMHg4MDEwLCAweDAwMDgsIDB4MDAwOCwgMHgwMDAwLCAweDAyNzYsIDB4MDAwYiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDIyLCAweDAwMDgsIDB4MDI3NiwgMHgwMDBiLCAweDAyMTAsIDB4MDAwNCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDA3LCAweDAwMDAsIDB4MDIxYiwgMHgwMDBjLCAweDE4MTAsIDB4MDAwMCwKKwkweDAyMWIsIDB4MDAwYywgMHgwMjgyLCAweDAwMDMsIDB4MDIxMCwgMHgwMDA0LCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMWIsIDB4MDAwOCwgMHgwMjFiLCAweDAwMGMsIDB4MTgxMCwgMHgwMDAwLCAweDAyMWIsIDB4MDAwYywKKwkweDgwNzQsIDB4MDAwMCwgMHhmMDgwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwKKwkweDBkMzAsIDB4MDAwMCwgMHgwMDBhLCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDksIDB4MDAwOCwKKwkweDAyNzYsIDB4MDAwYiwgMHg4MDEwLCAweDAwMDgsIDB4MDAwNSwgMHgwMDA4LCAweDAyNzYsIDB4MDAwYiwKKwkweDE2NDgsIDB4MDAwYSwgMHgwYzZmLCAweDAwMGIsIDB4ODA4YywgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4NDE0MywgMHgwMDBhLCAweDA4NmYsIDB4MDAwMywKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBhLCAweDAwMGIsIDB4MGQyYSwgMHgwMDA4LCAweDAyNzYsIDB4MDAwYiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDgsIDB4MDI3YSwgMHgwMDBiLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMGIsIDB4MDAwMCwgMHgwMjdhLCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwKKwkweDAyN2EsIDB4MDAwYiwgMHgzYTQ3LCAweDAwMDIsIDB4MGQ0MCwgMHgwMDBiLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMDYsIDB4MDAwOCwgMHgwMjdhLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweGYwMDAsIDB4MDAwOCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MDIxYiwgMHgwMDBjLCAweDAyMzEsIDB4MDAwNCwKKwkweDNhNDAsIDB4MDAwYSwgMHgwODBhLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LCAweDAwMGMsIDB4MDAwOCwKKwkweDAyMWIsIDB4MDAwYywgMHgwMDBhLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLCAweGYwODAsIDB4MDAwMCwKKwkweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLCAweDJlNGQsIDB4MDAwMiwKKwkweDJlNGQsIDB4MDAwMiwgMHgwYThkLCAweDAwMGIsIDB4ODA1NCwgMHgwMDA4LCAweDAwMTksIDB4MDAwMCwKKwkweDAwMGEsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAwOSwgMHgwMDA4LCAweDAwMGEsIDB4MDAwYiwKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBhLCAweDAwMGIsIDB4MDI2YiwgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwKKwkweDAwMDAsIDB4MDAwOCwgMHg0NDQ3LCAweDAwMDIsIDB4MGFiOSwgMHgwMDAzLCAweGMwYzAsIDB4MDAwMSwKKwkweDAwZmYsIDB4MDAwOCwgMHhmZmUwLCAweDAwMDksIDB4MDBmZiwgMHgwMDA4LCAweDBlOTAsIDB4MDAwMywKKwkweGMxZTAsIDB4MDAwMSwgMHhmZmZmLCAweDAwMDgsIDB4MGU5MCwgMHgwMDAzLCAweDgwMTAsIDB4MDAwOCwKKwkweDAwMTMsIDB4MDAwMCwgMHgwMjFiLCAweDAwMGMsIDB4ODA3NCwgMHgwMDAwLCAweDAyMDIsIDB4MDAwOCwKKwkweDAwMGEsIDB4MDAwYiwgMHgzYTQwLCAweDAwMGEsIDB4MGViNiwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwKKwkweDAyMDAsIDB4MDAwMCwgMHgzZDAwLCAweDAwMDAsIDB4M2NmZSwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwKKwkweDgwMDAsIDB4MDAwMCwgMHg0M2UwLCAweDAwMDEsIDB4MGViNCwgMHgwMDAzLCAweDQyZmUsIDB4MDAwMCwKKwkweGZmYzAsIDB4MDAwMSwgMHgwMGZmLCAweDAwMDgsIDB4MDBlMCwgMHgwMDA5LCAweDBhOTAsIDB4MDAwYiwKKwkweDBkMDgsIDB4MDAwOCwgMHgwMzA5LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwKKwkweDAwMGEsIDB4MDAwYiwgMHgwMzhkLCAweDAwMDQsIDB4ODA4YywgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwKKwkweDA0ZmUsIDB4MDAwOCwgMHgzMzcwLCAweDAwMDMsIDB4MDQ2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMDEsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LCAweDQ2YzMsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwMCwgMHg4MGMwLCAweDAwMDksIDB4MDBmZiwgMHgwMDA4LCAweDdmMDAsIDB4MDAwMCwKKwkweDgwZTAsIDB4MDAwMSwgMHgwMDA0LCAweDAwMDAsIDB4MGFkZCwgMHgwMDBiLCAweDgwZTAsIDB4MDAwMSwKKwkweDAwMDUsIDB4MDAwOCwgMHgwYWRkLCAweDAwMGIsIDB4ODBlMCwgMHgwMDAxLCAweDAwMDYsIDB4MDAwOCwKKwkweDBhZGQsIDB4MDAwYiwgMHg4MmMwLCAweDAwMDEsIDB4ZmYwMCwgMHgwMDA4LCAweDdmMDQsIDB4MDAwOCwKKwkweDgyZTAsIDB4MDAwOSwgMHgwNjAwLCAweDAwMDgsIDB4MGFkZCwgMHgwMDBiLCAweDgyZTAsIDB4MDAwOSwKKwkweDA1MDAsIDB4MDAwOCwgMHgwYWRkLCAweDAwMGIsIDB4ODJlMCwgMHgwMDA5LCAweDA0MDAsIDB4MDAwMCwKKwkweDBmNzAsIDB4MDAwMywgMHhjNGMwLCAweDAwMDksIDB4NzAwMCwgMHgwMDAwLCAweGZmZTAsIDB4MDAwOSwKKwkweDEwMDAsIDB4MDAwMCwgMHgwYjA5LCAweDAwMDMsIDB4MDM3ZSwgMHgwMDA0LCAweDM5NDEsIDB4MDAwMiwKKwkweDBhZTgsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwKKwkweDA0NjAsIDB4MDAwMCwgMHg4MGZlLCAweDAwMDgsIDB4MDAyYiwgMHgwMDA4LCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgyMjA5LCAweDAwMDgsIDB4NDZlZSwgMHgwMDAzLCAweDExZmUsIDB4MDAwMCwKKwkweDMzMDQsIDB4MDAwMywgMHg5MTgwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDA2MDksIDB4MDAwOCwKKwkweDQ2ZjgsIDB4MDAwYiwgMHg0MmZlLCAweDAwMDAsIDB4ZmZjMCwgMHgwMDAxLCAweGZmMDAsIDB4MDAwOCwKKwkweDAzZTAsIDB4MDAwOSwgMHgwZjAxLCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwKKwkweDAwNDYsIDB4MDAwMywgMHg5MTgwLCAweDAwMDEsIDB4MDAwMywgMHgwMDA4LCAweDAyZWIsIDB4MDAwMywKKwkweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4ODAxMCwgMHgwMDA4LCAweDAwMTAsIDB4MDAwMCwKKwkweDAzNjEsIDB4MDAwMywgMHgwMzdlLCAweDAwMDQsIDB4Mzk0MSwgMHgwMDAyLCAweDBiMGYsIDB4MDAwMywKKwkweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLCAweDAzNDYsIDB4MDAwYywKKwkweDExZmUsIDB4MDAwMCwgMHgzNzE3LCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDBlLCAweDAwMDAsIDB4MDM2MSwgMHgwMDAzLCAweDgwNjAsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHgwNGZlLCAweDAwMDgsIDB4MzcyYywgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwKKwkweDAwMDAsIDB4MDAwOCwgMHg5MTgwLCAweDAwMDEsIDB4MDAwNSwgMHgwMDA4LCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4NDcyMiwgMHgwMDBiLCAweDAwNjAsIDB4MDAwOCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDFiLCAweDAwMDgsIDB4NDMwNCwgMHgwMDA4LCAweDQyMDYsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwNDEyLCAweDAwMDAsIDB4NDcyYSwgMHgwMDAzLCAweDAzNDMsIDB4MDAwMywKKwkweDgwOGMsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsIDB4MDQ2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwKKwkweDAwMmIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDYwOSwgMHgwMDA4LCAweDQ3MzMsIDB4MDAwYiwKKwkweDgwNjYsIDB4MDAwMCwgMHgyMjBhLCAweDAwMDgsIDB4NDczNiwgMHgwMDBiLCAweDQyZmUsIDB4MDAwMCwKKwkweGZmYzAsIDB4MDAwMSwgMHhmZjAwLCAweDAwMDgsIDB4N2YwNCwgMHgwMDA4LCAweDgwNjAsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHg5MTgwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwNDFhLCAweDAwMDgsIDB4NDc0MiwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHgwMDQ2LCAweDAwMDMsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwKKwkweDEzNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDQxMSwgMHgwMDAwLCAweDQ3NGIsIDB4MDAwYiwKKwkweDAyZmUsIDB4MDAwOCwgMHgwM2UwLCAweDAwMDksIDB4MGY1MSwgMHgwMDAzLCAweDBkMjIsIDB4MDAwMCwKKwkweDQwMDAsIDB4MDAwZiwgMHg4MjgwLCAweDAwMDksIDB4MDAwMiwgMHgwMDAwLCAweDEzODAsIDB4MDAwMSwKKwkweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MjIwOSwgMHgwMDA4LCAweDQ3NTcsIDB4MDAwMywKKwkweDAyMDAsIDB4MDAwYSwgMHhmZmMwLCAweDAwMDEsIDB4MDAwNywgMHgwMDAwLCAweDdmMDYsIDB4MDAwMCwKKwkweDEzNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDYwYSwgMHgwMDA4LCAweDQ3NWYsIDB4MDAwYiwKKwkweDQwMDAsIDB4MDAwZiwgMHgzYTQ0LCAweDAwMDIsIDB4MGMwYSwgMHgwMDBiLCAweDJmNDQsIDB4MDAwYSwKKwkweDJmNDQsIDB4MDAwYSwgMHgwZTZiLCAweDAwMGIsIDB4ODA4YSwgMHgwMDA4LCAweDAwMDMsIDB4MDAwOCwKKwkweDgwNzQsIDB4MDAwMCwgMHhmMDgwLCAweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwKKwkweDViNmMsIDB4MDAwMywgMHg4MDU0LCAweDAwMDgsIDB4MDAxOSwgMHgwMDAwLCAweDAwMGEsIDB4MDAwYiwKKwkweDNhNDQsIDB4MDAwMiwgMHgwYzBhLCAweDAwMGIsIDB4ODA4YywgMHgwMDA4LCAweDAwMDAsIDB4MDAwOCwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDExLCAweDAwMDgsIDB4MDIxYiwgMHgwMDBjLCAweDQyZmUsIDB4MDAwMCwKKwkweGZmYzAsIDB4MDAwMSwgMHgwMGZmLCAweDAwMDgsIDB4N2YxMCwgMHgwMDA4LCAweDAyMWIsIDB4MDAwYywKKwkweDQzMTAsIDB4MDAwOCwgMHgwMjdhLCAweDAwMGIsIDB4Mzk0MSwgMHgwMDAyLCAweDBiODEsIDB4MDAwMywKKwkweDQwMDAsIDB4MDAwZiwgMHg4MDcyLCAweDAwMDAsIDB4MDQwNCwgMHgwMDA4LCAweDQwMDAsIDB4MDAwZiwKKwkweDgwMTAsIDB4MDAwOCwgMHgwMDEyLCAweDAwMDgsIDB4MDIxYiwgMHgwMDBjLCAweDAzNDYsIDB4MDAwYywKKwkweDExMTAsIDB4MDAwMCwgMHgwMjFiLCAweDAwMGMsIDB4MTFmZSwgMHgwMDAwLCAweDM3ODcsIDB4MDAwMywKKwkweDAwMGEsIDB4MDAwYiwgMHhjMmMwLCAweDAwMDksIDB4MDBmZiwgMHgwMDA4LCAweDdmMDAsIDB4MDAwMCwKKwkweGMzYzAsIDB4MDAwMSwgMHhmZjAwLCAweDAwMDgsIDB4MDBkMCwgMHgwMDA5LCAweDBiYjIsIDB4MDAwMywKKwkweDBkMGEsIDB4MDAwMCwgMHg4NTgwLCAweDAwMDEsIDB4MTAwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA4MDksIDB4MDAwMCwKKwkweDQ3OWMsIDB4MDAwYiwgMHgwNGZlLCAweDAwMDgsIDB4MzNhYiwgMHgwMDAzLCAweDA0NjAsIDB4MDAwMCwKKwkweDgwNjIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAyMTEsIDB4MDAwMCwKKwkweDQ3YTQsIDB4MDAwMywgMHgwMWZlLCAweDAwMDgsIDB4MDBlMCwgMHgwMDA5LCAweDBmYWIsIDB4MDAwMywKKwkweDAyZmUsIDB4MDAwOCwgMHg0M2UwLCAweDAwMDEsIDB4MGJiMSwgMHgwMDAzLCAweDA1MDAsIDB4MDAwMiwKKwkweDdmMGEsIDB4MDAwMCwgMHhmZmUwLCAweDAwMDksIDB4MDgwMCwgMHgwMDAwLCAweDBmOTUsIDB4MDAwYiwKKwkweDBkMDgsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsIDB4NDNmZSwgMHgwMDA4LCAweDNlODAsIDB4MDAwMSwKKwkweGZmYzAsIDB4MDAwMSwgMHg3ZmZmLCAweDAwMDAsIDB4MGQ2MCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwKKwkweDgwNjYsIDB4MDAwMCwgMHgwODA5LCAweDAwMDAsIDB4NDdiYSwgMHgwMDAzLCAweDgwNjAsIDB4MDAwMCwKKwkweDA0MDAsIDB4MDAwMCwgMHg4NGMwLCAweDAwMDEsIDB4ZmYwMCwgMHgwMDA4LCAweDdmNjAsIDB4MDAwYSwKKwkweDdmNjAsIDB4MDAwYSwgMHg3ZjYwLCAweDAwMGEsIDB4N2Y2MCwgMHgwMDBhLCAweDdmNjAsIDB4MDAwYSwKKwkweDdmNjAsIDB4MDAwYSwgMHg3ZjYwLCAweDAwMGEsIDB4N2Y2MCwgMHgwMDBhLCAweGZmODAsIDB4MDAwOSwKKwkweDEwMDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLCAweDA4MDksIDB4MDAwMCwKKwkweDQ3Y2MsIDB4MDAwYiwgMHg0MDAwLCAweDAwMGYsIDB4NWZmNCwgMHhlYmVkLCAweDAwMDEsIDB4MDAwMiwKKwkweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLCAweDAxMDAsIDB4MDIwMCwKKwkweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCwgMHg4MDAwLCAweGEyNTgKK307CisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMwMGlweF9sZW5ndGgwMSA9IDB4ZWI1NzsKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfbGVuZ3RoMDEgPSAweGViNTc7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzIyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDIzMjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGI2ZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzIyLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBRTG9naWMgSVNQMjMyMiBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworc3RhdGljIGNoYXIgcWxhX2RyaXZlcl9uYW1lW10gPSAicWxhMjMyMiI7CisKK2V4dGVybiB1bnNpZ25lZCBjaGFyICBmdzIzMjJpcHhfdmVyc2lvbltdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjMyMmlweF92ZXJzaW9uX3N0cltdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMyMmlweF9hZGRyMDE7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMzIyaXB4X2NvZGUwMVtdOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGZ3MjMyMmlweF9sZW5ndGgwMTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHJzZXFpcHhfY29kZV9hZGRyMDE7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgcnNlcWlweF9jb2RlMDFbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCByc2VxaXB4X2NvZGVfbGVuZ3RoMDE7CitleHRlcm4gdW5zaWduZWQgbG9uZyB4c2VxaXB4X2NvZGVfYWRkcjAxOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHhzZXFpcHhfY29kZTAxW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgeHNlcWlweF9jb2RlX2xlbmd0aDAxOworCitzdGF0aWMgc3RydWN0IHFsYV9md19pbmZvIHFsYV9md190YmxbXSA9IHsKKwl7CisJCS5hZGRyZXNzaW5nCT0gRldfSU5GT19BRERSX05PUk1BTCwKKwkJLmZ3Y29kZQkJPSAmZncyMzIyaXB4X2NvZGUwMVswXSwKKwkJLmZ3bGVuCQk9ICZmdzIzMjJpcHhfbGVuZ3RoMDEsCisJCS5md3N0YXJ0CT0gJmZ3MjMyMmlweF9hZGRyMDEsCisJfSwKKwl7CisJCS5hZGRyZXNzaW5nCT0gRldfSU5GT19BRERSX0VYVEVOREVELAorCQkuZndjb2RlCQk9ICZyc2VxaXB4X2NvZGUwMVswXSwKKwkJLmZ3bGVuCQk9ICZyc2VxaXB4X2NvZGVfbGVuZ3RoMDEsCisJCS5sZndzdGFydAk9ICZyc2VxaXB4X2NvZGVfYWRkcjAxLAorCX0sCisJeworCQkuYWRkcmVzc2luZwk9IEZXX0lORk9fQUREUl9FWFRFTkRFRCwKKwkJLmZ3Y29kZQkJPSAmeHNlcWlweF9jb2RlMDFbMF0sCisJCS5md2xlbgkJPSAmeHNlcWlweF9jb2RlX2xlbmd0aDAxLAorCQkubGZ3c3RhcnQJPSAmeHNlcWlweF9jb2RlX2FkZHIwMSwKKwl9LAorCXsgRldfSU5GT19BRERSX05PTU9SRSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gcWxhX2JvYXJkX3RibFtdID0geworCXsKKwkJLmRydl9uYW1lCT0gcWxhX2RyaXZlcl9uYW1lLAorCQkuaXNwX25hbWUJPSAiSVNQMjMyMiIsCisJCS5md19pbmZvCT0gcWxhX2Z3X3RibCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHFsYTIzMjJfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzIyLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZxbGFfYm9hcmRfdGJsWzBdLAorCX0sCisJezAsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbGEyMzIyX3BjaV90YmwpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcWxhMjMyMl9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gcWxhMngwMF9wcm9iZV9vbmUocGRldiwKKwkgICAgKHN0cnVjdCBxbGFfYm9hcmRfaW5mbyAqKWlkLT5kcml2ZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorcWxhMjMyMl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXFsYTJ4MDBfcmVtb3ZlX29uZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFsYTIzMjJfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicWxhMjMyMiIsCisJLmlkX3RhYmxlCT0gcWxhMjMyMl9wY2lfdGJsLAorCS5wcm9iZQkJPSBxbGEyMzIyX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHFsYTIzMjJfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcWxhMjMyMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcWxhMjMyMl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitxbGEyMzIyX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnFsYTIzMjJfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHFsYTIzMjJfaW5pdCk7Cittb2R1bGVfZXhpdChxbGEyMzIyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJRTG9naWMgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIElTUDIzMjIgRkMtU0NTSSBIb3N0IEJ1cyBBZGFwdGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUUxBMlhYWF9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMyMl9mdy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWwyMzIyX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjNWE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsMjMyMl9mdy5jCkBAIC0wLDAgKzEsODEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzIFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiAzLjAzLjA4ICgxMDowMyBOb3YgMTIsIDIwMDQpCisgKi8KKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMjJpcHhfdmVyc2lvbiA9IDMqMTAyNCszOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV92ZXJzaW9uID0gMyoxMDI0KzM7CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBjaGFyIGZ3MjMyMmlweF92ZXJzaW9uX3N0cltdID0gezMsIDMsIDh9OworI2Vsc2UKK3Vuc2lnbmVkIGNoYXIgZmlybXdhcmVfdmVyc2lvbltdID0gezMsIDMsIDh9OworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorI2RlZmluZSBmdzIzMjJpcHhfVkVSU0lPTl9TVFJJTkcgIjMuMDMuMDgiCisjZWxzZQorI2RlZmluZSBGV19WRVJTSU9OX1NUUklORyAiMy4wMy4wOCIKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMyMmlweF9hZGRyMDEgPSAweDA4MDAgOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDA4MDAgOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzIyaXB4X2NvZGUwMVtdID0geyAKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUwMVtdID0geyAKKyNlbmRpZgorCTB4MDQ3MCwgMHgwMDAwLCAweDAwMDAsIDB4ZTBjMiwgMHgwMDAwLCAweDAwMDMsIDB4MDAwMywgMHgwMDA4LAorCTB4MDEzNywgMHgyMDQzLCAweDRmNTAsIDB4NTk1MiwgMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMiwgMHgzMDMwLAorCTB4MzEyMCwgMHg1MTRjLCAweDRmNDcsIDB4NDk0MywgMHgyMDQzLCAweDRmNTIsIDB4NTA0ZiwgMHg1MjQxLAorCTB4NTQ0OSwgMHg0ZjRlLCAweDIwNDksIDB4NTM1MCwgMHgzMjMzLCAweDMwMzAsIDB4MjA0NiwgMHg2OTcyLAorCTB4NmQ3NywgMHg2MTcyLCAweDY1MjAsIDB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLAorCTB4MzMyZSwgMHgzMDMzLCAweDJlMzAsIDB4MzgyMCwgMHgyMDIwLCAweDIwMjAsIDB4MjQwMCwgMHgyMGE5LAorCTB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDIyMDAsIDB4MjBhOSwgMHgwMDBmLAorCTB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyNDAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLAorCTB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjYwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLAorCTB4NDAwZiwgMHgyMDkxLCAweDI4MDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLAorCTB4MjA5MSwgMHgyYTAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLAorCTB4MmMwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyZTAwLAorCTB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjAwMCwgMHgyMDAxLAorCTB4MDAwMCwgMHgyMGMxLCAweDAwMDQsIDB4MjBjOSwgMHgxY2ZmLCAweDIwNTksIDB4MDAwMCwgMHgyYjc4LAorCTB4Nzg4MywgMHgwMDA0LCAweDIwODksIDB4MmIxNCwgMHgyMDUxLCAweDE4MDAsIDB4MmE3MCwgMHgyMGUxLAorCTB4MDAwMSwgMHgyMGU5LCAweDAwMDEsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MGU2MiwgMHgwMGY2LAorCTB4Nzg4OCwgMHg5MDA1LCAweDExZjgsIDB4MjA2MSwgMHhjMDAwLCAweDA4MGMsIDB4MjBiMCwgMHgxMTcwLAorCTB4MjA3OSwgMHgwMzAwLCAweDA4MGMsIDB4MjBjNiwgMHgyMDYxLCAweGUwMDAsIDB4MDgwYywgMHgyMGIwLAorCTB4MTEyOCwgMHgyMDc5LCAweDAzODAsIDB4MDgwYywgMHgyMGM2LCAweDAwNjAsIDB4MDBmZSwgMHg3ODgzLAorCTB4NDAxMCwgMHg3ODM3LCAweDQwMTAsIDB4NzgzMywgMHgwMDEwLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLAorCTB4NDA4MCwgMHgwY2Y4LCAweDAwZmUsIDB4MjAyOSwgMHg1NjAwLCAweDIwMzEsIDB4ZmZmZiwgMHgyMDM5LAorCTB4NTVkYywgMHgyMDIxLCAweDAyMDAsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDgwMCwgMHg5MDBlLCAweDQxMDQsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MTAwMCwgMHg5MDBlLAorCTB4MjAwMSwgMHgwZGMxLCAweDkwODQsIDB4MGZmZiwgMHgyMGE4LCAweDQxMDQsIDB4MjAwMSwgMHgwMDAwLAorCTB4OTA4NiwgMHgwMDAwLCAweDAxMjAsIDB4MjFhOCwgMHg0MTA0LCAweDgwMDEsIDB4MWRlMCwgMHg3NTZlLAorCTB4NzY3MiwgMHg3NzZhLCAweDc0NzYsIDB4NzQ3YSwgMHgwMGU2LCAweDIwNzEsIDB4MWI1MCwgMHgyNDcyLAorCTB4MDBlZSwgMHgyMGExLCAweDFkZGMsIDB4NzE3MCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLAorCTB4OTE4YywgMHgwMDBmLCAweDIwMDEsIDB4MDAwMSwgMHg5MTEyLCAweDkwMGUsIDB4MjFhOCwgMHg0MTA0LAorCTB4ODIxMSwgMHgxZGUwLCAweDcxNzAsIDB4MzQwMCwgMHg4MDAxLCAweDkxMDIsIDB4MDEyMCwgMHgwMjE4LAorCTB4MjBhOCwgMHg5MDBlLCAweDQxMDQsIDB4MjAwOSwgMHgxODAwLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLAorCTB4ODEwZCwgMHg4MTBkLCAweDkxOGMsIDB4MDAxZiwgMHgyMDAxLCAweDAwMDEsIDB4OTExMiwgMHgyMGU5LAorCTB4MDAwMSwgMHgyMGExLCAweDA4MDAsIDB4OTAwZSwgMHgyMGE5LCAweDA4MDAsIDB4NDEwNCwgMHg4MjExLAorCTB4MWRkOCwgMHgwODBjLCAweDBmNWYsIDB4MDgwYywgMHg2MGEwLCAweDA4MGMsIDB4YWM0NiwgMHgwODBjLAorCTB4MTExNiwgMHgwODBjLCAweDEzNDAsIDB4MDgwYywgMHgxYzA2LCAweDA4MGMsIDB4OTIxZiwgMHgwODBjLAorCTB4MGQwZiwgMHgwODBjLCAweDEwOWIsIDB4MDgwYywgMHgzNGI5LCAweDA4MGMsIDB4Nzg1NCwgMHgwODBjLAorCTB4NmIwMSwgMHgwODBjLCAweDg5OTIsIDB4MDgwYywgMHg4NWYzLCAweDA4MGMsIDB4MjJhMSwgMHgwODBjLAorCTB4N2YyYSwgMHgwODBjLCAweDIwZGYsIDB4MDgwYywgMHgyMjFkLCAweDA4MGMsIDB4MjI5NiwgMHgyMDkxLAorCTB4MzAwOSwgMHg3ODgzLCAweDAwMDAsIDB4MTAwNCwgMHgwOTQzLCAweDc4ODAsIDB4OTA4NiwgMHgwMDAyLAorCTB4MTE5MCwgMHg3ODgzLCAweDQwMDAsIDB4NzgzNywgMHg0MDAwLCAweDc4MzMsIDB4MDAxMCwgMHgwZTA0LAorCTB4MDkzNywgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LAorCTB4ZDA4NCwgMHgxOTBjLCAweDExZWUsIDB4MjA3MSwgMHgxODAwLCAweDcwMDMsIDB4MDAwMCwgMHg3ODBjLAorCTB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAwMCwgMHgxOTBjLCAweDBkN2QsIDB4MjA3MSwgMHgxODAwLAorCTB4NzAwMCwgMHg5MDhlLCAweDAwMDMsIDB4MTE2OCwgMHgwODBjLCAweDRjMTcsIDB4MDgwYywgMHgzNGUwLAorCTB4MDgwYywgMHg3OGJjLCAweDA4MGMsIDB4NzAzOSwgMHgwODBjLCAweDhhNzUsIDB4MDgwYywgMHg4NjFjLAorCTB4MGM2OCwgMHgwMDBiLCAweDBjODgsIDB4MDk2ZCwgMHgwOTZlLCAweDBiMDksIDB4MDk2YiwgMHgwYmMzLAorCTB4MGQwZSwgMHgwZDBlLCAweDBkMGUsIDB4MDgwYywgMHgwZDdkLCAweDAwMDUsIDB4MDEyNiwgMHgwMGY2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MGFkYywgMHgwODBjLAorCTB4MGViMiwgMHgwODBjLCAweDc1M2QsIDB4MDE1MCwgMHgwODBjLCAweDc1NjAsIDB4MTViMCwgMHgyMDc5LAorCTB4MDEwMCwgMHg3ODI4LCAweDkwODUsIDB4MTgwMCwgMHg3ODJhLCAweDA0NzgsIDB4MDgwYywgMHg3NDZlLAorCTB4NzAwMCwgMHg5MDg2LCAweDAwMDEsIDB4MTkwNCwgMHgwYWRjLCAweDcwOTgsIDB4OTA4NiwgMHgwMDI4LAorCTB4MTkwNCwgMHgwYWRjLCAweDA4MGMsIDB4ODVkYywgMHgwODBjLCAweDg1Y2UsIDB4MjAwMSwgMHgwMTYxLAorCTB4MjAwMywgMHgwMDAxLCAweDIwNzksIDB4MDEwMCwgMHgyMDExLCAweGZmZmYsIDB4MDgwYywgMHgyYWI0LAorCTB4N2EyOCwgMHg5Mjk1LCAweDVlMmMsIDB4N2EyYSwgMHgyMDExLCAweDczYjMsIDB4MDgwYywgMHg4NmM4LAorCTB4MjAxMSwgMHg3M2E2LCAweDA4MGMsIDB4ODdkNCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LAorCTB4MjAxMSwgMHg4MDMwLCAweDkwMWUsIDB4NzM5NiwgMHgwNGQwLCAweDA4MGMsIDB4NTdhNCwgMHgyMDc5LAorCTB4MDEwMCwgMHg3ODQ0LCAweDkwMDUsIDB4MTkwNCwgMHgwYWRjLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLAorCTB4ODZjOCwgMHgyMDExLCAweDczYjMsIDB4MDgwYywgMHg4NmM4LCAweDIwMTEsIDB4NzNhNiwgMHgwODBjLAorCTB4ODdkNCwgMHgyMDAxLCAweDAyNjUsIDB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHg3ODQwLAorCTB4OTA4NCwgMHhmZmZiLCAweDc4NDIsIDB4MjAwMSwgMHgxOWE1LCAweDIwMDQsIDB4OTAwNSwgMHgxMTQwLAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDgwYywgMHg2MDQ4LCAweDAwY2UsIDB4MDgwNCwgMHgwYWRjLAorCTB4NzgwZiwgMHgwMDZiLCAweDdhMjgsIDB4MDgwYywgMHg3NTQ1LCAweDAxMTgsIDB4OTI5NSwgMHg1ZTJjLAorCTB4MDAxMCwgMHg5Mjk1LCAweDQwMmMsIDB4N2EyYSwgMHgyMDExLCAweDgwMTAsIDB4NzNkOCwgMHgyMDAxLAorCTB4MTlhNiwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHgyOTdjLCAweDA4MGMsIDB4NGI1MiwgMHg3MjQ4LAorCTB4YzI4NCwgMHg3MjRhLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxYWMsIDB4YzFjYywgMHgyMTAyLAorCTB4MjAwMSwgMHgwMzkwLCAweDIwMDMsIDB4MDQwMCwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHhhMTEzLAorCTB4MjAxMSwgMHgwMDA0LCAweDA4MGMsIDB4Yzk4YSwgMHgwODBjLCAweGE5M2EsIDB4MDgwYywgMHg2OTg5LAorCTB4MDgwYywgMHg3NTNkLCAweDExMjAsIDB4MDgwYywgMHgyOWRkLCAweDA2MDAsIDB4MDQyMCwgMHgwODBjLAorCTB4NjA0ZiwgMHgwMTQwLCAweDcwOTcsIDB4MDAwMSwgMHg3MGQzLCAweDAwMDAsIDB4MDgwYywgMHg1OTcxLAorCTB4MDgwNCwgMHgwYWRjLCAweDA4MGMsIDB4NTczZSwgMHhkMDk0LCAweDAxYTgsIDB4MjAwMSwgMHgwMzkwLAorCTB4MjAwMywgMHgwNDA0LCAweDIwMTEsIDB4MTgwYywgMHgyMjA0LCAweGMwY2QsIDB4MjAxMiwgMHgwODBjLAorCTB4NTc0MiwgMHhkMGQ0LCAweDExMTgsIDB4MDgwYywgMHgyOWRkLCAweDEyNzAsIDB4MjAxMSwgMHgxODBjLAorCTB4MjIwNCwgMHhjMGJjLCAweDAwYTgsIDB4MDgwYywgMHg1NzQyLCAweGQwZDQsIDB4MWRiOCwgMHgyMDExLAorCTB4MTgwYywgMHgyMjA0LCAweGMwYmQsIDB4MDA2MCwgMHgyMDExLCAweDE4MGMsIDB4MjIwNCwgMHhjMGJkLAorCTB4MjAxMiwgMHgwODBjLCAweDZhZDUsIDB4MTEyOCwgMHhkMGE0LCAweDAxMTgsIDB4MjIwNCwgMHhjMGZkLAorCTB4MjAxMiwgMHgwODBjLCAweDZhOWIsIDB4MDEyMCwgMHg3YTBjLCAweGMyYjQsIDB4N2EwZSwgMHgwMGE4LAorCTB4NzA3ZiwgMHgwMDAwLCAweDA4MGMsIDB4NzUzZCwgMHgxMTMwLCAweDcwYjAsIDB4OTAwNSwgMHgxMTY4LAorCTB4MDgwYywgMHhjZGU4LCAweDAwNTAsIDB4MDgwYywgMHhjZGU4LCAweDcwZGMsIDB4ZDA5YywgMHgxMTI4LAorCTB4NzBiMCwgMHg5MDA1LCAweDAxMTAsIDB4MDgwYywgMHg2MDI1LCAweDcwZTcsIDB4MDAwMCwgMHg3MGUzLAorCTB4MDAwMCwgMHg3MGE3LCAweDAwMDAsIDB4MDgwYywgMHgyOWU1LCAweDAyMjgsIDB4MjAxMSwgMHgwMTAxLAorCTB4MjIwNCwgMHhjMGM0LCAweDIwMTIsIDB4NzJkYywgMHgwODBjLCAweDc1M2QsIDB4MTE3OCwgMHg5MDE2LAorCTB4MDAxNiwgMHgwODBjLCAweDI3NzksIDB4MjAxOSwgMHgxOTZjLCAweDIxMWEsIDB4MDAxZSwgMHg3MDVmLAorCTB4ZmZmZiwgMHg3MDYzLCAweDAwZWYsIDB4NzA4MywgMHgwMDAwLCAweDAwMjAsIDB4MjAxOSwgMHgxOTZjLAorCTB4MjAxYiwgMHgwMDAwLCAweDIwNzksIDB4MTg0NywgMHg3ODA0LCAweGQwYWMsIDB4MDEwOCwgMHhjMjk1LAorCTB4NzJkZSwgMHgwODBjLCAweDc1M2QsIDB4MDExOCwgMHg5Mjk2LCAweDAwMDQsIDB4MDUxOCwgMHgyMDExLAorCTB4MDAwMSwgMHgwODBjLCAweGM5OGEsIDB4NzBhYiwgMHgwMDAwLCAweDcwYWYsIDB4ZmZmZiwgMHg3MDAzLAorCTB4MDAwMiwgMHgwMGZlLCAweDA4MGMsIDB4MzAxMSwgMHgwODBjLCAweGE5MWUsIDB4MjAxMSwgMHgwMDA1LAorCTB4MDgwYywgMHhhMjQzLCAweDA4MGMsIDB4YTkzYSwgMHgwODBjLCAweDc1M2QsIDB4MDE0OCwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMTAwLCAweDAwMTYsIDB4MDgwYywgMHgyNzc5LCAweDYxZTIsIDB4MDAxZSwgMHgwMGNlLAorCTB4MDEyZSwgMHgwMGUwLCAweDcwYWIsIDB4MDAwMCwgMHg3MGFmLCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLAorCTB4MDgwYywgMHhhOTFlLCAweDIwMTEsIDB4MDAwNSwgMHgwODBjLCAweGEyNDMsIDB4MDgwYywgMHhhOTNhLAorCTB4MDgwYywgMHg3NTNkLCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDAxNiwgMHgwODBjLAorCTB4Mjc3OSwgMHg2MWUyLCAweDAwMWUsIDB4MDBjZSwgMHgwMGZlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDBiNiwgMHgwODBjLCAweDc1M2QsIDB4MTExOCwgMHgyMGE5LCAweDA4MDAsIDB4MDAxMCwgMHgyMGE5LAorCTB4MDc4MiwgMHgwODBjLCAweDc1M2QsIDB4MTExMCwgMHg5MDBlLCAweDAwMTAsIDB4MjAwOSwgMHgwMDdlLAorCTB4ODZmZiwgMHgwMTM4LCAweDkxODAsIDB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDExMCwgMHhiODAwLAorCTB4ZDBiYywgMHgwOTBjLCAweDMzNDksIDB4ODEwOCwgMHgxZjA0LCAweDBhZjAsIDB4NzA3ZiwgMHgwMDAwLAorCTB4NzA4MCwgMHg5MDg0LCAweDAwZmYsIDB4NzA4MiwgMHg3MGIzLCAweDAwMDAsIDB4MDBiZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGI2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAyLAorCTB4MTkwNCwgMHgwYmMwLCAweDcwYWMsIDB4OTA4NiwgMHhmZmZmLCAweDAxMjAsIDB4MDgwYywgMHgzMDExLAorCTB4MDgwNCwgMHgwYmMwLCAweDcwZGMsIDB4ZDBhYywgMHgxMTEwLCAweGQwOWMsIDB4MDUzOCwgMHhkMDg0LAorCTB4MDUyOCwgMHgwMDA2LCAweDIwMDEsIDB4MDEwMywgMHgyMDAzLCAweDAwMmIsIDB4MDAwZSwgMHhkMDhjLAorCTB4MDFlOCwgMHgwODBjLCAweDMzYjIsIDB4MTFiMCwgMHg3MGUwLCAweDkwODYsIDB4ZmZmZiwgMHgwMTkwLAorCTB4MDgwYywgMHgzMWE2LCAweDcwZGMsIDB4ZDA5NCwgMHgxOTA0LCAweDBiYzAsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHhkMDliLCAweDAxMTAsIDB4MjAxMSwgMHgwMDAzLCAweDkwMWUsIDB4MDgwYywgMHgzMWUwLAorCTB4MDgwNCwgMHgwYmMwLCAweDcwZTQsIDB4OTAwNSwgMHgxOTA0LCAweDBiYzAsIDB4NzBhOCwgMHg5MDA1LAorCTB4MTkwNCwgMHgwYmMwLCAweDcwZGMsIDB4ZDBhNCwgMHgwMTE4LCAweGQwYjQsIDB4MDkwNCwgMHgwYmMwLAorCTB4MDgwYywgMHg2YTliLCAweDE5MDQsIDB4MGJjMCwgMHgwODBjLCAweDZhZWUsIDB4MTkwNCwgMHgwYmMwLAorCTB4MDgwYywgMHg2YWQ1LCAweDAxYzAsIDB4MDE1NiwgMHgwMGM2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLAorCTB4MDAxNiwgMHgwODBjLCAweDY2OTMsIDB4MTExOCwgMHhiODAwLCAweGQwZWMsIDB4MTEzOCwgMHgwMDFlLAorCTB4ODEwOCwgMHgxZjA0LCAweDBiNjAsIDB4MDBjZSwgMHgwMTVlLCAweDAwMjgsIDB4MDAxZSwgMHgwMGNlLAorCTB4MDE1ZSwgMHgwODA0LCAweDBiYzAsIDB4MDAwNiwgMHgyMDAxLCAweDAxMDMsIDB4MjAwMywgMHgwMDJiLAorCTB4MDAwZSwgMHgyMDExLCAweDE5YjIsIDB4MDgwYywgMHgwZmNmLCAweDIwMTEsIDB4MTljYywgMHgwODBjLAorCTB4MGZjZiwgMHg3MDMwLCAweGMwOGMsIDB4NzAzMiwgMHg3MDAzLCAweDAwMDMsIDB4NzBhZiwgMHhmZmZmLAorCTB4MDgwYywgMHgwZTg2LCAweDkwMDYsIDB4MDgwYywgMHgyNjA2LCAweDA4MGMsIDB4MzNiMiwgMHgwMTE4LAorCTB4MDgwYywgMHg0Y2VmLCAweDAwNTAsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4ZmZmZiwgMHgyMDIxLAorCTB4MDAwNiwgMHgwODBjLCAweDRkMDksIDB4MDA0ZSwgMHgwMDNlLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLAorCTB4MDgwYywgMHg3NTYwLCAweDAxNTAsIDB4MDgwYywgMHg3NTNkLCAweDc4MjgsIDB4MDExOCwgMHg5MDg0LAorCTB4ZTFmZiwgMHgwMDEwLCAweDkwODQsIDB4ZmZkZiwgMHg3ODJhLCAweDAwZmUsIDB4MDgwYywgMHhhOTFlLAorCTB4MjAwMSwgMHgxOWU3LCAweDIwMDQsIDB4OTA4NiwgMHgwMDA1LCAweDExMjAsIDB4MjAxMSwgMHgwMDAwLAorCTB4MDgwYywgMHhhMjQzLCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweGEyNGQsIDB4MDgwYywgMHhhOTNhLAorCTB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwNDYsIDB4MDBmNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDEwMCwgMHg3OTA0LCAweDkxOGMsIDB4ZmZmZCwgMHg3OTA2LAorCTB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NjAwZSwgMHg3OTQwLCAweDkxOGMsIDB4MDAxMCwgMHg3OTQyLAorCTB4NzkyNCwgMHhkMWI0LCAweDAxMjAsIDB4MjAxMSwgMHgwMDQwLCAweDA4MGMsIDB4MmFiNCwgMHhkMTljLAorCTB4MDEyMCwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHgyYWI0LCAweDAwMDYsIDB4MDAzNiwgMHgwMTU2LAorCTB4MDAwMCwgMHgyMDAxLCAweDE5YTYsIDB4MjAwNCwgMHg5MDA1LCAweDE1MTgsIDB4MDgwYywgMHgyYTQ4LAorCTB4MTE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyOWFiLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4Mjk4ZSwgMHgwMGI4LCAweDA4MGMsIDB4MmE1MCwgMHgxMTM4LCAweDkwMDYsIDB4MDgwYywgMHgyOWFiLAorCTB4OTAwNiwgMHgwODBjLCAweDI5OGUsIDB4MDA2OCwgMHgwODBjLCAweDJhNTgsIDB4MWQ1MCwgMHgyMDAxLAorCTB4MTk5NywgMHgyMDA0LCAweGQwZmMsIDB4MDEwOCwgMHgwMDIwLCAweDA4MGMsIDB4MjdhNSwgMHgwODA0LAorCTB4MGNjMSwgMHgwODBjLCAweDJhZDcsIDB4MDgwYywgMHgyYjBhLCAweDIwYTksIDB4MDAzYSwgMHgxZDA0LAorCTB4MGMxNywgMHgwODBjLCAweDg3YjQsIDB4MWYwNCwgMHgwYzE3LCAweDA4MGMsIDB4NzU0ZSwgMHgwMTQ4LAorCTB4MDgwYywgMHg3NTYwLCAweDExMTgsIDB4MDgwYywgMHg3ODRmLCAweDAwNTAsIDB4MDgwYywgMHg3NTQ1LAorCTB4MGRkMCwgMHgwODBjLCAweDc4NGEsIDB4MDgwYywgMHg3ODQwLCAweDA4MGMsIDB4NzQ2ZSwgMHgwMDIwLAorCTB4MjAwOSwgMHgwMGY4LCAweDA4MGMsIDB4NjAwZSwgMHg3ODUwLCAweGMwZTUsIDB4Nzg1MiwgMHgwODBjLAorCTB4NzUzZCwgMHgwMTIwLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsIDB4MjAyMSwgMHhlNjc4LAorCTB4MjAxOSwgMHhlYTYwLCAweDBkMGMsIDB4ODdiNCwgMHg3ODIwLCAweGQwOWMsIDB4MTVhMCwgMHgwODBjLAorCTB4NzUzZCwgMHgwOTA0LCAweDBjYTMsIDB4NzgyNCwgMHhkMGFjLCAweDE5MDQsIDB4MGNjNiwgMHgwODBjLAorCTB4NzU2MCwgMHgxNTQ4LCAweDAwNDYsIDB4MjAyMSwgMHgwMzIwLCAweDg0MjEsIDB4MWRmMCwgMHgwMDRlLAorCTB4MjAxMSwgMHgxODAwLCAweDA4MGMsIDB4MmFiNCwgMHgwODBjLCAweDJhNjAsIDB4NzgyNCwgMHg5MDg0LAorCTB4MTgwMCwgMHgxMTY4LCAweDk0ODQsIDB4MGZmZiwgMHgxMTQwLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4OTA4NCwgMHg5MDAwLCAweDAxMTAsIDB4MDgwYywgMHgwY2U5LCAweDg0MjEsIDB4MTE2MCwgMHgxZDA0LAorCTB4MGM3MywgMHgwODBjLCAweDg3YjQsIDB4MDgwYywgMHg3ODRhLCAweDA4MGMsIDB4Nzg0MCwgMHg3MDAzLAorCTB4MDAwMSwgMHgwODA0LCAweDBjYzYsIDB4ODMxOSwgMHgxOTI4LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4OTA4NCwgMHg5MDAwLCAweDAxMTAsIDB4MDgwYywgMHgwY2U5LCAweDFkMDQsIDB4MGM4OSwgMHgwODBjLAorCTB4ODdiNCwgMHgyMDA5LCAweDE5OWEsIDB4MjEwNCwgMHg5MDA1LCAweDAxMTgsIDB4ODAwMSwgMHgyMDBhLAorCTB4MTE4OCwgMHgyMDBiLCAweDAwMGEsIDB4MjAxMSwgMHgwMDQ4LCAweDA4MGMsIDB4MmFiNCwgMHgyMGE5LAorCTB4MDAwMiwgMHgwODBjLCAweDJhNDEsIDB4NzkyNCwgMHgwODBjLCAweDJhNjAsIDB4ZDE5YywgMHgwMTEwLAorCTB4MDgwYywgMHgyOTdjLCAweDAwZjAsIDB4MDgwYywgMHg3NTRlLCAweDExNDAsIDB4OTRhMiwgMHgwM2U4LAorCTB4MTEyOCwgMHgwODBjLCAweDc1MTEsIDB4NzAwMywgMHgwMDAxLCAweDAwYzAsIDB4MjAxMSwgMHgxODAwLAorCTB4MDgwYywgMHgyYWI0LCAweDA4MGMsIDB4MmE2MCwgMHg3ODI0LCAweDA4MGMsIDB4NzU1NywgMHgwMTEwLAorCTB4ZDBhYywgMHgxMTYwLCAweDkwODQsIDB4MTgwMCwgMHgwOTA0LCAweDBjN2IsIDB4NzAwMywgMHgwMDAxLAorCTB4MDAyOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNjA2LCAweDAwYTAsIDB4Nzg1MCwgMHhjMGU0LAorCTB4Nzg1MiwgMHgyMDA5LCAweDE4MGMsIDB4MjEwYywgMHhkMTljLCAweDExMjAsIDB4NzkwNCwgMHg5MThkLAorCTB4MDAwMiwgMHg3OTA2LCAweDIwMTEsIDB4MDA0OCwgMHgwODBjLCAweDJhYjQsIDB4NzgyOCwgMHg5MDg1LAorCTB4MDAyOCwgMHg3ODJhLCAweDIwMDEsIDB4MTlhNiwgMHgyMDAzLCAweDAwMDAsIDB4OTAwNiwgMHg3OGYyLAorCTB4MDE1ZSwgMHgwMDNlLCAweDAwMGUsIDB4MDEyZSwgMHgwMGZlLCAweDAwNGUsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDBiNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDE1NiwgMHgwMDcxLCAweDBkMGMsIDB4ODdiNCwgMHgwMTVlLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsIDB4NzAwNCwgMHg5MDg2LAorCTB4MDAwMSwgMHgxMTEwLCAweDA4MGMsIDB4MzRlMCwgMHgwMGVlLCAweDAwMDUsIDB4MDAwNSwgMHgyYTcwLAorCTB4MjA2MSwgMHgxOWFhLCAweDIwNjMsIDB4MDAwMywgMHg2MDA3LCAweDAwMDMsIDB4NjAwYiwgMHgwMDA4LAorCTB4NjAwZiwgMHgwMTM3LCAweDIwMDEsIDB4MTk3YiwgMHg5MDBlLCAweDIxMDIsIDB4NzE5NiwgMHgyMDAxLAorCTB4MDEwMCwgMHgyMDA0LCAweDkwODIsIDB4MDAwMiwgMHgwMjE4LCAweDcwNWYsIDB4ZmZmZiwgMHgwMDA4LAorCTB4NzE1ZSwgMHg3MDY3LCAweGZmZmYsIDB4NzE3ZSwgMHg3MTgyLCAweDA4MGMsIDB4Y2RlOCwgMHg3MGVmLAorCTB4MDBjMCwgMHgyMDYxLCAweDE5NmIsIDB4NjAwMywgMHgwOTA5LCAweDYxMDYsIDB4NjAwYiwgMHg4ODAwLAorCTB4NjAwZiwgMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MDE3LCAweDAwMWYsIDB4NjExYSwgMHg2MDFmLAorCTB4MDdkMCwgMHgyMDYxLCAweDE5NzMsIDB4NjAwMywgMHg4MDAwLCAweDYxMDYsIDB4NjEwYSwgMHg2MDBmLAorCTB4MDIwMCwgMHg2MDEzLCAweDAwZmYsIDB4NjExNiwgMHg2MDFiLCAweDAwMDEsIDB4NjExZSwgMHgyMDYxLAorCTB4MTk4OCwgMHg2MDAzLCAweDUxNGMsIDB4NjAwNywgMHg0ZjQ3LCAweDYwMGIsIDB4NDk0MywgMHg2MDBmLAorCTB4MjAyMCwgMHgyMDAxLCAweDE4MmMsIDB4MjEwMiwgMHgwMDA1LCAweDkwMTYsIDB4MDgwYywgMHg2NjkzLAorCTB4MTE3OCwgMHhiODA0LCAweDkwYzQsIDB4MDBmZiwgMHg5OGM2LCAweDAwMDYsIDB4MDEyOCwgMHg5MGM0LAorCTB4ZmYwMCwgMHg5OGM2LCAweDA2MDAsIDB4MTEyMCwgMHg5MTg2LCAweDAwODAsIDB4MDEwOCwgMHg4MjEwLAorCTB4ODEwOCwgMHg5MTg2LCAweDA4MDAsIDB4MWQ1MCwgMHgyMjA4LCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3OSwgMHgwMDAwLCAweDAwMGUsIDB4MDBmNiwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LAorCTB4MGQ3ZiwgMHgwMDA2LCAweDAwMTYsIDB4MjAwMSwgMHg4MDAyLCAweDAwMDYsIDB4MjA3OSwgMHgwMDAwLAorCTB4MDAwZSwgMHg3ODgyLCAweDc4MzYsIDB4MDAxZSwgMHg3OThlLCAweDAwMGUsIDB4Nzg4YSwgMHgwMDBlLAorCTB4Nzg4NiwgMHgzOTAwLCAweDc4OWEsIDB4NzgzMywgMHgwMDEyLCAweDIwOTEsIDB4NTAwMCwgMHgwMTU2LAorCTB4MDBkNiwgMHgwMDM2LCAweDAwMjYsIDB4MjA3OSwgMHgwMzAwLCAweDIwNjksIDB4MWIyNiwgMHg3YTA4LAorCTB4MjI2YSwgMHgyMDY5LCAweDFiMjcsIDB4N2ExOCwgMHgyMjZhLCAweDhkNjgsIDB4N2ExYywgMHgyMjZhLAorCTB4NzgyYywgMHgyMDE5LCAweDFiMzQsIDB4MjAxYSwgMHgyMDE5LCAweDFiMzcsIDB4OTAxNiwgMHg3ODA4LAorCTB4ZDA5YywgMHgwMTY4LCAweDc4MjAsIDB4MjAxYSwgMHg4MjEwLCAweDgzMTgsIDB4OTM4NiwgMHgxYjUwLAorCTB4MDEwOCwgMHgwY2E4LCAweDc4MDgsIDB4ZDA5YywgMHgwMTEwLCAweDIwMTEsIDB4ZGVhZCwgMHgyMDE5LAorCTB4MWIzNSwgMHg3ODJjLCAweDIwMWEsIDB4ODMxOCwgMHgyMjFhLCAweDc4MDMsIDB4MDAwMCwgMHgyMDY5LAorCTB4MWE3YywgMHg5MDFlLCAweDIwYTksIDB4MDAyMCwgMHg3YjI2LCAweDdhMjgsIDB4MjI2YSwgMHg4ZDY4LAorCTB4ODMxOCwgMHgxZjA0LCAweDBkY2MsIDB4MjA2OSwgMHgxYTljLCAweDIwMTksIDB4MDA1MCwgMHgyMGE5LAorCTB4MDAyMCwgMHg3YjI2LCAweDdhMjgsIDB4MjI2YSwgMHg4ZDY4LCAweDgzMTgsIDB4MWYwNCwgMHgwZGQ5LAorCTB4MDQ5MSwgMHgwMDJlLCAweDAwM2UsIDB4MDBkZSwgMHgwMTVlLCAweDIwNzksIDB4MTgwMCwgMHg3ODAzLAorCTB4MDAwNSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgwMTgwLAorCTB4MjAwMSwgMHgxYTIxLCAweDIwMDQsIDB4OTAwNSwgMHgwMTI4LCAweDIwMDEsIDB4MDA4YiwgMHgyMDA0LAorCTB4ZDBmYywgMHgwZGQ4LCAweDIwMDEsIDB4MDA4YSwgMHgyMDAzLCAweDAwMDIsIDB4MjAwMywgMHgxMDAxLAorCTB4MDgwYywgMHg1NzRkLCAweDExNzAsIDB4MDgwYywgMHgwZjIwLCAweDAxMTAsIDB4MDgwYywgMHgwZTczLAorCTB4MDgwYywgMHg1NzRkLCAweDExMzAsIDB4MjA3MSwgMHgxODAwLCAweDIwMTEsIDB4ODAwMCwgMHgwODBjLAorCTB4MGYzNCwgMHgwYzcwLCAweDAwMDUsIDB4MjAwMSwgMHgwMzgyLCAweDIwMDQsIDB4OTA4NCwgMHgwMDA3LAorCTB4OTA4NiwgMHgwMDAxLCAweDExMjAsIDB4MjAwMSwgMHgwMDE1LCAweDA4MGMsIDB4YTkwZiwgMHgyMDc5LAorCTB4MDM4MCwgMHgyMDY5LCAweDFiMDYsIDB4NzgxOCwgMHg2ODAyLCAweDc4MWMsIDB4NjgwNiwgMHg3ODQwLAorCTB4NjgwYSwgMHg3ODQ0LCAweDY4MGUsIDB4NzgyYywgMHg2ODEyLCAweDIwMTksIDB4MWIxMSwgMHg5MDE2LAorCTB4NzgwOCwgMHhkMDljLCAweDAxNTAsIDB4NzgyMCwgMHgyMDFhLCAweDgyMTAsIDB4ODMxOCwgMHg4MjEwLAorCTB4OTI4MiwgMHgwMDExLCAweDBlYTgsIDB4MjAxMSwgMHhkZWFkLCAweDZhMmEsIDB4NzgzMCwgMHg2ODFhLAorCTB4NzgzNCwgMHg2ODFlLCAweDc4MzgsIDB4NjgyMiwgMHg3ODNjLCAweDY4MjYsIDB4NzgwMywgMHgwMDAwLAorCTB4MjA2OSwgMHgxYWM2LCAweDkwMWUsIDB4MjBhOSwgMHgwMDIwLCAweDdiMjYsIDB4NzgyOCwgMHgyMDZhLAorCTB4OGQ2OCwgMHg4MzE4LCAweDFmMDQsIDB4MGU0ZCwgMHgyMDY5LCAweDFhZTYsIDB4MjAxOSwgMHgwMGIwLAorCTB4MjBhOSwgMHgwMDIwLCAweDdiMjYsIDB4NzgyOCwgMHgyMDZhLCAweDhkNjgsIDB4ODMxOCwgMHgxZjA0LAorCTB4MGU1YSwgMHgwMDA1LCAweDkxOGMsIDB4MDNmZiwgMHgyMDAxLCAweDAwMDMsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDYwMCwgMHgxMTE4LCAweDkxOGQsIDB4NmMwMCwgMHgwMDEwLCAweDkxOGQsIDB4NjQwMCwgMHgyMDAxLAorCTB4MDE3ZiwgMHgyMTAyLCAweDAwMDUsIDB4MDAyNiwgMHgwMTI2LCAweDIwMTEsIDB4MDA4MCwgMHgwODBjLAorCTB4MGYxMiwgMHgyMGE5LCAweDA5MDAsIDB4MDgwYywgMHgwZjQ4LCAweDIwMTEsIDB4MDA0MCwgMHgwODBjLAorCTB4MGYxMiwgMHgyMGE5LCAweDA5MDAsIDB4MDgwYywgMHgwZjQ4LCAweDBjNzgsIDB4MDAyNiwgMHgwODBjLAorCTB4MGYyMCwgMHgxMTg4LCAweDIwMTEsIDB4MDEwZSwgMHgyMjE0LCAweDkyOTQsIDB4MDAwNywgMHg5Mjk2LAorCTB4MDAwNywgMHgwMTE4LCAweDIwMTEsIDB4MDk0NywgMHgwMDEwLCAweDIwMTEsIDB4MWI0NywgMHgwODBjLAorCTB4MGYzNCwgMHgwMDJlLCAweDAwMDUsIDB4MjAxMSwgMHgwMTBlLCAweDIyMTQsIDB4OTI5NCwgMHgwMDA3LAorCTB4OTI5NiwgMHgwMDA3LCAweDAxMTgsIDB4MjAxMSwgMHhhODgwLCAweDAwMTAsIDB4MjAxMSwgMHg2ODQwLAorCTB4ZDBlNCwgMHg3MGYzLCAweDAwMDAsIDB4MTEyMCwgMHg3MGYzLCAweDBmYTAsIDB4MDgwYywgMHgwZjI1LAorCTB4MDAyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDgwYywgMHgwZjIwLCAweDAxNDgsIDB4ZDBhNCwgMHgxMTM4LAorCTB4MjAxMSwgMHhjZGQ1LCAweDAwMTAsIDB4MjAxMSwgMHgwMDgwLCAweDA4MGMsIDB4MGYyNSwgMHgwMDJlLAorCTB4MDAwNSwgMHgwMDI2LCAweDcwZjMsIDB4MDAwMCwgMHgwODBjLCAweDBmMjAsIDB4MTEzMCwgMHgyMDExLAorCTB4ODA0MCwgMHgwODBjLCAweDBmMzQsIDB4MDAyZSwgMHgwMDA1LCAweDA4MGMsIDB4MmE1OCwgMHgxMTE4LAorCTB4MjAxMSwgMHhjZGM1LCAweDAwMTAsIDB4MjAxMSwgMHhjYWMyLCAweDA4MGMsIDB4MGYyNSwgMHgwMDJlLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDcxLCAweDE4MDAsIDB4ZDBiNCwgMHg3MGVjLAorCTB4NzFlOCwgMHgxMTE4LCAweGMwZTQsIDB4YzFmNCwgMHgwMDUwLCAweDAwMDYsIDB4M2IwMCwgMHg5MDg0LAorCTB4ZmYzZSwgMHgyMGQ4LCAweDAwMGUsIDB4NzBmMywgMHgwMDAwLCAweGMwZTUsIDB4YzFmNSwgMHgwMDk5LAorCTB4MDAwZSwgMHgwMDFlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHhkMGU0LAorCTB4NzBlYywgMHgxMTEwLCAweGMwZGMsIDB4MDAwOCwgMHhjMGRkLCAweDAwMTYsIDB4NzFlOCwgMHgwMDE5LAorCTB4MDAxZSwgMHgwMGVlLCAweDAwMDUsIDB4NzBlZSwgMHg3MWVhLCAweDcwMDAsIDB4OTA4NCwgMHgwMDA3LAorCTB4MDAwYiwgMHgwMDA1LCAweDBlZDgsIDB4MGViMiwgMHgwZWIyLCAweDBlODYsIDB4MGVjMSwgMHgwZWIyLAorCTB4MGViMiwgMHgwZWMxLCAweGMyODQsIDB4MDAxNiwgMHgzYjA4LCAweDNhMDAsIDB4OTEwNCwgMHg5MThkLAorCTB4MDBjMSwgMHgyMWQ4LCAweDkwODQsIDB4ZmYzZSwgMHg5MjA1LCAweDIwZDAsIDB4MDAxZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxODNiLCAweDIwMDQsIDB4ZDBkYywgMHgwMDA1LCAweDllODYsIDB4MTgwMCwgMHgxOTBjLAorCTB4MGQ3ZCwgMHg3MGVjLCAweGQwZTQsIDB4MDEwOCwgMHhjMmU1LCAweDcyZWUsIDB4ZDBlNCwgMHgxMTE4LAorCTB4OTI5NCwgMHgwMGMxLCAweDA4ZjksIDB4MDAwNSwgMHg5ZTg2LCAweDE4MDAsIDB4MTkwYywgMHgwZDdkLAorCTB4NzBlOCwgMHhkMGY0LCAweDAxMDgsIDB4YzJmNSwgMHg3MmVhLCAweGQwZjQsIDB4MTE0MCwgMHg5Mjg0LAorCTB4ODAwMCwgMHg4MDA1LCAweGMyODQsIDB4OTIxNSwgMHg5Mjk0LCAweDAwYzEsIDB4MDg2MSwgMHgwMDA1LAorCTB4MWQwNCwgMHgwZjQ4LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDBmNDgsIDB4MDAwNSwgMHg4OTBlLAorCTB4ODEwZSwgMHg4MTBmLCAweDkxOTQsIDB4MDAzZiwgMHg5MThjLCAweGZmYzAsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjIwMCwgMHg5MTRkLCAweDg5NGYsIDB4ODk0ZCwgMHg4OTRkLCAweDAwMGUsIDB4MDAwNSwgMHgwMWQ2LAorCTB4MDE0NiwgMHgwMDM2LCAweDAwOTYsIDB4MjA2MSwgMHgxODhkLCAweDYwMGIsIDB4MDAwMCwgMHg2MDBmLAorCTB4MDAwMCwgMHg2MDAzLCAweDAwMDAsIDB4NjAwNywgMHgwMDAwLCAweDIwMDksIDB4ZmZjMCwgMHgyMTA1LAorCTB4MDAwNiwgMHgyMDAxLCAweGFhYWEsIDB4MjAwZiwgMHgyMDE5LCAweDU1NTUsIDB4OTAxNiwgMHgyMDQ5LAorCTB4MGJmZiwgMHhhYjAyLCAweGEwMDEsIDB4YTAwMSwgMHhhODAwLCAweDkzMDYsIDB4MTEzOCwgMHgyMTA1LAorCTB4OTMwNiwgMHgwMTIwLCAweDgyMTAsIDB4OTljOCwgMHgwNDAwLCAweDBjOTgsIDB4MDAwZSwgMHgyMDBmLAorCTB4MjAwMSwgMHgxODlkLCAweDkyOGEsIDB4MDAwZSwgMHgxNjM4LCAweDkyOGEsIDB4MDAwNiwgMHgyMDExLAorCTB4MDAwNiwgMHgxMjEwLCAweDIwMTEsIDB4MDAwMCwgMHgyMjAyLCAweDkwMDYsIDB4MjAwOCwgMHg4MmZmLAorCTB4MDFiMCwgMHg4MjAwLCAweDYwMGEsIDB4NjAwZiwgMHhmZmZmLCAweDYwMDMsIDB4MDAwMiwgMHg2MDA3LAorCTB4MDAwMCwgMHgwMDI2LCAweDIwMTksIDB4MDAxMCwgMHg5MjgwLCAweDAwMDEsIDB4MjBlOCwgMHgyMWEwLAorCTB4MjFhOCwgMHg0MTA0LCAweDgzMTksIDB4MWRlMCwgMHg4MjExLCAweDFkYTAsIDB4MDAyZSwgMHgwMDllLAorCTB4MDAzZSwgMHgwMTRlLCAweDAxZGUsIDB4MDAwNSwgMHgyMDExLCAweDAwMGUsIDB4MDhlOCwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDk2LCAweDMzNDgsIDB4MDgwYywgMHgwZjRmLCAweDIxMDAsIDB4OTMwMCwgMHgyMDk4LAorCTB4MjJlMCwgMHgwMDllLCAweDAwMmUsIDB4MDAxZSwgMHgwMDM2LCAweDM1MTgsIDB4MjBhOSwgMHgwMDAxLAorCTB4NDAwMiwgMHg4MDA3LCAweDQwMDQsIDB4ODMxOSwgMHgxZGQ4LCAweDAwM2UsIDB4MDAwNSwgMHgyMGU5LAorCTB4MDAwMSwgMHg3MWI4LCAweDgxZmYsIDB4MTFjMCwgMHg5MDA2LCAweDIwMDksIDB4MDIwMCwgMHgyMGE5LAorCTB4MDAwMiwgMHg5Mjk4LCAweDAwMTgsIDB4MjNhMCwgMHg0MDAxLCAweDIwMDksIDB4MDcwMCwgMHgyMGE5LAorCTB4MDAwMiwgMHg5Mjk4LCAweDAwMDgsIDB4MjNhMCwgMHg0MDAxLCAweDcwN2MsIDB4ODAwNywgMHg3MTgwLAorCTB4ODEwZiwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMSwgMHg5Mjk4LCAweDAwMGMsIDB4MjNhMCwgMHg5MDBlLAorCTB4MDgwYywgMHgwZDVkLCAweDIwMDEsIDB4MDAwMCwgMHg4MTBmLCAweDIwYTksIDB4MDAwMiwgMHg0MDAxLAorCTB4MDAwNSwgMHg4OWZmLCAweDAxNDAsIDB4YTgwNCwgMHhhODA3LCAweDAwMDAsIDB4MDAwNiwgMHgwODBjLAorCTB4MTA3OSwgMHgwMDllLCAweDBjYjAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHgwODBjLAorCTB4MTBmMiwgMHgwOTBjLCAweDBkN2QsIDB4MDBlZSwgMHgwMDA1LCAweDAwODYsIDB4MDBlNiwgMHgwMDA2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzksIDB4MjA3MSwgMHgxODAwLAorCTB4NzNjMCwgMHg3MDJjLCAweDkwMTYsIDB4OTA0NSwgMHgwMTU4LCAweDgyMTAsIDB4OTkwNiwgMHgwOTBjLAorCTB4MGQ3ZCwgMHgyMzAwLCAweDkyMDIsIDB4MDEyMCwgMHgxYTBjLCAweDBkN2QsIDB4YTAwMCwgMHgwYzk4LAorCTB4MDEyZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwMGVlLCAweDAwOGUsIDB4MDAwNSwgMHgwMDg2LAorCTB4MDBlNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTkxMCwgMHg3MDEwLAorCTB4OTAwNSwgMHgwMTQwLCAweDcwMTgsIDB4OTA0NSwgMHgwMTI4LCAweDk5MDYsIDB4MDkwYywgMHgwZDdkLAorCTB4YTAwMCwgMHgwY2M4LCAweDAxMmUsIDB4MDAwZSwgMHgwMGVlLCAweDAwOGUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwYzAsIDB4ODAwMSwgMHgwMjcwLAorCTB4NzBjMiwgMHg3MDJjLCAweDIwNDgsIDB4OTA4NSwgMHgwMDAxLCAweGE4MDAsIDB4NzAyZSwgMHhhODAzLAorCTB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTA0ZSwgMHgwY2Q4LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzBjMCwgMHg5MGNhLAorCTB4MDAyMCwgMHgwMjY4LCAweDgwMDEsIDB4NzBjMiwgMHg3MDJjLCAweDIwNDgsIDB4YTgwMCwgMHg3MDJlLAorCTB4YTgwMywgMHgwMDAwLCAweGE4MDcsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDRlLAorCTB4MGNkOCwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMTYsIDB4ODkwZSwgMHg4MTBlLAorCTB4ODEwZiwgMHg5MTg0LCAweDAwM2YsIDB4YTg2MiwgMHg5MTg0LCAweGZmYzAsIDB4YTg1ZSwgMHgwMDFlLAorCTB4MDAyMCwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MDJjLAorCTB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBjMCwgMHg4MDAwLCAweDcwYzIsIDB4MDgwYywgMHg4NWNlLAorCTB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMjYsIDB4MjAwOSwgMHgwMDAwLAorCTB4MjA0OSwgMHgwNDAwLCAweDI5MDAsIDB4NzAyZSwgMHg4OTQwLCAweDI4MDAsIDB4YTgwMiwgMHhhOTVlLAorCTB4YTg2MywgMHgwMDAxLCAweDg0MjAsIDB4OTg4NiwgMHgwNDQwLCAweDAxMjAsIDB4Mjg0OCwgMHg5MTg4LAorCTB4MDA0MCwgMHgwYzkwLCAweDIwNzEsIDB4MTg4ZCwgMHg3MDAwLCAweDkwMDUsIDB4MTFhMCwgMHgyMDAxLAorCTB4MDU1OCwgMHhhODAyLCAweDIwNDgsIDB4MjAwOSwgMHg1NjAwLCAweDg5NDAsIDB4MjgwMCwgMHhhODAyLAorCTB4YTk1ZSwgMHhhODYzLCAweDAwMDEsIDB4ODQyMCwgMHg5ODg2LCAweDA4MDAsIDB4MDEyMCwgMHgyODQ4LAorCTB4OTE4OCwgMHgwMDQwLCAweDBjOTAsIDB4MjA3MSwgMHgxODhkLCAweDcxMDQsIDB4NzIwMCwgMHg4MmZmLAorCTB4MDFkMCwgMHg3MzA4LCAweDgzMTgsIDB4ODMxZiwgMHg4MzFiLCAweDgzMWIsIDB4NzMxMiwgMHg4MzE5LAorCTB4MjAwMSwgMHgwODAwLCAweGE4MDIsIDB4MjA0OCwgMHg4OTAwLCAweGE4MDIsIDB4MjA0MCwgMHhhOTVlLAorCTB4YWE2MiwgMHg4NDIwLCAweDIzMDAsIDB4OTkwNiwgMHgwMTMwLCAweDI4NDgsIDB4OTE4OCwgMHgwMDQwLAorCTB4OTI5MSwgMHgwMDAwLCAweDBjODgsIDB4YTgwMywgMHgwMDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3NGJlLAorCTB4NzRjMiwgMHgwMDA1LCAweDAwZTYsIDB4MDAxNiwgMHg5OTg0LCAweGZjMDAsIDB4MDFlOCwgMHg5MDhjLAorCTB4ZjgwMCwgMHgxMTY4LCAweDk5ODIsIDB4MDQwMCwgMHgwMmI4LCAweDk5ODIsIDB4MDQ0MCwgMHgwMjc4LAorCTB4OTk4MiwgMHgwNTU4LCAweDAyODgsIDB4OTk4MiwgMHgwODAwLCAweDEyNzAsIDB4MDA0MCwgMHg5OTgyLAorCTB4MDgwMCwgMHgwMjUwLCAweDIwNzEsIDB4MTg4ZCwgMHg3MDEwLCAweDk5MDIsIDB4MTIyOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDFlLCAweDAwZWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBlNiwgMHgyMDcxLAorCTB4MWEyMCwgMHg3MDA3LCAweDAwMDAsIDB4OTAwNiwgMHg3MDFlLCAweDcwMjIsIDB4NzAwMiwgMHgyMDcxLAorCTB4MDAwMCwgMHg3MDEwLCAweDkwODUsIDB4ODA0NCwgMHg3MDEyLCAweDIwNzEsIDB4MDA4MCwgMHg5MDA2LAorCTB4NzAyYiwgMHgwMDYwLCAweDIwYTksIDB4MDA0MCwgMHg3MDIyLCAweDFmMDQsIDB4MTEyYywgMHg3MDJiLAorCTB4MDA2MCwgMHg3MDJiLCAweDAwMjAsIDB4MjBhOSwgMHgwMDQwLCAweDcwMjIsIDB4MWYwNCwgMHgxMTM1LAorCTB4NzAyYiwgMHgwMDIwLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGU2LAorCTB4YTA2ZiwgMHgwMDAwLCAweDIwNzEsIDB4MWEyMCwgMHg3MDFjLCAweDkwODgsIDB4MWEyYSwgMHgyODBhLAorCTB4ODAwMCwgMHg5MDg0LCAweDAwM2YsIDB4NzAxZSwgMHg3MTIwLCAweDkxMDYsIDB4MDkwYywgMHgwZDdkLAorCTB4NzAwNCwgMHg5MDA1LCAweDExMjgsIDB4MDBmNiwgMHgyMDc5LCAweDAwODAsIDB4MDBhOSwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDBlNiwgMHgyMDcxLAorCTB4MWEyMCwgMHg3MDA0LCAweDkwMDUsIDB4MTEyOCwgMHgwMGY2LCAweDIwNzksIDB4MDA4MCwgMHgwMDIxLAorCTB4MDBmZSwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwgMHg3MDA0LCAweDkwODYsIDB4MDAwMCwgMHgxMTEwLAorCTB4NzAwNywgMHgwMDA2LCAweDcwMDAsIDB4MDAwMiwgMHgxMTdlLCAweDEzMDEsIDB4MTE3YywgMHgxMTdjLAorCTB4MTJmNSwgMHgxMmY1LCAweDEyZjUsIDB4MTJmNSwgMHgwODBjLCAweDBkN2QsIDB4NzAxYywgMHg3MTIwLAorCTB4OTEwNiwgMHgxMTQ4LCAweDc5MmMsIDB4OTE4NCwgMHgwMDAxLCAweDExMjAsIDB4ZDFmYywgMHgxMTEwLAorCTB4NzAwNywgMHgwMDAwLCAweDAwMDUsIDB4MDA5NiwgMHg5MTgwLCAweDFhMmEsIDB4MjAwNCwgMHg3MDBhLAorCTB4MjA0OCwgMHg4MTA4LCAweDkxOGMsIDB4MDAzZiwgMHg3MTIyLCAweDc4MmIsIDB4MDAyNiwgMHhhODhjLAorCTB4NzgwMiwgMHhhODkwLCAweDc4MDYsIDB4YTg5NCwgMHg3ODBhLCAweGE4OTgsIDB4NzgwZSwgMHhhODc4LAorCTB4NzAwZSwgMHhhODcwLCAweDcwMTYsIDB4YTg3NCwgMHg3MDFhLCAweGE4NjgsIDB4MDA5ZSwgMHhkMDg0LAorCTB4MDEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDAyOSwgMHgwMDA1LCAweDcwMDcsIDB4MDAwMiwgMHgwMGIxLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4NzEwYywgMHgyMDExLCAweDAwNDAsIDB4OTE4MiwgMHgwMDQwLAorCTB4MTIxMCwgMHgyMTEwLCAweDkwMDYsIDB4NzAwZSwgMHg3MjEyLCAweDgyMDMsIDB4NzgxMiwgMHg3ODJiLAorCTB4MDAyMCwgMHg3ODJiLCAweDAwNDEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4NzAxNCwgMHgyMGUwLCAweDcwMTgsIDB4MjA5OCwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAwODgsIDB4NzgyYiwgMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLAorCTB4OTE4MiwgMHgwMDQwLCAweDEyMTAsIDB4MjExMCwgMHg5MDA2LCAweDcwMGUsIDB4MjJhOCwgMHg0MDA2LAorCTB4ODIwMywgMHg3ODEyLCAweDc4MmIsIDB4MDAyMCwgMHgzMzAwLCAweDcwMWEsIDB4NzgyYiwgMHgwMDAxLAorCTB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwOSwgMHgxYTIwLAorCTB4MjEwNCwgMHhjMDk1LCAweDIwMGEsIDB4MDgwYywgMHgxMTViLCAweDAwMDUsIDB4MDAxNiwgMHgwMGU2LAorCTB4MjA3MSwgMHgxYTIwLCAweDAwZjYsIDB4MjA3OSwgMHgwMDgwLCAweDc5MmMsIDB4ZDFiYywgMHgxOTBjLAorCTB4MGQ3NiwgMHg3ODJiLCAweDAwMDIsIDB4ZDFmYywgMHgwMTIwLCAweDkxOGMsIDB4MDcwMCwgMHg3MDA0LAorCTB4MDAyMywgMHgwMGZlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDExNmMsIDB4MTIxNCwgMHgxMjQ4LAorCTB4MTMyMCwgMHgwZDdkLCAweDEzM2IsIDB4MGQ3ZCwgMHg5MThjLCAweDA3MDAsIDB4MTU1MCwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDcwMTQsIDB4MjBlOCwgMHg3MDE4LCAweDIwYTAsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjA5OSwgMHgwMDg4LCAweDc4MmIsIDB4MDA0MCwgMHg3MDEwLCAweDIwYTgsIDB4NDAwNSwgMHgzNDAwLAorCTB4NzAxYSwgMHgwMTVlLCAweDAxNGUsIDB4MDEzZSwgMHg3MDBjLCAweDkwMDUsIDB4MDU3OCwgMHg3ODAwLAorCTB4NzgwMiwgMHg3ODA0LCAweDc4MDYsIDB4MDgwYywgMHgxMWIxLCAweDAwMDUsIDB4NzAwOCwgMHgwMDk2LAorCTB4MjA0OCwgMHhhODZmLCAweDAxMDAsIDB4MDA5ZSwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxMTZjLAorCTB4MDAwNSwgMHg3MDA4LCAweDAwOTYsIDB4MjA0OCwgMHhhODZmLCAweDAyMDAsIDB4MDA5ZSwgMHgwY2EwLAorCTB4OTE4YywgMHgwNzAwLCAweDExNTAsIDB4NzAwYywgMHg5MDA1LCAweDAxODAsIDB4NzgwMCwgMHg3ODAyLAorCTB4NzgwNCwgMHg3ODA2LCAweDA4MGMsIDB4MTFjNiwgMHgwMDA1LCAweDcwMDgsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTg2ZiwgMHgwMjAwLCAweDAwOWUsIDB4NzAwNywgMHgwMDAwLCAweDAwODAsIDB4MDA5NiwgMHg3MDA4LAorCTB4MjA0OCwgMHg3ODAwLCAweGE4OGUsIDB4NzgwNCwgMHhhODkyLCAweDc4MDgsIDB4YTg5NiwgMHg3ODBjLAorCTB4YTg5YSwgMHhhODZmLCAweDAxMDAsIDB4MDA5ZSwgMHg3MDA3LCAweDAwMDAsIDB4MDA5NiwgMHgwMGQ2LAorCTB4NzAwOCwgMHgyMDQ4LCAweDIwMDEsIDB4MThiOSwgMHgyMDA0LCAweDk5MDYsIDB4MTEyOCwgMHhhODljLAorCTB4MDgwZiwgMHgwMGRlLCAweDAwOWUsIDB4MDBhMCwgMHgwMGRlLCAweDAwOWUsIDB4MDA5NiwgMHgwMGQ2LAorCTB4NzAwOCwgMHgyMDQ4LCAweDAwODEsIDB4MDE1MCwgMHhhODljLCAweDAwODYsIDB4Mjk0MCwgMHgwODBmLAorCTB4MDA4ZSwgMHgwMGRlLCAweDAwOWUsIDB4MDgwYywgMHgxMTViLCAweDAwMDUsIDB4MDBkZSwgMHgwMDllLAorCTB4MDgwYywgMHgxMTViLCAweDAwMDUsIDB4YThhOCwgMHhkMDhjLCAweDAwMDUsIDB4MDA5NiwgMHhhMGEwLAorCTB4OTA0ZCwgMHgwOTBjLCAweDBkN2QsIDB4YTA2YywgMHg5MDhlLCAweDAxMDAsIDB4MDEzMCwgMHhhODdiLAorCTB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAyLCAweDA4MGMsIDB4NmRlMiwgMHhhMDlmLAorCTB4MDAwMCwgMHhhMGEzLCAweDAwMDAsIDB4Mjg0OCwgMHgwODBjLCAweDEwNzksIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDBhNiwgMHhhMGEwLCAweDkwNGQsIDB4MDkwYywgMHgwZDdkLCAweGEwNmMsIDB4OTA4ZSwgMHgwMTAwLAorCTB4MDEyOCwgMHhhODdiLCAweDAwMDEsIDB4YTg4MywgMHgwMDAwLCAweDAwYzAsIDB4YTgwYywgMHgyMDUwLAorCTB4YjAwNCwgMHg5MDA1LCAweDAxOTgsIDB4YTgwZSwgMHgyMDUwLCAweDgwMDYsIDB4ODAwNiwgMHg4MDA3LAorCTB4OTA4YywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4YTA3NiwgMHhhMTcyLAorCTB4YjAwMCwgMHhhMDdhLCAweDI4MTAsIDB4MDgwYywgMHgxMTNjLCAweDAwZTgsIDB4YTk3YywgMHhhODk0LAorCTB4MDAxNiwgMHgwMDA2LCAweDA4MGMsIDB4NmRlMiwgMHgwMDBlLCAweDAwMWUsIDB4ZDFmYywgMHgxMTM4LAorCTB4ZDFmNCwgMHgwMTI4LCAweDAwYzYsIDB4MjA2MCwgMHgwODBjLCAweGFjYjAsIDB4MDBjZSwgMHg3MDA4LAorCTB4MjA0OCwgMHhhODlmLCAweDAwMDAsIDB4YThhMywgMHgwMDAwLCAweDA4MGMsIDB4MTA3OSwgMHg3MDA3LAorCTB4MDAwMCwgMHgwODBjLCAweDExNWIsIDB4MDBhZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzgyYiwgMHgxMDAxLCAweDcwMDcsIDB4MDAwNSwgMHg3MDAwLCAweGMwOTQsIDB4NzAwMiwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDk2LCAweDIwMDEsIDB4MTkyZSwgMHgyMDRjLCAweGE4N2MsIDB4NzgxMiwgMHhhODhjLAorCTB4NzgwMiwgMHhhODkwLCAweDc4MDYsIDB4YTg5NCwgMHg3ODBhLCAweGE4OTgsIDB4NzgwZSwgMHg3ODJiLAorCTB4MDAyMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3ODJiLCAweDAwNDEsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAwMCwgMHhjMDg0LCAweDcwMDIsIDB4MjkwMCwgMHg3MDBhLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDA4OCwgMHg3ODJiLCAweDAwNDAsIDB4MDA5NiwgMHgyMDAxLAorCTB4MTkyZSwgMHgyMDRjLCAweGFhN2MsIDB4MDA5ZSwgMHgwODBjLCAweDhjYjIsIDB4MjAwOSwgMHgxODhjLAorCTB4MjEwNCwgMHg5MDg0LCAweGZmZmMsIDB4MjAwYSwgMHgwODBjLCAweDhiMTgsIDB4NzAwNywgMHgwMDAwLAorCTB4MDgwYywgMHgxMTZjLCAweDAwMDUsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTE2YywgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDIyMDAsIDB4MjA3OSwgMHgwMzAwLCAweDIwNzEsIDB4MWE2YSwgMHg3MDAzLAorCTB4MDAwMCwgMHg3OGJmLCAweDAwZjYsIDB4MDA0MSwgMHg3ODA3LCAweDAwMDcsIDB4NzgwMywgMHgwMDAwLAorCTB4NzgwMywgMHgwMDAxLCAweDAxMmUsIDB4MDAwNSwgMHgwMGM2LCAweDc4MDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDE2NSwgMHgyMDAzLCAweDQxOTgsIDB4NzgwOCwgMHhkMDljLCAweDAxMTgsIDB4NzgyMCwgMHgwNGU5LAorCTB4MGNkMCwgMHgyMDAxLCAweDFhNmIsIDB4MjAwMywgMHgwMDAwLCAweDc4YWIsIDB4MDAwNCwgMHg3OGFjLAorCTB4ZDBhYywgMHgxZGU4LCAweDc4YWIsIDB4MDAwMiwgMHg3ODA3LCAweDAwMDcsIDB4NzgyNywgMHgwMDMwLAorCTB4NzgyYiwgMHgwNDAwLCAweDc4MjcsIDB4MDAzMSwgMHg3ODJiLCAweDFhN2MsIDB4NzgxZiwgMHhmZjAwLAorCTB4NzgxYiwgMHhmZjAwLCAweDIwMDEsIDB4MDIwMCwgMHgyMDA0LCAweGQwZGMsIDB4MDExMCwgMHg3ODFmLAorCTB4MDMwMywgMHgyMDYxLCAweDFhN2MsIDB4NjAyZiwgMHgxZGRjLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LAorCTB4OTA4MiwgMHgxZGRjLCAweDYwMzIsIDB4NjAzYiwgMHgxZWFiLCAweDYwMmIsIDB4MWFiYywgMHg2MDA3LAorCTB4MWE5YywgMHgyMDYxLCAweDFhOWMsIDB4NjA2ZiwgMHgxOTNjLCAweDIwMDEsIDB4MTkyNywgMHgyMDA0LAorCTB4NjA3YSwgMHg3ODNmLCAweDMzYjksIDB4MDBjZSwgMHgwMDA1LCAweDkwODYsIDB4MDAwZCwgMHgxMWQwLAorCTB4NzgwOCwgMHhkMDljLCAweDAxYjgsIDB4NzgyMCwgMHgwMDI2LCAweDIwMTAsIDB4MDgwYywgMHhjOTY4LAorCTB4MDE4MCwgMHgyMjYwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExNTgsIDB4MDAxNiwgMHg2MTIwLAorCTB4OTE4NiwgMHgwMDA5LCAweDAxMDgsIDB4MDAyMCwgMHgyMDA5LCAweDAwNGMsIDB4MDgwYywgMHhhZDRkLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDIyMDAsIDB4NzkwOCwgMHg5MTg0LAorCTB4MDA3MCwgMHgxOTBjLCAweDBkNzYsIDB4ZDE5YywgMHgwNWEwLCAweDc4MjAsIDB4OTA4YywgMHhmMDAwLAorCTB4MDU0MCwgMHgyMDYwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLCAweDE1NTAsIDB4NjAwMCwgMHg5MDg2LAorCTB4MDAwNCwgMHgxNTMwLCAweDYxMTQsIDB4MjE0OCwgMHhhODc2LCAweGE4N2EsIDB4YTg2NywgMHgwMTAzLAorCTB4MDgwYywgMHg2YzA0LCAweDAwYjYsIDB4NjAxMCwgMHgyMDU4LCAweGJhM2MsIDB4ODIxMSwgMHgwMjA4LAorCTB4YmEzZSwgMHhiOGQwLCAweDkwMDUsIDB4MTkwYywgMHg2N2JlLCAweDAwYmUsIDB4NjA0NCwgMHhkMGZjLAorCTB4MTkwYywgMHhhOTQ3LCAweDA4MGMsIDB4YWNkOSwgMHg3ODA4LCAweGQwOWMsIDB4MTliMCwgMHgwMTJlLAorCTB4MDAwNSwgMHg5MDhhLCAweDAwMjQsIDB4MWEwYywgMHgwZDdkLCAweDAwMmIsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDRiMCwgMHgwMTJlLCAweDAwMDUsIDB4MTQxZiwgMHgxNDQ1LCAweDE0NzUsIDB4MTQ3YSwgMHgxNDdlLAorCTB4MTQ4MywgMHgxNGFiLCAweDE0YWYsIDB4MTRiZCwgMHgxNGMxLCAweDE0MWYsIDB4MTU4ZSwgMHgxNTkyLAorCTB4MTYwNCwgMHgxNjBiLCAweDE0MWYsIDB4MTYwYywgMHgxNjBkLCAweDE2MTgsIDB4MTYxZiwgMHgxNDFmLAorCTB4MTQxZiwgMHgxNDFmLCAweDE0MWYsIDB4MTQxZiwgMHgxNDFmLCAweDE0MWYsIDB4MTQ4NSwgMHgxNDFmLAorCTB4MTQ0ZCwgMHgxNDcyLCAweDE0MzksIDB4MTQxZiwgMHgxNDU5LCAweDE0MjMsIDB4MTQyMSwgMHgwODBjLAorCTB4MGQ3ZCwgMHgwODBjLCAweDBkNzYsIDB4MDgwYywgMHgxNjJhLCAweDIwMDksIDB4MWE3OCwgMHgyMTA0LAorCTB4ODAwMCwgMHgyMDBhLCAweDA4MGMsIDB4N2ZlZCwgMHgwODBjLCAweDFiMTAsIDB4MDAwNSwgMHg2MDQ0LAorCTB4ZDBmYywgMHgxOTBjLCAweGE5NDcsIDB4MjAwOSwgMHgwMDU1LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMTJlLAorCTB4MDAwNSwgMHgwODBjLCAweDE2MmEsIDB4MjA2MCwgMHg2MDQ0LCAweGQwZmMsIDB4MTkwYywgMHhhOTQ3LAorCTB4MjAwOSwgMHgwMDU1LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LCAweDIwMDksIDB4MDA0OCwgMHgwODBjLAorCTB4MTYyYSwgMHgyMDYwLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LCAweDIwMDksIDB4MDA1NCwgMHgwODBjLAorCTB4MTYyYSwgMHgyMDYwLCAweDYwNDQsIDB4ZDBmYywgMHgxOTBjLCAweGE5NDcsIDB4MDgwYywgMHhhZDRkLAorCTB4MDAwNSwgMHgwODBjLCAweDE2MmEsIDB4MjA2MCwgMHgwMDU2LCAweDAwNjYsIDB4MDgwYywgMHgxNjJhLAorCTB4MjAyOCwgMHgwODBjLCAweDE2MmEsIDB4MjAzMCwgMHgwMDM2LCAweDAwNDYsIDB4MjAyMSwgMHgwMDAwLAorCTB4MjQxOCwgMHgyMDA5LCAweDAwNTYsIDB4MDgwYywgMHhhZDRkLCAweDAwNGUsIDB4MDAzZSwgMHgwMDZlLAorCTB4MDA1ZSwgMHgwMDA1LCAweDA4MGMsIDB4MTYyYSwgMHgwMDA1LCAweDcwMDQsIDB4YzA4NSwgMHhjMGI1LAorCTB4NzAwNiwgMHgwMDA1LCAweDcwMDQsIDB4YzA4NSwgMHg3MDA2LCAweDAwMDUsIDB4MDgwYywgMHgxNjJhLAorCTB4MDgwYywgMHgxNzBiLCAweDAwMDUsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4MTYyYSwgMHgyMDYwLAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTgzYiwgMHhmZmZmLCAweDAwOWUsIDB4MjAwOSwgMHgwMDQ4LAorCTB4MDgwYywgMHhhZDRkLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwOSwgMHgwM2U4LAorCTB4ODEwOSwgMHgwMTYwLCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MGRjOCwgMHgyMDAxLAorCTB4MDIxOCwgMHgyMDA0LCAweGQwZWMsIDB4MTExMCwgMHgwODBjLCAweDE2MmYsIDB4MjAwMSwgMHgwMzA3LAorCTB4MjAwMywgMHg4MDAwLCAweDAwMDUsIDB4NzAwNCwgMHhjMDk1LCAweDcwMDYsIDB4MDAwNSwgMHgwODBjLAorCTB4MTYyYSwgMHgyMDYwLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4M2IsIDB4ZmZmZiwgMHgwMDllLAorCTB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LCAweDA4MGMsIDB4MTYyYSwgMHgwODBjLAorCTB4MGQ3ZCwgMHgwODBjLCAweDE2MmEsIDB4MDgwYywgMHgxNTc5LCAweDc4MjcsIDB4MDAxOCwgMHg3OWFjLAorCTB4ZDFkYywgMHgwOTA0LCAweDE1MmEsIDB4NzgyNywgMHgwMDE1LCAweDc4MjgsIDB4NzgyYiwgMHgwMDAwLAorCTB4OTA2NSwgMHgwMTQwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwNTAsIDB4MjAwMywgMHgwMDIwLAorCTB4MDgwNCwgMHgxNTMwLCAweDcwMDQsIDB4OTAwNSwgMHgwMWM4LCAweDExODgsIDB4NzhhYiwgMHgwMDA0LAorCTB4NzgyNywgMHgwMDE4LCAweDc4MmIsIDB4MDAwMCwgMHhkMWJjLCAweDA5MGMsIDB4MGQ3ZCwgMHgyMDAxLAorCTB4MDIwZCwgMHgyMDAzLCAweDAwNTAsIDB4MjAwMywgMHgwMDIwLCAweDA4MDQsIDB4MTU1ZSwgMHg3OGFiLAorCTB4MDAwNCwgMHg3ODAzLCAweDAwMDEsIDB4MDgwYywgMHgxNTkyLCAweDAwMDUsIDB4NzgyNywgMHgwMDE4LAorCTB4YTAwMSwgMHg3ODI4LCAweDc4MjcsIDB4MDAxMSwgMHhhMDAxLCAweDc5MjgsIDB4OTEwNiwgMHgwMTEwLAorCTB4NzlhYywgMHgwOGUwLCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLCAweDcwMmMsIDB4ZDBjNCwgMHgwMTQwLAorCTB4MDBlZSwgMHgwODBjLCAweDFiMTAsIDB4MDgwYywgMHgxMzU0LCAweDc4MDMsIDB4MDAwMSwgMHgwMDA1LAorCTB4NzAzNywgMHgwMDAxLCAweGEwMDEsIDB4NzE1MCwgMHgwMGVlLCAweDkxOGMsIDB4ZmYwMCwgMHg5MTg2LAorCTB4MDUwMCwgMHgwMTEwLCAweDc5YWMsIDB4MDgxMCwgMHg3MDA0LCAweGMwOWQsIDB4NzAwNiwgMHg3OGFiLAorCTB4MDAwNCwgMHg3ODAzLCAweDAwMDEsIDB4MDgwYywgMHgxNTkyLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLAorCTB4MDAyMCwgMHgwMDA1LCAweDc4MjgsIDB4NzgyYiwgMHgwMDAwLCAweDkwNjUsIDB4MDkwYywgMHgwZDdkLAorCTB4NjAxNCwgMHgyMDQ4LCAweDc4YWIsIDB4MDAwNCwgMHg5MThjLCAweDA3MDAsIDB4MDFhOCwgMHgwODBjLAorCTB4N2ZlZCwgMHgwODBjLCAweDFiMTAsIDB4MDgwYywgMHhjOTdhLCAweDAxNTgsIDB4YTlhYywgMHhhOTM2LAorCTB4YTliMCwgMHhhOTNhLCAweGE4M2YsIDB4ZmZmZiwgMHhhODQzLCAweGZmZmYsIDB4YTg4MCwgMHhjMGJkLAorCTB4YTg4MiwgMHgwODBjLCAweGM1NjYsIDB4MDAwNSwgMHg2MDIwLCAweDkwODYsIDB4MDAwOSwgMHgxMTI4LAorCTB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDQ4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LAorCTB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4NjAyNCwgMHgxOTBjLCAweGNkN2QsIDB4MjAyOSwgMHgwMGM4LAorCTB4ODUyOSwgMHgwMTI4LCAweDIwMDEsIDB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MGRjOCwgMHg3ZGJjLAorCTB4MDgwYywgMHhlODVhLCAweGQ1YTQsIDB4MTExOCwgMHgwODBjLCAweDE2MmYsIDB4MDAwNSwgMHgwODBjLAorCTB4N2ZlZCwgMHgwODBjLCAweDFiMTAsIDB4MDAwNSwgMHg3ODFmLCAweDAzMDAsIDB4NzgwMywgMHgwMDAxLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwNjYsIDB4MDA3NiwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwgMHg3OTA4LAorCTB4OTE4YywgMHgwMDA3LCAweDkxODYsIDB4MDAwMywgMHgwMTIwLCAweDIwMDEsIDB4MDAxNiwgMHgwODBjLAorCTB4MTZhMCwgMHgwMGZlLCAweDAwN2UsIDB4MDA2ZSwgMHgwMDFlLCAweDAwMDUsIDB4NzAwNCwgMHhjMDlkLAorCTB4NzAwNiwgMHgwMDA1LCAweDcxMDQsIDB4OTE4NCwgMHgwMDA0LCAweDE5MGMsIDB4MGQ3ZCwgMHhkMTg0LAorCTB4MTFiMSwgMHhkMTljLCAweDAxODAsIDB4YzE5YywgMHg3MTA2LCAweDAwMTYsIDB4MDgwYywgMHgxNmVlLAorCTB4MDAxZSwgMHgwMTQ4LCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLCAweDAwNTAsIDB4MjAwMywgMHgwMDIwLAorCTB4MDgwYywgMHgxNjJmLCAweDAwMDUsIDB4ODFmZiwgMHgxOTBjLCAweDBkN2QsIDB4MDAwNSwgMHgyMTAwLAorCTB4YzE4NCwgMHhjMWI0LCAweDcxMDYsIDB4ZDBiNCwgMHgwMDE2LCAweDAwZTYsIDB4MTkwNCwgMHgxNWY5LAorCTB4MjA3MSwgMHgwMjAwLCAweDA4MGMsIDB4MTZkYiwgMHgwNWUwLCAweDA4MGMsIDB4MTZlZSwgMHgwNWIwLAorCTB4NjAxNCwgMHg5MDA1LCAweDA1YjAsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NjQsIDB4MDA5ZSwgMHg5MDg0LAorCTB4MDBmZiwgMHg5MDhlLCAweDAwMjksIDB4MDE2MCwgMHg5MDhlLCAweDAwNDgsIDB4MTU1MCwgMHg2MDFjLAorCTB4ZDA4NCwgMHgxMWUwLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDE3NzgsIDB4MDBmZSwgMHgwMGIwLAorCTB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTkwMSwgMHgwMGZlLCAweDIwMDksIDB4MDFmNCwgMHg4MTA5LAorCTB4MDE2OCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4MjAwMSwgMHgwMjE4LAorCTB4MjAwNCwgMHhkMGVjLCAweDExMTgsIDB4MDgwYywgMHgxNjJmLCAweDAwNDAsIDB4MjAwMSwgMHgwMjBkLAorCTB4MjAwMywgMHgwMDIwLCAweDA4MGMsIDB4MTM1NCwgMHg3ODAzLCAweDAwMDEsIDB4MDBlZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwODBjLCAweDE2ZWUsIDB4MGRkMCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDUwLAorCTB4MjAwMywgMHgwMDIwLCAweDA0NjEsIDB4MGM5MCwgMHgwNDI5LCAweDIwNjAsIDB4MjAwOSwgMHgwMDUzLAorCTB4MDgwYywgMHhhZDRkLCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwZTEsIDB4MjAwOCwgMHgwMGQxLAorCTB4MDAwNiwgMHg3MDA0LCAweGMwOWQsIDB4NzAwNiwgMHgwMDBlLCAweDA4MGMsIDB4OTAwMywgMHgwMDA1LAorCTB4MDA4OSwgMHg5MDA1LCAweDAxMTgsIDB4MDgwYywgMHg4YzBhLCAweDBjZDAsIDB4MDAwNSwgMHgyMDAxLAorCTB4MDAzNiwgMHgyMDA5LCAweDE4MjAsIDB4MjEwYywgMHgyMDExLCAweDE4MWYsIDB4MjIxNCwgMHgwODBjLAorCTB4MTZhMCwgMHgwMDA1LCAweDc4MDgsIDB4ZDA5YywgMHgwZGU4LCAweDc4MjAsIDB4MDAwNSwgMHgwODBjLAorCTB4MTU3OSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHgyMDA5LCAweDAxZjQsIDB4ODEwOSwgMHgwNTEwLAorCTB4NjgwNCwgMHg5MDA1LCAweDBkZDgsIDB4MjAwMSwgMHgwMTVkLCAweDIwMDMsIDB4MDAwMCwgMHg3OWJjLAorCTB4ZDFhNCwgMHgxNTI4LCAweDc5YjgsIDB4OTE4YywgMHgwZmZmLCAweDAxODAsIDB4OTE4MiwgMHgwODQxLAorCTB4MTI2OCwgMHg5MTg4LCAweDAwMDcsIDB4OTE4YywgMHgwZmY4LCAweDgxMGMsIDB4ODEwYywgMHg4MTBjLAorCTB4MDgwYywgMHgxNjkyLCAweDY4MjcsIDB4MDAwMSwgMHg4MTA5LCAweDFkZDAsIDB4MDRkOSwgMHg2ODI3LAorCTB4MDAwMiwgMHgwNGMxLCAweDY4MDQsIDB4OTAwNSwgMHgxMTMwLCAweDY4MmMsIDB4ZDBlNCwgMHgxNTAwLAorCTB4NjgwNCwgMHg5MDA1LCAweDBkZTgsIDB4NzliOCwgMHhkMWVjLCAweDExMzAsIDB4MDhjMCwgMHgwODBjLAorCTB4N2ZlZCwgMHgwODBjLCAweDFiMTAsIDB4MDA5MCwgMHg3ODI3LCAweDAwMTUsIDB4NzgyYiwgMHgwMDAwLAorCTB4NzgyNywgMHgwMDE4LCAweDc4MmIsIDB4MDAwMCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDIwLAorCTB4MjAwMSwgMHgwMzA3LCAweDIwMDMsIDB4MDMwMCwgMHg3ODAzLCAweDAwMDEsIDB4MDBkZSwgMHgwMDA1LAorCTB4NjgyYywgMHg5MDg0LCAweDU0MDAsIDB4OTA4NiwgMHg1NDAwLCAweDBkMzAsIDB4NzgyNywgMHgwMDE1LAorCTB4NzgyYiwgMHgwMDAwLCAweDc4MDMsIDB4MDAwMSwgMHg2ODAwLCAweDkwODUsIDB4MTgwMCwgMHg2ODAyLAorCTB4MDBkZSwgMHgwMDA1LCAweDY4MjQsIDB4OTA4NCwgMHgwMDAzLCAweDFkZTAsIDB4MDAwNSwgMHgyMDAxLAorCTB4MDAzMCwgMHgyYzA4LCAweDYyMWMsIDB4MDAyMSwgMHg3ODMwLCAweDkwODYsIDB4MDA0MSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4MDAwNiwgMHg3ODA4LCAweGQwOWMsIDB4MDE0MCwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMGM2LCAweDA4MGMsIDB4MTNiYiwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNiwgMHg3ODMyLCAweDc5MzYsIDB4N2EzYSwgMHg3ODFiLCAweDgwODAsIDB4MDA1OSwgMHgxMTE4LAorCTB4MDAwZSwgMHgwMGZlLCAweDAwMDUsIDB4MDAwZSwgMHg3OTJjLCAweDM5MDAsIDB4ODAwMCwgMHgyMDA0LAorCTB4MDgwYywgMHgwZDdkLCAweDIwMDksIDB4ZmYwMCwgMHg4MTA5LCAweDAxMjAsIDB4NzgxOCwgMHhkMGJjLAorCTB4MWRkOCwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDc4MzIsIDB4NzkzNiwgMHg3YTNhLAorCTB4NzgxYiwgMHg4MDgwLCAweDBjNzksIDB4MTEwOCwgMHgwMDA1LCAweDc5MmMsIDB4MzkwMCwgMHg4MDAwLAorCTB4MjAwNCwgMHgwODBjLCAweDBkN2QsIDB4NzAzNywgMHgwMDAxLCAweDcxNTAsIDB4NzAzNywgMHgwMDAyLAorCTB4NzA1MCwgMHgyMDYwLCAweGQxYmMsIDB4MTExMCwgMHg3MDU0LCAweDIwNjAsIDB4OTE4YywgMHhmZjAwLAorCTB4OTE4NiwgMHgwNTAwLCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDAwNiwgMHgwMDQ2LAorCTB4MDBlNiwgMHgyMDcxLCAweDAyMDAsIDB4NzAzNywgMHgwMDAyLCAweDcwNTgsIDB4OTA4NCwgMHhmZjAwLAorCTB4ODAwNywgMHg5MDg2LCAweDAwYmMsIDB4MTE1OCwgMHgyMDIxLCAweDFhNzksIDB4MjQwNCwgMHg4MDAwLAorCTB4MDIwOCwgMHgyMDIyLCAweDA4MGMsIDB4N2ZlZCwgMHgwODBjLCAweDFiMTAsIDB4OTAwNiwgMHgwMGVlLAorCTB4MDA0ZSwgMHgwMDBlLCAweDAwMDUsIDB4MGMxMSwgMHgxMTA4LCAweDAwMDUsIDB4MDBlNiwgMHgwMDE2LAorCTB4MjA3MSwgMHgwMjAwLCAweDA4NDEsIDB4NjEyNCwgMHhkMWRjLCAweDAxZjgsIDB4NzAxYywgMHhkMDhjLAorCTB4MDkwNCwgMHgxNzZkLCAweDcwMTcsIDB4MDAwMCwgMHgyMDAxLCAweDAyNjQsIDB4MjAwNCwgMHhkMGJjLAorCTB4MDkwNCwgMHgxNzZkLCAweDIwMDEsIDB4MDI2OCwgMHgwMGM2LCAweDIwNjQsIDB4NjEwNCwgMHg2MDM4LAorCTB4MDBjZSwgMHg5MThlLCAweDAwMzksIDB4MTkwNCwgMHgxNzZkLCAweDljMDYsIDB4MTVmMCwgMHgwMTI2LAorCTB4MjA5MSwgMHgyNjAwLCAweDA4MGMsIDB4N2Y0NSwgMHgwMTJlLCAweDczNTgsIDB4NzQ1YywgMHg2MDE0LAorCTB4OTA1ZCwgMHgwNTk4LCAweDJiNDgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLAorCTB4ZDBiYywgMHgxOTBjLCAweGNkNTgsIDB4YWI0MiwgMHhhYzNlLCAweDIwMDEsIDB4MTg2OSwgMHgyMDA0LAorCTB4ZDBiNCwgMHgxMTcwLCAweDYwMWMsIDB4ZDBlNCwgMHgxMTU4LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LAorCTB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTEyMCwgMHhhODNiLCAweDdmZmYsIDB4YTgzNywgMHhmZmZmLAorCTB4MDgwYywgMHgxZWNiLCAweDExOTAsIDB4MDgwYywgMHgxOTVlLCAweDJhMDAsIDB4YTgxNiwgMHgwMTMwLAorCTB4MjgwMCwgMHhhODBlLCAweDJjMDUsIDB4YTgwYSwgMHgyYzAwLCAweGE4MTIsIDB4NzAzNywgMHgwMDIwLAorCTB4NzgxZiwgMHgwMzAwLCAweDAwMWUsIDB4MDBlZSwgMHgwMDA1LCAweDcwMzcsIDB4MDA1MCwgMHg3MDM3LAorCTB4MDAyMCwgMHgwMDFlLCAweDAwZWUsIDB4MDgwYywgMHgxNjJmLCAweDAwMDUsIDB4MDgwYywgMHgwZDdkLAorCTB4MmNmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjIwMCwgMHgwMDE2LCAweDAwYzYsIDB4M2U2MCwgMHg2MDE0LAorCTB4MjA0OCwgMHgyOTQwLCAweDkwM2UsIDB4MjczMCwgMHhhODY0LCAweDIwNjgsIDB4YTgxYSwgMHg5ZDg0LAorCTB4MDAwZiwgMHg5MDg4LCAweDFlYWIsIDB4MjE2NSwgMHgwMDAyLCAweDE3YTQsIDB4MTgxMiwgMHgxN2E0LAorCTB4MTdhNCwgMHgxN2E4LCAweDE3ZjMsIDB4MTdhNCwgMHgxN2M4LCAweDE3OWQsIDB4MTgwOSwgMHgxN2E0LAorCTB4MTdhNCwgMHgxN2FkLCAweDE4ZmYsIDB4MTdkYywgMHgxN2QyLCAweGE5NjQsIDB4OTE4YywgMHgwMGZmLAorCTB4OTE4ZSwgMHgwMDQ4LCAweDA5MDQsIDB4MTgwOSwgMHg5MDg1LCAweDAwMDEsIDB4MDgwNCwgMHgxOGY1LAorCTB4YTg3YywgMHhkMGFjLCAweDBkYzgsIDB4MDgwNCwgMHgxODE5LCAweGE4N2MsIDB4ZDBhYywgMHgwZGEwLAorCTB4MDgwNCwgMHgxODg0LCAweGE4OTgsIDB4OTAxZCwgMHgxMTA4LCAweGFiOWMsIDB4OTAxNiwgMHhhYWIyLAorCTB4YWEzZSwgMHhhYTQyLCAweDNlMDAsIDB4OTA4MCwgMHgwMDA4LCAweDIwMDQsIDB4OTA4MCwgMHg5MWQzLAorCTB4MjAwNSwgMHg5MDA1LCAweDA5MGMsIDB4MGQ3ZCwgMHgyMDA0LCAweGE4YWUsIDB4MDgwNCwgMHgxOGRkLAorCTB4YTg3YywgMHhkMGJjLCAweDA5YzgsIDB4YTg5MCwgMHhhODQyLCAweGE4OGMsIDB4YTgzZSwgMHhhODg4LAorCTB4MDgwNCwgMHgxODE5LCAweGE4N2MsIDB4ZDBiYywgMHgwOTc4LCAweGE4OTAsIDB4YTg0MiwgMHhhODhjLAorCTB4YTgzZSwgMHhhODg4LCAweDA4MDQsIDB4MTg4NCwgMHhhODdjLCAweGQwYmMsIDB4MDkyOCwgMHhhODkwLAorCTB4YTg0MiwgMHhhODhjLCAweGE4M2UsIDB4YTgwNCwgMHg5MDQ1LCAweDA5MGMsIDB4MGQ3ZCwgMHhhMTY0LAorCTB4YTkxYSwgMHg5MWVjLCAweDAwMGYsIDB4OWQ4MCwgMHgxZWFiLCAweDIwNjUsIDB4YTg4OCwgMHhkMTljLAorCTB4MTkwNCwgMHgxODg0LCAweDA0MzAsIDB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4MTdhNCwgMHhhODA0LAorCTB4OTA0NSwgMHgwOTBjLCAweDBkN2QsIDB4YTE2NCwgMHhhOTFhLCAweDkxZWMsIDB4MDAwZiwgMHg5ZDgwLAorCTB4MWVhYiwgMHgyMDY1LCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLCAweGQxOWMsIDB4MTkwNCwgMHgxODg0LAorCTB4MDA4MCwgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwgMHgxN2E0LCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLAorCTB4MDgwNCwgMHgxODg0LCAweGE4N2MsIDB4ZDBhYywgMHgwOTA0LCAweDE3YTQsIDB4OTAwNiwgMHhhODQyLAorCTB4YTgzZSwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwgMHgwMDFiLAorCTB4MDAwMiwgMHgxODNjLCAweDE4M2MsIDB4MTgzZSwgMHgxODNjLCAweDE4M2MsIDB4MTgzYywgMHgxODQ4LAorCTB4MTgzYywgMHgxODNjLCAweDE4M2MsIDB4MTg1MiwgMHgxODNjLCAweDE4M2MsIDB4MTgzYywgMHgxODVjLAorCTB4MTgzYywgMHgxODNjLCAweDE4M2MsIDB4MTg2NiwgMHgxODNjLCAweDE4M2MsIDB4MTgzYywgMHgxODcwLAorCTB4MTgzYywgMHgxODNjLCAweDE4M2MsIDB4MTg3YSwgMHgwODBjLCAweDBkN2QsIDB4YTU3NCwgMHhhNDc4LAorCTB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTdiMiwgMHhhMzdjLCAweGEyODAsIDB4MDgwNCwgMHgxOGRkLAorCTB4YTU4NCwgMHhhNDg4LCAweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3YjIsIDB4YTM4YywgMHhhMjkwLAorCTB4MDgwNCwgMHgxOGRkLCAweGE1OTQsIDB4YTQ5OCwgMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxN2IyLAorCTB4YTM5YywgMHhhMmEwLCAweDA4MDQsIDB4MThkZCwgMHhhNWE0LCAweGE0YTgsIDB4OWQ4NiwgMHgwMDI0LAorCTB4MDkwNCwgMHgxN2IyLCAweGEzYWMsIDB4YTJiMCwgMHgwODA0LCAweDE4ZGQsIDB4YTViNCwgMHhhNGI4LAorCTB4OWQ4NiwgMHgwMDI0LCAweDA5MDQsIDB4MTdiMiwgMHhhM2JjLCAweGEyYzAsIDB4MDgwNCwgMHgxOGRkLAorCTB4YTVjNCwgMHhhNGM4LCAweDlkODYsIDB4MDAyNCwgMHgwOTA0LCAweDE3YjIsIDB4YTNjYywgMHhhMmQwLAorCTB4MDgwNCwgMHgxOGRkLCAweGE1ZDQsIDB4YTRkOCwgMHg5ZDg2LCAweDAwMjQsIDB4MDkwNCwgMHgxN2IyLAorCTB4YTNkYywgMHhhMmUwLCAweDA4MDQsIDB4MThkZCwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNCwgMHgxYTBjLAorCTB4MGQ3ZCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxOGE3LCAweDE4YTUsIDB4MThhNSwgMHgxOGE1LAorCTB4MThhNSwgMHgxOGE1LCAweDE4YjIsIDB4MThhNSwgMHgxOGE1LCAweDE4YTUsIDB4MThhNSwgMHgxOGE1LAorCTB4MThiZCwgMHgxOGE1LCAweDE4YTUsIDB4MThhNSwgMHgxOGE1LCAweDE4YTUsIDB4MThjOCwgMHgxOGE1LAorCTB4MThhNSwgMHgxOGE1LCAweDE4YTUsIDB4MThhNSwgMHgxOGQzLCAweDA4MGMsIDB4MGQ3ZCwgMHhhNTZjLAorCTB4YTQ3MCwgMHhhNzc0LCAweGE2NzgsIDB4OWQ4NiwgMHgwMDJjLCAweDA5MDQsIDB4MTdiMiwgMHhhMzdjLAorCTB4YTI4MCwgMHgwNDU4LCAweGE1ODQsIDB4YTQ4OCwgMHhhNzhjLCAweGE2OTAsIDB4OWQ4NiwgMHgwMDJjLAorCTB4MDkwNCwgMHgxN2IyLCAweGEzOTQsIDB4YTI5OCwgMHgwNDAwLCAweGE1OWMsIDB4YTRhMCwgMHhhN2E0LAorCTB4YTZhOCwgMHg5ZDg2LCAweDAwMmMsIDB4MDkwNCwgMHgxN2IyLCAweGEzYWMsIDB4YTJiMCwgMHgwMGE4LAorCTB4YTViNCwgMHhhNGI4LCAweGE3YmMsIDB4YTZjMCwgMHg5ZDg2LCAweDAwMmMsIDB4MDkwNCwgMHgxN2IyLAorCTB4YTNjNCwgMHhhMmM4LCAweDAwNTAsIDB4YTVjYywgMHhhNGQwLCAweGE3ZDQsIDB4YTZkOCwgMHg5ZDg2LAorCTB4MDAyYywgMHgwOTA0LCAweDE3YjIsIDB4YTNkYywgMHhhMmUwLCAweGFiMmUsIDB4YWEzMiwgMHhhZDFlLAorCTB4YWMyMiwgMHhhZjI2LCAweGFlMmEsIDB4YTk4OCwgMHg4YzYwLCAweDJjMWQsIDB4YThhYywgMHhhYWIwLAorCTB4YTgzNiwgMHhhYTNhLCAweDgxMDksIDB4YTkxNiwgMHgxMTYwLCAweDNlNjAsIDB4NjAxYywgMHhjMDg1LAorCTB4NjAxZSwgMHhhODdjLCAweGMwZGQsIDB4YTg3ZSwgMHg5MDA2LCAweDAwY2UsIDB4MDAxZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgyODAwLCAweGE4MGUsIDB4YWIwYSwgMHgyYzAwLCAweGE4MTIsIDB4MGM3MCwgMHgwODA0LAorCTB4MTdhNCwgMHgyZmYwLCAweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDAwMTYsIDB4MDBjNiwgMHgzZTYwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDI5NDAsIDB4YTgwZSwgMHgyMDYxLCAweDFlYTYsIDB4YTgxMywgMHgxZWE2LAorCTB4MmMwNSwgMHhhODBhLCAweGE5NjQsIDB4YTkxYSwgMHhhODdjLCAweGQwYWMsIDB4MDkwYywgMHgwZDdkLAorCTB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZDdkLAorCTB4YWRjYywgMHhhY2QwLCAweGFmZDQsIDB4YWVkOCwgMHhhYmRjLCAweGFhZTAsIDB4YWIyZSwgMHhhYTMyLAorCTB4YWQxZSwgMHhhYzIyLCAweGFmMjYsIDB4YWUyYSwgMHhhOGFjLCAweGFhYjAsIDB4YTgzNiwgMHhhYTNhLAorCTB4YTk4OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDgsIDB4MTEyMCwgMHg4MTA5LAorCTB4YTkxNiwgMHgwMTI4LCAweDAwODAsIDB4OTE4YSwgMHgwMDAyLCAweGE5MTYsIDB4MTE2MCwgMHgzZTYwLAorCTB4NjAxYywgMHhjMDg1LCAweDYwMWUsIDB4YTg3YywgMHhjMGRkLCAweGE4N2UsIDB4OTAwNiwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMTJlLCAweDAwMDUsIDB4YTgwNCwgMHg5MDQ1LCAweDA5MGMsIDB4MGQ3ZCwgMHhhODBlLAorCTB4YTA2NCwgMHhhODFhLCAweDkwODQsIDB4MDAwZiwgMHg5MDgwLCAweDFlYWIsIDB4MjAxNSwgMHg4MmZmLAorCTB4MDkwYywgMHgwZDdkLCAweGFhMTIsIDB4MjIwNSwgMHhhODBhLCAweDBjMDgsIDB4OTAzZSwgMHgyNzMwLAorCTB4YTg4MCwgMHhkMGZjLCAweDExOTAsIDB4MmQwMCwgMHgwMDAyLCAweDFhODgsIDB4MTliNSwgMHgxOWI1LAorCTB4MWE4OCwgMHgxOWI1LCAweDFhODIsIDB4MWE4OCwgMHgxOWI1LCAweDFhMjUsIDB4MWEyNSwgMHgxYTI1LAorCTB4MWE4OCwgMHgxYTI1LCAweDFhODgsIDB4MWE3ZiwgMHgxYTI1LCAweGMwZmMsIDB4YTg4MiwgMHhhYjJjLAorCTB4YWEzMCwgMHhhZDFjLCAweGFjMjAsIDB4ZGQ5YywgMHgwOTA0LCAweDFhOGEsIDB4MmMwNSwgMHg5MDhhLAorCTB4MDAzNCwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MTlhMSwgMHgxOTlmLAorCTB4MTk5ZiwgMHgxOTlmLCAweDE5OWYsIDB4MTk5ZiwgMHgxOWE1LCAweDE5OWYsIDB4MTk5ZiwgMHgxOTlmLAorCTB4MTk5ZiwgMHgxOTlmLCAweDE5YTksIDB4MTk5ZiwgMHgxOTlmLCAweDE5OWYsIDB4MTk5ZiwgMHgxOTlmLAorCTB4MTlhZCwgMHgxOTlmLCAweDE5OWYsIDB4MTk5ZiwgMHgxOTlmLCAweDE5OWYsIDB4MTliMSwgMHgwODBjLAorCTB4MGQ3ZCwgMHhhNzc0LCAweGE2NzgsIDB4MDgwNCwgMHgxYThhLCAweGE3OGMsIDB4YTY5MCwgMHgwODA0LAorCTB4MWE4YSwgMHhhN2E0LCAweGE2YTgsIDB4MDgwNCwgMHgxYThhLCAweGE3YmMsIDB4YTZjMCwgMHgwODA0LAorCTB4MWE4YSwgMHhhN2Q0LCAweGE2ZDgsIDB4MDgwNCwgMHgxYThhLCAweGE4OTgsIDB4OTAxZCwgMHgxMTA4LAorCTB4YWI5YywgMHg5MDE2LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLAorCTB4MDAxYiwgMHgwMDAyLCAweDE5ZGQsIDB4MTlkZCwgMHgxOWRmLCAweDE5ZGQsIDB4MTlkZCwgMHgxOWRkLAorCTB4MTllOSwgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZCwgMHgxOWYzLCAweDE5ZGQsIDB4MTlkZCwgMHgxOWRkLAorCTB4MTlmZCwgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZCwgMHgxYTA3LCAweDE5ZGQsIDB4MTlkZCwgMHgxOWRkLAorCTB4MWExMSwgMHgxOWRkLCAweDE5ZGQsIDB4MTlkZCwgMHgxYTFiLCAweDA4MGMsIDB4MGQ3ZCwgMHhhNTc0LAorCTB4YTQ3OCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwgMHgxYThhLCAweGEzN2MsIDB4YTI4MCwgMHgwODA0LAorCTB4MWE4YSwgMHhhNTg0LCAweGE0ODgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsIDB4MWE4YSwgMHhhMzhjLAorCTB4YTI5MCwgMHgwODA0LCAweDFhOGEsIDB4YTU5NCwgMHhhNDk4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LAorCTB4MWE4YSwgMHhhMzljLCAweGEyYTAsIDB4MDgwNCwgMHgxYThhLCAweGE1YTQsIDB4YTRhOCwgMHg5ZDg2LAorCTB4MDAwNCwgMHgwOTA0LCAweDFhOGEsIDB4YTNhYywgMHhhMmIwLCAweDA4MDQsIDB4MWE4YSwgMHhhNWI0LAorCTB4YTRiOCwgMHg5ZDg2LCAweDAwMDQsIDB4MDkwNCwgMHgxYThhLCAweGEzYmMsIDB4YTJjMCwgMHgwODA0LAorCTB4MWE4YSwgMHhhNWM0LCAweGE0YzgsIDB4OWQ4NiwgMHgwMDA0LCAweDA5MDQsIDB4MWE4YSwgMHhhM2NjLAorCTB4YTJkMCwgMHgwODA0LCAweDFhOGEsIDB4YTVkNCwgMHhhNGQ4LCAweDlkODYsIDB4MDAwNCwgMHgwOTA0LAorCTB4MWE4YSwgMHhhM2RjLCAweGEyZTAsIDB4MDgwNCwgMHgxYThhLCAweGE4OTgsIDB4OTAxZCwgMHgxMTA4LAorCTB4YWI5YywgMHg5MDE2LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLAorCTB4MDAxYiwgMHgwMDAyLCAweDFhNGQsIDB4MWE0YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE0YiwgMHgxYTRiLAorCTB4MWE1NywgMHgxYTRiLCAweDFhNGIsIDB4MWE0YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE2MSwgMHgxYTRiLAorCTB4MWE0YiwgMHgxYTRiLCAweDFhNGIsIDB4MWE0YiwgMHgxYTZiLCAweDFhNGIsIDB4MWE0YiwgMHgxYTRiLAorCTB4MWE0YiwgMHgxYTRiLCAweDFhNzUsIDB4MDgwYywgMHgwZDdkLCAweGE1NmMsIDB4YTQ3MCwgMHhhNzc0LAorCTB4YTY3OCwgMHg5ZDg2LCAweDAwMGMsIDB4MDViMCwgMHhhMzdjLCAweGEyODAsIDB4MDQ5OCwgMHhhNTg0LAorCTB4YTQ4OCwgMHhhNzhjLCAweGE2OTAsIDB4OWQ4NiwgMHgwMDBjLCAweDA1NjAsIDB4YTM5NCwgMHhhMjk4LAorCTB4MDQ0OCwgMHhhNTljLCAweGE0YTAsIDB4YTdhNCwgMHhhNmE4LCAweDlkODYsIDB4MDAwYywgMHgwNTEwLAorCTB4YTNhYywgMHhhMmIwLCAweDAwZjgsIDB4YTViNCwgMHhhNGI4LCAweGE3YmMsIDB4YTZjMCwgMHg5ZDg2LAorCTB4MDAwYywgMHgwMWMwLCAweGEzYzQsIDB4YTJjOCwgMHgwMGE4LCAweGE1Y2MsIDB4YTRkMCwgMHhhN2Q0LAorCTB4YTZkOCwgMHg5ZDg2LCAweDAwMGMsIDB4MDE3MCwgMHhhM2RjLCAweGEyZTAsIDB4MDA1OCwgMHg5ZDg2LAorCTB4MDAwZSwgMHgxMTMwLCAweDA4MGMsIDB4MWU4MSwgMHgxOTA0LCAweDE5NWUsIDB4OTAwZSwgMHgwMDUwLAorCTB4MDgwYywgMHgwZDdkLCAweGFiMmUsIDB4YWEzMiwgMHhhZDFlLCAweGFjMjIsIDB4YWYyNiwgMHhhZTJhLAorCTB4MDgwYywgMHgxZTgxLCAweDAwMDUsIDB4NjAxNCwgMHgyMDQ4LCAweDYxMTgsIDB4ODEwYywgMHg4MTBjLAorCTB4ODEwYywgMHg4MWZmLCAweDExMTgsIDB4YTg4NywgMHgwMDAxLCAweDAwMDgsIDB4YTk4NiwgMHg2MDFiLAorCTB4MDAwMiwgMHhhODc0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg0LCAweDAwMDgsIDB4MDE1MCwgMHgwMGU5LAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTEyMCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHhhZDRkLAorCTB4MDAwNSwgMHhhOTc0LCAweGQxZGMsIDB4MTEwOCwgMHgwMDA1LCAweGE5MzQsIDB4YTg4YywgMHg5MTA2LAorCTB4MTE1OCwgMHhhOTM4LCAweGE4OTAsIDB4OTEwNiwgMHgxMTM4LCAweDYwMWMsIDB4YzA4NCwgMHg2MDFlLAorCTB4MjAwOSwgMHgwMDQ4LCAweDA4MDQsIDB4YWQ0ZCwgMHgwMDA1LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLAorCTB4MjIwMCwgMHgwMGNlLCAweDc5MDgsIDB4OTE4YywgMHgwMDA3LCAweDkxODYsIDB4MDAwMCwgMHgwNWIwLAorCTB4OTE4NiwgMHgwMDAzLCAweDA1OTgsIDB4NjAyMCwgMHg2MDIzLCAweDAwMDAsIDB4MDAwNiwgMHgyMDMxLAorCTB4MDAwOCwgMHgwMGM2LCAweDc4MWYsIDB4MDgwOCwgMHg3ODA4LCAweGQwOWMsIDB4MDEyMCwgMHgwODBjLAorCTB4MTNiYiwgMHg4NjMxLCAweDFkYjgsIDB4MDBjZSwgMHg3ODFmLCAweDA4MDAsIDB4MjAzMSwgMHgwMTY4LAorCTB4MDBjNiwgMHg3ODA4LCAweGQwOWMsIDB4MTkwYywgMHgxM2JiLCAweDAwY2UsIDB4MjAwMSwgMHgwMDM4LAorCTB4MDgwYywgMHgxYjk4LCAweDc5MzAsIDB4OTE4NiwgMHgwMDQwLCAweDAxNjAsIDB4OTE4NiwgMHgwMDQyLAorCTB4MTkwYywgMHgwZDdkLCAweDIwMDEsIDB4MDAxZSwgMHg4MDAxLCAweDFkZjAsIDB4ODYzMSwgMHgxZDQwLAorCTB4MDgwYywgMHgxYmE3LCAweDAwMGUsIDB4NjAyMiwgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHgxYjk0LAorCTB4NzgyNywgMHgwMDE1LCAweDc4MjgsIDB4OWMwNiwgMHgxZGI4LCAweDc4MmIsIDB4MDAwMCwgMHgwY2EwLAorCTB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzgwMywgMHgwMDAwLCAweDc4YWIsIDB4MDAwNCwgMHgwMGZlLAorCTB4MDgwYywgMHg3NTNkLCAweDExODgsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDE2MCwgMHgyMDAzLCAweDAwMDAsIDB4MjAxMSwgMHgwMTJjLCAweGEwMDEsIDB4YTAwMSwgMHg4MjExLAorCTB4MWRlMCwgMHgwMDU5LCAweDA4MDQsIDB4NzVlMiwgMHgwNDc5LCAweDAwMzksIDB4MjAwMSwgMHgwMTYwLAorCTB4MjUwMiwgMHgyMDAxLCAweDAxMzgsIDB4MjIwMiwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMjAwLAorCTB4MDgwYywgMHgyYTZjLCAweDIwMDksIDB4MDAzYywgMHgwODBjLCAweDIyMGEsIDB4MjAwMSwgMHgwMTVkLAorCTB4MjAwMywgMHgwMDAwLCAweDcwMDAsIDB4OTA4NCwgMHgwMDNjLCAweDFkZTAsIDB4MDgwYywgMHg4NWNlLAorCTB4NzBhMCwgMHg3MGEyLCAweDcwOTgsIDB4NzA5YSwgMHg3MDljLCAweDcwOWUsIDB4MjAwMSwgMHgwMjBkLAorCTB4MjAwMywgMHgwMDIwLCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDA4MGMsIDB4MTM1NCwgMHg3ODAzLAorCTB4MDAwMSwgMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDAxMzgsIDB4MjAxNCwgMHgyMDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDAxNjAsIDB4MjAyYywgMHgyMDAzLCAweDAwMDAsIDB4MDgwYywgMHg3NTNkLAorCTB4MTEwOCwgMHgwMDA1LCAweDIwMjEsIDB4MDI2MCwgMHgyMDAxLCAweDAxNDEsIDB4MjAxYywgMHhkM2RjLAorCTB4MTE2OCwgMHgyMDAxLCAweDAxMDksIDB4MjAxYywgMHg5MzljLCAweDAwNDgsIDB4MTE2MCwgMHgyMDAxLAorCTB4MDExMSwgMHgyMDFjLCAweDgzZmYsIDB4MTExMCwgMHg4NDIxLCAweDFkNzAsIDB4MjAwMSwgMHgwMTVkLAorCTB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MDA0NiwgMHgyMDIxLCAweDAwMTksIDB4MjAwMywgMHgwMDQ4LAorCTB4YTAwMSwgMHhhMDAxLCAweDIwMWMsIDB4OTM5YywgMHgwMDQ4LCAweDAxMjAsIDB4ODQyMSwgMHgxZGIwLAorCTB4MDA0ZSwgMHgwYzYwLCAweDAwNGUsIDB4MGM0MCwgMHg2MDFjLCAweGMwODQsIDB4NjAxZSwgMHgwMDA1LAorCTB4MmMwOCwgMHg2MjFjLCAweDA4MGMsIDB4MTZhMCwgMHg3OTMwLCAweDAwMDUsIDB4MmMwOCwgMHg2MjFjLAorCTB4MDgwYywgMHgxNmNkLCAweDc5MzAsIDB4MDAwNSwgMHg4MDAxLCAweDFkZjAsIDB4MDAwNSwgMHgyMDMxLAorCTB4MDA2NCwgMHg3ODFjLCAweDkwODQsIDB4MDAwNywgMHgwMTcwLCAweDIwMDEsIDB4MDAzOCwgMHgwYzQxLAorCTB4OTE4NiwgMHgwMDQwLCAweDA5MDQsIDB4MWMwNSwgMHgyMDAxLCAweDAwMWUsIDB4MGM2OSwgMHg4NjMxLAorCTB4MWQ4MCwgMHgwODBjLCAweDBkN2QsIDB4NzgxZiwgMHgwMjAyLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDBkYWMsIDB4MGMwMSwgMHg3ODFjLCAweGQwODQsIDB4MDExMCwgMHgwODYxLAorCTB4MDRlMCwgMHgyMDAxLCAweDAwMzAsIDB4MDg5MSwgMHg5MTg2LCAweDAwNDAsIDB4MDU2OCwgMHg3ODFjLAorCTB4ZDA4NCwgMHgxZGE4LCAweDc4MWYsIDB4MDEwMSwgMHgyMDAxLCAweDAwMTQsIDB4MDg2OSwgMHgyMDAxLAorCTB4MDAzNywgMHgwODIxLCAweDkxODYsIDB4MDA0MCwgMHgwMTQwLCAweDIwMDEsIDB4MDAzMCwgMHgwODBjLAorCTB4MWI5ZSwgMHg5MTg2LCAweDAwNDAsIDB4MTkwYywgMHgwZDdkLCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLAorCTB4NjkyYywgMHhkMWY0LCAweDExNzAsIDB4ZDFjNCwgMHgwMTYwLCAweGQxOWMsIDB4MDEzMCwgMHg2ODAwLAorCTB4OTA4NSwgMHgxODAwLCAweDY4MDIsIDB4MDBkZSwgMHgwMDgwLCAweDY5MDgsIDB4OTE4NCwgMHgwMDA3LAorCTB4MWRiMCwgMHgwMGRlLCAweDc4MWYsIDB4MDEwMCwgMHg3OTFjLCAweDkxODQsIDB4MDAwNywgMHgwOTBjLAorCTB4MGQ3ZCwgMHhhMDAxLCAweGEwMDEsIDB4NzgxZiwgMHgwMjAwLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjQwMCwgMHgyMDc5LCAweDAzODAsIDB4MjAwMSwgMHgxOWU2LCAweDIwNzAsIDB4MDEyZSwgMHgwMDA1LAorCTB4MmNmMCwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHgzZTYwLCAweDYwMTQsIDB4MjA0OCwgMHhhOTY0LAorCTB4YTkxYSwgMHg5MThjLCAweDAwZmYsIDB4OTE4NCwgMHgwMDBmLCAweDAwMDIsIDB4MWMzYSwgMHgxYzNhLAorCTB4MWMzYSwgMHgxYzNjLCAweDFjM2EsIDB4MWMzYSwgMHgxYzNhLCAweDFjM2EsIDB4MWMyZSwgMHgxYzQ0LAorCTB4MWMzYSwgMHgxYzQwLCAweDFjM2EsIDB4MWMzYSwgMHgxYzNhLCAweDFjM2EsIDB4OTA4NiwgMHgwMDA4LAorCTB4MTE0OCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwgMHgxZGI0LCAweDIwMTEsIDB4MWVhNiwgMHgyMjA1LAorCTB4YWI4OCwgMHgwMGE4LCAweDA4MGMsIDB4MGQ3ZCwgMHg5MTg2LCAweDAwMTMsIDB4MDEyOCwgMHgwY2QwLAorCTB4OTE4NiwgMHgwMDFiLCAweDAxMDgsIDB4MGNiMCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwgMHgxZGI0LAorCTB4OTE4NCwgMHgwMDBmLCAweDkwODAsIDB4MWVhYiwgMHgyMDE1LCAweDIyMDUsIDB4YWI4OCwgMHgyOTA4LAorCTB4YTgwYSwgMHhhOTBlLCAweGFhMTIsIDB4YWIxNiwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgyY2YwLCAweDAxMjYsIDB4MjA5MSwgMHgyNDAwLCAweDNlNjAsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTg4YywgMHhhOTkwLCAweGFhYWMsIDB4YWJiMCwgMHhhYTM2LCAweGFiM2EsIDB4YTgzZSwgMHhhOTQyLAorCTB4YTg0NiwgMHhhOTRhLCAweGE5NjQsIDB4OTE4YywgMHgwMGZmLCAweDkxODYsIDB4MDAxZSwgMHgwMTk4LAorCTB4Mjk0MCwgMHhhMDY0LCAweGE4MWEsIDB4OTBlYywgMHgwMDBmLCAweDlkODAsIDB4MWVhYiwgMHgyMDY1LAorCTB4MmMwNSwgMHgyODA4LCAweDJjMTAsIDB4YWI4OCwgMHhhODBhLCAweGE5MGUsIDB4YWExMiwgMHhhYjE2LAorCTB4MDEyZSwgMHgzZTYwLCAweDAwMDUsIDB4YTgwNCwgMHgyMDQwLCAweDBjNTgsIDB4MmNmMCwgMHgwMTI2LAorCTB4MjA5MSwgMHgyNDAwLCAweDNlNjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE5N2MsIDB4Mjk1MCwgMHhkMWRjLAorCTB4MTkwNCwgMHgxZDdlLCAweGMxZGQsIDB4YTk3ZSwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHhhOTg4LAorCTB4ODEwOSwgMHhhOTE2LCAweGE5NjQsIDB4YTkxYSwgMHg5MTg0LCAweDAwMGYsIDB4OTA4OCwgMHgxZWFiLAorCTB4MjE0NSwgMHgwMDAyLCAweDFjYjIsIDB4MWNjMCwgMHgxY2IyLCAweDFjYjIsIDB4MWNiMiwgMHgxY2I0LAorCTB4MWNiMiwgMHgxY2IyLCAweDFkMTUsIDB4MWQxNSwgMHgxY2IyLCAweDFjYjIsIDB4MWNiMiwgMHgxZDEzLAorCTB4MWNiMiwgMHgxY2IyLCAweDA4MGMsIDB4MGQ3ZCwgMHhhODA0LCAweDIwNTAsIDB4YjE2NCwgMHhhOTFhLAorCTB4OTE4NCwgMHgwMDBmLCAweDkwODAsIDB4MWVhYiwgMHgyMDQ1LCAweGQxOWMsIDB4MTkwNCwgMHgxZDE1LAorCTB4OTAzNiwgMHgyNjM4LCAweDI4MDUsIDB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLAorCTB4MDAxYiwgMHgwMDAyLCAweDFjZTUsIDB4MWNlNSwgMHgxY2U3LCAweDFjZTUsIDB4MWNlNSwgMHgxY2U1LAorCTB4MWNlZCwgMHgxY2U1LCAweDFjZTUsIDB4MWNlNSwgMHgxY2YzLCAweDFjZTUsIDB4MWNlNSwgMHgxY2U1LAorCTB4MWNmOSwgMHgxY2U1LCAweDFjZTUsIDB4MWNlNSwgMHgxY2ZmLCAweDFjZTUsIDB4MWNlNSwgMHgxY2U1LAorCTB4MWQwNSwgMHgxY2U1LCAweDFjZTUsIDB4MWNlNSwgMHgxZDBiLCAweDA4MGMsIDB4MGQ3ZCwgMHhiNTc0LAorCTB4YjQ3OCwgMHhiMzdjLCAweGIyODAsIDB4MDgwNCwgMHgxZDVhLCAweGI1ODQsIDB4YjQ4OCwgMHhiMzhjLAorCTB4YjI5MCwgMHgwODA0LCAweDFkNWEsIDB4YjU5NCwgMHhiNDk4LCAweGIzOWMsIDB4YjJhMCwgMHgwODA0LAorCTB4MWQ1YSwgMHhiNWE0LCAweGI0YTgsIDB4YjNhYywgMHhiMmIwLCAweDA4MDQsIDB4MWQ1YSwgMHhiNWI0LAorCTB4YjRiOCwgMHhiM2JjLCAweGIyYzAsIDB4MDgwNCwgMHgxZDVhLCAweGI1YzQsIDB4YjRjOCwgMHhiM2NjLAorCTB4YjJkMCwgMHgwODA0LCAweDFkNWEsIDB4YjVkNCwgMHhiNGQ4LCAweGIzZGMsIDB4YjJlMCwgMHgwODA0LAorCTB4MWQ1YSwgMHgwODA0LCAweDFkNWEsIDB4MDgwYywgMHgwZDdkLCAweDI4MDUsIDB4OTA4YSwgMHgwMDM0LAorCTB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFkMzgsIDB4MWQzNiwgMHgxZDM2LAorCTB4MWQzNiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzZiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzNiwgMHgxZDM2LAorCTB4MWQzNiwgMHgxZDQ2LCAweDFkMzYsIDB4MWQzNiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzNiwgMHgxZDRkLAorCTB4MWQzNiwgMHgxZDM2LCAweDFkMzYsIDB4MWQzNiwgMHgxZDM2LCAweDFkNTQsIDB4MDgwYywgMHgwZDdkLAorCTB4YjU2YywgMHhiNDcwLCAweGI3NzQsIDB4YjY3OCwgMHhiMzdjLCAweGIyODAsIDB4MDBkOCwgMHhiNTg0LAorCTB4YjQ4OCwgMHhiNzhjLCAweGI2OTAsIDB4YjM5NCwgMHhiMjk4LCAweDAwYTAsIDB4YjU5YywgMHhiNGEwLAorCTB4YjdhNCwgMHhiNmE4LCAweGIzYWMsIDB4YjJiMCwgMHgwMDY4LCAweGI1YjQsIDB4YjRiOCwgMHhiN2JjLAorCTB4YjZjMCwgMHhiM2M0LCAweGIyYzgsIDB4MDAzMCwgMHhiNWNjLCAweGI0ZDAsIDB4YjdkNCwgMHhiNmQ4LAorCTB4YjNkYywgMHhiMmUwLCAweGFiMmUsIDB4YWEzMiwgMHhhZDFlLCAweGFjMjIsIDB4YWYyNiwgMHhhZTJhLAorCTB4YTk4OCwgMHg4MTA5LCAweGE5MTYsIDB4MTExOCwgMHg5MDA2LCAweDAxMmUsIDB4MDAwNSwgMHg4ODQwLAorCTB4MjgwNSwgMHg5MDA1LCAweDExNjgsIDB4YjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGQ3ZCwgMHgyMDUwLAorCTB4YjE2NCwgMHhhOTFhLCAweDkxODQsIDB4MDAwZiwgMHg5MDgwLCAweDFlYWIsIDB4MjA0NSwgMHgyODA1LAorCTB4MjgxMCwgMHgyYTA4LCAweGE4MGEsIDB4YTkwZSwgMHhhYTEyLCAweDBjMzAsIDB4M2U2MCwgMHg2MzQ0LAorCTB4ZDNmYywgMHgxOTBjLCAweDBkN2QsIDB4YTkzYywgMHhhYTQwLCAweGE4NDQsIDB4OTEwNiwgMHgxMTE4LAorCTB4YTg0OCwgMHg5MjA2LCAweDA1MDgsIDB4Mjk1OCwgMHhhYjQ4LCAweGFjNDQsIDB4Mjk0MCwgMHgwODBjLAorCTB4MWVjYiwgMHgxOTk4LCAweDI4NTAsIDB4MmM0MCwgMHhhYjE0LCAweGE4ODAsIDB4ZDBmYywgMHgxMTQwLAorCTB4YTgxMCwgMHgyMDA1LCAweGE4MGEsIDB4MmEwMCwgMHhhODBlLCAweDIwMDksIDB4ODAxNSwgMHgwMDcwLAorCTB4MDBjNiwgMHgzZTYwLCAweDYwNDQsIDB4YzBhNCwgMHg5MDg1LCAweDgwMDUsIDB4NjA0NiwgMHgwMGNlLAorCTB4ODMxOSwgMHhhYjE2LCAweDE5MDQsIDB4MWQ2NywgMHgyMDA5LCAweDgwMDUsIDB4M2U2MCwgMHg2MDQ0LAorCTB4OTEwNSwgMHg2MDQ2LCAweDA4MDQsIDB4MWQ2NCwgMHgwODBjLCAweDBkN2QsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDA5NiwgMHgwMGM2LCAweDAwMjYsIDB4NzA0YywgMHg5YzA2LCAweDE5MGMsIDB4MGQ3ZCwgMHgyMDc5LAorCTB4MDA5MCwgMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDc4MmIsIDB4MDAwNCwgMHg3MDU3LAorCTB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxMTgsIDB4YTg4MCwgMHhjMGJkLAorCTB4YTg4MiwgMHg2MDIwLCAweDkwODYsIDB4MDAwNiwgMHgxMTcwLCAweDIwNjEsIDB4MDEwMCwgMHg2MmM4LAorCTB4MjAwMSwgMHgwMGZhLCAweDgwMDEsIDB4MWRmMCwgMHg2MGM4LCAweDkyMDYsIDB4MWRjMCwgMHg2MGM0LAorCTB4YTg5YSwgMHg2MGM4LCAweGE4OTYsIDB4NzA0YywgMHgyMDYwLCAweDAwYzYsIDB4MDgwYywgMHhjNTY2LAorCTB4MDgwYywgMHhhOTFlLCAweDAwY2UsIDB4NzA0YywgMHg5YzA2LCAweDExNTAsIDB4MjAwOSwgMHgwMDQwLAorCTB4MDgwYywgMHgyMjBhLCAweDA4MGMsIDB4YTNjMywgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHhhMjRkLAorCTB4MDAyZSwgMHgwMGNlLCAweDAwOWUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDA5MCwgMHg3ODFjLCAweDAwMDYsIDB4NzgxOCwgMHgwMDA2LCAweDIwNzksIDB4MDEwMCwgMHg3YTE0LAorCTB4OTI4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxMiwgMHg3ODE2LCAweDIwMTksIDB4MTAwMCwgMHg4MzE5LAorCTB4MDkwYywgMHgwZDdkLCAweDc4MjAsIDB4ZDBiYywgMHgxZGQwLCAweDc5YzgsIDB4MDAwZSwgMHg5MTAyLAorCTB4MDAxZSwgMHgwMDA2LCAweDAwMTYsIDB4NzljNCwgMHgwMDBlLCAweDkxMDMsIDB4NzhjNiwgMHgwMDBlLAorCTB4NzhjYSwgMHg5Mjg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDEyLCAweDc4MTYsIDB4MjA3OSwgMHgwMDkwLAorCTB4NzgyYiwgMHgwMDA4LCAweDcwNTcsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MjA3MSwgMHgxOWU2LCAweDcwNTQsIDB4OTA4NiwgMHgwMDAwLCAweDA5MDQsIDB4MWU3YywgMHgyMDc5LAorCTB4MDA5MCwgMHgyMDA5LCAweDAyMDcsIDB4MjEwYywgMHhkMTk0LCAweDAxYjgsIDB4MjAwOSwgMHgwMjBjLAorCTB4MjEwYywgMHg5MTg0LCAweDAwMDMsIDB4MDE4OCwgMHgwODBjLCAweGU4YTMsIDB4MjAwMSwgMHgwMTMzLAorCTB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGQ3ZCwgMHgwMDE2LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLAorCTB4MjIwYSwgMHgwMDFlLCAweDIwMDEsIDB4MDIwYywgMHgyMTAyLCAweDIwMDksIDB4MDIwNiwgMHgyMTA0LAorCTB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4OTEwNiwgMHgxMTIwLCAweDIwMDksIDB4MDA0MCwgMHgwODBjLAorCTB4MjIwYSwgMHg3ODJjLCAweGQwZmMsIDB4MDlhOCwgMHgwODBjLCAweGE5M2EsIDB4NzgyYywgMHhkMGZjLAorCTB4MWRlOCwgMHgwODBjLCAweGE5MWUsIDB4NzA1NCwgMHg5MDg2LCAweDAwMDAsIDB4MTk1MCwgMHg3ODJiLAorCTB4MDAwNCwgMHg3ODJjLCAweGQwYWMsIDB4MWRlOCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMjBhLAorCTB4NzgyYiwgMHgwMDAyLCAweDcwNTcsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwODBjLAorCTB4MGQ3ZCwgMHg4YzYwLCAweDJjMDUsIDB4OTAwNSwgMHgwMTEwLCAweDhhNTEsIDB4MDAwNSwgMHhhMDA0LAorCTB4OTAwNSwgMHgwMTY4LCAweGE4NWEsIDB4MjA0MCwgMHhhMDY0LCAweDkwODQsIDB4MDAwZiwgMHg5MDgwLAorCTB4MWVhYiwgMHgyMDY1LCAweDhjZmYsIDB4MDkwYywgMHgwZDdkLCAweDhhNTEsIDB4MDAwNSwgMHgyMDUwLAorCTB4MDAwNSwgMHgwMDAwLCAweDAwMWQsIDB4MDAyMSwgMHgwMDI1LCAweDAwMjksIDB4MDAyZCwgMHgwMDMxLAorCTB4MDAzNSwgMHgwMDAwLCAweDAwMWIsIDB4MDAyMSwgMHgwMDI3LCAweDAwMmQsIDB4MDAzMywgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDIzLCAweDAwMDAsIDB4MDAwMCwgMHgxZTllLCAweDFlOWEsIDB4MWU5ZSwgMHgxZTllLAorCTB4MWVhOCwgMHgwMDAwLCAweDFlOWUsIDB4MWVhNSwgMHgxZWE1LCAweDFlYTIsIDB4MWVhNSwgMHgxZWE1LAorCTB4MDAwMCwgMHgxZWE4LCAweDFlYTUsIDB4MDAwMCwgMHgxZWEwLCAweDFlYTAsIDB4MDAwMCwgMHgxZWEwLAorCTB4MWVhOCwgMHgwMDAwLCAweDFlYTAsIDB4MWVhNiwgMHgxZWE2LCAweDFlYTYsIDB4MDAwMCwgMHgxZWE2LAorCTB4MDAwMCwgMHgxZWE4LCAweDFlYTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwODYsIDB4YWI0MiwgMHhhYzNlLAorCTB4YTg4OCwgMHg5MDU1LCAweDA5MDQsIDB4MjBhYSwgMHgyOTQwLCAweGEwNjQsIDB4OTBlYywgMHgwMDBmLAorCTB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwOCwgMHgxMTE4LCAweDIwNjEsIDB4MWVhNiwgMHgwMGQwLAorCTB4OWRlMCwgMHgxZWFiLCAweDlkODYsIDB4MDAwNywgMHgwMTMwLCAweDlkODYsIDB4MDAwZSwgMHgwMTE4LAorCTB4OWQ4NiwgMHgwMDBmLCAweDExMjAsIDB4YTA4YywgMHg5NDIyLCAweGEwOTAsIDB4OTMxYiwgMHgyYzA1LAorCTB4OTA2NSwgMHgxMTQwLCAweDAzMTAsIDB4MDgwNCwgMHgyMGFhLCAweGEwMDQsIDB4OTA0NSwgMHgwOTA0LAorCTB4MjBhYSwgMHgwOGQ4LCAweDJjMDUsIDB4OTAwNSwgMHgwOTA0LCAweDFmOTIsIDB4ZGQ5YywgMHgxOTA0LAorCTB4MWY0ZSwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLAorCTB4MWYyMywgMHgxZjIzLCAweDFmMjUsIDB4MWYyMywgMHgxZjIzLCAweDFmMjMsIDB4MWYyYiwgMHgxZjIzLAorCTB4MWYyMywgMHgxZjIzLCAweDFmMzEsIDB4MWYyMywgMHgxZjIzLCAweDFmMjMsIDB4MWYzNywgMHgxZjIzLAorCTB4MWYyMywgMHgxZjIzLCAweDFmM2QsIDB4MWYyMywgMHgxZjIzLCAweDFmMjMsIDB4MWY0MywgMHgxZjIzLAorCTB4MWYyMywgMHgxZjIzLCAweDFmNDksIDB4MDgwYywgMHgwZDdkLCAweGEwN2MsIDB4OTQyMiwgMHhhMDgwLAorCTB4OTMxYiwgMHgwODA0LCAweDFmODgsIDB4YTA4YywgMHg5NDIyLCAweGEwOTAsIDB4OTMxYiwgMHgwODA0LAorCTB4MWY4OCwgMHhhMDljLCAweDk0MjIsIDB4YTBhMCwgMHg5MzFiLCAweDA4MDQsIDB4MWY4OCwgMHhhMGFjLAorCTB4OTQyMiwgMHhhMGIwLCAweDkzMWIsIDB4MDgwNCwgMHgxZjg4LCAweGEwYmMsIDB4OTQyMiwgMHhhMGMwLAorCTB4OTMxYiwgMHgwODA0LCAweDFmODgsIDB4YTBjYywgMHg5NDIyLCAweGEwZDAsIDB4OTMxYiwgMHgwODA0LAorCTB4MWY4OCwgMHhhMGRjLCAweDk0MjIsIDB4YTBlMCwgMHg5MzFiLCAweDA0ZDAsIDB4OTA4YSwgMHgwMDM0LAorCTB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFmNzAsIDB4MWY2ZSwgMHgxZjZlLAorCTB4MWY2ZSwgMHgxZjZlLCAweDFmNmUsIDB4MWY3NSwgMHgxZjZlLCAweDFmNmUsIDB4MWY2ZSwgMHgxZjZlLAorCTB4MWY2ZSwgMHgxZjdhLCAweDFmNmUsIDB4MWY2ZSwgMHgxZjZlLCAweDFmNmUsIDB4MWY2ZSwgMHgxZjdmLAorCTB4MWY2ZSwgMHgxZjZlLCAweDFmNmUsIDB4MWY2ZSwgMHgxZjZlLCAweDFmODQsIDB4MDgwYywgMHgwZDdkLAorCTB4YTA3YywgMHg5NDIyLCAweGEwODAsIDB4OTMxYiwgMHgwMDk4LCAweGEwOTQsIDB4OTQyMiwgMHhhMDk4LAorCTB4OTMxYiwgMHgwMDcwLCAweGEwYWMsIDB4OTQyMiwgMHhhMGIwLCAweDkzMWIsIDB4MDA0OCwgMHhhMGM0LAorCTB4OTQyMiwgMHhhMGM4LCAweDkzMWIsIDB4MDAyMCwgMHhhMGRjLCAweDk0MjIsIDB4YTBlMCwgMHg5MzFiLAorCTB4MDYzMCwgMHgyMzAwLCAweDk0MDUsIDB4MDE2MCwgMHg4YTUxLCAweDA5MDQsIDB4MjBhYSwgMHg4YzYwLAorCTB4MDgwNCwgMHgxZWZhLCAweGEwMDQsIDB4OTA0NSwgMHgwOTA0LCAweDIwYWEsIDB4MDgwNCwgMHgxZWQ1LAorCTB4OGE1MSwgMHgwOTA0LCAweDIwYWEsIDB4OGM2MCwgMHgyYzA1LCAweDkwMDUsIDB4MTE1OCwgMHhhMDA0LAorCTB4OTA0NSwgMHgwOTA0LCAweDIwYWEsIDB4YTA2NCwgMHg5MGVjLCAweDAwMGYsIDB4OWRlMCwgMHgxZWFiLAorCTB4MmMwNSwgMHgyMDYwLCAweGE4ODAsIDB4YzBmYywgMHhhODgyLCAweDA4MDQsIDB4MjA5ZiwgMHgyYzA1LAorCTB4ODQyMiwgMHg4NDIwLCAweDgzMWEsIDB4OTM5OSwgMHgwMDAwLCAweGFjMmUsIDB4YWIzMiwgMHhkZDljLAorCTB4MTkwNCwgMHgyMDNjLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFmZDgsIDB4MWZkOCwgMHgxZmRhLAorCTB4MWZkOCwgMHgxZmQ4LCAweDFmZDgsIDB4MWZlOCwgMHgxZmQ4LCAweDFmZDgsIDB4MWZkOCwgMHgxZmY2LAorCTB4MWZkOCwgMHgxZmQ4LCAweDFmZDgsIDB4MjAwNCwgMHgxZmQ4LCAweDFmZDgsIDB4MWZkOCwgMHgyMDEyLAorCTB4MWZkOCwgMHgxZmQ4LCAweDFmZDgsIDB4MjAyMCwgMHgxZmQ4LCAweDFmZDgsIDB4MWZkOCwgMHgyMDJlLAorCTB4MDgwYywgMHgwZDdkLCAweGExN2MsIDB4MjQwMCwgMHg5MTIyLCAweGExODAsIDB4MjMwMCwgMHg5MTFiLAorCTB4MGEwYywgMHgwZDdkLCAweGEwNzQsIDB4OTQyMCwgMHhhMDc4LCAweDkzMTksIDB4MDgwNCwgMHgyMDlhLAorCTB4YTE4YywgMHgyNDAwLCAweDkxMjIsIDB4YTE5MCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZDdkLAorCTB4YTA4NCwgMHg5NDIwLCAweGEwODgsIDB4OTMxOSwgMHgwODA0LCAweDIwOWEsIDB4YTE5YywgMHgyNDAwLAorCTB4OTEyMiwgMHhhMWEwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkN2QsIDB4YTA5NCwgMHg5NDIwLAorCTB4YTA5OCwgMHg5MzE5LCAweDA4MDQsIDB4MjA5YSwgMHhhMWFjLCAweDI0MDAsIDB4OTEyMiwgMHhhMWIwLAorCTB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGQ3ZCwgMHhhMGE0LCAweDk0MjAsIDB4YTBhOCwgMHg5MzE5LAorCTB4MDgwNCwgMHgyMDlhLCAweGExYmMsIDB4MjQwMCwgMHg5MTIyLCAweGExYzAsIDB4MjMwMCwgMHg5MTFiLAorCTB4MGEwYywgMHgwZDdkLCAweGEwYjQsIDB4OTQyMCwgMHhhMGI4LCAweDkzMTksIDB4MDgwNCwgMHgyMDlhLAorCTB4YTFjYywgMHgyNDAwLCAweDkxMjIsIDB4YTFkMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZDdkLAorCTB4YTBjNCwgMHg5NDIwLCAweGEwYzgsIDB4OTMxOSwgMHgwODA0LCAweDIwOWEsIDB4YTFkYywgMHgyNDAwLAorCTB4OTEyMiwgMHhhMWUwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkN2QsIDB4YTBkNCwgMHg5NDIwLAorCTB4YTBkOCwgMHg5MzE5LCAweDA4MDQsIDB4MjA5YSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgyMDVhLAorCTB4MjA1OCwgMHgyMDU4LCAweDIwNTgsIDB4MjA1OCwgMHgyMDU4LCAweDIwNjcsIDB4MjA1OCwgMHgyMDU4LAorCTB4MjA1OCwgMHgyMDU4LCAweDIwNTgsIDB4MjA3NCwgMHgyMDU4LCAweDIwNTgsIDB4MjA1OCwgMHgyMDU4LAorCTB4MjA1OCwgMHgyMDgxLCAweDIwNTgsIDB4MjA1OCwgMHgyMDU4LCAweDIwNTgsIDB4MjA1OCwgMHgyMDhlLAorCTB4MDgwYywgMHgwZDdkLCAweGExN2MsIDB4MjQwMCwgMHg5MTIyLCAweGExODAsIDB4MjMwMCwgMHg5MTFiLAorCTB4MGEwYywgMHgwZDdkLCAweGEwNmMsIDB4OTQyMCwgMHhhMDcwLCAweDkzMTksIDB4MDQ5OCwgMHhhMTk0LAorCTB4MjQwMCwgMHg5MTIyLCAweGExOTgsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGQ3ZCwgMHhhMDg0LAorCTB4OTQyMCwgMHhhMDg4LCAweDkzMTksIDB4MDQzMCwgMHhhMWFjLCAweDI0MDAsIDB4OTEyMiwgMHhhMWIwLAorCTB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGQ3ZCwgMHhhMDljLCAweDk0MjAsIDB4YTBhMCwgMHg5MzE5LAorCTB4MDBjOCwgMHhhMWM0LCAweDI0MDAsIDB4OTEyMiwgMHhhMWM4LCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLAorCTB4MGQ3ZCwgMHhhMGI0LCAweDk0MjAsIDB4YTBiOCwgMHg5MzE5LCAweDAwNjAsIDB4YTFkYywgMHgyNDAwLAorCTB4OTEyMiwgMHhhMWUwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkN2QsIDB4YTBjYywgMHg5NDIwLAorCTB4YTBkMCwgMHg5MzE5LCAweGFjMWUsIDB4YWIyMiwgMHhhODgwLCAweGMwZmQsIDB4YTg4MiwgMHgyODAwLAorCTB4YTg1YSwgMHgyYzAwLCAweGE4MTIsIDB4MmEwMCwgMHhhODE2LCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLAorCTB4OTAwNiwgMHgwMDI4LCAweDAwOGUsIDB4MDBkZSwgMHgwMGNlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDBjNiwgMHg2MTBjLCAweDAwMTYsIDB4OTAyNiwgMHgyNDEwLCAweDYwMDQsIDB4OTQyMCwgMHg5MjkxLAorCTB4MDAwMCwgMHgyYzA0LCAweDkyMTAsIDB4OWNlMCwgMHgwMDAyLCAweDkxOGEsIDB4MDAwMiwgMHgxZGE4LAorCTB4OTI4NCwgMHgwMDBmLCAweDk0MDUsIDB4MDAxZSwgMHgwMGNlLCAweDAwMDUsIDB4NzgwMywgMHgwMDAzLAorCTB4NzgwZiwgMHgwMDAwLCAweDYwMDQsIDB4NzgxMiwgMHgyYzA0LCAweDc4MTYsIDB4OWNlMCwgMHgwMDAyLAorCTB4OTE4YSwgMHgwMDAyLCAweDFkYjgsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMGJjLAorCTB4MTkwYywgMHgwZDc2LCAweGQwOTQsIDB4MDExMCwgMHgwODBjLCAweDExZjYsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHgyNjAwLCAweDIwNzksIDB4MDIwMCwgMHgyMDcxLCAweDAyNjAsIDB4MjA2OSwgMHgxODAwLAorCTB4NzgxNywgMHgwMDAwLCAweDc4OWIsIDB4MDgxNCwgMHg3OGEzLCAweDA0MDYsIDB4Nzg5ZiwgMHgwNDEwLAorCTB4MjAwOSwgMHgwMTNiLCAweDIwMGIsIDB4MDQwMCwgMHg3ODFiLCAweDAwMDIsIDB4NzgzYiwgMHgwMDFmLAorCTB4NzgzNywgMHgwMDIwLCAweDc4MDMsIDB4MTYwMCwgMHgwMTJlLCAweDAwMDUsIDB4MjA5MSwgMHgyNjAwLAorCTB4NzgxYywgMHhkMGE0LCAweDE5MGMsIDB4MjIwNywgMHg3OTAwLCAweGQxZGMsIDB4MTExOCwgMHg5MDg0LAorCTB4MDAwNiwgMHgwMDFhLCAweDkwODQsIDB4MDAwZSwgMHgwMDAyLCAweDIxMjUsIDB4MjExZCwgMHg3ZjQ1LAorCTB4MjExZCwgMHgyMTFmLCAweDIxMWYsIDB4MjExZiwgMHgyMTFmLCAweDdmMmIsIDB4MjExZCwgMHgyMTIxLAorCTB4MjExZCwgMHgyMTFmLCAweDIxMWQsIDB4MjExZiwgMHgyMTFkLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDMxLAorCTB4MDAyMCwgMHgwODBjLCAweDdmMmIsIDB4MDgwYywgMHg3ZjQ1LCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwODBjLCAweGU4YTMsIDB4NzkzMCwgMHg5MTg0LCAweDAwMDMsIDB4MDUxMCwgMHgwODBjLAorCTB4YTkxZSwgMHgyMDAxLCAweDE5ZjksIDB4MjAwNCwgMHg5MDA1LCAweDAxYTAsIDB4MjAwMSwgMHgwMTMzLAorCTB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGQ3ZCwgMHgwMGM2LCAweDIwMDEsIDB4MTlmOSwgMHgyMDY0LAorCTB4MDgwYywgMHhhOTNhLCAweDA4MGMsIDB4YzU2NiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMjBhLAorCTB4MDBjZSwgMHgwNDA4LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIyMGEsIDB4MDgwYywgMHhhOTNhLAorCTB4MDBkMCwgMHg5MTg0LCAweDAwMTQsIDB4MDFhMCwgMHg2YTAwLCAweDkyODYsIDB4MDAwMywgMHgwMTYwLAorCTB4MDgwYywgMHg3NTNkLCAweDExMzgsIDB4MDgwYywgMHg3ODQwLCAweDA4MGMsIDB4NjA5MiwgMHgwODBjLAorCTB4NzQ2ZSwgMHgwMDEwLCAweDA4MGMsIDB4NWY0ZCwgMHgwODBjLCAweDdmZTMsIDB4MDA0MSwgMHgwMDE4LAorCTB4OTE4NCwgMHg5NTQwLCAweDFkYzgsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHgxYTZhLCAweDA4MGMsIDB4MWIxMCwgMHgwMDVlLAorCTB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MmUwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MTI4LCAweDIwMDEsIDB4MTk2ZSwgMHgyMTAyLCAweDIwMDEsIDB4MTk3NiwgMHgyMTAyLAorCTB4MjAwMSwgMHgwMTNiLCAweDIxMDIsIDB4MjA3OSwgMHgwMjAwLCAweDIwMDEsIDB4MDIwMSwgMHg3ODllLAorCTB4NzhhMywgMHgwMjAwLCAweDkxOTgsIDB4MDAwNywgMHg4MzFjLCAweDgzMWMsIDB4ODMxYywgMHg5Mzk4LAorCTB4MDAwNSwgMHgyMzIwLCAweDkxODIsIDB4MDIwNCwgMHgxMjMwLCAweDIwMTEsIDB4MDAwOCwgMHg4NDIzLAorCTB4ODQyMywgMHg4NDIzLCAweDA0ODgsIDB4OTE4MiwgMHgwMjRjLCAweDEyNDAsIDB4MjAxMSwgMHgwMDA3LAorCTB4ODQwMywgMHg4MDAzLCAweDk0MDAsIDB4OTQwMCwgMHg5NDIwLCAweDA0MzAsIDB4OTE4MiwgMHgwMmJjLAorCTB4MTIzOCwgMHgyMDExLCAweDAwMDYsIDB4ODQwMywgMHg4MDAzLCAweDk0MDAsIDB4OTQyMCwgMHgwMGUwLAorCTB4OTE4MiwgMHgwMzRjLCAweDEyMzAsIDB4MjAxMSwgMHgwMDA1LCAweDg0MDMsIDB4ODAwMywgMHg5NDIwLAorCTB4MDA5OCwgMHg5MTgyLCAweDA0MmMsIDB4MTIyOCwgMHgyMDExLCAweDAwMDQsIDB4ODQyMywgMHg4NDIzLAorCTB4MDA1OCwgMHg5MTgyLCAweDA1OWMsIDB4MTIyOCwgMHgyMDExLCAweDAwMDMsIDB4ODQwMywgMHg5NDIwLAorCTB4MDAxOCwgMHgyMDExLCAweDAwMDIsIDB4ODQyMywgMHg5NDgyLCAweDAyMjgsIDB4ODAwMiwgMHg4MDIwLAorCTB4ODMwMSwgMHg5NDAyLCAweDAxMTAsIDB4MDIwOCwgMHg4MzIxLCAweDgyMTcsIDB4ODIwMywgMHg5NDA1LAorCTB4Nzg5YSwgMHgwMTJlLCAweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODE0LAorCTB4OTA4NCwgMHhmZmMwLCAweDkxMGQsIDB4NjkxNiwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMjAwLCAweDkwMDUsIDB4NjgxMCwgMHgwMTEwLCAweGMwYTUsIDB4MDAwOCwgMHhjMGE0LAorCTB4NjgxMiwgMHgwMGRlLCAweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODEwLAorCTB4OTA4NCwgMHhmZmY4LCAweDkxMGQsIDB4NjkxMiwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHg3OTM4LAorCTB4MDgwYywgMHgwZDc2LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc5MDIsIDB4YTAwMSwgMHhhMDAxLAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHg3OTAyLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4MDBmZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYTY2LAorCTB4MDgwYywgMHgyOTdjLCAweDIwMDEsIDB4MTk5YywgMHgyMDAzLCAweDA3MDAsIDB4MjAwMSwgMHgxOTlkLAorCTB4MjAwMywgMHgwNzAwLCAweDA4MGMsIDB4MmFkNywgMHg5MDA2LCAweDA4MGMsIDB4MjlhYiwgMHg5MDA2LAorCTB4MDgwYywgMHgyOThlLCAweDIwYTksIDB4MDAxMiwgMHgxZDA0LCAweDIyM2MsIDB4MjA5MSwgMHg2MDAwLAorCTB4MWYwNCwgMHgyMjNjLCAweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjA1MCwgMHg5MDg1LAorCTB4MDQwMCwgMHg5MDg0LCAweGRmZmYsIDB4NjA1MiwgMHg2MjI0LCAweDA4MGMsIDB4MmFiNCwgMHgwODBjLAorCTB4MjY5YSwgMHgyMDA5LCAweDAwZWYsIDB4NjEzMiwgMHg2MTM2LCAweDA4MGMsIDB4MjZhYSwgMHg2MGU3LAorCTB4MDAwMCwgMHg2MWVhLCAweDYwZTMsIDB4MDAwOCwgMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDgwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDA3LCAweDM0OWYsIDB4MDBjNiwgMHgyMDYxLAorCTB4MDE0MCwgMHg2MDhiLCAweDAwMGIsIDB4NjA4ZiwgMHgxMGI4LCAweDYwOTMsIDB4MDAwMCwgMHg2MDk3LAorCTB4MDE5OCwgMHgwMGNlLCAweDYwMDQsIDB4OTA4NSwgMHg4MDAwLCAweDYwMDYsIDB4NjBiYiwgMHgwMDAwLAorCTB4MjBhOSwgMHgwMDE4LCAweDYwYmYsIDB4MDAwMCwgMHgxZjA0LCAweDIyN2EsIDB4NjBiYiwgMHgwMDAwLAorCTB4NjBiZiwgMHgwMTA4LCAweDYwYmYsIDB4MDAxMiwgMHg2MGJmLCAweDA0MDUsIDB4NjBiZiwgMHgwMDE0LAorCTB4NjBiZiwgMHgwMzIwLCAweDYwYmYsIDB4MDAxOCwgMHg2MDFiLCAweDAwZjAsIDB4NjAxZiwgMHgwMDFlLAorCTB4NjAwZiwgMHgwMDZiLCAweDYwMmIsIDB4NDAyYywgMHgwMTJlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDE0MCwgMHg3OGMzLCAweDAwODAsIDB4NzhjMywgMHgwMDgzLCAweDc4YzMsIDB4MDAwMCwgMHgwMGZlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE4MzUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MTgzNCwgMHgyMDAzLAorCTB4MDAwMSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4NjEyNCwgMHg2MDI4LCAweDkxMGMsIDB4MDA2NiwgMHgyMDMxLCAweDE4MzcsIDB4MjYzNCwgMHg5NmI0LAorCTB4MDAyOCwgMHgwMDZlLCAweDExMzgsIDB4NjAyMCwgMHhkMWJjLCAweDAxMjAsIDB4ZDBiYywgMHgxMTY4LAorCTB4ZDBiNCwgMHgxMTk4LCAweDkxODQsIDB4NWUyYywgMHgxMTE4LCAweDkxODQsIDB4MDAwNywgMHgwMGFhLAorCTB4OTE5NSwgMHgwMDA0LCAweDkyODQsIDB4MDAwNywgMHgwMDgyLCAweDAwMTYsIDB4MjAwMSwgMHgwMzg3LAorCTB4MjAwYywgMHhkMWE0LCAweDAwMWUsIDB4MGQ3MCwgMHgwYzk4LCAweDAwMTYsIDB4MjAwMSwgMHgwMzg3LAorCTB4MjAwYywgMHhkMWI0LCAweDAwMWUsIDB4MGQzMCwgMHgwYzU4LCAweDIyZTgsIDB4MjJlNSwgMHgyMmU1LAorCTB4MjJlNSwgMHgyMmU3LCAweDIyZTUsIDB4MjJlNSwgMHgyMmU1LCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDI5LAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAwYTYsIDB4NjEyNCwgMHg2MDI4LAorCTB4ZDA5YywgMHgwMTE4LCAweGQxOWMsIDB4MTkwNCwgMHgyNTYyLCAweGQxZjQsIDB4MTkwYywgMHgwZDc2LAorCTB4MDgwYywgMHg3NTNkLCAweDA5MDQsIDB4MjM0NSwgMHgwODBjLCAweGQwOWIsIDB4MTEyMCwgMHg3MDAwLAorCTB4OTA4NiwgMHgwMDAzLCAweDA1ODAsIDB4NjAyNCwgMHg5MDg0LCAweDE4MDAsIDB4MDU2MCwgMHgwODBjLAorCTB4NzU2MCwgMHgwMTE4LCAweDA4MGMsIDB4NzU0ZSwgMHgxNTMwLCAweDIwMTEsIDB4MDAyMCwgMHgwODBjLAorCTB4MmFiNCwgMHg2MDQzLCAweDAwMDAsIDB4MDgwYywgMHhkMDliLCAweDAxNjgsIDB4MDgwYywgMHg3NTYwLAorCTB4MTE1MCwgMHgyMDAxLCAweDE5YTYsIDB4MjAwMywgMHgwMDAxLCAweDYwMjcsIDB4MTgwMCwgMHgwODBjLAorCTB4NzNiMywgMHgwODA0LCAweDI1NjUsIDB4NzBhNCwgMHg5MDA1LCAweDExNTAsIDB4NzBhNywgMHgwMDAxLAorCTB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg3NTk0LCAweDAwZGUsIDB4MTkwNCwgMHgyNTY1LAorCTB4MDgwYywgMHg3ODRhLCAweDA0MjgsIDB4MDgwYywgMHg3NTYwLCAweDE1OTAsIDB4NjAyNCwgMHg5MDg0LAorCTB4MTgwMCwgMHgxMTA4LCAweDA0NjgsIDB4MDgwYywgMHg3ODRhLCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLAorCTB4NjA5MiwgMHgwODBjLCAweDc0NmUsIDB4MDgwNCwgMHgyNTYyLCAweGQxYWMsIDB4MTUwOCwgMHg2MDI0LAorCTB4ZDBkYywgMHgxMTcwLCAweGQwZTQsIDB4MTE3OCwgMHhkMGQ0LCAweDExOTAsIDB4ZDBjYywgMHgwMTMwLAorCTB4NzA5OCwgMHg5MDg2LCAweDAwMjgsIDB4MTExMCwgMHgwODBjLCAweDc3MjEsIDB4MDgwNCwgMHgyNTYyLAorCTB4MDgwYywgMHg3ODQ1LCAweDAwNDgsIDB4MjAwMSwgMHgxOTdjLCAweDIwMDMsIDB4MDAwMiwgMHgwMDIwLAorCTB4MDgwYywgMHg3NjdlLCAweDA4MDQsIDB4MjU2MiwgMHgwODBjLCAweDc3YzQsIDB4MDgwNCwgMHgyNTYyLAorCTB4NjIyMCwgMHhkMWJjLCAweDAxMzgsIDB4ZDJiYywgMHgxOTA0LCAweDI1Y2IsIDB4ZDJiNCwgMHgxOTA0LAorCTB4MjVkZCwgMHgwMDAwLCAweGQxYWMsIDB4MDkwNCwgMHgyNDZmLCAweDAwMzYsIDB4NjMyOCwgMHhjM2JjLAorCTB4NjMyYSwgMHgwMDNlLCAweDA4MGMsIDB4NzUzZCwgMHgxMWQwLCAweDIwMTEsIDB4MDAyMCwgMHgwODBjLAorCTB4MmFiNCwgMHgwMDA2LCAweDAwMjYsIDB4MDAzNiwgMHgwODBjLCAweDc1NTcsIDB4MTE1OCwgMHgwODBjLAorCTB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4MDgwYywgMHg3NDZlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDBlLAorCTB4MDBhZSwgMHgwMDA1LCAweDAwM2UsIDB4MDAyZSwgMHgwMDBlLCAweDA4MGMsIDB4NzUxMSwgMHgwMDE2LAorCTB4MDA0NiwgMHgwMGM2LCAweDY0NGMsIDB4OTQ4NiwgMHhmMGYwLCAweDExMzgsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjQ0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDc0ZGEsIDB4OTQ4YywgMHhmZjAwLAorCTB4NzAzOCwgMHhkMDg0LCAweDAxNzgsIDB4OTE4NiwgMHhmODAwLCAweDExNjAsIDB4NzA0OCwgMHhkMDg0LAorCTB4MTE0OCwgMHhjMDg1LCAweDcwNGEsIDB4MDAzNiwgMHgyNDE4LCAweDIwMTEsIDB4ODAxNiwgMHgwODBjLAorCTB4NGI1MiwgMHgwMDNlLCAweDA4MGMsIDB4ZDA5NCwgMHgxOTA0LCAweDI0NDYsIDB4OTE5NiwgMHhmZjAwLAorCTB4MDVhOCwgMHg3MDYwLCAweDkwODQsIDB4MDBmZiwgMHg4MTBmLCAweDgxZmYsIDB4MDExMCwgMHg5MTE2LAorCTB4MDU2OCwgMHg3MTMwLCAweGQxODQsIDB4MTU1MCwgMHgwODBjLCAweDMzYWQsIDB4MDEyOCwgMHhjMThkLAorCTB4NzEzMiwgMHgwODBjLCAweDZhZDUsIDB4MTUxMCwgMHg2MjQwLCAweDkyOTQsIDB4MDAxMCwgMHgwMTMwLAorCTB4NjI0OCwgMHg5Mjk0LCAweGZmMDAsIDB4OTI5NiwgMHhmZjAwLCAweDAxYzAsIDB4NzAzMCwgMHhkMDhjLAorCTB4MDkwNCwgMHgyNDQ2LCAweDcwMzgsIDB4ZDA4YywgMHgxMTQwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLAorCTB4ZDFhYywgMHgxOTA0LCAweDI0NDYsIDB4YzFhZCwgMHgyMTAyLCAweDAwMzYsIDB4NzNkOCwgMHgyMDExLAorCTB4ODAxMywgMHgwODBjLCAweDRiNTIsIDB4MDAzZSwgMHgwODA0LCAweDI0NDYsIDB4NzAzOCwgMHhkMDhjLAorCTB4MTE0MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhkMWFjLCAweDE5MDQsIDB4MjQ0NiwgMHhjMWFkLAorCTB4MjEwMiwgMHgwMDM2LCAweDczZDgsIDB4MjAxMSwgMHg4MDEzLCAweDA4MGMsIDB4NGI1MiwgMHgwMDNlLAorCTB4NzEzMCwgMHhjMTg1LCAweDcxMzIsIDB4MjAxMSwgMHgxODQ4LCAweDIyMGMsIDB4ZDFhNCwgMHgwMWYwLAorCTB4MDAxNiwgMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsIDB4ODk3OSwgMHgyMDE5LAorCTB4MDAwZSwgMHgwMGM2LCAweDIwNjEsIDB4MDAwMCwgMHgwODBjLCAweGUzYjUsIDB4MDBjZSwgMHg5NDg0LAorCTB4MDBmZiwgMHg5MDgwLCAweDMzYjksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMTIwLAorCTB4OTAwNiwgMHgyMDA5LCAweDAwMGUsIDB4MDgwYywgMHhlNDQ1LCAweDAwMWUsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHgzMjA1LCAweDAwMWUsIDB4MDA3OCwgMHgwMTU2LAorCTB4MDBiNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwODBjLCAweDY2OTMsIDB4MTExMCwgMHgwODBjLAorCTB4NjBhYywgMHg4MTA4LCAweDFmMDQsIDB4MjQzYywgMHgwMGJlLCAweDAxNWUsIDB4MDBjZSwgMHgwMDRlLAorCTB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YWJlOSwgMHgwODBjLCAweGE5M2EsIDB4NjBlMywgMHgwMDAwLAorCTB4MDAxZSwgMHgyMDAxLCAweDE4MDAsIDB4MjAxNCwgMHg5Mjk2LCAweDAwMDQsIDB4MTE3MCwgMHhkMTljLAorCTB4MTFiMCwgMHgyMDExLCAweDE4MGMsIDB4MjIxNCwgMHhkMjljLCAweDExMjAsIDB4NjIwNCwgMHg5Mjk1LAorCTB4MDAwMiwgMHg2MjA2LCAweDYyMjgsIDB4YzI5ZCwgMHg2MjJhLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLAorCTB4MTgyNiwgMHgyMDAzLCAweDAwMDAsIDB4MjAxMSwgMHgwMDIwLCAweDA4MGMsIDB4MmFiNCwgMHhkMTk0LAorCTB4MDkwNCwgMHgyNTYyLCAweDAwMTYsIDB4MDgwYywgMHhhOTFlLCAweDYyMjAsIDB4ZDJiNCwgMHgwOTA0LAorCTB4MjRmZCwgMHgwODBjLCAweDg3ODAsIDB4MDgwYywgMHg5ZWQ0LCAweDIwMTEsIDB4MDAwNCwgMHgwODBjLAorCTB4MmFiNCwgMHgwMGY2LCAweDIwMTksIDB4MTlmMiwgMHgyMzA0LCAweDkwN2QsIDB4MDkwNCwgMHgyNGNhLAorCTB4NzgwNCwgMHg5MDg2LCAweDAwMzIsIDB4MTVmMCwgMHgwMGQ2LCAweDAwYzYsIDB4MDBlNiwgMHgwMDk2LAorCTB4MjA2OSwgMHgwMTQwLCAweDc4MmMsIDB4Njg1ZSwgMHg3ODA4LCAweDY4NWEsIDB4NjA0MywgMHgwMDAyLAorCTB4MjAwMSwgMHgwMDAzLCAweDgwMDEsIDB4MWRmMCwgMHg2MDQzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDNjLAorCTB4ODAwMSwgMHgxZGYwLCAweDA4MGMsIDB4MmE4YSwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMSwgMHgwMjQwLAorCTB4MjBhOSwgMHgwMDA5LCAweDA4MGMsIDB4MmE0MSwgMHg2OTA0LCAweGQxZGMsIDB4MTE0MCwgMHgwY2IwLAorCTB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHgwODBjLAorCTB4OTY3YSwgMHgwODBjLCAweGE5M2EsIDB4NzgxNCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHgyZjYwLAorCTB4MDgwYywgMHhhY2IwLCAweDAwOWUsIDB4MDBlZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBmZSwgMHgwMDFlLAorCTB4MDBhZSwgMHgwMDA1LCAweDAwZmUsIDB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHg5MDg0LAorCTB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmE4YSwgMHgwMGRlLCAweDAwYzYsIDB4MjA2MSwgMHgxOWU2LAorCTB4NjAzNCwgMHgwODBjLCAweGQwOWIsIDB4MDEyMCwgMHg5MDlhLCAweDAwMDMsIDB4MTI1OCwgMHgwMDE4LAorCTB4OTA5YSwgMHgwMGM4LCAweDEyMzgsIDB4ODAwMCwgMHg2MDM2LCAweDAwY2UsIDB4MDgwYywgMHg5ZWFjLAorCTB4MDgwNCwgMHgyNTVmLCAweDIwNjEsIDB4MDEwMCwgMHg2MmMwLCAweDA4MGMsIDB4YTg0ZiwgMHgyMDE5LAorCTB4MTlmMiwgMHgyMzA0LCAweDkwNjUsIDB4MDEzMCwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHgwMDI3LAorCTB4MDgwYywgMHhhZDRkLCAweDAwY2UsIDB4MDgwNCwgMHgyNTVmLCAweGQyYmMsIDB4MDkwNCwgMHgyNTQyLAorCTB4MDgwYywgMHg4NzhkLCAweDIwMTEsIDB4MDAwNCwgMHgwODBjLCAweDJhYjQsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2ODA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmE4YSwgMHgwMGRlLAorCTB4MDBjNiwgMHgyMDYxLCAweDE5ZTYsIDB4NjA1MCwgMHgwODBjLCAweGQwOWIsIDB4MDEyMCwgMHg5MDlhLAorCTB4MDAwMywgMHgxNjY4LCAweDAwMTgsIDB4OTA5YSwgMHgwMGM4LCAweDE2NDgsIDB4ODAwMCwgMHg2MDUyLAorCTB4NjA0YywgMHgwMGNlLCAweDkwMDUsIDB4MDVkOCwgMHgyMDA5LCAweDA3ZDAsIDB4MDgwYywgMHg4Nzg1LAorCTB4OTA4MCwgMHgwMDA4LCAweDIwMDQsIDB4OTA4NiwgMHgwMDA2LCAweDExMzgsIDB4MjAwOSwgMHgxOTg0LAorCTB4MjAxMSwgMHgwMDEyLCAweDA4MGMsIDB4MmFjMywgMHgwNDUwLCAweDkwODAsIDB4MDAwOCwgMHgyMDA0LAorCTB4OTA4NiwgMHgwMDA5LCAweDBkOTgsIDB4MjAwOSwgMHgxOTg0LCAweDIwMTEsIDB4MDAxNiwgMHgwODBjLAorCTB4MmFjMywgMHgwMGU4LCAweDIwMTEsIDB4MDAwNCwgMHgwODBjLCAweDJhYjQsIDB4MDBjMCwgMHgwMDM2LAorCTB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTFiOCwgMHgwMDNlLCAweDIwMTksIDB4MTlmOSwgMHgyMzA0LAorCTB4OTA2NSwgMHgwMTYwLCAweDIwMDksIDB4MDA0ZiwgMHg2MDIwLCAweDkwODYsIDB4MDAwOSwgMHgxMTEwLAorCTB4MjAwOSwgMHgwMDRmLCAweDYwMDMsIDB4MDAwMywgMHgwODBjLCAweGFkNGQsIDB4MDBjZSwgMHgwODBjLAorCTB4YTkzYSwgMHgwMDFlLCAweGQxOWMsIDB4MDkwNCwgMHgyNWM0LCAweDcwMzgsIDB4ZDBhYywgMHgxNTU4LAorCTB4MDAxNiwgMHgwMTU2LCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDJhYjQsIDB4MDgwYywgMHgyYWQ3LAorCTB4MDgwYywgMHgyYjBhLCAweDYwNTAsIDB4YzBlNSwgMHg2MDUyLCAweDIwYTksIDB4MDM2NywgMHgxZjA0LAorCTB4MjU5MSwgMHgxZDA0LCAweDI1NzksIDB4MDgwYywgMHg4N2I0LCAweDYwMjAsIDB4ZDA5YywgMHgxZGI4LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHgyOWVkLCAweDAwZmUsIDB4MWQ4MCwgMHg2MDUwLAorCTB4YzBlNCwgMHg2MDUyLCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDJhYjQsIDB4MDE1ZSwgMHgwMDFlLAorCTB4MDQ5OCwgMHgwMTVlLCAweDAwMWUsIDB4MDAxNiwgMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgwODBjLAorCTB4YTkxZSwgMHgwODBjLCAweGFiZTksIDB4MDgwYywgMHhhOTNhLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLAorCTB4ZTg4MiwgMHgwODBjLCAweGU4OWQsIDB4MDgwYywgMHg1NzQyLCAweGQwZmMsIDB4MTEzOCwgMHgwODBjLAorCTB4ZDA5NCwgMHgxMTIwLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDc1ODQsIDB4OTAwNiwgMHgwODBjLAorCTB4MmE3YSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHgyYTY2LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4NzAwMywgMHgwMDA0LCAweDA4MGMsIDB4MGVjMSwgMHgwMGVlLCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLAorCTB4MmFiNCwgMHgwODBjLCAweDBiYzMsIDB4MDAxZSwgMHg5MThjLCAweGZmZDAsIDB4MjExMCwgMHgwODBjLAorCTB4MmFiNCwgMHgwMGFlLCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLCAweDAzODcsIDB4MjAwYywgMHhkMWE0LAorCTB4MDAxZSwgMHgwOTA0LCAweDIzNzIsIDB4MDAxNiwgMHgyMDA5LCAweDI1ZDcsIDB4MDBjMCwgMHgyMDAxLAorCTB4MDM4NywgMHgyMDAzLCAweDEwMDAsIDB4MDAxZSwgMHgwYzM4LCAweDAwMTYsIDB4MjAwMSwgMHgwMzg3LAorCTB4MjAwYywgMHhkMWI0LCAweDAwMWUsIDB4MDkwNCwgMHgyMzcyLCAweDAwMTYsIDB4MjAwOSwgMHgyNWU5LAorCTB4MDAzMCwgMHgyMDAxLCAweDAzODcsIDB4MjAwMywgMHg0MDAwLCAweDAwMWUsIDB4MDhhOCwgMHg2MDI4LAorCTB4YzBiYywgMHg2MDJhLCAweDIwMDEsIDB4MDE1NiwgMHgyMDAzLCAweGJjOTEsIDB4ODAwMCwgMHgyMDAzLAorCTB4ZmZmZiwgMHg2MDQzLCAweDAwMDEsIDB4MDgwYywgMHgyYTYwLCAweDIwMTEsIDB4MDA4MCwgMHgwODBjLAorCTB4MmFiNCwgMHg2MDE3LCAweDAwMDAsIDB4NjA0MywgMHgwMDAwLCAweDA4MTcsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MWQwLCAweDcwZDIsIDB4OTExNiwgMHgwOTA0LCAweDI2NTksIDB4ODFmZiwgMHgwMWEwLAorCTB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmE2NiwgMHgyMDExLCAweDgwMTEsIDB4MjAxOSwgMHgwMTBlLAorCTB4MjMxYywgMHg5MzllLCAweDAwMDcsIDB4MTExOCwgMHgyMDE5LCAweDAwMDEsIDB4MDAxMCwgMHgyMDE5LAorCTB4MDAwMCwgMHgwODBjLCAweDRiNTIsIDB4MDQ2OCwgMHgyMDAxLCAweDE5YTcsIDB4MjAwYywgMHg4MWZmLAorCTB4MTE0MCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMGI0LCAweDAxMTgsIDB4MjAxOSwgMHgwMDAzLAorCTB4MDAwOCwgMHgyMTE4LCAweDIwMTEsIDB4ODAxMiwgMHgwODBjLCAweDRiNTIsIDB4MDgwYywgMHgwZWMxLAorCTB4MDgwYywgMHg1NzQyLCAweGQwZmMsIDB4MTFhOCwgMHgwODBjLCAweGQwOTQsIDB4MTE5MCwgMHgwMGM2LAorCTB4MDgwYywgMHgyNmY1LCAweDA4MGMsIDB4YTkxZSwgMHgwODBjLCAweGExMTMsIDB4MDgwYywgMHhhOTNhLAorCTB4MjA2MSwgMHgwMTAwLCAweDIwMTksIDB4MDAyOCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHgzMjA1LAorCTB4MDBjZSwgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgyMDI4LCAweDkxOGMsIDB4MDBmZiwgMHgyMTMwLCAweDkwOTQsIDB4ZmYwMCwgMHgxMWYwLAorCTB4MjAxMSwgMHgxODM3LCAweDIyMTQsIDB4ZDJhYywgMHgxMWM4LCAweDgxZmYsIDB4MDFlOCwgMHgyMDExLAorCTB4MTgxZiwgMHgyMjA0LCAweDkxMDYsIDB4MTE5MCwgMHgyMDExLCAweDE4MjAsIDB4MjIxNCwgMHg5Mjk0LAorCTB4ZmYwMCwgMHg5NTg0LCAweGZmMDAsIDB4OTIwNiwgMHgxMTQ4LCAweDIwMTEsIDB4MTgyMCwgMHgyMjE0LAorCTB4OTI5NCwgMHgwMGZmLCAweDk1ODQsIDB4MDBmZiwgMHg5MjA2LCAweDExMjAsIDB4MjUwMCwgMHgwODBjLAorCTB4ODI1NiwgMHgwMDQ4LCAweDk1ODQsIDB4MDBmZiwgMHg5MDgwLCAweDMzYjksIDB4MjAwZCwgMHg5MThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDkwMDYsIDB4MDAwNSwgMHg5MDgwLCAweDMzYjksIDB4MjAwZCwgMHg5MThjLAorCTB4MDBmZiwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4MTgxOCwgMHgyMDAzLAorCTB4MDBlZiwgMHgyMGE5LCAweDAwMTAsIDB4OTAwNiwgMHg2ODUyLCAweDY4NTYsIDB4MWYwNCwgMHgyNmE1LAorCTB4MDBkZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHgwMDI2LCAweDIwNjksIDB4MDE0MCwgMHgyMDAxLAorCTB4MTgxOCwgMHgyMTAyLCAweDgxMTQsIDB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4MjBhOSwgMHgwMDEwLAorCTB4Njg1MywgMHgwMDAwLCAweDkwMDYsIDB4ODJmZiwgMHgxMTI4LCAweDkxODQsIDB4MDAwZiwgMHg5MDgwLAorCTB4ZThiMSwgMHgyMDA1LCAweDY4NTYsIDB4ODIxMSwgMHgxZjA0LCAweDI2YmEsIDB4MDAyZSwgMHgwMGRlLAorCTB4MDAwZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHgxODAwLCAweDYwMzAsIDB4MDExMCwgMHhjMDlkLAorCTB4MDAwOCwgMHhjMDljLCAweDYwMzIsIDB4MDBjZSwgMHgwMDA1LCAweDAxNTYsIDB4MDBkNiwgMHgwMDI2LAorCTB4MDAxNiwgMHgwMDA2LCAweDIwNjksIDB4MDE0MCwgMHg2OTgwLCAweDkxMTYsIDB4MDE4MCwgMHg5MTEyLAorCTB4MTIzMCwgMHg4MjEyLCAweDgyMTAsIDB4MjJhOCwgMHgyMDAxLCAweDA0MDIsIDB4MDAxOCwgMHgyMmE4LAorCTB4MjAwMSwgMHgwNDA0LCAweDY4MGUsIDB4MWYwNCwgMHgyNmVhLCAweDY4MGYsIDB4MDAwMCwgMHgwMDBlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwZGUsIDB4MDE1ZSwgMHgwMDA1LCAweDA4MGMsIDB4NTczZSwgMHhkMGM0LAorCTB4MDE1MCwgMHhkMGE0LCAweDAxNDAsIDB4OTAwNiwgMHgwMDQ2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJlLAorCTB4MDgwYywgMHhlNDQ1LCAweDAwNGUsIDB4MDAwNSwgMHgwMGY2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDc5LAorCTB4MDE0MCwgMHg3OGM0LCAweGQwZGMsIDB4MDkwNCwgMHgyNzYxLCAweDA4MGMsIDB4MjlkZCwgMHgwNjYwLAorCTB4OTA4NCwgMHgwNzAwLCAweDkwOGUsIDB4MDYwMCwgMHgxMTIwLCAweDIwMTEsIDB4NDAwMCwgMHg5MDBlLAorCTB4MDQ1OCwgMHg5MDhlLCAweDA1MDAsIDB4MTEyMCwgMHgyMDExLCAweDgwMDAsIDB4OTAwZSwgMHgwNDIwLAorCTB4OTA4ZSwgMHgwNDAwLCAweDExMjAsIDB4OTAxNiwgMHgyMDA5LCAweDAwMDEsIDB4MDBlOCwgMHg5MDhlLAorCTB4MDMwMCwgMHgxMTIwLCAweDkwMTYsIDB4MjAwOSwgMHgwMDAyLCAweDAwYjAsIDB4OTA4ZSwgMHgwMjAwLAorCTB4MTEyMCwgMHg5MDE2LCAweDIwMDksIDB4MDAwNCwgMHgwMDc4LCAweDkwOGUsIDB4MDEwMCwgMHgxNTQ4LAorCTB4OTAxNiwgMHgyMDA5LCAweDAwMDgsIDB4MDA0MCwgMHg5MDg0LCAweDA3MDAsIDB4OTA4ZSwgMHgwMzAwLAorCTB4MTUwMCwgMHgyMDExLCAweDAwMzAsIDB4MDA1OCwgMHgyMzAwLCAweDkwODAsIDB4MDAyMCwgMHgyMDE4LAorCTB4MDgwYywgMHg5MWY4LCAweDkyOGMsIDB4ZmYwMCwgMHgwMTEwLCAweDIwMTEsIDB4MDBmZiwgMHgyMjAwLAorCTB4ODAwNywgMHg5MDg1LCAweDAwNGMsIDB4NzhjMiwgMHgyMDA5LCAweDAxMzgsIDB4MjIwYSwgMHgwODBjLAorCTB4NzUzZCwgMHgxMTE4LCAweDIwMDksIDB4MTk2YywgMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg3OGMzLCAweDAwMDAsIDB4MGNjOCwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDI2LCAweDIwMDEsIDB4MDE3MCwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHg5MTg0LAorCTB4MDAwMywgMHgwMTEwLCAweDA4MGMsIDB4MGQ3NiwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgyMDAxLCAweDAxNzEsIDB4MjAwNCwgMHhkMGRjLCAweDAxNjgsIDB4MjAwMSwgMHgwMTcwLAorCTB4MjAwYywgMHg5MThjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDRjLCAweDExMjgsIDB4MjAwYywgMHg5MThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDAwMDUsIDB4OTAwZSwgMHgyMDAxLCAweDAyMjcsIDB4MjAwNCwgMHg4MDA3LAorCTB4OTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4OTEwOCwgMHgyMDAxLCAweDAyMjYsIDB4MjAwNCwgMHg4MDA3LAorCTB4OTA4NCwgMHgwMGZmLCAweDgwMDQsIDB4OTEwOCwgMHgwMDA1LCAweDAwMTgsIDB4MDAwYywgMHgwMDE4LAorCTB4MDAyMCwgMHgxMDAwLCAweDA4MDAsIDB4MTAwMCwgMHgxODAwLCAweDAxNTYsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMGU2LCAweDIwMDEsIDB4MTk4ZiwgMHgyMDA0LCAweDkwOGEsIDB4MDAwNywgMHgxYTBjLAorCTB4MGQ3ZCwgMHgwMDMzLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MjdiZiwgMHgyN2RkLCAweDI4MDEsIDB4MjgwMywgMHgyODJjLCAweDI4MmUsIDB4MjgzMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDI2MDYsIDB4MDgwYywgMHgyYTJiLCAweDIwMDEsIDB4MTk5MSwgMHgyMDAzLAorCTB4MDAwMCwgMHg3ODI4LCAweDkwODQsIDB4ZTFkNywgMHg3ODJhLCAweDkwMDYsIDB4MjBhOSwgMHgwMDA5LAorCTB4MDgwYywgMHgyOWY5LCAweDIwMDEsIDB4MTk4ZiwgMHgyMDAzLCAweDAwMDYsIDB4MjAwOSwgMHgwMDFlLAorCTB4MjAxMSwgMHgyODMxLCAweDA4MGMsIDB4ODc5MiwgMHgwMDA1LCAweDIwMDksIDB4MTk5NCwgMHgyMDBiLAorCTB4MDAwMCwgMHgyMDAxLCAweDE5OTksIDB4MjAwMywgMHgwMDM2LCAweDIwMDEsIDB4MTk5OCwgMHgyMDAzLAorCTB4MDAyYSwgMHgyMDAxLCAweDE5OTEsIDB4MjAwMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHgyOThlLAorCTB4MjAwMSwgMHhmZmZmLCAweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDI5ZjksIDB4MjAwMSwgMHgxOThmLAorCTB4MjAwMywgMHgwMDA2LCAweDIwMDksIDB4MDAxZSwgMHgyMDExLCAweDI4MzEsIDB4MDgwYywgMHg4NzkyLAorCTB4MDAwNSwgMHgwODBjLCAweDBkN2QsIDB4MjAwMSwgMHgxOTk5LCAweDIwMDMsIDB4MDAzNiwgMHgyMDAxLAorCTB4MTk5MSwgMHgyMDAzLCAweDAwMDMsIDB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsIDB4OTI5NiwgMHgwMDA0LAorCTB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4Mjk4ZSwgMHgyMDAxLAorCTB4MTk5NSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHhmZmZmLCAweDIwYTksIDB4MDAwOSwgMHgwODBjLAorCTB4MjlmOSwgMHgyMDAxLCAweDE5OGYsIDB4MjAwMywgMHgwMDA2LCAweDIwMDksIDB4MDAxZSwgMHgyMDExLAorCTB4MjgzMSwgMHgwODBjLCAweDg3OTIsIDB4MDAwNSwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHgwZDdkLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDAwZjYsIDB4MDE1NiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweDE5OTEsIDB4MjAwNCwgMHg5MDhhLAorCTB4MDAwNywgMHgxYTBjLCAweDBkN2QsIDB4MDA0MywgMHgwMTJlLCAweDAxNWUsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgyODUzLCAweDI4NzMsIDB4MjhiMywgMHgyOGUzLAorCTB4MjkwNywgMHgyOTE3LCAweDI5MTksIDB4MDgwYywgMHgyOWVkLCAweDExYjAsIDB4Nzg1MCwgMHg5MDg0LAorCTB4ZWZmZiwgMHg3ODUyLCAweDIwMDksIDB4MTk5NywgMHgyMTA0LCAweDdhMzgsIDB4OTI5NCwgMHgwMDA1LAorCTB4OTI5NiwgMHgwMDA0LCAweDAxMTAsIDB4YzA4ZCwgMHgwMDA4LCAweGMwODUsIDB4MjAwYSwgMHgyMDAxLAorCTB4MTk4ZiwgMHgyMDAzLCAweDAwMDEsIDB4MDAzMCwgMHgwODBjLCAweDI5M2QsIDB4MjAwMSwgMHhmZmZmLAorCTB4MDgwYywgMHgyN2NlLCAweDAwMDUsIDB4MDgwYywgMHgyOTFiLCAweDA1ZTAsIDB4MjAwOSwgMHgxOTk4LAorCTB4MjEwNCwgMHg4MDAxLCAweDIwMGEsIDB4MDgwYywgMHgyOWVkLCAweDExNzgsIDB4Nzg1MCwgMHg5MDg0LAorCTB4ZWZmZiwgMHg3ODUyLCAweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwgMHgwNTE4LAorCTB4MjAwOSwgMHgxOTk3LCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDIwMDksIDB4MTk5NCwgMHgyMTA0LAorCTB4ODAwMCwgMHgyMDBhLCAweDkwODYsIDB4MDAwNSwgMHgwMTE4LCAweDA4MGMsIDB4MjkyMywgMHgwMGMwLAorCTB4MjAwYiwgMHgwMDAwLCAweDdhMzgsIDB4OTI5NCwgMHgwMDA2LCAweDkyOTYsIDB4MDAwNCwgMHgwMTEwLAorCTB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI5YWIsIDB4MjAwMSwgMHgxOTkxLAorCTB4MjAwMywgMHgwMDAyLCAweDAwMjgsIDB4MjAwMSwgMHgxOThmLCAweDIwMDMsIDB4MDAwMywgMHgwMDEwLAorCTB4MDgwYywgMHgyN2YwLCAweDAwMDUsIDB4MDgwYywgMHgyOTFiLCAweDA1NjAsIDB4MjAwOSwgMHgxOTk4LAorCTB4MjEwNCwgMHg4MDAxLCAweDIwMGEsIDB4MDgwYywgMHgyOWVkLCAweDExNjgsIDB4Nzg1MCwgMHg5MDg0LAorCTB4ZWZmZiwgMHg3ODUyLCAweDIwMDEsIDB4MTk4ZiwgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgxOTkwLAorCTB4MjAwMywgMHgwMDAwLCAweDAwYjgsIDB4MjAwOSwgMHgxOTk4LCAweDIxMDQsIDB4OTAwNSwgMHgxMTE4LAorCTB4MDgwYywgMHgyOTYwLCAweDAwMTAsIDB4MDgwYywgMHgyOTMwLCAweDA4MGMsIDB4MjkyMywgMHgyMDA5LAorCTB4MTk5NCwgMHgyMDBiLCAweDAwMDAsIDB4MjAwMSwgMHgxOTkxLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4MjdmMCwgMHgwMDAwLCAweDAwMDUsIDB4MDRiOSwgMHgwNTA4LCAweDA4MGMsIDB4MjllZCwgMHgxMWI4LAorCTB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgyMDA5LCAweDE5OTUsIDB4MjEwNCwgMHg4MDAwLAorCTB4MjAwYSwgMHg5MDg2LCAweDAwMDcsIDB4MDEwOCwgMHgwMDc4LCAweDIwMDEsIDB4MTk5YSwgMHgyMDAzLAorCTB4MDAwYSwgMHgyMDA5LCAweDE5OTcsIDB4MjEwNCwgMHhjMGZkLCAweDIwMGEsIDB4MDAzOCwgMHgwNDE5LAorCTB4MjAwMSwgMHgxOTkxLCAweDIwMDMsIDB4MDAwNCwgMHgwODBjLCAweDI4MWIsIDB4MDAwNSwgMHgwMDk5LAorCTB4MDE2OCwgMHgwODBjLCAweDI5ZWQsIDB4MTEzOCwgMHg3ODUwLCAweDkwODQsIDB4ZWZmZiwgMHg3ODUyLAorCTB4MDgwYywgMHgyODA3LCAweDAwMTgsIDB4MDA3OSwgMHgwODBjLCAweDI4MWIsIDB4MDAwNSwgMHgwODBjLAorCTB4MGQ3ZCwgMHgwODBjLCAweDBkN2QsIDB4MjAwOSwgMHgxOTk5LCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLAorCTB4MDkwYywgMHgyOTdjLCAweDAwMDUsIDB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsIDB4OTI5NiwgMHgwMDA1LAorCTB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjlhYiwgMHgwMDA1LAorCTB4N2EzOCwgMHg5Mjk0LCAweDAwMDYsIDB4OTI5NiwgMHgwMDA2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4Mjk4ZSwgMHgwMDA1LCAweDIwMDksIDB4MTk5NCwgMHgyMTA0LAorCTB4ODAwMCwgMHgyMDBhLCAweDkwODYsIDB4MDAwNSwgMHgwMTA4LCAweDAwNjgsIDB4MjAwYiwgMHgwMDAwLAorCTB4N2EzOCwgMHg5Mjk0LCAweDAwMDYsIDB4OTI5NiwgMHgwMDA2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLAorCTB4MjAwMSwgMHgwMDAxLCAweDA0ZDksIDB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsIDB4OTI5NiwgMHgwMDA1LAorCTB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjlhYiwgMHgwMDA1LAorCTB4MDA4NiwgMHgyMDAxLCAweDE5OTcsIDB4MjAwNCwgMHg5MDg0LCAweDdmZmYsIDB4MDkwYywgMHgwZDdkLAorCTB4MjAwOSwgMHgxOTk2LCAweDIxNDQsIDB4ODg0NiwgMHgyODBhLCAweDk4NDQsIDB4MGRkOCwgMHhkMDhjLAorCTB4MTEyMCwgMHhkMDg0LCAweDExMjAsIDB4MDgwYywgMHgwZDdkLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwMGExLCAweDAwOGUsIDB4MDAwNSwgMHgwMDA2LCAweDAxNTYsIDB4MjAwMSwgMHgxOThmLAorCTB4MjBhOSwgMHgwMDA5LCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDFmMDQsIDB4Mjk4MiwgMHgyMDAxLAorCTB4MTk5NiwgMHgyMDAzLCAweDgwMDAsIDB4MDE1ZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDEwMCwgMHg5MDg1LCAweDAwMDAsIDB4MDE1OCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmOSwgMHg5MDg1LAorCTB4MDAwNCwgMHg3ODNhLCAweDIwMDksIDB4MTk5YywgMHgyMTBjLCAweDc5NWEsIDB4MDA1MCwgMHg3ODM4LAorCTB4OTA4NCwgMHhmZmZiLCAweDkwODUsIDB4MDAwNiwgMHg3ODNhLCAweDIwMDksIDB4MTk5ZCwgMHgyMTBjLAorCTB4Nzk1YSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4OTA4NSwgMHgwMDAwLAorCTB4MDE1OCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmYSwgMHg5MDg1LCAweDAwMDQsIDB4NzgzYSwgMHg3ODUwLAorCTB4OTA4NCwgMHhmZmYwLCAweDc4NTIsIDB4MDBmOCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmYiwgMHg5MDg1LAorCTB4MDAwNSwgMHg3ODNhLCAweDc4NTAsIDB4OTA4NCwgMHhmZmYwLCAweDAwMTYsIDB4MjAwOSwgMHgwMTdmLAorCTB4MjEwYywgMHg5MThlLCAweDAwMDUsIDB4MDE0MCwgMHgyMDA5LCAweDAwMDMsIDB4MjEwYywgMHg5MThjLAorCTB4MDYwMCwgMHg5MThlLCAweDA0MDAsIDB4MDExOCwgMHg5MDg1LCAweDAwMGEsIDB4MDAxMCwgMHg5MDg1LAorCTB4MDAwMCwgMHgwMDFlLCAweDc4NTIsIDB4MDBmZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLAorCTB4MjAwNCwgMHg5MDgyLCAweDAwMDcsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLAorCTB4MjAwNCwgMHg5MDgyLCAweDAwMDksIDB4MDAwZSwgMHgwMDA1LCAweDAxNTYsIDB4MjBhOSwgMHgwMDY0LAorCTB4NzgyMCwgMHgwODBjLCAweDJhNjAsIDB4ZDA5YywgMHgxMTEwLCAweDFmMDQsIDB4MjlmMCwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMTI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgyYWQ3LAorCTB4MDgwYywgMHgyYjBhLCAweDAwMGUsIDB4MjAwOCwgMHg5MTg2LCAweDAwMDAsIDB4MTExOCwgMHg3ODNiLAorCTB4MDAwNywgMHgwMDkwLCAweDkxODYsIDB4MDAwMSwgMHgxMTE4LCAweDc4M2IsIDB4MDAwNiwgMHgwMDYwLAorCTB4OTE4NiwgMHgwMDAyLCAweDExMTgsIDB4NzgzYiwgMHgwMDA1LCAweDAwMzAsIDB4OTE4NiwgMHgwMDAzLAorCTB4MTExOCwgMHg3ODNiLCAweDAwMDQsIDB4MDAwMCwgMHgwMDA2LCAweDFkMDQsIDB4MmExZCwgMHgwODBjLAorCTB4ODdiNCwgMHgxZjA0LCAweDJhMWQsIDB4Nzg1MCwgMHg5MDg1LCAweDEwMDAsIDB4Nzg1MiwgMHgwMDBlLAorCTB4MDAxZSwgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHgyYjBhLCAweDAwMDUsIDB4MDAwNiwgMHgwMTU2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MjBhOSwgMHgwMDBhLCAweDc4NTQsIDB4ZDBhYywgMHgxMTAwLAorCTB4Nzg1NCwgMHhkMDhjLCAweDExMTAsIDB4MWYwNCwgMHgyYTM4LCAweDAwZmUsIDB4MDE1ZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgxZDA0LCAweDJhNDEsIDB4MDgwYywgMHg4N2I0LCAweDFmMDQsIDB4MmE0MSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE5OWIsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE5OWIsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE5OWIsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MDAwZSwgMHgwMDA1LAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4MTlhNywgMHgyMTAyLCAweDAwMGUsIDB4MDAwNSwgMHgyMDA5LCAweDAxNzEsIDB4MjEwNCwgMHhkMGRjLAorCTB4MDE0MCwgMHgyMDA5LCAweDAxNzAsIDB4MjEwNCwgMHgyMDBiLCAweDAwODAsIDB4YTAwMSwgMHhhMDAxLAorCTB4MjAwYSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDc1NTcsIDB4MDEwOCwgMHhjMGJjLAorCTB4MjAwOSwgMHgwMTQwLCAweDIxMTQsIDB4OTI5NCwgMHgwMDAxLCAweDkyMTUsIDB4MjIwYSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgyMDA5LCAweDAxNDAsIDB4MjExNCwgMHg5Mjk0LAorCTB4MDAwMSwgMHg5Mjg1LCAweDEwMDAsIDB4MjAwYSwgMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MDE0MCwgMHgyMTE0LCAweDkyOTQsIDB4MDAwMSwgMHg5MjE1LAorCTB4MjIwYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MjAwOSwgMHgwMTQwLAorCTB4MjEwNCwgMHgxMTI4LCAweDA4MGMsIDB4NzU1NywgMHgwMTEwLCAweGMwYmMsIDB4MDAwOCwgMHhjMGJkLAorCTB4MjAwYSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksIDB4MDM4MCwgMHg3ODQzLAorCTB4MDEwMSwgMHg3ODQ0LCAweGQwODQsIDB4MWRlOCwgMHgyMDAxLCAweDAxMDksIDB4MjIwMiwgMHg3ODQzLAorCTB4MDEwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzODAsIDB4Nzg0MywgMHgwMjAyLAorCTB4Nzg0NCwgMHhkMDhjLCAweDFkZTgsIDB4MjA3OSwgMHgwMTAwLCAweDc4MTQsIDB4OTEwNCwgMHg5MjA1LAorCTB4N2ExNiwgMHgyMDc5LCAweDAzODAsIDB4Nzg0MywgMHgwMjAwLCAweDAwZmUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDYwNTAsIDB4OTA4NCwgMHhmYmZmLAorCTB4OTA4NSwgMHgwMDQwLCAweDYwNTIsIDB4MjBhOSwgMHgwMDAyLCAweDA4MGMsIDB4MmE0MSwgMHg2MDUwLAorCTB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZmY5ZiwgMHg2MDUyLCAweDIwYTksIDB4MDAwNSwgMHgwODBjLAorCTB4MmE0MSwgMHg2MDU0LCAweGQwYmMsIDB4MDkwYywgMHgwZDdkLCAweDIwYTksIDB4MDAwNSwgMHgwODBjLAorCTB4MmE0MSwgMHg2MDU0LCAweGQwYWMsIDB4MDkwYywgMHgwZDdkLCAweDIwMDksIDB4MTlhZSwgMHg5MDg0LAorCTB4N2UwMCwgMHg4MDA3LCAweDgwMDQsIDB4ODAwNCwgMHgyMDBhLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjA1MCwgMHhjMGNkLAorCTB4NjA1MiwgMHgwMGNlLCAweDAwMGUsIDB4MDAwNSwgMHgzMDEwLCAweDMwMTAsIDB4MmMxNCwgMHgyYzE0LAorCTB4MmMyMCwgMHgyYzIwLCAweDJjMmMsIDB4MmMyYywgMHgyYzNhLCAweDJjM2EsIDB4MmM0NiwgMHgyYzQ2LAorCTB4MmM1NCwgMHgyYzU0LCAweDJjNjIsIDB4MmM2MiwgMHgyYzc0LCAweDJjNzQsIDB4MmM4MCwgMHgyYzgwLAorCTB4MmM4ZSwgMHgyYzhlLCAweDJjYWMsIDB4MmNhYywgMHgyY2NjLCAweDJjY2MsIDB4MmM5YywgMHgyYzljLAorCTB4MmNiYywgMHgyY2JjLCAweDJjZGEsIDB4MmNkYSwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyY2VjLCAweDJjZWMsIDB4MmNmOCwgMHgyY2Y4LAorCTB4MmQwNiwgMHgyZDA2LCAweDJkMTQsIDB4MmQxNCwgMHgyZDI0LCAweDJkMjQsIDB4MmQzMiwgMHgyZDMyLAorCTB4MmQ0MiwgMHgyZDQyLCAweDJkNTIsIDB4MmQ1MiwgMHgyZDY0LCAweDJkNjQsIDB4MmQ3MiwgMHgyZDcyLAorCTB4MmQ4MiwgMHgyZDgyLCAweDJkYTQsIDB4MmRhNCwgMHgyZGM4LCAweDJkYzgsIDB4MmQ5MiwgMHgyZDkyLAorCTB4MmRiNiwgMHgyZGI2LCAweDJkZDgsIDB4MmRkOCwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyZGVjLCAweDJkZWMsIDB4MmRmOCwgMHgyZGY4LAorCTB4MmUwNiwgMHgyZTA2LCAweDJlMTQsIDB4MmUxNCwgMHgyZTI0LCAweDJlMjQsIDB4MmUzMiwgMHgyZTMyLAorCTB4MmU0MiwgMHgyZTQyLCAweDJlNTIsIDB4MmU1MiwgMHgyZTY0LCAweDJlNjQsIDB4MmU3MiwgMHgyZTcyLAorCTB4MmU4MiwgMHgyZTgyLCAweDJlOTIsIDB4MmU5MiwgMHgyZWE0LCAweDJlYTQsIDB4MmViNCwgMHgyZWI0LAorCTB4MmVjNiwgMHgyZWM2LCAweDJlZDgsIDB4MmVkOCwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyZWVjLCAweDJlZWMsIDB4MmVmYSwgMHgyZWZhLAorCTB4MmYwYSwgMHgyZjBhLCAweDJmMWEsIDB4MmYxYSwgMHgyZjJjLCAweDJmMmMsIDB4MmYzYywgMHgyZjNjLAorCTB4MmY0ZSwgMHgyZjRlLCAweDJmNjAsIDB4MmY2MCwgMHgyZjc0LCAweDJmNzQsIDB4MmY4NCwgMHgyZjg0LAorCTB4MmY5NiwgMHgyZjk2LCAweDJmYTgsIDB4MmZhOCwgMHgyZmJjLCAweDJmYmMsIDB4MmZjZCwgMHgyZmNkLAorCTB4MmZlMCwgMHgyZmUwLCAweDJmZjMsIDB4MmZmMywgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgyYzcyLAorCTB4MmM3MiwgMHgyYzcyLCAweDJjNzIsIDB4MmM3MiwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIyYWEsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyMGQ0LCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweGEwMDEsIDB4MGNmMCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDEzYmIsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LAorCTB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDEzYmIsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjJhYSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LAorCTB4MDgwYywgMHgyMGQ0LCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHgyMGQ0LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LAorCTB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MjJhYSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LAorCTB4MDgwYywgMHhhOTg0LCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMGZlLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgxM2JiLCAweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMGQ0LAorCTB4MDgwYywgMHhhOTg0LCAweDA4MGMsIDB4MTNiYiwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwNCwgMHgzMDA4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLCAweDIwZDQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MjBmZSwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LAorCTB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDIwZmUsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgyMGZlLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgyMmFhLCAweDA4MGMsIDB4MTNiYiwgMHgwODA0LCAweDMwMDgsIDB4MDEwNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LAorCTB4MDgwYywgMHgyMGQ0LCAweDA4MGMsIDB4YTk4NCwgMHgwODBjLCAweDEzYmIsIDB4MDgwNCwgMHgzMDA4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweGE5ODQsIDB4MDgwYywgMHgyMmFhLAorCTB4MDgwYywgMHgxM2JiLCAweDA4MDQsIDB4MzAwOCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LAorCTB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLCAweDI3NjQsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgxM2JiLCAweDA4MGMsIDB4MjBmZSwgMHgwNGQ4LCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjc2NCwgMHgwODBjLAorCTB4YTk4NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLCAweDA4MGMsIDB4MjBmZSwgMHgwNDQwLAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLCAweDEzYmIsIDB4MDgwYywgMHhhOTg0LAorCTB4MDgwYywgMHgyMGZlLCAweDAwYTgsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyNzY0LCAweDA4MGMsIDB4MjBkNCwgMHgwODBjLAorCTB4YTk4NCwgMHgwODBjLCAweDIyYWEsIDB4MDgwYywgMHgxM2JiLCAweDA4MGMsIDB4MjBmZSwgMHgwMDAwLAorCTB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxMmUsIDB4MDAwZSwgMHgwMTBlLAorCTB4MDAwZCwgMHgwMGI2LCAweDAwYzYsIDB4MDAyNiwgMHgwMDQ2LCAweDkwMjYsIDB4MDgwYywgMHg2YTliLAorCTB4MTkwNCwgMHgzMTIxLCAweDcyZGMsIDB4MjAwMSwgMHgxOTdiLCAweDIwMDQsIDB4OTAwNSwgMHgxMTEwLAorCTB4ZDI5YywgMHgwMTQ4LCAweGQyODQsIDB4MTEzOCwgMHhkMmJjLCAweDE5MDQsIDB4MzEyMSwgMHgwODBjLAorCTB4MzEyNiwgMHgwODA0LCAweDMxMjEsIDB4ZDJjYywgMHgxOTA0LCAweDMxMjEsIDB4MDgwYywgMHg3NTNkLAorCTB4MTEyMCwgMHg3MGFmLCAweGZmZmYsIDB4MDgwNCwgMHgzMTIxLCAweGQyOTQsIDB4MDEyMCwgMHg3MGFmLAorCTB4ZmZmZiwgMHgwODA0LCAweDMxMjEsIDB4MDgwYywgMHgzM2E4LCAweDAxNjAsIDB4MDgwYywgMHhkMDliLAorCTB4MDEyOCwgMHgyMDAxLCAweDE4MTgsIDB4MjAzYywgMHgwODA0LCAweDMwYWUsIDB4NzBhZiwgMHhmZmZmLAorCTB4MDgwNCwgMHgzMTIxLCAweDIwMDEsIDB4MTgxOCwgMHgyMDNjLCAweDcyOTQsIDB4ZDI4NCwgMHgwOTA0LAorCTB4MzBhZSwgMHhkMjhjLCAweDE5MDQsIDB4MzBhZSwgMHgwMDM2LCAweDczYWMsIDB4OTM4ZSwgMHhmZmZmLAorCTB4MTExMCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHg5MmUwLCAweDFkODAsIDB4MmMwNCwgMHg5MzhjLAorCTB4MDAwMSwgMHgwMTIwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDAwMTAsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTcwZSwgMHgwNWQwLCAweDkwOGUsIDB4MDAwMCwgMHgwNWI4LCAweDkwOGUsIDB4MDBmZiwgMHgxMTUwLAorCTB4NzIzMCwgMHhkMjg0LCAweDE1YjAsIDB4NzI5NCwgMHhjMjhkLCAweDcyOTYsIDB4NzBhZiwgMHhmZmZmLAorCTB4MDAzZSwgMHgwNGEwLCAweDkwMGUsIDB4MDgwYywgMHgyNjYxLCAweDA4MGMsIDB4NjYzMiwgMHgxNTM4LAorCTB4OTAwNiwgMHhiOGJiLCAweDA1MjAsIDB4YjhhYywgMHg5MDA1LCAweDAxNDgsIDB4MDBjNiwgMHgyMDYwLAorCTB4MDgwYywgMHg4YzFmLCAweDAwY2UsIDB4MDkwYywgMHg4ZmJjLCAweGI4YWYsIDB4MDAwMCwgMHgwODBjLAorCTB4NmFkZCwgMHgxMTY4LCAweDcwMzAsIDB4ZDA4YywgMHgwMTMwLCAweGI4MDAsIDB4ZDBiYywgMHgwMTM4LAorCTB4MDgwYywgMHg2OTg2LCAweDAxMjAsIDB4MDgwYywgMHgzMTNmLCAweDAxNDgsIDB4MDAyOCwgMHgwODBjLAorCTB4MzI4YiwgMHgwODBjLCAweDMxNmIsIDB4MDExOCwgMHg4MzE4LCAweDA4MDQsIDB4MzA1YiwgMHg3M2FlLAorCTB4MDAxMCwgMHg3MGFmLCAweGZmZmYsIDB4MDAzZSwgMHgwODA0LCAweDMxMjEsIDB4OTc4MCwgMHgzM2I5LAorCTB4MjAzZCwgMHg5N2JjLCAweGZmMDAsIDB4ODczZiwgMHgyMDQxLCAweDAwN2UsIDB4NzBhYywgMHg5MDk2LAorCTB4ZmZmZiwgMHgxMTE4LCAweDkwMGUsIDB4MjhhOCwgMHgwMDUwLCAweDk4MTIsIDB4MDIyMCwgMHgyMDA4LAorCTB4OTgwMiwgMHgyMGE4LCAweDAwMjAsIDB4NzBhZiwgMHhmZmZmLCAweDA4MDQsIDB4MzEyMSwgMHgyNzAwLAorCTB4MDE1NiwgMHgwMDE2LCAweDkxMDYsIDB4MDkwNCwgMHgzMTE2LCAweGM0ODQsIDB4MDgwYywgMHg2NjkzLAorCTB4MDE0OCwgMHgwODBjLCAweGQwOWIsIDB4MTkwNCwgMHgzMTE2LCAweDA4MGMsIDB4NjYzMiwgMHgxOTA0LAorCTB4MzExZSwgMHgwMDA4LCAweGM0ODUsIDB4YjhiYiwgMHgwNTIwLCAweGI4YWMsIDB4OTAwNSwgMHgwMTQ4LAorCTB4MDBjNiwgMHgyMDYwLCAweDA4MGMsIDB4OGMxZiwgMHgwMGNlLCAweDA5MGMsIDB4OGZiYywgMHhiOGFmLAorCTB4MDAwMCwgMHgwODBjLCAweDZhZGQsIDB4MTEzMCwgMHg3MDMwLCAweGQwOGMsIDB4MDFmOCwgMHhiODAwLAorCTB4ZDBiYywgMHgxMWUwLCAweDcyOTQsIDB4ZDI4YywgMHgwMTgwLCAweDA4MGMsIDB4NmFkZCwgMHg5MDgyLAorCTB4MDAwNiwgMHgwMmUwLCAweGQ0ODQsIDB4MTExOCwgMHgwODBjLCAweDY2NTcsIDB4MDAyOCwgMHgwODBjLAorCTB4MzMxZSwgMHgwMWEwLCAweDA4MGMsIDB4MzM0OSwgMHgwMDg4LCAweDA4MGMsIDB4MzI4YiwgMHgwODBjLAorCTB4ZDA5YiwgMHgxMTYwLCAweDA4MGMsIDB4MzE2YiwgMHgwMTg4LCAweDAwNDAsIDB4MDgwYywgMHhkMDliLAorCTB4MTExOCwgMHgwODBjLCAweDMzMWUsIDB4MDExMCwgMHgwNDUxLCAweDAxNDAsIDB4MDAxZSwgMHg4MTA4LAorCTB4MDE1ZSwgMHgxZjA0LCAweDMwYzcsIDB4NzBhZiwgMHhmZmZmLCAweDAwMTgsIDB4MDAxZSwgMHgwMTVlLAorCTB4NzFhZSwgMHgwMDRlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBjNiwgMHgwMDE2LAorCTB4NzBhZiwgMHgwMDAxLCAweDIwMDksIDB4MDA3ZSwgMHgwODBjLCAweDY2MzIsIDB4MTE2OCwgMHhiODEzLAorCTB4MDBmZiwgMHhiODE3LCAweGZmZmUsIDB4MDgwYywgMHgzMjhiLCAweDA0YTksIDB4MDEyOCwgMHg3MGRjLAorCTB4YzBiZCwgMHg3MGRlLCAweDA4MGMsIDB4Y2RlOCwgMHgwMDFlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MjAwMSwgMHgxODRjLCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4Yjg0MiwgMHgwODBjLCAweGFkMjAsIDB4MDFkMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhjZTE1LAorCTB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLAorCTB4NjVlMywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGE4LCAweDgwMDAsIDB4NzBhYSwgMHgwMTJlLAorCTB4MjAwOSwgMHgwMDA0LCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwgMHgyMDAxLAorCTB4MTg0YywgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwgMHhiODQyLCAweDA4MGMsIDB4YWQyMCwgMHgwNTQ4LAorCTB4MmIwMCwgMHg2MDEyLCAweGI4MDAsIDB4YzBjNCwgMHhiODAyLCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLAorCTB4MDE0MCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MTExMCwgMHgwODBjLAorCTB4MzI0MCwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlMywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGE4LAorCTB4ODAwMCwgMHg3MGFhLCAweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LAorCTB4MDAyNiwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg2NjMyLCAweDExNDAsIDB4YjgxMywgMHgwMGZmLAorCTB4YjgxNywgMHhmZmZjLCAweDAwMzksIDB4MDExMCwgMHg3MGUzLCAweGZmZmYsIDB4MDAyZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywgMHhhYzVhLAorCTB4MDFkMCwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwgMHg5MDA2LAorCTB4MDgwYywgMHg2NWNmLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MGU0LCAweDgwMDAsIDB4NzBlNiwgMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLAorCTB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLAorCTB4NjYzMiwgMHgxMWI4LCAweGI4MTMsIDB4MDBmZiwgMHhiODE3LCAweGZmZmQsIDB4YjhkNywgMHgwMDA0LAorCTB4MDgwYywgMHhhYzVhLCAweDAxNzAsIDB4MmIwMCwgMHg2MDEyLCAweDYzMTYsIDB4NjAyMywgMHgwMDAxLAorCTB4NjIwYSwgMHgwODBjLCAweGNlMTUsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LAorCTB4MDAzNiwgMHgwMDI2LCAweDAwYjYsIDB4MjFmMCwgMHgwODBjLCAweGE5MWUsIDB4MDEwNiwgMHgwODBjLAorCTB4OTQ0OCwgMHgwODBjLCAweDkzYjksIDB4MDgwYywgMHhhODZmLCAweDA4MGMsIDB4YmJmOSwgMHgwMTBlLAorCTB4MDkwYywgMHhhOTNhLCAweDNlMDgsIDB4MjEzMCwgMHg4MWZmLCAweDAxMjAsIDB4MjBhOSwgMHgwMDdlLAorCTB4OTAwZSwgMHgwMDE4LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2NjkzLAorCTB4MTE0MCwgMHg5Njg2LCAweDAwMDIsIDB4MTExOCwgMHhiODAwLCAweGQwYmMsIDB4MTExMCwgMHgwODBjLAorCTB4NjBhYywgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHgzMjI1LCAweDk2ODYsIDB4MDAwMSwgMHgxOTBjLAorCTB4MzM3YywgMHgwMGJlLCAweDAwMmUsIDB4MDAzZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMGM2LCAweDAwNDYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDBiNiwgMHgwODBjLAorCTB4YTkxZSwgMHgwMTA2LCAweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHg5NDNkLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4OTMwNiwgMHgyYzA4LAorCTB4MDgwYywgMHhlMTY3LCAweDAwN2UsIDB4MDAxZSwgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwgMHhiYTEwLAorCTB4YmIxNCwgMHhiYzg0LCAweDA4MGMsIDB4NjBhYywgMHhiYTEyLCAweGJiMTYsIDB4YmM4NiwgMHgwMGJlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwM2UsIDB4MDA0ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDAwNiwgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4OTA4NiwgMHgwMDgwLAorCTB4MDE1MCwgMHgyMDcxLCAweDE4MDAsIDB4NzBhOCwgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwgMHg3MGFhLAorCTB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDcwZTQsIDB4OTAwNSwgMHgwZGMwLAorCTB4ODAwMSwgMHg3MGU2LCAweDBjYTgsIDB4YjgwMCwgMHhjMDhjLCAweGI4MDIsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGM2LCAweDAwYjYsIDB4MDA0NiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTU2LAorCTB4MjE3OCwgMHgwODBjLCAweGE5MWUsIDB4MDEwNiwgMHg4MWZmLCAweDExMTgsIDB4MjBhOSwgMHgwMDAxLAorCTB4MDA3OCwgMHgwODBjLCAweDU3M2UsIDB4ZDBjNCwgMHgwMTQwLCAweGQwYTQsIDB4MDEzMCwgMHg5MDA2LAorCTB4MjAyMCwgMHgyMDA5LCAweDAwMmQsIDB4MDgwYywgMHhlNDQ1LCAweDIwYTksIDB4MDgwMCwgMHg5MDE2LAorCTB4MDAyNiwgMHg5MjhlLCAweDAwN2UsIDB4MDkwNCwgMHgzMmZhLCAweDkyOGUsIDB4MDA3ZiwgMHgwOTA0LAorCTB4MzJmYSwgMHg5MjhlLCAweDAwODAsIDB4MDVmMCwgMHg5Mjg4LCAweDEwMDAsIDB4MjEwYywgMHg4MWZmLAorCTB4MDVjOCwgMHg4ZmZmLCAweDExNTAsIDB4MjAwMSwgMHgxOThkLCAweDAwMDYsIDB4MjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHgzMzBiLCAweDAwMGUsIDB4MjAwMywgMHgwMDAwLCAweDAwYjYsIDB4MDBjNiwgMHgyMTU4LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NmFhNywgMHgwMGNlLCAweDAwYmUsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHg5NDNkLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4OTMwNiwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMDI2LCAweDIxNTgsIDB4YmEwNCwgMHg5Mjk0LCAweDAwZmYsIDB4OTI4NiwgMHgwMDA2LAorCTB4MTExOCwgMHhiODA3LCAweDA0MDQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMDQsIDB4ODAwNywgMHg5MjE1LAorCTB4YmEwNiwgMHgwMDJlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDE2LCAweDJjMDgsIDB4MDgwYywgMHhlMTY3LAorCTB4MDAxZSwgMHgwMDdlLCAweDAwMmUsIDB4ODIxMCwgMHgxZjA0LCAweDMyYjAsIDB4MDEwZSwgMHgwOTBjLAorCTB4YTkzYSwgMHgwMTVlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDBiZSwgMHgwMGNlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA0NiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywgMHg1NzNlLAorCTB4ZDBjNCwgMHgwMTQwLCAweGQwYTQsIDB4MDEzMCwgMHg5MDA2LCAweDIyMjAsIDB4MjAwOSwgMHgwMDI5LAorCTB4MDgwYywgMHhlNDQ1LCAweDAwMWUsIDB4MDAyZSwgMHgwMDRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMGM2LCAweDcyOTQsIDB4ODJmZiwgMHgwMWU4LCAweDA4MGMsIDB4NmFkNSwgMHgxMWQwLAorCTB4MjEwMCwgMHgwODBjLCAweDI2OTQsIDB4ODFmZiwgMHgwMWI4LCAweDIwMTksIDB4MDAwMSwgMHg4MzE0LAorCTB4OTJlMCwgMHgxZDgwLCAweDJjMDQsIDB4ZDM4NCwgMHgwMTIwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4MDAxMCwgMHg5MDg0LCAweDAwZmYsIDB4OTExNiwgMHgwMTM4LCAweDkwOTYsIDB4MDBmZiwgMHgwMTEwLAorCTB4ODMxOCwgMHgwYzY4LCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhOTFlLAorCTB4MDEwNiwgMHgwMDM2LCAweDIwMTksIDB4MDAyOSwgMHgwMGMxLCAweDAwM2UsIDB4MDEwZSwgMHgwOTBjLAorCTB4YTkzYSwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDY1LCAweDAxNTgsIDB4MDAxNiwgMHgwMGM2LAorCTB4MjA2MSwgMHgxYjM0LCAweDAwMWUsIDB4NjExMiwgMHgwODBjLCAweDMyNDAsIDB4MDAxZSwgMHgwODBjLAorCTB4NjY1NywgMHgwMTJlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgyMTEwLAorCTB4MDgwYywgMHhhNDA0LCAweDA4MGMsIDB4ZTdhYywgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTgzNywgMHgyMDA0LCAweGQwY2MsIDB4MDAwNSwgMHgwMGM2LCAweDAwYjYsIDB4MDgwYywgMHg3NTNkLAorCTB4MTExOCwgMHgyMGE5LCAweDA4MDAsIDB4MDAxMCwgMHgyMGE5LCAweDA3ODIsIDB4MDgwYywgMHg3NTNkLAorCTB4MTExMCwgMHg5MDBlLCAweDAwMTAsIDB4MjAwOSwgMHgwMDdlLCAweDkxODAsIDB4MTAwMCwgMHgyMDA0LAorCTB4OTA1ZCwgMHgwMTMwLCAweDg2ZmYsIDB4MDExMCwgMHhiODAwLCAweGQwYmMsIDB4MDkwYywgMHg2NjU3LAorCTB4ODEwOCwgMHgxZjA0LCAweDMzOGQsIDB4MjA2MSwgMHgxODAwLCAweDYwN2YsIDB4MDAwMCwgMHg2MDgwLAorCTB4OTA4NCwgMHgwMGZmLCAweDYwODIsIDB4NjBiMywgMHgwMDAwLCAweDAwYmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxODY5LCAweDIwMDQsIDB4ZDBiYywgMHgwMDA1LCAweDIwMTEsIDB4MTg0OCwgMHgyMjE0LAorCTB4ZDJlYywgMHgwMDA1LCAweDAwMjYsIDB4MjAxMSwgMHgxODY3LCAweDIyMTQsIDB4ZDJkYywgMHgwMDJlLAorCTB4MDAwNSwgMHg3ZWVmLCAweDdkZTgsIDB4N2NlNCwgMHg4MGUyLCAweDdiZTEsIDB4ODBlMCwgMHg4MGRjLAorCTB4ODBkYSwgMHg3YWQ5LCAweDgwZDYsIDB4ODBkNSwgMHg4MGQ0LCAweDgwZDMsIDB4ODBkMiwgMHg4MGQxLAorCTB4NzljZSwgMHg3OGNkLCAweDgwY2MsIDB4ODBjYiwgMHg4MGNhLCAweDgwYzksIDB4ODBjNywgMHg4MGM2LAorCTB4NzdjNSwgMHg3NmMzLCAweDgwYmMsIDB4ODBiYSwgMHg3NWI5LCAweDgwYjYsIDB4NzRiNSwgMHg3M2I0LAorCTB4NzJiMywgMHg4MGIyLCAweDgwYjEsIDB4ODBhZSwgMHg3MWFkLCAweDgwYWMsIDB4NzBhYiwgMHg2ZmFhLAorCTB4NmVhOSwgMHg4MGE3LCAweDZkYTYsIDB4NmNhNSwgMHg2YmEzLCAweDZhOWYsIDB4Njk5ZSwgMHg2ODlkLAorCTB4ODA5YiwgMHg4MDk4LCAweDY3OTcsIDB4NjY5MCwgMHg2NThmLCAweDY0ODgsIDB4NjM4NCwgMHg2MjgyLAorCTB4ODA4MSwgMHg4MDgwLCAweDYxN2MsIDB4NjA3YSwgMHg4MDc5LCAweDVmNzYsIDB4ODA3NSwgMHg4MDc0LAorCTB4ODA3MywgMHg4MDcyLCAweDgwNzEsIDB4ODA2ZSwgMHg1ZTZkLCAweDgwNmMsIDB4NWQ2YiwgMHg1YzZhLAorCTB4NWI2OSwgMHg4MDY3LCAweDVhNjYsIDB4NTk2NSwgMHg1ODYzLCAweDU3NWMsIDB4NTY1YSwgMHg1NTU5LAorCTB4ODA1NiwgMHg4MDU1LCAweDU0NTQsIDB4NTM1MywgMHg1MjUyLCAweDUxNTEsIDB4NTA0ZSwgMHg0ZjRkLAorCTB4ODA0YywgMHg4MDRiLCAweDRlNGEsIDB4NGQ0OSwgMHg4MDQ3LCAweDRjNDYsIDB4ODA0NSwgMHg4MDQzLAorCTB4ODAzYywgMHg4MDNhLCAweDgwMzksIDB4ODAzNiwgMHg0YjM1LCAweDgwMzQsIDB4NGEzMywgMHg0OTMyLAorCTB4NDgzMSwgMHg4MDJlLCAweDQ3MmQsIDB4NDYyYywgMHg0NTJiLCAweDQ0MmEsIDB4NDMyOSwgMHg0MjI3LAorCTB4ODAyNiwgMHg4MDI1LCAweDQxMjMsIDB4NDAxZiwgMHgzZjFlLCAweDNlMWQsIDB4M2QxYiwgMHgzYzE4LAorCTB4ODAxNywgMHg4MDEwLCAweDNiMGYsIDB4M2EwOCwgMHg4MDA0LCAweDM5MDIsIDB4ODAwMSwgMHg4MDAwLAorCTB4ODAwMCwgMHgzODAwLCAweDM3MDAsIDB4MzYwMCwgMHg4MDAwLCAweDM1MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgzNDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MzMwMCwgMHgzMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MzEwMCwgMHgzMDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyZjAwLCAweDgwMDAsIDB4MmUwMCwgMHgyZDAwLAorCTB4MmMwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyYjAwLCAweDgwMDAsIDB4MmEwMCwgMHgyOTAwLAorCTB4MjgwMCwgMHg4MDAwLCAweDI3MDAsIDB4MjYwMCwgMHgyNTAwLCAweDI0MDAsIDB4MjMwMCwgMHgyMjAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDIxMDAsIDB4MjAwMCwgMHgxZjAwLCAweDFlMDAsIDB4MWQwMCwgMHgxYzAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDFiMDAsIDB4MWEwMCwgMHg4MDAwLCAweDE5MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgxODAwLCAweDgwMDAsIDB4MTcwMCwgMHgxNjAwLAorCTB4MTUwMCwgMHg4MDAwLCAweDE0MDAsIDB4MTMwMCwgMHgxMjAwLCAweDExMDAsIDB4MTAwMCwgMHgwZjAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDBlMDAsIDB4MGQwMCwgMHgwYzAwLCAweDBiMDAsIDB4MGEwMCwgMHgwOTAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDA4MDAsIDB4MDcwMCwgMHg4MDAwLCAweDA2MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgwNTAwLCAweDA0MDAsIDB4MDMwMCwgMHg4MDAwLCAweDAyMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgwMTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MDAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgyMDcxLCAweDE4OWUsIDB4NzAwMywgMHgwMDAyLCAweDkwMDYsIDB4NzAxNiwgMHg3MDFhLAorCTB4NzA0YSwgMHg3MDRlLCAweDcwMGUsIDB4NzA0MiwgMHg3MDQ2LCAweDcwM2IsIDB4MThiYSwgMHg3MDNmLAorCTB4MThiYSwgMHg3MDA3LCAweDAwMDEsIDB4MDgwYywgMHgxMDYwLCAweDA5MGMsIDB4MGQ3ZCwgMHgyOTAwLAorCTB4NzA2YSwgMHhhODY3LCAweDAwMDIsIDB4YThhYiwgMHhkY2IwLCAweDA4MGMsIDB4MTA2MCwgMHgwOTBjLAorCTB4MGQ3ZCwgMHgyOTAwLCAweDcwNmUsIDB4YTg2NywgMHgwMDAyLCAweGE4YWIsIDB4ZGNiMCwgMHgwMDA1LAorCTB4MjA3MSwgMHgxODllLCAweDcwMDQsIDB4MDAwMiwgMHgzNGU4LCAweDM0ZTksIDB4MzRmYywgMHgzNTEwLAorCTB4MDAwNSwgMHgxMDA0LCAweDM0ZjksIDB4MGUwNCwgMHgzNGY5LCAweDIwNzksIDB4MDAwMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMGMsIDB4OTAwNSwgMHgxMTI4LCAweDcwMGYsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDQ2OCwgMHgwMDA1LCAweDAxMmUsIDB4MGNlOCwgMHgyMDc5LCAweDAwMDAsIDB4MjA2MSwgMHgxOGI4LAorCTB4MmM0YywgMHhhODZjLCAweDkwOGUsIDB4MDEwMCwgMHgwMTI4LCAweDkwODYsIDB4MDIwMCwgMHgwOTA0LAorCTB4MzVlNCwgMHgwMDA1LCAweDcwMTgsIDB4MjA0OCwgMHgyMDYxLCAweDE4MDAsIDB4NzAxYywgMHgwODA3LAorCTB4NzAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA5NCwgMHgwMGZmLCAweDkyOTYsIDB4MDAyOSwgMHgxMTIwLAorCTB4YWE3OCwgMHhkMmZjLCAweDAxMjgsIDB4MDAwNSwgMHg5MDg2LCAweDAxMDMsIDB4MDEwOCwgMHgwMDA1LAorCTB4MjA3OSwgMHgwMDAwLCAweDIwNjEsIDB4MTgwMCwgMHg3MDFjLCAweDA4MDcsIDB4MjA2MSwgMHgxODAwLAorCTB4Nzg4MCwgMHg5MDhhLCAweDAwNDAsIDB4MTIxMCwgMHg2MWQwLCAweDAwNDIsIDB4MjEwMCwgMHg5MDhhLAorCTB4MDAzZiwgMHgxYTA0LCAweDM1ZTEsIDB4NjFkMCwgMHgwODA0LCAweDM1NzYsIDB4MzViOCwgMHgzNWYwLAorCTB4MzVlMSwgMHgzNWZhLCAweDM2MDQsIDB4MzYwYSwgMHgzNjBlLCAweDM2MWUsIDB4MzYyMiwgMHgzNjM4LAorCTB4MzYzZSwgMHgzNjQ0LCAweDM2NGYsIDB4MzY1YSwgMHgzNjY5LCAweDM2NzgsIDB4MzY4NiwgMHgzNjlkLAorCTB4MzZiOCwgMHgzNWUxLCAweDM3NjEsIDB4Mzc5ZiwgMHgzODQ0LCAweDM4NTUsIDB4Mzg3OCwgMHgzNWUxLAorCTB4MzVlMSwgMHgzNWUxLCAweDM4YjAsIDB4MzhkMCwgMHgzOGQ5LCAweDM5MDUsIDB4MzkwYiwgMHgzNWUxLAorCTB4Mzk1MSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4Mzk1YywgMHgzOTY1LAorCTB4Mzk2ZCwgMHgzOTZmLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLAorCTB4Mzk5ZiwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzliYywgMHgzYTI2LAorCTB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MDAwMiwgMHgzYTUwLAorCTB4M2E1MywgMHgzYWIyLCAweDNhY2IsIDB4M2FmYiwgMHgzZDlkLCAweDM1ZTEsIDB4NTJmNCwgMHgzNWUxLAorCTB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNWUxLCAweDM1ZTEsIDB4MzVlMSwgMHgzNjM4LAorCTB4MzYzZSwgMHg0MjhjLCAweDU3NjIsIDB4NDJhYSwgMHg1MzgzLCAweDUzZDQsIDB4NTRkZiwgMHgzNWUxLAorCTB4NTU0MSwgMHg1NTdkLCAweDU1YWUsIDB4NTZiZSwgMHg1NWRiLCAweDU2M2UsIDB4MzVlMSwgMHg0MmFlLAorCTB4NDQ2MywgMHg0NDc5LCAweDQ0OWUsIDB4NDUwMywgMHg0NTc3LCAweDQ1OTcsIDB4NDYwZSwgMHg0NjZhLAorCTB4NDZjNiwgMHg0NmM5LCAweDQ2ZWUsIDB4NDc2MCwgMHg0N2NhLCAweDQ3ZDIsIDB4NDkwNCwgMHg0YTdjLAorCTB4NGFiMCwgMHg0ZDE0LCAweDM1ZTEsIDB4NGQzMiwgMHg0ZGQ4LCAweDRlYmEsIDB4NGYxNCwgMHgzNWUxLAorCTB4NGZjYiwgMHgzNWUxLCAweDUwMzMsIDB4NTA0ZSwgMHg0N2QyLCAweDUyOTQsIDB4NzE0YywgMHgwMDAwLAorCTB4MjAyMSwgMHg0MDAwLCAweDA4MGMsIDB4NGIyZSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LAorCTB4MzVjMiwgMHgwMDEwLCAweDAxMmUsIDB4MGNjMCwgMHg3YzM2LCAweDk0ODYsIDB4NDAwMCwgMHgwMTE4LAorCTB4NzgzMywgMHgwMDExLCAweDAwMTAsIDB4NzgzMywgMHgwMDEwLCAweDdjODIsIDB4Nzk4NiwgMHg3YThhLAorCTB4N2I4ZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLAorCTB4MTFlZSwgMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDcwMGYsIDB4MDAwMCwgMHgwMTJlLAorCTB4MDAwNSwgMHgyMDIxLCAweDQwMDEsIDB4MDhiMCwgMHgyMDIxLCAweDQwMDIsIDB4MDg5OCwgMHgyMDIxLAorCTB4NDAwMywgMHgwODgwLCAweDIwMjEsIDB4NDAwNSwgMHgwODY4LCAweDIwMjEsIDB4NDAwNiwgMHgwODUwLAorCTB4MjAzOSwgMHgwMDAxLCAweDkwMmUsIDB4MjUyMCwgMHg3Yjg4LCAweDdhOGMsIDB4Nzg4NCwgMHg3OTkwLAorCTB4MDgwNCwgMHg0YjNiLCAweDIwMzksIDB4MDAwMSwgMHg5MDJlLCAweDI1MjAsIDB4N2I4OCwgMHg3YThjLAorCTB4Nzg4NCwgMHg3OTkwLCAweDA4MDQsIDB4NGIzZSwgMHg3OTg0LCAweDc4ODgsIDB4MjExNCwgMHgyMDBhLAorCTB4MDgwNCwgMHgzNWI4LCAweDc5ODQsIDB4MjExNCwgMHgwODA0LCAweDM1YjgsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjA5OSwgMHgwMDIxLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAwMjEsIDB4MjBhOSwgMHgwMDFmLAorCTB4NDAwMywgMHg3OTg0LCAweDdhODgsIDB4N2I4YywgMHgwODA0LCAweDM1YjgsIDB4Nzg4NCwgMHgyMDYwLAorCTB4MDgwNCwgMHgzNjZiLCAweDIwMDksIDB4MDAwMywgMHgyMDExLCAweDAwMDMsIDB4MjAxOSwgMHgwMDA4LAorCTB4Nzg5YiwgMHgwMTM3LCAweDc4OTMsIDB4ZmZmZiwgMHgyMDAxLCAweDE4OGYsIDB4MjAwNCwgMHg5MDA1LAorCTB4MDExOCwgMHg3ODk2LCAweDA4MDQsIDB4MzViOCwgMHg3ODk3LCAweDAwMDEsIDB4MDgwNCwgMHgzNWI4LAorCTB4MjAzOSwgMHgwMDAxLCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1ZjQsIDB4MjAzOSwgMHgwMDAxLAorCTB4N2Q5OCwgMHg3YzljLCAweDA4MDQsIDB4MzVmZSwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwgMHgwMjEwLAorCTB4MDgwNCwgMHgzNWVkLCAweDIxMzgsIDB4N2Q5OCwgMHg3YzljLCAweDA4MDQsIDB4MzVmNCwgMHg3OWEwLAorCTB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwgMHgzNWVkLCAweDIxMzgsIDB4N2Q5OCwgMHg3YzljLAorCTB4MDgwNCwgMHgzNWZlLCAweDc5YTAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwgMHgzNWVkLAorCTB4MjFlOCwgMHg3OTg0LCAweDc4ODgsIDB4MjBhOSwgMHgwMDAxLCAweDIxYTAsIDB4NDAwNCwgMHgwODA0LAorCTB4MzViOCwgMHgyMDYxLCAweDA4MDAsIDB4ZTEwYywgMHg5MDA2LCAweDJjMTUsIDB4OTIwMCwgMHg4YzYwLAorCTB4ODEwOSwgMHgxZGQ4LCAweDIwMTAsIDB4OTAwNSwgMHgwOTA0LCAweDM1YjgsIDB4MDgwNCwgMHgzNWU3LAorCTB4NzlhMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIxMCwgMHgwODA0LCAweDM1ZWQsIDB4MjFlMCwgMHgyMGE5LAorCTB4MDAwMSwgMHg3OTg0LCAweDIxOTgsIDB4NDAxMiwgMHgwODA0LCAweDM1YjgsIDB4MjA2OSwgMHgxODQ3LAorCTB4Nzg4NCwgMHg3OTkwLCAweDkxMWEsIDB4MWEwNCwgMHgzNWVkLCAweDgwMTksIDB4MDkwNCwgMHgzNWVkLAorCTB4Njg0YSwgMHg2OTQyLCAweDc4OGMsIDB4Njg1MiwgMHg3ODg4LCAweDY4NTYsIDB4OTAwNiwgMHg2ODVhLAorCTB4Njg1ZSwgMHgwODBjLCAweDc4NzEsIDB4MDgwNCwgMHgzNWI4LCAweDIwNjksIDB4MTg0NywgMHg3ODg0LAorCTB4Nzk5NCwgMHg5MTFhLCAweDFhMDQsIDB4MzVlZCwgMHg4MDE5LCAweDA5MDQsIDB4MzVlZCwgMHg2ODRlLAorCTB4Njk0NiwgMHg3ODhjLCAweDY4NjIsIDB4Nzg4OCwgMHg2ODY2LCAweDkwMDYsIDB4Njg2YSwgMHg2ODZlLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YjQzLCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LAorCTB4OTAyZSwgMHgyNTIwLCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWVhLAorCTB4Nzk4NCwgMHg3Yjg4LCAweDdhOGMsIDB4MjBhOSwgMHgwMDA1LCAweDIwZTksIDB4MDAwMSwgMHgyMGExLAorCTB4MThhNiwgMHg0MTAxLCAweDA4MGMsIDB4NGFmMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MzVlYSwgMHgyMDA5LCAweDAwMjAsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODBjLAorCTB4NGIzYiwgMHg3MDFmLCAweDM2ZGMsIDB4MDAwNSwgMHhhODY0LCAweDIwMDgsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA5NiwgMHgwMDExLCAweDAxNjgsIDB4OTA5NiwgMHgwMDE5LCAweDAxNTAsIDB4OTA5NiwgMHgwMDE1LAorCTB4MDEzOCwgMHg5MDk2LCAweDAwNDgsIDB4MDEyMCwgMHg5MDk2LCAweDAwMjksIDB4MTkwNCwgMHgzNWVhLAorCTB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4MDkwNCwgMHgzNWVhLCAweDcxMTIsIDB4NzAxMCwgMHg4MDAxLAorCTB4MDU2MCwgMHg3MDEyLCAweDA4MGMsIDB4NGFmMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MzVlYSwgMHgyMDA5LCAweDAwMjAsIDB4NzA2OCwgMHgyMDQwLCAweGEyOGMsIDB4YTM5MCwgMHhhNDk0LAorCTB4YTU5OCwgMHg5MjkwLCAweDAwNDAsIDB4OTM5OSwgMHgwMDAwLCAweDk0YTEsIDB4MDAwMCwgMHg5NWE5LAorCTB4MDAwMCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHhhZjYwLCAweDA4MGMsIDB4NGIzYiwgMHg3MDFmLAorCTB4MzcxYSwgMHgwMDA1LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAwMiwgMHgwMTIwLAorCTB4OTA5NiwgMHgwMDBhLCAweDE5MDQsIDB4MzVlYSwgMHgwODg4LCAweDcwMTQsIDB4MjA0OCwgMHhhODY4LAorCTB4YzBmZCwgMHhhODZhLCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAyOSwgMHgxMTYwLAorCTB4YzJmZCwgMHhhYTdhLCAweDA4MGMsIDB4NjFmZiwgMHgwMTUwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4YTg3YSwgMHhhOTgyLCAweDAxMmUsIDB4MDA1MCwgMHgwODBjLCAweDY1MmYsIDB4MTEyOCwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFmLCAweDM3NDYsIDB4MDAwNSwgMHgwODBjLCAweDcwMjIsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMGE5LCAweDAwMDUsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MThhNiwgMHg0MDBhLAorCTB4MjEwMCwgMHg5MjEwLCAweDkzOTksIDB4MDAwMCwgMHg5NGExLCAweDAwMDAsIDB4OTVhOSwgMHgwMDAwLAorCTB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjAwOSwgMHgwMDIwLCAweDAxMmUsIDB4YWY2MCwgMHgwODA0LAorCTB4NGIzZSwgMHgyMDkxLCAweDgwMDAsIDB4NzgzNywgMHg0MDAwLCAweDc4MzMsIDB4MDAxMCwgMHg3ODgzLAorCTB4NDAwMCwgMHg3ODg3LCAweDQ5NTMsIDB4Nzg4YiwgMHg1MDIwLCAweDc4OGYsIDB4MjAyMCwgMHgyMDA5LAorCTB4MDE3ZiwgMHgyMTA0LCAweDc4OTIsIDB4M2YwMCwgMHg3ODk2LCAweDIwNjEsIDB4MDEwMCwgMHg2MjAwLAorCTB4MjA2MSwgMHgwMjAwLCAweDYwM2MsIDB4ODAwNywgMHg5MjA1LCAweDc4OWEsIDB4MjAwOSwgMHgwNGZkLAorCTB4MjEwNCwgMHg3ODllLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LAorCTB4MjAwNCwgMHhkMDg0LCAweDAxODAsIDB4MjAwMSwgMHgxYTIxLCAweDIwMDQsIDB4OTAwNSwgMHgwMTI4LAorCTB4MjAwMSwgMHgwMDhiLCAweDIwMDQsIDB4ZDBmYywgMHgwZGQ4LCAweDIwMDEsIDB4MDA4YSwgMHgyMDAzLAorCTB4MDAwMiwgMHgyMDAzLCAweDEwMDEsIDB4MjA3MSwgMHgwMDgwLCAweDA4MDQsIDB4MDQyNywgMHg4MWZmLAorCTB4MTkwNCwgMHgzNWVhLCAweDc5ODQsIDB4MDgwYywgMHg2NjkzLCAweDE5MDQsIDB4MzVlZCwgMHg3ZTk4LAorCTB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgxYTA0LCAweDM1ZWQsIDB4N2M4OCwgMHg3ZDhjLAorCTB4MDgwYywgMHg2OGM5LCAweDA4MGMsIDB4Njg1NiwgMHgxNTE4LCAweDIwNjEsIDB4MWRkYywgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDAxNDgsIDB4NjAxNCwgMHg5MDRkLAorCTB4MDEzMCwgMHhhODZjLCAweDk0MDYsIDB4MTExOCwgMHhhODcwLCAweDk1MDYsIDB4MDE1MCwgMHgwMTJlLAorCTB4OWNlMCwgMHgwMDFjLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MWEwNCwgMHgzNWVhLAorCTB4MGMzMCwgMHgwODBjLCAweGM1NjYsIDB4MDEyZSwgMHgwOTA0LCAweDM1ZWEsIDB4MDgwNCwgMHgzNWI4LAorCTB4OTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MDgwYywgMHg3MDIyLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhjYzg1LCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHgwMGE2LAorCTB4Mjk1MCwgMHhiMTk4LCAweDA4MGMsIDB4NjY5MywgMHgxOTA0LCAweDM4MzEsIDB4YjZhNCwgMHg5Njg0LAorCTB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MTZlOCwgMHhiNDljLCAweGI1YTAsIDB4MDgwYywgMHg2OGM5LAorCTB4MDgwYywgMHg2ODczLCAweDE1MjAsIDB4MjA2MSwgMHgxZGRjLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDE0LCAweDkwNGQsIDB4MDEzMCwgMHhhODZjLAorCTB4OTQwNiwgMHgxMTE4LCAweGE4NzAsIDB4OTUwNiwgMHgwMTU4LCAweDAxMmUsIDB4OWNlMCwgMHgwMDFjLAorCTB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgyMDA5LCAweDAwMGQsIDB4MTJiMCwgMHgwYzI4LAorCTB4MDgwYywgMHhjNTY2LCAweDAxMmUsIDB4MjAwOSwgMHgwMDAzLCAweDAxNzgsIDB4MDBlMCwgMHg5MDBlLAorCTB4MjAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NzAyMiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4Y2M4NSwgMHgwODBjLCAweDZkZTIsIDB4MDEyZSwgMHgwMDcwLCAweGIwOTcsIDB4NDAwNSwgMHhiMTlhLAorCTB4MDAxMCwgMHhiMDk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLAorCTB4MmE0OCwgMHgwMGFlLCAweDAwMDUsIDB4YjA5NywgMHg0MDAwLCAweDkwMDYsIDB4OTE4ZCwgMHgwMDAxLAorCTB4MjAwOCwgMHgyYTQ4LCAweDAwYWUsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4NGIwOSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2NzVhLCAweDA5MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4NjhjZiwgMHgwOTA0LCAweDM1ZWEsIDB4MDgwNCwgMHg0NThlLCAweDgxZmYsIDB4MTkwNCwgMHgzNWVhLAorCTB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLCAweDY5NWQsIDB4MDkwNCwgMHgzNWVhLAorCTB4MjAxOSwgMHgwMDA1LCAweDc5YTgsIDB4MDgwYywgMHg2OGVhLCAweDA5MDQsIDB4MzVlYSwgMHg3ODg4LAorCTB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzVlZCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LAorCTB4MDgwYywgMHg4NmQ2LCAweDc5ODQsIDB4ZDE4NCwgMHgxOTA0LCAweDM1YjgsIDB4MDgwNCwgMHg0NThlLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTE4LCAweDIwMDksIDB4MDAwMSwgMHgwNDUwLAorCTB4MjAyOSwgMHgwN2ZmLCAweDY0NWMsIDB4MjQwMCwgMHg5NTA2LCAweDAxZjgsIDB4MjUwOCwgMHgwODBjLAorCTB4NjY5MywgMHgxMWQ4LCAweDA4MGMsIDB4Njk1ZCwgMHgxMTI4LCAweDIwMDksIDB4MDAwMiwgMHg2MmMwLAorCTB4MjUxOCwgMHgwMGMwLCAweDIwMTksIDB4MDAwNCwgMHg5MDBlLCAweDA4MGMsIDB4NjhlYSwgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDA2LCAweDAwNzgsIDB4Nzg4NCwgMHg5MDhhLCAweDEwMDAsIDB4MTI3MCwgMHg4MDAzLAorCTB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4MDgwYywgMHg4NmQ2LCAweDg1MjksIDB4MWFlMCwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNWI4LCAweDAxMmUsIDB4MDgwNCwgMHgzNWVhLCAweDAxMmUsIDB4MDgwNCwgMHgzNWVkLAorCTB4MDgwYywgMHg0YjA5LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLCAweDY3NWEsIDB4MDkwNCwgMHgzNWVhLAorCTB4MDgwYywgMHhhOTFlLCAweGJhYTAsIDB4MjAxOSwgMHgwMDA1LCAweDAwYzYsIDB4OTA2NiwgMHgwODBjLAorCTB4OTQzZCwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MzA2LCAweDkwMGUsIDB4MDgwYywgMHhlMTY3LAorCTB4MDA3ZSwgMHgwMGNlLCAweDA4MGMsIDB4YTkzYSwgMHgwODBjLCAweDY4YzksIDB4MDgwNCwgMHgzNWI4LAorCTB4MDgwYywgMHg0YjA5LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLCAweDY4YzksIDB4MjIwOCwgMHgwODA0LAorCTB4MzViOCwgMHgwMTU2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGM2LCAweDIwNjksIDB4MTkxMCwgMHg2ODEwLAorCTB4NjkxNCwgMHg5MTBhLCAweDEyMDgsIDB4OTAwZSwgMHg2ODE2LCAweDkwMTYsIDB4OTAxZSwgMHgyMDcxLAorCTB4MTllNiwgMHg3MDI4LCAweDkwNjUsIDB4MDExOCwgMHg4MjEwLCAweDYwMGMsIDB4MGNkOCwgMHgyMzAwLAorCTB4OTIxOCwgMHgwMGNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMTVlLCAweDA4MDQsIDB4MzViOCwgMHgwMGY2LAorCTB4MDAxNiwgMHg5MDdkLCAweDAxMzgsIDB4OTAwNiwgMHg4MDAwLCAweDJmMGMsIDB4ODFmZiwgMHgwMTEwLAorCTB4MjE3OCwgMHgwY2QwLCAweDAwMWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwNjksIDB4MTkxMCwgMHg2OTEwLAorCTB4NjJiYywgMHgwODA0LCAweDM1YjgsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LAorCTB4MzVlYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU3NTIsIDB4MDEyOCwgMHgyMDA5LAorCTB4MDAwNywgMHgwMTJlLCAweDA4MDQsIDB4MzVlYSwgMHgwMTJlLCAweDYxNWMsIDB4OTE5MCwgMHgzM2I5LAorCTB4MjIxNSwgMHg5Mjk0LCAweDAwZmYsIDB4NjM3YywgMHg4M2ZmLCAweDAxMDgsIDB4NjI4MCwgMHg2N2RjLAorCTB4OTdjNCwgMHgwMDBhLCAweDk4YzYsIDB4MDAwYSwgMHgxMTE4LCAweDIwMzEsIDB4MDAwMSwgMHgwMGU4LAorCTB4OTdjNCwgMHgwMDIyLCAweDk4YzYsIDB4MDAyMiwgMHgxMTE4LCAweDIwMzEsIDB4MDAwMywgMHgwMGE4LAorCTB4OTdjNCwgMHgwMDEyLCAweDk4YzYsIDB4MDAxMiwgMHgxMTE4LCAweDIwMzEsIDB4MDAwMiwgMHgwMDY4LAorCTB4MDgwYywgMHg3NTNkLCAweDExMTgsIDB4MjAzMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDc5YywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDA1LCAweDA4MDQsIDB4MzVlYSwgMHg5MDM2LCAweDdlOWEsIDB4N2Y5ZSwgMHgwODA0LAorCTB4MzViOCwgMHg2MTRjLCAweDYyNTAsIDB4MjAxOSwgMHgxOTg1LCAweDIzMWMsIDB4MjAwMSwgMHgxOTg2LAorCTB4MjAwNCwgMHg3ODlhLCAweDA4MDQsIDB4MzViOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MTM4LAorCTB4NjIzYywgMHg2MzQwLCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LAorCTB4MzVlZCwgMHhiYTQ0LCAweGJiMzgsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLAorCTB4NGIyNSwgMHgyMTEwLCAweDA5MDQsIDB4MzVlZCwgMHhiODA0LCAweDkwOGMsIDB4MDBmZiwgMHg5MThlLAorCTB4MDAwNiwgMHgwMTQwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDA2MDAsIDB4MjAwOSwgMHgwMDA5LAorCTB4MTkwNCwgMHgzNWVhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMTksIDB4MDAwNSwgMHgwMGM2LAorCTB4OTA2NiwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHhhNDA0LCAweDA4MGMsIDB4OTQzZCwgMHgwMDc2LAorCTB4OTAzZSwgMHgwODBjLCAweDkzMDYsIDB4OTAwZSwgMHgwODBjLCAweGUxNjcsIDB4MDA3ZSwgMHgwMGNlLAorCTB4MDgwYywgMHhhOTNhLCAweGI4MDcsIDB4MDQwNywgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHg2MTRjLAorCTB4NjI1MCwgMHg3ODg0LCAweDYwNGUsIDB4N2I4OCwgMHg2MzUyLCAweDIwNjksIDB4MTg0NywgMHg4MzFmLAorCTB4OTMwNSwgMHg2ODE2LCAweDc4OGMsIDB4MjA2OSwgMHgxOTg1LCAweDJkMWMsIDB4MjA2YSwgMHg3ZTk4LAorCTB4OTY4MiwgMHgwMDE0LCAweDEyMTAsIDB4MjAzMSwgMHgwN2QwLCAweDIwNjksIDB4MTk4NiwgMHgyZDA0LAorCTB4MjY2YSwgMHg3ODlhLCAweDA4MDQsIDB4MzViOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MTM4LAorCTB4Nzg4NCwgMHg2MDNhLCAweDkxMGUsIDB4ZDFiNCwgMHgxOTBjLCAweDBlZDksIDB4ZDBjNCwgMHgwMWE4LAorCTB4MDBkNiwgMHg3OGE4LCAweDIwMDksIDB4MTk5YywgMHgyMDBhLCAweDc4YWMsIDB4MjAxMSwgMHgxOTlkLAorCTB4MjAxMiwgMHgyMDY5LCAweDAxMDAsIDB4NjgzOCwgMHg5MDg2LCAweDAwMDcsIDB4MTExOCwgMHgyMjE0LAorCTB4NmE1YSwgMHgwMDEwLCAweDIxMGMsIDB4Njk1YSwgMHgwMGRlLCAweDIwMTEsIDB4MDExNiwgMHgyMjBjLAorCTB4Nzg4OCwgMHhkMDhjLCAweDAxMTgsIDB4OTE4ZCwgMHgwMDQwLCAweDAwMTAsIDB4OTE4YywgMHhmZjdmLAorCTB4MjExMiwgMHg2MDNjLCAweDc5ODgsIDB4NjEzZSwgMHg2MTQwLCAweDkxMGQsIDB4Nzg4YywgMHg2MDQyLAorCTB4N2E4OCwgMHg5Mjk0LCAweDEwMDAsIDB4OTIwNSwgMHg5MTBlLCAweGQxZTQsIDB4MTkwYywgMHgwZWY0LAorCTB4OTA4NCwgMHgwMDIwLCAweDAxMzAsIDB4NzhiNCwgMHg2MDQ2LCAweDkwODQsIDB4MDAwMSwgMHgwOTBjLAorCTB4NDI4YywgMHg2MDQwLCAweGQwY2MsIDB4MDEyMCwgMHg3OGIwLCAweDIwMTEsIDB4MDExNCwgMHgyMDEyLAorCTB4MDEyZSwgMHgwODA0LCAweDM1YjgsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4N2EzOCwgMHhhODk4LAorCTB4OTA4NCwgMHhmZWJmLCAweDkyMTUsIDB4YTg5YywgMHg5MDg0LCAweGZlYmYsIDB4ODAwMiwgMHg5MjE0LAorCTB4NzgzOCwgMHg5MDg0LCAweDAxNDAsIDB4OTIxNSwgMHg3YTNhLCAweGE4OTcsIDB4NDAwMCwgMHg5MDBlLAorCTB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4Nzg5OCwgMHg5MDA1LAorCTB4MDFhOCwgMHg3ODg4LCAweDkwMjUsIDB4MDkwNCwgMHgzNWVkLCAweDc4OGMsIDB4OTAyZCwgMHgwOTA0LAorCTB4MzVlZCwgMHg5MDBlLCAweDA4MGMsIDB4NjY5MywgMHgxMTIwLCAweGJhNDQsIDB4YmIzOCwgMHhiYzQ2LAorCTB4YmQzYSwgMHg5MTg2LCAweDA3ZmYsIDB4MDE5MCwgMHg4MTA4LCAweDBjYTAsIDB4MDgwYywgMHg0YjI1LAorCTB4MDkwNCwgMHgzNWVkLCAweDc4ODgsIDB4OTAwZCwgMHgwOTA0LCAweDM1ZWQsIDB4Nzg4YywgMHg5MDA1LAorCTB4MDkwNCwgMHgzNWVkLCAweGJhNDQsIDB4Yjk0NiwgMHhiYjM4LCAweGI4M2EsIDB4MDgwNCwgMHgzNWI4LAorCTB4MjAxMSwgMHhiYzA5LCAweDAwMTAsIDB4MjAxMSwgMHhiYzA1LCAweDA4MGMsIDB4NTc1MiwgMHgxOTA0LAorCTB4MzVlYSwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg3OTg0LCAweDkxODYsIDB4MDBmZiwgMHgxMTMwLAorCTB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4OTA4NSwgMHhmZjAwLCAweDAwODgsIDB4OTE4MiwgMHgwMDdmLAorCTB4MTZlMCwgMHg5MTg4LCAweDMzYjksIDB4MjEwZCwgMHg5MThjLCAweDAwZmYsIDB4MjAwMSwgMHgxODE4LAorCTB4MjAwNCwgMHgwMDI2LCAweDkxMTYsIDB4MDAyZSwgMHgwNTgwLCAweDgxMGYsIDB4OTEwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwMDYsIDB4MDgwYywgMHhhYzVhLCAweDAwMGUsIDB4MDUxMCwgMHg2MDJlLAorCTB4NjIwYSwgMHg3OTg0LCAweDAwYjYsIDB4MDgwYywgMHg2NjM4LCAweDJiMDgsIDB4MDBiZSwgMHgxNTAwLAorCTB4NjExMiwgMHg2MDIzLCAweDAwMDEsIDB4MDgwYywgMHg0YWYyLCAweDAxZDAsIDB4OTAwNiwgMHhhODY2LAorCTB4NzAwNywgMHgwMDAzLCAweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4NzAxZiwgMHgzYWFiLAorCTB4MjkwMCwgMHg2MDE2LCAweDIwMDksIDB4MDAzMiwgMHgwODBjLCAweGFkNGQsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMTJlLCAweDAwY2UsIDB4MDgwNCwgMHgzNWVhLCAweDAwY2UsIDB4MDgwNCwgMHgzNWVkLAorCTB4MDgwYywgMHhhY2IwLCAweDBjYjAsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDkwNCwgMHgzNWVhLAorCTB4MDgwNCwgMHgzNWI4LCAweDIwNjEsIDB4MWE2ZSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLAorCTB4ZDA4NCwgMHgwMTcwLCAweDYxMDQsIDB4NjIwOCwgMHgyMDYxLCAweDE4MDAsIDB4NjM1NCwgMHg2MDc0LAorCTB4Nzg5YSwgMHg2MGMwLCAweDc4OWUsIDB4NjBiYywgMHg3OGFhLCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LAorCTB4OTAwZSwgMHgyMTEwLCAweDBjODgsIDB4ODFmZiwgMHgxOTA0LCAweDM1ZWEsIDB4MDgwYywgMHg3NTNkLAorCTB4MDkwNCwgMHgzNWVhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyNTQsIDB4NjA3NCwgMHg5MjAyLAorCTB4MDI0OCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHgyNmNhLCAweDA4MGMsIDB4NTk3MSwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNWI4LCAweDAxMmUsIDB4MDgwNCwgMHgzNWVkLCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDBlNiwgMHgyMDAxLCAweDE5YTgsIDB4MjA3MCwgMHgyMDYxLCAweDE4NDcsIDB4NjAwOCwgMHgyMDcyLAorCTB4OTAwZSwgMHgyMDExLCAweDE0MDAsIDB4MDgwYywgMHg5MWY4LCAweDcyMDYsIDB4MDBlZSwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODFmZiwgMHgwMTI4LAorCTB4MDEyZSwgMHgyMDIxLCAweDQwMGIsIDB4MDgwNCwgMHgzNWJhLCAweDc4ODQsIDB4ZDBmYywgMHgwMTQ4LAorCTB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4MiwgMHgwMGUxLCAweDAyODgsIDB4MDEyZSwgMHgwODA0LAorCTB4MzVlZCwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHgyMDY5LCAweDE4NDcsIDB4NjkwOCwgMHg5MTAyLAorCTB4MTIzMCwgMHgwMTJlLCAweDA4MDQsIDB4MzVlZCwgMHgwMTJlLCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4YWJlMiwgMHgwZGQwLCAweDc4ODQsIDB4ZDBmYywgMHgwOTA0LCAweDNiNzYsIDB4MDBjNiwgMHgwODBjLAorCTB4NGFmMiwgMHgwMGNlLCAweDBkODgsIDB4YTg2NywgMHgwMDAwLCAweDc4ODQsIDB4YTgwYSwgMHg3ODk4LAorCTB4YTgwZSwgMHg3ODljLCAweGE4MTIsIDB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTgxYSwgMHgyMDAxLAorCTB4MDAyZiwgMHgyMDA0LCAweGE4MWUsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTgyMiwgMHgyMDAxLAorCTB4MDAzMSwgMHgyMDA0LCAweGE4MjYsIDB4MjAwMSwgMHgwMDM0LCAweDIwMDQsIDB4YTgyYSwgMHgyMDAxLAorCTB4MDAzNSwgMHgyMDA0LCAweGE4MmUsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4MCwgMHgwMDAzLAorCTB4OTA4NCwgMHgwMGZjLCAweDgwMDQsIDB4YTgxNiwgMHgwODBjLCAweDNkMDAsIDB4MDkyOCwgMHg3MDE0LAorCTB4MjA0OCwgMHhhZDJjLCAweGFjMjgsIDB4YWIxYywgMHhhYTE4LCAweGE5MzAsIDB4YTgwOCwgMHhkMGI0LAorCTB4MTEyMCwgMHgyMDI5LCAweDAwMDAsIDB4MjAyMSwgMHgwMDAwLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LAorCTB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MDgwYywgMHg0YjNiLAorCTB4NzAxZiwgMHgzYzNkLCAweDcwMjMsIDB4MDAwMSwgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLAorCTB4MDA0NiwgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MDBmNiwgMHgwODBjLCAweDNhZTUsIDB4MjAwMSwgMHgxOTllLCAweDIwMDMsIDB4MDAwMCwgMHgyMDIxLAorCTB4MDAwYSwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMDE2LCAweDYwYmIsIDB4MDAwMCwgMHg2MGJmLAorCTB4MzJlMSwgMHg2MGJmLCAweDAwMTIsIDB4MDgwYywgMHgzZDZmLCAweDA4MGMsIDB4M2QyZSwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMDg2LCAweDI5NDAsIDB4MjA3MSwgMHgxOWU2LCAweDIwNzksIDB4MDA5MCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDAwLCAweDY4ODQsIDB4ZDBiNCwgMHgwMTQwLCAweDIwMDEsIDB4MDAzNSwgMHgyMDA0LAorCTB4NzgwZSwgMHgyMDAxLCAweDAwMzQsIDB4MjAwNCwgMHg3ODBhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHg0MGQwLCAweDAwOGUsIDB4MDBlZSwgMHgwMGZlLCAweDA4MGMsIDB4M2ZmZCwgMHgwODBjLAorCTB4M2YyYSwgMHgwNWI4LCAweDIwMDEsIDB4MDIwYiwgMHgyMDA0LCAweDkwODQsIDB4MDE0MCwgMHgxZGI4LAorCTB4MDgwYywgMHg0MTQ0LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDc4YmMsIDB4MDBmZSwgMHg5MDhjLAorCTB4MDA3MCwgMHgxNTYwLCAweDIwNzEsIDB4MDIwMCwgMHg3MDM3LCAweDAwMDAsIDB4NzA1MCwgMHg5MDg0LAorCTB4ZmYwMCwgMHg5MDg2LCAweDMyMDAsIDB4MTUxMCwgMHg3MDM3LCAweDAwMDEsIDB4NzA1MCwgMHg5MDg0LAorCTB4ZmYwMCwgMHg5MDg2LCAweGUxMDAsIDB4MTFkMCwgMHg3MDM3LCAweDAwMDAsIDB4NzA1NCwgMHg3MDM3LAorCTB4MDAwMCwgMHg3MTVjLCAweDkxMDYsIDB4MTE5MCwgMHgyMDAxLCAweDE4MjAsIDB4MjAwNCwgMHg5MTA2LAorCTB4MTE2OCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MDI0LCAweDkwODQsIDB4MWUwMCwgMHgwMGNlLAorCTB4MDEzOCwgMHgwODBjLCAweDNmMzQsIDB4MDgwYywgMHgzZDI5LCAweDAwNTgsIDB4MDgwYywgMHgzZDI5LAorCTB4MDgwYywgMHg0MDY4LCAweDA4MGMsIDB4M2ZmMywgMHgyMDAxLCAweDAyMGIsIDB4MjAwNCwgMHhkMGU0LAorCTB4MGRkOCwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDIwNjEsIDB4MDEwMCwgMHg2MDI3LAorCTB4MDAwMiwgMHgwMDFlLCAweDYxMDYsIDB4MjAxMSwgMHgwMjBkLCAweDIwMTMsIDB4MDAyMCwgMHg2MGJiLAorCTB4MDAwMCwgMHg2MGJmLCAweDAxMDgsIDB4NjBiZiwgMHgwMDEyLCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLAorCTB4OTE4YywgMHhmZmZkLCAweDIxMDIsIDB4MDgwYywgMHgxMzQwLCAweDIwMDksIDB4MDAyOCwgMHgwODBjLAorCTB4MjIwYSwgMHgyMDAxLCAweDAyMjcsIDB4MjAwYywgMHgyMTAyLCAweDA4MGMsIDB4YTkzYSwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA4ZSwgMHgwMDRlLAorCTB4MjAwMSwgMHgxOTllLCAweDIwMDQsIDB4OTAwNSwgMHgxMTE4LCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LAorCTB4MDEyZSwgMHgyMDIxLCAweDQwMGMsIDB4MDgwNCwgMHgzNWJhLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDA4NiwgMHgwMDk2LCAweDAwZDYsIDB4MDE1NiwgMHg3MDE0LAorCTB4MjA0OCwgMHg3MDIwLCAweDIwYTgsIDB4ODAwMCwgMHg3MDIyLCAweGE4MDQsIDB4OTAwNSwgMHgwOTA0LAorCTB4M2M5OSwgMHgyMDQ4LCAweDFmMDQsIDB4M2M0ZCwgMHg3MDY4LCAweDIwNDAsIDB4YTI4YywgMHhhMzkwLAorCTB4YTQ5NCwgMHhhNTk4LCAweGE5MzAsIDB4YTgwOCwgMHhkMGI0LCAweDExMjAsIDB4MjAyOSwgMHgwMDAwLAorCTB4MjAyMSwgMHgwMDAwLCAweDAwOTYsIDB4NzAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4MDA5ZSwgMHg5MDg2LAorCTB4MDEwMywgMHgwMTcwLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LAorCTB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MDgwYywgMHg0YjNiLCAweDcwMWYsIDB4M2MzZCwgMHgwMGIwLAorCTB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLAorCTB4MDAxYiwgMHgyMWE4LCAweDI3ZTAsIDB4MjA5OCwgMHgyN2U4LCAweDIwYTAsIDB4MDAwNiwgMHgwODBjLAorCTB4MGZjNCwgMHgwMDBlLCAweDA4MGMsIDB4NGIzZSwgMHg3MDFmLCAweDNjM2QsIDB4MDE1ZSwgMHgwMGRlLAorCTB4MDA5ZSwgMHgwMDhlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHg3MDE0LCAweDIwNDgsIDB4YTg2NCwgMHg5MDg2LCAweDAxMDMsIDB4MTExOCwgMHg3MDFmLAorCTB4M2NmZSwgMHgwNDUwLCAweDcwMTQsIDB4MjA0OCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgyMDA5LAorCTB4MDA3ZiwgMHgwODBjLCAweDY2MzIsIDB4MDExMCwgMHg5MDA2LCAweDAwMzAsIDB4YjgxMywgMHgwMGZmLAorCTB4YjgxNywgMHhmZmZkLCAweDA4MGMsIDB4Y2U2NCwgMHgwMTVlLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDhlLAorCTB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDkwNCwgMHgzNWVhLAorCTB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDA4NiwgMHgwMDk2LAorCTB4MDBkNiwgMHgwMTU2LCAweDcwMWYsIDB4M2NkMCwgMHg3MDA3LCAweDAwMDMsIDB4MDgwNCwgMHgzYzhlLAorCTB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MjAyMSwgMHg0MDBjLCAweDA5MDQsIDB4MzViYSwgMHgwMDc2LAorCTB4YWQxMCwgMHhhYzBjLCAweGFiMjQsIDB4YWEyMCwgMHhhOTMwLCAweGE4MDgsIDB4ZDBiNCwgMHgxMTIwLAorCTB4MjAyOSwgMHgwMDAwLCAweDIwMjEsIDB4MDAwMCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLAorCTB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDIxYTgsIDB4MjdlMCwgMHgyMDk4LAorCTB4MjdlOCwgMHgyMGEwLCAweDAwMDYsIDB4MDgwYywgMHgwZmM0LCAweDAwMGUsIDB4MDgwYywgMHg0YjNlLAorCTB4MDA3ZSwgMHg3MDFmLCAweDNjM2QsIDB4NzAyMywgMHgwMDAxLCAweDAwMDUsIDB4MDgwNCwgMHgzNWI4LAorCTB4MDE1NiwgMHgwMGM2LCAweGE4MTQsIDB4OTA4YSwgMHgwMDFlLCAweDAyMTgsIDB4YTgzMywgMHgwMDFlLAorCTB4MDAxMCwgMHhhODMyLCAweDAwNzgsIDB4ODFmZiwgMHgwMTY4LCAweDAwMTYsIDB4MDgwYywgMHg0YWYyLAorCTB4MDAxZSwgMHgwMTMwLCAweGE4MDAsIDB4MjA0MCwgMHhhMDA4LCAweGE4MGEsIDB4MjEwMCwgMHgwYzU4LAorCTB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAxNWUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4Nzg4MCwgMHg5MDg2LCAweDAwNDQsIDB4MDBmZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE5OWUsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBjNiwgMHgyMDYxLCAweDAyMDAsIDB4MjAwMSwgMHgxOWE5LCAweDIwMDQsIDB4NjAxYSwgMHgyMDYxLAorCTB4MDEwMCwgMHgyMDAxLCAweDE5YTgsIDB4MjAwNCwgMHg2MGNlLCAweDYxMDQsIDB4YzFhYywgMHg2MTA2LAorCTB4MDgwYywgMHg0YWYyLCAweGE4MTMsIDB4MDAxOSwgMHhhODE3LCAweDAwMDEsIDB4MjkwMCwgMHhhODVhLAorCTB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLCAweDAwMmYsIDB4MjAwNCwgMHhhODZhLAorCTB4MjA2MSwgMHgwMDkwLCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweDE5YTgsIDB4MjAwNCwgMHg2MDM2LAorCTB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjIwYSwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHg5MDg0LAorCTB4ZmZmOCwgMHhhODZlLCAweDYwMWEsIDB4YTg3MywgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHg3OGNhLAorCTB4OTAwNiwgMHg2MDBhLCAweDYwMGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDgwYywgMHg0YWYyLCAweDI5NDAsIDB4YTAxMywgMHgwMDE5LCAweGEwMTcsIDB4MDAwMSwgMHgyODAwLAorCTB4YTA1YSwgMHgyMDAxLCAweDAwMzAsIDB4MjAwNCwgMHhhODY2LCAweDIwMDEsIDB4MDAzMSwgMHgyMDA0LAorCTB4YTg2YSwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4YTg2ZSwgMHhhODczLAorCTB4MDAwMCwgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA0LCAweDIwMDEsIDB4MDMwMCwgMHgyMDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDAwNCwgMHgyMDBjLAorCTB4OTE4ZCwgMHgwMDAyLCAweDIxMDIsIDB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4ODFmZiwgMHgwMTQ4LCAweDA4MGMsIDB4MmE1OCwgMHgxMTMwLCAweDkwMDYsIDB4MDgwYywgMHgyOWFiLAorCTB4OTAwNiwgMHgwODBjLCAweDI5OGUsIDB4Nzg4NCwgMHg5MDg0LCAweDAwMDcsIDB4MDAwMiwgMHgzZGJhLAorCTB4M2RiYiwgMHgzZGJjLCAweDNkYjcsIDB4M2RiNywgMHgzZGI3LCAweDNkYjcsIDB4M2RiNywgMHgwMTJlLAorCTB4MDgwNCwgMHgzNWVkLCAweDBjZTAsIDB4MGNkOCwgMHgwODBjLCAweDc1M2QsIDB4MTEyOCwgMHgwMTJlLAorCTB4MjAwOSwgMHgwMDE2LCAweDA4MDQsIDB4MzVlYSwgMHg4MWZmLCAweDAxMjgsIDB4MDEyZSwgMHgyMDIxLAorCTB4NDAwYiwgMHgwODA0LCAweDM1YmEsIDB4MDgwYywgMHhhOTFlLCAweDAwODYsIDB4MDA5NiwgMHgwMGE2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDA4MGMsIDB4M2FlNSwgMHgyMDA5LAorCTB4MDEwMSwgMHgyMTBjLCAweDAwMTYsIDB4N2VjOCwgMHg3ZGNjLCAweDkwMDYsIDB4MjA2OCwgMHgyMDYwLAorCTB4MjA1OCwgMHgwODBjLCAweDQyMWYsIDB4MDgwYywgMHg0MTZmLCAweDkwM2UsIDB4MjcyMCwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMDg2LCAweDI5NDAsIDB4MjA3MSwgMHgxOWU2LCAweDIwNzksIDB4MDA5MCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDAwLCAweDY4ODQsIDB4ZDBiNCwgMHgwMTIwLCAweDY4ZDQsIDB4NzgwZSwgMHg2OGQwLAorCTB4NzgwYSwgMHgwMGRlLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDQwZDAsIDB4MDgwYywgMHgyYTYwLAorCTB4MDgwYywgMHgyYTYwLCAweDA4MGMsIDB4MmE2MCwgMHgwODBjLCAweDJhNjAsIDB4MDgwYywgMHg0MGQwLAorCTB4MDA4ZSwgMHgwMGVlLCAweDAwZmUsIDB4MDgwYywgMHgzZmZkLCAweDIwMDksIDB4OWM0MCwgMHg4MTA5LAorCTB4MTFiMCwgMHgwODBjLCAweDNmMzQsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywgMHhmZmZkLAorCTB4MjEwMiwgMHgwMDFlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMGFlLAorCTB4MDA5ZSwgMHgwMDhlLCAweDIwMDksIDB4MDAxNywgMHgwODBjLCAweDM1ZWEsIDB4MGNmOCwgMHgyMDAxLAorCTB4MDIwYiwgMHgyMDA0LCAweDkwODQsIDB4MDE0MCwgMHgxZDEwLCAweDAwZjYsIDB4MjA3OSwgMHgwMDAwLAorCTB4Nzg4NCwgMHgwMGZlLCAweGQwYmMsIDB4MDE3OCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwYywgMHg4MWZmLAorCTB4MDE1MCwgMHgwODBjLCAweDNmZGIsIDB4MmQwMCwgMHg5YzA1LCAweDliMDUsIDB4MDEyMCwgMHgwODBjLAorCTB4M2YzNCwgMHgwODA0LCAweDNlZGQsIDB4MDgwYywgMHg0MTQ0LCAweDA4MGMsIDB4NDA2OCwgMHgwODBjLAorCTB4M2ZiZSwgMHgwODBjLCAweDNmZjMsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNCwgMHhkMGFjLAorCTB4MDEzMCwgMHg4YjU4LCAweDA4MGMsIDB4M2YzNCwgMHgwMGZlLCAweDA4MDQsIDB4M2VkZCwgMHgwMGZlLAorCTB4MDgwYywgMHgzZjJhLCAweDExNTAsIDB4OGQ2OCwgMHgyMDAxLCAweDAwMzIsIDB4MjYwMiwgMHgyMDAxLAorCTB4MDAzMywgMHgyNTAyLCAweDA4MGMsIDB4M2YzNCwgMHgwMDgwLCAweDg3ZmYsIDB4MDEzOCwgMHgyMDAxLAorCTB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MTkwOCwgMHg4NzM5LCAweDAwMzgsIDB4MjAwMSwgMHgxYTZhLAorCTB4MjAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwNCwgMHgzZTJkLCAweDIwMDEsIDB4MDMyZiwgMHgyMDAzLAorCTB4MDBmNiwgMHg4NjMxLCAweDEyMDgsIDB4ODUyOSwgMHgyNTAwLCAweDk2MDUsIDB4MDkwNCwgMHgzZWRkLAorCTB4Nzg4NCwgMHhkMGJjLCAweDAxMjgsIDB4MmQwMCwgMHg5YzA1LCAweDliMDUsIDB4MTkwNCwgMHgzZWRkLAorCTB4YTAxMywgMHgwMDE5LCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4Nzg4NCwgMHhkMGFjLAorCTB4MTE0OCwgMHgyMDAxLCAweDFhNmEsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLAorCTB4MDAwOSwgMHgwMDMwLCAweGEwMTcsIDB4MDAwMSwgMHg3OGI0LCAweDkwMDUsIDB4MDEwOCwgMHhhMDE2LAorCTB4MjgwMCwgMHhhMDVhLCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIyMGEsIDB4MjkwMCwgMHhhODVhLAorCTB4YTgxMywgMHgwMDE5LCAweDc4ODQsIDB4ZDBhNCwgMHgxMTgwLCAweGE4MTcsIDB4MDAwMCwgMHgwMGM2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwNjEsIDB4MDA5MCwgMHg2MDJiLCAweDAwMDgsIDB4MjAwMSwgMHgwMjAzLAorCTB4MjAwNCwgMHgxZjA0LCAweDNlYjQsIDB4MDBjZSwgMHgwMDMwLCAweGE4MTcsIDB4MDAwMSwgMHg3OGIwLAorCTB4OTAwNSwgMHgwMTA4LCAweGE4MTYsIDB4MDBmNiwgMHgwMGM2LCAweDIwNzksIDB4MDEwMCwgMHgyMDYxLAorCTB4MDA5MCwgMHg3ODI3LCAweDAwMDIsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LAorCTB4NjAxYSwgMHgwMDA2LCAweDIwMDEsIDB4MDAyYiwgMHgyMDA0LCAweDYwMWUsIDB4NzhjNiwgMHgwMDBlLAorCTB4NzhjYSwgMHgwMGNlLCAweDAwZmUsIDB4MDgwNCwgMHgzZGU3LCAweDAwMWUsIDB4MDBjNiwgMHgyMDAxLAorCTB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4MjA2MSwgMHgwMTAwLCAweDYwMjcsIDB4MDAwMiwgMHg2MTA2LAorCTB4MjAxMSwgMHgwMjBkLCAweDIwMTMsIDB4MDAyMCwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThjLAorCTB4ZmZmZCwgMHgyMTAyLCAweDA4MGMsIDB4MTM0MCwgMHg3ODg0LCAweDkwODQsIDB4MDAwMywgMHg5MDg2LAorCTB4MDAwMiwgMHgwMWIwLCAweDIwMDksIDB4MDAyOCwgMHgwODBjLCAweDIyMGEsIDB4MjAwMSwgMHgwMjI3LAorCTB4MjAwYywgMHgyMTAyLCAweDYwNTAsIDB4OTA4NCwgMHhiN2ZmLCAweDA4MGMsIDB4MmIwYSwgMHg2MDUyLAorCTB4NjAyZiwgMHgwMDAwLCAweDYwNGIsIDB4ZjdmNywgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLAorCTB4MDgwYywgMHhhOTNhLCAweDAwY2UsIDB4MmQwOCwgMHgyYzEwLCAweDJiMTgsIDB4MmIwMCwgMHg5YzA1LAorCTB4OWQwNSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLAorCTB4MDA4ZSwgMHgxMTE4LCAweDAxMmUsIDB4MDgwNCwgMHgzNWI4LCAweDAxMmUsIDB4MjAyMSwgMHg0MDBjLAorCTB4MDgwNCwgMHgzNWJhLCAweDkwODUsIDB4MDAwMSwgMHgxZDA0LCAweDNmMzMsIDB4MjA5MSwgMHg2MDAwLAorCTB4ODQyMCwgMHg5NDg2LCAweDAwNjQsIDB4MDAwNSwgMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLAorCTB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLCAweDFhNmEsIDB4MjAwMywgMHgwMDAwLAorCTB4MDA3MSwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHgyMjBhLCAweDIwMDEsIDB4MDIyNywgMHgyMDI0LAorCTB4MjQwMiwgMHgyMDAxLCAweDAxMDksIDB4MjAwMywgMHg0MDAwLCAweDkwMjYsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBlNiwgMHgyMDcxLCAweDE5ZTYsIDB4NzA1NCwgMHg5MDg2LCAweDAwMDAsIDB4MDUyMCwgMHgyMDc5LAorCTB4MDA5MCwgMHgyMDA5LCAweDAyMDYsIDB4MjEwNCwgMHgyMDA5LCAweDAyMDMsIDB4MjEwYywgMHg5MTA2LAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMjBhLCAweDc4MmMsIDB4ZDBmYywgMHgwZDg4LAorCTB4MDgwYywgMHg0MTQ0LCAweDcwNTQsIDB4OTA4NiwgMHgwMDAwLCAweDFkNTgsIDB4NzgyYiwgMHgwMDA0LAorCTB4NzgyYywgMHhkMGFjLCAweDFkZTgsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjIwYSwgMHg3ODJiLAorCTB4MDAwMiwgMHg3MDU3LCAweDAwMDAsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwYywgMHg3OTMyLCAweDc5MzYsIDB4MDgwYywgMHgyNmFhLAorCTB4MDgwYywgMHgyYWQ3LCAweDA4MGMsIDB4MmIwYSwgMHg3ODRiLCAweGY3ZjcsIDB4Nzg0MywgMHgwMDkwLAorCTB4Nzg0MywgMHgwMDEwLCAweDc4NTAsIDB4YzBlNSwgMHg3ODUyLCAweDIwMTksIDB4NjFhOCwgMHg3ODIwLAorCTB4ZDA5YywgMHgwMTEwLCAweDgzMTksIDB4MWRkOCwgMHg3ODUwLCAweGMwZTQsIDB4Nzg1MiwgMHgyMDExLAorCTB4MDA0OCwgMHgwODBjLCAweDJhYjQsIDB4Nzg0MywgMHgwMDQwLCAweDIwMTksIDB4MDFmNCwgMHhhMDAxLAorCTB4YTAwMSwgMHg4MzE5LCAweDFkZTAsIDB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmE3YSwgMHgyMDExLAorCTB4MDAyMCwgMHgwODBjLCAweDJhYjQsIDB4Nzg0MywgMHgwMDAwLCAweDkwMDYsIDB4MDgwYywgMHgyYTdhLAorCTB4MjAxMSwgMHgwMDQ4LCAweDA4MGMsIDB4MmFiNCwgMHgwMGZlLCAweDAwMDUsIDB4Nzg4NCwgMHhkMGFjLAorCTB4MTFjOCwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHgxYTZhLCAweDIwNzksIDB4MDMyMCwgMHgyMDAxLAorCTB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MDE2MCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxMTQwLAorCTB4MDA1MSwgMHhkMGJjLCAweDAxMDgsIDB4ODczOCwgMHg3MDAzLCAweDAwMDMsIDB4NzgyYiwgMHgwMDE5LAorCTB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzhiYywgMHgwMGZlLAorCTB4OTA4YywgMHgwMDcwLCAweDAxNzgsIDB4MjAwOSwgMHgwMDMyLCAweDI2MGEsIDB4MjAwOSwgMHgwMDMzLAorCTB4MjUwYSwgMHhkMGI0LCAweDAxMDgsIDB4OGM2MCwgMHhkMGFjLCAweDAxMDgsIDB4OGQ2OCwgMHhkMGE0LAorCTB4MDEwOCwgMHg4YjU4LCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4NzgxYywgMHhkMDg0LAorCTB4MDExMCwgMHg3ODM3LCAweDAwNTAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMTAwLAorCTB4MjAwMSwgMHgxOWE5LCAweDIwMDQsIDB4NzBlMiwgMHgwODBjLCAweDNkMWYsIDB4MTE4OCwgMHgyMDAxLAorCTB4MTgyMCwgMHgyMDA0LCAweDIwMDksIDB4MTgxZiwgMHgyMTBjLCAweDkxOGMsIDB4MDBmZiwgMHg3MDZlLAorCTB4NzE2YSwgMHg3MDY2LCAweDkxOGQsIDB4MzIwMCwgMHg3MTYyLCAweDcwNzMsIDB4ZTEwOSwgMHgwMDgwLAorCTB4NzAyYywgMHg5MDg1LCAweDAwMDIsIDB4NzAyZSwgMHgyMDA5LCAweDE4MTgsIDB4MjEwYywgMHg3MTZlLAorCTB4NzA2MywgMHgwMTAwLCAweDcxNjYsIDB4NzE5ZSwgMHg3MDZiLCAweDAwMDAsIDB4NzA3MywgMHgwODA5LAorCTB4NzA3NywgMHgwMDA4LCAweDcwNzgsIDB4OTA4MCwgMHgwMTAwLCAweDcwN2EsIDB4NzA4MCwgMHg4MDAwLAorCTB4NzA4MiwgMHg3MDg3LCAweGFhYWEsIDB4OTAwNiwgMHg3MDhhLCAweDcwOGUsIDB4NzA3ZSwgMHg3MGQ2LAorCTB4NzBhYiwgMHgwMDM2LCAweDcwYWYsIDB4OTVkNSwgMHg3MDE0LCAweDkwODQsIDB4MTk4NCwgMHg5MDg1LAorCTB4MDA5MiwgMHg3MDE2LCAweDA4MGMsIDB4NDE0NCwgMHgwMGY2LCAweDIwNzEsIDB4MWE2YSwgMHgyMDc5LAorCTB4MDMyMCwgMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODg0LCAweGQwYjQsIDB4MDEyMCwgMHg2ODljLAorCTB4NzgwZSwgMHg2ODk4LCAweDc4MGEsIDB4MDBkZSwgMHgyMDA5LCAweDAzZTgsIDB4ODEwOSwgMHgxZGYwLAorCTB4NzkyYywgMHhkMWZjLCAweDAxMTAsIDB4NzgyYiwgMHgwMDA0LCAweDIwMTEsIDB4MDAxMSwgMHgwODBjLAorCTB4NDBkMCwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGQwLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDIwNzEsIDB4MWE2YSwgMHgyMDc5LCAweDAzMjAsIDB4NzkyYywgMHhkMWZjLAorCTB4MDkwNCwgMHg0MGNkLCAweDc4MmIsIDB4MDAwMiwgMHg5MDI2LCAweGQxOWMsIDB4MTkwNCwgMHg0MGM5LAorCTB4NzAwMCwgMHgwMDAyLCAweDQwY2QsIDB4NDA3ZSwgMHg0MGFlLCAweDQwYzksIDB4ZDFiYywgMHgxMTcwLAorCTB4ZDFkYywgMHgxMTkwLCAweDgwMDEsIDB4NzAwMiwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MGQwLAorCTB4MDkwNCwgMHg0MGNkLCAweDA4MGMsIDB4NDBkMCwgMHgwODA0LCAweDQwY2QsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDMwMCwgMHg3OGJmLCAweDAwMDAsIDB4MDBmZSwgMHg3ODEwLCAweDc5MTQsIDB4NzgyYiwgMHgwMDA0LAorCTB4NzgxMiwgMHg3OTE2LCAweDIwMDEsIDB4MDIwMSwgMHgyMDBjLCAweDgxZmYsIDB4MGRlOCwgMHgwODBjLAorCTB4M2ZkYiwgMHgyMDA5LCAweDAwMDEsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzhiOCwgMHgwMGZlLAorCTB4ZDBlYywgMHgwMTEwLCAweDIwMDksIDB4MDAxMSwgMHg3OTJhLCAweDAwZjgsIDB4ODAwMSwgMHg3MDAyLAorCTB4OTE4NCwgMHgwODgwLCAweDExNDAsIDB4NzgyYywgMHhkMGZjLCAweDE5MDQsIDB4NDA3MiwgMHgyMDExLAorCTB4MDAwMSwgMHgwMGIxLCAweDAwOTAsIDB4YTAxMCwgMHg5MDkyLCAweDAwMDQsIDB4OTA4NiwgMHgwMDE1LAorCTB4MTEyMCwgMHhhMDAwLCAweGEwNWEsIDB4MjAxMSwgMHgwMDMxLCAweGEyMTIsIDB4ZDFkYywgMHgxOTYwLAorCTB4MDgyOCwgMHg3ODJiLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4YTAxNCwgMHg5MDA1LCAweDA1NTAsIDB4ODAwMSwgMHgwMDM2LCAweDAwOTYsIDB4YTAxNiwgMHhhMDU4LAorCTB4MjA0OCwgMHhhMDEwLCAweDIwMDksIDB4MDAzMSwgMHg5MTFhLCAweDgzMWMsIDB4ODMxYywgMHg5MzhhLAorCTB4MDAwNywgMHgxYTBjLCAweDBkN2QsIDB4OTM5OCwgMHg0MGZlLCAweDIzMWQsIDB4MDgzZiwgMHg5MDgwLAorCTB4MDAwNCwgMHg3YTJhLCAweDcxMDAsIDB4ODEwOCwgMHg3MTAyLCAweDAwOWUsIDB4MDAzZSwgMHg5MDhhLAorCTB4MDAzNSwgMHgxMTQwLCAweDAwOTYsIDB4YTA1OCwgMHgyMDQ4LCAweGE4MDQsIDB4YTA1YSwgMHgyMDAxLAorCTB4MDAxOSwgMHgwMDllLCAweGEwMTIsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4NDEzYiwgMHg0MTMyLAorCTB4NDEyOSwgMHg0MTIwLCAweDQxMTcsIDB4NDEwZSwgMHg0MTA1LCAweGE5NjQsIDB4NzkwMiwgMHhhOTY4LAorCTB4NzkwNiwgMHhhOTZjLCAweDc5MTIsIDB4YTk3MCwgMHg3OTE2LCAweDAwMDUsIDB4YTk3NCwgMHg3OTAyLAorCTB4YTk3OCwgMHg3OTA2LCAweGE5N2MsIDB4NzkxMiwgMHhhOTgwLCAweDc5MTYsIDB4MDAwNSwgMHhhOTg0LAorCTB4NzkwMiwgMHhhOTg4LCAweDc5MDYsIDB4YTk4YywgMHg3OTEyLCAweGE5OTAsIDB4NzkxNiwgMHgwMDA1LAorCTB4YTk5NCwgMHg3OTAyLCAweGE5OTgsIDB4NzkwNiwgMHhhOTljLCAweDc5MTIsIDB4YTlhMCwgMHg3OTE2LAorCTB4MDAwNSwgMHhhOWE0LCAweDc5MDIsIDB4YTlhOCwgMHg3OTA2LCAweGE5YWMsIDB4NzkxMiwgMHhhOWIwLAorCTB4NzkxNiwgMHgwMDA1LCAweGE5YjQsIDB4NzkwMiwgMHhhOWI4LCAweDc5MDYsIDB4YTliYywgMHg3OTEyLAorCTB4YTljMCwgMHg3OTE2LCAweDAwMDUsIDB4YTljNCwgMHg3OTAyLCAweGE5YzgsIDB4NzkwNiwgMHhhOWNjLAorCTB4NzkxMiwgMHhhOWQwLCAweDc5MTYsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDA4NiwgMHgyMDcxLAorCTB4MTllNiwgMHgyMDc5LCAweDAwOTAsIDB4NzkyYywgMHhkMWZjLCAweDAxZTgsIDB4NzgyYiwgMHgwMDAyLAorCTB4Mjk0MCwgMHg5MDI2LCAweDcwNTQsIDB4MDAwMiwgMHg0MTZiLCAweDQxNTcsIDB4NDE2MiwgMHg4MDAxLAorCTB4NzA1NiwgMHhkMTljLCAweDExODAsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDBkMCwgMHgxOTBjLAorCTB4NDBkMCwgMHgwMDQ4LCAweDgwMDEsIDB4NzA1NiwgMHg3ODJjLCAweGQwZmMsIDB4MWQzOCwgMHgyMDExLAorCTB4MDAwMSwgMHgwODBjLCAweDQwZDAsIDB4MDA4ZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MjA2MSwgMHgwMjAwLCAweDIwMDEsIDB4MTlhOSwgMHgyMDA0LAorCTB4NjAxYSwgMHgyMDYxLCAweDAxMDAsIDB4MjAwMSwgMHgxOWE4LCAweDIwMDQsIDB4NjBjZSwgMHg2MTA0LAorCTB4YzFhYywgMHg2MTA2LCAweDIwMDEsIDB4MDAyYywgMHgyMDA0LCAweDkwMDUsIDB4MDUyMCwgMHgyMDM4LAorCTB4MjAwMSwgMHgwMDJlLCAweDIwMjQsIDB4MjAwMSwgMHgwMDJmLCAweDIwMWMsIDB4MDgwYywgMHg0YWYyLAorCTB4YTgxMywgMHgwMDE5LCAweGFmMTYsIDB4MjkwMCwgMHhhODVhLCAweDk3OGEsIDB4MDAwNywgMHgwMjIwLAorCTB4MjEzOCwgMHgyMDA5LCAweDAwMDcsIDB4MDAxMCwgMHgyNzA4LCAweDkwM2UsIDB4MDA5NiwgMHhhODU4LAorCTB4MjA0OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgwMDllLCAweDA4MGMsIDB4NDFlNywgMHgxZDY4LAorCTB4MjkwMCwgMHhhODVhLCAweDAwZDAsIDB4MDgwYywgMHg0YWYyLCAweGE4MTMsIDB4MDAxOSwgMHhhODE3LAorCTB4MDAwMSwgMHgyOTAwLCAweGE4NWEsIDB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLAorCTB4MDAyZiwgMHgyMDA0LCAweGE4NmEsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LAorCTB4YTg2ZSwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwgMHhhODcyLCAweDIwNjEsIDB4MDA5MCwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDAxLCAweDE5YTgsIDB4MjAwNCwgMHg2MDM2LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLAorCTB4MjIwYSwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4NjAxYSwgMHgwMDA2LAorCTB4MjAwMSwgMHgwMDJiLCAweDIwMDQsIDB4NjAxZSwgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHg5MDA2LAorCTB4NjAwYSwgMHg2MDBlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgwMDgwLCAweGFhNjAsIDB4MjJlOCwgMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LAorCTB4MDA4OCwgMHg3MDJiLCAweDAwMjYsIDB4NzQwMiwgMHg3MzA2LCAweDkwMDYsIDB4NzAwYSwgMHg3MDBlLAorCTB4ODEwYiwgMHg4MTBiLCAweDIxYTgsIDB4ODEwYiwgMHg3MTEyLCAweDcwMmIsIDB4MDA0MSwgMHg3MDJjLAorCTB4ZDBmYywgMHgwZGU4LCAweDcwMmIsIDB4MDAwMiwgMHg3MDJiLCAweDAwNDAsIDB4NDAwNSwgMHg3NDAwLAorCTB4NzMwNCwgMHg4N2ZmLCAweDAxOTAsIDB4MDA4NiwgMHgwMDk2LCAweDI5NDAsIDB4MDA4NiwgMHgwODBjLAorCTB4NGFmMiwgMHgwMDhlLCAweGEwNTgsIDB4MDBhNiwgMHgyMDUwLCAweDI5MDAsIDB4YjAwNiwgMHhhMDVhLAorCTB4MDBhZSwgMHgwMDllLCAweDAwOGUsIDB4OTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjAwMSwgMHgwMDJkLCAweDIwMDQsIDB4OTAwNSwgMHgwNTI4LCAweDIwMzgsIDB4MjAwMSwgMHgwMDMwLAorCTB4MjAyNCwgMHgyMDAxLCAweDAwMzEsIDB4MjAxYywgMHgwODBjLCAweDRhZjIsIDB4Mjk0MCwgMHhhODEzLAorCTB4MDAxOSwgMHhhZjE2LCAweDI5MDAsIDB4YTg1YSwgMHg5NzhhLCAweDAwMDcsIDB4MDIyMCwgMHgyMTM4LAorCTB4MjAwOSwgMHgwMDA3LCAweDAwMTAsIDB4MjcwOCwgMHg5MDNlLCAweDAwOTYsIDB4YTg1OCwgMHgyMDQ4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MDA5ZSwgMHgwODBjLCAweDQxZTcsIDB4MWQ2OCwgMHgyOTAwLAorCTB4YTg1YSwgMHgwMGQ4LCAweDA4MGMsIDB4NGFmMiwgMHgyOTQwLCAweGEwMTMsIDB4MDAxOSwgMHhhMDE3LAorCTB4MDAwMSwgMHgyODAwLCAweGEwNWEsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTA2NiwgMHgyMDAxLAorCTB4MDAzMSwgMHgyMDA0LCAweGEwNmEsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LAorCTB4YTA2ZSwgMHgyMDAxLCAweDAwMmIsIDB4MjAwNCwgMHhhMDcyLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLAorCTB4MDAwNCwgMHg3ODg0LCAweGQwYWMsIDB4MTE4MCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHg5MThkLAorCTB4MDIwMCwgMHgyMTAyLCAweGEwMTcsIDB4MDAwMCwgMHgyMDAxLCAweDFhNmEsIDB4MjAwMywgMHgwMDAzLAorCTB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwOSwgMHgyMDAxLCAweDAzMDAsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThkLAorCTB4MDAwMiwgMHgyMTAyLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LAorCTB4MDAwNywgMHgyMGExLCAweDE4NDAsIDB4MjBlOSwgMHgwMDAxLCAweDkwMDYsIDB4NDAwNCwgMHgyMGE5LAorCTB4MDAxNCwgMHgyMGExLCAweGZmZWMsIDB4MjBlOSwgMHgwMDAwLCAweDkwMDYsIDB4NDAwNCwgMHgyMDA5LAorCTB4MDEzYywgMHgyMDBhLCAweDAxMmUsIDB4Nzg4MCwgMHg5MDg2LCAweDAwNTIsIDB4MDEwOCwgMHgwMDA1LAorCTB4MDgwNCwgMHgzNWI4LCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM2YmEsIDB4MDgwYywgMHg3NTNkLAorCTB4MTkwYywgMHg2MDU3LCAweDYwNDAsIDB4OTA4NCwgMHgwMDIwLCAweDA5YjEsIDB4MjA2OSwgMHgxODQ3LAorCTB4MmQwMCwgMHgyMDA5LCAweDAwMzAsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgyMDM5LAorCTB4MDAwMSwgMHgwODBjLCAweDRiM2IsIDB4NzAxZiwgMHg0MmM2LCAweDAwMDUsIDB4MDgwYywgMHg1NzRkLAorCTB4MTEzMCwgMHgzYjAwLCAweDNhMDgsIDB4YzE5NCwgMHhjMDk1LCAweDIwZDgsIDB4MjFkMCwgMHgyMDY5LAorCTB4MTg0NywgMHg2ODAwLCAweDkwMDUsIDB4MDkwNCwgMHgzNWVkLCAweDY4MDQsIDB4ZDBhYywgMHgwMTE4LAorCTB4ZDBhNCwgMHgwOTA0LCAweDM1ZWQsIDB4ZDA5NCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LAorCTB4MDEzOCwgMHg2MjAwLCAweDkyOTIsIDB4MDAwNSwgMHgwMjE4LCAweDkxOGMsIDB4ZmZkZiwgMHgwMDEwLAorCTB4OTE4ZCwgMHgwMDIwLCAweDYxMDYsIDB4MDBjZSwgMHhkMDhjLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjEwNCwgMHgwMTE4LCAweDkxOGQsIDB4MDAxMCwgMHgwMDEwLCAweDkxOGMsIDB4ZmZlZiwgMHg2MTA2LAorCTB4MDBjZSwgMHhkMDg0LCAweDAxNTgsIDB4NmEyOCwgMHg5MjhhLCAweDAwN2YsIDB4MWEwNCwgMHgzNWVkLAorCTB4OTI4OCwgMHgzM2I5LCAweDIxMGQsIDB4OTE4YywgMHgwMGZmLCAweDYxNjYsIDB4ZDBkYywgMHgwMTMwLAorCTB4NjgyOCwgMHg5MDhhLCAweDAwN2YsIDB4MWEwNCwgMHgzNWVkLCAweDYwNWUsIDB4Njg4OCwgMHg5MDg0LAorCTB4MDAzMCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDAwMDYsIDB4MjAwOSwgMHgxOWIwLAorCTB4OTA4MCwgMHgyNzlkLCAweDIwMDUsIDB4MjAwYSwgMHgyMDA4LCAweDIwMDEsIDB4MDAxOCwgMHgwODBjLAorCTB4YTkwZiwgMHgyMDA5LCAweDAzOTAsIDB4MjAwYiwgMHgwNDAwLCAweDAwMGUsIDB4MjAwOSwgMHgxOWIxLAorCTB4OTA4MCwgMHgyN2ExLCAweDIwMDUsIDB4MjAwYSwgMHg2ODA4LCAweDkwOGEsIDB4MDEwMCwgMHgwYTA0LAorCTB4MzVlZCwgMHg5MDhhLCAweDA4NDEsIDB4MWEwNCwgMHgzNWVkLCAweDkwODQsIDB4MDAwNywgMHgxOTA0LAorCTB4MzVlZCwgMHg2ODBjLCAweDkwMDUsIDB4MDkwNCwgMHgzNWVkLCAweDY4MTAsIDB4OTAwNSwgMHgwOTA0LAorCTB4MzVlZCwgMHg2ODQ4LCAweDY5NDAsIDB4OTEwYSwgMHgxYTA0LCAweDM1ZWQsIDB4ODAwMSwgMHgwOTA0LAorCTB4MzVlZCwgMHg2ODRjLCAweDY5NDQsIDB4OTEwYSwgMHgxYTA0LCAweDM1ZWQsIDB4ODAwMSwgMHgwOTA0LAorCTB4MzVlZCwgMHg2ODE0LCAweDkwOGMsIDB4MDBmZiwgMHg2MTRlLCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLAorCTB4NjA1MiwgMHgwODBjLCAweDc4NzEsIDB4MDgwYywgMHg2YjBmLCAweDA4MGMsIDB4NmI0MywgMHg2ODA4LAorCTB4NjAyYSwgMHgwODBjLCAweDIxN2MsIDB4MjAwOSwgMHgwMTcwLCAweDIwMGIsIDB4MDA4MCwgMHhhMDAxLAorCTB4YTAwMSwgMHgyMDBiLCAweDAwMDAsIDB4MDAzNiwgMHg2YjA4LCAweDA4MGMsIDB4MjcwNCwgMHgwMDNlLAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MTkwNCwgMHg0NDUxLCAweDY4MTgsIDB4NjkxYywgMHg2YTIwLAorCTB4NmIyNCwgMHg4MDA3LCAweDgxMGYsIDB4ODIxNywgMHg4MzFmLCAweDYwMTYsIDB4NjExYSwgMHg2MjFlLAorCTB4NjMyMiwgMHg2YzA0LCAweGQ0ZjQsIDB4MDE0OCwgMHg2ODMwLCAweDY5MzQsIDB4NmEzOCwgMHg2YjNjLAorCTB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHgwMDEwLCAweDkwODQsIDB4ZjBmZiwgMHg2MDA2LAorCTB4NjEwYSwgMHg2MjBlLCAweDYzMTIsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMGExLCAweDE5YjIsIDB4MjBlOSwgMHgwMDAxLCAweDQwMDEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjBhMSwgMHgxOWNjLCAweDIwZTksIDB4MDAwMSwgMHg0MDAxLCAweDA4MGMsIDB4ODg1YiwgMHgwMGM2LAorCTB4OTAwZSwgMHgyMGE5LCAweDAwMDEsIDB4NmI3MCwgMHhkMzg0LCAweDAxYzgsIDB4MDAyMCwgMHg4MzlkLAorCTB4MTJiMCwgMHgzNTA4LCAweDgxMDksIDB4MDgwYywgMHg3ZTMzLCAweDY4NzgsIDB4NjAxNiwgMHg2ODc0LAorCTB4MjAwOCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg2MDBhLCAweDkxODQsIDB4MDBmZiwgMHg2MDA2LAorCTB4ODEwOCwgMHgxMTE4LCAweDYwMDMsIDB4MDAwMywgMHgwMDEwLCAweDYwMDMsIDB4MDAwMSwgMHgxZjA0LAorCTB4NDNhZiwgMHgwMGNlLCAweDAwYzYsIDB4MjA2MSwgMHgxOTliLCAweDZhODgsIDB4OTI4NCwgMHhjMDAwLAorCTB4MjAxMCwgMHg5Mjg2LCAweDAwMDAsIDB4MTE1OCwgMHgyMDYzLCAweDAwMDAsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHgyOWFiLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI5OGUsIDB4MDA4OCwgMHg5Mjg2LAorCTB4NDAwMCwgMHgxMTQ4LCAweDIwNjMsIDB4MDAwMSwgMHg5MDA2LCAweDA4MGMsIDB4MjlhYiwgMHg5MDA2LAorCTB4MDgwYywgMHgyOThlLCAweDAwMjgsIDB4OTI4NiwgMHg4MDAwLCAweDFkMzAsIDB4MjA2MywgMHgwMDAyLAorCTB4MDBjZSwgMHgwMGU2LCAweDJjNzAsIDB4MDgwYywgMHgwZWMxLCAweDAwZWUsIDB4Njg4OCwgMHhkMGVjLAorCTB4MDEzMCwgMHgyMDExLCAweDAxMTQsIDB4MjIwNCwgMHg5MDg1LCAweDAxODAsIDB4MjAxMiwgMHg2YTgwLAorCTB4OTI4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAzMCwgMHgxMTI4LCAweDkyOTQsIDB4ZmZjZiwgMHg5Mjk1LAorCTB4MDAyMCwgMHg2YTgyLCAweDIwMDEsIDB4MTk3YiwgMHg2YTgwLCAweDkyOTQsIDB4MDAzMCwgMHg5MjhlLAorCTB4MDAwMCwgMHgwMTcwLCAweDkyOGUsIDB4MDAxMCwgMHgwMTE4LCAweDkyOGUsIDB4MDAyMCwgMHgwMTQwLAorCTB4MjAwMywgMHhhYWFhLCAweDA4MGMsIDB4Mjc3OSwgMHgyMDAxLCAweDE5NmMsIDB4MjEwMiwgMHgwMDA4LAorCTB4MjEwMiwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLAorCTB4MDBjZSwgMHgwODBjLCAweDc1M2QsIDB4MDEyOCwgMHgwODBjLCAweDUwMjcsIDB4MDExMCwgMHgwODBjLAorCTB4MjZjYSwgMHg2MGQ0LCAweDkwMDUsIDB4MDFjMCwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHg0NDM5LAorCTB4MDBlMCwgMHgwODBjLCAweDc1M2QsIDB4MTE2OCwgMHgyMDExLCAweDczYjMsIDB4MDgwYywgMHg4NmM4LAorCTB4MjAxMSwgMHg3M2E2LCAweDA4MGMsIDB4ODdkNCwgMHgwODBjLCAweDc4NDUsIDB4MDgwYywgMHg3NDZlLAorCTB4MDA0MCwgMHgwODBjLCAweDVmNGQsIDB4MDAyOCwgMHg2MDAzLCAweDAwMDQsIDB4MjAwOSwgMHg0NDUxLAorCTB4MDAyMCwgMHgwODBjLCAweDZhM2YsIDB4MDgwNCwgMHgzNWI4LCAweDIwMDEsIDB4MDE3MCwgMHgyMDA0LAorCTB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDA0YywgMHgxMTE4LCAweDIwOTEsIDB4MzFiZCwgMHgwODE3LAorCTB4MjA5MSwgMHgzMTNkLCAweDA4MTcsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDkwNCwgMHgzNWVhLAorCTB4MjA2OSwgMHgxODQ3LCAweDc4OTAsIDB4Njg0MiwgMHg3ODk0LCAweDY4NDYsIDB4MmQwMCwgMHgyMDA5LAorCTB4MDAzMCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDIwMzksIDB4MDAwMSwgMHgwODA0LAorCTB4NGIzZSwgMHg5MDA2LCAweDA4MGMsIDB4MjZjYSwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4NzUzZCwgMHgxMWIwLCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4MDgwYywgMHgzM2FkLAorCTB4MDExOCwgMHg2MTMwLCAweGMxOGQsIDB4NjEzMiwgMHgwODBjLCAweGQwOWIsIDB4MDEzMCwgMHgwODBjLAorCTB4NzU2MCwgMHgxMTE4LCAweDA4MGMsIDB4NzUxMSwgMHgwMDM4LCAweDA4MGMsIDB4NzQ2ZSwgMHgwMDIwLAorCTB4MDgwYywgMHg2MDU3LCAweDA4MGMsIDB4NWY0ZCwgMHgwODA0LCAweDM1YjgsIDB4ODFmZiwgMHgxOTA0LAorCTB4MzVlYSwgMHgwODBjLCAweDc1M2QsIDB4MTExMCwgMHgwODA0LCAweDM1ZWEsIDB4NjE5NCwgMHg4MWZmLAorCTB4MDFhOCwgMHg3MDRmLCAweDAwMDAsIDB4MjAwMSwgMHgxZDgwLCAweDIwMDksIDB4MDA0MCwgMHg3YThjLAorCTB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAzOSwgMHgwMDAxLAorCTB4MDgwYywgMHg0YjNlLCAweDcwMWYsIDB4MzViNiwgMHgwMTJlLCAweDAwMDUsIDB4NzA0ZiwgMHgwMDAxLAorCTB4MDBkNiwgMHgyMDY5LCAweDFkODAsIDB4MjBhOSwgMHgwMDQwLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLAorCTB4MWQ4MCwgMHgyMDE5LCAweGZmZmYsIDB4NDMwNCwgMHg2NTVjLCAweDk1ODgsIDB4MzNiOSwgMHgyMTBkLAorCTB4OTE4YywgMHgwMGZmLCAweDIxNmEsIDB4OTAwZSwgMHgyMDExLCAweDAwMDIsIDB4MjEwMCwgMHg5NTA2LAorCTB4MDFhOCwgMHgwODBjLCAweDY2OTMsIDB4MTE5MCwgMHhiODE0LCAweDgyMWMsIDB4MDIzOCwgMHg5Mzk4LAorCTB4MWQ4MCwgMHg5MDg1LCAweGZmMDAsIDB4ODAwNywgMHgyMDFhLCAweDAwMzgsIDB4OTM5OCwgMHgxZDgwLAorCTB4MjMyNCwgMHg5NGE0LCAweGZmMDAsIDB4OTQwNSwgMHgyMDFhLCAweDgyMTAsIDB4ODEwOCwgMHg5MTgyLAorCTB4MDA4MCwgMHgxMjA4LCAweDBjMTgsIDB4ODIwMSwgMHg4MDA3LCAweDJkMGMsIDB4OTEwNSwgMHgyMDZhLAorCTB4MDBkZSwgMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHgxZDgwLCAweDIwOTksIDB4MWQ4MCwgMHgwODBjLAorCTB4NWZlMiwgMHgwODA0LCAweDQ0YWIsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLAorCTB4NGFmMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywgMHg1NzNlLAorCTB4ZDBiNCwgMHgwNTU4LCAweDc4ODQsIDB4OTA4ZSwgMHgwMDdlLCAweDA1MzgsIDB4OTA4ZSwgMHgwMDdmLAorCTB4MDUyMCwgMHg5MDhlLCAweDAwODAsIDB4MDUwOCwgMHgwODBjLCAweDMzYTgsIDB4MTE0OCwgMHhiODAwLAorCTB4ZDA4YywgMHgxMWQ4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgxMWE4LAorCTB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4Y2I0YiwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0NTM5LAorCTB4MDAwNSwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwgMHgzNWVkLCAweDIwYTksIDB4MDAyYiwgMHhiOGM0LAorCTB4MjBlMCwgMHhiOGM4LCAweDIwOTgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDAyLAorCTB4MjBhMCwgMHg0MDAzLCAweDIwYTksIDB4MDAwOCwgMHg5MDgwLCAweDAwMDYsIDB4MjBhMCwgMHhiOGM0LAorCTB4MjBlMCwgMHhiOGM4LCAweDkwODAsIDB4MDAwNiwgMHgyMDk4LCAweDA4MGMsIDB4MGZjNCwgMHgwMDcwLAorCTB4MjBhOSwgMHgwMDA0LCAweGE4NWMsIDB4OTA4MCwgMHgwMDBhLCAweDIwYTAsIDB4YjhjNCwgMHgyMGUwLAorCTB4YjhjOCwgMHg5MDgwLCAweDAwMGEsIDB4MjA5OCwgMHgwODBjLCAweDBmYzQsIDB4ODkwNiwgMHg4MDA2LAorCTB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwMiwgMHgyMDA5LAorCTB4MDAyYiwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MDQsIDB4NGIzZSwgMHg4MWZmLAorCTB4MTkwNCwgMHgzNWVhLCAweDA4MGMsIDB4NGIwOSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2OGQ4LAorCTB4MDkwNCwgMHgzNWVhLCAweDAwNTgsIDB4YTg3OCwgMHg5MDA1LCAweDAxMjAsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDgwNCwgMHgzNWVhLCAweGE5NzQsIDB4YWE5NCwgMHgwODA0LCAweDM1YjgsIDB4MDgwYywgMHg1NzQ2LAorCTB4MDkwNCwgMHgzNWI4LCAweDcwMWYsIDB4NDU4MywgMHg3MDA3LCAweDAwMDMsIDB4MDAwNSwgMHg4MWZmLAorCTB4MTkwNCwgMHgzNWVhLCAweDc4ODgsIDB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzVlZCwgMHgwODBjLAorCTB4NGIyNSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2YWRkLCAweDAxMjAsIDB4MDgwYywgMHg2YWU1LAorCTB4MTkwNCwgMHgzNWVkLCAweDA4MGMsIDB4Njk1ZCwgMHgwOTA0LCAweDM1ZWEsIDB4MjAxOSwgMHgwMDA0LAorCTB4OTAwZSwgMHgwODBjLCAweDY4ZWEsIDB4MDkwNCwgMHgzNWVhLCAweDc5ODQsIDB4N2E4OCwgMHgwNGM5LAorCTB4MDhhOCwgMHhhODljLCAweDkwOGEsIDB4MTAwMCwgMHgxMmY4LCAweDA4MGMsIDB4NGIyMywgMHgwMWUwLAorCTB4MDgwYywgMHg2YWRkLCAweDAxMTgsIDB4MDgwYywgMHg2YWU1LCAweDExYjAsIDB4MDgwYywgMHg2OTVkLAorCTB4MjAwOSwgMHgwMDAyLCAweDAxNjgsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLAorCTB4NjhlYSwgMHgyMDA5LCAweDAwMDMsIDB4MDEyMCwgMHhhOTk4LCAweGFhOWMsIDB4MDBkMSwgMHgwMDYwLAorCTB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LAorCTB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MDgwYywgMHg1NzQ2LAorCTB4MDExMCwgMHg5MDA2LCAweDAwMTgsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDAwNSwgMHg5MTg2LCAweDAwZmYsIDB4MDExMCwgMHgwMDcxLCAweDAwNjAsIDB4MjAyOSwgMHgwMDdlLAorCTB4MjA2MSwgMHgxODAwLCAweDY0NWMsIDB4MjQwMCwgMHg5NTA2LCAweDAxMTAsIDB4MjUwOCwgMHgwMDE5LAorCTB4ODUyOSwgMHgxZWM4LCAweDAwMDUsIDB4MDgwYywgMHg2NjkzLCAweDExMzgsIDB4MjIwMCwgMHg4MDAzLAorCTB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4MDgwYywgMHg4NmQ2LCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LAorCTB4MzVlYSwgMHg3OThjLCAweDIwMDEsIDB4MTk3ZiwgMHg5MThjLCAweDgwMDAsIDB4MjEwMiwgMHgwODBjLAorCTB4NGIwOSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2YWRkLCAweDAxMjAsIDB4MDgwYywgMHg2YWU1LAorCTB4MTkwNCwgMHgzNWVkLCAweDA4MGMsIDB4Njc1YSwgMHgwOTA0LCAweDM1ZWEsIDB4MDgwYywgMHg2OGUxLAorCTB4MDkwNCwgMHgzNWVhLCAweDIwMDEsIDB4MTk3ZiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgzNWI4LAorCTB4MDgwNCwgMHg0NThlLCAweGE5YTAsIDB4MjAwMSwgMHgxOTdmLCAweDkxOGMsIDB4ODAwMCwgMHhjMThkLAorCTB4MjEwMiwgMHgwODBjLCAweDRiMTYsIDB4MDFhMCwgMHgwODBjLCAweDZhZGQsIDB4MDExOCwgMHgwODBjLAorCTB4NmFlNSwgMHgxMTcwLCAweDA4MGMsIDB4Njc1YSwgMHgyMDA5LCAweDAwMDIsIDB4MDEyOCwgMHgwODBjLAorCTB4NjhlMSwgMHgxMTcwLCAweDIwMDksIDB4MDAwMywgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLAorCTB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LAorCTB4YTg5NywgMHg0MDAwLCAweDIwMDEsIDB4MTk3ZiwgMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwgMHgwODBjLAorCTB4NTc0NiwgMHgwMTEwLCAweDkwMDYsIDB4MDAxOCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAwMCwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgzNWVhLCAweDc5OGMsIDB4MjAwMSwgMHgxOTdlLAorCTB4OTE4YywgMHg4MDAwLCAweDIxMDIsIDB4MDgwYywgMHg0YjA5LCAweDA5MDQsIDB4MzVlZCwgMHgwODBjLAorCTB4NmFkZCwgMHgwMTIwLCAweDA4MGMsIDB4NmFlNSwgMHgxOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg2NzVhLAorCTB4MDkwNCwgMHgzNWVhLCAweDA4MGMsIDB4NjhjZiwgMHgwOTA0LCAweDM1ZWEsIDB4MjAwMSwgMHgxOTdlLAorCTB4MjAwNCwgMHhkMGZjLCAweDE5MDQsIDB4MzViOCwgMHgwODA0LCAweDQ1OGUsIDB4YTlhMCwgMHgyMDAxLAorCTB4MTk3ZSwgMHg5MThjLCAweDgwMDAsIDB4YzE4ZCwgMHgyMTAyLCAweDA4MGMsIDB4NGIxNiwgMHgwMWEwLAorCTB4MDgwYywgMHg2YWRkLCAweDAxMTgsIDB4MDgwYywgMHg2YWU1LCAweDExNzAsIDB4MDgwYywgMHg2NzVhLAorCTB4MjAwOSwgMHgwMDAyLCAweDAxMjgsIDB4MDgwYywgMHg2OGNmLCAweDExNzAsIDB4MjAwOSwgMHgwMDAzLAorCTB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LAorCTB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MjAwMSwgMHgxOTdlLAorCTB4MjAwNCwgMHhkMGZjLCAweDExMjgsIDB4MDgwYywgMHg1NzQ2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDE4LAorCTB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4NjEwMCwgMHgwODA0LAorCTB4MzViOCwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NTc1MiwgMHgxOTA0LAorCTB4MzVlYSwgMHg3OWE4LCAweGQxODQsIDB4MTE1OCwgMHhiODM0LCAweDgwMDcsIDB4Nzg5ZSwgMHhiODMwLAorCTB4ODAwNywgMHg3ODlhLCAweGJiMmMsIDB4ODMxZiwgMHhiYTI4LCAweDgyMTcsIDB4MDA1MCwgMHhiODI0LAorCTB4ODAwNywgMHg3ODllLCAweGI4MjAsIDB4ODAwNywgMHg3ODlhLCAweGJiMWMsIDB4ODMxZiwgMHhiYTE4LAorCTB4ODIxNywgMHhiOTAwLCAweDkxOGMsIDB4MDIwMiwgMHgwODA0LCAweDM1YjgsIDB4NzhhOCwgMHg5MDljLAorCTB4MDAwMywgMHhkMGFjLCAweDExNTAsIDB4ZDBiNCwgMHgxMTQwLCAweDkzOWEsIDB4MDAwMywgMHgxYTA0LAorCTB4MzVlYSwgMHg2MjVjLCAweDc4ODQsIDB4OTIwNiwgMHgxNTQ4LCAweDA4MGMsIDB4ODg0NSwgMHgyMDAxLAorCTB4ZmZlYywgMHgyMDA5LCAweDAwMGMsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgyMDM5LAorCTB4MDAwMCwgMHgwMDA2LCAweDc4YTgsIDB4OTA4NCwgMHgwMDgwLCAweDExMTgsIDB4MDAwZSwgMHgwODA0LAorCTB4NGIzZSwgMHgwMDBlLCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhNjZhLAorCTB4YTE3YSwgMHhhNzcyLCAweGEwNzYsIDB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwgMHgwODBjLAorCTB4MTEzYywgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHg0NzQ2LCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LAorCTB4MzVlYSwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwgMHgzNWVkLCAweDA4MGMsIDB4NmFkZCwgMHgxOTA0LAorCTB4MzVlYSwgMHgwMGM2LCAweDA4MGMsIDB4NGFmMiwgMHgwMGNlLCAweDA5MDQsIDB4MzVlYSwgMHhhODY3LAorCTB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHg3ZWE4LCAweDA4MGMsIDB4Y2FmMSwgMHgwOTA0LAorCTB4MzVlYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0NzRhLCAweDAwMDUsIDB4MDgwYywgMHg0MjhjLAorCTB4MDgwNCwgMHgzNWI4LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MzVlYSwgMHg4OTA2LAorCTB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLAorCTB4MjAwOSwgMHgwMDBjLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwNCwgMHg0YjNlLAorCTB4OTAwNiwgMHgwODBjLCAweDI2Y2EsIDB4NzhhOCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMGZmLAorCTB4MDExOCwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwgMHgwODBjLCAweDc1M2QsIDB4MDExMCwgMHgwODBjLAorCTB4NjA1NywgMHg3ODg4LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1ZWQsIDB4Nzk4NCwgMHg5MTg2LAorCTB4MDBmZiwgMHgwMTM4LCAweDkxODIsIDB4MDA3ZiwgMHgxYTA0LCAweDM1ZWQsIDB4MjEwMCwgMHgwODBjLAorCTB4MjY5NCwgMHgwMDI2LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHgxYTAyLAorCTB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHg2MDczLCAweDAwMDAsIDB4NjA3NywgMHgwMDAwLAorCTB4MDgwYywgMHg3NTNkLCAweDExNTgsIDB4MDgwYywgMHg3ODQwLCAweDA4MGMsIDB4NjA5MiwgMHg5MDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDc1ODQsIDB4MDgwYywgMHg3NDZlLCAweDAwZjAsIDB4MDgwYywgMHhhOTFlLAorCTB4MDgwYywgMHhhYmU5LCAweDA4MGMsIDB4YTkzYSwgMHgyMDYxLCAweDAxMDAsIDB4MjAwMSwgMHgxODE4LAorCTB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4ODEwZiwgMHg5MTA1LCAweDYwNGEsIDB4NjA0MywgMHgwMDkwLAorCTB4NjA0MywgMHgwMDEwLCAweDIwMDksIDB4MTk5OCwgMHgyMDBiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDJkLAorCTB4MjAxMSwgMHg1ZjdkLCAweDA4MGMsIDB4ODc5MiwgMHg3OTg0LCAweDA4MGMsIDB4NzUzZCwgMHgxMTEwLAorCTB4MjAwOSwgMHgwMGZmLCAweDdhODgsIDB4MDgwYywgMHg0NWYxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDJlLAorCTB4MDgwNCwgMHgzNWI4LCAweDc5ODQsIDB4MDgwYywgMHg2NjMyLCAweDJiMDgsIDB4MTkwNCwgMHgzNWVkLAorCTB4MDgwNCwgMHgzNWI4LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWVhLAorCTB4NjBkYywgMHhkMGFjLCAweDExMzAsIDB4ZDA5YywgMHgxMTIwLCAweDIwMDksIDB4MDAwNSwgMHgwODA0LAorCTB4MzVlYSwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLAorCTB4Nzk4NCwgMHg5MTkyLCAweDAwMjEsIDB4MWEwNCwgMHgzNWVkLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLAorCTB4N2Q5OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHg3MDJhLCAweGFmNjAsIDB4NzczNiwgMHgwODBjLAorCTB4NGIzYiwgMHg3MDFmLCAweDQ4MDIsIDB4Nzg4MCwgMHg5MDg2LCAweDAwNmUsIDB4MDExMCwgMHg3MDFmLAorCTB4NTFkOSwgMHgwMDA1LCAweDIwMDksIDB4MDA4MCwgMHgwODBjLCAweDY2OTMsIDB4MTExOCwgMHgwODBjLAorCTB4NmFkZCwgMHgwMTIwLCAweDIwMjEsIDB4NDAwYSwgMHgwODA0LCAweDM1YmEsIDB4MDBkNiwgMHgwMDk2LAorCTB4YTk2NCwgMHhhYTZjLCAweGFiNzAsIDB4YWM3NCwgMHhhZDc4LCAweGFlN2MsIDB4YTg4NCwgMHg5MGJlLAorCTB4MDEwMCwgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwgMHgwMTEyLCAweDA5MDQsIDB4NDg5YiwgMHg5MGJlLAorCTB4MDExMywgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwgMHgwMTE0LCAweDA5MDQsIDB4NDg5YiwgMHg5MGJlLAorCTB4MDExNywgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwgMHgwMTFhLCAweDA5MDQsIDB4NDg5YiwgMHg5MGJlLAorCTB4MDExYywgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwgMHgwMTIxLCAweDA5MDQsIDB4NDg4MiwgMHg5MGJlLAorCTB4MDEzMSwgMHgwOTA0LCAweDQ4ODIsIDB4OTBiZSwgMHgwMTcxLCAweDA5MDQsIDB4NDg5YiwgMHg5MGJlLAorCTB4MDE3MywgMHgwOTA0LCAweDQ4OWIsIDB4OTBiZSwgMHgwMWExLCAweDExMjgsIDB4YTg5NCwgMHg4MDA3LAorCTB4YTg5NiwgMHgwODA0LCAweDQ4YTYsIDB4OTBiZSwgMHgwMjEyLCAweDA5MDQsIDB4NDg4ZiwgMHg5MGJlLAorCTB4MDIxMywgMHgwNWU4LCAweDkwYmUsIDB4MDIxNCwgMHgwNTAwLCAweDkwYmUsIDB4MDIxNywgMHgwMTg4LAorCTB4OTBiZSwgMHgwMjFhLCAweDExMjAsIDB4YTg5YywgMHg4MDA3LCAweGE4OWUsIDB4MDRlMCwgMHg5MGJlLAorCTB4MDIxZiwgMHgwNWM4LCAweDkwYmUsIDB4MDMwMCwgMHgwNWIwLCAweDAwOWUsIDB4MDBkZSwgMHgwODA0LAorCTB4MzVlZCwgMHg3MDI4LCAweDkwODAsIDB4MDAxMCwgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwgMHgyMGUwLAorCTB4MjBlOCwgMHgyMGE5LCAweDAwMDcsIDB4MDgwYywgMHg0OGU0LCAweDcwMjgsIDB4OTA4MCwgMHgwMDBlLAorCTB4MjA5OCwgMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwMSwgMHgwODBjLAorCTB4NDhlNCwgMHgwMGM4LCAweDcwMjgsIDB4OTA4MCwgMHgwMDBjLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LAorCTB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwMSwgMHgwODBjLCAweDQ4ZjEsIDB4MDBiOCwgMHg3MDI4LAorCTB4OTA4MCwgMHgwMDBlLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwgMHgyMGE5LAorCTB4MDAwMSwgMHgwODBjLCAweDQ4ZjEsIDB4NzAyOCwgMHg5MDgwLCAweDAwMGMsIDB4MjA5OCwgMHgyMGEwLAorCTB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwgMHgwMDAxLCAweDA0ZjEsIDB4MDBjNiwgMHgwODBjLAorCTB4NGFmMiwgMHgwNTUwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweGE4NjcsIDB4MDExOSwgMHg5MDA2LAorCTB4YTg4MiwgMHhhODdmLCAweDAwMjAsIDB4YTg4YiwgMHgwMDAxLCAweDgxMGIsIDB4YTlhZSwgMHhhOGIyLAorCTB4YWFiNiwgMHhhYmJhLCAweGFjYmUsIDB4YWRjMiwgMHhhOWM2LCAweGE4Y2EsIDB4MDBjZSwgMHgwMDllLAorCTB4MDBkZSwgMHhhODY2LCAweGE4MjIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4YTgwNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhjYjBjLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFmLCAweDQ4ZGIsIDB4MDAwNSwgMHgwMGNlLCAweDAwOWUsIDB4MDBkZSwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4YTgyMCwgMHg5MDg2LCAweDgwMDEsIDB4MTkwNCwgMHgzNWI4LAorCTB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzVlYSwgMHgwMDE2LCAweDAwMjYsIDB4MzUxMCwgMHgyMGE5LAorCTB4MDAwMiwgMHg0MDAyLCAweDQxMDQsIDB4NDAwNCwgMHg4MjExLCAweDFkYzgsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDM1MjAsIDB4MjBhOSwgMHgwMDA0LAorCTB4NDAwMiwgMHg0MzA0LCAweDQyMDQsIDB4NDEwNCwgMHg0MDA0LCAweDg0MjEsIDB4MWRiOCwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgzNWVhLCAweDYwZGMsIDB4ZDBhYywgMHgxMTMwLCAweGQwOWMsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwNSwgMHgwODA0LCAweDM1ZWEsIDB4Nzk4NCwgMHg3OGE4LCAweDIwNDAsIDB4MDgwYywgMHhhYmUyLAorCTB4MTEyMCwgMHg5MTgyLCAweDAwN2YsIDB4MGEwNCwgMHgzNWVkLCAweDkxODYsIDB4MDBmZiwgMHgwOTA0LAorCTB4MzVlZCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHgzNWVkLCAweDdhOGMsIDB4N2I4OCwgMHg2MDdjLAorCTB4OTMwNiwgMHgxMTU4LCAweDYwODAsIDB4OTI0ZSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHhhYmUyLAorCTB4MTEyMCwgMHg5OWNjLCAweGZmMDAsIDB4MDkwNCwgMHgzNWVkLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg0YTA1LCAweDA5MDQsIDB4NDk4NSwgMHgwMDg2LCAweDkwYzYsIDB4NDAwMCwgMHgwMDhlLAorCTB4MTUzOCwgMHgwMGM2LCAweDAwMDYsIDB4MDAzNiwgMHhiODE4LCAweGJiMWMsIDB4OTMwNSwgMHhiYjIwLAorCTB4OTMwNSwgMHhiYjI0LCAweDkzMDUsIDB4YmIyOCwgMHg5MzA1LCAweGJiMmMsIDB4OTMwNSwgMHhiYjMwLAorCTB4OTMwNSwgMHhiYjM0LCAweDkzMDUsIDB4MDAzZSwgMHgwNTcwLCAweGQ4OGMsIDB4MTEyOCwgMHgwODBjLAorCTB4NmFkZCwgMHgwMTEwLCAweGM4OWQsIDB4MDQzOCwgMHg5MDBlLCAweDA4MGMsIDB4Njk4NiwgMHgxMTA4LAorCTB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDAwMGUsIDB4MDBjZSwgMHgwMGI4LAorCTB4OTBjNiwgMHg0MDA3LCAweDExMTAsIDB4MjQwOCwgMHgwMDkwLCAweDkwYzYsIDB4NDAwOCwgMHgxMTE4LAorCTB4MjcwOCwgMHgyNjEwLCAweDAwNjAsIDB4OTBjNiwgMHg0MDA5LCAweDExMDgsIDB4MDA0MCwgMHg5MGM2LAorCTB4NDAwNiwgMHgxMTA4LCAweDAwMjAsIDB4MjAwMSwgMHg0MDA1LCAweDIwMDksIDB4MDAwYSwgMHgyMDIwLAorCTB4MDEyZSwgMHgwODA0LCAweDM1YmEsIDB4MDAwZSwgMHgwMGNlLCAweDJiMDAsIDB4NzAyNiwgMHgwMDE2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZTYsIDB4MmM3MCwgMHgwODBjLCAweGFkMjAsIDB4MDkwNCwgMHg0OWRhLAorCTB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4Y2UxNSwgMHgyZTU4LCAweDAwZWUsIDB4MDBlNiwgMHgwMGM2LAorCTB4MDgwYywgMHg0YWYyLCAweDAwY2UsIDB4MmI3MCwgMHgxMTU4LCAweDA4MGMsIDB4YWNiMCwgMHgwMGVlLAorCTB4MDBjZSwgMHgwMGJlLCAweDAwMWUsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLAorCTB4OTAwZSwgMHhhOTY2LCAweGE5NmEsIDB4MjkwMCwgMHg2MDE2LCAweGE5MzIsIDB4YTg2OCwgMHhjMGZkLAorCTB4ZDg4YywgMHgwMTA4LCAweGMwZjUsIDB4YTg2YSwgMHhkODljLCAweDExMTAsIDB4MDgwYywgMHgzMjQwLAorCTB4NjAyMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLCAweGQ4OWMsIDB4MDEzOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwODBjLCAweDY1ZTMsIDB4MjAwOSwgMHgwMDAzLCAweDAwMzAsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg2NWUzLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweGFkNGQsIDB4NzhhOCwgMHhkMDk0LAorCTB4MDEzOCwgMHgwMGVlLCAweDcwMjQsIDB4MDBlNiwgMHgyMDU4LCAweGI4ZDQsIDB4YzA4ZCwgMHhiOGQ2LAorCTB4OTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMWUsIDB4MDEyZSwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0OWU5LAorCTB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHg3MDI0LCAweDIwNTgsIDB4MTEzOCwgMHgyMDA5LAorCTB4MDAwNCwgMHhiYTA0LCAweDkyOTQsIDB4MDBmZiwgMHgwODA0LCAweDU2OGMsIDB4OTAwZSwgMHhhODY4LAorCTB4ZDBmNCwgMHgxOTA0LCAweDM1YjgsIDB4MDgwYywgMHg2OTg2LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLAorCTB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDgwNCwgMHgzNWI4LCAweDAwZTYsIDB4MDBkNiwgMHgwMDk2LAorCTB4ODNmZiwgMHgwOTA0LCAweDRhNTQsIDB4OTAyZSwgMHgwODBjLCAweGFiZTIsIDB4MDEzMCwgMHg5MDI2LAorCTB4MjBhOSwgMHgwODAwLCAweDIwNzEsIDB4MTAwMCwgMHgwMDMwLCAweDIwMjEsIDB4MDA3ZiwgMHgyMGE5LAorCTB4MDc4MSwgMHgyMDcxLCAweDEwN2YsIDB4MmUwNCwgMHg5MDA1LCAweDExYjgsIDB4MjEwMCwgMHg5NDA2LAorCTB4MTkwNCwgMHg0YTY1LCAweDI0MjgsIDB4OTRjZSwgMHgwMDdmLCAweDExMjAsIDB4OTJjZSwgMHhmZmZkLAorCTB4MTU1OCwgMHgwMDMwLCAweDk0Y2UsIDB4MDA4MCwgMHgxMTMwLCAweDkyY2UsIDB4ZmZmYywgMHgxNTIwLAorCTB4OTNjZSwgMHgwMGZmLCAweDE1MDgsIDB4YzVmZCwgMHgwNDgwLCAweDIwNTgsIDB4YmYxMCwgMHgyNzAwLAorCTB4OTMwNiwgMHgxMWU4LCAweGJlMTQsIDB4MjYwMCwgMHg5MjA2LCAweDExYzgsIDB4MjQwMCwgMHg5MTA2LAorCTB4MTE4MCwgMHhkODg0LCAweDA1OTgsIDB4ZDg5NCwgMHgxNTg4LCAweDA4MGMsIDB4NmE3ZCwgMHgxNTcwLAorCTB4MjAwMSwgMHg0MDAwLCAweDA0NjAsIDB4MDgwYywgMHg2YWRkLCAweDE1NDAsIDB4MjAwMSwgMHg0MDAwLAorCTB4MDQzMCwgMHgyMDAxLCAweDQwMDcsIDB4MDQxOCwgMHgyMDAxLCAweDQwMDYsIDB4MDQwMCwgMHgyNDAwLAorCTB4OTEwNiwgMHgxMTU4LCAweGJlMTQsIDB4ODdmZiwgMHgxMTI4LCAweDg2ZmYsIDB4MDkxOCwgMHgwODBjLAorCTB4YWJlMiwgMHgxOTAwLCAweDIwMDEsIDB4NDAwOCwgMHgwMDkwLCAweDg0MjAsIDB4OGU3MCwgMHgxZjA0LAorCTB4NGExYiwgMHg4NWZmLCAweDExMzAsIDB4MjAwMSwgMHg0MDA5LCAweDAwNDgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDAzMCwgMHgwODBjLCAweDY2MzIsIDB4MWRkMCwgMHhiYjEyLCAweGJhMTYsIDB4OTAwNiwgMHg5MDA1LAorCTB4MDA5ZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NGFmMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MzVlYSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4Nzg4NCwgMHg5MDA1LAorCTB4MDkwNCwgMHgzNWVkLCAweDkwOTYsIDB4MDBmZiwgMHgwMTIwLCAweDkwOTIsIDB4MDAwNCwgMHgxYTA0LAorCTB4MzVlZCwgMHgyMDEwLCAweDI5MTgsIDB4MDgwYywgMHgzMWUwLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDgwNCwgMHgzNWVhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDRhYTcsIDB4MDAwNSwgMHhhODMwLAorCTB4OTA4NiwgMHgwMTAwLCAweDE5MDQsIDB4MzViOCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgzNWVhLAorCTB4Nzk4NCwgMHgwODBjLCAweGFiZTIsIDB4MTEyMCwgMHg5MTgyLCAweDAwN2YsIDB4MGEwNCwgMHgzNWVkLAorCTB4OTE4NiwgMHgwMGZmLCAweDA5MDQsIDB4MzVlZCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHgzNWVkLAorCTB4MjAwMSwgMHg5NDAwLCAweDA4MGMsIDB4NTZlNywgMHgxOTA0LCAweDM1ZWEsIDB4MDgwNCwgMHgzNWI4LAorCTB4YTk5OCwgMHgwODBjLCAweGFiZTIsIDB4MTExOCwgMHg5MTgyLCAweDAwN2YsIDB4MDI4MCwgMHg5MTg2LAorCTB4MDBmZiwgMHgwMTY4LCAweDkxODIsIDB4MDgwMCwgMHgxMjUwLCAweDIwMDEsIDB4OTQwMCwgMHgwODBjLAorCTB4NTZlNywgMHgxMWE4LCAweDAwNjAsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LAorCTB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LAorCTB4NDAwMCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDAwYSwgMHgwYzQ4LCAweDA4MGMsIDB4MTA0NywgMHgwMTk4LCAweDkwMDYsIDB4YTgwMiwgMHg3MDE0LAorCTB4OTAwNSwgMHgxMTIwLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDAwNDAsIDB4NzAxOCwgMHhhODAyLAorCTB4MDA4NiwgMHgyMDQwLCAweDI5MDAsIDB4YTAwNiwgMHg3MDFhLCAweDAwOGUsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHg3OTg0LCAweDA4MGMsIDB4NjY5MywgMHgxMTMwLCAweDdlODgsIDB4OTY4NCwgMHgzZmZmLAorCTB4OTA4MiwgMHg0MDAwLCAweDAyMDgsIDB4OTA1ZSwgMHg4YmZmLCAweDAwMDUsIDB4YTk5OCwgMHgwODBjLAorCTB4NjY5MywgMHgxMTMwLCAweGFlOWMsIDB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgwMjA4LAorCTB4OTA1ZSwgMHg4YmZmLCAweDAwMDUsIDB4YWU5OCwgMHgwMDA4LCAweDdlODQsIDB4MjYwOCwgMHgwODBjLAorCTB4NjY5MywgMHgxMTA4LCAweDAwMDgsIDB4OTA1ZSwgMHg4YmZmLCAweDAwMDUsIDB4MDAxNiwgMHg3MTE0LAorCTB4ODFmZiwgMHgwMTI4LCAweDIxNDgsIDB4YTkwNCwgMHgwODBjLCAweDEwNzksIDB4MGNjOCwgMHg3MTE2LAorCTB4NzExYSwgMHgwMDFlLCAweDAwMDUsIDB4MjAzMSwgMHgwMDAxLCAweDAwMTAsIDB4MjAzMSwgMHgwMDAwLAorCTB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTY2YSwgMHhhMTdhLCAweGE3NzIsIDB4YTA3NiwgMHhhMjhlLAorCTB4YTM5MiwgMHhhNDk2LCAweGE1OWEsIDB4MDgwYywgMHgxMTNjLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFmLAorCTB4MzViOCwgMHgwMDA1LCAweDAwZjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMDAwLAorCTB4MjAwMSwgMHgxOGIwLCAweDIwMDQsIDB4OTAwNSwgMHgxMTkwLCAweDBlMDQsIDB4NGI2ZiwgMHg3YTM2LAorCTB4NzgzMywgMHgwMDEyLCAweDdhODIsIDB4N2I4NiwgMHg3YzhhLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDA4MDQsIDB4NGJkNSwgMHgwMDE2LAorCTB4MDA4NiwgMHgwMDk2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDcxLCAweDE4OWUsIDB4NzA0NCwgMHg5MDA1LAorCTB4MTU0MCwgMHg3MTQ4LCAweDkxODIsIDB4MDAxMCwgMHgwMjg4LCAweDcwMzgsIDB4MjA2MCwgMHgwODBjLAorCTB4MTA0NywgMHgwOTA0LCAweDRiY2QsIDB4YTg0YiwgMHgwMDAwLCAweDI5MDAsIDB4NzA0NiwgMHgyMDAxLAorCTB4MDAwMiwgMHg5MDgwLCAweDFlYWIsIDB4MjAwNSwgMHhhODQ2LCAweDAwOTgsIDB4NzAzOCwgMHg5MGUwLAorCTB4MDAwNCwgMHgyMDAxLCAweDE4YmEsIDB4OWM4MiwgMHgxOGZhLCAweDAyMTAsIDB4MjA2MSwgMHgxOGJhLAorCTB4MmMwMCwgMHg3MDNhLCAweDcxNDgsIDB4ODFmZiwgMHgxMTA4LCAweDcwM2UsIDB4ODEwOCwgMHg3MTRhLAorCTB4MDQ2MCwgMHg3MTQ4LCAweDgxMDgsIDB4NzE0YSwgMHg3MDQ0LCAweDIwNDAsIDB4YTE0NCwgMHgyMTA1LAorCTB4MDAxNiwgMHg5MDhhLCAweDAwMzYsIDB4MWEwYywgMHgwZDdkLCAweDIwNjAsIDB4MDAxZSwgMHg4MTA4LAorCTB4MjEwNSwgMHg5MDA1LCAweGExNDYsIDB4MTUyMCwgMHgwODBjLCAweDEwNDcsIDB4MTEzMCwgMHg4MTA5LAorCTB4YTk0NiwgMHg3MTQ4LCAweDgxMDksIDB4NzE0YSwgMHgwMGQ4LCAweDkwMDYsIDB4YTgwNiwgMHhhODRhLAorCTB4YTA0NiwgMHgyODAwLCAweGE4MDIsIDB4MjkwMCwgMHhhMDA2LCAweDcwNDYsIDB4MjAwMSwgMHgwMDAyLAorCTB4OTA4MCwgMHgxZWFiLCAweDIwMDUsIDB4YTg0NiwgMHgwMDU4LCAweDIyNjIsIDB4NjMwNiwgMHg2NDBhLAorCTB4MDBlZSwgMHgwMGNlLCAweDAwOWUsIDB4MDA4ZSwgMHgwMDFlLCAweDAxMmUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MmMwMCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHg0YmY3LCAweDRiZjcsIDB4NGJmOSwgMHg0YmY3LAorCTB4NGJmNywgMHg0YmY3LCAweDRiZmQsIDB4NGJmNywgMHg0YmY3LCAweDRiZjcsIDB4NGMwMSwgMHg0YmY3LAorCTB4NGJmNywgMHg0YmY3LCAweDRjMDUsIDB4NGJmNywgMHg0YmY3LCAweDRiZjcsIDB4NGMwOSwgMHg0YmY3LAorCTB4NGJmNywgMHg0YmY3LCAweDRjMGQsIDB4NGJmNywgMHg0YmY3LCAweDRiZjcsIDB4NGMxMiwgMHgwODBjLAorCTB4MGQ3ZCwgMHhhMjc2LCAweGEzN2EsIDB4YTQ3ZSwgMHgwODk4LCAweGEyODYsIDB4YTM4YSwgMHhhNDhlLAorCTB4MDg3OCwgMHhhMjk2LCAweGEzOWEsIDB4YTQ5ZSwgMHgwODU4LCAweGEyYTYsIDB4YTNhYSwgMHhhNGFlLAorCTB4MDgzOCwgMHhhMmI2LCAweGEzYmEsIDB4YTRiZSwgMHgwODE4LCAweGEyYzYsIDB4YTNjYSwgMHhhNGNlLAorCTB4MDgwNCwgMHg0YmQwLCAweGEyZDYsIDB4YTNkYSwgMHhhNGRlLCAweDA4MDQsIDB4NGJkMCwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODllLCAweDcwNDgsIDB4OTAwNSwgMHgwOTA0LCAweDRjYTksIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwZTA0LCAweDRjYTgsIDB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4MDBjNiwgMHgwMDk2LAorCTB4MDA4NiwgMHgwMDc2LCAweDkwMDYsIDB4MjAzOCwgMHg3MDQwLCAweDIwNDgsIDB4OTAwNSwgMHgwNTAwLAorCTB4YTk0OCwgMHgyMTA1LCAweDAwMTYsIDB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGQ3ZCwgMHgyMDYwLAorCTB4MDAxZSwgMHg4MTA4LCAweDIxMDUsIDB4OTAwNSwgMHhhOTRhLCAweDE5MDQsIDB4NGNhYiwgMHhhODA0LAorCTB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4NzA0MiwgMHgyOTM4LCAweDIwNDAsIDB4YTAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MWVhYiwgMHgyMDA1LCAweGEwNGEsIDB4MDgwNCwgMHg0Y2FiLAorCTB4NzAzYywgMHgyMDYwLCAweDJjMTQsIDB4NjMwNCwgMHg2NDA4LCAweDY1MGMsIDB4MjIwMCwgMHg3ODM2LAorCTB4NzgzMywgMHgwMDEyLCAweDc4ODIsIDB4MjMwMCwgMHg3ODg2LCAweDI0MDAsIDB4Nzg4YSwgMHgyMDkxLAorCTB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlZSwgMHg4N2ZmLAorCTB4MDExOCwgMHgyNzQ4LCAweDA4MGMsIDB4MTA3OSwgMHg3MDQ4LCAweDgwMDEsIDB4NzA0YSwgMHg5MDA1LAorCTB4MTE3MCwgMHg3MDQwLCAweDIwNDgsIDB4OTAwNSwgMHgwMTI4LCAweDA4MGMsIDB4MTA3OSwgMHg5MDA2LAorCTB4NzA0MiwgMHg3MDQ2LCAweDcwM2IsIDB4MThiYSwgMHg3MDNmLCAweDE4YmEsIDB4MDQyMCwgMHg3MDQwLAorCTB4OTAwNSwgMHgxNTA4LCAweDcyMzgsIDB4MmMwMCwgMHg5MjA2LCAweDAxNDgsIDB4OWM4MCwgMHgwMDA0LAorCTB4OTBmYSwgMHgxOGZhLCAweDAyMTAsIDB4MjAwMSwgMHgxOGJhLCAweDcwM2UsIDB4MDBhMCwgMHg5MDA2LAorCTB4NzAzZSwgMHg3MDNhLCAweDcwNDQsIDB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4MjA0OCwgMHhhODAwLAorCTB4OTAwNSwgMHgxZGUwLCAweDI5MDAsIDB4NzA0MiwgMHgyMDAxLCAweDAwMDIsIDB4OTA4MCwgMHgxZWFiLAorCTB4MjAwNSwgMHhhODRhLCAweDAwMDAsIDB4MDA3ZSwgMHgwMDhlLCAweDAwOWUsIDB4MDBjZSwgMHgwMGZlLAorCTB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4MmMwMCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHg0Y2NhLAorCTB4NGNjYSwgMHg0Y2NjLCAweDRjY2EsIDB4NGNjYSwgMHg0Y2NhLCAweDRjZDEsIDB4NGNjYSwgMHg0Y2NhLAorCTB4NGNjYSwgMHg0Y2Q2LCAweDRjY2EsIDB4NGNjYSwgMHg0Y2NhLCAweDRjZGIsIDB4NGNjYSwgMHg0Y2NhLAorCTB4NGNjYSwgMHg0Y2UwLCAweDRjY2EsIDB4NGNjYSwgMHg0Y2NhLCAweDRjZTUsIDB4NGNjYSwgMHg0Y2NhLAorCTB4NGNjYSwgMHg0Y2VhLCAweDA4MGMsIDB4MGQ3ZCwgMHhhYTc0LCAweGFiNzgsIDB4YWM3YywgMHgwODA0LAorCTB4NGM1NiwgMHhhYTg0LCAweGFiODgsIDB4YWM4YywgMHgwODA0LCAweDRjNTYsIDB4YWE5NCwgMHhhYjk4LAorCTB4YWM5YywgMHgwODA0LCAweDRjNTYsIDB4YWFhNCwgMHhhYmE4LCAweGFjYWMsIDB4MDgwNCwgMHg0YzU2LAorCTB4YWFiNCwgMHhhYmI4LCAweGFjYmMsIDB4MDgwNCwgMHg0YzU2LCAweGFhYzQsIDB4YWJjOCwgMHhhY2NjLAorCTB4MDgwNCwgMHg0YzU2LCAweGFhZDQsIDB4YWJkOCwgMHhhY2RjLCAweDA4MDQsIDB4NGM1NiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwYjYsIDB4MDBjNiwgMHgyMDA5LCAweDAwN2UsIDB4MDgwYywgMHg2NjkzLAorCTB4MjAxOSwgMHgwMDAxLCAweGI4NWMsIDB4ZDBhYywgMHgwMTEwLCAweDIwMTksIDB4MDAwMCwgMHgyMDExLAorCTB4ODAxYiwgMHgwODBjLCAweDRiNTIsIDB4MDBjZSwgMHgwMGJlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDI2LCAweDA4MGMsIDB4NTczZSwgMHhkMGM0LCAweDAxMjAsIDB4MjAxMSwgMHg4MDE0LAorCTB4MDgwYywgMHg0YjUyLCAweDAwMmUsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYwMzAsIDB4YzA4ZCwgMHhjMDg1LCAweGMwYWMsIDB4NjAzMiwgMHgwODBjLAorCTB4NzUzZCwgMHgxMTU4LCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDgwYywgMHg3NTg0LCAweDA4MGMsIDB4NzQ2ZSwgMHgwMDEwLCAweDA4MGMsIDB4NWY0ZCwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNWI4LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWVhLAorCTB4MDgwYywgMHg1NzUyLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4NmFkNSwgMHgwMTIwLCAweDIwMDksIDB4MDAwOCwgMHgwODA0LCAweDM1ZWEsIDB4Nzk4NCwgMHgwODBjLAorCTB4NjYzMiwgMHgxOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg0YjI1LCAweDA5MDQsIDB4MzVlZCwgMHgyYjAwLAorCTB4NzAyNiwgMHgwODBjLCAweDZhZGQsIDB4Nzg4OCwgMHgxMTcwLCAweDkwODQsIDB4MDAwNSwgMHgxMTU4LAorCTB4OTAwZSwgMHgwODBjLCAweDY5ODYsIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LAorCTB4YzE4ZCwgMHgwODA0LCAweDM1YjgsIDB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzVlYSwgMHg5MDA2LAorCTB4YTg2NiwgMHhhODMyLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4Y2JiMywgMHgwOTA0LAorCTB4MzVlYSwgMHg3ODg4LCAweGQwOTQsIDB4MDExOCwgMHhiOGQ0LCAweGMwOGQsIDB4YjhkNiwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFmLCAweDRkYzUsIDB4MDAwNSwgMHgyMDYxLCAweDE4MDAsIDB4MDgwYywgMHg1NzUyLAorCTB4MjAwOSwgMHgwMDA3LCAweDE1NjAsIDB4MDgwYywgMHg2YWQ1LCAweDAxMTgsIDB4MjAwOSwgMHgwMDA4LAorCTB4MDQzMCwgMHhhOTk4LCAweDA4MGMsIDB4NjYzMiwgMHgxNTMwLCAweDA4MGMsIDB4NGIyMywgMHgwNTE4LAorCTB4MDgwYywgMHg2YWRkLCAweGE4OWMsIDB4MTE2OCwgMHg5MDg0LCAweDAwMDUsIDB4MTE1MCwgMHg5MDBlLAorCTB4MDgwYywgMHg2OTg2LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLAorCTB4MDBkMCwgMHhhODY4LCAweGMwZmMsIDB4YTg2YSwgMHgwODBjLCAweGNiYjMsIDB4MTFlMCwgMHhhODljLAorCTB4ZDA5NCwgMHgwMTE4LCAweGI4ZDQsIDB4YzA4ZCwgMHhiOGQ2LCAweDIwMDksIDB4MDAwMywgMHhhODk3LAorCTB4NDAwNSwgMHhhOTlhLCAweDAwMTAsIDB4YTg5NywgMHg0MDA2LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDMwLCAweDAwMDUsIDB4YTg5NywgMHg0MDAwLCAweGE5OWEsIDB4OTAwNiwgMHg5MThkLAorCTB4MDAwMSwgMHgyMDA4LCAweDAwMDUsIDB4OTAwNiwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLAorCTB4NzAyNCwgMHgyMDU4LCAweDExMTAsIDB4MDgwNCwgMHg1NjhjLCAweDkwMGUsIDB4MDgwYywgMHg2OTg2LAorCTB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDgwNCwgMHgzNWI4LAorCTB4MDgwYywgMHg1NzUyLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MzVlYSwgMHg3Zjg0LAorCTB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4OTAwZSwgMHgyMTMwLCAweDcxMjYsIDB4NzEzMiwgMHhhODYwLAorCTB4MjBlOCwgMHg3MDM2LCAweGE4NWMsIDB4OTA4MCwgMHgwMDA1LCAweDcwMmEsIDB4MjBhMCwgMHgwODBjLAorCTB4NjY5MywgMHgxOTA0LCAweDRlNjcsIDB4MDgwYywgMHg2YWRkLCAweDAxMzgsIDB4MDgwYywgMHg2YWU1LAorCTB4MDEyMCwgMHgwODBjLCAweDZhN2QsIDB4MTkwNCwgMHg0ZTY3LCAweGQ3OTQsIDB4MTExMCwgMHhkNzg0LAorCTB4MDFhOCwgMHhiOGM0LCAweDIwZTAsIDB4YjhjOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwgMHgzNDAwLAorCTB4ZDc5NCwgMHgwMTYwLCAweDIwYTksIDB4MDAwOCwgMHg0MDAzLCAweDIwOTgsIDB4MjBhMCwgMHgzZDAwLAorCTB4MjBlMCwgMHgyMGE5LCAweDAwMDIsIDB4MDgwYywgMHg0OGYxLCAweDAwNDgsIDB4MjBhOSwgMHgwMDA0LAorCTB4NDAwMywgMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwgMHgyMGUwLCAweDA4MGMsIDB4NDhmMSwgMHg5MTg2LAorCTB4MDA3ZSwgMHgwMTcwLCAweDkxODYsIDB4MDA4MCwgMHgwMTU4LCAweDA4MGMsIDB4NmFkZCwgMHg5MGMyLAorCTB4MDAwNiwgMHgxMjEwLCAweGMxZmQsIDB4MDAyMCwgMHgwODBjLCAweDY5ODYsIDB4MTEwOCwgMHhjMWZkLAorCTB4NDEwNCwgMHhjMWZjLCAweGQ3OTQsIDB4MDUyOCwgMHhiOGM0LCAweDIwZTAsIDB4YjhjOCwgMHgyMDYwLAorCTB4OWM4MCwgMHgwMDAwLCAweDIwOTgsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDMsIDB4OWM4MCwgMHgwMDAzLAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwNSwgMHg5YzgwLCAweDAwMDQsIDB4MjA5OCwgMHgzNDAwLAorCTB4MjBhOSwgMHgwMDAyLCAweDQwMDMsIDB4MjA5OCwgMHgyMGEwLCAweDNkMDAsIDB4MjBlMCwgMHgwODBjLAorCTB4NDhlNCwgMHg5YzgwLCAweDAwMjYsIDB4MjA5OCwgMHhiOGM0LCAweDIwZTAsIDB4MjBhOSwgMHgwMDAyLAorCTB4NDAwMywgMHhkNzk0LCAweDAxMTAsIDB4OTZiMCwgMHgwMDBiLCAweDk2YjAsIDB4MDAwNSwgMHg4MTA4LAorCTB4MDgwYywgMHhhYmUyLCAweDAxMTgsIDB4OTE4NiwgMHgwODAwLCAweDAwNDAsIDB4ZDc4YywgMHgwMTIwLAorCTB4OTE4NiwgMHgwODAwLCAweDAxNzAsIDB4MDAxOCwgMHg5MTg2LCAweDAwN2UsIDB4MDE1MCwgMHhkNzk0LAorCTB4MDExOCwgMHg5Njg2LCAweDAwMjAsIDB4MDAxMCwgMHg5Njg2LCAweDAwMjgsIDB4MDE1MCwgMHgwODA0LAorCTB4NGRmNywgMHg4NmZmLCAweDExMjAsIDB4NzEyNCwgMHg4MTBiLCAweDA4MDQsIDB4MzViOCwgMHg3MDMzLAorCTB4MDAwMSwgMHg3MTIyLCAweDcwMjQsIDB4OTYwMCwgMHg3MDI2LCAweDc3MmUsIDB4MjA2MSwgMHgxOGI4LAorCTB4MmM0NCwgMHhhMDZiLCAweDAwMDAsIDB4YTY3YSwgMHg3MDM0LCAweGEwNzIsIDB4NzAyOCwgMHhhMDc2LAorCTB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwgMHgwODBjLCAweDExM2MsIDB4NzAwNywgMHgwMDAyLAorCTB4NzAxZiwgMHg0ZWEzLCAweDAwMDUsIDB4NzAzMCwgMHg5MDA1LCAweDExODAsIDB4NzEyMCwgMHg3MDI4LAorCTB4MjBhMCwgMHg3NzJjLCAweDkwMzYsIDB4NzAzNCwgMHgyMGU4LCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LAorCTB4YTI4YywgMHhhMzkwLCAweGE0OTQsIDB4YTU5OCwgMHgwODA0LCAweDRkZjcsIDB4NzEyNCwgMHg4MTBiLAorCTB4MDgwNCwgMHgzNWI4LCAweDIwMjksIDB4MDA3ZSwgMHg3OTg0LCAweDdhODgsIDB4N2I4YywgMHg3Yzk4LAorCTB4OTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzVlZCwgMHg5NTAyLAorCTB4MGEwNCwgMHgzNWVkLCAweDkxODQsIDB4MDBmZiwgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWVkLAorCTB4OTUwMiwgMHgwYTA0LCAweDM1ZWQsIDB4OTI4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTBlMiwgMHgwMDIwLAorCTB4MGEwNCwgMHgzNWVkLCAweDk1MDIsIDB4MGEwNCwgMHgzNWVkLCAweDkyODQsIDB4MDBmZiwgMHg5MGUyLAorCTB4MDAyMCwgMHgwYTA0LCAweDM1ZWQsIDB4OTUwMiwgMHgwYTA0LCAweDM1ZWQsIDB4OTM4NCwgMHhmZjAwLAorCTB4ODAwNywgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWVkLCAweDk1MDIsIDB4MGEwNCwgMHgzNWVkLAorCTB4OTM4NCwgMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1ZWQsIDB4OTUwMiwgMHgwYTA0LAorCTB4MzVlZCwgMHg5NDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNWVkLAorCTB4OTUwMiwgMHgwYTA0LCAweDM1ZWQsIDB4OTQ4NCwgMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LAorCTB4MzVlZCwgMHg5NTAyLCAweDBhMDQsIDB4MzVlZCwgMHgyMDYxLCAweDE5ODgsIDB4NjEwMiwgMHg2MjA2LAorCTB4NjMwYSwgMHg2NDBlLCAweDA4MDQsIDB4MzViOCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwgMHgzNWVhLAorCTB4MjAwOSwgMHgwMDE2LCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAxOSwgMHhhZjYwLCAweDA4MGMsIDB4NGIzYiwgMHg3MDFmLCAweDRmMjcsIDB4MDAwNSwgMHgyMDAxLAorCTB4MDEzOCwgMHgyMDAzLCAweDAwMDAsIDB4MDBlNiwgMHgyMDcxLCAweDAzMDAsIDB4NzAxYywgMHhkMGE0LAorCTB4MWRlOCwgMHgwMGVlLCAweDIwYTksIDB4MDAxNiwgMHg4OTZlLCAweDhkNmUsIDB4OGQ2ZiwgMHg5ZDg0LAorCTB4ZmZjMCwgMHg5MDgwLCAweDAwMTksIDB4MjA5OCwgMHg5ZDg0LCAweDAwM2YsIDB4MjBlMCwgMHgyMDY5LAorCTB4MTg3NywgMHgyMGU5LCAweDAwMDEsIDB4MmRhMCwgMHg0MDAzLCAweDY4MDAsIDB4OTAwNSwgMHgwOTA0LAorCTB4NGZhOCwgMHg2ODA0LCAweDIwMDgsIDB4OTE4YywgMHhmZmY4LCAweDE5MDQsIDB4NGZhOCwgMHg2ODBjLAorCTB4OTAwNSwgMHgwOTA0LCAweDRmYTgsIDB4OTA4MiwgMHhmZjAxLCAweDFhMDQsIDB4NGZhOCwgMHg2ODEwLAorCTB4OTA4MiwgMHgwMDVjLCAweDBhMDQsIDB4NGZhOCwgMHg2ODI0LCAweDIwMDgsIDB4OTA4MiwgMHgwMDA4LAorCTB4MGEwNCwgMHg0ZmE4LCAweDkxODIsIDB4MDQwMCwgMHgxYTA0LCAweDRmYTgsIDB4MDA1NiwgMHgyMDI5LAorCTB4MDAwMCwgMHgwODBjLCAweDhkYTEsIDB4MDA1ZSwgMHg2OTQ0LCAweDY4MjAsIDB4OTEwMiwgMHgwNmMwLAorCTB4NjgyMCwgMHg5MDgyLCAweDAwMTksIDB4MTZhMCwgMHg2ODI4LCAweDY5NDQsIDB4ODEwYywgMHg5MTAyLAorCTB4MDY3OCwgMHg2ODQwLCAweDkwODIsIDB4MDAwZiwgMHgxNjU4LCAweDA4MGMsIDB4MTA2MCwgMHgyOTAwLAorCTB4MDkwNCwgMHg0ZmM0LCAweDY4NGUsIDB4MDBlNiwgMHgyMDcxLCAweDE5MzAsIDB4MDBiNiwgMHgyMDU5LAorCTB4MDAwMCwgMHgwODBjLCAweDhjNWQsIDB4MDBiZSwgMHgwMGVlLCAweDA1NjgsIDB4MDgwYywgMHg4OWFkLAorCTB4MDgwYywgMHg4OWY4LCAweDExZTAsIDB4Njg1NywgMHgwMDAwLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjEwNCwgMHg5MThkLCAweDIwMDAsIDB4NjEwNiwgMHg2YjEwLCAweDIwNjEsIDB4MWE2YSwgMHg2MzBhLAorCTB4MDBjZSwgMHgwODBjLCAweDI3NzksIDB4MjAwMSwgMHgwMTM4LCAweDIxMDIsIDB4MDgwNCwgMHgzNWI4LAorCTB4MDgwYywgMHgyNzc5LCAweDIwMDEsIDB4MDEzOCwgMHgyMTAyLCAweDA4MDQsIDB4MzVlZCwgMHgwODBjLAorCTB4ODlmMSwgMHgwMGU2LCAweDIwNzEsIDB4MTkzMCwgMHgwODBjLCAweDhlMjEsIDB4MDgwYywgMHg4ZTMwLAorCTB4MDgwYywgMHg4YzQ0LCAweDAwZWUsIDB4MjAwMSwgMHgxODhhLCAweDIwNGMsIDB4MDgwYywgMHgxMDc5LAorCTB4MjAwMSwgMHgxODhhLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDI3NzksIDB4MjAwMSwgMHgwMTM4LAorCTB4MjEwMiwgMHgwODA0LCAweDM1ZWEsIDB4MjAwMSwgMHgxOTI0LCAweDIwMGMsIDB4OTE4ZSwgMHgwMDAwLAorCTB4MDkwNCwgMHg1MDI1LCAweDA4MGMsIDB4OGMzZiwgMHgwOTA0LCAweDUwMjUsIDB4MjAwMSwgMHgwMTAxLAorCTB4MjAwYywgMHg5MThjLCAweGRmZmYsIDB4MjEwMiwgMHgyMDAxLCAweDAxMzgsIDB4MjAwMywgMHgwMDAwLAorCTB4MDBlNiwgMHgyMDcxLCAweDAzMDAsIDB4NzAxYywgMHhkMGE0LCAweDFkZTgsIDB4MDBlZSwgMHgwODBjLAorCTB4OGM0NCwgMHgyMDAxLCAweDAwMzUsIDB4MDgwYywgMHgxNmEwLCAweDAwYzYsIDB4MjA2MSwgMHgxOTNjLAorCTB4NjAwNCwgMHg2MTAwLCAweDkxMDYsIDB4MWRlMCwgMHgwMGNlLCAweDA4MGMsIDB4Mjc3OSwgMHgyMDAxLAorCTB4MDEzOCwgMHgyMTAyLCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweDE5MjMsIDB4MDgwYywgMHg4YjdlLAorCTB4MDEyMCwgMHgyZjAwLCAweDA4MGMsIDB4OGMwYSwgMHgwY2M4LCAweDAwZmUsIDB4MDBlZSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwMDEsIDB4MTg4YSwgMHgyMDBjLCAweDgxZmYsIDB4MDEzOCwgMHgyMTQ4LAorCTB4MDgwYywgMHgxMDc5LCAweDIwMDEsIDB4MTg4YSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxODNkLAorCTB4MjAwMywgMHgwMDIwLCAweDA4MGMsIDB4ODlmMSwgMHgwMGU2LCAweDIwNzEsIDB4MTkzMCwgMHgwODBjLAorCTB4OGUyMSwgMHgwODBjLCAweDhlMzAsIDB4MDBlZSwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHgwMDA2LAorCTB4MDgwYywgMHg1NzNlLCAweGQwY2MsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDgwYywgMHg1NzQyLAorCTB4ZDBiYywgMHgwMDBlLCAweDAwMDUsIDB4NjE3NCwgMHg3YTg0LCAweDYzMDAsIDB4ODJmZiwgMHgxMTE4LAorCTB4Nzk4NiwgMHgwODA0LCAweDM1YjgsIDB4ODNmZiwgMHgxOTA0LCAweDM1ZWQsIDB4MjAwMSwgMHhmZmYwLAorCTB4OTIwMCwgMHgxYTA0LCAweDM1ZWQsIDB4MjAxOSwgMHhmZmZmLCAweDYwNzgsIDB4OTMwMiwgMHg5MjAwLAorCTB4MGEwNCwgMHgzNWVkLCAweDc5ODYsIDB4NjI3NiwgMHgwODA0LCAweDM1YjgsIDB4MDgwYywgMHg1NzUyLAorCTB4MTkwNCwgMHgzNWVhLCAweDdjODgsIDB4N2Q4NCwgMHg3ZTk4LCAweDdmOGMsIDB4MDgwYywgMHg0YWYyLAorCTB4MDkwNCwgMHgzNWVhLCAweDkwMGUsIDB4OTAxZSwgMHg3MzI2LCAweDczMzIsIDB4YTg2MCwgMHgyMGU4LAorCTB4NzAzNiwgMHhhODVjLCAweDkwODAsIDB4MDAwMywgMHg3MDJhLCAweDIwYTAsIDB4OTFkOCwgMHgxMDAwLAorCTB4MmI1YywgMHg4YmZmLCAweDAxNzgsIDB4MDgwYywgMHg2YWRkLCAweDAxMTgsIDB4MDgwYywgMHg2YWU1LAorCTB4MTE0OCwgMHgyMGE5LCAweDAwMDEsIDB4YjgxNCwgMHg0MDA0LCAweGI4MTAsIDB4NDAwNCwgMHg0MTA0LAorCTB4OTM5OCwgMHgwMDAzLCAweDgxMDgsIDB4OTE4MiwgMHgwODAwLCAweDAxMjAsIDB4OTM4NiwgMHgwMDNjLAorCTB4MDE3MCwgMHgwYzIwLCAweDgzZmYsIDB4MTE0OCwgMHg3MjI0LCAweDkwMGUsIDB4MjAwMSwgMHgwMDAzLAorCTB4MDgwYywgMHg5MWY4LCAweDIyMDgsIDB4MDgwNCwgMHgzNWI4LCAweDcwMzMsIDB4MDAwMSwgMHg3MTIyLAorCTB4NzAyNCwgMHg5MzAwLCAweDcwMjYsIDB4MjA2MSwgMHgxOGI4LCAweDJjNDQsIDB4YTA2YiwgMHgwMDAwLAorCTB4YTM3YSwgMHg3MDI4LCAweGEwNzYsIDB4NzAzNCwgMHhhMDcyLCAweGE0OGUsIDB4YTU5MiwgMHhhNjk2LAorCTB4YTc5YSwgMHgwODBjLCAweDExM2MsIDB4NzAwNywgMHgwMDAyLCAweDcwMWYsIDB4NTBhOCwgMHgwMDA1LAorCTB4NzAzMCwgMHg5MDA1LCAweDExNzgsIDB4NzEyMCwgMHg3MDI4LCAweDIwYTAsIDB4OTAxZSwgMHg3MDM0LAorCTB4MjBlOCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhNDhjLCAweGE1OTAsIDB4YTY5NCwgMHhhNzk4LAorCTB4MDgwNCwgMHg1MDY2LCAweDcyMjQsIDB4OTAwZSwgMHgyMDAxLCAweDAwMDMsIDB4MDgwYywgMHg5MWY4LAorCTB4MjIwOCwgMHgwODA0LCAweDM1YjgsIDB4MDBmNiwgMHgwMGU2LCAweDA4MGMsIDB4NTc1MiwgMHgyMDA5LAorCTB4MDAwNywgMHgxOTA0LCAweDUxM2IsIDB4MjA3MSwgMHgxODllLCAweDc0NWMsIDB4ODRmZiwgMHgyMDA5LAorCTB4MDAwZSwgMHgxOTA0LCAweDUxM2IsIDB4YWM5YywgMHhhZDk4LCAweGFlYTQsIDB4YWZhMCwgMHgwMDk2LAorCTB4MDgwYywgMHgxMDYwLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LCAweDUxM2IsIDB4MjkwMCwgMHg3MDVlLAorCTB4OTAwZSwgMHg5MDFlLCAweDczNTYsIDB4NzM2MiwgMHhhODYwLCAweDcwNjYsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAwMywgMHg3MDVhLCAweDIwYTAsIDB4OTFkOCwgMHgxMDAwLCAweDJiNWMsIDB4OGJmZiwgMHgwMTc4LAorCTB4MDgwYywgMHg2YWRkLCAweDAxMTgsIDB4MDgwYywgMHg2YWU1LCAweDExNDgsIDB4YjgxNCwgMHgyMGE5LAorCTB4MDAwMSwgMHg0MDA0LCAweGI4MTAsIDB4NDAwNCwgMHg0MTA0LCAweDkzOTgsIDB4MDAwMywgMHg4MTA4LAorCTB4OTE4MiwgMHgwODAwLCAweDAxMjAsIDB4OTM4NiwgMHgwMDNjLCAweDAxZTgsIDB4MGMyMCwgMHg4M2ZmLAorCTB4MTFjMCwgMHg3MjU0LCAweDkwMGUsIDB4MjAwMSwgMHgwMDAzLCAweDA4MGMsIDB4OTFmOCwgMHgyMjA4LAorCTB4MDA5ZSwgMHhhODk3LCAweDQwMDAsIDB4YTk5YSwgMHg3MTVjLCAweDgxZmYsIDB4MDkwYywgMHgwZDdkLAorCTB4MjE0OCwgMHgwODBjLCAweDEwNzksIDB4OTAwNiwgMHg3MDVlLCAweDkxOGQsIDB4MDAwMSwgMHgyMDA4LAorCTB4MDQxOCwgMHg3MDYzLCAweDAwMDEsIDB4NzE1MiwgMHg3MDU0LCAweDkzMDAsIDB4NzA1NiwgMHgyMDYxLAorCTB4MThiOSwgMHgyYzQ0LCAweGEzN2EsIDB4NzA1OCwgMHhhMDc2LCAweDcwNjQsIDB4YTA3MiwgMHhhNDhlLAorCTB4YTU5MiwgMHhhNjk2LCAweGE3OWEsIDB4YTA5ZiwgMHg1MTQ3LCAweDAwMGUsIDB4YTBhMiwgMHgwODBjLAorCTB4MTEzYywgMHg5MDA2LCAweDAwNDgsIDB4MDA5ZSwgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHg5MDBlLAorCTB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4YTBhMCwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHgwMGU2LCAweDIwNzEsIDB4MTg5ZSwgMHhhMDZjLAorCTB4OTA4ZSwgMHgwMTAwLCAweDAxMzgsIDB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LAorCTB4NDAwMiwgMHgwMGQ4LCAweDcwNjAsIDB4OTAwNSwgMHgxMTU4LCAweDcxNTAsIDB4NzA1OCwgMHgyMGEwLAorCTB4OTAxZSwgMHg3MDY0LCAweDIwZTgsIDB4YTQ4YywgMHhhNTkwLCAweGE2OTQsIDB4YTc5OCwgMHgwNDI4LAorCTB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDAsIDB4NzI1NCwgMHg5MDBlLAorCTB4MjAwMSwgMHgwMDAzLCAweDA4MGMsIDB4OTFmOCwgMHhhYTlhLCAweDcxNWMsIDB4ODFmZiwgMHgwOTBjLAorCTB4MGQ3ZCwgMHgyMTQ4LCAweDA4MGMsIDB4MTA3OSwgMHg3MDVmLCAweDAwMDAsIDB4YTBhMCwgMHgyMDQ4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4YTA5ZiwgMHgwMDAwLAorCTB4YTBhMywgMHgwMDAwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDkxZDgsIDB4MTAwMCwgMHgyYjVjLAorCTB4OGJmZiwgMHgwMTc4LCAweDA4MGMsIDB4NmFkZCwgMHgwMTE4LCAweDA4MGMsIDB4NmFlNSwgMHgxMTQ4LAorCTB4YjgxNCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwNCwgMHhiODEwLCAweDQwMDQsIDB4NDEwNCwgMHg5Mzk4LAorCTB4MDAwMywgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgwMTIwLCAweDkzODYsIDB4MDAzYywgMHgwNTE4LAorCTB4MGMyMCwgMHg4M2ZmLCAweDExZjAsIDB4NzE1NCwgMHg4MTBjLCAweGE5OWEsIDB4YTg5NywgMHg0MDAwLAorCTB4NzE1YywgMHg4MWZmLCAweDA5MGMsIDB4MGQ3ZCwgMHgyMTQ4LCAweDA4MGMsIDB4MTA3OSwgMHg5MDA2LAorCTB4NzA1ZSwgMHg5MThkLCAweDAwMDEsIDB4MjAwOCwgMHhhMGEwLCAweDIwNDgsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHhhMDlmLCAweDAwMDAsIDB4YTBhMywgMHgwMDAwLAorCTB4MDA3MCwgMHg3MDYzLCAweDAwMDEsIDB4NzE1MiwgMHg3MDU0LCAweDkzMDAsIDB4NzA1NiwgMHhhMzdhLAorCTB4YTQ4ZSwgMHhhNTkyLCAweGE2OTYsIDB4YTc5YSwgMHgwODBjLCAweDExM2MsIDB4OTAwNiwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMDk2LCAweGE4OGMsIDB4OTBiZSwgMHg3MDAwLCAweDAxNDgsIDB4OTBiZSwgMHg3MTAwLAorCTB4MDEzMCwgMHg5MGJlLCAweDcyMDAsIDB4MDExOCwgMHgwMDllLCAweDA4MDQsIDB4MzVlZCwgMHhhODg0LAorCTB4YTk4OCwgMHgwODBjLCAweDI2NjEsIDB4MTUxOCwgMHgwODBjLCAweDY2MzIsIDB4MTUwMCwgMHg3MTI2LAorCTB4YmUxMiwgMHhiZDE2LCAweGFlN2MsIDB4MDgwYywgMHg0YWYyLCAweDAxYzgsIDB4MDgwYywgMHg0YWYyLAorCTB4MDFiMCwgMHgwMDllLCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHhhODIzLAorCTB4MDAwMCwgMHhhODA0LCAweDIwNDgsIDB4MDgwYywgMHhjYjJjLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDgwNCwgMHgzNWVhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUyMTQsIDB4MDAwNSwgMHgwMDllLAorCTB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwgMHg3MTI0LCAweDA4MGMsIDB4MzM0OSwgMHhhODIwLAorCTB4OTA4NiwgMHg4MDAxLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzVlYSwgMHgyOTAwLAorCTB4NzAyMiwgMHhhODA0LCAweDAwOTYsIDB4MjA0OCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLAorCTB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4MDA5ZSwgMHg5MDgwLCAweDAwMDIsIDB4MDA3NiwgMHgwMDA2LAorCTB4MjA5OCwgMHgyMGEwLCAweDI3ZTAsIDB4MjdlOCwgMHgyMGE5LCAweDAwMmEsIDB4MDgwYywgMHgwZmM0LAorCTB4YWE2YywgMHhhYjcwLCAweGFjNzQsIDB4YWQ3OCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhMDZiLAorCTB4MDAwMCwgMHhhZTY0LCAweGFmOGMsIDB4OTdjNiwgMHg3MDAwLCAweDAxMTgsIDB4OTdjNiwgMHg3MTAwLAorCTB4MTE0OCwgMHg5NmMyLCAweDAwMDQsIDB4MDYwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDAwZSwgMHgwMDdlLAorCTB4MDgwNCwgMHg0YjNlLCAweDk3YzYsIDB4NzIwMCwgMHgxMWI4LCAweDk2YzIsIDB4MDA1NCwgMHgwMmEwLAorCTB4MDAwZSwgMHgwMDdlLCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweGEwNzYsIDB4YTc3MiwgMHhhMDdiLAorCTB4MDAyYSwgMHhhMjhlLCAweGEzOTIsIDB4YTQ5NiwgMHhhNTlhLCAweDA4MGMsIDB4MTEzYywgMHg3MDA3LAorCTB4MDAwMiwgMHg3MDFmLCAweDUyNzAsIDB4MDAwNSwgMHgwMDBlLCAweDAwN2UsIDB4MDgwNCwgMHgzNWVkLAorCTB4NzAyMCwgMHgyMDQ4LCAweGE4MDQsIDB4MjA0OCwgMHhhODA0LCAweDIwNDgsIDB4ODkwNiwgMHg4MDA2LAorCTB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwMiwgMHgyMDk4LAorCTB4MjBhMCwgMHgyN2UwLCAweDI3ZTgsIDB4MjBhOSwgMHgwMDJhLCAweDA4MGMsIDB4MGZjNCwgMHgyMTAwLAorCTB4MjIzOCwgMHgyMDYxLCAweDE4YjgsIDB4MmM0NCwgMHhhMjhjLCAweGEzOTAsIDB4YTQ5NCwgMHhhNTk4LAorCTB4MjAwOSwgMHgwMDJhLCAweDA4MDQsIDB4NGIzZSwgMHg4MWZmLCAweDE5MDQsIDB4MzVlYSwgMHg3OThjLAorCTB4MjAwMSwgMHgxOTdkLCAweDkxOGMsIDB4ODAwMCwgMHgyMTAyLCAweDA4MGMsIDB4NGIwOSwgMHgwOTA0LAorCTB4MzVlZCwgMHgwODBjLCAweDZhZGQsIDB4MDEyMCwgMHgwODBjLCAweDZhZTUsIDB4MTkwNCwgMHgzNWVkLAorCTB4MDgwYywgMHg2NzVhLCAweDA5MDQsIDB4MzVlYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NjhmMywgMHgwMTJlLCAweDA5MDQsIDB4MzVlYSwgMHgyMDAxLCAweDE5N2QsIDB4MjAwNCwgMHhkMGZjLAorCTB4MTkwNCwgMHgzNWI4LCAweDA4MDQsIDB4NDU4ZSwgMHhhOWEwLCAweDIwMDEsIDB4MTk3ZCwgMHg5MThjLAorCTB4ODAwMCwgMHhjMThkLCAweDIxMDIsIDB4MDgwYywgMHg0YjE2LCAweDAxYTAsIDB4MDgwYywgMHg2YWRkLAorCTB4MDExOCwgMHgwODBjLCAweDZhZTUsIDB4MTE3MCwgMHgwODBjLCAweDY3NWEsIDB4MjAwOSwgMHgwMDAyLAorCTB4MDEyOCwgMHgwODBjLCAweDY4ZjMsIDB4MTE3MCwgMHgyMDA5LCAweDAwMDMsIDB4YTg5NywgMHg0MDA1LAorCTB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHgyMDAxLCAweDE5N2QsIDB4MjAwNCwgMHhkMGZjLAorCTB4MTEyOCwgMHgwODBjLCAweDU3NDYsIDB4MDExMCwgMHg5MDA2LCAweDAwMTgsIDB4OTAwZSwgMHg5MDg1LAorCTB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDAwNSwgMHg3OGE4LCAweGQwOGMsIDB4MTExOCwgMHhkMDg0LAorCTB4MDkwNCwgMHg0NTAzLCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LCAweDM1ZWQsIDB4MDgwYywgMHg0YWYyLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NmFkZCwgMHgwMTMwLAorCTB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsIDB4OTA4ZSwgMHgwMDA1LCAweDE1YTAsIDB4NzhhOCwgMHhkMDhjLAorCTB4MDEyMCwgMHhiODAwLCAweGMwOGMsIDB4YjgwMiwgMHgwMDI4LCAweDA4MGMsIDB4NTczZSwgMHhkMGI0LAorCTB4MDkwNCwgMHg0NTNkLCAweDc4ODQsIDB4OTA4ZSwgMHgwMDdlLCAweDA5MDQsIDB4NDUzZCwgMHg5MDhlLAorCTB4MDA3ZiwgMHgwOTA0LCAweDQ1M2QsIDB4OTA4ZSwgMHgwMDgwLCAweDA5MDQsIDB4NDUzZCwgMHhiODAwLAorCTB4ZDA4YywgMHgxOTA0LCAweDQ1M2QsIDB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLAorCTB4MDgwYywgMHhjYjRiLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzVlYSwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFmLCAweDUzM2MsIDB4MDAwNSwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwgMHgzNWVkLAorCTB4MDgwNCwgMHg0NTNkLCAweDA4MGMsIDB4MzNhOCwgMHgwMTA4LCAweDAwMDUsIDB4MjAwOSwgMHgxODM0LAorCTB4MjEwYywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4NTc1MiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywgMHg2YWQ1LAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgzNWVhLCAweGI4OWMsIDB4ZDBhNCwgMHgxMTE4LAorCTB4ZDBhYywgMHgxOTA0LCAweDQ1M2QsIDB4OTAwNiwgMHhhODY2LCAweGE4MzIsIDB4YTg2OCwgMHhjMGZkLAorCTB4YTg2YSwgMHgwODBjLCAweGNiYjMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWVhLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTM3NSwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHg1NjhjLCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LAorCTB4MzVlZCwgMHgwODA0LCAweDUzMGUsIDB4ODFmZiwgMHgyMDA5LCAweDAwMDEsIDB4MTkwNCwgMHgzNWVhLAorCTB4MDgwYywgMHg1NzUyLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LCAweDM1ZWEsIDB4MDgwYywgMHg2YWQ1LAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LAorCTB4MzVlZCwgMHgwODBjLCAweDZhZGQsIDB4MjAwOSwgMHgwMDA5LCAweDE5MDQsIDB4MzVlYSwgMHgwODBjLAorCTB4NGFmMiwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHgzNWVhLCAweDkwMDYsIDB4YTg2NiwgMHhhODMyLAorCTB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4Nzk4OCwgMHg5MTk0LCAweGZmMDAsIDB4OTE4YywgMHgwMGZmLAorCTB4OTAwNiwgMHg4MmZmLCAweDExMjgsIDB4YzBlZCwgMHhhOTUyLCAweDc5OGMsIDB4YTk1NiwgMHgwMDM4LAorCTB4OTI4ZSwgMHgwMTAwLCAweDE5MDQsIDB4MzVlZCwgMHhjMGU1LCAweGE5NTIsIDB4YTk1NiwgMHhhODNlLAorCTB4MDgwYywgMHhjZTE2LCAweDIwMDksIDB4MDAwMywgMHgwOTA0LCAweDM1ZWEsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAxZiwgMHg1M2NiLCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDkwNCwgMHgzNWVhLCAweDA4MDQsIDB4MzViOCwgMHg3YWE4LCAweDkyODQsIDB4YzAwMCwgMHgwMTQ4LAorCTB4ZDJlYywgMHgwMWEwLCAweDA4MGMsIDB4NTc1MiwgMHgxMTg4LCAweDIwMDksIDB4MDAxNCwgMHgwODA0LAorCTB4MzVlYSwgMHhkMmRjLCAweDE1NzgsIDB4ODFmZiwgMHgyMDA5LCAweDAwMDEsIDB4MTkwNCwgMHgzNWVhLAorCTB4MDgwYywgMHg1NzUyLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LCAweDM1ZWEsIDB4ZDJmNCwgMHgwMTM4LAorCTB4OTI4NCwgMHg1MDAwLCAweGMwZDUsIDB4MDgwYywgMHg1NzE4LCAweDA4MDQsIDB4MzViOCwgMHhkMmZjLAorCTB4MDE2MCwgMHgwODBjLCAweDRiMjUsIDB4MDkwNCwgMHgzNWVkLCAweDc5ODQsIDB4OTI4NCwgMHg5MDAwLAorCTB4YzBkNSwgMHgwODBjLCAweDU2ZTcsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NGIyNSwgMHgwOTA0LAorCTB4MzVlZCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MjAwOSwgMHgwMDA5LAorCTB4MTkwNCwgMHg1NGJhLCAweDA4MGMsIDB4NGFmMiwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHg1NGJhLAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4YWY2MCwgMHgyMDA5LCAweDAwMDgsIDB4N2E4YywgMHg3Yjg4LAorCTB4N2M5YywgMHg3ZDk4LCAweDA4MGMsIDB4NGIzYiwgMHg3MDFmLCAweDU0MjcsIDB4MDAwNSwgMHhhODZjLAorCTB4OTA4NiwgMHgwNTAwLCAweDExMzgsIDB4YTg3MCwgMHg5MDA1LCAweDExMjAsIDB4YTg3NCwgMHg5MDg0LAorCTB4ZmYwMCwgMHgwMTEwLCAweDE5MDQsIDB4MzVlZCwgMHhhODY2LCAweGE4MzIsIDB4YTg2OCwgMHhjMGZkLAorCTB4YTg2YSwgMHgwODBjLCAweDRiMjUsIDB4MTExMCwgMHgwODA0LCAweDM1ZWQsIDB4MjAwOSwgMHgwMDQzLAorCTB4MDgwYywgMHhjZTdlLCAweDIwMDksIDB4MDAwMywgMHgwOTA0LCAweDU0YmEsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAxZiwgMHg1NDRiLCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDkwNCwgMHg1NGJhLCAweDc5ODQsIDB4N2FhOCwgMHg5Mjg0LCAweDEwMDAsIDB4ZTA4NSwgMHgwODBjLAorCTB4NTZlNywgMHgwODA0LCAweDM1YjgsIDB4MDBjNiwgMHhhYWIwLCAweDkyODQsIDB4YzAwMCwgMHgwMTQ4LAorCTB4ZDJlYywgMHgwMTcwLCAweDA4MGMsIDB4NTc1MiwgMHgxMTU4LCAweDIwMDksIDB4MDAxNCwgMHgwODA0LAorCTB4NTRhOSwgMHgyMDYxLCAweDE4MDAsIDB4MDgwYywgMHg1NzUyLCAweDIwMDksIDB4MDAwNywgMHgxNWM4LAorCTB4ZDJmNCwgMHgwMTMwLCAweDkyODQsIDB4NTAwMCwgMHhjMGQ1LCAweDA4MGMsIDB4NTcxOCwgMHgwMDU4LAorCTB4ZDJmYywgMHgwMTgwLCAweDA4MGMsIDB4NGIyMywgMHgwNTkwLCAweGE5OTgsIDB4OTI4NCwgMHg5MDAwLAorCTB4YzBkNSwgMHgwODBjLCAweDU2ZTcsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LAorCTB4NDAwMCwgMHgwNDM4LCAweDA4MGMsIDB4NGIyMywgMHgwNTEwLCAweDA4MGMsIDB4NmFkZCwgMHgyMDA5LAorCTB4MDAwOSwgMHgxMWI4LCAweGE4YzQsIDB4OTA4NiwgMHgwNTAwLCAweDExYzgsIDB4YThjOCwgMHg5MDA1LAorCTB4MTFiMCwgMHhhOGNjLCAweDkwODQsIDB4ZmYwMCwgMHgxMTkwLCAweDA4MGMsIDB4NGIyMywgMHgxMTA4LAorCTB4MDA3MCwgMHgyMDA5LCAweDAwNGIsIDB4MDgwYywgMHhjZTdlLCAweDIwMDksIDB4MDAwMywgMHgwMTA4LAorCTB4MDA3OCwgMHgwNDMxLCAweDE5YzAsIDB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LAorCTB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDBjZSwgMHgwMDA1LAorCTB4OTAwNiwgMHgwY2UwLCAweDdhYTgsIDB4ZDJkYywgMHgwOTA0LCAweDM1ZWEsIDB4MDAxNiwgMHg3OTg0LAorCTB4OTI4NCwgMHgxMDAwLCAweGMwZmQsIDB4MDgwYywgMHg1NmU3LCAweDAwMWUsIDB4MTkwNCwgMHgzNWVhLAorCTB4MDgwNCwgMHgzNWI4LCAweDAwZjYsIDB4MmQ3OCwgMHhhYWIwLCAweDAwMjEsIDB4MDBmZSwgMHgwMDA1LAorCTB4YWFiMCwgMHhjMmQ1LCAweGQyZGMsIDB4MDE1MCwgMHgwMDE2LCAweGE5OTgsIDB4OTI4NCwgMHgxNDAwLAorCTB4YzBmZCwgMHgwODBjLCAweDU2ZTcsIDB4MDAxZSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHg4MWZmLAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NTc1MiwgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MzVlYSwgMHg3OTg0LCAweDdlYTgsIDB4OTZiNCwgMHgwMGZmLAorCTB4MDgwYywgMHg2NjkzLCAweDE5MDQsIDB4MzVlZCwgMHg5MTg2LCAweDAwN2YsIDB4MDEzOCwgMHgwODBjLAorCTB4NmFkZCwgMHgwMTIwLCAweDIwMDksIDB4MDAwOSwgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywgMHg0YWYyLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LAorCTB4YzBmZCwgMHhhODZhLCAweDIwMDEsIDB4MDEwMCwgMHg4MDA3LCAweGE4MGEsIDB4MDgwYywgMHhjYjY1LAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWVhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLAorCTB4NTUxYSwgMHgwMDA1LCAweGE4MDgsIDB4ODAwNywgMHg5MDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwODA0LCAweDM1ZWEsIDB4YThlMCwgMHhhODY2LCAweGE4MTAsIDB4ODAwNywgMHg5MDg0LAorCTB4MDBmZiwgMHg4MDBjLCAweGE4MTQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwgMHg5MDgwLAorCTB4MDAwMiwgMHg5MTA4LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LAorCTB4ZmZjMCwgMHg5MDgwLCAweDAwMDQsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwODA0LAorCTB4NGIzZSwgMHgwODBjLCAweDRhZjIsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNWVhLAorCTB4Nzk4NCwgMHg5MTk0LCAweGZmMDAsIDB4OTE4YywgMHgwMGZmLCAweDgyMTcsIDB4ODJmZiwgMHgxMTE4LAorCTB4NzAyMywgMHgxOWIyLCAweDAwNDAsIDB4OTJjNiwgMHgwMDAxLCAweDExMTgsIDB4NzAyMywgMHgxOWNjLAorCTB4MDAxMCwgMHgwODA0LCAweDM1ZWQsIDB4MjAwOSwgMHgwMDFhLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLAorCTB4N2Q5OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHhhZjYwLCAweDA4MGMsIDB4NGIzYiwgMHg3MDFmLAorCTB4NTU2YSwgMHgwMDA1LCAweDIwMDEsIDB4MTgyZSwgMHgyMDAzLCAweDAwMDEsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAxOSwgMHgyMDk4LCAweGE4NjAsIDB4MjBlMCwgMHgyMGE5LCAweDAwMWEsIDB4NzAyMCwgMHgyMGEwLAorCTB4MjBlOSwgMHgwMDAxLCAweDQwMDMsIDB4MDgwNCwgMHgzNWI4LCAweDA4MGMsIDB4NGFmMiwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwgMHg3OTg0LCAweDkxOTQsIDB4ZmYwMCwgMHg5MThjLAorCTB4MDBmZiwgMHg4MjE3LCAweDgyZmYsIDB4MTExOCwgMHgyMDk5LCAweDE5YjIsIDB4MDA0MCwgMHg5MmM2LAorCTB4MDAwMSwgMHgxMTE4LCAweDIwOTksIDB4MTljYywgMHgwMDEwLCAweDA4MDQsIDB4MzVlZCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDE5LCAweDIwYTAsIDB4YTg2MCwgMHgyMGU4LCAweDIwYTksIDB4MDAxYSwgMHgyMGUxLAorCTB4MDAwMSwgMHg0MDAzLCAweDIwMDksIDB4MDAxYSwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODA0LCAweDRiM2UsIDB4Nzg4NCwgMHg5MDhhLAorCTB4MTAwMCwgMHgxYTA0LCAweDM1ZWQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4ODAwMywgMHg4MDBiLAorCTB4ODEwYiwgMHg5MTA4LCAweDAwYzYsIDB4MjA2MSwgMHgxYTAyLCAweDYxNDIsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNWI4LCAweDAwYzYsIDB4MDgwYywgMHg3NTNkLCAweDExNjAsIDB4MDgwYywgMHg3ODQwLAorCTB4MDgwYywgMHg2MDkyLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDc1ODQsIDB4MDgwYywgMHg3NDZlLAorCTB4MDgwYywgMHgwZDdkLCAweDIwNjEsIDB4MTgwMCwgMHg2MDMwLCAweGMwOWQsIDB4NjAzMiwgMHgwODBjLAorCTB4NWY0ZCwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwgMHg5MDhlLAorCTB4MDAwMCwgMHgwOTA0LCAweDM1ZWEsIDB4Nzg4NCwgMHg5MDA1LCAweDAxODgsIDB4Nzg4OCwgMHgyMDYxLAorCTB4MTk5YiwgMHgyYzBjLCAweDIwNjIsIDB4MDgwYywgMHgyYTQ4LCAweDAxYTAsIDB4MDgwYywgMHgyYTUwLAorCTB4MDE4OCwgMHgwODBjLCAweDJhNTgsIDB4MDE3MCwgMHgyMTYyLCAweDA4MDQsIDB4MzVlZCwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDM4LCAweDkwODYsIDB4MDAwNywgMHgxMTE4LCAweDIwMDksIDB4MDAwMSwgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDAwLCAweDc4ODQsIDB4OTA4NiwgMHgwMDAyLCAweDE1YTgsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MDgwYywgMHhhOTFlLCAweDAwMjYsIDB4MjAxMSwgMHgwMDAzLAorCTB4MDgwYywgMHhhMjQzLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweGEyNGQsIDB4MDAyZSwgMHgwODBjLAorCTB4YTEzOCwgMHgwMDM2LCAweDkwMWUsIDB4MDgwYywgMHhhMWI4LCAweDAwM2UsIDB4MDgwYywgMHhhOTNhLAorCTB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4ZTg4MiwgMHgwODBjLCAweGU4OWQsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDgwYywgMHg3NTg0LCAweDkwMDYsIDB4MDgwYywgMHgyYTdhLCAweDIwMDEsIDB4MTgwMCwgMHgyMDAzLAorCTB4MDAwNCwgMHgyMDAxLCAweDE5YTYsIDB4MjAwMywgMHgwMDAwLCAweDAwMjYsIDB4MjAxMSwgMHgwMDA4LAorCTB4MDgwYywgMHgyYWI0LCAweDAwMmUsIDB4MDBjZSwgMHgwODA0LCAweDM1YjgsIDB4ODFmZiwgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzVlYSwgMHgwODBjLCAweDU3NTIsIDB4MDEyMCwgMHgyMDA5LAorCTB4MDAwNywgMHgwODA0LCAweDM1ZWEsIDB4Nzk4NCwgMHg3ZWE4LCAweDk2YjQsIDB4MDBmZiwgMHgwODBjLAorCTB4NjY5MywgMHgxOTA0LCAweDM1ZWQsIDB4OTE4NiwgMHgwMDdmLCAweDAxMzgsIDB4MDgwYywgMHg2YWRkLAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDksIDB4MDgwNCwgMHgzNWVhLCAweDA4MGMsIDB4NGFmMiwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzVlYSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLAorCTB4YTg2YSwgMHgwODBjLCAweGNiNjgsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNWVhLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTY3NSwgMHgwMDA1LCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgzNWVhLCAweGE4ZTAsIDB4YTg2NiwgMHhhODM0LAorCTB4ODAwNywgMHg4MDBjLCAweGE4NWMsIDB4OTA4MCwgMHgwMDBjLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLAorCTB4N2Q5OCwgMHhhZjYwLCAweDA4MDQsIDB4NGIzZSwgMHhhODk4LCAweDkwODYsIDB4MDAwZCwgMHgxOTA0LAorCTB4MzVlYSwgMHgyMDIxLCAweDQwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1Njk5LAorCTB4MDAxMCwgMHgwMTJlLCAweDBjYzAsIDB4N2MzNiwgMHg5NDg2LCAweDQwMDAsIDB4MDExOCwgMHg3ODMzLAorCTB4MDAxMSwgMHgwMDEwLCAweDc4MzMsIDB4MDAxMCwgMHg3ODgzLCAweDQwMDUsIDB4YTk5OCwgMHg3OTg2LAorCTB4YTlhNCwgMHg3OTlhLCAweGE5YTgsIDB4Nzk5ZSwgMHgwODBjLCAweDRiMmUsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZWUsIDB4NzAwNywgMHgwMDAxLAorCTB4MjA5MSwgMHg1MDAwLCAweDcwMGYsIDB4MDAwMCwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMGM2LCAweDIwNjEsIDB4MWEwMiwgMHg3OTg0LCAweDYxNTIsIDB4NjE0ZSwgMHg2MDU3LAorCTB4MDAwMCwgMHg2MDRiLCAweDAwMDksIDB4Nzg5OCwgMHg2MDZhLCAweDc4OWMsIDB4NjA2NiwgMHg3ODg4LAorCTB4NjA2MiwgMHg3ODhjLCAweDYwNWUsIDB4MjAwMSwgMHgxYTEwLCAweDIwNDQsIDB4MjAwMSwgMHgxYTE3LAorCTB4YTA3NiwgMHhhMDYwLCAweGEwNzIsIDB4YTA3YiwgMHgwMDAxLCAweGEwN2YsIDB4MDAwMiwgMHhhMDZiLAorCTB4MDAwMCwgMHhhMDlmLCAweDAwMDAsIDB4MDBjZSwgMHgwMTJlLCAweDA4MDQsIDB4MzViOCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwYjYsIDB4MDBjNiwgMHg5MGU0LCAweGMwMDAsIDB4MDE5OCwgMHgwMDA2LAorCTB4ZDBkNCwgMHgwMTYwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4YTkxZSwgMHgwMTA2LAorCTB4MDgwYywgMHgzMzZkLCAweDAxMGUsIDB4MDkwYywgMHhhOTNhLCAweDAwM2UsIDB4MDgwYywgMHhjOWM3LAorCTB4MDAwZSwgMHgxMTk4LCAweGQwZTQsIDB4MDE2MCwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLAorCTB4MDE2MCwgMHgwODBjLCAweDYwYWMsIDB4MDgwYywgMHhhYmUyLCAweDAxMTAsIDB4YjgxNywgMHgwMDAwLAorCTB4OTAwNiwgMHgwMGNlLCAweDAwYmUsIDB4MDEyZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDE1NiwgMHgyMDEwLCAweDkwMGUsIDB4MjBhOSwgMHgwODAwLAorCTB4MDAxNiwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDA1LCAweDAxODgsIDB4OTE4NiwgMHgwMDdlLAorCTB4MDE3MCwgMHg5MTg2LCAweDAwN2YsIDB4MDE1OCwgMHg5MTg2LCAweDAwODAsIDB4MDE0MCwgMHg5MTg2LAorCTB4MDBmZiwgMHgwMTI4LCAweDAwMjYsIDB4MjIwMCwgMHgwODBjLCAweDU2ZTcsIDB4MDAyZSwgMHgwMDFlLAorCTB4ODEwOCwgMHgxZjA0LCAweDU3MjAsIDB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgxODQ4LAorCTB4MjAwNCwgMHgwMDA1LCAweDIwMDEsIDB4MTg2NywgMHgyMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4MTgxMCwgMHgyMDA0LCAweGQwZDQsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LAorCTB4ZDBiNCwgMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4MTg5ZSwgMHg3MTA4LCAweDkxMGQsIDB4NzEwYSwgMHgwMGVlLAorCTB4MDAxZSwgMHgwMDA1LCAweDc5YTQsIDB4OTE4MiwgMHgwMDgxLCAweDFhMDQsIDB4MzVlZCwgMHg4MTBjLAorCTB4MDAxNiwgMHgwODBjLCAweDRhZjIsIDB4MDE3MCwgMHgwODBjLCAweDBmNGYsIDB4MjEwMCwgMHgyMjM4LAorCTB4N2Q4NCwgMHg3Yzg4LCAweDdiOGMsIDB4N2E5MCwgMHgwMDFlLCAweDA4MGMsIDB4NGIzYiwgMHg3MDFmLAorCTB4NTc3ZSwgMHgwMDA1LCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1ZWEsIDB4MjA3OSwgMHgwMDAwLAorCTB4N2Q5NCwgMHg3Yzk4LCAweDdiYTgsIDB4N2FhYywgMHg3OWE0LCAweDgxMGMsIDB4MjA2MSwgMHgxOGI4LAorCTB4MmM0NCwgMHhhNzcwLCAweGEwNzQsIDB4MjA3MSwgMHgxODllLCAweDA4MGMsIDB4NGIzZSwgMHg3MDFmLAorCTB4NTc5MiwgMHgwMDA1LCAweDIwNjEsIDB4MThiOCwgMHgyYzQ0LCAweDAwMTYsIDB4MDAyNiwgMHhhMjcwLAorCTB4YTE3NCwgMHgwODBjLCAweDBmNTcsIDB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4MTAwNCwgMHg5MDA2LAorCTB4YTgwMiwgMHhhODA2LCAweDA4MDQsIDB4MzViOCwgMHgwMTI2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2MSwgMHgwMTAwLAorCTB4MjA2OSwgMHgwMjAwLCAweDIwNzEsIDB4MTgwMCwgMHg2MDQ0LCAweGQwYTQsIDB4MTFlOCwgMHhkMDg0LAorCTB4MDExOCwgMHgwODBjLCAweDU5NGQsIDB4MDA2OCwgMHhkMDhjLCAweDAxMTgsIDB4MDgwYywgMHg1ODU2LAorCTB4MDA0MCwgMHhkMDk0LCAweDAxMTgsIDB4MDgwYywgMHg1ODI2LCAweDAwMTgsIDB4ZDA5YywgMHgwMTA4LAorCTB4MDA5OSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMTRlLAorCTB4MDEzZSwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMDE2LCAweDYxMjgsIDB4ZDE5YywgMHgxMTEwLAorCTB4YzE5ZCwgMHg2MTJhLCAweDAwMWUsIDB4MGM2OCwgMHgwMDA2LCAweDcwOTgsIDB4OTAwNSwgMHgwMDBlLAorCTB4MDEyMCwgMHg3MDliLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDYyNGMsIDB4OTI4NiwgMHhmMGYwLAorCTB4MTE1MCwgMHg2MDQ4LCAweDkwODYsIDB4ZjBmMCwgMHgwMTMwLCAweDYyNGEsIDB4NjA0MywgMHgwMDkwLAorCTB4NjA0MywgMHgwMDEwLCAweDA0OTAsIDB4OTI5NCwgMHhmZjAwLCAweDkyOTYsIDB4ZjcwMCwgMHgwMTc4LAorCTB4NzEzOCwgMHhkMWE0LCAweDExNjAsIDB4NjI0MCwgMHg5Mjk1LCAweDAxMDAsIDB4NjI0MiwgMHg5Mjk0LAorCTB4MDAxMCwgMHgwMTI4LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDYwMGUsIDB4MDBmMCwgMHg2MDQwLAorCTB4OTA4NCwgMHgwMDEwLCAweDkwODUsIDB4MDE0MCwgMHg2MDQyLCAweDYwNDMsIDB4MDAwMCwgMHg3MDg3LAorCTB4MDAwMCwgMHg3MGEzLCAweDAwMDEsIDB4NzBjNywgMHgwMDAwLCAweDcwZGYsIDB4MDAwMCwgMHgyMDA5LAorCTB4MWQ4MCwgMHgyMDBiLCAweDAwMDAsIDB4NzA5NywgMHgwMDAwLCAweDcwOGIsIDB4MDAwZiwgMHgyMDA5LAorCTB4MDAwZiwgMHgyMDExLCAweDVlZjAsIDB4MDgwYywgMHg4NzkyLCAweDAwMDUsIDB4MjAwMSwgMHgxODY5LAorCTB4MjAwNCwgMHhkMDhjLCAweDAxMTAsIDB4NzA1ZiwgMHhmZmZmLCAweDcwODgsIDB4OTAwNSwgMHgxNTI4LAorCTB4MjAxMSwgMHg1ZWYwLCAweDA4MGMsIDB4ODZjOCwgMHg2MDQwLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LAorCTB4MDAyMCwgMHg2MDQyLCAweDIwYTksIDB4MDBjOCwgMHg2MDQ0LCAweGQwOGMsIDB4MTE2OCwgMHgxZjA0LAorCTB4NTgzYywgMHg2MjQyLCAweDcwOWIsIDB4MDAwMCwgMHg2MDQwLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LAorCTB4MDA4MCwgMHg2MDQyLCAweDYyNDIsIDB4MDA0OCwgMHg2MjQyLCAweDcwOWIsIDB4MDAwMCwgMHg3MDhmLAorCTB4MDAwMCwgMHg5MDA2LCAweDA4MGMsIDB4NjA5NywgMHgwMDAwLCAweDAwMDUsIDB4NzA4YywgMHg5MDhhLAorCTB4MDAwMywgMHgxYTBjLCAweDBkN2QsIDB4MDAwYiwgMHgwMDA1LCAweDU4NjAsIDB4NThiMSwgMHg1OTRjLAorCTB4MDBmNiwgMHgwMDE2LCAweDY5MDAsIDB4OTE4YywgMHgwODAwLCAweDcwOGYsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4NjgwMywgMHgwMGZjLCAweDIwYTksIDB4MDAwNCwgMHg2ODAwLAorCTB4OTA4NCwgMHgwMGZjLCAweDAxMjAsIDB4MWYwNCwgMHg1ODZmLCAweDA4MGMsIDB4MGQ3ZCwgMHg2OGEwLAorCTB4NjhhMiwgMHg2ODljLCAweDY4OWUsIDB4Njg5OCwgMHg2ODlhLCAweGEwMDEsIDB4OTE4ZCwgMHgxNjAwLAorCTB4NjkwMiwgMHgwMDFlLCAweDY4MzcsIDB4MDAyMCwgMHgwODBjLCAweDYwNzMsIDB4MjA3OSwgMHgxZDAwLAorCTB4NzgzMywgMHgxMTAxLCAweDc4MzcsIDB4MDAwMCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LAorCTB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MWQwZSwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHgwODBjLAorCTB4YTcxMywgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxZDAwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLAorCTB4MDI0MCwgMHgyMGE5LCAweDAwMTQsIDB4NDAwMywgMHg2MGMzLCAweDAwMGMsIDB4NjAwZiwgMHgwMDAwLAorCTB4MDgwYywgMHg1ZjIxLCAweDAwZmUsIDB4OTAwNiwgMHg3MDkyLCAweDYwNDMsIDB4MDAwOCwgMHg2MDQyLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4NzA5MywgMHgwMDAwLCAweDkwMjUsIDB4MDkwNCwgMHg1OTI5LAorCTB4NjAyMCwgMHhkMGI0LCAweDE5MDQsIDB4NTkyNywgMHg3MWEwLCAweDgxZmYsIDB4MDkwNCwgMHg1OTE1LAorCTB4OTQ4NiwgMHgwMDBjLCAweDE5MDQsIDB4NTkyMiwgMHg5NDgwLCAweDAwMTgsIDB4ODAwNCwgMHgyMGE4LAorCTB4MDgwYywgMHg2MDZjLCAweDIwMTEsIDB4MDI2MCwgMHgyMDE5LCAweDFkMDAsIDB4MjIwYywgMHgyMzA0LAorCTB4OTEwNiwgMHgxMWU4LCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweDU4Y2UsIDB4NjA0MywgMHgwMDA0LAorCTB4MjA2MSwgMHgwMTQwLCAweDYwNWIsIDB4YmM5NCwgMHg2MDVmLCAweGYwZjAsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjA0MywgMHgwMDA2LCAweDcwOGYsIDB4MDAwMiwgMHg3MDliLCAweDAwMDIsIDB4MjAwOSwgMHgwN2QwLAorCTB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODc5MiwgMHgwODBjLCAweDYwNzMsIDB4MDRjMCwgMHgwODBjLAorCTB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4NzkzMCwgMHg5MThlLCAweDExMDEsIDB4MTU1OCwgMHg3ODM0LAorCTB4OTAwNSwgMHgxNTQwLCAweDc5MDAsIDB4OTE4YywgMHgwMGZmLCAweDExMTgsIDB4NzgwNCwgMHg5MDA1LAorCTB4MDE5MCwgMHgwODBjLCAweDYwNmMsIDB4MjAxMSwgMHgwMjZlLCAweDIwMTksIDB4MTgwNSwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMjBjLCAweDIzMDQsIDB4OTEwMiwgMHgwMjMwLCAweDExYTAsIDB4ODIxMCwgMHg4MzE4LAorCTB4MWYwNCwgMHg1OTA5LCAweDAwNzgsIDB4NzBhMywgMHgwMDAwLCAweDA4MGMsIDB4NjA2YywgMHgyMGUxLAorCTB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MWQwMCwgMHgyMGE5LAorCTB4MDAxNCwgMHg0MDAzLCAweDYwNDMsIDB4MDAwOCwgMHg2MDQzLCAweDAwMDAsIDB4MDAxMCwgMHgwMGZlLAorCTB4MDAwNSwgMHg2MDQwLCAweDkwODUsIDB4MDEwMCwgMHg2MDQyLCAweDYwMjAsIDB4ZDBiNCwgMHgxZGI4LAorCTB4MDgwYywgMHhhNzEzLCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDFkMDAsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAxNCwgMHg0MDAzLCAweDYwYzMsIDB4MDAwYywgMHgyMDExLAorCTB4MTlmMywgMHgyMDEzLCAweDAwMDAsIDB4NzA5MywgMHgwMDAwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LAorCTB4OTU3NSwgMHgwODBjLCAweDllYzcsIDB4MDhkOCwgMHgwMDA1LCAweDcwOTgsIDB4OTA4YSwgMHgwMDFkLAorCTB4MWEwYywgMHgwZDdkLCAweDAwMGIsIDB4MDAwNSwgMHg1OTdlLCAweDU5OTEsIDB4NTliYSwgMHg1OWRhLAorCTB4NWEwMCwgMHg1YTJmLCAweDVhNTUsIDB4NWE4ZCwgMHg1YWIzLCAweDVhZTEsIDB4NWIxYywgMHg1YjU0LAorCTB4NWI3MiwgMHg1YjlkLCAweDViYmYsIDB4NWJkYSwgMHg1YmU0LCAweDVjMTgsIDB4NWMzZSwgMHg1YzZkLAorCTB4NWM5MywgMHg1Y2NiLCAweDVkMGYsIDB4NWQ0YywgMHg1ZDZkLCAweDVkYzYsIDB4NWRlOCwgMHg1ZTE2LAorCTB4NWUxNiwgMHgwMGM2LCAweDIwNjEsIDB4MTgwMCwgMHg2MDAzLCAweDAwMDcsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAwNCwgMHg5MDg0LCAweGZmZjksIDB4NjAwNiwgMHgwMGNlLCAweDAwMDUsIDB4MjA2MSwgMHgwMTQwLAorCTB4NjA1YiwgMHhiYzk0LCAweDYwNWYsIDB4ZjBmMCwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDAyLAorCTB4NzA5YiwgMHgwMDAxLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NzkyLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTA4NiwgMHgwMDE0LCAweDE1MTAsIDB4NjA0MiwgMHg2MDIwLAorCTB4ZDBiNCwgMHgxMWYwLCAweDA4MGMsIDB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LAorCTB4MTEwMiwgMHgxMWEwLCAweDc4MzQsIDB4OTAwNSwgMHgxMTg4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LAorCTB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLAorCTB4ODZjOCwgMHg3MDliLCAweDAwMTAsIDB4MDgwYywgMHg1YmU0LCAweDAwMTAsIDB4NzA5MywgMHgwMDAwLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLAorCTB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4MDgwYywgMHg1ZmYwLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLAorCTB4MTEwMiwgMHg3ODM3LCAweDAwMDAsIDB4MjBhOSwgMHgwMDA4LCAweDlmODgsIDB4MDAwZSwgMHgyMDBiLAorCTB4MDAwMCwgMHg4MTA4LCAweDFmMDQsIDB4NTljZiwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjIxLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZWY3LAorCTB4MDgwYywgMHg4NmM4LCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NjA2YywgMHgyMDc5LAorCTB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwMiwgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLAorCTB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLAorCTB4NzA5YiwgMHgwMDA0LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDYwNDgsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDliLCAweDAwMDUsIDB4MDgwYywgMHg1ZmYwLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLAorCTB4MTEwMywgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg2MDZjLCAweDA4MGMsIDB4NjA0ZiwgMHgxMTcwLAorCTB4NzA4NCwgMHg5MDA1LCAweDExNTgsIDB4NzE1YywgMHg5MTg2LCAweGZmZmYsIDB4MDEzOCwgMHgyMDExLAorCTB4MDAwOCwgMHgwODBjLCAweDVlYTQsIDB4MDE2OCwgMHgwODBjLCAweDYwMjUsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLAorCTB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjIxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA5MCwgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwgMHg5MDg2LAorCTB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LAorCTB4MTEwMywgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LAorCTB4NzBjNCwgMHg5MDA1LCAweDExMTAsIDB4NzBjNywgMHgwMDAxLCAweDcwOWIsIDB4MDAwNiwgMHgwMDI5LAorCTB4MDAxMCwgMHgwODBjLCAweDYwNDgsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDA3LAorCTB4MDgwYywgMHg1ZmYwLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDQsIDB4NzgzNywgMHgwMDAwLAorCTB4MDgwYywgMHg2MDZjLCAweDA4MGMsIDB4NjA0ZiwgMHgxMWI4LCAweDcwODQsIDB4OTAwNSwgMHgxMWEwLAorCTB4NzE2NCwgMHg5MTg2LCAweGZmZmYsIDB4MDE4MCwgMHg5MTgwLCAweDMzYjksIDB4MjAwZCwgMHg5MThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDVlYTQsIDB4MDE4MCwgMHgwODBjLAorCTB4NTAyZCwgMHgwMTEwLCAweDA4MGMsIDB4MjZjYSwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLAorCTB4MDAxNCwgMHgwODBjLCAweDVmMjEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LAorCTB4MDUwMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LAorCTB4MDgwYywgMHg2MDZjLCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNCwgMHgxMTc4LAorCTB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LAorCTB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDA4LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLAorCTB4NjA0OCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMDksIDB4MDgwYywgMHg1ZmYwLAorCTB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNSwgMHg3ODM3LCAweDAxMDAsIDB4MDgwYywgMHg2MDRmLAorCTB4MTE1MCwgMHg3MDg0LCAweDkwMDUsIDB4MTEzOCwgMHgwODBjLCAweDVlMTcsIDB4MTE4OCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDI2Y2EsIDB4MjBhOSwgMHgwMDA4LCAweDA4MGMsIDB4NjA2YywgMHgyMGUxLAorCTB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLAorCTB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWYyMSwgMHgwMDEwLCAweDA4MGMsIDB4NTk3MSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwNWE4LCAweDIwMTEsIDB4NWVmNywgMHgwODBjLAorCTB4ODZjOCwgMHg5MDg2LCAweDAwMTQsIDB4MTU2MCwgMHgwODBjLCAweDYwNmMsIDB4MjA3OSwgMHgwMjYwLAorCTB4N2EzMCwgMHg5Mjk2LCAweDExMDUsIDB4MTUyMCwgMHg3ODM0LCAweDkwODQsIDB4MDEwMCwgMHgyMDExLAorCTB4MDEwMCwgMHg5MjFlLCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LAorCTB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDBhLCAweDAwYjEsIDB4MDA5OCwgMHg5MDA1LAorCTB4MTE3OCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LAorCTB4MDAwMSwgMHg3MDk3LCAweDAwMDAsIDB4NzA5YiwgMHgwMDBlLCAweDA4MGMsIDB4NWJiZiwgMHgwMDEwLAorCTB4MDgwYywgMHg2MDQ4LCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOWIsIDB4MDAwYiwgMHgyMDExLAorCTB4MWQwZSwgMHgyMGU5LCAweDAwMDEsIDB4MjJhMCwgMHgyMGE5LCAweDAwNDAsIDB4MjAxOSwgMHhmZmZmLAorCTB4NDMwNCwgMHgwODBjLCAweDVmZjAsIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNiwgMHg3ODM3LAorCTB4MDAwMCwgMHgwODBjLCAweDYwNGYsIDB4MDExOCwgMHgyMDEzLCAweDAwMDAsIDB4MDAyMCwgMHg3MDYwLAorCTB4OTA4NSwgMHgwMTAwLCAweDIwMTIsIDB4MjBhOSwgMHgwMDQwLCAweDIwMDksIDB4MDI0ZSwgMHgyMDExLAorCTB4MWQwZSwgMHgyMjBlLCAweDgyMTAsIDB4ODEwOCwgMHg5MTg2LCAweDAyNjAsIDB4MTEyOCwgMHg2ODEwLAorCTB4ODAwMCwgMHg2ODEyLCAweDIwMDksIDB4MDI0MCwgMHgxZjA0LCAweDViNDEsIDB4NjBjMywgMHgwMDg0LAorCTB4MDgwYywgMHg1ZjIxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwMWMwLAorCTB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwgMHg5MDg2LCAweDAwODQsIDB4MTE3OCwgMHgwODBjLAorCTB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDYsIDB4MTEzOCwgMHg3ODM0LAorCTB4OTAwNSwgMHgxMTIwLCAweDcwOWIsIDB4MDAwYywgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg2MDQ4LAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDBkLCAweDA4MGMsIDB4NWZmMCwgMHgyMDc5LAorCTB4MDI0MCwgMHg3ODMzLCAweDExMDcsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NjA2YywgMHgyMGE5LAorCTB4MDA0MCwgMHgyMDExLCAweDAyNmUsIDB4MjAwOSwgMHgwMjRlLCAweDIyMGUsIDB4ODIxMCwgMHg4MTA4LAorCTB4OTE4NiwgMHgwMjYwLCAweDExNTAsIDB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAwOSwgMHgwMjQwLAorCTB4NjgxNCwgMHg4MDAwLCAweDY4MTYsIDB4MjAxMSwgMHgwMjYwLCAweDFmMDQsIDB4NWI4NSwgMHg2MGMzLAorCTB4MDA4NCwgMHgwODBjLCAweDVmMjEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LAorCTB4MDFlMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDkwODYsIDB4MDA4NCwgMHgxMTk4LAorCTB4MDgwYywgMHg2MDZjLCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNywgMHgxMTU4LAorCTB4NzgzNCwgMHg5MDA1LCAweDExNDAsIDB4NzA5NywgMHgwMDAxLCAweDA4MGMsIDB4NWZjMiwgMHg3MDliLAorCTB4MDAwZSwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg2MDQ4LCAweDAwZmUsIDB4MDAwNSwgMHg5MThkLAorCTB4MDAwMSwgMHgwODBjLCAweDYwOTcsIDB4NzA5YiwgMHgwMDBmLCAweDcwOTMsIDB4MDAwMCwgMHgyMDYxLAorCTB4MDE0MCwgMHg2MDViLCAweGJjODUsIDB4NjA1ZiwgMHhiNWI1LCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLAorCTB4MDAwNSwgMHg2MDQzLCAweDAwMDQsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLAorCTB4ODZiYywgMHgwMDA1LCAweDcwOTAsIDB4OTAwNSwgMHgwMTMwLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLAorCTB4ODZjOCwgMHg3MDliLCAweDAwMDAsIDB4MDAwNSwgMHg3MDliLCAweDAwMTEsIDB4MDgwYywgMHhhNzEzLAorCTB4MDgwYywgMHg2MDZjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjBhMSwgMHgwMjQwLCAweDc0OTAsIDB4OTQ4MCwgMHgwMDE4LCAweDkwODAsIDB4MDAwNywgMHg5MDg0LAorCTB4MDNmOCwgMHg4MDA0LCAweDIwYTgsIDB4NDAwMywgMHgwODBjLCAweDYwNGYsIDB4MTFhMCwgMHg3MTdjLAorCTB4ODFmZiwgMHgwMTg4LCAweDkwMGUsIDB4NzA4MCwgMHg5MDg0LCAweDAwZmYsIDB4MDE2MCwgMHgwODBjLAorCTB4MjY2MSwgMHg5MTg2LCAweDAwN2UsIDB4MDEzOCwgMHg5MTg2LCAweDAwODAsIDB4MDEyMCwgMHgyMDExLAorCTB4MDAwOCwgMHgwODBjLCAweDVlYTQsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWYyMSwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDUwMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LAorCTB4OTA4NiwgMHgwMDE0LCAweDExYjgsIDB4MDgwYywgMHg2MDZjLCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLAorCTB4OTI5NiwgMHgxMTAzLCAweDExNzgsIDB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDEyLAorCTB4MDAyOSwgMHgwMDEwLCAweDcwOTMsIDB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLAorCTB4MDAxMywgMHgwODBjLCAweDVmZmUsIDB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwMywgMHg3ODM3LAorCTB4MDAwMCwgMHgwODBjLCAweDYwNmMsIDB4MDgwYywgMHg2MDRmLCAweDExNzAsIDB4NzA4NCwgMHg5MDA1LAorCTB4MTE1OCwgMHg3MTVjLCAweDkxODYsIDB4ZmZmZiwgMHgwMTM4LCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLAorCTB4NWVhNCwgMHgwMTY4LCAweDA4MGMsIDB4NjAyNSwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLAorCTB4MDAxNCwgMHgwODBjLCAweDVmMjEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5MCwgMHg5MDA1LAorCTB4MDUwMCwgMHgyMDExLCAweDVlZjcsIDB4MDgwYywgMHg4NmM4LCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LAorCTB4MDgwYywgMHg2MDZjLCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNCwgMHgxMTc4LAorCTB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjNCwgMHg5MDA1LAorCTB4MTExMCwgMHg3MGM3LCAweDAwMDEsIDB4NzA5YiwgMHgwMDE0LCAweDAwMjksIDB4MDAxMCwgMHg3MDkzLAorCTB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDliLCAweDAwMTUsIDB4MDgwYywgMHg1ZmZlLAorCTB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNCwgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg2MDZjLAorCTB4MDgwYywgMHg2MDRmLCAweDExYjgsIDB4NzA4NCwgMHg5MDA1LCAweDExYTAsIDB4NzE2NCwgMHg5MTg2LAorCTB4ZmZmZiwgMHgwMTgwLCAweDkxODAsIDB4MzNiOSwgMHgyMDBkLCAweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4NWVhNCwgMHgwMTgwLCAweDA4MGMsIDB4NTAyZCwgMHgwMTEwLAorCTB4MDgwYywgMHgyNmNhLCAweDIwYTksIDB4MDAwOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLAorCTB4NWYyMSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLCAweDkwMDUsIDB4MDVmMCwgMHgyMDExLAorCTB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4OTA4NiwgMHgwMDE0LCAweDE1YTgsIDB4MDgwYywgMHg2MDZjLAorCTB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA1LCAweDE1NjgsIDB4NzgzNCwgMHg5MDg0LAorCTB4MDEwMCwgMHgyMDExLCAweDAxMDAsIDB4OTIxZSwgMHgxMTY4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLAorCTB4NjA5NywgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LCAweDkwMDUsIDB4MTExMCwgMHg3MGM3LAorCTB4MDAwMSwgMHgwMDgwLCAweDkwMDUsIDB4MTFiOCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGM0LAorCTB4OTAwNSwgMHgxMTEwLCAweDcwYzcsIDB4MDAwMSwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg2MDk3LAorCTB4NzA5NywgMHgwMDAwLCAweDdhMzgsIDB4ZDJmNCwgMHgwMTEwLCAweDcwZGYsIDB4MDAwOCwgMHg3MDliLAorCTB4MDAxNiwgMHgwMDI5LCAweDAwMTAsIDB4NzA5MywgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgwODBjLAorCTB4YTcxMywgMHgwODBjLCAweDYwNmMsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2MCwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDBlLCAweDQwMDMsIDB4MjAxMSwgMHgwMjZkLAorCTB4MjIwNCwgMHg5MDg0LCAweDAxMDAsIDB4MjAxMSwgMHgwMjRkLCAweDIwMTIsIDB4MjAxMSwgMHgwMjZlLAorCTB4NzA5YiwgMHgwMDE3LCAweDA4MGMsIDB4NjA0ZiwgMHgxMTUwLCAweDcwODQsIDB4OTAwNSwgMHgxMTM4LAorCTB4MDgwYywgMHg1ZTE3LCAweDExODgsIDB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjZjYSwgMHgyMGE5LAorCTB4MDAwOCwgMHgwODBjLCAweDYwNmMsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZjIxLAorCTB4MDAxMCwgMHgwODBjLCAweDU5NzEsIDB4MDAwNSwgMHgwMGY2LCAweDcwOTAsIDB4OTAwNSwgMHgwMWQ4LAorCTB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODZjOCwgMHg5MDg2LCAweDAwODQsIDB4MTE5MCwgMHgwODBjLAorCTB4NjA2YywgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDYsIDB4MTE1MCwgMHg3ODM0LAorCTB4OTAwNSwgMHgxMTM4LCAweDkwMDYsIDB4MDgwYywgMHg2MDk3LCAweDcwOWIsIDB4MDAxOCwgMHgwMDI5LAorCTB4MDAxMCwgMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5YiwgMHgwMDE5LAorCTB4MDgwYywgMHg1ZmZlLCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDYsIDB4NzgzNywgMHgwMDAwLAorCTB4MDgwYywgMHg2MDZjLCAweDIwMDksIDB4MDI2ZSwgMHgyMDM5LCAweDFkMGUsIDB4MjBhOSwgMHgwMDQwLAorCTB4MjEzZSwgMHg4NzM4LCAweDgxMDgsIDB4OTE4NiwgMHgwMjgwLCAweDExMjgsIDB4NjgxNCwgMHg4MDAwLAorCTB4NjgxNiwgMHgyMDA5LCAweDAyNjAsIDB4MWYwNCwgMHg1ZDgwLCAweDIwMzksIDB4MWQwZSwgMHgwODBjLAorCTB4NjA0ZiwgMHgxMWU4LCAweDI3MjgsIDB4MjUxNCwgMHg4MjA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDAwLAorCTB4MjAxOCwgMHg5Mjk0LCAweDAwZmYsIDB4ODAwNywgMHg5MjA1LCAweDIwMmEsIDB4NzA2MCwgMHgyMzEwLAorCTB4ODIxNCwgMHg5MmEwLCAweDFkMGUsIDB4MjQxNCwgMHg5MzhjLCAweDAwMDEsIDB4MDExOCwgMHg5Mjk0LAorCTB4ZmYwMCwgMHgwMDE4LCAweDkyOTQsIDB4MDBmZiwgMHg4MDA3LCAweDkyMTUsIDB4MjIyMiwgMHgyMGE5LAorCTB4MDA0MCwgMHgyMDA5LCAweDAyNGUsIDB4MjcwZSwgMHg4NzM4LCAweDgxMDgsIDB4OTE4NiwgMHgwMjYwLAorCTB4MTEyOCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDA5LCAweDAyNDAsIDB4MWYwNCwgMHg1ZGIzLAorCTB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NWYyMSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDkwLAorCTB4OTAwNSwgMHgwMWUwLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4OTA4NiwgMHgwMDg0LAorCTB4MTE5OCwgMHgwODBjLCAweDYwNmMsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA3LAorCTB4MTE1OCwgMHg3ODM0LCAweDkwMDUsIDB4MTE0MCwgMHg3MDk3LCAweDAwMDEsIDB4MDgwYywgMHg1ZmMyLAorCTB4NzA5YiwgMHgwMDFhLCAweDAwMjksIDB4MDAxMCwgMHg3MDkzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LAorCTB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NjA5NywgMHg3MDliLCAweDAwMWIsIDB4MDgwYywgMHhhNzEzLAorCTB4MDgwYywgMHg2MDZjLCAweDIwMTEsIDB4MDI2MCwgMHgyMDA5LCAweDAyNDAsIDB4NzQ5MCwgMHg5NDgwLAorCTB4MDAxOCwgMHg5MDgwLCAweDAwMDcsIDB4OTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHgyMjBlLAorCTB4ODIxMCwgMHg4MTA4LCAweDkxODYsIDB4MDI2MCwgMHgxMTUwLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLAorCTB4MjAwOSwgMHgwMjQwLCAweDY4MTQsIDB4ODAwMCwgMHg2ODE2LCAweDIwMTEsIDB4MDI2MCwgMHgxZjA0LAorCTB4NWRmZiwgMHg2MGMzLCAweDAwODQsIDB4MDgwYywgMHg1ZjIxLCAweDAwMDUsIDB4MDAwNSwgMHgwMDg2LAorCTB4MDA5NiwgMHgyMDI5LCAweDE4NDgsIDB4MjUyYywgMHgyMGE5LCAweDAwMDgsIDB4MjA0MSwgMHgxZDBlLAorCTB4MjBlOSwgMHgwMDAxLCAweDI4YTAsIDB4MDgwYywgMHg2MDZjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LAorCTB4MDI2ZSwgMHg0MDAzLCAweDIwYTksIDB4MDAwOCwgMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMTA4LAorCTB4OTAxNiwgMHgyODAwLCAweDkyMDAsIDB4MjAwYywgMHg5MWE2LCAweGZmZmYsIDB4MTE0OCwgMHhkNWQ0LAorCTB4MDExMCwgMHg4MjEwLCAweDAwMDgsIDB4ODIxMSwgMHgxZjA0LCAweDVlMzEsIDB4MDgwNCwgMHg1ZWEwLAorCTB4ODJmZiwgMHgxMTYwLCAweGQ1ZDQsIDB4MDEyMCwgMHg5MWE2LCAweDNmZmYsIDB4MGQ5MCwgMHgwMDIwLAorCTB4OTFhNiwgMHgzZmZmLCAweDA5MDQsIDB4NWVhMCwgMHg5MThkLCAweGMwMDAsIDB4MjBhOSwgMHgwMDEwLAorCTB4MjAxOSwgMHgwMDAxLCAweGQ1ZDQsIDB4MDExMCwgMHgyMDE5LCAweDAwMTAsIDB4MjEyMCwgMHhkNWQ0LAorCTB4MDExMCwgMHg4NDIzLCAweDAwMDgsIDB4ODQyNCwgMHgxMjQwLCAweGQ1ZDQsIDB4MDExMCwgMHg4MzE5LAorCTB4MDAwOCwgMHg4MzE4LCAweDFmMDQsIDB4NWU1NywgMHgwNGQ4LCAweDIzYTgsIDB4MjAyMSwgMHgwMDAxLAorCTB4ODQyNiwgMHg4NDI1LCAweDFmMDQsIDB4NWU2OSwgMHgyMzI4LCAweDg1MjksIDB4OTJiZSwgMHgwMDA3LAorCTB4MDE1OCwgMHgwMDA2LCAweDIwMzksIDB4MDAwNywgMHgyMjAwLCAweDk3M2EsIDB4MDAwZSwgMHgyN2E4LAorCTB4OTVhOCwgMHgwMDEwLCAweDFmMDQsIDB4NWU3OCwgMHg3NTVlLCAweDk1YzgsIDB4MzNiOSwgMHgyOTJkLAorCTB4OTVhYywgMHgwMGZmLCAweDc1ODIsIDB4NjUzMiwgMHg2NTM2LCAweDAwMTYsIDB4MjUwOCwgMHgwODBjLAorCTB4MjZhYSwgMHgwMDFlLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLCAweDIwMTgsIDB4MjMwNCwgMHg5NDA1LAorCTB4MjAxYSwgMHg3MDg3LCAweDAwMDEsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHgyMGUxLAorCTB4MDAwMSwgMHgyODk4LCAweDIwYTksIDB4MDAwOCwgMHg0MDAzLCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LAorCTB4OTAwNiwgMHgwMDllLCAweDAwOGUsIDB4MDAwNSwgMHgwMTU2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LAorCTB4MDE0NiwgMHgyMmE4LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjAxMSwgMHgwMjRlLCAweDIyYTAsIDB4NDAwMywgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLAorCTB4MDE1ZSwgMHgyMTE4LCAweDkwMjYsIDB4MjAwMSwgMHgwMDA3LCAweDkzOWEsIDB4MDAxMCwgMHgwMjE4LAorCTB4ODQyMCwgMHg4MDAxLCAweDBjZDAsIDB4MjExOCwgMHg4NGZmLCAweDAxMjAsIDB4OTM5YSwgMHgwMDEwLAorCTB4ODQyMSwgMHgxZGUwLCAweDIwMjEsIDB4MDAwMSwgMHg4M2ZmLCAweDAxMTgsIDB4ODQyMywgMHg4MzE5LAorCTB4MWRlOCwgMHg5MjM4LCAweDIwMjksIDB4MDI2ZSwgMHg5NTI4LCAweDI1MDQsIDB4OTQyYywgMHgxMWI4LAorCTB4OTQwNSwgMHgyMDNhLCAweDcxNWUsIDB4OTFhMCwgMHgzM2I5LCAweDI0MmQsIDB4OTVhYywgMHgwMGZmLAorCTB4NzU4MiwgMHg2NTMyLCAweDY1MzYsIDB4MDAxNiwgMHgyNTA4LCAweDA4MGMsIDB4MjZhYSwgMHgwMDFlLAorCTB4NjBlNywgMHgwMDAwLCAweDY1ZWEsIDB4NzA4NywgMHgwMDAxLCAweDkwODQsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4NzA4YiwgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MjA3MSwgMHgwMTQwLCAweDA4MGMsIDB4NWZiMSwgMHgwODBjLAorCTB4OWVkNCwgMHg3MDA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmE4YSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgyNiwgMHgyMDczLCAweDAwMDAsIDB4Nzg0MCwgMHgwMDI2LAorCTB4MDAxNiwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg2MDBlLCAweDAwMWUsIDB4OTA5NCwgMHgwMDEwLAorCTB4OTI4NSwgMHgwMDgwLCAweDc4NDIsIDB4N2E0MiwgMHgwMDJlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDI5ZTUsIDB4MDIyOCwgMHgyMDExLAorCTB4MDEwMSwgMHgyMjA0LCAweGMwYzUsIDB4MjAxMiwgMHgyMDExLCAweDE5ZjMsIDB4MjAxMywgMHgwMDAwLAorCTB4NzA5MywgMHgwMDAwLCAweDAxMmUsIDB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwODBjLAorCTB4OWVjNywgMHg2MTQ0LCAweGQxODQsIDB4MDEyMCwgMHg3MTk4LCAweDkxOGQsIDB4MjAwMCwgMHgwMDE4LAorCTB4NzE4YywgMHg5MThkLCAweDEwMDAsIDB4MjAxMSwgMHgxOTk4LCAweDIxMTIsIDB4MjAwOSwgMHgwN2QwLAorCTB4MjAxMSwgMHg1ZWY3LCAweDA4MGMsIDB4ODc5MiwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YWJlOSwgMHgwODBjLAorCTB4YTkzYSwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg2MDBlLCAweDIwNjEsIDB4MWEwMiwgMHg5MDBlLAorCTB4NjExYSwgMHg2MTFlLCAweDYxNzIsIDB4NjE3NiwgMHgyMDYxLCAweDE4MDAsIDB4NjAwMywgMHgwMDAxLAorCTB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwgMHgxOTk4LAorCTB4MjAwYiwgMHgwMDAwLCAweDIwMDksIDB4MDAyZCwgMHgyMDExLCAweDVmN2QsIDB4MDgwYywgMHg4NmJjLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA0NzEsIDB4MjA3MSwgMHgwMTAwLCAweDA4MGMsIDB4OWVkNCwgMHgyMDcxLAorCTB4MDE0MCwgMHg3MDA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmE4YSwgMHgwODBjLAorCTB4NzU0NSwgMHgwMTg4LCAweDA4MGMsIDB4NzU2MCwgMHgxMTcwLCAweDA4MGMsIDB4Nzg0YSwgMHgwMDE2LAorCTB4MDgwYywgMHgyNzc5LCAweDIwMDEsIDB4MTk2YywgMHgyMTAyLCAweDAwMWUsIDB4MDgwYywgMHg3ODQ1LAorCTB4MDgwYywgMHg3NDZlLCAweDAwNTAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MmE2NiwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDI2MDYsIDB4MDgwYywgMHg1ZjRkLCAweDAxMmUsIDB4MDAwZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGJjLCAweDAxNTgsIDB4MDAyNiwgMHgwMDM2LAorCTB4MjAxMSwgMHg4MDE3LCAweDIwMDEsIDB4MTk5OCwgMHgyMDFjLCAweDA4MGMsIDB4NGI1MiwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDA1LCAweDIwYTksIDB4MDAxMiwgMHgyMGU5LCAweDAwMDEsIDB4MjBhMSwgMHgxZDgwLAorCTB4MDgwYywgMHg2MDZjLCAweDIwZTksIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MDA5OSwgMHgyMGE5LAorCTB4MDAyMCwgMHgwODBjLCAweDYwNjYsIDB4MjA5OSwgMHgwMjYwLCAweDIwYTEsIDB4MWQ5MiwgMHgwMDUxLAorCTB4MjBhOSwgMHgwMDBlLCAweDA4MGMsIDB4NjA2OSwgMHgyMDk5LCAweDAyNjAsIDB4MjBhMSwgMHgxZGIyLAorCTB4MDAwOSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgzNDEwLCAweDMzMDgsIDB4MjEwNCwgMHg4MDA3LAorCTB4MjAxMiwgMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwgMHg1ZmU2LCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDgwYywgMHhhNzEzLCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LCAweDFkMDAsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwYywgMHg0MDAzLCAweDAwMDUsIDB4MDgwYywgMHhhNzEzLAorCTB4MDgwYywgMHg2MDZjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwYywgMHg0MDAzLCAweDAwMDUsIDB4MDBjNiwgMHgwMDA2LAorCTB4MjA2MSwgMHgwMTAwLCAweDgxMGYsIDB4MjAwMSwgMHgxODM0LCAweDIwMDQsIDB4OTAwNSwgMHgxMTM4LAorCTB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweDkxMDUsIDB4MDAxMCwgMHg5MTg1LAorCTB4MDBmNywgMHg2MDRhLCAweDAwMGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA0NiwgMHgwODBjLAorCTB4NmFkOSwgMHgwMTU4LCAweDkwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwYywgMHhlNDQ1LAorCTB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksIDB4MDAyYSwgMHg5MDBlLAorCTB4MDgwYywgMHgzMjA1LCAweDA4MGMsIDB4ZDA5YiwgMHgwMTQwLCAweDAwMzYsIDB4MjAxOSwgMHhmZmZmLAorCTB4MjAyMSwgMHgwMDA3LCAweDA4MGMsIDB4NGQwOSwgMHgwMDNlLCAweDAwNGUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDgwYywgMHg1ZjRkLCAweDcwOWIsIDB4MDAwMCwgMHg3MDkzLCAweDAwMDAsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDA5YywgMHgwMTAwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHg5MThkLAorCTB4MDAwNiwgMHgyMTAyLCAweDAxMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDAyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDAwOCwgMHg5MDBlLCAweDY4MTQsIDB4OTA4NCwgMHhmZmMwLAorCTB4OTEwZCwgMHg2OTE2LCAweDAwMDUsIDB4MDBmNiwgMHgwMTU2LCAweDAxNDYsIDB4MDFkNiwgMHg5MDA2LAorCTB4MjBhOSwgMHgwMDgwLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDFkMDAsIDB4NDAwNCwgMHgyMDc5LAorCTB4MWQwMCwgMHg3ODAzLCAweDIyMDAsIDB4NzgwNywgMHgwMGVmLCAweDc4MGYsIDB4MDBlZiwgMHg3ODEzLAorCTB4MDEzOCwgMHg3ODIzLCAweGZmZmYsIDB4NzgyNywgMHhmZmZmLCAweDAxZGUsIDB4MDE0ZSwgMHgwMTVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTlhNSwgMHgwMTE4LCAweDIwMDMsIDB4MDAwMSwgMHgwMDEwLCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDE1NiwgMHgyMGE5LCAweDA4MDAsIDB4MjAwOSwgMHgxMDAwLCAweDkwMDYsIDB4MjAwYSwgMHg4MTA4LAorCTB4MWYwNCwgMHg2MGE2LCAweDAxNWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4MDE1NiwgMHgwMTM2LAorCTB4MDE0NiwgMHgyMDY5LCAweDE4NDcsIDB4OTAwNiwgMHhiODAyLCAweGI4ZDYsIDB4YjgwNywgMHgwNzA3LAorCTB4YjgwYSwgMHhiODBlLCAweGI4MTIsIDB4OTE5OCwgMHgzM2I5LCAweDIzMWQsIDB4OTM5YywgMHgwMGZmLAorCTB4YmIxNiwgMHgwMDE2LCAweDAwMjYsIDB4Yjg4NiwgMHgwODBjLCAweGFiZTIsIDB4MTEyMCwgMHg5MTkyLAorCTB4MDA3ZSwgMHgxMjA4LCAweGJiODYsIDB4MjBhOSwgMHgwMDA0LCAweGI4YzQsIDB4MjBlOCwgMHhiOWM4LAorCTB4OTE5OCwgMHgwMDA2LCAweDkwMDYsIDB4MjNhMCwgMHg0MDA0LCAweDIwYTksIDB4MDAwNCwgMHg5MTk4LAorCTB4MDAwYSwgMHgyM2EwLCAweDQwMDQsIDB4MDAyZSwgMHgwMDFlLCAweGI4M2UsIDB4Yjg0MiwgMHhiOGNlLAorCTB4YjhkMiwgMHhiODVlLCAweGI4NjIsIDB4Yjg2NiwgMHhiODZhLCAweGI4NmYsIDB4MDEwMCwgMHhiODcyLAorCTB4Yjg3NiwgMHhiODdhLCAweGI4OGEsIDB4Yjg4ZSwgMHhiODkzLCAweDAwMDgsIDB4Yjg5NiwgMHhiODlhLAorCTB4Yjg5ZSwgMHhiOGJlLCAweGI5YTIsIDB4MDA5NiwgMHhiOGE0LCAweDkwNGQsIDB4MDExMCwgMHgwODBjLAorCTB4MTA3OSwgMHhiOGE3LCAweDAwMDAsIDB4MDA5ZSwgMHg5MDA2LCAweGI4NGEsIDB4NjgxMCwgMHhiODNhLAorCTB4NjgwYywgMHhiODQ2LCAweGI4YmIsIDB4MDUyMCwgMHhiOGFjLCAweDkwMDUsIDB4MDE5OCwgMHgwMGM2LAorCTB4MjA2MCwgMHg5YzgyLCAweDFkZGMsIDB4MGEwYywgMHgwZDdkLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LAorCTB4OWMwMiwgMHgxYTBjLCAweDBkN2QsIDB4MDgwYywgMHg4YzFmLCAweDAwY2UsIDB4MDkwYywgMHg4ZmJjLAorCTB4YjhhZiwgMHgwMDAwLCAweDY4MTQsIDB4OTA4NCwgMHgwMGZmLCAweGI4NDIsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDE1ZSwgMHgwMDNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOTc0LAorCTB4YWU3OCwgMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLCAweDFhMDQsIDB4NjE4MiwgMHg5MTgyLAorCTB4MDgwMCwgMHgxYTA0LCAweDYxODYsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4OTA4NCwgMHgwMDAzLAorCTB4MTkwNCwgMHg2MThjLCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MDE5OCwgMHhiODA0LAorCTB4OTA4NCwgMHgwMGZmLCAweDkwOGUsIDB4MDAwNiwgMHgxMTg4LCAweGI4YTQsIDB4OTAwZCwgMHgxOTA0LAorCTB4NjE5ZSwgMHgwODBjLCAweDY1NWUsIDB4OTAwNiwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMDA1LAorCTB4OTAwZSwgMHgwNGI4LCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLCAweDA0OTgsIDB4OTA4MiwgMHgwMDA2LAorCTB4MTI5MCwgMHgwODBjLCAweGFiZTIsIDB4MTE2MCwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxMTQwLAorCTB4YjkwMCwgMHhkMWZjLCAweDBkMTAsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwNDA4LAorCTB4MjAwMSwgMHgwMDI4LCAweDAwYTgsIDB4MjAwOSwgMHgxODBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMTE4LAorCTB4MjAwMSwgMHgwMDA0LCAweDAwNjgsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDQwLAorCTB4MjAwMSwgMHgwMDI5LCAweGI5MDAsIDB4ZDFmYywgMHgwMTE4LCAweDIwMDksIDB4MTAwMCwgMHgwMDQ4LAorCTB4OTAwZSwgMHgwMDM4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDAwMTgsIDB4MjAwMSwgMHgwMDI5LAorCTB4OTAwZSwgMHg5MDA1LCAweDAxMmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMDg0LAorCTB4MTlkMCwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDY1LCAweDA5YTgsIDB4MDgwYywgMHg2YWRkLAorCTB4MTk5MCwgMHhiODAwLCAweGQwYmMsIDB4MDk3OCwgMHgwODA0LCAweDYxNDUsIDB4MDgwYywgMHg2OTAyLAorCTB4MDkwNCwgMHg2MTRlLCAweDA4MDQsIDB4NjE0OSwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwgMHg3MDA0LAorCTB4OTA4NiwgMHgwMDAyLCAweDExMjgsIDB4NzAzMCwgMHg5MDgwLCAweDAwMDQsIDB4MjAwNCwgMHg5YjA2LAorCTB4MDBlZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhODc0LAorCTB4OTA4ZSwgMHgwMGZmLCAweDExMjAsIDB4MjAwMSwgMHgxOTZhLCAweDIwNWMsIDB4MDA2MCwgMHhhOTc0LAorCTB4OTE4MiwgMHgwODAwLCAweDE2OTAsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwMWQwLAorCTB4MDgwYywgMHg2YTdkLCAweDExZDAsIDB4MDgwYywgMHhhYzVhLCAweDA1NzAsIDB4MmIwMCwgMHg2MDEyLAorCTB4MjkwMCwgMHg2MDE2LCAweDYwMjMsIDB4MDAwOSwgMHg2MDJiLCAweDAwMDAsIDB4YTg3NCwgMHg5MDhlLAorCTB4MDBmZiwgMHgxMTEwLCAweDYwMmIsIDB4ODAwMCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhhZDRkLAorCTB4OTAwNiwgMHgwMGIwLCAweDIwMDEsIDB4MDAyOCwgMHgwMDkwLCAweDIwMDksIDB4MTgwYywgMHgyMTBjLAorCTB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDA1LAorCTB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMmMsIDB4MGNjMCwgMHgwMGI2LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOTc0LCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LAorCTB4NjI3ZCwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDA5MDQsIDB4NjI1NSwgMHhiOGEwLAorCTB4OTA4NiwgMHgwMDdmLCAweDAxOTAsIDB4YTg3YywgMHhkMGZjLCAweDExNzgsIDB4MDgwYywgMHg2YWU1LAorCTB4MDE2MCwgMHhhOTk0LCAweDgxZmYsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwgMHg5MDhlLAorCTB4MDAwNSwgMHgwMTE4LCAweDA4MGMsIDB4NmFkZCwgMHgxNTk4LCAweGE4N2MsIDB4ZDBmYywgMHgwMWUwLAorCTB4YTg5NCwgMHg5MDA1LCAweDAxYzgsIDB4MjA2MCwgMHgwMDI2LCAweDIwMTAsIDB4MDgwYywgMHhjOTY4LAorCTB4MDAyZSwgMHgxMTIwLCAweDIwMDEsIDB4MDAwOCwgMHgwODA0LCAweDYyN2YsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwYSwgMHgwMTIwLCAweDIwMDEsIDB4MDAwOCwgMHgwODA0LCAweDYyN2YsIDB4NjAxYSwgMHg2MDAzLAorCTB4MDAwOCwgMHgyOTAwLCAweDYwMTYsIDB4MDA1OCwgMHgwODBjLCAweGFjNWEsIDB4MDVlOCwgMHgyYjAwLAorCTB4NjAxMiwgMHgyOTAwLCAweDYwMTYsIDB4NjAwYiwgMHhmZmZmLCAweDYwMjMsIDB4MDAwYSwgMHgyMDA5LAorCTB4MDAwMywgMHgwODBjLCAweGFkNGQsIDB4OTAwNiwgMHgwNDU4LCAweDIwMDEsIDB4MDAyOCwgMHgwNDM4LAorCTB4OTA4MiwgMHgwMDA2LCAweDEyOTAsIDB4MDgwYywgMHhhYmUyLCAweDExNjAsIDB4YjhhMCwgMHg5MDg0LAorCTB4ZmY4MCwgMHgxMTQwLCAweGI5MDAsIDB4ZDFmYywgMHgwOTAwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LAorCTB4MTAwMCwgMHgwMGE4LCAweDIwMDEsIDB4MDAyOCwgMHgwMDkwLCAweDIwMDksIDB4MTgwYywgMHgyMTBjLAorCTB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDUwLCAweGQxODQsIDB4MDExOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDI4LCAweDIwMDEsIDB4MDAyOSwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDA1LAorCTB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMmMsIDB4MGNjMCwgMHgwMGY2LAorCTB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOGUwLCAweDkwMDUsIDB4MTU1MCwgMHhhOGRjLAorCTB4OTA4MiwgMHgwMTAxLCAweDE2MzAsIDB4YThjOCwgMHg5MDA1LCAweDE1MTgsIDB4YThjNCwgMHg5MDgyLAorCTB4MDEwMSwgMHgxMmY4LCAweGE5NzQsIDB4MjA3OSwgMHgxODAwLCAweDkxODIsIDB4MDgwMCwgMHgxMmU4LAorCTB4NzgzMCwgMHg5MDg0LCAweDAwMDMsIDB4MTEzMCwgMHhhYTk4LCAweGFiOTQsIDB4YTg3OCwgMHg5MDg0LAorCTB4MDAwNywgMHgwMGVhLCAweDc5MzAsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LAorCTB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLAorCTB4MDAzOCwgMHgyMDAxLCAweDAwMmMsIDB4OTAwZSwgMHgwMDE4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLAorCTB4OTAwNiwgMHgwMDA4LCAweDkwMDUsIDB4MDEyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwNSwgMHg2MzE0LAorCTB4NjJjZiwgMHg2MmU2LCAweDYzMTQsIDB4NjMxNCwgMHg2MzE0LCAweDYzMTQsIDB4NjMxNCwgMHgyMTAwLAorCTB4OTA4MiwgMHgwMDdlLCAweDEyNzgsIDB4MDgwYywgMHg2NjMyLCAweDAxNDgsIDB4OTA0NiwgMHhiODEwLAorCTB4OTMwNiwgMHgxOTA0LCAweDYzMWMsIDB4YjgxNCwgMHg5MjA2LCAweDE1ZjAsIDB4MDAyOCwgMHhiYjEyLAorCTB4YmExNiwgMHgwMDEwLCAweDA4MGMsIDB4NGEwNSwgMHgwMTUwLCAweDA0YjAsIDB4MDgwYywgMHg2NjkzLAorCTB4MTU5OCwgMHhiODEwLCAweDkzMDYsIDB4MTU4MCwgMHhiODE0LCAweDkyMDYsIDB4MTU2OCwgMHgwODBjLAorCTB4YWM1YSwgMHgwNTMwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGNlMTUsIDB4MjkwMCwgMHg2MDE2LAorCTB4NjAwYiwgMHhmZmZmLCAweDYwMjMsIDB4MDAwYSwgMHhhODc4LCAweDkwODYsIDB4MDAwMSwgMHgxMTcwLAorCTB4MDgwYywgMHgzMjQwLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NjVlMywgMHgyMDAxLCAweDAyMDAsIDB4Yjg2ZSwgMHhiODkzLCAweDAwMDIsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDgwYywgMHhhZDRkLCAweDkwMDYsIDB4MDA2OCwgMHgyMDAxLCAweDAwMDEsIDB4OTAwZSwgMHgwMDM4LAorCTB4MjAwMSwgMHgwMDJjLCAweDkwMGUsIDB4MDAxOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHg5MDA1LAorCTB4MDAwMCwgMHgwMTJlLCAweDAwYmUsIDB4MDBmZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg5NCwgMHg5MGM2LCAweDAwMTUsIDB4MDkwNCwgMHg2NTA3LAorCTB4OTBjNiwgMHgwMDU2LCAweDA5MDQsIDB4NjUwYiwgMHg5MGM2LCAweDAwNjYsIDB4MDkwNCwgMHg2NTBmLAorCTB4OTBjNiwgMHgwMDY3LCAweDA5MDQsIDB4NjUxMywgMHg5MGM2LCAweDAwNjgsIDB4MDkwNCwgMHg2NTE3LAorCTB4OTBjNiwgMHgwMDcxLCAweDA5MDQsIDB4NjUxYiwgMHg5MGM2LCAweDAwNzQsIDB4MDkwNCwgMHg2NTFmLAorCTB4OTBjNiwgMHgwMDdjLCAweDA5MDQsIDB4NjUyMywgMHg5MGM2LCAweDAwN2UsIDB4MDkwNCwgMHg2NTI3LAorCTB4OTBjNiwgMHgwMDM3LCAweDA5MDQsIDB4NjUyYiwgMHg5MDE2LCAweDIwNzksIDB4MTgwMCwgMHhhOTc0LAorCTB4OTE4NiwgMHgwMGZmLCAweDA5MDQsIDB4NjUwMiwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHg2NTAyLAorCTB4MDgwYywgMHg2NjkzLCAweDExOTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4MiwgMHgwMDA2LAorCTB4MTI2OCwgMHhhODk0LCAweDkwYzYsIDB4MDA2ZiwgMHgwMTQ4LCAweDA4MGMsIDB4YWJlMiwgMHgxOTA0LAorCTB4NjRlYiwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxOTA0LCAweDY0ZWIsIDB4YTg5NCwgMHg5MGM2LAorCTB4MDA2ZiwgMHgwMTU4LCAweDkwYzYsIDB4MDA1ZSwgMHgwOTA0LCAweDY0NGIsIDB4OTBjNiwgMHgwMDY0LAorCTB4MDkwNCwgMHg2NDc0LCAweDIwMDgsIDB4MDgwNCwgMHg2NDBkLCAweGE5OTgsIDB4YThiMCwgMHgyMDQwLAorCTB4MDgwYywgMHhhYmUyLCAweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4NjQwZCwgMHg5MTg2LAorCTB4MDBmZiwgMHgwOTA0LCAweDY0MGQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjQwZCwgMHhhYWEwLAorCTB4YWI5YywgMHg3ODdjLCAweDkzMDYsIDB4MTFhOCwgMHg3ODgwLCAweDAwOTYsIDB4OTI0ZSwgMHgxMTI4LAorCTB4MjIwOCwgMHgyMzEwLCAweDAwOWUsIDB4MDgwNCwgMHg2NDBkLCAweDA4MGMsIDB4YWJlMiwgMHgxMTQwLAorCTB4OTljYywgMHhmZjAwLCAweDAwOWUsIDB4MTEyOCwgMHgyMjA4LCAweDIzMTAsIDB4MDgwNCwgMHg2NDBkLAorCTB4MDA5ZSwgMHgwODBjLCAweDRhMDUsIDB4MDkwNCwgMHg2NDE3LCAweDkwMGUsIDB4OTAxNiwgMHg5MGM2LAorCTB4NDAwMCwgMHgxNWUwLCAweDAwMDYsIDB4MDgwYywgMHg2OTg2LCAweDExMDgsIDB4YzE4NSwgMHhiODAwLAorCTB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDMxLCAweDIwYTAsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDA2LAorCTB4MjA5OCwgMHgwODBjLCAweDBmYzQsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDM1LCAweDIwYTAsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDBhLAorCTB4MjA5OCwgMHgwODBjLCAweDBmYzQsIDB4YThjNCwgMHhhYmM4LCAweDkzMDUsIDB4YWJjYywgMHg5MzA1LAorCTB4YWJkMCwgMHg5MzA1LCAweGFiZDQsIDB4OTMwNSwgMHhhYmQ4LCAweDkzMDUsIDB4YWJkYywgMHg5MzA1LAorCTB4YWJlMCwgMHg5MzA1LCAweDkwMDUsIDB4MDUxMCwgMHgwMDBlLCAweDAwYzgsIDB4OTBjNiwgMHg0MDA3LAorCTB4MTExMCwgMHgyNDA4LCAweDAwYTAsIDB4OTBjNiwgMHg0MDA4LCAweDExMTgsIDB4MjcwOCwgMHgyNjEwLAorCTB4MDA3MCwgMHg5MGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDUwLCAweDkwYzYsIDB4NDAwNiwgMHgwMTM4LAorCTB4MjAwMSwgMHg0MDA1LCAweDIwMDksIDB4MDAwYSwgMHgwMDEwLCAweDIwMDEsIDB4NDAwNiwgMHhhODk2LAorCTB4YTk5YSwgMHhhYTllLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDA0NzgsIDB4MDAwZSwgMHgwODBjLAorCTB4YWM1YSwgMHgxMTMwLCAweDIwMDEsIDB4NDAwNSwgMHgyMDA5LCAweDAwMDMsIDB4OTAxNiwgMHgwYzc4LAorCTB4MmIwMCwgMHg2MDEyLCAweDA4MGMsIDB4Y2UxNSwgMHgyOTAwLCAweDYwMTYsIDB4NjAyMywgMHgwMDAxLAorCTB4YTg2OCwgMHhkODhjLCAweDAxMDgsIDB4YzBmNSwgMHhhODZhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHgzMjQwLCAweDAxMmUsIDB4OTAwNiwgMHgwODBjLCAweDY1Y2YsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDgwYywgMHg2NWUzLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweGFkNGQsIDB4YThiMCwgMHhkMDk0LAorCTB4MDExOCwgMHhiOGQ0LCAweGMwOGQsIDB4YjhkNiwgMHg5MDA2LCAweDkwMDUsIDB4MDEyZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHg1NzUyLCAweDAxMTgsIDB4MjAwOSwgMHgwMDA3LAorCTB4MDBmOCwgMHhhOTk4LCAweGFlYjAsIDB4MDgwYywgMHg2NjkzLCAweDE5MDQsIDB4NjQwOCwgMHg5MTg2LAorCTB4MDA3ZiwgMHgwMTMwLCAweDA4MGMsIDB4NmFkZCwgMHgwMTE4LCAweDIwMDksIDB4MDAwOSwgMHgwMDgwLAorCTB4MDA5NiwgMHgwODBjLCAweDEwNDcsIDB4MTEyMCwgMHgwMDllLCAweDIwMDksIDB4MDAwMiwgMHgwMDQwLAorCTB4MjkwMCwgMHgwMDllLCAweGE4MDYsIDB4MDgwYywgMHhjYjY4LCAweDE5YjAsIDB4MjAwOSwgMHgwMDAzLAorCTB4MjAwMSwgMHg0MDA1LCAweDA4MDQsIDB4NjQwZiwgMHhhOTk4LCAweGFlYjAsIDB4MDgwYywgMHg2NjkzLAorCTB4MTkwNCwgMHg2NDA4LCAweDAwOTYsIDB4MDgwYywgMHgxMDQ3LCAweDExMjgsIDB4MDA5ZSwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDY0YzgsIDB4MjkwMCwgMHgwMDllLCAweGE4MDYsIDB4MDA5NiwgMHgyMDQ4LAorCTB4MjBhOSwgMHgwMDJiLCAweGI4YzQsIDB4MjBlMCwgMHhiOGM4LCAweDIwOTgsIDB4YTg2MCwgMHgyMGU4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMDIsIDB4MjBhMCwgMHg0MDAzLCAweDIwYTksIDB4MDAwOCwgMHg5MDgwLAorCTB4MDAwNiwgMHgyMGEwLCAweGJiYzgsIDB4OTM5OCwgMHgwMDA2LCAweDIzOTgsIDB4MDgwYywgMHgwZmM0LAorCTB4MDA5ZSwgMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHhkNjg0LAorCTB4MTE2OCwgMHgwODBjLCAweDU3M2UsIDB4ZDBiNCwgMHgxMTE4LCAweGE4OWIsIDB4MDAwYiwgMHgwMGUwLAorCTB4YjgwMCwgMHhkMDhjLCAweDAxMTgsIDB4YTg5YiwgMHgwMDBjLCAweDAwYjAsIDB4MDgwYywgMHg2YWRkLAorCTB4MDExOCwgMHhhODliLCAweDAwMDksIDB4MDA4MCwgMHgwODBjLCAweDU3NTIsIDB4MDExOCwgMHhhODliLAorCTB4MDAwNywgMHgwMDUwLCAweDA4MGMsIDB4Y2I0YiwgMHgxOTA0LCAweDY0NDQsIDB4MjAwOSwgMHgwMDAzLAorCTB4MjAwMSwgMHg0MDA1LCAweDA4MDQsIDB4NjQwZiwgMHhhODdiLCAweDAwMzAsIDB4YTg5NywgMHg0MDA1LAorCTB4YTgwNCwgMHg4MDA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDAyLCAweDIwMDksIDB4MDAyYiwgMHhhYWEwLCAweGFiOWMsIDB4YWNhOCwgMHhhZGE0LAorCTB4MjAzMSwgMHgwMDAwLCAweDIwNDEsIDB4MTI5NiwgMHgwODBjLCAweGIxZDQsIDB4MTkwNCwgMHg2NDQ0LAorCTB4MjAwOSwgMHgwMDAyLCAweDA4ZTgsIDB4MjAwMSwgMHgwMDI4LCAweDkwMGUsIDB4MDgwNCwgMHg2NDQ1LAorCTB4MjAwOSwgMHgxODBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LAorCTB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLAorCTB4MDgwNCwgMHg2NDQ1LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLCAweDA4MDQsIDB4NjQ0NSwgMHgwODBjLAorCTB4MzdlNywgMHgwODA0LCAweDY0NDYsIDB4MDgwYywgMHg1NDViLCAweDA4MDQsIDB4NjQ0NiwgMHgwODBjLAorCTB4NDViOSwgMHgwODA0LCAweDY0NDYsIDB4MDgwYywgMHg0NjMyLCAweDA4MDQsIDB4NjQ0NiwgMHgwODBjLAorCTB4NDY4ZSwgMHgwODA0LCAweDY0NDYsIDB4MDgwYywgMHg0YWM4LCAweDA4MDQsIDB4NjQ0NiwgMHgwODBjLAorCTB4NGQ3YywgMHgwODA0LCAweDY0NDYsIDB4MDgwYywgMHg1MGMzLCAweDA4MDQsIDB4NjQ0NiwgMHgwODBjLAorCTB4NTJiYywgMHgwODA0LCAweDY0NDYsIDB4MDgwYywgMHgzYTBiLCAweDA4MDQsIDB4NjQ0NiwgMHgwMGI2LAorCTB4YTk3NCwgMHhhZTc4LCAweDk2ODQsIDB4M2ZmZiwgMHg5MDgyLCAweDQwMDAsIDB4MTYwOCwgMHg5MTgyLAorCTB4MDgwMCwgMHgxMjU4LCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MDEzMCwgMHgwODBjLAorCTB4NmFkZCwgMHgxMTM4LCAweDAwZDksIDB4OTAwNiwgMHgwMGIwLCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLAorCTB4MDA5MCwgMHg5MDgyLCAweDAwMDYsIDB4MTI0MCwgMHhiOTAwLCAweGQxZmMsIDB4MGQ5OCwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDAzOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwgMHgwMDE4LAorCTB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4OTAwNSwgMHgwMGJlLCAweDAwMDUsIDB4YTg3NywgMHgwMDAwLAorCTB4YjhkMCwgMHg5MDA1LCAweDE5MDQsIDB4NjVjMywgMHhiODg4LCAweDkwMDUsIDB4MTkwNCwgMHg2NWMzLAorCTB4YjgzOCwgMHhiOTNjLCAweDkxMDIsIDB4MWEwNCwgMHg2NWMzLCAweDJiMTAsIDB4MDgwYywgMHhhYzg3LAorCTB4MDkwNCwgMHg2NWJmLCAweDgxMDgsIDB4YjkzZSwgMHg2MjEyLCAweDI5MDAsIDB4NjAxNiwgMHg2MDIzLAorCTB4MDAwMywgMHg2MDBiLCAweGZmZmYsIDB4NjAwNywgMHgwMDQwLCAweGE4NzgsIDB4NjA1ZSwgMHhhODgwLAorCTB4NjA2NiwgMHhhODgzLCAweDAwMDAsIDB4YTg3YywgMHhkMGFjLCAweDA1ODgsIDB4YzBkZCwgMHhhODdlLAorCTB4YTg4OCwgMHg4MDAxLCAweDE1MzAsIDB4YTgxNiwgMHhhODY0LCAweDkwOTQsIDB4MDBmNywgMHg5Mjk2LAorCTB4MDAxMSwgMHgxMWY4LCAweDkwODQsIDB4MDBmZiwgMHhjMGJkLCAweDYwMWUsIDB4YThhYywgMHhhYWIwLAorCTB4YTgzNiwgMHhhYTNhLCAweDIwMDEsIDB4MDAwZiwgMHg4MDAxLCAweDFkZjAsIDB4MjAwMSwgMHg4MDA0LAorCTB4NjAwMywgMHgwMDA0LCAweDYwNDYsIDB4MDBmNiwgMHgyMDc5LCAweDAzODAsIDB4NzgxOCwgMHhkMGJjLAorCTB4MWRlOCwgMHg3ODMzLCAweDAwMTAsIDB4MmMwMCwgMHg3ODM2LCAweDc4MWIsIDB4ODA4MCwgMHgwMGZlLAorCTB4MDAwNSwgMHgwODBjLCAweDE3NzgsIDB4NjAxYywgMHhjMGJkLCAweDYwMWUsIDB4MGMzOCwgMHhkMGI0LAorCTB4MTkwYywgMHgxYzg2LCAweDIwMDEsIDB4ODAwNCwgMHg2MDAzLCAweDAwMDIsIDB4MGMxOCwgMHg4MWZmLAorCTB4MTExMCwgMHhiODhiLCAweDAwMDEsIDB4MjkwOCwgMHhiOGNjLCAweGI5Y2UsIDB4OTAwNSwgMHgxMTEwLAorCTB4YjlkMiwgMHgwMDIwLCAweDAwOTYsIDB4MjA0OCwgMHhhOTAyLCAweDAwOWUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDEyNiwgMHgwMGM2LCAweDAwMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTAsIDB4MjI1OCwgMHhiYTAwLAorCTB4OTAwNSwgMHgwMTEwLCAweGMyODUsIDB4MDAwOCwgMHhjMjg0LCAweGJhMDIsIDB4MDAyZSwgMHgwMGNlLAorCTB4MDEyZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjIxMCwgMHgyMjU4LCAweGJhMDQsIDB4MDAwNiwgMHg5MDg2LCAweDAwMDYsIDB4MTE3MCwgMHhiODljLAorCTB4ZDBhYywgMHgwMTU4LCAweDA4MGMsIDB4NmFkOSwgMHgwMTQwLCAweDkyODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4OTA4NiwgMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwNjAwLCAweDAwMGUsIDB4OTI5NCwgMHhmZjAwLAorCTB4OTIxNSwgMHhiYTA2LCAweDAwMDYsIDB4OTA4NiwgMHgwMDA2LCAweDExMjAsIDB4YmE5MCwgMHg4MmZmLAorCTB4MDkwYywgMHgwZDdkLCAweDAwMGUsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDEyNiwgMHgwMGM2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwNCwgMHgwMDA2LAorCTB4OTA4NiwgMHgwMDA2LCAweDExNjgsIDB4Yjg5YywgMHhkMGE0LCAweDAxNTAsIDB4MDgwYywgMHg2YWQ1LAorCTB4MTEzOCwgMHg5Mjg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwMDA2LAorCTB4MDAwZSwgMHg5Mjk0LCAweDAwZmYsIDB4ODAwNywgMHg5MjE1LCAweGJhMDYsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDBiZSwgMHgwMDA1LCAweDkxODIsIDB4MDgwMCwgMHgwMjE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMDI2LCAweDkxOTAsIDB4MTAwMCwgMHgyMjA0LCAweDkwNWQsIDB4MTE4OCwgMHgwMDk2LAorCTB4MDgwYywgMHgxMDQ3LCAweDI5NTgsIDB4MDA5ZSwgMHgwMTY4LCAweDJiMDAsIDB4MjAxMiwgMHhiODVjLAorCTB4YjhjYSwgMHhiODYwLCAweGI4YzYsIDB4OTAwNiwgMHhiOGE2LCAweGI4YWUsIDB4MDgwYywgMHg2MGFjLAorCTB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDI2LCAweDkxODIsIDB4MDgwMCwgMHgwMjE4LAorCTB4OTA4NSwgMHgwMDAxLCAweDA0NTgsIDB4MDBkNiwgMHg5MTkwLCAweDEwMDAsIDB4MjIwNCwgMHg5MDVkLAorCTB4MDUxOCwgMHgyMDEzLCAweDAwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywgMHgxMDc5LAorCTB4MDBkNiwgMHgwMGM2LCAweGI4YmMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxNjgsIDB4NjAwYywgMHgwMDA2LAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTEwLCAweDA4MGMsIDB4MGZmOSwgMHgwODBjLAorCTB4YWNiMCwgMHgwMGNlLCAweDBjODgsIDB4MDBjZSwgMHgwMGRlLCAweDJiNDgsIDB4YjhjOCwgMHhiODVlLAorCTB4YjhjNCwgMHhiODYyLCAweDA4MGMsIDB4MTA4OSwgMHgwMGRlLCAweDkwMDYsIDB4MDAyZSwgMHgwMTJlLAorCTB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAxNiwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDMwLCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LCAweDkwNWQsIDB4MGRjMCwgMHg5MDA2LAorCTB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4OTAwNiwgMHhiODBhLAorCTB4YjgwZSwgMHhiODAwLCAweGMwOGMsIDB4YjgwMiwgMHgwODBjLCAweDc1M2QsIDB4MTUxMCwgMHhiOGEwLAorCTB4OTA4NiwgMHgwMDdlLCAweDAxMjAsIDB4MDgwYywgMHhhYmUyLCAweDExZDgsIDB4MDA3OCwgMHg3MDQwLAorCTB4ZDBlNCwgMHgwMWI4LCAweDAwYzYsIDB4MjA2MSwgMHgxOTgxLCAweDcwNDgsIDB4MjA2MiwgMHg3MDRjLAorCTB4NjAwNiwgMHg3MDUwLCAweDYwMGEsIDB4NzA1NCwgMHg2MDBlLCAweDAwY2UsIDB4NzAzYywgMHgyMDY5LAorCTB4MDE0MCwgMHg5MDA1LCAweDExMTAsIDB4MjAwMSwgMHgwMDAxLCAweDY4ODYsIDB4MjA2OSwgMHgxODAwLAorCTB4NjhiNiwgMHg3MDQwLCAweGI4NWUsIDB4NzA0OCwgMHhiODYyLCAweDcwNGMsIDB4Yjg2NiwgMHgyMGUxLAorCTB4MDAwMCwgMHgyMDk5LCAweDAyNzYsIDB4YjhjNCwgMHgyMGU4LCAweGI4YzgsIDB4OTA4OCwgMHgwMDBhLAorCTB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHgyMDk5LCAweDAyN2EsIDB4OTA4OCwgMHgwMDA2LAorCTB4MjFhMCwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHgyMDY5LCAweDAyMDAsIDB4NjgxNywgMHgwMDAxLAorCTB4NzA0MCwgMHhiODZhLCAweDcxNDQsIDB4Yjk2ZSwgMHg3MDQ4LCAweGI4NzIsIDB4NzA1MCwgMHhiODc2LAorCTB4MjA2OSwgMHgwMjAwLCAweDY4MTcsIDB4MDAwMCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxMTEwLAorCTB4NzE0NCwgMHhiOTZlLCAweDkxODIsIDB4MDIxMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwOCwgMHgwNDAwLAorCTB4OTE4MiwgMHgwMjU5LCAweDEyMTgsIDB4MjAwOSwgMHgwMDA3LCAweDAwZDAsIDB4OTE4MiwgMHgwMmMxLAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDYsIDB4MDBhMCwgMHg5MTgyLCAweDAzNDksIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwNSwgMHgwMDcwLCAweDkxODIsIDB4MDQyMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLAorCTB4OTE4MiwgMHgwNTgxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDAzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAyLAorCTB4Yjk5MiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwgMHhiODk2LCAweDcwM2MsIDB4Yjg5YSwgMHg3MDU0LAorCTB4Yjg5ZSwgMHgwMDM2LCAweGJiZDQsIDB4YzM4NCwgMHhiYTAwLCAweDIwMDksIDB4MTg2NywgMHgyMTBjLAorCTB4ZDBiYywgMHgwMTIwLCAweGQxZWMsIDB4MDExMCwgMHhjMmFkLCAweDAwMDgsIDB4YzJhYywgMHhkMGM0LAorCTB4MDE0OCwgMHhkMWU0LCAweDAxMzgsIDB4YzJiZCwgMHhkMGNjLCAweDAxMjgsIDB4ZDM4YywgMHgxMTA4LAorCTB4YzM4NSwgMHgwMDA4LCAweGMyYmMsIDB4YmEwMiwgMHhiYmQ2LCAweDAwM2UsIDB4MDBlZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwOTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YjhhNCwgMHg5MDRkLAorCTB4MDU3OCwgMHhhOTAwLCAweDgxZmYsIDB4MTVjMCwgMHhhYTA0LCAweDkyODIsIDB4MDAxMCwgMHgxNmM4LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxYzYsIDB4MDFkNiwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MDhjLAorCTB4MDAzZiwgMHgyMWUwLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDQsIDB4MjA5OCwgMHgyMDA5LAorCTB4MDAxMCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwgMHg5MDg2LCAweGZmZmYsIDB4MDEyMCwgMHg4MTA5LAorCTB4MWRkMCwgMHgwODBjLCAweDBkN2QsIDB4M2MwMCwgMHgyMGU4LCAweDMzMDAsIDB4ODAwMSwgMHgyMGEwLAorCTB4NDYwNCwgMHg4MjEwLCAweGFhMDYsIDB4MDFkZSwgMHgwMWNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMDYwLAorCTB4MDgwYywgMHgxMDQ3LCAweDAxNzAsIDB4MjkwMCwgMHhiOGE2LCAweGE4MDMsIDB4MDAwMCwgMHgwODBjLAorCTB4NjkyMiwgMHhhODA3LCAweDAwMDEsIDB4YWUxMiwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDllLAorCTB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA5NiwgMHhiOGE0LAorCTB4OTA0ZCwgMHgwMTg4LCAweGE4MDAsIDB4OTAwNSwgMHgxMTUwLCAweDA4MGMsIDB4NjkzMSwgMHgxMTU4LAorCTB4YTgwNCwgMHg5MDhhLCAweDAwMDIsIDB4MDIxOCwgMHg4MDAxLCAweGE4MDYsIDB4MDAyMCwgMHgwODBjLAorCTB4MTA3OSwgMHhiOGE3LCAweDAwMDAsIDB4MDA5ZSwgMHgwMTJlLCAweDAwMDUsIDB4MDA5NiwgMHgwMGM2LAorCTB4Yjg4OCwgMHg5MDA1LCAweDE5MDQsIDB4NjgxNywgMHhiOGQwLCAweDkwNGQsIDB4MDkwNCwgMHg2ODE3LAorCTB4MDgwYywgMHhhYzg3LCAweDA5MDQsIDB4NjgxMywgMHg4MjEwLCAweGJhM2UsIDB4YTgwMCwgMHhiOGQyLAorCTB4OTAwNSwgMHgxMTA4LCAweGI4Y2UsIDB4MmIwMCwgMHg2MDEyLCAweDI5MDAsIDB4NjAxNiwgMHg2MDIzLAorCTB4MDAwMywgMHg2MDBiLCAweGZmZmYsIDB4NjAwNywgMHgwMDQwLCAweGE4NzgsIDB4NjA1ZSwgMHhhODgwLAorCTB4OTA4NCwgMHgwMGZmLCAweDYwNjYsIDB4YTg4MywgMHgwMDAwLCAweGE4N2MsIDB4ZDBhYywgMHgwMWM4LAorCTB4YzBkZCwgMHhhODdlLCAweGE4ODgsIDB4ODAwMSwgMHgxNTY4LCAweGE4MTYsIDB4YTg2NCwgMHg5MDk0LAorCTB4MDBmNywgMHg5Mjk2LCAweDAwMTEsIDB4MTUzMCwgMHg5MDg0LCAweDAwZmYsIDB4YzBiZCwgMHg2MDFlLAorCTB4YThhYywgMHhhYWIwLCAweGE4MzYsIDB4YWEzYSwgMHgyMDAxLCAweDgwMDQsIDB4NjAwMywgMHgwMDA0LAorCTB4MDAzMCwgMHgwODBjLCAweDFjODYsIDB4MjAwMSwgMHg4MDA0LCAweDYwMDMsIDB4MDAwMiwgMHg2MDQ2LAorCTB4MjAwMSwgMHgwMDEwLCAweDJjMDgsIDB4MDgwYywgMHhhOTBmLCAweGI4MzgsIDB4YmEzYywgMHg5MjAyLAorCTB4MGEwNCwgMHg2N2M0LCAweDAwMjAsIDB4ODJmZiwgMHgxMTEwLCAweGI4OGIsIDB4MDAwMSwgMHgwMGNlLAorCTB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4MTc3OCwgMHg2MDFjLCAweGMwYmQsIDB4NjAxZSwgMHgwOGUwLAorCTB4MDBiNiwgMHgwMDk2LCAweDAwMTYsIDB4MjBhOSwgMHgwODAwLCAweDkwMGUsIDB4MDAxNiwgMHgwODBjLAorCTB4NjY5MywgMHgxMTU4LCAweGI4ZDAsIDB4OTA0ZCwgMHgwMTQwLCAweDNlMDAsIDB4OTA4NiwgMHgwMDAyLAorCTB4MTExOCwgMHhiODAwLCAweGQwYmMsIDB4MTEwOCwgMHgwMDQxLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LAorCTB4NjgyNiwgMHgwMDFlLCAweDAwYmUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwOTYsIDB4MDAxNiwgMHhiOGQwLAorCTB4OTA0ZCwgMHgwMTg4LCAweGE4MDAsIDB4YjhkMiwgMHg5MDA1LCAweDExMDgsIDB4YjhjZSwgMHg5MDA2LAorCTB4YTgwMiwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHhjYzdmLAorCTB4MDgwYywgMHg2ZGVlLCAweDBjNjAsIDB4MDAxZSwgMHgwMDllLCAweDAwMDUsIDB4MDA4NiwgMHg5MDQ2LAorCTB4YjhkMCwgMHg5MDRkLCAweDAxYjAsIDB4YTg2YywgMHg5NDA2LCAweDExMTgsIDB4YTg3MCwgMHg5NTA2LAorCTB4MDEyOCwgMHgyOTQwLCAweGE4MDAsIDB4OTA0ZCwgMHgwMTYwLCAweDBjYTgsIDB4YTgwMCwgMHg4OGZmLAorCTB4MTEyOCwgMHhiOGQyLCAweDkwMDUsIDB4MTExOCwgMHhiOGNlLCAweDAwMDgsIDB4YTAwMiwgMHhhODAzLAorCTB4MDAwMCwgMHgwMDhlLCAweDAwMDUsIDB4OTAxZSwgMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwZTYsIDB4MDA5NiwgMHgwMGM2LCAweDAwODYsIDB4MDAyNiwgMHgyMDcxLAorCTB4MTllNiwgMHg5MDQ2LCAweDcwMjgsIDB4OTA2NSwgMHgwMWU4LCAweDYwMTQsIDB4MjA2OCwgMHg4M2ZmLAorCTB4MDEyMCwgMHg2MDVjLCAweDk2MDYsIDB4MDE1OCwgMHgwMDMwLCAweGE4NmMsIDB4OTQwNiwgMHgxMTE4LAorCTB4YTg3MCwgMHg5NTA2LCAweDAxMjAsIDB4MmM0MCwgMHg2MDBjLCAweDIwNjAsIDB4MGM2MCwgMHg2MDBjLAorCTB4MDAwNiwgMHgwMDY2LCAweDI4MzAsIDB4MDgwYywgMHhhMDQyLCAweDAwNmUsIDB4MDAwZSwgMHg4M2ZmLAorCTB4MDUwOCwgMHgwYzA4LCAweDkwNDYsIDB4YjhkMCwgMHg5MDRkLCAweDAxZTAsIDB4ODNmZiwgMHgwMTIwLAorCTB4YTg3OCwgMHg5NjA2LCAweDAxNTgsIDB4MDAzMCwgMHhhODZjLCAweDk0MDYsIDB4MTExOCwgMHhhODcwLAorCTB4OTUwNiwgMHgwMTIwLCAweDI5NDAsIDB4YTgwMCwgMHgyMDQ4LCAweDBjNzAsIDB4YjhkMCwgMHhhYTAwLAorCTB4MDAyNiwgMHg5OTA2LCAweDExMTAsIDB4YmFkMiwgMHgwMDA4LCAweGEyMDIsIDB4MDAwZSwgMHg4M2ZmLAorCTB4MDEwOCwgMHgwYzEwLCAweDAwMmUsIDB4MDA4ZSwgMHgwMGNlLCAweDAwOWUsIDB4MDBlZSwgMHgwMTJlLAorCTB4MDAwNSwgMHg5MDE2LCAweDA0ODksIDB4MTExMCwgMHgyMDExLCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLAorCTB4Njk4NiwgMHgwMTI4LCAweDA4MGMsIDB4Y2EzYiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDgwYywgMHg2OTg2LCAweDAxMjgsIDB4MDgwYywgMHhjOWRjLCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwODBjLCAweDY5ODYsIDB4MDEyOCwgMHgwODBjLCAweGNhMzgsIDB4MDAxMCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4Njk4NiwgMHgwMTI4LCAweDA4MGMsIDB4YzlmYiwgMHgwMDEwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2OTg2LCAweDAxMjgsIDB4MDgwYywgMHhjYTdlLAorCTB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHhiOGE0LCAweDkwMGQsIDB4MTExOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDAxMzYsIDB4MDFjNiwgMHhhODAwLCAweDkwMDUsIDB4MTFiOCwgMHg4OTBlLAorCTB4ODEwZSwgMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHgyMGUwLCAweDkxODQsIDB4ZmZjMCwgMHg5MDgwLAorCTB4MDAwNCwgMHgyMDk4LCAweDIwYTksIDB4MDAwMSwgMHgyMDA5LCAweDAwMTAsIDB4NDAwMiwgMHg5NjA2LAorCTB4MDEyOCwgMHg4MTA5LCAweDFkZDgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMWNlLAorCTB4MDEzZSwgMHgwMDA1LCAweDAxNDYsIDB4MDFkNiwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAwNCwgMHgyMGEwLCAweDIwYTksIDB4MDAxMCwgMHgyMDA5LCAweGZmZmYsIDB4NDEwNCwgMHgwMWRlLAorCTB4MDE0ZSwgMHgwMTM2LCAweDAxYzYsIDB4YTgwMCwgMHg5MDA1LCAweDExYjgsIDB4ODkwZSwgMHg4MTBlLAorCTB4ODEwZiwgMHg5MTg0LCAweDAwM2YsIDB4MjBlMCwgMHg5MTg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDA0LAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMDEsIDB4MjAwOSwgMHgwMDEwLCAweDQwMDIsIDB4OTYwNiwgMHgwMTI4LAorCTB4ODEwOSwgMHgxZGQ4LCAweDkwODUsIDB4MDAwMSwgMHgwMDY4LCAweDAxNDYsIDB4MDFkNiwgMHgzMzAwLAorCTB4ODAwMSwgMHgyMGEwLCAweDNjMDAsIDB4MjBlOCwgMHgyMDAxLCAweGZmZmYsIDB4NDAwNCwgMHgwMWRlLAorCTB4MDE0ZSwgMHg5MDA2LCAweDAxY2UsIDB4MDEzZSwgMHgwMDA1LCAweDAwOTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHhiOGE0LCAweDkwNGQsIDB4MTEyOCwgMHgwODBjLCAweDEwNDcsIDB4MDE2OCwgMHgyOTAwLAorCTB4YjhhNiwgMHgwODBjLCAweDY5MjIsIDB4YTgwMywgMHgwMDAxLCAweGE4MDcsIDB4MDAwMCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDA5NiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgwMTMwLCAweGI4YTcsIDB4MDAwMCwgMHgwODBjLAorCTB4MTA3OSwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4Yjg5YywgMHhkMGE0LAorCTB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDgwYywgMHg3NTNkLCAweDAxYjAsIDB4NzFjNCwgMHg4MWZmLAorCTB4MTE5OCwgMHg3MWRjLCAweGQxOWMsIDB4MDE4MCwgMHgyMDAxLCAweDAwN2UsIDB4OTA4MCwgMHgxMDAwLAorCTB4MjAwNCwgMHg5MDVkLCAweDAxNDgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA2LAorCTB4MTExOCwgMHhiODAwLCAweGMwZWQsIDB4YjgwMiwgMHgyMDc5LCAweDE4NDcsIDB4NzgwNCwgMHhkMGE0LAorCTB4MDFkMCwgMHgwMTU2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2NjkzLAorCTB4MTE2OCwgMHhiODA0LCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwOTYsIDB4MDAwNCwgMHgwMTE4LAorCTB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4YjgwMCwgMHhjMGVkLCAweGI4MDIsIDB4MDAxZSwgMHg4MTA4LAorCTB4MWYwNCwgMHg2OWFkLCAweDAxNWUsIDB4MDgwYywgMHg2YTliLCAweDAxMjAsIDB4MjAwMSwgMHgxOTg0LAorCTB4MjAwYywgMHgwMDM4LCAweDIwNzksIDB4MTg0NywgMHg3ODA0LCAweGQwYTQsIDB4MDEzMCwgMHgyMDA5LAorCTB4MDdkMCwgMHgyMDExLCAweDY5ZDgsIDB4MDgwYywgMHg4NzkyLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgyMDExLCAweDY5ZDgsIDB4MDgwYywgMHg4NmM4LCAweDA4MGMsIDB4NmE5YiwgMHgwMWQ4LAorCTB4MjAwMSwgMHgxMDdlLCAweDIwMDQsIDB4MjA1OCwgMHhiOTAwLCAweGMxZWMsIDB4YjkwMiwgMHgwODBjLAorCTB4NmFkOSwgMHgwMTMwLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDY5ZDgsIDB4MDgwYywgMHg4NzkyLAorCTB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4OTAwNiwgMHg3MDdlLCAweDcwNjAsIDB4NzA4MiwgMHgwODBjLAorCTB4MzAxMSwgMHgwMGVlLCAweDA0ZDAsIDB4MDE1NiwgMHgwMGM2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLAorCTB4MDAxNiwgMHgwODBjLCAweDY2OTMsIDB4MTU1OCwgMHhiODAwLCAweGQwZWMsIDB4MDU0MCwgMHgwMDQ2LAorCTB4YmFhMCwgMHgyMjIwLCAweDkwMDYsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4ZTQ0NSwgMHhiODAwLAorCTB4YzBlNSwgMHhjMGVjLCAweGI4MDIsIDB4MDgwYywgMHg2YWQ1LCAweDIwMDEsIDB4MDcwNywgMHgxMTI4LAorCTB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NSwgMHgwNzAwLCAweGI4MDYsIDB4MDgwYywgMHhhOTFlLAorCTB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4OTQzZCwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MzA2LAorCTB4OTAwZSwgMHgwODBjLCAweGUxNjcsIDB4MDA3ZSwgMHgwMDRlLCAweDA4MGMsIDB4YTkzYSwgMHgwMDFlLAorCTB4ODEwOCwgMHgxZjA0LCAweDZhMDAsIDB4MDBjZSwgMHgwMTVlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4YzBlYywgMHhiODAyLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMDk2LCAweDA4MGMsIDB4MTA2MCwgMHgwOTBjLCAweDBkN2QsIDB4Mjk1OCwgMHgwMDllLAorCTB4MjAwMSwgMHgxOTZhLCAweDJiMDIsIDB4OGIwNywgMHg4MDA2LCAweDgwMDYsIDB4OTA4YywgMHgwMDNmLAorCTB4YjljNiwgMHg5MDhjLCAweGZmYzAsIDB4YjljYSwgMHhiOGFmLCAweDAwMDAsIDB4MjAwOSwgMHgwMGZmLAorCTB4MDgwYywgMHg2MGFjLCAweGI4MDcsIDB4MDAwNiwgMHhiODEzLCAweDAwZmYsIDB4YjgxNywgMHhmZmZmLAorCTB4Yjg2ZiwgMHgwMjAwLCAweGI4NmMsIDB4Yjg5MywgMHgwMDAyLCAweGI4YmIsIDB4MDUyMCwgMHhiOGEzLAorCTB4MDBmZiwgMHhiOGFmLCAweDAwMDAsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4NzgxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBhYywgMHgwMDA1LCAweDYwMTAsIDB4MDBiNiwgMHg5MDVkLAorCTB4MDEwOCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4YjgwNCwgMHg5MDhjLCAweDAwZmYsIDB4OTE5NiwgMHgwMDA2LCAweDAxODgsIDB4OTE5NiwgMHgwMDA0LAorCTB4MDE3MCwgMHg5MTk2LCAweDAwMDUsIDB4MDE1OCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTk2LAorCTB4MDAwNiwgMHgwMTI4LCAweDkxOTYsIDB4MDAwNCwgMHgwMTEwLCAweDkxOTYsIDB4MDAwNSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LCAweDIwMDEsIDB4MTA3ZSwgMHgyMDA0LAorCTB4OTA1ZCwgMHgwMTEwLCAweGI4MDAsIDB4ZDBlYywgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDAyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAwNiwgMHhiYWEwLCAweDkyOTAsIDB4MTAwMCwgMHgyMjA0LAorCTB4OWIwNiwgMHgxOTBjLCAweDBkN2QsIDB4MDAwZSwgMHhiYTAwLCAweDkwMDUsIDB4MDExMCwgMHhjMmZkLAorCTB4MDAwOCwgMHhjMmZjLCAweGJhMDIsIDB4MDAyZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAxMSwgMHgxODM3LAorCTB4MjIwNCwgMHhkMGNjLCAweDAxMzgsIDB4MjAwMSwgMHgxOTgyLCAweDIwMGMsIDB4MjAxMSwgMHg2YWNiLAorCTB4MDgwYywgMHg4NzkyLCAweDAwMDUsIDB4MjAxMSwgMHg2YWNiLCAweDA4MGMsIDB4ODZjOCwgMHgyMDExLAorCTB4MTgzNywgMHgyMjA0LCAweGMwY2MsIDB4MjAxMiwgMHgwMDA1LCAweDA4MGMsIDB4NTczZSwgMHhkMGFjLAorCTB4MDAwNSwgMHgwODBjLCAweDU3M2UsIDB4ZDBhNCwgMHgwMDA1LCAweDAwMTYsIDB4YjkwNCwgMHg5MTg0LAorCTB4MDBmZiwgMHg5MDhlLCAweDAwMDYsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4YjkwNCwgMHg5MTg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweDkwOGUsIDB4MDAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LAorCTB4MDgwYywgMHhkMDliLCAweDAxNTgsIDB4NzBkYywgMHg5MDg0LCAweDAwMjgsIDB4MDEzOCwgMHgyMDAxLAorCTB4MTA3ZiwgMHgyMDA0LCAweDkwNWQsIDB4MDExMCwgMHhiOGQ0LCAweGQwOTQsIDB4MDBmZSwgMHgwMGJlLAorCTB4MDAwNSwgMHgyMDcxLCAweDE5MTAsIDB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwMCwgMHg5MDA2LAorCTB4NzAxMiwgMHg3MDE2LCAweDcwMWEsIDB4NzAxZSwgMHg3MDBhLCAweDcwNDYsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBlNiwgMHgyMDcxLCAweDE5NDcsIDB4OTAwZSwgMHg3MTBhLCAweDA4MGMsIDB4NTczZSwgMHhkMGZjLAorCTB4MTE0MCwgMHgwODBjLCAweDU3M2UsIDB4OTAwZSwgMHhkMDljLCAweDAxMDgsIDB4ODEwOCwgMHg3MTAyLAorCTB4MDBmOCwgMHgyMDAxLCAweDE4NjcsIDB4MjAwYywgMHg5MTg0LCAweDAwMDcsIDB4MDAwMiwgMHg2YjE5LAorCTB4NmIxOSwgMHg2YjE5LCAweDZiMTksIDB4NmIxOSwgMHg2YjJmLCAweDZiM2QsIDB4NmIxOSwgMHg3MDAzLAorCTB4MDAwMywgMHgyMDA5LCAweDE4NjgsIDB4MjEwYywgMHg5MTg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDA1LAorCTB4MTExMCwgMHgyMDAxLCAweDAwMDIsIDB4NzAwNiwgMHgwMDE4LCAweDcwMDMsIDB4MDAwNSwgMHgwYzg4LAorCTB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAwNTAsIDB4Njg0YywgMHg5MDA1LAorCTB4MTE1MCwgMHgwMGU2LCAweDIwNzEsIDB4MTkxMCwgMHg3MDI4LCAweGMwODUsIDB4NzAyYSwgMHgwMGVlLAorCTB4OTA4NSwgMHgwMDAxLCAweDA0ODgsIDB4Njg0NCwgMHg5MDA1LCAweDAxNTgsIDB4MDgwYywgMHg3OGIyLAorCTB4NmE2MCwgMHg5MjAwLCAweDcwMDIsIDB4Njg2NCwgMHg5MTAxLCAweDcwMDYsIDB4OTAwNiwgMHg3MDEyLAorCTB4NzAxNiwgMHg2ODYwLCAweDcwMDIsIDB4Njg2NCwgMHg3MDA2LCAweDY4NjgsIDB4NzAwYSwgMHg2ODZjLAorCTB4NzAwZSwgMHg2ODQ0LCAweDkwMDUsIDB4MTExMCwgMHg3MDEyLCAweDcwMTYsIDB4Njg0YywgMHg3MDFhLAorCTB4NzAxYywgMHg5MDg1LCAweDAwNDAsIDB4NzAxZSwgMHg3MDM3LCAweDAwMTksIDB4NzAyYiwgMHgwMDAxLAorCTB4MDBlNiwgMHgyMDcxLCAweDE5MTAsIDB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLAorCTB4NzAwYiwgMHgwMDAwLCAweDAwZWUsIDB4OTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDI2LAorCTB4MjA3MSwgMHgxOTQ3LCAweDcwMDAsIDB4OTAxNSwgMHgwOTA0LCAweDZkZjMsIDB4OTI4NiwgMHgwMDAzLAorCTB4MDkwNCwgMHg2YzgzLCAweDkyODYsIDB4MDAwNSwgMHgwOTA0LCAweDZjODMsIDB4MjA3MSwgMHgxODc3LAorCTB4YTg3YywgMHg5MDA1LCAweDA5MDQsIDB4NmJlNCwgMHg3MTQwLCAweGE4NjgsIDB4OTEwMiwgMHgwYTA0LAorCTB4NmRmMywgMHhhODc4LCAweGQwODQsIDB4MTVkOCwgMHhhODUzLCAweDAwMTksIDB4MjAwMSwgMHg4MDIzLAorCTB4YTg0ZSwgMHgyMDcxLCAweDE5MTAsIDB4NzAxYywgMHg5MDA1LCAweDE5MDQsIDB4NmY4YSwgMHgwZTA0LAorCTB4NmZmOCwgMHgyMDcxLCAweDAwMDAsIDB4YTg1MCwgMHg3MDMyLCAweGE4NGMsIDB4NzA4MiwgMHhhODcwLAorCTB4NzA4NiwgMHhhODZjLCAweDcwOGEsIDB4YTg4MCwgMHg3MDhlLCAweDcwMzYsIDB4MDE0NiwgMHgwMWQ2LAorCTB4MDEzNiwgMHgwMWM2LCAweDAxNTYsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDAyYSwgMHhhODY4LAorCTB4MjBhOCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjEsIDB4MjA5OCwgMHg0MDAzLAorCTB4MDE1ZSwgMHgwMWNlLCAweDAxM2UsIDB4MDFkZSwgMHgwMTRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDA4MDQsIDB4NmM2NiwgMHhhODUzLAorCTB4MDAxYiwgMHgyMDAxLCAweDgwMjcsIDB4MDgyMCwgMHg3MDA0LCAweGQwOGMsIDB4MTkwNCwgMHg2ZGYzLAorCTB4YTg1MywgMHgwMDFhLCAweDIwMDEsIDB4ODAyNCwgMHgwODA0LCAweDZiYTgsIDB4MDBlNiwgMHgwMDI2LAorCTB4MjA3MSwgMHgxOTQ3LCAweDcwMDAsIDB4OTAxNSwgMHgwOTA0LCAweDZkZjMsIDB4OTI4NiwgMHgwMDAzLAorCTB4MDkwNCwgMHg2YzgzLCAweDkyODYsIDB4MDAwNSwgMHgwOTA0LCAweDZjODMsIDB4YTg0ZiwgMHg4MDIyLAorCTB4YTg1MywgMHgwMDE4LCAweDA4MDQsIDB4NmM0YiwgMHhhODY4LCAweGQwZmMsIDB4MTFkOCwgMHgwMGU2LAorCTB4MDAyNiwgMHgyMDAxLCAweDE5NDcsIDB4MjAwNCwgMHg5MDA1LCAweDA5MDQsIDB4NmRmMywgMHhhODdjLAorCTB4ZDBiYywgMHgxOTA0LCAweDZkZjMsIDB4YTk3OCwgMHhhODc0LCAweDkxMDUsIDB4MTkwNCwgMHg2ZGYzLAorCTB4MjAwMSwgMHgxOTQ3LCAweDIwMDQsIDB4MDAwMiwgMHg2ZGYzLCAweDZjNDcsIDB4NmM4MywgMHg2YzgzLAorCTB4NmRmMywgMHg2YzgzLCAweDAwMDUsIDB4YTg2OCwgMHhkMGZjLCAweDE1MDAsIDB4MDBlNiwgMHgwMDI2LAorCTB4MjAwOSwgMHgxOTQ3LCAweDIxMGMsIDB4ODFmZiwgMHgwOTA0LCAweDZkZjMsIDB4YTg3YywgMHhkMGNjLAorCTB4MDkwNCwgMHg2ZGYzLCAweGE4ODAsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMSwgMHgxOTA0LAorCTB4NmRmMywgMHg5MTg2LCAweDAwMDMsIDB4MDkwNCwgMHg2YzgzLCAweDkxODYsIDB4MDAwNSwgMHgwOTA0LAorCTB4NmM4MywgMHhhODRmLCAweDgwMjEsIDB4YTg1MywgMHgwMDE3LCAweDAwMjgsIDB4MDAwNSwgMHhhODRmLAorCTB4ODAyMCwgMHhhODUzLCAweDAwMTYsIDB4MjA3MSwgMHgxOTEwLCAweDcwMWMsIDB4OTAwNSwgMHgxOTA0LAorCTB4NmY4YSwgMHgwZTA0LCAweDZmZjgsIDB4MjA3MSwgMHgwMDAwLCAweGE4NGMsIDB4NzA4MiwgMHhhODUwLAorCTB4NzAzMiwgMHhhODZjLCAweDcwODYsIDB4NzAzNiwgMHhhODcwLCAweDcwOGEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZWUsIDB4MjA3MSwgMHgxODAwLAorCTB4MjAxMSwgMHgwMDAxLCAweGE4MDQsIDB4OTAwZCwgMHg3MDJjLCAweDExNTgsIDB4YTgwMiwgMHgyOTAwLAorCTB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMDk2LCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLAorCTB4MWRjOCwgMHgwMDllLCAweDBjNTgsIDB4YTg0ZiwgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLAorCTB4MjA3MSwgMHgxOTEwLCAweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDkwMDUsIDB4MTkwNCwgMHg2ZDc4LAorCTB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LAorCTB4OTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4NmNhMSwgMHg2ZDc4LCAweDZjYzYsIDB4NmQxMywgMHgwODBjLAorCTB4MGQ3ZCwgMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxMTcwLAorCTB4MjA3MSwgMHgxYTAyLCAweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTk0OCwgMHgyMDA0LAorCTB4ODAwNSwgMHg3MDNlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAxNiwgMHg3MDJjLAorCTB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLAorCTB4NzBjMCwgMHg5MjAwLCAweDcwYzIsIDB4MDgwYywgMHg4NWNlLCAweDBjMTAsIDB4MjA3MSwgMHgxODAwLAorCTB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxNWE4LCAweDc4MjQsIDB4MDBlNiwgMHgyMDcxLAorCTB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE3MCwgMHgyMDA5LCAweDE4MzAsIDB4MjEwYywgMHg5MThhLAorCTB4MDAyMCwgMHgwMjQwLCAweDcwMjIsIDB4MjAwMSwgMHgxZGMwLCAweDIwMGMsIDB4ODEwOCwgMHgyMTAyLAorCTB4MDBlZSwgMHgwMDU4LCAweDAwZWUsIDB4MjA0OCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLAorCTB4NzBjMCwgMHg4MDAwLCAweDcwYzIsIDB4MDgwYywgMHg4NWNlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLAorCTB4MTkwYywgMHg3MTQ2LCAweGQwYTQsIDB4MTljOCwgMHgyMDcxLCAweDFhMDIsIDB4NzAzYywgMHg5MDA1LAorCTB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwgMHg4MDA1LCAweDcwM2UsIDB4MDBmZSwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLAorCTB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLAorCTB4ODVjZSwgMHgwODA0LCAweDZjY2QsIDB4MDA5NiwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLAorCTB4MDgwYywgMHg4NWNlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMGE0LAorCTB4MWQ2MCwgMHgwMGVlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMDljLAorCTB4MTFhMCwgMHgwMDllLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTU2MCwgMHgyMDcxLAorCTB4MWEwMiwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwgMHg4MDA1LAorCTB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwOWUsIDB4MjkwOCwgMHg3MDEwLAorCTB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsIDB4YTkwMiwgMHgwMDA4LAorCTB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxMTcwLCAweDIwNzEsIDB4MWEwMiwgMHg3MDNjLAorCTB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTk0OCwgMHgyMDA0LCAweDgwMDUsIDB4NzAzZSwgMHgwMGZlLAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LAorCTB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLAorCTB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLAorCTB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwgMHg2ZGNkLAorCTB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweGQwOWMsIDB4MTE5OCwgMHg3MDFjLAorCTB4OTA0ZCwgMHgwMTgwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDExMDgsIDB4NzAxYSwgMHhhODAwLAorCTB4NzAxZSwgMHgyOTAwLCAweDc4MjIsIDB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LAorCTB4ZDA5YywgMHgwZDY4LCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMGE0LAorCTB4MDFiMCwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLCAweDE4MDAsIDB4NzAyYywgMHhhODAyLAorCTB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHg3ODJjLAorCTB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMGE0LCAweDFkNjAsIDB4MDBlZSwgMHgyMDcxLAorCTB4MWEwMiwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5NDgsIDB4MjAwNCwgMHg4MDA1LAorCTB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLAorCTB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwMGVlLAorCTB4MDgwNCwgMHg2ZDg4LCAweGE4NjgsIDB4ZDBmYywgMHgxNTYwLCAweDAwOTYsIDB4YTgwNCwgMHhhODA3LAorCTB4MDAwMCwgMHg5MDRkLCAweDE5MGMsIDB4MGZmOSwgMHgwMDllLCAweDAwMTgsIDB4YTg2OCwgMHhkMGZjLAorCTB4MTUwMCwgMHgwMGU2LCAweDAwMjYsIDB4YTg0ZiwgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLAorCTB4MjA3MSwgMHgxOTEwLCAweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDkwMDUsIDB4MTkwNCwgMHg2ZjA4LAorCTB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LAorCTB4OTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4NmUxMiwgMHg2ZjA4LCAweDZlMmQsIDB4NmU5YiwgMHgwODBjLAorCTB4MGQ3ZCwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLAorCTB4MTEyMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LAorCTB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLAorCTB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwYzYwLCAweDIwNzEsIDB4MTgwMCwgMHgyOTAwLAorCTB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwgMHg2ZThhLCAweDc4MzAsIDB4ZDBkYywgMHgxMTIwLAorCTB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHg3ODI0LCAweDAwZTYsIDB4MjA3MSwgMHgwMDQwLAorCTB4NzEyYywgMHhkMTljLCAweDExNzAsIDB4MjAwOSwgMHgxODMwLCAweDIxMGMsIDB4OTE4YSwgMHgwMDIwLAorCTB4MDI0MCwgMHg3MDIyLCAweDIwMDEsIDB4MWRjMCwgMHgyMDBjLCAweDgxMDgsIDB4MjEwMiwgMHgwMGVlLAorCTB4MDA1OCwgMHgwMGVlLCAweDIwNDgsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLAorCTB4ODAwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NzE0NiwgMHhkMGE0LCAweDE5YzgsIDB4MGUwNCwgMHg2ZTgxLCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLAorCTB4MWRlMCwgMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLAorCTB4MjAwMSwgMHgxOTIxLCAweDIwMGMsIDB4YzE4NCwgMHgyMTAyLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE5MjEsIDB4MjAwYywgMHhjMTg1LCAweDIxMDIsIDB4MDBmZSwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLAorCTB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLCAweDkyMDAsIDB4NzBjMiwgMHgwODBjLAorCTB4ODVjZSwgMHgwODA0LCAweDZlM2MsIDB4MDA5NiwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLAorCTB4MDgwYywgMHg4NWNlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMGE0LAorCTB4MWQ2MCwgMHgwMGVlLCAweDBlMDQsIDB4NmVkYiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHg3MDQ0LAorCTB4YzA4NCwgMHg3MDQ2LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWVlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMDljLAorCTB4MTE3MCwgMHgwMDllLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTFlMCwgMHgwMGZlLAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzA0NCwgMHhjMDg1LCAweDcwNDYsIDB4MGM1OCwgMHgwMDllLAorCTB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLAorCTB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTEyMCwgMHgwMGZlLAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LAorCTB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGMwLAorCTB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLAorCTB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwgMHg2Zjc1LAorCTB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg3MTQ2LCAweGQwOWMsIDB4MTFiMCwgMHg3MDFjLAorCTB4OTA0ZCwgMHgwMTk4LCAweGE4NGMsIDB4OTAwNSwgMHgxMTgwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLAorCTB4MTEwOCwgMHg3MDFhLCAweGE4MDAsIDB4NzAxZSwgMHgyOTAwLCAweDc4MjIsIDB4NzgyYywgMHg5MDk0LAorCTB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDA5YywgMHgwZDUwLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLAorCTB4MTkwYywgMHg3MTQ2LCAweGQwYTQsIDB4MDVhOCwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYzAsIDB4ODAwMCwgMHg3MGMyLAorCTB4MDgwYywgMHg4NWNlLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NzE0NiwgMHhkMGE0LAorCTB4MWQ2MCwgMHgwMGVlLCAweDBlMDQsIDB4NmY2ZSwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHg3MDQ0LAorCTB4YzA4NCwgMHg3MDQ2LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWVlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzA0NCwgMHhjMDg1LAorCTB4NzA0NiwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLAorCTB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwMGVlLAorCTB4MDgwNCwgMHg2ZjE4LCAweDIwNzEsIDB4MTkxMCwgMHhhODAzLCAweDAwMDAsIDB4MjkwOCwgMHg3MDEwLAorCTB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsIDB4YTkwMiwgMHgwMDA4LAorCTB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxMTI4LCAweDFlMDQsIDB4NmZiNSwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LAorCTB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBjMCwgMHg5MjAwLAorCTB4NzBjMiwgMHgwODBjLCAweDg1Y2UsIDB4MGUwNCwgMHg2ZjlmLCAweDIwNzEsIDB4MTkxMCwgMHg3MDFjLAorCTB4MjA0OCwgMHhhODRjLCAweDkwMGQsIDB4MGQxOCwgMHgyMDcxLCAweDAwMDAsIDB4NzE4MiwgMHhhODUwLAorCTB4NzAzMiwgMHhhODZjLCAweDcwODYsIDB4NzAzNiwgMHhhODcwLCAweDcwOGEsIDB4YTg1MCwgMHg5MDgyLAorCTB4MDAxOSwgMHgxMjc4LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWVlLCAweDIwNzEsIDB4MTkxMCwgMHgwODBjLCAweDcxMzIsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHhhODUwLCAweDkwODIsIDB4MDAxYywgMHgxZTY4LCAweGE4ODAsIDB4NzA4ZSwgMHg3MDM2LAorCTB4MDE0NiwgMHgwMWQ2LCAweDAxMzYsIDB4MDFjNiwgMHgwMTU2LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLAorCTB4MDAyYSwgMHhhODY4LCAweDIwYTgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIxLAorCTB4MjA5OCwgMHg0MDAzLCAweDAxNWUsIDB4MDFjZSwgMHgwMTNlLCAweDAxZGUsIDB4MDE0ZSwgMHgwODkwLAorCTB4MjA3MSwgMHgxOTEwLCAweGE4MDMsIDB4MDAwMCwgMHgyOTA4LCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLAorCTB4NzAxOCwgMHg5MDRkLCAweDcxMWEsIDB4MDExMCwgMHhhOTAyLCAweDAwMDgsIDB4NzExZSwgMHgyMTQ4LAorCTB4YTgwNCwgMHg5MDBkLCAweDExMTgsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLAorCTB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLAorCTB4MWRjOCwgMHg3MDJlLCAweDcwYzAsIDB4OTIwMCwgMHg3MGMyLCAweDA4MGMsIDB4ODVjZSwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwMDYsIDB4YTg3YywgMHgwMDA2LCAweGE4NjcsIDB4MDEwMywgMHgyMGE5LAorCTB4MDAxYywgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMWQsIDB4MjBhMCwgMHg5MDA2LAorCTB4NDAwNCwgMHgwMDBlLCAweDkwODQsIDB4MDBmZiwgMHhhODdlLCAweDAwMGUsIDB4YTg3YSwgMHhhOTgyLAorCTB4MDAwNSwgMHgyMDcxLCAweDE5MTAsIDB4NzAwNCwgMHgwMDAyLCAweDcwNDUsIDB4NzA0NiwgMHg3MTMxLAorCTB4NzA0NiwgMHg3MDQzLCAweDcxMzEsIDB4MDgwYywgMHgwZDdkLCAweDAwMDUsIDB4MjAwMSwgMHgxOTQ3LAorCTB4MjAwNCwgMHgwMDAyLCAweDcwNTAsIDB4NzA1MCwgMHg3MGNhLCAweDcwY2IsIDB4NzA1MCwgMHg3MGNiLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MWUwYywgMHg3MTUxLCAweDcwMWMsIDB4OTA0ZCwgMHgwNTA4LAorCTB4YTg0YywgMHg5MDA1LCAweDA5MDQsIDB4NzA5YiwgMHgwZTA0LCAweDcwNzksIDB4YTk0YywgMHgyMDcxLAorCTB4MDAwMCwgMHg3MTgyLCAweGE4NTAsIDB4NzAzMiwgMHhhODZjLCAweDcwODYsIDB4NzAzNiwgMHhhODcwLAorCTB4NzA4YSwgMHhhODUwLCAweDkwODIsIDB4MDAxOSwgMHgxMjc4LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDIwNzEsIDB4MTkxMCwgMHgwODBjLAorCTB4NzEzMiwgMHgwMTJlLCAweDA4MDQsIDB4NzBjOSwgMHhhODUwLCAweDkwODIsIDB4MDAxYywgMHgxZTY4LAorCTB4YTg4MCwgMHg3MDhlLCAweDcwMzYsIDB4MDE0NiwgMHgwMWQ2LCAweDAxMzYsIDB4MDFjNiwgMHgwMTU2LAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDAyYSwgMHhhODY4LCAweDIwYTgsIDB4YTg2MCwgMHgyMGUwLAorCTB4YTg1YywgMHg5MDgwLCAweDAwMjEsIDB4MjA5OCwgMHg0MDAzLCAweDAxNWUsIDB4MDFjZSwgMHgwMTNlLAorCTB4MDFkZSwgMHgwMTRlLCAweDA4OTAsIDB4MjAwMSwgMHgwMDViLCAweDIwMDQsIDB4OTA5NCwgMHgwNzgwLAorCTB4MTkwYywgMHg3MTQ2LCAweGQwOWMsIDB4MjA3MSwgMHgxOTEwLCAweDE1MTAsIDB4MjA3MSwgMHgxOTEwLAorCTB4NzAwZiwgMHgwMDAxLCAweGE5NjQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMywgMHgxMTMwLAorCTB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LCAweDcxMGUsIDB4MjkwMCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDUwLCAweDY4MjIsIDB4MDBkZSwgMHgyMDcxLCAweDE5MTAsIDB4NzAxYywgMHgyMDQ4LAorCTB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4YTgwMCwgMHg3MDFlLCAweDkwMDUsIDB4MTEwOCwgMHg3MDFhLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwMDUsIDB4MDBkNiwgMHgyMDA4LCAweDIwNjksIDB4MWEwMiwgMHg2ODNjLAorCTB4OTAwNSwgMHgwNzYwLCAweDAxNTgsIDB4OTE4NiwgMHgwMDAzLCAweDA1NDAsIDB4MjAwMSwgMHgxODE1LAorCTB4MjAwNCwgMHgyMDA5LCAweDFiNTAsIDB4MjEwYywgMHg5MTAyLCAweDE1MDAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDY5LCAweDAwNTAsIDB4NjkzYywgMHg2ODM4LCAweDkxMDYsIDB4MDE5MCwgMHgwZTA0LAorCTB4NzBmZCwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNywgMHg4MDQwLCAweDY4MzMsIDB4MDAxMiwgMHg2ODgzLAorCTB4ODA0MCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLAorCTB4MTFlZSwgMHgyMDY5LCAweDFhMDIsIDB4NjgzZiwgMHhmZmZmLCAweDAxMmUsIDB4MDBkZSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDFlMGMsIDB4NzFiNywgMHg3MDFjLCAweDkwNGQsIDB4MDU0MCwgMHgyMDAxLAorCTB4MDA1YiwgMHgyMDA0LCAweDkwOTQsIDB4MDc4MCwgMHgxNWM5LCAweGQwOWMsIDB4MTUwMCwgMHgyMDcxLAorCTB4MTkxMCwgMHg3MDBmLCAweDAwMDEsIDB4YTk2NCwgMHg5MTg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTEzMCwgMHg4MTBmLCAweDkxOGMsIDB4MDBmZiwgMHg4MTAxLCAweDAxMDgsIDB4NzEwZSwgMHgyOTAwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwNTAsIDB4NjgyMiwgMHgwMGRlLCAweDcwMWMsIDB4MjA0OCwgMHg3MDEwLAorCTB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMWMsIDB4OTA0ZCwgMHgwMTYwLAorCTB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4YTgwMCwgMHg3MDFlLCAweDkwMDUsIDB4MTEwOCwgMHg3MDFhLAorCTB4MDEyZSwgMHgwODBjLCAweDEwNzksIDB4MDAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLAorCTB4MGUwNCwgMHg3MTQ4LCAweDAwMDYsIDB4MDAxNiwgMHgyMDAxLCAweDgwMDQsIDB4MDAwNiwgMHgwODA0LAorCTB4MGQ4NiwgMHgwMDk2LCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLCAweDcwNDQsIDB4ZDA4NCwgMHgwMWMwLAorCTB4YzA4NCwgMHg3MDQ2LCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWVlLCAweDAwZmUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTk5MSwgMHhkMGE0LCAweDBkYjgsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwMCwgMHg3ODI0LCAweDAwZTYsIDB4MjA3MSwgMHgwMDQwLCAweDcxMmMsIDB4ZDE5YywgMHgxMTcwLAorCTB4MjAwOSwgMHgxODMwLCAweDIxMGMsIDB4OTE4YSwgMHgwMDIwLCAweDAyNDAsIDB4NzAyMiwgMHgyMDAxLAorCTB4MWRjMCwgMHgyMDBjLCAweDgxMDgsIDB4MjEwMiwgMHgwMGVlLCAweDAwNTgsIDB4MDBlZSwgMHgyMDQ4LAorCTB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwgMHgwODBjLAorCTB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwgMHgxOWM4LAorCTB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwgMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODM2LAorCTB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LAorCTB4ZDA4NCwgMHgxOTBjLCAweDExZWUsIDB4MDBlZSwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMDUwLCAweDcwNDQsIDB4ZDA4NCwgMHgwMWI4LCAweGMwODQsIDB4NzA0NiwgMHg3ODM4LAorCTB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLAorCTB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWVlLCAweDAwZmUsIDB4MDAwNSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NzE0NiwgMHhkMGE0LCAweDBkYjgsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4NzgyNCwgMHgyMDQ4LAorCTB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGMwLCAweDgwMDAsIDB4NzBjMiwgMHgwODBjLAorCTB4ODVjZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDcxNDYsIDB4ZDBhNCwgMHgxZDcwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwNTAsIDB4NjkzYywgMHgyMDY5LCAweDE5NDcsIDB4NjgwOCwgMHg2OTBhLAorCTB4MjA2OSwgMHgxYTAyLCAweDkxMDIsIDB4MTExOCwgMHg2ODNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLAorCTB4MTk0OCwgMHgyMDBjLCAweDgxMGQsIDB4NjkzZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4NzA5OCwgMHg5MDhhLCAweDAwMjksIDB4MWEwYywgMHgwZDdkLCAweDkwODIsIDB4MDAxZCwgMHgwMDNiLAorCTB4MDAyNiwgMHgyMDExLCAweDFlMDAsIDB4MDgwYywgMHgyYWI0LCAweDAwMmUsIDB4MDAwNSwgMHg3MmUzLAorCTB4NzI2OSwgMHg3Mjg1LCAweDcyYWYsIDB4NzJkMiwgMHg3MzEyLCAweDczMjQsIDB4NzI4NSwgMHg3MmZhLAorCTB4NzIyNCwgMHg3MjUyLCAweDcyMjMsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LAorCTB4OTAwNSwgMHgxMTgwLCAweDY4MDgsIDB4OTAwNSwgMHgxNTE4LCAweDcwOWIsIDB4MDAyOCwgMHgyMDY5LAorCTB4MTk4ZSwgMHgyZDA0LCAweDcwMDIsIDB4MDgwYywgMHg3NjdlLCAweDYwMjgsIDB4OTA4NSwgMHgwNjAwLAorCTB4NjAyYSwgMHgwMGIwLCAweDcwOWIsIDB4MDAyOCwgMHgyMDY5LCAweDE5OGUsIDB4MmQwNCwgMHg3MDAyLAorCTB4NjAyOCwgMHg5MDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGU2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LAorCTB4MjA3MSwgMHgxYTZhLCAweDA4MGMsIDB4MWIxMCwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwgMHgxMTc4LAorCTB4NjgwOCwgMHg5MDA1LCAweDExNjAsIDB4NzA5YiwgMHgwMDI4LCAweDIwNjksIDB4MTk4ZSwgMHgyZDA0LAorCTB4NzAwMiwgMHgwODBjLCAweDc3MjEsIDB4NjAyOCwgMHg5MDg1LCAweDA2MDAsIDB4NjAyYSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLCAweDJhN2EsIDB4MDAwZSwgMHg2MTI0LAorCTB4ZDFlNCwgMHgxMTkwLCAweDA4MGMsIDB4NzM5NSwgMHhkMWQ0LCAweDExNjAsIDB4ZDFkYywgMHgxMTM4LAorCTB4ZDFjYywgMHgwMTUwLCAweDcwOWIsIDB4MDAyMCwgMHgwODBjLCAweDczOTUsIDB4MDAyOCwgMHg3MDliLAorCTB4MDAxZCwgMHgwMDEwLCAweDcwOWIsIDB4MDAxZiwgMHgwMDA1LCAweDIwMDEsIDB4MDA4OCwgMHgwODBjLAorCTB4MmE3YSwgMHg2MTI0LCAweGQxY2MsIDB4MTFlOCwgMHhkMWRjLCAweDExYzAsIDB4ZDFlNCwgMHgxMTk4LAorCTB4OTE4NCwgMHgxZTAwLCAweDExZDgsIDB4MDgwYywgMHgxYjM1LCAweDYwZTMsIDB4MDAwMSwgMHg2MDBjLAorCTB4YzBiNCwgMHg2MDBlLCAweDA4MGMsIDB4NzU2OSwgMHgyMDAxLCAweDAwODAsIDB4MDgwYywgMHgyYTdhLAorCTB4NzA5YiwgMHgwMDI4LCAweDAwNTgsIDB4NzA5YiwgMHgwMDFlLCAweDAwNDAsIDB4NzA5YiwgMHgwMDFkLAorCTB4MDAyOCwgMHg3MDliLCAweDAwMjAsIDB4MDAxMCwgMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgwODBjLAorCTB4MWIzNSwgMHg2MGUzLCAweDAwMDEsIDB4NjAwYywgMHhjMGI0LCAweDYwMGUsIDB4MDgwYywgMHg3NTY5LAorCTB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmE3YSwgMHg2MTI0LCAweGQxZDQsIDB4MTE4MCwgMHhkMWRjLAorCTB4MTE1OCwgMHhkMWU0LCAweDExMzAsIDB4OTE4NCwgMHgxZTAwLCAweDExNTgsIDB4NzA5YiwgMHgwMDI4LAorCTB4MDA0MCwgMHg3MDliLCAweDAwMWUsIDB4MDAyOCwgMHg3MDliLCAweDAwMWQsIDB4MDAxMCwgMHg3MDliLAorCTB4MDAxZiwgMHgwMDA1LCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJhN2EsIDB4NjEyNCwgMHhkMWRjLAorCTB4MTEzOCwgMHhkMWU0LCAweDAxMzgsIDB4MDgwYywgMHgxYjM1LCAweDcwOWIsIDB4MDAxZSwgMHgwMDEwLAorCTB4NzA5YiwgMHgwMDFkLCAweDAwMDUsIDB4MDgwYywgMHg3NDFlLCAweDYxMjQsIDB4ZDFkYywgMHgxMTg4LAorCTB4MDgwYywgMHg3Mzk1LCAweDAwMTYsIDB4MDgwYywgMHgxYjM1LCAweDAwMWUsIDB4ZDFkNCwgMHgxMTI4LAorCTB4ZDFlNCwgMHgwMTM4LCAweDcwOWIsIDB4MDAxZSwgMHgwMDIwLCAweDcwOWIsIDB4MDAxZiwgMHgwODBjLAorCTB4NzM5NSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmE3YSwgMHgwMDBlLAorCTB4NjEyNCwgMHhkMWQ0LCAweDExNjAsIDB4ZDFjYywgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwgMHhkMWU0LAorCTB4MDE0MCwgMHg3MDliLCAweDAwMWUsIDB4MDAyOCwgMHg3MDliLCAweDAwMWQsIDB4MDAxMCwgMHg3MDliLAorCTB4MDAyMSwgMHgwMDA1LCAweDA4MGMsIDB4NzQxZSwgMHg2MTI0LCAweGQxZDQsIDB4MTE1MCwgMHhkMWRjLAorCTB4MTEyOCwgMHhkMWU0LCAweDAxNDAsIDB4NzA5YiwgMHgwMDFlLCAweDAwMjgsIDB4NzA5YiwgMHgwMDFkLAorCTB4MDAxMCwgMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLAorCTB4MmE3YSwgMHgwMDBlLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTc4LCAweGQxY2MsIDB4MTE1MCwgMHhkMWRjLAorCTB4MTEyOCwgMHhkMWU0LCAweDAxNTgsIDB4NzA5YiwgMHgwMDFlLCAweDAwNDAsIDB4NzA5YiwgMHgwMDFkLAorCTB4MDAyOCwgMHg3MDliLCAweDAwMjAsIDB4MDAxMCwgMHg3MDliLCAweDAwMWYsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLAorCTB4MjA3MSwgMHgxODAwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDc1M2QsIDB4MTFmOCwgMHgyMDAxLAorCTB4MTgwYywgMHgyMDBjLCAweGQxYjQsIDB4MDFkMCwgMHhjMWI0LCAweDIxMDIsIDB4MDAyNiwgMHgyMDExLAorCTB4MDIwMCwgMHgwODBjLCAweDJhYjQsIDB4MDAyZSwgMHgwODBjLCAweDJhNjAsIDB4NjAyNCwgMHhkMGNjLAorCTB4MDE0OCwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYTdhLCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLAorCTB4NjA5MiwgMHgwNDI4LCAweDYwMjgsIDB4YzBjZCwgMHg2MDJhLCAweDA0MDgsIDB4MDgwYywgMHg3NTU3LAorCTB4MDE1MCwgMHgwODBjLCAweDc1NGUsIDB4MTEzOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNjA2LAorCTB4MDgwYywgMHg3NTExLCAweDAwYTAsIDB4MDgwYywgMHg3NDFiLCAweDAxNzgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHgyNjA2LCAweDcwOTgsIDB4OTA4NiwgMHgwMDFlLCAweDAxMjAsIDB4NzA5OCwgMHg5MDg2LAorCTB4MDAyMiwgMHgxMTE4LCAweDcwOWIsIDB4MDAyNSwgMHgwMDEwLCAweDcwOWIsIDB4MDAyMSwgMHgwMTJlLAorCTB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwMjYsIDB4MjAxMSwgMHg3M2E2LAorCTB4MDgwYywgMHg4N2Q0LCAweDAwMmUsIDB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MDA2NCwgMHgyMDExLAorCTB4NzNhNiwgMHgwODBjLCAweDg3Y2IsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGY2LAorCTB4MDAxNiwgMHgwODBjLCAweDllZDQsIDB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4NzMzZiwgMHgwMDFlLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgwMGY2LCAweDAxMjYsIDB4MDgwYywgMHg5ZWQ0LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4MjA5MSwgMHg4MDAwLCAweDYwMjgsIDB4YzA5YywgMHg2MDJhLAorCTB4MDgwYywgMHhhOTFlLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGEyNDMsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDgwYywgMHhhMjRkLCAweDA4MGMsIDB4YTEzOCwgMHgwODBjLCAweDg3ODAsIDB4MDAzNiwgMHg5MDFlLAorCTB4MDgwYywgMHhhMWI4LCAweDAwM2UsIDB4MDgwYywgMHhhOTNhLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLAorCTB4ZTg4MiwgMHgwODBjLCAweGU4OWQsIDB4MjAwOSwgMHgwMDA0LCAweDA4MGMsIDB4MmE2NiwgMHgwODBjLAorCTB4Mjk3YywgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywgMHgwMDA0LCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLAorCTB4MmFiNCwgMHgyMDExLCAweDczYTYsIDB4MDgwYywgMHg4N2Q0LCAweDA4MGMsIDB4NzU1NywgMHgwMTE4LAorCTB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MDgwYywgMHgwYmMzLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MjYwNiwgMHgwMTJlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMjYsIDB4MDBlNiwgMHgyMDExLCAweDczYjMsIDB4MjA3MSwgMHgxYTAyLAorCTB4NzAxYywgMHg5MjA2LCAweDExMTgsIDB4NzAxOCwgMHg5MDA1LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDBlZSwgMHgwMDJlLCAweDAwMDUsIDB4NjAyMCwgMHhkMDljLCAweDAwMDUsIDB4NjgwMCwgMHg5MDg0LAorCTB4ZmZmZSwgMHg5MDg2LCAweDAwYzAsIDB4MDFiOCwgMHgyMDAxLCAweDAwYzAsIDB4MDgwYywgMHgyYTdhLAorCTB4MDE1NiwgMHgyMGE5LCAweDAwMmQsIDB4MWQwNCwgMHg3NDJiLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4NzQyYiwgMHgwMTVlLCAweDAwZDYsIDB4MjA2OSwgMHgxODAwLCAweDY4OWMsIDB4ODAwMSwgMHgwMjIwLAorCTB4MDExOCwgMHg2ODllLCAweDAwZGUsIDB4MDAwNSwgMHg2ODlmLCAweDAwMTQsIDB4NjhlYywgMHhkMGRjLAorCTB4MGRjOCwgMHg2ODAwLCAweDkwODYsIDB4MDAwMSwgMHgxZGE4LCAweDA4MGMsIDB4ODdlMCwgMHgwYzkwLAorCTB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLAorCTB4MTgwMCwgMHgwODBjLCAweDc4NGYsIDB4MjAwMSwgMHgxOTZjLCAweDIwMDMsIDB4MDAwMCwgMHg5MDA2LAorCTB4NzA5YSwgMHg2MGUyLCAweDY4ODYsIDB4MDgwYywgMHgyNmQ1LCAweDkwMDYsIDB4MDgwYywgMHgyYTdhLAorCTB4MDgwYywgMHg1ZjRkLCAweDAwMjYsIDB4MjAxMSwgMHhmZmZmLCAweDA4MGMsIDB4MmFiNCwgMHgwMDJlLAorCTB4NjAyYiwgMHgxODJjLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwgMHgyMDAxLAorCTB4MTk3YywgMHgyMDBjLCAweDkxODYsIDB4MDAwMCwgMHgwMTU4LCAweDkxODYsIDB4MDAwMSwgMHgwMTU4LAorCTB4OTE4NiwgMHgwMDAyLCAweDAxNTgsIDB4OTE4NiwgMHgwMDAzLCAweDAxNTgsIDB4MDgwNCwgMHg3NTAxLAorCTB4NzA5YiwgMHgwMDIyLCAweDAwNDAsIDB4NzA5YiwgMHgwMDIxLCAweDAwMjgsIDB4NzA5YiwgMHgwMDIzLAorCTB4MDAxMCwgMHg3MDliLCAweDAwMjQsIDB4NjBlMywgMHgwMDAwLCAweDY4ODcsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDI2ZDUsIDB4MDgwYywgMHhhOTFlLCAweDAwMjYsIDB4MDgwYywgMHhhYmU5LAorCTB4MDAyZSwgMHgwODBjLCAweGE5M2EsIDB4NzAwMCwgMHg5MDhlLCAweDAwMDQsIDB4MDExOCwgMHg2MDJiLAorCTB4MDAyOCwgMHgwMDEwLCAweDYwMmIsIDB4MDAyMCwgMHgwMTU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjBhOSwgMHgwMDA1LCAweDYwMjQsIDB4ZDBhYywgMHgwMTUwLCAweDAxMmUsIDB4MDE1ZSwgMHgwODBjLAorCTB4ZDA5YiwgMHgwMTE4LCAweDkwMDYsIDB4MDgwYywgMHgyYWE0LCAweDA4MDQsIDB4NzUwZCwgMHg2ODAwLAorCTB4OTA4NCwgMHgwMGExLCAweGMwYmQsIDB4NjgwMiwgMHgwODBjLCAweDJhNjAsIDB4NjkwNCwgMHhkMWQ0LAorCTB4MTE0MCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYTdhLCAweDFmMDQsIDB4NzRiMiwgMHgwODBjLAorCTB4NzU5NCwgMHgwMTJlLCAweDAxNWUsIDB4MDgwYywgMHg3NTRlLCAweDAxNzAsIDB4NjA0NCwgMHg5MDA1LAorCTB4MDEzMCwgMHgwODBjLCAweDc1OTQsIDB4OTAwNiwgMHg4MDAxLCAweDFkZjAsIDB4MDAyOCwgMHg2ODA0LAorCTB4ZDBkNCwgMHgxMTEwLCAweDA4MGMsIDB4NzU5NCwgMHgwODBjLCAweGQwOWIsIDB4MDExOCwgMHg5MDA2LAorCTB4MDgwYywgMHgyYWE0LCAweDAwMTYsIDB4MDAyNiwgMHg3MDAwLCAweDkwOGUsIDB4MDAwNCwgMHgwMTMwLAorCTB4MjAwOSwgMHgwMGM4LCAweDIwMTEsIDB4NzNiMywgMHgwODBjLCAweDg3OTIsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDgwYywgMHg4NWM1LCAweDcwMzQsIDB4YzA4NSwgMHg3MDM2LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLAorCTB4MDAwNCwgMHgwODBjLCAweDcyMDgsIDB4MDgwYywgMHg3NTRlLCAweDAxMzgsIDB4NjgwNCwgMHhkMGQ0LAorCTB4MTEyMCwgMHhkMGRjLCAweDExMDAsIDB4MDgwYywgMHg3ODQ1LCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLAorCTB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4ODVkYywgMHgwODBjLCAweDg1Y2UsIDB4MDgwYywgMHg3ODRmLAorCTB4MjAwMSwgMHgxOTZjLCAweDIwMDMsIDB4MDAwMCwgMHg5MDA2LCAweDcwOWEsIDB4NjBlMiwgMHg2ODg2LAorCTB4MDgwYywgMHgyNmQ1LCAweDkwMDYsIDB4MDgwYywgMHgyYTdhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLAorCTB4MDAxMCwgMHgwMDI2LCAweDIwMTEsIDB4ZmZmZiwgMHgwODBjLCAweDJhYjQsIDB4MDAyZSwgMHg2MDJiLAorCTB4MTgyYywgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxOTdiLAorCTB4MjAwNCwgMHg5MDg2LCAweGFhYWEsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDgwYywgMHg1NzQyLAorCTB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAwMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwODBjLAorCTB4NTc0MiwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDMwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDgwYywgMHg1NzQyLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMTAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwODBjLCAweDU3NDIsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAyMCwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDM2LCAweDAwMTYsIDB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4OTA4YywgMHgwMDEzLAorCTB4MDE4MCwgMHgwMDIwLCAweDA4MGMsIDB4MjZmNSwgMHg5MDBlLCAweDAwMjgsIDB4MDgwYywgMHg2YWQ1LAorCTB4MWRjOCwgMHgyMDA5LCAweDAwMDIsIDB4MjAxOSwgMHgwMDI4LCAweDA4MGMsIDB4MzIwNSwgMHg5MDA2LAorCTB4MDAxOSwgMHgwMDFlLCAweDAwM2UsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwYywgMHgyZTA0LAorCTB4MDEzMCwgMHgwODBjLCAweGQwOTQsIDB4MTEyOCwgMHg5MDg1LCAweDAwMTAsIDB4MDAxMCwgMHg5MDg0LAorCTB4ZmZlZiwgMHgyMDcyLCAweDAwZWUsIDB4MDAwNSwgMHg2MDUwLCAweDAwMDYsIDB4NjBlYywgMHgwMDA2LAorCTB4NjAwYywgMHgwMDA2LCAweDYwMDQsIDB4MDAwNiwgMHg2MDI4LCAweDAwMDYsIDB4MDgwYywgMHgyYWQ3LAorCTB4MDgwYywgMHgyYjBhLCAweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjAyZiwgMHgwMDQwLAorCTB4NjAyZiwgMHgwMDAwLCAweDIwYTksIDB4MDAwMiwgMHgwODBjLCAweDJhNDEsIDB4MDAyNiwgMHgyMDExLAorCTB4MDA0MCwgMHgwODBjLCAweDJhYjQsIDB4MDAyZSwgMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LAorCTB4MDAwZSwgMHg2MDBlLCAweDAwMGUsIDB4NjBlZSwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjZkNSwgMHgyMDAxLCAweDAwYTAsIDB4MDAwNiwgMHgwODBjLAorCTB4ZDA5YiwgMHgwMDBlLCAweDAxMzAsIDB4MDgwYywgMHgyYTk4LCAweDkwMDYsIDB4MDgwYywgMHgyYWE0LAorCTB4MDAxMCwgMHgwODBjLCAweDJhN2EsIDB4MDAwZSwgMHg2MDUyLCAweDYwNTAsIDB4MDAwNiwgMHhjMGU1LAorCTB4NjA1MiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwODBjLCAweDI5ZWQsIDB4MDBmZSwgMHgwMDBlLAorCTB4NjA1MiwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwgMHgwODBjLAorCTB4YTk3YywgMHgwMTU4LCAweDIwMDEsIDB4MDM4NiwgMHgyMDA0LCAweGQwYjQsIDB4MTEzMCwgMHgyMDAxLAorCTB4MDAxNiwgMHgwODBjLCAweGE5MGYsIDB4MDgwNCwgMHg3NjcwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLAorCTB4YzFjNCwgMHgyMTAyLCAweDYwMjgsIDB4OTA4NCwgMHhlMWZmLCAweDYwMmEsIDB4MjAxMSwgMHgwMjAwLAorCTB4MDgwYywgMHgyYWI0LCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLCAweDJhN2EsIDB4MjBhOSwgMHgwMzY2LAorCTB4NjAyNCwgMHhkMGNjLCAweDE1NTgsIDB4MWQwNCwgMHg3NjEwLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LAorCTB4NzYxMCwgMHgwODBjLCAweGE5MWUsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4YTI0MywgMHgyMDExLAorCTB4MDAwMiwgMHgwODBjLCAweGEyNGQsIDB4MDgwYywgMHhhMTM4LCAweDkwMWUsIDB4MDgwYywgMHhhMWI4LAorCTB4MjAwMSwgMHgwMzg2LCAweDIwMDMsIDB4NzAwMCwgMHgwODBjLCAweGE5M2EsIDB4MjAwMSwgMHgwMGEwLAorCTB4MDgwYywgMHgyYTdhLCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4MDgwYywgMHhkMDliLAorCTB4MDExMCwgMHgwODBjLCAweDBjZTksIDB4OTA4NSwgMHgwMDAxLCAweDA0YzAsIDB4MDgwYywgMHgxYjM1LAorCTB4NjBlMywgMHgwMDAwLCAweDIwMDEsIDB4MTk2YywgMHgyMDA0LCAweDA4MGMsIDB4MjZkNSwgMHg2MGUyLAorCTB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmE3YSwgMHgyMGE5LCAweDAzNjYsIDB4MjAxMSwgMHgxZTAwLAorCTB4MDgwYywgMHgyYWI0LCAweDIwMDksIDB4MWUwMCwgMHgwODBjLCAweDJhNjAsIDB4NjAyNCwgMHg5MTBjLAorCTB4MDE0MCwgMHgxZDA0LCAweDc2NGUsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzY0ZSwgMHgwODA0LAorCTB4NzYxOSwgMHgyMDAxLCAweDAzODYsIDB4MjAwMywgMHg3MDAwLCAweDYwMjgsIDB4OTA4NSwgMHgxZTAwLAorCTB4NjAyYSwgMHg3MGI0LCAweDkwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LAorCTB4MDgwYywgMHhkMDliLCAweDAxMTAsIDB4MDgwYywgMHgwY2U5LCAweDkwMDYsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMywgMHgxMTY4LCAweDIwMDEsIDB4MDIwYiwgMHgyMDA0LAorCTB4OTA4NCwgMHg1NTQwLCAweDkwODYsIDB4NTU0MCwgMHgxMTI4LCAweDIwNjksIDB4MWE3NiwgMHgyZDA0LAorCTB4ODAwMCwgMHgyMDZhLCAweDIwNjksIDB4MDE0MCwgMHg2MDIwLCAweDkwODQsIDB4MDBjMCwgMHgwMTIwLAorCTB4Njg4NCwgMHg5MDA1LCAweDE5MDQsIDB4NzZlNywgMHgyMDAxLCAweDAwODgsIDB4MDgwYywgMHgyYTdhLAorCTB4OTAwNiwgMHg2MGUyLCAweDY4ODYsIDB4MDgwYywgMHgyNmQ1LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LAorCTB4OTAwNSwgMHgxMTE4LCAweDY4MDgsIDB4OTAwNSwgMHgwMWQwLCAweDYwMjgsIDB4OTA4NCwgMHhmYmZmLAorCTB4NjAyYSwgMHgyMDExLCAweDA0MDAsIDB4MDgwYywgMHgyYWI0LCAweDIwNjksIDB4MTk4ZSwgMHg3MDAwLAorCTB4MjA2YSwgMHg3MDliLCAweDAwMjYsIDB4NzAwMywgMHgwMDAxLCAweDIwYTksIDB4MDAwMiwgMHgxZDA0LAorCTB4NzZjNywgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg3NmM3LCAweDA4MDQsIDB4NzcxOSwgMHgyMDY5LAorCTB4MDE0MCwgMHgyMGE5LCAweDAzODQsIDB4MjAxMSwgMHgxZTAwLCAweDA4MGMsIDB4MmFiNCwgMHgyMDA5LAorCTB4MWUwMCwgMHgwODBjLCAweDJhNjAsIDB4NjAyNCwgMHg5MTBjLCAweDA1MjgsIDB4OTA4NCwgMHgxYTAwLAorCTB4MTUxMCwgMHgxZDA0LCAweDc2ZDMsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzZkMywgMHgwODBjLAorCTB4YTkxZSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhMjQzLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4YTI0ZCwgMHgwODBjLCAweGExMzgsIDB4OTAxZSwgMHgwODBjLCAweGExYjgsIDB4MDgwYywgMHhhOTNhLAorCTB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmE3YSwgMHgwODBjLCAweDc4NDAsIDB4MDgwYywgMHg2MDkyLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwYjAsIDB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmE3YSwgMHgyMDY5LAorCTB4MDE0MCwgMHg2MGUzLCAweDAwMDAsIDB4NzBiNCwgMHg5MDA1LCAweDExMTgsIDB4Njg4NywgMHgwMDAxLAorCTB4MDAwOCwgMHg2ODg2LCAweDIwMDEsIDB4MTk2YywgMHgyMDA0LCAweDA4MGMsIDB4MjZkNSwgMHg2MGUyLAorCTB4OTAwNiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwgMHg2MDIwLCAweDkwODQsIDB4MDBjMCwgMHgwMWU4LAorCTB4MDgwYywgMHhhOTFlLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweGEyNDMsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDgwYywgMHhhMjRkLCAweDA4MGMsIDB4YTEzOCwgMHg5MDFlLCAweDA4MGMsIDB4YTFiOCwgMHgwODBjLAorCTB4YTkzYSwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmE3YSwgMHgwODBjLAorCTB4Nzg0MCwgMHgwODBjLCAweDYwOTIsIDB4MDgwNCwgMHg3N2JjLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLAorCTB4ZDFiNCwgMHgxMTYwLCAweGMxYjUsIDB4MjEwMiwgMHgwODBjLCAweDczOWIsIDB4MjA2OSwgMHgwMTQwLAorCTB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmE3YSwgMHg2MGUzLCAweDAwMDAsIDB4MjA2OSwgMHgwMjAwLAorCTB4NjgwNCwgMHg5MDA1LCAweDExMTgsIDB4NjgwOCwgMHg5MDA1LCAweDAxOTAsIDB4NjAyOCwgMHg5MDg0LAorCTB4ZmRmZiwgMHg2MDJhLCAweDIwMTEsIDB4MDIwMCwgMHgwODBjLCAweDJhYjQsIDB4MjA2OSwgMHgxOThlLAorCTB4NzAwMCwgMHgyMDZhLCAweDcwOWIsIDB4MDAyNywgMHg3MDAzLCAweDAwMDEsIDB4MDgwNCwgMHg3N2JjLAorCTB4MjAxMSwgMHgxZTAwLCAweDA4MGMsIDB4MmFiNCwgMHgyMDA5LCAweDFlMDAsIDB4MDgwYywgMHgyYTYwLAorCTB4NjAyNCwgMHg5MTBjLCAweDAxYzgsIDB4OTA4NCwgMHgxYzAwLCAweDExYjAsIDB4MWQwNCwgMHg3Nzc4LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDA4MGMsIDB4ODYxYywgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMGU2LCAweDIwNzEsIDB4MWEwMiwgMHg3MDcwLAorCTB4MDBlZSwgMHg5MDA1LCAweDE5ZTgsIDB4MDQwMCwgMHgwMDI2LCAweDIwMTEsIDB4NzNiMywgMHgwODBjLAorCTB4ODZjOCwgMHgyMDExLCAweDczYTYsIDB4MDgwYywgMHg4N2Q0LCAweDAwMmUsIDB4MjA2OSwgMHgwMTQwLAorCTB4NjBlMywgMHgwMDAwLCAweDcwYjQsIDB4OTAwNSwgMHgxMTE4LCAweDY4ODcsIDB4MDAwMSwgMHgwMDA4LAorCTB4Njg4NiwgMHgyMDAxLCAweDE5NmMsIDB4MjAwNCwgMHgwODBjLCAweDI2ZDUsIDB4NjBlMiwgMHgyMDAxLAorCTB4MTgwYywgMHgyMDBjLCAweGMxYjQsIDB4MjEwMiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDA0NiwgMHgwMGM2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwgMHgwODBjLAorCTB4ZDA5NCwgMHgxOTA0LCAweDc4MmEsIDB4NzEzMCwgMHhkMTg0LCAweDExNzAsIDB4MDgwYywgMHgzM2FkLAorCTB4MDEzOCwgMHhjMThkLCAweDcxMzIsIDB4MjAxMSwgMHgxODQ4LCAweDIyMTQsIDB4ZDJhYywgMHgxMTIwLAorCTB4NzAzMCwgMHhkMDhjLCAweDA5MDQsIDB4NzgyYSwgMHgyMDExLCAweDE4NDgsIDB4MjIwYywgMHhkMWE0LAorCTB4MDUzOCwgMHgwMDE2LCAweDIwMTksIDB4MDAwZSwgMHgwODBjLCAweGUzYjUsIDB4MDE1NiwgMHgwMGI2LAorCTB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4OTE4NiwgMHgwMDdlLCAweDAxYTAsIDB4OTE4NiwgMHgwMDgwLAorCTB4MDE4OCwgMHgwODBjLCAweDY2OTMsIDB4MTE3MCwgMHgyMTIwLCAweDkwMDYsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwZSwgMHgwODBjLCAweGU0NDUsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgwODBjLAorCTB4ODk3OSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg3N2YzLCAweDAwYmUsIDB4MDE1ZSwgMHgwMDFlLAorCTB4ZDFhYywgMHgxMTQ4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLAorCTB4MzIwNSwgMHgwMDFlLCAweDAwNzgsIDB4MDE1NiwgMHgwMGI2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLAorCTB4MDgwYywgMHg2NjkzLCAweDExMTAsIDB4MDgwYywgMHg2MGFjLCAweDgxMDgsIDB4MWYwNCwgMHg3ODIwLAorCTB4MDBiZSwgMHgwMTVlLCAweDA4MGMsIDB4MWIzNSwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHhhYmU5LAorCTB4MDgwYywgMHhhOTNhLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweDYwOTIsIDB4MDgwYywgMHg3NDZlLAorCTB4MDBlZSwgMHgwMGNlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxOTdjLCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLAorCTB4MDAwMCwgMHgwMDA1LCAweDIwMDEsIDB4MTk3YiwgMHgyMDAzLCAweGFhYWEsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTk3YiwgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgyMDcxLCAweDE4ZmEsIDB4NzAwMywgMHgwMDAwLAorCTB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTA2MCwgMHgwOTBjLCAweDBkN2QsIDB4YThhYiwgMHhkY2IwLAorCTB4MjkwMCwgMHg3MDRlLCAweDA4MGMsIDB4MTA2MCwgMHgwOTBjLCAweDBkN2QsIDB4YThhYiwgMHhkY2IwLAorCTB4MjkwMCwgMHg3MDUyLCAweGE4NjcsIDB4MDAwMCwgMHhhODZiLCAweDAwMDEsIDB4YTg5ZiwgMHgwMDAwLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA0MCwgMHg2ODQ4LCAweDkwMDUsIDB4MTExOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwNGIwLCAweDY4NDAsIDB4OTAwNSwgMHgwMTUwLCAweDA0YTEsIDB4NmE1MCwgMHg5MjAwLAorCTB4NzAwMiwgMHg2ODU0LCAweDkxMDEsIDB4NzAwNiwgMHg5MDA2LCAweDcwMTIsIDB4NzAxNiwgMHg2ODUwLAorCTB4NzAwMiwgMHg2ODU0LCAweDcwMDYsIDB4Njg1OCwgMHg3MDBhLCAweDY4NWMsIDB4NzAwZSwgMHg2ODQwLAorCTB4OTAwNSwgMHgxMTEwLCAweDcwMTIsIDB4NzAxNiwgMHg2ODQ4LCAweDcwMWEsIDB4NzAxYywgMHg5MDg1LAorCTB4MDA0MCwgMHg3MDFlLCAweDIwMDEsIDB4MDAxOSwgMHg3MDM2LCAweDcwMmIsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmNywgMHg5MThkLCAweDgwMDAsIDB4MjEwMiwgMHgwMGQ2LAorCTB4MjA2OSwgMHgxOGZhLCAweDY4MDcsIDB4MDAwMSwgMHgwMGRlLCAweDA4MGMsIDB4N2UzOCwgMHg5MDA2LAorCTB4MDBlZSwgMHgwMDA1LCAweDkwMGUsIDB4MDE1NiwgMHgyMGE5LCAweDAwMDYsIDB4ODAwMywgMHg4MThkLAorCTB4MWYwNCwgMHg3OGI2LCAweDAxNWUsIDB4MDAwNSwgMHgyMDc5LCAweDAwNDAsIDB4MjA3MSwgMHgxOGZhLAorCTB4NzAwNCwgMHgwMDAyLCAweDc4Y2MsIDB4NzhjZCwgMHg3OTE5LCAweDc5NzQsIDB4N2E4NCwgMHg3OGNhLAorCTB4NzhjYSwgMHg3YWFlLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDA1LCAweDIwNzksIDB4MDA0MCwgMHgyMDAxLAorCTB4MWRjMCwgMHgyMDAzLCAweDAwMDAsIDB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3ZjFhLAorCTB4ZDBhNCwgMHgwNTc4LCAweDIwMDEsIDB4MWRjMCwgMHgyMDA0LCAweDkwODIsIDB4MDA4MCwgMHgxNjQ4LAorCTB4MWQwNCwgMHg3OGVhLCAweDIwMDEsIDB4MWEwNSwgMHgyMDBjLCAweDgxMDksIDB4MDUxMCwgMHgyMDkxLAorCTB4NjAwMCwgMHgyMTAyLCAweDc4MjQsIDB4MjA0OCwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHhhODY0LAorCTB4OTA4NCwgMHgwMGZmLCAweDkwOGEsIDB4MDA0MCwgMHgwNjEwLCAweDAwYzAsIDB4MjAwMSwgMHgxODAwLAorCTB4MjAwYywgMHg5MTg2LCAweDAwMDMsIDB4MTE2OCwgMHg3MDA0LCAweDAwMDIsIDB4NzkwOSwgMHg3OGQzLAorCTB4NzkwOSwgMHg3OTA3LCAweDc5MDksIDB4NzkwOSwgMHg3OTA5LCAweDc5MDksIDB4NzkwOSwgMHgwODBjLAorCTB4Nzk3NCwgMHg3ODJjLCAweGQwOWMsIDB4MDkwYywgMHg3ZTM4LCAweDAwMDUsIDB4OTA4MiwgMHgwMDVhLAorCTB4MTIxOCwgMHgyMTAwLCAweDAwM2IsIDB4MGMxMCwgMHgwODBjLCAweDc5YWEsIDB4MGM5MCwgMHgwMGUzLAorCTB4MDhlOCwgMHgwMDA1LCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWFhLCAweDc5Y2MsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzliNiwgMHg3OWFhLAorCTB4N2I5ZiwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWNjLCAweDc5YWEsIDB4NzliNiwgMHg3YmUwLAorCTB4N2MyMSwgMHg3YzY4LCAweDdjN2MsIDB4NzlhYSwgMHg3OWFhLCAweDc5Y2MsIDB4NzliNiwgMHg3OWUwLAorCTB4NzlhYSwgMHg3YTU4LCAweDdkMjcsIDB4N2Q0MiwgMHg3OWFhLCAweDc5Y2MsIDB4NzlhYSwgMHg3OWUwLAorCTB4NzlhYSwgMHg3OWFhLCAweDdhNGUsIDB4N2Q0MiwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5ZjQsIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHg3ZWJlLAorCTB4NzlhYSwgMHg3ZTY4LCAweDc5YWEsIDB4N2U2OCwgMHg3OWFhLCAweDdhMDksIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWFhLCAweDc5YWEsIDB4NzlhYSwgMHgyMDc5LCAweDAwNDAsIDB4NzAwNCwgMHg5MDg2LAorCTB4MDAwMywgMHgxMTk4LCAweDc4MmMsIDB4MDgwYywgMHg3ZTYxLCAweGQwYTQsIDB4MDE3MCwgMHg3ODI0LAorCTB4MjA0OCwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDhhLAorCTB4MDAxYSwgMHgxMjEwLCAweDAwMmIsIDB4MGM1MCwgMHgwMGU5LCAweDA4MGMsIDB4N2UzOCwgMHgwMDA1LAorCTB4NzlhYSwgMHg3OWI2LCAweDdiOGIsIDB4NzlhYSwgMHg3OWI2LCAweDc5YWEsIDB4NzliNiwgMHg3OWI2LAorCTB4NzlhYSwgMHg3OWI2LCAweDdiOGIsIDB4NzliNiwgMHg3OWI2LCAweDc5YjYsIDB4NzliNiwgMHg3OWI2LAorCTB4NzlhYSwgMHg3OWI2LCAweDdiOGIsIDB4NzlhYSwgMHg3OWFhLCAweDc5YjYsIDB4NzlhYSwgMHg3OWFhLAorCTB4NzlhYSwgMHg3OWI2LCAweDAwZTYsIDB4MjA3MSwgMHgxOGZhLCAweDIwMDksIDB4MDQwMCwgMHgwMDcxLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwMDksIDB4MTAwMCwgMHgwMDQ5LCAweDAwMDUsIDB4MjAwOSwgMHgyMDAwLAorCTB4MDAyOSwgMHgwMDA1LCAweDIwMDksIDB4MDgwMCwgMHgwMDA5LCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLAorCTB4YTg2OCwgMHg5MDg0LCAweDAwZmYsIDB4OTEwNSwgMHhhODZhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLAorCTB4MGQwOCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4N2IyZCwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4N2IyZCwgMHgwMDA1LAorCTB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHgwOTY4LCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LAorCTB4MDAwMSwgMHgwODA0LCAweDdiNDgsIDB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwgMHg3MDE2LAorCTB4NzAxYSwgMHg3MDRiLCAweDdiNDgsIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLAorCTB4MDkwNCwgMHg3OWIyLCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg3YjY0LAorCTB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg3YjY0LAorCTB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMSwgMHgxOTA0LAorCTB4NzliMiwgMHg3MDA3LCAweDAwMDEsIDB4MjAwOSwgMHgxODM0LCAweDIxMGMsIDB4ODFmZiwgMHgxMWE4LAorCTB4YTg2OCwgMHg5MDg0LCAweDAwZmYsIDB4YTg2YSwgMHhhODgzLCAweDAwMDAsIDB4MDgwYywgMHg2MzI1LAorCTB4MTEwOCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweGE4NjcsIDB4MDEzOSwgMHhhODdhLAorCTB4YTk4MiwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwY2EwLCAweGE5OTQsIDB4OTE4NiwgMHgwMDcxLAorCTB4MGQzOCwgMHg5MTg2LCAweDAwNjQsIDB4MGQyMCwgMHg5MTg2LCAweDAwN2MsIDB4MGQwOCwgMHg5MTg2LAorCTB4MDAyOCwgMHgwOWYwLCAweDkxODYsIDB4MDAzOCwgMHgwOWQ4LCAweDkxODYsIDB4MDA3OCwgMHgwOWMwLAorCTB4OTE4NiwgMHgwMDVmLCAweDA5YTgsIDB4OTE4NiwgMHgwMDU2LCAweDA5OTAsIDB4YTg5NywgMHg0MDA1LAorCTB4YTg5YiwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDA4YTAsIDB4YTg3YywgMHg5MDg0LAorCTB4MDBjMCwgMHg5MDg2LCAweDAwYzAsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwNCwgMHg3ZDU5LAorCTB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDMwLCAweDIwOTgsIDB4NzA1MCwgMHgyMDQwLCAweGEwNjAsIDB4MjBlOCwgMHhhMDVjLAorCTB4OTA4MCwgMHgwMDIzLCAweDIwYTAsIDB4NDAwMywgMHhhODg4LCAweDcwMTIsIDB4OTA4MiwgMHgwNDAxLAorCTB4MWEwNCwgMHg3OWJhLCAweGFhYjQsIDB4OTI4YSwgMHgwMDAyLCAweDFhMDQsIDB4NzliYSwgMHg4MmZmLAorCTB4MTEzOCwgMHhhOGI4LCAweGE5YmMsIDB4OTEwNSwgMHgwMTE4LCAweDIwMDEsIDB4N2FlYiwgMHgwMDE4LAorCTB4OTI4MCwgMHg3YWUxLCAweDIwMDUsIDB4NzA1NiwgMHg3MDEwLCAweDkwMTUsIDB4MDkwNCwgMHg3YWNjLAorCTB4MDgwYywgMHgxMDYwLCAweDExMTgsIDB4NzAwNywgMHgwMDA0LCAweDAwMDUsIDB4MjkwMCwgMHg3MDIyLAorCTB4NzA1NCwgMHgyMDYwLCAweGUwMDAsIDB4YTg2NiwgMHg3MDUwLCAweDIwNDAsIDB4YTk1YywgMHhlMDA0LAorCTB4OTEwMCwgMHhhMDc2LCAweGE4NjAsIDB4YTA3MiwgMHhlMDA4LCAweDkyMGEsIDB4MTIxMCwgMHg5MDBlLAorCTB4MjIwMCwgMHg3MTEyLCAweGUyMGMsIDB4ODAwMywgMHg4MDBiLCAweDkyOTYsIDB4MDAwNCwgMHgwMTA4LAorCTB4OTEwOCwgMHhhMTdhLCAweDgxMGIsIDB4YTE3ZSwgMHgwODBjLCAweDExM2MsIDB4YTA2YywgMHg5MDhlLAorCTB4MDEwMCwgMHgwMTcwLCAweDkwODYsIDB4MDIwMCwgMHgwMTE4LCAweDcwMDcsIDB4MDAwNywgMHgwMDA1LAorCTB4NzAyMCwgMHgyMDQ4LCAweDA4MGMsIDB4MTA3OSwgMHg3MDE0LCAweDIwNDgsIDB4MDgwNCwgMHg3OWJhLAorCTB4NzAyMCwgMHgyMDQ4LCAweDcwMTgsIDB4YTgwMiwgMHhhODA3LCAweDAwMDAsIDB4MjkwOCwgMHgyMDQ4LAorCTB4YTkwNiwgMHg3MTFhLCAweDA4MDQsIDB4N2E4NCwgMHg3MDE0LCAweDIwNDgsIDB4NzAwNywgMHgwMDAxLAorCTB4YThiNCwgMHg5MDA1LCAweDExMjgsIDB4YThiOCwgMHhhOWJjLCAweDkxMDUsIDB4MDEwOCwgMHgwMGI5LAorCTB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDFlLCAweDA5MDQsIDB4N2Q1OSwgMHgwODA0LAorCTB4N2IyZCwgMHg3YWUzLCAweDdhZTcsIDB4MDAwMiwgMHgwMDFkLCAweDAwMDcsIDB4MDAwNCwgMHgwMDBhLAorCTB4MDAxYiwgMHgwMDA1LCAweDAwMDYsIDB4MDAwYSwgMHgwMDFkLCAweDAwMDUsIDB4MDAwNCwgMHgwMDc2LAorCTB4MDA2NiwgMHhhZmI4LCAweGFlYmMsIDB4YTgwNCwgMHgyMDUwLCAweGIwYzAsIDB4YjBlMiwgMHhiMGJjLAorCTB4YjBkZSwgMHhiMGI4LCAweGIwZDIsIDB4YjBiNCwgMHhiMGNlLCAweGI2ZGEsIDB4YjdkNiwgMHhiMGIwLAorCTB4YjBjYSwgMHhiMGFjLCAweGIwYzYsIDB4YjBhOCwgMHhiMGJhLCAweGIwYTQsIDB4YjBiNiwgMHhiNmMyLAorCTB4YjdiZSwgMHhiMGEwLCAweGIwYjIsIDB4YjA5YywgMHhiMGFlLCAweGIwOTgsIDB4YjBhMiwgMHhiMDk0LAorCTB4YjA5ZSwgMHhiNmFhLCAweGI3YTYsIDB4YjA5MCwgMHhiMDlhLCAweGIwOGMsIDB4YjA5NiwgMHhiMDg4LAorCTB4YjA4YSwgMHhiMDg0LCAweGIwODYsIDB4YjY5MiwgMHhiNzhlLCAweGIwODAsIDB4YjA4MiwgMHhiMDdjLAorCTB4YjA3ZSwgMHhiMDc4LCAweGIwNzIsIDB4YjA3NCwgMHhiMDZlLCAweGI2N2EsIDB4Yjc3NiwgMHhiMDA0LAorCTB4OTA1NSwgMHgxOTU4LCAweDAwNmUsIDB4MDA3ZSwgMHgwMDA1LCAweDIwMDksIDB4MTgzNCwgMHgyMTBjLAorCTB4ODFmZiwgMHgxMTc4LCAweDA4MGMsIDB4NjEyNCwgMHgxMTA4LCAweDAwMDUsIDB4MDgwYywgMHg3MDIyLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhjYzdmLCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLAorCTB4MGNhMCwgMHgwODBjLCAweGQwOTQsIDB4MWQ3MCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHgwYzcwLAorCTB4MjAwOSwgMHgxODM0LCAweDIxMGMsIDB4ODFmZiwgMHgxMTg4LCAweGE4ODgsIDB4OTAwNSwgMHgwMTg4LAorCTB4YTg4MywgMHgwMDAwLCAweDA4MGMsIDB4NjFiMiwgMHgxMTA4LCAweDAwMDUsIDB4YTg3YSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDBjYjgsIDB4MjAwMSwgMHgwMDI4LAorCTB4MGNhOCwgMHgyMDAxLCAweDAwMDAsIDB4MGM5MCwgMHgyMDA5LCAweDE4MzQsIDB4MjEwYywgMHg4MWZmLAorCTB4MTFkOCwgMHhhODg4LCAweDkwMDUsIDB4MDFlMCwgMHhhODgzLCAweDAwMDAsIDB4YTg3YywgMHhkMGY0LAorCTB4MDEyMCwgMHgwODBjLCAweDYyODcsIDB4MTEzOCwgMHgwMDA1LCAweDkwMDYsIDB4YTg3YSwgMHgwODBjLAorCTB4NjFmZiwgMHgxMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg3YSwgMHhhOTgyLAorCTB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MGNiMCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHgwYzk4LAorCTB4MjAwMSwgMHgwMDAwLCAweDBjODAsIDB4NzAxOCwgMHhhODAyLCAweDI5MDgsIDB4MjA0OCwgMHhhOTA2LAorCTB4NzExYSwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgwMTE4LCAweDcwMDcsIDB4MDAwMywgMHgwMDMwLAorCTB4NzAxNCwgMHgyMDQ4LCAweDcwMDcsIDB4MDAwMSwgMHg3MDQ4LCAweDA4MGYsIDB4MDAwNSwgMHgwMGI2LAorCTB4NzAwNywgMHgwMDAxLCAweGE5NzQsIDB4YTg3OCwgMHg5MDg0LCAweDAwZmYsIDB4OTA5NiwgMHgwMDA0LAorCTB4MDU0MCwgMHgyMGE5LCAweDAwMDEsIDB4OTA5NiwgMHgwMDAxLCAweDAxOTAsIDB4OTAwZSwgMHgyMGE5LAorCTB4MDgwMCwgMHg5MDk2LCAweDAwMDIsIDB4MDE2MCwgMHg5MDA1LCAweDExZDgsIDB4YTk3NCwgMHgwODBjLAorCTB4NjY5MywgMHgxMWI4LCAweDAwNjYsIDB4YWU4MCwgMHgwODBjLCAweDY3YTMsIDB4MDA2ZSwgMHgwMDg4LAorCTB4MDA0NiwgMHgyMDExLCAweDE4MGMsIDB4MjIyNCwgMHhjNDg0LCAweDI0MTIsIDB4MDA0ZSwgMHgwMGM2LAorCTB4MDgwYywgMHg2NjkzLCAweDExMTAsIDB4MDgwYywgMHg2OTc2LCAweDgxMDgsIDB4MWYwNCwgMHg3YmM4LAorCTB4MDBjZSwgMHhhODdjLCAweGQwODQsIDB4MTEyMCwgMHgwODBjLCAweDEwNzksIDB4MDBiZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4NmFkOSwgMHgwNTgwLAorCTB4MjA2MSwgMHgxYTZlLCAweDYxMDAsIDB4ZDE4NCwgMHgwMTc4LCAweGE4ODgsIDB4OTA4NCwgMHgwMGZmLAorCTB4MTU1MCwgMHg2MDAwLCAweGQwODQsIDB4MDUyMCwgMHg2MDA0LCAweDkwMDUsIDB4MTUzOCwgMHg2MDAzLAorCTB4MDAwMCwgMHg2MDBiLCAweDAwMDAsIDB4MDBjOCwgMHgyMDExLCAweDAwMDEsIDB4YTg5MCwgMHg5MDA1LAorCTB4MTExMCwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMCwgMHg2MDE2LCAweGE4ODgsIDB4OTA4NCwgMHgwMGZmLAorCTB4MDE3OCwgMHg2MDA2LCAweGE4ODgsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDE0OCwgMHg2MDBhLAorCTB4YTg4OCwgMHg4MDAwLCAweDExMDgsIDB4YzI4ZCwgMHg2MjAyLCAweDAxMmUsIDB4MDgwNCwgMHg3ZTIyLAorCTB4MDEyZSwgMHgwODA0LCAweDdlMWMsIDB4MDEyZSwgMHgwODA0LCAweDdlMTYsIDB4MDEyZSwgMHgwODA0LAorCTB4N2UxOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwYywgMHg2YWQ5LAorCTB4MDVlMCwgMHgyMDYxLCAweDFhNmUsIDB4NjAwMCwgMHhkMDg0LCAweDA1YjgsIDB4NjIwNCwgMHg2MzA4LAorCTB4ZDA4YywgMHgxNTMwLCAweGFjNzgsIDB4OTQ4NCwgMHgwMDAzLCAweDAxNzAsIDB4YTk4OCwgMHg5MThjLAorCTB4MDBmZiwgMHg4MDAxLCAweDExMjAsIDB4MjEwMCwgMHg5MjEwLCAweDA2MjAsIDB4MDAyOCwgMHg4MDAxLAorCTB4MTUwOCwgMHgyMTAwLCAweDkyMTIsIDB4MDJmMCwgMHg5NDg0LCAweDAwMGMsIDB4MDE4OCwgMHhhOTg4LAorCTB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4OTA4MiwgMHgwMDA0LCAweDExMjAsIDB4MjEwMCwgMHg5MzE4LAorCTB4MDI4OCwgMHgwMDMwLCAweDkwODIsIDB4MDAwNCwgMHgxMTY4LCAweDIxMDAsIDB4OTMxYSwgMHgwMjUwLAorCTB4YTg5MCwgMHg5MDA1LCAweDAxMTAsIDB4ODAwMCwgMHg2MDE2LCAweDYyMDYsIDB4NjMwYSwgMHgwMTJlLAorCTB4MDgwNCwgMHg3ZTIyLCAweDAxMmUsIDB4MDgwNCwgMHg3ZTFmLCAweDAxMmUsIDB4MDgwNCwgMHg3ZTFjLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4MWE2ZSwgMHg2MzAwLAorCTB4ZDM4YywgMHgxMTIwLCAweDYzMDgsIDB4ODMxOCwgMHgwMjIwLCAweDYzMGEsIDB4MDEyZSwgMHgwODA0LAorCTB4N2UzMCwgMHgwMTJlLCAweDA4MDQsIDB4N2UxZiwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4YTg3YywgMHhkMGFjLCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLAorCTB4MWE2ZSwgMHg2MDAwLCAweDkwODQsIDB4ZmNmZiwgMHg2MDAyLCAweDAwY2UsIDB4MDQ0MCwgMHhhODg4LAorCTB4OTAwNSwgMHgwNWQ4LCAweGE4OGMsIDB4OTA2NSwgMHgwNTk4LCAweDIwMDEsIDB4MTgzNCwgMHgyMDA0LAorCTB4OTAwNSwgMHgwMTE4LCAweDA4MGMsIDB4YWNlYiwgMHgwMDY4LCAweDYwMTcsIDB4ZjQwMCwgMHg2MDYzLAorCTB4MDAwMCwgMHhhOTdjLCAweGQxYTQsIDB4MDExMCwgMHhhOTgwLCAweDYxNjIsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDgwYywgMHhhZDRkLCAweGE5ODgsIDB4OTE4YywgMHhmZjAwLCAweDkxODYsIDB4MjAwMCwgMHgxMTM4LAorCTB4MDAyNiwgMHg5MDBlLCAweDIwMTEsIDB4ZmRmZiwgMHgwODBjLCAweDg5NzksIDB4MDAyZSwgMHhhODdjLAorCTB4ZDBjNCwgMHgwMTQ4LCAweDIwNjEsIDB4MWE2ZSwgMHg2MDAwLCAweGQwOGMsIDB4MTEyMCwgMHg2MDA4LAorCTB4ODAwMCwgMHgwMjA4LCAweDYwMGEsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDgwNCwgMHg3ZTIyLAorCTB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDgwNCwgMHg3ZTFjLCAweGE5ODQsIDB4OTE4NiwgMHgwMDJlLAorCTB4MGQzMCwgMHg5MTg2LCAweDAwMmQsIDB4MGQxOCwgMHg5MTg2LCAweDAwNDUsIDB4MDUxMCwgMHg5MTg2LAorCTB4MDAyYSwgMHgxMTMwLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxOTQsIDB4MjEwMiwgMHgwOGI4LAorCTB4OTE4NiwgMHgwMDIwLCAweDAxNTgsIDB4OTE4NiwgMHgwMDI5LCAweDFkMTAsIDB4YTk3NCwgMHgwODBjLAorCTB4NjY5MywgMHgxOTY4LCAweGI4MDAsIDB4YzBlNCwgMHhiODAyLCAweDA4NDgsIDB4YTg4YywgMHg5MDY1LAorCTB4MDliOCwgMHg2MDA3LCAweDAwMjQsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDQsIDB4NjAxYSwgMHgwODA0LAorCTB4N2NiNywgMHhhODhjLCAweDkwNjUsIDB4MDk2MCwgMHgwMGU2LCAweGE4OTAsIDB4OTA3NSwgMHgyMDAxLAorCTB4MTgzNCwgMHgyMDA0LCAweDkwMDUsIDB4MDE1MCwgMHgwODBjLCAweGFjZWIsIDB4OGVmZiwgMHgwMTE4LAorCTB4MmU2MCwgMHgwODBjLCAweGFjZWIsIDB4MDBlZSwgMHgwODA0LCAweDdjYjcsIDB4NjAyNCwgMHhjMGRjLAorCTB4YzBkNSwgMHg2MDI2LCAweDJlNjAsIDB4NjAwNywgMHgwMDNhLCAweGE4YTAsIDB4OTAwNSwgMHgwMTMwLAorCTB4NjAwNywgMHgwMDNiLCAweGE4YTQsIDB4NjAyZSwgMHhhOGE4LCAweDYwMTYsIDB4NjAwMywgMHgwMDAxLAorCTB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMGVlLCAweDA4MDQsIDB4N2NiNywgMHgyMDYxLAorCTB4MWE2ZSwgMHg2MDAwLCAweGQwODQsIDB4MDE5MCwgMHhkMDhjLCAweDE5MDQsIDB4N2UzMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYyMDQsIDB4ODIxMCwgMHgwMjIwLCAweDYyMDYsIDB4MDEyZSwgMHgwODA0LAorCTB4N2UzMCwgMHgwMTJlLCAweGE4ODMsIDB4MDAxNiwgMHgwODA0LCAweDdlMjksIDB4YTg4MywgMHgwMDA3LAorCTB4MDgwNCwgMHg3ZTI5LCAweGE4NjQsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDEzMCwgMHg4MDAxLAorCTB4MTEzOCwgMHg3MDA3LCAweDAwMDEsIDB4MDA2OSwgMHgwMDA1LCAweDA4MGMsIDB4NzliMiwgMHgwMDQwLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg3ZDU5LAorCTB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTAzZSwgMHgyMDYxLAorCTB4MTgwMCwgMHg2MWQwLCAweDgxZmYsIDB4MTkwNCwgMHg3ZGRiLCAweDYxMzAsIDB4ZDE5NCwgMHgxOTA0LAorCTB4N2UwNSwgMHhhODc4LCAweDIwNzAsIDB4OWU4MiwgMHgxZGRjLCAweDBhMDQsIDB4N2RjZiwgMHg2MDY4LAorCTB4OWUwMiwgMHgxYTA0LCAweDdkY2YsIDB4NzEyMCwgMHg5MTg2LCAweDAwMDYsIDB4MTkwNCwgMHg3ZGMxLAorCTB4NzAxMCwgMHg5MDVkLCAweDA5MDQsIDB4N2RkYiwgMHhiODAwLCAweGQwZTQsIDB4MTkwNCwgMHg3ZGZmLAorCTB4MjA2MSwgMHgxYTZlLCAweDYxMDAsIDB4OTE4NCwgMHgwMzAxLCAweDkwODYsIDB4MDAwMSwgMHgxNWEwLAorCTB4NzAyNCwgMHhkMGRjLCAweDE5MDQsIDB4N2UwOCwgMHhhODgzLCAweDAwMDAsIDB4YTgwMywgMHgwMDAwLAorCTB4MjkwOCwgMHg3MDE0LCAweDkwMDUsIDB4MTE5OCwgMHg3MTE2LCAweGE4N2MsIDB4ZDBmNCwgMHgxOTA0LAorCTB4N2UwYiwgMHgwODBjLCAweDU3M2UsIDB4ZDA5YywgMHgxMTE4LCAweGE4N2MsIDB4YzBjYywgMHhhODdlLAorCTB4MmU2MCwgMHgwODBjLCAweDg4NjksIDB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDQ4LAorCTB4YTgwMCwgMHg5MDA1LCAweDFkZTAsIDB4YTkwMiwgMHgyMTQ4LCAweGE4N2MsIDB4ZDBmNCwgMHgxOTA0LAorCTB4N2UwYiwgMHgwMTJlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMmUsIDB4MDBlZSwgMHhhODgzLAorCTB4MDAwNiwgMHgwMGJlLCAweDA4MDQsIDB4N2UyOSwgMHhkMTg0LCAweDBkYjgsIDB4ZDFjNCwgMHgxMTkwLAorCTB4MDBhMCwgMHhhOTc0LCAweDA4MGMsIDB4NjY5MywgMHgxNWQwLCAweGI4MDAsIDB4ZDBlNCwgMHgxNWI4LAorCTB4NzEyMCwgMHg5MTg2LCAweDAwMDcsIDB4MTExOCwgMHhhODgzLCAweDAwMDIsIDB4MDQ5MCwgMHhhODgzLAorCTB4MDAwOCwgMHgwNDc4LCAweGE4ODMsIDB4MDAwZSwgMHgwNDYwLCAweGE4ODMsIDB4MDAxNywgMHgwNDQ4LAorCTB4YTg4MywgMHgwMDM1LCAweDA0MzAsIDB4MDgwYywgMHg1NzQyLCAweGQwZmMsIDB4MDFlOCwgMHhhODc4LAorCTB4MjA3MCwgMHg5ZTgyLCAweDFkZGMsIDB4MDJjMCwgMHg2MDY4LCAweDllMDIsIDB4MTJhOCwgMHg3MTIwLAorCTB4OTE4NiwgMHgwMDA2LCAweDExODgsIDB4NzAxMCwgMHg5MDVkLCAweDAxNzAsIDB4YjgwMCwgMHhkMGJjLAorCTB4MDE1OCwgMHgyMDM5LCAweDAwMDEsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDcsIDB4MTkwNCwgMHg3ZDY1LAorCTB4NzAwMywgMHgwMDAyLCAweDA4MDQsIDB4N2Q2NSwgMHhhODgzLCAweDAwMjgsIDB4MDAxMCwgMHhhODgzLAorCTB4MDAyOSwgMHgwMTJlLCAweDAwZWUsIDB4MDBiZSwgMHgwNDIwLCAweGE4ODMsIDB4MDAyYSwgMHgwY2M4LAorCTB4YTg4MywgMHgwMDQ1LCAweDBjYjAsIDB4MmU2MCwgMHgyMDE5LCAweDAwMDIsIDB4NjAxYiwgMHgwMDE0LAorCTB4MDgwYywgMHhkZmExLCAweDAxMmUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDNlLAorCTB4MDA1OCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHgyMDA5LCAweDAwMDYsIDB4MDAyOCwgMHgyMDA5LAorCTB4MDAxNiwgMHgwMDEwLCAweDIwMDksIDB4MDAwMSwgMHhhODg0LCAweDkwODQsIDB4ZmYwMCwgMHg5MTA1LAorCTB4YTg4NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDgwYywgMHgxMDc5LCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweDg4NjAsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDA0MCwgMHg3MDJjLAorCTB4ZDA4NCwgMHgwMWQ4LCAweDkwOGMsIDB4MDc4MCwgMHgxOTBjLCAweDdmMWEsIDB4ZDA5YywgMHgxMWE4LAorCTB4MjA3MSwgMHgxODAwLCAweDcwYzAsIDB4OTBlYSwgMHgwMDIwLCAweDAyNzgsIDB4ODAwMSwgMHg3MGMyLAorCTB4NzAyYywgMHgyMDQ4LCAweGE4MDAsIDB4NzAyZSwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHgyMDcxLAorCTB4MDA0MCwgMHgyOTAwLCAweDcwMjIsIDB4NzAyYywgMHgwYzI4LCAweDAxMmUsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMDA2LCAweDkwODQsIDB4MDc4MCwgMHgxOTBjLCAweDdmMWEsIDB4MDAwZSwgMHgwMDA1LAorCTB4YTg5OCwgMHg5MDg0LCAweDAwMDMsIDB4MDVhOCwgMHgwODBjLCAweGFjNWEsIDB4MDVkOCwgMHgyOTAwLAorCTB4NjAxNiwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMzUsIDB4MTEzOCwgMHg2MDI4LAorCTB4YzBmZCwgMHg2MDJhLCAweDIwMDEsIDB4MTk2YSwgMHgyMDA0LCAweDAwOTgsIDB4YThhMCwgMHg5MDg0LAorCTB4MDBmZiwgMHhhOTljLCAweDkxOGMsIDB4ZmYwMCwgMHg5MTA1LCAweGE5OWMsIDB4OTE4YywgMHgwMGZmLAorCTB4MDgwYywgMHgyNjYxLCAweDE1NDAsIDB4MDBiNiwgMHgwODBjLCAweDY2OTMsIDB4MmIwMCwgMHgwMGJlLAorCTB4MTUxMCwgMHg2MDEyLCAweDYwMjMsIDB4MDAwMSwgMHgyMDA5LCAweDAwNDAsIDB4YTg2NCwgMHg5MDg0LAorCTB4MDBmZiwgMHg5MDg2LCAweDAwMzUsIDB4MDExMCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHhhZDRkLAorCTB4MDAwNSwgMHhhODdiLCAweDAxMDEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2ZGVlLAorCTB4MDEyZSwgMHgwMDA1LCAweGE4N2IsIDB4MDAyYywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NmRlZSwgMHgwMTJlLCAweDAwMDUsIDB4YTg3YiwgMHgwMDI4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2ZGVlLCAweDAxMmUsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDBiNiwgMHg3MDA3LCAweDAwMDEsIDB4YWE3NCwgMHg5MjgyLAorCTB4MDAwNCwgMHgxYTA0LCAweDdmMGIsIDB4YTk3YywgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLAorCTB4YjgwNCwgMHhkMjg0LCAweDAxNDAsIDB4MDVlOCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg5MDg0LAorCTB4MDAwNiwgMHgxMTA4LCAweDA0YjAsIDB4MmIxMCwgMHgwODBjLCAweGFjNWEsIDB4MTExOCwgMHgwODBjLAorCTB4YWQyMCwgMHgwNWE4LCAweDYyMTIsIDB4YTg3NCwgMHgwMDAyLCAweDdlZTksIDB4N2VlZSwgMHg3ZWYxLAorCTB4N2VmNywgMHgyMDE5LCAweDAwMDIsIDB4MDgwYywgMHhlM2I1LCAweDAwNjAsIDB4MDgwYywgMHhlMzQ1LAorCTB4MDA0OCwgMHgyMDE5LCAweDAwMDIsIDB4YTk4MCwgMHgwODBjLCAweGUzNjQsIDB4MDAxOCwgMHhhOTgwLAorCTB4MDgwYywgMHhlMzQ1LCAweDA4MGMsIDB4YWNiMCwgMHhhODg3LCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwMGJlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4YTg4NywgMHgwMDA2LCAweDBjODAsIDB4YTg4NywgMHgwMDAyLAorCTB4MGM2OCwgMHhhODg3LCAweDAwMDUsIDB4MGM1MCwgMHhhODg3LCAweDAwMDQsIDB4MGMzOCwgMHhhODg3LAorCTB4MDAwNywgMHgwYzIwLCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDdmMWMsIDB4MDAwNiwgMHgwMDE2LAorCTB4MjAwMSwgMHg4MDAzLCAweDAwMDYsIDB4MDgwNCwgMHgwZDg2LCAweDIwMDEsIDB4MTgzNCwgMHgyMDA0LAorCTB4OTAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4MjAwMSwgMHgwMjAwLAorCTB4MjAwYywgMHhjMWU1LCAweGMxZGMsIDB4MjEwMiwgMHgyMDA5LCAweDAyMTgsIDB4MjEwYywgMHhkMWVjLAorCTB4MTEyMCwgMHgwODBjLCAweDE2MmYsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLAorCTB4MDAyMCwgMHg3ODFmLCAweDAzMDAsIDB4MDBmZSwgMHgwMDA1LCAweDc4MWMsIDB4ZDA4YywgMHgwOTA0LAorCTB4N2Y5ZCwgMHg2OGMwLCAweDkwYWEsIDB4MDAwNSwgMHgwYTA0LCAweDg1YzUsIDB4N2Q0NCwgMHg3YzQwLAorCTB4ZDU5YywgMHgxOTBjLCAweDBkN2QsIDB4OTU4NCwgMHgwMGY2LCAweDE1MDgsIDB4OTQ4NCwgMHg3MDAwLAorCTB4MDEzOCwgMHg5MDhhLCAweDIwMDAsIDB4MTI1OCwgMHg5NTg0LCAweDA3MDAsIDB4ODAwNywgMHgwNGYwLAorCTB4NzAwMCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHg4MTAwLCAweDBkYjAsIDB4MDBiMCwgMHg5NDg0LAorCTB4MGZmZiwgMHgxMTMwLCAweDcwMDAsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4ODEwMCwgMHgxMWMwLAorCTB4MDgwYywgMHhlODVhLCAweDA4MGMsIDB4ODRhYywgMHg3ODE3LCAweDAxNDAsIDB4MDBhOCwgMHg5NTg0LAorCTB4MDA3NiwgMHgxMTE4LCAweDA4MGMsIDB4ODUwOCwgMHgxOWM4LCAweGQ1YTQsIDB4MDE0OCwgMHgwMDQ2LAorCTB4MDA1NiwgMHgwODBjLCAweDdmZWQsIDB4MDgwYywgMHgyMTZmLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDIwLAorCTB4MDgwYywgMHhlODVhLCAweDc4MTcsIDB4MDE0MCwgMHgwODBjLCAweDc1M2QsIDB4MDE2OCwgMHgyMDAxLAorCTB4MDExMSwgMHgyMDA0LCAweGQwOGMsIDB4MDE0MCwgMHg2ODkzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTEwLAorCTB4MjAwMywgMHgwMDA4LCAweDIwMDMsIDB4MDAwMCwgMHgwNDg5LCAweDAwMDUsIDB4MDAwMiwgMHg3ZmFhLAorCTB4ODJiYSwgMHg3ZmE3LCAweDdmYTcsIDB4N2ZhNywgMHg3ZmE3LCAweDdmYTcsIDB4N2ZhNywgMHg3ODE3LAorCTB4MDE0MCwgMHgwMDA1LCAweDcwMDAsIDB4OTA4YywgMHhmZjAwLCAweDkxOTQsIDB4ZjAwMCwgMHg4MTBmLAorCTB4OTQ4NCwgMHgwZmZmLCAweDY4OTIsIDB4OTI4NiwgMHgyMDAwLCAweDExNTAsIDB4NjgwMCwgMHg5MDg2LAorCTB4MDAwMSwgMHgxMTE4LCAweDA4MGMsIDB4NTdhNCwgMHgwMDcwLCAweDA4MGMsIDB4ODAwZCwgMHgwMDU4LAorCTB4OTI4NiwgMHgzMDAwLCAweDExMTgsIDB4MDgwYywgMHg4MWY0LCAweDAwMjgsIDB4OTI4NiwgMHg4MDAwLAorCTB4MTExMCwgMHgwODBjLCAweDgzZDksIDB4NzgxNywgMHgwMTQwLCAweDAwMDUsIDB4MjAwMSwgMHgxODEwLAorCTB4MjAwNCwgMHhkMDhjLCAweDAxNzgsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTE0OCwgMHgwMDI2LCAweDAwMzYsIDB4MjAxMSwgMHg4MDQ4LCAweDI1MTgsIDB4MDgwYywgMHg0YjUyLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDIwMCwgMHgyMDE5LCAweGZmZmUsIDB4N2MzMCwgMHgwMDUwLCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4N2Q0NCwgMHg3YzQwLCAweDIwMTksIDB4ZmZmZiwgMHgyMDAxLAorCTB4MTgxMCwgMHgyMDA0LCAweGQwOGMsIDB4MDE2MCwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwMywgMHgxMTMwLCAweDAwMjYsIDB4MjAxMSwgMHg4MDQ4LCAweDA4MGMsIDB4NGI1MiwgMHgwMDJlLAorCTB4MDBmZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHg3MDEwLAorCTB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA5NiwgMHgwMDAxLCAweDAxMjAsIDB4OTA5NiwgMHgwMDIzLAorCTB4MTkwNCwgMHg4MWM1LCAweDkxODYsIDB4MDAyMywgMHgxNWMwLCAweDA4MGMsIDB4ODQ3NywgMHgwOTA0LAorCTB4ODFjNSwgMHg2MTIwLCAweDkxODYsIDB4MDAwMSwgMHgwMTUwLCAweDkxODYsIDB4MDAwNCwgMHgwMTM4LAorCTB4OTE4NiwgMHgwMDA4LCAweDAxMjAsIDB4OTE4NiwgMHgwMDBhLCAweDE5MDQsIDB4ODFjNSwgMHg3MTI0LAorCTB4NjEwYSwgMHg3MDMwLCAweDkwOGUsIDB4MDIwMCwgMHgxMTMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLAorCTB4YWQ0ZCwgMHgwODA0LCAweDgxYzUsIDB4OTA4ZSwgMHgwMjE0LCAweDAxMTgsIDB4OTA4ZSwgMHgwMjEwLAorCTB4MTEzMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHhhZDRkLCAweDA4MDQsIDB4ODFjNSwgMHg5MDhlLAorCTB4MDEwMCwgMHgxOTA0LCAweDgxYzUsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4ODFjNSwgMHgyMDA5LAorCTB4MDAxNiwgMHgwODBjLCAweGFkNGQsIDB4MDgwNCwgMHg4MWM1LCAweDkxODYsIDB4MDAyMiwgMHgxOTA0LAorCTB4ODFjNSwgMHg3MDMwLCAweDkwOGUsIDB4MDMwMCwgMHgxNTgwLCAweDY4ZGMsIDB4ZDBhNCwgMHgwNTI4LAorCTB4YzBiNSwgMHg2OGRlLCAweDcxMDAsIDB4OTE4YywgMHgwMGZmLCAweDY5N2UsIDB4NzAwNCwgMHg2ODgyLAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzllNiwgMHg3OGVhLCAweDAwMDYsIDB4OTA4NCwgMHgwMGZmLAorCTB4MDAxNiwgMHgyMDA4LCAweDA4MGMsIDB4MjZhYSwgMHg3OTMyLCAweDc5MzYsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDBmZSwgMHgwODBjLCAweDI2NjEsIDB4Njk1ZSwgMHg3MDNjLCAweDAwZTYsIDB4MjA3MSwgMHgwMTQwLAorCTB4NzA4NiwgMHgyMDcxLCAweDE4MDAsIDB4NzBiNiwgMHgwMGVlLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LAorCTB4ODFjNSwgMHgyMDA5LCAweDAwMTcsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4MDQwMCwgMHgxMTkwLAorCTB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4ODFjNSwgMHgwODBjLCAweDc1M2QsIDB4MDEyMCwgMHgyMDA5LAorCTB4MDAxZCwgMHgwODA0LCAweDgxNzUsIDB4NjhkYywgMHhjMGE1LCAweDY4ZGUsIDB4MjAwOSwgMHgwMDMwLAorCTB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4MDUwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LAorCTB4ODFjNSwgMHgyMDA5LCAweDAwMTgsIDB4MDgwNCwgMHg4MTc1LCAweDkwOGUsIDB4MjAxMCwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDE5LCAweDA4MDQsIDB4ODE3NSwgMHg5MDhlLCAweDIxMTAsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAxYSwgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwgMHg1MjAwLCAweDExNDAsIDB4NzAzNCwgMHg5MDA1LAorCTB4MTkwNCwgMHg4MWM1LCAweDIwMDksIDB4MDAxYiwgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwgMHg1MDAwLAorCTB4MTE0MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwgMHg4MWM1LCAweDIwMDksIDB4MDAxYywgMHgwODA0LAorCTB4ODE3NSwgMHg5MDhlLCAweDEzMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMzQsIDB4MDgwNCwgMHg4MTc1LAorCTB4OTA4ZSwgMHgxMjAwLCAweDExNDAsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4ODFjNSwgMHgyMDA5LAorCTB4MDAyNCwgMHgwODA0LCAweDgxNzUsIDB4OTA4YywgMHhmZjAwLCAweDkxOGUsIDB4MjQwMCwgMHgxMTcwLAorCTB4MjAwOSwgMHgwMDJkLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwOWMsIDB4MDkwNCwgMHg4MTc1LAorCTB4MDgwYywgMHhkN2M5LCAweDE5MDQsIDB4ODFjNSwgMHgwODA0LCAweDgxNzMsIDB4OTA4YywgMHhmZjAwLAorCTB4OTE4ZSwgMHg1MzAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDJhLCAweDA4MDQsIDB4ODE3NSwgMHg5MDhlLAorCTB4MGYwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAyMCwgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwgMHg2MTA0LAorCTB4MTUzMCwgMHgyMDI5LCAweDAyMDUsIDB4MjAxMSwgMHgwMjZkLCAweDgyMDgsIDB4MjIwNCwgMHg5MDgyLAorCTB4MDAwNCwgMHg4MDA0LCAweDgwMDQsIDB4MjBhOCwgMHgyMDExLCAweDgwMTUsIDB4MjExYywgMHg4MTA4LAorCTB4MDA0NiwgMHgyMTI0LCAweDA4MGMsIDB4NGI1MiwgMHgwMDRlLCAweDgxMDgsIDB4MGYwNCwgMHg4MTI5LAorCTB4OTE4NiwgMHgwMjgwLCAweDFkODgsIDB4MjUwNCwgMHg4MDAwLCAweDIwMmEsIDB4MjAwOSwgMHgwMjYwLAorCTB4MGM1OCwgMHgyMDJiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDIzLCAweDA4MDQsIDB4ODE3NSwgMHg5MDhlLAorCTB4NjAwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAzZiwgMHgwODA0LCAweDgxNzUsIDB4OTA4ZSwgMHg1NDAwLAorCTB4MTEzOCwgMHgwODBjLCAweDg1NzUsIDB4MTkwNCwgMHg4MWM1LCAweDIwMDksIDB4MDA0NiwgMHgwNGE4LAorCTB4OTA4ZSwgMHg1NTAwLCAweDExNDgsIDB4MDgwYywgMHg4NTlkLCAweDExMTgsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDQ2MCwgMHgyMDA5LCAweDAwNDIsIDB4MDQ0OCwgMHg5MDhlLCAweDc4MDAsIDB4MTExOCwgMHgyMDA5LAorCTB4MDA0NSwgMHgwNDE4LCAweDkwOGUsIDB4MTAwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA0ZSwgMHgwMGU4LAorCTB4OTA4ZSwgMHg2MzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDRhLCAweDAwYjgsIDB4OTA4YywgMHhmZjAwLAorCTB4OTE4ZSwgMHg1NjAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDRmLCAweDAwNzgsIDB4OTA4YywgMHhmZjAwLAorCTB4OTE4ZSwgMHg1NzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDUwLCAweDAwMzgsIDB4MjAwOSwgMHgwMDFkLAorCTB4NjgzOCwgMHhkMGQ0LCAweDAxMTAsIDB4MjAwOSwgMHgwMDRjLCAweDAwMTYsIDB4MjAxMSwgMHgwMjYzLAorCTB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjYxLCAweDE5MDQsIDB4ODFjOCwgMHgwODBjLAorCTB4NjYzMiwgMHgxOTA0LCAweDgxYzgsIDB4YmUxMiwgMHhiZDE2LCAweDAwMWUsIDB4MDAxNiwgMHgwODBjLAorCTB4NzUzZCwgMHgwMWMwLCAweDY4ZGMsIDB4ZDA4YywgMHgxMTQ4LCAweDcwMDAsIDB4OTA4NCwgMHgwMGZmLAorCTB4MTE4OCwgMHg3MDA0LCAweDkwODQsIDB4ZmYwMCwgMHgxMTY4LCAweDAwNDAsIDB4Njg3YywgMHg5NjA2LAorCTB4MTE0OCwgMHg2ODgwLCAweDk1MDYsIDB4OTA4NCwgMHhmZjAwLCAweDExMjAsIDB4OTU4NCwgMHgwMGZmLAorCTB4Yjg4NiwgMHgwMDgwLCAweGI4ODQsIDB4OTAwNSwgMHgxMTY4LCAweDkxODYsIDB4MDA0NiwgMHgxMTUwLAorCTB4Njg3YywgMHg5NjA2LCAweDExMzgsIDB4Njg4MCwgMHg5NTA2LCAweDkwODQsIDB4ZmYwMCwgMHgxMTEwLAorCTB4MDAxZSwgMHgwMDk4LCAweDA4MGMsIDB4YWM1YSwgMHgwMWE4LCAweDJiMDgsIDB4NjExMiwgMHg2MDIzLAorCTB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHg5MTg2LCAweDAwNGMsIDB4MTExMCwgMHg2MDIzLAorCTB4MDAwYSwgMHgwMDE2LCAweDAwMWUsIDB4MDgwYywgMHhhZDRkLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDAxZSwgMHgwY2Q4LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwZWMsIDB4MDEyMCwgMHgyMDExLAorCTB4ODA0OSwgMHgwODBjLCAweDRiNTIsIDB4MDgwYywgMHhhZDIwLCAweDBkOTAsIDB4MmIwOCwgMHg2MTEyLAorCTB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDAwMTYsIDB4OTE4NiwgMHgwMDE3LAorCTB4MDExOCwgMHg5MTg2LCAweDAwMzAsIDB4MTEyOCwgMHg2MDA3LCAweDAwMDksIDB4NjAxNywgMHgyOTAwLAorCTB4MDAyMCwgMHg2MDA3LCAweDAwNTEsIDB4NjAxNywgMHgwMDAwLCAweDYwMmYsIDB4MDAwOSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDhhMCwgMHgwODBjLCAweDg1ZTQsIDB4MTE1OCwgMHgwODBjLAorCTB4MzM3NywgMHgxMTQwLCAweDcwMTAsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4ZSwgMHgwMDA4LAorCTB4MTEwOCwgMHgwMDA5LCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwNDYsIDB4NzAwMCwgMHg5MDhjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzMywgMHgxMWU4LCAweDA4MGMsIDB4ODQ3NywgMHgwOTA0LAorCTB4ODI1MiwgMHg3MTI0LCAweDYxMGEsIDB4NzAzMCwgMHg5MDhlLCAweDAyMDAsIDB4MTE0MCwgMHg3MDM0LAorCTB4OTAwNSwgMHgxNWMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweGFkNGQsIDB4MDQ5OCwgMHg5MDhlLAorCTB4MDEwMCwgMHgxNTgwLCAweDcwMzQsIDB4OTAwNSwgMHgxNTY4LCAweDIwMDksIDB4MDAxNiwgMHgwODBjLAorCTB4YWQ0ZCwgMHgwNDQwLCAweDkxODYsIDB4MDAzMiwgMHgxNTI4LCAweDcwMzAsIDB4OTA4ZSwgMHgxNDAwLAorCTB4MTUwOCwgMHgyMDA5LCAweDAwMzgsIDB4MDAxNiwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwgMHg4MjExLAorCTB4MjIwYywgMHgwODBjLCAweDI2NjEsIDB4MTFhOCwgMHgwODBjLCAweDY2MzIsIDB4MTE5MCwgMHhiZTEyLAorCTB4YmQxNiwgMHgwODBjLCAweGFjNWEsIDB4MDE2OCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjZTE1LAorCTB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDEwLAorCTB4MDBjZSwgMHgwMDFlLCAweDAwNGUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDQ2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDIwMjgsIDB4MjEzMCwgMHg5Njk2LCAweDAwZmYsIDB4MTFiOCwgMHg5NTkyLAorCTB4ZmZmYywgMHgwMmEwLCAweDk1OTYsIDB4ZmZmZCwgMHgxMTIwLCAweDIwMDksIDB4MDA3ZiwgMHgwODA0LAorCTB4ODJiNCwgMHg5NTk2LCAweGZmZmUsIDB4MTEyMCwgMHgyMDA5LCAweDAwN2UsIDB4MDgwNCwgMHg4MmI0LAorCTB4OTU5NiwgMHhmZmZjLCAweDExMTgsIDB4MjAwOSwgMHgwMDgwLCAweDA0ZjAsIDB4MjAxMSwgMHgwMDAwLAorCTB4MjAxOSwgMHgxODM3LCAweDIzMWMsIDB4ZDNhYywgMHgwMTMwLCAweDkwMjYsIDB4MjBhOSwgMHgwODAwLAorCTB4MjA3MSwgMHgxMDAwLCAweDAwMzAsIDB4MjAyMSwgMHgwMDgxLCAweDIwYTksIDB4MDc3ZiwgMHgyMDcxLAorCTB4MTA4MSwgMHgyZTFjLCAweDkzZGQsIDB4MDAwMCwgMHgxMTQwLCAweDgyZmYsIDB4MTFkMCwgMHg5NDk2LAorCTB4MDBmZiwgMHgwMWI4LCAweDI0MTAsIDB4YzJmZCwgMHgwMGEwLCAweGJmMTAsIDB4MjYwMCwgMHg5NzA2LAorCTB4YjgxNCwgMHgxMTIwLCAweDk1NDYsIDB4MTExMCwgMHgyNDA4LCAweDAwYjAsIDB4OTc0NSwgMHgxMTQ4LAorCTB4OTRjNiwgMHgwMDdlLCAweDAxMzAsIDB4OTRjNiwgMHgwMDdmLCAweDAxMTgsIDB4OTRjNiwgMHgwMDgwLAorCTB4MWQyMCwgMHg4NDIwLCAweDhlNzAsIDB4MWYwNCwgMHg4Mjg5LCAweDgyZmYsIDB4MTExOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDE4LCAweGMyZmMsIDB4MjIwOCwgMHg5MDA2LCAweDAwZGUsIDB4MDBlZSwgMHgwMDRlLAorCTB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLCAweDkxODQsIDB4MDA4MCwgMHgwMTEwLAorCTB4ZDE4YywgMHgwMTM4LCAweDcwMDAsIDB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NCwgMHgwMDBmLAorCTB4MDAxYSwgMHg3ODE3LCAweDAxNDAsIDB4MDAwNSwgMHg4MmRjLCAweDgyZGMsIDB4ODJkYywgMHg4NDg5LAorCTB4ODJkYywgMHg4MmRmLCAweDgzMDQsIDB4ODM4ZCwgMHg4MmRjLCAweDgyZGMsIDB4ODJkYywgMHg4MmRjLAorCTB4ODJkYywgMHg4MmRjLCAweDgyZGMsIDB4ODJkYywgMHg3ODE3LCAweDAxNDAsIDB4MDAwNSwgMHgwMGI2LAorCTB4NzExMCwgMHhkMWJjLCAweDAxZTgsIDB4NzEyMCwgMHgyMTYwLCAweDljOGMsIDB4MDAwMywgMHgxMWMwLAorCTB4OWM4YSwgMHgxZGRjLCAweDAyYTgsIDB4Njg2OCwgMHg5YzAyLCAweDEyOTAsIDB4NzAwOCwgMHg5MDg0LAorCTB4MDBmZiwgMHg2MTEwLCAweDIxNTgsIDB4YjkxMCwgMHg5MTA2LCAweDExNTAsIDB4NzAwYywgMHhiOTE0LAorCTB4OTEwNiwgMHgxMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwNDYsIDB4MDgwYywgMHhhZDRkLAorCTB4NzgxNywgMHgwMTQwLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4OTQ4NCwgMHgwZmZmLAorCTB4MDkwNCwgMHg4MzY5LCAweDcxMTAsIDB4ZDFiYywgMHgxOTA0LCAweDgzNjksIDB4NzEwOCwgMHg3MDBjLAorCTB4MjAyOCwgMHg5MThjLCAweDAwZmYsIDB4MjEzMCwgMHg5MDk0LCAweGZmMDAsIDB4MTVjOCwgMHg4MWZmLAorCTB4MTViOCwgMHg5MDgwLCAweDMzYjksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMDAxLAorCTB4MDA4MCwgMHg5MTA2LCAweDA5MDQsIDB4ODM2OSwgMHg5MTgyLCAweDA4MDEsIDB4MWEwNCwgMHg4MzY5LAorCTB4OTE5MCwgMHgxMDAwLCAweDIyMDQsIDB4OTA1ZCwgMHgwNWUwLCAweGJlMTIsIDB4YmQxNiwgMHhiODAwLAorCTB4ZDBlYywgMHgxNWI4LCAweGJhMDQsIDB4OTI5NCwgMHhmZjAwLCAweDkyODYsIDB4MDYwMCwgMHgxMTkwLAorCTB4MDgwYywgMHhhYzVhLCAweDA1OTgsIDB4MmIwOCwgMHg3MDI4LCAweDYwNGUsIDB4NzAyYywgMHg2MDUyLAorCTB4NjExMiwgMHg2MDIzLCAweDAwMDYsIDB4NzEyMCwgMHg2MTBhLCAweDcxMzAsIDB4NjE1ZSwgMHgwODBjLAorCTB4ZGEzMiwgMHgwMGY4LCAweDA4MGMsIDB4NmFkZCwgMHgxMTM4LCAweGI4MDcsIDB4MDYwNiwgMHgwYzQwLAorCTB4MTkwYywgMHg4MjU2LCAweDExYjAsIDB4MDg4MCwgMHgwODBjLCAweGFjNWEsIDB4MmIwOCwgMHgwMTg4LAorCTB4NjExMiwgMHg2MDIzLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDkyODYsIDB4MDQwMCwgMHgxMTE4LAorCTB4NjAwNywgMHgwMDA1LCAweDAwMTAsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4OTJiNywgMHg3ODE3LCAweDAxNDAsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwMSwgMHgxODBlLAorCTB4MjAwNCwgMHhkMGVjLCAweDAxMjAsIDB4MjAxMSwgMHg4MDQ5LCAweDA4MGMsIDB4NGI1MiwgMHgwODBjLAorCTB4YWQyMCwgMHgwZDc4LCAweDJiMDgsIDB4NjExMiwgMHg2MDIzLCAweDAwMDYsIDB4NzEyMCwgMHg2MTBhLAorCTB4NzEzMCwgMHg2MTVlLCAweDYwMTcsIDB4ZjMwMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDQxLAorCTB4MjAwOSwgMHhhMDIyLCAweDA4MGMsIDB4OTJiMCwgMHgwOGUwLCAweDAwYjYsIDB4NzExMCwgMHhkMWJjLAorCTB4MDVkMCwgMHg3MDIwLCAweDIwNjAsIDB4OWM4NCwgMHgwMDAzLCAweDE1YTgsIDB4OWM4MiwgMHgxZGRjLAorCTB4MDY5MCwgMHg2ODY4LCAweDljMDIsIDB4MTY3OCwgMHg5NDg0LCAweDBmZmYsIDB4OTA4MiwgMHgwMDBjLAorCTB4MDY1MCwgMHg3MDA4LCAweDkwODQsIDB4MDBmZiwgMHg2MTEwLCAweDIxNTgsIDB4YjkxMCwgMHg5MTA2LAorCTB4MTUxMCwgMHg3MDBjLCAweGI5MTQsIDB4OTEwNiwgMHgxMWYwLCAweDcxMjQsIDB4NjEwYSwgMHg2MDFjLAorCTB4ZDBmYywgMHgxMWM4LCAweDIwMDEsIDB4MDI3MSwgMHgyMDA0LCAweDkwMDUsIDB4MTE4MCwgMHg5NDg0LAorCTB4MGZmZiwgMHg5MDgyLCAweDAwMGMsIDB4MDE1OCwgMHgwMDY2LCAweDIwMzEsIDB4MDEwMCwgMHhhMDAxLAorCTB4YTAwMSwgMHg4NjMxLCAweDFkZTAsIDB4MDA2ZSwgMHg2MDFjLCAweGQwZmMsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDA0NSwgMHgwODBjLCAweGFkNGQsIDB4NzgxNywgMHgwMTQwLCAweDAwYmUsIDB4MDAwNSwgMHg2MTIwLAorCTB4OTE4NiwgMHgwMDAyLCAweDAxMjgsIDB4OTE4NiwgMHgwMDA1LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwODBjLCAweDg1ZTQsIDB4MTE4MCwgMHgwODBjLCAweDMzNzcsIDB4MTE2OCwgMHg3MDEwLAorCTB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4NiwgMHgwMDAwLCAweDExMzAsIDB4OTE4NCwgMHgwMDBmLAorCTB4OTA4YSwgMHgwMDA2LCAweDEyMDgsIDB4MDAwYiwgMHgwMDA1LCAweDgzZjMsIDB4ODNmNCwgMHg4M2YzLAorCTB4ODNmMywgMHg4NDU5LCAweDg0NjgsIDB4MDAwNSwgMHgwMGI2LCAweDcwMGMsIDB4NzEwOCwgMHgwODBjLAorCTB4MjY2MSwgMHgxOTA0LCAweDg0NTcsIDB4MDgwYywgMHg2NjMyLCAweDE5MDQsIDB4ODQ1NywgMHhiZTEyLAorCTB4YmQxNiwgMHg3MTEwLCAweGQxYmMsIDB4MDU0MCwgMHg3MDJjLCAweGQwODQsIDB4MTEyMCwgMHhiODAwLAorCTB4ZDBiYywgMHgxOTA0LCAweDg0NTcsIDB4MDgwYywgMHg2YWRkLCAweDAxNDgsIDB4OTA4NiwgMHgwMDA0LAorCTB4MDEzMCwgMHgwODBjLCAweDZhZTUsIDB4MDExOCwgMHg5MDg2LCAweDAwMDQsIDB4MTU4OCwgMHgwMGM2LAorCTB4MDgwYywgMHg4NDc3LCAweDAwY2UsIDB4MDVkOCwgMHgwODBjLCAweGFjNWEsIDB4MmIwOCwgMHgwNWI4LAorCTB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywgMHgwMDAyLCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LAorCTB4MDA4OCwgMHgwODBjLCAweGFkNGQsIDB4MDQ1OCwgMHgwODBjLCAweDZhZGQsIDB4MDE0OCwgMHg5MDg2LAorCTB4MDAwNCwgMHgwMTMwLCAweDA4MGMsIDB4NmFlNSwgMHgwMTE4LCAweDkwODYsIDB4MDAwNCwgMHgxMTgwLAorCTB4MDgwYywgMHhhYzVhLCAweDJiMDgsIDB4MDFkOCwgMHg2MTEyLCAweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLAorCTB4MDAwNSwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDg4LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDc4LAorCTB4MDgwYywgMHhhYzVhLCAweDJiMDgsIDB4MDE1OCwgMHg2MTEyLCAweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLAorCTB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMGJlLAorCTB4MDAwNSwgMHg3MTEwLCAweGQxYmMsIDB4MDE1OCwgMHgwMGQxLCAweDAxNDgsIDB4MDgwYywgMHg4M2NmLAorCTB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDg5LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LAorCTB4NzExMCwgMHhkMWJjLCAweDAxNTgsIDB4MDA1OSwgMHgwMTQ4LCAweDA4MGMsIDB4ODNjZiwgMHgxMTMwLAorCTB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA4YSwgMHgwODBjLCAweGFkNGQsIDB4MDAwNSwgMHg3MDIwLAorCTB4MjA2MCwgMHg5Yzg0LCAweDAwMDMsIDB4MTE1OCwgMHg5YzgyLCAweDFkZGMsIDB4MDI0MCwgMHgyMDAxLAorCTB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MTIxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHg5MDA2LAorCTB4MGNlOCwgMHgwMGI2LCAweDcxMTAsIDB4ZDFiYywgMHgxMWQ4LCAweDcwMjQsIDB4MjA2MCwgMHg5Yzg0LAorCTB4MDAwMywgMHgxMWIwLCAweDljODIsIDB4MWRkYywgMHgwMjk4LCAweDY4NjgsIDB4OWMwMiwgMHgxMjgwLAorCTB4NzAwOCwgMHg5MDg0LCAweDAwZmYsIDB4NjExMCwgMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwgMHgxMTQwLAorCTB4NzAwYywgMHhiOTE0LCAweDkxMDYsIDB4MTEyMCwgMHgyMDA5LCAweDAwNTEsIDB4MDgwYywgMHhhZDRkLAorCTB4NzgxNywgMHgwMTQwLCAweDAwYmUsIDB4MDAwNSwgMHgyMDMxLCAweDAxMDUsIDB4MDA2OSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMjA2LCAweDAwNDksIDB4MDAwNSwgMHgyMDMxLCAweDAyMDcsIDB4MDAyOSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMjEzLCAweDAwMDksIDB4MDAwNSwgMHgwMGM2LCAweDAwOTYsIDB4MDBmNiwgMHg3MDAwLAorCTB4OTA4NCwgMHhmMDAwLCAweDkwODYsIDB4YzAwMCwgMHgwNWMwLCAweDA4MGMsIDB4YWM1YSwgMHgwNWE4LAorCTB4MDA2NiwgMHgwMGM2LCAweDAwNDYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLAorCTB4MDgwYywgMHgyNjYxLCAweDE1OTAsIDB4MDgwYywgMHg2NjMyLCAweDE1NzgsIDB4YmUxMiwgMHhiZDE2LAorCTB4MmIwMCwgMHgwMDRlLCAweDAwY2UsIDB4NjAxMiwgMHgwODBjLCAweGNlMTUsIDB4MDgwYywgMHgxMDQ3LAorCTB4MDUwMCwgMHgyOTAwLCAweDYwNjIsIDB4OTAwNiwgMHhhODAyLCAweGE4NjYsIDB4YWM2YSwgMHhhODVjLAorCTB4OTBmOCwgMHgwMDFiLCAweDIwYTksIDB4MDAwZSwgMHhhODYwLCAweDIwZTgsIDB4MjBlMSwgMHgwMDAwLAorCTB4MmZhMCwgMHgyZTk4LCAweDQwMDMsIDB4MDA2ZSwgMHg2NjE2LCAweDYwMDcsIDB4MDAzZSwgMHg2MDIzLAorCTB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDAwZmUsIDB4MDA5ZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwODBjLCAweGFjYjAsIDB4MDA2ZSwgMHgwY2MwLCAweDAwNGUsIDB4MDBjZSwgMHgwY2M4LAorCTB4MDBjNiwgMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwgMHg5MTg0LCAweGYwMDAsIDB4ODEwZiwgMHg5MDg2LAorCTB4MjAwMCwgMHgxOTA0LCAweDg1NWYsIDB4OTE4NiwgMHgwMDIyLCAweDE1ZjAsIDB4MjAwMSwgMHgwMTExLAorCTB4MjAwNCwgMHg5MDA1LCAweDE5MDQsIDB4ODU2MSwgMHg3MDMwLCAweDkwOGUsIDB4MDQwMCwgMHgwOTA0LAorCTB4ODU2MSwgMHg5MDhlLCAweDYwMDAsIDB4MDVlOCwgMHg5MDhlLCAweDU0MDAsIDB4MDVkMCwgMHg5MDhlLAorCTB4MDMwMCwgMHgxMWQ4LCAweDIwMDksIDB4MTgzNywgMHgyMTBjLCAweGQxOGMsIDB4MTU5MCwgMHhkMWE0LAorCTB4MTU4MCwgMHgwODBjLCAweDZhOWIsIDB4MDU4OCwgMHg2OGIwLCAweDkwODQsIDB4MDBmZiwgMHg3MTAwLAorCTB4OTE4YywgMHgwMGZmLCAweDkxMDYsIDB4MTUxOCwgMHg2ODgwLCAweDY5YjAsIDB4OTE4YywgMHhmZjAwLAorCTB4OTEwNSwgMHg3MTA0LCAweDkxMDYsIDB4MTFkOCwgMHgwMGUwLCAweDIwMDksIDB4MDEwMywgMHgyMTBjLAorCTB4ZDFiNCwgMHgxMWE4LCAweDkwOGUsIDB4NTIwMCwgMHgwOWU4LCAweDkwOGUsIDB4MDUwMCwgMHgwOWQwLAorCTB4OTA4ZSwgMHg1MDAwLCAweDA5YjgsIDB4MDA1OCwgMHg5MTg2LCAweDAwMjMsIDB4MTE0MCwgMHgwODBjLAorCTB4ODQ3NywgMHgwMTI4LCAweDYwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDAxMTgsIDB4MDAwMCwgMHg5MDA2LAorCTB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMDA1LCAweDcwMzAsIDB4OTA4ZSwgMHgwMzAwLAorCTB4MDExOCwgMHg5MDhlLCAweDUyMDAsIDB4MWQ5OCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAwOSwgMHg5MDg2LCAweDAwMDgsIDB4MGQ2OCwgMHgwYzUwLCAweDAxNTYsIDB4MDA0NiwgMHgwMDE2LAorCTB4MDAzNiwgMHg3MDM4LCAweDIwMjAsIDB4ODQyNywgMHg5NGE0LCAweDAwMDcsIDB4ZDQ4NCwgMHgwMTQ4LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwgMHgyMDExLCAweDAyN2EsIDB4MDgwYywgMHhiYzhlLAorCTB4MTE3OCwgMHhkNDhjLCAweDAxNDgsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwMSwgMHgyMDExLAorCTB4MDI3ZSwgMHgwODBjLCAweGJjOGUsIDB4MTEyMCwgMHhkNDk0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAzZSwgMHgwMDFlLCAweDAwNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDA0NiwgMHgwMDE2LAorCTB4MDAzNiwgMHg3MDM4LCAweDIwMjAsIDB4ODQyNywgMHg5NGE0LCAweDAwMDcsIDB4ZDQ4NCwgMHgwMTQ4LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwgMHgyMDExLCAweDAyNzIsIDB4MDgwYywgMHhiYzhlLAorCTB4MTE3OCwgMHhkNDhjLCAweDAxNDgsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwMSwgMHgyMDExLAorCTB4MDI3NiwgMHgwODBjLCAweGJjOGUsIDB4MTEyMCwgMHhkNDk0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAzZSwgMHgwMDFlLCAweDAwNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLAorCTB4NzgwMCwgMHhjMGU1LCAweGMwY2MsIDB4NzgwMiwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MTgwMCwgMHg3ODM0LCAweGQwODQsIDB4MTEzMCwgMHgyMDc5LCAweDAyMDAsIDB4NzgwMCwgMHg5MDg1LAorCTB4MTIwMCwgMHg3ODAyLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHg3MDM0LAorCTB4YzA4NCwgMHg3MDM2LCAweDAwZWUsIDB4MDAwNSwgMHgwMDE2LCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLAorCTB4OTE4NCwgMHgwMDgwLCAweDAxMTgsIDB4ZDE4YywgMHgwMTE4LCAweDkwMDYsIDB4MDAxZSwgMHgwMDA1LAorCTB4OTA4NSwgMHgwMDAxLCAweDBjZDgsIDB4MjA3MSwgMHgxYTAyLCAweDcwMDMsIDB4MDAwMywgMHg3MDBmLAorCTB4MDM2MSwgMHg5MDA2LCAweDcwMWEsIDB4NzA3MiwgMHg3MDEyLCAweDcwMTcsIDB4MWRkYywgMHg3MDA3LAorCTB4MDAwMCwgMHg3MDI2LCAweDcwMmIsIDB4OWVmNCwgMHg3MDMyLCAweDcwMzcsIDB4OWY3MSwgMHg3MDNmLAorCTB4ZmZmZiwgMHg3MDQyLCAweDcwNDcsIDB4NTVjMiwgMHg3MDRhLCAweDcwNWIsIDB4ODc5YiwgMHgwODBjLAorCTB4MTA2MCwgMHgwOTBjLCAweDBkN2QsIDB4MjkwMCwgMHg3MDNhLCAweGE4NjcsIDB4MDAwMywgMHhhODZmLAorCTB4MDEwMCwgMHhhOGFiLCAweGRjYjAsIDB4MDAwNSwgMHgyMDcxLCAweDFhMDIsIDB4MWQwNCwgMHg4NmI3LAorCTB4MjA5MSwgMHg2MDAwLCAweDcwMGMsIDB4ODAwMSwgMHg3MDBlLCAweDE1OTAsIDB4MjAwMSwgMHgwMTNjLAorCTB4MjAwNCwgMHg5MDA1LCAweDE5MGMsIDB4ODg0NSwgMHgyMDAxLCAweDE4NjksIDB4MjAwNCwgMHhkMGM0LAorCTB4MDE1OCwgMHgzYTAwLCAweGQwOGMsIDB4MTE0MCwgMHgyMGQxLCAweDAwMDAsIDB4MjBkMSwgMHgwMDAxLAorCTB4MjBkMSwgMHgwMDAwLCAweDA4MGMsIDB4MGQ3ZCwgMHg3MDBmLCAweDAzNjEsIDB4NzAwNywgMHgwMDAxLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgxODAwLCAweDY5ZWMsIDB4ZDFlNCwgMHgxMTM4LAorCTB4ZDFkYywgMHgxMTE4LCAweDA4MGMsIDB4ODgwOSwgMHgwMDEwLCAweDA4MGMsIDB4ODdlMCwgMHg3MDQwLAorCTB4OTAwZCwgMHgwMTQ4LCAweDgxMDksIDB4NzE0MiwgMHgxMTMwLCAweDcwNDQsIDB4MDgwZiwgMHgwMDE4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAyNCwgMHg5MDBkLCAweDAxODgsIDB4NzAyMCwgMHg4MDAxLAorCTB4NzAyMiwgMHgxMTY4LCAweDcwMjMsIDB4MDAwOSwgMHg4MTA5LCAweDcxMjYsIDB4OTE4NiwgMHgwM2U4LAorCTB4MTExMCwgMHg3MDI4LCAweDA4MGYsIDB4ODFmZiwgMHgxMTEwLCAweDcwMjgsIDB4MDgwZiwgMHg3MDMwLAorCTB4OTAwZCwgMHgwMTgwLCAweDcwMmMsIDB4ODAwMSwgMHg3MDJlLCAweDExNjAsIDB4NzAyZiwgMHgwMDA5LAorCTB4ODEwOSwgMHg3MTMyLCAweDAxMjgsIDB4OTE4NCwgMHgwMDdmLCAweDA5MGMsIDB4YTAwZCwgMHgwMDEwLAorCTB4NzAzNCwgMHgwODBmLCAweDcwM2MsIDB4OTAwNSwgMHgwMTE4LCAweDAzMTAsIDB4ODAwMSwgMHg3MDNlLAorCTB4NzA0YywgMHg5MDBkLCAweDAxNjgsIDB4NzA0OCwgMHg4MDAxLCAweDcwNGEsIDB4MTE0OCwgMHg3MDRiLAorCTB4MDAwOSwgMHg4MTA5LCAweDcxNGUsIDB4MTEyMCwgMHg3MTUwLCAweDcxNGUsIDB4NzA1OCwgMHgwODBmLAorCTB4NzAxOCwgMHg5MDBkLCAweDAxZDgsIDB4MDAxNiwgMHg3MDcwLCAweDkwMGQsIDB4MDE1OCwgMHg3MDZjLAorCTB4ODAwMSwgMHg3MDZlLCAweDExMzgsIDB4NzA2ZiwgMHgwMDA5LCAweDgxMDksIDB4NzE3MiwgMHgxMTEwLAorCTB4NzA3NCwgMHgwODBmLCAweDAwMWUsIDB4NzAwOCwgMHg4MDAxLCAweDcwMGEsIDB4MTEzOCwgMHg3MDBiLAorCTB4MDAwOSwgMHg4MTA5LCAweDcxMWEsIDB4MTExMCwgMHg3MDFjLCAweDA4MGYsIDB4MDEyZSwgMHg3MDA0LAorCTB4MDAwMiwgMHg4NmRmLCAweDg2ZTAsIDB4ODcwYSwgMHgwMGU2LCAweDIwNzEsIDB4MWEwMiwgMHg3MDE4LAorCTB4OTAwNSwgMHgxMTIwLCAweDcxMWEsIDB4NzIxZSwgMHg3MDBiLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMDA2LCAweDIwNzEsIDB4MWEwMiwgMHg3MDFjLCAweDkyMDYsIDB4MTEyMCwgMHg3MDFhLAorCTB4NzAxZSwgMHg3MDcyLCAweDcwNzYsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MWEwMiwgMHhiODg4LCAweDkxMDIsIDB4MDIwOCwgMHhiOThhLCAweDAwZWUsIDB4MDAwNSwgMHgwMDA1LAorCTB4MDBiNiwgMHgyMDMxLCAweDAwMTAsIDB4NzExMCwgMHgwODBjLCAweDY2OTMsIDB4MTFhOCwgMHhiODg4LAorCTB4ODAwMSwgMHgwMjkwLCAweGI4OGEsIDB4MTE4MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDY2LAorCTB4YjhkMCwgMHg5MDA1LCAweDAxMzgsIDB4MDAyNiwgMHhiYTNjLCAweDAwMTYsIDB4MDgwYywgMHg2N2JlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwNmUsIDB4MDEyZSwgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgxMjIwLAorCTB4ODYzMSwgMHgwMTI4LCAweDcxMTIsIDB4MGMwMCwgMHg5MDBlLCAweDcwMDcsIDB4MDAwMiwgMHg3MTEyLAorCTB4MDBiZSwgMHgwMDA1LCAweDIwMzEsIDB4MDAxMCwgMHg3MDE0LCAweDIwNjAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MDQ4LCAweDkwMDUsIDB4MDEyOCwgMHg4MDAxLCAweDYwNGEsIDB4MTExMCwgMHgwODBjLAorCTB4Y2M5NiwgMHg2MDE4LCAweDkwMDUsIDB4MDkwNCwgMHg4NzYyLCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLAorCTB4NzkxOCwgMHhkMWI0LCAweDE5MDQsIDB4ODc3NSwgMHg3ODFiLCAweDIwMjAsIDB4YTAwMSwgMHg3OTE4LAorCTB4ZDFiNCwgMHgwMTIwLCAweDc4MWIsIDB4MjAwMCwgMHgwODA0LCAweDg3NzUsIDB4ODAwMSwgMHg2MDFhLAorCTB4MDEwNiwgMHg3ODFiLCAweDIwMDAsIDB4YTAwMSwgMHg3OTE4LCAweGQxYWMsIDB4MWRkMCwgMHgwMTBlLAorCTB4MDBmZSwgMHgxNTQwLCAweDYxMjAsIDB4OTE4NiwgMHgwMDAzLCAweDAxNDgsIDB4OTE4NiwgMHgwMDA2LAorCTB4MDEzMCwgMHg5MTg2LCAweDAwMDksIDB4MTFlMCwgMHg2MTFjLCAweGQxYzQsIDB4MTEwMCwgMHgwODBjLAorCTB4Yzk3YSwgMHgwMWIwLCAweDYwMTQsIDB4MjA0OCwgMHhhODg0LCAweDkwOGEsIDB4MTk5YSwgMHgwMjgwLAorCTB4OTA4MiwgMHgxOTk5LCAweGE4ODYsIDB4OTA4YSwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LAorCTB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwgMHg2MTFhLCAweDA4MGMsIDB4ZDBjNywgMHgwMTEwLAorCTB4MDgwYywgMHhjNjViLCAweDAxMmUsIDB4OWM4OCwgMHgwMDFjLCAweDcxMTYsIDB4MjAwMSwgMHgxODFhLAorCTB4MjAwNCwgMHg5MTAyLCAweDEyMjgsIDB4ODYzMSwgMHgwMTM4LCAweDIxNjAsIDB4MDgwNCwgMHg4NzBlLAorCTB4NzAxNywgMHgxZGRjLCAweDcwMDcsIDB4MDAwMCwgMHgwMDA1LCAweDAwZmUsIDB4MGM1OCwgMHgwMGU2LAorCTB4MjA3MSwgMHgxYTAyLCAweDcwMjcsIDB4MDdkMCwgMHg3MDIzLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxYTBiLCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxYTAyLAorCTB4NzEzMiwgMHg3MDJmLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDIwMTEsIDB4MWEwZSwgMHgyMDEzLAorCTB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxYTAyLCAweDcxMWEsIDB4NzIxZSwgMHg3MDBiLAorCTB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDA4NiwgMHgwMDI2LCAweDcwNTQsIDB4ODAwMCwgMHg3MDU2LAorCTB4MjAwMSwgMHgxYTEwLCAweDIwNDQsIDB4YTA2YywgMHg5MDg2LCAweDAwMDAsIDB4MDE1MCwgMHg3MDY4LAorCTB4YTA5YSwgMHg3MDY0LCAweGEwOTYsIDB4NzA2MCwgMHhhMDkyLCAweDcwNWMsIDB4YTA4ZSwgMHgwODBjLAorCTB4MTEzYywgMHgwMDJlLCAweDAwOGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDA5NiwgMHgwMGE2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAxNTYsIDB4MDgwYywgMHg4NjFjLAorCTB4MDE1ZSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDFhMDIsIDB4NzE3MiwgMHg3Mjc2LAorCTB4NzA2ZiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHgxYTAyLAorCTB4NzA3NCwgMHg5MjA2LCAweDExMTAsIDB4NzA3MiwgMHg3MDc2LCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjA2OSwgMHgxODAwLCAweDY5ZWMsIDB4ZDFlNCwgMHgxNTE4LCAweDAwMjYsIDB4ZDFlYywgMHgwMTQwLAorCTB4NmE1NCwgMHg2ODc0LCAweDkyMDIsIDB4MDI4OCwgMHg4MTE3LCAweDkyOTQsIDB4MDBjMSwgMHgwMDg4LAorCTB4OTE4NCwgMHgwMDA3LCAweDAxYTAsIDB4ODEwOSwgMHg5MTg0LCAweDAwMDcsIDB4MDExMCwgMHg2OWVlLAorCTB4MDA3MCwgMHg4MTA3LCAweDkwODQsIDB4MDAwNywgMHg5MTBkLCAweDgxMDcsIDB4OTEwNiwgMHg5MDk0LAorCTB4MDBjMSwgMHg5MTg0LCAweGZmM2UsIDB4OTIwNSwgMHg2OGVlLCAweDA4MGMsIDB4MGYxMiwgMHgwMDJlLAorCTB4MDAwNSwgMHg2OWU4LCAweDkxODQsIDB4MDAzZiwgMHgwNWI4LCAweDgxMDksIDB4OTE4NCwgMHgwMDNmLAorCTB4MDFhOCwgMHg2YTU0LCAweDY4NzQsIDB4OTIwMiwgMHgwMjIwLCAweGQxYmMsIDB4MDE2OCwgMHhjMWJjLAorCTB4MDAxOCwgMHhkMWJjLCAweDExNDgsIDB4YzFiZCwgMHgyMTEwLCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHgwZjM0LCAweDAwZWUsIDB4MDQwMCwgMHg2OWVhLCAweDAwZjAsIDB4MDAyNiwgMHg4MTA3LAorCTB4OTA5NCwgMHgwMDA3LCAweDAxMjgsIDB4ODAwMSwgMHg4MDA3LCAweDkwODUsIDB4MDAwNywgMHgwMDUwLAorCTB4MjAxMCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg5MDg0LCAweDAwMDcsIDB4OTIwNSwgMHg4MDA3LAorCTB4OTA4NSwgMHgwMDI4LCAweDkwODYsIDB4MDA0MCwgMHgyMDEwLCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHgwZjM0LCAweDAwZWUsIDB4MDAyZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwgMHgyMDA5LAorCTB4ZmZmNCwgMHgyMTBkLCAweDIwNjEsIDB4MDEwMCwgMHg2MGYwLCAweDkxMDAsIDB4NjBmMywgMHgwMDAwLAorCTB4MjAwOSwgMHhmZmY0LCAweDIwMGYsIDB4MTIyMCwgMHg4MTA4LCAweDIxMDUsIDB4ODAwMCwgMHgyMDBmLAorCTB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDFhNmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4OTE4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDkwODAsIDB4MWE2ZSwgMHgyMDYwLAorCTB4MDAwNSwgMHhhODg0LCAweDkwOGEsIDB4MTk5YSwgMHgxNjM4LCAweDkwMDUsIDB4MTE1MCwgMHgwMGM2LAorCTB4MjA2MSwgMHgxYTZlLCAweDYwMTQsIDB4MDBjZSwgMHg5MDA1LCAweDExMzAsIDB4MjAwMSwgMHgwMDFlLAorCTB4MDAxOCwgMHg5MDhlLCAweGZmZmYsIDB4MDFiMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LAorCTB4NjExYSwgMHhhODdjLCAweDkwOGMsIDB4MDBjMCwgMHg5MThlLCAweDAwYzAsIDB4MDkwNCwgMHg4OTIzLAorCTB4ZDBiNCwgMHgxMTY4LCAweGQwYmMsIDB4MTkwNCwgMHg4OGZjLCAweDIwMDksIDB4MDAwNiwgMHgwODBjLAorCTB4ODk1MCwgMHgwMDA1LCAweDkwMGUsIDB4MGM2MCwgMHgyMDAxLCAweDE5OTksIDB4MDhiMCwgMHhkMGZjLAorCTB4MDVlMCwgMHg5MDhjLCAweDIwMjMsIDB4MTU2OCwgMHg4N2ZmLCAweDE1NTgsIDB4YTlhOCwgMHg4MWZmLAorCTB4MTU0MCwgMHg2MTI0LCAweDkxOGMsIDB4MDUwMCwgMHgxNTIwLCAweDYxMDAsIDB4OTE4ZSwgMHgwMDA3LAorCTB4MTUwMCwgMHgyMDA5LCAweDE4NjksIDB4MjEwYywgMHhkMTg0LCAweDExZDgsIDB4NjAwMywgMHgwMDAzLAorCTB4NjAwNywgMHgwMDQzLCAweDYwNDcsIDB4YjAzNSwgMHgwODBjLCAweDFjNTksIDB4YTg3YywgMHhjMGRkLAorCTB4YTg3ZSwgMHg2MDBmLCAweDAwMDAsIDB4MDBmNiwgMHgyMDc5LCAweDAzODAsIDB4NzgxOCwgMHhkMGJjLAorCTB4MWRlOCwgMHg3ODMzLCAweDAwMTMsIDB4MmMwMCwgMHg3ODM2LCAweDc4MWIsIDB4ODA4MCwgMHgwMGZlLAorCTB4MDAwNSwgMHg5MDhjLCAweDAwMDMsIDB4MDEyMCwgMHg5MThlLCAweDAwMDMsIDB4MTkwNCwgMHg4OTRhLAorCTB4OTA4YywgMHgyMDIwLCAweDkxOGUsIDB4MjAyMCwgMHgwMWE4LCAweDYwMjQsIDB4ZDBkNCwgMHgxMWU4LAorCTB4MjAwOSwgMHgxODY5LCAweDIxMDQsIDB4ZDA4NCwgMHgxMTM4LCAweDg3ZmYsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDA0MywgMHgwODA0LCAweGFkNGQsIDB4MDAwNSwgMHg4N2ZmLCAweDFkZTgsIDB4MjAwOSwgMHgwMDQyLAorCTB4MDgwNCwgMHhhZDRkLCAweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLAorCTB4MGQyMCwgMHg2MDI0LCAweGMwY2QsIDB4NjAyNiwgMHgwYzAwLCAweGMwZDQsIDB4NjAyNiwgMHhhODkwLAorCTB4NjAyZSwgMHhhODhjLCAweDYwMzIsIDB4MDhlMCwgMHhkMGZjLCAweDAxNjAsIDB4OTA4YywgMHgwMDAzLAorCTB4MDEyMCwgMHg5MThlLCAweDAwMDMsIDB4MTkwNCwgMHg4OTRhLCAweDkwOGMsIDB4MjAyMCwgMHg5MThlLAorCTB4MjAyMCwgMHgwMTcwLCAweDAwNzYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTc3OCwgMHgwMGZlLAorCTB4MDA3ZSwgMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDQyLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LAorCTB4NjExMCwgMHgwMGI2LCAweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYWMsIDB4MGQ1OCwgMHg2MTI0LAorCTB4YzFjZCwgMHg2MTI2LCAweDBjMzgsIDB4ZDBmYywgMHgwMTg4LCAweDkwOGMsIDB4MjAyMCwgMHg5MThlLAorCTB4MjAyMCwgMHgwMWE4LCAweDkwODQsIDB4MDAwMywgMHg5MDhlLCAweDAwMDIsIDB4MDE0OCwgMHg4N2ZmLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHhhZDRkLCAweDAwMDUsIDB4MDBiOSwgMHgwY2U4LAorCTB4ODdmZiwgMHgxZGQ4LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGFkNGQsIDB4MGNiMCwgMHg2MTEwLAorCTB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLCAweDBkMjAsIDB4NjEyNCwgMHhjMWNkLAorCTB4NjEyNiwgMHgwYzAwLCAweDIwMDksIDB4MDAwNCwgMHgwMDE5LCAweDAwMDUsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDA5NiwgMHgwODBjLCAweGM5N2EsIDB4MDUxOCwgMHg2MDE0LCAweDIwNDgsIDB4YTk4MiwgMHhhODAwLAorCTB4NjAxNiwgMHg5MTg2LCAweDAwMDEsIDB4MTE4OCwgMHhhOTdjLCAweDkxOGMsIDB4ODEwMCwgMHg5MThlLAorCTB4ODEwMCwgMHgxMTU4LCAweDAwYzYsIDB4MjA2MSwgMHgxYTZlLCAweDYyMDAsIDB4ZDI4YywgMHgxMTIwLAorCTB4NjIwNCwgMHg4MjEwLCAweDAyMDgsIDB4NjIwNiwgMHgwMGNlLCAweDA4MGMsIDB4NmMyMywgMHg2MDE0LAorCTB4OTA0ZCwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgxOTBjLCAweDg4NjksIDB4MDA3ZSwgMHgwMDllLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwYzYsIDB4MjA2MSwgMHgxYTZlLCAweDYwMDAsIDB4ODFmZiwgMHgwMTEwLAorCTB4OTIwNSwgMHgwMDA4LCAweDkyMDQsIDB4NjAwMiwgMHgwMGNlLCAweDAxNWUsIDB4MDAwNSwgMHg2ODAwLAorCTB4ZDA4YywgMHgxMTM4LCAweDY4MDgsIDB4OTAwNSwgMHgwMTIwLCAweDgwMDEsIDB4NjgwYSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDIwNzEsIDB4MTkyMywgMHg3MDAzLCAweDAwMDYsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAwZiwgMHgwMDAwLCAweDcwMTMsIDB4MDAwMSwgMHgwODBjLCAweDEwNjAsIDB4MDkwYywgMHgwZDdkLAorCTB4YTg2NywgMHgwMDA2LCAweGE4NmIsIDB4MDAwMSwgMHhhOGFiLCAweGRjYjAsIDB4YTg5ZiwgMHgwMDAwLAorCTB4MjkwMCwgMHg3MDJlLCAweDcwMzMsIDB4MDAwMCwgMHgwMDA1LCAweDAwOTYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTkyMywgMHg3MDJjLCAweDIwNDgsIDB4NmEyYywgMHg3MjFlLCAweDZiMzAsIDB4NzMyMiwgMHg2ODM0LAorCTB4NzAyNiwgMHhhODk2LCAweDY4MzgsIDB4NzAyYSwgMHhhODlhLCAweDY4MjQsIDB4NzAxNiwgMHg2ODNjLAorCTB4NzAxYSwgMHgyMDA5LCAweDAwMjgsIDB4MjAwYSwgMHg5MDA1LCAweDAxNDgsIDB4OTAwZSwgMHg5MTg4LAorCTB4MDAwYywgMHg4MDAxLCAweDFkZTAsIDB4MjEwMCwgMHg5MjEwLCAweDEyMDgsIDB4ODMxOCwgMHhhYThlLAorCTB4YWI5MiwgMHg3MDEwLCAweGQwODQsIDB4MDE2OCwgMHhjMDg0LCAweDcwMDcsIDB4MDAwMSwgMHg3MDBmLAorCTB4MDAwMCwgMHgwMDA2LCAweDIwMDksIDB4MWI1MCwgMHgyMTA0LCAweDkwODIsIDB4MDAwNywgMHgyMDBhLAorCTB4MDAwZSwgMHhjMDk1LCAweDcwMTIsIDB4MjAwOCwgMHgyMDAxLCAweDAwM2IsIDB4MDgwYywgMHgxNmEwLAorCTB4OTAwNiwgMHgyMDcxLCAweDE5M2MsIDB4NzAwMiwgMHg3MDA2LCAweDcwMmEsIDB4MDBlZSwgMHgwMDllLAorCTB4MDAwNSwgMHgyMDA5LCAweDFiNTAsIDB4MjEwNCwgMHg5MDgwLCAweDAwMDcsIDB4MjAwYSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMTI2LCAweDAxNTYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MTU0LAorCTB4MjAwMSwgMHgwMDA4LCAweDkxMGEsIDB4MDYzOCwgMHgyMDAxLCAweDE4N2QsIDB4MjBhYywgMHg5MDA2LAorCTB4OTA4MCwgMHgwMDA4LCAweDFmMDQsIDB4OGEwOCwgMHg3MWMwLCAweDkxMDIsIDB4MDJlMCwgMHgyMDcxLAorCTB4MTg3NywgMHgyMGE5LCAweDAwMDcsIDB4MDBjNiwgMHgwODBjLCAweGFjNWEsIDB4NjAyMywgMHgwMDA5LAorCTB4NjAwMywgMHgwMDA0LCAweDYwMWYsIDB4MDEwMSwgMHgwMDg5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg4Yjg5LCAweDAxMmUsIDB4MWYwNCwgMHg4YTE0LCAweDkwMDYsIDB4MDBjZSwgMHgwMTVlLAorCTB4MDEyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjYzgsIDB4MDBlNiwgMHgwMGI2LAorCTB4MDA5NiwgMHgwMDg2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDcxMTgsIDB4NzIwYywgMHg3NjIwLAorCTB4NzAwNCwgMHhkMDg0LCAweDExMjgsIDB4MjAyMSwgMHgwMDI0LCAweDIwMjksIDB4MDAwMiwgMHgwMDIwLAorCTB4MjAyMSwgMHgwMDJjLCAweDIwMjksIDB4MDAwYSwgMHgwODBjLCAweDEwNDcsIDB4MDkwYywgMHgwZDdkLAorCTB4MjkwMCwgMHg2MDE2LCAweDIwNTgsIDB4YWM2NiwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHhhODZhLAorCTB4YTg3YSwgMHhhOGFhLCAweGE4ODcsIDB4MDAwNSwgMHhhODdmLCAweDAwMjAsIDB4NzAwOCwgMHhhODlhLAorCTB4NzAxMCwgMHhhODllLCAweGFlOGEsIDB4YThhZiwgMHhmZmZmLCAweGE4YjMsIDB4MDAwMCwgMHg4MTA5LAorCTB4MDE2MCwgMHgwODBjLCAweDEwNDcsIDB4MDkwYywgMHgwZDdkLCAweGFkNjYsIDB4MmIwMCwgMHhhODAyLAorCTB4MjkwMCwgMHhiODA2LCAweDIwNTgsIDB4ODEwOSwgMHgxZGEwLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLAorCTB4MDA4ZSwgMHgwMDllLCAweDAwYmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzksIDB4MDAwMCwgMHgyMDcxLAorCTB4MTkyMywgMHg3MDA0LCAweDAwNGIsIDB4NzAwYywgMHgwMDAyLCAweDhhODAsIDB4OGE3OSwgMHg4YTc5LAorCTB4MDAwNSwgMHg4YThhLCAweDhhZTAsIDB4OGFlMCwgMHg4YWUwLCAweDhhZTEsIDB4OGFmMiwgMHg4YWYyLAorCTB4NzAwYywgMHgwY2JhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4YTAsIDB4NzlhMCwgMHg5MTA2LAorCTB4MTkwNCwgMHg4YWQyLCAweDc4MTQsIDB4ZDBiYywgMHgxOTA0LCAweDhhZGIsIDB4MDEyZSwgMHg3MDE4LAorCTB4OTEwYSwgMHgxMTI4LCAweDcwMzAsIDB4OTAwNSwgMHgxOTA0LCAweDhiMjQsIDB4MDAwNSwgMHgxMjEwLAorCTB4NzExNCwgMHg5MTBhLCAweDkxOTIsIDB4MDAwYSwgMHgwMjEwLCAweDIwMDksIDB4MDAwYSwgMHgyMDAxLAorCTB4MTg4OCwgMHgyMDE0LCAweDIwMDEsIDB4MTkzNSwgMHgyMDA0LCAweDkxMDAsIDB4OTIwMiwgMHgwZTUwLAorCTB4MDgwYywgMHg4YzdkLCAweDIyMDAsIDB4OTEwMiwgMHgwMjA4LCAweDIyMDgsIDB4MDA5NiwgMHg3MDJjLAorCTB4MjA0OCwgMHhhODczLCAweDAwMDEsIDB4YTk3NiwgMHgwODBjLCAweDhkODYsIDB4MjEwMCwgMHhhODdlLAorCTB4YTg2ZiwgMHgwMDAwLCAweDAwOWUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHgxYTIwLAorCTB4MjEwNCwgMHhjMDg1LCAweDIwMGEsIDB4NzAwZiwgMHgwMDAyLCAweDAxMmUsIDB4MDgwYywgMHgxMTViLAorCTB4MWRlOCwgMHgwMDA1LCAweDc4YTAsIDB4NzlhMCwgMHg5MTA2LCAweDA5MDQsIDB4OGE5MiwgMHgwODBjLAorCTB4OGM1NSwgMHgwMTJlLCAweDAwMDUsIDB4NzgxMCwgMHhjMGM1LCAweDc4MTIsIDB4MDgwNCwgMHg4YTkyLAorCTB4MDAwNSwgMHg3MDBjLCAweDAwMDIsIDB4OGFlNiwgMHg4YWU5LCAweDhhZTgsIDB4MDgwYywgMHg4YTg4LAorCTB4MDAwNSwgMHg4MDAxLCAweDcwMGUsIDB4MDA5NiwgMHg3MDJjLCAweDIwNDgsIDB4YTk3NCwgMHgwMDllLAorCTB4MDAxMSwgMHgwY2EwLCAweDAwMDUsIDB4MDA5NiwgMHg3MDJjLCAweDIwNDgsIDB4NzAxOCwgMHg5MTAwLAorCTB4NzIxNCwgMHg5MjFhLCAweDExMzAsIDB4NzAxYywgMHhhODhlLCAweDcwMjAsIDB4YTg5MiwgMHg5MDA2LAorCTB4MDA2OCwgMHgwMDA2LCAweDA4MGMsIDB4OGQ4NiwgMHgyMTAwLCAweGFhOGMsIDB4OTIxMCwgMHhhYThlLAorCTB4MTIyMCwgMHhhODkwLCAweDkwODEsIDB4MDAwMCwgMHhhODkyLCAweDAwMGUsIDB4MDA5ZSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDc4YTIsIDB4NzAxYSwgMHgwODBjLCAweDhjNTUsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDE5MjMsIDB4NzAwYywgMHgwMDAyLCAweDhiMjIsIDB4OGIyMiwgMHg4YjIwLAorCTB4NzAwZiwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDMwLAorCTB4OTAwNSwgMHgwNTA4LCAweDIwNzgsIDB4NzgxNCwgMHgyMDQ4LCAweGFlODgsIDB4MDBiNiwgMHgyMDU5LAorCTB4MDAwMCwgMHgwODBjLCAweDhiOTIsIDB4MDBiZSwgMHgwMWIwLCAweDAwZTYsIDB4MjA3MSwgMHgxOTNjLAorCTB4MDgwYywgMHg4YmQ5LCAweDAwZWUsIDB4MDE3OCwgMHgwMDk2LCAweDA4MGMsIDB4MTA2MCwgMHgyOTAwLAorCTB4MDA5ZSwgMHgwMTQ4LCAweGE4YWEsIDB4MDRkMSwgMHgwMDQxLCAweDIwMDEsIDB4MTk0NiwgMHgyMDAzLAorCTB4MDAwMCwgMHgwMTJlLCAweDA4YzgsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwMDg2LAorCTB4MDBhNiwgMHgyOTQwLCAweDI2NTAsIDB4MjYwMCwgMHg5MDA1LCAweDAxODAsIDB4YTg2NCwgMHg5MDg0LAorCTB4MDAwZiwgMHgyMDY4LCAweDlkODgsIDB4MWVhYiwgMHgyMTY1LCAweDAwNTYsIDB4MjAyOSwgMHgwMDAwLAorCTB4MDgwYywgMHg4ZDBiLCAweDA4MGMsIDB4MWU4MSwgMHgxZGQ4LCAweDAwNWUsIDB4MDBhZSwgMHgyMDAxLAorCTB4MTg3ZiwgMHgyMDA0LCAweGE4OGEsIDB4MDBjNiwgMHgyZjYwLCAweDA4MGMsIDB4MTc3OCwgMHgwMGNlLAorCTB4NzgxZiwgMHgwMTAxLCAweDc4MTMsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4OGJlOCwgMHgwMTJlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NzAzMCwgMHg5MDA1LAorCTB4MDEzOCwgMHgyMDc4LCAweDc4MGMsIDB4NzAzMiwgMHgyMDAxLCAweDE5NDYsIDB4MjAwMywgMHgwMDAxLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTkyMywgMHg3MDMwLCAweDYwMGUsIDB4MmMwMCwgMHg3MDMyLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwMDI2LCAweDliODAsIDB4OGU1NCwgMHgyMDA1LAorCTB4OTA2ZCwgMHgwOTBjLCAweDBkN2QsIDB4OWI4MCwgMHg4ZTRjLCAweDIwMDUsIDB4OTA2NSwgMHgwOTBjLAorCTB4MGQ3ZCwgMHg2MTE0LCAweDI2MDAsIDB4OTEwMiwgMHgwMjQ4LCAweDY4MjgsIDB4OTEwMiwgMHgwMmYwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgwNCwgMHhkMDk0LAorCTB4MDE0OCwgMHg2ODU0LCAweGQwODQsIDB4MTE3OCwgMHhjMDg1LCAweDY4NTYsIDB4MjAxMSwgMHg4MDI2LAorCTB4MDgwYywgMHg0YjUyLCAweDY4NGMsIDB4MDA5NiwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHhhODA0LAorCTB4ODAwMCwgMHhhODA2LCAweDAwOWUsIDB4OTAwNiwgMHgyMDMwLCAweDBjMjAsIDB4Njg1NCwgMHhkMDhjLAorCTB4MWQwOCwgMHhjMDhkLCAweDY4NTYsIDB4MjAxMSwgMHg4MDI1LCAweDA4MGMsIDB4NGI1MiwgMHg2ODRjLAorCTB4MDA5NiwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHhhODAwLCAweDgwMDAsIDB4YTgwMiwgMHgwMDllLAorCTB4MDg4OCwgMHg3MDAwLCAweDIwMTksIDB4MDAwOCwgMHg4MzE5LCAweDcxMDQsIDB4OTEwMiwgMHgxMTE4LAorCTB4MjMwMCwgMHg5MDA1LCAweDAwMjAsIDB4MDIxMCwgMHg5MzAyLCAweDAwMDgsIDB4ODAwMiwgMHgwMDA1LAorCTB4MDBkNiwgMHg3ODE0LCAweDkwMDUsIDB4MDkwYywgMHgwZDdkLCAweDc4MWMsIDB4OTA4NCwgMHgwMTAxLAorCTB4OTA4NiwgMHgwMTAxLCAweDE5MGMsIDB4MGQ3ZCwgMHg3ODI3LCAweDAwMDAsIDB4MjA2OSwgMHgxOTNjLAorCTB4NjgwNCwgMHg5MDgwLCAweDE5M2UsIDB4MmYwOCwgMHgyMTAyLCAweDY5MDQsIDB4ODEwOCwgMHg5MTgyLAorCTB4MDAwOCwgMHgwMjA4LCAweDkwMGUsIDB4NjkwNiwgMHg5MTgwLCAweDE5M2UsIDB4MjAwMywgMHgwMDAwLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwOTYsIDB4MDBjNiwgMHgyMDYwLCAweDYwMTQsIDB4MjA0OCwgMHhhOGE4LAorCTB4MDA5NiwgMHgyMDQ4LCAweDkwMDUsIDB4MTkwYywgMHgxMDc5LCAweDAwOWUsIDB4YThhYiwgMHgwMDAwLAorCTB4MDgwYywgMHgwZmY5LCAweDA4MGMsIDB4YWNiMCwgMHgwMGNlLCAweDAwOWUsIDB4MDAwNSwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA5LCAweDExMjgsIDB4NjAxYywgMHhkMGM0LCAweDAxMTAsIDB4OTAwNiwgMHgwMDA1LAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE3OCwgMHg2MDEwLAorCTB4OTAwNSwgMHgwMTUwLCAweDAwYjYsIDB4MjA1OCwgMHgwODBjLCAweDhmODksIDB4MDBiZSwgMHg2MDEzLAorCTB4MDAwMCwgMHg2MDFiLCAweDAwMDAsIDB4MDAxMCwgMHgyYzAwLCAweDA4NjEsIDB4MDAwNSwgMHgyMDA5LAorCTB4MTkyNywgMHgyMTBjLCAweGQxOTQsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTkyMywgMHg3MTEwLAorCTB4YzE5NCwgMHhkMTljLCAweDExMTgsIDB4YzE4NSwgMHg3MDA3LCAweDAwMDAsIDB4NzExMiwgMHgyMDAxLAorCTB4MDAzYiwgMHgwODBjLCAweDE2YTAsIDB4MDBlZSwgMHgwMDA1LCAweDc4MTQsIDB4ZDBiYywgMHgxMTA4LAorCTB4MDAwNSwgMHg3ODEwLCAweGMwYzUsIDB4NzgxMiwgMHgwY2MwLCAweDAwOTYsIDB4MDBkNiwgMHg5MDA2LAorCTB4NzAwNiwgMHg3MDBlLCAweDcwMWEsIDB4NzAxZSwgMHg3MDIyLCAweDcwMTYsIDB4NzAyYSwgMHg3MDI2LAorCTB4NzAyZiwgMHgwMDAwLCAweDA4MGMsIDB4OGRkNCwgMHgwMTcwLCAweDA4MGMsIDB4OGUwOSwgMHgwMTU4LAorCTB4MjkwMCwgMHg3MDAyLCAweDcwMGEsIDB4NzAxYSwgMHg3MDEzLCAweDAwMDEsIDB4NzAxZiwgMHgwMDBhLAorCTB4MDBkZSwgMHgwMDllLCAweDAwMDUsIDB4OTAwZSwgMHgwY2Q4LCAweDAwZTYsIDB4MDA5NiwgMHgwMDg2LAorCTB4MDBkNiwgMHgwMGM2LCAweDIwNzEsIDB4MTkzMCwgMHg3MjFjLCAweDIxMDAsIDB4OTIwMiwgMHgxNjE4LAorCTB4MDgwYywgMHg4ZTA5LCAweDA5MGMsIDB4MGQ3ZCwgMHg3MDE4LCAweDkwMDUsIDB4MTE2MCwgMHgyOTAwLAorCTB4NzAwMiwgMHg3MDBhLCAweDcwMWEsIDB4OTAwNiwgMHg3MDA2LCAweDcwMGUsIDB4YTgwNiwgMHhhODAyLAorCTB4NzAxMiwgMHg3MDFlLCAweDAwMzgsIDB4MjA0MCwgMHhhODA2LCAweDI5MDAsIDB4YTAwMiwgMHg3MDFhLAorCTB4YTgwMywgMHgwMDAwLCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMWMsIDB4OTA4MCwgMHgwMDBhLAorCTB4NzAxZSwgMHg3MjFjLCAweDA4ZDAsIDB4NzIxYywgMHgwMGNlLCAweDAwZGUsIDB4MDA4ZSwgMHgwMDllLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwOTYsIDB4MDE1NiwgMHgwMTM2LCAweDAxNDYsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTkzMCwgMHg3MzAwLCAweDgzMWYsIDB4ODMxZSwgMHg4MzFlLAorCTB4OTM4NCwgMHgwMDNmLCAweDIwZTgsIDB4OTM5YywgMHhmZmMwLCAweDkzOTgsIDB4MDAwMywgMHg3MTA0LAorCTB4MDgwYywgMHg4ZDg2LCAweDgxMGMsIDB4MjEwMCwgMHg5MzE4LCAweDgwMDMsIDB4MjIyOCwgMHgyMDIxLAorCTB4MDA3OCwgMHg5NDAyLCAweDk1MzIsIDB4MDIwOCwgMHgyMDI4LCAweDI1MDAsIDB4ODAwNCwgMHgyMGE4LAorCTB4MjNhMCwgMHhhMDAxLCAweGEwMDEsIDB4NDAwNSwgMHgyNTA4LCAweDA4MGMsIDB4OGQ4ZiwgMHgyMTMwLAorCTB4NzAxNCwgMHg5NjAwLCAweDcwMTYsIDB4MjYwMCwgMHg3MTFjLCAweDkxMDIsIDB4NzAxZSwgMHg3MDA0LAorCTB4OTYwMCwgMHgyMDA4LCAweDkwODIsIDB4MDAwYSwgMHgxMTkwLCAweDcwMDAsIDB4MjA0OCwgMHhhODAwLAorCTB4OTAwNSwgMHgxMTQ4LCAweDIwMDksIDB4MDAwMSwgMHgwMDI2LCAweDA4MGMsIDB4OGM3ZCwgMHgwMDJlLAorCTB4NzAwMCwgMHgyMDQ4LCAweGE4MDAsIDB4NzAwMiwgMHg3MDA3LCAweDAwMDAsIDB4MDAwOCwgMHg3MTA2LAorCTB4MjUwMCwgMHg5MjEyLCAweDE5MDQsIDB4OGNiYywgMHgwMTJlLCAweDAwZWUsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDE1ZSwgMHgwMDllLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg5NTgwLCAweDhlNGMsIDB4MjAwNSwgMHg5MDc1LCAweDA5MGMsIDB4MGQ3ZCwgMHgwODBjLAorCTB4OGQ2MSwgMHgwMTJlLCAweDk1ODAsIDB4OGU0OCwgMHgyMDA1LCAweDkwNzUsIDB4MDkwYywgMHgwZDdkLAorCTB4MDE1NiwgMHgwMTM2LCAweDAxYzYsIDB4MDE0NiwgMHgwMWQ2LCAweDgzMWYsIDB4ODMxZSwgMHg4MzFlLAorCTB4OTM4NCwgMHgwMDNmLCAweDIwZTAsIDB4OTM4NCwgMHhmZmMwLCAweDkxMDAsIDB4MjA5OCwgMHhhODYwLAorCTB4MjBlOCwgMHhhOTVjLCAweDJjMDUsIDB4OTEwMCwgMHgyMGEwLCAweDIwYTksIDB4MDAwMiwgMHg0MDAzLAorCTB4MmUwYywgMHgyZDAwLCAweDAwMDIsIDB4OGQ0YiwgMHg4ZDRiLCAweDhkNGQsIDB4OGQ0YiwgMHg4ZDRkLAorCTB4OGQ0YiwgMHg4ZDRiLCAweDhkNGIsIDB4OGQ0YiwgMHg4ZDRiLCAweDhkNTMsIDB4OGQ0YiwgMHg4ZDUzLAorCTB4OGQ0YiwgMHg4ZDRiLCAweDhkNGIsIDB4MDgwYywgMHgwZDdkLCAweDQxMDQsIDB4MjBhOSwgMHgwMDAyLAorCTB4NDAwMiwgMHg0MDAzLCAweDAwMjgsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDMsIDB4NDEwNCwgMHg0MDAzLAorCTB4MDFkZSwgMHgwMTRlLCAweDAxY2UsIDB4MDEzZSwgMHgwMTVlLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDk2LCAweDcwMTQsIDB4ODAwMSwgMHg3MDE2LCAweDcxMGMsIDB4MjExMCwgMHgwMGYxLAorCTB4ODEwYywgMHg5MTg4LCAweDAwMDMsIDB4NzMwOCwgMHg4MjEwLCAweDkyODIsIDB4MDAwYSwgMHgxMTk4LAorCTB4NzAwOCwgMHgyMDQ4LCAweGE4MDAsIDB4OTAwNSwgMHgwMTU4LCAweDAwMDYsIDB4MDgwYywgMHg4ZTE4LAorCTB4MDA5ZSwgMHhhODA3LCAweDAwMDAsIDB4MjkwMCwgMHg3MDBhLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLAorCTB4NzAwZiwgMHgwMDAwLCAweDAwMDgsIDB4NzIwZSwgMHgwMDllLCAweDAwMDUsIDB4MDAwNiwgMHg4MTBiLAorCTB4ODEwYiwgMHgyMTAwLCAweDgxMGIsIDB4OTEwMCwgMHgyMDA4LCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAyNiwgMHgyMTAwLCAweDkwMDUsIDB4MDE1OCwgMHg5MDkyLCAweDAwMGMsIDB4MDI0MCwgMHg5MDBlLAorCTB4ODEwOCwgMHg5MDgyLCAweDAwMGMsIDB4MWRlMCwgMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHg5MDBlLAorCTB4MGNkOCwgMHgyZDAwLCAweDkwYjgsIDB4MDAwOCwgMHgyMDMxLCAweDhkZDIsIDB4OTAxZSwgMHg2ODA4LAorCTB4OTAwNSwgMHgwMTA4LCAweDgzMTgsIDB4NjkwYywgMHg5MTBhLCAweDAyNDgsIDB4MDE0MCwgMHg4MzE4LAorCTB4NjgxMCwgMHg5MTEyLCAweDAyMjAsIDB4MDExOCwgMHg4MzE4LCAweDIyMDgsIDB4MGNkMCwgMHgyMzNhLAorCTB4NjgwNCwgMHhkMDg0LCAweDIzMDAsIDB4MjAyMSwgMHgwMDAxLCAweDExNTAsIDB4OTA4MiwgMHgwMDAzLAorCTB4MDk2NywgMHgwYTY3LCAweDg0MjAsIDB4OTA4MiwgMHgwMDA3LCAweDA5NjcsIDB4MGE2NywgMHgwY2QwLAorCTB4OTA4MiwgMHgwMDAyLCAweDA5NjcsIDB4MGE2NywgMHg4NDIwLCAweDkwODIsIDB4MDAwNSwgMHgwOTY3LAorCTB4MGE2NywgMHgwY2QwLCAweDZjMWEsIDB4MDAwNSwgMHgwMDk2LCAweDAwNDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyYjAwLCAweDkwODAsIDB4OGU1MCwgMHgyMDA1LCAweDkwMDUsIDB4MDkwYywgMHgwZDdkLAorCTB4MjAwNCwgMHg5MGEwLCAweDAwMGEsIDB4MDgwYywgMHgxMDYwLCAweDAxZDAsIDB4MjkwMCwgMHg3MDI2LAorCTB4YTgwMywgMHgwMDAwLCAweGE4MDcsIDB4MDAwMCwgMHgwODBjLCAweDEwNjAsIDB4MDE4OCwgMHg3MDI0LAorCTB4YTgwMiwgMHhhODA3LCAweDAwMDAsIDB4MjkwMCwgMHg3MDI2LCAweDk0YTIsIDB4MDAwYSwgMHgwMTEwLAorCTB4MDIwOCwgMHgwYzkwLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwNGUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NzAyNCwgMHg5MDA1LCAweDBkYzgsIDB4MjA0OCwgMHhhYzAwLCAweDA4MGMsIDB4MTA3OSwgMHgyNDAwLAorCTB4MGNjMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDI0LCAweDIwNDgsIDB4OTAwNSwgMHgwMTMwLAorCTB4YTgwMCwgMHg3MDI2LCAweGE4MDMsIDB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAyNCwgMHhhODAyLCAweDI5MDAsIDB4NzAyNiwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDk2LCAweDllODAsIDB4MDAwOSwgMHgyMDA0LCAweDkwMDUsIDB4MDEzOCwgMHgyMDQ4LAorCTB4YTgwMCwgMHgwMDA2LCAweDA4MGMsIDB4MTA3OSwgMHgwMDBlLCAweDBjYjgsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDA5NiwgMHg3MDA4LCAweDkwMDUsIDB4MDEzOCwgMHgyMDQ4LCAweGE4MDAsIDB4MDAwNiwgMHgwODBjLAorCTB4MTA3OSwgMHgwMDBlLCAweDBjYjgsIDB4OTAwNiwgMHg3MDAyLCAweDcwMGEsIDB4NzAwNiwgMHg3MDBlLAorCTB4NzAxYSwgMHg3MDFlLCAweDcwMjIsIDB4NzAyYSwgMHg3MDI2LCAweDcwMmUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MWE2YywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgxOTMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MTg4OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgxODc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDBlNiwgMHgwMGM2LCAweDAwYjYsIDB4MDBhNiwgMHhhOGE4LCAweDIwNDAsIDB4MjA3MSwgMHgxODc3LAorCTB4MDgwYywgMHg4Zjc0LCAweGEwNjcsIDB4MDAyMywgMHg2MDEwLCAweDkwNWQsIDB4MDkwNCwgMHg4ZjQ5LAorCTB4YjgxNCwgMHhhMDZlLCAweGI5MTAsIDB4YTE3MiwgMHhiOWEwLCAweGExNzYsIDB4MjAwMSwgMHgwMDAzLAorCTB4YTA3ZSwgMHhhODM0LCAweGEwODIsIDB4YTA3YiwgMHgwMDAwLCAweGE4OTgsIDB4OTAwNSwgMHgwMTE4LAorCTB4YTA3OCwgMHhjMDg1LCAweGEwN2EsIDB4Mjg1OCwgMHgyMDMxLCAweDAwMTgsIDB4YTA2OCwgMHg5MDhhLAorCTB4MDAxOSwgMHgxYTBjLCAweDBkN2QsIDB4MjAyMCwgMHgyMDUwLCAweDI5NDAsIDB4YTg2NCwgMHg5MGJjLAorCTB4MDBmZiwgMHg5MDhjLCAweDAwMGYsIDB4OTFlMCwgMHgxZWFiLCAweDJjNjUsIDB4OTc4NiwgMHgwMDI0LAorCTB4MmMwNSwgMHgxNTkwLCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwgMHgwMDFiLAorCTB4MDAwMiwgMHg4ZWI0LCAweDhlYjQsIDB4OGViNiwgMHg4ZWI0LCAweDhlYjQsIDB4OGViNCwgMHg4ZWI4LAorCTB4OGViNCwgMHg4ZWI0LCAweDhlYjQsIDB4OGViYSwgMHg4ZWI0LCAweDhlYjQsIDB4OGViNCwgMHg4ZWJjLAorCTB4OGViNCwgMHg4ZWI0LCAweDhlYjQsIDB4OGViZSwgMHg4ZWI0LCAweDhlYjQsIDB4OGViNCwgMHg4ZWMwLAorCTB4OGViNCwgMHg4ZWI0LCAweDhlYjQsIDB4OGVjMiwgMHgwODBjLCAweDBkN2QsIDB4YTE4MCwgMHgwNGI4LAorCTB4YTE5MCwgMHgwNGE4LCAweGExYTAsIDB4MDQ5OCwgMHhhMWIwLCAweDA0ODgsIDB4YTFjMCwgMHgwNDc4LAorCTB4YTFkMCwgMHgwNDY4LCAweGExZTAsIDB4MDQ1OCwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZDdkLAorCTB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4OGVlNiwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlNCwgMHg4ZWU0LAorCTB4OGVlNCwgMHg4ZWU4LCAweDhlZTQsIDB4OGVlNCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlNCwgMHg4ZWVhLAorCTB4OGVlNCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlNCwgMHg4ZWU0LCAweDhlZWMsIDB4OGVlNCwgMHg4ZWU0LAorCTB4OGVlNCwgMHg4ZWU0LCAweDhlZTQsIDB4OGVlZSwgMHgwODBjLCAweDBkN2QsIDB4YTE4MCwgMHgwMDM4LAorCTB4YTE5OCwgMHgwMDI4LCAweGExYjAsIDB4MDAxOCwgMHhhMWM4LCAweDAwMDgsIDB4YTFlMCwgMHgyNjAwLAorCTB4MDAwMiwgMHg4ZjBhLCAweDhmMGMsIDB4OGYwZSwgMHg4ZjEwLCAweDhmMTIsIDB4OGYxNCwgMHg4ZjE2LAorCTB4OGYxOCwgMHg4ZjFhLCAweDhmMWMsIDB4OGYxZSwgMHg4ZjIwLCAweDhmMjIsIDB4OGYyNCwgMHg4ZjI2LAorCTB4OGYyOCwgMHg4ZjJhLCAweDhmMmMsIDB4OGYyZSwgMHg4ZjMwLCAweDhmMzIsIDB4OGYzNCwgMHg4ZjM2LAorCTB4OGYzOCwgMHg4ZjNhLCAweDA4MGMsIDB4MGQ3ZCwgMHhiOWUyLCAweDA0NjgsIDB4YjlkZSwgMHgwNDU4LAorCTB4YjlkYSwgMHgwNDQ4LCAweGI5ZDYsIDB4MDQzOCwgMHhiOWQyLCAweDA0MjgsIDB4YjljZSwgMHgwNDE4LAorCTB4YjljYSwgMHgwNDA4LCAweGI5YzYsIDB4MDBmOCwgMHhiOWMyLCAweDAwZTgsIDB4YjliZSwgMHgwMGQ4LAorCTB4YjliYSwgMHgwMGM4LCAweGI5YjYsIDB4MDBiOCwgMHhiOWIyLCAweDAwYTgsIDB4YjlhZSwgMHgwMDk4LAorCTB4YjlhYSwgMHgwMDg4LCAweGI5YTYsIDB4MDA3OCwgMHhiOWEyLCAweDAwNjgsIDB4Yjk5ZSwgMHgwMDU4LAorCTB4Yjk5YSwgMHgwMDQ4LCAweGI5OTYsIDB4MDAzOCwgMHhiOTkyLCAweDAwMjgsIDB4Yjk4ZSwgMHgwMDE4LAorCTB4Yjk4YSwgMHgwMDA4LCAweGI5ODYsIDB4ODYzMSwgMHg4NDIxLCAweDAxMzAsIDB4MDgwYywgMHgxZTgxLAorCTB4MDkwYywgMHgwZDdkLCAweDA4MDQsIDB4OGU4ZSwgMHgwMGFlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHhhODZjLCAweGEwNmUsIDB4YTg3MCwgMHhhMDcyLCAweGEwNzcsIDB4MDBmZiwgMHg5MDA2LAorCTB4MDgwNCwgMHg4ZTcwLCAweDAwMDYsIDB4MDAxNiwgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiODEwLAorCTB4OTAwNSwgMHgwMWIwLCAweDIwMDEsIDB4MTkyNCwgMHgyMDA0LCAweDkwMDUsIDB4MDE4OCwgMHgyMDAxLAorCTB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgxMTU4LCAweDAwMzYsIDB4MDA0NiwgMHhiYmEwLAorCTB4MjAyMSwgMHgwMDA0LCAweDIwMTEsIDB4ODAxNCwgMHgwODBjLCAweDRiNTIsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDBiZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHg5MDE2LCAweDcxMGMsIDB4YTgzNCwgMHg5MTBhLAorCTB4YTkzNiwgMHg3MDA4LCAweDkwMDUsIDB4MDEyMCwgMHg4MjEwLCAweDkxMGEsIDB4MDIzOCwgMHgwMTMwLAorCTB4NzAxMCwgMHg4MjEwLCAweDkxMGEsIDB4MDIxMCwgMHgwMTA4LCAweDBjZDgsIDB4YWE4YSwgMHhhMjZhLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZDYsIDB4MDAzNiwgMHgyMDc5LCAweDAzMDAsIDB4NzgxYiwgMHgwMjAwLAorCTB4NzgxOCwgMHhkMDk0LCAweDFkZDgsIDB4NzgxYiwgMHgwMjAyLCAweGEwMDEsIDB4YTAwMSwgMHg3ODE4LAorCTB4ZDA5NCwgMHgxZGEwLCAweGI4YWMsIDB4OTAwNSwgMHgwMWI4LCAweDIwNjgsIDB4MjA3OSwgMHgwMDAwLAorCTB4MmMwOCwgMHg5MTFlLCAweDExMTgsIDB4NjgwYywgMHhiOGFlLCAweDAwNjAsIDB4OTEwNiwgMHgwMTQwLAorCTB4MmQwMCwgMHgyMDc4LCAweDY4MGMsIDB4OTAwNSwgMHgwOTBjLCAweDBkN2QsIDB4MjA2OCwgMHgwY2IwLAorCTB4NmIwYywgMHg3YjBlLCAweDYwMGYsIDB4MDAwMCwgMHgyMDc5LCAweDAzMDAsIDB4NzgxYiwgMHgwMjAwLAorCTB4MDAzZSwgMHgwMGRlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDA5NiwgMHgwMGM2LAorCTB4MDAzNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMTU2LCAweDIwYTksIDB4MDFmZiwgMHgyMDcxLAorCTB4MDMwMCwgMHg3MDFiLCAweDAyMDAsIDB4NzAxOCwgMHhkMDk0LCAweDAxMTAsIDB4MWYwNCwgMHg4ZmM5LAorCTB4NzAxYiwgMHgwMjAyLCAweGEwMDEsIDB4YTAwMSwgMHg3MDE4LCAweGQwOTQsIDB4MWQ5MCwgMHhiOGFjLAorCTB4OTAwNSwgMHgwMWU4LCAweDIwNjAsIDB4NjAwYywgMHhiOGFlLCAweDYwMjQsIDB4YzA4ZCwgMHg2MDI2LAorCTB4NjAwMywgMHgwMDA0LCAweDYwMWIsIDB4MDAwMCwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwgMHgwMTAxLAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4OGIsIDB4MDAwMCwgMHhhOGE4LCAweGE4YWIsIDB4MDAwMCwgMHg5MDRkLAorCTB4MDkwYywgMHgwZDdkLCAweDA4MGMsIDB4MTA3OSwgMHgwODBjLCAweDhiODksIDB4MGMwMCwgMHgyMDcxLAorCTB4MDMwMCwgMHg3MDFiLCAweDAyMDAsIDB4MDE1ZSwgMHgwMTJlLCAweDAwM2UsIDB4MDBjZSwgMHgwMDllLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDAwMTYsIDB4MDAwNiwgMHgwMTU2LAorCTB4MDgwYywgMHgyNjYxLCAweDAxNWUsIDB4MTFiMCwgMHgwODBjLCAweDY2MzIsIDB4MTkwYywgMHgwZDdkLAorCTB4MDAwZSwgMHgwMDFlLCAweGI5MTIsIDB4YjgxNiwgMHgwODBjLCAweGFjNWEsIDB4MDE0MCwgMHgyYjAwLAorCTB4NjAxMiwgMHg2MDIzLCAweDAwMDEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMGJlLAorCTB4MDBjZSwgMHgwMDA1LCAweDAwMGUsIDB4MDAxZSwgMHgwY2QwLCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLAorCTB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4OTAzZSwgMHg5MDNlLAorCTB4OTAzZSwgMHg5MDQwLCAweDkwODksIDB4OTAzZSwgMHg5MDNlLCAweDkwM2UsIDB4OTBmMCwgMHg5MDNlLAorCTB4OTEyOCwgMHg5MDNlLCAweDkwM2UsIDB4OTAzZSwgMHg5MDNlLCAweDkwM2UsIDB4MDgwYywgMHgwZDdkLAorCTB4OTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OTA1MywgMHg5MDUzLCAweDkwNTMsIDB4OTA1MywgMHg5MDUzLAorCTB4OTA1MywgMHg5MDUzLCAweDkwNTMsIDB4OTA1MywgMHg5MDU1LCAweDkwNjYsIDB4OTA1MywgMHg5MDUzLAorCTB4OTA1MywgMHg5MDUzLCAweDkwNzcsIDB4MDgwYywgMHgwZDdkLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LAorCTB4YTg3YiwgMHgwMDAwLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmIsIDB4MDUwMCwgMHgwMGJlLAorCTB4MDgwYywgMHg2YmVlLCAweDA4MGMsIDB4YWNiMCwgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHg5NmQ1LAorCTB4MDBkNiwgMHg2MTE0LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTMwLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LAorCTB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDBkZSwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgwODBjLAorCTB4OTZkNSwgMHgwODBjLCAweDMyNDAsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4MDgwYywgMHhjOTdhLAorCTB4MDEyMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDgwYywgMHhhY2IwLAorCTB4MDAwNSwgMHg2MDFiLCAweDAwMDAsIDB4OTE4MiwgMHgwMDQwLCAweDAwOTYsIDB4MDAwMiwgMHg5MGE0LAorCTB4OTBhNCwgMHg5MGE0LCAweDkwYTQsIDB4OTBhNCwgMHg5MGE0LCAweDkwYTQsIDB4OTBhNCwgMHg5MGE2LAorCTB4OTBhNCwgMHg5MGE0LCAweDkwYTQsIDB4OTBlYywgMHg5MGE0LCAweDkwYTQsIDB4OTBhNCwgMHg5MGE0LAorCTB4OTBhNCwgMHg5MGE0LCAweDkwYWQsIDB4OTBhNCwgMHgwODBjLCAweDBkN2QsIDB4NjExNCwgMHgyMTQ4LAorCTB4YTkzOCwgMHg5MThlLCAweGZmZmYsIDB4MDkwNCwgMHg5MGVjLCAweDYwMjQsIDB4ZDA4YywgMHgxNWMwLAorCTB4MDBlNiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHg4ZTU4LCAweDAwOTYsIDB4YThhOCwgMHgyMDQ4LAorCTB4MDgwYywgMHg2Yjg2LCAweDAwOWUsIDB4YThhYiwgMHgwMDAwLCAweDYwMTAsIDB4OTAwNSwgMHgwMTI4LAorCTB4MDBiNiwgMHgyMDU4LCAweDA4MGMsIDB4OGY4OSwgMHgwMGJlLCAweGFlODgsIDB4MDBiNiwgMHgyMDU5LAorCTB4MDAwMCwgMHgwODBjLCAweDhiOTIsIDB4MDBiZSwgMHgwMWUwLCAweDIwNzEsIDB4MTkzYywgMHgwODBjLAorCTB4OGJkOSwgMHgwMWI4LCAweDkwODYsIDB4MDAwMSwgMHgxMTI4LCAweDIwMDEsIDB4MTk0NiwgMHgyMDA0LAorCTB4OTAwNSwgMHgxMTc4LCAweDAwOTYsIDB4MDgwYywgMHgxMDQ3LCAweDI5MDAsIDB4MDA5ZSwgMHgwMTQ4LAorCTB4YThhYSwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg4YjRkLCAweDAwZmUsIDB4MDBlZSwgMHgwMDllLAorCTB4MDAwNSwgMHgwODBjLCAweDhiODksIDB4MGNkMCwgMHgwODBjLCAweDkxYTQsIDB4MDA5ZSwgMHgwMDA1LAorCTB4OTE4MiwgMHgwMDQwLCAweDAwOTYsIDB4MDAwMiwgMHg5MTA0LCAweDkxMDQsIDB4OTEwNCwgMHg5MTA2LAorCTB4OTEwNCwgMHg5MTA0LCAweDkxMDQsIDB4OTEyNiwgMHg5MTA0LCAweDkxMDQsIDB4OTEwNCwgMHg5MTA0LAorCTB4OTEwNCwgMHg5MTA0LCAweDkxMDQsIDB4OTEwNCwgMHgwODBjLCAweDBkN2QsIDB4NjAwMywgMHgwMDAzLAorCTB4NjEwNiwgMHg2MDE0LCAweDIwNDgsIDB4YThhYywgMHhhODM2LCAweGE4YjAsIDB4YTgzYSwgMHhhODQ3LAorCTB4MDAwMCwgMHhhODRiLCAweDAwMDAsIDB4YTg4NCwgMHg5MDkyLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLAorCTB4MTk5OSwgMHg4MDAzLCAweDgwMTMsIDB4ODIxMywgMHg5MjEwLCAweDYyMWEsIDB4MDgwYywgMHgxYzEwLAorCTB4MjAwOSwgMHg4MDMwLCAweDA4MGMsIDB4OTJmNywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHgwZDdkLAorCTB4MDgwYywgMHg5NmQ1LCAweDYxMTQsIDB4MjE0OCwgMHhhODdiLCAweDAwMDAsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiOGJiLCAweDA1MDAsIDB4MDBiZSwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhhY2IwLAorCTB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwgMHg2MTQ0LCAweGQxZmMsIDB4MDEyMCwgMHhkMWFjLAorCTB4MTExMCwgMHg2MDAzLCAweDAwMDMsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZDdkLAorCTB4MDA5NiwgMHgwMDIzLCAweDAwOWUsIDB4MDgwYywgMHhhOTNhLCAweDAwMDUsIDB4OTE1ZSwgMHg5MTVlLAorCTB4OTE1ZSwgMHg5MTYwLCAweDkxNzEsIDB4OTE1ZSwgMHg5MTVlLCAweDkxNWUsIDB4OTE1ZSwgMHg5MTVlLAorCTB4OTE1ZSwgMHg5MTVlLCAweDkxNWUsIDB4OTE1ZSwgMHg5MTVlLCAweDkxNWUsIDB4MDgwYywgMHgwZDdkLAorCTB4MDgwYywgMHhhYWI1LCAweDYxMTQsIDB4MjE0OCwgMHhhODdiLCAweDAwMDYsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiOGJiLCAweDA1MDAsIDB4MDBiZSwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhhY2IwLAorCTB4MDAwNSwgMHgwNDkxLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLCAweDYwMDAsIDB4NjE0NCwgMHhkMWZjLAorCTB4MDEzMCwgMHhkMWFjLCAweDExMjAsIDB4NjAwMywgMHgwMDAzLCAweDIwMDksIDB4MDAwMywgMHg5MDhhLAorCTB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4MDA5NiwgMHgwMDMzLCAweDAwOWUsIDB4MDEwNiwgMHgwODBjLAorCTB4YTkzYSwgMHgwMTBlLCAweDAwMDUsIDB4OTE5YiwgMHg5MTliLCAweDkxOWIsIDB4OTE5ZCwgMHg5MWE0LAorCTB4OTE5YiwgMHg5MTliLCAweDkxOWIsIDB4OTE5YiwgMHg5MTliLCAweDkxOWIsIDB4OTE5YiwgMHg5MTliLAorCTB4OTE5YiwgMHg5MTliLCAweDkxOWIsIDB4MDgwYywgMHgwZDdkLCAweDAwMzYsIDB4MDBlNiwgMHgwODBjLAorCTB4YWFiNSwgMHgwMGVlLCAweDAwM2UsIDB4MDAwNSwgMHg2MDI0LCAweGQwOGMsIDB4MTFmMCwgMHgwMGY2LAorCTB4MDBlNiwgMHg2MDFiLCAweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweDYwMTAsIDB4OTAwNSwgMHgwMTI4LAorCTB4MDBiNiwgMHgyMDU4LCAweDA4MGMsIDB4OGY4OSwgMHgwMGJlLCAweDIwNzEsIDB4MTkzYywgMHgwODBjLAorCTB4OGJkOSwgMHgwMTYwLCAweDIwMDEsIDB4MTg3ZiwgMHgyMDA0LCAweGE4OGEsIDB4MjAzMSwgMHgwMDAwLAorCTB4MmM3OCwgMHgwODBjLCAweDhiNGQsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MDA5NiwgMHhhODhiLAorCTB4MDAwMCwgMHhhOGE4LCAweDIwNDgsIDB4MDgwYywgMHgxMDc5LCAweDAwOWUsIDB4YThhYiwgMHgwMDAwLAorCTB4MDgwYywgMHg4Yjg5LCAweDBjODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgxODdhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MjBhOSwgMHgwMDEwLCAweDkwMDYsIDB4ODAwNCwgMHg4MDg2LCAweDgxOGUsIDB4MTIwOCwgMHg5MjAwLAorCTB4MWYwNCwgMHg5MWVjLCAweDgwODYsIDB4ODE4ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDA3NiwgMHgwMTU2LCAweDIwYTksIDB4MDAxMCwgMHg5MDA1LAorCTB4MDFjOCwgMHg5MTFhLCAweDEyYjgsIDB4ODIxMywgMHg4MThkLCAweDAyMjgsIDB4OTExYSwgMHgxMjIwLAorCTB4MWYwNCwgMHg5MjAzLCAweDAwMjgsIDB4OTExYSwgMHgyMzA4LCAweDgyMTAsIDB4MWYwNCwgMHg5MjAzLAorCTB4MDAwNiwgMHgzMjAwLCAweDkwODQsIDB4ZWZmZiwgMHgyMDgwLCAweDAwMGUsIDB4MDE1ZSwgMHgwMDdlLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwMDYsIDB4MzIwMCwgMHg5MDg1LCAweDEwMDAsIDB4MGNhOCwgMHgwMTI2LAorCTB4MjA5MSwgMHgyODAwLCAweDIwNzksIDB4MTllNiwgMHgwMTJlLCAweDAwZDYsIDB4MjA2OSwgMHgxOWU2LAorCTB4NjgwMywgMHgwMDA1LCAweDAxNTYsIDB4MDE0NiwgMHgwMWQ2LCAweDIwZTksIDB4MDAwMCwgMHgyMDY5LAorCTB4MDIwMCwgMHgwODBjLCAweGE3MTMsIDB4MDRhOSwgMHgwODBjLCAweGE2ZmUsIDB4MDQ5MSwgMHgwODBjLAorCTB4YTcwMSwgMHgwNDc5LCAweDA4MGMsIDB4YTcwNCwgMHgwNDYxLCAweDA4MGMsIDB4YTcwNywgMHgwNDQ5LAorCTB4MDgwYywgMHhhNzBhLCAweDA0MzEsIDB4MDgwYywgMHhhNzBkLCAweDA0MTksIDB4MDgwYywgMHhhNzEwLAorCTB4MDQwMSwgMHgwMWRlLCAweDAxNGUsIDB4MDE1ZSwgMHg2ODU3LCAweDAwMDAsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDM4MCwgMHgwMGY5LCAweDc4MDcsIDB4MDAwMywgMHg3ODAzLCAweDAwMDAsIDB4NzgwMywgMHgwMDAxLAorCTB4MjA2OSwgMHgwMDA0LCAweDJkMDQsIDB4OTA4NCwgMHhmZmZlLCAweDkwODUsIDB4ODAwMCwgMHgyMDZhLAorCTB4MjA2OSwgMHgwMTAwLCAweDY4MjgsIDB4OTA4NCwgMHhmZmZjLCAweDY4MmEsIDB4MDBmZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgyMGE5LCAweDAwMjAsIDB4MjBhMSwgMHgwMjQwLCAweDIwMDEsIDB4MDAwMCwgMHg0MDA0LAorCTB4MDAwNSwgMHgwMGM2LCAweDc4MDMsIDB4MDAwMCwgMHg5MDA2LCAweDc4MjcsIDB4MDAzMCwgMHg3ODJiLAorCTB4MDQwMCwgMHg3ODI3LCAweDAwMzEsIDB4NzgyYiwgMHgxYWYxLCAweDc4MWYsIDB4ZmYwMCwgMHg3ODFiLAorCTB4ZmYwMCwgMHgyMDYxLCAweDFhZTYsIDB4NjAyZiwgMHgxOWU2LCAweDYwMzMsIDB4MTgwMCwgMHg2MDM3LAorCTB4MWEwMiwgMHg2MDNiLCAweDFlYWIsIDB4NjAzZiwgMHgxZWJiLCAweDYwNDIsIDB4NjA0NywgMHgxYWJjLAorCTB4MDBjZSwgMHgwMDA1LCAweDIwMDEsIDB4MDM4MiwgMHgyMDA0LCAweDkwODQsIDB4MDAwNywgMHg5MDg2LAorCTB4MDAwMSwgMHgwMWIwLCAweDAwYzYsIDB4NjE0NiwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLAorCTB4MTllNiwgMHg2MDJjLCAweDgwMDAsIDB4NjAyZSwgMHg2MDFjLCAweDkwMDUsIDB4MDEzMCwgMHg5MDgwLAorCTB4MDAwMywgMHgyMTAyLCAweDYxMWUsIDB4MDBjZSwgMHgwMDA1LCAweDYxMjIsIDB4NjExZSwgMHgwY2Q4LAorCTB4NjE0NiwgMHgyYzA4LCAweDIwMDEsIDB4MDAxMiwgMHgwODBjLCAweGE5MGYsIDB4MDAwNSwgMHgwMDE2LAorCTB4MjAwOSwgMHg4MDIwLCAweDYxNDYsIDB4MmMwOCwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAwNywgMHg5MDg2LCAweDAwMDEsIDB4MTEyOCwgMHgyMDAxLCAweDAwMTksIDB4MDgwYywgMHhhOTBmLAorCTB4MDA4OCwgMHgwMGM2LCAweDIwNjEsIDB4MTllNiwgMHg2MDJjLCAweDgwMDAsIDB4NjAyZSwgMHg2MDBjLAorCTB4OTAwNSwgMHgwMTI4LCAweDkwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMGUsIDB4MDAxMCwgMHg2MTEyLAorCTB4NjEwZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAwNywgMHg5MDg2LCAweDAwMDEsIDB4MDE5OCwgMHgwMGM2LCAweDYxNDYsIDB4NjAwZiwgMHgwMDAwLAorCTB4MmMwOCwgMHgyMDYxLCAweDE5ZTYsIDB4NjA0NCwgMHg5MDA1LCAweDAxMzAsIDB4OTA4MCwgMHgwMDAzLAorCTB4MjEwMiwgMHg2MTQ2LCAweDAwY2UsIDB4MDAwNSwgMHg2MTRhLCAweDYxNDYsIDB4MGNkOCwgMHg2MTQ2LAorCTB4NjAwZiwgMHgwMDAwLCAweDJjMDgsIDB4MjAwMSwgMHgwMDEzLCAweDA4MGMsIDB4YTkwZiwgMHgwMDA1LAorCTB4NjA0NCwgMHhkMGRjLCAweDAxMTAsIDB4MDgwYywgMHhhM2FjLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwYjYsIDB4MDA5NiwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDM2LAorCTB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwgMHg5MDJlLCAweDIwNzEsIDB4MTllNiwgMHg3NjQ4LAorCTB4MjY2MCwgMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLCAweDA5MDQsIDB4OTM4MywgMHg2MDEwLAorCTB4MjA1OCwgMHhiOGEwLCAweDkyMDYsIDB4MTkwNCwgMHg5MzdlLCAweDg3ZmYsIDB4MDEyMCwgMHg2MDVjLAorCTB4OTEwNiwgMHgxOTA0LCAweDkzN2UsIDB4NzA0YywgMHg5YzA2LCAweDExNzgsIDB4MDAzNiwgMHgyMDE5LAorCTB4MDAwMSwgMHgwODBjLCAweGExYjgsIDB4NzAzZiwgMHgwMDAwLCAweDkwMDYsIDB4NzA0ZSwgMHg3MDZhLAorCTB4NzA1MiwgMHg3MDZlLCAweDAwM2UsIDB4MjAyOSwgMHgwMDAxLCAweDA4MTEsIDB4NzA0OCwgMHg5YzM2LAorCTB4MTExMCwgMHg2NjBjLCAweDc2NGEsIDB4NzA0NCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LAorCTB4MDExOCwgMHgyZjAwLCAweDcwNDYsIDB4MDAxMCwgMHg3MDQ3LCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LAorCTB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLAorCTB4MDgwYywgMHhjOTdhLCAweDAxZjAsIDB4NjAxNCwgMHgyMDQ4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTU4OCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgwOTBjLCAweGEzYWMsIDB4YTg2NywgMHgwMTAzLAorCTB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwNzYsIDB4MDgwYywgMHhjYzdmLAorCTB4MDgwYywgMHhlNzlkLCAweDA4MGMsIDB4NmRlZSwgMHgwMDdlLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLAorCTB4Y2I2YiwgMHgwODBjLCAweGFjZWIsIDB4MDBjZSwgMHgwODA0LCAweDkzMWMsIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweDkzMWMsIDB4MDEyZSwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDA5ZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExNTgsIDB4MDAxNiwgMHgwMDM2LAorCTB4MDA3NiwgMHgwODBjLCAweGU3OWQsIDB4MDgwYywgMHhlM2U4LCAweDAwN2UsIDB4MDAzZSwgMHgwMDFlLAorCTB4MDhjMCwgMHg2MDIwLCAweDkwODYsIDB4MDAwOSwgMHgxMTY4LCAweGE4N2IsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAzNiwgMHgwMDc2LCAweDA4MGMsIDB4NmRlZSwgMHgwODBjLCAweGFjYjAsIDB4MDA3ZSwgMHgwMDNlLAorCTB4MDAxZSwgMHgwODQ4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDBhLCAweDA5MDQsIDB4OTM2OCwgMHgwODA0LAorCTB4OTM2MSwgMHgwMDA2LCAweDAwNjYsIDB4MDA5NiwgMHgwMGM2LCAweDAwZDYsIDB4MDBmNiwgMHg5MDM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgxOWU2LCAweDc4NDgsIDB4OTA2NSwgMHgwOTA0LAorCTB4OTQxZCwgMHg2MDBjLCAweDAwMDYsIDB4NjAwZiwgMHgwMDAwLCAweDc4NGMsIDB4OWMwNiwgMHgxMWEwLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHhhMWI4LCAweDc4M2YsIDB4MDAwMCwgMHg5MDFlLAorCTB4N2I0ZSwgMHg3YjZhLCAweDdiNTIsIDB4N2I2ZSwgMHgwMDNlLCAweDAwMGUsIDB4OTAwNSwgMHgxMTE4LAorCTB4NjAwYywgMHg2MDBmLCAweDAwMDAsIDB4MDAwNiwgMHgwMGU2LCAweDJmNzAsIDB4MDgwYywgMHg5MzAwLAorCTB4MDBlZSwgMHgwODBjLCAweGM5N2EsIDB4MDU0OCwgMHg2MDE0LCAweDIwNDgsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwMywgMHgxNWE4LCAweDNlMDgsIDB4OTE4ZSwgMHgwMDAyLCAweDExODgsIDB4NjAxMCwgMHg5MDA1LAorCTB4MDE3MCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDE0MCwgMHg2MDQ4LAorCTB4OTAwNSwgMHgxMWMwLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNGEsIDB4MDA5OCwgMHg2MDA0LAorCTB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4YTNhYywgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LAorCTB4MDAwMCwgMHgwODBjLCAweDZkZTIsIDB4MDgwYywgMHhjYjZiLCAweDYwNDQsIDB4YzBmYywgMHg2MDQ2LAorCTB4MDgwYywgMHhhY2ViLCAweDAwMGUsIDB4MDgwNCwgMHg5M2M2LCAweDdlNGEsIDB4N2U0NiwgMHgwMTJlLAorCTB4MDBmZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMDZlLCAweDAwMGUsIDB4MDAwNSwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhlM2U4LCAweDBjMzgsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwOSwgMHgxMTMwLCAweGFiN2EsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4YWNiMCwgMHgwYzEwLAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MDk5MCwgMHgwODUwLCAweDAwMTYsIDB4MDAyNiwgMHgwMDg2LAorCTB4OTA0NiwgMHgwMGE5LCAweDA4MGMsIDB4OTUzMCwgMHgwMDhlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMTI2LCAweDIwNzksIDB4MTllNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NTc5LAorCTB4MDgwYywgMHg5NjBmLCAweDA4MGMsIDB4NjgyMCwgMHgwMTJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDA5NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAxNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWU2LCAweDc2MjAsIDB4MjY2MCwgMHgyNjc4LAorCTB4OGNmZiwgMHgwOTA0LCAweDk0ZjUsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTIwNiwgMHgxOTA0LAorCTB4OTRmMCwgMHg4OGZmLCAweDAxMjAsIDB4NjA1YywgMHg5MTA2LCAweDE5MDQsIDB4OTRmMCwgMHg3MDMwLAorCTB4OWMwNiwgMHgxNTgwLCAweDIwNjksIDB4MDEwMCwgMHg2ODIwLCAweGQwYTQsIDB4MDExMCwgMHhkMGNjLAorCTB4MTUwOCwgMHgwODBjLCAweDg3ODAsIDB4MDgwYywgMHg5ZWQ0LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLAorCTB4YTNhYywgMHg3MDMzLCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LAorCTB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJhN2EsIDB4OTAwNiwgMHgwODBjLAorCTB4MmE3YSwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLAorCTB4MDAzZSwgMHgwMDQwLCAweDcwMDgsIDB4YzBhZCwgMHg3MDBhLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLAorCTB4MDgwNCwgMHg5NGYwLCAweDcwMjAsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYyMiwgMHg3MDFjLAorCTB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAxZSwgMHgwMDEwLAorCTB4NzAxZiwgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLAorCTB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDQ0LCAweGMwZmMsIDB4NjA0NiwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDFlOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxNTgwLAorCTB4MDgwYywgMHhjYjkxLCAweDExMTgsIDB4MDgwYywgMHhiNjkzLCAweDAwOTgsIDB4YTg2NywgMHgwMTAzLAorCTB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDAxNiwgMHgwMDM2LCAweDAwODYsIDB4MDgwYywgMHhjYzdmLAorCTB4MDgwYywgMHhlNzlkLCAweDA4MGMsIDB4NmRlZSwgMHgwMDhlLCAweDAwM2UsIDB4MDAxZSwgMHgwODBjLAorCTB4Y2I2YiwgMHgwODBjLCAweGFjZWIsIDB4MDgwYywgMHhhMjgyLCAweDAwY2UsIDB4MDgwNCwgMHg5NDY4LAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg5NDY4LCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDA1LAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTE1OCwgMHgwMDE2LCAweDAwMzYsIDB4MDA4NiwgMHgwODBjLAorCTB4ZTc5ZCwgMHgwODBjLCAweGUzZTgsIDB4MDA4ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDhkMCwgMHgwODBjLAorCTB4YjY5MywgMHg2MDIwLCAweDkwODYsIDB4MDAwMiwgMHgxMTYwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LAorCTB4MDA4NSwgMHgwMDBlLCAweDA5MDQsIDB4OTRkNiwgMHg5MDg2LCAweDAwOGIsIDB4MDkwNCwgMHg5NGQ2LAorCTB4MDg0MCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNSwgMHgxOTIwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LAorCTB4MDA4NSwgMHgwMDBlLCAweDA5YzgsIDB4OTA4NiwgMHgwMDhiLCAweDA5YjAsIDB4MDgwNCwgMHg5NGU5LAorCTB4MDAwNiwgMHgwMGY2LCAweDAwZTYsIDB4MDA5NiwgMHgwMGI2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDE2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTI4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwgMHgyMDc5LAorCTB4MTllNiwgMHg5MDM2LCAweDc4MjgsIDB4MjA2MCwgMHg4Y2ZmLCAweDA1MzgsIDB4NjAxMCwgMHg5YjA2LAorCTB4MTUwMCwgMHg2MDQzLCAweGZmZmYsIDB4MDgwYywgMHhhYjAwLCAweDAxZDgsIDB4NjEwYywgMHgwMDE2LAorCTB4MDgwYywgMHhhMDQyLCAweDYwMTQsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LAorCTB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDA4NiwgMHgwODBjLCAweGNjN2YsIDB4MDgwYywgMHhlNzlkLAorCTB4MDgwYywgMHg2ZGVlLCAweDAwOGUsIDB4MDAzZSwgMHgwMDFlLCAweDA4MGMsIDB4YWNlYiwgMHgwMGNlLAorCTB4MDhkOCwgMHgyYzMwLCAweDYwMGMsIDB4MjA2MCwgMHgwOGI4LCAweDA4MGMsIDB4NjgzZCwgMHgwMTJlLAorCTB4MDAxZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDllLCAweDAwZWUsIDB4MDBmZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDk2LCAweDAwMDYsIDB4MDA2NiwgMHgwMGM2LCAweDAwZDYsIDB4OTAzNiwgMHg3ODIwLAorCTB4OTA2NSwgMHgwOTA0LCAweDk1ZTIsIDB4NjAwYywgMHgwMDA2LCAweDYwNDQsIDB4YzBmYywgMHg2MDQ2LAorCTB4NjAwZiwgMHgwMDAwLCAweDc4MzAsIDB4OWMwNiwgMHgxNTk4LCAweDIwNjksIDB4MDEwMCwgMHg2ODIwLAorCTB4ZDBhNCwgMHgwMTEwLCAweGQwY2MsIDB4MTUwOCwgMHgwODBjLCAweDg3ODAsIDB4MDgwYywgMHg5ZWQ0LAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTNhYywgMHg3ODMzLCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLAorCTB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LAorCTB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMDU4LCAweDA4MGMsIDB4NmE3NSwgMHgxNTM4LAorCTB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4NzgwOCwgMHhjMGFkLCAweDc4MGEsIDB4MmMzMCwgMHgwMGY4LAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3OCwgMHgwMWIwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTUwOCwgMHgwODBjLCAweGNiOTEsIDB4MTExOCwgMHgwODBjLCAweGI2OTMsIDB4MDA2MCwgMHgwODBjLAorCTB4NmE3NSwgMHgxMTY4LCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLAorCTB4NmRlZSwgMHgwODBjLCAweGNiNmIsIDB4MDgwYywgMHhhY2ViLCAweDA4MGMsIDB4YTI4MiwgMHgwMDBlLAorCTB4MDgwNCwgMHg5NTgwLCAweDdlMjIsIDB4N2UxZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDBlLAorCTB4MDA5ZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhlM2U4LAorCTB4MGM1MCwgMHgwODBjLCAweGI2OTMsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE1MCwgMHg2MDA0LAorCTB4MDAwNiwgMHg5MDg2LCAweDAwODUsIDB4MDAwZSwgMHgwOTkwLCAweDkwODYsIDB4MDA4YiwgMHgwOTc4LAorCTB4MDhkMCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNSwgMHgxOWIwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LAorCTB4MDA4NSwgMHgwMDBlLCAweDBkMTgsIDB4OTA4NiwgMHgwMDhiLCAweDBkMDAsIDB4MDg2MCwgMHgwMDA2LAorCTB4MDA5NiwgMHgwMGI2LCAweDAwYzYsIDB4MDA2NiwgMHg5MDM2LCAweDc4MjgsIDB4OTA2NSwgMHgwNTEwLAorCTB4NjAxMCwgMHgyMDU4LCAweDYwMGMsIDB4MDAwNiwgMHgzZTA4LCAweDkxOGUsIDB4MDAwMiwgMHgxMTE4LAorCTB4YjgwMCwgMHhkMGJjLCAweDExYTgsIDB4NjA0MywgMHhmZmZmLCAweDA4MGMsIDB4YWIwMCwgMHgwMTgwLAorCTB4NjEwYywgMHgwODBjLCAweGEwNDIsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLAorCTB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwODBjLCAweGFjZWIsIDB4MDAwZSwgMHgwOGYwLAorCTB4MmMzMCwgMHgwY2UwLCAweDAwNmUsIDB4MDBjZSwgMHgwMGJlLCAweDAwOWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4MDA2NiwgMHgwODBjLCAweDYxYTQsIDB4MTFiMCwgMHgyMDcxLAorCTB4MTllNiwgMHg3MDMwLCAweDkwODAsIDB4MDAwNSwgMHgyMDA0LCAweDkwNGQsIDB4MDE3MCwgMHhhODc4LAorCTB4OTYwNiwgMHgxMTU4LCAweDIwNzEsIDB4MTllNiwgMHg3MDMwLCAweDkwMzUsIDB4MDEzMCwgMHg5MDgwLAorCTB4MDAwNSwgMHgyMDA0LCAweDk5MDYsIDB4MTEwOCwgMHgwMDI5LCAweDAwNmUsIDB4MDA5ZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwYzYsIDB4MjY2MCwgMHg2MDQzLCAweGZmZmYsIDB4MDgwYywgMHhhYjAwLAorCTB4MDE3OCwgMHgwODBjLCAweGEwNDIsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLAorCTB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4Y2M3ZiwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhhY2ViLAorCTB4MDBjZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwgMHgwMGM2LCAweDA4MGMsIDB4YTkxZSwgMHgwMTA2LAorCTB4MjA3MSwgMHgwMTAxLCAweDJlMDQsIDB4YzBjNCwgMHgyMDcyLCAweDYwNDQsIDB4ZDBmYywgMHgxMTM4LAorCTB4MDEwZSwgMHgwOTBjLCAweGE5M2EsIDB4MDBjZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDcxLAorCTB4MTllNiwgMHg3MDMwLCAweDkwMDUsIDB4MGRhMCwgMHg5YzA2LCAweDE5MGMsIDB4MGQ3ZCwgMHg3MDM2LAorCTB4MDgwYywgMHg4NzgwLCAweDcwMDQsIDB4OTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4OTZhOCwgMHg5NmFhLAorCTB4OTZiMSwgMHg5NmJiLCAweDk2YzksIDB4OTZhOCwgMHg5NmI2LCAweDk2YTYsIDB4MDgwYywgMHgwZDdkLAorCTB4MDQyOCwgMHgwMDA1LCAweDA4MGMsIDB4YWFlYiwgMHg3MDA3LCAweDAwMDAsIDB4NzAzMywgMHgwMDAwLAorCTB4MDBlOCwgMHgwMDY2LCAweDkwMzYsIDB4MDgwYywgMHhhMDQyLCAweDAwNmUsIDB4NzAwNywgMHgwMDAwLAorCTB4NzAzMywgMHgwMDAwLCAweDAwOTgsIDB4MDgwYywgMHhhYWQ2LCAweDAxNDAsIDB4MDgwYywgMHhhYWViLAorCTB4MDEyOCwgMHgwMDY2LCAweDkwMzYsIDB4MDgwYywgMHhhMDQyLCAweDAwNmUsIDB4NzAzMywgMHgwMDAwLAorCTB4MDAyOCwgMHgwODBjLCAweGFhZDYsIDB4MDgwYywgMHhhM2FjLCAweDAwMDAsIDB4MDEwZSwgMHgwOTBjLAorCTB4YTkzYSwgMHgwMGNlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwODBjLAorCTB4YTkxZSwgMHgwMTA2LCAweDYwNDQsIDB4ZDBmYywgMHgxMTMwLCAweDAxMGUsIDB4MDkwYywgMHhhOTNhLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4MjA2OSwgMHgxOWU2LCAweDY4NGMsIDB4OTAwNSwgMHgwZGE4LAorCTB4OWMwNiwgMHgxOTBjLCAweDBkN2QsIDB4Njg1MiwgMHgwMGU2LCAweDJkNzAsIDB4MDgwYywgMHg5MzAwLAorCTB4MDBlZSwgMHgwODBjLCAweDg3OGQsIDB4MDAxNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMjBhLAorCTB4MDAxZSwgMHg2ODNjLCAweDkwODQsIDB4MDAwMywgMHgwMDAyLCAweDk3MDMsIDB4OTcwNCwgMHg5NzIyLAorCTB4OTcwMSwgMHgwODBjLCAweDBkN2QsIDB4MDQ2MCwgMHg2ODY4LCAweDkwODYsIDB4MDAwMSwgMHgwMTkwLAorCTB4NjAwYywgMHg5MDE1LCAweDAxNjAsIDB4NmE0YSwgMHg2MDBmLCAweDAwMDAsIDB4NjA0NCwgMHhjMGZjLAorCTB4NjA0NiwgMHg5MDA2LCAweDcwNDIsIDB4Njg0ZSwgMHg2ODNmLCAweDAwMDAsIDB4MDBjOCwgMHg2ODRhLAorCTB4Njg0NiwgMHgwY2EwLCAweDY4NmIsIDB4MDAwMCwgMHg2ODQ4LCAweDkwNjUsIDB4MGQ3OCwgMHg2MDAzLAorCTB4MDAwMiwgMHgwYzYwLCAweDkwMDYsIDB4Njg2YSwgMHg2ODUyLCAweDY4NmUsIDB4NjAwYywgMHg5MDE1LAorCTB4MDEyMCwgMHg2YTRhLCAweDYwMGYsIDB4MDAwMCwgMHgwMDE4LCAweDY4NGUsIDB4Njg0YSwgMHg2ODQ2LAorCTB4Njg0ZiwgMHgwMDAwLCAweDAxMGUsIDB4MDkwYywgMHhhOTNhLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDAwNSwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDBiLCAweDAwMDUsIDB4OTc0ZSwgMHg5NzUxLAorCTB4OWJiZiwgMHg5YzU4LCAweDk3NTEsIDB4OWJiZiwgMHg5YzU4LCAweDk3NGUsIDB4OTc1MSwgMHg5NzRlLAorCTB4OTc0ZSwgMHg5NzRlLCAweDk3NGUsIDB4OTc0ZSwgMHg5NzRlLCAweDk3NGUsIDB4MDgwYywgMHg5NjdhLAorCTB4MDAwNSwgMHgwMGI2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxYzYsIDB4MDFkNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2OSwgMHgwMjAwLCAweDIwNzEsIDB4MDI0MCwgMHg2MDA0LAorCTB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGQ3ZCwgMHg2MTEwLCAweDIxNTgsIDB4Yjk4NCwgMHgyYzc4LAorCTB4MjA2MSwgMHgwMTAwLCAweDYxOWEsIDB4OTA4YSwgMHgwMDQwLCAweDFhMDQsIDB4OTdiZCwgMHgwMDViLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMWRlLCAweDAxY2UsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDE1ZSwgMHgwMGJlLCAweDAwMDUsIDB4OTk0MiwgMHg5OTdkLCAweDk5YTYsIDB4OWE0ZSwgMHg5YTcwLAorCTB4OWE3NiwgMHg5YTgzLCAweDlhOGIsIDB4OWE5NywgMHg5YTlkLCAweDlhYWUsIDB4OWE5ZCwgMHg5YjA2LAorCTB4OWE4YiwgMHg5YjEyLCAweDliMTgsIDB4OWE5NywgMHg5YjE4LCAweDliMjQsIDB4OTdiYiwgMHg5N2JiLAorCTB4OTdiYiwgMHg5N2JiLCAweDk3YmIsIDB4OTdiYiwgMHg5N2JiLCAweDk3YmIsIDB4OTdiYiwgMHg5N2JiLAorCTB4OTdiYiwgMHhhMDYzLCAweGEwODYsIDB4YTA5NywgMHhhMGI3LCAweGEwZTksIDB4OWE4MywgMHg5N2JiLAorCTB4OWE4MywgMHg5YTlkLCAweDk3YmIsIDB4OTlhNiwgMHg5YTRlLCAweDk3YmIsIDB4YTRhYSwgMHg5YTlkLAorCTB4OTdiYiwgMHhhNGM2LCAweDlhOWQsIDB4OTdiYiwgMHg5YTk3LCAweDk5M2MsIDB4OTdkZSwgMHg5N2JiLAorCTB4YTRlMiwgMHhhNTRmLCAweGE2MzMsIDB4OTdiYiwgMHhhNjQwLCAweDlhODAsIDB4YTY2YiwgMHg5N2JiLAorCTB4YTBmMywgMHhhNjc3LCAweDk3YmIsIDB4MDgwYywgMHgwZDdkLCAweDIxMDAsIDB4MDA1YiwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDBiZSwgMHgwMDA1LCAweGE3MTcsIDB4YTdjOSwgMHg5N2RjLCAweDk4MDUsIDB4OThiMSwgMHg5OGJjLAorCTB4OTdkYywgMHg5YTgzLCAweDk3ZGMsIDB4OTkwMywgMHg5OTBmLCAweDk4MjAsIDB4OTdkYywgMHg5ODNiLAorCTB4OTg2ZiwgMHhhYjU2LCAweGFiOWIsIDB4OWE5ZCwgMHgwODBjLCAweDBkN2QsIDB4MDBkNiwgMHgwMDk2LAorCTB4MDgwYywgMHg5YjM3LCAweDcwMDMsIDB4MjQxNCwgMHg3MDA3LCAweDAwMTgsIDB4NzAwYiwgMHgwODAwLAorCTB4NzgxNCwgMHgyMDQ4LCAweGE4M2MsIDB4NzAwZSwgMHhhODUwLCAweDcwMjIsIDB4YTg1NCwgMHg3MDI2LAorCTB4NjBjMywgMHgwMDE4LCAweDA4MGMsIDB4OWVhNCwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHg3ODEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHgwODBjLCAweGFiZTIsIDB4MTExOCwgMHg5MDg0LAorCTB4ZmY4MCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZDYsIDB4MDA5NiwgMHgwODBjLAorCTB4OWIzNywgMHg3MDAzLCAweDA1MDAsIDB4NzgxNCwgMHgyMDQ4LCAweGE4NzQsIDB4NzAwYSwgMHhhODc4LAorCTB4NzAwZSwgMHhhODdjLCAweDcwMTIsIDB4YTg4MCwgMHg3MDE2LCAweGE4ODQsIDB4NzAxYSwgMHhhODg4LAorCTB4NzAxZSwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg5ZWE0LCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMDk2LCAweDA4MGMsIDB4OWIzNywgMHg3MDAzLCAweDA1MDAsIDB4NzgxNCwgMHgyMDQ4LAorCTB4YThjYywgMHg3MDBhLCAweGE4ZDAsIDB4NzAwZSwgMHhhOGQ0LCAweDcwMTIsIDB4YThkOCwgMHg3MDE2LAorCTB4YThkYywgMHg3MDFhLCAweGE4ZTAsIDB4NzAxZSwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg5ZWE0LAorCTB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg5YjM3LCAweDIwZTksIDB4MDAwMCwgMHgyMDAxLCAweDE5YTIsIDB4MjAwMywgMHgwMDAwLAorCTB4NzgxNCwgMHgyMDQ4LCAweGE4MTQsIDB4ODAwMywgMHg2MGMyLCAweGE4MzAsIDB4MjBhOCwgMHhhODYwLAorCTB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMDk4LCAweDIwMDEsIDB4MTlhMiwgMHgwMDE2LAorCTB4MjAwYywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyMWVmLCAweDA4MGMsIDB4ZDcyYiwgMHg5MDA2LAorCTB4MDgwYywgMHgyMWVmLCAweDAwMWUsIDB4YTgwNCwgMHg5MDA1LCAweDAxMTAsIDB4MjA0OCwgMHgwYzI4LAorCTB4MDRkOSwgMHgwODBjLCAweDllYTQsIDB4MDEyZSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDliODIsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjAwMSwgMHgxOWEyLCAweDIwMDMsIDB4MDAwMCwgMHg3ODE0LCAweDIwNDgsIDB4YTg2ZiwgMHgwMjAwLAorCTB4YTg3MywgMHgwMDAwLCAweGE4MTQsIDB4ODAwMywgMHg2MGMyLCAweGE4MzAsIDB4MjBhOCwgMHhhODYwLAorCTB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMDk4LCAweDIwMDEsIDB4MTlhMiwgMHgwMDE2LAorCTB4MjAwYywgMHgwODBjLCAweGQ3MmIsIDB4MDAxZSwgMHhhODA0LCAweDkwMDUsIDB4MDExMCwgMHgyMDQ4LAorCTB4MGM2MCwgMHgwMDUxLCAweDc4MTQsIDB4MjA0OCwgMHgwODBjLCAweDBmZjksIDB4MDgwYywgMHg5ZWE0LAorCTB4MDEyZSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHg2MGMwLCAweDgwMDQsIDB4OTA4NCwgMHgwMDAzLAorCTB4OTAwNSwgMHgwMTMwLCAweDkwODIsIDB4MDAwNCwgMHgyMGEzLCAweDAwMDAsIDB4ODAwMCwgMHgxZGUwLAorCTB4MDAwNSwgMHgwODBjLCAweDliMzcsIDB4NzAwMywgMHg3ODAwLCAweDc4MDgsIDB4ODAwNywgMHg3MDBhLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwgMHgwMGQ2LCAweDAwZTYsIDB4MDgwYywgMHg5YjgyLAorCTB4NzgxNCwgMHg5MDg0LCAweGZmMDAsIDB4MjA3MywgMHgwMjAwLCAweDhlNzAsIDB4OGU3MCwgMHg5MDk1LAorCTB4MDAxMCwgMHgyMjcyLCAweDhlNzAsIDB4MjA3MywgMHgwMDM0LCAweDhlNzAsIDB4MjA2OSwgMHgxODA1LAorCTB4MjBhOSwgMHgwMDA0LCAweDJkNzYsIDB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsIDB4OThkMiwgMHgyMDY5LAorCTB4MTgwMSwgMHgyMGE5LCAweDAwMDQsIDB4MmQ3NiwgMHg4ZDY4LCAweDhlNzAsIDB4MWYwNCwgMHg5OGRiLAorCTB4MjA2OSwgMHgxOWIyLCAweDkwODYsIDB4ZGYwMCwgMHgwMTEwLCAweDIwNjksIDB4MTljYywgMHgyMGE5LAorCTB4MDAxYSwgMHg5ZTg2LCAweDAyNjAsIDB4MTE0OCwgMHgwMGM2LCAweDIwNjEsIDB4MDIwMCwgMHg2MDEwLAorCTB4ODAwMCwgMHg2MDEyLCAweDAwY2UsIDB4MjA3MSwgMHgwMjQwLCAweDJkMDQsIDB4ODAwNywgMHgyMDcyLAorCTB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsIDB4OThlOSwgMHg2MGMzLCAweDAwNGMsIDB4MDgwYywgMHg5ZWE0LAorCTB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg5YjM3LCAweDcwMDMsIDB4NjMwMCwgMHg3MDA3LAorCTB4MDAyOCwgMHg3ODA4LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwgMHgwMGQ2LAorCTB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAyMDAsIDB4NzgxNCwgMHg3MDBlLAorCTB4MDBlNiwgMHg5ZWYwLCAweDAwMDQsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDAwYywgMHgyMDY5LAorCTB4MTkyMywgMHg2ODEwLCAweGQwODQsIDB4MTE0OCwgMHgyMDczLCAweDA1MDAsIDB4OGU3MCwgMHgyMDczLAorCTB4MDAwMCwgMHg4ZTcwLCAweDgxMDgsIDB4OTI5MCwgMHgwMDA0LCAweDIwNzMsIDB4MDgwMCwgMHg4ZTcwLAorCTB4MjA3MywgMHgwMDAwLCAweDAwZWUsIDB4NzIwNiwgMHg3MTBhLCAweDYyYzIsIDB4MDgwYywgMHg5ZWE0LAorCTB4MDAxZSwgMHgwMDJlLCAweDAwZGUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwgMHg2MDlhLAorCTB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWIzNywgMHg3MDAzLCAweDUyMDAsIDB4MjA2OSwgMHgxODQ3LAorCTB4NjgwNCwgMHhkMDg0LCAweDAxMzAsIDB4NjgyOCwgMHgwMDE2LCAweDA4MGMsIDB4MjY5NCwgMHg3MTBlLAorCTB4MDAxZSwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNTAsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHgxODAxLAorCTB4MjBhMSwgMHgwMjU0LCAweDQwMDMsIDB4MDgwYywgMHhhYmUyLCAweDExMjAsIDB4YjhhMCwgMHg5MDgyLAorCTB4MDA3ZiwgMHgwMjQ4LCAweDIwMDEsIDB4MTgxZiwgMHgyMDA0LCAweDcwMzIsIDB4MjAwMSwgMHgxODIwLAorCTB4MjAwNCwgMHg3MDM2LCAweDAwMzAsIDB4MjAwMSwgMHgxODE4LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4NzAzNiwgMHg2MGMzLCAweDAwMWMsIDB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWIzNywgMHg3MDAzLAorCTB4MDUwMCwgMHgwODBjLCAweGFiZTIsIDB4MTEyMCwgMHhiOGEwLCAweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LAorCTB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4NzAwYSwgMHgyMDAxLCAweDE4MjAsIDB4MjAwNCwgMHg3MDBlLAorCTB4MDAzMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4NzAwZSwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLAorCTB4MDI1MCwgMHg0MDAzLCAweDYwYzMsIDB4MDAxMCwgMHgwODA0LCAweDllYTQsIDB4MDgwYywgMHg5YjM3LAorCTB4OTAwNiwgMHgwODBjLCAweDZhYTcsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTEzMCwgMHg3MDAzLAorCTB4MDQwMCwgMHg2MjBjLCAweGMyYjQsIDB4NjIwZSwgMHgwMDU4LCAweDc4MTQsIDB4MDA5NiwgMHg5MDRkLAorCTB4MDEyMCwgMHg5MDA2LCAweGE4OWEsIDB4YThhNiwgMHhhOGFhLCAweDAwOWUsIDB4NzAwMywgMHgwMzAwLAorCTB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTkwNCwgMHg5YTE1LCAweDAwZDYsIDB4MjA2OSwgMHgxOTZiLAorCTB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4ZDBhNCwgMHgwMTg4LCAweDY4MDAsIDB4NzAwYSwgMHg2ODA4LAorCTB4OTA4NCwgMHgyMDAwLCAweDcwMTIsIDB4MDgwYywgMHhhYmY5LCAweDY4MGMsIDB4NzAxNiwgMHg3MDFmLAorCTB4MjcxMCwgMHg2ODE4LCAweDcwMjIsIDB4NjgxYywgMHg3MDI2LCAweDAwOTAsIDB4NjgwMCwgMHg3MDBhLAorCTB4NjgwNCwgMHg3MDBlLCAweDY4MDgsIDB4MDgwYywgMHg3NTNkLCAweDExMTgsIDB4OTA4NCwgMHgzN2ZmLAorCTB4MDAxMCwgMHg5MDg0LCAweDNmZmYsIDB4NzAxMiwgMHgwODBjLCAweGFiZjksIDB4NjgwYywgMHg3MDE2LAorCTB4MDBkZSwgMHgyMGE5LCAweDAwMDQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTgwNSwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNTYsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHgxODAxLAorCTB4MjBhMSwgMHgwMjVhLCAweDQwMDMsIDB4MDBkNiwgMHgwODBjLCAweGE2ZmUsIDB4MjA2OSwgMHgxOTczLAorCTB4MjA3MSwgMHgwMjRlLCAweDY4MDAsIDB4YzBkZCwgMHg3MDAyLCAweDA4MGMsIDB4NTc0MiwgMHhkMGU0LAorCTB4MDExMCwgMHg2ODBjLCAweDcwMGUsIDB4MDBkZSwgMHgwNGE4LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LAorCTB4ZDBhNCwgMHgwMTcwLCAweDAwMTYsIDB4MjAwMSwgMHgxOTZjLCAweDIwMGMsIDB4NjBlMCwgMHg5MTA2LAorCTB4MDEzMCwgMHgyMTAwLCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLCAweDI2ZDUsIDB4NjFlMiwgMHgwMDFlLAorCTB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTk2YiwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLAorCTB4MjBhOSwgMHgwMDA4LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4MTgwNSwgMHgyMGExLAorCTB4MDI1NiwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweDE4MDEsIDB4MjBhMSwgMHgwMjVhLAorCTB4NDAwMywgMHgwODBjLCAweGE2ZmUsIDB4MjBhMSwgMHgwMjRlLCAweDIwYTksIDB4MDAwOCwgMHgyMDk5LAorCTB4MTk3MywgMHg0MDAzLCAweDYwYzMsIDB4MDA3NCwgMHgwODA0LCAweDllYTQsIDB4MDgwYywgMHg5YjM3LAorCTB4NzAwMywgMHgyMDEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBiLCAweDA4MDAsIDB4NzAwZiwgMHgyMDAwLAorCTB4OTAwNiwgMHgwMGY2LCAweDIwNzksIDB4MTg0NywgMHg3OTA0LCAweDAwZmUsIDB4ZDFhYywgMHgxMTEwLAorCTB4OTA4NSwgMHgwMDIwLCAweGQxYTQsIDB4MDExMCwgMHg5MDg1LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAyLAorCTB4MDBkNiwgMHgwODA0LCAweDlhZTcsIDB4NzAyNiwgMHg2MGMzLCAweDAwMTQsIDB4MDgwNCwgMHg5ZWE0LAorCTB4MDgwYywgMHg5YjM3LCAweDcwMDMsIDB4NTAwMCwgMHgwODA0LCAweDk5YzAsIDB4MDgwYywgMHg5YjM3LAorCTB4NzAwMywgMHgyMTEwLCAweDcwMDcsIDB4MDAxNCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwNCwgMHg5ZWE0LAorCTB4MDgwYywgMHg5Yjc5LCAweDAwMTAsIDB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDIwMCwgMHg2MGMzLAorCTB4MDAwNCwgMHgwODA0LCAweDllYTQsIDB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLAorCTB4MDAwMywgMHg3MDBmLCAweDJhMDAsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwgMHgwODBjLAorCTB4OWI4MiwgMHg3MDAzLCAweDAyMDAsIDB4MDgwNCwgMHg5OWMwLCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLAorCTB4MDEwMCwgMHg3ODJjLCAweDkwMDUsIDB4MDExMCwgMHg3MDBhLCAweDAwMTAsIDB4NzAwYiwgMHgwMDAzLAorCTB4NzgxNCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDBkNiwgMHgwODBjLAorCTB4OWI4MiwgMHg3MDAzLCAweDAyMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGIsIDB4MDgwMCwgMHhiODk0LAorCTB4OTA4NiwgMHgwMDE0LCAweDExOTgsIDB4Yjk5YywgMHg5MTg0LCAweDAwMzAsIDB4MDE5MCwgMHhiOTk4LAorCTB4OTE4NCwgMHhjMDAwLCAweDExNDAsIDB4ZDFlYywgMHgwMTE4LCAweDcwMGYsIDB4MjEwMCwgMHgwMDU4LAorCTB4NzAwZiwgMHgwMTAwLCAweDAwNDAsIDB4NzAwZiwgMHgwNDAwLCAweDAwMjgsIDB4NzAwZiwgMHgwNzAwLAorCTB4MDAxMCwgMHg3MDBmLCAweDA4MDAsIDB4MDBmNiwgMHgyMDc5LCAweDE4NDcsIDB4NzkwNCwgMHgwMGZlLAorCTB4ZDFhYywgMHgxMTEwLCAweDkwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAxMTAsIDB4OTA4NSwgMHgwMDEwLAorCTB4MjAwOSwgMHgxODY5LCAweDIxMGMsIDB4ZDE4NCwgMHgxMTEwLCAweDkwODUsIDB4MDAwMiwgMHgwMDI2LAorCTB4MjAwOSwgMHgxODY3LCAweDIxMGMsIDB4ZDFlNCwgMHgwMTUwLCAweGMwYzUsIDB4YmFkNCwgMHhkMjhjLAorCTB4MTEwOCwgMHhjMGNkLCAweDkwOTQsIDB4MDAzMCwgMHg5Mjk2LCAweDAwMTAsIDB4MDE0MCwgMHhkMWVjLAorCTB4MDEzMCwgMHg5MDk0LCAweDAwMzAsIDB4OTI5NiwgMHgwMDEwLCAweDAxMDgsIDB4YzBiZCwgMHgwMDJlLAorCTB4NzAyNiwgMHg2MGMzLCAweDAwMTQsIDB4MDBkZSwgMHgwODA0LCAweDllYTQsIDB4MDgwYywgMHg5YjgyLAorCTB4NzAwMywgMHgwMjEwLCAweDcwMDcsIDB4MDAxNCwgMHg3MDBmLCAweDAxMDAsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwNCwgMHg5ZWE0LCAweDA4MGMsIDB4OWI4MiwgMHg3MDAzLCAweDAyMDAsIDB4MDgwNCwgMHg5OTQ2LAorCTB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLCAweDAwMDMsIDB4NzAwZiwgMHgyYTAwLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwgMHgwODBjLCAweDliODIsIDB4NzAwMywgMHgwMTAwLAorCTB4NzAwYiwgMHgwMDBiLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDAyNiwgMHgwMGQ2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MzIwMCwgMHgyMDIxLCAweDA4MDAsIDB4MDA0MCwgMHgwMDI2LAorCTB4MDBkNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgyMjAwLCAweDIwMjEsIDB4MDEwMCwgMHgwODBjLAorCTB4YTcxMywgMHhiODEwLCAweDkzMDUsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLAorCTB4Njg3YywgMHg3MDBhLCAweDY4ODAsIDB4NzAwZSwgMHg5NDg1LCAweDAwMjksIDB4NzAxMiwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMGRlLCAweDA4MGMsIDB4OWU5OCwgMHg3MjFhLCAweDlmOTUsIDB4MDAwMCwgMHg3MjIyLAorCTB4NzAyNywgMHhmZmZmLCAweDIwNzEsIDB4MDI0YywgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwgMHgwODBjLAorCTB4YTcxMywgMHg3MDAzLCAweDAyZmYsIDB4NzAwNywgMHhmZmZjLCAweDAwZDYsIDB4MjA2OSwgMHgxODAwLAorCTB4Njg3YywgMHg3MDBhLCAweDY4ODAsIDB4NzAwZSwgMHgwMGRlLCAweDcwMTMsIDB4MjAyOSwgMHgwYzEwLAorCTB4NzAwMywgMHgwMTAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDBiLCAweGZjMDIsIDB4NzAwZiwgMHgwMDAwLAorCTB4MDAwNSwgMHgwMDI2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MzMwMCwgMHgyMDIxLAorCTB4MDgwMCwgMHgwMDQwLCAweDAwMjYsIDB4MDBkNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgyMzAwLAorCTB4MjAyMSwgMHgwMTAwLCAweDA4MGMsIDB4YTcxMywgMHhiODEwLCAweDkzMDUsIDB4NzAwMiwgMHhiODE0LAorCTB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4YjgxMCwgMHg5MDA1LCAweDExNDAsIDB4YjgxNCwgMHg5MDA1LAorCTB4MTEyOCwgMHg3MDBiLCAweDAwZmYsIDB4NzAwZiwgMHhmZmZlLCAweDAwMjAsIDB4Njg3YywgMHg3MDBhLAorCTB4Njg4MCwgMHg3MDBlLCAweDAwMDAsIDB4OTQ4NSwgMHgwMDk4LCAweDcwMTIsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDBkZSwgMHgwODBjLCAweDllOTgsIDB4NzIxYSwgMHg3YTA4LCAweDcyMjIsIDB4MmYxMCwgMHg3MjI2LAorCTB4MjA3MSwgMHgwMjRjLCAweDAwMmUsIDB4MDAwNSwgMHgwODBjLCAweDllOTgsIDB4NzIxYSwgMHg3YTA4LAorCTB4NzIyMiwgMHg3ODE0LCAweDcwMjYsIDB4MjA3MSwgMHgwMjRjLCAweDAwMmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDY5LCAweDAyMDAsIDB4MjA3MSwgMHgwMjQwLAorCTB4NjAwNCwgMHg5MDhhLCAweDAwODUsIDB4MGEwYywgMHgwZDdkLCAweDkwOGEsIDB4MDA5MiwgMHgxYTBjLAorCTB4MGQ3ZCwgMHg2MTEwLCAweDIxNTgsIDB4Yjk4NCwgMHgyYzc4LCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLAorCTB4OTA4MiwgMHgwMDg1LCAweDAwMzMsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLAorCTB4MDAwNSwgMHg5YmYwLCAweDliZmYsIDB4OWMwYSwgMHg5YmVlLCAweDliZWUsIDB4OWJlZSwgMHg5YmYwLAorCTB4OWJlZSwgMHg5YmVlLCAweDliZWUsIDB4OWJlZSwgMHg5YmVlLCAweDliZWUsIDB4MDgwYywgMHgwZDdkLAorCTB4MDQxMSwgMHg2MGMzLCAweDAwMDAsIDB4MDAyNiwgMHgwODBjLCAweDI5ZTUsIDB4MDIyOCwgMHgyMDExLAorCTB4MDEwMSwgMHgyMjA0LCAweGMwYzUsIDB4MjAxMiwgMHgwMDJlLCAweDA4MDQsIDB4OWVhNCwgMHgwNDMxLAorCTB4NzgwOCwgMHg3MDBhLCAweDc4MTQsIDB4NzAwZSwgMHg3MDE3LCAweGZmZmYsIDB4NjBjMywgMHgwMDBjLAorCTB4MDgwNCwgMHg5ZWE0LCAweDA0YTEsIDB4NzAwMywgMHgwMDAzLCAweDcwMDcsIDB4MDMwMCwgMHg2MGMzLAorCTB4MDAwNCwgMHgwODA0LCAweDllYTQsIDB4MDAyNiwgMHgwODBjLCAweGE3MTMsIDB4YjgxMCwgMHg5MDg1LAorCTB4ODEwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4Njg3YywgMHg3MDBhLAorCTB4Njg4MCwgMHg3MDBlLCAweDcwMTMsIDB4MDAwOSwgMHgwODA0LCAweDliNTIsIDB4MDAyNiwgMHgwODBjLAorCTB4YTcxMywgMHhiODEwLCAweDkwODUsIDB4ODQwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LAorCTB4MTgwMCwgMHg2ODdjLCAweDcwMGEsIDB4Njg4MCwgMHg3MDBlLCAweDIwMDEsIDB4MDA5OSwgMHg3YTIwLAorCTB4OTI5NiwgMHgwMDA1LCAweDAxMDgsIDB4YzBiYywgMHg3MDEyLCAweDA4MDQsIDB4OWJiNCwgMHgwMDI2LAorCTB4MDgwYywgMHhhNzEzLCAweGI4MTAsIDB4OTA4NSwgMHg4NTAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LAorCTB4MjA2OSwgMHgxODAwLCAweDY4N2MsIDB4NzAwYSwgMHg2ODgwLCAweDcwMGUsIDB4MjAwMSwgMHgwMDk5LAorCTB4N2EyMCwgMHg5Mjk2LCAweDAwMDUsIDB4MDEwOCwgMHhjMGJjLCAweDcwMTIsIDB4MDgwNCwgMHg5YmI0LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDJjNzgsIDB4MjA2OSwgMHgwMjAwLAorCTB4MjA3MSwgMHgwMjQwLCAweDc4MDQsIDB4OTA4YSwgMHgwMDQwLCAweDBhMGMsIDB4MGQ3ZCwgMHg5MDhhLAorCTB4MDA1NywgMHgxYTBjLCAweDBkN2QsIDB4NzkxMCwgMHgyMTU4LCAweGI5ODQsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjE5YSwgMHg5MDgyLCAweDAwNDAsIDB4MDAzMywgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMDA1LCAweDljOGQsIDB4OWM4ZCwgMHg5YzhkLCAweDljYjMsIDB4OWM4ZCwgMHg5YzhkLAorCTB4OWM4ZCwgMHg5YzhkLCAweDljOGQsIDB4OWM4ZCwgMHg5YzhkLCAweGEyNWYsIDB4YTI2NywgMHhhMjZmLAorCTB4YTI3NywgMHg5YzhkLCAweDljOGQsIDB4OWM4ZCwgMHhhMjU3LCAweDA4MGMsIDB4MGQ3ZCwgMHg2ODEzLAorCTB4MDAwOCwgMHhiYThjLCAweDgyMTAsIDB4YjhkNCwgMHhkMDg0LCAweDAxMjgsIDB4N2E1MiwgMHg3YjE0LAorCTB4N2I0ZSwgMHg3MjJlLCAweDczMmEsIDB4OTI5NCwgMHgwMGZmLCAweGJhOGUsIDB4ODIxNywgMHg3MjFhLAorCTB4YmExMCwgMHg5Mjk1LCAweDA2MDAsIDB4NzIwMiwgMHhiYTE0LCAweDcyMDYsIDB4MjA2OSwgMHgxODAwLAorCTB4NmE3YywgMHg3MjBhLCAweDZhODAsIDB4NzIwZSwgMHg3MDEzLCAweDA4MjksIDB4MmYxMCwgMHg3MjIyLAorCTB4NzAyNywgMHhmZmZmLCAweDAwMDUsIDB4MDAxNiwgMHg3ODE0LCAweDkwODQsIDB4MDcwMCwgMHg4MDA3LAorCTB4MDAxMywgMHgwMDFlLCAweDAwMDUsIDB4OWNjMywgMHg5Y2MzLCAweDljYzUsIDB4OWNjMywgMHg5Y2MzLAorCTB4OWNjMywgMHg5Y2RmLCAweDljYzMsIDB4MDgwYywgMHgwZDdkLCAweDc5MTQsIDB4OTE4YywgMHgwOGZmLAorCTB4OTE4ZCwgMHhmNjAwLCAweDc5MTYsIDB4MjAwOSwgMHgwMDAzLCAweDAwYjksIDB4MjA2OSwgMHgxODQ3LAorCTB4NjgwNCwgMHhkMGJjLCAweDAxMzAsIDB4NjgyYywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNywgMHg3MDMyLAorCTB4MDAxMCwgMHg3MDMzLCAweDNmMDAsIDB4NjBjMywgMHgwMDAxLCAweDA4MDQsIDB4OWVhNCwgMHgyMDA5LAorCTB4MDAwMywgMHgwMDE5LCAweDcwMzMsIDB4N2YwMCwgMHgwY2IwLCAweDAwMTYsIDB4MDgwYywgMHhhNzEzLAorCTB4MDAxZSwgMHhiODEwLCAweDkwODUsIDB4MDEwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LAorCTB4MTgwMCwgMHg2YTdjLCAweDcyMGEsIDB4NmE4MCwgMHg3MjBlLCAweDcwMTMsIDB4MDg4OCwgMHg5MThkLAorCTB4MDAwOCwgMHg3MTE2LCAweDA4MGMsIDB4OWU5OCwgMHg3MjFhLCAweDdhMDgsIDB4NzIyMiwgMHgyZjEwLAorCTB4NzIyNiwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDU2LAorCTB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzE2MCwgMHg3ODEwLAorCTB4MjA1OCwgMHg3NmRjLCAweDk2YjQsIDB4MDAyOCwgMHgwMTEwLCAweDczN2MsIDB4NzQ4MCwgMHgyNTAwLAorCTB4NzZkYywgMHg5NmI0LCAweDAwMjgsIDB4MDE0MCwgMHgyMDAxLCAweDA0ZmYsIDB4NjA2MiwgMHg2MDY3LAorCTB4ZmZmZiwgMHg2MzZhLCAweDY0NmUsIDB4MDA1MCwgMHgyMDAxLCAweDAwZmYsIDB4OTA4NSwgMHgwNDAwLAorCTB4NjA2MiwgMHg2MDY3LCAweGZmZmYsIDB4NjA2YiwgMHgwMDAwLCAweDYxNmUsIDB4YjhiOCwgMHg2MDczLAorCTB4MDUzMCwgMHg2MDc3LCAweDAwMDgsIDB4Yjg4YywgMHg4MDAwLCAweDkwODQsIDB4MDBmZiwgMHhiODhlLAorCTB4ODAwNywgMHg5MDg1LCAweDAwMjAsIDB4NjA3YSwgMHg2MDdmLCAweDAwMDAsIDB4MmIwMCwgMHg2MDgyLAorCTB4NjA4NywgMHhmZmZmLCAweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4NDgsIDB4NjA4YSwgMHhhODQ0LAorCTB4NjA4ZSwgMHhhODM4LCAweDYwYzYsIDB4YTgzNCwgMHg2MGNhLCAweDAwOWUsIDB4Yjg2YywgMHg2MGNlLAorCTB4NjBhYiwgMHgwMDM2LCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4MjAwMSwgMHgxODM3LAorCTB4MjAwNCwgMHg5MDg0LCAweDAwMjgsIDB4MDEyOCwgMHg2MDlmLCAweDAwMDAsIDB4MjAwMSwgMHgwMDkyLAorCTB4MDA1OCwgMHg2MDI4LCAweGMwYmQsIDB4NjAyYSwgMHg2MDlmLCAweDAwZmYsIDB4MjAxMSwgMHhmZmZmLAorCTB4MDgwYywgMHgyYWI0LCAweDIwMDEsIDB4MDBiMiwgMHgyMDEwLCAweDkwMGUsIDB4MDgwYywgMHgyYWMzLAorCTB4MjAwOSwgMHgwN2QwLCAweDA4MGMsIDB4ODc4NSwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDBjNiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MTYwLCAweDc4MTAsIDB4MjA1OCwgMHhiOGEwLCAweDIwMjgsIDB4NzZkYywgMHhkNmFjLAorCTB4MTE2OCwgMHg5NTgyLCAweDAwN2UsIDB4MTI1MCwgMHgyNTAwLCAweDkwOTQsIDB4ZmY4MCwgMHgxMTMwLAorCTB4OTA4MCwgMHgzM2I5LCAweDIwMTUsIDB4OTI5NCwgMHgwMGZmLCAweDAwMjAsIDB4YjkxMCwgMHhiYTE0LAorCTB4NzM3YywgMHg3NDgwLCAweDcwZGMsIDB4ZDBhYywgMHgxMTMwLCAweDk1ODIsIDB4MDA3ZSwgMHgxMjE4LAorCTB4OTU4NCwgMHhmZjgwLCAweDAxMzgsIDB4OTE4NSwgMHgwNDAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLAorCTB4NjQ2ZSwgMHgwMDMwLCAweDYwNjMsIDB4MDQwMCwgMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2MTZlLAorCTB4YjhiOCwgMHg2MDcyLCAweDYwNzcsIDB4MDAwMCwgMHhiODY0LCAweGQwYTQsIDB4MDExMCwgMHg2MDc3LAorCTB4MDAwOCwgMHhiODhjLCAweDgwMDAsIDB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywgMHg5MDg1LAorCTB4MDAyMCwgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyYjAwLCAweDYwODIsIDB4NjA4NywgMHhmZmZmLAorCTB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg0OCwgMHg2MDhhLCAweGE4NDQsIDB4NjA4ZSwgMHhhODM4LAorCTB4NjBjNiwgMHhhODM0LCAweDYwY2EsIDB4MDA5ZSwgMHhiODZjLCAweDYwY2UsIDB4NjBhYiwgMHgwMDM2LAorCTB4NjBhZiwgMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhiYTg0LCAweDYyOWUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDE0MCwgMHg3ODAzLCAweDAwMDAsIDB4MDBmZSwgMHg5MDBlLCAweDIwMTEsIDB4MDA5MiwgMHgwODBjLAorCTB4MmFjMywgMHgyMDA5LCAweDA3ZDAsIDB4MDgwYywgMHg4Nzg1LCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLAorCTB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDk2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4MjA3MSwgMHgxODAwLCAweDc4MTAsIDB4MjA1OCwgMHhiOGEwLCAweDIwMjgsIDB4YjkxMCwgMHhiYTE0LAorCTB4NzM3YywgMHg3NDgwLCAweDc4MjAsIDB4MDAwMiwgMHg5ZTIzLCAweDllMjMsIDB4OWUyMywgMHg5ZTIzLAorCTB4OWUyMywgMHg5ZTIzLCAweDllMjMsIDB4OWUyMywgMHg5ZTIzLCAweDllMjMsIDB4OWUyNSwgMHg5ZTIzLAorCTB4OWUyMywgMHg5ZTIzLCAweDllMjMsIDB4MDgwYywgMHgwZDdkLCAweGI4ODQsIDB4NjA5ZSwgMHg3ODE0LAorCTB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDU1OCwgMHhhZjkwLCAweDk3ODQsIDB4ZmYwMCwgMHg5MTA1LAorCTB4NjA2MiwgMHg4NzNmLCAweDk3ODQsIDB4ZmYwMCwgMHgwMDA2LCAweDc4MTQsIDB4MjA0OCwgMHhhODc4LAorCTB4YzBmYywgMHg5MDA1LCAweDAwMGUsIDB4MTE2MCwgMHhhZjk0LCAweDg3ZmYsIDB4MDE5OCwgMHgyMDM5LAorCTB4MDA5OCwgMHg5NzA1LCAweDYwNzIsIDB4NzgwOCwgMHg2MDgyLCAweDJmMDAsIDB4NjA4NiwgMHgwMDM4LAorCTB4OTE4NSwgMHgyMjAwLCAweDYwNjIsIDB4NjA3MywgMHgwMTI5LCAweDYwNzcsIDB4MDAwMCwgMHhiODg0LAorCTB4NjA5ZSwgMHgwMDUwLCAweDIwMzksIDB4MDAyOSwgMHg5NzA1LCAweDYwNzIsIDB4MGNjMCwgMHg5MTg1LAorCTB4MDIwMCwgMHg2MDYyLCAweDYwNzMsIDB4MjAyOSwgMHhhODdjLCAweGQwZmMsIDB4MDExOCwgMHhhZjk0LAorCTB4ODdmZiwgMHgxMTIwLCAweDJmMDAsIDB4NjA4MiwgMHg3ODA4LCAweDYwODYsIDB4NjI2NiwgMHg2MzZhLAorCTB4NjQ2ZSwgMHg2MDc3LCAweDAwMDAsIDB4Yjg4YywgMHg4MDAwLCAweDkwODQsIDB4MDBmZiwgMHhiODhlLAorCTB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHhhODQ4LCAweDYwOGEsIDB4YTg0NCwgMHg2MDhlLAorCTB4YTgzOCwgMHg2MGM2LCAweGE4MzQsIDB4NjBjYSwgMHhiODZjLCAweDYwY2UsIDB4NjBhZiwgMHg5NWQ1LAorCTB4NjBkNywgMHgwMDAwLCAweDA4MGMsIDB4YTZmMywgMHgyMDA5LCAweDA3ZDAsIDB4NjBjNCwgMHg5MDg0LAorCTB4ZmZmMCwgMHg5MDA1LCAweDAxMTAsIDB4MjAwOSwgMHgxYjU4LCAweDA4MGMsIDB4ODc4NSwgMHgwMDNlLAorCTB4MDA0ZSwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDA1LAorCTB4N2E0MCwgMHg5Mjk0LCAweDAwZmYsIDB4ODIxNywgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgxOWU2LAorCTB4Njg2YiwgMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LAorCTB4MDBmMSwgMHgwODBjLCAweDg3NzcsIDB4MDAwNSwgMHgwMDE2LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLAorCTB4OTE4NCwgMHgwNjAwLCAweDkwODYsIDB4MDYwMCwgMHgwMTI4LCAweDAwODksIDB4MDgwYywgMHg4Nzc3LAorCTB4MDAxZSwgMHgwMDA1LCAweGMxZTUsIDB4MjAwMSwgMHgxODBjLCAweDIxMDIsIDB4MjAwMSwgMHgxOWU3LAorCTB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MTlmMiwgMHgyMDAzLCAweDAwMDAsIDB4MGM4OCwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MTgwNCwgMHgyMDExLCAweDAwMDksIDB4MDgwYywgMHgyYWMzLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDAwNiwgMHgwODBjLAorCTB4YTkxZSwgMHgwMTA2LCAweDIwNjEsIDB4MDEwMCwgMHg2MWE0LCAweDYwYTcsIDB4OTVmNSwgMHgwMDE2LAorCTB4MDAyNiwgMHgyMDA5LCAweDE4MDQsIDB4MjAxMSwgMHgwMDA4LCAweDA4MGMsIDB4MmFjMywgMHgwMDJlLAorCTB4MDAxZSwgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwgMHgwMDBlLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLAorCTB4NjFhNiwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgwODBjLCAweDc1M2QsIDB4MTUxMCwgMHgyMDAxLAorCTB4MWEwYiwgMHgyMDA0LCAweDkwMDUsIDB4MTkwNCwgMHg5ZjUzLCAweDA4MGMsIDB4NzVlMiwgMHgxMWE4LAorCTB4MjA2OSwgMHgwMzgwLCAweDY4NDMsIDB4MDEwMSwgMHg2ODQ0LCAweGQwODQsIDB4MWRlOCwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDIwLCAweGQwYjQsIDB4MTEyMCwgMHg2MDI0LCAweGQwODQsIDB4MDkwYywgMHgwZDdkLAorCTB4Njg0MywgMHgwMTAwLCAweDA4MGMsIDB4ODc3NywgMHgwNGIwLCAweDAwYzYsIDB4MjA2MSwgMHgxOWU2LAorCTB4MDBmMCwgMHg2OTA0LCAweDkxOTQsIDB4NDAwMCwgMHgwNTk4LCAweDA4MGMsIDB4OWVkNCwgMHgwODBjLAorCTB4MmE4YSwgMHgwMGM2LCAweDIwNjEsIDB4MTllNiwgMHg2MTM0LCAweDkxOTIsIDB4MDAwOCwgMHgxMjc4LAorCTB4ODEwOCwgMHg2MTM2LCAweDA4MGMsIDB4YTkxZSwgMHg2MTMwLCAweDA4MGMsIDB4YTkzYSwgMHgwMGNlLAorCTB4ODFmZiwgMHgwMWM4LCAweDA4MGMsIDB4ODc3NywgMHgwODBjLCAweDllYzcsIDB4MDBhMCwgMHgwODBjLAorCTB4YTkxZSwgMHg2MTMwLCAweDkxZTUsIDB4MDAwMCwgMHgwMTUwLCAweDA4MGMsIDB4ZTg5NywgMHgwODBjLAorCTB4ODc4MCwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4YWQ0ZCwgMHgwODBjLAorCTB4YTkzYSwgMHgwMGNlLCAweDAwMDAsIDB4MDAyZSwgMHgwMDFlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxYTBiLCAweDIwMDQsIDB4OTAwNSwgMHgxZGIwLCAweDAwYzYsIDB4MjA2MSwgMHgxOWU2LAorCTB4NjEzNCwgMHg5MTkyLCAweDAwMDMsIDB4MWFkOCwgMHg4MTA4LCAweDYxMzYsIDB4MDBjZSwgMHgwODBjLAorCTB4ODc3NywgMHgwODBjLCAweDVmNGQsIDB4MjAwOSwgMHgxODQ2LCAweDIxMTQsIDB4ODIxMCwgMHgyMjBhLAorCTB4MGMxMCwgMHgwMDk2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLAorCTB4ODc4ZCwgMHgwODBjLCAweGE5MWUsIDB4MjAwMSwgMHgwMzg3LCAweDIwMDMsIDB4MDIwMiwgMHgyMDcxLAorCTB4MTllNiwgMHg3MTRjLCAweDgxZmYsIDB4MDkwNCwgMHg5ZmZiLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LAorCTB4MDE0MCwgMHgwODBjLCAweDc1M2QsIDB4MTUxMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMiwgMHgwODBjLAorCTB4YTFiOCwgMHgwMDNlLCAweDcxNGMsIDB4MjE2MCwgMHgwODBjLCAweGU4OTcsIDB4MjAwOSwgMHgwMDRhLAorCTB4NjIyMCwgMHg5Mjk2LCAweDAwMDksIDB4MTEzMCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDA2LAorCTB4MjAwOSwgMHgwMDRhLCAweDYwMDMsIDB4MDAwMywgMHgwODBjLCAweGFkNGQsIDB4MjAwMSwgMHgwMzg2LAorCTB4MjAwMywgMHg1MDQwLCAweDA4MGMsIDB4NzVlMiwgMHgwODA0LCAweDlmZmIsIDB4NjkwNCwgMHhkMWY0LAorCTB4MDkwNCwgMHhhMDA4LCAweDA4MGMsIDB4MmE4YSwgMHgwMGM2LCAweDcwNGMsIDB4OTA2NSwgMHgwOTBjLAorCTB4MGQ3ZCwgMHg2MDIwLCAweDAwY2UsIDB4OTA4NiwgMHgwMDA2LCAweDE1MTgsIDB4NjFjOCwgMHg2MGM0LAorCTB4OTEwNSwgMHgxMWY4LCAweDIwMDksIDB4MTgwYywgMHgyMTA0LCAweGQwZDQsIDB4MDFkMCwgMHg2MjE0LAorCTB4OTI5NCwgMHgxODAwLCAweDExMjgsIDB4NjIyNCwgMHg5Mjk0LCAweDAwMDIsIDB4MTU2MCwgMHgwMDEwLAorCTB4YzBkNCwgMHgyMDBhLCAweDYwMTQsIDB4OTA4NCwgMHhlN2ZkLCAweDkwODUsIDB4MDAxMCwgMHg2MDE2LAorCTB4NzA0YywgMHgyMDYwLCAweDA4MGMsIDB4OTZkNSwgMHgyMDA5LCAweDAwNDksIDB4MDgwYywgMHhhZDRkLAorCTB4MDBkMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGExYjgsIDB4MDAzZSwgMHg3MTRjLAorCTB4MjE2MCwgMHgwODBjLCAweGU4OTcsIDB4MjAwOSwgMHgwMDRhLCAweDYyMjAsIDB4OTI5NiwgMHgwMDA5LAorCTB4MTEzMCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDA2LCAweDIwMDksIDB4MDA0YSwgMHg2MDAzLAorCTB4MDAwMywgMHgwODBjLCAweGFkNGQsIDB4MjAwMSwgMHgwMzg3LCAweDIwMDMsIDB4MDIwMCwgMHgwODBjLAorCTB4YTkzYSwgMHgwMDJlLCAweDAwMWUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMDA1LAorCTB4ZDFlYywgMHgxOTA0LCAweDlmYjIsIDB4MDgwNCwgMHg5ZmI0LCAweDAwMjYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTllNiwgMHg3MDZjLCAweGQwODQsIDB4MDFlOCwgMHhjMDg0LCAweDcwNmUsIDB4NzE0YywgMHg4MWZmLAorCTB4MDFjMCwgMHgyMDcxLCAweDAxMDAsIDB4OTE4OCwgMHgwMDA4LCAweDIxMTQsIDB4OTI4ZSwgMHgwMDA2LAorCTB4MTEzOCwgMHgyMDA5LCAweDE5ODQsIDB4MjAxMSwgMHgwMDEyLCAweDA4MGMsIDB4MmFjMywgMHgwMDQ4LAorCTB4OTI4ZSwgMHgwMDA5LCAweDBkYjAsIDB4MjAwOSwgMHgxOTg0LCAweDIwMTEsIDB4MDAxNiwgMHgwODBjLAorCTB4MmFjMywgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwgMHg5MDM2LCAweDIwMDEsIDB4MTlmMCwgMHgyMDA0LAorCTB4OTAwNSwgMHgwMTI4LCAweDljMDYsIDB4MDEyOCwgMHgyYzMwLCAweDYwMGMsIDB4MGNjOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgxOWU2LCAweDYxMGMsIDB4OTAwNiwgMHg2MDBlLAorCTB4NjA0NCwgMHhjMGZjLCAweDYwNDYsIDB4ODZmZiwgMHgxMTQwLCAweDc4MjQsIDB4OWMwNiwgMHgxMTE4LAorCTB4NzgyNiwgMHg3ODJhLCAweDAwNTAsIDB4NzkyYSwgMHgwMDQwLCAweDAwYzYsIDB4MjY2MCwgMHg2MTBlLAorCTB4MDBjZSwgMHg3ODI0LCAweDljMDYsIDB4MTEwOCwgMHg3ZTI2LCAweDA4MGMsIDB4YTI4MiwgMHgwODBjLAorCTB4Y2I2YiwgMHgwMGZlLCAweDAwMDUsIDB4MDgwYywgMHg5YjM3LCAweDcwMDMsIDB4MTIwMCwgMHg3ODM4LAorCTB4NzAxMiwgMHg3ODNjLCAweDcwMTYsIDB4MDBjNiwgMHg3ODIwLCAweDkwODYsIDB4MDAwNCwgMHgxMTQ4LAorCTB4NzgxMCwgMHg5MDA1LCAweDAxMzAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MTAsIDB4YjkxNCwgMHgwMGJlLAorCTB4MDAyMCwgMHgyMDYxLCAweDE4MDAsIDB4NjA3YywgMHg2MTgwLCAweDkwODQsIDB4MDBmZiwgMHg3MDBhLAorCTB4NzEwZSwgMHgwMGNlLCAweDYwYzMsIDB4MDAyYywgMHgwODA0LCAweDllYTQsIDB4MDgwYywgMHg5YjM3LAorCTB4NzAwMywgMHgwZjAwLCAweDc4MDgsIDB4ZDA5YywgMHgwMTI4LCAweGI4MTAsIDB4OTA4NCwgMHgwMGZmLAorCTB4NzAwYSwgMHhiODE0LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwgMHgwMTU2LAorCTB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDIwMCwgMHgwODBjLCAweDg4NDUsIDB4MjBhOSwgMHgwMDA2LAorCTB4MjAxMSwgMHhmZmVjLCAweDIwMTksIDB4ZmZlZCwgMHg5ZWYwLCAweDAwMDIsIDB4MjMwNSwgMHgyMDcyLAorCTB4OGU3MCwgMHgyMjA1LCAweDIwNzIsIDB4OGU3MCwgMHg5Mzk4LCAweDAwMDIsIDB4OTI5MCwgMHgwMDAyLAorCTB4MWYwNCwgMHhhMGE2LCAweDYwYzMsIDB4MDAxYywgMHgwMTVlLCAweDA4MDQsIDB4OWVhNCwgMHgwMDE2LAorCTB4MDAyNiwgMHgwODBjLCAweDliNWUsIDB4MDgwYywgMHg5YjcwLCAweDllODAsIDB4MDAwNCwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGEwLCAweDc4MTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwgMHhhODYwLAorCTB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyMSwgMHgyMDk4LCAweDAwOWUsIDB4NzgwOCwgMHg5MDg4LAorCTB4MDAwMiwgMHgyMWE4LCAweDkxOTIsIDB4MDAxMCwgMHgxMjUwLCAweDQwMDMsIDB4OTA4MCwgMHgwMDA0LAorCTB4ODAwMywgMHg2MGMyLCAweDA4MGMsIDB4OWVhNCwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMGE5LAorCTB4MDAxMCwgMHg0MDAzLCAweDA4MGMsIDB4YTZmZSwgMHgyMGExLCAweDAyNDAsIDB4MjJhOCwgMHg0MDAzLAorCTB4MGM2OCwgMHgwODBjLCAweDliMzcsIDB4NzAwMywgMHg2MjAwLCAweDc4MDgsIDB4NzAwZSwgMHg2MGMzLAorCTB4MDAwOCwgMHgwODA0LCAweDllYTQsIDB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4OWIzNywgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNGMsIDB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTgwMCwgMHgyMDQ4LAorCTB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIzLCAweDIwOTgsIDB4MDA5ZSwgMHg3ODA4LAorCTB4OTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4NDAwMywgMHg4MDAzLCAweDYwYzIsIDB4MDgwYywgMHg5ZWE0LAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4NzAxMCwgMHgyMDYwLCAweDhjZmYsIDB4MDE4OCwgMHgwODBjLAorCTB4Y2I5MSwgMHgxMTEwLCAweDA4MGMsIDB4YjY5MywgMHg2MDBjLCAweDAwMDYsIDB4MDgwYywgMHhjZTBkLAorCTB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4YWNiMCwgMHgwODBjLCAweGEyODIsIDB4MDBjZSwgMHgwYzY4LAorCTB4MmMwMCwgMHg3MDEyLCAweDcwMGUsIDB4MDEyZSwgMHgwMDBlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgwMTU2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LAorCTB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHg5MThjLAorCTB4ZTdmZiwgMHgyMTAyLCAweDIwNjksIDB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHgxOWU2LAorCTB4NzAzMCwgMHgyMDYwLCAweDhjZmYsIDB4MDU0OCwgMHgwODBjLCAweDllZDQsIDB4NmFjMCwgMHg2OGMzLAorCTB4MDAwMCwgMHgwODBjLCAweDg3ODAsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4MDgwYywgMHhhODRmLAorCTB4MDBjZSwgMHgyMGE5LCAweDAxZjQsIDB4MDRiMSwgMHgwODBjLCAweDk2N2EsIDB4NjA0NCwgMHhkMGFjLAorCTB4MTEyOCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDRhLCAweDAwMjAsIDB4MjAwOSwgMHgwMDEzLAorCTB4MDgwYywgMHhhZDRkLCAweDAwMGUsIDB4MDAxZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LAorCTB4OTA5NiwgMHgwMDAxLCAweDBkNzgsIDB4OTA5NiwgMHgwMDA0LCAweDBkNjAsIDB4MDgwYywgMHg4NzgwLAorCTB4NjgxNCwgMHg5MDg0LCAweDAwMDEsIDB4MDExMCwgMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LAorCTB4NjhjMywgMHgwMDAwLCAweDIwMTEsIDB4NWVmNywgMHgwODBjLCAweDg2YzgsIDB4MjBhOSwgMHgwMWY0LAorCTB4MDAwOSwgMHgwOGMwLCAweDY4MjQsIDB4ZDA5NCwgMHgwMTQwLCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LAorCTB4OTA4NCwgMHg0MDAwLCAweDE5MGMsIDB4MmE4YSwgMHgwMDkwLCAweGQwODQsIDB4MDExOCwgMHg2ODI3LAorCTB4MDAwMSwgMHgwMDEwLCAweDFmMDQsIDB4YTE5YSwgMHg3ODA0LCAweDkwODQsIDB4MTAwMCwgMHgwMTM4LAorCTB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHgwMDA1LAorCTB4MDEyNiwgMHgwMTU2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LAorCTB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHg5MThjLAorCTB4ZGJmZiwgMHgyMTAyLCAweDIwNjksIDB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHgwMzgwLAorCTB4NzAxYywgMHgwMDA2LCAweDcwMWYsIDB4MDIwMiwgMHgyMDcxLCAweDE5ZTYsIDB4NzA0YywgMHgyMDYwLAorCTB4OGNmZiwgMHgwOTA0LCAweGEyMzEsIDB4OTM4NiwgMHgwMDAyLCAweDExMjgsIDB4NjgxNCwgMHg5MDg0LAorCTB4MDAwMiwgMHgwOTA0LCAweGEyMzEsIDB4NjhhZiwgMHg5NWY1LCAweDY4MTcsIDB4MDAxMCwgMHgyMDA5LAorCTB4MDBmYSwgMHg4MTA5LCAweDFkZjAsIDB4NjljNiwgMHg2OGNiLCAweDAwMDgsIDB4MDgwYywgMHg4NzhkLAorCTB4MDgwYywgMHgxZTJlLCAweDIwMDEsIDB4MDAzMiwgMHg2OTIwLCAweGQxYmMsIDB4MDEzMCwgMHg4MDAxLAorCTB4MWRkOCwgMHg2OTJjLCAweDkxOGQsIDB4MDAwOCwgMHg2OTJlLCAweDIwYTksIDB4MDNlOCwgMHg2ODI0LAorCTB4ZDA5NCwgMHgwMTQwLCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LCAweDkwODQsIDB4NDAwMCwgMHgxOTBjLAorCTB4MmE4YSwgMHgwMDkwLCAweGQwOGMsIDB4MDExOCwgMHg2ODI3LCAweDAwMDIsIDB4MDAxMCwgMHgxZjA0LAorCTB4YTFmZiwgMHg3ODA0LCAweDkwODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLAorCTB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHg2ODI3LCAweDQwMDAsIDB4NjgyNCwgMHg4M2ZmLAorCTB4MTE4MCwgMHgyMDA5LCAweDAwNDksIDB4NjAyMCwgMHg5MDg2LCAweDAwMDksIDB4MDE1MCwgMHgwODBjLAorCTB4OTZkNSwgMHg2MDQ0LCAweGQwYWMsIDB4MTExOCwgMHg2MDAzLCAweDAwMDIsIDB4MDAxMCwgMHgwODBjLAorCTB4YWQ0ZCwgMHgwMDBlLCAweDIwNzEsIDB4MDM4MCwgMHhkMDhjLCAweDExMTAsIDB4NzAxZiwgMHgwMjAwLAorCTB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LAorCTB4MTllNiwgMHg2YTA2LCAweDAxMmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDY5LCAweDE5ZTYsIDB4NmEzZSwgMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLAorCTB4OWM4ZiwgMHg3ODVjLCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDEwMDAsIDB4MDBmOCwgMHgwODBjLAorCTB4OWM4ZiwgMHg3ODVjLCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDQwMDAsIDB4MDBiOCwgMHgwODBjLAorCTB4OWM4ZiwgMHg3ODVjLCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDIwMDAsIDB4MDA3OCwgMHgwODBjLAorCTB4OWM4ZiwgMHg3ODVjLCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDA0MDAsIDB4MDAzOCwgMHgwODBjLAorCTB4OWM4ZiwgMHg3ODVjLCAweDcwMzIsIDB4NzA0MiwgMHg3MDQ3LCAweDAyMDAsIDB4NjBjMywgMHgwMDIwLAorCTB4MDgwNCwgMHg5ZWE0LCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LCAweDcwMmMsIDB4OTAwNSwgMHgwMTEwLAorCTB4ODAwMSwgMHg3MDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA3NiwgMHgwMDY2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWU2LAorCTB4NzYyMCwgMHgyNjYwLCAweDI2NzgsIDB4MjAzOSwgMHgwMDAxLCAweDg3ZmYsIDB4MDkwNCwgMHhhMzI3LAorCTB4OGNmZiwgMHgwOTA0LCAweGEzMjcsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTkwNCwgMHhhMzIyLAorCTB4ODhmZiwgMHgwMTM4LCAweDI4MDAsIDB4OWMwNiwgMHgxOTA0LCAweGEzMjIsIDB4MjAzOSwgMHgwMDAwLAorCTB4MDA1MCwgMHg2MDEwLCAweDliMDYsIDB4MTkwNCwgMHhhMzIyLCAweDg1ZmYsIDB4MDEyMCwgMHg2MDVjLAorCTB4OTEwNiwgMHgxOTA0LCAweGEzMjIsIDB4NzAzMCwgMHg5YzA2LCAweDE1YjAsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjhjMCwgMHg5MDA1LCAweDExNjAsIDB4NjgyNCwgMHhkMDg0LCAweDAxNDgsIDB4NjgyNywgMHgwMDAxLAorCTB4MDgwYywgMHg4NzgwLCAweDA4MGMsIDB4YTNhYywgMHg3MDMzLCAweDAwMDAsIDB4MDQyOCwgMHgwODBjLAorCTB4ODc4MCwgMHg2ODIwLCAweGQwYjQsIDB4MDExMCwgMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4YTNhYywgMHg3MDMzLCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLAorCTB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LAorCTB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHg3MDIwLCAweDljMzYsIDB4MTExMCwgMHg2NjBjLAorCTB4NzYyMiwgMHg3MDFjLCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLAorCTB4NzAxZSwgMHgwMDEwLCAweDcwMWYsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHg5ZjA2LAorCTB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg4OWZmLCAweDExNjgsIDB4NjAwZiwgMHgwMDAwLAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4MDgwYywgMHhjOTc4LCAweDAxMTAsIDB4MDgwYywgMHhlM2U4LAorCTB4MDA5ZSwgMHgwODBjLCAweGFjZWIsIDB4MDgwYywgMHhhMjgyLCAweDg4ZmYsIDB4MTE5MCwgMHgwMGNlLAorCTB4MDgwNCwgMHhhMjlkLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4YTI5ZCwgMHg5MDA2LAorCTB4MDEyZSwgMHgwMDBlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHg2MDFiLCAweDAwMDAsIDB4MDBjZSwgMHg5OGM1LCAweDAwMDEsIDB4MGM4OCwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTllNiwgMHg3NjQ4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHhhMzliLCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4YTM5NiwgMHg4N2ZmLAorCTB4MDEyOCwgMHgyNzAwLCAweDljMDYsIDB4MTkwNCwgMHhhMzk2LCAweDAwNDAsIDB4NjAxMCwgMHg5YjA2LAorCTB4MTVlOCwgMHg4NWZmLCAweDAxMTgsIDB4NjA1YywgMHg5MTA2LCAweDE1YzAsIDB4NzA0YywgMHg5YzA2LAorCTB4MTE2OCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweGExYjgsIDB4NzAzZiwgMHgwMDAwLAorCTB4OTAwNiwgMHg3MDRlLCAweDcwNmEsIDB4NzA1MiwgMHg3MDZlLCAweDAwM2UsIDB4NzA0OCwgMHg5YzM2LAorCTB4MTExMCwgMHg2NjBjLCAweDc2NGEsIDB4NzA0NCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LAorCTB4MDExOCwgMHgyZjAwLCAweDcwNDYsIDB4MDAxMCwgMHg3MDQ3LCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LAorCTB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3OCwgMHgwMTEwLCAweDA4MGMsIDB4ZTNlOCwgMHgwODBjLAorCTB4YWNlYiwgMHg4N2ZmLCAweDExOTgsIDB4MDBjZSwgMHgwODA0LCAweGEzNDcsIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweGEzNDcsIDB4OTAwNiwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLAorCTB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NjAxYiwgMHgwMDAwLAorCTB4MDBjZSwgMHg5N2JkLCAweDAwMDEsIDB4MGM4MCwgMHgwMGU2LCAweDIwNzEsIDB4MTllNiwgMHg5MDA2LAorCTB4NzAzMiwgMHg3MDBhLCAweDcwMDQsIDB4OTA4NiwgMHgwMDAzLCAweDAxNTgsIDB4MjAwMSwgMHgxODAwLAorCTB4MjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MTExOCwgMHg3MDA3LCAweDAwMDUsIDB4MDAxMCwgMHg3MDA3LAorCTB4MDAwMCwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LAorCTB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4MmMxMCwgMHg3NjQ4LAorCTB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDU0MCwgMHgyMjAwLCAweDljMDYsIDB4MTUwOCwgMHg3MDQ4LAorCTB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzY0YSwgMHg3MDQ0LCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLAorCTB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzA0NiwgMHgwMDEwLCAweDcwNDcsIDB4MDAwMCwgMHg2NjBjLAorCTB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLAorCTB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MDkwYywgMHg5NjdhLCAweDkwODUsIDB4MDAwMSwgMHgwMDIwLAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDhiMCwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDBjNiwgMHgwMDY2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MTllNiwgMHg3NjEwLCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA5MDQsIDB4YTQ5OSwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHg5MjA2LCAweDE5MDQsIDB4YTQ5NCwgMHg3MDMwLAorCTB4OWMwNiwgMHgxNTIwLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweDkwMDUsIDB4MDkwNCwgMHhhNDZiLAorCTB4MDgwYywgMHg5ZWQ0LCAweDY4YzMsIDB4MDAwMCwgMHgwODBjLCAweGEzYWMsIDB4NzAzMywgMHgwMDAwLAorCTB4MDAzNiwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLAorCTB4MDEwMCwgMHgwODBjLCAweDJhN2EsIDB4OTAwNiwgMHgwODBjLCAweDJhN2EsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4NzAxMCwgMHg5YzM2LAorCTB4MTExMCwgMHg2NjBjLCAweDc2MTIsIDB4NzAwYywgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LAorCTB4MDExOCwgMHgyZjAwLCAweDcwMGUsIDB4MDAxMCwgMHg3MDBmLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LAorCTB4MmMwMCwgMHg5ZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLAorCTB4MDgwYywgMHhjYjgwLCAweDExODAsIDB4MDgwYywgMHgzMjZmLCAweDA4MGMsIDB4Y2I5MSwgMHgxNTE4LAorCTB4MDgwYywgMHhiNjkzLCAweDA0MDAsIDB4MDgwYywgMHhhM2FjLCAweDY4MjQsIDB4ZDA4NCwgMHgwOWIwLAorCTB4NjgyNywgMHgwMDAxLCAweDA4OTgsIDB4MDgwYywgMHhjYjkxLCAweDExMTgsIDB4MDgwYywgMHhiNjkzLAorCTB4MDA5MCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTc4LCAweDAxNjgsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwMywgMHgxNTA4LCAweGE4NjcsIDB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLAorCTB4NmRlMiwgMHgwODBjLCAweGNiNmIsIDB4MDgwYywgMHhjZTBkLCAweDA4MGMsIDB4YWNlYiwgMHgwODBjLAorCTB4YTI4MiwgMHgwMGNlLCAweDA4MDQsIDB4YTQxNCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LAorCTB4YTQxNCwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDllLCAweDAwMDUsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MWQyMCwgMHgwODBjLAorCTB4ZTNlOCwgMHgwYzA4LCAweDAwZDYsIDB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDIwMCwgMHg3MDA3LAorCTB4MDAxNCwgMHg2MGMzLCAweDAwMTQsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTk4OCwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNTAsIDB4MjBhOSwgMHgwMDA0LCAweDQwMDMsIDB4NzAyMywgMHgwMDA0LAorCTB4NzAyNywgMHg3ODc4LCAweDA4MGMsIDB4OWVhNCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg5YjgyLAorCTB4NzAwYiwgMHgwODAwLCAweDc4MTQsIDB4OTA4NCwgMHhmZjAwLCAweDcwMGUsIDB4NzgxNCwgMHg5MDg0LAorCTB4MDBmZiwgMHg3MDIyLCAweDc4MmMsIDB4NzAyNiwgMHg3ODYwLCAweDkwODQsIDB4MDBmZiwgMHg5MDg1LAorCTB4MDIwMCwgMHg3MDAyLCAweDc4NjAsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4NzAwNiwgMHg2MGMyLAorCTB4MDgwNCwgMHg5ZWE0LCAweDAwYjYsIDB4MDBkNiwgMHgwMDE2LCAweDAwZDYsIDB4MmY2OCwgMHgyMDA5LAorCTB4MDAzNSwgMHgwODBjLCAweGQwMTMsIDB4MDBkZSwgMHgxOTA0LCAweGE1NDcsIDB4MDgwYywgMHg5YjM3LAorCTB4NzAwMywgMHgxMzAwLCAweDc4MmMsIDB4MDgwYywgMHhhNjU2LCAweDIwNjgsIDB4NjgyMCwgMHg5MDg2LAorCTB4MDAwMywgMHgwNTYwLCAweDc4MTAsIDB4MjA1OCwgMHhiYWEwLCAweDA4MGMsIDB4YWJlMiwgMHgxMWQ4LAorCTB4OTI4NiwgMHgwMDdlLCAweDExMjgsIDB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmZSwgMHgwNDk4LAorCTB4OTI4NiwgMHgwMDdmLCAweDExMjgsIDB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmZCwgMHgwNDU4LAorCTB4OTI4NCwgMHhmZjgwLCAweDAxODAsIDB4OTI4NiwgMHgwMDgwLCAweDExMjgsIDB4NzAwYiwgMHgwMGZmLAorCTB4NzAwZiwgMHhmZmZjLCAweDA0MDAsIDB4OTJkOCwgMHgxMDAwLCAweDJiNWMsIDB4YjgxMCwgMHg3MDBhLAorCTB4YjgxNCwgMHg3MDBlLCAweDAwYzAsIDB4Yjg4NCwgMHg3MDBlLCAweDAwYTgsIDB4MDgwYywgMHhhYmUyLAorCTB4MTEzMCwgMHg3ODEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MDgyLCAweDAwN2UsIDB4MDI1MCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgxODFmLCAweDJkMDQsIDB4NzAwYSwgMHg4ZDY4LCAweDJkMDQsIDB4NzAwZSwgMHgwMGRlLAorCTB4MDAxMCwgMHg2MDM0LCAweDcwMGUsIDB4NzgzOCwgMHg3MDEyLCAweDc4M2MsIDB4NzAxNiwgMHg2MGMzLAorCTB4MDAwYywgMHgwMDFlLCAweDAwZGUsIDB4MDgwYywgMHg5ZWE0LCAweDAwYmUsIDB4MDAwNSwgMHg3ODFiLAorCTB4MDAwMSwgMHg3ODAzLCAweDAwMDYsIDB4MDAxZSwgMHgwMGRlLCAweDAwYmUsIDB4MDAwNSwgMHg3OTJjLAorCTB4OTE4MCwgMHgwMDA4LCAweDIwMGMsIDB4OTE4NiwgMHgwMDA2LCAweDAxYzAsIDB4OTE4NiwgMHgwMDAzLAorCTB4MDkwNCwgMHhhNWM2LCAweDkxODYsIDB4MDAwNSwgMHgwOTA0LCAweGE1YWUsIDB4OTE4NiwgMHgwMDA0LAorCTB4MDVmMCwgMHg5MTg2LCAweDAwMDgsIDB4MDkwNCwgMHhhNWI3LCAweDc4MDcsIDB4MDAzNywgMHg3ODJmLAorCTB4MDAwMywgMHg3ODE3LCAweDE3MDAsIDB4MDgwYywgMHhhNjMzLCAweDAwMDUsIDB4MDgwYywgMHhhNWY0LAorCTB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4NjgwMCwgMHg2YTQ0LAorCTB4ZDJmYywgMHgxMWY4LCAweDAwMDIsIDB4YTU4ZSwgMHhhNTk5LCAweGE1OTAsIDB4YTU5OSwgMHhhNTk1LAorCTB4YTU4ZSwgMHhhNThlLCAweGE1OTksIDB4YTU5OSwgMHhhNTk5LCAweGE1OTksIDB4YTU4ZSwgMHhhNThlLAorCTB4YTU4ZSwgMHhhNThlLCAweGE1OGUsIDB4YTU5OSwgMHhhNThlLCAweGE1OTksIDB4MDgwYywgMHgwZDdkLAorCTB4NjgyNCwgMHhkMGU0LCAweDAxMTAsIDB4ZDBjYywgMHgwMTEwLCAweDkwMGUsIDB4MDAxMCwgMHgyMDA5LAorCTB4MjAwMCwgMHg2ODJjLCAweDcwMjIsIDB4NjgzMCwgMHg3MDI2LCAweDA4MDQsIDB4YTVlZCwgMHgwODBjLAorCTB4YTVmNCwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyYywgMHgyMTY4LCAweDIwMDksIDB4NDAwMCwgMHg2YTAwLAorCTB4OTI4NiwgMHgwMDAyLCAweDExMDgsIDB4OTAwZSwgMHgwODA0LCAweGE1ZWQsIDB4MDgwYywgMHhhNWY0LAorCTB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4MDRiMCwgMHgwNGUxLAorCTB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4OTI4NiwgMHgwMDA1LAorCTB4MDExOCwgMHg5Mjg2LCAweDAwMDIsIDB4MTEwOCwgMHg5MDBlLCAweDA0MzgsIDB4MDQ2OSwgMHgwMGQ2LAorCTB4MDAyNiwgMHg3OTJjLCAweDIxNjgsIDB4NjgxNCwgMHg2OTI0LCAweGMxODUsIDB4NjkyNiwgMHgwMDk2LAorCTB4MjA0OCwgMHhhOWFjLCAweGE4MzQsIDB4OTExMiwgMHhhOWIwLCAweGE4MzgsIDB4MDA5ZSwgMHg5MTAzLAorCTB4NzAyMiwgMHg3MjI2LCAweDc5MmMsIDB4OTE4MCwgMHgwMDExLCAweDIwMDQsIDB4ZDBmYywgMHgxMTQ4LAorCTB4OTE4MCwgMHgwMDAwLCAweDIwMDQsIDB4OTA4ZSwgMHgwMDAyLCAweDAxMzAsIDB4OTA4ZSwgMHgwMDA0LAorCTB4MDExOCwgMHgyMDA5LCAweDQwMDAsIDB4MDAwOCwgMHg5MDBlLCAweDcxMmEsIDB4NjBjMywgMHgwMDE4LAorCTB4MDAyZSwgMHgwMGRlLCAweDA4MDQsIDB4OWVhNCwgMHgwMGI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LAorCTB4MDA2NiwgMHgwODBjLCAweDliODIsIDB4OTAwNiwgMHg3MDAzLCAweDAyMDAsIDB4NzkzOCwgMHg3MTBhLAorCTB4NzkzYywgMHg3MTBlLCAweDc4MTAsIDB4MjA1OCwgMHhiOGEwLCAweDA4MGMsIDB4YWJlMiwgMHgxMTE4LAorCTB4OTA5MiwgMHgwMDdlLCAweDAyNjgsIDB4MDBkNiwgMHgyMDY5LCAweDE4MWYsIDB4MmQyYywgMHg4ZDY4LAorCTB4MmQzNCwgMHg5MGQ4LCAweDEwMDAsIDB4MmI1YywgMHhiYjEwLCAweGJjMTQsIDB4MDBkZSwgMHgwMDI4LAorCTB4OTAxZSwgMHhiYzg0LCAweDIwMjksIDB4MDAwMCwgMHg2NjM0LCAweDc4MmMsIDB4OTA4MCwgMHgwMDA4LAorCTB4MjAwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTEyOCwgMHg3NTEyLCAweDc2MTYsIDB4NzMxYSwgMHg3NDFlLAorCTB4MDAyMCwgMHg3MzEyLCAweDc0MTYsIDB4NzUxYSwgMHg3NjFlLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHg5YjgyLCAweDcwMDMsIDB4MDEwMCwgMHg3ODJjLAorCTB4NzAwYSwgMHg3ODE0LCAweDcwMGUsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5ZWE0LAorCTB4MDgwYywgMHg5YjJlLCAweDcwMDMsIDB4MTQwMCwgMHg3ODM4LCAweDcwMGEsIDB4MDA3OSwgMHg3ODNjLAorCTB4NzAwZSwgMHg3ODJjLCAweDcwMTIsIDB4NzgzMCwgMHg3MDE2LCAweDc4MzQsIDB4OTA4NCwgMHgwMGZmLAorCTB4ODAwNywgMHg3MDFhLCAweDYwYzMsIDB4MDAxMCwgMHgwODA0LCAweDllYTQsIDB4MDBlNiwgMHgyMDcxLAorCTB4MDI0MCwgMHgwMDA2LCAweDAwZjYsIDB4MjA3OCwgMHg3ODEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGQ0LAorCTB4ZDA4NCwgMHgwMTIwLCAweDc4NGMsIDB4NzAyYSwgMHg3ODUwLCAweDcwMmUsIDB4MDBiZSwgMHgwMGZlLAorCTB4MDAwZSwgMHgwMGVlLCAweDAwMDUsIDB4MDgwYywgMHg5Yjc5LCAweDcwMDMsIDB4MDEwMCwgMHg3ODJjLAorCTB4NzAwYSwgMHg3ODE0LCAweDcwMGUsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OWVhNCwgMHgwMGE5LAorCTB4NzkxNCwgMHg3MTJhLCAweDYwYzMsIDB4MDAwMCwgMHg2MGE3LCAweDk1NzUsIDB4MDAyNiwgMHgwODBjLAorCTB4MjllNSwgMHgwMjI4LCAweDIwMTEsIDB4MDEwMSwgMHgyMjA0LCAweGMwYzUsIDB4MjAxMiwgMHgwMDJlLAorCTB4MDgwYywgMHg5ZWM3LCAweDA4MGMsIDB4ODc3NywgMHgwMDA1LCAweDAwMzYsIDB4MDA5NiwgMHgwMGQ2LAorCTB4MDBlNiwgMHg3ODYwLCAweDIwNDgsIDB4YWE3YywgMHg5Mjk2LCAweDAwYzAsIDB4OTI5NCwgMHhmZmZkLAorCTB4YWE3ZSwgMHhhYTgwLCAweDkyOTQsIDB4MDMwMCwgMHhhYTgyLCAweGE5NmMsIDB4OTE5NCwgMHgwMGZmLAorCTB4YWI3NCwgMHg5Mzg0LCAweDAwZmYsIDB4OTA4ZCwgMHhjMjAwLCAweGE5NmUsIDB4OTM4NCwgMHhmZjAwLAorCTB4OTIxNSwgMHhhYTc2LCAweGE4NzAsIDB4YWE3OCwgMHhhODdhLCAweGFhNzIsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDIwMCwgMHgwODBjLCAweGE3MTMsIDB4MDBkZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjQwLAorCTB4MjBhOSwgMHgwMDBhLCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMDk4LAorCTB4NDAwMywgMHg2MGEzLCAweDAwMzUsIDB4YWE2OCwgMHg5Mjk0LCAweDcwMDAsIDB4OTI4NiwgMHgzMDAwLAorCTB4MDExMCwgMHg2MGEzLCAweDAwMzcsIDB4MDBlZSwgMHgwMGRlLCAweDAwOWUsIDB4MDAzZSwgMHgwMDA1LAorCTB4OTAwZSwgMHg3ODE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDFjMCwgMHg5MDg0LAorCTB4MDAwMywgMHgxMWE4LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LCAweGQwYmMsIDB4MDE4MCwgMHg3ODI0LAorCTB4ZDBjYywgMHgxMTY4LCAweGQwYzQsIDB4MTE1OCwgMHhhOGE4LCAweDkwMDUsIDB4MTE0MCwgMHgyMDAxLAorCTB4MTgwYywgMHgyMDBjLCAweGMxZDUsIDB4MjEwMiwgMHgyMDA5LCAweDE5YjEsIDB4MjEwYywgMHgwMDllLAorCTB4OTE4ZCwgMHgwMDkyLCAweDAwMTAsIDB4MjAwOSwgMHgwMDk2LCAweDYwYWIsIDB4MDAzNiwgMHgwMDI2LAorCTB4MjExMCwgMHg5MDBlLCAweDA4MGMsIDB4MmFjMywgMHgwMDJlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDA5LAorCTB4MDBhMCwgMHgyMDA5LCAweDAwMGEsIDB4MDA4OCwgMHgyMDA5LCAweDAwMGIsIDB4MDA3MCwgMHgyMDA5LAorCTB4MDAwYywgMHgwMDU4LCAweDIwMDksIDB4MDAwZCwgMHgwMDQwLCAweDIwMDksIDB4MDAwZSwgMHgwMDI4LAorCTB4MjAwOSwgMHgwMDBmLCAweDAwMTAsIDB4MjAwOSwgMHgwMDA4LCAweDY5MTIsIDB4MDAwNSwgMHgwODBjLAorCTB4OWIzNywgMHgwMDE2LCAweDAwMjYsIDB4MDA5NiwgMHgwMGQ2LCAweDc4MTQsIDB4MjA0OCwgMHg3MDEzLAorCTB4MDEzOCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMjgsIDB4MTEzOCwgMHgyMDAxLAorCTB4MTk3YiwgMHgyMDA0LCAweDkwODYsIDB4YWFhYSwgMHgxOTA0LCAweGE3YjgsIDB4NzAwMywgMHg1NDAwLAorCTB4MDBjNiwgMHgyMDYxLCAweDE4MDAsIDB4NjA3YywgMHg5MDg0LCAweDAwZmYsIDB4YTk5OCwgMHg4MTBmLAorCTB4OTE4YywgMHhmZjAwLCAweDkxMDUsIDB4NzAwYSwgMHg2MDgwLCAweDcwMGUsIDB4YTk5OCwgMHg5MThjLAorCTB4ZmYwMCwgMHg3MTEyLCAweDIwYTksIDB4MDAwNCwgMHgyMDA5LCAweDE4MDUsIDB4MmUxMCwgMHg5MjkwLAorCTB4MDAwNiwgMHgyMTA0LCAweDIwMTIsIDB4ODEwOCwgMHg4MjEwLCAweDFmMDQsIDB4YTc0OSwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMDA5LCAweDE4MDEsIDB4MjEwNCwgMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwgMHgxZjA0LAorCTB4YTc1MywgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjksIDB4MjA5OCwgMHgyMDA5LAorCTB4MDAwNiwgMHgyMGE5LCAweDAwMDEsIDB4NDAwMiwgMHg4MDA3LCAweDIwMTIsIDB4ODIxMCwgMHg4MTA5LAorCTB4MWRjMCwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHgwODBjLCAweGE2ZmUsIDB4MDBkZSwgMHgyMDcxLAorCTB4MDI0MCwgMHgyMDExLCAweDAyNDAsIDB4MjAwOSwgMHgwMDAyLCAweDIwYTksIDB4MDAwMSwgMHg0MDAyLAorCTB4ODAwNywgMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwgMHgxZGMwLCAweDIwMDksIDB4MDAwOCwgMHgyMGE5LAorCTB4MDAwMSwgMHg0MDAyLCAweDgwMDcsIDB4MjAxMiwgMHg4MjEwLCAweDgxMDksIDB4MWRjMCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDMxLCAweDIwOTgsIDB4MjAwOSwgMHgwMDA4LCAweDIwYTksIDB4MDAwMSwgMHg0MDAyLAorCTB4ODAwNywgMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwgMHgxZGMwLCAweDAwY2UsIDB4NjBjMywgMHgwMDRjLAorCTB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAyOCwgMHgxMTY4LCAweDA4MGMsIDB4NzUzZCwgMHgwMTUwLCAweDYwMjgsIDB4YzBiZCwgMHg2MDJhLAorCTB4MjAwOSwgMHgxODA0LCAweDIwMTEsIDB4MDAyOSwgMHgwODBjLCAweDJhYzMsIDB4MDAxMCwgMHgwODBjLAorCTB4OWVhNCwgMHgwODBjLCAweDg3NzcsIDB4MDBkZSwgMHgwMDllLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDAyNDAsIDB4MjAwMSwgMHgyMjAwLCAweDkwODUsIDB4MDBmZiwgMHg3MDAyLAorCTB4NzAwNywgMHhmZmZmLCAweDIwNzEsIDB4MDEwMCwgMHg3MDliLCAweDAwZmYsIDB4MDBlZSwgMHgwODA0LAorCTB4YTcyZSwgMHgwODBjLCAweDliMzcsIDB4MDAxNiwgMHgwMDI2LCAweDAwOTYsIDB4MDBkNiwgMHg3ODE0LAorCTB4MjA0OCwgMHg3MDEzLCAweDAxMzgsIDB4NzAwMywgMHg1NTAwLCAweDAwYzYsIDB4YTg5YywgMHg5MDg0LAorCTB4MDBmZiwgMHhhOTk4LCAweDgxMGYsIDB4OTE4YywgMHhmZjAwLCAweDkxMDUsIDB4NzAwYSwgMHhhOTljLAorCTB4OTE4YywgMHhmZjAwLCAweGE4YTAsIDB4OTA4NCwgMHgwMGZmLCAweDkxMDUsIDB4NzAwZSwgMHhhOTk4LAorCTB4OTE4YywgMHhmZjAwLCAweDIwNjEsIDB4MTgwMCwgMHg2MDdjLCAweDkwODQsIDB4MDBmZiwgMHg5MTBkLAorCTB4NzExMiwgMHg2MTgwLCAweDcxMTYsIDB4MjAwOSwgMHgwMDA4LCAweGE4NjAsIDB4MjBlMCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDI5LCAweDIwOTgsIDB4MmUxMCwgMHg5MjkwLCAweDAwMDYsIDB4MjBhOSwgMHgwMDAxLAorCTB4NDAwMiwgMHg4MDA3LCAweDIwMTIsIDB4ODIxMCwgMHg4MTA5LCAweDFkYzAsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjAwOSwgMHgxODA1LCAweDIxMDQsIDB4MjAxMiwgMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwgMHhhODBhLAorCTB4MjBhOSwgMHgwMDAyLCAweDIwMDksIDB4MTgwMSwgMHgyMTA0LCAweDIwMTIsIDB4ODEwOCwgMHg4MjEwLAorCTB4MWYwNCwgMHhhODE0LCAweDAwZDYsIDB4MDAxNiwgMHgyMDY5LCAweDAyMDAsIDB4MDgwYywgMHhhNmZlLAorCTB4MDAxZSwgMHgwMGRlLCAweDIwNzEsIDB4MDI0MCwgMHgyMGE5LCAweDAwMDIsIDB4MjAwOSwgMHgxODAzLAorCTB4MjAxMSwgMHgwMjQwLCAweDIxMDQsIDB4MjAxMiwgMHg4MTA4LCAweDgyMTAsIDB4MWYwNCwgMHhhODJhLAorCTB4MjAwOSwgMHgwMDA4LCAweDQwMDIsIDB4ODAwNywgMHgyMDEyLCAweDgyMTAsIDB4ODEwOSwgMHgxZGQwLAorCTB4OTAwNiwgMHgyMGE5LCAweDAwMDgsIDB4MjAxMiwgMHg4MjEwLCAweDFmMDQsIDB4YTgzYiwgMHgwMGNlLAorCTB4NjBjMywgMHgwMDRjLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg5ZWE0LAorCTB4MDgwYywgMHg4Nzc3LCAweDAwZGUsIDB4MDA5ZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4OTI5MCwgMHgwMDE4LCAweDgyMTQsIDB4MjBlOSwgMHgwMDAwLCAweDIwNjksIDB4MDIwMCwgMHg2ODEzLAorCTB4MDAwMCwgMHgyMmE4LCAweDkyODQsIDB4MDBlMCwgMHgwMTI4LCAweDIwYTksIDB4MDAyMCwgMHg5MjkyLAorCTB4MDAyMCwgMHgwMDA4LCAweDkwMTYsIDB4MjBhMSwgMHgwMjQwLCAweDkwMDYsIDB4NDAwNCwgMHg4MmZmLAorCTB4MDEyMCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgwYzYwLCAweDAwZGUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDBhNiwgMHgwMDk2LCAweDAwNjYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDE5ZTYsIDB4NzYxMCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LAorCTB4YThmYiwgMHg3MDMwLCAweDljMDYsIDB4MTUyMCwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHg5MDA1LAorCTB4MDkwNCwgMHhhOGNkLCAweDA4MGMsIDB4OWVkNCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHhhM2FjLAorCTB4NzAzMywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLAorCTB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYTdhLCAweDkwMDYsIDB4MDgwYywgMHgyYTdhLAorCTB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLAorCTB4NzAxMCwgMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjEyLCAweDcwMGMsIDB4OWMzNiwgMHgxMTQwLAorCTB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDBlLCAweDAwMTAsIDB4NzAwZiwgMHgwMDAwLAorCTB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4Y2I4MCwgMHgxMTgwLCAweDA4MGMsIDB4MzI2ZiwgMHgwODBjLAorCTB4Y2I5MSwgMHgxNTE4LCAweDA4MGMsIDB4YjY5MywgMHgwNDAwLCAweDA4MGMsIDB4YTNhYywgMHg2ODI0LAorCTB4ZDA4NCwgMHgwOWIwLCAweDY4MjcsIDB4MDAwMSwgMHgwODk4LCAweDA4MGMsIDB4Y2I5MSwgMHgxMTE4LAorCTB4MDgwYywgMHhiNjkzLCAweDAwOTAsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3OCwgMHgwMTY4LAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTUyMCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LAorCTB4MDAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhjYjZiLCAweDA4MGMsIDB4Y2UwZCwgMHgwODBjLAorCTB4YWNlYiwgMHgwODBjLCAweGEyODIsIDB4MDBjZSwgMHgwODA0LCAweGE4N2UsIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweGE4N2UsIDB4NzAxMywgMHgwMDAwLCAweDcwMGYsIDB4MDAwMCwgMHgwMTJlLAorCTB4MDA2ZSwgMHgwMDllLCAweDAwYWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MWQwOCwgMHgwODBjLCAweGUzZTgsIDB4MDhmMCwgMHgwMGY2LAorCTB4MDAzNiwgMHgyMDc5LCAweDAzODAsIDB4N2IxOCwgMHhkM2JjLCAweDFkZTgsIDB4NzgzMiwgMHg3OTM2LAorCTB4N2EzYSwgMHg3ODFiLCAweDgwODAsIDB4MDAzZSwgMHgwMGZlLCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLAorCTB4MDM4MiwgMHgyMDA0LCAweDkwODQsIDB4MDAwNywgMHg5MDg2LCAweDAwMDEsIDB4MTE4OCwgMHgyMDAxLAorCTB4MDAxNSwgMHgwYzI5LCAweDIwMDksIDB4MTAwMCwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAwNywgMHg5MDg2LCAweDAwMDMsIDB4MDEyMCwgMHg4MTA5LCAweDFkYjAsIDB4MDgwYywgMHgwZDdkLAorCTB4MDAxZSwgMHgwMDA1LCAweDIwMDEsIDB4MDM4MiwgMHgyMDA0LCAweDkwODQsIDB4MDAwNywgMHg5MDg2LAorCTB4MDAwMywgMHgxMTIwLCAweDIwMDEsIDB4MDM4MCwgMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwgMHgwMTU2LAorCTB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4OTAwZSwgMHgyMDcxLCAweDE5ZTYsIDB4MDQ2OSwgMHgwMTA2LAorCTB4MDE5MCwgMHg3MDA0LCAweDkwODYsIDB4MDAwMywgMHgwMTQ4LCAweDIwYTksIDB4MTAwMCwgMHg2MDQ0LAorCTB4ZDBmYywgMHgwMWQ4LCAweDFmMDQsIDB4YTk1NywgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHhhOTFlLAorCTB4NjA0NCwgMHhkMGZjLCAweDAxOTAsIDB4NzAzMCwgMHg5YzA2LCAweDExNDgsIDB4MDgwYywgMHg5NjdhLAorCTB4NjA0NCwgMHhkMGRjLCAweDAxNTAsIDB4YzBkYywgMHg2MDQ2LCAweDcwMGEsIDB4NzA0MiwgMHg3MDRjLAorCTB4OWMwNiwgMHgxOTBjLCAweDBkN2QsIDB4MDgwYywgMHg5NmQ1LCAweDAxMGUsIDB4MTkxOSwgMHgwMGVlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAwNywgMHg5MDg2LCAweDAwMDMsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHg3ODA4LAorCTB4ZDBhNCwgMHgxOTBjLCAweDBkNzYsIDB4ZDA5YywgMHgwMTI4LCAweDc4MjAsIDB4OTA4YywgMHhmMDAwLAorCTB4MTFiOCwgMHgwMDEyLCAweDAxMmUsIDB4MDAwNSwgMHhhOWE0LCAweGE5ZTIsIDB4YWEwYywgMHhhYTQzLAorCTB4YWE1MywgMHhhYTY0LCAweGFhNzMsIDB4YWE4MSwgMHhhYWFlLCAweGFhYjIsIDB4YTlhNCwgMHhhOWE0LAorCTB4YTlhNCwgMHhhOWE0LCAweGE5YTQsIDB4YTlhNCwgMHgwODBjLCAweDBkN2QsIDB4MDEyZSwgMHgwMDA1LAorCTB4MjA2MCwgMHg2MDQ0LCAweGQwYmMsIDB4MDE0MCwgMHhjMGJjLCAweDYwNDYsIDB4NjAwMCwgMHg5MDhhLAorCTB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4MDAxMiwgMHgwMTJlLCAweDAwMDUsIDB4YTljOSwgMHhhOWNiLAorCTB4YTljOSwgMHhhOWQxLCAweGE5YzksIDB4YTljOSwgMHhhOWM5LCAweGE5YzksIDB4YTljOSwgMHhhOWNiLAorCTB4YTljOSwgMHhhOWNiLCAweGE5YzksIDB4YTljYiwgMHhhOWM5LCAweGE5YzksIDB4YTljOSwgMHhhOWNiLAorCTB4YTljOSwgMHgwODBjLCAweDBkN2QsIDB4MjAwOSwgMHgwMDEzLCAweDA4MGMsIDB4YWQ0ZCwgMHgwMTJlLAorCTB4MDAwNSwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGRjLCAweDAxMzAsIDB4MDgwYywgMHg4OTRlLAorCTB4MDgwYywgMHhhY2IwLCAweDAxMmUsIDB4MDAwNSwgMHgyMDA5LCAweDAwNDksIDB4MDgwYywgMHhhZDRkLAorCTB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwgMHgyMDAxLCAweDFhMGIsIDB4MjAwMywgMHgwMDAwLAorCTB4NzAzMCwgMHg5MDY1LCAweDA5MGMsIDB4MGQ3ZCwgMHg3MDM0LCAweDkwOTIsIDB4YzM1MCwgMHgxMjU4LAorCTB4ODAwMCwgMHg3MDM2LCAweDcwMDQsIDB4OTA4NiwgMHgwMDAzLCAweDAxMTAsIDB4NzAwNywgMHgwMDAwLAorCTB4NzgxZiwgMHgwODA4LCAweDAwNTgsIDB4MDgwYywgMHhhYzBlLCAweDAxNDAsIDB4MDgwYywgMHhlODk3LAorCTB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweGFkNGQsIDB4NzgxZiwgMHgwMTAwLAorCTB4MDgwYywgMHhhOTNhLCAweDAxMmUsIDB4MDAwNSwgMHgwODBjLCAweGE5MWUsIDB4NzE0YywgMHg4MWZmLAorCTB4MTEyOCwgMHgyMDExLCAweDFhMGUsIDB4MjAxMywgMHgwMDAwLCAweDA0MzgsIDB4MjA2MSwgMHgwMTAwLAorCTB4NzE1MCwgMHg5MTkyLCAweDc1MzAsIDB4MTJmMCwgMHg4MTA4LCAweDcxNTIsIDB4NzE0YywgMHg5MTg4LAorCTB4MDAwOCwgMHgyMTBjLCAweDkxOGUsIDB4MDAwNiwgMHgxMTM4LCAweDYwMTQsIDB4OTA4NCwgMHgxOTg0LAorCTB4OTA4NSwgMHgwMDEyLCAweDYwMTYsIDB4MDA4OCwgMHg3MTRjLCAweDkxODgsIDB4MDAwOCwgMHgyMTBjLAorCTB4OTE4ZSwgMHgwMDA5LCAweDBkOTAsIDB4NjAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDE2LAorCTB4NjAxNiwgMHgwMDE4LCAweDcwNmMsIDB4YzA4NSwgMHg3MDZlLCAweDc4MWYsIDB4MDIwMCwgMHgwODBjLAorCTB4YTkzYSwgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLCAweDcxNGMsIDB4MjE2MCwgMHg2MDAzLAorCTB4MDAwMywgMHgyMDA5LCAweDAwNGEsIDB4MDgwYywgMHhhZDRkLCAweDc4MWYsIDB4MDIwMCwgMHgwODBjLAorCTB4YTkzYSwgMHgwMTJlLCAweDAwMDUsIDB4NzgwOCwgMHhkMDljLCAweDBkZTgsIDB4NzgyMCwgMHgyMDYwLAorCTB4NjAwMywgMHgwMDAzLCAweDA4MGMsIDB4YTkxZSwgMHgwODBjLCAweDFkYjYsIDB4NzgxZiwgMHgwNDAwLAorCTB4MDgwYywgMHhhOTNhLCAweDAxMmUsIDB4MDAwNSwgMHg3ODA4LCAweGQwOWMsIDB4MGRlOCwgMHg3ODIwLAorCTB4MjA2MCwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHgxZGZlLCAweDc4MWYsIDB4MDQwMCwgMHgwODBjLAorCTB4YTkzYSwgMHgwMTJlLCAweDAwMDUsIDB4NzAzMCwgMHg5MDY1LCAweDAxNDgsIDB4NjA0NCwgMHhjMGJjLAorCTB4NjA0NiwgMHg3MTA0LCAweDkxODYsIDB4MDAwMywgMHgwMTEwLCAweDA4MGMsIDB4OTczOSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwM2MsIDB4OTA4NiwgMHgwMDAyLCAweDA1MjgsIDB4NzA0YywgMHg5MDdkLAorCTB4MDUxMCwgMHg3ODQ0LCAweGMwYmMsIDB4Nzg0NiwgMHg3ODIwLCAweDkwODYsIDB4MDAwOSwgMHgwMTE4LAorCTB4MDgwYywgMHg5ZGZlLCAweDAwYzAsIDB4NzgyOCwgMHhkMGZjLCAweDExMTgsIDB4MDgwYywgMHg5ZDdkLAorCTB4MDA5MCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LCAweDAwMjgsIDB4MTEzMCwgMHgyMDAxLAorCTB4MTk3YiwgMHgyMDA0LCAweDkwODYsIDB4YWFhYSwgMHgxMTIwLCAweDIwMDEsIDB4MDM4NywgMHgyMDAzLAorCTB4MTAwMCwgMHgwODBjLCAweDlkMDIsIDB4MDBmZSwgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHg3NWUyLAorCTB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxOWU2LAorCTB4NjA0NCwgMHhjMGJjLCAweDYwNDYsIDB4ZDBmYywgMHgwMWI4LCAweDcwNGMsIDB4OWMwNiwgMHgxMTkwLAorCTB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4YTFiOCwgMHg3MDRmLCAweDAwMDAsIDB4MjAwMSwgMHgwMTA5LAorCTB4MjAwNCwgMHhkMDhjLCAweDExMzgsIDB4MjAwMSwgMHgwMTA4LCAweDIwMDQsIDB4ZDBiYywgMHgxMTEwLAorCTB4NzAzZiwgMHgwMDAwLCAweDA4MGMsIDB4YTNjMywgMHgwMGVlLCAweDAwMDUsIDB4MDAyNiwgMHg3MDEwLAorCTB4OWMwNiwgMHgxMTc4LCAweDA4MGMsIDB4YTI4MiwgMHg2MDQ0LCAweGMwZmMsIDB4NjA0NiwgMHg2MDBjLAorCTB4OTAxNSwgMHgwMTIwLCAweDcyMTIsIDB4NjAwZiwgMHgwMDAwLCAweDAwMTAsIDB4NzIxMiwgMHg3MjBlLAorCTB4OTAwNiwgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwgMHg3MDIwLCAweDljMDYsIDB4MTE3OCwgMHgwODBjLAorCTB4YTI4MiwgMHg2MDQ0LCAweGMwZmMsIDB4NjA0NiwgMHg2MDBjLCAweDkwMTUsIDB4MDEyMCwgMHg3MjIyLAorCTB4NjAwZiwgMHgwMDAwLCAweDAwMTAsIDB4NzIyMiwgMHg3MjFlLCAweDkwMDYsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMDM2LCAweDc4MzAsIDB4OWMwNiwgMHgxNTU4LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLAorCTB4OTAwNSwgMHgwMWY4LCAweDA4MGMsIDB4ODc4MCwgMHgwODBjLCAweDllZDQsIDB4NjhjMywgMHgwMDAwLAorCTB4MDgwYywgMHhhM2FjLCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LAorCTB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmE3YSwgMHg5MDA2LCAweDA4MGMsIDB4MmE3YSwgMHgyMDY5LAorCTB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAzOCwgMHg3ODA4LCAweGMwYWQsIDB4NzgwYSwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHg5MDA2LAorCTB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4NjEwMCwgMHgyMDE5LAorCTB4MDEwMCwgMHgyMDAxLCAweDAzODIsIDB4MjAwNCwgMHhkMDljLCAweDAxOTAsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHgyODAwLCAweDAwMTYsIDB4MDAzNiwgMHgwODBjLCAweGE5ODQsIDB4MDAzZSwgMHgwMDFlLAorCTB4MDEyZSwgMHgwMGNlLCAweDYyMDAsIDB4MjIwMCwgMHg5MTA2LCAweDBkNTgsIDB4MjIwMCwgMHgwMDEwLAorCTB4ODMxOSwgMHgxZDM4LCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LAorCTB4MDgwYywgMHg5YjgyLCAweDdhMTQsIDB4ODJmZiwgMHgwMTM4LCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLAorCTB4MDAwMywgMHg2MGMzLCAweDAwMDgsIDB4MDQ5MCwgMHg3MDAzLCAweDAyMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4MjA2OSwgMHgxODAwLCAweDkwMWUsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTExMCwgMHhjMzhkLAorCTB4MDA2MCwgMHgwODBjLCAweDc1M2QsIDB4MTExMCwgMHhjM2FkLCAweDAwMDgsIDB4YzNhNSwgMHg2YWRjLAorCTB4ZDI5YywgMHgxMTEwLCAweGQyYWMsIDB4MDEwOCwgMHhjMzlkLCAweDczMGUsIDB4MDgwYywgMHg4ODQ1LAorCTB4MjBhOSwgMHgwMDA2LCAweDIwMTEsIDB4ZmZlYywgMHgyMDE5LCAweGZmZWQsIDB4MjA3MSwgMHgwMjUwLAorCTB4MjMwNSwgMHgyMDcyLCAweDhlNzAsIDB4MjIwNSwgMHgyMDcyLCAweDhlNzAsIDB4OTM5OCwgMHgwMDAyLAorCTB4OTI5MCwgMHgwMDAyLCAweDFmMDQsIDB4YWI4OCwgMHg2MGMzLCAweDAwMjAsIDB4MDgwYywgMHg5ZWE0LAorCTB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDE1NiwgMHgwODBjLCAweDliODIsIDB4N2ExNCwgMHg4MmZmLAorCTB4MDE2OCwgMHg5Mjg2LCAweGZmZmYsIDB4MDExOCwgMHg5MjgyLCAweDAwMGUsIDB4MTIzOCwgMHg3MDAzLAorCTB4MDEwMCwgMHg3MDBiLCAweDAwMDMsIDB4NjBjMywgMHgwMDA4LCAweDA0ODgsIDB4NzAwMywgMHgwMjAwLAorCTB4NzAwNywgMHgwMDFjLCAweDcwMGYsIDB4MDAwMSwgMHgyMDExLCAweDE5YmMsIDB4MjIwNCwgMHg4MDA3LAorCTB4NzAxYSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHg3MDFlLCAweDA0MjEsIDB4MTEyMCwgMHhiOGEwLAorCTB4OTA4MiwgMHgwMDdmLCAweDAyNDgsIDB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4NzAyMiwgMHgyMDAxLAorCTB4MTgyMCwgMHgyMDA0LCAweDcwMjYsIDB4MDAzMCwgMHgyMDAxLCAweDE4MTgsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDBmZiwgMHg3MDI2LCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1NiwgMHg0MDAzLCAweDYwYzMsIDB4MDAxYywgMHgwMTVlLAorCTB4MDgwNCwgMHg5ZWE0LCAweDAwMDYsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4ZDBhYywgMHgwMDBlLAorCTB4MDAwNSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHhhMjQzLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4YTI0ZCwgMHgwODBjLCAweGExMzgsIDB4MDAzNiwgMHg5MDFlLCAweDA4MGMsIDB4YTFiOCwgMHgwMDNlLAorCTB4MDAwNSwgMHgwODBjLCAweDMzYjIsIDB4MDE4OCwgMHgwMDE2LCAweDAwYjYsIDB4MDBjNiwgMHg3MDEwLAorCTB4OTA4NSwgMHgwMDIwLCAweDcwMTIsIDB4MjAwOSwgMHgwMDdlLCAweDA4MGMsIDB4NjY5MywgMHhiODVjLAorCTB4YzBhYywgMHhiODVlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMGY2LAorCTB4NzEwNCwgMHg5MTg2LCAweDAwMDQsIDB4MTEyMCwgMHg3NDEwLCAweDllOTAsIDB4MDAwNCwgMHgwMDY4LAorCTB4OTE4NiwgMHgwMDAxLCAweDExMjAsIDB4NzQyMCwgMHg5ZTkwLCAweDAwMDgsIDB4MDAzMCwgMHg5MTg2LAorCTB4MDAwMiwgMHgxNTA4LCAweDc0MjgsIDB4OWU5MCwgMHgwMDBhLCAweDYxMTAsIDB4MjQ2OCwgMHg2ODBjLAorCTB4OTA3ZCwgMHgwMWM4LCAweDc4MTAsIDB4OTEwNiwgMHgxMTI4LCAweDJmNjgsIDB4NzgwYywgMHg5MDdkLAorCTB4MWRjOCwgMHgwMDg4LCAweDc4MGMsIDB4NjgwZSwgMHg3YzBlLCAweDJmMTIsIDB4OTAwNiwgMHg3MDMyLAorCTB4NzAzNiwgMHg3MDA0LCAweDkwODYsIDB4MDAwMywgMHgwMTEwLCAweDcwMDcsIDB4MDAwMCwgMHg5MDA2LAorCTB4MDBmZSwgMHgwMGRlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjZDAsIDB4MjA3MSwgMHgxODhkLAorCTB4NzAwMCwgMHg5MDA1LCAweDAxNDAsIDB4MjAwMSwgMHgwODEyLCAweDIwNzEsIDB4MTgwMCwgMHg3MDc2LAorCTB4NzA3YSwgMHg3MDZiLCAweGZmZDQsIDB4MjA3MSwgMHgxODAwLCAweDcwNzQsIDB4NzA1NiwgMHg3MDViLAorCTB4MWRkYywgMHgwMDA1LCAweDAwZTYsIDB4MDEyNiwgMHgyMDcxLCAweDE4MDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzU1NCwgMHg5NTgyLCAweDAwMTAsIDB4MDYwOCwgMHg3MDU4LCAweDIwNjAsIDB4NjAwMCwgMHg5MDg2LAorCTB4MDAwMCwgMHgwMTQ4LCAweDljZTAsIDB4MDAxYywgMHg3MDY4LCAweDljMDIsIDB4MTIwOCwgMHgwY2IwLAorCTB4MjA2MSwgMHgxZGRjLCAweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU1NiwgMHg5Y2E4LAorCTB4MDAxYywgMHg3MDY4LCAweDk1MDIsIDB4MTIzMCwgMHg3NTVhLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDcwNWIsIDB4MWRkYywgMHgwY2MwLCAweDkwMDYsIDB4MGNjMCwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDc1NTQsIDB4OTU4MiwgMHgwMDEwLCAweDA2MDAsIDB4NzA1OCwgMHgyMDYwLAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg5Y2UwLCAweDAwMWMsIDB4NzA2OCwgMHg5YzAyLAorCTB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4MWRkYywgMHgwYzk4LCAweDYwMDMsIDB4MDAwOCwgMHg4NTI5LAorCTB4NzU1NiwgMHg5Y2E4LCAweDAwMWMsIDB4NzA2OCwgMHg5NTAyLCAweDEyMjgsIDB4NzU1YSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4NzA1YiwgMHgxZGRjLCAweDBjYzgsIDB4OTAwNiwgMHgwY2M4LAorCTB4OWM4MiwgMHgxZGRjLCAweDBhMGMsIDB4MGQ3ZCwgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLAorCTB4MWEwYywgMHgwZDdkLCAweDkwMDYsIDB4NjAwNiwgMHg2MDBhLCAweDYwMGUsIDB4NjAxNiwgMHg2MDFhLAorCTB4NjAxMiwgMHg2MDIzLCAweDAwMDAsIDB4NjAwMywgMHgwMDAwLCAweDYwMWUsIDB4NjA1ZSwgMHg2MDYyLAorCTB4NjAyNiwgMHg2MDJhLCAweDYwMmUsIDB4NjAzMiwgMHg2MDM2LCAweDYwM2EsIDB4NjAzZSwgMHg2MDRhLAorCTB4NjAyYSwgMHg2MDQ2LCAweDYwNDIsIDB4MjA2MSwgMHgxODAwLCAweDYwNTQsIDB4ODAwMCwgMHg2MDU2LAorCTB4MDAwNSwgMHg5MDA2LCAweDYwMGUsIDB4NjAxNiwgMHg2MDFhLCAweDYwMTIsIDB4NjAyMiwgMHg2MDAyLAorCTB4NjAxZSwgMHg2MDVlLCAweDYwNjIsIDB4NjA0YSwgMHg2MDQ2LCAweDIwNjEsIDB4MTgwMCwgMHg2MDU0LAorCTB4ODAwMCwgMHg2MDU2LCAweDAwMDUsIDB4MDAwNiwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMWQwLAorCTB4NjAxYywgMHhkMDg0LCAweDE5MGMsIDB4MWFjNSwgMHg2MDIzLCAweDAwMDcsIDB4MjAwMSwgMHgxOTg1LAorCTB4MjAwNCwgMHgwMDA2LCAweDkwODIsIDB4MDA1MSwgMHgwMDBlLCAweDAyMDgsIDB4ODAwNCwgMHg2MDFhLAorCTB4MDgwYywgMHhlNmEwLCAweDYwNGIsIDB4MDAwMCwgMHg2MDQ0LCAweGQwZmMsIDB4MTEyOSwgMHg5MDA2LAorCTB4NjA0NiwgMHg2MDE2LCAweDAwMGUsIDB4MDAwNSwgMHgwODBjLCAweGE5MWUsIDB4MDEwNiwgMHgyMDAxLAorCTB4MTlmOSwgMHgyMDA0LCAweDljMDYsIDB4MTEzMCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLAorCTB4YTFiOCwgMHgwMDNlLCAweDA4MGMsIDB4YTNjMywgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwNzEsIDB4MTgwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU1NCwgMHg5NTgyLAorCTB4MDAwMSwgMHgwNjA4LCAweDcwNTgsIDB4MjA2MCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LAorCTB4OWNlMCwgMHgwMDFjLCAweDcwNjgsIDB4OWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHgxZGRjLAorCTB4MGM5OCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTU2LCAweDljYTgsIDB4MDAxYywgMHg3MDY4LAorCTB4OTUwMiwgMHgxMjMwLCAweDc1NWEsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzA1YiwgMHgxZGRjLCAweDBjYzAsIDB4OTAwNiwgMHgwY2MwLCAweDYwMjAsIDB4OTA4NCwgMHgwMDBmLAorCTB4MDAwMiwgMHhhZDYxLCAweGFkNmIsIDB4YWQ4NiwgMHhhZGExLCAweGQwZWUsIDB4ZDEwYiwgMHhkMTI2LAorCTB4YWQ2MSwgMHhhZDZiLCAweDkwMjUsIDB4YWRiZCwgMHhhZDYxLCAweGFkNjEsIDB4YWQ2MSwgMHhhZDYxLAorCTB4YWQ2MSwgMHg5MTg2LCAweDAwMTMsIDB4MTEzMCwgMHg2MDQ0LCAweGQwZmMsIDB4MDExMCwgMHgwODBjLAorCTB4OTY3YSwgMHgwMDA1LCAweDAwMDUsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLAorCTB4MGQ3ZCwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhZDg0LCAweGI0ZmQsIDB4YjZkYSwgMHhhZDg0LAorCTB4Yjc3MCwgMHhiMDg2LCAweGFkODQsIDB4YWQ4NCwgMHhiNDdmLCAweGJjZGEsIDB4YWQ4NCwgMHhhZDg0LAorCTB4YWQ4NCwgMHhhZDg0LCAweGFkODQsIDB4YWQ4NCwgMHgwODBjLCAweDBkN2QsIDB4MDA2NiwgMHg2MDAwLAorCTB4OTBiMiwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhZDlmLAorCTB4YzJmMiwgMHhhZDlmLCAweGFkOWYsIDB4YWQ5ZiwgMHhhZDlmLCAweGFkOWYsIDB4YWQ5ZiwgMHhjMjg5LAorCTB4YzQ3NSwgMHhhZDlmLCAweGMzMmYsIDB4YzNiMywgMHhjMzJmLCAweGMzYjMsIDB4YWQ5ZiwgMHgwODBjLAorCTB4MGQ3ZCwgMHg2MDAwLCAweDkwODIsIDB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4NjAwMCwgMHgwMDAyLAorCTB4YWRiYiwgMHhiZDI0LCAweGJkYmUsIDB4YmYzZSwgMHhiZmFkLCAweGFkYmIsIDB4YWRiYiwgMHhhZGJiLAorCTB4YmNmMywgMHhjMjBhLCAweGMyMGQsIDB4YWRiYiwgMHhhZGJiLCAweGFkYmIsIDB4YWRiYiwgMHhjMjNkLAorCTB4YWRiYiwgMHhhZGJiLCAweGFkYmIsIDB4MDgwYywgMHgwZDdkLCAweDAwNjYsIDB4NjAwMCwgMHg5MGIyLAorCTB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4YWRkNiwgMHhhZGQ2LAorCTB4YWUxNCwgMHhhZWIzLCAweGFmMzMsIDB4YWRkNiwgMHhhZGQ2LCAweGFkZDYsIDB4YWRkOCwgMHhhZGQ2LAorCTB4YWRkNiwgMHhhZGQ2LCAweGFkZDYsIDB4YWRkNiwgMHhhZGQ2LCAweGFkZDYsIDB4MDgwYywgMHgwZDdkLAorCTB4OTE4NiwgMHgwMDRjLCAweDA1NjAsIDB4OTE4NiwgMHgwMDAzLCAweDE5MGMsIDB4MGQ3ZCwgMHgwMDk2LAorCTB4NjAxYywgMHhjMGVkLCAweDYwMWUsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTg3YywgMHg5MDg0LCAweGEwMDAsIDB4YzBiNSwgMHhhODdlLCAweGE4YWMsIDB4YTgzNiwgMHhhOGIwLAorCTB4YTgzYSwgMHg5MDA2LCAweGE4NDYsIDB4YTg0YSwgMHhhODg0LCAweDkwOTIsIDB4MTk5YSwgMHgwMjEwLAorCTB4MjAwMSwgMHgxOTk5LCAweDgwMDMsIDB4ODAxMywgMHg4MjEzLCAweDkyMTAsIDB4NjIxYSwgMHgwMDllLAorCTB4MDgwYywgMHgxYzEwLCAweDIwMDksIDB4ODAzMCwgMHgwODBjLCAweDkyZjcsIDB4MDAwNSwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGJjYTAsIDB4MDBiZSwgMHgyYzAwLCAweDA4MGMsIDB4YWY1NSwgMHgwODBjLAorCTB4ZDBiMywgMHg2MDAzLCAweDAwMDcsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDBmNiwgMHgyMDc5LAorCTB4MTgwMCwgMHg3YTkwLCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZWMsIDB4MTExMCwgMHg5MjkwLAorCTB4MDAxOCwgMHhhYzc4LCAweGM0ZmMsIDB4MDA0NiwgMHhhOGUwLCAweDkwMDUsIDB4MTE0MCwgMHhhOGRjLAorCTB4OTIxYSwgMHgwMTQwLCAweDAyMjAsIDB4YTg3YiwgMHgwMDA3LCAweDIwMTAsIDB4MDAyOCwgMHhhODdiLAorCTB4MDAxNSwgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHg4MjE0LCAweGE4ODMsIDB4MDAwMCwgMHhhYTAyLAorCTB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyNDAwLAorCTB4OTAwNSwgMHgxMTA4LCAweDAwOWEsIDB4MjEwMCwgMHg5MDg2LCAweDAwMTUsIDB4MTExOCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwMDM4LCAweDIxMDAsIDB4OTA4NiwgMHgwMDE2LCAweDAxMTgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDAyYSwgMHg5NGE0LCAweDAwMDcsIDB4ODQyMywgMHg5NDA1LCAweDAwMDIsIDB4YWU3YiwgMHhhZTdiLAorCTB4YWU3NiwgMHhhZTc5LCAweGFlN2IsIDB4YWU3MywgMHhhZTY2LCAweGFlNjYsIDB4YWU2NiwgMHhhZTY2LAorCTB4YWU2NiwgMHhhZTY2LCAweGFlNjYsIDB4YWU2NiwgMHhhZTY2LCAweGFlNjYsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwNGUsIDB4MDBmZSwgMHgwMDllLAorCTB4MDBkZSwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHhiOTJmLCAweDAwMjgsIDB4MDgwYywgMHhiYTE0LAorCTB4MDAxMCwgMHgwODBjLCAweGJiMGEsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgyYzAwLCAweGE4OTYsIDB4MDAwZSwgMHgwODBjLCAweGIwMTMsIDB4MDUzMCwgMHhhODA0LAorCTB4YTgwZSwgMHgwMGE2LCAweDIwNTAsIDB4YjEwMCwgMHgwMGFlLCAweDgwMDYsIDB4ODAwNiwgMHg4MDA3LAorCTB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4YWFjYywgMHhhYmQwLAorCTB4YWNkNCwgMHhhZGQ4LCAweDIwMzEsIDB4MDAwMCwgMHgyMDQxLCAweDEyYjAsIDB4MDgwYywgMHhiMWQ0LAorCTB4MDE2MCwgMHgwMDBlLCAweDkwMDUsIDB4MDEyMCwgMHgwMGZlLCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBmZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHhhY2IwLCAweDIwMDEsIDB4MDAyYywgMHg5MDBlLAorCTB4MDgwYywgMHhiMDc5LCAweDBjNzAsIDB4OTFiNiwgMHgwMDE1LCAweDAxNzAsIDB4OTFiNiwgMHgwMDE2LAorCTB4MDE1OCwgMHg5MWIyLCAweDAwNDcsIDB4MGEwYywgMHgwZDdkLCAweDkxYjIsIDB4MDA1MCwgMHgxYTBjLAorCTB4MGQ3ZCwgMHg5MTgyLCAweDAwNDcsIDB4MDA0MiwgMHgwODBjLCAweGFiMzMsIDB4MDEyMCwgMHg5MDg2LAorCTB4MDAwMiwgMHgwOTA0LCAweGFlMTQsIDB4MDAwNSwgMHhhZWQ1LCAweGFlZDUsIDB4YWVkNywgMHhhZjA5LAorCTB4YWVkNSwgMHhhZWQ1LCAweGFlZDUsIDB4YWVkNSwgMHhhZjFjLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMGQ2LAorCTB4MDAxNiwgMHgwMDk2LCAweDYwMDMsIDB4MDAwNCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YywgMHhkMGZjLAorCTB4MDFjMCwgMHhhODc4LCAweGMwZmMsIDB4OTAwNSwgMHgxMTU4LCAweGE4OTQsIDB4OTAwNSwgMHgwMTQwLAorCTB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MDgwYywgMHhiMDc5LCAweDA4MGMsIDB4YWNiMCwgMHgwMGE4LAorCTB4NjAwMywgMHgwMDAyLCAweGE4YTQsIDB4YTlhOCwgMHg5MTA1LCAweDExNzgsIDB4YThhZSwgMHhhOGIyLAorCTB4MGM3OCwgMHhhODdmLCAweDAwMjAsIDB4YTg4YywgMHhhODhhLCAweGE4YTQsIDB4YThhZSwgMHhhOGE4LAorCTB4YThiMiwgMHhhOGM3LCAweDAwMDAsIDB4YThjYiwgMHgwMDAwLCAweDAwOWUsIDB4MDAxZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwODBjLCAweDk2ZDUsIDB4MDBkNiwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLAorCTB4Yzk3YSwgMHgwMTIwLCAweGE4N2IsIDB4MDAwNiwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwgMHgwMGRlLAorCTB4MDgwYywgMHhhY2IwLCAweDA4MDQsIDB4OTczOCwgMHgwODBjLCAweDk2ZDUsIDB4MDgwYywgMHgzMjQwLAorCTB4MDgwYywgMHhkMGIwLCAweDAwZDYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhjOTdhLAorCTB4MDEyMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDBkZSwgMHgwODBjLAorCTB4YWNiMCwgMHgwODA0LCAweDk3MzgsIDB4OTE4MiwgMHgwMDQ3LCAweDAwMDIsIDB4YWY0MywgMHhhZjQ1LAorCTB4YWY0MywgMHhhZjQzLCAweGFmNDMsIDB4YWY0MywgMHhhZjQzLCAweGFmNDMsIDB4YWY0MywgMHhhZjQzLAorCTB4YWY0MywgMHhhZjQzLCAweGFmNDUsIDB4MDgwYywgMHgwZDdkLCAweDAwZDYsIDB4MDA5NiwgMHg2MDFmLAorCTB4MDAwMCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHgwODBjLAorCTB4NmRlZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHhhY2IwLCAweDAwMjYsIDB4MDAzNiwgMHgwMDU2LAorCTB4MDA2NiwgMHgwMDk2LCAweDAwYTYsIDB4MDBmNiwgMHgwMDA2LCAweDA4MGMsIDB4MTA0NywgMHgwMDBlLAorCTB4MDkwYywgMHgwZDdkLCAweGE5NjAsIDB4MjFlOCwgMHhhOTVjLCAweDkxODgsIDB4MDAxOSwgMHgyMWEwLAorCTB4OTAwZSwgMHgyMGE5LCAweDAwMjAsIDB4NDEwNCwgMHhhODdhLCAweDIwNzksIDB4MTgwMCwgMHg3OTkwLAorCTB4OTE4OCwgMHgwMDE4LCAweDkxOGMsIDB4MGZmZiwgMHhhOTcyLCAweGFjNzYsIDB4Mjk1MCwgMHgwMGE2LAorCTB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHg5MDFlLCAweDIwMjksIDB4MDAwMSwgMHg5MTgyLAorCTB4MDAzNCwgMHgxMjI4LCAweDIwMTEsIDB4MDAxZiwgMHgwODBjLCAweGM0ZjgsIDB4MDRjMCwgMHgyMTMwLAorCTB4MjAwOSwgMHgwMDM0LCAweDIwMTEsIDB4MDAxZiwgMHgwODBjLCAweGM0ZjgsIDB4OTZiMiwgMHgwMDM0LAorCTB4YjAwNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywgMHgwZmY5LCAweDA4MGMsIDB4MTA0NywgMHgwMWQwLAorCTB4ODUyOCwgMHhhODY3LCAweDAxMTAsIDB4YTg2YiwgMHgwMDAwLCAweDI5MjAsIDB4YjQwNiwgMHg5NjhhLAorCTB4MDAzZCwgMHgxMjMwLCAweDI2MDgsIDB4MjAxMSwgMHgwMDFiLCAweDA4MGMsIDB4YzRmOCwgMHgwMGI4LAorCTB4OTZiMiwgMHgwMDNjLCAweDIwMDksIDB4MDAzYywgMHgyOTUwLCAweDIwMTEsIDB4MDAxYiwgMHgwODBjLAorCTB4YzRmOCwgMHgwYzE4LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLAorCTB4OTVhZCwgMHgwMDUwLCAweGI1NjYsIDB4YjA3MCwgMHhjMGZkLCAweGIwNzIsIDB4MDA0OCwgMHgyMDAxLAorCTB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLCAweDk1YWQsIDB4MDA1MCwgMHhiNTY2LAorCTB4MmE0OCwgMHhhODA0LCAweGE4MDcsIDB4MDAwMCwgMHgwMDA2LCAweDA4MGMsIDB4NmRlZSwgMHgwMDBlLAorCTB4MjA0OCwgMHg5MDA1LCAweDFkYjAsIDB4MDBmZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDVlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMGY2LCAweDAwOTYsIDB4MDAwNiwgMHgwODBjLAorCTB4MTA0NywgMHgwMDBlLCAweDA5MGMsIDB4MGQ3ZCwgMHhhOTYwLCAweDIxZTgsIDB4YTk1YywgMHg5MTg4LAorCTB4MDAxOSwgMHgyMWEwLCAweDkwMGUsIDB4MjBhOSwgMHgwMDIwLCAweDQxMDQsIDB4YWE2NiwgMHhhODdhLAorCTB4MjA3OSwgMHgxODAwLCAweDc5OTAsIDB4ODEwYywgMHg5MTg4LCAweDAwMGMsIDB4OTE4MiwgMHgwMDFhLAorCTB4MDIxMCwgMHgyMDA5LCAweDAwMWEsIDB4MjFhOCwgMHg4MTBiLCAweGE5NzIsIDB4YWM3NiwgMHgyZTk4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWYsIDB4MjBhMCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwYywgMHg5MThkLAorCTB4MDA4MCwgMHgyMTAyLCAweDQwMDMsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLAorCTB4MDBmZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGQ2LCAweDAwZjYsIDB4MDA5NiwgMHgwMDE2LAorCTB4MjAwMSwgMHgwMjA1LCAweDIwMGMsIDB4OTE4ZCwgMHgwMDgwLCAweDIxMDIsIDB4MDAxZSwgMHgyMDc5LAorCTB4MDIwMCwgMHgyZTk4LCAweGE4N2MsIDB4ZDBlYywgMHgwMTE4LCAweDllODAsIDB4MDAwYywgMHgyMDk4LAorCTB4MjAyMSwgMHgwMDNlLCAweDkwMWUsIDB4OTI4MiwgMHgwMDIwLCAweDAyMTgsIDB4MjAxMSwgMHgwMDIwLAorCTB4MjAxOCwgMHg5NDg2LCAweDAwM2UsIDB4MTE3MCwgMHgwMDk2LCAweDA4MGMsIDB4MTA0NywgMHgyOTAwLAorCTB4MDA5ZSwgMHgwNWMwLCAweGE4MDYsIDB4MjA0OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAwMiwgMHgyMGEwLCAweDMzMDAsIDB4OTA4ZSwgMHgwMjYwLCAweDAxNDAsIDB4MjAwOSwgMHgwMjgwLAorCTB4OTEwMiwgMHg5MjBhLCAweDAyMTgsIDB4MjAxMCwgMHgyMTAwLCAweDkzMTgsIDB4MjIwMCwgMHg5NDAyLAorCTB4MTIyOCwgMHgyNDAwLCAweDkyMDIsIDB4MjQxMCwgMHg5MzE4LCAweDkwMDYsIDB4MjAyMCwgMHgyMmE4LAorCTB4YTgwMCwgMHg5MjAwLCAweGE4MDIsIDB4MjBlMSwgMHgwMDAwLCAweDQwMDMsIDB4ODNmZiwgMHgwMTgwLAorCTB4MzMwMCwgMHg5MDg2LCAweDAyODAsIDB4MTEzMCwgMHg3ODE0LCAweDgwMDAsIDB4OTA4NSwgMHgwMDgwLAorCTB4NzgxNiwgMHgyZTk4LCAweDIzMTAsIDB4ODRmZiwgMHgwOTA0LCAweGIwMjgsIDB4MDgwNCwgMHhiMDJhLAorCTB4OTA4NSwgMHgwMDAxLCAweDc4MTcsIDB4MDAwMCwgMHgwMDllLCAweDAwZmUsIDB4MDBkZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4MDA5NiwgMHg2MzE0LCAweDIzNDgsIDB4YTg3YSwgMHhhOTgyLAorCTB4MDgwYywgMHg2ZGUyLCAweDAwOWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4OTFiNiwgMHgwMDE1LAorCTB4MTExOCwgMHgwODBjLCAweGFjYjAsIDB4MDAzMCwgMHg5MWI2LCAweDAwMTYsIDB4MTkwYywgMHgwZDdkLAorCTB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MjBhOSwgMHgwMDBlLCAweDIwZTEsIDB4MDAwMCwgMHgyZTk4LAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4MjBhMCwgMHgwMDllLAorCTB4NDAwMywgMHgwMTM2LCAweDkwODAsIDB4MDAxYiwgMHgyMGEwLCAweDIwMTEsIDB4MDAwNiwgMHgyMGE5LAorCTB4MDAwMSwgMHgzNDE4LCAweDgzMTgsIDB4MjNhMCwgMHg0MDAzLCAweDMzMTgsIDB4ODMxOCwgMHgyMzk4LAorCTB4ODIxMSwgMHgxZGI4LCAweDIwMTEsIDB4MDAwNiwgMHgwMTNlLCAweDIwYTAsIDB4MzMxOCwgMHg4MzE4LAorCTB4MjM5OCwgMHg0MDAzLCAweDM0MTgsIDB4ODMxOCwgMHgyM2EwLCAweDgyMTEsIDB4MWRiOCwgMHgwMDk2LAorCTB4MDgwYywgMHhjOTdhLCAweDAxMzAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHgwMDllLCAweDA4MDQsIDB4YWNiMCwgMHgwMDk2LCAweDAwZDYsIDB4MDAzNiwgMHg3MzMwLAorCTB4OTM4NiwgMHgwMjAwLCAweDExYTgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhkNywgMHgwMDAwLAorCTB4MDBiZSwgMHg2MDE0LCAweDkwMDUsIDB4MDEzMCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHhhYjMyLCAweDA4MGMsIDB4YWNiMCwgMHgwMDNlLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDAxMSwgMHgxZDQ4LCAweDBjYzgsIDB4MDAwNiwgMHgwMDE2LCAweDA4MGMsIDB4ZDA5YiwgMHgwMTg4LAorCTB4NjAxNCwgMHg5MDA1LCAweDExNzAsIDB4NjAwYiwgMHgwMDAzLCAweDYwMWIsIDB4MDAwMCwgMHg2MDRiLAorCTB4MDAwMCwgMHgyMDA5LCAweDAwMjIsIDB4MDgwYywgMHhiNGQ1LCAweDkwMDYsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNkMCwgMHgwMDk2LCAweDAwMTYsIDB4MjBhOSwgMHgwMDE0LAorCTB4OWU4MCwgMHgwMDBjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk4LCAweDYwMTQsIDB4MjA0OCwgMHhhODYwLAorCTB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwgMHgyMGEwLCAweDQwMDMsIDB4MjAwMSwgMHgwMjA1LAorCTB4MjAwMywgMHgwMDAxLCAweDIwOTksIDB4MDI2MCwgMHgyMGE5LCAweDAwMTYsIDB4NDAwMywgMHgyMGE5LAorCTB4MDAwYSwgMHhhODA0LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDAyLAorCTB4MjBhMCwgMHg0MDAzLCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDIsIDB4MjA5OSwgMHgwMjYwLAorCTB4MjBhOSwgMHgwMDIwLCAweDQwMDMsIDB4MjAwMywgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHhhODAwLAorCTB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywgMHhhY2IwLCAweDAwMWUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDA5NiwgMHgwMDE2LCAweDkwMGUsIDB4NzAzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDE0MCwgMHg3MDM4LAorCTB4OTA4NCwgMHgwMGZmLCAweDgwMGMsIDB4NzAzYywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwgMHg5MDgwLAorCTB4MDAwNCwgMHg5MTA4LCAweDgxMGIsIDB4MjAxMSwgMHgwMDAyLCAweDIwMTksIDB4MDAwYywgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGM0ZjgsIDB4MDgwYywgMHhjOTdhLCAweDAxNDAsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTgwNywgMHgwMDAwLCAweGE4NjQsIDB4YThlMiwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywgMHhhY2IwLAorCTB4MDAxZSwgMHgwMDllLCAweDAwMDUsIDB4MDAxNiwgMHgyMDA5LCAweDAwMDAsIDB4NzAzMCwgMHg5MDg2LAorCTB4MDIwMCwgMHgwMTEwLCAweDIwMDksIDB4MDAwMSwgMHgwMDk2LCAweDYwMTQsIDB4OTA0ZCwgMHgwOTBjLAorCTB4MGQ3ZCwgMHhhOTdhLCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDA4MGMsIDB4YWNiMCwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMDE2LCAweDAwOTYsIDB4NzAzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTExOCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwMDEwLCAweDcwMzQsIDB4ODAwYywgMHg4MTBiLCAweDIwMTEsIDB4MDAwYywgMHgyMDE5LAorCTB4MDAwYywgMHg2MDE0LCAweDIwNDgsIDB4YTgwNCwgMHgwMDk2LCAweDkwMDUsIDB4MDEwOCwgMHgyMDQ4LAorCTB4MDgwYywgMHhjNGY4LCAweDAwOWUsIDB4MDgwYywgMHhjOTdhLCAweDAxNDgsIDB4YTgwNCwgMHg5MDA1LAorCTB4MTE1OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NCwgMHhhOGUyLCAweGE4NjcsIDB4MDEwMywgMHgwODBjLAorCTB4YWNiMCwgMHgwMDllLCAweDAwMWUsIDB4MDAwNSwgMHgwMDg2LCAweDIwNDAsIDB4YTAzMCwgMHg4MDA3LAorCTB4OTA4NiwgMHgwMTAwLCAweDExMTgsIDB4MDgwYywgMHhiNjkzLCAweDAwZTAsIDB4YTAzNCwgMHg4MDA3LAorCTB4ODAwYywgMHg4ODA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDBjLCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLAorCTB4YWFhMCwgMHhhYjljLCAweGFjYTgsIDB4YWRhNCwgMHgyMDMxLCAweDAwMDAsIDB4MjA0MSwgMHgxMjk2LAorCTB4MDAxOSwgMHgwZDA4LCAweDAwOGUsIDB4MDg5OCwgMHgwMDk2LCAweDAwMDYsIDB4MDgwYywgMHgxMDQ3LAorCTB4MDAwZSwgMHgwMWIwLCAweGE4YWIsIDB4MGRjYiwgMHhhODc2LCAweDAwMGUsIDB4YThhMiwgMHgwMDA2LAorCTB4YWU2YSwgMHgyODAwLCAweGE4OWUsIDB4YTk3YSwgMHhhZjcyLCAweGFhOGUsIDB4YWI5MiwgMHhhYzk2LAorCTB4YWQ5YSwgMHgwMDg2LCAweDI5NDAsIDB4MDgwYywgMHgxMTNjLCAweDAwOGUsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDI2LCAweDcwMDgsIDB4OTA4NCwgMHgwMGZmLAorCTB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExMCwgMHgwMGJlLCAweDkyMDYsIDB4MTUyMCwgMHg3MDBjLAorCTB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExNCwgMHgwMGJlLCAweDkyMDYsIDB4MTFlMCwgMHg2MDRiLAorCTB4MDAwMCwgMHgyYzY4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDM1LCAweDA4MGMsIDB4ZDAxMywgMHgwMDFlLAorCTB4MTE1OCwgMHg2MjJjLCAweDIyNjgsIDB4MjA3MSwgMHgwMjZjLCAweDZiMjAsIDB4OTM4NiwgMHgwMDAzLAorCTB4MDEzMCwgMHg5Mzg2LCAweDAwMDYsIDB4MDEyOCwgMHgwODBjLCAweGFjYjAsIDB4MDAyMCwgMHgwMDM5LAorCTB4MDAxMCwgMHgwODBjLCAweGIzMGEsIDB4MDAyZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDk2LAorCTB4NjgxNCwgMHgyMDQ4LCAweDkxODYsIDB4MDAxNSwgMHgwOTA0LCAweGIyZTksIDB4OTE4ZSwgMHgwMDE2LAorCTB4MTkwNCwgMHhiMzA4LCAweDcwMGMsIDB4OTA4YywgMHhmZjAwLCAweDkxODYsIDB4MTcwMCwgMHgwMTIwLAorCTB4OTE4NiwgMHgwMzAwLCAweDE5MDQsIDB4YjJjMywgMHg4OWZmLCAweDExMzgsIDB4NjgwMCwgMHg5MDg2LAorCTB4MDAwZiwgMHgwOTA0LCAweGIyYTUsIDB4MDgwNCwgMHhiMzA2LCAweDY4MDgsIDB4OTA4NiwgMHhmZmZmLAorCTB4MTkwNCwgMHhiMmViLCAweGE4N2MsIDB4OTA4NCwgMHgwMDYwLCAweDkwODYsIDB4MDAyMCwgMHgxMTUwLAorCTB4YThhYywgMHhhOTM0LCAweDkxMDYsIDB4MTkwNCwgMHhiMmViLCAweGE4YjAsIDB4YTkzOCwgMHg5MTA2LAorCTB4MTkwNCwgMHhiMmViLCAweDY4MjQsIDB4ZDA4NCwgMHgxOTA0LCAweGIyZWIsIDB4ZDBiNCwgMHgwMTU4LAorCTB4MDAxNiwgMHgyMDAxLCAweDE5ODUsIDB4MjAwYywgMHg2MDE4LCAweDkxMDIsIDB4OTA4MiwgMHgwMDA1LAorCTB4MDAxZSwgMHgxYTA0LCAweGIyZWIsIDB4MDgwYywgMHhjYjZiLCAweDY4MTAsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTlhMCwgMHgwMDllLCAweDY4NWMsIDB4YTg3YSwgMHhhOTc2LCAweDY4NjQsIDB4YTg4MiwgMHhhODdjLAorCTB4YzBkYywgMHhjMGY0LCAweGMwZDQsIDB4YTg3ZSwgMHgwMDI2LCAweDkwMGUsIDB4NmExOCwgMHgyMDAxLAorCTB4MDAwYSwgMHgwODBjLCAweDkxZjgsIDB4YTg4NCwgMHg5MjBhLCAweDAyMDgsIDB4ODAxMSwgMHhhYTg2LAorCTB4ODJmZiwgMHgwMDJlLCAweDExMzgsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YzY4MywgMHgwMGNlLAorCTB4MDgwNCwgMHhiMzA2LCAweDAwYzYsIDB4YTg2OCwgMHhkMGZjLCAweDExMTgsIDB4MDgwYywgMHg2MTI0LAorCTB4MDAxMCwgMHgwODBjLCAweDY1MmYsIDB4MDBjZSwgMHgxOTA0LCAweGIyZWIsIDB4MDBjNiwgMHgyZDYwLAorCTB4MDgwYywgMHhhY2IwLCAweDAwY2UsIDB4MDgwNCwgMHhiMzA2LCAweDAwYzYsIDB4MDgwYywgMHhhZDIwLAorCTB4MDE5OCwgMHg2MDE3LCAweDAwMDAsIDB4NjgxMCwgMHg2MDEyLCAweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLAorCTB4MDAwMywgMHg2OTA0LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGFjYjAsIDB4MDBjZSwgMHgwODBjLAorCTB4YWQ0ZCwgMHgwMGNlLCAweDA4MDQsIDB4YjMwNiwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2ODRhLAorCTB4MDBjZSwgMHgwODA0LCAweGIzMDYsIDB4NzAwOCwgMHg5MDg2LCAweDAwMGIsIDB4MTFjOCwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI5MDAsIDB4YzFiYywgMHhiOTAyLCAweDAwYmUsIDB4MDBjNiwgMHgyZDYwLAorCTB4YTg3YiwgMHgwMDAzLCAweDA4MGMsIDB4ZDA1NSwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLAorCTB4NjAyMywgMHgwMDAyLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDBjZSwgMHgwNDMwLAorCTB4NzAwYywgMHg5MDg2LCAweDJhMDAsIDB4MTEzOCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2ODRhLAorCTB4MDBlOCwgMHgwNGMxLCAweDAwZTgsIDB4ODlmZiwgMHgwOTBjLCAweDBkN2QsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MmQ2MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDAzLCAweDA4MGMsIDB4NmMwNCwgMHgwODBjLAorCTB4Y2I2YiwgMHgwODBjLCAweGFjZWIsIDB4MDAyNiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiYTNjLAorCTB4MDgwYywgMHg2N2JlLCAweDAwYmUsIDB4MDAyZSwgMHgwMGRlLCAweDAwY2UsIDB4MDgwYywgMHhhY2IwLAorCTB4MDA5ZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxNSwgMHgxMTI4LCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LAorCTB4Njg0YSwgMHgwMDY4LCAweDkxOGUsIDB4MDAxNiwgMHgxMTYwLCAweDAwYzYsIDB4MmQwMCwgMHgyMDYwLAorCTB4MDgwYywgMHhlNmEwLCAweDA4MGMsIDB4ODk0ZSwgMHgwODBjLCAweGFjYjAsIDB4MDBjZSwgMHgwODBjLAorCTB4YWNiMCwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDcyMjgsIDB4YWNiMCwgMHhhYmFjLAorCTB4ZDJmNCwgMHgwMTMwLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDY4NGEsIDB4MDgwNCwgMHhiMzg0LAorCTB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YzU1OSwgMHgwMGNlLCAweDY4MDQsIDB4OTA4NiwgMHgwMDUwLAorCTB4MTE2OCwgMHgwMGM2LCAweDJkMDAsIDB4MjA2MCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDUwLAorCTB4MjAwOSwgMHg4MDIzLCAweDA4MGMsIDB4OTJiMCwgMHgwMGNlLCAweDA0ZjAsIDB4NjgwMCwgMHg5MDg2LAorCTB4MDAwZiwgMHgwMWE4LCAweDg5ZmYsIDB4MDkwYywgMHgwZDdkLCAweDY4MDAsIDB4OTA4NiwgMHgwMDA0LAorCTB4MTE5MCwgMHhhODdjLCAweGQwYWMsIDB4MDE3OCwgMHhhODQzLCAweDBmZmYsIDB4YTgzZiwgMHgwZmZmLAorCTB4YTg4MCwgMHhjMGZjLCAweGE4ODIsIDB4MjAwMSwgMHgwMDAxLCAweDY4MzIsIDB4MDQwMCwgMHgyMDAxLAorCTB4MDAwNywgMHg2ODMyLCAweDAwZTAsIDB4YTg3YywgMHhkMGI0LCAweDExNTAsIDB4ZDBhYywgMHgwZGI4LAorCTB4NjgyNCwgMHhkMGY0LCAweDFkNDgsIDB4YTgzOCwgMHhhOTM0LCAweDkxMDUsIDB4MGQ4MCwgMHgwYzIwLAorCTB4ZDJlYywgMHgxZDY4LCAweDcwMjQsIDB4OTMwNiwgMHgxMTE4LCAweDcwMjAsIDB4OTQwNiwgMHgwZDM4LAorCTB4NzAyMCwgMHg2ODNlLCAweDcwMjQsIDB4NjgzYSwgMHgyMDAxLCAweDAwMDUsIDB4NjgzMiwgMHgwODBjLAorCTB4Y2NmZiwgMHgwODBjLCAweDk3MzgsIDB4MDAxMCwgMHgwODBjLCAweGFjYjAsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDI2LCAweDcwMDgsIDB4OTA4NCwgMHgwMGZmLAorCTB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExMCwgMHgwMGJlLCAweDkyMDYsIDB4MTkwNCwgMHhiM2VmLAorCTB4NzAwYywgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTE0LCAweDAwYmUsIDB4OTIwNiwgMHgxOTA0LAorCTB4YjNlZiwgMHg2MDM4LCAweDIwNjgsIDB4NjgyNCwgMHhjMGRjLCAweDY4MjYsIDB4NmEyMCwgMHg5Mjg2LAorCTB4MDAwNywgMHgwOTA0LCAweGIzZWYsIDB4OTI4NiwgMHgwMDAyLCAweDA5MDQsIDB4YjNlZiwgMHg5Mjg2LAorCTB4MDAwMCwgMHgwNWU4LCAweDY4MDgsIDB4NjMzYywgMHg5MzA2LCAweDE1YzgsIDB4MjA3MSwgMHgwMjZjLAorCTB4OTE4NiwgMHgwMDE1LCAweDA1NzAsIDB4OTE4ZSwgMHgwMDE2LCAweDExMDAsIDB4MDBjNiwgMHg2MDM4LAorCTB4MjA2MCwgMHg2MTA0LCAweDkxODYsIDB4MDA0YiwgMHgwMWMwLCAweDkxODYsIDB4MDA0YywgMHgwMWE4LAorCTB4OTE4NiwgMHgwMDRkLCAweDAxOTAsIDB4OTE4NiwgMHgwMDRlLCAweDAxNzgsIDB4OTE4NiwgMHgwMDUyLAorCTB4MDE2MCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDkwYywgMHgwZDdkLAorCTB4YTg3YiwgMHgwMDAzLCAweDAwOWUsIDB4MDgwYywgMHhkMDU1LCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLAorCTB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMGNlLAorCTB4MDAzMCwgMHg2MDM4LCAweDIwNzAsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4NzA0YSwgMHgwODBjLAorCTB4YWNiMCwgMHgwMDJlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA5NiwgMHgwMGY2LAorCTB4NjAxNCwgMHgyMDQ4LCAweDYwMTAsIDB4MjA1OCwgMHg5MWI2LCAweDAwMTUsIDB4MDEzMCwgMHhiYTA4LAorCTB4YmIwYywgMHhiYzAwLCAweGM0OGMsIDB4YmMwMiwgMHgwNDYwLCAweDAwOTYsIDB4MDE1NiwgMHgwMDM2LAorCTB4MDAyNiwgMHgyYjQ4LCAweDllOTAsIDB4MDAxMCwgMHgyMDE5LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDgwYywgMHhiY2EyLCAweDAwMmUsIDB4MDAzZSwgMHgwMTVlLCAweDAwOWUsIDB4MTkwNCwgMHhiNDVlLAorCTB4MDA5NiwgMHgwMTU2LCAweDAwMzYsIDB4MDAyNiwgMHgyYjQ4LCAweDllOTAsIDB4MDAxNCwgMHgyMDE5LAorCTB4MDAwNiwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHhiY2EyLCAweDAwMmUsIDB4MDAzZSwgMHgwMTVlLAorCTB4MDA5ZSwgMHgxNWEwLCAweDcyMzgsIDB4YmEwYSwgMHg3MzNjLCAweGJiMGUsIDB4YmMwMCwgMHhjNDhkLAorCTB4YmMwMiwgMHhhODA0LCAweDkwMDUsIDB4MTEyOCwgMHgwMGZlLCAweDAwOWUsIDB4MDBiZSwgMHgwODA0LAorCTB4YjBiZiwgMHgwMDk2LCAweDIwNDgsIDB4YWExMiwgMHhhYjE2LCAweGFjMGEsIDB4MDA5ZSwgMHg4MDA2LAorCTB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLAorCTB4MjAwOSwgMHgwMDJiLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsIDB4MjAzMSwgMHgwMDAwLAorCTB4MjA0MSwgMHgxMjk2LCAweDA4MGMsIDB4YjFkNCwgMHgwMTMwLCAweDAwZmUsIDB4MDA5ZSwgMHgwODBjLAorCTB4YWNiMCwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHhiNjkzLCAweDBjYjgsIDB4MmI3OCwgMHgwMGY2LAorCTB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwgMHgwMGZlLCAweDAwYzYsIDB4MDgwYywgMHhhYzVhLAorCTB4MmYwMCwgMHg2MDEyLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLAorCTB4NjAwMywgMHgwMDAxLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTMsIDB4MDgwYywgMHg2NjBmLAorCTB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMGNlLCAweDA4MDQsIDB4YjQzMSwgMHgyMTAwLAorCTB4OTFiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGQ3ZCwgMHg5MWIyLCAweDAwNDAsIDB4MWEwNCwgMHhiNGU3LAorCTB4MDAwMiwgMHhiNGQ1LCAweGI0ZDUsIDB4YjRjYiwgMHhiNGQ1LCAweGI0ZDUsIDB4YjRkNSwgMHhiNGM5LAorCTB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LAorCTB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LAorCTB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LAorCTB4YjRkNSwgMHhiNGM5LCAweGI0ZDUsIDB4YjRkNSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LAorCTB4YjRjOSwgMHhiNGNiLCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LAorCTB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRkNSwgMHhiNGQ1LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LAorCTB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRjOSwgMHhiNGM5LCAweGI0YzksIDB4YjRkNSwgMHhiNGM5LAorCTB4YjRjOSwgMHgwODBjLCAweDBkN2QsIDB4MDA2NiwgMHgwMGI2LCAweDY2MTAsIDB4MjY1OCwgMHhiOGQ0LAorCTB4YzA4YywgMHhiOGQ2LCAweDAwYmUsIDB4MDA2ZSwgMHgwMDAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LAorCTB4OTE4NiwgMHgwMDMyLCAweDAxMTgsIDB4MDgwYywgMHg5MmI3LCAweDAwMTAsIDB4MDgwYywgMHg5MmIwLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5NzM4LCAweDAxMmUsIDB4MDAwNSwgMHgyNjAwLAorCTB4MDAwMiwgMHhiNGQ1LCAweGI0ZDUsIDB4YjRmYiwgMHhiNGQ1LCAweGI0ZDUsIDB4YjRmYiwgMHhiNGZiLAorCTB4YjRmYiwgMHhiNGZiLCAweGI0ZDUsIDB4YjRmYiwgMHhiNGQ1LCAweGI0ZmIsIDB4YjRkNSwgMHhiNGZiLAorCTB4YjRmYiwgMHhiNGZiLCAweGI0ZmIsIDB4MDgwYywgMHgwZDdkLCAweDYwMDQsIDB4OTBiMiwgMHgwMDUzLAorCTB4MWEwYywgMHgwZDdkLCAweDkxYjYsIDB4MDAxMywgMHgwOTA0LCAweGI1ZDIsIDB4OTFiNiwgMHgwMDI3LAorCTB4MTkwNCwgMHhiNTdlLCAweDA4MGMsIDB4OTY3YSwgMHg2MDA0LCAweDA4MGMsIDB4Y2I4MCwgMHgwMWIwLAorCTB4MDgwYywgMHhjYjkxLCAweDAxYTgsIDB4OTA4ZSwgMHgwMDIxLCAweDA5MDQsIDB4YjU3YiwgMHg5MDhlLAorCTB4MDAyMiwgMHgxMTMwLCAweDA4MGMsIDB4YjBlYiwgMHgwOTA0LCAweGI1NzcsIDB4MDgwNCwgMHhiNTc4LAorCTB4OTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4YjU3YiwgMHgwODA0LCAweGI1NzEsIDB4MDgwYywgMHgzMjZmLAorCTB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlMywgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOWEwLAorCTB4MDBiZSwgMHgwODBjLCAweGI2OTMsIDB4OTE4NiwgMHgwMDdlLCAweDExNDgsIDB4MjAwMSwgMHgxODM3LAorCTB4MjAxNCwgMHhjMjg1LCAweDA4MGMsIDB4NzUzZCwgMHgxMTA4LCAweGMyYWQsIDB4MjIwMiwgMHgwODBjLAorCTB4YTkxZSwgMHgwMDM2LCAweDAwMjYsIDB4MjAxOSwgMHgwMDI4LCAweDIxMTAsIDB4MDgwYywgMHhlN2FjLAorCTB4MDAyZSwgMHgwMDNlLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIxMTAsIDB4MjAxOSwgMHgwMDI4LAorCTB4MDgwYywgMHg5NDNkLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDkzMDYsIDB4NjAxMCwgMHgwMGI2LAorCTB4OTA1ZCwgMHgwMTAwLCAweDAwYmUsIDB4MmMwOCwgMHgwODBjLCAweGUxNjcsIDB4MDA3ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4YTkzYSwgMHgwODBjLCAweGQwYjAsIDB4MDAxNiwgMHgwODBjLAorCTB4Y2UwZCwgMHgwODBjLCAweGFjYjAsIDB4MDAxZSwgMHgwODBjLCAweDMzNDksIDB4MDgwYywgMHg5NzM4LAorCTB4MDAzMCwgMHgwODBjLCAweGNlMGQsIDB4MDgwYywgMHhhY2IwLCAweDA4MGMsIDB4OTczOCwgMHgwMDA1LAorCTB4MDgwYywgMHhiNjkzLCAweDBjYjAsIDB4MDgwYywgMHhiNmNmLCAweDBjOTgsIDB4OTE4NiwgMHgwMDE1LAorCTB4MDExOCwgMHg5MTg2LCAweDAwMTYsIDB4MTE0MCwgMHgwODBjLCAweGFiMzMsIDB4MGQ4MCwgMHg5MDg2LAorCTB4MDAwMiwgMHgwOTA0LCAweGI2ZGEsIDB4MGM1OCwgMHg5MTg2LCAweDAwMTQsIDB4MWQ0MCwgMHgwODBjLAorCTB4OTY3YSwgMHg2MDA0LCAweDkwOGUsIDB4MDAyMiwgMHgxMTE4LCAweDA4MGMsIDB4YjBlYiwgMHgwOWY4LAorCTB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwgMHgwODBjLCAweGNiODAsIDB4MTE5MCwgMHgwODBjLAorCTB4MzI2ZiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOWEwLCAweDAwYmUsIDB4MDgwYywgMHhiNjkzLAorCTB4OTE4NiwgMHgwMDdlLCAweDExMjgsIDB4MjAwMSwgMHgxODM3LCAweDIwMGMsIDB4YzE4NSwgMHgyMTAyLAorCTB4MDgwMCwgMHgwODBjLCAweGNiOTEsIDB4MTEyMCwgMHgwODBjLCAweGI2OTMsIDB4MDgwNCwgMHhiNTcxLAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMzIsIDB4MTE2MCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODllLAorCTB4MjA3OSwgMHgwMDAwLCAweDA4MGMsIDB4MzVlYSwgMHgwMGZlLCAweDAwZWUsIDB4MDgwNCwgMHhiNTcxLAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMjEsIDB4MGQ0MCwgMHg5MDhlLCAweDAwMjIsIDB4MDkwYywgMHhiNjkzLAorCTB4MDgwNCwgMHhiNTcxLCAweDkwYjIsIDB4MDA0MCwgMHgxYTA0LCAweGI2NzMsIDB4MjAwOCwgMHgwMDAyLAorCTB4YjYxYSwgMHhiNjFiLCAweGI2MWUsIDB4YjYyMSwgMHhiNjI0LCAweGI2MjcsIDB4YjYxOCwgMHhiNjE4LAorCTB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LAorCTB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LAorCTB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYyYSwgMHhiNjM1LAorCTB4YjYxOCwgMHhiNjM2LCAweGI2MzUsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LAorCTB4YjYzNSwgMHhiNjM1LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LAorCTB4YjYxOCwgMHhiNjE4LCAweGI2NWUsIDB4YjYzNSwgMHhiNjE4LCAweGI2MzEsIDB4YjYxOCwgMHhiNjE4LAorCTB4YjYxOCwgMHhiNjMyLCAweGI2MTgsIDB4YjYxOCwgMHhiNjE4LCAweGI2MzUsIDB4YjY1OSwgMHhiNjE4LAorCTB4MDgwYywgMHgwZDdkLCAweDAwZDAsIDB4MjAwMSwgMHgwMDBiLCAweDAwZjgsIDB4MjAwMSwgMHgwMDAzLAorCTB4MDBlMCwgMHgyMDAxLCAweDAwMDUsIDB4MDBjOCwgMHgyMDAxLCAweDAwMDEsIDB4MDBiMCwgMHgyMDAxLAorCTB4MDAwOSwgMHgwMDk4LCAweDYwMDMsIDB4MDAwNSwgMHgwODBjLCAweGQwYjMsIDB4MDgwYywgMHg5NzM4LAorCTB4MDA1OCwgMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg2NWUzLCAweDA0YjgsIDB4MDgwYywgMHhkMGIzLAorCTB4NjAwMywgMHgwMDA0LCAweDA4MGMsIDB4OTczOCwgMHgwMDA1LCAweDA4MGMsIDB4NjVlMywgMHg2MDAzLAorCTB4MDAwMiwgMHgwMDM2LCAweDIwMTksIDB4MTg1MiwgMHgyMzA0LCAweDkwODQsIDB4ZmYwMCwgMHgxMTIwLAorCTB4MjAwMSwgMHgxOTg1LCAweDIwMWMsIDB4MDA0MCwgMHg4MDA3LCAweDkwOWEsIDB4MDAwNCwgMHgwZWMwLAorCTB4ODAwMywgMHg4MDFiLCAweDgzMWIsIDB4OTMxOCwgMHg2MzFhLCAweDAwM2UsIDB4MDgwYywgMHg5NzM4LAorCTB4MGMxOCwgMHgwODBjLCAweGNlMGQsIDB4MDgwYywgMHhhY2IwLCAweDA4ZjAsIDB4MDBlNiwgMHgwMGY2LAorCTB4MjA3MSwgMHgxODllLCAweDIwNzksIDB4MDAwMCwgMHgwODBjLCAweDM1ZWEsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4YWNiMCwgMHgwODc4LCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLAorCTB4ZDBiMywgMHgwODA0LCAweDk3MzgsIDB4MjYwMCwgMHgyMDA4LCAweDAwMDIsIDB4YjY4YSwgMHhiNjZkLAorCTB4YjY4OCwgMHhiNjZkLCAweGI2NmQsIDB4YjY4OCwgMHhiNjg4LCAweGI2ODgsIDB4YjY4OCwgMHhiNjZkLAorCTB4YjY4OCwgMHhiNjZkLCAweGI2ODgsIDB4YjY2ZCwgMHhiNjg4LCAweGI2ODgsIDB4YjY4OCwgMHhiNjg4LAorCTB4MDgwYywgMHgwZDdkLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLAorCTB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDBlNiwgMHgwMDk2LCAweDAwMjYsIDB4MDAxNiwgMHgwODBjLAorCTB4Yzk3YSwgMHgwNTY4LCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwgMHgxMWE4LAorCTB4YTg5NCwgMHg5MDg2LCAweDAwNTYsIDB4MTE0OCwgMHgwODBjLCAweDU0Y2EsIDB4MDEzMCwgMHgyMDAxLAorCTB4MDAwMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwMCwgMHgwMDI4LCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLAorCTB4MjAxMSwgMHg0MDA1LCAweDA4MGMsIDB4Y2Y3YSwgMHgwMDkwLCAweGE4NjgsIDB4ZDBmYywgMHgwMTc4LAorCTB4YTgwNywgMHgwMDAwLCAweDAwMTYsIDB4NjAwNCwgMHg5MDhlLCAweDAwMjEsIDB4MDE2OCwgMHg5MDhlLAorCTB4MDAzZCwgMHgwMTUwLCAweDAwMWUsIDB4YTg2NywgMHgwMTAzLCAweGE4MzMsIDB4MDEwMCwgMHgwMDFlLAorCTB4MDAyZSwgMHgwMDllLCAweDAwZWUsIDB4MDAwNSwgMHgwMDFlLCAweDAwMDksIDB4MGNjMCwgMHgwMDk2LAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4YTgyMywgMHg4MDAxLAorCTB4MDA5ZSwgMHgwMDA1LCAweDAwYjYsIDB4NjYxMCwgMHgyNjU4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTBiMiwgMHgwMDBjLCAweDFhMGMsIDB4MGQ3ZCwgMHg2NjA0LCAweDk2YjYsIDB4MDA0ZCwgMHgxMTIwLAorCTB4MDgwYywgMHhjZTk5LCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDA0MywgMHgxMTIwLAorCTB4MDgwYywgMHhjZWUyLCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDA0YiwgMHgxMTIwLAorCTB4MDgwYywgMHhjZjBlLCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDAzMywgMHgxMTIwLAorCTB4MDgwYywgMHhjZTJmLCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDAyOCwgMHgxMTIwLAorCTB4MDgwYywgMHhjYmNmLCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDAyOSwgMHgxMTIwLAorCTB4MDgwYywgMHhjYzEwLCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDAxZiwgMHgxMTIwLAorCTB4MDgwYywgMHhiMDkzLCAweDA4MDQsIDB4Yjc1ZiwgMHg2NjA0LCAweDk2YjYsIDB4MDAwMCwgMHgxMTE4LAorCTB4MDgwYywgMHhiM2Y1LCAweDA0ZTAsIDB4NjYwNCwgMHg5NmI2LCAweDAwMjIsIDB4MTExOCwgMHgwODBjLAorCTB4YjBjYywgMHgwNGE4LCAweDY2MDQsIDB4OTZiNiwgMHgwMDM1LCAweDExMTgsIDB4MDgwYywgMHhiMWYyLAorCTB4MDQ3MCwgMHg2NjA0LCAweDk2YjYsIDB4MDAzOSwgMHgxMTE4LCAweDA4MGMsIDB4YjM4YSwgMHgwNDM4LAorCTB4NjYwNCwgMHg5NmI2LCAweDAwM2QsIDB4MTExOCwgMHgwODBjLCAweGIxMDQsIDB4MDQwMCwgMHg2NjA0LAorCTB4OTZiNiwgMHgwMDQ0LCAweDExMTgsIDB4MDgwYywgMHhiMTQwLCAweDAwYzgsIDB4NjYwNCwgMHg5NmI2LAorCTB4MDA0OSwgMHgxMTE4LCAweDA4MGMsIDB4YjE4MSwgMHgwMDkwLCAweDY2MDQsIDB4OTZiNiwgMHgwMDQxLAorCTB4MTExOCwgMHgwODBjLCAweGIxNmIsIDB4MDA1OCwgMHg5MWI2LCAweDAwMTUsIDB4MTExMCwgMHgwMDYzLAorCTB4MDAzMCwgMHg5MWI2LCAweDAwMTYsIDB4MTEyOCwgMHgwMGJlLCAweDA4MDQsIDB4YjliYiwgMHgwMGJlLAorCTB4MDAwNSwgMHgwODBjLCAweGFkNmEsIDB4MGNkOCwgMHhiNzdjLCAweGI3N2YsIDB4Yjc3YywgMHhiN2M2LAorCTB4Yjc3YywgMHhiOTJmLCAweGI5YzgsIDB4Yjc3YywgMHhiNzdjLCAweGI5OTEsIDB4Yjc3YywgMHhiOWE3LAorCTB4MDA5NiwgMHg2MDFmLCAweDAwMDAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDAsIDB4MjA0OCwgMHhhODY3LAorCTB4MDEwMywgMHgwMDllLCAweDA4MDQsIDB4YWNiMCwgMHhhMDAxLCAweGEwMDEsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDcwOTAsIDB4OTA4NiwgMHgwMDc0LCAweDE1NDAsIDB4MDgwYywgMHhlMTM4LAorCTB4MTFiMCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHg3MDMwLCAweGQwOGMsIDB4MDEyOCwgMHhiODAwLAorCTB4ZDBiYywgMHgwMTEwLCAweGMwYzUsIDB4YjgwMiwgMHgwMGY5LCAweDAwYmUsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4MzI2ZiwgMHgwODBjLCAweGFjYjAsIDB4MDA5OCwgMHgyMDAxLAorCTB4MDAwYSwgMHgwODBjLCAweDY1ZTMsIDB4MDgwYywgMHgzMjZmLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMjAsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHhiOGZmLCAweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweGI4MDAsIDB4ZDA4NCwgMHgwMTYwLAorCTB4OTAwNiwgMHgwODBjLCAweDY1Y2YsIDB4MjA2OSwgMHgxODQ3LCAweDY4MDQsIDB4ZDBhNCwgMHgwMTIwLAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjYwZiwgMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDk2LAorCTB4MDBkNiwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwNzQsIDB4MTkwNCwgMHhiOGQ0LAorCTB4NjAxMCwgMHgyMDU4LCAweGJhYTAsIDB4OTI4NiwgMHgwMDdlLCAweDExMjAsIDB4MDgwYywgMHhiYjE1LAorCTB4MDgwNCwgMHhiODM4LCAweDA4MGMsIDB4YmIwYSwgMHg2MDEwLCAweDIwNTgsIDB4YmFhMCwgMHg5Mjg2LAorCTB4MDA4MCwgMHgxNTEwLCAweDYwMTQsIDB4OTAwNSwgMHgwMWE4LCAweDIwNDgsIDB4YTg2NCwgMHg5MDg0LAorCTB4MDBmZiwgMHg5MDg2LCAweDAwMzksIDB4MTE0MCwgMHgyMDAxLCAweDAwMDAsIDB4OTAwZSwgMHgyMDExLAorCTB4NDAwMCwgMHgwODBjLCAweGNmN2EsIDB4MDAzMCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTgzMywgMHgwMjAwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTMsIDB4MDgwYywgMHgzMjZmLAorCTB4MDgwYywgMHhhY2IwLCAweDA4MDQsIDB4YjhkOSwgMHgwODBjLCAweGI4ZTcsIDB4NjAxNCwgMHg5MDA1LAorCTB4MDE5MCwgMHgyMDQ4LCAweGE4NjgsIDB4ZDBmNCwgMHgwMWU4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDM5LCAweDFkMDgsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDAwLAorCTB4MDgwYywgMHhjZjdhLCAweDA4ZjgsIDB4MDgwYywgMHhiOGRkLCAweDAxNjAsIDB4OTAwNiwgMHgwODBjLAorCTB4NjVjZiwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2NjBmLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NjVlMywgMHgwOGEwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDgwNCwgMHhiOGQ5LAorCTB4Yjg1YywgMHhkMGU0LCAweDAxZDgsIDB4MDgwYywgMHhjZGE3LCAweDA4MGMsIDB4NzUzZCwgMHgwMTE4LAorCTB4ZDBkYywgMHgxOTA0LCAweGI3ZmEsIDB4MjAxMSwgMHgxODM3LCAweDIyMDQsIDB4YzBhZCwgMHgyMDEyLAorCTB4MjAwMSwgMHgxOTZjLCAweDIwMDQsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzhlMywgMHgwMDAwLAorCTB4MDgwYywgMHgyNmQ1LCAweDc4ZTIsIDB4MDBmZSwgMHgwODA0LCAweGI3ZmEsIDB4MDgwYywgMHhjZGU4LAorCTB4MjAxMSwgMHgxODM3LCAweDIyMDQsIDB4YzBhNSwgMHgyMDEyLCAweDAwMDYsIDB4MDgwYywgMHhlMmM4LAorCTB4MDAwZSwgMHgxOTA0LCAweGI3ZmEsIDB4YzBiNSwgMHgyMDEyLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLAorCTB4NjVlMywgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHgwMGM2LCAweDIwMDEsIDB4MTgwZiwgMHgyMDA0LAorCTB4ZDA5YywgMHgwNTIwLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4NzAwYywgMHg5MDg0LCAweDAwZmYsIDB4NzhlNiwgMHg3MDdlLCAweDcwMTAsIDB4NzhlYSwgMHg3MDgyLAorCTB4OTA4YywgMHgwMGZmLCAweDAwZWUsIDB4NzgwYywgMHhjMGI1LCAweDc4MGUsIDB4MDBmZSwgMHgwODBjLAorCTB4MjZhYSwgMHgwMGY2LCAweDIxMDAsIDB4OTAwZSwgMHgwODBjLCAweDI2NjEsIDB4Nzk1ZSwgMHgwMGZlLAorCTB4OTE4NiwgMHgwMDgxLCAweDAxZDgsIDB4MjAwOSwgMHgwMDgxLCAweDAwYzgsIDB4MjAwOSwgMHgwMGVmLAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzllYSwgMHg3OTMyLCAweDc5MzYsIDB4NzgwYywgMHhjMGI1LAorCTB4NzgwZSwgMHgwMGZlLCAweDA4MGMsIDB4MjZhYSwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3OTgyLAorCTB4MjEwMCwgMHg5MDBlLCAweDA4MGMsIDB4MjY2MSwgMHg3OTVlLCAweDAwZmUsIDB4ODEwOCwgMHgwODBjLAorCTB4NjYzMiwgMHgyYjAwLCAweDAwY2UsIDB4MTkwNCwgMHhiN2ZhLCAweDYwMTIsIDB4MjAwOSwgMHgxODBmLAorCTB4MjEwYywgMHhkMTljLCAweDAxNTAsIDB4MjAwOSwgMHgwMjdjLCAweDIxMGMsIDB4OTE4YywgMHgwMGZmLAorCTB4YjkxMiwgMHgyMDA5LCAweDAyN2QsIDB4MjEwYywgMHhiOTE2LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NjVlMywgMHg2MDIzLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLAorCTB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDAyOCwgMHgwODBjLCAweGI2OTMsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDQzMSwgMHgwMGRlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4ZDBhNCwgMHgwMTIwLCAweDIwMDEsIDB4MTg0OCwgMHgyMDA0LCAweGQwYWMsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDgwYywgMHhlODA1LCAweDAxOTAsIDB4MjA3MSwgMHgwMjYwLCAweDcxMDgsIDB4NzIwYywgMHg5MThjLAorCTB4MDBmZiwgMHgxMTE4LCAweDkyODQsIDB4ZmYwMCwgMHgwMTQwLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLAorCTB4OTA4NCwgMHhmZjgwLCAweDExMTAsIDB4YjkxMiwgMHhiYTE2LCAweDAwZWUsIDB4MDAwNSwgMHgyMDMwLAorCTB4OTAwNSwgMHgwMTU4LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDY1ZTMsIDB4MDgwYywgMHg1NzUyLAorCTB4MTEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NjBmLCAweDI2MDAsIDB4OTAwNSwgMHgxMWIwLAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2OCwgMHgwMDllLCAweGQwZmMsIDB4MTE3OCwgMHgwMDM2LAorCTB4MDA0NiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiYmEwLCAweDAwYmUsIDB4MjAyMSwgMHgwMDA0LAorCTB4MjAxMSwgMHg4MDE0LCAweDA4MGMsIDB4NGI1MiwgMHgwMDRlLCAweDAwM2UsIDB4MDgwYywgMHgzMjZmLAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MTEwOCwgMHgwMDA1LCAweDA4MDQsIDB4YWNiMCwgMHgwMGI2LAorCTB4MDBlNiwgMHgwMDI2LCAweDAwMTYsIDB4MjA3MSwgMHgxODAwLCAweDcwOTAsIDB4OTA4NiwgMHgwMDE0LAorCTB4MTkwNCwgMHhiOTg3LCAweDA4MGMsIDB4NTc1MiwgMHgxMTcwLCAweDYwMTQsIDB4OTAwNSwgMHgxMTU4LAorCTB4MDAzNiwgMHgwMDQ2LCAweDYwMTAsIDB4MjA1OCwgMHhiYmEwLCAweDIwMjEsIDB4MDAwNiwgMHgwODBjLAorCTB4NGQwOSwgMHgwMDRlLCAweDAwM2UsIDB4MDBkNiwgMHg2MDEwLCAweDIwNTgsIDB4MDgwYywgMHg2NzJlLAorCTB4MDgwYywgMHhiN2I0LCAweDAwZGUsIDB4MDgwYywgMHhiYmRiLCAweDE1ODgsIDB4NjAxMCwgMHgyMDU4LAorCTB4Yjg5MCwgMHg5MDA1LCAweDA1NjAsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjVlMywgMHgwMDk2LAorCTB4NjAxNCwgMHg5MDRkLCAweDAxZDAsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM5LAorCTB4MTE0MCwgMHgyMDAxLCAweDAwMDAsIDB4OTAwZSwgMHgyMDExLCAweDQwMDAsIDB4MDgwYywgMHhjZjdhLAorCTB4MDA2MCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMjksIDB4MDEzMCwgMHhhODA3LAorCTB4MDAwMCwgMHhhODY3LCAweDAxMDMsIDB4YTgzMywgMHgwMjAwLCAweDAwOWUsIDB4MDgwYywgMHgzMjZmLAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMGEsIDB4MDE0MCwgMHgwODBjLCAweGFjYjAsIDB4MDAyOCwgMHgwODBjLAorCTB4YjY5MywgMHg5MDA2LCAweDA4MGMsIDB4YjhmZiwgMHgwMDFlLCAweDAwMmUsIDB4MDBlZSwgMHgwMGJlLAorCTB4MDAwNSwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LCAweDAwMTQsIDB4MTE2MCwgMHgyMDAxLAorCTB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLAorCTB4OTJiNywgMHgwODA0LCAweDk3MzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MDQsIDB4YjhmZiwgMHgyMDMwLAorCTB4MjAxMSwgMHgxODI0LCAweDIyMDQsIDB4OTA4NiwgMHgwMDA0LCAweDExNDgsIDB4OTZiNiwgMHgwMDBiLAorCTB4MTEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWUzLCAweDA4MDQsIDB4YWNiMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODA0LCAweGI4ZmYsIDB4MDAwMiwgMHhiNzdjLCAweGI5ZDMsIDB4Yjc3YywgMHhiYTE0LAorCTB4Yjc3YywgMHhiYWMxLCAweGI5YzgsIDB4Yjc3YywgMHhiNzdjLCAweGJhZDUsIDB4Yjc3YywgMHhiYWU3LAorCTB4NjYwNCwgMHg5Njg2LCAweDAwMDMsIDB4MDkwNCwgMHhiOTJmLCAweDk2YjYsIDB4MDAxZSwgMHgxMTEwLAorCTB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDBiNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDgwYywgMHhiYWY5LAorCTB4MTFhMCwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHgwODBjLCAweDMyNDAsIDB4MDgwYywgMHhkMGIwLAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlMywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLAorCTB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwNDE4LCAweDIwMDksIDB4MDI2ZSwgMHgyMTA0LAorCTB4OTA4NiwgMHgwMDA5LCAweDExNjAsIDB4NjAxMCwgMHgyMDU4LCAweGI4NDAsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTAwNSwgMHgwMTcwLCAweDgwMDEsIDB4Yjg0MiwgMHg2MDFiLCAweDAwMGEsIDB4MDA4OCwgMHgyMDA5LAorCTB4MDI2ZiwgMHgyMTA0LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDE5MDAsIDB4MTEwOCwgMHgwOGEwLAorCTB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHhiOGZmLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwYjYsIDB4MDAyNiwgMHg5MDE2LAorCTB4MDgwYywgMHhiYjA3LCAweDAwZDYsIDB4MjA2OSwgMHgxOTdiLCAweDJkMDQsIDB4OTAwNSwgMHgwMTY4LAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDExMzgsIDB4MjA2OSwgMHgxODIwLAorCTB4MmQwNCwgMHg4MDAwLCAweDIwNmEsIDB4MDBkZSwgMHgwMDEwLCAweDAwZGUsIDB4MDA4OCwgMHg5MDA2LAorCTB4MDgwYywgMHg2NWNmLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDgwNCwgMHhiYTkxLAorCTB4MDgwYywgMHhjOTdhLCAweDAxYjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4MjAxMCwgMHg5MDg2LAorCTB4MDEzOSwgMHgxMTM4LCAweDYwMDcsIDB4MDAxNiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHhjZmQ0LAorCTB4MDBiMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NCwgMHhkMGZjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MGNhOCwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGRjLCAweDAxNDgsIDB4NjAxMCwgMHgyMDU4LAorCTB4Yjg0MCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwgMHgxMTEwLCAweDkwMDYsIDB4MGMzOCwgMHgwODBjLAorCTB4YjY5MywgMHgyMDA5LCAweDAyNmUsIDB4MjEzNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwgMHgwMDA1LAorCTB4MDUyMCwgMHg5Njg2LCAweDAwMGIsIDB4MDFjOCwgMHgyMDA5LCAweDAyNmYsIDB4MjEwNCwgMHg5MDg0LAorCTB4ZmYwMCwgMHgxMTE4LCAweDk2ODYsIDB4MDAwOSwgMHgwMWMwLCAweDkwODYsIDB4MTkwMCwgMHgxMTY4LAorCTB4OTY4NiwgMHgwMDA5LCAweDAxOTAsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjVlMywgMHgyMDAxLAorCTB4MDAyOCwgMHg2MDFhLCAweDYwMDcsIDB4MDA1MiwgMHgwMDIwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4YjhmZiwgMHgwMDJlLCAweDAwYmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkyODYsIDB4MDEzOSwgMHgwMTYwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTQwLCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LAorCTB4MDExOCwgMHhhODY4LCAweGQwZmMsIDB4MDEwOCwgMHgwYzQwLCAweDYwMTAsIDB4MjA1OCwgMHhiODQwLAorCTB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MDEzOCwgMHg4MDAxLCAweGI4NDIsIDB4NjAxYiwgMHgwMDBhLAorCTB4NjAwNywgMHgwMDE2LCAweDA4ZjAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTEzOCwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4NjAyNSwgMHgwMGVlLCAweDAwMTAsIDB4MDgwYywgMHgzMjQwLAorCTB4MDg2MCwgMHgwODBjLCAweGJiMDcsIDB4MTE2MCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2NWUzLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMywgMHgwODBjLCAweDkyYjcsIDB4MDgwNCwgMHg5NzM4LAorCTB4MDgwYywgMHhiNjkzLCAweDkwMDYsIDB4MDgwNCwgMHhiOGZmLCAweDA0ODksIDB4MTE2MCwgMHgyMDAxLAorCTB4MDAwOCwgMHgwODBjLCAweDY1ZTMsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwNSwgMHgwODBjLAorCTB4OTJiNywgMHgwODA0LCAweDk3MzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MDQsIDB4YjhmZiwgMHgwMGY5LAorCTB4MTE2MCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg2NWUzLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwNCwgMHg5NzM4LCAweDIwMDEsIDB4MDAwMSwgMHgwODA0LAorCTB4YjhmZiwgMHgyMDA5LCAweDAyNmUsIDB4MjEwNCwgMHg5MDg2LCAweDAwMDMsIDB4MTEzOCwgMHgyMDA5LAorCTB4MDI2ZiwgMHgyMTA0LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDJhMDAsIDB4MDAwNSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHgwMDE2LCAweDYxMTAsIDB4MjE1OCwgMHgwODBjLAorCTB4NjZhMiwgMHgwMDFlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMDM2LCAweDAwMTYsIDB4NjAxMCwgMHgyMDU4LCAweDIwMDksIDB4MTgzNywgMHgyMTA0LAorCTB4OTA4NSwgMHgwMDAzLCAweDIwMGEsIDB4MDgwYywgMHhiYmFkLCAweDA1NjAsIDB4MjAwOSwgMHgxODM3LAorCTB4MjEwNCwgMHhjMGNkLCAweDIwMGEsIDB4MDgwYywgMHg2YWQ5LCAweDAxNTgsIDB4OTAwNiwgMHgyMDIwLAorCTB4MjAwOSwgMHgwMDJhLCAweDA4MGMsIDB4ZTQ0NSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMTk1LAorCTB4MjEwMiwgMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MzIwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4MzAxMSwgMHgwMGVlLCAweDAwYzYsIDB4MDE1NiwgMHgyMGE5LAorCTB4MDc4MSwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHgzMzQ5LCAweDgxMDgsIDB4MWYwNCwgMHhiYjRiLAorCTB4MDE1ZSwgMHgwMGNlLCAweDA4MGMsIDB4YmIwYSwgMHgyMDcxLCAweDAyNjAsIDB4MjA3OSwgMHgwMjAwLAorCTB4NzgxNywgMHgwMDAxLCAweDIwMDEsIDB4MTgzNywgMHgyMDBjLCAweGMxYzUsIDB4NzAxOCwgMHhkMGZjLAorCTB4MDExMCwgMHhkMGRjLCAweDAxMTgsIDB4NzAzOCwgMHhkMGRjLCAweDExMDgsIDB4YzFjNCwgMHg3ODE3LAorCTB4MDAwMCwgMHgyMDAxLCAweDE4MzcsIDB4MjEwMiwgMHgyMDc5LCAweDAxMDAsIDB4MmUwNCwgMHg5MDg0LAorCTB4MDBmZiwgMHgyMDY5LCAweDE4MWYsIDB4MjA2YSwgMHg3OGU2LCAweDAwMDYsIDB4OGU3MCwgMHgyZTA0LAorCTB4MjA2OSwgMHgxODIwLCAweDIwNmEsIDB4NzhlYSwgMHg3ODMyLCAweDc4MzYsIDB4MjAxMCwgMHg5MDg0LAorCTB4ZmYwMCwgMHgwMDFlLCAweDkxMDUsIDB4MjAwOSwgMHgxODJjLCAweDIwMGEsIDB4MjIwMCwgMHg5MDg0LAorCTB4MDBmZiwgMHgyMDA4LCAweDA4MGMsIDB4MjZhYSwgMHgwODBjLCAweDc1M2QsIDB4MDE3MCwgMHgyMDcxLAorCTB4MDI2MCwgMHgyMDY5LCAweDE5ODEsIDB4NzA0OCwgMHgyMDZhLCAweDcwNGMsIDB4NjgwNiwgMHg3MDUwLAorCTB4NjgwYSwgMHg3MDU0LCAweDY4MGUsIDB4MDgwYywgMHhjZGE3LCAweDAwNDAsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4MzI2ZiwgMHgwODBjLCAweGFjYjAsIDB4MDAxZSwgMHgwMDNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDAwOTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDBlNiwgMHgwMTU2LCAweDIwMTksIDB4MTgyYywgMHgyMzFjLCAweDgzZmYsIDB4MDFmMCwgMHgyMDcxLAorCTB4MDI2MCwgMHg3MjAwLCAweDkyOTQsIDB4MDBmZiwgMHg3MDA0LCAweDkwODQsIDB4ZmYwMCwgMHg5MjA1LAorCTB4OTMwNiwgMHgxMTk4LCAweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4MmI0OCwgMHgyMDE5LAorCTB4MDAwYSwgMHgwODBjLCAweGJjYTIsIDB4MTE0OCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmNhMiwgMHgxMTAwLCAweDAxNWUsIDB4MDBlZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDllLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwgMHg5MDg2LAorCTB4MDAxNCwgMHgxMWE4LCAweDcwMzgsIDB4OTA4NiwgMHgwODAwLCAweDExODgsIDB4NzAzYywgMHhkMGVjLAorCTB4MDE2MCwgMHg5MDg0LCAweDBmMDAsIDB4OTA4NiwgMHgwMTAwLCAweDExMzgsIDB4NzA1NCwgMHhkMGE0LAorCTB4MTExMCwgMHhkMGFjLCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwOTYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LAorCTB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDI5LCAweDE5ZjIsIDB4MjUyYywgMHgyMDIxLAorCTB4MTlmOSwgMHgyNDI0LCAweDIwNjEsIDB4MWRkYywgMHgyMDcxLCAweDE4MDAsIDB4NzI1NCwgMHg3MDc0LAorCTB4OTIwMiwgMHgxYTA0LCAweGJjNmUsIDB4MDgwYywgMHg4YzFmLCAweDA5MDQsIDB4YmM2NywgMHgwODBjLAorCTB4ZTQ3NiwgMHgwOTA0LCAweGJjNjcsIDB4NjcyMCwgMHg5Nzg2LCAweDAwMDcsIDB4MDkwNCwgMHhiYzY3LAorCTB4MjUwMCwgMHg5YzA2LCAweDA5MDQsIDB4YmM2NywgMHgyNDAwLCAweDljMDYsIDB4MDkwNCwgMHhiYzY3LAorCTB4M2UwOCwgMHg5MTg2LCAweDAwMDIsIDB4MTE0OCwgMHg2MDEwLCAweDkwMDUsIDB4MDEzMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxNTkwLCAweDAwYzYsIDB4NjA0MywgMHhmZmZmLAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTExMCwgMHgwODBjLCAweDFhYzUsIDB4OTc4NiwgMHgwMDBhLAorCTB4MDE0OCwgMHgwODBjLCAweGNiOTEsIDB4MTEzMCwgMHgwMGNlLCAweDA4MGMsIDB4YjY5MywgMHgwODBjLAorCTB4YWNlYiwgMHgwMGU4LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDFhOCwgMHg5Nzg2LAorCTB4MDAwMywgMHgxNTMwLCAweGE4NjcsIDB4MDEwMywgMHhhODdjLCAweGQwY2MsIDB4MDEzMCwgMHgwMDk2LAorCTB4YTg3OCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZmOSwgMHgwMDllLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLAorCTB4MDgwYywgMHg2ZGUyLCAweDA4MGMsIDB4Y2I2YiwgMHgwODBjLCAweGFjZWIsIDB4MDBjZSwgMHg5Y2UwLAorCTB4MDAxYywgMHg3MDY4LCAweDljMDIsIDB4MTIxMCwgMHgwODA0LCAweGJjMGUsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDAyZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwOWUsIDB4MDBlZSwgMHgwMDA1LAorCTB4OTc4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhlM2U4LCAweDBjMzAsIDB4OTc4NiwgMHgwMDA5LAorCTB4MTE0OCwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgwZDA4LCAweDIwMDksIDB4MDA0YywgMHgwODBjLAorCTB4YWQ0ZCwgMHgwOGUwLCAweDk3ODYsIDB4MDAwYSwgMHgwOTgwLCAweDA4MjAsIDB4MjIwYywgMHgyMzA0LAorCTB4OTEwNiwgMHgxMTMwLCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweGJjOGUsIDB4OTAwNiwgMHgwMDA1LAorCTB4MjMwNCwgMHg5MTAyLCAweDAyMTgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHg5MThkLAorCTB4MDAwMSwgMHgwMDA1LCAweDAxMzYsIDB4MDFjNiwgMHgwMDE2LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LAorCTB4OTA4YywgMHgwMDNmLCAweDIxZTAsIDB4OTA4NCwgMHhmZmMwLCAweDkzMDAsIDB4MjA5OCwgMHgzNTE4LAorCTB4MjBhOSwgMHgwMDAxLCAweDIyMGMsIDB4NDAwMiwgMHg5MTBlLCAweDExNDAsIDB4ODIxMCwgMHg4MzE5LAorCTB4MWRjOCwgMHg5MDA2LCAweDAwMWUsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MjIwYywgMHg5MTAyLAorCTB4MDIxOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDAsIDB4OTE4ZCwgMHgwMDAxLAorCTB4MDAxZSwgMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwgMHgyMjBjLCAweDgxMGYsIDB4MjMwNCwgMHg5MTA2LAorCTB4MTEzMCwgMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHhiY2NjLCAweDkwMDYsIDB4MDAwNSwgMHg5MThkLAorCTB4MDAwMSwgMHgwMDA1LCAweDYwMDQsIDB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGQ3ZCwgMHgwODBjLAorCTB4Y2I4MCwgMHgwMTIwLCAweDA4MGMsIDB4Y2I5MSwgMHgwMTU4LCAweDAwMjgsIDB4MDgwYywgMHgzMjZmLAorCTB4MDgwYywgMHhjYjkxLCAweDAxMjgsIDB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LAorCTB4MDgwYywgMHhiNjkzLCAweDBjYzAsIDB4OTE4MiwgMHgwMDU3LCAweDEyMjAsIDB4OTE4MiwgMHgwMDQwLAorCTB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YmQxMiwgMHhiZDEyLCAweGJkMTIsIDB4YmQxMiwgMHhiZDEyLAorCTB4YmQxMiwgMHhiZDEyLCAweGJkMTIsIDB4YmQxMiwgMHhiZDEyLCAweGJkMTIsIDB4YmQxNCwgMHhiZDE0LAorCTB4YmQxNCwgMHhiZDE0LCAweGJkMTIsIDB4YmQxMiwgMHhiZDEyLCAweGJkMTQsIDB4YmQxMiwgMHhiZDEyLAorCTB4YmQxMiwgMHhiZDEyLCAweDA4MGMsIDB4MGQ3ZCwgMHg2MDBiLCAweGZmZmYsIDB4NjAwMywgMHgwMDBmLAorCTB4NjEwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGQwYjMsIDB4MjAwOSwgMHg4MDAwLAorCTB4MDgwYywgMHg5MmIwLCAweDAxMmUsIDB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MTEyOCwgMHg2MDA0LAorCTB4OTA4MiwgMHgwMDQwLCAweDA4MDQsIDB4YmQ5YywgMHg5MTg2LCAweDAwMjcsIDB4MTUyMCwgMHgwODBjLAorCTB4OTY3YSwgMHgwODBjLCAweDMyNDAsIDB4MDgwYywgMHhkMGIwLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LAorCTB4MDgwYywgMHhjOTdhLCAweDAxOTgsIDB4MDgwYywgMHhjYjkxLCAweDExMTgsIDB4MDgwYywgMHhiNjkzLAorCTB4MDA2OCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDI5LCAweGE4NzcsIDB4MDAwMCwgMHhhOTdjLAorCTB4YzFjNSwgMHhhOTdlLCAweDA4MGMsIDB4NmRlZSwgMHgwODBjLCAweGNiNmIsIDB4MDA5ZSwgMHgwODBjLAorCTB4YWNiMCwgMHgwODA0LCAweDk3MzgsIDB4OTE4NiwgMHgwMDE0LCAweDExMjAsIDB4NjAwNCwgMHg5MDgyLAorCTB4MDA0MCwgMHgwMDMwLCAweDkxODYsIDB4MDA1MywgMHgwMTEwLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMDA1LAorCTB4MDAwMiwgMHhiZDdhLCAweGJkNzgsIDB4YmQ3OCwgMHhiZDc4LCAweGJkNzgsIDB4YmQ3OCwgMHhiZDc4LAorCTB4YmQ3OCwgMHhiZDc4LCAweGJkNzgsIDB4YmQ3OCwgMHhiZDkzLCAweGJkOTMsIDB4YmQ5MywgMHhiZDkzLAorCTB4YmQ3OCwgMHhiZDkzLCAweGJkNzgsIDB4YmQ5MywgMHhiZDc4LCAweGJkNzgsIDB4YmQ3OCwgMHhiZDc4LAorCTB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4OTY3YSwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLAorCTB4Yzk3YSwgMHgwMTY4LCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMDYsIDB4YTg3NywgMHgwMDAwLAorCTB4YTg4MCwgMHhjMGVjLCAweGE4ODIsIDB4MDgwYywgMHg2ZGVlLCAweDA4MGMsIDB4Y2I2YiwgMHgwMDllLAorCTB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4Y2I5MSwgMHgwOTBjLAorCTB4YjY5MywgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgwMDAyLCAweGJkYjYsIDB4YmRiNCwgMHhiZGI0LAorCTB4YmRiNCwgMHhiZGI0LCAweGJkYjQsIDB4YmRiNCwgMHhiZGI0LCAweGJkYjQsIDB4YmRiNCwgMHhiZGI0LAorCTB4YmRiOCwgMHhiZGI4LCAweGJkYjgsIDB4YmRiOCwgMHhiZGI0LCAweGJkYmEsIDB4YmRiNCwgMHhiZGI4LAorCTB4YmRiNCwgMHhiZGI0LCAweGJkYjQsIDB4YmRiNCwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHgwZDdkLAorCTB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4YWNiMCwgMHgwODA0LCAweDk3MzgsIDB4OTE4MiwgMHgwMDU3LAorCTB4MTIyMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YmRkZCwgMHhiZGRkLAorCTB4YmRkZCwgMHhiZGRkLCAweGJkZGQsIDB4YmUxNiwgMHhiZjA1LCAweGJkZGQsIDB4YmYxMSwgMHhiZGRkLAorCTB4YmRkZCwgMHhiZGRkLCAweGJkZGQsIDB4YmRkZCwgMHhiZGRkLCAweGJkZGQsIDB4YmRkZCwgMHhiZGRkLAorCTB4YmRkZCwgMHhiZjExLCAweGJkZGYsIDB4YmRkZCwgMHhiZjBmLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMGI2LAorCTB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4ZDBiYywgMHgxNTA4LAorCTB4YTg3YiwgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4YTg3YywgMHhkMGFjLAorCTB4MDEyOCwgMHhhODM0LCAweGE5MzgsIDB4OTExNSwgMHgxOTBjLCAweGJmOTYsIDB4MDgwYywgMHg2YzA0LAorCTB4NjIxMCwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwgMHgwMTEwLCAweDgyMTEsIDB4YmEzZSwgMHhiOGQwLAorCTB4OTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NjdiZSwgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwgMHgwMGJlLAorCTB4MDAwNSwgMHhhODdjLCAweGQwYWMsIDB4MDllMCwgMHhhODM4LCAweGE5MzQsIDB4OTEwNSwgMHgwOWMwLAorCTB4YTg4MCwgMHhkMGJjLCAweDE5YTgsIDB4MDgwYywgMHhjY2M2LCAweDBjODAsIDB4MDBiNiwgMHgwMDk2LAorCTB4NjExNCwgMHgyMTQ4LCAweDYwMWMsIDB4ZDBmYywgMHgxMTEwLCAweDc2NDQsIDB4MDAwOCwgMHg5MDM2LAorCTB4OTZiNCwgMHgwZmZmLCAweDg2ZmYsIDB4MTU5MCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwgMHhkMGJjLAorCTB4MTkwNCwgMHhiZWY0LCAweGE4N2IsIDB4MDAwMCwgMHhhODY3LCAweDAxMDMsIDB4YWU3NiwgMHhhODdjLAorCTB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LCAweDE5MGMsIDB4YmY5NiwgMHgwODBjLAorCTB4NmMwNCwgMHg2MjEwLCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLCAweDAxMTAsIDB4ODIxMSwgMHhiYTNlLAorCTB4YjhkMCwgMHg5MDA1LCAweDAxMTAsIDB4MDgwYywgMHg2N2JlLCAweDYwMWMsIDB4ZDBmYywgMHgxMTQ4LAorCTB4NzA0NCwgMHhkMGU0LCAweDE5MDQsIDB4YmVkOCwgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwgMHgwMGJlLAorCTB4MDAwNSwgMHgyMDA5LCAweDAyMTEsIDB4MjEwYywgMHgwODBjLCAweDBkN2QsIDB4OTY4YywgMHgwYzAwLAorCTB4MDE1MCwgMHg2MDEwLCAweDIwNTgsIDB4YjgwMCwgMHhkMGJjLCAweDE5MDQsIDB4YmVkYywgMHg3MzQ4LAorCTB4YWI5MiwgMHg3MzRjLCAweGFiOGUsIDB4OTY4YywgMHgwMGZmLCAweDkxODYsIDB4MDAwMiwgMHgwNTA4LAorCTB4OTE4NiwgMHgwMDI4LCAweDExMTgsIDB4YTg3YiwgMHgwMDFjLCAweDAwZTgsIDB4ZDZkYywgMHgwMWEwLAorCTB4YTg3YiwgMHgwMDE1LCAweGE4N2MsIDB4ZDBhYywgMHgwMTcwLCAweGE5MzgsIDB4YWEzNCwgMHgyMTAwLAorCTB4OTIwNSwgMHgwMTQ4LCAweDcwNDgsIDB4OTEwNiwgMHgxMTE4LCAweDcwNGMsIDB4OTIwNiwgMHgwMTE4LAorCTB4YTk5MiwgMHhhYThlLCAweGM2ZGMsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4YTg3YiwgMHgwMDA3LAorCTB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLCAweGFlNzYsIDB4OTAxZSwgMHhkNmM0LAorCTB4MDFkOCwgMHg5Njg2LCAweDAxMDAsIDB4MTEzMCwgMHg3MDY0LCAweDkwMDUsIDB4MTExOCwgMHhjNmM0LAorCTB4MDgwNCwgMHhiZTIyLCAweDczNWMsIDB4YWI4NiwgMHg4M2ZmLCAweDAxNzAsIDB4OTM4YSwgMHgwMDA5LAorCTB4MDIxMCwgMHgyMDE5LCAweDAwMDgsIDB4MDAzNiwgMHgyMzA4LCAweDIwMTksIDB4MDAxOCwgMHgyMDExLAorCTB4MDAyNSwgMHgwODBjLCAweGM0ZjgsIDB4MDAzZSwgMHhkNmNjLCAweDA5MDQsIDB4YmUzNywgMHg3MTU0LAorCTB4YTk4YSwgMHg4MWZmLCAweDA5MDQsIDB4YmUzNywgMHg5MTkyLCAweDAwMjEsIDB4MTI3OCwgMHg4MzA0LAorCTB4OTA5OCwgMHgwMDE4LCAweDIwMTEsIDB4MDAyOSwgMHgwODBjLCAweGM0ZjgsIDB4MjAxMSwgMHgwMjA1LAorCTB4MjAxMywgMHgwMDAwLCAweDA4MGMsIDB4ZDA0MCwgMHgwODA0LCAweGJlMzcsIDB4YTg2OCwgMHhkMGZjLAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4YTk4YSwgMHgwYzUwLCAweDAwYTYsIDB4Mjk1MCwgMHgwODBjLAorCTB4YzQ5NywgMHgwMGFlLCAweDA4MGMsIDB4ZDA0MCwgMHgwODBjLCAweGM0ZTgsIDB4MDgwNCwgMHhiZTM5LAorCTB4MDgwYywgMHhjYzg5LCAweDA4MDQsIDB4YmU0ZSwgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwgMHhiZTVmLAorCTB4YTg4MCwgMHhkMGJjLCAweDE5MDQsIDB4YmU1ZiwgMHg3MzQ4LCAweGE4MzgsIDB4OTMwNiwgMHgxMWM4LAorCTB4NzM0YywgMHhhODM0LCAweDkzMWUsIDB4MDkwNCwgMHhiZTVmLCAweGQ2ZDQsIDB4MDE5MCwgMHhhYjM4LAorCTB4OTMwNSwgMHgwOTA0LCAweGJlNWYsIDB4MDA2OCwgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwgMHhiZTJhLAorCTB4YTgzOCwgMHhhOTM0LCAweDkxMDUsIDB4MDkwNCwgMHhiZTJhLCAweGE4ODAsIDB4ZDBiYywgMHgxOTA0LAorCTB4YmUyYSwgMHgwODBjLCAweGNjYzYsIDB4MDgwNCwgMHhiZTRlLCAweDAwZjYsIDB4MjA3OSwgMHgwMjZjLAorCTB4N2MwNCwgMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHgwMGZlLCAweDAwMjEsIDB4MDAwNSwgMHgwMDExLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwOTYsIDB4NjAwMywgMHgwMDAyLCAweDYwMDcsIDB4MDA0MywgMHg2MDE0LAorCTB4MjA0OCwgMHhhODdjLCAweGQwYWMsIDB4MDEyOCwgMHgwMDllLCAweDAwMDUsIDB4MjEzMCwgMHgyMjI4LAorCTB4MDA1OCwgMHgyNDAwLCAweGE5YWMsIDB4OTEwYSwgMHgyMzAwLCAweGFhYjAsIDB4OTIxMywgMHgyNjAwLAorCTB4OTEwMiwgMHgyNTAwLCAweDkyMDMsIDB4MGU5MCwgMHhhYzQ2LCAweGFiNGEsIDB4YWUzNiwgMHhhZDNhLAorCTB4NjA0NCwgMHhkMGZjLCAweDE5MGMsIDB4YTk0NywgMHg2MDRiLCAweDAwMDAsIDB4MDgwYywgMHgxYzg2LAorCTB4MTExOCwgMHg2MTQ0LCAweDA4MGMsIDB4OTJkYywgMHgwMDllLCAweDAwMDUsIDB4OTE4MiwgMHgwMDU3LAorCTB4MTIyMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YmY1ZCwgMHhiZjVkLAorCTB4YmY1ZCwgMHhiZjVkLCAweGJmNWQsIDB4YmY1ZCwgMHhiZjVkLCAweGJmNWQsIDB4YmY1ZCwgMHhiZjVkLAorCTB4YmY1ZiwgMHhiZjVkLCAweGJmNWQsIDB4YmY1ZCwgMHhiZjVkLCAweGJmNzAsIDB4YmY1ZCwgMHhiZjVkLAorCTB4YmY1ZCwgMHhiZjVkLCAweGJmOTQsIDB4YmY1ZCwgMHhiZjVkLCAweDA4MGMsIDB4MGQ3ZCwgMHg2MDA0LAorCTB4OTA4NiwgMHgwMDQwLCAweDExMTAsIDB4MDgwYywgMHg5NjdhLCAweDIwMTksIDB4MDAwMSwgMHgwODBjLAorCTB4YTFiOCwgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHhkMGI4LCAweDA4MGMsIDB4OTZkNSwgMHgwMDA1LAorCTB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MTExMCwgMHgwODBjLCAweDk2N2EsIDB4MjAxOSwgMHgwMDAxLAorCTB4MDgwYywgMHhhMWI4LCAweDA4MGMsIDB4OTZkNSwgMHgwODBjLCAweDMyNDAsIDB4MDgwYywgMHhkMGIwLAorCTB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxNTAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTg3YiwgMHgwMDI5LCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDgwYywgMHhjYjZiLAorCTB4MDA5ZSwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgwODBjLCAweDBkN2QsIDB4YTg3YiwgMHgwMDE1LAorCTB4ZDFmYywgMHgwMTgwLCAweGE4N2IsIDB4MDAwNywgMHg4MDAyLCAweDgwMDAsIDB4ODEwYSwgMHg5MTg5LAorCTB4MDAwMCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTc3LCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLAorCTB4MDAxZSwgMHgwMDBlLCAweGE5OTIsIDB4YTg4ZSwgMHgwMDA1LCAweDkxODIsIDB4MDA1NywgMHgxMjIwLAorCTB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGJmY2MsIDB4YmZjYywgMHhiZmNjLAorCTB4YmZjYywgMHhiZmNjLCAweGJmY2UsIDB4YmZjYywgMHhiZmNjLCAweGMwOGIsIDB4YmZjYywgMHhiZmNjLAorCTB4YmZjYywgMHhiZmNjLCAweGJmY2MsIDB4YmZjYywgMHhiZmNjLCAweGJmY2MsIDB4YmZjYywgMHhiZmNjLAorCTB4YzFjYiwgMHhiZmNjLCAweGMxZDUsIDB4YmZjYywgMHgwODBjLCAweDBkN2QsIDB4NjAxYywgMHhkMGJjLAorCTB4MDE3OCwgMHhkMDg0LCAweDAxNjgsIDB4ZDBmNCwgMHgwMTIwLCAweGMwODQsIDB4NjAxZSwgMHgwODA0LAorCTB4YmRiZSwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwgMHhhODdjLCAweGMwZTUsIDB4YTg3ZSwgMHgwMDllLAorCTB4MDA3NiwgMHgwMGE2LCAweDAwZTYsIDB4MDA5NiwgMHgyMDcxLCAweDAyNjAsIDB4NjExNCwgMHgyMTUwLAorCTB4NjAxYywgMHhkMGZjLCAweDExMTAsIDB4NzY0NCwgMHgwMDA4LCAweDkwMzYsIDB4YjY3NiwgMHg5NmI0LAorCTB4MGZmZiwgMHhiNzdjLCAweGM3ZTUsIDB4Yjc3ZSwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTNjLAorCTB4ODJmZiwgMHgwMTEwLCAweDgyMTEsIDB4YmEzZSwgMHgwMGJlLCAweDg2ZmYsIDB4MDkwNCwgMHhjMDg0LAorCTB4OTY5NCwgMHhmZjAwLCAweDkyODQsIDB4MGMwMCwgMHgwMTIwLCAweDcwNDgsIDB4YjA5MiwgMHg3MDRjLAorCTB4YjA4ZSwgMHg5Mjg0LCAweDAzMDAsIDB4MDkwNCwgMHhjMDg0LCAweDk2ODYsIDB4MDEwMCwgMHgxMTMwLAorCTB4NzA2NCwgMHg5MDA1LCAweDExMTgsIDB4YzZjNCwgMHhiNjc2LCAweDBjMzgsIDB4MDgwYywgMHgxMDQ3LAorCTB4MDkwYywgMHgwZDdkLCAweDI5MDAsIDB4YjA3YSwgMHhiNzdjLCAweDk3YmQsIDB4MDIwMCwgMHhiNzdlLAorCTB4YTg2NywgMHgwMTAzLCAweGIwNjgsIDB4YTg2YSwgMHhiMDZjLCAweGE4NmUsIDB4YjA3MCwgMHhhODcyLAorCTB4NzA0NCwgMHg5MDg0LCAweGYwMDAsIDB4OTYzNSwgMHhhZTc2LCAweDk2OGMsIDB4MGMwMCwgMHgwMTIwLAorCTB4NzM0OCwgMHhhYjkyLCAweDczNGMsIDB4YWI4ZSwgMHg5NjhjLCAweDAwZmYsIDB4OTE4NiwgMHgwMDAyLAorCTB4MDE4MCwgMHg5MTg2LCAweDAwMjgsIDB4MTExOCwgMHhhODdiLCAweDAwMWMsIDB4MDA2MCwgMHhkNmRjLAorCTB4MDExOCwgMHhhODdiLCAweDAwMTUsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4YTg3YiwgMHgwMDA3LAorCTB4MDAxMCwgMHhhODdiLCAweDAwMDAsIDB4YWY3ZSwgMHhiMDgwLCAweGE4ODIsIDB4YjA4NCwgMHhhODg2LAorCTB4OTAxZSwgMHhkNmM0LCAweDAxOTAsIDB4NzM1YywgMHhhYjg2LCAweDgzZmYsIDB4MDE3MCwgMHg5MzhhLAorCTB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LCAweDIzMDgsIDB4MjAxOSwgMHgwMDE4LAorCTB4MjAxMSwgMHgwMDI1LCAweDA4MGMsIDB4YzRmOCwgMHgwMDNlLCAweGQ2Y2MsIDB4MDFlOCwgMHg3MTU0LAorCTB4YTk4YSwgMHg4MWZmLCAweDAxYzgsIDB4OTE5MiwgMHgwMDIxLCAweDEyNjAsIDB4ODMwNCwgMHg5MDk4LAorCTB4MDAxOCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHhjNGY4LCAweDIwMTEsIDB4MDIwNSwgMHgyMDEzLAorCTB4MDAwMCwgMHgwMDUwLCAweGIwNjgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHhhOThhLAorCTB4MGM2OCwgMHgyOTUwLCAweDA4MGMsIDB4YzQ5NywgMHgwODBjLCAweDFhOTMsIDB4MDA5ZSwgMHgwMGVlLAorCTB4MDBhZSwgMHgwMDdlLCAweDAwMDUsIDB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4NjA0YSwgMHgwMDk2LAorCTB4NjExNCwgMHgyMTQ4LCAweGE4M2MsIDB4YTk0MCwgMHg5MTA1LCAweDExMTgsIDB4YTg3YywgMHhjMGRjLAorCTB4YTg3ZSwgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHhkMGMxLCAweDA5MDQsIDB4YzFjNiwgMHg2MDRiLAorCTB4MDAwMCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxNTAwLAorCTB4ZDFjYywgMHgwOTA0LCAweGMxOGEsIDB4YTk3OCwgMHhhODY4LCAweGQwZmMsIDB4MDkwNCwgMHhjMTRiLAorCTB4MDAxNiwgMHhhODdjLCAweDAwMDYsIDB4YTg4MCwgMHgwMDA2LCAweDAwYTYsIDB4MjE1MCwgMHhiMTc0LAorCTB4OTE4NCwgMHgwMGZmLCAweDkwYjYsIDB4MDAwMiwgMHgwOTA0LCAweGMxMTgsIDB4OTA4NiwgMHgwMDI4LAorCTB4MTkwNCwgMHhjMTA0LCAweGE4N2IsIDB4MDAxYywgMHhiMDdiLCAweDAwMWMsIDB4MDgwNCwgMHhjMTIwLAorCTB4NjAyNCwgMHhkMGY0LCAweDExZDAsIDB4YTgzOCwgMHhhYTM0LCAweDkyMDUsIDB4MDljOCwgMHhhODM4LAorCTB4YWE5MCwgMHg5MjA2LCAweDExMjAsIDB4YTg4YywgMHhhYTM0LCAweDkyMDYsIDB4MDk4OCwgMHg2MDI0LAorCTB4ZDBkNCwgMHgxMTQ4LCAweGE5YWMsIDB4YTgzNCwgMHg5MTAyLCAweDYwM2EsIDB4YTliMCwgMHhhODM4LAorCTB4OTEwMywgMHg2MDNlLCAweDYwMjQsIDB4YzBmNSwgMHg2MDI2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LAorCTB4YjgzYywgMHg4MDAwLCAweGI4M2UsIDB4MDBiZSwgMHg2MDFjLCAweGMwZmMsIDB4NjAxZSwgMHg5MDA2LAorCTB4YTg3NiwgMHhhODkyLCAweGE4OGUsIDB4YTg3YywgMHhjMGU0LCAweGE4N2UsIDB4ZDBjYywgMHgwMTQwLAorCTB4YzBjYywgMHhhODdlLCAweDAwOTYsIDB4YTg3OCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZmOSwgMHgwMDllLAorCTB4MDgwYywgMHhjY2M2LCAweDA4MDQsIDB4YzFjNiwgMHhkMWRjLCAweDAxNTgsIDB4YTg3YiwgMHgwMDE1LAorCTB4YjA3YiwgMHgwMDE1LCAweDA4MGMsIDB4Y2Y2MywgMHgwMTE4LCAweGIxNzQsIDB4YzFkYywgMHhiMTc2LAorCTB4MDA3OCwgMHhkMWQ0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA3LCAweGIwN2IsIDB4MDAwNywgMHgwMDQwLAorCTB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhiZjk2LAorCTB4YTg3YywgMHhiMDdlLCAweGE4OTAsIDB4YjA5MiwgMHhhODhjLCAweGIwOGUsIDB4YTg2MCwgMHgyMGU4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjBhMCwgMHgyMGE5LCAweDAwMjAsIDB4OGEwNiwgMHg4MDA2LAorCTB4ODAwNywgMHg5MDk0LCAweDAwM2YsIDB4MjJlMCwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDE5LAorCTB4MjA5OCwgMHg0MDAzLCAweDAwYWUsIDB4MDAwZSwgMHhhODgyLCAweDAwMGUsIDB4YzBjYywgMHhhODdlLAorCTB4MDgwYywgMHhkMDQwLCAweDAwMWUsIDB4YTg3NCwgMHgwMDA2LCAweDIxNDgsIDB4MDgwYywgMHgwZmY5LAorCTB4MDAxZSwgMHgwODA0LCAweGMxYjcsIDB4MDAxNiwgMHgwMGE2LCAweDIxNTAsIDB4YjE3NCwgMHg5MTg0LAorCTB4MDBmZiwgMHg5MGI2LCAweDAwMDIsIDB4MDFlMCwgMHg5MDg2LCAweDAwMjgsIDB4MTEyOCwgMHhhODdiLAorCTB4MDAxYywgMHhiMDdiLCAweDAwMWMsIDB4MDBlMCwgMHhkMWRjLCAweDAxNTgsIDB4YTg3YiwgMHgwMDE1LAorCTB4YjA3YiwgMHgwMDE1LCAweDA4MGMsIDB4Y2Y2MywgMHgwMTE4LCAweGIxNzQsIDB4YzFkYywgMHhiMTc2LAorCTB4MDA3OCwgMHhkMWQ0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA3LCAweGIwN2IsIDB4MDAwNywgMHgwMDQwLAorCTB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhiZjk2LAorCTB4YTg5MCwgMHhiMDkyLCAweGE4OGMsIDB4YjA4ZSwgMHhhODdjLCAweGIwN2UsIDB4MDBhZSwgMHgwODBjLAorCTB4MGZmOSwgMHgwMDllLCAweDA4MGMsIDB4ZDA0MCwgMHhhOTc0LCAweDAwMTYsIDB4MDgwYywgMHhjNGU4LAorCTB4MDAxZSwgMHgwNDY4LCAweGE4NjcsIDB4MDEwMywgMHhhOTc0LCAweDkxODQsIDB4MDBmZiwgMHg5MGI2LAorCTB4MDAwMiwgMHgwMWIwLCAweDkwODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMGQwLAorCTB4ZDFkYywgMHgwMTQ4LCAweGE4N2IsIDB4MDAxNSwgMHgwODBjLCAweGNmNjMsIDB4MDExOCwgMHhhOTc0LAorCTB4YzFkYywgMHhhOTc2LCAweDAwNzgsIDB4ZDFkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywgMHgwMDUwLAorCTB4YTg3YiwgMHgwMDAwLCAweGE4N2MsIDB4ZDBhYywgMHgwMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LAorCTB4MTkwYywgMHhiZjk2LCAweGE5NzQsIDB4MDAxNiwgMHgwODBjLCAweDZjMDQsIDB4MDAxZSwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGJhM2MsIDB4YjhkMCwgMHgwMDE2LCAweDkwMDUsIDB4MTkwYywgMHg2N2JlLAorCTB4MDAxZSwgMHgwMGJlLCAweGQxZTQsIDB4MTEyMCwgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDgwYywgMHhjYzg5LCAweDBjZDgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk3YywgMHgwODBjLAorCTB4ZDBjMSwgMHgxOTBjLCAweDFhYjEsIDB4MDA5ZSwgMHgwMDA1LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LAorCTB4YTgzYywgMHhhOTQwLCAweDkxMDUsIDB4MDFlOCwgMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDAwLAorCTB4YTg2NywgMHgwMTAzLCAweDAwYjYsIDB4NjAxMCwgMHgyMDU4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LAorCTB4MTFhMCwgMHgwODBjLCAweDZjMDQsIDB4YmEzYywgMHg4MjExLCAweDAyMDgsIDB4YmEzZSwgMHhiOGQwLAorCTB4OTAwNSwgMHgwMTEwLCAweDA4MGMsIDB4NjdiZSwgMHgwODBjLCAweGFjYjAsIDB4MDBiZSwgMHgwMDllLAorCTB4MDAwNSwgMHhhODdjLCAweGMwZGMsIDB4YTg3ZSwgMHgwOGY4LCAweGI4MDAsIDB4ZDBiYywgMHgxMTIwLAorCTB4YTgzNCwgMHgwODBjLCAweGJmOTYsIDB4MGMyOCwgMHhhODgwLCAweGQwYmMsIDB4MWRjOCwgMHgwODBjLAorCTB4Y2NjNiwgMHgwYzYwLCAweDA4MGMsIDB4OTY3YSwgMHgwMDEwLCAweDA4MGMsIDB4OTZkNSwgMHg2MDFjLAorCTB4ZDA4NCwgMHgwMTEwLCAweDA4MGMsIDB4MWFjNSwgMHgwODBjLCAweGM5N2EsIDB4MDFmMCwgMHgwMDk2LAorCTB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4Y2I5MSwgMHgxMTE4LCAweDA4MGMsIDB4YjY5MywgMHgwMGEwLAorCTB4YTg2NywgMHgwMTAzLCAweDIwMDksIDB4MTgwYywgMHgyMTBjLCAweGQxOGMsIDB4MTE5OCwgMHhkMTg0LAorCTB4MTE3MCwgMHg2MTA4LCAweGE5N2EsIDB4OTE4ZSwgMHgwMDI5LCAweDExMTAsIDB4MDgwYywgMHhlNzlkLAorCTB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDA4MDQsIDB4YWNlYiwgMHhhODdiLAorCTB4MDAwNCwgMHgwY2IwLCAweGE4N2IsIDB4MDAwNCwgMHgwYzk4LCAweDkxODIsIDB4MDA1NywgMHgxMjIwLAorCTB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGMyNWMsIDB4YzI1YywgMHhjMjVjLAorCTB4YzI1YywgMHhjMjVjLCAweGMyNWUsIDB4YzI1YywgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywgMHhjMjVjLAorCTB4YzI1YywgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywgMHhjMjVjLCAweGMyNWMsIDB4YzI1YywgMHhjMjVjLAorCTB4YzI1YywgMHhjMjgyLCAweGMyNWMsIDB4YzI1YywgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHg1NzQ2LAorCTB4MDFmOCwgMHg2MDE0LCAweDcxNDQsIDB4OTE4YywgMHgwZmZmLCAweDkwMTYsIDB4ZDFjNCwgMHgwMTE4LAorCTB4NzI2NCwgMHg5Mjk0LCAweDAwZmYsIDB4MDA5NiwgMHg5MDRkLCAweDAxODgsIDB4YTg3YiwgMHgwMDAwLAorCTB4YTg2NCwgMHg5MDg2LCAweDAxMzksIDB4MDEyOCwgMHhhODY3LCAweDAxMDMsIDB4YTk3NiwgMHhhYTk2LAorCTB4MDAzMCwgMHhhODk3LCAweDQwMDAsIDB4YTk5YSwgMHhhYTllLCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLAorCTB4MDgwNCwgMHhhY2IwLCAweDA4MGMsIDB4NTc0NiwgMHgwZGQ4LCAweDYwMTQsIDB4OTAwZSwgMHg5MDE2LAorCTB4MGMxMCwgMHg5MTgyLCAweDAwODUsIDB4MDAwMiwgMHhjMjliLCAweGMyOTksIDB4YzI5OSwgMHhjMmE3LAorCTB4YzI5OSwgMHhjMjk5LCAweGMyOTksIDB4YzI5OSwgMHhjMjk5LCAweGMyOTksIDB4YzI5OSwgMHhjMjk5LAorCTB4YzI5OSwgMHgwODBjLCAweDBkN2QsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAxMmUsIDB4MDAwNSwgMHgwMDI2LAorCTB4MDA1NiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA3MSwgMHgwMjYwLCAweDcyMjQsIDB4NjIxNiwgMHg3MjIwLAorCTB4MDgwYywgMHhjOTY4LCAweDAxZjgsIDB4MjI2OCwgMHg2ODAwLCAweDkwODYsIDB4MDAwMCwgMHgwMWQwLAorCTB4NjAxMCwgMHg2ZDEwLCAweDk1MmUsIDB4MTFiMCwgMHgwMGM2LCAweDJkNjAsIDB4MDBkNiwgMHgwODBjLAorCTB4YzU1OSwgMHgwMGRlLCAweDAwY2UsIDB4MDE1OCwgMHg3MDJjLCAweGQwODQsIDB4MTExOCwgMHgwODBjLAorCTB4YzUyMywgMHgwMDEwLCAweDY4MDMsIDB4MDAwMiwgMHg2MDA3LCAweDAwODYsIDB4MDAyOCwgMHgwODBjLAorCTB4YzU0NSwgMHgwZDkwLCAweDYwMDcsIDB4MDA4NywgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHg4MDIwLAorCTB4MDgwYywgMHg5MmIwLCAweDcyMjAsIDB4MDgwYywgMHhjOTY4LCAweDAxNzgsIDB4NjgxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwMTQwLCAweDY4MjQsIDB4ZDBlYywgMHgwMTI4LAorCTB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4Y2NjNiwgMHgwMGNlLCAweDAwZWUsIDB4MDBkZSwgMHgwMDVlLAorCTB4MDAyZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4OTA4YSwgMHgwMDg1LAorCTB4MGEwYywgMHgwZDdkLCAweDkwOGEsIDB4MDA5MiwgMHgxYTBjLCAweDBkN2QsIDB4OTA4MiwgMHgwMDg1LAorCTB4MDBlMiwgMHg5MTg2LCAweDAwMjcsIDB4MDEyMCwgMHg5MTg2LCAweDAwMTQsIDB4MTkwYywgMHgwZDdkLAorCTB4MDgwYywgMHg5NjdhLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTQwLAorCTB4YTg2NywgMHgwMTAzLCAweGE4NzcsIDB4MDAwMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywgMHg2ZGVlLAorCTB4MDA5ZSwgMHgwODBjLCAweGFjZWIsIDB4MDgwNCwgMHg5NzM4LCAweGMzMmEsIDB4YzMyYywgMHhjMzJjLAorCTB4YzMyYSwgMHhjMzJhLCAweGMzMmEsIDB4YzMyYSwgMHhjMzJhLCAweGMzMmEsIDB4YzMyYSwgMHhjMzJhLAorCTB4YzMyYSwgMHhjMzJhLCAweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGFjZWIsIDB4MDAwNSwgMHg5MTg2LAorCTB4MDAxMywgMHgxMTMwLCAweDYwMDQsIDB4OTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDgwNCwgMHhjMzdiLAorCTB4OTE4NiwgMHgwMDI3LCAweDE1NTgsIDB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4MzI0MCwgMHgwODBjLAorCTB4ZDBiMCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDE1MCwgMHhhODY3LAorCTB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmRlZSwgMHgwODBjLAorCTB4Y2I2YiwgMHgwMDllLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDkxODYsIDB4MDA4OSwgMHgwMTE4LAorCTB4OTE4NiwgMHgwMDhhLCAweDExNDAsIDB4MDgwYywgMHhhYjMzLCAweDAxMjgsIDB4OTA4NiwgMHgwMDBjLAorCTB4MDkwNCwgMHhjM2IzLCAweDAwMDAsIDB4MDgwYywgMHhhZDZhLCAweDBjNzAsIDB4OTE4NiwgMHgwMDE0LAorCTB4MWQ2MCwgMHgwODBjLCAweDk2N2EsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLAorCTB4MGQwMCwgMHhhODY3LCAweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAwNiwgMHhhODgwLAorCTB4YzBlYywgMHhhODgyLCAweDA4OTAsIDB4MDAwMiwgMHhjMzhiLCAweGMzODksIDB4YzM4OSwgMHhjMzg5LAorCTB4YzM4OSwgMHhjMzg5LCAweGMzOWYsIDB4YzM4OSwgMHhjMzg5LCAweGMzODksIDB4YzM4OSwgMHhjMzg5LAorCTB4YzM4OSwgMHgwODBjLCAweDBkN2QsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LAorCTB4MDAzOSwgMHgwMTE4LCAweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4MTk4NSwgMHgwMDEwLAorCTB4MjAwMSwgMHgxOTg2LCAweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMGMsIDB4MDAwNSwgMHg2MDM0LAorCTB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwgMHgwMDM5LCAweDAxMTgsIDB4OTE4NiwgMHgwMDM1LAorCTB4MTExOCwgMHgyMDAxLCAweDE5ODUsIDB4MDAxMCwgMHgyMDAxLCAweDE5ODYsIDB4MjAwNCwgMHg2MDFhLAorCTB4NjAwMywgMHgwMDBlLCAweDAwMDUsIDB4OTE4MiwgMHgwMDkyLCAweDEyMjAsIDB4OTE4MiwgMHgwMDg1LAorCTB4MDIwOCwgMHgwMDEyLCAweDA4MDQsIDB4YWQ2YSwgMHhjM2M5LCAweGMzYzksIDB4YzNjOSwgMHhjM2M5LAorCTB4YzNjYiwgMHhjNDE4LCAweGMzYzksIDB4YzNjOSwgMHhjM2M5LCAweGMzYzksIDB4YzNjOSwgMHhjM2M5LAorCTB4YzNjOSwgMHgwODBjLCAweDBkN2QsIDB4MDA5NiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLAorCTB4MDBiZSwgMHhkMGJjLCAweDAxNjgsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LAorCTB4MDAzOSwgMHgwMTE4LCAweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDAwOWUsIDB4MDgwNCwgMHhjNDJjLAorCTB4MDgwYywgMHhjOTdhLCAweDExMTgsIDB4MDgwYywgMHhjYjZiLCAweDAwNjgsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhkMGM3LCAweDExMTAsIDB4MDgwYywgMHhjYjZiLCAweGE4NjcsIDB4MDEwMywgMHgwODBjLAorCTB4ZDA3YiwgMHgwODBjLCAweDZkZWUsIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsIDB4YWM1YSwgMHgwMWQwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHg2MDBiLCAweGZmZmYsIDB4MjAwOSwgMHgwMjZlLAorCTB4MjEwYywgMHg2MTNhLCAweDIwMDksIDB4MDI2ZiwgMHgyMTBjLCAweDYxM2UsIDB4NjkxMCwgMHg2MTEyLAorCTB4MDgwYywgMHhjZTE1LCAweDY5NWMsIDB4NjE1ZSwgMHg2MDIzLCAweDAwMDEsIDB4MjAwOSwgMHg4MDIwLAorCTB4MDgwYywgMHg5MmIwLCAweDJkNjAsIDB4MDBkZSwgMHgwODBjLCAweGFjYjAsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDVhMCwgMHg2MDM0LAorCTB4OTA4YywgMHhmZjAwLCAweDgxMGYsIDB4OTE4NiwgMHgwMDM1LCAweDAxMzAsIDB4OTE4NiwgMHgwMDFlLAorCTB4MDExOCwgMHg5MTg2LCAweDAwMzksIDB4MTUzOCwgMHgwMGQ2LCAweDJjNjgsIDB4MDgwYywgMHhkMDEzLAorCTB4MTFmMCwgMHgwODBjLCAweGFjNWEsIDB4MDFkOCwgMHg2MTA2LCAweDYwMDMsIDB4MDAwMSwgMHg2MDIzLAorCTB4MDAwMSwgMHg2OTEwLCAweDYxMTIsIDB4NjkyYywgMHg2MTJlLCAweDY5MzAsIDB4NjEzMiwgMHg2OTM0LAorCTB4OTE4YywgMHgwMGZmLCAweDYxMzYsIDB4NjkzOCwgMHg2MTNhLCAweDY5M2MsIDB4NjEzZSwgMHg2OTVjLAorCTB4NjE1ZSwgMHgwODBjLCAweGNlMTUsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgyZDYwLAorCTB4MDBkZSwgMHgwODA0LCAweGFjYjAsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLAorCTB4MDFjOCwgMHhhODY3LCAweDAxMDMsIDB4YTg4MCwgMHhkMGI0LCAweDAxMjgsIDB4YzBlYywgMHhhODgyLAorCTB4YTg3YiwgMHgwMDA2LCAweDAwNDgsIDB4ZDBiYywgMHgwMTE4LCAweGE4N2IsIDB4MDAwMiwgMHgwMDIwLAorCTB4YTg3YiwgMHgwMDA1LCAweDA4MGMsIDB4Y2M4NSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHg2ZGVlLAorCTB4MDgwYywgMHhjYjZiLCAweDAwOWUsIDB4MDgwNCwgMHhhY2IwLCAweDAwMTYsIDB4MDA5NiwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDE0MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDI4LAorCTB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDAwMWUsIDB4OTE4NiwgMHgwMDEzLAorCTB4MDE1OCwgMHg5MTg2LCAweDAwMTQsIDB4MDEzMCwgMHg5MTg2LCAweDAwMjcsIDB4MDExOCwgMHgwODBjLAorCTB4YWQ2YSwgMHgwMDIwLCAweDA4MGMsIDB4OTY3YSwgMHgwODBjLCAweGFjZWIsIDB4MDAwNSwgMHgwMDU2LAorCTB4MDA2NiwgMHgwMDk2LCAweDAwYTYsIDB4MjAyOSwgMHgwMDAxLCAweDkxODIsIDB4MDEwMSwgMHgxMjA4LAorCTB4MDAxMCwgMHgyMDA5LCAweDAxMDAsIDB4MjEzMCwgMHg4MzA0LCAweDkwOTgsIDB4MDAxOCwgMHgyMDA5LAorCTB4MDAyMCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHhjNGY4LCAweDk2YjIsIDB4MDAyMCwgMHhiMDA0LAorCTB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MGZmOSwgMHgwODBjLCAweDEwNDcsIDB4MDUyMCwgMHg4NTI4LAorCTB4YTg2NywgMHgwMTEwLCAweGE4NmIsIDB4MDAwMCwgMHgyOTIwLCAweGI0MDYsIDB4OTY4YSwgMHgwMDNkLAorCTB4MTIyOCwgMHgyNjA4LCAweDIwMTEsIDB4MDAxYiwgMHgwNDk5LCAweDAwYTgsIDB4OTZiMiwgMHgwMDNjLAorCTB4MjAwOSwgMHgwMDNjLCAweDI5NTAsIDB4MjAxMSwgMHgwMDFiLCAweDA0NTEsIDB4MGMyOCwgMHgyMDAxLAorCTB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLCAweDk1YWQsIDB4MDAwMywgMHhiNTY2LAorCTB4OTVhYywgMHgwMDAwLCAweDAwNDgsIDB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHgwMGFlLAorCTB4ODUyZiwgMHg5NWFkLCAweDAwMDMsIDB4YjU2NiwgMHgwMDllLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDA1LAorCTB4MDBhNiwgMHg4OWZmLCAweDAxNTgsIDB4YTgwNCwgMHg5MDU1LCAweDAxMzAsIDB4YTgwNywgMHgwMDAwLAorCTB4MDgwYywgMHg2ZGVlLCAweDJhNDgsIDB4MGNiOCwgMHgwODBjLCAweDZkZWUsIDB4MDBhZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4NzgxNCwgMHg5MDg1LCAweDAwODAsIDB4NzgxNiwgMHhkMTg0LAorCTB4MDEwOCwgMHg4MTA4LCAweDgxMGMsIDB4MjBhOSwgMHgwMDAxLCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTIwMCwgMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMzAwLCAweDllMDAsIDB4MjA5OCwgMHg0MDAzLAorCTB4ODMxOCwgMHg5Mzg2LCAweDAwMjAsIDB4MTE0OCwgMHgyMDE4LCAweDIzMDAsIDB4OWUwMCwgMHgyMDk4LAorCTB4NzgxNCwgMHg4MDAwLCAweDkwODUsIDB4MDA4MCwgMHg3ODE2LCAweDgxMDksIDB4MWQ4MCwgMHg3ODE3LAorCTB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4NjkyMCwgMHg5MTg2LCAweDAwMDMsIDB4MDExOCwgMHg5MTg2LAorCTB4MDAwMiwgMHgxMWQwLCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDJkNjAsIDB4MDA5NiwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDE1MCwgMHgyMDAxLCAweDAwMDYsIDB4YTk4MCwgMHhjMWQ1LAorCTB4MDgwYywgMHg3MDIyLCAweDA4MGMsIDB4NmRlMiwgMHgwODBjLCAweGNiNmIsIDB4MDA5ZSwgMHgwODBjLAorCTB4YWNlYiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4NzAyYywgMHhkMDg0LAorCTB4MTE3MCwgMHg2MDA4LCAweDIwNjAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE0MCwgMHg2MTA0LAorCTB4OTE4NiwgMHgwMDg1LCAweDAxMTgsIDB4OTE4NiwgMHgwMDhiLCAweDExMDgsIDB4OTAwNiwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMDY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzEsIDB4MDAwMSwgMHg2MDIwLAorCTB4OTA4NCwgMHgwMDBmLCAweDAwODMsIDB4MDEyZSwgMHgwMDZlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDY2LCAweDIwMzEsIDB4MDAwMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDFiLAorCTB4MDA2ZSwgMHgwMTJlLCAweDAwMDUsIDB4YzVhYiwgMHhjNWFiLCAweGM1YTYsIDB4YzVjZiwgMHhjNTgzLAorCTB4YzVhNiwgMHhjNTg1LCAweGM1YTYsIDB4YzU4MywgMHg5MTczLCAweGM1YTYsIDB4YzVhNiwgMHhjNWE2LAorCTB4YzU4MywgMHhjNTgzLCAweGM1ODMsIDB4MDgwYywgMHgwZDdkLCAweDYwMTAsIDB4OTA4MCwgMHgwMDAwLAorCTB4MjAwNCwgMHhkMGJjLCAweDE5MGMsIDB4YzVjZiwgMHgwMDM2LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTg4MCwgMHgwMDllLCAweGQwY2MsIDB4MDExOCwgMHgyMDE5LCAweDAwMGMsIDB4MDAzOCwgMHhkMDk0LAorCTB4MDExOCwgMHgyMDE5LCAweDAwMGQsIDB4MDAxMCwgMHgyMDE5LCAweDAwMTAsIDB4MDgwYywgMHhkZmExLAorCTB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLCAweDAwMDUsIDB4OTAwNiwgMHgwMDA1LAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA5NiwgMHg4NmZmLCAweDExZTgsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhjOTdhLCAweDAxZDAsIDB4NjA0MywgMHhmZmZmLCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LAorCTB4MTEyOCwgMHhhODdiLCAweDAwMDUsIDB4YTg4MywgMHgwMDAwLCAweDAwMjgsIDB4OTAwZSwgMHgyMDAxLAorCTB4MDAwNSwgMHgwODBjLCAweDcwMjIsIDB4MDgwYywgMHhjYzg1LCAweDA4MGMsIDB4NmRlMiwgMHgwODBjLAorCTB4YWNlYiwgMHg5MDg1LCAweDAwMDEsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNlMCwgMHgwODBjLAorCTB4YTkxZSwgMHgwODBjLCAweGQwZDUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZDdkLAorCTB4MDAyYiwgMHgwMTA2LCAweDA4MGMsIDB4YTkzYSwgMHgwMTBlLCAweDAwMDUsIDB4YzVlZSwgMHhjNjFlLAorCTB4YzVmMCwgMHhjNjQ1LCAweGM2MTksIDB4YzVlZSwgMHhjNWE2LCAweGM1YWIsIDB4YzVhYiwgMHhjNWE2LAorCTB4YzVhNiwgMHhjNWE2LCAweGM1YTYsIDB4YzVhNiwgMHhjNWE2LCAweGM1YTYsIDB4MDgwYywgMHgwZDdkLAorCTB4ODZmZiwgMHgxNTIwLCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDA1MDAsIDB4MDA5NiwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGM5N2EsIDB4MDE2OCwgMHhhODdjLCAweGQwY2MsIDB4MDE0MCwgMHgwMDk2LAorCTB4YzBjYywgMHhhODdlLCAweGE4NzgsIDB4MjA0OCwgMHgwODBjLCAweDBmZjksIDB4MDA5ZSwgMHgwODBjLAorCTB4Y2M4NSwgMHgwMDllLCAweDA4MGMsIDB4ZDA1NSwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLAorCTB4NjAyMywgMHgwMDAyLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyOTIsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwMDY2LCAweDA4MGMsIDB4MWFjNSwgMHgwMDZlLCAweDA4OTAsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTllNiwgMHg3MDMwLCAweDljMDYsIDB4MTEyMCwgMHgwODBjLCAweGExMzgsIDB4MDBlZSwgMHgwODQwLAorCTB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4NiwgMHgwMDA2LCAweDExNTAsIDB4MDA4NiwgMHgwMDk2LAorCTB4MjA0OSwgMHgwMDAxLCAweDJjNDAsIDB4MDgwYywgMHhhMjhjLCAweDAwOWUsIDB4MDA4ZSwgMHgwMDQwLAorCTB4MDA2NiwgMHgwODBjLCAweGEwMzQsIDB4MTkwYywgMHgwZDdkLCAweDA4MGMsIDB4YTA0MiwgMHgwMDZlLAorCTB4MDBlZSwgMHgxOTA0LCAweGM1ZjAsIDB4MDgwNCwgMHhjNWE2LCAweDAwMzYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTllNiwgMHg3MDRjLCAweDljMDYsIDB4MTEzOCwgMHg5MDFlLCAweDA4MGMsIDB4YTFiOCwgMHgwMGVlLAorCTB4MDAzZSwgMHgwODA0LCAweGM1ZjAsIDB4MDgwYywgMHhhM2MzLCAweDAwZWUsIDB4MDAzZSwgMHgxOTA0LAorCTB4YzVmMCwgMHgwODA0LCAweGM1YTYsIDB4MDBjNiwgMHgwMDY2LCAweDYwMjAsIDB4OTA4NCwgMHgwMDBmLAorCTB4MDAxYiwgMHgwMDZlLCAweDAwY2UsIDB4MDAwNSwgMHhjNjdiLCAweGM3NGEsIDB4YzhiNCwgMHhjNjgzLAorCTB4YWNlYiwgMHhjNjdiLCAweGRmOTMsIDB4ZDBiZCwgMHhjNzRhLCAweDkxM2EsIDB4Yzk0MCwgMHhjNjc0LAorCTB4YzY3NCwgMHhjNjc0LCAweGM2NzQsIDB4YzY3NCwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHhjYjkxLAorCTB4MTExMCwgMHgwODBjLCAweGI2OTMsIDB4MDAwNSwgMHgwODBjLCAweDk2N2EsIDB4MDgwNCwgMHhhY2IwLAorCTB4NjAxYiwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHhjOTdhLCAweDAxMzAsIDB4NjAxNCwgMHgwMDk2LAorCTB4MjA0OCwgMHgyYzAwLCAweGE4OTYsIDB4MDA5ZSwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHhkMGQ1LAorCTB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwMTMsIDB4MDgwNCwgMHhhOTNhLAorCTB4YzZhOCwgMHhjNmFhLCAweGM2ZDQsIDB4YzZlOCwgMHhjNzE1LCAweGM2YTgsIDB4YzY3YiwgMHhjNjdiLAorCTB4YzY3YiwgMHhjNmVmLCAweGM2ZWYsIDB4YzZhOCwgMHhjNmE4LCAweGM2YTgsIDB4YzZhOCwgMHhjNmY5LAorCTB4MDgwYywgMHgwZDdkLCAweDAwZTYsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg4MCwgMHhjMGI1LAorCTB4YTg4MiwgMHgwMDllLCAweDIwNzEsIDB4MTllNiwgMHg3MDMwLCAweDljMDYsIDB4MDFkMCwgMHgwMDY2LAorCTB4MDgwYywgMHhhMDM0LCAweDE5MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGEwNDIsIDB4MDA2ZSwgMHgwODBjLAorCTB4ZDA1NSwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwgMHgyMDAxLAorCTB4MTk4NiwgMHgyMDA0LCAweDYwMWEsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTI5MiwgMHgwMGVlLAorCTB4MDAwNSwgMHg2MDFiLCAweDAwMDEsIDB4MGNkOCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHhhODgwLAorCTB4YzBiNSwgMHhhODgyLCAweDAwOWUsIDB4MDgwYywgMHhkMDU1LCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLAorCTB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTI5MiwgMHgwMDA1LAorCTB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YWFiNSwgMHgwODBjLCAweGE5M2EsIDB4MGMyOCwgMHgwMDk2LAorCTB4NjAxYiwgMHgwMDAxLCAweDYwMTQsIDB4MjA0OCwgMHhhODgwLCAweGMwYjUsIDB4YTg4MiwgMHgwMDllLAorCTB4MDAwNSwgMHgwODBjLCAweDU3NDYsIDB4MDFiOCwgMHg2MDE0LCAweDAwOTYsIDB4OTA0ZCwgMHgwMTkwLAorCTB4YTg2NCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YiwgMHgwMDA2LCAweDkwODYsIDB4MDEzOSwgMHgxMTUwLAorCTB4YTg2NywgMHgwMTM5LCAweGE4N2IsIDB4MDAzMCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwgMHgwMDA0LAorCTB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDgwNCwgMHhhY2IwLCAweDYwMTQsIDB4MDA5NiwgMHg5MDRkLAorCTB4MDU2MCwgMHhhOTdjLCAweGQxZTQsIDB4MTE1OCwgMHg2MTFjLCAweGQxZmMsIDB4MDUzMCwgMHg2MTEwLAorCTB4MDBiNiwgMHgyMTU4LCAweGI5M2MsIDB4ODEwOSwgMHgwMjA4LCAweGI5M2UsIDB4MDBiZSwgMHgwODBjLAorCTB4YTkzYSwgMHgyMDAxLCAweDE4MGYsIDB4MjAwNCwgMHhkMGM0LCAweDAxMTAsIDB4MDA5ZSwgMHgwMDA1LAorCTB4YTg4NCwgMHgwMDllLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweDkxMDgsIDB4NjExYSwgMHgyMDAxLAorCTB4MDAzNywgMHgyYzA4LCAweDA4MGMsIDB4MTZhMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4YWQ0ZCwgMHgwMDA1LCAweDAwOWUsIDB4MDgwYywgMHgxYWM1LAorCTB4MDgwNCwgMHhjNmQ0LCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LCAweDFhMGMsIDB4MGQ3ZCwgMHgwMDBiLAorCTB4MDAwNSwgMHhjNzYxLCAweGM2ODAsIDB4Yzc2MywgMHhjNzYxLCAweGM3NjMsIDB4Yzc2MywgMHhjNjdjLAorCTB4Yzc2MSwgMHhjNjc2LCAweGM2NzYsIDB4Yzc2MSwgMHhjNzYxLCAweGM3NjEsIDB4Yzc2MSwgMHhjNzYxLAorCTB4Yzc2MSwgMHgwODBjLCAweDBkN2QsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwNCwgMHg5MDg0LAorCTB4MDBmZiwgMHgwMGJlLCAweDkwOGEsIDB4MDAwYywgMHgxYTBjLCAweDBkN2QsIDB4MDBiNiwgMHgwMDEzLAorCTB4MDBiZSwgMHgwMDA1LCAweGM3N2UsIDB4Yzg0YiwgMHhjNzgwLCAweGM3YzAsIDB4Yzc4MCwgMHhjN2MwLAorCTB4Yzc4MCwgMHhjNzhlLCAweGM3N2UsIDB4YzdjMCwgMHhjNzdlLCAweGM3YWYsIDB4MDgwYywgMHgwZDdkLAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMTYsIDB4MDVjMCwgMHg5MDhlLCAweDAwMDQsIDB4MDVhOCwgMHg5MDhlLAorCTB4MDAwMiwgMHgwNTkwLCAweDkwOGUsIDB4MDA1MiwgMHgwOTA0LCAweGM4NDcsIDB4NjAwNCwgMHgwODBjLAorCTB4Y2I5MSwgMHgwOTA0LCAweGM4NjQsIDB4OTA4ZSwgMHgwMDA0LCAweDExMTAsIDB4MDgwYywgMHgzMjZmLAorCTB4OTA4ZSwgMHgwMDIxLCAweDA5MDQsIDB4Yzg2OCwgMHg5MDhlLCAweDAwMjIsIDB4MDkwNCwgMHhjOGFmLAorCTB4OTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4Yzg2OCwgMHg5MDhlLCAweDAwMzksIDB4MDkwNCwgMHhjODZjLAorCTB4OTA4ZSwgMHgwMDM1LCAweDA5MDQsIDB4Yzg2YywgMHg5MDhlLCAweDAwMWUsIDB4MDE3OCwgMHg5MDhlLAorCTB4MDAwMSwgMHgxMTQwLCAweDYwMTAsIDB4MjA1OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDAwNiwgMHgwMTEwLCAweDA4MGMsIDB4MzI0MCwgMHgwODBjLCAweGI2OTMsIDB4MDgwNCwgMHhhY2ViLAorCTB4MDBjNiwgMHgwMGQ2LCAweDYxMDQsIDB4OTE4NiwgMHgwMDE2LCAweDA5MDQsIDB4YzgzOCwgMHg5MTg2LAorCTB4MDAwMiwgMHgxOTA0LCAweGM4MGQsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4ZDA4YywgMHgxMWM4LAorCTB4MDgwYywgMHg3NTNkLCAweDExYjAsIDB4MDgwYywgMHhkMDliLCAweDAxMzgsIDB4MDgwYywgMHg3NTYwLAorCTB4MTEyMCwgMHgwODBjLCAweDc0NDgsIDB4MDgwNCwgMHhjODk4LCAweDIwMDEsIDB4MTk3YywgMHgyMDAzLAorCTB4MDAwMSwgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NzQ2ZSwgMHgwODA0LAorCTB4Yzg5OCwgMHg2MDEwLCAweDIwNTgsIDB4MjAwMSwgMHgxODM3LCAweDIwMDQsIDB4ZDBhYywgMHgxOTA0LAorCTB4Yzg5OCwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxOTA0LCAweGM4OTgsIDB4Yjg0MCwgMHg5MDg0LAorCTB4MDBmZiwgMHg5MDA1LCAweDAxOTAsIDB4ODAwMSwgMHhiODQyLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLAorCTB4MDAwNywgMHg2MDFiLCAweDAzOTgsIDB4NjA0YiwgMHgwMDAwLCAweDA4MGMsIDB4YWM1YSwgMHgwMTI4LAorCTB4MmIwMCwgMHg2MDEyLCAweDYwMjMsIDB4MDAwMSwgMHgwNDU4LCAweDAwZGUsIDB4MDBjZSwgMHg2MDA0LAorCTB4OTA4ZSwgMHgwMDAyLCAweDExYTAsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLAorCTB4MTE3MCwgMHgyMDA5LCAweDE4MzcsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwMCwgMHgwODBjLCAweDYwMjUsIDB4MDBlZSwgMHgwODBjLCAweGI2OTMsIDB4MDAzMCwgMHgwODBjLAorCTB4YjY5MywgMHgwODBjLCAweDMyNDAsIDB4MDgwYywgMHhkMGIwLCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDMyNmYsIDB4MDEyZSwgMHgwMGVlLCAweDA4MGMsIDB4YWNlYiwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlMywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLAorCTB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMGRlLCAweDAwY2UsIDB4MGM4MCwgMHgwODBjLAorCTB4MzI2ZiwgMHgwODA0LCAweGM3YmMsIDB4MDBjNiwgMHgwMGQ2LCAweDYxMDQsIDB4OTE4NiwgMHgwMDE2LAorCTB4MGQzOCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg0MCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwgMHgwOTA0LAorCTB4YzgwZCwgMHg4MDAxLCAweGI4NDIsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLAorCTB4OTczOCwgMHgwMGRlLCAweDAwY2UsIDB4MDg5OCwgMHgwODBjLCAweGI2OTMsIDB4MDgwNCwgMHhjN2JlLAorCTB4MDgwYywgMHhiNmNmLCAweDA4MDQsIDB4YzdiZSwgMHgwMGQ2LCAweDJjNjgsIDB4NjEwNCwgMHgwODBjLAorCTB4ZDAxMywgMHgwMGRlLCAweDAxMTgsIDB4MDgwYywgMHhhY2IwLCAweDA0MDgsIDB4NjAwNCwgMHg4MDA3LAorCTB4NjEzNCwgMHg5MThjLCAweDAwZmYsIDB4OTEwNSwgMHg2MDM2LCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLAorCTB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4NjAzYywgMHg2MDBhLCAweDIwMDEsIDB4MTk4NiwgMHgyMDA0LAorCTB4NjAxYSwgMHg2MDJjLCAweDJjMDgsIDB4MjA2MCwgMHg2MDI0LCAweGQwYjQsIDB4MDEwOCwgMHhjMDg1LAorCTB4YzBiNSwgMHg2MDI2LCAweDIxNjAsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMDA1LAorCTB4MDBkZSwgMHgwMGNlLCAweDA4MGMsIDB4YjY5MywgMHgwODBjLCAweDMyNDAsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MzI2ZiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDA3LAorCTB4NjAxYiwgMHgwMzk4LCAweDYwNGIsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgwODBjLAorCTB4YjBlYiwgMHgxOTA0LCAweGM4NjQsIDB4MDAwNSwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwgMHgxYTBjLAorCTB4MGQ3ZCwgMHgwMDk2LCAweDAwZDYsIDB4MDAxYiwgMHgwMGRlLCAweDAwOWUsIDB4MDAwNSwgMHhjOGNmLAorCTB4YzhjZiwgMHhjOGNmLCAweGM4Y2YsIDB4YzhjZiwgMHhjOGNmLCAweGM4Y2YsIDB4YzhjZiwgMHhjOGNmLAorCTB4YzY3YiwgMHhjOGNmLCAweGM2ODAsIDB4YzhkMSwgMHhjNjgwLCAweGM4ZWIsIDB4YzhjZiwgMHgwODBjLAorCTB4MGQ3ZCwgMHg2MDA0LCAweDkwODYsIDB4MDA4YiwgMHgwMWIwLCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLAorCTB4ODEwZiwgMHg5MTg2LCAweDAwMzUsIDB4MTEzMCwgMHg2MDJjLCAweDkwODAsIDB4MDAwOSwgMHgyMDBjLAorCTB4YzE4NSwgMHgyMTAyLCAweDYwMDcsIDB4MDA4YiwgMHg2MDAzLCAweDAwMGQsIDB4MjAwOSwgMHg4MDIwLAorCTB4MDgwYywgMHg5MmIwLCAweDAwMDUsIDB4MDgwYywgMHhkMDhmLCAweDAxMTgsIDB4MDgwYywgMHhkMGEyLAorCTB4MDAxMCwgMHgwODBjLCAweGQwYjAsIDB4MDgwYywgMHhjYjZiLCAweDA4MGMsIDB4Yzk3YSwgMHgwNTcwLAorCTB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4Yzk3YSwgMHgwMTY4LCAweDYwMTQsIDB4MjA0OCwgMHhhODY3LAorCTB4MDEwMywgMHhhODdiLCAweDAwMDYsIDB4YTg3NywgMHgwMDAwLCAweGE4ODAsIDB4YzBlZCwgMHhhODgyLAorCTB4MDgwYywgMHg2ZGVlLCAweDJjNjgsIDB4MDgwYywgMHhhYzVhLCAweDAxNTAsIDB4NjgxMCwgMHg2MDEyLAorCTB4MDgwYywgMHhjZTE1LCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweGFjZWIsIDB4MDBjZSwgMHgwMDA4LAorCTB4MmQ2MCwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwYzgsIDB4MDgwYywgMHhkMDhmLAorCTB4MDEzOCwgMHg2MDM0LCAweDkwODYsIDB4NDAwMCwgMHgxMTE4LCAweDA4MGMsIDB4MzI0MCwgMHgwOGQwLAorCTB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LCAweDAwMzksIDB4MDExOCwgMHg5MTg2LAorCTB4MDAzNSwgMHgxMTE4LCAweDA4MGMsIDB4MzI0MCwgMHgwODY4LCAweDA4MGMsIDB4YWNlYiwgMHgwMDA1LAorCTB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwMDIsIDB4Yzk1NiwgMHhjOTU2LAorCTB4Yzk1OCwgMHhjOTU4LCAweGM5NTgsIDB4Yzk1NiwgMHhjOTU2LCAweGFjZWIsIDB4Yzk1NiwgMHhjOTU2LAorCTB4Yzk1NiwgMHhjOTU2LCAweGM5NTYsIDB4Yzk1NiwgMHhjOTU2LCAweGM5NTYsIDB4MDgwYywgMHgwZDdkLAorCTB4MDgwYywgMHhhOTFlLCAweDA4MGMsIDB4YWFiNSwgMHgwODBjLCAweGE5M2EsIDB4NjExNCwgMHgwMDk2LAorCTB4MjE0OCwgMHhhODdiLCAweDAwMDYsIDB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDgwNCwgMHhhY2IwLAorCTB4OTI4NCwgMHgwMDAzLCAweDExNTgsIDB4OTI4MiwgMHgxZGRjLCAweDAyNDAsIDB4MjAwMSwgMHgxODFhLAorCTB4MjAwNCwgMHg5MjAyLCAweDEyMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4OTAwNiwgMHgwY2U4LAorCTB4MDA5NiwgMHgwMDI4LCAweDAwOTYsIDB4MDAwNiwgMHg2MDE0LCAweDIwNDgsIDB4MDAwZSwgMHgwMDA2LAorCTB4OTk4NCwgMHhmMDAwLCAweDkwODYsIDB4ZjAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MTBmMiwgMHgwMDBlLAorCTB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDYxLCAweDFkZGMsIDB4MjA3MSwgMHgxODAwLCAweDczNTQsIDB4NzA3NCwgMHg5MzAyLAorCTB4MTY0MCwgMHg2MDIwLCAweDkyMDYsIDB4MTFmOCwgMHgwODBjLCAweGQwOWIsIDB4MDE4MCwgMHg5Mjg2LAorCTB4MDAwMSwgMHgxMTY4LCAweDYwMDQsIDB4OTA4NiwgMHgwMDA0LCAweDExNDgsIDB4MDgwYywgMHgzMjQwLAorCTB4MDgwYywgMHhkMGIwLCAweDAwYzYsIDB4MDgwYywgMHhhY2ViLCAweDAwY2UsIDB4MDA2MCwgMHgwODBjLAorCTB4Y2Q4NywgMHgwMTQ4LCAweDA4MGMsIDB4Y2I5MSwgMHgxMTEwLCAweDA4MGMsIDB4YjY5MywgMHgwMGM2LAorCTB4MDgwYywgMHhhY2IwLCAweDAwY2UsIDB4OWNlMCwgMHgwMDFjLCAweDcwNjgsIDB4OWMwMiwgMHgxMjA4LAorCTB4MDhhMCwgMHgwMTJlLCAweDAwMGUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDE2LCAweDkxODgsIDB4MTAwMCwgMHgyMTBjLCAweDgxZmYsIDB4MDEyOCwgMHgyMDYxLAorCTB4MWIzNCwgMHg2MTEyLCAweDA4MGMsIDB4MzI0MCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAxZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhhYzVhLCAweDAxYjAsIDB4NjY1ZSwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHg1NzQ2LAorCTB4MDExOCwgMHgwODBjLCAweGNhYWQsIDB4MDE2OCwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywgMHgwMDAzLAorCTB4MjAwOSwgMHgwMDRiLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiYWEwLAorCTB4MDgwYywgMHhhZDIwLCAweDA1ODAsIDB4NjA1ZiwgMHgwMDAwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLAorCTB4Y2UxNSwgMHg2MDIzLCAweDAwMDMsIDB4MDAxNiwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHg5NDNkLAorCTB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4OTMwNiwgMHgyYzA4LCAweDA4MGMsIDB4ZTE2NywgMHgwMDdlLAorCTB4MDgwYywgMHhhOTNhLCAweDAwMWUsIDB4ZDE4NCwgMHgwMTI4LCAweDA4MGMsIDB4YWNiMCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDcwLCAweDA4MGMsIDB4NTc0NiwgMHgwMTI4LCAweGQxOGMsIDB4MTE3MCwgMHgwODBjLAorCTB4Y2FhZCwgMHgwMTQ4LCAweDIwMDksIDB4MDA0YywgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDI5MDAsIDB4NjAxNiwgMHgwYzkwLAorCTB4MjAwOSwgMHgwMDRkLCAweDAwMTAsIDB4MjAwOSwgMHgwMDRlLCAweDAwZjYsIDB4MDBjNiwgMHgwMDQ2LAorCTB4MDAxNiwgMHgwODBjLCAweGFjNWEsIDB4MmM3OCwgMHgwNWEwLCAweDdlNWUsIDB4MmIwMCwgMHg3ODEyLAorCTB4NzgyMywgMHgwMDAzLCAweDAwMTYsIDB4MjAyMSwgMHgwMDA1LCAweDA4MGMsIDB4Y2FiZiwgMHgwMDFlLAorCTB4OTE4NiwgMHgwMDRkLCAweDAxMTgsIDB4OTE4NiwgMHgwMDRlLCAweDAxNDgsIDB4MjAwMSwgMHgxOTdmLAorCTB4MjAwYywgMHhkMWZjLCAweDAxNjgsIDB4MmY2MCwgMHgwODBjLCAweGFjYjAsIDB4MDBkMCwgMHgyMDAxLAorCTB4MTk3ZSwgMHgyMDBjLCAweGQxZmMsIDB4MDEyMCwgMHgyZjYwLCAweDA4MGMsIDB4YWNiMCwgMHgwMDg4LAorCTB4MmY2MCwgMHgwODBjLCAweDU3NDYsIDB4MDEzOCwgMHhkMThjLCAweDExMTgsIDB4MDRmMSwgMHgwMTQ4LAorCTB4MDAxMCwgMHgyOTAwLCAweDc4MTYsIDB4MDAxZSwgMHgwMDE2LCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDFlLCAweDAwNGUsIDB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGM2LAorCTB4MDA0NiwgMHgwODBjLCAweGFjNWEsIDB4MmM3OCwgMHgwNTA4LCAweDdlNWUsIDB4MmIwMCwgMHg3ODEyLAorCTB4NzgyMywgMHgwMDAzLCAweDAwOTYsIDB4MjAyMSwgMHgwMDA0LCAweDA0ODksIDB4MDA5ZSwgMHgyMDAxLAorCTB4MTk3ZCwgMHgyMDBjLCAweGQxZmMsIDB4MDEyMCwgMHgyZjYwLCAweDA4MGMsIDB4YWNiMCwgMHgwMDYwLAorCTB4MmY2MCwgMHgwODBjLCAweDU3NDYsIDB4MDEyMCwgMHhkMThjLCAweDExNjAsIDB4MDA3MSwgMHgwMTMwLAorCTB4MjAwOSwgMHgwMDUyLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDA0ZSwgMHgwMGNlLAorCTB4MDBmZSwgMHgwMDA1LCAweDI5MDAsIDB4NzgxNiwgMHgwYzk4LCAweDAwYzYsIDB4MDgwYywgMHg0YWYyLAorCTB4MDBjZSwgMHgxMTIwLCAweDA4MGMsIDB4YWNiMCwgMHg5MDA2LCAweDAwMDUsIDB4YTg2NywgMHgwMDAwLAorCTB4YTg2YiwgMHg4MDAwLCAweDI5MDAsIDB4NjAxNiwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDk2LAorCTB4MDA3NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGE5MWUsIDB4MDgwYywgMHg2ODc1LAorCTB4MDE1OCwgMHgyMDAxLCAweGNhYzYsIDB4MDAwNiwgMHg5MDBlLCAweDI0MDAsIDB4MDgwYywgMHg3MDIyLAorCTB4MDgwYywgMHg2ZGVlLCAweDAwMGUsIDB4MDgwNywgMHgyNDE4LCAweDA4MGMsIDB4OTY0MCwgMHhiYWEwLAorCTB4MDA4NiwgMHgyMDQxLCAweDAwMDEsIDB4MjAzOSwgMHgwMDAxLCAweDI2MDgsIDB4MDgwYywgMHg5NDU3LAorCTB4MDA4ZSwgMHgwODBjLCAweDkzMDYsIDB4MmYwOCwgMHgyNjQ4LCAweDA4MGMsIDB4ZTE2NywgMHhiOTNjLAorCTB4ODFmZiwgMHgwOTBjLCAweDk1MzAsIDB4MDgwYywgMHhhOTNhLCAweDAxMmUsIDB4MDA3ZSwgMHgwMDllLAorCTB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWM1YSwgMHgwMTkwLAorCTB4NjYwYSwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLAorCTB4NjAxNiwgMHgyMDA5LCAweDAwMWYsIDB4MDgwYywgMHhhZDRkLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhhZDIwLCAweDAxYjgsIDB4NjYwYSwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjZTE1LAorCTB4NjAyMywgMHgwMDA4LCAweDI5MDAsIDB4NjAxNiwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHgxNzc4LAorCTB4MDBmZSwgMHgyMDA5LCAweDAwMjEsIDB4MDgwYywgMHhhZDRkLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgyMDA5LCAweDAwM2QsIDB4MDBjNiwgMHgwMTI2LAorCTB4MDAxNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhYzVhLCAweDAxOTgsIDB4NjYwYSwgMHgyYjA4LAorCTB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwgMHgwMDFlLAorCTB4MDAxNiwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHg5MDA2LCAweDBjZDAsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4YWQyMCwgMHgwMTg4LCAweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywgMHgwMDAxLAorCTB4MjkwMCwgMHg2MDE2LCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweGFkNGQsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDIwMDksIDB4MDA0NCwgMHgwODMwLAorCTB4MjAwOSwgMHgwMDQ5LCAweDA4MTgsIDB4MDAyNiwgMHgwMGI2LCAweDYyMTAsIDB4MjI1OCwgMHhiYTNjLAorCTB4ODJmZiwgMHgwMTE4LCAweDgyMTEsIDB4YmEzZSwgMHgxMTQwLCAweGI4ZDAsIDB4OTAwNSwgMHgwMTI4LAorCTB4Yjg4OCwgMHg5MDA1LCAweDExMTAsIDB4Yjg4YiwgMHgwMDAxLCAweDAwYmUsIDB4MDAyZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDYwMDQsIDB4OTA4ZSwgMHgwMDAyLCAweDAxNDAsIDB4OTA4ZSwgMHgwMDAzLAorCTB4MDEyOCwgMHg5MDhlLCAweDAwMDQsIDB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwODYsIDB4MDA5NiwgMHg2MDIwLCAweDkwODYsIDB4MDAwNCwgMHgwMWE4LAorCTB4NjAxNCwgMHg5MDRkLCAweDA4MGMsIDB4Yzk3YSwgMHgwMTgwLCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LAorCTB4MDE3MCwgMHg2MDIwLCAweDkwYzYsIDB4MDAwMywgMHgwMTQwLCAweDkwYzYsIDB4MDAwMiwgMHgwMTI4LAorCTB4YTg2OCwgMHhkMGZjLCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDllLAorCTB4MDA4ZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4YWQyMCwgMHgwMTk4LCAweDJiMDgsIDB4NjExMiwgMHgwODBjLCAweGNlMTUsIDB4NjAyMywgMHgwMDAxLAorCTB4MjkwMCwgMHg2MDE2LCAweDA4MGMsIDB4MzI0MCwgMHgyMDA5LCAweDAwMjgsIDB4MDgwYywgMHhhZDRkLAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHg5MTg2LAorCTB4MDAxNSwgMHgxMWE4LCAweDIwMTEsIDB4MTgyNCwgMHgyMjA0LCAweDkwODYsIDB4MDA3NCwgMHgxMTc4LAorCTB4MDBiNiwgMHgwODBjLCAweGI4ZTcsIDB4MDBiZSwgMHgwODBjLCAweGJiMGEsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDI5LCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDA3OCwgMHg2MDE0LAorCTB4MDA5NiwgMHgyMDQ4LCAweGE4NjgsIDB4MDA5ZSwgMHhkMGZjLCAweDAxNDgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHhjZmQ0LCAweDA4MGMsIDB4YjY5MywgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgwMDk2LAorCTB4NjAxNCwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHhhODdiLCAweDAwMzAsIDB4YTg4MywgMHgwMDAwLAorCTB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwgMHhhODY3LCAweDAxMzksIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwMDllLCAweDA4MGMsIDB4YWNiMCwgMHgwYzMwLAorCTB4MDA5NiwgMHg5MTg2LCAweDAwMTYsIDB4MTEyOCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2NWUzLAorCTB4MDBlOCwgMHg5MTg2LCAweDAwMTUsIDB4MTUxMCwgMHgyMDExLCAweDE4MjQsIDB4MjIwNCwgMHg5MDg2LAorCTB4MDAxNCwgMHgxMWUwLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweDA4MGMsIDB4NjcyZSwgMHgwMGJlLAorCTB4MDgwYywgMHhiYmRiLCAweDExOTgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4Yjg5MCwgMHgwMGJlLAorCTB4OTAwNSwgMHgwMTYwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY1ZTMsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTg2OCwgMHhkMGZjLCAweDAxNzAsIDB4MDgwYywgMHhiMGJmLCAweDAwNDgsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTg2OCwgMHhkMGZjLCAweDA1MjgsIDB4MDgwYywgMHhiNjkzLCAweDA4MGMsIDB4YWNiMCwgMHgwMDllLAorCTB4MDAwNSwgMHg2MDE0LCAweDYzMTAsIDB4MjM1OCwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHhhODdiLAorCTB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDkwMGUsIDB4MDgwYywgMHg2OTg2LAorCTB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4YTk5YSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLCAweDA4MGMsIDB4YWNiMCwgMHgwOGY4LAorCTB4NjAxNCwgMHg5MDRkLCAweDA5MGMsIDB4MGQ3ZCwgMHhhODdiLCAweDAwMzAsIDB4YTg4MywgMHgwMDAwLAorCTB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwgMHhhODY3LCAweDAxMzksIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwODBjLCAweGFjYjAsIDB4MDg0MCwgMHhhODc4LAorCTB4OTA4NiwgMHgwMDA1LCAweDExMDgsIDB4MDAwOSwgMHgwMDA1LCAweGE4ODAsIDB4YzBhZCwgMHhhODgyLAorCTB4MDAwNSwgMHg2MDRiLCAweDAwMDAsIDB4NjAxNywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA1MCwgMHgyMDA5LCAweDgwMjMsIDB4MDgwYywgMHg5MmIwLCAweDAwMDUsIDB4MDBjNiwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDAxMzAsIDB4MDA2NiwgMHg2MDIwLAorCTB4OTA4NCwgMHgwMDBmLCAweDAwMWIsIDB4MDA2ZSwgMHgwMGNlLCAweDAwMDUsIDB4YzY3YiwgMHhjY2I4LAorCTB4Y2NiOCwgMHhjY2JiLCAweGU0OTQsIDB4ZTRhZiwgMHhlNGIyLCAweGM2N2IsIDB4YzY3YiwgMHhjNjdiLAorCTB4YzY3YiwgMHhjNjdiLCAweGM2N2IsIDB4YzY3YiwgMHhjNjdiLCAweGM2N2IsIDB4MDgwYywgMHgwZDdkLAorCTB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDA5NiwgMHg2MDE0LCAweDkwNGQsIDB4MDExOCwgMHhhODdjLAorCTB4ZDBlNCwgMHgxMTEwLCAweDAwOWUsIDB4MDAxMCwgMHgwMDllLCAweDAwMDUsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwNTUwLCAweDIwMDEsIDB4MTgzNCwgMHgyMDA0LAorCTB4OTAwNSwgMHgxNTQwLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweGFjNWEsIDB4MDUwOCwgMHg3ODEwLAorCTB4NjAxMiwgMHgwODBjLCAweGNlMTUsIDB4NzgyMCwgMHg5MDg2LCAweDAwMDMsIDB4MDEyOCwgMHg3ODA4LAorCTB4NjAzYSwgMHgyZjAwLCAweDYwM2UsIDB4MDAyMCwgMHg3ODA4LCAweDYwM2UsIDB4MmYwMCwgMHg2MDNhLAorCTB4NjAyZSwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDM1LCAweDYwMDMsIDB4MDAwMSwgMHg3OTVjLAorCTB4NjE1ZSwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDJmNjAsIDB4MDBmZSwgMHgwMDA1LAorCTB4MmY2MCwgMHgwMGZlLCAweDIwMDEsIDB4MTk4NywgMHgyMDA0LCAweDYwNGEsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDA5NiwgMHg2ODE0LCAweDIwNDgsIDB4NjgxYywgMHhkMGZjLCAweGMwZmMsIDB4NjgxZSwgMHhhODdjLAorCTB4MTEwOCwgMHhkMGU0LCAweDAxODAsIDB4YzBlNCwgMHhhODdlLCAweGE4NzcsIDB4MDAwMCwgMHhhODkzLAorCTB4MDAwMCwgMHhhODhmLCAweDAwMDAsIDB4ZDBjYywgMHgwMTMwLCAweGMwY2MsIDB4YTg3ZSwgMHhhODc4LAorCTB4MjA0OCwgMHgwODBjLCAweDBmZjksIDB4NjgzMCwgMHg2MDM2LCAweDkwOGUsIDB4MDAwMSwgMHgwMTQ4LAorCTB4NjgwMywgMHgwMDAyLCAweDkwODYsIDB4MDAwNSwgMHgwMTcwLCAweDkwMDYsIDB4NjAyZSwgMHg2MDMyLAorCTB4MDBkMCwgMHg2ODFjLCAweGMwODUsIDB4NjgxZSwgMHg2ODAzLCAweDAwMDQsIDB4NjgyNCwgMHhjMGY0LAorCTB4OTA4NSwgMHgwYzAwLCAweDY4MjYsIDB4NjgxNCwgMHgyMDQ4LCAweGE4YWMsIDB4NjkzOCwgMHg5MTAyLAorCTB4YThiMCwgMHg2OTNjLCAweDkxMDMsIDB4MWU0OCwgMHg2ODNjLCAweDYwMmUsIDB4NjgzOCwgMHg5MDg0LAorCTB4ZmZmYywgMHg2ODNhLCAweDYwMzIsIDB4MmQwMCwgMHg2MDNhLCAweDY4MDgsIDB4NjAzZSwgMHg2OTEwLAorCTB4NjExMiwgMHg2OTVjLCAweDYxNWUsIDB4NjAyMywgMHgwMDAxLCAweDYwMDcsIDB4MDAzOSwgMHg2MDAzLAorCTB4MDAwMSwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAwOWUsIDB4MDAxZSwgMHgwMDA1LAorCTB4NjAyNCwgMHhkMGQ0LCAweDA1MTAsIDB4ZDBmNCwgMHgxMWY4LCAweDYwMzgsIDB4OTQwYSwgMHg2MDNjLAorCTB4OTMwMywgMHgwMjMwLCAweDkxMDUsIDB4MDEyMCwgMHg2MDI0LCAweGMwZDQsIDB4YzBmNSwgMHgwMDk4LAorCTB4NjQzYSwgMHg2MzNlLCAweGFjM2UsIDB4YWI0MiwgMHgwMDQ2LCAweDAwMzYsIDB4MjQwMCwgMHhhY2FjLAorCTB4OTQwMiwgMHhhODM2LCAweDIzMDAsIDB4YWJiMCwgMHg5MzAzLCAweGE4M2EsIDB4MDAzZSwgMHgwMDRlLAorCTB4NjAyNCwgMHhjMGQ0LCAweDAwMDAsIDB4NjAyNiwgMHgwMDA1LCAweGQwZjQsIDB4MTEzOCwgMHhhODNjLAorCTB4NjAzYSwgMHhhODQwLCAweDYwM2UsIDB4NjAyNCwgMHhjMGY1LCAweDYwMjYsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAzNCwgMHgwMWI4LCAweDkwOGUsIDB4MDAzNSwgMHgwMWEwLAorCTB4OTA4ZSwgMHgwMDM2LCAweDAxODgsIDB4OTA4ZSwgMHgwMDM3LCAweDAxNzAsIDB4OTA4ZSwgMHgwMDM4LAorCTB4MDE1OCwgMHg5MDhlLCAweDAwMzksIDB4MDE0MCwgMHg5MDhlLCAweDAwM2EsIDB4MDEyOCwgMHg5MDhlLAorCTB4MDAzYiwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBlNiwgMHgyMDAxLCAweDE5ODEsIDB4MjAwYywgMHg4MDAwLAorCTB4MjAxNCwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywgMHg5MWY4LCAweDIwMDEsIDB4MTk4NSwgMHg4MmZmLAorCTB4MTExMCwgMHgyMDExLCAweDAwMTQsIDB4MjIwMiwgMHgyMDAxLCAweDE5ODMsIDB4MjAwYywgMHg4MDAwLAorCTB4MjAxNCwgMHgyMDcxLCAweDE5NmIsIDB4NzExYSwgMHg3MjFlLCAweDIwMDEsIDB4MDA2NCwgMHgwODBjLAorCTB4OTFmOCwgMHgyMDAxLCAweDE5ODYsIDB4ODJmZiwgMHgxMTEwLCAweDIwMTEsIDB4MDAxNCwgMHgyMjAyLAorCTB4MjAwMSwgMHgxOTg3LCAweDkyODgsIDB4MDAwYSwgMHgyMTAyLCAweDIwMDEsIDB4MDAxNywgMHgwODBjLAorCTB4YTkwZiwgMHgyMDAxLCAweDFhOGIsIDB4MjEwMiwgMHgyMDAxLCAweDAwMzIsIDB4MDgwYywgMHgxNmEwLAorCTB4MDgwYywgMHg2YWJlLCAweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwZTYsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDMsIDB4MDAyOCwgMHgyMDAxLAorCTB4MTk4NiwgMHgyMDAzLCAweDAwMTQsIDB4MjA3MSwgMHgxOTZiLCAweDcwMWIsIDB4MDAwMCwgMHg3MDFmLAorCTB4MDdkMCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwOSwgMHgwMDFlLCAweDIxMDIsIDB4MjAwMSwgMHgwMDE3LAorCTB4MDgwYywgMHhhOTBmLCAweDIwMDEsIDB4MWE4YiwgMHgyMTAyLCAweDIwMDEsIDB4MDAzMiwgMHgwODBjLAorCTB4MTZhMCwgMHgwMGVlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwOTYsIDB4NjA2MCwgMHg5MDRkLAorCTB4MDExMCwgMHgwODBjLCAweDEwNzksIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDUsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YWM1YSwgMHgwMTgwLCAweDJiMDgsIDB4NjExMiwgMHgwY2E5LAorCTB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwgMHgyMDA5LCAweDAwMzMsIDB4MDgwYywgMHhhZDRkLAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMDk2LAorCTB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTgwMCwgMHg5MTg2LCAweDAwMTUsIDB4MTUwMCwgMHg3MDkwLAorCTB4OTA4NiwgMHgwMDE4LCAweDExZTAsIDB4NjAxNCwgMHgyMDQ4LCAweGFhM2MsIDB4ZDJlNCwgMHgxMTYwLAorCTB4MmM3OCwgMHgwODBjLCAweDk3ZjcsIDB4MDFkOCwgMHg3MDdjLCAweGFhNTAsIDB4OTIwNiwgMHgxMTYwLAorCTB4NzA4MCwgMHhhYTU0LCAweDkyMDYsIDB4MTE0MCwgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYWEwLAorCTB4MDBiZSwgMHg5MDBlLCAweDA4MGMsIDB4MzI4ZiwgMHgwODBjLCAweGIwYmYsIDB4MDAyMCwgMHgwODBjLAorCTB4YjY5MywgMHgwODBjLCAweGFjYjAsIDB4MDBmZSwgMHgwMGVlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDYwLAorCTB4YWE1NCwgMHg5MjA2LCAweDBkNDgsIDB4MGM4MCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhhYzVhLCAweDAxODgsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4Y2UxNSwgMHg2MDIzLAorCTB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MjAwOSwgMHgwMDRkLCAweDA4MGMsIDB4YWQ0ZCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwMTYsIDB4MDgwYywgMHhhYzVhLCAweDAxODAsIDB4MmIwOCwgMHg2MTEyLAorCTB4MDgwYywgMHhjZTE1LCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MDAxZSwgMHgwODBjLAorCTB4YWQ0ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxZSwgMHg5MDA2LAorCTB4MGNkMCwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA2NiwgMHgwMDk2LAorCTB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTgwMCwgMHg5MTg2LCAweDAwMTUsIDB4MTU2OCwgMHg3MTkwLAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4MTQsIDB4ODAwMywgMHg5MTA2LCAweDE1MzAsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjAwMSwgMHgxOTlmLCAweDIwMDMsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4YTgzMCwgMHgyMGE4LAorCTB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA5NCwgMHgwMDNmLCAweDIyZTgsIDB4OTA4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDFiLCAweDIwYTAsIDB4MjAwMSwgMHgxOTlmLCAweDAwMTYsIDB4MjAwYywgMHgwODBjLAorCTB4ZDZkZiwgMHgwMDFlLCAweGE4MDQsIDB4OTAwNSwgMHgwMTEwLCAweDIwNDgsIDB4MGMzOCwgMHg2MDE0LAorCTB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4MDAxMCwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywgMHhhY2IwLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwOTYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4MTgwMCwgMHg5MTg2LAorCTB4MDAxNSwgMHgxMWI4LCAweDcwOTAsIDB4OTA4NiwgMHgwMDA0LCAweDExOTgsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MmM3OCwgMHgwODBjLCAweDk3ZjcsIDB4MDFhOCwgMHg3MDdjLCAweGFhNzQsIDB4OTIwNiwgMHgxMTMwLAorCTB4NzA4MCwgMHhhYTc4LCAweDkyMDYsIDB4MTExMCwgMHgwODBjLCAweDMyNDAsIDB4MDgwYywgMHhiMGJmLAorCTB4MDAyMCwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywgMHhhY2IwLCAweDAwZmUsIDB4MDBlZSwgMHgwMDllLAorCTB4MDAwNSwgMHg3MDYwLCAweGFhNzgsIDB4OTIwNiwgMHgwZDc4LCAweDBjODAsIDB4MDA5NiwgMHgwMGU2LAorCTB4MDBmNiwgMHgyMDcxLCAweDE4MDAsIDB4OTE4NiwgMHgwMDE1LCAweDE1NTAsIDB4NzA5MCwgMHg5MDg2LAorCTB4MDAwNCwgMHgxNTMwLCAweDYwMTQsIDB4MjA0OCwgMHgyYzc4LCAweDA4MGMsIDB4OTdmNywgMHgwNWYwLAorCTB4NzA3YywgMHhhYWNjLCAweDkyMDYsIDB4MTE4MCwgMHg3MDgwLCAweGFhZDAsIDB4OTIwNiwgMHgxMTYwLAorCTB4MDgwYywgMHgzMjQwLCAweDAwMTYsIDB4YTk5OCwgMHhhYWIwLCAweDkyODQsIDB4MTAwMCwgMHhjMGZkLAorCTB4MDgwYywgMHg1NmU3LCAweDAwMWUsIDB4MDAxMCwgMHgwODBjLCAweDU0Y2EsIDB4MDgwYywgMHhjOTdhLAorCTB4MDUwOCwgMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHgwMDgwLAorCTB4MDgwYywgMHhjOTdhLCAweDAxYjgsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4NTRjYSwgMHgxZDcwLAorCTB4YTg3YiwgMHgwMDMwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwgMHgwMDA0LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg2NywgMHgwMTM5LCAweDA4MGMsIDB4NmRlZSwgMHgwMTJlLAorCTB4MDgwYywgMHhhY2IwLCAweDAwZmUsIDB4MDBlZSwgMHgwMDllLCAweDAwMDUsIDB4NzA2MCwgMHhhYWQwLAorCTB4OTIwNiwgMHgwOTMwLCAweDA4ODgsIDB4MDAxNiwgMHgwMDI2LCAweGE4N2MsIDB4ZDBhYywgMHgwMTc4LAorCTB4YTkzOCwgMHhhYTM0LCAweDIxMDAsIDB4OTIwNSwgMHgwMTUwLCAweGE4OTAsIDB4OTEwNiwgMHgxMTE4LAorCTB4YTg4YywgMHg5MjA2LCAweDAxMjAsIDB4YTk5MiwgMHhhYThlLCAweDkwODUsIDB4MDAwMSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBkNiwgMHgwMDM2LCAweDA4MGMsIDB4Yzk3YSwgMHgwOTA0LAorCTB4Y2ZkMCwgMHgwMDk2LCAweDYzMTQsIDB4MjM0OCwgMHhhODdhLCAweGE5ODIsIDB4OTI5ZSwgMHg0MDAwLAorCTB4MTU4MCwgMHg2MzEwLCAweDAwYzYsIDB4MjM1OCwgMHgyMDA5LCAweDAwMDAsIDB4YTg2OCwgMHhkMGY0LAorCTB4MTE0MCwgMHgwODBjLCAweDY5ODYsIDB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LAorCTB4YzE4ZCwgMHhhYTk2LCAweGE5OWEsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDMxLCAweDIwYTAsIDB4YjhjNCwgMHgyMGUwLCAweGI4YzgsIDB4OTA4MCwgMHgwMDA2LAorCTB4MjA5OCwgMHgwODBjLCAweDBmYzQsIDB4MjBhOSwgMHgwMDA0LCAweGE4NWMsIDB4OTA4MCwgMHgwMDM1LAorCTB4MjBhMCwgMHhiOGM4LCAweDkwODAsIDB4MDAwYSwgMHgyMDk4LCAweDA4MGMsIDB4MGZjNCwgMHgwMGNlLAorCTB4MDA5MCwgMHhhYTk2LCAweDM5MTgsIDB4OTM5OCwgMHgwMDA3LCAweDIzMWMsIDB4NjAwNCwgMHg5MDg2LAorCTB4MDAxNiwgMHgwMTEwLCAweGE4OWIsIDB4MDAwNCwgMHhhYmEyLCAweDYzMTAsIDB4MjM1OCwgMHhiODA0LAorCTB4OTA4NCwgMHgwMGZmLCAweGE4OWUsIDB4MDgwYywgMHg2ZGUyLCAweDYwMTcsIDB4MDAwMCwgMHgwMDllLAorCTB4MDAzZSwgMHgwMGRlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHgwMGI2LAorCTB4MDA5NiwgMHgwMGY2LCAweDYyMTQsIDB4MjI0OCwgMHg2MjEwLCAweDIyNTgsIDB4MjA3OSwgMHgwMjYwLAorCTB4OTA5NiwgMHgwMDAwLCAweDExYTAsIDB4YjgxNCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwZSwgMHgwODBjLAorCTB4MjY2MSwgMHgyMTE4LCAweDgzMWYsIDB4OTM5YywgMHhmZjAwLCAweDc4MzgsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTMxZCwgMHg3YzNjLCAweDIwMTEsIDB4ODAxOCwgMHgwODBjLCAweDRiNTIsIDB4MDBhOCwgMHg5MDk2LAorCTB4MDAwMSwgMHgxMTQ4LCAweDg5ZmYsIDB4MDE4MCwgMHhhODliLCAweDAwMGQsIDB4NzgzOCwgMHhhOGE2LAorCTB4NzgzYywgMHhhOGFhLCAweDAwNDgsIDB4OTA5NiwgMHgwMDAyLCAweDExMzAsIDB4YTg5YiwgMHgwMDBkLAorCTB4NzgzOCwgMHhhOGE2LCAweDc4M2MsIDB4YThhYSwgMHgwMGZlLCAweDAwOWUsIDB4MDBiZSwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBjNiwgMHgwMDI2LCAweDAwMTYsIDB4OTE4NiwgMHgwMDM1LAorCTB4MDExMCwgMHg2YTM4LCAweDAwMDgsIDB4NmEyYywgMHgwODBjLCAweGM5NjgsIDB4MDFmMCwgMHgyMjYwLAorCTB4NjEyMCwgMHg5MTg2LCAweDAwMDMsIDB4MDExOCwgMHg5MTg2LCAweDAwMDYsIDB4MTE5MCwgMHg2ODM4LAorCTB4OTIwNiwgMHgwMTQwLCAweDY4M2MsIDB4OTIwNiwgMHgxMTYwLCAweDYxMDgsIDB4NjgzOCwgMHg5MTA2LAorCTB4MTE0MCwgMHgwMDIwLCAweDYwMDgsIDB4NjkzYywgMHg5MTA2LCAweDExMTgsIDB4NjAxMCwgMHg2OTEwLAorCTB4OTEwNiwgMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LAorCTB4YTk3NCwgMHhkMWNjLCAweDAxODgsIDB4OTE4YywgMHgwMGZmLCAweDkxOGUsIDB4MDAwMiwgMHgxMTYwLAorCTB4YTlhOCwgMHg5MThjLCAweDBmMDAsIDB4ODEwZiwgMHg5MThlLCAweDAwMDEsIDB4MTEyOCwgMHhhODM0LAorCTB4YTkzOCwgMHg5MTE1LCAweDE5MGMsIDB4YmY5NiwgMHgwMDA1LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLAorCTB4MDAxMCwgMHgwMDM2LCAweDkwMWUsIDB4MDQ5OSwgMHgwMWUwLCAweDA4MGMsIDB4Yzk3YSwgMHgwMWM4LAorCTB4MDgwYywgMHhjYjZiLCAweDYwMzcsIDB4NDAwMCwgMHg2MDE0LCAweDYwMTcsIDB4MDAwMCwgMHgwMDk2LAorCTB4MjA0OCwgMHhhODdjLCAweDA4MGMsIDB4Y2I5MSwgMHgxMTE4LCAweDA4MGMsIDB4YjY5MywgMHgwMDQwLAorCTB4YTg2NywgMHgwMTAzLCAweGE4NzcsIDB4MDAwMCwgMHg4M2ZmLCAweDExMjksIDB4MDgwYywgMHg2ZGVlLAorCTB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsIDB4YTg4MCwgMHhkMGI0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA2LAorCTB4YzBlYywgMHhhODgyLCAweDAwNDgsIDB4ZDBiYywgMHgwMTE4LCAweGE4N2IsIDB4MDAwMiwgMHgwMDIwLAorCTB4YTg3YiwgMHgwMDA1LCAweDA4MGMsIDB4Y2M4NSwgMHhhODc3LCAweDAwMDAsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTgxMCwgMHgyMDA0LCAweGQwZWMsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4ZDBmNCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMGU0LAorCTB4MDAwZSwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiYmEwLAorCTB4MDBiZSwgMHgyMDIxLCAweDAwMDcsIDB4MDgwYywgMHg0ZDA5LCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LAorCTB4MGM1MSwgMHgxZDgxLCAweDAwMDUsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDQsIDB4NjAxYSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxOTg3LCAweDIwMDQsIDB4NjA0YSwgMHgwMDA1LCAweDA4MGMsIDB4YWNiMCwgMHgwODA0LAorCTB4OTczOCwgMHg2MTFjLCAweGQxZmMsIDB4YTk3YywgMHgxMTA4LCAweGQxZTQsIDB4MDAwNSwgMHg2MDFjLAorCTB4ZDBmYywgMHhhODdjLCAweDExMDgsIDB4ZDBlNCwgMHgwMDA1LCAweDYwMWMsIDB4ZDBmYywgMHhjMGZjLAorCTB4NjAxZSwgMHhhODdjLCAweDExMDgsIDB4ZDBlNCwgMHgwMDA1LCAweDYwNDQsIDB4ZDBmYywgMHgxMTM4LAorCTB4ZDBiYywgMHgwMTk4LCAweGMwYmMsIDB4NjA0NiwgMHg2MDAzLCAweDAwMDIsIDB4MDA3MCwgMHhkMGFjLAorCTB4MTE2MCwgMHhkMGRjLCAweDExMjgsIDB4OTA4YywgMHgwMDBmLCAweDkxODYsIDB4MDAwNSwgMHgxMTE4LAorCTB4NjAwMywgMHgwMDAzLCAweDAwMTAsIDB4NjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDBiNiwgMHgwMDY2LAorCTB4NjAwMCwgMHg5MGIyLCAweDAwMTYsIDB4MWEwYywgMHgwZDdkLCAweDAwMWIsIDB4MDA2ZSwgMHgwMGJlLAorCTB4MDAwNSwgMHhkMTA5LCAweGQ4M2EsIDB4ZDk4YiwgMHhkMTA5LCAweGQxMDksIDB4ZDEwOSwgMHhkMTA5LAorCTB4ZDEwOSwgMHhkMTQwLCAweGRhMGYsIDB4ZDEwOSwgMHhkMTA5LCAweGQxMDksIDB4ZDEwOSwgMHhkMTA5LAorCTB4ZDEwOSwgMHgwODBjLCAweDBkN2QsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLAorCTB4MGQ3ZCwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhkMTI0LCAweGRmMzAsIDB4ZDEyNCwgMHhkMTI0LAorCTB4ZDEyNCwgMHhkMTI0LCAweGQxMjQsIDB4ZDEyNCwgMHhkZWRmLCAweGRmODIsIDB4ZDEyNCwgMHhlNWNmLAorCTB4ZTYwMywgMHhlNWNmLCAweGU2MDMsIDB4ZDEyNCwgMHgwODBjLCAweDBkN2QsIDB4NjAwMCwgMHg5MDgyLAorCTB4MDAxNiwgMHgxYTBjLCAweDBkN2QsIDB4NjAwMCwgMHgwMDBhLCAweDAwMDUsIDB4ZDEzZSwgMHhkYmVjLAorCTB4ZGNiNywgMHhkY2RhLCAweGRkNTYsIDB4ZDEzZSwgMHhkZTUxLCAweGRkZGUsIDB4ZGExOSwgMHhkZWI3LAorCTB4ZGVjYywgMHhkMTNlLCAweGQxM2UsIDB4ZDEzZSwgMHhkMTNlLCAweGQxM2UsIDB4MDgwYywgMHgwZDdkLAorCTB4OTFiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGQ3ZCwgMHgyMTAwLCAweDkxYjIsIDB4MDA0MCwgMHgxYTA0LAorCTB4ZDViMCwgMHgwMDAyLCAweGQxOGEsIDB4ZDM3ZSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMzg3LAorCTB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLAorCTB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLAorCTB4ZDE4YSwgMHhkMThjLCAweGQxZjMsIDB4ZDIwMiwgMHhkMjY2LCAweGQyOTEsIDB4ZDMwYSwgMHhkMzY5LAorCTB4ZDE4YSwgMHhkMThhLCAweGQzOGEsIDB4ZDE4YSwgMHhkMThhLCAweGQzOWYsIDB4ZDNhYywgMHhkMThhLAorCTB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkNDUyLCAweGQxOGEsIDB4ZDE4YSwgMHhkNDY2LAorCTB4ZDE4YSwgMHhkMThhLCAweGQ0MjEsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDQ3ZSwgMHhkMThhLAorCTB4ZDE4YSwgMHhkMThhLCAweGQ0ZmIsIDB4ZDE4YSwgMHhkMThhLCAweGQxOGEsIDB4ZDE4YSwgMHhkMThhLAorCTB4ZDE4YSwgMHhkNTc4LCAweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweDZhOWIsIDB4MTE1MCwgMHgyMDAxLAorCTB4MTgzNywgMHgyMDA0LCAweGQwY2MsIDB4MTEyOCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwgMHgwMDA4LAorCTB4MTE0MCwgMHg2MDA3LCAweDAwMDksIDB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MDAwMCwgMHgwODA0LAorCTB4ZDM3NywgMHgwODBjLCAweDZhMzcsIDB4MDBlNiwgMHgwMGM2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LAorCTB4NjIxMCwgMHgyMjU4LCAweGJhYTAsIDB4MDAyNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHhhOTFlLAorCTB4MDgwYywgMHg5NDNkLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDkzMDYsIDB4MmMwOCwgMHgwODBjLAorCTB4ZTE2NywgMHgwMDdlLCAweDAwMWUsIDB4MDgwYywgMHhhOTNhLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDBjZSwgMHgwMGVlLCAweDY2MTAsIDB4MjY1OCwgMHgwODBjLCAweDY2YTIsIDB4YmUwNCwgMHg5Njg0LAorCTB4MDBmZiwgMHg5MDgyLCAweDAwMDYsIDB4MTI2OCwgMHgwMDE2LCAweDAwMjYsIDB4NjIxMCwgMHgwMGI2LAorCTB4MjI1OCwgMHhiYWEwLCAweDAwYmUsIDB4MmMwOCwgMHgwODBjLCAweGU4MmMsIDB4MDAyZSwgMHgwMDFlLAorCTB4MTE3OCwgMHgwODBjLCAweGUwOTUsIDB4MTkwNCwgMHhkMjVlLCAweDA4MGMsIDB4ZTAzMSwgMHgxMTIwLAorCTB4NjAwNywgMHgwMDA4LCAweDA4MDQsIDB4ZDM3NywgMHg2MDA3LCAweDAwMDksIDB4MDgwNCwgMHhkMzc3LAorCTB4MDgwYywgMHhlMmM4LCAweDAxMjgsIDB4MDgwYywgMHhlMDk1LCAweDBkNzgsIDB4MDgwNCwgMHhkMjVlLAorCTB4NjAxNywgMHgxOTAwLCAweDBjODgsIDB4MDgwYywgMHgzMzc3LCAweDE5MDQsIDB4ZDVhZCwgMHg2MTA2LAorCTB4MDgwYywgMHhkZmUyLCAweDYwMDcsIDB4MDAwNiwgMHgwODA0LCAweGQzNzcsIDB4NjAwNywgMHgwMDA3LAorCTB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4ZTYzZiwgMHgxOTA0LCAweGQ1YWQsIDB4MDgwYywgMHgzMzc3LAorCTB4MTkwNCwgMHhkNWFkLCAweDAwZDYsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NCwgMHgwMGZmLAorCTB4OTA4MiwgMHgwMDA2LCAweDEyMjAsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjVjZiwgMHg5NmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwMTg4LCAweDk2ODYsIDB4MDAwNCwgMHgwMTcwLAorCTB4YmUwNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwgMHgwMDA2LCAweDAxNDAsIDB4OTY4NiwgMHgwMDA0LAorCTB4MDEyOCwgMHg5Njg2LCAweDAwMDUsIDB4MDExMCwgMHgwMGRlLCAweDA0ODAsIDB4MDBlNiwgMHgyMDcxLAorCTB4MDI2MCwgMHg3MDM0LCAweDkwODQsIDB4MDAwMywgMHgxMTQwLCAweDcwMzQsIDB4OTA4MiwgMHgwMDE0LAorCTB4MDIyMCwgMHg3MDMwLCAweDkwODQsIDB4MDAwMywgMHgwMTMwLCAweDAwZWUsIDB4NjAxNywgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDA3LCAweDAwYjAsIDB4MDBlZSwgMHgwODBjLCAweGUwZmQsIDB4MTE5MCwgMHg5Njg2LAorCTB4MDAwNiwgMHgxMTQwLCAweDAwMjYsIDB4NjIxMCwgMHgyMjU4LCAweGJhYTAsIDB4OTAwZSwgMHgwODBjLAorCTB4MzI4ZiwgMHgwMDJlLCAweDA4MGMsIDB4NjcyZSwgMHg2MDA3LCAweDAwMGEsIDB4MDBkZSwgMHgwODA0LAorCTB4ZDM3NywgMHg2MDA3LCAweDAwMGIsIDB4MDBkZSwgMHgwODA0LCAweGQzNzcsIDB4MDgwYywgMHgzMjQwLAorCTB4MDgwYywgMHhkMGIwLCAweDYwMDcsIDB4MDAwMSwgMHgwODA0LCAweGQzNzcsIDB4MDgwYywgMHhlNjNmLAorCTB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4MjA3MSwgMHgwMjYwLAorCTB4NzAzNCwgMHg5MGI0LCAweDAwMDMsIDB4MTk0OCwgMHg5MGIyLCAweDAwMTQsIDB4MGEzMCwgMHg3MDMwLAorCTB4OTA4NCwgMHgwMDAzLCAweDE5MTAsIDB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NiwgMHgwNzA3LAorCTB4MDllOCwgMHgwMDI2LCAweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDkwMGUsIDB4MDgwYywgMHgzMjhmLAorCTB4MDAyZSwgMHg2MDA3LCAweDAwMGMsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4ZTgwYywgMHgwODA0LAorCTB4ZDM3NywgMHgwODBjLCAweDZhOWIsIDB4MTE0MCwgMHgyMDAxLCAweDE4MzcsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDAwOSwgMHg5MDg2LCAweDAwMDgsIDB4MTExMCwgMHgwODA0LCAweGQxOTksIDB4MDgwYywgMHg2YTM3LAorCTB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwgMHgwNmM4LAorCTB4MTEzOCwgMHgwMDI2LCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDY2MGYsIDB4MDAyZSwgMHgwMDUwLAorCTB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwgMHgwMDA0LCAweDAxMjAsIDB4OTY4NiwgMHgwMDA2LAorCTB4MTkwNCwgMHhkMjVlLCAweDA4MGMsIDB4ZTEwYSwgMHgxMTIwLCAweDYwMDcsIDB4MDAwZSwgMHgwODA0LAorCTB4ZDM3NywgMHgwMDQ2LCAweDY0MTAsIDB4MjQ1OCwgMHhiY2EwLCAweDAwNDYsIDB4MDgwYywgMHgzMjQwLAorCTB4MDgwYywgMHhkMGIwLCAweDAwNGUsIDB4MDAxNiwgMHg5MDA2LCAweDIwMDksIDB4MTg0OCwgMHgyMTBjLAorCTB4ZDFhNCwgMHgwMTQ4LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGU0NDUsIDB4NjAxMCwgMHgyMDU4LAorCTB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MDAxZSwgMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwgMHgwODA0LAorCTB4ZDM3NywgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg2NWNmLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHgxODA1LCAweDIwMTEsIDB4MDI3MCwgMHgwODBjLAorCTB4YmM4ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDkwMDUsIDB4MDE2OCwgMHg5NmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweDk2ODIsIDB4MDAwNCwgMHgwYTA0LCAweGQyNWUsIDB4OTY4MiwgMHgwMDA3LAorCTB4MGEwNCwgMHhkMmJhLCAweDA4MDQsIDB4ZDI1ZSwgMHg2MDE3LCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LAorCTB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4NmE5YiwgMHgxMTQwLCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LAorCTB4OTA4NCwgMHgwMDA5LCAweDkwODYsIDB4MDAwOCwgMHgxMTEwLCAweDA4MDQsIDB4ZDE5OSwgMHgwODBjLAorCTB4NmEzNywgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHg5Njg0LCAweDAwZmYsIDB4MDAwNiwgMHg5MDg2LAorCTB4MDAwMSwgMHgwMDBlLCAweDAxNzAsIDB4OTA4MiwgMHgwMDA2LCAweDA2OTgsIDB4MDE1MCwgMHg5NmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNCwgMHgwMTIwLCAweDk2ODYsIDB4MDAwNiwgMHgxOTA0LAorCTB4ZDI1ZSwgMHgwODBjLCAweGUxMzgsIDB4MTEzMCwgMHgwODBjLCAweGUwMzEsIDB4MTExOCwgMHg2MDA3LAorCTB4MDAxMCwgMHgwNGU4LCAweDAwNDYsIDB4NjQxMCwgMHgyNDU4LCAweGJjYTAsIDB4MDA0NiwgMHgwODBjLAorCTB4MzI0MCwgMHgwODBjLCAweGQwYjAsIDB4MDA0ZSwgMHgwMDE2LCAweDkwMDYsIDB4MjAwOSwgMHgxODQ4LAorCTB4MjEwYywgMHhkMWE0LCAweDAxNDgsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4ZTQ0NSwgMHg2MDEwLAorCTB4MjA1OCwgMHhiODAwLCAweGMwZTUsIDB4YjgwMiwgMHgwMDFlLCAweDAwNGUsIDB4NjAwNywgMHgwMDAxLAorCTB4MDBmMCwgMHgwODBjLCAweGUyYzgsIDB4MDE0MCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LAorCTB4MDAwNiwgMHgwOTc4LCAweDA4MDQsIDB4ZDI1ZSwgMHg2MDE3LCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LAorCTB4MDA3MCwgMHgwODBjLCAweDMzNzcsIDB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4ZTYzZiwgMHgxOTA0LAorCTB4ZDVhZCwgMHgwODBjLCAweGQ3N2EsIDB4MTkwNCwgMHhkMjVlLCAweDYwMDcsIDB4MDAxMiwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4NjAwNywgMHgwMDAxLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MGNiMCwgMHg2MDA3LAorCTB4MDAwNSwgMHgwYzY4LCAweDA4MGMsIDB4ZTYzZiwgMHgxOTA0LCAweGQ1YWQsIDB4MDgwYywgMHgzMzc3LAorCTB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4ZDc3YSwgMHgxOTA0LCAweGQyNWUsIDB4NjAwNywgMHgwMDIwLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHgwODBjLAorCTB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4NjAwNywgMHgwMDIzLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHgwODBjLCAweGU2M2YsIDB4MTkwNCwgMHhkNWFkLAorCTB4MDgwYywgMHgzMzc3LCAweDE5MDQsIDB4ZDVhZCwgMHgwODBjLCAweGQ3N2EsIDB4MTkwNCwgMHhkMjVlLAorCTB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwgMHgwMjYwLCAweDJjMDgsIDB4MjAxMSwgMHgxODIwLAorCTB4MjIxNCwgMHg3MDNjLCAweDkyMDYsIDB4MTFlMCwgMHgyMDExLCAweDE4MWYsIDB4MjIxNCwgMHg3MDM4LAorCTB4OTA4NCwgMHgwMGZmLCAweDkyMDYsIDB4MTFhMCwgMHg3MjQwLCAweDA4MGMsIDB4Yzk2OCwgMHgwNTcwLAorCTB4MjI2MCwgMHg2MDA4LCAweDkwODYsIDB4ZmZmZiwgMHgwMTIwLCAweDcyNDQsIDB4NjAwOCwgMHg5MjA2LAorCTB4MTUyOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNywgMHgxNTA4LCAweDA4MGMsIDB4YWNiMCwgMHgwNGEwLAorCTB4NzI0NCwgMHg5Mjg2LCAweGZmZmYsIDB4MDE4MCwgMHgyYzA4LCAweDA4MGMsIDB4Yzk2OCwgMHgwMWIwLAorCTB4MjI2MCwgMHg3MjQwLCAweDYwMDgsIDB4OTIwNiwgMHgxMTg4LCAweDYwMTAsIDB4OTE5MCwgMHgwMDA0LAorCTB4MjIxNCwgMHg5MjA2LCAweDAxYjgsIDB4MDA1MCwgMHg3MjQwLCAweDJjMDgsIDB4OTAwNiwgMHgwODBjLAorCTB4ZTQwZiwgMHgxMTgwLCAweDcyNDQsIDB4OTI4NiwgMHhmZmZmLCAweDAxYjAsIDB4MjE2MCwgMHg2MDA3LAorCTB4MDAyNiwgMHg2MDE3LCAweDE3MDAsIDB4NzIxNCwgMHg5Mjk2LCAweGZmZmYsIDB4MTE4MCwgMHg2MDA3LAorCTB4MDAyNSwgMHgwMDY4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA3LCAweDFkODAsIDB4NjAwNCwgMHg5MDg2LAorCTB4MDAyNCwgMHgxMTEwLCAweDA4MGMsIDB4YWNiMCwgMHgyMTYwLCAweDYwMDcsIDB4MDAyNSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg2NWNmLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHgxODA1LCAweDIwMTEsIDB4MDI3NiwgMHgwODBjLAorCTB4YmM4ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAxMjAsIDB4NjAwNywgMHgwMDMxLAorCTB4MDgwNCwgMHhkMzc3LCAweDA4MGMsIDB4YjhmZiwgMHgwODBjLCAweDc1M2QsIDB4MTE5MCwgMHgwMDA2LAorCTB4MDAyNiwgMHgwMDM2LCAweDA4MGMsIDB4NzU1NywgMHgxMTM4LCAweDA4MGMsIDB4Nzg0MCwgMHgwODBjLAorCTB4NjA5MiwgMHgwODBjLCAweDc0NmUsIDB4MDAxMCwgMHgwODBjLCAweDc1MTEsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAwZSwgMHgwMDA1LCAweDA4MGMsIDB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4MDgwYywgMHhkNzdhLAorCTB4MTkwNCwgMHhkMjVlLCAweDYxMDYsIDB4MDgwYywgMHhkNzk2LCAweDExMjAsIDB4NjAwNywgMHgwMDJiLAorCTB4MDgwNCwgMHhkMzc3LCAweDYwMDcsIDB4MDAyYywgMHgwODA0LCAweGQzNzcsIDB4MDgwYywgMHhlNjNmLAorCTB4MTkwNCwgMHhkNWFkLCAweDA4MGMsIDB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4MDgwYywgMHhkNzdhLAorCTB4MTkwNCwgMHhkMjVlLCAweDYxMDYsIDB4MDgwYywgMHhkNzliLCAweDExMjAsIDB4NjAwNywgMHgwMDJlLAorCTB4MDgwNCwgMHhkMzc3LCAweDYwMDcsIDB4MDAyZiwgMHgwODA0LCAweGQzNzcsIDB4MDgwYywgMHgzMzc3LAorCTB4MTkwNCwgMHhkNWFkLCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDYwMTAsIDB4MjA1OCwgMHhiOTA0LAorCTB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgwMTU4LCAweDkxODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4OTA4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDgwNCwgMHhkMzdlLAorCTB4MDgwYywgMHg1NzQyLCAweGQwZTQsIDB4MDkwNCwgMHhkNGY4LCAweDIwNzEsIDB4MDI2YywgMHg3MDEwLAorCTB4NjAzYSwgMHg3MDE0LCAweDYwM2UsIDB4NzEwOCwgMHg3MjBjLCAweDA4MGMsIDB4NmFkOSwgMHgwMTQwLAorCTB4NjAxMCwgMHgyMDU4LCAweGI4MTAsIDB4OTEwNiwgMHgxMTE4LCAweGI4MTQsIDB4OTIwNiwgMHgwNTEwLAorCTB4MDgwYywgMHg2YWQ1LCAweDE1YjgsIDB4MjA2OSwgMHgxODAwLCAweDY4ODAsIDB4OTIwNiwgMHgxNTkwLAorCTB4Njg3YywgMHg5MTA2LCAweDE1NzgsIDB4NzIxMCwgMHgwODBjLCAweGM5NjgsIDB4MDU5MCwgMHgwODBjLAorCTB4ZDY2NSwgMHgwNTc4LCAweDA4MGMsIDB4ZTRjMSwgMHgwNTYwLCAweDYyMmUsIDB4NjAwNywgMHgwMDM2LAorCTB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMDA1LCAweDcyMTQsIDB4OTI4NiwgMHhmZmZmLCAweDAxNTAsIDB4MDgwYywgMHhjOTY4LAorCTB4MDFjMCwgMHg5MjgwLCAweDAwMDIsIDB4MjAwNCwgMHg3MTEwLCAweDkxMDYsIDB4MTE5MCwgMHgwOGUwLAorCTB4NzIxMCwgMHgyYzA4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweGU0MGYsIDB4MmMxMCwgMHgyMTYwLAorCTB4MDE0MCwgMHgwODkwLCAweDYwMDcsIDB4MDAzNywgMHg2MDJmLCAweDAwMDksIDB4NjAxNywgMHgxNTAwLAorCTB4MDhiOCwgMHg2MDA3LCAweDAwMzcsIDB4NjAyZiwgMHgwMDAzLCAweDYwMTcsIDB4MTcwMCwgMHgwODgwLAorCTB4NjAwNywgMHgwMDEyLCAweDA4NjgsIDB4MDgwYywgMHgzMzc3LCAweDE5MDQsIDB4ZDVhZCwgMHg2MDEwLAorCTB4MjA1OCwgMHhiODA0LCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwNiwgMHgxOTA0LAorCTB4ZDM3ZSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwODBjLCAweDU3NDIsIDB4ZDBlNCwgMHgwOTA0LAorCTB4ZDU3MCwgMHgyMDY5LCAweDE4MDAsIDB4MjA3MSwgMHgwMjZjLCAweDcwMDgsIDB4NjAzYSwgMHg3MjBjLAorCTB4NjIzZSwgMHg5Mjg2LCAweGZmZmYsIDB4MTE1MCwgMHg3MjA4LCAweDAwYzYsIDB4MmMwOCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwODBjLCAweGU0MGYsIDB4MmMxMCwgMHgwMGNlLCAweDA1ZTgsIDB4MDgwYywgMHhjOTY4LAorCTB4MDVkMCwgMHg3MTA4LCAweDkyODAsIDB4MDAwMiwgMHgyMDA0LCAweDkxMDYsIDB4MTVhMCwgMHgwMGM2LAorCTB4MDAyNiwgMHgyMjYwLCAweDA4MGMsIDB4YzU1OSwgMHgwMDJlLCAweDAwY2UsIDB4NzExOCwgMHg5MThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAwMSwgMHgwMTc4LCAweDkxODYsIDB4MDAwNSwgMHgwMTE4LAorCTB4OTE4NiwgMHgwMDA3LCAweDExOTgsIDB4OTI4MCwgMHgwMDA1LCAweDIwMDQsIDB4OTAwNSwgMHgwMTcwLAorCTB4MDgwYywgMHhkNjY1LCAweDA5MDQsIDB4ZDRmMSwgMHgwMDU2LCAweDc1MTAsIDB4NzYxNCwgMHgwODBjLAorCTB4ZTRkYSwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4NjAwNywgMHgwMDNiLAorCTB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MmEwMCwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHg4MDIwLAorCTB4MDgwYywgMHg5MmIwLCAweDBjNzgsIDB4NjAwNywgMHgwMDNiLCAweDYwMmYsIDB4MDAwMywgMHg2MDE3LAorCTB4MDMwMCwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwYzEwLAorCTB4NjAwNywgMHgwMDNiLCAweDYwMmYsIDB4MDAwYiwgMHg2MDE3LCAweDAwMDAsIDB4MDgwNCwgMHhkNGM4LAorCTB4MDBlNiwgMHgwMDI2LCAweDA4MGMsIDB4NmE5YiwgMHgwNTUwLCAweDA4MGMsIDB4NmEzNywgMHgwODBjLAorCTB4ZTZiMSwgMHgxNTE4LCAweDIwNzEsIDB4MTgwMCwgMHg3MGRjLCAweDkwODUsIDB4MDAwMywgMHg3MGRlLAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzJiMCwgMHg5Mjg0LCAweDAwZmYsIDB4NzA3ZSwgMHg3OGU2LAorCTB4OTI4NCwgMHhmZjAwLCAweDcyODAsIDB4OTIwNSwgMHg3MDgyLCAweDc4ZWEsIDB4MDBmZSwgMHg3MGU3LAorCTB4MDAwMCwgMHgwODBjLCAweDZhZDksIDB4MDEyMCwgMHgyMDExLCAweDFhMDgsIDB4MjAxMywgMHgwN2QwLAorCTB4ZDBhYywgMHgxMTI4LCAweDA4MGMsIDB4MzAxMSwgMHgwMDEwLCAweDA4MGMsIDB4ZTZlMywgMHgwMDJlLAorCTB4MDBlZSwgMHgwODBjLCAweGFjYjAsIDB4MDgwNCwgMHhkMzdkLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LAorCTB4MjYwMCwgMHgwMDAyLCAweGQ1YzQsIDB4ZDVmNSwgMHhkNjA2LCAweGQ1YzQsIDB4ZDVjNCwgMHhkNWM2LAorCTB4ZDYxNywgMHhkNWM0LCAweGQ1YzQsIDB4ZDVjNCwgMHhkNWUzLCAweGQ1YzQsIDB4ZDVjNCwgMHhkNWM0LAorCTB4ZDYyMiwgMHhkNjJmLCAweGQ2NjAsIDB4ZDVjNCwgMHgwODBjLCAweDBkN2QsIDB4MDgwYywgMHhlNjNmLAorCTB4MWQyMCwgMHgwODBjLCAweDMzNzcsIDB4MWQwOCwgMHgwODBjLCAweGQ3N2EsIDB4MTE0OCwgMHg3MDM4LAorCTB4NjAxNiwgMHg2MDA3LCAweDAwNDUsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwMDA1LAorCTB4MDgwYywgMHgzMjQwLCAweDA4MGMsIDB4ZDBiMCwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg5MmI3LCAweDAwMDUsIDB4MDgwYywgMHhlNjNmLCAweDE5MzgsIDB4MDgwYywgMHgzMzc3LAorCTB4MTkyMCwgMHgwODBjLCAweGQ3N2EsIDB4MWQ2MCwgMHg3MDNjLCAweDYwMTYsIDB4NjAwNywgMHgwMDRhLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwMDA1LCAweDA4MGMsIDB4MzM3NywgMHgxOTA0LAorCTB4ZDVhZCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHhlNmVjLCAweDYwMDcsIDB4MDA0NywgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4MDgwYywgMHgzMzc3LAorCTB4MTkwNCwgMHhkNWFkLCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweGU2ZWMsIDB4NjAwNywgMHgwMDQ3LAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHgwODBjLAorCTB4MzM3NywgMHgxOTA0LCAweGQ1YWQsIDB4MjAwOSwgMHgwMDQ2LCAweDA4MGMsIDB4ZTZlYywgMHgwODBjLAorCTB4YWNiMCwgMHgwMDA1LCAweDA4MGMsIDB4ZDY4MiwgMHgwOTA0LCAweGQ1YWQsIDB4NjAwNywgMHgwMDRlLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHg2MDA3LAorCTB4MDA0ZiwgMHg2MDE3LCAweDAwMDAsIDB4NzEzNCwgMHg5MThjLCAweDAwZmYsIDB4ODFmZiwgMHgwNTA4LAorCTB4OTE4NiwgMHgwMDAxLCAweDExNjAsIDB4NzE0MCwgMHgyMDAxLCAweDE5YmMsIDB4MjAwNCwgMHg5MTA2LAorCTB4MTFiMCwgMHg3MTQ0LCAweDIwMDEsIDB4MTliZCwgMHgyMDA0LCAweDkxMDYsIDB4MDE5MCwgMHg5MTg2LAorCTB4MDAwMiwgMHgxMTY4LCAweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4NjAxMCwgMHgwMDk2LAorCTB4MjA0OCwgMHgyMDE5LCAweDAwMGEsIDB4MDgwYywgMHhiY2EyLCAweDAwOWUsIDB4MDExMCwgMHg2MDE3LAorCTB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg5MmI3LCAweDA4MGMsIDB4OTczOCwgMHgwMDA1LAorCTB4NjAwNywgMHgwMDUwLCAweDcwM2MsIDB4NjAxNiwgMHgwY2EwLCAweDAwMTYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MDI2MCwgMHgwMGI2LCAweDAwYzYsIDB4MjI2MCwgMHg2MDEwLCAweDIwNTgsIDB4YjhkNCwgMHhkMDg0LAorCTB4MDE1MCwgMHg3MTI4LCAweDYwNGMsIDB4OTEwNiwgMHgxMTIwLCAweDcxMmMsIDB4NjA1MCwgMHg5MTA2LAorCTB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBiZSwgMHgwMGVlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA5NiwgMHgwMDg2LCAweDAwZTYsIDB4MDFjNiwgMHgwMWQ2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxODAwLCAweDcwOTAsIDB4OTA4YSwgMHgwMGY5LAorCTB4MTZlOCwgMHgyMGUxLCAweDAwMDAsIDB4MjAwMSwgMHgxOTlmLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLAorCTB4MTA2MCwgMHgwNWEwLCAweDI5MDAsIDB4NjAxNiwgMHg3MDkwLCAweDgwMDQsIDB4YTgxNiwgMHg5MDhhLAorCTB4MDAxZSwgMHgwMmQwLCAweGE4MzMsIDB4MDAxZSwgMHgyMGE5LCAweDAwMWUsIDB4YTg2MCwgMHgyMGU4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwgMHgyMDAxLCAweDE5OWYsIDB4MDAxNiwgMHgyMDBjLAorCTB4MDQ3MSwgMHgwMDFlLCAweDI5NDAsIDB4MDgwYywgMHgxMDYwLCAweDAxYzAsIDB4MjkwMCwgMHhhMDA2LAorCTB4MjEwMCwgMHg4MWZmLCAweDAxODAsIDB4MGMxOCwgMHhhODMyLCAweDIwYTgsIDB4YTg2MCwgMHgyMGU4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwgMHgyMDAxLCAweDE5OWYsIDB4MDAxNiwgMHgyMDBjLAorCTB4MDBiMSwgMHgwMDFlLCAweDAwMDAsIDB4OTA4NSwgMHgwMDAxLCAweDAwNDgsIDB4MjA3MSwgMHgxODAwLAorCTB4NzA5MywgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweDBmZjksIDB4OTAwNiwgMHgwMTJlLAorCTB4MDFkZSwgMHgwMWNlLCAweDAwZWUsIDB4MDA4ZSwgMHgwMDllLCAweDAwMWUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHg5MThjLCAweGZmZmYsIDB4MTFhOCwgMHgwODBjLAorCTB4MjFlMywgMHgyMDk5LCAweDAyNmMsIDB4MjAwMSwgMHgwMDE0LCAweDM1MTgsIDB4OTMxMiwgMHgxMjE4LAorCTB4MjNhOCwgMHg0MDAzLCAweDAwZjgsIDB4MjBhOCwgMHg0MDAzLCAweDIyYTgsIDB4ODEwOCwgMHgwODBjLAorCTB4MjFlMywgMHgyMDk5LCAweDAyNjAsIDB4MGNhOCwgMHgwODBjLCAweDIxZTMsIDB4MjA2MSwgMHgxOTlmLAorCTB4NjAwNCwgMHgyMDk4LCAweDYwMDgsIDB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLAorCTB4MDA0OCwgMHgyMGE4LCAweDQwMDMsIDB4MjJhOCwgMHg4MTA4LCAweDA4MGMsIDB4MjFlMywgMHgyMDk5LAorCTB4MDI2MCwgMHgwY2E4LCAweDIwNjEsIDB4MTk5ZiwgMHgyMDE5LCAweDAyODAsIDB4MzMwMCwgMHg5MzFlLAorCTB4MDExMCwgMHg2MDA2LCAweDAwMjAsIDB4MjAwMSwgMHgwMjYwLCAweDYwMDYsIDB4ODEwOCwgMHgyMTYyLAorCTB4OTI5MiwgMHgwMDIxLCAweDkyOTYsIDB4ZmZmZiwgMHg2MjBhLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LAorCTB4ODFmZiwgMHgxMWI4LCAweDA4MGMsIDB4MjFmYiwgMHgyMGExLCAweDAyNGMsIDB4MjAwMSwgMHgwMDE0LAorCTB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDA0MTgsIDB4MjBhOCwgMHg0MDAzLAorCTB4ODJmZiwgMHgwMWY4LCAweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIxZmIsIDB4MjBhMSwgMHgwMjQwLAorCTB4MGM5OCwgMHgwODBjLCAweDIxZmIsIDB4MjA2MSwgMHgxOWEyLCAweDYwMDQsIDB4MjBhMCwgMHg2MDA4LAorCTB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLCAweDAwNTgsIDB4MjBhOCwgMHg0MDAzLAorCTB4ODJmZiwgMHgwMTM4LCAweDIyYTgsIDB4ODEwOCwgMHgwODBjLCAweDIxZmIsIDB4MjBhMSwgMHgwMjQwLAorCTB4MGM5OCwgMHgyMDYxLCAweDE5YTIsIDB4MjAxOSwgMHgwMjYwLCAweDM0MDAsIDB4OTMxZSwgMHgwMTEwLAorCTB4NjAwNiwgMHgwMDIwLCAweDIwMDEsIDB4MDI0MCwgMHg2MDA2LCAweDgxMDgsIDB4MjE2MiwgMHg5MjkyLAorCTB4MDAyMSwgMHg5Mjk2LCAweGZmZmYsIDB4NjIwYSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDA1LCAweDAwYjYsIDB4MDA2NiwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHg5NmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwMTcwLCAweDk2ODYsIDB4MDAwNCwgMHgwMTU4LAorCTB4YmUwNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwgMHgwMDA2LCAweDAxMjgsIDB4OTY4NiwgMHgwMDA0LAorCTB4MDExMCwgMHg5MDg1LCAweDAwMDEsIDB4MDA2ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLAorCTB4ZDgxMCwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweGQ4MWQsIDB4MTUyMCwgMHg2ODBjLAorCTB4OTA4YywgMHhmZjAwLCAweDY4MjAsIDB4OTA4NCwgMHgwMGZmLCAweDkxMTUsIDB4NjIxNiwgMHg2ODI0LAorCTB4NjAyZSwgMHhkMWU0LCAweDAxMzAsIDB4OTAwNiwgMHgwODBjLCAweGU4MGMsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDA3OCwgMHhkMWVjLCAweDAxODAsIDB4NjkyMCwgMHg5MThjLCAweDAwZmYsIDB4NjgyNCwgMHgwODBjLAorCTB4MjY2MSwgMHgxMTQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweGU4MGMsIDB4MjExMCwgMHg5MDBlLAorCTB4MDgwYywgMHgzMjhmLCAweDAwMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDgwYywgMHhhZDIwLCAweDA1OTgsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDBjNiwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjYxLAorCTB4MTU2OCwgMHgwODBjLCAweDY2MzIsIDB4MTU1MCwgMHhiZTEyLCAweGJkMTYsIDB4MDBjZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHhlNjNmLCAweDExYzgsIDB4MDgwYywgMHgzMzc3LAorCTB4MTFiMCwgMHgwODBjLCAweGQ3N2EsIDB4MDUwMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NWUzLAorCTB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjYwZiwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDkyYjcsIDB4MDAxMCwgMHgwODBjLAorCTB4YWNiMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHhhY2IwLAorCTB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MGNhOCwgMHgwODBjLCAweGFjYjAsIDB4OTAwNiwgMHgwYzk4LAorCTB4MjA2OSwgMHgwMjZkLCAweDY4MDAsIDB4OTA4MiwgMHgwMDEwLCAweDEyMjgsIDB4NjAxNywgMHgwMDAwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMDA1LCAweDYwMTcsIDB4MDAwMCwgMHgyMDY5LAorCTB4MDI2YywgMHg2ODA4LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDA4MDAsIDB4MTE5MCwgMHg2OTA0LAorCTB4OTE4NiwgMHgwMDE4LCAweDAxMTgsIDB4OTE4NiwgMHgwMDE0LCAweDExNTgsIDB4ODEwZiwgMHg2ODAwLAorCTB4OTA4NCwgMHgwMGZmLCAweDkxMGQsIDB4NjE2MiwgMHg5MDhlLCAweDAwMTQsIDB4MDExMCwgMHg5MDhlLAorCTB4MDAxMCwgMHgwMDA1LCAweDYwMDQsIDB4OTBiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGQ3ZCwgMHg5MWI2LAorCTB4MDAxMywgMHgxMTMwLCAweDIwMDgsIDB4OTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4ZDk1ZiwgMHgwMDkyLAorCTB4OTFiNiwgMHgwMDI3LCAweDAxMjAsIDB4OTFiNiwgMHgwMDE0LCAweDE5MGMsIDB4MGQ3ZCwgMHgyMDAxLAorCTB4MDAwNywgMHgwODBjLCAweDY2MGYsIDB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4YWNlYiwgMHgwODBjLAorCTB4OTczOCwgMHgwMDA1LCAweGQ4OWEsIDB4ZDg5YywgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODljLAorCTB4ZDhhOSwgMHhkOTVjLCAweGQ4ZjksIDB4ZDk1YywgMHhkOTBkLCAweGQ5NWMsIDB4ZDhhOSwgMHhkOTVjLAorCTB4ZDk1NCwgMHhkOTVjLCAweGQ5NTQsIDB4ZDk1YywgMHhkOTVjLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLAorCTB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLAorCTB4ZDg5YywgMHhkODlhLCAweGQ5NWMsIDB4ZDg5YSwgMHhkODlhLCAweGQ5NWMsIDB4ZDg5YSwgMHhkOTU5LAorCTB4ZDk1YywgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLCAweGQ5NWMsIDB4ZDk1YywgMHhkODlhLAorCTB4ZDk1YywgMHhkOTVjLCAweGQ4OWEsIDB4ZDhhNCwgMHhkODlhLCAweGQ4OWEsIDB4ZDg5YSwgMHhkODlhLAorCTB4ZDk1OCwgMHhkOTVjLCAweGQ4OWEsIDB4ZDg5YSwgMHhkOTVjLCAweGQ5NWMsIDB4ZDg5YSwgMHhkODlhLAorCTB4ZDg5YSwgMHhkODlhLCAweDA4MGMsIDB4MGQ3ZCwgMHgwODBjLCAweGQwYjMsIDB4NjAwMywgMHgwMDAyLAorCTB4MDgwYywgMHg5NzM4LCAweDA4MDQsIDB4ZDk1ZSwgMHg5MDA2LCAweDA4MGMsIDB4NjVjZiwgMHgwODA0LAorCTB4ZDk1YywgMHgwODBjLCAweDZhZDUsIDB4MTkwNCwgMHhkOTVjLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLAorCTB4NjAxMCwgMHgyMDU4LCAweGI4MTAsIDB4OTA4NiwgMHgwMGZmLCAweDExNDAsIDB4MDBmNiwgMHgyMDc5LAorCTB4MTgwMCwgMHg3OGE4LCAweDgwMDAsIDB4NzhhYSwgMHgwMGZlLCAweDA0MjgsIDB4NjAxMCwgMHgyMDU4LAorCTB4Yjg4NCwgMHg5MDA1LCAweDExNzgsIDB4MDgwYywgMHhkMDliLCAweDE5MDQsIDB4ZDk1YywgMHgwMDM2LAorCTB4MDA0NiwgMHhiYmEwLCAweDIwMjEsIDB4MDAwNywgMHgwODBjLCAweDRkMDksIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDgwNCwgMHhkOTVjLCAweDA4MGMsIDB4MzNhOCwgMHgxOTA0LCAweGQ5NWMsIDB4MjAwMSwgMHgxODAwLAorCTB4MjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MTEzOCwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3OGE4LAorCTB4ODAwMCwgMHg3OGFhLCAweDAwZmUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlMywgMHg2MDIzLAorCTB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLAorCTB4OTczOCwgMHg2MTEwLCAweDIxNTgsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4ODZkNiwgMHgwODA0LAorCTB4ZDk1ZSwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LAorCTB4MDAwNiwgMHgwOTA0LCAweGQ5NWMsIDB4OTY4NiwgMHgwMDA0LCAweDA5MDQsIDB4ZDk1YywgMHgwODBjLAorCTB4OGY1MiwgMHgyMDAxLCAweDAwMDQsIDB4MDgwNCwgMHhkOTVhLCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LAorCTB4OTA4NiwgMHgwMDAzLCAweDExNTgsIDB4MDAzNiwgMHgwMDQ2LCAweDYwMTAsIDB4MjA1OCwgMHhiYmEwLAorCTB4MjAyMSwgMHgwMDA2LCAweDA4MGMsIDB4NGQwOSwgMHgwMDRlLCAweDAwM2UsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDgwYywgMHhkOTc4LCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDAwNjYsIDB4OTZiNCwgMHhmZjAwLAorCTB4ODYzNywgMHg5Njg2LCAweDAwMDYsIDB4MDA2ZSwgMHgwMTY4LCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLAorCTB4NjYwZiwgMHg5Mjg0LCAweDAwZmYsIDB4OTA4ZSwgMHgwMDA3LCAweDExMjAsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDgwYywgMHg2NWUzLCAweDA4MGMsIDB4NmFkNSwgMHgxMWY4LCAweDIwMDEsIDB4MTgzNywgMHgyMDA0LAorCTB4ZDBhNCwgMHgwMWQwLCAweGJlMDQsIDB4OTZiNCwgMHgwMGZmLCAweDk2ODYsIDB4MDAwNiwgMHgwMWEwLAorCTB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzhhOCwgMHg4MDAwLCAweDc4YWEsIDB4MDBmZSwgMHgwODA0LAorCTB4ZDhlMywgMHgyMDAxLCAweDAwMDQsIDB4MDAzMCwgMHgyMDAxLCAweDAwMDYsIDB4MDQwOSwgMHgwMDIwLAorCTB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NjYwZiwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgyNjAwLAorCTB4MDAwMiwgMHhkOTczLCAweGQ5NzMsIDB4ZDk3MywgMHhkOTczLCAweGQ5NzMsIDB4ZDk3NSwgMHhkOTczLAorCTB4ZDk3NSwgMHhkOTczLCAweGQ5NzMsIDB4ZDk3NSwgMHhkOTczLCAweGQ5NzMsIDB4ZDk3MywgMHhkOTc1LAorCTB4ZDk3NSwgMHhkOTc1LCAweGQ5NzUsIDB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGI2LCAweDAwZDYsIDB4NjExMCwgMHgyMTU4LCAweGI5MDAsIDB4ZDE4NCwgMHgwMTM4LAorCTB4MDgwYywgMHg2NWUzLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLCAweDA4MGMsIDB4MzI2ZiwgMHgwMGRlLAorCTB4MDBiZSwgMHgwMDFlLCAweDAwMDUsIDB4NjYxMCwgMHgyNjU4LCAweGI4MDQsIDB4OTA4NCwgMHhmZjAwLAorCTB4ODAwNywgMHg5MGIyLCAweDAwMGMsIDB4MWEwYywgMHgwZDdkLCAweDkxYjYsIDB4MDAxNSwgMHgxMTEwLAorCTB4MDAzYiwgMHgwMDI4LCAweDkxYjYsIDB4MDAxNiwgMHgxOTBjLCAweDBkN2QsIDB4MDA2YiwgMHgwMDA1LAorCTB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywgMHhkYTBkLCAweGI3N2MsIDB4ZDlmNywgMHhkOWI4LAorCTB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywgMHhiNzdjLAorCTB4ZGEwZCwgMHhiNzdjLCAweGQ5ZjcsIDB4ZDlmZSwgMHhiNzdjLCAweGI3N2MsIDB4Yjc3YywgMHhiNzdjLAorCTB4MDBmNiwgMHgwODBjLCAweDZhZDUsIDB4MTFkOCwgMHgwODBjLCAweGQwOWIsIDB4MTFjMCwgMHg2MDEwLAorCTB4OTA1ZCwgMHgwMWE4LCAweGI4ODQsIDB4OTAwNSwgMHgwMTkwLCAweDkwMDYsIDB4MDgwYywgMHg2NWNmLAorCTB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjVlMywgMHg2MDIzLCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLCAweDk3MzgsIDB4MDBmMCwgMHgyMDExLAorCTB4MDI2MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI2NjEsIDB4MTFiMCwgMHgwODBjLAorCTB4NjY5MywgMHgwMTE4LCAweDA4MGMsIDB4YWNiMCwgMHgwMDgwLCAweGI4MTAsIDB4MDAwNiwgMHhiODE0LAorCTB4MDAwNiwgMHhiODg0LCAweDAwMDYsIDB4MDgwYywgMHg2MGFjLCAweDAwMGUsIDB4Yjg4NiwgMHgwMDBlLAorCTB4YjgxNiwgMHgwMDBlLCAweGI4MTIsIDB4MDgwYywgMHhhY2IwLCAweDAwZmUsIDB4MDAwNSwgMHg2NjA0LAorCTB4OTZiNiwgMHgwMDFlLCAweDExMTAsIDB4MDgwYywgMHhhY2IwLCAweDAwMDUsIDB4MDgwYywgMHhiYjA3LAorCTB4MTE0OCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4OTJiNywgMHgwODBjLAorCTB4OTczOCwgMHgwMDEwLCAweDA4MGMsIDB4YWNiMCwgMHgwMDA1LCAweDA4MDQsIDB4YWNiMCwgMHg2MDA0LAorCTB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGQ3ZCwgMHgwODBjLCAweDk2N2EsIDB4MDgwYywgMHhhY2ViLAorCTB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLAorCTB4ZGEzMiwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLAorCTB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLCAweGRhMzAsIDB4ZGEzMCwgMHhkYTMwLAorCTB4MDgwYywgMHgwZDdkLCAweDAwOTYsIDB4MDBiNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMDQ2LAorCTB4MDAyNiwgMHg2MjEwLCAweDIyNTgsIDB4YjhiYywgMHg5MDA1LCAweDExYjAsIDB4NjAwNywgMHgwMDQ0LAorCTB4MjA3MSwgMHgwMjYwLCAweDc0NDQsIDB4OTRhNCwgMHhmZjAwLCAweDA5MDQsIDB4ZGE5OSwgMHgwODBjLAorCTB4ZTgwMCwgMHgxMTcwLCAweDk0ODYsIDB4MjAwMCwgMHgxMTU4LCAweDIwMDksIDB4MDAwMSwgMHgyMDExLAorCTB4MDIwMCwgMHgwODBjLCAweDg5NzksIDB4MDAyMCwgMHg5MDI2LCAweDA4MGMsIDB4ZTY4NCwgMHgwYzMwLAorCTB4MDgwYywgMHgxMDQ3LCAweDA5MGMsIDB4MGQ3ZCwgMHg2MDAzLCAweDAwMDcsIDB4YTg2NywgMHgwMTBkLAorCTB4OTAwNiwgMHhhODAyLCAweGE4NmEsIDB4YWM4YSwgMHgyYzAwLCAweGE4OGUsIDB4NjAwOCwgMHhhOGUyLAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4NzEzMCwgMHhhOTdhLCAweDAwMTYsIDB4YTg3NiwgMHhhODdmLAorCTB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg4NywgMHgwMDM2LCAweDA4MGMsIDB4NmRlZSwgMHgwMDFlLAorCTB4MDgwYywgMHhlODAwLCAweDE5MDQsIDB4ZGFmOSwgMHg5NDg2LCAweDIwMDAsIDB4MTEzMCwgMHgyMDE5LAorCTB4MDAxNywgMHgwODBjLCAweGUzYjUsIDB4MDgwNCwgMHhkYWY5LCAweDk0ODYsIDB4MDIwMCwgMHgxMTIwLAorCTB4MDgwYywgMHhlMzQ1LCAweDA4MDQsIDB4ZGFmOSwgMHg5NDg2LCAweDA0MDAsIDB4MDEyMCwgMHg5NDg2LAorCTB4MTAwMCwgMHgxOTA0LCAweGRhZjksIDB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4ZTM2NCwgMHgwODA0LAorCTB4ZGFmOSwgMHgyMDY5LCAweDFhNmUsIDB4NmEwMCwgMHhkMjg0LCAweDA5MDQsIDB4ZGI2MywgMHg5Mjg0LAorCTB4MDMwMCwgMHgxOTA0LCAweGRiNWMsIDB4NjgwNCwgMHg5MDA1LCAweDA5MDQsIDB4ZGI0NCwgMHgyZDc4LAorCTB4NjAwMywgMHgwMDA3LCAweDA4MGMsIDB4MTA2MCwgMHgwOTA0LCAweGRiMDUsIDB4NzgwMCwgMHhkMDhjLAorCTB4MTExOCwgMHg3ODA0LCAweDgwMDEsIDB4NzgwNiwgMHg2MDE3LCAweDAwMDAsIDB4MjAwMSwgMHgxODBmLAorCTB4MjAwNCwgMHhkMDg0LCAweDE5MDQsIDB4ZGI2NywgMHg5MDA2LCAweGE4MDIsIDB4YTg2NywgMHgwMTE2LAorCTB4YTg2YSwgMHg2MDA4LCAweGE4ZTIsIDB4MmMwMCwgMHhhODdhLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLAorCTB4NzEzMCwgMHhhOWI2LCAweGE4NzYsIDB4YjkyOCwgMHhhOWJhLCAweGI5MmMsIDB4YTliZSwgMHhiOTMwLAorCTB4YTljMiwgMHhiOTM0LCAweGE5YzYsIDB4YTg4MywgMHgwMDNkLCAweDcwNDQsIDB4OTA4NCwgMHgwMDAzLAorCTB4OTA4MCwgMHhkYjAxLCAweDIwMDUsIDB4YTg3ZSwgMHgyMGE5LCAweDAwMGEsIDB4MjAwMSwgMHgwMjcwLAorCTB4YWE1YywgMHg5MjkwLCAweDAwMjEsIDB4MjAwOSwgMHgwMjA1LCAweDIwMGIsIDB4MDA4MCwgMHgyMGUxLAorCTB4MDAwMCwgMHhhYjYwLCAweDIzZTgsIDB4MjA5OCwgMHgyMmEwLCAweDQwMDMsIDB4MjAwYiwgMHgwMDAwLAorCTB4MjAwMSwgMHgwMjdhLCAweDIwMGMsIDB4YTliMiwgMHg4MDAwLCAweDIwMGMsIDB4YTlhZSwgMHgwODBjLAorCTB4NmRmMSwgMHgwMDJlLCAweDAwNGUsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBiZSwgMHgwMDllLAorCTB4MDAwNSwgMHgwMDAwLCAweDAwODAsIDB4MDA0MCwgMHgwMDAwLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4ZDA4NCwgMHgwMTIwLCAweDA4MGMsIDB4MTA0NywgMHgxOTA0LCAweGRhYWUsIDB4NjAxNywgMHhmMTAwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgyMDA5LCAweGEwMjIsIDB4MDgwYywgMHg5MmIwLAorCTB4MGMwMCwgMHgyMDY5LCAweDAyNjAsIDB4Njg0OCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgxMjAwLAorCTB4MTE5OCwgMHg2ODZjLCAweDkwODQsIDB4MDBmZiwgMHgwMDE2LCAweDYxMTQsIDB4OTE4YywgMHhmNzAwLAorCTB4OTEwZCwgMHg2MTE2LCAweDAwMWUsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA0MywgMHgyMDA5LAorCTB4YTAyNSwgMHgwODBjLCAweDkyYjAsIDB4MDgyOCwgMHg2ODY4LCAweDYwMmUsIDB4Njg2YywgMHg2MDMyLAorCTB4NjAxNywgMHhmMjAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MjAwOSwgMHhhMDIyLAorCTB4MDgwYywgMHg5MmIwLCAweDA4MDQsIDB4ZGFmOSwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGVjLAorCTB4MDEyMCwgMHgyMDExLCAweDgwNDksIDB4MDgwYywgMHg0YjUyLCAweDYwMTcsIDB4ZjMwMCwgMHgwMDEwLAorCTB4NjAxNywgMHhmMTAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MjAwOSwgMHhhMDIyLAorCTB4MDgwYywgMHg5MmIwLCAweDA4MDQsIDB4ZGFmOSwgMHg2MDE3LCAweGY1MDAsIDB4MGM5OCwgMHg2MDE3LAorCTB4ZjYwMCwgMHgwODA0LCAweGRiMTksIDB4NjAxNywgMHhmMjAwLCAweDA4MDQsIDB4ZGIxOSwgMHhhODY3LAorCTB4MDE0NiwgMHhhODZiLCAweDAwMDAsIDB4NjAwOCwgMHhhODg2LCAweDJjMDAsIDB4YTg3YSwgMHg3MDQ0LAorCTB4OTA4NCwgMHgwMDAzLCAweDkwODAsIDB4ZGIwMSwgMHgyMDA1LCAweGE4N2UsIDB4MjkyOCwgMHg2MDEwLAorCTB4MjA1OCwgMHhiOGEwLCAweGE4NzYsIDB4YjgyOCwgMHhhODhhLCAweGI4MmMsIDB4YTg4ZSwgMHhiODMwLAorCTB4YTg5MiwgMHhiODM0LCAweGE4OTYsIDB4YTg4MywgMHgwMDNkLCAweDIwMDksIDB4MDIwNSwgMHgyMTA0LAorCTB4OTA4NSwgMHgwMDgwLCAweDIwMGEsIDB4MjBlMSwgMHgwMDAwLCAweDIwMTEsIDB4MDIxMCwgMHgyMjE0LAorCTB4OTI5NCwgMHgwZmZmLCAweGFhYTIsIDB4OTI4MiwgMHgwMTExLCAweDFhMGMsIDB4MGQ3ZCwgMHg4MjEwLAorCTB4ODIxYywgMHgyMDAxLCAweDAyNmMsIDB4MjA5OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAyOSwgMHgyMGEwLCAweDIwMTEsIDB4ZGJlMywgMHgyMDQxLCAweDAwMDEsIDB4MjIzZCwgMHg5Nzg0LAorCTB4MDBmZiwgMHg5MzIyLCAweDEyMDgsIDB4MjMwMCwgMHgyMGE4LCAweDQwMDMsIDB4OTMxYSwgMHgwNTMwLAorCTB4ODIxMCwgMHhkN2ZjLCAweDExMzAsIDB4OGQ2OCwgMHgyZDBhLCAweDIwMDEsIDB4MDI2MCwgMHgyMDk4LAorCTB4MGM2OCwgMHgyOTUwLCAweDA4MGMsIDB4MTA2MCwgMHgwMTcwLCAweDI5MDAsIDB4YjAwMiwgMHhhODY3LAorCTB4MDE0NywgMHhhODZiLCAweDAwMDAsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLAorCTB4MjBhMCwgMHg4ODQwLCAweDA4ZDgsIDB4MjU0OCwgMHhhODAwLCAweDkwMmQsIDB4MDExOCwgMHgwODBjLAorCTB4MTA3OSwgMHgwY2M4LCAweDA4MGMsIDB4MTA3OSwgMHgwODA0LCAweGRiMDUsIDB4MjU0OCwgMHg4ODQ3LAorCTB4OTg4NSwgMHgwMDQ2LCAweGE4NjYsIDB4MjAwOSwgMHgwMjA1LCAweDIwMGIsIDB4MDAwMCwgMHgwODBjLAorCTB4ZTNlOCwgMHgwODA0LCAweGRhZjksIDB4ODAxMCwgMHgwMDA0LCAweDgwMWEsIDB4MDAwNiwgMHg4MDE4LAorCTB4MDAwOCwgMHg4MDE2LCAweDAwMGEsIDB4ODAxNCwgMHg5MTg2LCAweDAwMTMsIDB4MTE2MCwgMHg2MDA0LAorCTB4OTA4YSwgMHgwMDU3LCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLCAweDAwNDAsIDB4MGEwYywgMHgwZDdkLAorCTB4MjAwOCwgMHgwODA0LCAweGRjNmYsIDB4OTE4NiwgMHgwMDUxLCAweDAxMDgsIDB4MDA0MCwgMHgwODBjLAorCTB4YWIzMywgMHgwMWU4LCAweDkwODYsIDB4MDAwMiwgMHgwOTA0LCAweGRjYjcsIDB4MDBjMCwgMHg5MTg2LAorCTB4MDAyNywgMHgwMTgwLCAweDkxODYsIDB4MDA0OCwgMHgwMTI4LCAweDkxODYsIDB4MDAxNCwgMHgwMTUwLAorCTB4MTkwYywgMHgwZDdkLCAweDA4MGMsIDB4YWIzMywgMHgwMTUwLCAweDkwODYsIDB4MDAwNCwgMHgwOTA0LAorCTB4ZGQ1NiwgMHgwMDI4LCAweDYwMDQsIDB4OTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDAxYSwgMHgwODBjLAorCTB4YWQ2YSwgMHgwMDA1LCAweGRjMzYsIDB4ZGMzOCwgMHhkYzM4LCAweGRjNWYsIDB4ZGMzNiwgMHhkYzM2LAorCTB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LAorCTB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4ZGMzNiwgMHhkYzM2LCAweGRjMzYsIDB4MDgwYywgMHgwZDdkLAorCTB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4OTczOCwgMHgwMDM2LCAweDAwOTYsIDB4NjAxNCwgMHg5MDRkLAorCTB4MDFkOCwgMHgwODBjLCAweGM5N2EsIDB4MDFjMCwgMHg2MDAzLCAweDAwMDIsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxMTc4LCAweDIwMTksIDB4MDAwNCwgMHgwODBjLAorCTB4ZTNlOCwgMHg2MDE3LCAweDAwMDAsIDB4NjAxOCwgMHg5MDA1LCAweDExMjAsIDB4MjAwMSwgMHgxOTg2LAorCTB4MjAwNCwgMHg2MDFhLCAweDYwMDMsIDB4MDAwNywgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwgMHgwMDk2LAorCTB4MDgwYywgMHg5NjdhLCAweDA4MGMsIDB4OTczOCwgMHgwODBjLCAweGM5N2EsIDB4MDEyMCwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweDEwNzksIDB4MDgwYywgMHhhY2ViLCAweDAwOWUsIDB4MDAwNSwgMHgwMDAyLAorCTB4ZGM4NCwgMHhkYzk5LCAweGRjODYsIDB4ZGNhZSwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwgMHhkYzg0LAorCTB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwgMHhkYzg0LAorCTB4ZGM4NCwgMHhkYzg0LCAweGRjODQsIDB4ZGM4NCwgMHgwODBjLCAweDBkN2QsIDB4MDA5NiwgMHg2MDE0LAorCTB4MjA0OCwgMHhhODdjLCAweGQwYjQsIDB4MDEzOCwgMHg2MDAzLCAweDAwMDcsIDB4MjAwOSwgMHgwMDQzLAorCTB4MDgwYywgMHhhZDRkLCAweDAwMTAsIDB4NjAwMywgMHgwMDA0LCAweDA4MGMsIDB4OTczOCwgMHgwMDllLAorCTB4MDAwNSwgMHgwODBjLCAweGM5N2EsIDB4MDEzOCwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwgMHhhOTdjLAorCTB4MDA5ZSwgMHhkMWVjLCAweDExMzgsIDB4MDgwYywgMHg4OTRlLCAweDA4MGMsIDB4YWNiMCwgMHgwODBjLAorCTB4OTczOCwgMHgwMDA1LCAweDA4MGMsIDB4ZTY0OCwgMHgwZGIwLCAweDBjYzgsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDQxLCAweDIwMDksIDB4YTAyMiwgMHgwODBjLCAweDkyYjAsIDB4MDAwNSwgMHg5MTgyLAorCTB4MDA0MCwgMHgwMDAyLCAweGRjY2UsIDB4ZGNkMCwgMHhkY2NlLCAweGRjY2UsIDB4ZGNjZSwgMHhkY2NlLAorCTB4ZGNjZSwgMHhkY2NlLCAweGRjY2UsIDB4ZGNjZSwgMHhkY2NlLCAweGRjY2UsIDB4ZGNjZSwgMHhkY2NlLAorCTB4ZGNjZSwgMHhkY2NlLCAweGRjY2UsIDB4ZGNkMSwgMHhkY2NlLCAweGRjY2UsIDB4MDgwYywgMHgwZDdkLAorCTB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4ODk0ZSwgMHgwMGRlLCAweDA4MGMsIDB4ZTZhMCwgMHgwODBjLAorCTB4YWNiMCwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwgMHgwMDAyLCAweGRjZjEsIDB4ZGNmMSwgMHhkY2YxLAorCTB4ZGNmMSwgMHhkY2YxLCAweGRjZjEsIDB4ZGNmMSwgMHhkY2YxLCAweGRjZjEsIDB4ZGNmMywgMHhkZDFlLAorCTB4ZGNmMSwgMHhkY2YxLCAweGRjZjEsIDB4ZGNmMSwgMHhkZDFlLCAweGRjZjEsIDB4ZGNmMSwgMHhkY2YxLAorCTB4ZGNmMSwgMHgwODBjLCAweDBkN2QsIDB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLAorCTB4MDE2OCwgMHg5MDhjLCAweDAwMDMsIDB4OTE4ZSwgMHgwMDAyLCAweDAxODAsIDB4NjE0NCwgMHhkMWU0LAorCTB4MTE2OCwgMHgyMDA5LCAweDAwNDEsIDB4MDA5ZSwgMHgwODA0LCAweGRkZGUsIDB4NjAwMywgMHgwMDA3LAorCTB4NjAxYiwgMHgwMDAwLCAweDA4MGMsIDB4ODk0ZSwgMHgwMDllLCAweDAwMDUsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTk3YywgMHhkMWVjLCAweDExMzAsIDB4MDgwYywgMHg4OTRlLCAweDA4MGMsIDB4YWNiMCwgMHgwMDllLAorCTB4MDAwNSwgMHgwODBjLCAweGU2NDgsIDB4MGRiOCwgMHgwMDllLCAweDAwMDUsIDB4MjAwMSwgMHgxODBjLAorCTB4MjAwYywgMHhjMWQ0LCAweDIxMDIsIDB4MDAzNiwgMHgwODBjLCAweDk2ZDUsIDB4MDgwYywgMHg5NzM4LAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLAorCTB4ZDBiYywgMHgwMTg4LCAweGE4N2MsIDB4OTA4NCwgMHgwMDAzLCAweDkwODYsIDB4MDAwMiwgMHgwMTQwLAorCTB4YThhYywgMHg2MzMwLCAweDkzMWEsIDB4NjMzMiwgMHhhOGIwLCAweDYzMmMsIDB4OTMxYiwgMHg2MzJlLAorCTB4NjAwMywgMHgwMDAyLCAweDAwODAsIDB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZTNlOCwgMHg2MDE4LAorCTB4OTAwNSwgMHgxMTI4LCAweDIwMDEsIDB4MTk4NiwgMHgyMDA0LCAweDgwMDMsIDB4NjAxYSwgMHg2MDE3LAorCTB4MDAwMCwgMHg2MDAzLCAweDAwMDcsIDB4MDA5ZSwgMHgwMDNlLCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLAorCTB4MDAwMiwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLAorCTB4ZGQ2ZCwgMHhkZDZmLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZDZkLAorCTB4ZGQ2ZCwgMHhkZDZkLCAweGRkNmQsIDB4ZGQ2ZCwgMHhkZGJhLCAweDA4MGMsIDB4MGQ3ZCwgMHg2MDE0LAorCTB4MDA5NiwgMHgyMDQ4LCAweGE4MzQsIDB4YWEzOCwgMHg2MTEwLCAweDAwYjYsIDB4MjE1OCwgMHhiOTAwLAorCTB4MDBiZSwgMHhkMWJjLCAweDExOTAsIDB4OTIwZCwgMHgxNTE4LCAweGE4N2MsIDB4ZDBmYywgMHgwMTI4LAorCTB4MjAwOSwgMHgwMDQxLCAweDAwOWUsIDB4MDgwNCwgMHhkZGRlLCAweDYwMDMsIDB4MDAwNywgMHg2MDFiLAorCTB4MDAwMCwgMHgwODBjLCAweDg5NGUsIDB4MDA5ZSwgMHgwMDA1LCAweDYxMjQsIDB4ZDFmNCwgMHgxZDU4LAorCTB4MDAwNiwgMHgwMDQ2LCAweGFjYWMsIDB4OTQyMiwgMHhhOWIwLCAweDIyMDAsIDB4OTEwYiwgMHg2MDMwLAorCTB4OTQyMCwgMHg2NDMyLCAweDYwMmMsIDB4OTEwOSwgMHg2MTJlLCAweDAwNGUsIDB4MDAwZSwgMHgwOGQ4LAorCTB4NjExMCwgMHgwMGI2LCAweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYmMsIDB4MTE3OCwgMHgyMDA5LAorCTB4MTgwZSwgMHgyMTBjLCAweGQxOWMsIDB4MDExOCwgMHg2MDAzLCAweDAwMDcsIDB4MDAxMCwgMHg2MDAzLAorCTB4MDAwNiwgMHgwMGU5LCAweDA4MGMsIDB4ODk1MCwgMHgwMDllLCAweDAwMDUsIDB4NjAwMywgMHgwMDAyLAorCTB4MDA5ZSwgMHgwMDA1LCAweDYwMjQsIDB4ZDBmNCwgMHgwMTI4LCAweDA4MGMsIDB4MTY5NywgMHgxOTA0LAorCTB4ZGQ2ZiwgMHgwMDA1LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LCAweGE4MzQsIDB4YTkzOCwgMHgwMDllLAorCTB4OTEwNSwgMHgxMTIwLCAweDA4MGMsIDB4MTY5NywgMHgxOTA0LCAweGRkNmYsIDB4MDAwNSwgMHhkMmZjLAorCTB4MDE0MCwgMHg4MDAyLCAweDgwMDAsIDB4ODIxMiwgMHg5MjkxLCAweDAwMDAsIDB4MjAwOSwgMHgwMDA5LAorCTB4MDAxMCwgMHgyMDA5LCAweDAwMTUsIDB4YWE5YSwgMHhhODk2LCAweDAwMDUsIDB4OTE4MiwgMHgwMDQwLAorCTB4MDIwOCwgMHgwMDYyLCAweDkxODYsIDB4MDAxMywgMHgwMTIwLCAweDkxODYsIDB4MDAxNCwgMHgxOTBjLAorCTB4MGQ3ZCwgMHg2MDI0LCAweGQwZGMsIDB4MDkwYywgMHgwZDdkLCAweDAwMDUsIDB4ZGUwMiwgMHhkZTBlLAorCTB4ZGUxYSwgMHhkZTI2LCAweGRlMDIsIDB4ZGUwMiwgMHhkZTAyLCAweGRlMDIsIDB4ZGUwOSwgMHhkZTA0LAorCTB4ZGUwNCwgMHhkZTAyLCAweGRlMDIsIDB4ZGUwMiwgMHhkZTAyLCAweGRlMDQsIDB4ZGUwMiwgMHhkZTA0LAorCTB4ZGUwMiwgMHhkZTA5LCAweDA4MGMsIDB4MGQ3ZCwgMHg2MDI0LCAweGQwZGMsIDB4MDkwYywgMHgwZDdkLAorCTB4MDAwNSwgMHg2MDE0LCAweDkwMDUsIDB4MTkwYywgMHgwZDdkLCAweDAwMDUsIDB4NjAwMywgMHgwMDAxLAorCTB4NjEwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LCAweGEwMjIsIDB4MDgwYywgMHg5MjkyLAorCTB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwNCwgMHg2MTA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAwOSwgMHhhMDAxLCAweDA4MGMsIDB4OTJiMCwgMHgwMTJlLCAweDAwMDUsIDB4NjAwMywgMHgwMDAzLAorCTB4NjEwNiwgMHgwODBjLCAweDFjNTksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAxNCwgMHgwMDk2LAorCTB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDE4OCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwgMHgwMDAyLAorCTB4MDFhMCwgMHg2MDI0LCAweGQwY2MsIDB4MTE0OCwgMHhkMGM0LCAweDExMzgsIDB4YThhOCwgMHg5MDA1LAorCTB4MTEyMCwgMHg2MTQ0LCAweDkxOGQsIDB4YjAzNSwgMHgwMDE4LCAweDYxNDQsIDB4OTE4ZCwgMHhhMDM1LAorCTB4MDA5ZSwgMHgwODBjLCAweDkyZjcsIDB4MDEyZSwgMHgwMDA1LCAweDYxNDQsIDB4OTE4ZCwgMHhhMDMyLAorCTB4MGNiOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDM2LCAweDAwOTYsIDB4OTE4MiwgMHgwMDQwLAorCTB4MDAyMywgMHgwMDllLCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LCAweGRlNzEsIDB4ZGU3MywgMHhkZTg4LAorCTB4ZGVhMiwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLAorCTB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLCAweGRlNzEsIDB4ZGU3MSwgMHhkZTcxLAorCTB4ZGU3MSwgMHgwODBjLCAweDBkN2QsIDB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwNTEwLAorCTB4OTA5YywgMHgwMDAzLCAweDkzOWUsIDB4MDAwMywgMHgwMWU4LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHhhMDIyLCAweDA4MGMsIDB4OTJiMCwgMHgwNDcwLAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBmYywgMHgwMTY4LCAweDkwOWMsIDB4MDAwMywgMHg5MzllLAorCTB4MDAwMywgMHgwMTQwLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDIwMDksIDB4YTAwMSwgMHgwODBjLAorCTB4OTJiMCwgMHgwMGUwLCAweDkwMWUsIDB4NjMxNiwgMHg2MzFhLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLAorCTB4ZTNlOCwgMHgwMGEwLCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MGQ5OCwgMHg5MDljLAorCTB4MDAwMywgMHg5MzllLCAweDAwMDMsIDB4MGQ3MCwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgwODBjLAorCTB4MWM1OSwgMHg2MTQ0LCAweDkxOGQsIDB4YTAzNSwgMHgwODBjLCAweDkyZjcsIDB4MDAwNSwgMHgwODBjLAorCTB4OTY3YSwgMHg2MTE0LCAweDgxZmYsIDB4MDE1OCwgMHgwMDk2LCAweDIxNDgsIDB4MDgwYywgMHhlNzlkLAorCTB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHhlM2U4LCAweDAwM2UsIDB4MDA5ZSwgMHgwODBjLAorCTB4YWNlYiwgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHgwODBjLCAweDk2ZDUsIDB4NjExNCwgMHg4MWZmLAorCTB4MDE1OCwgMHgwMDk2LCAweDIxNDgsIDB4MDgwYywgMHhlNzlkLCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHhlM2U4LCAweDAwM2UsIDB4MDA5ZSwgMHgwODBjLCAweGFjZWIsIDB4MDAwNSwgMHg5MTgyLAorCTB4MDA4NSwgMHgwMDAyLCAweGRlZjEsIDB4ZGVlZiwgMHhkZWVmLCAweGRlZmQsIDB4ZGVlZiwgMHhkZWVmLAorCTB4ZGVlZiwgMHhkZWVmLCAweGRlZWYsIDB4ZGVlZiwgMHhkZWVmLCAweGRlZWYsIDB4ZGVlZiwgMHgwODBjLAorCTB4MGQ3ZCwgMHg2MDAzLCAweDAwMGIsIDB4NjEwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDA5LAorCTB4ODAyMCwgMHgwODBjLCAweDkyYjAsIDB4MDEyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDBlNiwgMHgwODBjLAorCTB4ZTYzZiwgMHgwMTE4LCAweDA4MGMsIDB4YWNiMCwgMHgwNDQwLCAweDIwNzEsIDB4MDI2MCwgMHg3MjI0LAorCTB4NjIxNiwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGU0LCAweDAxNTAsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiY2EwLCAweDAwYmUsIDB4MmMwMCwgMHgyMDExLCAweDAxNGUsIDB4MDgwYywgMHhhZmRiLAorCTB4NzIyMCwgMHgwODBjLCAweGUyN2UsIDB4MDExOCwgMHg2MDA3LCAweDAwODYsIDB4MDA0MCwgMHg2MDA3LAorCTB4MDA4NywgMHg3MjI0LCAweDkyOTYsIDB4ZmZmZiwgMHgxMTEwLCAweDYwMDcsIDB4MDA4NiwgMHg2MDAzLAorCTB4MDAwMSwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAwZWUsIDB4MDAyZSwgMHgwMDA1LAorCTB4OTE4NiwgMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHg5MDhhLCAweDAwODUsIDB4MGEwYywgMHgwZDdkLAorCTB4OTA4YSwgMHgwMDkyLCAweDFhMGMsIDB4MGQ3ZCwgMHg5MDgyLCAweDAwODUsIDB4MDBhMiwgMHg5MTg2LAorCTB4MDAyNywgMHgwMTMwLCAweDkxODYsIDB4MDAxNCwgMHgwMTE4LCAweDA4MGMsIDB4YWQ2YSwgMHgwMDUwLAorCTB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjYwZiwgMHgwODBjLCAweDk2N2EsIDB4MDgwYywgMHhhY2ViLAorCTB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4ZGY2MCwgMHhkZjYyLCAweGRmNjIsIDB4ZGY2MCwgMHhkZjYwLAorCTB4ZGY2MCwgMHhkZjYwLCAweGRmNjAsIDB4ZGY2MCwgMHhkZjYwLCAweGRmNjAsIDB4ZGY2MCwgMHhkZjYwLAorCTB4MDgwYywgMHgwZDdkLCAweDA4MGMsIDB4YWNlYiwgMHgwODBjLCAweDk3MzgsIDB4MDAwNSwgMHg5MTgyLAorCTB4MDA4NSwgMHgwYTBjLCAweDBkN2QsIDB4OTE4MiwgMHgwMDkyLCAweDFhMGMsIDB4MGQ3ZCwgMHg5MTgyLAorCTB4MDA4NSwgMHgwMDAyLCAweGRmN2YsIDB4ZGY3ZiwgMHhkZjdmLCAweGRmODEsIDB4ZGY3ZiwgMHhkZjdmLAorCTB4ZGY3ZiwgMHhkZjdmLCAweGRmN2YsIDB4ZGY3ZiwgMHhkZjdmLCAweGRmN2YsIDB4ZGY3ZiwgMHgwODBjLAorCTB4MGQ3ZCwgMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgwMTQ4LCAweDkxODYsIDB4MDAxNCwgMHgwMTMwLAorCTB4OTE4NiwgMHgwMDI3LCAweDAxMTgsIDB4MDgwYywgMHhhZDZhLCAweDAwMjAsIDB4MDgwYywgMHg5NjdhLAorCTB4MDgwYywgMHhhY2ViLCAweDAwMDUsIDB4MDAzNiwgMHgwODBjLCAweGU2YTAsIDB4NjA0YiwgMHgwMDAwLAorCTB4MjAxOSwgMHgwMDBiLCAweDAwMzEsIDB4NjAyMywgMHgwMDA2LCAweDYwMDMsIDB4MDAwNywgMHgwMDNlLAorCTB4MDAwNSwgMHgwMTI2LCAweDAwMzYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTkxZSwgMHgwMTA2LAorCTB4MDA4NiwgMHgyYzQwLCAweDAwOTYsIDB4OTA0ZSwgMHgwODBjLCAweGEyOGMsIDB4MDA5ZSwgMHgwMDhlLAorCTB4MTU1OCwgMHgwMDc2LCAweDJjMzgsIDB4MDgwYywgMHhhMzM3LCAweDAwN2UsIDB4MTUyOCwgMHg2MDAwLAorCTB4OTA4NiwgMHgwMDAwLCAweDA1MDgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDcsIDB4MDFlOCwgMHgwMDk2LAorCTB4NjAxYywgMHhkMDg0LCAweDAxNDAsIDB4MDgwYywgMHhlNmEwLCAweDA4MGMsIDB4ZDBiMywgMHgwODBjLAorCTB4MWFjNSwgMHg2MDIzLCAweDAwMDcsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMTEwLAorCTB4MDgwYywgMHhlM2U4LCAweDAwOWUsIDB4OTAwNiwgMHg2MDQ2LCAweDYwMTYsIDB4MDgwYywgMHhlNmEwLAorCTB4NjAyMywgMHgwMDA3LCAweDA4MGMsIDB4ZDBiMywgMHgwMTBlLCAweDA5MGMsIDB4YTkzYSwgMHgwMDNlLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBjNiwgMHgwMGI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDc5LAorCTB4MDI2MCwgMHg3OTM4LCAweDc4M2MsIDB4MDgwYywgMHgyNjYxLCAweDE1ZTgsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDgwYywgMHg2NjkzLCAweDE1YjAsIDB4MDAxZSwgMHgwMGM2LCAweDIxNjAsIDB4MDgwYywgMHhkMGIwLAorCTB4MDBjZSwgMHgwMDJlLCAweDAwMjYsIDB4MDAxNiwgMHgwODBjLCAweGE5MWUsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHhhNDA0LCAweDA4MGMsIDB4OTQzZCwgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg5MzA2LAorCTB4MDA3ZSwgMHgwMDFlLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweGUxNjcsIDB4MDA3ZSwgMHgwODBjLAorCTB4YTkzYSwgMHgwMDI2LCAweGJhMDQsIDB4OTI5NCwgMHhmZjAwLCAweDgyMTcsIDB4OTI4NiwgMHgwMDA2LAorCTB4MDExOCwgMHg5Mjg2LCAweDAwMDQsIDB4MTExOCwgMHhiYWEwLCAweDA4MGMsIDB4MzMwYiwgMHgwMDJlLAorCTB4YmM4NCwgMHgwMDFlLCAweDA4MGMsIDB4NjBhYywgMHhiZTEyLCAweGJkMTYsIDB4YmM4NiwgMHg5MDA2LAorCTB4MDAxMCwgMHgwMGNlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDNlLCAweDAwYmUsIDB4MDBjZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDBiNiwgMHgwMDE2LCAweDIwMDksIDB4MTgyNCwgMHgyMTA0LAorCTB4OTA4NiwgMHgwMDc0LCAweDE5MDQsIDB4ZTA4YSwgMHgyMDY5LCAweDAyNjAsIDB4Njk0NCwgMHg5MTgyLAorCTB4MDEwMCwgMHgwNmUwLCAweDY5NDAsIDB4OTE4NCwgMHg4MDAwLCAweDA5MDQsIDB4ZTA4NywgMHgyMDAxLAorCTB4MTk3YiwgMHgyMDA0LCAweDkwMDUsIDB4MTE0MCwgMHg2MDEwLCAweDIwNTgsIDB4Yjg4NCwgMHg5MDA1LAorCTB4MDExOCwgMHg5MTg0LCAweDA4MDAsIDB4MDU5OCwgMHg2OTQ4LCAweDkxOGEsIDB4MDAwMSwgMHgwNjQ4LAorCTB4MDgwYywgMHhlODA1LCAweDAxMTgsIDB4Njk3OCwgMHhkMWZjLCAweDExYjgsIDB4MjAwOSwgMHgwMjA1LAorCTB4MjAwYiwgMHgwMDAxLCAweDY5M2MsIDB4ODFmZiwgMHgxMTk4LCAweDY5NDQsIDB4OTE4MiwgMHgwMTAwLAorCTB4MDJhOCwgMHg2OTQwLCAweDgxZmYsIDB4MTE3OCwgMHg2OTQ4LCAweDkxOGEsIDB4MDAwMSwgMHgwMjg4LAorCTB4Njk1MCwgMHg5MThhLCAweDAwMDEsIDB4MDI5OCwgMHgwMGQwLCAweDYwMTcsIDB4MDEwMCwgMHgwMGEwLAorCTB4NjAxNywgMHgwMzAwLCAweDAwODgsIDB4NjAxNywgMHgwNTAwLCAweDAwNzAsIDB4NjAxNywgMHgwNzAwLAorCTB4MDA1OCwgMHg2MDE3LCAweDA5MDAsIDB4MDA0MCwgMHg2MDE3LCAweDBiMDAsIDB4MDAyOCwgMHg2MDE3LAorCTB4MGYwMCwgMHgwMDEwLCAweDYwMTcsIDB4MmQwMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LAorCTB4MDAxZSwgMHgwMGJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBiNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMTU2LCAweDYyMTAsIDB4MjI1OCwgMHhiYjA0LCAweDkzOTQsIDB4MDBmZiwgMHg5Mjg2LAorCTB4MDAwNiwgMHgwMTgwLCAweDkyODYsIDB4MDAwNCwgMHgwMTY4LCAweDkzOTQsIDB4ZmYwMCwgMHg4MjE3LAorCTB4OTI4NiwgMHgwMDA2LCAweDAxMzgsIDB4OTI4NiwgMHgwMDA0LCAweDAxMjAsIDB4MDgwYywgMHg2NmEyLAorCTB4MDgwNCwgMHhlMGY2LCAweDIwMTEsIDB4MDI3NiwgMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LAorCTB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YmNhMiwgMHgwMDllLCAweDE1YzgsIDB4MjAxMSwgMHgwMjdhLAorCTB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiY2EyLAorCTB4MDA5ZSwgMHgxNTY4LCAweDAwNDYsIDB4MDAxNiwgMHhiYWEwLCAweDIyMjAsIDB4OTAwNiwgMHgyMDA5LAorCTB4MTg0OCwgMHgyMTBjLCAweGQxYTQsIDB4MDEzOCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhlNDQ1LAorCTB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MDgwYywgMHhhOTFlLCAweDIwMTksIDB4MDAyOSwgMHgwODBjLAorCTB4OTQzZCwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDkzMDYsIDB4MmMwOCwgMHgwODBjLAorCTB4ZTE2NywgMHgwMDdlLCAweDA4MGMsIDB4YTkzYSwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NjBmLAorCTB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjVlMywgMHgwMDFlLCAweDAwNGUsIDB4OTAwNiwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwYmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHgwMjZlLAorCTB4NjgwMCwgMHg5MDg2LCAweDA4MDAsIDB4MDExOCwgMHg2MDE3LCAweDAwMDAsIDB4MDAwOCwgMHg5MDA2LAorCTB4MDBkZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LAorCTB4MjA3OSwgMHgwMjZjLCAweDc5MzAsIDB4NzgzNCwgMHgwODBjLCAweDI2NjEsIDB4MTFkMCwgMHgwODBjLAorCTB4NjY5MywgMHgxMWI4LCAweDIwMTEsIDB4MDI3MCwgMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LAorCTB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YmNhMiwgMHgwMDllLCAweDExNTgsIDB4MjAxMSwgMHgwMjc0LAorCTB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiY2EyLAorCTB4MDA5ZSwgMHgwMTVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4MjAxMSwgMHgwMjYzLAorCTB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjYxLCAweDExZDAsIDB4MDgwYywgMHg2NjkzLAorCTB4MTFiOCwgMHgyMDExLCAweDAyNzYsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwgMHgyMDE5LAorCTB4MDAwYSwgMHgwODBjLCAweGJjYTIsIDB4MDA5ZSwgMHgxMTU4LCAweDIwMTEsIDB4MDI3YSwgMHgyMGE5LAorCTB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YmNhMiwgMHgwMDllLAorCTB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDg2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTk3YywgMHgwMTA2LCAweDE5MGMsIDB4YTkxZSwgMHgyNzQwLAorCTB4MjAyOSwgMHgxOWYyLCAweDI1MmMsIDB4MjAyMSwgMHgxOWY5LCAweDI0MjQsIDB4MjA2MSwgMHgxZGRjLAorCTB4MjA3MSwgMHgxODAwLCAweDc2NTQsIDB4NzA3NCwgMHg4MWZmLCAweDAxNTAsIDB4MDAwNiwgMHg5MTg2LAorCTB4MWIzNCwgMHgwMDBlLCAweDAxMjgsIDB4ODAwMSwgMHg5NjAyLCAweDFhMDQsIDB4ZTIwYywgMHgwMDE4LAorCTB4OTYwNiwgMHgwOTA0LCAweGUyMGMsIDB4MDgwYywgMHg4YzFmLCAweDA5MDQsIDB4ZTIwMywgMHgyMTAwLAorCTB4OWMwNiwgMHgwOTA0LCAweGUyMDMsIDB4MDgwYywgMHhlNDg2LCAweDE5MDQsIDB4ZTIwMywgMHgwODBjLAorCTB4ZTgyMiwgMHgwOTA0LCAweGUyMDMsIDB4MDgwYywgMHhlNDc2LCAweDA5MDQsIDB4ZTIwMywgMHg2NzIwLAorCTB4OTc4NiwgMHgwMDAxLCAweDExNDgsIDB4MDgwYywgMHgzM2E4LCAweDA5MDQsIDB4ZTI0ZSwgMHg2MDA0LAorCTB4OTA4NiwgMHgwMDAwLCAweDE5MDQsIDB4ZTI0ZSwgMHg5Nzg2LCAweDAwMDQsIDB4MDkwNCwgMHhlMjRlLAorCTB4OTc4NiwgMHgwMDA3LCAweDA5MDQsIDB4ZTIwMywgMHgyNTAwLCAweDljMDYsIDB4MDkwNCwgMHhlMjAzLAorCTB4MjQwMCwgMHg5YzA2LCAweDA5MDQsIDB4ZTIwMywgMHg4OGZmLCAweDAxMTgsIDB4NjA1YywgMHg5OTA2LAorCTB4MTVkMCwgMHgwMDk2LCAweDYwNDMsIDB4ZmZmZiwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTIwLAorCTB4MDAxNiwgMHgwODBjLCAweDFhYzUsIDB4MDAxZSwgMHg5Nzg2LCAweDAwMGEsIDB4MDE0OCwgMHgwODBjLAorCTB4Y2I5MSwgMHgxMTMwLCAweDA4MGMsIDB4YjY5MywgMHgwMDllLCAweDA4MGMsIDB4YWNlYiwgMHgwNDE4LAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4Yzk3YSwgMHgwMWQ4LCAweDk3ODYsIDB4MDAwMywgMHgxNTg4LAorCTB4YTg2NywgMHgwMTAzLCAweGE4N2MsIDB4ZDBjYywgMHgwMTMwLCAweDAwOTYsIDB4YTg3OCwgMHgyMDQ4LAorCTB4MDgwYywgMHgwZmY5LCAweDAwOWUsIDB4YWI3YSwgMHhhODc3LCAweDAwMDAsIDB4MDgwYywgMHhlNzlkLAorCTB4MDAxNiwgMHgwODBjLCAweGNjN2YsIDB4MDgwYywgMHg2ZGUyLCAweDAwMWUsIDB4MDgwYywgMHhjYjZiLAorCTB4MDA5ZSwgMHgwODBjLCAweGFjZWIsIDB4OWNlMCwgMHgwMDFjLCAweDIwMDEsIDB4MTgxYSwgMHgyMDA0LAorCTB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4ZTE4MCwgMHgwMTBlLCAweDE5MGMsIDB4YTkzYSwgMHgwMTJlLAorCTB4MDAyZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg5Nzg2LCAweDAwMDYsIDB4MTE1MCwgMHg5Mzg2LCAweDAwMDUsIDB4MDEyOCwgMHgwODBjLAorCTB4ZTc5ZCwgMHgwODBjLCAweGUzZTgsIDB4MDhlMCwgMHgwMDllLCAweDA4ZTgsIDB4OTc4NiwgMHgwMDA5LAorCTB4MTFmOCwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgwMWMwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTFhMCwgMHgwODBjLCAweDk2ZDUsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhjOTdhLAorCTB4MDExOCwgMHg2MDEwLCAweDA4MGMsIDB4NmRlZSwgMHgwMDllLCAweDAwYzYsIDB4MDgwYywgMHhhY2IwLAorCTB4MDBjZSwgMHgwMDM2LCAweDA4MGMsIDB4OTczOCwgMHgwMDNlLCAweDAwOWUsIDB4MDgwNCwgMHhlMjAzLAorCTB4OTc4NiwgMHgwMDBhLCAweDA5MDQsIDB4ZTFmMywgMHgwODA0LCAweGUxZTgsIDB4ODFmZiwgMHgwOTA0LAorCTB4ZTIwMywgMHg5MTgwLCAweDAwMDEsIDB4MjAwNCwgMHg5MDg2LCAweDAwMTgsIDB4MDEzOCwgMHg5MTgwLAorCTB4MDAwMSwgMHgyMDA0LCAweDkwODYsIDB4MDAyZCwgMHgxOTA0LCAweGUyMDMsIDB4NjAwMCwgMHg5MDg2LAorCTB4MDAwMiwgMHgxOTA0LCAweGUyMDMsIDB4MDgwYywgMHhjYjgwLCAweDAxMzgsIDB4MDgwYywgMHhjYjkxLAorCTB4MTkwNCwgMHhlMjAzLCAweDA4MGMsIDB4YjY5MywgMHgwMDM4LCAweDA4MGMsIDB4MzI2ZiwgMHgwODBjLAorCTB4Y2I5MSwgMHgxMTEwLCAweDA4MGMsIDB4YjY5MywgMHgwODBjLCAweGFjZWIsIDB4MDgwNCwgMHhlMjAzLAorCTB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM5LCAweDAwMDUsIDB4MDBjNiwgMHgwMGU2LAorCTB4MDAxNiwgMHgyYzA4LCAweDIxNzAsIDB4OTAwNiwgMHgwODBjLCAweGU0MGYsIDB4MDAxZSwgMHgwMTIwLAorCTB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAxYiwgMHgwMGVlLCAweDAwY2UsIDB4MDAwNSwgMHhlMjlkLAorCTB4ZTI5ZCwgMHhlMjlkLCAweGUyOWQsIDB4ZTI5ZCwgMHhlMjlkLCAweGUyOWYsIDB4ZTI5ZCwgMHhlMjlkLAorCTB4ZTI5ZCwgMHhlMjlkLCAweGFjZWIsIDB4YWNlYiwgMHhlMjlkLCAweDkwMDYsIDB4MDAwNSwgMHgwMDM2LAorCTB4MDA0NiwgMHgwMDE2LCAweDcwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJjYTAsIDB4MDBiZSwgMHgyYzAwLAorCTB4MjAwOSwgMHgwMDIwLCAweDA4MGMsIDB4ZTQ0NSwgMHgwMDFlLCAweDAwNGUsIDB4MjAxOSwgMHgwMDAyLAorCTB4MDgwYywgMHhkZmExLCAweDAwM2UsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA5NiwgMHgwODBjLAorCTB4Yzk3YSwgMHgwMTQwLCAweDYwMTQsIDB4OTA0ZCwgMHgwODBjLCAweGM1NjYsIDB4Njg3YiwgMHgwMDA1LAorCTB4MDgwYywgMHg2ZGVlLCAweDAwOWUsIDB4MDgwYywgMHhhY2ViLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjVjZiwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwgMHgyMDExLCAweDAyNzYsIDB4MDgwYywgMHhiYzhlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHg5MDA1LCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDg2LCAweDAwNzYsIDB4MDA2NiwgMHgwMGI2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4Mjc0MCwgMHgyMDYxLCAweDFkZGMsIDB4MjA3OSwgMHgwMDAxLCAweDhmZmYsIDB4MDkwNCwgMHhlMzM4LAorCTB4MjA3MSwgMHgxODAwLCAweDc2NTQsIDB4NzA3NCwgMHg4MDAxLCAweDk2MDIsIDB4MWEwNCwgMHhlMzM4LAorCTB4ODhmZiwgMHgwMTIwLCAweDI4MDAsIDB4OWMwNiwgMHgxNTkwLCAweDIwNzgsIDB4MDgwYywgMHhlNDc2LAorCTB4MDU3MCwgMHgyNDAwLCAweDljMDYsIDB4MDU1OCwgMHg2NzIwLCAweDk3ODYsIDB4MDAwNiwgMHgxNTM4LAorCTB4OTc4NiwgMHgwMDA3LCAweDA1MjAsIDB4ODhmZiwgMHgxMTQwLCAweDYwMTAsIDB4OWIwNiwgMHgxMWY4LAorCTB4ODVmZiwgMHgwMTE4LCAweDYwNWMsIDB4OTEwNiwgMHgxMWQwLCAweDAwOTYsIDB4NjAxYywgMHhkMDg0LAorCTB4MDE0MCwgMHgwODBjLCAweGU2YTAsIDB4MDgwYywgMHhkMGIzLCAweDA4MGMsIDB4MWFjNSwgMHg2MDIzLAorCTB4MDAwNywgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDAxMjAsIDB4MDA0NiwgMHgwODBjLAorCTB4ZTNlOCwgMHgwMDRlLCAweDAwOWUsIDB4MDgwYywgMHhhY2ViLCAweDg4ZmYsIDB4MTE5OCwgMHg5Y2UwLAorCTB4MDAxYywgMHgyMDAxLCAweDE4MWEsIDB4MjAwNCwgMHg5YzAyLCAweDEyMTAsIDB4MDgwNCwgMHhlMmVkLAorCTB4OTAwNiwgMHgwMTJlLCAweDAwYmUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDk4YzUsIDB4MDAwMSwgMHgwY2EwLCAweDA4MGMsIDB4YTkxZSwgMHgwMGI2LAorCTB4MDA3NiwgMHgwMDU2LCAweDAwODYsIDB4OTA0NiwgMHgyMDI5LCAweDAwMDEsIDB4MmMyMCwgMHgyMDE5LAorCTB4MDAwMiwgMHg2MjEwLCAweDIyNTgsIDB4MDA5NiwgMHg5MDRlLCAweDA4MGMsIDB4YTI4YywgMHgwMDllLAorCTB4MDA4ZSwgMHg5MDNlLCAweDA4MGMsIDB4YTMzNywgMHgwODBjLCAweGUyZGUsIDB4MDA1ZSwgMHgwMDdlLAorCTB4MDBiZSwgMHgwODBjLCAweGE5M2EsIDB4MDAwNSwgMHgwODBjLCAweGE5MWUsIDB4MDBiNiwgMHgwMDQ2LAorCTB4MDA1NiwgMHgwMDc2LCAweDAwYzYsIDB4MDE1NiwgMHgyYzIwLCAweDIxMjgsIDB4MjBhOSwgMHgwMDdmLAorCTB4OTAwZSwgMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg2NjkzLCAweDExOTAsIDB4MDA1NiwgMHgwMDg2LAorCTB4OTA0NiwgMHgyNTA4LCAweDIwMjksIDB4MDAwMSwgMHgwMDk2LCAweDkwNGUsIDB4MDgwYywgMHhhMjhjLAorCTB4MDA5ZSwgMHgwMDhlLCAweDkwM2UsIDB4MDgwYywgMHhhMzM3LCAweDA4MGMsIDB4ZTJkZSwgMHgwMDVlLAorCTB4MDAzZSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHhlMzcxLCAweDAxNWUsIDB4MDBjZSwgMHgwMDdlLAorCTB4MDA1ZSwgMHgwMDRlLCAweDAwYmUsIDB4MDgwYywgMHhhOTNhLCAweDAwMDUsIDB4MDgwYywgMHhhOTFlLAorCTB4MDBiNiwgMHgwMDc2LCAweDAwNTYsIDB4NjIxMCwgMHgyMjU4LCAweDAwODYsIDB4OTA0NiwgMHgyMDI5LAorCTB4MDAwMSwgMHgyMDE5LCAweDAwNDgsIDB4MDA5NiwgMHg5MDRlLCAweDA4MGMsIDB4YTI4YywgMHgwMDllLAorCTB4MDA4ZSwgMHg5MDNlLCAweDA4MGMsIDB4YTMzNywgMHgyYzIwLCAweDA4MGMsIDB4ZTJkZSwgMHgwMDVlLAorCTB4MDA3ZSwgMHgwMGJlLCAweDA4MGMsIDB4YTkzYSwgMHgwMDA1LCAweDA4MGMsIDB4YTkxZSwgMHgwMGI2LAorCTB4MDA0NiwgMHgwMDU2LCAweDAwNzYsIDB4MDBjNiwgMHgwMTU2LCAweDJjMjAsIDB4MjBhOSwgMHgwODAwLAorCTB4OTAwZSwgMHgwMDE2LCAweDAwMzYsIDB4MDgwYywgMHg2NjkzLCAweDExYTAsIDB4MDA4NiwgMHg5MDQ2LAorCTB4MjgyOCwgMHgwMDQ2LCAweDIwMjEsIDB4MDAwMSwgMHgwODBjLCAweGU2ODQsIDB4MDA0ZSwgMHgwMDk2LAorCTB4OTA0ZSwgMHgwODBjLCAweGEyOGMsIDB4MDA5ZSwgMHgwMDhlLCAweDkwM2UsIDB4MDgwYywgMHhhMzM3LAorCTB4MDgwYywgMHhlMmRlLCAweDAwM2UsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4ZTNjMSwgMHgwMTVlLAorCTB4MDBjZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMGJlLCAweDA4MGMsIDB4YTkzYSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGY2LCAweDA4MGMsIDB4Yzk3OCwgMHgwMTk4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDQ2LCAweDAxODAsIDB4YTgwMCwgMHg5MDdkLCAweDAxMzgsIDB4YTgwMywgMHgwMDAwLAorCTB4YWI4MiwgMHgwODBjLCAweDZkZWUsIDB4MmY0OCwgMHgwY2IwLCAweGFiODIsIDB4MDgwYywgMHg2ZGVlLAorCTB4MDBmZSwgMHgwMDFlLCAweDAwMDUsIDB4YTgwMCwgMHg5MDdkLCAweDAxMzAsIDB4YTgwMywgMHgwMDAwLAorCTB4MDgwYywgMHg2ZGVlLCAweDJmNDgsIDB4MGNiOCwgMHgwODBjLCAweDZkZWUsIDB4MGM4OCwgMHgwMGU2LAorCTB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MWRkYywgMHg5MDA1LCAweDExMzgsIDB4MjA3MSwgMHgxODAwLAorCTB4NzQ1NCwgMHg3MDc0LCAweDgwMDEsIDB4OTQwMiwgMHgxMmY4LCAweDIxMDAsIDB4OWMwNiwgMHgwMTg4LAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE2OCwgMHg2MDA4LCAweDkyMDYsIDB4MTE1MCwgMHg2MzIwLAorCTB4OTM4NiwgMHgwMDA5LCAweDAxYjAsIDB4NjAxMCwgMHg5MWEwLCAweDAwMDQsIDB4MjQyNCwgMHg5NDA2LAorCTB4MDE0MCwgMHg5Y2UwLCAweDAwMWMsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgxMjIwLAorCTB4MGMyMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwM2UsIDB4MDA0ZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg2MzFjLCAweGQzYzQsIDB4MWQ2OCwgMHgwYzMwLCAweDAwOTYsIDB4MDAwNiwgMHgwODBjLAorCTB4MTA0NywgMHgwMDBlLCAweDA5MGMsIDB4MGQ3ZCwgMHhhYWUyLCAweGE4NjcsIDB4MDEwZCwgMHhhODhlLAorCTB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4Yzk2OCwgMHgyMDAxLCAweDAwMDAsIDB4MDEyMCwgMHgyMjAwLAorCTB4OTA4MCwgMHgwMDE3LCAweDIwMDQsIDB4MDAyZSwgMHhhODdhLCAweDkxODYsIDB4MDAyMCwgMHgwMTEwLAorCTB4YThlMywgMHhmZmZmLCAweGE5ODYsIDB4YWM3NiwgMHhhODdmLCAweDAwMDAsIDB4MjAwMSwgMHgxOThkLAorCTB4MjAwNCwgMHhhODgyLCAweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGE4OGEsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZkZWUsIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4NjcwMCwgMHg5Nzg2LAorCTB4MDAwMCwgMHgwMTU4LCAweDk3ODYsIDB4MDAwMSwgMHgwMTQwLCAweDk3ODYsIDB4MDAwYSwgMHgwMTI4LAorCTB4OTc4NiwgMHgwMDA5LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBlNiwgMHg2MDEwLAorCTB4OTA3NSwgMHgwMTM4LCAweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4OTIwNiwgMHgwMGVlLAorCTB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNkOCwgMHgwMDE2LCAweDYwMDQsIDB4OTA4ZSwgMHgwMDFlLAorCTB4MTFhMCwgMHg4MDA3LCAweDYxMzQsIDB4OTE4YywgMHgwMGZmLCAweDkxMDUsIDB4NjAzNiwgMHg2MDA3LAorCTB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDA1LCAweDIwMDEsIDB4MTk4NiwgMHgyMDA0LAorCTB4NjAxYSwgMHgyMDA5LCAweDgwMjAsIDB4MDgwYywgMHg5MmIwLCAweDAwMWUsIDB4MDAwNSwgMHhhMDAxLAorCTB4YTAwMSwgMHgwMDA1LCAweDYwMjQsIDB4ZDBlNCwgMHgwMTU4LCAweGQwY2MsIDB4MDExOCwgMHgwODBjLAorCTB4Y2NjNiwgMHgwMDMwLCAweDA4MGMsIDB4ZTZhMCwgMHgwODBjLCAweDg5NGUsIDB4MDgwYywgMHhhY2IwLAorCTB4MDAwNSwgMHg5MjgwLCAweDAwMDgsIDB4MjAwNCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwMiwgMHhlNGQ1LAorCTB4ZTRkNSwgMHhlNGQ1LCAweGU0ZDcsIDB4ZTRkNSwgMHhlNGQ3LCAweGU0ZDcsIDB4ZTRkNSwgMHhlNGQ3LAorCTB4ZTRkNSwgMHhlNGQ1LCAweGU0ZDUsIDB4ZTRkNSwgMHhlNGQ1LCAweDkwMDYsIDB4MDAwNSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDkyODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODQsIDB4MDAwZiwgMHgwMDAyLAorCTB4ZTRlZSwgMHhlNGVlLCAweGU0ZWUsIDB4ZTRlZSwgMHhlNGVlLCAweGU0ZWUsIDB4ZTRmYiwgMHhlNGVlLAorCTB4ZTRlZSwgMHhlNGVlLCAweGU0ZWUsIDB4ZTRlZSwgMHhlNGVlLCAweGU0ZWUsIDB4NjAwNywgMHgwMDNiLAorCTB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MmEwMCwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHg4MDIwLAorCTB4MDgwYywgMHg5MmIwLCAweDAwMDUsIDB4MDA5NiwgMHgwMGM2LCAweDIyNjAsIDB4MDgwYywgMHhlNmEwLAorCTB4NjA0YiwgMHgwMDAwLCAweDYwMjQsIDB4YzBmNCwgMHhjMGU0LCAweDYwMjYsIDB4NjAzYiwgMHgwMDAwLAorCTB4MDBjZSwgMHgwMGQ2LCAweDIyNjgsIDB4OTE4NiwgMHgwMDA3LCAweDE5MDQsIDB4ZTU1NCwgMHg2ODE0LAorCTB4OTAwNSwgMHgwMTM4LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDExMTgsIDB4MDBkZSwgMHgwMDllLAorCTB4MDhhOCwgMHg2MDA3LCAweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4ODAyMCwgMHgwODBjLAorCTB4OTJiMCwgMHgwMGM2LCAweDJkNjAsIDB4NjEwMCwgMHg5MTg2LCAweDAwMDIsIDB4MTkwNCwgMHhlNWNiLAorCTB4NjAxNCwgMHg5MDA1LCAweDExMzgsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDcsIDB4MTkwYywgMHgwZDdkLAorCTB4MDgwNCwgMHhlNWNiLCAweDIwNDgsIDB4MDgwYywgMHhjOTdhLCAweDExMzAsIDB4MDAyOCwgMHgyMDQ4LAorCTB4YTgwMCwgMHg5MDA1LCAweDFkZTAsIDB4MjkwMCwgMHgyMDQ4LCAweGE4N2MsIDB4OTA4NCwgMHgwMDAzLAorCTB4OTA4NiwgMHgwMDAyLCAweDExNjgsIDB4YTg3YywgMHhjMGRjLCAweGMwZjQsIDB4YTg3ZSwgMHhhODgwLAorCTB4YzBmYywgMHhhODgyLCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGRkZGUsIDB4MDgwNCwgMHhlNWNiLAorCTB4MjAwOSwgMHgwMDQxLCAweDA4MDQsIDB4ZTVjNSwgMHg5MTg2LCAweDAwMDUsIDB4MTVhMCwgMHg2ODE0LAorCTB4MjA0OCwgMHhhODdjLCAweGQwYmMsIDB4MTEyMCwgMHgwMGRlLCAweDAwOWUsIDB4MDgwNCwgMHhlNGVlLAorCTB4ZDBiNCwgMHgwMTI4LCAweGQwZmMsIDB4MDkwYywgMHgwZDdkLCAweDA4MDQsIDB4ZTUwZiwgMHg2MDA3LAorCTB4MDAzYSwgMHg2MDAzLCAweDAwMDEsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgwMGM2LAorCTB4MmQ2MCwgMHg2MTAwLCAweDkxODYsIDB4MDAwMiwgMHgwMTIwLCAweDkxODYsIDB4MDAwNCwgMHgxOTA0LAorCTB4ZTVjYiwgMHg2ODE0LCAweDIwNDgsIDB4YTk3YywgMHhjMWY0LCAweGMxZGMsIDB4YTk3ZSwgMHhhOTgwLAorCTB4YzFmYywgMHhjMWJjLCAweGE5ODIsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTc3OCwgMHgwMGZlLAorCTB4MjAwOSwgMHgwMDQyLCAweDA0ZDAsIDB4MDAzNiwgMHgwODBjLCAweDEwNDcsIDB4MDkwYywgMHgwZDdkLAorCTB4YTg2NywgMHgwMTBkLCAweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGE4OGEsIDB4MmQxOCwgMHhhYjhlLAorCTB4YTg4NywgMHgwMDQ1LCAweDJjMDAsIDB4YTg5MiwgMHg2MDM4LCAweGE4YTIsIDB4MjM2MCwgMHg2MDI0LAorCTB4YzBkZCwgMHg2MDI2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHgyMDA0LAorCTB4NjM1YywgMHhhYjdhLCAweGE4NzYsIDB4OTAwNiwgMHhhODdlLCAweGE4ODIsIDB4YWQ5YSwgMHhhZTk2LAorCTB4YTg5ZiwgMHgwMDAxLCAweDA4MGMsIDB4NmRlZSwgMHgyMDE5LCAweDAwNDUsIDB4NjAwOCwgMHgyMDY4LAorCTB4MDgwYywgMHhkZmExLCAweDJkMDAsIDB4NjAwYSwgMHg2MDIzLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LAorCTB4OTAxZSwgMHg2MzFhLCAweDYzNGEsIDB4MDAzZSwgMHgwMDM4LCAweDYwNGIsIDB4MDAwMCwgMHg2MDAzLAorCTB4MDAwNywgMHgwODBjLCAweGRkZGUsIDB4MDBjZSwgMHgwMGRlLCAweDAwOWUsIDB4MDAwNSwgMHg5MTg2LAorCTB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4OTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDBjMiwgMHg5MTg2LAorCTB4MDAyNywgMHgxMTc4LCAweDA4MGMsIDB4OTY3YSwgMHgwMDM2LCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZTNlOCwgMHgwMDllLCAweDAwM2UsIDB4MDgwYywgMHg5NzM4LAorCTB4MDAwNSwgMHg5MTg2LCAweDAwMTQsIDB4MGQ3MCwgMHgwODBjLCAweGFkNmEsIDB4MDAwNSwgMHhlNWZlLAorCTB4ZTVmYywgMHhlNWZjLCAweGU1ZmMsIDB4ZTVmYywgMHhlNWZjLCAweGU1ZmUsIDB4ZTVmYywgMHhlNWZjLAorCTB4ZTVmYywgMHhlNWZjLCAweGU1ZmMsIDB4ZTVmYywgMHgwODBjLCAweDBkN2QsIDB4NjAwMywgMHgwMDBjLAorCTB4MDgwYywgMHg5NzM4LCAweDAwMDUsIDB4OTE4MiwgMHgwMDkyLCAweDEyMjAsIDB4OTE4MiwgMHgwMDg1LAorCTB4MDIwOCwgMHgwMDFhLCAweDA4MGMsIDB4YWQ2YSwgMHgwMDA1LCAweGU2MWEsIDB4ZTYxYSwgMHhlNjFhLAorCTB4ZTYxYSwgMHhlNjFjLCAweGU2M2MsIDB4ZTYxYSwgMHhlNjFhLCAweGU2MWEsIDB4ZTYxYSwgMHhlNjFhLAorCTB4ZTYxYSwgMHhlNjFhLCAweDA4MGMsIDB4MGQ3ZCwgMHgwMGQ2LCAweDJjNjgsIDB4MDgwYywgMHhhYzVhLAorCTB4MDFiMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDFlLCAweDIwMDksIDB4MDI2ZSwgMHgyMTBjLAorCTB4NjEzYSwgMHgyMDA5LCAweDAyNmYsIDB4MjEwYywgMHg2MTNlLCAweDYwMGIsIDB4ZmZmZiwgMHg2OTEwLAorCTB4NjExMiwgMHg2MDIzLCAweDAwMDQsIDB4MjAwOSwgMHg4MDIwLCAweDA4MGMsIDB4OTJiMCwgMHgyZDYwLAorCTB4MDgwYywgMHhhY2IwLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweGFjYjAsIDB4MDAwNSwgMHgwMGU2LAorCTB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwZWMsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjAwOSwgMHgxODY3LCAweDIxMGMsIDB4ZDFlYywgMHgwNWIwLCAweDYwMDMsIDB4MDAwMiwgMHg2MDI0LAorCTB4YzBlNSwgMHg2MDI2LCAweGQwY2MsIDB4MDE1MCwgMHgyMDAxLCAweDE5ODcsIDB4MjAwNCwgMHg2MDRhLAorCTB4MjAwOSwgMHgxODY3LCAweDIxMGMsIDB4ZDFmNCwgMHgxNTIwLCAweDAwYTAsIDB4MjAwOSwgMHgxODY3LAorCTB4MjEwYywgMHhkMWY0LCAweDAxMjgsIDB4NjAyNCwgMHhjMGU0LCAweDYwMjYsIDB4OTAwNiwgMHgwMGQ4LAorCTB4MjAwMSwgMHgxOTg3LCAweDIwMGMsIDB4MjAwMSwgMHgxOTg1LCAweDIwMDQsIDB4OTEwMCwgMHg5MDgwLAorCTB4MDAwYSwgMHg2MDRhLCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YmMsIDB4MDBiZSwgMHgwMDA4LAorCTB4MjEwNCwgMHg5MDA1LCAweDAxMTgsIDB4OTA4OCwgMHgwMDAzLCAweDBjZDAsIDB4MmMwYSwgMHg2MDBmLAorCTB4MDAwMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHg2MTVjLAorCTB4YjhiYywgMHgyMDYwLCAweDhjZmYsIDB4MDE4MCwgMHg4NGZmLCAweDExMTgsIDB4NjA1YywgMHg5MTA2LAorCTB4MTEzOCwgMHg2MDBjLCAweDIwNzIsIDB4MDgwYywgMHg4OTRlLCAweDA4MGMsIDB4YWNiMCwgMHgwMDEwLAorCTB4OWNmMCwgMHgwMDAzLCAweDJlNjQsIDB4MGM3MCwgMHgwMGVlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBkNiwgMHgwMGI2LCAweDYwMTAsIDB4MjA1OCwgMHhiOGJjLCAweDIwNjgsIDB4OTAwNSwgMHgwMTMwLAorCTB4OWMwNiwgMHgwMTEwLCAweDY4MGMsIDB4MGNkMCwgMHg2MDBjLCAweDY4MGUsIDB4MDBiZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDExLCAweDE4MmMsIDB4MjIwNCwgMHg5MDg0LAorCTB4MDBmZiwgMHgyMDE5LCAweDAyNmUsIDB4MjMzNCwgMHg5NjM2LCAweDE1MDgsIDB4ODMxOCwgMHgyMzM0LAorCTB4MjIwNCwgMHg5MDg0LCAweGZmMDAsIDB4OTYzNiwgMHgxMWQwLCAweDIwMTEsIDB4MDI3MCwgMHgyMGE5LAorCTB4MDAwNCwgMHg2MDEwLCAweDAwOTYsIDB4MjA0OCwgMHgyMDE5LCAweDAwMGEsIDB4MDgwYywgMHhiY2EyLAorCTB4MDA5ZSwgMHgxMTY4LCAweDIwMTEsIDB4MDI3NCwgMHgyMGE5LCAweDAwMDQsIDB4NjAxMCwgMHgwMDk2LAorCTB4MjA0OCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiY2EyLCAweDAwOWUsIDB4MTEwMCwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywgMHg2MDI1LAorCTB4MDgwYywgMHgzMDExLCAweDAwZWUsIDB4MDAwNSwgMHgwMDk2LCAweDAwMjYsIDB4MDgwYywgMHgxMDQ3LAorCTB4MDkwYywgMHgwZDdkLCAweGE4NWMsIDB4OTA4MCwgMHgwMDFhLCAweDIwYTAsIDB4MjBhOSwgMHgwMDBjLAorCTB4YTg2MCwgMHgyMGU4LCAweDkwMDYsIDB4NDAwNCwgMHg5MTg2LCAweDAwNDYsIDB4MTExOCwgMHhhODY3LAorCTB4MDEzNiwgMHgwMDM4LCAweGE4NjcsIDB4MDEzOCwgMHg5MTg2LCAweDAwNDEsIDB4MDExMCwgMHhhODdiLAorCTB4MDAwMSwgMHg3MDM4LCAweDkwODQsIDB4ZmYwMCwgMHg3MjQwLCAweDkyOTQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4OTIxNSwgMHhhYTlhLCAweDkxODYsIDB4MDA0NiwgMHgxMTY4LCAweDcwMzgsIDB4OTA4NCwgMHgwMGZmLAorCTB4NzIzYywgMHg5Mjk0LCAweGZmMDAsIDB4OTIxNSwgMHhhYTllLCAweDcyM2MsIDB4OTI5NCwgMHgwMGZmLAorCTB4YWFhMiwgMHgwMDYwLCAweDcwNDAsIDB4OTA4NCwgMHgwMGZmLCAweDcyNDQsIDB4OTI5NCwgMHhmZjAwLAorCTB4OTIxNSwgMHhhYTllLCAweDcyNDQsIDB4OTI5NCwgMHgwMGZmLCAweGFhYTIsIDB4OTE4NiwgMHgwMDQ2LAorCTB4MTExOCwgMHg5ZTkwLCAweDAwMTIsIDB4MDAxMCwgMHg5ZTkwLCAweDAwMWEsIDB4MjIwNCwgMHg4MDA3LAorCTB4YThhNiwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHhhOGFhLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LAorCTB4YThhZSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHhhOGIyLCAweDgyMTAsIDB4OTE4NiwgMHgwMDQ2LAorCTB4MTFiOCwgMHg5ZTkwLCAweDAwMTYsIDB4MjIwNCwgMHg4MDA3LCAweGE4YjYsIDB4ODIxMCwgMHgyMjA0LAorCTB4ODAwNywgMHhhOGJhLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YmUsIDB4ODIxMCwgMHgyMjA0LAorCTB4ODAwNywgMHhhOGMyLCAweDgyMTAsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMSwgMHgwMGIwLAorCTB4OWU5MCwgMHgwMDFlLCAweDIyMDQsIDB4ODAwNywgMHhhOGI2LCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LAorCTB4YThiYSwgMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAxLCAweDIwMTEsIDB4MDI2MCwgMHgyMjA0LAorCTB4ODAwNywgMHhhOGJlLCAweDgyMTAsIDB4MjIwNCwgMHg4MDA3LCAweGE4YzIsIDB4OTE4NiwgMHgwMDQ2LAorCTB4MTExOCwgMHgyMDExLCAweDAyNjIsIDB4MDAxMCwgMHgyMDExLCAweDAyNmEsIDB4MDE0NiwgMHgwMWQ2LAorCTB4MDAzNiwgMHgyMGE5LCAweDAwMDEsIDB4MjAxOSwgMHgwMDA4LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDMxLCAweDIwYTAsIDB4MjIwNCwgMHg4MDA3LCAweDQwMDQsIDB4ODIxMCwgMHg4MzE5LAorCTB4MWRkMCwgMHgwMDNlLCAweDAxY2UsIDB4MDEzZSwgMHgyMDExLCAweDAyMDUsIDB4MjAxMywgMHgwMDAwLAorCTB4MDAyZSwgMHgwODBjLCAweDZkZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDAwZTYsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBmYywgMHgwMTA4LCAweDAwMTEsIDB4MDBlZSwgMHgwMDA1LAorCTB4YTg4MCwgMHhjMGU1LCAweGE4ODIsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDc2LAorCTB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAyOSwgMHgxOWYyLCAweDI1MmMsIDB4MjAyMSwgMHgxOWY5LCAweDI0MjQsIDB4MjA2MSwgMHgxZGRjLAorCTB4MjA3MSwgMHgxODAwLCAweDc2NTQsIDB4NzA3NCwgMHg5NjA2LCAweDA1NzgsIDB4NjcyMCwgMHg5Nzg2LAorCTB4MDAwMSwgMHgwMTE4LCAweDk3ODYsIDB4MDAwOCwgMHgxNTAwLCAweDI1MDAsIDB4OWMwNiwgMHgwMWU4LAorCTB4MjQwMCwgMHg5YzA2LCAweDAxZDAsIDB4MDgwYywgMHhlNDc2LCAweDAxYjgsIDB4MDgwYywgMHhlNDg2LAorCTB4MTFhMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxMTIwLCAweDAwMTYsIDB4MDgwYywgMHgxYWM1LAorCTB4MDAxZSwgMHgwODBjLCAweGNiODAsIDB4MTExMCwgMHgwODBjLCAweDMyNmYsIDB4MDgwYywgMHhjYjkxLAorCTB4MTExMCwgMHgwODBjLCAweGI2OTMsIDB4MDgwYywgMHhhY2ViLCAweDljZTAsIDB4MDAxYywgMHgyMDAxLAorCTB4MTgxYSwgMHgyMDA0LCAweDljMDIsIDB4MTIwOCwgMHgwODU4LCAweDAxMmUsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBkYywgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxODM3LAorCTB4MjAwNCwgMHhkMDljLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMzYsIDB4MDA0NiwgMHgwODBjLAorCTB4ZDA5YiwgMHgwMTY4LCAweDIwMTksIDB4ZmZmZiwgMHg5MDA1LCAweDAxMjgsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiYmEwLCAweDAwYmUsIDB4MjAyMSwgMHgwMDA0LCAweDA4MGMsIDB4NGQwOSwgMHgwMDRlLAorCTB4MDAzZSwgMHgwMDBlLCAweDYwMDQsIDB4OTA4NiwgMHgwMDAxLCAweDExMjgsIDB4MDgwYywgMHhhNDA0LAorCTB4MDgwYywgMHhhY2ViLCAweDkwMDYsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDBiNiwgMHgwMDQ2LAorCTB4MjA2MSwgMHgxZGRjLCAweDIwNzEsIDB4MTgwMCwgMHg3NDU0LCAweDcwNzQsIDB4ODAwMSwgMHg5NDAyLAorCTB4MTJkOCwgMHgyMTAwLCAweDljMDYsIDB4MDE2OCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTIwNiwgMHgxMTIwLCAweDYwMDQsIDB4OTA4NiwgMHgwMDAyLAorCTB4MDE0MCwgMHg5Y2UwLCAweDAwMWMsIDB4MjAwMSwgMHgxODFhLCAweDIwMDQsIDB4OWMwMiwgMHgxMjIwLAorCTB4MGM0MCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwNGUsIDB4MDBiZSwgMHgwMGNlLAorCTB4MDBlZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDAwMTYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgxODQwLCAweGQ1YTQsIDB4MDExOCwgMHg3MDA0LCAweDgwMDAsIDB4NzAwNiwgMHhkNWI0LAorCTB4MDExOCwgMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHhkNWFjLCAweDAxNzgsIDB4MjUwMCwgMHg5MDg0LAorCTB4MDAwNywgMHg5MDhlLCAweDAwMDMsIDB4MDE0OCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwgMHg5MDhlLAorCTB4MDAwNSwgMHgwMTE4LCAweDIwNzEsIDB4ZmZmNiwgMHgwMDg5LCAweDAwMWUsIDB4MDBlZSwgMHgwMDBlLAorCTB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4ZmZlZSwgMHgwMDIxLCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MmUwNSwgMHg4MDAwLAorCTB4MjA3NywgMHgxMjIwLCAweDhlNzAsIDB4MmUwNSwgMHg4MDAwLCAweDIwNzcsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHhmZmVjLCAweDBjOTksIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhmZmYwLAorCTB4MGM2OSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgxODQwLCAweDcwMTQsIDB4ODAwMCwgMHg3MDE2LCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLAorCTB4MDA4MCwgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLAorCTB4ODAwMCwgMHgzZjA3Cit9OworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMjJpcHhfbGVuZ3RoMDEgPSAweGUwYzI7CisjZWxzZQordW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2xlbmd0aDAxID0gMHhlMGMyOworI2VuZGlmCisKKy8qCisgKgorICovCisKK3Vuc2lnbmVkIGxvbmcgcnNlcWlweF9jb2RlX2FkZHIwMSA9IDB4MDAwMWMwMDAgOwordW5zaWduZWQgc2hvcnQgcnNlcWlweF9jb2RlMDFbXSA9IHsgCisweDAwMGIsIDB4MDAwMywgMHgwMDAwLCAweDA5ZTYsIDB4MDAwMSwgMHhjMDAwLCAweDAwMDgsIDB4ODA2NCwKKwkweDAwMDAsIDB4MDAxMCwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMTAxLCAweDAwMDMsIDB4YzAwNywKKwkweDAwMDgsIDB4ODBlMCwgMHgwMDA4LCAweGZmMDAsIDB4MDAwMCwgMHg4MGUyLCAweDAwMDgsIDB4ZmYwMCwKKwkweDAwMDgsIDB4MDE2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHhhMTAxLCAweDAwMGIsIDB4YzAwZiwKKwkweDAwMDgsIDB4MGQwMiwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDMsIDB4NjBjMiwKKwkweDAwMDMsIDB4NTgxNywgMHgwMDBiLCAweDdhZTMsIDB4MDAwYiwgMHg1MjFjLCAweDAwMGIsIDB4YzgxMywKKwkweDAwMDksIDB4YmFjMCwgMHgwMDAwLCAweDAwOGEsIDB4MDAwMywgMHg4ODEzLCAweDAwMDAsIDB4MTVmYywKKwkweDAwMGIsIDB4YjAxMywgMHgwMDA5LCAweGM0YzAsIDB4MDAwMCwgMHg3MDAwLCAweDAwMDEsIDB4ZmZhMCwKKwkweDAwMDAsIDB4MjAwMCwgMHgwMDAzLCAweDkzOWIsIDB4MDAwOCwgMHg4MDhjLCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMDcsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDAsIDB4MDAwMCwgMHg0MGQ0LCAweDAwMGEsIDB4NDA0NywKKwkweDAwMDgsIDB4ODA4YywgMHgwMDAwLCAweDAwMDIsIDB4MDAwNywgMHgwMDAwLCAweDAwMDMsIDB4MDgyZSwKKwkweDAwMDAsIDB4NDAyMiwgMHgwMDAzLCAweDAwMzQsIDB4MDAwOCwgMHg0MTIyLCAweDAwMDksIDB4ZWFjMCwKKwkweDAwMDgsIDB4ZmYwMCwgMHgwMDA5LCAweGZmZTAsIDB4MDAwOCwgMHgwNTAwLCAweDAwMGIsIDB4MGJjMiwKKwkweDAwMDIsIDB4NDQ0NywgMHgwMDAzLCAweDhiYmYsIDB4MDAwOCwgMHgwYmZlLCAweDAwMDEsIDB4MTFhMCwKKwkweDAwMGIsIDB4MTNhMSwgMHgwMDAxLCAweDBjYTAsIDB4MDAwYiwgMHgxM2ExLCAweDAwMDEsIDB4OTE4MCwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMDksIDB4MDAwYiwgMHhjMDQyLCAweDAwMDgsIDB4ODA4YywKKwkweDAwMDgsIDB4MDAwMCwgMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA0MTEsIDB4MDAwMywgMHhjMDRhLCAweDAwMDAsIDB4MDNmZSwKKwkweDAwMDEsIDB4NDNlMCwgMHgwMDAzLCAweDhiOWUsIDB4MDAwOSwgMHhjMmMwLCAweDAwMDgsIDB4MDBmZiwKKwkweDAwMDEsIDB4MDJlMCwgMHgwMDAzLCAweDhiOWUsIDB4MDAwMSwgMHg5MTgwLCAweDAwMDgsIDB4MDAwNSwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDAxOSwgMHgwMDBiLCAweGMwNTksIDB4MDAwMiwgMHgwMjQwLCAweDAwMGIsIDB4MGI5YiwKKwkweDAwMDgsIDB4MDBmYywgMHgwMDAzLCAweDMzOWUsIDB4MDAwYSwgMHgwMjQ0LCAweDAwMGIsIDB4MDg2YiwKKwkweDAwMGMsIDB4MDFmNSwgMHgwMDAxLCAweDkxODAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMiwgMHgwMjM0LCAweDAwMDgsIDB4N2YwNCwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA0MGEsIDB4MDAwYiwgMHhjMDZhLCAweDAwMGEsIDB4MDI0OCwKKwkweDAwMGIsIDB4MDg3NSwgMHgwMDAxLCAweDkxODAsIDB4MDAwOCwgMHgwMDA2LCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDgsIDB4ODAwMiwgMHgwMDA4LCAweDAwMDMsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDIwYSwKKwkweDAwMGIsIDB4YzA3NCwgMHgwMDAwLCAweDExMmEsIDB4MDAwOCwgMHgwMDJlLCAweDAwMDgsIDB4MDIyYywKKwkweDAwMDIsIDB4M2E0NCwgMHgwMDAzLCAweDg4MTMsIDB4MDAwOCwgMHg4MDhjLCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMDgsIDB4MTc2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwOCwgMHgwMDBmLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAxMSwgMHgwMDBiLCAweGMwODEsIDB4MDAwOCwgMHgwMWZlLCAweDAwMDksIDB4NDJlMCwKKwkweDAwMGIsIDB4OGI4ZSwgMHgwMDAwLCAweDAwZmUsIDB4MDAwMSwgMHg0M2UwLCAweDAwMGIsIDB4OGI4ZSwKKwkweDAwMDAsIDB4MTczNCwgMHgwMDAwLCAweDE1MzAsIDB4MDAwOCwgMHgxNjMyLCAweDAwMDgsIDB4MGQyYSwKKwkweDAwMDEsIDB4OTg4MCwgMHgwMDA4LCAweDAwMTIsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgxZTBhLCAweDAwMGIsIDB4YzA5MywKKwkweDAwMDgsIDB4ODA4YSwgMHgwMDA4LCAweDAwMDMsIDB4MDAwMCwgMHgxYTYwLCAweDAwMDgsIDB4ODA2MiwKKwkweDAwMDAsIDB4MDAwMiwgMHgwMDAzLCAweDU4OTksIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MzY3OSwKKwkweDAwMGIsIDB4YzA5YywgMHgwMDBiLCAweDU4OWQsIDB4MDAwOCwgMHg4MDU0LCAweDAwMDgsIDB4MDAxMSwKKwkweDAwMDAsIDB4ODA3NCwgMHgwMDA4LCAweDEwMTAsIDB4MDAwOCwgMHgxZWZjLCAweDAwMDMsIDB4MzAxMywKKwkweDAwMDQsIDB4MDBhNiwgMHgwMDAzLCAweDAwMTMsIDB4MDAwMCwgMHgxYzYwLCAweDAwMDAsIDB4MWI2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAyMzEsIDB4MDAwYiwgMHhjMGFhLCAweDAwMGIsIDB4NThhYiwKKwkweDAwMDgsIDB4MDE0MCwgMHgwMDAwLCAweDAyNDIsIDB4MDAwMiwgMHgxZjQzLCAweDAwMDMsIDB4ODhiNSwKKwkweDAwMDAsIDB4MGQ0NCwgMHgwMDA4LCAweDBkNDYsIDB4MDAwOCwgMHgwMzQ4LCAweDAwMDgsIDB4MDQ0YSwKKwkweDAwMDMsIDB4MDBiOSwgMHgwMDA4LCAweDAzNDQsIDB4MDAwOCwgMHgwNDQ2LCAweDAwMDgsIDB4MDU0OCwKKwkweDAwMDAsIDB4MDY0YSwgMHgwMDBhLCAweDE5NDgsIDB4MDAwYiwgMHgwOGJjLCAweDAwMDgsIDB4MGQ0YSwKKwkweDAwMGIsIDB4NThiYywgMHgwMDA4LCAweDgwNTQsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDgsIDB4MjAyMCwgMHgwMDBmLCAweDQwMDAsIDB4MDAwMCwgMHg0ODIwLCAweDAwMDgsIDB4MGJmZSwKKwkweDAwMDksIDB4MTBhMCwgMHgwMDAzLCAweDExMjMsIDB4MDAwMSwgMHgwY2EwLCAweDAwMDMsIDB4MTEyMywKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwOSwgMHg5MDgwLCAweDAwMDAsIDB4MDAwOCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMGIsIDB4YzBjZiwKKwkweDAwMDEsIDB4ODBlMCwgMHgwMDA4LCAweDAwMDMsIDB4MDAwYiwgMHg4OTIzLCAweDAwMDAsIDB4NDliNCwKKwkweDAwMDIsIDB4NGI0ZSwgMHgwMDBiLCAweDg5MmMsIDB4MDAwOCwgMHg4MDhhLCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMDAsIDB4MThmZSwgMHgwMDAxLCAweDEwZTAsIDB4MDAwYiwgMHg4OGRkLCAweDAwMDIsIDB4MTkyZiwKKwkweDAwMDgsIDB4N2YzMiwgMHgwMDA4LCAweDE1ZmUsIDB4MDAwMSwgMHgxMGUwLCAweDAwMGIsIDB4ODhlMiwKKwkweDAwMDIsIDB4MTYyZiwgMHgwMDA4LCAweDdmMmMsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDksIDB4OTA4MCwgMHgwMDAwLCAweDAwMDcsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDAzLCAweGMwZTksIDB4MDAwYSwgMHgwMDRmLCAweDAwMGIsIDB4ODkxYSwKKwkweDAwMGEsIDB4MDA0MCwgMHgwMDAzLCAweDA5MDQsIDB4MDAwMiwgMHgwMDRlLCAweDAwMDMsIDB4MDkwNCwKKwkweDAwMDIsIDB4MDAzMCwgMHgwMDAyLCAweDdmMmYsIDB4MDAwMCwgMHg3ZjAwLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAwYSwgMHgwMDBiLCAweGMwZjUsIDB4MDAwOCwgMHgxMDEwLCAweDAwMDQsIDB4MDFkYywKKwkweDAwMGIsIDB4YjBmZCwgMHgwMDBjLCAweDAzNjIsIDB4MDAwYywgMHgwMWM2LCAweDAwMGIsIDB4NzgxNCwKKwkweDAwMDMsIDB4MDAxMywgMHgwMDAwLCAweDA4MDYsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAxZiwKKwkweDAwMGMsIDB4MDM2MiwgMHgwMDAwLCAweDAzMTAsIDB4MDAwYywgMHgwMzYyLCAweDAwMDMsIDB4MDBmYiwKKwkweDAwMGEsIDB4MDAyZiwgMHgwMDAwLCAweDdmMDAsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDAwYSwKKwkweDAwMGIsIDB4YzEwOCwgMHgwMDBjLCAweDAxOWYsIDB4MDAwYSwgMHgwMDQwLCAweDAwMGIsIDB4MDkxZCwKKwkweDAwMGMsIDB4MDIwYywgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDAsIDB4ODA2MCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDA5LCAweDkwODAsIDB4MDAwOCwgMHgwMDA2LCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMGEsIDB4MDAwYiwgMHhjMTE2LCAweDAwMDAsIDB4ODA3MiwKKwkweDAwMDAsIDB4NDAwMCwgMHgwMDAzLCAweDAwZmIsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDgsIDB4MDAxZSwKKwkweDAwMGIsIDB4MDExZiwgMHgwMDA4LCAweDgwMTAsIDB4MDAwOCwgMHgwMDFkLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDgsIDB4MTAxMCwgMHgwMDBjLCAweDAzNjIsIDB4MDAwYiwgMHgwMDE0LCAweDAwMDIsIDB4NGI0ZSwKKwkweDAwMDMsIDB4MDkyOSwgMHgwMDA4LCAweDgwOGEsIDB4MDAwMCwgMHgwMDA0LCAweDAwMGIsIDB4NjEyOSwKKwkweDAwMGYsIDB4ODAwMCwgMHgwMDA4LCAweDgwOGEsIDB4MDAwMCwgMHgwMDA0LCAweDAwMGIsIDB4MDAxNCwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwOSwgMHg5MDgwLCAweDAwMDgsIDB4MDAxMSwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDMsIDB4YzEzMywKKwkweDAwMGEsIDB4MDA0ZiwgMHgwMDAzLCAweDg5OTAsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDksIDB4OTA4MCwgMHgwMDA4LCAweDAwMDUsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBiLCAweGMxM2QsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwKKwkweDAwMDAsIDB4MDAxZiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMjA5LCAweDAwMGIsIDB4YzE0MywKKwkweDAwMGEsIDB4MDE0YiwgMHgwMDBiLCAweDA5OTAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwZiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDAyMTEsIDB4MDAwYiwgMHhjMTRhLCAweDAwMDgsIDB4MDFmZSwKKwkweDAwMDEsIDB4MDJkMCwgMHgwMDAzLCAweDg5OTAsIDB4MDAwNCwgMHgwMWE4LCAweDAwMGIsIDB4MDk5MCwKKwkweDAwMDgsIDB4MDNhMCwgMHgwMDA4LCAweDgwMDQsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDAsIDB4ODAwNiwKKwkweDAwMDAsIDB4MDA0MywgMHgwMDA4LCAweDQ5MDgsIDB4MDAwOCwgMHg4MDhhLCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwOSwgMHg5MDgwLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwNDFhLCAweDAwMDMsIDB4YzE1ZiwKKwkweDAwMGIsIDB4ZTE2MCwgMHgwMDA4LCAweDQ5MDgsIDB4MDAwOCwgMHg0ODBhLCAweDAwMDgsIDB4ODA4YSwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAyYiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA0MTEsIDB4MDAwMywgMHhjMTZhLCAweDAwMDgsIDB4MDRmZSwKKwkweDAwMDksIDB4MDJhMCwgMHgwMDAzLCAweDkxNzEsIDB4MDAwMiwgMHgwNTAwLCAweDAwMGIsIDB4MDk4ZCwKKwkweDAwMDMsIDB4MDE3MiwgMHgwMDAwLCAweDA1ZmUsIDB4MDAwMSwgMHgwM2EwLCAweDAwMGIsIDB4MTE4ZCwKKwkweDAwMDAsIDB4MGQwYywgMHgwMDA4LCAweDBkMGUsIDB4MDAwOCwgMHgwZDEwLCAweDAwMDAsIDB4MGQxMiwKKwkweDAwMDgsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwMCwgMHgwMDBkLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDgzMiwgMHgwMDAzLCAweGMxN2QsIDB4MDAwMCwgMHg4MDBhLCAweDAwMDAsIDB4ODAwNSwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwOSwgMHg5MDgwLCAweDAwMDgsIDB4MDAxMSwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwYTEyLCAweDAwMDMsIDB4YzE4NywKKwkweDAwMDgsIDB4NTAwNiwgMHgwMDA4LCAweDEwMGUsIDB4MDAwNCwgMHgwMWIzLCAweDAwMGIsIDB4NzgxNCwKKwkweDAwMDMsIDB4MDAxMywgMHgwMDA4LCAweDAyMDgsIDB4MDAwOCwgMHgwMzBhLCAweDAwMDMsIDB4MDE3NCwKKwkweDAwMGMsIDB4MDE5ZiwgMHgwMDA4LCAweDgwOGEsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDgsIDB4MDAyMSwgMHgwMDBjLCAweDAzNjIsIDB4MDAwOCwgMHgxMDEwLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDAsIDB4NDgxMCwgMHgwMDBjLCAweDAzNjIsIDB4MDAwOCwgMHg0OTEwLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDgsIDB4ODA4YSwgMHgwMDAwLCAweDAwMDQsIDB4MDAwYiwgMHgwMDE0LCAweDAwMDAsIDB4ODA2MCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDA5LCAweDkwODAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweGI0MGEsIDB4MDAwMywgMHhjMWE2LCAweDAwMGYsIDB4NDAwMCwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHgwYTYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDQxMSwgMHgwMDBiLCAweGMxYWQsIDB4MDAwMiwgMHgwMjEwLCAweDAwMDEsIDB4ZmZjMCwKKwkweDAwMDAsIDB4MDAwNywgMHgwMDA5LCAweDAzZTAsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDAsIDB4ODA2MCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweDgzODAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDksIDB4MGE4MCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwZTBhLCAweDAwMDMsIDB4YzFiYiwKKwkweDAwMDIsIDB4MDMwMCwgMHgwMDAxLCAweGZmYzAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDAsIDB4N2YwNiwKKwkweDAwMDIsIDB4MGEwMCwgMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDYwYSwKKwkweDAwMGIsIDB4YzFjNCwgMHgwMDBmLCAweDQwMDAsIDB4MDAwMCwgMHgwZGEwLCAweDAwMDgsIDB4MGRhMiwKKwkweDAwMDgsIDB4MGRhNCwgMHgwMDA5LCAweDg4ODAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4YTAxMiwKKwkweDAwMDAsIDB4MGRhNiwgMHgwMDA4LCAweDBkYTgsIDB4MDAwMCwgMHgwZGFhLCAweDAwMDAsIDB4MGRhYywKKwkweDAwMDMsIDB4YzFkNCwgMHgwMDA5LCAweDg4ODAsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweGEwM2EsIDB4MDAwYiwgMHhjMWRhLCAweDAwMGYsIDB4NDAwMCwKKwkweDAwMDksIDB4ODg4MCwgMHgwMDA4LCAweDAwMDUsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwMDA5LCAweDAwMGIsIDB4YzFlMywKKwkweDAwMDgsIDB4MDA2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwMCwgMHgwMDBkLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAyMSwgMHgwMDBiLCAweGMxZTksIDB4MDAwMCwgMHgwMGZlLCAweDAwMDEsIDB4MDFkMCwKKwkweDAwMGIsIDB4ODlmMiwgMHgwMDA4LCAweDAyZmUsIDB4MDAwOSwgMHgwM2QwLCAweDAwMDMsIDB4MDlmMiwKKwkweDAwMDAsIDB4MGQwNiwgMHgwMDBmLCAweDQwMDAsIDB4MDAwMCwgMHg4MDA2LCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMGYsIDB4NDAwMCwgMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAyYiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweGEwNDEsIDB4MDAwMywgMHhjMWZhLCAweDAwMDIsIDB4MDI0MywKKwkweDAwMGIsIDB4OGEwMSwgMHgwMDAwLCAweDU0YWMsIDB4MDAwMCwgMHg1NWFlLCAweDAwMDgsIDB4MGRhOCwKKwkweDAwMDAsIDB4MGRhYSwgMHgwMDAwLCAweDUwYjAsIDB4MDAwMCwgMHg1MWIyLCAweDAwMDAsIDB4MGRiNCwKKwkweDAwMDgsIDB4MGRiNiwgMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwNywKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweGE0NTIsIDB4MDAwMywgMHhjMjBhLCAweDAwMGYsIDB4NDAwMCwKKwkweDAwMGEsIDB4Mzk0NSwgMHgwMDBiLCAweDhhMTYsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDgsIDB4NDA0MCwKKwkweDAwMDcsIDB4MDAwMCwgMHgwMDBhLCAweDM5NDUsIDB4MDAwMywgMHg4YTE0LCAweDAwMGYsIDB4NDAwMCwKKwkweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDQwMDAsIDB4MDAwNywgMHgwMDAwLCAweDAwMDcsIDB4MDAwMCwKKwkweDAwMDcsIDB4MDAwMCwgMHgwMDBhLCAweDM5NDUsIDB4MDAwMywgMHgwYTBlLCAweDAwMGIsIDB4MDIxNiwKKwkweDAwMGEsIDB4M2E0MCwgMHgwMDBiLCAweDg4MTcsIDB4MDAwMSwgMHhhYmQwLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDAsIDB4N2YyNCwgMHgwMDBiLCAweDVhMjEsIDB4MDAwOCwgMHg4MDU0LCAweDAwMDAsIDB4MDAwMiwKKwkweDAwMDIsIDB4MTI0MiwgMHgwMDAzLCAweDBhNjcsIDB4MDAwYSwgMHgzYTQ1LCAweDAwMGIsIDB4MGE1NiwKKwkweDAwMGEsIDB4MWUxMCwgMHgwMDAwLCAweDdmM2MsIDB4MDAwYiwgMHgwYTUzLCAweDAwMDIsIDB4MWQwMCwKKwkweDAwMDAsIDB4N2YzYSwgMHgwMDAwLCAweDBkNjAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBiLCAweGMyMzEsIDB4MDAwOCwgMHgwMGZjLCAweDAwMGIsIDB4YjI1MCwKKwkweDAwMDAsIDB4MWM2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDAzLCAweGMyMzksIDB4MDAwOCwgMHgwMGZjLCAweDAwMGIsIDB4MzM3NywKKwkweDAwMDAsIDB4MDAzOCwgMHgwMDA4LCAweDAwNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAxOSwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMDksIDB4MDAwMywgMHhjMjQyLCAweDAwMDksIDB4ODBjMCwKKwkweDAwMDgsIDB4MDBmZiwgMHgwMDA4LCAweDdmM2UsIDB4MDAwMCwgMHgwZDYwLCAweDAwMDgsIDB4MGVmZSwKKwkweDAwMDEsIDB4MWY4MCwgMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDAwOSwKKwkweDAwMGIsIDB4YzI0YywgMHgwMDA4LCAweDAwM2EsIDB4MDAwMCwgMHgxZGZlLCAweDAwMDMsIDB4MDIyZCwKKwkweDAwMDgsIDB4MDAzNiwgMHgwMDA0LCAweDAwYTYsIDB4MDAwYiwgMHgwMjY3LCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDAsIDB4MjAwMCwgMHgwMDBiLCAweDAyNjcsIDB4MDAwMiwgMHgzYTQ0LCAweDAwMGIsIDB4MGJhNCwKKwkweDAwMDAsIDB4ODA3NCwgMHgwMDAwLCAweDEwMDAsIDB4MDAwMSwgMHhhZGQwLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDgsIDB4N2YwZSwgMHgwMDAzLCAweGIzNzQsIDB4MDAwMSwgMHhhN2QwLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDAsIDB4N2YwMCwgMHgwMDA5LCAweGE2ZDAsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDksIDB4MDBkMCwKKwkweDAwMDMsIDB4OGE3NywgMHgwMDAwLCAweDgwNzQsIDB4MDAwOCwgMHg0MDQwLCAweDAwMDMsIDB4NWE2NywKKwkweDAwMGIsIDB4NTIxYywgMHgwMDBhLCAweDNhNDYsIDB4MDAwMywgMHg4YTc3LCAweDAwMDIsIDB4M2E0NywKKwkweDAwMGIsIDB4MGE3MiwgMHgwMDA4LCAweDgwNTQsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDAsIDB4ODAwMCwgMHgwMDAzLCAweDAyZDcsIDB4MDAwOSwgMHg5MmMwLCAweDAwMDAsIDB4MGZjOCwKKwkweDAwMGIsIDB4MDgxMywgMHgwMDBhLCAweDEyNDYsIDB4MDAwMywgMHg4YjZlLCAweDAwMDAsIDB4MWE2MCwKKwkweDAwMDgsIDB4ODA2MiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MzY3YSwKKwkweDAwMGIsIDB4YzI3YywgMHgwMDA5LCAweDkyYzAsIDB4MDAwOCwgMHgwNzgwLCAweDAwMGIsIDB4OGI4OCwKKwkweDAwMDIsIDB4MTI0YiwgMHgwMDAzLCAweDBhODUsIDB4MDAwMiwgMHgyZTRkLCAweDAwMDIsIDB4MmU0ZCwKKwkweDAwMDMsIDB4MGI3NCwgMHgwMDBhLCAweDNhNDYsIDB4MDAwMywgMHg4YTk1LCAweDAwMGIsIDB4NWE4NywKKwkweDAwMDgsIDB4ODA1NCwgMHgwMDAwLCAweDAwMDQsIDB4MDAwYSwgMHgxMjQzLCAweDAwMDMsIDB4MGFkNSwKKwkweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMGQsIDB4MDAwYywgMHgwMzYyLCAweDAwMGEsIDB4MTk0OCwKKwkweDAwMDMsIDB4MGE5MiwgMHgwMDBjLCAweDAzNTcsIDB4MDAwMCwgMHgxODEwLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMGIsIDB4MDJkNSwgMHgwMDBhLCAweDE5NDgsIDB4MDAwYiwgMHgwYTk5LCAweDAwMGEsIDB4MTI0MywKKwkweDAwMDMsIDB4MGI3NywgMHgwMDBhLCAweDE5NGQsIDB4MDAwMywgMHgwYTlkLCAweDAwMGEsIDB4MTI0MywKKwkweDAwMDMsIDB4MGI3ZSwgMHgwMDAzLCAweDVhOWQsIDB4MDAwOCwgMHg4MDU0LCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMGEsIDB4MTkyZSwgMHgwMDA4LCAweDdmMzIsIDB4MDAwYSwgMHgxOTQ3LCAweDAwMGIsIDB4MGFjZiwKKwkweDAwMDIsIDB4MTk0ZiwgMHgwMDAzLCAweDBhYWQsIDB4MDAwYywgMHgwMzU3LCAweDAwMDAsIDB4MTgxMCwKKwkweDAwMDQsIDB4MDFkYywgMHgwMDAzLCAweGIyYzgsIDB4MDAwYywgMHgwMzYyLCAweDAwMGMsIDB4MDFjNiwKKwkweDAwMGIsIDB4MDJkNSwgMHgwMDAwLCAweDFhNjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAxZiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMDksIDB4MDAwMywgMHhjMmIyLCAweDAwMGEsIDB4MDA0YywKKwkweDAwMDMsIDB4OGFjZiwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4OTg4MCwKKwkweDAwMDAsIDB4MDAwNywgMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MzIwYSwKKwkweDAwMGIsIDB4YzJiYywgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4OTg4MCwKKwkweDAwMDgsIDB4MDAxMiwgMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MWUwYSwKKwkweDAwMGIsIDB4YzJjNCwgMHgwMDAwLCAweDE4MjYsIDB4MDAwMCwgMHgxOTI4LCAweDAwMGIsIDB4MDJkNSwKKwkweDAwMDAsIDB4MDgwNiwgMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDFmLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDAsIDB4MDMxMCwgMHgwMDBjLCAweDAzNjIsIDB4MDAwYiwgMHgwMmQ1LCAweDAwMGMsIDB4MDM1NywKKwkweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwYywgMHgwMzYyLCAweDAwMDAsIDB4MTgxMCwKKwkweDAwMGMsIDB4MDM2MiwgMHgwMDAwLCAweDgwNzQsIDB4MDAwOCwgMHhmMDAwLCAweDAwMDAsIDB4MGQzMCwKKwkweDAwMDIsIDB4M2E0MiwgMHgwMDAzLCAweDhhZGQsIDB4MDAwMCwgMHgxNWZjLCAweDAwMGIsIDB4YjA3YSwKKwkweDAwMDMsIDB4MDAxMywgMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHgwNTAxLCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDgsIDB4MDAwYywgMHgwMDBjLCAweDAzNjIsIDB4MDAwMywgMHgwMDEzLCAweDAwMDksIDB4YmJlMCwKKwkweDAwMDgsIDB4MDAzMCwgMHgwMDAzLCAweDhhZjksIDB4MDAwMCwgMHgxOGZlLCAweDAwMDksIDB4M2NlMCwKKwkweDAwMGIsIDB4MGFmNiwgMHgwMDA4LCAweDE1ZmUsIDB4MDAwOSwgMHgzY2UwLCAweDAwMGIsIDB4MGFmNiwKKwkweDAwMDgsIDB4MTNmZSwgMHgwMDA5LCAweDNjZTAsIDB4MDAwYiwgMHg4YWYyLCAweDAwMDQsIDB4MDM1MCwKKwkweDAwMDgsIDB4MGQyNiwgMHgwMDAzLCAweDAyZjMsIDB4MDAwYywgMHgwMzUyLCAweDAwMDgsIDB4ODA3NiwKKwkweDAwMDAsIDB4MDA0MCwgMHgwMDBiLCAweDAzNGQsIDB4MDAwOCwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MSwKKwkweDAwMGIsIDB4MDM0ZCwgMHgwMDA5LCAweGJiZTAsIDB4MDAwMCwgMHgwMDMyLCAweDAwMGIsIDB4OGFmZSwKKwkweDAwMDgsIDB4M2MxZSwgMHgwMDBiLCAweDAzNGQsIDB4MDAwOSwgMHhiYmUwLCAweDAwMDAsIDB4MDAzYiwKKwkweDAwMGIsIDB4OGIwMywgMHgwMDAwLCAweDNjZGMsIDB4MDAwYiwgMHgwMzRkLCAweDAwMDksIDB4YmJlMCwKKwkweDAwMDgsIDB4MDAzNSwgMHgwMDBiLCAweDhiMDksIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwKKwkweDAwMDMsIDB4MDRiMSwgMHgwMDA5LCAweGJiZTAsIDB4MDAwOCwgMHgwMDM2LCAweDAwMDMsIDB4MGJkNCwKKwkweDAwMDksIDB4YmJlMCwgMHgwMDAwLCAweDAwMzcsIDB4MDAwYiwgMHg4YjJlLCAweDAwMDAsIDB4MThmZSwKKwkweDAwMDksIDB4M2NlMCwgMHgwMDAzLCAweDhhZjYsIDB4MDAwOCwgMHg4MDc2LCAweDAwMDAsIDB4MDA0MCwKKwkweDAwMDAsIDB4MWE2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwMCwgMHgwMDBkLCAweDAwMDksIDB4YTZkMCwKKwkweDAwMDgsIDB4MDAwMCwgMHgwMDA4LCAweDdmMDQsIDB4MDAwMSwgMHhhN2QwLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDAsIDB4N2YwNiwgMHgwMDAxLCAweGE4ZDAsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDgsIDB4N2YwOCwKKwkweDAwMDksIDB4YTlkMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwgMHg3ZjBhLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDQyMiwgMHgwMDAzLCAweGMzMjUsIDB4MDAwYywgMHgwMzU3LCAweDAwMDgsIDB4ODA1NCwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweDgwNzQsIDB4MDAwOCwgMHhmMDAwLCAweDAwMDAsIDB4ODA3MiwKKwkweDAwMDAsIDB4ODAwMCwgMHgwMDAzLCAweDAyZDcsIDB4MDAwOSwgMHhiYmUwLCAweDAwMDAsIDB4MDAzOCwKKwkweDAwMDMsIDB4OGI0MCwgMHgwMDAwLCAweDE4ZmUsIDB4MDAwOSwgMHgzY2UwLCAweDAwMGIsIDB4MGIzZCwKKwkweDAwMDgsIDB4MTVmZSwgMHgwMDA5LCAweDNjZTAsIDB4MDAwYiwgMHg4YWVjLCAweDAwMGMsIDB4MDM1MiwKKwkweDAwMDgsIDB4ODA3NiwgMHgwMDAwLCAweDAwNDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwKKwkweDAwMDMsIDB4MDM5YiwgMHgwMDA4LCAweDgwNzYsIDB4MDAwOCwgMHgwMDQyLCAweDAwMGIsIDB4MDM0ZCwKKwkweDAwMDksIDB4YmJlMCwgMHgwMDAwLCAweDAwMTYsIDB4MDAwYiwgMHg4YjRkLCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDgsIDB4MDgwOCwgMHgwMDAyLCAweDNhNDQsIDB4MDAwMywgMHg4ODE2LCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDAsIDB4MDgwMCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMGYsIDB4ODAwMCwKKwkweDAwMDMsIDB4MDAxMywgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDMsIDB4MDAxMywKKwkweDAwMDIsIDB4MTQzMCwgMHgwMDBiLCAweDAzNTMsIDB4MDAwYSwgMHgzZDMwLCAweDAwMDAsIDB4N2YwMCwKKwkweDAwMDEsIDB4YmM4MCwgMHgwMDAwLCAweDAwMDcsIDB4MDAwMywgMHgwMzViLCAweDAwMGEsIDB4MTkzMCwKKwkweDAwMDAsIDB4N2YwMCwgMHgwMDAxLCAweDk4ODAsIDB4MDAwMCwgMHgwMDA3LCAweDAwMDAsIDB4ODA2MCwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDgsIDB4MDAwYSwKKwkweDAwMGIsIDB4YzM2MCwgMHgwMDBmLCAweDQwMDAsIDB4MDAwYiwgMHgyMzYyLCAweDAwMDgsIDB4MDg3MCwKKwkweDAwMGYsIDB4NDAwMCwgMHgwMDA5LCAweGJhYzAsIDB4MDAwOCwgMHgwMDkwLCAweDAwMGIsIDB4MGI2YiwKKwkweDAwMDAsIDB4ODA3NCwgMHgwMDAwLCAweDA3MDYsIDB4MDAwMywgMHgwMzZkLCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDAsIDB4MDcwMywgMHgwMDBmLCAweDQwMDAsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAyMywKKwkweDAwMGIsIDB4MDNhOSwgMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDA4LCAweDAwMGIsIDB4MDNhOSwKKwkweDAwMDgsIDB4ODAxMCwgMHgwMDA4LCAweDAwMjIsIDB4MDAwYiwgMHgwM2E5LCAweDAwMGMsIDB4MDM1NywKKwkweDAwMDgsIDB4ODAxMCwgMHgwMDAwLCAweDAwMDcsIDB4MDAwYywgMHgwMzYyLCAweDAwMDAsIDB4MTgxMCwKKwkweDAwMGMsIDB4MDM2MiwgMHgwMDAzLCAweDAzYjMsIDB4MDAwYywgMHgwMzU3LCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDgsIDB4MDAxYiwgMHgwMDBjLCAweDAzNjIsIDB4MDAwMCwgMHgxODEwLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDAsIDB4ODA3NCwgMHgwMDAwLCAweGYwODAsIDB4MDAwMCwgMHgwZDMwLCAweDAwMDMsIDB4MDAxMywKKwkweDAwMDgsIDB4ODAxMCwgMHgwMDA4LCAweDAwMDksIDB4MDAwYiwgMHgwM2E5LCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDgsIDB4MDAwNSwgMHgwMDBiLCAweDAzYTksIDB4MDAwYSwgMHgxNjQ4LCAweDAwMGIsIDB4ODg4OCwKKwkweDAwMDgsIDB4ODA4YywgMHgwMDAwLCAweDAwMDEsIDB4MDAwNywgMHgwMDAwLCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDBhLCAweDQxNDMsIDB4MDAwMywgMHgwODg4LCAweDAwMDIsIDB4M2E0NCwKKwkweDAwMDMsIDB4ODgxMywgMHgwMDA4LCAweDBkMmEsIDB4MDAwYiwgMHgwM2E5LCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDgsIDB4MDAwMywgMHgwMDAzLCAweDAzYWIsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAwYiwKKwkweDAwMDMsIDB4MDNhYiwgMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDMsIDB4MDNhYiwKKwkweDAwMDIsIDB4M2E0NywgMHgwMDBiLCAweDhhNjcsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDgsIDB4MDAwNiwKKwkweDAwMDMsIDB4MDNhYiwgMHgwMDAwLCAweDgwNzQsIDB4MDAwOCwgMHhmMDAwLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDQsIDB4MDM2NSwgMHgwMDBhLCAweDNhNDAsIDB4MDAwYiwgMHgwODEzLCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDgsIDB4MDAwYywgMHgwMDBjLCAweDAzNjIsIDB4MDAwMywgMHgwMDEzLCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLCAweDBkMzAsIDB4MDAwMiwgMHgyZTRkLCAweDAwMDIsIDB4MmU0ZCwKKwkweDAwMGIsIDB4MGJiYywgMHgwMDA4LCAweDgwNTQsIDB4MDAwMCwgMHgwMDE5LCAweDAwMDMsIDB4MDAxMywKKwkweDAwMDgsIDB4ODA1NCwgMHgwMDA4LCAweDAwMDksIDB4MDAwMywgMHgwMDEzLCAweDAwMDIsIDB4M2E0NCwKKwkweDAwMDMsIDB4ODgxMywgMHgwMDAzLCAweDAzOWUsIDB4MDAwOCwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDIsIDB4NDQ0NywgMHgwMDAzLCAweDBiZTgsIDB4MDAwMSwgMHhjMGMwLCAweDAwMDgsIDB4MDBmZiwKKwkweDAwMDksIDB4ZmZlMCwgMHgwMDA4LCAweDAwZmYsIDB4MDAwMywgMHg4YmJmLCAweDAwMDEsIDB4YzFlMCwKKwkweDAwMDgsIDB4ZmZmZiwgMHgwMDAzLCAweDhiYmYsIDB4MDAwOCwgMHg4MDEwLCAweDAwMDAsIDB4MDAxMywKKwkweDAwMGMsIDB4MDM2MiwgMHgwMDAwLCAweDgwNzQsIDB4MDAwOCwgMHgwMjAyLCAweDAwMDMsIDB4MDAxMywKKwkweDAwMGEsIDB4M2E0MCwgMHgwMDAzLCAweDhiZTUsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsIDB4MDIwMCwKKwkweDAwMDAsIDB4M2QwMCwgMHgwMDAwLCAweDNjZmUsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwKKwkweDAwMDEsIDB4NDNlMCwgMHgwMDAzLCAweDhiZTMsIDB4MDAwMCwgMHg0MmZlLCAweDAwMDEsIDB4ZmZjMCwKKwkweDAwMDgsIDB4MDBmZiwgMHgwMDA5LCAweDAwZTAsIDB4MDAwYiwgMHgwYmJmLCAweDAwMDgsIDB4MGQwOCwKKwkweDAwMGIsIDB4MDQzOCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDMsIDB4MDAxMywKKwkweDAwMDQsIDB4MDRiYSwgMHgwMDA4LCAweDgwOGMsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsIDB4MDRmYywKKwkweDAwMGIsIDB4MzQ5ZCwgMHgwMDAwLCAweDA0NjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDAsIDB4MDAwMSwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDAwMDksIDB4MDAwMywgMHhjM2YyLCAweDAwMDAsIDB4MDAwNCwKKwkweDAwMDksIDB4ODBjMCwgMHgwMDA4LCAweDAwZmYsIDB4MDAwMCwgMHg3ZjAwLCAweDAwMDEsIDB4ODBlMCwKKwkweDAwMDAsIDB4MDAwNCwgMHgwMDBiLCAweDBjMGMsIDB4MDAwMSwgMHg4MGUwLCAweDAwMDgsIDB4MDAwNSwKKwkweDAwMGIsIDB4MGMwYywgMHgwMDAxLCAweDgwZTAsIDB4MDAwOCwgMHgwMDA2LCAweDAwMGIsIDB4MGMwYywKKwkweDAwMDEsIDB4ODJjMCwgMHgwMDA4LCAweGZmMDAsIDB4MDAwOCwgMHg3ZjA0LCAweDAwMDksIDB4ODJlMCwKKwkweDAwMDgsIDB4MDYwMCwgMHgwMDBiLCAweDBjMGMsIDB4MDAwOSwgMHg4MmUwLCAweDAwMDgsIDB4MDUwMCwKKwkweDAwMGIsIDB4MGMwYywgMHgwMDA5LCAweDgyZTAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMGIsIDB4OGM5ZCwKKwkweDAwMDksIDB4YzRjMCwgMHgwMDAwLCAweDcwMDAsIDB4MDAwOSwgMHhmZmUwLCAweDAwMDAsIDB4MTAwMCwKKwkweDAwMDMsIDB4MGMzOCwgMHgwMDA0LCAweDA0YWIsIDB4MDAwMiwgMHgzOTQxLCAweDAwMGIsIDB4MGMxNywKKwkweDAwMDAsIDB4ODA3MiwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMywgMHgwMDEzLCAweDAwMDAsIDB4MDQ2MCwKKwkweDAwMDgsIDB4ODBmZSwgMHgwMDA4LCAweDAwMmIsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MjIwOSwgMHgwMDAzLCAweGM0MWQsIDB4MDAwOCwgMHgxMWZjLCAweDAwMDMsIDB4MzQzMywKKwkweDAwMDEsIDB4OTE4MCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwOCwgMHgwNjA5LCAweDAwMDMsIDB4YzQyNywKKwkweDAwMDAsIDB4NDJmZSwgMHgwMDAxLCAweGZmYzAsIDB4MDAwOCwgMHhmZjAwLCAweDAwMDksIDB4MDNlMCwKKwkweDAwMDMsIDB4OGMzMCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDMsIDB4MDA1MiwKKwkweDAwMDEsIDB4OTE4MCwgMHgwMDA4LCAweDAwMDMsIDB4MDAwYiwgMHgwNDFhLCAweDAwMDAsIDB4ODA3MiwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDA4LCAweDgwMTAsIDB4MDAwMCwgMHgwMDEwLCAweDAwMDMsIDB4MDQ5MCwKKwkweDAwMDQsIDB4MDRhYiwgMHgwMDAyLCAweDM5NDEsIDB4MDAwMywgMHgwYzNlLCAweDAwMDAsIDB4ODA3MiwKKwkweDAwMDAsIDB4MDQwMCwgMHgwMDAzLCAweDAwMTMsIDB4MDAwNCwgMHgwNDc1LCAweDAwMDgsIDB4MTFmYywKKwkweDAwMDMsIDB4YjQ0NiwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDgsIDB4ODAxMCwKKwkweDAwMDAsIDB4MDAwZSwgMHgwMDAzLCAweDA0OTAsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDAsIDB4MDRmYywgMHgwMDAzLCAweGI0NWIsIDB4MDAwOCwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMCwKKwkweDAwMDEsIDB4OTE4MCwgMHgwMDA4LCAweDAwMDUsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBiLCAweGM0NTEsIDB4MDAwOCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwKKwkweDAwMDgsIDB4MDAxYiwgMHgwMDA4LCAweDQzMDQsIDB4MDAwOCwgMHg0MjA2LCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDQxMiwgMHgwMDAzLCAweGM0NTksIDB4MDAwMywgMHgwNDcyLCAweDAwMDgsIDB4ODA4YywKKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDA0NjAsIDB4MDAwOCwgMHg4MDYyLCAweDAwMDgsIDB4MDAyYiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDA2MDksIDB4MDAwYiwgMHhjNDYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MjIwYSwgMHgwMDAzLCAweGM0NjUsIDB4MDAwMCwgMHg0MmZlLCAweDAwMDEsIDB4ZmZjMCwKKwkweDAwMDgsIDB4ZmYwMCwgMHgwMDA4LCAweDdmMDQsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDEsIDB4OTE4MCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDgsIDB4MDQxYSwgMHgwMDAzLCAweGM0NzEsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDMsIDB4MDA1MiwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDgsIDB4NmI2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDAwLCAweDA0MTEsIDB4MDAwYiwgMHhjNDdhLCAweDAwMDgsIDB4MDJmZSwKKwkweDAwMDksIDB4MDNlMCwgMHgwMDBiLCAweDhjODAsIDB4MDAwMCwgMHgwZDIyLCAweDAwMGYsIDB4NDAwMCwKKwkweDAwMDksIDB4ODI4MCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMSwgMHg2YjgwLCAweDAwMDgsIDB4N2Y2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDIyMDksIDB4MDAwYiwgMHhjNDg2LCAweDAwMGEsIDB4MDIwMCwKKwkweDAwMDEsIDB4ZmZjMCwgMHgwMDAwLCAweDAwMDcsIDB4MDAwMCwgMHg3ZjA2LCAweDAwMDgsIDB4NmI2MiwKKwkweDAwMDAsIDB4ODA2NiwgMHgwMDA4LCAweDA2MGEsIDB4MDAwMywgMHhjNDhlLCAweDAwMGYsIDB4NDAwMCwKKwkweDAwMDIsIDB4M2E0NCwgMHgwMDAzLCAweDg4MTMsIDB4MDAwYSwgMHgyZjQ0LCAweDAwMGEsIDB4MmY0NCwKKwkweDAwMDMsIDB4OGI5ZSwgMHgwMDA4LCAweDgwOGEsIDB4MDAwOCwgMHgwMDAzLCAweDAwMDAsIDB4ODA3NCwKKwkweDAwMDAsIDB4ZjA4MCwgMHgwMDBiLCAweDVjOTksIDB4MDAwOCwgMHg4MDU0LCAweDAwMDAsIDB4MDAxOSwKKwkweDAwMDMsIDB4MDAxMywgMHgwMDAyLCAweDNhNDQsIDB4MDAwMywgMHg4ODEzLCAweDAwMDgsIDB4ODA4YywKKwkweDAwMDgsIDB4MDAwMCwgMHgwMDA4LCAweDgwMTAsIDB4MDAwOCwgMHgwMDExLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDAsIDB4NDJmZSwgMHgwMDAxLCAweGZmYzAsIDB4MDAwOCwgMHgwMGZmLCAweDAwMDgsIDB4N2YxMCwKKwkweDAwMGMsIDB4MDM2MiwgMHgwMDA4LCAweDQzMTAsIDB4MDAwMywgMHgwM2FiLCAweDAwMDIsIDB4Mzk0MSwKKwkweDAwMDMsIDB4MGNhZSwgMHgwMDBmLCAweDQwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDgsIDB4MDQwNCwKKwkweDAwMGYsIDB4NDAwMCwgMHgwMDA4LCAweDgwMTAsIDB4MDAwOCwgMHgwMDEyLCAweDAwMGMsIDB4MDM2MiwKKwkweDAwMDQsIDB4MDQ3NSwgMHgwMDAwLCAweDExMTAsIDB4MDAwYywgMHgwMzYyLCAweDAwMDgsIDB4MTFmYywKKwkweDAwMGIsIDB4YjRiNCwgMHgwMDAzLCAweDAwMTMsIDB4MDAwOSwgMHhjMmMwLCAweDAwMDgsIDB4MDBmZiwKKwkweDAwMDAsIDB4N2YwMCwgMHgwMDAxLCAweGMzYzAsIDB4MDAwOCwgMHhmZjAwLCAweDAwMDksIDB4MDBkMCwKKwkweDAwMDMsIDB4MGNkZiwgMHgwMDAwLCAweDBkMGEsIDB4MDAwMSwgMHg4NTgwLCAweDAwMDAsIDB4MTAwMCwKKwkweDAwMDgsIDB4N2Y2MiwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDgwOSwgMHgwMDAzLCAweGM0YzksIDB4MDAwMCwgMHgwNGZjLCAweDAwMDMsIDB4MzRkOCwKKwkweDAwMDAsIDB4MDQ2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDIxMSwgMHgwMDAzLCAweGM0ZDEsIDB4MDAwOCwgMHgwMWZlLCAweDAwMDksIDB4MDBlMCwKKwkweDAwMDMsIDB4OGNkOCwgMHgwMDA4LCAweDAyZmUsIDB4MDAwMSwgMHg0M2UwLCAweDAwMGIsIDB4MGNkZSwKKwkweDAwMDIsIDB4MDUwMCwgMHgwMDAwLCAweDdmMGEsIDB4MDAwOSwgMHhmZmUwLCAweDAwMDAsIDB4MDgwMCwKKwkweDAwMGIsIDB4OGNjMiwgMHgwMDA4LCAweDBkMDgsIDB4MDAwZiwgMHg0MDAwLCAweDAwMDgsIDB4NDNmZSwKKwkweDAwMDEsIDB4M2U4MCwgMHgwMDAwLCAweDBkNjAsIDB4MDAwOCwgMHg3ZjYyLCAweDAwMDAsIDB4ODA2NiwKKwkweDAwMDAsIDB4MDgwOSwgMHgwMDBiLCAweGM0ZTUsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwKKwkweDAwMDEsIDB4ODRjMCwgMHgwMDA4LCAweGZmMDAsIDB4MDAwMiwgMHg3ZjcwLCAweDAwMDksIDB4ZmY4MCwKKwkweDAwMDAsIDB4MTAwMCwgMHgwMDA4LCAweDdmNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDgwOSwKKwkweDAwMDMsIDB4YzRmMCwgMHgwMDBmLCAweDQwMDAsIDB4ZTUwNCwgMHgzMzM0Cit9OwordW5zaWduZWQgc2hvcnQgcnNlcWlweF9jb2RlX2xlbmd0aDAxID0gMHgwOWU2OworLyoKKyAqCisgKi8KKwordW5zaWduZWQgbG9uZyB4c2VxaXB4X2NvZGVfYWRkcjAxID0gMHgwMDAxZTAwMCA7Cit1bnNpZ25lZCBzaG9ydCB4c2VxaXB4X2NvZGUwMVtdID0geyAKKzB4MDAxMywgMHgwMDAzLCAweDAwMDAsIDB4MTBkNiwgMHgwMDAxLCAweGUwMDAsIDB4MDAwNSwgMHgwMDMyLAorCTB4MDAwMCwgMHgwMDEwLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGJiMzksIDB4MDAwYiwgMHg4MDA3LAorCTB4MDAwNCwgMHgwMTBiLCAweDAwMTQsIDB4MDExZCwgMHgwMDEwLCAweGMwMDAsIDB4MDAwMCwgMHhjMDAxLAorCTB4MDAwMCwgMHhjMGIwLCAweDAwMTAsIDB4YzBiMSwgMHgwMDEwLCAweGMwYjIsIDB4MDAwMCwgMHhjMGIzLAorCTB4MDAxMCwgMHhjMGI0LCAweDAwMDAsIDB4YzBiNSwgMHgwMDAwLCAweGMwYjYsIDB4MDAxMCwgMHhjMGI3LAorCTB4MDAxMCwgMHhjMGI4LCAweDAwMDAsIDB4YzBiOSwgMHgwMDAwLCAweGMwYmEsIDB4MDAwMCwgMHhjMGMyLAorCTB4MDAxMCwgMHhjMGMzLCAweDAwMDAsIDB4YzBjNCwgMHgwMDEwLCAweGMwYzUsIDB4MDAxMCwgMHhjMGM2LAorCTB4MDAwMCwgMHhjMGM3LCAweDAwMDAsIDB4YzBjOCwgMHgwMDEwLCAweGMwYzksIDB4MDAxMCwgMHhjMGNhLAorCTB4MDAwMCwgMHhjMGNiLCAweDAwMTAsIDB4YzBjYywgMHgwMDAwLCAweGMwY2QsIDB4MDAwMCwgMHhjMGNlLAorCTB4MDAxMCwgMHhjMGNmLCAweDAwMTUsIDB4MDAzOSwgMHgwMDEwLCAweGZmMDAsIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAxMCwgMHhmZjAwLCAweDAwMDUsIDB4MDBkMCwgMHgwMDEwLCAweGZmMDAsIDB4MDAxNSwgMHgwMGQxLAorCTB4MDAxMCwgMHhmZjAwLCAweDAwMTIsIDB4M2E0MCwgMHgwMDBiLCAweDEwMzEsIDB4MDAwMiwgMHg3OTQwLAorCTB4MDAxYiwgMHgxMTJmLCAweDAwMDIsIDB4M2E0MiwgMHgwMDFiLCAweDEwMzUsIDB4MDAwMywgMHhiMDM1LAorCTB4MDAxMywgMHhhMWRjLCAweDAwMDIsIDB4M2E0MSwgMHgwMDFiLCAweDEwMzksIDB4MDAxMiwgMHg3OTQxLAorCTB4MDAxYiwgMHgxMzExLCAweDAwMDMsIDB4ZTA1NSwgMHgwMDEyLCAweGQwNDIsIDB4MDAwMywgMHgxMDNmLAorCTB4MDAwMCwgMHg3NWZmLCAweDAwMDIsIDB4ZmY0MSwgMHgwMDFiLCAweDEwNTUsIDB4MDAwMCwgMHgwY2ZlLAorCTB4MDAwMywgMHg2MDQ5LCAweDAwMDIsIDB4M2E0NCwgMHgwMDBiLCAweDEwNDksIDB4MDAxMSwgMHgwMmU4LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMTMsIDB4MTNhMiwgMHgwMDExLCAweDAyZTgsIDB4MDAxMCwgMHgwMDA1LAorCTB4MDAwMywgMHgxNDMyLCAweDAwMTIsIDB4M2E0NiwgMHgwMDFiLCAweDEwNTUsIDB4MDAxMiwgMHhkMDQyLAorCTB4MDAwMywgMHgxMDUwLCAweDAwMDAsIDB4NzVmZiwgMHgwMDEyLCAweGZmNDAsIDB4MDAxYiwgMHgxMDU1LAorCTB4MDAwMCwgMHgxMmZlLCAweDAwMTMsIDB4NjA1NSwgMHgwMDAxLCAweDBmZTgsIDB4MDAxMCwgMHgwMDAwLAorCTB4MDAwMywgMHgxNjNmLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMCwgMHhjMTMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjIxMSwgMHgwMDFiLCAweDgwNWEsIDB4MDAxMCwgMHhiMmZmLAorCTB4MDAwMSwgMHhiM2UwLCAweDAwMWMsIDB4MTBjZCwgMHgwMDBiLCAweGYwMmQsIDB4MDAxMSwgMHgzYmU4LAorCTB4MDAwMCwgMHgwMDEwLCAweDAwMWIsIDB4MTA3MiwgMHgwMDAwLCAweDBhZmUsIDB4MDAwYiwgMHg2MDY2LAorCTB4MDAwMCwgMHgzYzBiLCAweDAwMDMsIDB4MDA2ZSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAwMSwgMHgwYTg4LCAweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHgzYzBhLCAweDAwMGIsIDB4ODA2ZCwgMHgwMDEwLCAweDNjMGEsIDB4MDAwMiwgMHgwYzAwLAorCTB4MDAxMCwgMHhmZjBjLCAweDAwMTMsIDB4MDBjYSwgMHgwMDExLCAweDNiZTgsIDB4MDAxMCwgMHgwMDEyLAorCTB4MDAwYiwgMHgxMDg1LCAweDAwMTAsIDB4MDhmZSwgMHgwMDFiLCAweDYwNzksIDB4MDAxMCwgMHgzYzA5LAorCTB4MDAxMywgMHgwMDgxLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwODg4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHgzYzBhLAorCTB4MDAwYiwgMHg4MDgwLCAweDAwMDAsIDB4M2MwOCwgMHgwMDAyLCAweDBjMDAsIDB4MDAxMCwgMHhmZjBjLAorCTB4MDAxMywgMHgwMGNhLCAweDAwMTEsIDB4M2JlOCwgMHgwMDAwLCAweDAwMTMsIDB4MDAxYiwgMHgxMDhiLAorCTB4MDAwMCwgMHgzY2IwLCAweDAwMDQsIDB4MDBkZCwgMHgwMDEzLCAweDAwY2EsIDB4MDAxMSwgMHgzYmU4LAorCTB4MDAwMCwgMHgwMDE5LCAweDAwMGIsIDB4MTA5ZSwgMHgwMDEwLCAweDA0ZmUsIDB4MDAxYiwgMHg2MDkyLAorCTB4MDAxMCwgMHgzYzA1LCAweDAwMTMsIDB4MDA5YSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgwNDg4LCAweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHgzYzBhLCAweDAwMWIsIDB4ODA5OSwgMHgwMDAwLCAweDNjMDQsIDB4MDAwMiwgMHgwYzAwLAorCTB4MDAxMCwgMHhmZjBjLCAweDAwMTMsIDB4MDBjYSwgMHgwMDExLCAweDNiZTgsIDB4MDAwMCwgMHgwMDE1LAorCTB4MDAxYiwgMHgxMGFhLCAweDAwMTQsIDB4MDExNCwgMHgwMDA0LCAweDAxMjYsIDB4MDAxNSwgMHgwMDM5LAorCTB4MDAwMCwgMHg4MDAwLCAweDAwMTcsIDB4ODAwMCwgMHgwMDA0LCAweDAxMGIsIDB4MDAxNCwgMHgwMTFkLAorCTB4MDAwNCwgMHgwMGY2LCAweDAwMTMsIDB4MDAyZCwgMHgwMDExLCAweDNiZTgsIDB4MDAwMCwgMHgwMDE2LAorCTB4MDAwYiwgMHgxMGJjLCAweDAwMDEsIDB4MGZlOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAxMywgMHgxMGI2LAorCTB4MDAwMSwgMHgwZmU4LCAweDAwMDAsIDB4MDAwMiwgMHgwMDEzLCAweDEwYjYsIDB4MDAxNSwgMHgwMDM5LAorCTB4MDAxMCwgMHgxMDEwLCAweDAwMTMsIDB4MDBjYSwgMHgwMDE1LCAweDAwMzksIDB4MDAwMCwgMHg1MDQwLAorCTB4MDAxNSwgMHgwMGI4LCAweDAwMDAsIDB4MDAwOCwgMHgwMDA0LCAweDA4NjcsIDB4MDAxMywgMHgwMGNhLAorCTB4MDAxMSwgMHgzYmU4LCAweDAwMTAsIDB4MDAxNywgMHgwMDBiLCAweDEwYzEsIDB4MDAxMCwgMHgzY2MzLAorCTB4MDAxMywgMHgwMGNhLCAweDAwMTEsIDB4M2JlOCwgMHgwMDEwLCAweDAwMTgsIDB4MDAxYiwgMHgxMGM2LAorCTB4MDAwMCwgMHgzY2MyLCAweDAwMTMsIDB4MDBjYSwgMHgwMDA1LCAweDAwY2UsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAwMCwgMHgzYmNmLCAweDAwMDQsIDB4MDgyOSwgMHgwMDE1LCAweDAwMzksIDB4MDAwMCwgMHg4MDAwLAorCTB4MDAxMywgMHgwMDJkLCAweDAwMDEsIDB4YjI4OCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMSwgMHhjMTgwLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4MGQzLAorCTB4MDAwMiwgMHhiMjAwLCAweDAwMTEsIDB4ZmZjOCwgMHgwMDAwLCAweDAwMDcsIDB4MDAxMCwgMHhmZmIyLAorCTB4MDAxMCwgMHhjMTMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGIyMGEsIDB4MDAwMSwgMHhiMGQwLAorCTB4MDAwYiwgMHg4MGRjLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHhiMDg4LAorCTB4MDAwMCwgMHgwMDEwLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMTA5LAorCTB4MDAxYiwgMHg4MGU0LCAweDAwMDEsIDB4YjFlOCwgMHgwMDEwLCAweGZmZmYsIDB4MDAwMywgMHgxMGY1LAorCTB4MDAwMCwgMHgxMWZlLCAweDAwMWIsIDB4NjBlYywgMHgwMDAwLCAweGIwMTIsIDB4MDAwMywgMHgwMGY0LAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweDExODgsIDB4MDAxMCwgMHgwMDAzLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMGEsIDB4MDAxYiwgMHg4MGYzLAorCTB4MDAwMCwgMHhiMDExLCAweDAwMTcsIDB4NDAwMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHhiYzg4LCAweDAwMDAsIDB4MDAxZiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhjNDExLCAweDAwMGIsIDB4ODBmZCwgMHgwMDExLCAweGJjODgsIDB4MDAxMCwgMHgwMDE4LAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGM2MDksIDB4MDAwYiwgMHg4MTAzLAorCTB4MDAxMSwgMHhiYzg4LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhjNzA5LCAweDAwMGIsIDB4ODEwOSwgMHgwMDE3LCAweDQwMDAsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4YmI4OCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4MDI2OSwgMHgwMDBiLCAweDgxMTIsIDB4MDAxNywgMHg0MDAwLAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweGJiODgsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweDAyNmEsIDB4MDAwYiwgMHg4MTFiLAorCTB4MDAxNywgMHg0MDAwLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiYjg4LAorCTB4MDAxMCwgMHgwMDBmLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHgwZjU5LAorCTB4MDAwYiwgMHg4MTI0LCAweDAwMTcsIDB4NDAwMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAwMSwgMHhiYjg4LCAweDAwMTAsIDB4MDAwZiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHgwZjVhLCAweDAwMGIsIDB4ODEyZCwgMHgwMDE3LCAweDQwMDAsIDB4MDAwMCwgMHhkMGZmLAorCTB4MDAxMiwgMHhmZjQwLCAweDAwMGIsIDB4MTAzMSwgMHgwMDE1LCAweDAwZDEsIDB4MDAxMCwgMHgwMTAxLAorCTB4MDAxMywgMHg5MTM0LCAweDAwMDUsIDB4MDA3OSwgMHgwMDAwLCAweDAwMDEsIDB4MDAxMywgMHg5MTM3LAorCTB4MDAxNSwgMHgwMGQxLCAweDAwMDAsIDB4MDEwMCwgMHgwMDExLCAweDAyZTgsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAwMywgMHgxMTYxLCAweDAwMTEsIDB4MDJlOCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMywgMHgxMTc5LAorCTB4MDAxMSwgMHgwMmU4LCAweDAwMDAsIDB4MDAwNCwgMHgwMDAzLCAweDExOTcsIDB4MDAxMSwgMHgwMmU4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMDMsIDB4MTFjOCwgMHgwMDA1LCAweDAwMDIsIDB4MDAxMCwgMHgwMDAwLAorCTB4MDAwMCwgMHhjMDBlLCAweDAwMDAsIDB4YzAwZCwgMHgwMDEwLCAweGMwMDMsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4YmQ4OCwgMHgwMDEwLCAweDAwMDksIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwgMHgwMDFiLCAweDgxNTIsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwgMHgwMDBiLCAweDgxNTYsIDB4MDAxMiwgMHgzYTQ1LAorCTB4MDAwMywgMHgxMTVlLCAweDAwMTUsIDB4MDAzYSwgMHgwMDAwLCAweDIwMDAsIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAxMCwgMHgxMDEwLCAweDAwMTQsIDB4MDg1MywgMHgwMDEyLCAweGQwNDIsIDB4MDAxMywgMHgxMDMxLAorCTB4MDAxMywgMHgwMDUwLCAweDAwMTIsIDB4Nzg0OSwgMHgwMDAzLCAweDExZDYsIDB4MDAxMCwgMHgwZGZlLAorCTB4MDAwMywgMHg2MTQ4LCAweDAwMTIsIDB4MGMxMCwgMHgwMDEwLCAweGZmMGMsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjMwOSwgMHgwMDFiLCAweDgxNmUsIDB4MDAxMCwgMHhiM2ZlLAorCTB4MDAxMywgMHg2MTc2LCAweDAwMTAsIDB4YjMwYiwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLAorCTB4MDAwYiwgMHg4MTc0LCAweDAwMTMsIDB4MDFjYiwgMHgwMDAwLCAweGMwMGIsIDB4MDAxMCwgMHhjMDBhLAorCTB4MDAxMywgMHgwMWNiLCAweDAwMDAsIDB4NzhiMCwgMHgwMDEyLCAweGIwNDQsIDB4MDAwMywgMHgxMWQ2LAorCTB4MDAwMiwgMHhiMDQ5LCAweDAwMDMsIDB4MTFkNiwgMHgwMDEwLCAweDcxZmYsIDB4MDAxMiwgMHhmZjM4LAorCTB4MDAxMCwgMHhmZjcxLCAweDAwMTAsIDB4MGRmZSwgMHgwMDEzLCAweDYxNDYsIDB4MDAxMiwgMHgwYzEwLAorCTB4MDAxMCwgMHhmZjBjLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMzA5LAorCTB4MDAxYiwgMHg4MThjLCAweDAwMTAsIDB4YjNmZSwgMHgwMDEzLCAweDYxOTQsIDB4MDAwMCwgMHhiMzA5LAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwgMHgwMDFiLCAweDgxOTIsIDB4MDAxMywgMHgwMWNiLAorCTB4MDAxMCwgMHhjMDA5LCAweDAwMDAsIDB4YzAwOCwgMHgwMDEzLCAweDAxY2IsIDB4MDAwMCwgMHg3OGIwLAorCTB4MDAxMiwgMHhiMDQ0LCAweDAwMDMsIDB4MTFkNiwgMHgwMDAyLCAweGIwNDksIDB4MDAwMywgMHgxMWQ2LAorCTB4MDAxMCwgMHg3MWZmLCAweDAwMTIsIDB4ZmYzOCwgMHgwMDEwLCAweGZmNzEsIDB4MDAxMCwgMHgwZGZlLAorCTB4MDAxMywgMHg2MTQ2LCAweDAwMTIsIDB4MGMxMCwgMHgwMDEwLCAweGZmMGMsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjMwOSwgMHgwMDBiLCAweDgxYWEsIDB4MDAxMCwgMHhiM2ZlLAorCTB4MDAwMywgMHg2MWIyLCAweDAwMDAsIDB4YjMwNSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLAorCTB4MDAxYiwgMHg4MWIwLCAweDAwMDMsIDB4MDFiNCwgMHgwMDEwLCAweGMwMDUsIDB4MDAwMCwgMHhjMDA0LAorCTB4MDAwMiwgMHgwMzNmLCAweDAwMDIsIDB4ZmYyNywgMHgwMDAwLCAweDBkYjgsIDB4MDAxNCwgMHgwMzk3LAorCTB4MDAwMCwgMHgwZGI4LCAweDAwMDQsIDB4MDg2NywgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHhiYzg4LCAweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMzA5LCAweDAwMWIsIDB4ODFjMSwgMHgwMDExLCAweGIzZTgsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAxYiwgMHgxMTQ2LCAweDAwMDUsIDB4MDAwMiwgMHgwMDEwLCAweDAwMDUsIDB4MDAwMywgMHgwMTQ4LAorCTB4MDAxMiwgMHg3ODQ5LCAweDAwMDMsIDB4MTFkNiwgMHgwMDAzLCAweDAxNDgsIDB4MDAwMCwgMHgwZGI4LAorCTB4MDAxMiwgMHgwMzQ1LCAweDAwMGIsIDB4MTFkMSwgMHgwMDAyLCAweDAzM2YsIDB4MDAxNCwgMHgwMzk3LAorCTB4MDAxMywgMHgwMTQ2LCAweDAwMDIsIDB4MDMzZiwgMHgwMDAyLCAweGZmMjcsIDB4MDAxNCwgMHgwMzk3LAorCTB4MDAwNCwgMHgwODY3LCAweDAwMTMsIDB4MDE0NiwgMHgwMDE1LCAweDAwYjgsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAxNSwgMHgwMDNhLCAweDAwMTAsIDB4MDEwMSwgMHgwMDA0LCAweDA4NjcsIDB4MDAxMywgMHgwMTU3LAorCTB4MDAwMSwgMHgyYmQ4LCAweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGZmYmEsIDB4MDAwMywgMHhiMWRmLAorCTB4MDAwNSwgMHgwMDJhLCAweDAwMDAsIDB4MDAwMiwgMHgwMDAxLCAweGJhYzgsIDB4MDAwMCwgMHgwNzAwLAorCTB4MDAwYiwgMHgxMmNjLCAweDAwMTEsIDB4MTVlOCwgMHgwMDAwLCAweDAwMDIsIDB4MDAxMywgMHgxMjQyLAorCTB4MDAxMSwgMHgxNWU4LCAweDAwMDAsIDB4MDAwMSwgMHgwMDEzLCAweDExZWUsIDB4MDAwNSwgMHgwMDE1LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMTMsIDB4MDIyNSwgMHgwMDA1LCAweDAwMTUsIDB4MDAxMCwgMHgwMDAwLAorCTB4MDAwMiwgMHhiYTQzLCAweDAwMDMsIDB4MTIyNiwgMHgwMDAzLCAweGIxZjIsIDB4MDAwNSwgMHgwMDJhLAorCTB4MDAwMCwgMHgwMDA0LCAweDAwMTIsIDB4YmE0MiwgMHgwMDAzLCAweDEyMmMsIDB4MDAxMiwgMHgxMDRiLAorCTB4MDAxYiwgMHgxMjI1LCAweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4MWIyYSwgMHgwMDFiLCAweDgxZmUsIDB4MDAxMSwgMHgyMGQ4LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMDAsIDB4ZmZiMCwgMHgwMDAxLCAweDIxZDgsIDB4MDAxMCwgMHgwMDAwLAorCTB4MDAxMCwgMHhmZmIxLCAweDAwMDEsIDB4MjJkOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAxMCwgMHhmZmIyLAorCTB4MDAxMSwgMHgyM2Q4LCAweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGZmYjMsIDB4MDAwMSwgMHgyNGQ4LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMTAsIDB4ZmZiNCwgMHgwMDExLCAweDI1ZDgsIDB4MDAxMCwgMHgwMDAwLAorCTB4MDAwMCwgMHhmZmI1LCAweDAwMDEsIDB4MjhkOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAxMCwgMHhmZmI4LAorCTB4MDAxMSwgMHgyOWQ4LCAweDAwMTAsIDB4MDAwMCwgMHgwMDAwLCAweGZmYjksIDB4MDAwMCwgMHgxYTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAwNywgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMDMyLAorCTB4MDAxYiwgMHg4MjFjLCAweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAxMCwgMHgwMDBmLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjgxMiwgMHgwMDBiLCAweDgyMjIsIDB4MDAwNSwgMHgwMDE1LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMTMsIDB4MDAzNSwgMHgwMDAwLCAweDFlZmUsIDB4MDAwMywgMHg2MjNhLAorCTB4MDAxNCwgMHgwMjcxLCAweDAwMDAsIDB4MWVmZSwgMHgwMDBjLCAweDYyNzEsIDB4MDAxMywgMHgwMjI1LAorCTB4MDAwMCwgMHgxYTMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMjAsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMWIsIDB4ODIzMSwgMHgwMDAyLCAweGIwMmYsIDB4MDAwMCwgMHhmZmIwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAyMCwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDBhLAorCTB4MDAxYiwgMHg4MjM4LCAweDAwMDMsIDB4MDFmOSwgMHgwMDE1LCAweDAwYjgsIDB4MDAxMCwgMHgwMDA1LAorCTB4MDAwNCwgMHgwODY3LCAweDAwMDAsIDB4MTNiOCwgMHgwMDE1LCAweDAwM2EsIDB4MDAxMCwgMHgwNDA0LAorCTB4MDAwNCwgMHgwODY3LCAweDAwMTMsIDB4MDIyNSwgMHgwMDA1LCAweDAwMTUsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAxMiwgMHhiYTQyLCAweDAwMTMsIDB4MTI1MCwgMHgwMDAzLCAweGIyNDYsIDB4MDAwMSwgMHgyYmQ4LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMTIsIDB4ZmY0ZiwgMHgwMDFiLCAweDExZGMsIDB4MDAwMiwgMHhiYTQzLAorCTB4MDAxYiwgMHgxMjJjLCAweDAwMDAsIDB4MWVmZSwgMHgwMDBjLCAweDYyNzEsIDB4MDAxMywgMHgwMjI1LAorCTB4MDAwMSwgMHgyOGQ4LCAweDAwMTAsIDB4MDAwMCwgMHgwMDEwLCAweGZmYjgsIDB4MDAxMSwgMHgyOWQ4LAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMDAsIDB4ZmZiOSwgMHgwMDE0LCAweDAyZTIsIDB4MDAwMiwgMHgzYTQyLAorCTB4MDAxYiwgMHgxMjI1LCAweDAwMDAsIDB4MWMzMCwgMHgwMDE1LCAweDAwZmYsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAwMiwgMHgxZjQzLCAweDAwMWIsIDB4MTI2MSwgMHgwMDAxLCAweGZmODgsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAwMywgMHgwMjYzLCAweDAwMDEsIDB4ZmY4OCwgMHgwMDAwLCAweDAwMDQsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAxMSwgMHgwMDBiLCAweDgyNjYsIDB4MDAwMCwgMHhiMGZmLAorCTB4MDAxMSwgMHgxNmEwLCAweDAwMDAsIDB4ZmYxNiwgMHgwMDFiLCAweDIyNmQsIDB4MDAwMiwgMHhiMTAwLAorCTB4MDAxMywgMHgwMjZlLCAweDAwMTAsIDB4YjFmZiwgMHgwMDAxLCAweDE3YTAsIDB4MDAxMCwgMHhmZjE3LAorCTB4MDAxMywgMHgwMjJjLCAweDAwMDAsIDB4MTZmZiwgMHgwMDAxLCAweDE4YTAsIDB4MDAxMCwgMHhmZjAwLAorCTB4MDAwYiwgMHgyMjc4LCAweDAwMDIsIDB4MTcwMCwgMHgwMDAzLCAweDEyY2IsIDB4MDAxMywgMHgwMjc5LAorCTB4MDAxMCwgMHgxN2ZmLCAweDAwMTEsIDB4MTlhMCwgMHgwMDAzLCAweDIyY2IsIDB4MDAxMSwgMHgwMGQwLAorCTB4MDAwMywgMHgxMmNiLCAweDAwMDAsIDB4MWMzMCwgMHgwMDAwLCAweDFiMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMTMxLCAweDAwMGIsIDB4ODI4MSwgMHgwMDEzLCAweGIyODIsIDB4MDAwMCwgMHhiMTIwLAorCTB4MDAxMCwgMHhiMjIxLCAweDAwMDIsIDB4MWY0MywgMHgwMDBiLCAweDEyOGUsIDB4MDAxMCwgMHhjMDIyLAorCTB4MDAwMCwgMHhjMDIzLCAweDAwMDAsIDB4YjMyNCwgMHgwMDAwLCAweGI0MjUsIDB4MDAxMCwgMHhiM2I1LAorCTB4MDAwMCwgMHhiNGI2LCAweDAwMTMsIDB4MDI5MiwgMHgwMDAwLCAweGIzMjIsIDB4MDAwMCwgMHhiNDIzLAorCTB4MDAwMCwgMHhiNTI0LCAweDAwMTAsIDB4YjYyNSwgMHgwMDAzLCAweGIyOTIsIDB4MDAwNSwgMHgwMDJhLAorCTB4MDAwMCwgMHgwMDAxLCAweDAwMTIsIDB4MTUwMCwgMHgwMDAwLCAweGZmMTUsIDB4MDAwMCwgMHgxNmZmLAorCTB4MDAwMSwgMHhiNTgwLCAweDAwMDAsIDB4ZmYxNiwgMHgwMDFiLCAweDIyOWQsIDB4MDAwMiwgMHgxNzAwLAorCTB4MDAxMywgMHgwMjllLCAweDAwMTAsIDB4MTdmZiwgMHgwMDAxLCAweGI2ODAsIDB4MDAxMCwgMHhmZjE3LAorCTB4MDAxMiwgMHgxZTEwLCAweDAwMTAsIDB4ZmYxZSwgMHgwMDEzLCAweDYyY2IsIDB4MDAwMiwgMHgxZDAwLAorCTB4MDAxMCwgMHhmZjFkLCAweDAwMTAsIDB4YzAzMCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODJhOSwgMHgwMDEwLCAweGIwZmUsIDB4MDAxYiwgMHg2MmNhLAorCTB4MDAwMCwgMHgxYzMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMDEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODJiMSwgMHgwMDEwLCAweGIwZmUsIDB4MDAxYiwgMHg2MmI3LAorCTB4MDAwNSwgMHgwMGNlLCAweDAwMTAsIDB4MDAwNSwgMHgwMDEzLCAweDA4MjksIDB4MDAxMCwgMHhiMDFjLAorCTB4MDAwMCwgMHgxYzMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMTksIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODJiZCwgMHgwMDAxLCAweGIwYzgsIDB4MDAxMCwgMHgwMGZmLAorCTB4MDAwMCwgMHhmZjFmLCAweDAwMTAsIDB4YzAzMCwgMHgwMDExLCAweGJlODAsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDgyYzYsIDB4MDAwMCwgMHhiMDFkLAorCTB4MDAxMCwgMHgxZGZmLCAweDAwMDMsIDB4MDJhNSwgMHgwMDAwLCAweGIwMWIsIDB4MDAxNywgMHg0MDAwLAorCTB4MDAwMiwgMHgzYTQxLCAweDAwMTMsIDB4MTJkNCwgMHgwMDAzLCAweGIyY2UsIDB4MDAwNSwgMHgwMDJhLAorCTB4MDAwMCwgMHgwMDA0LCAweDAwMDUsIDB4MDAxNSwgMHgwMDEwLCAweDAwMDAsIDB4MDAxMywgMHgwMjI1LAorCTB4MDAwMCwgMHgxYTMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHgxYjJhLCAweDAwMWIsIDB4ODJkOSwgMHgwMDE1LCAweDAwYjgsIDB4MDAwMCwgMHgwMDA0LAorCTB4MDAwNCwgMHgwODY3LCAweDAwMDAsIDB4MTNiOCwgMHgwMDE1LCAweDAwM2EsIDB4MDAxMCwgMHgwNDA0LAorCTB4MDAwNCwgMHgwODY3LCAweDAwMTMsIDB4MDAzOSwgMHgwMDAyLCAweDFlMDAsIDB4MDAxMCwgMHhmZjFlLAorCTB4MDAxMiwgMHgxZDEwLCAweDAwMTAsIDB4ZmYxZCwgMHgwMDEwLCAweGMwMzAsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDgyZWEsIDB4MDAxMCwgMHhiMGZlLAorCTB4MDAwYiwgMHg2MzBmLCAweDAwMDAsIDB4MWNmZiwgMHgwMDAxLCAweDFhZTAsIDB4MDAxMywgMHgxMmY5LAorCTB4MDAwMCwgMHgxYzMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDEwLCAweDAwMDAsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODJmNSwgMHgwMDEwLCAweGIwZmUsIDB4MDAxYiwgMHg2MmY5LAorCTB4MDAwMCwgMHgxYWZmLCAweDAwMDAsIDB4ZmYxYywgMHgwMDAwLCAweDFjMzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAwMCwgMHgwMDE5LCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4MmZmLAorCTB4MDAwMSwgMHhiMGM4LCAweDAwMTAsIDB4MDAwZiwgMHgwMDAwLCAweGZmMWYsIDB4MDAwMSwgMHhiZjgwLAorCTB4MDAxMCwgMHhmZjFkLCAweDAwMTAsIDB4YzAzMCwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMWIsIDB4ODMwOSwgMHgwMDEwLCAweGIwZmUsIDB4MDAwYiwgMHg2MzBmLAorCTB4MDAwNSwgMHgwMGNlLCAweDAwMTAsIDB4MDAwNiwgMHgwMDEzLCAweDA4MjksIDB4MDAwMCwgMHhiMDFiLAorCTB4MDAxNywgMHg0MDAwLCAweDAwMTAsIDB4NzliMCwgMHgwMDAwLCAweGQwZmYsIDB4MDAxMiwgMHhmZjQwLAorCTB4MDAxYiwgMHgxMDM5LCAweDAwMTUsIDB4MDBkMSwgMHgwMDEwLCAweDAxMDEsIDB4MDAxMywgMHg5MzE3LAorCTB4MDAwNSwgMHgwMDc5LCAweDAwMDAsIDB4MDAwMiwgMHgwMDAzLCAweDkzMWEsIDB4MDAxNSwgMHgwMGQxLAorCTB4MDAwMCwgMHgwMTAwLCAweDAwMTAsIDB4MTNmZSwgMHgwMDAzLCAweDYzNGYsIDB4MDAxMiwgMHhiMDRlLAorCTB4MDAxYiwgMHgxMzZmLCAweDAwMTIsIDB4Nzg0YSwgMHgwMDEzLCAweDEzNzUsIDB4MDAwMCwgMHg3NWZmLAorCTB4MDAxMSwgMHhmZmM4LCAweDAwMTAsIDB4MTgwMCwgMHgwMDBiLCAweDEzNzUsIDB4MDAwMSwgMHgwZmU4LAorCTB4MDAwMCwgMHgwMDAxLCAweDAwMWIsIDB4MTMzMywgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgxMzg4LCAweDAwMDAsIDB4MDAwZSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHg4ZjBhLCAweDAwMGIsIDB4ODMzMSwgMHgwMDEzLCAweDAzN2IsIDB4MDAwMSwgMHgwZmU4LAorCTB4MDAwMCwgMHgwMDAyLCAweDAwMGIsIDB4MTMzZSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAxYSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLAorCTB4MDAxYiwgMHg4MzNjLCAweDAwMTMsIDB4MDM3YiwgMHgwMDAxLCAweDBmZTgsIDB4MDAxMCwgMHgwMDAwLAorCTB4MDAxMywgMHgxMzQ1LCAweDAwMDUsIDB4MDBjZSwgMHgwMDAwLCAweDAwMDcsIDB4MDAxMCwgMHgwZmNmLAorCTB4MDAxMywgMHgwODIzLCAweDAwMDAsIDB4MTNiOCwgMHgwMDAyLCAweDEwNDUsIDB4MDAwMywgMHgxMzRkLAorCTB4MDAxMiwgMHgxMDNmLCAweDAwMDIsIDB4ZmYyNywgMHgwMDE0LCAweDAzOTcsIDB4MDAwNCwgMHgwODY3LAorCTB4MDAwMywgMHgwMzRmLCAweDAwMTIsIDB4MTAzZiwgMHgwMDE0LCAweDAzOTcsIDB4MDAxNSwgMHgwMDBmLAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMDIsIDB4Mzk0NCwgMHgwMDEzLCAweDEzNTgsIDB4MDAxNSwgMHgwMDM5LAorCTB4MDAwMCwgMHg1MDQwLCAweDAwMTUsIDB4MDBiOCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwNCwgMHgwODY3LAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweGJkODgsIDB4MDAxMCwgMHgwMDBjLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGMwMGEsIDB4MDAxYiwgMHg4MzVmLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGMwMGEsIDB4MDAxYiwgMHg4MzYzLAorCTB4MDAxMCwgMHhjMDE0LCAweDAwMDAsIDB4YzAxMywgMHgwMDAwLCAweGMwMTAsIDB4MDAwMiwgMHgzYTQ3LAorCTB4MDAxMywgMHgxMzZlLCAweDAwMTUsIDB4MDAzYSwgMHgwMDAwLCAweDgwMDAsIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAxMCwgMHg0MDQwLCAweDAwMTQsIDB4MDgyZSwgMHgwMDEzLCAweDAwMzksIDB4MDAxNSwgMHgwMGI4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMTUsIDB4MDAzYSwgMHgwMDEwLCAweDAyMDIsIDB4MDAwNCwgMHgwODY3LAorCTB4MDAwMywgMHgwMzY3LCAweDAwMTUsIDB4MDBiOCwgMHgwMDAwLCAweDAwMDIsIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAxMCwgMHgwMjAyLCAweDAwMDQsIDB4MDg2NywgMHgwMDAzLCAweDAzNjcsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MTM4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDgzODIsIDB4MDAxMSwgMHgxMzg4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLAorCTB4MDAxYiwgMHg4Mzg4LCAweDAwMTAsIDB4YjBmZSwgMHgwMDEzLCAweDYzOGQsIDB4MDAwMCwgMHhiMDEyLAorCTB4MDAwMywgMHgwMzhmLCAweDAwMTAsIDB4YzAxMiwgMHgwMDEwLCAweGMwMTEsIDB4MDAxMiwgMHgxMDRiLAorCTB4MDAxMywgMHgxMzQ1LCAweDAwMDIsIDB4MTAzYiwgMHgwMDEwLCAweGZmMDMsIDB4MDAwNSwgMHgwMDAyLAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMDAsIDB4YzAwZCwgMHgwMDAzLCAweDAzNDUsIDB4MDAwMCwgMHhmZmIwLAorCTB4MDAxMCwgMHhjM2IxLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiODg4LAorCTB4MDAxMCwgMHgwMDExLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDEyLAorCTB4MDAxYiwgMHg4M2EwLCAweDAwMTcsIDB4NDAwMCwgMHgwMDEyLCAweDNhNDMsIDB4MDAwMywgMHgxM2IxLAorCTB4MDAxNSwgMHgwMDNhLCAweDAwMDAsIDB4MDgwMCwgMHgwMDEwLCAweDBkYjAsIDB4MDAxMywgMHg2M2IxLAorCTB4MDAwMCwgMHgwYmZmLCAweDAwMDEsIDB4YjBlMCwgMHgwMDEzLCAweDEzZGEsIDB4MDAxMCwgMHgwOWZmLAorCTB4MDAwMSwgMHhiMGUwLCAweDAwMDMsIDB4MTNiZSwgMHgwMDEwLCAweDA1ZmYsIDB4MDAwMSwgMHhiMGUwLAorCTB4MDAxMywgMHgxM2I1LCAweDAwMDAsIDB4YzAwZSwgMHgwMDAwLCAweDA1ZmUsIDB4MDAxMywgMHg2M2JiLAorCTB4MDAwMCwgMHgwNTBkLCAweDAwMDUsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDQsIDB4MDAxNCwgMHgwNDNjLAorCTB4MDAwMiwgMHgzYTQ3LCAweDAwMWIsIDB4MTQzYiwgMHgwMDAzLCAweDAzZDUsIDB4MDAwMCwgMHgwOWZlLAorCTB4MDAxMywgMHg2M2Q3LCAweDAwMDAsIDB4MDkwZCwgMHgwMDA1LCAweDAwMDIsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAxNCwgMHgwNDU1LCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiYTA5LAorCTB4MDAwYiwgMHg4M2M4LCAweDAwMTEsIDB4MDNjOCwgMHgwMDEwLCAweDAwMGYsIDB4MDAwMCwgMHhmZmI2LAorCTB4MDAxMSwgMHhiNmU4LCAweDAwMDAsIDB4MDAwMSwgMHgwMDAzLCAweDE0ZWMsIDB4MDAxMSwgMHhiNmU4LAorCTB4MDAwMCwgMHgwMDAyLCAweDAwMTMsIDB4MTUwZSwgMHgwMDExLCAweGI2ZTgsIDB4MDAxMCwgMHgwMDAzLAorCTB4MDAxMywgMHgxNWZkLCAweDAwMTQsIDB4MDgyZSwgMHgwMDEzLCAweDA0M2IsIDB4MDAxMCwgMHgwYmZlLAorCTB4MDAxMywgMHg2NDNiLCAweDAwMTAsIDB4MGIwZCwgMHgwMDA1LCAweDAwMDIsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAxNCwgMHgwNDU1LCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAwMCwgMHgwMDA0LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiYTA5LAorCTB4MDAxYiwgMHg4M2U0LCAweDAwMDAsIDB4YjkzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAxMCwgMHgwMDIxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDBiLCAweDgzZWEsIDB4MDAwMSwgMHhiMGE4LAorCTB4MDAwMCwgMHgxOTlhLCAweDAwMDMsIDB4MjNmMCwgMHgwMDA1LCAweDAwYjAsIDB4MDAwMCwgMHgxOTk5LAorCTB4MDAxMiwgMHhiMDUwLCAweDAwMDAsIDB4ZmZiMCwgMHgwMDAyLCAweGZmNTAsIDB4MDAwMiwgMHhmZjUwLAorCTB4MDAwMSwgMHhiMDgwLCAweDAwMDAsIDB4ZmZiMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgwZDg4LCAweDAwMTAsIDB4MDAwNiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDBhLCAweDAwMGIsIDB4ODNmZCwgMHgwMDAwLCAweGI5MzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAwMCwgMHgwMDE5LCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4NDAzLAorCTB4MDAwMSwgMHhiMGM4LCAweDAwMTAsIDB4MDBmZiwgMHgwMDAxLCAweGZmZTgsIDB4MDAxMCwgMHgwMDQ4LAorCTB4MDAxYiwgMHgxNDY0LCAweDAwMDUsIDB4MDAwMiwgMHgwMDEwLCAweDAwMDYsIDB4MDAxMiwgMHgwYzEwLAorCTB4MDAxMCwgMHhmZjBjLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMTA5LAorCTB4MDAwYiwgMHg4NDE0LCAweDAwMDAsIDB4YjEwYiwgMHgwMDFiLCAweDY0MTgsIDB4MDAxMCwgMHhiMTBhLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YzAwYSwgMHgwMDFiLCAweDg0MWEsIDB4MDAwMiwgMHgwMzJiLAorCTB4MDAxMCwgMHhmZjAzLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDEwLCAweDAwMTEsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4MDMwYSwgMHgwMDBiLCAweDg0MjIsIDB4MDAwMCwgMHgxMWZlLAorCTB4MDAxYiwgMHg2NDI3LCAweDAwMDAsIDB4MGQxMiwgMHgwMDAzLCAweDA0MzAsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4MTE4OCwgMHgwMDEwLCAweDAwMDMsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxMCwgMHgwZGIwLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMGEsIDB4MDAxYiwgMHg4NDJmLAorCTB4MDAwMCwgMHgwZDExLCAweDAwMTMsIDB4MDQzYiwgMHgwMDAwLCAweDA1ZmUsIDB4MDAxMywgMHg2NDNiLAorCTB4MDAwNSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwNCwgMHgwMDAwLCAweDA1MGQsIDB4MDAxNCwgMHgwNDNjLAorCTB4MDAwMiwgMHgzYTQ3LCAweDAwMWIsIDB4MTQzYiwgMHgwMDE0LCAweDA4MmUsIDB4MDAwMywgMHgwMDQ5LAorCTB4MDAwMSwgMHhjN2M4LCAweDAwMTAsIDB4MDAyOCwgMHgwMDFiLCAweDE0NTQsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDEwLCAweDAwMGEsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDg0NDYsIDB4MDAwMiwgMHhiMDRmLAorCTB4MDAwMywgMHgxNDU0LCAweDAwMDEsIDB4MGZlOCwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMywgMHgxNDUyLAorCTB4MDAwMSwgMHgwZmU4LCAweDAwMDAsIDB4MDAwMiwgMHgwMDAzLCAweDE0NTIsIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAxMCwgMHg4MDgwLCAweDAwMTMsIDB4MDQ1NCwgMHgwMDE1LCAweDAwM2EsIDB4MDAxMCwgMHg0MDQwLAorCTB4MDAxNywgMHg0MDAwLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDExLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHgwMzA5LAorCTB4MDAwYiwgMHg4NDVjLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDEwLCAweDAwMDUsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjkwOSwgMHgwMDFiLCAweDg0NjIsIDB4MDAxNywgMHg0MDAwLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwMTAsIDB4MDYwMCwgMHgwMDA0LCAweDA2MmQsIDB4MDAwNCwgMHgwNGQ2LAorCTB4MDAwMCwgMHhiMDVhLCAweDAwMDAsIDB4YjE1YiwgMHgwMDA1LCAweDAwNTQsIDB4MDAxMCwgMHgwODI5LAorCTB4MDAxMCwgMHgwZDU4LCAweDAwMTUsIDB4MDA1OSwgMHgwMDEwLCAweGZmZmYsIDB4MDAwMCwgMHhiOTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMTAsIDB4MDAxZSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LAorCTB4MDAwYiwgMHg4NDc0LCAweDAwMDAsIDB4YjA1YywgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDFmLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDg0N2EsIDB4MDAwMSwgMHhiMGM4LAorCTB4MDAxMCwgMHgwMDBmLCAweDAwMGIsIDB4MTQ4MSwgMHgwMDE1LCAweDAwZmYsIDB4MDAxMCwgMHgwMDA1LAorCTB4MDAxMywgMHgwNDg5LCAweDAwMDIsIDB4YjA0MCwgMHgwMDAzLCAweDE0ODYsIDB4MDAxNSwgMHgwMGZmLAorCTB4MDAwMCwgMHgwMDA0LCAweDAwMTMsIDB4MDQ4OSwgMHgwMDAxLCAweGIwYzgsIDB4MDAxMCwgMHgwMDA2LAorCTB4MDAwMiwgMHhmZjYwLCAweDAwMTAsIDB4ZmZiMiwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgwZDg4LCAweDAwMDAsIDB4MDAxOSwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHhiMTA5LCAweDAwMWIsIDB4ODQ5MSwgMHgwMDEyLCAweGIxNzAsIDB4MDAxMSwgMHhmZmM4LAorCTB4MDAxMCwgMHhmZjAwLCAweDAwMTEsIDB4YjJkMCwgMHgwMDEwLCAweGZmNjAsIDB4MDAwMiwgMHhiMDQ1LAorCTB4MDAxMywgMHgxNDljLCAweDAwMTUsIDB4MDBiMiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMywgMHgwNGE2LAorCTB4MDAwMiwgMHhiMDQ2LCAweDAwMDMsIDB4MTRhMSwgMHgwMDE1LCAweDAwYjIsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAwMywgMHgwNGE2LCAweDAwMTUsIDB4MDBiMiwgMHgwMDEwLCAweDAwMDAsIDB4MDAwMCwgMHhjMGIwLAorCTB4MDAxMCwgMHhjMGIxLCAweDAwMDMsIDB4MDRhYywgMHgwMDAwLCAweGI5MzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAxMCwgMHgwMDJiLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMTEsIDB4MDAxYiwgMHg4NGFiLAorCTB4MDAxMCwgMHhiMTZhLCAweDAwMTAsIDB4YjA2YiwgMHgwMDAwLCAweGIyNjEsIDB4MDAxNSwgMHgwMDQ0LAorCTB4MDAxMCwgMHgwMDE4LCAweDAwMDAsIDB4YjkzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDIzLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4NjI0MSwgMHgwMDFiLCAweDg0YjYsIDB4MDAwMywgMHg5NGI3LAorCTB4MDAxNSwgMHgwMGEwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDEyLCAweGQwNDEsIDB4MDAxYiwgMHgxNGJhLAorCTB4MDAxNSwgMHgwMGQxLCAweDAwMTAsIDB4MDIwMiwgMHgwMDAzLCAweDk0YmUsIDB4MDAwMCwgMHg3NWZmLAorCTB4MDAxMSwgMHhmZmM4LCAweDAwMDAsIDB4MTgwNCwgMHgwMDAxLCAweGZmZDgsIDB4MDAxMCwgMHgwMDA5LAorCTB4MDAxMywgMHg5NGM0LCAweDAwMDAsIDB4ZmY3NSwgMHgwMDAzLCAweDk0YzYsIDB4MDAxNSwgMHgwMGQxLAorCTB4MDAwMCwgMHgwMjAwLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiZDg4LAorCTB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwYjEsIDB4MDAxMCwgMHgwN2QwLAorCTB4MDAwNSwgMHgwMGIwLCAweDAwMTAsIDB4MDAwOSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDEyLAorCTB4MDAwYiwgMHg4NGQ0LCAweDAwMTMsIDB4MDQzYiwgMHgwMDAwLCAweGJhMzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAxMCwgMHgwMDM1LCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4NGRiLAorCTB4MDAwMiwgMHhiMDQwLCAweDAwMDMsIDB4MTRlOSwgMHgwMDEwLCAweGI5YjAsIDB4MDAxMCwgMHhiN2IxLAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAwMCwgMHgwMDEzLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMTIsIDB4MDAwYiwgMHg4NGU3LAorCTB4MDAwMywgMHgwNGViLCAweDAwMTAsIDB4YzBiMSwgMHgwMDAwLCAweGMwYjAsIDB4MDAxNywgMHg0MDAwLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwMTAsIDB4MDUwMCwgMHgwMDA0LCAweDA2MmQsIDB4MDAwNSwgMHgwMDU0LAorCTB4MDAxMCwgMHgwODg5LCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAwMCwgMHgwMDAyLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LAorCTB4MDAxYiwgMHg4NGY4LCAweDAwMTAsIDB4YjA1OCwgMHgwMDAwLCAweDBkNTksIDB4MDAwMCwgMHhiOTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAyMywgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDExLAorCTB4MDAxYiwgMHg4NTAwLCAweDAwMTAsIDB4YjE1YywgMHgwMDEwLCAweGIwNWQsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAxMCwgMHgwMDJiLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMTEsIDB4MDAwYiwgMHg4NTA3LAorCTB4MDAwMCwgMHhiMTVlLCAweDAwMDAsIDB4YjA1ZiwgMHgwMDEzLCAweDk1MGEsIDB4MDAxNSwgMHgwMGEwLAorCTB4MDAxMCwgMHgwMDBjLCAweDAwMTMsIDB4MDYxMiwgMHgwMDA1LCAweDAwYjYsIDB4MDAwMCwgMHgwNzAwLAorCTB4MDAwNCwgMHgwNjJkLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDA5LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiNzA5LAorCTB4MDAxYiwgMHg4NTE4LCAweDAwMTIsIDB4Yjc0OSwgMHgwMDAzLCAweDE1MWUsIDB4MDAwNSwgMHgwMDU0LAorCTB4MDAxMCwgMHgwODg5LCAweDAwMDMsIDB4MDUyMCwgMHgwMDA1LCAweDAwNTQsIDB4MDAxMCwgMHgwODk4LAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAwMCwgMHgwMDAyLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NTI3LAorCTB4MDAxMCwgMHhiMDU4LCAweDAwMDAsIDB4MGQ1OSwgMHgwMDAxLCAweGI5YTgsIDB4MDAxMCwgMHgwMGYwLAorCTB4MDAxYiwgMHgyNTRlLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDA1LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LAorCTB4MDAwYiwgMHg4NTM0LCAweDAwMDEsIDB4YjBjOCwgMHgwMDAwLCAweGY3MDAsIDB4MDAwMCwgMHhmZmIwLAorCTB4MDAxMSwgMHhiMGU4LCAweDAwMDAsIDB4ZjEwMCwgMHgwMDAzLCAweDE1OTUsIDB4MDAxMSwgMHhiMGU4LAorCTB4MDAwMCwgMHhmMjAwLCAweDAwMDMsIDB4MTU5YSwgMHgwMDExLCAweGIwZTgsIDB4MDAxMCwgMHhmMzAwLAorCTB4MDAxMywgMHgxNWJmLCAweDAwMTEsIDB4YjBlOCwgMHgwMDAwLCAweGY0MDAsIDB4MDAxMywgMHgxNWM0LAorCTB4MDAxMSwgMHhiMGU4LCAweDAwMTAsIDB4ZjUwMCwgMHgwMDAzLCAweDE1OTUsIDB4MDAxMSwgMHhiMGU4LAorCTB4MDAxMCwgMHhmNjAwLCAweDAwMTMsIDB4MTVkNSwgMHgwMDA1LCAweDAwY2UsIDB4MDAxMCwgMHgwMDA5LAorCTB4MDAwMCwgMHhiMGNmLCAweDAwMTMsIDB4MDgyMywgMHgwMDAwLCAweGI5MzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAwMCwgMHgwMDI1LCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMzksIDB4MDAxYiwgMHg4NTUzLAorCTB4MDAxMiwgMHhiNzQ5LCAweDAwMTMsIDB4MTU1OCwgMHgwMDAyLCAweGI1MmMsIDB4MDAwMCwgMHhmZmI1LAorCTB4MDAwMCwgMHhiMTYyLCAweDAwMDAsIDB4YjA2MywgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDFmLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjMwOSwgMHgwMDBiLCAweDg1NWUsIDB4MDAwMSwgMHhiM2M4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMDMsIDB4MTU2NiwgMHgwMDEwLCAweGZmYjIsIDB4MDAwMSwgMHhmZmU4LAorCTB4MDAxMCwgMHgwMDAzLCAweDAwMGIsIDB4MTU2OCwgMHgwMDAwLCAweGMyYjcsIDB4MDAwMywgMHgwNWYxLAorCTB4MDAwMSwgMHhiMmU4LCAweDAwMDAsIDB4MDAwMSwgMHgwMDAzLCAweDE1NmYsIDB4MDAwNSwgMHgwMGNlLAorCTB4MDAxMCwgMHgwMDBhLCAweDAwMTAsIDB4YjJjZiwgMHgwMDEzLCAweDA4MjMsIDB4MDAxMCwgMHhiNDY1LAorCTB4MDAxMCwgMHhiNjY3LCAweDAwMTUsIDB4MDBiNywgMHgwMDEwLCAweDAwMTgsIDB4MDAwMSwgMHhiNWM4LAorCTB4MDAxMCwgMHgwMzAwLCAweDAwMTMsIDB4MTU5NCwgMHgwMDEyLCAweGI1NDgsIDB4MDAwMywgMHgxNTdiLAorCTB4MDAwMCwgMHhiNmZmLCAweDAwMTEsIDB4Yjc4MCwgMHgwMDEwLCAweGZmYjcsIDB4MDAwMiwgMHhiNTQ5LAorCTB4MDAxMywgMHgxNTgwLCAweDAwMTAsIDB4YjRmZiwgMHgwMDExLCAweGI3ODAsIDB4MDAxMCwgMHhmZmI3LAorCTB4MDAxNSwgMHgwMDQ0LCAweDAwMTAsIDB4MDAxOCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDJjLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4Njg0MSwgMHgwMDBiLCAweDg1ODYsIDB4MDAxNSwgMHgwMDQ0LAorCTB4MDAwMCwgMHgwMDE5LCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzQsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHg1MDI5LCAweDAwMWIsIDB4ODU4ZCwgMHgwMDE1LCAweDAwNDQsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDAxMSwgMHhiN2M4LCAweDAwMTAsIDB4MDAwMywgMHgwMDEzLCAweDE1OTQsIDB4MDAxMCwgMHhmZjU1LAorCTB4MDAwMywgMHgwNWYxLCAweDAwMDUsIDB4MDBiNSwgMHgwMDAwLCAweDAwMDgsIDB4MDAxNSwgMHgwMGI3LAorCTB4MDAxMCwgMHgwMDE4LCAweDAwMDMsIDB4MDVmMSwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgwZDg4LCAweDAwMDAsIDB4MDAwYiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDExLCAweDAwMGIsIDB4ODVhMSwgMHgwMDEwLCAweGIxZmYsIDB4MDAwMSwgMHhiMGQwLAorCTB4MDAwMywgMHgxNWFhLCAweDAwMDUsIDB4MDBiNSwgMHgwMDEwLCAweDBiMDIsIDB4MDAxMCwgMHhiMDYyLAorCTB4MDAxMCwgMHhiMTYzLCAweDAwMTMsIDB4MDVhYywgMHgwMDA1LCAweDAwYjUsIDB4MDAwMCwgMHgwMzAyLAorCTB4MDAxNSwgMHgwMDY1LCAweDAwMTAsIDB4MDAxMiwgMHgwMDA1LCAweDAwNjcsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDAxNSwgMHgwMDZjLCAweDAwMDAsIDB4NzAwMCwgMHgwMDA1LCAweDAwNmQsIDB4MDAxMCwgMHgwNTAwLAorCTB4MDAxNSwgMHgwMDZmLCAweDAwMTAsIDB4MDAwYSwgMHgwMDE1LCAweDAwNDQsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAwNSwgMHgwMDUyLCAweDAwMDAsIDB4MjUwMCwgMHgwMDE1LCAweDAwNDQsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDAxNSwgMHgwMGI3LCAweDAwMDAsIDB4MDAzMiwgMHgwMDAzLCAweDA1ZjEsIDB4MDAwNSwgMHgwMGI1LAorCTB4MDAxMCwgMHgwMDI4LCAweDAwMTUsIDB4MDBiNywgMHgwMDEwLCAweDAwMTgsIDB4MDAwMywgMHgwNWYxLAorCTB4MDAwNSwgMHgwMGI1LCAweDAwMDAsIDB4MDEwMCwgMHgwMDA1LCAweDAwNjcsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDE4LAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NWNmLAorCTB4MDAwMSwgMHhiMGM4LCAweDAwMTAsIDB4MDBmZiwgMHgwMDE1LCAweDAwYjcsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMywgMHgwNWYxLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDA1LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiNjA5LAorCTB4MDAwYiwgMHg4NWRjLCAweDAwMDEsIDB4YjZjOCwgMHgwMDEwLCAweGZmMDAsIDB4MDAwMCwgMHhmZmIwLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwYSwgMHgwMDFiLCAweDg1ZTIsIDB4MDAwMSwgMHhiNmM4LAorCTB4MDAxMCwgMHgwMGZmLCAweDAwMTIsIDB4ZmYxMCwgMHgwMDFiLCAweDE1ZWIsIDB4MDAwMCwgMHhmZmI1LAorCTB4MDAxNSwgMHgwMGI3LCAweDAwMTAsIDB4MDAxOCwgMHgwMDAzLCAweDA1ZjEsIDB4MDAxMCwgMHhmZjYzLAorCTB4MDAwNSwgMHgwMGI1LCAweDAwMDAsIDB4MDgwMCwgMHgwMDE1LCAweDAwYjcsIDB4MDAxMCwgMHgwMDE4LAorCTB4MDAwMywgMHgwNWYxLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgwZDg4LAorCTB4MDAxMCwgMHgwMDA5LCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDA5LAorCTB4MDAwYiwgMHg4NWY4LCAweDAwMTAsIDB4YjU2MSwgMHgwMDEzLCAweDk1ZmEsIDB4MDAxMCwgMHhiN2EwLAorCTB4MDAxMywgMHgwNjEyLCAweDAwMDUsIDB4MDBiNiwgMHgwMDEwLCAweDAzMDAsIDB4MDAwNCwgMHgwNjJkLAorCTB4MDAwNSwgMHgwMDU0LCAweDAwMTAsIDB4MDgxOSwgMHgwMDEwLCAweDBkNTgsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDg2MGEsIDB4MDAwMCwgMHhiMDU5LAorCTB4MDAxMywgMHg5NjBjLCAweDAwMTAsIDB4YzBhMCwgMHgwMDEwLCAweDcxZmYsIDB4MDAwMiwgMHhmZjI4LAorCTB4MDAxMCwgMHhmZjcxLCAweDAwMTMsIDB4MDYxMiwgMHgwMDEyLCAweGQwNDEsIDB4MDAxYiwgMHgxNjEyLAorCTB4MDAxNSwgMHgwMGQxLCAweDAwMTAsIDB4MDIwMiwgMHgwMDAwLCAweDc1ZmYsIDB4MDAxMSwgMHhmZmM4LAorCTB4MDAwMCwgMHgxODA0LCAweDAwMDEsIDB4ZmZkOCwgMHgwMDEwLCAweDAwMDksIDB4MDAxMywgMHg5NjFiLAorCTB4MDAwMCwgMHhmZjc1LCAweDAwMTMsIDB4OTYxZCwgMHgwMDE1LCAweDAwZDEsIDB4MDAwMCwgMHgwMjAwLAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAxLCAweGJkODgsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMDUsIDB4MDBiMCwgMHgwMDEwLCAweDAwMDksIDB4MDAxNSwgMHgwMGIxLAorCTB4MDAxMCwgMHgwN2QwLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMTIsIDB4MDAxYiwgMHg4NjJiLAorCTB4MDAxMywgMHgwNDNiLCAweDAwMTUsIDB4MDA0NCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwNSwgMHgwMDk4LAorCTB4MDAxMCwgMHgwMDU2LCAweDAwMTUsIDB4MDA5OSwgMHgwMDAwLCAweDk1NzUsIDB4MDAwNCwgMHgwN2VhLAorCTB4MDAwMCwgMHhiMDk2LCAweDAwMTIsIDB4YjI3MCwgMHgwMDEwLCAweGZmNTYsIDB4MDAxNCwgMHgwODBjLAorCTB4MDAxMCwgMHhiMDUyLCAweDAwMTAsIDB4YjE1MywgMHgwMDAwLCAweGI2ZmYsIDB4MDAxMSwgMHhiMmQwLAorCTB4MDAxMCwgMHhmZjUwLCAweDAwMTAsIDB4YjM1MSwgMHgwMDE3LCAweDQwMDAsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMDEsIDB4MTI4OCwgMHgwMDEwLCAweDAwMTEsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4MTAwOSwgMHgwMDBiLCAweDg2NDYsIDB4MDAxNSwgMHgwMDBmLAorCTB4MDAwMCwgMHgwMDAxLCAweDAwMTAsIDB4YzAxNCwgMHgwMDAwLCAweDEyMTMsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MTM4OCwgMHgwMDAwLCAweDAwMDQsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YmEwOSwgMHgwMDBiLCAweDg2NTIsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MTM4OCwgMHgwMDEwLCAweDAwMDUsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4MWEwOSwgMHgwMDFiLCAweDg2NWEsIDB4MDAxMiwgMHgxMDRiLAorCTB4MDAxYiwgMHgxNjYzLCAweDAwMDAsIDB4MWEzMCwgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDBiLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4MTYyMSwgMHgwMDBiLCAweDg2NjIsIDB4MDAxMCwgMHgxNWZlLAorCTB4MDAwYiwgMHg2NjgyLCAweDAwMDQsIDB4MDZhOSwgMHgwMDAyLCAweDNhNDIsIDB4MDAwYiwgMHgxNmE4LAorCTB4MDAwMSwgMHgxMGM4LCAweDAwMTAsIDB4MDAwZiwgMHgwMDFiLCAweDE3MGIsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MTM4OCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDg2NzIsIDB4MDAxMSwgMHhiMGU4LAorCTB4MDAxMCwgMHgwMDA5LCAweDAwMTMsIDB4MTY3OSwgMHgwMDExLCAweGIwZTgsIDB4MDAwMCwgMHgwMDAxLAorCTB4MDAwYiwgMHgxNmE3LCAweDAwMTEsIDB4MTM4OCwgMHgwMDEwLCAweDAwMGEsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjAwOSwgMHgwMDFiLCAweDg2N2UsIDB4MDAwMiwgMHhiMDRmLAorCTB4MDAwYiwgMHgxNjllLCAweDAwMDMsIDB4MDZhNywgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgxMzg4LCAweDAwMTAsIDB4MDAwMywgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMGIsIDB4ODY4OSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhjMDBhLAorCTB4MDAwYiwgMHg4NjhjLCAweDAwMTAsIDB4YjBmZSwgMHgwMDAzLCAweDY2OTEsIDB4MDAwMCwgMHhiMDEyLAorCTB4MDAxMywgMHgwNjkzLCAweDAwMTAsIDB4YzAxMiwgMHgwMDEwLCAweGMwMTEsIDB4MDAxNSwgMHgwMDBmLAorCTB4MDAxMCwgMHgwMDAwLCAweDAwMDIsIDB4Mzk0NCwgMHgwMDAzLCAweDE2OWMsIDB4MDAxNSwgMHgwMDM5LAorCTB4MDAwMCwgMHg1MDQwLCAweDAwMTUsIDB4MDBiOCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwNCwgMHgwODY3LAorCTB4MDAwMCwgMHhjMDEzLCAweDAwMDMsIDB4MDZhOCwgMHgwMDEwLCAweDAyZmUsIDB4MDAxMywgMHg2NmEzLAorCTB4MDAxNSwgMHgwMDNhLCAweDAwMTAsIDB4MjAyMCwgMHgwMDAzLCAweDA2YTgsIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAwMCwgMHgyMDAwLCAweDAwMTUsIDB4MDAzYSwgMHgwMDEwLCAweDEwMTAsIDB4MDAxNCwgMHgwODUzLAorCTB4MDAxMywgMHgwMDU1LCAweDAwMDMsIDB4YjZhOSwgMHgwMDA1LCAweDAwMmEsIDB4MDAwMCwgMHgwMDA0LAorCTB4MDAwMCwgMHhiYTMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDEwLCAweDAwMWIsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiMDA5LCAweDAwMWIsIDB4ODZiMSwgMHgwMDAwLCAweGMwMmMsIDB4MDAwMCwgMHhiMDJkLAorCTB4MDAxMiwgMHgxMDRiLCAweDAwMDMsIDB4MTZjYywgMHgwMDAwLCAweDFhMzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAwMCwgMHgwMDIzLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIxMjksIDB4MDAxYiwgMHg4NmJiLAorCTB4MDAwMCwgMHhiMTIwLCAweDAwMTAsIDB4YjIyMSwgMHgwMDAwLCAweGIzMjIsIDB4MDAwMCwgMHhiNDIzLAorCTB4MDAwMCwgMHhiNTI0LCAweDAwMDAsIDB4YzAyNSwgMHgwMDEwLCAweGI1MjYsIDB4MDAxMCwgMHhjMDI3LAorCTB4MDAxMCwgMHhiNTE2LCAweDAwMTAsIDB4YzAxNywgMHgwMDAwLCAweGI1MTgsIDB4MDAwMCwgMHhjMDE5LAorCTB4MDAxMCwgMHhjMDI4LCAweDAwMDAsIDB4YzAyOSwgMHgwMDEwLCAweGMwMWUsIDB4MDAxMywgMHgwNzAyLAorCTB4MDAxMiwgMHgxMDQ0LCAweDAwMDMsIDB4MTZmYywgMHgwMDAyLCAweDEwMzQsIDB4MDAwMCwgMHhmZjEwLAorCTB4MDAwMCwgMHgxYTMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHgxYjI5LCAweDAwMGIsIDB4ODZkNSwgMHgwMDAwLCAweDFjMzAsIDB4MDAwMCwgMHgxYjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YjEzMSwgMHgwMDBiLCAweDg2ZGEsIDB4MDAwMiwgMHgxZjQzLAorCTB4MDAxYiwgMHgxNmUxLCAweDAwMTAsIDB4YjNiNSwgMHgwMDAwLCAweGI0YjYsIDB4MDAwMCwgMHhjMGIzLAorCTB4MDAxMCwgMHhjMGI0LCAweDAwMDAsIDB4YjEyMCwgMHgwMDEwLCAweGIyMjEsIDB4MDAwMCwgMHhiMzIyLAorCTB4MDAwMCwgMHhiNDIzLCAweDAwMDAsIDB4YjUyNCwgMHgwMDEwLCAweGI2MjUsIDB4MDAxMCwgMHhiNTE2LAorCTB4MDAwMCwgMHhiNjE3LCAweDAwMDAsIDB4MTgyNiwgMHgwMDAwLCAweDE5MjcsIDB4MDAwMCwgMHgxYTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMTAsIDB4MDAwZiwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDExLAorCTB4MDAxYiwgMHg4NmYwLCAweDAwMDAsIDB4YjAyOCwgMHgwMDAwLCAweGIxMjksIDB4MDAxMiwgMHgxZTEwLAorCTB4MDAxMCwgMHhmZjFlLCAweDAwMTMsIDB4NjcwMiwgMHgwMDAyLCAweDFkMDAsIDB4MDAxMCwgMHhmZjFkLAorCTB4MDAxNCwgMHgwMmE1LCAweDAwMDIsIDB4M2E0MiwgMHgwMDAzLCAweDE3MDIsIDB4MDAwMywgMHgwNzBhLAorCTB4MDAwMCwgMHgxYTMwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHgxYjc5LCAweDAwMWIsIDB4ODcwMSwgMHgwMDAzLCAweGI3MDIsIDB4MDAwNSwgMHgwMDJhLAorCTB4MDAwMCwgMHgwMDAxLCAweDAwMDUsIDB4MDAxNSwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMCwgMHgxZWZlLAorCTB4MDAwMywgMHg2NzBhLCAweDAwMDMsIDB4MDI3MSwgMHgwMDE3LCAweDQwMDAsIDB4MDAwMCwgMHhiYTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMTAsIDB4MDAxYiwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMDUxLAorCTB4MDAxYiwgMHg4NzEwLCAweDAwMDAsIDB4YjBhMywgMHgwMDEwLCAweGI2OTcsIDB4MDAxMCwgMHhiOTQ2LAorCTB4MDAxNSwgMHgwMGE1LCAweDAwMDAsIDB4MDAxMCwgMHgwMDE1LCAweDAwMzAsIDB4MDAwMCwgMHgwNDAwLAorCTB4MDAxMSwgMHgxMzg4LCAweDAwMDAsIDB4MDAwMiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAwMCwgMHhiNTA5LCAweDAwMGIsIDB4ODcxZCwgMHgwMDE0LCAweDA4MGMsIDB4MDAwNCwgMHgwN2ZiLAorCTB4MDAxMiwgMHhiNDcwLCAweDAwMTAsIDB4ZmZiNCwgMHgwMDEwLCAweGI0OGUsIDB4MDAxMCwgMHhiMDhhLAorCTB4MDAxMCwgMHhiMThiLCAweDAwMTIsIDB4MTA0ZCwgMHgwMDEzLCAweDE3MjgsIDB4MDAwMywgMHgwNzU1LAorCTB4MDAxMiwgMHgxMDRiLCAweDAwMDMsIDB4MTczYiwgMHgwMDA1LCAweDAwOGMsIDB4MDAxMCwgMHgwODI5LAorCTB4MDAxMCwgMHhjMDhkLCAweDAwMDEsIDB4YjJkOCwgMHgwMDEwLCAweDA2MDAsIDB4MDAxMCwgMHhmZjg4LAorCTB4MDAxMCwgMHhiMzg5LCAweDAwMDAsIDB4MTM5MCwgMHgwMDEwLCAweGI1OTEsIDB4MDAwMCwgMHhjMDhmLAorCTB4MDAxMCwgMHgxYWI5LCAweDAwMDQsIDB4MDRkNiwgMHgwMDAzLCAweDk3MzYsIDB4MDAxMCwgMHhiMDkyLAorCTB4MDAxMCwgMHhiMTkzLCAweDAwMDMsIDB4OTczOSwgMHgwMDAzLCAweDA3NTAsIDB4MDAwNSwgMHgwMDhjLAorCTB4MDAwMCwgMHgwODA5LCAweDAwMTUsIDB4MDA4ZCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwMSwgMHhiMmQ4LAorCTB4MDAwMCwgMHgwMTAwLCAweDAwMTAsIDB4ZmY4OCwgMHgwMDEwLCAweGIzODksIDB4MDAwMCwgMHgxMzkwLAorCTB4MDAxMCwgMHhiNTkxLCAweDAwMDAsIDB4YzA4ZiwgMHgwMDAwLCAweDFhMzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAxMCwgMHgwMDBmLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMTEsIDB4MDAwYiwgMHg4NzRiLAorCTB4MDAxMywgMHg5NzRjLCAweDAwMDAsIDB4YjE5MiwgMHgwMDAwLCAweGIwOTMsIDB4MDAxMywgMHg5NzRmLAorCTB4MDAxMCwgMHgxOWExLCAweDAwMDAsIDB4MThhMiwgMHgwMDE1LCAweDAwYjEsIDB4MDAxMCwgMHgwMDk2LAorCTB4MDAwMywgMHgwN2M2LCAweDAwMDAsIDB4YjU5MCwgMHgwMDEwLCAweDEzOTEsIDB4MDAwMSwgMHgxMGM4LAorCTB4MDAxMCwgMHgwMDBmLCAweDAwMDEsIDB4ZmZlOCwgMHgwMDEwLCAweDAwMDUsIDB4MDAwMywgMHgxNzdjLAorCTB4MDAwMSwgMHhiMmQ4LCAweDAwMDAsIDB4MDcwMCwgMHgwMDEwLCAweGZmODgsIDB4MDAxMCwgMHhiMzg5LAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAxMCwgMHgwMDA5LAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAxYiwgMHg4NzY3LAorCTB4MDAwMiwgMHhiMDQ5LCAweDAwMTMsIDB4MTc2ZiwgMHgwMDA1LCAweDAwOGMsIDB4MDAxMCwgMHgwODg5LAorCTB4MDAxNSwgMHgwMGIxLCAweDAwMTAsIDB4MDA5NiwgMHgwMDEzLCAweDA3NzMsIDB4MDAwNSwgMHgwMDhjLAorCTB4MDAxMCwgMHgwODk4LCAweDAwMTUsIDB4MDBiMSwgMHgwMDAwLCAweDAwOTIsIDB4MDAxMCwgMHhjMDhkLAorCTB4MDAwMCwgMHhjMDhmLCAweDAwMTMsIDB4OTc3NSwgMHgwMDAwLCAweGMwOTIsIDB4MDAxMCwgMHhjMDkzLAorCTB4MDAwMywgMHg5Nzc4LCAweDAwMTAsIDB4MTlhMSwgMHgwMDAwLCAweDE4YTIsIDB4MDAwMywgMHgwN2M2LAorCTB4MDAwMSwgMHhiMmQ4LCAweDAwMDAsIDB4MDEwMCwgMHgwMDEwLCAweGZmODgsIDB4MDAxMCwgMHhiMzg5LAorCTB4MDAwNSwgMHgwMDhjLCAweDAwMTAsIDB4MDg4MCwgMHgwMDE1LCAweDAwOGQsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDEzODgsIDB4MDAwMCwgMHgwMDBlLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDAwLCAweGIwMDksIDB4MDAwYiwgMHg4NzhiLAorCTB4MDAxMCwgMHhiMDhmLCAweDAwMDAsIDB4YjU5MCwgMHgwMDEwLCAweDEzOTEsIDB4MDAwMCwgMHgxYTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAwZCwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDIxLAorCTB4MDAxYiwgMHg4Nzk0LCAweDAwMDMsIDB4OTc5NSwgMHgwMDEwLCAweGIzOTIsIDB4MDAxMCwgMHhiMjkzLAorCTB4MDAxMywgMHg5Nzk4LCAweDAwMDAsIDB4YjFhMSwgMHgwMDEwLCAweGIwYTIsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MTM4OCwgMHgwMDAwLCAweDAwMGIsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjIxMSwgMHgwMDFiLCAweDg3YTIsIDB4MDAwMCwgMHhiM2ZmLAorCTB4MDAwMSwgMHhiMDgwLCAweDAwMDAsIDB4ZmZiMywgMHgwMDBiLCAweDI3YTksIDB4MDAwMiwgMHhiMjAwLAorCTB4MDAwMywgMHgwN2FhLCAweDAwMTAsIDB4YjJmZiwgMHgwMDExLCAweGIxODAsIDB4MDAxMCwgMHhmZmIyLAorCTB4MDAxMSwgMHgxMzg4LCAweDAwMDAsIDB4MDAwYiwgMHgwMDAwLCAweGZmMzEsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHhiMjEyLCAweDAwMGIsIDB4ODdiMSwgMHgwMDE1LCAweDAwYjEsIDB4MDAwMCwgMHgwMDkyLAorCTB4MDAwMiwgMHgxMDRjLCAweDAwMDMsIDB4MTdjNCwgMHgwMDExLCAweGMyZTgsIDB4MDAxMCwgMHgwMDBjLAorCTB4MDAxYiwgMHgxN2JjLCAweDAwMTUsIDB4MDBmZiwgMHgwMDAwLCAweDA4MDAsIDB4MDAxMywgMHgwN2M0LAorCTB4MDAxMSwgMHhjMmU4LCAweDAwMDAsIDB4MDAyMCwgMHgwMDFiLCAweDE3YzIsIDB4MDAxNSwgMHgwMGZmLAorCTB4MDAxMCwgMHgxODAwLCAweDAwMTMsIDB4MDdjNCwgMHgwMDE1LCAweDAwZmYsIDB4MDAwMCwgMHgxMDAwLAorCTB4MDAxMSwgMHhiMWQwLCAweDAwMTAsIDB4ZmZiMSwgMHgwMDE1LCAweDAwOWEsIDB4MDAxMCwgMHgwMDM2LAorCTB4MDAwNSwgMHgwMDliLCAweDAwMDAsIDB4OTVkNSwgMHgwMDEyLCAweGQwNDEsIDB4MDAwYiwgMHgxN2NhLAorCTB4MDAxNSwgMHgwMGQxLCAweDAwMTAsIDB4MDIwMiwgMHgwMDEzLCAweDk3Y2UsIDB4MDAxMiwgMHgxMDRlLAorCTB4MDAwMywgMHgxN2QzLCAweDAwMTIsIDB4YjEyZiwgMHgwMDEwLCAweGZmYjEsIDB4MDAwMCwgMHhiMTc1LAorCTB4MDAwMywgMHg5N2Q0LCAweDAwMTUsIDB4MDBkMSwgMHgwMDAwLCAweDAyMDAsIDB4MDAwMSwgMHgxOWM4LAorCTB4MDAxMCwgMHhmZmYwLCAweDAwMGIsIDB4MTdkZCwgMHgwMDE1LCAweDAwYjEsIDB4MDAxMCwgMHgwN2QwLAorCTB4MDAxMywgMHgwN2RmLCAweDAwMTUsIDB4MDBiMSwgMHgwMDAwLCAweDFiNTgsIDB4MDAwNSwgMHgwMGIwLAorCTB4MDAxMCwgMHgwMDA5LCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMSwgMHhiZDg4LAorCTB4MDAwMCwgMHgwMDBiLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAwMCwgMHhiMDEyLAorCTB4MDAwYiwgMHg4N2U4LCAweDAwMDMsIDB4MDZhOCwgMHgwMDAwLCAweGJhMzAsIDB4MDAwNSwgMHgwMDMxLAorCTB4MDAxMCwgMHgwMDIxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGIwMTksIDB4MDAxYiwgMHg4N2VmLAorCTB4MDAwMiwgMHhiMjAwLCAweDAwMTEsIDB4ZmZjOCwgMHgwMDEwLCAweDAwZmYsIDB4MDAxMCwgMHhmZmIyLAorCTB4MDAxMCwgMHhiMmI3LCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMjMsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHhiMjBhLCAweDAwMGIsIDB4ODdmOSwgMHgwMDE3LCAweDQwMDAsIDB4MDAwMCwgMHhiYTMwLAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMDAsIDB4MDAyMywgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiNDA5LAorCTB4MDAwYiwgMHg4ODAwLCAweDAwMDIsIDB4YjQwMCwgMHgwMDExLCAweGZmYzgsIDB4MDAxMCwgMHgwMGZmLAorCTB4MDAxMCwgMHhmZmI0LCAweDAwMTAsIDB4YjRiNywgMHgwMDA1LCAweDAwMzEsIDB4MDAwMCwgMHgwMDIzLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMTAsIDB4YjQwYSwgMHgwMDBiLCAweDg4MGEsIDB4MDAxNywgMHg0MDAwLAorCTB4MDAwMCwgMHhiYTMwLCAweDAwMDEsIDB4YzdjOCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwYiwgMHgxODE4LAorCTB4MDAwNSwgMHgwMDMxLCAweDAwMTAsIDB4MDAyOCwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMjA5LAorCTB4MDAwYiwgMHg4ODE0LCAweDAwMTEsIDB4YjJjOCwgMHgwMDAwLCAweGZmODAsIDB4MDAxMywgMHgxODFiLAorCTB4MDAxMCwgMHhjNGIwLCAweDAwMTAsIDB4YzViMSwgMHgwMDAzLCAweDA4MWQsIDB4MDAxMCwgMHhjNmIxLAorCTB4MDAwMCwgMHhjMGIwLCAweDAwMDUsIDB4MDAzMSwgMHgwMDAwLCAweDAwMDQsIDB4MDAxNSwgMHgwMDMzLAorCTB4MDAxMCwgMHhiMjExLCAweDAwMGIsIDB4ODgyMSwgMHgwMDE3LCAweDQwMDAsIDB4MDAxNSwgMHgwMGI4LAorCTB4MDAxMCwgMHgwMDA5LCAweDAwMTUsIDB4MDAzYSwgMHgwMDEwLCAweDA3MDcsIDB4MDAwNCwgMHgwODY3LAorCTB4MDAxMywgMHgwMDJkLCAweDAwMTUsIDB4MDBiOCwgMHgwMDEwLCAweDAwMDksIDB4MDAxNSwgMHgwMDNhLAorCTB4MDAxMCwgMHgwNzA3LCAweDAwMTMsIDB4MDg2NywgMHgwMDE0LCAweDAxMTQsIDB4MDAxNSwgMHgwMDMwLAorCTB4MDAwMCwgMHgwNDAwLCAweDAwMTEsIDB4MGQ4OCwgMHgwMDAwLCAweDAwMDQsIDB4MDAwMCwgMHhmZjMxLAorCTB4MDAxNSwgMHgwMDMzLCAweDAwMDAsIDB4YmEwOSwgMHgwMDBiLCAweDg4MzYsIDB4MDAwNCwgMHgwN2VhLAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAwMCwgMHgwMDEwLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGIyMGEsIDB4MDAwYiwgMHg4ODNmLAorCTB4MDAxNSwgMHgwMDMwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDExLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweDAzMDksIDB4MDAwYiwgMHg4ODQ3LAorCTB4MDAwMiwgMHgwMzI3LCAweDAwMTAsIDB4ZmZiMiwgMHgwMDExLCAweDBkODgsIDB4MDAxMCwgMHgwMDExLAorCTB4MDAwMCwgMHhmZjMxLCAweDAwMTUsIDB4MDAzMywgMHgwMDEwLCAweGIyMGEsIDB4MDAxYiwgMHg4ODRmLAorCTB4MDAxNSwgMHgwMGI4LCAweDAwMTAsIDB4MDAwNiwgMHgwMDEzLCAweDA4NjcsIDB4MDAwNCwgMHgwMTI2LAorCTB4MDAwNCwgMHgwN2VhLCAweDAwMTUsIDB4MDAzMCwgMHgwMDAwLCAweDA0MDAsIDB4MDAxMSwgMHgxMzg4LAorCTB4MDAwMCwgMHgwMDEwLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMjBhLAorCTB4MDAwYiwgMHg4ODVjLCAweDAwMTIsIDB4MTAyNywgMHgwMDEwLCAweGZmYjIsIDB4MDAxMSwgMHgxMzg4LAorCTB4MDAxMCwgMHgwMDExLCAweDAwMDAsIDB4ZmYzMSwgMHgwMDE1LCAweDAwMzMsIDB4MDAxMCwgMHhiMjBhLAorCTB4MDAxYiwgMHg4ODY0LCAweDAwMTUsIDB4MDBiOCwgMHgwMDAwLCAweDAwMDcsIDB4MDAwMywgMHg0ODY3LAorCTB4MDAwMCwgMHhiODM4LCAweDAwMTcsIDB4NDAwMCwgMHhhMmU3LCAweDI0YWQKK307Cit1bnNpZ25lZCBzaG9ydCB4c2VxaXB4X2NvZGVfbGVuZ3RoMDEgPSAweDEwZDY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDYzMTIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsNjMxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjY4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbDYzMTIuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIFFMb2dpYyBJU1A2MzEyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24gKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCitzdGF0aWMgY2hhciBxbGFfZHJpdmVyX25hbWVbXSA9ICJxbGE2MzEyIjsKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgIGZ3MjMwMGZseF92ZXJzaW9uW107CitleHRlcm4gdW5zaWduZWQgY2hhciAgZncyMzAwZmx4X3ZlcnNpb25fc3RyW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMzAwZmx4X2FkZHIwMTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBmdzIzMDBmbHhfY29kZTAxW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZncyMzAwZmx4X2xlbmd0aDAxOworCitzdGF0aWMgc3RydWN0IHFsYV9md19pbmZvIHFsYV9md190YmxbXSA9IHsKKwl7CisJCS5hZGRyZXNzaW5nCT0gRldfSU5GT19BRERSX05PUk1BTCwKKwkJLmZ3Y29kZQkJPSAmZncyMzAwZmx4X2NvZGUwMVswXSwKKwkJLmZ3bGVuCQk9ICZmdzIzMDBmbHhfbGVuZ3RoMDEsCisJCS5md3N0YXJ0CT0gJmZ3MjMwMGZseF9hZGRyMDEsCisJfSwKKwl7IEZXX0lORk9fQUREUl9OT01PUkUsIH0sCit9OworCitzdGF0aWMgc3RydWN0IHFsYV9ib2FyZF9pbmZvIHFsYV9ib2FyZF90YmxbXSA9IHsKKwl7CisJCS5kcnZfbmFtZQk9IHFsYV9kcml2ZXJfbmFtZSwKKwkJLmlzcF9uYW1lCT0gIklTUDYzMTIiLAorCQkuZndfaW5mbwk9IHFsYV9md190YmwsCisJfSwKKwl7CisJCS5kcnZfbmFtZQk9IHFsYV9kcml2ZXJfbmFtZSwKKwkJLmlzcF9uYW1lCT0gIklTUDYzMjIiLAorCQkuZndfaW5mbwk9IHFsYV9md190YmwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbGE2MzEyX3BjaV90YmxbXSA9IHsKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNjMxMiwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmcWxhX2JvYXJkX3RibFswXSwKKwl9LAorCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A2MzIyLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZxbGFfYm9hcmRfdGJsWzFdLAorCX0sCisJezAsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBxbGE2MzEyX3BjaV90YmwpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcWxhNjMxMl9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gcWxhMngwMF9wcm9iZV9vbmUocGRldiwKKwkgICAgKHN0cnVjdCBxbGFfYm9hcmRfaW5mbyAqKWlkLT5kcml2ZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorcWxhNjMxMl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXFsYTJ4MDBfcmVtb3ZlX29uZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHFsYTYzMTJfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicWxhNjMxMiIsCisJLmlkX3RhYmxlCT0gcWxhNjMxMl9wY2lfdGJsLAorCS5wcm9iZQkJPSBxbGE2MzEyX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHFsYTYzMTJfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcWxhNjMxMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcWxhNjMxMl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitxbGE2MzEyX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnFsYTYzMTJfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHFsYTYzMTJfaW5pdCk7Cittb2R1bGVfZXhpdChxbGE2MzEyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJRTG9naWMgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIElTUDYzeHggRkMtU0NTSSBIb3N0IEJ1cyBBZGFwdGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUUxBMlhYWF9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsNjMxMl9mdy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWw2MzEyX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkODI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsNjMxMl9mdy5jCkBAIC0wLDAgKzEsNzE0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzIFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiAzLjAzLjA4ICgxMDowMiBOb3YgMTIsIDIwMDQpCisgKi8KKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBzaG9ydCBmdzIzMDBmbHhfdmVyc2lvbiA9IDMqMTAyNCszOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV92ZXJzaW9uID0gMyoxMDI0KzM7CisjZW5kaWYKKworI2lmZGVmIFVOSVFVRV9GV19OQU1FCit1bnNpZ25lZCBjaGFyIGZ3MjMwMGZseF92ZXJzaW9uX3N0cltdID0gezMsIDMsIDh9OworI2Vsc2UKK3Vuc2lnbmVkIGNoYXIgZmlybXdhcmVfdmVyc2lvbltdID0gezMsIDMsIDh9OworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQorI2RlZmluZSBmdzIzMDBmbHhfVkVSU0lPTl9TVFJJTkcgIjMuMDMuMDgiCisjZWxzZQorI2RlZmluZSBGV19WRVJTSU9OX1NUUklORyAiMy4wMy4wOCIKKyNlbmRpZgorCisjaWZkZWYgVU5JUVVFX0ZXX05BTUUKK3Vuc2lnbmVkIHNob3J0IGZ3MjMwMGZseF9hZGRyMDEgPSAweDA4MDAgOworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDA4MDAgOworI2VuZGlmCisKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzAwZmx4X2NvZGUwMVtdID0geyAKKyNlbHNlCit1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUwMVtdID0geyAKKyNlbmRpZgorCTB4MDQ3MCwgMHgwMDAwLCAweDAwMDAsIDB4ZGQ3OSwgMHgwMDAwLCAweDAwMDMsIDB4MDAwMywgMHgwMDA4LAorCTB4MDMxNywgMHgyMDQzLCAweDRmNTAsIDB4NTk1MiwgMHg0OTQ3LCAweDQ4NTQsIDB4MjAzMiwgMHgzMDMwLAorCTB4MzEyMCwgMHg1MTRjLCAweDRmNDcsIDB4NDk0MywgMHgyMDQzLCAweDRmNTIsIDB4NTA0ZiwgMHg1MjQxLAorCTB4NTQ0OSwgMHg0ZjRlLCAweDIwNDksIDB4NTM1MCwgMHgzMjMzLCAweDMwMzAsIDB4MjA0NiwgMHg2OTcyLAorCTB4NmQ3NywgMHg2MTcyLCAweDY1MjAsIDB4MjA1NiwgMHg2NTcyLCAweDczNjksIDB4NmY2ZSwgMHgyMDMwLAorCTB4MzMyZSwgMHgzMDMzLCAweDJlMzAsIDB4MzgyMCwgMHgyMDIwLCAweDIwMjAsIDB4MjQwMCwgMHgyMGE5LAorCTB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLCAweDIyMDAsIDB4MjBhOSwgMHgwMDBmLAorCTB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyNDAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLAorCTB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjYwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLAorCTB4NDAwZiwgMHgyMDkxLCAweDI4MDAsIDB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLAorCTB4MjA5MSwgMHgyYTAwLCAweDIwYTksIDB4MDAwZiwgMHgyMDAxLCAweDAwMDAsIDB4NDAwZiwgMHgyMDkxLAorCTB4MmMwMCwgMHgyMGE5LCAweDAwMGYsIDB4MjAwMSwgMHgwMDAwLCAweDQwMGYsIDB4MjA5MSwgMHgyZTAwLAorCTB4MjBhOSwgMHgwMDBmLCAweDIwMDEsIDB4MDAwMCwgMHg0MDBmLCAweDIwOTEsIDB4MjAwMCwgMHgyMDAxLAorCTB4MDAwMCwgMHgyMGMxLCAweDAwMDQsIDB4MjBjOSwgMHgxYmZmLCAweDIwNTksIDB4MDAwMCwgMHgyYjc4LAorCTB4Nzg4MywgMHgwMDA0LCAweDIwODksIDB4MmNmZiwgMHgyMDUxLCAweDE4MDAsIDB4MmE3MCwgMHgyMGUxLAorCTB4MDAwMSwgMHgyMGU5LCAweDAwMDEsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MGU3NSwgMHgyMDI5LAorCTB4MjQ4MCwgMHgyMDMxLCAweGZmZmYsIDB4MjAzOSwgMHgyNDUwLCAweDIwMjEsIDB4MDA1MCwgMHgyMGU5LAorCTB4MDAwMSwgMHgyMGExLCAweDAwMDAsIDB4MjBhOSwgMHgwODAwLCAweDkwMGUsIDB4NDEwNCwgMHgyMGU5LAorCTB4MDAwMSwgMHgyMGExLCAweDEwMDAsIDB4OTAwZSwgMHgyMDAxLCAweDBjYzAsIDB4OTA4NCwgMHgwZmZmLAorCTB4MjBhOCwgMHg0MTA0LCAweDIwMDEsIDB4MDAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDEyMCwgMHgyMWE4LAorCTB4NDEwNCwgMHg4MDAxLCAweDFkZTAsIDB4NzU2YSwgMHg3NjZlLCAweDc3NjYsIDB4NzQ3MiwgMHg3NDc2LAorCTB4MDBlNiwgMHgyMDcxLCAweDFhYTIsIDB4MjQ3MiwgMHgwMGVlLCAweDIwYTEsIDB4MWNkMCwgMHg3MTZjLAorCTB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg5MThjLCAweDAwMGYsIDB4MjAwMSwgMHgwMDAxLAorCTB4OTExMiwgMHg5MDBlLCAweDIxYTgsIDB4NDEwNCwgMHg4MjExLCAweDFkZTAsIDB4NzE2YywgMHgzNDAwLAorCTB4ODAwMSwgMHg5MTAyLCAweDAxMjAsIDB4MDIxOCwgMHgyMGE4LCAweDkwMGUsIDB4NDEwNCwgMHgyMDA5LAorCTB4MTgwMCwgMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4OTE4YywgMHgwMDFmLAorCTB4MjAwMSwgMHgwMDAxLCAweDkxMTIsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MDgwMCwgMHg5MDBlLAorCTB4MjBhOSwgMHgwODAwLCAweDQxMDQsIDB4ODIxMSwgMHgxZGQ4LCAweDA4MGMsIDB4MGY0OSwgMHgwODBjLAorCTB4NWYzOSwgMHgwODBjLCAweGEwNzksIDB4MDgwYywgMHgxMTAwLCAweDA4MGMsIDB4MTJmOCwgMHgwODBjLAorCTB4MWFmNSwgMHgwODBjLCAweDBkOGMsIDB4MDgwYywgMHgxMDg1LCAweDA4MGMsIDB4MzNlOSwgMHgwODBjLAorCTB4NzUxOCwgMHgwODBjLCAweDY4N2UsIDB4MDgwYywgMHg4MjE1LCAweDA4MGMsIDB4MjNiZCwgMHgwODBjLAorCTB4ODUyNiwgMHgwODBjLCAweDdiOTksIDB4MDgwYywgMHgyMWU5LCAweDA4MGMsIDB4MjMxZCwgMHgwODBjLAorCTB4MjNiMiwgMHgyMDkxLCAweDMwMDksIDB4Nzg4MywgMHgwMDAwLCAweDEwMDQsIDB4MDkxZCwgMHg3ODgwLAorCTB4OTA4NiwgMHgwMDAyLCAweDExOTAsIDB4Nzg4MywgMHg0MDAwLCAweDc4MzcsIDB4NDAwMCwgMHg3ODMzLAorCTB4MDAxMCwgMHgwZTA0LCAweDA5MTEsIDB4MjA5MSwgMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDIwNzEsIDB4MTgwMCwgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzAwMCwgMHg5MDhlLCAweDAwMDMsIDB4MTE2OCwgMHgwODBjLAorCTB4NGJlNCwgMHgwODBjLCAweDM0MTAsIDB4MDgwYywgMHg3NTgwLCAweDA4MGMsIDB4NmQyZSwgMHgwODBjLAorCTB4ODIzZSwgMHgwODBjLCAweDJjMmMsIDB4MGM2OCwgMHgwMDBiLCAweDBjODgsIDB4MDk0MCwgMHgwOTQxLAorCTB4MGFkOCwgMHgwOTNlLCAweDBiOGYsIDB4MGQ4YiwgMHgwZDhiLCAweDBkOGIsIDB4MDgwYywgMHgwZGZhLAorCTB4MDAwNSwgMHgwMTI2LCAweDAwZjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAxLAorCTB4MTkwNCwgMHgwYWFiLCAweDA4MGMsIDB4MGViNywgMHgwODBjLCAweDcyMDcsIDB4MDE1MCwgMHgwODBjLAorCTB4NzIyYSwgMHgxNWEwLCAweDIwNzksIDB4MDEwMCwgMHg3ODI4LCAweDkwODUsIDB4MTgwMCwgMHg3ODJhLAorCTB4MDQ2OCwgMHgwODBjLCAweDcxMjcsIDB4NzAwMCwgMHg5MDg2LCAweDAwMDEsIDB4MTkwNCwgMHgwYWFiLAorCTB4NzA5NCwgMHg5MDg2LCAweDAwMjgsIDB4MTkwNCwgMHgwYWFiLCAweDA4MGMsIDB4ODFmZSwgMHgwODBjLAorCTB4ODFmMCwgMHgyMDAxLCAweDAxNjEsIDB4MjAwMywgMHgwMDAxLCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LAorCTB4ZmZmZiwgMHg3YTI4LCAweDkyOTUsIDB4NWUyZiwgMHg3YTJhLCAweDIwMTEsIDB4NzA3NiwgMHgwODBjLAorCTB4ODJkYSwgMHgyMDExLCAweDcwNjksIDB4MDgwYywgMHg4M2FlLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLAorCTB4ODJkYSwgMHgyMDExLCAweDgwMzAsIDB4OTAxZSwgMHg3MzkyLCAweDA0ZDAsIDB4MDgwYywgMHg1NjQxLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4NDQsIDB4OTAwNSwgMHgxOTA0LCAweDBhYWIsIDB4MjAxMSwgMHg1ZDk0LAorCTB4MDgwYywgMHg4MmRhLCAweDIwMTEsIDB4NzA3NiwgMHgwODBjLCAweDgyZGEsIDB4MjAxMSwgMHg3MDY5LAorCTB4MDgwYywgMHg4M2FlLCAweDIwMDEsIDB4MDI2NSwgMHgyMDAxLCAweDAyMDUsIDB4MjAwMywgMHgwMDAwLAorCTB4Nzg0MCwgMHg5MDg0LCAweGZmZmIsIDB4Nzg0MiwgMHgyMDAxLCAweDE5N2UsIDB4MjAwNCwgMHg5MDA1LAorCTB4MTE0MCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHgwODBjLCAweDVlZTEsIDB4MDBjZSwgMHgwODA0LAorCTB4MGFhYiwgMHg3ODBmLCAweDAwNmIsIDB4N2EyOCwgMHgwODBjLCAweDcyMGYsIDB4MDExOCwgMHg5Mjk1LAorCTB4NWUyZiwgMHgwMDEwLCAweDkyOTUsIDB4NDAyZiwgMHg3YTJhLCAweDIwMTEsIDB4ODAxMCwgMHg3M2Q0LAorCTB4MjAwMSwgMHgxOTdmLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDJhODksIDB4MDgwYywgMHg0YjFmLAorCTB4NzI0NCwgMHhjMjg0LCAweDcyNDYsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFhYywgMHhjMWNjLAorCTB4MjEwMiwgMHgwODBjLCAweDk5MDQsIDB4MjAxMSwgMHgwMDA0LCAweDA4MGMsIDB4YmU0NywgMHgwODBjLAorCTB4NjZjMiwgMHgwODBjLCAweDcyMDcsIDB4MTEyMCwgMHgwODBjLCAweDJhZjYsIDB4MDJlMCwgMHgwNDAwLAorCTB4MDgwYywgMHg1ZWU4LCAweDAxNDAsIDB4NzA5MywgMHgwMDAxLCAweDcwY2YsIDB4MDAwMCwgMHgwODBjLAorCTB4NTgwZSwgMHgwODA0LCAweDBhYWIsIDB4MDgwYywgMHg1NWRiLCAweGQwOTQsIDB4MDE4OCwgMHgyMDExLAorCTB4MTgwYywgMHgyMjA0LCAweGMwY2QsIDB4MjAxMiwgMHgwODBjLCAweDU1ZGYsIDB4ZDBkNCwgMHgxMTE4LAorCTB4MDgwYywgMHgyYWY2LCAweDEyNzAsIDB4MjAxMSwgMHgxODBjLCAweDIyMDQsIDB4YzBiYywgMHgwMDg4LAorCTB4MDgwYywgMHg1NWRmLCAweGQwZDQsIDB4MWRiOCwgMHgyMDExLCAweDE4MGMsIDB4MjIwNCwgMHhjMGJkLAorCTB4MDA0MCwgMHgyMDExLCAweDE4MGMsIDB4MjIwNCwgMHhjMGJkLCAweDIwMTIsIDB4MDgwYywgMHg2N2JiLAorCTB4MDAwOCwgMHgyMDEyLCAweDA4MGMsIDB4Njc4MSwgMHgwMTIwLCAweDdhMGMsIDB4YzJiNCwgMHg3YTBlLAorCTB4MDBhOCwgMHg3MDdiLCAweDAwMDAsIDB4MDgwYywgMHg3MjA3LCAweDExMzAsIDB4NzBhYywgMHg5MDA1LAorCTB4MTE2OCwgMHgwODBjLCAweGMyOGEsIDB4MDA1MCwgMHgwODBjLCAweGMyOGEsIDB4NzBkOCwgMHhkMDljLAorCTB4MTEyOCwgMHg3MGFjLCAweDkwMDUsIDB4MDExMCwgMHgwODBjLCAweDVlYmUsIDB4NzBlMywgMHgwMDAwLAorCTB4NzBkZiwgMHgwMDAwLCAweDcwYTMsIDB4MDAwMCwgMHgwODBjLCAweDJhZmUsIDB4MDIyOCwgMHgyMDExLAorCTB4MDEwMSwgMHgyMjA0LCAweGMwYzQsIDB4MjAxMiwgMHg3MmQ4LCAweDA4MGMsIDB4NzIwNywgMHgxMTc4LAorCTB4OTAxNiwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwgMHgyMDE5LCAweDE5NDUsIDB4MjExYSwgMHgwMDFlLAorCTB4NzA1YiwgMHhmZmZmLCAweDcwNWYsIDB4MDBlZiwgMHg3MDdmLCAweDAwMDAsIDB4MDAyMCwgMHgyMDE5LAorCTB4MTk0NSwgMHgyMDFiLCAweDAwMDAsIDB4MjA3OSwgMHgxODViLCAweDc4MDQsIDB4ZDBhYywgMHgwMTA4LAorCTB4YzI5NSwgMHg3MmRhLCAweDA4MGMsIDB4NzIwNywgMHgwMTE4LCAweDkyOTYsIDB4MDAwNCwgMHgwNTQ4LAorCTB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4YmU0NywgMHg3MGE3LCAweDAwMDAsIDB4NzBhYiwgMHhmZmZmLAorCTB4NzAwMywgMHgwMDAyLCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweDAwMDMsIDB4NzgyOCwgMHg5MDg1LAorCTB4MDAwMywgMHg3ODJhLCAweDAwZmUsIDB4MDgwYywgMHgyZjZjLCAweDIwMTEsIDB4MDAwNSwgMHgwODBjLAorCTB4OWEwZiwgMHgwODBjLCAweDhjMTAsIDB4MDgwYywgMHg3MjA3LCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLAorCTB4MDEwMCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwgMHg2MWUyLCAweDAwMWUsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDQyMCwgMHg3MGE3LCAweDAwMDAsIDB4NzBhYiwgMHhmZmZmLCAweDcwMDMsIDB4MDAwMiwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDc4MjcsIDB4MDAwMywgMHg3ODI4LCAweDkwODUsIDB4MDAwMywgMHg3ODJhLAorCTB4MDBmZSwgMHgyMDExLCAweDAwMDUsIDB4MDgwYywgMHg5YTBmLCAweDA4MGMsIDB4OGMxMCwgMHgwODBjLAorCTB4NzIwNywgMHgwMTQ4LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDAwMTYsIDB4MjAwOSwgMHgwMDAyLAorCTB4NjFlMiwgMHgwMDFlLCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGI2LAorCTB4MDgwYywgMHg3MjA3LCAweDExMTgsIDB4MjBhOSwgMHgwODAwLCAweDAwMTAsIDB4MjBhOSwgMHgwNzgyLAorCTB4MDgwYywgMHg3MjA3LCAweDExMTAsIDB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MDA3ZSwgMHg4NmZmLAorCTB4MDEzOCwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxMTAsIDB4YjgwMCwgMHhkMGJjLAorCTB4MDkwYywgMHgzMjg2LCAweDgxMDgsIDB4MWYwNCwgMHgwYWJmLCAweDcwN2IsIDB4MDAwMCwgMHg3MDdjLAorCTB4OTA4NCwgMHgwMGZmLCAweDcwN2UsIDB4NzBhZiwgMHgwMDAwLCAweDAwYmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxOTA0LAorCTB4MGI4YywgMHg3MGE4LCAweDkwODYsIDB4ZmZmZiwgMHgwMTMwLCAweDA4MGMsIDB4MmY2YywgMHgwODBjLAorCTB4OGMxMCwgMHgwODA0LCAweDBiOGMsIDB4NzBkOCwgMHhkMGFjLCAweDExMTAsIDB4ZDA5YywgMHgwNTQwLAorCTB4ZDA4NCwgMHgwNTMwLCAweDAwMDYsIDB4MjAwMSwgMHgwMTAzLCAweDIwMDMsIDB4MDAyYiwgMHgwMDBlLAorCTB4ZDA4YywgMHgwMWYwLCAweDcwZGMsIDB4OTA4NiwgMHhmZmZmLCAweDAxYjAsIDB4MDgwYywgMHgzMGY3LAorCTB4MDgwYywgMHg4YzEwLCAweDcwZDgsIDB4ZDA5NCwgMHgxOTA0LCAweDBiOGMsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHhjNTM5LCAweDAxMTAsIDB4MjAxMSwgMHgwMDAzLCAweDkwMWUsIDB4MDgwYywgMHgzMTMxLAorCTB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4MGI4YywgMHg3MGUwLCAweDkwMDUsIDB4MTkwNCwgMHgwYjhjLAorCTB4NzBhNCwgMHg5MDA1LCAweDE5MDQsIDB4MGI4YywgMHg3MGQ4LCAweGQwYTQsIDB4MDExOCwgMHhkMGI0LAorCTB4MDkwNCwgMHgwYjhjLCAweDA4MGMsIDB4Njc4MSwgMHgxOTA0LCAweDBiOGMsIDB4MDgwYywgMHg2N2Q0LAorCTB4MTkwNCwgMHgwYjhjLCAweDA4MGMsIDB4NjdiYiwgMHgwMWMwLCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LAorCTB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2NDlmLCAweDExMTgsIDB4YjgwMCwgMHhkMGVjLAorCTB4MTEzOCwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHgwYjMyLCAweDAwY2UsIDB4MDE1ZSwgMHgwMDI4LAorCTB4MDAxZSwgMHgwMGNlLCAweDAxNWUsIDB4MDgwNCwgMHgwYjhjLCAweDAwMDYsIDB4MjAwMSwgMHgwMTAzLAorCTB4MjAwMywgMHgwMDZiLCAweDAwMGUsIDB4MjAxMSwgMHgxOThiLCAweDA4MGMsIDB4MGZiOSwgMHgyMDExLAorCTB4MTlhNSwgMHgwODBjLCAweDBmYjksIDB4NzAzMCwgMHhjMDhjLCAweDcwMzIsIDB4NzAwMywgMHgwMDAzLAorCTB4NzBhYiwgMHhmZmZmLCAweDA4MGMsIDB4MGU5OSwgMHg5MDA2LCAweDA4MGMsIDB4MjcxNywgMHgwMDM2LAorCTB4MDA0NiwgMHgyMDE5LCAweGZmZmYsIDB4MjAyMSwgMHgwMDA2LCAweDA4MGMsIDB4NGNiYywgMHgwMDRlLAorCTB4MDAzZSwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwODBjLCAweDcyMmEsIDB4MDE1MCwgMHgwODBjLAorCTB4NzIwNywgMHg3ODI4LCAweDAxMTgsIDB4OTA4NCwgMHhlMWZmLCAweDAwMTAsIDB4OTA4NCwgMHhmZmRmLAorCTB4NzgyYSwgMHgwMGZlLCAweDIwMDEsIDB4MTljMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwNSwgMHgxMTIwLAorCTB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4OWEwZiwgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg5YTE5LAorCTB4MDgwYywgMHg4YzEwLCAweDA4MGMsIDB4OGNlZCwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDE2LAorCTB4MDA0NiwgMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDEwMCwgMHg3OTA0LAorCTB4OTE4YywgMHhmZmZkLCAweDc5MDYsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsIDB4NWVhNywgMHg3OTQwLAorCTB4OTE4YywgMHgwMDEwLCAweDc5NDIsIDB4NzkyNCwgMHhkMWI0LCAweDAxMTAsIDB4NzgyNywgMHgwMDQwLAorCTB4ZDE5YywgMHgwMTEwLCAweDc4MjcsIDB4MDAwOCwgMHgwMDA2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDAxLAorCTB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgxOTA0LCAweDBjMjMsIDB4Nzk1NCwgMHhkMWFjLAorCTB4MTkwNCwgMHgwYzIzLCAweDIwMDEsIDB4MTk3ZiwgMHgyMDA0LCAweDkwMDUsIDB4MTUxOCwgMHgwODBjLAorCTB4MmI5OCwgMHgxMTQ4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDJhYjgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MDgwYywgMHgyYTliLCAweDAwYjgsIDB4MDgwYywgMHgyYmEwLCAweDExMzgsIDB4OTAwNiwgMHgwODBjLAorCTB4MmFiOCwgMHg5MDA2LCAweDA4MGMsIDB4MmE5YiwgMHgwMDY4LCAweDA4MGMsIDB4MmJhOCwgMHgxZDUwLAorCTB4MjAwMSwgMHgxOTcwLCAweDIwMDQsIDB4ZDBmYywgMHgwMTA4LCAweDAwMjAsIDB4MDgwYywgMHgyOGIyLAorCTB4MDgwNCwgMHgwZDMzLCAweDA4MGMsIDB4NzIxOCwgMHgwMTQ4LCAweDA4MGMsIDB4NzIyYSwgMHgxMTE4LAorCTB4MDgwYywgMHg3NTEzLCAweDAwNTAsIDB4MDgwYywgMHg3MjBmLCAweDBkZDAsIDB4MDgwYywgMHg3NTBlLAorCTB4MDgwYywgMHg3NTA0LCAweDA4MGMsIDB4NzEyNywgMHgwMDU4LCAweDA4MGMsIDB4NzIwNywgMHgwMTQwLAorCTB4MjAwOSwgMHgwMGY4LCAweDA4MGMsIDB4NWVhNywgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLAorCTB4MjBhOSwgMHgwOWM0LCAweDc4MjAsIDB4ZDA5YywgMHgxMTM4LCAweDA4MGMsIDB4NzIwNywgMHgwMTM4LAorCTB4NzgyNCwgMHhkMGFjLCAweDE5MDQsIDB4MGQzOCwgMHgxZjA0LCAweDBjMDIsIDB4MDA3MCwgMHg3ODI0LAorCTB4MDgwYywgMHg3MjIxLCAweDAxMTgsIDB4ZDBhYywgMHgxOTA0LCAweDBkMzgsIDB4OTA4NCwgMHgxODAwLAorCTB4MGQ5OCwgMHg3MDAzLCAweDAwMDEsIDB4MDgwNCwgMHgwZDM4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MjcxNywgMHgwODA0LCAweDBkNWEsIDB4MjAwMSwgMHgxOTdmLCAweDIwMDQsIDB4OTAwNSwgMHgxNTE4LAorCTB4MDgwYywgMHgyYjk4LCAweDExNDgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MmFiOCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDJhOWIsIDB4MDBiOCwgMHgwODBjLCAweDJiYTAsIDB4MTEzOCwgMHg5MDA2LAorCTB4MDgwYywgMHgyYWI4LCAweDkwMDYsIDB4MDgwYywgMHgyYTliLCAweDAwNjgsIDB4MDgwYywgMHgyYmE4LAorCTB4MWQ1MCwgMHgyMDAxLCAweDE5NzAsIDB4MjAwNCwgMHhkMGZjLCAweDAxMDgsIDB4MDAyMCwgMHgwODBjLAorCTB4MjhiMiwgMHgwODA0LCAweDBkMzMsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MDFmOCwgMHg3ODUwLCAweDkwODUsIDB4MDA0MCwgMHg3ODUyLCAweDc5MzgsIDB4Nzg1MCwgMHg5MDg0LAorCTB4ZmJjZiwgMHg3ODUyLCAweDA4MGMsIDB4MmJiMCwgMHg5MDg1LCAweDIwMDAsIDB4Nzg1MiwgMHg3OTNhLAorCTB4MjBhOSwgMHgwMDQ2LCAweDFkMDQsIDB4MGM2MiwgMHgwODBjLCAweDgzOGUsIDB4MWYwNCwgMHgwYzYyLAorCTB4Nzg1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwgMHhkZmJmLCAweDc4NTIsIDB4NzkzYSwgMHgwMDYwLAorCTB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4MmNmNSwgMHgyMGE5LCAweDAwM2EsIDB4MWQwNCwgMHgwYzc2LAorCTB4MDgwYywgMHg4MzhlLCAweDFmMDQsIDB4MGM3NiwgMHgwODBjLCAweDcyMTgsIDB4MDE0OCwgMHgwODBjLAorCTB4NzIyYSwgMHgxMTE4LCAweDA4MGMsIDB4NzUxMywgMHgwMDUwLCAweDA4MGMsIDB4NzIwZiwgMHgwZGQwLAorCTB4MDgwYywgMHg3NTBlLCAweDA4MGMsIDB4NzUwNCwgMHgwODBjLCAweDcxMjcsIDB4MDAyMCwgMHgyMDA5LAorCTB4MDBmOCwgMHgwODBjLCAweDVlYTcsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MDE2OCwgMHgyMGE5LCAweDAwMjgsIDB4YTAwMSwgMHgxZjA0LCAweDBjOWIsIDB4Nzg1MCwgMHg5MDg1LAorCTB4MTQwMCwgMHg3ODUyLCAweDA4MGMsIDB4NzIwNywgMHgwMTU4LCAweDAwMzAsIDB4Nzg1MCwgMHhjMGU1LAorCTB4Nzg1MiwgMHgwODBjLCAweDcyMDcsIDB4MDEyMCwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLAorCTB4MjAyMSwgMHhlNjc4LCAweDIwMTksIDB4ZWE2MCwgMHgwZDBjLCAweDgzOGUsIDB4NzgyMCwgMHhkMDljLAorCTB4MTU5MCwgMHgwODBjLCAweDcyMDcsIDB4MDkwNCwgMHgwZDE3LCAweDc4MjQsIDB4ZDBhYywgMHgxOTA0LAorCTB4MGQzOCwgMHgwODBjLCAweDcyMmEsIDB4MTUzOCwgMHgwMDQ2LCAweDIwMjEsIDB4MDMyMCwgMHg4NDIxLAorCTB4MWRmMCwgMHgwMDRlLCAweDc4MjcsIDB4MTgwMCwgMHgwODBjLCAweDJiYjAsIDB4NzgyNCwgMHg5MDg0LAorCTB4MTgwMCwgMHgxMTY4LCAweDk0ODQsIDB4MGZmZiwgMHgxMTQwLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4OTA4NCwgMHg5MDAwLCAweDAxMTAsIDB4MDgwYywgMHgwZDY4LCAweDg0MjEsIDB4MTE2MCwgMHgxZDA0LAorCTB4MGNlMywgMHgwODBjLCAweDgzOGUsIDB4MDgwYywgMHg3NTBlLCAweDA4MGMsIDB4NzUwNCwgMHg3MDAzLAorCTB4MDAwMSwgMHgwODA0LCAweDBkMzgsIDB4ODMxOSwgMHgxOTM4LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LAorCTB4OTA4NiwgMHgwMDBhLCAweDExNDAsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4OTA4NCwgMHg5MDAwLAorCTB4MDExMCwgMHgwODBjLCAweDBkNjgsIDB4MWQwNCwgMHgwY2ZmLCAweDA4MGMsIDB4ODM4ZSwgMHgyMDA5LAorCTB4MTk3MywgMHgyMTA0LCAweDkwMDUsIDB4MDExOCwgMHg4MDAxLCAweDIwMGEsIDB4MTE3OCwgMHgyMDBiLAorCTB4MDAwYSwgMHg3ODI3LCAweDAwNDgsIDB4MjBhOSwgMHgwMDAyLCAweDA4MGMsIDB4MmI5MSwgMHg3OTI0LAorCTB4MDgwYywgMHgyYmIwLCAweGQxOWMsIDB4MDExMCwgMHgwODBjLCAweDJhODksIDB4MDBlMCwgMHgwODBjLAorCTB4NzIxOCwgMHgxMTQwLCAweDk0YTIsIDB4MDNlOCwgMHgxMTI4LCAweDA4MGMsIDB4NzFkZiwgMHg3MDAzLAorCTB4MDAwMSwgMHgwMGIwLCAweDc4MjcsIDB4MTgwMCwgMHgwODBjLCAweDJiYjAsIDB4NzgyNCwgMHgwODBjLAorCTB4NzIyMSwgMHgwMTEwLCAweGQwYWMsIDB4MTE2MCwgMHg5MDg0LCAweDE4MDAsIDB4MDkwNCwgMHgwY2ViLAorCTB4NzAwMywgMHgwMDAxLCAweDAwMjgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjcxNywgMHgwMGMwLAorCTB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDExMTgsIDB4Nzg1MCwgMHhjMGU0LAorCTB4Nzg1MiwgMHgyMDA5LCAweDE4MGMsIDB4MjEwYywgMHhkMTljLCAweDExMjAsIDB4NzkwNCwgMHg5MThkLAorCTB4MDAwMiwgMHg3OTA2LCAweDc4MjcsIDB4MDA0OCwgMHg3ODI4LCAweDkwODUsIDB4MDAyOCwgMHg3ODJhLAorCTB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDAxMjAsIDB4Nzg1MCwgMHg5MDg1LAorCTB4MDQwMCwgMHg3ODUyLCAweDIwMDEsIDB4MTk3ZiwgMHgyMDAzLCAweDAwMDAsIDB4OTAwNiwgMHg3OGYyLAorCTB4MDE1ZSwgMHgwMDNlLCAweDAwMGUsIDB4MDEyZSwgMHgwMGZlLCAweDAwNGUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwMzYsIDB4MDA0NiwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MDBmNiwgMHgwMTU2LCAweDAwNjksIDB4MGQwYywgMHg4MzhlLCAweDAxNWUsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDE4OWMsIDB4NzAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MTExMCwgMHgwODBjLAorCTB4MzQxMCwgMHgwMGVlLCAweDAwMDUsIDB4MDAwNSwgMHgyYTcwLCAweDIwNjEsIDB4MTk4MywgMHgyMDYzLAorCTB4MDAwMywgMHg2MDA3LCAweDAwMDMsIDB4NjAwYiwgMHgwMDA4LCAweDYwMGYsIDB4MDMxNywgMHgyMDAxLAorCTB4MTk1NCwgMHg5MDBlLCAweDIxMDIsIDB4NzE5MiwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDgyLAorCTB4MDAwMiwgMHgwMjE4LCAweDcwNWIsIDB4ZmZmZiwgMHgwMDA4LCAweDcxNWEsIDB4NzA2MywgMHhmZmZmLAorCTB4NzE3YSwgMHg3MTdlLCAweDA4MGMsIDB4YzI4YSwgMHg3MGU3LCAweDAwYzAsIDB4MjA2MSwgMHgxOTQ0LAorCTB4NjAwMywgMHgwOTA5LCAweDYxMDYsIDB4NjAwYiwgMHg4ODAwLCAweDYwMGYsIDB4MDIwMCwgMHg2MDEzLAorCTB4MDBmZiwgMHg2MDE3LCAweDAwMGYsIDB4NjExYSwgMHg2MDFmLCAweDA3ZDAsIDB4MjA2MSwgMHgxOTRjLAorCTB4NjAwMywgMHg4MDAwLCAweDYxMDYsIDB4NjEwYSwgMHg2MDBmLCAweDAyMDAsIDB4NjAxMywgMHgwMGZmLAorCTB4NjExNiwgMHg2MDFiLCAweDAwMDEsIDB4NjExZSwgMHgyMDYxLCAweDE5NjEsIDB4NjAwMywgMHg1MTRjLAorCTB4NjAwNywgMHg0ZjQ3LCAweDYwMGIsIDB4NDk0MywgMHg2MDBmLCAweDIwMjAsIDB4MjAwMSwgMHgxODJiLAorCTB4MjEwMiwgMHgwMDA1LCAweDkwMTYsIDB4MDgwYywgMHg2NDlmLCAweDExNzgsIDB4YjgwNCwgMHg5MGM0LAorCTB4MDBmZiwgMHg5OGM2LCAweDAwMDYsIDB4MDEyOCwgMHg5MGM0LCAweGZmMDAsIDB4OThjNiwgMHgwNjAwLAorCTB4MTEyMCwgMHg5MTg2LCAweDAwODAsIDB4MDEwOCwgMHg4MjEwLCAweDgxMDgsIDB4OTE4NiwgMHgwODAwLAorCTB4MWQ1MCwgMHgyMjA4LCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDAwMCwgMHgwMDBlLAorCTB4MDBmNiwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDBkZmMsIDB4MDAwNiwgMHgwMDE2LAorCTB4MjAwMSwgMHg4MDAyLCAweDAwMDYsIDB4MjA3OSwgMHgwMDAwLCAweDAwMGUsIDB4Nzg4MiwgMHg3ODM2LAorCTB4MDAxZSwgMHg3OThlLCAweDAwMGUsIDB4Nzg4YSwgMHgwMDBlLCAweDc4ODYsIDB4MzkwMCwgMHg3ODlhLAorCTB4NzgzMywgMHgwMDEyLCAweDIwOTEsIDB4NTAwMCwgMHgwMTU2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDI2LAorCTB4MjA3OSwgMHgwMzAwLCAweDIwNjksIDB4MWE3YywgMHg3YTA4LCAweDIyNmEsIDB4MjA2OSwgMHgxYTdkLAorCTB4N2ExOCwgMHgyMjZhLCAweDhkNjgsIDB4N2ExYywgMHgyMjZhLCAweDc4MmMsIDB4MjAxOSwgMHgxYThhLAorCTB4MjAxYSwgMHgyMDE5LCAweDFhOGQsIDB4OTAxNiwgMHg3ODA4LCAweGQwOWMsIDB4MDE2OCwgMHg3ODIwLAorCTB4MjAxYSwgMHg4MjEwLCAweDgzMTgsIDB4OTM4NiwgMHgxYWEyLCAweDAxMDgsIDB4MGNhOCwgMHg3ODA4LAorCTB4ZDA5YywgMHgwMTEwLCAweDIwMTEsIDB4ZGVhZCwgMHgyMDE5LCAweDFhOGIsIDB4NzgyYywgMHgyMDFhLAorCTB4ODMxOCwgMHgyMjFhLCAweDc4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDFhNWMsIDB4OTAxZSwgMHgyMGE5LAorCTB4MDAyMCwgMHg3YjI2LCAweDdhMjgsIDB4MjI2YSwgMHg4ZDY4LCAweDgzMTgsIDB4MWYwNCwgMHgwZTQ5LAorCTB4MDAyZSwgMHgwMDNlLCAweDAwZGUsIDB4MDE1ZSwgMHgyMDc5LCAweDE4MDAsIDB4NzgwMywgMHgwMDA1LAorCTB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MDE4MCwgMHgyMDAxLAorCTB4MTlmMSwgMHgyMDA0LCAweDkwMDUsIDB4MDEyOCwgMHgyMDAxLCAweDAwOGIsIDB4MjAwNCwgMHhkMGZjLAorCTB4MGRkOCwgMHgyMDAxLCAweDAwOGEsIDB4MjAwMywgMHgwMDAyLCAweDIwMDMsIDB4MTAwMSwgMHgwODBjLAorCTB4NTVlYSwgMHgxMTA4LCAweDAwOTksIDB4MGNkOCwgMHgwMDA1LCAweDkxOGMsIDB4MDNmZiwgMHgyMDAxLAorCTB4MDAwMywgMHgyMDA0LCAweDkwODQsIDB4MDYwMCwgMHgxMTE4LCAweDkxOGQsIDB4NmMwMCwgMHgwMDEwLAorCTB4OTE4ZCwgMHg2NDAwLCAweDIwMDEsIDB4MDE3ZiwgMHgyMTAyLCAweDAwMDUsIDB4MDAyNiwgMHgwMTI2LAorCTB4MjAxMSwgMHgwMDgwLCAweDA4MGMsIDB4MGYxMSwgMHgyMGE5LCAweDA5MDAsIDB4MDgwYywgMHgwZjMyLAorCTB4MjAxMSwgMHgwMDQwLCAweDA4MGMsIDB4MGYxMSwgMHgyMGE5LCAweDA5MDAsIDB4MDgwYywgMHgwZjMyLAorCTB4MGM3OCwgMHgwMDI2LCAweDA4MGMsIDB4MGYxZSwgMHgxMTE4LCAweDIwMTEsIDB4MDA0MCwgMHgwMDk4LAorCTB4MjAxMSwgMHgwMTBlLCAweDIyMTQsIDB4OTI5NCwgMHgwMDA3LCAweDkyOTYsIDB4MDAwNywgMHgwMTE4LAorCTB4MjAxMSwgMHhhODgwLCAweDAwMTAsIDB4MjAxMSwgMHg2ODQwLCAweGQwZTQsIDB4NzBlYiwgMHgwMDAwLAorCTB4MTEyMCwgMHg3MGViLCAweDBmYTAsIDB4MDgwYywgMHgwZjIzLCAweDAwMmUsIDB4MDAwNSwgMHgwMDI2LAorCTB4MDgwYywgMHgwZjFlLCAweDAxMjgsIDB4ZDBhNCwgMHgxMTM4LCAweDIwMTEsIDB4Y2RkNSwgMHgwMDEwLAorCTB4MjAxMSwgMHgwMDgwLCAweDA4MGMsIDB4MGYyMywgMHgwMDJlLCAweDAwMDUsIDB4MDAyNiwgMHg3MGViLAorCTB4MDAwMCwgMHgwODBjLCAweDBmMWUsIDB4MTE0OCwgMHgwODBjLCAweDJiYTgsIDB4MTExOCwgMHgyMDExLAorCTB4ODQ4NCwgMHgwMDU4LCAweDIwMTEsIDB4ODI4MiwgMHgwMDQwLCAweDA4MGMsIDB4MmJhOCwgMHgxMTE4LAorCTB4MjAxMSwgMHhjZGM1LCAweDAwMTAsIDB4MjAxMSwgMHhjYWMyLCAweDA4MGMsIDB4MGYyMywgMHgwMDJlLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MjA3MSwgMHgxODAwLCAweGQwYjQsIDB4NzBlNCwgMHgxMTEwLAorCTB4YzBlNCwgMHgwMDQ4LCAweDAwMDYsIDB4M2IwMCwgMHg5MDg0LCAweGZmM2YsIDB4MjBkOCwgMHgwMDBlLAorCTB4NzBlYiwgMHgwMDAwLCAweGMwZTUsIDB4MDA3OSwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweGQwZTQsIDB4NzBlNCwgMHgxMTEwLCAweGMwZGMsIDB4MDAwOCwgMHhjMGRkLAorCTB4MDAxMSwgMHgwMGVlLCAweDAwMDUsIDB4NzBlNiwgMHg3MDAwLCAweDkwODQsIDB4MDAwNywgMHgwMDBiLAorCTB4MDAwNSwgMHgwZWUwLCAweDBlYjcsIDB4MGViNywgMHgwZTk5LCAweDBlYzYsIDB4MGViNywgMHgwZWI3LAorCTB4MGVjNiwgMHgwMDE2LCAweDNiMDgsIDB4M2EwMCwgMHg5MTA0LCAweDkxOGQsIDB4MDBjMCwgMHgyMWQ4LAorCTB4OTA4NCwgMHhmZjNmLCAweDkyMDUsIDB4MjBkMCwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgxODM5LAorCTB4MjAwNCwgMHhkMGRjLCAweDAwMDUsIDB4OWU4NiwgMHgxODAwLCAweDE5MGMsIDB4MGRmYSwgMHg3MGU0LAorCTB4ZDBlNCwgMHgwMTA4LCAweGMyZTUsIDB4NzJlNiwgMHhkMGU0LCAweDExMTgsIDB4OTI5NCwgMHgwMGMwLAorCTB4MGMwMSwgMHgwMDA1LCAweDFkMDQsIDB4MGYzMiwgMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHgwZjMyLAorCTB4MDAwNSwgMHg4OTBlLCAweDgxMGUsIDB4ODEwZiwgMHg5MTk0LCAweDAwM2YsIDB4OTE4YywgMHhmZmMwLAorCTB4MDAwNSwgMHgwMDA2LCAweDIyMDAsIDB4OTE0ZCwgMHg4OTRmLCAweDg5NGQsIDB4ODk0ZCwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMWQ2LCAweDAxNDYsIDB4MDAzNiwgMHgwMDk2LCAweDIwNjEsIDB4MTg4YiwgMHg2MDBiLAorCTB4MDAwMCwgMHg2MDBmLCAweDAwMDAsIDB4NjAwMywgMHgwMDAwLCAweDYwMDcsIDB4MDAwMCwgMHgyMDA5LAorCTB4ZmZjMCwgMHgyMTA1LCAweDAwMDYsIDB4MjAwMSwgMHhhYWFhLCAweDIwMGYsIDB4MjAxOSwgMHg1NTU1LAorCTB4OTAxNiwgMHgyMDQ5LCAweDBiZmYsIDB4YWIwMiwgMHhhMDAxLCAweGEwMDEsIDB4YTgwMCwgMHg5MzA2LAorCTB4MTEzOCwgMHgyMTA1LCAweDkzMDYsIDB4MDEyMCwgMHg4MjEwLCAweDk5YzgsIDB4MDQwMCwgMHgwYzk4LAorCTB4MDAwZSwgMHgyMDBmLCAweDIwMDEsIDB4MTg5YiwgMHg5MjhhLCAweDAwMGUsIDB4MTYzOCwgMHg5MjhhLAorCTB4MDAwNiwgMHgyMDExLCAweDAwMDYsIDB4MTIxMCwgMHgyMDExLCAweDAwMDAsIDB4MjIwMiwgMHg5MDA2LAorCTB4MjAwOCwgMHg4MmZmLCAweDAxYjAsIDB4ODIwMCwgMHg2MDBhLCAweDYwMGYsIDB4ZmZmZiwgMHg2MDAzLAorCTB4MDAwMiwgMHg2MDA3LCAweDAwMDAsIDB4MDAyNiwgMHgyMDE5LCAweDAwMTAsIDB4OTI4MCwgMHgwMDAxLAorCTB4MjBlOCwgMHgyMWEwLCAweDIxYTgsIDB4NDEwNCwgMHg4MzE5LCAweDFkZTAsIDB4ODIxMSwgMHgxZGEwLAorCTB4MDAyZSwgMHgwMDllLCAweDAwM2UsIDB4MDE0ZSwgMHgwMWRlLCAweDAwMDUsIDB4MjAxMSwgMHgwMDBlLAorCTB4MDhlOCwgMHgwMDE2LCAweDAwMjYsIDB4MDA5NiwgMHgzMzQ4LCAweDA4MGMsIDB4MGYzOSwgMHgyMTAwLAorCTB4OTMwMCwgMHgyMDk4LCAweDIyZTAsIDB4MDA5ZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAzNiwgMHgzNTE4LAorCTB4MjBhOSwgMHgwMDAxLCAweDQwMDIsIDB4ODAwNywgMHg0MDA0LCAweDgzMTksIDB4MWRkOCwgMHgwMDNlLAorCTB4MDAwNSwgMHgyMGU5LCAweDAwMDEsIDB4NzFiNCwgMHg4MWZmLCAweDExYzAsIDB4OTAwNiwgMHgyMDA5LAorCTB4MDIwMCwgMHgyMGE5LCAweDAwMDIsIDB4OTI5OCwgMHgwMDE4LCAweDIzYTAsIDB4NDAwMSwgMHgyMDA5LAorCTB4MDcwMCwgMHgyMGE5LCAweDAwMDIsIDB4OTI5OCwgMHgwMDA4LCAweDIzYTAsIDB4NDAwMSwgMHg3MDc4LAorCTB4ODAwNywgMHg3MTdjLCAweDgxMGYsIDB4MjBhOSwgMHgwMDAyLCAweDQwMDEsIDB4OTI5OCwgMHgwMDBjLAorCTB4MjNhMCwgMHg5MDBlLCAweDA4MGMsIDB4MGRkYSwgMHgyMDAxLCAweDAwMDAsIDB4ODEwZiwgMHgyMGE5LAorCTB4MDAwMiwgMHg0MDAxLCAweDAwMDUsIDB4ODlmZiwgMHgwMTQwLCAweGE4MDQsIDB4YTgwNywgMHgwMDAwLAorCTB4MDAwNiwgMHgwODBjLCAweDEwNjMsIDB4MDA5ZSwgMHgwY2IwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwMCwgMHgwODBjLCAweDEwZGMsIDB4MDkwYywgMHgwZGZhLCAweDAwZWUsIDB4MDAwNSwgMHgwMDg2LAorCTB4MDBlNiwgMHgwMDA2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM5LAorCTB4MjA3MSwgMHgxODAwLCAweDczYmMsIDB4NzAyYywgMHg5MDE2LCAweDkwNDUsIDB4MDE1OCwgMHg4MjEwLAorCTB4OTkwNiwgMHgwOTBjLCAweDBkZmEsIDB4MjMwMCwgMHg5MjAyLCAweDAxMjAsIDB4MWEwYywgMHgwZGZhLAorCTB4YTAwMCwgMHgwYzk4LCAweDAxMmUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDhlLAorCTB4MDAwNSwgMHgwMDg2LCAweDAwZTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MTkwZSwgMHg3MDEwLCAweDkwMDUsIDB4MDE0MCwgMHg3MDE4LCAweDkwNDUsIDB4MDEyOCwgMHg5OTA2LAorCTB4MDkwYywgMHgwZGZhLCAweGEwMDAsIDB4MGNjOCwgMHgwMTJlLCAweDAwMGUsIDB4MDBlZSwgMHgwMDhlLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MGJjLAorCTB4ODAwMSwgMHgwMjcwLCAweDcwYmUsIDB4NzAyYywgMHgyMDQ4LCAweDkwODUsIDB4MDAwMSwgMHhhODAwLAorCTB4NzAyZSwgMHhhODAzLCAweDAwMDAsIDB4YTgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4OTA0ZSwgMHgwY2Q4LCAweDAwZTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxODAwLAorCTB4NzBiYywgMHg5MGNhLCAweDAwNDAsIDB4MDI2OCwgMHg4MDAxLCAweDcwYmUsIDB4NzAyYywgMHgyMDQ4LAorCTB4YTgwMCwgMHg3MDJlLCAweGE4MDMsIDB4MDAwMCwgMHhhODA3LCAweDAwMDAsIDB4MDEyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg5MDRlLCAweDBjZDgsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDE2LAorCTB4ODkwZSwgMHg4MTBlLCAweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweGE4NjIsIDB4OTE4NCwgMHhmZmMwLAorCTB4YTg1ZSwgMHgwMDFlLCAweDAwMjAsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYmMsIDB4ODAwMCwgMHg3MGJlLAorCTB4MDgwYywgMHg4MWYwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDI2LAorCTB4MjAwOSwgMHgwMDAwLCAweDIwNDksIDB4MDQwMCwgMHgyOTAwLCAweDcwMmUsIDB4ODk0MCwgMHgyODAwLAorCTB4YTgwMiwgMHhhOTVlLCAweGE4NjMsIDB4MDAwMSwgMHg4NDIwLCAweDk4ODYsIDB4MDQ0MCwgMHgwMTIwLAorCTB4Mjg0OCwgMHg5MTg4LCAweDAwNDAsIDB4MGM5MCwgMHgyMDcxLCAweDE4OGIsIDB4NzAwMCwgMHg5MDA1LAorCTB4MTFhMCwgMHgyMDAxLCAweDA0OTIsIDB4YTgwMiwgMHgyMDQ4LCAweDIwMDksIDB4MjQ4MCwgMHg4OTQwLAorCTB4MjgwMCwgMHhhODAyLCAweGE5NWUsIDB4YTg2MywgMHgwMDAxLCAweDg0MjAsIDB4OTg4NiwgMHgwODAwLAorCTB4MDEyMCwgMHgyODQ4LCAweDkxODgsIDB4MDA0MCwgMHgwYzkwLCAweDIwNzEsIDB4MTg4YiwgMHg3MTA0LAorCTB4NzIwMCwgMHg4MmZmLCAweDAxZDAsIDB4NzMwOCwgMHg4MzE4LCAweDgzMWYsIDB4ODMxYiwgMHg4MzFiLAorCTB4NzMxMiwgMHg4MzE5LCAweDIwMDEsIDB4MDgwMCwgMHhhODAyLCAweDIwNDgsIDB4ODkwMCwgMHhhODAyLAorCTB4MjA0MCwgMHhhOTVlLCAweGFhNjIsIDB4ODQyMCwgMHgyMzAwLCAweDk5MDYsIDB4MDEzMCwgMHgyODQ4LAorCTB4OTE4OCwgMHgwMDQwLCAweDkyOTEsIDB4MDAwMCwgMHgwYzg4LCAweGE4MDMsIDB4MDAwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3NGJhLCAweDc0YmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMTYsIDB4OTk4NCwgMHhmYzAwLAorCTB4MDFlOCwgMHg5MDhjLCAweGY4MDAsIDB4MTE2OCwgMHg5OTgyLCAweDA0MDAsIDB4MDJiOCwgMHg5OTgyLAorCTB4MDQ0MCwgMHgwMjc4LCAweDk5ODIsIDB4MDQ5MiwgMHgwMjg4LCAweDk5ODIsIDB4MDgwMCwgMHgxMjcwLAorCTB4MDA0MCwgMHg5OTgyLCAweDA4MDAsIDB4MDI1MCwgMHgyMDcxLCAweDE4OGIsIDB4NzAxMCwgMHg5OTAyLAorCTB4MTIyOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LAorCTB4MDBlNiwgMHgyMDcxLCAweDE5ZjAsIDB4NzAwNywgMHgwMDAwLCAweDkwMDYsIDB4NzAxZSwgMHg3MDIyLAorCTB4NzAwMiwgMHgyMDcxLCAweDAwMDAsIDB4NzAxMCwgMHg5MDg1LCAweDgwNDQsIDB4NzAxMiwgMHgyMDcxLAorCTB4MDA4MCwgMHg5MDA2LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MDAwZSwgMHgxMTU4LCAweDcwMmIsIDB4MDA2MCwgMHgyMGE5LCAweDAwNDAsIDB4NzAyMiwgMHgxZjA0LAorCTB4MTExZSwgMHg3MDJiLCAweDAwNjAsIDB4NzAyYiwgMHgwMDIwLCAweDIwYTksIDB4MDA0MCwgMHg3MDIyLAorCTB4MWYwNCwgMHgxMTI3LCAweDcwMmIsIDB4MDAyMCwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMGU2LCAweGEwNmYsIDB4MDAwMCwgMHgyMDcxLCAweDE5ZjAsIDB4NzAxYywgMHg5MDg4LAorCTB4MTlmYSwgMHgyODBhLCAweDgwMDAsIDB4OTA4NCwgMHgwMDNmLCAweDcwMWUsIDB4NzEyMCwgMHg5MTA2LAorCTB4MDkwYywgMHgwZGZhLCAweDcwMDQsIDB4OTAwNSwgMHgxMTI4LCAweDAwZjYsIDB4MjA3OSwgMHgwMDgwLAorCTB4MDBhOSwgMHgwMGZlLCAweDAwZWUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDBlNiwgMHgyMDcxLCAweDE5ZjAsIDB4NzAwNCwgMHg5MDA1LCAweDExMjgsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDA4MCwgMHgwMDIxLCAweDAwZmUsIDB4MDBlZSwgMHgwMTJlLCAweDAwMDUsIDB4NzAwNCwgMHg5MDg2LAorCTB4MDAwMCwgMHgxMTEwLCAweDcwMDcsIDB4MDAwNiwgMHg3MDAwLCAweDAwMDIsIDB4MTE3MCwgMHgxMTZlLAorCTB4MTE2ZSwgMHgxMTZlLCAweDEyZTcsIDB4MTJlNywgMHgxMmU3LCAweDEyZTcsIDB4MDgwYywgMHgwZGZhLAorCTB4NzAxYywgMHg3MTIwLCAweDkxMDYsIDB4MTE0OCwgMHg3OTJjLCAweDkxODQsIDB4MDAwMSwgMHgxMTIwLAorCTB4ZDFmYywgMHgxMTEwLCAweDcwMDcsIDB4MDAwMCwgMHgwMDA1LCAweDAwOTYsIDB4OTE4MCwgMHgxOWZhLAorCTB4MjAwNCwgMHg3MDBhLCAweDIwNDgsIDB4ODEwOCwgMHg5MThjLCAweDAwM2YsIDB4NzEyMiwgMHg3ODJiLAorCTB4MDAyNiwgMHhhODhjLCAweDc4MDIsIDB4YTg5MCwgMHg3ODA2LCAweGE4OTQsIDB4NzgwYSwgMHhhODk4LAorCTB4NzgwZSwgMHhhODc4LCAweDcwMGUsIDB4YTg3MCwgMHg3MDE2LCAweGE4NzQsIDB4NzAxYSwgMHhhODY4LAorCTB4MDA5ZSwgMHhkMDg0LCAweDAxMjAsIDB4NzAwNywgMHgwMDAxLCAweDAwMjksIDB4MDAwNSwgMHg3MDA3LAorCTB4MDAwMiwgMHgwMGIxLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLAorCTB4OTE4MiwgMHgwMDQwLCAweDEyMTAsIDB4MjExMCwgMHg5MDA2LCAweDcwMGUsIDB4NzIxMiwgMHg4MjAzLAorCTB4NzgxMiwgMHg3ODJiLCAweDAwMjAsIDB4NzgyYiwgMHgwMDQxLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMDI2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDcwMTQsIDB4MjBlMCwgMHg3MDE4LAorCTB4MjA5OCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMDg4LCAweDc4MmIsIDB4MDAyNiwgMHg3MTBjLAorCTB4MjAxMSwgMHgwMDQwLCAweDkxODIsIDB4MDA0MCwgMHgxMjEwLCAweDIxMTAsIDB4OTAwNiwgMHg3MDBlLAorCTB4MjJhOCwgMHg0MDA2LCAweDgyMDMsIDB4NzgxMiwgMHg3ODJiLCAweDAwMjAsIDB4MzMwMCwgMHg3MDFhLAorCTB4NzgyYiwgMHgwMDAxLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MjAwOSwgMHgxOWYwLCAweDIxMDQsIDB4YzA5NSwgMHgyMDBhLCAweDA4MGMsIDB4MTE0ZCwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4MTlmMCwgMHgwMGY2LCAweDIwNzksIDB4MDA4MCwgMHg3OTJjLAorCTB4ZDFiYywgMHgxOTBjLCAweDBkZjMsIDB4NzgyYiwgMHgwMDAyLCAweGQxZmMsIDB4MDEyMCwgMHg5MThjLAorCTB4MDcwMCwgMHg3MDA0LCAweDAwMjMsIDB4MDBmZSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHgxMTVlLAorCTB4MTIwNiwgMHgxMjNhLCAweDBkZmEsIDB4MGRmYSwgMHgxMmYzLCAweDBkZmEsIDB4OTE4YywgMHgwNzAwLAorCTB4MTU1MCwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHg3MDE0LCAweDIwZTgsIDB4NzAxOCwgMHgyMGEwLAorCTB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDA4OCwgMHg3ODJiLCAweDAwNDAsIDB4NzAxMCwgMHgyMGE4LAorCTB4NDAwNSwgMHgzNDAwLCAweDcwMWEsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4NzAwYywgMHg5MDA1LAorCTB4MDU3OCwgMHg3ODAwLCAweDc4MDIsIDB4NzgwNCwgMHg3ODA2LCAweDA4MGMsIDB4MTFhMywgMHgwMDA1LAorCTB4NzAwOCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2ZiwgMHgwMTAwLCAweDAwOWUsIDB4NzAwNywgMHgwMDAwLAorCTB4MDgwYywgMHgxMTVlLCAweDAwMDUsIDB4NzAwOCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2ZiwgMHgwMjAwLAorCTB4MDA5ZSwgMHgwY2EwLCAweDkxOGMsIDB4MDcwMCwgMHgxMTUwLCAweDcwMGMsIDB4OTAwNSwgMHgwMTgwLAorCTB4NzgwMCwgMHg3ODAyLCAweDc4MDQsIDB4NzgwNiwgMHgwODBjLCAweDExYjgsIDB4MDAwNSwgMHg3MDA4LAorCTB4MDA5NiwgMHgyMDQ4LCAweGE4NmYsIDB4MDIwMCwgMHgwMDllLCAweDcwMDcsIDB4MDAwMCwgMHgwMDgwLAorCTB4MDA5NiwgMHg3MDA4LCAweDIwNDgsIDB4NzgwMCwgMHhhODhlLCAweDc4MDQsIDB4YTg5MiwgMHg3ODA4LAorCTB4YTg5NiwgMHg3ODBjLCAweGE4OWEsIDB4YTg2ZiwgMHgwMTAwLCAweDAwOWUsIDB4NzAwNywgMHgwMDAwLAorCTB4MDA5NiwgMHgwMGQ2LCAweDcwMDgsIDB4MjA0OCwgMHgyMDAxLCAweDE4YjcsIDB4MjAwNCwgMHg5OTA2LAorCTB4MTEyOCwgMHhhODljLCAweDA4MGYsIDB4MDBkZSwgMHgwMDllLCAweDAwYTAsIDB4MDBkZSwgMHgwMDllLAorCTB4MDA5NiwgMHgwMGQ2LCAweDcwMDgsIDB4MjA0OCwgMHgwMDgxLCAweDAxNTAsIDB4YTg5YywgMHgwMDg2LAorCTB4Mjk0MCwgMHgwODBmLCAweDAwOGUsIDB4MDBkZSwgMHgwMDllLCAweDA4MGMsIDB4MTE0ZCwgMHgwMDA1LAorCTB4MDBkZSwgMHgwMDllLCAweDA4MGMsIDB4MTE0ZCwgMHgwMDA1LCAweGE4YTgsIDB4ZDA4YywgMHgwMDA1LAorCTB4MDA5NiwgMHhhMGEwLCAweDkwNGQsIDB4MDkwYywgMHgwZGZhLCAweGEwNmMsIDB4OTA4ZSwgMHgwMTAwLAorCTB4MDEzMCwgMHhhODdiLCAweDAwMzAsIDB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMiwgMHgwODBjLAorCTB4NmFkYywgMHhhMDlmLCAweDAwMDAsIDB4YTBhMywgMHgwMDAwLCAweDI4NDgsIDB4MDgwYywgMHgxMDYzLAorCTB4MDA5ZSwgMHgwMDA1LCAweDAwYTYsIDB4YTBhMCwgMHg5MDRkLCAweDA5MGMsIDB4MGRmYSwgMHhhMDZjLAorCTB4OTA4ZSwgMHgwMTAwLCAweDAxMjgsIDB4YTg3YiwgMHgwMDAxLCAweGE4ODMsIDB4MDAwMCwgMHgwMGMwLAorCTB4YTgwYywgMHgyMDUwLCAweGIwMDQsIDB4OTAwNSwgMHgwMTk4LCAweGE4MGUsIDB4MjA1MCwgMHg4MDA2LAorCTB4ODAwNiwgMHg4MDA3LCAweDkwOGMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLAorCTB4YTA3NiwgMHhhMTcyLCAweGIwMDAsIDB4YTA3YSwgMHgyODEwLCAweDA4MGMsIDB4MTEyZSwgMHgwMGU4LAorCTB4YTk3YywgMHhhODk0LCAweDAwMTYsIDB4MDAwNiwgMHgwODBjLCAweDZhZGMsIDB4MDAwZSwgMHgwMDFlLAorCTB4ZDFmYywgMHgxMTM4LCAweGQxZjQsIDB4MDEyOCwgMHgwMGM2LCAweDIwNjAsIDB4MDgwYywgMHhhMGUzLAorCTB4MDBjZSwgMHg3MDA4LCAweDIwNDgsIDB4YTg5ZiwgMHgwMDAwLCAweGE4YTMsIDB4MDAwMCwgMHgwODBjLAorCTB4MTA2MywgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxMTRkLCAweDAwYWUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDc4MmIsIDB4MTAwMSwgMHg3MDA3LCAweDAwMDUsIDB4NzAwMCwgMHhjMDk0LAorCTB4NzAwMiwgMHgwMTJlLCAweDAwMDUsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTE1ZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDIyMDAsIDB4MjA3OSwgMHgwMzAwLCAweDIwNzEsIDB4MWEzYSwgMHg3MDAzLAorCTB4MDAwMCwgMHg3OGJmLCAweDAwZjYsIDB4NzgxYiwgMHg0ODAwLCAweDA0MTksIDB4NzgwMywgMHgwMDAzLAorCTB4NzgwZiwgMHgwMDAwLCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwMTI4LAorCTB4MjBhOSwgMHgwMjU0LCAweDIwNjEsIDB4ZGM0MiwgMHgwMDIwLCAweDIwYTksIDB4MDI0MSwgMHgyMDYxLAorCTB4ZTBlOCwgMHgyYzBkLCAweDc5MTIsIDB4ZTEwNCwgMHg5Y2UwLCAweDAwMDIsIDB4NzkxNiwgMHgxZjA0LAorCTB4MTMxOSwgMHg3ODA3LCAweDAwMDcsIDB4NzgwMywgMHgwMDAwLCAweDc4MDMsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMGM2LCAweDc4MDMsIDB4MDAwMCwgMHg3ODA4LCAweGQwOWMsIDB4MDExMCwgMHg3ODIwLAorCTB4MGNkOCwgMHgyMDAxLCAweDFhM2IsIDB4MjAwMywgMHgwMDAwLCAweDc4YWIsIDB4MDAwNCwgMHg3OGFjLAorCTB4ZDBhYywgMHgxZGU4LCAweDc4YWIsIDB4MDAwMiwgMHg3ODA3LCAweDAwMDcsIDB4NzgyNywgMHgwMDMwLAorCTB4NzgyYiwgMHgwNDAwLCAweDc4MjcsIDB4MDAzMSwgMHg3ODJiLCAweDFhNWMsIDB4NzgxZiwgMHhmZjAwLAorCTB4NzgxYiwgMHhiNzAwLCAweDIwMDEsIDB4MDIwMCwgMHgyMDA0LCAweGQwZGMsIDB4MDExMCwgMHg3ODFmLAorCTB4MDMwMywgMHgyMDYxLCAweDFhNWMsIDB4NjAyZiwgMHgxY2QwLCAweDIwMDEsIDB4MTgxOSwgMHgyMDA0LAorCTB4OTA4MiwgMHgxY2QwLCAweDYwMzIsIDB4NjAzYiwgMHgxZmM4LCAweDIwMDEsIDB4MzJlOSwgMHhkMGZjLAorCTB4MTkwYywgMHgwZGZhLCAweDIwMDEsIDB4MDAwMywgMHgyMDA0LCAweGQwZDQsIDB4MTExOCwgMHg3ODNmLAorCTB4MzJlOSwgMHgwMDIwLCAweDkwODQsIDB4YzAwMCwgMHg3ODNmLCAweGIyZTksIDB4MDBjZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDIyMDAsIDB4NzkwOCwgMHg5MTg0LCAweDAwNzAsIDB4MTkwYywgMHgwZGYzLAorCTB4ZDE5YywgMHgwMTU4LCAweDc4MjAsIDB4OTA4YywgMHhmMDAwLCAweDE1ZTgsIDB4OTA4YSwgMHgwMDI0LAorCTB4MWEwYywgMHgwZGZhLCAweDAwMjMsIDB4MDEyZSwgMHgwMDA1LCAweDAxMmUsIDB4MDAwNSwgMHgxM2FiLAorCTB4MTNhYiwgMHgxM2MyLCAweDEzYzcsIDB4MTNjYiwgMHgxM2QwLCAweDEzZjgsIDB4MTNmYywgMHgxNDBhLAorCTB4MTQwZSwgMHgxM2FiLCAweDE0OWEsIDB4MTQ5ZSwgMHgxNTBlLCAweDEzYWIsIDB4MTNhYiwgMHgxM2FiLAorCTB4MTNhYiwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwgMHgxM2FiLAorCTB4MTNhYiwgMHgxM2FiLCAweDEzZDIsIDB4MTNhYiwgMHgxM2FiLCAweDEzYWIsIDB4MTNhYiwgMHgxM2FiLAorCTB4MTNhYiwgMHgxM2FmLCAweDEzYWQsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4MGRmMywgMHgwODBjLAorCTB4MTUxNSwgMHgyMDA5LCAweDFhNTIsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4MDgwYywgMHg3YzZkLAorCTB4MDgwYywgMHgxOWZmLCAweDAwMDUsIDB4MjAwOSwgMHgwMDQ4LCAweDIwNjAsIDB4MDgwYywgMHhhMTVkLAorCTB4MDEyZSwgMHgwMDA1LCAweDcwMDQsIDB4YzA4NSwgMHhjMGI1LCAweDcwMDYsIDB4MDAwNSwgMHg3MDA0LAorCTB4YzA4NSwgMHg3MDA2LCAweDAwMDUsIDB4MDgwYywgMHgxNTE1LCAweDA4MGMsIDB4MTY2ZSwgMHgwMDA1LAorCTB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4MTUxNSwgMHgyMDYwLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTgzYiwgMHhmZmZmLCAweDAwOWUsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4YTE1ZCwgMHgyMDAxLAorCTB4MDE1ZCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwOSwgMHgwM2U4LCAweDgxMDksIDB4MDE2MCwgMHgyMDAxLAorCTB4MDIwMSwgMHgyMDA0LCAweDkwMDUsIDB4MGRjOCwgMHgyMDAxLCAweDAyMTgsIDB4MjAwNCwgMHhkMGVjLAorCTB4MTExMCwgMHgwODBjLCAweDE1MWEsIDB4MjAwMSwgMHgwMzA3LCAweDIwMDMsIDB4ODAwMCwgMHgwMDA1LAorCTB4NzAwNCwgMHhjMDk1LCAweDcwMDYsIDB4MDAwNSwgMHgwODBjLCAweDE1MTUsIDB4MjA2MCwgMHg2MDE0LAorCTB4MDA5NiwgMHgyMDQ4LCAweGE4M2IsIDB4ZmZmZiwgMHgwMDllLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLAorCTB4YTE1ZCwgMHgwMDA1LCAweDA4MGMsIDB4MTUxNSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHgxNTE1LAorCTB4MDgwYywgMHgxNDg1LCAweDc4MjcsIDB4MDAxOCwgMHg3OWFjLCAweGQxZGMsIDB4MDU0MCwgMHg3ODI3LAorCTB4MDAxNSwgMHg3ODI4LCAweDc4MmIsIDB4MDAwMCwgMHg5MDY1LCAweDAxMzgsIDB4MjAwMSwgMHgwMjBkLAorCTB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwNDAwLCAweDcwMDQsIDB4OTAwNSwgMHgxMTgwLAorCTB4NzhhYiwgMHgwMDA0LCAweDc4MjcsIDB4MDAxOCwgMHg3ODJiLCAweDAwMDAsIDB4ZDFiYywgMHgwOTBjLAorCTB4MGRmYSwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwNDkwLAorCTB4NzhhYiwgMHgwMDA0LCAweDc4MDMsIDB4MDAwMSwgMHgwODBjLCAweDE0OWUsIDB4MDAwNSwgMHg3ODI4LAorCTB4NzgyYiwgMHgwMDAwLCAweDkwNjUsIDB4MDkwYywgMHgwZGZhLCAweDYwMTQsIDB4MjA0OCwgMHg3OGFiLAorCTB4MDAwNCwgMHg5MThjLCAweDA3MDAsIDB4MDFhOCwgMHgwODBjLCAweDdjNmQsIDB4MDgwYywgMHgxOWZmLAorCTB4MDgwYywgMHhiZTM3LCAweDAxNTgsIDB4YTlhYywgMHhhOTM2LCAweGE5YjAsIDB4YTkzYSwgMHhhODNmLAorCTB4ZmZmZiwgMHhhODQzLCAweGZmZmYsIDB4YTg4MCwgMHhjMGJkLCAweGE4ODIsIDB4MDgwYywgMHhiYTU2LAorCTB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHg2MDI0LAorCTB4MTkwYywgMHhjMjIzLCAweDIwMjksIDB4MDBjOCwgMHg4NTI5LCAweDAxMjgsIDB4MjAwMSwgMHgwMjAxLAorCTB4MjAwNCwgMHg5MDA1LCAweDBkYzgsIDB4N2RiYywgMHgwODBjLCAweGRiZWIsIDB4ZDVhNCwgMHgxMTE4LAorCTB4MDgwYywgMHgxNTFhLCAweDAwMDUsIDB4MDgwYywgMHg3YzZkLCAweDA4MGMsIDB4MTlmZiwgMHgwMDA1LAorCTB4NzgxZiwgMHgwMzAwLCAweDc4MDMsIDB4MDAwMSwgMHgwMDA1LCAweDAwMTYsIDB4MDA2NiwgMHgwMDc2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzkwOCwgMHg5MThjLCAweDAwMDcsIDB4OTE4NiwgMHgwMDAzLAorCTB4MDEyMCwgMHgyMDAxLCAweDAwMTYsIDB4MDgwYywgMHgxNThiLCAweDAwZmUsIDB4MDA3ZSwgMHgwMDZlLAorCTB4MDAxZSwgMHgwMDA1LCAweDcwMDQsIDB4YzA5ZCwgMHg3MDA2LCAweDAwMDUsIDB4NzEwNCwgMHg5MTg0LAorCTB4MDAwNCwgMHgxOTBjLCAweDBkZmEsIDB4ZDE4NCwgMHgxMWIxLCAweGQxOWMsIDB4MDE4MCwgMHhjMTljLAorCTB4NzEwNiwgMHgwMDE2LCAweDA4MGMsIDB4MTY1MSwgMHgwMDFlLCAweDAxNDgsIDB4MjAwMSwgMHgwMjBkLAorCTB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwODBjLCAweDE1MWEsIDB4MDAwNSwgMHg4MWZmLAorCTB4MTkwYywgMHgwZGZhLCAweDAwMDUsIDB4MjEwMCwgMHhjMTg0LCAweGMxYjQsIDB4NzEwNiwgMHhkMGI0LAorCTB4MDAxNiwgMHgwMGU2LCAweDE5MDQsIDB4MTUwMywgMHgyMDcxLCAweDAyMDAsIDB4MDgwYywgMHgxNjQ1LAorCTB4MDgwYywgMHgxNjUxLCAweDA1YTgsIDB4NjAxNCwgMHg5MDA1LCAweDA1YTgsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTg2NCwgMHgwMDllLCAweDkwODQsIDB4MDBmZiwgMHg5MDhlLCAweDAwMjksIDB4MDE2MCwgMHg5MDhlLAorCTB4MDA0OCwgMHgxNTQ4LCAweDYwMWMsIDB4ZDA4NCwgMHgxMWQ4LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4MTZkYiwgMHgwMGZlLCAweDAwYTgsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTgyNSwgMHgwMGZlLAorCTB4MjAwOSwgMHgwMWY0LCAweDgxMDksIDB4MDE2MCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHg5MDA1LAorCTB4MGRjOCwgMHgyMDAxLCAweDAyMTgsIDB4MjAwNCwgMHhkMGVjLCAweDExMTAsIDB4MDQxOSwgMHgwMDQwLAorCTB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAyMCwgMHgwODBjLCAweDEzMjksIDB4NzgwMywgMHgwMDAxLAorCTB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4MDgwYywgMHgxNjUxLCAweDBkZDAsIDB4MjAwMSwgMHgwMjBkLAorCTB4MjAwMywgMHgwMDUwLCAweDIwMDMsIDB4MDAyMCwgMHgwMDY5LCAweDBjOTAsIDB4MDAzMSwgMHgyMDYwLAorCTB4MjAwOSwgMHgwMDUzLCAweDA4MGMsIDB4YTE1ZCwgMHgwMDA1LCAweDc4MDgsIDB4ZDA5YywgMHgwZGU4LAorCTB4NzgyMCwgMHgwMDA1LCAweDA4MGMsIDB4MTQ4NSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHgyMDA5LAorCTB4MDFmNCwgMHg4MTA5LCAweDA1MTAsIDB4NjgwNCwgMHg5MDA1LCAweDBkZDgsIDB4MjAwMSwgMHgwMTVkLAorCTB4MjAwMywgMHgwMDAwLCAweDc5YmMsIDB4ZDFhNCwgMHgxNTI4LCAweDc5YjgsIDB4OTE4YywgMHgwZmZmLAorCTB4MDE4MCwgMHg5MTgyLCAweDA4NDEsIDB4MTI2OCwgMHg5MTg4LCAweDAwMDcsIDB4OTE4YywgMHgwZmY4LAorCTB4ODEwYywgMHg4MTBjLCAweDgxMGMsIDB4MDgwYywgMHgxNTdkLCAweDY4MjcsIDB4MDAwMSwgMHg4MTA5LAorCTB4MWRkMCwgMHgwNGQ5LCAweDY4MjcsIDB4MDAwMiwgMHgwNGMxLCAweDY4MDQsIDB4OTAwNSwgMHgxMTMwLAorCTB4NjgyYywgMHhkMGU0LCAweDE1MDAsIDB4NjgwNCwgMHg5MDA1LCAweDBkZTgsIDB4NzliOCwgMHhkMWVjLAorCTB4MTEzMCwgMHgwOGMwLCAweDA4MGMsIDB4N2M2ZCwgMHgwODBjLCAweDE5ZmYsIDB4MDA5MCwgMHg3ODI3LAorCTB4MDAxNSwgMHg3ODJiLCAweDAwMDAsIDB4NzgyNywgMHgwMDE4LCAweDc4MmIsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDIwZCwgMHgyMDAzLCAweDAwMjAsIDB4MjAwMSwgMHgwMzA3LCAweDIwMDMsIDB4MDMwMCwgMHg3ODAzLAorCTB4MDAwMSwgMHgwMGRlLCAweDAwMDUsIDB4NjgyYywgMHg5MDg0LCAweDU0MDAsIDB4OTA4NiwgMHg1NDAwLAorCTB4MGQzMCwgMHg3ODI3LCAweDAwMTUsIDB4NzgyYiwgMHgwMDAwLCAweDc4MDMsIDB4MDAwMSwgMHg2ODAwLAorCTB4OTA4NSwgMHgxODAwLCAweDY4MDIsIDB4MDBkZSwgMHgwMDA1LCAweDY4MjQsIDB4OTA4NCwgMHgwMDAzLAorCTB4MWRlMCwgMHgwMDA1LCAweDIwMDEsIDB4MDAzMCwgMHgyYzA4LCAweDYyMWMsIDB4MDAyMSwgMHg3ODMwLAorCTB4OTA4NiwgMHgwMDQxLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4MDAwNiwgMHg3ODA4LAorCTB4ZDA5YywgMHgwMTQwLCAweDAwMTYsIDB4MDAyNiwgMHgwMGM2LCAweDA4MGMsIDB4MTM3MCwgMHgwMGNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNiwgMHg3ODMyLCAweDc5MzYsIDB4N2EzYSwgMHg3ODFiLAorCTB4ODA4MCwgMHgwMDU5LCAweDExMTgsIDB4MDAwZSwgMHgwMGZlLCAweDAwMDUsIDB4MDAwZSwgMHg3OTJjLAorCTB4MzkwMCwgMHg4MDAwLCAweDIwMDQsIDB4MDgwYywgMHgwZGZhLCAweDIwMDksIDB4MTgwYywgMHgyMTA0LAorCTB4YzBmNCwgMHgyMDBhLCAweDIwMDksIDB4ZmYwMCwgMHg4MTA5LCAweDA5MDQsIDB4MTYwOSwgMHg3YTE4LAorCTB4OTI4NCwgMHgwMDMwLCAweDA5MDQsIDB4MTYwNCwgMHg5Mjg0LCAweDAwNDgsIDB4OTA4NiwgMHgwMDA4LAorCTB4MTkwNCwgMHgxNjA0LCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwOGMsIDB4MDFmMCwgMHgwMDA2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLAorCTB4MDBmNiwgMHgwMDI2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTU1LCAweDIxMDQsIDB4ODAwMCwgMHgwMjA4LAorCTB4MjAwYSwgMHgwODBjLCAweDg2MzIsIDB4MDAxZSwgMHgwMDJlLCAweDAwZmUsIDB4MDEyZSwgMHgwMTVlLAorCTB4MDE0ZSwgMHgwMTNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMDBlLCAweDIwMDEsIDB4MDA5YiwgMHgyMDA0LAorCTB4ZDBmYywgMHgwMWQwLCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgwMGY2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTU2LCAweDIxMDQsIDB4ODAwMCwgMHgwMjA4LAorCTB4MjAwYSwgMHgwODBjLCAweDFkZWMsIDB4MDAxZSwgMHgwMGZlLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLAorCTB4MDFkZSwgMHgwMWNlLCAweDAxMmUsIDB4MDAwZSwgMHg3ODE4LCAweGQwYmMsIDB4MTkwNCwgMHgxNWI0LAorCTB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGY0LCAweDE1MjgsIDB4N2ExOCwgMHg5Mjg0LAorCTB4MDAzMCwgMHgwNTA4LCAweDkyODQsIDB4MDA0OCwgMHg5MDg2LCAweDAwMDgsIDB4MTFlMCwgMHgyMDAxLAorCTB4MTljZSwgMHgyMDA0LCAweDkwMDUsIDB4MDFiOCwgMHgyMDAxLCAweDFhM2QsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwMCwgMHgwMTg4LCAweDIwMDksIDB4MWE1NCwgMHgyMTA0LCAweDgwMDAsIDB4MDIwOCwgMHgyMDBhLAorCTB4MDgwYywgMHg5NmQ0LCAweDIwMDksIDB4MTgwYywgMHgyMTA0LCAweGMwZjUsIDB4MjAwYSwgMHgyMDA5LAorCTB4ZmYwMCwgMHgwODA0LCAweDE1YjQsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4NzgzMiwgMHg3OTM2LAorCTB4N2EzYSwgMHg3ODFiLCAweDgwODAsIDB4MDgwYywgMHgxNWFkLCAweDExMDgsIDB4MDAwNSwgMHg3OTJjLAorCTB4MzkwMCwgMHg4MDAwLCAweDIwMDQsIDB4MDgwYywgMHgwZGZhLCAweDcwMzcsIDB4MDAwMSwgMHg3MTUwLAorCTB4NzAzNywgMHgwMDAyLCAweDcwNTAsIDB4MjA2MCwgMHhkMWJjLCAweDExMTAsIDB4NzA1NCwgMHgyMDYwLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwNDYsIDB4MDBlNiwgMHgyMDcxLCAweDAyMDAsIDB4NzAzNywgMHgwMDAyLAorCTB4NzA1OCwgMHg5MDg0LCAweGZmMDAsIDB4ODAwNywgMHg5MDg2LCAweDAwYmMsIDB4MTE1OCwgMHgyMDIxLAorCTB4MWE1MywgMHgyNDA0LCAweDgwMDAsIDB4MDIwOCwgMHgyMDIyLCAweDA4MGMsIDB4N2M2ZCwgMHgwODBjLAorCTB4MTlmZiwgMHg5MDA2LCAweDAwZWUsIDB4MDA0ZSwgMHgwMDBlLCAweDAwMDUsIDB4MGMxMSwgMHgxMTA4LAorCTB4MDAwNSwgMHgwMGU2LCAweDAwMTYsIDB4MjA3MSwgMHgwMjAwLCAweDA4NzksIDB4NjEyNCwgMHhkMWRjLAorCTB4MDFmOCwgMHg3MDFjLCAweGQwOGMsIDB4MDkwNCwgMHgxNmQwLCAweDcwMTcsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDI2NCwgMHgyMDA0LCAweGQwYmMsIDB4MDkwNCwgMHgxNmQwLCAweDIwMDEsIDB4MDI2OCwgMHgwMGM2LAorCTB4MjA2NCwgMHg2MTA0LCAweDYwMzgsIDB4MDBjZSwgMHg5MThlLCAweDAwMzksIDB4MTkwNCwgMHgxNmQwLAorCTB4OWMwNiwgMHgxNWYwLCAweDAxMjYsIDB4MjA5MSwgMHgyNjAwLCAweDA4MGMsIDB4N2JiNCwgMHgwMTJlLAorCTB4NzM1OCwgMHg3NDVjLCAweDYwMTQsIDB4OTA1ZCwgMHgwNTk4LCAweDJiNDgsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgxOTBjLCAweGMxZmUsIDB4YWI0MiwgMHhhYzNlLAorCTB4MjAwMSwgMHgxODdkLCAweDIwMDQsIDB4ZDBiNCwgMHgxMTcwLCAweDYwMWMsIDB4ZDBlNCwgMHgxMTU4LAorCTB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MTEyMCwgMHhhODNiLAorCTB4N2ZmZiwgMHhhODM3LCAweGZmZmYsIDB4MDgwYywgMHgxZmU4LCAweDExOTAsIDB4MDgwYywgMHgxODgyLAorCTB4MmEwMCwgMHhhODE2LCAweDAxMzAsIDB4MjgwMCwgMHhhODBlLCAweDJjMDUsIDB4YTgwYSwgMHgyYzAwLAorCTB4YTgxMiwgMHg3MDM3LCAweDAwMjAsIDB4NzgxZiwgMHgwMzAwLCAweDAwMWUsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzAzNywgMHgwMDUwLCAweDcwMzcsIDB4MDAyMCwgMHgwMDFlLCAweDAwZWUsIDB4MDgwYywgMHgxNTFhLAorCTB4MDAwNSwgMHgwODBjLCAweDBkZmEsIDB4MDAxNiwgMHgyMDA5LCAweDAwYTAsIDB4ODEwOSwgMHhhMDAxLAorCTB4YTAwMSwgMHhhMDAxLCAweDFkZDgsIDB4MDAxZSwgMHgyZmYwLCAweDAxMjYsIDB4MjA5MSwgMHgyMjAwLAorCTB4MDAxNiwgMHgwMGM2LCAweDNlNjAsIDB4NjAxNCwgMHgyMDQ4LCAweDI5NDAsIDB4OTAzZSwgMHgyNzMwLAorCTB4YTg2NCwgMHgyMDY4LCAweGE4MWEsIDB4OWQ4NCwgMHgwMDBmLCAweDkwODgsIDB4MWZjOCwgMHgyMTY1LAorCTB4MDAwMiwgMHgxNzEwLCAweDE3NWQsIDB4MTcxMCwgMHgxNzEwLCAweDE3MTAsIDB4MTczZiwgMHgxNzEwLAorCTB4MTcxNCwgMHgxNzA5LCAweDE3NTQsIDB4MTcxMCwgMHgxNzEwLCAweDE3MTAsIDB4MTgxYSwgMHgxNzI4LAorCTB4MTcxZSwgMHhhOTY0LCAweDkxOGMsIDB4MDBmZiwgMHg5MThlLCAweDAwNDgsIDB4MDkwNCwgMHgxNzU0LAorCTB4OTA4NSwgMHgwMDAxLCAweDA4MDQsIDB4MTgxMCwgMHhhODdjLCAweGQwYmMsIDB4MGRjOCwgMHhhODkwLAorCTB4YTg0MiwgMHhhODhjLCAweGE4M2UsIDB4YTg4OCwgMHgwODA0LCAweDE3NjQsIDB4YTg3YywgMHhkMGJjLAorCTB4MGQ3OCwgMHhhODkwLCAweGE4NDIsIDB4YTg4YywgMHhhODNlLCAweGE4ODgsIDB4MDgwNCwgMHgxN2IzLAorCTB4YTg3YywgMHhkMGJjLCAweDBkMjgsIDB4YTg5MCwgMHhhODQyLCAweGE4OGMsIDB4YTgzZSwgMHhhODA0LAorCTB4OTA0NSwgMHgwOTBjLCAweDBkZmEsIDB4YTE2NCwgMHhhOTFhLCAweDkxZWMsIDB4MDAwZiwgMHg5ZDgwLAorCTB4MWZjOCwgMHgyMDY1LCAweGE4ODgsIDB4ZDE5YywgMHgxOTA0LCAweDE3YjMsIDB4MDQyOCwgMHhhODdjLAorCTB4ZDBhYywgMHgwOTcwLCAweGE4MDQsIDB4OTA0NSwgMHgwOTBjLCAweDBkZmEsIDB4YTE2NCwgMHhhOTFhLAorCTB4OTFlYywgMHgwMDBmLCAweDlkODAsIDB4MWZjOCwgMHgyMDY1LCAweDkwMDYsIDB4YTg0MiwgMHhhODNlLAorCTB4ZDE5YywgMHgxOTA0LCAweDE3YjMsIDB4MDA4MCwgMHhhODdjLCAweGQwYWMsIDB4MDkwNCwgMHgxNzEwLAorCTB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MDgwNCwgMHgxN2IzLCAweGE4N2MsIDB4ZDBhYywgMHgwOTA0LAorCTB4MTcxMCwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLAorCTB4MGRmYSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxNzg3LCAweDE3ODcsIDB4MTc4OSwgMHgxNzg3LAorCTB4MTc4NywgMHgxNzg3LCAweDE3OGYsIDB4MTc4NywgMHgxNzg3LCAweDE3ODcsIDB4MTc5NSwgMHgxNzg3LAorCTB4MTc4NywgMHgxNzg3LCAweDE3OWIsIDB4MTc4NywgMHgxNzg3LCAweDE3ODcsIDB4MTdhMSwgMHgxNzg3LAorCTB4MTc4NywgMHgxNzg3LCAweDE3YTcsIDB4MTc4NywgMHgxNzg3LCAweDE3ODcsIDB4MTdhZCwgMHgwODBjLAorCTB4MGRmYSwgMHhhNTc0LCAweGE0NzgsIDB4YTM3YywgMHhhMjgwLCAweDA4MDQsIDB4MTdmOCwgMHhhNTg0LAorCTB4YTQ4OCwgMHhhMzhjLCAweGEyOTAsIDB4MDgwNCwgMHgxN2Y4LCAweGE1OTQsIDB4YTQ5OCwgMHhhMzljLAorCTB4YTJhMCwgMHgwODA0LCAweDE3ZjgsIDB4YTVhNCwgMHhhNGE4LCAweGEzYWMsIDB4YTJiMCwgMHgwODA0LAorCTB4MTdmOCwgMHhhNWI0LCAweGE0YjgsIDB4YTNiYywgMHhhMmMwLCAweDA4MDQsIDB4MTdmOCwgMHhhNWM0LAorCTB4YTRjOCwgMHhhM2NjLCAweGEyZDAsIDB4MDgwNCwgMHgxN2Y4LCAweGE1ZDQsIDB4YTRkOCwgMHhhM2RjLAorCTB4YTJlMCwgMHgwODA0LCAweDE3ZjgsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGZhLAorCTB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MTdkNiwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdkNCwgMHgxN2Q0LAorCTB4MTdkNCwgMHgxN2RkLCAweDE3ZDQsIDB4MTdkNCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdkNCwgMHgxN2U0LAorCTB4MTdkNCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdkNCwgMHgxN2Q0LCAweDE3ZWIsIDB4MTdkNCwgMHgxN2Q0LAorCTB4MTdkNCwgMHgxN2Q0LCAweDE3ZDQsIDB4MTdmMiwgMHgwODBjLCAweDBkZmEsIDB4YTU2YywgMHhhNDcwLAorCTB4YTc3NCwgMHhhNjc4LCAweGEzN2MsIDB4YTI4MCwgMHgwMGQ4LCAweGE1ODQsIDB4YTQ4OCwgMHhhNzhjLAorCTB4YTY5MCwgMHhhMzk0LCAweGEyOTgsIDB4MDBhMCwgMHhhNTljLCAweGE0YTAsIDB4YTdhNCwgMHhhNmE4LAorCTB4YTNhYywgMHhhMmIwLCAweDAwNjgsIDB4YTViNCwgMHhhNGI4LCAweGE3YmMsIDB4YTZjMCwgMHhhM2M0LAorCTB4YTJjOCwgMHgwMDMwLCAweGE1Y2MsIDB4YTRkMCwgMHhhN2Q0LCAweGE2ZDgsIDB4YTNkYywgMHhhMmUwLAorCTB4YWIyZSwgMHhhYTMyLCAweGFkMWUsIDB4YWMyMiwgMHhhZjI2LCAweGFlMmEsIDB4YTk4OCwgMHg4YzYwLAorCTB4MmMxZCwgMHhhOGFjLCAweGFhYjAsIDB4YTgzNiwgMHhhYTNhLCAweDgxMDksIDB4YTkxNiwgMHgxMTYwLAorCTB4M2U2MCwgMHg2MDFjLCAweGMwODUsIDB4NjAxZSwgMHhhODdjLCAweGMwZGQsIDB4YTg3ZSwgMHg5MDA2LAorCTB4MDBjZSwgMHgwMDFlLCAweDAxMmUsIDB4MDAwNSwgMHgyODAwLCAweGE4MGUsIDB4YWIwYSwgMHgyYzAwLAorCTB4YTgxMiwgMHgwYzcwLCAweDA4MDQsIDB4MTcxMCwgMHgwMDE2LCAweDIwMDksIDB4MDBhMCwgMHg4MTA5LAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4MWRkOCwgMHgwMDFlLCAweDJmZjAsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjIwMCwgMHgwMDE2LCAweDAwYzYsIDB4M2U2MCwgMHg2MDE0LCAweDIwNDgsIDB4Mjk0MCwgMHhhODBlLAorCTB4MjA2MSwgMHgxZmMzLCAweGE4MTMsIDB4MWZjMywgMHgyYzA1LCAweGE4MGEsIDB4YTk2NCwgMHhhOTFhLAorCTB4YTg3YywgMHhkMGFjLCAweDA5MGMsIDB4MGRmYSwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgyYzA1LAorCTB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwgMHhhZGNjLCAweGFjZDAsIDB4YWZkNCwgMHhhZWQ4LAorCTB4YWJkYywgMHhhYWUwLCAweGFiMmUsIDB4YWEzMiwgMHhhZDFlLCAweGFjMjIsIDB4YWYyNiwgMHhhZTJhLAorCTB4YThhYywgMHhhYWIwLCAweGE4MzYsIDB4YWEzYSwgMHhhOTg4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDA4LCAweDExMjAsIDB4ODEwOSwgMHhhOTE2LCAweDAxMjgsIDB4MDA4MCwgMHg5MThhLAorCTB4MDAwMiwgMHhhOTE2LCAweDExNjAsIDB4M2U2MCwgMHg2MDFjLCAweGMwODUsIDB4NjAxZSwgMHhhODdjLAorCTB4YzBkZCwgMHhhODdlLCAweDkwMDYsIDB4MDBjZSwgMHgwMDFlLCAweDAxMmUsIDB4MDAwNSwgMHhhODA0LAorCTB4OTA0NSwgMHgwOTBjLCAweDBkZmEsIDB4YTgwZSwgMHhhMDY0LCAweGE4MWEsIDB4OTA4NCwgMHgwMDBmLAorCTB4OTA4MCwgMHgxZmM4LCAweDIwMTUsIDB4ODJmZiwgMHgwOTBjLCAweDBkZmEsIDB4YWExMiwgMHgyMjA1LAorCTB4YTgwYSwgMHgwYzA4LCAweDkwM2UsIDB4MjczMCwgMHhhODgwLCAweGQwZmMsIDB4MTE5MCwgMHgyZDAwLAorCTB4MDAwMiwgMHgxOTc3LCAweDE4ZDksIDB4MThkOSwgMHgxOTc3LCAweDE5NzcsIDB4MTk3MSwgMHgxOTc3LAorCTB4MThkOSwgMHgxOTI4LCAweDE5MjgsIDB4MTkyOCwgMHgxOTc3LCAweDE5NzcsIDB4MTk3NywgMHgxOTZlLAorCTB4MTkyOCwgMHhjMGZjLCAweGE4ODIsIDB4YWIyYywgMHhhYTMwLCAweGFkMWMsIDB4YWMyMCwgMHhkZDljLAorCTB4MDkwNCwgMHgxOTc5LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwgMHg5MDgyLAorCTB4MDAxYiwgMHgwMDAyLCAweDE4YzUsIDB4MThjMywgMHgxOGMzLCAweDE4YzMsIDB4MThjMywgMHgxOGMzLAorCTB4MThjOSwgMHgxOGMzLCAweDE4YzMsIDB4MThjMywgMHgxOGMzLCAweDE4YzMsIDB4MThjZCwgMHgxOGMzLAorCTB4MThjMywgMHgxOGMzLCAweDE4YzMsIDB4MThjMywgMHgxOGQxLCAweDE4YzMsIDB4MThjMywgMHgxOGMzLAorCTB4MThjMywgMHgxOGMzLCAweDE4ZDUsIDB4MDgwYywgMHgwZGZhLCAweGE3NzQsIDB4YTY3OCwgMHgwODA0LAorCTB4MTk3OSwgMHhhNzhjLCAweGE2OTAsIDB4MDgwNCwgMHgxOTc5LCAweGE3YTQsIDB4YTZhOCwgMHgwODA0LAorCTB4MTk3OSwgMHhhN2JjLCAweGE2YzAsIDB4MDgwNCwgMHgxOTc5LCAweGE3ZDQsIDB4YTZkOCwgMHgwODA0LAorCTB4MTk3OSwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLCAweDBkZmEsIDB4OTA4MiwgMHgwMDFiLAorCTB4MDAwMiwgMHgxOGZjLCAweDE4ZmMsIDB4MThmZSwgMHgxOGZjLCAweDE4ZmMsIDB4MThmYywgMHgxOTA0LAorCTB4MThmYywgMHgxOGZjLCAweDE4ZmMsIDB4MTkwYSwgMHgxOGZjLCAweDE4ZmMsIDB4MThmYywgMHgxOTEwLAorCTB4MThmYywgMHgxOGZjLCAweDE4ZmMsIDB4MTkxNiwgMHgxOGZjLCAweDE4ZmMsIDB4MThmYywgMHgxOTFjLAorCTB4MThmYywgMHgxOGZjLCAweDE4ZmMsIDB4MTkyMiwgMHgwODBjLCAweDBkZmEsIDB4YTU3NCwgMHhhNDc4LAorCTB4YTM3YywgMHhhMjgwLCAweDA4MDQsIDB4MTk3OSwgMHhhNTg0LCAweGE0ODgsIDB4YTM4YywgMHhhMjkwLAorCTB4MDgwNCwgMHgxOTc5LCAweGE1OTQsIDB4YTQ5OCwgMHhhMzljLCAweGEyYTAsIDB4MDgwNCwgMHgxOTc5LAorCTB4YTVhNCwgMHhhNGE4LCAweGEzYWMsIDB4YTJiMCwgMHgwODA0LCAweDE5NzksIDB4YTViNCwgMHhhNGI4LAorCTB4YTNiYywgMHhhMmMwLCAweDA4MDQsIDB4MTk3OSwgMHhhNWM0LCAweGE0YzgsIDB4YTNjYywgMHhhMmQwLAorCTB4MDgwNCwgMHgxOTc5LCAweGE1ZDQsIDB4YTRkOCwgMHhhM2RjLCAweGEyZTAsIDB4MDgwNCwgMHgxOTc5LAorCTB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGZhLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLAorCTB4MTk0YiwgMHgxOTQ5LCAweDE5NDksIDB4MTk0OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk1MiwgMHgxOTQ5LAorCTB4MTk0OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk0OSwgMHgxOTU5LCAweDE5NDksIDB4MTk0OSwgMHgxOTQ5LAorCTB4MTk0OSwgMHgxOTQ5LCAweDE5NjAsIDB4MTk0OSwgMHgxOTQ5LCAweDE5NDksIDB4MTk0OSwgMHgxOTQ5LAorCTB4MTk2NywgMHgwODBjLCAweDBkZmEsIDB4YTU2YywgMHhhNDcwLCAweGE3NzQsIDB4YTY3OCwgMHhhMzdjLAorCTB4YTI4MCwgMHgwNDM4LCAweGE1ODQsIDB4YTQ4OCwgMHhhNzhjLCAweGE2OTAsIDB4YTM5NCwgMHhhMjk4LAorCTB4MDQwMCwgMHhhNTljLCAweGE0YTAsIDB4YTdhNCwgMHhhNmE4LCAweGEzYWMsIDB4YTJiMCwgMHgwMGM4LAorCTB4YTViNCwgMHhhNGI4LCAweGE3YmMsIDB4YTZjMCwgMHhhM2M0LCAweGEyYzgsIDB4MDA5MCwgMHhhNWNjLAorCTB4YTRkMCwgMHhhN2Q0LCAweGE2ZDgsIDB4YTNkYywgMHhhMmUwLCAweDAwNTgsIDB4OWQ4NiwgMHgwMDBlLAorCTB4MTEzMCwgMHgwODBjLCAweDFmODAsIDB4MTkwNCwgMHgxODgyLCAweDkwMGUsIDB4MDA1MCwgMHgwODBjLAorCTB4MGRmYSwgMHhhYjJlLCAweGFhMzIsIDB4YWQxZSwgMHhhYzIyLCAweGFmMjYsIDB4YWUyYSwgMHgwODBjLAorCTB4MWY4MCwgMHgwMDA1LCAweDYwMTQsIDB4MjA0OCwgMHg2MTE4LCAweDgxMGMsIDB4ODEwYywgMHg4MTBjLAorCTB4ODFmZiwgMHgxMTE4LCAweGE4ODcsIDB4MDAwMSwgMHgwMDA4LCAweGE5ODYsIDB4NjAxYiwgMHgwMDAyLAorCTB4YTg3NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NCwgMHgwMDA4LCAweDAxNTAsIDB4MDBlOSwgMHg2MDAwLAorCTB4OTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4YTE1ZCwgMHgwMDA1LAorCTB4YTk3NCwgMHhkMWRjLCAweDExMDgsIDB4MDAwNSwgMHhhOTM0LCAweGE4OGMsIDB4OTEwNiwgMHgxMTU4LAorCTB4YTkzOCwgMHhhODkwLCAweDkxMDYsIDB4MTEzOCwgMHg2MDFjLCAweGMwODQsIDB4NjAxZSwgMHgyMDA5LAorCTB4MDA0OCwgMHgwODA0LCAweGExNWQsIDB4MDAwNSwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHgyMjAwLAorCTB4MDBjZSwgMHg3OTA4LCAweDkxOGMsIDB4MDAwNywgMHg5MTg2LCAweDAwMDAsIDB4MDViMCwgMHg5MTg2LAorCTB4MDAwMywgMHgwNTk4LCAweDYwMjAsIDB4NjAyMywgMHgwMDAwLCAweDAwMDYsIDB4MjAzMSwgMHgwMDA4LAorCTB4MDBjNiwgMHg3ODFmLCAweDA4MDgsIDB4NzgwOCwgMHhkMDljLCAweDAxMjAsIDB4MDgwYywgMHgxMzcwLAorCTB4ODYzMSwgMHgxZGI4LCAweDAwY2UsIDB4NzgxZiwgMHgwODAwLCAweDIwMzEsIDB4MDE2OCwgMHgwMGM2LAorCTB4NzgwOCwgMHhkMDljLCAweDE5MGMsIDB4MTM3MCwgMHgwMGNlLCAweDIwMDEsIDB4MDAzOCwgMHgwODBjLAorCTB4MWE4NywgMHg3OTMwLCAweDkxODYsIDB4MDA0MCwgMHgwMTYwLCAweDkxODYsIDB4MDA0MiwgMHgxOTBjLAorCTB4MGRmYSwgMHgyMDAxLCAweDAwMWUsIDB4ODAwMSwgMHgxZGYwLCAweDg2MzEsIDB4MWQ0MCwgMHgwODBjLAorCTB4MWE5NiwgMHgwMDBlLCAweDYwMjIsIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4MWE4MywgMHg3ODI3LAorCTB4MDAxNSwgMHg3ODI4LCAweDljMDYsIDB4MWRiOCwgMHg3ODJiLCAweDAwMDAsIDB4MGNhMCwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMzAwLCAweDc4MDMsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDQsIDB4MDBmZSwgMHgwODBjLAorCTB4NzIwNywgMHgxMTg4LCAweDIwMDEsIDB4MDEzOCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTYwLAorCTB4MjAwMywgMHgwMDAwLCAweDIwMTEsIDB4MDEyYywgMHhhMDAxLCAweGEwMDEsIDB4ODIxMSwgMHgxZGUwLAorCTB4MDA1OSwgMHgwODA0LCAweDcyZDIsIDB4MDQ3OSwgMHgwMDM5LCAweDIwMDEsIDB4MDE2MCwgMHgyNTAyLAorCTB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDIwMCwgMHgwODBjLAorCTB4MmJiYywgMHgyMDA5LCAweDAwM2MsIDB4MDgwYywgMHgyMzBhLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLAorCTB4MDAwMCwgMHg3MDAwLCAweDkwODQsIDB4MDAzYywgMHgxZGUwLCAweDA4MGMsIDB4ODFmMCwgMHg3MGEwLAorCTB4NzBhMiwgMHg3MDk4LCAweDcwOWEsIDB4NzA5YywgMHg3MDllLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLAorCTB4MDAyMCwgMHgwMGY2LCAweDIwNzksIDB4MDMwMCwgMHgwODBjLCAweDEzMjksIDB4NzgwMywgMHgwMDAxLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MjAwMSwgMHgwMTM4LCAweDIwMTQsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMTYwLCAweDIwMmMsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NzIwNywgMHgxMTA4LAorCTB4MDAwNSwgMHgyMDIxLCAweDAyNjAsIDB4MjAwMSwgMHgwMTQxLCAweDIwMWMsIDB4ZDNkYywgMHgxMTY4LAorCTB4MjAwMSwgMHgwMTA5LCAweDIwMWMsIDB4OTM5YywgMHgwMDQ4LCAweDExNjAsIDB4MjAwMSwgMHgwMTExLAorCTB4MjAxYywgMHg4M2ZmLCAweDExMTAsIDB4ODQyMSwgMHgxZDcwLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDAzLAorCTB4MDAwMCwgMHgwMDA1LCAweDAwNDYsIDB4MjAyMSwgMHgwMDE5LCAweDIwMDMsIDB4MDA0OCwgMHhhMDAxLAorCTB4YTAwMSwgMHgyMDFjLCAweDkzOWMsIDB4MDA0OCwgMHgwMTIwLCAweDg0MjEsIDB4MWRiMCwgMHgwMDRlLAorCTB4MGM2MCwgMHgwMDRlLCAweDBjNDAsIDB4NjAxYywgMHhjMDg0LCAweDYwMWUsIDB4MDAwNSwgMHgyYzA4LAorCTB4NjIxYywgMHgwODBjLCAweDE1OGIsIDB4NzkzMCwgMHgwMDA1LCAweDJjMDgsIDB4NjIxYywgMHgwODBjLAorCTB4MTYzNiwgMHg3OTMwLCAweDAwMDUsIDB4ODAwMSwgMHgxZGYwLCAweDAwMDUsIDB4MjAzMSwgMHgwMDY0LAorCTB4NzgxYywgMHg5MDg0LCAweDAwMDcsIDB4MDE3MCwgMHgyMDAxLCAweDAwMzgsIDB4MGM0MSwgMHg5MTg2LAorCTB4MDA0MCwgMHgwOTA0LCAweDFhZjQsIDB4MjAwMSwgMHgwMDFlLCAweDBjNjksIDB4ODYzMSwgMHgxZDgwLAorCTB4MDgwYywgMHgwZGZhLCAweDc4MWYsIDB4MDIwMiwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgwZGFjLCAweDBjMDEsIDB4NzgxYywgMHhkMDg0LCAweDAxMTAsIDB4MDg2MSwgMHgwNGUwLAorCTB4MjAwMSwgMHgwMDMwLCAweDA4OTEsIDB4OTE4NiwgMHgwMDQwLCAweDA1NjgsIDB4NzgxYywgMHhkMDg0LAorCTB4MWRhOCwgMHg3ODFmLCAweDAxMDEsIDB4MjAwMSwgMHgwMDE0LCAweDA4NjksIDB4MjAwMSwgMHgwMDM3LAorCTB4MDgyMSwgMHg5MTg2LCAweDAwNDAsIDB4MDE0MCwgMHgyMDAxLCAweDAwMzAsIDB4MDgwYywgMHgxYThkLAorCTB4OTE4NiwgMHgwMDQwLCAweDE5MGMsIDB4MGRmYSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2OTJjLAorCTB4ZDFmNCwgMHgxMTcwLCAweGQxYzQsIDB4MDE2MCwgMHhkMTljLCAweDAxMzAsIDB4NjgwMCwgMHg5MDg1LAorCTB4MTgwMCwgMHg2ODAyLCAweDAwZGUsIDB4MDA4MCwgMHg2OTA4LCAweDkxODQsIDB4MDAwNywgMHgxZGIwLAorCTB4MDBkZSwgMHg3ODFmLCAweDAxMDAsIDB4NzkxYywgMHg5MTg0LCAweDAwMDcsIDB4MDkwYywgMHgwZGZhLAorCTB4YTAwMSwgMHhhMDAxLCAweDc4MWYsIDB4MDIwMCwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyNDAwLAorCTB4MjA3MSwgMHgxYTNkLCAweDIwNzksIDB4MDA5MCwgMHgwMTJlLCAweDAwMDUsIDB4OTI4MCwgMHgwMDA1LAorCTB4MjAwNCwgMHgyMDQ4LCAweGE5N2MsIDB4ZDFkYywgMHgxOTA0LCAweDFiODksIDB4YTk2NCwgMHg5MTg0LAorCTB4MDAwNywgMHgwMDAyLCAweDFiMTIsIDB4MWI3NCwgMHgxYjI5LCAweDFiMjksIDB4MWIyOSwgMHgxYjVjLAorCTB4MWIzYywgMHgxYjJiLCAweDkxOGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMDgsIDB4MTE3MCwgMHhhODdjLAorCTB4ZDBiNCwgMHgwOTA0LCAweDFkYTcsIDB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4YTk4OCwgMHgyOTAwLAorCTB4YTg1YSwgMHhhODEzLCAweDFmYzMsIDB4MDgwNCwgMHgxYjg1LCAweDkxODYsIDB4MDA0OCwgMHgwOTA0LAorCTB4MWI3NCwgMHgwODBjLCAweDBkZmEsIDB4YTg3YywgMHhkMGI0LCAweDA5MDQsIDB4MWRhNywgMHhhODkwLAorCTB4YTg0MiwgMHhhODNhLCAweGE4OGMsIDB4YTgzZSwgMHhhODM2LCAweGE4YWMsIDB4YTg0NiwgMHhhOGIwLAorCTB4YTg0YSwgMHhhOTg4LCAweDA4MDQsIDB4MWI3YywgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDAxZSwgMHgxZDM4LCAweGE4N2MsIDB4ZDBiNCwgMHgwOTA0LCAweDFkYTcsIDB4YTg5MCwgMHhhODQyLAorCTB4YTgzYSwgMHhhODhjLCAweGE4M2UsIDB4YTgzNiwgMHhhOGFjLCAweGE4NDYsIDB4YThiMCwgMHhhODRhLAorCTB4YTgwNCwgMHhhODVhLCAweDIwNDAsIDB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwgMHgxZmM4LAorCTB4MjAwNSwgMHhhODEyLCAweGE5ODgsIDB4MDQ0OCwgMHg5MThjLCAweDAwZmYsIDB4OTE4NiwgMHgwMDE1LAorCTB4MTU0MCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwgMHgxZGE3LCAweGE4MDQsIDB4YTg1YSwgMHgyMDQwLAorCTB4YTA2NCwgMHg5MDg0LCAweDAwMGYsIDB4OTA4MCwgMHgxZmM4LCAweDIwMDUsIDB4YTgxMiwgMHhhOTg4LAorCTB4OTAwNiwgMHhhODQyLCAweGE4M2UsIDB4MDA4OCwgMHhhODdjLCAweGQwYjQsIDB4MDkwNCwgMHgxZGE3LAorCTB4YTk4OCwgMHg5MDA2LCAweGE4NDIsIDB4YTgzZSwgMHgyOTAwLCAweGE4NWEsIDB4YTg2NCwgMHg5MDg0LAorCTB4MDAwZiwgMHg5MDgwLCAweDFmYzgsIDB4MjAwNSwgMHhhODEyLCAweGE5MTYsIDB4YTg3YywgMHhjMGRkLAorCTB4YTg3ZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMDkwLCAweDc4MmMsIDB4ZDBmYywgMHgxOTBjLAorCTB4MWRlYywgMHgwMGU2LCAweDIwNzEsIDB4MWEzZCwgMHg3MDAwLCAweDkwMDUsIDB4MTkwNCwgMHgxYmYyLAorCTB4NzIwNiwgMHg5MjgwLCAweDAwMDUsIDB4MjA0YywgMHg5MjgwLCAweDAwMDQsIDB4MjAwNCwgMHg3ODJiLAorCTB4MDAwNCwgMHgwMGY2LCAweDIwNzksIDB4MDIwMCwgMHg3ODAzLCAweDAwNDAsIDB4MDBmZSwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODZjLCAweDc4MzYsIDB4Yjg5MCwgMHgwMGJlLCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLAorCTB4NzgwMywgMHgwMDQwLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLAorCTB4NzgxYSwgMHgyMDc5LCAweDAxMDAsIDB4ODAwNCwgMHg3OGQ2LCAweDAwZmUsIDB4YTgxNCwgMHgyMDUwLAorCTB4YTg1OCwgMHgyMDQwLCAweGE4MTAsIDB4MjA2MCwgMHhhMDY0LCAweDkwZWMsIDB4MDAwZiwgMHhhOTQ0LAorCTB4NzkxYSwgMHg3MTE2LCAweGE4NDgsIDB4NzgxZSwgMHg3MDFhLCAweDkwMDYsIDB4NzAwZSwgMHg3MDEyLAorCTB4NzAwNCwgMHhhOTQwLCAweGE4MzgsIDB4OTEwNiwgMHgxNTAwLCAweGE5M2MsIDB4YTgzNCwgMHg5MTA2LAorCTB4MTFlMCwgMHgwMDA2LCAweDAwMTYsIDB4YTkzOCwgMHhhODM0LCAweDkxMDUsIDB4MDExOCwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDk4LCAweDAwMWUsIDB4MDAwZSwgMHg4YWZmLCAweDAxYzgsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDA5LCAweDAzMDYsIDB4MjAwYiwgMHgwODA4LCAweDAwZDksIDB4MDEwOCwgMHgwMGM5LAorCTB4MDEyZSwgMHg5MDA2LCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHhhYjM4LAorCTB4YWMzNCwgMHgwODBjLCAweDFmZTgsIDB4MDA0ZSwgMHgwMDNlLCAweDBkMzAsIDB4MGM5OCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwYzgwLCAweDIwMDksIDB4MDMwNiwgMHgyMDBiLCAweDQ4MDAsIDB4NzAyNywgMHgwMDAwLAorCTB4MDAwNSwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwgMHg4YWZmLAorCTB4MDkwNCwgMHgxZGEwLCAweDcwMGMsIDB4NzIxNCwgMHg5MjNhLCAweDcwMTAsIDB4NzIxOCwgMHg5MjAzLAorCTB4MGEwNCwgMHgxZDlmLCAweDk3MDUsIDB4MDkwNCwgMHgxZDlmLCAweDkwM2UsIDB4MjczMCwgMHhhODgwLAorCTB4ZDBmYywgMHgxMTkwLCAweDJkMDAsIDB4MDAwMiwgMHgxZDM0LCAweDFjNzQsIDB4MWM3NCwgMHgxZDM0LAorCTB4MWQzNCwgMHgxZDExLCAweDFkMzQsIDB4MWM3NCwgMHgxZDE4LCAweDFjYzMsIDB4MWNjMywgMHgxZDM0LAorCTB4MWQzNCwgMHgxZDM0LCAweDFkMGIsIDB4MWNjMywgMHhjMGZjLCAweGE4ODIsIDB4YWIyYywgMHhhYTMwLAorCTB4YWQxYywgMHhhYzIwLCAweGRkOWMsIDB4MDkwNCwgMHgxZDM2LCAweDJjMDUsIDB4OTA4YSwgMHgwMDM0LAorCTB4MWEwYywgMHgwZGZhLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDFjNjAsIDB4MWM1ZSwgMHgxYzVlLAorCTB4MWM1ZSwgMHgxYzVlLCAweDFjNWUsIDB4MWM2NCwgMHgxYzVlLCAweDFjNWUsIDB4MWM1ZSwgMHgxYzVlLAorCTB4MWM1ZSwgMHgxYzY4LCAweDFjNWUsIDB4MWM1ZSwgMHgxYzVlLCAweDFjNWUsIDB4MWM1ZSwgMHgxYzZjLAorCTB4MWM1ZSwgMHgxYzVlLCAweDFjNWUsIDB4MWM1ZSwgMHgxYzVlLCAweDFjNzAsIDB4MDgwYywgMHgwZGZhLAorCTB4YTc3NCwgMHhhNjc4LCAweDA4MDQsIDB4MWQzNiwgMHhhNzhjLCAweGE2OTAsIDB4MDgwNCwgMHgxZDM2LAorCTB4YTdhNCwgMHhhNmE4LCAweDA4MDQsIDB4MWQzNiwgMHhhN2JjLCAweGE2YzAsIDB4MDgwNCwgMHgxZDM2LAorCTB4YTdkNCwgMHhhNmQ4LCAweDA4MDQsIDB4MWQzNiwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLAorCTB4MGRmYSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxYzk3LCAweDFjOTcsIDB4MWM5OSwgMHgxYzk3LAorCTB4MWM5NywgMHgxYzk3LCAweDFjOWYsIDB4MWM5NywgMHgxYzk3LCAweDFjOTcsIDB4MWNhNSwgMHgxYzk3LAorCTB4MWM5NywgMHgxYzk3LCAweDFjYWIsIDB4MWM5NywgMHgxYzk3LCAweDFjOTcsIDB4MWNiMSwgMHgxYzk3LAorCTB4MWM5NywgMHgxYzk3LCAweDFjYjcsIDB4MWM5NywgMHgxYzk3LCAweDFjOTcsIDB4MWNiZCwgMHgwODBjLAorCTB4MGRmYSwgMHhhNTc0LCAweGE0NzgsIDB4YTM3YywgMHhhMjgwLCAweDA4MDQsIDB4MWQzNiwgMHhhNTg0LAorCTB4YTQ4OCwgMHhhMzhjLCAweGEyOTAsIDB4MDgwNCwgMHgxZDM2LCAweGE1OTQsIDB4YTQ5OCwgMHhhMzljLAorCTB4YTJhMCwgMHgwODA0LCAweDFkMzYsIDB4YTVhNCwgMHhhNGE4LCAweGEzYWMsIDB4YTJiMCwgMHgwODA0LAorCTB4MWQzNiwgMHhhNWI0LCAweGE0YjgsIDB4YTNiYywgMHhhMmMwLCAweDA4MDQsIDB4MWQzNiwgMHhhNWM0LAorCTB4YTRjOCwgMHhhM2NjLCAweGEyZDAsIDB4MDgwNCwgMHgxZDM2LCAweGE1ZDQsIDB4YTRkOCwgMHhhM2RjLAorCTB4YTJlMCwgMHgwODA0LCAweDFkMzYsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGZhLAorCTB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MWNlNiwgMHgxY2U0LCAweDFjZTQsIDB4MWNlNCwgMHgxY2U0LAorCTB4MWNlNCwgMHgxY2VlLCAweDFjZTQsIDB4MWNlNCwgMHgxY2U0LCAweDFjZTQsIDB4MWNlNCwgMHgxY2Y2LAorCTB4MWNlNCwgMHgxY2U0LCAweDFjZTQsIDB4MWNlNCwgMHgxY2U0LCAweDFjZmQsIDB4MWNlNCwgMHgxY2U0LAorCTB4MWNlNCwgMHgxY2U0LCAweDFjZTQsIDB4MWQwNCwgMHgwODBjLCAweDBkZmEsIDB4YTU2YywgMHhhNDcwLAorCTB4YTc3NCwgMHhhNjc4LCAweGEzN2MsIDB4YTI4MCwgMHgwODA0LCAweDFkMzYsIDB4YTU4NCwgMHhhNDg4LAorCTB4YTc4YywgMHhhNjkwLCAweGEzOTQsIDB4YTI5OCwgMHgwODA0LCAweDFkMzYsIDB4YTU5YywgMHhhNGEwLAorCTB4YTdhNCwgMHhhNmE4LCAweGEzYWMsIDB4YTJiMCwgMHgwNGM4LCAweGE1YjQsIDB4YTRiOCwgMHhhN2JjLAorCTB4YTZjMCwgMHhhM2M0LCAweGEyYzgsIDB4MDQ5MCwgMHhhNWNjLCAweGE0ZDAsIDB4YTdkNCwgMHhhNmQ4LAorCTB4YTNkYywgMHhhMmUwLCAweDA0NTgsIDB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDFlLAorCTB4MTUxOCwgMHgwODBjLCAweDFmODAsIDB4MTkwNCwgMHgxYzBmLCAweDkwMGUsIDB4MDgwNCwgMHgxZGEwLAorCTB4YWI2NCwgMHg5MzljLCAweDAwZmYsIDB4OTM4NiwgMHgwMDQ4LCAweDExODAsIDB4MDBjNiwgMHg3MDA0LAorCTB4MjA2MCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MywgMHgwMGNlLCAweDA5MDQsIDB4MWNjMywgMHhhYjljLAorCTB4OTAxNiwgMHhhZDhjLCAweGFjOTAsIDB4YWY5NCwgMHhhZTk4LCAweDAwNDAsIDB4OTM4NiwgMHgwMDA4LAorCTB4MDkwNCwgMHgxY2MzLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDBkZmEsIDB4MjAwOSwgMHgwMzBmLAorCTB4MjEwNCwgMHhkMGZjLCAweDA1MzAsIDB4MDA2NiwgMHgyMDA5LCAweDAzMDYsIDB4MjEwNCwgMHg5MDg0LAorCTB4MDAzMCwgMHgxNWM4LCAweDIwMzEsIDB4MTAwMCwgMHgyMDBiLCAweDQwMDAsIDB4MjYwMCwgMHg5MzAyLAorCTB4OTI4YiwgMHgwMDAwLCAweGE4MmUsIDB4YTkzMiwgMHgwMjc4LCAweDkxMDUsIDB4MDE2OCwgMHgyMDExLAorCTB4MDAwMCwgMHgyNjE4LCAweDI2MDAsIDB4OTUwMCwgMHhhODFlLCAweDk0ODEsIDB4MDAwMCwgMHhhODIyLAorCTB4YTg4MCwgMHhjMGZkLCAweGE4ODIsIDB4MDAyMCwgMHhhODJmLCAweDAwMDAsIDB4YTgzMywgMHgwMDAwLAorCTB4MDA2ZSwgMHg3YjEyLCAweDdhMTYsIDB4N2QwMiwgMHg3YzA2LCAweDdmMGEsIDB4N2UwZSwgMHg3ODJiLAorCTB4MDAwMSwgMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHhhODNjLCAweDkzMDAsIDB4YTgzZSwgMHhhODQwLAorCTB4OTIwMSwgMHhhODQyLCAweDcwMGMsIDB4OTMwMCwgMHg3MDBlLCAweDcwMTAsIDB4OTIwMSwgMHg3MDEyLAorCTB4MDgwYywgMHgxZjgwLCAweDA0MjgsIDB4MjAzMSwgMHgwMDgwLCAweDk1ODQsIDB4MDA3ZiwgMHgwMTA4LAorCTB4OTYzMiwgMHg3MTI0LCAweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDExOTgsIDB4YzE4NSwgMHg3MTI2LAorCTB4MjAwOSwgMHgwMzA2LCAweDIxMDQsIDB4ZDBiNCwgMHgxOTA0LCAweDFkNDYsIDB4MjAwYiwgMHg0MDQwLAorCTB4MjAwOSwgMHgxYTU3LCAweDIxMDQsIDB4ODAwMCwgMHgwYTA0LCAweDFkNDYsIDB4MjAwYSwgMHgwODA0LAorCTB4MWQ0NiwgMHhjMThkLCAweDcxMjYsIDB4ZDE4NCwgMHgxZDU4LCAweDA4MDQsIDB4MWQ0NiwgMHg5MDA2LAorCTB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDAwNSwgMHgwODBjLAorCTB4MGRmYSwgMHgwMDI2LCAweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4NzgyYiwgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweDcwMDQsIDB4MDAxNiwgMHgwODBjLCAweDFjMDIsIDB4MDAxZSwgMHgyMDYwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywgMHgwMTE4LCAweGE4ODAsIDB4YzBiZCwgMHhhODgyLAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTE4MCwgMHgyMDYxLCAweDAxMDAsIDB4NjJjOCwgMHgyMDAxLAorCTB4MDBmYSwgMHg4MDAxLCAweDFkZjAsIDB4NjBjOCwgMHg5MjA2LCAweDFkYzAsIDB4NjBjNCwgMHhhODlhLAorCTB4NjBjOCwgMHhhODk2LCAweDcwMDQsIDB4MjA2MCwgMHgwMGM2LCAweDA4MGMsIDB4YmE1NiwgMHgwMGNlLAorCTB4MjAwMSwgMHgxOWNlLCAweDIwMDQsIDB4OWMwNiwgMHgxMTYwLCAweDIwMDksIDB4MDA0MCwgMHgwODBjLAorCTB4MjMwYSwgMHgwODBjLCAweDliODgsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4OWExOSwgMHgwODBjLAorCTB4OGNlZCwgMHgwMDJlLCAweDA4MDQsIDB4MWYzMCwgMHgwMTI2LCAweDIwOTEsIDB4MjQwMCwgMHhhODU4LAorCTB4MjA0MCwgMHg3OTJjLCAweDc4MmIsIDB4MDAwMiwgMHg5MTg0LCAweDA3MDAsIDB4MTkwNCwgMHgxZGE5LAorCTB4NzAwMCwgMHgwMDAyLCAweDFmMzAsIDB4MWRmZSwgMHgxZTdlLCAweDFmMmUsIDB4ODAwMSwgMHg3MDAyLAorCTB4NzAyNywgMHgwMDAwLCAweGQxOWMsIDB4MTE1OCwgMHg4YWZmLCAweDA5MDQsIDB4MWU0YiwgMHgwODBjLAorCTB4MWMwOSwgMHgwOTA0LCAweDFmMzAsIDB4MDgwYywgMHgxYzA5LCAweDA4MDQsIDB4MWYzMCwgMHg3ODJiLAorCTB4MDAwNCwgMHhkMTk0LCAweDAxNDgsIDB4YTg4MCwgMHhjMGZjLCAweGE4ODIsIDB4OGFmZiwgMHgxNTE4LAorCTB4YTg3YywgMHhjMGY1LCAweGE4N2UsIDB4MDBmOCwgMHgwMDI2LCAweDAwMzYsIDB4YWIzYywgMHhhYTQwLAorCTB4MDAxNiwgMHg3OTEwLCAweGE4MmMsIDB4OTEwMCwgMHhhODJlLCAweDc5MTQsIDB4YTgzMCwgMHg5MTAxLAorCTB4YTgzMiwgMHgwMDFlLCAweDc4MTAsIDB4OTMxYSwgMHg3ODE0LCAweDkyMTMsIDB4NzgwMCwgMHhhODFlLAorCTB4NzgwNCwgMHhhODIyLCAweGFiM2UsIDB4YWE0MiwgMHgwMDNlLCAweDAwMmUsIDB4MDgwYywgMHgxZjliLAorCTB4YTg4MCwgMHhjMGZkLCAweGE4ODIsIDB4MmEwMCwgMHhhODE2LCAweDI4MDAsIDB4YTg1YSwgMHgyYzAwLAorCTB4YTgxMiwgMHg3MDAzLCAweDAwMDAsIDB4MjAwOSwgMHgwMzA2LCAweDIwMGIsIDB4NDgwMCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwODA0LCAweDFmMzAsIDB4MDBmNiwgMHgwMDI2LCAweDc4MWMsIDB4MDAwNiwgMHg3ODE4LAorCTB4MDAwNiwgMHgyMDc5LCAweDAxMDAsIDB4N2ExNCwgMHg5Mjg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDEyLAorCTB4NzgxNiwgMHgwMDM2LCAweDIwMTksIDB4MTAwMCwgMHg4MzE5LCAweDA5MGMsIDB4MGRmYSwgMHg3ODIwLAorCTB4ZDBiYywgMHgxZGQwLCAweDAwM2UsIDB4NzljOCwgMHgwMDBlLCAweDkxMDIsIDB4MDAxZSwgMHgwMDA2LAorCTB4MDAxNiwgMHg3OWM0LCAweDAwMGUsIDB4OTEwMywgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHg5Mjg0LAorCTB4MTk4NCwgMHg5MDg1LCAweDAwMTIsIDB4NzgxNiwgMHgwMDJlLCAweDAwZmUsIDB4NzgyYiwgMHgwMDA4LAorCTB4NzAwMywgMHgwMDAwLCAweDA4MGMsIDB4MWMwMiwgMHgwODA0LCAweDFmMzAsIDB4ODAwMSwgMHg3MDAyLAorCTB4NzAyNCwgMHg4MDA0LCAweDcwMjYsIDB4ZDE5NCwgMHgwMTcwLCAweDc4MmMsIDB4ZDBmYywgMHgxOTA0LAorCTB4MWRmMSwgMHhkMTljLCAweDE5MDQsIDB4MWYyYywgMHg4YWZmLCAweDA5MDQsIDB4MWYzMCwgMHgwODBjLAorCTB4MWMwOSwgMHgwODA0LCAweDFmMzAsIDB4MDAyNiwgMHgwMDM2LCAweGFiM2MsIDB4YWE0MCwgMHgwODBjLAorCTB4MWY5YiwgMHhkZDljLCAweDE5MDQsIDB4MWVlYiwgMHgyYzA1LCAweDkwOGEsIDB4MDAzNiwgMHgxYTBjLAorCTB4MGRmYSwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgxZWJmLCAweDFlYmYsIDB4MWVjMSwgMHgxZWJmLAorCTB4MWViZiwgMHgxZWJmLCAweDFlYzcsIDB4MWViZiwgMHgxZWJmLCAweDFlYmYsIDB4MWVjZCwgMHgxZWJmLAorCTB4MWViZiwgMHgxZWJmLCAweDFlZDMsIDB4MWViZiwgMHgxZWJmLCAweDFlYmYsIDB4MWVkOSwgMHgxZWJmLAorCTB4MWViZiwgMHgxZWJmLCAweDFlZGYsIDB4MWViZiwgMHgxZWJmLCAweDFlYmYsIDB4MWVlNSwgMHgwODBjLAorCTB4MGRmYSwgMHhhMDdjLCAweDkzMWEsIDB4YTA4MCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwgMHhhMDhjLAorCTB4OTMxYSwgMHhhMDkwLCAweDkyMTMsIDB4MDgwNCwgMHgxZTIwLCAweGEwOWMsIDB4OTMxYSwgMHhhMGEwLAorCTB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4YTBhYywgMHg5MzFhLCAweGEwYjAsIDB4OTIxMywgMHgwODA0LAorCTB4MWUyMCwgMHhhMGJjLCAweDkzMWEsIDB4YTBjMCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwgMHhhMGNjLAorCTB4OTMxYSwgMHhhMGQwLCAweDkyMTMsIDB4MDgwNCwgMHgxZTIwLCAweGEwZGMsIDB4OTMxYSwgMHhhMGUwLAorCTB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4MmMwNSwgMHg5MDhhLCAweDAwMzQsIDB4MWEwYywgMHgwZGZhLAorCTB4OTA4MiwgMHgwMDFiLCAweDAwMDIsIDB4MWYwZSwgMHgxZjBjLCAweDFmMGMsIDB4MWYwYywgMHgxZjBjLAorCTB4MWYwYywgMHgxZjE0LCAweDFmMGMsIDB4MWYwYywgMHgxZjBjLCAweDFmMGMsIDB4MWYwYywgMHgxZjFhLAorCTB4MWYwYywgMHgxZjBjLCAweDFmMGMsIDB4MWYwYywgMHgxZjBjLCAweDFmMjAsIDB4MWYwYywgMHgxZjBjLAorCTB4MWYwYywgMHgxZjBjLCAweDFmMGMsIDB4MWYyNiwgMHgwODBjLCAweDBkZmEsIDB4YTA3YywgMHg5MzFhLAorCTB4YTA4MCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwgMHhhMDk0LCAweDkzMWEsIDB4YTA5OCwgMHg5MjEzLAorCTB4MDgwNCwgMHgxZTIwLCAweGEwYWMsIDB4OTMxYSwgMHhhMGIwLCAweDkyMTMsIDB4MDgwNCwgMHgxZTIwLAorCTB4YTBjNCwgMHg5MzFhLCAweGEwYzgsIDB4OTIxMywgMHgwODA0LCAweDFlMjAsIDB4YTBkYywgMHg5MzFhLAorCTB4YTBlMCwgMHg5MjEzLCAweDA4MDQsIDB4MWUyMCwgMHgwODA0LCAweDFlMWMsIDB4MDgwYywgMHgwZGZhLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweDFhM2QsIDB4NzAwMCwgMHg5MDg2LAorCTB4MDAwMCwgMHgwOTA0LCAweDFmN2IsIDB4MjA3OSwgMHgwMDkwLCAweDIwMDksIDB4MDIwNywgMHgyMTBjLAorCTB4ZDE5NCwgMHgwMWI4LCAweDIwMDksIDB4MDIwYywgMHgyMTBjLCAweDkxODQsIDB4MDAwMywgMHgwMTg4LAorCTB4MDgwYywgMHhkYzM0LCAweDIwMDEsIDB4MDEzMywgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHgwZGZhLAorCTB4MDAxNiwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMzBhLCAweDAwMWUsIDB4MjAwMSwgMHgwMjBjLAorCTB4MjEwMiwgMHgyMDA5LCAweDAyMDYsIDB4MjEwNCwgMHgyMDA5LCAweDAyMDMsIDB4MjEwYywgMHg5MTA2LAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMzBhLCAweDc4MmMsIDB4ZDBmYywgMHgwOWE4LAorCTB4MDgwYywgMHgxZGVjLCAweDcwMDAsIDB4OTA4NiwgMHgwMDAwLCAweDE5NzgsIDB4NzgyYiwgMHgwMDA0LAorCTB4NzgyYywgMHhkMGFjLCAweDFkZTgsIDB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjMwYSwgMHg3ODJiLAorCTB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MDgwYywgMHgxYzAyLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4YTg4MCwgMHhkMGZjLCAweDExYTgsIDB4OGM2MCwgMHgyYzA1LCAweDkwMDUsIDB4MDExMCwgMHg4YTUxLAorCTB4MDAwNSwgMHhhMDA0LCAweDkwMDUsIDB4MDE2OCwgMHhhODVhLCAweDIwNDAsIDB4YTA2NCwgMHg5MDg0LAorCTB4MDAwZiwgMHg5MDgwLCAweDFmYzgsIDB4MjA2NSwgMHg4Y2ZmLCAweDA5MGMsIDB4MGRmYSwgMHg4YTUxLAorCTB4MDAwNSwgMHgyMDUwLCAweDAwMDUsIDB4YTg4MCwgMHhkMGZjLCAweDExYjgsIDB4OGE1MCwgMHg4YzYxLAorCTB4MmMwNSwgMHg5MDA1LCAweDExOTAsIDB4MjgwMCwgMHg5OTA2LCAweDAxMjAsIDB4YTAwMCwgMHg5MDA1LAorCTB4MTEwOCwgMHgyOTAwLCAweDIwNDAsIDB4YTg1YSwgMHhhMDY0LCAweDkwODQsIDB4MDAwZiwgMHg5MDgwLAorCTB4MWZkOCwgMHgyMDY1LCAweDhjZmYsIDB4MDkwYywgMHgwZGZhLCAweDAwMDUsIDB4MDAwMCwgMHgwMDFkLAorCTB4MDAyMSwgMHgwMDI1LCAweDAwMjksIDB4MDAyZCwgMHgwMDMxLCAweDAwMzUsIDB4MDAwMCwgMHgwMDFiLAorCTB4MDAyMSwgMHgwMDI3LCAweDAwMmQsIDB4MDAzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAyMywgMHgwMDAwLAorCTB4MDAwMCwgMHgxZmJiLCAweDFmYjcsIDB4MDAwMCwgMHgwMDAwLCAweDFmYzUsIDB4MDAwMCwgMHgxZmJiLAorCTB4MWZjMiwgMHgxZmMyLCAweDFmYmYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MWZjNSwgMHgxZmMyLAorCTB4MDAwMCwgMHgxZmJkLCAweDFmYmQsIDB4MDAwMCwgMHgwMDAwLCAweDFmYzUsIDB4MDAwMCwgMHgxZmJkLAorCTB4MWZjMywgMHgxZmMzLCAweDFmYzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MWZjNSwgMHgxZmMzLAorCTB4MDBjNiwgMHgwMGQ2LCAweDAwODYsIDB4YWI0MiwgMHhhYzNlLCAweGE4ODgsIDB4OTA1NSwgMHgwOTA0LAorCTB4MjFjNywgMHgyOTQwLCAweGEwNjQsIDB4OTBlYywgMHgwMDBmLCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDAwOCwgMHgxMTE4LCAweDIwNjEsIDB4MWZjMywgMHgwMGQwLCAweDlkZTAsIDB4MWZjOCwgMHg5ZDg2LAorCTB4MDAwNywgMHgwMTMwLCAweDlkODYsIDB4MDAwZSwgMHgwMTE4LCAweDlkODYsIDB4MDAwZiwgMHgxMTIwLAorCTB4YTA4YywgMHg5NDIyLCAweGEwOTAsIDB4OTMxYiwgMHgyYzA1LCAweDkwNjUsIDB4MTE0MCwgMHgwMzEwLAorCTB4MDgwNCwgMHgyMWM3LCAweGEwMDQsIDB4OTA0NSwgMHgwOTA0LCAweDIxYzcsIDB4MDhkOCwgMHgyYzA1LAorCTB4OTAwNSwgMHgwOTA0LCAweDIwYWYsIDB4ZGQ5YywgMHgxOTA0LCAweDIwNmIsIDB4OTA4YSwgMHgwMDM2LAorCTB4MWEwYywgMHgwZGZhLCAweDkwODIsIDB4MDAxYiwgMHgwMDAyLCAweDIwNDAsIDB4MjA0MCwgMHgyMDQyLAorCTB4MjA0MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA0OCwgMHgyMDQwLCAweDIwNDAsIDB4MjA0MCwgMHgyMDRlLAorCTB4MjA0MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA1NCwgMHgyMDQwLCAweDIwNDAsIDB4MjA0MCwgMHgyMDVhLAorCTB4MjA0MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA2MCwgMHgyMDQwLCAweDIwNDAsIDB4MjA0MCwgMHgyMDY2LAorCTB4MDgwYywgMHgwZGZhLCAweGEwN2MsIDB4OTQyMiwgMHhhMDgwLCAweDkzMWIsIDB4MDgwNCwgMHgyMGE1LAorCTB4YTA4YywgMHg5NDIyLCAweGEwOTAsIDB4OTMxYiwgMHgwODA0LCAweDIwYTUsIDB4YTA5YywgMHg5NDIyLAorCTB4YTBhMCwgMHg5MzFiLCAweDA4MDQsIDB4MjBhNSwgMHhhMGFjLCAweDk0MjIsIDB4YTBiMCwgMHg5MzFiLAorCTB4MDgwNCwgMHgyMGE1LCAweGEwYmMsIDB4OTQyMiwgMHhhMGMwLCAweDkzMWIsIDB4MDgwNCwgMHgyMGE1LAorCTB4YTBjYywgMHg5NDIyLCAweGEwZDAsIDB4OTMxYiwgMHgwODA0LCAweDIwYTUsIDB4YTBkYywgMHg5NDIyLAorCTB4YTBlMCwgMHg5MzFiLCAweDA0ZDAsIDB4OTA4YSwgMHgwMDM0LCAweDFhMGMsIDB4MGRmYSwgMHg5MDgyLAorCTB4MDAxYiwgMHgwMDAyLCAweDIwOGQsIDB4MjA4YiwgMHgyMDhiLCAweDIwOGIsIDB4MjA4YiwgMHgyMDhiLAorCTB4MjA5MiwgMHgyMDhiLCAweDIwOGIsIDB4MjA4YiwgMHgyMDhiLCAweDIwOGIsIDB4MjA5NywgMHgyMDhiLAorCTB4MjA4YiwgMHgyMDhiLCAweDIwOGIsIDB4MjA4YiwgMHgyMDljLCAweDIwOGIsIDB4MjA4YiwgMHgyMDhiLAorCTB4MjA4YiwgMHgyMDhiLCAweDIwYTEsIDB4MDgwYywgMHgwZGZhLCAweGEwN2MsIDB4OTQyMiwgMHhhMDgwLAorCTB4OTMxYiwgMHgwMDk4LCAweGEwOTQsIDB4OTQyMiwgMHhhMDk4LCAweDkzMWIsIDB4MDA3MCwgMHhhMGFjLAorCTB4OTQyMiwgMHhhMGIwLCAweDkzMWIsIDB4MDA0OCwgMHhhMGM0LCAweDk0MjIsIDB4YTBjOCwgMHg5MzFiLAorCTB4MDAyMCwgMHhhMGRjLCAweDk0MjIsIDB4YTBlMCwgMHg5MzFiLCAweDA2MzAsIDB4MjMwMCwgMHg5NDA1LAorCTB4MDE2MCwgMHg4YTUxLCAweDA5MDQsIDB4MjFjNywgMHg4YzYwLCAweDA4MDQsIDB4MjAxNywgMHhhMDA0LAorCTB4OTA0NSwgMHgwOTA0LCAweDIxYzcsIDB4MDgwNCwgMHgxZmYyLCAweDhhNTEsIDB4MDkwNCwgMHgyMWM3LAorCTB4OGM2MCwgMHgyYzA1LCAweDkwMDUsIDB4MTE1OCwgMHhhMDA0LCAweDkwNDUsIDB4MDkwNCwgMHgyMWM3LAorCTB4YTA2NCwgMHg5MGVjLCAweDAwMGYsIDB4OWRlMCwgMHgxZmM4LCAweDJjMDUsIDB4MjA2MCwgMHhhODgwLAorCTB4YzBmYywgMHhhODgyLCAweDA4MDQsIDB4MjFiYywgMHgyYzA1LCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLAorCTB4OTM5OSwgMHgwMDAwLCAweGFjMmUsIDB4YWIzMiwgMHhkZDljLCAweDE5MDQsIDB4MjE1OSwgMHg5MDgyLAorCTB4MDAxYiwgMHgwMDAyLCAweDIwZjUsIDB4MjBmNSwgMHgyMGY3LCAweDIwZjUsIDB4MjBmNSwgMHgyMGY1LAorCTB4MjEwNSwgMHgyMGY1LCAweDIwZjUsIDB4MjBmNSwgMHgyMTEzLCAweDIwZjUsIDB4MjBmNSwgMHgyMGY1LAorCTB4MjEyMSwgMHgyMGY1LCAweDIwZjUsIDB4MjBmNSwgMHgyMTJmLCAweDIwZjUsIDB4MjBmNSwgMHgyMGY1LAorCTB4MjEzZCwgMHgyMGY1LCAweDIwZjUsIDB4MjBmNSwgMHgyMTRiLCAweDA4MGMsIDB4MGRmYSwgMHhhMTdjLAorCTB4MjQwMCwgMHg5MTIyLCAweGExODAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRmYSwgMHhhMDc0LAorCTB4OTQyMCwgMHhhMDc4LCAweDkzMTksIDB4MDgwNCwgMHgyMWI3LCAweGExOGMsIDB4MjQwMCwgMHg5MTIyLAorCTB4YTE5MCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZGZhLCAweGEwODQsIDB4OTQyMCwgMHhhMDg4LAorCTB4OTMxOSwgMHgwODA0LCAweDIxYjcsIDB4YTE5YywgMHgyNDAwLCAweDkxMjIsIDB4YTFhMCwgMHgyMzAwLAorCTB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTA5NCwgMHg5NDIwLCAweGEwOTgsIDB4OTMxOSwgMHgwODA0LAorCTB4MjFiNywgMHhhMWFjLCAweDI0MDAsIDB4OTEyMiwgMHhhMWIwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLAorCTB4MGRmYSwgMHhhMGE0LCAweDk0MjAsIDB4YTBhOCwgMHg5MzE5LCAweDA4MDQsIDB4MjFiNywgMHhhMWJjLAorCTB4MjQwMCwgMHg5MTIyLCAweGExYzAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRmYSwgMHhhMGI0LAorCTB4OTQyMCwgMHhhMGI4LCAweDkzMTksIDB4MDgwNCwgMHgyMWI3LCAweGExY2MsIDB4MjQwMCwgMHg5MTIyLAorCTB4YTFkMCwgMHgyMzAwLCAweDkxMWIsIDB4MGEwYywgMHgwZGZhLCAweGEwYzQsIDB4OTQyMCwgMHhhMGM4LAorCTB4OTMxOSwgMHgwODA0LCAweDIxYjcsIDB4YTFkYywgMHgyNDAwLCAweDkxMjIsIDB4YTFlMCwgMHgyMzAwLAorCTB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTBkNCwgMHg5NDIwLCAweGEwZDgsIDB4OTMxOSwgMHgwODA0LAorCTB4MjFiNywgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHgyMTc3LCAweDIxNzUsIDB4MjE3NSwgMHgyMTc1LAorCTB4MjE3NSwgMHgyMTc1LCAweDIxODQsIDB4MjE3NSwgMHgyMTc1LCAweDIxNzUsIDB4MjE3NSwgMHgyMTc1LAorCTB4MjE5MSwgMHgyMTc1LCAweDIxNzUsIDB4MjE3NSwgMHgyMTc1LCAweDIxNzUsIDB4MjE5ZSwgMHgyMTc1LAorCTB4MjE3NSwgMHgyMTc1LCAweDIxNzUsIDB4MjE3NSwgMHgyMWFiLCAweDA4MGMsIDB4MGRmYSwgMHhhMTdjLAorCTB4MjQwMCwgMHg5MTIyLCAweGExODAsIDB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRmYSwgMHhhMDZjLAorCTB4OTQyMCwgMHhhMDcwLCAweDkzMTksIDB4MDQ5OCwgMHhhMTk0LCAweDI0MDAsIDB4OTEyMiwgMHhhMTk4LAorCTB4MjMwMCwgMHg5MTFiLCAweDBhMGMsIDB4MGRmYSwgMHhhMDg0LCAweDk0MjAsIDB4YTA4OCwgMHg5MzE5LAorCTB4MDQzMCwgMHhhMWFjLCAweDI0MDAsIDB4OTEyMiwgMHhhMWIwLCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLAorCTB4MGRmYSwgMHhhMDljLCAweDk0MjAsIDB4YTBhMCwgMHg5MzE5LCAweDAwYzgsIDB4YTFjNCwgMHgyNDAwLAorCTB4OTEyMiwgMHhhMWM4LCAweDIzMDAsIDB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTBiNCwgMHg5NDIwLAorCTB4YTBiOCwgMHg5MzE5LCAweDAwNjAsIDB4YTFkYywgMHgyNDAwLCAweDkxMjIsIDB4YTFlMCwgMHgyMzAwLAorCTB4OTExYiwgMHgwYTBjLCAweDBkZmEsIDB4YTBjYywgMHg5NDIwLCAweGEwZDAsIDB4OTMxOSwgMHhhYzFlLAorCTB4YWIyMiwgMHhhODgwLCAweGMwZmQsIDB4YTg4MiwgMHgyODAwLCAweGE4NWEsIDB4MmMwMCwgMHhhODEyLAorCTB4MmEwMCwgMHhhODE2LCAweDAwMGUsIDB4MDAwZSwgMHgwMDBlLCAweDkwMDYsIDB4MDAyOCwgMHgwMDhlLAorCTB4MDBkZSwgMHgwMGNlLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LAorCTB4ZDBiYywgMHgxOTBjLCAweDBkZjMsIDB4OTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4MjFlOCwgMHgxZGVjLAorCTB4MjFlOCwgMHgyMWRlLCAweDIxZTEsIDB4MjFlNCwgMHgyMWUxLCAweDIxZTQsIDB4MDgwYywgMHgxZGVjLAorCTB4MDAwNSwgMHgwODBjLCAweDExZTgsIDB4MDAwNSwgMHgwODBjLCAweDFkZWMsIDB4MDgwYywgMHgxMWU4LAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjYwMCwgMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwgMHgwMjYwLAorCTB4MjA2OSwgMHgxODAwLCAweDc4MTcsIDB4MDAwMCwgMHg3ODliLCAweDA4MTQsIDB4NzhhMywgMHgwNDA2LAorCTB4Nzg5ZiwgMHgwNDEwLCAweDIwMDksIDB4MDEzYiwgMHgyMDBiLCAweDA0MDAsIDB4NzgxYiwgMHgwMDAyLAorCTB4NzgzYiwgMHgwMDFmLCAweDc4MzcsIDB4MDAyMCwgMHg3ODAzLCAweDE2MDAsIDB4MDEyZSwgMHgwMDA1LAorCTB4MjA5MSwgMHgyNjAwLCAweDc4MWMsIDB4ZDBhNCwgMHgxOTBjLCAweDIzMDcsIDB4NzkwMCwgMHhkMWRjLAorCTB4MTExOCwgMHg5MDg0LCAweDAwMDYsIDB4MDAxYSwgMHg5MDg0LCAweDAwMGUsIDB4MDAwMiwgMHgyMjJmLAorCTB4MjIyNywgMHg3YmI0LCAweDIyMjcsIDB4MjIyOSwgMHgyMjI5LCAweDIyMjksIDB4MjIyOSwgMHg3YjlhLAorCTB4MjIyNywgMHgyMjJiLCAweDIyMjcsIDB4MjIyOSwgMHgyMjI3LCAweDIyMjksIDB4MjIyNywgMHgwODBjLAorCTB4MGRmYSwgMHgwMDMxLCAweDAwMjAsIDB4MDgwYywgMHg3YjlhLCAweDA4MGMsIDB4N2JiNCwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHhkYzM0LCAweDc5MzAsIDB4OTE4NCwgMHgwMDAzLAorCTB4MDFjMCwgMHgyMDAxLCAweDE5Y2UsIDB4MjAwNCwgMHg5MDA1LCAweDAxNzAsIDB4MjAwMSwgMHgwMTMzLAorCTB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4MGRmYSwgMHgwMGM2LCAweDIwMDEsIDB4MTljZSwgMHgyMDY0LAorCTB4MDgwYywgMHhiYTU2LCAweDAwY2UsIDB4MDBmOCwgMHgyMDA5LCAweDAwNDAsIDB4MDgwYywgMHgyMzBhLAorCTB4MDBkMCwgMHg5MTg0LCAweDAwMTQsIDB4MDFhMCwgMHg2YTAwLCAweDkyODYsIDB4MDAwMywgMHgwMTYwLAorCTB4MDgwYywgMHg3MjA3LCAweDExMzgsIDB4MDgwYywgMHg3NTA0LCAweDA4MGMsIDB4NWYyYiwgMHgwODBjLAorCTB4NzEyNywgMHgwMDEwLCAweDA4MGMsIDB4NWRlYSwgMHgwODBjLCAweDdjNjMsIDB4MDA0MSwgMHgwMDE4LAorCTB4OTE4NCwgMHg5NTQwLCAweDFkYzgsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHgxYTNhLCAweDA4MGMsIDB4MTlmZiwgMHgwMDVlLAorCTB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MmUwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MTI4LCAweDIwMDEsIDB4MTk0NywgMHgyMTAyLCAweDIwMDEsIDB4MTk0ZiwgMHgyMTAyLAorCTB4MjAwMSwgMHgwMTNiLCAweDIxMDIsIDB4MjA3OSwgMHgwMjAwLCAweDIwMDEsIDB4MDIwMSwgMHg3ODllLAorCTB4NzhhMywgMHgwMjAwLCAweDkxOTgsIDB4MDAwNywgMHg4MzFjLCAweDgzMWMsIDB4ODMxYywgMHg5Mzk4LAorCTB4MDAwNSwgMHgyMzIwLCAweDkxODIsIDB4MDIwNCwgMHgxMjMwLCAweDIwMTEsIDB4MDAwOCwgMHg4NDIzLAorCTB4ODQyMywgMHg4NDIzLCAweDA0ODgsIDB4OTE4MiwgMHgwMjRjLCAweDEyNDAsIDB4MjAxMSwgMHgwMDA3LAorCTB4ODQwMywgMHg4MDAzLCAweDk0MDAsIDB4OTQwMCwgMHg5NDIwLCAweDA0MzAsIDB4OTE4MiwgMHgwMmJjLAorCTB4MTIzOCwgMHgyMDExLCAweDAwMDYsIDB4ODQwMywgMHg4MDAzLCAweDk0MDAsIDB4OTQyMCwgMHgwMGUwLAorCTB4OTE4MiwgMHgwMzRjLCAweDEyMzAsIDB4MjAxMSwgMHgwMDA1LCAweDg0MDMsIDB4ODAwMywgMHg5NDIwLAorCTB4MDA5OCwgMHg5MTgyLCAweDA0MmMsIDB4MTIyOCwgMHgyMDExLCAweDAwMDQsIDB4ODQyMywgMHg4NDIzLAorCTB4MDA1OCwgMHg5MTgyLCAweDA1OWMsIDB4MTIyOCwgMHgyMDExLCAweDAwMDMsIDB4ODQwMywgMHg5NDIwLAorCTB4MDAxOCwgMHgyMDExLCAweDAwMDIsIDB4ODQyMywgMHg5NDgyLCAweDAyMjgsIDB4ODAwMiwgMHg4MDIwLAorCTB4ODMwMSwgMHg5NDAyLCAweDAxMTAsIDB4MDIwOCwgMHg4MzIxLCAweDgyMTcsIDB4ODIwMywgMHg5NDA1LAorCTB4Nzg5YSwgMHgwMTJlLCAweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODE0LAorCTB4OTA4NCwgMHhmZmMwLCAweDkxMGQsIDB4NjkxNiwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMjAwLCAweDkwMDUsIDB4NjgxMCwgMHgwMTEwLCAweGMwYTUsIDB4MDAwOCwgMHhjMGE0LAorCTB4NjgxMiwgMHgwMGRlLCAweDAwMDUsIDB4MDAwNiwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODEwLAorCTB4OTA4NCwgMHhmZmY4LCAweDkxMGQsIDB4NjkxMiwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHg3OTM4LAorCTB4MDgwYywgMHgwZGYzLCAweDAwZjYsIDB4MjA3OSwgMHgwMjAwLCAweDc5MDIsIDB4YTAwMSwgMHhhMDAxLAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHg3OTAyLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4MDBmZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHgyODAwLAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYmI2LAorCTB4MDgwYywgMHgyYTg5LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwNTU4LAorCTB4NjA1NCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDkwODQsIDB4MDAwYywgMHg2MTUwLAorCTB4OTE4YywgMHhmZmYzLCAweDkxMDUsIDB4NjA1MiwgMHg2MDUwLCAweDkwODQsIDB4YjE3ZiwgMHg5MDg1LAorCTB4MjAwMCwgMHg2MDUyLCAweDIwMDksIDB4MTk3NSwgMHgyMDExLCAweDE5NzYsIDB4NjM1OCwgMHg5MzljLAorCTB4MzhmMCwgMHgyMzIwLCAweDA4MGMsIDB4MmFmNiwgMHgxMjM4LCAweDkzOWQsIDB4NDAwMywgMHg5NGE1LAorCTB4ODYwMywgMHgyMzBhLCAweDI0MTIsIDB4MDAzMCwgMHg5MzlkLCAweDAyMDMsIDB4OTRhNSwgMHg4NjAzLAorCTB4MjMwYSwgMHgyNDEyLCAweDAwNTAsIDB4MjAwMSwgMHgxOTc1LCAweDIwMDMsIDB4MDcwMCwgMHgyMDAxLAorCTB4MTk3NiwgMHgyMDAzLCAweDA3MDAsIDB4MDgwYywgMHgyY2MyLCAweDkwMDYsIDB4MDgwYywgMHgyYWI4LAorCTB4OTAwNiwgMHgwODBjLCAweDJhOWIsIDB4MjBhOSwgMHgwMDEyLCAweDFkMDQsIDB4MjM2ZCwgMHgyMDkxLAorCTB4NjAwMCwgMHgxZjA0LCAweDIzNmQsIDB4NjAyZiwgMHgwMTAwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDUwLAorCTB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZGZmZiwgMHg2MDUyLCAweDYwMjQsIDB4NjAyNiwgMHgwODBjLAorCTB4MjdhNywgMHgyMDA5LCAweDAwZWYsIDB4NjEzMiwgMHg2MTM2LCAweDA4MGMsIDB4MjdiNywgMHg2MGU3LAorCTB4MDAwMCwgMHg2MWVhLCAweDYwZTMsIDB4MDAwMiwgMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDgwLCAweDYwMmYsIDB4MDAwMCwgMHg2MDA3LCAweDE0OWYsIDB4NjBiYiwgMHgwMDAwLAorCTB4MjBhOSwgMHgwMDE4LCAweDYwYmYsIDB4MDAwMCwgMHgxZjA0LCAweDIzOWEsIDB4NjBiYiwgMHgwMDAwLAorCTB4NjBiZiwgMHgwMTA4LCAweDYwYmYsIDB4MDAxMiwgMHg2MGJmLCAweDAzMjAsIDB4NjBiZiwgMHgwMDE4LAorCTB4NjAxYiwgMHgwMGYwLCAweDYwMWYsIDB4MDAxZSwgMHg2MDBmLCAweDAwNmIsIDB4NjAyYiwgMHg0MDJmLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTQwLCAweDc4YzMsIDB4MDA4MCwgMHg3OGMzLAorCTB4MDA4MywgMHg3OGMzLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgzNCwgMHgyMDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDE4MzMsIDB4MjAwMywgMHgwMDAxLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHg2MTI0LCAweDkxODQsIDB4NWUyYywgMHgxMTE4LAorCTB4OTE4NCwgMHgwMDA3LCAweDAwMmEsIDB4OTE5NSwgMHgwMDA0LCAweDkyODQsIDB4MDAwNywgMHgwMDAyLAorCTB4MjNmYSwgMHgyM2UwLCAweDIzZTMsIDB4MjNlNiwgMHgyM2ViLCAweDIzZWQsIDB4MjNmMSwgMHgyM2Y1LAorCTB4MDgwYywgMHg4NTYzLCAweDAwYjgsIDB4MDgwYywgMHg4NjMyLCAweDAwYTAsIDB4MDgwYywgMHg4NjMyLAorCTB4MDgwYywgMHg4NTYzLCAweDAwNzgsIDB4MDA5OSwgMHgwMDY4LCAweDA4MGMsIDB4ODU2MywgMHgwMDc5LAorCTB4MDA0OCwgMHgwODBjLCAweDg2MzIsIDB4MDA1OSwgMHgwMDI4LCAweDA4MGMsIDB4ODYzMiwgMHgwODBjLAorCTB4ODU2MywgMHgwMDI5LCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGE2LAorCTB4NjEyNCwgMHg2MDI4LCAweGQwOWMsIDB4MDExOCwgMHhkMTljLCAweDE5MDQsIDB4MjY0OCwgMHhkMWY0LAorCTB4MTkwYywgMHgwZGYzLCAweDA4MGMsIDB4NzIwNywgMHgwOTA0LCAweDI0NTUsIDB4MDgwYywgMHhjNTM5LAorCTB4MTEyMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMywgMHgwNTcwLCAweDYwMjQsIDB4OTA4NCwgMHgxODAwLAorCTB4MDU1MCwgMHgwODBjLCAweDcyMmEsIDB4MDExOCwgMHgwODBjLCAweDcyMTgsIDB4MTUyMCwgMHg2MDI3LAorCTB4MDAyMCwgMHg2MDQzLCAweDAwMDAsIDB4MDgwYywgMHhjNTM5LCAweDAxNjgsIDB4MDgwYywgMHg3MjJhLAorCTB4MTE1MCwgMHgyMDAxLCAweDE5N2YsIDB4MjAwMywgMHgwMDAxLCAweDYwMjcsIDB4MTgwMCwgMHgwODBjLAorCTB4NzA3NiwgMHgwODA0LCAweDI2NGIsIDB4NzBhMCwgMHg5MDA1LCAweDExNTAsIDB4NzBhMywgMHgwMDAxLAorCTB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg3MjVlLCAweDAwZGUsIDB4MTkwNCwgMHgyNjRiLAorCTB4MDgwYywgMHg3NTBlLCAweDA0MjgsIDB4MDgwYywgMHg3MjJhLCAweDE1OTAsIDB4NjAyNCwgMHg5MDg0LAorCTB4MTgwMCwgMHgxMTA4LCAweDA0NjgsIDB4MDgwYywgMHg3NTBlLCAweDA4MGMsIDB4NzUwNCwgMHgwODBjLAorCTB4NWYyYiwgMHgwODBjLCAweDcxMjcsIDB4MDgwNCwgMHgyNjQ4LCAweGQxYWMsIDB4MTUwOCwgMHg2MDI0LAorCTB4ZDBkYywgMHgxMTcwLCAweGQwZTQsIDB4MTE3OCwgMHhkMGQ0LCAweDExOTAsIDB4ZDBjYywgMHgwMTMwLAorCTB4NzA5NCwgMHg5MDg2LCAweDAwMjgsIDB4MTExMCwgMHgwODBjLCAweDczZjMsIDB4MDgwNCwgMHgyNjQ4LAorCTB4MDgwYywgMHg3NTA5LCAweDAwNDgsIDB4MjAwMSwgMHgxOTU1LCAweDIwMDMsIDB4MDAwMiwgMHgwMDIwLAorCTB4MDgwYywgMHg3MzU5LCAweDA4MDQsIDB4MjY0OCwgMHgwODBjLCAweDc0OGQsIDB4MDgwNCwgMHgyNjQ4LAorCTB4ZDFhYywgMHgwOTA0LCAweDI1NjksIDB4MDgwYywgMHg3MjA3LCAweDExYzAsIDB4NjAyNywgMHgwMDIwLAorCTB4MDAwNiwgMHgwMDI2LCAweDAwMzYsIDB4MDgwYywgMHg3MjIxLCAweDExNTgsIDB4MDgwYywgMHg3NTA0LAorCTB4MDgwYywgMHg1ZjJiLCAweDA4MGMsIDB4NzEyNywgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwMGFlLAorCTB4MDAwNSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwODBjLCAweDcxZGYsIDB4MDAxNiwgMHgwMDQ2LAorCTB4MDBjNiwgMHg2NDRjLCAweDk0ODYsIDB4ZjBmMCwgMHgxMTM4LCAweDIwNjEsIDB4MDEwMCwgMHg2NDRhLAorCTB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg3NGQ2LCAweDk0OGMsIDB4ZmYwMCwgMHg3MDM4LAorCTB4ZDA4NCwgMHgwMTc4LCAweDkxODYsIDB4ZjgwMCwgMHgxMTYwLCAweDcwNDQsIDB4ZDA4NCwgMHgxMTQ4LAorCTB4YzA4NSwgMHg3MDQ2LCAweDAwMzYsIDB4MjQxOCwgMHgyMDExLCAweDgwMTYsIDB4MDgwYywgMHg0YjFmLAorCTB4MDAzZSwgMHgwODBjLCAweGM1MzIsIDB4MTkwNCwgMHgyNTQ2LCAweDkxOTYsIDB4ZmYwMCwgMHgwNWE4LAorCTB4NzA1YywgMHg5MDg0LCAweDAwZmYsIDB4ODEwZiwgMHg4MWZmLCAweDAxMTAsIDB4OTExNiwgMHgwNTY4LAorCTB4NzEzMCwgMHhkMTg0LCAweDE1NTAsIDB4MDgwYywgMHgzMmU0LCAweDAxMjgsIDB4YzE4ZCwgMHg3MTMyLAorCTB4MDgwYywgMHg2N2JiLCAweDE1MTAsIDB4NjI0MCwgMHg5Mjk0LCAweDAwMTAsIDB4MDEzMCwgMHg2MjQ4LAorCTB4OTI5NCwgMHhmZjAwLCAweDkyOTYsIDB4ZmYwMCwgMHgwMWMwLCAweDcwMzAsIDB4ZDA4YywgMHgwOTA0LAorCTB4MjU0NiwgMHg3MDM4LCAweGQwOGMsIDB4MTE0MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhkMWFjLAorCTB4MTkwNCwgMHgyNTQ2LCAweGMxYWQsIDB4MjEwMiwgMHgwMDM2LCAweDczZDQsIDB4MjAxMSwgMHg4MDEzLAorCTB4MDgwYywgMHg0YjFmLCAweDAwM2UsIDB4MDgwNCwgMHgyNTQ2LCAweDcwMzgsIDB4ZDA4YywgMHgxMTQwLAorCTB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFhYywgMHgxOTA0LCAweDI1NDYsIDB4YzFhZCwgMHgyMTAyLAorCTB4MDAzNiwgMHg3M2Q0LCAweDIwMTEsIDB4ODAxMywgMHgwODBjLCAweDRiMWYsIDB4MDAzZSwgMHg3MTMwLAorCTB4YzE4NSwgMHg3MTMyLCAweDIwMTEsIDB4MTg1YywgMHgyMjBjLCAweDAwZjAsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwMSwgMHgyMDExLCAweDAxMDAsIDB4MDgwYywgMHg4NGQxLCAweDIwMTksIDB4MDAwZSwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMDAwLCAweDA4MGMsIDB4ZDgwMSwgMHgwMGNlLCAweDk0ODQsIDB4MDBmZiwgMHg5MDgwLAorCTB4MzJlOSwgMHgyMDBkLCAweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDIxMjAsIDB4OTAwNiwgMHgyMDA5LAorCTB4MDAwZSwgMHgwODBjLCAweGQ4ODUsIDB4MDAxZSwgMHhkMWFjLCAweDExNDgsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwMiwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHgzMTU2LCAweDAwMWUsIDB4MDA3OCwgMHgwMTU2LAorCTB4MDBiNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwODBjLCAweDY0OWYsIDB4MTExMCwgMHgwODBjLAorCTB4NWY0NSwgMHg4MTA4LCAweDFmMDQsIDB4MjUzYywgMHgwMGJlLCAweDAxNWUsIDB4MDBjZSwgMHgwMDRlLAorCTB4MDgwYywgMHhhMDY5LCAweDYwZTMsIDB4MDAwMCwgMHgwMDFlLCAweDIwMDEsIDB4MTgwMCwgMHgyMDE0LAorCTB4OTI5NiwgMHgwMDA0LCAweDExNzAsIDB4ZDE5YywgMHgxMWEwLCAweDIwMTEsIDB4MTgwYywgMHgyMjE0LAorCTB4ZDI5YywgMHgxMTIwLCAweDYyMDQsIDB4OTI5NSwgMHgwMDAyLCAweDYyMDYsIDB4NjIyOCwgMHhjMjlkLAorCTB4NjIyYSwgMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHgxODI1LCAweDIwMDMsIDB4MDAwMCwgMHg2MDI3LAorCTB4MDAyMCwgMHhkMTk0LCAweDA5MDQsIDB4MjY0OCwgMHgwMDE2LCAweDYyMjAsIDB4ZDJiNCwgMHgwOTA0LAorCTB4MjVmMSwgMHgwODBjLCAweDgzNWEsIDB4MDgwYywgMHg5NjU2LCAweDYwMjcsIDB4MDAwNCwgMHgwMGY2LAorCTB4MjAxOSwgMHgxOWM4LCAweDIzMDQsIDB4OTA3ZCwgMHgwOTA0LCAweDI1YzAsIDB4NzgwNCwgMHg5MDg2LAorCTB4MDAzMiwgMHgxNWYwLCAweDAwZDYsIDB4MDBjNiwgMHgwMGU2LCAweDAwOTYsIDB4MjA2OSwgMHgwMTQwLAorCTB4NzgyYywgMHg2ODVlLCAweDc4MDgsIDB4Njg1YSwgMHg2MDQzLCAweDAwMDIsIDB4MjAwMSwgMHgwMDAzLAorCTB4ODAwMSwgMHgxZGYwLCAweDYwNDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwM2MsIDB4ODAwMSwgMHgxZGYwLAorCTB4MDgwYywgMHgyYzk4LCAweDIwMDEsIDB4MDAxZSwgMHg4MDAxLCAweDAyNDAsIDB4MjBhOSwgMHgwMDA5LAorCTB4MDgwYywgMHgyYjkxLCAweDY5MDQsIDB4ZDFkYywgMHgxMTQwLCAweDBjYjAsIDB4MjAwMSwgMHgwMTAwLAorCTB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLAorCTB4OGMxMCwgMHg3ODE0LCAweDIwNDgsIDB4YTg2NywgMHgwMTAzLCAweDJmNjAsIDB4MDgwYywgMHhhMGUzLAorCTB4MDA5ZSwgMHgwMGVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGZlLCAweDAwMWUsIDB4MDBhZSwgMHgwMDA1LAorCTB4MDBmZSwgMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLAorCTB4MDgwYywgMHgyYzk4LCAweDAwZGUsIDB4MDBjNiwgMHgyMDYxLCAweDE5YmYsIDB4NjAyOCwgMHgwODBjLAorCTB4YzUzOSwgMHgwMTIwLCAweDkwOWEsIDB4MDAwMywgMHgxMjU4LCAweDAwMTgsIDB4OTA5YSwgMHgwMGM4LAorCTB4MTIzOCwgMHg4MDAwLCAweDYwMmEsIDB4MDBjZSwgMHgwODBjLCAweDk2MzIsIDB4MDgwNCwgMHgyNjQ3LAorCTB4MjA2MSwgMHgwMTAwLCAweDYyYzAsIDB4MDgwYywgMHg5ZWVmLCAweDIwMTksIDB4MTljOCwgMHgyMzA0LAorCTB4OTA2NSwgMHgwMTIwLCAweDIwMDksIDB4MDAyNywgMHgwODBjLCAweGExNWQsIDB4MDBjZSwgMHgwODA0LAorCTB4MjY0NywgMHhkMmJjLCAweDA5MDQsIDB4MjYzNCwgMHgwODBjLCAweDgzNjcsIDB4NjAxNCwgMHg5MDg0LAorCTB4MTk4NCwgMHg5MDg1LCAweDAwMTAsIDB4NjAxNiwgMHg2MDI3LCAweDAwMDQsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2ODA0LCAweDkwODQsIDB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmM5OCwgMHgwMGRlLAorCTB4MDBjNiwgMHgyMDYxLCAweDE5YmYsIDB4NjA0NCwgMHgwODBjLCAweGM1MzksIDB4MDEyMCwgMHg5MDlhLAorCTB4MDAwMywgMHgxNjI4LCAweDAwMTgsIDB4OTA5YSwgMHgwMGM4LCAweDE2MDgsIDB4ODAwMCwgMHg2MDQ2LAorCTB4NjAzYywgMHgwMGNlLCAweDkwMDUsIDB4MDU1OCwgMHgyMDA5LCAweDA3ZDAsIDB4MDgwYywgMHg4MzVmLAorCTB4OTA4MCwgMHgwMDA4LCAweDIwMDQsIDB4OTA4NiwgMHgwMDA2LCAweDExMzgsIDB4NjExNCwgMHg5MThjLAorCTB4MTk4NCwgMHg5MThkLCAweDAwMTIsIDB4NjExNiwgMHgwMGQwLCAweDYxMTQsIDB4OTE4YywgMHgxOTg0LAorCTB4OTE4ZCwgMHgwMDE2LCAweDYxMTYsIDB4MDA5OCwgMHg2MDI3LCAweDAwMDQsIDB4MDA4MCwgMHgwMDM2LAorCTB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4OTk5ZCwgMHgwMDNlLCAweDIwMTksIDB4MTljZSwgMHgyMzA0LAorCTB4OTA2NSwgMHgwMTIwLCAweDIwMDksIDB4MDA0ZiwgMHgwODBjLCAweGExNWQsIDB4MDBjZSwgMHgwMDFlLAorCTB4ZDE5YywgMHgwOTA0LCAweDI3MTIsIDB4NzAzOCwgMHhkMGFjLCAweDE5MDQsIDB4MjZlNywgMHgwMDE2LAorCTB4MDE1NiwgMHg2MDI3LCAweDAwMDgsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MDkwNCwgMHgyNmM0LCAweDYwNTAsIDB4OTA4NSwgMHgwMDQwLCAweDYwNTIsIDB4NjA1MCwgMHg5MDg0LAorCTB4ZmJjZiwgMHg2MDUyLCAweDA4MGMsIDB4MmJiMCwgMHg5MDg1LCAweDIwMDAsIDB4NjA1MiwgMHgyMGE5LAorCTB4MDAxMiwgMHgxZDA0LCAweDI2NjksIDB4MDgwYywgMHg4MzhlLCAweDFmMDQsIDB4MjY2OSwgMHg2MDUwLAorCTB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZGZiZiwgMHg2MDUyLCAweDIwYTksIDB4MDAyOCwgMHhhMDAxLAorCTB4MWYwNCwgMHgyNjc3LCAweDYxNTAsIDB4OTE4NSwgMHgxNDAwLCAweDYwNTIsIDB4MjBhOSwgMHgwMzY2LAorCTB4MWQwNCwgMHgyNjgwLCAweDA4MGMsIDB4ODM4ZSwgMHg2MDIwLCAweGQwOWMsIDB4MTEzOCwgMHgwMTVlLAorCTB4NjE1MiwgMHgwMDFlLCAweDYwMjcsIDB4MDAwOCwgMHgwODA0LCAweDI3MTIsIDB4MDgwYywgMHgyYjc4LAorCTB4MWYwNCwgMHgyNjgwLCAweDAxNWUsIDB4NjE1MiwgMHgwMDFlLCAweDYwMjcsIDB4MDAwOCwgMHgwMDE2LAorCTB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MDgwYywgMHhhMDY5LCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLAorCTB4ZGMxMywgMHgwODBjLCAweGRjMmUsIDB4MDgwYywgMHg1NWRmLCAweGQwZmMsIDB4MTEzOCwgMHgwODBjLAorCTB4YzUzMiwgMHgxMTIwLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDcyNGUsIDB4OTAwNiwgMHgwODBjLAorCTB4MmM4OCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHgyYmI2LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4NzAwMywgMHgwMDA0LCAweDA4MGMsIDB4MGVjNiwgMHgwMGVlLCAweDYwMjcsIDB4MDAwOCwgMHgwODBjLAorCTB4MGI4ZiwgMHgwMDFlLCAweDA4MDQsIDB4MjcxMiwgMHgwODBjLCAweDJjYzIsIDB4MDgwYywgMHgyY2Y1LAorCTB4NjA1MCwgMHhjMGU1LCAweDYwNTIsIDB4MjBhOSwgMHgwMzY3LCAweDFmMDQsIDB4MjZlNSwgMHgxZDA0LAorCTB4MjZjZiwgMHgwODBjLCAweDgzOGUsIDB4NjAyMCwgMHhkMDljLCAweDFkYjgsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDEwMCwgMHgwODBjLCAweDJiMDYsIDB4MDBmZSwgMHgxZDgwLCAweDYwNTAsIDB4YzBlNCwgMHg2MDUyLAorCTB4NjAyNywgMHgwMDA4LCAweDAxNWUsIDB4MDAxZSwgMHgwNDY4LCAweDAxNWUsIDB4MDAxZSwgMHgwMDE2LAorCTB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MDgwYywgMHhhMDY5LCAweDYwZTMsIDB4MDAwMCwgMHgwODBjLAorCTB4ZGMxMywgMHgwODBjLCAweGRjMmUsIDB4MDgwYywgMHg1NWRmLCAweGQwZmMsIDB4MTEzOCwgMHgwODBjLAorCTB4YzUzMiwgMHgxMTIwLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDcyNGUsIDB4OTAwNiwgMHgwODBjLAorCTB4MmM4OCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHgyYmI2LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4NzAwMywgMHgwMDA0LCAweDA4MGMsIDB4MGVjNiwgMHgwMGVlLCAweDYwMjcsIDB4MDAwOCwgMHgwODBjLAorCTB4MGI4ZiwgMHgwMDFlLCAweDkxOGMsIDB4ZmZkMCwgMHg2MTI2LCAweDAwYWUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBlNiwgMHgwMGY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgxODAwLCAweDcxY2MsIDB4NzBjZSwgMHg5MTE2LCAweDA5MDQsIDB4Mjc2NiwgMHg4MWZmLAorCTB4MDFhMCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHgyYmI2LCAweDIwMTEsIDB4ODAxMSwgMHgyMDE5LAorCTB4MDEwZSwgMHgyMzFjLCAweDkzOWUsIDB4MDAwNywgMHgxMTE4LCAweDIwMTksIDB4MDAwMSwgMHgwMDEwLAorCTB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4NGIxZiwgMHgwNDQ4LCAweDIwMDEsIDB4MTk4MCwgMHgyMDBjLAorCTB4ODFmZiwgMHgxMTQwLCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwYjQsIDB4MDExOCwgMHgyMDE5LAorCTB4MDAwMywgMHgwMDA4LCAweDIxMTgsIDB4MjAxMSwgMHg4MDEyLCAweDA4MGMsIDB4NGIxZiwgMHgwODBjLAorCTB4MGVjNiwgMHgwODBjLCAweDU1ZGYsIDB4ZDBmYywgMHgxMTg4LCAweDA4MGMsIDB4YzUzMiwgMHgxMTcwLAorCTB4MDBjNiwgMHgwODBjLCAweDI4MDIsIDB4MDgwYywgMHg5OTA0LCAweDIwNjEsIDB4MDEwMCwgMHgyMDE5LAorCTB4MDAyOCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHgzMTU2LCAweDAwY2UsIDB4MDEyZSwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MjAyOCwgMHg5MThjLAorCTB4MDBmZiwgMHgyMTMwLCAweDkwOTQsIDB4ZmYwMCwgMHgxMWYwLCAweDIwMTEsIDB4MTgzNiwgMHgyMjE0LAorCTB4ZDJhYywgMHgxMWM4LCAweDgxZmYsIDB4MDFlOCwgMHgyMDExLCAweDE4MWUsIDB4MjIwNCwgMHg5MTA2LAorCTB4MTE5MCwgMHgyMDExLCAweDE4MWYsIDB4MjIxNCwgMHg5Mjk0LCAweGZmMDAsIDB4OTU4NCwgMHhmZjAwLAorCTB4OTIwNiwgMHgxMTQ4LCAweDIwMTEsIDB4MTgxZiwgMHgyMjE0LCAweDkyOTQsIDB4MDBmZiwgMHg5NTg0LAorCTB4MDBmZiwgMHg5MjA2LCAweDExMjAsIDB4MjUwMCwgMHgwODBjLCAweDdlYzAsIDB4MDA0OCwgMHg5NTg0LAorCTB4MDBmZiwgMHg5MDgwLCAweDMyZTksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHg5MDA2LAorCTB4MDAwNSwgMHg5MDgwLCAweDMyZTksIDB4MjAwZCwgMHg5MThjLCAweDAwZmYsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMTQwLCAweDIwMDEsIDB4MTgxNywgMHgyMDAzLCAweDAwZWYsIDB4MjBhOSwgMHgwMDEwLAorCTB4OTAwNiwgMHg2ODUyLCAweDY4NTYsIDB4MWYwNCwgMHgyN2IyLCAweDAwZGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDBkNiwgMHgwMDI2LCAweDIwNjksIDB4MDE0MCwgMHgyMDAxLCAweDE4MTcsIDB4MjEwMiwgMHg4MTE0LAorCTB4ODIxNCwgMHg4MjE0LCAweDgyMTQsIDB4MjBhOSwgMHgwMDEwLCAweDY4NTMsIDB4MDAwMCwgMHg5MDA2LAorCTB4ODJmZiwgMHgxMTI4LCAweDkxODQsIDB4MDAwZiwgMHg5MDgwLCAweGU1NjgsIDB4MjAwNSwgMHg2ODU2LAorCTB4ODIxMSwgMHgxZjA0LCAweDI3YzcsIDB4MDAyZSwgMHgwMGRlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MjA2MSwgMHgxODAwLCAweDYwMzAsIDB4MDExMCwgMHhjMDlkLCAweDAwMDgsIDB4YzA5YywgMHg2MDMyLAorCTB4MDBjZSwgMHgwMDA1LCAweDAxNTYsIDB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2OTgwLCAweDkxMTYsIDB4MDE4MCwgMHg5MTEyLCAweDEyMzAsIDB4ODIxMiwgMHg4MjEwLAorCTB4MjJhOCwgMHgyMDAxLCAweDA0MDIsIDB4MDAxOCwgMHgyMmE4LCAweDIwMDEsIDB4MDQwNCwgMHg2ODBlLAorCTB4MWYwNCwgMHgyN2Y3LCAweDY4MGYsIDB4MDAwMCwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMGRlLAorCTB4MDE1ZSwgMHgwMDA1LCAweDA4MGMsIDB4NTVkYiwgMHhkMGM0LCAweDAxNTAsIDB4ZDBhNCwgMHgwMTQwLAorCTB4OTAwNiwgMHgwMDQ2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJlLCAweDA4MGMsIDB4ZDg4NSwgMHgwMDRlLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDc5LCAweDAxNDAsIDB4NzhjNCwgMHhkMGRjLAorCTB4MDkwNCwgMHgyODZlLCAweDA4MGMsIDB4MmFmNiwgMHgwNjYwLCAweDkwODQsIDB4MDcwMCwgMHg5MDhlLAorCTB4MDYwMCwgMHgxMTIwLCAweDIwMTEsIDB4NDAwMCwgMHg5MDBlLCAweDA0NTgsIDB4OTA4ZSwgMHgwNTAwLAorCTB4MTEyMCwgMHgyMDExLCAweDgwMDAsIDB4OTAwZSwgMHgwNDIwLCAweDkwOGUsIDB4MDQwMCwgMHgxMTIwLAorCTB4OTAxNiwgMHgyMDA5LCAweDAwMDEsIDB4MDBlOCwgMHg5MDhlLCAweDAzMDAsIDB4MTEyMCwgMHg5MDE2LAorCTB4MjAwOSwgMHgwMDAyLCAweDAwYjAsIDB4OTA4ZSwgMHgwMjAwLCAweDExMjAsIDB4OTAxNiwgMHgyMDA5LAorCTB4MDAwNCwgMHgwMDc4LCAweDkwOGUsIDB4MDEwMCwgMHgxNTQ4LCAweDkwMTYsIDB4MjAwOSwgMHgwMDA4LAorCTB4MDA0MCwgMHg5MDg0LCAweDA3MDAsIDB4OTA4ZSwgMHgwMzAwLCAweDE1MDAsIDB4MjAxMSwgMHgwMDMwLAorCTB4MDA1OCwgMHgyMzAwLCAweDkwODAsIDB4MDAyMCwgMHgyMDE4LCAweDA4MGMsIDB4ODRmZiwgMHg5MjhjLAorCTB4ZmYwMCwgMHgwMTEwLCAweDIwMTEsIDB4MDBmZiwgMHgyMjAwLCAweDgwMDcsIDB4OTA4NSwgMHgwMDRjLAorCTB4NzhjMiwgMHgyMDA5LCAweDAxMzgsIDB4MjIwYSwgMHgwODBjLCAweDcyMDcsIDB4MTExOCwgMHgyMDA5LAorCTB4MTk0NSwgMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwMDUsIDB4NzhjMywgMHgwMDAwLAorCTB4MGNjOCwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDAxLAorCTB4MDE3MCwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHg5MTg0LCAweDAwMDMsIDB4MDExMCwgMHgwODBjLAorCTB4MGRmMywgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgwMTcxLAorCTB4MjAwNCwgMHhkMGRjLCAweDAxNjgsIDB4MjAwMSwgMHgwMTcwLCAweDIwMGMsIDB4OTE4YywgMHgwMGZmLAorCTB4OTE4ZSwgMHgwMDRjLCAweDExMjgsIDB4MjAwYywgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgwMDA1LAorCTB4OTAwZSwgMHgyMDAxLCAweDAyMjcsIDB4MjAwNCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDA0LAorCTB4OTEwOCwgMHgyMDAxLCAweDAyMjYsIDB4MjAwNCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDA0LAorCTB4OTEwOCwgMHgwMDA1LCAweDAwMTgsIDB4MDAwYywgMHgwMDE4LCAweDAwMjAsIDB4MTAwMCwgMHgwODAwLAorCTB4MTAwMCwgMHgxODAwLCAweDAxNTYsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBlNiwgMHgyMDAxLAorCTB4MTk2OCwgMHgyMDA0LCAweDkwOGEsIDB4MDAwNywgMHgxYTBjLCAweDBkZmEsIDB4MDAzMywgMHgwMGVlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDE1ZSwgMHgwMDA1LCAweDI4Y2MsIDB4MjhlYSwgMHgyOTBlLAorCTB4MjkxMCwgMHgyOTM5LCAweDI5M2IsIDB4MjkzZCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNzE3LAorCTB4MDgwYywgMHgyYjZhLCAweDIwMDEsIDB4MTk2YSwgMHgyMDAzLCAweDAwMDAsIDB4NzgyOCwgMHg5MDg0LAorCTB4ZTFkNywgMHg3ODJhLCAweDkwMDYsIDB4MjBhOSwgMHgwMDA5LCAweDA4MGMsIDB4MmIxMiwgMHgyMDAxLAorCTB4MTk2OCwgMHgyMDAzLCAweDAwMDYsIDB4MjAwOSwgMHgwMDFlLCAweDIwMTEsIDB4MjkzZSwgMHgwODBjLAorCTB4ODM2YywgMHgwMDA1LCAweDIwMDksIDB4MTk2ZCwgMHgyMDBiLCAweDAwMDAsIDB4MjAwMSwgMHgxOTcyLAorCTB4MjAwMywgMHgwMDM2LCAweDIwMDEsIDB4MTk3MSwgMHgyMDAzLCAweDAwMmEsIDB4MjAwMSwgMHgxOTZhLAorCTB4MjAwMywgMHgwMDAxLCAweDkwMDYsIDB4MDgwYywgMHgyYTliLCAweDIwMDEsIDB4ZmZmZiwgMHgyMGE5LAorCTB4MDAwOSwgMHgwODBjLCAweDJiMTIsIDB4MjAwMSwgMHgxOTY4LCAweDIwMDMsIDB4MDAwNiwgMHgyMDA5LAorCTB4MDAxZSwgMHgyMDExLCAweDI5M2UsIDB4MDgwYywgMHg4MzZjLCAweDAwMDUsIDB4MDgwYywgMHgwZGZhLAorCTB4MjAwMSwgMHgxOTcyLCAweDIwMDMsIDB4MDAzNiwgMHgyMDAxLCAweDE5NmEsIDB4MjAwMywgMHgwMDAzLAorCTB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsIDB4OTI5NiwgMHgwMDA0LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MmE5YiwgMHgyMDAxLCAweDE5NmUsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHhmZmZmLCAweDIwYTksIDB4MDAwOSwgMHgwODBjLCAweDJiMTIsIDB4MjAwMSwgMHgxOTY4LAorCTB4MjAwMywgMHgwMDA2LCAweDIwMDksIDB4MDAxZSwgMHgyMDExLCAweDI5M2UsIDB4MDgwYywgMHg4MzZjLAorCTB4MDAwNSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHgwZGZhLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMGU2LCAweDAwZjYsIDB4MDE1NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LAorCTB4MDEwMCwgMHgyMDAxLCAweDE5NmEsIDB4MjAwNCwgMHg5MDhhLCAweDAwMDcsIDB4MWEwYywgMHgwZGZhLAorCTB4MDA0MywgMHgwMTJlLCAweDAxNWUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgyOTYwLCAweDI5ODAsIDB4MjljMCwgMHgyOWYwLCAweDJhMTQsIDB4MmEyNCwgMHgyYTI2LAorCTB4MDgwYywgMHgyYjA2LCAweDExYjAsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgyMDA5LAorCTB4MTk3MCwgMHgyMTA0LCAweDdhMzgsIDB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNCwgMHgwMTEwLAorCTB4YzA4ZCwgMHgwMDA4LCAweGMwODUsIDB4MjAwYSwgMHgyMDAxLCAweDE5NjgsIDB4MjAwMywgMHgwMDAxLAorCTB4MDAzMCwgMHgwODBjLCAweDJhNGEsIDB4MjAwMSwgMHhmZmZmLCAweDA4MGMsIDB4MjhkYiwgMHgwMDA1LAorCTB4MDgwYywgMHgyYTI4LCAweDA1ZTAsIDB4MjAwOSwgMHgxOTcxLCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLAorCTB4MDgwYywgMHgyYjA2LCAweDExNzgsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHg3YTM4LAorCTB4OTI5NCwgMHgwMDA1LCAweDkyOTYsIDB4MDAwNSwgMHgwNTE4LCAweDIwMDksIDB4MTk3MCwgMHgyMTA0LAorCTB4YzA4NSwgMHgyMDBhLCAweDIwMDksIDB4MTk2ZCwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwgMHg5MDg2LAorCTB4MDAwNSwgMHgwMTE4LCAweDA4MGMsIDB4MmEzMCwgMHgwMGMwLCAweDIwMGIsIDB4MDAwMCwgMHg3YTM4LAorCTB4OTI5NCwgMHgwMDA2LCAweDkyOTYsIDB4MDAwNCwgMHgwMTEwLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDJhYjgsIDB4MjAwMSwgMHgxOTZhLCAweDIwMDMsIDB4MDAwMiwgMHgwMDI4LAorCTB4MjAwMSwgMHgxOTY4LCAweDIwMDMsIDB4MDAwMywgMHgwMDEwLCAweDA4MGMsIDB4MjhmZCwgMHgwMDA1LAorCTB4MDgwYywgMHgyYTI4LCAweDA1NjAsIDB4MjAwOSwgMHgxOTcxLCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLAorCTB4MDgwYywgMHgyYjA2LCAweDExNjgsIDB4Nzg1MCwgMHg5MDg0LCAweGVmZmYsIDB4Nzg1MiwgMHgyMDAxLAorCTB4MTk2OCwgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgxOTY5LCAweDIwMDMsIDB4MDAwMCwgMHgwMGI4LAorCTB4MjAwOSwgMHgxOTcxLCAweDIxMDQsIDB4OTAwNSwgMHgxMTE4LCAweDA4MGMsIDB4MmE2ZCwgMHgwMDEwLAorCTB4MDgwYywgMHgyYTNkLCAweDA4MGMsIDB4MmEzMCwgMHgyMDA5LCAweDE5NmQsIDB4MjAwYiwgMHgwMDAwLAorCTB4MjAwMSwgMHgxOTZhLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDI4ZmQsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDRiOSwgMHgwNTA4LCAweDA4MGMsIDB4MmIwNiwgMHgxMWI4LCAweDc4NTAsIDB4OTA4NCwgMHhlZmZmLAorCTB4Nzg1MiwgMHgyMDA5LCAweDE5NmUsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsIDB4OTA4NiwgMHgwMDA3LAorCTB4MDEwOCwgMHgwMDc4LCAweDIwMDEsIDB4MTk3MywgMHgyMDAzLCAweDAwMGEsIDB4MjAwOSwgMHgxOTcwLAorCTB4MjEwNCwgMHhjMGZkLCAweDIwMGEsIDB4MDAzOCwgMHgwNDE5LCAweDIwMDEsIDB4MTk2YSwgMHgyMDAzLAorCTB4MDAwNCwgMHgwODBjLCAweDI5MjgsIDB4MDAwNSwgMHgwMDk5LCAweDAxNjgsIDB4MDgwYywgMHgyYjA2LAorCTB4MTEzOCwgMHg3ODUwLCAweDkwODQsIDB4ZWZmZiwgMHg3ODUyLCAweDA4MGMsIDB4MjkxNCwgMHgwMDE4LAorCTB4MDA3OSwgMHgwODBjLCAweDI5MjgsIDB4MDAwNSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHgwZGZhLAorCTB4MjAwOSwgMHgxOTcyLCAweDIxMDQsIDB4ODAwMSwgMHgyMDBhLCAweDA5MGMsIDB4MmE4OSwgMHgwMDA1LAorCTB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsIDB4OTI5NiwgMHgwMDA1LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MmFiOCwgMHgwMDA1LCAweDdhMzgsIDB4OTI5NCwgMHgwMDA2LAorCTB4OTI5NiwgMHgwMDA2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MmE5YiwgMHgwMDA1LCAweDIwMDksIDB4MTk2ZCwgMHgyMTA0LCAweDgwMDAsIDB4MjAwYSwgMHg5MDg2LAorCTB4MDAwNSwgMHgwMTA4LCAweDAwNjgsIDB4MjAwYiwgMHgwMDAwLCAweDdhMzgsIDB4OTI5NCwgMHgwMDA2LAorCTB4OTI5NiwgMHgwMDA2LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMSwgMHgwNGQ5LAorCTB4N2EzOCwgMHg5Mjk0LCAweDAwMDUsIDB4OTI5NiwgMHgwMDA1LCAweDAxMTAsIDB4OTAwNiwgMHgwMDEwLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MmFiOCwgMHgwMDA1LCAweDAwODYsIDB4MjAwMSwgMHgxOTcwLAorCTB4MjAwNCwgMHg5MDg0LCAweDdmZmYsIDB4MDkwYywgMHgwZGZhLCAweDIwMDksIDB4MTk2ZiwgMHgyMTQ0LAorCTB4ODg0NiwgMHgyODBhLCAweDk4NDQsIDB4MGRkOCwgMHhkMDhjLCAweDExMjAsIDB4ZDA4NCwgMHgxMTIwLAorCTB4MDgwYywgMHgwZGZhLCAweDkwMDYsIDB4MDAxMCwgMHgyMDAxLCAweDAwMDEsIDB4MDBhMSwgMHgwMDhlLAorCTB4MDAwNSwgMHgwMDA2LCAweDAxNTYsIDB4MjAwMSwgMHgxOTY4LCAweDIwYTksIDB4MDAwOSwgMHgyMDAzLAorCTB4MDAwMCwgMHg4MDAwLCAweDFmMDQsIDB4MmE4ZiwgMHgyMDAxLCAweDE5NmYsIDB4MjAwMywgMHg4MDAwLAorCTB4MDE1ZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4OTA4NSwgMHgwMDAwLAorCTB4MDE1OCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmOSwgMHg5MDg1LCAweDAwMDQsIDB4NzgzYSwgMHgyMDA5LAorCTB4MTk3NSwgMHgyMTBjLCAweDc5NWEsIDB4MDA1MCwgMHg3ODM4LCAweDkwODQsIDB4ZmZmYiwgMHg5MDg1LAorCTB4MDAwNiwgMHg3ODNhLCAweDIwMDksIDB4MTk3NiwgMHgyMTBjLCAweDc5NWEsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4OTA4NSwgMHgwMDAwLCAweDAxODgsIDB4NzgzOCwgMHg5MDg0LAorCTB4ZmZmYSwgMHg5MDg1LCAweDAwMDQsIDB4NzgzYSwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwYSwgMHgxMTIwLCAweDc4NTAsIDB4OTA4NCwgMHhmZmYwLCAweDc4NTIsIDB4MDQyOCwgMHg3ODM4LAorCTB4OTA4NCwgMHhmZmZiLCAweDkwODUsIDB4MDAwNSwgMHg3ODNhLCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LAorCTB4OTA4NiwgMHgwMDBhLCAweDExYzgsIDB4Nzg1MCwgMHg5MDg0LCAweGZmZjAsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDE3ZiwgMHgyMTBjLCAweDkxOGUsIDB4MDAwNSwgMHgwMTQwLCAweDIwMDksIDB4MDAwMywgMHgyMTBjLAorCTB4OTE4YywgMHgwNjAwLCAweDkxOGUsIDB4MDQwMCwgMHgwMTE4LCAweDkwODUsIDB4MDAwYSwgMHgwMDEwLAorCTB4OTA4NSwgMHgwMDAwLCAweDAwMWUsIDB4Nzg1MiwgMHgwMGZlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4MDEwMCwgMHgyMDA0LCAweDkwODIsIDB4MDAwNywgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4MDEwMCwgMHgyMDA0LCAweDkwODIsIDB4MDAwOSwgMHgwMDBlLCAweDAwMDUsIDB4MDE1NiwgMHgyMGE5LAorCTB4MDA2NCwgMHg3ODIwLCAweDA4MGMsIDB4MmJiMCwgMHhkMDljLCAweDExMTAsIDB4MWYwNCwgMHgyYjA5LAorCTB4MDE1ZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAxNiwgMHgwMDA2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLAorCTB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwMTcwLCAweDc4NTAsIDB4OTA4NSwgMHgwMDQwLAorCTB4Nzg1MiwgMHg3ODUwLCAweDkwODQsIDB4ZmJjZiwgMHg3ODUyLCAweDA4MGMsIDB4MmJiMCwgMHg5MDg1LAorCTB4MjAwMCwgMHg3ODUyLCAweDAwMjAsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4MmNmNSwgMHgwMDBlLAorCTB4MjAwOCwgMHg5MTg2LCAweDAwMDAsIDB4MTExOCwgMHg3ODNiLCAweDAwMDcsIDB4MDA5MCwgMHg5MTg2LAorCTB4MDAwMSwgMHgxMTE4LCAweDc4M2IsIDB4MDAwNiwgMHgwMDYwLCAweDkxODYsIDB4MDAwMiwgMHgxMTE4LAorCTB4NzgzYiwgMHgwMDA1LCAweDAwMzAsIDB4OTE4NiwgMHgwMDAzLCAweDExMTgsIDB4NzgzYiwgMHgwMDA0LAorCTB4MDAwMCwgMHgwMDA2LCAweDFkMDQsIDB4MmI0YSwgMHgwODBjLCAweDgzOGUsIDB4MWYwNCwgMHgyYjRhLAorCTB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDAxNjAsIDB4Nzg1MCwgMHg5MDg1LAorCTB4MDQwMCwgMHg5MDg0LCAweGRmYmYsIDB4Nzg1MiwgMHgwODBjLCAweDJiYjAsIDB4OTA4NSwgMHgxMDAwLAorCTB4Nzg1MiwgMHgwMDIwLCAweDc4NTAsIDB4OTA4NSwgMHgxMDAwLCAweDc4NTIsIDB4MDAwZSwgMHgwMDFlLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MDEwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwYSwgMHgwMTI4LAorCTB4Nzg1MCwgMHg5MDg0LCAweGZmY2YsIDB4Nzg1MiwgMHgwMDEwLCAweDA4MGMsIDB4MmNmNSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMTU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwYTksIDB4MDAwYSwgMHg3ODU0LAorCTB4ZDBhYywgMHgxMTMwLCAweDc4MjAsIDB4ZDBlNCwgMHgxMTQwLCAweDFmMDQsIDB4MmI4MiwgMHgwMDI4LAorCTB4Nzg1NCwgMHhkMDhjLCAweDExMTAsIDB4MWYwNCwgMHgyYjg4LCAweDAwZmUsIDB4MDE1ZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgxZDA0LCAweDJiOTEsIDB4MDgwYywgMHg4MzhlLCAweDFmMDQsIDB4MmI5MSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE5NzQsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE5NzQsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE5NzQsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDIsIDB4MDAwZSwgMHgwMDA1LAorCTB4YTAwMSwgMHhhMDAxLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4MTk4MCwgMHgyMTAyLCAweDAwMGUsIDB4MDAwNSwgMHgyMDA5LCAweDAxNzEsIDB4MjEwNCwgMHhkMGRjLAorCTB4MDE0MCwgMHgyMDA5LCAweDAxNzAsIDB4MjEwNCwgMHgyMDBiLCAweDAwODAsIDB4YTAwMSwgMHhhMDAxLAorCTB4MjAwYSwgMHgwMDA1LCAweDAwMzYsIDB4MDA0NiwgMHgyMDAxLCAweDAxNDEsIDB4MjAwYywgMHg5MThjLAorCTB4ZmYwMCwgMHg5MTg2LCAweDIxMDAsIDB4MDE0MCwgMHg5MTg2LCAweDIwMDAsIDB4MDE3MCwgMHg5MTg2LAorCTB4MDEwMCwgMHgxOTA0LCAweDJjMjksIDB4MDA0OCwgMHgwMDE2LCAweDIwMDksIDB4MWE1YSwgMHgyMTA0LAorCTB4ODAwMCwgMHgwMjA4LCAweDIwMGEsIDB4MDAxZSwgMHgwNGYwLCAweDIwMDksIDB4MDBhMiwgMHgwODBjLAorCTB4MGU3NSwgMHgyMDE5LCAweDAxNjAsIDB4MjMyNCwgMHgyMDExLCAweDAwMDMsIDB4MjAwOSwgMHgwMTY5LAorCTB4MjEwNCwgMHg5MDg0LCAweDAwMDcsIDB4MjEwYywgMHg5MThjLCAweDAwMDcsIDB4OTEwZSwgMHgxZGIwLAorCTB4OTA4NiwgMHgwMDAzLCAweDE1NDgsIDB4MjMwNCwgMHgwMDY2LCAweDAwNzYsIDB4MjAzMSwgMHgwMDAyLAorCTB4MjMzYywgMHg5NzNlLCAweDAxNDgsIDB4ODYzMSwgMHgxZGQ4LCAweDIwMzEsIDB4MWE1YiwgMHgyNjNjLAorCTB4ODczOCwgMHgwMjA4LCAweDI3MzIsIDB4MjMwNCwgMHgwMDdlLCAweDAwNmUsIDB4OTQwMiwgMHgwMmEwLAorCTB4MTlkMCwgMHg4MjExLCAweDE5ZDgsIDB4ODRmZiwgMHgwMTcwLCAweDIwMDEsIDB4MDE0MSwgMHgyMDBjLAorCTB4OTE4YywgMHhmZjAwLCAweDkxODYsIDB4MDEwMCwgMHgwMTMwLCAweDIwMDksIDB4MTgwYywgMHgyMTA0LAorCTB4YzBkZCwgMHgyMDBhLCAweDAwMDgsIDB4MDQyMSwgMHgyMDAxLCAweDE5NTksIDB4MjAwYywgMHgwODBjLAorCTB4MGU3NSwgMHgwMDRlLCAweDAwM2UsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMGRjLAorCTB4MDFiMCwgMHgyMDAxLCAweDAxNjAsIDB4MjAwNCwgMHg5MDA1LCAweDAxNDAsIDB4MjAwMSwgMHgwMTQxLAorCTB4MjAwNCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgwMTAwLCAweDExNDgsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDE2LCAweDAwMjYsIDB4MDAyMSwgMHgwMDJlLCAweDAwMWUsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAxNCwgMHgwMDA2LCAweDIwMDEsIDB4MDE2MSwgMHgyMDAzLAorCTB4MDAwMCwgMHg2MDE3LCAweDAwMTgsIDB4YTAwMSwgMHhhMDAxLCAweDYwMmYsIDB4MDAwOCwgMHg2MTA0LAorCTB4OTE4ZSwgMHgwMDEwLCAweDYxMDYsIDB4OTE4ZSwgMHgwMDEwLCAweDYxMDYsIDB4NjAxNywgMHgwMDQwLAorCTB4MDRiOSwgMHgwMDFlLCAweDkxODQsIDB4MDAwMywgMHgwMWUwLCAweDAwMzYsIDB4MDAxNiwgMHgyMDE5LAorCTB4MDE0MSwgMHg2MTI0LCAweDkxOGMsIDB4MDAyOCwgMHgxMTIwLCAweDIzMDQsIDB4OTA4NCwgMHgyODAwLAorCTB4MGRjMCwgMHgwMDFlLCAweDkxOWMsIDB4ZmZlNCwgMHg5MTg0LCAweDAwMDEsIDB4MDExOCwgMHg5Mzg1LAorCTB4MDAwOSwgMHg2MDE2LCAweDkxODQsIDB4MDAwMiwgMHgwMTE4LCAweDkzODUsIDB4MDAxMiwgMHg2MDE2LAorCTB4MDAzZSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWRjLCAweDIxMDIsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4NzIyMSwgMHgwMTA4LCAweGMwYmMsIDB4MjAwOSwgMHgwMTQwLAorCTB4MjExNCwgMHg5Mjk0LCAweDAwMDEsIDB4OTIxNSwgMHgyMjBhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMDI2LCAweDIwMDksIDB4MDE0MCwgMHgyMTE0LCAweDkyOTQsIDB4MDAwMSwgMHg5Mjg1LAorCTB4MTAwMCwgMHgyMDBhLCAweDIyMGEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MjAwOSwgMHgwMTQwLCAweDIxMTQsIDB4OTI5NCwgMHgwMDAxLCAweDkyMTUsIDB4MjIwYSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgyMDA5LCAweDAxNDAsIDB4MjEwNCwgMHgxMTI4LAorCTB4MDgwYywgMHg3MjIxLCAweDAxMTAsIDB4YzBiYywgMHgwMDA4LCAweGMwYmQsIDB4MjAwYSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjA1MCwgMHg5MDg0LCAweGZiZmYsIDB4OTA4NSwgMHgwMDQwLCAweDYwNTIsIDB4MjBhOSwgMHgwMDAyLAorCTB4MDgwYywgMHgyYjkxLCAweDYwNTAsIDB4OTA4NSwgMHgwNDAwLCAweDkwODQsIDB4ZmY5ZiwgMHg2MDUyLAorCTB4MjBhOSwgMHgwMDA1LCAweDA4MGMsIDB4MmI5MSwgMHg2MDU0LCAweGQwYmMsIDB4MDkwYywgMHgwZGZhLAorCTB4MjBhOSwgMHgwMDA1LCAweDA4MGMsIDB4MmI5MSwgMHg2MDU0LCAweGQwYWMsIDB4MDkwYywgMHgwZGZhLAorCTB4MjAwOSwgMHgxOTg3LCAweDkwODQsIDB4N2UwMCwgMHg4MDA3LCAweDgwMDQsIDB4ODAwNCwgMHgyMDBhLAorCTB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBjNiwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDUwLCAweGMwY2QsIDB4NjA1MiwgMHgwMGNlLCAweDAwMGUsIDB4MDAwNSwgMHgyZjZiLAorCTB4MmY2YiwgMHgyZDhmLCAweDJkOGYsIDB4MmQ5YiwgMHgyZDliLCAweDJkYTcsIDB4MmRhNywgMHgyZGI1LAorCTB4MmRiNSwgMHgyZGMxLCAweDJkYzEsIDB4MmRjZiwgMHgyZGNmLCAweDJkZGQsIDB4MmRkZCwgMHgyZGVmLAorCTB4MmRlZiwgMHgyZGZiLCAweDJkZmIsIDB4MmUwOSwgMHgyZTA5LCAweDJlMjcsIDB4MmUyNywgMHgyZTQ3LAorCTB4MmU0NywgMHgyZTE3LCAweDJlMTcsIDB4MmUzNywgMHgyZTM3LCAweDJlNTUsIDB4MmU1NSwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZTY3LAorCTB4MmU2NywgMHgyZTczLCAweDJlNzMsIDB4MmU4MSwgMHgyZTgxLCAweDJlOGYsIDB4MmU4ZiwgMHgyZTlmLAorCTB4MmU5ZiwgMHgyZWFkLCAweDJlYWQsIDB4MmViZCwgMHgyZWJkLCAweDJlY2QsIDB4MmVjZCwgMHgyZWRmLAorCTB4MmVkZiwgMHgyZWVkLCAweDJlZWQsIDB4MmVmZCwgMHgyZWZkLCAweDJmMWYsIDB4MmYxZiwgMHgyZjQxLAorCTB4MmY0MSwgMHgyZjBkLCAweDJmMGQsIDB4MmYzMCwgMHgyZjMwLCAweDJmNTAsIDB4MmY1MCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLAorCTB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgyZGVkLCAweDJkZWQsIDB4MmRlZCwgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MjNjNiwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyMWNkLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDIzYzYsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjIwOCwgMHgwODA0LAorCTB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgwODBjLCAweDIzYzYsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjFjZCwgMHgwODBjLAorCTB4MjNjNiwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwgMHgyZjYzLCAweGEwMDEsIDB4MGNmMCwgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MTM3MCwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyM2M2LCAweDA4MGMsIDB4MTM3MCwgMHgwODA0LAorCTB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywgMHgxMzcwLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MjNjNiwgMHgwODBjLCAweDEzNzAsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDIzYzYsIDB4MDgwYywgMHgxMzcwLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDEzNzAsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4MTM3MCwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4MjFjZCwgMHgwODBjLAorCTB4MjNjNiwgMHgwODBjLCAweDEzNzAsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4Mjg3MSwgMHgwODA0LCAweDJmNjMsIDB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsIDB4MDgwYywgMHgyODcxLCAweDA4MGMsIDB4MjNjNiwgMHgwODA0LAorCTB4MmY2MywgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywgMHgyMWNkLCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4Mjg3MSwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywgMHgyM2M2LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4Mjg3MSwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLAorCTB4MjNjNiwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDIyMDgsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDIzYzYsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4Mjg3MSwgMHgwODBjLCAweDEzNzAsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLAorCTB4MjNjNiwgMHgwODBjLCAweDEzNzAsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLAorCTB4MjFjZCwgMHgwODBjLCAweDEzNzAsIDB4MDgwNCwgMHgyZjYzLCAweDAxMDYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDA4MGMsIDB4Mjg3MSwgMHgwODBjLAorCTB4MjNjNiwgMHgwODBjLCAweDEzNzAsIDB4MDgwYywgMHgyMjA4LCAweDA4MDQsIDB4MmY2MywgMHgwMTA2LAorCTB4MDAwNiwgMHgwMTI2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgwODBjLAorCTB4Mjg3MSwgMHgwODBjLCAweDIxY2QsIDB4MDgwYywgMHgyM2M2LCAweDA4MGMsIDB4MTM3MCwgMHgwNDk4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyODcxLCAweDA4MGMsIDB4MjFjZCwgMHgwODBjLCAweDEzNzAsIDB4MDgwYywgMHgyMjA4LAorCTB4MDQxMCwgMHgwMTA2LCAweDAwMDYsIDB4MDEyNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEzNiwgMHgwMTQ2LAorCTB4MDE1NiwgMHgwODBjLCAweDI4NzEsIDB4MDgwYywgMHgxMzcwLCAweDA4MGMsIDB4MjIwOCwgMHgwMDk4LAorCTB4MDEwNiwgMHgwMDA2LCAweDAxMjYsIDB4MDFjNiwgMHgwMWQ2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LAorCTB4MDgwYywgMHgyODcxLCAweDA4MGMsIDB4MjFjZCwgMHgwODBjLCAweDIzYzYsIDB4MDgwYywgMHgxMzcwLAorCTB4MDgwYywgMHgyMjA4LCAweDAwMDAsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLAorCTB4MDEyZSwgMHgwMDBlLCAweDAxMGUsIDB4MDAwZCwgMHgwMGI2LCAweDAwYzYsIDB4MDAyNiwgMHgwMDQ2LAorCTB4OTAyNiwgMHgwODBjLCAweDY3ODEsIDB4MTkwNCwgMHgzMDcyLCAweDcyZDgsIDB4MjAwMSwgMHgxOTU0LAorCTB4MjAwNCwgMHg5MDA1LCAweDExMTAsIDB4ZDI5YywgMHgwMTQ4LCAweGQyODQsIDB4MTEzOCwgMHhkMmJjLAorCTB4MTkwNCwgMHgzMDcyLCAweDA4MGMsIDB4MzA3NywgMHgwODA0LCAweDMwNzIsIDB4ZDJjYywgMHgxOTA0LAorCTB4MzA3MiwgMHgwODBjLCAweDcyMDcsIDB4MTEyMCwgMHg3MGFiLCAweGZmZmYsIDB4MDgwNCwgMHgzMDcyLAorCTB4ZDI5NCwgMHgwMTIwLCAweDcwYWIsIDB4ZmZmZiwgMHgwODA0LCAweDMwNzIsIDB4MDgwYywgMHgzMmRmLAorCTB4MDE2MCwgMHgwODBjLCAweGM1MzksIDB4MDEyOCwgMHgyMDAxLCAweDE4MTcsIDB4MjAzYywgMHgwODA0LAorCTB4MzAwNCwgMHg3MGFiLCAweGZmZmYsIDB4MDgwNCwgMHgzMDcyLCAweDIwMDEsIDB4MTgxNywgMHgyMDNjLAorCTB4NzI5MCwgMHhkMjg0LCAweDA5MDQsIDB4MzAwNCwgMHhkMjhjLCAweDE5MDQsIDB4MzAwNCwgMHgwMDM2LAorCTB4NzNhOCwgMHg5MzhlLCAweGZmZmYsIDB4MTExMCwgMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHg5MmUwLAorCTB4MWM4MCwgMHgyYzA0LCAweDkzOGMsIDB4MDAwMSwgMHgwMTIwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4MDAxMCwgMHg5MDg0LCAweDAwZmYsIDB4OTcwZSwgMHgwNWE4LCAweDkwOGUsIDB4MDAwMCwgMHgwNTkwLAorCTB4OTA4ZSwgMHgwMGZmLCAweDExNTAsIDB4NzIzMCwgMHhkMjg0LCAweDE1ODgsIDB4NzI5MCwgMHhjMjhkLAorCTB4NzI5MiwgMHg3MGFiLCAweGZmZmYsIDB4MDAzZSwgMHgwNDc4LCAweDAwMjYsIDB4MjAxMSwgMHgwMDEwLAorCTB4MDgwYywgMHg2N2U3LCAweDAwMmUsIDB4MDExOCwgMHg3MGFiLCAweGZmZmYsIDB4MDQxMCwgMHg5MDBlLAorCTB4MDgwYywgMHgyNzZlLCAweDA4MGMsIDB4NjQzZiwgMHgxMWMwLCAweDA4MGMsIDB4NjdjMywgMHgxMTY4LAorCTB4NzAzMCwgMHhkMDhjLCAweDAxMzAsIDB4YjgwMCwgMHhkMGJjLCAweDAxMzgsIDB4MDgwYywgMHg2NmJmLAorCTB4MDEyMCwgMHgwODBjLCAweDMwOTAsIDB4MDE0OCwgMHgwMDI4LCAweDA4MGMsIDB4MzFkMCwgMHgwODBjLAorCTB4MzBiYywgMHgwMTE4LCAweDgzMTgsIDB4MDgwNCwgMHgyZmI2LCAweDczYWEsIDB4MDAxMCwgMHg3MGFiLAorCTB4ZmZmZiwgMHgwMDNlLCAweDA4MDQsIDB4MzA3MiwgMHg5NzgwLCAweDMyZTksIDB4MjAzZCwgMHg5N2JjLAorCTB4ZmYwMCwgMHg4NzNmLCAweDIwNDEsIDB4MDA3ZSwgMHg3MGE4LCAweDkwOTYsIDB4ZmZmZiwgMHgxMTE4LAorCTB4OTAwZSwgMHgyOGE4LCAweDAwNTAsIDB4OTgxMiwgMHgwMjIwLCAweDIwMDgsIDB4OTgwMiwgMHgyMGE4LAorCTB4MDAyMCwgMHg3MGFiLCAweGZmZmYsIDB4MDgwNCwgMHgzMDcyLCAweDI3MDAsIDB4MDE1NiwgMHgwMDE2LAorCTB4OTEwNiwgMHgwOTA0LCAweDMwNjcsIDB4MDAyNiwgMHgyMDExLCAweDAwMTAsIDB4MDgwYywgMHg2N2U3LAorCTB4MDAyZSwgMHgwMTIwLCAweDIwMDksIDB4ZmZmZiwgMHgwODA0LCAweDMwNmYsIDB4YzQ4NCwgMHgwODBjLAorCTB4NjQ5ZiwgMHgwMTM4LCAweDA4MGMsIDB4YzUzOSwgMHgxNTkwLCAweDA4MGMsIDB4NjQzZiwgMHgxNWI4LAorCTB4MDAwOCwgMHhjNDg1LCAweDA4MGMsIDB4NjdjMywgMHgxMTMwLCAweDcwMzAsIDB4ZDA4YywgMHgwMWY4LAorCTB4YjgwMCwgMHhkMGJjLCAweDExZTAsIDB4NzI5MCwgMHhkMjhjLCAweDAxODAsIDB4MDgwYywgMHg2N2MzLAorCTB4OTA4MiwgMHgwMDA2LCAweDAyZTAsIDB4ZDQ4NCwgMHgxMTE4LCAweDA4MGMsIDB4NjQ2MywgMHgwMDI4LAorCTB4MDgwYywgMHgzMjViLCAweDAxYTAsIDB4MDgwYywgMHgzMjg2LCAweDAwODgsIDB4MDgwYywgMHgzMWQwLAorCTB4MDgwYywgMHhjNTM5LCAweDExNjAsIDB4MDgwYywgMHgzMGJjLCAweDAxODgsIDB4MDA0MCwgMHgwODBjLAorCTB4YzUzOSwgMHgxMTE4LCAweDA4MGMsIDB4MzI1YiwgMHgwMTEwLCAweDA0NTEsIDB4MDE0MCwgMHgwMDFlLAorCTB4ODEwOCwgMHgwMTVlLCAweDFmMDQsIDB4MzAxZCwgMHg3MGFiLCAweGZmZmYsIDB4MDAxOCwgMHgwMDFlLAorCTB4MDE1ZSwgMHg3MWFhLCAweDAwNGUsIDB4MDAyZSwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDAxNiwgMHg3MGFiLCAweDAwMDEsIDB4MjAwOSwgMHgwMDdlLCAweDA4MGMsIDB4NjQzZiwgMHgxMTY4LAorCTB4YjgxMywgMHgwMGZmLCAweGI4MTcsIDB4ZmZmZSwgMHgwODBjLCAweDMxZDAsIDB4MDRhOSwgMHgwMTI4LAorCTB4NzBkOCwgMHhjMGJkLCAweDcwZGEsIDB4MDgwYywgMHhjMjhhLCAweDAwMWUsIDB4MDBjZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwgMHgyMDAxLCAweDE4NjAsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDBmZiwgMHhiODQyLCAweDA4MGMsIDB4YTEzMCwgMHgwMWQwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLAorCTB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MjAwMSwgMHgwMDAwLAorCTB4MDgwYywgMHg2M2YwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwYTQsIDB4ODAwMCwgMHg3MGE2LAorCTB4MDEyZSwgMHgyMDA5LCAweDAwMDQsIDB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MjAwMSwgMHgxODYwLCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLCAweGI4NDIsIDB4MDgwYywgMHhhMTMwLAorCTB4MDU0OCwgMHgyYjAwLCAweDYwMTIsIDB4YjgwMCwgMHhjMGM0LCAweGI4MDIsIDB4YjhhMCwgMHg5MDg2LAorCTB4MDA3ZSwgMHgwMTQwLCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgxMTEwLAorCTB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4OTAwNiwgMHgwODBjLAorCTB4NjNkYywgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzBhNCwgMHg4MDAwLCAweDcwYTYsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHhhMTVkLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMDI2LCAweDIwMDksIDB4MDA4MCwgMHgwODBjLCAweDY0M2YsIDB4MTE0MCwgMHhiODEzLAorCTB4MDBmZiwgMHhiODE3LCAweGZmZmMsIDB4MDAzOSwgMHgwMTEwLCAweDcwZGYsIDB4ZmZmZiwgMHgwMDJlLAorCTB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDc2LCAweDAwZDYsIDB4MDBjNiwgMHgwODBjLAorCTB4YTA4ZCwgMHgwMWQwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAxLAorCTB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NjNmMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwZTAsIDB4ODAwMCwgMHg3MGUyLCAweDAxMmUsIDB4MjAwOSwgMHgwMDAyLAorCTB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwgMHgwMGNlLCAweDAwZGUsIDB4MDA3ZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwOSwgMHgwMDdmLAorCTB4MDgwYywgMHg2NDNmLCAweDExYjgsIDB4YjgxMywgMHgwMGZmLCAweGI4MTcsIDB4ZmZmZCwgMHhiOGJmLAorCTB4MDAwNCwgMHgwODBjLCAweGEwOGQsIDB4MDE3MCwgMHgyYjAwLCAweDYwMTIsIDB4NjMxNiwgMHg2MDIzLAorCTB4MDAwMSwgMHg2MjBhLCAweDA4MGMsIDB4YzJiMywgMHgyMDA5LCAweDAwMjIsIDB4MDgwYywgMHhhMTVkLAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LAorCTB4MDA2NiwgMHgwMDM2LCAweDAwMjYsIDB4MDBiNiwgMHgyMWYwLCAweDA4MGMsIDB4ODgwZSwgMHgwODBjLAorCTB4ODc5OCwgMHgwODBjLCAweDlmMzYsIDB4MDgwYywgMHhiMDNhLCAweDNlMDgsIDB4MjEzMCwgMHg4MWZmLAorCTB4MDEyMCwgMHgyMGE5LCAweDAwN2UsIDB4OTAwZSwgMHgwMDE4LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLAorCTB4MDAxNiwgMHgwODBjLCAweDY0OWYsIDB4MTE0MCwgMHg5Njg2LCAweDAwMDIsIDB4MTExOCwgMHhiODAwLAorCTB4ZDBiYywgMHgxMTEwLCAweDA4MGMsIDB4NWY0NSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHgzMTcwLAorCTB4OTY4NiwgMHgwMDAxLCAweDE5MGMsIDB4MzJiMywgMHgwMGJlLCAweDAwMmUsIDB4MDAzZSwgMHgwMDZlLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwNDYsIDB4MDAzNiwgMHgwMDI2LAorCTB4MDAxNiwgMHgwMGI2LCAweDYyMTAsIDB4MjI1OCwgMHhiYWEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4ODZmMSwgMHgyYzA4LAorCTB4MDgwYywgMHhkNWY2LCAweDAwN2UsIDB4MDAxZSwgMHhiYTEwLCAweGJiMTQsIDB4YmNiMCwgMHgwODBjLAorCTB4NWY0NSwgMHhiYTEyLCAweGJiMTYsIDB4YmNiMiwgMHgwMGJlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDA0ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MDBiNiwgMHg2MDEwLAorCTB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4OTA4NiwgMHgwMDgwLCAweDAxNTAsIDB4MjA3MSwgMHgxODAwLAorCTB4NzBhNCwgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwgMHg3MGE2LCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjA3MSwgMHgxODAwLCAweDcwZTAsIDB4OTAwNSwgMHgwZGMwLCAweDgwMDEsIDB4NzBlMiwgMHgwY2E4LAorCTB4YjgwMCwgMHhjMDhjLCAweGI4MDIsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMGI2LAorCTB4MDA0NiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHgwMTU2LCAweDIxNzgsIDB4ODFmZiwgMHgxMTE4LAorCTB4MjBhOSwgMHgwMDAxLCAweDAwNzAsIDB4MDgwYywgMHg1NWRiLCAweGQwYzQsIDB4MDEzOCwgMHgwMDMwLAorCTB4OTAwNiwgMHgyMDIwLCAweDIwMDksIDB4MDAyZCwgMHgwODBjLCAweGQ4ODUsIDB4MjBhOSwgMHgwODAwLAorCTB4OTAxNiwgMHgwMDI2LCAweDkyOGUsIDB4MDA3ZSwgMHgwOTA0LCAweDMyM2EsIDB4OTI4ZSwgMHgwMDdmLAorCTB4MDkwNCwgMHgzMjNhLCAweDkyOGUsIDB4MDA4MCwgMHgwNWU4LCAweDkyODgsIDB4MTAwMCwgMHgyMTBjLAorCTB4ODFmZiwgMHgwNWMwLCAweDhmZmYsIDB4MTE0OCwgMHgyMDAxLCAweDE5NjYsIDB4MDAwNiwgMHgyMDAzLAorCTB4MDAwMSwgMHgwNGYxLCAweDAwMGUsIDB4MjAwMywgMHgwMDAwLCAweDAwYjYsIDB4MDBjNiwgMHgyMTU4LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4Njc4ZCwgMHgwMGNlLCAweDAwYmUsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4ODZmMSwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMDI2LCAweDIxNTgsIDB4YmEwNCwgMHg5Mjk0LCAweDAwZmYsIDB4OTI4NiwgMHgwMDA2LAorCTB4MTExOCwgMHhiODA3LCAweDA0MDQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMDQsIDB4ODAwNywgMHg5MjE1LAorCTB4YmEwNiwgMHgwMDJlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDE2LCAweDJjMDgsIDB4MDgwYywgMHhkNWY2LAorCTB4MDAxZSwgMHgwMDdlLCAweDAwMmUsIDB4ODIxMCwgMHgxZjA0LCAweDMxZjEsIDB4MDE1ZSwgMHgwMDFlLAorCTB4MDAyZSwgMHgwMDNlLCAweDAwNGUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDA0NiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywgMHg1NWRiLCAweGQwYzQsIDB4MDE0MCwgMHhkMGE0LAorCTB4MDEzMCwgMHg5MDA2LCAweDIyMjAsIDB4MjAwOSwgMHgwMDI5LCAweDA4MGMsIDB4ZDg4NSwgMHgwMDFlLAorCTB4MDAyZSwgMHgwMDRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHg3MjkwLAorCTB4ODJmZiwgMHgwMWU4LCAweDA4MGMsIDB4NjdiYiwgMHgxMWQwLCAweDIxMDAsIDB4MDgwYywgMHgyN2ExLAorCTB4ODFmZiwgMHgwMWI4LCAweDIwMTksIDB4MDAwMSwgMHg4MzE0LCAweDkyZTAsIDB4MWM4MCwgMHgyYzA0LAorCTB4ZDM4NCwgMHgwMTIwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDAwMTAsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTExNiwgMHgwMTM4LCAweDkwOTYsIDB4MDBmZiwgMHgwMTEwLCAweDgzMTgsIDB4MGM2OCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMjksIDB4MDBhOSwgMHgwMDNlLAorCTB4OTE4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA2NSwgMHgwMTU4LCAweDAwMTYsIDB4MDBjNiwgMHgyMDYxLAorCTB4MWE4YSwgMHgwMDFlLCAweDYxMTIsIDB4MDgwYywgMHgzMThiLCAweDAwMWUsIDB4MDgwYywgMHg2NDYzLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MjExMCwgMHgwODBjLAorCTB4OWJjOSwgMHgwODBjLCAweGRiM2QsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MjAwMSwgMHgxODM2LAorCTB4MjAwNCwgMHhkMGNjLCAweDAwMDUsIDB4MDBjNiwgMHgwMGI2LCAweDA4MGMsIDB4NzIwNywgMHgxMTE4LAorCTB4MjBhOSwgMHgwODAwLCAweDAwMTAsIDB4MjBhOSwgMHgwNzgyLCAweDA4MGMsIDB4NzIwNywgMHgxMTEwLAorCTB4OTAwZSwgMHgwMDEwLCAweDIwMDksIDB4MDA3ZSwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLAorCTB4MDEzMCwgMHg4NmZmLCAweDAxMTAsIDB4YjgwMCwgMHhkMGJjLCAweDA5MGMsIDB4NjQ2MywgMHg4MTA4LAorCTB4MWYwNCwgMHgzMmM0LCAweDIwNjEsIDB4MTgwMCwgMHg2MDdiLCAweDAwMDAsIDB4NjA3YywgMHg5MDg0LAorCTB4MDBmZiwgMHg2MDdlLCAweDYwYWYsIDB4MDAwMCwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTg3ZCwgMHgyMDA0LCAweGQwYmMsIDB4MDAwNSwgMHgyMDExLCAweDE4NWMsIDB4MjIxNCwgMHhkMmVjLAorCTB4MDAwNSwgMHg3ZWVmLCAweDdkZTgsIDB4N2NlNCwgMHg4MGUyLCAweDdiZTEsIDB4ODBlMCwgMHg4MGRjLAorCTB4ODBkYSwgMHg3YWQ5LCAweDgwZDYsIDB4ODBkNSwgMHg4MGQ0LCAweDgwZDMsIDB4ODBkMiwgMHg4MGQxLAorCTB4NzljZSwgMHg3OGNkLCAweDgwY2MsIDB4ODBjYiwgMHg4MGNhLCAweDgwYzksIDB4ODBjNywgMHg4MGM2LAorCTB4NzdjNSwgMHg3NmMzLCAweDgwYmMsIDB4ODBiYSwgMHg3NWI5LCAweDgwYjYsIDB4NzRiNSwgMHg3M2I0LAorCTB4NzJiMywgMHg4MGIyLCAweDgwYjEsIDB4ODBhZSwgMHg3MWFkLCAweDgwYWMsIDB4NzBhYiwgMHg2ZmFhLAorCTB4NmVhOSwgMHg4MGE3LCAweDZkYTYsIDB4NmNhNSwgMHg2YmEzLCAweDZhOWYsIDB4Njk5ZSwgMHg2ODlkLAorCTB4ODA5YiwgMHg4MDk4LCAweDY3OTcsIDB4NjY5MCwgMHg2NThmLCAweDY0ODgsIDB4NjM4NCwgMHg2MjgyLAorCTB4ODA4MSwgMHg4MDgwLCAweDYxN2MsIDB4NjA3YSwgMHg4MDc5LCAweDVmNzYsIDB4ODA3NSwgMHg4MDc0LAorCTB4ODA3MywgMHg4MDcyLCAweDgwNzEsIDB4ODA2ZSwgMHg1ZTZkLCAweDgwNmMsIDB4NWQ2YiwgMHg1YzZhLAorCTB4NWI2OSwgMHg4MDY3LCAweDVhNjYsIDB4NTk2NSwgMHg1ODYzLCAweDU3NWMsIDB4NTY1YSwgMHg1NTU5LAorCTB4ODA1NiwgMHg4MDU1LCAweDU0NTQsIDB4NTM1MywgMHg1MjUyLCAweDUxNTEsIDB4NTA0ZSwgMHg0ZjRkLAorCTB4ODA0YywgMHg4MDRiLCAweDRlNGEsIDB4NGQ0OSwgMHg4MDQ3LCAweDRjNDYsIDB4ODA0NSwgMHg4MDQzLAorCTB4ODAzYywgMHg4MDNhLCAweDgwMzksIDB4ODAzNiwgMHg0YjM1LCAweDgwMzQsIDB4NGEzMywgMHg0OTMyLAorCTB4NDgzMSwgMHg4MDJlLCAweDQ3MmQsIDB4NDYyYywgMHg0NTJiLCAweDQ0MmEsIDB4NDMyOSwgMHg0MjI3LAorCTB4ODAyNiwgMHg4MDI1LCAweDQxMjMsIDB4NDAxZiwgMHgzZjFlLCAweDNlMWQsIDB4M2QxYiwgMHgzYzE4LAorCTB4ODAxNywgMHg4MDEwLCAweDNiMGYsIDB4M2EwOCwgMHg4MDA0LCAweDM5MDIsIDB4ODAwMSwgMHg4MDAwLAorCTB4ODAwMCwgMHgzODAwLCAweDM3MDAsIDB4MzYwMCwgMHg4MDAwLCAweDM1MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgzNDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MzMwMCwgMHgzMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MzEwMCwgMHgzMDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyZjAwLCAweDgwMDAsIDB4MmUwMCwgMHgyZDAwLAorCTB4MmMwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyYjAwLCAweDgwMDAsIDB4MmEwMCwgMHgyOTAwLAorCTB4MjgwMCwgMHg4MDAwLCAweDI3MDAsIDB4MjYwMCwgMHgyNTAwLCAweDI0MDAsIDB4MjMwMCwgMHgyMjAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDIxMDAsIDB4MjAwMCwgMHgxZjAwLCAweDFlMDAsIDB4MWQwMCwgMHgxYzAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDFiMDAsIDB4MWEwMCwgMHg4MDAwLCAweDE5MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgxODAwLCAweDgwMDAsIDB4MTcwMCwgMHgxNjAwLAorCTB4MTUwMCwgMHg4MDAwLCAweDE0MDAsIDB4MTMwMCwgMHgxMjAwLCAweDExMDAsIDB4MTAwMCwgMHgwZjAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDBlMDAsIDB4MGQwMCwgMHgwYzAwLCAweDBiMDAsIDB4MGEwMCwgMHgwOTAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDA4MDAsIDB4MDcwMCwgMHg4MDAwLCAweDA2MDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgwNTAwLCAweDA0MDAsIDB4MDMwMCwgMHg4MDAwLCAweDAyMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgwMTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4MDAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorCTB4ODAwMCwgMHgyMDcxLCAweDE4OWMsIDB4NzAwMywgMHgwMDAyLCAweDkwMDYsIDB4NzAxNiwgMHg3MDFhLAorCTB4NzA0YSwgMHg3MDRlLCAweDcwMGUsIDB4NzA0MiwgMHg3MDQ2LCAweDcwM2IsIDB4MThiOCwgMHg3MDNmLAorCTB4MThiOCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwYywgMHgxMDRhLCAweDA5MGMsIDB4MGRmYSwgMHgyOTAwLAorCTB4NzA2YSwgMHhhODY3LCAweDAwMDIsIDB4YThhYiwgMHhkY2IwLCAweDA4MGMsIDB4MTA0YSwgMHgwOTBjLAorCTB4MGRmYSwgMHgyOTAwLCAweDcwNmUsIDB4YTg2NywgMHgwMDAyLCAweGE4YWIsIDB4ZGNiMCwgMHgwMDA1LAorCTB4MjA3MSwgMHgxODljLCAweDcwMDQsIDB4MDAwMiwgMHgzNDE4LCAweDM0MTksIDB4MzQyYywgMHgzNDQwLAorCTB4MDAwNSwgMHgxMDA0LCAweDM0MjksIDB4MGUwNCwgMHgzNDI5LCAweDIwNzksIDB4MDAwMCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDcwMGMsIDB4OTAwNSwgMHgxMTI4LCAweDcwMGYsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDQ2OCwgMHgwMDA1LCAweDAxMmUsIDB4MGNlOCwgMHgyMDc5LCAweDAwMDAsIDB4MjA2MSwgMHgxOGI2LAorCTB4MmM0YywgMHhhODZjLCAweDkwOGUsIDB4MDEwMCwgMHgwMTI4LCAweDkwODYsIDB4MDIwMCwgMHgwOTA0LAorCTB4MzUxNCwgMHgwMDA1LCAweDcwMTgsIDB4MjA0OCwgMHgyMDYxLCAweDE4MDAsIDB4NzAxYywgMHgwODA3LAorCTB4NzAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA5NCwgMHgwMGZmLCAweDkyOTYsIDB4MDAyOSwgMHgxMTIwLAorCTB4YWE3OCwgMHhkMmZjLCAweDAxMjgsIDB4MDAwNSwgMHg5MDg2LCAweDAxMDMsIDB4MDEwOCwgMHgwMDA1LAorCTB4MjA3OSwgMHgwMDAwLCAweDIwNjEsIDB4MTgwMCwgMHg3MDFjLCAweDA4MDcsIDB4MjA2MSwgMHgxODAwLAorCTB4Nzg4MCwgMHg5MDhhLCAweDAwNDAsIDB4MTIxMCwgMHg2MWNjLCAweDAwNDIsIDB4MjEwMCwgMHg5MDhhLAorCTB4MDAzZiwgMHgxYTA0LCAweDM1MTEsIDB4NjFjYywgMHgwODA0LCAweDM0YTYsIDB4MzRlOCwgMHgzNTIwLAorCTB4MzUxMSwgMHgzNTJhLCAweDM1MzQsIDB4MzUzYSwgMHgzNTNlLCAweDM1NGUsIDB4MzU1MiwgMHgzNTY4LAorCTB4MzU2ZSwgMHgzNTc0LCAweDM1N2YsIDB4MzU4YSwgMHgzNTk5LCAweDM1YTgsIDB4MzViNiwgMHgzNWNkLAorCTB4MzVlOCwgMHgzNTExLCAweDM2OTEsIDB4MzZjZiwgMHgzNzc1LCAweDM3ODYsIDB4MzdhOSwgMHgzNTExLAorCTB4MzUxMSwgMHgzNTExLCAweDM3ZTEsIDB4MzdmZCwgMHgzODA2LCAweDM4MzUsIDB4MzgzYiwgMHgzNTExLAorCTB4Mzg4MSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4Mzg4YywgMHgzODk1LAorCTB4Mzg5ZCwgMHgzODlmLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLAorCTB4MzhjYiwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzhlOCwgMHgzOTVjLAorCTB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MDAwMiwgMHgzOTg2LAorCTB4Mzk4OSwgMHgzOWU4LCAweDNhMDEsIDB4M2EzMSwgMHgzY2NmLCAweDM1MTEsIDB4NTE5ZiwgMHgzNTExLAorCTB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTExLCAweDM1MTEsIDB4MzUxMSwgMHgzNTY4LAorCTB4MzU2ZSwgMHg0MjQ5LCAweDU1ZmYsIDB4NDI1ZiwgMHg1MjJlLCAweDUyN2YsIDB4NTM4YSwgMHgzNTExLAorCTB4NTNlYywgMHg1NDI4LCAweDU0NTksIDB4NTU2MSwgMHg1NDg2LCAweDU0ZTEsIDB4MzUxMSwgMHg0MjYzLAorCTB4NDQwOCwgMHg0NDFlLCAweDQ0NDMsIDB4NDRhOCwgMHg0NTFjLCAweDQ1M2MsIDB4NDViMywgMHg0NjBmLAorCTB4NDY2YiwgMHg0NjZlLCAweDQ2OTMsIDB4NDc0MSwgMHg0N2E3LCAweDQ3YWYsIDB4NDhlMSwgMHg0YTQ5LAorCTB4NGE3ZCwgMHg0Y2M3LCAweDM1MTEsIDB4NGNlNSwgMHg0ZGEyLCAweDRlNzgsIDB4MzUxMSwgMHgzNTExLAorCTB4MzUxMSwgMHgzNTExLCAweDRlZGUsIDB4NGVmOSwgMHg0N2FmLCAweDUxM2YsIDB4NzE0YywgMHgwMDAwLAorCTB4MjAyMSwgMHg0MDAwLCAweDA4MGMsIDB4NGFmYiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LAorCTB4MzRmMiwgMHgwMDEwLCAweDAxMmUsIDB4MGNjMCwgMHg3YzM2LCAweDk0ODYsIDB4NDAwMCwgMHgwMTE4LAorCTB4NzgzMywgMHgwMDExLCAweDAwMTAsIDB4NzgzMywgMHgwMDEwLCAweDdjODIsIDB4Nzk4NiwgMHg3YThhLAorCTB4N2I4ZSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLAorCTB4MTFlMCwgMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDcwMGYsIDB4MDAwMCwgMHgwMTJlLAorCTB4MDAwNSwgMHgyMDIxLCAweDQwMDEsIDB4MDhiMCwgMHgyMDIxLCAweDQwMDIsIDB4MDg5OCwgMHgyMDIxLAorCTB4NDAwMywgMHgwODgwLCAweDIwMjEsIDB4NDAwNSwgMHgwODY4LCAweDIwMjEsIDB4NDAwNiwgMHgwODUwLAorCTB4MjAzOSwgMHgwMDAxLCAweDkwMmUsIDB4MjUyMCwgMHg3Yjg4LCAweDdhOGMsIDB4Nzg4NCwgMHg3OTkwLAorCTB4MDgwNCwgMHg0YjA4LCAweDIwMzksIDB4MDAwMSwgMHg5MDJlLCAweDI1MjAsIDB4N2I4OCwgMHg3YThjLAorCTB4Nzg4NCwgMHg3OTkwLCAweDA4MDQsIDB4NGIwYiwgMHg3OTg0LCAweDc4ODgsIDB4MjExNCwgMHgyMDBhLAorCTB4MDgwNCwgMHgzNGU4LCAweDc5ODQsIDB4MjExNCwgMHgwODA0LCAweDM0ZTgsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjA5OSwgMHgwMDIxLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAwMjEsIDB4MjBhOSwgMHgwMDFmLAorCTB4NDAwMywgMHg3OTg0LCAweDdhODgsIDB4N2I4YywgMHgwODA0LCAweDM0ZTgsIDB4Nzg4NCwgMHgyMDYwLAorCTB4MDgwNCwgMHgzNTliLCAweDIwMDksIDB4MDAwMywgMHgyMDExLCAweDAwMDMsIDB4MjAxOSwgMHgwMDA4LAorCTB4Nzg5YiwgMHgwMzE3LCAweDc4OTMsIDB4ZmZmZiwgMHgyMDAxLCAweDE4OGQsIDB4MjAwNCwgMHg5MDA1LAorCTB4MDExOCwgMHg3ODk2LCAweDA4MDQsIDB4MzRlOCwgMHg3ODk3LCAweDAwMDEsIDB4MDgwNCwgMHgzNGU4LAorCTB4MjAzOSwgMHgwMDAxLCAweDdkOTgsIDB4N2M5YywgMHgwODA0LCAweDM1MjQsIDB4MjAzOSwgMHgwMDAxLAorCTB4N2Q5OCwgMHg3YzljLCAweDA4MDQsIDB4MzUyZSwgMHg3OWEwLCAweDkxODIsIDB4MDA0MCwgMHgwMjEwLAorCTB4MDgwNCwgMHgzNTFkLCAweDIxMzgsIDB4N2Q5OCwgMHg3YzljLCAweDA4MDQsIDB4MzUyNCwgMHg3OWEwLAorCTB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwgMHgzNTFkLCAweDIxMzgsIDB4N2Q5OCwgMHg3YzljLAorCTB4MDgwNCwgMHgzNTJlLCAweDc5YTAsIDB4OTE4MiwgMHgwMDQwLCAweDAyMTAsIDB4MDgwNCwgMHgzNTFkLAorCTB4MjFlOCwgMHg3OTg0LCAweDc4ODgsIDB4MjBhOSwgMHgwMDAxLCAweDIxYTAsIDB4NDAwNCwgMHgwODA0LAorCTB4MzRlOCwgMHgyMDYxLCAweDA4MDAsIDB4ZTEwYywgMHg5MDA2LCAweDJjMTUsIDB4OTIwMCwgMHg4YzYwLAorCTB4ODEwOSwgMHgxZGQ4LCAweDIwMTAsIDB4OTAwNSwgMHgwOTA0LCAweDM0ZTgsIDB4MDgwNCwgMHgzNTE3LAorCTB4NzlhMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIxMCwgMHgwODA0LCAweDM1MWQsIDB4MjFlMCwgMHgyMGE5LAorCTB4MDAwMSwgMHg3OTg0LCAweDIxOTgsIDB4NDAxMiwgMHgwODA0LCAweDM0ZTgsIDB4MjA2OSwgMHgxODViLAorCTB4Nzg4NCwgMHg3OTkwLCAweDkxMWEsIDB4MWEwNCwgMHgzNTFkLCAweDgwMTksIDB4MDkwNCwgMHgzNTFkLAorCTB4Njg0YSwgMHg2OTQyLCAweDc4OGMsIDB4Njg1MiwgMHg3ODg4LCAweDY4NTYsIDB4OTAwNiwgMHg2ODVhLAorCTB4Njg1ZSwgMHgwODBjLCAweDc1MzUsIDB4MDgwNCwgMHgzNGU4LCAweDIwNjksIDB4MTg1YiwgMHg3ODg0LAorCTB4Nzk5NCwgMHg5MTFhLCAweDFhMDQsIDB4MzUxZCwgMHg4MDE5LCAweDA5MDQsIDB4MzUxZCwgMHg2ODRlLAorCTB4Njk0NiwgMHg3ODhjLCAweDY4NjIsIDB4Nzg4OCwgMHg2ODY2LCAweDkwMDYsIDB4Njg2YSwgMHg2ODZlLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2OGMxLCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LAorCTB4OTAyZSwgMHgyNTIwLCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNTFhLAorCTB4Nzk4NCwgMHg3Yjg4LCAweDdhOGMsIDB4MjBhOSwgMHgwMDA1LCAweDIwZTksIDB4MDAwMSwgMHgyMGExLAorCTB4MThhNCwgMHg0MTAxLCAweDA4MGMsIDB4NGFiZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MzUxYSwgMHgyMDA5LCAweDAwMjAsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODBjLAorCTB4NGIwOCwgMHg3MDFmLCAweDM2MGMsIDB4MDAwNSwgMHhhODY0LCAweDIwMDgsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA5NiwgMHgwMDExLCAweDAxNjgsIDB4OTA5NiwgMHgwMDE5LCAweDAxNTAsIDB4OTA5NiwgMHgwMDE1LAorCTB4MDEzOCwgMHg5MDk2LCAweDAwNDgsIDB4MDEyMCwgMHg5MDk2LCAweDAwMjksIDB4MTkwNCwgMHgzNTFhLAorCTB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4MDkwNCwgMHgzNTFhLCAweDcxMTIsIDB4NzAxMCwgMHg4MDAxLAorCTB4MDU2MCwgMHg3MDEyLCAweDA4MGMsIDB4NGFiZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4MzUxYSwgMHgyMDA5LCAweDAwMjAsIDB4NzA2OCwgMHgyMDQwLCAweGEyOGMsIDB4YTM5MCwgMHhhNDk0LAorCTB4YTU5OCwgMHg5MjkwLCAweDAwNDAsIDB4OTM5OSwgMHgwMDAwLCAweDk0YTEsIDB4MDAwMCwgMHg5NWE5LAorCTB4MDAwMCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHhhZjYwLCAweDA4MGMsIDB4NGIwOCwgMHg3MDFmLAorCTB4MzY0YSwgMHgwMDA1LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAwMiwgMHgwMTIwLAorCTB4OTA5NiwgMHgwMDBhLCAweDE5MDQsIDB4MzUxYSwgMHgwODg4LCAweDcwMTQsIDB4MjA0OCwgMHhhODY4LAorCTB4YzBmZCwgMHhhODZhLCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOTYsIDB4MDAyOSwgMHgxMTYwLAorCTB4YzJmZCwgMHhhYTdhLCAweDA4MGMsIDB4NjAzNywgMHgwMTUwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4YTg3YSwgMHhhOTgyLCAweDAxMmUsIDB4MDA1MCwgMHgwODBjLCAweDYzNTUsIDB4MTEyOCwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFmLCAweDM2NzYsIDB4MDAwNSwgMHgwODBjLCAweDZkMTcsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMGE5LCAweDAwMDUsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MThhNCwgMHg0MDBhLAorCTB4MjEwMCwgMHg5MjEwLCAweDkzOTksIDB4MDAwMCwgMHg5NGExLCAweDAwMDAsIDB4OTVhOSwgMHgwMDAwLAorCTB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjAwOSwgMHgwMDIwLCAweDAxMmUsIDB4YWY2MCwgMHgwODA0LAorCTB4NGIwYiwgMHgyMDkxLCAweDgwMDAsIDB4NzgzNywgMHg0MDAwLCAweDc4MzMsIDB4MDAxMCwgMHg3ODgzLAorCTB4NDAwMCwgMHg3ODg3LCAweDQ5NTMsIDB4Nzg4YiwgMHg1MDIwLCAweDc4OGYsIDB4MjAyMCwgMHgyMDA5LAorCTB4MDE3ZiwgMHgyMTA0LCAweDc4OTIsIDB4M2YwMCwgMHg3ODk2LCAweDIwNjEsIDB4MDEwMCwgMHg2MjAwLAorCTB4MjA2MSwgMHgwMjAwLCAweDYwM2MsIDB4ODAwNywgMHg5MjA1LCAweDc4OWEsIDB4MjAwOSwgMHgwNGZkLAorCTB4MjEwNCwgMHg3ODllLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LAorCTB4MjAwNCwgMHhkMDg0LCAweDAxODAsIDB4MjAwMSwgMHgxOWYxLCAweDIwMDQsIDB4OTAwNSwgMHgwMTI4LAorCTB4MjAwMSwgMHgwMDhiLCAweDIwMDQsIDB4ZDBmYywgMHgwZGQ4LCAweDIwMDEsIDB4MDA4YSwgMHgyMDAzLAorCTB4MDAwMiwgMHgyMDAzLCAweDEwMDEsIDB4MjA3MSwgMHgwMDgwLCAweDA4MDQsIDB4MDQyNywgMHg4MWZmLAorCTB4MTkwNCwgMHgzNTFhLCAweDc5ODQsIDB4MDgwYywgMHg2NDlmLCAweDE5MDQsIDB4MzUxZCwgMHg3ZTk4LAorCTB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgxYTA0LCAweDM1MWQsIDB4N2M4OCwgMHg3ZDhjLAorCTB4MDgwYywgMHg2NjAyLCAweDA4MGMsIDB4NjVkMSwgMHgwMDAwLCAweDE1MTgsIDB4MjA2MSwgMHgxY2QwLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDE0LAorCTB4OTA0ZCwgMHgwMTMwLCAweGE4NmMsIDB4OTQwNiwgMHgxMTE4LCAweGE4NzAsIDB4OTUwNiwgMHgwMTUwLAorCTB4MDEyZSwgMHg5Y2UwLCAweDAwMTgsIDB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwgMHgxYTA0LAorCTB4MzUxYSwgMHgwYzMwLCAweDA4MGMsIDB4YmE1NiwgMHgwMTJlLCAweDA5MDQsIDB4MzUxYSwgMHgwODA0LAorCTB4MzRlOCwgMHg5MDBlLCAweDIwMDEsIDB4MDAwNSwgMHgwODBjLCAweDZkMTcsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweGMxMzMsIDB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LAorCTB4MDBhNiwgMHgyOTUwLCAweGIxOTgsIDB4MDgwYywgMHg2NDlmLCAweDE5MDQsIDB4Mzc2MiwgMHhiNmE0LAorCTB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgxNmU4LCAweGI0OWMsIDB4YjVhMCwgMHgwODBjLAorCTB4NjYwMiwgMHgwODBjLCAweDY1ZDEsIDB4MTUyMCwgMHgyMDYxLCAweDFjZDAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDYwMTQsIDB4OTA0ZCwgMHgwMTMwLAorCTB4YTg2YywgMHg5NDA2LCAweDExMTgsIDB4YTg3MCwgMHg5NTA2LCAweDAxNTgsIDB4MDEyZSwgMHg5Y2UwLAorCTB4MDAxOCwgMHgyMDAxLCAweDE4MTksIDB4MjAwNCwgMHg5YzAyLCAweDIwMDksIDB4MDAwZCwgMHgxMmIwLAorCTB4MGMyOCwgMHgwODBjLCAweGJhNTYsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDMsIDB4MDE3OCwgMHgwMGUwLAorCTB4OTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2ZDE3LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhjMTMzLCAweDA4MGMsIDB4NmFkYywgMHgwMTJlLCAweDAwNzAsIDB4YjA5NywgMHg0MDA1LAorCTB4YjE5YSwgMHgwMDEwLCAweGIwOTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAzMCwgMHgyYTQ4LCAweDAwYWUsIDB4MDAwNSwgMHhiMDk3LCAweDQwMDAsIDB4OTAwNiwgMHg5MThkLAorCTB4MDAwMSwgMHgyMDA4LCAweDJhNDgsIDB4MDBhZSwgMHgwMDA1LCAweDgxZmYsIDB4MTkwNCwgMHgzNTFhLAorCTB4MDgwYywgMHg0YWQ2LCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY1NjYsIDB4MDkwNCwgMHgzNTFhLAorCTB4MDgwYywgMHg2NjA4LCAweDA5MDQsIDB4MzUxYSwgMHgwODA0LCAweDQ1MzMsIDB4ODFmZiwgMHgxOTA0LAorCTB4MzUxYSwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NjY5NiwgMHgwOTA0LAorCTB4MzUxYSwgMHgyMDE5LCAweDAwMDUsIDB4NzlhOCwgMHgwODBjLCAweDY2MjMsIDB4MDkwNCwgMHgzNTFhLAorCTB4Nzg4OCwgMHg5MDhhLCAweDEwMDAsIDB4MWEwNCwgMHgzNTFkLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLAorCTB4OTEwOCwgMHgwODBjLCAweDgyZTgsIDB4Nzk4NCwgMHhkMTg0LCAweDE5MDQsIDB4MzRlOCwgMHgwODA0LAorCTB4NDUzMywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAxMTgsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDQ1MCwgMHgyMDI5LCAweDA3ZmYsIDB4NjQ1OCwgMHgyNDAwLCAweDk1MDYsIDB4MDFmOCwgMHgyNTA4LAorCTB4MDgwYywgMHg2NDlmLCAweDExZDgsIDB4MDgwYywgMHg2Njk2LCAweDExMjgsIDB4MjAwOSwgMHgwMDAyLAorCTB4NjJiYywgMHgyNTE4LCAweDAwYzAsIDB4MjAxOSwgMHgwMDA0LCAweDkwMGUsIDB4MDgwYywgMHg2NjIzLAorCTB4MTExOCwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHg3ODg0LCAweDkwOGEsIDB4MTAwMCwgMHgxMjcwLAorCTB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4OTEwOCwgMHgwODBjLCAweDgyZTgsIDB4ODUyOSwgMHgxYWUwLAorCTB4MDEyZSwgMHgwODA0LCAweDM0ZTgsIDB4MDEyZSwgMHgwODA0LCAweDM1MWEsIDB4MDEyZSwgMHgwODA0LAorCTB4MzUxZCwgMHgwODBjLCAweDRhZDYsIDB4MDkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NjU2NiwgMHgwOTA0LAorCTB4MzUxYSwgMHhiYWEwLCAweDIwMTksIDB4MDAwNSwgMHgwMGM2LCAweDkwNjYsIDB4MDgwYywgMHg4ODAzLAorCTB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4ODZmMSwgMHg5MDBlLCAweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLAorCTB4MDBjZSwgMHgwODBjLCAweDY2MDIsIDB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4NGFkNiwgMHgwOTA0LAorCTB4MzUxZCwgMHgwODBjLCAweDY2MDIsIDB4MjIwOCwgMHgwODA0LCAweDM0ZTgsIDB4MDE1NiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDY5LCAweDE5MGUsIDB4NjgxMCwgMHg2OTE0LCAweDkxMGEsIDB4MTIwOCwgMHg5MDBlLAorCTB4NjgxNiwgMHg5MDE2LCAweDkwMWUsIDB4MjBhOSwgMHgwMDdlLCAweDIwNjksIDB4MTAwMCwgMHgyZDA0LAorCTB4OTA1ZCwgMHgwMTE4LCAweGI4NGMsIDB4MDA1OSwgMHg5MjEwLCAweDhkNjgsIDB4MWYwNCwgMHgzODE3LAorCTB4MjMwMCwgMHg5MjE4LCAweDAwZWUsIDB4MDBkZSwgMHgwMTVlLCAweDA4MDQsIDB4MzRlOCwgMHgwMGY2LAorCTB4MDAxNiwgMHg5MDdkLCAweDAxMzgsIDB4OTAwNiwgMHg4MDAwLCAweDJmMGMsIDB4ODFmZiwgMHgwMTEwLAorCTB4MjE3OCwgMHgwY2QwLCAweDAwMWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwNjksIDB4MTkwZSwgMHg2OTEwLAorCTB4NjJiOCwgMHgwODA0LCAweDM0ZTgsIDB4ODFmZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwMSwgMHgwODA0LAorCTB4MzUxYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDU1ZWYsIDB4MDEyOCwgMHgyMDA5LAorCTB4MDAwNywgMHgwMTJlLCAweDA4MDQsIDB4MzUxYSwgMHgwMTJlLCAweDYxNTgsIDB4OTE5MCwgMHgzMmU5LAorCTB4MjIxNSwgMHg5Mjk0LCAweDAwZmYsIDB4NjM3OCwgMHg4M2ZmLCAweDAxMDgsIDB4NjI3YywgMHg2N2Q4LAorCTB4OTdjNCwgMHgwMDBhLCAweDk4YzYsIDB4MDAwYSwgMHgxMTE4LCAweDIwMzEsIDB4MDAwMSwgMHgwMGU4LAorCTB4OTdjNCwgMHgwMDIyLCAweDk4YzYsIDB4MDAyMiwgMHgxMTE4LCAweDIwMzEsIDB4MDAwMywgMHgwMGE4LAorCTB4OTdjNCwgMHgwMDEyLCAweDk4YzYsIDB4MDAxMiwgMHgxMTE4LCAweDIwMzEsIDB4MDAwMiwgMHgwMDY4LAorCTB4MDgwYywgMHg3MjA3LCAweDExMTgsIDB4MjAzMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDc5YywgMHgwMTIwLAorCTB4MjAwOSwgMHgwMDA1LCAweDA4MDQsIDB4MzUxYSwgMHg5MDM2LCAweDdlOWEsIDB4N2Y5ZSwgMHgwODA0LAorCTB4MzRlOCwgMHg2MTQ4LCAweDYyNGMsIDB4MjAxOSwgMHgxOTVlLCAweDIzMWMsIDB4MjAwMSwgMHgxOTVmLAorCTB4MjAwNCwgMHg3ODlhLCAweDA4MDQsIDB4MzRlOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MTM4LAorCTB4NjIzYywgMHg2MzQwLCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4NGFmMiwgMHgwOTA0LAorCTB4MzUxZCwgMHhiYTQ0LCAweGJiMzgsIDB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLAorCTB4NGFmMiwgMHgyMTEwLCAweDA5MDQsIDB4MzUxZCwgMHhiODA0LCAweDkwOGMsIDB4MDBmZiwgMHg5MThlLAorCTB4MDAwNiwgMHgwMTQwLCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDA2MDAsIDB4MjAwOSwgMHgwMDA5LAorCTB4MTkwNCwgMHgzNTFhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMTksIDB4MDAwNSwgMHgwMGM2LAorCTB4OTA2NiwgMHgwODBjLCAweDliYzksIDB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLAorCTB4ODZmMSwgMHg5MDBlLCAweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLCAweDAwY2UsIDB4YjgwNywgMHgwNDA3LAorCTB4MDEyZSwgMHgwODA0LCAweDM0ZTgsIDB4NjE0OCwgMHg2MjRjLCAweDc4ODQsIDB4NjA0YSwgMHg3Yjg4LAorCTB4NjM0ZSwgMHgyMDY5LCAweDE4NWIsIDB4ODMxZiwgMHg5MzA1LCAweDY4MTYsIDB4Nzg4YywgMHgyMDY5LAorCTB4MTk1ZSwgMHgyZDFjLCAweDIwNmEsIDB4N2U5OCwgMHg5NjgyLCAweDAwMTQsIDB4MTIxMCwgMHgyMDMxLAorCTB4MDdkMCwgMHgyMDY5LCAweDE5NWYsIDB4MmQwNCwgMHgyNjZhLCAweDc4OWEsIDB4MDgwNCwgMHgzNGU4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjEzOCwgMHg3ODg0LCAweDYwM2EsIDB4OTEwZSwgMHhkMWI0LAorCTB4MTkwYywgMHgwZWUxLCAweGQwYzQsIDB4MDFhOCwgMHgwMGQ2LCAweDc4YTgsIDB4MjAwOSwgMHgxOTc1LAorCTB4MjAwYSwgMHg3OGFjLCAweDIwMTEsIDB4MTk3NiwgMHgyMDEyLCAweDIwNjksIDB4MDEwMCwgMHg2ODM4LAorCTB4OTA4NiwgMHgwMDA3LCAweDExMTgsIDB4MjIxNCwgMHg2YTVhLCAweDAwMTAsIDB4MjEwYywgMHg2OTVhLAorCTB4MDBkZSwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MDE2OCwgMHgyMDExLAorCTB4MDExNCwgMHgyMjBjLCAweDc4ODgsIDB4ZDA4YywgMHgwMTE4LCAweDkxOGQsIDB4MDA4MCwgMHgwMDEwLAorCTB4OTE4YywgMHhmZjdmLCAweDIxMTIsIDB4MDA2MCwgMHgyMDExLCAweDAxMTYsIDB4MjIwYywgMHg3ODg4LAorCTB4ZDA4YywgMHgwMTE4LCAweDkxOGQsIDB4MDA0MCwgMHgwMDEwLCAweDkxOGMsIDB4ZmY3ZiwgMHgyMTEyLAorCTB4NjAzYywgMHg3OTg4LCAweDYxM2UsIDB4NjE0MCwgMHg5MTBkLCAweDc4OGMsIDB4NjA0MiwgMHg3YTg4LAorCTB4OTI5NCwgMHgxMDAwLCAweDkyMDUsIDB4OTEwZSwgMHhkMWU0LCAweDE5MGMsIDB4MGVmNywgMHg2MDQwLAorCTB4ZDBjYywgMHgwMTIwLCAweDc4YjAsIDB4MjAxMSwgMHgwMTE0LCAweDIwMTIsIDB4MDEyZSwgMHgwODA0LAorCTB4MzRlOCwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3YTM4LCAweGE4OTgsIDB4OTA4NCwgMHhmZWJmLAorCTB4OTIxNSwgMHhhODljLCAweDkwODQsIDB4ZmViZiwgMHg4MDAyLCAweDkyMTQsIDB4NzgzOCwgMHg5MDg0LAorCTB4MDE0MCwgMHg5MjE1LCAweDdhM2EsIDB4YTg5NywgMHg0MDAwLCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHg3ODk4LCAweDkwMDUsIDB4MDFhOCwgMHg3ODg4LAorCTB4OTAyNSwgMHgwOTA0LCAweDM1MWQsIDB4Nzg4YywgMHg5MDJkLCAweDA5MDQsIDB4MzUxZCwgMHg5MDBlLAorCTB4MDgwYywgMHg2NDlmLCAweDExMjAsIDB4YmE0NCwgMHhiYjM4LCAweGJjNDYsIDB4YmQzYSwgMHg5MTg2LAorCTB4MDdmZiwgMHgwMTkwLCAweDgxMDgsIDB4MGNhMCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwgMHgzNTFkLAorCTB4Nzg4OCwgMHg5MDBkLCAweDA5MDQsIDB4MzUxZCwgMHg3ODhjLCAweDkwMDUsIDB4MDkwNCwgMHgzNTFkLAorCTB4YmE0NCwgMHhiOTQ2LCAweGJiMzgsIDB4YjgzYSwgMHgwODA0LCAweDM0ZTgsIDB4MjAxMSwgMHhiYzA5LAorCTB4MDAxMCwgMHgyMDExLCAweGJjMDUsIDB4MDgwYywgMHg1NWVmLCAweDE5MDQsIDB4MzUxYSwgMHgwMGM2LAorCTB4MjA2MSwgMHgwMTAwLCAweDc5ODQsIDB4OTE4NiwgMHgwMGZmLCAweDExMzAsIDB4MjAwMSwgMHgxODE3LAorCTB4MjAwNCwgMHg5MDg1LCAweGZmMDAsIDB4MDA4OCwgMHg5MTgyLCAweDAwN2YsIDB4MTZlMCwgMHg5MTg4LAorCTB4MzJlOSwgMHgyMTBkLCAweDkxOGMsIDB4MDBmZiwgMHgyMDAxLCAweDE4MTcsIDB4MjAwNCwgMHgwMDI2LAorCTB4OTExNiwgMHgwMDJlLCAweDA1ODAsIDB4ODEwZiwgMHg5MTA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDAwNiwgMHgwODBjLCAweGEwOGQsIDB4MDAwZSwgMHgwNTEwLCAweDYwMmUsIDB4NjIwYSwgMHg3OTg0LAorCTB4MDBiNiwgMHgwODBjLCAweDY0NDUsIDB4MmIwOCwgMHgwMGJlLCAweDE1MDAsIDB4NjExMiwgMHg2MDIzLAorCTB4MDAwMSwgMHgwODBjLCAweDRhYmYsIDB4MDFkMCwgMHg5MDA2LCAweGE4NjYsIDB4NzAwNywgMHgwMDAzLAorCTB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHg3MDFmLCAweDM5ZTEsIDB4MjkwMCwgMHg2MDE2LAorCTB4MjAwOSwgMHgwMDMyLCAweDA4MGMsIDB4YTE1ZCwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMTJlLAorCTB4MDBjZSwgMHgwODA0LCAweDM1MWEsIDB4MDBjZSwgMHgwODA0LCAweDM1MWQsIDB4MDgwYywgMHhhMGUzLAorCTB4MGNiMCwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgwOTA0LCAweDM1MWEsIDB4MDgwNCwgMHgzNGU4LAorCTB4MjA2MSwgMHgxYTQ4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsIDB4ZDA4NCwgMHgwMTcwLAorCTB4NjEwNCwgMHg2MjA4LCAweDIwNjEsIDB4MTgwMCwgMHg2MzUwLCAweDYwNzAsIDB4Nzg5YSwgMHg2MGJjLAorCTB4Nzg5ZSwgMHg2MGI4LCAweDc4YWEsIDB4MDEyZSwgMHgwODA0LCAweDM0ZTgsIDB4OTAwZSwgMHgyMTEwLAorCTB4MGM4OCwgMHg4MWZmLCAweDE5MDQsIDB4MzUxYSwgMHgwODBjLCAweDcyMDcsIDB4MDkwNCwgMHgzNTFhLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjI1MCwgMHg2MDcwLCAweDkyMDIsIDB4MDI0OCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwODBjLCAweDI3ZDcsIDB4MDgwYywgMHg1ODBlLCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LAorCTB4MDEyZSwgMHgwODA0LCAweDM1MWQsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDAxLAorCTB4MTk4MSwgMHgyMDcwLCAweDIwNjEsIDB4MTg1YiwgMHg2MDA4LCAweDIwNzIsIDB4OTAwZSwgMHgyMDExLAorCTB4MTQwMCwgMHgwODBjLCAweDg0ZmYsIDB4NzIwNiwgMHgwMGVlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAxMjgsIDB4MDEyZSwgMHgyMDIxLAorCTB4NDAwYiwgMHgwODA0LCAweDM0ZWEsIDB4Nzg4NCwgMHhkMGZjLCAweDAxNDgsIDB4MjAwMSwgMHgwMDJhLAorCTB4MjAwNCwgMHg5MDgyLCAweDAwZTEsIDB4MDI4OCwgMHgwMTJlLCAweDA4MDQsIDB4MzUxZCwgMHgyMDAxLAorCTB4MDAyYSwgMHgyMDA0LCAweDIwNjksIDB4MTg1YiwgMHg2OTA4LCAweDkxMDIsIDB4MTIzMCwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNTFkLCAweDAxMmUsIDB4MDgwNCwgMHgzNTFhLCAweDA4MGMsIDB4YTA2MiwgMHgwZGQwLAorCTB4Nzg4NCwgMHhkMGZjLCAweDA5MDQsIDB4M2FhYywgMHgwMGM2LCAweDA4MGMsIDB4NGFiZiwgMHgwMGNlLAorCTB4MGQ4OCwgMHhhODY3LCAweDAwMDAsIDB4Nzg4NCwgMHhhODBhLCAweDc4OTgsIDB4YTgwZSwgMHg3ODljLAorCTB4YTgxMiwgMHgyMDAxLCAweDAwMmUsIDB4MjAwNCwgMHhhODFhLCAweDIwMDEsIDB4MDAyZiwgMHgyMDA0LAorCTB4YTgxZSwgMHgyMDAxLCAweDAwMzAsIDB4MjAwNCwgMHhhODIyLCAweDIwMDEsIDB4MDAzMSwgMHgyMDA0LAorCTB4YTgyNiwgMHgyMDAxLCAweDAwMzQsIDB4MjAwNCwgMHhhODJhLCAweDIwMDEsIDB4MDAzNSwgMHgyMDA0LAorCTB4YTgyZSwgMHgyMDAxLCAweDAwMmEsIDB4MjAwNCwgMHg5MDgwLCAweDAwMDMsIDB4OTA4NCwgMHgwMGZjLAorCTB4ODAwNCwgMHhhODE2LCAweDA4MGMsIDB4M2MzMiwgMHgwOTI4LCAweDcwMTQsIDB4MjA0OCwgMHhhZDJjLAorCTB4YWMyOCwgMHhhYjFjLCAweGFhMTgsIDB4YTkzMCwgMHhhODA4LCAweGQwYjQsIDB4MTEyMCwgMHgyMDI5LAorCTB4MDAwMCwgMHgyMDIxLCAweDAwMDAsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLAorCTB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwgMHgzYjZmLAorCTB4NzAyMywgMHgwMDAxLCAweDAxMmUsIDB4MDAwNSwgMHgwMDQ2LCAweDAwODYsIDB4MDA5NiwgMHgwMGE2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDA4MGMsIDB4M2ExYiwgMHgyMDAxLAorCTB4MTk3NywgMHgyMDAzLCAweDAwMDAsIDB4MjAyMSwgMHgwMDBhLCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LAorCTB4MDAxNiwgMHg2MGJiLCAweDAwMDAsIDB4NjBiZiwgMHgzMmUxLCAweDYwYmYsIDB4MDAxMiwgMHgwODBjLAorCTB4M2NhMSwgMHgwODBjLCAweDNjNjAsIDB4MDBmNiwgMHgwMGU2LCAweDAwODYsIDB4Mjk0MCwgMHgyMDcxLAorCTB4MWEzZCwgMHgyMDc5LCAweDAwOTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4Njg4NCwgMHhkMGI0LAorCTB4MDE0MCwgMHgyMDAxLCAweDAwMzUsIDB4MjAwNCwgMHg3ODBlLCAweDIwMDEsIDB4MDAzNCwgMHgyMDA0LAorCTB4NzgwYSwgMHgwMGRlLCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDQwOGQsIDB4MDA4ZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwODBjLCAweDNmYmEsIDB4MDgwYywgMHgzZTdmLCAweDA1YjgsIDB4MjAwMSwgMHgwMjBiLAorCTB4MjAwNCwgMHg5MDg0LCAweDAxNDAsIDB4MWRiOCwgMHgwODBjLCAweDQxMDEsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDMwMCwgMHg3OGJjLCAweDAwZmUsIDB4OTA4YywgMHgwMDcwLCAweDE1NjAsIDB4MjA3MSwgMHgwMjAwLAorCTB4NzAzNywgMHgwMDAwLCAweDcwNTAsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MzIwMCwgMHgxNTEwLAorCTB4NzAzNywgMHgwMDAxLCAweDcwNTAsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4ZTEwMCwgMHgxMWQwLAorCTB4NzAzNywgMHgwMDAwLCAweDcwNTQsIDB4NzAzNywgMHgwMDAwLCAweDcxNWMsIDB4OTEwNiwgMHgxMTkwLAorCTB4MjAwMSwgMHgxODFmLCAweDIwMDQsIDB4OTEwNiwgMHgxMTY4LCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjAyNCwgMHg5MDg0LCAweDFlMDAsIDB4MDBjZSwgMHgwMTM4LCAweDA4MGMsIDB4M2U4OSwgMHgwODBjLAorCTB4M2M1YiwgMHgwMDU4LCAweDA4MGMsIDB4M2M1YiwgMHgwODBjLCAweDQwMjUsIDB4MDgwYywgMHgzZmIwLAorCTB4MjAwMSwgMHgwMjBiLCAweDIwMDQsIDB4ZDBlNCwgMHgwZGQ4LCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLAorCTB4MDAwNCwgMHgyMDYxLCAweDAxMDAsIDB4NjAyNywgMHgwMDAyLCAweDAwMWUsIDB4NjEwNiwgMHgyMDExLAorCTB4MDIwZCwgMHgyMDEzLCAweDAwMjAsIDB4NjBiYiwgMHgwMDAwLCAweDYwYmYsIDB4MDEwOCwgMHg2MGJmLAorCTB4MDAxMiwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThjLCAweGZmZmQsIDB4MjEwMiwgMHgwODBjLAorCTB4MTJmOCwgMHgyMDA5LCAweDAwMjgsIDB4MDgwYywgMHgyMzBhLCAweDIwMDEsIDB4MDIyNywgMHgyMDBjLAorCTB4MjEwMiwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLAorCTB4MDA4ZSwgMHgwMDRlLCAweDIwMDEsIDB4MTk3NywgMHgyMDA0LCAweDkwMDUsIDB4MTExOCwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNGU4LCAweDAxMmUsIDB4MjAyMSwgMHg0MDBjLCAweDA4MDQsIDB4MzRlYSwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDc2LCAweDAwODYsIDB4MDA5NiwgMHgwMGQ2LAorCTB4MDE1NiwgMHg3MDE0LCAweDIwNDgsIDB4NzAyMCwgMHgyMGE4LCAweDgwMDAsIDB4NzAyMiwgMHhhODA0LAorCTB4OTAwNSwgMHgwOTA0LCAweDNiY2IsIDB4MjA0OCwgMHgxZjA0LCAweDNiN2YsIDB4NzA2OCwgMHgyMDQwLAorCTB4YTI4YywgMHhhMzkwLCAweGE0OTQsIDB4YTU5OCwgMHhhOTMwLCAweGE4MDgsIDB4ZDBiNCwgMHgxMTIwLAorCTB4MjAyOSwgMHgwMDAwLCAweDIwMjEsIDB4MDAwMCwgMHgwMDk2LCAweDcwMTQsIDB4MjA0OCwgMHhhODY0LAorCTB4MDA5ZSwgMHg5MDg2LCAweDAxMDMsIDB4MDE3MCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLAorCTB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLCAweDA4MGMsIDB4NGIwOCwgMHg3MDFmLAorCTB4M2I2ZiwgMHgwMGIwLCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LAorCTB4ZmZjMCwgMHg5MDgwLCAweDAwMWIsIDB4MjFhOCwgMHgyN2UwLCAweDIwOTgsIDB4MjdlOCwgMHgyMGEwLAorCTB4MDAwNiwgMHgwODBjLCAweDBmYWUsIDB4MDAwZSwgMHgwODBjLCAweDRiMGIsIDB4NzAxZiwgMHgzYjZmLAorCTB4MDE1ZSwgMHgwMGRlLCAweDAwOWUsIDB4MDA4ZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4NzAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NiwgMHgwMTAzLAorCTB4MTExOCwgMHg3MDFmLCAweDNjMzAsIDB4MDQ1MCwgMHg3MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhjMGZkLAorCTB4YTg2YSwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHg2NDNmLCAweDAxMTAsIDB4OTAwNiwgMHgwMDMwLAorCTB4YjgxMywgMHgwMGZmLCAweGI4MTcsIDB4ZmZmZCwgMHgwODBjLCAweGMzMDIsIDB4MDE1ZSwgMHgwMGRlLAorCTB4MDA5ZSwgMHgwMDhlLCAweDAwN2UsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDkwNCwgMHgzNTFhLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDc2LAorCTB4MDA4NiwgMHgwMDk2LCAweDAwZDYsIDB4MDE1NiwgMHg3MDFmLCAweDNjMDIsIDB4NzAwNywgMHgwMDAzLAorCTB4MDgwNCwgMHgzYmMwLCAweGE4MzAsIDB4OTA4NiwgMHgwMTAwLCAweDIwMjEsIDB4NDAwYywgMHgwOTA0LAorCTB4MzRlYSwgMHgwMDc2LCAweGFkMTAsIDB4YWMwYywgMHhhYjI0LCAweGFhMjAsIDB4YTkzMCwgMHhhODA4LAorCTB4ZDBiNCwgMHgxMTIwLCAweDIwMjksIDB4MDAwMCwgMHgyMDIxLCAweDAwMDAsIDB4ODkwNiwgMHg4MDA2LAorCTB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAxYiwgMHgyMWE4LAorCTB4MjdlMCwgMHgyMDk4LCAweDI3ZTgsIDB4MjBhMCwgMHgwMDA2LCAweDA4MGMsIDB4MGZhZSwgMHgwMDBlLAorCTB4MDgwYywgMHg0YjBiLCAweDAwN2UsIDB4NzAxZiwgMHgzYjZmLCAweDcwMjMsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDgwNCwgMHgzNGU4LCAweDAxNTYsIDB4MDBjNiwgMHhhODE0LCAweDkwOGEsIDB4MDAxZSwgMHgwMjE4LAorCTB4YTgzMywgMHgwMDFlLCAweDAwMTAsIDB4YTgzMiwgMHgwMDc4LCAweDgxZmYsIDB4MDE2OCwgMHgwMDE2LAorCTB4MDgwYywgMHg0YWJmLCAweDAwMWUsIDB4MDEzMCwgMHhhODAwLCAweDIwNDAsIDB4YTAwOCwgMHhhODBhLAorCTB4MjEwMCwgMHgwYzU4LCAweDkwMDYsIDB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwZjYsIDB4MjA3OSwgMHgwMDAwLCAweDc4ODAsIDB4OTA4NiwgMHgwMDQ0LAorCTB4MDBmZSwgMHgwMDBlLCAweDAwMDUsIDB4MjAwMSwgMHgxOTc3LCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MjA2MSwgMHgwMjAwLCAweDIwMDEsIDB4MTk4MiwgMHgyMDA0LAorCTB4NjAxYSwgMHgyMDYxLCAweDAxMDAsIDB4MjAwMSwgMHgxOTgxLCAweDIwMDQsIDB4NjBjZSwgMHg2MTA0LAorCTB4YzFhYywgMHg2MTA2LCAweDA4MGMsIDB4NGFiZiwgMHhhODEzLCAweDAwMTksIDB4YTgxNywgMHgwMDAxLAorCTB4MjkwMCwgMHhhODVhLCAweDIwMDEsIDB4MDAyZSwgMHgyMDA0LCAweGE4NjYsIDB4MjAwMSwgMHgwMDJmLAorCTB4MjAwNCwgMHhhODZhLCAweDIwNjEsIDB4MDA5MCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxOTgxLAorCTB4MjAwNCwgMHg2MDM2LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIzMGEsIDB4MjAwMSwgMHgwMDJhLAorCTB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4YTg2ZSwgMHg2MDFhLCAweGE4NzMsIDB4MDAwMCwgMHg2MDFmLAorCTB4MDAwMCwgMHg3OGNhLCAweDkwMDYsIDB4NjAwYSwgMHg2MDBlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMGU2LCAweDA4MGMsIDB4NGFiZiwgMHgyOTQwLCAweGEwMTMsIDB4MDAxOSwgMHhhMDE3LAorCTB4MDAwMSwgMHgyODAwLCAweGEwNWEsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLAorCTB4MDAzMSwgMHgyMDA0LCAweGE4NmEsIDB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LAorCTB4YTg2ZSwgMHhhODczLCAweDAwMDAsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLAorCTB4MDMwMCwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMjBkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4MDAwNCwgMHgyMDBjLCAweDkxOGQsIDB4MDAwMiwgMHgyMTAyLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDgxZmYsIDB4MDE0OCwgMHgwODBjLCAweDJiYTgsIDB4MTEzMCwgMHg5MDA2LAorCTB4MDgwYywgMHgyYWI4LCAweDkwMDYsIDB4MDgwYywgMHgyYTliLCAweDc4ODQsIDB4OTA4NCwgMHgwMDA3LAorCTB4MDAwMiwgMHgzY2VjLCAweDNjZmIsIDB4M2QwYSwgMHgzY2U5LCAweDNjZTksIDB4M2NlOSwgMHgzY2U5LAorCTB4M2NlOSwgMHgwMTJlLCAweDA4MDQsIDB4MzUxZCwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwYSwgMHgwZGI4LCAweDIwMDksIDB4MDExNCwgMHgyMTA0LCAweDkwODUsIDB4MDgwMCwgMHgyMDBhLAorCTB4MDgwYywgMHgzZWQzLCAweDAwZjAsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MGQ0MCwgMHgyMDA5LCAweDAxMTQsIDB4MjEwNCwgMHg5MDg1LCAweDQwMDAsIDB4MjAwYSwgMHgwODBjLAorCTB4M2VkMywgMHgwMDc4LCAweDA4MGMsIDB4NzIwNywgMHgxMTI4LCAweDAxMmUsIDB4MjAwOSwgMHgwMDE2LAorCTB4MDgwNCwgMHgzNTFhLCAweDgxZmYsIDB4MDEyOCwgMHgwMTJlLCAweDIwMjEsIDB4NDAwYiwgMHgwODA0LAorCTB4MzRlYSwgMHgwMDg2LCAweDAwOTYsIDB4MDBhNiwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MDBmNiwgMHgwODBjLCAweDNhMWIsIDB4MjAwOSwgMHgwMTAxLCAweDIxMGMsIDB4MDAxNiwgMHg3ZWM4LAorCTB4N2RjYywgMHg5MDA2LCAweDIwNjgsIDB4MjA2MCwgMHgyMDU4LCAweDA4MGMsIDB4NDFkYywgMHgwODBjLAorCTB4NDEyYywgMHg5MDNlLCAweDI3MjAsIDB4MDBmNiwgMHgwMGU2LCAweDAwODYsIDB4Mjk0MCwgMHgyMDcxLAorCTB4MWEzZCwgMHgyMDc5LCAweDAwOTAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4Njg4NCwgMHhkMGI0LAorCTB4MDEyMCwgMHg2OGQ0LCAweDc4MGUsIDB4NjhkMCwgMHg3ODBhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHg0MDhkLCAweDA4MGMsIDB4MmJiMCwgMHgwODBjLCAweDJiYjAsIDB4MDgwYywgMHgyYmIwLAorCTB4MDgwYywgMHgyYmIwLCAweDA4MGMsIDB4NDA4ZCwgMHgwMDhlLCAweDAwZWUsIDB4MDBmZSwgMHgwODBjLAorCTB4M2ZiYSwgMHgyMDA5LCAweDljNDAsIDB4ODEwOSwgMHgxMWIwLCAweDA4MGMsIDB4M2U4OSwgMHgyMDAxLAorCTB4MDAwNCwgMHgyMDBjLCAweDkxOGMsIDB4ZmZmZCwgMHgyMTAyLCAweDAwMWUsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLCAweDAwOGUsIDB4MjAwOSwgMHgwMDE3LAorCTB4MDgwYywgMHgzNTFhLCAweDBjZjgsIDB4MjAwMSwgMHgwMjBiLCAweDIwMDQsIDB4OTA4NCwgMHgwMTQwLAorCTB4MWQxMCwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwgMHg3ODg0LCAweDAwZmUsIDB4ZDBiYywgMHgwMTc4LAorCTB4MjAwMSwgMHgwMjAxLCAweDIwMGMsIDB4ODFmZiwgMHgwMTUwLCAweDA4MGMsIDB4M2Y5OCwgMHgyZDAwLAorCTB4OWMwNSwgMHg5YjA1LCAweDAxMjAsIDB4MDgwYywgMHgzZTg5LCAweDA4MDQsIDB4M2UyOSwgMHgwODBjLAorCTB4NDEwMSwgMHgwODBjLCAweDQwMjUsIDB4MDgwYywgMHgzZjdiLCAweDA4MGMsIDB4M2ZiMCwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDBhYywgMHgwMTMwLCAweDhiNTgsIDB4MDgwYywgMHgzZTg5LAorCTB4MDBmZSwgMHgwODA0LCAweDNlMjksIDB4MDBmZSwgMHgwODBjLCAweDNlN2YsIDB4MTE1MCwgMHg4ZDY4LAorCTB4MjAwMSwgMHgwMDMyLCAweDI2MDIsIDB4MjAwMSwgMHgwMDMzLCAweDI1MDIsIDB4MDgwYywgMHgzZTg5LAorCTB4MDA4MCwgMHg4N2ZmLCAweDAxMzgsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsIDB4OTAwNSwgMHgxOTA4LAorCTB4ODczOSwgMHgwMDM4LCAweDIwMDEsIDB4MWEzYSwgMHgyMDA0LCAweDkwODYsIDB4MDAwMCwgMHgxOTA0LAorCTB4M2Q3OSwgMHgyMDAxLCAweDAzMmYsIDB4MjAwMywgMHgwMGY2LCAweDg2MzEsIDB4MTIwOCwgMHg4NTI5LAorCTB4MjUwMCwgMHg5NjA1LCAweDA5MDQsIDB4M2UyOSwgMHg3ODg0LCAweGQwYmMsIDB4MDEyOCwgMHgyZDAwLAorCTB4OWMwNSwgMHg5YjA1LCAweDE5MDQsIDB4M2UyOSwgMHhhMDEzLCAweDAwMTksIDB4MjAwMSwgMHgwMzJhLAorCTB4MjAwMywgMHgwMDA0LCAweDc4ODQsIDB4ZDBhYywgMHgxMTQ4LCAweDIwMDEsIDB4MWEzYSwgMHgyMDAzLAorCTB4MDAwMywgMHgyMDAxLCAweDAzMmEsIDB4MjAwMywgMHgwMDA5LCAweDAwMzAsIDB4YTAxNywgMHgwMDAxLAorCTB4NzhiNCwgMHg5MDA1LCAweDAxMDgsIDB4YTAxNiwgMHgyODAwLCAweGEwNWEsIDB4MjAwOSwgMHgwMDQwLAorCTB4MDgwYywgMHgyMzBhLCAweDI5MDAsIDB4YTg1YSwgMHhhODEzLCAweDAwMTksIDB4Nzg4NCwgMHhkMGE0LAorCTB4MTE4MCwgMHhhODE3LCAweDAwMDAsIDB4MDBjNiwgMHgyMGE5LCAweDAwMDQsIDB4MjA2MSwgMHgwMDkwLAorCTB4NjAyYiwgMHgwMDA4LCAweDIwMDEsIDB4MDIwMywgMHgyMDA0LCAweDFmMDQsIDB4M2UwMCwgMHgwMGNlLAorCTB4MDAzMCwgMHhhODE3LCAweDAwMDEsIDB4NzhiMCwgMHg5MDA1LCAweDAxMDgsIDB4YTgxNiwgMHgwMGY2LAorCTB4MDBjNiwgMHgyMDc5LCAweDAxMDAsIDB4MjA2MSwgMHgwMDkwLCAweDc4MjcsIDB4MDAwMiwgMHgyMDAxLAorCTB4MDAyYSwgMHgyMDA0LCAweDkwODQsIDB4ZmZmOCwgMHg2MDFhLCAweDAwMDYsIDB4MjAwMSwgMHgwMDJiLAorCTB4MjAwNCwgMHg2MDFlLCAweDc4YzYsIDB4MDAwZSwgMHg3OGNhLCAweDAwY2UsIDB4MDBmZSwgMHgwODA0LAorCTB4M2QzMywgMHgwMDFlLCAweDAwYzYsIDB4MjAwMSwgMHgwMzJhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDI3LCAweDAwMDIsIDB4NjEwNiwgMHgyMDExLCAweDAyMGQsIDB4MjAxMywgMHgwMDIwLAorCTB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywgMHhmZmZkLCAweDIxMDIsIDB4MDgwYywgMHgxMmY4LAorCTB4Nzg4NCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwgMHgwMDAyLCAweDA1MDgsIDB4MjAwOSwgMHgwMDI4LAorCTB4MDgwYywgMHgyMzBhLCAweDIwMDEsIDB4MDIyNywgMHgyMDBjLCAweDIxMDIsIDB4NjA1MCwgMHgwMDA2LAorCTB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDAwMGUsIDB4MDExOCwgMHg5MDg0LAorCTB4YjdlZiwgMHgwMDIwLCAweDkwODQsIDB4YjdmZiwgMHgwODBjLCAweDJjZjUsIDB4NjA1MiwgMHg2MDJmLAorCTB4MDAwMCwgMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgwMGNlLAorCTB4MmQwOCwgMHgyYzEwLCAweDJiMTgsIDB4MmIwMCwgMHg5YzA1LCAweDlkMDUsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwYmUsIDB4MDBhZSwgMHgwMDllLCAweDAwOGUsIDB4MTExOCwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNGU4LCAweDAxMmUsIDB4MjAyMSwgMHg0MDBjLCAweDA4MDQsIDB4MzRlYSwgMHg5MDg1LAorCTB4MDAwMSwgMHgxZDA0LCAweDNlODgsIDB4MjA5MSwgMHg2MDAwLCAweDg0MjAsIDB4OTQ4NiwgMHgwMDY0LAorCTB4MDAwNSwgMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLAorCTB4MDAwNCwgMHgyMDAxLCAweDFhM2EsIDB4MjAwMywgMHgwMDAwLCAweDAwNzEsIDB4MjAwOSwgMHgwMDQ4LAorCTB4MDgwYywgMHgyMzBhLCAweDIwMDEsIDB4MDIyNywgMHgyMDI0LCAweDI0MDIsIDB4MjAwMSwgMHgwMTA5LAorCTB4MjAwMywgMHg0MDAwLCAweDkwMjYsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHgxYTNkLAorCTB4NzAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDUyMCwgMHgyMDc5LCAweDAwOTAsIDB4MjAwOSwgMHgwMjA2LAorCTB4MjEwNCwgMHgyMDA5LCAweDAyMDMsIDB4MjEwYywgMHg5MTA2LCAweDExMjAsIDB4MjAwOSwgMHgwMDQwLAorCTB4MDgwYywgMHgyMzBhLCAweDc4MmMsIDB4ZDBmYywgMHgwZDg4LCAweDA4MGMsIDB4NDEwMSwgMHg3MDAwLAorCTB4OTA4NiwgMHgwMDAwLCAweDFkNTgsIDB4NzgyYiwgMHgwMDA0LCAweDc4MmMsIDB4ZDBhYywgMHgxZGU4LAorCTB4MjAwOSwgMHgwMDQwLCAweDA4MGMsIDB4MjMwYSwgMHg3ODJiLCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLAorCTB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MTVkMCwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgyMDAxLCAweDE4MTcsIDB4MjAwYywgMHg3OTMyLAorCTB4NzkzNiwgMHgwODBjLCAweDI3YjcsIDB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4MmNmNSwgMHg3ODRiLAorCTB4ZjdmNywgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDc4NTAsIDB4YzBlNSwgMHg3ODUyLAorCTB4MjAxOSwgMHg2MWE4LCAweDc4MjAsIDB4ZDA5YywgMHgwMTEwLCAweDgzMTksIDB4MWRkOCwgMHg3ODUwLAorCTB4YzBlNCwgMHg3ODUyLCAweDc4MjcsIDB4MDA0OCwgMHg3ODQzLCAweDAwNDAsIDB4MjAxOSwgMHgwMWY0LAorCTB4YTAwMSwgMHhhMDAxLCAweDgzMTksIDB4MWRlMCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYzg4LAorCTB4NzgyNywgMHgwMDIwLCAweDc4NDMsIDB4MDAwMCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHg3ODI3LAorCTB4MDA0OCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxODE3LAorCTB4MjAwYywgMHg3OTMyLCAweDc5MzYsIDB4MDgwYywgMHgyN2I3LCAweDc4NTAsIDB4OTA4NCwgMHhmYmZmLAorCTB4OTA4NSwgMHgwMDMwLCAweDc4NTIsIDB4MjAxOSwgMHgwMWY0LCAweDgzMTksIDB4MWRmMCwgMHg5MDg0LAorCTB4ZmZjZiwgMHg5MDg1LCAweDIwMDAsIDB4Nzg1MiwgMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgzZjJlLAorCTB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4M2YyZSwgMHg3ODUwLCAweDkwODUsIDB4MDQwMCwgMHg5MDg0LAorCTB4ZGZmZiwgMHg3ODUyLCAweDIwMDEsIDB4MDAyMSwgMHgyMDA0LCAweDkwODQsIDB4MDAwMywgMHg5MDg2LAorCTB4MDAwMSwgMHgxMTIwLCAweDc4NTAsIDB4OTA4NCwgMHhkZmZmLCAweDc4NTIsIDB4Nzg0YiwgMHhmN2Y3LAorCTB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMGE5LCAweDAwMjgsIDB4YTAwMSwgMHgxZjA0LAorCTB4M2Y0ZSwgMHg3ODUwLCAweDkwODUsIDB4MTQwMCwgMHg3ODUyLCAweDIwMTksIDB4NjFhOCwgMHg3ODU0LAorCTB4YTAwMSwgMHhhMDAxLCAweGQwOGMsIDB4MTExMCwgMHg4MzE5LCAweDFkYzgsIDB4NzgyNywgMHgwMDQ4LAorCTB4Nzg1MCwgMHg5MDg1LCAweDA0MDAsIDB4Nzg1MiwgMHg3ODQzLCAweDAwNDAsIDB4MjAxOSwgMHgwMWY0LAorCTB4YTAwMSwgMHhhMDAxLCAweDgzMTksIDB4MWRlMCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYzg4LAorCTB4NzgyNywgMHgwMDIwLCAweDc4NDMsIDB4MDAwMCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHg3ODI3LAorCTB4MDA0OCwgMHgwMGZlLCAweDAwMDUsIDB4Nzg4NCwgMHhkMGFjLCAweDExYzgsIDB4MDBmNiwgMHgwMGU2LAorCTB4MjA3MSwgMHgxYTNhLCAweDIwNzksIDB4MDMyMCwgMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHg5MDA1LAorCTB4MDE2MCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxMTQwLCAweDAwNTEsIDB4ZDBiYywgMHgwMTA4LAorCTB4ODczOCwgMHg3MDAzLCAweDAwMDMsIDB4NzgyYiwgMHgwMDE5LCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzhiYywgMHgwMGZlLCAweDkwOGMsIDB4MDA3MCwgMHgwMTc4LAorCTB4MjAwOSwgMHgwMDMyLCAweDI2MGEsIDB4MjAwOSwgMHgwMDMzLCAweDI1MGEsIDB4ZDBiNCwgMHgwMTA4LAorCTB4OGM2MCwgMHhkMGFjLCAweDAxMDgsIDB4OGQ2OCwgMHhkMGE0LCAweDAxMDgsIDB4OGI1OCwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4NzgxYywgMHhkMDg0LCAweDAxMTAsIDB4NzgzNywgMHgwMDUwLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMTAwLCAweDIwMDEsIDB4MTk4MiwgMHgyMDA0LAorCTB4NzBlMiwgMHgwODBjLCAweDNjNTEsIDB4MTE4OCwgMHgyMDAxLCAweDE4MWYsIDB4MjAwNCwgMHgyMDA5LAorCTB4MTgxZSwgMHgyMTBjLCAweDkxOGMsIDB4MDBmZiwgMHg3MDZlLCAweDcxNmEsIDB4NzA2NiwgMHg5MThkLAorCTB4MzIwMCwgMHg3MTYyLCAweDcwNzMsIDB4ZTEwOSwgMHgwMDgwLCAweDcwMmMsIDB4OTA4NSwgMHgwMDAyLAorCTB4NzAyZSwgMHgyMDA5LCAweDE4MTcsIDB4MjEwYywgMHg3MTZlLCAweDcwNjMsIDB4MDEwMCwgMHg3MTY2LAorCTB4NzE5ZSwgMHg3MDZiLCAweDAwMDAsIDB4NzA3MywgMHgwODA5LCAweDcwNzcsIDB4MDAwOCwgMHg3MDc4LAorCTB4OTA4MCwgMHgwMTAwLCAweDcwN2EsIDB4NzA4MCwgMHg4MDAwLCAweDcwODIsIDB4NzA4NywgMHhhYWFhLAorCTB4OTAwNiwgMHg3MDhhLCAweDcwOGUsIDB4NzA3ZSwgMHg3MGQ2LCAweDcwYWIsIDB4MDAzNiwgMHg3MGFmLAorCTB4OTVkNSwgMHg3MDE0LCAweDkwODQsIDB4MTk4NCwgMHg5MDg1LCAweDAwOTIsIDB4NzAxNiwgMHgwODBjLAorCTB4NDEwMSwgMHgwMGY2LCAweDIwNzEsIDB4MWEzYSwgMHgyMDc5LCAweDAzMjAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDAwMCwgMHg2ODg0LCAweGQwYjQsIDB4MDEyMCwgMHg2ODljLCAweDc4MGUsIDB4Njg5OCwgMHg3ODBhLAorCTB4MDBkZSwgMHgyMDA5LCAweDAzZTgsIDB4ODEwOSwgMHgxZGYwLCAweDc5MmMsIDB4ZDFmYywgMHgwMTEwLAorCTB4NzgyYiwgMHgwMDA0LCAweDIwMTEsIDB4MDAxMSwgMHgwODBjLCAweDQwOGQsIDB4MjAxMSwgMHgwMDAxLAorCTB4MDgwYywgMHg0MDhkLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MWEzYSwgMHgyMDc5LCAweDAzMjAsIDB4NzkyYywgMHhkMWZjLCAweDA5MDQsIDB4NDA4YSwgMHg3ODJiLAorCTB4MDAwMiwgMHg5MDI2LCAweGQxOWMsIDB4MTkwNCwgMHg0MDg2LCAweDcwMDAsIDB4MDAwMiwgMHg0MDhhLAorCTB4NDAzYiwgMHg0MDZiLCAweDQwODYsIDB4ZDFiYywgMHgxMTcwLCAweGQxZGMsIDB4MTE5MCwgMHg4MDAxLAorCTB4NzAwMiwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MDhkLCAweDA5MDQsIDB4NDA4YSwgMHgwODBjLAorCTB4NDA4ZCwgMHgwODA0LCAweDQwOGEsIDB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzhiZiwgMHgwMDAwLAorCTB4MDBmZSwgMHg3ODEwLCAweDc5MTQsIDB4NzgyYiwgMHgwMDA0LCAweDc4MTIsIDB4NzkxNiwgMHgyMDAxLAorCTB4MDIwMSwgMHgyMDBjLCAweDgxZmYsIDB4MGRlOCwgMHgwODBjLCAweDNmOTgsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDBmNiwgMHgyMDc5LCAweDAzMDAsIDB4NzhiOCwgMHgwMGZlLCAweGQwZWMsIDB4MDExMCwgMHgyMDA5LAorCTB4MDAxMSwgMHg3OTJhLCAweDAwZjgsIDB4ODAwMSwgMHg3MDAyLCAweDkxODQsIDB4MDg4MCwgMHgxMTQwLAorCTB4NzgyYywgMHhkMGZjLCAweDE5MDQsIDB4NDAyZiwgMHgyMDExLCAweDAwMDEsIDB4MDBiMSwgMHgwMDkwLAorCTB4YTAxMCwgMHg5MDkyLCAweDAwMDQsIDB4OTA4NiwgMHgwMDE1LCAweDExMjAsIDB4YTAwMCwgMHhhMDVhLAorCTB4MjAxMSwgMHgwMDMxLCAweGEyMTIsIDB4ZDFkYywgMHgxOTYwLCAweDA4MjgsIDB4NzgyYiwgMHgwMDA0LAorCTB4NzAwMywgMHgwMDAwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweGEwMTQsIDB4OTAwNSwgMHgwNTUwLAorCTB4ODAwMSwgMHgwMDM2LCAweDAwOTYsIDB4YTAxNiwgMHhhMDU4LCAweDIwNDgsIDB4YTAxMCwgMHgyMDA5LAorCTB4MDAzMSwgMHg5MTFhLCAweDgzMWMsIDB4ODMxYywgMHg5MzhhLCAweDAwMDcsIDB4MWEwYywgMHgwZGZhLAorCTB4OTM5OCwgMHg0MGJiLCAweDIzMWQsIDB4MDgzZiwgMHg5MDgwLCAweDAwMDQsIDB4N2EyYSwgMHg3MTAwLAorCTB4ODEwOCwgMHg3MTAyLCAweDAwOWUsIDB4MDAzZSwgMHg5MDhhLCAweDAwMzUsIDB4MTE0MCwgMHgwMDk2LAorCTB4YTA1OCwgMHgyMDQ4LCAweGE4MDQsIDB4YTA1YSwgMHgyMDAxLCAweDAwMTksIDB4MDA5ZSwgMHhhMDEyLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4NDBmOCwgMHg0MGVmLCAweDQwZTYsIDB4NDBkZCwgMHg0MGQ0LAorCTB4NDBjYiwgMHg0MGMyLCAweGE5NjQsIDB4NzkwMiwgMHhhOTY4LCAweDc5MDYsIDB4YTk2YywgMHg3OTEyLAorCTB4YTk3MCwgMHg3OTE2LCAweDAwMDUsIDB4YTk3NCwgMHg3OTAyLCAweGE5NzgsIDB4NzkwNiwgMHhhOTdjLAorCTB4NzkxMiwgMHhhOTgwLCAweDc5MTYsIDB4MDAwNSwgMHhhOTg0LCAweDc5MDIsIDB4YTk4OCwgMHg3OTA2LAorCTB4YTk4YywgMHg3OTEyLCAweGE5OTAsIDB4NzkxNiwgMHgwMDA1LCAweGE5OTQsIDB4NzkwMiwgMHhhOTk4LAorCTB4NzkwNiwgMHhhOTljLCAweDc5MTIsIDB4YTlhMCwgMHg3OTE2LCAweDAwMDUsIDB4YTlhNCwgMHg3OTAyLAorCTB4YTlhOCwgMHg3OTA2LCAweGE5YWMsIDB4NzkxMiwgMHhhOWIwLCAweDc5MTYsIDB4MDAwNSwgMHhhOWI0LAorCTB4NzkwMiwgMHhhOWI4LCAweDc5MDYsIDB4YTliYywgMHg3OTEyLCAweGE5YzAsIDB4NzkxNiwgMHgwMDA1LAorCTB4YTljNCwgMHg3OTAyLCAweGE5YzgsIDB4NzkwNiwgMHhhOWNjLCAweDc5MTIsIDB4YTlkMCwgMHg3OTE2LAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDA4NiwgMHgyMDcxLCAweDFhM2QsIDB4MjA3OSwgMHgwMDkwLAorCTB4NzkyYywgMHhkMWZjLCAweDAxZTgsIDB4NzgyYiwgMHgwMDAyLCAweDI5NDAsIDB4OTAyNiwgMHg3MDAwLAorCTB4MDAwMiwgMHg0MTI4LCAweDQxMTQsIDB4NDExZiwgMHg4MDAxLCAweDcwMDIsIDB4ZDE5YywgMHgxMTgwLAorCTB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NDA4ZCwgMHgxOTBjLCAweDQwOGQsIDB4MDA0OCwgMHg4MDAxLAorCTB4NzAwMiwgMHg3ODJjLCAweGQwZmMsIDB4MWQzOCwgMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg0MDhkLAorCTB4MDA4ZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDg2LAorCTB4MjA2MSwgMHgwMjAwLCAweDIwMDEsIDB4MTk4MiwgMHgyMDA0LCAweDYwMWEsIDB4MjA2MSwgMHgwMTAwLAorCTB4MjAwMSwgMHgxOTgxLCAweDIwMDQsIDB4NjBjZSwgMHg2MTA0LCAweGMxYWMsIDB4NjEwNiwgMHgyMDAxLAorCTB4MDAyYywgMHgyMDA0LCAweDkwMDUsIDB4MDUyMCwgMHgyMDM4LCAweDIwMDEsIDB4MDAyZSwgMHgyMDI0LAorCTB4MjAwMSwgMHgwMDJmLCAweDIwMWMsIDB4MDgwYywgMHg0YWJmLCAweGE4MTMsIDB4MDAxOSwgMHhhZjE2LAorCTB4MjkwMCwgMHhhODVhLCAweDk3OGEsIDB4MDAwNywgMHgwMjIwLCAweDIxMzgsIDB4MjAwOSwgMHgwMDA3LAorCTB4MDAxMCwgMHgyNzA4LCAweDkwM2UsIDB4MDA5NiwgMHhhODU4LCAweDIwNDgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAxOSwgMHgwMDllLCAweDA4MGMsIDB4NDFhNCwgMHgxZDY4LCAweDI5MDAsIDB4YTg1YSwgMHgwMGQwLAorCTB4MDgwYywgMHg0YWJmLCAweGE4MTMsIDB4MDAxOSwgMHhhODE3LCAweDAwMDEsIDB4MjkwMCwgMHhhODVhLAorCTB4MjAwMSwgMHgwMDJlLCAweDIwMDQsIDB4YTg2NiwgMHgyMDAxLCAweDAwMmYsIDB4MjAwNCwgMHhhODZhLAorCTB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGE4NmUsIDB4MjAwMSwgMHgwMDJiLAorCTB4MjAwNCwgMHhhODcyLCAweDIwNjEsIDB4MDA5MCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHgxOTgxLAorCTB4MjAwNCwgMHg2MDM2LCAweDIwMDksIDB4MDA0MCwgMHgwODBjLCAweDIzMGEsIDB4MjAwMSwgMHgwMDJhLAorCTB4MjAwNCwgMHg5MDg0LCAweGZmZjgsIDB4NjAxYSwgMHgwMDA2LCAweDIwMDEsIDB4MDAyYiwgMHgyMDA0LAorCTB4NjAxZSwgMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHg5MDA2LCAweDYwMGEsIDB4NjAwZSwgMHgwMDhlLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA4MCwgMHhhYTYwLAorCTB4MjJlOCwgMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAwODgsIDB4NzAyYiwgMHgwMDI2LAorCTB4NzQwMiwgMHg3MzA2LCAweDkwMDYsIDB4NzAwYSwgMHg3MDBlLCAweDgxMGIsIDB4ODEwYiwgMHgyMWE4LAorCTB4ODEwYiwgMHg3MTEyLCAweDcwMmIsIDB4MDA0MSwgMHg3MDJjLCAweGQwZmMsIDB4MGRlOCwgMHg3MDJiLAorCTB4MDAwMiwgMHg3MDJiLCAweDAwNDAsIDB4NDAwNSwgMHg3NDAwLCAweDczMDQsIDB4ODdmZiwgMHgwMTkwLAorCTB4MDA4NiwgMHgwMDk2LCAweDI5NDAsIDB4MDA4NiwgMHgwODBjLCAweDRhYmYsIDB4MDA4ZSwgMHhhMDU4LAorCTB4MDBhNiwgMHgyMDUwLCAweDI5MDAsIDB4YjAwNiwgMHhhMDVhLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwMDEsIDB4MDAyZCwgMHgyMDA0LAorCTB4OTAwNSwgMHgwNTI4LCAweDIwMzgsIDB4MjAwMSwgMHgwMDMwLCAweDIwMjQsIDB4MjAwMSwgMHgwMDMxLAorCTB4MjAxYywgMHgwODBjLCAweDRhYmYsIDB4Mjk0MCwgMHhhODEzLCAweDAwMTksIDB4YWYxNiwgMHgyOTAwLAorCTB4YTg1YSwgMHg5NzhhLCAweDAwMDcsIDB4MDIyMCwgMHgyMTM4LCAweDIwMDksIDB4MDAwNywgMHgwMDEwLAorCTB4MjcwOCwgMHg5MDNlLCAweDAwOTYsIDB4YTg1OCwgMHgyMDQ4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LAorCTB4MDA5ZSwgMHgwODBjLCAweDQxYTQsIDB4MWQ2OCwgMHgyOTAwLCAweGE4NWEsIDB4MDBkOCwgMHgwODBjLAorCTB4NGFiZiwgMHgyOTQwLCAweGEwMTMsIDB4MDAxOSwgMHhhMDE3LCAweDAwMDEsIDB4MjgwMCwgMHhhMDVhLAorCTB4MjAwMSwgMHgwMDMwLCAweDIwMDQsIDB4YTA2NiwgMHgyMDAxLCAweDAwMzEsIDB4MjAwNCwgMHhhMDZhLAorCTB4MjAwMSwgMHgwMDJhLCAweDIwMDQsIDB4OTA4NCwgMHhmZmY4LCAweGEwNmUsIDB4MjAwMSwgMHgwMDJiLAorCTB4MjAwNCwgMHhhMDcyLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLCAweDAwMDQsIDB4Nzg4NCwgMHhkMGFjLAorCTB4MTE4MCwgMHgyMDAxLCAweDAxMDEsIDB4MjAwYywgMHg5MThkLCAweDAyMDAsIDB4MjEwMiwgMHhhMDE3LAorCTB4MDAwMCwgMHgyMDAxLCAweDFhM2EsIDB4MjAwMywgMHgwMDAzLCAweDIwMDEsIDB4MDMyYSwgMHgyMDAzLAorCTB4MDAwOSwgMHgyMDAxLCAweDAzMDAsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDIwZCwgMHgyMDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDAwMDQsIDB4MjAwYywgMHg5MThkLCAweDAwMDIsIDB4MjEwMiwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMGE5LCAweDAwMWIsIDB4MjBhMSwgMHgxODQwLAorCTB4MjBlOSwgMHgwMDAxLCAweDkwMDYsIDB4NDAwNCwgMHgyMDA5LCAweDAxM2MsIDB4MjAwYSwgMHgwMTJlLAorCTB4Nzg4MCwgMHg5MDg2LCAweDAwNTIsIDB4MDEwOCwgMHgwMDA1LCAweDA4MDQsIDB4MzRlOCwgMHg3ZDk4LAorCTB4N2M5YywgMHgwODA0LCAweDM1ZWEsIDB4MDgwYywgMHg3MjA3LCAweDE5MGMsIDB4NWVmMCwgMHgyMDY5LAorCTB4MTg1YiwgMHgyZDAwLCAweDIwMDksIDB4MDAzMCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LAorCTB4MjAzOSwgMHgwMDAxLCAweDA4MGMsIDB4NGIwOCwgMHg3MDFmLCAweDQyNzcsIDB4MDAwNSwgMHgwODBjLAorCTB4NTVlYSwgMHgxMTMwLCAweDNiMDAsIDB4M2EwOCwgMHhjMTk0LCAweGMwOTUsIDB4MjBkOCwgMHgyMWQwLAorCTB4MjA2OSwgMHgxODViLCAweDY4MDAsIDB4OTAwNSwgMHgwOTA0LCAweDM1MWQsIDB4NjgwNCwgMHhkMDk0LAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMTM4LCAweDYyMDAsIDB4OTI5MiwgMHgwMDA1LAorCTB4MDIxOCwgMHg5MThjLCAweGZmZGYsIDB4MDAxMCwgMHg5MThkLCAweDAwMjAsIDB4NjEwNiwgMHgwMGNlLAorCTB4ZDA4YywgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweDAxMTgsIDB4OTE4ZCwgMHgwMDEwLAorCTB4MDAxMCwgMHg5MThjLCAweGZmZWYsIDB4NjEwNiwgMHgwMGNlLCAweGQwODQsIDB4MDE1OCwgMHg2YTI4LAorCTB4OTI4YSwgMHgwMDdmLCAweDFhMDQsIDB4MzUxZCwgMHg5Mjg4LCAweDMyZTksIDB4MjEwZCwgMHg5MThjLAorCTB4MDBmZiwgMHg2MTYyLCAweGQwZGMsIDB4MDEzMCwgMHg2ODI4LCAweDkwOGEsIDB4MDA3ZiwgMHgxYTA0LAorCTB4MzUxZCwgMHg2MDVhLCAweDY4ODgsIDB4OTA4NCwgMHgwMDMwLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LAorCTB4ODAwNCwgMHgwMDA2LCAweDIwMDksIDB4MTk4OSwgMHg5MDgwLCAweDI4YWEsIDB4MjAwNSwgMHgyMDBhLAorCTB4MDAwZSwgMHgyMDA5LCAweDE5OGEsIDB4OTA4MCwgMHgyOGFlLCAweDIwMDUsIDB4MjAwYSwgMHg2ODA4LAorCTB4OTA4YSwgMHgwMTAwLCAweDBhMDQsIDB4MzUxZCwgMHg5MDhhLCAweDA4NDEsIDB4MWEwNCwgMHgzNTFkLAorCTB4OTA4NCwgMHgwMDA3LCAweDE5MDQsIDB4MzUxZCwgMHg2ODBjLCAweDkwMDUsIDB4MDkwNCwgMHgzNTFkLAorCTB4NjgxMCwgMHg5MDA1LCAweDA5MDQsIDB4MzUxZCwgMHg2ODQ4LCAweDY5NDAsIDB4OTEwYSwgMHgxYTA0LAorCTB4MzUxZCwgMHg4MDAxLCAweDA5MDQsIDB4MzUxZCwgMHg2ODRjLCAweDY5NDQsIDB4OTEwYSwgMHgxYTA0LAorCTB4MzUxZCwgMHg4MDAxLCAweDA5MDQsIDB4MzUxZCwgMHgyMDA5LCAweDE5NTksIDB4MjAwYiwgMHgwMDAwLAorCTB4MjAwMSwgMHgxODdkLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTQwLCAweDc4ODQsIDB4MjAwYSwgMHgyMDA5LAorCTB4MDE3ZiwgMHgyMDBhLCAweDNiMDAsIDB4YzA4NSwgMHgyMGQ4LCAweDY4MTQsIDB4OTA4YywgMHgwMGZmLAorCTB4NjE0YSwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg2MDRlLCAweDA4MGMsIDB4NzUzNSwgMHgwODBjLAorCTB4Njg4YywgMHgwODBjLCAweDY4YzEsIDB4NjgwOCwgMHg2MDJhLCAweDA4MGMsIDB4MjI3YywgMHgyMDA5LAorCTB4MDE3MCwgMHgyMDBiLCAweDAwODAsIDB4YTAwMSwgMHhhMDAxLCAweDIwMGIsIDB4MDAwMCwgMHgwMDM2LAorCTB4NmIwOCwgMHgwODBjLCAweDI4MTEsIDB4MDAzZSwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgxOTA0LAorCTB4NDNmOCwgMHg2ODE4LCAweDY5MWMsIDB4NmEyMCwgMHg2YjI0LCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LAorCTB4ODMxZiwgMHg2MDE2LCAweDYxMWEsIDB4NjIxZSwgMHg2MzIyLCAweDZjMDQsIDB4ZDRmNCwgMHgwMTQ4LAorCTB4NjgzMCwgMHg2OTM0LCAweDZhMzgsIDB4NmIzYywgMHg4MDA3LCAweDgxMGYsIDB4ODIxNywgMHg4MzFmLAorCTB4MDAxMCwgMHg5MDg0LCAweGYwZmYsIDB4NjAwNiwgMHg2MTBhLCAweDYyMGUsIDB4NjMxMiwgMHg4MDA3LAorCTB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MjBhOSwgMHgwMDA0LCAweDIwYTEsIDB4MTk4YiwgMHgyMGU5LAorCTB4MDAwMSwgMHg0MDAxLCAweDIwYTksIDB4MDAwNCwgMHgyMGExLCAweDE5YTUsIDB4MjBlOSwgMHgwMDAxLAorCTB4NDAwMSwgMHgwODBjLCAweDgzZTMsIDB4MDBjNiwgMHg5MDBlLCAweDIwYTksIDB4MDAwMSwgMHg2YjcwLAorCTB4ZDM4NCwgMHgwMWM4LCAweDAwMjAsIDB4ODM5ZCwgMHgxMmIwLCAweDM1MDgsIDB4ODEwOSwgMHgwODBjLAorCTB4N2FmOCwgMHg2ODc4LCAweDYwMTYsIDB4Njg3NCwgMHgyMDA4LCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4NjAwYSwgMHg5MTg0LCAweDAwZmYsIDB4NjAwNiwgMHg4MTA4LCAweDExMTgsIDB4NjAwMywgMHgwMDAzLAorCTB4MDAxMCwgMHg2MDAzLCAweDAwMDEsIDB4MWYwNCwgMHg0MzYzLCAweDAwY2UsIDB4MDBjNiwgMHgyMDYxLAorCTB4MTk3NCwgMHgyMDYzLCAweDAwMDEsIDB4OTAwNiwgMHgwODBjLCAweDJhYjgsIDB4OTAwNiwgMHgwODBjLAorCTB4MmE5YiwgMHgwMDAwLCAweDAwY2UsIDB4MDBlNiwgMHgyYzcwLCAweDA4MGMsIDB4MGVjNiwgMHgwMGVlLAorCTB4Njg4OCwgMHhkMGVjLCAweDAxOTgsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLAorCTB4MDEzOCwgMHgyMDExLCAweDAxMTQsIDB4MjIwNCwgMHg5MDg1LCAweDAxMDAsIDB4MjAxMiwgMHgwMDMwLAorCTB4MjAxMSwgMHgwMTE0LCAweDIyMDQsIDB4OTA4NSwgMHgwMTgwLCAweDIwMTIsIDB4NmE4MCwgMHg5Mjg0LAorCTB4MDAzMCwgMHg5MDg2LCAweDAwMzAsIDB4MTEyOCwgMHg5Mjk0LCAweGZmY2YsIDB4OTI5NSwgMHgwMDIwLAorCTB4NmE4MiwgMHgyMDAxLCAweDE5NTQsIDB4NmE4MCwgMHg5Mjk0LCAweDAwMzAsIDB4OTI4ZSwgMHgwMDAwLAorCTB4MDE3MCwgMHg5MjhlLCAweDAwMTAsIDB4MDExOCwgMHg5MjhlLCAweDAwMjAsIDB4MDE0MCwgMHgyMDAzLAorCTB4YWFhYSwgMHgwODBjLCAweDI4ODYsIDB4MjAwMSwgMHgxOTQ1LCAweDIxMDIsIDB4MDAwOCwgMHgyMTAyLAorCTB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMGNlLAorCTB4MDgwYywgMHg3MjA3LCAweDAxMjgsIDB4MDgwYywgMHg0ZWQyLCAweDAxMTAsIDB4MDgwYywgMHgyN2Q3LAorCTB4NjBkMCwgMHg5MDA1LCAweDAxYzAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4NDNlMCwgMHgwMGQwLAorCTB4MDgwYywgMHg3MjA3LCAweDExNjgsIDB4MjAxMSwgMHg3MDc2LCAweDA4MGMsIDB4ODJkYSwgMHgyMDExLAorCTB4NzA2OSwgMHgwODBjLCAweDgzYWUsIDB4MDgwYywgMHg3NTA5LCAweDA4MGMsIDB4NzEyNywgMHgwMDQwLAorCTB4MDgwYywgMHg1ZGVhLCAweDAwMjgsIDB4NjAwMywgMHgwMDA0LCAweDIwMDksIDB4NDNmOCwgMHgwMDEwLAorCTB4MDgwNCwgMHgzNGU4LCAweDIwMDEsIDB4MDE3MCwgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDA0YywgMHgxMTE4LCAweDIwOTEsIDB4MzBiZCwgMHgwODE3LCAweDIwOTEsIDB4MzAzZCwgMHgwODE3LAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDkwNCwgMHgzNTFhLCAweDIwNjksIDB4MTg1YiwgMHg3ODkwLAorCTB4Njg0MiwgMHg3ODk0LCAweDY4NDYsIDB4MmQwMCwgMHgyMDA5LCAweDAwMzAsIDB4N2E4YywgMHg3Yjg4LAorCTB4N2M5YywgMHg3ZDk4LCAweDIwMzksIDB4MDAwMSwgMHgwODA0LCAweDRiMGIsIDB4OTAwNiwgMHgwODBjLAorCTB4MjdkNywgMHg4MWZmLCAweDE5MDQsIDB4MzUxYSwgMHgwODBjLCAweDcyMDcsIDB4MTFiMCwgMHgwODBjLAorCTB4NzUwNCwgMHgwODBjLCAweDVmMmIsIDB4MDgwYywgMHgzMmU0LCAweDAxMTgsIDB4NjEzMCwgMHhjMThkLAorCTB4NjEzMiwgMHgwODBjLCAweGM1MzksIDB4MDEzMCwgMHgwODBjLCAweDcyMmEsIDB4MTExOCwgMHgwODBjLAorCTB4NzFkZiwgMHgwMDM4LCAweDA4MGMsIDB4NzEyNywgMHgwMDIwLCAweDA4MGMsIDB4NWVmMCwgMHgwODBjLAorCTB4NWRlYSwgMHgwODA0LCAweDM0ZTgsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywgMHg3MjA3LAorCTB4MTExMCwgMHgwODA0LCAweDM1MWEsIDB4NjE5MCwgMHg4MWZmLCAweDAxYTgsIDB4NzA0ZiwgMHgwMDAwLAorCTB4MjAwMSwgMHgxYzgwLCAweDIwMDksIDB4MDA0MCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAzOSwgMHgwMDAxLCAweDA4MGMsIDB4NGIwYiwgMHg3MDFmLAorCTB4MzRlNiwgMHgwMTJlLCAweDAwMDUsIDB4NzA0ZiwgMHgwMDAxLCAweDAwZDYsIDB4MjA2OSwgMHgxYzgwLAorCTB4MjBhOSwgMHgwMDQwLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLCAweDFjODAsIDB4MjAxOSwgMHhmZmZmLAorCTB4NDMwNCwgMHg2NTU4LCAweDk1ODgsIDB4MzJlOSwgMHgyMTBkLCAweDkxOGMsIDB4MDBmZiwgMHgyMTZhLAorCTB4OTAwZSwgMHgyMDExLCAweDAwMDIsIDB4MjEwMCwgMHg5NTA2LCAweDAxYTgsIDB4MDgwYywgMHg2NDlmLAorCTB4MTE5MCwgMHhiODE0LCAweDgyMWMsIDB4MDIzOCwgMHg5Mzk4LCAweDFjODAsIDB4OTA4NSwgMHhmZjAwLAorCTB4ODAwNywgMHgyMDFhLCAweDAwMzgsIDB4OTM5OCwgMHgxYzgwLCAweDIzMjQsIDB4OTRhNCwgMHhmZjAwLAorCTB4OTQwNSwgMHgyMDFhLCAweDgyMTAsIDB4ODEwOCwgMHg5MTgyLCAweDAwODAsIDB4MTIwOCwgMHgwYzE4LAorCTB4ODIwMSwgMHg4MDA3LCAweDJkMGMsIDB4OTEwNSwgMHgyMDZhLCAweDAwZGUsIDB4MjBhOSwgMHgwMDQwLAorCTB4MjBhMSwgMHgxYzgwLCAweDIwOTksIDB4MWM4MCwgMHgwODBjLCAweDVlN2IsIDB4MDgwNCwgMHg0NDUwLAorCTB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDRhYmYsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4MDgwYywgMHg1NWRiLCAweGQwYjQsIDB4MDU1OCwgMHg3ODg0LAorCTB4OTA4ZSwgMHgwMDdlLCAweDA1MzgsIDB4OTA4ZSwgMHgwMDdmLCAweDA1MjAsIDB4OTA4ZSwgMHgwMDgwLAorCTB4MDUwOCwgMHgwODBjLCAweDMyZGYsIDB4MTE0OCwgMHhiODAwLCAweGQwOGMsIDB4MTFkOCwgMHhiODA0LAorCTB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgxMWE4LCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LAorCTB4YzBmZCwgMHhhODZhLCAweDA4MGMsIDB4YzAwMiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LAorCTB4MzUxYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0NGRlLCAweDAwMDUsIDB4MDgwYywgMHg0YWYyLAorCTB4MDkwNCwgMHgzNTFkLCAweDIwYTksIDB4MDAyYiwgMHhiOGI0LCAweDIwZTAsIDB4YjhiOCwgMHgyMDk4LAorCTB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDAyLCAweDIwYTAsIDB4NDAwMywgMHgyMGE5LAorCTB4MDAwOCwgMHg5MDgwLCAweDAwMDYsIDB4MjBhMCwgMHhiOGI0LCAweDIwZTAsIDB4YjhiOCwgMHg5MDgwLAorCTB4MDAwNiwgMHgyMDk4LCAweDA4MGMsIDB4MGZhZSwgMHgwMDcwLCAweDIwYTksIDB4MDAwNCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDBhLCAweDIwYTAsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4OTA4MCwgMHgwMDBhLAorCTB4MjA5OCwgMHgwODBjLCAweDBmYWUsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLAorCTB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwMiwgMHgyMDA5LCAweDAwMmIsIDB4N2E4YywgMHg3Yjg4LAorCTB4N2M5YywgMHg3ZDk4LCAweDA4MDQsIDB4NGIwYiwgMHg4MWZmLCAweDE5MDQsIDB4MzUxYSwgMHgwODBjLAorCTB4NGFkNiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2NjExLCAweDA5MDQsIDB4MzUxYSwgMHgwMDU4LAorCTB4YTg3OCwgMHg5MDA1LCAweDAxMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MzUxYSwgMHhhOTc0LAorCTB4YWE5NCwgMHgwODA0LCAweDM0ZTgsIDB4MDgwYywgMHg1NWUzLCAweDA5MDQsIDB4MzRlOCwgMHg3MDFmLAorCTB4NDUyOCwgMHg3MDA3LCAweDAwMDMsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MzUxYSwgMHg3ODg4LAorCTB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzUxZCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwgMHgzNTFkLAorCTB4MDgwYywgMHg2N2MzLCAweDAxMjAsIDB4MDgwYywgMHg2N2NiLCAweDE5MDQsIDB4MzUxZCwgMHgwODBjLAorCTB4NjY5NiwgMHgwOTA0LCAweDM1MWEsIDB4MjAxOSwgMHgwMDA0LCAweDkwMGUsIDB4MDgwYywgMHg2NjIzLAorCTB4MDkwNCwgMHgzNTFhLCAweDc5ODQsIDB4N2E4OCwgMHgwNGM5LCAweDA4YTgsIDB4YTg5YywgMHg5MDhhLAorCTB4MTAwMCwgMHgxMmY4LCAweDA4MGMsIDB4NGFmMCwgMHgwMWUwLCAweDA4MGMsIDB4NjdjMywgMHgwMTE4LAorCTB4MDgwYywgMHg2N2NiLCAweDExYjAsIDB4MDgwYywgMHg2Njk2LCAweDIwMDksIDB4MDAwMiwgMHgwMTY4LAorCTB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweDY2MjMsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDEyMCwgMHhhOTk4LCAweGFhOWMsIDB4MDBkMSwgMHgwMDYwLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLAorCTB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLAorCTB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MDgwYywgMHg1NWUzLCAweDAxMTAsIDB4OTAwNiwgMHgwMDE4LAorCTB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4OTE4NiwgMHgwMGZmLAorCTB4MDExMCwgMHgwMDcxLCAweDAwNjAsIDB4MjAyOSwgMHgwMDdlLCAweDIwNjEsIDB4MTgwMCwgMHg2NDU4LAorCTB4MjQwMCwgMHg5NTA2LCAweDAxMTAsIDB4MjUwOCwgMHgwMDE5LCAweDg1MjksIDB4MWVjOCwgMHgwMDA1LAorCTB4MDgwYywgMHg2NDlmLCAweDExMzgsIDB4MjIwMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LAorCTB4MDgwYywgMHg4MmU4LCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4Nzk4YywgMHgyMDAxLAorCTB4MTk1OCwgMHg5MThjLCAweDgwMDAsIDB4MjEwMiwgMHgwODBjLCAweDRhZDYsIDB4MDkwNCwgMHgzNTFkLAorCTB4MDgwYywgMHg2N2MzLCAweDAxMjAsIDB4MDgwYywgMHg2N2NiLCAweDE5MDQsIDB4MzUxZCwgMHgwODBjLAorCTB4NjU2NiwgMHgwOTA0LCAweDM1MWEsIDB4MDgwYywgMHg2NjFhLCAweDA5MDQsIDB4MzUxYSwgMHgyMDAxLAorCTB4MTk1OCwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgzNGU4LCAweDA4MDQsIDB4NDUzMywgMHhhOWEwLAorCTB4MjAwMSwgMHgxOTU4LCAweDkxOGMsIDB4ODAwMCwgMHhjMThkLCAweDIxMDIsIDB4MDgwYywgMHg0YWUzLAorCTB4MDFhMCwgMHgwODBjLCAweDY3YzMsIDB4MDExOCwgMHgwODBjLCAweDY3Y2IsIDB4MTE3MCwgMHgwODBjLAorCTB4NjU2NiwgMHgyMDA5LCAweDAwMDIsIDB4MDEyOCwgMHgwODBjLCAweDY2MWEsIDB4MTE3MCwgMHgyMDA5LAorCTB4MDAwMywgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLAorCTB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHgyMDAxLAorCTB4MTk1OCwgMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwgMHgwODBjLCAweDU1ZTMsIDB4MDExMCwgMHg5MDA2LAorCTB4MDAxOCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDAwNSwgMHg4MWZmLAorCTB4MTkwNCwgMHgzNTFhLCAweDc5OGMsIDB4MjAwMSwgMHgxOTU3LCAweDkxOGMsIDB4ODAwMCwgMHgyMTAyLAorCTB4MDgwYywgMHg0YWQ2LCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY3YzMsIDB4MDEyMCwgMHgwODBjLAorCTB4NjdjYiwgMHgxOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2NTY2LCAweDA5MDQsIDB4MzUxYSwgMHgwODBjLAorCTB4NjYwOCwgMHgwOTA0LCAweDM1MWEsIDB4MjAwMSwgMHgxOTU3LCAweDIwMDQsIDB4ZDBmYywgMHgxOTA0LAorCTB4MzRlOCwgMHgwODA0LCAweDQ1MzMsIDB4YTlhMCwgMHgyMDAxLCAweDE5NTcsIDB4OTE4YywgMHg4MDAwLAorCTB4YzE4ZCwgMHgyMTAyLCAweDA4MGMsIDB4NGFlMywgMHgwMWEwLCAweDA4MGMsIDB4NjdjMywgMHgwMTE4LAorCTB4MDgwYywgMHg2N2NiLCAweDExNzAsIDB4MDgwYywgMHg2NTY2LCAweDIwMDksIDB4MDAwMiwgMHgwMTI4LAorCTB4MDgwYywgMHg2NjA4LCAweDExNzAsIDB4MjAwOSwgMHgwMDAzLCAweGE4OTcsIDB4NDAwNSwgMHhhOTlhLAorCTB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLAorCTB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4MjAwMSwgMHgxOTU3LCAweDIwMDQsIDB4ZDBmYywgMHgxMTI4LAorCTB4MDgwYywgMHg1NWUzLCAweDAxMTAsIDB4OTAwNiwgMHgwMDE4LCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAwLCAweDAwMDUsIDB4NjEwMCwgMHgwODA0LCAweDM0ZTgsIDB4MDgwYywgMHg0YWYyLAorCTB4MDkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NTVlZiwgMHgxOTA0LCAweDM1MWEsIDB4NzlhOCwgMHhkMTg0LAorCTB4MTE1OCwgMHhiODM0LCAweDgwMDcsIDB4Nzg5ZSwgMHhiODMwLCAweDgwMDcsIDB4Nzg5YSwgMHhiYjJjLAorCTB4ODMxZiwgMHhiYTI4LCAweDgyMTcsIDB4MDA1MCwgMHhiODI0LCAweDgwMDcsIDB4Nzg5ZSwgMHhiODIwLAorCTB4ODAwNywgMHg3ODlhLCAweGJiMWMsIDB4ODMxZiwgMHhiYTE4LCAweDgyMTcsIDB4YjkwMCwgMHg5MThjLAorCTB4MDIwMiwgMHgwODA0LCAweDM0ZTgsIDB4NzhhOCwgMHg5MDljLCAweDAwMDMsIDB4ZDBhYywgMHgxMTU4LAorCTB4ZDBiNCwgMHgxMTQ4LCAweDkzOWEsIDB4MDAwMywgMHgxYTA0LCAweDM1MWEsIDB4NjI1OCwgMHg3ODg0LAorCTB4OTIwNiwgMHgxOTA0LCAweDQ2ZWIsIDB4MjAzMSwgMHgxODQ4LCAweDIwMDksIDB4MDEzYywgMHgyMTM2LAorCTB4MjAwMSwgMHgxODQwLCAweDIwMDksIDB4MDAwYywgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LAorCTB4MjAzOSwgMHgwMDAxLCAweDAwMDYsIDB4NzhhOCwgMHg5MDg0LCAweDAwODAsIDB4MTFmOCwgMHgwMDA2LAorCTB4MDAzNiwgMHgyMDAxLCAweDFhNTcsIDB4MjAxYywgMHg3YjlhLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLAorCTB4MWE1OCwgMHgyMDFjLCAweDdiOWUsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE1OSwgMHgyMDFjLAorCTB4N2JhMiwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxYTUzLCAweDIwMWMsIDB4N2JhYSwgMHgyMDAzLAorCTB4MDAwMCwgMHgwMDNlLCAweDAwMGUsIDB4MDAwZSwgMHgwODA0LCAweDRiMGIsIDB4MDAwZSwgMHgyMDMxLAorCTB4MDAwMCwgMHgyMDYxLCAweDE4YjYsIDB4MmM0NCwgMHhhNjZhLCAweGExN2EsIDB4YTc3MiwgMHhhMDc2LAorCTB4YTI4ZSwgMHhhMzkyLCAweGE0OTYsIDB4YTU5YSwgMHgwODBjLCAweDExMmUsIDB4NzAwNywgMHgwMDAyLAorCTB4NzAxZiwgMHg0NzBiLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywgMHg0YWYyLAorCTB4MDkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NjdjMywgMHgxOTA0LCAweDM1MWEsIDB4MDBjNiwgMHgwODBjLAorCTB4NGFiZiwgMHgwMGNlLCAweDA5MDQsIDB4MzUxYSwgMHhhODY3LCAweDAwMDAsIDB4YTg2OCwgMHhjMGZkLAorCTB4YTg2YSwgMHg3ZWE4LCAweDA4MGMsIDB4YmZhOCwgMHgwOTA0LCAweDM1MWEsIDB4NzAwNywgMHgwMDAzLAorCTB4NzAxZiwgMHg0NzJiLCAweDAwMDUsIDB4MDgwYywgMHg0MjQ5LCAweDAwMDYsIDB4MDAzNiwgMHgyMDAxLAorCTB4MWE1NywgMHgyMDFjLCAweDdiOWEsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsIDB4MWE1OCwgMHgyMDFjLAorCTB4N2I5ZSwgMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgxYTU5LCAweDIwMWMsIDB4N2JhMiwgMHgyMDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDFhNTMsIDB4MjAxYywgMHg3YmFhLCAweDIwMDMsIDB4MDAwMCwgMHgwMDNlLAorCTB4MDAwZSwgMHgwODA0LCAweDM0ZTgsIDB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDkwNCwgMHgzNTFhLAorCTB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLAorCTB4MDAxYiwgMHgyMDA5LCAweDAwMGMsIDB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHgwODA0LAorCTB4NGIwYiwgMHg5MDA2LCAweDA4MGMsIDB4MjdkNywgMHg3OGE4LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDBmZiwgMHgwMTE4LCAweDgxZmYsIDB4MTkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NzIwNywgMHgwMTEwLAorCTB4MDgwYywgMHg1ZWYwLCAweDc4ODgsIDB4OTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MzUxZCwgMHg3OTg0LAorCTB4OTE4NiwgMHgwMGZmLCAweDAxMzgsIDB4OTE4MiwgMHgwMDdmLCAweDFhMDQsIDB4MzUxZCwgMHgyMTAwLAorCTB4MDgwYywgMHgyN2ExLCAweDAwMjYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDYxLAorCTB4MTlkMiwgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwMDAwLCAweDYwNzMsIDB4MDAwMCwgMHg2MDc3LAorCTB4MDAwMCwgMHgwODBjLCAweDcyMDcsIDB4MTE1OCwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywgMHg1ZjJiLAorCTB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NzI0ZSwgMHgwODBjLCAweDcxMjcsIDB4MDBkMCwgMHgwODBjLAorCTB4YTA2OSwgMHgyMDYxLCAweDAxMDAsIDB4MjAwMSwgMHgxODE3LCAweDIwMDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4ODEwZiwgMHg5MTA1LCAweDYwNGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyMDA5LAorCTB4MTk3MSwgMHgyMDBiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NWUxNiwgMHgwODBjLAorCTB4ODM2YywgMHg3OTg0LCAweDA4MGMsIDB4NzIwNywgMHgxMTEwLCAweDIwMDksIDB4MDBmZiwgMHg3YTg4LAorCTB4MDgwYywgMHg0NTk2LCAweDAxMmUsIDB4MDBjZSwgMHgwMDJlLCAweDA4MDQsIDB4MzRlOCwgMHg3OTg0LAorCTB4MDgwYywgMHg2NDNmLCAweDJiMDgsIDB4MTkwNCwgMHgzNTFkLCAweDA4MDQsIDB4MzRlOCwgMHg4MWZmLAorCTB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNTFhLCAweDYwZDgsIDB4ZDBhYywgMHgxMTMwLAorCTB4ZDA5YywgMHgxMTIwLCAweDIwMDksIDB4MDAwNSwgMHgwODA0LCAweDM1MWEsIDB4MDgwYywgMHg0YWJmLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNTFhLCAweDc5ODQsIDB4OTE5MiwgMHgwMDIxLAorCTB4MWEwNCwgMHgzNTFkLCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAxOSwgMHg3MDJhLCAweGFmNjAsIDB4NzczNiwgMHgwODBjLCAweDRiMDgsIDB4NzAxZiwgMHg0N2RmLAorCTB4Nzg4MCwgMHg5MDg2LCAweDAwNmUsIDB4MDExMCwgMHg3MDFmLCAweDUwODQsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDA4MCwgMHgwODBjLCAweDY0OWYsIDB4MTExOCwgMHgwODBjLCAweDY3YzMsIDB4MDEyMCwgMHgyMDIxLAorCTB4NDAwYSwgMHgwODA0LCAweDM0ZWEsIDB4MDBkNiwgMHgwMDk2LCAweGE5NjQsIDB4YWE2YywgMHhhYjcwLAorCTB4YWM3NCwgMHhhZDc4LCAweGFlN2MsIDB4YTg4NCwgMHg5MGJlLCAweDAxMDAsIDB4MDkwNCwgMHg0ODc4LAorCTB4OTBiZSwgMHgwMTEyLCAweDA5MDQsIDB4NDg3OCwgMHg5MGJlLCAweDAxMTMsIDB4MDkwNCwgMHg0ODc4LAorCTB4OTBiZSwgMHgwMTE0LCAweDA5MDQsIDB4NDg3OCwgMHg5MGJlLCAweDAxMTcsIDB4MDkwNCwgMHg0ODc4LAorCTB4OTBiZSwgMHgwMTFhLCAweDA5MDQsIDB4NDg3OCwgMHg5MGJlLCAweDAxMWMsIDB4MDkwNCwgMHg0ODc4LAorCTB4OTBiZSwgMHgwMTIxLCAweDA5MDQsIDB4NDg1ZiwgMHg5MGJlLCAweDAxMzEsIDB4MDkwNCwgMHg0ODVmLAorCTB4OTBiZSwgMHgwMTcxLCAweDA5MDQsIDB4NDg3OCwgMHg5MGJlLCAweDAxNzMsIDB4MDkwNCwgMHg0ODc4LAorCTB4OTBiZSwgMHgwMWExLCAweDExMjgsIDB4YTg5NCwgMHg4MDA3LCAweGE4OTYsIDB4MDgwNCwgMHg0ODgzLAorCTB4OTBiZSwgMHgwMjEyLCAweDA5MDQsIDB4NDg2YywgMHg5MGJlLCAweDAyMTMsIDB4MDVlOCwgMHg5MGJlLAorCTB4MDIxNCwgMHgwNTAwLCAweDkwYmUsIDB4MDIxNywgMHgwMTg4LCAweDkwYmUsIDB4MDIxYSwgMHgxMTIwLAorCTB4YTg5YywgMHg4MDA3LCAweGE4OWUsIDB4MDRlMCwgMHg5MGJlLCAweDAyMWYsIDB4MDVjOCwgMHg5MGJlLAorCTB4MDMwMCwgMHgwNWIwLCAweDAwOWUsIDB4MDBkZSwgMHgwODA0LCAweDM1MWQsIDB4NzAyOCwgMHg5MDgwLAorCTB4MDAxMCwgMHgyMDk4LCAweDIwYTAsIDB4NzAzNCwgMHgyMGUwLCAweDIwZTgsIDB4MjBhOSwgMHgwMDA3LAorCTB4MDgwYywgMHg0OGMxLCAweDcwMjgsIDB4OTA4MCwgMHgwMDBlLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LAorCTB4MjBlMCwgMHgyMGU4LCAweDIwYTksIDB4MDAwMSwgMHgwODBjLCAweDQ4YzEsIDB4MDBjOCwgMHg3MDI4LAorCTB4OTA4MCwgMHgwMDBjLCAweDIwOTgsIDB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwgMHgyMGE5LAorCTB4MDAwMSwgMHgwODBjLCAweDQ4Y2UsIDB4MDBiOCwgMHg3MDI4LCAweDkwODAsIDB4MDAwZSwgMHgyMDk4LAorCTB4MjBhMCwgMHg3MDM0LCAweDIwZTAsIDB4MjBlOCwgMHgyMGE5LCAweDAwMDEsIDB4MDgwYywgMHg0OGNlLAorCTB4NzAyOCwgMHg5MDgwLCAweDAwMGMsIDB4MjA5OCwgMHgyMGEwLCAweDcwMzQsIDB4MjBlMCwgMHgyMGU4LAorCTB4MjBhOSwgMHgwMDAxLCAweDA0ZjEsIDB4MDBjNiwgMHgwODBjLCAweDRhYmYsIDB4MDU1MCwgMHhhODY4LAorCTB4YzBmZCwgMHhhODZhLCAweGE4NjcsIDB4MDExOSwgMHg5MDA2LCAweGE4ODIsIDB4YTg3ZiwgMHgwMDIwLAorCTB4YTg4YiwgMHgwMDAxLCAweDgxMGIsIDB4YTlhZSwgMHhhOGIyLCAweGFhYjYsIDB4YWJiYSwgMHhhY2JlLAorCTB4YWRjMiwgMHhhOWM2LCAweGE4Y2EsIDB4MDBjZSwgMHgwMDllLCAweDAwZGUsIDB4YTg2NiwgMHhhODIyLAorCTB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4YTgwNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmZjMywgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzUxYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0OGI4LAorCTB4MDAwNSwgMHgwMGNlLCAweDAwOWUsIDB4MDBkZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNTFhLAorCTB4YTgyMCwgMHg5MDg2LCAweDgwMDEsIDB4MTkwNCwgMHgzNGU4LCAweDIwMDksIDB4MDAwNCwgMHgwODA0LAorCTB4MzUxYSwgMHgwMDE2LCAweDAwMjYsIDB4MzUxMCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMiwgMHg0MTA0LAorCTB4NDAwNCwgMHg4MjExLCAweDFkYzgsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDM1MjAsIDB4MjBhOSwgMHgwMDA0LCAweDQwMDIsIDB4NDMwNCwgMHg0MjA0LAorCTB4NDEwNCwgMHg0MDA0LCAweDg0MjEsIDB4MWRiOCwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzUxYSwgMHg2MGQ4LAorCTB4ZDBhYywgMHgxMTYwLCAweGQwOWMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMTYsIDB4MDgwNCwgMHgzNTFhLAorCTB4ZDA5YywgMHgxMTIwLCAweDIwMDksIDB4MDAwNSwgMHgwODA0LCAweDM1MWEsIDB4Nzk4NCwgMHg3OGE4LAorCTB4MjA0MCwgMHgwODBjLCAweGEwNjIsIDB4MTEyMCwgMHg5MTgyLCAweDAwN2YsIDB4MGEwNCwgMHgzNTFkLAorCTB4OTE4NiwgMHgwMGZmLCAweDA5MDQsIDB4MzUxZCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHgzNTFkLAorCTB4N2E4YywgMHg3Yjg4LCAweDYwNzgsIDB4OTMwNiwgMHgxMTU4LCAweDYwN2MsIDB4OTI0ZSwgMHgwOTA0LAorCTB4MzUxZCwgMHgwODBjLCAweGEwNjIsIDB4MTEyMCwgMHg5OWNjLCAweGZmMDAsIDB4MDkwNCwgMHgzNTFkLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTM4NiwgMHhmZmZmLCAweDAxNzgsIDB4MDAyNiwgMHgyMDExLAorCTB4ODAwOCwgMHgwODBjLCAweDY3ZTcsIDB4MDAyZSwgMHgwMTQwLCAweDkxOGQsIDB4ODAwMCwgMHgwODBjLAorCTB4NjgzMSwgMHgxMTE4LCAweDIwMDEsIDB4NDAwOSwgMHgwNDU4LCAweDA4MGMsIDB4NDlkOSwgMHgwNTYwLAorCTB4OTBjNiwgMHg0MDAwLCAweDExNzAsIDB4MDBjNiwgMHgwMDA2LCAweDkwMGUsIDB4MDgwYywgMHg2NmJmLAorCTB4MTEwOCwgMHhjMTg1LCAweGI4MDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDAwZSwgMHgwMGNlLAorCTB4MDBiOCwgMHg5MGM2LCAweDQwMDcsIDB4MTExMCwgMHgyNDA4LCAweDAwOTAsIDB4OTBjNiwgMHg0MDA4LAorCTB4MTExOCwgMHgyNzA4LCAweDI2MTAsIDB4MDA2MCwgMHg5MGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDQwLAorCTB4OTBjNiwgMHg0MDA2LCAweDExMDgsIDB4MDAyMCwgMHgyMDAxLCAweDQwMDUsIDB4MjAwOSwgMHgwMDBhLAorCTB4MjAyMCwgMHgwMTJlLCAweDA4MDQsIDB4MzRlYSwgMHgyYjAwLCAweDcwMjYsIDB4MDAxNiwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMGU2LCAweDJjNzAsIDB4MDgwYywgMHhhMTMwLCAweDA5MDQsIDB4NDlhNiwgMHgyYjAwLAorCTB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4MmU1OCwgMHgwMGVlLCAweDAwZTYsIDB4MDBjNiwgMHgwODBjLAorCTB4NGFiZiwgMHgwMGNlLCAweDJiNzAsIDB4MTE1OCwgMHgwODBjLCAweGEwZTMsIDB4MDBlZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMDFlLCAweDAxMmUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwgMHg5MDBlLAorCTB4YTk2NiwgMHhhOTZhLCAweDI5MDAsIDB4NjAxNiwgMHhhOTMyLCAweGE4NjgsIDB4YzBmZCwgMHhkODhjLAorCTB4MDEwOCwgMHhjMGY1LCAweGE4NmEsIDB4MDgwYywgMHgzMThiLCAweDYwMjMsIDB4MDAwMSwgMHg5MDA2LAorCTB4MDgwYywgMHg2M2RjLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDYzZjAsIDB4MjAwOSwgMHgwMDAyLAorCTB4MDgwYywgMHhhMTVkLCAweDc4YTgsIDB4ZDA5NCwgMHgwMTM4LCAweDAwZWUsIDB4NzAyNCwgMHgwMGU2LAorCTB4MjA1OCwgMHhiOGJjLCAweGMwOGQsIDB4YjhiZSwgMHg5MDg1LCAweDAwMDEsIDB4MDBlZSwgMHgwMGNlLAorCTB4MDBiZSwgMHgwMDFlLCAweDAxMmUsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNTFhLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NDliNSwgMHgwMDA1LCAweGE4MzAsIDB4MjAwOCwgMHg5MThlLAorCTB4ZGVhZCwgMHgxMTIwLCAweDIwMjEsIDB4NDAwOSwgMHgwODA0LCAweDM0ZWEsIDB4OTA4NiwgMHgwMTAwLAorCTB4NzAyNCwgMHgyMDU4LCAweDExMzgsIDB4MjAwOSwgMHgwMDA0LCAweGJhMDQsIDB4OTI5NCwgMHgwMGZmLAorCTB4MDgwNCwgMHg1NTJmLCAweDkwMGUsIDB4YTg2OCwgMHhkMGY0LCAweDE5MDQsIDB4MzRlOCwgMHgwODBjLAorCTB4NjZiZiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwODA0LAorCTB4MzRlOCwgMHgwMGU2LCAweDAwZDYsIDB4MDA5NiwgMHg4M2ZmLCAweDA5MDQsIDB4NGEyMSwgMHg5MDJlLAorCTB4MDgwYywgMHhhMDYyLCAweDAxMzAsIDB4OTAyNiwgMHgyMGE5LCAweDA4MDAsIDB4MjA3MSwgMHgxMDAwLAorCTB4MDAzMCwgMHgyMDIxLCAweDAwN2YsIDB4MjBhOSwgMHgwNzgxLCAweDIwNzEsIDB4MTA3ZiwgMHgyZTA0LAorCTB4OTAwNSwgMHgxMWIwLCAweDIxMDAsIDB4OTQwNiwgMHgxNWU4LCAweDI0MjgsIDB4OTRjZSwgMHgwMDdmLAorCTB4MTEyMCwgMHg5MmNlLCAweGZmZmQsIDB4MTUyOCwgMHgwMDMwLCAweDk0Y2UsIDB4MDA4MCwgMHgxMTMwLAorCTB4OTJjZSwgMHhmZmZjLCAweDExZjAsIDB4OTNjZSwgMHgwMGZmLCAweDExZDgsIDB4YzVmZCwgMHgwNDUwLAorCTB4MjA1OCwgMHhiZjEwLCAweDI3MDAsIDB4OTMwNiwgMHgxMWI4LCAweGJlMTQsIDB4MjYwMCwgMHg5MjA2LAorCTB4MTE5OCwgMHgyNDAwLCAweDkxMDYsIDB4MTE1MCwgMHhkODg0LCAweDA1NjgsIDB4ZDg5NCwgMHgxNTU4LAorCTB4MDgwYywgMHg2N2MzLCAweDE1NDAsIDB4MjAwMSwgMHg0MDAwLCAweDA0MzAsIDB4MjAwMSwgMHg0MDA3LAorCTB4MDQxOCwgMHgyMDAxLCAweDQwMDYsIDB4MDQwMCwgMHgyNDAwLCAweDkxMDYsIDB4MTE1OCwgMHhiZTE0LAorCTB4ODdmZiwgMHgxMTI4LCAweDg2ZmYsIDB4MDk0OCwgMHgwODBjLCAweGEwNjIsIDB4MTkzMCwgMHgyMDAxLAorCTB4NDAwOCwgMHgwMDkwLCAweDg0MjAsIDB4OGU3MCwgMHgxZjA0LCAweDQ5ZWYsIDB4ODVmZiwgMHgxMTMwLAorCTB4MjAwMSwgMHg0MDA5LCAweDAwNDgsIDB4MjAwMSwgMHgwMDAxLCAweDAwMzAsIDB4MDgwYywgMHg2NDNmLAorCTB4MWRkMCwgMHhiYjEyLCAweGJhMTYsIDB4OTAwNiwgMHg5MDA1LCAweDAwOWUsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzUxYSwgMHgwODBjLAorCTB4NGFiZiwgMHgxMTIwLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4YTg2NywgMHgwMDAwLAorCTB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4Nzg4NCwgMHg5MDA1LCAweDA5MDQsIDB4MzUxZCwgMHg5MDk2LAorCTB4MDBmZiwgMHgwMTIwLCAweDkwOTIsIDB4MDAwNCwgMHgxYTA0LCAweDM1MWQsIDB4MjAxMCwgMHgyOTE4LAorCTB4MDgwYywgMHgzMTMxLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MzUxYSwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDFmLCAweDRhNzQsIDB4MDAwNSwgMHhhODMwLCAweDkwODYsIDB4MDEwMCwgMHgxOTA0LAorCTB4MzRlOCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgzNTFhLCAweDc5ODQsIDB4MDgwYywgMHhhMDYyLAorCTB4MTEyMCwgMHg5MTgyLCAweDAwN2YsIDB4MGEwNCwgMHgzNTFkLCAweDkxODYsIDB4MDBmZiwgMHgwOTA0LAorCTB4MzUxZCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHgzNTFkLCAweDIwMDEsIDB4OTQwMCwgMHgwODBjLAorCTB4NTU4YSwgMHgxOTA0LCAweDM1MWEsIDB4MDgwNCwgMHgzNGU4LCAweGE5OTgsIDB4MDgwYywgMHhhMDYyLAorCTB4MTExOCwgMHg5MTgyLCAweDAwN2YsIDB4MDI4MCwgMHg5MTg2LCAweDAwZmYsIDB4MDE2OCwgMHg5MTgyLAorCTB4MDgwMCwgMHgxMjUwLCAweDIwMDEsIDB4OTQwMCwgMHgwODBjLCAweDU1OGEsIDB4MTFhOCwgMHgwMDYwLAorCTB4YTg5NywgMHg0MDA1LCAweGE5OWEsIDB4MDAxMCwgMHhhODk3LCAweDQwMDYsIDB4OTAwZSwgMHg5MDg1LAorCTB4MDAwMSwgMHgyMDAxLCAweDAwMzAsIDB4MDAwNSwgMHhhODk3LCAweDQwMDAsIDB4OTAwZSwgMHg5MDg1LAorCTB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDAwNSwgMHgyMDA5LCAweDAwMGEsIDB4MGM0OCwgMHgwODBjLAorCTB4MTAzMSwgMHgwMTk4LCAweDkwMDYsIDB4YTgwMiwgMHg3MDE0LCAweDkwMDUsIDB4MTEyMCwgMHgyOTAwLAorCTB4NzAxNiwgMHg3MDFhLCAweDAwNDAsIDB4NzAxOCwgMHhhODAyLCAweDAwODYsIDB4MjA0MCwgMHgyOTAwLAorCTB4YTAwNiwgMHg3MDFhLCAweDAwOGUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4Nzk4NCwgMHgwODBjLAorCTB4NjQ5ZiwgMHgxMTMwLCAweDdlODgsIDB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgwMjA4LAorCTB4OTA1ZSwgMHg4YmZmLCAweDAwMDUsIDB4YTk5OCwgMHgwODBjLCAweDY0OWYsIDB4MTEzMCwgMHhhZTljLAorCTB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgwMjA4LCAweDkwNWUsIDB4OGJmZiwgMHgwMDA1LAorCTB4YWU5OCwgMHgwMDA4LCAweDdlODQsIDB4MjYwOCwgMHgwODBjLCAweDY0OWYsIDB4MTEwOCwgMHgwMDA4LAorCTB4OTA1ZSwgMHg4YmZmLCAweDAwMDUsIDB4MDAxNiwgMHg3MTE0LCAweDgxZmYsIDB4MDEyOCwgMHgyMTQ4LAorCTB4YTkwNCwgMHgwODBjLCAweDEwNjMsIDB4MGNjOCwgMHg3MTE2LCAweDcxMWEsIDB4MDAxZSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMDAxLCAweDAwMTAsIDB4MjAzMSwgMHgwMDAwLCAweDIwNjEsIDB4MThiNiwgMHgyYzQ0LAorCTB4YTY2YSwgMHhhMTdhLCAweGE3NzIsIDB4YTA3NiwgMHhhMjhlLCAweGEzOTIsIDB4YTQ5NiwgMHhhNTlhLAorCTB4MDgwYywgMHgxMTJlLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFmLCAweDM0ZTgsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMDAwLCAweDIwMDEsIDB4MThhZSwgMHgyMDA0LAorCTB4OTAwNSwgMHgxMTkwLCAweDBlMDQsIDB4NGIzYywgMHg3YTM2LCAweDc4MzMsIDB4MDAxMiwgMHg3YTgyLAorCTB4N2I4NiwgMHg3YzhhLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWUwLCAweDA4MDQsIDB4NGJhMiwgMHgwMDE2LCAweDAwODYsIDB4MDA5NiwgMHgwMGM2LAorCTB4MDBlNiwgMHgyMDcxLCAweDE4OWMsIDB4NzA0NCwgMHg5MDA1LCAweDE1NDAsIDB4NzE0OCwgMHg5MTgyLAorCTB4MDAxMCwgMHgwMjg4LCAweDcwMzgsIDB4MjA2MCwgMHgwODBjLCAweDEwMzEsIDB4MDkwNCwgMHg0YjlhLAorCTB4YTg0YiwgMHgwMDAwLCAweDI5MDAsIDB4NzA0NiwgMHgyMDAxLCAweDAwMDIsIDB4OTA4MCwgMHgxZmM4LAorCTB4MjAwNSwgMHhhODQ2LCAweDAwOTgsIDB4NzAzOCwgMHg5MGUwLCAweDAwMDQsIDB4MjAwMSwgMHgxOGI4LAorCTB4OWM4MiwgMHgxOGY4LCAweDAyMTAsIDB4MjA2MSwgMHgxOGI4LCAweDJjMDAsIDB4NzAzYSwgMHg3MTQ4LAorCTB4ODFmZiwgMHgxMTA4LCAweDcwM2UsIDB4ODEwOCwgMHg3MTRhLCAweDA0NjAsIDB4NzE0OCwgMHg4MTA4LAorCTB4NzE0YSwgMHg3MDQ0LCAweDIwNDAsIDB4YTE0NCwgMHgyMTA1LCAweDAwMTYsIDB4OTA4YSwgMHgwMDM2LAorCTB4MWEwYywgMHgwZGZhLCAweDIwNjAsIDB4MDAxZSwgMHg4MTA4LCAweDIxMDUsIDB4OTAwNSwgMHhhMTQ2LAorCTB4MTUyMCwgMHgwODBjLCAweDEwMzEsIDB4MTEzMCwgMHg4MTA5LCAweGE5NDYsIDB4NzE0OCwgMHg4MTA5LAorCTB4NzE0YSwgMHgwMGQ4LCAweDkwMDYsIDB4YTgwNiwgMHhhODRhLCAweGEwNDYsIDB4MjgwMCwgMHhhODAyLAorCTB4MjkwMCwgMHhhMDA2LCAweDcwNDYsIDB4MjAwMSwgMHgwMDAyLCAweDkwODAsIDB4MWZjOCwgMHgyMDA1LAorCTB4YTg0NiwgMHgwMDU4LCAweDIyNjIsIDB4NjMwNiwgMHg2NDBhLCAweDAwZWUsIDB4MDBjZSwgMHgwMDllLAorCTB4MDA4ZSwgMHgwMDFlLCAweDAxMmUsIDB4MDBmZSwgMHgwMDA1LCAweDJjMDAsIDB4OTA4MiwgMHgwMDFiLAorCTB4MDAwMiwgMHg0YmM0LCAweDRiYzQsIDB4NGJjNiwgMHg0YmM0LCAweDRiYzQsIDB4NGJjNCwgMHg0YmNhLAorCTB4NGJjNCwgMHg0YmM0LCAweDRiYzQsIDB4NGJjZSwgMHg0YmM0LCAweDRiYzQsIDB4NGJjNCwgMHg0YmQyLAorCTB4NGJjNCwgMHg0YmM0LCAweDRiYzQsIDB4NGJkNiwgMHg0YmM0LCAweDRiYzQsIDB4NGJjNCwgMHg0YmRhLAorCTB4NGJjNCwgMHg0YmM0LCAweDRiYzQsIDB4NGJkZiwgMHgwODBjLCAweDBkZmEsIDB4YTI3NiwgMHhhMzdhLAorCTB4YTQ3ZSwgMHgwODk4LCAweGEyODYsIDB4YTM4YSwgMHhhNDhlLCAweDA4NzgsIDB4YTI5NiwgMHhhMzlhLAorCTB4YTQ5ZSwgMHgwODU4LCAweGEyYTYsIDB4YTNhYSwgMHhhNGFlLCAweDA4MzgsIDB4YTJiNiwgMHhhM2JhLAorCTB4YTRiZSwgMHgwODE4LCAweGEyYzYsIDB4YTNjYSwgMHhhNGNlLCAweDA4MDQsIDB4NGI5ZCwgMHhhMmQ2LAorCTB4YTNkYSwgMHhhNGRlLCAweDA4MDQsIDB4NGI5ZCwgMHgwMGU2LCAweDIwNzEsIDB4MTg5YywgMHg3MDQ4LAorCTB4OTAwNSwgMHgwOTA0LCAweDRjNzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg0Yzc1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAwMDAsIDB4MDBjNiwgMHgwMDk2LCAweDAwODYsIDB4MDA3NiwgMHg5MDA2LAorCTB4MjAzOCwgMHg3MDQwLCAweDIwNDgsIDB4OTAwNSwgMHgwNTAwLCAweGE5NDgsIDB4MjEwNSwgMHgwMDE2LAorCTB4OTA4YSwgMHgwMDM2LCAweDFhMGMsIDB4MGRmYSwgMHgyMDYwLCAweDAwMWUsIDB4ODEwOCwgMHgyMTA1LAorCTB4OTAwNSwgMHhhOTRhLCAweDE5MDQsIDB4NGM3OCwgMHhhODA0LCAweDkwMDUsIDB4MDkwYywgMHgwZGZhLAorCTB4NzA0MiwgMHgyOTM4LCAweDIwNDAsIDB4YTAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMiwgMHg5MDgwLAorCTB4MWZjOCwgMHgyMDA1LCAweGEwNGEsIDB4MDgwNCwgMHg0Yzc4LCAweDcwM2MsIDB4MjA2MCwgMHgyYzE0LAorCTB4NjMwNCwgMHg2NDA4LCAweDY1MGMsIDB4MjIwMCwgMHg3ODM2LCAweDc4MzMsIDB4MDAxMiwgMHg3ODgyLAorCTB4MjMwMCwgMHg3ODg2LCAweDI0MDAsIDB4Nzg4YSwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LAorCTB4MjAwNCwgMHhkMDg0LCAweDE5MGMsIDB4MTFlMCwgMHg4N2ZmLCAweDAxMTgsIDB4Mjc0OCwgMHgwODBjLAorCTB4MTA2MywgMHg3MDQ4LCAweDgwMDEsIDB4NzA0YSwgMHg5MDA1LCAweDExNzAsIDB4NzA0MCwgMHgyMDQ4LAorCTB4OTAwNSwgMHgwMTI4LCAweDA4MGMsIDB4MTA2MywgMHg5MDA2LCAweDcwNDIsIDB4NzA0NiwgMHg3MDNiLAorCTB4MThiOCwgMHg3MDNmLCAweDE4YjgsIDB4MDQyMCwgMHg3MDQwLCAweDkwMDUsIDB4MTUwOCwgMHg3MjM4LAorCTB4MmMwMCwgMHg5MjA2LCAweDAxNDgsIDB4OWM4MCwgMHgwMDA0LCAweDkwZmEsIDB4MThmOCwgMHgwMjEwLAorCTB4MjAwMSwgMHgxOGI4LCAweDcwM2UsIDB4MDBhMCwgMHg5MDA2LCAweDcwM2UsIDB4NzAzYSwgMHg3MDQ0LAorCTB4OTAwNSwgMHgwOTBjLCAweDBkZmEsIDB4MjA0OCwgMHhhODAwLCAweDkwMDUsIDB4MWRlMCwgMHgyOTAwLAorCTB4NzA0MiwgMHgyMDAxLCAweDAwMDIsIDB4OTA4MCwgMHgxZmM4LCAweDIwMDUsIDB4YTg0YSwgMHgwMDAwLAorCTB4MDA3ZSwgMHgwMDhlLCAweDAwOWUsIDB4MDBjZSwgMHgwMGZlLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MmMwMCwgMHg5MDgyLCAweDAwMWIsIDB4MDAwMiwgMHg0Yzk3LCAweDRjOTcsIDB4NGM5OSwgMHg0Yzk3LAorCTB4NGM5NywgMHg0Yzk3LCAweDRjOWUsIDB4NGM5NywgMHg0Yzk3LCAweDRjOTcsIDB4NGNhMywgMHg0Yzk3LAorCTB4NGM5NywgMHg0Yzk3LCAweDRjYTgsIDB4NGM5NywgMHg0Yzk3LCAweDRjOTcsIDB4NGNhZCwgMHg0Yzk3LAorCTB4NGM5NywgMHg0Yzk3LCAweDRjYjIsIDB4NGM5NywgMHg0Yzk3LCAweDRjOTcsIDB4NGNiNywgMHgwODBjLAorCTB4MGRmYSwgMHhhYTc0LCAweGFiNzgsIDB4YWM3YywgMHgwODA0LCAweDRjMjMsIDB4YWE4NCwgMHhhYjg4LAorCTB4YWM4YywgMHgwODA0LCAweDRjMjMsIDB4YWE5NCwgMHhhYjk4LCAweGFjOWMsIDB4MDgwNCwgMHg0YzIzLAorCTB4YWFhNCwgMHhhYmE4LCAweGFjYWMsIDB4MDgwNCwgMHg0YzIzLCAweGFhYjQsIDB4YWJiOCwgMHhhY2JjLAorCTB4MDgwNCwgMHg0YzIzLCAweGFhYzQsIDB4YWJjOCwgMHhhY2NjLCAweDA4MDQsIDB4NGMyMywgMHhhYWQ0LAorCTB4YWJkOCwgMHhhY2RjLCAweDA4MDQsIDB4NGMyMywgMHgwMDI2LCAweDA4MGMsIDB4NTVkYiwgMHhkMGM0LAorCTB4MDEyMCwgMHgyMDExLCAweDgwMTQsIDB4MDgwYywgMHg0YjFmLCAweDAwMmUsIDB4MDAwNSwgMHg4MWZmLAorCTB4MTkwNCwgMHgzNTFhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMzAsIDB4YzA4ZCwgMHhjMDg1LAorCTB4YzBhYywgMHg2MDMyLCAweDA4MGMsIDB4NzIwNywgMHgxMTU4LCAweDA4MGMsIDB4NzUwNCwgMHgwODBjLAorCTB4NWYyYiwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg3MjRlLCAweDA4MGMsIDB4NzEyNywgMHgwMDEwLAorCTB4MDgwYywgMHg1ZGVhLCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LAorCTB4MDAwMSwgMHgwODA0LCAweDM1MWEsIDB4MDgwYywgMHg1NWVmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LAorCTB4MDgwNCwgMHgzNTFhLCAweDA4MGMsIDB4NjdiYiwgMHgwMTIwLCAweDIwMDksIDB4MDAwOCwgMHgwODA0LAorCTB4MzUxYSwgMHgwMDI2LCAweDIwMTEsIDB4MDAxMCwgMHgwODBjLCAweDY3ZTcsIDB4MDAyZSwgMHgwMTQwLAorCTB4Nzk4NCwgMHgwODBjLCAweDY4MzEsIDB4MTEyMCwgMHgyMDA5LCAweDQwMDksIDB4MDgwNCwgMHgzNTFhLAorCTB4Nzk4NCwgMHgwODBjLCAweDY0M2YsIDB4MTkwNCwgMHgzNTFkLCAweDA4MGMsIDB4NGFmMiwgMHgwOTA0LAorCTB4MzUxZCwgMHgyYjAwLCAweDcwMjYsIDB4MDgwYywgMHg2N2MzLCAweDc4ODgsIDB4MTE3MCwgMHg5MDg0LAorCTB4MDAwNSwgMHgxMTU4LCAweDkwMGUsIDB4MDgwYywgMHg2NmJmLCAweDExMDgsIDB4YzE4NSwgMHhiODAwLAorCTB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4NGFiZiwgMHgwOTA0LAorCTB4MzUxYSwgMHg5MDA2LCAweGE4NjYsIDB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLAorCTB4YzA2MSwgMHgwOTA0LCAweDM1MWEsIDB4Nzg4OCwgMHhkMDk0LCAweDAxMTgsIDB4YjhiYywgMHhjMDhkLAorCTB4YjhiZSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg0ZDg3LCAweDAwMDUsIDB4MjA2MSwgMHgxODAwLAorCTB4MDgwYywgMHg1NWVmLCAweDIwMDksIDB4MDAwNywgMHgxNTYwLCAweDA4MGMsIDB4NjdiYiwgMHgwMTE4LAorCTB4MjAwOSwgMHgwMDA4LCAweDA0MzAsIDB4YTk5OCwgMHgwODBjLCAweDY0M2YsIDB4MTUzMCwgMHgwODBjLAorCTB4NGFmMCwgMHgwNTE4LCAweDA4MGMsIDB4NjdjMywgMHhhODljLCAweDExNjgsIDB4OTA4NCwgMHgwMDA1LAorCTB4MTE1MCwgMHg5MDBlLCAweDA4MGMsIDB4NjZiZiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLAorCTB4MDEwOCwgMHhjMThkLCAweDAwZDAsIDB4YTg2OCwgMHhjMGZjLCAweGE4NmEsIDB4MDgwYywgMHhjMDYxLAorCTB4MTFlMCwgMHhhODljLCAweGQwOTQsIDB4MDExOCwgMHhiOGJjLCAweGMwOGQsIDB4YjhiZSwgMHgyMDA5LAorCTB4MDAwMywgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLAorCTB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHhhOTlhLAorCTB4OTAwNiwgMHg5MThkLCAweDAwMDEsIDB4MjAwOCwgMHgwMDA1LCAweDkwMDYsIDB4MDAwNSwgMHhhODMwLAorCTB4MjAwOCwgMHg5MThlLCAweGRlYWQsIDB4MTEyMCwgMHgyMDIxLCAweDQwMDksIDB4MDgwNCwgMHgzNGVhLAorCTB4OTA4NiwgMHgwMTAwLCAweDcwMjQsIDB4MjA1OCwgMHgxMTEwLCAweDA4MDQsIDB4NTUyZiwgMHg5MDBlLAorCTB4MDgwYywgMHg2NmJmLCAweDExMDgsIDB4YzE4NSwgMHhiODAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLAorCTB4MDgwNCwgMHgzNGU4LCAweDA4MGMsIDB4NTVlZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LAorCTB4MzUxYSwgMHg3Zjg0LCAweDdhOGMsIDB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4MDgwYywgMHg0YWJmLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNTFhLCAweDkwMGUsIDB4MjEzMCwgMHg3MTI2LAorCTB4NzEzMiwgMHhhODYwLCAweDIwZTgsIDB4NzAzNiwgMHhhODVjLCAweDkwODAsIDB4MDAwNSwgMHg3MDJhLAorCTB4MjBhMCwgMHgwODBjLCAweDY0OWYsIDB4MTkwNCwgMHg0ZTI1LCAweDA4MGMsIDB4NjdjMywgMHgwMTIwLAorCTB4MDgwYywgMHg2N2NiLCAweDE5MDQsIDB4NGUyNSwgMHgwODBjLCAweDY3YmIsIDB4MTEzMCwgMHgwODBjLAorCTB4NjZiZiwgMHgxMTE4LCAweGQ3OWMsIDB4MDkwNCwgMHg0ZTI1LCAweGQ3OTQsIDB4MTExMCwgMHhkNzg0LAorCTB4MDFhOCwgMHhiOGI0LCAweDIwZTAsIDB4YjhiOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwgMHgzNDAwLAorCTB4ZDc5NCwgMHgwMTYwLCAweDIwYTksIDB4MDAwOCwgMHg0MDAzLCAweDIwOTgsIDB4MjBhMCwgMHgzZDAwLAorCTB4MjBlMCwgMHgyMGE5LCAweDAwMDIsIDB4MDgwYywgMHg0OGNlLCAweDAwNDgsIDB4MjBhOSwgMHgwMDA0LAorCTB4NDAwMywgMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwgMHgyMGUwLCAweDA4MGMsIDB4NDhjZSwgMHg0MTA0LAorCTB4ZDc5NCwgMHgwNTI4LCAweGI4YjQsIDB4MjBlMCwgMHhiOGI4LCAweDIwNjAsIDB4OWM4MCwgMHgwMDAwLAorCTB4MjA5OCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMywgMHg5YzgwLCAweDAwMDMsIDB4MjA5OCwgMHgyMGE5LAorCTB4MDAwMSwgMHg0MDA1LCAweDljODAsIDB4MDAwNCwgMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDAyLAorCTB4NDAwMywgMHgyMDk4LCAweDIwYTAsIDB4M2QwMCwgMHgyMGUwLCAweDA4MGMsIDB4NDhjMSwgMHg5YzgwLAorCTB4MDAyNiwgMHgyMDk4LCAweGI4YjQsIDB4MjBlMCwgMHgyMGE5LCAweDAwMDIsIDB4NDAwMywgMHhkNzk0LAorCTB4MDExMCwgMHg5NmIwLCAweDAwMGIsIDB4OTZiMCwgMHgwMDA1LCAweDgxMDgsIDB4MDgwYywgMHhhMDYyLAorCTB4MDExOCwgMHg5MTg2LCAweDA4MDAsIDB4MDA0MCwgMHhkNzhjLCAweDAxMjAsIDB4OTE4NiwgMHgwODAwLAorCTB4MDE3MCwgMHgwMDE4LCAweDkxODYsIDB4MDA3ZSwgMHgwMTUwLCAweGQ3OTQsIDB4MDExOCwgMHg5Njg2LAorCTB4MDAyMCwgMHgwMDEwLCAweDk2ODYsIDB4MDAyOCwgMHgwMTUwLCAweDA4MDQsIDB4NGRjMSwgMHg4NmZmLAorCTB4MTEyMCwgMHg3MTI0LCAweDgxMGIsIDB4MDgwNCwgMHgzNGU4LCAweDcwMzMsIDB4MDAwMSwgMHg3MTIyLAorCTB4NzAyNCwgMHg5NjAwLCAweDcwMjYsIDB4NzcyZSwgMHgyMDYxLCAweDE4YjYsIDB4MmM0NCwgMHhhMDZiLAorCTB4MDAwMCwgMHhhNjdhLCAweDcwMzQsIDB4YTA3MiwgMHg3MDI4LCAweGEwNzYsIDB4YTI4ZSwgMHhhMzkyLAorCTB4YTQ5NiwgMHhhNTlhLCAweDA4MGMsIDB4MTEyZSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxZiwgMHg0ZTYxLAorCTB4MDAwNSwgMHg3MDMwLCAweDkwMDUsIDB4MTE4MCwgMHg3MTIwLCAweDcwMjgsIDB4MjBhMCwgMHg3NzJjLAorCTB4OTAzNiwgMHg3MDM0LCAweDIwZTgsIDB4MjA2MSwgMHgxOGI2LCAweDJjNDQsIDB4YTI4YywgMHhhMzkwLAorCTB4YTQ5NCwgMHhhNTk4LCAweDA4MDQsIDB4NGRjMSwgMHg3MTI0LCAweDgxMGIsIDB4MDgwNCwgMHgzNGU4LAorCTB4MjAyOSwgMHgwMDdlLCAweDc5ODQsIDB4N2E4OCwgMHg3YjhjLCAweDdjOTgsIDB4OTE4NCwgMHhmZjAwLAorCTB4ODAwNywgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNTFkLCAweDk1MDIsIDB4MGEwNCwgMHgzNTFkLAorCTB4OTE4NCwgMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1MWQsIDB4OTUwMiwgMHgwYTA0LAorCTB4MzUxZCwgMHg5Mjg0LCAweGZmMDAsIDB4ODAwNywgMHg5MGUyLCAweDAwMjAsIDB4MGEwNCwgMHgzNTFkLAorCTB4OTUwMiwgMHgwYTA0LCAweDM1MWQsIDB4OTI4NCwgMHgwMGZmLCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LAorCTB4MzUxZCwgMHg5NTAyLCAweDBhMDQsIDB4MzUxZCwgMHg5Mzg0LCAweGZmMDAsIDB4ODAwNywgMHg5MGUyLAorCTB4MDAyMCwgMHgwYTA0LCAweDM1MWQsIDB4OTUwMiwgMHgwYTA0LCAweDM1MWQsIDB4OTM4NCwgMHgwMGZmLAorCTB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzUxZCwgMHg5NTAyLCAweDBhMDQsIDB4MzUxZCwgMHg5NDg0LAorCTB4ZmYwMCwgMHg4MDA3LCAweDkwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDM1MWQsIDB4OTUwMiwgMHgwYTA0LAorCTB4MzUxZCwgMHg5NDg0LCAweDAwZmYsIDB4OTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MzUxZCwgMHg5NTAyLAorCTB4MGEwNCwgMHgzNTFkLCAweDIwNjEsIDB4MTk2MSwgMHg2MTAyLCAweDYyMDYsIDB4NjMwYSwgMHg2NDBlLAorCTB4MDgwNCwgMHgzNGU4LCAweDAwMDYsIDB4MDgwYywgMHg1NWRiLCAweGQwY2MsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwODBjLCAweDU1ZGYsIDB4ZDBiYywgMHgwMDBlLCAweDAwMDUsIDB4NjE3MCwgMHg3YTg0LAorCTB4NjMwMCwgMHg4MmZmLCAweDExMTgsIDB4Nzk4NiwgMHgwODA0LCAweDM0ZTgsIDB4ODNmZiwgMHgxOTA0LAorCTB4MzUxZCwgMHgyMDAxLCAweGZmZjAsIDB4OTIwMCwgMHgxYTA0LCAweDM1MWQsIDB4MjAxOSwgMHhmZmZmLAorCTB4NjA3NCwgMHg5MzAyLCAweDkyMDAsIDB4MGEwNCwgMHgzNTFkLCAweDc5ODYsIDB4NjI3MiwgMHgwODA0LAorCTB4MzRlOCwgMHgwODBjLCAweDU1ZWYsIDB4MTkwNCwgMHgzNTFhLCAweDdjODgsIDB4N2Q4NCwgMHg3ZTk4LAorCTB4N2Y4YywgMHgwODBjLCAweDRhYmYsIDB4MDkwNCwgMHgzNTFhLCAweDkwMGUsIDB4OTAxZSwgMHg3MzI2LAorCTB4NzMzMiwgMHhhODYwLCAweDIwZTgsIDB4NzAzNiwgMHhhODVjLCAweDkwODAsIDB4MDAwMywgMHg3MDJhLAorCTB4MjBhMCwgMHg5MWQ4LCAweDEwMDAsIDB4MmI1YywgMHg4YmZmLCAweDAxNzgsIDB4MDgwYywgMHg2N2MzLAorCTB4MDExOCwgMHgwODBjLCAweDY3Y2IsIDB4MTE0OCwgMHgyMGE5LCAweDAwMDEsIDB4YjgxNCwgMHg0MDA0LAorCTB4YjgxMCwgMHg0MDA0LCAweDQxMDQsIDB4OTM5OCwgMHgwMDAzLCAweDgxMDgsIDB4OTE4MiwgMHgwODAwLAorCTB4MDEyMCwgMHg5Mzg2LCAweDAwM2MsIDB4MDE3MCwgMHgwYzIwLCAweDgzZmYsIDB4MTE0OCwgMHg3MjI0LAorCTB4OTAwZSwgMHgyMDAxLCAweDAwMDMsIDB4MDgwYywgMHg4NGZmLCAweDIyMDgsIDB4MDgwNCwgMHgzNGU4LAorCTB4NzAzMywgMHgwMDAxLCAweDcxMjIsIDB4NzAyNCwgMHg5MzAwLCAweDcwMjYsIDB4MjA2MSwgMHgxOGI2LAorCTB4MmM0NCwgMHhhMDZiLCAweDAwMDAsIDB4YTM3YSwgMHg3MDI4LCAweGEwNzYsIDB4NzAzNCwgMHhhMDcyLAorCTB4YTQ4ZSwgMHhhNTkyLCAweGE2OTYsIDB4YTc5YSwgMHgwODBjLCAweDExMmUsIDB4NzAwNywgMHgwMDAyLAorCTB4NzAxZiwgMHg0ZjUzLCAweDAwMDUsIDB4NzAzMCwgMHg5MDA1LCAweDExNzgsIDB4NzEyMCwgMHg3MDI4LAorCTB4MjBhMCwgMHg5MDFlLCAweDcwMzQsIDB4MjBlOCwgMHgyMDYxLCAweDE4YjYsIDB4MmM0NCwgMHhhNDhjLAorCTB4YTU5MCwgMHhhNjk0LCAweGE3OTgsIDB4MDgwNCwgMHg0ZjExLCAweDcyMjQsIDB4OTAwZSwgMHgyMDAxLAorCTB4MDAwMywgMHgwODBjLCAweDg0ZmYsIDB4MjIwOCwgMHgwODA0LCAweDM0ZTgsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDgwYywgMHg1NWVmLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LCAweDRmZTYsIDB4MjA3MSwgMHgxODljLAorCTB4NzQ1YywgMHg4NGZmLCAweDIwMDksIDB4MDAwZSwgMHgxOTA0LCAweDRmZTYsIDB4YWM5YywgMHhhZDk4LAorCTB4YWVhNCwgMHhhZmEwLCAweDAwOTYsIDB4MDgwYywgMHgxMDRhLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LAorCTB4NGZlNiwgMHgyOTAwLCAweDcwNWUsIDB4OTAwZSwgMHg5MDFlLCAweDczNTYsIDB4NzM2MiwgMHhhODYwLAorCTB4NzA2NiwgMHhhODVjLCAweDkwODAsIDB4MDAwMywgMHg3MDVhLCAweDIwYTAsIDB4OTFkOCwgMHgxMDAwLAorCTB4MmI1YywgMHg4YmZmLCAweDAxNzgsIDB4MDgwYywgMHg2N2MzLCAweDAxMTgsIDB4MDgwYywgMHg2N2NiLAorCTB4MTE0OCwgMHhiODE0LCAweDIwYTksIDB4MDAwMSwgMHg0MDA0LCAweGI4MTAsIDB4NDAwNCwgMHg0MTA0LAorCTB4OTM5OCwgMHgwMDAzLCAweDgxMDgsIDB4OTE4MiwgMHgwODAwLCAweDAxMjAsIDB4OTM4NiwgMHgwMDNjLAorCTB4MDFlOCwgMHgwYzIwLCAweDgzZmYsIDB4MTFjMCwgMHg3MjU0LCAweDkwMGUsIDB4MjAwMSwgMHgwMDAzLAorCTB4MDgwYywgMHg4NGZmLCAweDIyMDgsIDB4MDA5ZSwgMHhhODk3LCAweDQwMDAsIDB4YTk5YSwgMHg3MTVjLAorCTB4ODFmZiwgMHgwOTBjLCAweDBkZmEsIDB4MjE0OCwgMHgwODBjLCAweDEwNjMsIDB4OTAwNiwgMHg3MDVlLAorCTB4OTE4ZCwgMHgwMDAxLCAweDIwMDgsIDB4MDQxOCwgMHg3MDYzLCAweDAwMDEsIDB4NzE1MiwgMHg3MDU0LAorCTB4OTMwMCwgMHg3MDU2LCAweDIwNjEsIDB4MThiNywgMHgyYzQ0LCAweGEzN2EsIDB4NzA1OCwgMHhhMDc2LAorCTB4NzA2NCwgMHhhMDcyLCAweGE0OGUsIDB4YTU5MiwgMHhhNjk2LCAweGE3OWEsIDB4YTA5ZiwgMHg0ZmYyLAorCTB4MDAwZSwgMHhhMGEyLCAweDA4MGMsIDB4MTEyZSwgMHg5MDA2LCAweDAwNDgsIDB4MDA5ZSwgMHhhODk3LAorCTB4NDAwNSwgMHhhOTlhLCAweDkwMGUsIDB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4YTBhMCwgMHg5MDRkLCAweDA5MGMsIDB4MGRmYSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODljLCAweGEwNmMsIDB4OTA4ZSwgMHgwMTAwLCAweDAxMzgsIDB4YTg3YiwgMHgwMDMwLAorCTB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMiwgMHgwMGQ4LCAweDcwNjAsIDB4OTAwNSwgMHgxMTU4LAorCTB4NzE1MCwgMHg3MDU4LCAweDIwYTAsIDB4OTAxZSwgMHg3MDY0LCAweDIwZTgsIDB4YTQ4YywgMHhhNTkwLAorCTB4YTY5NCwgMHhhNzk4LCAweDA0MjgsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHhhODk3LAorCTB4NDAwMCwgMHg3MjU0LCAweDkwMGUsIDB4MjAwMSwgMHgwMDAzLCAweDA4MGMsIDB4ODRmZiwgMHhhYTlhLAorCTB4NzE1YywgMHg4MWZmLCAweDA5MGMsIDB4MGRmYSwgMHgyMTQ4LCAweDA4MGMsIDB4MTA2MywgMHg3MDVmLAorCTB4MDAwMCwgMHhhMGEwLCAweDIwNDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YWU5LAorCTB4MDEyZSwgMHhhMDlmLCAweDAwMDAsIDB4YTBhMywgMHgwMDAwLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LAorCTB4OTFkOCwgMHgxMDAwLCAweDJiNWMsIDB4OGJmZiwgMHgwMTc4LCAweDA4MGMsIDB4NjdjMywgMHgwMTE4LAorCTB4MDgwYywgMHg2N2NiLCAweDExNDgsIDB4YjgxNCwgMHgyMGE5LCAweDAwMDEsIDB4NDAwNCwgMHhiODEwLAorCTB4NDAwNCwgMHg0MTA0LCAweDkzOTgsIDB4MDAwMywgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgwMTIwLAorCTB4OTM4NiwgMHgwMDNjLCAweDA1MTgsIDB4MGMyMCwgMHg4M2ZmLCAweDExZjAsIDB4NzE1NCwgMHg4MTBjLAorCTB4YTk5YSwgMHhhODk3LCAweDQwMDAsIDB4NzE1YywgMHg4MWZmLCAweDA5MGMsIDB4MGRmYSwgMHgyMTQ4LAorCTB4MDgwYywgMHgxMDYzLCAweDkwMDYsIDB4NzA1ZSwgMHg5MThkLCAweDAwMDEsIDB4MjAwOCwgMHhhMGEwLAorCTB4MjA0OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZhZTksIDB4MDEyZSwgMHhhMDlmLAorCTB4MDAwMCwgMHhhMGEzLCAweDAwMDAsIDB4MDA3MCwgMHg3MDYzLCAweDAwMDEsIDB4NzE1MiwgMHg3MDU0LAorCTB4OTMwMCwgMHg3MDU2LCAweGEzN2EsIDB4YTQ4ZSwgMHhhNTkyLCAweGE2OTYsIDB4YTc5YSwgMHgwODBjLAorCTB4MTEyZSwgMHg5MDA2LCAweDAwZWUsIDB4MDAwNSwgMHgwMDk2LCAweGE4OGMsIDB4OTBiZSwgMHg3MDAwLAorCTB4MDE0OCwgMHg5MGJlLCAweDcxMDAsIDB4MDEzMCwgMHg5MGJlLCAweDcyMDAsIDB4MDExOCwgMHgwMDllLAorCTB4MDgwNCwgMHgzNTFkLCAweGE4ODQsIDB4YTk4OCwgMHgwODBjLCAweDI3NmUsIDB4MTUxOCwgMHgwODBjLAorCTB4NjQzZiwgMHgxNTAwLCAweDcxMjYsIDB4YmUxMiwgMHhiZDE2LCAweGFlN2MsIDB4MDgwYywgMHg0YWJmLAorCTB4MDFjOCwgMHgwODBjLCAweDRhYmYsIDB4MDFiMCwgMHgwMDllLCAweGE4NjcsIDB4MDAwMCwgMHhhODY4LAorCTB4YzBmZCwgMHhhODZhLCAweGE4MjMsIDB4MDAwMCwgMHhhODA0LCAweDIwNDgsIDB4MDgwYywgMHhiZmUzLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNTFhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLAorCTB4NTBiZiwgMHgwMDA1LCAweDAwOWUsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwgMHg3MTI0LAorCTB4MDgwYywgMHgzMjg2LCAweGE4MjAsIDB4OTA4NiwgMHg4MDAxLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDgwNCwgMHgzNTFhLCAweDI5MDAsIDB4NzAyMiwgMHhhODA0LCAweDAwOTYsIDB4MjA0OCwgMHg4OTA2LAorCTB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4MDA5ZSwgMHg5MDgwLAorCTB4MDAwMiwgMHgwMDc2LCAweDAwMDYsIDB4MjA5OCwgMHgyMGEwLCAweDI3ZTAsIDB4MjdlOCwgMHgyMGE5LAorCTB4MDAyYSwgMHgwODBjLCAweDBmYWUsIDB4YWE2YywgMHhhYjcwLCAweGFjNzQsIDB4YWQ3OCwgMHgyMDYxLAorCTB4MThiNiwgMHgyYzQ0LCAweGEwNmIsIDB4MDAwMCwgMHhhZTY0LCAweGFmOGMsIDB4OTdjNiwgMHg3MDAwLAorCTB4MDExOCwgMHg5N2M2LCAweDcxMDAsIDB4MTE0OCwgMHg5NmMyLCAweDAwMDQsIDB4MDYwMCwgMHgyMDA5LAorCTB4MDAwNCwgMHgwMDBlLCAweDAwN2UsIDB4MDgwNCwgMHg0YjBiLCAweDk3YzYsIDB4NzIwMCwgMHgxMWI4LAorCTB4OTZjMiwgMHgwMDU0LCAweDAyYTAsIDB4MDAwZSwgMHgwMDdlLCAweDIwNjEsIDB4MThiNiwgMHgyYzQ0LAorCTB4YTA3NiwgMHhhNzcyLCAweGEwN2IsIDB4MDAyYSwgMHhhMjhlLCAweGEzOTIsIDB4YTQ5NiwgMHhhNTlhLAorCTB4MDgwYywgMHgxMTJlLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFmLCAweDUxMWIsIDB4MDAwNSwgMHgwMDBlLAorCTB4MDA3ZSwgMHgwODA0LCAweDM1MWQsIDB4NzAyMCwgMHgyMDQ4LCAweGE4MDQsIDB4MjA0OCwgMHhhODA0LAorCTB4MjA0OCwgMHg4OTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MGJjLCAweDAwM2YsIDB4OTA4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDAyLCAweDIwOTgsIDB4MjBhMCwgMHgyN2UwLCAweDI3ZTgsIDB4MjBhOSwgMHgwMDJhLAorCTB4MDgwYywgMHgwZmFlLCAweDIxMDAsIDB4MjIzOCwgMHgyMDYxLCAweDE4YjYsIDB4MmM0NCwgMHhhMjhjLAorCTB4YTM5MCwgMHhhNDk0LCAweGE1OTgsIDB4MjAwOSwgMHgwMDJhLCAweDA4MDQsIDB4NGIwYiwgMHg4MWZmLAorCTB4MTkwNCwgMHgzNTFhLCAweDc5OGMsIDB4MjAwMSwgMHgxOTU2LCAweDkxOGMsIDB4ODAwMCwgMHgyMTAyLAorCTB4MDgwYywgMHg0YWQ2LCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY3YzMsIDB4MDEyMCwgMHgwODBjLAorCTB4NjdjYiwgMHgxOTA0LCAweDM1MWQsIDB4MDgwYywgMHg2NTY2LCAweDA5MDQsIDB4MzUxYSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NjYyYywgMHgwMTJlLCAweDA5MDQsIDB4MzUxYSwgMHgyMDAxLAorCTB4MTk1NiwgMHgyMDA0LCAweGQwZmMsIDB4MTkwNCwgMHgzNGU4LCAweDA4MDQsIDB4NDUzMywgMHhhOWEwLAorCTB4MjAwMSwgMHgxOTU2LCAweDkxOGMsIDB4ODAwMCwgMHhjMThkLCAweDIxMDIsIDB4MDgwYywgMHg0YWUzLAorCTB4MDFhMCwgMHgwODBjLCAweDY3YzMsIDB4MDExOCwgMHgwODBjLCAweDY3Y2IsIDB4MTE3MCwgMHgwODBjLAorCTB4NjU2NiwgMHgyMDA5LCAweDAwMDIsIDB4MDEyOCwgMHgwODBjLCAweDY2MmMsIDB4MTE3MCwgMHgyMDA5LAorCTB4MDAwMywgMHhhODk3LCAweDQwMDUsIDB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLAorCTB4OTA4NSwgMHgwMDAxLCAweDIwMDEsIDB4MDAzMCwgMHgwMDA1LCAweGE4OTcsIDB4NDAwMCwgMHgyMDAxLAorCTB4MTk1NiwgMHgyMDA0LCAweGQwZmMsIDB4MTEyOCwgMHgwODBjLCAweDU1ZTMsIDB4MDExMCwgMHg5MDA2LAorCTB4MDAxOCwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDAwNSwgMHg3OGE4LAorCTB4ZDA4YywgMHgxMTE4LCAweGQwODQsIDB4MDkwNCwgMHg0NGE4LCAweDA4MGMsIDB4NGFmMiwgMHgwOTA0LAorCTB4MzUxZCwgMHgwODBjLCAweDRhYmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNTFhLAorCTB4MDgwYywgMHg2N2MzLCAweDAxMzAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMTgsIDB4OTA4ZSwgMHgwMDA1LAorCTB4MTVhMCwgMHg3OGE4LCAweGQwOGMsIDB4MDEyMCwgMHhiODAwLCAweGMwOGMsIDB4YjgwMiwgMHgwMDI4LAorCTB4MDgwYywgMHg1NWRiLCAweGQwYjQsIDB4MDkwNCwgMHg0NGUyLCAweDc4ODQsIDB4OTA4ZSwgMHgwMDdlLAorCTB4MDkwNCwgMHg0NGUyLCAweDkwOGUsIDB4MDA3ZiwgMHgwOTA0LCAweDQ0ZTIsIDB4OTA4ZSwgMHgwMDgwLAorCTB4MDkwNCwgMHg0NGUyLCAweGI4MDAsIDB4ZDA4YywgMHgxOTA0LCAweDQ0ZTIsIDB4YTg2NywgMHgwMDAwLAorCTB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4MDgwYywgMHhjMDAyLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDgwNCwgMHgzNTFhLCAweDcwMDcsIDB4MDAwMywgMHg3MDFmLCAweDUxZTcsIDB4MDAwNSwgMHgwODBjLAorCTB4NGFmMiwgMHgwOTA0LCAweDM1MWQsIDB4MDgwNCwgMHg0NGUyLCAweDA4MGMsIDB4MzJkZiwgMHgwMTA4LAorCTB4MDAwNSwgMHgyMDA5LCAweDE4MzMsIDB4MjEwYywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDgwNCwgMHgzNTFhLCAweDA4MGMsIDB4NTVlZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LAorCTB4MzUxYSwgMHgwODBjLCAweDY3YmIsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgzNTFhLAorCTB4Yjg5YywgMHhkMGE0LCAweDExMTgsIDB4ZDBhYywgMHgxOTA0LCAweDQ0ZTIsIDB4OTAwNiwgMHhhODY2LAorCTB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGMwNjEsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMywgMHgwODA0LCAweDM1MWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTIyMCwgMHgwMDA1LAorCTB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHg1NTJmLAorCTB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwgMHgwODA0LCAweDUxYjksIDB4ODFmZiwgMHgyMDA5LAorCTB4MDAwMSwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywgMHg1NWVmLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LAorCTB4MzUxYSwgMHgwODBjLCAweDY3YmIsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDgsIDB4MDgwNCwgMHgzNTFhLAorCTB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwgMHgwODBjLCAweDY3YzMsIDB4MjAwOSwgMHgwMDA5LAorCTB4MTkwNCwgMHgzNTFhLCAweDA4MGMsIDB4NGFiZiwgMHgyMDA5LCAweDAwMDIsIDB4MDkwNCwgMHgzNTFhLAorCTB4OTAwNiwgMHhhODY2LCAweGE4MzIsIDB4YTg2OCwgMHhjMGZkLCAweGE4NmEsIDB4Nzk4OCwgMHg5MTk0LAorCTB4ZmYwMCwgMHg5MThjLCAweDAwZmYsIDB4OTAwNiwgMHg4MmZmLCAweDExMjgsIDB4YzBlZCwgMHhhOTUyLAorCTB4Nzk4YywgMHhhOTU2LCAweDAwMzgsIDB4OTI4ZSwgMHgwMTAwLCAweDE5MDQsIDB4MzUxZCwgMHhjMGU1LAorCTB4YTk1MiwgMHhhOTU2LCAweGE4M2UsIDB4MDgwYywgMHhjMmI0LCAweDIwMDksIDB4MDAwMywgMHgwOTA0LAorCTB4MzUxYSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1Mjc2LCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LAorCTB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDkwNCwgMHgzNTFhLCAweDA4MDQsIDB4MzRlOCwgMHg3YWE4LAorCTB4OTI4NCwgMHhjMDAwLCAweDAxNDgsIDB4ZDJlYywgMHgwMWEwLCAweDA4MGMsIDB4NTVlZiwgMHgxMTg4LAorCTB4MjAwOSwgMHgwMDE0LCAweDA4MDQsIDB4MzUxYSwgMHhkMmRjLCAweDE1NzgsIDB4ODFmZiwgMHgyMDA5LAorCTB4MDAwMSwgMHgxOTA0LCAweDM1MWEsIDB4MDgwYywgMHg1NWVmLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LAorCTB4MzUxYSwgMHhkMmY0LCAweDAxMzgsIDB4OTI4NCwgMHg1MDAwLCAweGMwZDUsIDB4MDgwYywgMHg1NWI1LAorCTB4MDgwNCwgMHgzNGU4LCAweGQyZmMsIDB4MDE2MCwgMHgwODBjLCAweDRhZjIsIDB4MDkwNCwgMHgzNTFkLAorCTB4Nzk4NCwgMHg5Mjg0LCAweDkwMDAsIDB4YzBkNSwgMHgwODBjLCAweDU1OGEsIDB4MDgwNCwgMHgzNGU4LAorCTB4MDgwYywgMHg0YWYyLCAweDA5MDQsIDB4MzUxZCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDAwNiwgMHgyMDA5LCAweDAwMDksIDB4MTkwNCwgMHg1MzY1LCAweDA4MGMsIDB4NGFiZiwgMHgyMDA5LAorCTB4MDAwMiwgMHgwOTA0LCAweDUzNjUsIDB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4YWY2MCwgMHgyMDA5LAorCTB4MDAwOCwgMHg3YThjLCAweDdiODgsIDB4N2M5YywgMHg3ZDk4LCAweDA4MGMsIDB4NGIwOCwgMHg3MDFmLAorCTB4NTJkMiwgMHgwMDA1LCAweGE4NmMsIDB4OTA4NiwgMHgwNTAwLCAweDExMzgsIDB4YTg3MCwgMHg5MDA1LAorCTB4MTEyMCwgMHhhODc0LCAweDkwODQsIDB4ZmYwMCwgMHgwMTEwLCAweDE5MDQsIDB4MzUxZCwgMHhhODY2LAorCTB4YTgzMiwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweDRhZjIsIDB4MTExMCwgMHgwODA0LAorCTB4MzUxZCwgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhjMzFjLCAweDIwMDksIDB4MDAwMywgMHgwOTA0LAorCTB4NTM2NSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxZiwgMHg1MmY2LCAweDAwMDUsIDB4YTgzMCwgMHg5MDg2LAorCTB4MDEwMCwgMHgyMDA5LCAweDAwMDQsIDB4MDkwNCwgMHg1MzY1LCAweDc5ODQsIDB4N2FhOCwgMHg5Mjg0LAorCTB4MTAwMCwgMHhlMDg1LCAweDA4MGMsIDB4NTU4YSwgMHgwODA0LCAweDM0ZTgsIDB4MDBjNiwgMHhhYWIwLAorCTB4OTI4NCwgMHhjMDAwLCAweDAxNDgsIDB4ZDJlYywgMHgwMTcwLCAweDA4MGMsIDB4NTVlZiwgMHgxMTU4LAorCTB4MjAwOSwgMHgwMDE0LCAweDA4MDQsIDB4NTM1NCwgMHgyMDYxLCAweDE4MDAsIDB4MDgwYywgMHg1NWVmLAorCTB4MjAwOSwgMHgwMDA3LCAweDE1YzgsIDB4ZDJmNCwgMHgwMTMwLCAweDkyODQsIDB4NTAwMCwgMHhjMGQ1LAorCTB4MDgwYywgMHg1NWI1LCAweDAwNTgsIDB4ZDJmYywgMHgwMTgwLCAweDA4MGMsIDB4NGFmMCwgMHgwNTkwLAorCTB4YTk5OCwgMHg5Mjg0LCAweDkwMDAsIDB4YzBkNSwgMHgwODBjLCAweDU1OGEsIDB4YTg3YiwgMHgwMDAwLAorCTB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwMCwgMHgwNDM4LCAweDA4MGMsIDB4NGFmMCwgMHgwNTEwLAorCTB4MDgwYywgMHg2N2MzLCAweDIwMDksIDB4MDAwOSwgMHgxMWI4LCAweGE4YzQsIDB4OTA4NiwgMHgwNTAwLAorCTB4MTFjOCwgMHhhOGM4LCAweDkwMDUsIDB4MTFiMCwgMHhhOGNjLCAweDkwODQsIDB4ZmYwMCwgMHgxMTkwLAorCTB4MDgwYywgMHg0YWYwLCAweDExMDgsIDB4MDA3MCwgMHgyMDA5LCAweDAwNGIsIDB4MDgwYywgMHhjMzFjLAorCTB4MjAwOSwgMHgwMDAzLCAweDAxMDgsIDB4MDA3OCwgMHgwNDMxLCAweDE5YzAsIDB4YTg5NywgMHg0MDA1LAorCTB4YTk5YSwgMHgwMDEwLCAweGE4OTcsIDB4NDAwNiwgMHg5MDBlLCAweDkwODUsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAzMCwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2UwLCAweDdhYTgsIDB4ZDJkYywgMHgwOTA0LAorCTB4MzUxYSwgMHgwMDE2LCAweDc5ODQsIDB4OTI4NCwgMHgxMDAwLCAweGMwZmQsIDB4MDgwYywgMHg1NThhLAorCTB4MDAxZSwgMHgxOTA0LCAweDM1MWEsIDB4MDgwNCwgMHgzNGU4LCAweDAwZjYsIDB4MmQ3OCwgMHhhYWIwLAorCTB4MDAyMSwgMHgwMGZlLCAweDAwMDUsIDB4YWFiMCwgMHhjMmQ1LCAweGQyZGMsIDB4MDE1MCwgMHgwMDE2LAorCTB4YTk5OCwgMHg5Mjg0LCAweDE0MDAsIDB4YzBmZCwgMHgwODBjLCAweDU1OGEsIDB4MDAxZSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwNCwgMHgzNTFhLAorCTB4MDgwYywgMHg1NWVmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsIDB4MzUxYSwgMHg3OTg0LAorCTB4N2VhOCwgMHg5NmI0LCAweDAwZmYsIDB4MDgwYywgMHg2NDlmLCAweDE5MDQsIDB4MzUxZCwgMHg5MTg2LAorCTB4MDA3ZiwgMHgwMTM4LCAweDA4MGMsIDB4NjdjMywgMHgwMTIwLCAweDIwMDksIDB4MDAwOSwgMHgwODA0LAorCTB4MzUxYSwgMHgwODBjLCAweDRhYmYsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgzNTFhLAorCTB4YTg2NywgMHgwMDAwLCAweGE4NjgsIDB4YzBmZCwgMHhhODZhLCAweDIwMDEsIDB4MDEwMCwgMHg4MDA3LAorCTB4YTgwYSwgMHgwODBjLCAweGMwMWMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgzNTFhLAorCTB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTNjNSwgMHgwMDA1LCAweGE4MDgsIDB4ODAwNywgMHg5MDg2LAorCTB4MDEwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDM1MWEsIDB4YThlMCwgMHhhODY2LAorCTB4YTgxMCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDBjLCAweGE4MTQsIDB4ODAwNywgMHg5MDg0LAorCTB4MDBmZiwgMHg4MDA0LCAweDkwODAsIDB4MDAwMiwgMHg5MTA4LCAweDg5MDYsIDB4ODAwNiwgMHg4MDA3LAorCTB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLCAweDAwMDQsIDB4N2E4YywgMHg3Yjg4LAorCTB4N2M5YywgMHg3ZDk4LCAweDA4MDQsIDB4NGIwYiwgMHgwODBjLCAweDRhYmYsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4Nzk4NCwgMHg5MTk0LCAweGZmMDAsIDB4OTE4YywgMHgwMGZmLAorCTB4ODIxNywgMHg4MmZmLCAweDExMTgsIDB4NzAyMywgMHgxOThiLCAweDAwNDAsIDB4OTJjNiwgMHgwMDAxLAorCTB4MTExOCwgMHg3MDIzLCAweDE5YTUsIDB4MDAxMCwgMHgwODA0LCAweDM1MWQsIDB4MjAwOSwgMHgwMDFhLAorCTB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHhhZjYwLAorCTB4MDgwYywgMHg0YjA4LCAweDcwMWYsIDB4NTQxNSwgMHgwMDA1LCAweDIwMDEsIDB4MTgyZCwgMHgyMDAzLAorCTB4MDAwMSwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMDk4LCAweGE4NjAsIDB4MjBlMCwgMHgyMGE5LAorCTB4MDAxYSwgMHg3MDIwLCAweDIwYTAsIDB4MjBlOSwgMHgwMDAxLCAweDQwMDMsIDB4MDgwNCwgMHgzNGU4LAorCTB4MDgwYywgMHg0YWJmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwgMHg3OTg0LAorCTB4OTE5NCwgMHhmZjAwLCAweDkxOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsIDB4MTExOCwgMHgyMDk5LAorCTB4MTk4YiwgMHgwMDQwLCAweDkyYzYsIDB4MDAwMSwgMHgxMTE4LCAweDIwOTksIDB4MTlhNSwgMHgwMDEwLAorCTB4MDgwNCwgMHgzNTFkLCAweGE4NWMsIDB4OTA4MCwgMHgwMDE5LCAweDIwYTAsIDB4YTg2MCwgMHgyMGU4LAorCTB4MjBhOSwgMHgwMDFhLCAweDIwZTEsIDB4MDAwMSwgMHg0MDAzLCAweDIwMDksIDB4MDAxYSwgMHg3YThjLAorCTB4N2I4OCwgMHg3YzljLCAweDdkOTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4YWY2MCwgMHgwODA0LAorCTB4NGIwYiwgMHg3ODg0LCAweDkwOGEsIDB4MTAwMCwgMHgxYTA0LCAweDM1MWQsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDAwYzYsIDB4MjA2MSwgMHgxOWQyLAorCTB4NjE0MiwgMHgwMGNlLCAweDAxMmUsIDB4MDgwNCwgMHgzNGU4LCAweDAwYzYsIDB4MDgwYywgMHg3MjA3LAorCTB4MTE2MCwgMHgwODBjLCAweDc1MDQsIDB4MDgwYywgMHg1ZjJiLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLAorCTB4NzI0ZSwgMHgwODBjLCAweDcxMjcsIDB4MDgwYywgMHgwZGZhLCAweDIwNjEsIDB4MTgwMCwgMHg2MDMwLAorCTB4YzA5ZCwgMHg2MDMyLCAweDA4MGMsIDB4NWRlYSwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDAxLAorCTB4MTgwMCwgMHgyMDA0LCAweDkwOGUsIDB4MDAwMCwgMHgwOTA0LCAweDM1MWEsIDB4Nzg4NCwgMHg5MDA1LAorCTB4MDE4OCwgMHg3ODg4LCAweDIwNjEsIDB4MTk3NCwgMHgyYzBjLCAweDIwNjIsIDB4MDgwYywgMHgyYjk4LAorCTB4MDFhMCwgMHgwODBjLCAweDJiYTAsIDB4MDE4OCwgMHgwODBjLCAweDJiYTgsIDB4MDE3MCwgMHgyMTYyLAorCTB4MDgwNCwgMHgzNTFkLCAweDIwNjEsIDB4MDEwMCwgMHg2MDM4LCAweDkwODYsIDB4MDAwNywgMHgxMTE4LAorCTB4MjAwOSwgMHgwMDAxLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAwLCAweDc4ODQsIDB4OTA4NiwgMHgwMDAyLAorCTB4MTU2OCwgMHgyMDYxLCAweDAxMDAsIDB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MDAyNiwgMHgyMDExLAorCTB4MDAwMywgMHgwODBjLCAweDlhMGYsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4OWExOSwgMHgwMDJlLAorCTB4MDgwYywgMHg5OTI3LCAweDAwMzYsIDB4OTAxZSwgMHgwODBjLCAweDk5OWQsIDB4MDAzZSwgMHg2MGUzLAorCTB4MDAwMCwgMHgwODBjLCAweGRjMTMsIDB4MDgwYywgMHhkYzJlLCAweDkwODUsIDB4MDAwMSwgMHgwODBjLAorCTB4NzI0ZSwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgyMDAxLCAweDE4MDAsIDB4MjAwMywgMHgwMDA0LAorCTB4MjAwMSwgMHgxOTdmLCAweDIwMDMsIDB4MDAwMCwgMHg2MDI3LCAweDAwMDgsIDB4MDBjZSwgMHgwODA0LAorCTB4MzRlOCwgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsIDB4MzUxYSwgMHgwODBjLAorCTB4NTVlZiwgMHgwMTIwLCAweDIwMDksIDB4MDAwNywgMHgwODA0LCAweDM1MWEsIDB4Nzk4NCwgMHg3ZWE4LAorCTB4OTZiNCwgMHgwMGZmLCAweDA4MGMsIDB4NjQ5ZiwgMHgxOTA0LCAweDM1MWQsIDB4OTE4NiwgMHgwMDdmLAorCTB4MDEzOCwgMHgwODBjLCAweDY3YzMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDksIDB4MDgwNCwgMHgzNTFhLAorCTB4MDgwYywgMHg0YWJmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsIDB4MzUxYSwgMHhhODY3LAorCTB4MDAwMCwgMHhhODY4LCAweGMwZmQsIDB4YTg2YSwgMHgwODBjLCAweGMwMWYsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAwMywgMHgwODA0LCAweDM1MWEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWYsIDB4NTUxOCwgMHgwMDA1LAorCTB4YTgzMCwgMHg5MDg2LCAweDAxMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDQsIDB4MDgwNCwgMHgzNTFhLAorCTB4YThlMCwgMHhhODY2LCAweGE4MzQsIDB4ODAwNywgMHg4MDBjLCAweGE4NWMsIDB4OTA4MCwgMHgwMDBjLAorCTB4N2E4YywgMHg3Yjg4LCAweDdjOWMsIDB4N2Q5OCwgMHhhZjYwLCAweDA4MDQsIDB4NGIwYiwgMHhhODk4LAorCTB4OTA4NiwgMHgwMDBkLCAweDE5MDQsIDB4MzUxYSwgMHgyMDIxLCAweDQwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwZTA0LCAweDU1M2MsIDB4MDAxMCwgMHgwMTJlLCAweDBjYzAsIDB4N2MzNiwgMHg5NDg2LAorCTB4NDAwMCwgMHgwMTE4LCAweDc4MzMsIDB4MDAxMSwgMHgwMDEwLCAweDc4MzMsIDB4MDAxMCwgMHg3ODgzLAorCTB4NDAwNSwgMHhhOTk4LCAweDc5ODYsIDB4YTlhNCwgMHg3OTlhLCAweGE5YTgsIDB4Nzk5ZSwgMHgwODBjLAorCTB4NGFmYiwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLAorCTB4MTFlMCwgMHg3MDA3LCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDcwMGYsIDB4MDAwMCwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDIwNjEsIDB4MTlkMiwgMHg3OTg0LAorCTB4NjE1MiwgMHg2MTRlLCAweDYwNTcsIDB4MDAwMCwgMHg2MDRiLCAweDAwMDksIDB4Nzg5OCwgMHg2MDZhLAorCTB4Nzg5YywgMHg2MDY2LCAweDc4ODgsIDB4NjA2MiwgMHg3ODhjLCAweDYwNWUsIDB4MjAwMSwgMHgxOWUwLAorCTB4MjA0NCwgMHgyMDAxLCAweDE5ZTcsIDB4YTA3NiwgMHhhMDYwLCAweGEwNzIsIDB4YTA3YiwgMHgwMDAxLAorCTB4YTA3ZiwgMHgwMDAyLCAweGEwNmIsIDB4MDAwMCwgMHhhMDlmLCAweDAwMDAsIDB4MDBjZSwgMHgwMTJlLAorCTB4MDgwNCwgMHgzNGU4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYjYsIDB4MDBjNiwgMHg5MGU0LAorCTB4YzAwMCwgMHgwMTY4LCAweDAwMDYsIDB4ZDBkNCwgMHgwMTMwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHgzMmE0LCAweDAwM2UsIDB4MDgwYywgMHhiZTg0LCAweDAwMGUsIDB4MTE5OCwgMHhkMGU0LAorCTB4MDE2MCwgMHg5MTgwLCAweDEwMDAsIDB4MjAwNCwgMHg5MDVkLCAweDAxNjAsIDB4MDgwYywgMHg1ZjQ1LAorCTB4MDgwYywgMHhhMDYyLCAweDAxMTAsIDB4YjgxNywgMHgwMDAwLCAweDkwMDYsIDB4MDBjZSwgMHgwMGJlLAorCTB4MDEyZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2M4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDE1NiwgMHgyMDEwLCAweDkwMGUsIDB4MjBhOSwgMHgwODAwLCAweDAwMTYsIDB4OTE4MCwgMHgxMDAwLAorCTB4MjAwNCwgMHg5MDA1LCAweDAxODgsIDB4OTE4NiwgMHgwMDdlLCAweDAxNzAsIDB4OTE4NiwgMHgwMDdmLAorCTB4MDE1OCwgMHg5MTg2LCAweDAwODAsIDB4MDE0MCwgMHg5MTg2LCAweDAwZmYsIDB4MDEyOCwgMHgwMDI2LAorCTB4MjIwMCwgMHgwODBjLCAweDU1OGEsIDB4MDAyZSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg1NWJkLAorCTB4MDE1ZSwgMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHgxODVjLCAweDIwMDQsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTg3YiwgMHgyMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMGQ0LAorCTB4MDAwZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwYjQsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgwMDA1LCAweDAwMTYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTg5YywgMHg3MTA4LCAweDkxMGQsIDB4NzEwYSwgMHgwMGVlLCAweDAwMWUsIDB4MDAwNSwgMHg3OWE0LAorCTB4OTE4MiwgMHgwMDgxLCAweDFhMDQsIDB4MzUxZCwgMHg4MTBjLCAweDAwMTYsIDB4MDgwYywgMHg0YWJmLAorCTB4MDE3MCwgMHgwODBjLCAweDBmMzksIDB4MjEwMCwgMHgyMjM4LCAweDdkODQsIDB4N2M4OCwgMHg3YjhjLAorCTB4N2E5MCwgMHgwMDFlLCAweDA4MGMsIDB4NGIwOCwgMHg3MDFmLCAweDU2MWIsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDAwMiwgMHgwODA0LCAweDM1MWEsIDB4MjA3OSwgMHgwMDAwLCAweDdkOTQsIDB4N2M5OCwgMHg3YmE4LAorCTB4N2FhYywgMHg3OWE0LCAweDgxMGMsIDB4MjA2MSwgMHgxOGI2LCAweDJjNDQsIDB4YTc3MCwgMHhhMDc0LAorCTB4MjA3MSwgMHgxODljLCAweDA4MGMsIDB4NGIwYiwgMHg3MDFmLCAweDU2MmYsIDB4MDAwNSwgMHgyMDYxLAorCTB4MThiNiwgMHgyYzQ0LCAweDAwMTYsIDB4MDAyNiwgMHhhMjcwLCAweGExNzQsIDB4MDgwYywgMHgwZjQxLAorCTB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4MGZlZSwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHgwODA0LAorCTB4MzRlOCwgMHgwMTI2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxYzYsIDB4MDFkNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDIwMCwgMHgyMDcxLAorCTB4MTgwMCwgMHg2MDQ0LCAweGQwYTQsIDB4MTFlOCwgMHhkMDg0LCAweDAxMTgsIDB4MDgwYywgMHg1N2VhLAorCTB4MDA2OCwgMHhkMDhjLCAweDAxMTgsIDB4MDgwYywgMHg1NmYzLCAweDAwNDAsIDB4ZDA5NCwgMHgwMTE4LAorCTB4MDgwYywgMHg1NmMzLCAweDAwMTgsIDB4ZDA5YywgMHgwMTA4LCAweDAwOTksIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAxZGUsIDB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDE2LCAweDYxMjgsIDB4ZDE5YywgMHgxMTEwLCAweGMxOWQsIDB4NjEyYSwgMHgwMDFlLAorCTB4MGM2OCwgMHgwMDA2LCAweDcwOTQsIDB4OTAwNSwgMHgwMDBlLCAweDAxMjAsIDB4NzA5NywgMHgwMDAwLAorCTB4NzA4ZiwgMHgwMDAwLCAweDYyNGMsIDB4OTI4NiwgMHhmMGYwLCAweDExNTAsIDB4NjA0OCwgMHg5MDg2LAorCTB4ZjBmMCwgMHgwMTMwLCAweDYyNGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgwNDkwLAorCTB4OTI5NCwgMHhmZjAwLCAweDkyOTYsIDB4ZjcwMCwgMHgwMTc4LCAweDcxMzgsIDB4ZDFhNCwgMHgxMTYwLAorCTB4NjI0MCwgMHg5Mjk1LCAweDAxMDAsIDB4NjI0MiwgMHg5Mjk0LCAweDAwMTAsIDB4MDEyOCwgMHgyMDA5LAorCTB4MDBmNywgMHgwODBjLCAweDVlYTcsIDB4MDBmMCwgMHg2MDQwLCAweDkwODQsIDB4MDAxMCwgMHg5MDg1LAorCTB4MDE0MCwgMHg2MDQyLCAweDYwNDMsIDB4MDAwMCwgMHg3MDgzLCAweDAwMDAsIDB4NzA5ZiwgMHgwMDAxLAorCTB4NzBjMywgMHgwMDAwLCAweDcwZGIsIDB4MDAwMCwgMHgyMDA5LCAweDFjODAsIDB4MjAwYiwgMHgwMDAwLAorCTB4NzA5MywgMHgwMDAwLCAweDcwODcsIDB4MDAwZiwgMHgyMDA5LCAweDAwMGYsIDB4MjAxMSwgMHg1ZDhkLAorCTB4MDgwYywgMHg4MzZjLCAweDAwMDUsIDB4MjAwMSwgMHgxODdkLCAweDIwMDQsIDB4ZDA4YywgMHgwMTEwLAorCTB4NzA1YiwgMHhmZmZmLCAweDcwODQsIDB4OTAwNSwgMHgxNTI4LCAweDIwMTEsIDB4NWQ4ZCwgMHgwODBjLAorCTB4ODJkYSwgMHg2MDQwLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LCAweDAwMjAsIDB4NjA0MiwgMHgyMGE5LAorCTB4MDBjOCwgMHg2MDQ0LCAweGQwOGMsIDB4MTE2OCwgMHgxZjA0LCAweDU2ZDksIDB4NjI0MiwgMHg3MDk3LAorCTB4MDAwMCwgMHg2MDQwLCAweDkwOTQsIDB4MDAxMCwgMHg5Mjg1LCAweDAwODAsIDB4NjA0MiwgMHg2MjQyLAorCTB4MDA0OCwgMHg2MjQyLCAweDcwOTcsIDB4MDAwMCwgMHg3MDhiLCAweDAwMDAsIDB4OTAwNiwgMHgwODBjLAorCTB4NWYzMCwgMHgwMDAwLCAweDAwMDUsIDB4NzA4OCwgMHg5MDhhLCAweDAwMDMsIDB4MWEwYywgMHgwZGZhLAorCTB4MDAwYiwgMHgwMDA1LCAweDU2ZmQsIDB4NTc0ZSwgMHg1N2U5LCAweDAwZjYsIDB4MDAxNiwgMHg2OTAwLAorCTB4OTE4YywgMHgwODAwLCAweDcwOGIsIDB4MDAwMSwgMHgyMDAxLCAweDAxNWQsIDB4MjAwMywgMHgwMDAwLAorCTB4NjgwMywgMHgwMGZjLCAweDIwYTksIDB4MDAwNCwgMHg2ODAwLCAweDkwODQsIDB4MDBmYywgMHgwMTIwLAorCTB4MWYwNCwgMHg1NzBjLCAweDA4MGMsIDB4MGRmYSwgMHg2OGEwLCAweDY4YTIsIDB4Njg5YywgMHg2ODllLAorCTB4Njg5OCwgMHg2ODlhLCAweGEwMDEsIDB4OTE4ZCwgMHgxNjAwLCAweDY5MDIsIDB4MDAxZSwgMHg2ODM3LAorCTB4MDAyMCwgMHgwODBjLCAweDVmMGMsIDB4MjA3OSwgMHgxYzAwLCAweDc4MzMsIDB4MTEwMSwgMHg3ODM3LAorCTB4MDAwMCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksIDB4MDAwMSwgMHgyMGExLAorCTB4MWMwZSwgMHgyMGE5LCAweDAwMDQsIDB4NDAwMywgMHgwODBjLCAweDllZWIsIDB4MjBlMSwgMHgwMDAxLAorCTB4MjA5OSwgMHgxYzAwLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDE0LAorCTB4NDAwMywgMHg2MGMzLCAweDAwMGMsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4NWRiZSwgMHgwMGZlLAorCTB4OTAwNiwgMHg3MDhlLCAweDYwNDMsIDB4MDAwOCwgMHg2MDQyLCAweDAwMDUsIDB4MDBmNiwgMHg3MDhjLAorCTB4NzA4ZiwgMHgwMDAwLCAweDkwMjUsIDB4MDkwNCwgMHg1N2M2LCAweDYwMjAsIDB4ZDBiNCwgMHgxOTA0LAorCTB4NTdjNCwgMHg3MTljLCAweDgxZmYsIDB4MDkwNCwgMHg1N2IyLCAweDk0ODYsIDB4MDAwYywgMHgxOTA0LAorCTB4NTdiZiwgMHg5NDgwLCAweDAwMTgsIDB4ODAwNCwgMHgyMGE4LCAweDA4MGMsIDB4NWYwNSwgMHgyMDExLAorCTB4MDI2MCwgMHgyMDE5LCAweDFjMDAsIDB4MjIwYywgMHgyMzA0LCAweDkxMDYsIDB4MTFlOCwgMHg4MjEwLAorCTB4ODMxOCwgMHgxZjA0LCAweDU3NmIsIDB4NjA0MywgMHgwMDA0LCAweDIwNjEsIDB4MDE0MCwgMHg2MDViLAorCTB4YmM5NCwgMHg2MDVmLCAweGYwZjAsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDAwNiwgMHg3MDhiLAorCTB4MDAwMiwgMHg3MDk3LCAweDAwMDIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLAorCTB4ODM2YywgMHgwODBjLCAweDVmMGMsIDB4MDRjMCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwgMHgwMjYwLAorCTB4NzkzMCwgMHg5MThlLCAweDExMDEsIDB4MTU1OCwgMHg3ODM0LCAweDkwMDUsIDB4MTU0MCwgMHg3OTAwLAorCTB4OTE4YywgMHgwMGZmLCAweDExMTgsIDB4NzgwNCwgMHg5MDA1LCAweDAxOTAsIDB4MDgwYywgMHg1ZjA1LAorCTB4MjAxMSwgMHgwMjZlLCAweDIwMTksIDB4MTgwNSwgMHgyMGE5LCAweDAwMDQsIDB4MjIwYywgMHgyMzA0LAorCTB4OTEwMiwgMHgwMjMwLCAweDExYTAsIDB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4NTdhNiwgMHgwMDc4LAorCTB4NzA5ZiwgMHgwMDAwLCAweDA4MGMsIDB4NWYwNSwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjYwLAorCTB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MWMwMCwgMHgyMGE5LCAweDAwMTQsIDB4NDAwMywgMHg2MDQzLAorCTB4MDAwOCwgMHg2MDQzLCAweDAwMDAsIDB4MDAxMCwgMHgwMGZlLCAweDAwMDUsIDB4NjA0MCwgMHg5MDg1LAorCTB4MDEwMCwgMHg2MDQyLCAweDYwMjAsIDB4ZDBiNCwgMHgxZGI4LCAweDA4MGMsIDB4OWVlYiwgMHgyMGUxLAorCTB4MDAwMSwgMHgyMDk5LCAweDFjMDAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwgMHgyMGE5LAorCTB4MDAxNCwgMHg0MDAzLCAweDYwYzMsIDB4MDAwYywgMHgyMDExLCAweDE5YzksIDB4MjAxMywgMHgwMDAwLAorCTB4NzA4ZiwgMHgwMDAwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg5NjRkLAorCTB4MDhkOCwgMHgwMDA1LCAweDcwOTQsIDB4OTA4YSwgMHgwMDFkLCAweDFhMGMsIDB4MGRmYSwgMHgwMDBiLAorCTB4MDAwNSwgMHg1ODFiLCAweDU4MmUsIDB4NTg1NywgMHg1ODc3LCAweDU4OWQsIDB4NThjYywgMHg1OGYyLAorCTB4NTkyYSwgMHg1OTUwLCAweDU5N2UsIDB4NTliOSwgMHg1OWYxLCAweDVhMGYsIDB4NWEzYSwgMHg1YTVjLAorCTB4NWE3NywgMHg1YTgxLCAweDVhYjUsIDB4NWFkYiwgMHg1YjBhLCAweDViMzAsIDB4NWI2OCwgMHg1YmFjLAorCTB4NWJlOSwgMHg1YzBhLCAweDVjNjMsIDB4NWM4NSwgMHg1Y2IzLCAweDVjYjMsIDB4MDBjNiwgMHgyMDYxLAorCTB4MTgwMCwgMHg2MDAzLCAweDAwMDcsIDB4MjA2MSwgMHgwMTAwLCAweDYwMDQsIDB4OTA4NCwgMHhmZmY5LAorCTB4NjAwNiwgMHgwMGNlLCAweDAwMDUsIDB4MjA2MSwgMHgwMTQwLCAweDYwNWIsIDB4YmM5NCwgMHg2MDVmLAorCTB4ZjBmMCwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDAyLCAweDcwOTcsIDB4MDAwMSwgMHgyMDA5LAorCTB4MDdkMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MzZjLCAweDAwMDUsIDB4MDBmNiwgMHg3MDhjLAorCTB4OTA4NiwgMHgwMDE0LCAweDE1MTAsIDB4NjA0MiwgMHg2MDIwLCAweGQwYjQsIDB4MTFmMCwgMHgwODBjLAorCTB4NWYwNSwgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDIsIDB4MTFhMCwgMHg3ODM0LAorCTB4OTAwNSwgMHgxMTg4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzAsIDB4OTAwNSwgMHgxMTEwLAorCTB4NzBjMywgMHgwMDAxLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4NzA5NywgMHgwMDEwLAorCTB4MDgwYywgMHg1YTgxLCAweDAwMTAsIDB4NzA4ZiwgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA5NywgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmRhLAorCTB4MDgwYywgMHg1ZTg5LCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDIsIDB4NzgzNywgMHgwMDAwLAorCTB4MjBhOSwgMHgwMDA4LCAweDlmODgsIDB4MDAwZSwgMHgyMDBiLCAweDAwMDAsIDB4ODEwOCwgMHgxZjA0LAorCTB4NTg2YywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZGJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA4YywgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZDk0LCAweDA4MGMsIDB4ODJkYSwgMHg5MDg2LAorCTB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NWYwNSwgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LAorCTB4MTEwMiwgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LAorCTB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywgMHgwMDAxLCAweDcwOTcsIDB4MDAwNCwgMHgwMDI5LAorCTB4MDAxMCwgMHgwODBjLCAweDVlZTEsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5NywgMHgwMDA1LAorCTB4MDgwYywgMHg1ZTg5LCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLCAweDExMDMsIDB4NzgzNywgMHgwMDAwLAorCTB4MDgwYywgMHg1ZjA1LCAweDA4MGMsIDB4NWVlOCwgMHgxMTcwLCAweDcwODAsIDB4OTAwNSwgMHgxMTU4LAorCTB4NzE1OCwgMHg5MTg2LCAweGZmZmYsIDB4MDEzOCwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHg1ZDQxLAorCTB4MDE2OCwgMHgwODBjLCAweDVlYmUsIDB4MjBhOSwgMHgwMDA4LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LAorCTB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLCAweDQwMDMsIDB4NjBjMywgMHgwMDE0LAorCTB4MDgwYywgMHg1ZGJlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwgMHgwNTAwLAorCTB4MjAxMSwgMHg1ZDk0LCAweDA4MGMsIDB4ODJkYSwgMHg5MDg2LCAweDAwMTQsIDB4MTFiOCwgMHgwODBjLAorCTB4NWYwNSwgMHgyMDc5LCAweDAyNjAsIDB4N2EzMCwgMHg5Mjk2LCAweDExMDMsIDB4MTE3OCwgMHg3ODM0LAorCTB4OTAwNSwgMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYzAsIDB4OTAwNSwgMHgxMTEwLAorCTB4NzBjMywgMHgwMDAxLCAweDcwOTcsIDB4MDAwNiwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg1ZWUxLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5NywgMHgwMDA3LCAweDA4MGMsIDB4NWU4OSwgMHgyMDc5LAorCTB4MDI0MCwgMHg3ODMzLCAweDExMDQsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NWYwNSwgMHgwODBjLAorCTB4NWVlOCwgMHgxMWI4LCAweDcwODAsIDB4OTAwNSwgMHgxMWEwLCAweDcxNjAsIDB4OTE4NiwgMHhmZmZmLAorCTB4MDE4MCwgMHg5MTgwLCAweDMyZTksIDB4MjAwZCwgMHg5MThjLCAweGZmMDAsIDB4ODEwZiwgMHgyMDExLAorCTB4MDAwOCwgMHgwODBjLCAweDVkNDEsIDB4MDE4MCwgMHgwODBjLCAweDRlZDgsIDB4MDExMCwgMHgwODBjLAorCTB4MjdkNywgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZGJlLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZDk0LAorCTB4MDgwYywgMHg4MmRhLCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NWYwNSwgMHgyMDc5LAorCTB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNCwgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLAorCTB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywgMHgwMDAxLAorCTB4NzA5NywgMHgwMDA4LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDVlZTEsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDk3LCAweDAwMDksIDB4MDgwYywgMHg1ZTg5LCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLAorCTB4MTEwNSwgMHg3ODM3LCAweDAxMDAsIDB4MDgwYywgMHg1ZWU4LCAweDExNTAsIDB4NzA4MCwgMHg5MDA1LAorCTB4MTEzOCwgMHgwODBjLCAweDVjYjQsIDB4MTE4OCwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHgyN2Q3LAorCTB4MjBhOSwgMHgwMDA4LCAweDA4MGMsIDB4NWYwNSwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLAorCTB4NWRiZSwgMHgwMDEwLCAweDA4MGMsIDB4NTgwZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDhjLAorCTB4OTAwNSwgMHgwNWE4LCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4OTA4NiwgMHgwMDE0LAorCTB4MTU2MCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA1LAorCTB4MTUyMCwgMHg3ODM0LCAweDkwODQsIDB4MDEwMCwgMHgyMDExLCAweDAxMDAsIDB4OTIxZSwgMHgxMTYwLAorCTB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywgMHgwMDAxLAorCTB4NzA5NywgMHgwMDBhLCAweDAwYjEsIDB4MDA5OCwgMHg5MDA1LCAweDExNzgsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDEyOCwgMHg3MGMwLCAweDkwMDUsIDB4MTExMCwgMHg3MGMzLCAweDAwMDEsIDB4NzA5MywgMHgwMDAwLAorCTB4NzA5NywgMHgwMDBlLCAweDA4MGMsIDB4NWE1YywgMHgwMDEwLCAweDA4MGMsIDB4NWVlMSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwOTcsIDB4MDAwYiwgMHgyMDExLCAweDFjMGUsIDB4MjBlOSwgMHgwMDAxLAorCTB4MjJhMCwgMHgyMGE5LCAweDAwNDAsIDB4MjAxOSwgMHhmZmZmLCAweDQzMDQsIDB4MDgwYywgMHg1ZTg5LAorCTB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwNiwgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg1ZWU4LAorCTB4MDExOCwgMHgyMDEzLCAweDAwMDAsIDB4MDAyMCwgMHg3MDVjLCAweDkwODUsIDB4MDEwMCwgMHgyMDEyLAorCTB4MjBhOSwgMHgwMDQwLCAweDIwMDksIDB4MDI0ZSwgMHgyMDExLCAweDFjMGUsIDB4MjIwZSwgMHg4MjEwLAorCTB4ODEwOCwgMHg5MTg2LCAweDAyNjAsIDB4MTEyOCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDA5LAorCTB4MDI0MCwgMHgxZjA0LCAweDU5ZGUsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NWRiZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwgMHgwMWMwLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLAorCTB4ODJkYSwgMHg5MDg2LCAweDAwODQsIDB4MTE3OCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwgMHgwMjYwLAorCTB4N2EzMCwgMHg5Mjk2LCAweDExMDYsIDB4MTEzOCwgMHg3ODM0LCAweDkwMDUsIDB4MTEyMCwgMHg3MDk3LAorCTB4MDAwYywgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg1ZWUxLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4NzA5NywgMHgwMDBkLCAweDA4MGMsIDB4NWU4OSwgMHgyMDc5LCAweDAyNDAsIDB4NzgzMywgMHgxMTA3LAorCTB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NWYwNSwgMHgyMGE5LCAweDAwNDAsIDB4MjAxMSwgMHgwMjZlLAorCTB4MjAwOSwgMHgwMjRlLCAweDIyMGUsIDB4ODIxMCwgMHg4MTA4LCAweDkxODYsIDB4MDI2MCwgMHgxMTUwLAorCTB4NjgxMCwgMHg4MDAwLCAweDY4MTIsIDB4MjAwOSwgMHgwMjQwLCAweDY4MTQsIDB4ODAwMCwgMHg2ODE2LAorCTB4MjAxMSwgMHgwMjYwLCAweDFmMDQsIDB4NWEyMiwgMHg2MGMzLCAweDAwODQsIDB4MDgwYywgMHg1ZGJlLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywgMHg5MDA1LCAweDAxZTAsIDB4MjAxMSwgMHg1ZDk0LAorCTB4MDgwYywgMHg4MmRhLCAweDkwODYsIDB4MDA4NCwgMHgxMTk4LCAweDA4MGMsIDB4NWYwNSwgMHgyMDc5LAorCTB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNywgMHgxMTU4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTQwLAorCTB4NzA5MywgMHgwMDAxLCAweDA4MGMsIDB4NWU1YiwgMHg3MDk3LCAweDAwMGUsIDB4MDAyOSwgMHgwMDEwLAorCTB4MDgwYywgMHg1ZWUxLCAweDAwZmUsIDB4MDAwNSwgMHg5MThkLCAweDAwMDEsIDB4MDgwYywgMHg1ZjMwLAorCTB4NzA5NywgMHgwMDBmLCAweDcwOGYsIDB4MDAwMCwgMHgyMDYxLCAweDAxNDAsIDB4NjA1YiwgMHhiYzg1LAorCTB4NjA1ZiwgMHhiNWI1LCAweDIwNjEsIDB4MDEwMCwgMHg2MDQzLCAweDAwMDUsIDB4NjA0MywgMHgwMDA0LAorCTB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLCAweDgyY2UsIDB4MDAwNSwgMHg3MDhjLAorCTB4OTAwNSwgMHgwMTMwLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4NzA5NywgMHgwMDAwLAorCTB4MDAwNSwgMHg3MDk3LCAweDAwMTEsIDB4MDgwYywgMHg5ZWViLCAweDA4MGMsIDB4NWYwNSwgMHgyMGUxLAorCTB4MDAwMCwgMHgyMDk5LCAweDAyNjAsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0MCwgMHg3NDhjLAorCTB4OTQ4MCwgMHgwMDE4LCAweDkwODAsIDB4MDAwNywgMHg5MDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LAorCTB4NDAwMywgMHgwODBjLCAweDVlZTgsIDB4MTFhMCwgMHg3MTc4LCAweDgxZmYsIDB4MDE4OCwgMHg5MDBlLAorCTB4NzA3YywgMHg5MDg0LCAweDAwZmYsIDB4MDE2MCwgMHgwODBjLCAweDI3NmUsIDB4OTE4NiwgMHgwMDdlLAorCTB4MDEzOCwgMHg5MTg2LCAweDAwODAsIDB4MDEyMCwgMHgyMDExLCAweDAwMDgsIDB4MDgwYywgMHg1ZDQxLAorCTB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NWRiZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywgMHg5MDA1LAorCTB4MDUwMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmRhLCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LAorCTB4MDgwYywgMHg1ZjA1LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwMywgMHgxMTc4LAorCTB4NzgzNCwgMHg5MDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjMCwgMHg5MDA1LAorCTB4MTExMCwgMHg3MGMzLCAweDAwMDEsIDB4NzA5NywgMHgwMDEyLCAweDAwMjksIDB4MDAxMCwgMHg3MDhmLAorCTB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDk3LCAweDAwMTMsIDB4MDgwYywgMHg1ZTk3LAorCTB4MjA3OSwgMHgwMjQwLCAweDc4MzMsIDB4MTEwMywgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg1ZjA1LAorCTB4MDgwYywgMHg1ZWU4LCAweDExNzAsIDB4NzA4MCwgMHg5MDA1LCAweDExNTgsIDB4NzE1OCwgMHg5MTg2LAorCTB4ZmZmZiwgMHgwMTM4LCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLCAweDVkNDEsIDB4MDE2OCwgMHgwODBjLAorCTB4NWViZSwgMHgyMGE5LCAweDAwMDgsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNGUsIDB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZGJlLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4YywgMHg5MDA1LCAweDA1MDAsIDB4MjAxMSwgMHg1ZDk0LAorCTB4MDgwYywgMHg4MmRhLCAweDkwODYsIDB4MDAxNCwgMHgxMWI4LCAweDA4MGMsIDB4NWYwNSwgMHgyMDc5LAorCTB4MDI2MCwgMHg3YTMwLCAweDkyOTYsIDB4MTEwNCwgMHgxMTc4LCAweDc4MzQsIDB4OTAwNSwgMHgxMTYwLAorCTB4N2EzOCwgMHhkMmZjLCAweDAxMjgsIDB4NzBjMCwgMHg5MDA1LCAweDExMTAsIDB4NzBjMywgMHgwMDAxLAorCTB4NzA5NywgMHgwMDE0LCAweDAwMjksIDB4MDAxMCwgMHg3MDhmLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDk3LCAweDAwMTUsIDB4MDgwYywgMHg1ZTk3LCAweDIwNzksIDB4MDI0MCwgMHg3ODMzLAorCTB4MTEwNCwgMHg3ODM3LCAweDAwMDAsIDB4MDgwYywgMHg1ZjA1LCAweDA4MGMsIDB4NWVlOCwgMHgxMWI4LAorCTB4NzA4MCwgMHg5MDA1LCAweDExYTAsIDB4NzE2MCwgMHg5MTg2LCAweGZmZmYsIDB4MDE4MCwgMHg5MTgwLAorCTB4MzJlOSwgMHgyMDBkLCAweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDIwMTEsIDB4MDAwOCwgMHgwODBjLAorCTB4NWQ0MSwgMHgwMTgwLCAweDA4MGMsIDB4NGVkOCwgMHgwMTEwLCAweDA4MGMsIDB4MjdkNywgMHgyMGE5LAorCTB4MDAwOCwgMHgyMGUxLCAweDAwMDAsIDB4MjA5OSwgMHgwMjZlLCAweDIwZTksIDB4MDAwMCwgMHgyMGExLAorCTB4MDI0ZSwgMHg0MDAzLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDVkYmUsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHg3MDhjLCAweDkwMDUsIDB4MDVmMCwgMHgyMDExLCAweDVkOTQsIDB4MDgwYywgMHg4MmRhLAorCTB4OTA4NiwgMHgwMDE0LCAweDE1YTgsIDB4MDgwYywgMHg1ZjA1LCAweDIwNzksIDB4MDI2MCwgMHg3YTMwLAorCTB4OTI5NiwgMHgxMTA1LCAweDE1NjgsIDB4NzgzNCwgMHg5MDg0LCAweDAxMDAsIDB4MjAxMSwgMHgwMTAwLAorCTB4OTIxZSwgMHgxMTY4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweDVmMzAsIDB4N2EzOCwgMHhkMmZjLAorCTB4MDEyOCwgMHg3MGMwLCAweDkwMDUsIDB4MTExMCwgMHg3MGMzLCAweDAwMDEsIDB4MDA4MCwgMHg5MDA1LAorCTB4MTFiOCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGMwLCAweDkwMDUsIDB4MTExMCwgMHg3MGMzLAorCTB4MDAwMSwgMHg5MDg1LCAweDAwMDEsIDB4MDgwYywgMHg1ZjMwLCAweDcwOTMsIDB4MDAwMCwgMHg3YTM4LAorCTB4ZDJmNCwgMHgwMTEwLCAweDcwZGIsIDB4MDAwOCwgMHg3MDk3LCAweDAwMTYsIDB4MDAyOSwgMHgwMDEwLAorCTB4NzA4ZiwgMHgwMDAwLCAweDAwZmUsIDB4MDAwNSwgMHgwODBjLCAweDllZWIsIDB4MDgwYywgMHg1ZjA1LAorCTB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2MCwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjQwLAorCTB4MjBhOSwgMHgwMDBlLCAweDQwMDMsIDB4MjAxMSwgMHgwMjZkLCAweDIyMDQsIDB4OTA4NCwgMHgwMTAwLAorCTB4MjAxMSwgMHgwMjRkLCAweDIwMTIsIDB4MjAxMSwgMHgwMjZlLCAweDcwOTcsIDB4MDAxNywgMHgwODBjLAorCTB4NWVlOCwgMHgxMTUwLCAweDcwODAsIDB4OTAwNSwgMHgxMTM4LCAweDA4MGMsIDB4NWNiNCwgMHgxMTg4LAorCTB4OTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjdkNywgMHgyMGE5LCAweDAwMDgsIDB4MDgwYywgMHg1ZjA1LAorCTB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjRlLAorCTB4NDAwMywgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg1ZGJlLCAweDAwMTAsIDB4MDgwYywgMHg1ODBlLAorCTB4MDAwNSwgMHgwMGY2LCAweDcwOGMsIDB4OTAwNSwgMHgwMWQ4LCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLAorCTB4ODJkYSwgMHg5MDg2LCAweDAwODQsIDB4MTE5MCwgMHgwODBjLCAweDVmMDUsIDB4MjA3OSwgMHgwMjYwLAorCTB4N2EzMCwgMHg5Mjk2LCAweDExMDYsIDB4MTE1MCwgMHg3ODM0LCAweDkwMDUsIDB4MTEzOCwgMHg5MDA2LAorCTB4MDgwYywgMHg1ZjMwLCAweDcwOTcsIDB4MDAxOCwgMHgwMDI5LCAweDAwMTAsIDB4NzA4ZiwgMHgwMDAwLAorCTB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4NzA5NywgMHgwMDE5LCAweDA4MGMsIDB4NWU5NywgMHgyMDc5LAorCTB4MDI0MCwgMHg3ODMzLCAweDExMDYsIDB4NzgzNywgMHgwMDAwLCAweDA4MGMsIDB4NWYwNSwgMHgyMDA5LAorCTB4MDI2ZSwgMHgyMDM5LCAweDFjMGUsIDB4MjBhOSwgMHgwMDQwLCAweDIxM2UsIDB4ODczOCwgMHg4MTA4LAorCTB4OTE4NiwgMHgwMjgwLCAweDExMjgsIDB4NjgxNCwgMHg4MDAwLCAweDY4MTYsIDB4MjAwOSwgMHgwMjYwLAorCTB4MWYwNCwgMHg1YzFkLCAweDIwMzksIDB4MWMwZSwgMHgwODBjLCAweDVlZTgsIDB4MTFlOCwgMHgyNzI4LAorCTB4MjUxNCwgMHg4MjA3LCAweDkwODQsIDB4MDBmZiwgMHg4MDAwLCAweDIwMTgsIDB4OTI5NCwgMHgwMGZmLAorCTB4ODAwNywgMHg5MjA1LCAweDIwMmEsIDB4NzA1YywgMHgyMzEwLCAweDgyMTQsIDB4OTJhMCwgMHgxYzBlLAorCTB4MjQxNCwgMHg5MzhjLCAweDAwMDEsIDB4MDExOCwgMHg5Mjk0LCAweGZmMDAsIDB4MDAxOCwgMHg5Mjk0LAorCTB4MDBmZiwgMHg4MDA3LCAweDkyMTUsIDB4MjIyMiwgMHgyMGE5LCAweDAwNDAsIDB4MjAwOSwgMHgwMjRlLAorCTB4MjcwZSwgMHg4NzM4LCAweDgxMDgsIDB4OTE4NiwgMHgwMjYwLCAweDExMjgsIDB4NjgxMCwgMHg4MDAwLAorCTB4NjgxMiwgMHgyMDA5LCAweDAyNDAsIDB4MWYwNCwgMHg1YzUwLCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLAorCTB4NWRiZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHg3MDhjLCAweDkwMDUsIDB4MDFlMCwgMHgyMDExLAorCTB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4OTA4NiwgMHgwMDg0LCAweDExOTgsIDB4MDgwYywgMHg1ZjA1LAorCTB4MjA3OSwgMHgwMjYwLCAweDdhMzAsIDB4OTI5NiwgMHgxMTA3LCAweDExNTgsIDB4NzgzNCwgMHg5MDA1LAorCTB4MTE0MCwgMHg3MDkzLCAweDAwMDEsIDB4MDgwYywgMHg1ZTViLCAweDcwOTcsIDB4MDAxYSwgMHgwMDI5LAorCTB4MDAxMCwgMHg3MDhmLCAweDAwMDAsIDB4MDBmZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLAorCTB4NWYzMCwgMHg3MDk3LCAweDAwMWIsIDB4MDgwYywgMHg5ZWViLCAweDA4MGMsIDB4NWYwNSwgMHgyMDExLAorCTB4MDI2MCwgMHgyMDA5LCAweDAyNDAsIDB4NzQ4YywgMHg5NDgwLCAweDAwMTgsIDB4OTA4MCwgMHgwMDA3LAorCTB4OTA4NCwgMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHgyMjBlLCAweDgyMTAsIDB4ODEwOCwgMHg5MTg2LAorCTB4MDI2MCwgMHgxMTUwLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwMDksIDB4MDI0MCwgMHg2ODE0LAorCTB4ODAwMCwgMHg2ODE2LCAweDIwMTEsIDB4MDI2MCwgMHgxZjA0LCAweDVjOWMsIDB4NjBjMywgMHgwMDg0LAorCTB4MDgwYywgMHg1ZGJlLCAweDAwMDUsIDB4MDAwNSwgMHgwMDg2LCAweDAwOTYsIDB4MjAyOSwgMHgxODVjLAorCTB4MjUyYywgMHgyMGE5LCAweDAwMDgsIDB4MjA0MSwgMHgxYzBlLCAweDIwZTksIDB4MDAwMSwgMHgyOGEwLAorCTB4MDgwYywgMHg1ZjA1LCAweDIwZTEsIDB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4NDAwMywgMHgyMGE5LAorCTB4MDAwOCwgMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMTA4LCAweDkwMTYsIDB4MjgwMCwgMHg5MjAwLAorCTB4MjAwYywgMHg5MWE2LCAweGZmZmYsIDB4MTE0OCwgMHhkNWQ0LCAweDAxMTAsIDB4ODIxMCwgMHgwMDA4LAorCTB4ODIxMSwgMHgxZjA0LCAweDVjY2UsIDB4MDgwNCwgMHg1ZDNkLCAweDgyZmYsIDB4MTE2MCwgMHhkNWQ0LAorCTB4MDEyMCwgMHg5MWE2LCAweDNmZmYsIDB4MGQ5MCwgMHgwMDIwLCAweDkxYTYsIDB4M2ZmZiwgMHgwOTA0LAorCTB4NWQzZCwgMHg5MThkLCAweGMwMDAsIDB4MjBhOSwgMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHhkNWQ0LAorCTB4MDExMCwgMHgyMDE5LCAweDAwMTAsIDB4MjEyMCwgMHhkNWQ0LCAweDAxMTAsIDB4ODQyMywgMHgwMDA4LAorCTB4ODQyNCwgMHgxMjQwLCAweGQ1ZDQsIDB4MDExMCwgMHg4MzE5LCAweDAwMDgsIDB4ODMxOCwgMHgxZjA0LAorCTB4NWNmNCwgMHgwNGQ4LCAweDIzYTgsIDB4MjAyMSwgMHgwMDAxLCAweDg0MjYsIDB4ODQyNSwgMHgxZjA0LAorCTB4NWQwNiwgMHgyMzI4LCAweDg1MjksIDB4OTJiZSwgMHgwMDA3LCAweDAxNTgsIDB4MDAwNiwgMHgyMDM5LAorCTB4MDAwNywgMHgyMjAwLCAweDk3M2EsIDB4MDAwZSwgMHgyN2E4LCAweDk1YTgsIDB4MDAxMCwgMHgxZjA0LAorCTB4NWQxNSwgMHg3NTVhLCAweDk1YzgsIDB4MzJlOSwgMHgyOTJkLCAweDk1YWMsIDB4MDBmZiwgMHg3NTdlLAorCTB4NjUzMiwgMHg2NTM2LCAweDAwMTYsIDB4MjUwOCwgMHgwODBjLCAweDI3YjcsIDB4MDAxZSwgMHg2MGU3LAorCTB4MDAwMCwgMHg2NWVhLCAweDIwMTgsIDB4MjMwNCwgMHg5NDA1LCAweDIwMWEsIDB4NzA4MywgMHgwMDAxLAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0ZSwgMHgyMGUxLCAweDAwMDEsIDB4Mjg5OCwgMHgyMGE5LAorCTB4MDAwOCwgMHg0MDAzLCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDA5ZSwgMHgwMDhlLAorCTB4MDAwNSwgMHgwMTU2LCAweDAxYzYsIDB4MDFkNiwgMHgwMTM2LCAweDAxNDYsIDB4MjJhOCwgMHgyMGUxLAorCTB4MDAwMCwgMHgyMDk5LCAweDAyNmUsIDB4MjBlOSwgMHgwMDAwLCAweDIwMTEsIDB4MDI0ZSwgMHgyMmEwLAorCTB4NDAwMywgMHgwMTRlLCAweDAxM2UsIDB4MDFkZSwgMHgwMWNlLCAweDAxNWUsIDB4MjExOCwgMHg5MDI2LAorCTB4MjAwMSwgMHgwMDA3LCAweDkzOWEsIDB4MDAxMCwgMHgwMjE4LCAweDg0MjAsIDB4ODAwMSwgMHgwY2QwLAorCTB4MjExOCwgMHg4NGZmLCAweDAxMjAsIDB4OTM5YSwgMHgwMDEwLCAweDg0MjEsIDB4MWRlMCwgMHgyMDIxLAorCTB4MDAwMSwgMHg4M2ZmLCAweDAxMTgsIDB4ODQyMywgMHg4MzE5LCAweDFkZTgsIDB4OTIzOCwgMHgyMDI5LAorCTB4MDI2ZSwgMHg5NTI4LCAweDI1MDQsIDB4OTQyYywgMHgxMWI4LCAweDk0MDUsIDB4MjAzYSwgMHg3MTVhLAorCTB4OTFhMCwgMHgzMmU5LCAweDI0MmQsIDB4OTVhYywgMHgwMGZmLCAweDc1N2UsIDB4NjUzMiwgMHg2NTM2LAorCTB4MDAxNiwgMHgyNTA4LCAweDA4MGMsIDB4MjdiNywgMHgwMDFlLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLAorCTB4NzA4MywgMHgwMDAxLCAweDkwODQsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4NzA4NywgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLAorCTB4MjA3MSwgMHgwMTQwLCAweDA4MGMsIDB4NWU0YSwgMHgwODBjLCAweDk2NTYsIDB4NzAwNCwgMHg5MDg0LAorCTB4NDAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MmM5OCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MTgyNSwgMHgyMDczLCAweDAwMDAsIDB4Nzg0MCwgMHgwMDI2LCAweDAwMTYsIDB4MjAwOSwgMHgwMGY3LAorCTB4MDgwYywgMHg1ZWE3LCAweDAwMWUsIDB4OTA5NCwgMHgwMDEwLCAweDkyODUsIDB4MDA4MCwgMHg3ODQyLAorCTB4N2E0MiwgMHgwMDJlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDJhZmUsIDB4MDIyOCwgMHgyMDExLCAweDAxMDEsIDB4MjIwNCwgMHhjMGM1LAorCTB4MjAxMiwgMHgyMDExLCAweDE5YzksIDB4MjAxMywgMHgwMDAwLCAweDcwOGYsIDB4MDAwMCwgMHgwMTJlLAorCTB4NjBhMywgMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgwODBjLCAweDk2NGQsIDB4NjE0NCwgMHhkMTg0LAorCTB4MDEyMCwgMHg3MTk0LCAweDkxOGQsIDB4MjAwMCwgMHgwMDE4LCAweDcxODgsIDB4OTE4ZCwgMHgxMDAwLAorCTB4MjAxMSwgMHgxOTcxLCAweDIxMTIsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NWQ5NCwgMHgwODBjLAorCTB4ODM2YywgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhhMDY5LCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDVlYTcsIDB4MjA2MSwgMHgxOWQyLAorCTB4OTAwZSwgMHg2MTFhLCAweDYxMWUsIDB4NjE3MiwgMHg2MTc2LCAweDIwNjEsIDB4MTgwMCwgMHg2MDAzLAorCTB4MDAwMSwgMHgyMDYxLCAweDAxMDAsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyMDA5LAorCTB4MTk3MSwgMHgyMDBiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NWUxNiwgMHgwODBjLAorCTB4ODJjZSwgMHgwMTJlLCAweDAwY2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDQ3MSwgMHgyMDcxLCAweDAxMDAsIDB4MDgwYywgMHg5NjU2LAorCTB4MjA3MSwgMHgwMTQwLCAweDcwMDQsIDB4OTA4NCwgMHg0MDAwLCAweDAxMTAsIDB4MDgwYywgMHgyYzk4LAorCTB4MDgwYywgMHg3MjBmLCAweDAxODgsIDB4MDgwYywgMHg3MjJhLCAweDExNzAsIDB4MDgwYywgMHg3NTBlLAorCTB4MDAxNiwgMHgwODBjLCAweDI4ODYsIDB4MjAwMSwgMHgxOTQ1LCAweDIxMDIsIDB4MDAxZSwgMHgwODBjLAorCTB4NzUwOSwgMHgwODBjLCAweDcxMjcsIDB4MDA1MCwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgyYmI2LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjcxNywgMHgwODBjLCAweDVkZWEsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwYmMsIDB4MDE1OCwgMHgwMDI2LAorCTB4MDAzNiwgMHgyMDExLCAweDgwMTcsIDB4MjAwMSwgMHgxOTcxLCAweDIwMWMsIDB4MDgwYywgMHg0YjFmLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MjBhOSwgMHgwMDEyLCAweDIwZTksIDB4MDAwMSwgMHgyMGExLAorCTB4MWM4MCwgMHgwODBjLCAweDVmMDUsIDB4MjBlOSwgMHgwMDAwLCAweDIwOTksIDB4MDI2ZSwgMHgwMDk5LAorCTB4MjBhOSwgMHgwMDIwLCAweDA4MGMsIDB4NWVmZiwgMHgyMDk5LCAweDAyNjAsIDB4MjBhMSwgMHgxYzkyLAorCTB4MDA1MSwgMHgyMGE5LCAweDAwMGUsIDB4MDgwYywgMHg1ZjAyLCAweDIwOTksIDB4MDI2MCwgMHgyMGExLAorCTB4MWNiMiwgMHgwMDA5LCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDM0MTAsIDB4MzMwOCwgMHgyMTA0LAorCTB4ODAwNywgMHgyMDEyLCAweDgxMDgsIDB4ODIxMCwgMHgxZjA0LCAweDVlN2YsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwODBjLCAweDllZWIsIDB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MWMwMCwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDBjLCAweDQwMDMsIDB4MDAwNSwgMHgwODBjLAorCTB4OWVlYiwgMHgwODBjLCAweDVmMDUsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI2MCwgMHgyMGU5LAorCTB4MDAwMCwgMHgyMGExLCAweDAyNDAsIDB4MjBhOSwgMHgwMDBjLCAweDQwMDMsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDAwNiwgMHgyMDYxLCAweDAxMDAsIDB4ODEwZiwgMHgyMDAxLCAweDE4MzMsIDB4MjAwNCwgMHg5MDA1LAorCTB4MTEzOCwgMHgyMDAxLCAweDE4MTcsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTEwNSwgMHgwMDEwLAorCTB4OTE4NSwgMHgwMGY3LCAweDYwNGEsIDB4MDAwZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDQ2LAorCTB4MDgwYywgMHg2N2JmLCAweDAxNTgsIDB4OTAwNiwgMHgyMDIwLCAweDIwMDksIDB4MDAyYSwgMHgwODBjLAorCTB4ZDg4NSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMTk1LCAweDIxMDIsIDB4MjAxOSwgMHgwMDJhLAorCTB4OTAwZSwgMHgwODBjLCAweDMxNTYsIDB4MDgwYywgMHhjNTM5LCAweDAxNDAsIDB4MDAzNiwgMHgyMDE5LAorCTB4ZmZmZiwgMHgyMDIxLCAweDAwMDcsIDB4MDgwYywgMHg0Y2JjLCAweDAwM2UsIDB4MDA0ZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwODBjLCAweDVkZWEsIDB4NzA5NywgMHgwMDAwLCAweDcwOGYsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDE4MGMsIDB4MjAwNCwgMHhkMDljLCAweDAxMDAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsIDB4MDEwMSwgMHgyMDBjLAorCTB4OTE4ZCwgMHgwMDA2LCAweDIxMDIsIDB4MDEyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgyMDA5LAorCTB4MDAwMSwgMHgwMDIwLCAweDIwMDksIDB4MDAwMiwgMHgwMDA4LCAweDkwMGUsIDB4NjgxNCwgMHg5MDg0LAorCTB4ZmZjMCwgMHg5MTBkLCAweDY5MTYsIDB4MDAwNSwgMHgwMGY2LCAweDAxNTYsIDB4MDE0NiwgMHgwMWQ2LAorCTB4OTAwNiwgMHgyMGE5LCAweDAwODAsIDB4MjBlOSwgMHgwMDAxLCAweDIwYTEsIDB4MWMwMCwgMHg0MDA0LAorCTB4MjA3OSwgMHgxYzAwLCAweDc4MDMsIDB4MjIwMCwgMHg3ODA3LCAweDAwZWYsIDB4NzgwZiwgMHgwMGVmLAorCTB4NzgxMywgMHgwMTM4LCAweDc4MjMsIDB4ZmZmZiwgMHg3ODI3LCAweGZmZmYsIDB4MDFkZSwgMHgwMTRlLAorCTB4MDE1ZSwgMHgwMGZlLCAweDAwMDUsIDB4MjAwMSwgMHgxODAwLCAweDIwMDMsIDB4MDAwMSwgMHgwMDA1LAorCTB4MjAwMSwgMHgxOTdlLCAweDAxMTgsIDB4MjAwMywgMHgwMDAxLCAweDAwMTAsIDB4MjAwMywgMHgwMDAwLAorCTB4MDAwNSwgMHgwMTU2LCAweDIwYTksIDB4MDgwMCwgMHgyMDA5LCAweDEwMDAsIDB4OTAwNiwgMHgyMDBhLAorCTB4ODEwOCwgMHgxZjA0LCAweDVmM2YsIDB4MDE1ZSwgMHgwMDA1LCAweDAwZDYsIDB4MDAzNiwgMHgwMTU2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDIwNjksIDB4MTg1YiwgMHg5MDA2LCAweGI4MDIsIDB4YjhiZSwgMHhiODA3LAorCTB4MDcwNywgMHhiODBhLCAweGI4MGUsIDB4YjgxMiwgMHg5MTk4LCAweDMyZTksIDB4MjMxZCwgMHg5MzljLAorCTB4MDBmZiwgMHhiYjE2LCAweDAwMTYsIDB4MDAyNiwgMHhiOGIyLCAweDA4MGMsIDB4YTA2MiwgMHgxMTIwLAorCTB4OTE5MiwgMHgwMDdlLCAweDEyMDgsIDB4YmJiMiwgMHgyMGE5LCAweDAwMDQsIDB4YjhiNCwgMHgyMGU4LAorCTB4YjliOCwgMHg5MTk4LCAweDAwMDYsIDB4OTAwNiwgMHgyM2EwLCAweDQwMDQsIDB4MjBhOSwgMHgwMDA0LAorCTB4OTE5OCwgMHgwMDBhLCAweDIzYTAsIDB4NDAwNCwgMHgwMDJlLCAweDAwMWUsIDB4YjgzZSwgMHhiODQyLAorCTB4Yjg0ZSwgMHhiODUyLCAweGI4NTYsIDB4Yjg1YSwgMHhiODVlLCAweGI4NjIsIDB4Yjg2NiwgMHhiODZhLAorCTB4Yjg2ZiwgMHgwMTAwLCAweGI4NzIsIDB4Yjg3NiwgMHhiODdhLCAweGI4OGEsIDB4Yjg4ZSwgMHhiODkzLAorCTB4MDAwOCwgMHhiODk2LCAweGI4OWEsIDB4Yjg5ZSwgMHhiOGFlLCAweGI5YTIsIDB4MDA5NiwgMHhiOGE0LAorCTB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTA2MywgMHhiOGE3LCAweDAwMDAsIDB4MDA5ZSwgMHg5MDA2LAorCTB4Yjg0YSwgMHg2ODEwLCAweGI4M2EsIDB4NjgwYywgMHhiODQ2LCAweDY4MTQsIDB4OTA4NCwgMHgwMGZmLAorCTB4Yjg0MiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMDNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweGE5NzQsIDB4YWU3OCwgMHg5Njg0LCAweDNmZmYsIDB4OTA4MiwgMHg0MDAwLAorCTB4MWEwNCwgMHg2MDE1LCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LCAweDYwMTksIDB4MjAwMSwgMHgxODBjLAorCTB4MjAwNCwgMHg5MDg0LCAweDAwMDMsIDB4MTkwNCwgMHg2MDFmLCAweDkxODgsIDB4MTAwMCwgMHgyMTA0LAorCTB4OTA1ZCwgMHgwNTE4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLCAweDkwOGUsIDB4MDAwNiwgMHgxNTA4LAorCTB4YjhhNCwgMHg5MDBkLCAweDE5MDQsIDB4NjAzMSwgMHhiODUwLCAweDkwMGQsIDB4MTE0OCwgMHhhODAyLAorCTB4MjkwMCwgMHhiODUyLCAweGI4NGUsIDB4MDgwYywgMHg4Njk2LCAweDkwMDYsIDB4MDEyZSwgMHgwMDA1LAorCTB4MDBhNiwgMHgyMTUwLCAweDI5MDAsIDB4YjAwMiwgMHhhODAzLCAweDAwMDAsIDB4MDBhZSwgMHhiODUyLAorCTB4MGM5MCwgMHgyMDAxLCAweDAwMDUsIDB4OTAwZSwgMHgwNGI4LCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLAorCTB4MDQ5OCwgMHg5MDgyLCAweDAwMDYsIDB4MTI5MCwgMHgwODBjLCAweGEwNjIsIDB4MTE2MCwgMHhiOGEwLAorCTB4OTA4NCwgMHhmZjgwLCAweDExNDAsIDB4YjkwMCwgMHhkMWZjLCAweDA5OTAsIDB4MjAwMSwgMHgwMDI5LAorCTB4MjAwOSwgMHgxMDAwLCAweDA0MDgsIDB4MjAwMSwgMHgwMDI4LCAweDAwYTgsIDB4MjAwOSwgMHgxODBjLAorCTB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwNjgsIDB4ZDE4NCwgMHgwMTE4LAorCTB4MjAwMSwgMHgwMDA0LCAweDAwNDAsIDB4MjAwMSwgMHgwMDI5LCAweGI5MDAsIDB4ZDFmYywgMHgwMTE4LAorCTB4MjAwOSwgMHgxMDAwLCAweDAwNDgsIDB4OTAwZSwgMHgwMDM4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLAorCTB4MDAxOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwgMHg5MDA1LCAweDAxMmUsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTgwYywgMHgyMDA0LCAweGQwODQsIDB4MTlkMCwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLAorCTB4MDlhOCwgMHgwODBjLCAweDY3YzMsIDB4MTk5MCwgMHhiODAwLCAweGQwYmMsIDB4MDk3OCwgMHgwODA0LAorCTB4NWZjOCwgMHgwODBjLCAweDY2M2IsIDB4MDkwNCwgMHg1ZmUxLCAweDA4MDQsIDB4NWZjYywgMHgwMGI2LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOTc0LCAweDkxODIsIDB4MDgwMCwgMHgxYTA0LAorCTB4NjBiNSwgMHg5MTg4LCAweDEwMDAsIDB4MjEwNCwgMHg5MDVkLCAweDA5MDQsIDB4NjA4ZCwgMHhiOGEwLAorCTB4OTA4NiwgMHgwMDdmLCAweDAxOTAsIDB4YTg3YywgMHhkMGZjLCAweDExNzgsIDB4MDgwYywgMHg2N2NiLAorCTB4MDE2MCwgMHhhOTk0LCAweDgxZmYsIDB4MDEzMCwgMHg5MDhlLCAweDAwMDQsIDB4MDEzMCwgMHg5MDhlLAorCTB4MDAwNSwgMHgwMTE4LCAweDA4MGMsIDB4NjdjMywgMHgxNTk4LCAweGE4N2MsIDB4ZDBmYywgMHgwMWUwLAorCTB4YTg5NCwgMHg5MDA1LCAweDAxYzgsIDB4MjA2MCwgMHgwMDI2LCAweDIwMTAsIDB4MDgwYywgMHhiZTI1LAorCTB4MDAyZSwgMHgxMTIwLCAweDIwMDEsIDB4MDAwOCwgMHgwODA0LCAweDYwYjcsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwYSwgMHgwMTIwLCAweDIwMDEsIDB4MDAwOCwgMHgwODA0LCAweDYwYjcsIDB4NjAxYSwgMHg2MDAzLAorCTB4MDAwOCwgMHgyOTAwLCAweDYwMTYsIDB4MDA1OCwgMHgwODBjLCAweGEwOGQsIDB4MDVlOCwgMHgyYjAwLAorCTB4NjAxMiwgMHgyOTAwLCAweDYwMTYsIDB4NjAwYiwgMHhmZmZmLCAweDYwMjMsIDB4MDAwYSwgMHgyMDA5LAorCTB4MDAwMywgMHgwODBjLCAweGExNWQsIDB4OTAwNiwgMHgwNDU4LCAweDIwMDEsIDB4MDAyOCwgMHgwNDM4LAorCTB4OTA4MiwgMHgwMDA2LCAweDEyOTAsIDB4MDgwYywgMHhhMDYyLCAweDExNjAsIDB4YjhhMCwgMHg5MDg0LAorCTB4ZmY4MCwgMHgxMTQwLCAweGI5MDAsIDB4ZDFmYywgMHgwOTAwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LAorCTB4MTAwMCwgMHgwMGE4LCAweDIwMDEsIDB4MDAyOCwgMHgwMDkwLCAweDIwMDksIDB4MTgwYywgMHgyMTBjLAorCTB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDUwLCAweGQxODQsIDB4MDExOCwgMHgyMDAxLAorCTB4MDAwNCwgMHgwMDI4LCAweDIwMDEsIDB4MDAyOSwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDA1LAorCTB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMmMsIDB4MGNjMCwgMHgwMGY2LAorCTB4MDBiNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhOGUwLCAweDkwMDUsIDB4MTU1MCwgMHhhOGRjLAorCTB4OTA4MiwgMHgwMTAxLCAweDE2MzAsIDB4YThjOCwgMHg5MDA1LCAweDE1MTgsIDB4YThjNCwgMHg5MDgyLAorCTB4MDEwMSwgMHgxMmY4LCAweGE5NzQsIDB4MjA3OSwgMHgxODAwLCAweDkxODIsIDB4MDgwMCwgMHgxMmU4LAorCTB4NzgzMCwgMHg5MDg0LCAweDAwMDMsIDB4MTEzMCwgMHhhYTk4LCAweGFiOTQsIDB4YTg3OCwgMHg5MDg0LAorCTB4MDAwNywgMHgwMGVhLCAweDc5MzAsIDB4ZDE4YywgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDM4LAorCTB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDEwLCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLAorCTB4MDAzOCwgMHgyMDAxLCAweDAwMmMsIDB4OTAwZSwgMHgwMDE4LCAweDIwMDEsIDB4MDAyOSwgMHg5MDBlLAorCTB4OTAwNiwgMHgwMDA4LCAweDkwMDUsIDB4MDEyZSwgMHgwMGJlLCAweDAwZmUsIDB4MDAwNSwgMHg2MTRjLAorCTB4NjEwNywgMHg2MTFlLCAweDYxNGMsIDB4NjE0YywgMHg2MTRjLCAweDYxNGMsIDB4NjE0YywgMHgyMTAwLAorCTB4OTA4MiwgMHgwMDdlLCAweDEyNzgsIDB4MDgwYywgMHg2NDNmLCAweDAxNDgsIDB4OTA0NiwgMHhiODEwLAorCTB4OTMwNiwgMHgxOTA0LCAweDYxNTQsIDB4YjgxNCwgMHg5MjA2LCAweDE1ZjAsIDB4MDAyOCwgMHhiYjEyLAorCTB4YmExNiwgMHgwMDEwLCAweDA4MGMsIDB4NDlkOSwgMHgwMTUwLCAweDA0YjAsIDB4MDgwYywgMHg2NDlmLAorCTB4MTU5OCwgMHhiODEwLCAweDkzMDYsIDB4MTU4MCwgMHhiODE0LCAweDkyMDYsIDB4MTU2OCwgMHgwODBjLAorCTB4YTA4ZCwgMHgwNTMwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4MjkwMCwgMHg2MDE2LAorCTB4NjAwYiwgMHhmZmZmLCAweDYwMjMsIDB4MDAwYSwgMHhhODc4LCAweDkwODYsIDB4MDAwMSwgMHgxMTcwLAorCTB4MDgwYywgMHgzMThiLCAweDkwMDYsIDB4MDgwYywgMHg2M2RjLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NjNmMCwgMHgyMDAxLCAweDAyMDAsIDB4Yjg2ZSwgMHhiODkzLCAweDAwMDIsIDB4MjAwOSwgMHgwMDAzLAorCTB4MDgwYywgMHhhMTVkLCAweDkwMDYsIDB4MDA2OCwgMHgyMDAxLCAweDAwMDEsIDB4OTAwZSwgMHgwMDM4LAorCTB4MjAwMSwgMHgwMDJjLCAweDkwMGUsIDB4MDAxOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHg5MDA1LAorCTB4MDAwMCwgMHgwMTJlLCAweDAwYmUsIDB4MDBmZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg5NCwgMHg5MGM2LCAweDAwMTUsIDB4MDkwNCwgMHg2MzJkLAorCTB4OTBjNiwgMHgwMDU2LCAweDA5MDQsIDB4NjMzMSwgMHg5MGM2LCAweDAwNjYsIDB4MDkwNCwgMHg2MzM1LAorCTB4OTBjNiwgMHgwMDY3LCAweDA5MDQsIDB4NjMzOSwgMHg5MGM2LCAweDAwNjgsIDB4MDkwNCwgMHg2MzNkLAorCTB4OTBjNiwgMHgwMDcxLCAweDA5MDQsIDB4NjM0MSwgMHg5MGM2LCAweDAwNzQsIDB4MDkwNCwgMHg2MzQ1LAorCTB4OTBjNiwgMHgwMDdjLCAweDA5MDQsIDB4NjM0OSwgMHg5MGM2LCAweDAwN2UsIDB4MDkwNCwgMHg2MzRkLAorCTB4OTBjNiwgMHgwMDM3LCAweDA5MDQsIDB4NjM1MSwgMHg5MDE2LCAweDIwNzksIDB4MTgwMCwgMHhhOTc0LAorCTB4OTE4NiwgMHgwMGZmLCAweDA5MDQsIDB4NjMyOCwgMHg5MTgyLCAweDA4MDAsIDB4MWEwNCwgMHg2MzI4LAorCTB4MDgwYywgMHg2NDlmLCAweDExOTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4MiwgMHgwMDA2LAorCTB4MTI2OCwgMHhhODk0LCAweDkwYzYsIDB4MDA2ZiwgMHgwMTQ4LCAweDA4MGMsIDB4YTA2MiwgMHgxOTA0LAorCTB4NjMxMSwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxOTA0LCAweDYzMTEsIDB4YTg5NCwgMHg5MGM2LAorCTB4MDA2ZiwgMHgwMTU4LCAweDkwYzYsIDB4MDA1ZSwgMHgwOTA0LCAweDYyNzEsIDB4OTBjNiwgMHgwMDY0LAorCTB4MDkwNCwgMHg2MjlhLCAweDIwMDgsIDB4MDgwNCwgMHg2MjM0LCAweGE5OTgsIDB4YThiMCwgMHgyMDQwLAorCTB4MDgwYywgMHhhMDYyLCAweDExMjAsIDB4OTE4MiwgMHgwMDdmLCAweDBhMDQsIDB4NjIzNCwgMHg5MTg2LAorCTB4MDBmZiwgMHgwOTA0LCAweDYyMzQsIDB4OTE4MiwgMHgwODAwLCAweDFhMDQsIDB4NjIzNCwgMHhhYWEwLAorCTB4YWI5YywgMHg3ODc4LCAweDkzMDYsIDB4MTFhOCwgMHg3ODdjLCAweDAwOTYsIDB4OTI0ZSwgMHgxMTI4LAorCTB4MjIwOCwgMHgyMzEwLCAweDAwOWUsIDB4MDgwNCwgMHg2MjM0LCAweDA4MGMsIDB4YTA2MiwgMHgxMTQwLAorCTB4OTljYywgMHhmZjAwLCAweDAwOWUsIDB4MTEyOCwgMHgyMjA4LCAweDIzMTAsIDB4MDgwNCwgMHg2MjM0LAorCTB4MDA5ZSwgMHgwODBjLCAweDQ5ZDksIDB4MDkwNCwgMHg2MjNkLCAweDkwMGUsIDB4OTAxNiwgMHg5MGM2LAorCTB4NDAwMCwgMHgxNTU4LCAweDAwMDYsIDB4MDgwYywgMHg2NmJmLCAweDExMDgsIDB4YzE4NSwgMHhiODAwLAorCTB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDMxLCAweDIwYTAsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4OTA4MCwgMHgwMDA2LAorCTB4MjA5OCwgMHgwODBjLCAweDBmYWUsIDB4MjBhOSwgMHgwMDA0LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDM1LCAweDIwYTAsIDB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4OTA4MCwgMHgwMDBhLAorCTB4MjA5OCwgMHgwODBjLCAweDBmYWUsIDB4MDAwZSwgMHgwMGM4LCAweDkwYzYsIDB4NDAwNywgMHgxMTEwLAorCTB4MjQwOCwgMHgwMGEwLCAweDkwYzYsIDB4NDAwOCwgMHgxMTE4LCAweDI3MDgsIDB4MjYxMCwgMHgwMDcwLAorCTB4OTBjNiwgMHg0MDA5LCAweDExMDgsIDB4MDA1MCwgMHg5MGM2LCAweDQwMDYsIDB4MDEzOCwgMHgyMDAxLAorCTB4NDAwNSwgMHgyMDA5LCAweDAwMGEsIDB4MDAxMCwgMHgyMDAxLCAweDQwMDYsIDB4YTg5NiwgMHhhOTlhLAorCTB4YWE5ZSwgMHgyMDAxLCAweDAwMzAsIDB4OTAwZSwgMHgwNDcwLCAweDA4MGMsIDB4YTA4ZCwgMHgxMTMwLAorCTB4MjAwMSwgMHg0MDA1LCAweDIwMDksIDB4MDAwMywgMHg5MDE2LCAweDBjODAsIDB4MmIwMCwgMHg2MDEyLAorCTB4MDgwYywgMHhjMmIzLCAweDI5MDAsIDB4NjAxNiwgMHg2MDIzLCAweDAwMDEsIDB4YTg2OCwgMHhkODhjLAorCTB4MDEwOCwgMHhjMGY1LCAweGE4NmEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgzMThiLAorCTB4MDEyZSwgMHg5MDA2LCAweDA4MGMsIDB4NjNkYywgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLAorCTB4MjAwOSwgMHgwMDAyLCAweDA4MGMsIDB4YTE1ZCwgMHhhOGIwLCAweGQwOTQsIDB4MDExOCwgMHhiOGJjLAorCTB4YzA4ZCwgMHhiOGJlLCAweDkwMDYsIDB4OTAwNSwgMHgwMTJlLCAweDAwZWUsIDB4MDBmZSwgMHgwMGJlLAorCTB4MDAwNSwgMHgwODBjLCAweDU1ZWYsIDB4MDExOCwgMHgyMDA5LCAweDAwMDcsIDB4MDBmOCwgMHhhOTk4LAorCTB4YWViMCwgMHgwODBjLCAweDY0OWYsIDB4MTkwNCwgMHg2MjJmLCAweDkxODYsIDB4MDA3ZiwgMHgwMTMwLAorCTB4MDgwYywgMHg2N2MzLCAweDAxMTgsIDB4MjAwOSwgMHgwMDA5LCAweDAwODAsIDB4MDA5NiwgMHgwODBjLAorCTB4MTAzMSwgMHgxMTIwLCAweDAwOWUsIDB4MjAwOSwgMHgwMDAyLCAweDAwNDAsIDB4MjkwMCwgMHgwMDllLAorCTB4YTgwNiwgMHgwODBjLCAweGMwMWYsIDB4MTliMCwgMHgyMDA5LCAweDAwMDMsIDB4MjAwMSwgMHg0MDA1LAorCTB4MDgwNCwgMHg2MjM2LCAweGE5OTgsIDB4YWViMCwgMHgwODBjLCAweDY0OWYsIDB4MTkwNCwgMHg2MjJmLAorCTB4MDA5NiwgMHgwODBjLCAweDEwMzEsIDB4MTEyOCwgMHgwMDllLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LAorCTB4NjJlZSwgMHgyOTAwLCAweDAwOWUsIDB4YTgwNiwgMHgwMDk2LCAweDIwNDgsIDB4MjBhOSwgMHgwMDJiLAorCTB4YjhiNCwgMHgyMGUwLCAweGI4YjgsIDB4MjA5OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAwMiwgMHgyMGEwLCAweDQwMDMsIDB4MjBhOSwgMHgwMDA4LCAweDkwODAsIDB4MDAwNiwgMHgyMGEwLAorCTB4YmJiOCwgMHg5Mzk4LCAweDAwMDYsIDB4MjM5OCwgMHgwODBjLCAweDBmYWUsIDB4MDA5ZSwgMHhhODdiLAorCTB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweGQ2ODQsIDB4MTE2OCwgMHgwODBjLAorCTB4NTVkYiwgMHhkMGI0LCAweDExMTgsIDB4YTg5YiwgMHgwMDBiLCAweDAwZTAsIDB4YjgwMCwgMHhkMDhjLAorCTB4MDExOCwgMHhhODliLCAweDAwMGMsIDB4MDBiMCwgMHgwODBjLCAweDY3YzMsIDB4MDExOCwgMHhhODliLAorCTB4MDAwOSwgMHgwMDgwLCAweDA4MGMsIDB4NTVlZiwgMHgwMTE4LCAweGE4OWIsIDB4MDAwNywgMHgwMDUwLAorCTB4MDgwYywgMHhjMDAyLCAweDE5MDQsIDB4NjI2YSwgMHgyMDA5LCAweDAwMDMsIDB4MjAwMSwgMHg0MDA1LAorCTB4MDgwNCwgMHg2MjM2LCAweGE4N2IsIDB4MDAzMCwgMHhhODk3LCAweDQwMDUsIDB4YTgwNCwgMHg4MDA2LAorCTB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDAyLAorCTB4MjAwOSwgMHgwMDJiLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsIDB4MjAzMSwgMHgwMDAwLAorCTB4MjA0MSwgMHgxMjg4LCAweDA4MGMsIDB4YTVlNiwgMHgxOTA0LCAweDYyNmEsIDB4MjAwOSwgMHgwMDAyLAorCTB4MDhlOCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHgwODA0LCAweDYyNmIsIDB4MjAwOSwgMHgxODBjLAorCTB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDE4NCwgMHgwMTE4LAorCTB4MjAwMSwgMHgwMDA0LCAweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDgwNCwgMHg2MjZiLAorCTB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4MDgwNCwgMHg2MjZiLCAweDA4MGMsIDB4MzcxOCwgMHgwODA0LAorCTB4NjI2YywgMHgwODBjLCAweDUzMDYsIDB4MDgwNCwgMHg2MjZjLCAweDA4MGMsIDB4NDU1ZSwgMHgwODA0LAorCTB4NjI2YywgMHgwODBjLCAweDQ1ZDcsIDB4MDgwNCwgMHg2MjZjLCAweDA4MGMsIDB4NDYzMywgMHgwODA0LAorCTB4NjI2YywgMHgwODBjLCAweDRhOTUsIDB4MDgwNCwgMHg2MjZjLCAweDA4MGMsIDB4NGQzZSwgMHgwODA0LAorCTB4NjI2YywgMHgwODBjLCAweDRmNmUsIDB4MDgwNCwgMHg2MjZjLCAweDA4MGMsIDB4NTE2NywgMHgwODA0LAorCTB4NjI2YywgMHgwODBjLCAweDM5NDEsIDB4MDgwNCwgMHg2MjZjLCAweDAwYjYsIDB4YTk3NCwgMHhhZTc4LAorCTB4OTY4NCwgMHgzZmZmLCAweDkwODIsIDB4NDAwMCwgMHgxNjE4LCAweDkxODIsIDB4MDgwMCwgMHgxMjY4LAorCTB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHgwMTQwLCAweDA4MGMsIDB4NjdjMywgMHgxMTQ4LAorCTB4MDBlOSwgMHgwODBjLCAweDY1Y2EsIDB4OTAwNiwgMHgwMGIwLCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLAorCTB4MDA5MCwgMHg5MDgyLCAweDAwMDYsIDB4MTI0MCwgMHhiOTAwLCAweGQxZmMsIDB4MGQ4OCwgMHgyMDAxLAorCTB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDAzOCwgMHgyMDAxLCAweDAwMjksIDB4OTAwZSwgMHgwMDE4LAorCTB4MjAwMSwgMHgwMDI5LCAweDkwMGUsIDB4OTAwNSwgMHgwMGJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHhiODUwLCAweDkwMGQsIDB4MDE1MCwgMHgyOTAwLCAweDAwOTYsIDB4MjE0OCwgMHhhODAyLAorCTB4MDA5ZSwgMHhhODAzLCAweDAwMDAsIDB4Yjg1MiwgMHgwMTJlLCAweDAwMDUsIDB4MjkwMCwgMHhiODUyLAorCTB4Yjg0ZSwgMHhhODAzLCAweDAwMDAsIDB4MGNjMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiODRjLAorCTB4OTAwNSwgMHgwMTcwLCAweDAwZTYsIDB4MjA3MSwgMHgxOWJmLCAweDcwMDQsIDB4OTA4NiwgMHgwMDAyLAorCTB4MDE2OCwgMHgwMGVlLCAweGI4NGMsIDB4YTgwMiwgMHgyOTAwLCAweGI4NGUsIDB4MDEyZSwgMHgwMDA1LAorCTB4MjkwMCwgMHhiODUyLCAweGI4NGUsIDB4YTgwMywgMHgwMDAwLCAweDBjYzAsIDB4NzAxYywgMHg5YjA2LAorCTB4MWQ4MCwgMHhiODRjLCAweDAwYTYsIDB4MjA1MCwgMHhiMDAwLCAweGE4MDIsIDB4MjkwMCwgMHhiMDAyLAorCTB4MDBhZSwgMHgwMGVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiODRjLAorCTB4OTA0ZCwgMHgwMTMwLCAweGE4MDAsIDB4OTAwNSwgMHgxMTA4LCAweGI4NTIsIDB4Yjg0ZSwgMHg5OTA1LAorCTB4MDEyZSwgMHgwMDA1LCAweGI4NGMsIDB4OTA0ZCwgMHgwMTMwLCAweGE4MDAsIDB4OTAwNSwgMHgxMTA4LAorCTB4Yjg1MiwgMHhiODRlLCAweDk5MDUsIDB4MDAwNSwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwgMHgwMDI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDYyMTAsIDB4MjI1OCwgMHhiYTAwLCAweDkwMDUsIDB4MDExMCwgMHhjMjg1LAorCTB4MDAwOCwgMHhjMjg0LCAweGJhMDIsIDB4MDAyZSwgMHgwMGNlLCAweDAxMmUsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTAsIDB4MjI1OCwgMHhiYTA0LAorCTB4MDAwNiwgMHg5MDg2LCAweDAwMDYsIDB4MTE3MCwgMHhiODljLCAweGQwYWMsIDB4MDE1OCwgMHgwODBjLAorCTB4NjdiZiwgMHgwMTQwLCAweDkyODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwNywgMHgxMTEwLAorCTB4MjAxMSwgMHgwNjAwLCAweDAwMGUsIDB4OTI5NCwgMHhmZjAwLCAweDkyMTUsIDB4YmEwNiwgMHgwMDA2LAorCTB4OTA4NiwgMHgwMDA2LCAweDExMjAsIDB4YmE5MCwgMHg4MmZmLCAweDA5MGMsIDB4MGRmYSwgMHgwMDBlLAorCTB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MjEwLCAweDIyNTgsIDB4YmEwNCwgMHgwMDA2LCAweDkwODYsIDB4MDAwNiwgMHgxMTY4LAorCTB4Yjg5YywgMHhkMGE0LCAweDAxNTAsIDB4MDgwYywgMHg2N2JiLCAweDExMzgsIDB4OTI4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwMDA2LCAweDAwMGUsIDB4OTI5NCwgMHgwMGZmLAorCTB4ODAwNywgMHg5MjE1LCAweGJhMDYsIDB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDAwNSwgMHg5MTgyLAorCTB4MDgwMCwgMHgwMjE4LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAwZDYsIDB4MDAyNiwgMHg5MTkwLAorCTB4MTAwMCwgMHgyMjA0LCAweDkwNWQsIDB4MTE4MCwgMHgwMDk2LCAweDA4MGMsIDB4MTAzMSwgMHgyOTU4LAorCTB4MDA5ZSwgMHgwMTYwLCAweDJiMDAsIDB4MjAxMiwgMHhiODVjLCAweGI4YmEsIDB4Yjg2MCwgMHhiOGI2LAorCTB4OTAwNiwgMHhiOGE2LCAweDA4MGMsIDB4NWY0NSwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDAyNiwgMHg5MTgyLCAweDA4MDAsIDB4MDIxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDQ1OCwgMHgwMGQ2LAorCTB4OTE5MCwgMHgxMDAwLCAweDIyMDQsIDB4OTA1ZCwgMHgwNTE4LCAweDIwMTMsIDB4MDAwMCwgMHhiOGE0LAorCTB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTA2MywgMHgwMGQ2LCAweDAwYzYsIDB4YjhhYywgMHgyMDYwLAorCTB4OGNmZiwgMHgwMTY4LCAweDYwMGMsIDB4MDAwNiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LAorCTB4MDExMCwgMHgwODBjLCAweDBmZTMsIDB4MDgwYywgMHhhMGUzLCAweDAwY2UsIDB4MGM4OCwgMHgwMGNlLAorCTB4MDBkZSwgMHgyYjQ4LCAweGI4YjgsIDB4Yjg1ZSwgMHhiOGI0LCAweGI4NjIsIDB4MDgwYywgMHgxMDczLAorCTB4MDBkZSwgMHg5MDA2LCAweDAwMmUsIDB4MDEyZSwgMHgwMDllLCAweDAwYmUsIDB4MDAwNSwgMHgwMDE2LAorCTB4OTE4MiwgMHgwODAwLCAweDAyMTgsIDB4OTA4NSwgMHgwMDAxLCAweDAwMzAsIDB4OTE4OCwgMHgxMDAwLAorCTB4MjEwNCwgMHg5MDVkLCAweDBkYzAsIDB4OTAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LAorCTB4MDEzNiwgMHgwMTQ2LCAweDkwMDYsIDB4YjgwYSwgMHhiODBlLCAweGI4MDAsIDB4YzA4YywgMHhiODAyLAorCTB4MDgwYywgMHg3MjA3LCAweDE1MTAsIDB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MDEyMCwgMHgwODBjLAorCTB4YTA2MiwgMHgxMWQ4LCAweDAwNzgsIDB4NzA0MCwgMHhkMGU0LCAweDAxYjgsIDB4MDBjNiwgMHgyMDYxLAorCTB4MTk1YSwgMHg3MDQ4LCAweDIwNjIsIDB4NzA0YywgMHg2MDA2LCAweDcwNTAsIDB4NjAwYSwgMHg3MDU0LAorCTB4NjAwZSwgMHgwMGNlLCAweDcwM2MsIDB4MjA2OSwgMHgwMTQwLCAweDkwMDUsIDB4MTExMCwgMHgyMDAxLAorCTB4MDAwMSwgMHg2ODg2LCAweDIwNjksIDB4MTgwMCwgMHg2OGIyLCAweDcwNDAsIDB4Yjg1ZSwgMHg3MDQ4LAorCTB4Yjg2MiwgMHg3MDRjLCAweGI4NjYsIDB4MjBlMSwgMHgwMDAwLCAweDIwOTksIDB4MDI3NiwgMHhiOGI0LAorCTB4MjBlOCwgMHhiOGI4LCAweDkwODgsIDB4MDAwYSwgMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg0MDAzLAorCTB4MjA5OSwgMHgwMjdhLCAweDkwODgsIDB4MDAwNiwgMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg0MDAzLAorCTB4MjA2OSwgMHgwMjAwLCAweDY4MTcsIDB4MDAwMSwgMHg3MDQwLCAweGI4NmEsIDB4NzE0NCwgMHhiOTZlLAorCTB4NzA0OCwgMHhiODcyLCAweDcwNTAsIDB4Yjg3NiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxNywgMHgwMDAwLAorCTB4YjhhMCwgMHg5MDg2LCAweDAwN2UsIDB4MTExMCwgMHg3MTQ0LCAweGI5NmUsIDB4OTE4MiwgMHgwMjExLAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDgsIDB4MDQwMCwgMHg5MTgyLCAweDAyNTksIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwNywgMHgwMGQwLCAweDkxODIsIDB4MDJjMSwgMHgxMjE4LCAweDIwMDksIDB4MDAwNiwgMHgwMGEwLAorCTB4OTE4MiwgMHgwMzQ5LCAweDEyMTgsIDB4MjAwOSwgMHgwMDA1LCAweDAwNzAsIDB4OTE4MiwgMHgwNDIxLAorCTB4MTIxOCwgMHgyMDA5LCAweDAwMDQsIDB4MDA0MCwgMHg5MTgyLCAweDA1ODEsIDB4MTIxOCwgMHgyMDA5LAorCTB4MDAwMywgMHgwMDEwLCAweDIwMDksIDB4MDAwMiwgMHhiOTkyLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLAorCTB4MDBkZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHg3MDM0LAorCTB4Yjg5NiwgMHg3MDNjLCAweGI4OWEsIDB4NzA1NCwgMHhiODllLCAweDAwMzYsIDB4YmJiYywgMHhjMzg0LAorCTB4YmEwMCwgMHgyMDA5LCAweDE4N2IsIDB4MjEwYywgMHhkMGJjLCAweDAxMjAsIDB4ZDFlYywgMHgwMTEwLAorCTB4YzJhZCwgMHgwMDA4LCAweGMyYWMsIDB4ZDBjNCwgMHgwMTQ4LCAweGQxZTQsIDB4MDEzOCwgMHhjMmJkLAorCTB4ZDBjYywgMHgwMTI4LCAweGQzOGMsIDB4MTEwOCwgMHhjMzg1LCAweDAwMDgsIDB4YzJiYywgMHhiYTAyLAorCTB4YmJiZSwgMHgwMDNlLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDA5NiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgwNTc4LCAweGE5MDAsIDB4ODFmZiwgMHgxNWMwLAorCTB4YWEwNCwgMHg5MjgyLCAweDAwMTAsIDB4MTZjOCwgMHgwMTM2LCAweDAxNDYsIDB4MDFjNiwgMHgwMWQ2LAorCTB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA4YywgMHgwMDNmLCAweDIxZTAsIDB4OTA4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDA0LCAweDIwOTgsIDB4MjAwOSwgMHgwMDEwLCAweDIwYTksIDB4MDAwMSwgMHg0MDAyLAorCTB4OTA4NiwgMHhmZmZmLCAweDAxMjAsIDB4ODEwOSwgMHgxZGQwLCAweDA4MGMsIDB4MGRmYSwgMHgzYzAwLAorCTB4MjBlOCwgMHgzMzAwLCAweDgwMDEsIDB4MjBhMCwgMHg0NjA0LCAweDgyMTAsIDB4YWEwNiwgMHgwMWRlLAorCTB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDA2MCwgMHgwODBjLCAweDEwMzEsIDB4MDE3MCwgMHgyOTAwLAorCTB4YjhhNiwgMHhhODAzLCAweDAwMDAsIDB4MDgwYywgMHg2NjViLCAweGE4MDcsIDB4MDAwMSwgMHhhZTEyLAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwOTYsIDB4YjhhNCwgMHg5MDRkLCAweDAxODgsIDB4YTgwMCwgMHg5MDA1LAorCTB4MTE1MCwgMHgwODBjLCAweDY2NmEsIDB4MTE1OCwgMHhhODA0LCAweDkwOGEsIDB4MDAwMiwgMHgwMjE4LAorCTB4ODAwMSwgMHhhODA2LCAweDAwMjAsIDB4MDgwYywgMHgxMDYzLCAweGI4YTcsIDB4MDAwMCwgMHgwMDllLAorCTB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4ODY5NiwgMHgwMTJlLAorCTB4MDAwNSwgMHg5MDFlLCAweDAwMTAsIDB4MjAxOSwgMHgwMDAxLCAweDkwMGUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHhiODRjLCAweDIwNDgsIDB4YjgwMCwgMHhkMGRjLCAweDExNzAsIDB4ODlmZiwgMHgwNTAwLAorCTB4ODNmZiwgMHgwMTIwLCAweGE4NzgsIDB4OTYwNiwgMHgwMTU4LCAweDAwMzAsIDB4YTg2YywgMHg5NDA2LAorCTB4MTExOCwgMHhhODcwLCAweDk1MDYsIDB4MDEyMCwgMHgyOTA4LCAweGE4MDAsIDB4MjA0OCwgMHgwYzcwLAorCTB4MDgwYywgMHg5YTRlLCAweGFhMDAsIDB4Yjg0YywgMHg5OTA2LCAweDExMTAsIDB4YmE0ZSwgMHgwMDIwLAorCTB4MDBhNiwgMHgyMTUwLCAweGIyMDIsIDB4MDBhZSwgMHg4MmZmLCAweDExMTAsIDB4Yjk1MiwgMHg4OWZmLAorCTB4MDEyZSwgMHgwMDA1LCAweDkwMTYsIDB4MDQ4OSwgMHgxMTEwLCAweDIwMTEsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDgwYywgMHg2NmJmLCAweDAxMjgsIDB4MDgwYywgMHhiZWY0LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwODBjLCAweDY2YmYsIDB4MDEyOCwgMHgwODBjLCAweGJlOTksIDB4MDAxMCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NjZiZiwgMHgwMTI4LCAweDA4MGMsIDB4YmVmMSwgMHgwMDEwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg2NmJmLCAweDAxMjgsIDB4MDgwYywgMHhiZWI4LAorCTB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDY2YmYsIDB4MDEyOCwgMHgwODBjLAorCTB4YmYzNywgMHgwMDEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LCAweGI4YTQsIDB4OTAwZCwgMHgxMTE4LAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDEzNiwgMHgwMWM2LCAweGE4MDAsIDB4OTAwNSwgMHgxMWI4LAorCTB4ODkwZSwgMHg4MTBlLCAweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweDIwZTAsIDB4OTE4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDA0LCAweDIwOTgsIDB4MjBhOSwgMHgwMDAxLCAweDIwMDksIDB4MDAxMCwgMHg0MDAyLAorCTB4OTYwNiwgMHgwMTI4LCAweDgxMDksIDB4MWRkOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LAorCTB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MDE0NiwgMHgwMWQ2LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTA4MCwgMHgwMDA0LCAweDIwYTAsIDB4MjBhOSwgMHgwMDEwLCAweDIwMDksIDB4ZmZmZiwgMHg0MTA0LAorCTB4MDFkZSwgMHgwMTRlLCAweDAxMzYsIDB4MDFjNiwgMHhhODAwLCAweDkwMDUsIDB4MTFiOCwgMHg4OTBlLAorCTB4ODEwZSwgMHg4MTBmLCAweDkxODQsIDB4MDAzZiwgMHgyMGUwLCAweDkxODQsIDB4ZmZjMCwgMHg5MDgwLAorCTB4MDAwNCwgMHgyMDk4LCAweDIwYTksIDB4MDAwMSwgMHgyMDA5LCAweDAwMTAsIDB4NDAwMiwgMHg5NjA2LAorCTB4MDEyOCwgMHg4MTA5LCAweDFkZDgsIDB4OTA4NSwgMHgwMDAxLCAweDAwNjgsIDB4MDE0NiwgMHgwMWQ2LAorCTB4MzMwMCwgMHg4MDAxLCAweDIwYTAsIDB4M2MwMCwgMHgyMGU4LCAweDIwMDEsIDB4ZmZmZiwgMHg0MDA0LAorCTB4MDFkZSwgMHgwMTRlLCAweDkwMDYsIDB4MDFjZSwgMHgwMTNlLCAweDAwMDUsIDB4MDA5NiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweGI4YTQsIDB4OTA0ZCwgMHgxMTI4LCAweDA4MGMsIDB4MTAzMSwgMHgwMTY4LAorCTB4MjkwMCwgMHhiOGE2LCAweDA4MGMsIDB4NjY1YiwgMHhhODAzLCAweDAwMDEsIDB4YTgwNywgMHgwMDAwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDA5ZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMDk2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YjhhNCwgMHg5MDRkLCAweDAxMzAsIDB4YjhhNywgMHgwMDAwLAorCTB4MDgwYywgMHgxMDYzLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwOWUsIDB4MDAwNSwgMHhiODljLAorCTB4ZDBhNCwgMHgwMDA1LCAweDAwYjYsIDB4MDBmNiwgMHgwODBjLCAweDcyMDcsIDB4MDFiMCwgMHg3MWMwLAorCTB4ODFmZiwgMHgxMTk4LCAweDcxZDgsIDB4ZDE5YywgMHgwMTgwLCAweDIwMDEsIDB4MDA3ZSwgMHg5MDgwLAorCTB4MTAwMCwgMHgyMDA0LCAweDkwNWQsIDB4MDE0OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDAwNiwgMHgxMTE4LCAweGI4MDAsIDB4YzBlZCwgMHhiODAyLCAweDIwNzksIDB4MTg1YiwgMHg3ODA0LAorCTB4MDBkMCwgMHgwMTU2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLCAweDAwMTYsIDB4MDgwYywgMHg2NDlmLAorCTB4MTE2OCwgMHhiODA0LCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwOTYsIDB4MDAwNCwgMHgwMTE4LAorCTB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4YjgwMCwgMHhjMGVkLCAweGI4MDIsIDB4MDAxZSwgMHg4MTA4LAorCTB4MWYwNCwgMHg2NmU1LCAweDAxNWUsIDB4MDgwYywgMHg2NzgxLCAweDAxMjAsIDB4MjAwMSwgMHgxOTVkLAorCTB4MjAwYywgMHgwMDMwLCAweDIwNzksIDB4MTg1YiwgMHg3ODA0LCAweDAwMzAsIDB4MjAwOSwgMHgwN2QwLAorCTB4MjAxMSwgMHg2NzBmLCAweDA4MGMsIDB4ODM2YywgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MjAxMSwgMHg2NzBmLCAweDA4MGMsIDB4ODJkYSwgMHgwODBjLCAweDY3ODEsIDB4MDFkOCwgMHgyMDAxLAorCTB4MTA3ZSwgMHgyMDA0LCAweDIwNTgsIDB4YjkwMCwgMHhjMWVjLCAweGI5MDIsIDB4MDgwYywgMHg2N2JmLAorCTB4MDEzMCwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg2NzBmLCAweDA4MGMsIDB4ODM2YywgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDkwMDYsIDB4NzA3YSwgMHg3MDVjLCAweDcwN2UsIDB4MDgwYywgMHgyZjZjLAorCTB4MDBlZSwgMHgwNGIwLCAweDAxNTYsIDB4MDBjNiwgMHgyMGE5LCAweDAwN2YsIDB4OTAwZSwgMHgwMDE2LAorCTB4MDgwYywgMHg2NDlmLCAweDE1MzgsIDB4YjgwMCwgMHhkMGVjLCAweDA1MjAsIDB4MDA0NiwgMHhiYWEwLAorCTB4MjIyMCwgMHg5MDA2LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGQ4ODUsIDB4YjgwMCwgMHhjMGU1LAorCTB4YzBlYywgMHhiODAyLCAweDA4MGMsIDB4NjdiYiwgMHgyMDAxLCAweDA3MDcsIDB4MTEyOCwgMHhiODA0LAorCTB4OTA4NCwgMHgwMGZmLCAweDkwODUsIDB4MDcwMCwgMHhiODA2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLAorCTB4ODgwMywgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg4NmYxLCAweDkwMGUsIDB4MDgwYywgMHhkNWY2LAorCTB4MDA3ZSwgMHgwMDRlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweDY3MzcsIDB4MDBjZSwgMHgwMTVlLAorCTB4MDBiZSwgMHgwMDA1LCAweDAwYjYsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDAsIDB4YzBlYywgMHhiODAyLAorCTB4MDBiZSwgMHgwMDA1LCAweDc4MTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGFjLAorCTB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4OTA1ZCwgMHgwMTA4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MjAwMSwgMHgxMDdlLCAweDIwMDQsIDB4OTA1ZCwgMHgwMTEwLAorCTB4YjgwMCwgMHhkMGVjLCAweDAwZmUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMjYsIDB4MDAyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDA2LCAweGJhYTAsIDB4OTI5MCwgMHgxMDAwLCAweDIyMDQsIDB4OWIwNiwgMHgxOTBjLAorCTB4MGRmYSwgMHgwMDBlLCAweGJhMDAsIDB4OTAwNSwgMHgwMTEwLCAweGMyZmQsIDB4MDAwOCwgMHhjMmZjLAorCTB4YmEwMiwgMHgwMDJlLCAweDAxMmUsIDB4MDAwNSwgMHgyMDExLCAweDE4MzYsIDB4MjIwNCwgMHhkMGNjLAorCTB4MDEzOCwgMHgyMDAxLCAweDE5NWIsIDB4MjAwYywgMHgyMDExLCAweDY3YjEsIDB4MDgwYywgMHg4MzZjLAorCTB4MDAwNSwgMHgyMDExLCAweDY3YjEsIDB4MDgwYywgMHg4MmRhLCAweDIwMTEsIDB4MTgzNiwgMHgyMjA0LAorCTB4YzBjYywgMHgyMDEyLCAweDAwMDUsIDB4MDgwYywgMHg1NWRiLCAweGQwYWMsIDB4MDAwNSwgMHgwODBjLAorCTB4NTVkYiwgMHhkMGE0LCAweDAwMDUsIDB4MDAxNiwgMHhiOTA0LCAweDkxODQsIDB4MDBmZiwgMHg5MDhlLAorCTB4MDAwNiwgMHgwMDFlLCAweDAwMDUsIDB4MDAxNiwgMHhiOTA0LCAweDkxODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4OTA4ZSwgMHgwMDA2LCAweDAwMWUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDgwYywgMHhjNTM5LAorCTB4MDE1OCwgMHg3MGQ4LCAweDkwODQsIDB4MDAyOCwgMHgwMTM4LCAweDIwMDEsIDB4MTA3ZiwgMHgyMDA0LAorCTB4OTA1ZCwgMHgwMTEwLCAweGI4YmMsIDB4ZDA5NCwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA3NiwgMHgwMGI2LCAweDIwMDEsIDB4MTgxNywgMHgyMDNjLAorCTB4OTc4MCwgMHgzMmU5LCAweDIwM2QsIDB4OTdiYywgMHhmZjAwLCAweDg3M2YsIDB4OTAwNiwgMHgyMDE4LAorCTB4MjAwOCwgMHg5Mjg0LCAweDgwMDAsIDB4MDExMCwgMHgyMDE5LCAweDAwMDEsIDB4OTI5NCwgMHg3ZmZmLAorCTB4MjEwMCwgMHg5NzA2LCAweDAxOTAsIDB4OTFhMCwgMHgxMDAwLCAweDI0MDQsIDB4OTA1ZCwgMHgwMTY4LAorCTB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDA2LCAweDExMzgsIDB4ODNmZiwgMHgwMTE4LAorCTB4Yjg5YywgMHhkMGE0LCAweDAxMTAsIDB4ODIxMSwgMHgwMTU4LCAweDgxMDgsIDB4ODNmZiwgMHgwMTIwLAorCTB4OTE4MiwgMHgwODAwLCAweDBlMjgsIDB4MDA2OCwgMHg5MTgyLCAweDAwN2UsIDB4MGUwOCwgMHgwMDQ4LAorCTB4MDBiZSwgMHgwMDdlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDFlLCAweDkwODUsIDB4MDAwMSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMGJlLCAweDAwN2UsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMWUsIDB4OTAwNiwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMGI2LCAweDIxMDAsIDB4OTA4NCwgMHg3ZmZmLAorCTB4OTA4MCwgMHgxMDAwLCAweDIwMDQsIDB4OTA1ZCwgMHgwMTMwLCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDA2LCAweDA1NTAsIDB4OTE4NCwgMHg4MDAwLCAweDA1ODAsIDB4MjAwMSwgMHgxODE3LAorCTB4MjAzYywgMHg5NzgwLCAweDMyZTksIDB4MjAzZCwgMHg5N2JjLCAweGZmMDAsIDB4ODczZiwgMHg5MDA2LAorCTB4MjAyMCwgMHgyNDAwLCAweDk3MDYsIDB4MDFhMCwgMHg5NGE4LCAweDEwMDAsIDB4MjUwNCwgMHg5MDVkLAorCTB4MDE3OCwgMHhiODA0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMDYsIDB4MTE0OCwgMHhiODljLAorCTB4ZDBhNCwgMHgwMTMwLCAweGI4MTQsIDB4OTIwNiwgMHgxMTE4LCAweGI4MTAsIDB4OTMwNiwgMHgwMTI4LAorCTB4ODQyMCwgMHg5NDgyLCAweDA4MDAsIDB4MGUyOCwgMHgwMDQ4LCAweDkxOGMsIDB4N2ZmZiwgMHgwMGJlLAorCTB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4OTE4YywgMHg3ZmZmLAorCTB4MDBiZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHg5MDA2LCAweDAwMDUsIDB4MjA3MSwgMHgxOTBlLAorCTB4NzAwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwMCwgMHg5MDA2LCAweDcwMTIsIDB4NzAxNiwgMHg3MDFhLAorCTB4NzAxZSwgMHg3MDBhLCAweDcwNDYsIDB4MDAwNSwgMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwgMHgxOTIxLAorCTB4OTAwZSwgMHg3MTBhLCAweDA4MGMsIDB4NTVkYiwgMHhkMGZjLCAweDExNDAsIDB4MDgwYywgMHg1NWRiLAorCTB4OTAwZSwgMHhkMDljLCAweDAxMDgsIDB4ODEwOCwgMHg3MTAyLCAweDA0MDAsIDB4MjAwMSwgMHgxODdiLAorCTB4MjAwYywgMHg5MTg0LCAweDAwMDcsIDB4OTAwNiwgMHgwMDAyLCAweDY4OTYsIDB4Njg5NiwgMHg2ODk2LAorCTB4Njg5NiwgMHg2ODk2LCAweDY4YWQsIDB4NjhiYiwgMHg2ODk2LCAweDcwMDMsIDB4MDAwMywgMHgyMDA5LAorCTB4MTg3YywgMHgyMTBjLCAweDkxODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwMDUsIDB4MTExMCwgMHgyMDAxLAorCTB4MDAwMiwgMHg3MDA2LCAweDAwMTgsIDB4NzAwMywgMHgwMDA1LCAweDBjODgsIDB4MDBlZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDA1MCwgMHg2ODRjLCAweDkwMDUsIDB4MTE1MCwgMHgwMGU2LAorCTB4MjA3MSwgMHgxOTBlLCAweDcwMjgsIDB4YzA4NSwgMHg3MDJhLCAweDAwZWUsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDQ4OCwgMHg2ODQ0LCAweDkwMDUsIDB4MDE1OCwgMHgwODBjLCAweDc1NzYsIDB4NmE2MCwgMHg5MjAwLAorCTB4NzAwMiwgMHg2ODY0LCAweDkxMDEsIDB4NzAwNiwgMHg5MDA2LCAweDcwMTIsIDB4NzAxNiwgMHg2ODYwLAorCTB4NzAwMiwgMHg2ODY0LCAweDcwMDYsIDB4Njg2OCwgMHg3MDBhLCAweDY4NmMsIDB4NzAwZSwgMHg2ODQ0LAorCTB4OTAwNSwgMHgxMTEwLCAweDcwMTIsIDB4NzAxNiwgMHg2ODRjLCAweDcwMWEsIDB4NzAxYywgMHg5MDg1LAorCTB4MDA0MCwgMHg3MDFlLCAweDcwMzcsIDB4MDAxOSwgMHg3MDJiLCAweDAwMDEsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTkwZSwgMHg3MDI4LCAweGMwODQsIDB4NzAyYSwgMHg3MDA3LCAweDAwMDEsIDB4NzAwYiwgMHgwMDAwLAorCTB4MDBlZSwgMHg5MDA2LCAweDAwZWUsIDB4MDAwNSwgMHhhODY4LCAweGQwZmMsIDB4MTFkOCwgMHgwMGU2LAorCTB4MDAyNiwgMHgyMDAxLCAweDE5MjEsIDB4MjAwNCwgMHg5MDA1LCAweDA5MDQsIDB4NmFlZSwgMHhhODdjLAorCTB4ZDBiYywgMHgxOTA0LCAweDZhZWUsIDB4YTk3OCwgMHhhODc0LCAweDkxMDUsIDB4MTkwNCwgMHg2YWVlLAorCTB4MjAwMSwgMHgxOTIxLCAweDIwMDQsIDB4MDAwMiwgMHg2YWVlLCAweDY5NDcsIDB4Njk4MywgMHg2OTgzLAorCTB4NmFlZSwgMHg2OTgzLCAweDAwMDUsIDB4YTg2OCwgMHhkMGZjLCAweDE1MDAsIDB4MDBlNiwgMHgwMDI2LAorCTB4MjAwOSwgMHgxOTIxLCAweDIxMGMsIDB4ODFmZiwgMHgwOTA0LCAweDZhZWUsIDB4YTg3YywgMHhkMGNjLAorCTB4MDkwNCwgMHg2YWVlLCAweGE4ODAsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMSwgMHgxOTA0LAorCTB4NmFlZSwgMHg5MTg2LCAweDAwMDMsIDB4MDkwNCwgMHg2OTgzLCAweDkxODYsIDB4MDAwNSwgMHgwOTA0LAorCTB4Njk4MywgMHhhODRmLCAweDgwMjEsIDB4YTg1MywgMHgwMDE3LCAweDAwMjgsIDB4MDAwNSwgMHhhODRmLAorCTB4ODAyMCwgMHhhODUzLCAweDAwMTYsIDB4MjA3MSwgMHgxOTBlLCAweDcwMWMsIDB4OTAwNSwgMHgxOTA0LAorCTB4NmNhMiwgMHgwZTA0LCAweDZjZWQsIDB4MjA3MSwgMHgwMDAwLCAweGE4NGMsIDB4NzA4MiwgMHhhODUwLAorCTB4NzAzMiwgMHhhODZjLCAweDcwODYsIDB4NzAzNiwgMHhhODcwLCAweDcwOGEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZTAsIDB4MjA3MSwgMHgxODAwLAorCTB4MjAxMSwgMHgwMDAxLCAweGE4MDQsIDB4OTAwZCwgMHg3MDJjLCAweDExNTgsIDB4YTgwMiwgMHgyOTAwLAorCTB4NzAyZSwgMHg3MGJjLCAweDkyMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMDk2LCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLAorCTB4MWRjOCwgMHgwMDllLCAweDBjNTgsIDB4YTg0ZiwgMHgwMDAwLCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLAorCTB4MjA3MSwgMHgxOTBlLCAweGE4MDMsIDB4MDAwMCwgMHg3MDEwLCAweDkwMDUsIDB4MTkwNCwgMHg2YTcyLAorCTB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg2ZTE2LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LAorCTB4OTA4NCwgMHgwMDAzLCAweDAwMDIsIDB4NjlhMSwgMHg2YTcyLCAweDY5YzYsIDB4NmEwZCwgMHgwODBjLAorCTB4MGRmYSwgMHgyMDcxLCAweDE4MDAsIDB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxMTcwLAorCTB4MjA3MSwgMHgxOWQyLCAweDcwM2MsIDB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTkyMiwgMHgyMDA0LAorCTB4ODAwNSwgMHg3MDNlLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAxNiwgMHg3MDJjLAorCTB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLAorCTB4NzBiYywgMHg5MjAwLCAweDcwYmUsIDB4MDgwYywgMHg4MWYwLCAweDBjMTAsIDB4MjA3MSwgMHgxODAwLAorCTB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxNTgwLCAweDc4MjQsIDB4MDBlNiwgMHgyMDcxLAorCTB4MDA0MCwgMHg3MTJjLCAweGQxOWMsIDB4MTE0OCwgMHgyMDA5LCAweDE4MmYsIDB4MjEwYywgMHg5MThhLAorCTB4MDA0MCwgMHgwMjE4LCAweDcwMjIsIDB4MDBlZSwgMHgwMDU4LCAweDAwZWUsIDB4MjA0OCwgMHg3MDJjLAorCTB4YTgwMiwgMHgyOTAwLCAweDcwMmUsIDB4NzBiYywgMHg4MDAwLCAweDcwYmUsIDB4MDgwYywgMHg4MWYwLAorCTB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg2ZTE2LCAweGQwYTQsIDB4MTlmMCwgMHgyMDcxLAorCTB4MTlkMiwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5MjIsIDB4MjAwNCwgMHg4MDA1LAorCTB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LAorCTB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGJjLAorCTB4OTIwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHgwODAwLCAweDAwOTYsIDB4MDBlNiwgMHg3ODI0LAorCTB4MjA0OCwgMHgyMDcxLCAweDE4MDAsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLAorCTB4ODAwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NmUxNiwgMHhkMGE0LCAweDFkNjAsIDB4MDBlZSwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NmUxNiwgMHhkMDljLCAweDExYTAsIDB4MDA5ZSwgMHgyOTAwLCAweDc4MjIsIDB4YTgwNCwgMHg5MDBkLAorCTB4MTU2MCwgMHgyMDcxLCAweDE5ZDIsIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTIyLAorCTB4MjAwNCwgMHg4MDA1LCAweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDllLAorCTB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLAorCTB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTE3MCwgMHgyMDcxLAorCTB4MTlkMiwgMHg3MDNjLCAweDkwMDUsIDB4MTMyOCwgMHgyMDAxLCAweDE5MjIsIDB4MjAwNCwgMHg4MDA1LAorCTB4NzAzZSwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LAorCTB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LAorCTB4NzAyZSwgMHg3MGJjLCAweDkyMDAsIDB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MDBmZSwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDI5MDgsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsIDB4NzAxOCwgMHg5MDRkLAorCTB4NzExYSwgMHgwMTEwLCAweGE5MDIsIDB4MDAwOCwgMHg3MTFlLCAweDIxNDgsIDB4YTgwNCwgMHg5MDBkLAorCTB4MTkwNCwgMHg2YWM3LCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMDljLAorCTB4MTE5OCwgMHg3MDFjLCAweDkwNGQsIDB4MDE4MCwgMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgxMTA4LAorCTB4NzAxYSwgMHhhODAwLCAweDcwMWUsIDB4MjkwMCwgMHg3ODIyLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLAorCTB4MTkwYywgMHg2ZTE2LCAweGQwOWMsIDB4MGQ2OCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NmUxNiwgMHhkMGE0LCAweDAxYjAsIDB4MDBlNiwgMHg3ODI0LCAweDIwNDgsIDB4MjA3MSwgMHgxODAwLAorCTB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLCAweDgwMDAsIDB4NzBiZSwgMHgwODBjLAorCTB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDBhNCwgMHgxZDYwLAorCTB4MDBlZSwgMHgyMDcxLCAweDE5ZDIsIDB4NzAzYywgMHg5MDA1LCAweDEzMjgsIDB4MjAwMSwgMHgxOTIyLAorCTB4MjAwNCwgMHg4MDA1LCAweDcwM2UsIDB4MDBmZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLAorCTB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGJjLCAweDkyMDAsIDB4NzBiZSwgMHgwODBjLAorCTB4ODFmMCwgMHgwMGVlLCAweDA4MDQsIDB4NmE4MiwgMHhhODY4LCAweGQwZmMsIDB4MTkwNCwgMHg2YjJhLAorCTB4MDA5NiwgMHhhODA0LCAweGE4MDcsIDB4MDAwMCwgMHg5MDRkLCAweDE5MGMsIDB4MGZlMywgMHgwMDllLAorCTB4MDAxOCwgMHhhODY4LCAweGQwZmMsIDB4MTVmMCwgMHgwMGU2LCAweDAwMjYsIDB4YTg0ZiwgMHgwMDAwLAorCTB4MDBmNiwgMHgyMDc5LCAweDAwNTAsIDB4MjA3MSwgMHgxODAwLCAweDcwZTgsIDB4ODAwMSwgMHgwMWQwLAorCTB4MTY3OCwgMHgyMDcxLCAweDE5MGUsIDB4YTgwMywgMHgwMDAwLCAweDcwMTAsIDB4OTAwNSwgMHgxOTA0LAorCTB4NmMyMCwgMHg3ODJjLCAweDkwOGMsIDB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ODAwNCwgMHg4MDA0LAorCTB4ODAwNCwgMHg5MDg0LCAweDAwMDMsIDB4MDAwMiwgMHg2YjJiLCAweDZjMjAsIDB4NmI0NiwgMHg2YmIzLAorCTB4MDgwYywgMHgwZGZhLCAweDcwZWIsIDB4MGZhMCwgMHg3MWU0LCAweDgxMDcsIDB4OTEwNiwgMHg5MDk0LAorCTB4MDBjMCwgMHg5MTg0LCAweGZmM2YsIDB4OTIwNSwgMHg3MGU2LCAweDNiMDgsIDB4M2EwMCwgMHg5MTA0LAorCTB4OTE4ZCwgMHgwMGMwLCAweDIxZDgsIDB4OTA4NCwgMHhmZjNmLCAweDkyMDUsIDB4MjBkMCwgMHgwODg4LAorCTB4NzBlYSwgMHgwODc4LCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LAorCTB4OTAwZCwgMHgxMTIwLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4OTAxNiwgMHg3MDJjLAorCTB4MjE0OCwgMHhhOTA0LCAweGE4MDIsIDB4ODIxMCwgMHgyOTAwLCAweDgxZmYsIDB4MWRjOCwgMHg3MDJlLAorCTB4NzBiYywgMHg5MjAwLCAweDcwYmUsIDB4MDgwYywgMHg4MWYwLCAweDBjNjAsIDB4MjA3MSwgMHgxODAwLAorCTB4MjkwMCwgMHg3ODIyLCAweGE4MDQsIDB4OTAwZCwgMHgxOTA0LCAweDZiYTIsIDB4NzgzMCwgMHg4MDA3LAorCTB4OTA4NCwgMHgwMDFmLCAweDkwODIsIDB4MDAwMSwgMHgxMjIwLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg3ODI0LCAweDAwZTYsIDB4MjA3MSwgMHgwMDQwLCAweDcxMmMsIDB4ZDE5YywgMHgxMTQ4LAorCTB4MjAwOSwgMHgxODJmLCAweDIxMGMsIDB4OTE4YSwgMHgwMDQwLCAweDAyMTgsIDB4NzAyMiwgMHgwMGVlLAorCTB4MDA1OCwgMHgwMGVlLCAweDIwNDgsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLAorCTB4ODAwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NmUxNiwgMHhkMGE0LCAweDE5ZjAsIDB4MGUwNCwgMHg2Yjk5LCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLAorCTB4MWRlMCwgMHgwMGQ2LCAweDIwNjksIDB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLAorCTB4MjAwMSwgMHgxOTFmLCAweDIwMGMsIDB4YzE4NCwgMHgyMTAyLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE5MWYsIDB4MjAwYywgMHhjMTg1LCAweDIxMDIsIDB4MDBmZSwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LCAweGE5MDQsIDB4YTgwMiwgMHg4MjEwLAorCTB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGJjLCAweDkyMDAsIDB4NzBiZSwgMHgwODBjLAorCTB4ODFmMCwgMHgwODA0LCAweDZiNTksIDB4MDA5NiwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYmMsIDB4ODAwMCwgMHg3MGJlLAorCTB4MDgwYywgMHg4MWYwLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMGE0LAorCTB4MWQ2MCwgMHgwMGVlLCAweDBlMDQsIDB4NmJmMywgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHg3MDQ0LAorCTB4YzA4NCwgMHg3MDQ2LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWUwLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMDljLAorCTB4MTE3MCwgMHgwMDllLCAweDI5MDAsIDB4NzgyMiwgMHhhODA0LCAweDkwMGQsIDB4MTFlMCwgMHgwMGZlLAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzA0NCwgMHhjMDg1LCAweDcwNDYsIDB4MGM1OCwgMHgwMDllLAorCTB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLAorCTB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTEyMCwgMHgwMGZlLAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LAorCTB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGJjLAorCTB4OTIwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MjkwOCwgMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweDkwNGQsIDB4NzExYSwgMHgwMTEwLAorCTB4YTkwMiwgMHgwMDA4LCAweDcxMWUsIDB4MjE0OCwgMHhhODA0LCAweDkwMGQsIDB4MTkwNCwgMHg2YzhkLAorCTB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTkwYywgMHg2ZTE2LCAweGQwOWMsIDB4MTFiMCwgMHg3MDFjLAorCTB4OTA0ZCwgMHgwMTk4LCAweGE4NGMsIDB4OTAwNSwgMHgxMTgwLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLAorCTB4MTEwOCwgMHg3MDFhLCAweGE4MDAsIDB4NzAxZSwgMHgyOTAwLCAweDc4MjIsIDB4NzgyYywgMHg5MDk0LAorCTB4MDc4MCwgMHgxOTBjLCAweDZlMTYsIDB4ZDA5YywgMHgwZDUwLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLAorCTB4MTkwYywgMHg2ZTE2LCAweGQwYTQsIDB4MDVhOCwgMHgwMGU2LCAweDc4MjQsIDB4MjA0OCwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDJjLCAweGE4MDIsIDB4MjkwMCwgMHg3MDJlLCAweDcwYmMsIDB4ODAwMCwgMHg3MGJlLAorCTB4MDgwYywgMHg4MWYwLCAweDc4MmMsIDB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMGE0LAorCTB4MWQ2MCwgMHgwMGVlLCAweDBlMDQsIDB4NmM4NiwgMHg3ODM4LCAweDc5MzgsIDB4OTEwZSwgMHgxZGUwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNiwgMHg2ODMzLCAweDAwMTMsIDB4MDBkZSwgMHg3MDQ0LAorCTB4YzA4NCwgMHg3MDQ2LCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLCAweDAwODksIDB4MjAwNCwgMHhkMDg0LAorCTB4MTkwYywgMHgxMWUwLCAweDAwZmUsIDB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4NzA0NCwgMHhjMDg1LAorCTB4NzA0NiwgMHgwMGZlLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4OTAxNiwgMHg3MDJjLCAweDIxNDgsIDB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLAorCTB4MWRjOCwgMHg3MDJlLCAweDcwYmMsIDB4OTIwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHgwMGVlLAorCTB4MDgwNCwgMHg2YzMwLCAweDIwNzEsIDB4MTkwZSwgMHhhODAzLCAweDAwMDAsIDB4MjkwOCwgMHg3MDEwLAorCTB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLCAweDAxMTAsIDB4YTkwMiwgMHgwMDA4LAorCTB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxMTI4LCAweDFlMDQsIDB4NmNjZCwgMHgwMDJlLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTgwMCwgMHg5MDE2LCAweDcwMmMsIDB4MjE0OCwgMHhhOTA0LAorCTB4YTgwMiwgMHg4MjEwLCAweDI5MDAsIDB4ODFmZiwgMHgxZGM4LCAweDcwMmUsIDB4NzBiYywgMHg5MjAwLAorCTB4NzBiZSwgMHgwODBjLCAweDgxZjAsIDB4MGUwNCwgMHg2Y2I3LCAweDIwNzEsIDB4MTkwZSwgMHg3MDFjLAorCTB4MjA0OCwgMHhhODRjLCAweDkwMGQsIDB4MGQxOCwgMHgyMDcxLCAweDAwMDAsIDB4NzE4MiwgMHhhODUwLAorCTB4NzAzMiwgMHhhODZjLCAweDcwODYsIDB4NzAzNiwgMHhhODcwLCAweDcwOGEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZTAsIDB4MjA3MSwgMHgxOTBlLAorCTB4MDgwYywgMHg2ZTAyLCAweDAwMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNzEsIDB4MTkwZSwgMHhhODAzLAorCTB4MDAwMCwgMHgyOTA4LCAweDcwMTAsIDB4ODAwMCwgMHg3MDEyLCAweDcwMTgsIDB4OTA0ZCwgMHg3MTFhLAorCTB4MDExMCwgMHhhOTAyLCAweDAwMDgsIDB4NzExZSwgMHgyMTQ4LCAweGE4MDQsIDB4OTAwZCwgMHgxMTE4LAorCTB4MDAyZSwgMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHgxODAwLCAweDkwMTYsIDB4NzAyYywgMHgyMTQ4LAorCTB4YTkwNCwgMHhhODAyLCAweDgyMTAsIDB4MjkwMCwgMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGJjLAorCTB4OTIwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDA2LAorCTB4YTg3YywgMHgwMDA2LCAweGE4NjcsIDB4MDEwMywgMHgyMGE5LCAweDAwMWMsIDB4YTg2MCwgMHgyMGU4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWQsIDB4MjBhMCwgMHg5MDA2LCAweDQwMDQsIDB4MDAwZSwgMHg5MDg0LAorCTB4MDBmZiwgMHhhODdlLCAweDAwMGUsIDB4YTg3YSwgMHhhOTgyLCAweDAwMDUsIDB4MjA3MSwgMHgxOTBlLAorCTB4NzAwNCwgMHgwMDAyLCAweDZkM2EsIDB4NmQzYiwgMHg2ZTAxLCAweDZkM2IsIDB4NmQzOCwgMHg2ZTAxLAorCTB4MDgwYywgMHgwZGZhLCAweDAwMDUsIDB4MjAwMSwgMHgxOTIxLCAweDIwMDQsIDB4MDAwMiwgMHg2ZDQ1LAorCTB4NmQ0NSwgMHg2ZDlhLCAweDZkOWIsIDB4NmQ0NSwgMHg2ZDliLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MWUwYywgMHg2ZTIxLCAweDcwMWMsIDB4OTA0ZCwgMHgwMWUwLCAweGE4NGMsIDB4OTAwNSwgMHgwMWQ4LAorCTB4MGUwNCwgMHg2ZDY5LCAweGE5NGMsIDB4MjA3MSwgMHgwMDAwLCAweDcxODIsIDB4YTg1MCwgMHg3MDMyLAorCTB4YTg2YywgMHg3MDg2LCAweDcwMzYsIDB4YTg3MCwgMHg3MDhhLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDIwNzEsIDB4MTkwZSwgMHgwODBjLAorCTB4NmUwMiwgMHgwMTJlLCAweDA0NzAsIDB4MjAwMSwgMHgwMDViLCAweDIwMDQsIDB4OTA5NCwgMHgwNzgwLAorCTB4MTkwYywgMHg2ZTE2LCAweGQwOWMsIDB4MjA3MSwgMHgxOTBlLCAweDE1MTAsIDB4MjA3MSwgMHgxOTBlLAorCTB4NzAwZiwgMHgwMDAxLCAweGE5NjQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwMywgMHgxMTMwLAorCTB4ODEwZiwgMHg5MThjLCAweDAwZmYsIDB4ODEwMSwgMHgwMTA4LCAweDcxMGUsIDB4MjkwMCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDUwLCAweDY4MjIsIDB4MDBkZSwgMHgyMDcxLCAweDE5MGUsIDB4NzAxYywgMHgyMDQ4LAorCTB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4YTgwMCwgMHg3MDFlLCAweDkwMDUsIDB4MTEwOCwgMHg3MDFhLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwMDUsIDB4MDBkNiwgMHgyMDA4LCAweDIwNjksIDB4MTlkMiwgMHg2ODNjLAorCTB4OTAwNSwgMHgwNzYwLCAweDAxNTgsIDB4OTE4NiwgMHgwMDAzLCAweDA1NDAsIDB4MjAwMSwgMHgxODE0LAorCTB4MjAwNCwgMHgyMDA5LCAweDFhYTIsIDB4MjEwYywgMHg5MTAyLCAweDE1MDAsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDY5LCAweDAwNTAsIDB4NjkzYywgMHg2ODM4LCAweDkxMDYsIDB4MDE5MCwgMHgwZTA0LAorCTB4NmRjZCwgMHgyMDY5LCAweDAwMDAsIDB4NjgzNywgMHg4MDQwLCAweDY4MzMsIDB4MDAxMiwgMHg2ODgzLAorCTB4ODA0MCwgMHgyMDkxLCAweDQwODAsIDB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLAorCTB4MTFlMCwgMHgyMDY5LCAweDE5ZDIsIDB4NjgzZiwgMHhmZmZmLCAweDAxMmUsIDB4MDBkZSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDFlMGMsIDB4NmU4MiwgMHg3MDFjLCAweDkwNGQsIDB4MDU0MCwgMHgyMDAxLAorCTB4MDA1YiwgMHgyMDA0LCAweDkwOTQsIDB4MDc4MCwgMHgxNWM5LCAweGQwOWMsIDB4MTUwMCwgMHgyMDcxLAorCTB4MTkwZSwgMHg3MDBmLCAweDAwMDEsIDB4YTk2NCwgMHg5MTg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTEzMCwgMHg4MTBmLCAweDkxOGMsIDB4MDBmZiwgMHg4MTAxLCAweDAxMDgsIDB4NzEwZSwgMHgyOTAwLAorCTB4MDBkNiwgMHgyMDY5LCAweDAwNTAsIDB4NjgyMiwgMHgwMGRlLCAweDcwMWMsIDB4MjA0OCwgMHg3MDEwLAorCTB4ODAwMSwgMHg3MDEyLCAweGE4MDAsIDB4NzAxZSwgMHg5MDA1LCAweDExMDgsIDB4NzAxYSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMWMsIDB4OTA0ZCwgMHgwMTYwLAorCTB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4YTgwMCwgMHg3MDFlLCAweDkwMDUsIDB4MTEwOCwgMHg3MDFhLAorCTB4MDEyZSwgMHgwODBjLCAweDEwNjMsIDB4MDAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MjA5MSwgMHg4MDAwLAorCTB4MGUwNCwgMHg2ZTE4LCAweDAwMDYsIDB4MDAxNiwgMHgyMDAxLCAweDgwMDQsIDB4MDAwNiwgMHgwODA0LAorCTB4MGUwMywgMHgwMDk2LCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLCAweDcwNDQsIDB4ZDA4NCwgMHgwMWMwLAorCTB4YzA4NCwgMHg3MDQ2LCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDAwZmUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NzgyYywgMHg5MDk0LCAweDA3ODAsIDB4MTk5MSwgMHhkMGE0LCAweDBkYjgsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwMCwgMHg3ODI0LCAweDAwZTYsIDB4MjA3MSwgMHgwMDQwLCAweDcxMmMsIDB4ZDE5YywgMHgxMTQ4LAorCTB4MjAwOSwgMHgxODJmLCAweDIxMGMsIDB4OTE4YSwgMHgwMDQwLCAweDAyMTgsIDB4NzAyMiwgMHgwMGVlLAorCTB4MDA1OCwgMHgwMGVlLCAweDIwNDgsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLAorCTB4ODAwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NmUxNiwgMHhkMGE0LCAweDE5ZjAsIDB4NzgzOCwgMHg3OTM4LCAweDkxMGUsIDB4MWRlMCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgwMDAwLCAweDY4MzYsIDB4NjgzMywgMHgwMDEzLCAweDAwZGUsIDB4MjA5MSwgMHg0MDgwLAorCTB4MjAwMSwgMHgwMDg5LCAweDIwMDQsIDB4ZDA4NCwgMHgxOTBjLCAweDExZTAsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDA5ZSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMDUwLCAweDcwNDQsIDB4ZDA4NCwgMHgwMWI4LAorCTB4YzA4NCwgMHg3MDQ2LCAweDc4MzgsIDB4NzkzOCwgMHg5MTBlLCAweDFkZTAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDAwMCwgMHg2ODM2LCAweDY4MzMsIDB4MDAxMywgMHgwMGRlLCAweDIwOTEsIDB4NDA4MCwgMHgyMDAxLAorCTB4MDA4OSwgMHgyMDA0LCAweGQwODQsIDB4MTkwYywgMHgxMWUwLCAweDAwZmUsIDB4MDAwNSwgMHg3ODJjLAorCTB4OTA5NCwgMHgwNzgwLCAweDE5MGMsIDB4NmUxNiwgMHhkMGE0LCAweDBkYjgsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwMCwgMHg3ODI0LCAweDIwNDgsIDB4NzAyYywgMHhhODAyLCAweDI5MDAsIDB4NzAyZSwgMHg3MGJjLAorCTB4ODAwMCwgMHg3MGJlLCAweDA4MGMsIDB4ODFmMCwgMHg3ODJjLCAweDkwOTQsIDB4MDc4MCwgMHgxOTBjLAorCTB4NmUxNiwgMHhkMGE0LCAweDFkNzAsIDB4MDBkNiwgMHgyMDY5LCAweDAwNTAsIDB4NjkzYywgMHgyMDY5LAorCTB4MTkyMSwgMHg2ODA4LCAweDY5MGEsIDB4MjA2OSwgMHgxOWQyLCAweDkxMDIsIDB4MTExOCwgMHg2ODNjLAorCTB4OTAwNSwgMHgxMzI4LCAweDIwMDEsIDB4MTkyMiwgMHgyMDBjLCAweDgxMGQsIDB4NjkzZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMGZlLCAweDAwMDUsIDB4NzA5NCwgMHg5MDhhLCAweDAwMjksIDB4MWEwYywgMHgwZGZhLAorCTB4OTA4MiwgMHgwMDFkLCAweDAwMWIsIDB4NjAyNywgMHgxZTAwLCAweDAwMDUsIDB4NmZhYSwgMHg2ZjMwLAorCTB4NmY0YywgMHg2Zjc2LCAweDZmOTksIDB4NmZkOSwgMHg2ZmViLCAweDZmNGMsIDB4NmZjMSwgMHg2ZWViLAorCTB4NmYxOSwgMHg2ZWVhLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHg5MDA1LAorCTB4MTE4MCwgMHg2ODA4LCAweDkwMDUsIDB4MTUxOCwgMHg3MDk3LCAweDAwMjgsIDB4MjA2OSwgMHgxOTY3LAorCTB4MmQwNCwgMHg3MDAyLCAweDA4MGMsIDB4NzM1OSwgMHg2MDI4LCAweDkwODUsIDB4MDYwMCwgMHg2MDJhLAorCTB4MDBiMCwgMHg3MDk3LCAweDAwMjgsIDB4MjA2OSwgMHgxOTY3LCAweDJkMDQsIDB4NzAwMiwgMHg2MDI4LAorCTB4OTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBlNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgyMDcxLAorCTB4MWEzYSwgMHgwODBjLCAweDE5ZmYsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsIDB4MDBlZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweDkwMDUsIDB4MTE3OCwgMHg2ODA4LAorCTB4OTAwNSwgMHgxMTYwLCAweDcwOTcsIDB4MDAyOCwgMHgyMDY5LCAweDE5NjcsIDB4MmQwNCwgMHg3MDAyLAorCTB4MDgwYywgMHg3M2YzLCAweDYwMjgsIDB4OTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgyMDAxLCAweDAwOTAsIDB4MDgwYywgMHgyYzg4LCAweDAwMGUsIDB4NjEyNCwgMHhkMWU0LAorCTB4MTE5MCwgMHgwODBjLCAweDcwNTgsIDB4ZDFkNCwgMHgxMTYwLCAweGQxZGMsIDB4MTEzOCwgMHhkMWNjLAorCTB4MDE1MCwgMHg3MDk3LCAweDAwMjAsIDB4MDgwYywgMHg3MDU4LCAweDAwMjgsIDB4NzA5NywgMHgwMDFkLAorCTB4MDAxMCwgMHg3MDk3LCAweDAwMWYsIDB4MDAwNSwgMHgyMDAxLCAweDAwODgsIDB4MDgwYywgMHgyYzg4LAorCTB4NjEyNCwgMHhkMWNjLCAweDExZTgsIDB4ZDFkYywgMHgxMWMwLCAweGQxZTQsIDB4MTE5OCwgMHg5MTg0LAorCTB4MWUwMCwgMHgxMWQ4LCAweDA4MGMsIDB4MWEyNCwgMHg2MGUzLCAweDAwMDEsIDB4NjAwYywgMHhjMGI0LAorCTB4NjAwZSwgMHgwODBjLCAweDcyMzMsIDB4MjAwMSwgMHgwMDgwLCAweDA4MGMsIDB4MmM4OCwgMHg3MDk3LAorCTB4MDAyOCwgMHgwMDU4LCAweDcwOTcsIDB4MDAxZSwgMHgwMDQwLCAweDcwOTcsIDB4MDAxZCwgMHgwMDI4LAorCTB4NzA5NywgMHgwMDIwLCAweDAwMTAsIDB4NzA5NywgMHgwMDFmLCAweDAwMDUsIDB4MDgwYywgMHgxYTI0LAorCTB4NjBlMywgMHgwMDAxLCAweDYwMGMsIDB4YzBiNCwgMHg2MDBlLCAweDA4MGMsIDB4NzIzMywgMHgyMDAxLAorCTB4MDA4MCwgMHgwODBjLCAweDJjODgsIDB4NjEyNCwgMHhkMWQ0LCAweDExODAsIDB4ZDFkYywgMHgxMTU4LAorCTB4ZDFlNCwgMHgxMTMwLCAweDkxODQsIDB4MWUwMCwgMHgxMTU4LCAweDcwOTcsIDB4MDAyOCwgMHgwMDQwLAorCTB4NzA5NywgMHgwMDFlLCAweDAwMjgsIDB4NzA5NywgMHgwMDFkLCAweDAwMTAsIDB4NzA5NywgMHgwMDFmLAorCTB4MDAwNSwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYzg4LCAweDYxMjQsIDB4ZDFkYywgMHgxMTM4LAorCTB4ZDFlNCwgMHgwMTM4LCAweDA4MGMsIDB4MWEyNCwgMHg3MDk3LCAweDAwMWUsIDB4MDAxMCwgMHg3MDk3LAorCTB4MDAxZCwgMHgwMDA1LCAweDA4MGMsIDB4NzBkYiwgMHg2MTI0LCAweGQxZGMsIDB4MTE4OCwgMHgwODBjLAorCTB4NzA1OCwgMHgwMDE2LCAweDA4MGMsIDB4MWEyNCwgMHgwMDFlLCAweGQxZDQsIDB4MTEyOCwgMHhkMWU0LAorCTB4MDEzOCwgMHg3MDk3LCAweDAwMWUsIDB4MDAyMCwgMHg3MDk3LCAweDAwMWYsIDB4MDgwYywgMHg3MDU4LAorCTB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MDBhMCwgMHgwODBjLCAweDJjODgsIDB4MDAwZSwgMHg2MTI0LAorCTB4ZDFkNCwgMHgxMTYwLCAweGQxY2MsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsIDB4ZDFlNCwgMHgwMTQwLAorCTB4NzA5NywgMHgwMDFlLCAweDAwMjgsIDB4NzA5NywgMHgwMDFkLCAweDAwMTAsIDB4NzA5NywgMHgwMDIxLAorCTB4MDAwNSwgMHgwODBjLCAweDcwZGIsIDB4NjEyNCwgMHhkMWQ0LCAweDExNTAsIDB4ZDFkYywgMHgxMTI4LAorCTB4ZDFlNCwgMHgwMTQwLCAweDcwOTcsIDB4MDAxZSwgMHgwMDI4LCAweDcwOTcsIDB4MDAxZCwgMHgwMDEwLAorCTB4NzA5NywgMHgwMDFmLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweDAwOTAsIDB4MDgwYywgMHgyYzg4LAorCTB4MDAwZSwgMHg2MTI0LCAweGQxZDQsIDB4MTE3OCwgMHhkMWNjLCAweDExNTAsIDB4ZDFkYywgMHgxMTI4LAorCTB4ZDFlNCwgMHgwMTU4LCAweDcwOTcsIDB4MDAxZSwgMHgwMDQwLCAweDcwOTcsIDB4MDAxZCwgMHgwMDI4LAorCTB4NzA5NywgMHgwMDIwLCAweDAwMTAsIDB4NzA5NywgMHgwMDFmLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAxMjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLAorCTB4MTgwMCwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg3MjA3LCAweDExZDgsIDB4MjAwMSwgMHgxODBjLAorCTB4MjAwYywgMHhkMWI0LCAweDAxYjAsIDB4YzFiNCwgMHgyMTAyLCAweDYwMjcsIDB4MDIwMCwgMHgwODBjLAorCTB4MmJiMCwgMHg2MDI0LCAweGQwY2MsIDB4MDE0OCwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYzg4LAorCTB4MDgwYywgMHg3NTA0LCAweDA4MGMsIDB4NWYyYiwgMHgwNDI4LCAweDYwMjgsIDB4YzBjZCwgMHg2MDJhLAorCTB4MDQwOCwgMHgwODBjLCAweDcyMjEsIDB4MDE1MCwgMHgwODBjLCAweDcyMTgsIDB4MTEzOCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwODBjLCAweDI3MTcsIDB4MDgwYywgMHg3MWRmLCAweDAwYTAsIDB4MDgwYywgMHg3MGQ4LAorCTB4MDE3OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNzE3LCAweDcwOTQsIDB4OTA4NiwgMHgwMDFlLAorCTB4MDEyMCwgMHg3MDk0LCAweDkwODYsIDB4MDAyMiwgMHgxMTE4LCAweDcwOTcsIDB4MDAyNSwgMHgwMDEwLAorCTB4NzA5NywgMHgwMDIxLCAweDAxMmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAyNiwgMHgyMDExLCAweDcwNjksIDB4MDgwYywgMHg4M2FlLCAweDAwMmUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MjAwOSwgMHgwMDY0LCAweDIwMTEsIDB4NzA2OSwgMHgwODBjLCAweDgzYTUsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGU2LCAweDAwZjYsIDB4MDAxNiwgMHgwODBjLCAweDk2NTYsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHg3MDA2LCAweDAwMWUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDAxMjYsIDB4MDgwYywgMHg5NjU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4OWEwZiwgMHgyMDExLAorCTB4MDAwMiwgMHgwODBjLCAweDlhMTksIDB4MDgwYywgMHg5OTI3LCAweDA4MGMsIDB4ODM1YSwgMHgwMDM2LAorCTB4OTAxZSwgMHgwODBjLCAweDk5OWQsIDB4MDAzZSwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywgMHhkYzEzLAorCTB4MDgwYywgMHhkYzJlLCAweDIwMDksIDB4MDAwNCwgMHgwODBjLCAweDJiYjYsIDB4MDgwYywgMHgyYTg5LAorCTB4MjAwMSwgMHgxODAwLCAweDIwMDMsIDB4MDAwNCwgMHg2MDI3LCAweDAwMDgsIDB4MjAxMSwgMHg3MDY5LAorCTB4MDgwYywgMHg4M2FlLCAweDA4MGMsIDB4NzIyMSwgMHgwMTE4LCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LAorCTB4MDgwYywgMHgwYjhmLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI3MTcsIDB4MDEyZSwgMHgwMGZlLAorCTB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDI2LAorCTB4MDBlNiwgMHgyMDExLCAweDcwNzYsIDB4MjA3MSwgMHgxOWQyLCAweDcwMWMsIDB4OTIwNiwgMHgxMTE4LAorCTB4NzAxOCwgMHg5MDA1LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDAyZSwgMHgwMDA1LAorCTB4NjAyMCwgMHhkMDljLCAweDAwMDUsIDB4NjgwMCwgMHg5MDg0LCAweGZmZmUsIDB4OTA4NiwgMHgwMGMwLAorCTB4MDFiOCwgMHgyMDAxLCAweDAwYzAsIDB4MDgwYywgMHgyYzg4LCAweDAxNTYsIDB4MjBhOSwgMHgwMDJkLAorCTB4MWQwNCwgMHg3MGU4LCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDcwZTgsIDB4MDE1ZSwgMHgwMGQ2LAorCTB4MjA2OSwgMHgxODAwLCAweDY4OTgsIDB4ODAwMSwgMHgwMjIwLCAweDAxMTgsIDB4Njg5YSwgMHgwMGRlLAorCTB4MDAwNSwgMHg2ODliLCAweDAwMTQsIDB4NjhlNCwgMHhkMGRjLCAweDBkYzgsIDB4NjgwMCwgMHg5MDg2LAorCTB4MDAwMSwgMHgxZGE4LCAweDA4MGMsIDB4ODNiYSwgMHgwYzkwLCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywgMHg3NTEzLAorCTB4MjAwMSwgMHgxOTQ1LCAweDIwMDMsIDB4MDAwMCwgMHg5MDA2LCAweDcwOTYsIDB4NjBlMiwgMHg2ODg2LAorCTB4MDgwYywgMHgyN2UyLCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDA4MGMsIDB4NWRlYSwgMHg2MDI3LAorCTB4ZmZmZiwgMHg2MDJiLCAweDE4MmYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHgxODAwLAorCTB4MjAwMSwgMHgxOTU1LCAweDIwMGMsIDB4OTE4NiwgMHgwMDAwLCAweDAxNTgsIDB4OTE4NiwgMHgwMDAxLAorCTB4MDE1OCwgMHg5MTg2LCAweDAwMDIsIDB4MDE1OCwgMHg5MTg2LCAweDAwMDMsIDB4MDE1OCwgMHgwODA0LAorCTB4NzFjZiwgMHg3MDk3LCAweDAwMjIsIDB4MDA0MCwgMHg3MDk3LCAweDAwMjEsIDB4MDAyOCwgMHg3MDk3LAorCTB4MDAyMywgMHgwMDEwLCAweDcwOTcsIDB4MDAyNCwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjdlMiwgMHgwMDI2LCAweDA4MGMsIDB4YTA2OSwgMHgwMDJlLAorCTB4NzAwMCwgMHg5MDhlLCAweDAwMDQsIDB4MDExOCwgMHg2MDJiLCAweDAwMjgsIDB4MDAxMCwgMHg2MDJiLAorCTB4MDAyMCwgMHgwMTU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHg2MDI0LAorCTB4ZDBhYywgMHgwMTUwLCAweDAxMmUsIDB4MDE1ZSwgMHgwODBjLCAweGM1MzksIDB4MDExOCwgMHg5MDA2LAorCTB4MDgwYywgMHgyY2IyLCAweDA4MDQsIDB4NzFkYiwgMHg2ODAwLCAweDkwODQsIDB4MDBhMSwgMHhjMGJkLAorCTB4NjgwMiwgMHgwODBjLCAweDJiYjAsIDB4NjkwNCwgMHhkMWQ0LCAweDExNDAsIDB4MjAwMSwgMHgwMTAwLAorCTB4MDgwYywgMHgyYzg4LCAweDFmMDQsIDB4NzE2NywgMHgwODBjLCAweDcyNWUsIDB4MDEyZSwgMHgwMTVlLAorCTB4MDgwYywgMHg3MjE4LCAweDA1MzgsIDB4NjA0NCwgMHg5MDA1LCAweDAxZjgsIDB4MjAwMSwgMHgwMTAwLAorCTB4MjAwNCwgMHg5MDg2LCAweDAwMGEsIDB4MDE1OCwgMHgyMDExLCAweDAxMTQsIDB4MjIwNCwgMHg5MDg1LAorCTB4MDEwMCwgMHgyMDEyLCAweDYwNTAsIDB4MDAwNiwgMHg5MDg1LCAweDAwMjAsIDB4NjA1MiwgMHgwODBjLAorCTB4NzI1ZSwgMHg5MDA2LCAweDgwMDEsIDB4MWRmMCwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwYSwgMHgwMTQwLCAweDAwMGUsIDB4NjA1MiwgMHgwMDI4LCAweDY4MDQsIDB4ZDBkNCwgMHgxMTEwLAorCTB4MDgwYywgMHg3MjVlLCAweDA4MGMsIDB4YzUzOSwgMHgwMTE4LCAweDkwMDYsIDB4MDgwYywgMHgyY2IyLAorCTB4MDAxNiwgMHgwMDI2LCAweDcwMDAsIDB4OTA4ZSwgMHgwMDA0LCAweDAxMzAsIDB4MjAwOSwgMHgwMGM4LAorCTB4MjAxMSwgMHg3MDc2LCAweDA4MGMsIDB4ODM2YywgMHgwMDJlLCAweDAwMWUsIDB4MDgwYywgMHg4MWU3LAorCTB4NzAzNCwgMHhjMDg1LCAweDcwMzYsIDB4MjAwMSwgMHgxOTU1LCAweDIwMDMsIDB4MDAwNCwgMHgwODBjLAorCTB4NmVkMywgMHgwODBjLCAweDcyMTgsIDB4MDEzOCwgMHg2ODA0LCAweGQwZDQsIDB4MTEyMCwgMHhkMGRjLAorCTB4MTEwMCwgMHgwODBjLCAweDc1MDksIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHg4MWZlLCAweDA4MGMsIDB4ODFmMCwgMHgwODBjLCAweDc1MTMsIDB4MjAwMSwgMHgxOTQ1LAorCTB4MjAwMywgMHgwMDAwLCAweDkwMDYsIDB4NzA5NiwgMHg2MGUyLCAweDY4ODYsIDB4MDgwYywgMHgyN2UyLAorCTB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg2MDI3LAorCTB4ZmZmZiwgMHg2MDJiLCAweDE4MmYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LAorCTB4MjAwMSwgMHgxOTU0LCAweDIwMDQsIDB4OTA4NiwgMHhhYWFhLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDgwYywgMHg1NWRmLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAwNiwgMHgwODBjLCAweDU1ZGYsIDB4OTA4NCwgMHgwMDMwLCAweDkwODYsIDB4MDAzMCwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDA4MGMsIDB4NTVkZiwgMHg5MDg0LCAweDAwMzAsIDB4OTA4NiwgMHgwMDEwLAorCTB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDgwYywgMHg1NWRmLCAweDkwODQsIDB4MDAzMCwgMHg5MDg2LAorCTB4MDAyMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAzNiwgMHgwMDE2LCAweDIwMDEsIDB4MTgwYywgMHgyMDA0LAorCTB4OTA4YywgMHgwMDEzLCAweDAxODAsIDB4MDAyMCwgMHgwODBjLCAweDI4MDIsIDB4OTAwZSwgMHgwMDI4LAorCTB4MDgwYywgMHg2N2JiLCAweDFkYzgsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAyOCwgMHgwODBjLAorCTB4MzE1NiwgMHg5MDA2LCAweDAwMTksIDB4MDAxZSwgMHgwMDNlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwYywgMHgyZTA0LCAweDAxMzAsIDB4MDgwYywgMHhjNTMyLCAweDExMjgsIDB4OTA4NSwgMHgwMDEwLAorCTB4MDAxMCwgMHg5MDg0LCAweGZmZWYsIDB4MjA3MiwgMHgwMGVlLCAweDAwMDUsIDB4NjA1MCwgMHgwMDA2LAorCTB4NjBlYywgMHgwMDA2LCAweDYwMGMsIDB4MDAwNiwgMHg2MDA0LCAweDAwMDYsIDB4NjAyOCwgMHgwMDA2LAorCTB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDBhLCAweDA1MTAsIDB4MDAxNiwgMHg2MTM4LAorCTB4NjA1MCwgMHg5MDg0LCAweGZiZmYsIDB4OTA4NSwgMHgyMDAwLCAweDYwNTIsIDB4NjEzYSwgMHgyMGE5LAorCTB4MDAxMiwgMHgxZDA0LCAweDcyNzksIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzI3OSwgMHg2MDJmLAorCTB4MDEwMCwgMHg2MDJmLCAweDAwMDAsIDB4NjA1MCwgMHg5MDg1LCAweDA0MDAsIDB4OTA4NCwgMHhkZmZmLAorCTB4NjA1MiwgMHg2MTNhLCAweDAwMWUsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMGEwLAorCTB4MDgwYywgMHgyY2MyLCAweDA4MGMsIDB4MmNmNSwgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLAorCTB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDIsIDB4MDgwYywgMHgyYjkxLAorCTB4MDAyNiwgMHg2MDI3LCAweDAwNDAsIDB4MDAyZSwgMHgwMDBlLCAweDYwMmEsIDB4MDAwZSwgMHg2MDA2LAorCTB4MDAwZSwgMHg2MDBlLCAweDAwMGUsIDB4NjBlZSwgMHg2MGUzLCAweDAwMDAsIDB4Njg4NywgMHgwMDAxLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjdlMiwgMHgyMDAxLCAweDAwYTAsIDB4MDAwNiwgMHgwODBjLAorCTB4YzUzOSwgMHgwMDBlLCAweDAxMzAsIDB4MDgwYywgMHgyY2E2LCAweDkwMDYsIDB4MDgwYywgMHgyY2IyLAorCTB4MDAxMCwgMHgwODBjLCAweDJjODgsIDB4MDAwZSwgMHg2MDUyLCAweDYwNTAsIDB4MDAwNiwgMHhjMGU1LAorCTB4NjA1MiwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwODBjLCAweDJiMDYsIDB4MDBmZSwgMHgwMDBlLAorCTB4NjA1MiwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4MTgwMCwgMHg2MDIwLAorCTB4OTA4NCwgMHgwMDgwLCAweDAxMzgsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFjNSwgMHgyMTAyLAorCTB4MDgwNCwgMHg3MzRiLCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxYzQsIDB4MjEwMiwgMHg2MDI4LAorCTB4OTA4NCwgMHhlMWZmLCAweDYwMmEsIDB4NjAyNywgMHgwMjAwLCAweDIwMDEsIDB4MDA5MCwgMHgwODBjLAorCTB4MmM4OCwgMHgyMGE5LCAweDAzNjYsIDB4NjAyNCwgMHhkMGNjLCAweDE1MTgsIDB4MWQwNCwgMHg3MmZiLAorCTB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzJmYiwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg5YTBmLAorCTB4MjAxMSwgMHgwMDAyLCAweDA4MGMsIDB4OWExOSwgMHgwODBjLCAweDk5MjcsIDB4OTAxZSwgMHgwODBjLAorCTB4OTk5ZCwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYzg4LCAweDA4MGMsIDB4NzUwNCwgMHgwODBjLAorCTB4NWYyYiwgMHgwODBjLCAweGM1MzksIDB4MDExMCwgMHgwODBjLCAweDBkNjgsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDQ4MCwgMHgwODBjLCAweDFhMjQsIDB4NjBlMywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4MjdlMiwgMHg2MGUyLCAweDIwMDEsIDB4MDA4MCwgMHgwODBjLCAweDJjODgsIDB4MjBhOSwgMHgwMzY2LAorCTB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwgMHgwODBjLCAweDJiYjAsIDB4NjAyNCwgMHg5MTBjLAorCTB4MDEzOCwgMHgxZDA0LCAweDczMzAsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsIDB4NzMzMCwgMHgwODIwLAorCTB4NjAyOCwgMHg5MDg1LCAweDFlMDAsIDB4NjAyYSwgMHg3MGIwLCAweDkwMDUsIDB4MTExOCwgMHg2ODg3LAorCTB4MDAwMSwgMHgwMDA4LCAweDY4ODYsIDB4MDgwYywgMHhjNTM5LCAweDAxMTAsIDB4MDgwYywgMHgwZDY4LAorCTB4OTAwNiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwgMHg3MDAwLCAweDkwODYsIDB4MDAwMywgMHgxMTY4LAorCTB4MjAwMSwgMHgwMjBiLCAweDIwMDQsIDB4OTA4NCwgMHg1NTQwLCAweDkwODYsIDB4NTU0MCwgMHgxMTI4LAorCTB4MjA2OSwgMHgxYTUwLCAweDJkMDQsIDB4ODAwMCwgMHgyMDZhLCAweDIwNjksIDB4MDE0MCwgMHg2MDIwLAorCTB4OTA4NCwgMHgwMGMwLCAweDAxMjAsIDB4Njg4NCwgMHg5MDA1LCAweDE5MDQsIDB4NzNiZSwgMHgyMDAxLAorCTB4MDA4OCwgMHgwODBjLCAweDJjODgsIDB4OTAwNiwgMHg2MGUyLCAweDY4ODYsIDB4MDgwYywgMHgyN2UyLAorCTB4MjA2OSwgMHgwMjAwLCAweDY4MDQsIDB4OTAwNSwgMHgxMTE4LCAweDY4MDgsIDB4OTAwNSwgMHgwMWMwLAorCTB4NjAyOCwgMHg5MDg0LCAweGZiZmYsIDB4NjAyYSwgMHg2MDI3LCAweDA0MDAsIDB4MjA2OSwgMHgxOTY3LAorCTB4NzAwMCwgMHgyMDZhLCAweDcwOTcsIDB4MDAyNiwgMHg3MDAzLCAweDAwMDEsIDB4MjBhOSwgMHgwMDAyLAorCTB4MWQwNCwgMHg3M2EwLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDczYTAsIDB4MDgwNCwgMHg3M2ViLAorCTB4MjA2OSwgMHgwMTQwLCAweDIwYTksIDB4MDM4NCwgMHg2MDI3LCAweDFlMDAsIDB4MjAwOSwgMHgxZTAwLAorCTB4MDgwYywgMHgyYmIwLCAweDYwMjQsIDB4OTEwYywgMHgwNTA4LCAweDkwODQsIDB4MWEwMCwgMHgxMWYwLAorCTB4MWQwNCwgMHg3M2FjLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDczYWMsIDB4MjAxMSwgMHgwMDAzLAorCTB4MDgwYywgMHg5YTBmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDlhMTksIDB4MDgwYywgMHg5OTI3LAorCTB4OTAxZSwgMHgwODBjLCAweDk5OWQsIDB4MjAwMSwgMHgwMGEwLCAweDA4MGMsIDB4MmM4OCwgMHgwODBjLAorCTB4NzUwNCwgMHgwODBjLCAweDVmMmIsIDB4OTA4NSwgMHgwMDAxLCAweDAwYTgsIDB4MjAwMSwgMHgwMDgwLAorCTB4MDgwYywgMHgyYzg4LCAweDIwNjksIDB4MDE0MCwgMHg2MGUzLCAweDAwMDAsIDB4NzBiMCwgMHg5MDA1LAorCTB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4MjdlMiwgMHg2MGUyLCAweDkwMDYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweDE4MDAsIDB4NjAyMCwgMHg5MDg0LAorCTB4MDBjMCwgMHgwMWM4LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDlhMGYsIDB4MjAxMSwgMHgwMDAyLAorCTB4MDgwYywgMHg5YTE5LCAweDA4MGMsIDB4OTkyNywgMHg5MDFlLCAweDA4MGMsIDB4OTk5ZCwgMHgyMDY5LAorCTB4MDE0MCwgMHgyMDAxLCAweDAwYTAsIDB4MDgwYywgMHgyYzg4LCAweDA4MGMsIDB4NzUwNCwgMHgwODBjLAorCTB4NWYyYiwgMHgwODA0LCAweDc0ODUsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFiNCwgMHgxMTYwLAorCTB4YzFiNSwgMHgyMTAyLCAweDA4MGMsIDB4NzA1ZSwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHgwMDgwLAorCTB4MDgwYywgMHgyYzg4LCAweDYwZTMsIDB4MDAwMCwgMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHg5MDA1LAorCTB4MTExOCwgMHg2ODA4LCAweDkwMDUsIDB4MDE4MCwgMHg2MDI4LCAweDkwODQsIDB4ZmRmZiwgMHg2MDJhLAorCTB4NjAyNywgMHgwMjAwLCAweDIwNjksIDB4MTk2NywgMHg3MDAwLCAweDIwNmEsIDB4NzA5NywgMHgwMDI3LAorCTB4NzAwMywgMHgwMDAxLCAweDA4MDQsIDB4NzQ4NSwgMHg2MDI3LCAweDFlMDAsIDB4MjAwOSwgMHgxZTAwLAorCTB4MDgwYywgMHgyYmIwLCAweDYwMjQsIDB4OTEwYywgMHgwMWM4LCAweDkwODQsIDB4MWMwMCwgMHgxMWIwLAorCTB4MWQwNCwgMHg3NDQ0LCAweDAwMDYsIDB4MDAxNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwODBjLAorCTB4ODIzZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMGUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTlkMiwgMHg3MDcwLCAweDAwZWUsIDB4OTAwNSwgMHgxOWY4LCAweDAwZjgsIDB4MDAyNiwgMHgyMDExLAorCTB4NzA3NiwgMHgwODBjLCAweDgyZGEsIDB4MjAxMSwgMHg3MDY5LCAweDA4MGMsIDB4ODNhZSwgMHgwMDJlLAorCTB4MjA2OSwgMHgwMTQwLCAweDYwZTMsIDB4MDAwMCwgMHg3MGIwLCAweDkwMDUsIDB4MTExOCwgMHg2ODg3LAorCTB4MDAwMSwgMHgwMDA4LCAweDY4ODYsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4MjdlMiwgMHg2MGUyLAorCTB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4YzFiNCwgMHgyMTAyLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDAwYzYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHhjNTMyLCAweDE5MDQsIDB4NzRmMiwgMHg3MTMwLCAweGQxODQsIDB4MTE3MCwgMHgwODBjLAorCTB4MzJlNCwgMHgwMTM4LCAweGMxOGQsIDB4NzEzMiwgMHgyMDExLCAweDE4NWMsIDB4MjIxNCwgMHhkMmFjLAorCTB4MTEyMCwgMHg3MDMwLCAweGQwOGMsIDB4MDkwNCwgMHg3NGYyLCAweDIwMTEsIDB4MTg1YywgMHgyMjBjLAorCTB4MDQzOCwgMHgwMDE2LCAweDIwMTksIDB4MDAwZSwgMHgwODBjLCAweGQ4MDEsIDB4MDE1NiwgMHgwMGI2LAorCTB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4OTE4NiwgMHgwMDdlLCAweDAxYTAsIDB4OTE4NiwgMHgwMDgwLAorCTB4MDE4OCwgMHgwODBjLCAweDY0OWYsIDB4MTE3MCwgMHgyMTIwLCAweDkwMDYsIDB4MDAxNiwgMHgyMDA5LAorCTB4MDAwZSwgMHgwODBjLCAweGQ4ODUsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDEwMCwgMHgwODBjLAorCTB4ODRkMSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg3NGJiLCAweDAwYmUsIDB4MDE1ZSwgMHgwMDFlLAorCTB4ZDFhYywgMHgxMTQ4LCAweDAwMTYsIDB4MjAwOSwgMHgwMDAyLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLAorCTB4MzE1NiwgMHgwMDFlLCAweDAwNzgsIDB4MDE1NiwgMHgwMGI2LCAweDIwYTksIDB4MDA3ZiwgMHg5MDBlLAorCTB4MDgwYywgMHg2NDlmLCAweDExMTAsIDB4MDgwYywgMHg1ZjQ1LCAweDgxMDgsIDB4MWYwNCwgMHg3NGU4LAorCTB4MDBiZSwgMHgwMTVlLCAweDA4MGMsIDB4MWEyNCwgMHgwODBjLCAweGEwNjksIDB4NjBlMywgMHgwMDAwLAorCTB4MDgwYywgMHg1ZjJiLCAweDA4MGMsIDB4NzEyNywgMHgwMGVlLCAweDAwY2UsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4MDAwNSwgMHgyMDAxLCAweDE5NTUsIDB4MjAwMywgMHgwMDAxLAorCTB4MDAwNSwgMHgyMDAxLCAweDE5NTUsIDB4MjAwMywgMHgwMDAwLCAweDAwMDUsIDB4MjAwMSwgMHgxOTU0LAorCTB4MjAwMywgMHhhYWFhLCAweDAwMDUsIDB4MjAwMSwgMHgxOTU0LCAweDIwMDMsIDB4MDAwMCwgMHgwMDA1LAorCTB4MjA3MSwgMHgxOGY4LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxMDRhLAorCTB4MDkwYywgMHgwZGZhLCAweGE4YWIsIDB4ZGNiMCwgMHgyOTAwLCAweDcwNGUsIDB4MDgwYywgMHgxMDRhLAorCTB4MDkwYywgMHgwZGZhLCAweGE4YWIsIDB4ZGNiMCwgMHgyOTAwLCAweDcwNTIsIDB4YTg2NywgMHgwMDAwLAorCTB4YTg2YiwgMHgwMDAxLCAweGE4OWYsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgwMDQwLAorCTB4Njg0OCwgMHg5MDA1LCAweDExMTgsIDB4OTA4NSwgMHgwMDAxLCAweDA0YjAsIDB4Njg0MCwgMHg5MDA1LAorCTB4MDE1MCwgMHgwNGExLCAweDZhNTAsIDB4OTIwMCwgMHg3MDAyLCAweDY4NTQsIDB4OTEwMSwgMHg3MDA2LAorCTB4OTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4Njg1MCwgMHg3MDAyLCAweDY4NTQsIDB4NzAwNiwgMHg2ODU4LAorCTB4NzAwYSwgMHg2ODVjLCAweDcwMGUsIDB4Njg0MCwgMHg5MDA1LCAweDExMTAsIDB4NzAxMiwgMHg3MDE2LAorCTB4Njg0OCwgMHg3MDFhLCAweDcwMWMsIDB4OTA4NSwgMHgwMDQwLCAweDcwMWUsIDB4MjAwMSwgMHgwMDE5LAorCTB4NzAzNiwgMHg3MDJiLCAweDAwMDEsIDB4MjAwMSwgMHgwMDA0LCAweDIwMGMsIDB4OTE4YywgMHhmZmY3LAorCTB4OTE4ZCwgMHg4MDAwLCAweDIxMDIsIDB4MDBkNiwgMHgyMDY5LCAweDE4ZjgsIDB4NjgwNywgMHgwMDAxLAorCTB4MDBkZSwgMHgwODBjLCAweDdhZmQsIDB4OTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4OTAwZSwgMHgwMTU2LAorCTB4MjBhOSwgMHgwMDA2LCAweDgwMDMsIDB4ODE4ZCwgMHgxZjA0LCAweDc1N2EsIDB4MDE1ZSwgMHgwMDA1LAorCTB4MjA3OSwgMHgwMDQwLCAweDIwNzEsIDB4MThmOCwgMHg3MDA0LCAweDAwMDIsIDB4NzU5MCwgMHg3NTkxLAorCTB4NzVjOSwgMHg3NjI0LCAweDc3NjUsIDB4NzU4ZSwgMHg3NThlLCAweDc3OGYsIDB4MDgwYywgMHgwZGZhLAorCTB4MDAwNSwgMHgyMDc5LCAweDAwNDAsIDB4NzgyYywgMHg5MDhjLCAweDA3ODAsIDB4MTkwYywgMHg3Yjg5LAorCTB4ZDBhNCwgMHgwMWY4LCAweDc4MjQsIDB4MjA0OCwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHhhODY0LAorCTB4OTA4NCwgMHgwMGZmLCAweDkwOGEsIDB4MDA0MCwgMHgwNjEwLCAweDAwYzAsIDB4MjAwMSwgMHgxODAwLAorCTB4MjAwYywgMHg5MTg2LCAweDAwMDMsIDB4MTE2OCwgMHg3MDA0LCAweDAwMDIsIDB4NzViOSwgMHg3NTkzLAorCTB4NzViOSwgMHg3NWI3LCAweDc1YjksIDB4NzViOSwgMHg3NWI5LCAweDc1YjksIDB4NzViOSwgMHgwODBjLAorCTB4NzYyNCwgMHg3ODJjLCAweGQwOWMsIDB4MDkwYywgMHg3YWZkLCAweDAwMDUsIDB4OTA4MiwgMHgwMDVhLAorCTB4MTIxOCwgMHgyMTAwLCAweDAwM2IsIDB4MGMxMCwgMHgwODBjLCAweDc2NWEsIDB4MGM5MCwgMHgwMGUzLAorCTB4MDhlOCwgMHgwMDA1LCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2N2MsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY2NiwgMHg3NjVhLAorCTB4Nzg2NCwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjdjLCAweDc2NWEsIDB4NzY2NiwgMHg3OGE1LAorCTB4NzhlNiwgMHg3OTJkLCAweDc5NDEsIDB4NzY1YSwgMHg3NjVhLCAweDc2N2MsIDB4NzY2NiwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NzM5LCAweDc5ZWMsIDB4N2EwNywgMHg3NjVhLCAweDc2N2MsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc3MmYsIDB4N2EwNywgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2OTAsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3YjJkLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHg3NjVhLCAweDc2YTQsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjVhLCAweDc2NWEsIDB4NzY1YSwgMHgyMDc5LCAweDAwNDAsIDB4NzAwNCwgMHg5MDg2LAorCTB4MDAwMywgMHgxMTk4LCAweDc4MmMsIDB4MDgwYywgMHg3YjI2LCAweGQwYTQsIDB4MDE3MCwgMHg3ODI0LAorCTB4MjA0OCwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDhhLAorCTB4MDAxYSwgMHgxMjEwLCAweDAwMmIsIDB4MGM1MCwgMHgwMGU5LCAweDA4MGMsIDB4N2FmZCwgMHgwMDA1LAorCTB4NzY1YSwgMHg3NjY2LCAweDc4NTAsIDB4NzY1YSwgMHg3NjY2LCAweDc2NWEsIDB4NzY2NiwgMHg3NjY2LAorCTB4NzY1YSwgMHg3NjY2LCAweDc4NTAsIDB4NzY2NiwgMHg3NjY2LCAweDc2NjYsIDB4NzY2NiwgMHg3NjY2LAorCTB4NzY1YSwgMHg3NjY2LCAweDc4NTAsIDB4NzY1YSwgMHg3NjVhLCAweDc2NjYsIDB4NzY1YSwgMHg3NjVhLAorCTB4NzY1YSwgMHg3NjY2LCAweDAwZTYsIDB4MjA3MSwgMHgxOGY4LCAweDIwMDksIDB4MDQwMCwgMHgwMDcxLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwMDksIDB4MTAwMCwgMHgwMDQ5LCAweDAwMDUsIDB4MjAwOSwgMHgyMDAwLAorCTB4MDAyOSwgMHgwMDA1LCAweDIwMDksIDB4MDgwMCwgMHgwMDA5LCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLAorCTB4YTg2OCwgMHg5MDg0LCAweDAwZmYsIDB4OTEwNSwgMHhhODZhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLAorCTB4MGQwOCwgMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4NzgwZSwgMHg3MDA3LAorCTB4MDAwMywgMHg3MDEyLCAweDI5MDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4NzgwZSwgMHgwMDA1LAorCTB4YTg2NCwgMHg4MDA3LCAweDkwODQsIDB4MDBmZiwgMHgwOTY4LCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LAorCTB4MDAwMSwgMHgwODA0LCAweDc4MjksIDB4NzAwNywgMHgwMDAzLCAweDcwMTIsIDB4MjkwMCwgMHg3MDE2LAorCTB4NzAxYSwgMHg3MDRiLCAweDc4MjksIDB4MDAwNSwgMHhhODY0LCAweDgwMDcsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4NzY2MiwgMHg3MDA3LCAweDAwMDEsIDB4MjAwOSwgMHgxODMzLAorCTB4MjEwYywgMHg4MWZmLCAweDE5MDQsIDB4NzcwNiwgMHhhOTk0LCAweDkxODYsIDB4MDA2ZiwgMHgwMTg4LAorCTB4OTE4NiwgMHgwMDc0LCAweDE1YjAsIDB4MDAyNiwgMHgyMDExLCAweDAwMTAsIDB4MDgwYywgMHg2N2U3LAorCTB4MDAyZSwgMHgwNTc4LCAweDAwMTYsIDB4YTk5OCwgMHgwODBjLCAweDY4MzEsIDB4MDAxZSwgMHgxNTQ4LAorCTB4MDQwMCwgMHgwODBjLCAweDcyMDcsIDB4MDE0MCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwgMHgwMDE2LAorCTB4MjAwMSwgMHgwMDMwLCAweDkwMGUsIDB4MDQzOCwgMHgwMDI2LCAweDIwMTEsIDB4ODAwOCwgMHgwODBjLAorCTB4NjdlNywgMHgwMDJlLCAweDAxYjAsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4YTk5OCwgMHhhYWEwLAorCTB4YWI5YywgMHg5MThkLCAweDgwMDAsIDB4MDgwYywgMHg2ODMxLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MTE0MCwgMHhhODk3LCAweDQwMDUsIDB4YTg5YiwgMHg0MDA5LCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLAorCTB4MDA1MCwgMHhhODY4LCAweDkwODQsIDB4MDBmZiwgMHhhODZhLCAweGE4ODMsIDB4MDAwMCwgMHgwODBjLAorCTB4NjE1ZCwgMHgxMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg2NywgMHgwMTM5LAorCTB4YTg3YSwgMHhhOTgyLCAweDA4MGMsIDB4NmFlOSwgMHgwMTJlLCAweDBjYTAsIDB4YTk5NCwgMHg5MTg2LAorCTB4MDA3MSwgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwgMHgwMDY0LCAweDA5MDQsIDB4NzZiNCwgMHg5MTg2LAorCTB4MDA3YywgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwgMHgwMDI4LCAweDA5MDQsIDB4NzZiNCwgMHg5MTg2LAorCTB4MDAzOCwgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwgMHgwMDc4LCAweDA5MDQsIDB4NzZiNCwgMHg5MTg2LAorCTB4MDA1ZiwgMHgwOTA0LCAweDc2YjQsIDB4OTE4NiwgMHgwMDU2LCAweDA5MDQsIDB4NzZiNCwgMHhhODk3LAorCTB4NDAwNSwgMHhhODliLCAweDAwMDEsIDB4MjAwMSwgMHgwMDMwLCAweDkwMGUsIDB4MDg2MCwgMHhhODdjLAorCTB4OTA4NCwgMHgwMGMwLCAweDkwODYsIDB4MDBjMCwgMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LAorCTB4N2ExZSwgMHgyOTAwLCAweDcwMTYsIDB4NzAxYSwgMHgyMGE5LCAweDAwMDQsIDB4YTg2MCwgMHgyMGUwLAorCTB4YTg1YywgMHg5MDgwLCAweDAwMzAsIDB4MjA5OCwgMHg3MDUwLCAweDIwNDAsIDB4YTA2MCwgMHgyMGU4LAorCTB4YTA1YywgMHg5MDgwLCAweDAwMjMsIDB4MjBhMCwgMHg0MDAzLCAweGE4ODgsIDB4NzAxMiwgMHg5MDgyLAorCTB4MDQwMSwgMHgxYTA0LCAweDc2NmEsIDB4YWFiNCwgMHg5MjhhLCAweDAwMDIsIDB4MWEwNCwgMHg3NjZhLAorCTB4ODJmZiwgMHgxMTM4LCAweGE4YjgsIDB4YTliYywgMHg5MTA1LCAweDAxMTgsIDB4MjAwMSwgMHg3N2NjLAorCTB4MDAxOCwgMHg5MjgwLCAweDc3YzIsIDB4MjAwNSwgMHg3MDU2LCAweDcwMTAsIDB4OTAxNSwgMHgwOTA0LAorCTB4NzdhZCwgMHgwODBjLCAweDEwNGEsIDB4MTExOCwgMHg3MDA3LCAweDAwMDQsIDB4MDAwNSwgMHgyOTAwLAorCTB4NzAyMiwgMHg3MDU0LCAweDIwNjAsIDB4ZTAwMCwgMHhhODY2LCAweDcwNTAsIDB4MjA0MCwgMHhhOTVjLAorCTB4ZTAwNCwgMHg5MTAwLCAweGEwNzYsIDB4YTg2MCwgMHhhMDcyLCAweGUwMDgsIDB4OTIwYSwgMHgxMjEwLAorCTB4OTAwZSwgMHgyMjAwLCAweDcxMTIsIDB4ZTIwYywgMHg4MDAzLCAweDgwMGIsIDB4OTI5NiwgMHgwMDA0LAorCTB4MDEwOCwgMHg5MTA4LCAweGExN2EsIDB4ODEwYiwgMHhhMTdlLCAweDA4MGMsIDB4MTEyZSwgMHhhMDZjLAorCTB4OTA4ZSwgMHgwMTAwLCAweDAxNzAsIDB4OTA4NiwgMHgwMjAwLCAweDAxMTgsIDB4NzAwNywgMHgwMDA3LAorCTB4MDAwNSwgMHg3MDIwLCAweDIwNDgsIDB4MDgwYywgMHgxMDYzLCAweDcwMTQsIDB4MjA0OCwgMHgwODA0LAorCTB4NzY2YSwgMHg3MDIwLCAweDIwNDgsIDB4NzAxOCwgMHhhODAyLCAweGE4MDcsIDB4MDAwMCwgMHgyOTA4LAorCTB4MjA0OCwgMHhhOTA2LCAweDcxMWEsIDB4MDgwNCwgMHg3NzY1LCAweDcwMTQsIDB4MjA0OCwgMHg3MDA3LAorCTB4MDAwMSwgMHhhOGI0LCAweDkwMDUsIDB4MTEyOCwgMHhhOGI4LCAweGE5YmMsIDB4OTEwNSwgMHgwMTA4LAorCTB4MDBiOSwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LCAweDAwMWUsIDB4MDkwNCwgMHg3YTFlLAorCTB4MDgwNCwgMHg3ODBlLCAweDc3YzQsIDB4NzdjOCwgMHgwMDAyLCAweDAwMWQsIDB4MDAwNywgMHgwMDA0LAorCTB4MDAwYSwgMHgwMDFiLCAweDAwMDUsIDB4MDAwNiwgMHgwMDBhLCAweDAwMWQsIDB4MDAwNSwgMHgwMDA0LAorCTB4MDA3NiwgMHgwMDY2LCAweGFmYjgsIDB4YWViYywgMHhhODA0LCAweDIwNTAsIDB4YjBjMCwgMHhiMGUyLAorCTB4YjBiYywgMHhiMGRlLCAweGIwYjgsIDB4YjBkMiwgMHhiMGI0LCAweGIwY2UsIDB4YjZkYSwgMHhiN2Q2LAorCTB4YjBiMCwgMHhiMGNhLCAweGIwYWMsIDB4YjBjNiwgMHhiMGE4LCAweGIwYmEsIDB4YjBhNCwgMHhiMGI2LAorCTB4YjZjMiwgMHhiN2JlLCAweGIwYTAsIDB4YjBiMiwgMHhiMDljLCAweGIwYWUsIDB4YjA5OCwgMHhiMGEyLAorCTB4YjA5NCwgMHhiMDllLCAweGI2YWEsIDB4YjdhNiwgMHhiMDkwLCAweGIwOWEsIDB4YjA4YywgMHhiMDk2LAorCTB4YjA4OCwgMHhiMDhhLCAweGIwODQsIDB4YjA4NiwgMHhiNjkyLCAweGI3OGUsIDB4YjA4MCwgMHhiMDgyLAorCTB4YjA3YywgMHhiMDdlLCAweGIwNzgsIDB4YjA3MiwgMHhiMDc0LCAweGIwNmUsIDB4YjY3YSwgMHhiNzc2LAorCTB4YjAwNCwgMHg5MDU1LCAweDE5NTgsIDB4MDA2ZSwgMHgwMDdlLCAweDAwMDUsIDB4MjAwOSwgMHgxODMzLAorCTB4MjEwYywgMHg4MWZmLCAweDExNzgsIDB4MDgwYywgMHg1ZmE3LCAweDExMDgsIDB4MDAwNSwgMHgwODBjLAorCTB4NmQxNywgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGMxMmQsIDB4MDgwYywgMHg2YWU5LAorCTB4MDEyZSwgMHgwY2EwLCAweDA4MGMsIDB4YzUzMiwgMHgxZDcwLCAweDIwMDEsIDB4MDAyOCwgMHg5MDBlLAorCTB4MGM3MCwgMHgyMDA5LCAweDE4MzMsIDB4MjEwYywgMHg4MWZmLCAweDExZDgsIDB4YTg4OCwgMHg5MDA1LAorCTB4MDFlMCwgMHhhODgzLCAweDAwMDAsIDB4YTg3YywgMHhkMGY0LCAweDAxMjAsIDB4MDgwYywgMHg2MGJmLAorCTB4MTEzOCwgMHgwMDA1LCAweDkwMDYsIDB4YTg3YSwgMHgwODBjLCAweDYwMzcsIDB4MTEwOCwgMHgwMDA1LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4YTg3YSwgMHhhOTgyLCAweDA4MGMsIDB4NmFlOSwgMHgwMTJlLAorCTB4MGNiMCwgMHgyMDAxLCAweDAwMjgsIDB4OTAwZSwgMHgwYzk4LCAweDIwMDEsIDB4MDAwMCwgMHgwYzgwLAorCTB4NzAxOCwgMHhhODAyLCAweDI5MDgsIDB4MjA0OCwgMHhhOTA2LCAweDcxMWEsIDB4NzAxMCwgMHg4MDAxLAorCTB4NzAxMiwgMHgwMTE4LCAweDcwMDcsIDB4MDAwMywgMHgwMDMwLCAweDcwMTQsIDB4MjA0OCwgMHg3MDA3LAorCTB4MDAwMSwgMHg3MDQ4LCAweDA4MGYsIDB4MDAwNSwgMHgwMGI2LCAweDcwMDcsIDB4MDAwMSwgMHhhOTc0LAorCTB4YTg3OCwgMHg5MDg0LCAweDAwZmYsIDB4OTA5NiwgMHgwMDA0LCAweDA1NDAsIDB4MjBhOSwgMHgwMDAxLAorCTB4OTA5NiwgMHgwMDAxLCAweDAxOTAsIDB4OTAwZSwgMHgyMGE5LCAweDA4MDAsIDB4OTA5NiwgMHgwMDAyLAorCTB4MDE2MCwgMHg5MDA1LCAweDExZDgsIDB4YTk3NCwgMHgwODBjLCAweDY0OWYsIDB4MTFiOCwgMHgwMDY2LAorCTB4YWU4MCwgMHgwODBjLCAweDY1YWYsIDB4MDA2ZSwgMHgwMDg4LCAweDAwNDYsIDB4MjAxMSwgMHgxODBjLAorCTB4MjIyNCwgMHhjNDg0LCAweDI0MTIsIDB4MDA0ZSwgMHgwMGM2LCAweDA4MGMsIDB4NjQ5ZiwgMHgxMTEwLAorCTB4MDgwYywgMHg2NmFmLCAweDgxMDgsIDB4MWYwNCwgMHg3ODhkLCAweDAwY2UsIDB4YTg3YywgMHhkMDg0LAorCTB4MTEyMCwgMHgwODBjLCAweDEwNjMsIDB4MDBiZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDBiZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzAwNywgMHgwMDAxLCAweDA4MGMsIDB4NjdiZiwgMHgwNTgwLCAweDIwNjEsIDB4MWE0OCwgMHg2MTAwLAorCTB4ZDE4NCwgMHgwMTc4LCAweGE4ODgsIDB4OTA4NCwgMHgwMGZmLCAweDE1NTAsIDB4NjAwMCwgMHhkMDg0LAorCTB4MDUyMCwgMHg2MDA0LCAweDkwMDUsIDB4MTUzOCwgMHg2MDAzLCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLAorCTB4MDBjOCwgMHgyMDExLCAweDAwMDEsIDB4YTg5MCwgMHg5MDA1LCAweDExMTAsIDB4MjAwMSwgMHgwMDFlLAorCTB4ODAwMCwgMHg2MDE2LCAweGE4ODgsIDB4OTA4NCwgMHgwMGZmLCAweDAxNzgsIDB4NjAwNiwgMHhhODg4LAorCTB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDE0OCwgMHg2MDBhLCAweGE4ODgsIDB4ODAwMCwgMHgxMTA4LAorCTB4YzI4ZCwgMHg2MjAyLCAweDAxMmUsIDB4MDgwNCwgMHg3YWU3LCAweDAxMmUsIDB4MDgwNCwgMHg3YWUxLAorCTB4MDEyZSwgMHgwODA0LCAweDdhZGIsIDB4MDEyZSwgMHgwODA0LCAweDdhZGUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4MDgwYywgMHg2N2JmLCAweDA1ZTAsIDB4MjA2MSwgMHgxYTQ4LAorCTB4NjAwMCwgMHhkMDg0LCAweDA1YjgsIDB4NjIwNCwgMHg2MzA4LCAweGQwOGMsIDB4MTUzMCwgMHhhYzc4LAorCTB4OTQ4NCwgMHgwMDAzLCAweDAxNzAsIDB4YTk4OCwgMHg5MThjLCAweDAwZmYsIDB4ODAwMSwgMHgxMTIwLAorCTB4MjEwMCwgMHg5MjEwLCAweDA2MjAsIDB4MDAyOCwgMHg4MDAxLCAweDE1MDgsIDB4MjEwMCwgMHg5MjEyLAorCTB4MDJmMCwgMHg5NDg0LCAweDAwMGMsIDB4MDE4OCwgMHhhOTg4LCAweDgxMGYsIDB4OTE4YywgMHgwMGZmLAorCTB4OTA4MiwgMHgwMDA0LCAweDExMjAsIDB4MjEwMCwgMHg5MzE4LCAweDAyODgsIDB4MDAzMCwgMHg5MDgyLAorCTB4MDAwNCwgMHgxMTY4LCAweDIxMDAsIDB4OTMxYSwgMHgwMjUwLCAweGE4OTAsIDB4OTAwNSwgMHgwMTEwLAorCTB4ODAwMCwgMHg2MDE2LCAweDYyMDYsIDB4NjMwYSwgMHgwMTJlLCAweDA4MDQsIDB4N2FlNywgMHgwMTJlLAorCTB4MDgwNCwgMHg3YWU0LCAweDAxMmUsIDB4MDgwNCwgMHg3YWUxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NzAwNywgMHgwMDAxLCAweDIwNjEsIDB4MWE0OCwgMHg2MzAwLCAweGQzOGMsIDB4MTEyMCwgMHg2MzA4LAorCTB4ODMxOCwgMHgwMjIwLCAweDYzMGEsIDB4MDEyZSwgMHgwODA0LCAweDdhZjUsIDB4MDEyZSwgMHgwODA0LAorCTB4N2FlNCwgMHgwMGI2LCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLAorCTB4YTg3YywgMHhkMGFjLCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLCAweDFhNDgsIDB4NjAwMCwgMHg5MDg0LAorCTB4ZmNmZiwgMHg2MDAyLCAweDAwY2UsIDB4MDQ0MCwgMHhhODg4LCAweDkwMDUsIDB4MDVkOCwgMHhhODhjLAorCTB4OTA2NSwgMHgwNTk4LCAweDIwMDEsIDB4MTgzMywgMHgyMDA0LCAweDkwMDUsIDB4MDExOCwgMHgwODBjLAorCTB4YTExMywgMHgwMDY4LCAweDYwMTcsIDB4ZjQwMCwgMHg2MDViLCAweDAwMDAsIDB4YTk3YywgMHhkMWE0LAorCTB4MDExMCwgMHhhOTgwLCAweDYxNWEsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsIDB4YTE1ZCwgMHhhOTg4LAorCTB4OTE4YywgMHhmZjAwLCAweDkxODYsIDB4MjAwMCwgMHgxMTM4LCAweDAwMjYsIDB4OTAwZSwgMHgyMDExLAorCTB4ZmRmZiwgMHgwODBjLCAweDg0ZDEsIDB4MDAyZSwgMHhhODdjLCAweGQwYzQsIDB4MDE0OCwgMHgyMDYxLAorCTB4MWE0OCwgMHg2MDAwLCAweGQwOGMsIDB4MTEyMCwgMHg2MDA4LCAweDgwMDAsIDB4MDIwOCwgMHg2MDBhLAorCTB4MDBjZSwgMHgwMTJlLCAweDAwYmUsIDB4MDgwNCwgMHg3YWU3LCAweDAwY2UsIDB4MDEyZSwgMHgwMGJlLAorCTB4MDgwNCwgMHg3YWUxLCAweGE5ODQsIDB4OTE4NiwgMHgwMDJlLCAweDBkMzAsIDB4OTE4NiwgMHgwMDJkLAorCTB4MGQxOCwgMHg5MTg2LCAweDAwNDUsIDB4MDUxMCwgMHg5MTg2LCAweDAwMmEsIDB4MTEzMCwgMHgyMDAxLAorCTB4MTgwYywgMHgyMDBjLCAweGMxOTQsIDB4MjEwMiwgMHgwOGI4LCAweDkxODYsIDB4MDAyMCwgMHgwMTU4LAorCTB4OTE4NiwgMHgwMDI5LCAweDFkMTAsIDB4YTk3NCwgMHgwODBjLCAweDY0OWYsIDB4MTk2OCwgMHhiODAwLAorCTB4YzBlNCwgMHhiODAyLCAweDA4NDgsIDB4YTg4YywgMHg5MDY1LCAweDA5YjgsIDB4NjAwNywgMHgwMDI0LAorCTB4MjAwMSwgMHgxOTVlLCAweDIwMDQsIDB4NjAxYSwgMHgwODA0LCAweDc5N2MsIDB4YTg4YywgMHg5MDY1LAorCTB4MDk2MCwgMHgwMGU2LCAweGE4OTAsIDB4OTA3NSwgMHgyMDAxLCAweDE4MzMsIDB4MjAwNCwgMHg5MDA1LAorCTB4MDE1MCwgMHgwODBjLCAweGExMTMsIDB4OGVmZiwgMHgwMTE4LCAweDJlNjAsIDB4MDgwYywgMHhhMTEzLAorCTB4MDBlZSwgMHgwODA0LCAweDc5N2MsIDB4NjAyNCwgMHhjMGRjLCAweGMwZDUsIDB4NjAyNiwgMHgyZTYwLAorCTB4NjAwNywgMHgwMDNhLCAweGE4YTAsIDB4OTAwNSwgMHgwMTMwLCAweDYwMDcsIDB4MDAzYiwgMHhhOGE0LAorCTB4NjAyZSwgMHhhOGE4LCAweDYwMTYsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLAorCTB4OGMxMCwgMHgwMGVlLCAweDA4MDQsIDB4Nzk3YywgMHgyMDYxLCAweDFhNDgsIDB4NjAwMCwgMHhkMDg0LAorCTB4MDE5MCwgMHhkMDhjLCAweDE5MDQsIDB4N2FmNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjA0LAorCTB4ODIxMCwgMHgwMjIwLCAweDYyMDYsIDB4MDEyZSwgMHgwODA0LCAweDdhZjUsIDB4MDEyZSwgMHhhODgzLAorCTB4MDAxNiwgMHgwODA0LCAweDdhZWUsIDB4YTg4MywgMHgwMDA3LCAweDA4MDQsIDB4N2FlZSwgMHhhODY0LAorCTB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4MDEzMCwgMHg4MDAxLCAweDExMzgsIDB4NzAwNywgMHgwMDAxLAorCTB4MDA2OSwgMHgwMDA1LCAweDA4MGMsIDB4NzY2MiwgMHgwMDQwLCAweDcwMDcsIDB4MDAwMywgMHg3MDEyLAorCTB4MjkwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg3YTFlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTAzZSwgMHgyMDYxLCAweDE4MDAsIDB4NjFjYywgMHg4MWZmLAorCTB4MTkwNCwgMHg3YWEwLCAweDYxMzAsIDB4ZDE5NCwgMHgxOTA0LCAweDdhY2EsIDB4YTg3OCwgMHgyMDcwLAorCTB4OWU4MiwgMHgxY2QwLCAweDBhMDQsIDB4N2E5NCwgMHg2MDY0LCAweDllMDIsIDB4MWEwNCwgMHg3YTk0LAorCTB4NzEyMCwgMHg5MTg2LCAweDAwMDYsIDB4MTkwNCwgMHg3YTg2LCAweDcwMTAsIDB4OTA1ZCwgMHgwOTA0LAorCTB4N2FhMCwgMHhiODAwLCAweGQwZTQsIDB4MTkwNCwgMHg3YWM0LCAweDIwNjEsIDB4MWE0OCwgMHg2MTAwLAorCTB4OTE4NCwgMHgwMzAxLCAweDkwODYsIDB4MDAwMSwgMHgxNWEwLCAweDcwMjQsIDB4ZDBkYywgMHgxOTA0LAorCTB4N2FjZCwgMHhhODgzLCAweDAwMDAsIDB4YTgwMywgMHgwMDAwLCAweDI5MDgsIDB4NzAxNCwgMHg5MDA1LAorCTB4MTE5OCwgMHg3MTE2LCAweGE4N2MsIDB4ZDBmNCwgMHgxOTA0LCAweDdhZDAsIDB4MDgwYywgMHg1NWRiLAorCTB4ZDA5YywgMHgxMTE4LCAweGE4N2MsIDB4YzBjYywgMHhhODdlLCAweDJlNjAsIDB4MDgwYywgMHg4M2YxLAorCTB4MDEyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDQ4LCAweGE4MDAsIDB4OTAwNSwgMHgxZGUwLAorCTB4YTkwMiwgMHgyMTQ4LCAweGE4N2MsIDB4ZDBmNCwgMHgxOTA0LCAweDdhZDAsIDB4MDEyZSwgMHgwMGVlLAorCTB4MDBiZSwgMHgwMDA1LCAweDAxMmUsIDB4MDBlZSwgMHhhODgzLCAweDAwMDYsIDB4MDBiZSwgMHgwODA0LAorCTB4N2FlZSwgMHhkMTg0LCAweDBkYjgsIDB4ZDFjNCwgMHgxMTkwLCAweDAwYTAsIDB4YTk3NCwgMHgwODBjLAorCTB4NjQ5ZiwgMHgxNWQwLCAweGI4MDAsIDB4ZDBlNCwgMHgxNWI4LCAweDcxMjAsIDB4OTE4NiwgMHgwMDA3LAorCTB4MTExOCwgMHhhODgzLCAweDAwMDIsIDB4MDQ5MCwgMHhhODgzLCAweDAwMDgsIDB4MDQ3OCwgMHhhODgzLAorCTB4MDAwZSwgMHgwNDYwLCAweGE4ODMsIDB4MDAxNywgMHgwNDQ4LCAweGE4ODMsIDB4MDAzNSwgMHgwNDMwLAorCTB4MDgwYywgMHg1NWRmLCAweGQwZmMsIDB4MDFlOCwgMHhhODc4LCAweDIwNzAsIDB4OWU4MiwgMHgxY2QwLAorCTB4MDJjMCwgMHg2MDY0LCAweDllMDIsIDB4MTJhOCwgMHg3MTIwLCAweDkxODYsIDB4MDAwNiwgMHgxMTg4LAorCTB4NzAxMCwgMHg5MDVkLCAweDAxNzAsIDB4YjgwMCwgMHhkMGJjLCAweDAxNTgsIDB4MjAzOSwgMHgwMDAxLAorCTB4NzAwMCwgMHg5MDg2LCAweDAwMDcsIDB4MTkwNCwgMHg3YTJhLCAweDcwMDMsIDB4MDAwMiwgMHgwODA0LAorCTB4N2EyYSwgMHhhODgzLCAweDAwMjgsIDB4MDAxMCwgMHhhODgzLCAweDAwMjksIDB4MDEyZSwgMHgwMGVlLAorCTB4MDBiZSwgMHgwNDIwLCAweGE4ODMsIDB4MDAyYSwgMHgwY2M4LCAweGE4ODMsIDB4MDA0NSwgMHgwY2IwLAorCTB4MmU2MCwgMHgyMDE5LCAweDAwMDIsIDB4NjAxYiwgMHgwMDE0LCAweDA4MGMsIDB4ZDQ0MCwgMHgwMTJlLAorCTB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4MjAwOSwgMHgwMDNlLCAweDAwNTgsIDB4MjAwOSwgMHgwMDA0LAorCTB4MDA0MCwgMHgyMDA5LCAweDAwMDYsIDB4MDAyOCwgMHgyMDA5LCAweDAwMTYsIDB4MDAxMCwgMHgyMDA5LAorCTB4MDAwMSwgMHhhODg0LCAweDkwODQsIDB4ZmYwMCwgMHg5MTA1LCAweGE4ODYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZhZTksIDB4MDEyZSwgMHgwMDA1LCAweDA4MGMsIDB4MTA2MywgMHgwMDA1LAorCTB4MDBkNiwgMHgwODBjLCAweDgzZTgsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDA0MCwgMHg3MDJjLCAweGQwODQsIDB4MDFkOCwgMHg5MDhjLAorCTB4MDc4MCwgMHgxOTBjLCAweDdiODksIDB4ZDA5YywgMHgxMWE4LCAweDIwNzEsIDB4MTgwMCwgMHg3MGJjLAorCTB4OTBlYSwgMHgwMDQwLCAweDAyNzgsIDB4ODAwMSwgMHg3MGJlLCAweDcwMmMsIDB4MjA0OCwgMHhhODAwLAorCTB4NzAyZSwgMHg5MDA2LCAweGE4MDIsIDB4YTgwNiwgMHgyMDcxLCAweDAwNDAsIDB4MjkwMCwgMHg3MDIyLAorCTB4NzAyYywgMHgwYzI4LCAweDAxMmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAwNiwgMHg5MDg0LAorCTB4MDc4MCwgMHgxOTBjLCAweDdiODksIDB4MDAwZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwMDM2LAorCTB4MDAyNiwgMHgwMDE2LCAweDAwYjYsIDB4NzAwNywgMHgwMDAxLCAweGFhNzQsIDB4OTI4MiwgMHgwMDA0LAorCTB4MWEwNCwgMHg3YjdhLCAweGE5N2MsIDB4OTE4OCwgMHgxMDAwLCAweDIxMDQsIDB4OTA1ZCwgMHhiODA0LAorCTB4ZDI4NCwgMHgwMTQwLCAweDA1ZTgsIDB4ODAwNywgMHg5MDg0LCAweDAwZmYsIDB4OTA4NCwgMHgwMDA2LAorCTB4MTEwOCwgMHgwNGIwLCAweDJiMTAsIDB4MDgwYywgMHhhMDhkLCAweDExMTgsIDB4MDgwYywgMHhhMTMwLAorCTB4MDVhOCwgMHg2MjEyLCAweGE4NzQsIDB4MDAwMiwgMHg3YjU4LCAweDdiNWQsIDB4N2I2MCwgMHg3YjY2LAorCTB4MjAxOSwgMHgwMDAyLCAweDA4MGMsIDB4ZDgwMSwgMHgwMDYwLCAweDA4MGMsIDB4ZDc5ZCwgMHgwMDQ4LAorCTB4MjAxOSwgMHgwMDAyLCAweGE5ODAsIDB4MDgwYywgMHhkN2I4LCAweDAwMTgsIDB4YTk4MCwgMHgwODBjLAorCTB4ZDc5ZCwgMHgwODBjLCAweGEwZTMsIDB4YTg4NywgMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDBiZSwgMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDA1LCAweGE4ODcsIDB4MDAwNiwgMHgwYzgwLCAweGE4ODcsIDB4MDAwMiwgMHgwYzY4LAorCTB4YTg4NywgMHgwMDA1LCAweDBjNTAsIDB4YTg4NywgMHgwMDA0LCAweDBjMzgsIDB4YTg4NywgMHgwMDA3LAorCTB4MGMyMCwgMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg3YjhiLCAweDAwMDYsIDB4MDAxNiwgMHgyMDAxLAorCTB4ODAwMywgMHgwMDA2LCAweDA4MDQsIDB4MGUwMywgMHgyMDAxLCAweDE4MzMsIDB4MjAwNCwgMHg5MDA1LAorCTB4MDAwNSwgMHgwMDA1LCAweDAwZjYsIDB4MjA3OSwgMHgwMzAwLCAweDIwMDEsIDB4MDIwMCwgMHgyMDBjLAorCTB4YzFlNSwgMHhjMWRjLCAweDIxMDIsIDB4MjAwOSwgMHgwMjE4LCAweDIxMGMsIDB4ZDFlYywgMHgxMTIwLAorCTB4MDgwYywgMHgxNTFhLCAweDAwZmUsIDB4MDAwNSwgMHgyMDAxLCAweDAyMGQsIDB4MjAwMywgMHgwMDIwLAorCTB4NzgxZiwgMHgwMzAwLCAweDAwZmUsIDB4MDAwNSwgMHg3ODFjLCAweGQwOGMsIDB4MDkwNCwgMHg3YzBiLAorCTB4NjhiYywgMHg5MGFhLCAweDAwMDUsIDB4MGEwNCwgMHg4MWU3LCAweDdkNDQsIDB4N2M0MCwgMHg5NTg0LAorCTB4MDBmNiwgMHgxNTEwLCAweDk0ODQsIDB4NzAwMCwgMHgwMTQwLCAweDkwOGEsIDB4MjAwMCwgMHgxMjYwLAorCTB4OTU4NCwgMHgwNzAwLCAweDgwMDcsIDB4MDgwNCwgMHg3YzEyLCAweDcwMDAsIDB4OTA4NCwgMHhmZjAwLAorCTB4OTA4NiwgMHg4MTAwLCAweDBkYTgsIDB4MDBiMCwgMHg5NDg0LCAweDBmZmYsIDB4MTEzMCwgMHg3MDAwLAorCTB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4ODEwMCwgMHgxMWMwLCAweDA4MGMsIDB4ZGJlYiwgMHgwODBjLAorCTB4ODExYywgMHg3ODE3LCAweDAxNDAsIDB4MDBhOCwgMHg5NTg0LCAweDAwNzYsIDB4MTExOCwgMHgwODBjLAorCTB4ODE3YSwgMHgxOWMwLCAweGQ1YTQsIDB4MDE0OCwgMHgwMDQ2LCAweDAwNTYsIDB4MDgwYywgMHg3YzZkLAorCTB4MDgwYywgMHgyMjZmLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDIwLCAweDA4MGMsIDB4ZGJlYiwgMHg3ODE3LAorCTB4MDE0MCwgMHgwODBjLCAweDcyMDcsIDB4MDE2OCwgMHgyMDAxLCAweDAxMTEsIDB4MjAwNCwgMHhkMDhjLAorCTB4MDE0MCwgMHg2ODhmLCAweDAwMDAsIDB4MjAwMSwgMHgwMTEwLCAweDIwMDMsIDB4MDAwOCwgMHgyMDAzLAorCTB4MDAwMCwgMHgwODBjLCAweDdjNGUsIDB4MjAwMSwgMHgxOWM4LCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDAwMDIsIDB4N2MyNCwgMHg3ZjI0LCAweDdjMWIsIDB4N2MxYiwgMHg3YzFiLAorCTB4N2MxYiwgMHg3YzFiLCAweDdjMWIsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsIDB4MTljOCwgMHgyMDA0LAorCTB4OTAwNSwgMHgwOTBjLCAweDhjMTAsIDB4MDAwNSwgMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwgMHg5MTk0LAorCTB4ZjAwMCwgMHg4MTBmLCAweDk0ODQsIDB4MGZmZiwgMHg2ODhlLCAweDkyODYsIDB4MjAwMCwgMHgxMTUwLAorCTB4NjgwMCwgMHg5MDg2LCAweDAwMDEsIDB4MTExOCwgMHgwODBjLCAweDU2NDEsIDB4MDA3MCwgMHgwODBjLAorCTB4N2M4ZCwgMHgwMDU4LCAweDkyODYsIDB4MzAwMCwgMHgxMTE4LCAweDA4MGMsIDB4N2U1YywgMHgwMDI4LAorCTB4OTI4NiwgMHg4MDAwLCAweDExMTAsIDB4MDgwYywgMHg4MDQzLCAweDc4MTcsIDB4MDE0MCwgMHgyMDAxLAorCTB4MTljOCwgMHgyMDA0LCAweDkwMDUsIDB4MDkwYywgMHg4YzEwLCAweDAwMDUsIDB4MjAwMSwgMHgxODEwLAorCTB4MjAwNCwgMHhkMDhjLCAweDAxNzgsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTE0OCwgMHgwMDI2LCAweDAwMzYsIDB4MjAxMSwgMHg4MDQ4LCAweDI1MTgsIDB4MDgwYywgMHg0YjFmLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDIwMCwgMHgyMDE5LCAweGZmZmUsIDB4N2MzMCwgMHgwMDUwLCAweDAwMzYsIDB4MDA0NiwgMHgwMDU2LAorCTB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4N2Q0NCwgMHg3YzQwLCAweDIwMTksIDB4ZmZmZiwgMHgyMDAxLAorCTB4MTgxMCwgMHgyMDA0LCAweGQwOGMsIDB4MDE2MCwgMHgyMDAxLCAweDE4MDAsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwMywgMHgxMTMwLCAweDAwMjYsIDB4MjAxMSwgMHg4MDQ4LCAweDA4MGMsIDB4NGIxZiwgMHgwMDJlLAorCTB4MDBmZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDA1LCAweDAwYjYsIDB4MDBjNiwgMHg3MDEwLAorCTB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA5NiwgMHgwMDAxLCAweDAxMjAsIDB4OTA5NiwgMHgwMDIzLAorCTB4MTkwNCwgMHg3ZTJkLCAweDkxODYsIDB4MDAyMywgMHgxNWMwLCAweDA4MGMsIDB4ODBlMSwgMHgwOTA0LAorCTB4N2UyZCwgMHg2MTIwLCAweDkxODYsIDB4MDAwMSwgMHgwMTUwLCAweDkxODYsIDB4MDAwNCwgMHgwMTM4LAorCTB4OTE4NiwgMHgwMDA4LCAweDAxMjAsIDB4OTE4NiwgMHgwMDBhLCAweDE5MDQsIDB4N2UyZCwgMHg3MTI0LAorCTB4NjEwYSwgMHg3MDMwLCAweDkwOGUsIDB4MDIwMCwgMHgxMTMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLAorCTB4YTE1ZCwgMHgwODA0LCAweDdlMmQsIDB4OTA4ZSwgMHgwMjE0LCAweDAxMTgsIDB4OTA4ZSwgMHgwMjEwLAorCTB4MTEzMCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHhhMTVkLCAweDA4MDQsIDB4N2UyZCwgMHg5MDhlLAorCTB4MDEwMCwgMHgxOTA0LCAweDdlMmQsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4N2UyZCwgMHgyMDA5LAorCTB4MDAxNiwgMHgwODBjLCAweGExNWQsIDB4MDgwNCwgMHg3ZTJkLCAweDkxODYsIDB4MDAyMiwgMHgxOTA0LAorCTB4N2UyZCwgMHg3MDMwLCAweDkwOGUsIDB4MDMwMCwgMHgxNTgwLCAweDY4ZDgsIDB4ZDBhNCwgMHgwNTI4LAorCTB4YzBiNSwgMHg2OGRhLCAweDcxMDAsIDB4OTE4YywgMHgwMGZmLCAweDY5N2EsIDB4NzAwNCwgMHg2ODdlLAorCTB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzllNiwgMHg3OGVhLCAweDAwMDYsIDB4OTA4NCwgMHgwMGZmLAorCTB4MDAxNiwgMHgyMDA4LCAweDA4MGMsIDB4MjdiNywgMHg3OTMyLCAweDc5MzYsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDBmZSwgMHgwODBjLCAweDI3NmUsIDB4Njk1YSwgMHg3MDNjLCAweDAwZTYsIDB4MjA3MSwgMHgwMTQwLAorCTB4NzA4NiwgMHgyMDcxLCAweDE4MDAsIDB4NzBiMiwgMHgwMGVlLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LAorCTB4N2UyZCwgMHgyMDA5LCAweDAwMTcsIDB4MDgwNCwgMHg3ZGRkLCAweDkwOGUsIDB4MDQwMCwgMHgxMTkwLAorCTB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4N2UyZCwgMHgwODBjLCAweDcyMDcsIDB4MDEyMCwgMHgyMDA5LAorCTB4MDAxZCwgMHgwODA0LCAweDdkZGQsIDB4NjhkOCwgMHhjMGE1LCAweDY4ZGEsIDB4MjAwOSwgMHgwMDMwLAorCTB4MDgwNCwgMHg3ZGRkLCAweDkwOGUsIDB4MDUwMCwgMHgxMTQwLCAweDcwMzQsIDB4OTAwNSwgMHgxOTA0LAorCTB4N2UyZCwgMHgyMDA5LCAweDAwMTgsIDB4MDgwNCwgMHg3ZGRkLCAweDkwOGUsIDB4MjAxMCwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDE5LCAweDA4MDQsIDB4N2RkZCwgMHg5MDhlLCAweDIxMTAsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDAxYSwgMHgwODA0LCAweDdkZGQsIDB4OTA4ZSwgMHg1MjAwLCAweDExNDAsIDB4NzAzNCwgMHg5MDA1LAorCTB4MTkwNCwgMHg3ZTJkLCAweDIwMDksIDB4MDAxYiwgMHgwODA0LCAweDdkZGQsIDB4OTA4ZSwgMHg1MDAwLAorCTB4MTE0MCwgMHg3MDM0LCAweDkwMDUsIDB4MTkwNCwgMHg3ZTJkLCAweDIwMDksIDB4MDAxYywgMHgwODA0LAorCTB4N2RkZCwgMHg5MDhlLCAweDEzMDAsIDB4MTEyMCwgMHgyMDA5LCAweDAwMzQsIDB4MDgwNCwgMHg3ZGRkLAorCTB4OTA4ZSwgMHgxMjAwLCAweDExNDAsIDB4NzAzNCwgMHg5MDA1LCAweDE5MDQsIDB4N2UyZCwgMHgyMDA5LAorCTB4MDAyNCwgMHgwODA0LCAweDdkZGQsIDB4OTA4YywgMHhmZjAwLCAweDkxOGUsIDB4MjQwMCwgMHgxMTcwLAorCTB4MjAwOSwgMHgwMDJkLCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwOWMsIDB4MDkwNCwgMHg3ZGRkLAorCTB4MDgwYywgMHhjYzA3LCAweDE5MDQsIDB4N2UyZCwgMHgwODA0LCAweDdkZGIsIDB4OTA4YywgMHhmZjAwLAorCTB4OTE4ZSwgMHg1MzAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDJhLCAweDA4MDQsIDB4N2RkZCwgMHg5MDhlLAorCTB4MGYwMCwgMHgxMTIwLCAweDIwMDksIDB4MDAyMCwgMHgwODA0LCAweDdkZGQsIDB4OTA4ZSwgMHg2MTA0LAorCTB4MTUyOCwgMHgyMDI5LCAweDAyMDUsIDB4MjAxMSwgMHgwMjZkLCAweDgyMDgsIDB4MjIwNCwgMHg5MDgyLAorCTB4MDAwNCwgMHg4MDA0LCAweDgwMDQsIDB4MjBhOCwgMHgyMDExLCAweDgwMTUsIDB4MjExYywgMHg4MTA4LAorCTB4MDA0NiwgMHgyMTI0LCAweDA4MGMsIDB4NGIxZiwgMHgwMDRlLCAweDgxMDgsIDB4MGYwNCwgMHg3ZGE5LAorCTB4OTE4NiwgMHgwMjgwLCAweDFkODgsIDB4MjUwNCwgMHg4MDAwLCAweDIwMmEsIDB4MjAwOSwgMHgwMjYwLAorCTB4MGM1OCwgMHgyMDJiLCAweDAwMDAsIDB4MjAwOSwgMHgwMDIzLCAweDA0NzgsIDB4OTA4ZSwgMHg2MDAwLAorCTB4MTExOCwgMHgyMDA5LCAweDAwM2YsIDB4MDQ0OCwgMHg5MDhlLCAweDc4MDAsIDB4MTExOCwgMHgyMDA5LAorCTB4MDA0NSwgMHgwNDE4LCAweDkwOGUsIDB4MTAwMCwgMHgxMTE4LCAweDIwMDksIDB4MDA0ZSwgMHgwMGU4LAorCTB4OTA4ZSwgMHg2MzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDRhLCAweDAwYjgsIDB4OTA4YywgMHhmZjAwLAorCTB4OTE4ZSwgMHg1NjAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDRmLCAweDAwNzgsIDB4OTA4YywgMHhmZjAwLAorCTB4OTE4ZSwgMHg1NzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDUwLCAweDAwMzgsIDB4MjAwOSwgMHgwMDFkLAorCTB4NjgzOCwgMHhkMGQ0LCAweDAxMTAsIDB4MjAwOSwgMHgwMDRjLCAweDAwMTYsIDB4MjAxMSwgMHgwMjYzLAorCTB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNzZlLCAweDE5MDQsIDB4N2UzMCwgMHgwODBjLAorCTB4NjQzZiwgMHgxOTA0LCAweDdlMzAsIDB4YmUxMiwgMHhiZDE2LCAweDAwMWUsIDB4MDAxNiwgMHgwODBjLAorCTB4NzIwNywgMHgwMWMwLCAweDY4ZDgsIDB4ZDA4YywgMHgxMTQ4LCAweDcwMDAsIDB4OTA4NCwgMHgwMGZmLAorCTB4MTE4OCwgMHg3MDA0LCAweDkwODQsIDB4ZmYwMCwgMHgxMTY4LCAweDAwNDAsIDB4Njg3OCwgMHg5NjA2LAorCTB4MTE0OCwgMHg2ODdjLCAweDk1MDYsIDB4OTA4NCwgMHhmZjAwLCAweDExMjAsIDB4OTU4NCwgMHgwMGZmLAorCTB4YjhiMiwgMHgwMDgwLCAweGI4YjAsIDB4OTAwNSwgMHgxMTY4LCAweDkxODYsIDB4MDA0NiwgMHgxMTUwLAorCTB4Njg3OCwgMHg5NjA2LCAweDExMzgsIDB4Njg3YywgMHg5NTA2LCAweDkwODQsIDB4ZmYwMCwgMHgxMTEwLAorCTB4MDAxZSwgMHgwMDk4LCAweDA4MGMsIDB4YTA4ZCwgMHgwMWE4LCAweDJiMDgsIDB4NjExMiwgMHg2MDIzLAorCTB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHg5MTg2LCAweDAwNGMsIDB4MTExMCwgMHg2MDIzLAorCTB4MDAwYSwgMHgwMDE2LCAweDAwMWUsIDB4MDgwYywgMHhhMTVkLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDAxZSwgMHgwY2Q4LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwZWMsIDB4MDEyMCwgMHgyMDExLAorCTB4ODA0OSwgMHgwODBjLCAweDRiMWYsIDB4MDgwYywgMHhhMTMwLCAweDBkOTAsIDB4MmIwOCwgMHg2MTEyLAorCTB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDAwMTYsIDB4OTE4NiwgMHgwMDE3LAorCTB4MDExOCwgMHg5MTg2LCAweDAwMzAsIDB4MTEyOCwgMHg2MDA3LCAweDAwMDksIDB4NjAxNywgMHgyOTAwLAorCTB4MDAyMCwgMHg2MDA3LCAweDAwNTEsIDB4NjAxNywgMHgwMDAwLCAweDYwMmYsIDB4MDAwOSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDhhMCwgMHgwODBjLCAweDgyMDYsIDB4MTE1OCwgMHgwODBjLAorCTB4MzJhZSwgMHgxMTQwLCAweDcwMTAsIDB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4ZSwgMHgwMDA4LAorCTB4MTEwOCwgMHgwMDA5LCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwNDYsIDB4NzAwMCwgMHg5MDhjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzMywgMHgxMWU4LCAweDA4MGMsIDB4ODBlMSwgMHgwOTA0LAorCTB4N2ViYywgMHg3MTI0LCAweDYxMGEsIDB4NzAzMCwgMHg5MDhlLCAweDAyMDAsIDB4MTE0MCwgMHg3MDM0LAorCTB4OTAwNSwgMHgxNWQwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweGExNWQsIDB4MDRhOCwgMHg5MDhlLAorCTB4MDEwMCwgMHgxNTkwLCAweDcwMzQsIDB4OTAwNSwgMHgxNTc4LCAweDIwMDksIDB4MDAxNiwgMHgwODBjLAorCTB4YTE1ZCwgMHgwNDUwLCAweDkxODYsIDB4MDAzMiwgMHgxNTM4LCAweDcwMzAsIDB4OTA4ZSwgMHgxNDAwLAorCTB4MTUxOCwgMHgyMDA5LCAweDAwMzgsIDB4MDAxNiwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwgMHg4MjExLAorCTB4MjIwYywgMHgwODBjLCAweDI3NmUsIDB4MTFiOCwgMHgwODBjLCAweDY0M2YsIDB4MTFhMCwgMHhiZTEyLAorCTB4YmQxNiwgMHgwODBjLCAweGEwOGQsIDB4MDE3OCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjMmIzLAorCTB4NjAyMywgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDA4MGMsIDB4YTE1ZCwgMHgwODBjLAorCTB4OGMxMCwgMHgwMDEwLCAweDAwY2UsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMDQ2LCAweDAwZTYsIDB4MDBkNiwgMHgyMDI4LCAweDIxMzAsIDB4OTY5NiwgMHgwMGZmLAorCTB4MTFiOCwgMHg5NTkyLCAweGZmZmMsIDB4MDJhMCwgMHg5NTk2LCAweGZmZmQsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDA3ZiwgMHgwODA0LCAweDdmMWUsIDB4OTU5NiwgMHhmZmZlLCAweDExMjAsIDB4MjAwOSwgMHgwMDdlLAorCTB4MDgwNCwgMHg3ZjFlLCAweDk1OTYsIDB4ZmZmYywgMHgxMTE4LCAweDIwMDksIDB4MDA4MCwgMHgwNGYwLAorCTB4MjAxMSwgMHgwMDAwLCAweDIwMTksIDB4MTgzNiwgMHgyMzFjLCAweGQzYWMsIDB4MDEzMCwgMHg5MDI2LAorCTB4MjBhOSwgMHgwODAwLCAweDIwNzEsIDB4MTAwMCwgMHgwMDMwLCAweDIwMjEsIDB4MDA4MSwgMHgyMGE5LAorCTB4MDc3ZiwgMHgyMDcxLCAweDEwODEsIDB4MmUxYywgMHg5M2RkLCAweDAwMDAsIDB4MTE0MCwgMHg4MmZmLAorCTB4MTFkMCwgMHg5NDk2LCAweDAwZmYsIDB4MDFiOCwgMHgyNDEwLCAweGMyZmQsIDB4MDBhMCwgMHhiZjEwLAorCTB4MjYwMCwgMHg5NzA2LCAweGI4MTQsIDB4MTEyMCwgMHg5NTQ2LCAweDExMTAsIDB4MjQwOCwgMHgwMGIwLAorCTB4OTc0NSwgMHgxMTQ4LCAweDk0YzYsIDB4MDA3ZSwgMHgwMTMwLCAweDk0YzYsIDB4MDA3ZiwgMHgwMTE4LAorCTB4OTRjNiwgMHgwMDgwLCAweDFkMjAsIDB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsIDB4N2VmMywgMHg4MmZmLAorCTB4MTExOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAxOCwgMHhjMmZjLCAweDIyMDgsIDB4OTAwNiwgMHgwMGRlLAorCTB4MDBlZSwgMHgwMDRlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MzYsIDB4MjAwYywgMHg5MTg0LAorCTB4MDA4MCwgMHgwMTEwLCAweGQxOGMsIDB4MDEzOCwgMHg3MDAwLCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLAorCTB4OTE4NCwgMHgwMDBmLCAweDAwNGEsIDB4NzgxNywgMHgwMTQwLCAweDIwMDEsIDB4MTljOCwgMHgyMDA0LAorCTB4OTAwNSwgMHgwOTBjLCAweDhjMTAsIDB4MDAwNSwgMHg3ZjRjLCAweDdmNGMsIDB4N2Y0YywgMHg4MGYzLAorCTB4N2Y0YywgMHg3ZjU1LCAweDdmODAsIDB4ODAwZSwgMHg3ZjRjLCAweDdmNGMsIDB4N2Y0YywgMHg3ZjRjLAorCTB4N2Y0YywgMHg3ZjRjLCAweDdmNGMsIDB4N2Y0YywgMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwgMHgxOWM4LAorCTB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OGMxMCwgMHgwMDA1LCAweDAwYjYsIDB4NzExMCwgMHhkMWJjLAorCTB4MDFlOCwgMHg3MTIwLCAweDIxNjAsIDB4OWM4YywgMHgwMDA3LCAweDExYzAsIDB4OWM4YSwgMHgxY2QwLAorCTB4MDJhOCwgMHg2ODY0LCAweDljMDIsIDB4MTI5MCwgMHg3MDA4LCAweDkwODQsIDB4MDBmZiwgMHg2MTEwLAorCTB4MjE1OCwgMHhiOTEwLCAweDkxMDYsIDB4MTE1MCwgMHg3MDBjLCAweGI5MTQsIDB4OTEwNiwgMHgxMTMwLAorCTB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NiwgMHgwODBjLCAweGExNWQsIDB4NzgxNywgMHgwMTQwLAorCTB4MjAwMSwgMHgxOWM4LCAweDIwMDQsIDB4OTAwNSwgMHgwOTBjLCAweDhjMTAsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMGM2LCAweDk0ODQsIDB4MGZmZiwgMHgwOTA0LCAweDdmZTQsIDB4NzExMCwgMHhkMWJjLAorCTB4MTkwNCwgMHg3ZmU0LCAweDcxMDgsIDB4NzAwYywgMHgyMDI4LCAweDkxOGMsIDB4MDBmZiwgMHgyMTMwLAorCTB4OTA5NCwgMHhmZjAwLCAweDE1YjAsIDB4ODFmZiwgMHgxNWEwLCAweDkwODAsIDB4MzJlOSwgMHgyMDBkLAorCTB4OTE4YywgMHhmZjAwLCAweDgxMGYsIDB4MjAwMSwgMHgwMDgwLCAweDkxMDYsIDB4MDkwNCwgMHg3ZmU0LAorCTB4MDgwYywgMHg2NDNmLCAweDE5MDQsIDB4N2ZlNCwgMHhiZTEyLCAweGJkMTYsIDB4YjgwMCwgMHhkMGVjLAorCTB4MTVkOCwgMHhiYTA0LCAweDkyOTQsIDB4ZmYwMCwgMHg5Mjg2LCAweDA2MDAsIDB4MTFhMCwgMHgwODBjLAorCTB4YTA4ZCwgMHgwNWU4LCAweDJiMDgsIDB4NzAyOCwgMHg2MDQ2LCAweDcwMmMsIDB4NjA0YSwgMHg2MTEyLAorCTB4NjAyMywgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxNTYsIDB4MjAwOSwgMHgwMDQ0LAorCTB4MDgwYywgMHhjZTY1LCAweDA0MDgsIDB4MDgwYywgMHg2N2MzLCAweDExMzgsIDB4YjgwNywgMHgwNjA2LAorCTB4MGMzMCwgMHgxOTBjLCAweDdlYzAsIDB4MTFjMCwgMHgwODk4LCAweDA4MGMsIDB4YTA4ZCwgMHgyYjA4LAorCTB4MDE5OCwgMHg2MTEyLCAweDYwMjMsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4OTI4NiwgMHgwNDAwLAorCTB4MTExOCwgMHg2MDA3LCAweDAwMDUsIDB4MDAxMCwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHg3ODE3LCAweDAxNDAsIDB4MjAwMSwgMHgxOWM4LAorCTB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OGMxMCwgMHgwMGNlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDAxLAorCTB4MTgwZSwgMHgyMDA0LCAweGQwZWMsIDB4MDEyMCwgMHgyMDExLCAweDgwNDksIDB4MDgwYywgMHg0YjFmLAorCTB4MDgwYywgMHhhMTMwLCAweDBkNDgsIDB4MmIwOCwgMHg2MTEyLCAweDYwMjMsIDB4MDAwNiwgMHg3MTIwLAorCTB4NjEwYSwgMHg3MTMwLCAweDYxNTYsIDB4NjAxNywgMHhmMzAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA0MSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDA4YjAsIDB4MDBiNiwgMHg3MTEwLAorCTB4ZDFiYywgMHgwMWU4LCAweDcwMjAsIDB4MjA2MCwgMHg5Yzg0LCAweDAwMDcsIDB4MTFjMCwgMHg5YzgyLAorCTB4MWNkMCwgMHgwMmE4LCAweDY4NjQsIDB4OWMwMiwgMHgxMjkwLCAweDcwMDgsIDB4OTA4NCwgMHgwMGZmLAorCTB4NjExMCwgMHgyMTU4LCAweGI5MTAsIDB4OTEwNiwgMHgxMTUwLCAweDcwMGMsIDB4YjkxNCwgMHg5MTA2LAorCTB4MTEzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ1LCAweDA4MGMsIDB4YTE1ZCwgMHg3ODE3LAorCTB4MDE0MCwgMHgyMDAxLCAweDE5YzgsIDB4MjAwNCwgMHg5MDA1LCAweDA5MGMsIDB4OGMxMCwgMHgwMGJlLAorCTB4MDAwNSwgMHg2MTIwLCAweDkxODYsIDB4MDAwMiwgMHgwMTI4LCAweDkxODYsIDB4MDAwNSwgMHgwMTEwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg4MjA2LCAweDExODAsIDB4MDgwYywgMHgzMmFlLAorCTB4MTE2OCwgMHg3MDEwLCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDkwODYsIDB4MDAwMCwgMHgxMTMwLAorCTB4OTE4NCwgMHgwMDBmLCAweDkwOGEsIDB4MDAwNiwgMHgxMjA4LCAweDAwMGIsIDB4MDAwNSwgMHg4MDVkLAorCTB4ODA1ZSwgMHg4MDVkLCAweDgwNWQsIDB4ODBjMywgMHg4MGQyLCAweDAwMDUsIDB4MDBiNiwgMHg3MDBjLAorCTB4NzEwOCwgMHgwODBjLCAweDI3NmUsIDB4MTkwNCwgMHg4MGMxLCAweDA4MGMsIDB4NjQzZiwgMHgxOTA0LAorCTB4ODBjMSwgMHhiZTEyLCAweGJkMTYsIDB4NzExMCwgMHhkMWJjLCAweDA1NDAsIDB4NzAyYywgMHhkMDg0LAorCTB4MTEyMCwgMHhiODAwLCAweGQwYmMsIDB4MTkwNCwgMHg4MGMxLCAweDA4MGMsIDB4NjdjMywgMHgwMTQ4LAorCTB4OTA4NiwgMHgwMDA0LCAweDAxMzAsIDB4MDgwYywgMHg2N2NiLCAweDAxMTgsIDB4OTA4NiwgMHgwMDA0LAorCTB4MTU4OCwgMHgwMGM2LCAweDA4MGMsIDB4ODBlMSwgMHgwMGNlLCAweDA1ZDgsIDB4MDgwYywgMHhhMDhkLAorCTB4MmIwOCwgMHgwNWI4LCAweDYxMTIsIDB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMiwgMHg3MTIwLAorCTB4NjEwYSwgMHgyMDA5LCAweDAwODgsIDB4MDgwYywgMHhhMTVkLCAweDA0NTgsIDB4MDgwYywgMHg2N2MzLAorCTB4MDE0OCwgMHg5MDg2LCAweDAwMDQsIDB4MDEzMCwgMHgwODBjLCAweDY3Y2IsIDB4MDExOCwgMHg5MDg2LAorCTB4MDAwNCwgMHgxMTgwLCAweDA4MGMsIDB4YTA4ZCwgMHgyYjA4LCAweDAxZDgsIDB4NjExMiwgMHgwODBjLAorCTB4YzJiMywgMHg2MDIzLCAweDAwMDUsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OCwgMHgwODBjLAorCTB4YTE1ZCwgMHgwMDc4LCAweDA4MGMsIDB4YTA4ZCwgMHgyYjA4LCAweDAxNTgsIDB4NjExMiwgMHgwODBjLAorCTB4YzJiMywgMHg2MDIzLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLAorCTB4YTE1ZCwgMHgwMGJlLCAweDAwMDUsIDB4NzExMCwgMHhkMWJjLCAweDAxNTgsIDB4MDBkMSwgMHgwMTQ4LAorCTB4MDgwYywgMHg4MDM5LCAweDExMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA4OSwgMHgwODBjLAorCTB4YTE1ZCwgMHgwMDA1LCAweDcxMTAsIDB4ZDFiYywgMHgwMTU4LCAweDAwNTksIDB4MDE0OCwgMHgwODBjLAorCTB4ODAzOSwgMHgxMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwOGEsIDB4MDgwYywgMHhhMTVkLAorCTB4MDAwNSwgMHg3MDIwLCAweDIwNjAsIDB4OWM4NCwgMHgwMDA3LCAweDExNTgsIDB4OWM4MiwgMHgxY2QwLAorCTB4MDI0MCwgMHgyMDAxLCAweDE4MTksIDB4MjAwNCwgMHg5YzAyLCAweDEyMTgsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHg5MDA2LCAweDBjZTgsIDB4MDBiNiwgMHg3MTEwLCAweGQxYmMsIDB4MTFkOCwgMHg3MDI0LAorCTB4MjA2MCwgMHg5Yzg0LCAweDAwMDcsIDB4MTFiMCwgMHg5YzgyLCAweDFjZDAsIDB4MDI5OCwgMHg2ODY0LAorCTB4OWMwMiwgMHgxMjgwLCAweDcwMDgsIDB4OTA4NCwgMHgwMGZmLCAweDYxMTAsIDB4MjE1OCwgMHhiOTEwLAorCTB4OTEwNiwgMHgxMTQwLCAweDcwMGMsIDB4YjkxNCwgMHg5MTA2LCAweDExMjAsIDB4MjAwOSwgMHgwMDUxLAorCTB4MDgwYywgMHhhMTVkLCAweDc4MTcsIDB4MDE0MCwgMHgyMDAxLCAweDE5YzgsIDB4MjAwNCwgMHg5MDA1LAorCTB4MDkwYywgMHg4YzEwLCAweDAwYmUsIDB4MDAwNSwgMHgyMDMxLCAweDAxMDUsIDB4MDA2OSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMjA2LCAweDAwNDksIDB4MDAwNSwgMHgyMDMxLCAweDAyMDcsIDB4MDAyOSwgMHgwMDA1LAorCTB4MjAzMSwgMHgwMjEzLCAweDAwMDksIDB4MDAwNSwgMHgwMGM2LCAweDAwOTYsIDB4MDBmNiwgMHg3MDAwLAorCTB4OTA4NCwgMHhmMDAwLCAweDkwODYsIDB4YzAwMCwgMHgwNWQwLCAweDA4MGMsIDB4YTA4ZCwgMHgwNWI4LAorCTB4MDA2NiwgMHgwMGM2LCAweDAwNDYsIDB4MjAxMSwgMHgwMjYzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLAorCTB4MDgwYywgMHgyNzZlLCAweDE1YTAsIDB4MDgwYywgMHg2NDNmLCAweDE1ODgsIDB4YmUxMiwgMHhiZDE2LAorCTB4MmIwMCwgMHgwMDRlLCAweDAwY2UsIDB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4MDgwYywgMHgxMDMxLAorCTB4MDUxMCwgMHgyOTAwLCAweDYwNWEsIDB4OTAwNiwgMHhhODAyLCAweGE4NjYsIDB4YWM2YSwgMHhhODVjLAorCTB4OTBmOCwgMHgwMDFiLCAweDIwYTksIDB4MDAwZSwgMHhhODYwLCAweDIwZTgsIDB4MjBlMSwgMHgwMDAwLAorCTB4MmZhMCwgMHgyZTk4LCAweDQwMDMsIDB4MDA2ZSwgMHg2NjE2LCAweDYwMDcsIDB4MDAzZSwgMHg2MDIzLAorCTB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHgwMGZlLAorCTB4MDA5ZSwgMHgwMGNlLCAweDAwMDUsIDB4MDgwYywgMHhhMGUzLCAweDAwNmUsIDB4MGNjMCwgMHgwMDRlLAorCTB4MDBjZSwgMHgwY2M4LCAweDAwYzYsIDB4NzAwMCwgMHg5MDhjLCAweGZmMDAsIDB4OTE4NCwgMHhmMDAwLAorCTB4ODEwZiwgMHg5MDg2LCAweDIwMDAsIDB4MTkwNCwgMHg4MWQxLCAweDkxODYsIDB4MDAyMiwgMHgxNWYwLAorCTB4MjAwMSwgMHgwMTExLCAweDIwMDQsIDB4OTAwNSwgMHgxOTA0LCAweDgxZDMsIDB4NzAzMCwgMHg5MDhlLAorCTB4MDQwMCwgMHgwOTA0LCAweDgxZDMsIDB4OTA4ZSwgMHg2MDAwLCAweDA1ZTgsIDB4OTA4ZSwgMHg1NDAwLAorCTB4MDVkMCwgMHg5MDhlLCAweDAzMDAsIDB4MTFkOCwgMHgyMDA5LCAweDE4MzYsIDB4MjEwYywgMHhkMThjLAorCTB4MTU5MCwgMHhkMWE0LCAweDE1ODAsIDB4MDgwYywgMHg2NzgxLCAweDA1ODgsIDB4NjhhYywgMHg5MDg0LAorCTB4MDBmZiwgMHg3MTAwLCAweDkxOGMsIDB4MDBmZiwgMHg5MTA2LCAweDE1MTgsIDB4Njg3YywgMHg2OWFjLAorCTB4OTE4YywgMHhmZjAwLCAweDkxMDUsIDB4NzEwNCwgMHg5MTA2LCAweDExZDgsIDB4MDBlMCwgMHgyMDA5LAorCTB4MDEwMywgMHgyMTBjLCAweGQxYjQsIDB4MTFhOCwgMHg5MDhlLCAweDUyMDAsIDB4MDllOCwgMHg5MDhlLAorCTB4MDUwMCwgMHgwOWQwLCAweDkwOGUsIDB4NTAwMCwgMHgwOWI4LCAweDAwNTgsIDB4OTE4NiwgMHgwMDIzLAorCTB4MTE0MCwgMHgwODBjLCAweDgwZTEsIDB4MDEyOCwgMHg2MDA0LCAweDkwODYsIDB4MDAwMiwgMHgwMTE4LAorCTB4MDAwMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDAwNSwgMHg3MDMwLAorCTB4OTA4ZSwgMHgwMzAwLCAweDAxMTgsIDB4OTA4ZSwgMHg1MjAwLCAweDFkOTgsIDB4MjAwMSwgMHgxODM2LAorCTB4MjAwNCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwgMHgwMDA4LCAweDBkNjgsIDB4MGM1MCwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMjAwLCAweDc4MDAsIDB4YzBlNSwgMHhjMGNjLCAweDc4MDIsIDB4MDBmZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzgzNCwgMHhkMDg0LCAweDExMzAsIDB4MjA3OSwgMHgwMjAwLAorCTB4NzgwMCwgMHg5MDg1LCAweDEyMDAsIDB4NzgwMiwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTgwMCwgMHg3MDM0LCAweGMwODQsIDB4NzAzNiwgMHgwMGVlLCAweDAwMDUsIDB4MDAxNiwgMHgyMDAxLAorCTB4MTgzNiwgMHgyMDBjLCAweDkxODQsIDB4MDA4MCwgMHgwMTE4LCAweGQxOGMsIDB4MDExOCwgMHg5MDA2LAorCTB4MDAxZSwgMHgwMDA1LCAweDkwODUsIDB4MDAwMSwgMHgwY2Q4LCAweDIwNzEsIDB4MTlkMiwgMHg3MDAzLAorCTB4MDAwMywgMHg3MDBmLCAweDAzNjEsIDB4OTAwNiwgMHg3MDFhLCAweDcwNzIsIDB4NzAxMiwgMHg3MDE3LAorCTB4MWNkMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNiwgMHg3MDJiLCAweDk2NmMsIDB4NzAzMiwgMHg3MDM3LAorCTB4OTZkNCwgMHg3MDNmLCAweGZmZmYsIDB4NzA0MiwgMHg3MDQ3LCAweDU0NmQsIDB4NzA0YSwgMHg3MDViLAorCTB4ODM3NSwgMHgwODBjLCAweDEwNGEsIDB4MDkwYywgMHgwZGZhLCAweDI5MDAsIDB4NzAzYSwgMHhhODY3LAorCTB4MDAwMywgMHhhODZmLCAweDAxMDAsIDB4YThhYiwgMHhkY2IwLCAweDAwMDUsIDB4MjA3MSwgMHgxOWQyLAorCTB4MWQwNCwgMHg4MmM5LCAweDIwOTEsIDB4NjAwMCwgMHg3MDBjLCAweDgwMDEsIDB4NzAwZSwgMHgxNTEwLAorCTB4MjAwMSwgMHgxODdkLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTU4LCAweDNhMDAsIDB4ZDA4YywgMHgxMTQwLAorCTB4MjBkMSwgMHgwMDAwLCAweDIwZDEsIDB4MDAwMSwgMHgyMGQxLCAweDAwMDAsIDB4MDgwYywgMHgwZGZhLAorCTB4NzAwZiwgMHgwMzYxLCAweDcwMDcsIDB4MDAwMSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4ODNiYSwgMHg3MDQwLCAweDkwMGQsIDB4MDE0OCwgMHg4MTA5LCAweDcxNDIsIDB4MTEzMCwgMHg3MDQ0LAorCTB4MDgwZiwgMHgwMDE4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMjQsIDB4OTAwZCwgMHgwMTg4LAorCTB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4MTE2OCwgMHg3MDIzLCAweDAwMDksIDB4ODEwOSwgMHg3MTI2LAorCTB4OTE4NiwgMHgwM2U4LCAweDExMTAsIDB4NzAyOCwgMHgwODBmLCAweDgxZmYsIDB4MTExMCwgMHg3MDI4LAorCTB4MDgwZiwgMHg3MDMwLCAweDkwMGQsIDB4MDE4MCwgMHg3MDJjLCAweDgwMDEsIDB4NzAyZSwgMHgxMTYwLAorCTB4NzAyZiwgMHgwMDA5LCAweDgxMDksIDB4NzEzMiwgMHgwMTI4LCAweDkxODQsIDB4MDA3ZiwgMHgwOTBjLAorCTB4OTgwMiwgMHgwMDEwLCAweDcwMzQsIDB4MDgwZiwgMHg3MDNjLCAweDkwMDUsIDB4MDExOCwgMHgwMzEwLAorCTB4ODAwMSwgMHg3MDNlLCAweDcwNGMsIDB4OTAwZCwgMHgwMTY4LCAweDcwNDgsIDB4ODAwMSwgMHg3MDRhLAorCTB4MTE0OCwgMHg3MDRiLCAweDAwMDksIDB4ODEwOSwgMHg3MTRlLCAweDExMjAsIDB4NzE1MCwgMHg3MTRlLAorCTB4NzA1OCwgMHgwODBmLCAweDcwMTgsIDB4OTAwZCwgMHgwMWQ4LCAweDAwMTYsIDB4NzA3MCwgMHg5MDBkLAorCTB4MDE1OCwgMHg3MDZjLCAweDgwMDEsIDB4NzA2ZSwgMHgxMTM4LCAweDcwNmYsIDB4MDAwOSwgMHg4MTA5LAorCTB4NzE3MiwgMHgxMTEwLCAweDcwNzQsIDB4MDgwZiwgMHgwMDFlLCAweDcwMDgsIDB4ODAwMSwgMHg3MDBhLAorCTB4MTEzOCwgMHg3MDBiLCAweDAwMDksIDB4ODEwOSwgMHg3MTFhLCAweDExMTAsIDB4NzAxYywgMHgwODBmLAorCTB4MDEyZSwgMHg3MDA0LCAweDAwMDIsIDB4ODJmMSwgMHg4MmYyLCAweDgzMGUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTlkMiwgMHg3MDE4LCAweDkwMDUsIDB4MTEyMCwgMHg3MTFhLCAweDcyMWUsIDB4NzAwYiwgMHgwMDA5LAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDAwNiwgMHgyMDcxLCAweDE5ZDIsIDB4NzAxYywgMHg5MjA2LAorCTB4MTEyMCwgMHg3MDFhLCAweDcwMWUsIDB4NzA3MiwgMHg3MDc2LCAweDAwMGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDE5ZDIsIDB4Yjg4OCwgMHg5MTAyLCAweDAyMDgsIDB4Yjk4YSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwYjYsIDB4NzExMCwgMHgwODBjLCAweDY0OWYsIDB4MTE2OCwgMHhiODg4LAorCTB4ODAwMSwgMHgwMjUwLCAweGI4OGEsIDB4MTE0MCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDE2LAorCTB4MDgwYywgMHg4YzEwLCAweDAwMWUsIDB4MDEyZSwgMHg4MTA4LCAweDkxODIsIDB4MDgwMCwgMHgwMjE4LAorCTB4OTAwZSwgMHg3MDA3LCAweDAwMDIsIDB4NzExMiwgMHgwMGJlLCAweDAwMDUsIDB4NzAxNCwgMHgyMDYwLAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjA0MCwgMHg5MDA1LCAweDAxMjgsIDB4ODAwMSwgMHg2MDQyLAorCTB4MTExMCwgMHgwODBjLCAweGMxNDQsIDB4NjAxOCwgMHg5MDA1LCAweDA1MjgsIDB4ODAwMSwgMHg2MDFhLAorCTB4MTUxMCwgMHg2MTIwLCAweDkxODYsIDB4MDAwMywgMHgwMTE4LCAweDkxODYsIDB4MDAwNiwgMHgxMWM4LAorCTB4MDgwYywgMHhiZTM3LCAweDAxYjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4ODQsIDB4OTA4YSwgMHgxOTlhLAorCTB4MDI4MCwgMHg5MDgyLCAweDE5OTksIDB4YTg4NiwgMHg5MDhhLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLAorCTB4MTk5OSwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDYxMWEsIDB4YTg3YywgMHhkMGU0LAorCTB4MDExMCwgMHgwODBjLCAweGJiMjMsIDB4MDEyZSwgMHg5Yzg4LCAweDAwMTgsIDB4NzExNiwgMHgyMDAxLAorCTB4MTgxOSwgMHgyMDA0LCAweDkxMDIsIDB4MDIyMCwgMHg3MDE3LCAweDFjZDAsIDB4NzAwNywgMHgwMDAwLAorCTB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTlkMiwgMHg3MDI3LCAweDA3ZDAsIDB4NzAyMywgMHgwMDA5LAorCTB4MDBlZSwgMHgwMDA1LCAweDIwMDEsIDB4MTlkYiwgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxOWQyLCAweDcxMzIsIDB4NzAyZiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgyMDExLAorCTB4MTlkZSwgMHgyMDEzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MTlkMiwgMHg3MTFhLAorCTB4NzIxZSwgMHg3MDBiLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwODYsIDB4MDAyNiwgMHg3MDU0LAorCTB4ODAwMCwgMHg3MDU2LCAweDIwMDEsIDB4MTllMCwgMHgyMDQ0LCAweGEwNmMsIDB4OTA4NiwgMHgwMDAwLAorCTB4MDE1MCwgMHg3MDY4LCAweGEwOWEsIDB4NzA2NCwgMHhhMDk2LCAweDcwNjAsIDB4YTA5MiwgMHg3MDVjLAorCTB4YTA4ZSwgMHgwODBjLCAweDExMmUsIDB4MDAyZSwgMHgwMDhlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LAorCTB4MDA5NiwgMHgwMGE2LCAweDAwYjYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTU2LAorCTB4MDgwYywgMHg4MjNlLCAweDAxNWUsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLAorCTB4MDBhZSwgMHgwMDllLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxOWQyLAorCTB4NzE3MiwgMHg3Mjc2LCAweDcwNmYsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LAorCTB4MjA3MSwgMHgxOWQyLCAweDcwNzQsIDB4OTIwNiwgMHgxMTEwLCAweDcwNzIsIDB4NzA3NiwgMHgwMDBlLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwNjksIDB4MTgwMCwgMHg2OWU0LCAweGQxZTQsIDB4MTUxOCwgMHgwMDI2LAorCTB4ZDFlYywgMHgwMTQwLCAweDZhNTAsIDB4Njg3MCwgMHg5MjAyLCAweDAyODgsIDB4ODExNywgMHg5Mjk0LAorCTB4MDBjMCwgMHgwMDg4LCAweDkxODQsIDB4MDAwNywgMHgwMWEwLCAweDgxMDksIDB4OTE4NCwgMHgwMDA3LAorCTB4MDExMCwgMHg2OWU2LCAweDAwNzAsIDB4ODEwNywgMHg5MDg0LCAweDAwMDcsIDB4OTEwZCwgMHg4MTA3LAorCTB4OTEwNiwgMHg5MDk0LCAweDAwYzAsIDB4OTE4NCwgMHhmZjNmLCAweDkyMDUsIDB4NjhlNiwgMHgwODBjLAorCTB4MGYxMSwgMHgwMDJlLCAweDAwMDUsIDB4MDBjNiwgMHgyMDYxLCAweDFhNDgsIDB4MDBjZSwgMHgwMDA1LAorCTB4OTE4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDkwODAsIDB4MWE0OCwgMHgyMDYwLAorCTB4MDAwNSwgMHhhODg0LCAweDkwOGEsIDB4MTk5YSwgMHgxNjM4LCAweDkwMDUsIDB4MTE1MCwgMHgwMGM2LAorCTB4MjA2MSwgMHgxYTQ4LCAweDYwMTQsIDB4MDBjZSwgMHg5MDA1LCAweDExMzAsIDB4MjAwMSwgMHgwMDFlLAorCTB4MDAxOCwgMHg5MDhlLCAweGZmZmYsIDB4MDFiMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LAorCTB4NjExYSwgMHhhODdjLCAweDkwOGMsIDB4MDBjMCwgMHg5MThlLCAweDAwYzAsIDB4MDkwNCwgMHg4NDdiLAorCTB4ZDBiNCwgMHgxMTY4LCAweGQwYmMsIDB4MTkwNCwgMHg4NDU0LCAweDIwMDksIDB4MDAwNiwgMHgwODBjLAorCTB4ODRhOCwgMHgwMDA1LCAweDkwMGUsIDB4MGM2MCwgMHgyMDAxLCAweDE5OTksIDB4MDhiMCwgMHhkMGZjLAorCTB4MDE2MCwgMHg5MDhjLCAweDAwMDMsIDB4MDEyMCwgMHg5MThlLCAweDAwMDMsIDB4MTkwNCwgMHg4NGEyLAorCTB4OTA4YywgMHgyMDIwLCAweDkxOGUsIDB4MjAyMCwgMHgwMWE4LCAweDYwMjQsIDB4ZDBkNCwgMHgxMWU4LAorCTB4MjAwOSwgMHgxODdkLCAweDIxMDQsIDB4ZDA4NCwgMHgxMTM4LCAweDg3ZmYsIDB4MTEyMCwgMHgyMDA5LAorCTB4MDA0MywgMHgwODA0LCAweGExNWQsIDB4MDAwNSwgMHg4N2ZmLCAweDFkZTgsIDB4MjAwOSwgMHgwMDQyLAorCTB4MDgwNCwgMHhhMTVkLCAweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLAorCTB4MGQyMCwgMHg2MDI0LCAweGMwY2QsIDB4NjAyNiwgMHgwYzAwLCAweGMwZDQsIDB4NjAyNiwgMHhhODkwLAorCTB4NjAyZSwgMHhhODhjLCAweDYwMzIsIDB4MDhlMCwgMHhkMGZjLCAweDAxNjAsIDB4OTA4YywgMHgwMDAzLAorCTB4MDEyMCwgMHg5MThlLCAweDAwMDMsIDB4MTkwNCwgMHg4NGEyLCAweDkwOGMsIDB4MjAyMCwgMHg5MThlLAorCTB4MjAyMCwgMHgwMTcwLCAweDAwNzYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTZkYiwgMHgwMGZlLAorCTB4MDA3ZSwgMHg4N2ZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDQyLCAweDA4MGMsIDB4YTE1ZCwgMHgwMDA1LAorCTB4NjExMCwgMHgwMGI2LCAweDIxNTgsIDB4YjkwMCwgMHgwMGJlLCAweGQxYWMsIDB4MGQ1OCwgMHg2MTI0LAorCTB4YzFjZCwgMHg2MTI2LCAweDBjMzgsIDB4ZDBmYywgMHgwMTg4LCAweDkwOGMsIDB4MjAyMCwgMHg5MThlLAorCTB4MjAyMCwgMHgwMWE4LCAweDkwODQsIDB4MDAwMywgMHg5MDhlLCAweDAwMDIsIDB4MDE0OCwgMHg4N2ZmLAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHhhMTVkLCAweDAwMDUsIDB4MDBiOSwgMHgwY2U4LAorCTB4ODdmZiwgMHgxZGQ4LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGExNWQsIDB4MGNiMCwgMHg2MTEwLAorCTB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWFjLCAweDBkMjAsIDB4NjEyNCwgMHhjMWNkLAorCTB4NjEyNiwgMHgwYzAwLCAweDIwMDksIDB4MDAwNCwgMHgwMDE5LCAweDAwMDUsIDB4MjAwOSwgMHgwMDAxLAorCTB4MDA5NiwgMHgwODBjLCAweGJlMzcsIDB4MDUxOCwgMHg2MDE0LCAweDIwNDgsIDB4YTk4MiwgMHhhODAwLAorCTB4NjAxNiwgMHg5MTg2LCAweDAwMDEsIDB4MTE4OCwgMHhhOTdjLCAweDkxOGMsIDB4ODEwMCwgMHg5MThlLAorCTB4ODEwMCwgMHgxMTU4LCAweDAwYzYsIDB4MjA2MSwgMHgxYTQ4LCAweDYyMDAsIDB4ZDI4YywgMHgxMTIwLAorCTB4NjIwNCwgMHg4MjEwLCAweDAyMDgsIDB4NjIwNiwgMHgwMGNlLCAweDA4MGMsIDB4NjkyMywgMHg2MDE0LAorCTB4OTA0ZCwgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgxOTBjLCAweDgzZjEsIDB4MDA3ZSwgMHgwMDllLAorCTB4MDAwNSwgMHgwMTU2LCAweDAwYzYsIDB4MjA2MSwgMHgxYTQ4LCAweDYwMDAsIDB4ODFmZiwgMHgwMTEwLAorCTB4OTIwNSwgMHgwMDA4LCAweDkyMDQsIDB4NjAwMiwgMHgwMGNlLCAweDAxNWUsIDB4MDAwNSwgMHg2ODAwLAorCTB4ZDA4YywgMHgxMTM4LCAweDY4MDgsIDB4OTAwNSwgMHgwMTIwLCAweDgwMDEsIDB4NjgwYSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMzYsIDB4MDA0NiwgMHgyMGE5LAorCTB4MDAxMCwgMHg5MDA2LCAweDgwMDQsIDB4ODA4NiwgMHg4MThlLCAweDEyMDgsIDB4OTIwMCwgMHgxZjA0LAorCTB4ODRmMywgMHg4MDg2LCAweDgxOGUsIDB4MDA0ZSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDAwNzYsIDB4MDE1NiwgMHgyMGE5LCAweDAwMTAsIDB4OTAwNSwgMHgwMWM4LAorCTB4OTExYSwgMHgxMmI4LCAweDgyMTMsIDB4ODE4ZCwgMHgwMjI4LCAweDkxMWEsIDB4MTIyMCwgMHgxZjA0LAorCTB4ODUwYSwgMHgwMDI4LCAweDkxMWEsIDB4MjMwOCwgMHg4MjEwLCAweDFmMDQsIDB4ODUwYSwgMHgwMDA2LAorCTB4MzIwMCwgMHg5MDg0LCAweGVmZmYsIDB4MjA4MCwgMHgwMDBlLCAweDAxNWUsIDB4MDA3ZSwgMHgwMTJlLAorCTB4MDAwNSwgMHgwMDA2LCAweDMyMDAsIDB4OTA4NSwgMHgxMDAwLCAweDBjYTgsIDB4MDEyNiwgMHgyMDkxLAorCTB4MjgwMCwgMHgyMDc5LCAweDE5YmYsIDB4MDEyZSwgMHgwMGQ2LCAweDIwNjksIDB4MTliZiwgMHg2ODAzLAorCTB4MDAwNSwgMHgwMTU2LCAweDAxNDYsIDB4MDFkNiwgMHgyMGU5LCAweDAwMDAsIDB4MjA2OSwgMHgwMjAwLAorCTB4MDgwYywgMHg5ZWViLCAweDA0MDEsIDB4MDgwYywgMHg5ZWQ2LCAweDAwZTksIDB4MDgwYywgMHg5ZWQ5LAorCTB4MDBkMSwgMHgwODBjLCAweDllZGMsIDB4MDBiOSwgMHgwODBjLCAweDllZGYsIDB4MDBhMSwgMHgwODBjLAorCTB4OWVlMiwgMHgwMDg5LCAweDA4MGMsIDB4OWVlNSwgMHgwMDcxLCAweDA4MGMsIDB4OWVlOCwgMHgwMDU5LAorCTB4MDFkZSwgMHgwMTRlLCAweDAxNWUsIDB4MjA2OSwgMHgwMDA0LCAweDJkMDQsIDB4OTA4NSwgMHg4MDAxLAorCTB4MjA2YSwgMHgwMGRlLCAweDAwMDUsIDB4MjBhOSwgMHgwMDIwLCAweDIwYTEsIDB4MDI0MCwgMHgyMDAxLAorCTB4MDAwMCwgMHg0MDA0LCAweDAwMDUsIDB4MDBjNiwgMHg2MDI3LCAweDAwMDEsIDB4NzgwNCwgMHg5MDg0LAorCTB4MDAwNywgMHgwMDAyLCAweDg1NzQsIDB4ODU5OCwgMHg4NWQ5LCAweDg1N2EsIDB4ODU5OCwgMHg4NTc0LAorCTB4ODU3MiwgMHg4NTcyLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDgzNWEsIDB4MDgwYywgMHg4YzEwLAorCTB4MDBjZSwgMHgwMDA1LCAweDYyYzAsIDB4ODJmZiwgMHgxMTEwLCAweDAwY2UsIDB4MDAwNSwgMHgyMDExLAorCTB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4NzgyOCwgMHg5MDkyLCAweDAwYzgsIDB4MTIyOCwgMHg4MDAwLAorCTB4NzgyYSwgMHgwODBjLCAweDVkZDQsIDB4MGM4OCwgMHg2MmMwLCAweDA4MGMsIDB4OWVlZiwgMHgwODBjLAorCTB4NWQ5NCwgMHg3ODA3LCAweDAwMDMsIDB4NzgyNywgMHgwMDAwLCAweDc4MmIsIDB4MDAwMCwgMHgwYzI4LAorCTB4MDgwYywgMHg4MzVhLCAweDYyMjAsIDB4ZDJhNCwgMHgwMTcwLCAweGQyY2MsIDB4MDE2MCwgMHg3ODJiLAorCTB4MDAwMCwgMHg3ODI0LCAweDkwNjUsIDB4MDkwYywgMHgwZGZhLCAweDIwMDksIDB4MDAxMywgMHgwODBjLAorCTB4YTE1ZCwgMHgwMGNlLCAweDAwMDUsIDB4MDBjNiwgMHg3ODI0LCAweDkwNjUsIDB4MDkwYywgMHgwZGZhLAorCTB4NzgyOCwgMHg5MDkyLCAweGMzNTAsIDB4MTJjMCwgMHg4MDAwLCAweDc4MmEsIDB4MDBjZSwgMHgwODBjLAorCTB4MmFmZSwgMHgwMjc4LCAweDAwYzYsIDB4NzkyNCwgMHgyMTYwLCAweDYwMTAsIDB4OTA2ZCwgMHgwOTBjLAorCTB4MGRmYSwgMHg3ODA3LCAweDAwMDAsIDB4NzgyNywgMHgwMDAwLCAweDAwY2UsIDB4MDgwYywgMHg4YzEwLAorCTB4MGMwMCwgMHgwODBjLCAweDk2MzIsIDB4MDhlOCwgMHgyMDExLCAweDAxMzAsIDB4MjIxNCwgMHgwODBjLAorCTB4OWVlZiwgMHgwODBjLCAweGRjMjgsIDB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4YTE1ZCwgMHgwMGNlLAorCTB4MDg4MCwgMHgyMDAxLCAweDE5ZGIsIDB4MjAwMywgMHgwMDAwLCAweDYyYzAsIDB4ODJmZiwgMHgxMTYwLAorCTB4NzgyYiwgMHgwMDAwLCAweDc4MjQsIDB4OTA2NSwgMHgwOTBjLCAweDBkZmEsIDB4MjAwOSwgMHgwMDEzLAorCTB4MDgwYywgMHhhMWFmLCAweDAwY2UsIDB4MDAwNSwgMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHg3ODI0LAorCTB4OTAwNSwgMHgwOTBjLCAweDBkZmEsIDB4NzgyOCwgMHg5MDkyLCAweGMzNTAsIDB4MTY0OCwgMHg4MDAwLAorCTB4NzgyYSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwODBjLCAweDJhZmUsIDB4MDJmMCwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDc4MWMsIDB4OTA1ZCwgMHgwOTBjLCAweDBkZmEsIDB4YjgwMCwgMHhjMGRjLAorCTB4YjgwMiwgMHg3OTI0LCAweDIxNjAsIDB4MDgwYywgMHhhMGUzLCAweGI5M2MsIDB4ODFmZiwgMHgwOTBjLAorCTB4MGRmYSwgMHg4MTA5LCAweGI5M2UsIDB4NzgwNywgMHgwMDAwLCAweDc4MjcsIDB4MDAwMCwgMHgwMGRlLAorCTB4MDBjZSwgMHgwMGJlLCAweDA4MGMsIDB4OGMxMCwgMHgwODY4LCAweDA4MGMsIDB4OTYzMiwgMHgwODUwLAorCTB4MjAxMSwgMHgwMTMwLCAweDIyMTQsIDB4MDgwYywgMHg5ZWVmLCAweDA4MGMsIDB4ZGMyOCwgMHg3ODI0LAorCTB4OTA2NSwgMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHhhMTVkLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLAorCTB4MDgwNCwgMHg4NWVhLCAweDAwYzYsIDB4MjAwMSwgMHgwMDliLCAweDIwMDQsIDB4ZDBmYywgMHgxOTBjLAorCTB4MWRlYywgMHg2MDI0LCAweDYwMjcsIDB4MDAwMiwgMHhkMGY0LCAweDE1ODAsIDB4NjJjOCwgMHg2MGM0LAorCTB4OTIwNSwgMHgxMTcwLCAweDc4M2MsIDB4OTA2NSwgMHgwMTMwLCAweDIwMDksIDB4MDA0OSwgMHgwODBjLAorCTB4YTE1ZCwgMHgwMGNlLCAweDAwMDUsIDB4MjAxMSwgMHgxOWRlLCAweDIwMTMsIDB4MDAwMCwgMHgwY2M4LAorCTB4NzkzYywgMHg4MWZmLCAweDBkYzAsIDB4Nzk0NCwgMHg5MTkyLCAweDc1MzAsIDB4MTJmMCwgMHg4MTA4LAorCTB4Nzk0NiwgMHg3OTNjLCAweDkxODgsIDB4MDAwOCwgMHgyMTBjLCAweDkxOGUsIDB4MDAwNiwgMHgxMTM4LAorCTB4NjAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDEyLCAweDYwMTYsIDB4MGMxMCwgMHg2MDE0LAorCTB4OTA4NCwgMHgxOTg0LCAweDkwODUsIDB4MDAxNiwgMHg2MDE2LCAweDA4ZDgsIDB4NzkzYywgMHgyMTYwLAorCTB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4YTE1ZCwgMHgwOGEwLCAweDc4NDgsIDB4YzA4NSwgMHg3ODRhLAorCTB4MDg4MCwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLAorCTB4MDAwMCwgMHgyYzA4LCAweDIwNjEsIDB4MTliZiwgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDEwLAorCTB4OTAwNSwgMHgwMTQ4LCAweDkwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMTIsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4NjExNiwgMHg2MTEyLCAweDBjYzAsIDB4MDBkNiwgMHgyMDY5LAorCTB4MTliZiwgMHhiODAwLCAweGQwZDQsIDB4MDE2OCwgMHg2ODIwLCAweDgwMDAsIDB4NjgyMiwgMHg5MDg2LAorCTB4MDAwMSwgMHgxMTEwLCAweDJiMDAsIDB4NjgxZSwgMHgwMGRlLCAweDA4MDQsIDB4OGMxMCwgMHgwMGRlLAorCTB4MDAwNSwgMHhjMGQ1LCAweGI4MDIsIDB4NjgxOCwgMHg5MDA1LCAweDAxNjgsIDB4Yjg1NiwgMHhiODViLAorCTB4MDAwMCwgMHgwMDg2LCAweDAwMDYsIDB4MmIwMCwgMHg2ODFhLCAweDAwOGUsIDB4YTA1YSwgMHgwMDhlLAorCTB4MjA2OSwgMHgxOWJmLCAweDBjMDgsIDB4Yjg1NiwgMHhiODVhLCAweDJiMDAsIDB4NjgxYSwgMHg2ODFlLAorCTB4MDhkOCwgMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLAorCTB4MDAwMCwgMHgyYzA4LCAweDIwNjEsIDB4MTliZiwgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDA4LAorCTB4OTAwNSwgMHgwMTQ4LCAweDkwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMGEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4NjEwZSwgMHg2MTBhLCAweDBjYzAsIDB4MDBjNiwgMHg2MDBmLAorCTB4MDAwMCwgMHgyYzA4LCAweDIwNjEsIDB4MTliZiwgMHg2MDM0LCAweDkwMDUsIDB4MDEzMCwgMHg5MDgwLAorCTB4MDAwMywgMHgyMTAyLCAweDYxMzYsIDB4MDBjZSwgMHgwMDA1LCAweDYxM2EsIDB4NjEzNiwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwYjYsIDB4MDA5NiwgMHgwMDc2LAorCTB4MDA2NiwgMHgwMDU2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MDEyNiwgMHg5MDJlLAorCTB4MjA3MSwgMHgxOWJmLCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHg4NzZkLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkyMDYsIDB4MTkwNCwgMHg4NzY4LAorCTB4ODdmZiwgMHgwMTIwLCAweDYwNTQsIDB4OTEwNiwgMHgxOTA0LCAweDg3NjgsIDB4NzAzYywgMHg5YzA2LAorCTB4MTE3OCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDk5OWQsIDB4NzAzMywgMHgwMDAwLAorCTB4OTAwNiwgMHg3MDNlLCAweDcwNDIsIDB4NzA0NiwgMHg3MDRhLCAweDAwM2UsIDB4MjAyOSwgMHgwMDAxLAorCTB4NzAzOCwgMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjNhLCAweDcwMzQsIDB4OWMzNiwgMHgxMTQwLAorCTB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDM2LCAweDAwMTAsIDB4NzAzNywgMHgwMDAwLAorCTB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LAorCTB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4YmUzNywgMHgwMWYwLCAweDYwMTQsIDB4MjA0OCwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDAzLCAweDE1YjgsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MDkwYywgMHg5Yjc4LAorCTB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDAwMTYsIDB4MDAzNiwgMHgwMDc2LAorCTB4MDgwYywgMHhjMTJkLCAweDA4MGMsIDB4ZGIyZSwgMHgwODBjLCAweDZhZTksIDB4MDA3ZSwgMHgwMDNlLAorCTB4MDAxZSwgMHgwODBjLCAweGMwMjIsIDB4MDgwYywgMHhhMTEzLCAweDAwY2UsIDB4MDgwNCwgMHg4NzA3LAorCTB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg4NzA3LCAweDg1ZmYsIDB4MDEyMCwgMHgwMDM2LAorCTB4MDgwYywgMHg4Y2VkLCAweDAwM2UsIDB4MDEyZSwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLAorCTB4MDA1ZSwgMHgwMDZlLCAweDAwN2UsIDB4MDA5ZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA2LCAweDExNTgsIDB4MDAxNiwgMHgwMDM2LAorCTB4MDA3NiwgMHgwODBjLCAweGRiMmUsIDB4MDgwYywgMHhkODMwLCAweDAwN2UsIDB4MDAzZSwgMHgwMDFlLAorCTB4MDg5MCwgMHg2MDIwLCAweDkwODYsIDB4MDAwYSwgMHgwOTA0LCAweDg3NTIsIDB4MDgwNCwgMHg4NzRiLAorCTB4MDAwNiwgMHgwMDY2LCAweDAwOTYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZjYsIDB4OTAzNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MTliZiwgMHg3ODM4LCAweDkwNjUsIDB4MDkwNCwgMHg4N2VkLAorCTB4NjAwYywgMHgwMDA2LCAweDYwMGYsIDB4MDAwMCwgMHg3ODNjLCAweDljMDYsIDB4MTE2OCwgMHgwMDM2LAorCTB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4OTk5ZCwgMHg3ODMzLCAweDAwMDAsIDB4OTAxZSwgMHg3YjNlLAorCTB4N2I0MiwgMHg3YjQ2LCAweDdiNGEsIDB4MDAzZSwgMHgwODBjLCAweGJlMzcsIDB4MDU0OCwgMHg2MDE0LAorCTB4MjA0OCwgMHg2MDIwLCAweDkwODYsIDB4MDAwMywgMHgxNTkwLCAweDNlMDgsIDB4OTE4ZSwgMHgwMDAyLAorCTB4MTE4OCwgMHg2MDEwLCAweDkwMDUsIDB4MDE3MCwgMHgwMGI2LCAweDIwNTgsIDB4YjgwMCwgMHgwMGJlLAorCTB4ZDBiYywgMHgwMTQwLCAweDYwNDAsIDB4OTAwNSwgMHgxMWE4LCAweDIwMDEsIDB4MTk2MCwgMHgyMDA0LAorCTB4NjA0MiwgMHgwMDgwLCAweDYwMDQsIDB4OTA4NiwgMHgwMDQwLCAweDA5MGMsIDB4OWI3OCwgMHhhODY3LAorCTB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZGMsIDB4MDgwYywgMHhjMDIyLAorCTB4MDgwYywgMHhhMTEzLCAweDAwMGUsIDB4MDgwNCwgMHg4N2E1LCAweDdlM2EsIDB4N2UzNiwgMHgwMTJlLAorCTB4MDBmZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA5ZSwgMHgwMDZlLCAweDAwMGUsIDB4MDAwNSwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA2LCAweDExMTgsIDB4MDgwYywgMHhkODMwLCAweDBjNTAsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwYSwgMHgwOWY4LCAweDA4YjgsIDB4MDAxNiwgMHgwMDI2LCAweDAwODYsIDB4OTA0NiwgMHgwMDk5LAorCTB4MDgwYywgMHg4OGVlLCAweDAwOGUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBmNiwgMHgwMTI2LAorCTB4MjA3OSwgMHgxOWJmLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDg5ODUsIDB4MDgwYywgMHg4YTE1LAorCTB4MDEyZSwgMHgwMGZlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDk2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDBjNiwgMHgwMDY2LCAweDAwMTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4MTliZiwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA5MDQsIDB4ODhiMywgMHg2MDEwLAorCTB4MjA1OCwgMHhiOGEwLCAweDkyMDYsIDB4MTkwNCwgMHg4OGFlLCAweDg4ZmYsIDB4MDEyMCwgMHg2MDU0LAorCTB4OTEwNiwgMHgxOTA0LCAweDg4YWUsIDB4NzAyNCwgMHg5YzA2LCAweDE1NjgsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjgyMCwgMHhkMGE0LCAweDAxMTAsIDB4ZDBjYywgMHgxNTA4LCAweDA4MGMsIDB4ODM1YSwgMHgwODBjLAorCTB4OTY1NiwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg5Yjc4LCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LAorCTB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLAorCTB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDAwMjgsIDB4NjAwMywgMHgwMDA5LAorCTB4NjMwYSwgMHgwODA0LCAweDg4YWUsIDB4NzAxNCwgMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjE2LAorCTB4NzAxMCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDEyLAorCTB4MDAxMCwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLAorCTB4YmUzNywgMHgwMWU4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLCAweDE1ODAsIDB4MDgwYywgMHhjMDNmLAorCTB4MTExOCwgMHgwODBjLCAweGFhODEsIDB4MDA5OCwgMHhhODY3LCAweDAxMDMsIDB4YWI3YSwgMHhhODc3LAorCTB4MDAwMCwgMHgwMDE2LCAweDAwMzYsIDB4MDA4NiwgMHgwODBjLCAweGMxMmQsIDB4MDgwYywgMHhkYjJlLAorCTB4MDgwYywgMHg2YWU5LCAweDAwOGUsIDB4MDAzZSwgMHgwMDFlLCAweDA4MGMsIDB4YzAyMiwgMHgwODBjLAorCTB4YTExMywgMHgwODBjLCAweDlhNGUsIDB4MDBjZSwgMHgwODA0LCAweDg4MmMsIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweDg4MmMsIDB4MDEyZSwgMHgwMDBlLCAweDAwMWUsIDB4MDA2ZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwNiwgMHgxMTU4LCAweDAwMTYsIDB4MDAzNiwgMHgwMDg2LCAweDA4MGMsIDB4ZGIyZSwgMHgwODBjLAorCTB4ZDgzMCwgMHgwMDhlLCAweDAwM2UsIDB4MDAxZSwgMHgwOGQwLCAweDA4MGMsIDB4YWE4MSwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDAyLCAweDExNjAsIDB4NjAwNCwgMHgwMDA2LCAweDkwODYsIDB4MDA4NSwgMHgwMDBlLAorCTB4MDkwNCwgMHg4ODk0LCAweDkwODYsIDB4MDA4YiwgMHgwOTA0LCAweDg4OTQsIDB4MDg0MCwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA1LCAweDE5MjAsIDB4NjAwNCwgMHgwMDA2LCAweDkwODYsIDB4MDA4NSwgMHgwMDBlLAorCTB4MDljOCwgMHg5MDg2LCAweDAwOGIsIDB4MDliMCwgMHgwODA0LCAweDg4YTcsIDB4MDBiNiwgMHgwMGE2LAorCTB4MDA5NiwgMHgwMGM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4OTI4MCwgMHgxMDAwLAorCTB4MjAwNCwgMHg5MDVkLCAweDA5MDQsIDB4ODk3ZSwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMDY2LAorCTB4MjA3MSwgMHgxOWJmLCAweGJlNTQsIDB4NzAxOCwgMHg5YjA2LCAweDExMDgsIDB4NzYxYSwgMHg3MDFjLAorCTB4OWIwNiwgMHgxMTMwLCAweDg2ZmYsIDB4MTExOCwgMHg3MDE4LCAweDcwMWUsIDB4MDAwOCwgMHg3NjFlLAorCTB4Yjg1OCwgMHg5MDRkLCAweDAxMDgsIDB4YWU1NiwgMHg5NmQ1LCAweDAwMDAsIDB4MDExMCwgMHgyOTAwLAorCTB4YjA1YSwgMHhiODU3LCAweDAwMDAsIDB4Yjg1YiwgMHgwMDAwLCAweGI4MDAsIDB4YzBkNCwgMHhjMGRjLAorCTB4YjgwMiwgMHgwODBjLCAweDYzZDIsIDB4MDkwNCwgMHg4OTdhLCAweDc2MjQsIDB4ODZmZiwgMHgwOTA0LAorCTB4ODk2OSwgMHg5NjgwLCAweDAwMDUsIDB4MjAwNCwgMHg5OTA2LCAweDE1ZDgsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDEwMCwgMHg2OGMwLCAweDkwMDUsIDB4MDU2MCwgMHgwODBjLCAweDgzNWEsIDB4MDgwYywgMHg5NjU2LAorCTB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LAorCTB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLAorCTB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LAorCTB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMGRlLCAweDAwYzYsIDB4YjgzYywgMHg5MDA1LAorCTB4MDExMCwgMHg4MDAxLCAweGI4M2UsIDB4MjY2MCwgMHgwODBjLCAweGExMTMsIDB4MDBjZSwgMHgwMDQ4LAorCTB4MDBkZSwgMHgwMGM2LCAweDI2NjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwODA0LAorCTB4ODkyMSwgMHg4OWZmLCAweDAxNTgsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLAorCTB4MDgwYywgMHhjMTJkLCAweDA4MGMsIDB4ZGIyZSwgMHgwODBjLCAweDZhZTksIDB4MDgwYywgMHg5YTRlLAorCTB4MDgwNCwgMHg4OTIxLCAweDAwNmUsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDBjZSwgMHgwMDllLCAweDAwYWUsIDB4MDBiZSwgMHgwMDA1LCAweDAwOTYsIDB4MDAwNiwgMHgwMDY2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDkwMzYsIDB4NzgxNCwgMHg5MDY1LCAweDA5MDQsIDB4ODllOCwgMHg2MDBjLAorCTB4MDAwNiwgMHg2MDBmLCAweDAwMDAsIDB4NzgyNCwgMHg5YzA2LCAweDE1ODAsIDB4MjA2OSwgMHgwMTAwLAorCTB4NjgyMCwgMHhkMGE0LCAweDAxMTAsIDB4ZDBjYywgMHgxNTA4LCAweDA4MGMsIDB4ODM1YSwgMHgwODBjLAorCTB4OTY1NiwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg5Yjc4LCAweDc4MjcsIDB4MDAwMCwgMHgwMDM2LAorCTB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLAorCTB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDAwNDAsIDB4MDgwYywgMHg2Nzc5LAorCTB4MTUyMCwgMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgyYzMwLCAweDAwZjgsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhiZTM1LCAweDAxYjAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTUwOCwgMHgwODBjLAorCTB4YzAzZiwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwMDYwLCAweDA4MGMsIDB4Njc3OSwgMHgxMTY4LAorCTB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmFlOSwgMHgwODBjLAorCTB4YzAyMiwgMHgwODBjLCAweGExMTMsIDB4MDgwYywgMHg5YTRlLCAweDAwMGUsIDB4MDgwNCwgMHg4OThjLAorCTB4N2UxNiwgMHg3ZTEyLCAweDAwZGUsIDB4MDBjZSwgMHgwMDZlLCAweDAwMGUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MTExOCwgMHgwODBjLCAweGQ4MzAsIDB4MGM1MCwgMHgwODBjLAorCTB4YWE4MSwgMHg2MDIwLCAweDkwODYsIDB4MDAwMiwgMHgxMTUwLCAweDYwMDQsIDB4MDAwNiwgMHg5MDg2LAorCTB4MDA4NSwgMHgwMDBlLCAweDA5OTAsIDB4OTA4NiwgMHgwMDhiLCAweDA5NzgsIDB4MDhkMCwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA1LCAweDE5YjAsIDB4NjAwNCwgMHgwMDA2LCAweDkwODYsIDB4MDA4NSwgMHgwMDBlLAorCTB4MGQxOCwgMHg5MDg2LCAweDAwOGIsIDB4MGQwMCwgMHgwODYwLCAweDAwMDYsIDB4MDA2NiwgMHgwMDk2LAorCTB4MDBiNiwgMHgwMGM2LCAweDAwZDYsIDB4NzgxOCwgMHg5MDVkLCAweDA5MDQsIDB4OGE5NSwgMHhiODU0LAorCTB4MDAwNiwgMHg5MDA2LCAweGI4NTYsIDB4Yjg1YSwgMHhiODAwLCAweGMwZDQsIDB4YzBkYywgMHhiODAyLAorCTB4MDgwYywgMHg2M2QyLCAweDA5MDQsIDB4OGE5MiwgMHg3ZTI0LCAweDg2ZmYsIDB4MDkwNCwgMHg4YTg1LAorCTB4OTY4MCwgMHgwMDA1LCAweDIwMDQsIDB4OTkwNiwgMHgxOTA0LCAweDhhODUsIDB4MDBkNiwgMHgyMDY5LAorCTB4MDEwMCwgMHg2OGMwLCAweDkwMDUsIDB4MDkwNCwgMHg4YTdjLCAweDA4MGMsIDB4ODM1YSwgMHgwODBjLAorCTB4OTY1NiwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg5Yjc4LCAweDc4MjcsIDB4MDAwMCwgMHgwMDM2LAorCTB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLCAweDAxMzgsIDB4MjAwMSwgMHgwMTAwLAorCTB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDAwZGUsIDB4MDBjNiwgMHgzZTA4LAorCTB4OTE4ZSwgMHgwMDAyLCAweDExNjgsIDB4YjgwMCwgMHhkMGJjLCAweDAxNTAsIDB4OTY4MCwgMHgwMDEwLAorCTB4MjAwYywgMHg4MWZmLCAweDE1MTgsIDB4MjAwOSwgMHgxOTYwLCAweDIxMGMsIDB4MjEwMiwgMHgwMGYwLAorCTB4YjgzYywgMHg5MDA1LCAweDAxMTAsIDB4ODAwMSwgMHhiODNlLCAweDI2NjAsIDB4NjAwZiwgMHgwMDAwLAorCTB4MDgwYywgMHhhMTEzLCAweDAwY2UsIDB4MDA0OCwgMHgwMGRlLCAweDAwYzYsIDB4MjY2MCwgMHg2MDAzLAorCTB4MDAwOSwgMHg2MzBhLCAweDAwY2UsIDB4MDgwNCwgMHg4YTI4LCAweDg5ZmYsIDB4MDEzOCwgMHhhODY3LAorCTB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZTksIDB4MDgwYywgMHg5YTRlLAorCTB4MDgwNCwgMHg4YTI4LCAweDAwMGUsIDB4MDgwNCwgMHg4YTFjLCAweDc4MWUsIDB4NzgxYSwgMHgwMGRlLAorCTB4MDBjZSwgMHgwMGJlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LAorCTB4MDA5NiwgMHgwMDY2LCAweGI4MDAsIDB4ZDBkYywgMHgwMWEwLCAweGI4NGMsIDB4OTA0ZCwgMHgwMTg4LAorCTB4YTg3OCwgMHg5NjA2LCAweDExNzAsIDB4MjA3MSwgMHgxOWJmLCAweDcwMjQsIDB4OTAzNSwgMHgwMTQ4LAorCTB4OTA4MCwgMHgwMDA1LCAweDIwMDQsIDB4OTkwNiwgMHgxMTIwLCAweGI4MDAsIDB4YzBkYywgMHhiODAyLAorCTB4MDAyOSwgMHgwMDZlLCAweDAwOWUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LAorCTB4MDEwMCwgMHg3OGMwLCAweDkwMDUsIDB4MTEzOCwgMHgwMGM2LCAweDI2NjAsIDB4NjAwMywgMHgwMDA5LAorCTB4NjMwYSwgMHgwMGNlLCAweDA0YjgsIDB4MDgwYywgMHg5NjU2LCAweDc4YzMsIDB4MDAwMCwgMHgwODBjLAorCTB4OWI3OCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDc5LCAweDAxNDAsIDB4N2IwNCwgMHg5Mzg0LAorCTB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLCAweDJjODgsIDB4OTAwNiwgMHgwODBjLAorCTB4MmM4OCwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NzgyNywgMHgwMDAxLAorCTB4MDgwYywgMHg5Yjc4LCAweDAwM2UsIDB4MDgwYywgMHg2M2QyLCAweDAwYzYsIDB4YjgzYywgMHg5MDA1LAorCTB4MDExMCwgMHg4MDAxLCAweGI4M2UsIDB4MjY2MCwgMHgwODBjLCAweGEwZTMsIDB4MDBjZSwgMHhhODY3LAorCTB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweGMxMmQsIDB4MDgwYywgMHg2YWU5LAorCTB4MDgwYywgMHg5YTRlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDBjNiwgMHgyMDExLAorCTB4MDEwMSwgMHgyMjA0LCAweGMwYzQsIDB4MjAxMiwgMHgyMDAxLCAweDE4MGMsIDB4MjAxNCwgMHhjMmU0LAorCTB4MjIwMiwgMHgyMDcxLCAweDE5YmYsIDB4NzAwNCwgMHg5MDg0LCAweDAwMDcsIDB4MDAwMiwgMHg4YjIxLAorCTB4OGIyNSwgMHg4YjQzLCAweDhiNmMsIDB4OGJhYSwgMHg4YjIxLCAweDhiM2MsIDB4OGIxZiwgMHgwODBjLAorCTB4MGRmYSwgMHgwMGNlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDcwMjQsIDB4OTA2NSwgMHgwMTQ4LAorCTB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4NjAwYywgMHg5MDE1LCAweDAxNTgsIDB4NzIxNiwgMHg2MDBmLAorCTB4MDAwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwgMHgwMGJlLAorCTB4MDAwNSwgMHg3MjE2LCAweDcyMTIsIDB4MGNhOCwgMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLAorCTB4NzAyMCwgMHg5MDA1LCAweDAwNzAsIDB4NjAxMCwgMHgyMDU4LCAweDA4MGMsIDB4NjNkMiwgMHhiODAwLAorCTB4YzBkYywgMHhiODAyLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsIDB4NzAyMCwgMHg4MDAxLAorCTB4NzAyMiwgMHgxMTQ4LCAweDIwMDEsIDB4MTgwYywgMHgyMDE0LCAweGQyZWMsIDB4MTE4MCwgMHgwMGNlLAorCTB4MDBlZSwgMHgwMGJlLCAweDAwMDUsIDB4Yjg1NCwgMHg5MDE1LCAweDAxMjAsIDB4NzIxZSwgMHgwODBjLAorCTB4OGMxMCwgMHgwY2E4LCAweDcyMTgsIDB4NzIxZSwgMHgwODBjLCAweDhjMTAsIDB4MGM4MCwgMHhjMmVjLAorCTB4MjIwMiwgMHgwODBjLCAweDhjZWQsIDB4MGM1OCwgMHg3MDI0LCAweDkwNjUsIDB4MDViOCwgMHg3MDBjLAorCTB4OWMwNiwgMHgxMTYwLCAweDA4MGMsIDB4OWE0ZSwgMHg2MDBjLCAweDkwMTUsIDB4MDEyMCwgMHg3MjBlLAorCTB4NjAwZiwgMHgwMDAwLCAweDA0NDgsIDB4NzIwZSwgMHg3MjBhLCAweDA0MzAsIDB4NzAxNCwgMHg5YzA2LAorCTB4MTE2MCwgMHgwODBjLCAweDlhNGUsIDB4NjAwYywgMHg5MDE1LCAweDAxMjAsIDB4NzIxNiwgMHg2MDBmLAorCTB4MDAwMCwgMHgwMGQwLCAweDcyMTYsIDB4NzIxMiwgMHgwMGI4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDAzLAorCTB4MTE5OCwgMHg2MDEwLCAweDIwNTgsIDB4MDgwYywgMHg2M2QyLCAweGI4MDAsIDB4YzBkYywgMHhiODAyLAorCTB4MDgwYywgMHg5YTRlLCAweDcwMWMsIDB4OTA2NSwgMHgwMTM4LCAweGI4NTQsIDB4OTAxNSwgMHgwMTEwLAorCTB4NzIxZSwgMHgwMDEwLCAweDcyMTgsIDB4NzIxZSwgMHg3MDI3LCAweDAwMDAsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDBiZSwgMHgwMDA1LCAweDcwMjQsIDB4OTA2NSwgMHgwMTQwLCAweDA4MGMsIDB4OWE0ZSwgMHg2MDBjLAorCTB4OTAxNSwgMHgwMTU4LCAweDcyMGUsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwMGNlLCAweDAwZWUsIDB4MDBiZSwgMHgwMDA1LCAweDcyMGUsIDB4NzIwYSwgMHgwY2E4LAorCTB4MDBkNiwgMHgyMDY5LCAweDE5YmYsIDB4NjgzMCwgMHg5MDg0LCAweDAwMDMsIDB4MDAwMiwgMHg4YmNkLAorCTB4OGJjZiwgMHg4YmYzLCAweDhiY2IsIDB4MDgwYywgMHgwZGZhLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LAorCTB4Njg0MCwgMHg5MDg2LCAweDAwMDEsIDB4MDFiOCwgMHg2ODNjLCAweDkwNjUsIDB4MDEzMCwgMHg2MDBjLAorCTB4OTAxNSwgMHgwMTcwLCAweDZhM2EsIDB4NjAwZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLAorCTB4MDAwMCwgMHgyMDExLCAweDE5ZGUsIDB4MjAxMywgMHgwMDAwLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LAorCTB4NjgzYSwgMHg2ODM2LCAweDBjOTAsIDB4Njg0MywgMHgwMDAwLCAweDY4MzgsIDB4OTA2NSwgMHgwZDY4LAorCTB4NjAwMywgMHgwMDAzLCAweDBjNTAsIDB4MDBjNiwgMHg5MDA2LCAweDY4NDIsIDB4Njg0NiwgMHg2ODRhLAorCTB4NjgzYywgMHg5MDY1LCAweDAxNjAsIDB4NjAwYywgMHg5MDE1LCAweDAxMzAsIDB4NmEzYSwgMHg2MDBmLAorCTB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MDAxOCwgMHg2ODNlLCAweDY4M2EsIDB4NjgzNiwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLCAweGMxZTUsIDB4MjEwMiwgMHgwMDA1LAorCTB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFlYywgMHgwMTIwLCAweGMxZWMsIDB4MjEwMiwgMHgwODBjLAorCTB4OGNlZCwgMHgyMDAxLCAweDE5Y2IsIDB4MjAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MGQ1OCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgxOWJmLCAweDY4MDQsIDB4OTA4NCwgMHgwMDA3LCAweDAwMDIsIDB4OGMzMCwgMHg4Y2Q1LAorCTB4OGNkNSwgMHg4Y2Q1LCAweDhjZDUsIDB4OGNkNywgMHg4Y2Q1LCAweDhjMmUsIDB4MDgwYywgMHgwZGZhLAorCTB4NjgyMCwgMHg5MDA1LCAweDExMTAsIDB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4NjgwYywgMHg5MDY1LAorCTB4MDE1MCwgMHg2ODA3LCAweDAwMDQsIDB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg4ZDQ0LAorCTB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgxNCwgMHg5MDY1LCAweDAxNTAsIDB4NjgwNywgMHgwMDAxLAorCTB4NjgyNiwgMHg2ODJiLCAweDAwMDAsIDB4MDgwYywgMHg4ZDQ0LCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMGU2LCAweDZhMWMsIDB4OTJkZCwgMHgwMDAwLCAweDA5MDQsIDB4OGNiZiwgMHhiODRjLAorCTB4OTAwZCwgMHgwMTE4LCAweGI4ODgsIDB4OTAwNSwgMHgwMWEwLCAweGI4NTQsIDB4OTA1ZCwgMHgwMTIwLAorCTB4OTIwZSwgMHgwOTA0LCAweDhjYmYsIDB4MDAyOCwgMHg2ODE4LCAweDkyMGUsIDB4MDkwNCwgMHg4Y2JmLAorCTB4MjA1OCwgMHhiODRjLCAweDkwMGQsIDB4MGQ4OCwgMHhiODg4LCAweDkwMDUsIDB4MWQ3MCwgMHgyYjAwLAorCTB4NjgxZSwgMHhiYjNjLCAweGI4MzgsIDB4OTMwMiwgMHgxZTQwLCAweDA4MGMsIDB4YTBiYSwgMHgwOTA0LAorCTB4OGNiZiwgMHg4MzE4LCAweGJiM2UsIDB4NjExNiwgMHgyYjEwLCAweDYyMTIsIDB4MDA5NiwgMHgyMTQ4LAorCTB4YTg4MCwgMHg5MDg0LCAweDAwZmYsIDB4NjA1ZSwgMHhhODgzLCAweDAwMDAsIDB4YTg4NCwgMHgwMDllLAorCTB4OTA4YSwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LCAweDgwMDMsIDB4ODAxYiwgMHg4MzFiLAorCTB4OTMxOCwgMHg2MzFhLCAweDYxMTQsIDB4MDA5NiwgMHgyMTQ4LCAweGE5NjQsIDB4MDA5ZSwgMHg5MThjLAorCTB4MDBmZiwgMHg5MThlLCAweDAwNDgsIDB4MDUzOCwgMHgwMGY2LCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLAorCTB4YmFiMCwgMHg2MjlhLCAweDIwNjksIDB4MDIwMCwgMHgyMDcxLCAweDAyNDAsIDB4MDgwYywgMHg5Mjg2LAorCTB4MjA2OSwgMHgxOWJmLCAweGJiMDAsIDB4YzNkZCwgMHhiYjAyLCAweDY4MDcsIDB4MDAwMiwgMHgyZjE4LAorCTB4NmIyNiwgMHg2ODJiLCAweDAwMDAsIDB4NzgyMywgMHgwMDAzLCAweDc4MDMsIDB4MDAwMSwgMHg3ODA3LAorCTB4MDA0MCwgMHgwMGZlLCAweDAwZWUsIDB4MDBiZSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGVlLAorCTB4MDBiZSwgMHgwMGNlLCAweDBjZDAsIDB4NjgwNywgMHgwMDA2LCAweDJjMTgsIDB4NmIyNiwgMHg2ODIwLAorCTB4ODAwMSwgMHg2ODIyLCAweDY4MmIsIDB4MDAwMCwgMHgwODBjLCAweDYzZDIsIDB4MDgwYywgMHg5ZjBmLAorCTB4MDBlZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LAorCTB4NjgwYywgMHg5MDY1LCAweDAxMzgsIDB4NjgwNywgMHgwMDA0LCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLAorCTB4MDgwYywgMHg4ZDQ0LCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwYywgMHgyMDE0LAorCTB4YzJlZCwgMHgyMjAyLCAweDAwZGUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBkNiwgMHgyMDY5LAorCTB4MTliZiwgMHg2ODMwLCAweDkwODYsIDB4MDAwMCwgMHgxNTQ4LCAweDIwMDEsIDB4MTgwYywgMHgyMDE0LAorCTB4ZDJlNCwgMHgwMTMwLCAweGMyZTQsIDB4MjIwMiwgMHgwODBjLCAweDhjMWYsIDB4MjA2OSwgMHgxOWJmLAorCTB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4ZDFjNCwgMHgxMWUwLCAweDY4MzgsIDB4OTA3ZCwgMHgwMWIwLAorCTB4NmEwNCwgMHg5Mjk2LCAweDAwMDAsIDB4MTU2OCwgMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwgMHg2ODQ3LAorCTB4MDAwMCwgMHg2ODRiLCAweDAwMDAsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsIDB4MjQwMCwgMHgwMDJlLAorCTB4MDgwYywgMHgxYjhhLCAweDExNTgsIDB4MDEyZSwgMHgwODBjLCAweDk0YjMsIDB4MDBkZSwgMHgwMGZlLAorCTB4MDAwNSwgMHhjMWM0LCAweDIxMDIsIDB4MDgwYywgMHg3MmQyLCAweDA4ZjgsIDB4MDEyZSwgMHg2ODQzLAorCTB4MDAwMCwgMHg3ODAzLCAweDAwMDIsIDB4NzgwYywgMHg5MDE1LCAweDAxNDAsIDB4NmEzYSwgMHg3ODBmLAorCTB4MDAwMCwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDBjNDAsIDB4NjgzYSwgMHg2ODM2LAorCTB4MGNjMCwgMHg2YTA0LCAweDkyOTYsIDB4MDAwNiwgMHgxOTA0LCAweDhjZTUsIDB4NmEzMCwgMHg5Mjk2LAorCTB4MDAwMCwgMHgwOTUwLCAweDA4MDQsIDB4OGNlNSwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDBiLAorCTB4MDAwNSwgMHg4ZDU4LCAweDhkNWQsIDB4OTFiNiwgMHg5MjRmLCAweDhkNWQsIDB4OTFiNiwgMHg5MjRmLAorCTB4OGQ1OCwgMHg4ZDVkLCAweDhkNTgsIDB4OGQ1OCwgMHg4ZDU4LCAweDhkNTgsIDB4OGQ1OCwgMHg4ZDU4LAorCTB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDAwYjYsIDB4MDE1NiwgMHgwMTM2LAorCTB4MDE0NiwgMHgwMWM2LCAweDAxZDYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDY5LAorCTB4MDIwMCwgMHgyMDcxLCAweDAyNDAsIDB4NjAwNCwgMHg5MDhhLCAweDAwNTMsIDB4MWEwYywgMHgwZGZhLAorCTB4NjExMCwgMHgyMTU4LCAweGI5YjAsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHg5MDhhLAorCTB4MDA0MCwgMHgxYTA0LCAweDhkYzksIDB4MDA1YiwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDFkZSwgMHgwMWNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwYmUsIDB4MDAwNSwgMHg4ZjQwLAorCTB4OGY3YiwgMHg4ZmE0LCAweDkwNDcsIDB4OTA2OCwgMHg5MDZlLCAweDkwN2IsIDB4OTA4MywgMHg5MDhmLAorCTB4OTA5NSwgMHg5MGE2LCAweDkwOTUsIDB4OTBmZCwgMHg5MDgzLCAweDkxMDksIDB4OTEwZiwgMHg5MDhmLAorCTB4OTEwZiwgMHg5MTFiLCAweDhkYzcsIDB4OGRjNywgMHg4ZGM3LCAweDhkYzcsIDB4OGRjNywgMHg4ZGM3LAorCTB4OGRjNywgMHg4ZGM3LCAweDhkYzcsIDB4OGRjNywgMHg4ZGM3LCAweDk4NTQsIDB4OTg3NywgMHg5ODg4LAorCTB4OThhOCwgMHg5OGRhLCAweDkwN2IsIDB4OGRjNywgMHg5MDdiLCAweDkwOTUsIDB4OGRjNywgMHg4ZmE0LAorCTB4OTA0NywgMHg4ZGM3LCAweDljNmYsIDB4OTA5NSwgMHg4ZGM3LCAweDljOGIsIDB4OTA5NSwgMHg4ZGM3LAorCTB4OTA4ZiwgMHg4ZjNhLCAweDhkZWEsIDB4OGRjNywgMHg5Y2E3LCAweDlkMTQsIDB4OWRlZiwgMHg4ZGM3LAorCTB4OWRmYywgMHg5MDc4LCAweDllMjcsIDB4OGRjNywgMHg5OGU0LCAweDllNTQsIDB4OGRjNywgMHgwODBjLAorCTB4MGRmYSwgMHgyMTAwLCAweDAwNWIsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMWRlLAorCTB4MDFjZSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGJlLCAweDAwMDUsIDB4OGRlOCwgMHg4ZGU4LAorCTB4OGRlOCwgMHg4ZTExLCAweDhlYmQsIDB4OGVjOCwgMHg4ZGU4LCAweDhkZTgsIDB4OGRlOCwgMHg4ZjBmLAorCTB4OGYxYiwgMHg4ZTJjLCAweDhkZTgsIDB4OGU0NywgMHg4ZTdiLCAweDlmZDYsIDB4YTAxYiwgMHg5MDk1LAorCTB4MDgwYywgMHgwZGZhLCAweDAwZDYsIDB4MDA5NiwgMHgwODBjLCAweDkxMmUsIDB4NzAwMywgMHgyNDE0LAorCTB4NzAwNywgMHgwMDE4LCAweDcwMGIsIDB4MDgwMCwgMHg3ODE0LCAweDIwNDgsIDB4YTgzYywgMHg3MDBlLAorCTB4YTg1MCwgMHg3MDIyLCAweGE4NTQsIDB4NzAyNiwgMHg2MGMzLCAweDAwMTgsIDB4MDgwYywgMHg5NjJhLAorCTB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4NzgxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhhMCwgMHgwMGJlLAorCTB4MDgwYywgMHhhMDYyLCAweDExMTgsIDB4OTA4NCwgMHhmZjgwLCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4MDUwMCwgMHg3ODE0LAorCTB4MjA0OCwgMHhhODc0LCAweDcwMGEsIDB4YTg3OCwgMHg3MDBlLCAweGE4N2MsIDB4NzAxMiwgMHhhODgwLAorCTB4NzAxNiwgMHhhODg0LCAweDcwMWEsIDB4YTg4OCwgMHg3MDFlLCAweDYwYzMsIDB4MDAxMCwgMHgwODBjLAorCTB4OTYyYSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDAwOTYsIDB4MDgwYywgMHg5MTJlLAorCTB4NzAwMywgMHgwNTAwLCAweDc4MTQsIDB4MjA0OCwgMHhhOGNjLCAweDcwMGEsIDB4YThkMCwgMHg3MDBlLAorCTB4YThkNCwgMHg3MDEyLCAweGE4ZDgsIDB4NzAxNiwgMHhhOGRjLCAweDcwMWEsIDB4YThlMCwgMHg3MDFlLAorCTB4NjBjMywgMHgwMDEwLCAweDA4MGMsIDB4OTYyYSwgMHgwMDllLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDA5NiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDkxMmUsIDB4MjBlOSwgMHgwMDAwLAorCTB4MjAwMSwgMHgxOTdiLCAweDIwMDMsIDB4MDAwMCwgMHg3ODE0LCAweDIwNDgsIDB4YTgxNCwgMHg4MDAzLAorCTB4NjBjMiwgMHhhODMwLCAweDIwYTgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLAorCTB4MjA5OCwgMHgyMDAxLCAweDE5N2IsIDB4MDAxNiwgMHgyMDBjLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4MjJlZiwgMHgwODBjLCAweGNiNjksIDB4OTAwNiwgMHgwODBjLCAweDIyZWYsIDB4MDAxZSwgMHhhODA0LAorCTB4OTAwNSwgMHgwMTEwLCAweDIwNDgsIDB4MGMyOCwgMHgwNGQ5LCAweDA4MGMsIDB4OTYyYSwgMHgwMTJlLAorCTB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDk2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg5MTc5LCAweDIwZTksIDB4MDAwMCwgMHgyMDAxLCAweDE5N2IsIDB4MjAwMywgMHgwMDAwLAorCTB4NzgxNCwgMHgyMDQ4LCAweGE4NmYsIDB4MDIwMCwgMHhhODczLCAweDAwMDAsIDB4YTgxNCwgMHg4MDAzLAorCTB4NjBjMiwgMHhhODMwLCAweDIwYTgsIDB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDFiLAorCTB4MjA5OCwgMHgyMDAxLCAweDE5N2IsIDB4MDAxNiwgMHgyMDBjLCAweDA4MGMsIDB4Y2I2OSwgMHgwMDFlLAorCTB4YTgwNCwgMHg5MDA1LCAweDAxMTAsIDB4MjA0OCwgMHgwYzYwLCAweDAwNTEsIDB4NzgxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHgwZmUzLCAweDA4MGMsIDB4OTYyYSwgMHgwMTJlLCAweDAwOWUsIDB4MDBkZSwgMHgwMDA1LAorCTB4NjBjMCwgMHg4MDA0LCAweDkwODQsIDB4MDAwMywgMHg5MDA1LCAweDAxMzAsIDB4OTA4MiwgMHgwMDA0LAorCTB4MjBhMywgMHgwMDAwLCAweDgwMDAsIDB4MWRlMCwgMHgwMDA1LCAweDA4MGMsIDB4OTEyZSwgMHg3MDAzLAorCTB4NzgwMCwgMHg3ODA4LCAweDgwMDcsIDB4NzAwYSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDBkNiwgMHgwMGU2LCAweDA4MGMsIDB4OTE3OSwgMHg3ODE0LCAweDkwODQsIDB4ZmYwMCwgMHgyMDczLAorCTB4MDIwMCwgMHg4ZTcwLCAweDhlNzAsIDB4OTA5NSwgMHgwMDEwLCAweDIyNzIsIDB4OGU3MCwgMHgyMDczLAorCTB4MDAzNCwgMHg4ZTcwLCAweDIwNjksIDB4MTgwNSwgMHgyMGE5LCAweDAwMDQsIDB4MmQ3NiwgMHg4ZDY4LAorCTB4OGU3MCwgMHgxZjA0LCAweDhlZGUsIDB4MjA2OSwgMHgxODAxLCAweDIwYTksIDB4MDAwNCwgMHgyZDc2LAorCTB4OGQ2OCwgMHg4ZTcwLCAweDFmMDQsIDB4OGVlNywgMHgyMDY5LCAweDE5OGIsIDB4OTA4NiwgMHhkZjAwLAorCTB4MDExMCwgMHgyMDY5LCAweDE5YTUsIDB4MjBhOSwgMHgwMDFhLCAweDllODYsIDB4MDI2MCwgMHgxMTQ4LAorCTB4MDBjNiwgMHgyMDYxLCAweDAyMDAsIDB4NjAxMCwgMHg4MDAwLCAweDYwMTIsIDB4MDBjZSwgMHgyMDcxLAorCTB4MDI0MCwgMHgyZDA0LCAweDgwMDcsIDB4MjA3MiwgMHg4ZDY4LCAweDhlNzAsIDB4MWYwNCwgMHg4ZWY1LAorCTB4NjBjMywgMHgwMDRjLCAweDA4MGMsIDB4OTYyYSwgMHgwMGVlLCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLAorCTB4OTEyZSwgMHg3MDAzLCAweDYzMDAsIDB4NzAwNywgMHgwMDI4LCAweDc4MDgsIDB4NzAwZSwgMHg2MGMzLAorCTB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDgwYywgMHg5MTc5LAorCTB4NzAwMywgMHgwMjAwLCAweDc4MTQsIDB4NzAwZSwgMHgwMGU2LCAweDllZjAsIDB4MDAwNCwgMHgyMDA5LAorCTB4MDAwMSwgMHgyMDExLCAweDAwMGMsIDB4MjA3MywgMHgwODAwLCAweDhlNzAsIDB4MjA3MywgMHgwMDAwLAorCTB4MDBlZSwgMHg3MjA2LCAweDcxMGEsIDB4NjJjMiwgMHgwODBjLCAweDk2MmEsIDB4MDAxZSwgMHgwMDJlLAorCTB4MDBkZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgxNywgMHgyMDA0LCAweDYwOWEsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4NTIwMCwgMHgyMDY5LCAweDE4NWIsIDB4NjgwNCwgMHhkMDg0LAorCTB4MDEzMCwgMHg2ODI4LCAweDAwMTYsIDB4MDgwYywgMHgyN2ExLCAweDcxMGUsIDB4MDAxZSwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLAorCTB4MDI1MCwgMHg0MDAzLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweDE4MDEsIDB4MjBhMSwgMHgwMjU0LAorCTB4NDAwMywgMHgwODBjLCAweGEwNjIsIDB4MTEyMCwgMHhiOGEwLCAweDkwODIsIDB4MDA3ZiwgMHgwMjQ4LAorCTB4MjAwMSwgMHgxODFlLCAweDIwMDQsIDB4NzAzMiwgMHgyMDAxLCAweDE4MWYsIDB4MjAwNCwgMHg3MDM2LAorCTB4MDAzMCwgMHgyMDAxLCAweDE4MTcsIDB4MjAwNCwgMHg5MDg0LCAweDAwZmYsIDB4NzAzNiwgMHg2MGMzLAorCTB4MDAxYywgMHgwODA0LCAweDk2MmEsIDB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4MDUwMCwgMHgwODBjLAorCTB4YTA2MiwgMHgxMTIwLCAweGI4YTAsIDB4OTA4MiwgMHgwMDdmLCAweDAyNDgsIDB4MjAwMSwgMHgxODFlLAorCTB4MjAwNCwgMHg3MDBhLCAweDIwMDEsIDB4MTgxZiwgMHgyMDA0LCAweDcwMGUsIDB4MDAzMCwgMHgyMDAxLAorCTB4MTgxNywgMHgyMDA0LCAweDkwODQsIDB4MDBmZiwgMHg3MDBlLCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLAorCTB4MDAwMSwgMHgyMDk5LCAweDE4MDUsIDB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1MCwgMHg0MDAzLAorCTB4NjBjMywgMHgwMDEwLCAweDA4MDQsIDB4OTYyYSwgMHgwODBjLCAweDkxMmUsIDB4OTAwNiwgMHgwODBjLAorCTB4Njc4ZCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxMTMwLCAweDcwMDMsIDB4MDQwMCwgMHg2MjBjLAorCTB4YzJiNCwgMHg2MjBlLCAweDAwNTgsIDB4NzgxNCwgMHgwMDk2LCAweDkwNGQsIDB4MDEyMCwgMHg5MDA2LAorCTB4YTg5YSwgMHhhOGE2LCAweGE4YWEsIDB4MDA5ZSwgMHg3MDAzLCAweDAzMDAsIDB4YjhhMCwgMHg5MDg2LAorCTB4MDA3ZSwgMHgxOTA0LCAweDkwMGYsIDB4MDBkNiwgMHgyMDY5LCAweDE5NDQsIDB4MjAwMSwgMHgxODM2LAorCTB4MjAwNCwgMHhkMGE0LCAweDAxNzgsIDB4NjgwMCwgMHg3MDBhLCAweDY4MDgsIDB4OTA4NCwgMHgyMDAwLAorCTB4NzAxMiwgMHg2ODBjLCAweDcwMTYsIDB4NzAxZiwgMHgyNzEwLCAweDY4MTgsIDB4NzAyMiwgMHg2ODFjLAorCTB4NzAyNiwgMHgwMDgwLCAweDY4MDAsIDB4NzAwYSwgMHg2ODA0LCAweDcwMGUsIDB4NjgwOCwgMHgwODBjLAorCTB4NzIwNywgMHgxMTE4LCAweDkwODQsIDB4MzdmZiwgMHgwMDEwLCAweDkwODQsIDB4M2ZmZiwgMHg3MDEyLAorCTB4NjgwYywgMHg3MDE2LCAweDAwZGUsIDB4MjBhOSwgMHgwMDA0LCAweDIwZTEsIDB4MDAwMSwgMHgyMDk5LAorCTB4MTgwNSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjU2LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LAorCTB4MjA5OSwgMHgxODAxLCAweDIwYTEsIDB4MDI1YSwgMHg0MDAzLCAweDAwZDYsIDB4MDgwYywgMHg5ZWQ2LAorCTB4MjA2OSwgMHgxOTRjLCAweDIwNzEsIDB4MDI0ZSwgMHg2ODAwLCAweGMwZGQsIDB4NzAwMiwgMHgwODBjLAorCTB4NTVkZiwgMHhkMGU0LCAweDAxMTAsIDB4NjgwYywgMHg3MDBlLCAweDAwZGUsIDB4MDRhMCwgMHgyMDAxLAorCTB4MTgzNiwgMHgyMDA0LCAweGQwYTQsIDB4MDE2OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMiwgMHg2MGUwLAorCTB4OTEwNiwgMHgwMTMwLCAweDIxMDAsIDB4NjBlMywgMHgwMDAwLCAweDA4MGMsIDB4MjdlMiwgMHg2MWUyLAorCTB4MDAxZSwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxOTQ0LCAweDIwZTksIDB4MDAwMCwgMHgyMGExLAorCTB4MDI0ZSwgMHgyMGE5LCAweDAwMDgsIDB4NDAwMywgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHgxODA1LAorCTB4MjBhMSwgMHgwMjU2LCAweDQwMDMsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4MTgwMSwgMHgyMGExLAorCTB4MDI1YSwgMHg0MDAzLCAweDA4MGMsIDB4OWVkNiwgMHgyMGExLCAweDAyNGUsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjA5OSwgMHgxOTRjLCAweDQwMDMsIDB4NjBjMywgMHgwMDc0LCAweDA4MDQsIDB4OTYyYSwgMHgwODBjLAorCTB4OTEyZSwgMHg3MDAzLCAweDIwMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGIsIDB4MDgwMCwgMHg3MDBmLAorCTB4MjAwMCwgMHg5MDA2LCAweDAwZjYsIDB4MjA3OSwgMHgxODViLCAweDc5MDQsIDB4MDBmZSwgMHhkMWFjLAorCTB4MTExMCwgMHg5MDg1LCAweDAwMjAsIDB4MDAxMCwgMHg5MDg1LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAyLAorCTB4MDBkNiwgMHgwODA0LCAweDkwZGUsIDB4NzAyNiwgMHg2MGMzLCAweDAwMTQsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4NTAwMCwgMHgwODA0LCAweDhmYmUsIDB4MDgwYywgMHg5MTJlLAorCTB4NzAwMywgMHgyMTEwLCAweDcwMDcsIDB4MDAxNCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDgwYywgMHg5MTcwLCAweDAwMTAsIDB4MDgwYywgMHg5MTc5LCAweDcwMDMsIDB4MDIwMCwgMHg2MGMzLAorCTB4MDAwNCwgMHgwODA0LCAweDk2MmEsIDB4MDgwYywgMHg5MTc5LCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLAorCTB4MDAwMywgMHg3MDBmLCAweDJhMDAsIDB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OTYyYSwgMHgwODBjLAorCTB4OTE3OSwgMHg3MDAzLCAweDAyMDAsIDB4MDgwNCwgMHg4ZmJlLCAweDA4MGMsIDB4OTE3OSwgMHg3MDAzLAorCTB4MDEwMCwgMHg3ODJjLCAweDkwMDUsIDB4MDExMCwgMHg3MDBhLCAweDAwMTAsIDB4NzAwYiwgMHgwMDAzLAorCTB4NzgxNCwgMHg3MDBlLCAweDYwYzMsIDB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDBkNiwgMHgwODBjLAorCTB4OTE3OSwgMHg3MDAzLCAweDAyMTAsIDB4NzAwNywgMHgwMDE0LCAweDcwMGIsIDB4MDgwMCwgMHhiODk0LAorCTB4OTA4NiwgMHgwMDE0LCAweDExOTgsIDB4Yjk5YywgMHg5MTg0LCAweDAwMzAsIDB4MDE5MCwgMHhiOTk4LAorCTB4OTE4NCwgMHhjMDAwLCAweDExNDAsIDB4ZDFlYywgMHgwMTE4LCAweDcwMGYsIDB4MjEwMCwgMHgwMDU4LAorCTB4NzAwZiwgMHgwMTAwLCAweDAwNDAsIDB4NzAwZiwgMHgwNDAwLCAweDAwMjgsIDB4NzAwZiwgMHgwNzAwLAorCTB4MDAxMCwgMHg3MDBmLCAweDA4MDAsIDB4MDBmNiwgMHgyMDc5LCAweDE4NWIsIDB4NzkwNCwgMHgwMGZlLAorCTB4ZDFhYywgMHgxMTEwLCAweDkwODUsIDB4MDAyMCwgMHgwMDEwLCAweDkwODUsIDB4MDAxMCwgMHgyMDA5LAorCTB4MTg3ZCwgMHgyMTBjLCAweGQxODQsIDB4MTExMCwgMHg5MDg1LCAweDAwMDIsIDB4MDAyNiwgMHgyMDA5LAorCTB4MTg3YiwgMHgyMTBjLCAweGQxZTQsIDB4MDE1MCwgMHhjMGM1LCAweGJhYmMsIDB4ZDI4YywgMHgxMTA4LAorCTB4YzBjZCwgMHg5MDk0LCAweDAwMzAsIDB4OTI5NiwgMHgwMDEwLCAweDAxNDAsIDB4ZDFlYywgMHgwMTMwLAorCTB4OTA5NCwgMHgwMDMwLCAweDkyOTYsIDB4MDAxMCwgMHgwMTA4LCAweGMwYmQsIDB4MDAyZSwgMHg3MDI2LAorCTB4NjBjMywgMHgwMDE0LCAweDAwZGUsIDB4MDgwNCwgMHg5NjJhLCAweDA4MGMsIDB4OTE3OSwgMHg3MDAzLAorCTB4MDIxMCwgMHg3MDA3LCAweDAwMTQsIDB4NzAwZiwgMHgwMTAwLCAweDYwYzMsIDB4MDAxNCwgMHgwODA0LAorCTB4OTYyYSwgMHgwODBjLCAweDkxNzksIDB4NzAwMywgMHgwMjAwLCAweDA4MDQsIDB4OGY0NCwgMHgwODBjLAorCTB4OTE3OSwgMHg3MDAzLCAweDAxMDAsIDB4NzAwYiwgMHgwMDAzLCAweDcwMGYsIDB4MmEwMCwgMHg2MGMzLAorCTB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDgwYywgMHg5MTc5LCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLAorCTB4MDAwYiwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5NjJhLCAweDAwMjYsIDB4MDBkNiwgMHgwMDM2LAorCTB4MDA0NiwgMHgyMDE5LCAweDMyMDAsIDB4MjAyMSwgMHgwODAwLCAweDAwNDAsIDB4MDAyNiwgMHgwMGQ2LAorCTB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MjIwMCwgMHgyMDIxLCAweDAxMDAsIDB4MDgwYywgMHg5ZWViLAorCTB4YjgxMCwgMHg5MzA1LCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LCAweDIwNjksIDB4MTgwMCwgMHg2ODc4LAorCTB4NzAwYSwgMHg2ODdjLCAweDcwMGUsIDB4OTQ4NSwgMHgwMDI5LCAweDcwMTIsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MDBkZSwgMHgwODBjLCAweDk2MTgsIDB4NzIxYSwgMHg5Zjk1LCAweDAwMDAsIDB4NzIyMiwgMHg3MDI3LAorCTB4ZmZmZiwgMHgyMDcxLCAweDAyNGMsIDB4MDAyZSwgMHgwMDA1LCAweDAwMjYsIDB4MDgwYywgMHg5ZWViLAorCTB4NzAwMywgMHgwMmZmLCAweDcwMDcsIDB4ZmZmYywgMHgwMGQ2LCAweDIwNjksIDB4MTgwMCwgMHg2ODc4LAorCTB4NzAwYSwgMHg2ODdjLCAweDcwMGUsIDB4MDBkZSwgMHg3MDEzLCAweDIwMjksIDB4MGMxMCwgMHg3MDAzLAorCTB4MDEwMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAwYiwgMHhmYzAyLCAweDcwMGYsIDB4MDAwMCwgMHgwMDA1LAorCTB4MDAyNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDA0NiwgMHgyMDE5LCAweDMzMDAsIDB4MjAyMSwgMHgwODAwLAorCTB4MDA0MCwgMHgwMDI2LCAweDAwZDYsIDB4MDAzNiwgMHgwMDQ2LCAweDIwMTksIDB4MjMwMCwgMHgyMDIxLAorCTB4MDEwMCwgMHgwODBjLCAweDllZWIsIDB4YjgxMCwgMHg5MzA1LCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LAorCTB4MjA2OSwgMHgxODAwLCAweGI4MTAsIDB4OTAwNSwgMHgxMTQwLCAweGI4MTQsIDB4OTAwNSwgMHgxMTI4LAorCTB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmZSwgMHgwMDIwLCAweDY4NzgsIDB4NzAwYSwgMHg2ODdjLAorCTB4NzAwZSwgMHgwMDAwLCAweDk0ODUsIDB4MDA5OCwgMHg3MDEyLCAweDAwNGUsIDB4MDAzZSwgMHgwMGRlLAorCTB4MDgwYywgMHg5NjE4LCAweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDJmMTAsIDB4NzIyNiwgMHgyMDcxLAorCTB4MDI0YywgMHgwMDJlLCAweDAwMDUsIDB4MDgwYywgMHg5NjE4LCAweDcyMWEsIDB4N2EwOCwgMHg3MjIyLAorCTB4NzgxNCwgMHg3MDI2LCAweDIwNzEsIDB4MDI0YywgMHgwMDJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjA2OSwgMHgwMjAwLCAweDIwNzEsIDB4MDI0MCwgMHg2MDA0LAorCTB4OTA4YSwgMHgwMDg1LCAweDBhMGMsIDB4MGRmYSwgMHg5MDhhLCAweDAwOTIsIDB4MWEwYywgMHgwZGZhLAorCTB4NjExMCwgMHgyMTU4LCAweGI5YjAsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHg5MDgyLAorCTB4MDA4NSwgMHgwMDMzLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDBiZSwgMHgwMDA1LAorCTB4OTFlNywgMHg5MWY2LCAweDkyMDEsIDB4OTFlNSwgMHg5MWU1LCAweDkxZTUsIDB4OTFlNywgMHg5MWU1LAorCTB4OTFlNSwgMHg5MWU1LCAweDkxZTUsIDB4OTFlNSwgMHg5MWU1LCAweDA4MGMsIDB4MGRmYSwgMHgwNDExLAorCTB4NjBjMywgMHgwMDAwLCAweDAwMjYsIDB4MDgwYywgMHgyYWZlLCAweDAyMjgsIDB4MjAxMSwgMHgwMTAxLAorCTB4MjIwNCwgMHhjMGM1LCAweDIwMTIsIDB4MDAyZSwgMHgwODA0LCAweDk2MmEsIDB4MDQzMSwgMHg3ODA4LAorCTB4NzAwYSwgMHg3ODE0LCAweDcwMGUsIDB4NzAxNywgMHhmZmZmLCAweDYwYzMsIDB4MDAwYywgMHgwODA0LAorCTB4OTYyYSwgMHgwNGExLCAweDcwMDMsIDB4MDAwMywgMHg3MDA3LCAweDAzMDAsIDB4NjBjMywgMHgwMDA0LAorCTB4MDgwNCwgMHg5NjJhLCAweDAwMjYsIDB4MDgwYywgMHg5ZWViLCAweGI4MTAsIDB4OTA4NSwgMHg4MTAwLAorCTB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4NzgsIDB4NzAwYSwgMHg2ODdjLAorCTB4NzAwZSwgMHg3MDEzLCAweDAwMDksIDB4MDgwNCwgMHg5MTQ5LCAweDAwMjYsIDB4MDgwYywgMHg5ZWViLAorCTB4YjgxMCwgMHg5MDg1LCAweDg0MDAsIDB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLAorCTB4Njg3OCwgMHg3MDBhLCAweDY4N2MsIDB4NzAwZSwgMHgyMDAxLCAweDAwOTksIDB4N2EyMCwgMHg5Mjk2LAorCTB4MDAwNSwgMHgwMTA4LCAweGMwYmMsIDB4NzAxMiwgMHgwODA0LCAweDkxYWIsIDB4MDAyNiwgMHgwODBjLAorCTB4OWVlYiwgMHhiODEwLCAweDkwODUsIDB4ODUwMCwgMHg3MDAyLCAweGI4MTQsIDB4NzAwNiwgMHgyMDY5LAorCTB4MTgwMCwgMHg2ODc4LCAweDcwMGEsIDB4Njg3YywgMHg3MDBlLCAweDIwMDEsIDB4MDA5OSwgMHg3YTIwLAorCTB4OTI5NiwgMHgwMDA1LCAweDAxMDgsIDB4YzBiYywgMHg3MDEyLCAweDA4MDQsIDB4OTFhYiwgMHgwMGI2LAorCTB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MDBmNiwgMHgyYzc4LCAweDIwNjksIDB4MDIwMCwgMHgyMDcxLAorCTB4MDI0MCwgMHg3ODA0LCAweDkwOGEsIDB4MDA0MCwgMHgwYTBjLCAweDBkZmEsIDB4OTA4YSwgMHgwMDU0LAorCTB4MWEwYywgMHgwZGZhLCAweDc5MTAsIDB4MjE1OCwgMHhiOWIwLCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLAorCTB4OTA4MiwgMHgwMDQwLCAweDAwMzMsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMGJlLAorCTB4MDAwNSwgMHg5Mjg2LCAweDkzNDIsIDB4OTMxNSwgMHg5NDY0LCAweDkyODQsIDB4OTI4NCwgMHg5Mjg0LAorCTB4OTI4NCwgMHg5Mjg0LCAweDkyODQsIDB4OTI4NCwgMHg5YTJiLCAweDlhMzMsIDB4OWEzYiwgMHg5YTQzLAorCTB4OTI4NCwgMHg5ZTMzLCAweDkyODQsIDB4OWEyMywgMHgwODBjLCAweDBkZmEsIDB4MDA5NiwgMHg3ODBiLAorCTB4ZmZmZiwgMHgwODBjLCAweDkyZjEsIDB4NzkxNCwgMHgyMTQ4LCAweGE5NzgsIDB4Nzk1NiwgMHhhZTY0LAorCTB4OTZiNCwgMHgwMGZmLCAweDk2ODYsIDB4MDAwOCwgMHgxMTQ4LCAweGE4YjQsIDB4NzAzMiwgMHhhOGI4LAorCTB4NzAzNiwgMHhhOGJjLCAweDcwM2EsIDB4YThjMCwgMHg3MDNlLCAweDAwMDgsIDB4NzEzMiwgMHhhOTdjLAorCTB4OTE4NCwgMHgwMDBmLCAweDExMTgsIDB4MjAwMSwgMHgwMDA1LCAweDAwNDAsIDB4ZDE4NCwgMHgwMTE4LAorCTB4MjAwMSwgMHgwMDA0LCAweDAwMTgsIDB4OTA4NCwgMHgwMDA2LCAweDgwMDQsIDB4MjAxMCwgMHg3ODVjLAorCTB4OTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4OTIwNSwgMHg3MDQyLCAweGQxYWMsIDB4MDE1OCwgMHg3MDQ3LAorCTB4MDAwMiwgMHg5Njg2LCAweDAwMDgsIDB4MTExOCwgMHgwODBjLCAweDE4MWMsIDB4MDAxMCwgMHgwODBjLAorCTB4MTZkYiwgMHgwMDUwLCAweGQxYjQsIDB4MDExOCwgMHg3MDQ3LCAweDAwMDEsIDB4MDAyOCwgMHg3MDQ3LAorCTB4MDAwMCwgMHg5MDE2LCAweDIyMzAsIDB4MDAxMCwgMHhhYWIwLCAweGFlYWMsIDB4NzI2YSwgMHg3NjZlLAorCTB4MjBhOSwgMHgwMDA4LCAweDIwZTksIDB4MDAwMCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAyMywgMHgyMDk4LCAweDIwYTEsIDB4MDI1MiwgMHgyMDY5LCAweDAyMDAsIDB4NjgxMywgMHgwMDE4LAorCTB4NDAwMywgMHg2ODEzLCAweDAwMDgsIDB4NjBjMywgMHgwMDIwLCAweDYwMTcsIDB4MDAwOSwgMHgyMDAxLAorCTB4MTlkYiwgMHgyMDAzLCAweDA3ZDAsIDB4MjAwMSwgMHgxOWRhLCAweDIwMDMsIDB4MDAwOSwgMHgwMDllLAorCTB4MDAwNSwgMHg2ODEzLCAweDAwMDgsIDB4YmE4YywgMHg4MjEwLCAweGI4YmMsIDB4ZDA4NCwgMHgwMTI4LAorCTB4N2E0YSwgMHg3YjE0LCAweDdiNDYsIDB4NzIyZSwgMHg3MzJhLCAweDkyOTQsIDB4MDBmZiwgMHhiYThlLAorCTB4ODIxNywgMHg3MjFhLCAweGJhMTAsIDB4OTI5NSwgMHgwNjAwLCAweDcyMDIsIDB4YmExNCwgMHg3MjA2LAorCTB4MjA2OSwgMHgxODAwLCAweDZhNzgsIDB4NzIwYSwgMHg2YTdjLCAweDcyMGUsIDB4NzAxMywgMHgwODI5LAorCTB4MmYxMCwgMHg3MjIyLCAweDcwMjcsIDB4ZmZmZiwgMHgwMDA1LCAweDAwZDYsIDB4MDA5NiwgMHgwMDgxLAorCTB4NzgxNCwgMHgyMDQ4LCAweGE4OTAsIDB4NzAwMiwgMHhhODhjLCAweDcwMDYsIDB4YThiMCwgMHg3MDBhLAorCTB4YThhYywgMHg3MDBlLCAweDYwYzMsIDB4MDAwYywgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHg5NjJhLAorCTB4NjgxMywgMHgwMDA4LCAweGI4MTAsIDB4OTA4NSwgMHgwNTAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LAorCTB4MjA2OSwgMHgxODAwLCAweDY4NzgsIDB4NzAwYSwgMHg2ODdjLCAweDcwMGUsIDB4NzAxMywgMHgwODg5LAorCTB4MDgwYywgMHg5NjE4LCAweDcyMWEsIDB4N2EwOCwgMHg3MjIyLCAweDJmMTAsIDB4NzIyNiwgMHgyMDcxLAorCTB4MDI0YywgMHgwMDA1LCAweDAwZDYsIDB4MDA5NiwgMHgwODBjLCAweDk0NDIsIDB4NzgxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhiZTM1LCAweDExMzAsIDB4NzgxNCwgMHg5MDg0LCAweDA3MDAsIDB4ODAwNywgMHgwMDMzLAorCTB4MDAxMCwgMHg5MDA2LCAweDAwMWIsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4OTM2MCwgMHg5M2M5LAorCTB4OTNkOSwgMHg5M2ZmLCAweDk0MGIsIDB4OTQxYywgMHg5NDI0LCAweDkzNWUsIDB4MDgwYywgMHgwZGZhLAorCTB4MDAxNiwgMHgwMDM2LCAweGE5N2MsIDB4OTE4YywgMHgwMDAzLCAweDAxMTgsIDB4OTE4NiwgMHgwMDAzLAorCTB4MTE5OCwgMHhhYmE4LCAweDc4MjQsIDB4ZDBjYywgMHgxMTY4LCAweDczMTYsIDB4YTg5OCwgMHg3MDFhLAorCTB4YTg5NCwgMHg3MDFlLCAweDAwM2UsIDB4MDAxZSwgMHgyMDAxLCAweDE5ODksIDB4MjAwNCwgMHg2MGMyLAorCTB4MDgwNCwgMHg5NjJhLCAweGMzZTUsIDB4MGM4OCwgMHg5MTg2LCAweDAwMDEsIDB4MTkwYywgMHgwZGZhLAorCTB4YWJhOCwgMHg3ODI0LCAweGQwY2MsIDB4MTkwNCwgMHg5M2M2LCAweDczMTYsIDB4YTg5OCwgMHg3MDFhLAorCTB4YTg5NCwgMHg3MDFlLCAweGE4YTQsIDB4NzAyNiwgMHhhOGFjLCAweDcwMmUsIDB4MjAwOSwgMHgwMDE4LAorCTB4OTM4NCwgMHgwMzAwLCAweDA1NzAsIDB4ZDNjNCwgMHgwMTEwLCAweGE4YWMsIDB4OTEwOCwgMHhkM2NjLAorCTB4MDExMCwgMHhhOGE0LCAweDkxMDgsIDB4NjgxMCwgMHg5MDg1LCAweDAwMTAsIDB4NjgxMiwgMHgyMDExLAorCTB4MDI1OCwgMHgyMGU5LCAweDAwMDAsIDB4MjJhMCwgMHgwMTU2LCAweDIwYTksIDB4MDAwOCwgMHhhODYwLAorCTB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAyYywgMHgyMDk4LCAweDQwMDMsIDB4NjgxMCwgMHg4MDAwLAorCTB4NjgxMiwgMHgyMDExLCAweDAyNDAsIDB4MjJhMCwgMHgyMGE5LCAweDAwMDUsIDB4NDAwMywgMHg2ODEwLAorCTB4YzA4NCwgMHg2ODEyLCAweDAxNWUsIDB4OTE4NCwgMHgwMDAzLCAweDAxMTgsIDB4MjAxOSwgMHgwMjQ1LAorCTB4MjAxYSwgMHg2MWMyLCAweDAwM2UsIDB4MDAxZSwgMHgwODA0LCAweDk2MmEsIDB4YzNlNSwgMHgwODA0LAorCTB4OTM4NSwgMHgyMDExLCAweDAwMDgsIDB4MjAwMSwgMHgxODBmLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTEwLAorCTB4MjAxMSwgMHgwMDI4LCAweDc4MjQsIDB4ZDBjYywgMHgxMTEwLCAweDcyMTYsIDB4MDQ3MCwgMHgwY2U4LAorCTB4YzJlNSwgMHgyMDExLCAweDAzMDIsIDB4MDAxNiwgMHg3ODJjLCAweDcwMWEsIDB4NzkzMCwgMHg3MTFlLAorCTB4OTEwNSwgMHgwMTA4LCAweGMyZGQsIDB4MDAxZSwgMHg3ODI0LCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LAorCTB4NzIxNiwgMHg3MDI3LCAweDAwMTIsIDB4NzAyZiwgMHgwMDA4LCAweDcwNDMsIDB4NzAwMCwgMHg3MDQ3LAorCTB4MDUwMCwgMHg3MDRmLCAweDAwMGEsIDB4MjA2OSwgMHgwMjAwLCAweDY4MTMsIDB4MDAwOSwgMHgyMDcxLAorCTB4MDI0MCwgMHg3MDBiLCAweDI1MDAsIDB4NjBjMywgMHgwMDMyLCAweDA4MDQsIDB4OTYyYSwgMHgyMDExLAorCTB4MDAyOCwgMHg3ODI0LCAweGQwY2MsIDB4MTEyOCwgMHg3MjE2LCAweDYwYzMsIDB4MDAxOCwgMHgwODA0LAorCTB4OTYyYSwgMHgwY2QwLCAweGMyZTUsIDB4MjAxMSwgMHgwMTAwLCAweDc4MjQsIDB4ZDBjYywgMHgwMTA4LAorCTB4YzJlNSwgMHg3MjE2LCAweDcwMmYsIDB4MDAwOCwgMHg3ODU4LCAweDkwODQsIDB4MDBmZiwgMHg3MDM2LAorCTB4NjBjMywgMHgwMDIwLCAweDA4MDQsIDB4OTYyYSwgMHgyMDExLCAweDAwMDgsIDB4NzgyNCwgMHhkMGNjLAorCTB4MDEwOCwgMHhjMmU1LCAweDcyMTYsIDB4MGMwOCwgMHgwMDM2LCAweDdiMTQsIDB4OTM4NCwgMHhmZjAwLAorCTB4NzgxNiwgMHg5Mzg0LCAweDAwZmYsIDB4ODAwMSwgMHgxMTM4LCAweDc4MjQsIDB4ZDBjYywgMHgwMTA4LAorCTB4YzJlNSwgMHg3MjE2LCAweDAwM2UsIDB4MDg4OCwgMHgwMDQ2LCAweDIwMjEsIDB4MDgwMCwgMHgwMDA2LAorCTB4NzgyNCwgMHhkMGNjLCAweDAwMGUsIDB4MDEwOCwgMHhjNGU1LCAweDc0MTYsIDB4MDA0ZSwgMHg3MDFlLAorCTB4MDAzZSwgMHgwODE4LCAweDAwZDYsIDB4NjgxMywgMHgwMDA4LCAweGI4MTAsIDB4OTA4NSwgMHgwNzAwLAorCTB4NzAwMiwgMHhiODE0LCAweDcwMDYsIDB4MjA2OSwgMHgxODAwLCAweDY4NzgsIDB4NzAwYSwgMHg2ODdjLAorCTB4NzAwZSwgMHg3ODI0LCAweGQwY2MsIDB4MTE2OCwgMHg3MDEzLCAweDA4OTgsIDB4MDgwYywgMHg5NjE4LAorCTB4NzIxYSwgMHg3YTA4LCAweDcyMjIsIDB4MmYxMCwgMHg3MjI2LCAweDIwNzEsIDB4MDI0YywgMHgwMGRlLAorCTB4MDAwNSwgMHg3MDEzLCAweDA4ODksIDB4MGM5MCwgMHgwMDE2LCAweDc4MTQsIDB4OTA4NCwgMHgwNzAwLAorCTB4ODAwNywgMHgwMDEzLCAweDAwMWUsIDB4MDAwNSwgMHg5NDc0LCAweDk0NzQsIDB4OTQ3NiwgMHg5NDc0LAorCTB4OTQ3NCwgMHg5NDc0LCAweDk0OTAsIDB4OTQ3NCwgMHgwODBjLCAweDBkZmEsIDB4NzkxNCwgMHg5MThjLAorCTB4MDhmZiwgMHg5MThkLCAweGY2MDAsIDB4NzkxNiwgMHgyMDA5LCAweDAwMDMsIDB4MDBiOSwgMHgyMDY5LAorCTB4MTg1YiwgMHg2ODA0LCAweGQwYmMsIDB4MDEzMCwgMHg2ODJjLCAweDkwODQsIDB4MDBmZiwgMHg4MDA3LAorCTB4NzAzMiwgMHgwMDEwLCAweDcwMzMsIDB4M2YwMCwgMHg2MGMzLCAweDAwMDEsIDB4MDgwNCwgMHg5NjJhLAorCTB4MjAwOSwgMHgwMDAzLCAweDAwMTksIDB4NzAzMywgMHg3ZjAwLCAweDBjYjAsIDB4MDAxNiwgMHgwODBjLAorCTB4OWVlYiwgMHgwMDFlLCAweGI4MTAsIDB4OTA4NSwgMHgwMTAwLCAweDcwMDIsIDB4YjgxNCwgMHg3MDA2LAorCTB4MjA2OSwgMHgxODAwLCAweDZhNzgsIDB4NzIwYSwgMHg2YTdjLCAweDcyMGUsIDB4NzAxMywgMHgwODg4LAorCTB4OTE4ZCwgMHgwMDA4LCAweDcxMTYsIDB4MDgwYywgMHg5NjE4LCAweDcyMWEsIDB4N2EwOCwgMHg3MjIyLAorCTB4MmYxMCwgMHg3MjI2LCAweDAwMDUsIDB4MDBiNiwgMHgwMDk2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNzEsIDB4MTgwMCwgMHg3ODEwLAorCTB4MjA1OCwgMHhiOGEwLCAweDIwMjgsIDB4YjkxMCwgMHhiYTE0LCAweDczNzgsIDB4NzQ3YywgMHg3ODIwLAorCTB4OTBiZSwgMHgwMDA2LCAweDA5MDQsIDB4OTU4NywgMHg5MGJlLCAweDAwMGEsIDB4MTkwNCwgMHg5NTQzLAorCTB4YjhiMCwgMHg2MDllLCAweDc4MTQsIDB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDU1OCwgMHhhZjkwLAorCTB4OTc4NCwgMHhmZjAwLCAweDkxMDUsIDB4NjA2MiwgMHg4NzNmLCAweDk3ODQsIDB4ZmYwMCwgMHgwMDA2LAorCTB4NzgxNCwgMHgyMDQ4LCAweGE4NzgsIDB4YzBmYywgMHg5MDA1LCAweDAwMGUsIDB4MTE2MCwgMHhhZjk0LAorCTB4ODdmZiwgMHgwMTk4LCAweDIwMzksIDB4MDA5OCwgMHg5NzA1LCAweDYwNzIsIDB4NzgwOCwgMHg2MDgyLAorCTB4MmYwMCwgMHg2MDg2LCAweDAwMzgsIDB4OTE4NSwgMHgyMjAwLCAweDYwNjIsIDB4NjA3MywgMHgwMTI5LAorCTB4NjA3NywgMHgwMDAwLCAweGI4YjAsIDB4NjA5ZSwgMHgwMDUwLCAweDIwMzksIDB4MDAyOSwgMHg5NzA1LAorCTB4NjA3MiwgMHgwY2MwLCAweDkxODUsIDB4MDIwMCwgMHg2MDYyLCAweDYwNzMsIDB4MjAyOSwgMHhhODdjLAorCTB4ZDBmYywgMHgwMTE4LCAweGFmOTQsIDB4ODdmZiwgMHgxMTIwLCAweDJmMDAsIDB4NjA4MiwgMHg3ODA4LAorCTB4NjA4NiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHg2MDc3LCAweDAwMDAsIDB4Yjg4YywgMHg4MDAwLAorCTB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHhhODM4LAorCTB4NjA4YSwgMHhhODM0LCAweDYwOGUsIDB4YTg0OCwgMHg2MGM2LCAweGE4NDQsIDB4NjBjYSwgMHhiODZjLAorCTB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweDA4MGMsIDB4OWVkMCwgMHgyMDA5LAorCTB4MDdkMCwgMHg2MGM0LCAweDkwODQsIDB4ZmZmMCwgMHg5MDA1LCAweDAxMTAsIDB4MjAwOSwgMHgxYjU4LAorCTB4MDgwYywgMHg4MzVmLCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDA5ZSwgMHgwMGJlLCAweDAwMDUsIDB4NzgwNCwgMHg5MDg2LCAweDAwNDAsIDB4MDkwNCwgMHg5NWMzLAorCTB4OTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NjA3MywgMHgwODA5LAorCTB4NjA3NywgMHgwMDA4LCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4Yjg4YywgMHg4MDAwLAorCTB4OTA4NCwgMHgwMGZmLCAweGI4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLAorCTB4NjA4MiwgMHg3ODA4LCAweDYwODYsIDB4NzgxNCwgMHgyMDQ4LCAweGE4MzgsIDB4NjA4YSwgMHhhODM0LAorCTB4NjA4ZSwgMHhhODQ4LCAweDYwYzYsIDB4YTg0NCwgMHg2MGNhLCAweGI4NmMsIDB4NjBjZSwgMHhiYWIwLAorCTB4NjI5ZSwgMHgwODBjLCAweDllZDAsIDB4MjAwOSwgMHgwN2QwLCAweDYwYzQsIDB4OTA4NCwgMHhmZmYwLAorCTB4OTAwNSwgMHgwMTEwLCAweDIwMDksIDB4MWI1OCwgMHgwODBjLCAweDgzNWYsIDB4MDAzZSwgMHgwMDRlLAorCTB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDllLCAweDAwYmUsIDB4MDAwNSwgMHg3ODE0LAorCTB4MjA0OCwgMHhhODdjLCAweDkwODQsIDB4MDAwMywgMHg5MDg2LCAweDAwMDIsIDB4MDkwNCwgMHg5NWRmLAorCTB4OTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsIDB4NjA3MywgMHgwODgwLAorCTB4NjA3NywgMHgwMDA4LCAweGI4OGMsIDB4ODAwMCwgMHg5MDg0LCAweDAwZmYsIDB4Yjg4ZSwgMHg4MDA3LAorCTB4NjA3YSwgMHg3ODM4LCAweDYwN2UsIDB4MmYwMCwgMHg2MDg2LCAweDc4MDgsIDB4NjA4MiwgMHhhODkwLAorCTB4NjA4YSwgMHhhODhjLCAweDYwOGUsIDB4YThiMCwgMHg2MGM2LCAweGE4YWMsIDB4NjBjYSwgMHhhOGFjLAorCTB4NzkzMCwgMHg5MTA4LCAweDc5MzIsIDB4YThiMCwgMHg3OTJjLCAweDkxMDksIDB4NzkyZSwgMHhiODZjLAorCTB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsIDB4NjBkNywgMHgwMDAwLCAweGJhYjAsIDB4NjI5ZSwgMHgwODBjLAorCTB4OWVhZCwgMHgwODA0LCAweDk1NzMsIDB4YjhiYywgMHhkMDg0LCAweDAxNDgsIDB4Yjg4YywgMHg3ODE0LAorCTB4MjA0OCwgMHhiODhjLCAweDc4NGEsIDB4YTgzNiwgMHgyOTAwLCAweGE4M2EsIDB4YjA0NiwgMHg5MTg1LAorCTB4MDYwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsIDB4MDgyOSwgMHg2MDc3LAorCTB4MDAwMCwgMHg2MGFmLCAweDk1NzUsIDB4NjBkNywgMHgwMDAwLCAweDA4MDQsIDB4OTU1NiwgMHg5MTg1LAorCTB4MDcwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDc4MjQsIDB4ZDBjYywgMHg3ODI2LAorCTB4MDExOCwgMHg2MDczLCAweDA4ODksIDB4MDAxMCwgMHg2MDczLCAweDA4OTgsIDB4NjA3NywgMHgwMDAwLAorCTB4Yjg4YywgMHg4MDAwLCAweDkwODQsIDB4MDBmZiwgMHhiODhlLCAweDgwMDcsIDB4NjA3YSwgMHg2MDdmLAorCTB4MDAwMCwgMHgyZjAwLCAweDYwODYsIDB4NzgwOCwgMHg2MDgyLCAweGE4MzgsIDB4NjA4YSwgMHhhODM0LAorCTB4NjA4ZSwgMHhhODQ4LCAweDYwYzYsIDB4YTg0NCwgMHg2MGNhLCAweGI4NmMsIDB4NjBjZSwgMHg2MGFmLAorCTB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsIDB4YmFiMCwgMHg2MjllLCAweDc4MjQsIDB4ZDBjYywgMHgwMTIwLAorCTB4MDgwYywgMHg5ZWQwLCAweDA4MDQsIDB4OTU3MywgMHgwODBjLCAweDllYWQsIDB4MDgwNCwgMHg5NTczLAorCTB4N2ExMCwgMHgwMGI2LCAweDIyNTgsIDB4YmE4YywgMHg4MjEwLCAweDkyOTQsIDB4MDBmZiwgMHhiYThlLAorCTB4MDBiZSwgMHg4MjE3LCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDE5YmYsIDB4Njg0MywgMHgwMDAxLAorCTB4MDBkZSwgMHgwMDA1LCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDBmMSwgMHgwODBjLAorCTB4ODM1MSwgMHgwMDA1LCAweDAwMTYsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4OTE4NCwgMHgwNjAwLAorCTB4OTA4NiwgMHgwNjAwLCAweDAxMjgsIDB4MDA4OSwgMHgwODBjLCAweDgzNTEsIDB4MDAxZSwgMHgwMDA1LAorCTB4YzFlNSwgMHgyMDAxLCAweDE4MGMsIDB4MjEwMiwgMHgyMDAxLCAweDE5YzAsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgxOWM4LCAweDIwMDMsIDB4MDAwMCwgMHgwYzg4LCAweDAwMDYsIDB4NjAxNCwgMHg5MDg0LAorCTB4MTgwNCwgMHg5MDg1LCAweDAwMDksIDB4NjAxNiwgMHgwMDBlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDAwNiwgMHgyMDYxLCAweDAxMDAsIDB4NjFhNCwgMHg2MGE3LCAweDk1ZjUsIDB4NjAxNCwgMHg5MDg0LAorCTB4MTgwNCwgMHg5MDg1LCAweDAwMDgsIDB4NjAxNiwgMHgwMDBlLCAweGEwMDEsIDB4YTAwMSwgMHhhMDAxLAorCTB4NjFhNiwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHgwODBjLCAweDcyMDcsIDB4MTFjMCwgMHgyMDAxLAorCTB4MTlkYiwgMHgyMDA0LCAweDkwMDUsIDB4MTVkMCwgMHgwODBjLCAweDcyZDIsIDB4MTE2MCwgMHgyMDYxLAorCTB4MDEwMCwgMHg2MDIwLCAweGQwYjQsIDB4MTEyMCwgMHg2MDI0LCAweGQwODQsIDB4MDkwYywgMHgwZGZhLAorCTB4MDgwYywgMHg4MzUxLCAweDA0NTgsIDB4MDBjNiwgMHgyMDYxLCAweDE5YmYsIDB4MDBjOCwgMHg2OTA0LAorCTB4OTE5NCwgMHg0MDAwLCAweDA1NDAsIDB4MDgxMSwgMHgwODBjLCAweDJjOTgsIDB4MDBjNiwgMHgyMDYxLAorCTB4MTliZiwgMHg2MTI4LCAweDkxOTIsIDB4MDAwOCwgMHgxMjU4LCAweDgxMDgsIDB4NjEyYSwgMHg2MTI0LAorCTB4MDBjZSwgMHg4MWZmLCAweDAxOTgsIDB4MDgwYywgMHg4MzUxLCAweDA4MGMsIDB4OTY0ZCwgMHgwMDcwLAorCTB4NjEyNCwgMHg5MWU1LCAweDAwMDAsIDB4MDE0MCwgMHgwODBjLCAweGRjMjgsIDB4MDgwYywgMHg4MzVhLAorCTB4MjAwOSwgMHgwMDE0LCAweDA4MGMsIDB4YTE1ZCwgMHgwMGNlLCAweDAwMDAsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MjAwMSwgMHgxOWRiLCAweDIwMDQsIDB4OTAwNSwgMHgxZGIwLAorCTB4MDBjNiwgMHgyMDYxLCAweDE5YmYsIDB4NjEyOCwgMHg5MTkyLCAweDAwMDMsIDB4MWUwOCwgMHg4MTA4LAorCTB4NjEyYSwgMHgwMGNlLCAweDA4MGMsIDB4ODM1MSwgMHgwODBjLCAweDVkZWEsIDB4MjAwOSwgMHgxODVhLAorCTB4MjExNCwgMHg4MjEwLCAweDIyMGEsIDB4MGMxMCwgMHgwMDk2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LAorCTB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4ODM2NywgMHgyMDcxLCAweDE5YmYsIDB4NzEzYywgMHg4MWZmLAorCTB4MDkwNCwgMHg5NzRhLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg3MjA3LAorCTB4MTE5MCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMiwgMHgwODBjLCAweDk5OWQsIDB4MDAzZSwgMHg3MTNjLAorCTB4MjE2MCwgMHgwODBjLCAweGRjMjgsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4YTE1ZCwgMHgwODBjLAorCTB4NzJkMiwgMHgwODA0LCAweDk3NGEsIDB4MDgwYywgMHg5NzU2LCAweDA5MDQsIDB4OTc0YSwgMHg2OTA0LAorCTB4ZDFmNCwgMHgwOTA0LCAweDk3NTEsIDB4MDgwYywgMHgyYzk4LCAweDAwYzYsIDB4NzAzYywgMHg5MDY1LAorCTB4MDkwYywgMHgwZGZhLCAweDYwMjAsIDB4MDBjZSwgMHg5MDg2LCAweDAwMDYsIDB4MTU2OCwgMHg2MWM4LAorCTB4NjBjNCwgMHg5MTA1LCAweDE1NDgsIDB4MjAwOSwgMHgxODBjLCAweDIxMDQsIDB4ZDBkNCwgMHgwNTIwLAorCTB4NjIxNCwgMHg5Mjk0LCAweDE4MDAsIDB4MTEyOCwgMHg2MjI0LCAweDkyOTQsIDB4MDAwMiwgMHgxNTUwLAorCTB4MDA3MCwgMHhjMGQ0LCAweDIwMGEsIDB4MDAwNiwgMHgyMDAxLCAweDAxMDAsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAwYSwgMHgwMDBlLCAweDAxMjAsIDB4ZDBjYywgMHgwMTEwLCAweDA4MGMsIDB4MmJjYSwgMHg2MDE0LAorCTB4OTA4NCwgMHhlN2ZkLCAweDkwODUsIDB4MDAxMCwgMHg2MDE2LCAweDcwM2MsIDB4MjA2MCwgMHgyMDA5LAorCTB4MDA0OSwgMHgwODBjLCAweGExNWQsIDB4MDA3MCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLAorCTB4OTk5ZCwgMHgwMDNlLCAweDcxM2MsIDB4MjE2MCwgMHgwODBjLCAweGRjMjgsIDB4MjAwOSwgMHgwMDRhLAorCTB4MDgwYywgMHhhMTVkLCAweDAwMmUsIDB4MDAxZSwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDllLAorCTB4MDAwNSwgMHhkMWVjLCAweDE5MDQsIDB4OTcwMywgMHgwODA0LCAweDk3MDUsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA5NiwgMHg3MDNjLCAweDkwNjUsIDB4MDkwYywgMHgwZGZhLCAweDIwMDEsIDB4MDMwNiwgMHgyMDBjLAorCTB4OTE4NCwgMHgwMDMwLCAweDA5MDQsIDB4OTdmZiwgMHg5MTg0LCAweDAwNDgsIDB4OTA4NiwgMHgwMDA4LAorCTB4MTkwNCwgMHg5N2ZmLCAweDIwMDksIDB4MDIwNiwgMHgyMTA0LCAweDIwMDksIDB4MDIwMywgMHgyMTBjLAorCTB4OTEwNiwgMHgxOTA0LCAweDk3ZmYsIDB4MjAwOSwgMHgwMjJhLCAweDIxMDQsIDB4MjAwOSwgMHgwMjJmLAorCTB4MjEwYywgMHg5MTE2LCAweDkwODQsIDB4MDNmZiwgMHg5MThjLCAweDAzZmYsIDB4OTI5NCwgMHgwNDAwLAorCTB4MDExMCwgMHg5MTAyLCAweDAwMzAsIDB4MjAxMCwgMHgyMTAwLCAweDkyMDIsIDB4MjAwOSwgMHgwMjI4LAorCTB4OTEwMiwgMHg5MDgyLCAweDAwMDUsIDB4MDI1MCwgMHgyMDA4LCAweDIwMDEsIDB4MDEzYiwgMHgyMDA0LAorCTB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4OTEwMiwgMHgxYTA0LCAweDk3ZmYsIDB4MjAwOSwgMHgxYTU4LAorCTB4MjEwNCwgMHg4MDAwLCAweDAyMDgsIDB4MjAwYSwgMHgyMDY5LCAweDAxMDAsIDB4NjkxNCwgMHg5MThjLAorCTB4MDE4NCwgMHg5MThkLCAweDAwMTAsIDB4NjkxNiwgMHg2OWM4LCAweDIwMTEsIDB4MDAyMCwgMHg2OGM4LAorCTB4OTEwNiwgMHgxNTcwLCAweDgyMTEsIDB4MWRkOCwgMHgyMDAxLCAweDAzMDYsIDB4MjAwMywgMHg0ODAwLAorCTB4MjAwMSwgMHgwMDlhLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLCAweDFhM2QsIDB4MjAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgxYTQ2LCAweDIwMDMsIDB4MDAwMCwgMHg2YTg4LCAweDY5OGMsIDB4MjIwMCwgMHg5MTA1LAorCTB4MTEyMCwgMHgyYzEwLCAweDA4MGMsIDB4MWFmZSwgMHgwMDQwLCAweDYwMTQsIDB4MjA0OCwgMHhhYTNhLAorCTB4YTkzNiwgMHg2YWM0LCAweDY5YzgsIDB4YTk0NiwgMHhhYTRhLCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLAorCTB4MjQwMCwgMHgwMDJlLCAweDA4MGMsIDB4MWI4YSwgMHgxOTBjLCAweDBkZmEsIDB4MDEyZSwgMHgwMDkwLAorCTB4MjAwOSwgMHgxYTU5LCAweDIxMDQsIDB4ODAwMCwgMHgwMjA4LCAweDIwMGEsIDB4NjljOCwgMHgyMDExLAorCTB4MDAyMCwgMHg4MjExLCAweDFkZjAsIDB4NjhjOCwgMHg5MTA2LCAweDFkYzAsIDB4NjljNCwgMHg2OGM4LAorCTB4OTEwNSwgMHgwMTYwLCAweDY4MjQsIDB4ZDA4YywgMHgwMTEwLCAweDY4MjcsIDB4MDAwMiwgMHg3MDQ4LAorCTB4YzA4NSwgMHg3MDRhLCAweDAwNzksIDB4NzA0OCwgMHhjMDg0LCAweDcwNGEsIDB4MjAwOSwgMHgwN2QwLAorCTB4MDgwYywgMHg4MzVmLCAweDkwMDYsIDB4MDA5ZSwgMHgwMGNlLCAweDAwZGUsIDB4MDAwNSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwY2M4LCAweDAwMjYsIDB4MDBlNiwgMHgyMDcxLCAweDE5YmYsIDB4NzA0OCwgMHhkMDg0LAorCTB4MDFjMCwgMHg3MTNjLCAweDgxZmYsIDB4MDFhOCwgMHgyMDcxLCAweDAxMDAsIDB4OTE4OCwgMHgwMDA4LAorCTB4MjExNCwgMHg5MjhlLCAweDAwMDYsIDB4MTEzOCwgMHg3MDE0LCAweDkwODQsIDB4MTk4NCwgMHg5MDg1LAorCTB4MDAxMiwgMHg3MDE2LCAweDAwMzAsIDB4NzAxNCwgMHg5MDg0LCAweDE5ODQsIDB4OTA4NSwgMHgwMDE2LAorCTB4NzAxNiwgMHgwMGVlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGI2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDEwLAorCTB4MjA1OCwgMHhiY2EwLCAweDIwNzEsIDB4MTliZiwgMHg3MDE4LCAweDIwNTgsIDB4OGJmZiwgMHgwMTkwLAorCTB4YjhhMCwgMHg5NDA2LCAweDAxMTgsIDB4Yjg1NCwgMHgyMDU4LCAweDBjYzAsIDB4NjAxNCwgMHgwMDk2LAorCTB4MjA0OCwgMHhhYzZjLCAweGFkNzAsIDB4YWU3OCwgMHgwMDllLCAweDA4MGMsIDB4NjVkMSwgMHgwMTEwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDAwZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMGNlLAorCTB4MDBkZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgwODBjLCAweDkxMmUsIDB4NzAwMywgMHgxMjAwLAorCTB4NzgzOCwgMHg3MDEyLCAweDc4M2MsIDB4NzAxNiwgMHgwMGM2LCAweDc4MjAsIDB4OTA4NiwgMHgwMDA0LAorCTB4MTE0OCwgMHg3ODEwLCAweDkwMDUsIDB4MDEzMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgxMCwgMHhiOTE0LAorCTB4MDBiZSwgMHgwMDIwLCAweDIwNjEsIDB4MTgwMCwgMHg2MDc4LCAweDYxN2MsIDB4OTA4NCwgMHgwMGZmLAorCTB4NzAwYSwgMHg3MTBlLCAweDAwY2UsIDB4NjBjMywgMHgwMDJjLCAweDA4MDQsIDB4OTYyYSwgMHgwODBjLAorCTB4OTEyZSwgMHg3MDAzLCAweDBmMDAsIDB4NzgwOCwgMHhkMDljLCAweDAxMjgsIDB4YjgxMCwgMHg5MDg0LAorCTB4MDBmZiwgMHg3MDBhLCAweGI4MTQsIDB4NzAwZSwgMHg2MGMzLCAweDAwMDgsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDE1NiwgMHgwODBjLCAweDkxNzksIDB4NzAwMywgMHgwMjAwLCAweDIwMTEsIDB4MTg0OCwgMHg2M2YwLAorCTB4MjMxMiwgMHgyMGE5LCAweDAwMDYsIDB4MjAxMSwgMHgxODQwLCAweDIwMTksIDB4MTg0MSwgMHg5ZWYwLAorCTB4MDAwMiwgMHgyMzc2LCAweDhlNzAsIDB4MjI3NiwgMHg4ZTcwLCAweDkzOTgsIDB4MDAwMiwgMHg5MjkwLAorCTB4MDAwMiwgMHgxZjA0LCAweDk4OTksIDB4NjBjMywgMHgwMDFjLCAweDAxNWUsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4OTE1NSwgMHgwODBjLCAweDkxNjcsIDB4OWU4MCwgMHgwMDA0LAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTAsIDB4NzgxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTgwMCwgMHgyMDQ4LAorCTB4YTg2MCwgMHgyMGUwLCAweGE4NWMsIDB4OTA4MCwgMHgwMDIxLCAweDIwOTgsIDB4MDA5ZSwgMHg3ODA4LAorCTB4OTA4OCwgMHgwMDAyLCAweDIxYTgsIDB4OTE5MiwgMHgwMDEwLCAweDEyNTAsIDB4NDAwMywgMHg5MDgwLAorCTB4MDAwNCwgMHg4MDAzLCAweDYwYzIsIDB4MDgwYywgMHg5NjJhLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MjBhOSwgMHgwMDEwLCAweDQwMDMsIDB4MDgwYywgMHg5ZWQ2LCAweDIwYTEsIDB4MDI0MCwgMHgyMmE4LAorCTB4NDAwMywgMHgwYzY4LCAweDA4MGMsIDB4OTEyZSwgMHg3MDAzLCAweDYyMDAsIDB4NzgwOCwgMHg3MDBlLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OTYyYSwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg5MTJlLAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI0YywgMHg3ODE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODAwLAorCTB4MjA0OCwgMHhhODYwLCAweDIwZTAsIDB4YTg1YywgMHg5MDgwLCAweDAwMjMsIDB4MjA5OCwgMHgwMDllLAorCTB4NzgwOCwgMHg5MDg4LCAweDAwMDIsIDB4MjFhOCwgMHg0MDAzLCAweDgwMDMsIDB4NjBjMiwgMHgwODBjLAorCTB4OTYyYSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTliZiwgMHg3MDBjLCAweDIwNjAsIDB4OGNmZiwgMHgwMTc4LAorCTB4MDgwYywgMHhjMDNmLCAweDExMTAsIDB4MDgwYywgMHhhYTgxLCAweDYwMGMsIDB4MDAwNiwgMHgwODBjLAorCTB4YzJhYiwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg5YTRlLCAweDAwY2UsIDB4MGM3OCwgMHgyYzAwLAorCTB4NzAwZSwgMHg3MDBhLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LAorCTB4MDE1NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAyNiwgMHgwMDE2LAorCTB4MDAwNiwgMHgyMDkxLCAweDgwMDAsIDB4MjAwMSwgMHgxODBjLCAweDIwMGMsIDB4OTE4YywgMHhlN2ZmLAorCTB4MjEwMiwgMHgyMDY5LCAweDAxMDAsIDB4MjA3OSwgMHgwMTQwLCAweDIwNzEsIDB4MTliZiwgMHg3MDI0LAorCTB4MjA2MCwgMHg4Y2ZmLCAweDAxZjgsIDB4MDgwYywgMHg5NjU2LCAweDZhYzAsIDB4NjhjMywgMHgwMDAwLAorCTB4MDgwYywgMHg4MzVhLCAweDAwYzYsIDB4MjA2MSwgMHgwMTAwLCAweDA4MGMsIDB4OWVlZiwgMHgwMGNlLAorCTB4MjBhOSwgMHgwMWY0LCAweDA0NjEsIDB4MjAwOSwgMHgwMDEzLCAweDA4MGMsIDB4YTE1ZCwgMHgwMDBlLAorCTB4MDAxZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTVlLAorCTB4MDEyZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgwMCwgMHgyMDA0LCAweDkwOTYsIDB4MDAwMSwgMHgwZDc4LAorCTB4OTA5NiwgMHgwMDA0LCAweDBkNjAsIDB4MDgwYywgMHg4MzVhLCAweDY4MTQsIDB4OTA4NCwgMHgwMDAxLAorCTB4MDExMCwgMHg2OGE3LCAweDk1ZjUsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsIDB4MDAwMCwgMHgyMDExLAorCTB4NWQ5NCwgMHgwODBjLCAweDgyZGEsIDB4MjBhOSwgMHgwMWY0LCAweDAwMDksIDB4MDhjMCwgMHg2ODI0LAorCTB4ZDA5NCwgMHgwMTQwLCAweDY4MjcsIDB4MDAwNCwgMHg3ODA0LCAweDkwODQsIDB4NDAwMCwgMHgxOTBjLAorCTB4MmM5OCwgMHgwMDkwLCAweGQwODQsIDB4MDExOCwgMHg2ODI3LCAweDAwMDEsIDB4MDAxMCwgMHgxZjA0LAorCTB4OTk3ZiwgMHg3ODA0LCAweDkwODQsIDB4MTAwMCwgMHgwMTM4LCAweDIwMDEsIDB4MDEwMCwgMHgwODBjLAorCTB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHg5MThjLCAweGRiZmYsIDB4MjEwMiwgMHgyMDY5LAorCTB4MDEwMCwgMHgyMDc5LCAweDAxNDAsIDB4MjA3MSwgMHgxOWJmLCAweDcwM2MsIDB4MjA2MCwgMHg4Y2ZmLAorCTB4MDkwNCwgMHg5YTA0LCAweDkzODYsIDB4MDAwMiwgMHgxMTI4LCAweDY4MTQsIDB4OTA4NCwgMHgwMDAyLAorCTB4MDkwNCwgMHg5YTA0LCAweDY4YWYsIDB4OTVmNSwgMHg2ODE3LCAweDAwMTAsIDB4MjAwOSwgMHgwMGZhLAorCTB4ODEwOSwgMHgxZGYwLCAweDY5YzYsIDB4NjhjYiwgMHgwMDA4LCAweDA4MGMsIDB4ODM2NywgMHgwODBjLAorCTB4MWYzMiwgMHgyMDAxLCAweDAwMzIsIDB4NjkyMCwgMHhkMWJjLCAweDAxMzAsIDB4ODAwMSwgMHgxZGQ4LAorCTB4NjkyYywgMHg5MThkLCAweDAwMDgsIDB4NjkyZSwgMHgyMGE5LCAweDAzZTgsIDB4NjgyNCwgMHhkMDk0LAorCTB4MDE0MCwgMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHg5MDg0LCAweDQwMDAsIDB4MTkwYywgMHgyYzk4LAorCTB4MDA5MCwgMHhkMDhjLCAweDAxMTgsIDB4NjgyNywgMHgwMDAyLCAweDAwMTAsIDB4MWYwNCwgMHg5OWRlLAorCTB4NzgwNCwgMHg5MDg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYzg4LAorCTB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4NjgyNywgMHg0MDAwLCAweDY4MjQsIDB4ODNmZiwgMHgxMTIwLAorCTB4MjAwOSwgMHgwMDQ5LCAweDA4MGMsIDB4YTE1ZCwgMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDZlLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMTVlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgxOWJmLCAweDZhMDYsIDB4MDEyZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MTliZiwgMHg2YTMyLAorCTB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg5MmYxLCAweDc4NTQsIDB4NzAzMiwgMHg3MDQyLAorCTB4NzA0NywgMHgxMDAwLCAweDAwZjgsIDB4MDgwYywgMHg5MmYxLCAweDc4NTQsIDB4NzAzMiwgMHg3MDQyLAorCTB4NzA0NywgMHg0MDAwLCAweDAwYjgsIDB4MDgwYywgMHg5MmYxLCAweDc4NTQsIDB4NzAzMiwgMHg3MDQyLAorCTB4NzA0NywgMHgyMDAwLCAweDAwNzgsIDB4MDgwYywgMHg5MmYxLCAweDc4NTQsIDB4NzAzMiwgMHg3MDQyLAorCTB4NzA0NywgMHgwNDAwLCAweDAwMzgsIDB4MDgwYywgMHg5MmYxLCAweDc4NTQsIDB4NzAzMiwgMHg3MDQyLAorCTB4NzA0NywgMHgwMjAwLCAweDYwYzMsIDB4MDAyMCwgMHgwODA0LCAweDk2MmEsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTliZiwgMHg3MDIwLCAweDkwMDUsIDB4MDExMCwgMHg4MDAxLCAweDcwMjIsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNjYsIDB4MDAwNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MTliZiwgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHgyMDM5LAorCTB4MDAwMSwgMHg4N2ZmLCAweDA5MDQsIDB4OWFmMywgMHg4Y2ZmLCAweDA5MDQsIDB4OWFmMywgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4OWFlZSwgMHg4OGZmLCAweDAxMzgsIDB4MjgwMCwgMHg5YzA2LAorCTB4MTkwNCwgMHg5YWVlLCAweDIwMzksIDB4MDAwMCwgMHgwMDUwLCAweDYwMTAsIDB4OWIwNiwgMHgxOTA0LAorCTB4OWFlZSwgMHg4NWZmLCAweDAxMjAsIDB4NjA1NCwgMHg5MTA2LCAweDE5MDQsIDB4OWFlZSwgMHg3MDI0LAorCTB4OWMwNiwgMHgxNWIwLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweDkwMDUsIDB4MTE2MCwgMHg2ODI0LAorCTB4ZDA4NCwgMHgwMTQ4LCAweDY4MjcsIDB4MDAwMSwgMHgwODBjLCAweDgzNWEsIDB4MDgwYywgMHg5Yjc4LAorCTB4NzAyNywgMHgwMDAwLCAweDA0MjgsIDB4MDgwYywgMHg4MzVhLCAweDY4MjAsIDB4ZDBiNCwgMHgwMTEwLAorCTB4NjhhNywgMHg5NWY1LCAweDY4MTcsIDB4MDAwOCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg5Yjc4LAorCTB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4OTM4NCwgMHgxMDAwLAorCTB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYzg4LCAweDkwMDYsIDB4MDgwYywgMHgyYzg4LAorCTB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLAorCTB4NzAxNCwgMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjE2LCAweDcwMTAsIDB4OWMzNiwgMHgxMTQwLAorCTB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDEyLCAweDAwMTAsIDB4NzAxMywgMHgwMDAwLAorCTB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LAorCTB4ODlmZiwgMHgxMTY4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHgwODBjLAorCTB4YmUzNSwgMHgwMTEwLCAweDA4MGMsIDB4ZDgzMCwgMHgwMDllLCAweDA4MGMsIDB4YTExMywgMHgwODBjLAorCTB4OWE0ZSwgMHg4OGZmLCAweDExOTAsIDB4MDBjZSwgMHgwODA0LCAweDlhNjksIDB4MmM3OCwgMHg2MDBjLAorCTB4MjA2MCwgMHgwODA0LCAweDlhNjksIDB4OTAwNiwgMHgwMTJlLCAweDAwMGUsIDB4MDA2ZSwgMHgwMDdlLAorCTB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDYwMWIsIDB4MDAwMCwgMHgwMGNlLAorCTB4OThjNSwgMHgwMDAxLCAweDBjODgsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDA5NiwgMHgwMGM2LAorCTB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgxOWJmLAorCTB4NzYzOCwgMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDliNjcsIDB4NjAyMCwgMHg5MDg2LAorCTB4MDAwNiwgMHgxOTA0LCAweDliNjIsIDB4ODdmZiwgMHgwMTI4LCAweDI3MDAsIDB4OWMwNiwgMHgxOTA0LAorCTB4OWI2MiwgMHgwMDQwLCAweDYwMTAsIDB4OWIwNiwgMHgxNWU4LCAweDg1ZmYsIDB4MDExOCwgMHg2MDU0LAorCTB4OTEwNiwgMHgxNWMwLCAweDcwM2MsIDB4OWMwNiwgMHgxMTY4LCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLAorCTB4MDgwYywgMHg5OTlkLCAweDcwMzMsIDB4MDAwMCwgMHg5MDA2LCAweDcwM2UsIDB4NzA0MiwgMHg3MDQ2LAorCTB4NzA0YSwgMHgwMDNlLCAweDcwMzgsIDB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LAorCTB4OWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAzNiwgMHgwMDEwLAorCTB4NzAzNywgMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLAorCTB4MDAwOCwgMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM1LAorCTB4MDExMCwgMHgwODBjLCAweGQ4MzAsIDB4MDgwYywgMHhhMTEzLCAweDg3ZmYsIDB4MTE5OCwgMHgwMGNlLAorCTB4MDgwNCwgMHg5YjEzLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4OWIxMywgMHg5MDA2LAorCTB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMGNlLCAweDAwOWUsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDYwMWIsIDB4MDAwMCwgMHgwMGNlLCAweDk3YmQsIDB4MDAwMSwgMHgwYzgwLAorCTB4MDBlNiwgMHgyMDcxLCAweDE5YmYsIDB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAyLAorCTB4MTExOCwgMHg3MDA3LCAweDAwMDUsIDB4MDAxMCwgMHg3MDA3LCAweDAwMDAsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDE5YmYsIDB4MmMxMCwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLAorCTB4MDU0MCwgMHgyMjAwLCAweDljMDYsIDB4MTUwOCwgMHg3MDM4LCAweDljMzYsIDB4MTExMCwgMHg2NjBjLAorCTB4NzYzYSwgMHg3MDM0LCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLCAweDlmMzYsIDB4MDExOCwgMHgyZjAwLAorCTB4NzAzNiwgMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMDQsIDB4OTA4NiwgMHgwMDQwLAorCTB4MDkwYywgMHg4YjA0LCAweDkwODUsIDB4MDAwMSwgMHgwMDIwLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLAorCTB4MDhiMCwgMHgwMTJlLCAweDAwMGUsIDB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLAorCTB4MDAwNSwgMHgwMDk2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MDA2NiwgMHgwMDI2LAorCTB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweDE5YmYsIDB4NzYwYywgMHgyNjYwLAorCTB4MjY3OCwgMHg4Y2ZmLCAweDA5MDQsIDB4OWM1ZSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGEwLAorCTB4MDBiZSwgMHg5MjA2LCAweDE5MDQsIDB4OWM1OSwgMHg3MDI0LCAweDljMDYsIDB4MTUyMCwgMHgyMDY5LAorCTB4MDEwMCwgMHg2OGMwLCAweDkwMDUsIDB4MDkwNCwgMHg5YzMwLCAweDA4MGMsIDB4OTY1NiwgMHg2OGMzLAorCTB4MDAwMCwgMHgwODBjLCAweDliNzgsIDB4NzAyNywgMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLAorCTB4NmIwNCwgMHg5Mzg0LCAweDEwMDAsIDB4MDEzOCwgMHgyMDAxLCAweDAxMDAsIDB4MDgwYywgMHgyYzg4LAorCTB4OTAwNiwgMHgwODBjLCAweDJjODgsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMTEwLAorCTB4NjgyNywgMHgwMDAxLCAweDAwM2UsIDB4NzAwYywgMHg5YzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjBlLAorCTB4NzAwOCwgMHg5YzM2LCAweDExNDAsIDB4MmMwMCwgMHg5ZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDBhLAorCTB4MDAxMCwgMHg3MDBiLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsIDB4OWYwNiwgMHgwMTEwLAorCTB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsIDB4YzAyZSwgMHgxMTgwLAorCTB4MDgwYywgMHgzMWI0LCAweDA4MGMsIDB4YzAzZiwgMHgxNTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwNDAwLAorCTB4MDgwYywgMHg5Yjc4LCAweDY4MjQsIDB4ZDA4NCwgMHgwOWIwLCAweDY4MjcsIDB4MDAwMSwgMHgwODk4LAorCTB4MDgwYywgMHhjMDNmLCAweDExMTgsIDB4MDgwYywgMHhhYTgxLCAweDAwOTAsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhiZTM1LCAweDAxNjgsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDMsIDB4MTUwOCwgMHhhODY3LAorCTB4MDEwMywgMHhhYjdhLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZGMsIDB4MDgwYywgMHhjMDIyLAorCTB4MDgwYywgMHhjMmFiLCAweDA4MGMsIDB4YTExMywgMHgwODBjLCAweDlhNGUsIDB4MDBjZSwgMHgwODA0LAorCTB4OWJkOSwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDliZDksIDB4MDEyZSwgMHgwMDBlLAorCTB4MDAyZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MWQyMCwgMHgwODBjLCAweGQ4MzAsIDB4MGMwOCwgMHgwMGQ2LAorCTB4MDgwYywgMHg5MTc5LCAweDcwMDMsIDB4MDIwMCwgMHg3MDA3LCAweDAwMTQsIDB4NjBjMywgMHgwMDE0LAorCTB4MjBlMSwgMHgwMDAxLCAweDIwOTksIDB4MTk2MSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjUwLAorCTB4MjBhOSwgMHgwMDA0LCAweDQwMDMsIDB4NzAyMywgMHgwMDA0LCAweDcwMjcsIDB4Nzg3OCwgMHgwODBjLAorCTB4OTYyYSwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg5MTc5LCAweDcwMGIsIDB4MDgwMCwgMHg3ODE0LAorCTB4OTA4NCwgMHhmZjAwLCAweDcwMGUsIDB4NzgxNCwgMHg5MDg0LCAweDAwZmYsIDB4NzAyMiwgMHg3ODJjLAorCTB4NzAyNiwgMHg3ODU4LCAweDkwODQsIDB4MDBmZiwgMHg5MDg1LCAweDAyMDAsIDB4NzAwMiwgMHg3ODU4LAorCTB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4NzAwNiwgMHg2MGMyLCAweDA4MDQsIDB4OTYyYSwgMHgwMGI2LAorCTB4MDBkNiwgMHgwMDE2LCAweDAwZDYsIDB4MmY2OCwgMHgyMDA5LCAweDAwMzUsIDB4MDgwYywgMHhjNGIxLAorCTB4MDBkZSwgMHgxOTA0LCAweDlkMGMsIDB4MDgwYywgMHg5MTJlLCAweDcwMDMsIDB4MTMwMCwgMHg3ODJjLAorCTB4MDgwYywgMHg5ZTEyLCAweDIwNjgsIDB4NjgyMCwgMHg5MDg2LCAweDAwMDMsIDB4MDU2MCwgMHg3ODEwLAorCTB4MjA1OCwgMHhiYWEwLCAweDA4MGMsIDB4YTA2MiwgMHgxMWQ4LCAweDkyODYsIDB4MDA3ZSwgMHgxMTI4LAorCTB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmZSwgMHgwNDk4LCAweDkyODYsIDB4MDA3ZiwgMHgxMTI4LAorCTB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmZCwgMHgwNDU4LCAweDkyODQsIDB4ZmY4MCwgMHgwMTgwLAorCTB4OTI4NiwgMHgwMDgwLCAweDExMjgsIDB4NzAwYiwgMHgwMGZmLCAweDcwMGYsIDB4ZmZmYywgMHgwNDAwLAorCTB4OTJkOCwgMHgxMDAwLCAweDJiNWMsIDB4YjgxMCwgMHg3MDBhLCAweGI4MTQsIDB4NzAwZSwgMHgwMGMwLAorCTB4NjA5OCwgMHg3MDBlLCAweDAwYTgsIDB4MDgwYywgMHhhMDYyLCAweDExMzAsIDB4NzgxMCwgMHgyMDU4LAorCTB4YjhhMCwgMHg5MDgyLCAweDAwN2UsIDB4MDI1MCwgMHgwMGQ2LCAweDIwNjksIDB4MTgxZSwgMHgyZDA0LAorCTB4NzAwYSwgMHg4ZDY4LCAweDJkMDQsIDB4NzAwZSwgMHgwMGRlLCAweDAwMTAsIDB4NjAzNCwgMHg3MDBlLAorCTB4NzgzOCwgMHg3MDEyLCAweDc4M2MsIDB4NzAxNiwgMHg2MGMzLCAweDAwMGMsIDB4MDAxZSwgMHgwMGRlLAorCTB4MDgwYywgMHg5NjJhLCAweDAwYmUsIDB4MDAwNSwgMHg3ODFiLCAweDAwMDEsIDB4NzgwMywgMHgwMDA2LAorCTB4MDAxZSwgMHgwMGRlLCAweDAwYmUsIDB4MDAwNSwgMHg3OTJjLCAweDkxODAsIDB4MDAwOCwgMHgyMDBjLAorCTB4OTE4NiwgMHgwMDA2LCAweDAxYzAsIDB4OTE4NiwgMHgwMDAzLCAweDA5MDQsIDB4OWQ4NywgMHg5MTg2LAorCTB4MDAwNSwgMHgwOTA0LCAweDlkNmYsIDB4OTE4NiwgMHgwMDA0LCAweDA1ZDgsIDB4OTE4NiwgMHgwMDA4LAorCTB4MDkwNCwgMHg5ZDc4LCAweDc4MDcsIDB4MDAzNywgMHg3ODJmLCAweDAwMDMsIDB4NzgxNywgMHgxNzAwLAorCTB4MDgwYywgMHg5ZGVmLCAweDAwMDUsIDB4MDgwYywgMHg5ZGIwLCAweDAwZDYsIDB4MDAyNiwgMHg3OTJjLAorCTB4MjE2OCwgMHgyMDA5LCAweDQwMDAsIDB4NjgwMCwgMHgwMDAyLCAweDlkNTAsIDB4OWQ1YiwgMHg5ZDUyLAorCTB4OWQ1YiwgMHg5ZDU3LCAweDlkNTAsIDB4OWQ1MCwgMHg5ZDViLCAweDlkNWIsIDB4OWQ1YiwgMHg5ZDViLAorCTB4OWQ1MCwgMHg5ZDUwLCAweDlkNTAsIDB4OWQ1MCwgMHg5ZDUwLCAweDlkNWIsIDB4OWQ1MCwgMHg5ZDViLAorCTB4MDgwYywgMHgwZGZhLCAweDY4MjQsIDB4ZDBlNCwgMHgwMTEwLCAweGQwY2MsIDB4MDExMCwgMHg5MDBlLAorCTB4MDAxMCwgMHgyMDA5LCAweDIwMDAsIDB4NjgyYywgMHg3MDIyLCAweDY4MzAsIDB4NzAyNiwgMHgwODA0LAorCTB4OWRhOSwgMHgwODBjLCAweDlkYjAsIDB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHgyMDA5LAorCTB4NDAwMCwgMHg2YTAwLCAweDkyODYsIDB4MDAwMiwgMHgxMTA4LCAweDkwMGUsIDB4MDRkMCwgMHgwODBjLAorCTB4OWRiMCwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyYywgMHgyMTY4LCAweDIwMDksIDB4NDAwMCwgMHgwNDg4LAorCTB4MDRiOSwgMHgwMGQ2LCAweDAwMjYsIDB4NzkyYywgMHgyMTY4LCAweDIwMDksIDB4NDAwMCwgMHg5Mjg2LAorCTB4MDAwNSwgMHgwMTE4LCAweDkyODYsIDB4MDAwMiwgMHgxMTA4LCAweDkwMGUsIDB4MDQxMCwgMHgwNDQxLAorCTB4MDBkNiwgMHgwMDI2LCAweDc5MmMsIDB4MjE2OCwgMHg2ODE0LCAweDY5MjQsIDB4YzE4NSwgMHg2OTI2LAorCTB4MDA5NiwgMHgyMDQ4LCAweGE5YWMsIDB4YTgzNCwgMHg5MTEyLCAweGE5YjAsIDB4YTgzOCwgMHgwMDllLAorCTB4OTEwMywgMHg3MDIyLCAweDcyMjYsIDB4NzkyYywgMHg5MTgwLCAweDAwMDAsIDB4MjAwNCwgMHg5MDhlLAorCTB4MDAwMiwgMHgwMTMwLCAweDkwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDIwMDksIDB4NDAwMCwgMHgwMDA4LAorCTB4OTAwZSwgMHg3MTJhLCAweDYwYzMsIDB4MDAxOCwgMHgwMDJlLCAweDAwZGUsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDBiNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDY2LCAweDA4MGMsIDB4OTE3OSwgMHg5MDA2LAorCTB4NzAwMywgMHgwMjAwLCAweDc5MzgsIDB4NzEwYSwgMHg3OTNjLCAweDcxMGUsIDB4NzgxMCwgMHgyMDU4LAorCTB4YjhhMCwgMHgwODBjLCAweGEwNjIsIDB4MTExOCwgMHg5MDkyLCAweDAwN2UsIDB4MDI2OCwgMHgwMGQ2LAorCTB4MjA2OSwgMHgxODFlLCAweDJkMmMsIDB4OGQ2OCwgMHgyZDM0LCAweDkwZDgsIDB4MTAwMCwgMHgyYjVjLAorCTB4YmIxMCwgMHhiYzE0LCAweDAwZGUsIDB4MDAyOCwgMHg5MDFlLCAweDY0OTgsIDB4MjAyOSwgMHgwMDAwLAorCTB4NjYzNCwgMHg3ODJjLCAweDkwODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgxMTI4LAorCTB4NzUxMiwgMHg3NjE2LCAweDczMWEsIDB4NzQxZSwgMHgwMDIwLCAweDczMTIsIDB4NzQxNiwgMHg3NTFhLAorCTB4NzYxZSwgMHgwMDZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwYmUsIDB4MDAwNSwgMHgwODBjLAorCTB4OTE3OSwgMHg3MDAzLCAweDAxMDAsIDB4NzgyYywgMHg3MDBhLCAweDc4MTQsIDB4NzAwZSwgMHg3MDBlLAorCTB4NjBjMywgMHgwMDA4LCAweDA4MDQsIDB4OTYyYSwgMHgwODBjLCAweDkxMjUsIDB4NzAwMywgMHgxNDAwLAorCTB4NzgzOCwgMHg3MDBhLCAweDAwNzksIDB4NzgzYywgMHg3MDBlLCAweDc4MmMsIDB4NzAxMiwgMHg3ODMwLAorCTB4NzAxNiwgMHg3ODM0LCAweDkwODQsIDB4MDBmZiwgMHg4MDA3LCAweDcwMWEsIDB4NjBjMywgMHgwMDEwLAorCTB4MDgwNCwgMHg5NjJhLCAweDAwZTYsIDB4MjA3MSwgMHgwMjQwLCAweDAwMDYsIDB4MDBmNiwgMHgyMDc4LAorCTB4NzgxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhiYywgMHhkMDg0LCAweDAxMjAsIDB4Nzg0NCwgMHg3MDJhLAorCTB4Nzg0OCwgMHg3MDJlLCAweDAwYmUsIDB4MDBmZSwgMHgwMDBlLCAweDAwZWUsIDB4MDAwNSwgMHgwODBjLAorCTB4OTE3MCwgMHg3MDAzLCAweDAxMDAsIDB4NzgyYywgMHg3MDBhLCAweDc4MTQsIDB4NzAwZSwgMHg2MGMzLAorCTB4MDAwOCwgMHgwODA0LCAweDk2MmEsIDB4MDAyMSwgMHg2MGMzLCAweDAwMDAsIDB4MDgwNCwgMHg5NjJhLAorCTB4MDBkNiwgMHgwODBjLCAweDllZWIsIDB4YjgxMCwgMHg5MDg1LCAweDAzMDAsIDB4NzAwMiwgMHhiODE0LAorCTB4NzAwNiwgMHgyMDY5LCAweDE4MDAsIDB4Njg3OCwgMHg3MDBhLCAweDY4N2MsIDB4NzAwZSwgMHg3MDEzLAorCTB4MDgxOSwgMHgwODBjLCAweDk2MTgsIDB4NzIxYSwgMHgyZjEwLCAweDcyMjIsIDB4N2EwOCwgMHg3MjI2LAorCTB4MjA3MSwgMHgwMjRjLCAweDAwZGUsIDB4MDAwNSwgMHgwMGE5LCAweDc5MTQsIDB4NzEyYSwgMHg2MGMzLAorCTB4MDAwMCwgMHg2MGE3LCAweDk1NzUsIDB4MDAyNiwgMHgwODBjLCAweDJhZmUsIDB4MDIyOCwgMHgyMDExLAorCTB4MDEwMSwgMHgyMjA0LCAweGMwYzUsIDB4MjAxMiwgMHgwMDJlLCAweDA4MGMsIDB4OTY0ZCwgMHgwODBjLAorCTB4ODM1MSwgMHgwMDA1LCAweDAwMzYsIDB4MDA5NiwgMHgwMGQ2LCAweDAwZTYsIDB4Nzg1OCwgMHgyMDQ4LAorCTB4YWE3YywgMHg5Mjk2LCAweDAwYzAsIDB4OTI5NCwgMHhmZmZkLCAweGFhN2UsIDB4YWE4MCwgMHg5Mjk0LAorCTB4MDMwMCwgMHhhYTgyLCAweGE5NmMsIDB4OTE5NCwgMHgwMGZmLCAweGFiNzQsIDB4OTM4NCwgMHgwMGZmLAorCTB4OTA4ZCwgMHhjMjAwLCAweGE5NmUsIDB4OTM4NCwgMHhmZjAwLCAweDkyMTUsIDB4YWE3NiwgMHhhODcwLAorCTB4YWE3OCwgMHhhODdhLCAweGFhNzIsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsIDB4MDgwYywgMHg5ZWViLAorCTB4MDBkZSwgMHgyMGU5LCAweDAwMDAsIDB4MjBhMSwgMHgwMjQwLCAweDIwYTksIDB4MDAwYSwgMHhhODYwLAorCTB4MjBlMCwgMHhhODVjLCAweDkwODAsIDB4MDAxYiwgMHgyMDk4LCAweDQwMDMsIDB4NjBhMywgMHgwMDM1LAorCTB4YWE2OCwgMHg5Mjk0LCAweDcwMDAsIDB4OTI4NiwgMHgzMDAwLCAweDAxMTAsIDB4NjBhMywgMHgwMDM3LAorCTB4MDBlZSwgMHgwMGRlLCAweDAwOWUsIDB4MDAzZSwgMHgwMDA1LCAweDkwMGUsIDB4NzgxNCwgMHgwMDk2LAorCTB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDFjMCwgMHg5MDg0LCAweDAwMDMsIDB4MTFhOCwgMHgyMDAxLAorCTB4MTgwYywgMHgyMDA0LCAweGQwYmMsIDB4MDE4MCwgMHg3ODI0LCAweGQwY2MsIDB4MTE2OCwgMHhkMGM0LAorCTB4MTE1OCwgMHhhOGE4LCAweDkwMDUsIDB4MTE0MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWQ1LAorCTB4MjEwMiwgMHgyMDA5LCAweDE5OGEsIDB4MjEwYywgMHgwMDllLCAweDkxOGQsIDB4MDA5MiwgMHgwMDEwLAorCTB4MjAwOSwgMHgwMDk2LCAweDYwYWIsIDB4MDAzNiwgMHg2MTE2LCAweDAwMDUsIDB4MjAwOSwgMHgwMDA5LAorCTB4MDBhMCwgMHgyMDA5LCAweDAwMGEsIDB4MDA4OCwgMHgyMDA5LCAweDAwMGIsIDB4MDA3MCwgMHgyMDA5LAorCTB4MDAwYywgMHgwMDU4LCAweDIwMDksIDB4MDAwZCwgMHgwMDQwLCAweDIwMDksIDB4MDAwZSwgMHgwMDI4LAorCTB4MjAwOSwgMHgwMDBmLCAweDAwMTAsIDB4MjAwOSwgMHgwMDA4LCAweDY5MTIsIDB4MDAwNSwgMHgwMGQ2LAorCTB4OTI5MCwgMHgwMDE4LCAweDgyMTQsIDB4MjBlOSwgMHgwMDAwLCAweDIwNjksIDB4MDIwMCwgMHg2ODEzLAorCTB4MDAwMCwgMHgyMmE4LCAweDkyODQsIDB4MDBlMCwgMHgwMTI4LCAweDIwYTksIDB4MDAyMCwgMHg5MjkyLAorCTB4MDAyMCwgMHgwMDA4LCAweDkwMTYsIDB4MjBhMSwgMHgwMjQwLCAweDkwMDYsIDB4NDAwNCwgMHg4MmZmLAorCTB4MDEyMCwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgwYzYwLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4YTg3OCwgMHg2MDU2LCAweDkwMDYsIDB4YTgzNiwgMHhhODNhLAorCTB4YTk5YywgMHhhOTQ2LCAweGE4NGEsIDB4NjAyMywgMHgwMDAzLCAweDYwMDcsIDB4MDA0MCwgMHg2MDAzLAorCTB4MDAwMywgMHg2MDBiLCAweGZmZmYsIDB4YTgxNywgMHgwMDAxLCAweGE4NDIsIDB4YTgzZSwgMHgyOTAwLAorCTB4YTg1YSwgMHhhODEzLCAweDFmYzYsIDB4MDgwYywgMHg4NmRlLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg4Y2VkLCAweDAxMmUsIDB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBkNiwgMHgwMGM2LCAweDAwYTYsIDB4MDA5NiwgMHgwMDY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgxOWJmLCAweDc2MGMsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDkwNCwgMHg5ZmMyLAorCTB4NzAyNCwgMHg5YzA2LCAweDE1MjAsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4OTAwNSwgMHgwOTA0LAorCTB4OWY5NCwgMHgwODBjLCAweDk2NTYsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsIDB4OWI3OCwgMHg3MDI3LAorCTB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweDkzODQsIDB4MTAwMCwgMHgwMTM4LAorCTB4MjAwMSwgMHgwMTAwLCAweDA4MGMsIDB4MmM4OCwgMHg5MDA2LCAweDA4MGMsIDB4MmM4OCwgMHgyMDY5LAorCTB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHg3MDBjLAorCTB4OWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYwZSwgMHg3MDA4LCAweDljMzYsIDB4MTE0MCwgMHgyYzAwLAorCTB4OWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAwYSwgMHgwMDEwLCAweDcwMGIsIDB4MDAwMCwgMHg2NjBjLAorCTB4MDA2NiwgMHgyYzAwLCAweDlmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLAorCTB4MDAwMCwgMHgwODBjLCAweGMwMmUsIDB4MTE4MCwgMHgwODBjLCAweDMxYjQsIDB4MDgwYywgMHhjMDNmLAorCTB4MTUxOCwgMHgwODBjLCAweGFhODEsIDB4MDQwMCwgMHgwODBjLCAweDliNzgsIDB4NjgyNCwgMHhkMDg0LAorCTB4MDliMCwgMHg2ODI3LCAweDAwMDEsIDB4MDg5OCwgMHgwODBjLCAweGMwM2YsIDB4MTExOCwgMHgwODBjLAorCTB4YWE4MSwgMHgwMDkwLCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGJlMzUsIDB4MDE2OCwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDAzLCAweDE1MjAsIDB4YTg2NywgMHgwMTAzLCAweGFiN2EsIDB4YTg3NywgMHgwMDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDA4MGMsIDB4YzAyMiwgMHgwODBjLCAweGMyYWIsIDB4MDgwYywgMHhhMTEzLAorCTB4MDgwYywgMHg5YTRlLCAweDAwY2UsIDB4MDgwNCwgMHg5ZjQ1LCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLAorCTB4MDgwNCwgMHg5ZjQ1LCAweDcwMGYsIDB4MDAwMCwgMHg3MDBiLCAweDAwMDAsIDB4MDEyZSwgMHgwMDZlLAorCTB4MDA5ZSwgMHgwMGFlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA2LCAweDFkMDgsIDB4MDgwYywgMHhkODMwLCAweDA4ZjAsIDB4MDBkNiwgMHgwMTU2LAorCTB4MDgwYywgMHg5MTc5LCAweDdhMTQsIDB4ODJmZiwgMHgwMTM4LCAweDcwMDMsIDB4MDEwMCwgMHg3MDBiLAorCTB4MDAwMywgMHg2MGMzLCAweDAwMDgsIDB4MDQ5MCwgMHg3MDAzLCAweDAyMDAsIDB4NzAwNywgMHgwMDAwLAorCTB4MjA2OSwgMHgxODAwLCAweDkwMWUsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTExMCwgMHhjMzhkLAorCTB4MDA2MCwgMHgwODBjLCAweDcyMDcsIDB4MTExMCwgMHhjM2FkLCAweDAwMDgsIDB4YzNhNSwgMHg2YWQ4LAorCTB4ZDI5YywgMHgxMTEwLCAweGQyYWMsIDB4MDEwOCwgMHhjMzlkLCAweDczMGUsIDB4MjAxMSwgMHgxODQ4LAorCTB4NjNmMCwgMHgyMzEyLCAweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweDE4NDAsIDB4MjAxOSwgMHgxODQxLAorCTB4MjA3MSwgMHgwMjUwLCAweDIzNzYsIDB4OGU3MCwgMHgyMjc2LCAweDhlNzAsIDB4OTM5OCwgMHgwMDAyLAorCTB4OTI5MCwgMHgwMDAyLCAweDFmMDQsIDB4YTAwYSwgMHg2MGMzLCAweDAwMjAsIDB4MDgwYywgMHg5NjJhLAorCTB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDE1NiwgMHgwODBjLCAweDkxNzksIDB4N2ExNCwgMHg4MmZmLAorCTB4MDE2OCwgMHg5Mjg2LCAweGZmZmYsIDB4MDExOCwgMHg5MjgyLCAweDAwMGUsIDB4MTIzOCwgMHg3MDAzLAorCTB4MDEwMCwgMHg3MDBiLCAweDAwMDMsIDB4NjBjMywgMHgwMDA4LCAweDA0ODgsIDB4NzAwMywgMHgwMjAwLAorCTB4NzAwNywgMHgwMDFjLCAweDcwMGYsIDB4MDAwMSwgMHgyMDExLCAweDE5OTUsIDB4MjIwNCwgMHg4MDA3LAorCTB4NzAxYSwgMHg4MjEwLCAweDIyMDQsIDB4ODAwNywgMHg3MDFlLCAweDA0MjEsIDB4MTEyMCwgMHhiOGEwLAorCTB4OTA4MiwgMHgwMDdmLCAweDAyNDgsIDB4MjAwMSwgMHgxODFlLCAweDIwMDQsIDB4NzAyMiwgMHgyMDAxLAorCTB4MTgxZiwgMHgyMDA0LCAweDcwMjYsIDB4MDAzMCwgMHgyMDAxLCAweDE4MTcsIDB4MjAwNCwgMHg5MDg0LAorCTB4MDBmZiwgMHg3MDI2LCAweDIwYTksIDB4MDAwNCwgMHgyMGUxLCAweDAwMDEsIDB4MjA5OSwgMHgxODA1LAorCTB4MjBlOSwgMHgwMDAwLCAweDIwYTEsIDB4MDI1NiwgMHg0MDAzLCAweDYwYzMsIDB4MDAxYywgMHgwMTVlLAorCTB4MDgwNCwgMHg5NjJhLCAweDAwMDYsIDB4MjAwMSwgMHgxODM2LCAweDIwMDQsIDB4ZDBhYywgMHgwMDBlLAorCTB4MDAwNSwgMHgyMDExLCAweDAwMDMsIDB4MDgwYywgMHg5YTBmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLAorCTB4OWExOSwgMHgwODBjLCAweDk5MjcsIDB4MDAzNiwgMHg5MDFlLCAweDA4MGMsIDB4OTk5ZCwgMHgwMDNlLAorCTB4MDAwNSwgMHgyMDcxLCAweDE4OGIsIDB4NzAwMCwgMHg5MDA1LCAweDAxNDAsIDB4MjAwMSwgMHgwOTc2LAorCTB4MjA3MSwgMHgxODAwLCAweDcwNzIsIDB4NzA3NiwgMHg3MDY3LCAweGZmZTAsIDB4MjA3MSwgMHgxODAwLAorCTB4NzA3MCwgMHg3MDUyLCAweDcwNTcsIDB4MWNkMCwgMHgwMDA1LCAweDAwZTYsIDB4MDEyNiwgMHgyMDcxLAorCTB4MTgwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU1MCwgMHg5NTgyLCAweDAwMTAsIDB4MDYwOCwgMHg3MDU0LAorCTB4MjA2MCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LCAweDljZTAsIDB4MDAxOCwgMHg3MDY0LAorCTB4OWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHgxY2QwLCAweDBjOTgsIDB4NjAwMywgMHgwMDA4LAorCTB4ODUyOSwgMHg3NTUyLCAweDljYTgsIDB4MDAxOCwgMHg3MDY0LCAweDk1MDIsIDB4MTIzMCwgMHg3NTU2LAorCTB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNTcsIDB4MWNkMCwgMHgwY2MwLAorCTB4OTAwNiwgMHgwY2MwLCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLCAweDc1NTAsIDB4OTU4MiwgMHgwMDEwLAorCTB4MDYwMCwgMHg3MDU0LCAweDIwNjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg5Y2UwLAorCTB4MDAxOCwgMHg3MDY0LCAweDljMDIsIDB4MTIwOCwgMHgwY2IwLCAweDIwNjEsIDB4MWNkMCwgMHgwYzk4LAorCTB4NjAwMywgMHgwMDA4LCAweDg1MjksIDB4NzU1MiwgMHg5Y2E4LCAweDAwMTgsIDB4NzA2NCwgMHg5NTAyLAorCTB4MTIyOCwgMHg3NTU2LCAweDkwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4NzA1NywgMHgxY2QwLAorCTB4MGNjOCwgMHg5MDA2LCAweDBjYzgsIDB4OWM4MiwgMHgxY2QwLCAweDBhMGMsIDB4MGRmYSwgMHgyMDAxLAorCTB4MTgxOSwgMHgyMDA0LCAweDljMDIsIDB4MWEwYywgMHgwZGZhLCAweDkwMDYsIDB4NjAwNiwgMHg2MDBhLAorCTB4NjAwZSwgMHg2MDE2LCAweDYwMWEsIDB4NjAxMiwgMHg2MDIzLCAweDAwMDAsIDB4NjAwMywgMHgwMDAwLAorCTB4NjAxZSwgMHg2MDU2LCAweDYwNWEsIDB4NjAyNiwgMHg2MDJhLCAweDYwMmUsIDB4NjAzMiwgMHg2MDM2LAorCTB4NjAzYSwgMHg2MDNlLCAweDYwNDIsIDB4MjA2MSwgMHgxODAwLCAweDYwNTAsIDB4ODAwMCwgMHg2MDUyLAorCTB4OTA4NiwgMHgwMDAxLCAweDAxMDgsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4OGMxMCwgMHgwMTJlLCAweDBjYzAsIDB4MDAwNiwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMWIwLAorCTB4NjAxYywgMHhkMDg0LCAweDE5MGMsIDB4MTliNCwgMHg2MDE3LCAweDAwMDAsIDB4NjAyMywgMHgwMDA3LAorCTB4MjAwMSwgMHgxOTVlLCAweDIwMDQsIDB4MDAwNiwgMHg5MDgyLCAweDAwNTEsIDB4MDAwZSwgMHgwMjA4LAorCTB4ODAwNCwgMHg2MDFhLCAweDA4MGMsIDB4ZGFlMiwgMHg2MDQzLCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBlNiwgMHgwMTI2LCAweDIwNzEsIDB4MTgwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU1MCwgMHg5NTgyLAorCTB4MDAwMSwgMHgwNjA4LCAweDcwNTQsIDB4MjA2MCwgMHg2MDAwLCAweDkwODYsIDB4MDAwMCwgMHgwMTQ4LAorCTB4OWNlMCwgMHgwMDE4LCAweDcwNjQsIDB4OWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHgxY2QwLAorCTB4MGM5OCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTUyLCAweDljYTgsIDB4MDAxOCwgMHg3MDY0LAorCTB4OTUwMiwgMHgxMjMwLCAweDc1NTYsIDB4OTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4NzA1NywgMHgxY2QwLCAweDBjYzAsIDB4OTAwNiwgMHgwY2MwLCAweDYwMjAsIDB4OTA4NCwgMHgwMDBmLAorCTB4MDAwMiwgMHhhMTcwLCAweGExNzksIDB4YTE5NCwgMHhhMWFmLCAweGM1NWYsIDB4YzU3YywgMHhjNTk3LAorCTB4YTE3MCwgMHhhMTc5LCAweGExNzAsIDB4YTFjYiwgMHhhMTcwLCAweGExNzAsIDB4YTE3MCwgMHhhMTcwLAorCTB4OTE4NiwgMHgwMDEzLCAweDExMjgsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LAorCTB4MDAwNSwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwgMHgwMDE2LCAweDFhMGMsIDB4MGRmYSwgMHgwMDEzLAorCTB4MDA2ZSwgMHgwMDA1LCAweGExOTIsIDB4YThmOCwgMHhhYWM4LCAweGExOTIsIDB4YWI1NiwgMHhhNGFlLAorCTB4YTE5MiwgMHhhMTkyLCAweGE4N2EsIDB4YjBmYSwgMHhhMTkyLCAweGExOTIsIDB4YTE5MiwgMHhhMTkyLAorCTB4YTE5MiwgMHhhMTkyLCAweDA4MGMsIDB4MGRmYSwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwgMHgwMDE2LAorCTB4MWEwYywgMHgwZGZhLCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweGExYWQsIDB4YjdlMSwgMHhhMWFkLAorCTB4YTFhZCwgMHhhMWFkLCAweGExYWQsIDB4YTFhZCwgMHhhMWFkLCAweGI3NzgsIDB4Yjk2MywgMHhhMWFkLAorCTB4YjgyMiwgMHhiOGExLCAweGI4MjIsIDB4YjhhMSwgMHhhMWFkLCAweDA4MGMsIDB4MGRmYSwgMHg2MDAwLAorCTB4OTA4MiwgMHgwMDE2LCAweDFhMGMsIDB4MGRmYSwgMHg2MDAwLCAweDAwMDIsIDB4YTFjOSwgMHhiMTQxLAorCTB4YjIyNiwgMHhiMzU2LCAweGI1MDUsIDB4YTFjOSwgMHhhMWM5LCAweGExYzksIDB4YjExNSwgMHhiNzA0LAorCTB4YjcwNywgMHhhMWM5LCAweGExYzksIDB4YTFjOSwgMHhhMWM5LCAweGI3MzYsIDB4YTFjOSwgMHhhMWM5LAorCTB4YTFjOSwgMHgwODBjLCAweDBkZmEsIDB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLAorCTB4MGRmYSwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHhhMWU0LCAweGExZTQsIDB4YTIyNywgMHhhMmM2LAorCTB4YTM1YiwgMHhhMWU0LCAweGExZTQsIDB4YTFlNCwgMHhhMWU2LCAweGExZTQsIDB4YTFlNCwgMHhhMWU0LAorCTB4YTFlNCwgMHhhMWU0LCAweGExZTQsIDB4YTFlNCwgMHgwODBjLCAweDBkZmEsIDB4OTE4NiwgMHgwMDRjLAorCTB4MDU4OCwgMHg5MTg2LCAweDAwMDMsIDB4MTkwYywgMHgwZGZhLCAweDAwOTYsIDB4NjAxYywgMHhjMGVkLAorCTB4NjAxZSwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHg5MDg0LAorCTB4YTAwMCwgMHhjMGI1LCAweGE4N2UsIDB4YThhYywgMHhhODQ2LCAweGE4YjAsIDB4YTg0YSwgMHg5MDA2LAorCTB4YTgzNiwgMHhhODNhLCAweGE4ODQsIDB4OTA5MiwgMHgxOTlhLCAweDAyMTAsIDB4MjAwMSwgMHgxOTk5LAorCTB4ODAwMywgMHg4MDEzLCAweDgyMTMsIDB4OTIxMCwgMHg2MjFhLCAweDAwOWUsIDB4MmMxMCwgMHgwODBjLAorCTB4MWFmZSwgMHgwODBjLCAweDg2ZGUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg4Y2VkLAorCTB4MDEyZSwgMHgwMDA1LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJjYTAsIDB4MDBiZSwgMHgyYzAwLAorCTB4MDgwYywgMHhhMzdkLCAweDA4MGMsIDB4YzU1MSwgMHg2MDAzLCAweDAwMDcsIDB4MDAwNSwgMHgwMGQ2LAorCTB4MDA5NiwgMHgwMGY2LCAweDIwNzksIDB4MTgwMCwgMHg3YThjLCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLAorCTB4ZDBlYywgMHgxMTEwLCAweDkyOTAsIDB4MDAxOCwgMHhhYzc4LCAweGM0ZmMsIDB4MDA0NiwgMHhhOGUwLAorCTB4OTAwNSwgMHgxMTQwLCAweGE4ZGMsIDB4OTIxYSwgMHgwMTQwLCAweDAyMjAsIDB4YTg3YiwgMHgwMDA3LAorCTB4MjAxMCwgMHgwMDI4LCAweGE4N2IsIDB4MDAxNSwgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHg4MjE0LAorCTB4YTg4MywgMHgwMDAwLCAweGFhMDIsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwgMHgwMGQ2LAorCTB4MDBlNiwgMHgwMGY2LCAweDI0MDAsIDB4OTAwNSwgMHgxMTA4LCAweDAwOWEsIDB4MjEwMCwgMHg5MDg2LAorCTB4MDAxNSwgMHgxMTE4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDM4LCAweDIxMDAsIDB4OTA4NiwgMHgwMDE2LAorCTB4MDExOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAyYSwgMHg5NGE0LCAweDAwMDcsIDB4ODQyMywgMHg5NDA1LAorCTB4MDAwMiwgMHhhMjhlLCAweGEyOGUsIDB4YTI4OSwgMHhhMjhjLCAweGEyOGUsIDB4YTI4NiwgMHhhMjc5LAorCTB4YTI3OSwgMHhhMjc5LCAweGEyNzksIDB4YTI3OSwgMHhhMjc5LCAweGEyNzksIDB4YTI3OSwgMHhhMjc5LAorCTB4YTI3OSwgMHgwMGZlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDA0ZSwgMHgwMGZlLCAweDAwOWUsIDB4MDBkZSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHhhZDM5LAorCTB4MDAyOCwgMHgwODBjLCAweGFlNWMsIDB4MDAxMCwgMHgwODBjLCAweGFmNGIsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgyYzAwLCAweGE4OTYsIDB4MDAwZSwgMHgwODBjLAorCTB4YTQzYiwgMHgwNTMwLCAweGE4MDQsIDB4YTgwZSwgMHgwMGE2LCAweDIwNTAsIDB4YjEwMCwgMHgwMGFlLAorCTB4ODAwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLCAweDkwODQsIDB4ZmZjMCwgMHg5MDgwLAorCTB4MDAwMiwgMHhhYWNjLCAweGFiZDAsIDB4YWNkNCwgMHhhZGQ4LCAweDIwMzEsIDB4MDAwMCwgMHgyMDQxLAorCTB4MTJhMiwgMHgwODBjLCAweGE1ZTYsIDB4MDE2MCwgMHgwMDBlLCAweDkwMDUsIDB4MDEyMCwgMHgwMGZlLAorCTB4MDA5ZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBmZSwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHhhMGUzLAorCTB4MjAwMSwgMHgwMDJjLCAweDkwMGUsIDB4MDgwYywgMHhhNGExLCAweDBjNzAsIDB4OTFiNiwgMHgwMDE1LAorCTB4MDE3MCwgMHg5MWI2LCAweDAwMTYsIDB4MDE1OCwgMHg5MWIyLCAweDAwNDcsIDB4MGEwYywgMHgwZGZhLAorCTB4OTFiMiwgMHgwMDUwLCAweDFhMGMsIDB4MGRmYSwgMHg5MTgyLCAweDAwNDcsIDB4MDBjYSwgMHgyMDAxLAorCTB4MDEwOSwgMHgyMDA0LCAweGQwOGMsIDB4MDE5OCwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LAorCTB4MDAxNiwgMHgwMDI2LCAweDA4MGMsIDB4ODYzMiwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLAorCTB4YTAwMSwgMHg2MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxMTEwLCAweDA4MDQsIDB4YTIyNywgMHgwMDA1LAorCTB4YTJmOSwgMHhhMmY5LCAweGEyZmIsIDB4YTMzMSwgMHhhMmY5LCAweGEyZjksIDB4YTJmOSwgMHhhMmY5LAorCTB4YTM0NCwgMHgwODBjLCAweDBkZmEsIDB4MDBkNiwgMHgwMDE2LCAweDAwOTYsIDB4MDgwYywgMHg4YmMwLAorCTB4MDgwYywgMHg4Y2VkLCAweDYwMDMsIDB4MDAwNCwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YywgMHhkMGZjLAorCTB4MDFjMCwgMHhhODc4LCAweGMwZmMsIDB4OTAwNSwgMHgxMTU4LCAweGE4OTQsIDB4OTAwNSwgMHgwMTQwLAorCTB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MDgwYywgMHhhNGExLCAweDA4MGMsIDB4YTBlMywgMHgwMGE4LAorCTB4NjAwMywgMHgwMDAyLCAweGE4YTQsIDB4YTlhOCwgMHg5MTA1LCAweDExNzgsIDB4YThhZSwgMHhhOGIyLAorCTB4MGM3OCwgMHhhODdmLCAweDAwMjAsIDB4YTg4YywgMHhhODhhLCAweGE4YTQsIDB4YThhZSwgMHhhOGE4LAorCTB4YThiMiwgMHhhOGM3LCAweDAwMDAsIDB4YThjYiwgMHgwMDAwLCAweDAwOWUsIDB4MDAxZSwgMHgwMGRlLAorCTB4MDAwNSwgMHgwODBjLCAweDhiYzAsIDB4MDBkNiwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLAorCTB4YmUzNywgMHgwMTIwLCAweGE4N2IsIDB4MDAwNiwgMHgwODBjLCAweDZhZTksIDB4MDA5ZSwgMHgwMGRlLAorCTB4MDgwYywgMHhhMGUzLCAweDA4MDQsIDB4OGNlZCwgMHgwODBjLCAweDhiYzAsIDB4MDgwYywgMHgzMThiLAorCTB4MDgwYywgMHhjNTRlLCAweDAwZDYsIDB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhiZTM3LAorCTB4MDEyMCwgMHhhODdiLCAweDAwMjksIDB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDBkZSwgMHgwODBjLAorCTB4YTBlMywgMHgwODA0LCAweDhjZWQsIDB4OTE4MiwgMHgwMDQ3LCAweDAwMDIsIDB4YTM2YiwgMHhhMzZkLAorCTB4YTM2YiwgMHhhMzZiLCAweGEzNmIsIDB4YTM2YiwgMHhhMzZiLCAweGEzNmIsIDB4YTM2YiwgMHhhMzZiLAorCTB4YTM2YiwgMHhhMzZiLCAweGEzNmQsIDB4MDgwYywgMHgwZGZhLCAweDAwZDYsIDB4MDA5NiwgMHgwODBjLAorCTB4MTU4MiwgMHg2MTE0LCAweDIxNDgsIDB4YTg3YiwgMHgwMDAwLCAweGE4ODMsIDB4MDAwMCwgMHgwODBjLAorCTB4NmFlOSwgMHgwMDllLCAweDAwZGUsIDB4MDgwNCwgMHhhMGUzLCAweDAwMjYsIDB4MDAzNiwgMHgwMDU2LAorCTB4MDA2NiwgMHgwMDk2LCAweDAwYTYsIDB4MDBmNiwgMHgwMDA2LCAweDA4MGMsIDB4MTAzMSwgMHgwMDBlLAorCTB4MDkwYywgMHgwZGZhLCAweGE5NjAsIDB4MjFlOCwgMHhhOTVjLCAweDkxODgsIDB4MDAxOSwgMHgyMWEwLAorCTB4OTAwZSwgMHgyMGE5LCAweDAwMjAsIDB4NDEwNCwgMHhhODdhLCAweDIwNzksIDB4MTgwMCwgMHg3OThjLAorCTB4OTE4OCwgMHgwMDE4LCAweDkxOGMsIDB4MGZmZiwgMHhhOTcyLCAweGFjNzYsIDB4Mjk1MCwgMHgwMGE2LAorCTB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHg5MDFlLCAweDIwMjksIDB4MDAwMSwgMHg5MTgyLAorCTB4MDAzNCwgMHgxMjI4LCAweDIwMTEsIDB4MDAxZiwgMHgwODBjLCAweGI5ZTgsIDB4MDRjMCwgMHgyMTMwLAorCTB4MjAwOSwgMHgwMDM0LCAweDIwMTEsIDB4MDAxZiwgMHgwODBjLCAweGI5ZTgsIDB4OTZiMiwgMHgwMDM0LAorCTB4YjAwNCwgMHg5MDRkLCAweDAxMTAsIDB4MDgwYywgMHgwZmUzLCAweDA4MGMsIDB4MTAzMSwgMHgwMWQwLAorCTB4ODUyOCwgMHhhODY3LCAweDAxMTAsIDB4YTg2YiwgMHgwMDAwLCAweDI5MjAsIDB4YjQwNiwgMHg5NjhhLAorCTB4MDAzZCwgMHgxMjMwLCAweDI2MDgsIDB4MjAxMSwgMHgwMDFiLCAweDA4MGMsIDB4YjllOCwgMHgwMGI4LAorCTB4OTZiMiwgMHgwMDNjLCAweDIwMDksIDB4MDAzYywgMHgyOTUwLCAweDIwMTEsIDB4MDAxYiwgMHgwODBjLAorCTB4YjllOCwgMHgwYzE4LCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLAorCTB4OTVhZCwgMHgwMDUwLCAweGI1NjYsIDB4YjA3MCwgMHhjMGZkLCAweGIwNzIsIDB4MDA0OCwgMHgyMDAxLAorCTB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLCAweDk1YWQsIDB4MDA1MCwgMHhiNTY2LAorCTB4MmE0OCwgMHhhODA0LCAweGE4MDcsIDB4MDAwMCwgMHgwMDA2LCAweDA4MGMsIDB4NmFlOSwgMHgwMDBlLAorCTB4MjA0OCwgMHg5MDA1LCAweDFkYjAsIDB4MDBmZSwgMHgwMGFlLCAweDAwOWUsIDB4MDA2ZSwgMHgwMDVlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMGY2LCAweDAwOTYsIDB4MDAwNiwgMHgwODBjLAorCTB4MTAzMSwgMHgwMDBlLCAweDA5MGMsIDB4MGRmYSwgMHhhOTYwLCAweDIxZTgsIDB4YTk1YywgMHg5MTg4LAorCTB4MDAxOSwgMHgyMWEwLCAweDkwMGUsIDB4MjBhOSwgMHgwMDIwLCAweDQxMDQsIDB4YWE2NiwgMHhhODdhLAorCTB4MjA3OSwgMHgxODAwLCAweDc5OGMsIDB4ODEwYywgMHg5MTg4LCAweDAwMGMsIDB4OTE4MiwgMHgwMDFhLAorCTB4MDIxMCwgMHgyMDA5LCAweDAwMWEsIDB4MjFhOCwgMHg4MTBiLCAweGE5NzIsIDB4YWM3NiwgMHgyZTk4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWYsIDB4MjBhMCwgMHgyMDAxLCAweDAyMDUsIDB4MjAwYywgMHg5MThkLAorCTB4MDA4MCwgMHgyMTAyLCAweDQwMDMsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4NmFlOSwgMHgwMDllLAorCTB4MDBmZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMGQ2LCAweDAwZjYsIDB4MDA5NiwgMHgwMDE2LAorCTB4MjAwMSwgMHgwMjA1LCAweDIwMGMsIDB4OTE4ZCwgMHgwMDgwLCAweDIxMDIsIDB4MDAxZSwgMHgyMDc5LAorCTB4MDIwMCwgMHgyZTk4LCAweGE4N2MsIDB4ZDBlYywgMHgwMTE4LCAweDllODAsIDB4MDAwYywgMHgyMDk4LAorCTB4MjAyMSwgMHgwMDNlLCAweDkwMWUsIDB4OTI4MiwgMHgwMDIwLCAweDAyMTgsIDB4MjAxMSwgMHgwMDIwLAorCTB4MjAxOCwgMHg5NDg2LCAweDAwM2UsIDB4MTE3MCwgMHgwMDk2LCAweDA4MGMsIDB4MTAzMSwgMHgyOTAwLAorCTB4MDA5ZSwgMHgwNWMwLCAweGE4MDYsIDB4MjA0OCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAwMiwgMHgyMGEwLCAweDMzMDAsIDB4OTA4ZSwgMHgwMjYwLCAweDAxNDAsIDB4MjAwOSwgMHgwMjgwLAorCTB4OTEwMiwgMHg5MjBhLCAweDAyMTgsIDB4MjAxMCwgMHgyMTAwLCAweDkzMTgsIDB4MjIwMCwgMHg5NDAyLAorCTB4MTIyOCwgMHgyNDAwLCAweDkyMDIsIDB4MjQxMCwgMHg5MzE4LCAweDkwMDYsIDB4MjAyMCwgMHgyMmE4LAorCTB4YTgwMCwgMHg5MjAwLCAweGE4MDIsIDB4MjBlMSwgMHgwMDAwLCAweDQwMDMsIDB4ODNmZiwgMHgwMTgwLAorCTB4MzMwMCwgMHg5MDg2LCAweDAyODAsIDB4MTEzMCwgMHg3ODE0LCAweDgwMDAsIDB4OTA4NSwgMHgwMDgwLAorCTB4NzgxNiwgMHgyZTk4LCAweDIzMTAsIDB4ODRmZiwgMHgwOTA0LCAweGE0NTAsIDB4MDgwNCwgMHhhNDUyLAorCTB4OTA4NSwgMHgwMDAxLCAweDc4MTcsIDB4MDAwMCwgMHgwMDllLCAweDAwZmUsIDB4MDBkZSwgMHgwMDFlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDAwMzYsIDB4MDA5NiwgMHg2MzE0LCAweDIzNDgsIDB4YTg3YSwgMHhhOTgyLAorCTB4MDgwYywgMHg2YWRjLCAweDAwOWUsIDB4MDAzZSwgMHgwMGRlLCAweDAwMDUsIDB4OTFiNiwgMHgwMDE1LAorCTB4MTExOCwgMHgwODBjLCAweGEwZTMsIDB4MDAzMCwgMHg5MWI2LCAweDAwMTYsIDB4MTkwYywgMHgwZGZhLAorCTB4MDgwYywgMHhhMGUzLCAweDAwMDUsIDB4MjBhOSwgMHgwMDBlLCAweDIwZTEsIDB4MDAwMCwgMHgyZTk4LAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4MjBhMCwgMHgwMDllLAorCTB4NDAwMywgMHgwMTM2LCAweDkwODAsIDB4MDAxYiwgMHgyMGEwLCAweDIwMTEsIDB4MDAwNiwgMHgyMGE5LAorCTB4MDAwMSwgMHgzNDE4LCAweDgzMTgsIDB4MjNhMCwgMHg0MDAzLCAweDMzMTgsIDB4ODMxOCwgMHgyMzk4LAorCTB4ODIxMSwgMHgxZGI4LCAweDIwMTEsIDB4MDAwNiwgMHgwMTNlLCAweDIwYTAsIDB4MzMxOCwgMHg4MzE4LAorCTB4MjM5OCwgMHg0MDAzLCAweDM0MTgsIDB4ODMxOCwgMHgyM2EwLCAweDgyMTEsIDB4MWRiOCwgMHgwMDk2LAorCTB4MDgwYywgMHhiZTM3LCAweDAxMzAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHgwMDllLCAweDA4MDQsIDB4YTBlMywgMHgwMDk2LCAweDAwZDYsIDB4MDAzNiwgMHg3MzMwLAorCTB4OTM4NiwgMHgwMjAwLCAweDExYTgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjhiZiwgMHgwMDAwLAorCTB4MDBiZSwgMHg2MDE0LCAweDkwMDUsIDB4MDEzMCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHhhYjMyLCAweDA4MGMsIDB4YTBlMywgMHgwMDNlLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDAxMSwgMHgxZDQ4LCAweDBjYzgsIDB4MDAwNiwgMHgwMDE2LCAweDA4MGMsIDB4YzUzOSwgMHgwMTg4LAorCTB4NjAxNCwgMHg5MDA1LCAweDExNzAsIDB4NjAwYiwgMHgwMDAzLCAweDYwMWIsIDB4MDAwMCwgMHg2MDQzLAorCTB4MDAwMCwgMHgyMDA5LCAweDAwMjIsIDB4MDgwYywgMHhhOGQwLCAweDkwMDYsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNkMCwgMHgwMDk2LCAweDAwMTYsIDB4MjBhOSwgMHgwMDE0LAorCTB4OWU4MCwgMHgwMDBjLCAweDIwZTEsIDB4MDAwMCwgMHgyMDk4LCAweDYwMTQsIDB4MjA0OCwgMHhhODYwLAorCTB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAwMiwgMHgyMGEwLCAweDQwMDMsIDB4MjAwMSwgMHgwMjA1LAorCTB4MjAwMywgMHgwMDAxLCAweDIwOTksIDB4MDI2MCwgMHgyMGE5LCAweDAwMTYsIDB4NDAwMywgMHgyMGE5LAorCTB4MDAwYSwgMHhhODA0LCAweDIwNDgsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDAyLAorCTB4MjBhMCwgMHg0MDAzLCAweDIwMDEsIDB4MDIwNSwgMHgyMDAzLCAweDAwMDIsIDB4MjA5OSwgMHgwMjYwLAorCTB4MjBhOSwgMHgwMDIwLCAweDQwMDMsIDB4MjAwMywgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHhhODAwLAorCTB4MjA0OCwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywgMHhhMGUzLCAweDAwMWUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDA5NiwgMHgwMDE2LCAweDkwMGUsIDB4NzAzMCwgMHg5MDg2LCAweDAxMDAsIDB4MDE0MCwgMHg3MDM4LAorCTB4OTA4NCwgMHgwMGZmLCAweDgwMGMsIDB4NzAzYywgMHg5MDg0LCAweDAwZmYsIDB4ODAwNCwgMHg5MDgwLAorCTB4MDAwNCwgMHg5MTA4LCAweDgxMGIsIDB4MjAxMSwgMHgwMDAyLCAweDIwMTksIDB4MDAwYywgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGI5ZTgsIDB4MDgwYywgMHhiZTM3LCAweDAxNDAsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTgwNywgMHgwMDAwLCAweGE4NjQsIDB4YThlMiwgMHhhODY3LCAweDAxMDMsIDB4MDgwYywgMHhhMGUzLAorCTB4MDAxZSwgMHgwMDllLCAweDAwMDUsIDB4MDAxNiwgMHgwMDk2LCAweDcwMzAsIDB4OTA4NiwgMHgwMTAwLAorCTB4MTExOCwgMHgyMDA5LCAweDAwMDQsIDB4MDAxMCwgMHg3MDM0LCAweDgwMGMsIDB4ODEwYiwgMHgyMDExLAorCTB4MDAwYywgMHgyMDE5LCAweDAwMGMsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDQsIDB4MDA5NiwgMHg5MDA1LAorCTB4MDEwOCwgMHgyMDQ4LCAweDA4MGMsIDB4YjllOCwgMHgwMDllLCAweDA4MGMsIDB4YmUzNywgMHgwMTQ4LAorCTB4YTgwNCwgMHg5MDA1LCAweDExNTgsIDB4YTgwNywgMHgwMDAwLCAweGE4NjQsIDB4YThlMiwgMHhhODY3LAorCTB4MDEwMywgMHgwODBjLCAweGEwZTMsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMDUsIDB4MDA4NiwgMHgyMDQwLAorCTB4YTAzMCwgMHg4MDA3LCAweDkwODYsIDB4MDEwMCwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwMGUwLAorCTB4YTAzNCwgMHg4MDA3LCAweDgwMGMsIDB4ODgwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTBiYywgMHgwMDNmLAorCTB4OTA4NCwgMHhmZmMwLCAweDkwODAsIDB4MDAwYywgMHhhODdiLCAweDAwMDAsIDB4YTg4MywgMHgwMDAwLAorCTB4YTg5NywgMHg0MDAwLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LCAweGFkYTQsIDB4MjAzMSwgMHgwMDAwLAorCTB4MjA0MSwgMHgxMjg4LCAweDAwMTksIDB4MGQwOCwgMHgwMDhlLCAweDA4OTgsIDB4MDA5NiwgMHgwMDA2LAorCTB4MDgwYywgMHgxMDMxLCAweDAwMGUsIDB4MDFiMCwgMHhhOGFiLCAweDBkY2IsIDB4YTg3NiwgMHgwMDBlLAorCTB4YThhMiwgMHgwMDA2LCAweGFlNmEsIDB4MjgwMCwgMHhhODllLCAweGE5N2EsIDB4YWY3MiwgMHhhYThlLAorCTB4YWI5MiwgMHhhYzk2LCAweGFkOWEsIDB4MDA4NiwgMHgyOTQwLCAweDA4MGMsIDB4MTEyZSwgMHgwMDhlLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDAyNiwgMHg3MDA4LAorCTB4OTA4NCwgMHgwMGZmLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTAsIDB4MDBiZSwgMHg5MjA2LAorCTB4MTUyMCwgMHg3MDBjLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhMTQsIDB4MDBiZSwgMHg5MjA2LAorCTB4MTFlMCwgMHg2MDQzLCAweDAwMDAsIDB4MmM2OCwgMHgwMDE2LCAweDIwMDksIDB4MDAzNSwgMHgwODBjLAorCTB4YzRiMSwgMHgwMDFlLCAweDExNTgsIDB4NjIyYywgMHgyMjY4LCAweDIwNzEsIDB4MDI2YywgMHg2YjIwLAorCTB4OTM4NiwgMHgwMDAzLCAweDAxMzAsIDB4OTM4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDgwYywgMHhhMGUzLAorCTB4MDAyMCwgMHgwMDM5LCAweDAwMTAsIDB4MDgwYywgMHhhNzA1LCAweDAwMmUsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMDk2LCAweDY4MTQsIDB4MjA0OCwgMHg5MTg2LCAweDAwMTUsIDB4MDkwNCwgMHhhNmVkLAorCTB4OTE4ZSwgMHgwMDE2LCAweDE5MDQsIDB4YTcwMywgMHg3MDBjLCAweDkwOGMsIDB4ZmYwMCwgMHg5MTg2LAorCTB4MTcwMCwgMHgwMTIwLCAweDkxODYsIDB4MDMwMCwgMHgxOTA0LCAweGE2YzcsIDB4ODlmZiwgMHgxMTM4LAorCTB4NjgwMCwgMHg5MDg2LCAweDAwMGYsIDB4MDkwNCwgMHhhNmFhLCAweDA4MDQsIDB4YTcwMSwgMHg2ODA4LAorCTB4OTA4NiwgMHhmZmZmLCAweDE5MDQsIDB4YTZlZiwgMHhhODdjLCAweDkwODQsIDB4MDA2MCwgMHg5MDg2LAorCTB4MDAyMCwgMHgxMTI4LCAweGE4M2MsIDB4YTk0MCwgMHg5MTA1LCAweDE5MDQsIDB4YTZlZiwgMHg2ODI0LAorCTB4ZDA4NCwgMHgxOTA0LCAweGE2ZWYsIDB4ZDBiNCwgMHgwMTU4LCAweDAwMTYsIDB4MjAwMSwgMHgxOTVlLAorCTB4MjAwYywgMHg2MDE4LCAweDkxMDIsIDB4OTA4MiwgMHgwMDA1LCAweDAwMWUsIDB4MWEwNCwgMHhhNmVmLAorCTB4MDgwYywgMHhjMDIyLCAweDY4NWMsIDB4YTg4MiwgMHhhODdjLCAweGMwZGMsIDB4YzBmNCwgMHhjMGQ0LAorCTB4YTg3ZSwgMHgwMDI2LCAweDkwMGUsIDB4NmExOCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg4NGZmLAorCTB4YTg4NCwgMHg5MjBhLCAweDAyMDgsIDB4ODAxMSwgMHhhYTg2LCAweDgyZmYsIDB4MDAyZSwgMHgxMTM4LAorCTB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YmI0YSwgMHgwMGNlLCAweDA4MDQsIDB4YTcwMSwgMHgwMGM2LAorCTB4YTg2OCwgMHhkMGZjLCAweDExMTgsIDB4MDgwYywgMHg1ZmE3LCAweDAwMTAsIDB4MDgwYywgMHg2MzU1LAorCTB4MDBjZSwgMHgxOTA0LCAweGE2ZWYsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YTBlMywgMHgwMGNlLAorCTB4MDgwNCwgMHhhNzAxLCAweDAwYzYsIDB4MDgwYywgMHhhMTMwLCAweDAxOTgsIDB4NjAxNywgMHgwMDAwLAorCTB4NjgxMCwgMHg2MDEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDMsIDB4NjkwNCwgMHgwMGM2LAorCTB4MmQ2MCwgMHgwODBjLCAweGEwZTMsIDB4MDBjZSwgMHgwODBjLCAweGExNWQsIDB4MDBjZSwgMHgwODA0LAorCTB4YTcwMSwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwgMHg2ODQyLCAweDAwY2UsIDB4MDRkMCwgMHg3MDA4LAorCTB4OTA4NiwgMHgwMDBiLCAweDExYzgsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjkwMCwgMHhjMWJjLAorCTB4YjkwMiwgMHgwMGJlLCAweDAwYzYsIDB4MmQ2MCwgMHhhODdiLCAweDAwMDMsIDB4MDgwYywgMHhjNGYzLAorCTB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywgMHg4Njc5LAorCTB4MDgwYywgMHg4YzEwLCAweDAwY2UsIDB4MDBlOCwgMHg3MDBjLCAweDkwODYsIDB4MmEwMCwgMHgxMTM4LAorCTB4MjAwMSwgMHgxOTYwLCAweDIwMDQsIDB4Njg0MiwgMHgwMGEwLCAweDA0NzksIDB4MDBhMCwgMHg4OWZmLAorCTB4MDkwYywgMHgwZGZhLCAweDAwYzYsIDB4MDBkNiwgMHgyZDYwLCAweGE4NjcsIDB4MDEwMywgMHhhODdiLAorCTB4MDAwMywgMHgwODBjLCAweDY5MDQsIDB4MDgwYywgMHhjMDIyLCAweDA4MGMsIDB4YTExMywgMHgwMGRlLAorCTB4MDBjZSwgMHgwODBjLCAweGEwZTMsIDB4MDA5ZSwgMHgwMDA1LCAweDkxODYsIDB4MDAxNSwgMHgxMTI4LAorCTB4MjAwMSwgMHgxOTYwLCAweDIwMDQsIDB4Njg0MiwgMHgwMDY4LCAweDkxOGUsIDB4MDAxNiwgMHgxMTYwLAorCTB4MDBjNiwgMHgyZDAwLCAweDIwNjAsIDB4MDgwYywgMHhkYWUyLCAweDA4MGMsIDB4ODRhNiwgMHgwODBjLAorCTB4YTBlMywgMHgwMGNlLCAweDA4MGMsIDB4YTBlMywgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4NzIyOCwgMHhhY2IwLCAweGFiYWMsIDB4ZDJmNCwgMHgwMTMwLCAweDIwMDEsIDB4MTk2MCwgMHgyMDA0LAorCTB4Njg0MiwgMHgwODA0LCAweGE3N2YsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YmE0OSwgMHgwMGNlLAorCTB4NjgwNCwgMHg5MDg2LCAweDAwNTAsIDB4MTE2OCwgMHgwMGM2LCAweDJkMDAsIDB4MjA2MCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwNTAsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwMGNlLAorCTB4MDRmMCwgMHg2ODAwLCAweDkwODYsIDB4MDAwZiwgMHgwMWE4LCAweDg5ZmYsIDB4MDkwYywgMHgwZGZhLAorCTB4NjgwMCwgMHg5MDg2LCAweDAwMDQsIDB4MTE5MCwgMHhhODdjLCAweGQwYWMsIDB4MDE3OCwgMHhhODQzLAorCTB4MGZmZiwgMHhhODNmLCAweDBmZmYsIDB4YTg4MCwgMHhjMGZjLCAweGE4ODIsIDB4MjAwMSwgMHgwMDAxLAorCTB4NjgzMiwgMHgwNDAwLCAweDIwMDEsIDB4MDAwNywgMHg2ODMyLCAweDAwZTAsIDB4YTg3YywgMHhkMGI0LAorCTB4MTE1MCwgMHhkMGFjLCAweDBkYjgsIDB4NjgyNCwgMHhkMGY0LCAweDFkNDgsIDB4YTgzOCwgMHhhOTM0LAorCTB4OTEwNSwgMHgwZDgwLCAweDBjMjAsIDB4ZDJlYywgMHgxZDY4LCAweDcwMjQsIDB4OTMwNiwgMHgxMTE4LAorCTB4NzAyMCwgMHg5NDA2LCAweDBkMzgsIDB4NzAyMCwgMHg2ODNlLCAweDcwMjQsIDB4NjgzYSwgMHgyMDAxLAorCTB4MDAwNSwgMHg2ODMyLCAweDA4MGMsIDB4YzFhYSwgMHgwODBjLCAweDhjMTAsIDB4MDAxMCwgMHgwODBjLAorCTB4YTBlMywgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMDI2LAorCTB4NzAwOCwgMHg5MDg0LCAweDAwZmYsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmExMCwgMHgwMGJlLAorCTB4OTIwNiwgMHgxOTA0LCAweGE3ZWEsIDB4NzAwYywgMHg2MjEwLCAweDAwYjYsIDB4MjI1OCwgMHhiYTE0LAorCTB4MDBiZSwgMHg5MjA2LCAweDE5MDQsIDB4YTdlYSwgMHg2MDM4LCAweDIwNjgsIDB4NjgyNCwgMHhjMGRjLAorCTB4NjgyNiwgMHg2YTIwLCAweDkyODYsIDB4MDAwNywgMHgwOTA0LCAweGE3ZWEsIDB4OTI4NiwgMHgwMDAyLAorCTB4MDkwNCwgMHhhN2VhLCAweDkyODYsIDB4MDAwMCwgMHgwNWU4LCAweDY4MDgsIDB4NjMzYywgMHg5MzA2LAorCTB4MTVjOCwgMHgyMDcxLCAweDAyNmMsIDB4OTE4NiwgMHgwMDE1LCAweDA1NzAsIDB4OTE4ZSwgMHgwMDE2LAorCTB4MTEwMCwgMHgwMGM2LCAweDYwMzgsIDB4MjA2MCwgMHg2MTA0LCAweDkxODYsIDB4MDA0YiwgMHgwMWMwLAorCTB4OTE4NiwgMHgwMDRjLCAweDAxYTgsIDB4OTE4NiwgMHgwMDRkLCAweDAxOTAsIDB4OTE4NiwgMHgwMDRlLAorCTB4MDE3OCwgMHg5MTg2LCAweDAwNTIsIDB4MDE2MCwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHgwODBjLAorCTB4YmUzNywgMHgwOTBjLCAweDBkZmEsIDB4YTg3YiwgMHgwMDAzLCAweDAwOWUsIDB4MDgwYywgMHhjNGYzLAorCTB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywgMHg4Njc5LAorCTB4MDgwYywgMHg4YzEwLCAweDAwY2UsIDB4MDAzMCwgMHg2MDM4LCAweDIwNzAsIDB4MjAwMSwgMHgxOTYwLAorCTB4MjAwNCwgMHg3MDQyLCAweDA4MGMsIDB4YTBlMywgMHgwMDJlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMDk2LCAweDAwZjYsIDB4NjAxNCwgMHgyMDQ4LCAweDYwMTAsIDB4MjA1OCwgMHg5MWI2LAorCTB4MDAxNSwgMHgwMTMwLCAweGJhMDgsIDB4YmIwYywgMHhiYzAwLCAweGM0OGMsIDB4YmMwMiwgMHgwNDYwLAorCTB4MDA5NiwgMHgwMTU2LCAweDAwMzYsIDB4MDAyNiwgMHgyYjQ4LCAweDllOTAsIDB4MDAxMCwgMHgyMDE5LAorCTB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHhiMGQwLCAweDAwMmUsIDB4MDAzZSwgMHgwMTVlLAorCTB4MDA5ZSwgMHgxOTA0LCAweGE4NTksIDB4MDA5NiwgMHgwMTU2LCAweDAwMzYsIDB4MDAyNiwgMHgyYjQ4LAorCTB4OWU5MCwgMHgwMDE0LCAweDIwMTksIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHhiMGQwLAorCTB4MDAyZSwgMHgwMDNlLCAweDAxNWUsIDB4MDA5ZSwgMHgxNWEwLCAweDcyMzgsIDB4YmEwYSwgMHg3MzNjLAorCTB4YmIwZSwgMHhiYzAwLCAweGM0OGQsIDB4YmMwMiwgMHhhODA0LCAweDkwMDUsIDB4MTEyOCwgMHgwMGZlLAorCTB4MDA5ZSwgMHgwMGJlLCAweDA4MDQsIDB4YTRlNywgMHgwMDk2LCAweDIwNDgsIDB4YWExMiwgMHhhYjE2LAorCTB4YWMwYSwgMHgwMDllLCAweDgwMDYsIDB4ODAwNiwgMHg4MDA3LCAweDkwYmMsIDB4MDAzZiwgMHg5MDg0LAorCTB4ZmZjMCwgMHg5MDgwLCAweDAwMDIsIDB4MjAwOSwgMHgwMDJiLCAweGFhYTAsIDB4YWI5YywgMHhhY2E4LAorCTB4YWRhNCwgMHgyMDMxLCAweDAwMDAsIDB4MjA0MSwgMHgxMjg4LCAweDA4MGMsIDB4YTVlNiwgMHgwMTMwLAorCTB4MDBmZSwgMHgwMDllLCAweDA4MGMsIDB4YTBlMywgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHhhYTgxLAorCTB4MGNiOCwgMHgyYjc4LCAweDAwZjYsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHgwMGZlLAorCTB4MDBjNiwgMHgwODBjLCAweGEwOGQsIDB4MmYwMCwgMHg2MDEyLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLAorCTB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NjNmMCwgMHgwODBjLCAweDY0MWMsIDB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHgwMGNlLAorCTB4MDgwNCwgMHhhODJjLCAweDIxMDAsIDB4OTFiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGRmYSwgMHg5MWIyLAorCTB4MDA0MCwgMHgxYTA0LCAweGE4ZTIsIDB4MDAwMiwgMHhhOGQwLCAweGE4ZDAsIDB4YThjNiwgMHhhOGQwLAorCTB4YThkMCwgMHhhOGQwLCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LAorCTB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LAorCTB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LAorCTB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThkMCwgMHhhOGM0LCAweGE4ZDAsIDB4YThkMCwgMHhhOGM0LAorCTB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM2LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LAorCTB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThkMCwgMHhhOGQwLAorCTB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LCAweGE4YzQsIDB4YThjNCwgMHhhOGM0LAorCTB4YThjNCwgMHhhOGQwLCAweGE4YzQsIDB4YThjNCwgMHgwODBjLCAweDBkZmEsIDB4MDA2NiwgMHgwMGI2LAorCTB4NjYxMCwgMHgyNjU4LCAweGI4YmMsIDB4YzA4YywgMHhiOGJlLCAweDAwYmUsIDB4MDA2ZSwgMHgwMDAwLAorCTB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4OTE4NiwgMHgwMDMyLCAweDAxMTgsIDB4MDgwYywgMHg4NmMxLAorCTB4MDAxMCwgMHgwODBjLCAweDg2NzksIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg4YzEwLAorCTB4MDEyZSwgMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHhhOGY2LCAweGE4ZjYsIDB4YThmNiwgMHhhOGQwLAorCTB4YThkMCwgMHhhOGY2LCAweGE4ZjYsIDB4YThmNiwgMHhhOGY2LCAweGE4ZDAsIDB4YThmNiwgMHhhOGQwLAorCTB4YThmNiwgMHhhOGQwLCAweGE4ZjYsIDB4YThmNiwgMHhhOGY2LCAweGE4ZjYsIDB4MDgwYywgMHgwZGZhLAorCTB4NjAwNCwgMHg5MGIyLCAweDAwNTMsIDB4MWEwYywgMHgwZGZhLCAweDkxYjYsIDB4MDAxMywgMHgwOTA0LAorCTB4YTliYSwgMHg5MWI2LCAweDAwMjcsIDB4MTkwNCwgMHhhOTc1LCAweDA4MGMsIDB4OGIwNCwgMHg2MDA0LAorCTB4MDgwYywgMHhjMDJlLCAweDAxYjAsIDB4MDgwYywgMHhjMDNmLCAweDAxYTgsIDB4OTA4ZSwgMHgwMDIxLAorCTB4MDkwNCwgMHhhOTcyLCAweDkwOGUsIDB4MDAyMiwgMHgxMTMwLCAweDA4MGMsIDB4YTUxMywgMHgwOTA0LAorCTB4YTk2ZSwgMHgwODA0LCAweGE5NmYsIDB4OTA4ZSwgMHgwMDNkLCAweDA5MDQsIDB4YTk3MiwgMHgwODA0LAorCTB4YTk2OCwgMHgwODBjLCAweDMxYjQsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjNmMCwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI5YTAsIDB4MDBiZSwgMHgwODBjLCAweGFhODEsIDB4OTE4NiwgMHgwMDdlLAorCTB4MTE0OCwgMHgyMDAxLCAweDE4MzYsIDB4MjAxNCwgMHhjMjg1LCAweDA4MGMsIDB4NzIwNywgMHgxMTA4LAorCTB4YzJhZCwgMHgyMjAyLCAweDAwMzYsIDB4MDAyNiwgMHgyMDE5LCAweDAwMjgsIDB4MjExMCwgMHgwODBjLAorCTB4ZGIzZCwgMHgwMDJlLCAweDAwM2UsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjExMCwgMHgyMDE5LAorCTB4MDAyOCwgMHgwODBjLCAweDg4MDMsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4ODZmMSwgMHg2MDEwLAorCTB4MDBiNiwgMHg5MDVkLCAweDAxMDAsIDB4MDBiZSwgMHgyYzA4LCAweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDgwYywgMHhjNTRlLCAweDAwMTYsIDB4MDgwYywgMHhjMmFiLAorCTB4MDgwYywgMHhhMGUzLCAweDAwMWUsIDB4MDgwYywgMHgzMjg2LCAweDA4MGMsIDB4OGMxMCwgMHgwMDMwLAorCTB4MDgwYywgMHhjMmFiLCAweDA4MGMsIDB4YTBlMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwODBjLAorCTB4YWE4MSwgMHgwY2IwLCAweDA4MGMsIDB4YWFiZCwgMHgwYzk4LCAweDkxODYsIDB4MDAxNCwgMHgxZGIwLAorCTB4MDgwYywgMHg4YjA0LCAweDYwMDQsIDB4OTA4ZSwgMHgwMDIyLCAweDExMTgsIDB4MDgwYywgMHhhNTEzLAorCTB4MGQ2OCwgMHgwODBjLCAweDMxOGIsIDB4MDgwYywgMHhjNTRlLCAweDA4MGMsIDB4YzAyZSwgMHgxMTkwLAorCTB4MDgwYywgMHgzMWI0LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI5YTAsIDB4MDBiZSwgMHgwODBjLAorCTB4YWE4MSwgMHg5MTg2LCAweDAwN2UsIDB4MTEyOCwgMHgyMDAxLCAweDE4MzYsIDB4MjAwYywgMHhjMTg1LAorCTB4MjEwMiwgMHgwODcwLCAweDA4MGMsIDB4YzAzZiwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwODQwLAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMzIsIDB4MTE2MCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODljLAorCTB4MjA3OSwgMHgwMDAwLCAweDA4MGMsIDB4MzUxYSwgMHgwMGZlLCAweDAwZWUsIDB4MDgwNCwgMHhhOTY4LAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMjEsIDB4MGQ0OCwgMHg5MDhlLCAweDAwMjIsIDB4MDkwYywgMHhhYTgxLAorCTB4MDgwNCwgMHhhOTY4LCAweDkwYjIsIDB4MDA0MCwgMHgxYTA0LCAweGFhNmEsIDB4MjAwOCwgMHgwMDAyLAorCTB4YWEwMiwgMHhhYTAzLCAweGFhMDYsIDB4YWEwOSwgMHhhYTBjLCAweGFhMGYsIDB4YWEwMCwgMHhhYTAwLAorCTB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLAorCTB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLAorCTB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWExMiwgMHhhYTFmLAorCTB4YWEwMCwgMHhhYTIxLCAweGFhMWYsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLAorCTB4YWExZiwgMHhhYTFmLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLAorCTB4YWEwMCwgMHhhYTAwLCAweGFhNTEsIDB4YWExZiwgMHhhYTAwLCAweGFhMWIsIDB4YWEwMCwgMHhhYTAwLAorCTB4YWEwMCwgMHhhYTFjLCAweGFhMDAsIDB4YWEwMCwgMHhhYTAwLCAweGFhMWYsIDB4YWE0OCwgMHhhYTAwLAorCTB4MDgwYywgMHgwZGZhLCAweDAwZTAsIDB4MjAwMSwgMHgwMDBiLCAweDA0MjAsIDB4MjAwMSwgMHgwMDAzLAorCTB4MDQwOCwgMHgyMDAxLCAweDAwMDUsIDB4MDBmMCwgMHgyMDAxLCAweDAwMDEsIDB4MDBkOCwgMHgyMDAxLAorCTB4MDAwOSwgMHgwMGMwLCAweDA4MGMsIDB4OGIwNCwgMHg2MDAzLCAweDAwMDUsIDB4MDgwYywgMHhjNTUxLAorCTB4MDgwYywgMHg4YzEwLCAweDAwNzAsIDB4MDAxOCwgMHgwMDEwLCAweDA4MGMsIDB4NjNmMCwgMHgwODA0LAorCTB4YWE2MiwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHhjNTUxLCAweDYwMDMsIDB4MDAwNCwgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDA4MGMsIDB4NjNmMCwgMHgwODBjLCAweDhiMDQsIDB4NjAwMywgMHgwMDAyLAorCTB4MDAzNiwgMHgyMDE5LCAweDE4NjYsIDB4MjMwNCwgMHg5MDg0LCAweGZmMDAsIDB4MTEyMCwgMHgyMDAxLAorCTB4MTk1ZSwgMHgyMDFjLCAweDAwNDAsIDB4ODAwNywgMHg5MDlhLCAweDAwMDQsIDB4MGVjMCwgMHg4MDAzLAorCTB4ODAxYiwgMHg4MzFiLCAweDkzMTgsIDB4NjMxYSwgMHgwMDNlLCAweDA4MGMsIDB4OGMxMCwgMHgwYzA4LAorCTB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YzJhYiwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg4YzEwLAorCTB4MDhjMCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODljLCAweDIwNzksIDB4MDAwMCwgMHgwODBjLAorCTB4MzUxYSwgMHgwMGZlLCAweDAwZWUsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTBlMywgMHgwODBjLAorCTB4OGMxMCwgMHgwODM4LCAweDA4MGMsIDB4OGIwNCwgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHhjNTUxLAorCTB4MDgwNCwgMHg4YzEwLCAweDI2MDAsIDB4MjAwOCwgMHgwMDAyLCAweGFhN2YsIDB4YWE3ZiwgMHhhYTdmLAorCTB4YWE2MiwgMHhhYTYyLCAweGFhN2YsIDB4YWE3ZiwgMHhhYTdmLCAweGFhN2YsIDB4YWE2MiwgMHhhYTdmLAorCTB4YWE2MiwgMHhhYTdmLCAweGFhNjIsIDB4YWE3ZiwgMHhhYTdmLCAweGFhN2YsIDB4YWE3ZiwgMHgwODBjLAorCTB4MGRmYSwgMHgwMGU2LCAweDAwOTYsIDB4MDAyNiwgMHgwMDE2LCAweDA4MGMsIDB4YmUzNywgMHgwNTY4LAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NiwgMHgwMTM5LCAweDExYTgsIDB4YTg5NCwgMHg5MDg2LAorCTB4MDA1NiwgMHgxMTQ4LCAweDA4MGMsIDB4NTM3NSwgMHgwMTMwLCAweDIwMDEsIDB4MDAwMCwgMHg5MDBlLAorCTB4MjAxMSwgMHg0MDAwLCAweDAwMjgsIDB4MjAwMSwgMHgwMDMwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDA1LAorCTB4MDgwYywgMHhjNDE4LCAweDAwOTAsIDB4YTg2OCwgMHhkMGZjLCAweDAxNzgsIDB4YTgwNywgMHgwMDAwLAorCTB4MDAxNiwgMHg2MDA0LCAweDkwOGUsIDB4MDAyMSwgMHgwMTY4LCAweDkwOGUsIDB4MDAzZCwgMHgwMTUwLAorCTB4MDAxZSwgMHhhODY3LCAweDAxMDMsIDB4YTgzMywgMHgwMTAwLCAweDAwMWUsIDB4MDAyZSwgMHgwMDllLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwMWUsIDB4MDAwOSwgMHgwY2MwLCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTgwMCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHhhODIzLCAweDgwMDEsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDBiNiwgMHg2NjEwLCAweDI2NTgsIDB4YjgwNCwgMHg5MDg0LCAweDAwZmYsIDB4OTBiMiwgMHgwMDBjLAorCTB4MWEwYywgMHgwZGZhLCAweDY2MDQsIDB4OTZiNiwgMHgwMDRkLCAweDExMjAsIDB4MDgwYywgMHhjMzM3LAorCTB4MDgwNCwgMHhhYjQ1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDQzLCAweDExMjAsIDB4MDgwYywgMHhjMzgwLAorCTB4MDgwNCwgMHhhYjQ1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDRiLCAweDExMjAsIDB4MDgwYywgMHhjM2FjLAorCTB4MDgwNCwgMHhhYjQ1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDMzLCAweDExMjAsIDB4MDgwYywgMHhjMmNkLAorCTB4MDgwNCwgMHhhYjQ1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDI4LCAweDExMjAsIDB4MDgwYywgMHhjMDdkLAorCTB4MDgwNCwgMHhhYjQ1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDI5LCAweDExMjAsIDB4MDgwYywgMHhjMGJlLAorCTB4MDgwNCwgMHhhYjQ1LCAweDY2MDQsIDB4OTZiNiwgMHgwMDFmLCAweDExMTgsIDB4MDgwYywgMHhhNGJiLAorCTB4MDRlMCwgMHg2NjA0LCAweDk2YjYsIDB4MDAwMCwgMHgxMTE4LCAweDA4MGMsIDB4YTdmMCwgMHgwNGE4LAorCTB4NjYwNCwgMHg5NmI2LCAweDAwMjIsIDB4MTExOCwgMHgwODBjLCAweGE0ZjQsIDB4MDQ3MCwgMHg2NjA0LAorCTB4OTZiNiwgMHgwMDM1LCAweDExMTgsIDB4MDgwYywgMHhhNjA0LCAweDA0MzgsIDB4NjYwNCwgMHg5NmI2LAorCTB4MDAzOSwgMHgxMTE4LCAweDA4MGMsIDB4YTc4NSwgMHgwNDAwLCAweDY2MDQsIDB4OTZiNiwgMHgwMDNkLAorCTB4MTExOCwgMHgwODBjLCAweGE1MmMsIDB4MDBjOCwgMHg2NjA0LCAweDk2YjYsIDB4MDA0NCwgMHgxMTE4LAorCTB4MDgwYywgMHhhNTY4LCAweDAwOTAsIDB4NjYwNCwgMHg5NmI2LCAweDAwNDksIDB4MTExOCwgMHgwODBjLAorCTB4YTU5MywgMHgwMDU4LCAweDkxYjYsIDB4MDAxNSwgMHgxMTEwLCAweDAwNjMsIDB4MDAzMCwgMHg5MWI2LAorCTB4MDAxNiwgMHgxMTI4LCAweDAwYmUsIDB4MDgwNCwgMHhhZTA1LCAweDAwYmUsIDB4MDAwNSwgMHgwODBjLAorCTB4YTE3OCwgMHgwY2Q4LCAweGFiNjIsIDB4YWI2NSwgMHhhYjYyLCAweGFiYTksIDB4YWI2MiwgMHhhZDM5LAorCTB4YWUxMiwgMHhhYjYyLCAweGFiNjIsIDB4YWRkZiwgMHhhYjYyLCAweGFkZjMsIDB4MDA5NiwgMHgwODBjLAorCTB4MTU4MiwgMHg2MDE0LCAweDIwNDgsIDB4YTgwMCwgMHgyMDQ4LCAweGE4NjcsIDB4MDEwMywgMHgwMDllLAorCTB4MDgwNCwgMHhhMGUzLCAweGEwMDEsIDB4YTAwMSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4NzA4YywgMHg5MDg2LCAweDAwNzQsIDB4MTU0MCwgMHgwODBjLCAweGQ1YzcsIDB4MTFiMCwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweDcwMzAsIDB4ZDA4YywgMHgwMTI4LCAweGI4MDAsIDB4ZDBiYywgMHgwMTEwLAorCTB4YzBjNSwgMHhiODAyLCAweDAwZTksIDB4MDBiZSwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2M2YwLAorCTB4MDgwYywgMHgzMWI0LCAweDA4MGMsIDB4YTBlMywgMHgwMDg4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLAorCTB4NjNmMCwgMHgwODBjLCAweDMxYjQsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLAorCTB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDAxMCwgMHgwODBjLCAweGFkMjQsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDBkNiwgMHhiODAwLCAweGQwODQsIDB4MDE1OCwgMHg5MDA2LCAweDA4MGMsIDB4NjNkYywgMHgyMDY5LAorCTB4MTg1YiwgMHg2ODA0LCAweDAwMjAsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjQxYywgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwOTYsIDB4MDBkNiwgMHgyMDExLCAweDE4MjMsIDB4MjIwNCwgMHg5MDg2LAorCTB4MDA3NCwgMHgxOTA0LCAweGFjZmIsIDB4NjAxMCwgMHgyMDU4LCAweGJhYTAsIDB4OTI4NiwgMHgwMDdlLAorCTB4MTEyMCwgMHgwODBjLCAweGFmNTYsIDB4MDgwNCwgMHhhYzYwLCAweDAwZDYsIDB4MDgwYywgMHg3MjA3LAorCTB4MDE5OCwgMHgwMDI2LCAweDIwMTEsIDB4MDAxMCwgMHgwODBjLCAweDY3ZTcsIDB4MDAyZSwgMHgwNWM4LAorCTB4MDgwYywgMHg1NWVmLCAweDE1NDAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHhhODMzLCAweGRlYWQsIDB4MDBmOCwgMHgwMDI2LCAweDIwMTEsIDB4ODAwOCwgMHgwODBjLAorCTB4NjdlNywgMHgwMDJlLCAweDA1MzAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDM5LCAweDExNDAsIDB4MjAwMSwgMHgwMDMwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDA5LAorCTB4MDgwYywgMHhjNDE4LCAweDAwNDAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4MDcsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHhhODMzLCAweGRlYWQsIDB4NjAxMCwgMHgyMDU4LCAweGI5YTAsIDB4MDAxNiwgMHgwODBjLAorCTB4MzFiNCwgMHgwODBjLCAweGEwZTMsIDB4MDAxZSwgMHgwODBjLCAweDMyODYsIDB4MDBkZSwgMHgwODA0LAorCTB4YWNmZSwgMHgwMGRlLCAweDA4MGMsIDB4YWY0YiwgMHg2MDEwLCAweDIwNTgsIDB4YmFhMCwgMHg5Mjg2LAorCTB4MDA4MCwgMHgxNTEwLCAweDYwMTQsIDB4OTAwNSwgMHgwMWE4LCAweDIwNDgsIDB4YTg2NCwgMHg5MDg0LAorCTB4MDBmZiwgMHg5MDg2LCAweDAwMzksIDB4MTE0MCwgMHgyMDAxLCAweDAwMDAsIDB4OTAwZSwgMHgyMDExLAorCTB4NDAwMCwgMHgwODBjLCAweGM0MTgsIDB4MDAzMCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTgzMywgMHgwMjAwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDYzZjAsIDB4MDgwYywgMHgzMWI0LAorCTB4MDgwYywgMHhhMGUzLCAweDA4MDQsIDB4YWNmZSwgMHgwODBjLCAweGFkMGMsIDB4NjAxNCwgMHg5MDA1LAorCTB4MDE5MCwgMHgyMDQ4LCAweGE4NjgsIDB4ZDBmNCwgMHgwMWU4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDM5LCAweDFkMDgsIDB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDAwLAorCTB4MDgwYywgMHhjNDE4LCAweDA4ZjgsIDB4MDgwYywgMHhhZDAyLCAweDAxNjAsIDB4OTAwNiwgMHgwODBjLAorCTB4NjNkYywgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg2NDFjLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NjNmMCwgMHgwOGEwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDYzZjAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDgwNCwgMHhhY2ZlLAorCTB4Yjg1YywgMHhkMGU0LCAweDAxZDAsIDB4MDgwYywgMHhjMjRkLCAweDA4MGMsIDB4NzIwNywgMHgwMTE4LAorCTB4ZDBkYywgMHgxOTA0LCAweGFjMjIsIDB4MjAxMSwgMHgxODM2LCAweDIyMDQsIDB4YzBhZCwgMHgyMDEyLAorCTB4MjAwMSwgMHgwMDAyLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4ZTMsIDB4MDAwMCwgMHgwODBjLAorCTB4MjdlMiwgMHg3OGUyLCAweDAwZmUsIDB4MDgwNCwgMHhhYzIyLCAweDA4MGMsIDB4YzI4YSwgMHgyMDExLAorCTB4MTgzNiwgMHgyMjA0LCAweGMwYTUsIDB4MjAxMiwgMHgwMDA2LCAweDA4MGMsIDB4ZDcyMCwgMHgwMDBlLAorCTB4MTkwNCwgMHhhYzIyLCAweGMwYjUsIDB4MjAxMiwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg2M2YwLAorCTB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MDBjNiwgMHgyMDAxLCAweDE4MGYsIDB4MjAwNCwgMHhkMDljLAorCTB4MDUyMCwgMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHgwMGU2LCAweDIwNzEsIDB4MTgwMCwgMHg3MDBjLAorCTB4OTA4NCwgMHgwMGZmLCAweDc4ZTYsIDB4NzA3YSwgMHg3MDEwLCAweDc4ZWEsIDB4NzA3ZSwgMHg5MDhjLAorCTB4MDBmZiwgMHgwMGVlLCAweDc4MGMsIDB4YzBiNSwgMHg3ODBlLCAweDAwZmUsIDB4MDgwYywgMHgyN2I3LAorCTB4MDBmNiwgMHgyMTAwLCAweDkwMGUsIDB4MDgwYywgMHgyNzZlLCAweDc5NWEsIDB4MDBmZSwgMHg5MTg2LAorCTB4MDA4MSwgMHgwMWQ4LCAweDIwMDksIDB4MDA4MSwgMHgwMGM4LCAweDIwMDksIDB4MDBlZiwgMHgwMGY2LAorCTB4MjA3OSwgMHgwMTAwLCAweDc5ZWEsIDB4NzkzMiwgMHg3OTM2LCAweDc4MGMsIDB4YzBiNSwgMHg3ODBlLAorCTB4MDBmZSwgMHgwODBjLCAweDI3YjcsIDB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4Nzk3ZSwgMHgyMTAwLAorCTB4OTAwZSwgMHgwODBjLCAweDI3NmUsIDB4Nzk1YSwgMHgwMGZlLCAweDgxMDgsIDB4MDgwYywgMHg2NDNmLAorCTB4MmIwMCwgMHgwMGNlLCAweDE5MDQsIDB4YWMyMiwgMHg2MDEyLCAweDIwMDksIDB4MTgwZiwgMHgyMTBjLAorCTB4ZDE5YywgMHgwMTUwLCAweDIwMDksIDB4MDI3YywgMHgyMTBjLCAweDkxOGMsIDB4MDBmZiwgMHhiOTEyLAorCTB4MjAwOSwgMHgwMjdkLCAweDIxMGMsIDB4YjkxNiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLAorCTB4NjAyMywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg4NmMxLAorCTB4MDgwYywgMHg4YzEwLCAweDAwMTgsIDB4MDgwYywgMHhhYTgxLCAweDA0MzEsIDB4MDBkZSwgMHgwMDllLAorCTB4MDBiZSwgMHgwMDA1LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwYTQsIDB4MDEyMCwgMHgyMDAxLAorCTB4MTg1YywgMHgyMDA0LCAweGQwYWMsIDB4MDAwNSwgMHgwMGU2LCAweDA4MGMsIDB4ZGI5NiwgMHgwMTkwLAorCTB4MjA3MSwgMHgwMjYwLCAweDcxMDgsIDB4NzIwYywgMHg5MThjLCAweDAwZmYsIDB4MTExOCwgMHg5Mjg0LAorCTB4ZmYwMCwgMHgwMTQwLCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweDkwODQsIDB4ZmY4MCwgMHgxMTEwLAorCTB4YjkxMiwgMHhiYTE2LCAweDAwZWUsIDB4MDAwNSwgMHgyMDMwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NjNmMCwgMHgwODBjLCAweDU1ZWYsIDB4MTEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg2NDFjLAorCTB4MDgwYywgMHgzMWI0LCAweDYwMjAsIDB4OTA4NiwgMHgwMDBhLCAweDExMDgsIDB4MDAwNSwgMHgwODA0LAorCTB4YTBlMywgMHgwMGI2LCAweDAwZTYsIDB4MDAyNiwgMHgwMDE2LCAweDIwNzEsIDB4MTgwMCwgMHg3MDhjLAorCTB4OTA4NiwgMHgwMDE0LCAweDE5MDQsIDB4YWRkNiwgMHgwMGQ2LCAweDA4MGMsIDB4NzIwNywgMHgwMTk4LAorCTB4MDAyNiwgMHgyMDExLCAweDAwMTAsIDB4MDgwYywgMHg2N2U3LCAweDAwMmUsIDB4MDVjOCwgMHgwODBjLAorCTB4NTVlZiwgMHgxNTQwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTgzMywgMHhkZWFkLCAweDAwZjgsIDB4MDAyNiwgMHgyMDExLCAweDgwMDgsIDB4MDgwYywgMHg2N2U3LAorCTB4MDAyZSwgMHgwNTMwLCAweDYwMTQsIDB4MjA0OCwgMHhhODY0LCAweDkwODQsIDB4MDBmZiwgMHg5MDg2LAorCTB4MDAzOSwgMHgxMTQwLCAweDIwMDEsIDB4MDAzMCwgMHg5MDBlLCAweDIwMTEsIDB4NDAwOSwgMHgwODBjLAorCTB4YzQxOCwgMHgwMDQwLCAweDYwMTQsIDB4MjA0OCwgMHhhODA3LCAweDAwMDAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTgzMywgMHhkZWFkLCAweDYwMTAsIDB4MjA1OCwgMHhiOWEwLCAweDAwMTYsIDB4MDgwYywgMHgzMWI0LAorCTB4MDgwYywgMHhhMGUzLCAweDAwMWUsIDB4MDgwYywgMHgzMjg2LCAweDAwZGUsIDB4MDgwNCwgMHhhZGRhLAorCTB4MDBkZSwgMHgwODBjLCAweDU1ZWYsIDB4MTE3MCwgMHg2MDE0LCAweDkwMDUsIDB4MTE1OCwgMHgwMDM2LAorCTB4MDA0NiwgMHg2MDEwLCAweDIwNTgsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDYsIDB4MDgwYywgMHg0Y2JjLAorCTB4MDA0ZSwgMHgwMDNlLCAweDAwZDYsIDB4NjAxMCwgMHgyMDU4LCAweDA4MGMsIDB4NjUzYSwgMHgwODBjLAorCTB4YWI5OCwgMHgwMGRlLCAweDA4MGMsIDB4YjAxYywgMHgxNTg4LCAweDYwMTAsIDB4MjA1OCwgMHhiODkwLAorCTB4OTAwNSwgMHgwNTYwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDYzZjAsIDB4MDA5NiwgMHg2MDE0LAorCTB4OTA0ZCwgMHgwMWQwLCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAzOSwgMHgxMTQwLAorCTB4MjAwMSwgMHgwMDAwLCAweDkwMGUsIDB4MjAxMSwgMHg0MDAwLCAweDA4MGMsIDB4YzQxOCwgMHgwMDYwLAorCTB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDI5LCAweDAxMzAsIDB4YTgwNywgMHgwMDAwLAorCTB4YTg2NywgMHgwMTAzLCAweGE4MzMsIDB4MDIwMCwgMHgwMDllLCAweDA4MGMsIDB4MzFiNCwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDBhLCAweDAxMzgsIDB4MDgwYywgMHhhMGUzLCAweDAwMjAsIDB4MDgwYywgMHhhYTgxLAorCTB4MDgwYywgMHhhZDI0LCAweDAwMWUsIDB4MDAyZSwgMHgwMGVlLCAweDAwYmUsIDB4MDAwNSwgMHgyMDExLAorCTB4MTgyMywgMHgyMjA0LCAweDkwODYsIDB4MDAxNCwgMHgxMTYwLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NjNmMCwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODA0LAorCTB4OGMxMCwgMHgwODA0LCAweGFkMjQsIDB4MjAzMCwgMHgyMDExLCAweDE4MjMsIDB4MjIwNCwgMHg5MDg2LAorCTB4MDAwNCwgMHgxMTQ4LCAweDk2YjYsIDB4MDAwYiwgMHgxMTIwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLAorCTB4NjNmMCwgMHgwODA0LCAweGEwZTMsIDB4MDgwNCwgMHhhZDI0LCAweDAwMDIsIDB4YWI2MiwgMHhhZTFkLAorCTB4YWI2MiwgMHhhZTVjLCAweGFiNjIsIDB4YWYwNywgMHhhZTEyLCAweGFiNjIsIDB4YWI2MiwgMHhhZjFhLAorCTB4YWI2MiwgMHhhZjJhLCAweDY2MDQsIDB4OTY4NiwgMHgwMDAzLCAweDA5MDQsIDB4YWQzOSwgMHg5NmI2LAorCTB4MDAxZSwgMHgxMTEwLCAweDA4MGMsIDB4YTBlMywgMHgwMDA1LCAweDAwYjYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDgwYywgMHhhZjNhLCAweDExYTAsIDB4OTAwNiwgMHgwODBjLCAweDYzZGMsIDB4MDgwYywgMHgzMThiLAorCTB4MDgwYywgMHhjNTRlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDYzZjAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDQwOCwgMHgyMDA5LAorCTB4MDI2ZSwgMHgyMTA0LCAweDkwODYsIDB4MDAwOSwgMHgxMTYwLCAweDYwMTAsIDB4MjA1OCwgMHhiODQwLAorCTB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MDE3MCwgMHg4MDAxLCAweGI4NDIsIDB4NjAxYiwgMHgwMDBhLAorCTB4MDA3OCwgMHgyMDA5LCAweDAyNmYsIDB4MjEwNCwgMHg5MDg0LCAweGZmMDAsIDB4OTA4NiwgMHgxOTAwLAorCTB4MTEwOCwgMHgwOGEwLCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDgwYywgMHhhZDI0LAorCTB4MDBjZSwgMHgwMGRlLCAweDAwYmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwYjYsIDB4MDAyNiwgMHg5MDE2LAorCTB4MDgwYywgMHhhZjQ4LCAweDAwZDYsIDB4MjA2OSwgMHgxOTU0LCAweDJkMDQsIDB4OTAwNSwgMHgwMTY4LAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4OTA4NiwgMHgwMDdlLCAweDExMzgsIDB4MjA2OSwgMHgxODFmLAorCTB4MmQwNCwgMHg4MDAwLCAweDIwNmEsIDB4MDBkZSwgMHgwMDEwLCAweDAwZGUsIDB4MDA4OCwgMHg5MDA2LAorCTB4MDgwYywgMHg2M2RjLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDYzZjAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAyLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDgwNCwgMHhhZWQ3LAorCTB4MDgwYywgMHhiZTM3LCAweDAxYjAsIDB4NjAxNCwgMHgyMDQ4LCAweGE4NjQsIDB4MjAxMCwgMHg5MDg2LAorCTB4MDEzOSwgMHgxMTM4LCAweDYwMDcsIDB4MDAxNiwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHhjNDcyLAorCTB4MDBiMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2NCwgMHhkMGZjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDAxLAorCTB4MGNhOCwgMHgyMDAxLCAweDE4MGUsIDB4MjAwNCwgMHhkMGRjLCAweDAxNDgsIDB4NjAxMCwgMHgyMDU4LAorCTB4Yjg0MCwgMHg5MDg0LCAweDAwZmYsIDB4OTAwNSwgMHgxMTEwLCAweDkwMDYsIDB4MGMzOCwgMHgwODBjLAorCTB4YWE4MSwgMHgyMDA5LCAweDAyNmUsIDB4MjEzNCwgMHg5NmI0LCAweDAwZmYsIDB4OTY4NiwgMHgwMDA1LAorCTB4MDUxMCwgMHg5Njg2LCAweDAwMGIsIDB4MDFjOCwgMHgyMDA5LCAweDAyNmYsIDB4MjEwNCwgMHg5MDg0LAorCTB4ZmYwMCwgMHgxMTE4LCAweDk2ODYsIDB4MDAwOSwgMHgwMWIwLCAweDkwODYsIDB4MTkwMCwgMHgxMTY4LAorCTB4OTY4NiwgMHgwMDA5LCAweDAxODAsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NjNmMCwgMHgyMDAxLAorCTB4MDAyOCwgMHg2MDFhLCAweDYwMDcsIDB4MDA1MiwgMHgwMDEwLCAweDA4MGMsIDB4YWQyNCwgMHgwMDJlLAorCTB4MDBiZSwgMHgwMDllLCAweDAwMDUsIDB4OTI4NiwgMHgwMTM5LCAweDAxNjAsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MDgwYywgMHhiZTM3LCAweDAxNDAsIDB4YTg2NCwgMHg5MDg2LCAweDAxMzksIDB4MDExOCwgMHhhODY4LAorCTB4ZDBmYywgMHgwMTA4LCAweDBjNTAsIDB4NjAxMCwgMHgyMDU4LCAweGI4NDAsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTAwNSwgMHgwMTM4LCAweDgwMDEsIDB4Yjg0MiwgMHg2MDFiLCAweDAwMGEsIDB4NjAwNywgMHgwMDE2LAorCTB4MDhmMCwgMHhiOGEwLCAweDkwODYsIDB4MDA3ZSwgMHgxMTM4LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHg1ZWJlLCAweDAwZWUsIDB4MDAxMCwgMHgwODBjLCAweDMxOGIsIDB4MDg3MCwgMHgwODBjLAorCTB4YWY0OCwgMHgxMTYwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDYzZjAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDAzLCAweDA4MGMsIDB4ODZjMSwgMHgwODA0LCAweDhjMTAsIDB4MDgwYywgMHhhYTgxLAorCTB4MDgwNCwgMHhhZDI0LCAweDA0NjksIDB4MTE2MCwgMHgyMDAxLCAweDAwMDgsIDB4MDgwYywgMHg2M2YwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwNSwgMHgwODBjLCAweDg2YzEsIDB4MDgwNCwgMHg4YzEwLAorCTB4MDgwNCwgMHhhZDI0LCAweDAwZTksIDB4MTE2MCwgMHgyMDAxLCAweDAwMGEsIDB4MDgwYywgMHg2M2YwLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwNCwgMHg4YzEwLAorCTB4MDgwNCwgMHhhZDI0LCAweDIwMDksIDB4MDI2ZSwgMHgyMTA0LCAweDkwODYsIDB4MDAwMywgMHgxMTM4LAorCTB4MjAwOSwgMHgwMjZmLCAweDIxMDQsIDB4OTA4NCwgMHhmZjAwLCAweDkwODYsIDB4MmEwMCwgMHgwMDA1LAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBiNiwgMHgwMGM2LCAweDAwMTYsIDB4NjExMCwgMHgyMTU4LAorCTB4MDgwYywgMHg2NGFlLCAweDAwMWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMGY2LAorCTB4MDBlNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDAxNiwgMHg2MDEwLCAweDIwNTgsIDB4MjAwOSwgMHgxODM2LAorCTB4MjEwNCwgMHg5MDg1LCAweDAwMDMsIDB4MjAwYSwgMHgwODBjLCAweGFmZWUsIDB4MDU2MCwgMHgyMDA5LAorCTB4MTgzNiwgMHgyMTA0LCAweGMwY2QsIDB4MjAwYSwgMHgwODBjLCAweDY3YmYsIDB4MDE1OCwgMHg5MDA2LAorCTB4MjAyMCwgMHgyMDA5LCAweDAwMmEsIDB4MDgwYywgMHhkODg1LCAweDIwMDEsIDB4MTgwYywgMHgyMDBjLAorCTB4YzE5NSwgMHgyMTAyLCAweDIwMTksIDB4MDAyYSwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgzMTU2LAorCTB4MDBlNiwgMHgyMDcxLCAweDE4MDAsIDB4MDgwYywgMHgyZjZjLCAweDAwZWUsIDB4MDBjNiwgMHgwMTU2LAorCTB4MjBhOSwgMHgwNzgxLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLCAweDMyODYsIDB4ODEwOCwgMHgxZjA0LAorCTB4YWY4YywgMHgwMTVlLCAweDAwY2UsIDB4MDgwYywgMHhhZjRiLCAweDIwNzEsIDB4MDI2MCwgMHgyMDc5LAorCTB4MDIwMCwgMHg3ODE3LCAweDAwMDEsIDB4MjAwMSwgMHgxODM2LCAweDIwMGMsIDB4YzFjNSwgMHg3MDE4LAorCTB4ZDBmYywgMHgwMTEwLCAweGQwZGMsIDB4MDExOCwgMHg3MDM4LCAweGQwZGMsIDB4MTEwOCwgMHhjMWM0LAorCTB4NzgxNywgMHgwMDAwLCAweDIwMDEsIDB4MTgzNiwgMHgyMTAyLCAweDIwNzksIDB4MDEwMCwgMHgyZTA0LAorCTB4OTA4NCwgMHgwMGZmLCAweDIwNjksIDB4MTgxZSwgMHgyMDZhLCAweDc4ZTYsIDB4MDAwNiwgMHg4ZTcwLAorCTB4MmUwNCwgMHgyMDY5LCAweDE4MWYsIDB4MjA2YSwgMHg3OGVhLCAweDc4MzIsIDB4NzgzNiwgMHgyMDEwLAorCTB4OTA4NCwgMHhmZjAwLCAweDAwMWUsIDB4OTEwNSwgMHgyMDA5LCAweDE4MmIsIDB4MjAwYSwgMHgyMjAwLAorCTB4OTA4NCwgMHgwMGZmLCAweDIwMDgsIDB4MDgwYywgMHgyN2I3LCAweDA4MGMsIDB4NzIwNywgMHgwMTcwLAorCTB4MjA3MSwgMHgwMjYwLCAweDIwNjksIDB4MTk1YSwgMHg3MDQ4LCAweDIwNmEsIDB4NzA0YywgMHg2ODA2LAorCTB4NzA1MCwgMHg2ODBhLCAweDcwNTQsIDB4NjgwZSwgMHgwODBjLCAweGMyNGQsIDB4MDA0MCwgMHgyMDAxLAorCTB4MDAwNiwgMHgwODBjLCAweDYzZjAsIDB4MDgwYywgMHgzMWI0LCAweDA4MGMsIDB4YTBlMywgMHgwMDFlLAorCTB4MDAzZSwgMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMGJlLCAweDAwMDUsIDB4MDA5NiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMGU2LCAweDAxNTYsIDB4MjAxOSwgMHgxODJiLCAweDIzMWMsIDB4ODNmZiwgMHgwMWYwLAorCTB4MjA3MSwgMHgwMjYwLCAweDcyMDAsIDB4OTI5NCwgMHgwMGZmLCAweDcwMDQsIDB4OTA4NCwgMHhmZjAwLAorCTB4OTIwNSwgMHg5MzA2LCAweDExOTgsIDB4MjAxMSwgMHgwMjc2LCAweDIwYTksIDB4MDAwNCwgMHgyYjQ4LAorCTB4MjAxOSwgMHgwMDBhLCAweDA4MGMsIDB4YjBkMCwgMHgxMTQ4LCAweDIwMTEsIDB4MDI3YSwgMHgyMGE5LAorCTB4MDAwNCwgMHgyMDE5LCAweDAwMDYsIDB4MDgwYywgMHhiMGQwLCAweDExMDAsIDB4MDE1ZSwgMHgwMGVlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHg3MDM0LAorCTB4OTA4NiwgMHgwMDE0LCAweDExYTgsIDB4NzAzOCwgMHg5MDg2LCAweDA4MDAsIDB4MTE4OCwgMHg3MDNjLAorCTB4ZDBlYywgMHgwMTYwLCAweDkwODQsIDB4MGYwMCwgMHg5MDg2LCAweDAxMDAsIDB4MTEzOCwgMHg3MDU0LAorCTB4ZDBhNCwgMHgxMTEwLCAweGQwYWMsIDB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MDA5NiwgMHgwMGM2LCAweDAwNzYsIDB4MDA1NiwgMHgwMDQ2LAorCTB4MDAyNiwgMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMjksIDB4MTljOCwgMHgyNTJjLAorCTB4MjAyMSwgMHgxOWNlLCAweDI0MjQsIDB4MjA2MSwgMHgxY2QwLCAweDIwNzEsIDB4MTgwMCwgMHg3MjUwLAorCTB4NzA3MCwgMHg5MjAyLCAweDFhMDQsIDB4YjBhOCwgMHgwODBjLCAweGQ4YjYsIDB4MDkwNCwgMHhiMGExLAorCTB4NjcyMCwgMHg5Nzg2LCAweDAwMDcsIDB4MDkwNCwgMHhiMGExLCAweDI1MDAsIDB4OWMwNiwgMHgwOTA0LAorCTB4YjBhMSwgMHgyNDAwLCAweDljMDYsIDB4MDVlOCwgMHgzZTA4LCAweDkxODYsIDB4MDAwMiwgMHgxMTQ4LAorCTB4NjAxMCwgMHg5MDA1LCAweDAxMzAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLAorCTB4MTU4MCwgMHgwMGM2LCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMTAsIDB4MDgwYywgMHgxOWI0LAorCTB4OTc4NiwgMHgwMDBhLCAweDAxNDgsIDB4MDgwYywgMHhjMDNmLCAweDExMzAsIDB4MDBjZSwgMHgwODBjLAorCTB4YWE4MSwgMHgwODBjLCAweGExMTMsIDB4MDBlOCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LAorCTB4MDFhOCwgMHg5Nzg2LCAweDAwMDMsIDB4MTUzMCwgMHhhODY3LCAweDAxMDMsIDB4YTg3YywgMHhkMGNjLAorCTB4MDEzMCwgMHgwMDk2LCAweGE4NzgsIDB4MjA0OCwgMHgwODBjLCAweDBmZTMsIDB4MDA5ZSwgMHhhYjdhLAorCTB4YTg3NywgMHgwMDAwLCAweDA4MGMsIDB4NmFkYywgMHgwODBjLCAweGMwMjIsIDB4MDgwYywgMHhhMTEzLAorCTB4MDBjZSwgMHg5Y2UwLCAweDAwMTgsIDB4NzA2NCwgMHg5YzAyLCAweDEyMTAsIDB4MDgwNCwgMHhiMDRmLAorCTB4MDEyZSwgMHgwMDBlLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwN2UsIDB4MDBjZSwgMHgwMDllLAorCTB4MDBlZSwgMHgwMDA1LCAweDk3ODYsIDB4MDAwNiwgMHgxMTE4LCAweDA4MGMsIDB4ZDgzMCwgMHgwYzMwLAorCTB4OTc4NiwgMHgwMDBhLCAweDA5ZTAsIDB4MDg4MCwgMHgyMjBjLCAweDIzMDQsIDB4OTEwNiwgMHgxMTMwLAorCTB4ODIxMCwgMHg4MzE4LCAweDFmMDQsIDB4YjBiYywgMHg5MDA2LCAweDAwMDUsIDB4MjMwNCwgMHg5MTAyLAorCTB4MDIxOCwgMHgyMDAxLCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDkxOGQsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDEzNiwgMHgwMWM2LCAweDAwMTYsIDB4ODkwNiwgMHg4MDA2LCAweDgwMDcsIDB4OTA4YywgMHgwMDNmLAorCTB4MjFlMCwgMHg5MDg0LCAweGZmYzAsIDB4OTMwMCwgMHgyMDk4LCAweDM1MTgsIDB4MjBhOSwgMHgwMDAxLAorCTB4MjIwYywgMHg0MDAyLCAweDkxMGUsIDB4MTE0MCwgMHg4MjEwLCAweDgzMTksIDB4MWRjOCwgMHg5MDA2LAorCTB4MDAxZSwgMHgwMWNlLCAweDAxM2UsIDB4MDAwNSwgMHgyMjBjLCAweDkxMDIsIDB4MDIxOCwgMHgyMDAxLAorCTB4MDAwMSwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMCwgMHg5MThkLCAweDAwMDEsIDB4MDAxZSwgMHgwMWNlLAorCTB4MDEzZSwgMHgwMDA1LCAweDYwMDQsIDB4OTA4YSwgMHgwMDUzLCAweDFhMGMsIDB4MGRmYSwgMHgwODBjLAorCTB4YzAyZSwgMHgwMTIwLCAweDA4MGMsIDB4YzAzZiwgMHgwMTY4LCAweDAwMjgsIDB4MDgwYywgMHgzMWI0LAorCTB4MDgwYywgMHhjMDNmLCAweDAxMzgsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTBlMywgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDA4MGMsIDB4YWE4MSwgMHgwY2IwLCAweDkxODIsIDB4MDA1NCwgMHgxMjIwLAorCTB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGIxMzEsIDB4YjEzMSwgMHhiMTMxLAorCTB4YjEzMSwgMHhiMTMxLCAweGIxMzEsIDB4YjEzMSwgMHhiMTMxLCAweGIxMzEsIDB4YjEzMSwgMHhiMTMxLAorCTB4YjEzMywgMHhiMTMzLCAweGIxMzMsIDB4YjEzMywgMHhiMTMxLCAweGIxMzEsIDB4YjEzMSwgMHhiMTMzLAorCTB4YjEzMSwgMHgwODBjLCAweDBkZmEsIDB4NjAwYiwgMHhmZmZmLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LAorCTB4MDgwYywgMHg4Njc5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OGMxMCwgMHgwMTJlLAorCTB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MTEyOCwgMHg2MDA0LCAweDkwODIsIDB4MDA0MCwgMHgwODA0LAorCTB4YjFlOCwgMHg5MTg2LCAweDAwMjcsIDB4MTUyMCwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHgzMThiLAorCTB4MDgwYywgMHhjNTRlLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LCAweDA4MGMsIDB4YmUzNywgMHgwMTk4LAorCTB4MDgwYywgMHhjMDNmLCAweDExMTgsIDB4MDgwYywgMHhhYTgxLCAweDAwNjgsIDB4YTg2NywgMHgwMTAzLAorCTB4YTg3YiwgMHgwMDI5LCAweGE4NzcsIDB4MDAwMCwgMHhhOTdjLCAweGMxYzUsIDB4YTk3ZSwgMHgwODBjLAorCTB4NmFlOSwgMHgwODBjLCAweGMwMjIsIDB4MDA5ZSwgMHgwODBjLCAweGEwZTMsIDB4MDgwNCwgMHg4YzEwLAorCTB4OTE4NiwgMHgwMDE0LCAweDExMjAsIDB4NjAwNCwgMHg5MDgyLCAweDAwNDAsIDB4MDRhMCwgMHg5MTg2LAorCTB4MDA0NiwgMHgwMTUwLCAweDkxODYsIDB4MDA0NSwgMHgwMTM4LCAweDkxODYsIDB4MDA1MywgMHgwMTIwLAorCTB4OTE4NiwgMHgwMDQ4LCAweDE5MGMsIDB4MGRmYSwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LAorCTB4MDUwOCwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MjA3OSwgMHgxOWJmLCAweDIwNzEsIDB4MTgwMCwgMHgyMDYxLAorCTB4MDEwMCwgMHgwODBjLCAweDg1NjMsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAxMmUsIDB4YTAwMSwgMHg2MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxMTEwLAorCTB4MDgwNCwgMHhiMjI2LCAweDAwMDUsIDB4MDAwMiwgMHhiMWMyLCAweGIxYzAsIDB4YjFjMCwgMHhiMWMwLAorCTB4YjFjMCwgMHhiMWMwLCAweGIxYzAsIDB4YjFjMCwgMHhiMWMwLCAweGIxYzAsIDB4YjFjMCwgMHhiMWRkLAorCTB4YjFkZCwgMHhiMWRkLCAweGIxZGQsIDB4YjFjMCwgMHhiMWRkLCAweGIxYzAsIDB4YjFkZCwgMHhiMWMwLAorCTB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4OGIwNCwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLAorCTB4YmUzNywgMHgwMTY4LCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMDYsIDB4YTg3NywgMHgwMDAwLAorCTB4YTg4MCwgMHhjMGVjLCAweGE4ODIsIDB4MDgwYywgMHg2YWU5LCAweDA4MGMsIDB4YzAyMiwgMHgwMDllLAorCTB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLAorCTB4YzAzZiwgMHgwOTBjLCAweGFhODEsIDB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LAorCTB4MDAwMiwgMHhiMWZmLCAweGIxZmQsIDB4YjFmZCwgMHhiMWZkLCAweGIxZmQsIDB4YjFmZCwgMHhiMWZkLAorCTB4YjFmZCwgMHhiMWZkLCAweGIxZmQsIDB4YjFmZCwgMHhiMjE2LCAweGIyMTYsIDB4YjIxNiwgMHhiMjE2LAorCTB4YjFmZCwgMHhiMjIwLCAweGIxZmQsIDB4YjIxNiwgMHhiMWZkLCAweDA4MGMsIDB4MGRmYSwgMHgwMDk2LAorCTB4MDgwYywgMHg4YjA0LCAweDYwMTQsIDB4MjA0OCwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwgMHg2MDQyLAorCTB4YTk3YywgMHhkMWFjLCAweDAxNDAsIDB4NjAwMywgMHgwMDA0LCAweGE4N2MsIDB4OTA4NSwgMHgwNDAwLAorCTB4YTg3ZSwgMHgwMDllLCAweDAwMDUsIDB4NjAwMywgMHgwMDAyLCAweDBjYjgsIDB4MDgwYywgMHg4YjA0LAorCTB4MDgwYywgMHhjNTUxLCAweDA4MGMsIDB4YzU1NiwgMHg2MDAzLCAweDAwMGYsIDB4MDgwNCwgMHg4YzEwLAorCTB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTBlMywgMHgwODA0LCAweDhjMTAsIDB4OTE4MiwgMHgwMDU0LAorCTB4MTIyMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YjI0MiwgMHhiMjQyLAorCTB4YjI0MiwgMHhiMjQyLCAweGIyNDIsIDB4YjI0NCwgMHhiMzIxLCAweGIyNDIsIDB4YjM1NSwgMHhiMjQyLAorCTB4YjI0MiwgMHhiMjQyLCAweGIyNDIsIDB4YjI0MiwgMHhiMjQyLCAweGIyNDIsIDB4YjI0MiwgMHhiMjQyLAorCTB4YjI0MiwgMHhiMzU1LCAweDA4MGMsIDB4MGRmYSwgMHgwMGI2LCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LAorCTB4NzY0NCwgMHg5NmI0LCAweDBmZmYsIDB4ODZmZiwgMHgxNTI4LCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLAorCTB4ZDBiYywgMHgxOTA0LCAweGIzMTAsIDB4YTg3YiwgMHgwMDAwLCAweGE4NjcsIDB4MDEwMywgMHhhZTc2LAorCTB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhiNGVlLAorCTB4MDgwYywgMHg2OTA0LCAweDYyMTAsIDB4MjI1OCwgMHhiYTNjLCAweDgyZmYsIDB4MDExMCwgMHg4MjExLAorCTB4YmEzZSwgMHg3MDQ0LCAweGQwZTQsIDB4MTkwNCwgMHhiMmY0LCAweDA4MGMsIDB4YTBlMywgMHgwMDllLAorCTB4MDBiZSwgMHgwMDA1LCAweDk2OGMsIDB4MGMwMCwgMHgwMTUwLCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLAorCTB4ZDBiYywgMHgxOTA0LCAweGIyZjgsIDB4NzM0OCwgMHhhYjkyLCAweDczNGMsIDB4YWI4ZSwgMHg5NjhjLAorCTB4MDBmZiwgMHg5MTg2LCAweDAwMDIsIDB4MDUwOCwgMHg5MTg2LCAweDAwMjgsIDB4MTExOCwgMHhhODdiLAorCTB4MDAxYywgMHgwMGU4LCAweGQ2ZGMsIDB4MDFhMCwgMHhhODdiLCAweDAwMTUsIDB4YTg3YywgMHhkMGFjLAorCTB4MDE3MCwgMHhhOTM4LCAweGFhMzQsIDB4MjEwMCwgMHg5MjA1LCAweDAxNDgsIDB4NzA0OCwgMHg5MTA2LAorCTB4MTExOCwgMHg3MDRjLCAweDkyMDYsIDB4MDExOCwgMHhhOTkyLCAweGFhOGUsIDB4YzZkYywgMHgwMDM4LAorCTB4ZDZkNCwgMHgwMTE4LCAweGE4N2IsIDB4MDAwNywgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHhhODY3LAorCTB4MDEwMywgMHhhZTc2LCAweDkwMWUsIDB4ZDZjNCwgMHgwMWQ4LCAweDk2ODYsIDB4MDEwMCwgMHgxMTMwLAorCTB4NzA2NCwgMHg5MDA1LCAweDExMTgsIDB4YzZjNCwgMHgwODA0LCAweGIyNGIsIDB4NzM1YywgMHhhYjg2LAorCTB4ODNmZiwgMHgwMTcwLCAweDkzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LAorCTB4MjMwOCwgMHgyMDE5LCAweDAwMTgsIDB4MjAxMSwgMHgwMDI1LCAweDA4MGMsIDB4YjllOCwgMHgwMDNlLAorCTB4ZDZjYywgMHgwOTA0LCAweGIyNjAsIDB4NzE1NCwgMHhhOThhLCAweDgxZmYsIDB4MDkwNCwgMHhiMjYwLAorCTB4OTE5MiwgMHgwMDIxLCAweDEyNzgsIDB4ODMwNCwgMHg5MDk4LCAweDAwMTgsIDB4MjAxMSwgMHgwMDI5LAorCTB4MDgwYywgMHhiOWU4LCAweDIwMTEsIDB4MDIwNSwgMHgyMDEzLCAweDAwMDAsIDB4MDgwYywgMHhjNGRlLAorCTB4MDgwNCwgMHhiMjYwLCAweGE4NjgsIDB4ZDBmYywgMHgwMTIwLCAweDIwMDksIDB4MDAyMCwgMHhhOThhLAorCTB4MGM1MCwgMHgwMGE2LCAweDI5NTAsIDB4MDgwYywgMHhiOTg3LCAweDAwYWUsIDB4MDgwYywgMHhjNGRlLAorCTB4MDgwYywgMHhiOWQ4LCAweDA4MDQsIDB4YjI2MiwgMHgwODBjLCAweGMxMzcsIDB4MDgwNCwgMHhiMjZmLAorCTB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4YjI3YiwgMHhhODgwLCAweGQwYmMsIDB4MTkwNCwgMHhiMjdiLAorCTB4NzM0OCwgMHhhODM4LCAweDkzMDYsIDB4MTFjOCwgMHg3MzRjLCAweGE4MzQsIDB4OTMxZSwgMHgwOTA0LAorCTB4YjI3YiwgMHhkNmQ0LCAweDAxOTAsIDB4YWIzOCwgMHg5MzA1LCAweDA5MDQsIDB4YjI3YiwgMHgwMDY4LAorCTB4YTg3YywgMHhkMGFjLCAweDA5MDQsIDB4YjI1MywgMHhhODM4LCAweGE5MzQsIDB4OTEwNSwgMHgwOTA0LAorCTB4YjI1MywgMHhhODgwLCAweGQwYmMsIDB4MTkwNCwgMHhiMjUzLCAweDA4MGMsIDB4YzE3MSwgMHgwODA0LAorCTB4YjI2ZiwgMHgwMDk2LCAweDAwZjYsIDB4NjAwMywgMHgwMDAzLCAweDYwMDcsIDB4MDA0MywgMHgyMDc5LAorCTB4MDI2YywgMHg3YzA0LCAweDdiMDAsIDB4N2UwYywgMHg3ZDA4LCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLAorCTB4ZDBhYywgMHgwMTQwLCAweDYwMDMsIDB4MDAwMiwgMHgwMGZlLCAweDAwOWUsIDB4MDAwNSwgMHgyMTMwLAorCTB4MjIyOCwgMHgwMDU4LCAweDI0MDAsIDB4YTlhYywgMHg5MTBhLCAweDIzMDAsIDB4YWFiMCwgMHg5MjEzLAorCTB4MjYwMCwgMHg5MTAyLCAweDI1MDAsIDB4OTIwMywgMHgwZTkwLCAweGFjMzYsIDB4YWIzYSwgMHhhZTQ2LAorCTB4YWQ0YSwgMHgwMGZlLCAweDYwNDMsIDB4MDAwMCwgMHgyYzEwLCAweDA4MGMsIDB4MWFmZSwgMHgwODBjLAorCTB4ODZkZSwgMHgwODBjLCAweDhjZWQsIDB4MDA5ZSwgMHgwMDA1LCAweDAwMDUsIDB4OTE4MiwgMHgwMDU0LAorCTB4MTIyMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4YjM3MiwgMHhiMzcyLAorCTB4YjM3MiwgMHhiMzcyLCAweGIzNzIsIDB4YjM3NCwgMHhiNDBhLCAweGIzNzIsIDB4YjM3MiwgMHhiNDIxLAorCTB4YjRiMSwgMHhiMzcyLCAweGIzNzIsIDB4YjM3MiwgMHhiMzcyLCAweGI0YzYsIDB4YjM3MiwgMHhiMzcyLAorCTB4YjM3MiwgMHhiMzcyLCAweDA4MGMsIDB4MGRmYSwgMHgwMDc2LCAweDAwYTYsIDB4MDBlNiwgMHgwMDk2LAorCTB4MjA3MSwgMHgwMjYwLCAweDYxMTQsIDB4MjE1MCwgMHg3NjQ0LCAweGI2NzYsIDB4OTZiNCwgMHgwZmZmLAorCTB4Yjc3YywgMHhjN2U1LCAweGI3N2UsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLAorCTB4MDExMCwgMHg4MjExLCAweGJhM2UsIDB4MDBiZSwgMHg4NmZmLCAweDA5MDQsIDB4YjQwNSwgMHg5Njk0LAorCTB4ZmYwMCwgMHg5Mjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDQ4LCAweGIwOTIsIDB4NzA0YywgMHhiMDhlLAorCTB4OTI4NCwgMHgwMzAwLCAweDA5MDQsIDB4YjQwNSwgMHgwODBjLCAweDEwMzEsIDB4MDkwYywgMHgwZGZhLAorCTB4MjkwMCwgMHhiMDdhLCAweGI3N2MsIDB4YzdjZCwgMHhiNzdlLCAweGE4NjcsIDB4MDEwMywgMHhiMDY4LAorCTB4YTg2YSwgMHhiMDZjLCAweGE4NmUsIDB4YjA3MCwgMHhhODcyLCAweGFlNzYsIDB4OTY4YywgMHgwYzAwLAorCTB4MDEyMCwgMHg3MzQ4LCAweGFiOTIsIDB4NzM0YywgMHhhYjhlLCAweDk2OGMsIDB4MDBmZiwgMHg5MTg2LAorCTB4MDAwMiwgMHgwMTgwLCAweDkxODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMDYwLAorCTB4ZDZkYywgMHgwMTE4LCAweGE4N2IsIDB4MDAxNSwgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHhhODdiLAorCTB4MDAwNywgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHhhZjdlLCAweGIwODAsIDB4YTg4MiwgMHhiMDg0LAorCTB4YTg4NiwgMHg5MDFlLCAweGQ2YzQsIDB4MDE5MCwgMHg3MzVjLCAweGFiODYsIDB4ODNmZiwgMHgwMTcwLAorCTB4OTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LAorCTB4MDAxOCwgMHgyMDExLCAweDAwMjUsIDB4MDgwYywgMHhiOWU4LCAweDAwM2UsIDB4ZDZjYywgMHgwMWU4LAorCTB4NzE1NCwgMHhhOThhLCAweDgxZmYsIDB4MDFjOCwgMHg5MTkyLCAweDAwMjEsIDB4MTI2MCwgMHg4MzA0LAorCTB4OTA5OCwgMHgwMDE4LCAweDIwMTEsIDB4MDAyOSwgMHgwODBjLCAweGI5ZTgsIDB4MjAxMSwgMHgwMjA1LAorCTB4MjAxMywgMHgwMDAwLCAweDAwNTAsIDB4YjA2OCwgMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLAorCTB4YTk4YSwgMHgwYzY4LCAweDI5NTAsIDB4MDgwYywgMHhiOTg3LCAweDAwOWUsIDB4MDBlZSwgMHgwMGFlLAorCTB4MDA3ZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBhNiwgMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHgwMjZjLAorCTB4N2MwNCwgMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHg2MDE0LCAweDIwNTAsIDB4YjQzNiwgMHhiMzNhLAorCTB4YjY0NiwgMHhiNTRhLCAweDAwYWUsIDB4MDBmZSwgMHgyYzEwLCAweDA4MGMsIDB4MWFmZSwgMHgwODA0LAorCTB4OTYyMywgMHg2MDAzLCAweDAwMDIsIDB4NjAwNCwgMHg5MDg2LCAweDAwNDAsIDB4MTFjOCwgMHgwMDk2LAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4N2MsIDB4ZDBhYywgMHgwMTYwLCAweDYwMWMsIDB4ZDA4NCwgMHgxMTMwLAorCTB4MDBmNiwgMHgyYzAwLCAweDIwNzgsIDB4MDgwYywgMHgxNmRiLCAweDAwZmUsIDB4NjAwMywgMHgwMDA0LAorCTB4MDAxMCwgMHg2MDAzLCAweDAwMDIsIDB4MDA5ZSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHg4YzEwLAorCTB4MDA5NiwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwgMHg2MDQyLCAweDA4MGMsIDB4OGJjMCwgMHgwODBjLAorCTB4OGNlZCwgMHg2MTE0LCAweDIxNDgsIDB4YTk3YywgMHhkMWU0LCAweDA5MDQsIDB4YjRhYywgMHhkMWNjLAorCTB4MDVjOCwgMHhhOTc4LCAweGE4NjgsIDB4ZDBmYywgMHgwNTQwLCAweDAwMTYsIDB4YTg3YywgMHgwMDA2LAorCTB4YTg4MCwgMHgwMDA2LCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAxOSwgMHgyMGEwLAorCTB4ODEwZSwgMHg4MTBlLCAweDgxMGYsIDB4OTE4NCwgMHgwMDNmLCAweDIwZTAsIDB4OTE4NCwgMHhmZmMwLAorCTB4OTA4MCwgMHgwMDE5LCAweDIwOTgsIDB4MDE1NiwgMHgyMGE5LCAweDAwMjAsIDB4NDAwMywgMHgwMTVlLAorCTB4MDAwZSwgMHhhODgyLCAweDAwMGUsIDB4YzBjYywgMHhhODdlLCAweDAwMWUsIDB4YTg3NCwgMHgwMDA2LAorCTB4MjE0OCwgMHgwODBjLCAweDBmZTMsIDB4MDAxZSwgMHgwNDU4LCAweDAwMTYsIDB4MDgwYywgMHgwZmUzLAorCTB4MDA5ZSwgMHhhODdjLCAweGMwY2MsIDB4YTg3ZSwgMHhhOTc0LCAweDAwMTYsIDB4MDgwYywgMHhiOWQ4LAorCTB4MDAxZSwgMHgwMGYwLCAweGE4NjcsIDB4MDEwMywgMHhhOTc0LCAweDkxODQsIDB4MDBmZiwgMHg5MGI2LAorCTB4MDAwMiwgMHgwMTgwLCAweDkwODYsIDB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMDYwLAorCTB4ZDFkYywgMHgwMTE4LCAweGE4N2IsIDB4MDAxNSwgMHgwMDM4LCAweGQxZDQsIDB4MDExOCwgMHhhODdiLAorCTB4MDAwNywgMHgwMDEwLCAweGE4N2IsIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsIDB4NjkwNCwgMHgwMDFlLAorCTB4ZDFlNCwgMHgxMTIwLCAweDA4MGMsIDB4YTBlMywgMHgwMDllLCAweDAwMDUsIDB4MDgwYywgMHhjMTM3LAorCTB4MGNkOCwgMHg2MDA0LCAweDkwODYsIDB4MDA0MCwgMHgxMTIwLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLAorCTB4OGMxMCwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg5OTlkLCAweDYwMDMsIDB4MDAwMiwgMHgwODBjLAorCTB4YzU1NiwgMHgwODBjLCAweDhiYzAsIDB4MDgwYywgMHg4Y2VkLCAweDAwMDUsIDB4NjAwNCwgMHg5MDg2LAorCTB4MDA0MCwgMHgxMTIwLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLCAweDhjMTAsIDB4MjAxOSwgMHgwMDAxLAorCTB4MDgwYywgMHg5OTlkLCAweDA4MGMsIDB4OGJjMCwgMHgwODBjLCAweDMxOGIsIDB4MDgwYywgMHhjNTRlLAorCTB4MDA5NiwgMHg2MTE0LCAweDIxNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxNTAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTg3YiwgMHgwMDI5LCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZTksIDB4MDgwYywgMHhjMDIyLAorCTB4MDA5ZSwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg4Y2VkLCAweDAwMDUsIDB4YTg3YiwgMHgwMDE1LAorCTB4ZDFmYywgMHgwMTgwLCAweGE4N2IsIDB4MDAwNywgMHg4MDAyLCAweDgwMDAsIDB4ODEwYSwgMHg5MTg5LAorCTB4MDAwMCwgMHgwMDA2LCAweDAwMTYsIDB4MjAwOSwgMHgxYTUxLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLAorCTB4MDAxZSwgMHgwMDBlLCAweGE5OTIsIDB4YTg4ZSwgMHgwMDA1LCAweDkxODIsIDB4MDA1NCwgMHgxMjIwLAorCTB4OTE4MiwgMHgwMDQwLCAweDAyMDgsIDB4MDAwYSwgMHgwMDA1LCAweGI1MjEsIDB4YjUyMSwgMHhiNTIxLAorCTB4YjUyMSwgMHhiNTIxLCAweGI1MjMsIDB4YjUyMSwgMHhiNTIxLCAweGI1YzksIDB4YjUyMSwgMHhiNTIxLAorCTB4YjUyMSwgMHhiNTIxLCAweGI1MjEsIDB4YjUyMSwgMHhiNTIxLCAweGI1MjEsIDB4YjUyMSwgMHhiNTIxLAorCTB4YjZmYiwgMHgwODBjLCAweDBkZmEsIDB4MDA3NiwgMHgwMGE2LCAweDAwZTYsIDB4MDA5NiwgMHgyMDcxLAorCTB4MDI2MCwgMHg2MTE0LCAweDIxNTAsIDB4NzY0NCwgMHhiNjc2LCAweDk2YjQsIDB4MGZmZiwgMHhiNzdjLAorCTB4YzdlNSwgMHhiNzdlLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhM2MsIDB4ODJmZiwgMHgwMTEwLAorCTB4ODIxMSwgMHhiYTNlLCAweDAwYmUsIDB4ODZmZiwgMHgwOTA0LCAweGI1YzIsIDB4OTY5NCwgMHhmZjAwLAorCTB4OTI4NCwgMHgwYzAwLCAweDAxMjAsIDB4NzA0OCwgMHhiMDkyLCAweDcwNGMsIDB4YjA4ZSwgMHg5Mjg0LAorCTB4MDMwMCwgMHgwOTA0LCAweGI1YzIsIDB4OTY4NiwgMHgwMTAwLCAweDExMzAsIDB4NzA2NCwgMHg5MDA1LAorCTB4MTExOCwgMHhjNmM0LCAweGI2NzYsIDB4MGMzOCwgMHgwODBjLCAweDEwMzEsIDB4MDkwYywgMHgwZGZhLAorCTB4MjkwMCwgMHhiMDdhLCAweGI3N2MsIDB4OTdiZCwgMHgwMjAwLCAweGI3N2UsIDB4YTg2NywgMHgwMTAzLAorCTB4YjA2OCwgMHhhODZhLCAweGIwNmMsIDB4YTg2ZSwgMHhiMDcwLCAweGE4NzIsIDB4NzA0NCwgMHg5MDg0LAorCTB4ZjAwMCwgMHg5NjM1LCAweGFlNzYsIDB4OTY4YywgMHgwYzAwLCAweDAxMjAsIDB4NzM0OCwgMHhhYjkyLAorCTB4NzM0YywgMHhhYjhlLCAweDk2OGMsIDB4MDBmZiwgMHg5MTg2LCAweDAwMDIsIDB4MDE4MCwgMHg5MTg2LAorCTB4MDAyOCwgMHgxMTE4LCAweGE4N2IsIDB4MDAxYywgMHgwMDYwLCAweGQ2ZGMsIDB4MDExOCwgMHhhODdiLAorCTB4MDAxNSwgMHgwMDM4LCAweGQ2ZDQsIDB4MDExOCwgMHhhODdiLCAweDAwMDcsIDB4MDAxMCwgMHhhODdiLAorCTB4MDAwMCwgMHhhZjdlLCAweGIwODAsIDB4YTg4MiwgMHhiMDg0LCAweGE4ODYsIDB4OTAxZSwgMHhkNmM0LAorCTB4MDE5MCwgMHg3MzVjLCAweGFiODYsIDB4ODNmZiwgMHgwMTcwLCAweDkzOGEsIDB4MDAwOSwgMHgwMjEwLAorCTB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LCAweDAwMTgsIDB4MjAxMSwgMHgwMDI1LAorCTB4MDgwYywgMHhiOWU4LCAweDAwM2UsIDB4ZDZjYywgMHgwMWU4LCAweDcxNTQsIDB4YTk4YSwgMHg4MWZmLAorCTB4MDFjOCwgMHg5MTkyLCAweDAwMjEsIDB4MTI2MCwgMHg4MzA0LCAweDkwOTgsIDB4MDAxOCwgMHgyMDExLAorCTB4MDAyOSwgMHgwODBjLCAweGI5ZTgsIDB4MjAxMSwgMHgwMjA1LCAweDIwMTMsIDB4MDAwMCwgMHgwMDUwLAorCTB4YjA2OCwgMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweGE5OGEsIDB4MGM2OCwgMHgyOTUwLAorCTB4MDgwYywgMHhiOTg3LCAweDA4MGMsIDB4MTk4MiwgMHgwMDllLCAweDAwZWUsIDB4MDBhZSwgMHgwMDdlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE5NjAsIDB4MjAwNCwgMHg2MDQyLCAweDAwOTYsIDB4NjExNCwgMHgyMTQ4LAorCTB4YTgzYywgMHhhOTQwLCAweDkxMDUsIDB4MTExOCwgMHhhODdjLCAweGMwZGMsIDB4YTg3ZSwgMHg2MDAzLAorCTB4MDAwMiwgMHhhOTdjLCAweGQxZTQsIDB4MDkwNCwgMHhiNmY2LCAweDYwNDMsIDB4MDAwMCwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDE1MDAsIDB4ZDFjYywgMHgwOTA0LAorCTB4YjZjNSwgMHhhOTc4LCAweGE4NjgsIDB4ZDBmYywgMHgwOTA0LCAweGI2ODYsIDB4MDAxNiwgMHhhODdjLAorCTB4MDAwNiwgMHhhODgwLCAweDAwMDYsIDB4MDBhNiwgMHgyMTUwLCAweGIxNzQsIDB4OTE4NCwgMHgwMGZmLAorCTB4OTBiNiwgMHgwMDAyLCAweDA5MDQsIDB4YjY1MywgMHg5MDg2LCAweDAwMjgsIDB4MTkwNCwgMHhiNjNmLAorCTB4YTg3YiwgMHgwMDFjLCAweGIwN2IsIDB4MDAxYywgMHgwODA0LCAweGI2NWIsIDB4NjAyNCwgMHhkMGY0LAorCTB4MTFkMCwgMHhhODM4LCAweGFhMzQsIDB4OTIwNSwgMHgwOWM4LCAweGE4MzgsIDB4YWE5MCwgMHg5MjA2LAorCTB4MTEyMCwgMHhhODhjLCAweGFhMzQsIDB4OTIwNiwgMHgwOTg4LCAweDYwMjQsIDB4ZDBkNCwgMHgxMTQ4LAorCTB4YTlhYywgMHhhODM0LCAweDkxMDIsIDB4NjAzYSwgMHhhOWIwLCAweGE4MzgsIDB4OTEwMywgMHg2MDNlLAorCTB4NjAyNCwgMHhjMGY1LCAweDYwMjYsIDB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4YjgzYywgMHg4MDAwLAorCTB4YjgzZSwgMHgwMGJlLCAweDkwMDYsIDB4YTg3NiwgMHhhODkyLCAweGE4OGUsIDB4YTg3YywgMHhjMGU0LAorCTB4YTg3ZSwgMHhkMGNjLCAweDAxNDAsIDB4YzBjYywgMHhhODdlLCAweDAwOTYsIDB4YTg3OCwgMHgyMDQ4LAorCTB4MDgwYywgMHgwZmUzLCAweDAwOWUsIDB4MDgwYywgMHhjMTcxLCAweDA4MDQsIDB4YjZmNiwgMHhkMWRjLAorCTB4MDE1OCwgMHhhODdiLCAweDAwMTUsIDB4YjA3YiwgMHgwMDE1LCAweDA4MGMsIDB4YzQwMSwgMHgwMTE4LAorCTB4YjE3NCwgMHhjMWRjLCAweGIxNzYsIDB4MDA3OCwgMHhkMWQ0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA3LAorCTB4YjA3YiwgMHgwMDA3LCAweDAwNDAsIDB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LAorCTB4OTExNSwgMHgxOTBjLCAweGI0ZWUsIDB4YTg3YywgMHhiMDdlLCAweGE4OTAsIDB4YjA5MiwgMHhhODhjLAorCTB4YjA4ZSwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLCAweDAwMTksIDB4MjBhMCwgMHgyMGE5LAorCTB4MDAyMCwgMHg4YTA2LCAweDgwMDYsIDB4ODAwNywgMHg5MDk0LCAweDAwM2YsIDB4MjJlMCwgMHg5MDg0LAorCTB4ZmZjMCwgMHg5MDgwLCAweDAwMTksIDB4MjA5OCwgMHg0MDAzLCAweDAwYWUsIDB4MDAwZSwgMHhhODgyLAorCTB4MDAwZSwgMHhjMGNjLCAweGE4N2UsIDB4MDgwYywgMHhjNGRlLCAweDAwMWUsIDB4YTg3NCwgMHgwMDA2LAorCTB4MjE0OCwgMHgwODBjLCAweDBmZTMsIDB4MDAxZSwgMHgwODA0LCAweGI2ZjIsIDB4MDAxNiwgMHgwMGE2LAorCTB4MjE1MCwgMHhiMTc0LCAweDkxODQsIDB4MDBmZiwgMHg5MGI2LCAweDAwMDIsIDB4MDFlMCwgMHg5MDg2LAorCTB4MDAyOCwgMHgxMTI4LCAweGE4N2IsIDB4MDAxYywgMHhiMDdiLCAweDAwMWMsIDB4MDBlMCwgMHhkMWRjLAorCTB4MDE1OCwgMHhhODdiLCAweDAwMTUsIDB4YjA3YiwgMHgwMDE1LCAweDA4MGMsIDB4YzQwMSwgMHgwMTE4LAorCTB4YjE3NCwgMHhjMWRjLCAweGIxNzYsIDB4MDA3OCwgMHhkMWQ0LCAweDAxMjgsIDB4YTg3YiwgMHgwMDA3LAorCTB4YjA3YiwgMHgwMDA3LCAweDAwNDAsIDB4YTg3YywgMHhkMGFjLCAweDAxMjgsIDB4YTgzNCwgMHhhOTM4LAorCTB4OTExNSwgMHgxOTBjLCAweGI0ZWUsIDB4YTg5MCwgMHhiMDkyLCAweGE4OGMsIDB4YjA4ZSwgMHhhODdjLAorCTB4YjA3ZSwgMHgwMGFlLCAweDA4MGMsIDB4MGZlMywgMHgwMDllLCAweDA4MGMsIDB4YzRkZSwgMHhhOTc0LAorCTB4MDAxNiwgMHgwODBjLCAweGI5ZDgsIDB4MDAxZSwgMHgwNDY4LCAweGE4NjcsIDB4MDEwMywgMHhhOTc0LAorCTB4OTE4NCwgMHgwMGZmLCAweDkwYjYsIDB4MDAwMiwgMHgwMWIwLCAweDkwODYsIDB4MDAyOCwgMHgxMTE4LAorCTB4YTg3YiwgMHgwMDFjLCAweDAwZDAsIDB4ZDFkYywgMHgwMTQ4LCAweGE4N2IsIDB4MDAxNSwgMHgwODBjLAorCTB4YzQwMSwgMHgwMTE4LCAweGE5NzQsIDB4YzFkYywgMHhhOTc2LCAweDAwNzgsIDB4ZDFkNCwgMHgwMTE4LAorCTB4YTg3YiwgMHgwMDA3LCAweDAwNTAsIDB4YTg3YiwgMHgwMDAwLCAweGE4N2MsIDB4ZDBhYywgMHgwMTI4LAorCTB4YTgzNCwgMHhhOTM4LCAweDkxMTUsIDB4MTkwYywgMHhiNGVlLCAweGE5NzQsIDB4MDAxNiwgMHgwODBjLAorCTB4NjkwNCwgMHgwMDFlLCAweGQxZTQsIDB4MTEyMCwgMHgwODBjLCAweGEwZTMsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDgwYywgMHhjMTM3LCAweDBjZDgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTk3YywgMHhkMWU0LAorCTB4MTkwYywgMHgxOWEwLCAweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweDhiMDQsIDB4MDAxMCwgMHgwODBjLAorCTB4OGJjMCwgMHgwODBjLCAweGJlMzcsIDB4MDFmMCwgMHgwMDk2LCAweDYxMTQsIDB4MjE0OCwgMHgwODBjLAorCTB4YzAzZiwgMHgxMTE4LCAweDA4MGMsIDB4YWE4MSwgMHgwMGEwLCAweGE4NjcsIDB4MDEwMywgMHgyMDA5LAorCTB4MTgwYywgMHgyMTBjLCAweGQxOGMsIDB4MTFiOCwgMHhkMTg0LCAweDExOTAsIDB4NjEwOCwgMHhhOTdhLAorCTB4OTE4ZSwgMHgwMDI5LCAweDExMTAsIDB4MDgwYywgMHhkYjJlLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLAorCTB4NmFlOSwgMHgwMDllLCAweDA4MGMsIDB4YTBlMywgMHgwODBjLCAweDhjMTAsIDB4MDgwNCwgMHg4Y2VkLAorCTB4YTg3YiwgMHgwMDA0LCAweDBjOTAsIDB4YTg3YiwgMHgwMDA0LCAweDBjNzgsIDB4OTE4MiwgMHgwMDU0LAorCTB4MTIyMCwgMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDBhLCAweDAwMDUsIDB4Yjc1MiwgMHhiNzUyLAorCTB4Yjc1MiwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1NCwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1MiwgMHhiNzUyLAorCTB4Yjc1MiwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1MiwgMHhiNzUyLCAweGI3NTIsIDB4Yjc1MiwgMHhiNzUyLAorCTB4Yjc1MiwgMHhiNzUyLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDU1ZTMsIDB4MDFmOCwgMHg2MDE0LAorCTB4NzE0NCwgMHg5MThjLCAweDBmZmYsIDB4OTAxNiwgMHhkMWM0LCAweDAxMTgsIDB4NzI2NCwgMHg5Mjk0LAorCTB4MDBmZiwgMHgwMDk2LCAweDkwNGQsIDB4MDE4OCwgMHhhODdiLCAweDAwMDAsIDB4YTg2NCwgMHg5MDg2LAorCTB4MDEzOSwgMHgwMTI4LCAweGE4NjcsIDB4MDEwMywgMHhhOTc2LCAweGFhOTYsIDB4MDAzMCwgMHhhODk3LAorCTB4NDAwMCwgMHhhOTlhLCAweGFhOWUsIDB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDgwNCwgMHhhMGUzLAorCTB4OTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4Yjc4YSwgMHhiNzg4LCAweGI3ODgsIDB4Yjc5NiwgMHhiNzg4LAorCTB4Yjc4OCwgMHhiNzg4LCAweGI3ODgsIDB4Yjc4OCwgMHhiNzg4LCAweGI3ODgsIDB4Yjc4OCwgMHhiNzg4LAorCTB4MDgwYywgMHgwZGZhLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4ODY3OSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OGMxMCwgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDU2LAorCTB4MDBkNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHg3MjI0LCAweDYyMTYsIDB4NzIyMCwgMHgwODBjLAorCTB4YmUyNSwgMHgwMWY4LCAweDIyNjgsIDB4NjgwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDFkMCwgMHg2MDEwLAorCTB4NmQxMCwgMHg5NTJlLCAweDExYjAsIDB4MDBjNiwgMHgyZDYwLCAweDAwZDYsIDB4MDgwYywgMHhiYTQ5LAorCTB4MDBkZSwgMHgwMGNlLCAweDAxNTgsIDB4NzAyYywgMHhkMDg0LCAweDExMTgsIDB4MDgwYywgMHhiYTEzLAorCTB4MDAxMCwgMHg2ODAzLCAweDAwMDIsIDB4NjAwNywgMHgwMDg2LCAweDAwMjgsIDB4MDgwYywgMHhiYTM1LAorCTB4MGQ5MCwgMHg2MDA3LCAweDAwODcsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLAorCTB4OGMxMCwgMHg3MjIwLCAweDA4MGMsIDB4YmUyNSwgMHgwMTc4LCAweDY4MTAsIDB4MDBiNiwgMHgyMDU4LAorCTB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDE0MCwgMHg2ODI0LCAweGQwZWMsIDB4MDEyOCwgMHgwMGM2LAorCTB4MmQ2MCwgMHgwODBjLCAweGMxNzEsIDB4MDBjZSwgMHgwMGVlLCAweDAwZGUsIDB4MDA1ZSwgMHgwMDJlLAorCTB4MDAwNSwgMHg5MTg2LCAweDAwMTMsIDB4MTE2MCwgMHg2MDA0LCAweDkwOGEsIDB4MDA4NSwgMHgwYTBjLAorCTB4MGRmYSwgMHg5MDhhLCAweDAwOTIsIDB4MWEwYywgMHgwZGZhLCAweDkwODIsIDB4MDA4NSwgMHgwMGUyLAorCTB4OTE4NiwgMHgwMDI3LCAweDAxMjAsIDB4OTE4NiwgMHgwMDE0LCAweDE5MGMsIDB4MGRmYSwgMHgwODBjLAorCTB4OGIwNCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDE0MCwgMHhhODY3LAorCTB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDI5LCAweDA4MGMsIDB4NmFlOSwgMHgwMDllLAorCTB4MDgwYywgMHhhMTEzLCAweDA4MDQsIDB4OGMxMCwgMHhiODE5LCAweGI4MWIsIDB4YjgxYiwgMHhiODE5LAorCTB4YjgxOSwgMHhiODE5LCAweGI4MTksIDB4YjgxOSwgMHhiODE5LCAweGI4MTksIDB4YjgxOSwgMHhiODE5LAorCTB4YjgxOSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTExMywgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDkxODYsIDB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4OTA4MiwgMHgwMDg1LAorCTB4MjAwOCwgMHgwNGI4LCAweDkxODYsIDB4MDAyNywgMHgxMWY4LCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLAorCTB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDA5NiwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LAorCTB4MDE1MCwgMHhhODY3LCAweDAxMDMsIDB4YTg3NywgMHgwMDAwLCAweGE4N2IsIDB4MDAyOSwgMHgwODBjLAorCTB4NmFlOSwgMHgwODBjLCAweGMwMjIsIDB4MDA5ZSwgMHgwODBjLCAweGEwZTMsIDB4MDgwYywgMHg4YzEwLAorCTB4MDAwNSwgMHgwODBjLCAweGExNzgsIDB4MGNlMCwgMHg5MTg2LCAweDAwMTQsIDB4MWRkMCwgMHgwODBjLAorCTB4OGIwNCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MGQ2MCwgMHhhODY3LAorCTB4MDEwMywgMHhhODc3LCAweDAwMDAsIDB4YTg3YiwgMHgwMDA2LCAweGE4ODAsIDB4YzBlYywgMHhhODgyLAorCTB4MDhmMCwgMHgwMDAyLCAweGI4NzEsIDB4Yjg2ZiwgMHhiODZmLCAweGI4NmYsIDB4Yjg2ZiwgMHhiODZmLAorCTB4Yjg4OSwgMHhiODZmLCAweGI4NmYsIDB4Yjg2ZiwgMHhiODZmLCAweGI4NmYsIDB4Yjg2ZiwgMHgwODBjLAorCTB4MGRmYSwgMHgwODBjLCAweDhiMDQsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LAorCTB4MDAzOSwgMHgwMTE4LCAweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4MTk1ZSwgMHgwMDEwLAorCTB4MjAwMSwgMHgxOTVmLCAweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMGMsIDB4MDgwYywgMHg4YzEwLAorCTB4MDAwNSwgMHgwODBjLCAweDhiMDQsIDB4NjAzNCwgMHg5MDhjLCAweGZmMDAsIDB4ODEwZiwgMHg5MTg2LAorCTB4MDAzOSwgMHgwMTE4LCAweDkxODYsIDB4MDAzNSwgMHgxMTE4LCAweDIwMDEsIDB4MTk1ZSwgMHgwMDEwLAorCTB4MjAwMSwgMHgxOTVmLCAweDIwMDQsIDB4NjAxYSwgMHg2MDAzLCAweDAwMGUsIDB4MDgwYywgMHg4YzEwLAorCTB4MDAwNSwgMHg5MTgyLCAweDAwOTIsIDB4MTIyMCwgMHg5MTgyLCAweDAwODUsIDB4MDIwOCwgMHgwMDEyLAorCTB4MDgwNCwgMHhhMTc4LCAweGI4YjcsIDB4YjhiNywgMHhiOGI3LCAweGI4YjcsIDB4YjhiOSwgMHhiOTA2LAorCTB4YjhiNywgMHhiOGI3LCAweGI4YjcsIDB4YjhiNywgMHhiOGI3LCAweGI4YjcsIDB4YjhiNywgMHgwODBjLAorCTB4MGRmYSwgMHgwMDk2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLAorCTB4MDE2OCwgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwgMHgwMTE4LAorCTB4OTE4NiwgMHgwMDM1LCAweDExMTgsIDB4MDA5ZSwgMHgwODA0LCAweGI5MWEsIDB4MDgwYywgMHhiZTM3LAorCTB4MTExOCwgMHgwODBjLCAweGMwMjIsIDB4MDA2OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGU0LAorCTB4MTExMCwgMHgwODBjLCAweGMwMjIsIDB4YTg2NywgMHgwMTAzLCAweDA4MGMsIDB4YzUxOSwgMHgwODBjLAorCTB4NmFlOSwgMHgwMGQ2LCAweDJjNjgsIDB4MDgwYywgMHhhMDhkLCAweDAxZDAsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDFlLCAweDYwMGIsIDB4ZmZmZiwgMHgyMDA5LCAweDAyNmUsIDB4MjEwYywgMHg2MTNhLAorCTB4MjAwOSwgMHgwMjZmLCAweDIxMGMsIDB4NjEzZSwgMHg2OTEwLCAweDYxMTIsIDB4MDgwYywgMHhjMmIzLAorCTB4Njk1NCwgMHg2MTU2LCAweDYwMjMsIDB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLAorCTB4MmQ2MCwgMHgwMGRlLCAweDA4MGMsIDB4YTBlMywgMHgwMDllLCAweDAwMDUsIDB4NjAxMCwgMHgwMGI2LAorCTB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwNWEwLCAweDYwMzQsIDB4OTA4YywgMHhmZjAwLAorCTB4ODEwZiwgMHg5MTg2LCAweDAwMzUsIDB4MDEzMCwgMHg5MTg2LCAweDAwMWUsIDB4MDExOCwgMHg5MTg2LAorCTB4MDAzOSwgMHgxNTM4LCAweDAwZDYsIDB4MmM2OCwgMHgwODBjLCAweGM0YjEsIDB4MTFmMCwgMHgwODBjLAorCTB4YTA4ZCwgMHgwMWQ4LCAweDYxMDYsIDB4NjAwMywgMHgwMDAxLCAweDYwMjMsIDB4MDAwMSwgMHg2OTEwLAorCTB4NjExMiwgMHg2OTJjLCAweDYxMmUsIDB4NjkzMCwgMHg2MTMyLCAweDY5MzQsIDB4OTE4YywgMHgwMGZmLAorCTB4NjEzNiwgMHg2OTM4LCAweDYxM2EsIDB4NjkzYywgMHg2MTNlLCAweDY5NTQsIDB4NjE1NiwgMHgwODBjLAorCTB4YzJiMywgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDJkNjAsIDB4MDBkZSwgMHgwODA0LAorCTB4YTBlMywgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDFjOCwgMHhhODY3LAorCTB4MDEwMywgMHhhODgwLCAweGQwYjQsIDB4MDEyOCwgMHhjMGVjLCAweGE4ODIsIDB4YTg3YiwgMHgwMDA2LAorCTB4MDA0OCwgMHhkMGJjLCAweDAxMTgsIDB4YTg3YiwgMHgwMDAyLCAweDAwMjAsIDB4YTg3YiwgMHgwMDA1LAorCTB4MDgwYywgMHhjMTMzLCAweGE4NzcsIDB4MDAwMCwgMHgwODBjLCAweDZhZTksIDB4MDgwYywgMHhjMDIyLAorCTB4MDA5ZSwgMHgwODA0LCAweGEwZTMsIDB4MDAxNiwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLAorCTB4YmUzNywgMHgwMTQwLCAweGE4NjcsIDB4MDEwMywgMHhhODdiLCAweDAwMjgsIDB4YTg3NywgMHgwMDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDAxZSwgMHg5MTg2LCAweDAwMTMsIDB4MDE0OCwgMHg5MTg2LAorCTB4MDAxNCwgMHgwMTMwLCAweDkxODYsIDB4MDAyNywgMHgwMTE4LCAweDA4MGMsIDB4YTE3OCwgMHgwMDMwLAorCTB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTExMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwMDU2LAorCTB4MDA2NiwgMHgwMDk2LCAweDAwYTYsIDB4MjAyOSwgMHgwMDAxLCAweDkxODIsIDB4MDEwMSwgMHgxMjA4LAorCTB4MDAxMCwgMHgyMDA5LCAweDAxMDAsIDB4MjEzMCwgMHg4MzA0LCAweDkwOTgsIDB4MDAxOCwgMHgyMDA5LAorCTB4MDAyMCwgMHgyMDExLCAweDAwMjksIDB4MDgwYywgMHhiOWU4LCAweDk2YjIsIDB4MDAyMCwgMHhiMDA0LAorCTB4OTA0ZCwgMHgwMTEwLCAweDA4MGMsIDB4MGZlMywgMHgwODBjLCAweDEwMzEsIDB4MDUyMCwgMHg4NTI4LAorCTB4YTg2NywgMHgwMTEwLCAweGE4NmIsIDB4MDAwMCwgMHgyOTIwLCAweGI0MDYsIDB4OTY4YSwgMHgwMDNkLAorCTB4MTIyOCwgMHgyNjA4LCAweDIwMTEsIDB4MDAxYiwgMHgwNDk5LCAweDAwYTgsIDB4OTZiMiwgMHgwMDNjLAorCTB4MjAwOSwgMHgwMDNjLCAweDI5NTAsIDB4MjAxMSwgMHgwMDFiLCAweDA0NTEsIDB4MGMyOCwgMHgyMDAxLAorCTB4MDIwNSwgMHgyMDAzLCAweDAwMDAsIDB4MDBhZSwgMHg4NTJmLCAweDk1YWQsIDB4MDAwMywgMHhiNTY2LAorCTB4OTVhYywgMHgwMDAwLCAweDAwNDgsIDB4MjAwMSwgMHgwMjA1LCAweDIwMDMsIDB4MDAwMCwgMHgwMGFlLAorCTB4ODUyZiwgMHg5NWFkLCAweDAwMDMsIDB4YjU2NiwgMHgwMDllLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDA1LAorCTB4MDBhNiwgMHg4OWZmLCAweDAxNTgsIDB4YTgwNCwgMHg5MDU1LCAweDAxMzAsIDB4YTgwNywgMHgwMDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDJhNDgsIDB4MGNiOCwgMHgwODBjLCAweDZhZTksIDB4MDBhZSwgMHgwMDA1LAorCTB4MDBmNiwgMHgyMDc5LCAweDAyMDAsIDB4NzgxNCwgMHg5MDg1LCAweDAwODAsIDB4NzgxNiwgMHhkMTg0LAorCTB4MDEwOCwgMHg4MTA4LCAweDgxMGMsIDB4MjBhOSwgMHgwMDAxLCAweGE4NjAsIDB4MjBlOCwgMHhhODVjLAorCTB4OTIwMCwgMHgyMGEwLCAweDIwZTEsIDB4MDAwMCwgMHgyMzAwLCAweDllMDAsIDB4MjA5OCwgMHg0MDAzLAorCTB4ODMxOCwgMHg5Mzg2LCAweDAwMjAsIDB4MTE0OCwgMHgyMDE4LCAweDIzMDAsIDB4OWUwMCwgMHgyMDk4LAorCTB4NzgxNCwgMHg4MDAwLCAweDkwODUsIDB4MDA4MCwgMHg3ODE2LCAweDgxMDksIDB4MWQ4MCwgMHg3ODE3LAorCTB4MDAwMCwgMHgwMGZlLCAweDAwMDUsIDB4NjkyMCwgMHg5MTg2LCAweDAwMDMsIDB4MDExOCwgMHg5MTg2LAorCTB4MDAwMiwgMHgxMWQwLCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDJkNjAsIDB4MDA5NiwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDE1MCwgMHgyMDAxLCAweDAwMDYsIDB4YTk4MCwgMHhjMWQ1LAorCTB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4NmFkYywgMHgwODBjLCAweGMwMjIsIDB4MDA5ZSwgMHgwODBjLAorCTB4YTExMywgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwYzYsIDB4NzAyYywgMHhkMDg0LAorCTB4MTE3MCwgMHg2MDA4LCAweDIwNjAsIDB4NjAyMCwgMHg5MDg2LCAweDAwMDIsIDB4MTE0MCwgMHg2MTA0LAorCTB4OTE4NiwgMHgwMDg1LCAweDAxMTgsIDB4OTE4NiwgMHgwMDhiLCAweDExMDgsIDB4OTAwNiwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMDY2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMzEsIDB4MDAwMSwgMHg2MDIwLAorCTB4OTA4NCwgMHgwMDBmLCAweDAwODMsIDB4MDEyZSwgMHgwMDZlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwMDY2LCAweDIwMzEsIDB4MDAwMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDFiLAorCTB4MDA2ZSwgMHgwMTJlLCAweDAwMDUsIDB4YmE4NCwgMHhiYTg0LCAweGJhN2YsIDB4YmFhNiwgMHhiYTcyLAorCTB4YmE3ZiwgMHhiYWE2LCAweGJhN2YsIDB4YmE3MiwgMHhiYTcyLCAweGJhN2YsIDB4YmE3ZiwgMHhiYTdmLAorCTB4YmE3MiwgMHhiYTcyLCAweDA4MGMsIDB4MGRmYSwgMHgwMDM2LCAweDIwMTksIDB4MDAxMCwgMHgwODBjLAorCTB4ZDQ0MCwgMHg2MDIzLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwgMHg5MDA2LAorCTB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDk2LCAweDg2ZmYsIDB4MTFkOCwgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDFjMCwgMHhhODY0LCAweDkwODYsIDB4MDEzOSwgMHgxMTI4LAorCTB4YTg3YiwgMHgwMDA1LCAweGE4ODMsIDB4MDAwMCwgMHgwMDI4LCAweDkwMGUsIDB4MjAwMSwgMHgwMDA1LAorCTB4MDgwYywgMHg2ZDE3LCAweDA4MGMsIDB4YzEzMywgMHgwODBjLCAweDZhZGMsIDB4MDgwYywgMHhhMTEzLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwOWUsIDB4MDAwNSwgMHg5MDA2LCAweDBjZTAsIDB4NjAwMCwgMHg5MDhhLAorCTB4MDAxNiwgMHgxYTBjLCAweDBkZmEsIDB4MDAwMiwgMHhiYWJjLCAweGJhZWMsIDB4YmFiZSwgMHhiYjBkLAorCTB4YmFlNywgMHhiYWJjLCAweGJhN2YsIDB4YmE4NCwgMHhiYTg0LCAweGJhN2YsIDB4YmE3ZiwgMHhiYTdmLAorCTB4YmE3ZiwgMHhiYTdmLCAweGJhN2YsIDB4YmE3ZiwgMHgwODBjLCAweDBkZmEsIDB4ODZmZiwgMHgxNTIwLAorCTB4NjAyMCwgMHg5MDg2LCAweDAwMDYsIDB4MDUwMCwgMHgwMDk2LCAweDYwMTQsIDB4MjA0OCwgMHgwODBjLAorCTB4YmUzNywgMHgwMTY4LCAweGE4N2MsIDB4ZDBjYywgMHgwMTQwLCAweDAwOTYsIDB4YzBjYywgMHhhODdlLAorCTB4YTg3OCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZlMywgMHgwMDllLCAweDA4MGMsIDB4YzEzMywgMHgwMDllLAorCTB4MDgwYywgMHhjNGYzLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDAyLAorCTB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDY2LAorCTB4MDgwYywgMHgxOWI0LCAweDAwNmUsIDB4MDg5MCwgMHgwMGU2LCAweDIwNzEsIDB4MTliZiwgMHg3MDI0LAorCTB4OWMwNiwgMHgxMTIwLCAweDA4MGMsIDB4OTkyNywgMHgwMGVlLCAweDA4NDAsIDB4NjAyMCwgMHg5MDg0LAorCTB4MDAwZiwgMHg5MDg2LCAweDAwMDYsIDB4MTE1MCwgMHgwMDg2LCAweDAwOTYsIDB4MjA0OSwgMHgwMDAxLAorCTB4MmM0MCwgMHgwODBjLCAweDlhNTgsIDB4MDA5ZSwgMHgwMDhlLCAweDAwMTAsIDB4MDgwYywgMHg5ODI0LAorCTB4MDBlZSwgMHgxOTA0LCAweGJhYmUsIDB4MDgwNCwgMHhiYTdmLCAweDAwMzYsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTliZiwgMHg3MDNjLCAweDljMDYsIDB4MTEzOCwgMHg5MDFlLCAweDA4MGMsIDB4OTk5ZCwgMHgwMGVlLAorCTB4MDAzZSwgMHgwODA0LCAweGJhYmUsIDB4MDgwYywgMHg5Yjg4LCAweDAwZWUsIDB4MDAzZSwgMHgxOTA0LAorCTB4YmFiZSwgMHgwODA0LCAweGJhN2YsIDB4MDBjNiwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDEzLAorCTB4MDBjZSwgMHgwMDA1LCAweGJiNDAsIDB4YmMwYiwgMHhiZDc1LCAweGJiNGEsIDB4YTExMywgMHhiYjQwLAorCTB4ZDQzMiwgMHhjNTViLCAweGJjMGIsIDB4YmIzOSwgMHhiZTAxLCAweGJiMzksIDB4YmIzOSwgMHhiYjM5LAorCTB4YmIzOSwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHhjMDNmLCAweDExMTAsIDB4MDgwYywgMHhhYTgxLAorCTB4MDAwNSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4YTBlMywgMHg2MDFiLAorCTB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4YmUzNywgMHgwMTMwLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LAorCTB4MmMwMCwgMHhhODk2LCAweDAwOWUsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZGZhLAorCTB4MDAwMiwgMHhiYjY5LCAweGJiNmIsIDB4YmI4ZiwgMHhiYmEzLCAweGJiYzksIDB4YmI2OSwgMHhiYjQwLAorCTB4YmI0MCwgMHhiYjQwLCAweGJiYTMsIDB4YmJhMywgMHhiYjY5LCAweGJiNjksIDB4YmI2OSwgMHhiYjY5LAorCTB4YmJhZCwgMHgwODBjLCAweDBkZmEsIDB4MDBlNiwgMHg2MDE0LCAweDAwOTYsIDB4MjA0OCwgMHhhODgwLAorCTB4YzBiNSwgMHhhODgyLCAweDAwOWUsIDB4MjA3MSwgMHgxOWJmLCAweDcwMjQsIDB4OWMwNiwgMHgwMWEwLAorCTB4MDgwYywgMHg5ODI0LCAweDA4MGMsIDB4YzRmMywgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLAorCTB4NjAyMywgMHgwMDAyLCAweDIwMDEsIDB4MTk1ZiwgMHgyMDA0LCAweDYwMWEsIDB4MDgwYywgMHg4Njc5LAorCTB4MDgwYywgMHg4YzEwLCAweDAwZWUsIDB4MDAwNSwgMHg2MDFiLCAweDAwMDEsIDB4MGNkOCwgMHgwMDk2LAorCTB4NjAxNCwgMHgyMDQ4LCAweGE4ODAsIDB4YzBiNSwgMHhhODgyLCAweDAwOWUsIDB4MDgwYywgMHhjNGYzLAorCTB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDIzLCAweDAwMDIsIDB4MDgwYywgMHg4Njc5LAorCTB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDA5NiwgMHg2MDFiLCAweDAwMDEsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTg4MCwgMHhjMGI1LCAweGE4ODIsIDB4MDA5ZSwgMHgwMDA1LCAweDA4MGMsIDB4NTVlMywgMHgwMWI4LAorCTB4NjAxNCwgMHgwMDk2LCAweDkwNGQsIDB4MDE5MCwgMHhhODY0LCAweGE4NjcsIDB4MDEwMywgMHhhODdiLAorCTB4MDAwNiwgMHg5MDg2LCAweDAxMzksIDB4MTE1MCwgMHhhODY3LCAweDAxMzksIDB4YTg3YiwgMHgwMDMwLAorCTB4YTg5NywgMHg0MDA1LCAweGE4OWIsIDB4MDAwNCwgMHgwODBjLCAweDZhZTksIDB4MDA5ZSwgMHgwODA0LAorCTB4YTBlMywgMHg2MDE0LCAweDAwOTYsIDB4OTA0ZCwgMHgwNWM4LCAweGE5N2MsIDB4ZDFlNCwgMHgwNWIwLAorCTB4MjAwMSwgMHgxODBmLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTEwLCAweDAwOWUsIDB4MDAwNSwgMHhhODg0LAorCTB4MDA5ZSwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHg5MTA4LCAweDYxMWEsIDB4MjAwMSwgMHgwMDMwLAorCTB4MmMwOCwgMHgwODBjLCAweDE1OGIsIDB4MjAwMSwgMHgwMzBjLCAweDIwMDQsIDB4OTA4NiwgMHgwMDQxLAorCTB4MTFhMCwgMHg2MDE0LCAweDAwOTYsIDB4OTA0ZCwgMHgwOTBjLCAweDBkZmEsIDB4YTg4MCwgMHhkMGY0LAorCTB4MTEzMCwgMHhjMGY1LCAweGE4ODIsIDB4MDA5ZSwgMHg2MDFiLCAweDAwMDIsIDB4MDA3MCwgMHgwMDllLAorCTB4MjAwMSwgMHgwMDM3LCAweDJjMDgsIDB4MDgwYywgMHgxNThiLCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LAorCTB4MTEyMCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHhhMTVkLCAweDAwMDUsIDB4MDA5ZSwgMHgwODBjLAorCTB4MTliNCwgMHgwODA0LCAweGJiOGYsIDB4NjAwMCwgMHg5MDhhLCAweDAwMTYsIDB4MWEwYywgMHgwZGZhLAorCTB4MDAwYiwgMHgwMDA1LCAweGJjMjIsIDB4YmI0NywgMHhiYzI0LCAweGJjMjIsIDB4YmMyNCwgMHhiYzI0LAorCTB4YmI0MSwgMHhiYzIyLCAweGJiM2IsIDB4YmIzYiwgMHhiYzIyLCAweGJjMjIsIDB4YmMyMiwgMHhiYzIyLAorCTB4YmMyMiwgMHhiYzIyLCAweDA4MGMsIDB4MGRmYSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODA0LAorCTB4OTA4NCwgMHgwMGZmLCAweDAwYmUsIDB4OTA4YSwgMHgwMDBjLCAweDFhMGMsIDB4MGRmYSwgMHgwMGI2LAorCTB4MDAxMywgMHgwMGJlLCAweDAwMDUsIDB4YmMzZiwgMHhiZDBjLCAweGJjNDEsIDB4YmM4MSwgMHhiYzQxLAorCTB4YmM4MSwgMHhiYzQxLCAweGJjNGYsIDB4YmMzZiwgMHhiYzgxLCAweGJjM2YsIDB4YmM3MCwgMHgwODBjLAorCTB4MGRmYSwgMHg2MDA0LCAweDkwOGUsIDB4MDAxNiwgMHgwNWMwLCAweDkwOGUsIDB4MDAwNCwgMHgwNWE4LAorCTB4OTA4ZSwgMHgwMDAyLCAweDA1OTAsIDB4OTA4ZSwgMHgwMDUyLCAweDA5MDQsIDB4YmQwOCwgMHg2MDA0LAorCTB4MDgwYywgMHhjMDNmLCAweDA5MDQsIDB4YmQyNSwgMHg5MDhlLCAweDAwMDQsIDB4MTExMCwgMHgwODBjLAorCTB4MzFiNCwgMHg5MDhlLCAweDAwMjEsIDB4MDkwNCwgMHhiZDI5LCAweDkwOGUsIDB4MDAyMiwgMHgwOTA0LAorCTB4YmQ3MCwgMHg5MDhlLCAweDAwM2QsIDB4MDkwNCwgMHhiZDI5LCAweDkwOGUsIDB4MDAzOSwgMHgwOTA0LAorCTB4YmQyZCwgMHg5MDhlLCAweDAwMzUsIDB4MDkwNCwgMHhiZDJkLCAweDkwOGUsIDB4MDAxZSwgMHgwMTc4LAorCTB4OTA4ZSwgMHgwMDAxLCAweDExNDAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDA2LCAweDAxMTAsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YWE4MSwgMHgwODA0LAorCTB4YTExMywgMHgwMGM2LCAweDAwZDYsIDB4NjEwNCwgMHg5MTg2LCAweDAwMTYsIDB4MDkwNCwgMHhiY2Y5LAorCTB4OTE4NiwgMHgwMDAyLCAweDE5MDQsIDB4YmNjZSwgMHgyMDAxLCAweDE4MzYsIDB4MjAwNCwgMHhkMDhjLAorCTB4MTFjOCwgMHgwODBjLCAweDcyMDcsIDB4MTFiMCwgMHgwODBjLCAweGM1MzksIDB4MDEzOCwgMHgwODBjLAorCTB4NzIyYSwgMHgxMTIwLCAweDA4MGMsIDB4NzEwNSwgMHgwODA0LCAweGJkNTksIDB4MjAwMSwgMHgxOTU1LAorCTB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4MTgwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg3MTI3LAorCTB4MDgwNCwgMHhiZDU5LCAweDYwMTAsIDB4MjA1OCwgMHgyMDAxLCAweDE4MzYsIDB4MjAwNCwgMHhkMGFjLAorCTB4MTkwNCwgMHhiZDU5LCAweGI4YTAsIDB4OTA4NCwgMHhmZjgwLCAweDE5MDQsIDB4YmQ1OSwgMHhiODQwLAorCTB4OTA4NCwgMHgwMGZmLCAweDkwMDUsIDB4MDE5MCwgMHg4MDAxLCAweGI4NDIsIDB4NjAxNywgMHgwMDAwLAorCTB4NjAyMywgMHgwMDA3LCAweDYwMWIsIDB4MDM5OCwgMHg2MDQzLCAweDAwMDAsIDB4MDgwYywgMHhhMDhkLAorCTB4MDEyOCwgMHgyYjAwLCAweDYwMTIsIDB4NjAyMywgMHgwMDAxLCAweDA0NTgsIDB4MDBkZSwgMHgwMGNlLAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMDIsIDB4MTFhMCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MDg2LAorCTB4MDA3ZSwgMHgxMTcwLCAweDIwMDksIDB4MTgzNiwgMHgyMTA0LCAweGMwODUsIDB4MjAwYSwgMHgwMGU2LAorCTB4MjA3MSwgMHgxODAwLCAweDA4MGMsIDB4NWViZSwgMHgwMGVlLCAweDA4MGMsIDB4YWE4MSwgMHgwMDMwLAorCTB4MDgwYywgMHhhYTgxLCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGM1NGUsIDB4MDBlNiwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MzFiNCwgMHgwMTJlLCAweDAwZWUsIDB4MDgwYywgMHhhMTEzLAorCTB4MDAwNSwgMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg2M2YwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMiwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwZGUsIDB4MDBjZSwgMHgwYzgwLAorCTB4MDgwYywgMHgzMWI0LCAweDA4MDQsIDB4YmM3ZCwgMHgwMGM2LCAweDAwZDYsIDB4NjEwNCwgMHg5MTg2LAorCTB4MDAxNiwgMHgwZDM4LCAweDYwMTAsIDB4MjA1OCwgMHhiODQwLCAweDkwODQsIDB4MDBmZiwgMHg5MDA1LAorCTB4MDkwNCwgMHhiY2NlLCAweDgwMDEsIDB4Yjg0MiwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4NmMxLAorCTB4MDgwYywgMHg4YzEwLCAweDAwZGUsIDB4MDBjZSwgMHgwODk4LCAweDA4MGMsIDB4YWE4MSwgMHgwODA0LAorCTB4YmM3ZiwgMHgwODBjLCAweGFhYmQsIDB4MDgwNCwgMHhiYzdmLCAweDAwZDYsIDB4MmM2OCwgMHg2MTA0LAorCTB4MDgwYywgMHhjNGIxLCAweDAwZGUsIDB4MDExOCwgMHgwODBjLCAweGEwZTMsIDB4MDQwOCwgMHg2MDA0LAorCTB4ODAwNywgMHg2MTM0LCAweDkxOGMsIDB4MDBmZiwgMHg5MTA1LCAweDYwMzYsIDB4NjAwNywgMHgwMDg1LAorCTB4NjAwMywgMHgwMDBiLCAweDYwMjMsIDB4MDAwMiwgMHg2MDNjLCAweDYwMGEsIDB4MjAwMSwgMHgxOTVmLAorCTB4MjAwNCwgMHg2MDFhLCAweDYwMmMsIDB4MmMwOCwgMHgyMDYwLCAweDYwMjQsIDB4ZDBiNCwgMHgwMTA4LAorCTB4YzA4NSwgMHhjMGI1LCAweDYwMjYsIDB4MjE2MCwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLAorCTB4MDAwNSwgMHgwMGRlLCAweDAwY2UsIDB4MDgwYywgMHhhYTgxLCAweDA4MGMsIDB4MzE4YiwgMHgwMGU2LAorCTB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHgzMWI0LCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLAorCTB4MDAwNywgMHg2MDFiLCAweDAzOTgsIDB4NjA0MywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LAorCTB4MDgwYywgMHhhNTEzLCAweDE5MDQsIDB4YmQyNSwgMHgwMDA1LCAweDYwMDAsIDB4OTA4YSwgMHgwMDE2LAorCTB4MWEwYywgMHgwZGZhLCAweDAwOTYsIDB4MDBkNiwgMHgwMDFiLCAweDAwZGUsIDB4MDA5ZSwgMHgwMDA1LAorCTB4YmQ5MCwgMHhiZDkwLCAweGJkOTAsIDB4YmQ5MCwgMHhiZDkwLCAweGJkOTAsIDB4YmQ5MCwgMHhiZDkwLAorCTB4YmQ5MCwgMHhiYjQwLCAweGJkOTAsIDB4YmI0NywgMHhiZDkyLCAweGJiNDcsIDB4YmRhYywgMHhiZDkwLAorCTB4MDgwYywgMHgwZGZhLCAweDYwMDQsIDB4OTA4NiwgMHgwMDhiLCAweDAxYjAsIDB4NjAzNCwgMHg5MDhjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzNSwgMHgxMTMwLCAweDYwMmMsIDB4OTA4MCwgMHgwMDA5LAorCTB4MjAwYywgMHhjMTg1LCAweDIxMDIsIDB4NjAwNywgMHgwMDhiLCAweDYwMDMsIDB4MDAwZCwgMHgwODBjLAorCTB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwODBjLCAweGM1MmQsIDB4MDExOCwgMHgwODBjLAorCTB4YzU0MCwgMHgwMDEwLCAweDA4MGMsIDB4YzU0ZSwgMHgwODBjLCAweGMwMjIsIDB4MDgwYywgMHhiZTM3LAorCTB4MDU3MCwgMHgwODBjLCAweDMxOGIsIDB4MDgwYywgMHhiZTM3LCAweDAxNjgsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTg2NywgMHgwMTAzLCAweGE4N2IsIDB4MDAwNiwgMHhhODc3LCAweDAwMDAsIDB4YTg4MCwgMHhjMGVkLAorCTB4YTg4MiwgMHgwODBjLCAweDZhZTksIDB4MmM2OCwgMHgwODBjLCAweGEwOGQsIDB4MDE1MCwgMHg2ODEwLAorCTB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4YTExMywgMHgwMGNlLAorCTB4MDAwOCwgMHgyZDYwLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDBjOCwgMHgwODBjLAorCTB4YzUyZCwgMHgwMTM4LCAweDYwMzQsIDB4OTA4NiwgMHg0MDAwLCAweDExMTgsIDB4MDgwYywgMHgzMThiLAorCTB4MDhkMCwgMHg2MDM0LCAweDkwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAzOSwgMHgwMTE4LAorCTB4OTE4NiwgMHgwMDM1LCAweDExMTgsIDB4MDgwYywgMHgzMThiLCAweDA4NjgsIDB4MDgwYywgMHhhMTEzLAorCTB4MDAwNSwgMHg2MDAwLCAweDkwOGEsIDB4MDAxNiwgMHgxYTBjLCAweDBkZmEsIDB4MDAwMiwgMHhiZTE3LAorCTB4YmUxNywgMHhiZTE5LCAweGJlMTksIDB4YmUxOSwgMHhiZTE3LCAweGJlMTcsIDB4YTExMywgMHhiZTE3LAorCTB4YmUxNywgMHhiZTE3LCAweGJlMTcsIDB4YmUxNywgMHhiZTE3LCAweGJlMTcsIDB4YmUxNywgMHgwODBjLAorCTB4MGRmYSwgMHgwODBjLCAweDliODgsIDB4NjExNCwgMHgwMDk2LCAweDIxNDgsIDB4YTg3YiwgMHgwMDA2LAorCTB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDgwNCwgMHhhMGUzLCAweDkyODQsIDB4MDAwNywgMHgxMTU4LAorCTB4OTI4MiwgMHgxY2QwLCAweDAyNDAsIDB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OTIwMiwgMHgxMjE4LAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4OTAwNiwgMHgwY2U4LCAweDAwOTYsIDB4MDAyOCwgMHgwMDk2LAorCTB4MDAwNiwgMHg2MDE0LCAweDIwNDgsIDB4MDAwZSwgMHgwMDA2LCAweDk5ODQsIDB4ZjAwMCwgMHg5MDg2LAorCTB4ZjAwMCwgMHgwMTEwLCAweDA4MGMsIDB4MTBkYywgMHgwMDBlLCAweDAwOWUsIDB4MDAwNSwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDM2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHgxY2QwLAorCTB4MjA3MSwgMHgxODAwLCAweDczNTAsIDB4NzA3MCwgMHg5MzAyLCAweDE2NDAsIDB4NjAyMCwgMHg5MjA2LAorCTB4MTFmOCwgMHgwODBjLCAweGM1MzksIDB4MDE4MCwgMHg5Mjg2LCAweDAwMDEsIDB4MTE2OCwgMHg2MDA0LAorCTB4OTA4NiwgMHgwMDA0LCAweDExNDgsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHgwMGM2LAorCTB4MDgwYywgMHhhMTEzLCAweDAwY2UsIDB4MDA2MCwgMHgwODBjLCAweGMyMmQsIDB4MDE0OCwgMHgwODBjLAorCTB4YzAzZiwgMHgxMTEwLCAweDA4MGMsIDB4YWE4MSwgMHgwMGM2LCAweDA4MGMsIDB4YTBlMywgMHgwMGNlLAorCTB4OWNlMCwgMHgwMDE4LCAweDcwNjQsIDB4OWMwMiwgMHgxMjA4LCAweDA4YTAsIDB4MDEyZSwgMHgwMDBlLAorCTB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MDAxNiwgMHg5MTg4LAorCTB4MTAwMCwgMHgyMTBjLCAweDgxZmYsIDB4MDEyOCwgMHgyMDYxLCAweDFhOGEsIDB4NjExMiwgMHgwODBjLAorCTB4MzE4YiwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTA4ZCwgMHgwMWIwLAorCTB4NjY1NiwgMHgyYjAwLCAweDYwMTIsIDB4MDgwYywgMHg1NWUzLCAweDAxMTgsIDB4MDgwYywgMHhiZjY2LAorCTB4MDE2OCwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAzLCAweDIwMDksIDB4MDA0YiwgMHgwODBjLAorCTB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LAorCTB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhiYWEwLCAweDA4MGMsIDB4YTEzMCwgMHgwNTYwLAorCTB4NjA1NywgMHgwMDAwLCAweDJiMDAsIDB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4NjAyMywgMHgwMDAzLAorCTB4MDAxNiwgMHgwODBjLCAweDg4MDMsIDB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4ODZmMSwgMHgyYzA4LAorCTB4MDgwYywgMHhkNWY2LCAweDAwN2UsIDB4MDAxZSwgMHhkMTg0LCAweDAxMjgsIDB4MDgwYywgMHhhMGUzLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwNzAsIDB4MDgwYywgMHg1NWUzLCAweDAxMjgsIDB4ZDE4YywgMHgxMTcwLAorCTB4MDgwYywgMHhiZjY2LCAweDAxNDgsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MjkwMCwgMHg2MDE2LAorCTB4MGM5MCwgMHgyMDA5LCAweDAwNGQsIDB4MDAxMCwgMHgyMDA5LCAweDAwNGUsIDB4MDBmNiwgMHgwMGM2LAorCTB4MDA0NiwgMHgwMDE2LCAweDA4MGMsIDB4YTA4ZCwgMHgyYzc4LCAweDA1YTAsIDB4N2U1NiwgMHgyYjAwLAorCTB4NzgxMiwgMHg3ODIzLCAweDAwMDMsIDB4MDAxNiwgMHgyMDIxLCAweDAwMDUsIDB4MDgwYywgMHhiZjc4LAorCTB4MDAxZSwgMHg5MTg2LCAweDAwNGQsIDB4MDExOCwgMHg5MTg2LCAweDAwNGUsIDB4MDE0OCwgMHgyMDAxLAorCTB4MTk1OCwgMHgyMDBjLCAweGQxZmMsIDB4MDE2OCwgMHgyZjYwLCAweDA4MGMsIDB4YTBlMywgMHgwMGQwLAorCTB4MjAwMSwgMHgxOTU3LCAweDIwMGMsIDB4ZDFmYywgMHgwMTIwLCAweDJmNjAsIDB4MDgwYywgMHhhMGUzLAorCTB4MDA4OCwgMHgyZjYwLCAweDA4MGMsIDB4NTVlMywgMHgwMTM4LCAweGQxOGMsIDB4MTExOCwgMHgwNGYxLAorCTB4MDE0OCwgMHgwMDEwLCAweDI5MDAsIDB4NzgxNiwgMHgwMDFlLCAweDAwMTYsIDB4MDgwYywgMHhhMTVkLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDA0ZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LAorCTB4MDBjNiwgMHgwMDQ2LCAweDA4MGMsIDB4YTA4ZCwgMHgyYzc4LCAweDA1MDgsIDB4N2U1NiwgMHgyYjAwLAorCTB4NzgxMiwgMHg3ODIzLCAweDAwMDMsIDB4MDA5NiwgMHgyMDIxLCAweDAwMDQsIDB4MDQ4OSwgMHgwMDllLAorCTB4MjAwMSwgMHgxOTU2LCAweDIwMGMsIDB4ZDFmYywgMHgwMTIwLCAweDJmNjAsIDB4MDgwYywgMHhhMGUzLAorCTB4MDA2MCwgMHgyZjYwLCAweDA4MGMsIDB4NTVlMywgMHgwMTIwLCAweGQxOGMsIDB4MTE2MCwgMHgwMDcxLAorCTB4MDEzMCwgMHgyMDA5LCAweDAwNTIsIDB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwgMHgwMDRlLAorCTB4MDBjZSwgMHgwMGZlLCAweDAwMDUsIDB4MjkwMCwgMHg3ODE2LCAweDBjOTgsIDB4MDBjNiwgMHgwODBjLAorCTB4NGFiZiwgMHgwMGNlLCAweDExMjAsIDB4MDgwYywgMHhhMGUzLCAweDkwMDYsIDB4MDAwNSwgMHhhODY3LAorCTB4MDAwMCwgMHhhODZiLCAweDgwMDAsIDB4MjkwMCwgMHg2MDE2LCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MDA5NiwgMHgwMDc2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NjVkMywgMHgwMTU4LAorCTB4MjAwMSwgMHhiZjdkLCAweDAwMDYsIDB4OTAwZSwgMHgyNDAwLCAweDA4MGMsIDB4NmQxNywgMHgwODBjLAorCTB4NmFlOSwgMHgwMDBlLCAweDA4MDcsIDB4MjQxOCwgMHgwODBjLCAweDhhOWUsIDB4YmFhMCwgMHgwMDg2LAorCTB4MjA0MSwgMHgwMDAxLCAweDIwMzksIDB4MDAwMSwgMHgyNjA4LCAweDA4MGMsIDB4ODgxYiwgMHgwMDhlLAorCTB4MDgwYywgMHg4NmYxLCAweDJmMDgsIDB4MjY0OCwgMHgwODBjLCAweGQ1ZjYsIDB4YjkzYywgMHg4MWZmLAorCTB4MDkwYywgMHg4OGVlLCAweDA4MGMsIDB4OGMxMCwgMHgwMTJlLCAweDAwN2UsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweGEwOGQsIDB4MDE5MCwgMHg2NjBhLAorCTB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwgMHg2MDE2LAorCTB4MjAwOSwgMHgwMDFmLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4YTEzMCwgMHgwMWI4LCAweDY2MGEsIDB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLAorCTB4MDAwOCwgMHgyOTAwLCAweDYwMTYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTZkYiwgMHgwMGZlLAorCTB4MjAwOSwgMHgwMDIxLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLAorCTB4MDAwNSwgMHg5MDA2LCAweDBjZDgsIDB4MjAwOSwgMHgwMDNkLCAweDAwYzYsIDB4MDEyNiwgMHgwMDE2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTA4ZCwgMHgwMTk4LCAweDY2MGEsIDB4MmIwOCwgMHg2MTEyLAorCTB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLCAweDYwMTYsIDB4MDAxZSwgMHgwMDE2LAorCTB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LAorCTB4OTAwNiwgMHgwY2QwLCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhMTMwLAorCTB4MDE4OCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLAorCTB4NjAxNiwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgyMDA5LCAweDAwNDQsIDB4MDgzMCwgMHgyMDA5LAorCTB4MDA0OSwgMHgwODE4LCAweDAwMjYsIDB4MDBiNiwgMHg2MjEwLCAweDIyNTgsIDB4YmEzYywgMHg4MmZmLAorCTB4MDExMCwgMHg4MjExLCAweGJhM2UsIDB4MDBiZSwgMHgwMDJlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LAorCTB4NjAwNCwgMHg5MDhlLCAweDAwMDIsIDB4MDE0MCwgMHg5MDhlLCAweDAwMDMsIDB4MDEyOCwgMHg5MDhlLAorCTB4MDAwNCwgMHgwMTEwLCAweDkwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LAorCTB4MDA4NiwgMHgwMDk2LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA0LCAweDAxYTgsIDB4NjAxNCwgMHg5MDRkLAorCTB4MDgwYywgMHhiZTM3LCAweDAxODAsIDB4YTg2NCwgMHg5MDg2LCAweDAxMzksIDB4MDE3MCwgMHg2MDIwLAorCTB4OTBjNiwgMHgwMDAzLCAweDAxNDAsIDB4OTBjNiwgMHgwMDAyLCAweDAxMjgsIDB4YTg2OCwgMHhkMGZjLAorCTB4MDExMCwgMHg5MDA2LCAweDAwMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwOWUsIDB4MDA4ZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4YTEzMCwgMHgwMTk4LAorCTB4MmIwOCwgMHg2MTEyLCAweDA4MGMsIDB4YzJiMywgMHg2MDIzLCAweDAwMDEsIDB4MjkwMCwgMHg2MDE2LAorCTB4MDgwYywgMHgzMThiLCAweDIwMDksIDB4MDAyOCwgMHgwODBjLCAweGExNWQsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDkxODYsIDB4MDAxNSwgMHgxMWE4LAorCTB4MjAxMSwgMHgxODIzLCAweDIyMDQsIDB4OTA4NiwgMHgwMDc0LCAweDExNzgsIDB4MDBiNiwgMHgwODBjLAorCTB4YWQwYywgMHgwMGJlLCAweDA4MGMsIDB4YWY0YiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDI5LAorCTB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHgwMDc4LCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTg2OCwgMHgwMDllLCAweGQwZmMsIDB4MDE0OCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHhjNDcyLAorCTB4MDgwYywgMHhhYTgxLCAweDA4MGMsIDB4YTBlMywgMHgwMDA1LCAweDAwOTYsIDB4NjAxNCwgMHg5MDRkLAorCTB4MDkwYywgMHgwZGZhLCAweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDA1LAorCTB4YTg5YiwgMHgwMDA0LCAweGE4NjcsIDB4MDEzOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NmFlOSwgMHgwMTJlLCAweDAwOWUsIDB4MDgwYywgMHhhMGUzLCAweDBjMzAsIDB4MDA5NiwgMHg5MTg2LAorCTB4MDAxNiwgMHgxMTI4LCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDYzZjAsIDB4MDBlOCwgMHg5MTg2LAorCTB4MDAxNSwgMHgxNTEwLCAweDIwMTEsIDB4MTgyMywgMHgyMjA0LCAweDkwODYsIDB4MDAxNCwgMHgxMWUwLAorCTB4NjAxMCwgMHgwMGI2LCAweDIwNTgsIDB4MDgwYywgMHg2NTNhLCAweDAwYmUsIDB4MDgwYywgMHhiMDFjLAorCTB4MTE5OCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODkwLCAweDAwYmUsIDB4OTAwNSwgMHgwMTYwLAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjNmMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhkMGZjLAorCTB4MDE3MCwgMHgwODBjLCAweGE0ZTcsIDB4MDA0OCwgMHg2MDE0LCAweDIwNDgsIDB4YTg2OCwgMHhkMGZjLAorCTB4MDUyOCwgMHgwODBjLCAweGFhODEsIDB4MDgwYywgMHhhMGUzLCAweDAwOWUsIDB4MDAwNSwgMHg2MDE0LAorCTB4NjMxMCwgMHgyMzU4LCAweDkwNGQsIDB4MDkwYywgMHgwZGZhLCAweGE4N2IsIDB4MDAwMCwgMHhhODgzLAorCTB4MDAwMCwgMHhhODk3LCAweDQwMDAsIDB4OTAwZSwgMHgwODBjLCAweDY2YmYsIDB4MTEwOCwgMHhjMTg1LAorCTB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHhhOTlhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDgwYywgMHhhMGUzLCAweDA4ZjgsIDB4NjAxNCwgMHg5MDRkLAorCTB4MDkwYywgMHgwZGZhLCAweGE4N2IsIDB4MDAzMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDA1LAorCTB4YTg5YiwgMHgwMDA0LCAweGE4NjcsIDB4MDEzOSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLAorCTB4NmFlOSwgMHgwMTJlLCAweDA4MGMsIDB4YTBlMywgMHgwODQwLCAweGE4NzgsIDB4OTA4NiwgMHgwMDA1LAorCTB4MTEwOCwgMHgwMDA5LCAweDAwMDUsIDB4YTg4MCwgMHhjMGFkLCAweGE4ODIsIDB4MDAwNSwgMHg2MDQzLAorCTB4MDAwMCwgMHg2MDE3LCAweDAwMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA1MCwgMHgwODBjLAorCTB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwMGM2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LAorCTB4YjgwMCwgMHgwMGJlLCAweGQwYmMsIDB4MDEyMCwgMHg2MDIwLCAweDkwODQsIDB4MDAwZiwgMHgwMDEzLAorCTB4MDBjZSwgMHgwMDA1LCAweGJiNDAsIDB4YzE2MywgMHhjMTYzLCAweGMxNjYsIDB4ZDhkNCwgMHhkOGVmLAorCTB4ZDhmMiwgMHhiYjQwLCAweGJiNDAsIDB4YmI0MCwgMHhiYjQwLCAweGJiNDAsIDB4YmI0MCwgMHhiYjQwLAorCTB4YmI0MCwgMHgwODBjLCAweDBkZmEsIDB4YTAwMSwgMHhhMDAxLCAweDAwMDUsIDB4MDA5NiwgMHg2MDE0LAorCTB4OTA0ZCwgMHgwMTE4LCAweGE4N2MsIDB4ZDBlNCwgMHgxMTEwLCAweDAwOWUsIDB4MDAxMCwgMHgwMDllLAorCTB4MDAwNSwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwNTUwLAorCTB4MjAwMSwgMHgxODMzLCAweDIwMDQsIDB4OTAwNSwgMHgxNTQwLCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLAorCTB4YTA4ZCwgMHgwNTA4LCAweDc4MTAsIDB4NjAxMiwgMHgwODBjLCAweGMyYjMsIDB4NzgyMCwgMHg5MDg2LAorCTB4MDAwMywgMHgwMTI4LCAweDc4MDgsIDB4NjAzYSwgMHgyZjAwLCAweDYwM2UsIDB4MDAyMCwgMHg3ODA4LAorCTB4NjAzZSwgMHgyZjAwLCAweDYwM2EsIDB4NjAyZSwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDM1LAorCTB4NjAwMywgMHgwMDAxLCAweDc5NTQsIDB4NjE1NiwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLAorCTB4MmY2MCwgMHgwMGZlLCAweDAwMDUsIDB4MmY2MCwgMHgwMGZlLCAweDIwMDEsIDB4MTk2MCwgMHgyMDA0LAorCTB4NjA0MiwgMHgwMDA1LCAweDAwMTYsIDB4MDA5NiwgMHg2ODE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGU0LAorCTB4MDE4MCwgMHhjMGU0LCAweGE4N2UsIDB4YTg3NywgMHgwMDAwLCAweGE4OTMsIDB4MDAwMCwgMHhhODhmLAorCTB4MDAwMCwgMHhkMGNjLCAweDAxMzAsIDB4YzBjYywgMHhhODdlLCAweGE4NzgsIDB4MjA0OCwgMHgwODBjLAorCTB4MGZlMywgMHg2ODMwLCAweDYwMzYsIDB4OTA4ZSwgMHgwMDAxLCAweDAxNDgsIDB4NjgwMywgMHgwMDAyLAorCTB4OTA4NiwgMHgwMDA1LCAweDAxNzAsIDB4OTAwNiwgMHg2MDJlLCAweDYwMzIsIDB4MDBkMCwgMHg2ODFjLAorCTB4YzA4NSwgMHg2ODFlLCAweDY4MDMsIDB4MDAwNCwgMHg2ODI0LCAweGMwZjQsIDB4OTA4NSwgMHgwYzAwLAorCTB4NjgyNiwgMHg2ODE0LCAweDIwNDgsIDB4YThhYywgMHg2OTM4LCAweDkxMDIsIDB4YThiMCwgMHg2OTNjLAorCTB4OTEwMywgMHgxZTQ4LCAweDY4M2MsIDB4NjAyZSwgMHg2ODM4LCAweDkwODQsIDB4ZmZmYywgMHg2ODNhLAorCTB4NjAzMiwgMHgyZDAwLCAweDYwM2EsIDB4NjgwOCwgMHg2MDNlLCAweDY5MTAsIDB4NjExMiwgMHg2OTU0LAorCTB4NjE1NiwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDM5LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLAorCTB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDA5ZSwgMHgwMDFlLCAweDAwMDUsIDB4NjAyNCwgMHhkMGQ0LAorCTB4MDUxMCwgMHhkMGY0LCAweDExZjgsIDB4NjAzOCwgMHg5NDBhLCAweDYwM2MsIDB4OTMwMywgMHgwMjMwLAorCTB4OTEwNSwgMHgwMTIwLCAweDYwMjQsIDB4YzBkNCwgMHhjMGY1LCAweDAwOTgsIDB4NjQzYSwgMHg2MzNlLAorCTB4YWMzZSwgMHhhYjQyLCAweDAwNDYsIDB4MDAzNiwgMHgyNDAwLCAweGFjYWMsIDB4OTQwMiwgMHhhODM2LAorCTB4MjMwMCwgMHhhYmIwLCAweDkzMDMsIDB4YTgzYSwgMHgwMDNlLCAweDAwNGUsIDB4NjAyNCwgMHhjMGQ0LAorCTB4MDAwMCwgMHg2MDI2LCAweDAwMDUsIDB4ZDBmNCwgMHgxMTM4LCAweGE4M2MsIDB4NjAzYSwgMHhhODQwLAorCTB4NjAzZSwgMHg2MDI0LCAweGMwZjUsIDB4NjAyNiwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHg2MDA0LAorCTB4OTA4ZSwgMHgwMDM0LCAweDAxYjgsIDB4OTA4ZSwgMHgwMDM1LCAweDAxYTAsIDB4OTA4ZSwgMHgwMDM2LAorCTB4MDE4OCwgMHg5MDhlLCAweDAwMzcsIDB4MDE3MCwgMHg5MDhlLCAweDAwMzgsIDB4MDE1OCwgMHg5MDhlLAorCTB4MDAzOSwgMHgwMTQwLCAweDkwOGUsIDB4MDAzYSwgMHgwMTI4LCAweDkwOGUsIDB4MDAzYiwgMHgwMTEwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMGU2LCAweDIwMDEsIDB4MTk1YSwgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDAxLAorCTB4MDAzMiwgMHgwODBjLCAweDg0ZmYsIDB4MjAwMSwgMHgxOTVlLCAweDgyZmYsIDB4MTExMCwgMHgyMDExLAorCTB4MDAxNCwgMHgyMjAyLCAweDIwMDEsIDB4MTk1YywgMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDcxLAorCTB4MTk0NCwgMHg3MTFhLCAweDcyMWUsIDB4MjAwMSwgMHgwMDY0LCAweDA4MGMsIDB4ODRmZiwgMHgyMDAxLAorCTB4MTk1ZiwgMHg4MmZmLCAweDExMTAsIDB4MjAxMSwgMHgwMDE0LCAweDIyMDIsIDB4MjAwMSwgMHgxOTYwLAorCTB4OTI4OCwgMHgwMDBhLCAweDIxMDIsIDB4MjAwMSwgMHgxYTZiLCAweDIxMDIsIDB4MjAwMSwgMHgwMDMyLAorCTB4MDgwYywgMHgxNThiLCAweDA4MGMsIDB4NjdhNCwgMHgwMGVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMGU2LCAweDIwMDEsIDB4MTk1ZSwgMHgyMDAzLAorCTB4MDAyOCwgMHgyMDAxLCAweDE5NWYsIDB4MjAwMywgMHgwMDE0LCAweDIwNzEsIDB4MTk0NCwgMHg3MDFiLAorCTB4MDAwMCwgMHg3MDFmLCAweDA3ZDAsIDB4MjAwMSwgMHgxOTYwLCAweDIwMDksIDB4MDAxZSwgMHgyMTAyLAorCTB4MjAwMSwgMHgxYTZiLCAweDIxMDIsIDB4MjAwMSwgMHgwMDMyLCAweDA4MGMsIDB4MTU4YiwgMHgwMGVlLAorCTB4MDAxZSwgMHgwMDBlLCAweDAwMDUsIDB4MDA5NiwgMHg2MDU4LCAweDkwNGQsIDB4MDExMCwgMHgwODBjLAorCTB4MTA2MywgMHgwMDllLCAweDAwMDUsIDB4MDAwNSwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHhhMDhkLCAweDAxODAsIDB4MmIwOCwgMHg2MTEyLCAweDBjYTksIDB4NjAyMywgMHgwMDAxLAorCTB4MjkwMCwgMHg2MDE2LCAweDIwMDksIDB4MDAzMywgMHgwODBjLCAweGExNWQsIDB4OTA4NSwgMHgwMDAxLAorCTB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTAwNiwgMHgwY2Q4LCAweDAwOTYsIDB4MDBlNiwgMHgwMGY2LAorCTB4MjA3MSwgMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxNTAwLCAweDcwOGMsIDB4OTA4NiwgMHgwMDE4LAorCTB4MTFlMCwgMHg2MDE0LCAweDIwNDgsIDB4YWEzYywgMHhkMmU0LCAweDExNjAsIDB4MmM3OCwgMHgwODBjLAorCTB4OGUwMywgMHgwMWQ4LCAweDcwNzgsIDB4YWE1MCwgMHg5MjA2LCAweDExNjAsIDB4NzA3YywgMHhhYTU0LAorCTB4OTIwNiwgMHgxMTQwLCAweDYyMTAsIDB4MDBiNiwgMHgyMjU4LCAweGJhYTAsIDB4MDBiZSwgMHg5MDBlLAorCTB4MDgwYywgMHgzMWQ0LCAweDA4MGMsIDB4YTRlNywgMHgwMDIwLCAweDA4MGMsIDB4YWE4MSwgMHgwODBjLAorCTB4YTBlMywgMHgwMGZlLCAweDAwZWUsIDB4MDA5ZSwgMHgwMDA1LCAweDcwNWMsIDB4YWE1NCwgMHg5MjA2LAorCTB4MGQ0OCwgMHgwYzgwLCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHhhMDhkLAorCTB4MDE4OCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjMmIzLCAweDYwMjMsIDB4MDAwMSwgMHgyOTAwLAorCTB4NjAxNiwgMHgyMDA5LCAweDAwNGQsIDB4MDgwYywgMHhhMTVkLCAweDkwODUsIDB4MDAwMSwgMHgwMTJlLAorCTB4MDBjZSwgMHgwMDA1LCAweDkwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDAxNiwgMHgwODBjLCAweGEwOGQsIDB4MDE4MCwgMHgyYjA4LCAweDYxMTIsIDB4MDgwYywgMHhjMmIzLAorCTB4NjAyMywgMHgwMDAxLCAweDI5MDAsIDB4NjAxNiwgMHgwMDFlLCAweDA4MGMsIDB4YTE1ZCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMTJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDFlLCAweDkwMDYsIDB4MGNkMCwgMHgwMDE2LAorCTB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDY2LCAweDAwOTYsIDB4MDBlNiwgMHgwMGY2LAorCTB4MjA3MSwgMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxNTY4LCAweDcxOGMsIDB4NjAxNCwgMHgyMDQ4LAorCTB4YTgxNCwgMHg4MDAzLCAweDkxMDYsIDB4MTUzMCwgMHgyMGUxLCAweDAwMDAsIDB4MjAwMSwgMHgxOTc4LAorCTB4MjAwMywgMHgwMDAwLCAweDYwMTQsIDB4MjA0OCwgMHhhODMwLCAweDIwYTgsIDB4ODkwNiwgMHg4MDA2LAorCTB4ODAwNywgMHg5MDk0LCAweDAwM2YsIDB4MjJlOCwgMHg5MDg0LCAweGZmYzAsIDB4OTA4MCwgMHgwMDFiLAorCTB4MjBhMCwgMHgyMDAxLCAweDE5NzgsIDB4MDAxNiwgMHgyMDBjLCAweDA4MGMsIDB4Y2IxZCwgMHgwMDFlLAorCTB4YTgwNCwgMHg5MDA1LCAweDAxMTAsIDB4MjA0OCwgMHgwYzM4LCAweDYwMTQsIDB4MjA0OCwgMHhhODY3LAorCTB4MDEwMywgMHgwMDEwLCAweDA4MGMsIDB4YWE4MSwgMHgwODBjLCAweGEwZTMsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDA5ZSwgMHgwMDZlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDA5NiwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHgxODAwLCAweDkxODYsIDB4MDAxNSwgMHgxMWI4LAorCTB4NzA4YywgMHg5MDg2LCAweDAwMDQsIDB4MTE5OCwgMHg2MDE0LCAweDIwNDgsIDB4MmM3OCwgMHgwODBjLAorCTB4OGUwMywgMHgwMWE4LCAweDcwNzgsIDB4YWE3NCwgMHg5MjA2LCAweDExMzAsIDB4NzA3YywgMHhhYTc4LAorCTB4OTIwNiwgMHgxMTEwLCAweDA4MGMsIDB4MzE4YiwgMHgwODBjLCAweGE0ZTcsIDB4MDAyMCwgMHgwODBjLAorCTB4YWE4MSwgMHgwODBjLCAweGEwZTMsIDB4MDBmZSwgMHgwMGVlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDVjLAorCTB4YWE3OCwgMHg5MjA2LCAweDBkNzgsIDB4MGM4MCwgMHgwMDk2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLAorCTB4MTgwMCwgMHg5MTg2LCAweDAwMTUsIDB4MTU1MCwgMHg3MDhjLCAweDkwODYsIDB4MDAwNCwgMHgxNTMwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDJjNzgsIDB4MDgwYywgMHg4ZTAzLCAweDA1ZjAsIDB4NzA3OCwgMHhhYWNjLAorCTB4OTIwNiwgMHgxMTgwLCAweDcwN2MsIDB4YWFkMCwgMHg5MjA2LCAweDExNjAsIDB4MDgwYywgMHgzMThiLAorCTB4MDAxNiwgMHhhOTk4LCAweGFhYjAsIDB4OTI4NCwgMHgxMDAwLCAweGMwZmQsIDB4MDgwYywgMHg1NThhLAorCTB4MDAxZSwgMHgwMDEwLCAweDA4MGMsIDB4NTM3NSwgMHgwODBjLCAweGJlMzcsIDB4MDUwOCwgMHhhODdiLAorCTB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg5NywgMHg0MDAwLCAweDAwODAsIDB4MDgwYywgMHhiZTM3LAorCTB4MDFiOCwgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHg1Mzc1LCAweDFkNzAsIDB4YTg3YiwgMHgwMDMwLAorCTB4YTg4MywgMHgwMDAwLCAweGE4OTcsIDB4NDAwNSwgMHhhODliLCAweDAwMDQsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHhhODY3LCAweDAxMzksIDB4MDgwYywgMHg2YWU5LCAweDAxMmUsIDB4MDgwYywgMHhhMGUzLAorCTB4MDBmZSwgMHgwMGVlLCAweDAwOWUsIDB4MDAwNSwgMHg3MDVjLCAweGFhZDAsIDB4OTIwNiwgMHgwOTMwLAorCTB4MDg4OCwgMHgwMDE2LCAweDAwMjYsIDB4YTg3YywgMHhkMGFjLCAweDAxNzgsIDB4YTkzOCwgMHhhYTM0LAorCTB4MjEwMCwgMHg5MjA1LCAweDAxNTAsIDB4YTg5MCwgMHg5MTA2LCAweDExMTgsIDB4YTg4YywgMHg5MjA2LAorCTB4MDEyMCwgMHhhOTkyLCAweGFhOGUsIDB4OTA4NSwgMHgwMDAxLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMGQ2LCAweDAwMzYsIDB4MDgwYywgMHhiZTM3LCAweDA5MDQsIDB4YzQ2ZSwgMHgwMDk2LAorCTB4NjMxNCwgMHgyMzQ4LCAweGE4N2EsIDB4YTk4MiwgMHg5MjllLCAweDQwMDAsIDB4MTU4MCwgMHg2MzEwLAorCTB4MDBjNiwgMHgyMzU4LCAweDIwMDksIDB4MDAwMCwgMHhhODY4LCAweGQwZjQsIDB4MTE0MCwgMHgwODBjLAorCTB4NjZiZiwgMHgxMTA4LCAweGMxODUsIDB4YjgwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHhhYTk2LAorCTB4YTk5YSwgMHgyMGE5LCAweDAwMDQsIDB4YTg2MCwgMHgyMGU4LCAweGE4NWMsIDB4OTA4MCwgMHgwMDMxLAorCTB4MjBhMCwgMHhiOGI0LCAweDIwZTAsIDB4YjhiOCwgMHg5MDgwLCAweDAwMDYsIDB4MjA5OCwgMHgwODBjLAorCTB4MGZhZSwgMHgyMGE5LCAweDAwMDQsIDB4YTg1YywgMHg5MDgwLCAweDAwMzUsIDB4MjBhMCwgMHhiOGI4LAorCTB4OTA4MCwgMHgwMDBhLCAweDIwOTgsIDB4MDgwYywgMHgwZmFlLCAweDAwY2UsIDB4MDA5MCwgMHhhYTk2LAorCTB4MzkxOCwgMHg5Mzk4LCAweDAwMDcsIDB4MjMxYywgMHg2MDA0LCAweDkwODYsIDB4MDAxNiwgMHgwMTEwLAorCTB4YTg5YiwgMHgwMDA0LCAweGFiYTIsIDB4NjMxMCwgMHgyMzU4LCAweGI4MDQsIDB4OTA4NCwgMHgwMGZmLAorCTB4YTg5ZSwgMHgwODBjLCAweDZhZGMsIDB4NjAxNywgMHgwMDAwLCAweDAwOWUsIDB4MDAzZSwgMHgwMGRlLAorCTB4MDBiZSwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwYjYsIDB4MDA5NiwgMHgwMGY2LAorCTB4NjIxNCwgMHgyMjQ4LCAweDYyMTAsIDB4MjI1OCwgMHgyMDc5LCAweDAyNjAsIDB4OTA5NiwgMHgwMDAwLAorCTB4MTFhMCwgMHhiODE0LCAweDkwODQsIDB4MDBmZiwgMHg5MDBlLCAweDA4MGMsIDB4Mjc2ZSwgMHgyMTE4LAorCTB4ODMxZiwgMHg5MzljLCAweGZmMDAsIDB4NzgzOCwgMHg5MDg0LCAweDAwZmYsIDB4OTMxZCwgMHg3YzNjLAorCTB4MjAxMSwgMHg4MDE4LCAweDA4MGMsIDB4NGIxZiwgMHgwMGE4LCAweDkwOTYsIDB4MDAwMSwgMHgxMTQ4LAorCTB4ODlmZiwgMHgwMTgwLCAweGE4OWIsIDB4MDAwZCwgMHg3ODM4LCAweGE4YTYsIDB4NzgzYywgMHhhOGFhLAorCTB4MDA0OCwgMHg5MDk2LCAweDAwMDIsIDB4MTEzMCwgMHhhODliLCAweDAwMGQsIDB4NzgzOCwgMHhhOGE2LAorCTB4NzgzYywgMHhhOGFhLCAweDAwZmUsIDB4MDA5ZSwgMHgwMGJlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwMjYsIDB4MDAxNiwgMHg5MTg2LCAweDAwMzUsIDB4MDExMCwgMHg2YTM4LAorCTB4MDAwOCwgMHg2YTJjLCAweDA4MGMsIDB4YmUyNSwgMHgwMWYwLCAweDIyNjAsIDB4NjEyMCwgMHg5MTg2LAorCTB4MDAwMywgMHgwMTE4LCAweDkxODYsIDB4MDAwNiwgMHgxMTkwLCAweDY4MzgsIDB4OTIwNiwgMHgwMTQwLAorCTB4NjgzYywgMHg5MjA2LCAweDExNjAsIDB4NjEwOCwgMHg2ODM4LCAweDkxMDYsIDB4MTE0MCwgMHgwMDIwLAorCTB4NjAwOCwgMHg2OTNjLCAweDkxMDYsIDB4MTExOCwgMHg2MDEwLCAweDY5MTAsIDB4OTEwNiwgMHgwMDFlLAorCTB4MDAyZSwgMHgwMGNlLCAweDAwMDUsIDB4OTA4NSwgMHgwMDAxLCAweDBjYzgsIDB4YTk3NCwgMHhkMWNjLAorCTB4MDE4OCwgMHg5MThjLCAweDAwZmYsIDB4OTE4ZSwgMHgwMDAyLCAweDExNjAsIDB4YTlhOCwgMHg5MThjLAorCTB4MGYwMCwgMHg4MTBmLCAweDkxOGUsIDB4MDAwMSwgMHgxMTI4LCAweGE4MzQsIDB4YTkzOCwgMHg5MTE1LAorCTB4MTkwYywgMHhiNGVlLCAweDAwMDUsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsIDB4MDAxMCwgMHgwMDM2LAorCTB4OTAxZSwgMHgwNDk5LCAweDAxZTAsIDB4MDgwYywgMHhiZTM3LCAweDAxYzgsIDB4MDgwYywgMHhjMDIyLAorCTB4NjAzNywgMHg0MDAwLCAweDYwMTQsIDB4NjAxNywgMHgwMDAwLCAweDAwOTYsIDB4MjA0OCwgMHhhODdjLAorCTB4MDgwYywgMHhjMDNmLCAweDExMTgsIDB4MDgwYywgMHhhYTgxLCAweDAwNDAsIDB4YTg2NywgMHgwMTAzLAorCTB4YTg3NywgMHgwMDAwLCAweDgzZmYsIDB4MTEyOSwgMHgwODBjLCAweDZhZTksIDB4MDA5ZSwgMHgwMDNlLAorCTB4MDAwNSwgMHhhODgwLCAweGQwYjQsIDB4MDEyOCwgMHhhODdiLCAweDAwMDYsIDB4YzBlYywgMHhhODgyLAorCTB4MDA0OCwgMHhkMGJjLCAweDAxMTgsIDB4YTg3YiwgMHgwMDAyLCAweDAwMjAsIDB4YTg3YiwgMHgwMDA1LAorCTB4MDgwYywgMHhjMTMzLCAweGE4NzcsIDB4MDAwMCwgMHgwMDA1LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LAorCTB4ZDBlYywgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDBmNCwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4MTgxMCwgMHgyMDA0LCAweGQwZTQsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDAzNiwgMHgwMDQ2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJiYTAsIDB4MDBiZSwgMHgyMDIxLAorCTB4MDAwNywgMHgwODBjLCAweDRjYmMsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4MGM1MSwgMHgxZDgxLAorCTB4MDAwNSwgMHgyMDAxLCAweDE5NWUsIDB4MjAwNCwgMHg2MDFhLCAweDAwMDUsIDB4MjAwMSwgMHgxOTYwLAorCTB4MjAwNCwgMHg2MDQyLCAweDAwMDUsIDB4MDgwYywgMHhhMGUzLCAweDA4MDQsIDB4OGMxMCwgMHgwMGI2LAorCTB4MDA2NiwgMHg2MDAwLCAweDkwYjIsIDB4MDAxNiwgMHgxYTBjLCAweDBkZmEsIDB4MDAxYiwgMHgwMDZlLAorCTB4MDBiZSwgMHgwMDA1LCAweGM1N2EsIDB4Y2M3YSwgMHhjZGQ1LCAweGM1N2EsIDB4YzU3YSwgMHhjNTdhLAorCTB4YzU3YSwgMHhjNTdhLCAweGM1YjEsIDB4Y2U1OSwgMHhjNTdhLCAweGM1N2EsIDB4YzU3YSwgMHhjNTdhLAorCTB4YzU3YSwgMHhjNTdhLCAweDA4MGMsIDB4MGRmYSwgMHgwMDY2LCAweDYwMDAsIDB4OTBiMiwgMHgwMDE2LAorCTB4MWEwYywgMHgwZGZhLCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweGM1OTUsIDB4ZDNjYiwgMHhjNTk1LAorCTB4YzU5NSwgMHhjNTk1LCAweGM1OTUsIDB4YzU5NSwgMHhjNTk1LCAweGQzNzgsIDB4ZDQxZiwgMHhjNTk1LAorCTB4ZGEwZiwgMHhkYTQ1LCAweGRhMGYsIDB4ZGE0NSwgMHhjNTk1LCAweDA4MGMsIDB4MGRmYSwgMHg2MDAwLAorCTB4OTA4MiwgMHgwMDE2LCAweDFhMGMsIDB4MGRmYSwgMHg2MDAwLCAweDAwMGEsIDB4MDAwNSwgMHhjNWFmLAorCTB4ZDAzNywgMHhkMTI5LCAweGQxNGMsIDB4ZDIwYywgMHhjNWFmLCAweGQyZWIsIDB4ZDI5NCwgMHhjZTY1LAorCTB4ZDM0ZSwgMHhkMzYzLCAweGM1YWYsIDB4YzVhZiwgMHhjNWFmLCAweGM1YWYsIDB4YzVhZiwgMHgwODBjLAorCTB4MGRmYSwgMHg5MWIyLCAweDAwNTMsIDB4MWEwYywgMHgwZGZhLCAweDIxMDAsIDB4OTFiMiwgMHgwMDQwLAorCTB4MWEwNCwgMHhjYTFiLCAweDAwMDIsIDB4YzVmYiwgMHhjN2U5LCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLAorCTB4YzdmMiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLAorCTB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLAorCTB4YzVmYiwgMHhjNWZiLCAweGM1ZmQsIDB4YzY2MCwgMHhjNjZmLCAweGM2ZDMsIDB4YzZmZSwgMHhjNzc2LAorCTB4YzdkNCwgMHhjNWZiLCAweGM1ZmIsIDB4YzdmNSwgMHhjNWZiLCAweGM1ZmIsIDB4YzgwYSwgMHhjODE3LAorCTB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLCAweGM4YmQsIDB4YzVmYiwgMHhjNWZiLAorCTB4YzhkMSwgMHhjNWZiLCAweGM1ZmIsIDB4Yzg4YywgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjOGU5LAorCTB4YzVmYiwgMHhjNWZiLCAweGM1ZmIsIDB4Yzk2NiwgMHhjNWZiLCAweGM1ZmIsIDB4YzVmYiwgMHhjNWZiLAorCTB4YzVmYiwgMHhjNWZiLCAweGM5ZTMsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4Njc4MSwgMHgxMTUwLAorCTB4MjAwMSwgMHgxODM2LCAweDIwMDQsIDB4ZDBjYywgMHgxMTI4LCAweDkwODQsIDB4MDAwOSwgMHg5MDg2LAorCTB4MDAwOCwgMHgxMTQwLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJmLCAweDAwMDksIDB4NjAxNywgMHgwMDAwLAorCTB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4Njc2YSwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDI2LAorCTB4MDAxNiwgMHg2MjEwLCAweDIyNTgsIDB4YmFhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLAorCTB4ODgwMywgMHgwMDc2LCAweDkwM2UsIDB4MDgwYywgMHg4NmYxLCAweDJjMDgsIDB4MDgwYywgMHhkNWY2LAorCTB4MDA3ZSwgMHgwMDFlLCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwY2UsIDB4MDBlZSwgMHg2NjEwLAorCTB4MjY1OCwgMHgwODBjLCAweDY0YWUsIDB4YmUwNCwgMHg5Njg0LCAweDAwZmYsIDB4OTA4MiwgMHgwMDA2LAorCTB4MTI2OCwgMHgwMDE2LCAweDAwMjYsIDB4NjIxMCwgMHgwMGI2LCAweDIyNTgsIDB4YmFhMCwgMHgwMGJlLAorCTB4MmMwOCwgMHgwODBjLCAweGRiYmQsIDB4MDAyZSwgMHgwMDFlLCAweDExNzgsIDB4MDgwYywgMHhkNTI5LAorCTB4MTkwNCwgMHhjNmNiLCAweDA4MGMsIDB4ZDRjNSwgMHgxMTIwLCAweDYwMDcsIDB4MDAwOCwgMHgwODA0LAorCTB4YzdlMiwgMHg2MDA3LCAweDAwMDksIDB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4ZDcyMCwgMHgwMTI4LAorCTB4MDgwYywgMHhkNTI5LCAweDBkNzgsIDB4MDgwNCwgMHhjNmNiLCAweDYwMTcsIDB4MTkwMCwgMHgwYzg4LAorCTB4MDgwYywgMHgzMmFlLCAweDE5MDQsIDB4Y2ExOCwgMHg2MTA2LCAweDA4MGMsIDB4ZDQ3YSwgMHg2MDA3LAorCTB4MDAwNiwgMHgwODA0LCAweGM3ZTIsIDB4NjAwNywgMHgwMDA3LCAweDA4MDQsIDB4YzdlMiwgMHgwODBjLAorCTB4ZGE4MSwgMHgxOTA0LCAweGNhMTgsIDB4MDgwYywgMHgzMmFlLCAweDE5MDQsIDB4Y2ExOCwgMHgwMGQ2LAorCTB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwgMHgxMjIwLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjNkYywgMHg5NmI0LCAweGZmMDAsIDB4ODYzNywgMHg5Njg2LAorCTB4MDAwNiwgMHgwMTg4LCAweDk2ODYsIDB4MDAwNCwgMHgwMTcwLCAweGJlMDQsIDB4OTZiNCwgMHgwMGZmLAorCTB4OTY4NiwgMHgwMDA2LCAweDAxNDAsIDB4OTY4NiwgMHgwMDA0LCAweDAxMjgsIDB4OTY4NiwgMHgwMDA1LAorCTB4MDExMCwgMHgwMGRlLCAweDA0ODAsIDB4MDBlNiwgMHgyMDcxLCAweDAyNjAsIDB4NzAzNCwgMHg5MDg0LAorCTB4MDAwMywgMHgxMTQwLCAweDcwMzQsIDB4OTA4MiwgMHgwMDE0LCAweDAyMjAsIDB4NzAzMCwgMHg5MDg0LAorCTB4MDAwMywgMHgwMTMwLCAweDAwZWUsIDB4NjAxNywgMHgwMDAwLCAweDYwMmYsIDB4MDAwNywgMHgwMGIwLAorCTB4MDBlZSwgMHgwODBjLCAweGQ1OGMsIDB4MTE5MCwgMHg5Njg2LCAweDAwMDYsIDB4MTE0MCwgMHgwMDI2LAorCTB4NjIxMCwgMHgyMjU4LCAweGJhYTAsIDB4OTAwZSwgMHgwODBjLCAweDMxZDQsIDB4MDAyZSwgMHgwODBjLAorCTB4NjUzYSwgMHg2MDA3LCAweDAwMGEsIDB4MDBkZSwgMHgwODA0LCAweGM3ZTIsIDB4NjAwNywgMHgwMDBiLAorCTB4MDBkZSwgMHgwODA0LCAweGM3ZTIsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHg2MDA3LAorCTB4MDAwMSwgMHgwODA0LCAweGM3ZTIsIDB4MDgwYywgMHhkYTgxLCAweDE5MDQsIDB4Y2ExOCwgMHgwODBjLAorCTB4MzJhZSwgMHgxOTA0LCAweGNhMTgsIDB4MjA3MSwgMHgwMjYwLCAweDcwMzQsIDB4OTBiNCwgMHgwMDAzLAorCTB4MTk0OCwgMHg5MGIyLCAweDAwMTQsIDB4MGEzMCwgMHg3MDMwLCAweDkwODQsIDB4MDAwMywgMHgxOTEwLAorCTB4NjYxMCwgMHgyNjU4LCAweGJlMDQsIDB4OTY4NiwgMHgwNzA3LCAweDA5ZTgsIDB4MDAyNiwgMHg2MjEwLAorCTB4MjI1OCwgMHhiYWEwLCAweDkwMGUsIDB4MDgwYywgMHgzMWQ0LCAweDAwMmUsIDB4NjAwNywgMHgwMDBjLAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4ZGI5ZCwgMHgwODA0LCAweGM3ZTIsIDB4MDgwYywgMHg2NzgxLAorCTB4MTE0MCwgMHgyMDAxLCAweDE4MzYsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwgMHgwMDA4LAorCTB4MTExMCwgMHgwODA0LCAweGM2MGEsIDB4MDgwYywgMHg2NzZhLCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LAorCTB4OTY4NCwgMHgwMGZmLCAweDkwODIsIDB4MDAwNiwgMHgwNmMwLCAweDExMzgsIDB4MDAyNiwgMHgyMDAxLAorCTB4MDAwNiwgMHgwODBjLCAweDY0MWMsIDB4MDAyZSwgMHgwMDUwLCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LAorCTB4OTY4NiwgMHgwMDA0LCAweDAxMjAsIDB4OTY4NiwgMHgwMDA2LCAweDE5MDQsIDB4YzZjYiwgMHgwODBjLAorCTB4ZDU5OSwgMHgxMTIwLCAweDYwMDcsIDB4MDAwZSwgMHgwODA0LCAweGM3ZTIsIDB4MDA0NiwgMHg2NDEwLAorCTB4MjQ1OCwgMHhiY2EwLCAweDAwNDYsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHgwMDRlLAorCTB4MDAxNiwgMHg5MDA2LCAweDIwMDksIDB4MTg1YywgMHgyMTBjLCAweDAwNDgsIDB4MjAwOSwgMHgwMDI5LAorCTB4MDgwYywgMHhkODg1LCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGMwZTUsIDB4YjgwMiwgMHgwMDFlLAorCTB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwNCwgMHhjN2UyLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLAorCTB4NjNkYywgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LAorCTB4MTgwNSwgMHgyMDExLCAweDAyNzAsIDB4MDgwYywgMHhiMGJjLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDE1ZSwgMHg5MDA1LCAweDAxNjgsIDB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4MiwgMHgwMDA0LAorCTB4MGEwNCwgMHhjNmNiLCAweDk2ODIsIDB4MDAwNywgMHgwYTA0LCAweGM3MjcsIDB4MDgwNCwgMHhjNmNiLAorCTB4NjAxNywgMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwODA0LCAweGM3ZTIsIDB4MDgwYywgMHg2NzgxLAorCTB4MTE0MCwgMHgyMDAxLCAweDE4MzYsIDB4MjAwNCwgMHg5MDg0LCAweDAwMDksIDB4OTA4NiwgMHgwMDA4LAorCTB4MTExMCwgMHgwODA0LCAweGM2MGEsIDB4MDgwYywgMHg2NzZhLCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LAorCTB4OTY4NCwgMHgwMGZmLCAweDAwMDYsIDB4OTA4NiwgMHgwMDAxLCAweDAwMGUsIDB4MDE3MCwgMHg5MDgyLAorCTB4MDAwNiwgMHgwNjkwLCAweDAxNTAsIDB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwgMHgwMDA0LAorCTB4MDEyMCwgMHg5Njg2LCAweDAwMDYsIDB4MTkwNCwgMHhjNmNiLCAweDA4MGMsIDB4ZDVjNywgMHgxMTMwLAorCTB4MDgwYywgMHhkNGM1LCAweDExMTgsIDB4NjAwNywgMHgwMDEwLCAweDA0ZTAsIDB4MDA0NiwgMHg2NDEwLAorCTB4MjQ1OCwgMHhiY2EwLCAweDAwNDYsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHgwMDRlLAorCTB4MDAxNiwgMHg5MDA2LCAweDIwMDksIDB4MTg1YywgMHgyMTBjLCAweDAwNDgsIDB4MjAwOSwgMHgwMDI5LAorCTB4MDgwYywgMHhkODg1LCAweDYwMTAsIDB4MjA1OCwgMHhiODAwLCAweGMwZTUsIDB4YjgwMiwgMHgwMDFlLAorCTB4MDA0ZSwgMHg2MDA3LCAweDAwMDEsIDB4MDBmMCwgMHgwODBjLCAweGQ3MjAsIDB4MDE0MCwgMHg5NmI0LAorCTB4ZmYwMCwgMHg4NjM3LCAweDk2ODYsIDB4MDAwNiwgMHgwOTgwLCAweDA4MDQsIDB4YzZjYiwgMHg2MDE3LAorCTB4MTkwMCwgMHg2MDA3LCAweDAwMDksIDB4MDA3MCwgMHgwODBjLCAweDMyYWUsIDB4MTkwNCwgMHhjYTE4LAorCTB4MDgwYywgMHhkYTgxLCAweDE5MDQsIDB4Y2ExOCwgMHgwODBjLCAweGNiYjgsIDB4MTkwNCwgMHhjNmNiLAorCTB4NjAwNywgMHgwMDEyLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLAorCTB4MDAwNSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLAorCTB4OGMxMCwgMHgwY2IwLCAweDYwMDcsIDB4MDAwNSwgMHgwYzY4LCAweDA4MGMsIDB4ZGE4MSwgMHgxOTA0LAorCTB4Y2ExOCwgMHgwODBjLCAweDMyYWUsIDB4MTkwNCwgMHhjYTE4LCAweDA4MGMsIDB4Y2JiOCwgMHgxOTA0LAorCTB4YzZjYiwgMHg2MDA3LCAweDAwMjAsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDA4MGMsIDB4MzJhZSwgMHgxOTA0LCAweGNhMTgsIDB4NjAwNywgMHgwMDIzLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwODBjLAorCTB4ZGE4MSwgMHgxOTA0LCAweGNhMTgsIDB4MDgwYywgMHgzMmFlLCAweDE5MDQsIDB4Y2ExOCwgMHgwODBjLAorCTB4Y2JiOCwgMHgxOTA0LCAweGM2Y2IsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwgMHgwMjYwLAorCTB4MmMwOCwgMHgyMDExLCAweDE4MWYsIDB4MjIxNCwgMHg3MDNjLCAweDkyMDYsIDB4MTFlMCwgMHgyMDExLAorCTB4MTgxZSwgMHgyMjE0LCAweDcwMzgsIDB4OTA4NCwgMHgwMGZmLCAweDkyMDYsIDB4MTFhMCwgMHg3MjQwLAorCTB4MDgwYywgMHhiZTI1LCAweDA1NzAsIDB4MjI2MCwgMHg2MDA4LCAweDkwODYsIDB4ZmZmZiwgMHgwMTIwLAorCTB4NzI0NCwgMHg2MDA4LCAweDkyMDYsIDB4MTUyOCwgMHg2MDIwLCAweDkwODYsIDB4MDAwNywgMHgxNTA4LAorCTB4MDgwYywgMHhhMGUzLCAweDA0YTAsIDB4NzI0NCwgMHg5Mjg2LCAweGZmZmYsIDB4MDE4MCwgMHgyYzA4LAorCTB4MDgwYywgMHhiZTI1LCAweDAxYjAsIDB4MjI2MCwgMHg3MjQwLCAweDYwMDgsIDB4OTIwNiwgMHgxMTg4LAorCTB4NjAxMCwgMHg5MTkwLCAweDAwMDQsIDB4MjIxNCwgMHg5MjA2LCAweDAxYjgsIDB4MDA1MCwgMHg3MjQwLAorCTB4MmMwOCwgMHg5MDA2LCAweDA4MGMsIDB4ZDg1NywgMHgxMTgwLCAweDcyNDQsIDB4OTI4NiwgMHhmZmZmLAorCTB4MDFiMCwgMHgyMTYwLCAweDYwMDcsIDB4MDAyNiwgMHg2MDE3LCAweDE3MDAsIDB4NzIxNCwgMHg5Mjk2LAorCTB4ZmZmZiwgMHgxMTgwLCAweDYwMDcsIDB4MDAyNSwgMHgwMDY4LCAweDYwMjAsIDB4OTA4NiwgMHgwMDA3LAorCTB4MWQ4MCwgMHg2MDA0LCAweDkwODYsIDB4MDAyNCwgMHgxMTEwLCAweDA4MGMsIDB4YTBlMywgMHgyMTYwLAorCTB4NjAwNywgMHgwMDI1LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLAorCTB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg2M2RjLAorCTB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHgxODA1LAorCTB4MjAxMSwgMHgwMjc2LCAweDA4MGMsIDB4YjBiYywgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLAorCTB4MDEyMCwgMHg2MDA3LCAweDAwMzEsIDB4MDgwNCwgMHhjN2UyLCAweDA4MGMsIDB4YWQyNCwgMHgwODBjLAorCTB4NzIwNywgMHgxMTkwLCAweDAwMDYsIDB4MDAyNiwgMHgwMDM2LCAweDA4MGMsIDB4NzIyMSwgMHgxMTM4LAorCTB4MDgwYywgMHg3NTA0LCAweDA4MGMsIDB4NWYyYiwgMHgwODBjLCAweDcxMjcsIDB4MDAxMCwgMHgwODBjLAorCTB4NzFkZiwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwMDA1LCAweDA4MGMsIDB4MzJhZSwgMHgxOTA0LAorCTB4Y2ExOCwgMHgwODBjLCAweGNiYjgsIDB4MTkwNCwgMHhjNmNiLCAweDYxMDYsIDB4MDgwYywgMHhjYmQ0LAorCTB4MTEyMCwgMHg2MDA3LCAweDAwMmIsIDB4MDgwNCwgMHhjN2UyLCAweDYwMDcsIDB4MDAyYywgMHgwODA0LAorCTB4YzdlMiwgMHgwODBjLCAweGRhODEsIDB4MTkwNCwgMHhjYTE4LCAweDA4MGMsIDB4MzJhZSwgMHgxOTA0LAorCTB4Y2ExOCwgMHgwODBjLCAweGNiYjgsIDB4MTkwNCwgMHhjNmNiLCAweDYxMDYsIDB4MDgwYywgMHhjYmQ5LAorCTB4MTEyMCwgMHg2MDA3LCAweDAwMmUsIDB4MDgwNCwgMHhjN2UyLCAweDYwMDcsIDB4MDAyZiwgMHgwODA0LAorCTB4YzdlMiwgMHgwODBjLCAweDMyYWUsIDB4MTkwNCwgMHhjYTE4LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4NjAxMCwgMHgyMDU4LCAweGI5MDQsIDB4OTE4NCwgMHgwMGZmLCAweDkwODYsIDB4MDAwNiwgMHgwMTU4LAorCTB4OTE4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTA4NiwgMHgwMDA2LCAweDAxMjgsIDB4MDBjZSwgMHgwMGRlLAorCTB4MDBlZSwgMHgwODA0LCAweGM3ZTksIDB4MDgwYywgMHg1NWRmLCAweGQwZTQsIDB4MDkwNCwgMHhjOTYzLAorCTB4MjA3MSwgMHgwMjZjLCAweDcwMTAsIDB4NjAzYSwgMHg3MDE0LCAweDYwM2UsIDB4NzEwOCwgMHg3MjBjLAorCTB4MDgwYywgMHg2N2JmLCAweDAxNDAsIDB4NjAxMCwgMHgyMDU4LCAweGI4MTAsIDB4OTEwNiwgMHgxMTE4LAorCTB4YjgxNCwgMHg5MjA2LCAweDA1MTAsIDB4MDgwYywgMHg2N2JiLCAweDE1YjgsIDB4MjA2OSwgMHgxODAwLAorCTB4Njg3YywgMHg5MjA2LCAweDE1OTAsIDB4Njg3OCwgMHg5MTA2LCAweDE1NzgsIDB4NzIxMCwgMHgwODBjLAorCTB4YmUyNSwgMHgwNTkwLCAweDA4MGMsIDB4Y2FhMywgMHgwNTc4LCAweDA4MGMsIDB4ZDkwMSwgMHgwNTYwLAorCTB4NjIyZSwgMHg2MDA3LCAweDAwMzYsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLAorCTB4OGMxMCwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDcyMTQsIDB4OTI4NiwgMHhmZmZmLAorCTB4MDE1MCwgMHgwODBjLCAweGJlMjUsIDB4MDFjMCwgMHg5MjgwLCAweDAwMDIsIDB4MjAwNCwgMHg3MTEwLAorCTB4OTEwNiwgMHgxMTkwLCAweDA4ZTAsIDB4NzIxMCwgMHgyYzA4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLAorCTB4ZDg1NywgMHgyYzEwLCAweDIxNjAsIDB4MDE0MCwgMHgwODkwLCAweDYwMDcsIDB4MDAzNywgMHg2MDJmLAorCTB4MDAwOSwgMHg2MDE3LCAweDE1MDAsIDB4MDhiOCwgMHg2MDA3LCAweDAwMzcsIDB4NjAyZiwgMHgwMDAzLAorCTB4NjAxNywgMHgxNzAwLCAweDA4ODAsIDB4NjAwNywgMHgwMDEyLCAweDA4NjgsIDB4MDgwYywgMHgzMmFlLAorCTB4MTkwNCwgMHhjYTE4LCAweDYwMTAsIDB4MjA1OCwgMHhiODA0LCAweDkwODQsIDB4ZmYwMCwgMHg4MDA3LAorCTB4OTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4YzdlOSwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwODBjLAorCTB4NTVkZiwgMHhkMGU0LCAweDA5MDQsIDB4YzlkYiwgMHgyMDY5LCAweDE4MDAsIDB4MjA3MSwgMHgwMjZjLAorCTB4NzAwOCwgMHg2MDNhLCAweDcyMGMsIDB4NjIzZSwgMHg5Mjg2LCAweGZmZmYsIDB4MTE1MCwgMHg3MjA4LAorCTB4MDBjNiwgMHgyYzA4LCAweDkwODUsIDB4MDAwMSwgMHgwODBjLCAweGQ4NTcsIDB4MmMxMCwgMHgwMGNlLAorCTB4MDVlOCwgMHgwODBjLCAweGJlMjUsIDB4MDVkMCwgMHg3MTA4LCAweDkyODAsIDB4MDAwMiwgMHgyMDA0LAorCTB4OTEwNiwgMHgxNWEwLCAweDAwYzYsIDB4MDAyNiwgMHgyMjYwLCAweDA4MGMsIDB4YmE0OSwgMHgwMDJlLAorCTB4MDBjZSwgMHg3MTE4LCAweDkxOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDkxODYsIDB4MDAwMSwgMHgwMTc4LAorCTB4OTE4NiwgMHgwMDA1LCAweDAxMTgsIDB4OTE4NiwgMHgwMDA3LCAweDExOTgsIDB4OTI4MCwgMHgwMDA1LAorCTB4MjAwNCwgMHg5MDA1LCAweDAxNzAsIDB4MDgwYywgMHhjYWEzLCAweDA5MDQsIDB4Yzk1YywgMHgwMDU2LAorCTB4NzUxMCwgMHg3NjE0LCAweDA4MGMsIDB4ZDkxYSwgMHgwMDVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg2MDA3LCAweDAwM2IsIDB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MmEwMCwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDBjNzgsIDB4NjAwNywgMHgwMDNiLAorCTB4NjAyZiwgMHgwMDAzLCAweDYwMTcsIDB4MDMwMCwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4Njc5LAorCTB4MDgwYywgMHg4YzEwLCAweDBjMTAsIDB4NjAwNywgMHgwMDNiLCAweDYwMmYsIDB4MDAwYiwgMHg2MDE3LAorCTB4MDAwMCwgMHgwODA0LCAweGM5MzMsIDB4MDBlNiwgMHgwMDI2LCAweDA4MGMsIDB4Njc4MSwgMHgwNTUwLAorCTB4MDgwYywgMHg2NzZhLCAweDA4MGMsIDB4ZGFmMywgMHgxNTE4LCAweDIwNzEsIDB4MTgwMCwgMHg3MGQ4LAorCTB4OTA4NSwgMHgwMDAzLCAweDcwZGEsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4NzJhYywgMHg5Mjg0LAorCTB4MDBmZiwgMHg3MDdhLCAweDc4ZTYsIDB4OTI4NCwgMHhmZjAwLCAweDcyN2MsIDB4OTIwNSwgMHg3MDdlLAorCTB4NzhlYSwgMHgwMGZlLCAweDcwZTMsIDB4MDAwMCwgMHgwODBjLCAweDY3YmYsIDB4MDEyMCwgMHgyMDExLAorCTB4MTlkOCwgMHgyMDEzLCAweDA3ZDAsIDB4ZDBhYywgMHgxMTI4LCAweDA4MGMsIDB4MmY2YywgMHgwMDEwLAorCTB4MDgwYywgMHhkYjI1LCAweDAwMmUsIDB4MDBlZSwgMHgwODBjLCAweGEwZTMsIDB4MDgwNCwgMHhjN2U4LAorCTB4MDgwYywgMHhhMGUzLCAweDAwMDUsIDB4MjYwMCwgMHgwMDAyLCAweGNhMmYsIDB4Y2EyZiwgMHhjYTJmLAorCTB4Y2EyZiwgMHhjYTJmLCAweGNhMzEsIDB4Y2EyZiwgMHhjYTJmLCAweGNhMmYsIDB4Y2EyZiwgMHhjYTRlLAorCTB4Y2EyZiwgMHhjYTJmLCAweGNhMmYsIDB4Y2E2MCwgMHhjYTZkLCAweGNhOWUsIDB4Y2EyZiwgMHgwODBjLAorCTB4MGRmYSwgMHgwODBjLCAweGRhODEsIDB4MWQyMCwgMHgwODBjLCAweDMyYWUsIDB4MWQwOCwgMHgwODBjLAorCTB4Y2JiOCwgMHgxMTQ4LCAweDcwMzgsIDB4NjAxNiwgMHg2MDA3LCAweDAwNDUsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg4NmMxLCAweDAwMDUsIDB4MDgwYywgMHgzMThiLCAweDA4MGMsIDB4YzU0ZSwgMHg2MDA3LAorCTB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4NmMxLCAweDAwMDUsIDB4MDgwYywgMHhkYTgxLAorCTB4MTkzOCwgMHgwODBjLCAweDMyYWUsIDB4MTkyMCwgMHgwODBjLCAweGNiYjgsIDB4MWQ2MCwgMHg3MDNjLAorCTB4NjAxNiwgMHg2MDA3LCAweDAwNGEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwMDA1LAorCTB4MDgwYywgMHhjYWMwLCAweDA5MDQsIDB4Y2ExOCwgMHg2MDA3LCAweDAwNGUsIDB4NjAwMywgMHgwMDAxLAorCTB4MDgwYywgMHg4NmMxLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDYwMDcsIDB4MDA0ZiwgMHg2MDE3LAorCTB4MDAwMCwgMHg3MTM0LCAweDkxOGMsIDB4MDBmZiwgMHg4MWZmLCAweDA1MDgsIDB4OTE4NiwgMHgwMDAxLAorCTB4MTE2MCwgMHg3MTQwLCAweDIwMDEsIDB4MTk5NSwgMHgyMDA0LCAweDkxMDYsIDB4MTFiMCwgMHg3MTQ0LAorCTB4MjAwMSwgMHgxOTk2LCAweDIwMDQsIDB4OTEwNiwgMHgwMTkwLCAweDkxODYsIDB4MDAwMiwgMHgxMTY4LAorCTB4MjAxMSwgMHgwMjc2LCAweDIwYTksIDB4MDAwNCwgMHg2MDEwLCAweDAwOTYsIDB4MjA0OCwgMHgyMDE5LAorCTB4MDAwYSwgMHgwODBjLCAweGIwZDAsIDB4MDA5ZSwgMHgwMTEwLCAweDYwMTcsIDB4MDAwMSwgMHg2MDAzLAorCTB4MDAwMSwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4NjAwNywgMHgwMDUwLAorCTB4NzAzYywgMHg2MDE2LCAweDBjYTAsIDB4MDAxNiwgMHgwMGU2LCAweDIwNzEsIDB4MDI2MCwgMHgwMGI2LAorCTB4MDBjNiwgMHgyMjYwLCAweDYwMTAsIDB4MjA1OCwgMHhiOGJjLCAweGQwODQsIDB4MDE1MCwgMHg3MTI4LAorCTB4NjA0NCwgMHg5MTA2LCAweDExMjAsIDB4NzEyYywgMHg2MDQ4LCAweDkxMDYsIDB4MDExMCwgMHg5MDA2LAorCTB4MDAxMCwgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGJlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMDk2LCAweDAwODYsIDB4MDBlNiwgMHgwMWM2LCAweDAxZDYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDE4MDAsIDB4NzA4YywgMHg5MDhhLCAweDAwZjksIDB4MTZlOCwgMHgyMGUxLAorCTB4MDAwMCwgMHgyMDAxLCAweDE5NzgsIDB4MjAwMywgMHgwMDAwLCAweDA4MGMsIDB4MTA0YSwgMHgwNWEwLAorCTB4MjkwMCwgMHg2MDE2LCAweDcwOGMsIDB4ODAwNCwgMHhhODE2LCAweDkwOGEsIDB4MDAxZSwgMHgwMmQwLAorCTB4YTgzMywgMHgwMDFlLCAweDIwYTksIDB4MDAxZSwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAxYiwgMHgyMGEwLCAweDIwMDEsIDB4MTk3OCwgMHgwMDE2LCAweDIwMGMsIDB4MDQ3MSwgMHgwMDFlLAorCTB4Mjk0MCwgMHgwODBjLCAweDEwNGEsIDB4MDFjMCwgMHgyOTAwLCAweGEwMDYsIDB4MjEwMCwgMHg4MWZmLAorCTB4MDE4MCwgMHgwYzE4LCAweGE4MzIsIDB4MjBhOCwgMHhhODYwLCAweDIwZTgsIDB4YTg1YywgMHg5MDgwLAorCTB4MDAxYiwgMHgyMGEwLCAweDIwMDEsIDB4MTk3OCwgMHgwMDE2LCAweDIwMGMsIDB4MDBiMSwgMHgwMDFlLAorCTB4MDAwMCwgMHg5MDg1LCAweDAwMDEsIDB4MDA0OCwgMHgyMDcxLCAweDE4MDAsIDB4NzA4ZiwgMHgwMDAwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4MGZlMywgMHg5MDA2LCAweDAxMmUsIDB4MDFkZSwgMHgwMWNlLAorCTB4MDBlZSwgMHgwMDhlLCAweDAwOWUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAxNiwgMHgwMDI2LAorCTB4MDAzNiwgMHgwMGM2LCAweDkxOGMsIDB4ZmZmZiwgMHgxMWE4LCAweDA4MGMsIDB4MjJlMywgMHgyMDk5LAorCTB4MDI2YywgMHgyMDAxLCAweDAwMTQsIDB4MzUxOCwgMHg5MzEyLCAweDEyMTgsIDB4MjNhOCwgMHg0MDAzLAorCTB4MDBmOCwgMHgyMGE4LCAweDQwMDMsIDB4MjJhOCwgMHg4MTA4LCAweDA4MGMsIDB4MjJlMywgMHgyMDk5LAorCTB4MDI2MCwgMHgwY2E4LCAweDA4MGMsIDB4MjJlMywgMHgyMDYxLCAweDE5NzgsIDB4NjAwNCwgMHgyMDk4LAorCTB4NjAwOCwgMHgzNTE4LCAweDkzMTIsIDB4MTIxOCwgMHgyM2E4LCAweDQwMDMsIDB4MDA0OCwgMHgyMGE4LAorCTB4NDAwMywgMHgyMmE4LCAweDgxMDgsIDB4MDgwYywgMHgyMmUzLCAweDIwOTksIDB4MDI2MCwgMHgwY2E4LAorCTB4MjA2MSwgMHgxOTc4LCAweDIwMTksIDB4MDI4MCwgMHgzMzAwLCAweDkzMWUsIDB4MDExMCwgMHg2MDA2LAorCTB4MDAyMCwgMHgyMDAxLCAweDAyNjAsIDB4NjAwNiwgMHg4MTA4LCAweDIxNjIsIDB4OTI5MiwgMHgwMDIxLAorCTB4OTI5NiwgMHhmZmZmLCAweDYyMGEsIDB4MDBjZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLAorCTB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsIDB4ODFmZiwgMHgxMWI4LAorCTB4MDgwYywgMHgyMmZiLCAweDIwYTEsIDB4MDI0YywgMHgyMDAxLCAweDAwMTQsIDB4MzUxOCwgMHg5MzEyLAorCTB4MTIxOCwgMHgyM2E4LCAweDQwMDMsIDB4MDQxOCwgMHgyMGE4LCAweDQwMDMsIDB4ODJmZiwgMHgwMWY4LAorCTB4MjJhOCwgMHg4MTA4LCAweDA4MGMsIDB4MjJmYiwgMHgyMGExLCAweDAyNDAsIDB4MGM5OCwgMHgwODBjLAorCTB4MjJmYiwgMHgyMDYxLCAweDE5N2IsIDB4NjAwNCwgMHgyMGEwLCAweDYwMDgsIDB4MzUxOCwgMHg5MzEyLAorCTB4MTIxOCwgMHgyM2E4LCAweDQwMDMsIDB4MDA1OCwgMHgyMGE4LCAweDQwMDMsIDB4ODJmZiwgMHgwMTM4LAorCTB4MjJhOCwgMHg4MTA4LCAweDA4MGMsIDB4MjJmYiwgMHgyMGExLCAweDAyNDAsIDB4MGM5OCwgMHgyMDYxLAorCTB4MTk3YiwgMHgyMDE5LCAweDAyNjAsIDB4MzQwMCwgMHg5MzFlLCAweDAxMTAsIDB4NjAwNiwgMHgwMDIwLAorCTB4MjAwMSwgMHgwMjQwLCAweDYwMDYsIDB4ODEwOCwgMHgyMTYyLCAweDkyOTIsIDB4MDAyMSwgMHg5Mjk2LAorCTB4ZmZmZiwgMHg2MjBhLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMDY2LCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LCAweDk2YjQsIDB4ZmYwMCwgMHg4NjM3LAorCTB4OTY4NiwgMHgwMDA2LCAweDAxNzAsIDB4OTY4NiwgMHgwMDA0LCAweDAxNTgsIDB4YmUwNCwgMHg5NmI0LAorCTB4MDBmZiwgMHg5Njg2LCAweDAwMDYsIDB4MDEyOCwgMHg5Njg2LCAweDAwMDQsIDB4MDExMCwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4Y2M1MCwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGQ2LCAweDA4MGMsIDB4Y2M1ZCwgMHgxNTIwLCAweDY4MGMsIDB4OTA4YywgMHhmZjAwLAorCTB4NjgyMCwgMHg5MDg0LCAweDAwZmYsIDB4OTExNSwgMHg2MjE2LCAweDY4MjQsIDB4NjAyZSwgMHhkMWU0LAorCTB4MDEzMCwgMHg5MDA2LCAweDA4MGMsIDB4ZGI5ZCwgMHgyMDA5LCAweDAwMDEsIDB4MDA3OCwgMHhkMWVjLAorCTB4MDE4MCwgMHg2OTIwLCAweDkxOGMsIDB4MDBmZiwgMHg2ODI0LCAweDA4MGMsIDB4Mjc2ZSwgMHgxMTQ4LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4ZGI5ZCwgMHgyMTEwLCAweDkwMGUsIDB4MDgwYywgMHgzMWQ0LAorCTB4MDAxOCwgMHg5MDg1LCAweDAwMDEsIDB4MDAwOCwgMHg5MDA2LCAweDAwZGUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDBjNiwgMHgwODBjLCAweGExMzAsIDB4MDVhOCwgMHgwMDE2LCAweDAwMjYsIDB4MDBjNiwgMHgyMDExLAorCTB4MDI2MywgMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI3NmUsIDB4MTU3OCwgMHgwODBjLAorCTB4NjQzZiwgMHgxNTYwLCAweGJlMTIsIDB4YmQxNiwgMHgwMGNlLCAweDAwMmUsIDB4MDAxZSwgMHgyYjAwLAorCTB4NjAxMiwgMHgwODBjLCAweGRhODEsIDB4MTFkOCwgMHgwODBjLCAweDMyYWUsIDB4MTFjMCwgMHgwODBjLAorCTB4Y2JiOCwgMHgwNTEwLCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDYzZjAsIDB4MjAwMSwgMHgwMDA3LAorCTB4MDgwYywgMHg2NDFjLCAweDYwMTcsIDB4MDAwMCwgMHg2MDIzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDAxMCwgMHgwODBjLAorCTB4YTBlMywgMHg5MDg1LCAweDAwMDEsIDB4MDBjZSwgMHgwMGJlLCAweDAwMDUsIDB4MDgwYywgMHhhMGUzLAorCTB4MDBjZSwgMHgwMDJlLCAweDAwMWUsIDB4MGNhOCwgMHgwODBjLCAweGEwZTMsIDB4OTAwNiwgMHgwYzk4LAorCTB4MjA2OSwgMHgwMjZkLCAweDY4MDAsIDB4OTA4MiwgMHgwMDEwLCAweDEyMjgsIDB4NjAxNywgMHgwMDAwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMDA1LCAweDYwMTcsIDB4MDAwMCwgMHgyMDY5LAorCTB4MDI2YywgMHg2ODA4LCAweDkwODQsIDB4ZmYwMCwgMHg5MDg2LCAweDA4MDAsIDB4MTE5MCwgMHg2OTA0LAorCTB4OTE4NiwgMHgwMDE4LCAweDAxMTgsIDB4OTE4NiwgMHgwMDE0LCAweDExNTgsIDB4ODEwZiwgMHg2ODAwLAorCTB4OTA4NCwgMHgwMGZmLCAweDkxMGQsIDB4NjE1YSwgMHg5MDhlLCAweDAwMTQsIDB4MDExMCwgMHg5MDhlLAorCTB4MDAxMCwgMHgwMDA1LCAweDYwMDQsIDB4OTBiMiwgMHgwMDUzLCAweDFhMGMsIDB4MGRmYSwgMHg5MWI2LAorCTB4MDAxMywgMHgxMTMwLCAweDIwMDgsIDB4OTFiMiwgMHgwMDQwLCAweDFhMDQsIDB4Y2RhNSwgMHgwMDkyLAorCTB4OTFiNiwgMHgwMDI3LCAweDAxMjAsIDB4OTFiNiwgMHgwMDE0LCAweDE5MGMsIDB4MGRmYSwgMHgyMDAxLAorCTB4MDAwNywgMHgwODBjLCAweDY0MWMsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTExMywgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweGNjZGEsIDB4Y2NkYywgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RjLAorCTB4Y2NlYiwgMHhjZDllLCAweGNkM2QsIDB4Y2Q5ZSwgMHhjZDRmLCAweGNkOWUsIDB4Y2NlYiwgMHhjZDllLAorCTB4Y2Q5NiwgMHhjZDllLCAweGNkOTYsIDB4Y2Q5ZSwgMHhjZDllLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLAorCTB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLAorCTB4Y2NkYywgMHhjY2RhLCAweGNkOWUsIDB4Y2NkYSwgMHhjY2RhLCAweGNkOWUsIDB4Y2NkYSwgMHhjZDliLAorCTB4Y2Q5ZSwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLCAweGNkOWUsIDB4Y2Q5ZSwgMHhjY2RhLAorCTB4Y2Q5ZSwgMHhjZDllLCAweGNjZGEsIDB4Y2NlNiwgMHhjY2RhLCAweGNjZGEsIDB4Y2NkYSwgMHhjY2RhLAorCTB4Y2Q5YSwgMHhjZDllLCAweGNjZGEsIDB4Y2NkYSwgMHhjZDllLCAweGNkOWUsIDB4Y2NkYSwgMHhjY2RhLAorCTB4Y2NkYSwgMHhjY2RhLCAweDA4MGMsIDB4MGRmYSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHhjNTUxLAorCTB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4OGMxMCwgMHgwODA0LCAweGNkYTQsIDB4OTAwNiwgMHgwODBjLAorCTB4NjNkYywgMHgwODA0LCAweGNkOWUsIDB4MDgwYywgMHg2N2JiLCAweDE5MDQsIDB4Y2Q5ZSwgMHg5MDA2LAorCTB4MDgwYywgMHg2M2RjLCAweDYwMTAsIDB4MjA1OCwgMHhiODEwLCAweDkwODYsIDB4MDBmZiwgMHgxMTQwLAorCTB4MDBmNiwgMHgyMDc5LCAweDE4MDAsIDB4NzhhNCwgMHg4MDAwLCAweDc4YTYsIDB4MDBmZSwgMHgwNDI4LAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YjAsIDB4OTAwNSwgMHgxMTc4LCAweDA4MGMsIDB4YzUzOSwgMHgxOTA0LAorCTB4Y2Q5ZSwgMHgwMDM2LCAweDAwNDYsIDB4YmJhMCwgMHgyMDIxLCAweDAwMDcsIDB4MDgwYywgMHg0Y2JjLAorCTB4MDA0ZSwgMHgwMDNlLCAweDA4MDQsIDB4Y2Q5ZSwgMHgwODBjLCAweDMyZGYsIDB4MTkwNCwgMHhjZDllLAorCTB4MjAwMSwgMHgxODAwLCAweDIwMDQsIDB4OTA4NiwgMHgwMDAyLCAweDExMzgsIDB4MDBmNiwgMHgyMDc5LAorCTB4MTgwMCwgMHg3OGE0LCAweDgwMDAsIDB4NzhhNiwgMHgwMGZlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLAorCTB4NjNmMCwgMHgwODBjLCAweDhiMDQsIDB4NjAyMywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDAwMiwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLCAweDYxMTAsIDB4MjE1OCwgMHgyMDA5LAorCTB4MDAwMSwgMHgwODBjLCAweDgyZTgsIDB4MDgwNCwgMHhjZGE0LCAweDY2MTAsIDB4MjY1OCwgMHhiZTA0LAorCTB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwgMHgwMDA2LCAweDA5MDQsIDB4Y2Q5ZSwgMHg5Njg2LAorCTB4MDAwNCwgMHgwOTA0LCAweGNkOWUsIDB4MjAwMSwgMHgwMDA0LCAweDA4MDQsIDB4Y2Q5YywgMHgyMDAxLAorCTB4MTgwMCwgMHgyMDA0LCAweDkwODYsIDB4MDAwMywgMHgxMTU4LCAweDAwMzYsIDB4MDA0NiwgMHg2MDEwLAorCTB4MjA1OCwgMHhiYmEwLCAweDIwMjEsIDB4MDAwNiwgMHgwODBjLCAweDRjYmMsIDB4MDA0ZSwgMHgwMDNlLAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4Y2RjMiwgMHg2NjEwLCAweDI2NTgsIDB4YmUwNCwgMHgwMDY2LAorCTB4OTZiNCwgMHhmZjAwLCAweDg2MzcsIDB4OTY4NiwgMHgwMDA2LCAweDAwNmUsIDB4MDE2OCwgMHgyMDAxLAorCTB4MDAwNiwgMHgwODBjLCAweDY0MWMsIDB4OTI4NCwgMHgwMGZmLCAweDkwOGUsIDB4MDAwNywgMHgxMTIwLAorCTB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NjNmMCwgMHgwODBjLCAweDY3YmIsIDB4MTFmOCwgMHgyMDAxLAorCTB4MTgzNiwgMHgyMDA0LCAweGQwYTQsIDB4MDFkMCwgMHhiZTA0LCAweDk2YjQsIDB4MDBmZiwgMHg5Njg2LAorCTB4MDAwNiwgMHgwMWEwLCAweDAwZjYsIDB4MjA3OSwgMHgxODAwLCAweDc4YTQsIDB4ODAwMCwgMHg3OGE2LAorCTB4MDBmZSwgMHgwODA0LCAweGNkMjUsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzAsIDB4MjAwMSwgMHgwMDA2LAorCTB4MDQ0OSwgMHgwMDIwLCAweDAwMTgsIDB4MDAxMCwgMHgwODBjLCAweDY0MWMsIDB4MDgwYywgMHg4YjA0LAorCTB4MDgwYywgMHhhMGUzLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHhjZGI5LAorCTB4Y2RiOSwgMHhjZGI5LCAweGNkYjksIDB4Y2RiOSwgMHhjZGJiLCAweGNkYjksIDB4Y2RiOSwgMHhjZGI5LAorCTB4Y2RiOSwgMHhjZGJiLCAweGNkYjksIDB4Y2RiOSwgMHhjZGI5LCAweGNkYmIsIDB4Y2RiYiwgMHhjZGJiLAorCTB4Y2RiYiwgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTBlMywgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDAwMTYsIDB4MDBiNiwgMHgwMGQ2LCAweDYxMTAsIDB4MjE1OCwgMHhiOTAwLAorCTB4ZDE4NCwgMHgwMTM4LCAweDA4MGMsIDB4NjNmMCwgMHg5MDA2LCAweDA4MGMsIDB4NjNkYywgMHgwODBjLAorCTB4MzFiNCwgMHgwMGRlLCAweDAwYmUsIDB4MDAxZSwgMHgwMDA1LCAweDY2MTAsIDB4MjY1OCwgMHhiODA0LAorCTB4OTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4OTBiMiwgMHgwMDBjLCAweDFhMGMsIDB4MGRmYSwgMHg5MWI2LAorCTB4MDAxNSwgMHgxMTEwLCAweDAwM2IsIDB4MDAyOCwgMHg5MWI2LCAweDAwMTYsIDB4MTkwYywgMHgwZGZhLAorCTB4MDA2YiwgMHgwMDA1LCAweGFiNjIsIDB4YWI2MiwgMHhhYjYyLCAweGFiNjIsIDB4Y2U1NywgMHhhYjYyLAorCTB4Y2U0MSwgMHhjZTAyLCAweGFiNjIsIDB4YWI2MiwgMHhhYjYyLCAweGFiNjIsIDB4YWI2MiwgMHhhYjYyLAorCTB4YWI2MiwgMHhhYjYyLCAweGNlNTcsIDB4YWI2MiwgMHhjZTQxLCAweGNlNDgsIDB4YWI2MiwgMHhhYjYyLAorCTB4YWI2MiwgMHhhYjYyLCAweDAwZjYsIDB4MDgwYywgMHg2N2JiLCAweDExZDgsIDB4MDgwYywgMHhjNTM5LAorCTB4MTFjMCwgMHg2MDEwLCAweDkwNWQsIDB4MDFhOCwgMHhiOGIwLCAweDkwMDUsIDB4MDE5MCwgMHg5MDA2LAorCTB4MDgwYywgMHg2M2RjLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDYzZjAsIDB4NjAyMywgMHgwMDAxLAorCTB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDg2YzEsIDB4MDgwYywgMHg4YzEwLAorCTB4MDBmMCwgMHgyMDExLCAweDAyNjMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNzZlLAorCTB4MTFiMCwgMHgwODBjLCAweDY0OWYsIDB4MDExOCwgMHgwODBjLCAweGEwZTMsIDB4MDA4MCwgMHhiODEwLAorCTB4MDAwNiwgMHhiODE0LCAweDAwMDYsIDB4YjhiMCwgMHgwMDA2LCAweDA4MGMsIDB4NWY0NSwgMHgwMDBlLAorCTB4YjhiMiwgMHgwMDBlLCAweGI4MTYsIDB4MDAwZSwgMHhiODEyLCAweDA4MGMsIDB4YTBlMywgMHgwMGZlLAorCTB4MDAwNSwgMHg2NjA0LCAweDk2YjYsIDB4MDAxZSwgMHgxMTEwLCAweDA4MGMsIDB4YTBlMywgMHgwMDA1LAorCTB4MDgwYywgMHhhZjQ4LCAweDExNDgsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLAorCTB4ODZjMSwgMHgwODBjLCAweDhjMTAsIDB4MDAxMCwgMHgwODBjLCAweGEwZTMsIDB4MDAwNSwgMHgwODA0LAorCTB4YTBlMywgMHg2MDA0LCAweDkwOGEsIDB4MDA1MywgMHgxYTBjLCAweDBkZmEsIDB4MDgwYywgMHg4YjA0LAorCTB4MDgwYywgMHhhMTEzLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDkxODIsIDB4MDA0MCwgMHgwMDAyLAorCTB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywgMHhjZTdlLCAweGNlN2MsIDB4Y2U3YywgMHhjZTdjLAorCTB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywgMHhjZTdjLAorCTB4Y2U3YywgMHhjZTdjLCAweGNlN2MsIDB4Y2U3YywgMHgwODBjLCAweDBkZmEsIDB4MDA5NiwgMHgwMGI2LAorCTB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MDA0NiwgMHgwMDI2LCAweDYyMTAsIDB4MjI1OCwgMHhiOGFjLAorCTB4OTAwNSwgMHgxMWE4LCAweDYxMDYsIDB4MjA3MSwgMHgwMjYwLCAweDc0NDQsIDB4OTRhNCwgMHhmZjAwLAorCTB4MDkwNCwgMHhjZWU0LCAweDA4MGMsIDB4ZGI5MSwgMHgxMTcwLCAweDk0ODYsIDB4MjAwMCwgMHgxMTU4LAorCTB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDIwMCwgMHgwODBjLCAweDg0ZDEsIDB4MDAyMCwgMHg5MDI2LAorCTB4MDgwYywgMHhkYWM2LCAweDBjMzgsIDB4MDgwYywgMHgxMDMxLCAweDA5MGMsIDB4MGRmYSwgMHg2MDAzLAorCTB4MDAwNywgMHhhODY3LCAweDAxMGQsIDB4OTAwNiwgMHhhODAyLCAweGE4NmEsIDB4YWM4YSwgMHgyYzAwLAorCTB4YTg4ZSwgMHg2MDA4LCAweGE4ZTIsIDB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4NzEzMCwgMHhhOTdhLAorCTB4MDAxNiwgMHhhODc2LCAweGE4N2YsIDB4MDAwMCwgMHhhODgzLCAweDAwMDAsIDB4YTg4NywgMHgwMDM2LAorCTB4MDgwYywgMHg2YWU5LCAweDAwMWUsIDB4MDgwYywgMHhkYjkxLCAweDE5MDQsIDB4Y2Y0NCwgMHg5NDg2LAorCTB4MjAwMCwgMHgxMTMwLCAweDIwMTksIDB4MDAxNywgMHgwODBjLCAweGQ4MDEsIDB4MDgwNCwgMHhjZjQ0LAorCTB4OTQ4NiwgMHgwMjAwLCAweDExMjAsIDB4MDgwYywgMHhkNzlkLCAweDA4MDQsIDB4Y2Y0NCwgMHg5NDg2LAorCTB4MDQwMCwgMHgwMTIwLCAweDk0ODYsIDB4MTAwMCwgMHgxOTA0LCAweGNmNDQsIDB4MjAxOSwgMHgwMDAyLAorCTB4MDgwYywgMHhkN2I4LCAweDA4MDQsIDB4Y2Y0NCwgMHgyMDY5LCAweDFhNDgsIDB4NmEwMCwgMHhkMjg0LAorCTB4MDkwNCwgMHhjZmFlLCAweDkyODQsIDB4MDMwMCwgMHgxOTA0LCAweGNmYTcsIDB4NjgwNCwgMHg5MDA1LAorCTB4MDkwNCwgMHhjZjhmLCAweDJkNzgsIDB4NjAwMywgMHgwMDA3LCAweDA4MGMsIDB4MTA0YSwgMHgwOTA0LAorCTB4Y2Y1MCwgMHg3ODAwLCAweGQwOGMsIDB4MTExOCwgMHg3ODA0LCAweDgwMDEsIDB4NzgwNiwgMHg2MDE3LAorCTB4MDAwMCwgMHgyMDAxLCAweDE4MGYsIDB4MjAwNCwgMHhkMDg0LCAweDE5MDQsIDB4Y2ZiMiwgMHg5MDA2LAorCTB4YTgwMiwgMHhhODY3LCAweDAxMTYsIDB4YTg2YSwgMHg2MDA4LCAweGE4ZTIsIDB4MmMwMCwgMHhhODdhLAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YTAsIDB4NzEzMCwgMHhhOWI2LCAweGE4NzYsIDB4YjkyOCwgMHhhOWJhLAorCTB4YjkyYywgMHhhOWJlLCAweGI5MzAsIDB4YTljMiwgMHhiOTM0LCAweGE5YzYsIDB4YTg4MywgMHgwMDNkLAorCTB4NzA0NCwgMHg5MDg0LCAweDAwMDMsIDB4OTA4MCwgMHhjZjRjLCAweDIwMDUsIDB4YTg3ZSwgMHgyMGE5LAorCTB4MDAwYSwgMHgyMDAxLCAweDAyNzAsIDB4YWE1YywgMHg5MjkwLCAweDAwMjEsIDB4MjAwOSwgMHgwMjA1LAorCTB4MjAwYiwgMHgwMDgwLCAweDIwZTEsIDB4MDAwMCwgMHhhYjYwLCAweDIzZTgsIDB4MjA5OCwgMHgyMmEwLAorCTB4NDAwMywgMHgyMDBiLCAweDAwMDAsIDB4MjAwMSwgMHgwMjdhLCAweDIwMGMsIDB4YTliMiwgMHg4MDAwLAorCTB4MjAwYywgMHhhOWFlLCAweDA4MGMsIDB4NmFlOSwgMHgwMDJlLCAweDAwNGUsIDB4MDBmZSwgMHgwMGVlLAorCTB4MDBkZSwgMHgwMGJlLCAweDAwOWUsIDB4MDAwNSwgMHgwMDAwLCAweDAwODAsIDB4MDA0MCwgMHgwMDAwLAorCTB4MjAwMSwgMHgxODEwLCAweDIwMDQsIDB4ZDA4NCwgMHgwMTIwLCAweDA4MGMsIDB4MTAzMSwgMHgxOTA0LAorCTB4Y2VmOSwgMHg2MDE3LCAweGYxMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLAorCTB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MGMwMCwgMHgyMDY5LCAweDAyNjAsIDB4Njg0OCwgMHg5MDg0LAorCTB4ZmYwMCwgMHg5MDg2LCAweDEyMDAsIDB4MTE5OCwgMHg2ODZjLCAweDkwODQsIDB4MDBmZiwgMHgwMDE2LAorCTB4NjExNCwgMHg5MThjLCAweGY3MDAsIDB4OTEwZCwgMHg2MTE2LCAweDAwMWUsIDB4NjAwMywgMHgwMDAxLAorCTB4NjAwNywgMHgwMDQzLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDgyOCwgMHg2ODY4LAorCTB4NjAyZSwgMHg2ODZjLCAweDYwMzIsIDB4NjAxNywgMHhmMjAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA0MSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4Y2Y0NCwgMHgyMDAxLAorCTB4MTgwZSwgMHgyMDA0LCAweGQwZWMsIDB4MDEyMCwgMHgyMDExLCAweDgwNDksIDB4MDgwYywgMHg0YjFmLAorCTB4NjAxNywgMHhmMzAwLCAweDAwMTAsIDB4NjAxNywgMHhmMTAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LAorCTB4MDA0MSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDA4MDQsIDB4Y2Y0NCwgMHg2MDE3LAorCTB4ZjUwMCwgMHgwYzk4LCAweDYwMTcsIDB4ZjYwMCwgMHgwODA0LCAweGNmNjQsIDB4NjAxNywgMHhmMjAwLAorCTB4MDgwNCwgMHhjZjY0LCAweGE4NjcsIDB4MDE0NiwgMHhhODZiLCAweDAwMDAsIDB4NjAwOCwgMHhhODg2LAorCTB4MmMwMCwgMHhhODdhLCAweDcwNDQsIDB4OTA4NCwgMHgwMDAzLCAweDkwODAsIDB4Y2Y0YywgMHgyMDA1LAorCTB4YTg3ZSwgMHgyOTI4LCAweDYwMTAsIDB4MjA1OCwgMHhiOGEwLCAweGE4NzYsIDB4YjgyOCwgMHhhODhhLAorCTB4YjgyYywgMHhhODhlLCAweGI4MzAsIDB4YTg5MiwgMHhiODM0LCAweGE4OTYsIDB4YTg4MywgMHgwMDNkLAorCTB4MjAwOSwgMHgwMjA1LCAweDIxMDQsIDB4OTA4NSwgMHgwMDgwLCAweDIwMGEsIDB4MjBlMSwgMHgwMDAwLAorCTB4MjAxMSwgMHgwMjEwLCAweDIyMTQsIDB4OTI5NCwgMHgwZmZmLCAweGFhYTIsIDB4OTI4MiwgMHgwMTExLAorCTB4MWEwYywgMHgwZGZhLCAweDgyMTAsIDB4ODIxYywgMHgyMDAxLCAweDAyNmMsIDB4MjA5OCwgMHhhODYwLAorCTB4MjBlOCwgMHhhODVjLCAweDkwODAsIDB4MDAyOSwgMHgyMGEwLCAweDIwMTEsIDB4ZDAyZSwgMHgyMDQxLAorCTB4MDAwMSwgMHgyMjNkLCAweDk3ODQsIDB4MDBmZiwgMHg5MzIyLCAweDEyMDgsIDB4MjMwMCwgMHgyMGE4LAorCTB4NDAwMywgMHg5MzFhLCAweDA1MzAsIDB4ODIxMCwgMHhkN2ZjLCAweDExMzAsIDB4OGQ2OCwgMHgyZDBhLAorCTB4MjAwMSwgMHgwMjYwLCAweDIwOTgsIDB4MGM2OCwgMHgyOTUwLCAweDA4MGMsIDB4MTA0YSwgMHgwMTcwLAorCTB4MjkwMCwgMHhiMDAyLCAweGE4NjcsIDB4MDE0NywgMHhhODZiLCAweDAwMDAsIDB4YTg2MCwgMHgyMGU4LAorCTB4YTg1YywgMHg5MDgwLCAweDAwMWIsIDB4MjBhMCwgMHg4ODQwLCAweDA4ZDgsIDB4MjU0OCwgMHhhODAwLAorCTB4OTAyZCwgMHgwMTE4LCAweDA4MGMsIDB4MTA2MywgMHgwY2M4LCAweDA4MGMsIDB4MTA2MywgMHgwODA0LAorCTB4Y2Y1MCwgMHgyNTQ4LCAweDg4NDcsIDB4OTg4NSwgMHgwMDQ2LCAweGE4NjYsIDB4MjAwOSwgMHgwMjA1LAorCTB4MjAwYiwgMHgwMDAwLCAweDA4MGMsIDB4ZDgzMCwgMHgwODA0LCAweGNmNDQsIDB4ODAxMCwgMHgwMDA0LAorCTB4ODAxYSwgMHgwMDA2LCAweDgwMTgsIDB4MDAwOCwgMHg4MDE2LCAweDAwMGEsIDB4ODAxNCwgMHg5MTg2LAorCTB4MDAxMywgMHgxMTYwLCAweDYwMDQsIDB4OTA4YSwgMHgwMDU0LCAweDFhMGMsIDB4MGRmYSwgMHg5MDgyLAorCTB4MDA0MCwgMHgwYTBjLCAweDBkZmEsIDB4MjAwOCwgMHgwODA0LCAweGQwZTAsIDB4OTE4NiwgMHgwMDUxLAorCTB4MDEwOCwgMHgwMGMwLCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwODQsIDB4MDkwNCwgMHhkMDkwLAorCTB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg4NTYzLAorCTB4MDAyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHg2MDAwLCAweDkwODYsIDB4MDAwMiwgMHgxNTgwLAorCTB4MDgwNCwgMHhkMTI5LCAweDkxODYsIDB4MDAyNywgMHgwNTMwLCAweDkxODYsIDB4MDA0OCwgMHgwMTI4LAorCTB4OTE4NiwgMHgwMDE0LCAweDA1MDAsIDB4MTkwYywgMHgwZGZhLCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LAorCTB4ZDA4NCwgMHgwMWYwLCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDI4MDAsIDB4MDBjNiwgMHgyMDYxLAorCTB4MDEwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDg1NjMsIDB4MDAyZSwgMHgwMDFlLAorCTB4MDAwZSwgMHgwMGNlLCAweDAxMmUsIDB4MDBjZSwgMHg2MDAwLCAweDkwODYsIDB4MDAwNCwgMHgxOTBjLAorCTB4MGRmYSwgMHgwODA0LCAweGQyMGMsIDB4NjAwNCwgMHg5MDgyLCAweDAwNDAsIDB4MjAwOCwgMHgwMDFhLAorCTB4MDgwYywgMHhhMTc4LCAweDAwMDUsIDB4ZDBhNywgMHhkMGE5LCAweGQwYTksIDB4ZDBkMCwgMHhkMGE3LAorCTB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywgMHhkMGE3LAorCTB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywgMHhkMGE3LCAweGQwYTcsIDB4ZDBhNywgMHgwODBjLAorCTB4MGRmYSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHg4YzEwLCAweDAwMzYsIDB4MDA5NiwgMHg2MDE0LAorCTB4OTA0ZCwgMHgwMWQ4LCAweDA4MGMsIDB4YmUzNywgMHgwMWMwLCAweDYwMDMsIDB4MDAwMiwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGJjLCAweDExNzgsIDB4MjAxOSwgMHgwMDA0LAorCTB4MDgwYywgMHhkODMwLCAweDYwMTcsIDB4MDAwMCwgMHg2MDE4LCAweDkwMDUsIDB4MTEyMCwgMHgyMDAxLAorCTB4MTk1ZiwgMHgyMDA0LCAweDYwMWEsIDB4NjAwMywgMHgwMDA3LCAweDAwOWUsIDB4MDAzZSwgMHgwMDA1LAorCTB4MDA5NiwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHg4YzEwLCAweDA4MGMsIDB4YmUzNywgMHgwMTIwLAorCTB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4MTA2MywgMHgwODBjLCAweGExMTMsIDB4MDA5ZSwgMHgwMDA1LAorCTB4MDAwMiwgMHhkMGY1LCAweGQxMGMsIDB4ZDBmNywgMHhkMTIzLCAweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LAorCTB4ZDBmNSwgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LAorCTB4ZDBmNSwgMHhkMGY1LCAweGQwZjUsIDB4ZDBmNSwgMHhkMGY1LCAweDA4MGMsIDB4MGRmYSwgMHgwMDk2LAorCTB4MDgwYywgMHg4YjA0LCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLCAweGQwYjQsIDB4MDEzOCwgMHg2MDAzLAorCTB4MDAwNywgMHgyMDA5LCAweDAwNDMsIDB4MDgwYywgMHhhMTVkLCAweDAwMTAsIDB4NjAwMywgMHgwMDA0LAorCTB4MDgwYywgMHg4YzEwLCAweDAwOWUsIDB4MDAwNSwgMHgwODBjLCAweDhiMDQsIDB4MDgwYywgMHhiZTM3LAorCTB4MDEzOCwgMHg2MTE0LCAweDAwOTYsIDB4MjE0OCwgMHhhOTdjLCAweDAwOWUsIDB4ZDFlYywgMHgxMTM4LAorCTB4MDgwYywgMHg4NGE2LCAweDA4MGMsIDB4YTBlMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHgwODBjLAorCTB4ZGE4YSwgMHgwZGIwLCAweDBjYzgsIDB4MDgwYywgMHg4YjA0LCAweDIwMDksIDB4MDA0MSwgMHgwODA0LAorCTB4ZDI5NCwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwgMHhkMTQwLCAweGQxNDIsIDB4ZDE0MCwgMHhkMTQwLAorCTB4ZDE0MCwgMHhkMTQwLCAweGQxNDAsIDB4ZDE0MCwgMHhkMTQwLCAweGQxNDAsIDB4ZDE0MCwgMHhkMTQwLAorCTB4ZDE0MCwgMHhkMTQwLCAweGQxNDAsIDB4ZDE0MCwgMHhkMTQwLCAweGQxNDMsIDB4ZDE0MCwgMHhkMTQwLAorCTB4MDgwYywgMHgwZGZhLCAweDAwMDUsIDB4MDBkNiwgMHgwODBjLCAweDg0YTYsIDB4MDBkZSwgMHgwODBjLAorCTB4ZGFlMiwgMHgwODBjLCAweGEwZTMsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwgMHhkMTYzLAorCTB4ZDE2MywgMHhkMTYzLCAweGQxNjMsIDB4ZDE2MywgMHhkMTYzLCAweGQxNjMsIDB4ZDE2MywgMHhkMTYzLAorCTB4ZDE2NSwgMHhkMWQ0LCAweGQxNjMsIDB4ZDE2MywgMHhkMTYzLCAweGQxNjMsIDB4ZDFkNCwgMHhkMTYzLAorCTB4ZDE2MywgMHhkMTYzLCAweGQxNjMsIDB4MDgwYywgMHgwZGZhLCAweDIwMDEsIDB4MDEwNSwgMHgyMDA0LAorCTB4OTA4NCwgMHgxODAwLCAweDAxYzgsIDB4MjAwMSwgMHgwMTMyLCAweDIwMGMsIDB4MjAwMSwgMHgwMTMxLAorCTB4MjAwNCwgMHg5MTA1LCAweDE5MDQsIDB4ZDFkNCwgMHgyMDA5LCAweDE4MGMsIDB4MjEwNCwgMHhkMGQ0LAorCTB4MDkwNCwgMHhkMWQ0LCAweGMwZDQsIDB4MjAwYSwgMHgyMDA5LCAweDAxMDUsIDB4MjEwNCwgMHg5MDg0LAorCTB4ZTdmZCwgMHg5MDg1LCAweDAwMTAsIDB4MjAwYSwgMHgyMDAxLCAweDE4N2IsIDB4MjAwNCwgMHhkMGU0LAorCTB4MTUyOCwgMHg2MDNiLCAweDAwMDAsIDB4MDgwYywgMHg4YmMwLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTg3YywgMHhkMGZjLCAweDAxODgsIDB4OTA4YywgMHgwMDAzLCAweDkxOGUsIDB4MDAwMiwgMHgwNTA4LAorCTB4MjAwMSwgMHgxODBjLCAweDIwMDQsIDB4ZDBkNCwgMHgxMWUwLCAweDA4MGMsIDB4OGNlZCwgMHgyMDA5LAorCTB4MDA0MSwgMHgwMDllLCAweDA4MDQsIDB4ZDI5NCwgMHgwODBjLCAweDhjZWQsIDB4NjAwMywgMHgwMDA3LAorCTB4NjAxYiwgMHgwMDAwLCAweDA4MGMsIDB4ODRhNiwgMHgwMDllLCAweDAwMDUsIDB4MjAwMSwgMHgwMTAwLAorCTB4MjAwNCwgMHg5MDgyLCAweDAwMDUsIDB4MGFhOCwgMHgyMDAxLCAweDAxMWYsIDB4MjAwNCwgMHg2MDNhLAorCTB4MDg5MCwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWQ0LCAweDIxMDIsIDB4ZDFjYywgMHgwMTEwLAorCTB4MDgwYywgMHgyYmNhLCAweDA4MGMsIDB4OGNlZCwgMHg2MDE0LCAweDIwNDgsIDB4YTk3YywgMHhkMWVjLAorCTB4MTEzMCwgMHgwODBjLCAweDg0YTYsIDB4MDgwYywgMHhhMGUzLCAweDAwOWUsIDB4MDAwNSwgMHgwODBjLAorCTB4ZGE4YSwgMHgwZGI4LCAweDAwOWUsIDB4MDAwNSwgMHgyMDAxLCAweDE4MGMsIDB4MjAwYywgMHhjMWQ0LAorCTB4MjEwMiwgMHgwMDM2LCAweDA4MGMsIDB4OGJjMCwgMHgwODBjLCAweDhjZWQsIDB4NjAxNCwgMHgwMDk2LAorCTB4MjA0OCwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiODAwLCAweDAwYmUsIDB4ZDBiYywgMHgwMTg4LAorCTB4YTg3YywgMHg5MDg0LCAweDAwMDMsIDB4OTA4NiwgMHgwMDAyLCAweDAxNDAsIDB4YThhYywgMHg2MzMwLAorCTB4OTMxYSwgMHg2MzMyLCAweGE4YjAsIDB4NjMyYywgMHg5MzFiLCAweDYzMmUsIDB4NjAwMywgMHgwMDAyLAorCTB4MDA4MCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhkODMwLCAweDYwMTgsIDB4OTAwNSwgMHgxMTI4LAorCTB4MjAwMSwgMHgxOTVmLCAweDIwMDQsIDB4ODAwMywgMHg2MDFhLCAweDYwMTcsIDB4MDAwMCwgMHg2MDAzLAorCTB4MDAwNywgMHgwMDllLCAweDAwM2UsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDAwMiwgMHhkMjIzLAorCTB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywgMHhkMjI1LAorCTB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywgMHhkMjIzLCAweGQyMjMsIDB4ZDIyMywgMHhkMjIzLAorCTB4ZDIyMywgMHhkMjIzLCAweGQyNzAsIDB4MDgwYywgMHgwZGZhLCAweDYwMTQsIDB4MDA5NiwgMHgyMDQ4LAorCTB4YTgzNCwgMHhhYTM4LCAweDYxMTAsIDB4MDBiNiwgMHgyMTU4LCAweGI5MDAsIDB4MDBiZSwgMHhkMWJjLAorCTB4MTE5MCwgMHg5MjBkLCAweDE1MTgsIDB4YTg3YywgMHhkMGZjLCAweDAxMjgsIDB4MjAwOSwgMHgwMDQxLAorCTB4MDA5ZSwgMHgwODA0LCAweGQyOTQsIDB4NjAwMywgMHgwMDA3LCAweDYwMWIsIDB4MDAwMCwgMHgwODBjLAorCTB4ODRhNiwgMHgwMDllLCAweDAwMDUsIDB4NjEyNCwgMHhkMWY0LCAweDFkNTgsIDB4MDAwNiwgMHgwMDQ2LAorCTB4YWNhYywgMHg5NDIyLCAweGE5YjAsIDB4MjIwMCwgMHg5MTBiLCAweDYwMzAsIDB4OTQyMCwgMHg2NDMyLAorCTB4NjAyYywgMHg5MTA5LCAweDYxMmUsIDB4MDA0ZSwgMHgwMDBlLCAweDA4ZDgsIDB4NjExMCwgMHgwMGI2LAorCTB4MjE1OCwgMHhiOTAwLCAweDAwYmUsIDB4ZDFiYywgMHgxMTc4LCAweDIwMDksIDB4MTgwZSwgMHgyMTBjLAorCTB4ZDE5YywgMHgwMTE4LCAweDYwMDMsIDB4MDAwNywgMHgwMDEwLCAweDYwMDMsIDB4MDAwNiwgMHgwMGU5LAorCTB4MDgwYywgMHg4NGE4LCAweDAwOWUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDIsIDB4MDA5ZSwgMHgwMDA1LAorCTB4NjAyNCwgMHhkMGY0LCAweDAxMjgsIDB4MDgwYywgMHgxNTgyLCAweDE5MDQsIDB4ZDIyNSwgMHgwMDA1LAorCTB4NjAxNCwgMHgwMDk2LCAweDIwNDgsIDB4YTgzNCwgMHhhOTM4LCAweDAwOWUsIDB4OTEwNSwgMHgxMTIwLAorCTB4MDgwYywgMHgxNTgyLCAweDE5MDQsIDB4ZDIyNSwgMHgwMDA1LCAweGQyZmMsIDB4MDE0MCwgMHg4MDAyLAorCTB4ODAwMCwgMHg4MjEyLCAweDkyOTEsIDB4MDAwMCwgMHgyMDA5LCAweDAwMDksIDB4MDAxMCwgMHgyMDA5LAorCTB4MDAxNSwgMHhhYTlhLCAweGE4OTYsIDB4MDAwNSwgMHg5MTgyLCAweDAwNDAsIDB4MDIwOCwgMHgwMDYyLAorCTB4OTE4NiwgMHgwMDEzLCAweDAxMjAsIDB4OTE4NiwgMHgwMDE0LCAweDE5MGMsIDB4MGRmYSwgMHg2MDI0LAorCTB4ZDBkYywgMHgwOTBjLCAweDBkZmEsIDB4MDAwNSwgMHhkMmI4LCAweGQyYzQsIDB4ZDJkMCwgMHhkMmRjLAorCTB4ZDJiOCwgMHhkMmI4LCAweGQyYjgsIDB4ZDJiOCwgMHhkMmJmLCAweGQyYmEsIDB4ZDJiYSwgMHhkMmI4LAorCTB4ZDJiOCwgMHhkMmI4LCAweGQyYjgsIDB4ZDJiYSwgMHhkMmI4LCAweGQyYmEsIDB4ZDJiOCwgMHhkMmJmLAorCTB4MDgwYywgMHgwZGZhLCAweDYwMjQsIDB4ZDBkYywgMHgwOTBjLCAweDBkZmEsIDB4MDAwNSwgMHg2MDE0LAorCTB4OTAwNSwgMHgxOTBjLCAweDBkZmEsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLAorCTB4ODY3OSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDhjMTAsIDB4MDEyZSwgMHgwMDA1LAorCTB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg4Njc5LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MDgwYywgMHg4YzEwLCAweDAxMmUsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLAorCTB4MDgwYywgMHgxYWZlLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4ODZkZSwgMHgwODBjLAorCTB4OGNlZCwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDAzNiwgMHgwMDk2LAorCTB4OTE4MiwgMHgwMDQwLCAweDAwMjMsIDB4MDA5ZSwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwgMHhkMzBiLAorCTB4ZDMwZCwgMHhkMzFmLCAweGQzMzksIDB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLAorCTB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4ZDMwYiwgMHhkMzBiLAorCTB4ZDMwYiwgMHhkMzBiLCAweGQzMGIsIDB4MDgwYywgMHgwZGZhLCAweDYwMTQsIDB4MjA0OCwgMHhhODdjLAorCTB4ZDBmYywgMHgwMWY4LCAweDkwOWMsIDB4MDAwMywgMHg5MzllLCAweDAwMDMsIDB4MDFkMCwgMHg2MDAzLAorCTB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDQ3MCwgMHg2MDE0LAorCTB4MjA0OCwgMHhhODdjLCAweGQwZmMsIDB4MDE2OCwgMHg5MDljLCAweDAwMDMsIDB4OTM5ZSwgMHgwMDAzLAorCTB4MDE0MCwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLAorCTB4MDBlMCwgMHg5MDFlLCAweDYzMTYsIDB4NjMxYSwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhkODMwLAorCTB4MDBhMCwgMHg2MDE0LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDBkOTgsIDB4OTA5YywgMHgwMDAzLAorCTB4OTM5ZSwgMHgwMDAzLCAweDBkNzAsIDB4NjAwMywgMHgwMDAzLCAweDYxMDYsIDB4MmMxMCwgMHgwODBjLAorCTB4MWFmZSwgMHgwODBjLCAweDg2ZGUsIDB4MDgwYywgMHg4Y2VkLCAweDAwMDUsIDB4MDgwYywgMHg4YjA0LAorCTB4NjExNCwgMHg4MWZmLCAweDAxNTgsIDB4MDA5NiwgMHgyMTQ4LCAweDA4MGMsIDB4ZGIyZSwgMHgwMDM2LAorCTB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4ZDgzMCwgMHgwMDNlLCAweDAwOWUsIDB4MDgwYywgMHhhMTEzLAorCTB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDgwYywgMHg4YmMwLCAweDYxMTQsIDB4ODFmZiwgMHgwMTU4LAorCTB4MDA5NiwgMHgyMTQ4LCAweDA4MGMsIDB4ZGIyZSwgMHgwMDM2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLAorCTB4ZDgzMCwgMHgwMDNlLCAweDAwOWUsIDB4MDgwYywgMHhhMTEzLCAweDA4MGMsIDB4OGNlZCwgMHgwMDA1LAorCTB4OTE4MiwgMHgwMDg1LCAweDAwMDIsIDB4ZDM4YSwgMHhkMzg4LCAweGQzODgsIDB4ZDM5NiwgMHhkMzg4LAorCTB4ZDM4OCwgMHhkMzg4LCAweGQzODgsIDB4ZDM4OCwgMHhkMzg4LCAweGQzODgsIDB4ZDM4OCwgMHhkMzg4LAorCTB4MDgwYywgMHgwZGZhLCAweDYwMDMsIDB4MDAwYiwgMHg2MTA2LCAweDA4MGMsIDB4ODY3OSwgMHgwMTI2LAorCTB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4OGMxMCwgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwgMHgwMGU2LAorCTB4MDgwYywgMHhkYTgxLCAweDAxMTgsIDB4MDgwYywgMHhhMGUzLCAweDA0NTAsIDB4MjA3MSwgMHgwMjYwLAorCTB4NzIyNCwgMHg2MjE2LCAweDIwMDEsIDB4MTgwZSwgMHgyMDA0LCAweGQwZTQsIDB4MDE1MCwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGJjYTAsIDB4MDBiZSwgMHgyYzAwLCAweDIwMTEsIDB4MDE0ZSwgMHgwODBjLAorCTB4YTQwMywgMHg3MjIwLCAweDA4MGMsIDB4ZDZkNiwgMHgwMTE4LCAweDYwMDcsIDB4MDA4NiwgMHgwMDQwLAorCTB4NjAwNywgMHgwMDg3LCAweDcyMjQsIDB4OTI5NiwgMHhmZmZmLCAweDExMTAsIDB4NjAwNywgMHgwMDg2LAorCTB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLCAweDhjMTAsIDB4MDgwYywgMHg4Y2VkLAorCTB4MDBlZSwgMHgwMDJlLCAweDAwMDUsIDB4OTE4NiwgMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHg5MDhhLAorCTB4MDA4NSwgMHgwYTBjLCAweDBkZmEsIDB4OTA4YSwgMHgwMDkyLCAweDFhMGMsIDB4MGRmYSwgMHg5MDgyLAorCTB4MDA4NSwgMHgwMGEyLCAweDkxODYsIDB4MDAyNywgMHgwMTMwLCAweDkxODYsIDB4MDAxNCwgMHgwMTE4LAorCTB4MDgwYywgMHhhMTc4LCAweDAwNTAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjQxYywgMHgwODBjLAorCTB4OGIwNCwgMHgwODBjLCAweGExMTMsIDB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4ZDNmYiwgMHhkM2ZkLAorCTB4ZDNmZCwgMHhkM2ZiLCAweGQzZmIsIDB4ZDNmYiwgMHhkM2ZiLCAweGQzZmIsIDB4ZDNmYiwgMHhkM2ZiLAorCTB4ZDNmYiwgMHhkM2ZiLCAweGQzZmIsIDB4MDgwYywgMHgwZGZhLCAweDA4MGMsIDB4OGIwNCwgMHgwODBjLAorCTB4YTExMywgMHgwODBjLCAweDhjMTAsIDB4MDAwNSwgMHg5MTgyLCAweDAwODUsIDB4MGEwYywgMHgwZGZhLAorCTB4OTE4MiwgMHgwMDkyLCAweDFhMGMsIDB4MGRmYSwgMHg5MTgyLCAweDAwODUsIDB4MDAwMiwgMHhkNDFjLAorCTB4ZDQxYywgMHhkNDFjLCAweGQ0MWUsIDB4ZDQxYywgMHhkNDFjLCAweGQ0MWMsIDB4ZDQxYywgMHhkNDFjLAorCTB4ZDQxYywgMHhkNDFjLCAweGQ0MWMsIDB4ZDQxYywgMHgwODBjLCAweDBkZmEsIDB4MDAwNSwgMHg5MTg2LAorCTB4MDAxMywgMHgwMTQ4LCAweDkxODYsIDB4MDAxNCwgMHgwMTMwLCAweDkxODYsIDB4MDAyNywgMHgwMTE4LAorCTB4MDgwYywgMHhhMTc4LCAweDAwMzAsIDB4MDgwYywgMHg4YjA0LCAweDA4MGMsIDB4YTExMywgMHgwODBjLAorCTB4OGMxMCwgMHgwMDA1LCAweDAwMzYsIDB4MDgwYywgMHhkYWUyLCAweDYwNDMsIDB4MDAwMCwgMHgyMDE5LAorCTB4MDAwYiwgMHgwMDMxLCAweDYwMjMsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsIDB4MDAzZSwgMHgwMDA1LAorCTB4MDEyNiwgMHgwMDM2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDg2LCAweDJjNDAsIDB4MDA5NiwgMHg5MDRlLAorCTB4MDgwYywgMHg5YTU4LCAweDAwOWUsIDB4MDA4ZSwgMHgxNTUwLCAweDAwNzYsIDB4MmMzOCwgMHgwODBjLAorCTB4OWIwMywgMHgwMDdlLCAweDE1MjAsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDUwMCwgMHg2MDIwLAorCTB4OTA4NiwgMHgwMDA3LCAweDAxZTAsIDB4MDA5NiwgMHg2MDFjLCAweGQwODQsIDB4MDE0MCwgMHgwODBjLAorCTB4ZGFlMiwgMHgwODBjLCAweGM1NTEsIDB4MDgwYywgMHgxOWI0LCAweDYwMjMsIDB4MDAwNywgMHg2MDE0LAorCTB4MjA0OCwgMHgwODBjLCAweGJlMzcsIDB4MDExMCwgMHgwODBjLCAweGQ4MzAsIDB4MDA5ZSwgMHg2MDE3LAorCTB4MDAwMCwgMHgwODBjLCAweGRhZTIsIDB4NjAyMywgMHgwMDA3LCAweDA4MGMsIDB4YzU1MSwgMHgwMDNlLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBjNiwgMHgwMGI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDc5LAorCTB4MDI2MCwgMHg3OTM4LCAweDc4M2MsIDB4MDgwYywgMHgyNzZlLCAweDE1YzgsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDgwYywgMHg2NDlmLCAweDE1OTAsIDB4MDAxZSwgMHgwMGM2LCAweDIxNjAsIDB4MDgwYywgMHhjNTRlLAorCTB4MDBjZSwgMHgwMDJlLCAweDAwMjYsIDB4MDAxNiwgMHgyMDE5LCAweDAwMjksIDB4MDgwYywgMHg5YmM5LAorCTB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4OTAzZSwgMHgwODBjLCAweDg2ZjEsIDB4MDA3ZSwgMHgwMDFlLAorCTB4MDA3NiwgMHg5MDNlLCAweDA4MGMsIDB4ZDVmNiwgMHgwMDdlLCAweDAwMjYsIDB4YmEwNCwgMHg5Mjk0LAorCTB4ZmYwMCwgMHg4MjE3LCAweDkyODYsIDB4MDAwNiwgMHgwMTE4LCAweDkyODYsIDB4MDAwNCwgMHgxMTE4LAorCTB4YmFhMCwgMHgwODBjLCAweDMyNDgsIDB4MDAyZSwgMHhiY2IwLCAweDAwMWUsIDB4MDgwYywgMHg1ZjQ1LAorCTB4YmUxMiwgMHhiZDE2LCAweGJjYjIsIDB4OTAwNiwgMHgwMDEwLCAweDAwY2UsIDB4MDAxZSwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMGJlLCAweDAwY2UsIDB4MDBmZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMGI2LAorCTB4MDAxNiwgMHgyMDA5LCAweDE4MjMsIDB4MjEwNCwgMHg5MDg2LCAweDAwNzQsIDB4MTkwNCwgMHhkNTFlLAorCTB4MjA2OSwgMHgwMjYwLCAweDY5NDQsIDB4OTE4MiwgMHgwMTAwLCAweDA2ZTAsIDB4Njk0MCwgMHg5MTg0LAorCTB4ODAwMCwgMHgwOTA0LCAweGQ1MWIsIDB4MjAwMSwgMHgxOTU0LCAweDIwMDQsIDB4OTAwNSwgMHgxMTQwLAorCTB4NjAxMCwgMHgyMDU4LCAweGI4YjAsIDB4OTAwNSwgMHgwMTE4LCAweDkxODQsIDB4MDgwMCwgMHgwNTk4LAorCTB4Njk0OCwgMHg5MThhLCAweDAwMDEsIDB4MDY0OCwgMHgwODBjLCAweGRiOTYsIDB4MDExOCwgMHg2OTc4LAorCTB4ZDFmYywgMHgxMWI4LCAweDIwMDksIDB4MDIwNSwgMHgyMDBiLCAweDAwMDEsIDB4NjkzYywgMHg4MWZmLAorCTB4MTE5OCwgMHg2OTQ0LCAweDkxODIsIDB4MDEwMCwgMHgwMmE4LCAweDY5NDAsIDB4ODFmZiwgMHgxMTc4LAorCTB4Njk0OCwgMHg5MThhLCAweDAwMDEsIDB4MDI4OCwgMHg2OTUwLCAweDkxOGEsIDB4MDAwMSwgMHgwMjk4LAorCTB4MDBkMCwgMHg2MDE3LCAweDAxMDAsIDB4MDBhMCwgMHg2MDE3LCAweDAzMDAsIDB4MDA4OCwgMHg2MDE3LAorCTB4MDUwMCwgMHgwMDcwLCAweDYwMTcsIDB4MDcwMCwgMHgwMDU4LCAweDYwMTcsIDB4MDkwMCwgMHgwMDQwLAorCTB4NjAxNywgMHgwYjAwLCAweDAwMjgsIDB4NjAxNywgMHgwZjAwLCAweDAwMTAsIDB4NjAxNywgMHgyZDAwLAorCTB4OTA4NSwgMHgwMDAxLCAweDAwMDgsIDB4OTAwNiwgMHgwMDFlLCAweDAwYmUsIDB4MDBkZSwgMHgwMGNlLAorCTB4MDAwNSwgMHgwMGM2LCAweDAwYjYsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4NjIxMCwgMHgyMjU4LAorCTB4YmIwNCwgMHg5Mzk0LCAweDAwZmYsIDB4OTI4NiwgMHgwMDA2LCAweDAxODAsIDB4OTI4NiwgMHgwMDA0LAorCTB4MDE2OCwgMHg5Mzk0LCAweGZmMDAsIDB4ODIxNywgMHg5Mjg2LCAweDAwMDYsIDB4MDEzOCwgMHg5Mjg2LAorCTB4MDAwNCwgMHgwMTIwLCAweDA4MGMsIDB4NjRhZSwgMHgwODA0LCAweGQ1ODUsIDB4MjAxMSwgMHgwMjc2LAorCTB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwgMHgyMDE5LCAweDAwMGEsIDB4MDgwYywgMHhiMGQwLAorCTB4MDA5ZSwgMHgxNWEwLCAweDIwMTEsIDB4MDI3YSwgMHgyMGE5LCAweDAwMDQsIDB4MDA5NiwgMHgyYjQ4LAorCTB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YjBkMCwgMHgwMDllLCAweDE1NDAsIDB4MDA0NiwgMHgwMDE2LAorCTB4YmFhMCwgMHgyMjIwLCAweDkwMDYsIDB4MjAwOSwgMHgxODVjLCAweDIxMGMsIDB4MDAzOCwgMHgyMDA5LAorCTB4MDAyOSwgMHgwODBjLCAweGQ4ODUsIDB4YjgwMCwgMHhjMGU1LCAweGI4MDIsIDB4MjAxOSwgMHgwMDI5LAorCTB4MDgwYywgMHg4ODAzLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4ODZmMSwgMHgyYzA4LAorCTB4MDgwYywgMHhkNWY2LCAweDAwN2UsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NjQxYywgMHgyMDAxLAorCTB4MDAwNywgMHgwODBjLCAweDYzZjAsIDB4MDAxZSwgMHgwMDRlLCAweDkwMDYsIDB4MDE1ZSwgMHgwMDNlLAorCTB4MDAyZSwgMHgwMGJlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGQ2LCAweDIwNjksIDB4MDI2ZSwgMHg2ODAwLAorCTB4OTA4NiwgMHgwODAwLCAweDAxMTgsIDB4NjAxNywgMHgwMDAwLCAweDAwMDgsIDB4OTAwNiwgMHgwMGRlLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwZjYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHgyMDc5LAorCTB4MDI2YywgMHg3OTMwLCAweDc4MzQsIDB4MDgwYywgMHgyNzZlLCAweDExZDAsIDB4MDgwYywgMHg2NDlmLAorCTB4MTFiOCwgMHgyMDExLCAweDAyNzAsIDB4MjBhOSwgMHgwMDA0LCAweDAwOTYsIDB4MmI0OCwgMHgyMDE5LAorCTB4MDAwYSwgMHgwODBjLCAweGIwZDAsIDB4MDA5ZSwgMHgxMTU4LCAweDIwMTEsIDB4MDI3NCwgMHgyMGE5LAorCTB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YjBkMCwgMHgwMDllLAorCTB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwYmUsIDB4MDAwNSwgMHgwMGI2LAorCTB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsIDB4MDI2MywgMHgyMjA0LAorCTB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4Mjc2ZSwgMHgxMWQwLCAweDA4MGMsIDB4NjQ5ZiwgMHgxMWI4LAorCTB4MjAxMSwgMHgwMjc2LCAweDIwYTksIDB4MDAwNCwgMHgwMDk2LCAweDJiNDgsIDB4MjAxOSwgMHgwMDBhLAorCTB4MDgwYywgMHhiMGQwLCAweDAwOWUsIDB4MTE1OCwgMHgyMDExLCAweDAyN2EsIDB4MjBhOSwgMHgwMDA0LAorCTB4MDA5NiwgMHgyYjQ4LCAweDIwMTksIDB4MDAwNiwgMHgwODBjLCAweGIwZDAsIDB4MDA5ZSwgMHgwMTVlLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LAorCTB4MDA4NiwgMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMjYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyNzQwLCAweDIwMjksIDB4MTljOCwgMHgyNTJjLCAweDIwMjEsIDB4MTljZSwgMHgyNDI0LAorCTB4MjA2MSwgMHgxY2QwLCAweDIwNzEsIDB4MTgwMCwgMHg3NjUwLCAweDcwNzAsIDB4ODFmZiwgMHgwMTUwLAorCTB4MDAwNiwgMHg5MTg2LCAweDFhOGEsIDB4MDAwZSwgMHgwMTI4LCAweDgwMDEsIDB4OTYwMiwgMHgxYTA0LAorCTB4ZDY4ZiwgMHgwMDE4LCAweDk2MDYsIDB4MDkwNCwgMHhkNjhmLCAweDIxMDAsIDB4OWMwNiwgMHgwOTA0LAorCTB4ZDY4NiwgMHgwODBjLCAweGQ4YzYsIDB4MTkwNCwgMHhkNjg2LCAweDA4MGMsIDB4ZGJiMywgMHgwOTA0LAorCTB4ZDY4NiwgMHgwODBjLCAweGQ4YjYsIDB4MDkwNCwgMHhkNjg2LCAweDY3MjAsIDB4OTc4NiwgMHgwMDAxLAorCTB4MTE0OCwgMHgwODBjLCAweDMyZGYsIDB4MDkwNCwgMHhkNmFhLCAweDYwMDQsIDB4OTA4NiwgMHgwMDAwLAorCTB4MTkwNCwgMHhkNmFhLCAweDk3ODYsIDB4MDAwNCwgMHgwOTA0LCAweGQ2YWEsIDB4OTc4NiwgMHgwMDA3LAorCTB4MDkwNCwgMHhkNjg2LCAweDI1MDAsIDB4OWMwNiwgMHgwOTA0LCAweGQ2ODYsIDB4MjQwMCwgMHg5YzA2LAorCTB4MDVlOCwgMHg4OGZmLCAweDAxMTgsIDB4NjA1NCwgMHg5OTA2LCAweDE1YzAsIDB4MDA5NiwgMHg2MDAwLAorCTB4OTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MDAxNiwgMHgwODBjLCAweDE5YjQsIDB4MDAxZSwgMHg5Nzg2LAorCTB4MDAwYSwgMHgwMTQ4LCAweDA4MGMsIDB4YzAzZiwgMHgxMTMwLCAweDA4MGMsIDB4YWE4MSwgMHgwMDllLAorCTB4MDgwYywgMHhhMTEzLCAweDA0MTgsIDB4NjAxNCwgMHgyMDQ4LCAweDA4MGMsIDB4YmUzNywgMHgwMWQ4LAorCTB4OTc4NiwgMHgwMDAzLCAweDE1NzAsIDB4YTg2NywgMHgwMTAzLCAweGE4N2MsIDB4ZDBjYywgMHgwMTMwLAorCTB4MDA5NiwgMHhhODc4LCAweDIwNDgsIDB4MDgwYywgMHgwZmUzLCAweDAwOWUsIDB4YWI3YSwgMHhhODc3LAorCTB4MDAwMCwgMHgwODBjLCAweGRiMmUsIDB4MDAxNiwgMHgwODBjLCAweGMxMmQsIDB4MDgwYywgMHg2YWRjLAorCTB4MDAxZSwgMHgwODBjLCAweGMwMjIsIDB4MDA5ZSwgMHgwODBjLCAweGExMTMsIDB4OWNlMCwgMHgwMDE4LAorCTB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4ZDYwYSwgMHgwMTJlLAorCTB4MDAyZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDAwNSwgMHg5Nzg2LCAweDAwMDYsIDB4MTE1MCwgMHg5Mzg2LCAweDAwMDUsIDB4MDEyOCwgMHgwODBjLAorCTB4ZGIyZSwgMHgwODBjLCAweGQ4MzAsIDB4MDhmOCwgMHgwMDllLCAweDBjMDAsIDB4OTc4NiwgMHgwMDBhLAorCTB4MDk2OCwgMHgwODA4LCAweDgxZmYsIDB4MDlkMCwgMHg5MTgwLCAweDAwMDEsIDB4MjAwNCwgMHg5MDg2LAorCTB4MDAxOCwgMHgwMTMwLCAweDkxODAsIDB4MDAwMSwgMHgyMDA0LCAweDkwODYsIDB4MDAyZCwgMHgxOTcwLAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDIsIDB4MTk1MCwgMHgwODBjLCAweGMwMmUsIDB4MDEzMCwgMHgwODBjLAorCTB4YzAzZiwgMHgxOTIwLCAweDA4MGMsIDB4YWE4MSwgMHgwMDM4LCAweDA4MGMsIDB4MzFiNCwgMHgwODBjLAorCTB4YzAzZiwgMHgxMTEwLCAweDA4MGMsIDB4YWE4MSwgMHgwODBjLCAweGExMTMsIDB4MDgwNCwgMHhkNjg2LAorCTB4YTg2NCwgMHg5MDg0LCAweDAwZmYsIDB4OTA4NiwgMHgwMDM5LCAweDAwMDUsIDB4MDBjNiwgMHgwMGU2LAorCTB4MDAxNiwgMHgyYzA4LCAweDIxNzAsIDB4OTAwNiwgMHgwODBjLCAweGQ4NTcsIDB4MDAxZSwgMHgwMTIwLAorCTB4NjAyMCwgMHg5MDg0LCAweDAwMGYsIDB4MDAxYiwgMHgwMGVlLCAweDAwY2UsIDB4MDAwNSwgMHhkNmY1LAorCTB4ZDZmNSwgMHhkNmY1LCAweGQ2ZjUsIDB4ZDZmNSwgMHhkNmY1LCAweGQ2ZjcsIDB4ZDZmNSwgMHhkNmY1LAorCTB4ZDZmNSwgMHhkNmY1LCAweGExMTMsIDB4YTExMywgMHhkNmY1LCAweDkwMDYsIDB4MDAwNSwgMHgwMDM2LAorCTB4MDA0NiwgMHgwMDE2LCAweDcwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGJjYTAsIDB4MDBiZSwgMHgyYzAwLAorCTB4MjAwOSwgMHgwMDIwLCAweDA4MGMsIDB4ZDg4NSwgMHgwMDFlLCAweDAwNGUsIDB4MjAxOSwgMHgwMDAyLAorCTB4MDgwYywgMHhkNDQwLCAweDAwM2UsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDA5NiwgMHgwODBjLAorCTB4YmUzNywgMHgwMTQwLCAweDYwMTQsIDB4OTA0ZCwgMHgwODBjLCAweGJhNTYsIDB4Njg3YiwgMHgwMDA1LAorCTB4MDgwYywgMHg2YWU5LCAweDAwOWUsIDB4MDgwYywgMHhhMTEzLCAweDkwODUsIDB4MDAwMSwgMHgwMDA1LAorCTB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4NjNkYywgMHgwMTU2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LAorCTB4MjBhOSwgMHgwMDA0LCAweDIwMTksIDB4MTgwNSwgMHgyMDExLCAweDAyNzYsIDB4MDgwYywgMHhiMGJjLAorCTB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDE1ZSwgMHg5MDA1LCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LAorCTB4MDBjNiwgMHgwMDg2LCAweDAwNzYsIDB4MDA2NiwgMHgwMGI2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLAorCTB4Mjc0MCwgMHgyMDYxLCAweDFjZDAsIDB4MjA3OSwgMHgwMDAxLCAweDhmZmYsIDB4MDkwNCwgMHhkNzkwLAorCTB4MjA3MSwgMHgxODAwLCAweDc2NTAsIDB4NzA3MCwgMHg4MDAxLCAweDk2MDIsIDB4MWEwNCwgMHhkNzkwLAorCTB4ODhmZiwgMHgwMTIwLCAweDI4MDAsIDB4OWMwNiwgMHgxNTkwLCAweDIwNzgsIDB4MDgwYywgMHhkOGI2LAorCTB4MDU3MCwgMHgyNDAwLCAweDljMDYsIDB4MDU1OCwgMHg2NzIwLCAweDk3ODYsIDB4MDAwNiwgMHgxNTM4LAorCTB4OTc4NiwgMHgwMDA3LCAweDA1MjAsIDB4ODhmZiwgMHgxMTQwLCAweDYwMTAsIDB4OWIwNiwgMHgxMWY4LAorCTB4ODVmZiwgMHgwMTE4LCAweDYwNTQsIDB4OTEwNiwgMHgxMWQwLCAweDAwOTYsIDB4NjAxYywgMHhkMDg0LAorCTB4MDE0MCwgMHgwODBjLCAweGRhZTIsIDB4MDgwYywgMHhjNTUxLCAweDA4MGMsIDB4MTliNCwgMHg2MDIzLAorCTB4MDAwNywgMHg2MDE0LCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDAxMjAsIDB4MDA0NiwgMHgwODBjLAorCTB4ZDgzMCwgMHgwMDRlLCAweDAwOWUsIDB4MDgwYywgMHhhMTEzLCAweDg4ZmYsIDB4MTE5OCwgMHg5Y2UwLAorCTB4MDAxOCwgMHgyMDAxLCAweDE4MTksIDB4MjAwNCwgMHg5YzAyLCAweDEyMTAsIDB4MDgwNCwgMHhkNzQ1LAorCTB4OTAwNiwgMHgwMTJlLCAweDAwYmUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLAorCTB4MDBmZSwgMHgwMDA1LCAweDk4YzUsIDB4MDAwMSwgMHgwY2EwLCAweDAwYjYsIDB4MDA3NiwgMHgwMDU2LAorCTB4MDA4NiwgMHg5MDQ2LCAweDIwMjksIDB4MDAwMSwgMHgyYzIwLCAweDIwMTksIDB4MDAwMiwgMHg2MjEwLAorCTB4MjI1OCwgMHgwMDk2LCAweDkwNGUsIDB4MDgwYywgMHg5YTU4LCAweDAwOWUsIDB4MDA4ZSwgMHg5MDNlLAorCTB4MDgwYywgMHg5YjAzLCAweDA4MGMsIDB4ZDczNiwgMHgwMDVlLCAweDAwN2UsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDBiNiwgMHgwMDQ2LCAweDAwNTYsIDB4MDA3NiwgMHgwMGM2LCAweDAxNTYsIDB4MmMyMCwgMHgyMTI4LAorCTB4MjBhOSwgMHgwMDdmLCAweDkwMGUsIDB4MDAxNiwgMHgwMDM2LCAweDA4MGMsIDB4NjQ5ZiwgMHgxMTkwLAorCTB4MDA1NiwgMHgwMDg2LCAweDkwNDYsIDB4MjUwOCwgMHgyMDI5LCAweDAwMDEsIDB4MDA5NiwgMHg5MDRlLAorCTB4MDgwYywgMHg5YTU4LCAweDAwOWUsIDB4MDA4ZSwgMHg5MDNlLCAweDA4MGMsIDB4OWIwMywgMHgwODBjLAorCTB4ZDczNiwgMHgwMDVlLCAweDAwM2UsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4ZDdjMywgMHgwMTVlLAorCTB4MDBjZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMGJlLCAweDAwMDUsIDB4MDBiNiwgMHgwMDc2LAorCTB4MDA1NiwgMHg2MjEwLCAweDIyNTgsIDB4MDA4NiwgMHg5MDQ2LCAweDIwMjksIDB4MDAwMSwgMHgyMDE5LAorCTB4MDA0OCwgMHgwMDk2LCAweDkwNGUsIDB4MDgwYywgMHg5YTU4LCAweDAwOWUsIDB4MDA4ZSwgMHg5MDNlLAorCTB4MDgwYywgMHg5YjAzLCAweDJjMjAsIDB4MDgwYywgMHhkNzM2LCAweDAwNWUsIDB4MDA3ZSwgMHgwMGJlLAorCTB4MDAwNSwgMHgwMGI2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDc2LCAweDAwYzYsIDB4MDE1NiwgMHgyYzIwLAorCTB4MjBhOSwgMHgwODAwLCAweDkwMGUsIDB4MDAxNiwgMHgwMDM2LCAweDA4MGMsIDB4NjQ5ZiwgMHgxMWEwLAorCTB4MDA4NiwgMHg5MDQ2LCAweDI4MjgsIDB4MDA0NiwgMHgyMDIxLCAweDAwMDEsIDB4MDgwYywgMHhkYWM2LAorCTB4MDA0ZSwgMHgwMDk2LCAweDkwNGUsIDB4MDgwYywgMHg5YTU4LCAweDAwOWUsIDB4MDA4ZSwgMHg5MDNlLAorCTB4MDgwYywgMHg5YjAzLCAweDA4MGMsIDB4ZDczNiwgMHgwMDNlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LAorCTB4ZDgwYiwgMHgwMTVlLCAweDAwY2UsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDBiZSwgMHgwMDA1LAorCTB4MDAxNiwgMHgwMGY2LCAweDA4MGMsIDB4YmUzNSwgMHgwMTk4LCAweGE4NjQsIDB4OTA4NCwgMHgwMGZmLAorCTB4OTA4NiwgMHgwMDQ2LCAweDAxODAsIDB4YTgwMCwgMHg5MDdkLCAweDAxMzgsIDB4YTgwMywgMHgwMDAwLAorCTB4YWI4MiwgMHgwODBjLCAweDZhZTksIDB4MmY0OCwgMHgwY2IwLCAweGFiODIsIDB4MDgwYywgMHg2YWU5LAorCTB4MDBmZSwgMHgwMDFlLCAweDAwMDUsIDB4YTgwMCwgMHg5MDdkLCAweDAxMzAsIDB4YTgwMywgMHgwMDAwLAorCTB4MDgwYywgMHg2YWU5LCAweDJmNDgsIDB4MGNiOCwgMHgwODBjLCAweDZhZTksIDB4MGM4OCwgMHgwMGU2LAorCTB4MDA0NiwgMHgwMDM2LCAweDIwNjEsIDB4MWNkMCwgMHg5MDA1LCAweDExMzgsIDB4MjA3MSwgMHgxODAwLAorCTB4NzQ1MCwgMHg3MDcwLCAweDgwMDEsIDB4OTQwMiwgMHgxMmQ4LCAweDIxMDAsIDB4OWMwNiwgMHgwMTY4LAorCTB4NjAwMCwgMHg5MDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDA4LCAweDkyMDYsIDB4MTEzMCwgMHg2MDEwLAorCTB4OTFhMCwgMHgwMDA0LCAweDI0MjQsIDB4OTQwNiwgMHgwMTQwLCAweDljZTAsIDB4MDAxOCwgMHgyMDAxLAorCTB4MTgxOSwgMHgyMDA0LCAweDljMDIsIDB4MTIyMCwgMHgwYzQwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LAorCTB4OTAwNiwgMHgwMDNlLCAweDAwNGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwOTYsIDB4MDAwNiwgMHgwODBjLAorCTB4MTAzMSwgMHgwMDBlLCAweDA5MGMsIDB4MGRmYSwgMHhhYWUyLCAweGE4NjcsIDB4MDEwZCwgMHhhODhlLAorCTB4MDAyNiwgMHgyMDEwLCAweDA4MGMsIDB4YmUyNSwgMHgyMDAxLCAweDAwMDAsIDB4MDEyMCwgMHgyMjAwLAorCTB4OTA4MCwgMHgwMDE1LCAweDIwMDQsIDB4MDAyZSwgMHhhODdhLCAweDkxODYsIDB4MDAyMCwgMHgwMTEwLAorCTB4YThlMywgMHhmZmZmLCAweGE5ODYsIDB4YWM3NiwgMHhhODdmLCAweDAwMDAsIDB4MjAwMSwgMHgxOTY2LAorCTB4MjAwNCwgMHhhODgyLCAweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGE4OGEsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgwODBjLCAweDZhZTksIDB4MDEyZSwgMHgwMDllLCAweDAwMDUsIDB4NjcwMCwgMHg5Nzg2LAorCTB4MDAwMCwgMHgwMTU4LCAweDk3ODYsIDB4MDAwMSwgMHgwMTQwLCAweDk3ODYsIDB4MDAwYSwgMHgwMTI4LAorCTB4OTc4NiwgMHgwMDA5LCAweDAxMTAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDBlNiwgMHg2MDEwLAorCTB4OTA3NSwgMHgwMTM4LCAweDAwYjYsIDB4MjA1OCwgMHhiOGEwLCAweDAwYmUsIDB4OTIwNiwgMHgwMGVlLAorCTB4MDAwNSwgMHg5MDg1LCAweDAwMDEsIDB4MGNkOCwgMHgwMDE2LCAweDYwMDQsIDB4OTA4ZSwgMHgwMDFlLAorCTB4MTFhMCwgMHg4MDA3LCAweDYxMzQsIDB4OTE4YywgMHgwMGZmLCAweDkxMDUsIDB4NjAzNiwgMHg2MDA3LAorCTB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAyMywgMHgwMDA1LCAweDIwMDEsIDB4MTk1ZiwgMHgyMDA0LAorCTB4NjAxYSwgMHgwODBjLCAweDg2NzksIDB4MDgwYywgMHg4YzEwLCAweDAwMWUsIDB4MDAwNSwgMHhhMDAxLAorCTB4YTAwMSwgMHgwMDA1LCAweDYwMjQsIDB4ZDBlNCwgMHgwMTU4LCAweGQwY2MsIDB4MDExOCwgMHgwODBjLAorCTB4YzE3MSwgMHgwMDMwLCAweDA4MGMsIDB4ZGFlMiwgMHgwODBjLCAweDg0YTYsIDB4MDgwYywgMHhhMGUzLAorCTB4MDAwNSwgMHg5MjgwLCAweDAwMDgsIDB4MjAwNCwgMHg5MDg0LCAweDAwMGYsIDB4MDAwMiwgMHhkOTE1LAorCTB4ZDkxNSwgMHhkOTE1LCAweGQ5MTcsIDB4ZDkxNSwgMHhkOTE3LCAweGQ5MTcsIDB4ZDkxNSwgMHhkOTE3LAorCTB4ZDkxNSwgMHhkOTE1LCAweGQ5MTUsIDB4ZDkxNSwgMHhkOTE1LCAweDkwMDYsIDB4MDAwNSwgMHg5MDg1LAorCTB4MDAwMSwgMHgwMDA1LCAweDkyODAsIDB4MDAwOCwgMHgyMDA0LCAweDkwODQsIDB4MDAwZiwgMHgwMDAyLAorCTB4ZDkyZSwgMHhkOTJlLCAweGQ5MmUsIDB4ZDkyZSwgMHhkOTJlLCAweGQ5MmUsIDB4ZDkzYiwgMHhkOTJlLAorCTB4ZDkyZSwgMHhkOTJlLCAweGQ5MmUsIDB4ZDkyZSwgMHhkOTJlLCAweGQ5MmUsIDB4NjAwNywgMHgwMDNiLAorCTB4NjAyZiwgMHgwMDA5LCAweDYwMTcsIDB4MmEwMCwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4Njc5LAorCTB4MDgwYywgMHg4YzEwLCAweDAwMDUsIDB4MDA5NiwgMHgwMGM2LCAweDIyNjAsIDB4MDgwYywgMHhkYWUyLAorCTB4NjA0MywgMHgwMDAwLCAweDYwMjQsIDB4YzBmNCwgMHhjMGU0LCAweDYwMjYsIDB4NjAzYiwgMHgwMDAwLAorCTB4MDBjZSwgMHgwMGQ2LCAweDIyNjgsIDB4OTE4NiwgMHgwMDA3LCAweDE5MDQsIDB4ZDk5NCwgMHg2ODE0LAorCTB4OTAwNSwgMHgwMTM4LCAweDIwNDgsIDB4YTg3YywgMHhkMGZjLCAweDExMTgsIDB4MDBkZSwgMHgwMDllLAorCTB4MDhhOCwgMHg2MDA3LCAweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLAorCTB4OGMxMCwgMHgwMGM2LCAweDJkNjAsIDB4NjEwMCwgMHg5MTg2LCAweDAwMDIsIDB4MTkwNCwgMHhkYTBiLAorCTB4NjAxNCwgMHg5MDA1LCAweDExMzgsIDB4NjAwMCwgMHg5MDg2LCAweDAwMDcsIDB4MTkwYywgMHgwZGZhLAorCTB4MDgwNCwgMHhkYTBiLCAweDIwNDgsIDB4MDgwYywgMHhiZTM3LCAweDExMzAsIDB4MDAyOCwgMHgyMDQ4LAorCTB4YTgwMCwgMHg5MDA1LCAweDFkZTAsIDB4MjkwMCwgMHgyMDQ4LCAweGE4N2MsIDB4OTA4NCwgMHgwMDAzLAorCTB4OTA4NiwgMHgwMDAyLCAweDExNjgsIDB4YTg3YywgMHhjMGRjLCAweGMwZjQsIDB4YTg3ZSwgMHhhODgwLAorCTB4YzBmYywgMHhhODgyLCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweGQyOTQsIDB4MDgwNCwgMHhkYTBiLAorCTB4MjAwOSwgMHgwMDQxLCAweDA4MDQsIDB4ZGEwNSwgMHg5MTg2LCAweDAwMDUsIDB4MTVhMCwgMHg2ODE0LAorCTB4MjA0OCwgMHhhODdjLCAweGQwYmMsIDB4MTEyMCwgMHgwMGRlLCAweDAwOWUsIDB4MDgwNCwgMHhkOTJlLAorCTB4ZDBiNCwgMHgwMTI4LCAweGQwZmMsIDB4MDkwYywgMHgwZGZhLCAweDA4MDQsIDB4ZDk0ZiwgMHg2MDA3LAorCTB4MDAzYSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg4Njc5LCAweDA4MGMsIDB4OGMxMCwgMHgwMGM2LAorCTB4MmQ2MCwgMHg2MTAwLCAweDkxODYsIDB4MDAwMiwgMHgwMTIwLCAweDkxODYsIDB4MDAwNCwgMHgxOTA0LAorCTB4ZGEwYiwgMHg2ODE0LCAweDIwNDgsIDB4YTk3YywgMHhjMWY0LCAweGMxZGMsIDB4YTk3ZSwgMHhhOTgwLAorCTB4YzFmYywgMHhjMWJjLCAweGE5ODIsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4MTZkYiwgMHgwMGZlLAorCTB4MjAwOSwgMHgwMDQyLCAweDA0ZDAsIDB4MDAzNiwgMHgwODBjLCAweDEwMzEsIDB4MDkwYywgMHgwZGZhLAorCTB4YTg2NywgMHgwMTBkLCAweDkwMDYsIDB4YTgwMiwgMHhhODZhLCAweGE4OGEsIDB4MmQxOCwgMHhhYjhlLAorCTB4YTg4NywgMHgwMDQ1LCAweDJjMDAsIDB4YTg5MiwgMHg2MDM4LCAweGE4YTIsIDB4MjM2MCwgMHg2MDI0LAorCTB4YzBkZCwgMHg2MDI2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4YTAsIDB4MDBiZSwgMHgyMDA0LAorCTB4NjM1NCwgMHhhYjdhLCAweGE4NzYsIDB4OTAwNiwgMHhhODdlLCAweGE4ODIsIDB4YWQ5YSwgMHhhZTk2LAorCTB4YTg5ZiwgMHgwMDAxLCAweDA4MGMsIDB4NmFlOSwgMHgyMDE5LCAweDAwNDUsIDB4NjAwOCwgMHgyMDY4LAorCTB4MDgwYywgMHhkNDQwLCAweDJkMDAsIDB4NjAwYSwgMHg2MDIzLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LAorCTB4OTAxZSwgMHg2MzFhLCAweDYzNDIsIDB4MDAzZSwgMHgwMDM4LCAweDYwNDMsIDB4MDAwMCwgMHg2MDAzLAorCTB4MDAwNywgMHgwODBjLCAweGQyOTQsIDB4MDBjZSwgMHgwMGRlLCAweDAwOWUsIDB4MDAwNSwgMHg5MTg2LAorCTB4MDAxMywgMHgxMTI4LCAweDYwMDQsIDB4OTA4MiwgMHgwMDg1LCAweDIwMDgsIDB4MDBjMiwgMHg5MTg2LAorCTB4MDAyNywgMHgxMTc4LCAweDA4MGMsIDB4OGIwNCwgMHgwMDM2LCAweDAwOTYsIDB4NjAxNCwgMHgyMDQ4LAorCTB4MjAxOSwgMHgwMDA0LCAweDA4MGMsIDB4ZDgzMCwgMHgwMDllLCAweDAwM2UsIDB4MDgwYywgMHg4YzEwLAorCTB4MDAwNSwgMHg5MTg2LCAweDAwMTQsIDB4MGQ3MCwgMHgwODBjLCAweGExNzgsIDB4MDAwNSwgMHhkYTNlLAorCTB4ZGEzYywgMHhkYTNjLCAweGRhM2MsIDB4ZGEzYywgMHhkYTNjLCAweGRhM2UsIDB4ZGEzYywgMHhkYTNjLAorCTB4ZGEzYywgMHhkYTNjLCAweGRhM2MsIDB4ZGEzYywgMHgwODBjLCAweDBkZmEsIDB4MDgwYywgMHg4YjA0LAorCTB4NjAwMywgMHgwMDBjLCAweDA4MGMsIDB4OGMxMCwgMHgwMDA1LCAweDkxODIsIDB4MDA5MiwgMHgxMjIwLAorCTB4OTE4MiwgMHgwMDg1LCAweDAyMDgsIDB4MDAxYSwgMHgwODBjLCAweGExNzgsIDB4MDAwNSwgMHhkYTVjLAorCTB4ZGE1YywgMHhkYTVjLCAweGRhNWMsIDB4ZGE1ZSwgMHhkYTdlLCAweGRhNWMsIDB4ZGE1YywgMHhkYTVjLAorCTB4ZGE1YywgMHhkYTVjLCAweGRhNWMsIDB4ZGE1YywgMHgwODBjLCAweDBkZmEsIDB4MDBkNiwgMHgyYzY4LAorCTB4MDgwYywgMHhhMDhkLCAweDAxYjAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHgyMDA5LAorCTB4MDI2ZSwgMHgyMTBjLCAweDYxM2EsIDB4MjAwOSwgMHgwMjZmLCAweDIxMGMsIDB4NjEzZSwgMHg2MDBiLAorCTB4ZmZmZiwgMHg2OTEwLCAweDYxMTIsIDB4NjAyMywgMHgwMDA0LCAweDA4MGMsIDB4ODY3OSwgMHgwODBjLAorCTB4OGMxMCwgMHgyZDYwLCAweDA4MGMsIDB4YTBlMywgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHhhMGUzLAorCTB4MDAwNSwgMHgwMGU2LCAweDYwMTAsIDB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGVjLAorCTB4MDBlZSwgMHgwMDA1LCAweDIwMDksIDB4MTg3YiwgMHgyMTBjLCAweGQxZWMsIDB4MDViMCwgMHg2MDAzLAorCTB4MDAwMiwgMHg2MDI0LCAweGMwZTUsIDB4NjAyNiwgMHhkMGNjLCAweDAxNTAsIDB4MjAwMSwgMHgxOTYwLAorCTB4MjAwNCwgMHg2MDQyLCAweDIwMDksIDB4MTg3YiwgMHgyMTBjLCAweGQxZjQsIDB4MTUyMCwgMHgwMGEwLAorCTB4MjAwOSwgMHgxODdiLCAweDIxMGMsIDB4ZDFmNCwgMHgwMTI4LCAweDYwMjQsIDB4YzBlNCwgMHg2MDI2LAorCTB4OTAwNiwgMHgwMGQ4LCAweDIwMDEsIDB4MTk2MCwgMHgyMDBjLCAweDIwMDEsIDB4MTk1ZSwgMHgyMDA0LAorCTB4OTEwMCwgMHg5MDgwLCAweDAwMGEsIDB4NjA0MiwgMHg2MDEwLCAweDAwYjYsIDB4MjA1OCwgMHhiOGFjLAorCTB4MDBiZSwgMHgwMDA4LCAweDIxMDQsIDB4OTAwNSwgMHgwMTE4LCAweDkwODgsIDB4MDAwMywgMHgwY2QwLAorCTB4MmMwYSwgMHg2MDBmLCAweDAwMDAsIDB4OTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDAxNiwgMHgwMGM2LAorCTB4MDBlNiwgMHg2MTU0LCAweGI4YWMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxODAsIDB4ODRmZiwgMHgxMTE4LAorCTB4NjA1NCwgMHg5MTA2LCAweDExMzgsIDB4NjAwYywgMHgyMDcyLCAweDA4MGMsIDB4ODRhNiwgMHgwODBjLAorCTB4YTBlMywgMHgwMDEwLCAweDljZjAsIDB4MDAwMywgMHgyZTY0LCAweDBjNzAsIDB4MDBlZSwgMHgwMGNlLAorCTB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4MDBiNiwgMHg2MDEwLCAweDIwNTgsIDB4YjhhYywgMHgyMDY4LAorCTB4OTAwNSwgMHgwMTMwLCAweDljMDYsIDB4MDExMCwgMHg2ODBjLCAweDBjZDAsIDB4NjAwYywgMHg2ODBlLAorCTB4MDBiZSwgMHgwMGRlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsIDB4MjAxMSwgMHgxODJiLAorCTB4MjIwNCwgMHg5MDg0LCAweDAwZmYsIDB4MjAxOSwgMHgwMjZlLCAweDIzMzQsIDB4OTYzNiwgMHgxNTA4LAorCTB4ODMxOCwgMHgyMzM0LCAweDIyMDQsIDB4OTA4NCwgMHhmZjAwLCAweDk2MzYsIDB4MTFkMCwgMHgyMDExLAorCTB4MDI3MCwgMHgyMGE5LCAweDAwMDQsIDB4NjAxMCwgMHgwMDk2LCAweDIwNDgsIDB4MjAxOSwgMHgwMDBhLAorCTB4MDgwYywgMHhiMGQwLCAweDAwOWUsIDB4MTE2OCwgMHgyMDExLCAweDAyNzQsIDB4MjBhOSwgMHgwMDA0LAorCTB4NjAxMCwgMHgwMDk2LCAweDIwNDgsIDB4MjAxOSwgMHgwMDA2LCAweDA4MGMsIDB4YjBkMCwgMHgwMDllLAorCTB4MTEwMCwgMHgwMTVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHgxODAwLAorCTB4MDgwYywgMHg1ZWJlLCAweDA4MGMsIDB4MmY2YywgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGI4MDAsIDB4MDBiZSwgMHhkMGZjLCAweDAxMDgsIDB4MDAxMSwgMHgwMGVlLAorCTB4MDAwNSwgMHhhODgwLCAweGMwZTUsIDB4YTg4MiwgMHgwMDA1LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LAorCTB4MDA3NiwgMHgwMDY2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDAwMTYsIDB4MDEyNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDI5LCAweDE5YzgsIDB4MjUyYywgMHgyMDIxLCAweDE5Y2UsIDB4MjQyNCwgMHgyMDYxLAorCTB4MWNkMCwgMHgyMDcxLCAweDE4MDAsIDB4NzY1MCwgMHg3MDcwLCAweDk2MDYsIDB4MDU3OCwgMHg2NzIwLAorCTB4OTc4NiwgMHgwMDAxLCAweDAxMTgsIDB4OTc4NiwgMHgwMDA4LCAweDE1MDAsIDB4MjUwMCwgMHg5YzA2LAorCTB4MDFlOCwgMHgyNDAwLCAweDljMDYsIDB4MDFkMCwgMHgwODBjLCAweGQ4YjYsIDB4MDFiOCwgMHgwODBjLAorCTB4ZDhjNiwgMHgxMWEwLCAweDYwMDAsIDB4OTA4NiwgMHgwMDA0LCAweDExMjAsIDB4MDAxNiwgMHgwODBjLAorCTB4MTliNCwgMHgwMDFlLCAweDA4MGMsIDB4YzAyZSwgMHgxMTEwLCAweDA4MGMsIDB4MzFiNCwgMHgwODBjLAorCTB4YzAzZiwgMHgxMTEwLCAweDA4MGMsIDB4YWE4MSwgMHgwODBjLCAweGExMTMsIDB4OWNlMCwgMHgwMDE4LAorCTB4MjAwMSwgMHgxODE5LCAweDIwMDQsIDB4OWMwMiwgMHgxMjA4LCAweDA4NTgsIDB4MDEyZSwgMHgwMDFlLAorCTB4MDAyZSwgMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLAorCTB4MDAwNSwgMHgyMDAxLCAweDE4MTAsIDB4MjAwNCwgMHhkMGRjLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLAorCTB4MTgzNiwgMHgyMDA0LCAweGQwOWMsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDAzNiwgMHgwMDQ2LAorCTB4MDgwYywgMHhjNTM5LCAweDAxNjgsIDB4MjAxOSwgMHhmZmZmLCAweDkwMDUsIDB4MDEyOCwgMHg2MDEwLAorCTB4MDBiNiwgMHgyMDU4LCAweGJiYTAsIDB4MDBiZSwgMHgyMDIxLCAweDAwMDQsIDB4MDgwYywgMHg0Y2JjLAorCTB4MDA0ZSwgMHgwMDNlLCAweDAwMGUsIDB4NjAwNCwgMHg5MDg2LCAweDAwMDEsIDB4MTEyOCwgMHgwODBjLAorCTB4OWJjOSwgMHgwODBjLCAweGExMTMsIDB4OTAwNiwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMGI2LAorCTB4MDA0NiwgMHgyMDYxLCAweDFjZDAsIDB4MjA3MSwgMHgxODAwLCAweDc0NTAsIDB4NzA3MCwgMHg4MDAxLAorCTB4OTQwMiwgMHgxMmQ4LCAweDIxMDAsIDB4OWMwNiwgMHgwMTY4LCAweDYwMDAsIDB4OTA4NiwgMHgwMDAwLAorCTB4MDE0OCwgMHg2MDEwLCAweDIwNTgsIDB4YjhhMCwgMHg5MjA2LCAweDExMjAsIDB4NjAwNCwgMHg5MDg2LAorCTB4MDAwMiwgMHgwMTQwLCAweDljZTAsIDB4MDAxOCwgMHgyMDAxLCAweDE4MTksIDB4MjAwNCwgMHg5YzAyLAorCTB4MTIyMCwgMHgwYzQwLCAweDkwODUsIDB4MDAwMSwgMHgwMDA4LCAweDkwMDYsIDB4MDA0ZSwgMHgwMGJlLAorCTB4MDBjZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MDAxNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDE4NDAsIDB4ZDVhNCwgMHgwMTE4LCAweDcwNTQsIDB4ODAwMCwgMHg3MDU2LAorCTB4ZDViNCwgMHgwMTE4LCAweDcwNTAsIDB4ODAwMCwgMHg3MDUyLCAweGQ1YWMsIDB4MDE3OCwgMHgyNTAwLAorCTB4OTA4NCwgMHgwMDA3LCAweDkwOGUsIDB4MDAwMywgMHgwMTQ4LCAweDkwOGUsIDB4MDAwNCwgMHgwMTMwLAorCTB4OTA4ZSwgMHgwMDA1LCAweDAxMTgsIDB4MjA3MSwgMHgxODRhLCAweDAwODksIDB4MDAxZSwgMHgwMGVlLAorCTB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjA3MSwgMHgxODQyLCAweDAwMjEsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgyZTA0LAorCTB4ODAwMCwgMHgyMDcyLCAweDEyMjAsIDB4OGU3MCwgMHgyZTA0LCAweDgwMDAsIDB4MjA3MiwgMHgwMDA1LAorCTB4MDBlNiwgMHgyMDcxLCAweDE4NDAsIDB4MGM5OSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLAorCTB4MTg0NCwgMHgwYzY5LCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDcxLCAweDE4NDAsIDB4NzA2NCwgMHg4MDAwLCAweDcwNjYsIDB4MDBlZSwgMHgwMDBlLAorCTB4MDEyZSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwYiwgMHgwNGE2LCAweDAwMDAsIDB4YzAwMCwgMHgwMDAxLAorCTB4ODA2NCwgMHgwMDA4LCAweDAwMTAsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDEwMSwgMHgwMDA4LAorCTB4NDQwNywgMHgwMDAzLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4NTgwZCwgMHgwMDBiLAorCTB4Nzk4ZSwgMHgwMDAzLCAweDUwZGIsIDB4MDAwYiwgMHg0YzBhLCAweDAwMDMsIDB4YmFjMCwgMHgwMDA5LAorCTB4MDA4YSwgMHgwMDAwLCAweDBjMGEsIDB4MDAwYiwgMHgxNWZlLCAweDAwMDgsIDB4MzQwYSwgMHgwMDAzLAorCTB4YzRjMCwgMHgwMDA5LCAweDcwMDAsIDB4MDAwMCwgMHhmZmEwLCAweDAwMDEsIDB4MjAwMCwgMHgwMDAwLAorCTB4MTYyNywgMHgwMDAzLCAweDgwOGMsIDB4MDAwOCwgMHgwMDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDA3LAorCTB4NDA0NywgMHgwMDBhLCAweDgwOGMsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsIDB4MDgyMSwgMHgwMDAzLAorCTB4NDAyMiwgMHgwMDAwLCAweDAwMjIsIDB4MDAwYiwgMHg0MTIyLCAweDAwMDgsIDB4NDQ0NywgMHgwMDAyLAorCTB4MGU0ZiwgMHgwMDBiLCAweDBiZmUsIDB4MDAwOCwgMHgxMWEwLCAweDAwMDEsIDB4MTIyZCwgMHgwMDBiLAorCTB4MGNhMCwgMHgwMDAxLCAweDEyMmQsIDB4MDAwYiwgMHg5MTgwLCAweDAwMDEsIDB4MDAwNCwgMHgwMDAwLAorCTB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDAwOSwgMHgwMDA4LCAweDQ0MzAsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMCwgMHgwMDA4LAorCTB4MDA2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDQxMSwgMHgwMDAwLCAweDQ0MzgsIDB4MDAwMywgMHgwM2ZlLCAweDAwMDAsIDB4NDNlMCwgMHgwMDAxLAorCTB4MGUyYSwgMHgwMDBiLCAweGMyYzAsIDB4MDAwOSwgMHgwMGZmLCAweDAwMDgsIDB4MDJlMCwgMHgwMDAxLAorCTB4MGUyYSwgMHgwMDBiLCAweDkxODAsIDB4MDAwMSwgMHgwMDA1LCAweDAwMDgsIDB4ODA2MCwgMHgwMDAwLAorCTB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDAxOSwgMHgwMDAwLAorCTB4NDQ0NywgMHgwMDBiLCAweDAyNDAsIDB4MDAwMiwgMHgwYTI3LCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLAorCTB4MzIyYSwgMHgwMDBiLCAweDExMmEsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDgsIDB4MDIyYywgMHgwMDA4LAorCTB4M2E0NCwgMHgwMDAyLCAweDBjMGEsIDB4MDAwYiwgMHg4MDhjLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLAorCTB4MTc2MCwgMHgwMDA4LCAweDgwNjIsIDB4MDAwOCwgMHgwMDBmLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDAxMSwgMHgwMDA4LCAweDQ0NTgsIDB4MDAwMywgMHgwMWZlLCAweDAwMDgsIDB4NDJlMCwgMHgwMDA5LAorCTB4MGUxZCwgMHgwMDAzLCAweDAwZmUsIDB4MDAwMCwgMHg0M2UwLCAweDAwMDEsIDB4MGUxZCwgMHgwMDAzLAorCTB4MTczNCwgMHgwMDAwLCAweDE1MzAsIDB4MDAwMCwgMHgxNjMyLCAweDAwMDgsIDB4MGQyYSwgMHgwMDA4LAorCTB4OTg4MCwgMHgwMDAxLCAweDAwMTAsIDB4MDAwMCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLAorCTB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwgMHgxZTBhLCAweDAwMDgsIDB4NDQ2YSwgMHgwMDBiLAorCTB4ODA4YSwgMHgwMDA4LCAweDAwMDMsIDB4MDAwOCwgMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LAorCTB4MDAwMiwgMHgwMDAwLCAweDU4NzAsIDB4MDAwYiwgMHg4MDY2LCAweDAwMDAsIDB4MzY3OSwgMHgwMDAwLAorCTB4NDQ3MywgMHgwMDAzLCAweDU4NzQsIDB4MDAwMywgMHgzZWZlLCAweDAwMDgsIDB4N2Y0ZiwgMHgwMDAyLAorCTB4MDg3YSwgMHgwMDBiLCAweDBkMDAsIDB4MDAwMCwgMHgwMDgyLCAweDAwMDQsIDB4ODA1NCwgMHgwMDA4LAorCTB4MDAxMSwgMHgwMDA4LCAweDgwNzQsIDB4MDAwMCwgMHgxMDEwLCAweDAwMDgsIDB4MWVmZSwgMHgwMDAwLAorCTB4MzAwYSwgMHgwMDBiLCAweDAwYjgsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLAorCTB4MzQ4YSwgMHgwMDBiLCAweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLAorCTB4ODA2NiwgMHgwMDAwLCAweDAyMzEsIDB4MDAwOCwgMHg0NDg5LCAweDAwMDMsIDB4MDNmZSwgMHgwMDAwLAorCTB4MDRkMCwgMHgwMDAxLCAweDBjYjAsIDB4MDAwMywgMHg4MmMwLCAweDAwMDEsIDB4MWYwMCwgMHgwMDAwLAorCTB4ZmZhMCwgMHgwMDAxLCAweDA0MDAsIDB4MDAwMCwgMHgwODlmLCAweDAwMDMsIDB4MTRiMCwgMHgwMDAzLAorCTB4MDFmZSwgMHgwMDA4LCAweDA1ODAsIDB4MDAwOSwgMHg3ZjA2LCAweDAwMDAsIDB4MDJmZSwgMHgwMDA4LAorCTB4ZmZjMCwgMHgwMDAxLCAweDAwZmYsIDB4MDAwOCwgMHgwNjkwLCAweDAwMDEsIDB4MTA5ZiwgMHgwMDAzLAorCTB4N2YwOCwgMHgwMDA4LCAweDg0YzAsIDB4MDAwMSwgMHhmZjAwLCAweDAwMDgsIDB4MDhiMCwgMHgwMDBiLAorCTB4MDBmZSwgMHgwMDAwLCAweDM0YTYsIDB4MDAwMywgMHg4MDcyLCAweDAwMDAsIDB4MTAxMCwgMHgwMDA4LAorCTB4Mzk0NCwgMHgwMDAyLCAweDA4YTEsIDB4MDAwYiwgMHgwMGFhLCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLAorCTB4MjAyMCwgMHgwMDA4LCAweDM5NDUsIDB4MDAwYSwgMHgwOGE2LCAweDAwMDMsIDB4Mzk0NiwgMHgwMDBhLAorCTB4MGNiNywgMHgwMDBiLCAweDAwMDAsIDB4MDAwNywgMHgzOTQzLCAweDAwMGEsIDB4MDhiNywgMHgwMDAzLAorCTB4MDBhYSwgMHgwMDBiLCAweDAwZmUsIDB4MDAwMCwgMHgzNGI1LCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLAorCTB4MTAwMCwgMHgwMDAwLCAweDAwYjcsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLAorCTB4NDAwMCwgMHgwMDBmLCAweDFjNjAsIDB4MDAwMCwgMHgxYjYyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDIzMSwgMHgwMDA4LCAweDQ0YmMsIDB4MDAwMywgMHg1OGJkLCAweDAwMDMsIDB4MDE0MCwgMHgwMDA4LAorCTB4MDI0MiwgMHgwMDAwLCAweDFmNDMsIDB4MDAwMiwgMHgwY2NiLCAweDAwMDMsIDB4MGQ0NCwgMHgwMDAwLAorCTB4MGQ0NiwgMHgwMDA4LCAweDAzNDgsIDB4MDAwOCwgMHgwNDRhLCAweDAwMDgsIDB4MDMwYSwgMHgwMDA4LAorCTB4MDQwYywgMHgwMDAwLCAweDBkMDYsIDB4MDAwMCwgMHgwZDA4LCAweDAwMDgsIDB4MDBjZiwgMHgwMDBiLAorCTB4MDM0NCwgMHgwMDA4LCAweDA0NDYsIDB4MDAwOCwgMHgwNTQ4LCAweDAwMDgsIDB4MDY0YSwgMHgwMDAwLAorCTB4NThjZiwgMHgwMDAzLCAweDNlZmUsIDB4MDAwOCwgMHg3ZjRmLCAweDAwMDIsIDB4MDhkNiwgMHgwMDBiLAorCTB4ODAwMCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMCwgMHgwMDgyLCAweDAwMDQsIDB4ODA1NCwgMHgwMDA4LAorCTB4MDAwMSwgMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHgyMDIwLCAweDAwMDgsIDB4NDAwMCwgMHgwMDBmLAorCTB4M2E0MCwgMHgwMDBhLCAweDBjMGQsIDB4MDAwMywgMHgyYjI0LCAweDAwMDgsIDB4MmIyNCwgMHgwMDA4LAorCTB4NThkZiwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsIDB4MTI0MiwgMHgwMDAyLAorCTB4MDkyZCwgMHgwMDBiLCAweDNhNDUsIDB4MDAwYSwgMHgwOTFjLCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLAorCTB4MTAwMCwgMHgwMDAwLCAweDM5NDUsIDB4MDAwYSwgMHgwOGVjLCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLAorCTB4MzAxMCwgMHgwMDAwLCAweDFlMTAsIDB4MDAwYSwgMHg3ZjNjLCAweDAwMDAsIDB4MDkxNywgMHgwMDBiLAorCTB4MWQwMCwgMHgwMDAyLCAweDdmM2EsIDB4MDAwMCwgMHgwZDYwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LAorCTB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwgMHg0NGY1LCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLAorCTB4MzUxNCwgMHgwMDBiLCAweDFjNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLAorCTB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwgMHg0NGZkLCAweDAwMDMsIDB4MDBmZSwgMHgwMDAwLAorCTB4MzIwNCwgMHgwMDBiLCAweDAwMzgsIDB4MDAwMCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LAorCTB4MDAxOSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4NDUwNiwgMHgwMDAzLAorCTB4ODBjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwgMHg3ZjNlLCAweDAwMDgsIDB4MGQ2MCwgMHgwMDAwLAorCTB4MGVmZSwgMHgwMDA4LCAweDFmODAsIDB4MDAwMSwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDAwOSwgMHgwMDA4LCAweDQ1MTAsIDB4MDAwYiwgMHgwMDNhLCAweDAwMDgsIDB4MWRmZSwgMHgwMDAwLAorCTB4MDBmMSwgMHgwMDAzLCAweDAwMzYsIDB4MDAwOCwgMHgwMGI4LCAweDAwMDQsIDB4MDEyZCwgMHgwMDAzLAorCTB4ODA3NCwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLAorCTB4MDEyZCwgMHgwMDAzLCAweDNhNDQsIDB4MDAwMiwgMHgwYTMwLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLAorCTB4MTAwMCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgxMDAwLCAweDAwMDAsIDB4MmQwZSwgMHgwMDAwLAorCTB4MmQwZSwgMHgwMDAwLCAweDM2MDEsIDB4MDAwMywgMHgyNmZlLCAweDAwMDgsIDB4MjZmZSwgMHgwMDA4LAorCTB4MjcwMCwgMHgwMDA4LCAweDI3MDAsIDB4MDAwOCwgMHgwMGQwLCAweDAwMDksIDB4MGQzZiwgMHgwMDAzLAorCTB4ODA3NCwgMHgwMDAwLCAweDQwNDAsIDB4MDAwOCwgMHg1OTJkLCAweDAwMGIsIDB4NTBkYiwgMHgwMDBiLAorCTB4M2E0NiwgMHgwMDBhLCAweDBkM2YsIDB4MDAwMywgMHgzYTQ3LCAweDAwMDIsIDB4MDkzYSwgMHgwMDBiLAorCTB4ODA1NCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHg4MDc0LCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwMTgyLCAweDAwMDMsIDB4OTJjMCwgMHgwMDA5LAorCTB4MGZjOCwgMHgwMDAwLCAweDA4MGEsIDB4MDAwMywgMHgxMjQ2LCAweDAwMGEsIDB4MGRmYiwgMHgwMDBiLAorCTB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLAorCTB4MzYyYSwgMHgwMDAwLCAweDQ1NDQsIDB4MDAwMywgMHgyMDAwLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLAorCTB4MjEwMiwgMHgwMDAwLCAweDIxMDIsIDB4MDAwMCwgMHgyMjA0LCAweDAwMDAsIDB4MjIwNCwgMHgwMDAwLAorCTB4MjMwNiwgMHgwMDAwLCAweDIzMDYsIDB4MDAwMCwgMHgyNDA4LCAweDAwMDAsIDB4MjQwOCwgMHgwMDAwLAorCTB4MjUwYSwgMHgwMDAwLCAweDI1MGEsIDB4MDAwMCwgMHgyNjBjLCAweDAwMDAsIDB4MjYwYywgMHgwMDAwLAorCTB4MjcwZSwgMHgwMDAwLCAweDI3MGUsIDB4MDAwMCwgMHgyODEwLCAweDAwMDAsIDB4MjgxMCwgMHgwMDAwLAorCTB4MjkxMiwgMHgwMDAwLCAweDI5MTIsIDB4MDAwMCwgMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LAorCTB4MDAwNywgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMDUyLCAweDAwMDAsIDB4NDU1ZSwgMHgwMDBiLAorCTB4OTJjMCwgMHgwMDA5LCAweDA3ODAsIDB4MDAwOCwgMHgwZTE3LCAweDAwMDMsIDB4MTI0YiwgMHgwMDAyLAorCTB4MDk2NywgMHgwMDAzLCAweDJlNGQsIDB4MDAwMiwgMHgyZTRkLCAweDAwMDIsIDB4MGEwMSwgMHgwMDAzLAorCTB4M2E0NiwgMHgwMDBhLCAweDBkNzQsIDB4MDAwMywgMHg1OTY5LCAweDAwMGIsIDB4ODA1NCwgMHgwMDA4LAorCTB4MDAwNCwgMHgwMDAwLCAweDEyNDMsIDB4MDAwYSwgMHgwOTdlLCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwZCwgMHgwMDAwLCAweDAxZWYsIDB4MDAwNCwgMHgxODEwLCAweDAwMDAsIDB4MDFlZiwgMHgwMDA0LAorCTB4MDE3ZSwgMHgwMDAzLCAweDE5NGQsIDB4MDAwYSwgMHgwOTc4LCAweDAwMGIsIDB4MTI0MywgMHgwMDBhLAorCTB4MGEwYiwgMHgwMDAzLCAweDU5NzgsIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLAorCTB4MDFlNCwgMHgwMDBjLCAweDE4MTAsIDB4MDAwMCwgMHgwMWVmLCAweDAwMDQsIDB4ODA3NCwgMHgwMDAwLAorCTB4ZjAwMCwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLAorCTB4M2E0MiwgMHgwMDAyLCAweDBkODgsIDB4MDAwMywgMHgxNWZlLCAweDAwMDgsIDB4MzQ1MSwgMHgwMDBiLAorCTB4MDAwYSwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHgwNTAxLCAweDAwMDAsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwYywgMHgwMDA4LCAweDAxZWYsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGIsIDB4YmJlMCwgMHgwMDA5LAorCTB4MDAzMCwgMHgwMDA4LCAweDBkOWUsIDB4MDAwYiwgMHgxOGZlLCAweDAwMDAsIDB4M2NlMCwgMHgwMDA5LAorCTB4MDk5YiwgMHgwMDAzLCAweDE1ZmUsIDB4MDAwOCwgMHgzY2UwLCAweDAwMDksIDB4MDk5YiwgMHgwMDAzLAorCTB4MDFkZiwgMHgwMDA0LCAweDgwNzYsIDB4MDAwOCwgMHgwMDQwLCAweDAwMDAsIDB4MDFkYywgMHgwMDBiLAorCTB4ODA3NiwgMHgwMDA4LCAweDAwNDEsIDB4MDAwOCwgMHgwMWRjLCAweDAwMGIsIDB4YmJlMCwgMHgwMDA5LAorCTB4MDAzMiwgMHgwMDAwLCAweDBkYTMsIDB4MDAwMywgMHgzYzFlLCAweDAwMDgsIDB4MDFkYywgMHgwMDBiLAorCTB4YmJlMCwgMHgwMDA5LCAweDAwMzcsIDB4MDAwMCwgMHgwZGMxLCAweDAwMGIsIDB4MThmZSwgMHgwMDAwLAorCTB4M2NlMCwgMHgwMDA5LCAweDBkOWIsIDB4MDAwYiwgMHg4MDc2LCAweDAwMDgsIDB4MDA0MCwgMHgwMDAwLAorCTB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwgMHgwMDBkLCAweDAwMDAsIDB4MjYwNCwgMHgwMDA4LAorCTB4MjYwNCwgMHgwMDA4LCAweDI3MDYsIDB4MDAwOCwgMHgyNzA2LCAweDAwMDgsIDB4MjgwOCwgMHgwMDAwLAorCTB4MjgwOCwgMHgwMDAwLCAweDI5MGEsIDB4MDAwMCwgMHgyOTBhLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDQyMiwgMHgwMDAwLCAweDQ1YjgsIDB4MDAwMywgMHgwMWU0LCAweDAwMGMsIDB4ODA1NCwgMHgwMDA4LAorCTB4MDAwNCwgMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHhmMDAwLCAweDAwMDgsIDB4ODA3MiwgMHgwMDAwLAorCTB4YjAwMCwgMHgwMDAwLCAweDAxODIsIDB4MDAwMywgMHhiYmUwLCAweDAwMDksIDB4MDAzOCwgMHgwMDAwLAorCTB4MGRkMywgMHgwMDBiLCAweDE4ZmUsIDB4MDAwMCwgMHgzY2UwLCAweDAwMDksIDB4MDlkMCwgMHgwMDAzLAorCTB4MTVmZSwgMHgwMDA4LCAweDNjZTAsIDB4MDAwOSwgMHgwZDk3LCAweDAwMGIsIDB4MDFkZiwgMHgwMDA0LAorCTB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLAorCTB4MDIyNywgMHgwMDAzLCAweDgwNzYsIDB4MDAwOCwgMHgwMDQyLCAweDAwMDgsIDB4MDFkYywgMHgwMDBiLAorCTB4YmJlMCwgMHgwMDA5LCAweDAwMTYsIDB4MDAwMCwgMHgwZGRjLCAweDAwMGIsIDB4M2E0NCwgMHgwMDAyLAorCTB4MGMwYywgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDBmLAorCTB4MDAwYSwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLAorCTB4M2QzMCwgMHgwMDBhLCAweDdmMDAsIDB4MDAwMCwgMHhiYzgwLCAweDAwMDEsIDB4MDAwNywgMHgwMDAwLAorCTB4MDFlOCwgMHgwMDAzLCAweDE5MzAsIDB4MDAwYSwgMHg3ZjAwLCAweDAwMDAsIDB4OTg4MCwgMHgwMDAxLAorCTB4MDAwNywgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LAorCTB4ODA2NiwgMHgwMDAwLCAweDAwMGEsIDB4MDAwOCwgMHg0NWVkLCAweDAwMDMsIDB4NDAwMCwgMHgwMDBmLAorCTB4MjFlZiwgMHgwMDAzLCAweDA4NzAsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsIDB4YmFjMCwgMHgwMDA5LAorCTB4MDA5MCwgMHgwMDA4LCAweDA5ZjgsIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsIDB4MDcwNiwgMHgwMDAwLAorCTB4MDFmYSwgMHgwMDAzLCAweDgwNzQsIDB4MDAwMCwgMHgwNzAzLCAweDAwMDAsIDB4NDAwMCwgMHgwMDBmLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMjMsIDB4MDAwMCwgMHgwMjM1LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwOCwgMHgwMDAwLCAweDAyMzUsIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsIDB4MDAyMiwgMHgwMDA4LAorCTB4MDIzNSwgMHgwMDAzLCAweDAxZTQsIDB4MDAwYywgMHg4MDEwLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLAorCTB4MDFlZiwgMHgwMDA0LCAweDE4MTAsIDB4MDAwMCwgMHgwMWVmLCAweDAwMDQsIDB4MDI0MSwgMHgwMDAzLAorCTB4MDFlNCwgMHgwMDBjLCAweDgwMTAsIDB4MDAwOCwgMHgwMDFiLCAweDAwMDgsIDB4MDFlZiwgMHgwMDA0LAorCTB4MTgxMCwgMHgwMDAwLCAweDAxZWYsIDB4MDAwNCwgMHg4MDc0LCAweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwZDMwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMDksIDB4MDAwOCwgMHgwMjM1LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwNSwgMHgwMDA4LCAweDAyMzUsIDB4MDAwMywgMHg4MDhjLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHg0MTQzLCAweDAwMGEsIDB4MDg1ZiwgMHgwMDAzLAorCTB4M2E0NCwgMHgwMDAyLCAweDBjMGEsIDB4MDAwYiwgMHgwZDJhLCAweDAwMDgsIDB4MDIzNSwgMHgwMDAzLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMDMsIDB4MDAwOCwgMHgwMjM5LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwYiwgMHgwMDAwLCAweDAyMzksIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLAorCTB4MDIzOSwgMHgwMDAzLCAweDNhNDcsIDB4MDAwMiwgMHgwZDJkLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwNiwgMHgwMDA4LCAweDAyMzksIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsIDB4ZjAwMCwgMHgwMDA4LAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwMWVmLCAweDAwMDQsIDB4MDFmMiwgMHgwMDA0LAorCTB4M2E0MCwgMHgwMDBhLCAweDA4MGEsIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsIDB4MDAwYywgMHgwMDA4LAorCTB4MDFlZiwgMHgwMDA0LCAweDAwMGEsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwZDMwLCAweDAwMDAsIDB4MmU0ZCwgMHgwMDAyLAorCTB4MmU0ZCwgMHgwMDAyLCAweDBhNGMsIDB4MDAwMywgMHg4MDU0LCAweDAwMDgsIDB4MDAxOSwgMHgwMDAwLAorCTB4MDAwYSwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDgsIDB4MDAwYSwgMHgwMDBiLAorCTB4M2E0NCwgMHgwMDAyLCAweDBjMGEsIDB4MDAwYiwgMHgwMjJhLCAweDAwMGIsIDB4MTViNiwgMHhmNGFjLAorCTB4MDAwMywgMHgwMDBiLCAweDA0ODAsIDB4MDAwMCwgMHhjMDAwLCAweDAwMDEsIDB4ODA2NCwgMHgwMDA4LAorCTB4MDAxMCwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMTAxLCAweDAwMDgsIDB4YzAwNywgMHgwMDAzLAorCTB4ODA2MCwgMHgwMDAwLCAweDA0MDAsIDB4MDAwMCwgMHg1ODBkLCAweDAwMGIsIDB4Nzk3NywgMHgwMDAzLAorCTB4NTBkYiwgMHgwMDBiLCAweGM4MGEsIDB4MDAwMywgMHhiYWMwLCAweDAwMDksIDB4MDA4YSwgMHgwMDAwLAorCTB4ODgwYSwgMHgwMDBiLCAweDE1ZmUsIDB4MDAwOCwgMHhiMDBhLCAweDAwMDMsIDB4YzRjMCwgMHgwMDA5LAorCTB4NzAwMCwgMHgwMDAwLCAweGZmYTAsIDB4MDAwMSwgMHgyMDAwLCAweDAwMDAsIDB4OTIxNCwgMHgwMDAzLAorCTB4ODA4YywgMHgwMDA4LCAweDAwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDcsIDB4NDA0NywgMHgwMDBhLAorCTB4ODA4YywgMHgwMDA4LCAweDAwMDIsIDB4MDAwMCwgMHgwODIxLCAweDAwMDMsIDB4NDAyMiwgMHgwMDAwLAorCTB4MDAyMiwgMHgwMDBiLCAweDQxMjIsIDB4MDAwOCwgMHg0NDQ3LCAweDAwMDIsIDB4OGEzYywgMHgwMDAzLAorCTB4MGJmZSwgMHgwMDA4LCAweDExYTAsIDB4MDAwMSwgMHgxMjFhLCAweDAwMDMsIDB4MGNhMCwgMHgwMDAxLAorCTB4MTIxYSwgMHgwMDAzLCAweDkxODAsIDB4MDAwMSwgMHgwMDA0LCAweDAwMDAsIDB4ODA2MCwgMHgwMDAwLAorCTB4MDQwMCwgMHgwMDAwLCAweDdmNjIsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDAwOSwgMHgwMDA4LAorCTB4YzAzMCwgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDgsIDB4MDA2MCwgMHgwMDA4LAorCTB4ODA2MiwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDQxMSwgMHgwMDAwLAorCTB4YzAzOCwgMHgwMDAzLCAweDAzZmUsIDB4MDAwMCwgMHg0M2UwLCAweDAwMDEsIDB4OGExNywgMHgwMDAzLAorCTB4YzJjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwgMHgwMmUwLCAweDAwMDEsIDB4OGExNywgMHgwMDAzLAorCTB4OTE4MCwgMHgwMDAxLCAweDAwMDUsIDB4MDAwOCwgMHg4MDYwLCAweDAwMDAsIDB4MDQwMCwgMHgwMDAwLAorCTB4N2Y2MiwgMHgwMDA4LCAweDgwNjYsIDB4MDAwMCwgMHgwMDE5LCAweDAwMDAsIDB4YzA0NywgMHgwMDBiLAorCTB4MDI0MCwgMHgwMDAyLCAweDBhMTQsIDB4MDAwYiwgMHgwMGZlLCAweDAwMDAsIDB4MzIxNywgMHgwMDAzLAorCTB4MTEyYSwgMHgwMDAwLCAweDAwMmUsIDB4MDAwOCwgMHgwMjJjLCAweDAwMDgsIDB4M2E0NCwgMHgwMDAyLAorCTB4ODgwYSwgMHgwMDBiLCAweDgwOGMsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsIDB4MTc2MCwgMHgwMDA4LAorCTB4ODA2MiwgMHgwMDA4LCAweDAwMGYsIDB4MDAwOCwgMHg4MDY2LCAweDAwMDAsIDB4MDAxMSwgMHgwMDA4LAorCTB4YzA1OCwgMHgwMDAzLCAweDAxZmUsIDB4MDAwOCwgMHg0MmUwLCAweDAwMDksIDB4OGEwYSwgMHgwMDAzLAorCTB4MDBmZSwgMHgwMDAwLCAweDQzZTAsIDB4MDAwMSwgMHg4YTBhLCAweDAwMDMsIDB4MTczNCwgMHgwMDAwLAorCTB4MTUzMCwgMHgwMDAwLCAweDE2MzIsIDB4MDAwOCwgMHgwZDJhLCAweDAwMDgsIDB4OTg4MCwgMHgwMDAxLAorCTB4MDAxMCwgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LAorCTB4ODA2NiwgMHgwMDAwLCAweDFlMGEsIDB4MDAwOCwgMHhjMDZhLCAweDAwMGIsIDB4ODA4YSwgMHgwMDA4LAorCTB4MDAwMywgMHgwMDA4LCAweDFhNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLAorCTB4NTg3MCwgMHgwMDBiLCAweDgwNjYsIDB4MDAwMCwgMHgzNjc5LCAweDAwMDAsIDB4YzA3MywgMHgwMDAzLAorCTB4NTg3NCwgMHgwMDAzLCAweDNlZmUsIDB4MDAwOCwgMHg3ZjRmLCAweDAwMDIsIDB4MDg3YSwgMHgwMDBiLAorCTB4MGQwMCwgMHgwMDAwLCAweDAwODIsIDB4MDAwNCwgMHg4MDU0LCAweDAwMDgsIDB4MDAxMSwgMHgwMDA4LAorCTB4ODA3NCwgMHgwMDAwLCAweDEwMTAsIDB4MDAwOCwgMHgxZWZlLCAweDAwMDAsIDB4MzAwYSwgMHgwMDBiLAorCTB4MDBiOCwgMHgwMDA0LCAweDAwMGEsIDB4MDAwYiwgMHgwMGZlLCAweDAwMDAsIDB4YjA4YSwgMHgwMDBiLAorCTB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwgMHgwMDA3LCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDIzMSwgMHgwMDA4LCAweGMwODksIDB4MDAwMywgMHgwM2ZlLCAweDAwMDAsIDB4MDRkMCwgMHgwMDAxLAorCTB4ODhiMCwgMHgwMDAzLCAweDgyYzAsIDB4MDAwMSwgMHgxZjAwLCAweDAwMDAsIDB4ZmZhMCwgMHgwMDAxLAorCTB4MDQwMCwgMHgwMDAwLCAweDA4OWYsIDB4MDAwMywgMHg5MGIwLCAweDAwMDMsIDB4MDFmZSwgMHgwMDA4LAorCTB4MDU4MCwgMHgwMDA5LCAweDdmMDYsIDB4MDAwMCwgMHgwMmZlLCAweDAwMDgsIDB4ZmZjMCwgMHgwMDAxLAorCTB4MDBmZiwgMHgwMDA4LCAweDA2OTAsIDB4MDAwMSwgMHgxMDlmLCAweDAwMDMsIDB4N2YwOCwgMHgwMDA4LAorCTB4ODRjMCwgMHgwMDAxLCAweGZmMDAsIDB4MDAwOCwgMHgwOGIwLCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLAorCTB4YjBhNiwgMHgwMDAzLCAweDgwNzIsIDB4MDAwMCwgMHgxMDEwLCAweDAwMDgsIDB4Mzk0NCwgMHgwMDAyLAorCTB4MDhhMSwgMHgwMDBiLCAweDAwYWEsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4MjAyMCwgMHgwMDA4LAorCTB4Mzk0NSwgMHgwMDBhLCAweDA4YTYsIDB4MDAwMywgMHgzOTQ2LCAweDAwMGEsIDB4ODhiNywgMHgwMDBiLAorCTB4MDAwMCwgMHgwMDA3LCAweDM5NDMsIDB4MDAwYSwgMHgwOGI3LCAweDAwMDMsIDB4MDBhYSwgMHgwMDBiLAorCTB4MDBmZSwgMHgwMDAwLCAweGIwYjUsIDB4MDAwYiwgMHg4MDcyLCAweDAwMDAsIDB4MTAwMCwgMHgwMDAwLAorCTB4MDBiNywgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4NDAwMCwgMHgwMDBmLAorCTB4MWM2MCwgMHgwMDAwLCAweDFiNjIsIDB4MDAwMCwgMHg4MDY2LCAweDAwMDAsIDB4MDIzMSwgMHgwMDA4LAorCTB4YzBiYywgMHgwMDAzLCAweDU4YmQsIDB4MDAwMywgMHgwMTQwLCAweDAwMDgsIDB4MDI0MiwgMHgwMDAwLAorCTB4MWY0MywgMHgwMDAyLCAweDg4Y2IsIDB4MDAwMywgMHgwZDQ0LCAweDAwMDAsIDB4MGQ0NiwgMHgwMDA4LAorCTB4MDM0OCwgMHgwMDA4LCAweDA0NGEsIDB4MDAwOCwgMHgwMzBhLCAweDAwMDgsIDB4MDQwYywgMHgwMDAwLAorCTB4MGQwNiwgMHgwMDAwLCAweDBkMDgsIDB4MDAwOCwgMHgwMGNmLCAweDAwMGIsIDB4MDM0NCwgMHgwMDA4LAorCTB4MDQ0NiwgMHgwMDA4LCAweDA1NDgsIDB4MDAwOCwgMHgwNjRhLCAweDAwMDAsIDB4NThjZiwgMHgwMDAzLAorCTB4M2VmZSwgMHgwMDA4LCAweDdmNGYsIDB4MDAwMiwgMHgwOGQ2LCAweDAwMGIsIDB4ODAwMCwgMHgwMDAwLAorCTB4MDAwMSwgMHgwMDAwLCAweDAwODIsIDB4MDAwNCwgMHg4MDU0LCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLAorCTB4ODA3NCwgMHgwMDAwLCAweDIwMjAsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsIDB4M2E0MCwgMHgwMDBhLAorCTB4ODgwZCwgMHgwMDAzLCAweGFiZDAsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDgsIDB4N2YyNCwgMHgwMDAwLAorCTB4NThlMCwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwgMHgwMDAyLCAweDAwMDAsIDB4MTI0MiwgMHgwMDAyLAorCTB4MDkzMCwgMHgwMDBiLCAweDNhNDUsIDB4MDAwYSwgMHgwOTFkLCAweDAwMGIsIDB4ODA3MiwgMHgwMDAwLAorCTB4MTAwMCwgMHgwMDAwLCAweDM5NDUsIDB4MDAwYSwgMHgwOGVkLCAweDAwMDMsIDB4ODA3MiwgMHgwMDAwLAorCTB4MzAxMCwgMHgwMDAwLCAweDFlMTAsIDB4MDAwYSwgMHg3ZjNjLCAweDAwMDAsIDB4MDkxOCwgMHgwMDBiLAorCTB4MWQwMCwgMHgwMDAyLCAweDdmM2EsIDB4MDAwMCwgMHgwZDYwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LAorCTB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwgMHhjMGY2LCAweDAwMGIsIDB4MDBmZSwgMHgwMDAwLAorCTB4YjExNSwgMHgwMDAzLCAweDFjNjAsIDB4MDAwMCwgMHg4MDYyLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLAorCTB4ODA2NiwgMHgwMDAwLCAweDAwMDksIDB4MDAwOCwgMHhjMGZlLCAweDAwMDMsIDB4MDBmZSwgMHgwMDAwLAorCTB4MzFmMSwgMHgwMDBiLCAweDAwMzgsIDB4MDAwMCwgMHgwMDYwLCAweDAwMDgsIDB4ODA2MiwgMHgwMDA4LAorCTB4MDAxOSwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgwMDA5LCAweDAwMDgsIDB4YzEwNywgMHgwMDBiLAorCTB4ODBjMCwgMHgwMDA5LCAweDAwZmYsIDB4MDAwOCwgMHg3ZjNlLCAweDAwMDgsIDB4MGQ2MCwgMHgwMDAwLAorCTB4MGVmZSwgMHgwMDA4LCAweDFmODAsIDB4MDAwMSwgMHg3ZjYyLCAweDAwMDgsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDAwOSwgMHgwMDA4LCAweGMxMTEsIDB4MDAwMywgMHgwMDNhLCAweDAwMDgsIDB4MWRmZSwgMHgwMDAwLAorCTB4MDBmMiwgMHgwMDAzLCAweDAwMzYsIDB4MDAwOCwgMHgwMGI4LCAweDAwMDQsIDB4MDEzMCwgMHgwMDAzLAorCTB4ODA3NCwgMHgwMDAwLCAweDIwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLAorCTB4MDEzMCwgMHgwMDAzLCAweDNhNDQsIDB4MDAwMiwgMHgwYTFkLCAweDAwMGIsIDB4ODA3NCwgMHgwMDAwLAorCTB4MTAwMCwgMHgwMDAwLCAweDgwNzIsIDB4MDAwMCwgMHgxMDAwLCAweDAwMDAsIDB4YWRkMCwgMHgwMDAxLAorCTB4MDAwMCwgMHgwMDA4LCAweDdmMGUsIDB4MDAwOCwgMHhiMWVlLCAweDAwMGIsIDB4YTdkMCwgMHgwMDAxLAorCTB4MDAwMCwgMHgwMDA4LCAweDdmMDAsIDB4MDAwMCwgMHhhNmQwLCAweDAwMDksIDB4MDAwMCwgMHgwMDA4LAorCTB4MDBkMCwgMHgwMDA5LCAweDg5NDIsIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsIDB4NDA0MCwgMHgwMDA4LAorCTB4NTkzMCwgMHgwMDBiLCAweDUwZGIsIDB4MDAwYiwgMHgzYTQ2LCAweDAwMGEsIDB4ODk0MiwgMHgwMDAzLAorCTB4M2E0NywgMHgwMDAyLCAweDA5M2QsIDB4MDAwMywgMHg4MDU0LCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLAorCTB4ODA3NCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4MzAwMCwgMHgwMDA4LAorCTB4MDE2YiwgMHgwMDBiLCAweDkyYzAsIDB4MDAwOSwgMHgwZmM4LCAweDAwMDAsIDB4MDgwYSwgMHgwMDAzLAorCTB4MTI0NiwgMHgwMDBhLCAweDg5ZTgsIDB4MDAwMywgMHgxYTYwLCAweDAwMDAsIDB4ODA2MiwgMHgwMDA4LAorCTB4MDAwMiwgMHgwMDAwLCAweDgwNjYsIDB4MDAwMCwgMHgzNjdhLCAweDAwMDAsIDB4YzE0NywgMHgwMDAzLAorCTB4OTJjMCwgMHgwMDA5LCAweDA3ODAsIDB4MDAwOCwgMHg4YTA0LCAweDAwMGIsIDB4MTI0YiwgMHgwMDAyLAorCTB4MDk1MCwgMHgwMDBiLCAweDJlNGQsIDB4MDAwMiwgMHgyZTRkLCAweDAwMDIsIDB4MDllZSwgMHgwMDBiLAorCTB4M2E0NiwgMHgwMDBhLCAweDg5NWQsIDB4MDAwYiwgMHg1OTUyLCAweDAwMDMsIDB4ODA1NCwgMHgwMDA4LAorCTB4MDAwNCwgMHgwMDAwLCAweDEyNDMsIDB4MDAwYSwgMHgwOTY3LCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwZCwgMHgwMDAwLCAweDAxZGMsIDB4MDAwNCwgMHgxODEwLCAweDAwMDAsIDB4MDFkYywgMHgwMDA0LAorCTB4MDE2NywgMHgwMDBiLCAweDE5NGQsIDB4MDAwYSwgMHgwOTYxLCAweDAwMDMsIDB4MTI0MywgMHgwMDBhLAorCTB4MDlmOCwgMHgwMDAzLCAweDU5NjEsIDB4MDAwMywgMHg4MDU0LCAweDAwMDgsIDB4MDAwNCwgMHgwMDAwLAorCTB4MDFkMSwgMHgwMDBjLCAweDE4MTAsIDB4MDAwMCwgMHgwMWRjLCAweDAwMDQsIDB4ODA3NCwgMHgwMDAwLAorCTB4ZjAwMCwgMHgwMDA4LCAweDgwNzIsIDB4MDAwMCwgMHgzMDAwLCAweDAwMDgsIDB4MGQzMCwgMHgwMDAwLAorCTB4M2E0MiwgMHgwMDAyLCAweDg5NzEsIDB4MDAwMywgMHgxNWZlLCAweDAwMDgsIDB4YjA1MSwgMHgwMDBiLAorCTB4MDAwYSwgMHgwMDBiLCAweDgwNzQsIDB4MDAwMCwgMHgwNTAxLCAweDAwMDAsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwYywgMHgwMDA4LCAweDAxZGMsIDB4MDAwNCwgMHgwMDBhLCAweDAwMGIsIDB4YmJlMCwgMHgwMDA5LAorCTB4MDAzMCwgMHgwMDA4LCAweDg5ODcsIDB4MDAwMywgMHgxOGZlLCAweDAwMDAsIDB4M2NlMCwgMHgwMDA5LAorCTB4MDk4NCwgMHgwMDBiLCAweDE1ZmUsIDB4MDAwOCwgMHgzY2UwLCAweDAwMDksIDB4MDk4NCwgMHgwMDBiLAorCTB4MDFjYywgMHgwMDBjLCAweDgwNzYsIDB4MDAwOCwgMHgwMDQwLCAweDAwMDAsIDB4MDFjOSwgMHgwMDAzLAorCTB4ODA3NiwgMHgwMDA4LCAweDAwNDEsIDB4MDAwOCwgMHgwMWM5LCAweDAwMDMsIDB4YmJlMCwgMHgwMDA5LAorCTB4MDAzMiwgMHgwMDAwLCAweDg5OGMsIDB4MDAwYiwgMHgzYzFlLCAweDAwMDgsIDB4MDFjOSwgMHgwMDAzLAorCTB4YmJlMCwgMHgwMDA5LCAweDAwMzcsIDB4MDAwMCwgMHg4OWFlLCAweDAwMGIsIDB4MThmZSwgMHgwMDAwLAorCTB4M2NlMCwgMHgwMDA5LCAweDg5ODQsIDB4MDAwMywgMHg4MDc2LCAweDAwMDgsIDB4MDA0MCwgMHgwMDAwLAorCTB4MWE2MCwgMHgwMDAwLCAweDgwNjIsIDB4MDAwOCwgMHgwMDBkLCAweDAwMDAsIDB4YTZkMCwgMHgwMDA5LAorCTB4MDAwMCwgMHgwMDA4LCAweDdmMDQsIDB4MDAwOCwgMHhhN2QwLCAweDAwMDEsIDB4MDAwMCwgMHgwMDA4LAorCTB4N2YwNiwgMHgwMDAwLCAweGE4ZDAsIDB4MDAwMSwgMHgwMDAwLCAweDAwMDgsIDB4N2YwOCwgMHgwMDA4LAorCTB4YTlkMCwgMHgwMDA5LCAweDAwMDAsIDB4MDAwOCwgMHg3ZjBhLCAweDAwMDAsIDB4ODA2NiwgMHgwMDAwLAorCTB4MDQyMiwgMHgwMDAwLCAweGMxYTUsIDB4MDAwMywgMHgwMWQxLCAweDAwMGMsIDB4ODA1NCwgMHgwMDA4LAorCTB4MDAwNCwgMHgwMDAwLCAweDgwNzQsIDB4MDAwMCwgMHhmMDAwLCAweDAwMDgsIDB4ODA3MiwgMHgwMDAwLAorCTB4YjAwMCwgMHgwMDAwLCAweDAxNmIsIDB4MDAwYiwgMHhiYmUwLCAweDAwMDksIDB4MDAzOCwgMHgwMDAwLAorCTB4ODljMCwgMHgwMDAzLCAweDE4ZmUsIDB4MDAwMCwgMHgzY2UwLCAweDAwMDksIDB4MDliZCwgMHgwMDBiLAorCTB4MTVmZSwgMHgwMDA4LCAweDNjZTAsIDB4MDAwOSwgMHg4OTgwLCAweDAwMGIsIDB4MDFjYywgMHgwMDBjLAorCTB4ODA3NiwgMHgwMDA4LCAweDAwNDAsIDB4MDAwMCwgMHg4MDcyLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLAorCTB4MDIxNCwgMHgwMDAzLCAweDgwNzYsIDB4MDAwOCwgMHgwMDQyLCAweDAwMDgsIDB4MDFjOSwgMHgwMDAzLAorCTB4YmJlMCwgMHgwMDA5LCAweDAwMTYsIDB4MDAwMCwgMHg4OWM5LCAweDAwMDMsIDB4M2E0NCwgMHgwMDAyLAorCTB4ODgwYywgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDBmLAorCTB4MDAwYSwgMHgwMDBiLCAweDgwNzIsIDB4MDAwMCwgMHg4MDAwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLAorCTB4M2QzMCwgMHgwMDBhLCAweDdmMDAsIDB4MDAwMCwgMHhiYzgwLCAweDAwMDEsIDB4MDAwNywgMHgwMDAwLAorCTB4MDFkNSwgMHgwMDBiLCAweDE5MzAsIDB4MDAwYSwgMHg3ZjAwLCAweDAwMDAsIDB4OTg4MCwgMHgwMDAxLAorCTB4MDAwNywgMHgwMDAwLCAweDgwNjAsIDB4MDAwMCwgMHgwNDAwLCAweDAwMDAsIDB4N2Y2MiwgMHgwMDA4LAorCTB4ODA2NiwgMHgwMDAwLCAweDAwMGEsIDB4MDAwOCwgMHhjMWRhLCAweDAwMGIsIDB4NDAwMCwgMHgwMDBmLAorCTB4MjFkYywgMHgwMDAzLCAweDA4NzAsIDB4MDAwOCwgMHg0MDAwLCAweDAwMGYsIDB4YmFjMCwgMHgwMDA5LAorCTB4MDA5MCwgMHgwMDA4LCAweDA5ZTUsIDB4MDAwMywgMHg4MDc0LCAweDAwMDAsIDB4MDcwNiwgMHgwMDAwLAorCTB4MDFlNywgMHgwMDAzLCAweDgwNzQsIDB4MDAwMCwgMHgwNzAzLCAweDAwMDAsIDB4NDAwMCwgMHgwMDBmLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMjMsIDB4MDAwMCwgMHgwMjIyLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwOCwgMHgwMDAwLCAweDAyMjIsIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsIDB4MDAyMiwgMHgwMDA4LAorCTB4MDIyMiwgMHgwMDAzLCAweDAxZDEsIDB4MDAwYywgMHg4MDEwLCAweDAwMDgsIDB4MDAwNywgMHgwMDAwLAorCTB4MDFkYywgMHgwMDA0LCAweDE4MTAsIDB4MDAwMCwgMHgwMWRjLCAweDAwMDQsIDB4MDIyZSwgMHgwMDAzLAorCTB4MDFkMSwgMHgwMDBjLCAweDgwMTAsIDB4MDAwOCwgMHgwMDFiLCAweDAwMDgsIDB4MDFkYywgMHgwMDA0LAorCTB4MTgxMCwgMHgwMDAwLCAweDAxZGMsIDB4MDAwNCwgMHg4MDc0LCAweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwZDMwLCAweDAwMDAsIDB4MDAwYSwgMHgwMDBiLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMDksIDB4MDAwOCwgMHgwMjIyLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwNSwgMHgwMDA4LCAweDAyMjIsIDB4MDAwMywgMHg4MDhjLCAweDAwMDgsIDB4MDAwMSwgMHgwMDAwLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHg0MTQzLCAweDAwMGEsIDB4MDg1ZiwgMHgwMDAzLAorCTB4M2E0NCwgMHgwMDAyLCAweDg4MGEsIDB4MDAwYiwgMHgwZDJhLCAweDAwMDgsIDB4MDIyMiwgMHgwMDAzLAorCTB4ODAxMCwgMHgwMDA4LCAweDAwMDMsIDB4MDAwOCwgMHgwMjI2LCAweDAwMGIsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwYiwgMHgwMDAwLCAweDAyMjYsIDB4MDAwYiwgMHg4MDEwLCAweDAwMDgsIDB4MDAwMiwgMHgwMDAwLAorCTB4MDIyNiwgMHgwMDBiLCAweDNhNDcsIDB4MDAwMiwgMHg4OTMwLCAweDAwMDMsIDB4ODAxMCwgMHgwMDA4LAorCTB4MDAwNiwgMHgwMDA4LCAweDAyMjYsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsIDB4ZjAwMCwgMHgwMDA4LAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwMWRjLCAweDAwMDQsIDB4MDFkZiwgMHgwMDA0LAorCTB4M2E0MCwgMHgwMDBhLCAweDA4MGEsIDB4MDAwMywgMHg4MDEwLCAweDAwMDgsIDB4MDAwYywgMHgwMDA4LAorCTB4MDFkYywgMHgwMDA0LCAweDAwMGEsIDB4MDAwYiwgMHg4MDc0LCAweDAwMDAsIDB4ZjA4MCwgMHgwMDAwLAorCTB4ODA3MiwgMHgwMDAwLCAweDMwMDAsIDB4MDAwOCwgMHgwZDMwLCAweDAwMDAsIDB4MmU0ZCwgMHgwMDAyLAorCTB4MmU0ZCwgMHgwMDAyLCAweDBhMzksIDB4MDAwYiwgMHg4MDU0LCAweDAwMDgsIDB4MDAxOSwgMHgwMDAwLAorCTB4MDAwYSwgMHgwMDBiLCAweDgwNTQsIDB4MDAwOCwgMHgwMDA5LCAweDAwMDgsIDB4MDAwYSwgMHgwMDBiLAorCTB4M2E0NCwgMHgwMDAyLCAweDg4MGEsIDB4MDAwYiwgMHgwMjE3LCAweDAwMDMsIDB4ZjRlNSwgMHhmNDgyLAorCTB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorCTB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCwgMHg4MDAwLAorCTB4Njg3MAorfTsKKyNpZmRlZiBVTklRVUVfRldfTkFNRQordW5zaWduZWQgc2hvcnQgZncyMzAwZmx4X2xlbmd0aDAxID0gMHhkZDc5OworI2Vsc2UKK3Vuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9sZW5ndGgwMSA9IDB4ZGQ3OTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMzNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwpAQCAtMCwwICsxLDExNTggQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworc3RhdGljIGludCBxbGFfdXByaW50ZihjaGFyICoqLCBjaGFyICosIC4uLik7CisKKy8qKgorICogcWxhMjMwMF9md19kdW1wKCkgLSBEdW1wcyBiaW5hcnkgZGF0YSBmcm9tIHRoZSAyMzAwIGZpcm13YXJlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaGFyZHdhcmVfbG9ja2VkOiBDYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmVfbG9jaworICovCit2b2lkCitxbGEyMzAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDMyX3QJY250LCB0aW1lcjsKKwl1aW50MzJfdAlyaXNjX2FkZHJlc3M7CisJdWludDE2X3QJbWIwLCBtYjI7CisKKwl1aW50MzJfdAlzdGF0OworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQxNl90IF9faW9tZW0gKmRtcF9yZWc7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgcWxhMjMwMF9md19kdW1wCSpmdzsKKwl1aW50MzJfdAlkdW1wX3NpemUsIGRhdGFfcmFtX2NudDsKKworCXJpc2NfYWRkcmVzcyA9IGRhdGFfcmFtX2NudCA9IDA7CisJbWIwID0gbWIyID0gMDsKKwlmbGFncyA9IDA7CisKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoaGEtPmZ3X2R1bXAgIT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAtLSBpZ25vcmluZyAiCisJCSAgICAicmVxdWVzdC4uLlxuIiwgaGEtPmZ3X2R1bXApOworCQlnb3RvIHFsYTIzMDBfZndfZHVtcF9mYWlsZWQ7CisJfQorCisJLyogQWxsb2NhdGUgKGxhcmdlKSBkdW1wIGJ1ZmZlci4gKi8KKwlkdW1wX3NpemUgPSBzaXplb2Yoc3RydWN0IHFsYTIzMDBfZndfZHVtcCk7CisJZHVtcF9zaXplICs9IChoYS0+ZndfbWVtb3J5X3NpemUgLSAweDExMDAwKSAqIHNpemVvZih1aW50MTZfdCk7CisJaGEtPmZ3X2R1bXBfb3JkZXIgPSBnZXRfb3JkZXIoZHVtcF9zaXplKTsKKwloYS0+ZndfZHVtcCA9IChzdHJ1Y3QgcWxhMjMwMF9md19kdW1wICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywKKwkgICAgaGEtPmZ3X2R1bXBfb3JkZXIpOworCWlmIChoYS0+ZndfZHVtcCA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGVkIG1lbW9yeSBmb3IgZmlybXdhcmUgZHVtcCAoJWQvJWQpLlxuIiwKKwkJICAgIGhhLT5md19kdW1wX29yZGVyLCBkdW1wX3NpemUpOworCQlnb3RvIHFsYTIzMDBfZndfZHVtcF9mYWlsZWQ7CisJfQorCWZ3ID0gaGEtPmZ3X2R1bXA7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisJZnctPmhjY3IgPSBSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKworCS8qIFBhdXNlIFJJU0MuICovCisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUEFVU0VfUklTQyk7IAorCWlmIChJU19RTEEyMzAwKGhhKSkgeworCQlmb3IgKGNudCA9IDMwMDAwOworCQkgICAgKFJEX1JFR19XT1JEKCZyZWctPmhjY3IpICYgSENDUl9SSVNDX1BBVVNFKSA9PSAwICYmCisJCQlydmFsID09IFFMQV9TVUNDRVNTOyBjbnQtLSkgeworCQkJaWYgKGNudCkKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCWVsc2UKKwkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJCX0KKwl9IGVsc2UgeworCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKShyZWcgKyAwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnBiaXVfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5wYml1X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4MTApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ob3N0X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ob3N0X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4NDApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+bWFpbGJveF9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPm1haWxib3hfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHg0MCk7CisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yZXNwX2RtYV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJlc3BfZG1hX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4NTApOworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZG1hX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+ZG1hX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MDApOworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4QTApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19oZHdfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2hkd19yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyMDAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwMF9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3AwX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDIyMDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3AxX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDFfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjQwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDJfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwMl9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyNjAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwM19yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3AzX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDI4MDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3A0X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDRfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MkEwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDVfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwNV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyQzAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwNl9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3A2X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDJFMDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3A3X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDdfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgxMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZnJhbWVfYnVmX2hkd19yZWcpIC8gMjsgY250KyspIAorCQkJZnctPmZyYW1lX2J1Zl9oZHdfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgyMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZnBtX2IwX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+ZnBtX2IwX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MzApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmZwbV9iMV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPmZwbV9iMV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJLyogUmVzZXQgUklTQy4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCBDU1JfSVNQX1NPRlRfUkVTRVQpOworCQlmb3IgKGNudCA9IDA7IGNudCA8IDMwMDAwOyBjbnQrKykgeworCQkJaWYgKChSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cykgJgorCQkJICAgIENTUl9JU1BfU09GVF9SRVNFVCkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJdWRlbGF5KDEwKTsKKwkJfQorCX0KKworCWlmICghSVNfUUxBMjMwMChoYSkpIHsKKwkJZm9yIChjbnQgPSAzMDAwMDsgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCkgIT0gMCAmJgorCQkgICAgcnZhbCA9PSBRTEFfU1VDQ0VTUzsgY250LS0pIHsKKwkJCWlmIChjbnQpCisJCQkJdWRlbGF5KDEwMCk7CisJCQllbHNlCisJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOworCQl9CisJfQorCisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJLyogR2V0IFJJU0MgU1JBTS4gKi8KKwkJcmlzY19hZGRyZXNzID0gMHg4MDA7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCwgTUJDX1JFQURfUkFNX1dPUkQpOworCQljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKwl9CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfcmFtKSAvIDIgJiYgcnZhbCA9PSBRTEFfU1VDQ0VTUzsKKwkgICAgY250KyssIHJpc2NfYWRkcmVzcysrKSB7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSwgKHVpbnQxNl90KXJpc2NfYWRkcmVzcyk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1NFVF9IT1NUX0lOVCk7CisKKwkJZm9yICh0aW1lciA9IDYwMDAwMDA7IHRpbWVyOyB0aW1lci0tKSB7CisJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworIAkJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc3RhdHVzKTsKKwkJCWlmIChzdGF0ICYgSFNSX1JJU0NfSU5UKSB7CisJCQkJc3RhdCAmPSAweGZmOworCisJCQkJaWYgKHN0YXQgPT0gMHgxIHx8IHN0YXQgPT0gMHgyKSB7CisJCQkJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwKKwkJCQkJICAgICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJCQkJbWIwID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisJCQkJCW1iMiA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCisJCQkJCS8qIFJlbGVhc2UgbWFpbGJveCByZWdpc3RlcnMuICovCisJCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoc3RhdCA9PSAweDEwIHx8IHN0YXQgPT0gMHgxMSkgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJCQltYjIgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIGNsZWFyIHRoaXMgaW50cjsgaXQgd2Fzbid0IGEgbWFpbGJveCBpbnRyICovCisJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCX0KKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkgeworCQkJcnZhbCA9IG1iMCAmIE1CU19NQVNLOworCQkJZnctPnJpc2NfcmFtW2NudF0gPSBtYjI7CisJCX0gZWxzZSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCS8qIEdldCBzdGFjayBTUkFNLiAqLworCQlyaXNjX2FkZHJlc3MgPSAweDEwMDAwOworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDAsIE1CQ19SRUFEX1JBTV9FWFRFTkRFRCk7CisJCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCX0KKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+c3RhY2tfcmFtKSAvIDIgJiYgcnZhbCA9PSBRTEFfU1VDQ0VTUzsKKwkgICAgY250KyssIHJpc2NfYWRkcmVzcysrKSB7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSwgTFNXKHJpc2NfYWRkcmVzcykpOworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDgsIE1TVyhyaXNjX2FkZHJlc3MpKTsKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfU0VUX0hPU1RfSU5UKTsKKworCQlmb3IgKHRpbWVyID0gNjAwMDAwMDsgdGltZXI7IHRpbWVyLS0pIHsKKwkJCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCisgCQkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zdGF0dXMpOworCQkJaWYgKHN0YXQgJiBIU1JfUklTQ19JTlQpIHsKKwkJCQlzdGF0ICY9IDB4ZmY7CisKKwkJCQlpZiAoc3RhdCA9PSAweDEgfHwgc3RhdCA9PSAweDIpIHsKKwkJCQkJc2V0X2JpdChNQlhfSU5URVJSVVBULAorCQkJCQkgICAgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCQkJCQltYjAgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwkJCQkJbWIyID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CisKKwkJCQkJLyogUmVsZWFzZSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CisJCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLAorCQkJCQkgICAgSENDUl9DTFJfUklTQ19JTlQpOworCQkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChzdGF0ID09IDB4MTAgfHwgc3RhdCA9PSAweDExKSB7CisJCQkJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwKKwkJCQkJICAgICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJCQkJbWIwID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisJCQkJCW1iMiA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCisJCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLAorCQkJCQkgICAgSENDUl9DTFJfUklTQ19JTlQpOworCQkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogY2xlYXIgdGhpcyBpbnRyOyBpdCB3YXNuJ3QgYSBtYWlsYm94IGludHIgKi8KKwkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfUklTQ19JTlQpOworCQkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJfQorCQkJdWRlbGF5KDUpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpKSB7CisJCQlydmFsID0gbWIwICYgTUJTX01BU0s7CisJCQlmdy0+c3RhY2tfcmFtW2NudF0gPSBtYjI7CisJCX0gZWxzZSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCS8qIEdldCBkYXRhIFNSQU0uICovCisJCXJpc2NfYWRkcmVzcyA9IDB4MTEwMDA7CisJCWRhdGFfcmFtX2NudCA9IGhhLT5md19tZW1vcnlfc2l6ZSAtIHJpc2NfYWRkcmVzcyArIDE7CisgCQlXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCwgTUJDX1JFQURfUkFNX0VYVEVOREVEKTsKKwkJY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CisJfQorCWZvciAoY250ID0gMDsgY250IDwgZGF0YV9yYW1fY250ICYmIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7CisJICAgIGNudCsrLCByaXNjX2FkZHJlc3MrKykgeworIAkJV1JUX01BSUxCT1hfUkVHKGhhLCByZWcsIDEsIExTVyhyaXNjX2FkZHJlc3MpKTsKKyAJCVdSVF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA4LCBNU1cocmlzY19hZGRyZXNzKSk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1NFVF9IT1NUX0lOVCk7CisKKwkJZm9yICh0aW1lciA9IDYwMDAwMDA7IHRpbWVyOyB0aW1lci0tKSB7CisJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworIAkJCXN0YXQgPSBSRF9SRUdfRFdPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc3RhdHVzKTsKKwkJCWlmIChzdGF0ICYgSFNSX1JJU0NfSU5UKSB7CisJCQkJc3RhdCAmPSAweGZmOworCisJCQkJaWYgKHN0YXQgPT0gMHgxIHx8IHN0YXQgPT0gMHgyKSB7CisJCQkJCXNldF9iaXQoTUJYX0lOVEVSUlVQVCwKKwkJCQkJICAgICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJCQkJbWIwID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisJCQkJCW1iMiA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCisJCQkJCS8qIFJlbGVhc2UgbWFpbGJveCByZWdpc3RlcnMuICovCisJCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoc3RhdCA9PSAweDEwIHx8IHN0YXQgPT0gMHgxMSkgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJCQltYjIgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKKwkJCQkJICAgIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIGNsZWFyIHRoaXMgaW50cjsgaXQgd2Fzbid0IGEgbWFpbGJveCBpbnRyICovCisJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCX0KKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkgeworCQkJcnZhbCA9IG1iMCAmIE1CU19NQVNLOworCQkJZnctPmRhdGFfcmFtW2NudF0gPSBtYjI7CisJCX0gZWxzZSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZhaWxlZCB0byBkdW1wIGZpcm13YXJlICgleCkhISFcbiIsIHJ2YWwpOworCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaGEtPmZ3X2R1bXAsIGhhLT5md19kdW1wX29yZGVyKTsKKwkJaGEtPmZ3X2R1bXAgPSBOVUxMOworCX0gZWxzZSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJGaXJtd2FyZSBkdW1wIHNhdmVkIHRvIHRlbXAgYnVmZmVyICglbGQvJXApLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBoYS0+ZndfZHVtcCk7CisJfQorCitxbGEyMzAwX2Z3X2R1bXBfZmFpbGVkOgorCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHFsYTIzMDBfYXNjaWlfZndfZHVtcCgpIC0gQ29udmVydHMgYSBiaW5hcnkgZmlybXdhcmUgZHVtcCB0byBBU0NJSS4KKyAqIEBoYTogSEEgY29udGV4dAorICovCit2b2lkCitxbGEyMzAwX2FzY2lpX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MzJfdCBjbnQ7CisJY2hhciAqdWl0ZXI7CisJY2hhciBmd19pbmZvWzMwXTsKKwlzdHJ1Y3QgcWxhMjMwMF9md19kdW1wICpmdzsKKwl1aW50MzJfdCBkYXRhX3JhbV9jbnQ7CisKKwl1aXRlciA9IGhhLT5md19kdW1wX2J1ZmZlcjsKKwlmdyA9IGhhLT5md19kdW1wOworCisJcWxhX3VwcmludGYoJnVpdGVyLCAiJXMgRmlybXdhcmUgVmVyc2lvbiAlc1xuIiwgaGEtPm1vZGVsX251bWJlciwKKwkgICAgcWxhMngwMF9nZXRfZndfdmVyc2lvbl9zdHIoaGEsIGZ3X2luZm8pKTsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuWz09PkJFR11cbiIpOworCisJcWxhX3VwcmludGYoJnVpdGVyLCAiSENDUiBSZWdpc3RlcjpcbiUwNHhcblxuIiwgZnctPmhjY3IpOworCisJcWxhX3VwcmludGYoJnVpdGVyLCAiUEJJVSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5wYml1X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnBiaXVfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SZXFRLVJzcFEtUmlzYzJIb3N0IFN0YXR1cyByZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2hvc3RfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ob3N0X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuTWFpbGJveCBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5tYWlsYm94X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPm1haWxib3hfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5BdXRvIFJlcXVlc3QgUmVzcG9uc2UgRE1BIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJlc3BfZG1hX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJlc3BfZG1hX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuRE1BIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPmRtYV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5kbWFfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEhhcmR3YXJlIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfaGR3X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfaGR3X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDAgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDBfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDBfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQMSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwMV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwMV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1AyIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3AyX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3AyX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDMgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDNfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDNfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQNCBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwNF9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwNF9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1A1IFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3A1X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3A1X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDYgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDZfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDZfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQNyBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwN19yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwN19yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkZyYW1lIEJ1ZmZlciBIYXJkd2FyZSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5mcmFtZV9idWZfaGR3X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPmZyYW1lX2J1Zl9oZHdfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5GUE0gQjAgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+ZnBtX2IwX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPmZwbV9iMF9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkZQTSBCMSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5mcG1fYjFfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+ZnBtX2IxX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuQ29kZSBSQU0gRHVtcDoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfcmFtKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuJTA0eDogIiwgY250ICsgMHgwODAwKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX3JhbVtjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuU3RhY2sgUkFNIER1bXA6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5zdGFja19yYW0pIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4lMDV4OiAiLCBjbnQgKyAweDEwMDAwKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5zdGFja19yYW1bY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkRhdGEgUkFNIER1bXA6Iik7CisJZGF0YV9yYW1fY250ID0gaGEtPmZ3X21lbW9yeV9zaXplIC0gMHgxMTAwMCArIDE7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBkYXRhX3JhbV9jbnQ7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuJTA1eDogIiwgY250ICsgMHgxMTAwMCk7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+ZGF0YV9yYW1bY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbls8PT1FTkRdIElTUCBEZWJ1ZyBEdW1wLiIpOworfQorCisvKioKKyAqIHFsYTIxMDBfZndfZHVtcCgpIC0gRHVtcHMgYmluYXJ5IGRhdGEgZnJvbSB0aGUgMjEwMC8yMjAwIGZpcm13YXJlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaGFyZHdhcmVfbG9ja2VkOiBDYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmVfbG9jaworICovCit2b2lkCitxbGEyMTAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDMyX3QJY250LCB0aW1lcjsKKwl1aW50MTZfdAlyaXNjX2FkZHJlc3M7CisJdWludDE2X3QJbWIwLCBtYjI7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJdWludDE2X3QgX19pb21lbSAqZG1wX3JlZzsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0cnVjdCBxbGEyMTAwX2Z3X2R1bXAJKmZ3OworCisJcmlzY19hZGRyZXNzID0gMDsKKwltYjAgPSBtYjIgPSAwOworCWZsYWdzID0gMDsKKworCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCWlmIChoYS0+ZndfZHVtcCAhPSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApIC0tIGlnbm9yaW5nICIKKwkJICAgICJyZXF1ZXN0Li4uXG4iLCBoYS0+ZndfZHVtcCk7CisJCWdvdG8gcWxhMjEwMF9md19kdW1wX2ZhaWxlZDsKKwl9CisKKwkvKiBBbGxvY2F0ZSAobGFyZ2UpIGR1bXAgYnVmZmVyLiAqLworCWhhLT5md19kdW1wX29yZGVyID0gZ2V0X29yZGVyKHNpemVvZihzdHJ1Y3QgcWxhMjEwMF9md19kdW1wKSk7CisJaGEtPmZ3X2R1bXAgPSAoc3RydWN0IHFsYTIxMDBfZndfZHVtcCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsCisJICAgIGhhLT5md19kdW1wX29yZGVyKTsKKwlpZiAoaGEtPmZ3X2R1bXAgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGZpcm13YXJlIGR1bXAgKCVkLyVaZCkuXG4iLAorCQkgICAgaGEtPmZ3X2R1bXBfb3JkZXIsIHNpemVvZihzdHJ1Y3QgcWxhMjEwMF9md19kdW1wKSk7CisJCWdvdG8gcWxhMjEwMF9md19kdW1wX2ZhaWxlZDsKKwl9CisJZncgPSBoYS0+ZndfZHVtcDsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwlmdy0+aGNjciA9IFJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCisJLyogUGF1c2UgUklTQy4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9QQVVTRV9SSVNDKTsgCisJZm9yIChjbnQgPSAzMDAwMDsgKFJEX1JFR19XT1JEKCZyZWctPmhjY3IpICYgSENDUl9SSVNDX1BBVVNFKSA9PSAwICYmCisJICAgIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7IGNudC0tKSB7CisJCWlmIChjbnQpCisJCQl1ZGVsYXkoMTAwKTsKKwkJZWxzZQorCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOworCX0KKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikocmVnICsgMCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5wYml1X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cGJpdV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDEwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBoYS0+bWJ4X2NvdW50OyBjbnQrKykgeworCQkJaWYgKGNudCA9PSA4KSB7CisJCQkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweGUwKTsKKwkJCX0KKwkJCWZ3LT5tYWlsYm94X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKwkJfQorCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHgyMCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5kbWFfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5kbWFfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgwMCk7CisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHhBMCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2hkd19yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfaGR3X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDIwMDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3AwX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDBfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjEwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDFfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwMV9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyMjAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwMl9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3AyX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDIzMDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3AzX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDNfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjQwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDRfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwNF9yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPnBjciwgMHgyNTAwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5yaXNjX2dwNV9yZWcpIC8gMjsgY250KyspIAorCQkJZnctPnJpc2NfZ3A1X3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+cGNyLCAweDI2MDApOyAKKwkJZG1wX3JlZyA9ICh1aW50MTZfdCBfX2lvbWVtICopKCh1aW50OF90IF9faW9tZW0gKilyZWcgKyAweDgwKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPnJpc2NfZ3A2X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+cmlzY19ncDZfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5wY3IsIDB4MjcwMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19ncDdfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5yaXNjX2dwN19yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAweDEwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5mcmFtZV9idWZfaGR3X3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+ZnJhbWVfYnVmX2hkd19yZWdbY250XSA9IFJEX1JFR19XT1JEKGRtcF9yZWcrKyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzLCAweDIwKTsgCisJCWRtcF9yZWcgPSAodWludDE2X3QgX19pb21lbSAqKSgodWludDhfdCBfX2lvbWVtICopcmVnICsgMHg4MCk7CisJCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5mcG1fYjBfcmVnKSAvIDI7IGNudCsrKSAKKwkJCWZ3LT5mcG1fYjBfcmVnW2NudF0gPSBSRF9SRUdfV09SRChkbXBfcmVnKyspOworCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgzMCk7IAorCQlkbXBfcmVnID0gKHVpbnQxNl90IF9faW9tZW0gKikoKHVpbnQ4X3QgX19pb21lbSAqKXJlZyArIDB4ODApOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+ZnBtX2IxX3JlZykgLyAyOyBjbnQrKykgCisJCQlmdy0+ZnBtX2IxX3JlZ1tjbnRdID0gUkRfUkVHX1dPUkQoZG1wX3JlZysrKTsKKworCQkvKiBSZXNldCB0aGUgSVNQLiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIENTUl9JU1BfU09GVF9SRVNFVCk7CisJfQorCisJZm9yIChjbnQgPSAzMDAwMDsgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCkgIT0gMCAmJgorCSAgICBydmFsID09IFFMQV9TVUNDRVNTOyBjbnQtLSkgeworCQlpZiAoY250KQorCQkJdWRlbGF5KDEwMCk7CisJCWVsc2UKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwl9CisKKwkvKiBQYXVzZSBSSVNDLiAqLworCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmIChJU19RTEEyMjAwKGhhKSB8fCAoSVNfUUxBMjEwMChoYSkgJiYKKwkgICAgKFJEX1JFR19XT1JEKCZyZWctPm1jdHIpICYgKEJJVF8xIHwgQklUXzApKSAhPSAwKSkpIHsKKworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9QQVVTRV9SSVNDKTsgCisJCWZvciAoY250ID0gMzAwMDA7CisJCSAgICAoUkRfUkVHX1dPUkQoJnJlZy0+aGNjcikgJiBIQ0NSX1JJU0NfUEFVU0UpID09IDAgJiYKKwkJICAgIHJ2YWwgPT0gUUxBX1NVQ0NFU1M7IGNudC0tKSB7CisJCQlpZiAoY250KQorCQkJCXVkZWxheSgxMDApOworCQkJZWxzZQorCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKKwkJfQorCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkJLyogU2V0IG1lbW9yeSBjb25maWd1cmF0aW9uIGFuZCB0aW1pbmcuICovCisJCQlpZiAoSVNfUUxBMjEwMChoYSkpCisJCQkJV1JUX1JFR19XT1JEKCZyZWctPm1jdHIsIDB4ZjEpOworCQkJZWxzZQorCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5tY3RyLCAweGYyKTsKKwkJCVJEX1JFR19XT1JEKCZyZWctPm1jdHIpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkJLyogUmVsZWFzZSBSSVNDLiAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVMRUFTRV9SSVNDKTsKKwkJfQorCX0KKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCS8qIEdldCBSSVNDIFNSQU0uICovCisJCXJpc2NfYWRkcmVzcyA9IDB4MTAwMDsKKyAJCVdSVF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwLCBNQkNfUkVBRF9SQU1fV09SRCk7CisJCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCX0KKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+cmlzY19yYW0pIC8gMiAmJiBydmFsID09IFFMQV9TVUNDRVNTOworCSAgICBjbnQrKywgcmlzY19hZGRyZXNzKyspIHsKKyAJCVdSVF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxLCByaXNjX2FkZHJlc3MpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9TRVRfSE9TVF9JTlQpOworCisJCWZvciAodGltZXIgPSA2MDAwMDAwOyB0aW1lciAhPSAwOyB0aW1lci0tKSB7CisJCQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCQkJaWYgKFJEX1JFR19XT1JEKCZyZWctPmlzdGF0dXMpICYgSVNSX1JJU0NfSU5UKSB7CisJCQkJaWYgKFJEX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSkgJiBCSVRfMCkgeworCQkJCQlzZXRfYml0KE1CWF9JTlRFUlJVUFQsCisJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCQkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJCQltYjIgPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlLCAwKTsKKwkJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCisJCQkJCSAgICBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCQkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJCX0KKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkgeworCQkJcnZhbCA9IG1iMCAmIE1CU19NQVNLOworCQkJZnctPnJpc2NfcmFtW2NudF0gPSBtYjI7CisJCX0gZWxzZSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCX0KKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKKworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWhhLT5md19kdW1wLCBoYS0+ZndfZHVtcF9vcmRlcik7CisJCWhhLT5md19kdW1wID0gTlVMTDsKKwl9IGVsc2UgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOworCX0KKworcWxhMjEwMF9md19kdW1wX2ZhaWxlZDoKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBxbGEyMTAwX2FzY2lpX2Z3X2R1bXAoKSAtIENvbnZlcnRzIGEgYmluYXJ5IGZpcm13YXJlIGR1bXAgdG8gQVNDSUkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqLwordm9pZAorcWxhMjEwMF9hc2NpaV9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDMyX3QgY250OworCWNoYXIgKnVpdGVyOworCWNoYXIgZndfaW5mb1szMF07CisJc3RydWN0IHFsYTIxMDBfZndfZHVtcCAqZnc7CisKKwl1aXRlciA9IGhhLT5md19kdW1wX2J1ZmZlcjsKKwlmdyA9IGhhLT5md19kdW1wOworCisJcWxhX3VwcmludGYoJnVpdGVyLCAiJXMgRmlybXdhcmUgVmVyc2lvbiAlc1xuIiwgaGEtPm1vZGVsX251bWJlciwKKwkgICAgcWxhMngwMF9nZXRfZndfdmVyc2lvbl9zdHIoaGEsIGZ3X2luZm8pKTsKKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuWz09PkJFR11cbiIpOworCisJcWxhX3VwcmludGYoJnVpdGVyLCAiSENDUiBSZWdpc3RlcjpcbiUwNHhcblxuIiwgZnctPmhjY3IpOworCisJcWxhX3VwcmludGYoJnVpdGVyLCAiUEJJVSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5wYml1X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnBiaXVfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5NYWlsYm94IFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPm1haWxib3hfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+bWFpbGJveF9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cbkRNQSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5kbWFfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+ZG1hX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBIYXJkd2FyZSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2hkd19yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2hkd19yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1AwIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3AwX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3AwX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDEgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDFfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDFfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQMiBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwMl9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwMl9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1AzIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3AzX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3AzX3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDQgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDRfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDRfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5SSVNDIEdQNSBSZWdpc3RlcnM6Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YgKGZ3LT5yaXNjX2dwNV9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX2dwNV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgR1A2IFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfZ3A2X3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPnJpc2NfZ3A2X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuUklTQyBHUDcgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+cmlzY19ncDdfcmVnKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuIik7CisJCX0KKwkJcWxhX3VwcmludGYoJnVpdGVyLCAiJTA0eCAiLCBmdy0+cmlzY19ncDdfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5GcmFtZSBCdWZmZXIgSGFyZHdhcmUgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+ZnJhbWVfYnVmX2hkd19yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5mcmFtZV9idWZfaGR3X3JlZ1tjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuRlBNIEIwIFJlZ2lzdGVyczoiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPmZwbV9iMF9yZWcpIC8gMjsgY250KyspIHsKKwkJaWYgKGNudCAlIDggPT0gMCkgeworCQkJcWxhX3VwcmludGYoJnVpdGVyLCAiXG4iKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5mcG1fYjBfcmVnW2NudF0pOworCX0KKworCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuXG5GUE0gQjEgUmVnaXN0ZXJzOiIpOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mIChmdy0+ZnBtX2IxX3JlZykgLyAyOyBjbnQrKykgeworCQlpZiAoY250ICUgOCA9PSAwKSB7CisJCQlxbGFfdXByaW50ZigmdWl0ZXIsICJcbiIpOworCQl9CisJCXFsYV91cHJpbnRmKCZ1aXRlciwgIiUwNHggIiwgZnctPmZwbV9iMV9yZWdbY250XSk7CisJfQorCisJcWxhX3VwcmludGYoJnVpdGVyLCAiXG5cblJJU0MgU1JBTToiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZiAoZnctPnJpc2NfcmFtKSAvIDI7IGNudCsrKSB7CisJCWlmIChjbnQgJSA4ID09IDApIHsKKwkJCXFsYV91cHJpbnRmKCZ1aXRlciwgIlxuJTA0eDogIiwgY250ICsgMHgxMDAwKTsKKwkJfQorCQlxbGFfdXByaW50ZigmdWl0ZXIsICIlMDR4ICIsIGZ3LT5yaXNjX3JhbVtjbnRdKTsKKwl9CisKKwlxbGFfdXByaW50ZigmdWl0ZXIsICJcblxuWzw9PUVORF0gSVNQIERlYnVnIER1bXAuIik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3FsYV91cHJpbnRmKGNoYXIgKip1aXRlciwgY2hhciAqZm10LCAuLi4pCit7CisJaW50CWl0ZXIsIGxlbjsKKwljaGFyCWJ1ZlsxMjhdOworCXZhX2xpc3QJYXJnczsKKyAKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgbGVuOyBpdGVyKyssICp1aXRlciArPSAxKQorCQkqdWl0ZXJbMF0gPSBidWZbaXRlcl07CisKKwlyZXR1cm4gKGxlbik7Cit9CisKKy8vRklYTUUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgRGVidWcgRnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIAorcWxhMngwMF9kdW1wX3JlZ3Moc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlwcmludGsoIk1haWxib3ggcmVnaXN0ZXJzOlxuIik7CisJcHJpbnRrKCJzY3NpKCVsZCk6IG1ib3ggMCAweCUwNHggXG4iLAorCSAgICBoYS0+aG9zdF9ubywgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCkpOworCXByaW50aygic2NzaSglbGQpOiBtYm94IDEgMHglMDR4IFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpKTsKKwlwcmludGsoInNjc2koJWxkKTogbWJveCAyIDB4JTA0eCBcbiIsCisJICAgIGhhLT5ob3N0X25vLCBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKSk7CisJcHJpbnRrKCJzY3NpKCVsZCk6IG1ib3ggMyAweCUwNHggXG4iLAorCSAgICBoYS0+aG9zdF9ubywgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMykpOworCXByaW50aygic2NzaSglbGQpOiBtYm94IDQgMHglMDR4IFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDQpKTsKKwlwcmludGsoInNjc2koJWxkKTogbWJveCA1IDB4JTA0eCBcbiIsCisJICAgIGhhLT5ob3N0X25vLCBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA1KSk7Cit9CisKKwordm9pZAorcWxhMngwMF9kdW1wX2J1ZmZlcih1aW50OF90ICogYiwgdWludDMyX3Qgc2l6ZSkgCit7CisJdWludDMyX3QgY250OworCXVpbnQ4X3QgYzsKKworCXByaW50aygiIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICIKKwkgICAgIkFoICBCaCAgQ2ggIERoICBFaCAgRmhcbiIpOworCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplOykgeworCQljID0gKmIrKzsKKwkJcHJpbnRrKCIlMDJ4IiwodWludDMyX3QpIGMpOworCQljbnQrKzsKKwkJaWYgKCEoY250ICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCQllbHNlCisJCQlwcmludGsoIiAgIik7CisJfQorCWlmIChjbnQgJSAxNikKKwkJcHJpbnRrKCJcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgcWxhMngwMF9wcmludF9zY3NpX2NtZAorICoJIER1bXBzIG91dCBpbmZvIGFib3V0IHRoZSBzY3NpIGNtZCBhbmQgc3JiLgorICogICBJbnB1dAkgCisgKgkgY21kIDogc3RydWN0IHNjc2lfY21uZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorcWxhMngwMF9wcmludF9zY3NpX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKSAKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3JiX3QgKnNwOworCisJaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlzcCA9IChzcmJfdCAqKSBjbWQtPlNDcC5wdHI7CisJcHJpbnRrKCJTQ1NJIENvbW1hbmQgQD0weCVwLCBIYW5kbGU9MHglcFxuIiwgY21kLCBjbWQtPmhvc3Rfc2NyaWJibGUpOworCXByaW50aygiICBjaGFuPTB4JTAyeCwgdGFyZ2V0PTB4JTAyeCwgbHVuPTB4JTAyeCwgY21kX2xlbj0weCUwMnhcbiIsCisJICAgIGNtZC0+ZGV2aWNlLT5jaGFubmVsLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJICAgIGNtZC0+Y21kX2xlbik7CisJcHJpbnRrKCIgQ0RCOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyBpKyspIHsKKwkJcHJpbnRrKCIweCUwMnggIiwgY21kLT5jbW5kW2ldKTsKKwl9CisJcHJpbnRrKCJcbiAgc2VnX2NudD0lZCwgYWxsb3dlZD0lZCwgcmV0cmllcz0lZCwgIgorCSAgICAic2VyaWFsX251bWJlcl9hdF90aW1lb3V0PTB4JWx4XG4iLAorCSAgICBjbWQtPnVzZV9zZywgY21kLT5hbGxvd2VkLCBjbWQtPnJldHJpZXMsCisJICAgIGNtZC0+c2VyaWFsX251bWJlcl9hdF90aW1lb3V0KTsKKwlwcmludGsoIiAgcmVxdWVzdCBidWZmZXI9MHglcCwgcmVxdWVzdCBidWZmZXIgbGVuPTB4JXhcbiIsCisJICAgIGNtZC0+cmVxdWVzdF9idWZmZXIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwlwcmludGsoIiAgdGFnPSVkLCB0cmFuc2ZlcnNpemU9MHgleFxuIiwKKwkgICAgY21kLT50YWcsIGNtZC0+dHJhbnNmZXJzaXplKTsKKwlwcmludGsoIiAgc2VyaWFsX251bWJlcj0lbHgsIFNQPSVwXG4iLCBjbWQtPnNlcmlhbF9udW1iZXIsIHNwKTsgCisJcHJpbnRrKCIgIGRhdGEgZGlyZWN0aW9uPSVkXG4iLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCWlmICghc3ApCisJCXJldHVybjsKKworCXByaW50aygiICBzcCBmbGFncz0weCV4XG4iLCBzcC0+ZmxhZ3MpOworCXByaW50aygiICByX3N0YXJ0PTB4JWx4LCB1X3N0YXJ0PTB4JWx4LCBmX3N0YXJ0PTB4JWx4LCBzdGF0ZT0lZFxuIiwKKwkgICAgc3AtPnJfc3RhcnQsIHNwLT51X3N0YXJ0LCBzcC0+Zl9zdGFydCwgc3AtPnN0YXRlKTsKKworCXByaW50aygiIGVfc3RhcnQ9IDB4JWx4LCBleHRfaGlzdG9yeT0lZCwgZm8gcmV0cnk9JWQsIGxvb3BpZD0leCwgIgorCSAgICAicG9ydCBwYXRoPSVkXG4iLCBzcC0+ZV9zdGFydCwgc3AtPmV4dF9oaXN0b3J5LCBzcC0+Zm9fcmV0cnlfY250LAorCSAgICBzcC0+bHVuX3F1ZXVlLT5mY2x1bi0+ZmNwb3J0LT5sb29wX2lkLAorCSAgICBzcC0+bHVuX3F1ZXVlLT5mY2x1bi0+ZmNwb3J0LT5jdXJfcGF0aCk7Cit9CisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX1JPVVRJTkVTKQorLyoKKyAqIHFsYTJ4MDBfZm9ybWF0dGVkX2R1bXBfYnVmZmVyCisgKiAgICAgICBQcmludHMgc3RyaW5nIHBsdXMgYnVmZmVyLgorICoKKyAqIElucHV0OgorICogICAgICAgc3RyaW5nICA9IE51bGwgdGVybWluYXRlZCBzdHJpbmcgKG5vIG5ld2xpbmUgYXQgZW5kKS4KKyAqICAgICAgIGJ1ZmZlciAgPSBidWZmZXIgYWRkcmVzcy4KKyAqICAgICAgIHdkX3NpemUgPSB3b3JkIHNpemUgOCwgMTYsIDMyIG9yIDY0IGJpdHMKKyAqICAgICAgIGNvdW50ICAgPSBudW1iZXIgb2Ygd29yZHMuCisgKi8KK3ZvaWQKK3FsYTJ4MDBfZm9ybWF0dGVkX2R1bXBfYnVmZmVyKGNoYXIgKnN0cmluZywgdWludDhfdCAqIGJ1ZmZlciwgCisJCQkJdWludDhfdCB3ZF9zaXplLCB1aW50MzJfdCBjb3VudCkgCit7CisJdWludDMyX3QgY250OworCXVpbnQxNl90ICpidWYxNjsKKwl1aW50MzJfdCAqYnVmMzI7CisKKwlpZiAoc3RyY21wKHN0cmluZywgIiIpICE9IDApCisJCXByaW50aygiJXNcbiIsc3RyaW5nKTsKKworCXN3aXRjaCAod2Rfc2l6ZSkgeworCQljYXNlIDg6CisJCQlwcmludGsoIiAwICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgIgorCQkJCSI4ICAgIDkgICAgQWggICBCaCAgIENoICAgRGggICBFaCAgIEZoXG4iKTsKKwkJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJCQlmb3IgKGNudCA9IDE7IGNudCA8PSBjb3VudDsgY250KyssIGJ1ZmZlcisrKSB7CisJCQkJcHJpbnRrKCIlMDJ4IiwqYnVmZmVyKTsKKwkJCQlpZiAoY250ICUgMTYgPT0gMCkKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRrKCIgICIpOworCQkJfQorCQkJaWYgKGNudCAlIDE2ICE9IDApCisJCQkJcHJpbnRrKCJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlwcmludGsoIiAgIDAgICAgICAyICAgICAgNCAgICAgIDYgICAgICA4ICAgICAgQWggIgorCQkJCSIJQ2ggICAgIEVoXG4iKTsKKwkJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkJIi0tLS0tLS0tLS0tLS1cbiIpOworCisJCQlidWYxNiA9ICh1aW50MTZfdCAqKSBidWZmZXI7CisJCQlmb3IgKGNudCA9IDE7IGNudCA8PSBjb3VudDsgY250KyssIGJ1ZjE2KyspIHsKKwkJCQlwcmludGsoIiU0eCIsKmJ1ZjE2KTsKKworCQkJCWlmIChjbnQgJSA4ID09IDApCisJCQkJCXByaW50aygiXG4iKTsKKwkJCQllbHNlIGlmICgqYnVmMTYgPCAxMCkKKwkJCQkJcHJpbnRrKCIgICAiKTsKKwkJCQllbHNlCisJCQkJCXByaW50aygiICAiKTsKKwkJCX0KKwkJCWlmIChjbnQgJSA4ICE9IDApCisJCQkJcHJpbnRrKCJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlwcmludGsoIiAgICAgICAwICAgICAgICAgIDQgICAgICAgICAgOCAgICAgICAgICBDaFxuIik7CisJCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwkJCWJ1ZjMyID0gKHVpbnQzMl90ICopIGJ1ZmZlcjsKKwkJCWZvciAoY250ID0gMTsgY250IDw9IGNvdW50OyBjbnQrKywgYnVmMzIrKykgeworCQkJCXByaW50aygiJTh4IiwgKmJ1ZjMyKTsKKworCQkJCWlmIChjbnQgJSA0ID09IDApCisJCQkJCXByaW50aygiXG4iKTsKKwkJCQllbHNlIGlmICgqYnVmMzIgPCAxMCkKKwkJCQkJcHJpbnRrKCIgICAiKTsKKwkJCQllbHNlCisJCQkJCXByaW50aygiICAiKTsKKwkJCX0KKwkJCWlmIChjbnQgJSA0ICE9IDApCisJCQkJcHJpbnRrKCJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y1NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCkBAIC0wLDAgKzEsMjMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERyaXZlciBkZWJ1ZyBkZWZpbml0aW9ucy4KKyAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xICAqLyAvKiBPdXRwdXQgcmVnaXN0ZXIgYWNjZXNzZXMgdG8gQ09NMSAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8yICAqLyAvKiBPdXRwdXQgZXJyb3IgbXNncyB0byBDT00xICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzMgICovIC8qIE91dHB1dCBmdW5jdGlvbiB0cmFjZSBtc2dzIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNCAgKi8gLyogT3V0cHV0IE5WUkFNIHRyYWNlIG1zZ3MgdG8gQ09NMSAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF81ICAqLyAvKiBPdXRwdXQgcmluZyB0cmFjZSBtc2dzIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNiAgKi8gLyogT3V0cHV0IFdBVENIRE9HIHRpbWVyIHRyYWNlIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNyAgKi8gLyogT3V0cHV0IFJJU0MgbG9hZCB0cmFjZSBtc2dzIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfOCAgKi8gLyogT3V0cHV0IHJpbmcgc2F0dXJhdGlvbiBtc2dzIHRvIENPTTEgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfOSAgKi8gLyogT3V0cHV0IElPQ1RMIHRyYWNlIG1zZ3MgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTAgKi8gLyogT3V0cHV0IElPQ1RMIGVycm9yIG1zZ3MgKi8KKy8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTEgKi8gLyogT3V0cHV0IE1ieCBDbWQgdHJhY2UgbXNncyAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xMiAqLyAvKiBPdXRwdXQgSVAgdHJhY2UgbXNncyAqLworLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xMyAqLyAvKiBPdXRwdXQgZmRtaSBmdW5jdGlvbiB0cmFjZSBtc2dzICovCisvKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzE0ICovIC8qIE91dHB1dCBSU0NOIHRyYWNlIG1zZ3MgKi8KKy8qCisgKiAgTG9jYWwgTWFjcm8gRGVmaW5pdGlvbnMuCisgKi8KKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEpICB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzIpIHx8IFwKKyAgICBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpICB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzQpIHx8IFwKKyAgICBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzUpICB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzYpIHx8IFwKKyAgICBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzcpICB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzgpIHx8IFwKKyAgICBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzkpICB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEwKSB8fCBcCisgICAgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMSkgfHwgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMikgfHwgXAorICAgIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTMpIHx8IGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTQpCisgICAgI2RlZmluZSBRTF9ERUJVR19ST1VUSU5FUworI2VuZGlmCisKKy8qCisqIE1hY3JvcyB1c2UgZm9yIGRlYnVnZ2luZyB0aGUgZHJpdmVyLgorKi8KKyN1bmRlZiBFTlRFUl9UUkFDRQorI2lmIGRlZmluZWQoRU5URVJfVFJBQ0UpCisjZGVmaW5lIEVOVEVSKHgpCWRvIHsgcHJpbnRrKCJxbGEyMTAwIDogRW50ZXJpbmcgJXMoKVxuIiwgeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIExFQVZFKHgpCWRvIHsgcHJpbnRrKCJxbGEyMTAwIDogTGVhdmluZyAlcygpXG4iLCB4KTsgIH0gd2hpbGUgKDApCisjZGVmaW5lIEVOVEVSX0lOVFIoeCkJZG8geyBwcmludGsoInFsYTIxMDAgOiBFbnRlcmluZyAlcygpXG4iLCB4KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTEVBVkVfSU5UUih4KQlkbyB7IHByaW50aygicWxhMjEwMCA6IExlYXZpbmcgJXMoKVxuIiwgeCk7ICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRU5URVIoeCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIExFQVZFKHgpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBFTlRFUl9JTlRSKHgpIAlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgTEVBVkVfSU5UUih4KSAgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAgREVCVUdfUUxBMjEwMAorI2RlZmluZSBERUJVRyh4KQlkbyB7eDt9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKHgpCWRvIHt9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xKQorI2RlZmluZSBERUJVRzEoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzEoeCkJZG8ge30gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzIpCisjZGVmaW5lIERFQlVHMih4KSAgICAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUcyXzMoeCkgICAgIGRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzJfM18xMSh4KSAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMl85XzEwKHgpICAgIGRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzJfMTEoeCkgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzIoeCkJZG8ge30gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCisjZGVmaW5lIERFQlVHMyh4KQlkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUcyXzMoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMl8zXzExKHgpCWRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzNfMTEoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzMoeCkJZG8ge30gd2hpbGUgKDApOworICAjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKKyAgI2RlZmluZSBERUJVRzJfMyh4KQlkbyB7fSB3aGlsZSAoMCk7CisgICNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzQpCisjZGVmaW5lIERFQlVHNCh4KQlkbyB7eDt9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHNCh4KQlkbyB7fSB3aGlsZSAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfNSkKKyNkZWZpbmUgREVCVUc1KHgpICAgICAgICAgIGRvIHt4O30gd2hpbGUgKDApOworI2Vsc2UKKyNkZWZpbmUgREVCVUc1KHgpCWRvIHt9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF83KQorI2RlZmluZSBERUJVRzcoeCkgICAgICAgICAgZG8ge3g7fSB3aGlsZSAoMCk7CisjZWxzZQorI2RlZmluZSBERUJVRzcoeCkJICAgZG8ge30gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzkpCisjZGVmaW5lIERFQlVHOSh4KSAgICAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUc5XzEwKHgpICAgIGRvIHt4O30gd2hpbGUgKDApOworI2RlZmluZSBERUJVRzJfOV8xMCh4KQlkbyB7eDt9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHOSh4KQlkbyB7fSB3aGlsZSAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTApCisjZGVmaW5lIERFQlVHMTAoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUcyXzlfMTAoeCkJZG8ge3g7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHOV8xMCh4KQlkbyB7eDt9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHMTAoeCkJZG8ge30gd2hpbGUgKDApOworICAjaWYgIWRlZmluZWQoREVCVUcyXzlfMTApCisgICNkZWZpbmUgREVCVUcyXzlfMTAoeCkJZG8ge30gd2hpbGUgKDApOworICAjZW5kaWYKKyAgI2lmICFkZWZpbmVkKERFQlVHOV8xMCkKKyAgI2RlZmluZSBERUJVRzlfMTAoeCkJZG8ge30gd2hpbGUgKDApOworICAjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMSkKKyNkZWZpbmUgREVCVUcxMSh4KSAgICAgIGRve3g7fSB3aGlsZSgwKTsKKyNpZiAhZGVmaW5lZChERUJVRzJfMTEpCisjZGVmaW5lIERFQlVHMl8xMSh4KSAgICBkb3t4O30gd2hpbGUoMCk7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChERUJVRzJfM18xMSkKKyNkZWZpbmUgREVCVUcyXzNfMTEoeCkgIGRve3g7fSB3aGlsZSgwKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKERFQlVHM18xMSkKKyNkZWZpbmUgREVCVUczXzExKHgpICAgIGRve3g7fSB3aGlsZSgwKTsKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgREVCVUcxMSh4KQlkb3t9IHdoaWxlKDApOworICAjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKKyAgI2RlZmluZSBERUJVRzJfMTEoeCkJZG97fSB3aGlsZSgwKTsKKyAgICAjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMykKKyAgICAjZGVmaW5lIERFQlVHMl8zXzExKHgpIGRve30gd2hpbGUoMCk7CisgICAgI2VuZGlmCisgICNlbmRpZgorICAjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMykKKyAgI2RlZmluZSBERUJVRzNfMTEoeCkJZG97fSB3aGlsZSgwKTsKKyAgI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTIpCisjZGVmaW5lIERFQlVHMTIoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHMTIoeCkJZG8ge30gd2hpbGUgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEzKQorI2RlZmluZSBERUJVRzEzKHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERFQlVHMTMoeCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTQpCisjZGVmaW5lIERFQlVHMTQoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgREVCVUcxNCh4KQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogRmlybXdhcmUgRHVtcCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIEZXX0RVTVBfU0laRV8xMjhLCTB4QkMwMDAKKyNkZWZpbmUgRldfRFVNUF9TSVpFXzUxMksJMHgyRkMwMDAKKyNkZWZpbmUgRldfRFVNUF9TSVpFXzFNCQkweDVGQzAwMAorCitzdHJ1Y3QgcWxhMjMwMF9md19kdW1wIHsKKwl1aW50MTZfdCBoY2NyOworCXVpbnQxNl90IHBiaXVfcmVnWzhdOworCXVpbnQxNl90IHJpc2NfaG9zdF9yZWdbOF07CisJdWludDE2X3QgbWFpbGJveF9yZWdbMzJdOworCXVpbnQxNl90IHJlc3BfZG1hX3JlZ1szMl07CisJdWludDE2X3QgZG1hX3JlZ1s0OF07CisJdWludDE2X3QgcmlzY19oZHdfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwMF9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3AxX3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDJfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwM19yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3A0X3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDVfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwNl9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3A3X3JlZ1sxNl07CisJdWludDE2X3QgZnJhbWVfYnVmX2hkd19yZWdbNjRdOworCXVpbnQxNl90IGZwbV9iMF9yZWdbNjRdOworCXVpbnQxNl90IGZwbV9iMV9yZWdbNjRdOworCXVpbnQxNl90IHJpc2NfcmFtWzB4ZjgwMF07CisJdWludDE2X3Qgc3RhY2tfcmFtWzB4MTAwMF07CisJdWludDE2X3QgZGF0YV9yYW1bMV07Cit9OworCitzdHJ1Y3QgcWxhMjEwMF9md19kdW1wIHsKKwl1aW50MTZfdCBoY2NyOworCXVpbnQxNl90IHBiaXVfcmVnWzhdOworCXVpbnQxNl90IG1haWxib3hfcmVnWzMyXTsKKwl1aW50MTZfdCBkbWFfcmVnWzQ4XTsKKwl1aW50MTZfdCByaXNjX2hkd19yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3AwX3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDFfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwMl9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3AzX3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDRfcmVnWzE2XTsKKwl1aW50MTZfdCByaXNjX2dwNV9yZWdbMTZdOworCXVpbnQxNl90IHJpc2NfZ3A2X3JlZ1sxNl07CisJdWludDE2X3QgcmlzY19ncDdfcmVnWzE2XTsKKwl1aW50MTZfdCBmcmFtZV9idWZfaGR3X3JlZ1sxNl07CisJdWludDE2X3QgZnBtX2IwX3JlZ1s2NF07CisJdWludDE2X3QgZnBtX2IxX3JlZ1s2NF07CisJdWludDE2X3QgcmlzY19yYW1bMHhmMDAwXTsKK307CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWUwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTAsMCArMSwyNDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyoKKyogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisqICh3d3cucWxvZ2ljLmNvbSkKKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19RTEFfREVGX0gKKyNkZWZpbmUgX19RTEFfREVGX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKworLyogWFhYKGhjaCk6IG1vdmUgdG8gcGNpX2lkcy5oICovCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMwMAkweDIzMDAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMxMgkweDIzMTIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIzMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMyMgkweDIzMjIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDYzMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNjMxMgkweDYzMTIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDYzMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNjMyMgkweDYzMjIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9RTEEyMVhYKSB8fCBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTIxWFhfTU9EVUxFKQorI2RlZmluZSBJU19RTEEyMTAwKGhhKQkoKGhhKS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIxMDApCisjZWxzZQorI2RlZmluZSBJU19RTEEyMTAwKGhhKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfUUxBMjJYWCkgfHwgZGVmaW5lZChDT05GSUdfU0NTSV9RTEEyMlhYX01PRFVMRSkKKyNkZWZpbmUgSVNfUUxBMjIwMChoYSkJKChoYSktPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMjAwKQorI2Vsc2UKKyNkZWZpbmUgSVNfUUxBMjIwMChoYSkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTIzMDApIHx8IGRlZmluZWQoQ09ORklHX1NDU0lfUUxBMjMwMF9NT0RVTEUpCisjZGVmaW5lIElTX1FMQTIzMDAoaGEpCSgoaGEpLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjMwMCkKKyNkZWZpbmUgSVNfUUxBMjMxMihoYSkJKChoYSktPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzEyKQorI2Vsc2UKKyNkZWZpbmUgSVNfUUxBMjMwMChoYSkJMAorI2RlZmluZSBJU19RTEEyMzEyKGhhKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfUUxBMjMyMikgfHwgZGVmaW5lZChDT05GSUdfU0NTSV9RTEEyMzIyX01PRFVMRSkKKyNkZWZpbmUgSVNfUUxBMjMyMihoYSkJKChoYSktPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzIyKQorI2Vsc2UKKyNkZWZpbmUgSVNfUUxBMjMyMihoYSkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1FMQTYzMTIpIHx8IGRlZmluZWQoQ09ORklHX1NDU0lfUUxBNjMxMl9NT0RVTEUpCisjZGVmaW5lIElTX1FMQTYzMTIoaGEpCSgoaGEpLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNjMxMikKKyNkZWZpbmUgSVNfUUxBNjMyMihoYSkJKChoYSktPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A2MzIyKQorI2Vsc2UKKyNkZWZpbmUgSVNfUUxBNjMxMihoYSkJMAorI2RlZmluZSBJU19RTEE2MzIyKGhhKQkwCisjZW5kaWYKKworI2RlZmluZSBJU19RTEEyM1hYKGhhKQkoSVNfUUxBMjMwMChoYSkgfHwgSVNfUUxBMjMxMihoYSkgfHwgSVNfUUxBMjMyMihoYSkgfHwgXAorICAgIAkJCSBJU19RTEE2MzEyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKKworLyoKKyAqIE9ubHkgbm9uLUlTUDJbMTJdMDAgaGF2ZSBleHRlbmRlZCBhZGRyZXNzaW5nIHN1cHBvcnQgaW4gdGhlIGZpcm13YXJlLgorICovCisjZGVmaW5lIEhBU19FWFRFTkRFRF9JRFMoaGEpCSghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKQorCisvKgorICogV2UgaGF2ZSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UIHNpemVkIGFycmF5cyBpbiBhIGZldyBwbGFjZXMsCisgKiBidXQgdGhhdCdzIGZpbmUgYXMgd2UgZG9uJ3QgbG9vayBhdCB0aGUgbGFzdCAyNCBvbmVzIGZvcgorICogSVNQMjEwMCBIQkFzLgorICovCisjZGVmaW5lIE1BSUxCT1hfUkVHSVNURVJfQ09VTlRfMjEwMAk4CisjZGVmaW5lIE1BSUxCT1hfUkVHSVNURVJfQ09VTlQJCTMyCisKKyNkZWZpbmUgUUxBMjIwMEFfUklTQ19ST01fVkVSCTQKKyNkZWZpbmUgRlBNXzIzMDAJCTYKKyNkZWZpbmUgRlBNXzIzMTAJCTcKKworI2luY2x1ZGUgInFsYV9zZXR0aW5ncy5oIgorCisvKiAKKyAqIERhdGEgYml0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgQklUXzAJMHgxCisjZGVmaW5lIEJJVF8xCTB4MgorI2RlZmluZSBCSVRfMgkweDQKKyNkZWZpbmUgQklUXzMJMHg4CisjZGVmaW5lIEJJVF80CTB4MTAKKyNkZWZpbmUgQklUXzUJMHgyMAorI2RlZmluZSBCSVRfNgkweDQwCisjZGVmaW5lIEJJVF83CTB4ODAKKyNkZWZpbmUgQklUXzgJMHgxMDAKKyNkZWZpbmUgQklUXzkJMHgyMDAKKyNkZWZpbmUgQklUXzEwCTB4NDAwCisjZGVmaW5lIEJJVF8xMQkweDgwMAorI2RlZmluZSBCSVRfMTIJMHgxMDAwCisjZGVmaW5lIEJJVF8xMwkweDIwMDAKKyNkZWZpbmUgQklUXzE0CTB4NDAwMAorI2RlZmluZSBCSVRfMTUJMHg4MDAwCisjZGVmaW5lIEJJVF8xNgkweDEwMDAwCisjZGVmaW5lIEJJVF8xNwkweDIwMDAwCisjZGVmaW5lIEJJVF8xOAkweDQwMDAwCisjZGVmaW5lIEJJVF8xOQkweDgwMDAwCisjZGVmaW5lIEJJVF8yMAkweDEwMDAwMAorI2RlZmluZSBCSVRfMjEJMHgyMDAwMDAKKyNkZWZpbmUgQklUXzIyCTB4NDAwMDAwCisjZGVmaW5lIEJJVF8yMwkweDgwMDAwMAorI2RlZmluZSBCSVRfMjQJMHgxMDAwMDAwCisjZGVmaW5lIEJJVF8yNQkweDIwMDAwMDAKKyNkZWZpbmUgQklUXzI2CTB4NDAwMDAwMAorI2RlZmluZSBCSVRfMjcJMHg4MDAwMDAwCisjZGVmaW5lIEJJVF8yOAkweDEwMDAwMDAwCisjZGVmaW5lIEJJVF8yOQkweDIwMDAwMDAwCisjZGVmaW5lIEJJVF8zMAkweDQwMDAwMDAwCisjZGVmaW5lIEJJVF8zMQkweDgwMDAwMDAwCisKKyNkZWZpbmUgTFNCKHgpCSgodWludDhfdCkoeCkpCisjZGVmaW5lIE1TQih4KQkoKHVpbnQ4X3QpKCh1aW50MTZfdCkoeCkgPj4gOCkpCisKKyNkZWZpbmUgTFNXKHgpCSgodWludDE2X3QpKHgpKQorI2RlZmluZSBNU1coeCkJKCh1aW50MTZfdCkoKHVpbnQzMl90KSh4KSA+PiAxNikpCisKKyNkZWZpbmUgTFNEKHgpCSgodWludDMyX3QpKCh1aW50NjRfdCkoeCkpKQorI2RlZmluZSBNU0QoeCkJKCh1aW50MzJfdCkoKCgodWludDY0X3QpKHgpKSA+PiAxNikgPj4gMTYpKQorCisKKy8qCisgKiBJL08gcmVnaXN0ZXIKKyovCisKKyNkZWZpbmUgUkRfUkVHX0JZVEUoYWRkcikJCXJlYWRiKGFkZHIpCisjZGVmaW5lIFJEX1JFR19XT1JEKGFkZHIpCQlyZWFkdyhhZGRyKQorI2RlZmluZSBSRF9SRUdfRFdPUkQoYWRkcikJCXJlYWRsKGFkZHIpCisjZGVmaW5lIFJEX1JFR19CWVRFX1JFTEFYRUQoYWRkcikJcmVhZGJfcmVsYXhlZChhZGRyKQorI2RlZmluZSBSRF9SRUdfV09SRF9SRUxBWEVEKGFkZHIpCXJlYWR3X3JlbGF4ZWQoYWRkcikKKyNkZWZpbmUgUkRfUkVHX0RXT1JEX1JFTEFYRUQoYWRkcikJcmVhZGxfcmVsYXhlZChhZGRyKQorI2RlZmluZSBXUlRfUkVHX0JZVEUoYWRkciwgZGF0YSkJd3JpdGViKGRhdGEsYWRkcikKKyNkZWZpbmUgV1JUX1JFR19XT1JEKGFkZHIsIGRhdGEpCXdyaXRldyhkYXRhLGFkZHIpCisjZGVmaW5lIFdSVF9SRUdfRFdPUkQoYWRkciwgZGF0YSkJd3JpdGVsKGRhdGEsYWRkcikKKworLyoKKyAqIEZpYnJlIENoYW5uZWwgZGV2aWNlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFdXTl9TSVpFCQk4CS8qIFNpemUgb2YgV1dQTiwgV1dOICYgV1dOTiAqLworI2RlZmluZSBNQVhfRklCUkVfREVWSUNFUwk1MTIKKyNkZWZpbmUgTUFYX0ZJQlJFX0xVTlMgIAkyNTYKKyNkZWZpbmUJTUFYX1JTQ05fQ09VTlQJCTMyCisjZGVmaW5lCU1BWF9IT1NUX0NPVU5UCQkxNgorCisvKgorICogSG9zdCBhZGFwdGVyIGRlZmF1bHQgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgTUFYX0JVU0VTCQkxICAvKiBXZSBvbmx5IGhhdmUgb25lIGJ1cyB0b2RheSAqLworI2RlZmluZSBNQVhfVEFSR0VUU18yMTAwCU1BWF9GSUJSRV9ERVZJQ0VTCisjZGVmaW5lIE1BWF9UQVJHRVRTXzIyMDAJTUFYX0ZJQlJFX0RFVklDRVMKKyNkZWZpbmUgTUFYX1RBUkdFVFMJCU1BWF9GSUJSRV9ERVZJQ0VTCisjZGVmaW5lIE1JTl9MVU5TCQk4CisjZGVmaW5lIE1BWF9MVU5TCQlNQVhfRklCUkVfTFVOUworI2RlZmluZSBNQVhfQ01EU19QRVJfTFVOCTI1NSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoKKyAqIEZpYnJlIENoYW5uZWwgZGV2aWNlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFNOU19MQVNUX0xPT1BfSURfMjEwMAkweGZlCisjZGVmaW5lIFNOU19MQVNUX0xPT1BfSURfMjMwMAkweDdmZgorCisjZGVmaW5lIExBU1RfTE9DQUxfTE9PUF9JRAkweDdkCisjZGVmaW5lIFNOU19GTF9QT1JUCQkweDdlCisjZGVmaW5lIEZBQlJJQ19DT05UUk9MTEVSCTB4N2YKKyNkZWZpbmUgU0lNUExFX05BTUVfU0VSVkVSCTB4ODAKKyNkZWZpbmUgU05TX0ZJUlNUX0xPT1BfSUQJMHg4MQorI2RlZmluZSBNQU5BR0VNRU5UX1NFUlZFUgkweGZlCisjZGVmaW5lIEJST0FEQ0FTVAkJMHhmZgorCisjZGVmaW5lIFJFU0VSVkVEX0xPT1BfSUQoeCkJKCh4ID4gTEFTVF9MT0NBTF9MT09QX0lEICYmIFwKKwkJCQkgeCA8IFNOU19GSVJTVF9MT09QX0lEKSB8fCBcCisJCQkJIHggPT0gTUFOQUdFTUVOVF9TRVJWRVIgfHwgXAorCQkJCSB4ID09IEJST0FEQ0FTVCkKKworLyoKKyAqIFRpbWVvdXQgdGltZXIgY291bnRzIGluIHNlY29uZHMKKyAqLworI2RlZmluZSBQT1JUX1JFVFJZX1RJTUUJCQkyCisjZGVmaW5lIExPT1BfRE9XTl9USU1FT1VUCQk2MAorI2RlZmluZSBMT09QX0RPV05fVElNRQkJCTI1NQkvKiAyNDAgKi8KKyNkZWZpbmUJTE9PUF9ET1dOX1JFU0VUCQkJKExPT1BfRE9XTl9USU1FIC0gMzApCisKKy8qIE1heGltdW0gb3V0c3RhbmRpbmcgY29tbWFuZHMgaW4gSVNQIHF1ZXVlcyAoMS02NTUzNSkgKi8KKyNkZWZpbmUgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTCTEwMjQKKworLyogSVNQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGVudHJ5IGNvdW50cyAoMzctNjU1MzUpICovCisjZGVmaW5lIFJFUVVFU1RfRU5UUllfQ05UXzIxMDAJCTEyOAkvKiBOdW1iZXIgb2YgcmVxdWVzdCBlbnRyaWVzLiAqLworI2RlZmluZSBSRVFVRVNUX0VOVFJZX0NOVF8yMjAwCQkyMDQ4CS8qIE51bWJlciBvZiByZXF1ZXN0IGVudHJpZXMuICovCisjZGVmaW5lIFJFUVVFU1RfRU5UUllfQ05UXzJYWFhfRVhUX01FTQk0MDk2CS8qIE51bWJlciBvZiByZXF1ZXN0IGVudHJpZXMuICovCisjZGVmaW5lIFJFU1BPTlNFX0VOVFJZX0NOVF8yMTAwCQk2NAkvKiBOdW1iZXIgb2YgcmVzcG9uc2UgZW50cmllcy4qLworI2RlZmluZSBSRVNQT05TRV9FTlRSWV9DTlRfMjMwMAkJNTEyCS8qIE51bWJlciBvZiByZXNwb25zZSBlbnRyaWVzLiovCisKKy8qCisgKiBTQ1NJIFJlcXVlc3QgQmxvY2sgCisgKi8KK3R5cGVkZWYgc3RydWN0IHNyYiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOwkvKiBIQSB0aGUgU1AgaXMgcXVldWVkIG9uICovCisKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CQkvKiBMaW51eCBTQ1NJIGNvbW1hbmQgcGt0ICovCisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogQ29tbWFuZCB0aW1lciAqLworCWF0b21pY190IHJlZl9jb3VudDsJLyogUmVmZXJlbmNlIGNvdW50IGZvciB0aGlzIHN0cnVjdHVyZSAqLwkJCQorCXVpbnQxNl90IGZsYWdzOworCisJLyogUmVxdWVzdCBzdGF0ZSAqLworCXVpbnQxNl90IHN0YXRlOworCisJLyogVGFyZ2V0L0xVTiBxdWV1ZSBwb2ludGVycy4gKi8KKwlzdHJ1Y3Qgb3NfdGd0ICp0Z3RfcXVldWU7CS8qIHB0ciB0byB2aXNpYmxlIGhhJ3MgdGFyZ2V0ICovCisJc3RydWN0IG9zX2x1biAqbHVuX3F1ZXVlOwkvKiBwdHIgdG8gdmlzaWJsZSBoYSdzIGx1biAqLworCXN0cnVjdCBmY19sdW4gKmZjbHVuOwkJLyogRkMgTFVOIGNvbnRleHQgcG9pbnRlci4gKi8KKworCS8qIFRpbWluZyBjb3VudHMuICovCisJdW5zaWduZWQgbG9uZyBlX3N0YXJ0OwkJLyogU3RhcnQgb2YgZXh0ZW5kIHRpbWVvdXQgKi8KKwl1bnNpZ25lZCBsb25nIHJfc3RhcnQ7CQkvKiBTdGFydCBvZiByZXF1ZXN0ICovCisJdW5zaWduZWQgbG9uZyB1X3N0YXJ0OwkJLyogV2hlbiBzZW50IHRvIFJJU0MgKi8KKwl1bnNpZ25lZCBsb25nIGZfc3RhcnQ7CQkvKiBXaGVuIHBsYWNlZCBpbiBGTyBxdWV1ZSovCisKKwkvKiBTaW5nbGUgdHJhbnNmZXIgRE1BIGNvbnRleHQgKi8KKwlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisKKwl1aW50MzJfdCByZXF1ZXN0X3NlbnNlX2xlbmd0aDsKKwl1aW50OF90ICpyZXF1ZXN0X3NlbnNlX3B0cjsKKworCWludCBleHRfaGlzdG9yeTsKKworCS8qIFN1c3BlbmQgZGVsYXkgKi8KKwlpbnQgZGVsYXk7CisKKwkvKiBSYXcgY29tcGxldGlvbiBpbmZvIGZvciB1c2UgYnkgZmFpbG92ZXIgPyAqLworCXVpbnQ4X3QJZm9fcmV0cnlfY250OwkJLyogUmV0cnkgY291bnQgdGhpcyByZXF1ZXN0ICovCisJdWludDhfdAllcnJfaWQ7CQkJLyogZXJyb3IgaWQgKi8KKyNkZWZpbmUgU1JCX0VSUl9QT1JUCTEJCS8qIFJlcXVlc3QgZmFpbGVkIC0tICJwb3J0IGRvd24iICovCisjZGVmaW5lIFNSQl9FUlJfTE9PUAkyCQkvKiBSZXF1ZXN0IGZhaWxlZCAtLSAibG9vcCBkb3duIiAqLworI2RlZmluZSBTUkJfRVJSX0RFVklDRQkzCQkvKiBSZXF1ZXN0IGZhaWxlZCAtLSAiZGV2aWNlIGVycm9yIiAqLworI2RlZmluZSBTUkJfRVJSX09USEVSCTQKKworCS8qIFNSQiBtYWdpYyBudW1iZXIgKi8KKwl1aW50MTZfdCBtYWdpYzsKKyNkZWZpbmUgU1JCX01BR0lDICAgICAgIDB4MTBDQgorfSBzcmJfdDsKKworLyoKKyAqIFNSQiBmbGFnIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgU1JCX1RJTUVPVVQJCUJJVF8wCS8qIENvbW1hbmQgdGltZWQgb3V0ICovCisjZGVmaW5lIFNSQl9ETUFfVkFMSUQJCUJJVF8xCS8qIENvbW1hbmQgc2VudCB0byBJU1AgKi8KKyNkZWZpbmUgU1JCX1dBVENIRE9HCQlCSVRfMgkvKiBDb21tYW5kIG9uIHdhdGNoZG9nIGxpc3QgKi8KKyNkZWZpbmUgU1JCX0FCT1JUX1BFTkRJTkcJQklUXzMJLyogQ29tbWFuZCBhYm9ydCBzZW50IHRvIGRldmljZSAqLworCisjZGVmaW5lIFNSQl9BQk9SVEVECQlCSVRfNAkvKiBDb21tYW5kIGFib3J0ZWQgY29tbWFuZCBhbHJlYWR5ICovCisjZGVmaW5lIFNSQl9SRVRSWQkJQklUXzUJLyogQ29tbWFuZCBuZWVkcyByZXRyeWluZyAqLworI2RlZmluZSBTUkJfR09UX1NFTlNFCQlCSVRfNgkvKiBDb21tYW5kIGhhcyBzZW5zZSBkYXRhICovCisjZGVmaW5lIFNSQl9GQUlMT1ZFUgkJQklUXzcJLyogQ29tbWFuZCBpbiBmYWlsb3ZlciBzdGF0ZSAqLworCisjZGVmaW5lIFNSQl9CVVNZCQlCSVRfOAkvKiBDb21tYW5kIGlzIGluIGJ1c3kgcmV0cnkgc3RhdGUgKi8KKyNkZWZpbmUgU1JCX0ZPX0NBTkNFTAkJQklUXzkJLyogQ29tbWFuZCBkb24ndCBuZWVkIHRvIGRvIGZhaWxvdmVyICovCisjZGVmaW5lIFNSQl9JT0NUTAkJQklUXzEwCS8qIElPQ1RMIGNvbW1hbmQuICovCisjZGVmaW5lIFNSQl9UQVBFCQlCSVRfMTEJLyogRkNQMiAoVGFwZSkgY29tbWFuZC4gKi8KKworLyoKKyAqIFNSQiBzdGF0ZSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNSQl9GUkVFX1NUQVRFCQkwCS8qICAgcmV0dXJuZWQgYmFjayAqLworI2RlZmluZSBTUkJfUEVORElOR19TVEFURQkxCS8qICAgcXVldWVkIGluIExVTiBRICovCisjZGVmaW5lIFNSQl9BQ1RJVkVfU1RBVEUJMgkvKiAgIGluIEFjdGl2ZSBBcnJheSAqLworI2RlZmluZSBTUkJfRE9ORV9TVEFURQkJMwkvKiAgIHF1ZXVlZCBpbiBEb25lIFF1ZXVlICovCisjZGVmaW5lIFNSQl9SRVRSWV9TVEFURQkJNAkvKiAgIGluIFJldHJ5IFF1ZXVlICovCisjZGVmaW5lIFNSQl9TVVNQRU5ERURfU1RBVEUJNQkvKiAgIGluIHN1c3BlbmRlZCBzdGF0ZSAqLworI2RlZmluZSBTUkJfTk9fUVVFVUVfU1RBVEUJNgkvKiAgIGlzIGluIGJldHdlZW4gc3RhdGVzICovCisjZGVmaW5lIFNSQl9BQ1RJVkVfVElNRU9VVF9TVEFURSA3CS8qICAgaW4gQWN0aXZlIEFycmF5IGJ1dCB0aW1lZCBvdXQgKi8KKyNkZWZpbmUgU1JCX0ZBSUxPVkVSX1NUQVRFCTgJLyogICBpbiBGYWlsb3ZlciBRdWV1ZSAqLworI2RlZmluZSBTUkJfU0NTSV9SRVRSWV9TVEFURQk5CS8qICAgaW4gU2NzaSBSZXRyeSBRdWV1ZSAqLworCisKKy8qCisgKiBJU1AgSS9PIFJlZ2lzdGVyIFNldCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHsKKwl2b2xhdGlsZSB1aW50MTZfdCBmbGFzaF9hZGRyZXNzOyAvKiBGbGFzaCBCSU9TIGFkZHJlc3MgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBmbGFzaF9kYXRhOwkvKiBGbGFzaCBCSU9TIGRhdGEgKi8KKwl1aW50MTZfdCB1bnVzZWRfMVsxXTsJCS8qIEdhcCAqLworCXZvbGF0aWxlIHVpbnQxNl90IGN0cmxfc3RhdHVzOwkvKiBDb250cm9sL1N0YXR1cyAqLworI2RlZmluZSBDU1JfRkxBU0hfNjRLX0JBTksJQklUXzMJLyogRmxhc2ggdXBwZXIgNjRLIGJhbmsgc2VsZWN0ICovIAorI2RlZmluZSBDU1JfRkxBU0hfRU5BQkxFCUJJVF8xCS8qIEZsYXNoIEJJT1MgUmVhZC9Xcml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgQ1NSX0lTUF9TT0ZUX1JFU0VUCUJJVF8wCS8qIElTUCBzb2Z0IHJlc2V0ICovCisKKwl2b2xhdGlsZSB1aW50MTZfdCBpY3RybDsJLyogSW50ZXJydXB0IGNvbnRyb2wgKi8KKyNkZWZpbmUgSUNSX0VOX0lOVAkJQklUXzE1CS8qIElTUCBlbmFibGUgaW50ZXJydXB0cy4gKi8KKyNkZWZpbmUgSUNSX0VOX1JJU0MJCUJJVF8zCS8qIElTUCBlbmFibGUgUklTQyBpbnRlcnJ1cHRzLiAqLworCisJdm9sYXRpbGUgdWludDE2X3QgaXN0YXR1czsJLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJU1JfUklTQ19JTlQJCUJJVF8zCS8qIFJJU0MgaW50ZXJydXB0ICovCisKKwl2b2xhdGlsZSB1aW50MTZfdCBzZW1hcGhvcmU7CS8qIFNlbWFwaG9yZSAqLworCXZvbGF0aWxlIHVpbnQxNl90IG52cmFtOwkvKiBOVlJBTSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTlZSX0RFU0VMRUNUCQkwCisjZGVmaW5lIE5WUl9CVVNZCQlCSVRfMTUKKyNkZWZpbmUgTlZSX1dSVF9FTkFCTEUJCUJJVF8xNAkvKiBXcml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgTlZSX1BSX0VOQUJMRQkJQklUXzEzCS8qIFByb3RlY3Rpb24gcmVnaXN0ZXIgZW5hYmxlICovCisjZGVmaW5lIE5WUl9EQVRBX0lOCQlCSVRfMworI2RlZmluZSBOVlJfREFUQV9PVVQJCUJJVF8yCisjZGVmaW5lIE5WUl9TRUxFQ1QJCUJJVF8xCisjZGVmaW5lIE5WUl9DTE9DSwkJQklUXzAKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gwOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gzOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDQ7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94NTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g2OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDc7CisJCQl1aW50MTZfdCB1bnVzZWRfMls1OV07CQkvKiBHYXAgKi8KKwkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBpc3AyMTAwOworCQlzdHJ1Y3QgeworCQkJCQkJCS8qIFJlcXVlc3QgUXVldWUgKi8KKwkJCXZvbGF0aWxlIHVpbnQxNl90IHJlcV9xX2luOwkvKiAgSW4tUG9pbnRlciAqLworCQkJdm9sYXRpbGUgdWludDE2X3QgcmVxX3Ffb3V0OwkvKiAgT3V0LVBvaW50ZXIgKi8KKwkJCQkJCQkvKiBSZXNwb25zZSBRdWV1ZSAqLworCQkJdm9sYXRpbGUgdWludDE2X3QgcnNwX3FfaW47CS8qICBJbi1Qb2ludGVyICovCisJCQl2b2xhdGlsZSB1aW50MTZfdCByc3BfcV9vdXQ7CS8qICBPdXQtUG9pbnRlciAqLworCisJCQkJCQkvKiBSSVNDIHRvIEhvc3QgU3RhdHVzICovCisJCQl2b2xhdGlsZSB1aW50MzJfdCBob3N0X3N0YXR1czsJCisjZGVmaW5lIEhTUl9SSVNDX0lOVAkJQklUXzE1CS8qIFJJU0MgaW50ZXJydXB0ICovCisjZGVmaW5lIEhTUl9SSVNDX1BBVVNFRAkJQklUXzgJLyogUklTQyBQYXVzZWQgKi8KKworCQkJCQkvKiBIb3N0IHRvIEhvc3QgU2VtYXBob3JlICovCisJCQl2b2xhdGlsZSB1aW50MTZfdCBob3N0X3NlbWFwaG9yZTsgCisJCQl1aW50MTZfdCB1bnVzZWRfM1sxN107CQkvKiBHYXAgKi8KKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gwOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94MjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gzOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDQ7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94NTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g2OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDc7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94ODsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3g5OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDEwOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDExOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDEyOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDEzOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE0OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE1OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE2OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE3OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE4OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDE5OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDIwOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDIxOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDIyOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDIzOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI0OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI1OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI2OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI3OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI4OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDI5OworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDMwOworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDMxOworCQkJdm9sYXRpbGUgdWludDE2X3QgZmJfY21kOworCQkJdWludDE2X3QgdW51c2VkXzRbMTBdOwkJLyogR2FwICovCisJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgaXNwMjMwMDsKKwl9IHU7CisKKwl2b2xhdGlsZSB1aW50MTZfdCBmcG1fZGlhZ19jb25maWc7CisJdWludDE2X3QgdW51c2VkXzVbMHg2XTsJCS8qIEdhcCAqLworCXZvbGF0aWxlIHVpbnQxNl90IHBjcjsJCS8qIFByb2Nlc3NvciBDb250cm9sIFJlZ2lzdGVyLiAqLworCXVpbnQxNl90IHVudXNlZF82WzB4NV07CQkvKiBHYXAgKi8KKwl2b2xhdGlsZSB1aW50MTZfdCBtY3RyOwkJLyogTWVtb3J5IENvbmZpZ3VyYXRpb24gYW5kIFRpbWluZy4gKi8KKwl1aW50MTZfdCB1bnVzZWRfN1sweDNdOwkJLyogR2FwICovCisJdm9sYXRpbGUgdWludDE2X3QgZmJfY21kXzIxMDA7CS8qIFVudXNlZCBvbiAyM1hYICovCisJdWludDE2X3QgdW51c2VkXzhbMHgzXTsJCS8qIEdhcCAqLworCXZvbGF0aWxlIHVpbnQxNl90IGhjY3I7CQkvKiBIb3N0IGNvbW1hbmQgJiBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBIQ0NSX0hPU1RfSU5UCQlCSVRfNwkvKiBIb3N0IGludGVycnVwdCBiaXQgKi8KKyNkZWZpbmUgSENDUl9SSVNDX1BBVVNFCQlCSVRfNQkvKiBQYXVzZSBtb2RlIGJpdCAqLworCQkJCQkvKiBIQ0NSIGNvbW1hbmRzICovCisjZGVmaW5lIEhDQ1JfUkVTRVRfUklTQwkJMHgxMDAwCS8qIFJlc2V0IFJJU0MgKi8KKyNkZWZpbmUgSENDUl9QQVVTRV9SSVNDCQkweDIwMDAJLyogUGF1c2UgUklTQyAqLworI2RlZmluZSBIQ0NSX1JFTEVBU0VfUklTQwkweDMwMDAJLyogUmVsZWFzZSBSSVNDIGZyb20gcmVzZXQuICovCisjZGVmaW5lIEhDQ1JfU0VUX0hPU1RfSU5UCTB4NTAwMAkvKiBTZXQgaG9zdCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSENDUl9DTFJfSE9TVF9JTlQJMHg2MDAwCS8qIENsZWFyIEhPU1QgaW50ZXJydXB0ICovCisjZGVmaW5lIEhDQ1JfQ0xSX1JJU0NfSU5UCTB4NzAwMAkvKiBDbGVhciBSSVNDIGludGVycnVwdCAqLworI2RlZmluZQlIQ0NSX0RJU0FCTEVfUEFSSVRZX1BBVVNFIDB4NDAwMSAvKiBEaXNhYmxlIHBhcml0eSBlcnJvciBSSVNDIHBhdXNlLiAqLworI2RlZmluZSBIQ0NSX0VOQUJMRV9QQVJJVFkJMHhBMDAwCS8qIEVuYWJsZSBQQVJJVFkgaW50ZXJydXB0ICovCisKKwl1aW50MTZfdCB1bnVzZWRfOVs1XTsJCS8qIEdhcCAqLworCXZvbGF0aWxlIHVpbnQxNl90IGdwaW9kOwkvKiBHUElPIERhdGEgcmVnaXN0ZXIuICovCisJdm9sYXRpbGUgdWludDE2X3QgZ3Bpb2U7CS8qIEdQSU8gRW5hYmxlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBHUElPX0xFRF9NQVNLCQkJMHgwMEMwCisjZGVmaW5lIEdQSU9fTEVEX0dSRUVOX09GRl9BTUJFUl9PRkYJMHgwMDAwCisjZGVmaW5lIEdQSU9fTEVEX0dSRUVOX09OX0FNQkVSX09GRgkweDAwNDAKKyNkZWZpbmUgR1BJT19MRURfR1JFRU5fT0ZGX0FNQkVSX09OCTB4MDA4MAorI2RlZmluZSBHUElPX0xFRF9HUkVFTl9PTl9BTUJFUl9PTgkweDAwQzAKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQxNl90IHVudXNlZF8xMFs4XTsJCS8qIEdhcCAqLworCQkJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveDg7CisJCQl2b2xhdGlsZSB1aW50MTZfdCBtYWlsYm94OTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxMzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxNzsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxODsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gxOTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMDsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMTsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMjsKKwkJCXZvbGF0aWxlIHVpbnQxNl90IG1haWxib3gyMzsJLyogQWxzbyBwcm9iZSByZWcuICovCisJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgaXNwMjIwMDsKKwl9IHVfZW5kOworfSBkZXZpY2VfcmVnX3Q7CisKKyNkZWZpbmUgSVNQX1JFUV9RX0lOKGhhLCByZWcpIFwKKwkoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkgPyBcCisJICYocmVnKS0+dS5pc3AyMTAwLm1haWxib3g0IDogXAorCSAmKHJlZyktPnUuaXNwMjMwMC5yZXFfcV9pbikKKyNkZWZpbmUgSVNQX1JFUV9RX09VVChoYSwgcmVnKSBcCisJKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpID8gXAorCSAmKHJlZyktPnUuaXNwMjEwMC5tYWlsYm94NCA6IFwKKwkgJihyZWcpLT51LmlzcDIzMDAucmVxX3Ffb3V0KQorI2RlZmluZSBJU1BfUlNQX1FfSU4oaGEsIHJlZykgXAorCShJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSA/IFwKKwkgJihyZWcpLT51LmlzcDIxMDAubWFpbGJveDUgOiBcCisJICYocmVnKS0+dS5pc3AyMzAwLnJzcF9xX2luKQorI2RlZmluZSBJU1BfUlNQX1FfT1VUKGhhLCByZWcpIFwKKwkoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkgPyBcCisJICYocmVnKS0+dS5pc3AyMTAwLm1haWxib3g1IDogXAorCSAmKHJlZyktPnUuaXNwMjMwMC5yc3BfcV9vdXQpCisKKyNkZWZpbmUgTUFJTEJPWF9SRUcoaGEsIHJlZywgbnVtKSBcCisJKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpID8gXAorCSAobnVtIDwgOCA/IFwKKwkgICYocmVnKS0+dS5pc3AyMTAwLm1haWxib3gwICsgKG51bSkgOiBcCisJICAmKHJlZyktPnVfZW5kLmlzcDIyMDAubWFpbGJveDggKyAobnVtKSAtIDgpIDogXAorCSAmKHJlZyktPnUuaXNwMjMwMC5tYWlsYm94MCArIChudW0pKQorI2RlZmluZSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCBudW0pIFwKKwlSRF9SRUdfV09SRChNQUlMQk9YX1JFRyhoYSwgcmVnLCBudW0pKQorI2RlZmluZSBXUlRfTUFJTEJPWF9SRUcoaGEsIHJlZywgbnVtLCBkYXRhKSBcCisJV1JUX1JFR19XT1JEKE1BSUxCT1hfUkVHKGhhLCByZWcsIG51bSksIGRhdGEpCisKKyNkZWZpbmUgRkJfQ01EX1JFRyhoYSwgcmVnKSBcCisJKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpID8gXAorCSAmKHJlZyktPmZiX2NtZF8yMTAwIDogXAorCSAmKHJlZyktPnUuaXNwMjMwMC5mYl9jbWQpCisjZGVmaW5lIFJEX0ZCX0NNRF9SRUcoaGEsIHJlZykgXAorCVJEX1JFR19XT1JEKEZCX0NNRF9SRUcoaGEsIHJlZykpCisjZGVmaW5lIFdSVF9GQl9DTURfUkVHKGhhLCByZWcsIGRhdGEpIFwKKwlXUlRfUkVHX1dPUkQoRkJfQ01EX1JFRyhoYSwgcmVnKSwgZGF0YSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90CW91dF9tYjsJCS8qIG91dGJvdW5kIGZyb20gZHJpdmVyICovCisJdWludDMyX3QJaW5fbWI7CQkJLyogSW5jb21pbmcgZnJvbSBSSVNDICovCisJdWludDE2X3QJbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJbG9uZwkJYnVmX3NpemU7CisJdm9pZAkJKmJ1ZnA7CisJdWludDMyX3QJdG92OworCXVpbnQ4X3QJCWZsYWdzOworI2RlZmluZSBNQlhfRE1BX0lOCUJJVF8wCisjZGVmaW5lCU1CWF9ETUFfT1VUCUJJVF8xCisjZGVmaW5lIElPQ1RMX0NNRAlCSVRfMgorfSBtYnhfY21kX3Q7CisKKyNkZWZpbmUJTUJYX1RPVl9TRUNPTkRTCTMwCisKKy8qCisgKiAgSVNQIHByb2R1Y3QgaWRlbnRpZmljYXRpb24gZGVmaW5pdGlvbnMgaW4gbWFpbGJveGVzIGFmdGVyIHJlc2V0LgorICovCisjZGVmaW5lIFBST0RfSURfMQkJMHg0OTUzCisjZGVmaW5lIFBST0RfSURfMgkJMHgwMDAwCisjZGVmaW5lIFBST0RfSURfMmEJCTB4NTAyMAorI2RlZmluZSBQUk9EX0lEXzMJCTB4MjAyMAorCisvKgorICogSVNQIG1haWxib3ggU2VsZi1UZXN0IHN0YXR1cyBjb2RlcworICovCisjZGVmaW5lIE1CU19GUk1fQUxJVkUJCTAJLyogRmlybXdhcmUgQWxpdmUuICovCisjZGVmaW5lIE1CU19DSEtTVU1fRVJSCQkxCS8qIENoZWNrc3VtIEVycm9yLiAqLworI2RlZmluZSBNQlNfQlVTWQkJNAkvKiBCdXN5LiAqLworCisvKgorICogSVNQIG1haWxib3ggY29tbWFuZCBjb21wbGV0ZSBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBNQlNfQ09NTUFORF9DT01QTEVURQkJMHg0MDAwCisjZGVmaW5lIE1CU19JTlZBTElEX0NPTU1BTkQJCTB4NDAwMQorI2RlZmluZSBNQlNfSE9TVF9JTlRFUkZBQ0VfRVJST1IJMHg0MDAyCisjZGVmaW5lIE1CU19URVNUX0ZBSUxFRAkJCTB4NDAwMworI2RlZmluZSBNQlNfQ09NTUFORF9FUlJPUgkJMHg0MDA1CisjZGVmaW5lIE1CU19DT01NQU5EX1BBUkFNRVRFUl9FUlJPUgkweDQwMDYKKyNkZWZpbmUgTUJTX1BPUlRfSURfVVNFRAkJMHg0MDA3CisjZGVmaW5lIE1CU19MT09QX0lEX1VTRUQJCTB4NDAwOAorI2RlZmluZSBNQlNfQUxMX0lEU19JTl9VU0UJCTB4NDAwOQorI2RlZmluZSBNQlNfTk9UX0xPR0dFRF9JTgkJMHg0MDBBCisKKy8qCisgKiBJU1AgbWFpbGJveCBhc3luY2hyb25vdXMgZXZlbnQgc3RhdHVzIGNvZGVzCisgKi8KKyNkZWZpbmUgTUJBX0FTWU5DX0VWRU5UCQkweDgwMDAJLyogQXN5bmNocm9ub3VzIGV2ZW50LiAqLworI2RlZmluZSBNQkFfUkVTRVQJCTB4ODAwMQkvKiBSZXNldCBEZXRlY3RlZC4gKi8KKyNkZWZpbmUgTUJBX1NZU1RFTV9FUlIJCTB4ODAwMgkvKiBTeXN0ZW0gRXJyb3IuICovCisjZGVmaW5lIE1CQV9SRVFfVFJBTlNGRVJfRVJSCTB4ODAwMwkvKiBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yLiAqLworI2RlZmluZSBNQkFfUlNQX1RSQU5TRkVSX0VSUgkweDgwMDQJLyogUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3IuICovCisjZGVmaW5lIE1CQV9XQUtFVVBfVEhSRVMJMHg4MDA1CS8qIFJlcXVlc3QgUXVldWUgV2FrZS11cC4gKi8KKyNkZWZpbmUgTUJBX0xJUF9PQ0NVUlJFRAkweDgwMTAJLyogTG9vcCBJbml0aWFsaXphdGlvbiBQcm9jZWR1cmUgKi8KKwkJCQkJLyogb2NjdXJyZWQuICovCisjZGVmaW5lIE1CQV9MT09QX1VQCQkweDgwMTEJLyogRkMgTG9vcCBVUC4gKi8KKyNkZWZpbmUgTUJBX0xPT1BfRE9XTgkJMHg4MDEyCS8qIEZDIExvb3AgRG93bi4gKi8KKyNkZWZpbmUgTUJBX0xJUF9SRVNFVAkJMHg4MDEzCS8qIExJUCByZXNldCBvY2N1cnJlZC4gKi8KKyNkZWZpbmUgTUJBX1BPUlRfVVBEQVRFCQkweDgwMTQJLyogUG9ydCBEYXRhYmFzZSB1cGRhdGUuICovCisjZGVmaW5lIE1CQV9SU0NOX1VQREFURQkJMHg4MDE1CS8qIFJlZ2lzdGVyIFN0YXRlIENoZyBOb3RpZmljYXRpb24uICovCisjZGVmaW5lIE1CQV9MSVBfRjgJCTB4ODAxNgkvKiBSZWNlaXZlZCBhIExJUCBGOC4gKi8KKyNkZWZpbmUgTUJBX0xPT1BfSU5JVF9FUlIJMHg4MDE3CS8qIExvb3AgSW5pdGlhbGl6YXRpb24gRXJyb3IuICovCisjZGVmaW5lIE1CQV9GQUJSSUNfQVVUSF9SRVEJMHg4MDFiCS8qIEZhYnJpYyBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZC4gKi8KKyNkZWZpbmUgTUJBX1NDU0lfQ09NUExFVElPTgkweDgwMjAJLyogU0NTSSBDb21tYW5kIENvbXBsZXRlLiAqLworI2RlZmluZSBNQkFfQ1RJT19DT01QTEVUSU9OCTB4ODAyMQkvKiBDVElPIENvbXBsZXRlLiAqLworI2RlZmluZSBNQkFfSVBfQ09NUExFVElPTgkweDgwMjIJLyogSVAgVHJhbnNtaXQgQ29tbWFuZCBDb21wbGV0ZS4gKi8KKyNkZWZpbmUgTUJBX0lQX1JFQ0VJVkUJCTB4ODAyMwkvKiBJUCBSZWNlaXZlZC4gKi8KKyNkZWZpbmUgTUJBX0lQX0JST0FEQ0FTVAkweDgwMjQJLyogSVAgQnJvYWRjYXN0IFJlY2VpdmVkLiAqLworI2RlZmluZSBNQkFfSVBfTE9XX1dBVEVSX01BUksJMHg4MDI1CS8qIElQIExvdyBXYXRlciBNYXJrIHJlYWNoZWQuICovCisjZGVmaW5lIE1CQV9JUF9SQ1ZfQlVGRkVSX0VNUFRZIDB4ODAyNgkvKiBJUCByZWNlaXZlIGJ1ZmZlciBxdWV1ZSBlbXB0eS4gKi8KKyNkZWZpbmUgTUJBX0lQX0hEUl9EQVRBX1NQTElUCTB4ODAyNwkvKiBJUCBoZWFkZXIvZGF0YSBzcGxpdHRpbmcgZmVhdHVyZSAqLworCQkJCQkvKiB1c2VkLiAqLworI2RlZmluZSBNQkFfUE9JTlRfVE9fUE9JTlQJMHg4MDMwCS8qIFBvaW50IHRvIHBvaW50IG1vZGUuICovCisjZGVmaW5lIE1CQV9DTVBMVF8xXzE2QklUCTB4ODAzMQkvKiBDb21wbGV0aW9uIDEgMTZiaXQgSU9TQi4gKi8KKyNkZWZpbmUgTUJBX0NNUExUXzJfMTZCSVQJMHg4MDMyCS8qIENvbXBsZXRpb24gMiAxNmJpdCBJT1NCLiAqLworI2RlZmluZSBNQkFfQ01QTFRfM18xNkJJVAkweDgwMzMJLyogQ29tcGxldGlvbiAzIDE2Yml0IElPU0IuICovCisjZGVmaW5lIE1CQV9DTVBMVF80XzE2QklUCTB4ODAzNAkvKiBDb21wbGV0aW9uIDQgMTZiaXQgSU9TQi4gKi8KKyNkZWZpbmUgTUJBX0NNUExUXzVfMTZCSVQJMHg4MDM1CS8qIENvbXBsZXRpb24gNSAxNmJpdCBJT1NCLiAqLworI2RlZmluZSBNQkFfQ0hHX0lOX0NPTk5FQ1RJT04JMHg4MDM2CS8qIENoYW5nZSBpbiBjb25uZWN0aW9uIG1vZGUuICovCisjZGVmaW5lIE1CQV9SSU9fUkVTUE9OU0UJMHg4MDQwCS8qIFJJTyByZXNwb25zZSBxdWV1ZSB1cGRhdGUuICovCisjZGVmaW5lIE1CQV9aSU9fUkVTUE9OU0UJMHg4MDQwCS8qIFpJTyByZXNwb25zZSBxdWV1ZSB1cGRhdGUuICovCisjZGVmaW5lIE1CQV9DTVBMVF8yXzMyQklUCTB4ODA0MgkvKiBDb21wbGV0aW9uIDIgMzJiaXQgSU9TQi4gKi8KKyNkZWZpbmUgTUJBX0JZUEFTU19OT1RJRklDQVRJT04JMHg4MDQzCS8qIEF1dG8gYnlwYXNzIG5vdGlmaWNhdGlvbi4gKi8KKyNkZWZpbmUgTUJBX0RJU0NBUkRfUk5EX0ZSQU1FCTB4ODA0OAkvKiBkaXNjYXJkIFJORCBmcmFtZSBkdWUgdG8gZXJyb3IuICovCisjZGVmaW5lIE1CQV9SRUpFQ1RFRF9GQ1BfQ01ECTB4ODA0OQkvKiByZWplY3RlZCBGQ1BfQ01ELiAqLworCisvKgorICogRmlybXdhcmUgb3B0aW9ucyAxLCAyLCAzLgorICovCisjZGVmaW5lIEZPMV9BRV9PTl9MSVBGOAkJCUJJVF8wCisjZGVmaW5lIEZPMV9BRV9BTExfTElQX1JFU0VUCQlCSVRfMQorI2RlZmluZSBGTzFfQ1RJT19SRVRSWQkJCUJJVF8zCisjZGVmaW5lIEZPMV9ESVNBQkxFX0xJUF9GN19TVwkJQklUXzQKKyNkZWZpbmUgRk8xX0RJU0FCTEVfMTAwTVNfTE9TX1dBSVQJQklUXzUKKyNkZWZpbmUgRk8xX0RJU0FCTEVfR1BJTzZfNwkJQklUXzYKKyNkZWZpbmUgRk8xX0FFX09OX0xPT1BfSU5JVF9FUlIJCUJJVF83CisjZGVmaW5lIEZPMV9TRVRfRU1QSEFTSVNfU1dJTkcJCUJJVF84CisjZGVmaW5lIEZPMV9BRV9BVVRPX0JZUEFTUwkJQklUXzkKKyNkZWZpbmUgRk8xX0VOQUJMRV9QVVJFX0lPQ0IJCUJJVF8xMAorI2RlZmluZSBGTzFfQUVfUExPR0lfUkpUCQlCSVRfMTEKKyNkZWZpbmUgRk8xX0VOQUJMRV9BQk9SVF9TRVFVRU5DRQlCSVRfMTIKKyNkZWZpbmUgRk8xX0FFX1FVRVVFX0ZVTEwJCUJJVF8xMworCisjZGVmaW5lIEZPMl9FTkFCTEVfQVRJT19UWVBFXzMJCUJJVF8wCisjZGVmaW5lIEZPMl9SRVZfTE9PUEJBQ0sJCUJJVF8xCisKKyNkZWZpbmUgRk8zX0VOQUJMRV9FTUVSR19JT0NCCQlCSVRfMAorI2RlZmluZSBGTzNfQUVfUk5EX0VSUk9SCQlCSVRfMQorCisvKgorICogSVNQIG1haWxib3ggY29tbWFuZHMKKyAqLworI2RlZmluZSBNQkNfTE9BRF9SQU0JCQkxCS8qIExvYWQgUkFNLiAqLworI2RlZmluZSBNQkNfRVhFQ1VURV9GSVJNV0FSRQkJMgkvKiBFeGVjdXRlIGZpcm13YXJlLiAqLworI2RlZmluZSBNQkNfV1JJVEVfUkFNX1dPUkQJCTQJLyogV3JpdGUgUkFNIHdvcmQuICovCisjZGVmaW5lIE1CQ19SRUFEX1JBTV9XT1JECQk1CS8qIFJlYWQgUkFNIHdvcmQuICovCisjZGVmaW5lIE1CQ19NQUlMQk9YX1JFR0lTVEVSX1RFU1QJNgkvKiBXcmFwIGluY29taW5nIG1haWxib3hlcyAqLworI2RlZmluZSBNQkNfVkVSSUZZX0NIRUNLU1VNCQk3CS8qIFZlcmlmeSBjaGVja3N1bS4gKi8KKyNkZWZpbmUgTUJDX0dFVF9GSVJNV0FSRV9WRVJTSU9OCTgJLyogR2V0IGZpcm13YXJlIHJldmlzaW9uLiAqLworI2RlZmluZSBNQkNfTE9BRF9SSVNDX1JBTQkJOQkvKiBMb2FkIFJBTSBjb21tYW5kLiAqLworI2RlZmluZSBNQkNfRFVNUF9SSVNDX1JBTQkJMHhhCS8qIER1bXAgUkFNIGNvbW1hbmQuICovCisjZGVmaW5lIE1CQ19MT0FEX1JJU0NfUkFNX0VYVEVOREVECTB4YgkvKiBMb2FkIFJBTSBleHRlbmRlZC4gKi8KKyNkZWZpbmUgTUJDX0RVTVBfUklTQ19SQU1fRVhURU5ERUQJMHhjCS8qIER1bXAgUkFNIGV4dGVuZGVkLiAqLworI2RlZmluZSBNQkNfV1JJVEVfUkFNX1dPUkRfRVhURU5ERUQJMHhkCS8qIFdyaXRlIFJBTSB3b3JkIGV4dGVuZGVkICovCisjZGVmaW5lIE1CQ19SRUFEX1JBTV9FWFRFTkRFRAkJMHhmCS8qIFJlYWQgUkFNIGV4dGVuZGVkLiAqLworI2RlZmluZSBNQkNfSU9DQl9DT01NQU5ECQkweDEyCS8qIEV4ZWN1dGUgSU9DQiBjb21tYW5kLiAqLworI2RlZmluZSBNQkNfQUJPUlRfQ09NTUFORAkJMHgxNQkvKiBBYm9ydCBJT0NCIGNvbW1hbmQuICovCisjZGVmaW5lIE1CQ19BQk9SVF9ERVZJQ0UJCTB4MTYJLyogQWJvcnQgZGV2aWNlIChJRC9MVU4pLiAqLworI2RlZmluZSBNQkNfQUJPUlRfVEFSR0VUCQkweDE3CS8qIEFib3J0IHRhcmdldCAoSUQpLiAqLworI2RlZmluZSBNQkNfUkVTRVQJCQkweDE4CS8qIFJlc2V0LiAqLworI2RlZmluZSBNQkNfR0VUX0FEQVBURVJfTE9PUF9JRAkJMHgyMAkvKiBHZXQgbG9vcCBpZCBvZiBJU1AyMjAwLiAqLworI2RlZmluZSBNQkNfR0VUX1JFVFJZX0NPVU5UCQkweDIyCS8qIEdldCBmL3cgcmV0cnkgY250L2RlbGF5LiAqLworI2RlZmluZSBNQkNfRElTQUJMRV9WSQkJCTB4MjQJLyogRGlzYWJsZSBWSSBvcGVyYXRpb24uICovCisjZGVmaW5lIE1CQ19FTkFCTEVfVkkJCQkweDI1CS8qIEVuYWJsZSBWSSBvcGVyYXRpb24uICovCisjZGVmaW5lIE1CQ19HRVRfRklSTVdBUkVfT1BUSU9OCQkweDI4CS8qIEdldCBGaXJtd2FyZSBPcHRpb25zLiAqLworI2RlZmluZSBNQkNfU0VUX0ZJUk1XQVJFX09QVElPTgkJMHgzOAkvKiBTZXQgRmlybXdhcmUgT3B0aW9ucy4gKi8KKyNkZWZpbmUgTUJDX0xPT1BfUE9SVF9CWVBBU1MJCTB4NDAJLyogTG9vcCBQb3J0IEJ5cGFzcy4gKi8KKyNkZWZpbmUgTUJDX0xPT1BfUE9SVF9FTkFCTEUJCTB4NDEJLyogTG9vcCBQb3J0IEVuYWJsZS4gKi8KKyNkZWZpbmUgTUJDX0dFVF9SRVNPVVJDRV9DT1VOVFMJCTB4NDIJLyogR2V0IFJlc291cmNlIENvdW50cy4gKi8KKyNkZWZpbmUgTUJDX05PTl9QQVJUSUNJUEFURQkJMHg0MwkvKiBOb24tUGFydGljaXBhdGluZyBNb2RlLiAqLworI2RlZmluZSBNQkNfRElBR05PU1RJQ19FQ0hPCQkweDQ0CS8qIERpYWdub3N0aWMgZWNoby4gKi8KKyNkZWZpbmUgTUJDX0RJQUdOT1NUSUNfTE9PUF9CQUNLCTB4NDUJLyogRGlhZ25vc3RpYyBsb29wIGJhY2suICovCisjZGVmaW5lIE1CQ19PTkxJTkVfU0VMRl9URVNUCQkweDQ2CS8qIE9ubGluZSBzZWxmLXRlc3QuICovCisjZGVmaW5lIE1CQ19FTkhBTkNFRF9HRVRfUE9SVF9EQVRBQkFTRQkweDQ3CS8qIEdldCBwb3J0IGRhdGFiYXNlICsgbG9naW4gKi8KKyNkZWZpbmUgTUJDX1JFU0VUX0xJTktfU1RBVFVTCQkweDUyCS8qIFJlc2V0IExpbmsgRXJyb3IgU3RhdHVzICovCisjZGVmaW5lIE1CQ19JT0NCX0NPTU1BTkRfQTY0CQkweDU0CS8qIEV4ZWN1dGUgSU9DQiBjb21tYW5kICg2NCkgKi8KKyNkZWZpbmUgTUJDX1NFTkRfUk5JRF9FTFMJCTB4NTcJLyogU2VuZCBSTklEIEVMUyByZXF1ZXN0ICovCisjZGVmaW5lIE1CQ19TRVRfUk5JRF9QQVJBTVMJCTB4NTkJLyogU2V0IFJOSUQgcGFyYW1ldGVycyAqLworI2RlZmluZSBNQkNfR0VUX1JOSURfUEFSQU1TCQkweDVhCS8qIERhdGEgUmF0ZSAqLworI2RlZmluZSBNQkNfREFUQV9SQVRFCQkJMHg1ZAkvKiBHZXQgUk5JRCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1CQ19JTklUSUFMSVpFX0ZJUk1XQVJFCQkweDYwCS8qIEluaXRpYWxpemUgZmlybXdhcmUgKi8KKyNkZWZpbmUgTUJDX0lOSVRJQVRFX0xJUAkJMHg2MgkvKiBJbml0aWF0ZSBMb29wICovCisJCQkJCQkvKiBJbml0aWFsaXphdGlvbiBQcm9jZWR1cmUgKi8KKyNkZWZpbmUgTUJDX0dFVF9GQ19BTF9QT1NJVElPTl9NQVAJMHg2MwkvKiBHZXQgRkNfQUwgUG9zaXRpb24gTWFwLiAqLworI2RlZmluZSBNQkNfR0VUX1BPUlRfREFUQUJBU0UJCTB4NjQJLyogR2V0IFBvcnQgRGF0YWJhc2UuICovCisjZGVmaW5lIE1CQ19DTEVBUl9BQ0EJCQkweDY1CS8qIENsZWFyIEFDQS4gKi8KKyNkZWZpbmUgTUJDX1RBUkdFVF9SRVNFVAkJMHg2NgkvKiBUYXJnZXQgUmVzZXQuICovCisjZGVmaW5lIE1CQ19DTEVBUl9UQVNLX1NFVAkJMHg2NwkvKiBDbGVhciBUYXNrIFNldC4gKi8KKyNkZWZpbmUgTUJDX0FCT1JUX1RBU0tfU0VUCQkweDY4CS8qIEFib3J0IFRhc2sgU2V0LiAqLworI2RlZmluZSBNQkNfR0VUX0ZJUk1XQVJFX1NUQVRFCQkweDY5CS8qIEdldCBmaXJtd2FyZSBzdGF0ZS4gKi8KKyNkZWZpbmUgTUJDX0dFVF9QT1JUX05BTUUJCTB4NmEJLyogR2V0IHBvcnQgbmFtZS4gKi8KKyNkZWZpbmUgTUJDX0dFVF9MSU5LX1NUQVRVUwkJMHg2YgkvKiBHZXQgcG9ydCBsaW5rIHN0YXR1cy4gKi8KKyNkZWZpbmUgTUJDX0xJUF9SRVNFVAkJCTB4NmMJLyogTElQIHJlc2V0LiAqLworI2RlZmluZSBNQkNfU0VORF9TTlNfQ09NTUFORAkJMHg2ZQkvKiBTZW5kIFNpbXBsZSBOYW1lIFNlcnZlciAqLworCQkJCQkJLyogY29tbWFuZGQuICovCisjZGVmaW5lIE1CQ19MT0dJTl9GQUJSSUNfUE9SVAkJMHg2ZgkvKiBMb2dpbiBmYWJyaWMgcG9ydC4gKi8KKyNkZWZpbmUgTUJDX1NFTkRfQ0hBTkdFX1JFUVVFU1QJCTB4NzAJLyogU2VuZCBDaGFuZ2UgUmVxdWVzdC4gKi8KKyNkZWZpbmUgTUJDX0xPR09VVF9GQUJSSUNfUE9SVAkJMHg3MQkvKiBMb2dvdXQgZmFicmljIHBvcnQuICovCisjZGVmaW5lIE1CQ19MSVBfRlVMTF9MT0dJTgkJMHg3MgkvKiBGdWxsIGxvZ2luIExJUC4gKi8KKyNkZWZpbmUgTUJDX0xPR0lOX0xPT1BfUE9SVAkJMHg3NAkvKiBMb2dpbiBMb29wIFBvcnQuICovCisjZGVmaW5lIE1CQ19QT1JUX05PREVfTkFNRV9MSVNUCQkweDc1CS8qIEdldCBwb3J0L25vZGUgbmFtZSBsaXN0LiAqLworI2RlZmluZSBNQkNfSU5JVElBTElaRV9SRUNFSVZFX1FVRVVFCTB4NzcJLyogSW5pdGlhbGl6ZSByZWNlaXZlIHF1ZXVlICovCisjZGVmaW5lIE1CQ19VTkxPQURfSVAJCQkweDc5CS8qIFNodXRkb3duIElQICovCisjZGVmaW5lIE1CQ19HRVRfSURfTElTVAkJCTB4N0MJLyogR2V0IFBvcnQgSUQgbGlzdC4gKi8KKyNkZWZpbmUgTUJDX1NFTkRfTEZBX0NPTU1BTkQJCTB4N0QJLyogU2VuZCBMb29wIEZhYnJpYyBBZGRyZXNzICovCisjZGVmaW5lIE1CQ19MVU5fUkVTRVQJCQkweDdFCS8qIFNlbmQgTFVOIHJlc2V0ICovCisKKy8qIEZpcm13YXJlIHJldHVybiBkYXRhIHNpemVzICovCisjZGVmaW5lIEZDQUxfTUFQX1NJWkUJMTI4CisKKy8qIE1haWxib3ggYml0IGRlZmluaXRpb25zIGZvciBvdXRfbWIgYW5kIGluX21iICovCisjZGVmaW5lCU1CWF8zMQkJQklUXzMxCisjZGVmaW5lCU1CWF8zMAkJQklUXzMwCisjZGVmaW5lCU1CWF8yOQkJQklUXzI5CisjZGVmaW5lCU1CWF8yOAkJQklUXzI4CisjZGVmaW5lCU1CWF8yNwkJQklUXzI3CisjZGVmaW5lCU1CWF8yNgkJQklUXzI2CisjZGVmaW5lCU1CWF8yNQkJQklUXzI1CisjZGVmaW5lCU1CWF8yNAkJQklUXzI0CisjZGVmaW5lCU1CWF8yMwkJQklUXzIzCisjZGVmaW5lCU1CWF8yMgkJQklUXzIyCisjZGVmaW5lCU1CWF8yMQkJQklUXzIxCisjZGVmaW5lCU1CWF8yMAkJQklUXzIwCisjZGVmaW5lCU1CWF8xOQkJQklUXzE5CisjZGVmaW5lCU1CWF8xOAkJQklUXzE4CisjZGVmaW5lCU1CWF8xNwkJQklUXzE3CisjZGVmaW5lCU1CWF8xNgkJQklUXzE2CisjZGVmaW5lCU1CWF8xNQkJQklUXzE1CisjZGVmaW5lCU1CWF8xNAkJQklUXzE0CisjZGVmaW5lCU1CWF8xMwkJQklUXzEzCisjZGVmaW5lCU1CWF8xMgkJQklUXzEyCisjZGVmaW5lCU1CWF8xMQkJQklUXzExCisjZGVmaW5lCU1CWF8xMAkJQklUXzEwCisjZGVmaW5lCU1CWF85CQlCSVRfOQorI2RlZmluZQlNQlhfOAkJQklUXzgKKyNkZWZpbmUJTUJYXzcJCUJJVF83CisjZGVmaW5lCU1CWF82CQlCSVRfNgorI2RlZmluZQlNQlhfNQkJQklUXzUKKyNkZWZpbmUJTUJYXzQJCUJJVF80CisjZGVmaW5lCU1CWF8zCQlCSVRfMworI2RlZmluZQlNQlhfMgkJQklUXzIKKyNkZWZpbmUJTUJYXzEJCUJJVF8xCisjZGVmaW5lCU1CWF8wCQlCSVRfMAorCisvKgorICogRmlybXdhcmUgc3RhdGUgY29kZXMgZnJvbSBnZXQgZmlybXdhcmUgc3RhdGUgbWFpbGJveCBjb21tYW5kCisgKi8KKyNkZWZpbmUgRlNUQVRFX0NPTkZJR19XQUlUICAgICAgMAorI2RlZmluZSBGU1RBVEVfV0FJVF9BTF9QQSAgICAgICAxCisjZGVmaW5lIEZTVEFURV9XQUlUX0xPR0lOICAgICAgIDIKKyNkZWZpbmUgRlNUQVRFX1JFQURZICAgICAgICAgICAgMworI2RlZmluZSBGU1RBVEVfTE9TU19PRl9TWU5DICAgICA0CisjZGVmaW5lIEZTVEFURV9FUlJPUiAgICAgICAgICAgIDUKKyNkZWZpbmUgRlNUQVRFX1JFSU5JVCAgICAgICAgICAgNgorI2RlZmluZSBGU1RBVEVfTk9OX1BBUlQgICAgICAgICA3CisKKyNkZWZpbmUgRlNUQVRFX0NPTkZJR19DT1JSRUNUICAgICAgMAorI2RlZmluZSBGU1RBVEVfUDJQX1JDVl9MSVAgICAgICAgICAxCisjZGVmaW5lIEZTVEFURV9QMlBfQ0hPT1NFX0xPT1AgICAgIDIKKyNkZWZpbmUgRlNUQVRFX1AyUF9SQ1ZfVU5JREVOX0xJUCAgMworI2RlZmluZSBGU1RBVEVfRkFUQUxfRVJST1IgICAgICAgICA0CisjZGVmaW5lIEZTVEFURV9MT09QX0JBQ0tfQ09OTiAgICAgIDUKKworLyoKKyAqIFBvcnQgRGF0YWJhc2Ugc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIExpdHRsZSBlbmRpYW4gZXhjZXB0IHdoZXJlIG5vdGVkLgorICovCisjZGVmaW5lCVBPUlRfREFUQUJBU0VfU0laRQkxMjgJLyogYnl0ZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IG9wdGlvbnM7CisJdWludDhfdCBjb250cm9sOworCXVpbnQ4X3QgbWFzdGVyX3N0YXRlOworCXVpbnQ4X3Qgc2xhdmVfc3RhdGU7CisJdWludDhfdCByZXNlcnZlZFsyXTsKKwl1aW50OF90IGhhcmRfYWRkcmVzczsKKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDhfdCBwb3J0X2lkWzRdOworCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgZXhlY3V0aW9uX3Rocm90dGxlOworCXVpbnQxNl90IGV4ZWN1dGlvbl9jb3VudDsKKwl1aW50OF90IHJlc2V0X2NvdW50OworCXVpbnQ4X3QgcmVzZXJ2ZWRfMjsKKwl1aW50MTZfdCByZXNvdXJjZV9hbGxvY2F0aW9uOworCXVpbnQxNl90IGN1cnJlbnRfYWxsb2NhdGlvbjsKKwl1aW50MTZfdCBxdWV1ZV9oZWFkOworCXVpbnQxNl90IHF1ZXVlX3RhaWw7CisJdWludDE2X3QgdHJhbnNtaXRfZXhlY3V0aW9uX2xpc3RfbmV4dDsKKwl1aW50MTZfdCB0cmFuc21pdF9leGVjdXRpb25fbGlzdF9wcmV2aW91czsKKwl1aW50MTZfdCBjb21tb25fZmVhdHVyZXM7CisJdWludDE2X3QgdG90YWxfY29uY3VycmVudF9zZXF1ZW5jZXM7CisJdWludDE2X3QgUk9fYnlfaW5mb3JtYXRpb25fY2F0ZWdvcnk7CisJdWludDhfdCByZWNpcGllbnQ7CisJdWludDhfdCBpbml0aWF0b3I7CisJdWludDE2X3QgcmVjZWl2ZV9kYXRhX3NpemU7CisJdWludDE2X3QgY29uY3VycmVudF9zZXF1ZW5jZXM7CisJdWludDE2X3Qgb3Blbl9zZXF1ZW5jZXNfcGVyX2V4Y2hhbmdlOworCXVpbnQxNl90IGx1bl9hYm9ydF9mbGFnczsKKwl1aW50MTZfdCBsdW5fc3RvcF9mbGFnczsKKwl1aW50MTZfdCBzdG9wX3F1ZXVlX2hlYWQ7CisJdWludDE2X3Qgc3RvcF9xdWV1ZV90YWlsOworCXVpbnQxNl90IHBvcnRfcmV0cnlfdGltZXI7CisJdWludDE2X3QgbmV4dF9zZXF1ZW5jZV9pZDsKKwl1aW50MTZfdCBmcmFtZV9jb3VudDsKKwl1aW50MTZfdCBQUkxJX3BheWxvYWRfbGVuZ3RoOworCXVpbnQ4X3QgcHJsaV9zdmNfcGFyYW1fd29yZF8wWzJdOwkvKiBCaWcgZW5kaWFuICovCisJCQkJCQkvKiBCaXRzIDE1LTAgb2Ygd29yZCAwICovCisJdWludDhfdCBwcmxpX3N2Y19wYXJhbV93b3JkXzNbMl07CS8qIEJpZyBlbmRpYW4gKi8KKwkJCQkJCS8qIEJpdHMgMTUtMCBvZiB3b3JkIDMgKi8KKwl1aW50MTZfdCBsb29wX2lkOworCXVpbnQxNl90IGV4dGVuZGVkX2x1bl9pbmZvX2xpc3RfcG9pbnRlcjsKKwl1aW50MTZfdCBleHRlbmRlZF9sdW5fc3RvcF9saXN0X3BvaW50ZXI7Cit9IHBvcnRfZGF0YWJhc2VfdDsKKworLyoKKyAqIFBvcnQgZGF0YWJhc2Ugc2xhdmUvbWFzdGVyIHN0YXRlcworICovCisjZGVmaW5lIFBEX1NUQVRFX0RJU0NPVkVSWQkJCTAKKyNkZWZpbmUgUERfU1RBVEVfV0FJVF9ESVNDT1ZFUllfQUNLCQkxCisjZGVmaW5lIFBEX1NUQVRFX1BPUlRfTE9HSU4JCQkyCisjZGVmaW5lIFBEX1NUQVRFX1dBSVRfUE9SVF9MT0dJTl9BQ0sJCTMKKyNkZWZpbmUgUERfU1RBVEVfUFJPQ0VTU19MT0dJTgkJCTQKKyNkZWZpbmUgUERfU1RBVEVfV0FJVF9QUk9DRVNTX0xPR0lOX0FDSwkJNQorI2RlZmluZSBQRF9TVEFURV9QT1JUX0xPR0dFRF9JTgkJCTYKKyNkZWZpbmUgUERfU1RBVEVfUE9SVF9VTkFWQUlMQUJMRQkJNworI2RlZmluZSBQRF9TVEFURV9QUk9DRVNTX0xPR09VVAkJCTgKKyNkZWZpbmUgUERfU1RBVEVfV0FJVF9QUk9DRVNTX0xPR09VVF9BQ0sJOQorI2RlZmluZSBQRF9TVEFURV9QT1JUX0xPR09VVAkJCTEwCisjZGVmaW5lIFBEX1NUQVRFX1dBSVRfUE9SVF9MT0dPVVRfQUNLCQkxMQorCisKKy8qCisgKiBJU1AgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBCbG9jay4KKyAqIExpdHRsZSBlbmRpYW4gZXhjZXB0IHdoZXJlIG5vdGVkLgorICovCisjZGVmaW5lCUlDQl9WRVJTSU9OIDEKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90ICB2ZXJzaW9uOworCXVpbnQ4X3QgIHJlc2VydmVkXzE7CisKKwkvKgorCSAqIExTQiBCSVQgMCAgPSBFbmFibGUgSGFyZCBMb29wIElkCisJICogTFNCIEJJVCAxICA9IEVuYWJsZSBGYWlybmVzcworCSAqIExTQiBCSVQgMiAgPSBFbmFibGUgRnVsbC1EdXBsZXgKKwkgKiBMU0IgQklUIDMgID0gRW5hYmxlIEZhc3QgUG9zdGluZworCSAqIExTQiBCSVQgNCAgPSBFbmFibGUgVGFyZ2V0IE1vZGUKKwkgKiBMU0IgQklUIDUgID0gRGlzYWJsZSBJbml0aWF0b3IgTW9kZQorCSAqIExTQiBCSVQgNiAgPSBFbmFibGUgQURJU0MKKwkgKiBMU0IgQklUIDcgID0gRW5hYmxlIFRhcmdldCBJbnF1aXJ5IERhdGEKKwkgKgorCSAqIE1TQiBCSVQgMCAgPSBFbmFibGUgUERCQyBOb3RpZnkKKwkgKiBNU0IgQklUIDEgID0gTm9uIFBhcnRpY2lwYXRpbmcgTElQCisJICogTVNCIEJJVCAyICA9IERlc2NlbmRpbmcgTG9vcCBJRCBTZWFyY2gKKwkgKiBNU0IgQklUIDMgID0gQWNxdWlyZSBMb29wIElEIGluIExJUEEKKwkgKiBNU0IgQklUIDQgID0gU3RvcCBQb3J0USBvbiBGdWxsIFN0YXR1cworCSAqIE1TQiBCSVQgNSAgPSBGdWxsIExvZ2luIGFmdGVyIExJUAorCSAqIE1TQiBCSVQgNiAgPSBOb2RlIE5hbWUgT3B0aW9uCisJICogTVNCIEJJVCA3ICA9IEV4dCBJRldDQiBlbmFibGUgYml0CisJICovCisJdWludDhfdCAgZmlybXdhcmVfb3B0aW9uc1syXTsKKworCXVpbnQxNl90IGZyYW1lX3BheWxvYWRfc2l6ZTsKKwl1aW50MTZfdCBtYXhfaW9jYl9hbGxvY2F0aW9uOworCXVpbnQxNl90IGV4ZWN1dGlvbl90aHJvdHRsZTsKKwl1aW50OF90ICByZXRyeV9jb3VudDsKKwl1aW50OF90CSByZXRyeV9kZWxheTsJCQkvKiB1bnVzZWQgKi8KKwl1aW50OF90CSBwb3J0X25hbWVbV1dOX1NJWkVdOwkJLyogQmlnIGVuZGlhbi4gKi8KKwl1aW50MTZfdCBoYXJkX2FkZHJlc3M7CisJdWludDhfdAkgaW5xdWlyeV9kYXRhOworCXVpbnQ4X3QJIGxvZ2luX3RpbWVvdXQ7CisJdWludDhfdAkgbm9kZV9uYW1lW1dXTl9TSVpFXTsJCS8qIEJpZyBlbmRpYW4uICovCisKKwl1aW50MTZfdCByZXF1ZXN0X3Ffb3V0cG9pbnRlcjsKKwl1aW50MTZfdCByZXNwb25zZV9xX2lucG9pbnRlcjsKKwl1aW50MTZfdCByZXF1ZXN0X3FfbGVuZ3RoOworCXVpbnQxNl90IHJlc3BvbnNlX3FfbGVuZ3RoOworCXVpbnQzMl90IHJlcXVlc3RfcV9hZGRyZXNzWzJdOworCXVpbnQzMl90IHJlc3BvbnNlX3FfYWRkcmVzc1syXTsKKworCXVpbnQxNl90IGx1bl9lbmFibGVzOworCXVpbnQ4X3QgIGNvbW1hbmRfcmVzb3VyY2VfY291bnQ7CisJdWludDhfdCAgaW1tZWRpYXRlX25vdGlmeV9yZXNvdXJjZV9jb3VudDsKKwl1aW50MTZfdCB0aW1lb3V0OworCXVpbnQ4X3QgIHJlc2VydmVkXzJbMl07CisKKwkvKgorCSAqIExTQiBCSVQgMCA9IFRpbWVyIE9wZXJhdGlvbiBtb2RlIGJpdCAwCisJICogTFNCIEJJVCAxID0gVGltZXIgT3BlcmF0aW9uIG1vZGUgYml0IDEKKwkgKiBMU0IgQklUIDIgPSBUaW1lciBPcGVyYXRpb24gbW9kZSBiaXQgMgorCSAqIExTQiBCSVQgMyA9IFRpbWVyIE9wZXJhdGlvbiBtb2RlIGJpdCAzCisJICogTFNCIEJJVCA0ID0gSW5pdCBDb25maWcgTW9kZSBiaXQgMAorCSAqIExTQiBCSVQgNSA9IEluaXQgQ29uZmlnIE1vZGUgYml0IDEKKwkgKiBMU0IgQklUIDYgPSBJbml0IENvbmZpZyBNb2RlIGJpdCAyCisJICogTFNCIEJJVCA3ID0gRW5hYmxlIE5vbiBwYXJ0IG9uIExJSEEgZmFpbHVyZQorCSAqCisJICogTVNCIEJJVCAwID0gRW5hYmxlIGNsYXNzIDIKKwkgKiBNU0IgQklUIDEgPSBFbmFibGUgQUNLMAorCSAqIE1TQiBCSVQgMiA9CisJICogTVNCIEJJVCAzID0KKwkgKiBNU0IgQklUIDQgPSBGQyBUYXBlIEVuYWJsZQorCSAqIE1TQiBCSVQgNSA9IEVuYWJsZSBGQyBDb25maXJtCisJICogTVNCIEJJVCA2ID0gRW5hYmxlIGNvbW1hbmQgcXVldWluZyBpbiB0YXJnZXQgbW9kZQorCSAqIE1TQiBCSVQgNyA9IE5vIExvZ28gT24gTGluayBEb3duCisJICovCisJdWludDhfdAkgYWRkX2Zpcm13YXJlX29wdGlvbnNbMl07CisKKwl1aW50OF90CSByZXNwb25zZV9hY2N1bXVsYXRpb25fdGltZXI7CisJdWludDhfdAkgaW50ZXJydXB0X2RlbGF5X3RpbWVyOworCisJLyoKKwkgKiBMU0IgQklUIDAgPSBFbmFibGUgUmVhZCB4ZnJfcmR5CisJICogTFNCIEJJVCAxID0gU29mdCBJRCBvbmx5CisJICogTFNCIEJJVCAyID0KKwkgKiBMU0IgQklUIDMgPQorCSAqIExTQiBCSVQgNCA9IEZDUCBSU1AgUGF5bG9hZCBbMF0KKwkgKiBMU0IgQklUIDUgPSBGQ1AgUlNQIFBheWxvYWQgWzFdIC8gU2J1cyBlbmFibGUgLSAyMjAwCisJICogTFNCIEJJVCA2ID0gRW5hYmxlIE91dC1vZi1PcmRlciBmcmFtZSBoYW5kbGluZworCSAqIExTQiBCSVQgNyA9IERpc2FibGUgQXV0b21hdGljIFBMT0dJIG9uIExvY2FsIExvb3AKKwkgKgorCSAqIE1TQiBCSVQgMCA9IFNidXMgZW5hYmxlIC0gMjMwMAorCSAqIE1TQiBCSVQgMSA9CisJICogTVNCIEJJVCAyID0KKwkgKiBNU0IgQklUIDMgPQorCSAqIE1TQiBCSVQgNCA9CisJICogTVNCIEJJVCA1ID0gZW5hYmxlIDUwIG9obSB0ZXJtaW5hdGlvbgorCSAqIE1TQiBCSVQgNiA9IERhdGEgUmF0ZSAoMjMwMCBvbmx5KQorCSAqIE1TQiBCSVQgNyA9IERhdGEgUmF0ZSAoMjMwMCBvbmx5KQorCSAqLworCXVpbnQ4X3QJIHNwZWNpYWxfb3B0aW9uc1syXTsKKworCXVpbnQ4X3QgIHJlc2VydmVkXzNbMjZdOworfSBpbml0X2NiX3Q7CisKKy8qCisgKiBHZXQgTGluayBTdGF0dXMgbWFpbGJveCBjb21tYW5kIHJldHVybiBidWZmZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAlsaW5rX2ZhaWxfY250OworCXVpbnQzMl90CWxvc3Nfc3luY19jbnQ7CisJdWludDMyX3QJbG9zc19zaWdfY250OworCXVpbnQzMl90CXByaW1fc2VxX2Vycl9jbnQ7CisJdWludDMyX3QJaW52YWxfeG1pdF93b3JkX2NudDsKKwl1aW50MzJfdAlpbnZhbF9jcmNfY250OworfSBsaW5rX3N0YXRfdDsKKworLyoKKyAqIE5WUkFNIENvbW1hbmQgdmFsdWVzLgorICovCisjZGVmaW5lIE5WX1NUQVJUX0JJVCAgICAgICAgICAgIEJJVF8yCisjZGVmaW5lIE5WX1dSSVRFX09QICAgICAgICAgICAgIChCSVRfMjYrQklUXzI0KQorI2RlZmluZSBOVl9SRUFEX09QICAgICAgICAgICAgICAoQklUXzI2K0JJVF8yNSkKKyNkZWZpbmUgTlZfRVJBU0VfT1AgICAgICAgICAgICAgKEJJVF8yNitCSVRfMjUrQklUXzI0KQorI2RlZmluZSBOVl9NQVNLX09QICAgICAgICAgICAgICAoQklUXzI2K0JJVF8yNStCSVRfMjQpCisjZGVmaW5lIE5WX0RFTEFZX0NPVU5UICAgICAgICAgIDEwCisKKy8qCisgKiBRTG9naWMgSVNQMjEwMCwgSVNQMjIwMCBhbmQgSVNQMjMwMCBOVlJBTSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qCisJICogTlZSQU0gaGVhZGVyCisJICovCisJdWludDhfdAlpZFs0XTsKKwl1aW50OF90CW52cmFtX3ZlcnNpb247CisJdWludDhfdAlyZXNlcnZlZF8wOworCisJLyoKKwkgKiBOVlJBTSBSSVNDIHBhcmFtZXRlciBibG9jaworCSAqLworCXVpbnQ4X3QJcGFyYW1ldGVyX2Jsb2NrX3ZlcnNpb247CisJdWludDhfdAlyZXNlcnZlZF8xOworCisJLyoKKwkgKiBMU0IgQklUIDAgID0gRW5hYmxlIEhhcmQgTG9vcCBJZAorCSAqIExTQiBCSVQgMSAgPSBFbmFibGUgRmFpcm5lc3MKKwkgKiBMU0IgQklUIDIgID0gRW5hYmxlIEZ1bGwtRHVwbGV4CisJICogTFNCIEJJVCAzICA9IEVuYWJsZSBGYXN0IFBvc3RpbmcKKwkgKiBMU0IgQklUIDQgID0gRW5hYmxlIFRhcmdldCBNb2RlCisJICogTFNCIEJJVCA1ICA9IERpc2FibGUgSW5pdGlhdG9yIE1vZGUKKwkgKiBMU0IgQklUIDYgID0gRW5hYmxlIEFESVNDCisJICogTFNCIEJJVCA3ICA9IEVuYWJsZSBUYXJnZXQgSW5xdWlyeSBEYXRhCisJICoKKwkgKiBNU0IgQklUIDAgID0gRW5hYmxlIFBEQkMgTm90aWZ5CisJICogTVNCIEJJVCAxICA9IE5vbiBQYXJ0aWNpcGF0aW5nIExJUAorCSAqIE1TQiBCSVQgMiAgPSBEZXNjZW5kaW5nIExvb3AgSUQgU2VhcmNoCisJICogTVNCIEJJVCAzICA9IEFjcXVpcmUgTG9vcCBJRCBpbiBMSVBBCisJICogTVNCIEJJVCA0ICA9IFN0b3AgUG9ydFEgb24gRnVsbCBTdGF0dXMKKwkgKiBNU0IgQklUIDUgID0gRnVsbCBMb2dpbiBhZnRlciBMSVAKKwkgKiBNU0IgQklUIDYgID0gTm9kZSBOYW1lIE9wdGlvbgorCSAqIE1TQiBCSVQgNyAgPSBFeHQgSUZXQ0IgZW5hYmxlIGJpdAorCSAqLworCXVpbnQ4X3QJIGZpcm13YXJlX29wdGlvbnNbMl07CisKKwl1aW50MTZfdCBmcmFtZV9wYXlsb2FkX3NpemU7CisJdWludDE2X3QgbWF4X2lvY2JfYWxsb2NhdGlvbjsKKwl1aW50MTZfdCBleGVjdXRpb25fdGhyb3R0bGU7CisJdWludDhfdAkgcmV0cnlfY291bnQ7CisJdWludDhfdAkgcmV0cnlfZGVsYXk7CQkJLyogdW51c2VkICovCisJdWludDhfdAkgcG9ydF9uYW1lW1dXTl9TSVpFXTsJCS8qIEJpZyBlbmRpYW4uICovCisJdWludDE2X3QgaGFyZF9hZGRyZXNzOworCXVpbnQ4X3QJIGlucXVpcnlfZGF0YTsKKwl1aW50OF90CSBsb2dpbl90aW1lb3V0OworCXVpbnQ4X3QJIG5vZGVfbmFtZVtXV05fU0laRV07CQkvKiBCaWcgZW5kaWFuLiAqLworCisJLyoKKwkgKiBMU0IgQklUIDAgPSBUaW1lciBPcGVyYXRpb24gbW9kZSBiaXQgMAorCSAqIExTQiBCSVQgMSA9IFRpbWVyIE9wZXJhdGlvbiBtb2RlIGJpdCAxCisJICogTFNCIEJJVCAyID0gVGltZXIgT3BlcmF0aW9uIG1vZGUgYml0IDIKKwkgKiBMU0IgQklUIDMgPSBUaW1lciBPcGVyYXRpb24gbW9kZSBiaXQgMworCSAqIExTQiBCSVQgNCA9IEluaXQgQ29uZmlnIE1vZGUgYml0IDAKKwkgKiBMU0IgQklUIDUgPSBJbml0IENvbmZpZyBNb2RlIGJpdCAxCisJICogTFNCIEJJVCA2ID0gSW5pdCBDb25maWcgTW9kZSBiaXQgMgorCSAqIExTQiBCSVQgNyA9IEVuYWJsZSBOb24gcGFydCBvbiBMSUhBIGZhaWx1cmUKKwkgKgorCSAqIE1TQiBCSVQgMCA9IEVuYWJsZSBjbGFzcyAyCisJICogTVNCIEJJVCAxID0gRW5hYmxlIEFDSzAKKwkgKiBNU0IgQklUIDIgPQorCSAqIE1TQiBCSVQgMyA9CisJICogTVNCIEJJVCA0ID0gRkMgVGFwZSBFbmFibGUKKwkgKiBNU0IgQklUIDUgPSBFbmFibGUgRkMgQ29uZmlybQorCSAqIE1TQiBCSVQgNiA9IEVuYWJsZSBjb21tYW5kIHF1ZXVpbmcgaW4gdGFyZ2V0IG1vZGUKKwkgKiBNU0IgQklUIDcgPSBObyBMb2dvIE9uIExpbmsgRG93bgorCSAqLworCXVpbnQ4X3QJIGFkZF9maXJtd2FyZV9vcHRpb25zWzJdOworCisJdWludDhfdAkgcmVzcG9uc2VfYWNjdW11bGF0aW9uX3RpbWVyOworCXVpbnQ4X3QJIGludGVycnVwdF9kZWxheV90aW1lcjsKKworCS8qCisJICogTFNCIEJJVCAwID0gRW5hYmxlIFJlYWQgeGZyX3JkeQorCSAqIExTQiBCSVQgMSA9IFNvZnQgSUQgb25seQorCSAqIExTQiBCSVQgMiA9CisJICogTFNCIEJJVCAzID0KKwkgKiBMU0IgQklUIDQgPSBGQ1AgUlNQIFBheWxvYWQgWzBdCisJICogTFNCIEJJVCA1ID0gRkNQIFJTUCBQYXlsb2FkIFsxXSAvIFNidXMgZW5hYmxlIC0gMjIwMAorCSAqIExTQiBCSVQgNiA9IEVuYWJsZSBPdXQtb2YtT3JkZXIgZnJhbWUgaGFuZGxpbmcKKwkgKiBMU0IgQklUIDcgPSBEaXNhYmxlIEF1dG9tYXRpYyBQTE9HSSBvbiBMb2NhbCBMb29wCisJICoKKwkgKiBNU0IgQklUIDAgPSBTYnVzIGVuYWJsZSAtIDIzMDAKKwkgKiBNU0IgQklUIDEgPQorCSAqIE1TQiBCSVQgMiA9CisJICogTVNCIEJJVCAzID0KKwkgKiBNU0IgQklUIDQgPQorCSAqIE1TQiBCSVQgNSA9IGVuYWJsZSA1MCBvaG0gdGVybWluYXRpb24KKwkgKiBNU0IgQklUIDYgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKKwkgKiBNU0IgQklUIDcgPSBEYXRhIFJhdGUgKDIzMDAgb25seSkKKwkgKi8KKwl1aW50OF90CSBzcGVjaWFsX29wdGlvbnNbMl07CisKKwkvKiBSZXNlcnZlZCBmb3IgZXhwYW5kZWQgUklTQyBwYXJhbWV0ZXIgYmxvY2sgKi8KKwl1aW50OF90IHJlc2VydmVkXzJbMjJdOworCisJLyoKKwkgKiBMU0IgQklUIDAgPSBUeCBTZW5zaXRpdml0eSAxRyBiaXQgMAorCSAqIExTQiBCSVQgMSA9IFR4IFNlbnNpdGl2aXR5IDFHIGJpdCAxCisJICogTFNCIEJJVCAyID0gVHggU2Vuc2l0aXZpdHkgMUcgYml0IDIKKwkgKiBMU0IgQklUIDMgPSBUeCBTZW5zaXRpdml0eSAxRyBiaXQgMworCSAqIExTQiBCSVQgNCA9IFJ4IFNlbnNpdGl2aXR5IDFHIGJpdCAwCisJICogTFNCIEJJVCA1ID0gUnggU2Vuc2l0aXZpdHkgMUcgYml0IDEKKwkgKiBMU0IgQklUIDYgPSBSeCBTZW5zaXRpdml0eSAxRyBiaXQgMgorCSAqIExTQiBCSVQgNyA9IFJ4IFNlbnNpdGl2aXR5IDFHIGJpdCAzCisJICogICAgICAgICAgICAKKwkgKiBNU0IgQklUIDAgPSBUeCBTZW5zaXRpdml0eSAyRyBiaXQgMAorCSAqIE1TQiBCSVQgMSA9IFR4IFNlbnNpdGl2aXR5IDJHIGJpdCAxCisJICogTVNCIEJJVCAyID0gVHggU2Vuc2l0aXZpdHkgMkcgYml0IDIKKwkgKiBNU0IgQklUIDMgPSBUeCBTZW5zaXRpdml0eSAyRyBiaXQgMworCSAqIE1TQiBCSVQgNCA9IFJ4IFNlbnNpdGl2aXR5IDJHIGJpdCAwCisJICogTVNCIEJJVCA1ID0gUnggU2Vuc2l0aXZpdHkgMkcgYml0IDEKKwkgKiBNU0IgQklUIDYgPSBSeCBTZW5zaXRpdml0eSAyRyBiaXQgMgorCSAqIE1TQiBCSVQgNyA9IFJ4IFNlbnNpdGl2aXR5IDJHIGJpdCAzCisJICoKKwkgKiBMU0IgQklUIDAgPSBPdXRwdXQgU3dpbmcgMUcgYml0IDAKKwkgKiBMU0IgQklUIDEgPSBPdXRwdXQgU3dpbmcgMUcgYml0IDEKKwkgKiBMU0IgQklUIDIgPSBPdXRwdXQgU3dpbmcgMUcgYml0IDIKKwkgKiBMU0IgQklUIDMgPSBPdXRwdXQgRW1waGFzaXMgMUcgYml0IDAKKwkgKiBMU0IgQklUIDQgPSBPdXRwdXQgRW1waGFzaXMgMUcgYml0IDEKKwkgKiBMU0IgQklUIDUgPSBPdXRwdXQgU3dpbmcgMkcgYml0IDAKKwkgKiBMU0IgQklUIDYgPSBPdXRwdXQgU3dpbmcgMkcgYml0IDEKKwkgKiBMU0IgQklUIDcgPSBPdXRwdXQgU3dpbmcgMkcgYml0IDIKKwkgKiAgICAgICAgICAgIAorCSAqIE1TQiBCSVQgMCA9IE91dHB1dCBFbXBoYXNpcyAyRyBiaXQgMAorCSAqIE1TQiBCSVQgMSA9IE91dHB1dCBFbXBoYXNpcyAyRyBiaXQgMQorCSAqIE1TQiBCSVQgMiA9IE91dHB1dCBFbmFibGUKKwkgKiBNU0IgQklUIDMgPQorCSAqIE1TQiBCSVQgNCA9CisJICogTVNCIEJJVCA1ID0KKwkgKiBNU0IgQklUIDYgPQorCSAqIE1TQiBCSVQgNyA9CisJICovCisJdWludDhfdCBzZXJpYWxsaW5rX29wdGlvbnNbNF07CisKKwkvKgorCSAqIE5WUkFNIGhvc3QgcGFyYW1ldGVyIGJsb2NrCisJICoKKwkgKiBMU0IgQklUIDAgPSBFbmFibGUgc3BpbnVwIGRlbGF5CisJICogTFNCIEJJVCAxID0gRGlzYWJsZSBCSU9TCisJICogTFNCIEJJVCAyID0gRW5hYmxlIE1lbW9yeSBNYXAgQklPUworCSAqIExTQiBCSVQgMyA9IEVuYWJsZSBTZWxlY3RhYmxlIEJvb3QKKwkgKiBMU0IgQklUIDQgPSBEaXNhYmxlIFJJU0MgY29kZSBsb2FkCisJICogTFNCIEJJVCA1ID0gU2V0IGNhY2hlIGxpbmUgc2l6ZSAxCisJICogTFNCIEJJVCA2ID0gUENJIFBhcml0eSBEaXNhYmxlCisJICogTFNCIEJJVCA3ID0gRW5hYmxlIGV4dGVuZGVkIGxvZ2dpbmcKKwkgKgorCSAqIE1TQiBCSVQgMCA9IEVuYWJsZSA2NGJpdCBhZGRyZXNzaW5nCisJICogTVNCIEJJVCAxID0gRW5hYmxlIGxpcCByZXNldAorCSAqIE1TQiBCSVQgMiA9IEVuYWJsZSBsaXAgZnVsbCBsb2dpbgorCSAqIE1TQiBCSVQgMyA9IEVuYWJsZSB0YXJnZXQgcmVzZXQKKwkgKiBNU0IgQklUIDQgPSBFbmFibGUgZGF0YWJhc2Ugc3RvcmFnZQorCSAqIE1TQiBCSVQgNSA9IEVuYWJsZSBjYWNoZSBmbHVzaCByZWFkCisJICogTVNCIEJJVCA2ID0gRW5hYmxlIGRhdGFiYXNlIGxvYWQKKwkgKiBNU0IgQklUIDcgPSBFbmFibGUgYWx0ZXJuYXRlIFdXTgorCSAqLworCXVpbnQ4X3QgaG9zdF9wWzJdOworCisJdWludDhfdCBib290X25vZGVfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBib290X2x1bl9udW1iZXI7CisJdWludDhfdCByZXNldF9kZWxheTsKKwl1aW50OF90IHBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwl1aW50OF90IGJvb3RfaWRfbnVtYmVyOworCXVpbnQxNl90IG1heF9sdW5zX3Blcl90YXJnZXQ7CisJdWludDhfdCBmY29kZV9ib290X3BvcnRfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBhbHRlcm5hdGVfcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IGFsdGVybmF0ZV9ub2RlX25hbWVbV1dOX1NJWkVdOworCisJLyoKKwkgKiBCSVQgMCA9IFNlbGVjdGl2ZSBMb2dpbgorCSAqIEJJVCAxID0gQWx0LUJvb3QgRW5hYmxlCisJICogQklUIDIgPQorCSAqIEJJVCAzID0gQm9vdCBPcmRlciBMaXN0CisJICogQklUIDQgPQorCSAqIEJJVCA1ID0gU2VsZWN0aXZlIExVTgorCSAqIEJJVCA2ID0KKwkgKiBCSVQgNyA9IHVudXNlZAorCSAqLworCXVpbnQ4X3QgZWZpX3BhcmFtZXRlcnM7CisKKwl1aW50OF90IGxpbmtfZG93bl90aW1lb3V0OworCisJdWludDhfdCBhZGFwdGVyX2lkXzBbNF07CisJdWludDhfdCBhZGFwdGVyX2lkXzFbNF07CisJdWludDhfdCBhZGFwdGVyX2lkXzJbNF07CisJdWludDhfdCBhZGFwdGVyX2lkXzNbNF07CisKKwl1aW50OF90IGFsdDFfYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDFfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQ4X3QgYWx0Ml9ib290X25vZGVfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYWx0Ml9ib290X2x1bl9udW1iZXI7CisJdWludDhfdCBhbHQzX2Jvb3Rfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQzX2Jvb3RfbHVuX251bWJlcjsKKwl1aW50OF90IGFsdDRfYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDRfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQ4X3QgYWx0NV9ib290X25vZGVfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYWx0NV9ib290X2x1bl9udW1iZXI7CisJdWludDhfdCBhbHQ2X2Jvb3Rfbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQ2X2Jvb3RfbHVuX251bWJlcjsKKwl1aW50OF90IGFsdDdfYm9vdF9ub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDdfYm9vdF9sdW5fbnVtYmVyOworCisJdWludDhfdCByZXNlcnZlZF8zWzJdOworCisJLyogT2Zmc2V0IDIwMC0yMTUgOiBNb2RlbCBOdW1iZXIgKi8KKwl1aW50OF90IG1vZGVsX251bWJlclsxNl07CisKKwkvKiBPRU0gcmVsYXRlZCBpdGVtcyAqLworCXVpbnQ4X3Qgb2VtX3NwZWNpZmljWzE2XTsKKworCS8qCisJICogTlZSQU0gQWRhcHRlciBGZWF0dXJlcyBvZmZzZXQgMjMyLTIzOQorCSAqCisJICogTFNCIEJJVCAwID0gRXh0ZXJuYWwgR0JJQworCSAqIExTQiBCSVQgMSA9IFJpc2MgUkFNIHBhcml0eQorCSAqIExTQiBCSVQgMiA9IEJ1ZmZlciBQbHVzIE1vZHVsZQorCSAqIExTQiBCSVQgMyA9IE11bHRpIENoaXAgQWRhcHRlcgorCSAqIExTQiBCSVQgNCA9IEludGVybmFsIGNvbm5lY3RvcgorCSAqIExTQiBCSVQgNSA9CisJICogTFNCIEJJVCA2ID0KKwkgKiBMU0IgQklUIDcgPQorCSAqCisJICogTVNCIEJJVCAwID0KKwkgKiBNU0IgQklUIDEgPQorCSAqIE1TQiBCSVQgMiA9CisJICogTVNCIEJJVCAzID0KKwkgKiBNU0IgQklUIDQgPQorCSAqIE1TQiBCSVQgNSA9CisJICogTVNCIEJJVCA2ID0KKwkgKiBNU0IgQklUIDcgPQorCSAqLworCXVpbnQ4X3QJYWRhcHRlcl9mZWF0dXJlc1syXTsKKworCXVpbnQ4X3QgcmVzZXJ2ZWRfNFsxNl07CisKKwkvKiBTdWJzeXN0ZW0gdmVuZG9yIElEIGZvciBJU1AyMjAwICovCisJdWludDE2X3Qgc3Vic3lzdGVtX3ZlbmRvcl9pZF8yMjAwOworCisJLyogU3Vic3lzdGVtIGRldmljZSBJRCBmb3IgSVNQMjIwMCAqLworCXVpbnQxNl90IHN1YnN5c3RlbV9kZXZpY2VfaWRfMjIwMDsKKworCXVpbnQ4X3QJIHJlc2VydmVkXzU7CisJdWludDhfdAkgY2hlY2tzdW07Cit9IG52cmFtX3Q7CisKKy8qCisgKiBJU1AgcXVldWUgLSByZXNwb25zZSBxdWV1ZSBlbnRyeSBkZWZpbml0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdAkJZGF0YVs2MF07CisJdWludDMyX3QJc2lnbmF0dXJlOworI2RlZmluZSBSRVNQT05TRV9QUk9DRVNTRUQJMHhERUFEREVBRAkvKiBTaWduYXR1cmUgKi8KK30gcmVzcG9uc2VfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJdWludDE2X3QgZXh0ZW5kZWQ7CisJc3RydWN0IHsKKwkJdWludDhfdCByZXNlcnZlZDsKKwkJdWludDhfdCBzdGFuZGFyZDsKKwl9IGlkOworfSB0YXJnZXRfaWRfdDsKKworI2RlZmluZSBTRVRfVEFSR0VUX0lEKGhhLCB0bywgZnJvbSkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAoSEFTX0VYVEVOREVEX0lEUyhoYSkpCQkJXAorCQl0by5leHRlbmRlZCA9IGNwdV90b19sZTE2KGZyb20pOwlcCisJZWxzZQkJCQkJCVwKKwkJdG8uaWQuc3RhbmRhcmQgPSAodWludDhfdClmcm9tOwkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIElTUCBxdWV1ZSAtIGNvbW1hbmQgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUgQ09NTUFORF9UWVBFCTB4MTEJCS8qIENvbW1hbmQgZW50cnkgKi8KKyNkZWZpbmUgTUFYX0NNRFNaCTE2CQkvKiBTQ1NJIG1heGltdW0gQ0RCIHNpemUuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl0YXJnZXRfaWRfdCB0YXJnZXQ7CQkvKiBTQ1NJIElEICovCisJdWludDE2X3QgbHVuOwkJCS8qIFNDU0kgTFVOICovCisJdWludDE2X3QgY29udHJvbF9mbGFnczsJCS8qIENvbnRyb2wgZmxhZ3MuICovCisjZGVmaW5lIENGX1dSSVRFCUJJVF82CisjZGVmaW5lIENGX1JFQUQJCUJJVF81CisjZGVmaW5lIENGX1NJTVBMRV9UQUcJQklUXzMKKyNkZWZpbmUgQ0ZfT1JERVJFRF9UQUcJQklUXzIKKyNkZWZpbmUgQ0ZfSEVBRF9UQUcJQklUXzEKKwl1aW50MTZfdCByZXNlcnZlZF8xOworCXVpbnQxNl90IHRpbWVvdXQ7CQkvKiBDb21tYW5kIHRpbWVvdXQuICovCisJdWludDE2X3QgZHNlZ19jb3VudDsJCS8qIERhdGEgc2VnbWVudCBjb3VudC4gKi8KKwl1aW50OF90IHNjc2lfY2RiW01BWF9DTURTWl07IAkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCisJdWludDMyX3QgYnl0ZV9jb3VudDsJCS8qIFRvdGFsIGJ5dGUgY291bnQuICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMl9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCit9IGNtZF9lbnRyeV90OworCisvKgorICogSVNQIHF1ZXVlIC0gNjQtQml0IGFkZHJlc3NpbmcsIGNvbW1hbmQgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUgQ09NTUFORF9BNjRfVFlQRQkweDE5CS8qIENvbW1hbmQgQTY0IGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBzeXNfZGVmaW5lOwkJLyogU3lzdGVtIGRlZmluZWQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgaGFuZGxlOwkJLyogU3lzdGVtIGhhbmRsZS4gKi8KKwl0YXJnZXRfaWRfdCB0YXJnZXQ7CQkvKiBTQ1NJIElEICovCisJdWludDE2X3QgbHVuOwkJCS8qIFNDU0kgTFVOICovCisJdWludDE2X3QgY29udHJvbF9mbGFnczsJCS8qIENvbnRyb2wgZmxhZ3MuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfMTsKKwl1aW50MTZfdCB0aW1lb3V0OwkJLyogQ29tbWFuZCB0aW1lb3V0LiAqLworCXVpbnQxNl90IGRzZWdfY291bnQ7CQkvKiBEYXRhIHNlZ21lbnQgY291bnQuICovCisJdWludDhfdCBzY3NpX2NkYltNQVhfQ01EU1pdOwkvKiBTQ1NJIGNvbW1hbmQgd29yZHMuICovCisJdWludDMyX3QgYnl0ZV9jb3VudDsJCS8qIFRvdGFsIGJ5dGUgY291bnQuICovCisJdWludDMyX3QgZHNlZ18wX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18wX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAwIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzFfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzFfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDEgbGVuZ3RoLiAqLworfSBjbWRfYTY0X2VudHJ5X3QsIHJlcXVlc3RfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtIGNvbnRpbnVhdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZSBDT05USU5VRV9UWVBFCQkweDAyCS8qIENvbnRpbnVhdGlvbiBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCByZXNlcnZlZDsKKwl1aW50MzJfdCBkc2VnXzBfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18yX2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCAyIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18yX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAyIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzNfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDMgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzNfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDMgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfNF9hZGRyZXNzOwkvKiBEYXRhIHNlZ21lbnQgNCBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfNF9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgNCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ181X2FkZHJlc3M7CS8qIERhdGEgc2VnbWVudCA1IGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ181X2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCA1IGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzZfYWRkcmVzczsJLyogRGF0YSBzZWdtZW50IDYgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzZfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDYgbGVuZ3RoLiAqLworfSBjb250X2VudHJ5X3Q7CisKKy8qCisgKiBJU1AgcXVldWUgLSA2NC1CaXQgYWRkcmVzc2luZywgY29udGludWF0aW9uIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIENPTlRJTlVFX0E2NF9UWVBFCTB4MEEJLyogQ29udGludWF0aW9uIEE2NCBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDAgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzBfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDAgbGVuZ3RoLiAqLworCXVpbnQzMl90IGRzZWdfMV9hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgMSBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMV9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMSBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18yX2FkZHJlc3MJWzJdOwkvKiBEYXRhIHNlZ21lbnQgMiBhZGRyZXNzLiAqLworCXVpbnQzMl90IGRzZWdfMl9sZW5ndGg7CQkvKiBEYXRhIHNlZ21lbnQgMiBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ18zX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAzIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ18zX2xlbmd0aDsJCS8qIERhdGEgc2VnbWVudCAzIGxlbmd0aC4gKi8KKwl1aW50MzJfdCBkc2VnXzRfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDQgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnXzRfbGVuZ3RoOwkJLyogRGF0YSBzZWdtZW50IDQgbGVuZ3RoLiAqLworfSBjb250X2E2NF9lbnRyeV90OworCisvKgorICogSVNQIHF1ZXVlIC0gc3RhdHVzIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lCVNUQVRVU19UWVBFCTB4MDMJCS8qIFN0YXR1cyBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCBoYW5kbGU7CQkvKiBTeXN0ZW0gaGFuZGxlLiAqLworCXVpbnQxNl90IHNjc2lfc3RhdHVzOwkJLyogU0NTSSBzdGF0dXMuICovCisJdWludDE2X3QgY29tcF9zdGF0dXM7CQkvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KKwl1aW50MTZfdCBzdGF0ZV9mbGFnczsJCS8qIFN0YXRlIGZsYWdzLiAqLworCXVpbnQxNl90IHN0YXR1c19mbGFnczsJCS8qIFN0YXR1cyBmbGFncy4gKi8KKwl1aW50MTZfdCByc3BfaW5mb19sZW47CQkvKiBSZXNwb25zZSBJbmZvIExlbmd0aC4gKi8KKwl1aW50MTZfdCByZXFfc2Vuc2VfbGVuZ3RoOwkvKiBSZXF1ZXN0IHNlbnNlIGRhdGEgbGVuZ3RoLiAqLworCXVpbnQzMl90IHJlc2lkdWFsX2xlbmd0aDsJLyogUmVzaWR1YWwgdHJhbnNmZXIgbGVuZ3RoLiAqLworCXVpbnQ4X3QgcnNwX2luZm9bOF07CQkvKiBGQ1AgcmVzcG9uc2UgaW5mb3JtYXRpb24uICovCisJdWludDhfdCByZXFfc2Vuc2VfZGF0YVszMl07CS8qIFJlcXVlc3Qgc2Vuc2UgZGF0YS4gKi8KK30gc3RzX2VudHJ5X3Q7CisKKy8qCisgKiBTdGF0dXMgZW50cnkgZW50cnkgc3RhdHVzCisgKi8KKyNkZWZpbmUgUkZfSU5WX0VfT1JERVIJQklUXzUJCS8qIEludmFsaWQgZW50cnkgb3JkZXIuICovCisjZGVmaW5lIFJGX0lOVl9FX0NPVU5UCUJJVF80CQkvKiBJbnZhbGlkIGVudHJ5IGNvdW50LiAqLworI2RlZmluZSBSRl9JTlZfRV9QQVJBTQlCSVRfMwkJLyogSW52YWxpZCBlbnRyeSBwYXJhbWV0ZXIuICovCisjZGVmaW5lIFJGX0lOVl9FX1RZUEUJQklUXzIJCS8qIEludmFsaWQgZW50cnkgdHlwZS4gKi8KKyNkZWZpbmUgUkZfQlVTWQkJQklUXzEJCS8qIEJ1c3kgKi8KKworLyoKKyAqIFN0YXR1cyBlbnRyeSBTQ1NJIHN0YXR1cyBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgU1NfTUFTSwkJCQkweGZmZgkvKiBSZXNlcnZlZCBiaXRzIEJJVF8xMi1CSVRfMTUqLworI2RlZmluZSBTU19SRVNJRFVBTF9VTkRFUgkJQklUXzExCisjZGVmaW5lIFNTX1JFU0lEVUFMX09WRVIJCUJJVF8xMAorI2RlZmluZSBTU19TRU5TRV9MRU5fVkFMSUQJCUJJVF85CisjZGVmaW5lIFNTX1JFU1BPTlNFX0lORk9fTEVOX1ZBTElECUJJVF84CisKKyNkZWZpbmUgU1NfUkVTRVJWRV9DT05GTElDVAkJKEJJVF80IHwgQklUXzMpCisjZGVmaW5lIFNTX0JVU1lfQ09ORElUSU9OCQlCSVRfMworI2RlZmluZSBTU19DT05ESVRJT05fTUVUCQlCSVRfMgorI2RlZmluZSBTU19DSEVDS19DT05ESVRJT04JCUJJVF8xCisKKy8qCisgKiBTdGF0dXMgZW50cnkgY29tcGxldGlvbiBzdGF0dXMKKyAqLworI2RlZmluZSBDU19DT01QTEVURQkJMHgwCS8qIE5vIGVycm9ycyAqLworI2RlZmluZSBDU19JTkNPTVBMRVRFCQkweDEJLyogSW5jb21wbGV0ZSB0cmFuc2ZlciBvZiBjbWQuICovCisjZGVmaW5lIENTX0RNQQkJCTB4MgkvKiBBIERNQSBkaXJlY3Rpb24gZXJyb3IuICovCisjZGVmaW5lIENTX1RSQU5TUE9SVAkJMHgzCS8qIFRyYW5zcG9ydCBlcnJvci4gKi8KKyNkZWZpbmUgQ1NfUkVTRVQJCTB4NAkvKiBTQ1NJIGJ1cyByZXNldCBvY2N1cnJlZCAqLworI2RlZmluZSBDU19BQk9SVEVECQkweDUJLyogU3lzdGVtIGFib3J0ZWQgY29tbWFuZC4gKi8KKyNkZWZpbmUgQ1NfVElNRU9VVAkJMHg2CS8qIFRpbWVvdXQgZXJyb3IuICovCisjZGVmaW5lIENTX0RBVEFfT1ZFUlJVTgkJMHg3CS8qIERhdGEgb3ZlcnJ1bi4gKi8KKworI2RlZmluZSBDU19EQVRBX1VOREVSUlVOCTB4MTUJLyogRGF0YSBVbmRlcnJ1bi4gKi8KKyNkZWZpbmUgQ1NfUVVFVUVfRlVMTAkJMHgxQwkvKiBRdWV1ZSBGdWxsLiAqLworI2RlZmluZSBDU19QT1JUX1VOQVZBSUxBQkxFCTB4MjgJLyogUG9ydCB1bmF2YWlsYWJsZSAqLworCQkJCQkvKiAoc2VsZWN0aW9uIHRpbWVvdXQpICovCisjZGVmaW5lIENTX1BPUlRfTE9HR0VEX09VVAkweDI5CS8qIFBvcnQgTG9nZ2VkIE91dCAqLworI2RlZmluZSBDU19QT1JUX0NPTkZJR19DSEcJMHgyQQkvKiBQb3J0IENvbmZpZ3VyYXRpb24gQ2hhbmdlZCAqLworI2RlZmluZSBDU19QT1JUX0JVU1kJCTB4MkIJLyogUG9ydCBCdXN5ICovCisjZGVmaW5lIENTX0NPTVBMRVRFX0NIS0NPTkQJMHgzMAkvKiBFcnJvcj8gKi8KKyNkZWZpbmUgQ1NfQkFEX1BBWUxPQUQJCTB4ODAJLyogRHJpdmVyIGRlZmluZWQgKi8KKyNkZWZpbmUgQ1NfVU5LTk9XTgkJMHg4MQkvKiBEcml2ZXIgZGVmaW5lZCAqLworI2RlZmluZSBDU19SRVRSWQkJMHg4MgkvKiBEcml2ZXIgZGVmaW5lZCAqLworI2RlZmluZSBDU19MT09QX0RPV05fQUJPUlQJMHg4MwkvKiBEcml2ZXIgZGVmaW5lZCAqLworCisvKgorICogU3RhdHVzIGVudHJ5IHN0YXR1cyBmbGFncworICovCisjZGVmaW5lIFNGX0FCVFNfVEVSTUlOQVRFRAlCSVRfMTAKKyNkZWZpbmUgU0ZfTE9HT1VUX1NFTlQJCUJJVF8xMworCisvKgorICogSVNQIHF1ZXVlIC0gc3RhdHVzIGNvbnRpbnVhdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZQlTVEFUVVNfQ09OVF9UWVBFCTB4MTAJLyogU3RhdHVzIGNvbnRpbnVhdGlvbiBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IHN5c19kZWZpbmU7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50OF90IGRhdGFbNjBdOwkJLyogZGF0YSAqLworfSBzdHNfY29udF9lbnRyeV90OworCisvKgorICogSVNQIHF1ZXVlIC0JUklPIFR5cGUgMSBzdGF0dXMgZW50cnkgKDMyIGJpdCBJL08gZW50cnkgaGFuZGxlcykKKyAqCQlzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZQlTVEFUVVNfVFlQRV8yMSAweDIxCQkvKiBTdGF0dXMgZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBoYW5kbGVfY291bnQ7CQkvKiBIYW5kbGUgY291bnQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgaGFuZGxlWzE1XTsJCS8qIFN5c3RlbSBoYW5kbGVzLiAqLworfSBzdHMyMV9lbnRyeV90OworCisvKgorICogSVNQIHF1ZXVlIC0JUklPIFR5cGUgMiBzdGF0dXMgZW50cnkgKDE2IGJpdCBJL08gZW50cnkgaGFuZGxlcykKKyAqCQlzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2RlZmluZQlTVEFUVVNfVFlQRV8yMgkweDIyCQkvKiBTdGF0dXMgZW50cnkuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBoYW5kbGVfY291bnQ7CQkvKiBIYW5kbGUgY291bnQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDE2X3QgaGFuZGxlWzMwXTsJCS8qIFN5c3RlbSBoYW5kbGVzLiAqLworfSBzdHMyMl9lbnRyeV90OworCisvKgorICogSVNQIHF1ZXVlIC0gbWFya2VyIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIE1BUktFUl9UWVBFCTB4MDQJCS8qIE1hcmtlciBlbnRyeS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CQkvKiBFbnRyeSB0eXBlLiAqLworCXVpbnQ4X3QgZW50cnlfY291bnQ7CQkvKiBFbnRyeSBjb3VudC4gKi8KKwl1aW50OF90IGhhbmRsZV9jb3VudDsJCS8qIEhhbmRsZSBjb3VudC4gKi8KKwl1aW50OF90IGVudHJ5X3N0YXR1czsJCS8qIEVudHJ5IFN0YXR1cy4gKi8KKwl1aW50MzJfdCBzeXNfZGVmaW5lXzI7CQkvKiBTeXN0ZW0gZGVmaW5lZC4gKi8KKwl0YXJnZXRfaWRfdCB0YXJnZXQ7CQkvKiBTQ1NJIElEICovCisJdWludDhfdCBtb2RpZmllcjsJCS8qIE1vZGlmaWVyICg3LTApLiAqLworI2RlZmluZSBNS19TWU5DX0lEX0xVTgkwCQkvKiBTeW5jaHJvbml6ZSBJRC9MVU4gKi8KKyNkZWZpbmUgTUtfU1lOQ19JRAkxCQkvKiBTeW5jaHJvbml6ZSBJRCAqLworI2RlZmluZSBNS19TWU5DX0FMTAkyCQkvKiBTeW5jaHJvbml6ZSBhbGwgSUQvTFVOICovCisjZGVmaW5lIE1LX1NZTkNfTElQCTMJCS8qIFN5bmNocm9uaXplIGFsbCBJRC9MVU4sICovCisJCQkJCS8qIGNsZWFyIHBvcnQgY2hhbmdlZCwgKi8KKwkJCQkJLyogdXNlIHNlcXVlbmNlIG51bWJlci4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE7CisJdWludDE2X3Qgc2VxdWVuY2VfbnVtYmVyOwkvKiBTZXF1ZW5jZSBudW1iZXIgb2YgZXZlbnQgKi8KKwl1aW50MTZfdCBsdW47CQkJLyogU0NTSSBMVU4gKi8KKwl1aW50OF90IHJlc2VydmVkXzJbNDhdOworfSBtcmtfZW50cnlfdDsKKworLyoKKyAqIElTUCBxdWV1ZSAtIE1hbmFnZW1lbnQgU2VydmVyIGVudHJ5IHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIE1TX0lPQ0JfVFlQRQkJMHgyOQkvKiBNYW5hZ2VtZW50IFNlcnZlciBJT0NCIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDhfdCBlbnRyeV90eXBlOwkJLyogRW50cnkgdHlwZS4gKi8KKwl1aW50OF90IGVudHJ5X2NvdW50OwkJLyogRW50cnkgY291bnQuICovCisJdWludDhfdCBoYW5kbGVfY291bnQ7CQkvKiBIYW5kbGUgY291bnQuICovCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CQkvKiBFbnRyeSBTdGF0dXMuICovCisJdWludDMyX3QgaGFuZGxlMTsJCS8qIFN5c3RlbSBoYW5kbGUuICovCisJdGFyZ2V0X2lkX3QgbG9vcF9pZDsKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3QgY29udHJvbF9mbGFnczsJCS8qIENvbnRyb2wgZmxhZ3MuICovCisJdWludDE2X3QgcmVzZXJ2ZWQyOworCXVpbnQxNl90IHRpbWVvdXQ7CisJdWludDE2X3QgY21kX2RzZF9jb3VudDsKKwl1aW50MTZfdCB0b3RhbF9kc2RfY291bnQ7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3Qgcl9jdGw7CisJdWludDE2X3QgcnhfaWQ7CisJdWludDE2X3QgcmVzZXJ2ZWQzOworCXVpbnQzMl90IGhhbmRsZTI7CisJdWludDMyX3QgcnNwX2J5dGVjb3VudDsKKwl1aW50MzJfdCByZXFfYnl0ZWNvdW50OworCXVpbnQzMl90IGRzZWdfcmVxX2FkZHJlc3NbMl07CS8qIERhdGEgc2VnbWVudCAwIGFkZHJlc3MuICovCisJdWludDMyX3QgZHNlZ19yZXFfbGVuZ3RoOwkvKiBEYXRhIHNlZ21lbnQgMCBsZW5ndGguICovCisJdWludDMyX3QgZHNlZ19yc3BfYWRkcmVzc1syXTsJLyogRGF0YSBzZWdtZW50IDEgYWRkcmVzcy4gKi8KKwl1aW50MzJfdCBkc2VnX3JzcF9sZW5ndGg7CS8qIERhdGEgc2VnbWVudCAxIGxlbmd0aC4gKi8KK30gbXNfaW9jYl9lbnRyeV90OworCisKKy8qCisgKiBJU1AgcXVldWUgLSBNYWlsYm94IENvbW1hbmQgZW50cnkgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUgTUJYX0lPQ0JfVFlQRQkweDM5CitzdHJ1Y3QgbWJ4X2VudHJ5IHsKKwl1aW50OF90IGVudHJ5X3R5cGU7CisJdWludDhfdCBlbnRyeV9jb3VudDsKKwl1aW50OF90IHN5c19kZWZpbmUxOworCS8qIFVzZSBzeXNfZGVmaW5lMSBmb3Igc291cmNlIHR5cGUgKi8KKyNkZWZpbmUgU09VUkNFX1NDU0kJMHgwMAorI2RlZmluZSBTT1VSQ0VfSVAJMHgwMQorI2RlZmluZSBTT1VSQ0VfVkkJMHgwMgorI2RlZmluZSBTT1VSQ0VfU0NUUAkweDAzCisjZGVmaW5lIFNPVVJDRV9NUAkweDA0CisjZGVmaW5lIFNPVVJDRV9NUElPQ1RMCTB4MDUKKyNkZWZpbmUgU09VUkNFX0FTWU5DX0lPQ0IgMHgwNworCisJdWludDhfdCBlbnRyeV9zdGF0dXM7CisKKwl1aW50MzJfdCBoYW5kbGU7CisJdGFyZ2V0X2lkX3QgbG9vcF9pZDsKKworCXVpbnQxNl90IHN0YXR1czsKKwl1aW50MTZfdCBzdGF0ZV9mbGFnczsKKwl1aW50MTZfdCBzdGF0dXNfZmxhZ3M7CisKKwl1aW50MzJfdCBzeXNfZGVmaW5lMlsyXTsKKworCXVpbnQxNl90IG1iMDsKKwl1aW50MTZfdCBtYjE7CisJdWludDE2X3QgbWIyOworCXVpbnQxNl90IG1iMzsKKwl1aW50MTZfdCBtYjY7CisJdWludDE2X3QgbWI3OworCXVpbnQxNl90IG1iOTsKKwl1aW50MTZfdCBtYjEwOworCXVpbnQzMl90IHJlc2VydmVkXzJbMl07CisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgcG9ydF9uYW1lW1dXTl9TSVpFXTsKK307CisKKy8qCisgKiBJU1AgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWUgZW50cnkgc2l6ZXMKKyAqLworI2RlZmluZSBSRVNQT05TRV9FTlRSWV9TSVpFCShzaXplb2YocmVzcG9uc2VfdCkpCisjZGVmaW5lIFJFUVVFU1RfRU5UUllfU0laRQkoc2l6ZW9mKHJlcXVlc3RfdCkpCisKKworLyoKKyAqIDI0IGJpdCBwb3J0IElEIHR5cGUgZGVmaW5pdGlvbi4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJdWludDMyX3QgYjI0IDogMjQ7CisKKwlzdHJ1Y3QgeworCQl1aW50OF90IGRfaWRbM107CisJCXVpbnQ4X3QgcnN2ZF8xOworCX0gcjsKKworCXN0cnVjdCB7CisJCXVpbnQ4X3QgYWxfcGE7CisJCXVpbnQ4X3QgYXJlYTsKKwkJdWludDhfdCBkb21haW47CisJCXVpbnQ4X3QgcnN2ZF8xOworCX0gYjsKK30gcG9ydF9pZF90OworI2RlZmluZSBJTlZBTElEX1BPUlRfSUQJMHhGRkZGRkYKKworLyoKKyAqIFN3aXRjaCBpbmZvIGdhdGhlcmluZyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlwb3J0X2lkX3QgZF9pZDsKKwl1aW50OF90IG5vZGVfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBwb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQzMl90IHR5cGU7CisjZGVmaW5lIFNXX1RZUEVfSVAJQklUXzEKKyNkZWZpbmUgU1dfVFlQRV9TQ1NJCUJJVF8wCit9IHN3X2luZm9fdDsKKworLyoKKyAqIElucXVpcnkgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgSU5RX0RBVEFfU0laRQkzNgorCisvKgorICogSW5xdWlyeSBtYWlsYm94IElPQ0IgcGFja2V0IGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bmlvbiB7CisJCWNtZF9hNjRfZW50cnlfdCBjbWQ7CisJCXN0c19lbnRyeV90IHJzcDsKKwl9IHA7CisJdWludDhfdCBpbnFbSU5RX0RBVEFfU0laRV07Cit9IGlucV9jbWRfcnNwX3Q7CisKKy8qCisgKiBSZXBvcnQgTFVOIGNvbW1hbmQgc3RydWN0dXJlLgorICovCisjZGVmaW5lIENIQVJfVE9fU0hPUlQoYSwgYikJKHVpbnQxNl90KSgodWludDhfdCliIDw8IDggfCAodWludDhfdClhKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgbGVuOworCXVpbnQzMl90IHJzcnY7Cit9IHJwdF9oZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB7CisJCXVpbnQ4X3QgYiA6IDY7CisJCXVpbnQ4X3QgYWRkcmVzc19tZXRob2QgOiAyOworCX0gbXNiOworCXVpbnQ4X3QgbHNiOworCXVpbnQ4X3QgdW51c2VkWzZdOworfSBycHRfbHVuX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlycHRfaGRyX3QgaGRyOworCXJwdF9sdW5fdCBsc3RbTUFYX0xVTlNdOworfSBycHRfbHVuX2xzdF90OworCisvKgorICogUmVwb3J0IEx1biBtYWlsYm94IElPQ0IgcGFja2V0IGRlZmluaXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bmlvbiB7CisJCWNtZF9hNjRfZW50cnlfdCBjbWQ7CisJCXN0c19lbnRyeV90IHJzcDsKKwl9IHA7CisJcnB0X2x1bl9sc3RfdCBsaXN0OworfSBycHRfbHVuX2NtZF9yc3BfdDsKKworLyoKKyAqIFNDU0kgVGFyZ2V0IFF1ZXVlIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBvc190Z3QgeworCXN0cnVjdCBvc19sdW4gKm9sdW5bTUFYX0xVTlNdOyAvKiBMVU4gY29udGV4dCBwb2ludGVyLiAqLworCXN0cnVjdCBmY19wb3J0ICpmY3BvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50OF90IHBvcnRfZG93bl9yZXRyeV9jb3VudDsKKyAgICAJdWludDMyX3QgZG93bl90aW1lcjsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisKKwkvKiBQZXJzaXN0ZW50IGJpbmRpbmcgaW5mb3JtYXRpb24gKi8KKwlwb3J0X2lkX3QgZF9pZDsKKwl1aW50OF90IG5vZGVfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBwb3J0X25hbWVbV1dOX1NJWkVdOworfSBvc190Z3RfdDsKKworLyoKKyAqIFNDU0kgVGFyZ2V0IFF1ZXVlIGZsYWdzCisgKi8KKyNkZWZpbmUgVFFGX09OTElORQkJMAkJLyogRGV2aWNlIG9ubGluZSB0byBPUy4gKi8KKyNkZWZpbmUgVFFGX1NVU1BFTkRFRAkJMQorI2RlZmluZSBUUUZfUkVUUllfQ01EUwkJMgorCisvKgorICogU0NTSSBMVU4gUXVldWUgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IG9zX2x1biB7CisJc3RydWN0IGZjX2x1biAqZmNsdW47CQkvKiBGQyBMVU4gY29udGV4dCBwb2ludGVyLiAqLworICAgIAlzcGlubG9ja190IHFfbG9jazsJCS8qIEx1biBMb2NrICovCisKKwl1bnNpZ25lZCBsb25nIHFfZmxhZzsKKyNkZWZpbmUgTFVOX01QSU9fUkVTRVRfQ05UUwkxCS8qIEx1biAqLworI2RlZmluZSBMVU5fTVBJT19CVVNZCQkyCS8qIEx1biBpcyBjaGFuZ2luZyBwYXRocyAgKi8KKyNkZWZpbmUgTFVOX0VYRUNfREVMQVlFRAk3CS8qIEx1biBleGVjdXRpb24gaXMgZGVsYXllZCAqLworCisJdV9sb25nIHFfdGltZW91dDsJCS8qIHRvdGFsIGNvbW1hbmQgdGltZW91dHMgKi8KKwlhdG9taWNfdCBxX3RpbWVyOwkJLyogc3VzcGVuZCB0aW1lciAqLworCXVpbnQzMl90IHFfY291bnQ7CQkvKiBjdXJyZW50IGNvdW50ICovCisJdWludDMyX3QgcV9tYXg7CQkJLyogbWF4bXVtIGNvdW50IGx1biBjYW4gYmUgc3VzcGVuZGVkICovCisJdWludDhfdCBxX3N0YXRlOwkJLyogbHVuIFN0YXRlICovCisjZGVmaW5lIExVTl9TVEFURV9SRUFEWQkJMQkvKiBsdW4gaXMgcmVhZHkgZm9yIGkvbyAqLworI2RlZmluZSBMVU5fU1RBVEVfUlVOCQkyCS8qIGx1biBoYXMgYSB0aW1lciBydW5uaW5nICovCisjZGVmaW5lIExVTl9TVEFURV9XQUlUCQkzCS8qIGx1biBpcyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgTFVOX1NUQVRFX1RJTUVPVVQJNAkvKiBsdW4gaGFzIHRpbWVkIG91dCAqLworCisJdV9sb25nIGlvX2NudDsJCQkvKiB0b3RhbCB4ZmVyIGNvdW50IHNpbmNlIGJvb3QgKi8KKwl1X2xvbmcgb3V0X2NudDsJCQkvKiB0b3RhbCBvdXRzdGFuZGluZyBJTyBjb3VudCAqLworCXVfbG9uZyB3X2NudDsJCQkvKiB0b3RhbCB3cml0ZXMgKi8KKwl1X2xvbmcgcl9jbnQ7CQkJLyogdG90YWwgcmVhZHMgKi8KKwl1X2xvbmcgYXZnX3RpbWU7CQkvKiAgKi8KK30gb3NfbHVuX3Q7CisKKworLyogTFVOIEJpdE1hc2sgc3RydWN0dXJlIGRlZmluaXRpb24sIGFycmF5IG9mIDMyYml0IHdvcmRzLAorICogMSBiaXQgcGVyIGx1bi4gIFdoZW4gYml0ID09IDEsIHRoZSBsdW4gaXMgbWFza2VkLgorICogTW9zdCBzaWduaWZpY2FudCBiaXQgb2YgbWFza1swXSBpcyBsdW4gMCwgYml0IDI0IGlzIGx1biA3LgorICovCit0eXBlZGVmIHN0cnVjdCBsdW5fYml0X21hc2sgeworCS8qIE11c3QgYWxsb2NhdGUgYXQgbGVhc3QgZW5vdWdoIGJpdHMgdG8gYWNjb21vZGF0ZSBhbGwgTFVOcyAqLworI2lmICgoTUFYX0ZJQlJFX0xVTlMgJiAweDcpID09IDApCisJdWludDhfdCBtYXNrW01BWF9GSUJSRV9MVU5TID4+IDNdOworI2Vsc2UKKwl1aW50OF90IG1hc2tbKE1BWF9GSUJSRV9MVU5TICsgOCkgPj4gM107CisjZW5kaWYKK30gbHVuX2JpdF9tYXNrX3Q7CisKKy8qCisgKiBGaWJyZSBjaGFubmVsIHBvcnQgdHlwZS4KKyAqLworIHR5cGVkZWYgZW51bSB7CisJRkNUX1VOS05PV04sCisJRkNUX1JTQ04sCisJRkNUX1NXSVRDSCwKKwlGQ1RfQlJPQURDQVNULAorCUZDVF9JTklUSUFUT1IsCisJRkNUX1RBUkdFVAorfSBmY19wb3J0X3R5cGVfdDsKKworLyoKKyAqIEZpYnJlIGNoYW5uZWwgcG9ydCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZjX3BvcnQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZjbHVuczsKKworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmlzX2hhOwkvKiBvbmx5IHVzZWQgd2hlbiBzdXNwZW5kaW5nIGx1biAqLworCisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwlwb3J0X2lkX3QgZF9pZDsKKwl1aW50MTZfdCBsb29wX2lkOworCXVpbnQxNl90IG9sZF9sb29wX2lkOworCisJZmNfcG9ydF90eXBlX3QgcG9ydF90eXBlOworCisJYXRvbWljX3Qgc3RhdGU7CisJdWludDMyX3QgZmxhZ3M7CisKKwlvc190Z3RfdCAqdGd0X3F1ZXVlOworCXVpbnQxNl90IG9zX3RhcmdldF9pZDsKKworCXVpbnQxNl90IGlvZGVzY19pZHhfc2VudDsKKworCWludCBwb3J0X2xvZ2luX3JldHJ5X2NvdW50OworCWludCBsb2dpbl9yZXRyeTsKKwlhdG9taWNfdCBwb3J0X2Rvd25fdGltZXI7CisKKwl1aW50OF90IGRldmljZV90eXBlOworCXVpbnQ4X3QgdW51c2VkOworCisJdWludDhfdCBtcF9ieXRlOwkJLyogbXVsdGktcGF0aCBieXRlIChub3QgdXNlZCkgKi8KKyAgICAJdWludDhfdCBjdXJfcGF0aDsJCS8qIGN1cnJlbnQgcGF0aCBpZCAqLworCisJbHVuX2JpdF9tYXNrX3QgbHVuX21hc2s7Cit9IGZjX3BvcnRfdDsKKworLyoKKyAqIEZpYnJlIGNoYW5uZWwgcG9ydC9sdW4gc3RhdGVzLgorICovCisjZGVmaW5lIEZDU19VTkNPTkZJR1VSRUQJMQorI2RlZmluZSBGQ1NfREVWSUNFX0RFQUQJCTIKKyNkZWZpbmUgRkNTX0RFVklDRV9MT1NUCQkzCisjZGVmaW5lIEZDU19PTkxJTkUJCTQKKyNkZWZpbmUgRkNTX05PVF9TVVBQT1JURUQJNQorI2RlZmluZSBGQ1NfRkFJTE9WRVIJCTYKKyNkZWZpbmUgRkNTX0ZBSUxPVkVSX0ZBSUxFRAk3CisKKy8qCisgKiBGQyBwb3J0IGZsYWdzLgorICovCisjZGVmaW5lIEZDRl9GQUJSSUNfREVWSUNFCUJJVF8wCisjZGVmaW5lIEZDRl9MT0dJTl9ORUVERUQJQklUXzEKKyNkZWZpbmUgRkNGX0ZPX01BU0tFRAkJQklUXzIKKyNkZWZpbmUgRkNGX0ZBSUxPVkVSX05FRURFRAlCSVRfMworI2RlZmluZSBGQ0ZfUkVTRVRfTkVFREVECUJJVF80CisjZGVmaW5lIEZDRl9QRVJTSVNURU5UX0JPVU5ECUJJVF81CisjZGVmaW5lIEZDRl9UQVBFX1BSRVNFTlQJQklUXzYKKyNkZWZpbmUgRkNGX0ZBUlBfRE9ORQkJQklUXzcKKyNkZWZpbmUgRkNGX0ZBUlBfRkFJTEVECQlCSVRfOAorI2RlZmluZSBGQ0ZfRkFSUF9SRVBMWV9ORUVERUQJQklUXzkKKyNkZWZpbmUgRkNGX0FVVEhfUkVRCQlCSVRfMTAKKyNkZWZpbmUgRkNGX1NFTkRfQVVUSF9SRVEJQklUXzExCisjZGVmaW5lIEZDRl9SRUNFSVZFX0FVVEhfUkVRCUJJVF8xMgorI2RlZmluZSBGQ0ZfQVVUSF9TVUNDRVNTCUJJVF8xMworI2RlZmluZSBGQ0ZfUkxDX1NVUFBPUlQJCUJJVF8xNAorI2RlZmluZSBGQ0ZfQ09ORklHCQlCSVRfMTUJLyogTmVlZGVkPyAqLworI2RlZmluZSBGQ0ZfUkVTQ0FOX05FRURFRAlCSVRfMTYKKyNkZWZpbmUgRkNGX1hQX0RFVklDRQkJQklUXzE3CisjZGVmaW5lIEZDRl9NU0FfREVWSUNFCQlCSVRfMTgKKyNkZWZpbmUgRkNGX0VWQV9ERVZJQ0UJCUJJVF8xOQorI2RlZmluZSBGQ0ZfTVNBX1BPUlRfQUNUSVZFCUJJVF8yMAorI2RlZmluZSBGQ0ZfRkFJTEJBQ0tfRElTQUJMRQlCSVRfMjEKKyNkZWZpbmUgRkNGX0ZBSUxPVkVSX0RJU0FCTEUJQklUXzIyCisjZGVmaW5lIEZDRl9EU1hYWF9ERVZJQ0UJQklUXzIzCisjZGVmaW5lIEZDRl9BQV9FVkFfREVWSUNFCUJJVF8yNAorCisvKiBObyBsb29wIElEIGZsYWcuICovCisjZGVmaW5lIEZDX05PX0xPT1BfSUQJCTB4MTAwMAorCisvKgorICogRmlicmUgY2hhbm5lbCBMVU4gc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBmY19sdW4geworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlmY19wb3J0X3QgKmZjcG9ydDsKKwlmY19wb3J0X3QgKm9fZmNwb3J0OworCXVpbnQxNl90IGx1bjsKKwlhdG9taWNfdCBzdGF0ZTsKKwl1aW50OF90IGRldmljZV90eXBlOworCisJdWludDhfdCBtYXhfcGF0aF9yZXRyaWVzOworCXVpbnQzMl90IGZsYWdzOworfSBmY19sdW5fdDsKKworI2RlZmluZQlGTEZfVklTSUJMRV9MVU4JCUJJVF8wCisjZGVmaW5lCUZMRl9BQ1RJVkVfTFVOCQlCSVRfMQorCisvKgorICogRkMtQ1QgaW50ZXJmYWNlCisgKgorICogTk9URTogQWxsIHN0cnVjdHVyZXMgYXJlIGJpZy1lbmRpYW4gaW4gZm9ybS4KKyAqLworCisjZGVmaW5lIENUX1JFSkVDVF9SRVNQT05TRQkweDgwMDEKKyNkZWZpbmUgQ1RfQUNDRVBUX1JFU1BPTlNFCTB4ODAwMgorCisjZGVmaW5lIE5TX05fUE9SVF9UWVBFCTB4MDEKKyNkZWZpbmUgTlNfTkxfUE9SVF9UWVBFCTB4MDIKKyNkZWZpbmUgTlNfTlhfUE9SVF9UWVBFCTB4N0YKKworI2RlZmluZQlHQV9OWFRfQ01ECTB4MTAwCisjZGVmaW5lCUdBX05YVF9SRVFfU0laRQkoMTYgKyA0KQorI2RlZmluZQlHQV9OWFRfUlNQX1NJWkUJKDE2ICsgNjIwKQorCisjZGVmaW5lCUdJRF9QVF9DTUQJMHgxQTEKKyNkZWZpbmUJR0lEX1BUX1JFUV9TSVpFCSgxNiArIDQpCisjZGVmaW5lCUdJRF9QVF9SU1BfU0laRQkoMTYgKyAoTUFYX0ZJQlJFX0RFVklDRVMgKiA0KSkKKworI2RlZmluZQlHUE5fSURfQ01ECTB4MTEyCisjZGVmaW5lCUdQTl9JRF9SRVFfU0laRQkoMTYgKyA0KQorI2RlZmluZQlHUE5fSURfUlNQX1NJWkUJKDE2ICsgOCkKKworI2RlZmluZQlHTk5fSURfQ01ECTB4MTEzCisjZGVmaW5lCUdOTl9JRF9SRVFfU0laRQkoMTYgKyA0KQorI2RlZmluZQlHTk5fSURfUlNQX1NJWkUJKDE2ICsgOCkKKworI2RlZmluZQlHRlRfSURfQ01ECTB4MTE3CisjZGVmaW5lCUdGVF9JRF9SRVFfU0laRQkoMTYgKyA0KQorI2RlZmluZQlHRlRfSURfUlNQX1NJWkUJKDE2ICsgMzIpCisKKyNkZWZpbmUJUkZUX0lEX0NNRAkweDIxNworI2RlZmluZQlSRlRfSURfUkVRX1NJWkUJKDE2ICsgNCArIDMyKQorI2RlZmluZQlSRlRfSURfUlNQX1NJWkUJMTYKKworI2RlZmluZQlSRkZfSURfQ01ECTB4MjFGCisjZGVmaW5lCVJGRl9JRF9SRVFfU0laRQkoMTYgKyA0ICsgMiArIDEgKyAxKQorI2RlZmluZQlSRkZfSURfUlNQX1NJWkUJMTYKKworI2RlZmluZQlSTk5fSURfQ01ECTB4MjEzCisjZGVmaW5lCVJOTl9JRF9SRVFfU0laRQkoMTYgKyA0ICsgOCkKKyNkZWZpbmUJUk5OX0lEX1JTUF9TSVpFCTE2CisKKyNkZWZpbmUJUlNOTl9OTl9DTUQJIDB4MjM5CisjZGVmaW5lCVJTTk5fTk5fUkVRX1NJWkUgKDE2ICsgOCArIDEgKyAyNTUpCisjZGVmaW5lCVJTTk5fTk5fUlNQX1NJWkUgMTYKKworLyogQ1QgY29tbWFuZCBoZWFkZXIgLS0gcmVxdWVzdC9yZXNwb25zZSBjb21tb24gZmllbGRzICovCitzdHJ1Y3QgY3RfY21kX2hkciB7CisJdWludDhfdCByZXZpc2lvbjsKKwl1aW50OF90IGluX2lkWzNdOworCXVpbnQ4X3QgZ3NfdHlwZTsKKwl1aW50OF90IGdzX3N1YnR5cGU7CisJdWludDhfdCBvcHRpb25zOworCXVpbnQ4X3QgcmVzZXJ2ZWQ7Cit9OworCisvKiBDVCBjb21tYW5kIHJlcXVlc3QgKi8KK3N0cnVjdCBjdF9zbnNfcmVxIHsKKwlzdHJ1Y3QgY3RfY21kX2hkciBoZWFkZXI7CisJdWludDE2X3QgY29tbWFuZDsKKwl1aW50MTZfdCBtYXhfcnNwX3NpemU7CisJdWludDhfdCBmcmFnbWVudF9pZDsKKwl1aW50OF90IHJlc2VydmVkWzNdOworCisJdW5pb24geworCQkvKiBHQV9OWFQsIEdQTl9JRCwgR05OX0lELCBHRlRfSUQgKi8KKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCQl1aW50OF90IHBvcnRfaWRbM107CisJCX0gcG9ydF9pZDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBwb3J0X3R5cGU7CisJCQl1aW50OF90IGRvbWFpbjsKKwkJCXVpbnQ4X3QgYXJlYTsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCX0gZ2lkX3B0OworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHJlc2VydmVkOworCQkJdWludDhfdCBwb3J0X2lkWzNdOworCQkJdWludDhfdCBmYzRfdHlwZXNbMzJdOworCQl9IHJmdF9pZDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCByZXNlcnZlZDsKKwkJCXVpbnQ4X3QgcG9ydF9pZFszXTsKKwkJCXVpbnQxNl90IHJlc2VydmVkMjsKKwkJCXVpbnQ4X3QgZmM0X2ZlYXR1cmU7CisJCQl1aW50OF90IGZjNF90eXBlOworCQl9IHJmZl9pZDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCByZXNlcnZlZDsKKwkJCXVpbnQ4X3QgcG9ydF9pZFszXTsKKwkJCXVpbnQ4X3Qgbm9kZV9uYW1lWzhdOworCQl9IHJubl9pZDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBub2RlX25hbWVbOF07CisJCQl1aW50OF90IG5hbWVfbGVuOworCQkJdWludDhfdCBzeW1fbm9kZV9uYW1lWzI1NV07CisJCX0gcnNubl9ubjsKKwl9IHJlcTsKK307CisKKy8qIENUIGNvbW1hbmQgcmVzcG9uc2UgaGVhZGVyICovCitzdHJ1Y3QgY3RfcnNwX2hkciB7CisJc3RydWN0IGN0X2NtZF9oZHIgaGVhZGVyOworCXVpbnQxNl90IHJlc3BvbnNlOworCXVpbnQxNl90IHJlc2lkdWFsOworCXVpbnQ4X3QgZnJhZ21lbnRfaWQ7CisJdWludDhfdCByZWFzb25fY29kZTsKKwl1aW50OF90IGV4cGxhbmF0aW9uX2NvZGU7CisJdWludDhfdCB2ZW5kb3JfdW5pcXVlOworfTsKKworc3RydWN0IGN0X3Nuc19naWRfcHRfZGF0YSB7CisJdWludDhfdCBjb250cm9sX2J5dGU7CisJdWludDhfdCBwb3J0X2lkWzNdOworfTsKKworc3RydWN0IGN0X3Nuc19yc3AgeworCXN0cnVjdCBjdF9yc3BfaGRyIGhlYWRlcjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QgcG9ydF90eXBlOworCQkJdWludDhfdCBwb3J0X2lkWzNdOworCQkJdWludDhfdCBwb3J0X25hbWVbOF07CisJCQl1aW50OF90IHN5bV9wb3J0X25hbWVfbGVuOworCQkJdWludDhfdCBzeW1fcG9ydF9uYW1lWzI1NV07CisJCQl1aW50OF90IG5vZGVfbmFtZVs4XTsKKwkJCXVpbnQ4X3Qgc3ltX25vZGVfbmFtZV9sZW47CisJCQl1aW50OF90IHN5bV9ub2RlX25hbWVbMjU1XTsKKwkJCXVpbnQ4X3QgaW5pdF9wcm9jX2Fzc29jWzhdOworCQkJdWludDhfdCBub2RlX2lwX2FkZHJbMTZdOworCQkJdWludDhfdCBjbGFzc19vZl9zZXJ2aWNlWzRdOworCQkJdWludDhfdCBmYzRfdHlwZXNbMzJdOworCQkJdWludDhfdCBpcF9hZGRyZXNzWzE2XTsKKwkJCXVpbnQ4X3QgZmFicmljX3BvcnRfbmFtZVs4XTsKKwkJCXVpbnQ4X3QgcmVzZXJ2ZWQ7CisJCQl1aW50OF90IGhhcmRfYWRkcmVzc1szXTsKKwkJfSBnYV9ueHQ7CisKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBjdF9zbnNfZ2lkX3B0X2RhdGEgZW50cmllc1tNQVhfRklCUkVfREVWSUNFU107CisJCX0gZ2lkX3B0OworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IHBvcnRfbmFtZVs4XTsKKwkJfSBncG5faWQ7CisKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3Qgbm9kZV9uYW1lWzhdOworCQl9IGdubl9pZDsKKworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBmYzRfdHlwZXNbMzJdOworCQl9IGdmdF9pZDsKKwl9IHJzcDsKK307CisKK3N0cnVjdCBjdF9zbnNfcGt0IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBjdF9zbnNfcmVxIHJlcTsKKwkJc3RydWN0IGN0X3Nuc19yc3AgcnNwOworCX0gcDsKK307CisKKy8qCisgKiBTTlMgY29tbWFuZCBzdHJ1Y3R1cmVzIC0tIGZvciAyMjAwIGNvbXBhdGFiaWxpdHkuCisgKi8KKyNkZWZpbmUJUkZUX0lEX1NOU19TQ01EX0xFTgkyMgorI2RlZmluZQlSRlRfSURfU05TX0NNRF9TSVpFCTYwCisjZGVmaW5lCVJGVF9JRF9TTlNfREFUQV9TSVpFCTE2CisKKyNkZWZpbmUJUk5OX0lEX1NOU19TQ01EX0xFTgkxMAorI2RlZmluZQlSTk5fSURfU05TX0NNRF9TSVpFCTM2CisjZGVmaW5lCVJOTl9JRF9TTlNfREFUQV9TSVpFCTE2CisKKyNkZWZpbmUJR0FfTlhUX1NOU19TQ01EX0xFTgk2CisjZGVmaW5lCUdBX05YVF9TTlNfQ01EX1NJWkUJMjgKKyNkZWZpbmUJR0FfTlhUX1NOU19EQVRBX1NJWkUJKDYyMCArIDE2KQorCisjZGVmaW5lCUdJRF9QVF9TTlNfU0NNRF9MRU4JNgorI2RlZmluZQlHSURfUFRfU05TX0NNRF9TSVpFCTI4CisjZGVmaW5lCUdJRF9QVF9TTlNfREFUQV9TSVpFCShNQVhfRklCUkVfREVWSUNFUyAqIDQgKyAxNikKKworI2RlZmluZQlHUE5fSURfU05TX1NDTURfTEVOCTYKKyNkZWZpbmUJR1BOX0lEX1NOU19DTURfU0laRQkyOAorI2RlZmluZQlHUE5fSURfU05TX0RBVEFfU0laRQkoOCArIDE2KQorCisjZGVmaW5lCUdOTl9JRF9TTlNfU0NNRF9MRU4JNgorI2RlZmluZQlHTk5fSURfU05TX0NNRF9TSVpFCTI4CisjZGVmaW5lCUdOTl9JRF9TTlNfREFUQV9TSVpFCSg4ICsgMTYpCisKK3N0cnVjdCBzbnNfY21kX3BrdCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgYnVmZmVyX2xlbmd0aDsKKwkJCXVpbnQxNl90IHJlc2VydmVkXzE7CisJCQl1aW50MzJfdCBidWZmZXJfYWRkcmVzc1syXTsKKwkJCXVpbnQxNl90IHN1YmNvbW1hbmRfbGVuZ3RoOworCQkJdWludDE2X3QgcmVzZXJ2ZWRfMjsKKwkJCXVpbnQxNl90IHN1YmNvbW1hbmQ7CisJCQl1aW50MTZfdCBzaXplOworCQkJdWludDMyX3QgcmVzZXJ2ZWRfMzsKKwkJCXVpbnQ4X3QgcGFyYW1bMzZdOworCQl9IGNtZDsKKworCQl1aW50OF90IHJmdF9kYXRhW1JGVF9JRF9TTlNfREFUQV9TSVpFXTsKKwkJdWludDhfdCBybm5fZGF0YVtSTk5fSURfU05TX0RBVEFfU0laRV07CisJCXVpbnQ4X3QgZ2FuX2RhdGFbR0FfTlhUX1NOU19EQVRBX1NJWkVdOworCQl1aW50OF90IGdpZF9kYXRhW0dJRF9QVF9TTlNfREFUQV9TSVpFXTsKKwkJdWludDhfdCBncG5fZGF0YVtHUE5fSURfU05TX0RBVEFfU0laRV07CisJCXVpbnQ4X3QgZ25uX2RhdGFbR05OX0lEX1NOU19EQVRBX1NJWkVdOworCX0gcDsKK307CisKKy8qIElPIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIE1BWF9JT19ERVNDUklQVE9SUwkzMgorCisjZGVmaW5lIEFCT1JUX0lPQ0JfQ0IJCTAKKyNkZWZpbmUgQURJU0NfUE9SVF9JT0NCX0NCCTEKKyNkZWZpbmUgTE9HT1VUX1BPUlRfSU9DQl9DQgkyCisjZGVmaW5lIExPR0lOX1BPUlRfSU9DQl9DQgkzCisjZGVmaW5lIExBU1RfSU9DQl9DQgkJNAorCisjZGVmaW5lIElPREVTQ19JTlZBTElEX0lOREVYCTB4RkZGRgorI2RlZmluZSBJT0RFU0NfQURJU0NfTkVFREVECTB4RkZGRQorI2RlZmluZSBJT0RFU0NfTE9HSU5fTkVFREVECTB4RkZGRAorCitzdHJ1Y3QgaW9fZGVzY3JpcHRvciB7CisJdWludDE2X3QgdXNlZDoxOworCXVpbnQxNl90IGlkeDoxMTsKKwl1aW50MTZfdCBjYl9pZHg6NDsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCisJcG9ydF9pZF90IGRfaWQ7CisJZmNfcG9ydF90ICpyZW1vdGVfZmNwb3J0OworCisJdWludDMyX3Qgc2lnbmF0dXJlOworfTsKKworc3RydWN0IHFsYV9md19pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzaW5nOwkvKiBhZGRyZXNzaW5nIG1ldGhvZCB1c2VkIHRvIGxvYWQgZncgKi8KKyNkZWZpbmUgRldfSU5GT19BRERSX05PUk1BTAkwCisjZGVmaW5lIEZXX0lORk9fQUREUl9FWFRFTkRFRAkxCisjZGVmaW5lIEZXX0lORk9fQUREUl9OT01PUkUJMHhmZmZmCisJdW5zaWduZWQgc2hvcnQgKmZ3Y29kZTsJCS8qIHBvaW50ZXIgdG8gRlcgYXJyYXkgKi8KKwl1bnNpZ25lZCBzaG9ydCAqZndsZW47CQkvKiBudW1iZXIgb2Ygd29yZHMgaW4gYXJyYXkgKi8KKwl1bnNpZ25lZCBzaG9ydCAqZndzdGFydDsJLyogc3RhcnQgYWRkcmVzcyBmb3IgRi9XICovCisJdW5zaWduZWQgbG9uZyAqbGZ3c3RhcnQ7CS8qIHN0YXJ0IGFkZHJlc3MgKGxvbmcpIGZvciBGL1cgKi8KK307CisKK3N0cnVjdCBxbGFfYm9hcmRfaW5mbyB7CisJY2hhciAqZHJ2X25hbWU7CisKKwljaGFyIGlzcF9uYW1lWzhdOworCXN0cnVjdCBxbGFfZndfaW5mbyAqZndfaW5mbzsKK307CisKKy8qIFJldHVybiBkYXRhIGZyb20gTUJDX0dFVF9JRF9MSVNUIGNhbGwuICovCitzdHJ1Y3QgZ2lkX2xpc3RfaW5mbyB7CisJdWludDhfdAlhbF9wYTsKKwl1aW50OF90CWFyZWE7CisJdWludDhfdAlkb21haW47CQkKKwl1aW50OF90CWxvb3BfaWRfMjEwMDsJLyogSVNQMjEwMC9JU1AyMjAwIC0tIDQgYnl0ZXMuICovCisJdWludDE2X3QgbG9vcF9pZDsJLyogSVNQMjNYWCAgICAgICAgIC0tIDYgYnl0ZXMuICovCit9OworI2RlZmluZSBHSURfTElTVF9TSVpFIChzaXplb2Yoc3RydWN0IGdpZF9saXN0X2luZm8pICogTUFYX0ZJQlJFX0RFVklDRVMpCisKKy8qCisgKiBMaW51eCBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNjc2lfcWxhX2hvc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIENvbW1vbmx5IHVzZWQgZmxhZ3MgYW5kIHN0YXRlIGluZm9ybWF0aW9uLiAqLworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHBjaV9kZXYJKnBkZXY7CisKKwl1bnNpZ25lZCBsb25nCWhvc3Rfbm87CisJdW5zaWduZWQgbG9uZwlpbnN0YW5jZTsKKworCXZvbGF0aWxlIHN0cnVjdCB7CisJCXVpbnQzMl90CWluaXRfZG9uZQkJOjE7CisJCXVpbnQzMl90CW9ubGluZQkJCToxOworCQl1aW50MzJfdAltYm94X2ludAkJOjE7CisJCXVpbnQzMl90CW1ib3hfYnVzeQkJOjE7CisJCXVpbnQzMl90CXJzY25fcXVldWVfb3ZlcmZsb3cJOjE7CisJCXVpbnQzMl90CXJlc2V0X2FjdGl2ZQkJOjE7CisKKwkJdWludDMyX3QJbWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luIDoxOworICAgICAgICAgICAgICAgIHVpbnQzMl90CXByb2Nlc3NfcmVzcG9uc2VfcXVldWUJOjE7CisKKwkJdWludDMyX3QJZGlzYWJsZV9yaXNjX2NvZGVfbG9hZAk6MTsKKwkJdWludDMyX3QJZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcJOjE7CisJCXVpbnQzMl90CWVuYWJsZV9saXBfcmVzZXQJOjE7CisJCXVpbnQzMl90CWVuYWJsZV9saXBfZnVsbF9sb2dpbgk6MTsKKwkJdWludDMyX3QJZW5hYmxlX3RhcmdldF9yZXNldAk6MTsKKwkJdWludDMyX3QJZW5hYmxlX2xlZF9zY2hlbWUJOjE7CisJfSBmbGFnczsKKworCWF0b21pY190CWxvb3Bfc3RhdGU7CisjZGVmaW5lIExPT1BfVElNRU9VVAkxCisjZGVmaW5lIExPT1BfRE9XTgkyCisjZGVmaW5lIExPT1BfVVAJCTMKKyNkZWZpbmUgTE9PUF9VUERBVEUJNAorI2RlZmluZSBMT09QX1JFQURZCTUKKyNkZWZpbmUgTE9PUF9ERUFECTYKKworCXVuc2lnbmVkIGxvbmcgICBkcGNfZmxhZ3M7CisjZGVmaW5lCVJFU0VUX01BUktFUl9ORUVERUQJMAkvKiBTZW5kIG1hcmtlciB0byBJU1AuICovCisjZGVmaW5lCVJFU0VUX0FDVElWRQkJMQorI2RlZmluZQlJU1BfQUJPUlRfTkVFREVECTIJLyogSW5pdGlhdGUgSVNQIGFib3J0LiAqLworI2RlZmluZQlBQk9SVF9JU1BfQUNUSVZFCTMJLyogSVNQIGFib3J0IGluIHByb2dyZXNzLiAqLworI2RlZmluZQlMT09QX1JFU1lOQ19ORUVERUQJNAkvKiBEZXZpY2UgUmVzeW5jIG5lZWRlZC4gKi8KKyNkZWZpbmUJTE9PUF9SRVNZTkNfQUNUSVZFCTUKKyNkZWZpbmUgTE9DQUxfTE9PUF9VUERBVEUgICAgICAgNgkvKiBQZXJmb3JtIGEgbG9jYWwgbG9vcCB1cGRhdGUuICovCisjZGVmaW5lIFJTQ05fVVBEQVRFICAgICAgICAgICAgIDcJLyogUGVyZm9ybSBhbiBSU0NOIHVwZGF0ZS4gKi8KKyNkZWZpbmUgTUFJTEJPWF9SRVRSWSAgICAgICAgICAgOAorI2RlZmluZSBJU1BfUkVTRVRfTkVFREVEICAgICAgICA5CS8qIEluaXRpYXRlIGEgSVNQIHJlc2V0LiAqLworI2RlZmluZSBGQUlMT1ZFUl9FVkVOVF9ORUVERUQgICAxMAorI2RlZmluZSBGQUlMT1ZFUl9FVkVOVAkJMTEKKyNkZWZpbmUgRkFJTE9WRVJfTkVFREVEICAgCTEyCisjZGVmaW5lIFNDU0lfUkVTVEFSVF9ORUVERUQJMTMJLyogUHJvY2Vzc2VzIFNDU0kgcmV0cnkgcXVldWUuICovCisjZGVmaW5lIFBPUlRfUkVTVEFSVF9ORUVERUQJMTQJLyogUHJvY2Vzc2VzIFJldHJ5IHF1ZXVlLiAqLworI2RlZmluZSBSRVNUQVJUX1FVRVVFU19ORUVERUQJMTUJLyogUmVzdGFydHMgdGhlIEx1biBxdWV1ZS4gKi8KKyNkZWZpbmUgQUJPUlRfUVVFVUVTX05FRURFRAkxNgorI2RlZmluZSBSRUxPR0lOX05FRURFRAkgICAgICAgIDE3CisjZGVmaW5lIExPR0lOX1JFVFJZX05FRURFRAkxOAkvKiBJbml0aWF0ZSByZXF1aXJlZCBmYWJyaWMgbG9naW5zLiAqLworI2RlZmluZSBSRUdJU1RFUl9GQzRfTkVFREVECTE5CS8qIFNOUyBGQzQgcmVnaXN0cmF0aW9uIHJlcXVpcmVkLiAqLworI2RlZmluZSBJU1BfQUJPUlRfUkVUUlkgICAgICAgICAyMCAgICAgIC8qIElTUCBhYm9ydGVkLiAqLworI2RlZmluZSBGQ1BPUlRfUkVTQ0FOX05FRURFRAkyMSAgICAgIC8qIElPIGRlc2NyaXB0b3IgcHJvY2Vzc2luZyBuZWVkZWQgKi8KKyNkZWZpbmUgSU9ERVNDX1BST0NFU1NfTkVFREVECTIyICAgICAgLyogSU8gZGVzY3JpcHRvciBwcm9jZXNzaW5nIG5lZWRlZCAqLworI2RlZmluZSBJT0NUTF9FUlJPUl9SRUNPVkVSWQkyMyAgICAgIAorI2RlZmluZSBMT09QX1JFU0VUX05FRURFRAkyNAorCisJdWludDMyX3QJZGV2aWNlX2ZsYWdzOworI2RlZmluZSBERkxHX0xPQ0FMX0RFVklDRVMJCUJJVF8wCisjZGVmaW5lIERGTEdfUkVUUllfTE9DQUxfREVWSUNFUwlCSVRfMQorI2RlZmluZSBERkxHX0ZBQlJJQ19ERVZJQ0VTCQlCSVRfMgorI2RlZmluZQlTV0lUQ0hfRk9VTkQJCQlCSVRfMworI2RlZmluZQlERkxHX05PX0NBQkxFCQkJQklUXzQKKworCS8qIFNSQiBjYWNoZS4gKi8KKyNkZWZpbmUgU1JCX01JTl9SRVEJMTI4CisJbWVtcG9vbF90CSpzcmJfbWVtcG9vbDsKKworCS8qIFRoaXMgc3BpbmxvY2sgaXMgdXNlZCB0byBwcm90ZWN0ICJpbyB0cmFuc2FjdGlvbnMiLCB5b3UgbXVzdAkKKwkgKiBhcXVpcmUgaXQgYmVmb3JlIGRvaW5nIGFueSBJTyB0byB0aGUgY2FyZCwgZWcgd2l0aCBSRF9SRUcqKCkgYW5kCisJICogV1JUX1JFRyooKSBmb3IgdGhlIGR1cmF0aW9uIG9mIHlvdXIgZW50aXJlIGNvbW1hbmR0cmFuc2FjdGlvbi4KKwkgKgorCSAqIFRoaXMgc3BpbmxvY2sgaXMgb2YgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgaW8gcmVxdWVzdCBsb2NrLgorCSAqLworCisJc3BpbmxvY2tfdAkJaGFyZHdhcmVfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqaW9iYXNlOwkJLyogQmFzZSBJL08gYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJcGlvX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZwlwaW9fbGVuZ3RoOworI2RlZmluZSBNSU5fSU9CQVNFX0xFTgkJMHgxMDAKKworCS8qIElTUCByaW5nIGxvY2ssIHJpbmdzLCBhbmQgaW5kZXhlcyAqLworCWRtYV9hZGRyX3QJcmVxdWVzdF9kbWE7ICAgICAgICAvKiBQaHlzaWNhbCBhZGRyZXNzLiAqLworCXJlcXVlc3RfdCAgICAgICAqcmVxdWVzdF9yaW5nOyAgICAgIC8qIEJhc2UgdmlydHVhbCBhZGRyZXNzICovCisJcmVxdWVzdF90ICAgICAgICpyZXF1ZXN0X3JpbmdfcHRyOyAgLyogQ3VycmVudCBhZGRyZXNzLiAqLworCXVpbnQxNl90ICAgICAgICByZXFfcmluZ19pbmRleDsgICAgIC8qIEN1cnJlbnQgaW5kZXguICovCisJdWludDE2X3QgICAgICAgIHJlcV9xX2NudDsgICAgICAgICAgLyogTnVtYmVyIG9mIGF2YWlsYWJsZSBlbnRyaWVzLiAqLworCXVpbnQxNl90CXJlcXVlc3RfcV9sZW5ndGg7CisKKwlkbWFfYWRkcl90CXJlc3BvbnNlX2RtYTsgICAgICAgLyogUGh5c2ljYWwgYWRkcmVzcy4gKi8KKwlyZXNwb25zZV90ICAgICAgKnJlc3BvbnNlX3Jpbmc7ICAgICAvKiBCYXNlIHZpcnR1YWwgYWRkcmVzcyAqLworCXJlc3BvbnNlX3QgICAgICAqcmVzcG9uc2VfcmluZ19wdHI7IC8qIEN1cnJlbnQgYWRkcmVzcy4gKi8KKwl1aW50MTZfdCAgICAgICAgcnNwX3JpbmdfaW5kZXg7ICAgICAvKiBDdXJyZW50IGluZGV4LiAqLworCXVpbnQxNl90CXJlc3BvbnNlX3FfbGVuZ3RoOworICAgIAorCXVpbnQxNl90CSgqY2FsY19yZXF1ZXN0X2VudHJpZXMpKHVpbnQxNl90KTsKKwl2b2lkCQkoKmJ1aWxkX3Njc2lfaW9jYnMpKHNyYl90ICosIGNtZF9lbnRyeV90ICosIHVpbnQxNl90KTsKKworCS8qIE91dHN0YW5kaW5ncyBJU1AgY29tbWFuZHMuICovCisJc3JiX3QJCSpvdXRzdGFuZGluZ19jbWRzW01BWF9PVVRTVEFORElOR19DT01NQU5EU107CisJdWludDMyX3QJY3VycmVudF9vdXRzdGFuZGluZ19jbWQ7IAorCXNyYl90CQkqc3RhdHVzX3NyYjsJLyogU3RhdHVzIGNvbnRpbnVhdGlvbiBlbnRyeS4gKi8KKworCS8qCisJICogTmVlZCB0byBob2xkIHRoZSBsaXN0X2xvY2sgd2l0aCBpcnEncyBkaXNhYmxlZCBpbiBvcmRlciB0byBhY2Nlc3MKKwkgKiB0aGUgZm9sbG93aW5nIGxpc3QuCisJICoKKwkgKiBUaGlzIGxpc3RfbG9jayBpcyBvZiBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBob3N0X2xvY2suCisJICovCisJc3BpbmxvY2tfdAkJbGlzdF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwkJCQkJCS8qIGxvY2sgdG8gZ3VhcmQgbGlzdHMgd2hpY2gKKwkJCQkJCSAqIGhvbGQgc3JiX3QncyAqLworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICByZXRyeV9xdWV1ZTsgICAgLyogd2F0Y2hkb2cgcXVldWUgKi8KKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAgICAgICAgZG9uZV9xdWV1ZTsgICAgIC8qIGpvYiBvbiBkb25lIHF1ZXVlICovCisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGZhaWxvdmVyX3F1ZXVlOyAvKiBmYWlsb3ZlciBsaXN0IGxpbmsuICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgc2NzaV9yZXRyeV9xdWV1ZTsgICAgIC8qIFNDU0kgcmV0cnkgcXVldWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBwZW5kaW5nX3F1ZXVlOwkvKiBTQ1NJIGNvbW1hbmQgcGVuZGluZyBxdWV1ZSAqLworCisJdW5zaWduZWQgbG9uZyAgICBkb25lX3FfY250OworCXVuc2lnbmVkIGxvbmcgICAgcGVuZGluZ19pbl9xOworICAgICAgICB1aW50MzJfdAlyZXRyeV9xX2NudDsgCisgICAgICAgIHVpbnQzMl90CXNjc2lfcmV0cnlfcV9jbnQ7IAorICAgICAgICB1aW50MzJfdAlmYWlsb3Zlcl9jbnQ7IAorCisJdW5zaWduZWQgbG9uZwlsYXN0X2lycV9jcHU7CS8qIGNwdSB3aGVyZSB3ZSBnb3Qgb3VyIGxhc3QgaXJxICovCisKKwl1aW50MTZfdCAgICAgICAgICAgcmV2aXNpb247CisJdWludDhfdCAgICAgICAgICAgcG9ydHM7CisJdV9sb25nICAgICAgICAgICAgYWN0dGhyZWFkczsKKwl1X2xvbmcgICAgICAgICAgICBpcHJlcV9jbnQ7CisJdV9sb25nICAgICAgICAgICAgcXRocmVhZHM7CisKKwl1aW50MzJfdCAgICAgICAgdG90YWxfaXNyX2NudDsJCS8qIEludGVycnVwdCBjb3VudCAqLworCXVpbnQzMl90ICAgICAgICB0b3RhbF9pc3BfYWJvcnRzOwkvKiBjb250cm9sbGVyIGVyciBjbnQgKi8KKwl1aW50MzJfdCAgICAgICAgdG90YWxfbGlwX2NudDsJCS8qIExJUCBjbnQgKi8KKwl1aW50MzJfdAl0b3RhbF9kZXZfZXJyczsJCS8qIGRldmljZSBlcnJvciBjbnQgKi8KKwl1aW50MzJfdAl0b3RhbF9pb3M7CQkvKiBJTyBjbnQgKi8KKwl1aW50NjRfdAl0b3RhbF9ieXRlczsJCS8qIHhmciBieXRlIGNudCAqLworCXVpbnQzMl90CXRvdGFsX21ieF90aW1lb3V0OwkvKiBtYWlsYm94IHRpbWVvdXQgY250ICovCisJdWludDMyX3QgCXRvdGFsX2xvb3BfcmVzeW5jOyAJLyogbG9vcCByZXN5biBjbnQgKi8KKwl1aW50MzJfdAlkcm9wcGVkX2ZyYW1lX2Vycm9yX2NudDsKKworCS8qIElTUCBjb25maWd1cmF0aW9uIGRhdGEuICovCisJdWludDE2X3QJbG9vcF9pZDsJCS8qIEhvc3QgYWRhcHRlciBsb29wIGlkICovCisJdWludDE2X3QJZmJfcmV2OworCisJcG9ydF9pZF90CWRfaWQ7CQkJLyogSG9zdCBhZGFwdGVyIHBvcnQgaWQgKi8KKwl1aW50MTZfdAltYXhfcHVibGljX2xvb3BfaWRzOworCXVpbnQxNl90CW1pbl9leHRlcm5hbF9sb29waWQ7CS8qIEZpcnN0IGV4dGVybmFsIGxvb3AgSWQgKi8KKworCXVpbnQxNl90CWxpbmtfZGF0YV9yYXRlOwkJLyogRi9XIG9wZXJhdGluZyBzcGVlZCAqLworCisJdWludDhfdAkJY3VycmVudF90b3BvbG9neTsKKwl1aW50OF90CQlwcmV2X3RvcG9sb2d5OworI2RlZmluZSBJU1BfQ0ZHX05MCTEKKyNkZWZpbmUgSVNQX0NGR19OCTIKKyNkZWZpbmUgSVNQX0NGR19GTAk0CisjZGVmaW5lIElTUF9DRkdfRgk4CisKKwl1aW50OF90CQlvcGVyYXRpbmdfbW9kZTsJCS8qIEYvVyBvcGVyYXRpbmcgbW9kZSAqLworI2RlZmluZSBMT09QICAgICAgMAorI2RlZmluZSBQMlAgICAgICAgMQorI2RlZmluZSBMT09QX1AyUCAgMgorI2RlZmluZSBQMlBfTE9PUCAgMworCisgICAgICAgIHVpbnQ4X3QJCW1hcmtlcl9uZWVkZWQ7IAorCXVpbnQ4X3QJCXNuc19yZXRyeV9jbnQ7CisJdWludDhfdAkJbWVtX2VycjsKKworCXVpbnQ4X3QJCWludGVycnVwdHNfb247CisKKwkvKiBIQkEgc2VyaWFsIG51bWJlciAqLworCXVpbnQ4X3QJCXNlcmlhbDA7CisJdWludDhfdAkJc2VyaWFsMTsKKwl1aW50OF90CQlzZXJpYWwyOworCisJLyogTlZSQU0gY29uZmlndXJhdGlvbiBkYXRhICovCisJdWludDE2X3QJbnZyYW1fYmFzZTsKKworCXVpbnQxNl90CWxvb3BfcmVzZXRfZGVsYXk7CisJdWludDE2X3QJbWluaW11bV90aW1lb3V0OworCXVpbnQ4X3QJCXJldHJ5X2NvdW50OworCXVpbnQ4X3QJCWxvZ2luX3RpbWVvdXQ7CisJdWludDE2X3QJcl9hX3RvdjsKKwlpbnQJCXBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwl1aW50OF90CQlsb29wX2Rvd25fdGltZW91dDsKKwl1aW50OF90CQltYnhfY291bnQ7CisJdWludDE2X3QJbWF4X3Byb2JlX2x1bnM7CisJdWludDE2X3QJbWF4X2x1bnM7CisJdWludDE2X3QJbWF4X3RhcmdldHM7CisJdWludDE2X3QJbGFzdF9sb29wX2lkOworCisgICAgICAgIHVpbnQzMl90CWxvZ2luX3JldHJ5X2NvdW50OyAKKworCS8qIEZpYnJlIENoYW5uZWwgRGV2aWNlIExpc3QuICovCisJc3RydWN0IGxpc3RfaGVhZAlmY3BvcnRzOworCXN0cnVjdCBsaXN0X2hlYWQJcnNjbl9mY3BvcnRzOworCisJc3RydWN0IGlvX2Rlc2NyaXB0b3IJaW9fZGVzY3JpcHRvcnNbTUFYX0lPX0RFU0NSSVBUT1JTXTsKKwl1aW50MTZfdAkJaW9kZXNjX3NpZ25hdHVyZTsKKworCS8qIE9TIHRhcmdldCBxdWV1ZSBwb2ludGVycy4gKi8KKwlvc190Z3RfdAkJKm90Z3RbTUFYX0ZJQlJFX0RFVklDRVNdOworCisJLyogUlNDTiBxdWV1ZS4gKi8KKwl1aW50MzJfdCByc2NuX3F1ZXVlW01BWF9SU0NOX0NPVU5UXTsKKwl1aW50OF90IHJzY25faW5fcHRyOworCXVpbnQ4X3QgcnNjbl9vdXRfcHRyOworCisJLyogU05TIGNvbW1hbmQgaW50ZXJmYWNlcy4gKi8KKwltc19pb2NiX2VudHJ5X3QJCSptc19pb2NiOworCWRtYV9hZGRyX3QJCW1zX2lvY2JfZG1hOworCXN0cnVjdCBjdF9zbnNfcGt0CSpjdF9zbnM7CisJZG1hX2FkZHJfdAkJY3Rfc25zX2RtYTsKKwkvKiBTTlMgY29tbWFuZCBpbnRlcmZhY2VzIGZvciAyMjAwLiAqLworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKwlkbWFfYWRkcl90CQlzbnNfY21kX2RtYTsKKworCXBpZF90CQkJZHBjX3BpZDsKKwlpbnQJCQlkcGNfc2hvdWxkX2RpZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglkcGNfaW5pdGVkOworCXN0cnVjdCBjb21wbGV0aW9uCWRwY19leGl0ZWQ7CisJc3RydWN0IHNlbWFwaG9yZQkqZHBjX3dhaXQ7CisJdWludDhfdCBkcGNfYWN0aXZlOyAgICAgICAgICAgICAgICAgIC8qIERQQyByb3V0aW5lIGlzIGFjdGl2ZSAqLworCisJLyogVGltZW91dCB0aW1lcnMuICovCisJdWludDhfdCAgICAgICAgIHF1ZXVlX3Jlc3RhcnRfdGltZXI7ICAgCisJdWludDhfdCAgICAgICAgIGxvb3BfZG93bl9hYm9ydF90aW1lOyAgICAvKiBwb3J0IGRvd24gdGltZXIgKi8KKwlhdG9taWNfdCAgICAgICAgbG9vcF9kb3duX3RpbWVyOyAgICAgICAgIC8qIGxvb3AgZG93biB0aW1lciAqLworCXVpbnQ4X3QgICAgICAgICBsaW5rX2Rvd25fdGltZW91dDsgICAgICAgLyogbGluayBkb3duIHRpbWVvdXQgKi8KKworCXVpbnQzMl90ICAgICAgICB0aW1lcl9hY3RpdmU7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgIHRpbWVyOworCisJZG1hX2FkZHJfdAlnaWRfbGlzdF9kbWE7CisJc3RydWN0IGdpZF9saXN0X2luZm8gKmdpZF9saXN0OworCisJZG1hX2FkZHJfdAlybGNfcnNwX2RtYTsKKwlycHRfbHVuX2NtZF9yc3BfdCAqcmxjX3JzcDsKKworCS8qIFNtYWxsIERNQSBwb29sIGFsbG9jYXRpb25zIC0tIG1heGltdW0gMjU2IGJ5dGVzIGluIGxlbmd0aC4gKi8gCisjZGVmaW5lIERNQV9QT09MX1NJWkUJMjU2CisJc3RydWN0IGRtYV9wb29sICpzX2RtYV9wb29sOworCisJZG1hX2FkZHJfdAlpbml0X2NiX2RtYTsKKwlpbml0X2NiX3QgICAgICAgKmluaXRfY2I7CisKKwlkbWFfYWRkcl90CWlvZGVzY19wZF9kbWE7CisJcG9ydF9kYXRhYmFzZV90ICppb2Rlc2NfcGQ7CisKKwkvKiBUaGVzZSBhcmUgdXNlZCBieSBtYWlsYm94IG9wZXJhdGlvbnMuICovCisJdm9sYXRpbGUgdWludDE2X3QgbWFpbGJveF9vdXRbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisKKwltYnhfY21kX3QJKm1jcDsKKwl1bnNpZ25lZCBsb25nCW1ieF9jbWRfZmxhZ3M7CisjZGVmaW5lIE1CWF9JTlRFUlJVUFQJMQorI2RlZmluZSBNQlhfSU5UUl9XQUlUCTIKKyNkZWZpbmUgTUJYX1VQREFURV9GTEFTSF9BQ1RJVkUJMworCisJc3BpbmxvY2tfdAltYnhfcmVnX2xvY2s7ICAgLyogTWJ4IENtZCBSZWdpc3RlciBMb2NrICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIG1ieF9jbWRfc2VtOwkvKiBTZXJpYWxpYWxpemUgbWJ4IGFjY2VzcyAqLworCXN0cnVjdCBzZW1hcGhvcmUgbWJ4X2ludHJfc2VtOyAgLyogVXNlZCBmb3IgY29tcGxldGlvbiBub3RpZmljYXRpb24gKi8KKworCXVpbnQzMl90CW1ieF9mbGFnczsKKyNkZWZpbmUgIE1CWF9JTl9QUk9HUkVTUwlCSVRfMAorI2RlZmluZSAgTUJYX0JVU1kJCUJJVF8xCS8qIEdvdCB0aGUgQWNjZXNzICovCisjZGVmaW5lICBNQlhfU0xFRVBJTkdfT05fU0VNCUJJVF8yIAorI2RlZmluZSAgTUJYX1BPTExJTkdfRk9SX0NPTVAJQklUXzMKKyNkZWZpbmUgIE1CWF9DT01QTEVURUQJCUJJVF80CisjZGVmaW5lICBNQlhfVElNRURPVVQJCUJJVF81IAorI2RlZmluZSAgTUJYX0FDQ0VTU19USU1FRE9VVAlCSVRfNgorCisJbWJ4X2NtZF90IAltYzsKKworCXVpbnQ4X3QJKmNtZGxpbmU7CisKKwl1aW50MzJfdCBmYWlsb3Zlcl90eXBlOworCXVpbnQzMl90IGZhaWxiYWNrX2RlbGF5OworCXVuc2lnbmVkIGxvbmcgICBjZmdfZmxhZ3M7CisjZGVmaW5lCUNGR19BQ1RJVkUJMAkvKiBDRkcgZHVyaW5nIGEgZmFpbG92ZXIsIGV2ZW50IHVwZGF0ZSwgb3IgaW9jdGwgKi8KKyNkZWZpbmUJQ0ZHX0ZBSUxPVkVSCTEJLyogQ0ZHIGR1cmluZyBwYXRoIGNoYW5nZSAqLworCisJdWludDMyX3QJYmluZGluZ190eXBlOworI2RlZmluZSBCSU5EX0JZX1BPUlRfTkFNRQkwCisjZGVmaW5lIEJJTkRfQllfUE9SVF9JRAkJMQorCisJLyogQmFzaWMgZmlybXdhcmUgcmVsYXRlZCBpbmZvcm1hdGlvbi4gKi8KKwlzdHJ1Y3QgcWxhX2JvYXJkX2luZm8JKmJyZF9pbmZvOworCXVpbnQxNl90CWZ3X21ham9yX3ZlcnNpb247CisJdWludDE2X3QJZndfbWlub3JfdmVyc2lvbjsKKwl1aW50MTZfdAlmd19zdWJtaW5vcl92ZXJzaW9uOworCXVpbnQxNl90CWZ3X2F0dHJpYnV0ZXM7CisJdWludDMyX3QJZndfbWVtb3J5X3NpemU7CisJdWludDMyX3QJZndfdHJhbnNmZXJfc2l6ZTsKKworCXVpbnQxNl90CWZ3X29wdGlvbnNbMTZdOwkJLyogc2xvdHM6IDEsMiwzLDEwLDExICovCisJdWludDhfdAkJZndfc2VyaWFsbGlua19vcHRpb25zWzRdOworCisJLyogRmlybXdhcmUgZHVtcCBpbmZvcm1hdGlvbi4gKi8KKwl2b2lkCQkqZndfZHVtcDsKKwlpbnQJCWZ3X2R1bXBfb3JkZXI7CisJaW50CQlmd19kdW1wX3JlYWRpbmc7CisJY2hhcgkJKmZ3X2R1bXBfYnVmZmVyOworCWludAkJZndfZHVtcF9idWZmZXJfbGVuOworCisJdWludDhfdAkJaG9zdF9zdHJbMTZdOworCXVpbnQxNl90CXBjaV9hdHRyOworCisJdWludDE2X3QJcHJvZHVjdF9pZFs0XTsKKworCXVpbnQ4X3QJCW1vZGVsX251bWJlclsxNisxXTsKKyNkZWZpbmUgQklOWkVSTwkJIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIgorCWNoYXIJCSptb2RlbF9kZXNjOworCisJdWludDhfdCAgICAgbm9kZV9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90ICAgICBudnJhbV92ZXJzaW9uOyAKKwl1aW50MzJfdCAgICBpc3BfYWJvcnRfY250OworCisJLyogQWRhcHRlciBJL08gc3RhdGlzdGljcyBmb3IgZmFpbG92ZXIgKi8KKwl1aW50NjRfdAlJb3NSZXF1ZXN0ZWQ7CisJdWludDY0X3QJQnl0ZXNSZXF1ZXN0ZWQ7CisJdWludDY0X3QJSW9zRXhlY3V0ZWQ7CisJdWludDY0X3QJQnl0ZXNFeGVjdXRlZDsKKworCS8qIE5lZWRlZCBmb3IgQkVBQ09OICovCisJdWludDE2X3QJYmVhY29uX2JsaW5rX2xlZDsKKwl1aW50MTZfdAliZWFjb25fZ3JlZW5fb247Cit9IHNjc2lfcWxhX2hvc3RfdDsKKworCisvKgorICogTWFjcm9zIHRvIGhlbHAgY29kZSwgbWFpbnRhaW4sIGV0Yy4KKyAqLworI2RlZmluZSBMT09QX1RSQU5TSVRJT04oaGEpIFwKKwkodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpIHx8IFwKKwkgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpCisKKyNkZWZpbmUgTE9PUF9OT1RfUkVBRFkoaGEpIFwKKwkoKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSB8fCBcCisJICB0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykgfHwgXAorCSAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwgXAorCSAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpIHx8IFwKKwkgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pCisJCQkJIAorI2RlZmluZSBMT09QX1JEWShoYSkJKCFMT09QX05PVF9SRUFEWShoYSkpCisKKyNkZWZpbmUgVEdUX1EoaGEsIHQpIChoYS0+b3RndFt0XSkKKyNkZWZpbmUgTFVOX1EoaGEsIHQsIGwpCShUR1RfUShoYSwgdCktPm9sdW5bbF0pCisjZGVmaW5lIEdFVF9MVV9RKGhhLCB0LCBsKSAoKFRHVF9RKGhhLHQpICE9IE5VTEwpPyBUR1RfUShoYSwgdCktPm9sdW5bbF0gOiBOVUxMKQorCisjZGVmaW5lIHRvX3FsYV9ob3N0KHgpCQkoKHNjc2lfcWxhX2hvc3RfdCAqKSAoeCktPmhvc3RkYXRhKQorCisjZGVmaW5lIHFsYV9wcmludGsobGV2ZWwsIGhhLCBmb3JtYXQsIGFyZy4uLikgXAorCWRldl9wcmludGsobGV2ZWwgLCAmKChoYSktPnBkZXYtPmRldikgLCBmb3JtYXQgLCAjIyBhcmcpCisKKy8qCisgKiBxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBNQlNfTUFTSwkJMHgzZmZmCisKKyNkZWZpbmUgUUxBX1NVQ0NFU1MJCShNQlNfQ09NTUFORF9DT01QTEVURSAmIE1CU19NQVNLKQorI2RlZmluZSBRTEFfSU5WQUxJRF9DT01NQU5ECShNQlNfSU5WQUxJRF9DT01NQU5EICYgTUJTX01BU0spCisjZGVmaW5lIFFMQV9JTlRFUkZBQ0VfRVJST1IJKE1CU19IT1NUX0lOVEVSRkFDRV9FUlJPUiAmIE1CU19NQVNLKQorI2RlZmluZSBRTEFfVEVTVF9GQUlMRUQJCShNQlNfVEVTVF9GQUlMRUQgJiBNQlNfTUFTSykKKyNkZWZpbmUgUUxBX0NPTU1BTkRfRVJST1IJKE1CU19DT01NQU5EX0VSUk9SICYgTUJTX01BU0spCisjZGVmaW5lIFFMQV9QQVJBTUVURVJfRVJST1IJKE1CU19DT01NQU5EX1BBUkFNRVRFUl9FUlJPUiAmIE1CU19NQVNLKQorI2RlZmluZSBRTEFfUE9SVF9JRF9VU0VECShNQlNfUE9SVF9JRF9VU0VEICYgTUJTX01BU0spCisjZGVmaW5lIFFMQV9MT09QX0lEX1VTRUQJKE1CU19MT09QX0lEX1VTRUQgJiBNQlNfTUFTSykKKyNkZWZpbmUgUUxBX0FMTF9JRFNfSU5fVVNFCShNQlNfQUxMX0lEU19JTl9VU0UgJiBNQlNfTUFTSykKKyNkZWZpbmUgUUxBX05PVF9MT0dHRURfSU4JKE1CU19OT1RfTE9HR0VEX0lOICYgTUJTX01BU0spCisKKyNkZWZpbmUgUUxBX0ZVTkNUSU9OX1RJTUVPVVQJCTB4MTAwCisjZGVmaW5lIFFMQV9GVU5DVElPTl9QQVJBTUVURVJfRVJST1IJMHgxMDEKKyNkZWZpbmUgUUxBX0ZVTkNUSU9OX0ZBSUxFRAkJMHgxMDIKKyNkZWZpbmUgUUxBX01FTU9SWV9BTExPQ19GQUlMRUQJCTB4MTAzCisjZGVmaW5lIFFMQV9MT0NLX1RJTUVPVVQJCTB4MTA0CisjZGVmaW5lIFFMQV9BQk9SVEVECQkJMHgxMDUKKyNkZWZpbmUgUUxBX1NVU1BFTkRFRAkJCTB4MTA2CisjZGVmaW5lIFFMQV9CVVNZCQkJMHgxMDcKKyNkZWZpbmUgUUxBX1JTQ05TX0hBTkRMRUQJCTB4MTA4CisKKy8qCisqIFN0YXQgaW5mbyBmb3IgYWxsIGFkcGF0ZXJzCisqLworc3RydWN0IF9xbGEyeDAwc3RhdHMgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgIG1ib3h0b3V0OyAgICAgICAgICAgIC8qIG1haWxib3ggdGltZW91dHMgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgIG1ib3hlcnI7ICAgICAgICAgICAgIC8qIG1haWxib3ggZXJyb3JzICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBpc3BBYm9ydDsgICAgICAgICAgICAvKiBJU1AgYWJvcnRzICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBkZWJ1Z05vOworICAgICAgICB1bnNpZ25lZCBsb25nICAgbG9vcF9yZXN5bmM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvdXRhcnJheV9mdWxsOworICAgICAgICB1bnNpZ25lZCBsb25nICAgcmV0cnlfcV9jbnQ7Cit9OworCisjZGVmaW5lIE5WUkFNX0RFTEFZKCkJCXVkZWxheSgxMCkKKworI2RlZmluZSBJTlZBTElEX0hBTkRMRQkoTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKzEpCisKKy8qCisgKiBGbGFzaCBzdXBwb3J0IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgRkxBU0hfSU1BR0VfU0laRQkxMzEwNzIKKworI2luY2x1ZGUgInFsYV9nYmwuaCIKKyNpbmNsdWRlICJxbGFfZGJnLmgiCisjaW5jbHVkZSAicWxhX2lubGluZS5oIgorI2luY2x1ZGUgInFsYV9saXN0b3BzLmgiCisKKy8qCisqIFN0cmluZyBhcnJheXMKKyovCisjZGVmaW5lIExJTkVTSVpFICAgIDI1NgorI2RlZmluZSBNQVhBUkdTICAgICAgMjYKKworI2RlZmluZSBDTURfU1AoQ21uZCkJCSgoQ21uZCktPlNDcC5wdHIpCisjZGVmaW5lIENNRF9DT01QTF9TVEFUVVMoQ21uZCkgICgoQ21uZCktPlNDcC50aGlzX3Jlc2lkdWFsKQorI2RlZmluZSBDTURfUkVTSURfTEVOKENtbmQpCSgoQ21uZCktPlNDcC5idWZmZXJzX3Jlc2lkdWFsKQorI2RlZmluZSBDTURfU0NTSV9TVEFUVVMoQ21uZCkJKChDbW5kKS0+U0NwLlN0YXR1cykKKyNkZWZpbmUgQ01EX0FDVFVBTF9TTlNMRU4oQ21uZCkJKChDbW5kKS0+U0NwLk1lc3NhZ2UpCisjZGVmaW5lIENNRF9FTlRSWV9TVEFUVVMoQ21uZCkJKChDbW5kKS0+U0NwLmhhdmVfZGF0YV9pbikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGV2dGJsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGV2dGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlNDgwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZXZ0YmwuaApAQCAtMCwwICsxLDExMCBAQAorI2RlZmluZSBRTEFfTU9ERUxfTkFNRVMgICAgICAgICAweDMyCisKKy8qCisgKiBBZGFwdGVyIG1vZGVsIG5hbWVzLgorICovCitzdGF0aWMgY2hhciAqcWxhMngwMF9tb2RlbF9uYW1lW1FMQV9NT0RFTF9OQU1FU10gPSB7CisJIlFMQTIzNDAiLAkvKiAweDEwMCAqLworCSJRTEEyMzQyIiwJLyogMHgxMDEgKi8KKwkiUUxBMjM0NCIsCS8qIDB4MTAyICovCisJIlFDUDIzNDIiLAkvKiAweDEwMyAqLworCSJRU0IyMzQwIiwJLyogMHgxMDQgKi8KKwkiUVNCMjM0MiIsCS8qIDB4MTA1ICovCisJIlFMQTIzMTAiLAkvKiAweDEwNiAqLworCSJRTEEyMzMyIiwJLyogMHgxMDcgKi8KKwkiUUNQMjMzMiIsCS8qIDB4MTA4ICovCisJIlFDUDIzNDAiLAkvKiAweDEwOSAqLworCSJRTEEyMzQyIiwJLyogMHgxMGEgKi8KKwkiUUNQMjM0MiIsCS8qIDB4MTBiICovCisJIlFMQTIzNTAiLAkvKiAweDEwYyAqLworCSJRTEEyMzUyIiwJLyogMHgxMGQgKi8KKwkiUUxBMjM1MiIsCS8qIDB4MTBlICovCisJIkhQUSBTVlMiLAkvKiAweDEwZiAqLworCSJIUFEgU1ZTIiwJLyogMHgxMTAgKi8KKwkiICIsCQkvKiAweDExMSAqLworCSIgIiwJCS8qIDB4MTEyICovCisJIiAiLAkJLyogMHgxMTMgKi8KKwkiICIsCQkvKiAweDExNCAqLworCSJRTEEyMzYwIiwJLyogMHgxMTUgKi8KKwkiUUxBMjM2MiIsCS8qIDB4MTE2ICovCisJIlFMRTIzNjAiLAkvKiAweDExNyAqLworCSJRTEUyMzYyIiwJLyogMHgxMTggKi8KKwkiUUxBMjAwIiwJLyogMHgxMTkgKi8KKwkiUUxBMjAwQyIsCS8qIDB4MTFhICovCisJIlFMQTIwMFAiLAkvKiAweDExYiAqLworCSJRTEEyMDBQIiwJLyogMHgxMWMgKi8KKwkiICIsCQkvKiAweDExZCAqLworCSIgIiwJCS8qIDB4MTFlICovCisJIiAiLAkJLyogMHgxMWYgKi8KKwkiICIsCQkvKiAweDEyMCAqLworCSIgIiwJCS8qIDB4MTIxICovCisJIiAiLAkJLyogMHgxMjIgKi8KKwkiICIsCQkvKiAweDEyMyAqLworCSIgIiwJCS8qIDB4MTI0ICovCisJIiAiLAkJLyogMHgxMjUgKi8KKwkiICIsCQkvKiAweDEyNiAqLworCSIgIiwJCS8qIDB4MTI3ICovCisJIiAiLAkJLyogMHgxMjggKi8KKwkiICIsCQkvKiAweDEyOSAqLworCSIgIiwJCS8qIDB4MTJhICovCisJIiAiLAkJLyogMHgxMmIgKi8KKwkiICIsCQkvKiAweDEyYyAqLworCSIgIiwJCS8qIDB4MTJkICovCisJIiAiLAkJLyogMHgxMmUgKi8KKwkiUUxBMjEwIiwJLyogMHgxMmYgKi8KKwkiRU1DIDI1MCIsCS8qIDB4MTMwICovCisJIkhQIEE3NTM4QSIJLyogMHgxMzEgKi8KK307CisKK3N0YXRpYyBjaGFyICpxbGEyeDAwX21vZGVsX2Rlc2NbUUxBX01PREVMX05BTUVTXSA9IHsKKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQywgU2luZ2xlIENoYW5uZWwiLAkvKiAweDEwMCAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDLCBEdWFsIENoYW5uZWwiLAkJLyogMHgxMDEgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQywgUXVhZCBDaGFubmVsIiwJCS8qIDB4MTAyICovCisJIiAiLAkJCQkJCS8qIDB4MTAzICovCisJIiAiLAkJCQkJCS8qIDB4MTA0ICovCisJIiAiLAkJCQkJCS8qIDB4MTA1ICovCisJIiAiLAkJCQkJCS8qIDB4MTA2ICovCisJIiAiLAkJCQkJCS8qIDB4MTA3ICovCisJIiAiLAkJCQkJCS8qIDB4MTA4ICovCisJIiAiLAkJCQkJCS8qIDB4MTA5ICovCisJIiAiLAkJCQkJCS8qIDB4MTBhICovCisJIiAiLAkJCQkJCS8qIDB4MTBiICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMsIFNpbmdsZSBDaGFubmVsIiwJLyogMHgxMGMgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQywgRHVhbCBDaGFubmVsIiwJCS8qIDB4MTBkICovCisJIiAiLAkJCQkJCS8qIDB4MTBlICovCisJIkhQUSBTVlMgSEJBLSBJbml0aWF0b3IgZGV2aWNlIiwJCS8qIDB4MTBmICovCisJIkhQUSBTVlMgSEJBLSBUYXJnZXQgZGV2aWNlIiwJCQkvKiAweDExMCAqLworCSIgIiwJCQkJCQkvKiAweDExMSAqLworCSIgIiwJCQkJCQkvKiAweDExMiAqLworCSIgIiwJCQkJCQkvKiAweDExMyAqLworCSIgIiwJCQkJCQkvKiAweDExNCAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDIFNpbmdsZSBDaGFubmVsIiwJLyogMHgxMTUgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQyBEdWFsIENoYW5uZWwiLAkJLyogMHgxMTYgKi8KKwkiUENJLUV4cHJlc3MgdG8gMkdiIEZDLCBTaW5nbGUgQ2hhbm5lbCIsCS8qIDB4MTE3ICovCisJIlBDSS1FeHByZXNzIHRvIDJHYiBGQywgRHVhbCBDaGFubmVsIiwJCS8qIDB4MTE4ICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMgT3B0aWNhbCIsCQkvKiAweDExOSAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDIENvcHBlciIsCQkvKiAweDExYSAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDIFNGUCIsCQkJLyogMHgxMWIgKi8KKwkiMTMzTUh6IFBDSS1YIHRvIDJHYiBGQyBTRlAiLAkJCS8qIDB4MTFjICovCisJIiAiLAkJCQkJCS8qIDB4MTFkICovCisJIiAiLAkJCQkJCS8qIDB4MTFlICovCisJIiAiLAkJCQkJCS8qIDB4MTFmICovCisJIiAiLAkJCQkJCS8qIDB4MTIwICovCisJIiAiLAkJCQkJCS8qIDB4MTIxICovCisJIiAiLAkJCQkJCS8qIDB4MTIyICovCisJIiAiLAkJCQkJCS8qIDB4MTIzICovCisJIiAiLAkJCQkJCS8qIDB4MTI0ICovCisJIiAiLAkJCQkJCS8qIDB4MTI1ICovCisJIiAiLAkJCQkJCS8qIDB4MTI2ICovCisJIiAiLAkJCQkJCS8qIDB4MTI3ICovCisJIiAiLAkJCQkJCS8qIDB4MTI4ICovCisJIiAiLAkJCQkJCS8qIDB4MTI5ICovCisJIiAiLAkJCQkJCS8qIDB4MTJhICovCisJIiAiLAkJCQkJCS8qIDB4MTJiICovCisJIiAiLAkJCQkJCS8qIDB4MTJjICovCisJIiAiLAkJCQkJCS8qIDB4MTJkICovCisJIiAiLAkJCQkJCS8qIDB4MTJlICovCisJIjEzM01IeiBQQ0ktWCB0byAyR2IgRkMgU0ZGIiwJCQkvKiAweDEyZiAqLworCSIxMzNNSHogUENJLVggdG8gMkdiIEZDIFNGRiIsCQkJLyogMHgxMzAgKi8KKwkiSFAgMXAyZyBRTEEyMzQwIgkJCQkvKiAweDEzMSAqLworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWRmMmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCkBAIC0wLDAgKzEsMjU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyoKKyogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisqICh3d3cucWxvZ2ljLmNvbSkKKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHbG9iYWwgaW5jbHVkZSBmaWxlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19RTEFfR0JMX0gKKyNkZWZpbmUJX19RTEFfR0JMX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCitleHRlcm4gdm9pZCBxbGEyeDAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKik7CitleHRlcm4gaW50IHFsYTJ4MDBfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCBxbGFfYm9hcmRfaW5mbyAqKTsKKworLyoKKyAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9pbml0LmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiBpbnQgcWxhMngwMF9pbml0aWFsaXplX2FkYXB0ZXIoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGZjX3BvcnRfdCAqcWxhMngwMF9hbGxvY19mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CisKK2V4dGVybiBpbnQgcWxhMngwMF9sb29wX3Jlc3luYyhzY3NpX3FsYV9ob3N0X3QgKik7CisKK2V4dGVybiBpbnQgcWxhMngwMF9maW5kX25ld19sb29wX2lkKHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKik7CitleHRlcm4gaW50IHFsYTJ4MDBfZmFicmljX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKiwgdWludDE2X3QgKik7CitleHRlcm4gaW50IHFsYTJ4MDBfbG9jYWxfZGV2aWNlX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfcmVzdGFydF9xdWV1ZXMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQ4X3QpOworCitleHRlcm4gdm9pZCBxbGEyeDAwX3Jlc2Nhbl9mY3BvcnRzKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworZXh0ZXJuIHZvaWQgcWxhMngwMF90Z3RfZnJlZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCB0KTsKKworZXh0ZXJuIGludCBxbGEyeDAwX2Fib3J0X2lzcChzY3NpX3FsYV9ob3N0X3QgKik7CisKKy8qCisgKiBHbG9iYWwgRGF0YSBpbiBxbGFfb3MuYyBzb3VyY2UgZmlsZS4KKyAqLworZXh0ZXJuIGNoYXIgcWxhMngwMF92ZXJzaW9uX3N0cltdOworCitleHRlcm4gaW50IG51bV9ob3N0czsKK2V4dGVybiBpbnQgYXBpSEJBSW5zdGFuY2U7CisKK2V4dGVybiBzdHJ1Y3QgX3FsYTJ4MDBzdGF0cyBxbGEyeDAwX3N0YXRzOworZXh0ZXJuIGludCBxbDJ4cmV0cnljb3VudDsKK2V4dGVybiBpbnQgcWwyeGxvZ2ludGltZW91dDsKK2V4dGVybiBpbnQgcWxwb3J0X2Rvd25fcmV0cnk7CitleHRlcm4gaW50IHFsMnhtYXhxZGVwdGg7CitleHRlcm4gaW50IGRpc3BsYXlDb25maWc7CitleHRlcm4gaW50IHFsMnhwbG9naWFic2VudGRldmljZTsKK2V4dGVybiBpbnQgcWwyeGVuYWJsZXppbzsKK2V4dGVybiBpbnQgcWwyeGludHJkZWxheXRpbWVyOworZXh0ZXJuIGludCBxbDJ4bG9naW5yZXRyeWNvdW50OworCitleHRlcm4gaW50IENvbmZpZ1JlcXVpcmVkOworCitleHRlcm4gaW50IEJpbmQ7CitleHRlcm4gaW50IHFsMnhzdXNwZW5kY291bnQ7CisjaWYgZGVmaW5lZChNT0RVTEUpCitleHRlcm4gY2hhciAqcWwyeG9wdHM7CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKnFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb25fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIGNoYXIgKik7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfY21kX3RpbWVvdXQoc3JiX3QgKik7CisKK2V4dGVybiBpbnQgX19xbGEyeDAwX3N1c3BlbmRfbHVuKHNjc2lfcWxhX2hvc3RfdCAqLCBvc19sdW5fdCAqLCBpbnQsIGludCwgaW50KTsKKworZXh0ZXJuIHZvaWQgcWxhMngwMF9kb25lKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfbmV4dChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2ZsdXNoX2ZhaWxvdmVyX3Eoc2NzaV9xbGFfaG9zdF90ICosIG9zX2x1bl90ICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF9yZXNldF9sdW5fZm9fY291bnRzKHNjc2lfcWxhX2hvc3RfdCAqLCBvc19sdW5fdCAqKTsKKworZXh0ZXJuIHZvaWQgcWxhMngwMF9leHRlbmRfdGltZW91dChzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChzY3NpX3FsYV9ob3N0X3QgKik7CisKK2V4dGVybiB2b2lkIHFsYTJ4MDBfYWJvcnRfcXVldWVzKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50OF90KTsKKworZXh0ZXJuIHZvaWQgcWxhMngwMF9ibGlua19sZWQoc2NzaV9xbGFfaG9zdF90ICopOworCitleHRlcm4gaW50IHFsYTJ4MDBfZG93bl90aW1lb3V0KHN0cnVjdCBzZW1hcGhvcmUgKiwgdW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfaW9jYi5jIHNvdXJjZSBmaWxlLgorICovCitleHRlcm4gdm9pZCBxbGEyeDAwX2lzcF9jbWQoc2NzaV9xbGFfaG9zdF90ICopOworCitleHRlcm4gdWludDE2X3QgcWxhMngwMF9jYWxjX2lvY2JzXzMyKHVpbnQxNl90KTsKK2V4dGVybiB1aW50MTZfdCBxbGEyeDAwX2NhbGNfaW9jYnNfNjQodWludDE2X3QpOworZXh0ZXJuIHZvaWQgcWxhMngwMF9idWlsZF9zY3NpX2lvY2JzXzMyKHNyYl90ICosIGNtZF9lbnRyeV90ICosIHVpbnQxNl90KTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic182NChzcmJfdCAqLCBjbWRfZW50cnlfdCAqLCB1aW50MTZfdCk7CitleHRlcm4gaW50IHFsYTJ4MDBfc3RhcnRfc2NzaShzcmJfdCAqc3ApOworaW50IHFsYTJ4MDBfbWFya2VyKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQ4X3QpOworaW50IF9fcWxhMngwMF9tYXJrZXIoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90LCB1aW50MTZfdCwgdWludDhfdCk7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfbWJ4LmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiBpbnQKK3FsYTJ4MDBfbG9hZF9yYW0oc2NzaV9xbGFfaG9zdF90ICosIGRtYV9hZGRyX3QsIHVpbnQxNl90LCB1aW50MTZfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfbG9hZF9yYW1fZXh0KHNjc2lfcWxhX2hvc3RfdCAqLCBkbWFfYWRkcl90LCB1aW50MzJfdCwgdWludDE2X3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2V4ZWN1dGVfZncoc2NzaV9xbGFfaG9zdF90ICopOworCitleHRlcm4gdm9pZAorcWxhMngwMF9nZXRfZndfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKiwKKyAgICB1aW50MTZfdCAqLCB1aW50MTZfdCAqLCB1aW50MTZfdCAqLCB1aW50MzJfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9nZXRfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfc2V0X2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX21ieF9yZWdfdGVzdChzY3NpX3FsYV9ob3N0X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9pc3N1ZV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqLCB2b2lkICosIGRtYV9hZGRyX3QsIHNpemVfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfYWJvcnRfY29tbWFuZChzY3NpX3FsYV9ob3N0X3QgKiwgc3JiX3QgKik7CisKKyNpZiBVU0VfQUJPUlRfVEdUCitleHRlcm4gaW50CitxbGEyeDAwX2Fib3J0X3RhcmdldChmY19wb3J0X3QgKmZjcG9ydCk7CisjZW5kaWYKKworZXh0ZXJuIGludAorcWxhMngwMF90YXJnZXRfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90LCB1aW50MTZfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICosIHVpbnQ4X3QgKiwgdWludDhfdCAqLAorICAgIHVpbnQ4X3QgKiwgdWludDE2X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfZ2V0X3JldHJ5X2NudChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDhfdCAqLCB1aW50OF90ICosIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX2luaXRfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90KTsKKworZXh0ZXJuIGludAorcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZShzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICosIHVpbnQ4X3QpOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZShzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKik7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfZ2V0X3BvcnRfbmFtZShzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQ4X3QgKiwgdWludDhfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfbGlwX3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqKTsKKworZXh0ZXJuIGludAorcWxhMngwMF9zZW5kX3NucyhzY3NpX3FsYV9ob3N0X3QgKiwgZG1hX2FkZHJfdCwgdWludDE2X3QsIHNpemVfdCk7CisKK2V4dGVybiBpbnQKK3FsYTJ4MDBfbG9naW5fZmFicmljKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDhfdCwgdWludDhfdCwgdWludDhfdCwKKyAgICB1aW50MTZfdCAqLCB1aW50OF90KTsKKworZXh0ZXJuIGludAorcWxhMngwMF9sb2dpbl9sb2NhbF9kZXZpY2Uoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90LCB1aW50MTZfdCAqLCB1aW50OF90KTsKKworZXh0ZXJuIGludAorcWxhMngwMF9mYWJyaWNfbG9nb3V0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQpOworCitleHRlcm4gaW50CitxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKHNjc2lfcWxhX2hvc3RfdCAqaGEpOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9pZF9saXN0KHNjc2lfcWxhX2hvc3RfdCAqLCB2b2lkICosIGRtYV9hZGRyX3QsIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqLCB1aW50MTZfdCAqLCB1aW50MTZfdCAqLAorICAgIHVpbnQxNl90ICopOworCitleHRlcm4gaW50CitxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcChzY3NpX3FsYV9ob3N0X3QgKmhhLCBjaGFyICpwb3NfbWFwKTsKKworLyoKKyAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9pc3IuYyBzb3VyY2UgZmlsZS4KKyAqLworZXh0ZXJuIGlycXJldHVybl90IHFsYTIxMDBfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiBpcnFyZXR1cm5fdCBxbGEyMzAwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfc3VwLmMgc291cmNlIGZpbGUuCisgKi8KK2V4dGVybiB2b2lkIHFsYTJ4MDBfbG9ja19udnJhbV9hY2Nlc3Moc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgcWxhMngwMF91bmxvY2tfbnZyYW1fYWNjZXNzKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfcmVsZWFzZV9udnJhbV9wcm90ZWN0aW9uKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB1aW50MTZfdCBxbGEyeDAwX2dldF9udnJhbV93b3JkKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBxbGEyeDAwX3dyaXRlX252cmFtX3dvcmQoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90LCB1aW50MTZfdCk7CisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2RiZy5jIHNvdXJjZSBmaWxlLgorICovCitleHRlcm4gdm9pZCBxbGEyMTAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGEyMzAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGEyMTAwX2FzY2lpX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgcWxhMjMwMF9hc2NpaV9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9idWZmZXIodWludDhfdCAqLCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBxbGEyeDAwX3ByaW50X3Njc2lfY21kKHN0cnVjdCBzY3NpX2NtbmQgKik7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfZ3MuYyBzb3VyY2UgZmlsZS4KKyAqLworZXh0ZXJuIGludCBxbGEyeDAwX2dhX254dChzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICopOworZXh0ZXJuIGludCBxbGEyeDAwX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOworZXh0ZXJuIGludCBxbGEyeDAwX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOworZXh0ZXJuIGludCBxbGEyeDAwX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOworZXh0ZXJuIGludCBxbGEyeDAwX3JmdF9pZChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gaW50IHFsYTJ4MDBfcmZmX2lkKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiBpbnQgcWxhMngwMF9ybm5faWQoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGEyeDAwX3Jzbm5fbm4oc2NzaV9xbGFfaG9zdF90ICopOworCisvKgorICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX3JzY24uYyBzb3VyY2UgZmlsZS4KKyAqLworZXh0ZXJuIGZjX3BvcnRfdCAqcWxhMngwMF9hbGxvY19yc2NuX2ZjcG9ydChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKK2V4dGVybiBpbnQgcWxhMngwMF9oYW5kbGVfcG9ydF9yc2NuKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MzJfdCwgZmNfcG9ydF90ICosCisgICAgaW50KTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfcHJvY2Vzc19pb2Rlc2Moc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBtYnhfZW50cnkgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2NhbmNlbF9pb19kZXNjcmlwdG9ycyhzY3NpX3FsYV9ob3N0X3QgKik7CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfeGlvY3RsLmMgc291cmNlIGZpbGUuCisgKi8KKyNkZWZpbmUgcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgY21kLCBtb2RlKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHFsYTJ4MDBfYWxsb2NfaW9jdGxfbWVtKGhhKQkJKDApCisjZGVmaW5lIHFsYTJ4MDBfZnJlZV9pb2N0bF9tZW0oaGEpCQlkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfUUxBX0dCTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWRhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwpAQCAtMCwwICsxLDEwNTkgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCitzdGF0aWMgaW5saW5lIG1zX2lvY2JfZW50cnlfdCAqCitxbGEyeDAwX3ByZXBfbXNfaW9jYihzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QsIHVpbnQzMl90KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3Rfc25zX3JlcSAqCitxbGEyeDAwX3ByZXBfY3RfcmVxKHN0cnVjdCBjdF9zbnNfcmVxICosIHVpbnQxNl90LCB1aW50MTZfdCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNuc19jbWRfcGt0ICoKK3FsYTJ4MDBfcHJlcF9zbnNfY21kKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQxNl90KTsKKworc3RhdGljIGludCBxbGEyeDAwX3Nuc19nYV9ueHQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zbnNfZ2lkX3B0KHNjc2lfcWxhX2hvc3RfdCAqLCBzd19pbmZvX3QgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfc25zX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgc3dfaW5mb190ICopOworc3RhdGljIGludCBxbGEyeDAwX3Nuc19nbm5faWQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zbnNfcmZ0X2lkKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zbnNfcm5uX2lkKHNjc2lfcWxhX2hvc3RfdCAqKTsKKworLyoqCisgKiBxbGEyeDAwX3ByZXBfbXNfaW9jYigpIC0gUHJlcGFyZSBjb21tb24gTVMgSU9DQiBmaWVsZHMgZm9yIFNOUyBDVCBxdWVyeS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQHJlcV9zaXplOiByZXF1ZXN0IHNpemUgaW4gYnl0ZXMKKyAqIEByc3Bfc2l6ZTogcmVzcG9uc2Ugc2l6ZSBpbiBieXRlcworICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBAaGEncyBtc19pb2NiLgorICovCitzdGF0aWMgaW5saW5lIG1zX2lvY2JfZW50cnlfdCAqCitxbGEyeDAwX3ByZXBfbXNfaW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByZXFfc2l6ZSwgdWludDMyX3QgcnNwX3NpemUpCit7CisJbXNfaW9jYl9lbnRyeV90ICptc19wa3Q7CisKKwltc19wa3QgPSBoYS0+bXNfaW9jYjsKKwltZW1zZXQobXNfcGt0LCAwLCBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisKKwltc19wa3QtPmVudHJ5X3R5cGUgPSBNU19JT0NCX1RZUEU7CisJbXNfcGt0LT5lbnRyeV9jb3VudCA9IDE7CisJU0VUX1RBUkdFVF9JRChoYSwgbXNfcGt0LT5sb29wX2lkLCBTSU1QTEVfTkFNRV9TRVJWRVIpOworCW1zX3BrdC0+Y29udHJvbF9mbGFncyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0ZfUkVBRCB8IENGX0hFQURfVEFHKTsKKwltc19wa3QtPnRpbWVvdXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDI1KTsKKwltc19wa3QtPmNtZF9kc2RfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpOworCW1zX3BrdC0+dG90YWxfZHNkX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigyKTsKKwltc19wa3QtPnJzcF9ieXRlY291bnQgPSBjcHVfdG9fbGUzMihyc3Bfc2l6ZSk7CisJbXNfcGt0LT5yZXFfYnl0ZWNvdW50ID0gY3B1X3RvX2xlMzIocmVxX3NpemUpOworCisJbXNfcGt0LT5kc2VnX3JlcV9hZGRyZXNzWzBdID0gY3B1X3RvX2xlMzIoTFNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JlcV9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoTVNEKGhhLT5jdF9zbnNfZG1hKSk7CisJbXNfcGt0LT5kc2VnX3JlcV9sZW5ndGggPSBtc19wa3QtPnJlcV9ieXRlY291bnQ7CisKKwltc19wa3QtPmRzZWdfcnNwX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwltc19wa3QtPmRzZWdfcnNwX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPmN0X3Nuc19kbWEpKTsKKwltc19wa3QtPmRzZWdfcnNwX2xlbmd0aCA9IG1zX3BrdC0+cnNwX2J5dGVjb3VudDsKKworCXJldHVybiAobXNfcGt0KTsKK30KKworLyoqCisgKiBxbGEyeDAwX3ByZXBfY3RfcmVxKCkgLSBQcmVwYXJlIGNvbW1vbiBDVCByZXF1ZXN0IGZpZWxkcyBmb3IgU05TIHF1ZXJ5LgorICogQGN0X3JlcTogQ1QgcmVxdWVzdCBidWZmZXIKKyAqIEBjbWQ6IEdTIGNvbW1hbmQKKyAqIEByc3Bfc2l6ZTogcmVzcG9uc2Ugc2l6ZSBpbiBieXRlcworICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRpdGlhbGl6ZWQgQGN0X3JlcS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3Rfc25zX3JlcSAqCitxbGEyeDAwX3ByZXBfY3RfcmVxKHN0cnVjdCBjdF9zbnNfcmVxICpjdF9yZXEsIHVpbnQxNl90IGNtZCwgdWludDE2X3QgcnNwX3NpemUpCit7CisJbWVtc2V0KGN0X3JlcSwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSk7CisKKwljdF9yZXEtPmhlYWRlci5yZXZpc2lvbiA9IDB4MDE7CisJY3RfcmVxLT5oZWFkZXIuZ3NfdHlwZSA9IDB4RkM7CisJY3RfcmVxLT5oZWFkZXIuZ3Nfc3VidHlwZSA9IDB4MDI7CisJY3RfcmVxLT5jb21tYW5kID0gY3B1X3RvX2JlMTYoY21kKTsKKwljdF9yZXEtPm1heF9yc3Bfc2l6ZSA9IGNwdV90b19iZTE2KChyc3Bfc2l6ZSAtIDE2KSAvIDQpOworCisJcmV0dXJuIChjdF9yZXEpOworfQorCisKKy8qKgorICogcWxhMngwMF9nYV9ueHQoKSAtIFNOUyBzY2FuIGZvciBmYWJyaWMgZGV2aWNlcyB2aWEgR0FfTlhUIGNvbW1hbmQuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBmY3BvcnQ6IGZjcG9ydCBlbnRyeSB0byB1cGRhdGVkCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorcWxhMngwMF9nYV9ueHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpCit7CisJaW50CQlydmFsOworCisJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNfZ2Ffbnh0KGhhLCBmY3BvcnQpKTsKKwl9CisKKwkvKiBJc3N1ZSBHQV9OWFQgKi8KKwkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCisJbXNfcGt0ID0gcWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIEdBX05YVF9SRVFfU0laRSwgR0FfTlhUX1JTUF9TSVpFKTsKKworCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBHQV9OWFRfQ01ELAorCSAgICBHQV9OWFRfUlNQX1NJWkUpOworCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKKworCS8qIFByZXBhcmUgQ1QgYXJndW1lbnRzIC0tIHBvcnRfaWQgKi8KKwljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMF0gPSBmY3BvcnQtPmRfaWQuYi5kb21haW47CisJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzFdID0gZmNwb3J0LT5kX2lkLmIuYXJlYTsKKwljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMl0gPSBmY3BvcnQtPmRfaWQuYi5hbF9wYTsKKworCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJnYV9ueHRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJLyogUG9wdWxhdGUgZmNfcG9ydF90IGVudHJ5LiAqLworCQlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSBjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF9pZFswXTsKKwkJZmNwb3J0LT5kX2lkLmIuYXJlYSA9IGN0X3JzcC0+cnNwLmdhX254dC5wb3J0X2lkWzFdOworCQlmY3BvcnQtPmRfaWQuYi5hbF9wYSA9IGN0X3JzcC0+cnNwLmdhX254dC5wb3J0X2lkWzJdOworCisJCW1lbWNweShmY3BvcnQtPm5vZGVfbmFtZSwgY3RfcnNwLT5yc3AuZ2Ffbnh0Lm5vZGVfbmFtZSwKKwkJICAgIFdXTl9TSVpFKTsKKwkJbWVtY3B5KGZjcG9ydC0+cG9ydF9uYW1lLCBjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF9uYW1lLAorCQkgICAgV1dOX1NJWkUpOworCisJCWlmIChjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF90eXBlICE9IE5TX05fUE9SVF9UWVBFICYmCisJCSAgICBjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF90eXBlICE9IE5TX05MX1BPUlRfVFlQRSkKKwkJCWZjcG9ydC0+ZF9pZC5iLmRvbWFpbiA9IDB4ZjA7CisKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBlbnRyeSAtICIKKwkJICAgICJubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sCisJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVswXSwgZmNwb3J0LT5ub2RlX25hbWVbMV0sCisJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVsyXSwgZmNwb3J0LT5ub2RlX25hbWVbM10sCisJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVs0XSwgZmNwb3J0LT5ub2RlX25hbWVbNV0sCisJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVs2XSwgZmNwb3J0LT5ub2RlX25hbWVbN10sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVswXSwgZmNwb3J0LT5wb3J0X25hbWVbMV0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsyXSwgZmNwb3J0LT5wb3J0X25hbWVbM10sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs0XSwgZmNwb3J0LT5wb3J0X25hbWVbNV0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs2XSwgZmNwb3J0LT5wb3J0X25hbWVbN10sCisJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9naWRfcHQoKSAtIFNOUyBzY2FuIGZvciBmYWJyaWMgZGV2aWNlcyB2aWEgR0lEX1BUIGNvbW1hbmQuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBsaXN0OiBzd2l0Y2ggaW5mbyBlbnRyaWVzIHRvIHBvcHVsYXRlCisgKgorICogTk9URTogTm9uLU54X1BvcnRzIGFyZSBub3QgcmVxdWVzdGVkLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfZ2lkX3B0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDE2X3QJaTsKKworCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKKworCXN0cnVjdCBjdF9zbnNfZ2lkX3B0X2RhdGEgKmdpZF9kYXRhOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNfZ2lkX3B0KGhhLCBsaXN0KSk7CisJfQorCisJZ2lkX2RhdGEgPSBOVUxMOworCisJLyogSXNzdWUgR0lEX1BUICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCBHSURfUFRfUkVRX1NJWkUsIEdJRF9QVF9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgR0lEX1BUX0NNRCwKKwkgICAgR0lEX1BUX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X3R5cGUgKi8KKwljdF9yZXEtPnJlcS5naWRfcHQucG9ydF90eXBlID0gTlNfTlhfUE9SVF9UWVBFOworCisJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKKwkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKGN0X3JzcC0+aGVhZGVyLnJlc3BvbnNlICE9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgorCQkgICAgImdpZF9wdF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9yc3BfaGRyKSkpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQkvKiBTZXQgcG9ydCBJRHMgaW4gc3dpdGNoIGluZm8gbGlzdC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKKwkJCWdpZF9kYXRhID0gJmN0X3JzcC0+cnNwLmdpZF9wdC5lbnRyaWVzW2ldOworCQkJbGlzdFtpXS5kX2lkLmIuZG9tYWluID0gZ2lkX2RhdGEtPnBvcnRfaWRbMF07CisJCQlsaXN0W2ldLmRfaWQuYi5hcmVhID0gZ2lkX2RhdGEtPnBvcnRfaWRbMV07CisJCQlsaXN0W2ldLmRfaWQuYi5hbF9wYSA9IGdpZF9kYXRhLT5wb3J0X2lkWzJdOworCisJCQkvKiBMYXN0IG9uZSBleGl0LiAqLworCQkJaWYgKGdpZF9kYXRhLT5jb250cm9sX2J5dGUgJiBCSVRfNykgeworCQkJCWxpc3RbaV0uZF9pZC5iLnJzdmRfMSA9IGdpZF9kYXRhLT5jb250cm9sX2J5dGU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSd2ZSB1c2VkIGFsbCBhdmFpbGFibGUgc2xvdHMsIHRoZW4gdGhlIHN3aXRjaCBpcworCQkgKiByZXBvcnRpbmcgYmFjayBtb3JlIGRldmljZXMgdGhhbiB3ZSBjYW4gaGFuZGxlIHdpdGggdGhpcworCQkgKiBzaW5nbGUgY2FsbC4gIFJldHVybiBhIGZhaWxlZCBzdGF0dXMsIGFuZCBsZXQgR0FfTlhUIGhhbmRsZQorCQkgKiB0aGUgb3ZlcmxvYWQuCisJCSAqLworCQlpZiAoaSA9PSBNQVhfRklCUkVfREVWSUNFUykgCisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfZ3BuX2lkKCkgLSBTTlMgR2V0IFBvcnQgTmFtZSAoR1BOX0lEKSBxdWVyeS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworaW50CitxbGEyeDAwX2dwbl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCit7CisJaW50CQlydmFsOworCXVpbnQxNl90CWk7CisKKwltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKKwlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOworCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJcmV0dXJuIChxbGEyeDAwX3Nuc19ncG5faWQoaGEsIGxpc3QpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklDRVM7IGkrKykgeworCQkvKiBJc3N1ZSBHUE5fSUQgKi8KKwkJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCQltc19wa3QgPSBxbGEyeDAwX3ByZXBfbXNfaW9jYihoYSwgR1BOX0lEX1JFUV9TSVpFLAorCQkgICAgR1BOX0lEX1JTUF9TSVpFKTsKKworCQkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwkJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIEdQTl9JRF9DTUQsCisJCSAgICBHUE5fSURfUlNQX1NJWkUpOworCQljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkJLyogUHJlcGFyZSBDVCBhcmd1bWVudHMgLS0gcG9ydF9pZCAqLworCQljdF9yZXEtPnJlcS5wb3J0X2lkLnBvcnRfaWRbMF0gPSBsaXN0W2ldLmRfaWQuYi5kb21haW47CisJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFsxXSA9IGxpc3RbaV0uZF9pZC5iLmFyZWE7CisJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFsyXSA9IGxpc3RbaV0uZF9pZC5iLmFsX3BhOworCisJCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJLypFTVBUWSovCisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIGlzc3VlIElPQ0IgZmFpbGVkICIKKwkJCSAgICAiKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCX0gZWxzZSBpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgeworCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdQTl9JRCBmYWlsZWQsIHJlamVjdGVkICIKKwkJCSAgICAicmVxdWVzdCwgZ3BuX2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJLyogU2F2ZSBwb3J0bmFtZSAqLworCQkJbWVtY3B5KGxpc3RbaV0ucG9ydF9uYW1lLAorCQkJICAgIGN0X3JzcC0+cnNwLmdwbl9pZC5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKwkJfQorCisJCS8qIExhc3QgZGV2aWNlIGV4aXQuICovCisJCWlmIChsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgIT0gMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9nbm5faWQoKSAtIFNOUyBHZXQgTm9kZSBOYW1lIChHTk5fSUQpIHF1ZXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbGlzdDogc3dpdGNoIGluZm8gZW50cmllcyB0byBwb3B1bGF0ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfZ25uX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDE2X3QJaTsKKworCW1zX2lvY2JfZW50cnlfdAkqbXNfcGt0OworCXN0cnVjdCBjdF9zbnNfcmVxCSpjdF9yZXE7CisJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQlyZXR1cm4gKHFsYTJ4MDBfc25zX2dubl9pZChoYSwgbGlzdCkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CisJCS8qIElzc3VlIEdOTl9JRCAqLworCQkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCisJCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCBHTk5fSURfUkVRX1NJWkUsCisJCSAgICBHTk5fSURfUlNQX1NJWkUpOworCisJCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCQljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgR05OX0lEX0NNRCwKKwkJICAgIEdOTl9JRF9SU1BfU0laRSk7CisJCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKKworCQkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkICovCisJCWN0X3JlcS0+cmVxLnBvcnRfaWQucG9ydF9pZFswXSA9IGxpc3RbaV0uZF9pZC5iLmRvbWFpbjsKKwkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzFdID0gbGlzdFtpXS5kX2lkLmIuYXJlYTsKKwkJY3RfcmVxLT5yZXEucG9ydF9pZC5wb3J0X2lkWzJdID0gbGlzdFtpXS5kX2lkLmIuYWxfcGE7CisKKwkJLyogRXhlY3V0ZSBNUyBJT0NCICovCisJCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkvKkVNUFRZKi8KKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgIgorCQkJICAgICIoJWQpLlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJfSBlbHNlIGlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUxNihDVF9BQ0NFUFRfUkVTUE9OU0UpKSB7CisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR05OX0lEIGZhaWxlZCwgcmVqZWN0ZWQgIgorCQkJICAgICJyZXF1ZXN0LCBnbm5faWRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9yc3BfaGRyKSkpOworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0gZWxzZSB7CisJCQkvKiBTYXZlIG5vZGVuYW1lICovCisJCQltZW1jcHkobGlzdFtpXS5ub2RlX25hbWUsCisJCQkgICAgY3RfcnNwLT5yc3AuZ25uX2lkLm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGVudHJ5IC0gIgorCQkJICAgICJubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMF0sIGxpc3RbaV0ubm9kZV9uYW1lWzFdLAorCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzJdLCBsaXN0W2ldLm5vZGVfbmFtZVszXSwKKwkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVs0XSwgbGlzdFtpXS5ub2RlX25hbWVbNV0sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbNl0sIGxpc3RbaV0ubm9kZV9uYW1lWzddLAorCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzBdLCBsaXN0W2ldLnBvcnRfbmFtZVsxXSwKKwkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVsyXSwgbGlzdFtpXS5wb3J0X25hbWVbM10sCisJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbNF0sIGxpc3RbaV0ucG9ydF9uYW1lWzVdLAorCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzZdLCBsaXN0W2ldLnBvcnRfbmFtZVs3XSwKKwkJCSAgICBsaXN0W2ldLmRfaWQuYi5kb21haW4sIGxpc3RbaV0uZF9pZC5iLmFyZWEsCisJCQkgICAgbGlzdFtpXS5kX2lkLmIuYWxfcGEpKTsKKwkJfQorCisJCS8qIExhc3QgZGV2aWNlIGV4aXQuICovCisJCWlmIChsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgIT0gMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9yZnRfaWQoKSAtIFNOUyBSZWdpc3RlciBGQy00IFRZUEVzIChSRlRfSUQpIHN1cHBvcnRlZCBieSB0aGUgSEJBLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorcWxhMngwMF9yZnRfaWQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisKKwltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKKwlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOworCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJcmV0dXJuIChxbGEyeDAwX3Nuc19yZnRfaWQoaGEpKTsKKwl9CisKKwkvKiBJc3N1ZSBSRlRfSUQgKi8KKwkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCisJbXNfcGt0ID0gcWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIFJGVF9JRF9SRVFfU0laRSwgUkZUX0lEX1JTUF9TSVpFKTsKKworCS8qIFByZXBhcmUgQ1QgcmVxdWVzdCAqLworCWN0X3JlcSA9IHFsYTJ4MDBfcHJlcF9jdF9yZXEoJmhhLT5jdF9zbnMtPnAucmVxLCBSRlRfSURfQ01ELAorCSAgICBSRlRfSURfUlNQX1NJWkUpOworCWN0X3JzcCA9ICZoYS0+Y3Rfc25zLT5wLnJzcDsKKworCS8qIFByZXBhcmUgQ1QgYXJndW1lbnRzIC0tIHBvcnRfaWQsIEZDLTQgdHlwZXMgKi8KKwljdF9yZXEtPnJlcS5yZnRfaWQucG9ydF9pZFswXSA9IGhhLT5kX2lkLmIuZG9tYWluOworCWN0X3JlcS0+cmVxLnJmdF9pZC5wb3J0X2lkWzFdID0gaGEtPmRfaWQuYi5hcmVhOworCWN0X3JlcS0+cmVxLnJmdF9pZC5wb3J0X2lkWzJdID0gaGEtPmRfaWQuYi5hbF9wYTsKKworCWN0X3JlcS0+cmVxLnJmdF9pZC5mYzRfdHlwZXNbMl0gPSAweDAxOwkJLyogRkNQLTMgKi8KKworCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBmYWlsZWQsIHJlamVjdGVkICIKKwkJICAgICJyZXF1ZXN0LCByZnRfaWRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9yZmZfaWQoKSAtIFNOUyBSZWdpc3RlciBGQy00IEZlYXR1cmVzIChSRkZfSUQpIHN1cHBvcnRlZCBieSB0aGUgSEJBLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorcWxhMngwMF9yZmZfaWQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisKKwltc19pb2NiX2VudHJ5X3QJKm1zX3BrdDsKKwlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOworCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRkZfSUQgY2FsbCB1bnN1cHBvcnRlZCBvbiAiCisJCSAgICAiSVNQMjEwMC9JU1AyMjAwLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfQorCisJLyogSXNzdWUgUkZGX0lEICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCBSRkZfSURfUkVRX1NJWkUsIFJGRl9JRF9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgUkZGX0lEX0NNRCwKKwkgICAgUkZGX0lEX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBGQy00IGZlYXR1cmUsIEZDLTQgdHlwZSAqLworCWN0X3JlcS0+cmVxLnJmZl9pZC5wb3J0X2lkWzBdID0gaGEtPmRfaWQuYi5kb21haW47CisJY3RfcmVxLT5yZXEucmZmX2lkLnBvcnRfaWRbMV0gPSBoYS0+ZF9pZC5iLmFyZWE7CisJY3RfcmVxLT5yZXEucmZmX2lkLnBvcnRfaWRbMl0gPSBoYS0+ZF9pZC5iLmFsX3BhOworCisJY3RfcmVxLT5yZXEucmZmX2lkLmZjNF90eXBlID0gMHgwODsJCS8qIFNDU0kgLSBGQ1AgKi8KKworCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLworCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IoaGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCisJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGRl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKSk7CisJfSBlbHNlIGlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGRl9JRCBmYWlsZWQsIHJlamVjdGVkICIKKwkJICAgICJyZXF1ZXN0LCByZmZfaWRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRkZfSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9ybm5faWQoKSAtIFNOUyBSZWdpc3RlciBOb2RlIE5hbWUgKFJOTl9JRCkgb2YgdGhlIEhCQS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfcm5uX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CQlydmFsOworCisJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNfcm5uX2lkKGhhKSk7CisJfQorCisJLyogSXNzdWUgUk5OX0lEICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCW1zX3BrdCA9IHFsYTJ4MDBfcHJlcF9tc19pb2NiKGhhLCBSTk5fSURfUkVRX1NJWkUsIFJOTl9JRF9SU1BfU0laRSk7CisKKwkvKiBQcmVwYXJlIENUIHJlcXVlc3QgKi8KKwljdF9yZXEgPSBxbGEyeDAwX3ByZXBfY3RfcmVxKCZoYS0+Y3Rfc25zLT5wLnJlcSwgUk5OX0lEX0NNRCwKKwkgICAgUk5OX0lEX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBub2RlX25hbWUgKi8KKwljdF9yZXEtPnJlcS5ybm5faWQucG9ydF9pZFswXSA9IGhhLT5kX2lkLmIuZG9tYWluOworCWN0X3JlcS0+cmVxLnJubl9pZC5wb3J0X2lkWzFdID0gaGEtPmRfaWQuYi5hcmVhOworCWN0X3JlcS0+cmVxLnJubl9pZC5wb3J0X2lkWzJdID0gaGEtPmRfaWQuYi5hbF9wYTsKKworCW1lbWNweShjdF9yZXEtPnJlcS5ybm5faWQubm9kZV9uYW1lLCBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fYmUxNihDVF9BQ0NFUFRfUkVTUE9OU0UpKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgZmFpbGVkLCByZWplY3RlZCAiCisJCSAgICAicmVxdWVzdCwgcm5uX2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCisJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcnNubl9ubigpIC0gU05TIFJlZ2lzdGVyIFN5bWJvbGljIE5vZGUgTmFtZSAoUlNOTl9OTikgb2YgdGhlIEhCQS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQKK3FsYTJ4MDBfcnNubl9ubihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAkJcnZhbDsKKwl1aW50OF90CQkqc25uOworCXVpbnQ4X3QJCXZlcnNpb25bMjBdOworCisJbXNfaW9jYl9lbnRyeV90CSptc19wa3Q7CisJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3JlcTsKKwlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUlNOTl9JRCBjYWxsIHVuc3VwcG9ydGVkIG9uICIKKwkJICAgICJJU1AyMTAwL0lTUDIyMDAuXG4iLCBoYS0+aG9zdF9ubykpOworCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwl9CisKKwkvKiBJc3N1ZSBSU05OX05OICovCisJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLworCS8qICAgUmVxdWVzdCBzaXplIGFkanVzdGVkIGFmdGVyIENUIHByZXBhcmF0aW9uICovCisJbXNfcGt0ID0gcWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIDAsIFJTTk5fTk5fUlNQX1NJWkUpOworCisJLyogUHJlcGFyZSBDVCByZXF1ZXN0ICovCisJY3RfcmVxID0gcWxhMngwMF9wcmVwX2N0X3JlcSgmaGEtPmN0X3Nucy0+cC5yZXEsIFJTTk5fTk5fQ01ELAorCSAgICBSU05OX05OX1JTUF9TSVpFKTsKKwljdF9yc3AgPSAmaGEtPmN0X3Nucy0+cC5yc3A7CisKKwkvKiBQcmVwYXJlIENUIGFyZ3VtZW50cyAtLSBub2RlX25hbWUsIHN5bWJvbGljIG5vZGVfbmFtZSwgc2l6ZSAqLworCW1lbWNweShjdF9yZXEtPnJlcS5yc25uX25uLm5vZGVfbmFtZSwgaGEtPmluaXRfY2ItPm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCQorCS8qIFByZXBhcmUgdGhlIFN5bWJvbGljIE5vZGUgTmFtZSAqLworCS8qIEJvYXJkIHR5cGUgKi8KKwlzbm4gPSBjdF9yZXEtPnJlcS5yc25uX25uLnN5bV9ub2RlX25hbWU7CisJc3RyY3B5KHNubiwgaGEtPm1vZGVsX251bWJlcik7CisJLyogRmlybXdhcmUgdmVyc2lvbiAqLworCXN0cmNhdChzbm4sICIgRlc6diIpOworCXNwcmludGYodmVyc2lvbiwgIiVkLiUwMmQuJTAyZCIsIGhhLT5md19tYWpvcl92ZXJzaW9uLAorCSAgICBoYS0+ZndfbWlub3JfdmVyc2lvbiwgaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24pOworCXN0cmNhdChzbm4sIHZlcnNpb24pOworCS8qIERyaXZlciB2ZXJzaW9uICovCisJc3RyY2F0KHNubiwgIiBEVlI6diIpOworCXN0cmNhdChzbm4sIHFsYTJ4MDBfdmVyc2lvbl9zdHIpOworCisJLyogQ2FsY3VsYXRlIFNOTiBsZW5ndGggKi8KKwljdF9yZXEtPnJlcS5yc25uX25uLm5hbWVfbGVuID0gKHVpbnQ4X3Qpc3RybGVuKHNubik7CisKKwkvKiBVcGRhdGUgTVMgSU9DQiByZXF1ZXN0ICovCisJbXNfcGt0LT5yZXFfYnl0ZWNvdW50ID0KKwkgICAgY3B1X3RvX2xlMzIoMjQgKyAxICsgY3RfcmVxLT5yZXEucnNubl9ubi5uYW1lX2xlbik7CisJbXNfcGt0LT5kc2VnX3JlcV9sZW5ndGggPSBtc19wa3QtPnJlcV9ieXRlY291bnQ7CisKKwkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KKwlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAorCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSU05OX05OIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKGN0X3JzcC0+aGVhZGVyLnJlc3BvbnNlICE9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUlNOTl9OTiBmYWlsZWQsIHJlamVjdGVkICIKKwkJICAgICJyZXF1ZXN0LCByc25uX2lkX3JzcDpcbiIsIGhhLT5ob3N0X25vKSk7CisJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCisJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUlNOTl9OTiBleGl0aW5nIG5vcm1hbGx5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworCisvKioKKyAqIHFsYTJ4MDBfcHJlcF9zbnNfY21kKCkgLSBQcmVwYXJlIGNvbW1vbiBTTlMgY29tbWFuZCByZXF1ZXN0IGZpZWxkcyBmb3IgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBjbWQ6IEdTIGNvbW1hbmQKKyAqIEBzY21kX2xlbjogU3ViY29tbWFuZCBsZW5ndGgKKyAqIEBkYXRhX3NpemU6IHJlc3BvbnNlIHNpemUgaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQGhhJ3Mgc25zX2NtZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc25zX2NtZF9wa3QgKgorcWxhMngwMF9wcmVwX3Nuc19jbWQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgY21kLCB1aW50MTZfdCBzY21kX2xlbiwKKyAgICB1aW50MTZfdCBkYXRhX3NpemUpCit7CisJdWludDE2X3QJCXdjOworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCXNuc19jbWQgPSBoYS0+c25zX2NtZDsKKwltZW1zZXQoc25zX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCXdjID0gZGF0YV9zaXplIC8gMjsJCQkvKiBTaXplIGluIDE2Yml0IHdvcmRzLiAqLworCXNuc19jbWQtPnAuY21kLmJ1ZmZlcl9sZW5ndGggPSBjcHVfdG9fbGUxNih3Yyk7CisJc25zX2NtZC0+cC5jbWQuYnVmZmVyX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPnNuc19jbWRfZG1hKSk7CisJc25zX2NtZC0+cC5jbWQuYnVmZmVyX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnNuc19jbWRfZG1hKSk7CisJc25zX2NtZC0+cC5jbWQuc3ViY29tbWFuZF9sZW5ndGggPSBjcHVfdG9fbGUxNihzY21kX2xlbik7CisJc25zX2NtZC0+cC5jbWQuc3ViY29tbWFuZCA9IGNwdV90b19sZTE2KGNtZCk7CisJd2MgPSAoZGF0YV9zaXplIC0gMTYpIC8gNDsJCS8qIFNpemUgaW4gMzJiaXQgd29yZHMuICovCisJc25zX2NtZC0+cC5jbWQuc2l6ZSA9IGNwdV90b19sZTE2KHdjKTsKKworCXJldHVybiAoc25zX2NtZCk7Cit9CisKKy8qKgorICogcWxhMngwMF9zbnNfZ2Ffbnh0KCkgLSBTTlMgc2NhbiBmb3IgZmFicmljIGRldmljZXMgdmlhIEdBX05YVCBjb21tYW5kLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAZmNwb3J0OiBmY3BvcnQgZW50cnkgdG8gdXBkYXRlZAorICoKKyAqIFRoaXMgY29tbWFuZCB1c2VzIHRoZSBvbGQgRXhlY3R1dGUgU05TIENvbW1hbmQgbWFpbGJveCByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19nYV9ueHQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpCit7CisJaW50CQlydmFsOworCisJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOworCisJLyogSXNzdWUgR0FfTlhULiAqLworCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KKwlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQoaGEsIEdBX05YVF9DTUQsIEdBX05YVF9TTlNfU0NNRF9MRU4sCisJICAgIEdBX05YVF9TTlNfREFUQV9TSVpFKTsKKworCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRfaWQuICovCisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBmY3BvcnQtPmRfaWQuYi5hbF9wYTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IGZjcG9ydC0+ZF9pZC5iLmFyZWE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBmY3BvcnQtPmRfaWQuYi5kb21haW47CisKKwkvKiBFeGVjdXRlIFNOUyBjb21tYW5kLiAqLworCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsIEdBX05YVF9TTlNfQ01EX1NJWkUgLyAyLAorCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ2FuX2RhdGFbOF0gIT0gMHg4MCB8fAorCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhWzldICE9IDB4MDIpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJnYV9ueHRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdhbl9kYXRhLCAxNikpOworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQkvKiBQb3B1bGF0ZSBmY19wb3J0X3QgZW50cnkuICovCisJCWZjcG9ydC0+ZF9pZC5iLmRvbWFpbiA9IHNuc19jbWQtPnAuZ2FuX2RhdGFbMTddOworCQlmY3BvcnQtPmRfaWQuYi5hcmVhID0gc25zX2NtZC0+cC5nYW5fZGF0YVsxOF07CisJCWZjcG9ydC0+ZF9pZC5iLmFsX3BhID0gc25zX2NtZC0+cC5nYW5fZGF0YVsxOV07CisKKwkJbWVtY3B5KGZjcG9ydC0+bm9kZV9uYW1lLCAmc25zX2NtZC0+cC5nYW5fZGF0YVsyODRdLCBXV05fU0laRSk7CisJCW1lbWNweShmY3BvcnQtPnBvcnRfbmFtZSwgJnNuc19jbWQtPnAuZ2FuX2RhdGFbMjBdLCBXV05fU0laRSk7CisKKwkJaWYgKHNuc19jbWQtPnAuZ2FuX2RhdGFbMTZdICE9IE5TX05fUE9SVF9UWVBFICYmCisJCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhWzE2XSAhPSBOU19OTF9QT1JUX1RZUEUpCisJCQlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSAweGYwOworCisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgZW50cnkgLSAiCisJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMF0sIGZjcG9ydC0+bm9kZV9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMl0sIGZjcG9ydC0+bm9kZV9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNF0sIGZjcG9ydC0+bm9kZV9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNl0sIGZjcG9ydC0+bm9kZV9uYW1lWzddLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX2dpZF9wdCgpIC0gU05TIHNjYW4gZm9yIGZhYnJpYyBkZXZpY2VzIHZpYSBHSURfUFQgY29tbWFuZC4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisgKiBUaGlzIGNvbW1hbmQgdXNlcyB0aGUgb2xkIEV4ZWN0dXRlIFNOUyBDb21tYW5kIG1haWxib3ggcm91dGluZS4KKyAqCisgKiBOT1RFOiBOb24tTnhfUG9ydHMgYXJlIG5vdCByZXF1ZXN0ZWQuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25zX2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCit7CisJaW50CQlydmFsOworCisJdWludDE2X3QJaTsKKwl1aW50OF90CQkqZW50cnk7CisJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOworCisJLyogSXNzdWUgR0lEX1BULiAqLworCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KKwlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQoaGEsIEdJRF9QVF9DTUQsIEdJRF9QVF9TTlNfU0NNRF9MRU4sCisJICAgIEdJRF9QVF9TTlNfREFUQV9TSVpFKTsKKworCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRfdHlwZS4gKi8KKwlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IE5TX05YX1BPUlRfVFlQRTsKKworCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwgR0lEX1BUX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5naWRfZGF0YVs4XSAhPSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAuZ2lkX2RhdGFbOV0gIT0gMHgwMikgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgorCQkgICAgImdpZF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ2lkX2RhdGEsIDE2KSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCS8qIFNldCBwb3J0IElEcyBpbiBzd2l0Y2ggaW5mbyBsaXN0LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklDRVM7IGkrKykgeworCQkJZW50cnkgPSAmc25zX2NtZC0+cC5naWRfZGF0YVsoaSAqIDQpICsgMTZdOworCQkJbGlzdFtpXS5kX2lkLmIuZG9tYWluID0gZW50cnlbMV07CisJCQlsaXN0W2ldLmRfaWQuYi5hcmVhID0gZW50cnlbMl07CisJCQlsaXN0W2ldLmRfaWQuYi5hbF9wYSA9IGVudHJ5WzNdOworCisJCQkvKiBMYXN0IG9uZSBleGl0LiAqLworCQkJaWYgKGVudHJ5WzBdICYgQklUXzcpIHsKKwkJCQlsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgPSBlbnRyeVswXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHdlJ3ZlIHVzZWQgYWxsIGF2YWlsYWJsZSBzbG90cywgdGhlbiB0aGUgc3dpdGNoIGlzCisJCSAqIHJlcG9ydGluZyBiYWNrIG1vcmUgZGV2aWNlcyB0aGF0IHdlIGNhbiBoYW5kbGUgd2l0aCB0aGlzCisJCSAqIHNpbmdsZSBjYWxsLiAgUmV0dXJuIGEgZmFpbGVkIHN0YXR1cywgYW5kIGxldCBHQV9OWFQgaGFuZGxlCisJCSAqIHRoZSBvdmVybG9hZC4KKwkJICovCisJCWlmIChpID09IE1BWF9GSUJSRV9ERVZJQ0VTKSAKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9zbnNfZ3BuX2lkKCkgLSBTTlMgR2V0IFBvcnQgTmFtZSAoR1BOX0lEKSBxdWVyeS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisgKiBUaGlzIGNvbW1hbmQgdXNlcyB0aGUgb2xkIEV4ZWN0dXRlIFNOUyBDb21tYW5kIG1haWxib3ggcm91dGluZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zbnNfZ3BuX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3sKKwlpbnQJCXJ2YWw7CisKKwl1aW50MTZfdAlpOworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CisJCS8qIElzc3VlIEdQTl9JRCAqLworCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJCXNuc19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgR1BOX0lEX0NNRCwKKwkJICAgIEdQTl9JRF9TTlNfU0NNRF9MRU4sIEdQTl9JRF9TTlNfREFUQV9TSVpFKTsKKworCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLiAqLworCQlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IGxpc3RbaV0uZF9pZC5iLmFsX3BhOworCQlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IGxpc3RbaV0uZF9pZC5iLmFyZWE7CisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gbGlzdFtpXS5kX2lkLmIuZG9tYWluOworCisJCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsCisJCSAgICBHUE5fSURfU05TX0NNRF9TSVpFIC8gMiwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJLypFTVBUWSovCisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIFNlbmQgU05TIGZhaWxlZCAiCisJCQkgICAgIiglZCkuXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOworCQl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ3BuX2RhdGFbOF0gIT0gMHg4MCB8fAorCQkgICAgc25zX2NtZC0+cC5ncG5fZGF0YVs5XSAhPSAweDAyKSB7CisJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIGZhaWxlZCwgcmVqZWN0ZWQgIgorCQkJICAgICJyZXF1ZXN0LCBncG5fcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5ncG5fZGF0YSwgMTYpKTsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJLyogU2F2ZSBwb3J0bmFtZSAqLworCQkJbWVtY3B5KGxpc3RbaV0ucG9ydF9uYW1lLCAmc25zX2NtZC0+cC5ncG5fZGF0YVsxNl0sCisJCQkgICAgV1dOX1NJWkUpOworCQl9CisKKwkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KKwkJaWYgKGxpc3RbaV0uZF9pZC5iLnJzdmRfMSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3Nuc19nbm5faWQoKSAtIFNOUyBHZXQgTm9kZSBOYW1lIChHTk5fSUQpIHF1ZXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbGlzdDogc3dpdGNoIGluZm8gZW50cmllcyB0byBwb3B1bGF0ZQorICoKKyAqIFRoaXMgY29tbWFuZCB1c2VzIHRoZSBvbGQgRXhlY3R1dGUgU05TIENvbW1hbmQgbWFpbGJveCByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19nbm5faWQoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3dfaW5mb190ICpsaXN0KQoreworCWludAkJcnZhbDsKKworCXVpbnQxNl90CWk7CisJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKKwkJLyogSXNzdWUgR05OX0lEICovCisJCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KKwkJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBHTk5fSURfQ01ELAorCQkgICAgR05OX0lEX1NOU19TQ01EX0xFTiwgR05OX0lEX1NOU19EQVRBX1NJWkUpOworCisJCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRfaWQuICovCisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzBdID0gbGlzdFtpXS5kX2lkLmIuYWxfcGE7CisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gbGlzdFtpXS5kX2lkLmIuYXJlYTsKKwkJc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBsaXN0W2ldLmRfaWQuYi5kb21haW47CisKKwkJLyogRXhlY3V0ZSBTTlMgY29tbWFuZC4gKi8KKwkJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwKKwkJICAgIEdOTl9JRF9TTlNfQ01EX1NJWkUgLyAyLCBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkvKkVNUFRZKi8KKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgU2VuZCBTTlMgZmFpbGVkICIKKwkJCSAgICAiKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5nbm5fZGF0YVs4XSAhPSAweDgwIHx8CisJCSAgICBzbnNfY21kLT5wLmdubl9kYXRhWzldICE9IDB4MDIpIHsKKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgZmFpbGVkLCByZWplY3RlZCAiCisJCQkgICAgInJlcXVlc3QsIGdubl9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdubl9kYXRhLCAxNikpOworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0gZWxzZSB7CisJCQkvKiBTYXZlIG5vZGVuYW1lICovCisJCQltZW1jcHkobGlzdFtpXS5ub2RlX25hbWUsICZzbnNfY21kLT5wLmdubl9kYXRhWzE2XSwKKwkJCSAgICBXV05fU0laRSk7CisKKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgZW50cnkgLSAiCisJCQkgICAgIm5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywKKwkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVswXSwgbGlzdFtpXS5ub2RlX25hbWVbMV0sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMl0sIGxpc3RbaV0ubm9kZV9uYW1lWzNdLAorCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzRdLCBsaXN0W2ldLm5vZGVfbmFtZVs1XSwKKwkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVs2XSwgbGlzdFtpXS5ub2RlX25hbWVbN10sCisJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbMF0sIGxpc3RbaV0ucG9ydF9uYW1lWzFdLAorCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzJdLCBsaXN0W2ldLnBvcnRfbmFtZVszXSwKKwkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVs0XSwgbGlzdFtpXS5wb3J0X25hbWVbNV0sCisJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbNl0sIGxpc3RbaV0ucG9ydF9uYW1lWzddLAorCQkJICAgIGxpc3RbaV0uZF9pZC5iLmRvbWFpbiwgbGlzdFtpXS5kX2lkLmIuYXJlYSwKKwkJCSAgICBsaXN0W2ldLmRfaWQuYi5hbF9wYSkpOworCQl9CisKKwkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KKwkJaWYgKGxpc3RbaV0uZF9pZC5iLnJzdmRfMSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3NuZF9yZnRfaWQoKSAtIFNOUyBSZWdpc3RlciBGQy00IFRZUEVzIChSRlRfSUQpIHN1cHBvcnRlZCBieSB0aGUgSEJBLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogVGhpcyBjb21tYW5kIHVzZXMgdGhlIG9sZCBFeGVjdHV0ZSBTTlMgQ29tbWFuZCBtYWlsYm94IHJvdXRpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25zX3JmdF9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAkJcnZhbDsKKworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCS8qIElzc3VlIFJGVF9JRC4gKi8KKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBSRlRfSURfQ01ELCBSRlRfSURfU05TX1NDTURfTEVOLAorCSAgICBSRlRfSURfU05TX0RBVEFfU0laRSk7CisKKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBGQy00IHR5cGVzICovCisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBoYS0+ZF9pZC5iLmFsX3BhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gaGEtPmRfaWQuYi5hcmVhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gaGEtPmRfaWQuYi5kb21haW47CisKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs1XSA9IDB4MDE7CQkJLyogRkNQLTMgKi8KKworCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwgUkZUX0lEX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5yZnRfZGF0YVs4XSAhPSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAucmZ0X2RhdGFbOV0gIT0gMHgwMikgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgorCQkgICAgInJmdF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucmZ0X2RhdGEsIDE2KSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX3Jubl9pZCgpIC0gU05TIFJlZ2lzdGVyIE5vZGUgTmFtZSAoUk5OX0lEKSBvZiB0aGUgSEJBLgorICogSEJBLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogVGhpcyBjb21tYW5kIHVzZXMgdGhlIG9sZCBFeGVjdHV0ZSBTTlMgQ29tbWFuZCBtYWlsYm94IHJvdXRpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25zX3Jubl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAkJcnZhbDsKKworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCS8qIElzc3VlIFJOTl9JRC4gKi8KKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBSTk5fSURfQ01ELCBSTk5fSURfU05TX1NDTURfTEVOLAorCSAgICBSTk5fSURfU05TX0RBVEFfU0laRSk7CisKKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBub2RlbmFtZS4gKi8KKwlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IGhhLT5kX2lkLmIuYWxfcGE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMV0gPSBoYS0+ZF9pZC5iLmFyZWE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBoYS0+ZF9pZC5iLmRvbWFpbjsKKworCXNuc19jbWQtPnAuY21kLnBhcmFtWzRdID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs3XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs1XSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbNl07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bNl0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzVdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzddID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs0XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs4XSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbM107CisJc25zX2NtZC0+cC5jbWQucGFyYW1bOV0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzJdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzEwXSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbMV07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMTFdID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVswXTsKKworCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwgUk5OX0lEX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5ybm5fZGF0YVs4XSAhPSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAucm5uX2RhdGFbOV0gIT0gMHgwMikgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgorCQkgICAgInJubl9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucm5uX2RhdGEsIDE2KSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiNWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTAsMCArMSwzOTA4IEBACisvKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgInFsYV9kZWYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJxbGFfZGV2dGJsLmgiCisKKy8qIFhYWChoY2gpOiB0aGlzIGlzIHVnbHksIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHB1bGwgaW4gZXhpb2N0bC5oICovCisjaWZuZGVmIEVYVF9JU19MVU5fQklUX1NFVAorI2RlZmluZSBFWFRfSVNfTFVOX0JJVF9TRVQoUCxMKSBcCisgICAgKCgoUCktPm1hc2tbTC84XSAmICgweDgwID4+IChMJTgpKSk/MTowKQorI2RlZmluZSBFWFRfU0VUX0xVTl9CSVQoUCxMKSBcCisgICAgKChQKS0+bWFza1tMLzhdIHw9ICgweDgwID4+IChMJTgpKSkKKyNlbmRpZgorCisvKgorKiAgUUxvZ2ljIElTUDJ4MDAgSGFyZHdhcmUgU3VwcG9ydCBGdW5jdGlvbiBQcm90b3R5cGVzLgorKi8KK3N0YXRpYyBpbnQgcWxhMngwMF9wY2lfY29uZmlnKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9pc3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9yZXNldF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9jaGlwX2RpYWcoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9yZXNpemVfcmVxdWVzdF9xKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zZXR1cF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGludCBxbGEyeDAwX2luaXRfcmluZ3Moc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGludCBxbGEyeDAwX2Z3X3JlYWR5KHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9jb25maWd1cmVfaGJhKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9udnJhbV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9pbml0X3RndF9tYXAoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGludCBxbGEyeDAwX2NvbmZpZ3VyZV9sb29wKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9jb25maWd1cmVfbG9jYWxfbG9vcChzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX3VwZGF0ZV9mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfbHVuX2Rpc2NvdmVyeShzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICopOworc3RhdGljIGludCBxbGEyeDAwX3JwdF9sdW5fZGlzY292ZXJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKiwKKyAgICBpbnFfY21kX3JzcF90ICosIGRtYV9hZGRyX3QpOworc3RhdGljIGludCBxbGEyeDAwX3JlcG9ydF9sdW4oc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKK3N0YXRpYyBmY19sdW5fdCAqcWxhMngwMF9jZmdfbHVuKHNjc2lfcWxhX2hvc3RfdCAqLCBmY19wb3J0X3QgKiwgdWludDE2X3QsCisgICAgaW5xX2NtZF9yc3BfdCAqLCBkbWFfYWRkcl90KTsKK3N0YXRpYyBmY19sdW5fdCAqIHFsYTJ4MDBfYWRkX2x1bihmY19wb3J0X3QgKiwgdWludDE2X3QpOworc3RhdGljIGludCBxbGEyeDAwX2lucXVpcnkoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqLCB1aW50MTZfdCwKKyAgICBpbnFfY21kX3JzcF90ICosIGRtYV9hZGRyX3QpOworc3RhdGljIGludCBxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWMoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGludCBxbGEyeDAwX2ZpbmRfYWxsX2ZhYnJpY19kZXZzKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgbGlzdF9oZWFkICopOworc3RhdGljIGludCBxbGEyeDAwX2RldmljZV9yZXN5bmMoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIGludCBxbGEyeDAwX2ZhYnJpY19kZXZfbG9naW4oc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqLAorICAgIHVpbnQxNl90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9jb25maWdfb3Moc2NzaV9xbGFfaG9zdF90ICpoYSk7CitzdGF0aWMgdWludDE2X3QgcWxhMngwMF9mY3BvcnRfYmluZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCk7CitzdGF0aWMgb3NfbHVuX3QgKiBxbGEyeDAwX2ZjbHVuX2JpbmQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqLAorICAgIGZjX2x1bl90ICopOworc3RhdGljIHZvaWQgcWxhMngwMF9sdW5fZnJlZShzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsIHVpbnQxNl90KTsKKworc3RhdGljIGludCBxbGEyeDAwX3Jlc3RhcnRfaXNwKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfcmVzZXRfYWRhcHRlcihzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgb3NfdGd0X3QgKnFsYTJ4MDBfdGd0X2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CitzdGF0aWMgb3NfbHVuX3QgKnFsYTJ4MDBfbHVuX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCwgdWludDE2X3QpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgIFFMb2dpYyBJU1AyeDAwIEhhcmR3YXJlIFN1cHBvcnQgRnVuY3Rpb25zLiAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqIHFsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyCisqICAgICAgSW5pdGlhbGl6ZSBib2FyZC4KKyoKKyogSW5wdXQ6CisqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqCisqIFJldHVybnM6CisqICAgICAgMCA9IHN1Y2Nlc3MKKyovCitpbnQKK3FsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50CXJ2YWw7CisJdWludDhfdAlyZXN0YXJ0X3Jpc2MgPSAwOworCXVpbnQ4X3QJcmV0cnk7CisJdWludDMyX3Qgd2FpdF90aW1lOworCisJLyogQ2xlYXIgYWRhcHRlciBmbGFncy4gKi8KKwloYS0+ZmxhZ3Mub25saW5lID0gMDsKKwloYS0+ZmxhZ3MucmVzZXRfYWN0aXZlID0gMDsKKwlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CisJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CisJaGEtPmRldmljZV9mbGFncyA9IDA7CisJaGEtPnNuc19yZXRyeV9jbnQgPSAwOworCWhhLT5kcGNfZmxhZ3MgPSAwOworCWhhLT5mYWlsYmFja19kZWxheSA9IDA7CisJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CisJaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCWhhLT5tYnhfZmxhZ3MgPSAwOworCWhhLT5pc3BfYWJvcnRfY250ID0gMDsKKwloYS0+YmVhY29uX2JsaW5rX2xlZCA9IDA7CisKKwlydmFsID0gcWxhMngwMF9wY2lfY29uZmlnKGhhKTsKKwlpZiAocnZhbCkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byBjb25maWd1cmUgUENJIHNwYWNlPW4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcmV0dXJuIChydmFsKTsKKwl9CisKKwlxbGEyeDAwX3Jlc2V0X2NoaXAoaGEpOworCisJLyogSW5pdGlhbGl6ZSB0YXJnZXQgbWFwIGRhdGFiYXNlLiAqLworCXFsYTJ4MDBfaW5pdF90Z3RfbWFwKGhhKTsKKworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyZSBOVlJBTSBwYXJhbWV0ZXJzLi4uXG4iKTsKKwlxbGEyeDAwX252cmFtX2NvbmZpZyhoYSk7CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJWZXJpZnlpbmcgbG9hZGVkIFJJU0MgY29kZS4uLlxuIik7CisKKwlyZXRyeSA9IDEwOworCS8qCisJICogVHJ5IHRvIGNvbmZpZ3VyZSB0aGUgbG9vcC4KKwkgKi8KKwlkbyB7CisJCXJlc3RhcnRfcmlzYyA9IDA7CisKKwkJLyogSWYgZmlybXdhcmUgbmVlZHMgdG8gYmUgbG9hZGVkICovCisJCWlmIChxbGEyeDAwX2lzcF9maXJtd2FyZShoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCWlmICgocnZhbCA9IHFsYTJ4MDBfY2hpcF9kaWFnKGhhKSkgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQlydmFsID0gcWxhMngwMF9zZXR1cF9jaGlwKGhhKTsKKwkJCX0KKwkJfQorCisJCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmCisJCSAgICAocnZhbCA9IHFsYTJ4MDBfaW5pdF9yaW5ncyhoYSkpID09IFFMQV9TVUNDRVNTKSB7CitjaGVja19md19yZWFkeV9hZ2FpbjoKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBhIHN1Y2Nlc3NmdWwgTElQIHVwIHRvIGEgbWF4aW11bSAKKwkJCSAqIG9mIChpbiBzZWNvbmRzKTogUklTQyBsb2dpbiB0aW1lb3V0IHZhbHVlLAorCQkJICogUklTQyByZXRyeSBjb3VudCB2YWx1ZSwgYW5kIHBvcnQgZG93biByZXRyeQorCQkJICogdmFsdWUgT1IgYSBtaW5pbXVtIG9mIDQgc2Vjb25kcyBPUiBJZiBubyAKKwkJCSAqIGNhYmxlLCBvbmx5IDUgc2Vjb25kcy4KKwkJCSAqLworCQkJcnZhbCA9IHFsYTJ4MDBfZndfcmVhZHkoaGEpOworCQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQkJLyoKKwkJCQkgKiBXYWl0IGF0IG1vc3QgTUFYX1RBUkdFVCBSU0NOcyBmb3IgYSBzdGFibGUKKwkJCQkgKiBsaW5rLgorCQkJCSAqLworCQkJCXdhaXRfdGltZSA9IDI1NjsKKwkJCQlkbyB7CisJCQkJCWNsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsCisJCQkJCSAgICAmaGEtPmRwY19mbGFncyk7CisJCQkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9sb29wKGhhKTsKKworCQkJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsCisJCQkJCSAgICAmaGEtPmRwY19mbGFncykpIHsKKwkJCQkJCXJlc3RhcnRfcmlzYyA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8qCisJCQkJCSAqIElmIGxvb3Agc3RhdGUgY2hhbmdlIHdoaWxlIHdlIHdlcmUKKwkJCQkJICogZGlzY292ZXJ5aW5nIGRldmljZXMgdGhlbiB3YWl0IGZvcgorCQkJCQkgKiBMSVAgdG8gY29tcGxldGUKKwkJCQkJICovCisKKwkJCQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0KKwkJCQkJICAgIExPT1BfRE9XTiAmJiByZXRyeS0tKSB7CisJCQkJCQlnb3RvIGNoZWNrX2Z3X3JlYWR5X2FnYWluOworCQkJCQl9CisJCQkJCXdhaXRfdGltZS0tOworCQkJCX0gd2hpbGUgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJCQkgICAgcmV0cnkgJiYKKwkJCQkgICAgd2FpdF90aW1lICYmCisJCQkJICAgICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsCisJCQkJCSZoYS0+ZHBjX2ZsYWdzKSkpOworCisJCQkJaWYgKHdhaXRfdGltZSA9PSAwKQorCQkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJCQlpZiAoaGEtPm1lbV9lcnIpCisJCQkJCXJlc3RhcnRfcmlzYyA9IDE7CisJCQl9IGVsc2UgaWYgKGhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX05PX0NBQkxFKQorCQkJCS8qIElmIG5vIGNhYmxlLCB0aGVuIGFsbCBpcyBnb29kLiAqLworCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwkJfQorCX0gd2hpbGUgKHJlc3RhcnRfcmlzYyAmJiByZXRyeS0tKTsKKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWhhLT5tYXJrZXJfbmVlZGVkID0gMTsKKwkJcWxhMngwMF9tYXJrZXIoaGEsIDAsIDAsIE1LX1NZTkNfQUxMKTsKKwkJaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCisJCWhhLT5mbGFncy5vbmxpbmUgPSAxOworCX0gZWxzZSB7CisJCURFQlVHMl8zKHByaW50aygiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcGNpX2NvbmZpZygpIC0gU2V0dXAgZGV2aWNlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3BjaV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MTZfdAl3LCBtd2k7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzID0gMDsKKwl1aW50MzJfdAljbnQ7CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJDb25maWd1cmluZyBQQ0kgc3BhY2UuLi5cbiIpOworCisJLyogCisJICogVHVybiBvbiBQQ0kgbWFzdGVyOyBmb3Igc3lzdGVtIEJJT1NlcyB0aGF0IGRvbid0IHR1cm4gaXQgb24gYnkKKwkgKiBkZWZhdWx0LgorCSAqLworCXBjaV9zZXRfbWFzdGVyKGhhLT5wZGV2KTsKKwltd2kgPSAwOworCWlmIChwY2lfc2V0X213aShoYS0+cGRldikpCisJCW13aSA9IFBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmhhLT5yZXZpc2lvbik7CisKKwlpZiAoIWhhLT5pb2Jhc2UpCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gcmVzcGVjdCBmcmFtZXdvcmsncyBzZXR0aW5nIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisJICogY29tbWFuZCByZWdpc3RlciBhbmQgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBiaXRzIG9mCisJICogaW50ZXJlc3QgdG8gdXMgYXJlIHByb3Blcmx5IHNldCBpbiBjb21tYW5kIHJlZ2lzdGVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhhLT5wZGV2LCBQQ0lfQ09NTUFORCwgJncpOworCXcgfD0gbXdpIHwgKFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlIpOworCisJLyogR2V0IFBDSSBidXMgaW5mb3JtYXRpb24uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJaGEtPnBjaV9hdHRyID0gUkRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmN0cmxfc3RhdHVzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGhhLT5wZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CisKKwkJLyogUENJIFNwZWNpZmljYXRpb24gUmV2aXNpb24gMi4zIGNoYW5nZXMgKi8KKwkJaWYgKElTX1FMQTIzMjIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKQorCQkJLyogQ29tbWFuZCBSZWdpc3RlciAtIFJlc2V0IEludGVycnVwdCBEaXNhYmxlLiAqLworCQkJdyAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgYSAyMzAwIGNhcmQgYW5kIG5vdCAyMzEyLCByZXNldCB0aGUKKwkJICogQ09NTUFORF9JTlZBTElEQVRFIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgMjMwMC4gVW5mb3J0dW5hdGVseSwKKwkJICogdGhlIDIzMTAgYWxzbyByZXBvcnRzIGl0c2VsZiBhcyBhIDIzMDAgc28gd2UgbmVlZCB0byBnZXQgdGhlCisJCSAqIGZiIHJldmlzaW9uIGxldmVsIC0tIGEgNiBpbmRpY2F0ZXMgaXQgcmVhbGx5IGlzIGEgMjMwMCBhbmQKKwkJICogbm90IGEgMjMxMC4KKwkJICovCisJCWlmIChJU19RTEEyMzAwKGhhKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkJCS8qIFBhdXNlIFJJU0MuICovCisJCQlXUlRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmhjY3IsIEhDQ1JfUEFVU0VfUklTQyk7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IDMwMDAwOyBjbnQrKykgeworCQkJCWlmICgoUkRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmhjY3IpICYKKwkJCQkgICAgSENDUl9SSVNDX1BBVVNFKSAhPSAwKQorCQkJCQlicmVhazsKKwkKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCisJCQkvKiBTZWxlY3QgRlBNIHJlZ2lzdGVycy4gKi8KKwkJCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+Y3RybF9zdGF0dXMsIDB4MjApOworCQkJUkRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmN0cmxfc3RhdHVzKTsKKworCQkJLyogR2V0IHRoZSBmYiByZXYgbGV2ZWwgKi8KKwkJCWhhLT5mYl9yZXYgPSBSRF9GQl9DTURfUkVHKGhhLCBoYS0+aW9iYXNlKTsKKworCQkJaWYgKGhhLT5mYl9yZXYgPT0gRlBNXzIzMDApCisJCQkJdyAmPSB+UENJX0NPTU1BTkRfSU5WQUxJREFURTsKKworCQkJLyogRGVzZWxlY3QgRlBNIHJlZ2lzdGVycy4gKi8KKwkJCVdSVF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+Y3RybF9zdGF0dXMsIDB4MCk7CisJCQlSRF9SRUdfV09SRCgmaGEtPmlvYmFzZS0+Y3RybF9zdGF0dXMpOworCisJCQkvKiBSZWxlYXNlIFJJU0MgbW9kdWxlLiAqLworCQkJV1JUX1JFR19XT1JEKCZoYS0+aW9iYXNlLT5oY2NyLCBIQ0NSX1JFTEVBU0VfUklTQyk7CisJCQlmb3IgKGNudCA9IDA7IGNudCA8IDMwMDAwOyBjbnQrKykgeworCQkJCWlmICgoUkRfUkVHX1dPUkQoJmhhLT5pb2Jhc2UtPmhjY3IpICYKKwkJCQkgICAgSENDUl9SSVNDX1BBVVNFKSA9PSAwKQorCQkJCQlicmVhazsKKwkKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGhhLT5wZGV2LCBQQ0lfQ09NTUFORCwgdyk7CisKKwkvKiBSZXNldCBleHBhbnNpb24gUk9NIGFkZHJlc3MgZGVjb2RlIGVuYWJsZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhhLT5wZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZ3KTsKKwl3ICY9IH5QQ0lfUk9NX0FERFJFU1NfRU5BQkxFOworCXBjaV93cml0ZV9jb25maWdfd29yZChoYS0+cGRldiwgUENJX1JPTV9BRERSRVNTLCB3KTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaXNwX2Zpcm13YXJlKCkgLSBDaG9vc2UgZmlybXdhcmUgaW1hZ2UuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9pc3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgIHJ2YWw7CisKKwkvKiBBc3N1bWUgbG9hZGluZyByaXNjIGNvZGUgKi8KKwlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsgCisKKwlpZiAoaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSSVNDIENPREUgTk9UIGxvYWRlZFxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgQ09ERSBOT1QgbG9hZGVkXG4iKTsKKworCQkvKiBWZXJpZnkgY2hlY2tzdW0gb2YgbG9hZGVkIFJJU0MgY29kZS4gKi8KKwkJcnZhbCA9IHFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKGhhKTsKKwl9CisKKwlpZiAocnZhbCkgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogKioqKiBMb2FkIFJJU0MgY29kZSAqKioqXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcmVzZXRfY2hpcCgpIC0gUmVzZXQgSVNQIGNoaXAuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfcmVzZXRfY2hpcChzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MgPSAwOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQzMl90CWNudDsKKwl1bnNpZ25lZCBsb25nCW1ieF9mbGFncyA9IDA7CisJdWludDE2X3QJY21kOworCisJLyogRGlzYWJsZSBJU1AgaW50ZXJydXB0cy4gKi8KKwlxbGEyeDAwX2Rpc2FibGVfaW50cnMoaGEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkvKiBUdXJuIG9mZiBtYXN0ZXIgZW5hYmxlICovCisJY21kID0gMDsKKwlwY2lfcmVhZF9jb25maWdfd29yZChoYS0+cGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWNtZCAmPSB+UENJX0NPTU1BTkRfTUFTVEVSOworCXBjaV93cml0ZV9jb25maWdfd29yZChoYS0+cGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisKKwlpZiAoIUlTX1FMQTIxMDAoaGEpKSB7CisJCS8qIFBhdXNlIFJJU0MuICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1BBVVNFX1JJU0MpOworCQlpZiAoSVNfUUxBMjIwMChoYSkgfHwgSVNfUUxBMjMwMChoYSkpIHsKKwkJCWZvciAoY250ID0gMDsgY250IDwgMzAwMDA7IGNudCsrKSB7CisJCQkJaWYgKChSRF9SRUdfV09SRCgmcmVnLT5oY2NyKSAmCisJCQkJICAgIEhDQ1JfUklTQ19QQVVTRSkgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsJLyogUENJIFBvc3RpbmcuICovCisJCQl1ZGVsYXkoMTApOworCQl9CisKKwkJLyogU2VsZWN0IEZQTSByZWdpc3RlcnMuICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cywgMHgyMCk7CisJCVJEX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCisJCS8qIEZQTSBTb2Z0IFJlc2V0LiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+ZnBtX2RpYWdfY29uZmlnLCAweDEwMCk7CisJCVJEX1JFR19XT1JEKCZyZWctPmZwbV9kaWFnX2NvbmZpZyk7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJCS8qIFRvZ2dsZSBGcG0gUmVzZXQuICovCisJCWlmICghSVNfUUxBMjIwMChoYSkpIHsKKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5mcG1fZGlhZ19jb25maWcsIDB4MCk7CisJCQlSRF9SRUdfV09SRCgmcmVnLT5mcG1fZGlhZ19jb25maWcpOyAvKiBQQ0kgUG9zdGluZy4gKi8KKwkJfQorCisJCS8qIFNlbGVjdCBmcmFtZSBidWZmZXIgcmVnaXN0ZXJzLiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDB4MTApOworCQlSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkvKiBSZXNldCBmcmFtZSBidWZmZXIgRklGT3MuICovCisJCWlmIChJU19RTEEyMjAwKGhhKSkgeworCQkJV1JUX0ZCX0NNRF9SRUcoaGEsIHJlZywgMHhhMDAwKTsKKwkJCVJEX0ZCX0NNRF9SRUcoaGEsIHJlZyk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwkJfSBlbHNlIHsKKwkJCVdSVF9GQl9DTURfUkVHKGhhLCByZWcsIDB4MDBmYyk7CisKKwkJCS8qIFJlYWQgYmFjayBmYl9jbWQgdW50aWwgemVybyBvciAzIHNlY29uZHMgbWF4ICovCisJCQlmb3IgKGNudCA9IDA7IGNudCA8IDMwMDA7IGNudCsrKSB7CisJCQkJaWYgKChSRF9GQl9DTURfUkVHKGhhLCByZWcpICYgMHhmZikgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9CisJCX0KKworCQkvKiBTZWxlY3QgUklTQyBtb2R1bGUgcmVnaXN0ZXJzLiAqLworCQlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIDApOworCQlSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKworCQkvKiBSZXNldCBSSVNDIHByb2Nlc3Nvci4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVTRVRfUklTQyk7CisJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkJLyogUENJIFBvc3RpbmcuICovCisKKwkJLyogUmVsZWFzZSBSSVNDIHByb2Nlc3Nvci4gKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfUkVMRUFTRV9SSVNDKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfUklTQ19JTlQpOworCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9IT1NUX0lOVCk7CisKKwkvKiBSZXNldCBJU1AgY2hpcC4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIENTUl9JU1BfU09GVF9SRVNFVCk7CisKKwkvKiBXYWl0IGZvciBSSVNDIHRvIHJlY292ZXIgZnJvbSByZXNldC4gKi8KKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkgfHwgSVNfUUxBMjMwMChoYSkpIHsKKwkJLyoKKwkJICogSXQgaXMgbmVjZXNzYXJ5IHRvIGZvciBhIGRlbGF5IGhlcmUgc2luY2UgdGhlIGNhcmQgZG9lc24ndAorCQkgKiByZXNwb25kIHRvIFBDSSByZWFkcyBkdXJpbmcgYSByZXNldC4gT24gc29tZSBhcmNoaXRlY3R1cmVzCisJCSAqIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gTUNBLgorCQkgKi8KKwkJdWRlbGF5KDIwKTsKKwkJZm9yIChjbnQgPSAzMDAwMDsgY250OyBjbnQtLSkgeworCQkJaWYgKChSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cykgJgorCQkJICAgIENTUl9JU1BfU09GVF9SRVNFVCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMDApOworCQl9CisJfSBlbHNlCisJCXVkZWxheSgxMCk7CisKKwkvKiBSZXNldCBSSVNDIHByb2Nlc3Nvci4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKKworCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOworCisJLyogUmVsZWFzZSBSSVNDIHByb2Nlc3Nvci4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRUxFQVNFX1JJU0MpOworCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkJCS8qIFBDSSBQb3N0aW5nLiAqLworCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpIHx8IElTX1FMQTIzMDAoaGEpKSB7CisJCWZvciAoY250ID0gMDsgY250IDwgMzAwMDA7IGNudCsrKSB7CisJCQlpZiAoISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpKQorCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bWJ4X3JlZ19sb2NrLCBtYnhfZmxhZ3MpOworCisJCQlpZiAoUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMCkgIT0gTUJTX0JVU1kpIHsKKwkJCQlpZiAoISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLAorCQkJCSAgICAmaGEtPmRwY19mbGFncykpKQorCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkgICAgJmhhLT5tYnhfcmVnX2xvY2ssIG1ieF9mbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSkpCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPm1ieF9yZWdfbG9jaywKKwkJCQkgICAgbWJ4X2ZsYWdzKTsKKworCQkJdWRlbGF5KDEwMCk7CisJCX0KKwl9IGVsc2UKKwkJdWRlbGF5KDEwMCk7CisKKwkvKiBUdXJuIG9uIG1hc3RlciBlbmFibGUgKi8KKwljbWQgfD0gUENJX0NPTU1BTkRfTUFTVEVSOworCXBjaV93cml0ZV9jb25maWdfd29yZChoYS0+cGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisKKwkvKiBEaXNhYmxlIFJJU0MgcGF1c2Ugb24gRlBNIHBhcml0eSBlcnJvci4gKi8KKwlpZiAoIUlTX1FMQTIxMDAoaGEpKSB7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0RJU0FCTEVfUEFSSVRZX1BBVVNFKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfY2hpcF9kaWFnKCkgLSBUZXN0IGNoaXAgZm9yIHByb3BlciBvcGVyYXRpb24uCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9jaGlwX2RpYWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CisJdWludDE2X3QJZGF0YTsKKwl1aW50MzJfdAljbnQ7CisJdWludDE2X3QJbWJbNV07CisKKwkvKiBBc3N1bWUgYSBmYWlsZWQgc3RhdGUgKi8KKwlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogVGVzdGluZyBkZXZpY2UgYXQgJWx4LlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sICh1X2xvbmcpJnJlZy0+Zmxhc2hfYWRkcmVzcykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkvKiBSZXNldCBJU1AgY2hpcC4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+Y3RybF9zdGF0dXMsIENTUl9JU1BfU09GVF9SRVNFVCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gaGF2ZSBhIGRlbGF5IGhlcmUgc2luY2UgdGhlIGNhcmQgd2lsbCBub3QgcmVzcG9uZCB3aGlsZQorCSAqIGluIHJlc2V0IGNhdXNpbmcgYW4gTUNBIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4KKwkgKi8KKwl1ZGVsYXkoMjApOworCWRhdGEgPSBxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKCZyZWctPmN0cmxfc3RhdHVzKTsKKwlmb3IgKGNudCA9IDYwMDAwMDAgOyBjbnQgJiYgKGRhdGEgJiBDU1JfSVNQX1NPRlRfUkVTRVQpOyBjbnQtLSkgeworCQl1ZGVsYXkoNSk7CisJCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CisJCWJhcnJpZXIoKTsKKwl9CisKKwlpZiAoIWNudCkKKwkJZ290byBjaGlwX2RpYWdfZmFpbGVkOworCisJREVCVUczKHByaW50aygic2NzaSglbGQpOiBSZXNldCByZWdpc3RlciBjbGVhcmVkIGJ5IGNoaXAgcmVzZXRcbiIsCisJICAgIGhhLT5ob3N0X25vKSk7CisKKwkvKiBSZXNldCBSSVNDIHByb2Nlc3Nvci4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRUxFQVNFX1JJU0MpOworCisJLyogV29ya2Fyb3VuZCBmb3IgUUxBMjMxMiBQQ0kgcGFyaXR5IGVycm9yICovCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpIHx8IElTX1FMQTIzMDAoaGEpKSB7CisJCWRhdGEgPSBxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKE1BSUxCT1hfUkVHKGhhLCByZWcsIDApKTsKKwkJZm9yIChjbnQgPSA2MDAwMDAwOyBjbnQgJiYgKGRhdGEgPT0gTUJTX0JVU1kpOyBjbnQtLSkgeworCQkJdWRlbGF5KDUpOworCQkJZGF0YSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCQkJYmFycmllcigpOyAKKwkJfQorCX0gZWxzZQorCQl1ZGVsYXkoMTApOworCisJaWYgKCFjbnQpCisJCWdvdG8gY2hpcF9kaWFnX2ZhaWxlZDsKKworCS8qIENoZWNrIHByb2R1Y3QgSUQgb2YgY2hpcCAqLworCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogQ2hlY2tpbmcgcHJvZHVjdCBJRCBvZiBjaGlwXG4iLCBoYS0+aG9zdF9ubykpOworCisJbWJbMV0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwltYlsyXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCW1iWzNdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMyk7CisJbWJbNF0gPSBxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKE1BSUxCT1hfUkVHKGhhLCByZWcsIDQpKTsKKwlpZiAobWJbMV0gIT0gUFJPRF9JRF8xIHx8IChtYlsyXSAhPSBQUk9EX0lEXzIgJiYgbWJbMl0gIT0gUFJPRF9JRF8yYSkgfHwKKwkgICAgbWJbM10gIT0gUFJPRF9JRF8zKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJXcm9uZyBwcm9kdWN0IElEID0gMHgleCwweCV4LDB4JXhcbiIsIG1iWzFdLCBtYlsyXSwgbWJbM10pOworCisJCWdvdG8gY2hpcF9kaWFnX2ZhaWxlZDsKKwl9CisJaGEtPnByb2R1Y3RfaWRbMF0gPSBtYlsxXTsKKwloYS0+cHJvZHVjdF9pZFsxXSA9IG1iWzJdOworCWhhLT5wcm9kdWN0X2lkWzJdID0gbWJbM107CisJaGEtPnByb2R1Y3RfaWRbM10gPSBtYls0XTsKKworCS8qIEFkanVzdCBmdyBSSVNDIHRyYW5zZmVyIHNpemUgKi8KKwlpZiAoaGEtPnJlcXVlc3RfcV9sZW5ndGggPiAxMDI0KQorCQloYS0+ZndfdHJhbnNmZXJfc2l6ZSA9IFJFUVVFU1RfRU5UUllfU0laRSAqIDEwMjQ7CisJZWxzZQorCQloYS0+ZndfdHJhbnNmZXJfc2l6ZSA9IFJFUVVFU1RfRU5UUllfU0laRSAqCisJCSAgICBoYS0+cmVxdWVzdF9xX2xlbmd0aDsKKworCWlmIChJU19RTEEyMjAwKGhhKSAmJgorCSAgICBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA3KSA9PSBRTEEyMjAwQV9SSVNDX1JPTV9WRVIpIHsKKwkJLyogTGltaXQgZmlybXdhcmUgdHJhbnNmZXIgc2l6ZSB3aXRoIGEgMjIwMEEgKi8KKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBGb3VuZCBRTEEyMjAwQSBjaGlwLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJaGEtPmZ3X3RyYW5zZmVyX3NpemUgPSAxMjg7CisJfQorCisJLyogV3JhcCBJbmNvbWluZyBNYWlsYm94ZXMgVGVzdC4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJREVCVUczKHByaW50aygic2NzaSglbGQpOiBDaGVja2luZyBtYWlsYm94ZXMuXG4iLCBoYS0+aG9zdF9ubykpOworCXJ2YWwgPSBxbGEyeDAwX21ieF9yZWdfdGVzdChoYSk7CisJaWYgKHJ2YWwpIHsKKwkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IEZhaWxlZCBtYWlsYm94IHNlbmQgcmVnaXN0ZXIgdGVzdFxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3RcbiIpOworCX0KKwllbHNlIHsKKwkJLyogRmxhZyBhIHN1Y2Nlc3NmdWwgcnZhbCAqLworCQlydmFsID0gUUxBX1NVQ0NFU1M7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCitjaGlwX2RpYWdfZmFpbGVkOgorCWlmIChydmFsKQorCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogQ2hpcCBkaWFnbm9zdGljcyAqKioqIEZBSUxFRCAiCisJCSAgICAiKioqKlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfcmVzaXplX3JlcXVlc3RfcSgpIC0gUmVzaXplIHJlcXVlc3QgcXVldWUgZ2l2ZW4gYXZhaWxhYmxlIElTUCBtZW1vcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfcmVzaXplX3JlcXVlc3RfcShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCXVpbnQxNl90IGZ3X2lvY2JfY250ID0gMDsKKwl1aW50MTZfdCByZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMlhYWF9FWFRfTUVNOworCWRtYV9hZGRyX3QgcmVxdWVzdF9kbWE7CisJcmVxdWVzdF90ICpyZXF1ZXN0X3Jpbmc7CisKKwkvKiBWYWxpZCBvbmx5IG9uIHJlY2VudCBJU1BzLiAqLworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJcmV0dXJuOworCisJLyogUmV0cmlldmUgSU9DQiBjb3VudHMgYXZhaWxhYmxlIHRvIHRoZSBmaXJtd2FyZS4gKi8KKwlydmFsID0gcWxhMngwMF9nZXRfcmVzb3VyY2VfY250cyhoYSwgTlVMTCwgTlVMTCwgTlVMTCwgJmZ3X2lvY2JfY250KTsKKwlpZiAocnZhbCkKKwkJcmV0dXJuOworCS8qIE5vIHBvaW50IGluIGNvbnRpbnVpbmcgaWYgY3VycmVudCBzZXR0aW5ncyBhcmUgc3VmZmljaWVudC4gKi8KKwlpZiAoZndfaW9jYl9jbnQgPCAxMDI0KQorCQlyZXR1cm47CisJaWYgKGhhLT5yZXF1ZXN0X3FfbGVuZ3RoID49IHJlcXVlc3RfcV9sZW5ndGgpCisJCXJldHVybjsKKworCS8qIEF0dGVtcHQgdG8gY2xhaW0gbGFyZ2VyIGFyZWEgZm9yIHJlcXVlc3QgcXVldWUuICovCisJcmVxdWVzdF9yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCSAgICAocmVxdWVzdF9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksICZyZXF1ZXN0X2RtYSwKKwkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJlcXVlc3RfcmluZyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBSZXNpemUgc3VjY2Vzc2Z1bCwgcmVwb3J0IGV4dGVuc2lvbnMuICovCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiRXh0ZW5kZWQgbWVtb3J5IGRldGVjdGVkICglZCBLQikuLi5cbiIsCisJICAgIChoYS0+ZndfbWVtb3J5X3NpemUgKyAxKSAvIDEwMjQpOworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJlc2l6aW5nIHJlcXVlc3QgcXVldWUgZGVwdGggIgorCSAgICAiKCVkIC0+ICVkKS4uLlxuIiwgaGEtPnJlcXVlc3RfcV9sZW5ndGgsIHJlcXVlc3RfcV9sZW5ndGgpOworCisJLyogQ2xlYXIgb2xkIGFsbG9jYXRpb25zLiAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCSAgICAoaGEtPnJlcXVlc3RfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLCBoYS0+cmVxdWVzdF9yaW5nLAorCSAgICBoYS0+cmVxdWVzdF9kbWEpOworCisJLyogQmVnaW4gdXNpbmcgbGFyZ2VyIHF1ZXVlLiAqLworCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gcmVxdWVzdF9xX2xlbmd0aDsKKwloYS0+cmVxdWVzdF9yaW5nID0gcmVxdWVzdF9yaW5nOworCWhhLT5yZXF1ZXN0X2RtYSA9IHJlcXVlc3RfZG1hOworfQorCisvKioKKyAqIHFsYTJ4MDBfc2V0dXBfY2hpcCgpIC0gTG9hZCBhbmQgc3RhcnQgUklTQyBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3NldHVwX2NoaXAoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDE2X3QJY250OworCXVpbnQxNl90CSpyaXNjX2NvZGU7CisJdW5zaWduZWQgbG9uZwlyaXNjX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZwlyaXNjX2NvZGVfc2l6ZTsKKwlpbnQJCW51bTsKKwlpbnQJCWk7CisJdWludDE2X3QJKnJlcV9yaW5nOworCXN0cnVjdCBxbGFfZndfaW5mbyAqZndfaXRlcjsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCS8qIExvYWQgZmlybXdhcmUgc2VxdWVuY2VzICovCisJZndfaXRlciA9IGhhLT5icmRfaW5mby0+ZndfaW5mbzsKKwl3aGlsZSAoZndfaXRlci0+YWRkcmVzc2luZyAhPSBGV19JTkZPX0FERFJfTk9NT1JFKSB7CisJCXJpc2NfY29kZSA9IGZ3X2l0ZXItPmZ3Y29kZTsKKwkJcmlzY19jb2RlX3NpemUgPSAqZndfaXRlci0+ZndsZW47CisKKwkJaWYgKGZ3X2l0ZXItPmFkZHJlc3NpbmcgPT0gRldfSU5GT19BRERSX05PUk1BTCkgeworCQkJcmlzY19hZGRyZXNzID0gKmZ3X2l0ZXItPmZ3c3RhcnQ7CisJCX0gZWxzZSB7CisJCQkvKiBFeHRlbmRlZCBhZGRyZXNzICovCisJCQlyaXNjX2FkZHJlc3MgPSAqZndfaXRlci0+bGZ3c3RhcnQ7CisJCX0KKworCQludW0gPSAwOworCQlydmFsID0gMDsKKwkJd2hpbGUgKHJpc2NfY29kZV9zaXplID4gMCAmJiAhcnZhbCkgeworCQkJY250ID0gKHVpbnQxNl90KShoYS0+ZndfdHJhbnNmZXJfc2l6ZSA+PiAxKTsKKwkJCWlmIChjbnQgPiByaXNjX2NvZGVfc2l6ZSkKKwkJCQljbnQgPSByaXNjX2NvZGVfc2l6ZTsKKworCQkJREVCVUc3KHByaW50aygic2NzaSglbGQpOiBMb2FkaW5nIHJpc2Mgc2VnbWVudEAgIgorCQkJICAgICJhZGRyICVwLCBudW1iZXIgb2YgYnl0ZXMgMHgleCwgb2Zmc2V0IDB4JWx4LlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgcmlzY19jb2RlLCBjbnQsIHJpc2NfYWRkcmVzcykpOworCisJCQlyZXFfcmluZyA9ICh1aW50MTZfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCQkJcmVxX3JpbmdbaV0gPSBjcHVfdG9fbGUxNihyaXNjX2NvZGVbaV0pOworCisJCQlpZiAoZndfaXRlci0+YWRkcmVzc2luZyA9PSBGV19JTkZPX0FERFJfTk9STUFMKSB7CisJCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0oaGEsCisJCQkJICAgIGhhLT5yZXF1ZXN0X2RtYSwgcmlzY19hZGRyZXNzLCBjbnQpOworCQkJfSBlbHNlIHsKKwkJCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbV9leHQoaGEsCisJCQkJICAgIGhhLT5yZXF1ZXN0X2RtYSwgcmlzY19hZGRyZXNzLCBjbnQpOworCQkJfQorCQkJaWYgKHJ2YWwpIHsKKwkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogW0VSUk9SXSBGYWlsZWQgdG8gIgorCQkJCSAgICAibG9hZCBzZWdtZW50ICVkIG9mIGZpcm13YXJlXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgbnVtKSk7CisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gbG9hZCAiCisJCQkJICAgICJzZWdtZW50ICVkIG9mIGZpcm13YXJlXG4iLCBudW0pOworCisJCQkJcWxhMngwMF9kdW1wX3JlZ3MoaGEpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyaXNjX2NvZGUgKz0gY250OworCQkJcmlzY19hZGRyZXNzICs9IGNudDsKKwkJCXJpc2NfY29kZV9zaXplIC09IGNudDsKKwkJCW51bSsrOworCQl9CisKKwkJLyogTmV4dCBmaXJtd2FyZSBzZXF1ZW5jZSAqLworCQlmd19pdGVyKys7CisJfQorCisJLyogVmVyaWZ5IGNoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuICovCisJaWYgKCFydmFsKSB7CisJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBWZXJpZnlpbmcgQ2hlY2tzdW0gb2YgbG9hZGVkIFJJU0MgIgorCQkgICAgImNvZGUuXG4iLCBoYS0+aG9zdF9ubykpOworCisJCXJ2YWwgPSBxbGEyeDAwX3ZlcmlmeV9jaGVja3N1bShoYSk7CisJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCQkvKiBTdGFydCBmaXJtd2FyZSBleGVjdXRpb24uICovCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogQ2hlY2tzdW0gT0ssIHN0YXJ0ICIKKwkJCSAgICAiZmlybXdhcmUuXG4iLCBoYS0+aG9zdF9ubykpOworCisJCQlydmFsID0gcWxhMngwMF9leGVjdXRlX2Z3KGhhKTsKKwkJCS8qIFJldHJpZXZlIGZpcm13YXJlIGluZm9ybWF0aW9uLiAqLworCQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MgJiYgaGEtPmZ3X21ham9yX3ZlcnNpb24gPT0gMCkgeworCQkJCXFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24oaGEsCisJCQkJICAgICZoYS0+ZndfbWFqb3JfdmVyc2lvbiwKKwkJCQkgICAgJmhhLT5md19taW5vcl92ZXJzaW9uLAorCQkJCSAgICAmaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sCisJCQkJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSk7CisJCQkJcWxhMngwMF9yZXNpemVfcmVxdWVzdF9xKGhhKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkKTogSVNQIEZpcm13YXJlIGZhaWxlZCBjaGVja3N1bS5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBTZXR1cCBjaGlwICoqKiogRkFJTEVEICoqKiouXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMoKSAtIEluaXRpYWxpemVzIHJlc3BvbnNlIHF1ZXVlIGVudHJpZXMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBCZWdpbm5pbmcgb2YgcmVxdWVzdCByaW5nIGhhcyBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrIGFscmVhZHkgYnVpbHQKKyAqIGJ5IG52cmFtIGNvbmZpZyByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVpbnQxNl90IGNudDsKKwlyZXNwb25zZV90ICpwa3Q7CisKKwlwa3QgPSBoYS0+cmVzcG9uc2VfcmluZ19wdHI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBoYS0+cmVzcG9uc2VfcV9sZW5ndGg7IGNudCsrKSB7CisJCXBrdC0+c2lnbmF0dXJlID0gUkVTUE9OU0VfUFJPQ0VTU0VEOworCQlwa3QrKzsKKwl9CisKK30KKworLyoqCisgKiBxbGEyeDAwX3VwZGF0ZV9md19vcHRpb25zKCkgLSBSZWFkIGFuZCBwcm9jZXNzIGZpcm13YXJlIG9wdGlvbnMuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MTZfdCBzd2luZywgZW1waGFzaXMsIHR4X3NlbnMsIHJ4X3NlbnM7CisKKwltZW1zZXQoaGEtPmZ3X29wdGlvbnMsIDAsIHNpemVvZihoYS0+Zndfb3B0aW9ucykpOworCXFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoaGEsIGhhLT5md19vcHRpb25zKTsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJcmV0dXJuOworCisJLyogU2VyaWFsIExpbmsgb3B0aW9ucy4gKi8KKwlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFNlcmlhbCBsaW5rIG9wdGlvbnM6XG4iLAorCSAgICBoYS0+aG9zdF9ubykpOworCURFQlVHMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMsCisJICAgIHNpemVvZihoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zKSkpOworCisJaGEtPmZ3X29wdGlvbnNbMV0gJj0gfkZPMV9TRVRfRU1QSEFTSVNfU1dJTkc7CisJaWYgKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbM10gJiBCSVRfMikgeworCQloYS0+Zndfb3B0aW9uc1sxXSB8PSBGTzFfU0VUX0VNUEhBU0lTX1NXSU5HOworCisJCS8qICAxRyBzZXR0aW5ncyAqLworCQlzd2luZyA9IGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbMl0gJiAoQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsKKwkJZW1waGFzaXMgPSAoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1syXSAmCisJCSAgICAoQklUXzQgfCBCSVRfMykpID4+IDM7CisJCXR4X3NlbnMgPSBoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zWzBdICYKKwkJICAgIChCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCk7IAorCQlyeF9zZW5zID0gKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbMF0gJgorCQkgICAgKEJJVF83IHwgQklUXzYgfCBCSVRfNSB8IEJJVF80KSkgPj4gNDsKKwkJaGEtPmZ3X29wdGlvbnNbMTBdID0gKGVtcGhhc2lzIDw8IDE0KSB8IChzd2luZyA8PCA4KTsKKwkJaWYgKElTX1FMQTIzMDAoaGEpIHx8IElTX1FMQTIzMTIoaGEpIHx8IElTX1FMQTYzMTIoaGEpKSB7CisJCQlpZiAocnhfc2VucyA9PSAweDApCisJCQkJcnhfc2VucyA9IDB4MzsKKwkJCWhhLT5md19vcHRpb25zWzEwXSB8PSAodHhfc2VucyA8PCA0KSB8IHJ4X3NlbnM7CisJCX0gZWxzZSBpZiAoSVNfUUxBMjMyMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpCisJCQloYS0+Zndfb3B0aW9uc1sxMF0gfD0gQklUXzUgfAorCQkJICAgICgocnhfc2VucyAmIChCSVRfMSB8IEJJVF8wKSkgPDwgMikgfAorCQkJICAgICh0eF9zZW5zICYgKEJJVF8xIHwgQklUXzApKTsKKworCQkvKiAgMkcgc2V0dGluZ3MgKi8KKwkJc3dpbmcgPSAoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1syXSAmCisJCSAgICAoQklUXzcgfCBCSVRfNiB8IEJJVF81KSkgPj4gNTsKKwkJZW1waGFzaXMgPSBoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zWzNdICYgKEJJVF8xIHwgQklUXzApOworCQl0eF9zZW5zID0gaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1sxXSAmCisJCSAgICAoQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOyAKKwkJcnhfc2VucyA9IChoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zWzFdICYKKwkJICAgIChCSVRfNyB8IEJJVF82IHwgQklUXzUgfCBCSVRfNCkpID4+IDQ7CisJCWhhLT5md19vcHRpb25zWzExXSA9IChlbXBoYXNpcyA8PCAxNCkgfCAoc3dpbmcgPDwgOCk7CisJCWlmIChJU19RTEEyMzAwKGhhKSB8fCBJU19RTEEyMzEyKGhhKSB8fCBJU19RTEE2MzEyKGhhKSkgeworCQkJaWYgKHJ4X3NlbnMgPT0gMHgwKQorCQkJCXJ4X3NlbnMgPSAweDM7CisJCQloYS0+Zndfb3B0aW9uc1sxMV0gfD0gKHR4X3NlbnMgPDwgNCkgfCByeF9zZW5zOworCQl9IGVsc2UgaWYgKElTX1FMQTIzMjIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKQorCQkJaGEtPmZ3X29wdGlvbnNbMTFdIHw9IEJJVF81IHwKKwkJCSAgICAoKHJ4X3NlbnMgJiAoQklUXzEgfCBCSVRfMCkpIDw8IDIpIHwKKwkJCSAgICAodHhfc2VucyAmIChCSVRfMSB8IEJJVF8wKSk7CisJfQorCisJLyogRkNQMiBvcHRpb25zLiAqLworCS8qICBSZXR1cm4gY29tbWFuZCBJT0NCcyB3aXRob3V0IHdhaXRpbmcgZm9yIGFuIEFCVFMgdG8gY29tcGxldGUuICovCisJaGEtPmZ3X29wdGlvbnNbM10gfD0gQklUXzEzOworCisJLyogTEVEIHNjaGVtZS4gKi8KKwlpZiAoaGEtPmZsYWdzLmVuYWJsZV9sZWRfc2NoZW1lKQorCQloYS0+Zndfb3B0aW9uc1syXSB8PSBCSVRfMTI7CisKKwkvKiBVcGRhdGUgZmlybXdhcmUgb3B0aW9ucy4gKi8KKwlxbGEyeDAwX3NldF9md19vcHRpb25zKGhhLCBoYS0+Zndfb3B0aW9ucyk7Cit9CisKKy8qKgorICogcWxhMngwMF9pbml0X3JpbmdzKCkgLSBJbml0aWFsaXplcyBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIEJlZ2lubmluZyBvZiByZXF1ZXN0IHJpbmcgaGFzIGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgYWxyZWFkeSBidWlsdAorICogYnkgbnZyYW0gY29uZmlnIHJvdXRpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfaW5pdF9yaW5ncyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAlydmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBjbnQ7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIENsZWFyIG91dHN0YW5kaW5nIGNvbW1hbmRzIGFycmF5LiAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykKKwkJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CisKKwloYS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSAwOworCisJLyogQ2xlYXIgUlNDTiBxdWV1ZS4gKi8KKwloYS0+cnNjbl9pbl9wdHIgPSAwOworCWhhLT5yc2NuX291dF9wdHIgPSAwOworCisJLyogSW5pdGlhbGl6ZSBmaXJtd2FyZS4gKi8KKwloYS0+cmVxdWVzdF9yaW5nX3B0ciAgPSBoYS0+cmVxdWVzdF9yaW5nOworCWhhLT5yZXFfcmluZ19pbmRleCAgICA9IDA7CisJaGEtPnJlcV9xX2NudCAgICAgICAgID0gaGEtPnJlcXVlc3RfcV9sZW5ndGg7CisJaGEtPnJlc3BvbnNlX3JpbmdfcHRyID0gaGEtPnJlc3BvbnNlX3Jpbmc7CisJaGEtPnJzcF9yaW5nX2luZGV4ICAgID0gMDsKKworCS8qIFNldHVwIHJpbmcgcGFyYW1ldGVycyBpbiBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLiAqLworCWhhLT5pbml0X2NiLT5yZXF1ZXN0X3Ffb3V0cG9pbnRlciA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfaW5wb2ludGVyID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKKwloYS0+aW5pdF9jYi0+cmVxdWVzdF9xX2xlbmd0aCA9IGNwdV90b19sZTE2KGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKTsKKwloYS0+aW5pdF9jYi0+cmVzcG9uc2VfcV9sZW5ndGggPSBjcHVfdG9fbGUxNihoYS0+cmVzcG9uc2VfcV9sZW5ndGgpOworCWhhLT5pbml0X2NiLT5yZXF1ZXN0X3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+cmVxdWVzdF9kbWEpKTsKKwloYS0+aW5pdF9jYi0+cmVxdWVzdF9xX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnJlcXVlc3RfZG1hKSk7CisJaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKExTRChoYS0+cmVzcG9uc2VfZG1hKSk7CisJaGEtPmluaXRfY2ItPnJlc3BvbnNlX3FfYWRkcmVzc1sxXSA9IGNwdV90b19sZTMyKE1TRChoYS0+cmVzcG9uc2VfZG1hKSk7CisKKwkvKiBJbml0aWFsaXplIHJlc3BvbnNlIHF1ZXVlIGVudHJpZXMgKi8KKwlxbGEyeDAwX2luaXRfcmVzcG9uc2VfcV9lbnRyaWVzKGhhKTsKKworIAlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCByZWcpLCAwKTsKKyAJV1JUX1JFR19XT1JEKElTUF9SRVFfUV9PVVQoaGEsIHJlZyksIDApOworIAlXUlRfUkVHX1dPUkQoSVNQX1JTUF9RX0lOKGhhLCByZWcpLCAwKTsKKyAJV1JUX1JFR19XT1JEKElTUF9SU1BfUV9PVVQoaGEsIHJlZyksIDApOworCVJEX1JFR19XT1JEKElTUF9SU1BfUV9PVVQoaGEsIHJlZykpOwkJLyogUENJIFBvc3RpbmcuICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogVXBkYXRlIGFueSBJU1Agc3BlY2lmaWMgZmlybXdhcmUgb3B0aW9ucyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uICovCisJcWxhMngwMF91cGRhdGVfZndfb3B0aW9ucyhoYSk7CisKKwlERUJVRyhwcmludGsoInNjc2koJWxkKTogSXNzdWUgaW5pdCBmaXJtd2FyZS5cbiIsIGhhLT5ob3N0X25vKSk7CisJcnZhbCA9IHFsYTJ4MDBfaW5pdF9maXJtd2FyZShoYSwgc2l6ZW9mKGluaXRfY2JfdCkpOworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBJbml0IGZpcm13YXJlICoqKiogRkFJTEVEICoqKiouXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9IGVsc2UgeworCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEluaXQgZmlybXdhcmUgLS0gc3VjY2Vzcy5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9md19yZWFkeSgpIC0gV2FpdHMgZm9yIGZpcm13YXJlIHJlYWR5LgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZndfcmVhZHkoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJCXJ2YWw7CisJdW5zaWduZWQgbG9uZwl3dGltZSwgbXRpbWU7CisJdWludDE2X3QJbWluX3dhaXQ7CS8qIE1pbmltdW0gd2FpdCB0aW1lIGlmIGxvb3AgaXMgZG93biAqLworCXVpbnQxNl90CXdhaXRfdGltZTsJLyogV2FpdCB0aW1lIGlmIGxvb3AgaXMgY29taW5nIHJlYWR5ICovCisJdWludDE2X3QJZndfc3RhdGU7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkvKiAyMCBzZWNvbmRzIGZvciBsb29wIGRvd24uICovCisJbWluX3dhaXQgPSAyMDsJCQorCisJLyoKKwkgKiBGaXJtd2FyZSBzaG91bGQgdGFrZSBhdCBtb3N0IG9uZSBSQVRPViB0byBsb2dpbiwgcGx1cyA1IHNlY29uZHMgZm9yCisJICogb3VyIG93biBwcm9jZXNzaW5nLgorCSAqLworCWlmICgod2FpdF90aW1lID0gKGhhLT5yZXRyeV9jb3VudCpoYS0+bG9naW5fdGltZW91dCkgKyA1KSA8IG1pbl93YWl0KSB7CisJCXdhaXRfdGltZSA9IG1pbl93YWl0OworCX0KKworCS8qIE1pbiB3YWl0IHRpbWUgaWYgbG9vcCBkb3duICovCisJbXRpbWUgPSBqaWZmaWVzICsgKG1pbl93YWl0ICogSFopOworCisJLyogd2FpdCB0aW1lIGJlZm9yZSBmaXJtd2FyZSByZWFkeSAqLworCXd0aW1lID0gamlmZmllcyArICh3YWl0X3RpbWUgKiBIWik7CisKKwkvKiBXYWl0IGZvciBJU1AgdG8gZmluaXNoIExJUCAqLworCWlmICghaGEtPmZsYWdzLmluaXRfZG9uZSkKKyAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIldhaXRpbmcgZm9yIExJUCB0byBjb21wbGV0ZS4uLlxuIik7CisKKwlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFdhaXRpbmcgZm9yIExJUCB0byBjb21wbGV0ZS4uLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pKTsKKworCWRvIHsKKwkJcnZhbCA9IHFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKGhhLCAmZndfc3RhdGUpOworCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkJaWYgKGZ3X3N0YXRlIDwgRlNUQVRFX0xPU1NfT0ZfU1lOQykgeworCQkJCWhhLT5kZXZpY2VfZmxhZ3MgJj0gfkRGTEdfTk9fQ0FCTEU7CisJCQl9CisJCQlpZiAoZndfc3RhdGUgPT0gRlNUQVRFX1JFQURZKSB7CisJCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IEYvVyBSZWFkeSAtIE9LIFxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkJCXFsYTJ4MDBfZ2V0X3JldHJ5X2NudChoYSwgJmhhLT5yZXRyeV9jb3VudCwKKwkJCQkgICAgJmhhLT5sb2dpbl90aW1lb3V0LCAmaGEtPnJfYV90b3YpOworCisJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgorCQkJICAgIChmd19zdGF0ZSA+PSBGU1RBVEVfTE9TU19PRl9TWU5DIHx8CisJCQkJZndfc3RhdGUgPT0gRlNUQVRFX1dBSVRfQUxfUEEpKSB7CisJCQkJLyogTG9vcCBkb3duLiBUaW1lb3V0IG9uIG1pbl93YWl0IGZvciBzdGF0ZXMKKwkJCQkgKiBvdGhlciB0aGFuIFdhaXQgZm9yIExvZ2luLiAKKwkJCQkgKi8JCisJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbXRpbWUpKSB7CisJCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkJICAgICJDYWJsZSBpcyB1bnBsdWdnZWQuLi5cbiIpOworCisJCQkJCWhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19OT19DQUJMRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogTWFpbGJveCBjbWQgZmFpbGVkLiBUaW1lb3V0IG9uIG1pbl93YWl0LiAqLworCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbXRpbWUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgd3RpbWUpKQorCQkJYnJlYWs7CisKKwkJLyogRGVsYXkgZm9yIGEgd2hpbGUgKi8KKwkJbXNsZWVwKDUwMCk7CisKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBmd19zdGF0ZT0leCBjdXJyIHRpbWU9JWx4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBmd19zdGF0ZSwgamlmZmllcykpOworCX0gd2hpbGUgKDEpOworCisJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGZ3X3N0YXRlPSV4IGN1cnIgdGltZT0lbHguXG4iLAorCSAgICBoYS0+aG9zdF9ubywgZndfc3RhdGUsIGppZmZpZXMpKTsKKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBGaXJtd2FyZSByZWFkeSAqKioqIEZBSUxFRCAqKioqLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyogIHFsYTJ4MDBfY29uZmlndXJlX2hiYQorKiAgICAgIFNldHVwIGFkYXB0ZXIgY29udGV4dC4KKyoKKyogSW5wdXQ6CisqICAgICAgaGEgPSBhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisqCisqIFJldHVybnM6CisqICAgICAgMCA9IHN1Y2Nlc3MKKyoKKyogQ29udGV4dDoKKyogICAgICBLZXJuZWwgY29udGV4dC4KKyovCitzdGF0aWMgaW50CitxbGEyeDAwX2NvbmZpZ3VyZV9oYmEoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgICAgICAgcnZhbDsKKwl1aW50MTZfdCAgICAgIGxvb3BfaWQ7CisJdWludDE2X3QgICAgICB0b3BvOworCXVpbnQ4X3QgICAgICAgYWxfcGE7CisJdWludDhfdCAgICAgICBhcmVhOworCXVpbnQ4X3QgICAgICAgZG9tYWluOworCWNoYXIJCWNvbm5lY3RfdHlwZVsyMl07CisKKwkvKiBHZXQgaG9zdCBhZGRyZXNzZXMuICovCisJcnZhbCA9IHFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoaGEsCisJICAgICZsb29wX2lkLCAmYWxfcGEsICZhcmVhLCAmZG9tYWluLCAmdG9wbyk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkVSUk9SIC0tIFVuYWJsZSB0byBnZXQgaG9zdCBsb29wIElELlxuIik7CisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlyZXR1cm4gKHJ2YWwpOworCX0KKworCWlmICh0b3BvID09IDQpIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJIkNhbm5vdCBnZXQgdG9wb2xvZ3kgLSByZXRyeWluZy5cbiIpOworCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCX0KKworCWhhLT5sb29wX2lkID0gbG9vcF9pZDsKKworCS8qIGluaXRpYWxpemUgKi8KKwloYS0+bWluX2V4dGVybmFsX2xvb3BpZCA9IFNOU19GSVJTVF9MT09QX0lEOworCWhhLT5vcGVyYXRpbmdfbW9kZSA9IExPT1A7CisKKwlzd2l0Y2ggKHRvcG8pIHsKKwljYXNlIDA6CisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogSEJBIGluIE5MIHRvcG9sb2d5LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OTDsKKwkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihMb29wKSIpOworCQlicmVhazsKKworCWNhc2UgMToKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gRkwgdG9wb2xvZ3kuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX0ZMOworCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKEZMX1BvcnQpIik7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBOIFAyUCB0b3BvbG9neS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQloYS0+b3BlcmF0aW5nX21vZGUgPSBQMlA7CisJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OOworCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKE5fUG9ydC10by1OX1BvcnQpIik7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBGIFAyUCB0b3BvbG9neS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQloYS0+b3BlcmF0aW5nX21vZGUgPSBQMlA7CisJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19GOworCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKEZfUG9ydCkiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiB1bmtub3duIHRvcG9sb2d5ICV4LiAiCisJCSAgICAiVXNpbmcgTkwuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHRvcG8pKTsKKwkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX05MOworCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKExvb3ApIik7CisJCWJyZWFrOworCX0KKworCS8qIFNhdmUgSG9zdCBwb3J0IGFuZCBsb29wIElELiAqLworCS8qIGJ5dGUgb3JkZXIgLSBCaWcgRW5kaWFuICovCisJaGEtPmRfaWQuYi5kb21haW4gPSBkb21haW47CisJaGEtPmRfaWQuYi5hcmVhID0gYXJlYTsKKwloYS0+ZF9pZC5iLmFsX3BhID0gYWxfcGE7CisKKwlpZiAoIWhhLT5mbGFncy5pbml0X2RvbmUpCisgCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiVG9wb2xvZ3kgLSAlcywgSG9zdCBMb29wIGFkZHJlc3MgMHgleFxuIiwKKyAJCSAgICBjb25uZWN0X3R5cGUsIGhhLT5sb29wX2lkKTsKKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBGQUlMRUQuXG4iLCBoYS0+aG9zdF9ubykpOworCX0gZWxzZSB7CisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogZXhpdGluZyBub3JtYWxseS5cbiIsIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuKHJ2YWwpOworfQorCisvKgorKiBOVlJBTSBjb25maWd1cmF0aW9uIGZvciBJU1AgMnh4eAorKgorKiBJbnB1dDoKKyogICAgICBoYSAgICAgICAgICAgICAgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyoKKyogT3V0cHV0OgorKiAgICAgIGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgaW4gcmVzcG9uc2VfcmluZworKiAgICAgIGhvc3QgYWRhcHRlcnMgcGFyYW1ldGVycyBpbiBob3N0IGFkYXB0ZXIgYmxvY2sKKyoKKyogUmV0dXJuczoKKyogICAgICAwID0gc3VjY2Vzcy4KKyovCitzdGF0aWMgaW50CitxbGEyeDAwX252cmFtX2NvbmZpZyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCAgIHJ2YWw7CisJdWludDhfdCAgIGNoa3N1bSA9IDA7CisJdWludDE2X3QgIGNudDsKKwl1aW50OF90ICAgKmRwdHIxLCAqZHB0cjI7CisJaW5pdF9jYl90ICppY2IgICA9IGhhLT5pbml0X2NiOworCW52cmFtX3QgKm52ICAgID0gKG52cmFtX3QgKiloYS0+cmVxdWVzdF9yaW5nOworCXVpbnQxNl90ICAqd3B0ciAgPSAodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVpbnQ4X3QgIHRpbWVyX21vZGU7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkvKiBEZXRlcm1pbmUgTlZSQU0gc3RhcnRpbmcgYWRkcmVzcy4gKi8KKwloYS0+bnZyYW1fYmFzZSA9IDA7CisJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYgIUlTX1FMQTIzMDAoaGEpKQorCQlpZiAoKFJEX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzKSA+PiAxNCkgPT0gMSkKKwkJCWhhLT5udnJhbV9iYXNlID0gMHg4MDsKKworCS8qIEdldCBOVlJBTSBkYXRhIGFuZCBjYWxjdWxhdGUgY2hlY2tzdW0uICovCisJcWxhMngwMF9sb2NrX252cmFtX2FjY2VzcyhoYSk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YobnZyYW1fdCkvMjsgY250KyspIHsKKwkJKndwdHIgPSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9udnJhbV93b3JkKGhhLAorCQkgICAgKGNudCtoYS0+bnZyYW1fYmFzZSkpKTsKKwkJY2hrc3VtICs9ICh1aW50OF90KSp3cHRyOworCQljaGtzdW0gKz0gKHVpbnQ4X3QpKCp3cHRyID4+IDgpOworCQl3cHRyKys7CisJfQorCXFsYTJ4MDBfdW5sb2NrX252cmFtX2FjY2VzcyhoYSk7CisKKwlERUJVRzUocHJpbnRrKCJzY3NpKCVsZCk6IENvbnRlbnRzIG9mIE5WUkFNXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopaGEtPnJlcXVlc3RfcmluZywKKwkgICAgc2l6ZW9mKG52cmFtX3QpKSk7CisKKwkvKiBCYWQgTlZSQU0gZGF0YSwgc2V0IGRlZmF1bHRzIHBhcmFtZXRlcnMuICovCisJaWYgKGNoa3N1bSB8fCBudi0+aWRbMF0gIT0gJ0knIHx8IG52LT5pZFsxXSAhPSAnUycgfHwKKwkgICAgbnYtPmlkWzJdICE9ICdQJyB8fCBudi0+aWRbM10gIT0gJyAnIHx8IG52LT5udnJhbV92ZXJzaW9uIDwgMSkgeworCQkvKiBSZXNldCBOVlJBTSBkYXRhLiAqLworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJbmNvbnNpc3RlbnQgTlZSQU0gZGV0ZWN0ZWQ6ICIKKwkJICAgICJjaGVja3N1bT0weCV4IGlkPSVjIHZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgbnYtPmlkWzBdLAorCQkgICAgbnYtPm52cmFtX3ZlcnNpb24pOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJGYWxsaW5nIGJhY2sgdG8gZnVuY3Rpb25pbmcgKHlldCAiCisJCSAgICAiaW52YWxpZCAtLSBXV1BOKSBkZWZhdWx0cy5cbiIpOworCisJCS8qCisJCSAqIFNldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCisJCSAqLworCQltZW1zZXQobnYsIDAsIHNpemVvZihudnJhbV90KSk7CisJCW52LT5wYXJhbWV0ZXJfYmxvY2tfdmVyc2lvbiA9IElDQl9WRVJTSU9OOworCisJCWlmIChJU19RTEEyM1hYKGhhKSkgeworCQkJbnYtPmZpcm13YXJlX29wdGlvbnNbMF0gPSBCSVRfMiB8IEJJVF8xOworCQkJbnYtPmZpcm13YXJlX29wdGlvbnNbMV0gPSBCSVRfNyB8IEJJVF81OworCQkJbnYtPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdID0gQklUXzU7CisJCQludi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMV0gPSBCSVRfNSB8IEJJVF80OworCQkJbnYtPmZyYW1lX3BheWxvYWRfc2l6ZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMjA0OCk7CisJCQludi0+c3BlY2lhbF9vcHRpb25zWzFdID0gQklUXzc7CisJCX0gZWxzZSBpZiAoSVNfUUxBMjIwMChoYSkpIHsKKwkJCW52LT5maXJtd2FyZV9vcHRpb25zWzBdID0gQklUXzIgfCBCSVRfMTsKKwkJCW52LT5maXJtd2FyZV9vcHRpb25zWzFdID0gQklUXzcgfCBCSVRfNTsKKwkJCW52LT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSA9IEJJVF81OworCQkJbnYtPmFkZF9maXJtd2FyZV9vcHRpb25zWzFdID0gQklUXzUgfCBCSVRfNDsKKwkJCW52LT5mcmFtZV9wYXlsb2FkX3NpemUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEwMjQpOworCQl9IGVsc2UgaWYgKElTX1FMQTIxMDAoaGEpKSB7CisJCQludi0+ZmlybXdhcmVfb3B0aW9uc1swXSA9IEJJVF8zIHwgQklUXzE7CisJCQludi0+ZmlybXdhcmVfb3B0aW9uc1sxXSA9IEJJVF81OworCQkJbnYtPmZyYW1lX3BheWxvYWRfc2l6ZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMTAyNCk7CisJCX0KKworCQludi0+bWF4X2lvY2JfYWxsb2NhdGlvbiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMjU2KTsKKwkJbnYtPmV4ZWN1dGlvbl90aHJvdHRsZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMTYpOworCQludi0+cmV0cnlfY291bnQgPSA4OworCQludi0+cmV0cnlfZGVsYXkgPSAxOworCisJCW52LT5wb3J0X25hbWVbMF0gPSAzMzsKKwkJbnYtPnBvcnRfbmFtZVszXSA9IDIyNDsKKwkJbnYtPnBvcnRfbmFtZVs0XSA9IDEzOTsKKworCQludi0+bG9naW5fdGltZW91dCA9IDQ7CisKKwkJLyoKKwkJICogU2V0IGRlZmF1bHQgaG9zdCBhZGFwdGVyIHBhcmFtZXRlcnMKKwkJICovCisJCW52LT5ob3N0X3BbMV0gPSBCSVRfMjsKKwkJbnYtPnJlc2V0X2RlbGF5ID0gNTsKKwkJbnYtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IDg7CisJCW52LT5tYXhfbHVuc19wZXJfdGFyZ2V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNig4KTsKKwkJbnYtPmxpbmtfZG93bl90aW1lb3V0ID0gNjA7CisKKwkJcnZhbCA9IDE7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfSUE2NF9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19JQTY0X1NHSV9TTjIpCisJLyoKKwkgKiBUaGUgU04yIGRvZXMgbm90IHByb3ZpZGUgQklPUyBlbXVsYXRpb24gd2hpY2ggbWVhbnMgeW91IGNhbid0IGNoYW5nZQorCSAqIHBvdGVudGlhbGx5IGJvZ3VzIEJJT1Mgc2V0dGluZ3MuIEZvcmNlIHRoZSB1c2Ugb2YgZGVmYXVsdCBzZXR0aW5ncworCSAqIGZvciBsaW5rIHJhdGUgYW5kIGZyYW1lIHNpemUuICBIb3BlIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHNldHRpbmdzCisJICogYXJlIHZhbGlkLgorCSAqLworCWlmIChpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkgeworCQludi0+ZnJhbWVfcGF5bG9hZF9zaXplID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigyMDQ4KTsKKwkJaWYgKElTX1FMQTIzWFgoaGEpKQorCQkJbnYtPnNwZWNpYWxfb3B0aW9uc1sxXSA9IEJJVF83OworCX0KKyNlbmRpZgorCisJLyogUmVzZXQgSW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jayAqLworCW1lbXNldChpY2IsIDAsIHNpemVvZihpbml0X2NiX3QpKTsKKworCS8qCisJICogU2V0dXAgZHJpdmVyIE5WUkFNIG9wdGlvbnMuCisJICovCisJbnYtPmZpcm13YXJlX29wdGlvbnNbMF0gfD0gKEJJVF82IHwgQklUXzEpOworCW52LT5maXJtd2FyZV9vcHRpb25zWzBdICY9IH4oQklUXzUgfCBCSVRfNCk7CisJbnYtPmZpcm13YXJlX29wdGlvbnNbMV0gfD0gKEJJVF81IHwgQklUXzApOworCW52LT5maXJtd2FyZV9vcHRpb25zWzFdICY9IH5CSVRfNDsKKworCWlmIChJU19RTEEyM1hYKGhhKSkgeworCQludi0+ZmlybXdhcmVfb3B0aW9uc1swXSB8PSBCSVRfMjsKKwkJbnYtPmZpcm13YXJlX29wdGlvbnNbMF0gJj0gfkJJVF8zOworCisJCWlmIChJU19RTEEyMzAwKGhhKSkgeworCQkJaWYgKGhhLT5mYl9yZXYgPT0gRlBNXzIzMTApIHsKKwkJCQlzdHJjcHkoaGEtPm1vZGVsX251bWJlciwgIlFMQTIzMTAiKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsICJRTEEyMzAwIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocnZhbCA9PSAwICYmCisJCQkgICAgbWVtY21wKG52LT5tb2RlbF9udW1iZXIsIEJJTlpFUk8sCisJCQkJICAgIHNpemVvZihudi0+bW9kZWxfbnVtYmVyKSkgIT0gMCkgeworCQkJCWNoYXIgKnN0LCAqZW47CisKKwkJCQlzdHJuY3B5KGhhLT5tb2RlbF9udW1iZXIsIG52LT5tb2RlbF9udW1iZXIsCisJCQkJICAgIHNpemVvZihudi0+bW9kZWxfbnVtYmVyKSk7CisJCQkJc3QgPSBlbiA9IGhhLT5tb2RlbF9udW1iZXI7CisJCQkJZW4gKz0gc2l6ZW9mKG52LT5tb2RlbF9udW1iZXIpIC0gMTsKKwkJCQl3aGlsZSAoZW4gPiBzdCkgeworCQkJCQlpZiAoKmVuICE9IDB4MjAgJiYgKmVuICE9IDB4MDApCisJCQkJCQlicmVhazsKKwkJCQkJKmVuLS0gPSAnXDAnOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdWludDE2X3QgICAgICAgIGluZGV4OworCisJCQkJaW5kZXggPSAoaGEtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgJiAweGZmKTsKKwkJCQlpZiAoaW5kZXggPCBRTEFfTU9ERUxfTkFNRVMpIHsKKwkJCQkJc3RyY3B5KGhhLT5tb2RlbF9udW1iZXIsCisJCQkJCSAgICBxbGEyeDAwX21vZGVsX25hbWVbaW5kZXhdKTsKKwkJCQkJaGEtPm1vZGVsX2Rlc2MgPQorCQkJCQkgICAgcWxhMngwMF9tb2RlbF9kZXNjW2luZGV4XTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJjcHkoaGEtPm1vZGVsX251bWJlciwgIlFMQTIzeHgiKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKElTX1FMQTIyMDAoaGEpKSB7CisJCW52LT5maXJtd2FyZV9vcHRpb25zWzBdIHw9IEJJVF8yOworCQkvKgorCQkgKiAnUG9pbnQtdG8tcG9pbnQgcHJlZmVycmVkLCBlbHNlIGxvb3AnIGlzIG5vdCBhIHNhZmUKKwkJICogY29ubmVjdGlvbiBtb2RlIHNldHRpbmcuCisJCSAqLworCQlpZiAoKG52LT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSAmIChCSVRfNiB8IEJJVF81IHwgQklUXzQpKSA9PQorCQkgICAgKEJJVF81IHwgQklUXzQpKSB7CisJCQkvKiBGb3JjZSAnbG9vcCBwcmVmZXJyZWQsIGVsc2UgcG9pbnQtdG8tcG9pbnQnLiAqLworCQkJbnYtPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdICY9IH4oQklUXzYgfCBCSVRfNSB8IEJJVF80KTsKKwkJCW52LT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSB8PSBCSVRfNTsKKwkJfQorCQlzdHJjcHkoaGEtPm1vZGVsX251bWJlciwgIlFMQTIyeHgiKTsKKwl9IGVsc2UgLyppZiAoSVNfUUxBMjEwMChoYSkpKi8geworCQlzdHJjcHkoaGEtPm1vZGVsX251bWJlciwgIlFMQTIxMDAiKTsKKwl9CisKKwkvKgorCSAqIENvcHkgb3ZlciBOVlJBTSBSSVNDIHBhcmFtZXRlciBibG9jayB0byBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLgorCSAqLworCWRwdHIxID0gKHVpbnQ4X3QgKilpY2I7CisJZHB0cjIgPSAodWludDhfdCAqKSZudi0+cGFyYW1ldGVyX2Jsb2NrX3ZlcnNpb247CisJY250ID0gKHVpbnQ4X3QgKikmaWNiLT5yZXF1ZXN0X3Ffb3V0cG9pbnRlciAtICh1aW50OF90ICopJmljYi0+dmVyc2lvbjsKKwl3aGlsZSAoY250LS0pCisJCSpkcHRyMSsrID0gKmRwdHIyKys7CisKKwkvKiBDb3B5IDJuZCBoYWxmLiAqLworCWRwdHIxID0gKHVpbnQ4X3QgKilpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zOworCWNudCA9ICh1aW50OF90ICopaWNiLT5yZXNlcnZlZF8zIC0gKHVpbnQ4X3QgKilpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zOworCXdoaWxlIChjbnQtLSkKKwkJKmRwdHIxKysgPSAqZHB0cjIrKzsKKworCS8qIFByZXBhcmUgbm9kZW5hbWUgKi8KKwlpZiAoKGljYi0+ZmlybXdhcmVfb3B0aW9uc1sxXSAmIEJJVF82KSA9PSAwKSB7CisJCS8qCisJCSAqIEZpcm13YXJlIHdpbGwgYXBwbHkgdGhlIGZvbGxvd2luZyBtYXNrIGlmIHRoZSBub2RlbmFtZSB3YXMKKwkJICogbm90IHByb3ZpZGVkLgorCQkgKi8KKwkJbWVtY3B5KGljYi0+bm9kZV9uYW1lLCBpY2ItPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCQlpY2ItPm5vZGVfbmFtZVswXSAmPSAweEYwOworCX0KKworCS8qCisJICogU2V0IGhvc3QgYWRhcHRlciBwYXJhbWV0ZXJzLgorCSAqLworCWhhLT5udnJhbV92ZXJzaW9uID0gbnYtPm52cmFtX3ZlcnNpb247CisKKwloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9ICgobnYtPmhvc3RfcFswXSAmIEJJVF80KSA/IDEgOiAwKTsKKwkvKiBBbHdheXMgbG9hZCBSSVNDIGNvZGUgb24gbm9uIElTUDJbMTJdMDAgY2hpcHMuICovCisJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkpCisJCWhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkID0gMDsKKwloYS0+ZmxhZ3MuZW5hYmxlX2xpcF9yZXNldCA9ICgobnYtPmhvc3RfcFsxXSAmIEJJVF8xKSA/IDEgOiAwKTsKKwloYS0+ZmxhZ3MuZW5hYmxlX2xpcF9mdWxsX2xvZ2luID0gKChudi0+aG9zdF9wWzFdICYgQklUXzIpID8gMSA6IDApOworCWhhLT5mbGFncy5lbmFibGVfdGFyZ2V0X3Jlc2V0ID0gKChudi0+aG9zdF9wWzFdICYgQklUXzMpID8gMSA6IDApOworCWhhLT5mbGFncy5lbmFibGVfbGVkX3NjaGVtZSA9ICgobnYtPmVmaV9wYXJhbWV0ZXJzICYgQklUXzMpID8gMSA6IDApOworCisJaGEtPm9wZXJhdGluZ19tb2RlID0KKwkgICAgKGljYi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gJiAoQklUXzYgfCBCSVRfNSB8IEJJVF80KSkgPj4gNDsKKworCW1lbWNweShoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zLCBudi0+c2VyaWFsbGlua19vcHRpb25zLAorCSAgICBzaXplb2YoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9ucykpOworCisJLyogc2F2ZSBIQkEgc2VyaWFsIG51bWJlciAqLworCWhhLT5zZXJpYWwwID0gaWNiLT5wb3J0X25hbWVbNV07CisJaGEtPnNlcmlhbDEgPSBpY2ItPnBvcnRfbmFtZVs2XTsKKwloYS0+c2VyaWFsMiA9IGljYi0+cG9ydF9uYW1lWzddOworCW1lbWNweShoYS0+bm9kZV9uYW1lLCBpY2ItPm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCisJaWNiLT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4RkZGRik7CisKKwloYS0+cmV0cnlfY291bnQgPSBudi0+cmV0cnlfY291bnQ7CisKKwkvKiBTZXQgbWluaW11bSBsb2dpbl90aW1lb3V0IHRvIDQgc2Vjb25kcy4gKi8KKwlpZiAobnYtPmxvZ2luX3RpbWVvdXQgPCBxbDJ4bG9naW50aW1lb3V0KQorCQludi0+bG9naW5fdGltZW91dCA9IHFsMnhsb2dpbnRpbWVvdXQ7CisJaWYgKG52LT5sb2dpbl90aW1lb3V0IDwgNCkKKwkJbnYtPmxvZ2luX3RpbWVvdXQgPSA0OworCWhhLT5sb2dpbl90aW1lb3V0ID0gbnYtPmxvZ2luX3RpbWVvdXQ7CisJaWNiLT5sb2dpbl90aW1lb3V0ID0gbnYtPmxvZ2luX3RpbWVvdXQ7CisKKwkvKiBTZXQgbWluaW11bSBSQVRPViB0byAyMDAgdGVudGhzIG9mIGEgc2Vjb25kLiAqLworCWhhLT5yX2FfdG92ID0gMjAwOworCisJaGEtPm1pbmltdW1fdGltZW91dCA9CisJICAgIChoYS0+bG9naW5fdGltZW91dCAqIGhhLT5yZXRyeV9jb3VudCkgKyBudi0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCWhhLT5sb29wX3Jlc2V0X2RlbGF5ID0gbnYtPnJlc2V0X2RlbGF5OworCisJLyogV2lsbCBnZXQgdGhlIHZhbHVlIGZyb20gTlZSQU0uICovCisJaGEtPmxvb3BfZG93bl90aW1lb3V0ID0gTE9PUF9ET1dOX1RJTUVPVVQ7CisKKwkvKiBMaW5rIERvd24gVGltZW91dCA9IDA6CisJICoKKwkgKiAJV2hlbiBQb3J0IERvd24gdGltZXIgZXhwaXJlcyB3ZSB3aWxsIHN0YXJ0IHJldHVybmluZworCSAqCUkvTydzIHRvIE9TIHdpdGggIkRJRF9OT19DT05ORUNUIi4KKwkgKgorCSAqIExpbmsgRG93biBUaW1lb3V0ICE9IDA6CisJICoKKwkgKgkgVGhlIGRyaXZlciB3YWl0cyBmb3IgdGhlIGxpbmsgdG8gY29tZSB1cCBhZnRlciBsaW5rIGRvd24KKwkgKgkgYmVmb3JlIHJldHVybmluZyBJL09zIHRvIE9TIHdpdGggIkRJRF9OT19DT05ORUNUIi4KKwkgKi8JCQkJCQkKKwlpZiAobnYtPmxpbmtfZG93bl90aW1lb3V0ID09IDApIHsKKwkJaGEtPmxvb3BfZG93bl9hYm9ydF90aW1lID0KKwkJICAgIChMT09QX0RPV05fVElNRSAtIGhhLT5sb29wX2Rvd25fdGltZW91dCk7CisJfSBlbHNlIHsKKwkJaGEtPmxpbmtfZG93bl90aW1lb3V0ID0JIG52LT5saW5rX2Rvd25fdGltZW91dDsKKwkJaGEtPmxvb3BfZG93bl9hYm9ydF90aW1lID0KKwkJICAgIChMT09QX0RPV05fVElNRSAtIGhhLT5saW5rX2Rvd25fdGltZW91dCk7CisJfSAKKworCWhhLT5tYXhfbHVucyA9IE1BWF9MVU5TOworCWhhLT5tYXhfcHJvYmVfbHVucyA9IGxlMTZfdG9fY3B1KG52LT5tYXhfbHVuc19wZXJfdGFyZ2V0KTsKKwlpZiAoaGEtPm1heF9wcm9iZV9sdW5zID09IDApCisJCWhhLT5tYXhfcHJvYmVfbHVucyA9IE1JTl9MVU5TOworCisJLyoKKwkgKiBOZWVkIGVub3VnaCB0aW1lIHRvIHRyeSBhbmQgZ2V0IHRoZSBwb3J0IGJhY2suCisJICovCisJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IG52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJaWYgKHFscG9ydF9kb3duX3JldHJ5KQorCQloYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID0gcWxwb3J0X2Rvd25fcmV0cnk7CisJLyogU2V0IGxvZ2luX3JldHJ5X2NvdW50ICovCisJaGEtPmxvZ2luX3JldHJ5X2NvdW50ICA9IG52LT5yZXRyeV9jb3VudDsKKwlpZiAoaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9PSBudi0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICYmCisJICAgIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPiAzKQorCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCWVsc2UgaWYgKGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPiAoaW50KWhhLT5sb2dpbl9yZXRyeV9jb3VudCkKKwkJaGEtPmxvZ2luX3JldHJ5X2NvdW50ID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwlpZiAocWwyeGxvZ2lucmV0cnljb3VudCkKKwkJaGEtPmxvZ2luX3JldHJ5X2NvdW50ID0gcWwyeGxvZ2lucmV0cnljb3VudDsKKworCWhhLT5iaW5kaW5nX3R5cGUgPSBCaW5kOworCWlmIChoYS0+YmluZGluZ190eXBlICE9IEJJTkRfQllfUE9SVF9OQU1FICYmCisJICAgIGhhLT5iaW5kaW5nX3R5cGUgIT0gQklORF9CWV9QT1JUX0lEKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJJbnZhbGlkIGJpbmRpbmcgdHlwZSBzcGVjaWZpZWQgKCVkKSwgIgorCQkgICAgImRlZmF1bHRpbmcgdG8gQklORF9CWV9QT1JUX05BTUUhISFcbiIsIGhhLT5iaW5kaW5nX3R5cGUpOworCisJCWhhLT5iaW5kaW5nX3R5cGUgPSBCSU5EX0JZX1BPUlRfTkFNRTsKKwl9CisKKwlpY2ItPmx1bl9lbmFibGVzID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKKwlpY2ItPmNvbW1hbmRfcmVzb3VyY2VfY291bnQgPSAwOworCWljYi0+aW1tZWRpYXRlX25vdGlmeV9yZXNvdXJjZV9jb3VudCA9IDA7CisJaWNiLT50aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKTsKKworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQkvKiBFbmFibGUgUklPICovCisJCWljYi0+ZmlybXdhcmVfb3B0aW9uc1swXSAmPSB+QklUXzM7CisJCWljYi0+YWRkX2Zpcm13YXJlX29wdGlvbnNbMF0gJj0KKwkJICAgIH4oQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOworCQlpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdIHw9IEJJVF8yOworCQlpY2ItPnJlc3BvbnNlX2FjY3VtdWxhdGlvbl90aW1lciA9IDM7CisJCWljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyID0gNTsKKworCQloYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDE7CisJfSBlbHNlIHsKKwkJLyogRW5hYmxlIFpJTyAtLSBTdXBwb3J0IG1vZGUgNSBvbmx5LiAqLworCQl0aW1lcl9tb2RlID0gaWNiLT5hZGRfZmlybXdhcmVfb3B0aW9uc1swXSAmCisJCSAgICAoQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOworCQlpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdICY9CisJCSAgICB+KEJJVF8zIHwgQklUXzIgfCBCSVRfMSB8IEJJVF8wKTsKKwkJaWYgKHFsMnhlbmFibGV6aW8pCisJCQl0aW1lcl9tb2RlID0gQklUXzIgfCBCSVRfMDsKKwkJaWYgKHRpbWVyX21vZGUgPT0gKEJJVF8yIHwgQklUXzApKSB7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFpJTyBlbmFibGVkOyB0aW1lciBkZWxheSAiCisJCQkgICAgIiglZCkuXG4iLCBoYS0+aG9zdF9ubywgcWwyeGludHJkZWxheXRpbWVyKSk7CisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAgIlpJTyBlbmFibGVkOyB0aW1lciBkZWxheSAoJWQpLlxuIiwKKwkJCSAgICBxbDJ4aW50cmRlbGF5dGltZXIpOworCisJCQlpY2ItPmFkZF9maXJtd2FyZV9vcHRpb25zWzBdIHw9IHRpbWVyX21vZGU7CisJCQlpY2ItPmludGVycnVwdF9kZWxheV90aW1lciA9IHFsMnhpbnRyZGVsYXl0aW1lcjsKKwkJCWhhLT5mbGFncy5wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlID0gMTsKKwkJfQorCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgaGEtPmhvc3Rfbm8pKTsKKwl9CisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyogcWxhMngwMF9pbml0X3RndF9tYXAKKyogICAgICBJbml0aWFsaXplcyB0YXJnZXQgbWFwLgorKgorKiBJbnB1dDoKKyogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyoKKyogT3V0cHV0OgorKiAgICAgIFRHVF9RIGluaXRpYWxpemVkCisqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfaW5pdF90Z3RfbWFwKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDMyX3QgdDsKKworCWZvciAodCA9IDA7IHQgPCBNQVhfVEFSR0VUUzsgdCsrKQorCQlUR1RfUShoYSwgdCkgPSAob3NfdGd0X3QgKilOVUxMOworfQorCisvKioKKyAqIHFsYTJ4MDBfYWxsb2NfZmNwb3J0KCkgLSBBbGxvY2F0ZSBhIGdlbmVyaWMgZmNwb3J0LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAZmxhZ3M6IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGZjcG9ydCwgb3IgTlVMTCwgaWYgbm9uZSBhdmFpbGFibGUuCisgKi8KK2ZjX3BvcnRfdCAqCitxbGEyeDAwX2FsbG9jX2ZjcG9ydChzY3NpX3FsYV9ob3N0X3QgKmhhLCBpbnQgZmxhZ3MpCit7CisJZmNfcG9ydF90ICpmY3BvcnQ7CisKKwlmY3BvcnQgPSBrbWFsbG9jKHNpemVvZihmY19wb3J0X3QpLCBmbGFncyk7CisJaWYgKGZjcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gKGZjcG9ydCk7CisKKwkvKiBTZXR1cCBmY3BvcnQgdGVtcGxhdGUgc3RydWN0dXJlLiAqLworCW1lbXNldChmY3BvcnQsIDAsIHNpemVvZiAoZmNfcG9ydF90KSk7CisJZmNwb3J0LT5oYSA9IGhhOworCWZjcG9ydC0+cG9ydF90eXBlID0gRkNUX1VOS05PV047CisJZmNwb3J0LT5sb29wX2lkID0gRkNfTk9fTE9PUF9JRDsKKwlmY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9IElPREVTQ19JTlZBTElEX0lOREVYOworCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19VTkNPTkZJR1VSRUQpOworCWZjcG9ydC0+ZmxhZ3MgPSBGQ0ZfUkxDX1NVUFBPUlQ7CisJSU5JVF9MSVNUX0hFQUQoJmZjcG9ydC0+ZmNsdW5zKTsKKworCXJldHVybiAoZmNwb3J0KTsKK30KKworLyoKKyAqIHFsYTJ4MDBfY29uZmlndXJlX2xvb3AKKyAqICAgICAgVXBkYXRlcyBGaWJyZSBDaGFubmVsIERldmljZSBEYXRhYmFzZSB3aXRoIHdoYXQgaXMgYWN0dWFsbHkgb24gbG9vcC4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgaGEgICAgICAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgMCA9IHN1Y2Nlc3MuCisgKiAgICAgIDEgPSBlcnJvci4KKyAqICAgICAgMiA9IGRhdGFiYXNlIHdhcyBmdWxsIGFuZCBkZXZpY2Ugd2FzIG5vdCBjb25maWd1cmVkLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX2NvbmZpZ3VyZV9sb29wKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWludCAgcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzYXZlX2ZsYWdzOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJLyogR2V0IEluaXRpYXRvciBJRCAqLworCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9oYmEoaGEpOworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byBjb25maWd1cmUgSEJBLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJcmV0dXJuIChydmFsKTsKKwkJfQorCX0KKworCXNhdmVfZmxhZ3MgPSBmbGFncyA9IGhhLT5kcGNfZmxhZ3M7CisJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IENvbmZpZ3VyZSBsb29wIC0tIGRwYyBmbGFncyA9MHglbHhcbiIsCisJICAgIGhhLT5ob3N0X25vLCBmbGFncykpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGJvdGggYW4gUlNDTiBhbmQgUE9SVCBVUERBVEUgcGVuZGluZyB0aGVuIGhhbmRsZSB0aGVtCisJICogYm90aCBhdCB0aGUgc2FtZSB0aW1lLgorCSAqLworCWNsZWFyX2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCWNsZWFyX2JpdChSU0NOX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCWhhLT5tZW1fZXJyID0gMCA7CisKKwkvKiBEZXRlcm1pbmUgd2hhdCB3ZSBuZWVkIHRvIGRvICovCisJaWYgKGhhLT5jdXJyZW50X3RvcG9sb2d5ID09IElTUF9DRkdfRkwgJiYKKwkgICAgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmZmxhZ3MpKSkgeworCisJCWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKKwkJc2V0X2JpdChSU0NOX1VQREFURSwgJmZsYWdzKTsKKworCX0gZWxzZSBpZiAoaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPT0gSVNQX0NGR19GICYmCisJICAgICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKSkpIHsKKworCQloYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdyA9IDE7CisJCXNldF9iaXQoUlNDTl9VUERBVEUsICZmbGFncyk7CisJCWNsZWFyX2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKTsKKworCX0gZWxzZSBpZiAoIWhhLT5mbGFncy5vbmxpbmUgfHwKKwkgICAgKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZmbGFncykpKSB7CisKKwkJaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAxOworCQlzZXRfYml0KFJTQ05fVVBEQVRFLCAmZmxhZ3MpOworCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmZmxhZ3MpOworCX0KKworCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKSkgeworCQlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJcnZhbCA9IHFsYTJ4MDBfY29uZmlndXJlX2xvY2FsX2xvb3AoaGEpOworCQl9CisJfQorCisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MgJiYgdGVzdF9iaXQoUlNDTl9VUERBVEUsICZmbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfSBlbHNlIHsKKwkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWMoaGEpOworCQl9CisJfQorCisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJcWxhMngwMF9jb25maWdfb3MoaGEpOworCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfUkVBRFkpOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTE9PUCBSRUFEWVxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogKioqIEZBSUxFRCAqKipcbiIsCisJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9IGVsc2UgeworCQlERUJVRzMocHJpbnRrKCIlczogZXhpdGluZyBub3JtYWxseVxuIiwgX19mdW5jX18pKTsKKwl9CisKKwkvKiBSZXN0b3JlIHN0YXRlIGlmIGEgcmVzeW5jIGV2ZW50IG9jY3VyZWQgZHVyaW5nIHByb2Nlc3NpbmcgKi8KKwlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmc2F2ZV9mbGFncykpCisJCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7CisJCWlmICh0ZXN0X2JpdChSU0NOX1VQREFURSwgJnNhdmVfZmxhZ3MpKQorCQkJc2V0X2JpdChSU0NOX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKworCisvKgorICogcWxhMngwMF9jb25maWd1cmVfbG9jYWxfbG9vcAorICoJVXBkYXRlcyBGaWJyZSBDaGFubmVsIERldmljZSBEYXRhYmFzZSB3aXRoIGxvY2FsIGxvb3AgZGV2aWNlcy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwID0gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9jb25maWd1cmVfbG9jYWxfbG9vcChzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlpbnQJCXJ2YWwsIHJ2YWwyOworCWludAkJZm91bmRfZGV2czsKKwlpbnQJCWZvdW5kOworCWZjX3BvcnRfdAkqZmNwb3J0LCAqbmV3X2ZjcG9ydDsKKworCXVpbnQxNl90CWluZGV4OworCXVpbnQxNl90CWVudHJpZXM7CisJY2hhcgkJKmlkX2l0ZXI7CisJdWludDE2X3QJbG9vcF9pZDsKKwl1aW50OF90CQlkb21haW4sIGFyZWEsIGFsX3BhOworCisJZm91bmRfZGV2cyA9IDA7CisJbmV3X2ZjcG9ydCA9IE5VTEw7CisJZW50cmllcyA9IE1BWF9GSUJSRV9ERVZJQ0VTOworCisJREVCVUczKHByaW50aygic2NzaSglbGQpOiBHZXR0aW5nIEZDQUwgcG9zaXRpb24gbWFwXG4iLCBoYS0+aG9zdF9ubykpOworCURFQlVHMyhxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcChoYSwgTlVMTCkpOworCisJLyogR2V0IGxpc3Qgb2YgbG9nZ2VkIGluIGRldmljZXMuICovCisJbWVtc2V0KGhhLT5naWRfbGlzdCwgMCwgR0lEX0xJU1RfU0laRSk7CisJcnZhbCA9IHFsYTJ4MDBfZ2V0X2lkX2xpc3QoaGEsIGhhLT5naWRfbGlzdCwgaGEtPmdpZF9saXN0X2RtYSwKKwkgICAgJmVudHJpZXMpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlnb3RvIGNsZWFudXBfYWxsb2NhdGlvbjsKKworCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRW50cmllcyBpbiBJRCBsaXN0ICglZClcbiIsCisJICAgIGhhLT5ob3N0X25vLCBlbnRyaWVzKSk7CisJREVCVUczKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiloYS0+Z2lkX2xpc3QsCisJICAgIGVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGdpZF9saXN0X2luZm8pKSk7CisKKwkvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgZmNwb3J0IGZvciBhbnkgbmV3IGZjcG9ydHMgZGlzY292ZXJlZC4gKi8KKwluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQoaGEsIEdGUF9LRVJORUwpOworCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKKwkJcnZhbCA9IFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOworCQlnb3RvIGNsZWFudXBfYWxsb2NhdGlvbjsKKwl9CisJbmV3X2ZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9GQUJSSUNfREVWSUNFOworCisJLyoKKwkgKiBNYXJrIGxvY2FsIGRldmljZXMgdGhhdCB3ZXJlIHByZXNlbnQgd2l0aCBGQ0ZfREVWSUNFX0xPU1QgZm9yIG5vdy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSAmJgorCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0JST0FEQ0FTVCAmJgorCQkgICAgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgPT0gMCkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTWFya2luZyBwb3J0IGxvc3QsICIKKwkJCSAgICAibG9vcF9pZD0weCUwNHhcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCkpOworCisJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0xPU1QpOworCQkJZmNwb3J0LT5mbGFncyAmPSB+RkNGX0ZBUlBfRE9ORTsKKwkJfQorCX0KKworCS8qIEFkZCBkZXZpY2VzIHRvIHBvcnQgbGlzdC4gKi8KKwlpZF9pdGVyID0gKGNoYXIgKiloYS0+Z2lkX2xpc3Q7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZW50cmllczsgaW5kZXgrKykgeworCQlkb21haW4gPSAoKHN0cnVjdCBnaWRfbGlzdF9pbmZvICopaWRfaXRlciktPmRvbWFpbjsKKwkJYXJlYSA9ICgoc3RydWN0IGdpZF9saXN0X2luZm8gKilpZF9pdGVyKS0+YXJlYTsKKwkJYWxfcGEgPSAoKHN0cnVjdCBnaWRfbGlzdF9pbmZvICopaWRfaXRlciktPmFsX3BhOworCQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKKwkJCWxvb3BfaWQgPSAodWludDE2X3QpCisJCQkgICAgKChzdHJ1Y3QgZ2lkX2xpc3RfaW5mbyAqKWlkX2l0ZXIpLT5sb29wX2lkXzIxMDA7CisJCQlpZF9pdGVyICs9IDQ7CisJCX0gZWxzZSB7CisJCQlsb29wX2lkID0gbGUxNl90b19jcHUoCisJCQkgICAgKChzdHJ1Y3QgZ2lkX2xpc3RfaW5mbyAqKWlkX2l0ZXIpLT5sb29wX2lkKTsKKwkJCWlkX2l0ZXIgKz0gNjsKKwkJfQorCisJCS8qIEJ5cGFzcyByZXNlcnZlZCBkb21haW4gZmllbGRzLiAqLworCQlpZiAoKGRvbWFpbiAmIDB4ZjApID09IDB4ZjApCisJCQljb250aW51ZTsKKworCQkvKiBCeXBhc3MgaWYgbm90IHNhbWUgZG9tYWluIGFuZCBhcmVhIG9mIGFkYXB0ZXIuICovCisJCWlmIChhcmVhICE9IGhhLT5kX2lkLmIuYXJlYSB8fCBkb21haW4gIT0gaGEtPmRfaWQuYi5kb21haW4pCisJCQljb250aW51ZTsKKworCQkvKiBCeXBhc3MgaW52YWxpZCBsb2NhbCBsb29wIElELiAqLworCQlpZiAobG9vcF9pZCA+IExBU1RfTE9DQUxfTE9PUF9JRCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZpbGwgaW4gbWVtYmVyIGRhdGEuICovCisJCW5ld19mY3BvcnQtPmRfaWQuYi5kb21haW4gPSBkb21haW47CisJCW5ld19mY3BvcnQtPmRfaWQuYi5hcmVhID0gYXJlYTsKKwkJbmV3X2ZjcG9ydC0+ZF9pZC5iLmFsX3BhID0gYWxfcGE7CisJCW5ld19mY3BvcnQtPmxvb3BfaWQgPSBsb29wX2lkOworCQlydmFsMiA9IHFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UoaGEsIG5ld19mY3BvcnQsIDApOworCQlpZiAocnZhbDIgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIHJldHJpZXZlIGZjcG9ydCAiCisJCQkgICAgImluZm9ybWF0aW9uIC0tIGdldF9wb3J0X2RhdGFiYXNlPSV4LCAiCisJCQkgICAgImxvb3BfaWQ9MHglMDR4XG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBydmFsMiwgbmV3X2ZjcG9ydC0+bG9vcF9pZCkpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDaGVjayBmb3IgbWF0Y2hpbmcgZGV2aWNlIGluIHBvcnQgbGlzdC4gKi8KKwkJZm91bmQgPSAwOworCQlmY3BvcnQgPSBOVUxMOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAobWVtY21wKG5ld19mY3BvcnQtPnBvcnRfbmFtZSwgZmNwb3J0LT5wb3J0X25hbWUsCisJCQkgICAgV1dOX1NJWkUpKQorCQkJCWNvbnRpbnVlOworCisJCQlmY3BvcnQtPmZsYWdzICY9IH4oRkNGX0ZBQlJJQ19ERVZJQ0UgfAorCQkJICAgIEZDRl9QRVJTSVNURU5UX0JPVU5EKTsKKwkJCWZjcG9ydC0+bG9vcF9pZCA9IG5ld19mY3BvcnQtPmxvb3BfaWQ7CisJCQlmY3BvcnQtPnBvcnRfdHlwZSA9IG5ld19mY3BvcnQtPnBvcnRfdHlwZTsKKwkJCWZjcG9ydC0+ZF9pZC5iMjQgPSBuZXdfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCW1lbWNweShmY3BvcnQtPm5vZGVfbmFtZSwgbmV3X2ZjcG9ydC0+bm9kZV9uYW1lLAorCQkJICAgIFdXTl9TSVpFKTsKKworCQkJZm91bmQrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFmb3VuZCkgeworCQkJLyogTmV3IGRldmljZSwgYWRkIHRvIGZjcG9ydHMgbGlzdC4gKi8KKwkJCW5ld19mY3BvcnQtPmZsYWdzICY9IH5GQ0ZfUEVSU0lTVEVOVF9CT1VORDsKKwkJCWxpc3RfYWRkX3RhaWwoJm5ld19mY3BvcnQtPmxpc3QsICZoYS0+ZmNwb3J0cyk7CisKKwkJCS8qIEFsbG9jYXRlIGEgbmV3IHJlcGxhY2VtZW50IGZjcG9ydC4gKi8KKwkJCWZjcG9ydCA9IG5ld19mY3BvcnQ7CisJCQluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQoaGEsIEdGUF9LRVJORUwpOworCQkJaWYgKG5ld19mY3BvcnQgPT0gTlVMTCkgeworCQkJCXJ2YWwgPSBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKKwkJCQlnb3RvIGNsZWFudXBfYWxsb2NhdGlvbjsKKwkJCX0KKwkJCW5ld19mY3BvcnQtPmZsYWdzICY9IH5GQ0ZfRkFCUklDX0RFVklDRTsKKwkJfQorCisJCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydChoYSwgZmNwb3J0KTsKKworCQlmb3VuZF9kZXZzKys7CisJfQorCitjbGVhbnVwX2FsbG9jYXRpb246CisJaWYgKG5ld19mY3BvcnQpCisJCWtmcmVlKG5ld19mY3BvcnQpOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgbG9jYWwgbG9vcCBlcnJvciBleGl0OiAiCisJCSAgICAicnZhbD0leFxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9CisKKwlpZiAoZm91bmRfZGV2cykgeworCQloYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfTE9DQUxfREVWSUNFUzsKKwkJaGEtPmRldmljZV9mbGFncyAmPSB+REZMR19SRVRSWV9MT0NBTF9ERVZJQ0VTOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeDAwX3Byb2JlX2Zvcl9hbGxfbHVucyhzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlmY19wb3J0X3QJKmZjcG9ydDsKKworCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KGhhKTsgCisgCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJaWYgKGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9UQVJHRVQpCisJCQljb250aW51ZTsKKworCQlxbGEyeDAwX3VwZGF0ZV9mY3BvcnQoaGEsIGZjcG9ydCk7IAorCX0KK30KKworLyoKKyAqIHFsYTJ4MDBfdXBkYXRlX2ZjcG9ydAorICoJVXBkYXRlcyBkZXZpY2Ugb24gbGlzdC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZmNwb3J0ID0gcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm46CisgKgkwICAtIFN1Y2Nlc3MKKyAqICBCSVRfMCAtIGVycm9yCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF91cGRhdGVfZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQoreworCXVpbnQxNl90CWluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3JiX3QgKnNwOworCisJZmNwb3J0LT5oYSA9IGhhOworCWZjcG9ydC0+bG9naW5fcmV0cnkgPSAwOworCWZjcG9ydC0+cG9ydF9sb2dpbl9yZXRyeV9jb3VudCA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKgorCSAgICBQT1JUX1JFVFJZX1RJTUU7CisJYXRvbWljX3NldCgmZmNwb3J0LT5wb3J0X2Rvd25fdGltZXIsIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKgorCSAgICBQT1JUX1JFVFJZX1RJTUUpOworCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9MT0dJTl9ORUVERUQ7CisKKwkvKgorCSAqIENoZWNrIGZvciBvdXRzdGFuZGluZyBjbWQgb24gdGFwZSBCeXBhc3MgTFVOIGRpc2NvdmVyeSBpZiBhY3RpdmUKKwkgKiBjb21tYW5kIG9uIHRhcGUuCisJICovCisJaWYgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfVEFQRV9QUkVTRU5UKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGluZGV4KyspIHsKKwkJCWlmICgoc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tpbmRleF0pICE9IDApIHsKKwkJCQlpZiAoc3AtPmZjbHVuLT5mY3BvcnQgPT0gZmNwb3J0KSB7CisJCQkJCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19PTkxJTkUpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkgICAgJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBEbyBMVU4gZGlzY292ZXJ5LiAqLworCWlmIChmY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfSU5JVElBVE9SIHx8CisJICAgIGZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9CUk9BRENBU1QpIHsKKwkJZmNwb3J0LT5kZXZpY2VfdHlwZSA9IFRZUEVfUFJPQ0VTU09SOworCX0gZWxzZSB7CisJCXFsYTJ4MDBfbHVuX2Rpc2NvdmVyeShoYSwgZmNwb3J0KTsKKwl9CisJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX09OTElORSk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2x1bl9kaXNjb3ZlcnkKKyAqCUlzc3VlIFNDU0kgaW5xdWlyeSBjb21tYW5kIGZvciBMVU4gZGlzY292ZXJ5LgorICoKKyAqIElucHV0OgorICoJaGE6CQlhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglmY3BvcnQ6CQlGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbHVuX2Rpc2NvdmVyeShzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCkKK3sKKwlpbnFfY21kX3JzcF90CSppbnE7CisJZG1hX2FkZHJfdAlpbnFfZG1hOworCXVpbnQxNl90CWx1bjsKKworCWlucSA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmaW5xX2RtYSk7CisJaWYgKGlucSA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBJTlFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQWx3YXlzIGFkZCBhIGZjX2x1bl90IHN0cnVjdHVyZSBmb3IgbHVuIDAgLS0gbWlkLWxheWVyIHJlcXVpcmVtZW50ICovCisJcWxhMngwMF9hZGRfbHVuKGZjcG9ydCwgMCk7CisKKwkvKiBJZiByZXBvcnQgTFVOIHdvcmtzLCBleGl0LiAqLworCWlmIChxbGEyeDAwX3JwdF9sdW5fZGlzY292ZXJ5KGhhLCBmY3BvcnQsIGlucSwgaW5xX2RtYSkgIT0KKwkgICAgUUxBX1NVQ0NFU1MpIHsKKwkJZm9yIChsdW4gPSAwOyBsdW4gPCBoYS0+bWF4X3Byb2JlX2x1bnM7IGx1bisrKSB7CisJCQkvKiBDb25maWd1cmUgTFVOLiAqLworCQkJcWxhMngwMF9jZmdfbHVuKGhhLCBmY3BvcnQsIGx1biwgaW5xLCBpbnFfZG1hKTsKKwkJfQorCX0KKworCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIGlucSwgaW5xX2RtYSk7Cit9CisKKy8qCisgKiBxbGEyeDAwX3JwdF9sdW5fZGlzY292ZXJ5CisgKglJc3N1ZSBTQ1NJIHJlcG9ydCBMVU4gY29tbWFuZCBmb3IgTFVOIGRpc2NvdmVyeS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhOgkJYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoJZmNwb3J0OgkJRkMgcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3JwdF9sdW5fZGlzY292ZXJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0LAorICAgIGlucV9jbWRfcnNwX3QgKmlucSwgZG1hX2FkZHJfdCBpbnFfZG1hKQoreworCWludAkJCXJ2YWw7CisJdWludDMyX3QJCWxlbiwgY250OworCXVpbnQxNl90CQlsdW47CisKKwkvKiBBc3N1bWUgYSBmYWlsZWQgc3RhdHVzICovCisJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwkvKiBObyBwb2ludCBpbiBjb250aW51aW5nIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IFJMQyAqLworCWlmICgoZmNwb3J0LT5mbGFncyAmIEZDRl9STENfU1VQUE9SVCkgPT0gMCkKKwkJcmV0dXJuIChydmFsKTsKKworCXJ2YWwgPSBxbGEyeDAwX3JlcG9ydF9sdW4oaGEsIGZjcG9ydCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCXJldHVybiAocnZhbCk7CisKKwkvKiBDb25maWd1cmUgTFVOIGxpc3QuICovCisJbGVuID0gYmUzMl90b19jcHUoaGEtPnJsY19yc3AtPmxpc3QuaGRyLmxlbik7CisJbGVuIC89IDg7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBsZW47IGNudCsrKSB7CisJCWx1biA9IENIQVJfVE9fU0hPUlQoaGEtPnJsY19yc3AtPmxpc3QubHN0W2NudF0ubHNiLAorCQkgICAgaGEtPnJsY19yc3AtPmxpc3QubHN0W2NudF0ubXNiLmIpOworCisJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogUkxDIGx1biA9ICglZClcbiIsIGhhLT5ob3N0X25vLCBsdW4pKTsKKworCQkvKiBXZSBvbmx5IHN1cHBvcnQgMCB0aHJvdWdoIE1BWF9MVU5TLTEgcmFuZ2UgKi8KKwkJaWYgKGx1biA8IE1BWF9MVU5TKSB7CisJCQlxbGEyeDAwX2NmZ19sdW4oaGEsIGZjcG9ydCwgbHVuLCBpbnEsIGlucV9kbWEpOworCQl9CisJfQorCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsIEZDU19PTkxJTkUpOworCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfcmVwb3J0X2x1bgorICoJSXNzdWUgU0NTSSByZXBvcnQgTFVOIGNvbW1hbmQuCisgKgorICogSW5wdXQ6CisgKgloYToJCWFkYXB0ZXIgc3RhdGUgcG9pbnRlci4KKyAqCWZjcG9ydDoJCUZDIHBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9yZXBvcnRfbHVuKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0KQoreworCWludCBydmFsOworCXVpbnQxNl90IHJldHJpZXM7CisJdWludDE2X3QgY29tcF9zdGF0dXM7CisJdWludDE2X3Qgc2NzaV9zdGF0dXM7CisJcnB0X2x1bl9jbWRfcnNwX3QgKnJsYzsKKwlkbWFfYWRkcl90IHJsY19kbWE7CisKKwlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwlybGMgPSBoYS0+cmxjX3JzcDsKKwlybGNfZG1hID0gaGEtPnJsY19yc3BfZG1hOworCisJZm9yIChyZXRyaWVzID0gMzsgcmV0cmllczsgcmV0cmllcy0tKSB7CisJCW1lbXNldChybGMsIDAsIHNpemVvZihycHRfbHVuX2NtZF9yc3BfdCkpOworCQlybGMtPnAuY21kLmVudHJ5X3R5cGUgPSBDT01NQU5EX0E2NF9UWVBFOworCQlybGMtPnAuY21kLmVudHJ5X2NvdW50ID0gMTsKKwkJU0VUX1RBUkdFVF9JRChoYSwgcmxjLT5wLmNtZC50YXJnZXQsIGZjcG9ydC0+bG9vcF9pZCk7CisJCXJsYy0+cC5jbWQuY29udHJvbF9mbGFncyA9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX1JFQUQgfCBDRl9TSU1QTEVfVEFHKTsKKwkJcmxjLT5wLmNtZC5zY3NpX2NkYlswXSA9IFJFUE9SVF9MVU5TOworCQlybGMtPnAuY21kLnNjc2lfY2RiWzhdID0gTVNCKHNpemVvZihycHRfbHVuX2xzdF90KSk7CisJCXJsYy0+cC5jbWQuc2NzaV9jZGJbOV0gPSBMU0Ioc2l6ZW9mKHJwdF9sdW5fbHN0X3QpKTsKKwkJcmxjLT5wLmNtZC5kc2VnX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKTsKKwkJcmxjLT5wLmNtZC50aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxMCk7CisJCXJsYy0+cC5jbWQuYnl0ZV9jb3VudCA9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTMyKHNpemVvZihycHRfbHVuX2xzdF90KSk7CisJCXJsYy0+cC5jbWQuZHNlZ18wX2FkZHJlc3NbMF0gPSBjcHVfdG9fbGUzMigKKwkJICAgIExTRChybGNfZG1hICsgc2l6ZW9mKHN0c19lbnRyeV90KSkpOworCQlybGMtPnAuY21kLmRzZWdfMF9hZGRyZXNzWzFdID0gY3B1X3RvX2xlMzIoCisJCSAgICBNU0QocmxjX2RtYSArIHNpemVvZihzdHNfZW50cnlfdCkpKTsKKwkJcmxjLT5wLmNtZC5kc2VnXzBfbGVuZ3RoID0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoc2l6ZW9mKHJwdF9sdW5fbHN0X3QpKTsKKworCQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBybGMsIHJsY19kbWEsCisJCSAgICBzaXplb2YocnB0X2x1bl9jbWRfcnNwX3QpKTsKKworCQljb21wX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHJsYy0+cC5yc3AuY29tcF9zdGF0dXMpOworCQlzY3NpX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHJsYy0+cC5yc3Auc2NzaV9zdGF0dXMpOworCisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTIHx8IGNvbXBfc3RhdHVzICE9IENTX0NPTVBMRVRFIHx8CisJCSAgICBzY3NpX3N0YXR1cyAmIFNTX0NIRUNLX0NPTkRJVElPTikgeworCisJCQkvKiBEZXZpY2UgdW5kZXJydW4sIHRyZWF0IGFzIE9LLiAqLworCQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MgJiYKKwkJCSAgICBjb21wX3N0YXR1cyA9PSBDU19EQVRBX1VOREVSUlVOICYmCisJCQkgICAgc2NzaV9zdGF0dXMgJiBTU19SRVNJRFVBTF9VTkRFUikgeworCisJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUkxDIGZhaWxlZCB0byBpc3N1ZSBpb2NiISAiCisJCQkgICAgImZjcG9ydD1bJTA0eC8lcF0gcnZhbD0leCBjcz0leCBzcz0leFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQsIHJ2YWwsCisJCQkgICAgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CisKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQkJaWYgKHNjc2lfc3RhdHVzICYgU1NfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSTEMgIgorCQkJCSAgICAiU1NfQ0hFQ0tfQ09ORElUSU9OIFNlbnNlIERhdGEgIgorCQkJCSAgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVswXSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVsxXSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVsyXSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVszXSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs0XSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs1XSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs2XSwKKwkJCQkgICAgcmxjLT5wLnJzcC5yZXFfc2Vuc2VfZGF0YVs3XSkpOworCQkJCWlmIChybGMtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzJdID09CisJCQkJICAgIElMTEVHQUxfUkVRVUVTVCkgeworCQkJCQlmY3BvcnQtPmZsYWdzICY9IH4oRkNGX1JMQ19TVVBQT1JUKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogcWxhMngwMF9jZmdfbHVuCisgKglDb25maWd1cmVzIExVTiBpbnRvIGZjcG9ydCBMVU4gbGlzdC4KKyAqCisgKiBJbnB1dDoKKyAqCWZjcG9ydDoJCUZDIHBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKglsdW46CQlMVU4gbnVtYmVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGZjX2x1bl90ICoKK3FsYTJ4MDBfY2ZnX2x1bihzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwgdWludDE2X3QgbHVuLAorICAgIGlucV9jbWRfcnNwX3QgKmlucSwgZG1hX2FkZHJfdCBpbnFfZG1hKSAKK3sKKwlmY19sdW5fdCAqZmNsdW47CisJdWludDhfdAkgIGRldmljZV90eXBlOworCisJLyogQnlwYXNzIExVTnMgdGhhdCBmYWlsZWQuICovCisJaWYgKHFsYTJ4MDBfaW5xdWlyeShoYSwgZmNwb3J0LCBsdW4sIGlucSwgaW5xX2RtYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgaW5xdWlyeSAtIGxvb3AgaWQ9MHglMDR4ICIKKwkJICAgICJsdW49JWRcbiIsIGhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsIGx1bikpOworCisJCXJldHVybiAoTlVMTCk7CisJfQorCWRldmljZV90eXBlID0gKGlucS0+aW5xWzBdICYgMHgxZik7CisJc3dpdGNoIChkZXZpY2VfdHlwZSkgeworCWNhc2UgVFlQRV9ESVNLOgorCWNhc2UgVFlQRV9QUk9DRVNTT1I6CisJY2FzZSBUWVBFX1dPUk06CisJY2FzZSBUWVBFX1JPTToKKwljYXNlIFRZUEVfU0NBTk5FUjoKKwljYXNlIFRZUEVfTU9EOgorCWNhc2UgVFlQRV9NRURJVU1fQ0hBTkdFUjoKKwljYXNlIFRZUEVfRU5DTE9TVVJFOgorCWNhc2UgMHgyMDoKKwljYXNlIDB4MEM6CisJCWJyZWFrOworCWNhc2UgVFlQRV9UQVBFOgorCQlmY3BvcnQtPmZsYWdzIHw9IEZDRl9UQVBFX1BSRVNFTlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5zdXBwb3J0ZWQgbHVuIHR5cGUgLS0gIgorCQkgICAgImxvb3AgaWQ9MHglMDR4IGx1bj0lZCB0eXBlPSV4XG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgbHVuLCBkZXZpY2VfdHlwZSkpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWZjcG9ydC0+ZGV2aWNlX3R5cGUgPSBkZXZpY2VfdHlwZTsKKwlmY2x1biA9IHFsYTJ4MDBfYWRkX2x1bihmY3BvcnQsIGx1bik7CisKKwlpZiAoZmNsdW4gIT0gTlVMTCkgeworCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfT05MSU5FKTsKKwl9CisKKwlyZXR1cm4gKGZjbHVuKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfYWRkX2x1bgorICoJQWRkcyBMVU4gdG8gZGF0YWJhc2UKKyAqCisgKiBJbnB1dDoKKyAqCWZjcG9ydDoJCUZDIHBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKglsdW46CQlMVU4gbnVtYmVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGZjX2x1bl90ICoKK3FsYTJ4MDBfYWRkX2x1bihmY19wb3J0X3QgKmZjcG9ydCwgdWludDE2X3QgbHVuKQoreworCWludAkJZm91bmQ7CisJZmNfbHVuX3QJKmZjbHVuOworCisJaWYgKGZjcG9ydCA9PSBOVUxMKSB7CisJCURFQlVHKHByaW50aygic2NzaTogVW5hYmxlIHRvIGFkZCBsdW4gdG8gTlVMTCBwb3J0XG4iKSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogQWxsb2NhdGUgTFVOIGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZC4gKi8KKwlmb3VuZCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY2x1biwgJmZjcG9ydC0+ZmNsdW5zLCBsaXN0KSB7CisJCWlmIChmY2x1bi0+bHVuID09IGx1bikgeworCQkJZm91bmQrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIChOVUxMKTsKKworCWZjbHVuID0ga21hbGxvYyhzaXplb2YoZmNfbHVuX3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoZmNsdW4gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAiJXMoKTogTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gRkNMVU5cbiIsCisJCSAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogU2V0dXAgTFVOIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoZmNsdW4sIDAsIHNpemVvZihmY19sdW5fdCkpOworCWZjbHVuLT5sdW4gPSBsdW47CisJZmNsdW4tPmZjcG9ydCA9IGZjcG9ydDsKKwlmY2x1bi0+b19mY3BvcnQgPSBmY3BvcnQ7CisJZmNsdW4tPmRldmljZV90eXBlID0gZmNwb3J0LT5kZXZpY2VfdHlwZTsKKwlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfVU5DT05GSUdVUkVEKTsKKworCWxpc3RfYWRkX3RhaWwoJmZjbHVuLT5saXN0LCAmZmNwb3J0LT5mY2x1bnMpOworCisJcmV0dXJuIChmY2x1bik7Cit9CisKKy8qCisgKiBxbGEyeDAwX2lucXVpcnkKKyAqCUlzc3VlIFNDU0kgaW5xdWlyeSBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglmY3BvcnQgPSBGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybjoKKyAqCTAgIC0gU3VjY2VzcworICogIEJJVF8wIC0gZXJyb3IKKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfaW5xdWlyeShzY3NpX3FsYV9ob3N0X3QgKmhhLAorICAgIGZjX3BvcnRfdCAqZmNwb3J0LCB1aW50MTZfdCBsdW4sIGlucV9jbWRfcnNwX3QgKmlucSwgZG1hX2FkZHJfdCBpbnFfZG1hKQoreworCWludCBydmFsOworCXVpbnQxNl90IHJldHJpZXM7CisJdWludDE2X3QgY29tcF9zdGF0dXM7CisJdWludDE2X3Qgc2NzaV9zdGF0dXM7CisKKwlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCWZvciAocmV0cmllcyA9IDM7IHJldHJpZXM7IHJldHJpZXMtLSkgeworCQltZW1zZXQoaW5xLCAwLCBzaXplb2YoaW5xX2NtZF9yc3BfdCkpOworCQlpbnEtPnAuY21kLmVudHJ5X3R5cGUgPSBDT01NQU5EX0E2NF9UWVBFOworCQlpbnEtPnAuY21kLmVudHJ5X2NvdW50ID0gMTsKKwkJaW5xLT5wLmNtZC5sdW4gPSBjcHVfdG9fbGUxNihsdW4pOworCQlTRVRfVEFSR0VUX0lEKGhhLCBpbnEtPnAuY21kLnRhcmdldCwgZmNwb3J0LT5sb29wX2lkKTsKKwkJaW5xLT5wLmNtZC5jb250cm9sX2ZsYWdzID0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0ZfUkVBRCB8IENGX1NJTVBMRV9UQUcpOworCQlpbnEtPnAuY21kLnNjc2lfY2RiWzBdID0gSU5RVUlSWTsKKwkJaW5xLT5wLmNtZC5zY3NpX2NkYls0XSA9IElOUV9EQVRBX1NJWkU7CisJCWlucS0+cC5jbWQuZHNlZ19jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSk7CisJCWlucS0+cC5jbWQudGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMTApOworCQlpbnEtPnAuY21kLmJ5dGVfY291bnQgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihJTlFfREFUQV9TSVpFKTsKKwkJaW5xLT5wLmNtZC5kc2VnXzBfYWRkcmVzc1swXSA9IGNwdV90b19sZTMyKAorCQkgICAgTFNEKGlucV9kbWEgKyBzaXplb2Yoc3RzX2VudHJ5X3QpKSk7CisJCWlucS0+cC5jbWQuZHNlZ18wX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMigKKwkJICAgIE1TRChpbnFfZG1hICsgc2l6ZW9mKHN0c19lbnRyeV90KSkpOworCQlpbnEtPnAuY21kLmRzZWdfMF9sZW5ndGggPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihJTlFfREFUQV9TSVpFKTsKKworCQlERUJVRzUocHJpbnRrKCJzY3NpKCVsZCk6IEx1biBJbnF1aXJ5IC0gZmNwb3J0PVslMDR4LyVwXSwiCisJCSAgICAiIGx1biAoJWQpXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LCBsdW4pKTsKKworCQlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGhhLCBpbnEsIGlucV9kbWEsCisJCSAgICBzaXplb2YoaW5xX2NtZF9yc3BfdCkpOworCisJCWNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUoaW5xLT5wLnJzcC5jb21wX3N0YXR1cyk7CisJCXNjc2lfc3RhdHVzID0gbGUxNl90b19jcHUoaW5xLT5wLnJzcC5zY3NpX3N0YXR1cyk7CisKKwkJREVCVUc1KHByaW50aygic2NzaSglbGQpOiBsdW4gKCVkKSBpbnF1aXJ5IC0gIgorCQkgICAgImlucVswXT0gMHgleCwgY29tcCBzdGF0dXMgMHgleCwgc2NzaSBzdGF0dXMgMHgleCwgIgorCQkgICAgInJ2YWw9JWRcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgbHVuLCBpbnEtPmlucVswXSwgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzLAorCQkgICAgcnZhbCkpOworCisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTIHx8IGNvbXBfc3RhdHVzICE9IENTX0NPTVBMRVRFIHx8CisJCSAgICBzY3NpX3N0YXR1cyAmIFNTX0NIRUNLX0NPTkRJVElPTikgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogSU5RIGZhaWxlZCB0byBpc3N1ZSBpb2NiISAiCisJCQkgICAgImZjcG9ydD1bJTA0eC8lcF0gcnZhbD0leCBjcz0leCBzcz0leFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQsIHJ2YWwsCisJCQkgICAgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CisKKwkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKQorCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJCQlpZiAoc2NzaV9zdGF0dXMgJiBTU19DSEVDS19DT05ESVRJT04pIHsKKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IElOUSAiCisJCQkJICAgICJTU19DSEVDS19DT05ESVRJT04gU2Vuc2UgRGF0YSAiCisJCQkJICAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzBdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzFdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzJdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzNdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzRdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzVdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzZdLAorCQkJCSAgICBpbnEtPnAucnNwLnJlcV9zZW5zZV9kYXRhWzddKSk7CisJCQl9CisKKwkJCS8qIERldmljZSB1bmRlcnJ1biBkcm9wIExVTi4gKi8KKwkJCWlmIChjb21wX3N0YXR1cyA9PSBDU19EQVRBX1VOREVSUlVOICYmCisJCQkgICAgc2NzaV9zdGF0dXMgJiBTU19SRVNJRFVBTF9VTkRFUikgeworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisKKy8qCisgKiBxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWMKKyAqICAgICAgU2V0dXAgU05TIGRldmljZXMgd2l0aCBsb29wIElEJ3MuCisgKgorICogSW5wdXQ6CisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgPSBzdWNjZXNzLgorICogICAgICBCSVRfMCA9IGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfY29uZmlndXJlX2ZhYnJpYyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAlydmFsLCBydmFsMjsKKwlmY19wb3J0X3QJKmZjcG9ydCwgKmZjcHRlbXA7CisJdWludDE2X3QJbmV4dF9sb29waWQ7CisJdWludDE2X3QJbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisJTElTVF9IRUFEKG5ld19mY3BvcnRzKTsKKworCS8qIElmIEZMIHBvcnQgZXhpc3RzLCB0aGVuIFNOUyBpcyBwcmVzZW50ICovCisJcnZhbCA9IHFsYTJ4MDBfZ2V0X3BvcnRfbmFtZShoYSwgU05TX0ZMX1BPUlQsIE5VTEwsIDApOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogTUJDX0dFVF9QT1JUX05BTUUgRmFpbGVkLCBObyBGTCAiCisJCSAgICAiUG9ydFxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQloYS0+ZGV2aWNlX2ZsYWdzICY9IH5TV0lUQ0hfRk9VTkQ7CisJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCX0KKworCS8qIE1hcmsgZGV2aWNlcyB0aGF0IG5lZWQgcmUtc3luY2hyb25pemF0aW9uLiAqLworCXJ2YWwyID0gcWxhMngwMF9kZXZpY2VfcmVzeW5jKGhhKTsKKwlpZiAocnZhbDIgPT0gUUxBX1JTQ05TX0hBTkRMRUQpIHsKKwkJLyogTm8gcG9pbnQgZG9pbmcgdGhlIHNjYW4sIGp1c3QgY29udGludWUuICovCisJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCX0KKwlkbyB7CisJCS8qIEVuc3VyZSB3ZSBhcmUgbG9nZ2VkIGludG8gdGhlIFNOUy4gKi8KKwkJcWxhMngwMF9sb2dpbl9mYWJyaWMoaGEsIFNJTVBMRV9OQU1FX1NFUlZFUiwgMHhmZiwgMHhmZiwgMHhmYywKKwkJICAgIG1iLCBCSVRfMSB8IEJJVF8wKTsKKwkJaWYgKG1iWzBdICE9IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7CisJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICJGYWlsZWQgU05TIGxvZ2luOiBsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4ICIKKwkJCSAgICAibWJbMl09JXggbWJbNl09JXggbWJbN109JXhcbiIsIFNJTVBMRV9OQU1FX1NFUlZFUiwKKwkJCSAgICBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYls2XSwgbWJbN10pKTsKKwkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJCWlmIChxbGEyeDAwX3JmdF9pZChoYSkpIHsKKwkJCQkvKiBFTVBUWSAqLworCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgRkMtNCAiCisJCQkJICAgICJUWVBFIGZhaWxlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQl9CisJCQlpZiAocWxhMngwMF9yZmZfaWQoaGEpKSB7CisJCQkJLyogRU1QVFkgKi8KKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIEZDLTQgIgorCQkJCSAgICAiRmVhdHVyZXMgZmFpbGVkLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCX0KKwkJCWlmIChxbGEyeDAwX3Jubl9pZChoYSkpIHsKKwkJCQkvKiBFTVBUWSAqLworCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgTm9kZSBOYW1lICIKKwkJCQkgICAgImZhaWxlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQl9IGVsc2UgaWYgKHFsYTJ4MDBfcnNubl9ubihoYSkpIHsKKwkJCQkvKiBFTVBUWSAqLworCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgU3ltYm9saWMgIgorCQkJCSAgICAiTm9kZSBOYW1lIGZhaWxlZC5cbiIsIGhhLT5ob3N0X25vKSk7CisJCQl9CisJCX0KKworCQlydmFsID0gcWxhMngwMF9maW5kX2FsbF9mYWJyaWNfZGV2cyhoYSwgJm5ld19mY3BvcnRzKTsKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBMb2dvdXQgYWxsIHByZXZpb3VzIGZhYnJpYyBkZXZpY2VzIG1hcmtlZCBsb3N0LCBleGNlcHQKKwkJICogdGFwZSBkZXZpY2VzLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQkJCWJyZWFrOworCisJCQlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0xPU1QpIHsKKwkJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoaGEsIGZjcG9ydCwKKwkJCQkgICAgcWwyeHBsb2dpYWJzZW50ZGV2aWNlKTsKKwkJCQlpZiAoZmNwb3J0LT5sb29wX2lkICE9IEZDX05PX0xPT1BfSUQgJiYKKwkJCQkgICAgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfVEFQRV9QUkVTRU5UKSA9PSAwICYmCisJCQkJICAgIGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9JTklUSUFUT1IgJiYKKwkJCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0JST0FEQ0FTVCkgeworCisJCQkJCXFsYTJ4MDBfZmFicmljX2xvZ291dChoYSwKKwkJCQkJICAgIGZjcG9ydC0+bG9vcF9pZCk7CisJCQkJCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogU3RhcnRpbmcgZnJlZSBsb29wIElELiAqLworCQluZXh0X2xvb3BpZCA9IGhhLT5taW5fZXh0ZXJuYWxfbG9vcGlkOworCisJCS8qCisJCSAqIFNjYW4gdGhyb3VnaCBvdXIgcG9ydCBsaXN0IGFuZCBsb2dpbiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZQorCQkgKiBsb2dnZWQgaW4uCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8CisJCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncykpCisJCQkJYnJlYWs7CisKKwkJCWlmICgoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSA9PSAwIHx8CisJCQkgICAgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfTE9HSU5fTkVFREVEKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmNwb3J0LT5sb29wX2lkID09IEZDX05PX0xPT1BfSUQpIHsKKwkJCQlmY3BvcnQtPmxvb3BfaWQgPSBuZXh0X2xvb3BpZDsKKwkJCQlydmFsID0gcWxhMngwMF9maW5kX25ld19sb29wX2lkKGhhLCBmY3BvcnQpOworCQkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJCS8qIFJhbiBvdXQgb2YgSURzIHRvIHVzZSAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIExvZ2luIGFuZCB1cGRhdGUgZGF0YWJhc2UgKi8KKwkJCXFsYTJ4MDBfZmFicmljX2Rldl9sb2dpbihoYSwgZmNwb3J0LCAmbmV4dF9sb29waWQpOworCQl9CisKKwkJLyogRXhpdCBpZiBvdXQgb2YgbG9vcCBJRHMuICovCisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIExvZ2luIGFuZCBhZGQgdGhlIG5ldyBkZXZpY2VzIHRvIG91ciBwb3J0IGxpc3QuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNwb3J0LCBmY3B0ZW1wLCAmbmV3X2ZjcG9ydHMsIGxpc3QpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgfHwKKwkJCSAgICB0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJCQlicmVhazsKKworCQkJLyogRmluZCBhIG5ldyBsb29wIElEIHRvIHVzZS4gKi8KKwkJCWZjcG9ydC0+bG9vcF9pZCA9IG5leHRfbG9vcGlkOworCQkJcnZhbCA9IHFsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChoYSwgZmNwb3J0KTsKKwkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJLyogUmFuIG91dCBvZiBJRHMgdG8gdXNlICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIExvZ2luIGFuZCB1cGRhdGUgZGF0YWJhc2UgKi8KKwkJCXFsYTJ4MDBfZmFicmljX2Rldl9sb2dpbihoYSwgZmNwb3J0LCAmbmV4dF9sb29waWQpOworCisJCQkvKiBSZW1vdmUgZGV2aWNlIGZyb20gdGhlIG5ldyBsaXN0IGFuZCBhZGQgaXQgdG8gREIgKi8KKwkJCWxpc3RfZGVsKCZmY3BvcnQtPmxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmZmNwb3J0LT5saXN0LCAmaGEtPmZjcG9ydHMpOworCQl9CisJfSB3aGlsZSAoMCk7CisKKwkvKiBGcmVlIGFsbCBuZXcgZGV2aWNlIHN0cnVjdHVyZXMgbm90IHByb2Nlc3NlZC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNwb3J0LCBmY3B0ZW1wLCAmbmV3X2ZjcG9ydHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmZjcG9ydC0+bGlzdCk7CisJCWtmcmVlKGZjcG9ydCk7CisJfQorCisJaWYgKHJ2YWwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgZmFicmljIGVycm9yIGV4aXQ6ICIKKwkJICAgICJydmFsPSVkXG4iLCBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKworLyoKKyAqIHFsYTJ4MDBfZmluZF9hbGxfZmFicmljX2RldnMKKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJZGV2ID0gZGF0YWJhc2UgZGV2aWNlIGVudHJ5IHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTAgPSBzdWNjZXNzLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9maW5kX2FsbF9mYWJyaWNfZGV2cyhzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgbGlzdF9oZWFkICpuZXdfZmNwb3J0cykKK3sKKwlpbnQJCXJ2YWw7CisJdWludDE2X3QJbG9vcF9pZDsKKwlmY19wb3J0X3QJKmZjcG9ydCwgKm5ld19mY3BvcnQsICpmY3B0ZW1wOworCWludAkJZm91bmQ7CisKKwlzd19pbmZvX3QJKnN3bDsKKwlpbnQJCXN3bF9pZHg7CisJaW50CQlmaXJzdF9kZXYsIGxhc3RfZGV2OworCXBvcnRfaWRfdAl3cmFwLCBueHRfZF9pZDsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCS8qIFRyeSBHSURfUFQgdG8gZ2V0IGRldmljZSBsaXN0LCBlbHNlIEdBTi4gKi8KKwlzd2wgPSBrbWFsbG9jKHNpemVvZihzd19pbmZvX3QpICogTUFYX0ZJQlJFX0RFVklDRVMsIEdGUF9BVE9NSUMpOworCWlmIChzd2wgPT0gTlVMTCkgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgYWxsb2NhdGlvbnMgZmFpbGVkLCBmYWxsYmFjayAiCisJCSAgICAib24gR0FfTlhUXG4iLCBoYS0+aG9zdF9ubykpOworCX0gZWxzZSB7CisJCW1lbXNldChzd2wsIDAsIHNpemVvZihzd19pbmZvX3QpICogTUFYX0ZJQlJFX0RFVklDRVMpOworCQlpZiAocWxhMngwMF9naWRfcHQoaGEsIHN3bCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKHN3bCk7CisJCQlzd2wgPSBOVUxMOworCQl9IGVsc2UgaWYgKHFsYTJ4MDBfZ3BuX2lkKGhhLCBzd2wpICE9IFFMQV9TVUNDRVNTKSB7CisJCQlrZnJlZShzd2wpOworCQkJc3dsID0gTlVMTDsKKwkJfSBlbHNlIGlmIChxbGEyeDAwX2dubl9pZChoYSwgc3dsKSAhPSBRTEFfU1VDQ0VTUykgeworCQkJa2ZyZWUoc3dsKTsKKwkJCXN3bCA9IE5VTEw7CisJCX0KKwl9CisJc3dsX2lkeCA9IDA7CisKKwkvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgZmNwb3J0IGZvciBhbnkgbmV3IGZjcG9ydHMgZGlzY292ZXJlZC4gKi8KKwluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQoaGEsIEdGUF9LRVJORUwpOworCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKKwkJaWYgKHN3bCkKKwkJCWtmcmVlKHN3bCk7CisJCXJldHVybiAoUUxBX01FTU9SWV9BTExPQ19GQUlMRUQpOworCX0KKwluZXdfZmNwb3J0LT5mbGFncyB8PSAoRkNGX0ZBQlJJQ19ERVZJQ0UgfCBGQ0ZfTE9HSU5fTkVFREVEKTsKKworCS8qIFNldCBzdGFydCBwb3J0IElEIHNjYW4gYXQgYWRhcHRlciBJRC4gKi8KKwlmaXJzdF9kZXYgPSAxOworCWxhc3RfZGV2ID0gMDsKKworCS8qIFN0YXJ0aW5nIGZyZWUgbG9vcCBJRC4gKi8KKwlsb29wX2lkID0gaGEtPm1pbl9leHRlcm5hbF9sb29waWQ7CisKKwlmb3IgKDsgbG9vcF9pZCA8PSBoYS0+bGFzdF9sb29wX2lkOyBsb29wX2lkKyspIHsKKwkJaWYgKFJFU0VSVkVEX0xPT1BfSUQobG9vcF9pZCkpCisJCQljb250aW51ZTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8CisJCSAgICB0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkKKwkJCWJyZWFrOworCisJCWlmIChzd2wgIT0gTlVMTCkgeworCQkJaWYgKGxhc3RfZGV2KSB7CisJCQkJd3JhcC5iMjQgPSBuZXdfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCX0gZWxzZSB7CisJCQkJbmV3X2ZjcG9ydC0+ZF9pZC5iMjQgPSBzd2xbc3dsX2lkeF0uZF9pZC5iMjQ7CisJCQkJbWVtY3B5KG5ld19mY3BvcnQtPm5vZGVfbmFtZSwKKwkJCQkgICAgc3dsW3N3bF9pZHhdLm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCQkJCW1lbWNweShuZXdfZmNwb3J0LT5wb3J0X25hbWUsCisJCQkJICAgIHN3bFtzd2xfaWR4XS5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKworCQkJCWlmIChzd2xbc3dsX2lkeF0uZF9pZC5iLnJzdmRfMSAhPSAwKSB7CisJCQkJCWxhc3RfZGV2ID0gMTsKKwkJCQl9CisJCQkJc3dsX2lkeCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU2VuZCBHQV9OWFQgdG8gdGhlIHN3aXRjaCAqLworCQkJcnZhbCA9IHFsYTJ4MDBfZ2Ffbnh0KGhhLCBuZXdfZmNwb3J0KTsKKwkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgICAiU05TIHNjYW4gZmFpbGVkIC0tIGFzc3VtaW5nIHplcm8tZW50cnkgIgorCQkJCSAgICAicmVzdWx0Li4uXG4iKTsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNwb3J0LCBmY3B0ZW1wLAorCQkJCSAgICBuZXdfZmNwb3J0cywgbGlzdCkgeworCQkJCQlsaXN0X2RlbCgmZmNwb3J0LT5saXN0KTsKKwkJCQkJa2ZyZWUoZmNwb3J0KTsKKwkJCQl9CisJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogSWYgd3JhcCBvbiBzd2l0Y2ggZGV2aWNlIGxpc3QsIGV4aXQuICovCisJCWlmIChmaXJzdF9kZXYpIHsKKwkJCXdyYXAuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQlmaXJzdF9kZXYgPSAwOworCQl9IGVsc2UgaWYgKG5ld19mY3BvcnQtPmRfaWQuYjI0ID09IHdyYXAuYjI0KSB7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IGRldmljZSB3cmFwICglMDJ4JTAyeCUwMngpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBuZXdfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJICAgIG5ld19mY3BvcnQtPmRfaWQuYi5hcmVhLCBuZXdfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQnlwYXNzIGlmIGhvc3QgYWRhcHRlci4gKi8KKwkJaWYgKG5ld19mY3BvcnQtPmRfaWQuYjI0ID09IGhhLT5kX2lkLmIyNCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEJ5cGFzcyByZXNlcnZlZCBkb21haW4gZmllbGRzLiAqLworCQlpZiAoKG5ld19mY3BvcnQtPmRfaWQuYi5kb21haW4gJiAweGYwKSA9PSAweGYwKQorCQkJY29udGludWU7CisKKwkJLyogTG9jYXRlIG1hdGNoaW5nIGRldmljZSBpbiBkYXRhYmFzZS4gKi8KKwkJZm91bmQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAobWVtY21wKG5ld19mY3BvcnQtPnBvcnRfbmFtZSwgZmNwb3J0LT5wb3J0X25hbWUsCisJCQkgICAgV1dOX1NJWkUpKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3VuZCsrOworCisJCQkvKgorCQkJICogSWYgYWRkcmVzcyB0aGUgc2FtZSBhbmQgc3RhdGUgRkNTX09OTElORSwgbm90aGluZworCQkJICogY2hhbmdlZC4KKwkJCSAqLworCQkJaWYgKGZjcG9ydC0+ZF9pZC5iMjQgPT0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQgJiYKKwkJCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogSWYgZGV2aWNlIHdhcyBub3QgYSBmYWJyaWMgZGV2aWNlIGJlZm9yZS4KKwkJCSAqLworCQkJaWYgKChmY3BvcnQtPmZsYWdzICYgRkNGX0ZBQlJJQ19ERVZJQ0UpID09IDApIHsKKwkJCQlmY3BvcnQtPmRfaWQuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQkJZmNwb3J0LT5sb29wX2lkID0gRkNfTk9fTE9PUF9JRDsKKwkJCQlmY3BvcnQtPmZsYWdzIHw9IChGQ0ZfRkFCUklDX0RFVklDRSB8CisJCQkJICAgIEZDRl9MT0dJTl9ORUVERUQpOworCQkJCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9QRVJTSVNURU5UX0JPVU5EOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogUG9ydCBJRCBjaGFuZ2VkIG9yIGRldmljZSB3YXMgbWFya2VkIHRvIGJlIHVwZGF0ZWQ7CisJCQkgKiBMb2cgaXQgb3V0IGlmIHN0aWxsIGxvZ2dlZCBpbiBhbmQgbWFyayBpdCBmb3IKKwkJCSAqIHJlbG9naW4gbGF0ZXIuCisJCQkgKi8KKwkJCWZjcG9ydC0+ZF9pZC5iMjQgPSBuZXdfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCWZjcG9ydC0+ZmxhZ3MgfD0gRkNGX0xPR0lOX05FRURFRDsKKwkJCWlmIChmY3BvcnQtPmxvb3BfaWQgIT0gRkNfTk9fTE9PUF9JRCAmJgorCQkJICAgIChmY3BvcnQtPmZsYWdzICYgRkNGX1RBUEVfUFJFU0VOVCkgPT0gMCAmJgorCQkJICAgIGZjcG9ydC0+cG9ydF90eXBlICE9IEZDVF9JTklUSUFUT1IgJiYKKwkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfQlJPQURDQVNUKSB7CisJCQkJcWxhMngwMF9mYWJyaWNfbG9nb3V0KGhhLCBmY3BvcnQtPmxvb3BfaWQpOworCQkJCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJY29udGludWU7CisKKwkJLyogSWYgZGV2aWNlIHdhcyBub3QgaW4gb3VyIGZjcG9ydHMgbGlzdCwgdGhlbiBhZGQgaXQuICovCisJCWxpc3RfYWRkX3RhaWwoJm5ld19mY3BvcnQtPmxpc3QsIG5ld19mY3BvcnRzKTsKKworCQkvKiBBbGxvY2F0ZSBhIG5ldyByZXBsYWNlbWVudCBmY3BvcnQuICovCisJCW54dF9kX2lkLmIyNCA9IG5ld19mY3BvcnQtPmRfaWQuYjI0OworCQluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQoaGEsIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCQlpZiAoc3dsKQorCQkJCWtmcmVlKHN3bCk7CisJCQlyZXR1cm4gKFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEKTsKKwkJfQorCQluZXdfZmNwb3J0LT5mbGFncyB8PSAoRkNGX0ZBQlJJQ19ERVZJQ0UgfCBGQ0ZfTE9HSU5fTkVFREVEKTsKKwkJbmV3X2ZjcG9ydC0+ZF9pZC5iMjQgPSBueHRfZF9pZC5iMjQ7CisJfQorCisJaWYgKHN3bCkKKwkJa2ZyZWUoc3dsKTsKKworCWlmIChuZXdfZmNwb3J0KQorCQlrZnJlZShuZXdfZmNwb3J0KTsKKworCWlmICghbGlzdF9lbXB0eShuZXdfZmNwb3J0cykpCisJCWhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19GQUJSSUNfREVWSUNFUzsKKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQKKyAqCVNjYW4gdGhyb3VnaCBvdXIgcG9ydCBsaXN0IGFuZCBmaW5kIGEgbmV3IHVzYWJsZSBsb29wIElELgorICoKKyAqIElucHV0OgorICoJaGE6CWFkYXB0ZXIgc3RhdGUgcG9pbnRlci4KKyAqCWRldjoJcG9ydCBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZmluZF9uZXdfbG9vcF9pZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmRldikKK3sKKwlpbnQJcnZhbDsKKwlpbnQJZm91bmQ7CisJZmNfcG9ydF90ICpmY3BvcnQ7CisJdWludDE2X3QgZmlyc3RfbG9vcF9pZDsKKworCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCS8qIFNhdmUgc3RhcnRpbmcgbG9vcCBJRC4gKi8KKwlmaXJzdF9sb29wX2lkID0gZGV2LT5sb29wX2lkOworCisJZm9yICg7OykgeworCQkvKiBTa2lwIGxvb3AgSUQgaWYgYWxyZWFkeSB1c2VkIGJ5IGFkYXB0ZXIuICovCisJCWlmIChkZXYtPmxvb3BfaWQgPT0gaGEtPmxvb3BfaWQpIHsKKwkJCWRldi0+bG9vcF9pZCsrOworCQl9CisKKwkJLyogU2tpcCByZXNlcnZlZCBsb29wIElEcy4gKi8KKwkJd2hpbGUgKFJFU0VSVkVEX0xPT1BfSUQoZGV2LT5sb29wX2lkKSkgeworCQkJZGV2LT5sb29wX2lkKys7CisJCX0KKworCQkvKiBSZXNldCBsb29wIElEIGlmIHBhc3NlZCB0aGUgZW5kLiAqLworCQlpZiAoZGV2LT5sb29wX2lkID4gaGEtPmxhc3RfbG9vcF9pZCkgeworCQkJLyogZmlyc3QgbG9vcCBJRC4gKi8KKwkJCWRldi0+bG9vcF9pZCA9IGhhLT5taW5fZXh0ZXJuYWxfbG9vcGlkOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIGxvb3AgSUQgYmVpbmcgYWxyZWFkeSBpbiB1c2UuICovCisJCWZvdW5kID0gMDsKKwkJZmNwb3J0ID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKGZjcG9ydC0+bG9vcF9pZCA9PSBkZXYtPmxvb3BfaWQgJiYgZmNwb3J0ICE9IGRldikgeworCQkJCS8qIElEIHBvc3NpYmx5IGluIHVzZSAqLworCQkJCWZvdW5kKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBJZiBub3QgaW4gdXNlIHRoZW4gaXQgaXMgZnJlZSB0byB1c2UuICovCisJCWlmICghZm91bmQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSUQgaW4gdXNlLiBUcnkgbmV4dCB2YWx1ZS4gKi8KKwkJZGV2LT5sb29wX2lkKys7CisKKwkJLyogSWYgd3JhcCBhcm91bmQuIE5vIGZyZWUgSUQgdG8gdXNlLiAqLworCQlpZiAoZGV2LT5sb29wX2lkID09IGZpcnN0X2xvb3BfaWQpIHsKKwkJCWRldi0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfZGV2aWNlX3Jlc3luYworICoJTWFya3MgZGV2aWNlcyBpbiB0aGUgZGF0YWJhc2UgdGhhdCBuZWVkcyByZXN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9kZXZpY2VfcmVzeW5jKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWludAlydmFsOworCWludAlydmFsMjsKKwl1aW50MzJfdCBtYXNrOworCWZjX3BvcnRfdCAqZmNwb3J0OworCXVpbnQzMl90IHJzY25fZW50cnk7CisJdWludDhfdCByc2NuX291dF9pdGVyOworCXVpbnQ4X3QgZm9ybWF0OworCXBvcnRfaWRfdCBkX2lkOworCisJcnZhbCA9IFFMQV9SU0NOU19IQU5ETEVEOworCisJd2hpbGUgKGhhLT5yc2NuX291dF9wdHIgIT0gaGEtPnJzY25faW5fcHRyIHx8CisJICAgIGhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93KSB7CisKKwkJcnNjbl9lbnRyeSA9IGhhLT5yc2NuX3F1ZXVlW2hhLT5yc2NuX291dF9wdHJdOworCQlmb3JtYXQgPSBNU0IoTVNXKHJzY25fZW50cnkpKTsKKwkJZF9pZC5iLmRvbWFpbiA9IExTQihNU1cocnNjbl9lbnRyeSkpOworCQlkX2lkLmIuYXJlYSA9IE1TQihMU1cocnNjbl9lbnRyeSkpOworCQlkX2lkLmIuYWxfcGEgPSBMU0IoTFNXKHJzY25fZW50cnkpKTsKKworCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUlNDTiBxdWV1ZSBlbnRyeVslZF0gPSAiCisJCSAgICAiWyUwMngvJTAyeCUwMnglMDJ4XS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgaGEtPnJzY25fb3V0X3B0ciwgZm9ybWF0LCBkX2lkLmIuZG9tYWluLAorCQkgICAgZF9pZC5iLmFyZWEsIGRfaWQuYi5hbF9wYSkpOworCisJCWhhLT5yc2NuX291dF9wdHIrKzsKKwkJaWYgKGhhLT5yc2NuX291dF9wdHIgPT0gTUFYX1JTQ05fQ09VTlQpCisJCQloYS0+cnNjbl9vdXRfcHRyID0gMDsKKworCQkvKiBTa2lwIGR1cGxpY2F0ZSBlbnRyaWVzLiAqLworCQlmb3IgKHJzY25fb3V0X2l0ZXIgPSBoYS0+cnNjbl9vdXRfcHRyOworCQkgICAgIWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ICYmCisJCSAgICByc2NuX291dF9pdGVyICE9IGhhLT5yc2NuX2luX3B0cjsKKwkJICAgIHJzY25fb3V0X2l0ZXIgPSAocnNjbl9vdXRfaXRlciA9PQorCQkJKE1BWF9SU0NOX0NPVU5UIC0gMSkpID8gMDogcnNjbl9vdXRfaXRlciArIDEpIHsKKworCQkJaWYgKHJzY25fZW50cnkgIT0gaGEtPnJzY25fcXVldWVbcnNjbl9vdXRfaXRlcl0pCisJCQkJYnJlYWs7CisKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBTa2lwcGluZyBkdXBsaWNhdGUgUlNDTiBxdWV1ZSAiCisJCQkgICAgImVudHJ5IGZvdW5kIGF0IFslZF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJCSAgICByc2NuX291dF9pdGVyKSk7CisKKwkJCWhhLT5yc2NuX291dF9wdHIgPSByc2NuX291dF9pdGVyOworCQl9CisKKwkJLyogUXVldWUgb3ZlcmZsb3csIHNldCBzd2l0Y2ggZGVmYXVsdCBjYXNlLiAqLworCQlpZiAoaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cpIHsKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBkZXZpY2VfcmVzeW5jOiByc2NuICIKKwkJCSAgICAib3ZlcmZsb3cuXG4iLCBoYS0+aG9zdF9ubykpOworCisJCQlmb3JtYXQgPSAzOworCQkJaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAwOworCQl9CisKKwkJc3dpdGNoIChmb3JtYXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYKKwkJCSAgICAhSVNfUUxBNjMxMihoYSkgJiYgIUlTX1FMQTYzMjIoaGEpICYmCisJCQkgICAgaGEtPmZsYWdzLmluaXRfZG9uZSkgeworCQkJCS8qIEhhbmRsZSBwb3J0IFJTQ04gdmlhIGFzeW5jcm9ub3VzIElPQ0JzICovCisJCQkJcnZhbDIgPSBxbGEyeDAwX2hhbmRsZV9wb3J0X3JzY24oaGEsIHJzY25fZW50cnksCisJCQkJICAgIE5VTEwsIDApOworCQkJCWlmIChydmFsMiA9PSBRTEFfU1VDQ0VTUykKKwkJCQkJY29udGludWU7CisJCQl9CisJCQltYXNrID0gMHhmZmZmZmY7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbWFzayA9IDB4ZmZmZjAwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW1hc2sgPSAweGZmMDAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWFzayA9IDB4MDsKKwkJCWRfaWQuYjI0ID0gMDsKKwkJCWhhLT5yc2NuX291dF9wdHIgPSBoYS0+cnNjbl9pbl9wdHI7CisJCQlicmVhazsKKwkJfQorCisJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKworCQkvKiBBYm9ydCBhbnkgb3V0c3RhbmRpbmcgSU8gZGVzY3JpcHRvcnMuICovCisJCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKQorCQkJcWxhMngwMF9jYW5jZWxfaW9fZGVzY3JpcHRvcnMoaGEpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJCWlmICgoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSA9PSAwIHx8CisJCQkgICAgKGZjcG9ydC0+ZF9pZC5iMjQgJiBtYXNrKSAhPSBkX2lkLmIyNCB8fAorCQkJICAgIGZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9CUk9BRENBU1QpCisJCQkJY29udGludWU7CisKKwkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSkgeworCQkJCWlmIChmb3JtYXQgIT0gMyB8fAorCQkJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfSU5JVElBVE9SKSB7CisJCQkJCWF0b21pY19zZXQoJmZjcG9ydC0+c3RhdGUsCisJCQkJCSAgICBGQ1NfREVWSUNFX0xPU1QpOworCQkJCX0KKwkJCX0KKwkJCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9GQVJQX0RPTkU7CisJCX0KKwl9CisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfZmFicmljX2Rldl9sb2dpbgorICoJTG9naW4gZmFicmljIHRhcmdldCBkZXZpY2UgYW5kIHVwZGF0ZSBGQyBwb3J0IGRhdGFiYXNlLgorICoKKyAqIElucHV0OgorICoJaGE6CQlhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglmY3BvcnQ6CQlwb3J0IHN0cnVjdHVyZSBsaXN0IHBvaW50ZXIuCisgKgluZXh0X2xvb3BpZDoJY29udGFpbnMgdmFsdWUgb2YgYSBuZXcgbG9vcCBJRCB0aGF0IGNhbiBiZSB1c2VkCisgKgkJCWJ5IHRoZSBuZXh0IGxvZ2luIGF0dGVtcHQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9mYWJyaWNfZGV2X2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0LAorICAgIHVpbnQxNl90ICpuZXh0X2xvb3BpZCkKK3sKKwlpbnQJcnZhbDsKKwlpbnQJcmV0cnk7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisJcmV0cnkgPSAwOworCisJcnZhbCA9IHFsYTJ4MDBfZmFicmljX2xvZ2luKGhhLCBmY3BvcnQsIG5leHRfbG9vcGlkKTsKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQlydmFsID0gcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZShoYSwgZmNwb3J0LCAwKTsKKwkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCXFsYTJ4MDBfZmFicmljX2xvZ291dChoYSwgZmNwb3J0LT5sb29wX2lkKTsKKwkJfSBlbHNlIHsKKwkJCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydChoYSwgZmNwb3J0KTsKKwkJfQorCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2ZhYnJpY19sb2dpbgorICoJSXNzdWUgZmFicmljIGxvZ2luIGNvbW1hbmQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWRldmljZSA9IHBvaW50ZXIgdG8gRkMgZGV2aWNlIHR5cGUgc3RydWN0dXJlLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgIDAgLSBMb2dpbiBzdWNjZXNzZnVsbHkKKyAqICAgICAgMSAtIExvZ2luIGZhaWxlZAorICogICAgICAyIC0gSW5pdGlhdG9yIGRldmljZQorICogICAgICAzIC0gRmF0YWwgZXJyb3IKKyAqLworaW50CitxbGEyeDAwX2ZhYnJpY19sb2dpbihzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKKyAgICB1aW50MTZfdCAqbmV4dF9sb29waWQpCit7CisJaW50CXJ2YWw7CisJaW50CXJldHJ5OworCXVpbnQxNl90IHRtcF9sb29waWQ7CisJdWludDE2X3QgbWJbTUFJTEJPWF9SRUdJU1RFUl9DT1VOVF07CisKKwlyZXRyeSA9IDA7CisJdG1wX2xvb3BpZCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBUcnlpbmcgRmFicmljIExvZ2luIHcvbG9vcCBpZCAweCUwNHggIgorIAkJICAgICJmb3IgcG9ydCAlMDJ4JTAyeCUwMnguXG4iLAorIAkJICAgIGhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJLyogTG9naW4gZmNwb3J0IG9uIHN3aXRjaC4gKi8KKwkJcWxhMngwMF9sb2dpbl9mYWJyaWMoaGEsIGZjcG9ydC0+bG9vcF9pZCwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBtYiwgQklUXzApOworCQlpZiAobWJbMF0gPT0gTUJTX1BPUlRfSURfVVNFRCkgeworCQkJLyoKKwkJCSAqIERldmljZSBoYXMgYW5vdGhlciBsb29wIElELiAgVGhlIGZpcm13YXJlIHRlYW0KKwkJCSAqIHJlY29tbWVuZHMgdXMgdG8gcGVyZm9ybSBhbiBpbXBsaWNpdCBsb2dpbiB3aXRoIHRoZQorCQkJICogc3BlY2lmaWVkIElEIGFnYWluLiBUaGUgSUQgd2UganVzdCB1c2VkIGlzIHNhdmUgaGVyZQorCQkJICogc28gd2UgcmV0dXJuIHdpdGggYW4gSUQgdGhhdCBjYW4gYmUgdHJpZWQgYnkgdGhlCisJCQkgKiBuZXh0IGxvZ2luLgorCQkJICovCisJCQlyZXRyeSsrOworCQkJdG1wX2xvb3BpZCA9IGZjcG9ydC0+bG9vcF9pZDsKKwkJCWZjcG9ydC0+bG9vcF9pZCA9IG1iWzFdOworCisJCQlERUJVRyhwcmludGsoIkZhYnJpYyBMb2dpbjogcG9ydCBpbiB1c2UgLSBuZXh0ICIKKyAJCQkgICAgImxvb3AgaWQ9MHglMDR4LCBwb3J0IElkPSUwMnglMDJ4JTAyeC5cbiIsCisJCQkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQl9IGVsc2UgaWYgKG1iWzBdID09IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7CisJCQkvKgorCQkJICogTG9naW4gc3VjY2VlZGVkLgorCQkJICovCisJCQlpZiAocmV0cnkpIHsKKwkJCQkvKiBBIHJldHJ5IG9jY3VycmVkIGJlZm9yZS4gKi8KKwkJCQkqbmV4dF9sb29waWQgPSB0bXBfbG9vcGlkOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5vIHJldHJ5IG9jY3VycmVkIGJlZm9yZS4gSnVzdCBpbmNyZW1lbnQgdGhlCisJCQkJICogSUQgdmFsdWUgZm9yIG5leHQgbG9naW4uCisJCQkJICovCisJCQkJKm5leHRfbG9vcGlkID0gKGZjcG9ydC0+bG9vcF9pZCArIDEpOworCQkJfQorCisJCQlpZiAobWJbMV0gJiBCSVRfMCkgeworCQkJCWZjcG9ydC0+cG9ydF90eXBlID0gRkNUX0lOSVRJQVRPUjsKKwkJCX0gZWxzZSB7CisJCQkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfVEFSR0VUOworCQkJCWlmIChtYlsxXSAmIEJJVF8xKSB7CisJCQkJCWZjcG9ydC0+ZmxhZ3MgfD0gRkNGX1RBUEVfUFJFU0VOVDsKKwkJCQl9CisJCQl9CisKKwkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG1iWzBdID09IE1CU19MT09QX0lEX1VTRUQpIHsKKwkJCS8qCisJCQkgKiBMb29wIElEIGFscmVhZHkgdXNlZCwgdHJ5IG5leHQgbG9vcCBJRC4KKwkJCSAqLworCQkJZmNwb3J0LT5sb29wX2lkKys7CisJCQlydmFsID0gcWxhMngwMF9maW5kX25ld19sb29wX2lkKGhhLCBmY3BvcnQpOworCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQkvKiBSYW4gb3V0IG9mIGxvb3AgSURzIHRvIHVzZSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKG1iWzBdID09IE1CU19DT01NQU5EX0VSUk9SKSB7CisJCQkvKgorCQkJICogRmlybXdhcmUgcG9zc2libHkgdGltZWQgb3V0IGR1cmluZyBsb2dpbi4gSWYgTk8KKwkJCSAqIHJldHJpZXMgYXJlIGxlZnQgdG8gZG8gdGhlbiB0aGUgZGV2aWNlIGlzIGRlY2xhcmVkCisJCQkgKiBkZWFkLgorCQkJICovCisJCQkqbmV4dF9sb29waWQgPSBmY3BvcnQtPmxvb3BfaWQ7CisJCQlxbGEyeDAwX2ZhYnJpY19sb2dvdXQoaGEsIGZjcG9ydC0+bG9vcF9pZCk7CisJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoaGEsIGZjcG9ydCwgMSk7CisKKwkJCXJ2YWwgPSAxOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogdW5yZWNvdmVyYWJsZSAvIG5vdCBoYW5kbGVkIGVycm9yCisJCQkgKi8KKwkJCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBwb3J0X2lkPSUwMnglMDJ4JTAyeCAiCisgCQkJICAgICJsb29wX2lkPSV4IGppZmZpZXM9JWx4LlxuIiwgCisgCQkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgbWJbMF0sIAorCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgZmNwb3J0LT5sb29wX2lkLCBqaWZmaWVzKSk7CisKKwkJCSpuZXh0X2xvb3BpZCA9IGZjcG9ydC0+bG9vcF9pZDsKKwkJCXFsYTJ4MDBfZmFicmljX2xvZ291dChoYSwgZmNwb3J0LT5sb29wX2lkKTsKKwkJCWZjcG9ydC0+bG9vcF9pZCA9IEZDX05PX0xPT1BfSUQ7CisJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0RFQUQpOworCisJCQlydmFsID0gMzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfbG9jYWxfZGV2aWNlX2xvZ2luCisgKglJc3N1ZSBsb2NhbCBkZXZpY2UgbG9naW4gY29tbWFuZC4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJbG9vcF9pZCA9IGxvb3AgaWQgb2YgZGV2aWNlIHRvIGxvZ2luIHRvLgorICoKKyAqIFJldHVybnMgKFdoZXJlJ3MgdGhlICNkZWZpbmUhISEhKToKKyAqICAgICAgMCAtIExvZ2luIHN1Y2Nlc3NmdWxseQorICogICAgICAxIC0gTG9naW4gZmFpbGVkCisgKiAgICAgIDMgLSBGYXRhbCBlcnJvcgorICovCitpbnQKK3FsYTJ4MDBfbG9jYWxfZGV2aWNlX2xvZ2luKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQpCit7CisJaW50CQlydmFsOworCXVpbnQxNl90CW1iW01BSUxCT1hfUkVHSVNURVJfQ09VTlRdOworCisJbWVtc2V0KG1iLCAwLCBzaXplb2YobWIpKTsKKwlydmFsID0gcWxhMngwMF9sb2dpbl9sb2NhbF9kZXZpY2UoaGEsIGxvb3BfaWQsIG1iLCBCSVRfMCk7CisJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJLyogSW50ZXJyb2dhdGUgbWFpbGJveCByZWdpc3RlcnMgZm9yIGFueSBlcnJvcnMgKi8KKwkJaWYgKG1iWzBdID09IE1CU19DT01NQU5EX0VSUk9SKQorCQkJcnZhbCA9IDE7CisJCWVsc2UgaWYgKG1iWzBdID09IE1CU19DT01NQU5EX1BBUkFNRVRFUl9FUlJPUikKKwkJCS8qIGRldmljZSBub3QgaW4gUENCIHRhYmxlICovCisJCQlydmFsID0gMzsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogIHFsYTJ4MDBfbG9vcF9yZXN5bmMKKyAqICAgICAgUmVzeW5jIHdpdGggZmlicmUgY2hhbm5lbCBkZXZpY2VzLgorICoKKyAqIElucHV0OgorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAwID0gc3VjY2VzcworICovCitpbnQKK3FsYTJ4MDBfbG9vcF9yZXN5bmMoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJaW50ICAgcnZhbDsKKwl1aW50MzJfdCB3YWl0X3RpbWU7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9VUERBVEUpOworCXFsYTJ4MDBfc3RhdHMubG9vcF9yZXN5bmMrKzsKKwljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmaGEtPmRwY19mbGFncyk7CisJaWYgKGhhLT5mbGFncy5vbmxpbmUpIHsKKwkJaWYgKCEocnZhbCA9IHFsYTJ4MDBfZndfcmVhZHkoaGEpKSkgeworCQkJLyogV2FpdCBhdCBtb3N0IE1BWF9UQVJHRVQgUlNDTnMgZm9yIGEgc3RhYmxlIGxpbmsuICovCisJCQl3YWl0X3RpbWUgPSAyNTY7CisJCQlkbyB7CisJCQkJLyogdjIuMTkuMDViNiAqLworCQkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX1VQREFURSk7CisKKwkJCQkvKgorCQkJCSAqIElzc3VlIG1hcmtlciBjb21tYW5kIG9ubHkgd2hlbiB3ZSBhcmUgZ29pbmcKKwkJCQkgKiB0byBzdGFydCB0aGUgSS9PIC4KKwkJCQkgKi8KKwkJCQloYS0+bWFya2VyX25lZWRlZCA9IDE7CisKKwkJCQkvKiBSZW1hcCBkZXZpY2VzIG9uIExvb3AuICovCisJCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQkJcWxhMngwMF9jb25maWd1cmVfbG9vcChoYSk7CisJCQkJd2FpdF90aW1lLS07CisJCQl9IHdoaWxlICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpICYmCisJCQkJISh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykpICYmCisJCQkJd2FpdF90aW1lICYmCisJCQkJKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSk7CisJCX0KKwkJcWxhMngwMF9yZXN0YXJ0X3F1ZXVlcyhoYSwgMSk7CisJfQorCisJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50aygiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogIHFsYTJ4MDBfcmVzdGFydF9xdWV1ZXMKKyAqCVJlc3RhcnQgZGV2aWNlIHF1ZXVlcy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwvSW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQKK3FsYTJ4MDBfcmVzdGFydF9xdWV1ZXMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDhfdCBmbHVzaCkgCit7CisJc3JiX3QgIAkJKnNwOworCWludAkJcmV0cnlfcV9jbnQgPSAwOworCWludAkJcGVuZGluZ19xX2NudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRlbXA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwljbGVhcl9iaXQoUkVTVEFSVF9RVUVVRVNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkvKiBzdGFydCBwZW5kaW5nIHF1ZXVlICovCisJcGVuZGluZ19xX2NudCA9IGhhLT5xdGhyZWFkczsKKwlpZiAoZmx1c2gpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmhhLT5wZW5kaW5nX3F1ZXVlKSB7CisJCQlzcCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCisJCQlpZiAoKHNwLT5mbGFncyAmIFNSQl9UQVBFKSkKKwkJCQljb250aW51ZTsKKwkJCSAKKwkJCS8qIAorCQkJICogV2hlbiB0aW1lIGV4cGlyZSByZXR1cm4gcmVxdWVzdCBiYWNrIHRvIE9TIGFzIEJVU1kgCisJCQkgKi8KKwkJCV9fZGVsX2Zyb21fcGVuZGluZ19xdWV1ZShoYSwgc3ApOworCQkJc3AtPmNtZC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQkJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKKwkJCV9fYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZoYS0+cGVuZGluZ19xdWV1ZSkpCisJCQlxbGEyeDAwX25leHQoaGEpOworCX0KKworCS8qCisJICogQ2xlYXIgb3V0IG91ciByZXRyeSBxdWV1ZQorCSAqLworCWlmIChmbHVzaCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCQlyZXRyeV9xX2NudCA9IGhhLT5yZXRyeV9xX2NudDsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+cmV0cnlfcXVldWUpIHsKKwkJCXNwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisJCQkvKiB3aGVuIHRpbWUgZXhwaXJlIHJldHVybiByZXF1ZXN0IGJhY2sgdG8gT1MgYXMgQlVTWSAqLworCQkJX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJc3AtPmNtZC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQkJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKKwkJCV9fYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwkJREVCVUcyKHByaW50aygiJXMoJWxkKTogY2FsbGJhY2sgJWQgY29tbWFuZHMuXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWhhLT5ob3N0X25vLAorCQkJCXJldHJ5X3FfY250KTspCisJfQorCisJREVCVUcyKHByaW50aygiJXMoJWxkKTogYWN0aXZlPSVsZCwgcmV0cnk9JWQsIHBlbmRpbmc9JWQsICIKKwkJCSJkb25lPSVsZCwgc2NzaSByZXRyeT0lZCBjb21tYW5kcy5cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWhhLT5ob3N0X25vLAorCQkJaGEtPmFjdHRocmVhZHMsCisJCQloYS0+cmV0cnlfcV9jbnQsCisJCQlwZW5kaW5nX3FfY250LAorCQkJaGEtPmRvbmVfcV9jbnQsCisJCQloYS0+c2NzaV9yZXRyeV9xX2NudCk7KQorCisJaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZG9uZV9xdWV1ZSkpCisJCXFsYTJ4MDBfZG9uZShoYSk7Cit9CisKK3ZvaWQKK3FsYTJ4MDBfcmVzY2FuX2ZjcG9ydHMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcmVzY2FuX2RvbmU7CisJZmNfcG9ydF90ICpmY3BvcnQ7CisKKwlyZXNjYW5fZG9uZSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQlpZiAoKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfUkVTQ0FOX05FRURFRCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydChoYSwgZmNwb3J0KTsKKwkJZmNwb3J0LT5mbGFncyAmPSB+RkNGX1JFU0NBTl9ORUVERUQ7CisKKwkJcmVzY2FuX2RvbmUgPSAxOworCX0KKwlxbGEyeDAwX3Byb2JlX2Zvcl9hbGxfbHVucyhoYSk7IAorCisJLyogVXBkYXRlIE9TIHRhcmdldCBhbmQgbHVuIHN0cnVjdHVyZXMgaWYgbmVjZXNzYXJ5LiAqLworCWlmIChyZXNjYW5fZG9uZSkgeworCQlxbGEyeDAwX2NvbmZpZ19vcyhoYSk7CisJfQorfQorCisKKy8qCisgKiBxbGEyeDAwX2NvbmZpZ19vcworICoJU2V0dXAgT1MgdGFyZ2V0IGFuZCBMVU4gc3RydWN0dXJlcy4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBzdGF0ZSBwb2ludGVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfY29uZmlnX29zKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWZjX3BvcnRfdAkqZmNwb3J0OworCWZjX2x1bl90CSpmY2x1bjsKKwlvc190Z3RfdAkqdHE7CisJdWludDE2X3QJdGd0OworCisKKwlmb3IgKHRndCA9IDA7IHRndCA8IE1BWF9UQVJHRVRTOyB0Z3QrKykgeworCQlpZiAoKHRxID0gVEdUX1EoaGEsIHRndCkpID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQljbGVhcl9iaXQoVFFGX09OTElORSwgJnRxLT5mbGFncyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9IEZDU19PTkxJTkUgfHwKKwkJICAgIGZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9JTklUSUFUT1IgfHwKKwkJICAgIGZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9CUk9BRENBU1QpIHsKKwkJCWZjcG9ydC0+b3NfdGFyZ2V0X2lkID0gTUFYX1RBUkdFVFM7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChmY3BvcnQtPmZsYWdzICYgRkNGX0ZPX01BU0tFRCkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBCaW5kIEZDIHBvcnQgdG8gT1MgdGFyZ2V0IG51bWJlci4gKi8KKwkJaWYgKHFsYTJ4MDBfZmNwb3J0X2JpbmQoaGEsIGZjcG9ydCkgPT0gTUFYX1RBUkdFVFMpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQmluZCBGQyBMVU4gdG8gT1MgTFVOIG51bWJlci4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY2x1biwgJmZjcG9ydC0+ZmNsdW5zLCBsaXN0KSB7CisJCQlxbGEyeDAwX2ZjbHVuX2JpbmQoaGEsIGZjcG9ydCwgZmNsdW4pOworCQl9CisJfQorfQorCisvKgorICogcWxhMngwMF9mY3BvcnRfYmluZAorICoJTG9jYXRlcyBhIHRhcmdldCBudW1iZXIgZm9yIEZDIHBvcnQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgc3RhdGUgcG9pbnRlci4KKyAqCWZjcG9ydCA9IEZDIHBvcnQgc3RydWN0dXJlIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXRhcmdldCBudW1iZXIKKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyB1aW50MTZfdAorcWxhMngwMF9mY3BvcnRfYmluZChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCkgCit7CisJaW50CQlmb3VuZDsKKwl1aW50MTZfdAl0Z3Q7CisJb3NfdGd0X3QJKnRxOworCisJLyogQ2hlY2sgZm9yIHBlcnNpc3RlbnQgYmluZGluZy4gKi8KKwlmb3IgKHRndCA9IDA7IHRndCA8IE1BWF9UQVJHRVRTOyB0Z3QrKykgeworCQlpZiAoKHRxID0gVEdUX1EoaGEsIHRndCkpID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IDA7CisJCXN3aXRjaCAoaGEtPmJpbmRpbmdfdHlwZSkgeworCQljYXNlIEJJTkRfQllfUE9SVF9JRDoKKwkJCWlmIChmY3BvcnQtPmRfaWQuYjI0ID09IHRxLT5kX2lkLmIyNCkgeworCQkJCW1lbWNweSh0cS0+bm9kZV9uYW1lLCBmY3BvcnQtPm5vZGVfbmFtZSwKKwkJCQkgICAgV1dOX1NJWkUpOworCQkJCW1lbWNweSh0cS0+cG9ydF9uYW1lLCBmY3BvcnQtPnBvcnRfbmFtZSwKKwkJCQkgICAgV1dOX1NJWkUpOworCQkJCWZvdW5kKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCSU5EX0JZX1BPUlRfTkFNRTogICAgCisJCQlpZiAobWVtY21wKGZjcG9ydC0+cG9ydF9uYW1lLCB0cS0+cG9ydF9uYW1lLAorCQkJICAgIFdXTl9TSVpFKSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBJbiBjYXNlIG9mIHBlcnNpc3RlbnQgYmluZGluZywgdXBkYXRlIHRoZQorCQkJCSAqIFdXTk4uCisJCQkJICovCisJCQkJbWVtY3B5KHRxLT5ub2RlX25hbWUsIGZjcG9ydC0+bm9kZV9uYW1lLAorCQkJCSAgICBXV05fU0laRSk7CisJCQkJZm91bmQrKzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmIChmb3VuZCkKKwkJICAgIGJyZWFrOwkKKwl9CisKKwkvKiBUT0RPOiBob25vciB0aGUgQ29uZmlnUmVxdWlyZWQgZmxhZyAqLworCWlmICh0Z3QgPT0gTUFYX1RBUkdFVFMpIHsKKwkJLyogQ2hlY2sgaWYgdGFyZ2V0SUQgMCBhdmFpbGFibGUuICovCisJCXRndCA9IDA7CisKKwkJaWYgKFRHVF9RKGhhLCB0Z3QpICE9IE5VTEwpIHsKKwkJCS8qIExvY2F0ZSBmaXJzdCBmcmVlIHRhcmdldCBmb3IgZGV2aWNlLiAqLworCQkJZm9yICh0Z3QgPSAwOyB0Z3QgPCBNQVhfVEFSR0VUUzsgdGd0KyspIHsKKwkJCQlpZiAoVEdUX1EoaGEsIHRndCkgPT0gTlVMTCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHRndCAhPSBNQVhfVEFSR0VUUykgeworCQkJaWYgKCh0cSA9IHFsYTJ4MDBfdGd0X2FsbG9jKGhhLCB0Z3QpKSAhPSBOVUxMKSB7CisJCQkJbWVtY3B5KHRxLT5ub2RlX25hbWUsIGZjcG9ydC0+bm9kZV9uYW1lLAorCQkJCSAgICBXV05fU0laRSk7CisJCQkJbWVtY3B5KHRxLT5wb3J0X25hbWUsIGZjcG9ydC0+cG9ydF9uYW1lLAorCQkJCSAgICBXV05fU0laRSk7CisJCQkJdHEtPmRfaWQuYjI0ID0gZmNwb3J0LT5kX2lkLmIyNDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlc2V0IHRhcmdldCBudW1iZXJzIGluY2FzZSBpdCBjaGFuZ2VkLiAqLworCWZjcG9ydC0+b3NfdGFyZ2V0X2lkID0gdGd0OworCWlmICh0Z3QgIT0gTUFYX1RBUkdFVFMgJiYgdHEgIT0gTlVMTCkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzc2lnbmluZyB0YXJnZXQgSUQ9JTAyZCBAICVwIHRvICIKKwkJICAgICJsb29wIGlkPTB4JTA0eCwgcG9ydCBzdGF0ZT0weCV4LCBwb3J0IGRvd24gcmV0cnk9JWRcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgdGd0LCB0cSwgZmNwb3J0LT5sb29wX2lkLAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpLAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+cG9ydF9kb3duX3RpbWVyKSkpOworCisJCWZjcG9ydC0+dGd0X3F1ZXVlID0gdHE7CisJCWZjcG9ydC0+ZmxhZ3MgfD0gRkNGX1BFUlNJU1RFTlRfQk9VTkQ7CisJCXRxLT5mY3BvcnQgPSBmY3BvcnQ7CisJCXNldF9iaXQoVFFGX09OTElORSwgJnRxLT5mbGFncyk7CisJCXRxLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCX0KKworCWlmICh0Z3QgPT0gTUFYX1RBUkdFVFMpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIlVuYWJsZSB0byBiaW5kIGZjcG9ydCwgbG9vcF9pZD0leFxuIiwgZmNwb3J0LT5sb29wX2lkKTsKKwl9CisKKwlyZXR1cm4gKHRndCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2ZjbHVuX2JpbmQKKyAqCUJpbmRzIGFsbCBGQyBkZXZpY2UgTFVOUyB0byBPUyBMVU5TLgorICoKKyAqIElucHV0OgorICoJaGE6CQlhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglmY3BvcnQ6CQlGQyBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKgl0YXJnZXQgbnVtYmVyCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgb3NfbHVuX3QgKgorcWxhMngwMF9mY2x1bl9iaW5kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGZjX3BvcnRfdCAqZmNwb3J0LCBmY19sdW5fdCAqZmNsdW4pCit7CisJb3NfbHVuX3QJKmxxOworCXVpbnQxNl90CXRndDsKKwl1aW50MTZfdAlsdW47CisKKwl0Z3QgPSBmY3BvcnQtPm9zX3RhcmdldF9pZDsKKwlsdW4gPSBmY2x1bi0+bHVuOworCisJLyogQWxsb2NhdGUgTFVOcyAqLworCWlmIChsdW4gPj0gTUFYX0xVTlMpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gYmluZCBsdW4sIGludmFsaWQgIgorCQkgICAgImx1bj0oJXgpLlxuIiwgaGEtPmhvc3Rfbm8sIGx1bikpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIEFsd2F5cyBhbGxvYyBMVU4gMCBzbyBrZXJuZWwgd2lsbCBzY2FuIHBhc3QgTFVOIDAuICovCisJaWYgKGx1biAhPSAwICYmIChFWFRfSVNfTFVOX0JJVF9TRVQoJihmY3BvcnQtPmx1bl9tYXNrKSwgbHVuKSkpIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlpZiAoKGxxID0gcWxhMngwMF9sdW5fYWxsb2MoaGEsIHRndCwgbHVuKSkgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiVW5hYmxlIHRvIGJpbmQgZmNsdW4sIGxvb3BfaWQ9JXggbHVuPSV4XG4iLAorCQkgICAgZmNwb3J0LT5sb29wX2lkLCBsdW4pOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWxxLT5mY2x1biA9IGZjbHVuOworCisJcmV0dXJuIChscSk7Cit9CisKKy8qCisgKiBxbGEyeDAwX3RndF9hbGxvYworICoJQWxsb2NhdGUgYW5kIHByZS1pbml0aWFsaXplIHRhcmdldCBxdWV1ZS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJdCA9IFNDU0kgdGFyZ2V0IG51bWJlci4KKyAqCisgKiBSZXR1cm5zOgorICoJTlVMTCA9IGZhaWx1cmUKKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBvc190Z3RfdCAqCitxbGEyeDAwX3RndF9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCB0Z3QpIAoreworCW9zX3RndF90CSp0cTsKKworCS8qCisJICogSWYgU0NTSSBhZGRyZXNzaW5nIE9LLCBhbGxvY2F0ZSBUR1QgcXVldWUgYW5kIGxvY2suCisJICovCisJaWYgKHRndCA+PSBNQVhfVEFSR0VUUykgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byBhbGxvY2F0ZSB0YXJnZXQsIGludmFsaWQgIgorCQkgICAgInRhcmdldCBudW1iZXIgJWQuXG4iLCBoYS0+aG9zdF9ubywgdGd0KSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJdHEgPSBUR1RfUShoYSwgdGd0KTsKKwlpZiAodHEgPT0gTlVMTCkgeworCQl0cSA9IGttYWxsb2Moc2l6ZW9mKG9zX3RndF90KSwgR0ZQX0FUT01JQyk7CisJCWlmICh0cSAhPSBOVUxMKSB7CisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFsbG9jIFRhcmdldCAlZCBAICVwXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCB0Z3QsIHRxKSk7CisKKwkJCW1lbXNldCh0cSwgMCwgc2l6ZW9mKG9zX3RndF90KSk7CisJCQl0cS0+aGEgPSBoYTsKKworCQkJVEdUX1EoaGEsIHRndCkgPSB0cTsKKwkJfQorCX0KKwlpZiAodHEgIT0gTlVMTCkgeworCQl0cS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudDsKKwl9IGVsc2UgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIHRhcmdldC5cbiIpOworCQloYS0+bWVtX2VycisrOworCX0KKworCXJldHVybiAodHEpOworfQorCisvKgorICogcWxhMngwMF90Z3RfZnJlZQorICoJRnJlZXMgdGFyZ2V0IGFuZCBMVU4gcXVldWVzLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgl0ID0gU0NTSSB0YXJnZXQgbnVtYmVyLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLwordm9pZAorcWxhMngwMF90Z3RfZnJlZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCB0Z3QpIAoreworCW9zX3RndF90CSp0cTsKKwl1aW50MTZfdAlsdW47CisKKwkvKgorCSAqIElmIFNDU0kgYWRkcmVzc2luZyBPSywgYWxsb2NhdGUgVEdUIHF1ZXVlIGFuZCBsb2NrLgorCSAqLworCWlmICh0Z3QgPj0gTUFYX1RBUkdFVFMpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gZGUtYWxsb2NhdGUgdGFyZ2V0LCAiCisJCSAgICAiaW52YWxpZCB0YXJnZXQgbnVtYmVyICVkLlxuIiwgaGEtPmhvc3Rfbm8sIHRndCkpOworCisJCXJldHVybjsKKwl9CisKKwl0cSA9IFRHVF9RKGhhLCB0Z3QpOworCWlmICh0cSAhPSBOVUxMKSB7CisJCVRHVF9RKGhhLCB0Z3QpID0gTlVMTDsKKworCQkvKiBGcmVlIExVTiBzdHJ1Y3R1cmVzLiAqLworCQlmb3IgKGx1biA9IDA7IGx1biA8IE1BWF9MVU5TOyBsdW4rKykKKwkJCXFsYTJ4MDBfbHVuX2ZyZWUoaGEsIHRndCwgbHVuKTsKKworCQlrZnJlZSh0cSk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogcWxhMngwMF9sdW5fYWxsb2MKKyAqCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIExVTiBxdWV1ZS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJdCA9IFNDU0kgdGFyZ2V0IG51bWJlci4KKyAqCWwgPSBMVU4gbnVtYmVyLgorICoKKyAqIFJldHVybnM6CisgKglOVUxMID0gZmFpbHVyZQorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIG9zX2x1bl90ICoKK3FsYTJ4MDBfbHVuX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IHRndCwgdWludDE2X3QgbHVuKSAKK3sKKwlvc19sdW5fdAkqbHE7CisKKwkvKgorCSAqIElmIFNDU0kgYWRkcmVzc2luZyBPSywgYWxsb2NhdGUgTFVOIHF1ZXVlLgorCSAqLworCWlmICh0Z3QgPj0gTUFYX1RBUkdFVFMgfHwgbHVuID49IE1BWF9MVU5TIHx8IFRHVF9RKGhhLCB0Z3QpID09IE5VTEwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gYWxsb2NhdGUgbHVuLCBpbnZhbGlkICIKKwkJICAgICJwYXJhbWV0ZXIuXG4iLCBoYS0+aG9zdF9ubykpOworCisJCXJldHVybiAoTlVMTCk7CisJfQorCisJbHEgPSBMVU5fUShoYSwgdGd0LCBsdW4pOworCWlmIChscSA9PSBOVUxMKSB7CisJCWxxID0ga21hbGxvYyhzaXplb2Yob3NfbHVuX3QpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGxxICE9IE5VTEwpIHsKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQWxsb2MgTHVuICVkIEAgdGd0ICVkLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgbHVuLCB0Z3QpKTsKKworCQkJbWVtc2V0KGxxLCAwLCBzaXplb2Yob3NfbHVuX3QpKTsKKwkJCUxVTl9RKGhhLCB0Z3QsIGx1bikgPSBscTsKKworCQkJLyoKKwkJCSAqIFRoZSBmb2xsb3dpbmcgbHVuIHF1ZXVlIGluaXRpYWxpemF0aW9uIGNvZGUKKwkJCSAqIG11c3QgYmUgZHVwbGljYXRlZCBpbiBhbGxvY19pb2N0bF9tZW0gZnVuY3Rpb24KKwkJCSAqIGZvciBpb2N0bF9scS4KKwkJCSAqLworCQkJbHEtPnFfc3RhdGUgPSBMVU5fU1RBVEVfUkVBRFk7CisJCQlzcGluX2xvY2tfaW5pdCgmbHEtPnFfbG9jayk7CisJCX0KKwl9CisKKwlpZiAobHEgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gYWxsb2NhdGUgbHVuLlxuIik7CisJfQorCisJcmV0dXJuIChscSk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2x1bl9mcmVlCisgKglGcmVlcyBMVU4gcXVldWUuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCXQgPSBTQ1NJIHRhcmdldCBudW1iZXIuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9sdW5fZnJlZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCB0Z3QsIHVpbnQxNl90IGx1bikgCit7CisJb3NfbHVuX3QJKmxxOworCisJLyoKKwkgKiBJZiBTQ1NJIGFkZHJlc3NpbmcgT0ssIGFsbG9jYXRlIFRHVCBxdWV1ZSBhbmQgbG9jay4KKwkgKi8KKwlpZiAodGd0ID49IE1BWF9UQVJHRVRTIHx8IGx1biA+PSBNQVhfTFVOUykgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byBkZWFsbG9jYXRlIGx1biwgaW52YWxpZCAiCisJCSAgICAicGFyYW1ldGVyLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKFRHVF9RKGhhLCB0Z3QpICE9IE5VTEwgJiYgKGxxID0gTFVOX1EoaGEsIHRndCwgbHVuKSkgIT0gTlVMTCkgeworCQlMVU5fUShoYSwgdGd0LCBsdW4pID0gTlVMTDsKKwkJa2ZyZWUobHEpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyogIHFsYTJ4MDBfYWJvcnRfaXNwCisqICAgICAgUmVzZXRzIElTUCBhbmQgYWJvcnRzIGFsbCBvdXRzdGFuZGluZyBjb21tYW5kcy4KKyoKKyogSW5wdXQ6CisqICAgICAgaGEgICAgICAgICAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorKgorKiBSZXR1cm5zOgorKiAgICAgIDAgPSBzdWNjZXNzCisqLworaW50CitxbGEyeDAwX2Fib3J0X2lzcChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXVpbnQxNl90ICAgICAgIGNudDsKKwlzcmJfdCAgICAgICAgICAqc3A7CisJdWludDhfdCAgICAgICAgc3RhdHVzID0gMDsKKworCWlmIChoYS0+ZmxhZ3Mub25saW5lKSB7CisJCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCQljbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlxbGEyeDAwX3N0YXRzLmlzcEFib3J0Kys7CisJCWhhLT50b3RhbF9pc3BfYWJvcnRzKys7ICAvKiB1c2VkIGJ5IGlvY3RsICovCisJCWhhLT5zbnNfcmV0cnlfY250ID0gMDsKKworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiUGVyZm9ybWluZyBJU1AgZXJyb3IgcmVjb3ZlcnkgLSBoYT0gJXAuXG4iLCBoYSk7CisJCXFsYTJ4MDBfcmVzZXRfY2hpcChoYSk7CisKKwkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCQl9IGVsc2UgeworCQkJaWYgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikpCisJCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwKKwkJCQkgICAgTE9PUF9ET1dOX1RJTUUpOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCS8qIFJlcXVldWUgYWxsIGNvbW1hbmRzIGluIG91dHN0YW5kaW5nIGNvbW1hbmQgbGlzdC4gKi8KKwkJZm9yIChjbnQgPSAxOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKSB7CisJCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF07CisJCQlpZiAoc3ApIHsKKwkJCQloYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdID0gTlVMTDsKKwkJCQlpZiAoaGEtPmFjdHRocmVhZHMpCisJCQkJCWhhLT5hY3R0aHJlYWRzLS07CisJCQkJc3AtPmx1bl9xdWV1ZS0+b3V0X2NudC0tOworCisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGNtZCBob3N0X2J5dGUgc3RhdHVzIGRlcGVuZGluZyBvbgorCQkJCSAqIHdoZXRoZXIgdGhlIHNjc2lfZXJyb3JfaGFuZGxlciBpcworCQkJCSAqIGFjdGl2ZSBvciBub3QuCisgCQkJCSAqLworCQkJCWlmIChzcC0+ZmxhZ3MgJiBTUkJfVEFQRSkgeworCQkJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaGEtPmhvc3QtPmVoX2FjdGl2ZSAhPSBFSF9BQ1RJVkUpCisJCQkJCQlzcC0+Y21kLT5yZXN1bHQgPQorCQkJCQkJICAgIERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCQkJZWxzZQorCQkJCQkJc3AtPmNtZC0+cmVzdWx0ID0KKwkJCQkJCSAgICBESURfUkVTRVQgPDwgMTY7CisJCQkJfQorCQkJCXNwLT5mbGFncyA9IDA7CisJCQkJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKKwkJCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkJcWxhMngwMF9udnJhbV9jb25maWcoaGEpOworCisJCWlmICghcWxhMngwMF9yZXN0YXJ0X2lzcChoYSkpIHsKKwkJCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkJCWlmICghYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpKSB7CisJCQkJLyoKKwkJCQkgKiBJc3N1ZSBtYXJrZXIgY29tbWFuZCBvbmx5IHdoZW4gd2UgYXJlIGdvaW5nCisJCQkJICogdG8gc3RhcnQgdGhlIEkvTyAuCisJCQkJICovCisJCQkJaGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCQkJfQorCisJCQloYS0+ZmxhZ3Mub25saW5lID0gMTsKKworCQkJLyogRW5hYmxlIElTUCBpbnRlcnJ1cHRzLiAqLworCQkJcWxhMngwMF9lbmFibGVfaW50cnMoaGEpOworCisJCQkvKiB2Mi4xOS41YjYgUmV0dXJuIGFsbCBjb21tYW5kcyAqLworCQkJcWxhMngwMF9hYm9ydF9xdWV1ZXMoaGEsIDEpOworCisJCQkvKiBSZXN0YXJ0IHF1ZXVlcyB0aGF0IG1heSBoYXZlIGJlZW4gc3RvcHBlZC4gKi8KKwkJCXFsYTJ4MDBfcmVzdGFydF9xdWV1ZXMoaGEsIDEpOworCQkJaGEtPmlzcF9hYm9ydF9jbnQgPSAwOyAKKwkJCWNsZWFyX2JpdChJU1BfQUJPUlRfUkVUUlksICZoYS0+ZHBjX2ZsYWdzKTsKKwkJfSBlbHNlIHsJLyogZmFpbGVkIHRoZSBJU1AgYWJvcnQgKi8KKwkJCWhhLT5mbGFncy5vbmxpbmUgPSAxOworCQkJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQkJaWYgKGhhLT5pc3BfYWJvcnRfY250ID09IDApIHsKKyAJCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlcnkgZmFpbGVkIC0gIgorCQkJCQkgICAgImJvYXJkIGRpc2FibGVkXG4iKTsKKwkJCQkJLyogCisJCQkJCSAqIFRoZSBuZXh0IGNhbGwgZGlzYWJsZXMgdGhlIGJvYXJkCisJCQkJCSAqIGNvbXBsZXRlbHkuCisJCQkJCSAqLworCQkJCQlxbGEyeDAwX3Jlc2V0X2FkYXB0ZXIoaGEpOworCQkJCQlxbGEyeDAwX2Fib3J0X3F1ZXVlcyhoYSwgMCk7CisJCQkJCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCQkJCQljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLAorCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpOworCQkJCQlzdGF0dXMgPSAwOworCQkJCX0gZWxzZSB7IC8qIHNjaGVkdWxlIGFub3RoZXIgSVNQIGFib3J0ICovCisJCQkJCWhhLT5pc3BfYWJvcnRfY250LS07CisJCQkJCURFQlVHKHByaW50aygicWxhJWxkOiBJU1AgYWJvcnQgLSAiCisJCQkJCSAgICAicmV0cnkgcmVtYWlubmluZyAlZFxuIiwKKwkJCQkJICAgIGhhLT5ob3N0X25vLCBoYS0+aXNwX2Fib3J0X2NudCk7KQorCQkJCQlzdGF0dXMgPSAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaGEtPmlzcF9hYm9ydF9jbnQgPSBNQVhfUkVUUklFU19PRl9JU1BfQUJPUlQ7CisJCQkJREVCVUcocHJpbnRrKCJxbGEyeDAwKCVsZCk6IElTUCBlcnJvciByZWNvdmVyeSAiCisJCQkJICAgICItIHJldHJ5aW5nICglZCkgbW9yZSB0aW1lc1xuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5pc3BfYWJvcnRfY250KTspCisJCQkJc2V0X2JpdChJU1BfQUJPUlRfUkVUUlksICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQlzdGF0dXMgPSAxOworCQkJfQorCQl9CisJCSAgICAgICAKKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSJxbGEyeDAwX2Fib3J0X2lzcDogKioqKiBGQUlMRUQgKioqKlxuIik7CisJfSBlbHNlIHsKKwkJREVCVUcocHJpbnRrKEtFUk5fSU5GTworCQkJCSJxbGEyeDAwX2Fib3J0X2lzcCglbGQpOiBleGl0aW5nLlxuIiwKKwkJCQloYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybihzdGF0dXMpOworfQorCisvKgorKiAgcWxhMngwMF9yZXN0YXJ0X2lzcAorKiAgICAgIHJlc3RhcnRzIHRoZSBJU1AgYWZ0ZXIgYSByZXNldAorKgorKiBJbnB1dDoKKyogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyoKKyogUmV0dXJuczoKKyogICAgICAwID0gc3VjY2VzcworKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfcmVzdGFydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50OF90CQlzdGF0dXMgPSAwOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCXVpbnQzMl90IHdhaXRfdGltZTsKKworCS8qIElmIGZpcm13YXJlIG5lZWRzIHRvIGJlIGxvYWRlZCAqLworCWlmIChxbGEyeDAwX2lzcF9maXJtd2FyZShoYSkpIHsKKwkJaGEtPmZsYWdzLm9ubGluZSA9IDA7CisJCWlmICghKHN0YXR1cyA9IHFsYTJ4MDBfY2hpcF9kaWFnKGhhKSkpIHsKKwkJCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQkJCXN0YXR1cyA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCQlyZWcgPSBoYS0+aW9iYXNlOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCQkJLyogRGlzYWJsZSBTUkFNLCBJbnN0cnVjdGlvbiBSQU0gYW5kIEdQIFJBTSBwYXJpdHkuICovCisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgKEhDQ1JfRU5BQkxFX1BBUklUWSArIDB4MCkpOworCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQorCQkJc3RhdHVzID0gcWxhMngwMF9zZXR1cF9jaGlwKGhhKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisgCisgCQkJLyogRW5hYmxlIHByb3BlciBwYXJpdHkgKi8KKyAJCQlpZiAoSVNfUUxBMjMwMChoYSkpCisgCQkJCS8qIFNSQU0gcGFyaXR5ICovCisgCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLAorIAkJCQkgICAgKEhDQ1JfRU5BQkxFX1BBUklUWSArIDB4MSkpOworIAkJCWVsc2UKKyAJCQkJLyogU1JBTSwgSW5zdHJ1Y3Rpb24gUkFNIGFuZCBHUCBSQU0gcGFyaXR5ICovCisgCQkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLAorIAkJCQkgICAgKEhDQ1JfRU5BQkxFX1BBUklUWSArIDB4NykpOworCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CS8qIFBDSSBQb3N0aW5nLiAqLworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQl9CisJfQorCisgZG9uZToKKwlpZiAoIXN0YXR1cyAmJiAhKHN0YXR1cyA9IHFsYTJ4MDBfaW5pdF9yaW5ncyhoYSkpKSB7CisJCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWlmICghKHN0YXR1cyA9IHFsYTJ4MDBfZndfcmVhZHkoaGEpKSkgeworCQkJREVCVUcocHJpbnRrKCIlcygpOiBTdGFydCBjb25maWd1cmUgbG9vcCwgIgorCQkJCQkic3RhdHVzID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlzdGF0dXMpOykKKwkJCWhhLT5mbGFncy5vbmxpbmUgPSAxOworCQkJLyogV2FpdCBhdCBtb3N0IE1BWF9UQVJHRVQgUlNDTnMgZm9yIGEgc3RhYmxlIGxpbmsuICovCisJCQl3YWl0X3RpbWUgPSAyNTY7CisJCQlkbyB7CisJCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCXFsYTJ4MDBfY29uZmlndXJlX2xvb3AoaGEpOworCQkJCXdhaXRfdGltZS0tOworCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgorCQkJCSEodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSAmJgorCQkJCXdhaXRfdGltZSAmJgorCQkJCSh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkpOworCQl9CisKKwkJLyogaWYgbm8gY2FibGUgdGhlbiBhc3N1bWUgaXQncyBnb29kICovCisJCWlmICgoaGEtPmRldmljZV9mbGFncyAmIERGTEdfTk9fQ0FCTEUpKSAKKwkJCXN0YXR1cyA9IDA7CisKKwkJREVCVUcocHJpbnRrKCIlcygpOiBDb25maWd1cmUgbG9vcCBkb25lLCBzdGF0dXMgPSAweCV4XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0YXR1cyk7KQorCX0KKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisqIHFsYTJ4MDBfcmVzZXRfYWRhcHRlcgorKiAgICAgIFJlc2V0IGFkYXB0ZXIuCisqCisqIElucHV0OgorKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX3Jlc2V0X2FkYXB0ZXIoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCXFsYTJ4MDBfZGlzYWJsZV9pbnRycyhoYSk7CisKKwkvKiBSZXNldCBSSVNDIHByb2Nlc3Nvci4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsJCQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRUxFQVNFX1JJU0MpOworCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwkJCS8qIFBDSSBQb3N0aW5nLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaApAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MTZfdCBxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKHZvbGF0aWxlIHVpbnQxNl90IF9faW9tZW0gKik7CisvKgorICogcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcgorICogICAgICBEZWJvdW5jZSByZWdpc3Rlci4KKyAqCisgKiBJbnB1dDoKKyAqICAgICAgcG9ydCA9IHJlZ2lzdGVyIGFkZHJlc3MuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgcmVnaXN0ZXIgdmFsdWUuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVpbnQxNl90CitxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKHZvbGF0aWxlIHVpbnQxNl90IF9faW9tZW0gKmFkZHIpIAoreworCXZvbGF0aWxlIHVpbnQxNl90IGZpcnN0OworCXZvbGF0aWxlIHVpbnQxNl90IHNlY29uZDsKKworCWRvIHsKKwkJZmlyc3QgPSBSRF9SRUdfV09SRChhZGRyKTsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwkJc2Vjb25kID0gUkRfUkVHX1dPUkQoYWRkcik7CisJfSB3aGlsZSAoZmlyc3QgIT0gc2Vjb25kKTsKKworCXJldHVybiAoZmlyc3QpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcWxhMngwMF9ub3JtYWxpemVfZG1hX2FkZHIoCisgICAgZG1hX2FkZHJfdCAqZV9hZGRyLCAgdWludDMyX3QgKmVfbGVuLAorICAgIGRtYV9hZGRyX3QgKm5lX2FkZHIsIHVpbnQzMl90ICpuZV9sZW4pOworCisvKioKKyAqIHFsYTJ4MDBfbm9ybWFsaXplX2RtYV9hZGRyKCkgLSBOb3JtYWxpemUgYW4gRE1BIGFkZHJlc3MuCisgKiBAZV9hZGRyOiBSYXcgRE1BIGFkZHJlc3MKKyAqIEBlX2xlbjogUmF3IERNQSBsZW5ndGgKKyAqIEBuZV9hZGRyOiBOb3JtYWxpemVkIHNlY29uZCBETUEgYWRkcmVzcworICogQG5lX2xlbjogTm9ybWFsaXplZCBzZWNvbmQgRE1BIGxlbmd0aAorICoKKyAqIElmIHRoZSBhZGRyZXNzIGRvZXMgbm90IHNwYW4gYSA0R0IgcGFnZSBib3VuZGFyeSwgdGhlIGNvbnRlbnRzIG9mIEBuZV9hZGRyCisgKiBhbmQgQG5lX2xlbiBhcmUgdW5kZWZpbmVkLiAgQGVfbGVuIGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCBhIG5vcm1hbGl6YXRpb24uCisgKgorICogRXhhbXBsZToKKyAqCisgKiAJZmZmZmFiYzBmZmZmZWVlZQkoZV9hZGRyKSBzdGFydCBvZiBETUEgYWRkcmVzcworICogCTAwMDAwMDAwMjAwMDAwMDAJKGVfbGVuKSAgbGVuZ3RoIG9mIERNQSB0cmFuc2ZlcgorICoJZmZmZmFiYzExZmZmZWVlZAllbmQgb2YgRE1BIHRyYW5zZmVyCisgKgorICogSXMgdGhlIDRHQiBib3VuZGFyeSBjcm9zc2VkPworICoKKyAqIAlmZmZmYWJjMGZmZmZlZWVlCShlX2FkZHIpCisgKglmZmZmYWJjMTFmZmZlZWVkCShlX2FkZHIgKyBlX2xlbiAtIDEpCisgKgkwMDAwMDAwMWUwMDAwMDAzCSgoZV9hZGRyIF4gKGVfYWRkciArIGVfbGVuIC0gMSkpCisgKgkwMDAwMDAwMTAwMDAwMDAwCSgoZV9hZGRyIF4gKGVfYWRkciArIGVfbGVuIC0gMSkpICYgfigweGZmZmZmZmZmKQorICoKKyAqIENvbXB1dGUgc3RhcnQgb2Ygc2Vjb25kIERNQSBzZWdtZW50OgorICoKKyAqIAlmZmZmYWJjMGZmZmZlZWVlCShlX2FkZHIpCisgKglmZmZmYWJjMWZmZmZlZWVlCSgweDEwMDAwMDAwMCArIGVfYWRkcikKKyAqCWZmZmZhYmMxMDAwMDAwMDAJKDB4MTAwMDAwMDAwICsgZV9hZGRyKSAmIH4oMHhmZmZmZmZmZikKKyAqCWZmZmZhYmMxMDAwMDAwMDAJKG5lX2FkZHIpCisgKgkKKyAqIENvbXB1dGUgbGVuZ3RoIG9mIHNlY29uZCBETUEgc2VnbWVudDoKKyAqCisgKgkwMDAwMDAwMGZmZmZlZWVlCShlX2FkZHIgJiAweGZmZmZmZmZmKQorICoJMDAwMDAwMDAwMDAwMTExMgkoMHgxMDAwMDAwMDAgLSAoZV9hZGRyICYgMHhmZmZmZmZmZikpCisgKgkwMDAwMDAwMDFmZmZlZWVlCShlX2xlbiAtICgweDEwMDAwMDAwMCAtIChlX2FkZHIgJiAweGZmZmZmZmZmKSkKKyAqCTAwMDAwMDAwMWZmZmVlZWUJKG5lX2xlbikKKyAqCisgKiBBZGp1c3QgbGVuZ3RoIG9mIGZpcnN0IERNQSBzZWdtZW50CisgKgorICogCTAwMDAwMDAwMjAwMDAwMDAJKGVfbGVuKQorICoJMDAwMDAwMDAwMDAwMTExMgkoZV9sZW4gLSBuZV9sZW4pCisgKgkwMDAwMDAwMDAwMDAxMTEyCShlX2xlbikKKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3YXMgbm9ybWFsaXplZCwgZWxzZSB6ZXJvLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3FsYTJ4MDBfbm9ybWFsaXplX2RtYV9hZGRyKAorICAgIGRtYV9hZGRyX3QgKmVfYWRkciwgIHVpbnQzMl90ICplX2xlbiwKKyAgICBkbWFfYWRkcl90ICpuZV9hZGRyLCB1aW50MzJfdCAqbmVfbGVuKQoreworCWludCBub3JtYWxpemVkOworCisJbm9ybWFsaXplZCA9IDA7CisJaWYgKCgqZV9hZGRyIF4gKCplX2FkZHIgKyAqZV9sZW4gLSAxKSkgJiB+KDB4RkZGRkZGRkZVTEwpKSB7CisJCS8qIENvbXB1dGUgbm9ybWFsaXplZCBjcm9zc2VkIGFkZHJlc3MgYW5kIGxlbiAqLworCQkqbmVfYWRkciA9ICgweDEwMDAwMDAwMFVMTCArICplX2FkZHIpICYgfigweEZGRkZGRkZGVUxMKTsKKwkJKm5lX2xlbiA9ICplX2xlbiAtICgweDEwMDAwMDAwMFVMTCAtICgqZV9hZGRyICYgMHhGRkZGRkZGRlVMTCkpOworCQkqZV9sZW4gLT0gKm5lX2xlbjsKKworCQlub3JtYWxpemVkKys7CisJfQorCXJldHVybiAobm9ybWFsaXplZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9wb2xsKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3FsYTJ4MDBfcG9sbChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkKKwkJcWxhMjEwMF9pbnRyX2hhbmRsZXIoMCwgaGEsIE5VTEwpOworCWVsc2UKKwkJcWxhMjMwMF9pbnRyX2hhbmRsZXIoMCwgaGEsIE5VTEwpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9lbmFibGVfaW50cnMoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX2Rpc2FibGVfaW50cnMoc2NzaV9xbGFfaG9zdF90ICopOworCitzdGF0aWMgaW5saW5lIHZvaWQgCitxbGEyeDAwX2VuYWJsZV9pbnRycyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJaGEtPmludGVycnVwdHNfb24gPSAxOworCS8qIGVuYWJsZSByaXNjIGFuZCBob3N0IGludGVycnVwdHMgKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIElDUl9FTl9JTlQgfCBJQ1JfRU5fUklTQyk7CisJUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorcWxhMngwMF9kaXNhYmxlX2ludHJzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwloYS0+aW50ZXJydXB0c19vbiA9IDA7CisJLyogZGlzYWJsZSByaXNjIGFuZCBob3N0IGludGVycnVwdHMgKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+aWN0cmwsIDApOworCVJEX1JFR19XT1JEKCZyZWctPmljdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBxbGEyeDAwX2lzX3d3bl96ZXJvKHVpbnQ4X3QgKik7CisKKy8qCisgKiBxbGEyeDAwX2lzX3d3bl96ZXJvIC0gQ2hlY2sgZm9yIHplcm8gbm9kZSBuYW1lCisgKgorICogSW5wdXQ6CisgKiAgICAgIHd3biA9IFBvaW50ZXIgdG8gV1cgbmFtZSB0byBjaGVjaworICoKKyAqIFJldHVybnM6CisgKiAgICAgIDEgaWYgbmFtZSBpcyAweDAwIGVsc2UgMAorICoKKyAqIENvbnRleHQ6CisgKiAgICAgIEtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3FsYTJ4MDBfaXNfd3duX3plcm8odWludDhfdCAqd3duKQoreworCWludCBjbnQ7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IFdXTl9TSVpFIDsgY250KyssIHd3bisrKSB7CisJCWlmICgqd3duICE9IDApCisJCQlicmVhazsKKwl9CisJLyogaWYgemVybyByZXR1cm4gMSAqLworCWlmIChjbnQgPT0gV1dOX1NJWkUpCisJCXJldHVybiAoMSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50OF90CitxbGEyeDAwX3N1c3BlbmRfbHVuKHNjc2lfcWxhX2hvc3RfdCAqLCBvc19sdW5fdCAqLCBpbnQsIGludCk7CitzdGF0aWMgX19pbmxpbmVfXyB1aW50OF90CitxbGEyeDAwX2RlbGF5X2x1bihzY3NpX3FsYV9ob3N0X3QgKiwgb3NfbHVuX3QgKiwgaW50KTsKKworc3RhdGljIF9faW5saW5lX18gdWludDhfdAorcWxhMngwMF9zdXNwZW5kX2x1bihzY3NpX3FsYV9ob3N0X3QgKmhhLCBvc19sdW5fdCAqbHEsIGludCB0aW1lLCBpbnQgY291bnQpCit7CisJcmV0dXJuIChfX3FsYTJ4MDBfc3VzcGVuZF9sdW4oaGEsIGxxLCB0aW1lLCBjb3VudCwgMCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50OF90CitxbGEyeDAwX2RlbGF5X2x1bihzY3NpX3FsYV9ob3N0X3QgKmhhLCBvc19sdW5fdCAqbHEsIGludCB0aW1lKQoreworCXJldHVybiAoX19xbGEyeDAwX3N1c3BlbmRfbHVuKGhhLCBscSwgdGltZSwgMSwgMSkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfY2hlY2tfZmFicmljX2RldmljZXMoc2NzaV9xbGFfaG9zdF90ICopOworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHdhaXQgZm9yIGZhYnJpYyBkZXZpY2VzIGZvcgorICogdGhlIHJlc2V0IGRlbGF5LgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfY2hlY2tfZmFicmljX2RldmljZXMoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJdWludDE2X3QJZndfc3RhdGU7CisKKwlxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZShoYSwgJmZ3X3N0YXRlKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2lzc3VlX21hcmtlcigpIC0gSXNzdWUgYSBNYXJrZXIgSU9DQiBpZiBuZWNlc3NhcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBoYV9sb2NrZWQ6IGlzIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBoYXJkd2FyZSBsb2NrCisgKgorICogUmV0dXJucyBub24temVybyBpZiBhIGZhaWx1cmUgb2NjdXJlZCwgZWxzZSB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIGludAorcWxhMngwMF9pc3N1ZV9tYXJrZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IGhhX2xvY2tlZCkKK3sKKwkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLworCWlmIChoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7CisJCWlmIChoYV9sb2NrZWQpIHsKKwkJCWlmIChfX3FsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KKwkJCSAgICBRTEFfU1VDQ0VTUykKKwkJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCQl9IGVsc2UgeworCQkJaWYgKHFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KKwkJCSAgICBRTEFfU1VDQ0VTUykKKwkJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCQl9CisJCWhhLT5tYXJrZXJfbmVlZGVkID0gMDsKKwl9CisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9hZGRfdGltZXJfdG9fY21kKHNyYl90ICosIGludCk7CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHFsYTJ4MDBfZGVsZXRlX3RpbWVyX2Zyb21fY21kKHNyYl90ICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBxbGEyeDAwX2FkZF90aW1lcl90b19jbWQKKyoKKyogRGVzY3JpcHRpb246CisqICAgICAgIENyZWF0ZXMgYSB0aW1lciBmb3IgdGhlIHNwZWNpZmllZCBjb21tYW5kLiBUaGUgdGltZW91dCBpcyB1c3VhbGx5CisqICAgICAgIHRoZSBjb21tYW5kIHRpbWUgZnJvbSBrZXJuZWwgbWludXMgMiBzZWNzLgorKgorKiBJbnB1dDoKKyogICAgIHNwIC0gcG9pbnRlciB0byB2YWxpZGF0ZQorKgorKiBSZXR1cm5zOgorKiAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkCitxbGEyeDAwX2FkZF90aW1lcl90b19jbWQoc3JiX3QgKnNwLCBpbnQgdGltZW91dCkKK3sKKwlpbml0X3RpbWVyKCZzcC0+dGltZXIpOworCXNwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQgKiBIWjsKKwlzcC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKwlzcC0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikgKHVuc2lnbmVkIGxvbmcpKXFsYTJ4MDBfY21kX3RpbWVvdXQ7CisJYWRkX3RpbWVyKCZzcC0+dGltZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBxbGEyeDAwX2RlbGV0ZV90aW1lcl9mcm9tX2NtZAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgICAgRGVsZXRlIHRoZSB0aW1lciBmb3IgdGhlIHNwZWNpZmllZCBjb21tYW5kLgorKgorKiBJbnB1dDoKKyogICAgIHNwIC0gcG9pbnRlciB0byB2YWxpZGF0ZQorKgorKiBSZXR1cm5zOgorKiAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIAorcWxhMngwMF9kZWxldGVfdGltZXJfZnJvbV9jbWQoc3JiX3QgKnNwKQoreworCWlmIChzcC0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCkgeworCQlkZWxfdGltZXIoJnNwLT50aW1lcik7CisJCXNwLT50aW1lci5mdW5jdGlvbiA9ICBOVUxMOworCQlzcC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBOVUxMOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwNjYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKQEAgLTAsMCArMSw2MzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitzdGF0aWMgaW5saW5lIGNvbnRfZW50cnlfdCAqcWxhMngwMF9wcmVwX2NvbnRfdHlwZTBfaW9jYihzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW5saW5lIGNvbnRfYTY0X2VudHJ5X3QgKnFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIHJlcXVlc3RfdCAqcWxhMngwMF9yZXFfcGt0KHNjc2lfcWxhX2hvc3RfdCAqaGEpOworCisvKioKKyAqIHFsYTJ4MDBfZ2V0X2NtZF9kaXJlY3Rpb24oKSAtIERldGVybWluZSBjb250cm9sX2ZsYWcgZGF0YSBkaXJlY3Rpb24uCisgKiBAY21kOiBTQ1NJIGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zIHRoZSBwcm9wZXIgQ0ZfKiBkaXJlY3Rpb24gYmFzZWQgb24gQ0RCLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQxNl90CitxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl1aW50MTZfdCBjZmxhZ3M7CisKKwljZmxhZ3MgPSAwOworCisJLyogU2V0IHRyYW5zZmVyIGRpcmVjdGlvbiAqLworCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCWNmbGFncyA9IENGX1dSSVRFOworCWVsc2UgaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQorCQljZmxhZ3MgPSBDRl9SRUFEOworCXJldHVybiAoY2ZsYWdzKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2NhbGNfaW9jYnNfMzIoKSAtIERldGVybWluZSBudW1iZXIgb2YgQ29tbWFuZCBUeXBlIDIgYW5kCisgKiBDb250aW51YXRpb24gVHlwZSAwIElPQ0JzIHRvIGFsbG9jYXRlLgorICoKKyAqIEBkc2RzOiBudW1iZXIgb2YgZGF0YSBzZWdtZW50IGRlY3JpcHRvcnMgbmVlZGVkCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIElPQ0IgZW50cmllcyBuZWVkZWQgdG8gc3RvcmUgQGRzZHMuCisgKi8KK3VpbnQxNl90CitxbGEyeDAwX2NhbGNfaW9jYnNfMzIodWludDE2X3QgZHNkcykKK3sKKwl1aW50MTZfdCBpb2NiczsKKworCWlvY2JzID0gMTsKKwlpZiAoZHNkcyA+IDMpIHsKKwkJaW9jYnMgKz0gKGRzZHMgLSAzKSAvIDc7CisJCWlmICgoZHNkcyAtIDMpICUgNykKKwkJCWlvY2JzKys7CisJfQorCXJldHVybiAoaW9jYnMpOworfQorCisvKioKKyAqIHFsYTJ4MDBfY2FsY19pb2Nic182NCgpIC0gRGV0ZXJtaW5lIG51bWJlciBvZiBDb21tYW5kIFR5cGUgMyBhbmQKKyAqIENvbnRpbnVhdGlvbiBUeXBlIDEgSU9DQnMgdG8gYWxsb2NhdGUuCisgKgorICogQGRzZHM6IG51bWJlciBvZiBkYXRhIHNlZ21lbnQgZGVjcmlwdG9ycyBuZWVkZWQKKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgSU9DQiBlbnRyaWVzIG5lZWRlZCB0byBzdG9yZSBAZHNkcy4KKyAqLwordWludDE2X3QKK3FsYTJ4MDBfY2FsY19pb2Nic182NCh1aW50MTZfdCBkc2RzKQoreworCXVpbnQxNl90IGlvY2JzOworCisJaW9jYnMgPSAxOworCWlmIChkc2RzID4gMikgeworCQlpb2NicyArPSAoZHNkcyAtIDIpIC8gNTsKKwkJaWYgKChkc2RzIC0gMikgJSA1KQorCQkJaW9jYnMrKzsKKwl9CisJcmV0dXJuIChpb2Nicyk7Cit9CisKKy8qKgorICogcWxhMngwMF9wcmVwX2NvbnRfdHlwZTBfaW9jYigpIC0gSW5pdGlhbGl6ZSBhIENvbnRpbnVhdGlvbiBUeXBlIDAgSU9DQi4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBDb250aW51YXRpb24gVHlwZSAwIElPQ0IgcGFja2V0LgorICovCitzdGF0aWMgaW5saW5lIGNvbnRfZW50cnlfdCAqCitxbGEyeDAwX3ByZXBfY29udF90eXBlMF9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJY29udF9lbnRyeV90ICpjb250X3BrdDsKKworCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLworCWhhLT5yZXFfcmluZ19pbmRleCsrOworCWlmIChoYS0+cmVxX3JpbmdfaW5kZXggPT0gaGEtPnJlcXVlc3RfcV9sZW5ndGgpIHsKKwkJaGEtPnJlcV9yaW5nX2luZGV4ID0gMDsKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIgPSBoYS0+cmVxdWVzdF9yaW5nOworCX0gZWxzZSB7CisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisJfQorCisJY29udF9wa3QgPSAoY29udF9lbnRyeV90ICopaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwkvKiBMb2FkIHBhY2tldCBkZWZhdWx0cy4gKi8KKwkqKCh1aW50MzJfdCAqKSgmY29udF9wa3QtPmVudHJ5X3R5cGUpKSA9CisJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQ09OVElOVUVfVFlQRSk7CisKKwlyZXR1cm4gKGNvbnRfcGt0KTsKK30KKworLyoqCisgKiBxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKCkgLSBJbml0aWFsaXplIGEgQ29udGludWF0aW9uIFR5cGUgMSBJT0NCLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbnRpbnVhdGlvbiB0eXBlIDEgSU9DQiBwYWNrZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgY29udF9hNjRfZW50cnlfdCAqCitxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJY29udF9hNjRfZW50cnlfdCAqY29udF9wa3Q7CisKKwkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KKwloYS0+cmVxX3JpbmdfaW5kZXgrKzsKKwlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7CisJCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7CisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwl9IGVsc2UgeworCQloYS0+cmVxdWVzdF9yaW5nX3B0cisrOworCX0KKworCWNvbnRfcGt0ID0gKGNvbnRfYTY0X2VudHJ5X3QgKiloYS0+cmVxdWVzdF9yaW5nX3B0cjsKKworCS8qIExvYWQgcGFja2V0IGRlZmF1bHRzLiAqLworCSooKHVpbnQzMl90ICopKCZjb250X3BrdC0+ZW50cnlfdHlwZSkpID0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihDT05USU5VRV9BNjRfVFlQRSk7CisKKwlyZXR1cm4gKGNvbnRfcGt0KTsKK30KKworLyoqCisgKiBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfMzIoKSAtIEJ1aWxkIElPQ0IgY29tbWFuZCB1dGlsaXppbmcgMzJiaXQKKyAqIGNhcGFibGUgSU9DQiB0eXBlcy4KKyAqCisgKiBAc3A6IFNSQiBjb21tYW5kIHRvIHByb2Nlc3MKKyAqIEBjbWRfcGt0OiBDb21tYW5kIHR5cGUgMiBJT0NCCisgKiBAdG90X2RzZHM6IFRvdGFsIG51bWJlciBvZiBzZWdtZW50cyB0byB0cmFuc2ZlcgorICovCit2b2lkIHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic18zMihzcmJfdCAqc3AsIGNtZF9lbnRyeV90ICpjbWRfcGt0LAorICAgIHVpbnQxNl90IHRvdF9kc2RzKQoreworCXVpbnQxNl90CWF2YWlsX2RzZHM7CisJdWludDMyX3QJKmN1cl9kc2Q7CisJc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwljbWQgPSBzcC0+Y21kOworCisJLyogVXBkYXRlIGVudHJ5IHR5cGUgdG8gaW5kaWNhdGUgQ29tbWFuZCBUeXBlIDIgSU9DQiAqLworCSooKHVpbnQzMl90ICopKCZjbWRfcGt0LT5lbnRyeV90eXBlKSkgPQorCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTMyKENPTU1BTkRfVFlQRSk7CisKKwkvKiBObyBkYXRhIHRyYW5zZmVyICovCisJaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuID09IDAgfHwgY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfTk9ORSkgeworCQljbWRfcGt0LT5ieXRlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKKwkJcmV0dXJuOworCX0KKworCWhhID0gc3AtPmhhOworCisJY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKGNtZCkpOworCisJLyogVGhyZWUgRFNEcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBDb21tYW5kIFR5cGUgMiBJT0NCICovCisJYXZhaWxfZHNkcyA9IDM7CisJY3VyX2RzZCA9ICh1aW50MzJfdCAqKSZjbWRfcGt0LT5kc2VnXzBfYWRkcmVzczsKKworCS8qIExvYWQgZGF0YSBzZWdtZW50cyAqLworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdAlzY2F0dGVybGlzdCAqY3VyX3NlZzsKKwkJc3RydWN0CXNjYXR0ZXJsaXN0ICplbmRfc2VnOworCisJCWN1cl9zZWcgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJZW5kX3NlZyA9IGN1cl9zZWcgKyB0b3RfZHNkczsKKwkJd2hpbGUgKGN1cl9zZWcgPCBlbmRfc2VnKSB7CisJCQljb250X2VudHJ5X3QJKmNvbnRfcGt0OworCisJCQkvKiBBbGxvY2F0ZSBhZGRpdGlvbmFsIGNvbnRpbnVhdGlvbiBwYWNrZXRzPyAqLworCQkJaWYgKGF2YWlsX2RzZHMgPT0gMCkgeworCQkJCS8qCisJCQkJICogU2V2ZW4gRFNEcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBDb250aW51YXRpb24KKwkJCQkgKiBUeXBlIDAgSU9DQi4KKwkJCQkgKi8KKwkJCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUwX2lvY2IoaGEpOworCQkJCWN1cl9kc2QgPSAodWludDMyX3QgKikmY29udF9wa3QtPmRzZWdfMF9hZGRyZXNzOworCQkJCWF2YWlsX2RzZHMgPSA3OworCQkJfQorCisJCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3MoY3VyX3NlZykpOworCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oY3VyX3NlZykpOworCQkJYXZhaWxfZHNkcy0tOworCisJCQljdXJfc2VnKys7CisJCX0KKwl9IGVsc2UgeworCQlkbWFfYWRkcl90CXJlcV9kbWE7CisJCXN0cnVjdCBwYWdlCSpwYWdlOworCQl1bnNpZ25lZCBsb25nCW9mZnNldDsKKworCQlwYWdlID0gdmlydF90b19wYWdlKGNtZC0+cmVxdWVzdF9idWZmZXIpOworCQlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpY21kLT5yZXF1ZXN0X2J1ZmZlciAmIH5QQUdFX01BU0spOworCQlyZXFfZG1hID0gcGNpX21hcF9wYWdlKGhhLT5wZGV2LCBwYWdlLCBvZmZzZXQsCisJCSAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJc3AtPmRtYV9oYW5kbGUgPSByZXFfZG1hOworCisJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihyZXFfZG1hKTsKKwkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9idWlsZF9zY3NpX2lvY2JzXzY0KCkgLSBCdWlsZCBJT0NCIGNvbW1hbmQgdXRpbGl6aW5nIDY0Yml0CisgKiBjYXBhYmxlIElPQ0IgdHlwZXMuCisgKgorICogQHNwOiBTUkIgY29tbWFuZCB0byBwcm9jZXNzCisgKiBAY21kX3BrdDogQ29tbWFuZCB0eXBlIDMgSU9DQgorICogQHRvdF9kc2RzOiBUb3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgdG8gdHJhbnNmZXIKKyAqLwordm9pZCBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfNjQoc3JiX3QgKnNwLCBjbWRfZW50cnlfdCAqY21kX3BrdCwKKyAgICB1aW50MTZfdCB0b3RfZHNkcykKK3sKKwl1aW50MTZfdAlhdmFpbF9kc2RzOworCXVpbnQzMl90CSpjdXJfZHNkOworCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJY21kID0gc3AtPmNtZDsKKworCS8qIFVwZGF0ZSBlbnRyeSB0eXBlIHRvIGluZGljYXRlIENvbW1hbmQgVHlwZSAzIElPQ0IgKi8KKwkqKCh1aW50MzJfdCAqKSgmY21kX3BrdC0+ZW50cnlfdHlwZSkpID0KKwkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihDT01NQU5EX0E2NF9UWVBFKTsKKworCS8qIE5vIGRhdGEgdHJhbnNmZXIgKi8KKwlpZiAoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPT0gMCB8fCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7CisJCWNtZF9wa3QtPmJ5dGVfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOworCQlyZXR1cm47CisJfQorCisJaGEgPSBzcC0+aGE7CisKKwljbWRfcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KHFsYTJ4MDBfZ2V0X2NtZF9kaXJlY3Rpb24oY21kKSk7CisKKwkvKiBUd28gRFNEcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBDb21tYW5kIFR5cGUgMyBJT0NCICovCisJYXZhaWxfZHNkcyA9IDI7CisJY3VyX2RzZCA9ICh1aW50MzJfdCAqKSZjbWRfcGt0LT5kc2VnXzBfYWRkcmVzczsKKworCS8qIExvYWQgZGF0YSBzZWdtZW50cyAqLworCWlmIChjbWQtPnVzZV9zZyAhPSAwKSB7CisJCXN0cnVjdAlzY2F0dGVybGlzdCAqY3VyX3NlZzsKKwkJc3RydWN0CXNjYXR0ZXJsaXN0ICplbmRfc2VnOworCisJCWN1cl9zZWcgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJZW5kX3NlZyA9IGN1cl9zZWcgKyB0b3RfZHNkczsKKwkJd2hpbGUgKGN1cl9zZWcgPCBlbmRfc2VnKSB7CisJCQlkbWFfYWRkcl90CXNsZV9kbWE7CisJCQljb250X2E2NF9lbnRyeV90ICpjb250X3BrdDsKKworCQkJLyogQWxsb2NhdGUgYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFja2V0cz8gKi8KKwkJCWlmIChhdmFpbF9kc2RzID09IDApIHsKKwkJCQkvKgorCQkJCSAqIEZpdmUgRFNEcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBDb250aW51YXRpb24KKwkJCQkgKiBUeXBlIDEgSU9DQi4KKwkJCQkgKi8KKwkJCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2IoaGEpOworCQkJCWN1cl9kc2QgPSAodWludDMyX3QgKiljb250X3BrdC0+ZHNlZ18wX2FkZHJlc3M7CisJCQkJYXZhaWxfZHNkcyA9IDU7CisJCQl9CisKKwkJCXNsZV9kbWEgPSBzZ19kbWFfYWRkcmVzcyhjdXJfc2VnKTsKKwkJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihMU0Qoc2xlX2RtYSkpOworCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKE1TRChzbGVfZG1hKSk7CisJCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihjdXJfc2VnKSk7CisJCQlhdmFpbF9kc2RzLS07CisKKwkJCWN1cl9zZWcrKzsKKwkJfQorCX0gZWxzZSB7CisJCWRtYV9hZGRyX3QJcmVxX2RtYTsKKwkJc3RydWN0IHBhZ2UJKnBhZ2U7CisJCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OworCisJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoY21kLT5yZXF1ZXN0X2J1ZmZlcik7CisJCW9mZnNldCA9ICgodW5zaWduZWQgbG9uZyljbWQtPnJlcXVlc3RfYnVmZmVyICYgflBBR0VfTUFTSyk7CisJCXJlcV9kbWEgPSBwY2lfbWFwX3BhZ2UoaGEtPnBkZXYsIHBhZ2UsIG9mZnNldCwKKwkJICAgIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlzcC0+ZG1hX2hhbmRsZSA9IHJlcV9kbWE7CisKKwkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKExTRChyZXFfZG1hKSk7CisJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihNU0QocmVxX2RtYSkpOworCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCX0KK30KKworLyoqCisgKiBxbGEyeDAwX3N0YXJ0X3Njc2koKSAtIFNlbmQgYSBTQ1NJIGNvbW1hbmQgdG8gdGhlIElTUAorICogQHNwOiBjb21tYW5kIHRvIHNlbmQgdG8gdGhlIElTUAorICoKKyAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VyZWQsIGVsc2UgemVyby4KKyAqLworaW50CitxbGEyeDAwX3N0YXJ0X3Njc2koc3JiX3QgKnNwKQoreworCWludAkJcmV0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzY3NpX3FsYV9ob3N0X3QJKmhhOworCWZjX2x1bl90CSpmY2x1bjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJdWludDMyX3QJKmNscl9wdHI7CisJdWludDMyX3QgICAgICAgIGluZGV4OworCXVpbnQzMl90CWhhbmRsZTsKKwljbWRfZW50cnlfdAkqY21kX3BrdDsKKwl1aW50MzJfdCAgICAgICAgdGltZW91dDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVpbnQxNl90CWNudDsKKwl1aW50MTZfdAlyZXFfY250OworCXVpbnQxNl90CXRvdF9kc2RzOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWc7CisJY2hhcgkJdGFnWzJdOworCisJLyogU2V0dXAgZGV2aWNlIHBvaW50ZXJzLiAqLworCXJldCA9IDA7CisJZmNsdW4gPSBzcC0+bHVuX3F1ZXVlLT5mY2x1bjsKKwloYSA9IGZjbHVuLT5mY3BvcnQtPmhhOworCXJlZyA9IGhhLT5pb2Jhc2U7CisJY21kID0gc3AtPmNtZDsKKworCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkICovCisJaWYgKGhhLT5tYXJrZXJfbmVlZGVkICE9IDApIHsKKwkJaWYgKHFsYTJ4MDBfbWFya2VyKGhhLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJCX0KKwkJaGEtPm1hcmtlcl9uZWVkZWQgPSAwOworCX0KKworCS8qIEFjcXVpcmUgcmluZyBzcGVjaWZpYyBsb2NrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBmb3Igcm9vbSBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCisJaGFuZGxlID0gaGEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kOworCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaW5kZXgrKykgeworCQloYW5kbGUrKzsKKwkJaWYgKGhhbmRsZSA9PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpCisJCQloYW5kbGUgPSAxOworCQlpZiAoaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpbmRleCA9PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpCisJCWdvdG8gcXVldWluZ19lcnJvcjsKKworCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlcXVlc3QgZW50cmllcyBuZWVkZWQuICovCisJcmVxX2NudCA9IChoYS0+Y2FsY19yZXF1ZXN0X2VudHJpZXMpKGNtZC0+cmVxdWVzdC0+bnJfaHdfc2VnbWVudHMpOworCWlmIChoYS0+cmVxX3FfY250IDwgKHJlcV9jbnQgKyAyKSkgeworCQljbnQgPSBSRF9SRUdfV09SRF9SRUxBWEVEKElTUF9SRVFfUV9PVVQoaGEsIHJlZykpOworCQlpZiAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQorCQkJaGEtPnJlcV9xX2NudCA9IGNudCAtIGhhLT5yZXFfcmluZ19pbmRleDsKKwkJZWxzZQorCQkJaGEtPnJlcV9xX2NudCA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoIC0KKwkJCSAgICAoaGEtPnJlcV9yaW5nX2luZGV4IC0gY250KTsKKwl9CisJaWYgKGhhLT5yZXFfcV9jbnQgPCAocmVxX2NudCArIDIpKQorCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CisKKwkvKiBGaW5hbGx5LCB3ZSBoYXZlIGVub3VnaCBzcGFjZSwgbm93IHBlcmZvcm0gbWFwcGluZ3MuICovCisJdG90X2RzZHMgPSAwOworCWlmIChjbWQtPnVzZV9zZykgeworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgY21kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJdG90X2RzZHMgPSBwY2lfbWFwX3NnKGhhLT5wZGV2LCBzZywgY21kLT51c2Vfc2csCisJCSAgICBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJaWYgKHRvdF9kc2RzID09IDApCisJCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CisJfSBlbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCSAgICB0b3RfZHNkcysrOworCX0KKwlyZXFfY250ID0gKGhhLT5jYWxjX3JlcXVlc3RfZW50cmllcykodG90X2RzZHMpOworCisJLyogQnVpbGQgY29tbWFuZCBwYWNrZXQgKi8KKwloYS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CisJaGEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9IHNwOworCXNwLT5oYSA9IGhhOworCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSh1bnNpZ25lZCBsb25nKWhhbmRsZTsKKwloYS0+cmVxX3FfY250IC09IHJlcV9jbnQ7CisKKwljbWRfcGt0ID0gKGNtZF9lbnRyeV90ICopaGEtPnJlcXVlc3RfcmluZ19wdHI7CisJY21kX3BrdC0+aGFuZGxlID0gaGFuZGxlOworCS8qIFplcm8gb3V0IHJlbWFpbmluZyBwb3J0aW9uIG9mIHBhY2tldC4gKi8KKwljbHJfcHRyID0gKHVpbnQzMl90ICopY21kX3BrdCArIDI7CisJbWVtc2V0KGNscl9wdHIsIDAsIFJFUVVFU1RfRU5UUllfU0laRSAtIDgpOworCWNtZF9wa3QtPmRzZWdfY291bnQgPSBjcHVfdG9fbGUxNih0b3RfZHNkcyk7CisKKwkvKiBTZXQgdGFyZ2V0IElEICovCisJU0VUX1RBUkdFVF9JRChoYSwgY21kX3BrdC0+dGFyZ2V0LCBmY2x1bi0+ZmNwb3J0LT5sb29wX2lkKTsKKworCS8qIFNldCBMVU4gbnVtYmVyKi8KKwljbWRfcGt0LT5sdW4gPSBjcHVfdG9fbGUxNihmY2x1bi0+bHVuKTsKKworCS8qIFVwZGF0ZSB0YWdnZWQgcXVldWluZyBtb2RpZmllciAqLworCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX1NJTVBMRV9UQUcpOworCWlmIChzY3NpX3BvcHVsYXRlX3RhZ19tc2coY21kLCB0YWcpKSB7CisJCXN3aXRjaCAodGFnWzBdKSB7CisJCWNhc2UgTVNHX0hFQURfVEFHOgorCQkJY21kX3BrdC0+Y29udHJvbF9mbGFncyA9CisJCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihDRl9IRUFEX1RBRyk7CisJCQlicmVhazsKKwkJY2FzZSBNU0dfT1JERVJFRF9UQUc6CisJCQljbWRfcGt0LT5jb250cm9sX2ZsYWdzID0KKwkJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KENGX09SREVSRURfVEFHKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhdCBsZWFzdCA1ICgrIFFMQV9DTURfVElNRVJfREVMVEEpIHNlY29uZHMgZm9yIFJJU0MgdGltZW91dC4KKwkgKi8KKwl0aW1lb3V0ID0gKHVpbnQzMl90KShjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLyBIWik7CisJaWYgKHRpbWVvdXQgPiA2NTUzNSkKKwkJY21kX3BrdC0+dGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJZWxzZSBpZiAodGltZW91dCA+IDI1KQorCQljbWRfcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoKHVpbnQxNl90KXRpbWVvdXQgLQorCQkgICAgKDUgKyBRTEFfQ01EX1RJTUVSX0RFTFRBKSk7CisJZWxzZQorCQljbWRfcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoKHVpbnQxNl90KXRpbWVvdXQpOworCisJLyogTG9hZCBTQ1NJIGNvbW1hbmQgcGFja2V0LiAqLworCW1lbWNweShjbWRfcGt0LT5zY3NpX2NkYiwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworCWNtZF9wa3QtPmJ5dGVfY291bnQgPSBjcHVfdG9fbGUzMigodWludDMyX3QpY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJLyogQnVpbGQgSU9DQiBzZWdtZW50cyAqLworCShoYS0+YnVpbGRfc2NzaV9pb2Nicykoc3AsIGNtZF9wa3QsIHRvdF9kc2RzKTsKKworCS8qIFNldCB0b3RhbCBkYXRhIHNlZ21lbnQgY291bnQuICovCisJY21kX3BrdC0+ZW50cnlfY291bnQgPSAodWludDhfdClyZXFfY250OworCXdtYigpOworCisJLyogQWRqdXN0IHJpbmcgaW5kZXguICovCisJaGEtPnJlcV9yaW5nX2luZGV4Kys7CisJaWYgKGhhLT5yZXFfcmluZ19pbmRleCA9PSBoYS0+cmVxdWVzdF9xX2xlbmd0aCkgeworCQloYS0+cmVxX3JpbmdfaW5kZXggPSAwOworCQloYS0+cmVxdWVzdF9yaW5nX3B0ciA9IGhhLT5yZXF1ZXN0X3Jpbmc7CisJfSBlbHNlCisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyKys7CisKKwloYS0+YWN0dGhyZWFkcysrOworCWhhLT50b3RhbF9pb3MrKzsKKwlzcC0+bHVuX3F1ZXVlLT5vdXRfY250Kys7CisJc3AtPmZsYWdzIHw9IFNSQl9ETUFfVkFMSUQ7CisJc3AtPnN0YXRlID0gU1JCX0FDVElWRV9TVEFURTsKKwlzcC0+dV9zdGFydCA9IGppZmZpZXM7CisKKwkvKiBTZXQgY2hpcCBuZXcgcmluZyBpbmRleC4gKi8KKwlXUlRfUkVHX1dPUkQoSVNQX1JFUV9RX0lOKGhhLCByZWcpLCBoYS0+cmVxX3JpbmdfaW5kZXgpOworCVJEX1JFR19XT1JEX1JFTEFYRUQoSVNQX1JFUV9RX0lOKGhhLCByZWcpKTsJLyogUENJIFBvc3RpbmcuICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCitxdWV1aW5nX2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworfQorCisvKioKKyAqIHFsYTJ4MDBfbWFya2VyKCkgLSBTZW5kIGEgbWFya2VyIElPQ0IgdG8gdGhlIGZpcm13YXJlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbG9vcF9pZDogbG9vcCBJRAorICogQGx1bjogTFVOCisgKiBAdHlwZTogbWFya2VyIG1vZGlmaWVyCisgKgorICogQ2FuIGJlIGNhbGxlZCBmcm9tIGJvdGggbm9ybWFsIGFuZCBpbnRlcnJ1cHQgY29udGV4dC4KKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cmVkLCBlbHNlIHplcm8uCisgKi8KK2ludAorX19xbGEyeDAwX21hcmtlcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50MTZfdCBsdW4sCisgICAgdWludDhfdCB0eXBlKQoreworCW1ya19lbnRyeV90CSpwa3Q7CisKKwlwa3QgPSAobXJrX2VudHJ5X3QgKilxbGEyeDAwX3JlcV9wa3QoaGEpOworCWlmIChwa3QgPT0gTlVMTCkgeworCQlERUJVRzJfMyhwcmludGsoIiVzKCk6ICoqKiogRkFJTEVEICoqKipcbiIsIF9fZnVuY19fKSk7CisKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwl9CisKKwlwa3QtPmVudHJ5X3R5cGUgPSBNQVJLRVJfVFlQRTsKKwlwa3QtPm1vZGlmaWVyID0gdHlwZTsKKworCWlmICh0eXBlICE9IE1LX1NZTkNfQUxMKSB7CisJCXBrdC0+bHVuID0gY3B1X3RvX2xlMTYobHVuKTsKKwkJU0VUX1RBUkdFVF9JRChoYSwgcGt0LT50YXJnZXQsIGxvb3BfaWQpOworCX0KKwl3bWIoKTsKKworCS8qIElzc3VlIGNvbW1hbmQgdG8gSVNQICovCisJcWxhMngwMF9pc3BfY21kKGhhKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCitpbnQgCitxbGEyeDAwX21hcmtlcihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50MTZfdCBsdW4sCisgICAgdWludDhfdCB0eXBlKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBfX3FsYTJ4MDBfbWFya2VyKGhhLCBsb29wX2lkLCBsdW4sIHR5cGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qKgorICogcWxhMngwMF9yZXFfcGt0KCkgLSBSZXRyaWV2ZSBhIHJlcXVlc3QgcGFja2V0IGZyb20gdGhlIHJlcXVlc3QgcmluZy4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIE5vdGU6IFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBoYXJkd2FyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgZnVuY3Rpb24gZmFpbGVkLCBlbHNlLCBhIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3QgcGFja2V0LgorICovCitzdGF0aWMgcmVxdWVzdF90ICoKK3FsYTJ4MDBfcmVxX3BrdChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXJlcXVlc3RfdAkqcGt0ID0gTlVMTDsKKwl1aW50MTZfdAljbnQ7CisJdWludDMyX3QJKmR3b3JkX3B0cjsKKwl1aW50MzJfdAl0aW1lcjsKKwl1aW50MTZfdAlyZXFfY250ID0gMTsKKworCS8qIFdhaXQgMSBzZWNvbmQgZm9yIHNsb3QuICovCisJZm9yICh0aW1lciA9IEhaOyB0aW1lcjsgdGltZXItLSkgeworCQlpZiAoKHJlcV9jbnQgKyAyKSA+PSBoYS0+cmVxX3FfY250KSB7CisJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGZyZWUgcmVxdWVzdCBlbnRyaWVzLiAqLworCQkJY250ID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcihJU1BfUkVRX1FfT1VUKGhhLCByZWcpKTsKKwkJCWlmICAoaGEtPnJlcV9yaW5nX2luZGV4IDwgY250KQorCQkJCWhhLT5yZXFfcV9jbnQgPSBjbnQgLSBoYS0+cmVxX3JpbmdfaW5kZXg7CisJCQllbHNlCisJCQkJaGEtPnJlcV9xX2NudCA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoIC0KKwkJCQkgICAgKGhhLT5yZXFfcmluZ19pbmRleCAtIGNudCk7CisJCX0KKwkJLyogSWYgcm9vbSBmb3IgcmVxdWVzdCBpbiByZXF1ZXN0IHJpbmcuICovCisJCWlmICgocmVxX2NudCArIDIpIDwgaGEtPnJlcV9xX2NudCkgeworCQkJaGEtPnJlcV9xX2NudC0tOworCQkJcGt0ID0gaGEtPnJlcXVlc3RfcmluZ19wdHI7CisKKwkJCS8qIFplcm8gb3V0IHBhY2tldC4gKi8KKwkJCWR3b3JkX3B0ciA9ICh1aW50MzJfdCAqKXBrdDsKKwkJCWZvciAoY250ID0gMDsgY250IDwgUkVRVUVTVF9FTlRSWV9TSVpFIC8gNDsgY250KyspCisJCQkJKmR3b3JkX3B0cisrID0gMDsKKworCQkJLyogU2V0IHN5c3RlbSBkZWZpbmVkIGZpZWxkLiAqLworCQkJcGt0LT5zeXNfZGVmaW5lID0gKHVpbnQ4X3QpaGEtPnJlcV9yaW5nX2luZGV4OworCisJCQkvKiBTZXQgZW50cnkgY291bnQuICovCisJCQlwa3QtPmVudHJ5X2NvdW50ID0gMTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZWxlYXNlIHJpbmcgc3BlY2lmaWMgbG9jayAqLworCQlzcGluX3VubG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCisJCXVkZWxheSgyKTsgICAvKiAyIHVzICovCisKKwkJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJLyogRHVyaW5nIGluaXQgd2UgaXNzdWUgbWFya2VyIGRpcmVjdGx5ICovCisJCWlmICghaGEtPm1hcmtlcl9uZWVkZWQpCisJCQlxbGEyeDAwX3BvbGwoaGEpOworCisJCXNwaW5fbG9ja19pcnEoJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwl9CisJaWYgKCFwa3QpIHsKKwkJREVCVUcyXzMocHJpbnRrKCIlcygpOiAqKioqIEZBSUxFRCAqKioqXG4iLCBfX2Z1bmNfXykpOworCX0KKworCXJldHVybiAocGt0KTsKK30KKworLyoqCisgKiBxbGEyeDAwX2lzcF9jbWQoKSAtIE1vZGlmeSB0aGUgcmVxdWVzdCByaW5nIHBvaW50ZXIuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBOb3RlOiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgaGFyZHdhcmUgbG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKi8KK3ZvaWQKK3FsYTJ4MDBfaXNwX2NtZChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJREVCVUc1KHByaW50aygiJXMoKTogSU9DQiBkYXRhOlxuIiwgX19mdW5jX18pKTsKKwlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcigKKwkgICAgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nX3B0ciwgUkVRVUVTVF9FTlRSWV9TSVpFKSk7CisKKwkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KKwloYS0+cmVxX3JpbmdfaW5kZXgrKzsKKwlpZiAoaGEtPnJlcV9yaW5nX2luZGV4ID09IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoKSB7CisJCWhhLT5yZXFfcmluZ19pbmRleCA9IDA7CisJCWhhLT5yZXF1ZXN0X3JpbmdfcHRyID0gaGEtPnJlcXVlc3RfcmluZzsKKwl9IGVsc2UKKwkJaGEtPnJlcXVlc3RfcmluZ19wdHIrKzsKKworCS8qIFNldCBjaGlwIG5ldyByaW5nIGluZGV4LiAqLworCVdSVF9SRUdfV09SRChJU1BfUkVRX1FfSU4oaGEsIHJlZyksIGhhLT5yZXFfcmluZ19pbmRleCk7CisJUkRfUkVHX1dPUkRfUkVMQVhFRChJU1BfUkVRX1FfSU4oaGEsIHJlZykpOwkvKiBQQ0kgUG9zdGluZy4gKi8KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC0wLDAgKzEsMTQ2NCBAQAorLyoKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfbWJ4X2NvbXBsZXRpb24oc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90KTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfYXN5bmNfZXZlbnQoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCk7Cit2b2lkIHFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfc3RhdHVzX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHNfZW50cnlfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfc3RhdHVzX2NvbnRfZW50cnkoc2NzaV9xbGFfaG9zdF90ICosIHN0c19jb250X2VudHJ5X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX2Vycm9yX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqLCBzdHNfZW50cnlfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfbXNfZW50cnkoc2NzaV9xbGFfaG9zdF90ICosIG1zX2lvY2JfZW50cnlfdCAqKTsKKworc3RhdGljIGludCBxbGEyeDAwX2NoZWNrX3NlbnNlKHN0cnVjdCBzY3NpX2NtbmQgKmNwLCBvc19sdW5fdCAqKTsKKworLyoqCisgKiBxbGEyMTAwX2ludHJfaGFuZGxlcigpIC0gUHJvY2VzcyBpbnRlcnJ1cHRzIGZvciB0aGUgSVNQMjEwMCBhbmQgSVNQMjIwMC4KKyAqIEBpcnE6CisgKiBAZGV2X2lkOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CisgKiBAcmVnczoKKyAqCisgKiBDYWxsZWQgYnkgc3lzdGVtIHdoZW5ldmVyIHRoZSBob3N0IGFkYXB0ZXIgZ2VuZXJhdGVzIGFuIGludGVycnVwdC4KKyAqCisgKiBSZXR1cm5zIGhhbmRsZWQgZmxhZy4KKyAqLworaXJxcmV0dXJuX3QKK3FsYTIxMDBfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOworCWludAkJc3RhdHVzOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgbG9uZwlpdGVyOworCXVpbnQzMl90CW1ieDsKKworCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBkZXZfaWQ7CisJaWYgKCFoYSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMoKTogTlVMTCBob3N0IHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIChJUlFfTk9ORSk7CisJfQorCisJcmVnID0gaGEtPmlvYmFzZTsKKwlzdGF0dXMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZm9yIChpdGVyID0gNTA7IGl0ZXItLTsgKSB7CisJCWlmICgoUkRfUkVHX1dPUkQoJnJlZy0+aXN0YXR1cykgJiBJU1JfUklTQ19JTlQpID09IDApCisJCQlicmVhazsKKworCQlpZiAoUkRfUkVHX1dPUkQoJnJlZy0+c2VtYXBob3JlKSAmIEJJVF8wKSB7CisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfUklTQ19JTlQpOworCQkJUkRfUkVHX1dPUkQoJnJlZy0+aGNjcik7CisKKwkJCS8qIEdldCBtYWlsYm94IGRhdGEuICovCisJCQltYnggPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwkJCWlmIChtYnggPiAweDNmZmYgJiYgbWJ4IDwgMHg4MDAwKSB7CisJCQkJcWxhMngwMF9tYnhfY29tcGxldGlvbihoYSwgKHVpbnQxNl90KW1ieCk7CisJCQkJc3RhdHVzIHw9IE1CWF9JTlRFUlJVUFQ7CisJCQl9IGVsc2UgaWYgKG1ieCA+IDB4N2ZmZiAmJiBtYnggPCAweGMwMDApIHsKKwkJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KGhhLCBtYngpOworCQkJfSBlbHNlIHsKKwkJCQkvKkVNUFRZKi8KKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCAiCisJCQkJICAgICJpbnRlcnJ1cHQgdHlwZSAoJWQpXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgbWJ4KSk7CisJCQl9CisJCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CisJCQlSRF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUpOworCQl9IGVsc2UgeworCQkJcWxhMngwMF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKGhhKTsKKworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlxbGEyeDAwX25leHQoaGEpOworCWhhLT5sYXN0X2lycV9jcHUgPSBfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWhhLT50b3RhbF9pc3JfY250Kys7CisKKwlpZiAodGVzdF9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSAmJgorCSAgICAoc3RhdHVzICYgTUJYX0lOVEVSUlVQVCkgJiYgaGEtPmZsYWdzLm1ib3hfaW50KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bWJ4X3JlZ19sb2NrLCBmbGFncyk7CisKKwkJc2V0X2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCQl1cCgmaGEtPm1ieF9pbnRyX3NlbSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPm1ieF9yZWdfbG9jaywgZmxhZ3MpOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQlxbGEyeDAwX2RvbmUoaGEpOworCisJcmV0dXJuIChJUlFfSEFORExFRCk7Cit9CisKKy8qKgorICogcWxhMjMwMF9pbnRyX2hhbmRsZXIoKSAtIFByb2Nlc3MgaW50ZXJydXB0cyBmb3IgdGhlIElTUDIzeHggYW5kIElTUDYzeHguCisgKiBAaXJxOgorICogQGRldl9pZDogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICogQHJlZ3M6CisgKgorICogQ2FsbGVkIGJ5IHN5c3RlbSB3aGVuZXZlciB0aGUgaG9zdCBhZGFwdGVyIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJucyBoYW5kbGVkIGZsYWcuCisgKi8KK2lycXJldHVybl90CitxbGEyMzAwX2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlpbnQJCXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGxvbmcJaXRlcjsKKwl1aW50MzJfdAlzdGF0OworCXVpbnQzMl90CW1ieDsKKwl1aW50MTZfdAloY2NyOworCisJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopIGRldl9pZDsKKwlpZiAoIWhhKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICIlcygpOiBOVUxMIGhvc3QgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gKElSUV9OT05FKTsKKwl9CisKKwlyZWcgPSBoYS0+aW9iYXNlOworCXN0YXR1cyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGl0ZXIgPSA1MDsgaXRlci0tOyApIHsKKwkJc3RhdCA9IFJEX1JFR19EV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zdGF0dXMpOworCQlpZiAoc3RhdCAmIEhTUl9SSVNDX1BBVVNFRCkgeworCQkJaGNjciA9IFJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJaWYgKGhjY3IgJiAoQklUXzE1IHwgQklUXzEzIHwgQklUXzExIHwgQklUXzgpKQorCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICAgIlBhcml0eSBlcnJvciAtLSBIQ0NSPSV4LlxuIiwgaGNjcik7CisJCQllbHNlCisJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgICAiUklTQyBwYXVzZWQgLS0gSENDUj0leFxuIiwgaGNjcik7CisKKwkJCS8qCisJCQkgKiBJc3N1ZSBhICJIQVJEIiByZXNldCBpbiBvcmRlciBmb3IgdGhlIFJJU0MKKwkJCSAqIGludGVycnVwdCBiaXQgdG8gYmUgY2xlYXJlZC4gIFNjaGVkdWxlIGEgYmlnCisJCQkgKiBoYW1tbWVyIHRvIGdldCBvdXQgb2YgdGhlIFJJU0MgUEFVU0VEIHN0YXRlLgorCQkJICovCisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKKwkJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoc3RhdCAmIEhTUl9SSVNDX0lOVCkgPT0gMCkKKwkJCWJyZWFrOworCisJCW1ieCA9IE1TVyhzdGF0KTsKKwkJc3dpdGNoIChzdGF0ICYgMHhmZikgeworCQljYXNlIDB4MTM6CisJCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxOgorCQljYXNlIDB4MjoKKwkJY2FzZSAweDEwOgorCQljYXNlIDB4MTE6CisJCQlxbGEyeDAwX21ieF9jb21wbGV0aW9uKGhhLCAodWludDE2X3QpbWJ4KTsKKwkJCXN0YXR1cyB8PSBNQlhfSU5URVJSVVBUOworCisJCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAweDEyOgorCQkJcWxhMngwMF9hc3luY19ldmVudChoYSwgbWJ4KTsKKwkJCWJyZWFrOworCQljYXNlIDB4MTU6CisJCQltYnggPSBtYnggPDwgMTYgfCBNQkFfQ01QTFRfMV8xNkJJVDsKKwkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQoaGEsIG1ieCk7CisJCQlicmVhazsKKwkJY2FzZSAweDE2OgorCQkJbWJ4ID0gbWJ4IDw8IDE2IHwgTUJBX1NDU0lfQ09NUExFVElPTjsKKwkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQoaGEsIG1ieCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICIKKwkJCSAgICAiKCVkKVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCWJyZWFrOworCQl9CisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CisJCVJEX1JFR19XT1JEX1JFTEFYRUQoJnJlZy0+aGNjcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlxbGEyeDAwX25leHQoaGEpOworCWhhLT5sYXN0X2lycV9jcHUgPSBfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWhhLT50b3RhbF9pc3JfY250Kys7CisKKwlpZiAodGVzdF9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSAmJgorCSAgICAoc3RhdHVzICYgTUJYX0lOVEVSUlVQVCkgJiYgaGEtPmZsYWdzLm1ib3hfaW50KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bWJ4X3JlZ19sb2NrLCBmbGFncyk7CisKKwkJc2V0X2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCQl1cCgmaGEtPm1ieF9pbnRyX3NlbSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPm1ieF9yZWdfbG9jaywgZmxhZ3MpOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQlxbGEyeDAwX2RvbmUoaGEpOworCisJcmV0dXJuIChJUlFfSEFORExFRCk7Cit9CisKKy8qKgorICogcWxhMngwMF9tYnhfY29tcGxldGlvbigpIC0gUHJvY2VzcyBtYWlsYm94IGNvbW1hbmQgY29tcGxldGlvbnMuCisgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqIEBtYjA6IE1haWxib3gwIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX21ieF9jb21wbGV0aW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IG1iMCkKK3sKKwl1aW50MTZfdAljbnQ7CisJdWludDE2X3QgX19pb21lbSAqd3B0cjsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCS8qIExvYWQgcmV0dXJuIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCWhhLT5mbGFncy5tYm94X2ludCA9IDE7CisJaGEtPm1haWxib3hfb3V0WzBdID0gbWIwOworCXdwdHIgPSAodWludDE2X3QgX19pb21lbSAqKU1BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCisJZm9yIChjbnQgPSAxOyBjbnQgPCBoYS0+bWJ4X2NvdW50OyBjbnQrKykgeworCQlpZiAoSVNfUUxBMjIwMChoYSkgJiYgY250ID09IDgpIAorCQkJd3B0ciA9ICh1aW50MTZfdCBfX2lvbWVtICopTUFJTEJPWF9SRUcoaGEsIHJlZywgOCk7CisJCWlmIChjbnQgPT0gNCB8fCBjbnQgPT0gNSkKKwkJCWhhLT5tYWlsYm94X291dFtjbnRdID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3Rlcih3cHRyKTsKKwkJZWxzZQorCQkJaGEtPm1haWxib3hfb3V0W2NudF0gPSBSRF9SRUdfV09SRCh3cHRyKTsKKwkKKwkJd3B0cisrOworCX0KKworCWlmIChoYS0+bWNwKSB7CisJCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IEdvdCBtYWlsYm94IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsCisJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIGhhLT5tY3AtPm1iWzBdKSk7CisJfSBlbHNlIHsKKwkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBNQlggcG9pbnRlciBFUlJPUiFcbiIsCisJCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9hc3luY19ldmVudCgpIC0gUHJvY2VzcyBheW5jaHJvbm91cyBldmVudHMuCisgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqIEBtYjA6IE1haWxib3gwIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IG1ieCkKK3sKKwlzdGF0aWMgY2hhcgkqbGlua19zcGVlZHNbNV0gPSB7ICIxIiwgIjIiLCAiNCIsICI/IiwgIjEwIiB9OworCWNoYXIJCSpsaW5rX3NwZWVkOworCXVpbnQxNl90CW1iWzRdOworCXVpbnQxNl90CWhhbmRsZV9jbnQ7CisJdWludDE2X3QJY250OworCXVpbnQzMl90CWhhbmRsZXNbNV07CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJdWludDMyX3QJcnNjbl9lbnRyeSwgaG9zdF9waWQ7CisJdWludDhfdAkJcnNjbl9xdWV1ZV9pbmRleDsKKworCS8qIFNldHVwIHRvIHByb2Nlc3MgUklPIGNvbXBsZXRpb24uICovCisJaGFuZGxlX2NudCA9IDA7CisJbWJbMF0gPSBMU1cobWJ4KTsKKwlzd2l0Y2ggKG1iWzBdKSB7CisJY2FzZSBNQkFfU0NTSV9DT01QTEVUSU9OOgorCQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCQloYW5kbGVzWzBdID0gbGUzMl90b19jcHUoCisJCQkgICAgKCh1aW50MzJfdCkoUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMikgPDwgMTYpKSB8CisJCQkgICAgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSkpOworCQllbHNlCisJCQloYW5kbGVzWzBdID0gbGUzMl90b19jcHUoCisJCQkgICAgKCh1aW50MzJfdCkoUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMikgPDwgMTYpKSB8CisJCQkgICAgTVNXKG1ieCkpOworCQloYW5kbGVfY250ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNQkFfQ01QTFRfMV8xNkJJVDoKKwkJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQkJaGFuZGxlc1swXSA9ICh1aW50MzJfdClSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJZWxzZQorCQkJaGFuZGxlc1swXSA9IE1TVyhtYngpOworCQloYW5kbGVfY250ID0gMTsKKwkJbWJbMF0gPSBNQkFfU0NTSV9DT01QTEVUSU9OOworCQlicmVhazsKKwljYXNlIE1CQV9DTVBMVF8yXzE2QklUOgorCQloYW5kbGVzWzBdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCQloYW5kbGVzWzFdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCQloYW5kbGVfY250ID0gMjsKKwkJbWJbMF0gPSBNQkFfU0NTSV9DT01QTEVUSU9OOworCQlicmVhazsKKwljYXNlIE1CQV9DTVBMVF8zXzE2QklUOgorCQloYW5kbGVzWzBdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCQloYW5kbGVzWzFdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCQloYW5kbGVzWzJdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDMpOworCQloYW5kbGVfY250ID0gMzsKKwkJbWJbMF0gPSBNQkFfU0NTSV9DT01QTEVUSU9OOworCQlicmVhazsKKwljYXNlIE1CQV9DTVBMVF80XzE2QklUOgorCQloYW5kbGVzWzBdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCQloYW5kbGVzWzFdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCQloYW5kbGVzWzJdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDMpOworCQloYW5kbGVzWzNdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDYpOworCQloYW5kbGVfY250ID0gNDsKKwkJbWJbMF0gPSBNQkFfU0NTSV9DT01QTEVUSU9OOworCQlicmVhazsKKwljYXNlIE1CQV9DTVBMVF81XzE2QklUOgorCQloYW5kbGVzWzBdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCQloYW5kbGVzWzFdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCQloYW5kbGVzWzJdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDMpOworCQloYW5kbGVzWzNdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDYpOworCQloYW5kbGVzWzRdID0gKHVpbnQzMl90KVJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDcpOworCQloYW5kbGVfY250ID0gNTsKKwkJbWJbMF0gPSBNQkFfU0NTSV9DT01QTEVUSU9OOworCQlicmVhazsKKwljYXNlIE1CQV9DTVBMVF8yXzMyQklUOgorCQloYW5kbGVzWzBdID0gbGUzMl90b19jcHUoCisJCSAgICAoKHVpbnQzMl90KShSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKSA8PCAxNikpIHwKKwkJICAgIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpKTsKKwkJaGFuZGxlc1sxXSA9IGxlMzJfdG9fY3B1KAorCQkgICAgKCh1aW50MzJfdCkoUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgNykgPDwgMTYpKSB8CisJCSAgICBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCA2KSk7CisJCWhhbmRsZV9jbnQgPSAyOworCQltYlswXSA9IE1CQV9TQ1NJX0NPTVBMRVRJT047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAobWJbMF0pIHsKKwljYXNlIE1CQV9TQ1NJX0NPTVBMRVRJT046CS8qIEZhc3QgUG9zdCAqLworCQlpZiAoIWhhLT5mbGFncy5vbmxpbmUpCisJCQlicmVhazsKKworCQlmb3IgKGNudCA9IDA7IGNudCA8IGhhbmRsZV9jbnQ7IGNudCsrKQorCQkJcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KGhhLCBoYW5kbGVzW2NudF0pOworCQlicmVhazsKKworCWNhc2UgTUJBX1JFU0VUOgkJCS8qIFJlc2V0ICovCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFJFU0VULlxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQlzZXRfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9TWVNURU1fRVJSOgkJLyogU3lzdGVtIEVycm9yICovCisJCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CisJCW1iWzJdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CisJCW1iWzNdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMyk7CisKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIklTUCBTeXN0ZW0gRXJyb3IgLSBtYngxPSV4aCBtYngyPSV4aCBtYngzPSV4aC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKKworCQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCQlxbGEyMTAwX2Z3X2R1bXAoaGEsIDEpOworCQllbHNlCisJICAgIAkJcWxhMjMwMF9md19kdW1wKGhhLCAxKTsKKworCQlpZiAobWJbMV0gPT0gMCkgeworCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICJVbnJlY292ZXJhYmxlIEhhcmR3YXJlIEVycm9yOiBhZGFwdGVyIG1hcmtlZCAiCisJCQkgICAgIk9GRkxJTkUhXG4iKTsKKwkJCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCQl9IGVsc2UKKwkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgTUJBX1JFUV9UUkFOU0ZFUl9FUlI6CS8qIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IgKi8KKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvci5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvci5cbiIpOworCisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgTUJBX1JTUF9UUkFOU0ZFUl9FUlI6CS8qIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yICovCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSVNQIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIpOworCisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgTUJBX1dBS0VVUF9USFJFUzoJCS8qIFJlcXVlc3QgUXVldWUgV2FrZS11cCAqLworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBXQUtFVVBfVEhSRVMuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9MSVBfT0NDVVJSRUQ6CQkvKiBMb29wIEluaXRpYWxpemF0aW9uIFByb2NlZHVyZSAqLworCQltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogTElQIG9jY3VyZWQgKCV4KS5cbiIsIGhhLT5ob3N0X25vLAorCQkgICAgbWJbMV0pKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTElQIG9jY3VyZWQgKCV4KS5cbiIsIG1iWzFdKTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCQl9CisKKwkJc2V0X2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CisKKwkJLyogVXBkYXRlIEFFTiBxdWV1ZS4gKi8KKwkJcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgTUJBX0xJUF9PQ0NVUlJFRCwgTlVMTCk7CisKKwkJaGEtPnRvdGFsX2xpcF9jbnQrKzsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9MT09QX1VQOgkJLyogTG9vcCBVcCBFdmVudCAqLworCQltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCisJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IDA7CisJCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgeworCQkJbGlua19zcGVlZCA9IGxpbmtfc3BlZWRzWzBdOworCQl9IGVsc2UgeworCQkJbGlua19zcGVlZCA9IGxpbmtfc3BlZWRzWzNdOworCQkJaWYgKG1iWzFdIDwgNSkKKwkJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbbWJbMV1dOworCQkJaGEtPmxpbmtfZGF0YV9yYXRlID0gbWJbMV07CisJCX0KKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBMT09QIFVQICglcyBHYnBzKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgbGlua19zcGVlZCkpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJMT09QIFVQIGRldGVjdGVkICglcyBHYnBzKS5cbiIsCisJCSAgICBsaW5rX3NwZWVkKTsKKworCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKKworCQkvKiBVcGRhdGUgQUVOIHF1ZXVlLiAqLworCQlxbGEyeDAwX2VucXVldWVfYWVuKGhhLCBNQkFfTE9PUF9VUCwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfTE9PUF9ET1dOOgkJLyogTG9vcCBEb3duIEV2ZW50ICovCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIExPT1AgRE9XTi5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJMT09QIERPV04gZGV0ZWN0ZWQuXG4iKTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOworCQkJaGEtPmRldmljZV9mbGFncyB8PSBERkxHX05PX0NBQkxFOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCQl9CisKKwkJaGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CisJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IDA7CisKKwkJLyogVXBkYXRlIEFFTiBxdWV1ZS4gKi8KKwkJcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgTUJBX0xPT1BfRE9XTiwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfTElQX1JFU0VUOgkJLyogTElQIHJlc2V0IG9jY3VycmVkICovCisJCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTElQIFJFU0VUICgleCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIG1iWzFdKSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJMSVAgcmVzZXQgb2NjdXJlZCAoJXgpLlxuIiwgbWJbMV0pOworCisJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CisJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CisJCQlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChoYSk7CisJCX0KKworCQlzZXRfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQloYS0+b3BlcmF0aW5nX21vZGUgPSBMT09QOworCQloYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMDsKKworCQkvKiBVcGRhdGUgQUVOIHF1ZXVlLiAqLworCQlxbGEyeDAwX2VucXVldWVfYWVuKGhhLCBNQkFfTElQX1JFU0VULCBOVUxMKTsKKworCQloYS0+dG90YWxfbGlwX2NudCsrOworCQlicmVhazsKKworCWNhc2UgTUJBX1BPSU5UX1RPX1BPSU5UOgkvKiBQb2ludC10by1Qb2ludCAqLworCQlpZiAoSVNfUUxBMjEwMChoYSkpCisJCQlicmVhazsKKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBQMlAgTU9ERSByZWNlaXZlZC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCisJCS8qCisJCSAqIFVudGlsIHRoZXJlJ3MgYSB0cmFuc2l0aW9uIGZyb20gbG9vcCBkb3duIHRvIGxvb3AgdXAsIHRyZWF0CisJCSAqIHRoaXMgYXMgbG9vcCBkb3duIG9ubHkuCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOworCQkJaWYgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikpCisJCQkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwKKwkJCQkgICAgTE9PUF9ET1dOX1RJTUUpOworCQkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCQl9CisKKwkJaWYgKCEodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpKSkgeworCQkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCX0KKwkJc2V0X2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfQ0hHX0lOX0NPTk5FQ1RJT046CS8qIENoYW5nZSBpbiBjb25uZWN0aW9uIG1vZGUgKi8KKwkJaWYgKElTX1FMQTIxMDAoaGEpKQorCQkJYnJlYWs7CisKKwkJbWJbMV0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBDaGFuZ2UgSW4gQ29ubmVjdGlvbiAiCisJCSAgICAicmVjZWl2ZWQuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIkNvbmZpZ3VyYXRpb24gY2hhbmdlIGRldGVjdGVkOiB2YWx1ZT0leC5cbiIsIG1iWzFdKTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKwkJCWF0b21pY19zZXQoJmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOyAgCisJCQlpZiAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSkKKwkJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLAorCQkJCSAgICBMT09QX0RPV05fVElNRSk7CisJCQlxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdChoYSk7CisJCX0KKworCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBNQkFfUE9SVF9VUERBVEU6CQkvKiBQb3J0IGRhdGFiYXNlIHVwZGF0ZSAqLworCQltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOworCQltYlsyXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDIpOworCisJCS8qCisJCSAqIElmIGEgc2luZ2xlIHJlbW90ZSBwb3J0IGp1c3QgbG9nZ2VkIGludG8gKG9yIGxvZ2dlZCBvdXQgb2YpCisJCSAqIHVzLCBjcmVhdGUgYSBuZXcgZW50cnkgaW4gb3VyIHJzY24gZmNwb3J0cyBsaXN0IGFuZCBoYW5kbGUKKwkJICogdGhlIGV2ZW50IGxpa2UgYW4gUlNDTi4KKwkJICovCisJCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpICYmICFJU19RTEE2MzEyKGhhKSAmJgorCQkgICAgIUlTX1FMQTYzMjIoaGEpICYmIGhhLT5mbGFncy5pbml0X2RvbmUgJiYgbWJbMV0gIT0gMHhmZmZmICYmCisJCSAgICAoKGhhLT5vcGVyYXRpbmdfbW9kZSA9PSBQMlAgJiYgbWJbMV0gIT0gMCkgfHwKKwkJICAgIChoYS0+b3BlcmF0aW5nX21vZGUgIT0gUDJQICYmIG1iWzFdICE9CisJCQlTTlNfRklSU1RfTE9PUF9JRCkpICYmIChtYlsyXSA9PSA2IHx8IG1iWzJdID09IDcpKSB7CisJCQlpbnQgcnZhbDsKKwkJCWZjX3BvcnRfdCAqcnNjbl9mY3BvcnQ7CisKKwkJCS8qIENyZWF0ZSBuZXcgZmNwb3J0IGZvciBsb2dpbi4gKi8KKwkJCXJzY25fZmNwb3J0ID0gcWxhMngwMF9hbGxvY19yc2NuX2ZjcG9ydChoYSwgR0ZQX0FUT01JQyk7CisJCQlpZiAocnNjbl9mY3BvcnQpIHsKKwkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBQb3J0IFVwZGF0ZSAtLSAiCisJCQkJICAgICJjcmVhdGluZyBSU0NOIGZjcG9ydCAlcCBmb3IgJXgvJXguXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgcnNjbl9mY3BvcnQsIG1iWzFdLCBtYlsyXSkpOworCisJCQkJcnNjbl9mY3BvcnQtPmxvb3BfaWQgPSBtYlsxXTsKKwkJCQlyc2NuX2ZjcG9ydC0+ZF9pZC5iMjQgPSBJTlZBTElEX1BPUlRfSUQ7CisJCQkJYXRvbWljX3NldCgmcnNjbl9mY3BvcnQtPnN0YXRlLAorCQkJCSAgICBGQ1NfREVWSUNFX0xPU1QpOworCQkJCWxpc3RfYWRkX3RhaWwoJnJzY25fZmNwb3J0LT5saXN0LAorCQkJCSAgICAmaGEtPnJzY25fZmNwb3J0cyk7CisKKwkJCQlydmFsID0gcWxhMngwMF9oYW5kbGVfcG9ydF9yc2NuKGhhLCAwLAorCQkJCSAgICByc2NuX2ZjcG9ydCwgMSk7CisJCQkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBQb3J0IFVwZGF0ZSAtLSAiCisJCQkJICAgICItLSB1bmFibGUgdG8gYWxsb2NhdGUgUlNDTiBmY3BvcnQgIgorCQkJCSAgICAibG9naW4uXG4iLCBoYS0+aG9zdF9ubykpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogSWYgUE9SVCBVUERBVEUgaXMgZ2xvYmFsIChyZWNpZXZlZCBMSVBfT0NDVVJFRC9MSVBfUkVTRVQKKwkJICogZXZlbnQgZXRjLiBlYXJsaWVyIGluZGljYXRpbmcgbG9vcCBpcyBkb3duKSB0aGVuIHByb2Nlc3MKKwkJICogaXQuICBPdGhlcndpc2UgaWdub3JlIGl0IGFuZCBXYWl0IGZvciBSU0NOIHRvIGNvbWUgaW4uCisJCSAqLworCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCAwKTsKKwkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOICYmCisJCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfREVBRCkgeworCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUE9SVCBVUERBVEUgIgorCQkJICAgICJpZ25vcmVkLlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCWJyZWFrOworCQl9CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUE9SVCBVUERBVEUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJREVCVUcocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInNjc2koJWxkKTogUG9ydCBkYXRhYmFzZSBjaGFuZ2VkICUwNHggJTA0eC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdKSk7CisKKwkJLyoKKwkJICogTWFyayBhbGwgZGV2aWNlcyBhcyBtaXNzaW5nIHNvIHdlIHdpbGwgbG9naW4gYWdhaW4uCisJCSAqLworCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9VUCk7CisKKwkJcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3QoaGEpOworCisJCWhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMTsKKworCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlzZXRfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7CisKKwkJLyogVXBkYXRlIEFFTiBxdWV1ZS4gKi8KKwkJcWxhMngwMF9lbnF1ZXVlX2FlbihoYSwgTUJBX1BPUlRfVVBEQVRFLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIE1CQV9SU0NOX1VQREFURToJCS8qIFN0YXRlIENoYW5nZSBSZWdpc3RyYXRpb24gKi8KKwkJbWJbMV0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAxKTsKKwkJbWJbMl0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKKworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBSU0NSIFVQREFURS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQpOiBSU0NOIGRhdGFiYXNlIGNoYW5nZWQgLS0gJTA0eCAlMDR4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0pKTsKKworCQlyc2NuX2VudHJ5ID0gKG1iWzFdIDw8IDE2KSB8IG1iWzJdOworCQlob3N0X3BpZCA9IChoYS0+ZF9pZC5iLmRvbWFpbiA8PCAxNikgfCAoaGEtPmRfaWQuYi5hcmVhIDw8IDgpIHwKKwkJICAgIGhhLT5kX2lkLmIuYWxfcGE7CisJCWlmIChyc2NuX2VudHJ5ID09IGhvc3RfcGlkKSB7CisJCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkKTogSWdub3JpbmcgUlNDTiB1cGRhdGUgdG8gbG9jYWwgaG9zdCAiCisJCQkgICAgInBvcnQgSUQgKCUwNngpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBob3N0X3BpZCkpOworCQkJYnJlYWs7CisJCX0KKworCQlyc2NuX3F1ZXVlX2luZGV4ID0gaGEtPnJzY25faW5fcHRyICsgMTsKKwkJaWYgKHJzY25fcXVldWVfaW5kZXggPT0gTUFYX1JTQ05fQ09VTlQpCisJCQlyc2NuX3F1ZXVlX2luZGV4ID0gMDsKKwkJaWYgKHJzY25fcXVldWVfaW5kZXggIT0gaGEtPnJzY25fb3V0X3B0cikgeworCQkJaGEtPnJzY25fcXVldWVbaGEtPnJzY25faW5fcHRyXSA9IHJzY25fZW50cnk7CisJCQloYS0+cnNjbl9pbl9wdHIgPSByc2NuX3F1ZXVlX2luZGV4OworCQl9IGVsc2UgeworCQkJaGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAxOworCQl9CisKKwkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfVVBEQVRFKTsKKwkJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgMCk7CisJCWhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOworCisJCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXNldF9iaXQoUlNDTl9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKKworCQkvKiBVcGRhdGUgQUVOIHF1ZXVlLiAqLworCQlxbGEyeDAwX2VucXVldWVfYWVuKGhhLCBNQkFfUlNDTl9VUERBVEUsICZtYlswXSk7CisJCWJyZWFrOworCisJLyogY2FzZSBNQkFfUklPX1JFU1BPTlNFOiAqLworCWNhc2UgTUJBX1pJT19SRVNQT05TRToKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKSk7CisJCURFQlVHKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQlxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoaGEpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KCkgLSBQcm9jZXNzIGEgRmFzdCBQb3N0IHJlc3BvbnNlLgorICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CisgKiBAaW5kZXg6IFNSQiBpbmRleAorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgaW5kZXgpCit7CisJc3JiX3QgKnNwOworCisJLyogVmFsaWRhdGUgaGFuZGxlLiAqLworCWlmIChpbmRleCA+PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnZhbGlkIFNDU0kgY29tcGxldGlvbiBoYW5kbGUgJWQuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGluZGV4KSk7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJJbnZhbGlkIFNDU0kgY29tcGxldGlvbiBoYW5kbGUgJWQuXG4iLCBpbmRleCk7CisKKwkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XTsKKwlpZiAoc3ApIHsKKwkJLyogRnJlZSBvdXRzdGFuZGluZyBjb21tYW5kIHNsb3QuICovCisJCWhhLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XSA9IE5VTEw7CisKKwkJaWYgKGhhLT5hY3R0aHJlYWRzKQorCQkJaGEtPmFjdHRocmVhZHMtLTsKKwkJc3AtPmx1bl9xdWV1ZS0+b3V0X2NudC0tOworCQlDTURfQ09NUExfU1RBVFVTKHNwLT5jbWQpID0gMEw7CisJCUNNRF9TQ1NJX1NUQVRVUyhzcC0+Y21kKSA9IDBMOworCisJCS8qIFNhdmUgSVNQIGNvbXBsZXRpb24gc3RhdHVzICovCisJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJc3AtPmZvX3JldHJ5X2NudCA9IDA7CisJCWFkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnZhbGlkIElTUCBTQ1NJIGNvbXBsZXRpb24gaGFuZGxlXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkludmFsaWQgSVNQIFNDU0kgY29tcGxldGlvbiBoYW5kbGVcbiIpOworCisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCX0KK30KKworLyoqCisgKiBxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoKSAtIFByb2Nlc3MgcmVzcG9uc2UgcXVldWUgZW50cmllcy4KKyAqIEBoYTogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICovCit2b2lkCitxbGEyeDAwX3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXN0c19lbnRyeV90CSpwa3Q7CisJdWludDE2X3QgICAgICAgIGhhbmRsZV9jbnQ7CisJdWludDE2X3QgICAgICAgIGNudDsKKworCWlmICghaGEtPmZsYWdzLm9ubGluZSkKKwkJcmV0dXJuOworCisJd2hpbGUgKGhhLT5yZXNwb25zZV9yaW5nX3B0ci0+c2lnbmF0dXJlICE9IFJFU1BPTlNFX1BST0NFU1NFRCkgeworCQlwa3QgPSAoc3RzX2VudHJ5X3QgKiloYS0+cmVzcG9uc2VfcmluZ19wdHI7CisKKwkJaGEtPnJzcF9yaW5nX2luZGV4Kys7CisJCWlmIChoYS0+cnNwX3JpbmdfaW5kZXggPT0gaGEtPnJlc3BvbnNlX3FfbGVuZ3RoKSB7CisJCQloYS0+cnNwX3JpbmdfaW5kZXggPSAwOworCQkJaGEtPnJlc3BvbnNlX3JpbmdfcHRyID0gaGEtPnJlc3BvbnNlX3Jpbmc7CisJCX0gZWxzZSB7CisJCQloYS0+cmVzcG9uc2VfcmluZ19wdHIrKzsKKwkJfQorCisJCWlmIChwa3QtPmVudHJ5X3N0YXR1cyAhPSAwKSB7CisJCQlERUJVRzMocHJpbnRrKEtFUk5fSU5GTworCQkJICAgICJzY3NpKCVsZCk6IFByb2Nlc3MgZXJyb3IgZW50cnkuXG4iLCBoYS0+aG9zdF9ubykpOworCisJCQlxbGEyeDAwX2Vycm9yX2VudHJ5KGhhLCBwa3QpOworCQkJKChyZXNwb25zZV90ICopcGt0KS0+c2lnbmF0dXJlID0gUkVTUE9OU0VfUFJPQ0VTU0VEOworCQkJd21iKCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAocGt0LT5lbnRyeV90eXBlKSB7CisJCWNhc2UgU1RBVFVTX1RZUEU6CisJCQlxbGEyeDAwX3N0YXR1c19lbnRyeShoYSwgcGt0KTsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRVU19UWVBFXzIxOgorCQkJaGFuZGxlX2NudCA9ICgoc3RzMjFfZW50cnlfdCAqKXBrdCktPmhhbmRsZV9jb3VudDsKKwkJCWZvciAoY250ID0gMDsgY250IDwgaGFuZGxlX2NudDsgY250KyspIHsKKwkJCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QoaGEsCisJCQkJICAgICgoc3RzMjFfZW50cnlfdCAqKXBrdCktPmhhbmRsZVtjbnRdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRVU19UWVBFXzIyOgorCQkJaGFuZGxlX2NudCA9ICgoc3RzMjJfZW50cnlfdCAqKXBrdCktPmhhbmRsZV9jb3VudDsKKwkJCWZvciAoY250ID0gMDsgY250IDwgaGFuZGxlX2NudDsgY250KyspIHsKKwkJCQlxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QoaGEsCisJCQkJICAgICgoc3RzMjJfZW50cnlfdCAqKXBrdCktPmhhbmRsZVtjbnRdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRVU19DT05UX1RZUEU6CisJCQlxbGEyeDAwX3N0YXR1c19jb250X2VudHJ5KGhhLCAoc3RzX2NvbnRfZW50cnlfdCAqKXBrdCk7CisJCQlicmVhazsKKwkJY2FzZSBNU19JT0NCX1RZUEU6CisJCQlxbGEyeDAwX21zX2VudHJ5KGhhLCAobXNfaW9jYl9lbnRyeV90ICopcGt0KTsKKwkJCWJyZWFrOworCQljYXNlIE1CWF9JT0NCX1RZUEU6CisJCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSAmJgorCQkJICAgICFJU19RTEE2MzEyKGhhKSAmJiAhSVNfUUxBNjMyMihoYSkpIHsKKwkJCQlpZiAocGt0LT5zeXNfZGVmaW5lID09IFNPVVJDRV9BU1lOQ19JT0NCKSB7CisJCQkJCXFsYTJ4MDBfcHJvY2Vzc19pb2Rlc2MoaGEsCisJCQkJCSAgICAoc3RydWN0IG1ieF9lbnRyeSAqKXBrdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogTUJYIElPQ0IgVHlwZSBOb3QgU3VwcG9ydGVkLiAqLworCQkJCQlERUJVRzQocHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgInNjc2koJWxkKTogUmVjZWl2ZWQgdW5rbm93biBNQlggIgorCQkJCQkgICAgIklPQ0IgcmVzcG9uc2UgcGt0IHR5cGU9JXggIgorCQkJCQkgICAgInNvdXJjZT0leCBlbnRyeSBzdGF0dXM9JXguXG4iLAorCQkJCQkgICAgaGEtPmhvc3Rfbm8sIHBrdC0+ZW50cnlfdHlwZSwKKwkJCQkJICAgIHBrdC0+c3lzX2RlZmluZSwKKwkJCQkJICAgIHBrdC0+ZW50cnlfc3RhdHVzKSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLyogRmFsbHRocm91Z2guICovCisJCWRlZmF1bHQ6CisJCQkvKiBUeXBlIE5vdCBTdXBwb3J0ZWQuICovCisJCQlERUJVRzQocHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICJzY3NpKCVsZCk6IFJlY2VpdmVkIHVua25vd24gcmVzcG9uc2UgcGt0IHR5cGUgJXggIgorCQkJICAgICJlbnRyeSBzdGF0dXM9JXguXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKSk7CisJCQlicmVhazsKKwkJfQorCQkoKHJlc3BvbnNlX3QgKilwa3QpLT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CisJCXdtYigpOworCX0KKworCS8qIEFkanVzdCByaW5nIGluZGV4ICovCisJV1JUX1JFR19XT1JEKElTUF9SU1BfUV9PVVQoaGEsIHJlZyksIGhhLT5yc3BfcmluZ19pbmRleCk7Cit9CisKKy8qKgorICogcWxhMngwMF9zdGF0dXNfZW50cnkoKSAtIFByb2Nlc3MgYSBTdGF0dXMgSU9DQiBlbnRyeS4KKyAqIEBoYTogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICogQHBrdDogRW50cnkgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9zdGF0dXNfZW50cnkoc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RzX2VudHJ5X3QgKnBrdCkKK3sKKwlpbnQJCXJldDsKKwl1bnNpZ25lZAliLCB0LCBsOworCXNyYl90CQkqc3A7CisJb3NfbHVuX3QJKmxxOworCW9zX3RndF90CSp0cTsKKwlmY19wb3J0X3QJKmZjcG9ydDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjcDsKKwl1aW50MTZfdAljb21wX3N0YXR1czsKKwl1aW50MTZfdAlzY3NpX3N0YXR1czsKKwl1aW50OF90CQlsc2NzaV9zdGF0dXM7CisJaW50MzJfdAkJcmVzaWQ7CisJdWludDhfdAkJc2Vuc2Vfc3ogPSAwOworCXVpbnQxNl90CXJzcF9pbmZvX2xlbjsKKworCS8qIEZhc3QgcGF0aCBjb21wbGV0aW9uLiAqLworCWlmIChsZTE2X3RvX2NwdShwa3QtPmNvbXBfc3RhdHVzKSA9PSBDU19DT01QTEVURSAmJgorCSAgICAobGUxNl90b19jcHUocGt0LT5zY3NpX3N0YXR1cykgJiBTU19NQVNLKSA9PSAwKSB7CisJCXFsYTJ4MDBfcHJvY2Vzc19jb21wbGV0ZWRfcmVxdWVzdChoYSwgcGt0LT5oYW5kbGUpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCisJaWYgKHBrdC0+aGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7CisJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdOworCQloYS0+b3V0c3RhbmRpbmdfY21kc1twa3QtPmhhbmRsZV0gPSBOVUxMOworCX0gZWxzZQorCQlzcCA9IE5VTEw7CisKKwlpZiAoc3AgPT0gTlVMTCkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFN0YXR1cyBFbnRyeSBpbnZhbGlkIGhhbmRsZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJTdGF0dXMgRW50cnkgaW52YWxpZCBoYW5kbGUuXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJaWYgKGhhLT5kcGNfd2FpdCAmJiAhaGEtPmRwY19hY3RpdmUpIAorCQkJdXAoaGEtPmRwY193YWl0KTsKKworCQlyZXR1cm47CisJfQorCWNwID0gc3AtPmNtZDsKKwlpZiAoY3AgPT0gTlVMTCkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IENvbW1hbmQgYWxyZWFkeSByZXR1cm5lZCBiYWNrIHRvIE9TICIKKwkJICAgICJwa3QtPmhhbmRsZT0lZCBzcD0lcCBzcC0+c3RhdGU6JWRcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcGt0LT5oYW5kbGUsIHNwLCBzcC0+c3RhdGUpKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkNvbW1hbmQgaXMgTlVMTDogYWxyZWFkeSByZXR1cm5lZCB0byBPUyAoc3A9JXApXG4iLCBzcCk7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChoYS0+YWN0dGhyZWFkcykKKwkJaGEtPmFjdHRocmVhZHMtLTsKKworCWlmIChzcC0+bHVuX3F1ZXVlID09IE5VTEwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBTdGF0dXMgRW50cnkgaW52YWxpZCBsdW4gcG9pbnRlci5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiU3RhdHVzIEVudHJ5IGludmFsaWQgbHVuIHBvaW50ZXIuXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJaWYgKGhhLT5kcGNfd2FpdCAmJiAhaGEtPmRwY19hY3RpdmUpIAorCQkJdXAoaGEtPmRwY193YWl0KTsKKworCQlyZXR1cm47CisJfQorCisJc3AtPmx1bl9xdWV1ZS0+b3V0X2NudC0tOworCisJY29tcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShwa3QtPmNvbXBfc3RhdHVzKTsKKwkvKiBNYXNrIG9mIHJlc2VydmVkIGJpdHMgMTItMTUsIGJlZm9yZSB3ZSBleGFtaW5lIHRoZSBzY3NpIHN0YXR1cyAqLworCXNjc2lfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT5zY3NpX3N0YXR1cykgJiBTU19NQVNLOworCWxzY3NpX3N0YXR1cyA9IHNjc2lfc3RhdHVzICYgU1RBVFVTX01BU0s7CisKKwlDTURfRU5UUllfU1RBVFVTKGNwKSA9IHBrdC0+ZW50cnlfc3RhdHVzOworCUNNRF9DT01QTF9TVEFUVVMoY3ApID0gY29tcF9zdGF0dXM7CisJQ01EX1NDU0lfU1RBVFVTKGNwKSA9IHNjc2lfc3RhdHVzOworCisJLyogR2VuZXJhdGUgTFUgcXVldWUgb24gY250cmwsIHRhcmdldCwgTFVOICovCisJYiA9IGNwLT5kZXZpY2UtPmNoYW5uZWw7CisJdCA9IGNwLT5kZXZpY2UtPmlkOworCWwgPSBjcC0+ZGV2aWNlLT5sdW4sCisKKwl0cSA9IHNwLT50Z3RfcXVldWU7CisJbHEgPSBzcC0+bHVuX3F1ZXVlOworCisJLyoKKwkgKiBJZiBsb29wIGlzIGluIHRyYW5zaWVudCBzdGF0ZSBSZXBvcnQgRElEX0JVU19CVVNZCisJICovCisJaWYgKChjb21wX3N0YXR1cyAhPSBDU19DT01QTEVURSB8fCBzY3NpX3N0YXR1cyAhPSAwKSkgeworCQlpZiAoIShzcC0+ZmxhZ3MgJiAoU1JCX0lPQ1RMIHwgU1JCX1RBUEUpKSAmJgorCQkgICAgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAorCQkJYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX1JFQURZKSkgeworCisJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZDolZDolZDolZCk6IExvb3AgTm90IFJlYWR5IC0gIgorCQkJICAgICJwaWQ9JWx4LlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgYiwgdCwgbCwgY3AtPnNlcmlhbF9udW1iZXIpKTsKKworCQkJcWxhMngwMF9leHRlbmRfdGltZW91dChjcCwgRVhURU5EX0NNRF9USU1FT1VUKTsKKwkJCWFkZF90b19yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIGFueSBGQ1AgdHJhbnNwb3J0IGVycm9ycy4gKi8KKwlpZiAoc2NzaV9zdGF0dXMgJiBTU19SRVNQT05TRV9JTkZPX0xFTl9WQUxJRCkgeworCQlyc3BfaW5mb19sZW4gPSBsZTE2X3RvX2NwdShwa3QtPnJzcF9pbmZvX2xlbik7CisJCWlmIChyc3BfaW5mb19sZW4gPiAzICYmIHBrdC0+cnNwX2luZm9bM10pIHsKKwkJCURFQlVHMihwcmludGsoInNjc2koJWxkOiVkOiVkOiVkKSBGQ1AgSS9PIHByb3RvY29sICIKKwkJCSAgICAiZmFpbHVyZSAoJXgvJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngpLi4uIgorCQkJICAgICJyZXRyeWluZyBjb21tYW5kXG4iLCBoYS0+aG9zdF9ubywgYiwgdCwgbCwKKwkJCSAgICByc3BfaW5mb19sZW4sIHBrdC0+cnNwX2luZm9bMF0sIHBrdC0+cnNwX2luZm9bMV0sCisJCQkgICAgcGt0LT5yc3BfaW5mb1syXSwgcGt0LT5yc3BfaW5mb1szXSwKKwkJCSAgICBwa3QtPnJzcF9pbmZvWzRdLCBwa3QtPnJzcF9pbmZvWzVdLAorCQkJICAgIHBrdC0+cnNwX2luZm9bNl0sIHBrdC0+cnNwX2luZm9bN10pKTsKKworCQkJY3AtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCWFkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIEJhc2VkIG9uIEhvc3QgYW5kIHNjc2kgc3RhdHVzIGdlbmVyYXRlIHN0YXR1cyBjb2RlIGZvciBMaW51eAorCSAqLworCXN3aXRjaCAoY29tcF9zdGF0dXMpIHsKKwljYXNlIENTX0NPTVBMRVRFOgorCQlpZiAoc2NzaV9zdGF0dXMgPT0gMCkgeworCQkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzY3NpX3N0YXR1cyAmIChTU19SRVNJRFVBTF9VTkRFUiB8IFNTX1JFU0lEVUFMX09WRVIpKSB7CisJCQlyZXNpZCA9IGxlMzJfdG9fY3B1KHBrdC0+cmVzaWR1YWxfbGVuZ3RoKTsKKwkJCWNwLT5yZXNpZCA9IHJlc2lkOworCQkJQ01EX1JFU0lEX0xFTihjcCkgPSByZXNpZDsKKwkJfQorCQlpZiAobHNjc2lfc3RhdHVzID09IFNTX0JVU1lfQ09ORElUSU9OKSB7CisJCQljcC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2IHwgbHNjc2lfc3RhdHVzOworCQkJYnJlYWs7CisJCX0KKworCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgbHNjc2lfc3RhdHVzOworCisJCWlmIChsc2NzaV9zdGF0dXMgIT0gU1NfQ0hFQ0tfQ09ORElUSU9OKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogQ29weSBTZW5zZSBEYXRhIGludG8gc2Vuc2UgYnVmZmVyCisJCSAqLworCQltZW1zZXQoY3AtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNwLT5zZW5zZV9idWZmZXIpKTsKKworCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNTX1NFTlNFX0xFTl9WQUxJRCkpCisJCQlicmVhazsKKworCQlpZiAobGUxNl90b19jcHUocGt0LT5yZXFfc2Vuc2VfbGVuZ3RoKSA8CisJCSAgICBzaXplb2YoY3AtPnNlbnNlX2J1ZmZlcikpCisJCQlzZW5zZV9zeiA9IGxlMTZfdG9fY3B1KHBrdC0+cmVxX3NlbnNlX2xlbmd0aCk7CisJCWVsc2UKKwkJCXNlbnNlX3N6ID0gc2l6ZW9mKGNwLT5zZW5zZV9idWZmZXIpOworCisJCUNNRF9BQ1RVQUxfU05TTEVOKGNwKSA9IHNlbnNlX3N6OworCQlzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggPSBzZW5zZV9zejsKKwkJc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyID0gY3AtPnNlbnNlX2J1ZmZlcjsKKworCQlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID4gMzIpCisJCQlzZW5zZV9zeiA9IDMyOworCisJCW1lbWNweShjcC0+c2Vuc2VfYnVmZmVyLCBwa3QtPnJlcV9zZW5zZV9kYXRhLCBzZW5zZV9zeik7CisKKwkJc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyICs9IHNlbnNlX3N6OworCQlzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggLT0gc2Vuc2Vfc3o7CisJCWlmIChzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggIT0gMCkKKwkJCWhhLT5zdGF0dXNfc3JiID0gc3A7CisKKwkJaWYgKCEoc3AtPmZsYWdzICYgKFNSQl9JT0NUTCB8IFNSQl9UQVBFKSkgJiYKKwkJICAgIHFsYTJ4MDBfY2hlY2tfc2Vuc2UoY3AsIGxxKSA9PSBRTEFfU1VDQ0VTUykgeworCQkJLyogVGhyb3cgYXdheSBzdGF0dXNfY29udCBpZiBhbnkgKi8KKwkJCWhhLT5zdGF0dXNfc3JiID0gTlVMTDsKKwkJCWFkZF90b19zY3NpX3JldHJ5X3F1ZXVlKGhhLCBzcCk7CisJCQlyZXR1cm47CisJCX0KKworCQlERUJVRzUocHJpbnRrKCIlcygpOiBDaGVjayBjb25kaXRpb24gU2Vuc2UgZGF0YSwgIgorCQkgICAgInNjc2koJWxkOiVkOiVkOiVkKSBjbWQ9JXAgcGlkPSVsZFxuIiwKKwkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgYiwgdCwgbCwgY3AsCisJCSAgICBjcC0+c2VyaWFsX251bWJlcikpOworCQlpZiAoc2Vuc2Vfc3opCisJCQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcihjcC0+c2Vuc2VfYnVmZmVyLAorCQkJICAgIENNRF9BQ1RVQUxfU05TTEVOKGNwKSkpOworCQlicmVhazsKKworCWNhc2UgQ1NfREFUQV9VTkRFUlJVTjoKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZDolZDolZCkgVU5ERVJSVU4gc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgdCwgbCwgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CisKKwkJcmVzaWQgPSBsZTMyX3RvX2NwdShwa3QtPnJlc2lkdWFsX2xlbmd0aCk7CisJCWlmIChzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSKSB7CisJCQljcC0+cmVzaWQgPSByZXNpZDsKKwkJCUNNRF9SRVNJRF9MRU4oY3ApID0gcmVzaWQ7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgU0NTSSBTdGF0dXMgaXMgbm9uIHplcm8uIElmIHNvIHJlcG9ydCBTQ1NJIAorCQkgKiBTdGF0dXMuCisJCSAqLworCQlpZiAobHNjc2lfc3RhdHVzICE9IDApIHsKKwkJCWlmIChsc2NzaV9zdGF0dXMgPT0gU1NfQlVTWV9DT05ESVRJT04pIHsKKwkJCQljcC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2IHwKKwkJCQkgICAgbHNjc2lfc3RhdHVzOworCQkJCWJyZWFrOworCQkJfQorCisJCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgbHNjc2lfc3RhdHVzOworCisJCQlpZiAobHNjc2lfc3RhdHVzICE9IFNTX0NIRUNLX0NPTkRJVElPTikKKwkJCQlicmVhazsKKworCQkJLyogQ29weSBTZW5zZSBEYXRhIGludG8gc2Vuc2UgYnVmZmVyICovCisJCQltZW1zZXQoY3AtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKGNwLT5zZW5zZV9idWZmZXIpKTsKKworCQkJaWYgKCEoc2NzaV9zdGF0dXMgJiBTU19TRU5TRV9MRU5fVkFMSUQpKQorCQkJCWJyZWFrOworCisJCQlpZiAobGUxNl90b19jcHUocGt0LT5yZXFfc2Vuc2VfbGVuZ3RoKSA8CisJCQkgICAgc2l6ZW9mKGNwLT5zZW5zZV9idWZmZXIpKQorCQkJCXNlbnNlX3N6ID0gbGUxNl90b19jcHUocGt0LT5yZXFfc2Vuc2VfbGVuZ3RoKTsKKwkJCWVsc2UKKwkJCQlzZW5zZV9zeiA9IHNpemVvZihjcC0+c2Vuc2VfYnVmZmVyKTsKKworCQkJQ01EX0FDVFVBTF9TTlNMRU4oY3ApID0gc2Vuc2Vfc3o7CisJCQlzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggPSBzZW5zZV9zejsKKwkJCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciA9IGNwLT5zZW5zZV9idWZmZXI7CisKKwkJCWlmIChzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggPiAzMikgCisJCQkJc2Vuc2Vfc3ogPSAzMjsKKworCQkJbWVtY3B5KGNwLT5zZW5zZV9idWZmZXIsIHBrdC0+cmVxX3NlbnNlX2RhdGEsIHNlbnNlX3N6KTsKKworCQkJc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyICs9IHNlbnNlX3N6OworCQkJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoIC09IHNlbnNlX3N6OworCQkJaWYgKHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAhPSAwKQorCQkJCWhhLT5zdGF0dXNfc3JiID0gc3A7CisKKwkJCWlmICghKHNwLT5mbGFncyAmIChTUkJfSU9DVEwgfCBTUkJfVEFQRSkpICYmCisJCQkgICAgKHFsYTJ4MDBfY2hlY2tfc2Vuc2UoY3AsIGxxKSA9PSBRTEFfU1VDQ0VTUykpIHsKKwkJCQloYS0+c3RhdHVzX3NyYiA9IE5VTEw7CisJCQkJYWRkX3RvX3Njc2lfcmV0cnlfcXVldWUoaGEsIHNwKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlERUJVRzUocHJpbnRrKCIlcygpOiBDaGVjayBjb25kaXRpb24gU2Vuc2UgZGF0YSwgIgorCQkJICAgICJzY3NpKCVsZDolZDolZDolZCkgY21kPSVwIHBpZD0lbGRcbiIsCisJCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vLCBiLCB0LCBsLCBjcCwKKwkJCSAgICBjcC0+c2VyaWFsX251bWJlcikpOworCQkJaWYgKHNlbnNlX3N6KQorCQkJCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKGNwLT5zZW5zZV9idWZmZXIsCisJCQkJICAgIENNRF9BQ1RVQUxfU05TTEVOKGNwKSkpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIFJJU0MgcmVwb3J0cyB1bmRlcnJ1biBhbmQgdGFyZ2V0IGRvZXMgbm90IHJlcG9ydAorCQkJICogaXQgdGhlbiB3ZSBtdXN0IGhhdmUgYSBsb3N0IGZyYW1lLCBzbyB0ZWxsIHVwcGVyCisJCQkgKiBsYXllciB0byByZXRyeSBpdCBieSByZXBvcnRpbmcgYSBidXMgYnVzeS4KKwkJCSAqLworCQkJaWYgKCEoc2NzaV9zdGF0dXMgJiBTU19SRVNJRFVBTF9VTkRFUikpIHsKKwkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZDolZDolZDolZCkgRHJvcHBlZCAiCisJCQkJICAgICJmcmFtZShzKSBkZXRlY3RlZCAoJXggb2YgJXggYnl0ZXMpLi4uIgorCQkJCSAgICAicmV0cnlpbmcgY29tbWFuZC5cbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLCBiLCB0LCBsLCByZXNpZCwKKwkJCQkgICAgY3AtPnJlcXVlc3RfYnVmZmxlbikpOworCisJCQkJY3AtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCQloYS0+ZHJvcHBlZF9mcmFtZV9lcnJvcl9jbnQrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogSGFuZGxlIG1pZC1sYXllciB1bmRlcmZsb3cgKi8KKwkJCWlmICgodW5zaWduZWQpKGNwLT5yZXF1ZXN0X2J1ZmZsZW4gLSByZXNpZCkgPAorCQkJICAgIGNwLT51bmRlcmZsb3cpIHsKKwkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAgICJzY3NpKCVsZDolZDolZDolZCk6IE1pZC1sYXllciB1bmRlcmZsb3cgIgorCQkJCSAgICAiZGV0ZWN0ZWQgKCV4IG9mICV4IGJ5dGVzKS4uLnJldHVybmluZyAiCisJCQkJICAgICJlcnJvciBzdGF0dXMuXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubywgYiwgdCwgbCwgcmVzaWQsCisJCQkJICAgIGNwLT5yZXF1ZXN0X2J1ZmZsZW4pOworCisJCQkJY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogRXZlcnlib2R5IG9ubGluZSwgbG9va2luZyBnb29kLi4uICovCisJCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19EQVRBX09WRVJSVU46CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBPVkVSUlVOIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXhcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgdCwgbCwgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzKSk7CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAiQ0RCOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwKKwkJICAgIGNwLT5jbW5kWzBdLCBjcC0+Y21uZFsxXSwgY3AtPmNtbmRbMl0sIGNwLT5jbW5kWzNdLAorCQkgICAgY3AtPmNtbmRbNF0sIGNwLT5jbW5kWzVdKSk7CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAiUElEPTB4JWx4IHJlcT0weCV4IHh0cmE9MHgleCAtLSByZXR1cm5pbmcgRElEX0VSUk9SICIKKwkJICAgICJzdGF0dXMhXG4iLAorCQkgICAgY3AtPnNlcmlhbF9udW1iZXIsIGNwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCSAgICBsZTMyX3RvX2NwdShwa3QtPnJlc2lkdWFsX2xlbmd0aCkpKTsKKworCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlicmVhazsKKworCWNhc2UgQ1NfUE9SVF9MT0dHRURfT1VUOgorCWNhc2UgQ1NfUE9SVF9DT05GSUdfQ0hHOgorCWNhc2UgQ1NfUE9SVF9CVVNZOgorCWNhc2UgQ1NfSU5DT01QTEVURToKKwljYXNlIENTX1BPUlRfVU5BVkFJTEFCTEU6CisJCS8qCisJCSAqIElmIHRoZSBwb3J0IGlzIGluIFRhcmdldCBEb3duIHN0YXRlLCByZXR1cm4gYWxsIElPcyBmb3IgdGhpcworCQkgKiBUYXJnZXQgd2l0aCBESURfTk9fQ09OTkVDVCBFTFNFIFF1ZXVlIHRoZSBJT3MgaW4gdGhlCisJCSAqIHJldHJ5X3F1ZXVlLgorCQkgKi8KKwkJZmNwb3J0ID0gc3AtPmZjbHVuLT5mY3BvcnQ7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkOiVkOiVkKTogc3RhdHVzX2VudHJ5OiBQb3J0IERvd24gIgorCQkgICAgInBpZD0lbGQsIGNvbXBsIHN0YXR1cz0weCV4LCBwb3J0IHN0YXRlPTB4JXhcbiIsCisJCSAgICBoYS0+aG9zdF9ubywgdCwgbCwgY3AtPnNlcmlhbF9udW1iZXIsIGNvbXBfc3RhdHVzLAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpKSk7CisKKwkJaWYgKChzcC0+ZmxhZ3MgJiAoU1JCX0lPQ1RMIHwgU1JCX1RBUEUpKSB8fAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19ERVZJQ0VfREVBRCkgeworCQkJY3AtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSAKKwkJCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9MT09QOworCQkJZWxzZQorCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisJCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCQl9IGVsc2UgeworCQkJcWxhMngwMF9leHRlbmRfdGltZW91dChjcCwgRVhURU5EX0NNRF9USU1FT1VUKTsKKwkJCWFkZF90b19yZXRyeV9xdWV1ZShoYSwgc3ApOworCQl9CisKKwkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfT05MSU5FKSB7CisJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoaGEsIGZjcG9ydCwgMSk7CisJCX0KKworCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBDU19SRVNFVDoKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZCk6IFJFU0VUIHN0YXR1cyBkZXRlY3RlZCAweCV4LTB4JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCisJCWlmIChzcC0+ZmxhZ3MgJiAoU1JCX0lPQ1RMIHwgU1JCX1RBUEUpKSB7CisJCQljcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQl9IGVsc2UgeworCQkJcWxhMngwMF9leHRlbmRfdGltZW91dChjcCwgRVhURU5EX0NNRF9USU1FT1VUKTsKKwkJCWFkZF90b19yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19BQk9SVEVEOgorCQkvKiAKKwkJICogaHYyLjE5LjEyIC0gRElEX0FCT1JUIGRvZXMgbm90IHJldHJ5IHRoZSByZXF1ZXN0IGlmIHdlCisJCSAqIGFib3J0ZWQgdGhpcyByZXF1ZXN0IHRoZW4gYWJvcnQgb3RoZXJ3aXNlIGl0IG11c3QgYmUgYQorCQkgKiByZXNldC4KKwkJICovCisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAic2NzaSglbGQpOiBBQk9SVCBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKworCQljcC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQlicmVhazsKKworCWNhc2UgQ1NfVElNRU9VVDoKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICJzY3NpKCVsZDolZDolZDolZCk6IFRJTUVPVVQgc3RhdHVzIGRldGVjdGVkIDB4JXgtMHgleCAiCisJCSAgICAic2ZsYWdzPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIGIsIHQsIGwsIGNvbXBfc3RhdHVzLAorCQkgICAgc2NzaV9zdGF0dXMsIGxlMTZfdG9fY3B1KHBrdC0+c3RhdHVzX2ZsYWdzKSkpOworCisJCWNwLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisKKwkJZmNwb3J0ID0gbHEtPmZjbHVuLT5mY3BvcnQ7CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIGxvZ291dCBvY2N1cnJlZCAqLworCQlpZiAoKGxlMTZfdG9fY3B1KHBrdC0+c3RhdHVzX2ZsYWdzKSAmIFNGX0xPR09VVF9TRU5UKSkgeworCQkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KGhhLCBmY3BvcnQsIDEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19RVUVVRV9GVUxMOgorCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTworCQkgICAgInNjc2koJWxkKTogUVVFVUUgRlVMTCBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKKworCQkvKiBTQ1NJIE1pZC1MYXllciBoYW5kbGVzIGRldmljZSBxdWV1ZSBmdWxsICovCisKKwkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGxzY3NpX3N0YXR1czsgCisKKwkJLyogVE9ETzogPz8/ICovCisJCS8qIEFkanVzdCBxdWV1ZSBkZXB0aCAqLworCQlyZXQgPSBzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoY3AtPmRldmljZSwKKwkJICAgIHNwLT5sdW5fcXVldWUtPm91dF9jbnQgLSAxKTsKKwkJaWYgKHJldCkgeworCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgICJzY3NpKCVsZDolZDolZDolZCk6IFF1ZXVlIGRlcHRoIGFkanVzdGVkIHRvICVkLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+Y2hhbm5lbCwgY3AtPmRldmljZS0+aWQsCisJCQkgICAgY3AtPmRldmljZS0+bHVuLCByZXQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBFcnJvciBkZXRlY3RlZCAodW5rbm93biBzdGF0dXMpICIKKwkJICAgICIweCV4LTB4JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiVW5rbm93biBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKKwkJICAgIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cyk7CisKKwkJY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJYnJlYWs7CisJfQorCisJLyogUGxhY2UgY29tbWFuZCBvbiBkb25lIHF1ZXVlLiAqLworCWlmIChoYS0+c3RhdHVzX3NyYiA9PSBOVUxMKQorCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworfQorCisvKioKKyAqIHFsYTJ4MDBfc3RhdHVzX2NvbnRfZW50cnkoKSAtIFByb2Nlc3MgYSBTdGF0dXMgQ29udGludWF0aW9ucyBlbnRyeS4KKyAqIEBoYTogU0NTSSBkcml2ZXIgSEEgY29udGV4dAorICogQHBrdDogRW50cnkgcG9pbnRlcgorICoKKyAqIEV4dGVuZGVkIHNlbnNlIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX3N0YXR1c19jb250X2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0c19jb250X2VudHJ5X3QgKnBrdCkKK3sKKwl1aW50OF90CQlzZW5zZV9zeiA9IDA7CisJc3JiX3QJCSpzcCA9IGhhLT5zdGF0dXNfc3JiOworCXN0cnVjdCBzY3NpX2NtbmQgKmNwOworCisJaWYgKHNwICE9IE5VTEwgJiYgc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoICE9IDApIHsKKwkJY3AgPSBzcC0+Y21kOworCQlpZiAoY3AgPT0gTlVMTCkgeworCQkJREVCVUcyKHByaW50aygiJXMoKTogQ21kIGFscmVhZHkgcmV0dXJuZWQgYmFjayB0byBPUyAiCisJCQkgICAgInNwPSVwIHNwLT5zdGF0ZTolZFxuIiwgX19mdW5jX18sIHNwLCBzcC0+c3RhdGUpKTsKKwkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICAiY21kIGlzIE5VTEw6IGFscmVhZHkgcmV0dXJuZWQgdG8gT1MgKHNwPSVwKVxuIiwKKwkJCSAgICBzcCk7IAorCisJCQloYS0+c3RhdHVzX3NyYiA9IE5VTEw7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoID4gc2l6ZW9mKHBrdC0+ZGF0YSkpIHsKKwkJCXNlbnNlX3N6ID0gc2l6ZW9mKHBrdC0+ZGF0YSk7CisJCX0gZWxzZSB7CisJCQlzZW5zZV9zeiA9IHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aDsKKwkJfQorCisJCS8qIE1vdmUgc2Vuc2UgZGF0YS4gKi8KKwkJbWVtY3B5KHNwLT5yZXF1ZXN0X3NlbnNlX3B0ciwgcGt0LT5kYXRhLCBzZW5zZV9zeik7CisJCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKHNwLT5yZXF1ZXN0X3NlbnNlX3B0ciwgc2Vuc2Vfc3opKTsKKworCQlzcC0+cmVxdWVzdF9zZW5zZV9wdHIgKz0gc2Vuc2Vfc3o7CisJCXNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAtPSBzZW5zZV9zejsKKworCQkvKiBQbGFjZSBjb21tYW5kIG9uIGRvbmUgcXVldWUuICovCisJCWlmIChzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggPT0gMCkgeworCQkJYWRkX3RvX2RvbmVfcXVldWUoaGEsIHNwKTsKKwkJCWhhLT5zdGF0dXNfc3JiID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiBxbGEyeDAwX2Vycm9yX2VudHJ5KCkgLSBQcm9jZXNzIGFuIGVycm9yIGVudHJ5LgorICogQGhhOiBTQ1NJIGRyaXZlciBIQSBjb250ZXh0CisgKiBAcGt0OiBFbnRyeSBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX2Vycm9yX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0c19lbnRyeV90ICpwa3QpIAoreworCXNyYl90ICpzcDsKKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKKwlpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBSRl9JTlZfRV9PUkRFUikKKwkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogSW52YWxpZCBFbnRyeSBPcmRlclxuIiwgX19mdW5jX18pOworCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfQ09VTlQpCisJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEludmFsaWQgRW50cnkgQ291bnRcbiIsIF9fZnVuY19fKTsKKwllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX1BBUkFNKQorCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgCisJCSAgICAiJXM6IEludmFsaWQgRW50cnkgUGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7CisJZWxzZSBpZiAocGt0LT5lbnRyeV9zdGF0dXMgJiBSRl9JTlZfRV9UWVBFKQorCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBJbnZhbGlkIEVudHJ5IFR5cGVcbiIsIF9fZnVuY19fKTsKKwllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0JVU1kpCisJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEJ1c3lcbiIsIF9fZnVuY19fKTsKKwllbHNlCisJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IFVOS05PV04gZmxhZyBlcnJvclxuIiwgX19mdW5jX18pOworI2VuZGlmCisKKwkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCisJaWYgKHBrdC0+aGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlXTsKKwllbHNlCisJCXNwID0gTlVMTDsKKworCWlmIChzcCkgeworCQkvKiBGcmVlIG91dHN0YW5kaW5nIGNvbW1hbmQgc2xvdC4gKi8KKwkJaGEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdID0gTlVMTDsKKwkJaWYgKGhhLT5hY3R0aHJlYWRzKQorCQkJaGEtPmFjdHRocmVhZHMtLTsKKwkJc3AtPmx1bl9xdWV1ZS0+b3V0X2NudC0tOworCisJCS8qIEJhZCBwYXlsb2FkIG9yIGhlYWRlciAqLworCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgJgorCQkgICAgKFJGX0lOVl9FX09SREVSIHwgUkZfSU5WX0VfQ09VTlQgfAorCQkgICAgIFJGX0lOVl9FX1BBUkFNIHwgUkZfSU5WX0VfVFlQRSkpIHsKKwkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJfSBlbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0JVU1kpIHsKKwkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJfSBlbHNlIHsKKwkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJfQorCQkvKiBQbGFjZSBjb21tYW5kIG9uIGRvbmUgcXVldWUuICovCisJCWFkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisKKwl9IGVsc2UgaWYgKHBrdC0+ZW50cnlfdHlwZSA9PSBDT01NQU5EX0E2NF9UWVBFIHx8CisJICAgIHBrdC0+ZW50cnlfdHlwZSA9PSBDT01NQU5EX1RZUEUpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBFcnJvciBlbnRyeSAtIGludmFsaWQgaGFuZGxlXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkVycm9yIGVudHJ5IC0gaW52YWxpZCBoYW5kbGVcbiIpOworCisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlpZiAoaGEtPmRwY193YWl0ICYmICFoYS0+ZHBjX2FjdGl2ZSkgCisJCQl1cChoYS0+ZHBjX3dhaXQpOworCX0KK30KKworLyoqCisgKiBxbGEyeDAwX21zX2VudHJ5KCkgLSBQcm9jZXNzIGEgTWFuYWdlbWVudCBTZXJ2ZXIgZW50cnkuCisgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKKyAqIEBpbmRleDogUmVzcG9uc2UgcXVldWUgb3V0IHBvaW50ZXIKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfbXNfZW50cnkoc2NzaV9xbGFfaG9zdF90ICpoYSwgbXNfaW9jYl9lbnRyeV90ICpwa3QpIAoreworCXNyYl90ICAgICAgICAgICpzcDsKKworCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IHBrdD0lcCBwa3RoYW5kbGU9JWQuXG4iLAorCSAgICBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHBrdCwgcGt0LT5oYW5kbGUxKSk7CisKKwkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCisgCWlmIChwa3QtPmhhbmRsZTEgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpCisgCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW3BrdC0+aGFuZGxlMV07CisJZWxzZQorCQlzcCA9IE5VTEw7CisKKwlpZiAoc3AgPT0gTlVMTCkgeworCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IE1TIGVudHJ5IC0gaW52YWxpZCBoYW5kbGVcbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJNUyBlbnRyeSAtIGludmFsaWQgaGFuZGxlXG4iKTsKKworCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCUNNRF9DT01QTF9TVEFUVVMoc3AtPmNtZCkgPSBsZTE2X3RvX2NwdShwa3QtPnN0YXR1cyk7CisJQ01EX0VOVFJZX1NUQVRVUyhzcC0+Y21kKSA9IHBrdC0+ZW50cnlfc3RhdHVzOworCisJLyogRnJlZSBvdXRzdGFuZGluZyBjb21tYW5kIHNsb3QuICovCisJaGEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGUxXSA9IE5VTEw7CisKKwlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworfQorCisvKioKKyAqIHFsYTJ4MDBfY2hlY2tfc2Vuc2UoKSAtIFBlcmZvcm0gYW55IHNlbnNlIGRhdGEgaW50ZXJyb2dhdGlvbi4KKyAqIEBjcDogU0NTSSBDb21tYW5kCisgKiBAbHE6IEx1biBxdWV1ZQorICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgdGhlIGx1biBxdWV1ZSBpcyBzdXNwZW5kZWQsIGVsc2UKKyAqIFFMQV9GVU5DVElPTl9GQUlMRUQgIChsdW4gcXVldWUgbm90IHN1c3BlbmRlZCkuCisgKi8KK3N0YXRpYyBpbnQgCitxbGEyeDAwX2NoZWNrX3NlbnNlKHN0cnVjdCBzY3NpX2NtbmQgKmNwLCBvc19sdW5fdCAqbHEpCit7CisJc2NzaV9xbGFfaG9zdF90CSpoYTsKKwlzcmJfdAkJKnNwOworCWZjX3BvcnRfdAkqZmNwb3J0OworCisJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopIGNwLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWlmICgoY3AtPnNlbnNlX2J1ZmZlclswXSAmIDB4NzApICE9IDB4NzApIHsKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwl9CisKKwlzcCA9IChzcmJfdCAqIClDTURfU1AoY3ApOworCXNwLT5mbGFncyB8PSBTUkJfR09UX1NFTlNFOworCisJc3dpdGNoIChjcC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhmKSB7CisJY2FzZSBSRUNPVkVSRURfRVJST1I6CisJCWNwLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJCWNwLT5zZW5zZV9idWZmZXJbMF0gPSAwOworCQlicmVhazsKKworCWNhc2UgTk9UX1JFQURZOgorCQlmY3BvcnQgPSBscS0+ZmNsdW4tPmZjcG9ydDsKKworCQkvKgorCQkgKiBTdXNwZW5kIHRoZSBsdW4gb25seSBmb3IgaGFyZCBkaXNrIGRldmljZSB0eXBlLgorCQkgKi8KKwkJaWYgKChmY3BvcnQtPmZsYWdzICYgRkNGX1RBUEVfUFJFU0VOVCkgPT0gMCAmJgorCQkgICAgbHEtPnFfc3RhdGUgIT0gTFVOX1NUQVRFX1RJTUVPVVQpIHsKKwkJCS8qCisJCQkgKiBJZiB0YXJnZXQgaXMgaW4gcHJvY2VzcyBvZiBiZWluZyByZWFkeSB0aGVuIHN1c3BlbmQKKwkJCSAqIGx1biBmb3IgNiBzZWNzIGFuZCByZXRyeSBhbGwgdGhlIGNvbW1hbmRzLgorCQkJICovCisJCQlpZiAoY3AtPnNlbnNlX2J1ZmZlclsxMl0gPT0gMHg0ICYmCisJCQkgICAgY3AtPnNlbnNlX2J1ZmZlclsxM10gPT0gMHgxKSB7CisKKwkJCQkvKiBTdXNwZW5kIHRoZSBsdW4gZm9yIDYgc2VjcyAqLworCQkJCXFsYTJ4MDBfc3VzcGVuZF9sdW4oaGEsIGxxLCA2LAorCQkJCSAgICBxbDJ4c3VzcGVuZGNvdW50KTsKKworCQkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbGlzdG9wcy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2xpc3RvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEwMzRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2xpc3RvcHMuaApAQCAtMCwwICsxLDM1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBRTE9HSUMgTElOVVggU09GVFdBUkUKKyAqCisgKiBRTG9naWMgSVNQMngwMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYueAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiAod3d3LnFsb2dpYy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1hbmFnZW1lbnQgZnVuY3Rpb25zIGZvciB2YXJpb3VzIGxpc3RzICovCisKKy8qIF9fYWRkX3RvX2RvbmVfcXVldWUoKQorICogCisgKiBQbGFjZSBTUkIgY29tbWFuZCBvbiBkb25lIHF1ZXVlLgorICoKKyAqIElucHV0OgorICogICAgICBoYSAgICAgICAgICAgPSBob3N0IHBvaW50ZXIKKyAqICAgICAgc3AgICAgICAgICAgID0gc3JiIHBvaW50ZXIuCisgKiBMb2NraW5nOgorICogCXRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgaGEtPmxpc3RfbG9jayBpcyBhbHJlYWR5IHRha2VuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAKK19fYWRkX3RvX2RvbmVfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKwkvKgorICAgICAgICBpZiAoc3AtPnN0YXRlICE9IFNSQl9OT19RVUVVRV9TVEFURSAmJiAKKyAgICAgICAgCXNwLT5zdGF0ZSAhPSBTUkJfQUNUSVZFX1NUQVRFKQorCQlCVUcoKTsKKwkqLworCisgICAgICAgIC8qIFBsYWNlIGJsb2NrIG9uIGRvbmUgcXVldWUgKi8KKyAgICAgICAgc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopIE5VTEw7CisgICAgICAgIHNwLT5zdGF0ZSA9IFNSQl9ET05FX1NUQVRFOworICAgICAgICBsaXN0X2FkZF90YWlsKCZzcC0+bGlzdCwmaGEtPmRvbmVfcXVldWUpOworICAgICAgICBoYS0+ZG9uZV9xX2NudCsrOworCXNwLT5oYSA9IGhhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2FkZF90b19yZXRyeV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworCS8qCisgICAgICAgIGlmKCBzcC0+c3RhdGUgIT0gU1JCX05PX1FVRVVFX1NUQVRFICYmIAorICAgICAgICAJc3AtPnN0YXRlICE9IFNSQl9BQ1RJVkVfU1RBVEUpCisJCUJVRygpOworCSovCisKKyAgICAgICAgLyogUGxhY2UgYmxvY2sgb24gcmV0cnkgcXVldWUgKi8KKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmc3AtPmxpc3QsJmhhLT5yZXRyeV9xdWV1ZSk7CisgICAgICAgIGhhLT5yZXRyeV9xX2NudCsrOworICAgICAgICBzcC0+ZmxhZ3MgfD0gU1JCX1dBVENIRE9HOworICAgICAgICBzcC0+c3RhdGUgPSBTUkJfUkVUUllfU1RBVEU7CisJc3AtPmhhID0gaGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK19fYWRkX3RvX3Njc2lfcmV0cnlfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKwkvKgorICAgICAgICBpZiggc3AtPnN0YXRlICE9IFNSQl9OT19RVUVVRV9TVEFURSAmJiAKKyAgICAgICAgCXNwLT5zdGF0ZSAhPSBTUkJfQUNUSVZFX1NUQVRFKQorCQlCVUcoKTsKKwkqLworCisgICAgICAgIC8qIFBsYWNlIGJsb2NrIG9uIHJldHJ5IHF1ZXVlICovCisgICAgICAgIGxpc3RfYWRkX3RhaWwoJnNwLT5saXN0LCZoYS0+c2NzaV9yZXRyeV9xdWV1ZSk7CisgICAgICAgIGhhLT5zY3NpX3JldHJ5X3FfY250Kys7CisgICAgICAgIHNwLT5zdGF0ZSA9IFNSQl9TQ1NJX1JFVFJZX1NUQVRFOworCXNwLT5oYSA9IGhhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCithZGRfdG9fZG9uZV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisgICAgICAgIF9fYWRkX3RvX2RvbmVfcXVldWUoaGEsc3ApOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK2FkZF90b19mcmVlX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisJbWVtcG9vbF9mcmVlKHNwLCBoYS0+c3JiX21lbXBvb2wpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCithZGRfdG9fcmV0cnlfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworICAgICAgICBfX2FkZF90b19yZXRyeV9xdWV1ZShoYSxzcCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIAorYWRkX3RvX3Njc2lfcmV0cnlfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworICAgICAgICBfX2FkZF90b19zY3NpX3JldHJ5X3F1ZXVlKGhhLHNwKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogX19kZWxfZnJvbV9yZXRyeV9xdWV1ZQorICogICAgICBGdW5jdGlvbiB1c2VkIHRvIHJlbW92ZSBhIGNvbW1hbmQgYmxvY2sgZnJvbSB0aGUKKyAqICAgICAgd2F0Y2hkb2cgdGltZXIgcXVldWUuCisgKgorICogICAgICBOb3RlOiBNdXN0IGluc3VyZSB0aGF0IGNvbW1hbmQgaXMgb24gd2F0Y2hkb2cKKyAqICAgICAgICAgICAgbGlzdCBiZWZvcmUgY2FsbGluZyBkZWxfZnJvbV9yZXRyeV9xdWV1ZQorICogICAgICAgICAgICBpZiAoc3AtPmZsYWdzICYgU1JCX1dBVENIRE9HKQorICoKKyAqIElucHV0OiAKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIHNwID0gc3JiIHBvaW50ZXIuCisgKiBMb2NraW5nOgorICoJdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBsaXN0X2xvY2sgaXMgYWxyZWFkeSB0YWtlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2RlbF9mcm9tX3JldHJ5X3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIGxpc3RfZGVsX2luaXQoJnNwLT5saXN0KTsKKworICAgICAgICBzcC0+ZmxhZ3MgJj0gfihTUkJfV0FUQ0hET0cgfCBTUkJfQlVTWSk7CisgICAgICAgIHNwLT5zdGF0ZSA9IFNSQl9OT19RVUVVRV9TVEFURTsKKyAgICAgICAgaGEtPnJldHJ5X3FfY250LS07Cit9CisKKy8qCisgKiBfX2RlbF9mcm9tX3Njc2lfcmV0cnlfcXVldWUKKyAqICAgICAgRnVuY3Rpb24gdXNlZCB0byByZW1vdmUgYSBjb21tYW5kIGJsb2NrIGZyb20gdGhlCisgKiAgICAgIHNjc2kgcmV0cnkgcXVldWUuCisgKgorICogSW5wdXQ6IAorICogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICAgICAgc3AgPSBzcmIgcG9pbnRlci4KKyAqIExvY2tpbmc6CisgKgl0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGxpc3RfbG9jayBpcyBhbHJlYWR5IHRha2VuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAKK19fZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworICAgICAgICBsaXN0X2RlbF9pbml0KCZzcC0+bGlzdCk7CisKKyAgICAgICAgaGEtPnNjc2lfcmV0cnlfcV9jbnQtLTsKKyAgICAgICAgc3AtPnN0YXRlID0gU1JCX05PX1FVRVVFX1NUQVRFOworfQorCisvKgorICogZGVsX2Zyb21fcmV0cnlfcXVldWUKKyAqICAgICAgRnVuY3Rpb24gdXNlZCB0byByZW1vdmUgYSBjb21tYW5kIGJsb2NrIGZyb20gdGhlCisgKiAgICAgIHdhdGNoZG9nIHRpbWVyIHF1ZXVlLgorICoKKyAqICAgICAgTm90ZTogTXVzdCBpbnN1cmUgdGhhdCBjb21tYW5kIGlzIG9uIHdhdGNoZG9nCisgKiAgICAgICAgICAgIGxpc3QgYmVmb3JlIGNhbGxpbmcgZGVsX2Zyb21fcmV0cnlfcXVldWUKKyAqICAgICAgICAgICAgaWYgKHNwLT5mbGFncyAmIFNSQl9XQVRDSERPRykKKyAqCisgKiBJbnB1dDogCisgKiAgICAgIGhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICogICAgICBzcCA9IHNyYiBwb2ludGVyLgorICogTG9ja2luZzoKKyAqCXRoaXMgZnVuY3Rpb24gdGFrZXMgYW5kIHJlbGVhc2VzIHRoZSBsaXN0X2xvY2sKKyAqLworc3RhdGljIGlubGluZSB2b2lkIAorZGVsX2Zyb21fcmV0cnlfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICAvKglpZiAodW5saWtlbHkoIShzcC0+ZmxhZ3MgJiBTUkJfV0FUQ0hET0cpKSkKKyAgICAgICAgCQlCVUcoKTsqLworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisgICAgICAgIC8qCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZoYS0+cmV0cnlfcXVldWUpKSkKKyAgICAgICAgCQlCVUcoKTsqLworCisgICAgICAgIF9fZGVsX2Zyb21fcmV0cnlfcXVldWUoaGEsc3ApOworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKy8qCisgKiBkZWxfZnJvbV9zY3NpX3JldHJ5X3F1ZXVlCisgKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gcmVtb3ZlIGEgY29tbWFuZCBibG9jayBmcm9tIHRoZQorICogICAgICBzY3NpIHJldHJ5IHF1ZXVlLgorICoKKyAqIElucHV0OiAKKyAqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgIHNwID0gc3JiIHBvaW50ZXIuCisgKiBMb2NraW5nOgorICoJdGhpcyBmdW5jdGlvbiB0YWtlcyBhbmQgcmVsZWFzZXMgdGhlIGxpc3RfbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgCitkZWxfZnJvbV9zY3NpX3JldHJ5X3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworICAgICAgICAvKglpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmaGEtPnNjc2lfcmV0cnlfcXVldWUpKSkKKyAgICAgICAgCQlCVUcoKTsqLworCisgICAgICAgIF9fZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZShoYSxzcCk7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogX19hZGRfdG9fcGVuZGluZ19xdWV1ZQorICogICAgICBBZGQgdGhlIHN0YW5kYXJkIFNDQiBqb2IgdG8gdGhlIGJvdHRvbSBvZiBzdGFuZGFyZCBTQ0IgY29tbWFuZHMuCisgKgorICogSW5wdXQ6CisgKiBDT01QTEVURSEhIQorICogICAgICBxICA9IFNDU0kgTFUgcG9pbnRlci4KKyAqICAgICAgc3AgPSBzcmIgcG9pbnRlci4KKyAqICAgICAgU0NTSV9MVV9RIGxvY2sgbXVzdCBiZSBhbHJlYWR5IG9idGFpbmVkLgorICovCitzdGF0aWMgaW5saW5lIGludCAKK19fYWRkX3RvX3BlbmRpbmdfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzcmJfdCAqIHNwKQoreworCWludAllbXB0eTsKKwkvKgorICAgICAgICBpZiggc3AtPnN0YXRlICE9IFNSQl9OT19RVUVVRV9TVEFURSAmJgorICAgICAgICAJc3AtPnN0YXRlICE9IFNSQl9GUkVFX1NUQVRFICYmCisgICAgICAgIAlzcC0+c3RhdGUgIT0gU1JCX0FDVElWRV9TVEFURSkKKwkJQlVHKCk7CisJKi8KKworCWVtcHR5ID0gbGlzdF9lbXB0eSgmaGEtPnBlbmRpbmdfcXVldWUpOworCWxpc3RfYWRkX3RhaWwoJnNwLT5saXN0LCAmaGEtPnBlbmRpbmdfcXVldWUpOworCWhhLT5xdGhyZWFkcysrOworCXNwLT5zdGF0ZSA9IFNSQl9QRU5ESU5HX1NUQVRFOworCisJcmV0dXJuIChlbXB0eSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK19fYWRkX3RvX3BlbmRpbmdfcXVldWVfaGVhZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHNyYl90ICogc3ApCit7CisJLyoKKyAgICAgICAgaWYoIHNwLT5zdGF0ZSAhPSBTUkJfTk9fUVVFVUVfU1RBVEUgJiYgCisgICAgICAgIAlzcC0+c3RhdGUgIT0gU1JCX0ZSRUVfU1RBVEUgJiYKKyAgICAgICAgCXNwLT5zdGF0ZSAhPSBTUkJfQUNUSVZFX1NUQVRFKQorCQlCVUcoKTsKKwkqLworCisJbGlzdF9hZGQoJnNwLT5saXN0LCAmaGEtPnBlbmRpbmdfcXVldWUpOworCWhhLT5xdGhyZWFkcysrOworCXNwLT5zdGF0ZSA9IFNSQl9QRU5ESU5HX1NUQVRFOworfQorCitzdGF0aWMgaW5saW5lIGludAorYWRkX3RvX3BlbmRpbmdfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzcmJfdCAqc3ApCit7CisJaW50CWVtcHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCWVtcHR5ID0gX19hZGRfdG9fcGVuZGluZ19xdWV1ZShoYSwgc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAoZW1wdHkpOworfQorc3RhdGljIGlubGluZSB2b2lkCithZGRfdG9fcGVuZGluZ19xdWV1ZV9oZWFkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3JiX3QgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCV9fYWRkX3RvX3BlbmRpbmdfcXVldWVfaGVhZChoYSwgc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2RlbF9mcm9tX3BlbmRpbmdfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzcmJfdCAqc3ApCit7CisJbGlzdF9kZWxfaW5pdCgmc3AtPmxpc3QpOworCWhhLT5xdGhyZWFkcy0tOworCXNwLT5zdGF0ZSA9IFNSQl9OT19RVUVVRV9TVEFURTsKK30KKworLyoKKyAqIEZhaWxvdmVyIFN0dWZmLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fYWRkX3RvX2ZhaWxvdmVyX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisJLyoKKyAgICAgICAgaWYoIHNwLT5zdGF0ZSAhPSBTUkJfTk9fUVVFVUVfU1RBVEUgJiYgCisgICAgICAgIAlzcC0+c3RhdGUgIT0gU1JCX0FDVElWRV9TVEFURSkKKwkJQlVHKCk7CisJKi8KKworICAgICAgICBsaXN0X2FkZF90YWlsKCZzcC0+bGlzdCwmaGEtPmZhaWxvdmVyX3F1ZXVlKTsKKyAgICAgICAgaGEtPmZhaWxvdmVyX2NudCsrOworICAgICAgICBzcC0+c3RhdGUgPSBTUkJfRkFJTE9WRVJfU1RBVEU7CisJc3AtPmhhID0gaGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdG9fZmFpbG92ZXJfcXVldWUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKiBzcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisgICAgICAgIF9fYWRkX3RvX2ZhaWxvdmVyX3F1ZXVlKGhhLHNwKTsKKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgX19kZWxfZnJvbV9mYWlsb3Zlcl9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqCisgICAgICAgICAgICAgICAgc3ApCit7CisgICAgICAgIGhhLT5mYWlsb3Zlcl9jbnQtLTsKKyAgICAgICAgbGlzdF9kZWxfaW5pdCgmc3AtPmxpc3QpOworICAgICAgICBzcC0+c3RhdGUgPSBTUkJfTk9fUVVFVUVfU1RBVEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxfZnJvbV9mYWlsb3Zlcl9xdWV1ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqIHNwKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgX19kZWxfZnJvbV9mYWlsb3Zlcl9xdWV1ZShoYSxzcCk7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgCitkZWxfZnJvbV9wZW5kaW5nX3F1ZXVlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICogc3ApCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworICAgICAgICBfX2RlbF9mcm9tX3BlbmRpbmdfcXVldWUoaGEsc3ApOworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDRmYmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC0wLDAgKzEsMTk1MCBAQAorLyoKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlICJxbGFfZGVmLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCitzdGF0aWMgdm9pZAorcWxhMngwMF9tYnhfc2VtX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzZW1hcGhvcmUJKnNlbV9wdHIgPSAoc3RydWN0IHNlbWFwaG9yZSAqKWRhdGE7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9zZW1fdGltZW91dDogZW50ZXJlZC5cbiIpOykKKworCWlmIChzZW1fcHRyICE9IE5VTEwpIHsKKwkJdXAoc2VtX3B0cik7CisJfQorCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWJ4X3NlbV90aW1lb3V0OiBleGl0aW5nLlxuIik7KQorfQorCisvKgorICogcWxhMngwMF9tYWlsYm94X2NvbW1hbmQKKyAqCUlzc3VlIG1haWxib3ggY29tbWFuZCBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24uCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCW1jcCA9IGRyaXZlciBpbnRlcm5hbCBtYnggc3RydWN0IHBvaW50ZXIuCisgKgorICogT3V0cHV0OgorICoJbWJbTUFYX01BSUxCT1hfUkVHSVNURVJfQ09VTlRdID0gcmV0dXJuZWQgbWFpbGJveCBkYXRhLgorICoKKyAqIFJldHVybnM6CisgKgkwIDogUUxBX1NVQ0NFU1MgPSBjbWQgcGVyZm9ybWVkIHN1Y2Nlc3MKKyAqCTEgOiBRTEFfRlVOQ1RJT05fRkFJTEVEICAgKGVycm9yIGVuY291bnRlcmVkKQorICoJNiA6IFFMQV9GVU5DVElPTl9USU1FT1VUICh0aW1lb3V0IGNvbmRpdGlvbiBlbmNvdW50ZXJlZCkKKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIG1ieF9jbWRfdCAqbWNwKQoreworCWludAkJcnZhbDsKKwl1bnNpZ25lZCBsb25nICAgIGZsYWdzID0gMDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0bXBfaW50cl90aW1lcjsKKwl1aW50OF90CQlhYm9ydF9hY3RpdmUgPSB0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJdWludDhfdAkJaW9fbG9ja19vbiA9IGhhLT5mbGFncy5pbml0X2RvbmU7CisJdWludDE2X3QJY29tbWFuZDsKKwl1aW50MTZfdAkqaXB0cjsKKwl1aW50MTZfdCBfX2lvbWVtICpvcHRyOworCXVpbnQzMl90CWNudDsKKwl1aW50MzJfdAltYm94ZXM7CisJdW5zaWduZWQgbG9uZwltYnhfZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcJd2FpdF90aW1lOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCS8qCisJICogV2FpdCBmb3IgYWN0aXZlIG1haWxib3ggY29tbWFuZHMgdG8gZmluaXNoIGJ5IHdhaXRpbmcgYXQgbW9zdAorCSAqIHRvdiBzZWNvbmRzLiBUaGlzIGlzIHRvIHNlcmlhbGl6ZSBhY3R1YWwgaXNzdWluZyBvZiBtYWlsYm94IGNtZHMKKwkgKiBkdXJpbmcgbm9uIElTUCBhYm9ydCB0aW1lLgorCSAqLworCWlmICghYWJvcnRfYWN0aXZlKSB7CisJCWlmIChxbGEyeDAwX2Rvd25fdGltZW91dCgmaGEtPm1ieF9jbWRfc2VtLCBtY3AtPnRvdiAqIEhaKSkgeworCQkJLyogVGltZW91dCBvY2N1cnJlZC4gUmV0dXJuIGVycm9yLiAqLworCQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiBjbWQgIgorCQkJICAgICJhY2Nlc3MgdGltZW91dC4gRXhpdGluZy5cbiIsIGhhLT5ob3N0X25vKTspCisJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJCX0KKwl9CisKKwloYS0+ZmxhZ3MubWJveF9idXN5ID0gMTsKKwkvKiBTYXZlIG1haWxib3ggY29tbWFuZCBmb3IgZGVidWcgKi8KKwloYS0+bWNwID0gbWNwOworCisJLyogVHJ5IHRvIGdldCBtYWlsYm94IHJlZ2lzdGVyIGFjY2VzcyAqLworCWlmICghYWJvcnRfYWN0aXZlKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPm1ieF9yZWdfbG9jaywgbWJ4X2ZsYWdzKTsKKworCURFQlVHMTEocHJpbnRrKCJzY3NpJWQ6IHByZXBhcmUgdG8gaXNzdWUgbWJveCBjbWQ9MHgleC5cbiIsCisJICAgIChpbnQpaGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pOykKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogTG9hZCBtYWlsYm94IHJlZ2lzdGVycy4gKi8KKwlvcHRyID0gKHVpbnQxNl90IF9faW9tZW0gKilNQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKworCWlwdHIgPSBtY3AtPm1iOworCWNvbW1hbmQgPSBtY3AtPm1iWzBdOworCW1ib3hlcyA9IG1jcC0+b3V0X21iOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBoYS0+bWJ4X2NvdW50OyBjbnQrKykgeworCQlpZiAoSVNfUUxBMjIwMChoYSkgJiYgY250ID09IDgpCisJCQlvcHRyID0gKHVpbnQxNl90IF9faW9tZW0gKilNQUlMQk9YX1JFRyhoYSwgcmVnLCA4KTsKKwkJaWYgKG1ib3hlcyAmIEJJVF8wKQorCQkJV1JUX1JFR19XT1JEKG9wdHIsICppcHRyKTsKKworCQltYm94ZXMgPj49IDE7CisJCW9wdHIrKzsKKwkJaXB0cisrOworCX0KKworI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMSkKKwlwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kOiBMb2FkZWQgTUJYIHJlZ2lzdGVycyAiCisJICAgICIoZGlzcGxheWVkIGluIGJ5dGVzKSA9IFxuIik7CisJcWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKW1jcC0+bWIsIDE2KTsKKwlwcmludGsoIlxuIik7CisJcWxhMngwMF9kdW1wX2J1ZmZlcigoKHVpbnQ4X3QgKiltY3AtPm1iICsgMHgxMCksIDE2KTsKKwlwcmludGsoIlxuIik7CisJcWxhMngwMF9kdW1wX2J1ZmZlcigoKHVpbnQ4X3QgKiltY3AtPm1iICsgMHgyMCksIDgpOworCXByaW50aygiXG4iKTsKKwlwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kOiBJL08gYWRkcmVzcyA9ICVseC5cbiIsCisJICAgICh1X2xvbmcpb3B0cik7CisJcWxhMngwMF9kdW1wX3JlZ3MoaGEpOworI2VuZGlmCisKKwkvKiBJc3N1ZSBzZXQgaG9zdCBpbnRlcnJ1cHQgY29tbWFuZCB0byBzZW5kIGNtZCBvdXQuICovCisJaGEtPmZsYWdzLm1ib3hfaW50ID0gMDsKKwljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKKworCS8qIFVubG9jayBtYnggcmVnaXN0ZXJzIGFuZCB3YWl0IGZvciBpbnRlcnJ1cHQgKi8KKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDogZ29pbmcgdG8gdW5sb2NrIGlycSAmICIKKwkgICAgIndhaXRpbmcgZm9yIGludGVycnVwdC4gamlmZmllcz0lbHguXG4iLCBqaWZmaWVzKTspCisKKwkvKiBXYWl0IGZvciBtYnggY21kIGNvbXBsZXRpb24gdW50aWwgdGltZW91dCAqLworCisJaWYgKCFhYm9ydF9hY3RpdmUgJiYgaW9fbG9ja19vbikgeworCQkvKiBzbGVlcCBvbiBjb21wbGV0aW9uIHNlbWFwaG9yZSAqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogIgorCQkgICAgIklOVEVSUlVQVCBNT0RFLiBJbml0aWFsaXppbmcgdGltZXIuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKworCQlpbml0X3RpbWVyKCZ0bXBfaW50cl90aW1lcik7CisJCXRtcF9pbnRyX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykmaGEtPm1ieF9pbnRyX3NlbTsKKwkJdG1wX2ludHJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtY3AtPnRvdiAqIEhaOworCQl0bXBfaW50cl90aW1lci5mdW5jdGlvbiA9CisJCSAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpcWxhMngwMF9tYnhfc2VtX3RpbWVvdXQ7CisKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6ICIKKwkJICAgICJBZGRpbmcgdGltZXIuXG4iLCBoYS0+aG9zdF9ubyk7KQorCQlhZGRfdGltZXIoJnRtcF9pbnRyX3RpbWVyKTsKKworCQlERUJVRzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQ6IGdvaW5nIHRvICIKKwkJICAgICJ1bmxvY2sgJiBzbGVlcC4gdGltZT0weCVseC5cbiIsIGppZmZpZXMpOykKKworCQlzZXRfYml0KE1CWF9JTlRSX1dBSVQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfU0VUX0hPU1RfSU5UKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoIWFib3J0X2FjdGl2ZSkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5tYnhfcmVnX2xvY2ssIG1ieF9mbGFncyk7CisKKwkJLyogV2FpdCBmb3IgZWl0aGVyIHRoZSB0aW1lciB0byBleHBpcmUKKwkJICogb3IgdGhlIG1ib3ggY29tcGxldGlvbiBpbnRlcnJ1cHQKKwkJICovCisJCWRvd24oJmhhLT5tYnhfaW50cl9zZW0pOworCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDoiCisJCSAgICAid2FraW5nIHVwLiIKKwkJICAgICJ0aW1lPTB4JWx4XG4iLCBqaWZmaWVzKTspCisJCWNsZWFyX2JpdChNQlhfSU5UUl9XQUlULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOworCisJCS8qIGRlbGV0ZSB0aGUgdGltZXIgKi8KKwkJZGVsX3RpbWVyKCZ0bXBfaW50cl90aW1lcik7CisJfSBlbHNlIHsKKworCQlERUJVRzNfMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiBjbWQ9JXggIgorCQkJIlBPTExJTkcgTU9ERS5cbiIsIGhhLT5ob3N0X25vLCBjb21tYW5kKTspCisKKwkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfU0VUX0hPU1RfSU5UKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFhYm9ydF9hY3RpdmUpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bWJ4X3JlZ19sb2NrLCBtYnhfZmxhZ3MpOworCisJCXdhaXRfdGltZSA9IGppZmZpZXMgKyBtY3AtPnRvdiAqIEhaOyAvKiB3YWl0IGF0IG1vc3QgdG92IHNlY3MgKi8KKwkJd2hpbGUgKCFoYS0+ZmxhZ3MubWJveF9pbnQpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHdhaXRfdGltZSkpCisJCQkJYnJlYWs7CisKKwkJCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMuICovCisJCQlxbGEyeDAwX3BvbGwoaGEpOworCisJCQl1ZGVsYXkoMTApOyAvKiB2NC4yNyAqLworCQl9IC8qIHdoaWxlICovCisJfQorCisJaWYgKCFhYm9ydF9hY3RpdmUpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bWJ4X3JlZ19sb2NrLCBtYnhfZmxhZ3MpOworCisJLyogQ2hlY2sgd2hldGhlciB3ZSB0aW1lZCBvdXQgKi8KKwlpZiAoaGEtPmZsYWdzLm1ib3hfaW50KSB7CisJCXVpbnQxNl90ICppcHRyMjsKKworCQlERUJVRzNfMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY21kOiBjbWQgJXggY29tcGxldGVkLlxuIiwKKwkJICAgIGNvbW1hbmQpOykKKworCQkvKiBHb3QgaW50ZXJydXB0LiBDbGVhciB0aGUgZmxhZy4gKi8KKwkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMDsKKwkJY2xlYXJfYml0KE1CWF9JTlRFUlJVUFQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CisKKwkJaWYgKGhhLT5tYWlsYm94X291dFswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgeworCQkJcWxhMngwMF9zdGF0cy5tYm94ZXJyKys7CisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJfQorCisJCS8qIExvYWQgcmV0dXJuIG1haWxib3ggcmVnaXN0ZXJzLiAqLworCQlpcHRyMiA9IG1jcC0+bWI7CisJCWlwdHIgPSAodWludDE2X3QgKikmaGEtPm1haWxib3hfb3V0WzBdOworCQltYm94ZXMgPSBtY3AtPmluX21iOworCQlmb3IgKGNudCA9IDA7IGNudCA8IGhhLT5tYnhfY291bnQ7IGNudCsrKSB7CisJCQlpZiAobWJveGVzICYgQklUXzApCisJCQkJKmlwdHIyID0gKmlwdHI7CisKKwkJCW1ib3hlcyA+Pj0gMTsKKwkJCWlwdHIyKys7CisJCQlpcHRyKys7CisJCX0KKwl9IGVsc2UgeworCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKSB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpIHx8IFwKKwkJZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMSkKKwkJcHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiAqKioqIE1CIENvbW1hbmQgVGltZW91dCAiCisJCSAgICAiZm9yIGNtZCAleCAqKioqXG4iLCBoYS0+aG9zdF9ubywgY29tbWFuZCk7CisJCXByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQ6IGljb250cm9sPSV4IGppZmZpZXM9JWx4XG4iLAorCQkgICAgUkRfUkVHX1dPUkQoJnJlZy0+aWN0cmwpLCBqaWZmaWVzKTsKKwkJcHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDogKioqIG1haWxib3hbMF0gPSAweCV4ICoqKlxuIiwKKwkJICAgIFJEX1JFR19XT1JEKG9wdHIpKTsKKwkJcWxhMngwMF9kdW1wX3JlZ3MoaGEpOworI2VuZGlmCisKKwkJcWxhMngwMF9zdGF0cy5tYm94dG91dCsrOworCQloYS0+dG90YWxfbWJ4X3RpbWVvdXQrKzsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOworCX0KKworCWlmICghYWJvcnRfYWN0aXZlKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bWJ4X3JlZ19sb2NrLCBtYnhfZmxhZ3MpOworCisJaGEtPmZsYWdzLm1ib3hfYnVzeSA9IDA7CisKKwkvKiBDbGVhbiB1cCAqLworCWhhLT5tY3AgPSBOVUxMOworCisJaWYgKCFhYm9ydF9hY3RpdmUpIHsKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jbWQ6IGNoZWNraW5nIGZvciBhZGRpdGlvbmFsICIKKwkJICAgICJyZXNwIGludGVycnVwdC5cbiIpOykKKworCQkvKiBwb2xsaW5nIG1vZGUgZm9yIG5vbiBpc3BfYWJvcnQgY29tbWFuZHMuICovCisJCXFsYTJ4MDBfcG9sbChoYSk7CisJfQorCisJaWYgKHJ2YWwgPT0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQpIHsKKwkJaWYgKCFpb19sb2NrX29uIHx8IChtY3AtPmZsYWdzICYgSU9DVExfQ01EKSkgeworCQkJLyogbm90IGluIGRwYy4gc2NoZWR1bGUgaXQgZm9yIGRwYyB0byB0YWtlIG92ZXIuICovCisJCQlERUJVRyhwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKCVsZCk6IHRpbWVvdXQgIgorCQkJICAgICJzY2hlZHVsZSBpc3BfYWJvcnRfbmVlZGVkLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubyk7KQorCQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiAiCisJCQkgICAgInRpbWVvdXQgc2NoZWR1bGUgaXNwX2Fib3J0X25lZWRlZC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pOykKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJlZC4gU2NoZWR1bGluZyBJU1AgIgorCQkJICAgICJhYm9ydC5cbiIpOworCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQlpZiAoaGEtPmRwY193YWl0ICYmICFoYS0+ZHBjX2FjdGl2ZSkgCisJCQkJdXAoaGEtPmRwY193YWl0KTsKKworCQl9IGVsc2UgaWYgKCFhYm9ydF9hY3RpdmUpIHsKKworCQkJLyogY2FsbCBhYm9ydCBkaXJlY3RseSBzaW5jZSB3ZSBhcmUgaW4gdGhlIERQQyB0aHJlYWQgKi8KKwkJCURFQlVHKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogdGltZW91dCAiCisJCQkgICAgImNhbGxpbmcgYWJvcnRfaXNwXG4iLCBoYS0+aG9zdF9ubyk7KQorCQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiAiCisJCQkgICAgInRpbWVvdXQgY2FsbGluZyBhYm9ydF9pc3BcbiIsIGhhLT5ob3N0X25vKTspCisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1haWxib3ggY29tbWFuZCB0aW1lb3V0IG9jY3VyZWQuIElzc3VpbmcgSVNQICIKKwkJCSAgICAiYWJvcnQuXG4iKTsKKworCQkJc2V0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CisJCQljbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJaWYgKHFsYTJ4MDBfYWJvcnRfaXNwKGhhKSkgeworCQkJCS8qIGZhaWxlZC4gcmV0cnkgbGF0ZXIuICovCisJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQl9CisJCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQlERUJVRyhwcmludGsoInFsYTJ4MDBfbWFpbGJveF9jb21tYW5kOiBmaW5pc2hlZCAiCisJCQkgICAgImFib3J0X2lzcFxuIik7KQorCQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZDogZmluaXNoZWQgIgorCQkJICAgICJhYm9ydF9pc3BcbiIpOykKKwkJfQorCX0KKworCS8qIEFsbG93IG5leHQgbWJ4IGNtZCB0byBjb21lIGluLiAqLworCWlmICghYWJvcnRfYWN0aXZlKQorCQl1cCgmaGEtPm1ieF9jbWRfc2VtKTsKKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogKioqKiBGQUlMRUQuICIKKwkJICAgICJtYngwPSV4LCBtYngxPSV4LCBtYngyPSV4LCBjbWQ9JXggKioqKlxuIiwKKwkJaGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0sIGNvbW1hbmQpOykKKwl9IGVsc2UgeworCQlERUJVRzExKHByaW50aygicWxhMngwMF9tYWlsYm94X2NvbW1hbmQoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21haWxib3hfY29tbWFuZCglbGQpOiBleGl0aW5nLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9sb2FkX3JhbQorICoJTG9hZCBhZGFwdGVyIFJBTSB1c2luZyBETUEuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfbG9hZF9yYW0oc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCByZXFfZG1hLCB1aW50MTZfdCByaXNjX2FkZHIsCisgICAgdWludDE2X3QgcmlzY19jb2RlX3NpemUpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCXVpbnQzMl90CXJlcV9sZW47CisJZG1hX2FkZHJfdAlubWxfZG1hOworCXVpbnQzMl90CW5tbF9sZW47CisJdWludDMyX3QJbm9ybWFsaXplZDsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xvYWRfcmFtKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJcmVxX2xlbiA9IHJpc2NfY29kZV9zaXplOworCW5tbF9kbWEgPSAwOworCW5tbF9sZW4gPSAwOworCisJbm9ybWFsaXplZCA9IHFsYTJ4MDBfbm9ybWFsaXplX2RtYV9hZGRyKCZyZXFfZG1hLCAmcmVxX2xlbiwgJm5tbF9kbWEsCisJICAgICZubWxfbGVuKTsKKworCS8qIExvYWQgZmlyc3Qgc2VnbWVudCAqLworCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTTsKKwltY3AtPm1iWzFdID0gcmlzY19hZGRyOworCW1jcC0+bWJbMl0gPSBNU1cocmVxX2RtYSk7CisJbWNwLT5tYlszXSA9IExTVyhyZXFfZG1hKTsKKwltY3AtPm1iWzRdID0gKHVpbnQxNl90KXJlcV9sZW47CisJbWNwLT5tYls2XSA9IE1TVyhNU0QocmVxX2RtYSkpOworCW1jcC0+bWJbN10gPSBMU1coTVNEKHJlcV9kbWEpKTsKKwltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCS8qIExvYWQgc2Vjb25kIHNlZ21lbnQgLSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAobm9ybWFsaXplZCAmJiAocnZhbCA9PSBRTEFfU1VDQ0VTUykpIHsKKwkJbWNwLT5tYlswXSA9IE1CQ19MT0FEX1JJU0NfUkFNOworCQltY3AtPm1iWzFdID0gcmlzY19hZGRyICsgKHVpbnQxNl90KXJlcV9sZW47CisJCW1jcC0+bWJbMl0gPSBNU1cobm1sX2RtYSk7CisJCW1jcC0+bWJbM10gPSBMU1cobm1sX2RtYSk7CisJCW1jcC0+bWJbNF0gPSAodWludDE2X3Qpbm1sX2xlbjsKKwkJbWNwLT5tYls2XSA9IE1TVyhNU0Qobm1sX2RtYSkpOworCQltY3AtPm1iWzddID0gTFNXKE1TRChubWxfZG1hKSk7CisJCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzZ8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwkJbWNwLT50b3YgPSAzMDsKKwkJbWNwLT5mbGFncyA9IDA7CisJCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwl9CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkvKiBFbXB0eSAqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9sb2FkX3JhbSglbGQpOiBkb25lLlxuIiwgaGEtPmhvc3Rfbm8pOykKKwl9IGVsc2UgeworCQkvKiBFbXB0eSAqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbG9hZF9yYW0oJWxkKTogZmFpbGVkLiBydmFsPSV4ICIKKwkJICAgICJtYlswXT0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKTspCisJfQorCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9sb2FkX3JhbV9leHQKKyAqCUxvYWQgYWRhcHRlciBleHRlbmRlZCBSQU0gdXNpbmcgRE1BLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2xvYWRfcmFtX2V4dChzY3NpX3FsYV9ob3N0X3QgKmhhLCBkbWFfYWRkcl90IHJlcV9kbWEsCisgICAgdWludDMyX3QgcmlzY19hZGRyLCB1aW50MTZfdCByaXNjX2NvZGVfc2l6ZSkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJdWludDMyX3QJcmVxX2xlbjsKKwlkbWFfYWRkcl90CW5tbF9kbWE7CisJdWludDMyX3QJbm1sX2xlbjsKKwl1aW50MzJfdAlub3JtYWxpemVkOworCisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKworCXJlcV9sZW4gPSByaXNjX2NvZGVfc2l6ZTsKKwlubWxfZG1hID0gMDsKKwlubWxfbGVuID0gMDsKKworCW5vcm1hbGl6ZWQgPSBxbGEyeDAwX25vcm1hbGl6ZV9kbWFfYWRkcigmcmVxX2RtYSwgJnJlcV9sZW4sICZubWxfZG1hLAorCSAgICAmbm1sX2xlbik7CisKKwkvKiBMb2FkIGZpcnN0IHNlZ21lbnQgKi8KKwltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQ7CisJbWNwLT5tYlsxXSA9IExTVyhyaXNjX2FkZHIpOworCW1jcC0+bWJbMl0gPSBNU1cocmVxX2RtYSk7CisJbWNwLT5tYlszXSA9IExTVyhyZXFfZG1hKTsKKwltY3AtPm1iWzRdID0gKHVpbnQxNl90KXJlcV9sZW47CisJbWNwLT5tYls2XSA9IE1TVyhNU0QocmVxX2RtYSkpOworCW1jcC0+bWJbN10gPSBMU1coTVNEKHJlcV9kbWEpKTsKKwltY3AtPm1iWzhdID0gTVNXKHJpc2NfYWRkcik7CisJbWNwLT5vdXRfbWIgPSBNQlhfOHxNQlhfN3xNQlhfNnxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwkvKiBMb2FkIHNlY29uZCBzZWdtZW50IC0gaWYgbmVjZXNzYXJ5ICovCisJaWYgKG5vcm1hbGl6ZWQgJiYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpKSB7CisJCXJpc2NfYWRkciArPSByZXFfbGVuOworCQltY3AtPm1iWzBdID0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQ7CisJCW1jcC0+bWJbMV0gPSBMU1cocmlzY19hZGRyKTsKKwkJbWNwLT5tYlsyXSA9IE1TVyhubWxfZG1hKTsKKwkJbWNwLT5tYlszXSA9IExTVyhubWxfZG1hKTsKKwkJbWNwLT5tYls0XSA9ICh1aW50MTZfdClubWxfbGVuOworCQltY3AtPm1iWzZdID0gTVNXKE1TRChubWxfZG1hKSk7CisJCW1jcC0+bWJbN10gPSBMU1coTVNEKG5tbF9kbWEpKTsKKwkJbWNwLT5tYls4XSA9IE1TVyhyaXNjX2FkZHIpOworCQltY3AtPm91dF9tYiA9IE1CWF84fE1CWF83fE1CWF82fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCQltY3AtPmluX21iID0gTUJYXzA7CisJCW1jcC0+dG92ID0gMzA7CisJCW1jcC0+ZmxhZ3MgPSAwOworCQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJfQorCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwKKwkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9leGVjdXRlX2Z3CisgKglTdGFydCBhZGFwdGVyIGZpcm13YXJlLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2V4ZWN1dGVfZncoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9leGVjdXRlX2Z3KCVsZCk6IGVudGVyZWQuXG4iLCBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19FWEVDVVRFX0ZJUk1XQVJFOworCW1jcC0+bWJbMV0gPSAqaGEtPmJyZF9pbmZvLT5md19pbmZvWzBdLmZ3c3RhcnQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKKwlpZiAoSVNfUUxBMjMyMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpIHsKKwkJbWNwLT5tYlsyXSA9IDA7CisJCW1jcC0+b3V0X21iIHw9IE1CWF8yOworCX0KKworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2V4ZWN1dGVfZncoJWxkKTogZG9uZS5cbiIsIGhhLT5ob3N0X25vKTspCisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24KKyAqCUdldCBmaXJtd2FyZSB2ZXJzaW9uLgorICoKKyAqIElucHV0OgorICoJaGE6CQlhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKgltYWpvcjoJCXBvaW50ZXIgZm9yIG1ham9yIG51bWJlci4KKyAqCW1pbm9yOgkJcG9pbnRlciBmb3IgbWlub3IgbnVtYmVyLgorICoJc3VibWlub3I6CXBvaW50ZXIgZm9yIHN1Ym1pbm9yIG51bWJlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCit2b2lkCitxbGEyeDAwX2dldF9md192ZXJzaW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICptYWpvciwgdWludDE2X3QgKm1pbm9yLAorICAgIHVpbnQxNl90ICpzdWJtaW5vciwgdWludDE2X3QgKmF0dHJpYnV0ZXMsIHVpbnQzMl90ICptZW1vcnkpCit7CisJaW50CQlydmFsOworCW1ieF9jbWRfdAltYzsKKwltYnhfY21kX3QJKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9WRVJTSU9OOworCW1jcC0+b3V0X21iID0gTUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF82fE1CWF81fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+ZmxhZ3MgPSAwOworCW1jcC0+dG92ID0gMzA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJLyogUmV0dXJuIG1haWxib3ggZGF0YS4gKi8KKwkqbWFqb3IgPSBtY3AtPm1iWzFdOworCSptaW5vciA9IG1jcC0+bWJbMl07CisJKnN1Ym1pbm9yID0gbWNwLT5tYlszXTsKKwkqYXR0cmlidXRlcyA9IG1jcC0+bWJbNl07CisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKQorCQkqbWVtb3J5ID0gMHgxRkZGRjsJCQkvKiBEZWZhdWx0cyB0byAxMjhLQi4gKi8KKwllbHNlCisJCSptZW1vcnkgPSAobWNwLT5tYls1XSA8PCAxNikgfCBtY3AtPm1iWzRdOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCX0KK30KKworLyoKKyAqIHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMKKyAqCVNldCBmaXJtd2FyZSBvcHRpb25zLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglmd29wdCA9IHBvaW50ZXIgZm9yIGZpcm13YXJlIG9wdGlvbnMuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2dldF9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICpmd29wdHMpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX09QVElPTjsKKwltY3AtPm91dF9tYiA9IE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgeworCQlmd29wdHNbMV0gPSBtY3AtPm1iWzFdOworCQlmd29wdHNbMl0gPSBtY3AtPm1iWzJdOworCQlmd29wdHNbM10gPSBtY3AtPm1iWzNdOworCisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKworLyoKKyAqIHFsYTJ4MDBfc2V0X2Z3X29wdGlvbnMKKyAqCVNldCBmaXJtd2FyZSBvcHRpb25zLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglmd29wdCA9IHBvaW50ZXIgZm9yIGZpcm13YXJlIG9wdGlvbnMuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX3NldF9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICpmd29wdHMpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKworCW1jcC0+bWJbMF0gPSBNQkNfU0VUX0ZJUk1XQVJFX09QVElPTjsKKwltY3AtPm1iWzFdID0gZndvcHRzWzFdOworCW1jcC0+bWJbMl0gPSBmd29wdHNbMl07CisJbWNwLT5tYlszXSA9IGZ3b3B0c1szXTsKKwltY3AtPm1iWzEwXSA9IGZ3b3B0c1sxMF07CisJbWNwLT5tYlsxMV0gPSBmd29wdHNbMTFdOworCW1jcC0+bWJbMTJdID0gMDsJLyogVW5kb2N1bWVudGVkLCBidXQgdXNlZCAqLworCW1jcC0+b3V0X21iID0gTUJYXzEyfE1CWF8xMXxNQlhfMTB8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9tYnhfcmVnX3Rlc3QKKyAqCU1haWxib3ggcmVnaXN0ZXIgd3JhcCB0ZXN0LgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX21ieF9yZWdfdGVzdChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21ieF9yZWdfdGVzdCglbGQpOiBlbnRlcmVkLlxuIiwgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfTUFJTEJPWF9SRUdJU1RFUl9URVNUOworCW1jcC0+bWJbMV0gPSAweEFBQUE7CisJbWNwLT5tYlsyXSA9IDB4NTU1NTsKKwltY3AtPm1iWzNdID0gMHhBQTU1OworCW1jcC0+bWJbNF0gPSAweDU1QUE7CisJbWNwLT5tYls1XSA9IDB4QTVBNTsKKwltY3AtPm1iWzZdID0gMHg1QTVBOworCW1jcC0+bWJbN10gPSAweDI1MjU7CisJbWNwLT5vdXRfbWIgPSBNQlhfN3xNQlhfNnxNQlhfNXxNQlhfNHxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzd8TUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQlpZiAobWNwLT5tYlsxXSAhPSAweEFBQUEgfHwgbWNwLT5tYlsyXSAhPSAweDU1NTUgfHwKKwkJICAgIG1jcC0+bWJbM10gIT0gMHhBQTU1IHx8IG1jcC0+bWJbNF0gIT0gMHg1NUFBKQorCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCWlmIChtY3AtPm1iWzVdICE9IDB4QTVBNSB8fCBtY3AtPm1iWzZdICE9IDB4NUE1QSB8fAorCQkgICAgbWNwLT5tYls3XSAhPSAweDI1MjUpCisJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX21ieF9yZWdfdGVzdCglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWJ4X3JlZ190ZXN0KCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtCisgKglWZXJpZnkgZmlybXdhcmUgY2hlY2tzdW0uCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19WRVJJRllfQ0hFQ0tTVU07CisJbWNwLT5tYlsxXSA9ICpoYS0+YnJkX2luZm8tPmZ3X2luZm9bMF0uZndzdGFydDsKKwltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMnxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKCVsZCk6IGZhaWxlZD0leC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF92ZXJpZnlfY2hlY2tzdW0oJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9pc3N1ZV9pb2NiCisgKglJc3N1ZSBJT0NCIHVzaW5nIG1haWxib3ggY29tbWFuZAorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglidWZmZXIgPSBidWZmZXIgcG9pbnRlci4KKyAqCXBoeXNfYWRkciA9IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyLgorICoJc2l6ZSA9IHNpemUgb2YgYnVmZmVyLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9pc3N1ZV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHZvaWQqICBidWZmZXIsIGRtYV9hZGRyX3QgcGh5c19hZGRyLAorICAgIHNpemVfdCBzaXplKQoreworCWludAkJcnZhbDsKKwltYnhfY21kX3QJbWM7CisJbWJ4X2NtZF90CSptY3AgPSAmbWM7CisKKwltY3AtPm1iWzBdID0gTUJDX0lPQ0JfQ09NTUFORF9BNjQ7CisJbWNwLT5tYlsxXSA9IDA7CisJbWNwLT5tYlsyXSA9IE1TVyhwaHlzX2FkZHIpOworCW1jcC0+bWJbM10gPSBMU1cocGh5c19hZGRyKTsKKwltY3AtPm1iWzZdID0gTVNXKE1TRChwaHlzX2FkZHIpKTsKKwltY3AtPm1iWzddID0gTFNXKE1TRChwaHlzX2FkZHIpKTsKKwltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMnxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRyhwcmludGsoInFsYTJ4MDBfaXNzdWVfaW9jYiglbGQpOiBmYWlsZWQgcnZhbCAweCV4IiwKKwkJICAgIGhhLT5ob3N0X25vLHJ2YWwpOykKKwkJREVCVUcyKHByaW50aygicWxhMngwMF9pc3N1ZV9pb2NiKCVsZCk6IGZhaWxlZCBydmFsIDB4JXgiLAorCQkgICAgaGEtPmhvc3Rfbm8scnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9hYm9ydF9jb21tYW5kCisgKglBYm9ydCBjb21tYW5kIGFib3J0cyBhIHNwZWNpZmllZCBJT0NCLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglzcCA9IFNCIHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9hYm9ydF9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHNyYl90ICpzcCkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MgPSAwOworCWZjX3BvcnRfdAkqZmNwb3J0OworCWludAkJcnZhbDsKKwl1aW50MzJfdAloYW5kbGU7CisJbWJ4X2NtZF90CW1jOworCW1ieF9jbWRfdAkqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfYWJvcnRfY29tbWFuZCglbGQpOiBlbnRlcmVkLlxuIiwgaGEtPmhvc3Rfbm8pOykKKworCWZjcG9ydCA9IHNwLT5mY2x1bi0+ZmNwb3J0OworCisJaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOIHx8CisJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0xPU1QpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJZm9yIChoYW5kbGUgPSAxOyBoYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGhhbmRsZSsrKSB7CisJCWlmIChoYS0+b3V0c3RhbmRpbmdfY21kc1toYW5kbGVdID09IHNwKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoaGFuZGxlID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgeworCQkvKiBjb21tYW5kIG5vdCBmb3VuZCAqLworCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisKKwltY3AtPm1iWzBdID0gTUJDX0FCT1JUX0NPTU1BTkQ7CisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQorCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkOworCWVsc2UKKwkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZCA8PCA4OworCW1jcC0+bWJbMl0gPSAodWludDE2X3QpaGFuZGxlOworCW1jcC0+bWJbM10gPSAodWludDE2X3QpKGhhbmRsZSA+PiAxNik7CisJbWNwLT5tYls2XSA9ICh1aW50MTZfdClzcC0+ZmNsdW4tPmx1bjsKKwltY3AtPm91dF9tYiA9IE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9hYm9ydF9jb21tYW5kKCVsZCk6IGZhaWxlZD0leC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCXNwLT5mbGFncyB8PSBTUkJfQUJPUlRfUEVORElORzsKKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfYWJvcnRfY29tbWFuZCglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKyNpZiBVU0VfQUJPUlRfVEdUCisvKgorICogcWxhMngwMF9hYm9ydF90YXJnZXQKKyAqCUlzc3VlIGFib3J0IHRhcmdldCBtYWlsYm94IGNvbW1hbmQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfYWJvcnRfdGFyZ2V0KGZjX3BvcnRfdCAqZmNwb3J0KQoreworCWludCAgICAgICAgcnZhbDsKKwltYnhfY21kX3QgIG1jOworCW1ieF9jbWRfdCAgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X3RhcmdldCglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgZmNwb3J0LT5oYS0+aG9zdF9ubyk7KQorCisJaWYgKGZjcG9ydCA9PSBOVUxMKSB7CisJCS8qIG5vIHRhcmdldCB0byBhYm9ydCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwltY3AtPm1iWzBdID0gTUJDX0FCT1JUX1RBUkdFVDsKKwltY3AtPm91dF9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOworCWlmIChIQVNfRVhURU5ERURfSURTKGZjcG9ydC0+aGEpKSB7CisJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQ7CisJCW1jcC0+bWJbMTBdID0gMDsKKwkJbWNwLT5vdXRfbWIgfD0gTUJYXzEwOworCX0gZWxzZSB7CisJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQgPDwgODsKKwl9CisJbWNwLT5tYlsyXSA9IGZjcG9ydC0+aGEtPmxvb3BfcmVzZXRfZGVsYXk7CisKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoZmNwb3J0LT5oYSwgbWNwKTsKKworCS8qIElzc3VlIG1hcmtlciBjb21tYW5kLiAqLworCWZjcG9ydC0+aGEtPm1hcmtlcl9uZWVkZWQgPSAxOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X3RhcmdldCglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgZmNwb3J0LT5oYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9hYm9ydF90YXJnZXQoJWxkKTogZG9uZS5cbiIsCisJCSAgICBmY3BvcnQtPmhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisjZW5kaWYKKworLyoKKyAqIHFsYTJ4MDBfdGFyZ2V0X3Jlc2V0CisgKglJc3N1ZSB0YXJnZXQgcmVzZXQgbWFpbGJveCBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX3RhcmdldF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBiLCB1aW50MTZfdCB0KQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKwlvc190Z3RfdCAqdGd0OworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KCVsZCk6IGVudGVyZWQuXG4iLCBoYS0+aG9zdF9ubyk7KQorCisJdGd0ID0gVEdUX1EoaGEsIHQpOworCWlmICh0Z3QtPmZjcG9ydCA9PSBOVUxMKSB7CisJCS8qIG5vIHRhcmdldCB0byBhYm9ydCAqLworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0Z3QtPmZjcG9ydC0+c3RhdGUpICE9IEZDU19PTkxJTkUpIHsKKwkJLyogdGFyZ2V0IG5vdCBvbmxpbmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbWNwLT5tYlswXSA9IE1CQ19UQVJHRVRfUkVTRVQ7CisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQorCQltY3AtPm1iWzFdID0gdGd0LT5mY3BvcnQtPmxvb3BfaWQ7CisJZWxzZQorCQltY3AtPm1iWzFdID0gdGd0LT5mY3BvcnQtPmxvb3BfaWQgPDwgODsKKwltY3AtPm1iWzJdID0gaGEtPmxvb3BfcmVzZXRfZGVsYXk7CisJbWNwLT5vdXRfbWIgPSBNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX3RhcmdldF9yZXNldCglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfdGFyZ2V0X3Jlc2V0KCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQKKyAqCUdldCBhZGFwdGVyIElEIGFuZCB0b3BvbG9neS4KKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoJaWQgPSBwb2ludGVyIGZvciBsb29wIElELgorICoJYWxfcGEgPSBwb2ludGVyIGZvciBBTF9QQS4KKyAqCWFyZWEgPSBwb2ludGVyIGZvciBhcmVhLgorICoJZG9tYWluID0gcG9pbnRlciBmb3IgZG9tYWluLgorICoJdG9wID0gcG9pbnRlciBmb3IgdG9wb2xvZ3kuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2dldF9hZGFwdGVyX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICppZCwgdWludDhfdCAqYWxfcGEsCisgICAgdWludDhfdCAqYXJlYSwgdWludDhfdCAqZG9tYWluLCB1aW50MTZfdCAqdG9wKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9hZGFwdGVyX2lkKCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19HRVRfQURBUFRFUl9MT09QX0lEOworCW1jcC0+b3V0X21iID0gTUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJLyogUmV0dXJuIGRhdGEuICovCisJKmlkID0gbWNwLT5tYlsxXTsKKwkqYWxfcGEgPSBMU0IobWNwLT5tYlsyXSk7CisJKmFyZWEgPSBNU0IobWNwLT5tYlsyXSk7CisJKmRvbWFpbgk9IExTQihtY3AtPm1iWzNdKTsKKwkqdG9wID0gbWNwLT5tYls2XTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9hZGFwdGVyX2lkKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZ2V0X3JldHJ5X2NudAorICoJR2V0IGN1cnJlbnQgZmlybXdhcmUgbG9naW4gcmV0cnkgY291bnQgYW5kIGRlbGF5LgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglyZXRyeV9jbnQgPSBwb2ludGVyIHRvIGxvZ2luIHJldHJ5IGNvdW50LgorICoJdG92ID0gcG9pbnRlciB0byBsb2dpbiB0aW1lb3V0IHZhbHVlLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9nZXRfcmV0cnlfY250KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKnJldHJ5X2NudCwgdWludDhfdCAqdG92LAorICAgIHVpbnQxNl90ICpyX2FfdG92KQoreworCWludCBydmFsOworCXVpbnQxNl90IHJhdG92OworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9yZXRyeV9jbnQoJWxkKTogZW50ZXJlZC5cbiIsCisJCQloYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19HRVRfUkVUUllfQ09VTlQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9yZXRyeV9jbnQoJWxkKTogZmFpbGVkID0gJXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pOykKKwl9IGVsc2UgeworCQkvKiBDb252ZXJ0IHJldHVybmVkIGRhdGEgYW5kIGNoZWNrIG91ciB2YWx1ZXMuICovCisJCSpyX2FfdG92ID0gbWNwLT5tYlszXSAvIDI7CisJCXJhdG92ID0gKG1jcC0+bWJbM10vMikgLyAxMDsgIC8qIG1iWzNdIHZhbHVlIGlzIGluIDEwMG1zICovCisJCWlmIChtY3AtPm1iWzFdICogcmF0b3YgPiAoKnJldHJ5X2NudCkgKiAoKnRvdikpIHsKKwkJCS8qIFVwZGF0ZSB0byB0aGUgbGFyZ2VyIHZhbHVlcyAqLworCQkJKnJldHJ5X2NudCA9ICh1aW50OF90KW1jcC0+bWJbMV07CisJCQkqdG92ID0gcmF0b3Y7CisJCX0KKworCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcmV0cnlfY250KCVsZCk6IGRvbmUuIG1iMz0lZCAiCisJCSAgICAicmF0b3Y9JWQuXG4iLCBoYS0+aG9zdF9ubywgbWNwLT5tYlszXSwgcmF0b3YpOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfaW5pdF9maXJtd2FyZQorICoJSW5pdGlhbGl6ZSBhZGFwdGVyIGZpcm13YXJlLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglkcHRyID0gSW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jayBwb2ludGVyLgorICoJc2l6ZSA9IHNpemUgb2YgaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfaW5pdF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBzaXplKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2luaXRfZmlybXdhcmUoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwltY3AtPm1iWzBdID0gTUJDX0lOSVRJQUxJWkVfRklSTVdBUkU7CisJbWNwLT5tYlsyXSA9IE1TVyhoYS0+aW5pdF9jYl9kbWEpOworCW1jcC0+bWJbM10gPSBMU1coaGEtPmluaXRfY2JfZG1hKTsKKwltY3AtPm1iWzRdID0gMDsKKwltY3AtPm1iWzVdID0gMDsKKwltY3AtPm1iWzZdID0gTVNXKE1TRChoYS0+aW5pdF9jYl9kbWEpKTsKKwltY3AtPm1iWzddID0gTFNXKE1TRChoYS0+aW5pdF9jYl9kbWEpKTsKKwltY3AtPm91dF9tYiA9IE1CWF83fE1CWF82fE1CWF8zfE1CWF8yfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfNXxNQlhfNHxNQlhfMDsKKwltY3AtPmJ1Zl9zaXplID0gc2l6ZTsKKwltY3AtPmZsYWdzID0gTUJYX0RNQV9PVVQ7CisJbWNwLT50b3YgPSAzMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2luaXRfZmlybXdhcmUoJWxkKTogZmFpbGVkPSV4ICIKKwkJICAgICJtYjA9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfaW5pdF9maXJtd2FyZSglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9wb3J0X2RhdGFiYXNlCisgKglJc3N1ZSBub3JtYWwvZW5oYW5jZWQgZ2V0IHBvcnQgZGF0YWJhc2UgbWFpbGJveCBjb21tYW5kCisgKglhbmQgY29weSBkZXZpY2UgbmFtZSBhcyBuZWNlc3NhcnkuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgc3RhdGUgcG9pbnRlci4KKyAqCWRldiA9IHN0cnVjdHVyZSBwb2ludGVyLgorICoJb3B0ID0gZW5oYW5jZWQgY21kIG9wdGlvbiBieXRlLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZShzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwgdWludDhfdCBvcHQpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCXBvcnRfZGF0YWJhc2VfdCAqcGQ7CisJZG1hX2FkZHJfdCBwZF9kbWE7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZSglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCXBkID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9BVE9NSUMsICZwZF9kbWEpOworCWlmIChwZCAgPT0gTlVMTCkgeworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UoJWxkKTogKioqKiAiCisJCSAgICAiTWVtIEFsbG9jIEZhaWxlZCAqKioqIiwgaGEtPmhvc3Rfbm8pOykKKwkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOworCX0KKwltZW1zZXQocGQsIDAsIFBPUlRfREFUQUJBU0VfU0laRSk7CisKKwlpZiAob3B0ICE9IDApCisJCW1jcC0+bWJbMF0gPSBNQkNfRU5IQU5DRURfR0VUX1BPUlRfREFUQUJBU0U7CisJZWxzZQorCQltY3AtPm1iWzBdID0gTUJDX0dFVF9QT1JUX0RBVEFCQVNFOworCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKSB7CisJCW1jcC0+bWJbMV0gPSBmY3BvcnQtPmxvb3BfaWQ7CisJCW1jcC0+bWJbMTBdID0gb3B0OworCQltY3AtPm91dF9tYiB8PSBNQlhfMTA7CisJfSBlbHNlIHsKKwkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZCA8PCA4IHwgb3B0OworCX0KKwltY3AtPm1iWzJdID0gTVNXKHBkX2RtYSk7CisJbWNwLT5tYlszXSA9IExTVyhwZF9kbWEpOworCW1jcC0+bWJbNl0gPSBNU1coTVNEKHBkX2RtYSkpOworCW1jcC0+bWJbN10gPSBMU1coTVNEKHBkX2RtYSkpOworCisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+YnVmX3NpemUgPSBQT1JUX0RBVEFCQVNFX1NJWkU7CisJbWNwLT5mbGFncyA9IE1CWF9ETUFfSU47CisJbWNwLT50b3YgPSAoaGEtPmxvZ2luX3RpbWVvdXQgKiAyKSArIChoYS0+bG9naW5fdGltZW91dCAvIDIpOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBncGRfZXJyb3Jfb3V0OworCisJLyogQ2hlY2sgZm9yIGxvZ2dlZCBpbiBzdGF0ZS4gKi8KKwlpZiAocGQtPm1hc3Rlcl9zdGF0ZSAhPSBQRF9TVEFURV9QT1JUX0xPR0dFRF9JTiAmJgorCSAgICBwZC0+c2xhdmVfc3RhdGUgIT0gUERfU1RBVEVfUE9SVF9MT0dHRURfSU4pIHsKKwkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCWdvdG8gZ3BkX2Vycm9yX291dDsKKwl9CisKKwkvKiBOYW1lcyBhcmUgbGl0dGxlLWVuZGlhbi4gKi8KKwltZW1jcHkoZmNwb3J0LT5ub2RlX25hbWUsIHBkLT5ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwltZW1jcHkoZmNwb3J0LT5wb3J0X25hbWUsIHBkLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKworCS8qIEdldCBwb3J0X2lkIG9mIGRldmljZS4gKi8KKwlmY3BvcnQtPmRfaWQuYi5hbF9wYSA9IHBkLT5wb3J0X2lkWzJdOworCWZjcG9ydC0+ZF9pZC5iLmFyZWEgPSBwZC0+cG9ydF9pZFszXTsKKwlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSBwZC0+cG9ydF9pZFswXTsKKwlmY3BvcnQtPmRfaWQuYi5yc3ZkXzEgPSAwOworCisJLyogQ2hlY2sgZm9yIGRldmljZSByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAqLworCXBkLT5jb21tb25fZmVhdHVyZXMgJiBCSVRfNSA/IChmY3BvcnQtPmZsYWdzIHw9IEZDRl9BVVRIX1JFUSkgOgorCSAgICAoZmNwb3J0LT5mbGFncyAmPSB+RkNGX0FVVEhfUkVRKTsKKworCS8qIElmIG5vdCB0YXJnZXQgbXVzdCBiZSBpbml0aWF0b3Igb3IgdW5rbm93biB0eXBlLiAqLworCWlmICgocGQtPnBybGlfc3ZjX3BhcmFtX3dvcmRfM1swXSAmIEJJVF80KSA9PSAwKQorCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9JTklUSUFUT1I7CisJZWxzZQorCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9UQVJHRVQ7CisKK2dwZF9lcnJvcl9vdXQ6CisJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgcGQsIHBkX2RtYSk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X2RhdGFiYXNlKCVsZCk6ICIKKwkJICAgICJmYWlsZWQ9JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZSglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZQorICoJR2V0IGFkYXB0ZXIgZmlybXdhcmUgc3RhdGUuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWRwdHIgPSBwb2ludGVyIGZvciBmaXJtd2FyZSBzdGF0ZS4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90ICpkcHRyKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZSglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX1NUQVRFOworCW1jcC0+b3V0X21iID0gTUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJLyogUmV0dXJuIGZpcm13YXJlIHN0YXRlLiAqLworCSpkcHRyID0gbWNwLT5tYlsxXTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKCVsZCk6ICIKKwkJICAgICJmYWlsZWQ9JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9nZXRfcG9ydF9uYW1lCisgKglJc3N1ZSBnZXQgcG9ydCBuYW1lIG1haWxib3ggY29tbWFuZC4KKyAqCVJldHVybmVkIG5hbWUgaXMgaW4gYmlnIGVuZGlhbiBmb3JtYXQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWxvb3BfaWQgPSBsb29wIElEIG9mIGRldmljZS4KKyAqCW5hbWUgPSBwb2ludGVyIGZvciBuYW1lLgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9nZXRfcG9ydF9uYW1lKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQsIHVpbnQ4X3QgKm5hbWUsCisgICAgdWludDhfdCBvcHQpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1BPUlRfTkFNRTsKKwltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCQltY3AtPm1iWzFdID0gbG9vcF9pZDsKKwkJbWNwLT5tYlsxMF0gPSBvcHQ7CisJCW1jcC0+b3V0X21iIHw9IE1CWF8xMDsKKwl9IGVsc2UgeworCQltY3AtPm1iWzFdID0gbG9vcF9pZCA8PCA4IHwgb3B0OworCX0KKworCW1jcC0+aW5fbWIgPSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpOykKKwl9IGVsc2UgeworCQlpZiAobmFtZSAhPSBOVUxMKSB7CisJCQkvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbmFtZSBpbiBiaWcgZW5kaWFuLiAqLworCQkJbmFtZVswXSA9IExTQihtY3AtPm1iWzJdKTsKKwkJCW5hbWVbMV0gPSBNU0IobWNwLT5tYlsyXSk7CisJCQluYW1lWzJdID0gTFNCKG1jcC0+bWJbM10pOworCQkJbmFtZVszXSA9IE1TQihtY3AtPm1iWzNdKTsKKwkJCW5hbWVbNF0gPSBMU0IobWNwLT5tYls2XSk7CisJCQluYW1lWzVdID0gTVNCKG1jcC0+bWJbNl0pOworCQkJbmFtZVs2XSA9IExTQihtY3AtPm1iWzddKTsKKwkJCW5hbWVbN10gPSBNU0IobWNwLT5tYls3XSk7CisJCX0KKworCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcG9ydF9uYW1lKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfbGlwX3Jlc2V0CisgKglJc3N1ZSBMSVAgcmVzZXQgbWFpbGJveCBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2xpcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xpcF9yZXNldCglbGQpOiBlbnRlcmVkLlxuIiwKKwkgICAgaGEtPmhvc3Rfbm8pOykKKworCW1jcC0+bWJbMF0gPSBNQkNfTElQX1JFU0VUOworCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKSB7CisJCW1jcC0+bWJbMV0gPSAweDAwZmY7CisJCW1jcC0+bWJbMTBdID0gMDsKKwkJbWNwLT5vdXRfbWIgfD0gTUJYXzEwOworCX0gZWxzZSB7CisJCW1jcC0+bWJbMV0gPSAweGZmMDA7CisJfQorCW1jcC0+bWJbMl0gPSBoYS0+bG9vcF9yZXNldF9kZWxheTsKKwltY3AtPm1iWzNdID0gMDsKKworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbGlwX3Jlc2V0KCVsZCk6IGZhaWxlZD0leC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9saXBfcmVzZXQoJWxkKTogZG9uZS5cbiIsIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX3NlbmRfc25zCisgKglTZW5kIFNOUyBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglzbnMgPSBwb2ludGVyIGZvciBjb21tYW5kLgorICoJY21kX3NpemUgPSBjb21tYW5kIHNpemUuCisgKglidWZfc2l6ZSA9IHJlc3BvbnNlL2NvbW1hbmQgc2l6ZS4KKyAqCVRBUkdFVF9RVUVVRV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKglBREFQVEVSX1NUQVRFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfc2VuZF9zbnMoc2NzaV9xbGFfaG9zdF90ICpoYSwgZG1hX2FkZHJfdCBzbnNfcGh5c19hZGRyZXNzLAorICAgIHVpbnQxNl90IGNtZF9zaXplLCBzaXplX3QgYnVmX3NpemUpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnMoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9zZW5kX3NuczogcmV0cnkgY250PSVkIHJhdG92PSVkIHRvdGFsICIKKwkgICAgInRvdj0lZC5cbiIsIGhhLT5yZXRyeV9jb3VudCwgaGEtPmxvZ2luX3RpbWVvdXQsIG1jcC0+dG92KTspCisKKwltY3AtPm1iWzBdID0gTUJDX1NFTkRfU05TX0NPTU1BTkQ7CisJbWNwLT5tYlsxXSA9IGNtZF9zaXplOworCW1jcC0+bWJbMl0gPSBNU1coc25zX3BoeXNfYWRkcmVzcyk7CisJbWNwLT5tYlszXSA9IExTVyhzbnNfcGh5c19hZGRyZXNzKTsKKwltY3AtPm1iWzZdID0gTVNXKE1TRChzbnNfcGh5c19hZGRyZXNzKSk7CisJbWNwLT5tYls3XSA9IExTVyhNU0Qoc25zX3BoeXNfYWRkcmVzcykpOworCW1jcC0+b3V0X21iID0gTUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wfE1CWF8xOworCW1jcC0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKwltY3AtPmZsYWdzID0gTUJYX0RNQV9PVVR8TUJYX0RNQV9JTjsKKwltY3AtPnRvdiA9IChoYS0+bG9naW5fdGltZW91dCAqIDIpICsgKGhhLT5sb2dpbl90aW1lb3V0IC8gMik7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggIgorCQkgICAgIm1iWzFdPSV4LlxuIiwgaGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOykKKwkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCAiCisJCSAgICAibWJbMV09JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7KQorCX0gZWxzZSB7CisJCS8qRU1QVFkqLworCQlERUJVRzExKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBkb25lLlxuIiwgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfbG9naW5fZmFicmljCisgKglJc3N1ZSBsb2dpbiBmYWJyaWMgcG9ydCBtYWlsYm94IGNvbW1hbmQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCWxvb3BfaWQgPSBkZXZpY2UgbG9vcCBJRC4KKyAqCWRvbWFpbiA9IGRldmljZSBkb21haW4uCisgKglhcmVhID0gZGV2aWNlIGFyZWEuCisgKglhbF9wYSA9IGRldmljZSBBTF9QQS4KKyAqCXN0YXR1cyA9IHBvaW50ZXIgZm9yIHJldHVybiBzdGF0dXMuCisgKglvcHQgPSBjb21tYW5kIG9wdGlvbnMuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2xvZ2luX2ZhYnJpYyhzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MTZfdCBsb29wX2lkLCB1aW50OF90IGRvbWFpbiwKKyAgICB1aW50OF90IGFyZWEsIHVpbnQ4X3QgYWxfcGEsIHVpbnQxNl90ICptYiwgdWludDhfdCBvcHQpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGVudGVyZWQuXG4iLCBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19MT0dJTl9GQUJSSUNfUE9SVDsKKwltY3AtPm91dF9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkgeworCQltY3AtPm1iWzFdID0gbG9vcF9pZDsKKwkJbWNwLT5tYlsxMF0gPSBvcHQ7CisJCW1jcC0+b3V0X21iIHw9IE1CWF8xMDsKKwl9IGVsc2UgeworCQltY3AtPm1iWzFdID0gKGxvb3BfaWQgPDwgOCkgfCBvcHQ7CisJfQorCW1jcC0+bWJbMl0gPSBkb21haW47CisJbWNwLT5tYlszXSA9IGFyZWEgPDwgOCB8IGFsX3BhOworCisJbWNwLT5pbl9tYiA9IE1CWF83fE1CWF82fE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gKGhhLT5sb2dpbl90aW1lb3V0ICogMikgKyAoaGEtPmxvZ2luX3RpbWVvdXQgLyAyKTsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwkvKiBSZXR1cm4gbWFpbGJveCBzdGF0dXNlcy4gKi8KKwlpZiAobWIgIT0gTlVMTCkgeworCQltYlswXSA9IG1jcC0+bWJbMF07CisJCW1iWzFdID0gbWNwLT5tYlsxXTsKKwkJbWJbMl0gPSBtY3AtPm1iWzJdOworCQltYls2XSA9IG1jcC0+bWJbNl07CisJCW1iWzddID0gbWNwLT5tYls3XTsKKwl9CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKiBSTFUgdG1wIGNvZGU6IG5lZWQgdG8gY2hhbmdlIG1haW4gbWFpbGJveF9jb21tYW5kIGZ1bmN0aW9uIHRvCisJCSAqIHJldHVybiBvayBldmVuIHdoZW4gdGhlIG1haWxib3ggY29tcGxldGlvbiB2YWx1ZSBpcyBub3QKKwkJICogU1VDQ0VTUy4gVGhlIGNhbGxlciBuZWVkcyB0byBiZSByZXNwb25zaWJsZSB0byBpbnRlcnByZXQKKwkJICogdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhpcyBtYWlsYm94IGNvbW1hbmQgaWYgd2UncmUgbm90CisJCSAqIHRvIGNoYW5nZSB0b28gbXVjaCBvZiB0aGUgZXhpc3RpbmcgY29kZS4KKwkJICovCisJCWlmIChtY3AtPm1iWzBdID09IDB4NDAwMSB8fCBtY3AtPm1iWzBdID09IDB4NDAwMiB8fAorCQkgICAgbWNwLT5tYlswXSA9PSAweDQwMDMgfHwgbWNwLT5tYlswXSA9PSAweDQwMDUgfHwKKwkJICAgIG1jcC0+bWJbMF0gPT0gMHg0MDA2KQorCQkJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGZhaWxlZD0leCAiCisJCSAgICAibWJbMF09JXggbWJbMV09JXggbWJbMl09JXguXG4iLCBoYS0+aG9zdF9ubywgcnZhbCwKKwkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pOykKKwl9IGVsc2UgeworCQkvKkVNUFRZKi8KKwkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlCisgKiAgICAgICAgICAgSXNzdWUgbG9naW4gbG9vcCBwb3J0IG1haWxib3ggY29tbWFuZC4KKyAqICAgIAorICogSW5wdXQ6CisgKiAgICAgICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKiAgICAgICAgICAgbG9vcF9pZCA9IGRldmljZSBsb29wIElELgorICogICAgICAgICAgIG9wdCA9IGNvbW1hbmQgb3B0aW9ucy4KKyAqICAgICAgICAgIAorICogUmV0dXJuczoKKyAqICAgICAgICAgICAgUmV0dXJuIHN0YXR1cyBjb2RlLgorICogICAgICAgICAgICAgCisgKiBDb250ZXh0OgorICogICAgICAgICAgICBLZXJuZWwgY29udGV4dC4KKyAqICAgICAgICAgICAgIAorICovCitpbnQKK3FsYTJ4MDBfbG9naW5fbG9jYWxfZGV2aWNlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQsCisgICAgdWludDE2X3QgKm1iX3JldCwgdWludDhfdCBvcHQpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUczKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19MT0dJTl9MT09QX1BPUlQ7CisJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQorCQltY3AtPm1iWzFdID0gbG9vcF9pZDsKKwllbHNlCisJCW1jcC0+bWJbMV0gPSBsb29wX2lkIDw8IDg7CisJbWNwLT5tYlsyXSA9IG9wdDsKKwltY3AtPm91dF9tYiA9IE1CWF8yfE1CWF8xfE1CWF8wOworIAltY3AtPmluX21iID0gTUJYXzd8TUJYXzZ8TUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAoaGEtPmxvZ2luX3RpbWVvdXQgKiAyKSArIChoYS0+bG9naW5fdGltZW91dCAvIDIpOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworIAkvKiBSZXR1cm4gbWFpbGJveCBzdGF0dXNlcy4gKi8KKyAJaWYgKG1iX3JldCAhPSBOVUxMKSB7CisgCQltYl9yZXRbMF0gPSBtY3AtPm1iWzBdOworIAkJbWJfcmV0WzFdID0gbWNwLT5tYlsxXTsKKyAJCW1iX3JldFs2XSA9IG1jcC0+bWJbNl07CisgCQltYl9yZXRbN10gPSBtY3AtPm1iWzddOworIAl9CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworIAkJLyogQVYgdG1wIGNvZGU6IG5lZWQgdG8gY2hhbmdlIG1haW4gbWFpbGJveF9jb21tYW5kIGZ1bmN0aW9uIHRvCisgCQkgKiByZXR1cm4gb2sgZXZlbiB3aGVuIHRoZSBtYWlsYm94IGNvbXBsZXRpb24gdmFsdWUgaXMgbm90CisgCQkgKiBTVUNDRVNTLiBUaGUgY2FsbGVyIG5lZWRzIHRvIGJlIHJlc3BvbnNpYmxlIHRvIGludGVycHJldAorIAkJICogdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhpcyBtYWlsYm94IGNvbW1hbmQgaWYgd2UncmUgbm90CisgCQkgKiB0byBjaGFuZ2UgdG9vIG11Y2ggb2YgdGhlIGV4aXN0aW5nIGNvZGUuCisgCQkgKi8KKyAJCWlmIChtY3AtPm1iWzBdID09IDB4NDAwNSB8fCBtY3AtPm1iWzBdID09IDB4NDAwNikKKyAJCQlydmFsID0gUUxBX1NVQ0NFU1M7CisKKwkJREVCVUcocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggIgorCQkgICAgIm1iWzZdPSV4IG1iWzddPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLCBydmFsLAorCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSk7KQorCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCAiCisJCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sIHJ2YWwsCisJCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzZdLCBtY3AtPm1iWzddKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogcWxhMngwMF9mYWJyaWNfbG9nb3V0CisgKglJc3N1ZSBsb2dvdXQgZmFicmljIHBvcnQgbWFpbGJveCBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglsb29wX2lkID0gZGV2aWNlIGxvb3AgSUQuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2ZhYnJpY19sb2dvdXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgbG9vcF9pZCkKK3sKKwlpbnQgcnZhbDsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisKKwlERUJVRzExKHByaW50aygicWxhMngwMF9mYWJyaWNfbG9nb3V0KCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJbWNwLT5tYlswXSA9IE1CQ19MT0dPVVRfRkFCUklDX1BPUlQ7CisJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKKwlpZiAoSEFTX0VYVEVOREVEX0lEUyhoYSkpIHsKKwkJbWNwLT5tYlsxXSA9IGxvb3BfaWQ7CisJCW1jcC0+bWJbMTBdID0gMDsKKwkJbWNwLT5vdXRfbWIgfD0gTUJYXzEwOworCX0gZWxzZSB7CisJCW1jcC0+bWJbMV0gPSBsb29wX2lkIDw8IDg7CisJfQorCisJbWNwLT5pbl9tYiA9IE1CWF8xfE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9mYWJyaWNfbG9nb3V0KCVsZCk6IGZhaWxlZD0leCAiCisJCSAgICAibWJ4MT0leC5cbiIsIGhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzFdKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2ZhYnJpY19sb2dvdXQoJWxkKTogZG9uZS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubyk7KQorCX0KKworCXJldHVybiBydmFsOworfQorCisvKgorICogcWxhMngwMF9mdWxsX2xvZ2luX2xpcAorICoJSXNzdWUgZnVsbCBsb2dpbiBMSVAgbWFpbGJveCBjb21tYW5kLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglUQVJHRVRfUVVFVUVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoJQURBUFRFUl9TVEFURV9MT0NLIG11c3QgYmUgcmVsZWFzZWQuCisgKgorICogUmV0dXJuczoKKyAqCXFsYTJ4MDAgbG9jYWwgZnVuY3Rpb24gcmV0dXJuIHN0YXR1cyBjb2RlLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworaW50CitxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZW50ZXJlZC5cbiIsCisJICAgIGhhLT5ob3N0X25vKTspCisKKwltY3AtPm1iWzBdID0gTUJDX0xJUF9GVUxMX0xPR0lOOworCW1jcC0+bWJbMV0gPSAwOworCW1jcC0+bWJbMl0gPSAwOworCW1jcC0+bWJbM10gPSAwOworCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT5pbl9tYiA9IE1CWF8wOworCW1jcC0+dG92ID0gMzA7CisJbWNwLT5mbGFncyA9IDA7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKGhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSovCisJCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9mdWxsX2xvZ2luX2xpcCglbGQpOiBmYWlsZWQ9JXguXG4iLAorCQkgICAgaGEtPmluc3RhbmNlLCBydmFsKTspCisJfSBlbHNlIHsKKwkJLypFTVBUWSovCisJCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKCVsZCk6IGRvbmUuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pOykKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHFsYTJ4MDBfZ2V0X2lkX2xpc3QKKyAqCisgKiBJbnB1dDoKKyAqCWhhID0gYWRhcHRlciBibG9jayBwb2ludGVyLgorICoKKyAqIFJldHVybnM6CisgKglxbGEyeDAwIGxvY2FsIGZ1bmN0aW9uIHJldHVybiBzdGF0dXMgY29kZS4KKyAqCisgKiBDb250ZXh0OgorICoJS2VybmVsIGNvbnRleHQuCisgKi8KK2ludAorcWxhMngwMF9nZXRfaWRfbGlzdChzY3NpX3FsYV9ob3N0X3QgKmhhLCB2b2lkICppZF9saXN0LCBkbWFfYWRkcl90IGlkX2xpc3RfZG1hLAorICAgIHVpbnQxNl90ICplbnRyaWVzKQoreworCWludCBydmFsOworCW1ieF9jbWRfdCBtYzsKKwltYnhfY21kX3QgKm1jcCA9ICZtYzsKKworCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGVudGVyZWQuXG4iLAorCSAgICBoYS0+aG9zdF9ubyk7KQorCisJaWYgKGlkX2xpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwltY3AtPm1iWzBdID0gTUJDX0dFVF9JRF9MSVNUOworCW1jcC0+bWJbMV0gPSBNU1coaWRfbGlzdF9kbWEpOworCW1jcC0+bWJbMl0gPSBMU1coaWRfbGlzdF9kbWEpOworCW1jcC0+bWJbM10gPSBNU1coTVNEKGlkX2xpc3RfZG1hKSk7CisJbWNwLT5tYls2XSA9IExTVyhNU0QoaWRfbGlzdF9kbWEpKTsKKwltY3AtPm91dF9tYiA9IE1CWF82fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMXxNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCS8qRU1QVFkqLworCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X2lkX2xpc3QoJWxkKTogZmFpbGVkPSV4LlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBydmFsKTspCisJfSBlbHNlIHsKKwkJKmVudHJpZXMgPSBtY3AtPm1iWzFdOworCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfaWRfbGlzdCglbGQpOiBkb25lLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2dldF9yZXNvdXJjZV9jbnRzCisgKglHZXQgY3VycmVudCBmaXJtd2FyZSByZXNvdXJjZSBjb3VudHMuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X3Jlc291cmNlX2NudHMoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgKmN1cl94Y2hnX2NudCwKKyAgICB1aW50MTZfdCAqb3JpZ194Y2hnX2NudCwgdWludDE2X3QgKmN1cl9pb2NiX2NudCwgdWludDE2X3QgKm9yaWdfaW9jYl9jbnQpCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1JFU09VUkNFX0NPVU5UUzsKKwltY3AtPm91dF9tYiA9IE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMTB8TUJYXzd8TUJYXzZ8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJbWNwLT50b3YgPSAzMDsKKwltY3AtPmZsYWdzID0gMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgPSAleC5cbiIsIF9fZnVuY19fLAorCQkgICAgaGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pOykKKwl9IGVsc2UgeworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS4gbWIxPSV4IG1iMj0leCBtYjM9JXggbWI2PSV4ICIKKwkJICAgICJtYjc9JXggbWIxMD0leC5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywKKwkJICAgIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0sIG1jcC0+bWJbM10sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10sIAorCQkgICAgbWNwLT5tYlsxMF0pKTsKKworCQlpZiAoY3VyX3hjaGdfY250KQorCQkJKmN1cl94Y2hnX2NudCA9IG1jcC0+bWJbM107CisJCWlmIChvcmlnX3hjaGdfY250KQorCQkJKm9yaWdfeGNoZ19jbnQgPSBtY3AtPm1iWzZdOworCQlpZiAoY3VyX2lvY2JfY250KQorCQkJKmN1cl9pb2NiX2NudCA9IG1jcC0+bWJbN107CisJCWlmIChvcmlnX2lvY2JfY250KQorCQkJKm9yaWdfaW9jYl9jbnQgPSBtY3AtPm1iWzEwXTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKQorLyoKKyAqIHFsYTJ4MDBfZ2V0X2ZjYWxfcG9zaXRpb25fbWFwCisgKglHZXQgRkNBTCAoTElMUCkgcG9zaXRpb24gbWFwIHVzaW5nIG1haWxib3ggY29tbWFuZAorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIHN0YXRlIHBvaW50ZXIuCisgKglwb3NfbWFwID0gYnVmZmVyIHBvaW50ZXIgKGNhbiBiZSBOVUxMKS4KKyAqCisgKiBSZXR1cm5zOgorICoJcWxhMngwMCBsb2NhbCBmdW5jdGlvbiByZXR1cm4gc3RhdHVzIGNvZGUuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitpbnQKK3FsYTJ4MDBfZ2V0X2ZjYWxfcG9zaXRpb25fbWFwKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGNoYXIgKnBvc19tYXApCit7CisJaW50IHJ2YWw7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCWNoYXIgKnBtYXA7CisJZG1hX2FkZHJfdCBwbWFwX2RtYTsKKworCXBtYXAgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0FUT01JQywgJnBtYXBfZG1hKTsKKwlpZiAocG1hcCAgPT0gTlVMTCkgeworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6ICoqKiogTWVtIEFsbG9jIEZhaWxlZCAqKioqIiwKKwkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CisJfQorCW1lbXNldChwbWFwLCAwLCBGQ0FMX01BUF9TSVpFKTsKKworCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZDX0FMX1BPU0lUSU9OX01BUDsKKwltY3AtPm1iWzJdID0gTVNXKHBtYXBfZG1hKTsKKwltY3AtPm1iWzNdID0gTFNXKHBtYXBfZG1hKTsKKwltY3AtPm1iWzZdID0gTVNXKE1TRChwbWFwX2RtYSkpOworCW1jcC0+bWJbN10gPSBMU1coTVNEKHBtYXBfZG1hKSk7CisJbWNwLT5vdXRfbWIgPSBNQlhfN3xNQlhfNnxNQlhfM3xNQlhfMnxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzF8TUJYXzA7CisJbWNwLT5idWZfc2l6ZSA9IEZDQUxfTUFQX1NJWkU7CisJbWNwLT5mbGFncyA9IE1CWF9ETUFfSU47CisJbWNwLT50b3YgPSAoaGEtPmxvZ2luX3RpbWVvdXQgKiAyKSArIChoYS0+bG9naW5fdGltZW91dCAvIDIpOworCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiAobWIwPSV4L21iMT0leCkgRkMvQUwgUG9zaXRpb24gTWFwICIKKwkJICAgICJzaXplICgleClcbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubywgbWNwLT5tYlswXSwKKwkJICAgIG1jcC0+bWJbMV0sICh1bnNpZ25lZClwbWFwWzBdKSk7CisJCURFQlVHMTEocWxhMngwMF9kdW1wX2J1ZmZlcihwbWFwLCBwbWFwWzBdICsgMSkpOworCisJCWlmIChwb3NfbWFwKQorCQkJbWVtY3B5KHBvc19tYXAsIHBtYXAsIEZDQUxfTUFQX1NJWkUpOworCX0KKwlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBwbWFwLCBwbWFwX2RtYSk7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgeworCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOworCX0KKworCXJldHVybiBydmFsOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODYzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMCwwICsxLDQ0NTYgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisKKy8qCisgKiBEcml2ZXIgdmVyc2lvbgorICovCitjaGFyIHFsYTJ4MDBfdmVyc2lvbl9zdHJbNDBdOworCisvKgorICogU1JCIGFsbG9jYXRpb24gY2FjaGUKKyAqLworY2hhciBzcmJfY2FjaGVwX25hbWVbMTZdOwora21lbV9jYWNoZV90ICpzcmJfY2FjaGVwOworCisvKgorICogU3RhdHMgZm9yIGFsbCBhZHBhdGVycy4KKyAqLworc3RydWN0IF9xbGEyeDAwc3RhdHMgcWxhMngwMF9zdGF0czsKKworLyoKKyAqIElvY3RsIHJlbGF0ZWQgaW5mb3JtYXRpb24uCisgKi8KK2ludCBudW1faG9zdHM7CitpbnQgYXBpSEJBSW5zdGFuY2U7CisKKy8qCisgKiBNb2R1bGUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGFuZCB2YXJpYWJsZXMKKyAqLworaW50IHFsMnhtYXhxZGVwdGg7Cittb2R1bGVfcGFyYW0ocWwyeG1heHFkZXB0aCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4bWF4cWRlcHRoLAorCQkiTWF4aW11bSBxdWV1ZSBkZXB0aCB0byByZXBvcnQgZm9yIHRhcmdldCBkZXZpY2VzLiIpOworCitpbnQgcWwyeGxvZ2ludGltZW91dCA9IDIwOworbW9kdWxlX3BhcmFtKHFsMnhsb2dpbnRpbWVvdXQsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGxvZ2ludGltZW91dCwKKwkJIkxvZ2luIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcy4iKTsKKworaW50IHFscG9ydF9kb3duX3JldHJ5OworbW9kdWxlX3BhcmFtKHFscG9ydF9kb3duX3JldHJ5LCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFscG9ydF9kb3duX3JldHJ5LAorCQkiTWF4aW11bSBudW1iZXIgb2YgY29tbWFuZCByZXRyaWVzIHRvIGEgcG9ydCB0aGF0IHJldHVybnMiCisJCSJhIFBPUlQtRE9XTiBzdGF0dXMuIik7CisKK2ludCBxbDJ4cmV0cnljb3VudCA9IDIwOworbW9kdWxlX3BhcmFtKHFsMnhyZXRyeWNvdW50LCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhyZXRyeWNvdW50LAorCQkiTWF4aW11bSBudW1iZXIgb2YgbWlkLWxheWVyIHJldHJpZXMgYWxsb3dlZCBmb3IgYSBjb21tYW5kLiAgIgorCQkiRGVmYXVsdCB2YWx1ZSBpcyAyMCwgIik7CisKK2ludCBkaXNwbGF5Q29uZmlnOworbW9kdWxlX3BhcmFtKGRpc3BsYXlDb25maWcsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzcGxheUNvbmZpZywKKwkJIklmIDEgdGhlbiBkaXNwbGF5IHRoZSBjb25maWd1cmF0aW9uIHVzZWQgaW4gL2V0Yy9tb2Rwcm9iZS5jb25mLiIpOworCitpbnQgcWwyeHBsb2dpYWJzZW50ZGV2aWNlOworbW9kdWxlX3BhcmFtKHFsMnhwbG9naWFic2VudGRldmljZSwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4cGxvZ2lhYnNlbnRkZXZpY2UsCisJCSJPcHRpb24gdG8gZW5hYmxlIFBMT0dJIHRvIGRldmljZXMgdGhhdCBhcmUgbm90IHByZXNlbnQgYWZ0ZXIgIgorCQkiYSBGYWJyaWMgc2Nhbi4gIFRoaXMgaXMgbmVlZGVkIGZvciBzZXZlcmFsIGJyb2tlbiBzd2l0Y2hlcy4iCisJCSJEZWZhdWx0IGlzIDAgLSBubyBQTE9HSS4gMSAtIHBlcmZvbSBQTE9HSS4iKTsKKworaW50IHFsMnhlbmFibGV6aW8gPSAwOworbW9kdWxlX3BhcmFtKHFsMnhlbmFibGV6aW8sIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGVuYWJsZXppbywKKwkJIk9wdGlvbiB0byBlbmFibGUgWklPOklmIDEgdGhlbiBlbmFibGUgaXQgb3RoZXJ3aXNlIiAKKwkJIiB1c2UgdGhlIGRlZmF1bHQgc2V0IGluIHRoZSBOVlJBTS4iCisJCSIgRGVmYXVsdCBpcyAwIDogZGlzYWJsZWQiKTsKKworaW50IHFsMnhpbnRyZGVsYXl0aW1lciA9IDEwOworbW9kdWxlX3BhcmFtKHFsMnhpbnRyZGVsYXl0aW1lciwgaW50LCBTX0lSVUdPfFNfSVJVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4aW50cmRlbGF5dGltZXIsCisJCSJaSU86IFdhaXRpbmcgdGltZSBmb3IgRmlybXdhcmUgYmVmb3JlIGl0IGdlbmVyYXRlcyBhbiAiCisJCSJpbnRlcnJ1cHQgdG8gdGhlIGhvc3QgdG8gbm90aWZ5IGNvbXBsZXRpb24gb2YgcmVxdWVzdC4iKTsKKworaW50IENvbmZpZ1JlcXVpcmVkOworbW9kdWxlX3BhcmFtKENvbmZpZ1JlcXVpcmVkLCBpbnQsIFNfSVJVR098U19JUlVTUik7CitNT0RVTEVfUEFSTV9ERVNDKENvbmZpZ1JlcXVpcmVkLAorCQkiSWYgMSwgdGhlbiBvbmx5IGNvbmZpZ3VyZWQgZGV2aWNlcyBwYXNzZWQgaW4gdGhyb3VnaCB0aGUiCisJCSJxbDJ4b3B0cyBwYXJhbWV0ZXIgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIE9TIik7CisKK2ludCBCaW5kID0gQklORF9CWV9QT1JUX05BTUU7Cittb2R1bGVfcGFyYW0oQmluZCwgaW50LCBTX0lSVUdPfFNfSVJVU1IpOworTU9EVUxFX1BBUk1fREVTQyhCaW5kLAorCQkiVGFyZ2V0IHBlcnNpc3RlbnQgYmluZGluZyBtZXRob2Q6ICIKKwkJIjAgYnkgUG9ydG5hbWUgKGRlZmF1bHQpOyAxIGJ5IFBvcnRJRDsgMiBieSBOb2RlbmFtZS4gIik7CisKK2ludCBxbDJ4c3VzcGVuZGNvdW50ID0gU1VTUEVORF9DT1VOVDsKK21vZHVsZV9wYXJhbShxbDJ4c3VzcGVuZGNvdW50LCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhzdXNwZW5kY291bnQsCisJCSJOdW1iZXIgb2YgNi1zZWNvbmQgc3VzcGVuZCBpdGVyYXRpb25zIHRvIHBlcmZvcm0gd2hpbGUgYSAiCisJCSJ0YXJnZXQgcmV0dXJucyBhIDxOT1QgUkVBRFk+IHN0YXR1cy4gIERlZmF1bHQgaXMgMTAgIgorCQkiaXRlcmF0aW9ucy4iKTsKKworaW50IHFsMnhkb2luaXRzY2FuID0gMTsKK21vZHVsZV9wYXJhbShxbDJ4ZG9pbml0c2NhbiwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZG9pbml0c2NhbiwKKwkJIlNpZ25hbCBtaWQtbGF5ZXIgdG8gcGVyZm9ybSBzY2FuIGFmdGVyIGRyaXZlciBsb2FkOiAwIC0tIG5vICIKKwkJInNpZ25hbCBzZW50IHRvIG1pZC1sYXllci4iKTsKKworaW50IHFsMnhsb2dpbnJldHJ5Y291bnQgPSAwOworbW9kdWxlX3BhcmFtKHFsMnhsb2dpbnJldHJ5Y291bnQsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGxvZ2lucmV0cnljb3VudCwKKwkJIlNwZWNpZnkgYW4gYWx0ZXJuYXRlIHZhbHVlIGZvciB0aGUgTlZSQU0gbG9naW4gcmV0cnkgY291bnQuIik7CisKKy8qCisgKiBQcm9jIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucworICovCitzdHJ1Y3QgaW5mb19zdHIgeworCWNoYXIJKmJ1ZmZlcjsKKwlpbnQJbGVuZ3RoOworCW9mZl90CW9mZnNldDsKKwlpbnQJcG9zOworfTsKKworc3RhdGljIHZvaWQgY29weV9tZW1faW5mbyhzdHJ1Y3QgaW5mb19zdHIgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBjb3B5X2luZm8oc3RydWN0IGluZm9fc3RyICosIGNoYXIgKiwgLi4uKTsKKworc3RhdGljIHZvaWQgcWxhMngwMF9mcmVlX2RldmljZShzY3NpX3FsYV9ob3N0X3QgKik7CisKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKHNjc2lfcWxhX2hvc3RfdCAqaGEpOworCisvKgorICogU0NTSSBob3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cyAKKyAqLworc3RhdGljIGludCBxbGEyeHh4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkZXZpY2UpOworc3RhdGljIGludCBxbGEyeDAwX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCXZvaWQgKCpmbikoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgaW50IHFsYTJ4eHhfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgcWxhMnh4eF9laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgcWxhMnh4eF9laF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgcWxhMnh4eF9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHFsYTJ4MDBfbG9vcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKmhhKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9kZXZpY2VfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKKworc3RhdGljIGludCBxbGEyeDAwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwKKyAgICBvZmZfdCwgaW50LCBpbnQpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBxbGEyeDAwX2RyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gInFsYTJ4eHgiLAorCS5wcm9jX25hbWUJCT0gInFsYTJ4eHgiLAorCS5wcm9jX2luZm8JCT0gcWxhMngwMF9wcm9jX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBxbGEyeDAwX3F1ZXVlY29tbWFuZCwKKworCS5laF9hYm9ydF9oYW5kbGVyCT0gcWxhMnh4eF9laF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBxbGEyeHh4X2VoX2RldmljZV9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBxbGEyeHh4X2VoX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gcWxhMnh4eF9laF9ob3N0X3Jlc2V0LAorCisJLnNsYXZlX2NvbmZpZ3VyZQk9IHFsYTJ4eHhfc2xhdmVfY29uZmlndXJlLAorCisJLnRoaXNfaWQJCT0gLTEsCisJLmNtZF9wZXJfbHVuCQk9IDMsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCisJLyoKKwkgKiBUaGUgUklTQyBhbGxvd3MgZm9yIGVhY2ggY29tbWFuZCB0byB0cmFuc2ZlciAoMl4zMi0xKSBieXRlcyBvZiBkYXRhLAorCSAqIHdoaWNoIGVxdWF0ZXMgdG8gMHg4MDAwMDAgc2VjdG9ycy4KKwkgKi8KKwkubWF4X3NlY3RvcnMJCT0gMHhGRkZGLAorfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqcWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOworCitzdGF0aWMgdm9pZCBxbGEyeDAwX2Rpc3BsYXlfZmNfbmFtZXMoc2NzaV9xbGFfaG9zdF90ICopOworCisvKiBUT0RPIENvbnZlcnQgdG8gaW5saW5lcworICoKKyAqIFRpbWVyIHJvdXRpbmVzCisgKi8KKyNkZWZpbmUJV0FUQ0hfSU5URVJWQUwJCTEgICAgICAgLyogbnVtYmVyIG9mIHNlY29uZHMgKi8KKworc3RhdGljIHZvaWQgcWxhMngwMF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKik7CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcWxhMngwMF9zdGFydF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKiwKKyAgICB2b2lkICosIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX3Jlc3RhcnRfdGltZXIoc2NzaV9xbGFfaG9zdF90ICosIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX3N0b3BfdGltZXIoc2NzaV9xbGFfaG9zdF90ICopOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfc3RhcnRfdGltZXIoc2NzaV9xbGFfaG9zdF90ICpoYSwgdm9pZCAqZnVuYywgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKK3sKKwlpbml0X3RpbWVyKCZoYS0+dGltZXIpOworCWhhLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGludGVydmFsICogSFo7CisJaGEtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyloYTsKKwloYS0+dGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpZnVuYzsKKwlhZGRfdGltZXIoJmhhLT50aW1lcik7CisJaGEtPnRpbWVyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF9yZXN0YXJ0X3RpbWVyKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJbW9kX3RpbWVyKCZoYS0+dGltZXIsIGppZmZpZXMgKyBpbnRlcnZhbCAqIEhaKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorcWxhMngwMF9zdG9wX3RpbWVyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJZGVsX3RpbWVyX3N5bmMoJmhhLT50aW1lcik7CisJaGEtPnRpbWVyX2FjdGl2ZSA9IDA7Cit9CisKK3ZvaWQgcWxhMngwMF9jbWRfdGltZW91dChzcmJfdCAqKTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBxbGEyeDAwX2NhbGxiYWNrKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIF9faW5saW5lX18gdm9pZCBzcF9wdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSwgc3JiX3QgKnNwKTsKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3BfZ2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHNyYl90ICpzcCk7CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitxbGEyeDAwX2RlbGV0ZV9mcm9tX2RvbmVfcXVldWUoc2NzaV9xbGFfaG9zdF90ICosIHNyYl90ICopOyAKKworLyoKKyogcWxhMngwMF9jYWxsYmFjaworKiAgICAgIFJldHVybnMgdGhlIGNvbXBsZXRlZCBTQ1NJIGNvbW1hbmQgdG8gTElOVVguCisqCisqIElucHV0OgorKgloYSAtLSBIb3N0IGFkYXB0ZXIgc3RydWN0dXJlCisqCWNtZCAtLSBTQ1NJIG1pZC1sZXZlbCBjb21tYW5kIHN0cnVjdHVyZS4KKyogUmV0dXJuczoKKyogICAgICBOb25lCisqIE5vdGU6RnJvbSBmYWlsb3ZlciBwb2ludCBvZiB2aWV3IHdlIGFsd2F5cyBnZXQgdGhlIHNwCisqICAgICAgZnJvbSB2aXNfaGEgcG9vbCBpbiBxdWV1ZWNvbW1hbmQuU28gd2hlbiB3ZSBwdXQgaXQgCisqICAgICAgYmFjayB0byB0aGUgcG9vbCBpdCBoYXMgdG8gYmUgdGhlIHZpc19oYS4JIAorKiAgICAgIFNvIHJlbHkgb24gc3RydWN0IHNjc2lfY21uZCB0byBnZXQgdGhlIHZpc19oYSBhbmQgbm90IG9uIHNwLiAJCSAJCisqLworc3RhdGljIGlubGluZSB2b2lkCitxbGEyeDAwX2NhbGxiYWNrKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzcmJfdCAqc3AgPSAoc3JiX3QgKikgQ01EX1NQKGNtZCk7CisJc2NzaV9xbGFfaG9zdF90ICp2aXNfaGE7CisJb3NfbHVuX3QgKmxxOworCWludCBnb3Rfc2Vuc2U7CisJdW5zaWduZWQgbG9uZwljcHVfZmxhZ3MgPSAwOworCisJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTDsKKwl2aXNfaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWlmIChzcCA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSIlcygpOiAqKioqIENNRCBkZXJpdmVzIGEgTlVMTCBTUFxuIiwKKwkJCV9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBERUJVRzIoQlVHKCk7KQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiBjb21tYW5kIHN0YXR1cyBpcyBub3QgRElEX0JVU19CVVNZIHRoZW4gZ28gYWhlYWQgYW5kIGZyZWVkIHNwLgorCSAqLworCS8qCisJICogQ2FuY2VsIGNvbW1hbmQgdGltZW91dAorCSAqLworCXFsYTJ4MDBfZGVsZXRlX3RpbWVyX2Zyb21fY21kKHNwKTsKKworCS8qCisJICogUHV0IFNQIGJhY2sgaW4gdGhlIGZyZWUgcXVldWUKKwkgKi8KKwlzcC0+Y21kICAgPSBOVUxMOworCUNNRF9TUChjbWQpID0gTlVMTDsKKwlscSA9IHNwLT5sdW5fcXVldWU7CisJZ290X3NlbnNlID0gKHNwLT5mbGFncyAmIFNSQl9HT1RfU0VOU0UpPyAxOiAwOworCWFkZF90b19mcmVlX3F1ZXVlKHZpc19oYSwgc3ApOworCisJaWYgKGhvc3RfYnl0ZShjbWQtPnJlc3VsdCkgPT0gRElEX09LKSB7CisJCS8qIGRldmljZSBvayAqLworCQloYS0+dG90YWxfYnl0ZXMgKz0gY21kLT5idWZmbGVuOworCQlpZiAoIWdvdF9zZW5zZSkgeworCQkJLyogSWYgbHVuIHdhcyBzdXNwZW5kZWQgdGhlbiBjbGVhciByZXRyeSBjb3VudCAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxxLT5xX2xvY2ssIGNwdV9mbGFncyk7CisJCQlpZiAoIXRlc3RfYml0KExVTl9FWEVDX0RFTEFZRUQsICZscS0+cV9mbGFnKSkKKwkJCQlscS0+cV9zdGF0ZSA9IExVTl9TVEFURV9SRUFEWTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxxLT5xX2xvY2ssIGNwdV9mbGFncyk7CisJCX0KKwl9IGVsc2UgaWYgKGhvc3RfYnl0ZShjbWQtPnJlc3VsdCkgPT0gRElEX0VSUk9SKSB7CisJCS8qIGRldmljZSBlcnJvciAqLworCQloYS0+dG90YWxfZGV2X2VycnMrKzsKKwl9CisKKwkvKiBDYWxsIHRoZSBtaWQtbGV2ZWwgZHJpdmVyIGludGVycnVwdCBoYW5kbGVyICovCisJKCooY21kKS0+c2NzaV9kb25lKShjbWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3BfcHV0CisqCisqIERlc2NyaXB0aW9uOgorKiAgIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIGlmIHdlJ3JlIHRoZSBsYXN0CisqICAgb3duZXIgb2YgdGhlIHNwZWNpZmllZCBzcC4gV2lsbCBnZXQgdGhlIGhvc3RfbG9jayBiZWZvcmUgY2FsbGluZworKiAgIHRoZSBjYWxsYmFjay4KKyoKKyogSW5wdXQ6CisqICAgaGEgLSBwb2ludGVyIHRvIHRoZSBzY3NpX3FsYV9ob3N0X3Qgd2hlcmUgdGhlIGNhbGxiYWNrIGlzIHRvIG9jY3VyLgorKiAgIHNwIC0gcG9pbnRlciB0byBzcmJfdCBzdHJ1Y3R1cmUgdG8gdXNlLgorKgorKiBSZXR1cm5zOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwX3B1dChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqc3ApCit7CisgICAgICAgIGlmIChhdG9taWNfcmVhZCgmc3AtPnJlZl9jb3VudCkgPT0gMCkgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkiJXMoKTogKioqKiBTUC0+cmVmX2NvdW50IG5vdCB6ZXJvXG4iLAorCQkJX19mdW5jX18pOworICAgICAgICAgICAgICAgIERFQlVHMihCVUcoKTspCisKKyAgICAgICAgICAgICAgICByZXR1cm47CisJfQorCisgICAgICAgIGlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmc3AtPnJlZl9jb3VudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBxbGEyeDAwX2NhbGxiYWNrKGhhLCBzcC0+Y21kKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNwX2dldAorKgorKiBEZXNjcmlwdGlvbjoKKyogICBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBzcGVjaWZpZWQgc3AuCisqCisqIElucHV0OgorKiAgIHNwIC0gcG9pbnRlciB0byBzcmJfdCBzdHJ1Y3R1cmUgdG8gdXNlLgorKgorKiBSZXR1cm5zOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwX2dldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCBzcmJfdCAqc3ApCit7CisgICAgICAgIGF0b21pY19pbmMoJnNwLT5yZWZfY291bnQpOworCisgICAgICAgIGlmIChhdG9taWNfcmVhZCgmc3AtPnJlZl9jb3VudCkgPiAyKSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSIlcygpOiAqKioqIFNQLT5yZWZfY291bnQgZ3JlYXRlciB0aGFuIHR3b1xuIiwKKwkJCV9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBERUJVRzIoQlVHKCk7KQorCisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3FsYTJ4MDBfZGVsZXRlX2Zyb21fZG9uZV9xdWV1ZShzY3NpX3FsYV9ob3N0X3QgKmRlc3RfaGEsIHNyYl90ICpzcCkgCit7CisJLyogcmVtb3ZlIGNvbW1hbmQgZnJvbSBkb25lIGxpc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZzcC0+bGlzdCk7CisJZGVzdF9oYS0+ZG9uZV9xX2NudC0tOworCXNwLT5zdGF0ZSA9IFNSQl9OT19RVUVVRV9TVEFURTsKKworCWlmIChzcC0+ZmxhZ3MgJiBTUkJfRE1BX1ZBTElEKSB7CisJCXNwLT5mbGFncyAmPSB+U1JCX0RNQV9WQUxJRDsKKworCQkvKiBSZWxlYXNlIG1lbW9yeSB1c2VkIGZvciB0aGlzIEkvTyAqLworCQlpZiAoc3AtPmNtZC0+dXNlX3NnKSB7CisJCQlwY2lfdW5tYXBfc2coZGVzdF9oYS0+cGRldiwgc3AtPmNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkgICAgc3AtPmNtZC0+dXNlX3NnLCBzcC0+Y21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSBpZiAoc3AtPmNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCQlwY2lfdW5tYXBfcGFnZShkZXN0X2hhLT5wZGV2LCBzcC0+ZG1hX2hhbmRsZSwKKwkJCSAgICBzcC0+Y21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkgICAgc3AtPmNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHFsYTJ4MDBfZG9fZHBjKHZvaWQgKmRhdGEpOworCitzdGF0aWMgdm9pZCBxbGEyeDAwX3JzdF9hZW4oc2NzaV9xbGFfaG9zdF90ICopOworCitzdGF0aWMgdWludDhfdCBxbGEyeDAwX21lbV9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgdm9pZCBxbGEyeDAwX21lbV9mcmVlKHNjc2lfcWxhX2hvc3RfdCAqaGEpOworc3RhdGljIGludCBxbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2woIHNjc2lfcWxhX2hvc3RfdCAqaGEpOworc3RhdGljIHZvaWQgcWxhMngwMF9mcmVlX3NwX3Bvb2woc2NzaV9xbGFfaG9zdF90ICpoYSk7CitzdGF0aWMgc3JiX3QgKnFsYTJ4MDBfZ2V0X25ld19zcChzY3NpX3FsYV9ob3N0X3QgKmhhKTsKKworc3RhdGljIHNzaXplX3QgcWxhMngwMF9zeXNmc19yZWFkX2Z3X2R1bXAoc3RydWN0IGtvYmplY3QgKiwgY2hhciAqLCBsb2ZmX3QsCisgICAgc2l6ZV90KTsKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfd3JpdGVfZndfZHVtcChzdHJ1Y3Qga29iamVjdCAqLCBjaGFyICosIGxvZmZfdCwKKyAgICBzaXplX3QpOworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHN5c2ZzX2Z3X2R1bXBfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAiZndfZHVtcCIsCisJCS5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1IsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSAwLAorCS5yZWFkID0gcWxhMngwMF9zeXNmc19yZWFkX2Z3X2R1bXAsCisJLndyaXRlID0gcWxhMngwMF9zeXNmc193cml0ZV9md19kdW1wLAorfTsKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfcmVhZF9udnJhbShzdHJ1Y3Qga29iamVjdCAqLCBjaGFyICosIGxvZmZfdCwKKyAgICBzaXplX3QpOworc3RhdGljIHNzaXplX3QgcWxhMngwMF9zeXNmc193cml0ZV9udnJhbShzdHJ1Y3Qga29iamVjdCAqLCBjaGFyICosIGxvZmZfdCwKKyAgICBzaXplX3QpOworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHN5c2ZzX252cmFtX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm52cmFtIiwKKwkJLm1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IHNpemVvZihudnJhbV90KSwKKwkucmVhZCA9IHFsYTJ4MDBfc3lzZnNfcmVhZF9udnJhbSwKKwkud3JpdGUgPSBxbGEyeDAwX3N5c2ZzX3dyaXRlX252cmFtLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBTeXNGUyBhdHRyaWJ1dGVzLiAqLworc3RhdGljIHNzaXplX3QgcWxhMngwMF9zeXNmc19yZWFkX2Z3X2R1bXAoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKyAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCisJaWYgKGhhLT5md19kdW1wX3JlYWRpbmcgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG9mZiA+IGhhLT5md19kdW1wX2J1ZmZlcl9sZW4pCisJCXJldHVybiAwOworCWlmIChvZmYgKyBjb3VudCA+IGhhLT5md19kdW1wX2J1ZmZlcl9sZW4pCisJCWNvdW50ID0gaGEtPmZ3X2R1bXBfYnVmZmVyX2xlbiAtIG9mZjsKKworCW1lbWNweShidWYsICZoYS0+ZndfZHVtcF9idWZmZXJbb2ZmXSwgY291bnQpOworCisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfd3JpdGVfZndfZHVtcChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorICAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChkZXZfdG9fc2hvc3QoY29udGFpbmVyX29mKGtvYmosCisJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CisJaW50IHJlYWRpbmc7CisJdWludDMyX3QgZHVtcF9zaXplOworCisJaWYgKG9mZiAhPSAwKQorCQlyZXR1cm4gKDApOworCisJcmVhZGluZyA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJc3dpdGNoIChyZWFkaW5nKSB7CisJY2FzZSAwOgorCQlpZiAoaGEtPmZ3X2R1bXBfcmVhZGluZyA9PSAxKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAgIkZpcm13YXJlIGR1bXAgY2xlYXJlZCBvbiAoJWxkKS5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pOworCisJCQl2ZnJlZShoYS0+ZndfZHVtcF9idWZmZXIpOworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyloYS0+ZndfZHVtcCwKKwkJCSAgICBoYS0+ZndfZHVtcF9vcmRlcik7CisKKwkJCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOworCQkJaGEtPmZ3X2R1bXBfYnVmZmVyID0gTlVMTDsKKwkJCWhhLT5md19kdW1wID0gTlVMTDsKKwkJfQorCQlicmVhazsKKwljYXNlIDE6CisJCWlmIChoYS0+ZndfZHVtcCAhPSBOVUxMICYmICFoYS0+ZndfZHVtcF9yZWFkaW5nKSB7CisJCQloYS0+ZndfZHVtcF9yZWFkaW5nID0gMTsKKworCQkJZHVtcF9zaXplID0gRldfRFVNUF9TSVpFXzFNOworCQkJaWYgKGhhLT5md19tZW1vcnlfc2l6ZSA8IDB4MjAwMDApIAorCQkJCWR1bXBfc2l6ZSA9IEZXX0RVTVBfU0laRV8xMjhLOworCQkJZWxzZSBpZiAoaGEtPmZ3X21lbW9yeV9zaXplIDwgMHg4MDAwMCkgCisJCQkJZHVtcF9zaXplID0gRldfRFVNUF9TSVpFXzUxMks7CisJCQloYS0+ZndfZHVtcF9idWZmZXIgPSAoY2hhciAqKXZtYWxsb2MoZHVtcF9zaXplKTsKKwkJCWlmIChoYS0+ZndfZHVtcF9idWZmZXIgPT0gTlVMTCkgeworCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZpcm13YXJlICIKKwkJCQkgICAgImR1bXAgYnVmZmVyICglZCkuXG4iLCBkdW1wX3NpemUpOworCisJCQkJaGEtPmZ3X2R1bXBfcmVhZGluZyA9IDA7CisJCQkJcmV0dXJuIChjb3VudCk7CisJCQl9CisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAgIkZpcm13YXJlIGR1bXAgcmVhZHkgZm9yIHJlYWQgb24gKCVsZCkuXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKTsKKwkJCW1lbXNldChoYS0+ZndfZHVtcF9idWZmZXIsIDAsIGR1bXBfc2l6ZSk7CisJCQlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisgCQkJCXFsYTIxMDBfYXNjaWlfZndfZHVtcChoYSk7CisgCQkJZWxzZQorIAkJCQlxbGEyMzAwX2FzY2lpX2Z3X2R1bXAoaGEpOworCQkJaGEtPmZ3X2R1bXBfYnVmZmVyX2xlbiA9IHN0cmxlbihoYS0+ZndfZHVtcF9idWZmZXIpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgcWxhMngwMF9zeXNmc19yZWFkX252cmFtKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisgICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKKwkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKKwl1aW50MTZfdAkqd2l0ZXI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1aW50MTZfdAljbnQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDAgfHwgY291bnQgIT0gc2l6ZW9mKG52cmFtX3QpKQorCQlyZXR1cm4gMDsKKworCS8qIFJlYWQgTlZSQU0uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJcWxhMngwMF9sb2NrX252cmFtX2FjY2VzcyhoYSk7CisgCXdpdGVyID0gKHVpbnQxNl90ICopYnVmOworIAlmb3IgKGNudCA9IDA7IGNudCA8IGNvdW50IC8gMjsgY250KyspIHsKKwkJKndpdGVyID0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfbnZyYW1fd29yZChoYSwKKwkJICAgIGNudCtoYS0+bnZyYW1fYmFzZSkpOworCQl3aXRlcisrOworIAl9CisJcWxhMngwMF91bmxvY2tfbnZyYW1fYWNjZXNzKGhhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFsYTJ4MDBfc3lzZnNfd3JpdGVfbnZyYW0oc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKyAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAorCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOworCXVpbnQ4X3QJCSppdGVyOworCXVpbnQxNl90CSp3aXRlcjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVpbnQxNl90CWNudDsKKwl1aW50OF90CQljaGtzdW07CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDAgfHwgY291bnQgIT0gc2l6ZW9mKG52cmFtX3QpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrc3VtIE5WUkFNLiAqLworCWl0ZXIgPSAodWludDhfdCAqKWJ1ZjsKKwljaGtzdW0gPSAwOworCWZvciAoY250ID0gMDsgY250IDwgY291bnQgLSAxOyBjbnQrKykKKwkJY2hrc3VtICs9ICppdGVyKys7CisJY2hrc3VtID0gfmNoa3N1bSArIDE7CisJKml0ZXIgPSBjaGtzdW07CisKKwkvKiBXcml0ZSBOVlJBTS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlxbGEyeDAwX2xvY2tfbnZyYW1fYWNjZXNzKGhhKTsKKwlxbGEyeDAwX3JlbGVhc2VfbnZyYW1fcHJvdGVjdGlvbihoYSk7CisgCXdpdGVyID0gKHVpbnQxNl90ICopYnVmOworCWZvciAoY250ID0gMDsgY250IDwgY291bnQgLyAyOyBjbnQrKykgeworCQlxbGEyeDAwX3dyaXRlX252cmFtX3dvcmQoaGEsIGNudCtoYS0+bnZyYW1fYmFzZSwKKwkJICAgIGNwdV90b19sZTE2KCp3aXRlcikpOworCQl3aXRlcisrOworCX0KKwlxbGEyeDAwX3VubG9ja19udnJhbV9hY2Nlc3MoaGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjaGFyICoKK3FsYTJ4MDBfZ2V0X3BjaV9pbmZvX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgY2hhciAqcGNpX2J1c19tb2Rlc1tdID0geworCQkiMzMiLCAiNjYiLCAiMTAwIiwgIjEzMyIsCisJfTsKKwl1aW50MTZfdCBwY2lfYnVzOworCisJc3RyY3B5KHN0ciwgIlBDSSIpOworCXBjaV9idXMgPSAoaGEtPnBjaV9hdHRyICYgKEJJVF85IHwgQklUXzEwKSkgPj4gOTsKKwlpZiAocGNpX2J1cykgeworCQlzdHJjYXQoc3RyLCAiLVggKCIpOworCQlzdHJjYXQoc3RyLCBwY2lfYnVzX21vZGVzW3BjaV9idXNdKTsKKwl9IGVsc2UgeworCQlwY2lfYnVzID0gKGhhLT5wY2lfYXR0ciAmIEJJVF84KSA+PiA4OworCQlzdHJjYXQoc3RyLCAiICgiKTsKKwkJc3RyY2F0KHN0ciwgcGNpX2J1c19tb2Rlc1twY2lfYnVzXSk7CisJfQorCXN0cmNhdChzdHIsICIgTUh6KSIpOworCisJcmV0dXJuIChzdHIpOworfQorCitjaGFyICoKK3FsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb25fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqc3RyKQoreworCWNoYXIgdW5fc3RyWzEwXTsKKwkKKwlzcHJpbnRmKHN0ciwgIiVkLiUwMmQuJTAyZCAiLCBoYS0+ZndfbWFqb3JfdmVyc2lvbiwKKwkgICAgaGEtPmZ3X21pbm9yX3ZlcnNpb24sCisJICAgIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKKworCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF85KSB7CisJCXN0cmNhdChzdHIsICJGTFgiKTsKKwkJcmV0dXJuIChzdHIpOworCX0KKworCXN3aXRjaCAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiAweEZGKSB7CisJY2FzZSAweDc6CisJCXN0cmNhdChzdHIsICJFRiIpOworCQlicmVhazsKKwljYXNlIDB4MTc6CisJCXN0cmNhdChzdHIsICJUUCIpOworCQlicmVhazsKKwljYXNlIDB4Mzc6CisJCXN0cmNhdChzdHIsICJJUCIpOworCQlicmVhazsKKwljYXNlIDB4Nzc6CisJCXN0cmNhdChzdHIsICJWSSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcHJpbnRmKHVuX3N0ciwgIigleCkiLCBoYS0+ZndfYXR0cmlidXRlcyk7CisJCXN0cmNhdChzdHIsIHVuX3N0cik7CisJCWJyZWFrOworCX0KKwlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiAweDEwMCkKKwkJc3RyY2F0KHN0ciwgIlgiKTsKKworCXJldHVybiAoc3RyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4MDBfcXVldWVjb21tYW5kCisqCisqIERlc2NyaXB0aW9uOgorKiAgICAgUXVldWUgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgorKgorKiBJbnB1dDoKKyogICAgIGNtZCAtIHBvaW50ZXIgdG8gU2NzaSBjbWQgc3RydWN0dXJlCisqICAgICBmbiAtIHBvaW50ZXIgdG8gU2NzaSBkb25lIGZ1bmN0aW9uCisqCisqIFJldHVybnM6CisqICAgMCAtIEFsd2F5cworKgorKiBOb3RlOgorKiBUaGUgbWlkLWxldmVsIGRyaXZlciB0cmllcyB0byBlbnN1cmVzIHRoYXQgcXVldWVjb21tYW5kIG5ldmVyIGdldHMgaW52b2tlZAorKiBjb25jdXJyZW50bHkgd2l0aCBpdHNlbGYgb3IgdGhlIGludGVycnVwdCBoYW5kbGVyIChhbHRob3VnaCB0aGUKKyogaW50ZXJydXB0IGhhbmRsZXIgbWF5IGNhbGwgdGhpcyByb3V0aW5lIGFzIHBhcnQgb2YgcmVxdWVzdC1jb21wbGV0aW9uCisqIGhhbmRsaW5nKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorcWxhMngwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZm4pKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJZmNfcG9ydF90CSpmY3BvcnQ7CisJb3NfbHVuX3QJKmxxOworCW9zX3RndF90CSp0cTsKKwlzY3NpX3FsYV9ob3N0X3QJKmhhLCAqaGEyOworCXNyYl90CQkqc3A7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl1bnNpZ25lZCBpbnQJYiwgdCwgbDsKKwl1bnNpZ25lZCBsb25nCWhhbmRsZTsKKwlpbnQJCXdhc19lbXB0eTsKKworCisJaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OworCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBob3N0LT5ob3N0ZGF0YTsKKwl3YXNfZW1wdHkgPSAxOworCisJY21kLT5zY3NpX2RvbmUgPSBmbjsKKworCXNwaW5fdW5sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCS8qCisJICogQWxsb2NhdGUgYSBjb21tYW5kIHBhY2tldCBmcm9tIHRoZSAic3AiIHBvb2wuICBJZiB3ZSBjYW50IGdldCBiYWNrCisJICogb25lIHRoZW4gbGV0IHNjc2kgbGF5ZXIgY29tZSBiYWNrIGxhdGVyLgorCSAqLworCWlmICgoc3AgPSBxbGEyeDAwX2dldF9uZXdfc3AoaGEpKSA9PSBOVUxMKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNwIC0gcmV0cmllZC5cbiIpOworCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlzcC0+Y21kID0gY21kOworCUNNRF9TUChjbWQpID0gKHZvaWQgKilzcDsKKworCXNwLT5mbGFncyA9IDA7CisJaWYgKENNRF9SRVNJRF9MRU4oY21kKSAmIFNSQl9JT0NUTCkgeworCQkvKiBOZWVkIHRvIHNldCBzcC0+ZmxhZ3MgKi8KKwkJc3AtPmZsYWdzIHw9IFNSQl9JT0NUTDsKKwkJQ01EX1JFU0lEX0xFTihjbWQpID0gMDsgLyogQ2xlYXIgaXQgc2luY2Ugbm8gbW9yZSB1c2UuICovCisJfQorCisJc3AtPmZvX3JldHJ5X2NudCA9IDA7CisJc3AtPmVycl9pZCA9IDA7CisKKwkvKiBHZW5lcmF0ZSBMVSBxdWV1ZSBvbiBidXMsIHRhcmdldCwgTFVOICovCisJYiA9IGNtZC0+ZGV2aWNlLT5jaGFubmVsOworCXQgPSBjbWQtPmRldmljZS0+aWQ7CisJbCA9IGNtZC0+ZGV2aWNlLT5sdW47CisKKwkvKgorCSAqIFN0YXJ0IENvbW1hbmQgVGltZXIuIFR5cGljYWxseSBpdCB3aWxsIGJlIDIgc2Vjb25kcyBsZXNzIHRoYW4gd2hhdAorCSAqIGlzIHJlcXVlc3RlZCBieSB0aGUgSG9zdCBzdWNoIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgSU8gYmVmb3JlCisJICogYWJvcnRzIGFyZSBjYWxsZWQuCisJICovCisJaWYgKChjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLyBIWikgPiBRTEFfQ01EX1RJTUVSX0RFTFRBKQorCQlxbGEyeDAwX2FkZF90aW1lcl90b19jbWQoc3AsCisJCSAgICAoY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFopIC0gUUxBX0NNRF9USU1FUl9ERUxUQSk7CisJZWxzZQorCQlxbGEyeDAwX2FkZF90aW1lcl90b19jbWQoc3AsIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCAvIEhaKTsKKworCWlmIChsID49IGhhLT5tYXhfbHVucykgeworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9QT1JUOworCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkJc3BfcHV0KGhhLCBzcCk7CisKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoKHRxID0gKG9zX3RndF90ICopIFRHVF9RKGhhLCB0KSkgIT0gTlVMTCAmJgorCSAgICAobHEgPSAob3NfbHVuX3QgKikgTFVOX1EoaGEsIHQsIGwpKSAhPSBOVUxMKSB7CisJCWZjcG9ydCA9IGxxLT5mY2x1bi0+ZmNwb3J0OworCQloYTIgPSBmY3BvcnQtPmhhOworCX0gZWxzZSB7CisJCWxxID0gTlVMTDsKKwkJZmNwb3J0ID0gTlVMTDsKKwkJaGEyID0gaGE7CisJfQorCisJLyogU2V0IGFuIGludmFsaWQgaGFuZGxlIHVudGlsIHdlIGlzc3VlIHRoZSBjb21tYW5kIHRvIElTUCAqLworCS8qIHRoZW4gd2Ugd2lsbCBzZXQgdGhlIHJlYWwgaGFuZGxlIHZhbHVlLiAgICAgICAgICAgICAgICAgKi8KKwloYW5kbGUgPSBJTlZBTElEX0hBTkRMRTsKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWhhbmRsZTsKKworCS8qIEJvb2trZWVwaW5nIGluZm9ybWF0aW9uICovCisJc3AtPnJfc3RhcnQgPSBqaWZmaWVzOwkJLyogVGltZSB0aGUgcmVxdWVzdCB3YXMgcmVjaWV2ZWQuICovCisJc3AtPnVfc3RhcnQgPSAwOworCisJLyogU2V0dXAgZGV2aWNlIHF1ZXVlIHBvaW50ZXJzLiAqLworCXNwLT50Z3RfcXVldWUgPSB0cTsKKwlzcC0+bHVuX3F1ZXVlID0gbHE7CisKKwkvKgorCSAqIE5PVEUgOiBxIGlzIE5VTEwKKwkgKgorCSAqIDEuIFdoZW4gZGV2aWNlIGlzIGFkZGVkIGZyb20gcGVyc2lzdGVudCBiaW5kaW5nIGJ1dCBoYXMgbm90IGJlZW4KKwkgKiAgICBkaXNjb3ZlcmVkIHlldC5UaGUgc3RhdGUgb2YgbG9vcGlkID09IFBPUlRfQVZBSUwuCisJICogMi4gV2hlbiBkZXZpY2UgaXMgbmV2ZXIgZm91bmQgb24gdGhlIGJ1cy4obG9vcGlkID09IFVOVVNFRCkKKwkgKgorCSAqIElGIERldmljZSBRdWV1ZSBpcyBub3QgY3JlYXRlZCwgb3IgZGV2aWNlIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlCisJICogYW5kIGxpbmsgZG93biBlcnJvciByZXBvcnRpbmcgaXMgZW5hYmxlZCwgcmVqZWN0IElPLgorCSAqLworCWlmIChmY3BvcnQgPT0gTlVMTCkgeworCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZDolMmQ6JTJkKTogcG9ydCB1bmF2YWlsYWJsZVxuIiwKKwkJICAgIGhhLT5ob3N0X25vLHQsbCkpOworCisJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisKKwkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCQlzcF9wdXQoaGEsIHNwKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCS8qIE9ubHkgbW9kaWZ5IHRoZSBhbGxvd2VkIGNvdW50IGlmIHRoZSB0YXJnZXQgaXMgYSAqbm9uKiB0YXBlIGRldmljZSAqLworCWlmICgoZmNwb3J0LT5mbGFncyAmIEZDRl9UQVBFX1BSRVNFTlQpID09IDApIHsKKwkJc3AtPmZsYWdzICY9IH5TUkJfVEFQRTsKKwkJaWYgKGNtZC0+YWxsb3dlZCA8IHFsMnhyZXRyeWNvdW50KSB7CisJCQljbWQtPmFsbG93ZWQgPSBxbDJ4cmV0cnljb3VudDsKKwkJfQorCX0gZWxzZQorCQlzcC0+ZmxhZ3MgfD0gU1JCX1RBUEU7CisKKwlERUJVRzUocHJpbnRrKCJzY3NpKCVsZDolMmQ6JTJkKTogKHF1ZXVlY21kKSBxdWV1ZSBzcCA9ICVwLCAiCisJICAgICJmbGFncz0weCV4IGZvIHJldHJ5PSVkLCBwaWQ9JWxkXG4iLAorCSAgICBoYS0+aG9zdF9ubywgdCwgbCwgc3AsIHNwLT5mbGFncywgc3AtPmZvX3JldHJ5X2NudCwKKwkgICAgY21kLT5zZXJpYWxfbnVtYmVyKSk7CisJREVCVUc1KHFsYTJ4MDBfcHJpbnRfc2NzaV9jbWQoY21kKSk7CisKKwlzcC0+ZmNsdW4gPSBscS0+ZmNsdW47CisJc3AtPmhhID0gaGEyOworCisJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0JJRElSRUNUSU9OQUwgJiYKKwkgICAgY21kLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCkgeworCisJCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAic2NzaSglbGQpOiBJbmNvcnJlY3QgZGF0YSBkaXJlY3Rpb24gLSB0cmFuc2ZlciAiCisJCSAgICAibGVuZ3RoPSVkLCBkaXJlY3Rpb249JWQsIHBpZD0lbGQsIG9wY29kZT0leFxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbiwKKwkJICAgIGNtZC0+c2VyaWFsX251bWJlciwgY21kLT5jbW5kWzBdKSk7CisJfQorCisJLyogRmluYWwgcHJlLWNoZWNrIDoKKwkgKgorCSAqCUVpdGhlciBQT1JUX0RPV05fVElNRVIgT1IgTElOS19ET1dOX1RJTUVSIEV4cGlyZWQuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQgfHwKKwkgICAgYXRvbWljX3JlYWQoJmhhMi0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisJCS8qCisJCSAqIEFkZCB0aGUgY29tbWFuZCB0byB0aGUgZG9uZS1xdWV1ZSBmb3IgbGF0ZXIgZmFpbG92ZXIKKwkJICogcHJvY2Vzc2luZy4KKwkJICovCisJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWlmIChhdG9taWNfcmVhZCgmaGEyLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pIAorCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfTE9PUDsKKwkJZWxzZQorCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfUE9SVDsKKworCQlhZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCQlxbGEyeDAwX2RvbmUoaGEpOworCisJCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKHRxICYmIHRlc3RfYml0KFRRRl9TVVNQRU5ERUQsICZ0cS0+ZmxhZ3MpICYmCisJICAgIChzcC0+ZmxhZ3MgJiBTUkJfVEFQRSkgPT0gMCkgeworCQkvKiBJZiB0YXJnZXQgc3VzcGVuZGVkIHB1dCBpbmNvbWluZyBJL08gaW4gcmV0cnlfcS4gKi8KKwkJcWxhMngwMF9leHRlbmRfdGltZW91dChzcC0+Y21kLCAxMCk7CisJCWFkZF90b19zY3NpX3JldHJ5X3F1ZXVlKGhhLCBzcCk7CisJfSBlbHNlCisJCXdhc19lbXB0eSA9IGFkZF90b19wZW5kaW5nX3F1ZXVlKGhhLCBzcCk7CisKKwlpZiAoKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSAmJiBoYS0+ZmxhZ3Mub25saW5lKSB7CisJCWlmIChoYS0+cmVzcG9uc2VfcmluZ19wdHItPnNpZ25hdHVyZSAhPSBSRVNQT05TRV9QUk9DRVNTRUQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwkKKwkJCXFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJLyogV2Ugc3VibWl0IHRvIHRoZSBoYXJkd2FyZSBpZjoKKwkgKgorCSAqCTEpIHdlJ3JlIG9uIHRoZSBjcHUgdGhlIGlycSdzIGFycml2ZSBvbiBvcgorCSAqCTIpIHRoZXJlIGFyZSB2ZXJ5IGZldyBpbydzIG91dHN0YW5kaW5nLgorCSAqCisJICogSW4gYWxsIG90aGVyIGNhc2VzIHdlJ2xsIGxldCBhbiBpcnEgcGljayB1cCBvdXIgSU8gYW5kIHN1Ym1pdCBpdAorCSAqIHRvIHRoZSBjb250cm9sbGVyIHRvIGltcHJvdmUgYWZmaW5pdHkuCisJICovCisJaWYgKF9zbXBfcHJvY2Vzc29yX2lkKCkgPT0gaGEtPmxhc3RfaXJxX2NwdSB8fCB3YXNfZW1wdHkpCisJCXFsYTJ4MDBfbmV4dChoYSk7CisKKwlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kCisgKiAgICBXYWl0cyBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIEZpcm13YXJlIGZvciBzb21lCisgKiAgICBtYXggdGltZS4KKyAqCisgKiBJbnB1dDoKKyAqICAgIGhhID0gYWN0dWFsIGhhIHdob3NlIGRvbmUgcXVldWUgd2lsbCBjb250YWluIHRoZSBjb21tYW5kCisgKgkgICAgICByZXR1cm5lZCBieSBmaXJtd2FyZS4KKyAqICAgIGNtZCA9IFNjc2kgQ29tbWFuZCB0byB3YWl0IG9uLgorICogICAgZmxhZyA9IEFib3J0L1Jlc2V0KEJ1cyBvciBEZXZpY2UgUmVzZXQpCisgKgorICogUmV0dXJuOgorICogICAgTm90IEZvdW5kIDogMAorICogICAgRm91bmQgOiAxCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKyNkZWZpbmUgQUJPUlRfUE9MTElOR19QRVJJT0QJSFoKKyNkZWZpbmUgQUJPUlRfV0FJVF9USU1FCQkoKDEwICogSFopIC8gKEFCT1JUX1BPTExJTkdfUEVSSU9EKSkKKworCWludAkJZm91bmQgPSAwOworCWludAkJZG9uZSA9IDA7CisJc3JiX3QJCSpycCA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRlbXA7CisJdV9sb25nCQltYXhfd2FpdF90aW1lID0gQUJPUlRfV0FJVF9USU1FOworCisJZG8geworCQkvKiBDaGVjayBvbiBkb25lIHF1ZXVlICovCisJCXNwaW5fbG9jaygmaGEtPmxpc3RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmaGEtPmRvbmVfcXVldWUpIHsKKwkJCXJwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisKKwkJCS8qCisJCQkgKiBGb3VuZCBjb21tYW5kLiBKdXN0IGV4aXQgYW5kIHdhaXQgZm9yIHRoZSBjbWQgc2VudAorCQkJICogdG8gT1MuCisJCQkqLworCQkJaWYgKGNtZCA9PSBycC0+Y21kKSB7CisJCQkJZm91bmQrKzsKKwkJCQlERUJVRzMocHJpbnRrKCIlczogZm91bmQgaW4gZG9uZSBxdWV1ZS5cbiIsCisJCQkJICAgIF9fZnVuY19fKTspCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJmhhLT5saXN0X2xvY2spOworCisJCS8qIENvbXBsZXRlIHRoZSBjbWQgcmlnaHQgYXdheS4gKi8KKwkJaWYgKGZvdW5kKSB7IAorCQkJcWxhMngwMF9kZWxldGVfZnJvbV9kb25lX3F1ZXVlKGhhLCBycCk7CisJCQlzcF9wdXQoaGEsIHJwKTsKKwkJCWRvbmUrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChBQk9SVF9QT0xMSU5HX1BFUklPRCk7CisKKwkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCX0gd2hpbGUgKChtYXhfd2FpdF90aW1lLS0pKTsKKworCWlmIChkb25lKQorCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZvdW5kIGNtZD0lcC5cbiIsIF9fZnVuY19fLCBjbWQpKTsKKworCXJldHVybiAoZG9uZSk7Cit9CisKKy8qCisgKiBxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUKKyAqICAgIFdhaXQgdGlsbCB0aGUgSEJBIGlzIG9ubGluZSBhZnRlciBnb2luZyB0aHJvdWdoIAorICogICAgPD0gTUFYX1JFVFJJRVNfT0ZfSVNQX0FCT1JUICBvcgorICogICAgZmluYWxseSBIQkEgaXMgZGlzYWJsZWQgaWUgbWFya2VkIG9mZmxpbmUKKyAqCisgKiBJbnB1dDoKKyAqICAgICBoYSAtIHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZQorICogCisgKiBOb3RlOiAgICAKKyAqICAgIERvZXMgY29udGV4dCBzd2l0Y2hpbmctUmVsZWFzZSBTUElOX0xPQ0sKKyAqICAgIChpZiBhbnkpIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqCisgKiBSZXR1cm46CisgKiAgICBTdWNjZXNzIChBZGFwdGVyIGlzIG9ubGluZSkgOiAwCisgKiAgICBGYWlsZWQgIChBZGFwdGVyIGlzIG9mZmxpbmUvZGlzYWJsZWQpIDogMQorICovCitzdGF0aWMgaW50IAorcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IAkgcmV0dXJuX3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIHdhaXRfb25saW5lOworCisJd2FpdF9vbmxpbmUgPSBqaWZmaWVzICsgKE1BWF9MT09QX1RJTUVPVVQgKiBIWik7IAorCXdoaWxlICgoKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgfHwKKwkgICAgdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgIGhhLT5kcGNfYWN0aXZlKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB3YWl0X29ubGluZSkpIHsKKworCQltc2xlZXAoMTAwMCk7CisJfQorCWlmIChoYS0+ZmxhZ3Mub25saW5lKSAKKwkJcmV0dXJuX3N0YXR1cyA9IFFMQV9TVUNDRVNTOyAKKwllbHNlCisJCXJldHVybl9zdGF0dXMgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJREVCVUcyKHByaW50aygiJXMgcmV0dXJuX3N0YXR1cz0lZFxuIixfX2Z1bmNfXyxyZXR1cm5fc3RhdHVzKSk7CisKKwlyZXR1cm4gKHJldHVybl9zdGF0dXMpOworfQorCisvKgorICogcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5CisgKiAgICBXYWl0IGZvciBNQVhfTE9PUF9USU1FT1VUKDUgbWluKSB2YWx1ZSBmb3IgbG9vcAorICogICAgdG8gYmUgaW4gTE9PUF9SRUFEWSBzdGF0ZS4JIAorICogSW5wdXQ6CisgKiAgICAgaGEgLSBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIAorICogTm90ZTogICAgCisgKiAgICBEb2VzIGNvbnRleHQgc3dpdGNoaW5nLVJlbGVhc2UgU1BJTl9MT0NLCisgKiAgICAoaWYgYW55KSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKiAgICAKKyAqCisgKiBSZXR1cm46CisgKiAgICBTdWNjZXNzIChMT09QX1JFQURZKSA6IDAKKyAqICAgIEZhaWxlZCAgKExPT1BfTk9UX1JFQURZKSA6IDEKKyAqLworc3RhdGljIGlubGluZSBpbnQgCitxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgCSByZXR1cm5fc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBsb29wX3RpbWVvdXQgOworCisJLyogd2FpdCBmb3IgNSBtaW4gYXQgdGhlIG1heCBmb3IgbG9vcCB0byBiZSByZWFkeSAqLworCWxvb3BfdGltZW91dCA9IGppZmZpZXMgKyAoTUFYX0xPT1BfVElNRU9VVCAqIEhaKTsgCisKKwl3aGlsZSAoKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pIHx8CisJICAgIHRlc3RfYml0KENGR19BQ1RJVkUsICZoYS0+Y2ZnX2ZsYWdzKSB8fAorCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfUkVBRFkpIHsKKwkJbXNsZWVwKDEwMDApOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBsb29wX3RpbWVvdXQpKSB7CisJCQlyZXR1cm5fc3RhdHVzID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAocmV0dXJuX3N0YXR1cyk7CQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMnh4eF9laF9hYm9ydAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgVGhlIGFib3J0IGZ1bmN0aW9uIHdpbGwgYWJvcnQgdGhlIHNwZWNpZmllZCBjb21tYW5kLgorKgorKiBJbnB1dDoKKyogICAgY21kID0gTGludXggU0NTSSBjb21tYW5kIHBhY2tldCB0byBiZSBhYm9ydGVkLgorKgorKiBSZXR1cm5zOgorKiAgICBFaXRoZXIgU1VDQ0VTUyBvciBGQUlMRUQuCisqCisqIE5vdGU6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorcWxhMnh4eF9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50CQlpOworCWludAkJcmV0dXJuX3N0YXR1cyA9IEZBSUxFRDsKKwlvc19sdW5fdAkqcTsKKwlzY3NpX3FsYV9ob3N0X3QgKmhhOworCXNjc2lfcWxhX2hvc3RfdCAqdmlzX2hhOworCXNyYl90CQkqc3A7CisJc3JiX3QJCSpycDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdGVtcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXVpbnQ4X3QJCWZvdW5kID0gMDsKKwl1bnNpZ25lZCBpbnQJYiwgdCwgbDsKKworCS8qIEdldCB0aGUgU0NTSSByZXF1ZXN0IHB0ciAqLworCXNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOworCisJLyoKKwkgKiBJZiBzcCBpcyBOVUxMLCBjb21tYW5kIGlzIGFscmVhZHkgcmV0dXJuZWQuCisJICogc3AgaXMgTlVMTEVEIGp1c3QgYmVmb3JlIHdlIGNhbGwgYmFjayBzY3NpX2RvbmUKKwkgKgorCSAqLworCWlmICgoc3AgPT0gTlVMTCkpIHsKKwkJLyogbm8gYWN0aW9uIC0gd2UgZG9uJ3QgaGF2ZSBjb21tYW5kICovCisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCB0b19xbGFfaG9zdChjbWQtPmRldmljZS0+aG9zdCksCisJCSAgICAicWxhMnh4eF9laF9hYm9ydDogY21kIGFscmVhZHkgZG9uZSBzcD0lcFxuIiwgc3ApOworCQlERUJVRyhwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IGNtZCBhbHJlYWR5IGRvbmUgc3A9JXBcbiIsIHNwKTspCisJCXJldHVybiBTVUNDRVNTOworCX0KKwlpZiAoc3ApIHsKKwkJREVCVUcocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiByZWZjb3VudCAlaSBcbiIsCisJCSAgICBhdG9taWNfcmVhZCgmc3AtPnJlZl9jb3VudCkpOykKKwl9CisKKwl2aXNfaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlob3N0ID0gaGEtPmhvc3Q7CisKKwkvKiBHZW5lcmF0ZSBMVSBxdWV1ZSBvbiBidXMsIHRhcmdldCwgTFVOICovCisJYiA9IGNtZC0+ZGV2aWNlLT5jaGFubmVsOworCXQgPSBjbWQtPmRldmljZS0+aWQ7CisJbCA9IGNtZC0+ZGV2aWNlLT5sdW47CisJcSA9IEdFVF9MVV9RKHZpc19oYSwgdCwgbCk7CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsIAorCSAgICAiJXMgc2NzaSglbGQ6JWQ6JWQ6JWQpOiBjbWRfdGltZW91dF9pbl9zZWM9MHgleC5cbiIsIF9fZnVuY19fLAorCSAgICBoYS0+aG9zdF9ubywgKGludCliLCAoaW50KXQsIChpbnQpbCwKKwkgICAgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFopOworCisJLyoKKwkgKiBpZiBubyBMVU4gcXVldWUgdGhlbiBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyEhIQorCSAqLworCWlmIChxID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJInFsYTJ4MDA6ICgleDoleDoleCkgTm8gTFVOIHF1ZXVlLlxuIiwgYiwgdCwgbCk7CisKKwkJLyogbm8gYWN0aW9uIC0gd2UgZG9uJ3QgaGF2ZSBjb21tYW5kICovCisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBQk9SVGluZyBjbWQ9JXAgc3A9JXAgamlmZmllcyA9IDB4JWx4LCAiCisJICAgICJ0aW1lb3V0PSV4LCBkcGNfZmxhZ3M9JWx4LCB2aXNfaGEtPmRwY19mbGFncz0lbHggcS0+ZmxhZz0lbHhcbiIsCisJICAgIGhhLT5ob3N0X25vLCBjbWQsIHNwLCBqaWZmaWVzLCBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLyBIWiwKKwkgICAgaGEtPmRwY19mbGFncywgdmlzX2hhLT5kcGNfZmxhZ3MsIHEtPnFfZmxhZykpOworCURFQlVHMihxbGEyeDAwX3ByaW50X3Njc2lfY21kKGNtZCkpOworCisJc3Bpbl91bmxvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoIiVzIGZhaWxlZDpib2FyZCBkaXNhYmxlZFxuIiwgX19mdW5jX18pOykKKwkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCS8qIFNlYXJjaCBkb25lIHF1ZXVlICovCisJc3Bpbl9sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmhhLT5kb25lX3F1ZXVlKSB7CisJCXJwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisKKwkJaWYgKGNtZCAhPSBycC0+Y21kKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogRm91bmQgY29tbWFuZC5SZW1vdmUgaXQgZnJvbSBkb25lIGxpc3QuCisJCSAqIEFuZCBwcm9jZWVkIHRvIHBvc3QgY29tcGxldGlvbiB0byBzY3NpIG1pZCBsYXllci4KKwkJICovCisJCXJldHVybl9zdGF0dXMgPSBTVUNDRVNTOworCQlmb3VuZCsrOworCQlxbGEyeDAwX2RlbGV0ZV9mcm9tX2RvbmVfcXVldWUoaGEsIHNwKTsKKworCQlicmVhazsKKwl9IC8qIGxpc3RfZm9yX2VhY2hfc2FmZSgpICovCisJc3Bpbl91bmxvY2soJmhhLT5saXN0X2xvY2spOworCisJLyoKKwkgKiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIGFib3J0ZWQgY29tbWFuZCB3YXMgYWxyZWFkeSBpbiB0aGUgZG9uZQorCSAqIHF1ZXVlCisJICovCisJaWYgKGZvdW5kKSB7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJxbGEyeHh4X2VoX2Fib3J0OiBSZXR1cm5pbmcgY29tcGxldGVkIGNvbW1hbmQ9JXAgc3A9JXBcbiIsCisJCSAgICBjbWQsIHNwKTsKKwkJc3BfcHV0KGhhLCBzcCk7CisJCXJldHVybiAocmV0dXJuX3N0YXR1cyk7CisJfQorCQorCisJLyoKKwkgKiBTZWUgaWYgdGhpcyBjb21tYW5kIGlzIGluIHRoZSByZXRyeSBxdWV1ZQorCSAqLworCURFQlVHMyhwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IHNlYXJjaGluZyBzcCAlcCBpbiByZXRyeSAiCisJCSAgICAicXVldWUuXG4iLCBzcCk7KQorCisJc3Bpbl9sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmhhLT5yZXRyeV9xdWV1ZSkgeworCQlycCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCisJCWlmIChjbWQgIT0gcnAtPmNtZCkKKwkJCWNvbnRpbnVlOworCisKKwkJREVCVUcyKHByaW50aygicWxhMnh4eF9laF9hYm9ydDogZm91bmQgIgorCQkgICAgImluIHJldHJ5IHF1ZXVlLiBTUD0lcFxuIiwgc3ApOykKKworCQlfX2RlbF9mcm9tX3JldHJ5X3F1ZXVlKGhhLCBycCk7CisJCWNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQlfX2FkZF90b19kb25lX3F1ZXVlKGhhLCBycCk7CisKKwkJcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisJCWZvdW5kKys7CisKKwkJYnJlYWs7CisKKwl9IAorCXNwaW5fdW5sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKworCisJLyoKKwkgKiBPdXIgU1AgcG9pbnRlciBwb2ludHMgYXQgdGhlIGNvbW1hbmQgd2Ugd2FudCB0byByZW1vdmUgZnJvbSB0aGUKKwkgKiBwZW5kaW5nIHF1ZXVlIHByb3ZpZGluZyB3ZSBoYXZlbid0IGFscmVhZHkgc2VudCBpdCB0byB0aGUgYWRhcHRlci4KKwkgKi8KKwlpZiAoIWZvdW5kKSB7CisJCURFQlVHMyhwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IHNlYXJjaGluZyBzcCAlcCAiCisJCSAgICAiaW4gcGVuZGluZyBxdWV1ZS5cbiIsIHNwKTspCisKKwkJc3Bpbl9sb2NrKCZ2aXNfaGEtPmxpc3RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmdmlzX2hhLT5wZW5kaW5nX3F1ZXVlKSB7CisJCQlycCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCisJCQlpZiAocnAtPmNtZCAhPSBjbWQpCisJCQkJY29udGludWU7CisKKwkJCS8qIFJlbW92ZSBzcmIgZnJvbSBMVU4gcXVldWUuICovCisJCQlycC0+ZmxhZ3MgfD0gIFNSQl9BQk9SVEVEOworCisJCQlERUJVRzIocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBDbWQgaW4gcGVuZGluZyBxdWV1ZS4iCisJCQkgICAgIiBzZXJpYWxfbnVtYmVyICVsZC5cbiIsCisJCQkgICAgc3AtPmNtZC0+c2VyaWFsX251bWJlcik7KQorCisJCQlfX2RlbF9mcm9tX3BlbmRpbmdfcXVldWUodmlzX2hhLCBycCk7CisJCQljbWQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKworCQkJX19hZGRfdG9fZG9uZV9xdWV1ZSh2aXNfaGEsIHJwKTsKKworCQkJcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisKKwkJCWZvdW5kKys7CisJCQlicmVhazsKKwkJfSAvKiBsaXN0X2Zvcl9lYWNoX3NhZmUoKSAqLworCQlzcGluX3VubG9jaygmdmlzX2hhLT5saXN0X2xvY2spOworCX0gLypFbmQgb2YgaWYgIWZvdW5kICovCisKKwlpZiAoIWZvdW5kKSB7ICAvKiBmaW5kIHRoZSBjb21tYW5kIGluIG91ciBhY3RpdmUgbGlzdCAqLworCQlERUJVRzMocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBzZWFyY2hpbmcgc3AgJXAgIgorCQkgICAgImluIG91dHN0YW5kaW5nIHF1ZXVlLlxuIiwgc3ApOykKKworCQlzcGluX2xvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJZm9yIChpID0gMTsgaSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaSsrKSB7CisJCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2ldOworCisJCQlpZiAoc3AgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNwLT5jbWQgIT0gY21kKQorCQkJCWNvbnRpbnVlOworCisJCQlERUJVRzIocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0KCVsZCk6IGFib3J0aW5nIHNwICVwICIKKwkJCSAgICAiZnJvbSBSSVNDLiBwaWQ9JWxkIHNwLT5zdGF0ZT0leCBxLT5xX2ZsYWc9JWx4XG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBzcCwgc3AtPmNtZC0+c2VyaWFsX251bWJlciwKKwkJCSAgICBzcC0+c3RhdGUsIHEtPnFfZmxhZyk7KQorCQkJREVCVUcocWxhMngwMF9wcmludF9zY3NpX2NtZChjbWQpOykKKworCQkJLyogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBzcCBhbmQgZHJvcCB0aGUgbG9jay4qLworCQkJc3BfZ2V0KGhhLCBzcCk7CisKKwkJCXNwaW5fdW5sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwkJCWlmIChxbGEyeDAwX2Fib3J0X2NvbW1hbmQoaGEsIHNwKSkgeworCQkJCURFQlVHMihwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IGFib3J0X2NvbW1hbmQgIgorCQkJCSAgICAibWJ4IGZhaWxlZC5cbiIpOykKKwkJCQlyZXR1cm5fc3RhdHVzID0gRkFJTEVEOworCQkJfSBlbHNlIHsKKwkJCQlERUJVRzMocHJpbnRrKCJxbGEyeHh4X2VoX2Fib3J0OiBhYm9ydF9jb21tYW5kICIKKwkJCQkgICAgIiBtYnggc3VjY2Vzcy5cbiIpOykKKwkJCQlyZXR1cm5fc3RhdHVzID0gU1VDQ0VTUzsKKwkJCX0KKworCQkJc3BfcHV0KGhhLHNwKTsKKworCQkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJCXNwaW5fbG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCisJCQkvKgorCQkJICogUmVnYXJkbGVzcyBvZiBtYWlsYm94IGNvbW1hbmQgc3RhdHVzLCBnbyBjaGVjayBvbgorCQkJICogZG9uZSBxdWV1ZSBqdXN0IGluIGNhc2UgdGhlIHNwIGlzIGFscmVhZHkgZG9uZS4KKwkJCSAqLworCQkJYnJlYWs7CisKKwkJfS8qRW5kIG9mIGZvciBsb29wICovCisJCXNwaW5fdW5sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisKKwl9IC8qRW5kIG9mIGlmICFmb3VuZCAqLworCisJLyogV2FpdGluZyBmb3Igb3VyIGNvbW1hbmQgaW4gZG9uZV9xdWV1ZSB0byBiZSByZXR1cm5lZCB0byBPUy4qLworCWlmIChxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChoYSwgY21kKSAhPSAwKSB7CisJCURFQlVHMihwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IGNtZCByZXR1cm5lZCBiYWNrIHRvIE9TLlxuIik7KQorCQlyZXR1cm5fc3RhdHVzID0gU1VDQ0VTUzsKKwl9CisKKwlpZiAocmV0dXJuX3N0YXR1cyA9PSBGQUlMRUQpIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAKKwkJCSJxbGEyeHh4X2VoX2Fib3J0IEV4aXRpbmc6IHN0YXR1cz1GYWlsZWRcbiIpOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCURFQlVHMihwcmludGsoInFsYTJ4eHhfZWhfYWJvcnQ6IEV4aXRpbmcuIHJldHVybl9zdGF0dXM9MHgleC5cbiIsCisJICAgIHJldHVybl9zdGF0dXMpKTsKKworCXJldHVybiByZXR1cm5fc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX3RhcmdldF9jb21tYW5kcworKgorKiBEZXNjcmlwdGlvbjoKKyogICAgV2FpdHMgZm9yIGFsbCB0aGUgY29tbWFuZHMgdG8gY29tZSBiYWNrIGZyb20gdGhlIHNwZWNpZmllZCB0YXJnZXQuCisqCisqIElucHV0OgorKiAgICBoYSAtIHBvaW50ZXIgdG8gc2NzaV9xbGFfaG9zdCBzdHJ1Y3R1cmUuCisqICAgIHQgIC0gdGFyZ2V0IAkKKyogUmV0dXJuczoKKyogICAgRWl0aGVyIFNVQ0NFU1Mgb3IgRkFJTEVELgorKgorKiBOb3RlOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfdGFyZ2V0X2NvbW1hbmRzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVuc2lnbmVkIGludCB0KQoreworCWludAljbnQ7CisJaW50CXN0YXR1czsKKwlzcmJfdAkJKnNwOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCXN0YXR1cyA9IDA7CisKKwkvKgorCSAqIFdhaXRpbmcgZm9yIGFsbCBjb21tYW5kcyBmb3IgdGhlIGRlc2lnbmF0ZWQgdGFyZ2V0IGluIHRoZSBhY3RpdmUKKwkgKiBhcnJheQorCSAqLworCWZvciAoY250ID0gMTsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykgeworCQlzcGluX2xvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdOworCQlpZiAoc3ApIHsKKwkJCWNtZCA9IHNwLT5jbWQ7CisJCQlzcGluX3VubG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCQkJaWYgKGNtZC0+ZGV2aWNlLT5pZCA9PSB0KSB7CisJCQkJaWYgKCFxbGEyeDAwX2VoX3dhaXRfb25fY29tbWFuZChoYSwgY21kKSkgeworCQkJCQlzdGF0dXMgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlzcGluX3VubG9jaygmaGEtPmhhcmR3YXJlX2xvY2spOworCQl9CisJfQorCXJldHVybiAoc3RhdHVzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMnh4eF9laF9kZXZpY2VfcmVzZXQKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFRoZSBkZXZpY2UgcmVzZXQgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgdGFyZ2V0IGFuZCBhYm9ydCBhbnkKKyogICAgZXhlY3V0aW5nIGNvbW1hbmRzLgorKgorKiAgICBOT1RFOiBUaGUgdXNlIG9mIFNQIGlzIHVuZGVmaW5lZCB3aXRoaW4gdGhpcyBjb250ZXh0LiAgRG8gKk5PVCoKKyogICAgICAgICAgYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgZXZlbiBpZiB5b3UgZGV0ZXJtaW5lIGl0IGlzIAorKiAgICAgICAgICBub24tbnVsbC4KKyoKKyogSW5wdXQ6CisqICAgIGNtZCA9IExpbnV4IFNDU0kgY29tbWFuZCBwYWNrZXQgb2YgdGhlIGNvbW1hbmQgdGhhdCBjYXVzZSB0aGUKKyogICAgICAgICAgYnVzIGRldmljZSByZXNldC4KKyoKKyogUmV0dXJuczoKKyogICAgU1VDQ0VTUy9GQUlMVVJFIChkZWZpbmVkIGFzIG1hY3JvIGluIHNjc2kuaCkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorcWxhMnh4eF9laF9kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludAkJcmV0dXJuX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQJYiwgdCwgbDsKKwlzY3NpX3FsYV9ob3N0X3QJKmhhOworCW9zX3RndF90CSp0cTsKKwlvc19sdW5fdAkqbHE7CisJZmNfcG9ydF90CSpmY3BvcnRfdG9fcmVzZXQ7CisJc3JiX3QJCSpycDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdGVtcDsKKworCXJldHVybl9zdGF0dXMgPSBGQUlMRUQ7CisJaWYgKGNtZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICIlcygpOiAqKioqIFNDU0kgbWlkLWxheWVyIHBhc3NpbmcgaW4gTlVMTCBjbWRcbiIsCisJCSAgICBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIChyZXR1cm5fc3RhdHVzKTsKKwl9CisKKwliID0gY21kLT5kZXZpY2UtPmNoYW5uZWw7CisJdCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwlsID0gY21kLT5kZXZpY2UtPmx1bjsKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwl0cSA9IFRHVF9RKGhhLCB0KTsKKwlpZiAodHEgPT0gTlVMTCkgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiJXMoKTogKioqKiBDTUQgZGVyaXZlcyBhIE5VTEwgVEdUX1FcbiIsIF9fZnVuY19fKTsKKworCQlyZXR1cm4gKHJldHVybl9zdGF0dXMpOworCX0KKwlscSA9IChvc19sdW5fdCAqKUxVTl9RKGhhLCB0LCBsKTsKKwlpZiAobHEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMoKTogKioqKiBDTUQgZGVyaXZlcyBhIE5VTEwgTFVOX1FcbiIsIF9fZnVuY19fKTsKKworCQlyZXR1cm4gKHJldHVybl9zdGF0dXMpOworCX0KKwlmY3BvcnRfdG9fcmVzZXQgPSBscS0+ZmNsdW4tPmZjcG9ydDsKKworCS8qIElmIHdlIGFyZSBjb21pbmcgaW4gZnJvbSB0aGUgYmFjay1kb29yLCBzdGFsbCBJL08gdW50aWwgY29tcGxldGUuICovCisJaWYgKCFjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aXZlKQorCQlzZXRfYml0KFRRRl9TVVNQRU5ERUQsICZ0cS0+ZmxhZ3MpOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBERVZJQ0UgUkVTRVQgSVNTVUVELlxuIiwgaGEtPmhvc3Rfbm8sIGIsIHQsIGwpOworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkgICAgInNjc2koJWxkKTogREVWSUNFX1JFU0VUIGNtZD0lcCBqaWZmaWVzID0gMHglbHgsIHRpbWVvdXQ9JXgsICIKKwkgICAgImRwY19mbGFncz0lbHgsIHN0YXR1cz0leCBhbGxvd2VkPSVkIGNtZC5zdGF0ZT0leFxuIiwKKwkgICAgaGEtPmhvc3Rfbm8sIGNtZCwgamlmZmllcywgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFosCisJICAgIGhhLT5kcGNfZmxhZ3MsIGNtZC0+cmVzdWx0LCBjbWQtPmFsbG93ZWQsIGNtZC0+c3RhdGUpKTsKKworIAkvKiBDbGVhciBjb21tYW5kcyBmcm9tIHRoZSByZXRyeSBxdWV1ZS4gKi8KKyAJc3Bpbl9sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKyAJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZoYS0+cmV0cnlfcXVldWUpIHsKKyAJCXJwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisgCisgCQlpZiAodCAhPSBycC0+Y21kLT5kZXZpY2UtPmlkKSAKKyAJCQljb250aW51ZTsKKyAKKyAJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAicWxhMnh4eF9laF9yZXNldDogZm91bmQgaW4gcmV0cnkgcXVldWUuIFNQPSVwXG4iLCBycCkpOworIAorIAkJX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShoYSwgcnApOworIAkJcnAtPmNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworIAkJX19hZGRfdG9fZG9uZV9xdWV1ZShoYSwgcnApOworIAl9CisgCXNwaW5fdW5sb2NrKCZoYS0+bGlzdF9sb2NrKTsKKworCXNwaW5fdW5sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXMgZmFpbGVkOmJvYXJkIGRpc2FibGVkXG4iLF9fZnVuY19fKSk7CisKKwkJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKwkJZ290byBlaF9kZXZfcmVzZXRfZG9uZTsKKwl9CisKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KGhhKSA9PSBRTEFfU1VDQ0VTUykgeworCQlpZiAocWxhMngwMF9kZXZpY2VfcmVzZXQoaGEsIGZjcG9ydF90b19yZXNldCkgPT0gMCkgeworCQkJcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisJCX0KKworI2lmIGRlZmluZWQoTE9HT1VUX0FGVEVSX0RFVklDRV9SRVNFVCkKKwkJaWYgKHJldHVybl9zdGF0dXMgPT0gU1VDQ0VTUykgeworCQkJaWYgKGZjcG9ydF90b19yZXNldC0+ZmxhZ3MgJiBGQ19GQUJSSUNfREVWSUNFKSB7CisJCQkJcWxhMngwMF9mYWJyaWNfbG9nb3V0KGhhLAorCQkJCSAgICBmY3BvcnRfdG9fcmVzZXQtPmxvb3BfaWQpOworCQkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChoYSwgZmNwb3J0X3RvX3Jlc2V0KTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJICAgICIlcyBmYWlsZWQ6IGxvb3Agbm90IHJlYWR5XG4iLF9fZnVuY19fKTspCisJfQorCisJc3Bpbl9sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCWlmIChyZXR1cm5fc3RhdHVzID09IEZBSUxFRCkgeworCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBkZXZpY2UgcmVzZXQgZmFpbGVkXG4iLAorCQkgICAgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBkZXZpY2UgcmVzZXQgZmFpbGVkXG4iLAorCQkgICAgX19mdW5jX18pOworCisJCWdvdG8gZWhfZGV2X3Jlc2V0X2RvbmU7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgY29taW5nIGRvd24gdGhlIEVIIHBhdGgsIHdhaXQgZm9yIGFsbCBjb21tYW5kcyB0bworCSAqIGNvbXBsZXRlIGZvciB0aGUgZGV2aWNlLgorCSAqLworCWlmIChjbWQtPmRldmljZS0+aG9zdC0+ZWhfYWN0aXZlKSB7CisJCWlmIChxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfdGFyZ2V0X2NvbW1hbmRzKGhhLCB0KSkKKwkJCXJldHVybl9zdGF0dXMgPSBGQUlMRUQ7CisKKwkJaWYgKHJldHVybl9zdGF0dXMgPT0gRkFJTEVEKSB7CisJCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgIgorCQkJICAgICJjb21tYW5kc1xuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAgIiVzOiBmYWlsZWQgd2hpbGUgd2FpdGluZyBmb3IgY29tbWFuZHNcbiIsCisJCQkgICAgX19mdW5jX18pOyAKKworCQkJZ290byBlaF9kZXZfcmVzZXRfZG9uZTsKKwkJfQorCX0KKworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogREVWSUNFIFJFU0VUIFNVQ0NFRURFRC5cbiIsCisJICAgIGhhLT5ob3N0X25vLCBiLCB0LCBsKTsKKworZWhfZGV2X3Jlc2V0X2RvbmU6CisKKwlpZiAoIWNtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3RpdmUpCisJCWNsZWFyX2JpdChUUUZfU1VTUEVOREVELCAmdHEtPmZsYWdzKTsKKworCXJldHVybiAocmV0dXJuX3N0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMKKyoKKyogRGVzY3JpcHRpb246CisqICAgIFdhaXRzIGZvciBhbGwgdGhlIGNvbW1hbmRzIHRvIGNvbWUgYmFjayBmcm9tIHRoZSBzcGVjaWZpZWQgaG9zdC4KKyoKKyogSW5wdXQ6CisqICAgIGhhIC0gcG9pbnRlciB0byBzY3NpX3FsYV9ob3N0IHN0cnVjdHVyZS4KKyoKKyogUmV0dXJuczoKKyogICAgMSA6IFNVQ0NFU1MKKyogICAgMCA6IEZBSUxFRAorKgorKiBOb3RlOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQJY250OworCWludAlzdGF0dXM7CisJc3JiX3QJCSpzcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisKKwlzdGF0dXMgPSAxOworCisJLyoKKwkgKiBXYWl0aW5nIGZvciBhbGwgY29tbWFuZHMgZm9yIHRoZSBkZXNpZ25hdGVkIHRhcmdldCBpbiB0aGUgYWN0aXZlCisJICogYXJyYXkKKwkgKi8KKwlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKKwkJc3Bpbl9sb2NrKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XTsKKwkJaWYgKHNwKSB7CisJCQljbWQgPSBzcC0+Y21kOworCQkJc3Bpbl91bmxvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJCXN0YXR1cyA9IHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKGhhLCBjbWQpOworCQkJaWYgKHN0YXR1cyA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWVsc2UgeworCQkJc3Bpbl91bmxvY2soJmhhLT5oYXJkd2FyZV9sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4eHhfZWhfYnVzX3Jlc2V0CisqCisqIERlc2NyaXB0aW9uOgorKiAgICBUaGUgYnVzIHJlc2V0IGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIGJ1cyBhbmQgYWJvcnQgYW55IGV4ZWN1dGluZworKiAgICBjb21tYW5kcy4KKyoKKyogSW5wdXQ6CisqICAgIGNtZCA9IExpbnV4IFNDU0kgY29tbWFuZCBwYWNrZXQgb2YgdGhlIGNvbW1hbmQgdGhhdCBjYXVzZSB0aGUKKyogICAgICAgICAgYnVzIHJlc2V0LgorKgorKiBSZXR1cm5zOgorKiAgICBTVUNDRVNTL0ZBSUxVUkUgKGRlZmluZWQgYXMgbWFjcm8gaW4gc2NzaS5oKS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitxbGEyeHh4X2VoX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYTsKKwlzcmJfdCAqc3A7CisJaW50IHJ2YWwgPSBGQUlMRUQ7CisKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCXNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBMT09QIFJFU0VUIElTU1VFRC5cbiIsIGhhLT5ob3N0X25vLAorCSAgICBjbWQtPmRldmljZS0+Y2hhbm5lbCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKworCXNwaW5fdW5sb2NrX2lycShoYS0+aG9zdC0+aG9zdF9sb2NrKTsKKworCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihwcmludGsoIiVzIGZhaWxlZDpib2FyZCBkaXNhYmxlZFxuIixfX2Z1bmNfXykpOworCQlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCWlmIChxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkoaGEpID09IFFMQV9TVUNDRVNTKSB7CisJCWlmIChxbGEyeDAwX2xvb3BfcmVzZXQoaGEpID09IFFMQV9TVUNDRVNTKSAKKwkJCXJ2YWwgPSBTVUNDRVNTOworCX0KKworCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJaWYgKHJ2YWwgPT0gRkFJTEVEKQorCQlnb3RvIG91dDsKKworCS8qIFdhaXRpbmcgZm9yIG91ciBjb21tYW5kIGluIGRvbmVfcXVldWUgdG8gYmUgcmV0dXJuZWQgdG8gT1MuKi8KKwlpZiAoY21kLT5kZXZpY2UtPmhvc3QtPmVoX2FjdGl2ZSkKKwkJaWYgKCFxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHMoaGEpKQorCQkJcnZhbCA9IEZBSUxFRDsKKworIG91dDoKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogcmVzZXQgJXNcbiIsIF9fZnVuY19fLAorCQkJKHJ2YWwgPT0gRkFJTEVEKSA/ICJmYWlsZWQiIDogInN1Y2NlZGVkIik7CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHFsYTJ4eHhfZWhfaG9zdF9yZXNldAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgVGhlIHJlc2V0IGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIEFkYXB0ZXIuCisqCisqIElucHV0OgorKiAgICAgIGNtZCA9IExpbnV4IFNDU0kgY29tbWFuZCBwYWNrZXQgb2YgdGhlIGNvbW1hbmQgdGhhdCBjYXVzZSB0aGUKKyogICAgICAgICAgICBhZGFwdGVyIHJlc2V0LgorKgorKiBSZXR1cm5zOgorKiAgICAgIEVpdGhlciBTVUNDRVNTIG9yIEZBSUxFRC4KKyoKKyogTm90ZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitxbGEyeHh4X2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludAkJcnZhbCA9IFNVQ0NFU1M7CisKKwkvKiBEaXNwbGF5IHdoaWNoIG9uZSB3ZSdyZSBhY3R1YWxseSByZXNldHRpbmcgZm9yIGRlYnVnLiAqLworCURFQlVHKHByaW50aygicWxhMnh4eF9laF9ob3N0X3Jlc2V0OlJlc2V0dGluZyBzY3NpKCVsZCkuXG4iLAorCSAgICBoYS0+aG9zdF9ubykpOworCisJLyoKKwkgKiAgTm93IGlzc3VlIHJlc2V0LgorCSAqLworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgInNjc2koJWxkOiVkOiVkOiVkKTogQURBUFRFUiBSRVNFVCBpc3N1ZWQuXG4iLCBoYS0+aG9zdF9ubywKKwkgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisKKwlzcGluX3VubG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGhhKSAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBib2FyZF9kaXNhYmxlZDsKKworCS8qCisJICogRml4bWUtbWF5IGJlIGRwYyB0aHJlYWQgaXMgYWN0aXZlIGFuZCBwcm9jZXNzaW5nCisJICogbG9vcF9yZXN5bmMsc28gd2FpdCBhIHdoaWxlIGZvciBpdCB0byAKKwkgKiBiZSBjb21wbGV0ZWQgYW5kIHRoZW4gaXNzdWUgYmlnIGhhbW1lci5PdGhlcndpc2UKKwkgKiBpdCBtYXkgY2F1c2UgSS9PIGZhaWx1cmUgYXMgYmlnIGhhbW1lciBtYXJrcyB0aGUKKwkgKiBkZXZpY2VzIGFzIGxvc3Qga2lja2luZyBvZiB0aGUgcG9ydF9kb3duX3RpbWVyCisJICogd2hpbGUgZHBjIGlzIHN0dWNrIGZvciB0aGUgbWFpbGJveCB0byBjb21wbGV0ZS4KKwkgKi8KKwkvKiBCbG9ja2luZyBjYWxsLURvZXMgY29udGV4dCBzd2l0Y2hpbmcgaWYgbG9vcCBpcyBOb3QgUmVhZHkgKi8KKwlxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkoaGEpOworCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCWlmIChxbGEyeDAwX2Fib3J0X2lzcChoYSkpIHsKKwkJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJLyogZmFpbGVkLiBzY2hlZHVsZSBkcGMgdG8gdHJ5ICovCisJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpICE9IFFMQV9TVUNDRVNTKQorCQkJZ290byBib2FyZF9kaXNhYmxlZDsKKwl9IAorCisJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKworCXNwaW5fbG9ja19pcnEoaGEtPmhvc3QtPmhvc3RfbG9jayk7CisJaWYgKHJ2YWwgPT0gRkFJTEVEKQorCQlnb3RvIG91dDsKKworCS8qIFdhaXRpbmcgZm9yIG91ciBjb21tYW5kIGluIGRvbmVfcXVldWUgdG8gYmUgcmV0dXJuZWQgdG8gT1MuKi8KKwlpZiAoIXFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyhoYSkpCisJCXJ2YWwgPSBGQUlMRUQ7CisKKyBvdXQ6CisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHJlc2V0ICVzXG4iLCBfX2Z1bmNfXywKKwkJCShydmFsID09IEZBSUxFRCkgPyAiZmFpbGVkIiA6ICJzdWNjZWRlZCIpOworCisJcmV0dXJuIHJ2YWw7CisKKyBib2FyZF9kaXNhYmxlZDoKKwlzcGluX2xvY2tfaXJxKGhhLT5ob3N0LT5ob3N0X2xvY2spOworCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IGZhaWxlZDpib2FyZCBkaXNhYmxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiBGQUlMRUQ7Cit9CisKKworLyoKKyogcWxhMngwMF9sb29wX3Jlc2V0CisqICAgICAgSXNzdWUgbG9vcCByZXNldC4KKyoKKyogSW5wdXQ6CisqICAgICAgaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqCisqIFJldHVybnM6CisqICAgICAgMCA9IHN1Y2Nlc3MKKyovCitzdGF0aWMgaW50CitxbGEyeDAwX2xvb3BfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJdWludDE2X3QgdDsKKwlvc190Z3RfdCAgICAgICAgKnRxOworCisJaWYgKGhhLT5mbGFncy5lbmFibGVfbGlwX3Jlc2V0KSB7CisJCXN0YXR1cyA9IHFsYTJ4MDBfbGlwX3Jlc2V0KGhhKTsKKwl9CisKKwlpZiAoc3RhdHVzID09IFFMQV9TVUNDRVNTICYmIGhhLT5mbGFncy5lbmFibGVfdGFyZ2V0X3Jlc2V0KSB7CisJCWZvciAodCA9IDA7IHQgPCBNQVhfRklCUkVfREVWSUNFUzsgdCsrKSB7CisJCQlpZiAoKHRxID0gVEdUX1EoaGEsIHQpKSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAodHEtPmZjcG9ydCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlzdGF0dXMgPSBxbGEyeDAwX3RhcmdldF9yZXNldChoYSwgMCwgdCk7CisJCQlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IFFMQV9TVUNDRVNTICYmCisJCSgoIWhhLT5mbGFncy5lbmFibGVfdGFyZ2V0X3Jlc2V0ICYmIAorCQkgICFoYS0+ZmxhZ3MuZW5hYmxlX2xpcF9yZXNldCkgfHwKKwkJaGEtPmZsYWdzLmVuYWJsZV9saXBfZnVsbF9sb2dpbikpIHsKKworCQlzdGF0dXMgPSBxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKGhhKTsKKwl9CisKKwkvKiBJc3N1ZSBtYXJrZXIgY29tbWFuZCBvbmx5IHdoZW4gd2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHRoZSBJL08gKi8KKwloYS0+bWFya2VyX25lZWRlZCA9IDE7CisKKwlpZiAoc3RhdHVzKSB7CisJCS8qIEVtcHR5ICovCisJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogKioqKiBGQUlMRUQgKioqKlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQloYS0+aG9zdF9ubyk7KQorCX0gZWxzZSB7CisJCS8qIEVtcHR5ICovCisJCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWhhLT5ob3N0X25vKTspCisJfQorCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2RldmljZV9yZXNldAorICoJSXNzdWUgYnVzIGRldmljZSByZXNldCBtZXNzYWdlIHRvIHRoZSB0YXJnZXQuCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCXQgPSBTQ1NJIElELgorICoJVEFSR0VUX1FVRVVFX0xPQ0sgbXVzdCBiZSByZWxlYXNlZC4KKyAqCUFEQVBURVJfU1RBVEVfTE9DSyBtdXN0IGJlIHJlbGVhc2VkLgorICoKKyAqIENvbnRleHQ6CisgKglLZXJuZWwgY29udGV4dC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9kZXZpY2VfcmVzZXQoc2NzaV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpyZXNldF9mY3BvcnQpCit7CisJLyogQWJvcnQgVGFyZ2V0IGNvbW1hbmQgd2lsbCBjbGVhciBSZXNlcnZhdGlvbiAqLworCXJldHVybiBxbGEyeDAwX2Fib3J0X3RhcmdldChyZXNldF9mY3BvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMnh4eF9zbGF2ZV9jb25maWd1cmUKKyoKKyogRGVzY3JpcHRpb246CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorcWxhMnh4eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChzZGV2LT5ob3N0KTsKKwlpbnQgcXVldWVfZGVwdGg7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCXF1ZXVlX2RlcHRoID0gMTY7CisJZWxzZQorCQlxdWV1ZV9kZXB0aCA9IDMyOworCisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKKwkJaWYgKHFsMnhtYXhxZGVwdGggIT0gMCAmJiBxbDJ4bWF4cWRlcHRoIDw9IDB4ZmZmZlUpCisJCQlxdWV1ZV9kZXB0aCA9IHFsMnhtYXhxZGVwdGg7CisKKwkJcWwyeG1heHFkZXB0aCA9IHF1ZXVlX2RlcHRoOworCisJCXNjc2lfYWN0aXZhdGVfdGNxKHNkZXYsIHF1ZXVlX2RlcHRoKTsKKworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAic2NzaSglZDolZDolZDolZCk6IEVuYWJsZWQgdGFnZ2VkIHF1ZXVpbmcsIHF1ZXVlICIKKwkJICAgICJkZXB0aCAlZC5cbiIsCisJCSAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAorCQkgICAgc2Rldi0+cXVldWVfZGVwdGgpOworCX0gZWxzZSB7CisJCSBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwIC8qIFRDUSBvZmYgKi8sCisJCSAgICAgc2Rldi0+aG9zdC0+aG9zdHQtPmNtZF9wZXJfbHVuIC8qIDMgKi8pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qKgorICogcWxhMngwMF9jb25maWdfZG1hX2FkZHJlc3NpbmcoKSAtIENvbmZpZ3VyZSBPUyBETUEgYWRkcmVzc2luZyBtZXRob2QuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqCisgKiBBdCBleGl0LCB0aGUgQGhhJ3MgZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3Npbmcgc2V0IHRvIGluZGljYXRlZAorICogc3VwcG9ydGVkIGFkZHJlc3NpbmcgbWV0aG9kLgorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9jb25maWdfZG1hX2FkZHJlc3Npbmcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwkvKiBBc3N1bWUgMzJiaXQgRE1BIGFkZHJlc3MgKi8KKwloYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPSAwOworCWhhLT5jYWxjX3JlcXVlc3RfZW50cmllcyA9IHFsYTJ4MDBfY2FsY19pb2Nic18zMjsKKwloYS0+YnVpbGRfc2NzaV9pb2NicyA9IHFsYTJ4MDBfYnVpbGRfc2NzaV9pb2Nic18zMjsKKworCS8qCisJICogR2l2ZW4gdGhlIHR3byB2YXJpYW50cyBwY2lfc2V0X2RtYV9tYXNrKCksIGFsbG93IHRoZSBjb21waWxlciB0bworCSAqIGFzc2lzdCBpbiBzZXR0aW5nIHRoZSBwcm9wZXIgZG1hIG1hc2suCisJICovCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIERNQV82NEJJVF9NQVNLKSA9PSAwKSB7CisJCQloYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPSAxOworCQkJaGEtPmNhbGNfcmVxdWVzdF9lbnRyaWVzID0gcWxhMngwMF9jYWxjX2lvY2JzXzY0OworCQkJaGEtPmJ1aWxkX3Njc2lfaW9jYnMgPSBxbGEyeDAwX2J1aWxkX3Njc2lfaW9jYnNfNjQ7CisKKwkJCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soaGEtPnBkZXYsCisJCQkgICAgRE1BXzY0QklUX01BU0spKSB7CisJCQkJcWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgCisJCQkJICAgICJGYWlsZWQgdG8gc2V0IDY0IGJpdCBQQ0kgY29uc2lzdGVudCBtYXNrOyAiCisJCQkJICAgICJ1c2luZyAzMiBiaXQuXG4iKTsKKwkJCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soaGEtPnBkZXYsCisJCQkJICAgIERNQV8zMkJJVF9NQVNLKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsCisJCQkgICAgIkZhaWxlZCB0byBzZXQgNjQgYml0IFBDSSBETUEgbWFzaywgZmFsbGluZyBiYWNrICIKKwkJCSAgICAidG8gMzIgYml0IE1BU0suXG4iKTsKKwkJCXBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJfQorCX0gZWxzZSB7CisJCXBjaV9zZXRfZG1hX21hc2soaGEtPnBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3FsYTJ4MDBfaW9zcGFjZV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1bnNpZ25lZCBsb25nCXBpbywgcGlvX2xlbiwgcGlvX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcJbW1pbywgbW1pb19sZW4sIG1taW9fZmxhZ3M7CisKKwkvKiBXZSBvbmx5IG5lZWQgUElPIGZvciBGbGFzaCBvcGVyYXRpb25zIG9uIElTUDIzMTIgdjIgY2hpcHMuICovCisJcGlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAwKTsKKwlwaW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMCk7CisJcGlvX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKGhhLT5wZGV2LCAwKTsKKwlpZiAocGlvX2ZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlpZiAocGlvX2xlbiA8IE1JTl9JT0JBU0VfTEVOKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIkludmFsaWQgUENJIEkvTyByZWdpb24gc2l6ZSAoJXMpLi4uXG4iLAorCQkJCXBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCQlwaW8gPSAwOworCQl9CisJfSBlbHNlIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgInJlZ2lvbiAjMCBub3QgYSBQSU8gcmVzb3VyY2UgKCVzKS4uLlxuIiwKKwkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCXBpbyA9IDA7CisJfQorCisJLyogVXNlIE1NSU8gb3BlcmF0aW9ucyBmb3IgYWxsIGFjY2Vzc2VzLiAqLworCW1taW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDEpOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMSk7CisJbW1pb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhoYS0+cGRldiwgMSk7CisKKwlpZiAoIShtbWlvX2ZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkgICAgInJlZ2lvbiAjMCBub3QgYW4gTU1JTyByZXNvdXJjZSAoJXMpLCBhYm9ydGluZ1xuIiwKKwkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OworCX0KKwlpZiAobW1pb19sZW4gPCBNSU5fSU9CQVNFX0xFTikgeworCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJICAgICJJbnZhbGlkIFBDSSBtZW0gcmVnaW9uIHNpemUgKCVzKSwgYWJvcnRpbmdcbiIsCisJCQlwY2lfbmFtZShoYS0+cGRldikpOworCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKKwl9CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhoYS0+cGRldiwgaGEtPmJyZF9pbmZvLT5kcnZfbmFtZSkpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZhaWxlZCB0byByZXNlcnZlIFBJTy9NTUlPIHJlZ2lvbnMgKCVzKVxuIiwKKwkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CisKKwkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CisJfQorCisJaGEtPnBpb19hZGRyZXNzID0gcGlvOworCWhhLT5waW9fbGVuZ3RoID0gcGlvX2xlbjsKKwloYS0+aW9iYXNlID0gaW9yZW1hcChtbWlvLCBNSU5fSU9CQVNFX0xFTik7CisJaWYgKCFoYS0+aW9iYXNlKSB7CisJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkgICAgImNhbm5vdCByZW1hcCBNTUlPICglcyksIGFib3J0aW5nXG4iLCBwY2lfbmFtZShoYS0+cGRldikpOworCisJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OworCX0KKworCXJldHVybiAoMCk7CisKK2lvc3BhY2VfZXJyb3JfZXhpdDoKKwlyZXR1cm4gKC1FTk9NRU0pOworfQorCisvKgorICogUENJIGRyaXZlciBpbnRlcmZhY2UKKyAqLworaW50IHFsYTJ4MDBfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcWxhX2JvYXJkX2luZm8gKmJyZF9pbmZvKQoreworCWludAlyZXQ7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXNjc2lfcWxhX2hvc3RfdCAqaGE7CisJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZwl3YWl0X3N3aXRjaCA9IDA7CisJY2hhciBwY2lfaW5mb1syMF07CisJY2hhciBmd19zdHJbMzBdOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLTE7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZxbGEyeDAwX2RyaXZlcl90ZW1wbGF0ZSwKKwkgICAgc2l6ZW9mKHNjc2lfcWxhX2hvc3RfdCkpOworCWlmIChob3N0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgInFsYTJ4eHg6IENvdWxkbid0IGFsbG9jYXRlIGhvc3QgZnJvbSBzY3NpIGxheWVyIVxuIik7CisJCWdvdG8gcHJvYmVfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyogQ2xlYXIgb3VyIGRhdGEgYXJlYSAqLworCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKWhvc3QtPmhvc3RkYXRhOworCW1lbXNldChoYSwgMCwgc2l6ZW9mKHNjc2lfcWxhX2hvc3RfdCkpOworCisJaGEtPnBkZXYgPSBwZGV2OworCWhhLT5ob3N0ID0gaG9zdDsKKwloYS0+aG9zdF9ubyA9IGhvc3QtPmhvc3Rfbm87CisJaGEtPmJyZF9pbmZvID0gYnJkX2luZm87CisJc3ByaW50ZihoYS0+aG9zdF9zdHIsICIlc18lbGQiLCBoYS0+YnJkX2luZm8tPmRydl9uYW1lLCBoYS0+aG9zdF9ubyk7CisKKwkvKiBDb25maWd1cmUgUENJIEkvTyBzcGFjZSAqLworCXJldCA9IHFsYTJ4MDBfaW9zcGFjZV9jb25maWcoaGEpOworCWlmIChyZXQgIT0gMCkgeworCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwl9CisKKwkvKiBTYW5pdGl6ZSB0aGUgaW5mb3JtYXRpb24gZnJvbSBQQ0kgQklPUy4gKi8KKwlob3N0LT5pcnEgPSBwZGV2LT5pcnE7CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJICAgICJGb3VuZCBhbiAlcywgaXJxICVkLCBpb2Jhc2UgMHglcFxuIiwgaGEtPmJyZF9pbmZvLT5pc3BfbmFtZSwKKwkgICAgaG9zdC0+aXJxLCBoYS0+aW9iYXNlKTsKKworCXNwaW5fbG9ja19pbml0KCZoYS0+aGFyZHdhcmVfbG9jayk7CisKKwkvKiA0LjIzIEluaXRpYWxpemUgL3Byb2Mvc2NzaS9xbGEyeDAwIGNvdW50ZXJzICovCisJaGEtPmFjdHRocmVhZHMgPSAwOworCWhhLT5xdGhyZWFkcyAgID0gMDsKKwloYS0+dG90YWxfaXNyX2NudCA9IDA7CisJaGEtPnRvdGFsX2lzcF9hYm9ydHMgPSAwOworCWhhLT50b3RhbF9saXBfY250ID0gMDsKKwloYS0+dG90YWxfZGV2X2VycnMgPSAwOworCWhhLT50b3RhbF9pb3MgPSAwOworCWhhLT50b3RhbF9ieXRlcyA9IDA7CisKKwloYS0+cHJldl90b3BvbG9neSA9IDA7CisJaGEtPnBvcnRzID0gTUFYX0JVU0VTOworCisJaWYgKElTX1FMQTIxMDAoaGEpKSB7CisJCWhhLT5tYXhfdGFyZ2V0cyA9IE1BWF9UQVJHRVRTXzIxMDA7CisJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXzIxMDA7CisJCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjEwMDsKKwkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIxMDA7CisJCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIxMDA7CisJCWhvc3QtPnNnX3RhYmxlc2l6ZSA9IDMyOworCX0gZWxzZSBpZiAoSVNfUUxBMjIwMChoYSkpIHsKKwkJaGEtPm1heF90YXJnZXRzID0gTUFYX1RBUkdFVFNfMjIwMDsKKwkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CisJCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjIwMDsKKwkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIxMDA7CisJCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIxMDA7CisJfSBlbHNlIC8qaWYgKElTX1FMQTIzMDAoaGEpKSovIHsKKwkJaGEtPm1heF90YXJnZXRzID0gTUFYX1RBUkdFVFNfMjIwMDsKKwkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CisJCWhhLT5yZXF1ZXN0X3FfbGVuZ3RoID0gUkVRVUVTVF9FTlRSWV9DTlRfMjIwMDsKKwkJaGEtPnJlc3BvbnNlX3FfbGVuZ3RoID0gUkVTUE9OU0VfRU5UUllfQ05UXzIzMDA7CisJCWhhLT5sYXN0X2xvb3BfaWQgPSBTTlNfTEFTVF9MT09QX0lEXzIzMDA7CisJfQorCWhvc3QtPmNhbl9xdWV1ZSA9IGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMTI4OworCisJLyogbG9hZCB0aGUgRi9XLCByZWFkIHBhcmFtYXRlcnMsIGFuZCBpbml0IHRoZSBIL1cgKi8KKwloYS0+aW5zdGFuY2UgPSBudW1faG9zdHM7CisKKwlpbml0X01VVEVYKCZoYS0+bWJ4X2NtZF9zZW0pOworCWluaXRfTVVURVhfTE9DS0VEKCZoYS0+bWJ4X2ludHJfc2VtKTsKKworCUlOSVRfTElTVF9IRUFEKCZoYS0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmhhLT5mY3BvcnRzKTsKKwlJTklUX0xJU1RfSEVBRCgmaGEtPnJzY25fZmNwb3J0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmhhLT5kb25lX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmaGEtPnJldHJ5X3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmaGEtPnNjc2lfcmV0cnlfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZoYS0+cGVuZGluZ19xdWV1ZSk7CisKKwkvKgorCSAqIFRoZXNlIGxvY2tzIGFyZSB1c2VkIHRvIHByZXZlbnQgbW9yZSB0aGFuIG9uZSBDUFUKKwkgKiBmcm9tIG1vZGlmeWluZyB0aGUgcXVldWUgYXQgdGhlIHNhbWUgdGltZS4gVGhlCisJICogaGlnaGVyIGxldmVsICJob3N0X2xvY2siIHdpbGwgcmVkdWNlIG1vc3QKKwkgKiBjb250ZW50aW9uIGZvciB0aGVzZSBsb2Nrcy4KKwkgKi8KKwlzcGluX2xvY2tfaW5pdCgmaGEtPm1ieF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmhhLT5saXN0X2xvY2spOworCisJaGEtPmRwY19waWQgPSAtMTsKKwlpbml0X2NvbXBsZXRpb24oJmhhLT5kcGNfaW5pdGVkKTsKKwlpbml0X2NvbXBsZXRpb24oJmhhLT5kcGNfZXhpdGVkKTsKKworCXFsYTJ4MDBfY29uZmlnX2RtYV9hZGRyZXNzaW5nKGhhKTsKKwlpZiAocWxhMngwMF9tZW1fYWxsb2MoaGEpKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJbRVJST1JdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXJcbiIpOworCisJCWdvdG8gcHJvYmVfZmFpbGVkOworCX0KKworCWlmIChxbGEyeDAwX2luaXRpYWxpemVfYWRhcHRlcihoYSkgJiYKKwkgICAgIShoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkpIHsKKworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgYWRhcHRlclxuIik7CisKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhZGFwdGVyIC0gIgorCQkgICAgIkFkYXB0ZXIgZmxhZ3MgJXguXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIGhhLT5kZXZpY2VfZmxhZ3MpKTsKKworCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwl9CisKKwkvKgorCSAqIFN0YXJ0dXAgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCBhZGFwdGVyCisJICovCisJaGEtPmRwY19zaG91bGRfZGllID0gMDsKKwloYS0+ZHBjX3BpZCA9IGtlcm5lbF90aHJlYWQocWxhMngwMF9kb19kcGMsIGhhLCAwKTsKKwlpZiAoaGEtPmRwY19waWQgPCAwKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJVbmFibGUgdG8gc3RhcnQgRFBDIHRocmVhZCFcbiIpOworCisJCWdvdG8gcHJvYmVfZmFpbGVkOworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZoYS0+ZHBjX2luaXRlZCk7CisKKwlob3N0LT50aGlzX2lkID0gMjU1OworCWhvc3QtPmNtZF9wZXJfbHVuID0gMzsKKwlob3N0LT5tYXhfY21kX2xlbiA9IE1BWF9DTURTWjsKKwlob3N0LT5tYXhfY2hhbm5lbCA9IGhhLT5wb3J0cyAtIDE7CisJaG9zdC0+bWF4X2x1biA9IGhhLT5tYXhfbHVuczsKKwlCVUdfT04ocWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGUgPT0gTlVMTCk7CisJaG9zdC0+dHJhbnNwb3J0dCA9IHFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlOworCWhvc3QtPnVuaXF1ZV9pZCA9IGhhLT5pbnN0YW5jZTsKKwlob3N0LT5tYXhfaWQgPSBoYS0+bWF4X3RhcmdldHM7CisKKwlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpCisJCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgcWxhMjEwMF9pbnRyX2hhbmRsZXIsCisJCSAgICBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsIGhhLT5icmRfaW5mby0+ZHJ2X25hbWUsIGhhKTsKKwllbHNlCisJCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgcWxhMjMwMF9pbnRyX2hhbmRsZXIsCisJCSAgICBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsIGhhLT5icmRfaW5mby0+ZHJ2X25hbWUsIGhhKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZhaWxlZCB0byByZXNlcnZlIGludGVycnVwdCAlZCBhbHJlYWR5IGluIHVzZS5cbiIsCisJCSAgICBob3N0LT5pcnEpOworCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwl9CisKKwkvKiBJbml0aWFsaXplZCB0aGUgdGltZXIgKi8KKwlxbGEyeDAwX3N0YXJ0X3RpbWVyKGhhLCBxbGEyeDAwX3RpbWVyLCBXQVRDSF9JTlRFUlZBTCk7CisKKwlERUJVRzIocHJpbnRrKCJERUJVRzogZGV0ZWN0IGhiYSAlbGQgYXQgYWRkcmVzcyA9ICVwXG4iLAorCSAgICBoYS0+aG9zdF9ubywgaGEpKTsKKworCXJlZyA9IGhhLT5pb2Jhc2U7CisKKwkvKiBEaXNhYmxlIElTUCBpbnRlcnJ1cHRzLiAqLworCXFsYTJ4MDBfZGlzYWJsZV9pbnRycyhoYSk7CisKKwkvKiBFbnN1cmUgbWFpbGJveCByZWdpc3RlcnMgYXJlIGZyZWUuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CisJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIEhDQ1JfQ0xSX1JJU0NfSU5UKTsKKwlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfSE9TVF9JTlQpOworCisJLyogRW5hYmxlIHByb3BlciBwYXJpdHkgKi8KKwlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkgeworCQlpZiAoSVNfUUxBMjMwMChoYSkpCisJCQkvKiBTUkFNIHBhcml0eSAqLworCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDEpKTsKKwkJZWxzZQorCQkJLyogU1JBTSwgSW5zdHJ1Y3Rpb24gUkFNIGFuZCBHUCBSQU0gcGFyaXR5ICovCisJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgKEhDQ1JfRU5BQkxFX1BBUklUWSArIDB4NykpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogRW5hYmxlIGNoaXAgaW50ZXJydXB0cy4gKi8KKwlxbGEyeDAwX2VuYWJsZV9pbnRycyhoYSk7CisKKwkvKiB2Mi4xOS41YjYgKi8KKwkvKgorCSAqIFdhaXQgYXJvdW5kIG1heCBsb29wX3Jlc2V0X2RlbGF5IHNlY3MgZm9yIHRoZSBkZXZpY2VzIHRvIGNvbWUKKwkgKiBvbi1saW5lLiBXZSBkb24ndCB3YW50IExpbnV4IHNjYW5uaW5nIGJlZm9yZSB3ZSBhcmUgcmVhZHkuCisJICoKKwkgKi8KKwlmb3IgKHdhaXRfc3dpdGNoID0gamlmZmllcyArIChoYS0+bG9vcF9yZXNldF9kZWxheSAqIEhaKTsKKwkgICAgdGltZV9iZWZvcmUoamlmZmllcyx3YWl0X3N3aXRjaCkgJiYKKwkgICAgICEoaGEtPmRldmljZV9mbGFncyAmIChERkxHX05PX0NBQkxFIHwgREZMR19GQUJSSUNfREVWSUNFUykpCisJICAgICAmJiAoaGEtPmRldmljZV9mbGFncyAmIFNXSVRDSF9GT1VORCkgOykgeworCisJCXFsYTJ4MDBfY2hlY2tfZmFicmljX2RldmljZXMoaGEpOworCisJCW1zbGVlcCgxMCk7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhhKTsKKwloYS0+ZmxhZ3MuaW5pdF9kb25lID0gMTsKKwludW1faG9zdHMrKzsKKworCS8qIExpc3QgdGhlIHRhcmdldCB3ZSBoYXZlIGZvdW5kICovCisJaWYgKGRpc3BsYXlDb25maWcpIHsKKwkJcWxhMngwMF9kaXNwbGF5X2ZjX25hbWVzKGhhKTsKKwl9CisKKwlpZiAoc2NzaV9hZGRfaG9zdChob3N0LCAmcGRldi0+ZGV2KSkKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLCAmc3lzZnNfZndfZHVtcF9hdHRyKTsKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLCAmc3lzZnNfbnZyYW1fYXR0cik7CisKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJcbiIKKwkgICAgIiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyOiAlc1xuIgorCSAgICAiICBRTG9naWMgJXMgLSAlc1xuIgorCSAgICAiICAlczogJXMgQCAlcyBoZG1hJWMsIGhvc3QjPSVsZCwgZnc9JXNcbiIsIHFsYTJ4MDBfdmVyc2lvbl9zdHIsCisJICAgIGhhLT5tb2RlbF9udW1iZXIsIGhhLT5tb2RlbF9kZXNjID8gaGEtPm1vZGVsX2Rlc2M6ICIiLAorCSAgICBoYS0+YnJkX2luZm8tPmlzcF9uYW1lLCBxbGEyeDAwX2dldF9wY2lfaW5mb19zdHIoaGEsIHBjaV9pbmZvKSwKKwkgICAgcGNpX25hbWUoaGEtPnBkZXYpLCBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAnKyc6ICctJywKKwkgICAgaGEtPmhvc3Rfbm8sIHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb25fc3RyKGhhLCBmd19zdHIpKTsKKworCWlmIChxbDJ4ZG9pbml0c2NhbikKKwkJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gMDsKKworcHJvYmVfZmFpbGVkOgorCXFsYTJ4MDBfZnJlZV9kZXZpY2UoaGEpOworCisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworcHJvYmVfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9HUEwocWxhMngwMF9wcm9iZV9vbmUpOworCit2b2lkIHFsYTJ4MDBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhOworCisJaGEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmhhLT5ob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKKwkgICAgJnN5c2ZzX2Z3X2R1bXBfYXR0cik7CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZoYS0+aG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosICZzeXNmc19udnJhbV9hdHRyKTsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaGEtPmhvc3QpOworCisJcWxhMngwMF9mcmVlX2RldmljZShoYSk7CisKKwlzY3NpX2hvc3RfcHV0KGhhLT5ob3N0KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFsYTJ4MDBfcmVtb3ZlX29uZSk7CisKK3N0YXRpYyB2b2lkCitxbGEyeDAwX2ZyZWVfZGV2aWNlKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJldDsKKworCS8qIEFib3J0IGFueSBvdXRzdGFuZGluZyBJTyBkZXNjcmlwdG9ycy4gKi8KKwlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKKwkJcWxhMngwMF9jYW5jZWxfaW9fZGVzY3JpcHRvcnMoaGEpOworCisJLyogdHVybi1vZmYgaW50ZXJydXB0cyBvbiB0aGUgY2FyZCAqLworCWlmIChoYS0+aW50ZXJydXB0c19vbikKKwkJcWxhMngwMF9kaXNhYmxlX2ludHJzKGhhKTsKKworCS8qIERpc2FibGUgdGltZXIgKi8KKwlpZiAoaGEtPnRpbWVyX2FjdGl2ZSkKKwkJcWxhMngwMF9zdG9wX3RpbWVyKGhhKTsKKworCS8qIEtpbGwgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCAqLworCWlmIChoYS0+ZHBjX3BpZCA+PSAwKSB7CisJCWhhLT5kcGNfc2hvdWxkX2RpZSA9IDE7CisJCXdtYigpOworCQlyZXQgPSBraWxsX3Byb2MoaGEtPmRwY19waWQsIFNJR0hVUCwgMSk7CisJCWlmIChyZXQpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJICAgICJVbmFibGUgdG8gc2lnbmFsIERQQyB0aHJlYWQgLS0gKCVkKVxuIiwgcmV0KTsKKworCQkJLyogVE9ETzogU09NRVRISU5HIE1PUkU/Pz8gKi8KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmhhLT5kcGNfZXhpdGVkKTsKKwkJfQorCX0KKworCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCisKKwloYS0+ZmxhZ3Mub25saW5lID0gMDsKKworCS8qIERldGFjaCBpbnRlcnJ1cHRzICovCisJaWYgKGhhLT5wZGV2LT5pcnEpCisJCWZyZWVfaXJxKGhhLT5wZGV2LT5pcnEsIGhhKTsKKworCS8qIHJlbGVhc2UgaW8gc3BhY2UgcmVnaXN0ZXJzICAqLworCWlmIChoYS0+aW9iYXNlKQorCQlpb3VubWFwKGhhLT5pb2Jhc2UpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaGEtPnBkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKGhhLT5wZGV2KTsKK30KKworCisvKgorICogVGhlIGZvbGxvd2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgYWRvcHRlZCB0byBoYW5kbGUKKyAqIHRoZSByZS1lbnRyYW50IHFsYTJ4MDBfcHJvY19pbmZvIGNvcnJlY3RseS4KKyAqLworc3RhdGljIHZvaWQKK2NvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWlmIChpbmZvLT5wb3MgKyBsZW4gPiBpbmZvLT5vZmZzZXQgKyBpbmZvLT5sZW5ndGgpCisJCWxlbiA9IGluZm8tPm9mZnNldCArIGluZm8tPmxlbmd0aCAtIGluZm8tPnBvczsKKworCWlmIChpbmZvLT5wb3MgKyBsZW4gPCBpbmZvLT5vZmZzZXQpIHsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJcmV0dXJuOworCX0KKyAKKwlpZiAoaW5mby0+cG9zIDwgaW5mby0+b2Zmc2V0KSB7CisJCW9mZl90IHBhcnRpYWw7CisgCisJCXBhcnRpYWwgPSBpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3M7CisJCWRhdGEgKz0gcGFydGlhbDsKKwkJaW5mby0+cG9zICs9IHBhcnRpYWw7CisJCWxlbiAgLT0gcGFydGlhbDsKKwl9CisgCisJaWYgKGxlbiA+IDApIHsKKwkJbWVtY3B5KGluZm8tPmJ1ZmZlciwgZGF0YSwgbGVuKTsKKwkJaW5mby0+cG9zICs9IGxlbjsKKwkJaW5mby0+YnVmZmVyICs9IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1ZlsyNTZdOworCWludCBsZW47CisgCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworIAorCWNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOworCisJcmV0dXJuIChsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBxbGEyeDAwX3Byb2NfaW5mbworKgorKiBEZXNjcmlwdGlvbjoKKyogICBSZXR1cm4gaW5mb3JtYXRpb24gdG8gaGFuZGxlIC9wcm9jIHN1cHBvcnQgZm9yIHRoZSBkcml2ZXIuCisqCisqIGlub3V0IDogZGVjaWRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBkYXRhZmxvdyBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlCisqICAgICAgICAgdmFyaWFibGVzCisqIGJ1ZmZlcjogSWYgaW5vdXQ9PTAgZGF0YSBpcyBiZWluZyB3cml0dGVuIHRvIGl0IGVsc2UgcmVhZCBmcm9tIGl0CisqICAgICAgICAgKHB0ciB0byBhIHBhZ2UgYnVmZmVyKQorKiAqc3RhcnQ6IElmIGlub3V0PT0wIHN0YXJ0IG9mIHRoZSB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIKKyogb2Zmc2V0OiBJZiBpbm91dD09MCBzdGFydGluZyBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFsbAorKiAgICAgICAgIHBvc3NpYmxlIGRhdGEgdG8gcmV0dXJuLgorKiBsZW5ndGg6IElmIGlub3V0PT0wIG1heCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIKKyogICAgICAgICBlbHNlIG51bWJlciBvZiBieXRlcyBpbiAiYnVmZmVyIgorKiBSZXR1cm5zOgorKiAgICAgICAgIDwgMDogIGVycm9yLiBlcnJubyB2YWx1ZS4KKyogICAgICAgICA+PSAwOiBzaXplb2YgZGF0YSByZXR1cm5lZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK3FsYTJ4MDBfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpidWZmZXIsCisgICAgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwlzdHJ1Y3QgaW5mb19zdHIJaW5mbzsKKwlpbnQgICAgICAgICAgICAgcmV0dmFsID0gLUVJTlZBTDsKKwlvc19sdW5fdAkqdXA7CisJb3NfdGd0X3QJKnRxOworCXVuc2lnbmVkIGludAl0LCBsOworCXVpbnQzMl90ICAgICAgICB0bXBfc247CisJdWludDMyX3QJKmZsYWdzOworCXVpbnQ4X3QJCSpsb29wX3N0YXRlOworCXNjc2lfcWxhX2hvc3RfdCAqaGE7CisJY2hhciBmd19pbmZvWzMwXTsKKyAKKwlERUJVRzMocHJpbnRrKEtFUk5fSU5GTworCSAgICAiRW50ZXJpbmcgcHJvY19pbmZvIGJ1ZmZfaW49JXAsIG9mZnNldD0weCVseCwgbGVuZ3RoPTB4JXhcbiIsCisJICAgIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOykKKworCWhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKSBzaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoaW5vdXQpIHsKKwkJLyogSGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlPyAqLworCQlERUJVRzMocHJpbnRrKAorCQkgICAgIiVzOiBoYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGUuIFxuIiwKKwkJICAgIF9fZnVuY19fKTspCisKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKHN0YXJ0KSB7CisJCSpzdGFydCA9IGJ1ZmZlcjsKKwl9CisKKwlpbmZvLmJ1ZmZlciA9IGJ1ZmZlcjsKKwlpbmZvLmxlbmd0aCA9IGxlbmd0aDsKKwlpbmZvLm9mZnNldCA9IG9mZnNldDsKKwlpbmZvLnBvcyAgICA9IDA7CisKKwkvKiBzdGFydCBidWlsZGluZyB0aGUgcHJpbnQgYnVmZmVyICovCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiUUxvZ2ljIFBDSSB0byBGaWJyZSBDaGFubmVsIEhvc3QgQWRhcHRlciBmb3IgJXM6XG4iCisJICAgICIgICAgICAgIEZpcm13YXJlIHZlcnNpb24gJXMsICIsCisJICAgIGhhLT5tb2RlbF9udW1iZXIsIHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb25fc3RyKGhhLCBmd19pbmZvKSk7CisKKwljb3B5X2luZm8oJmluZm8sICJEcml2ZXIgdmVyc2lvbiAlc1xuIiwgcWxhMngwMF92ZXJzaW9uX3N0cik7CisKKwl0bXBfc24gPSAoKGhhLT5zZXJpYWwwICYgMHgxZikgPDwgMTYpIHwgKGhhLT5zZXJpYWwyIDw8IDgpIHwgCisJICAgIGhhLT5zZXJpYWwxOworCWNvcHlfaW5mbygmaW5mbywgIklTUDogJXMsIFNlcmlhbCMgJWMlMDVkXG4iLAorCSAgICBoYS0+YnJkX2luZm8tPmlzcF9uYW1lLCAoJ0EnICsgdG1wX3NuLzEwMDAwMCksICh0bXBfc24lMTAwMDAwKSk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJSZXF1ZXN0IFF1ZXVlID0gMHglbGx4LCBSZXNwb25zZSBRdWV1ZSA9IDB4JWxseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyloYS0+cmVxdWVzdF9kbWEsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpaGEtPnJlc3BvbnNlX2RtYSk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJSZXF1ZXN0IFF1ZXVlIGNvdW50ID0gJWQsIFJlc3BvbnNlIFF1ZXVlIGNvdW50ID0gJWRcbiIsCisJICAgIGhhLT5yZXF1ZXN0X3FfbGVuZ3RoLCBoYS0+cmVzcG9uc2VfcV9sZW5ndGgpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBjb21tYW5kcyA9ICVsZFxuIiwKKwkgICAgaGEtPmFjdHRocmVhZHMpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiVG90YWwgbnVtYmVyIG9mIGludGVycnVwdHMgPSAlbGRcbiIsCisJICAgIChsb25nKWhhLT50b3RhbF9pc3JfY250KTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIiAgICBEZXZpY2UgcXVldWUgZGVwdGggPSAweCV4XG4iLAorCSAgICAocWwyeG1heHFkZXB0aCA9PSAwKSA/IDE2IDogcWwyeG1heHFkZXB0aCk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJOdW1iZXIgb2YgZnJlZSByZXF1ZXN0IGVudHJpZXMgPSAlZFxuIiwgaGEtPnJlcV9xX2NudCk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJOdW1iZXIgb2YgbWFpbGJveCB0aW1lb3V0cyA9ICVsZFxuIiwgaGEtPnRvdGFsX21ieF90aW1lb3V0KTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIk51bWJlciBvZiBJU1AgYWJvcnRzID0gJWxkXG4iLCBoYS0+dG90YWxfaXNwX2Fib3J0cyk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJOdW1iZXIgb2YgbG9vcCByZXN5bmNzID0gJWxkXG4iLCBoYS0+dG90YWxfbG9vcF9yZXN5bmMpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiTnVtYmVyIG9mIHJldHJpZXMgZm9yIGVtcHR5IHNsb3RzID0gJWxkXG4iLAorCSAgICBxbGEyeDAwX3N0YXRzLm91dGFycmF5X2Z1bGwpOworCisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiTnVtYmVyIG9mIHJlcXMgaW4gcGVuZGluZ19xPSAlbGQsIHJldHJ5X3E9ICVkLCAiCisJICAgICJkb25lX3E9ICVsZCwgc2NzaV9yZXRyeV9xPSAlZFxuIiwKKwkgICAgaGEtPnF0aHJlYWRzLCBoYS0+cmV0cnlfcV9jbnQsCisJICAgIGhhLT5kb25lX3FfY250LCBoYS0+c2NzaV9yZXRyeV9xX2NudCk7CisKKworCWZsYWdzID0gKHVpbnQzMl90ICopICZoYS0+ZmxhZ3M7CisKKwlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pIHsKKwkJbG9vcF9zdGF0ZSA9ICJET1dOIjsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9VUCkgeworCQlsb29wX3N0YXRlID0gIlVQIjsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9SRUFEWSkgeworCQlsb29wX3N0YXRlID0gIlJFQURZIjsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9USU1FT1VUKSB7CisJCWxvb3Bfc3RhdGUgPSAiVElNRU9VVCI7CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpID09IExPT1BfVVBEQVRFKSB7CisJCWxvb3Bfc3RhdGUgPSAiVVBEQVRFIjsKKwl9IGVsc2UgeworCQlsb29wX3N0YXRlID0gIlVOS05PV04iOworCX0KKworCWNvcHlfaW5mbygmaW5mbywgCisJICAgICJIb3N0IGFkYXB0ZXI6bG9vcCBzdGF0ZSA9IDwlcz4sIGZsYWdzID0gMHglbHhcbiIsCisJICAgIGxvb3Bfc3RhdGUgLCAqZmxhZ3MpOworCisJY29weV9pbmZvKCZpbmZvLCAiRHBjIGZsYWdzID0gMHglbHhcbiIsIGhhLT5kcGNfZmxhZ3MpOworCisJY29weV9pbmZvKCZpbmZvLCAiTUJYIGZsYWdzID0gMHgleFxuIiwgaGEtPm1ieF9mbGFncyk7CisKKwljb3B5X2luZm8oJmluZm8sICJMaW5rIGRvd24gVGltZW91dCA9ICUzLjNkXG4iLAorCSAgICBoYS0+bGlua19kb3duX3RpbWVvdXQpOworCisJY29weV9pbmZvKCZpbmZvLCAiUG9ydCBkb3duIHJldHJ5ID0gJTMuM2RcbiIsCisJICAgIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQpOworCisJY29weV9pbmZvKCZpbmZvLCAiTG9naW4gcmV0cnkgY291bnQgPSAlMy4zZFxuIiwKKwkgICAgaGEtPmxvZ2luX3JldHJ5X2NvdW50KTsKKworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgIkNvbW1hbmRzIHJldHJpZWQgd2l0aCBkcm9wcGVkIGZyYW1lKHMpID0gJWRcbiIsCisJICAgIGhhLT5kcm9wcGVkX2ZyYW1lX2Vycm9yX2NudCk7CisKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJQcm9kdWN0IElEID0gJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwgaGEtPnByb2R1Y3RfaWRbMF0sCisJICAgIGhhLT5wcm9kdWN0X2lkWzFdLCBoYS0+cHJvZHVjdF9pZFsyXSwgaGEtPnByb2R1Y3RfaWRbM10pOworCisJY29weV9pbmZvKCZpbmZvLCAiXG4iKTsKKworCS8qIDIuMjUgbm9kZS9wb3J0IGRpc3BsYXkgdG8gcHJvYyAqLworCS8qIERpc3BsYXkgdGhlIG5vZGUgbmFtZSBmb3IgYWRhcHRlciAqLworCWNvcHlfaW5mbygmaW5mbywgIlxuU0NTSSBEZXZpY2UgSW5mb3JtYXRpb246XG4iKTsKKwljb3B5X2luZm8oJmluZm8sCisJICAgICJzY3NpLXFsYSVkLWFkYXB0ZXItbm9kZT0iCisJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeDtcbiIsCisJICAgIChpbnQpaGEtPmluc3RhbmNlLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzBdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzFdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzJdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzNdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzRdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzVdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzZdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzddKTsKKworCS8qIGRpc3BsYXkgdGhlIHBvcnQgbmFtZSBmb3IgYWRhcHRlciAqLworCWNvcHlfaW5mbygmaW5mbywKKwkgICAgInNjc2ktcWxhJWQtYWRhcHRlci1wb3J0PSIKKwkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4O1xuIiwKKwkgICAgKGludCloYS0+aW5zdGFuY2UsCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbMF0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbMV0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbMl0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbM10sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbNF0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbNV0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbNl0sCisJICAgIGhhLT5pbml0X2NiLT5wb3J0X25hbWVbN10pOworCisJLyogUHJpbnQgb3V0IGRldmljZSBwb3J0IG5hbWVzICovCisJZm9yICh0ID0gMDsgdCA8IE1BWF9GSUJSRV9ERVZJQ0VTOyB0KyspIHsKKwkJaWYgKCh0cSA9IFRHVF9RKGhhLCB0KSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWNvcHlfaW5mbygmaW5mbywKKwkJICAgICJzY3NpLXFsYSVkLXRhcmdldC0lZD0iCisJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMng7XG4iLAorCQkgICAgKGludCloYS0+aW5zdGFuY2UsIHQsCisJCSAgICB0cS0+cG9ydF9uYW1lWzBdLCB0cS0+cG9ydF9uYW1lWzFdLAorCQkgICAgdHEtPnBvcnRfbmFtZVsyXSwgdHEtPnBvcnRfbmFtZVszXSwKKwkJICAgIHRxLT5wb3J0X25hbWVbNF0sIHRxLT5wb3J0X25hbWVbNV0sCisJCSAgICB0cS0+cG9ydF9uYW1lWzZdLCB0cS0+cG9ydF9uYW1lWzddKTsKKwl9CisKKwljb3B5X2luZm8oJmluZm8sICJcblNDU0kgTFVOIEluZm9ybWF0aW9uOlxuIik7CisJY29weV9pbmZvKCZpbmZvLAorCSAgICAiKElkOkx1bikgICogLSBpbmRpY2F0ZXMgbHVuIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIE9TLlxuIik7CisKKwkvKiBzY2FuIGZvciBhbGwgZXF1aXBtZW50IHN0YXRzICovCisJZm9yICh0ID0gMDsgdCA8IE1BWF9GSUJSRV9ERVZJQ0VTOyB0KyspIHsKKwkJLyogc2NhbiBhbGwgbHVucyAqLworCQlmb3IgKGwgPSAwOyBsIDwgaGEtPm1heF9sdW5zOyBsKyspIHsKKwkJCXVwID0gKG9zX2x1bl90ICopIEdFVF9MVV9RKGhhLCB0LCBsKTsKKworCQkJaWYgKHVwID09IE5VTEwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICh1cC0+ZmNsdW4gPT0gTlVMTCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljb3B5X2luZm8oJmluZm8sCisJCQkgICAgIiglMmQ6JTJkKTogVG90YWwgcmVxcyAlbGQsIiwKKwkJCSAgICB0LGwsdXAtPmlvX2NudCk7CisKKwkJCWNvcHlfaW5mbygmaW5mbywKKwkJCSAgICAiIFBlbmRpbmcgcmVxcyAlbGQsIiwKKwkJCSAgICB1cC0+b3V0X2NudCk7CisKKwkJCWlmICh1cC0+aW9fY250IDwgNCkgeworCQkJCWNvcHlfaW5mbygmaW5mbywKKwkJCQkgICAgIiBmbGFncyAweCV4KiwiLAorCQkJCSAgICAoaW50KXVwLT5xX2ZsYWcpOworCQkJfSBlbHNlIHsKKwkJCQljb3B5X2luZm8oJmluZm8sCisJCQkJICAgICIgZmxhZ3MgMHgleCwiLAorCQkJCSAgICAoaW50KXVwLT5xX2ZsYWcpOworCQkJfQorCisJCQljb3B5X2luZm8oJmluZm8sIAorCQkJICAgICIgJWxkOiVkOiUwMnggJTAyeCIsCisJCQkgICAgdXAtPmZjbHVuLT5mY3BvcnQtPmhhLT5pbnN0YW5jZSwKKwkJCSAgICB1cC0+ZmNsdW4tPmZjcG9ydC0+Y3VyX3BhdGgsCisJCQkgICAgdXAtPmZjbHVuLT5mY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgdXAtPmZjbHVuLT5kZXZpY2VfdHlwZSk7CisKKwkJCWNvcHlfaW5mbygmaW5mbywgIlxuIik7CisKKwkJCWlmIChpbmZvLnBvcyA+PSBpbmZvLm9mZnNldCArIGluZm8ubGVuZ3RoKSB7CisJCQkJLyogTm8gbmVlZCB0byBjb250aW51ZSAqLworCQkJCWdvdG8gcHJvZmlsZV9zdG9wOworCQkJfQorCQl9CisKKwkJaWYgKGluZm8ucG9zID49IGluZm8ub2Zmc2V0ICsgaW5mby5sZW5ndGgpIHsKKwkJCS8qIE5vIG5lZWQgdG8gY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCitwcm9maWxlX3N0b3A6CisKKwlyZXR2YWwgPSBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0ID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDA7CisKKwlERUJVRzMocHJpbnRrKEtFUk5fSU5GTyAKKwkgICAgIkV4aXRpbmcgcHJvY19pbmZvOiBpbmZvLnBvcz0lZCwgb2Zmc2V0PTB4JWx4LCAiCisJICAgICJsZW5ndGg9MHgleFxuIiwgaW5mby5wb3MsIG9mZnNldCwgbGVuZ3RoKTspCisKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKy8qCisqIHFsYTJ4MDBfZGlzcGxheV9mY19uYW1lcworKiAgICAgIFRoaXMgcm91dGluZSB3aWxsIHRoZSBub2RlIG5hbWVzIG9mIHRoZSBkaWZmZXJlbnQgZGV2aWNlcyBmb3VuZAorKiAgICAgIGFmdGVyIHBvcnQgaW5xdWlyeS4KKyoKKyogSW5wdXQ6CisqICAgICAgY21kID0gU0NTSSBjb21tYW5kIHN0cnVjdHVyZQorKgorKiBSZXR1cm5zOgorKiAgICAgIE5vbmUuCisqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfZGlzcGxheV9mY19uYW1lcyhzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwl1aW50MTZfdAl0Z3Q7CisJb3NfdGd0X3QJKnRxOworCisJLyogRGlzcGxheSB0aGUgbm9kZSBuYW1lIGZvciBhZGFwdGVyICovCisJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCSAgICAic2NzaS1xbGElZC1hZGFwdGVyLW5vZGU9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcXDtcbiIsCisJICAgIChpbnQpaGEtPmluc3RhbmNlLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzBdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzFdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzJdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzNdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzRdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzVdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzZdLAorCSAgICBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzddKTsKKworCS8qIGRpc3BsYXkgdGhlIHBvcnQgbmFtZSBmb3IgYWRhcHRlciAqLworCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkgICAgInNjc2ktcWxhJWQtYWRhcHRlci1wb3J0PSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XFw7XG4iLAorCSAgICAoaW50KWhhLT5pbnN0YW5jZSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVswXSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVsxXSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVsyXSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVszXSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVs0XSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVs1XSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVs2XSwKKwkgICAgaGEtPmluaXRfY2ItPnBvcnRfbmFtZVs3XSk7CisKKwkvKiBQcmludCBvdXQgZGV2aWNlIHBvcnQgbmFtZXMgKi8KKwlmb3IgKHRndCA9IDA7IHRndCA8IE1BWF9UQVJHRVRTOyB0Z3QrKykgeworCQlpZiAoKHRxID0gaGEtPm90Z3RbdGd0XSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0cS0+ZmNwb3J0ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGhhLT5iaW5kaW5nX3R5cGUpIHsKKwkJCWNhc2UgQklORF9CWV9QT1JUX05BTUU6CisJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgICAic2NzaS1xbGElZC10Z3QtJWQtZGktMC1wb3J0PSIKKwkJCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XFw7XG4iLAorCQkJCSAgICAoaW50KWhhLT5pbnN0YW5jZSwgCisJCQkJICAgIHRndCwKKwkJCQkgICAgdHEtPnBvcnRfbmFtZVswXSwgCisJCQkJICAgIHRxLT5wb3J0X25hbWVbMV0sCisJCQkJICAgIHRxLT5wb3J0X25hbWVbMl0sIAorCQkJCSAgICB0cS0+cG9ydF9uYW1lWzNdLAorCQkJCSAgICB0cS0+cG9ydF9uYW1lWzRdLCAKKwkJCQkgICAgdHEtPnBvcnRfbmFtZVs1XSwKKwkJCQkgICAgdHEtPnBvcnRfbmFtZVs2XSwgCisJCQkJICAgIHRxLT5wb3J0X25hbWVbN10pOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQklORF9CWV9QT1JUX0lEOgorCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICAgInNjc2ktcWxhJWQtdGd0LSVkLWRpLTAtcGlkPSIKKwkJCQkgICAgIiUwMnglMDJ4JTAyeFxcO1xuIiwKKwkJCQkgICAgKGludCloYS0+aW5zdGFuY2UsCisJCQkJICAgIHRndCwKKwkJCQkgICAgdHEtPmRfaWQuYi5kb21haW4sCisJCQkJICAgIHRxLT5kX2lkLmIuYXJlYSwKKwkJCQkgICAgdHEtPmRfaWQuYi5hbF9wYSk7CisJCQkJYnJlYWs7CisJCX0KKworI2lmIFZTQQorCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAic2NzaS1xbGElZC10YXJnZXQtJWQtdnNhPTAxO1xuIiwgKGludCloYS0+aW5zdGFuY2UsIHRndCk7CisjZW5kaWYKKwl9Cit9CisKKy8qCisgKiAgcWxhMngwMF9zdXNwZW5kX2x1bgorICoJU3VzcGVuZCBsdW4gYW5kIHN0YXJ0IHBvcnQgZG93biB0aW1lcgorICoKKyAqIElucHV0OgorICoJaGEgPSB2aXNhYmxlIGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqICBscSA9IGx1biBxdWV1ZQorICogIGNwID0gU2NzaSBjb21tYW5kIHBvaW50ZXIgCisgKiAgdGltZSA9IHRpbWUgaW4gc2Vjb25kcworICogIGNvdW50ID0gbnVtYmVyIG9mIHRpbWVzIHRvIGxldCB0aW1lIGV4cGlyZQorICogIGRlbGF5X2x1biA9IG5vbi16ZXJvLCBpZiBsdW4gc2hvdWxkIGJlIGRlbGF5ZWQgcmF0aGVyIHRoYW4gc3VzcGVuZGVkCisgKgorICogUmV0dXJuOgorICogICAgIFFMQV9TVUNDRVNTICAtLSBzdXNwZW5kZWQgbHVuIAorICogICAgIFFMQV9GVU5DVElPTl9GQUlMRUQgIC0tIERpZG4ndCBzdXNwZW5kIGx1bgorICoKKyAqIENvbnRleHQ6CisgKglJbnRlcnJ1cHQgY29udGV4dC4KKyAqLworaW50CitfX3FsYTJ4MDBfc3VzcGVuZF9sdW4oc2NzaV9xbGFfaG9zdF90ICpoYSwKKwkJb3NfbHVuX3QgKmxxLCBpbnQgdGltZSwgaW50IGNvdW50LCBpbnQgZGVsYXlfbHVuKQoreworCWludAlydmFsOworCXNyYl90ICpzcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdGVtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCisJLyogaWYgdGhlIGx1bl9xIGlzIGFscmVhZHkgc3VzcGVuZGVkIHRoZW4gZG9uJ3QgZG8gaXQgYWdhaW4gKi8KKwlpZiAobHEtPnFfc3RhdGUgPT0gTFVOX1NUQVRFX1JFQURZIHx8bHEtPnFfc3RhdGUgPT0gTFVOX1NUQVRFX1JVTikgeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZscS0+cV9sb2NrLCBmbGFncyk7CisJCWlmIChscS0+cV9zdGF0ZSA9PSBMVU5fU1RBVEVfUkVBRFkpIHsKKwkJCWxxLT5xX21heCA9IGNvdW50OworCQkJbHEtPnFfY291bnQgPSAwOworCQl9CisJCS8qIFNldCB0aGUgc3VzcGVuZCB0aW1lIHVzdWFsbHkgNiBzZWNzICovCisJCWF0b21pY19zZXQoJmxxLT5xX3RpbWVyLCB0aW1lKTsKKworCQkvKiBub3cgc3VzcGVuZCB0aGUgbHVuICovCisJCWxxLT5xX3N0YXRlID0gTFVOX1NUQVRFX1dBSVQ7CisKKwkJaWYgKGRlbGF5X2x1bikgeworCQkJc2V0X2JpdChMVU5fRVhFQ19ERUxBWUVELCAmbHEtPnFfZmxhZyk7CisJCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkKTogRGVsYXkgbHVuIGV4ZWN1dGlvbiBmb3IgJWQgc2VjcywgIgorCQkJICAgICJjb3VudD0lZCwgbWF4IGNvdW50PSVkLCBzdGF0ZT0lZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywKKwkJCSAgICB0aW1lLAorCQkJICAgIGxxLT5xX2NvdW50LCBscS0+cV9tYXgsIGxxLT5xX3N0YXRlKSk7CisJCX0gZWxzZSB7CisJCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCisJCQkgICAgInNjc2koJWxkKTogU3VzcGVuZCBsdW4gZm9yICVkIHNlY3MsIGNvdW50PSVkLCAiCisJCQkgICAgIm1heCBjb3VudD0lZCwgc3RhdGU9JWRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sCisJCQkgICAgdGltZSwKKwkJCSAgICBscS0+cV9jb3VudCwgbHEtPnFfbWF4LCBscS0+cV9zdGF0ZSkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxxLT5xX2xvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBSZW1vdmUgYWxsIHBlbmRpbmcgY29tbWFuZHMgZnJvbSByZXF1ZXN0IHF1ZXVlIGFuZCAgcHV0IHRoZW0KKwkJICogaW4gdGhlIHNjc2lfcmV0cnkgcXVldWUuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmhhLT5wZW5kaW5nX3F1ZXVlKSB7CisJCQlzcCA9IGxpc3RfZW50cnkobGlzdCwgc3JiX3QsIGxpc3QpOworCQkJaWYgKHNwLT5sdW5fcXVldWUgIT0gbHEpCisJCQkJY29udGludWU7CisKKwkJCV9fZGVsX2Zyb21fcGVuZGluZ19xdWV1ZShoYSwgc3ApOworCisJCQlpZiAoc3AtPmNtZC0+YWxsb3dlZCA8IGNvdW50KQorCQkJCXNwLT5jbWQtPmFsbG93ZWQgPSBjb3VudDsKKwkJCV9fYWRkX3RvX3Njc2lfcmV0cnlfcXVldWUoaGEsIHNwKTsKKworCQl9IC8qIGxpc3RfZm9yX2VhY2hfc2FmZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogcWxhMngwMF9tYXJrX2RldmljZV9sb3N0IFVwZGF0ZXMgZmNwb3J0IHN0YXRlIHdoZW4gZGV2aWNlIGdvZXMgb2ZmbGluZS4KKyAqCisgKiBJbnB1dDogaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuICBmY3BvcnQgPSBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybjogTm9uZS4KKyAqCisgKiBDb250ZXh0OgorICovCit2b2lkIHFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChzY3NpX3FsYV9ob3N0X3QgKmhhLCBmY19wb3J0X3QgKmZjcG9ydCwKKyAgICBpbnQgZG9fbG9naW4pCit7CisJLyogCisJICogV2UgbWF5IG5lZWQgdG8gcmV0cnkgdGhlIGxvZ2luLCBzbyBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZQorCSAqIHBvcnQgYnV0IGRvIHRoZSByZXRyaWVzLgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgIT0gRkNTX0RFVklDRV9ERUFEKQorCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0xPU1QpOworCisJaWYgKCFkb19sb2dpbikKKwkJcmV0dXJuOworCisJaWYgKGZjcG9ydC0+bG9naW5fcmV0cnkgPT0gMCkgeworCQlmY3BvcnQtPmxvZ2luX3JldHJ5ID0gaGEtPmxvZ2luX3JldHJ5X2NvdW50OworCQlzZXRfYml0KFJFTE9HSU5fTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFBvcnQgbG9naW4gcmV0cnk6ICIKKwkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCwgIgorCQkgICAgImlkID0gMHglMDR4IHJldHJ5IGNudD0lZFxuIiwKKwkJICAgIGhhLT5ob3N0X25vLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMF0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzJdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbM10sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs0XSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs3XSwKKwkJICAgIGZjcG9ydC0+bG9vcF9pZCwKKwkJICAgIGZjcG9ydC0+bG9naW5fcmV0cnkpKTsKKwl9Cit9CisKKy8qCisgKiBxbGEyeDAwX21hcmtfYWxsX2RldmljZXNfbG9zdAorICoJVXBkYXRlcyBmY3BvcnQgc3RhdGUgd2hlbiBkZXZpY2UgZ29lcyBvZmZsaW5lLgorICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKglmY3BvcnQgPSBwb3J0IHN0cnVjdHVyZSBwb2ludGVyLgorICoKKyAqIFJldHVybjoKKyAqCU5vbmUuCisgKgorICogQ29udGV4dDoKKyAqLwordm9pZAorcWxhMngwMF9tYXJrX2FsbF9kZXZpY2VzX2xvc3Qoc2NzaV9xbGFfaG9zdF90ICpoYSkgCit7CisJZmNfcG9ydF90ICpmY3BvcnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfVEFSR0VUKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTm8gcG9pbnQgaW4gbWFya2luZyB0aGUgZGV2aWNlIGFzIGxvc3QsIGlmIHRoZSBkZXZpY2UgaXMKKwkJICogYWxyZWFkeSBERUFELgorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQpCisJCQljb250aW51ZTsKKworCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0xPU1QpOworCX0KK30KKworLyoKKyogcWxhMngwMF9tZW1fYWxsb2MKKyogICAgICBBbGxvY2F0ZXMgYWRhcHRlciBtZW1vcnkuCisqCisqIFJldHVybnM6CisqICAgICAgMCAgPSBzdWNjZXNzLgorKiAgICAgIDEgID0gZmFpbHVyZS4KKyovCitzdGF0aWMgdWludDhfdAorcWxhMngwMF9tZW1fYWxsb2Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwljaGFyCW5hbWVbMTZdOworCXVpbnQ4X3QgICBzdGF0dXMgPSAxOworCWludAlyZXRyeT0gMTA7CisKKwlkbyB7CisJCS8qCisJCSAqIFRoaXMgd2lsbCBsb29wIG9ubHkgb25jZSBpZiBldmVyeXRoaW5nIGdvZXMgd2VsbCwgZWxzZSBzb21lCisJCSAqIG51bWJlciBvZiByZXRyaWVzIHdpbGwgYmUgcGVyZm9ybWVkIHRvIGdldCBhcm91bmQgYSBrZXJuZWwKKwkJICogYnVnIHdoZXJlIGF2YWlsYWJsZSBtZW0gaXMgbm90IGFsbG9jYXRlZCB1bnRpbCBhZnRlciBhCisJCSAqIGxpdHRsZSBkZWxheSBhbmQgYSByZXRyeS4KKwkJICovCisJCWhhLT5yZXF1ZXN0X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCSAgICAoaGEtPnJlcXVlc3RfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLAorCQkgICAgJmhhLT5yZXF1ZXN0X2RtYSwgR0ZQX0tFUk5FTCk7CisJCWlmIChoYS0+cmVxdWVzdF9yaW5nID09IE5VTEwpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gcmVxdWVzdF9yaW5nXG4iKTsKKworCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQltc2xlZXAoMTAwKTsKKworCQkJY29udGludWU7CisJCX0KKworCQloYS0+cmVzcG9uc2VfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIChoYS0+cmVzcG9uc2VfcV9sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKKwkJICAgICZoYS0+cmVzcG9uc2VfZG1hLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGhhLT5yZXNwb25zZV9yaW5nID09IE5VTEwpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gcmVzcG9uc2VfcmluZ1xuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaGEtPmdpZF9saXN0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBHSURfTElTVF9TSVpFLAorCQkgICAgJmhhLT5naWRfbGlzdF9kbWEsIEdGUF9LRVJORUwpOworCQlpZiAoaGEtPmdpZF9saXN0ID09IE5VTEwpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gZ2lkX2xpc3RcbiIpOworCisJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWhhLT5ybGNfcnNwID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgc2l6ZW9mKHJwdF9sdW5fY21kX3JzcF90KSwgJmhhLT5ybGNfcnNwX2RtYSwgR0ZQX0tFUk5FTCk7CisJCWlmIChoYS0+cmxjX3JzcCA9PSBOVUxMKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHJsYyIpOworCisJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInFsYTJ4eHhfJWxkIiwgaGEtPmhvc3Rfbm8pOworCQloYS0+c19kbWFfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZShuYW1lLCAmaGEtPnBkZXYtPmRldiwKKwkJICAgIERNQV9QT09MX1NJWkUsIDgsIDApOworCQlpZiAoaGEtPnNfZG1hX3Bvb2wgPT0gTlVMTCkgeworCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBzX2RtYV9wb29sXG4iKTsKKworCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQltc2xlZXAoMTAwKTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKiBnZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBpbml0IGNvbnRyb2wgYmxvY2sgKi8KKwkJaGEtPmluaXRfY2IgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJICAgICZoYS0+aW5pdF9jYl9kbWEpOworCQlpZiAoaGEtPmluaXRfY2IgPT0gTlVMTCkgeworCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBpbml0X2NiXG4iKTsKKworCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQltc2xlZXAoMTAwKTsKKworCQkJY29udGludWU7CisJCX0KKwkJbWVtc2V0KGhhLT5pbml0X2NiLCAwLCBzaXplb2YoaW5pdF9jYl90KSk7CisKKwkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgR2V0IFBvcnQgRGF0YWJhc2UgY21kICovCisJCWhhLT5pb2Rlc2NfcGQgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJICAgICZoYS0+aW9kZXNjX3BkX2RtYSk7CisJCWlmIChoYS0+aW9kZXNjX3BkID09IE5VTEwpIHsKKwkJCS8qIGVycm9yICovCisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIGlvZGVzY19wZFxuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbXNldChoYS0+aW9kZXNjX3BkLCAwLCBQT1JUX0RBVEFCQVNFX1NJWkUpOworCisJCS8qIEFsbG9jYXRlIGlvY3RsIHJlbGF0ZWQgbWVtb3J5LiAqLworCQlpZiAocWxhMngwMF9hbGxvY19pb2N0bF9tZW0oaGEpKSB7CisJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIGlvY3RsX21lbVxuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHFsYTJ4MDBfYWxsb2NhdGVfc3BfcG9vbChoYSkpIHsKKwkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gIgorCQkJICAgICJxbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2woKVxuIik7CisKKwkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJbXNsZWVwKDEwMCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBTTlMgY29tbWFuZHMgKi8KKwkJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCQkvKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBTTlMgY29tbWFuZHMgKi8KKwkJCWhhLT5zbnNfY21kID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpLCAmaGEtPnNuc19jbWRfZG1hLAorCQkJICAgIEdGUF9LRVJORUwpOworCQkJaWYgKGhhLT5zbnNfY21kID09IE5VTEwpIHsKKwkJCQkvKiBlcnJvciAqLworCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHNuc19jbWRcbiIpOworCisJCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQkJbXNsZWVwKDEwMCk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1lbXNldChoYS0+c25zX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCQl9IGVsc2UgeworCQkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgTVMgSU9DQiAqLworCQkJaGEtPm1zX2lvY2IgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJCSAgICAmaGEtPm1zX2lvY2JfZG1hKTsKKwkJCWlmIChoYS0+bXNfaW9jYiA9PSBOVUxMKSB7CisJCQkJLyogZXJyb3IgKi8KKwkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBtc19pb2NiXG4iKTsKKworCQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOworCQkJCW1zbGVlcCgxMDApOworCisJCQkJY29udGludWU7CisJCQl9CisJCQltZW1zZXQoaGEtPm1zX2lvY2IsIDAsIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKKworCQkJLyoKKwkJCSAqIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIENUIFNOUworCQkJICogY29tbWFuZHMKKwkJCSAqLworCQkJaGEtPmN0X3NucyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3QpLCAmaGEtPmN0X3Nuc19kbWEsCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoaGEtPmN0X3NucyA9PSBOVUxMKSB7CisJCQkJLyogZXJyb3IgKi8KKwkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBjdF9zbnNcbiIpOworCisJCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQkJbXNsZWVwKDEwMCk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1lbXNldChoYS0+Y3Rfc25zLCAwLCBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3QpKTsKKwkJfQorCisJCS8qIERvbmUgYWxsIGFsbG9jYXRpb25zIHdpdGhvdXQgYW55IGVycm9yLiAqLworCQlzdGF0dXMgPSAwOworCisJfSB3aGlsZSAocmV0cnktLSAmJiBzdGF0dXMgIT0gMCk7CisKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlcygpOiAqKioqIEZBSUxFRCAqKioqXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuKHN0YXR1cyk7Cit9CisKKy8qCisqIHFsYTJ4MDBfbWVtX2ZyZWUKKyogICAgICBGcmVlcyBhbGwgYWRhcHRlciBhbGxvY2F0ZWQgbWVtb3J5LgorKgorKiBJbnB1dDoKKyogICAgICBoYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyovCitzdGF0aWMgdm9pZAorcWxhMngwMF9tZW1fZnJlZShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVpbnQzMl90CXQ7CisJc3RydWN0IGxpc3RfaGVhZAkqZmNwbCwgKmZjcHRlbXA7CisJZmNfcG9ydF90CSpmY3BvcnQ7CisJc3RydWN0IGxpc3RfaGVhZAkqZmNsbCwgKmZjbHRlbXA7CisJZmNfbHVuX3QJKmZjbHVuOworCXVuc2lnbmVkIGxvbmcJd3RpbWU7LyogbWF4IHdhaXQgdGltZSBpZiBtYnggY21kIGlzIGJ1c3kuICovCisKKwlpZiAoaGEgPT0gTlVMTCkgeworCQkvKiBlcnJvciAqLworCQlERUJVRzIocHJpbnRrKCIlcygpOiBFUlJPUiBpbnZhbGlkIGhhIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCisJLyogRnJlZSB0aGUgdGFyZ2V0IHF1ZXVlcyAqLworCWZvciAodCA9IDA7IHQgPCBNQVhfVEFSR0VUUzsgdCsrKSB7CisJCXFsYTJ4MDBfdGd0X2ZyZWUoaGEsIHQpOworCX0KKworCS8qIE1ha2Ugc3VyZSBhbGwgb3RoZXIgdGhyZWFkcyBhcmUgc3RvcHBlZC4gKi8KKwl3dGltZSA9IDYwICogSFo7CisJd2hpbGUgKGhhLT5kcGNfd2FpdCAmJiB3dGltZSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl3dGltZSA9IHNjaGVkdWxlX3RpbWVvdXQod3RpbWUpOworCX0KKworCS8qIGZyZWUgaW9jdGwgbWVtb3J5ICovCisJcWxhMngwMF9mcmVlX2lvY3RsX21lbShoYSk7CisKKwkvKiBmcmVlIHNwIHBvb2wgKi8KKwlxbGEyeDAwX2ZyZWVfc3BfcG9vbChoYSk7CisKKwlpZiAoaGEtPnNuc19jbWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSwKKwkJICAgIGhhLT5zbnNfY21kLCBoYS0+c25zX2NtZF9kbWEpOworCisJaWYgKGhhLT5jdF9zbnMpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3QpLAorCQkgICAgaGEtPmN0X3NucywgaGEtPmN0X3Nuc19kbWEpOworCisJaWYgKGhhLT5tc19pb2NiKQorCQlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hKTsKKworCWlmIChoYS0+aW9kZXNjX3BkKQorCQlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBoYS0+aW9kZXNjX3BkLCBoYS0+aW9kZXNjX3BkX2RtYSk7CisKKwlpZiAoaGEtPmluaXRfY2IpCisJCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIGhhLT5pbml0X2NiLCBoYS0+aW5pdF9jYl9kbWEpOworCisJaWYgKGhhLT5zX2RtYV9wb29sKQorCQlkbWFfcG9vbF9kZXN0cm95KGhhLT5zX2RtYV9wb29sKTsKKworCWlmIChoYS0+cmxjX3JzcCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCSAgICBzaXplb2YocnB0X2x1bl9jbWRfcnNwX3QpLCBoYS0+cmxjX3JzcCwKKwkJICAgIGhhLT5ybGNfcnNwX2RtYSk7CisKKwlpZiAoaGEtPmdpZF9saXN0KQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgR0lEX0xJU1RfU0laRSwgaGEtPmdpZF9saXN0LAorCQkgICAgaGEtPmdpZF9saXN0X2RtYSk7CisKKwlpZiAoaGEtPnJlc3BvbnNlX3JpbmcpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgKGhhLT5yZXNwb25zZV9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlc3BvbnNlX3QpLAorCQkgICAgaGEtPnJlc3BvbnNlX3JpbmcsIGhhLT5yZXNwb25zZV9kbWEpOworCisJaWYgKGhhLT5yZXF1ZXN0X3JpbmcpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkgICAgKGhhLT5yZXF1ZXN0X3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSwKKwkJICAgIGhhLT5yZXF1ZXN0X3JpbmcsIGhhLT5yZXF1ZXN0X2RtYSk7CisKKwloYS0+c25zX2NtZCA9IE5VTEw7CisJaGEtPnNuc19jbWRfZG1hID0gMDsKKwloYS0+Y3Rfc25zID0gTlVMTDsKKwloYS0+Y3Rfc25zX2RtYSA9IDA7CisJaGEtPm1zX2lvY2IgPSBOVUxMOworCWhhLT5tc19pb2NiX2RtYSA9IDA7CisJaGEtPmlvZGVzY19wZCA9IE5VTEw7CisJaGEtPmlvZGVzY19wZF9kbWEgPSAwOworCWhhLT5pbml0X2NiID0gTlVMTDsKKwloYS0+aW5pdF9jYl9kbWEgPSAwOworCisJaGEtPnNfZG1hX3Bvb2wgPSBOVUxMOworCisJaGEtPnJsY19yc3AgPSBOVUxMOworCWhhLT5ybGNfcnNwX2RtYSA9IDA7CisJaGEtPmdpZF9saXN0ID0gTlVMTDsKKwloYS0+Z2lkX2xpc3RfZG1hID0gMDsKKworCWhhLT5yZXNwb25zZV9yaW5nID0gTlVMTDsKKwloYS0+cmVzcG9uc2VfZG1hID0gMDsKKwloYS0+cmVxdWVzdF9yaW5nID0gTlVMTDsKKwloYS0+cmVxdWVzdF9kbWEgPSAwOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGZjcGwsIGZjcHRlbXAsICZoYS0+ZmNwb3J0cykgeworCQlmY3BvcnQgPSBsaXN0X2VudHJ5KGZjcGwsIGZjX3BvcnRfdCwgbGlzdCk7CisKKwkJLyogZmMgbHVucyAqLworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZmNsbCwgZmNsdGVtcCwgJmZjcG9ydC0+ZmNsdW5zKSB7CisJCQlmY2x1biA9IGxpc3RfZW50cnkoZmNsbCwgZmNfbHVuX3QsIGxpc3QpOworCisJCQlsaXN0X2RlbF9pbml0KCZmY2x1bi0+bGlzdCk7CisJCQlrZnJlZShmY2x1bik7CisJCX0KKworCQkvKiBmYyBwb3J0cyAqLworCQlsaXN0X2RlbF9pbml0KCZmY3BvcnQtPmxpc3QpOworCQlrZnJlZShmY3BvcnQpOworCX0KKwlJTklUX0xJU1RfSEVBRCgmaGEtPmZjcG9ydHMpOworCisJaWYgKGhhLT5md19kdW1wKQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWhhLT5md19kdW1wLCBoYS0+ZndfZHVtcF9vcmRlcik7CisKKwlpZiAoaGEtPmZ3X2R1bXBfYnVmZmVyKQorCQl2ZnJlZShoYS0+ZndfZHVtcF9idWZmZXIpOworCisJaGEtPmZ3X2R1bXAgPSBOVUxMOworCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOworCWhhLT5md19kdW1wX2J1ZmZlciA9IE5VTEw7Cit9CisKKy8qCisgKiBxbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2wKKyAqIAkgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdG8gYWxsb2NhdGUKKyAqICAJIG1lbW9yeSBmb3IgbG9jYWwgc3JiX3QuCisgKgorICogSW5wdXQ6CisgKgkgaGEgICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBDb250ZXh0OgorICogICAgICBLZXJuZWwgY29udGV4dC4KKyAqIAorICogTm90ZTogU2V0cyB0aGUgcmVmX2NvdW50IGZvciBub24gTnVsbCBzcCB0byBvbmUuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfYWxsb2NhdGVfc3BfcG9vbChzY3NpX3FsYV9ob3N0X3QgKmhhKSAKK3sKKwlpbnQgICAgICBydmFsOworCisJcnZhbCA9IFFMQV9TVUNDRVNTOworCWhhLT5zcmJfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlKFNSQl9NSU5fUkVRLCBtZW1wb29sX2FsbG9jX3NsYWIsCisJICAgIG1lbXBvb2xfZnJlZV9zbGFiLCBzcmJfY2FjaGVwKTsKKwlpZiAoaGEtPnNyYl9tZW1wb29sID09IE5VTEwpIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5hYmxlIHRvIGFsbG9jYXRlIFNSQiBtZW1wb29sLlxuIik7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0KKwlyZXR1cm4gKHJ2YWwpOworfQorCisvKgorICogIFRoaXMgcm91dGluZSBmcmVlcyBhbGwgYWRhcHRlciBhbGxvY2F0ZWQgbWVtb3J5LgorICogIAorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9mcmVlX3NwX3Bvb2woIHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWlmIChoYS0+c3JiX21lbXBvb2wpIHsKKwkJbWVtcG9vbF9kZXN0cm95KGhhLT5zcmJfbWVtcG9vbCk7CisJCWhhLT5zcmJfbWVtcG9vbCA9IE5VTEw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMngwMF9kb19kcGMKKyogICBUaGlzIGtlcm5lbCB0aHJlYWQgaXMgYSB0YXNrIHRoYXQgaXMgc2NoZWR1bGUgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyCisqICAgdG8gcGVyZm9ybSB0aGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIGZvciBpbnRlcnJ1cHRzLgorKgorKiBOb3RlczoKKyogVGhpcyB0YXNrIGFsd2F5cyBydW4gaW4gdGhlIGNvbnRleHQgb2YgYSBrZXJuZWwgdGhyZWFkLiAgSXQKKyogaXMga2ljay1vZmYgYnkgdGhlIGRyaXZlcidzIGRldGVjdCBjb2RlIGFuZCBzdGFydHMgdXAKKyogdXAgb25lIHBlciBhZGFwdGVyLiBJdCBpbW1lZGlhdGVseSBnb2VzIHRvIHNsZWVwIGFuZCB3YWl0cyBmb3IKKyogc29tZSBmaWJyZSBldmVudC4gIFdoZW4gZWl0aGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBvcgorKiB0aGUgdGltZXIgcm91dGluZSBkZXRlY3RzIGEgZXZlbnQgaXQgd2lsbCBvbmUgb2YgdGhlIHRhc2sKKyogYml0cyB0aGVuIHdha2UgdXMgdXAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfZG9fZHBjKHZvaWQgKmRhdGEpCit7CisJREVDTEFSRV9NVVRFWF9MT0NLRUQoc2VtKTsKKwlzY3NpX3FsYV9ob3N0X3QgKmhhOworCWZjX3BvcnRfdAkqZmNwb3J0OworCW9zX2x1bl90ICAgICAgICAqcTsKKwlzcmJfdCAgICAgICAgICAgKnNwOworCXVpbnQ4X3QJCXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdGVtcGxpc3Q7CisJaW50CWRlYWRfY250LCBvbmxpbmVfY250OworCWludAlyZXRyeV9jbWRzID0gMDsKKwl1aW50MTZfdAluZXh0X2xvb3BpZDsKKwlpbnQgdDsKKwlvc190Z3RfdCAqdHE7CisKKwloYSA9IChzY3NpX3FsYV9ob3N0X3QgKilkYXRhOworCisJbG9ja19rZXJuZWwoKTsKKworCWRhZW1vbml6ZSgiJXNfZHBjIiwgaGEtPmhvc3Rfc3RyKTsKKwlhbGxvd19zaWduYWwoU0lHSFVQKTsKKworCWhhLT5kcGNfd2FpdCA9ICZzZW07CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwljb21wbGV0ZSgmaGEtPmRwY19pbml0ZWQpOworCisJd2hpbGUgKDEpIHsKKwkJREVCVUczKHByaW50aygicWxhMngwMDogRFBDIGhhbmRsZXIgc2xlZXBpbmdcbiIpKTsKKworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZW0pKQorCQkJYnJlYWs7CisKKwkJaWYgKGhhLT5kcGNfc2hvdWxkX2RpZSkKKwkJCWJyZWFrOworCisJCURFQlVHMyhwcmludGsoInFsYTJ4MDA6IERQQyBoYW5kbGVyIHdha2luZyB1cFxuIikpOworCisJCS8qIEluaXRpYWxpemF0aW9uIG5vdCB5ZXQgZmluaXNoZWQuIERvbid0IGRvIGFueXRoaW5nIHlldC4gKi8KKwkJaWYgKCFoYS0+ZmxhZ3MuaW5pdF9kb25lIHx8IGhhLT5kcGNfYWN0aXZlKQorCQkJY29udGludWU7CisKKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBEUEMgaGFuZGxlclxuIiwgaGEtPmhvc3Rfbm8pKTsKKworCQloYS0+ZHBjX2FjdGl2ZSA9IDE7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZG9uZV9xdWV1ZSkpCisJCQlxbGEyeDAwX2RvbmUoaGEpOworCisJCS8qIFByb2Nlc3MgY29tbWFuZHMgaW4gcmV0cnkgcXVldWUgKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQT1JUX1JFU1RBUlRfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBEUEMgY2hlY2tpbmcgcmV0cnlfcS4gIgorCQkJICAgICJ0b3RhbD0lZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgaGEtPnJldHJ5X3FfY250KSk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJCQlkZWFkX2NudCA9IG9ubGluZV9jbnQgPSAwOworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXBsaXN0LCAmaGEtPnJldHJ5X3F1ZXVlKSB7CisJCQkJc3AgPSBsaXN0X2VudHJ5KGxpc3QsIHNyYl90LCBsaXN0KTsKKwkJCQlxID0gc3AtPmx1bl9xdWV1ZTsKKwkJCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IHBpZD0lbGQgc3A9JXAsICIKKwkJCQkgICAgInNwZmxhZ3M9MHgleCwgcV9mbGFnPSAweCVseFxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIHNwLT5jbWQtPnNlcmlhbF9udW1iZXIsIHNwLAorCQkJCSAgICBzcC0+ZmxhZ3MsIHEtPnFfZmxhZykpOworCisJCQkJaWYgKHEgPT0gTlVMTCkKKwkJCQkJY29udGludWU7CisJCQkJZmNwb3J0ID0gcS0+ZmNsdW4tPmZjcG9ydDsKKworCQkJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0KKwkJCQkgICAgRkNTX0RFVklDRV9ERUFEIHx8CisJCQkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpIHsKKworCQkJCQlfX2RlbF9mcm9tX3JldHJ5X3F1ZXVlKGhhLCBzcCk7CisJCQkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+aGEtPmxvb3Bfc3RhdGUpID09CisJCQkJCSAgICBMT09QX0RPV04pIAorCQkJCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfTE9PUDsKKwkJCQkJZWxzZQorCQkJCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfUE9SVDsKKwkJCQkJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9CisJCQkJCSAgICAodW5zaWduZWQgY2hhciAqKSBOVUxMOworCQkJCQlfX2FkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJCQkJCWRlYWRfY250Kys7CisJCQkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgIT0KKwkJCQkgICAgRkNTX0RFVklDRV9MT1NUKSB7CisKKwkJCQkJX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCQkJCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPQorCQkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgTlVMTDsKKwkJCQkJX19hZGRfdG9fZG9uZV9xdWV1ZShoYSwgc3ApOworCQkJCQlvbmxpbmVfY250Kys7CisJCQkJfQorCQkJfSAvKiBsaXN0X2Zvcl9lYWNoX3NhZmUoKSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZG9uZSBwcm9jZXNzaW5nIHJldHJ5IHF1ZXVlICIKKwkJCSAgICAiLSBkZWFkPSVkLCBvbmxpbmU9JWRcbiAiLAorCQkJICAgIGhhLT5ob3N0X25vLCBkZWFkX2NudCwgb25saW5lX2NudCkpOworCQl9CisKKwkJLyogUHJvY2VzcyBjb21tYW5kcyBpbiBzY3NpIHJldHJ5IHF1ZXVlICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0NTSV9SRVNUQVJUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisJCQkvKgorCQkJICogQW55IHJlcXVlc3RzIHdlIHdhbnQgdG8gZGVsYXkgZm9yIHNvbWUgcGVyaW9kIGlzIHB1dAorCQkJICogaW4gdGhlIHNjc2kgcmV0cnkgcXVldWUgd2l0aCBhIGRlbGF5IGFkZGVkLiBUaGUKKwkJCSAqIHRpbWVyIHdpbGwgc2NoZWR1bGUgYSAic2NzaV9yZXN0YXJ0X25lZWRlZCIgZXZlcnkgCisJCQkgKiBzZWNvbmQgYXMgbG9uZyBhcyB0aGVyZSBhcmUgcmVxdWVzdHMgaW4gdGhlIHNjc2kKKwkJCSAqIHF1ZXVlLiAKKwkJCSAqLworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IERQQyBjaGVja2luZyBzY3NpICIKKwkJCSAgICAicmV0cnlfcS50b3RhbD0lZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgaGEtPnNjc2lfcmV0cnlfcV9jbnQpKTsKKworCQkJb25saW5lX2NudCA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXBsaXN0LAorCQkJICAgICZoYS0+c2NzaV9yZXRyeV9xdWV1ZSkgeworCisJCQkJc3AgPSBsaXN0X2VudHJ5KGxpc3QsIHNyYl90LCBsaXN0KTsKKwkJCQlxID0gc3AtPmx1bl9xdWV1ZTsKKwkJCQl0cSA9IHNwLT50Z3RfcXVldWU7CisKKwkJCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IHNjc2lfcmV0cnlfcTogIgorCQkJCSAgICAicGlkPSVsZCBzcD0lcCwgc3BmbGFncz0weCV4LCAiCisJCQkJICAgICJxX2ZsYWc9IDB4JWx4LHFfc3RhdGU9JWRcbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLCBzcC0+Y21kLT5zZXJpYWxfbnVtYmVyLAorCQkJCSAgICBzcCwgc3AtPmZsYWdzLCBxLT5xX2ZsYWcsIHEtPnFfc3RhdGUpKTsKKworCQkJCS8qIFdhcyB0aGlzIGx1biBzdXNwZW5kZWQgKi8KKwkJCQlpZiAocS0+cV9zdGF0ZSAhPSBMVU5fU1RBVEVfV0FJVCkgeworCQkJCQlvbmxpbmVfY250Kys7CisJCQkJCV9fZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZShoYSwgc3ApOworCisJCQkJCWlmICh0ZXN0X2JpdChUUUZfUkVUUllfQ01EUywKKwkJCQkJICAgICZ0cS0+ZmxhZ3MpKSB7CisJCQkJCQlxbGEyeDAwX2V4dGVuZF90aW1lb3V0KHNwLT5jbWQsCisJCQkJCQkgICAgKHNwLT5jbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLyBIWikgLSBRTEFfQ01EX1RJTUVSX0RFTFRBKTsKKwkJCQkJCV9fYWRkX3RvX3BlbmRpbmdfcXVldWUoaGEsIHNwKTsKKwkJCQkJCXJldHJ5X2NtZHMrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQlfX2FkZF90b19yZXRyeV9xdWV1ZShoYSwgc3ApOworCQkJCX0KKworCQkJCS8qIFdhcyB0aGlzIGNvbW1hbmQgc3VzcGVuZGVkIGZvciBOIHNlY3MgKi8KKwkJCQlpZiAoc3AtPmRlbGF5ICE9IDApIHsKKwkJCQkJc3AtPmRlbGF5LS07CisJCQkJCWlmIChzcC0+ZGVsYXkgPT0gMCkgeworCQkJCQkJb25saW5lX2NudCsrOworCQkJCQkJX19kZWxfZnJvbV9zY3NpX3JldHJ5X3F1ZXVlKAorCQkJCQkJICAgIGhhLCBzcCk7CisJCQkJCQlfX2FkZF90b19yZXRyeV9xdWV1ZShoYSxzcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+bGlzdF9sb2NrLCBmbGFncyk7CisKKwkJCS8qIENsZWFyIGFsbCBUYXJnZXQgVW5zdXNwZW5kZWQgYml0cyAqLworCQkJZm9yICh0ID0gMDsgdCA8IGhhLT5tYXhfdGFyZ2V0czsgdCsrKSB7CisJCQkJaWYgKCh0cSA9IGhhLT5vdGd0W3RdKSA9PSBOVUxMKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmICh0ZXN0X2JpdChUUUZfUkVUUllfQ01EUywgJnRxLT5mbGFncykpCisJCQkJCWNsZWFyX2JpdChUUUZfUkVUUllfQ01EUywgJnRxLT5mbGFncyk7CisJCQl9CisJCQlpZiAocmV0cnlfY21kcykKKwkJCQlxbGEyeDAwX25leHQoaGEpOworCisJCQlERUJVRyhpZiAob25saW5lX2NudCA+IDApKQorCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRwYygpIGZvdW5kIHNjc2kgcmVxcyB0byAiCisJCQkgICAgInJlc3RhcnQ9ICVkXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCBvbmxpbmVfY250KSk7CisJCX0KKworCQlpZiAoaGEtPmZsYWdzLm1ib3hfYnVzeSkgeworCQkJaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZG9uZV9xdWV1ZSkpCisJCQkJcWxhMngwMF9kb25lKGhhKTsKKworCQkJaGEtPmRwY19hY3RpdmUgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZHBjOiBzY2hlZCAiCisJCQkgICAgInFsYTJ4MDBfYWJvcnRfaXNwIGhhID0gJXBcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIGhhKSk7CisJCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsCisJCQkgICAgJmhhLT5kcGNfZmxhZ3MpKSkgeworCisJCQkJaWYgKHFsYTJ4MDBfYWJvcnRfaXNwKGhhKSkgeworCQkJCQkvKiBmYWlsZWQuIHJldHJ5IGxhdGVyICovCisJCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwKKwkJCQkJICAgICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQl9CisJCQkJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCX0KKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBkcGM6IHFsYTJ4MDBfYWJvcnRfaXNwIGVuZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncykgJiYKKwkJICAgICghKHRlc3RfYW5kX3NldF9iaXQoUkVTRVRfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpKSkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9yZXNldF9tYXJrZXIoKVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCisJCQlxbGEyeDAwX3JzdF9hZW4oaGEpOworCQkJY2xlYXJfYml0KFJFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCQl9CisKKwkJLyogUmV0cnkgZWFjaCBkZXZpY2UgdXAgdG8gbG9naW4gcmV0cnkgY291bnQgKi8KKwkJaWYgKCh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVMT0dJTl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgJiYKKwkJICAgICF0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSAmJgorCQkgICAgYXRvbWljX3JlYWQoJmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKKworCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfcG9ydF9sb2dpbigpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJCW5leHRfbG9vcGlkID0gMDsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJCQlpZiAoZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX1RBUkdFVCkKKwkJCQkJY29udGludWU7CisKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBwb3J0IGlzIG5vdCBPTkxJTkUgdGhlbiB0cnkgdG8gbG9naW4KKwkJCQkgKiB0byBpdCBpZiB3ZSBoYXZlbid0IHJ1biBvdXQgb2YgcmV0cmllcy4KKwkJCQkgKi8KKwkJCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9IEZDU19PTkxJTkUgJiYKKwkJCQkgICAgZmNwb3J0LT5sb2dpbl9yZXRyeSkgeworCisJCQkJCWZjcG9ydC0+bG9naW5fcmV0cnktLTsKKwkJCQkJaWYgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgeworCQkJCQkJaWYgKGZjcG9ydC0+ZmxhZ3MgJgorCQkJCQkJICAgIEZDRl9UQVBFX1BSRVNFTlQpCisJCQkJCQkJcWxhMngwMF9mYWJyaWNfbG9nb3V0KAorCQkJCQkJCSAgICBoYSwKKwkJCQkJCQkgICAgZmNwb3J0LT5sb29wX2lkKTsKKwkJCQkJCXN0YXR1cyA9IHFsYTJ4MDBfZmFicmljX2xvZ2luKAorCQkJCQkJICAgIGhhLCBmY3BvcnQsICZuZXh0X2xvb3BpZCk7CisJCQkJCX0gZWxzZQorCQkJCQkJc3RhdHVzID0KKwkJCQkJCSAgICBxbGEyeDAwX2xvY2FsX2RldmljZV9sb2dpbigKKwkJCQkJCQloYSwgZmNwb3J0LT5sb29wX2lkKTsKKworCQkJCQlpZiAoc3RhdHVzID09IFFMQV9TVUNDRVNTKSB7CisJCQkJCQlmY3BvcnQtPm9sZF9sb29wX2lkID0gZmNwb3J0LT5sb29wX2lkOworCisJCQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcG9ydCBsb2dpbiBPSzogbG9nZ2VkIGluIElEIDB4JXhcbiIsCisJCQkJCQkgICAgaGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCkpOworCQkJCQkJCisJCQkJCQlmY3BvcnQtPnBvcnRfbG9naW5fcmV0cnlfY291bnQgPQorCQkJCQkJICAgIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKiBQT1JUX1JFVFJZX1RJTUU7CisJCQkJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfT05MSU5FKTsKKwkJCQkJCWF0b21pY19zZXQoJmZjcG9ydC0+cG9ydF9kb3duX3RpbWVyLAorCQkJCQkJICAgIGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgKiBQT1JUX1JFVFJZX1RJTUUpOworCisJCQkJCQlmY3BvcnQtPmxvZ2luX3JldHJ5ID0gMDsKKwkJCQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gMSkgeworCQkJCQkJc2V0X2JpdChSRUxPR0lOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCQkJLyogcmV0cnkgdGhlIGxvZ2luIGFnYWluICovCisJCQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUmV0cnlpbmcgJWQgbG9naW4gYWdhaW4gbG9vcF9pZCAweCV4XG4iLAorCQkJCQkJICAgIGhhLT5ob3N0X25vLAorCQkJCQkJICAgIGZjcG9ydC0+bG9naW5fcmV0cnksIGZjcG9ydC0+bG9vcF9pZCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZmNwb3J0LT5sb2dpbl9yZXRyeSA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4gLSBlbmRcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwkJfQorCisJCWlmICgodGVzdF9iaXQoTE9HSU5fUkVUUllfTkVFREVELCAmaGEtPmRwY19mbGFncykpICYmCisJCSAgICBhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgeworCisJCQljbGVhcl9iaXQoTE9HSU5fUkVUUllfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9sb2dpbl9yZXRyeSgpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkJCisJCQlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9sb2dpbl9yZXRyeSAtIGVuZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9sb29wX3Jlc3luYygpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJCWlmICghKHRlc3RfYW5kX3NldF9iaXQoTE9PUF9SRVNZTkNfQUNUSVZFLAorCQkJICAgICZoYS0+ZHBjX2ZsYWdzKSkpIHsKKworCQkJCXFsYTJ4MDBfbG9vcF9yZXN5bmMoaGEpOworCisJCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJfQorCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9sb29wX3Jlc3luYyAtIGVuZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQl9CisKKworCQlpZiAodGVzdF9iaXQoUkVTVEFSVF9RVUVVRVNfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3Jlc3RhcnRfcXVldWVzKClcbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkJcWxhMngwMF9yZXN0YXJ0X3F1ZXVlcyhoYSwgMCk7CisKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3Jlc3RhcnRfcXVldWVzIC0gZW5kXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCX0KKworCQlpZiAodGVzdF9iaXQoQUJPUlRfUVVFVUVTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX2Fib3J0X3F1ZXVlcygpXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkJCisJCQlxbGEyeDAwX2Fib3J0X3F1ZXVlcyhoYSwgMCk7CisKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX2Fib3J0X3F1ZXVlcyAtIGVuZFxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQl9CisKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGQ1BPUlRfUkVTQ0FOX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CisKKwkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBSZXNjYW4gZmxhZ2dlZCBmY3BvcnRzLi4uXG4iLAorCQkJICAgIGhhLT5ob3N0X25vKSk7CisKKwkJCXFsYTJ4MDBfcmVzY2FuX2ZjcG9ydHMoaGEpOworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUmVzY2FuIGZsYWdnZWQgZmNwb3J0cy4uLiIKKwkJCSAgICAiZW5kLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCQl9CisKKworCQlpZiAoIWhhLT5pbnRlcnJ1cHRzX29uKQorCQkJcWxhMngwMF9lbmFibGVfaW50cnMoaGEpOworCisJCWlmICghbGlzdF9lbXB0eSgmaGEtPmRvbmVfcXVldWUpKQorCQkJcWxhMngwMF9kb25lKGhhKTsKKworCQloYS0+ZHBjX2FjdGl2ZSA9IDA7CisJfSAvKiBFbmQgb2Ygd2hpbGUoMSkgKi8KKworCURFQlVHKHByaW50aygic2NzaSglbGQpOiBEUEMgaGFuZGxlciBleGl0aW5nXG4iLCBoYS0+aG9zdF9ubykpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBub2JvZHkgdHJpZXMgdG8gd2FrZSB1cyB1cCBhZ2Fpbi4KKwkgKi8KKwloYS0+ZHBjX3dhaXQgPSBOVUxMOworCWhhLT5kcGNfYWN0aXZlID0gMDsKKworCWNvbXBsZXRlX2FuZF9leGl0KCZoYS0+ZHBjX2V4aXRlZCwgMCk7Cit9CisKKy8qCisgKiAgcWxhMngwMF9hYm9ydF9xdWV1ZXMKKyAqCUFib3J0IGFsbCBjb21tYW5kcyBvbiBxdWV1ZXMgb24gZGV2aWNlCisgKgorICogSW5wdXQ6CisgKgloYSA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyAqCisgKiBDb250ZXh0OgorICoJSW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3ZvaWQKK3FsYTJ4MDBfYWJvcnRfcXVldWVzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgZG9uZXFmbGcpIAoreworCisJc3JiX3QgICAgICAgKnNwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljbGVhcl9iaXQoQUJPUlRfUVVFVUVTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJLyogUmV0dXJuIGFsbCBjb21tYW5kcyBkZXZpY2UgcXVldWVzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+bGlzdF9sb2NrLGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmhhLT5wZW5kaW5nX3F1ZXVlKSB7CisJCXNwID0gbGlzdF9lbnRyeShsaXN0LCBzcmJfdCwgbGlzdCk7CisKKwkJaWYgKHNwLT5mbGFncyAmIFNSQl9BQk9SVEVEKQorCQkJY29udGludWU7CisKKwkJLyogUmVtb3ZlIHNyYiBmcm9tIExVTiBxdWV1ZS4gKi8KKwkJX19kZWxfZnJvbV9wZW5kaW5nX3F1ZXVlKGhhLCBzcCk7CisKKwkJLyogU2V0IGVuZGluZyBzdGF0dXMuICovCisJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKworCQlfX2FkZF90b19kb25lX3F1ZXVlKGhhLCBzcCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyogIHFsYTJ4MDBfcnN0X2FlbgorKiAgICAgIFByb2Nlc3NlcyBhc3luY2hyb25vdXMgcmVzZXQuCisqCisqIElucHV0OgorKiAgICAgIGhhICA9IGFkYXB0ZXIgYmxvY2sgcG9pbnRlci4KKyovCitzdGF0aWMgdm9pZAorcWxhMngwMF9yc3RfYWVuKHNjc2lfcWxhX2hvc3RfdCAqaGEpIAoreworCWlmIChoYS0+ZmxhZ3Mub25saW5lICYmICFoYS0+ZmxhZ3MucmVzZXRfYWN0aXZlICYmCisJICAgICFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkgICAgISh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncykpKSB7CisJCWRvIHsKKwkJCWNsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkJCS8qCisJCQkgKiBJc3N1ZSBtYXJrZXIgY29tbWFuZCBvbmx5IHdoZW4gd2UgYXJlIGdvaW5nIHRvIHN0YXJ0CisJCQkgKiB0aGUgSS9PLgorCQkJICovCisJCQloYS0+bWFya2VyX25lZWRlZCA9IDE7CisJCX0gd2hpbGUgKCFhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgJiYKKwkJICAgICh0ZXN0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmaGEtPmRwY19mbGFncykpKTsKKwl9Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGFsbG9jYXRlIFNQIGZyb20gdGhlIGZyZWUgcXVldWUKKyAqIGlucHV0OgorICogICAgICAgIHNjc2lfcWxhX2hvc3RfdCAqCisgKiBvdXRwdXQ6CisgKiAgICAgICAgc3JiX3QgKiBvciBOVUxMCisgKi8KK3N0YXRpYyBzcmJfdCAqCitxbGEyeDAwX2dldF9uZXdfc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlzcmJfdCAqc3A7CisKKwlzcCA9IG1lbXBvb2xfYWxsb2MoaGEtPnNyYl9tZW1wb29sLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3ApCisJCWF0b21pY19zZXQoJnNwLT5yZWZfY291bnQsIDEpOworCXJldHVybiAoc3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBxbGEyeDAwX3RpbWVyCisqCisqIERlc2NyaXB0aW9uOgorKiAgIE9uZSBzZWNvbmQgdGltZXIKKyoKKyogQ29udGV4dDogSW50ZXJydXB0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcWxhMngwMF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAkJdCxsOworCXVuc2lnbmVkIGxvbmcJY3B1X2ZsYWdzID0gMDsKKwlmY19wb3J0X3QJKmZjcG9ydDsKKwlvc19sdW5fdCAqbHE7CisJb3NfdGd0X3QgKnRxOworCWludAkJc3RhcnRfZHBjID0gMDsKKwlpbnQJCWluZGV4OworCXNyYl90CQkqc3A7CisKKwkvKgorCSAqIFdlIHRyeSBhbmQgcmVzdGFydCBhbnkgcmVxdWVzdCBpbiB0aGUgcmV0cnkgcXVldWUgZXZlcnkgc2Vjb25kLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmaGEtPnJldHJ5X3F1ZXVlKSkgeworCQlzZXRfYml0KFBPUlRfUkVTVEFSVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKwkJc3RhcnRfZHBjKys7CisJfQorCisJLyoKKwkgKiBXZSB0cnkgYW5kIHJlc3RhcnQgYW55IHJlcXVlc3QgaW4gdGhlIHNjc2lfcmV0cnkgcXVldWUgZXZlcnkgc2Vjb25kLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmaGEtPnNjc2lfcmV0cnlfcXVldWUpKSB7CisJCXNldF9iaXQoU0NTSV9SRVNUQVJUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQlzdGFydF9kcGMrKzsKKwl9CisKKwkvKgorCSAqIFBvcnRzIC0gUG9ydCBkb3duIHRpbWVyLgorCSAqCisJICogV2hlbmV2ZXIsIGEgcG9ydCBpcyBpbiB0aGUgTE9TVCBzdGF0ZSB3ZSBzdGFydCBkZWNyZW1lbnRpbmcgaXRzIHBvcnQKKwkgKiBkb3duIHRpbWVyIGV2ZXJ5IHNlY29uZCB1bnRpbCBpdCByZWFjaGVzIHplcm8uIE9uY2UgIGl0IHJlYWNoZXMgemVybworCSAqIHRoZSBwb3J0IGl0IG1hcmtlZCBERUFELiAKKwkgKi8KKwl0ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfVEFSR0VUKQorCQkJY29udGludWU7CisKKwkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0xPU1QpIHsKKworCQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnBvcnRfZG93bl90aW1lcikgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZjcG9ydC0+cG9ydF9kb3duX3RpbWVyKSAhPSAwKSAKKwkJCQlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0RFQUQpOworCQkJCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZmNwb3J0LSVkIC0gcG9ydCByZXRyeSBjb3VudDogIgorCQkJICAgICIlZCByZW1haW5uaW5nXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLAorCQkJICAgIHQsIGF0b21pY19yZWFkKCZmY3BvcnQtPnBvcnRfZG93bl90aW1lcikpKTsKKwkJfQorCQl0Kys7CisJfSAvKiBFbmQgb2YgZm9yIGZjcG9ydCAgKi8KKworCS8qCisJICogTFVOUyAtIGx1biBzdXNwZW5kIHRpbWVyLgorCSAqCisJICogV2hlbmV2ZXIsIGEgbHVuIGlzIHN1c3BlbmRlZCB0aGUgdGltZXIgc3RhcnRzIGRlY3JlbWVudGluZyBpdHMKKwkgKiBzdXNwZW5kIHRpbWVyIGV2ZXJ5IHNlY29uZCB1bnRpbCBpdCByZWFjaGVzIHplcm8uIE9uY2UgIGl0IHJlYWNoZXMKKwkgKiB6ZXJvIHRoZSBsdW4gcmV0cnkgY291bnQgaXMgZGVjcmVtZW50ZWQuIAorCSAqLworCisJLyoKKwkgKiBGSVhNRShkZykgLSBOZWVkIHRvIGNvbnZlcnQgdGhpcyBsaW5lYXIgc2VhcmNoIG9mIGx1bnMgaW50byBhIHNlYXJjaAorCSAqIG9mIGEgbGlzdCBvZiBzdXNwZW5kZWQgbHVucy4KKwkgKi8KKwlmb3IgKHQgPSAwOyB0IDwgaGEtPm1heF90YXJnZXRzOyB0KyspIHsKKwkJaWYgKCh0cSA9IGhhLT5vdGd0W3RdKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZm9yIChsID0gMDsgbCA8IGhhLT5tYXhfbHVuczsgbCsrKSB7CisJCQlpZiAoKGxxID0gKG9zX2x1bl90ICopIHRxLT5vbHVuW2xdKSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHEtPnFfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWlmIChscS0+cV9zdGF0ZSA9PSBMVU5fU1RBVEVfV0FJVCAmJgorCQkJCWF0b21pY19yZWFkKCZscS0+cV90aW1lcikgIT0gMCkgeworCisJCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmxxLT5xX3RpbWVyKSAhPSAwKSB7CisJCQkJCS8qCisJCQkJCSAqIEEgZGVsYXkgc2hvdWxkIGltbWVkaWF0ZWx5CisJCQkJCSAqIHRyYW5zaXRpb24gdG8gYSBSRUFEWSBzdGF0ZQorCQkJCQkgKi8KKwkJCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChMVU5fRVhFQ19ERUxBWUVELAorCQkJCQkgICAgJmxxLT5xX2ZsYWcpKSB7CisJCQkJCQlscS0+cV9zdGF0ZSA9IExVTl9TVEFURV9SRUFEWTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWxxLT5xX2NvdW50Kys7CisJCQkJCQlpZiAobHEtPnFfY291bnQgPT0gbHEtPnFfbWF4KQorCQkJCQkJCWxxLT5xX3N0YXRlID0KKwkJCQkJCQkgICAgTFVOX1NUQVRFX1RJTUVPVVQ7CisJCQkJCQllbHNlCisJCQkJCQkJbHEtPnFfc3RhdGUgPQorCQkJCQkJCSAgICBMVU5fU1RBVEVfUlVOOworCQkJCQl9CisJCQkJfQorCQkJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogbHVuJWQgLSB0aW1lciAlZCwgIgorCQkJCSAgICAiY291bnQ9JWQsIG1heD0lZCwgc3RhdGU9JWRcbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLAorCQkJCSAgICBsLAorCQkJCSAgICBhdG9taWNfcmVhZCgmbHEtPnFfdGltZXIpLAorCQkJCSAgICBscS0+cV9jb3VudCwgbHEtPnFfbWF4LCBscS0+cV9zdGF0ZSkpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHEtPnFfbG9jaywgY3B1X2ZsYWdzKTsKKwkJfSAvKiBFbmQgb2YgZm9yIGx1bnMgICovCisJfSAvKiBFbmQgb2YgZm9yIHRhcmdldHMgICovCisKKwkvKiBMb29wIGRvd24gaGFuZGxlci4gKi8KKwlpZiAoYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpID4gMCAmJgorCSAgICAhKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKSkgJiYgaGEtPmZsYWdzLm9ubGluZSkgeworCisJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3BfZG93bl90aW1lcikgPT0KKwkJICAgIGhhLT5sb29wX2Rvd25fYWJvcnRfdGltZSkgeworCisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTG9vcCBEb3duIC0gYWJvcnRpbmcgdGhlICIKKwkJCSAgICAicXVldWVzIGJlZm9yZSB0aW1lIGV4cGlyZVxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCisJCQlpZiAoIUlTX1FMQTIxMDAoaGEpICYmIGhhLT5saW5rX2Rvd25fdGltZW91dCkKKwkJCQlhdG9taWNfc2V0KCZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ERUFEKTsgCisKKwkJCS8qIFNjaGVkdWxlIGFuIElTUCBhYm9ydCB0byByZXR1cm4gYW55IHRhcGUgY29tbWFuZHMuICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7CisJCQkgICAgaW5kZXgrKykgeworCQkJCXNwID0gaGEtPm91dHN0YW5kaW5nX2NtZHNbaW5kZXhdOworCQkJCWlmICghc3ApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghKHNwLT5mY2x1bi0+ZmNwb3J0LT5mbGFncyAmCisJCQkJICAgIEZDRl9UQVBFX1BSRVNFTlQpKQorCQkJCQljb250aW51ZTsKKworCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkJCXNldF9iaXQoQUJPUlRfUVVFVUVTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJc3RhcnRfZHBjKys7CisJCX0KKworCQkvKiBpZiB0aGUgbG9vcCBoYXMgYmVlbiBkb3duIGZvciA0IG1pbnV0ZXMsIHJlaW5pdCBhZGFwdGVyICovCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZoYS0+bG9vcF9kb3duX3RpbWVyKSAhPSAwKSB7CisJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTG9vcCBkb3duIGV4Y2VlZCA0IG1pbnMgLSAiCisJCQkgICAgInJlc3RhcnRpbmcgcXVldWVzLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubykpOworCisJCQlzZXRfYml0KFJFU1RBUlRfUVVFVUVTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJc3RhcnRfZHBjKys7CisKKwkJCWlmICghKGhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX05PX0NBQkxFKSkgeworCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMb29wIGRvd24gLSAiCisJCQkJICAgICJhYm9ydGluZyBJU1AuXG4iLAorCQkJCSAgICBoYS0+aG9zdF9ubykpOworCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICAgIkxvb3AgZG93biAtIGFib3J0aW5nIElTUC5cbiIpOworCisJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJCQl9CisJCX0KKwkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBMb29wIERvd24gLSBzZWNvbmRzIHJlbWFpbm5pbmcgJWRcbiIsCisJCSAgICBoYS0+aG9zdF9ubywKKwkJICAgIGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSkpOworCX0KKworCS8qCisJICogRG9uZSBRIEhhbmRsZXIgLS0gZGdGSVhNRSBUaGlzIGhhbmRsZXIgd2lsbCBraWNrIG9mZiBkb25lcSBpZiB3ZQorCSAqIGhhdmVuJ3QgcHJvY2VzcyBpdCBpbiAyIHNlY29uZHMuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZG9uZV9xdWV1ZSkpCisJCXFsYTJ4MDBfZG9uZShoYSk7CisKKworCS8qIFNjaGVkdWxlIHRoZSBEUEMgcm91dGluZSBpZiBuZWVkZWQgKi8KKwlpZiAoKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICBzdGFydF9kcGMgfHwKKwkgICAgdGVzdF9iaXQoTE9HSU5fUkVUUllfTkVFREVELCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoUkVMT0dJTl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKSkgJiYKKwkgICAgaGEtPmRwY193YWl0ICYmICFoYS0+ZHBjX2FjdGl2ZSkgeworCisJCXVwKGhhLT5kcGNfd2FpdCk7CisJfQorCisJcWxhMngwMF9yZXN0YXJ0X3RpbWVyKGhhLCBXQVRDSF9JTlRFUlZBTCk7Cit9CisKKy8qCisgKiBxbGEyeDAwX2V4dGVuZF90aW1lb3V0CisgKiAgICAgIFRoaXMgcm91dGluZSB3aWxsIGV4dGVuZCB0aGUgdGltZW91dCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqIElucHV0OgorICogICAgICBjbWQgPSBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgTm9uZS4KKyAqLwordm9pZCAKK3FsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgdGltZW91dCkgCit7CisJc3JiX3QgKnNwID0gKHNyYl90ICopIENNRF9TUChjbWQpOworCXVfbG9uZyBvdXJfamlmZmllcyA9ICh0aW1lb3V0ICogSFopICsgamlmZmllczsKKworICAgIAlzcC0+ZXh0X2hpc3Rvcnk9IDA7IAorCXNwLT5lX3N0YXJ0ID0gamlmZmllczsKKwlpZiAoY21kLT5laF90aW1lb3V0LmZ1bmN0aW9uKSB7CisJCW1vZF90aW1lcigmY21kLT5laF90aW1lb3V0LG91cl9qaWZmaWVzKTsKKwkJc3AtPmV4dF9oaXN0b3J5IHw9IDE7CisJfQorCWlmIChzcC0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCkgeworCQkvKiAKKwkJICogT3VyIGludGVybmFsIHRpbWVyIHNob3VsZCB0aW1lb3V0IGJlZm9yZSB0aGUgbWlkbGF5ZXIgaGFzIGEKKwkJICogY2hhbmNlIGJlZ2luIHRoZSBhYm9ydCBwcm9jZXNzCisJCSAqLworCQltb2RfdGltZXIoJnNwLT50aW1lcixvdXJfamlmZmllcyAtIChRTEFfQ01EX1RJTUVSX0RFTFRBICogSFopKTsKKworICAgIAkgCXNwLT5leHRfaGlzdG9yeSB8PSAyOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgcWxhMngwMF9jbWRfdGltZW91dAorKgorKiBEZXNjcmlwdGlvbjoKKyogICAgICAgSGFuZGxlcyB0aGUgY29tbWFuZCBpZiBpdCB0aW1lcyBvdXQgaW4gYW55IHN0YXRlLgorKgorKiBJbnB1dDoKKyogICAgIHNwIC0gcG9pbnRlciB0byB2YWxpZGF0ZQorKgorKiBSZXR1cm5zOgorKiBOb25lLgorKiBOb3RlOk5lZWQgdG8gYWRkIHRoZSBzdXBwb3J0IGZvciBpZiggc3AtPnN0YXRlID09IFNSQl9GQUlMT1ZFUl9TVEFURSkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3FsYTJ4MDBfY21kX3RpbWVvdXQoc3JiX3QgKnNwKQoreworCWludCB0LCBsOworCWludCBwcm9jZXNzZWQ7CisJc2NzaV9xbGFfaG9zdF90ICp2aXNfaGEsICpkZXN0X2hhOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBjcHVfZmxhZ3M7CisJZmNfcG9ydF90ICpmY3BvcnQ7CisKKwljbWQgPSBzcC0+Y21kOworCXZpc19oYSA9IChzY3NpX3FsYV9ob3N0X3QgKiljbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlERUJVRzMocHJpbnRrKCJjbWRfdGltZW91dDogRW50ZXJpbmcgc3AtPnN0YXRlID0gJXhcbiIsIHNwLT5zdGF0ZSkpOworCisJdCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwlsID0gY21kLT5kZXZpY2UtPmx1bjsKKwlmY3BvcnQgPSBzcC0+ZmNsdW4tPmZjcG9ydDsKKwlkZXN0X2hhID0gc3AtPmhhOworCisJLyoKKwkgKiBJZiBJTyBpcyBmb3VuZCBlaXRoZXIgaW4gcmV0cnkgUXVldWUgCisJICogICAgT1IgaW4gTHVuIFF1ZXVlCisJICogUmV0dXJuIHRoaXMgSU8gYmFjayB0byBob3N0CisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpc19oYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJcHJvY2Vzc2VkID0gMDsKKwlpZiAoc3AtPnN0YXRlID09IFNSQl9QRU5ESU5HX1NUQVRFKSB7CisJCV9fZGVsX2Zyb21fcGVuZGluZ19xdWV1ZSh2aXNfaGEsIHNwKTsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGb3VuZCBpbiBQZW5kaW5nIHF1ZXVlIHBpZCAlbGQsICIKKwkJICAgICJTdGF0ZSA9ICV4LiwgZmNwb3J0IHN0YXRlPSVkIHNqaWZmcz0lbHggbmppZmZzPSVseFxuIiwKKwkJICAgIHZpc19oYS0+aG9zdF9ubywgY21kLT5zZXJpYWxfbnVtYmVyLCBzcC0+c3RhdGUsCisJCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSksIHNwLT5yX3N0YXJ0LCBqaWZmaWVzKSk7CisKKwkJLyoKKwkJICogSWYgRkNfREVWSUNFIGlzIG1hcmtlZCBhcyBkZWFkIHJldHVybiB0aGUgY21kIHdpdGgKKwkJICogRElEX05PX0NPTk5FQ1Qgc3RhdHVzLiAgT3RoZXJ3aXNlIHNldCB0aGUgaG9zdF9ieXRlIHRvCisJCSAqIERJRF9CVVNfQlVTWSB0byBsZXQgdGhlIE9TICByZXRyeSB0aGlzIGNtZC4KKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX0RFVklDRV9ERUFEIHx8CisJCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5oYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisJCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pIAorCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX0xPT1A7CisJCQllbHNlCisJCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfUE9SVDsKKwkJfSBlbHNlIHsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQl9CisJCV9fYWRkX3RvX2RvbmVfcXVldWUodmlzX2hhLCBzcCk7CisJCXByb2Nlc3NlZCsrOworCX0gCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlzX2hhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmIChwcm9jZXNzZWQpIHsKKwkJcWxhMngwMF9kb25lKHZpc19oYSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzdF9oYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJaWYgKChzcC0+c3RhdGUgPT0gU1JCX1JFVFJZX1NUQVRFKSB8fAorCSAgICAoc3AtPnN0YXRlID09IFNSQl9TQ1NJX1JFVFJZX1NUQVRFKSkgeworCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRm91bmQgaW4gKFNjc2kpIFJldHJ5IHF1ZXVlIG9yICIKKwkJICAgICJmYWlsb3ZlciBRIHBpZCAlbGQsIFN0YXRlID0gJXguLCBmY3BvcnQgc3RhdGU9JWQgIgorCQkgICAgImppZmZpZXM9JWx4IHJldHJpZWQ9JWRcbiIsCisJCSAgICBkZXN0X2hhLT5ob3N0X25vLCBjbWQtPnNlcmlhbF9udW1iZXIsIHNwLT5zdGF0ZSwKKwkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSwgamlmZmllcywgY21kLT5yZXRyaWVzKSk7CisKKwkJaWYgKChzcC0+c3RhdGUgPT0gU1JCX1JFVFJZX1NUQVRFKSkgeworCQkJX19kZWxfZnJvbV9yZXRyeV9xdWV1ZShkZXN0X2hhLCBzcCk7CisJCX0gZWxzZSBpZiAoKHNwLT5zdGF0ZSA9PSBTUkJfU0NTSV9SRVRSWV9TVEFURSkpIHsKKwkJCV9fZGVsX2Zyb21fc2NzaV9yZXRyeV9xdWV1ZShkZXN0X2hhLCBzcCk7CisJCX0gCisKKwkJLyoKKwkJICogSWYgRkNfREVWSUNFIGlzIG1hcmtlZCBhcyBkZWFkIHJldHVybiB0aGUgY21kIHdpdGgKKwkJICogRElEX05PX0NPTk5FQ1Qgc3RhdHVzLiAgT3RoZXJ3aXNlIHNldCB0aGUgaG9zdF9ieXRlIHRvCisJCSAqIERJRF9CVVNfQlVTWSB0byBsZXQgdGhlIE9TICByZXRyeSB0aGlzIGNtZC4KKwkJICovCisJCWlmICgoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19ERVZJQ0VfREVBRCkgfHwKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0X2hhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpIHsKKwkJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoY21kLCBFWFRFTkRfQ01EX1RJTUVPVVQpOworCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCWlmIChhdG9taWNfcmVhZCgmZGVzdF9oYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ET1dOKSAKKwkJCQlzcC0+ZXJyX2lkID0gU1JCX0VSUl9MT09QOworCQkJZWxzZQorCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX1BPUlQ7CisJCX0gZWxzZSB7CisJCQljbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJfQorCisJCV9fYWRkX3RvX2RvbmVfcXVldWUoZGVzdF9oYSwgc3ApOworCQlwcm9jZXNzZWQrKzsKKwl9IAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc3RfaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHByb2Nlc3NlZCkgeworCQlxbGEyeDAwX2RvbmUoZGVzdF9oYSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzdF9oYS0+bGlzdF9sb2NrLCBjcHVfZmxhZ3MpOworCWlmIChzcC0+c3RhdGUgPT0gU1JCX0RPTkVfU1RBVEUpIHsKKwkJLyogSU8gaW4gZG9uZV9xICAtLSBsZWF2ZSBpdCAqLworCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRm91bmQgaW4gRG9uZSBxdWV1ZSBwaWQgJWxkIHNwPSVwLlxuIiwKKwkJICAgIGRlc3RfaGEtPmhvc3Rfbm8sIGNtZC0+c2VyaWFsX251bWJlciwgc3ApKTsKKwl9IGVsc2UgaWYgKHNwLT5zdGF0ZSA9PSBTUkJfU1VTUEVOREVEX1NUQVRFKSB7CisJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBGb3VuZCBTUCAlcCBpbiBzdXNwZW5kZWQgc3RhdGUgICIKKwkJICAgICItIHBpZCAlbGQ6XG4iLAorCQkgICAgZGVzdF9oYS0+aG9zdF9ubywgc3AsIGNtZC0+c2VyaWFsX251bWJlcikpOworCQlERUJVRyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopc3AsIHNpemVvZihzcmJfdCkpOykKKwl9IGVsc2UgaWYgKHNwLT5zdGF0ZSA9PSBTUkJfQUNUSVZFX1NUQVRFKSB7CisJCS8qCisJCSAqIElPIGlzIHdpdGggSVNQIGZpbmQgdGhlIGNvbW1hbmQgaW4gb3VyIGFjdGl2ZSBsaXN0LgorCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzdF9oYS0+bGlzdF9sb2NrLCBjcHVfZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzdF9oYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCQlpZiAoc3AgPT0gZGVzdF9oYS0+b3V0c3RhbmRpbmdfY21kc1sKKwkJICAgICh1bnNpZ25lZCBsb25nKXNwLT5jbWQtPmhvc3Rfc2NyaWJibGVdKSB7CisKKwkJCURFQlVHKHByaW50aygiY21kX3RpbWVvdXQ6IEZvdW5kIGluIElTUCBcbiIpKTsKKworCQkJaWYgKHNwLT5mbGFncyAmIFNSQl9UQVBFKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW5ub3QgYWxsb3cgdGhlIG1pZGxheWVyIGVycm9yIGhhbmRsZXIKKwkJCQkgKiB0byB3YWtldXAgYW5kIGJlZ2luIHRoZSBhYm9ydCBwcm9jZXNzLgorCQkJCSAqIEV4dGVuZCB0aGUgdGltZXIgc28gdGhhdCB0aGUgZmlybXdhcmUgY2FuCisJCQkJICogcHJvcGVybHkgcmV0dXJuIHRoZSBJT0NCLgorCQkJCSAqLworCQkJCURFQlVHKHByaW50aygiY21kX3RpbWVvdXQ6IEV4dGVuZGluZyB0aW1lb3V0ICIKKwkJCQkgICAgIm9mIEZDUDIgdGFwZSBjb21tYW5kIVxuIikpOworCQkJCXFsYTJ4MDBfZXh0ZW5kX3RpbWVvdXQoc3AtPmNtZCwKKwkJCQkgICAgRVhURU5EX0NNRF9USU1FT1VUKTsKKwkJCX0KKwkJCXNwLT5zdGF0ZSA9IFNSQl9BQ1RJVkVfVElNRU9VVF9TVEFURTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc3RfaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc3RfaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJInFsYV9jbWRfdGltZW91dDogU3RhdGUgaW5kaWNhdGVzIGl0IGlzIHdpdGggIgorCQkJCSJJU1AsIEJ1dCBub3QgaW4gYWN0aXZlIGFycmF5XG4iKTsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzdF9oYS0+bGlzdF9sb2NrLCBjcHVfZmxhZ3MpOworCX0gZWxzZSBpZiAoc3AtPnN0YXRlID09IFNSQl9BQ1RJVkVfVElNRU9VVF9TVEFURSkgeworCQlERUJVRyhwcmludGsoInFsYTIxMDAlbGQ6IEZvdW5kIGluIEFjdGl2ZSB0aW1lb3V0IHN0YXRlIgorCQkJCSJwaWQgJWxkLCBTdGF0ZSA9ICV4LiwgXG4iLAorCQkJCWRlc3RfaGEtPmhvc3Rfbm8sCisJCQkJc3AtPmNtZC0+c2VyaWFsX251bWJlciwgc3AtPnN0YXRlKTspCisJfSBlbHNlIHsKKwkJLyogRU1QVFkgKi8KKwkJREVCVUcyKHByaW50aygiY21kX3RpbWVvdXQlbGQ6IExPU1QgY29tbWFuZCBzdGF0ZSA9ICIKKwkJCQkiMHgleCwgc3A9JXBcbiIsCisJCQkJdmlzX2hhLT5ob3N0X25vLCBzcC0+c3RhdGUsc3ApOykKKworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmlzX2hhLAorCQkJImNtZF90aW1lb3V0OiBMT1NUIGNvbW1hbmQgc3RhdGUgPSAweCV4XG4iLCBzcC0+c3RhdGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXN0X2hhLT5saXN0X2xvY2ssIGNwdV9mbGFncyk7CisKKwlERUJVRzMocHJpbnRrKCJjbWRfdGltZW91dDogTGVhdmluZ1xuIik7KQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcWxhMngwMF9kb25lCisqICAgICAgUHJvY2VzcyBjb21wbGV0ZWQgY29tbWFuZHMuCisqCisqIElucHV0OgorKiAgICAgIG9sZF9oYSAgICAgICAgICAgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3FsYTJ4MDBfZG9uZShzY3NpX3FsYV9ob3N0X3QgKm9sZF9oYSkKK3sKKwlvc19sdW5fdAkqbHE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCXNjc2lfcWxhX2hvc3RfdAkqaGE7CisJc2NzaV9xbGFfaG9zdF90CSp2aXNfaGE7CisJaW50CXNlbmRfbWFya2VyX29uY2UgPSAwOworCXNyYl90ICAgICAgICAgICAqc3AsICpzcHRlbXA7CisJTElTVF9IRUFEKGxvY2FsX3NwX2xpc3QpOworCisJLyoKKwkgKiBHZXQgaW50byBsb2NhbCBxdWV1ZSBzdWNoIHRoYXQgd2UgZG8gbm90IHdpbmQgdXAgY2FsbGluZyBkb25lIHF1ZXVlCisJICogdGFza2xldCBmb3IgdGhlIHNhbWUgSU9zIGZyb20gRFBDIG9yIGFueSBvdGhlciBwbGFjZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2xkX2hhLT5saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZvbGRfaGEtPmRvbmVfcXVldWUsICZsb2NhbF9zcF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbGRfaGEtPmxpc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBBbGwgZG9uZSBjb21tYW5kcyBhcmUgaW4gdGhlIGxvY2FsIHF1ZXVlLCBub3cgZG8gdGhlIGNhbGwgYmFjay4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3AsIHNwdGVtcCwgJmxvY2FsX3NwX2xpc3QsIGxpc3QpIHsKKwkJb2xkX2hhLT5kb25lX3FfY250LS07CisgICAgICAgIAlzcC0+c3RhdGUgPSBTUkJfTk9fUVVFVUVfU1RBVEU7CisKKwkJLyogcmVtb3ZlIGNvbW1hbmQgZnJvbSBsb2NhbCBsaXN0ICovCisJCWxpc3RfZGVsX2luaXQoJnNwLT5saXN0KTsKKworCQljbWQgPSBzcC0+Y21kOworCQlpZiAoY21kID09IE5VTEwpCisJCSAJY29udGludWU7CisKKwkJdmlzX2hhID0gKHNjc2lfcWxhX2hvc3RfdCAqKWNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwkJbHEgPSBzcC0+bHVuX3F1ZXVlOworCQloYSA9IHNwLT5oYTsKKworCQlpZiAoc3AtPmZsYWdzICYgU1JCX0RNQV9WQUxJRCkgeworCQkJc3AtPmZsYWdzICY9IH5TUkJfRE1BX1ZBTElEOworCisJCQkvKiBSZWxlYXNlIG1lbW9yeSB1c2VkIGZvciB0aGlzIEkvTyAqLworCQkJaWYgKGNtZC0+dXNlX3NnKSB7CisJCQkJcGNpX3VubWFwX3NnKGhhLT5wZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSAgICBjbWQtPnVzZV9zZywgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQl9IGVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKSB7CisJCQkJcGNpX3VubWFwX3BhZ2UoaGEtPnBkZXYsIHNwLT5kbWFfaGFuZGxlLAorCQkJCSAgICBjbWQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQl9CisJCX0KKworCisJCXN3aXRjaCAoaG9zdF9ieXRlKGNtZC0+cmVzdWx0KSkgeworCQkJY2FzZSBESURfT0s6CisJCQljYXNlIERJRF9FUlJPUjoKKwkJCQlicmVhazsKKworCQkJY2FzZSBESURfUkVTRVQ6CisJCQkJLyoKKwkJCQkgKiBTZXQgbWFya2VyIG5lZWRlZCwgc28gd2UgZG9uJ3QgaGF2ZSB0bworCQkJCSAqIHNlbmQgbXVsdGlwbGUgbWFya2VycworCQkJCSAqLworCQkJCWlmICghc2VuZF9tYXJrZXJfb25jZSkgeworCQkJCQloYS0+bWFya2VyX25lZWRlZCA9IDE7CisJCQkJCXNlbmRfbWFya2VyX29uY2UrKzsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFdPUktBUk9VTkQKKwkJCQkgKgorCQkJCSAqIEEgYmFja2Rvb3IgZGV2aWNlLXJlc2V0IHJlcXVpcmVzIGRpZmZlcmVudAorCQkJCSAqIGVycm9yIGhhbmRsaW5nLiAgVGhpcyBjb2RlIGRpZmZlcmVudGlhdGVzCisJCQkJICogYmV0d2VlbiBub3JtYWwgZXJyb3IgaGFuZGxpbmcgYW5kIHRoZQorCQkJCSAqIGJhY2tkb29yIG1ldGhvZC4KKwkJCQkgKgorCQkJCSAqLworCQkJCWlmIChoYS0+aG9zdC0+ZWhfYWN0aXZlICE9IEVIX0FDVElWRSkKKwkJCQkJY21kLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJCQkJYnJlYWs7CisKKworCQkJY2FzZSBESURfQUJPUlQ6CisJCQkJc3AtPmZsYWdzICY9IH5TUkJfQUJPUlRfUEVORElORzsKKwkJCQlzcC0+ZmxhZ3MgfD0gU1JCX0FCT1JURUQ7CisKKwkJCQlpZiAoc3AtPmZsYWdzICYgU1JCX1RJTUVPVVQpCisJCQkJCWNtZC0+cmVzdWx0ID0gRElEX1RJTUVfT1VUIDw8IDE2OworCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJREVCVUcyKHByaW50aygic2NzaSglbGQ6JWQ6JWQpICVzOiBkaWRfZXJyb3IgIgorCQkJCSAgICAiPSAlZCwgY29tcC1zY3NpPSAweCV4LTB4JXggcGlkPSVsZC5cbiIsCisJCQkJICAgIHZpc19oYS0+aG9zdF9ubywKKwkJCQkgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLAorCQkJCSAgICBfX2Z1bmNfXywKKwkJCQkgICAgaG9zdF9ieXRlKGNtZC0+cmVzdWx0KSwKKwkJCQkgICAgQ01EX0NPTVBMX1NUQVRVUyhjbWQpLAorCQkJCSAgICBDTURfU0NTSV9TVEFUVVMoY21kKSwgY21kLT5zZXJpYWxfbnVtYmVyKSk7CisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBDYWxsIHRoZSBtaWQtbGV2ZWwgZHJpdmVyIGludGVycnVwdCBoYW5kbGVyIC0tIHZpYSBzcF9wdXQoKQorCQkgKi8KKwkJc3BfcHV0KGhhLCBzcCk7CisJfSAvKiBlbmQgb2Ygd2hpbGUgKi8KK30KKworLyoKKyAqIHFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZV9pbl96aW9fbW9kZQorICoJUHJvY2VzcyByZXNwb25zZSBxdWV1ZSBjb21wbGV0aW9uIGFzIGZhc3QgYXMgcG9zc2libGUKKyAqCXRvIGFjaGlldmUgWmVybyBJbnRlcnJ1cHQgT3BlcnRpb25zLVpJTworICoKKyAqIElucHV0OgorICoJaGEgPSBhZGFwdGVyIGJsb2NrIHBvaW50ZXIuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbCBjb250ZXh0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZV9pbl96aW9fbW9kZShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBDaGVjayBmb3IgdW5wcm9jZXNzZWQgY29tbWFuZHMgaW4gcmVzcG9uc2UgcXVldWUuICovCisJaWYgKCFoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSkKKwkJcmV0dXJuOworCWlmICghaGEtPmZsYWdzLm9ubGluZSkKKwkJcmV0dXJuOworCWlmIChoYS0+cmVzcG9uc2VfcmluZ19wdHItPnNpZ25hdHVyZSA9PSBSRVNQT05TRV9QUk9DRVNTRUQpCisJCXJldHVybjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssZmxhZ3MpOworCXFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZShoYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIHFsYTJ4MDBfbmV4dAorICoJUmV0cmlldmUgYW5kIHByb2Nlc3MgbmV4dCBqb2IgaW4gdGhlIExVTiBxdWV1ZS4KKyAqCisgKiBJbnB1dDoKKyAqCXRxID0gU0NTSSB0YXJnZXQgcXVldWUgcG9pbnRlci4KKyAqCWxxID0gU0NTSSBMVU4gcXVldWUgcG9pbnRlci4KKyAqCVRHVF9MT0NLIG11c3QgYmUgYWxyZWFkeSBvYnRhaW5lZC4KKyAqCisgKiBPdXRwdXQ6CisgKglSZWxlYXNlcyBUR1RfTE9DSyB1cG9uIGV4aXQuCisgKgorICogQ29udGV4dDoKKyAqCUtlcm5lbC9JbnRlcnJ1cHQgY29udGV4dC4KKyAqIAorICogTm90ZTogVGhpcyByb3V0aW5lIHdpbGwgYWx3YXlzIHRyeSB0byBzdGFydCBJL08gZnJvbSB2aXNpYmxlIEhCQS4KKyAqLwordm9pZAorcWxhMngwMF9uZXh0KHNjc2lfcWxhX2hvc3RfdCAqdmlzX2hhKSAKK3sKKwlpbnQJCXJ2YWw7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXNjc2lfcWxhX2hvc3RfdCAqZGVzdF9oYTsKKwlmY19wb3J0X3QJKmZjcG9ydDsKKwlzcmJfdCAgICAgICAgICAgKnNwLCAqc3B0ZW1wOworCUxJU1RfSEVBRChsb2NhbF9zcF9saXN0KTsKKworCWRlc3RfaGEgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpc19oYS0+bGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2VfaW5pdCgmdmlzX2hhLT5wZW5kaW5nX3F1ZXVlLCAmbG9jYWxfc3BfbGlzdCk7CisJdmlzX2hhLT5xdGhyZWFkcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlzX2hhLT5saXN0X2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcCwgc3B0ZW1wLCAmbG9jYWxfc3BfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZzcC0+bGlzdCk7CisgICAgICAgIAlzcC0+c3RhdGUgPSBTUkJfTk9fUVVFVUVfU1RBVEU7CisKKwkJZmNwb3J0ID0gc3AtPmZjbHVuLT5mY3BvcnQ7CisJCWRlc3RfaGEgPSBmY3BvcnQtPmhhOworCisJCS8qIElmIGRldmljZSBpcyBkZWFkIHRoZW4gc2VuZCByZXF1ZXN0IGJhY2sgdG8gT1MgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQpIHsKKwkJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJaWYgKGF0b21pY19yZWFkKCZkZXN0X2hhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pIAorCQkJCXNwLT5lcnJfaWQgPSBTUkJfRVJSX0xPT1A7CisJCQllbHNlCisJCQkJc3AtPmVycl9pZCA9IFNSQl9FUlJfUE9SVDsKKworCQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBsb29wL3BvcnQgaXMgZG93biAtIHBpZD0lbGQsICIKKwkJCSAgICAic3A9JXAgZXJyX2lkPSVkIGxvb3BpZD0weCV4IHF1ZXVlZCB0byBkZXN0IEhCQSAiCisJCQkgICAgInNjc2klbGQuXG4iLCBkZXN0X2hhLT5ob3N0X25vLAorCQkJICAgIHNwLT5jbWQtPnNlcmlhbF9udW1iZXIsIHNwLCBzcC0+ZXJyX2lkLAorCQkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZGVzdF9oYS0+aG9zdF9ubykpOworCQkJLyogCisJCQkgKiBJbml0aWF0ZSBhIGZhaWxvdmVyIC0gZG9uZSByb3V0aW5lIHdpbGwgaW5pdGlhdGUuCisJCQkgKi8KKwkJCWFkZF90b19kb25lX3F1ZXVlKHZpc19oYSwgc3ApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFNDU0kgS2x1Z2U6IFdoZW5ldmVyLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGFuIGV2ZW50IHN1Y2ggYXMKKwkJICogbG9vcCBkb3duIChpLmUuIGxvb3BfZG93bl90aW1lciApIG9yIHBvcnQgZG93biAoaS5lLiAgTFVOCisJCSAqIHJlcXVlc3QgcWV1ZXVlIGlzIHN1c3BlbmRlZCkgdGhlbiB3ZSB3aWxsIHJlY3ljbGUgbmV3CisJCSAqIGNvbW1hbmRzIGJhY2sgdG8gdGhlIFNDU0kgbGF5ZXIuICBXZSBkbyB0aGlzIGJlY2F1c2UgdGhpcyBpcworCQkgKiBub3JtYWxseSBhIHRlbXBvcmFyeSBjb25kaXRpb24gYW5kIHdlIGRvbid0IHdhbnQgdGhlCisJCSAqIG1pZC1sZXZlbCBzY3NpLmMgZHJpdmVyIHRvIGdldCB1cHNldCBhbmQgc3RhcnQgYWJvcnRpbmcKKwkJICogY29tbWFuZHMuICBUaGUgdGltZW91dCB2YWx1ZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgY29tbWFuZAorCQkgKiBtaW51cyAxLXNlY29uZCBhbmQgcHV0IG9uIGEgcmV0cnkgcXVldWUgKHdhdGNoZG9nKS4gT25jZSB0aGUKKwkJICogY29tbWFuZCB0aW1lb3V0IGl0IGlzIHJldHVybmVkIHRvIHRoZSBtaWQtbGV2ZWwgd2l0aCBhIEJVU1kKKwkJICogc3RhdHVzLCBzbyB0aGUgbWlkLWxldmVsIHdpbGwgcmV0cnkgaXQuIFRoaXMgcHJvY2VzcworCQkgKiBjb250aW51ZXMgdW50aWwgdGhlIExPT1AgRE9XTiB0aW1lIGV4cGlyZXMgb3IgdGhlIGNvbmRpdGlvbgorCQkgKiBnb2VzIGF3YXkuCisJCSAqLworCQlpZiAoIShzcC0+ZmxhZ3MgJiAoU1JCX0lPQ1RMIHwgU1JCX1RBUEUpKSAmJgorCQkgICAgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FIHx8CisJCQl0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmZGVzdF9oYS0+ZHBjX2ZsYWdzKSB8fAorCQkJYXRvbWljX3JlYWQoJmRlc3RfaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfUkVBRFkpKSB7CisKKwkJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogcGlkPSVsZCBwb3J0PTB4JXggc3RhdGU9JWQgIgorCQkJICAgICJsb29wIHN0YXRlPSVkLCBsb29wIGNvdW50ZXI9MHgleCAiCisJCQkgICAgImRwY19mbGFncz0weCVseFxuIiwgc3AtPmNtZC0+c2VyaWFsX251bWJlciwKKwkJCSAgICBkZXN0X2hhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpLAorCQkJICAgIGF0b21pY19yZWFkKCZkZXN0X2hhLT5sb29wX3N0YXRlKSwKKwkJCSAgICBhdG9taWNfcmVhZCgmZGVzdF9oYS0+bG9vcF9kb3duX3RpbWVyKSwKKwkJCSAgICBkZXN0X2hhLT5kcGNfZmxhZ3MpKTsKKworCQkJcWxhMngwMF9leHRlbmRfdGltZW91dChzcC0+Y21kLCBFWFRFTkRfQ01EX1RJTUVPVVQpOworCQkJYWRkX3RvX3JldHJ5X3F1ZXVlKHZpc19oYSwgc3ApOworCisJCQljb250aW51ZTsKKwkJfSAKKworCQkvKgorCQkgKiBJZiB0aGlzIHJlcXVlc3QncyBsdW4gaXMgc3VzcGVuZGVkIHRoZW4gcHV0IHRoZSByZXF1ZXN0IG9uCisJCSAqIHRoZSAgc2NzaV9yZXRyeSBxdWV1ZS4gCisJCSAqLworCSAJaWYgKCEoc3AtPmZsYWdzICYgKFNSQl9JT0NUTCB8IFNSQl9UQVBFKSkgJiYKKwkJICAgIHNwLT5sdW5fcXVldWUtPnFfc3RhdGUgPT0gTFVOX1NUQVRFX1dBSVQpIHsKKwkJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogbHVuIHdhaXQgc3RhdGUgLSBwaWQ9JWxkLCAiCisJCQkgICAgIm9wY29kZT0lZCwgYWxsb3dlZD0lZCwgcmV0cmllcz0lZFxuIiwKKwkJCSAgICBkZXN0X2hhLT5ob3N0X25vLAorCQkJICAgIHNwLT5jbWQtPnNlcmlhbF9udW1iZXIsCisJCQkgICAgc3AtPmNtZC0+Y21uZFswXSwKKwkJCSAgICBzcC0+Y21kLT5hbGxvd2VkLAorCQkJICAgIHNwLT5jbWQtPnJldHJpZXMpKTsKKwkJCQkKKwkJCWFkZF90b19zY3NpX3JldHJ5X3F1ZXVlKHZpc19oYSwgc3ApOworCisJCQljb250aW51ZTsKKwkJfQorCisJCXNwLT5sdW5fcXVldWUtPmlvX2NudCsrOworCisJCXJ2YWwgPSBxbGEyeDAwX3N0YXJ0X3Njc2koc3ApOworCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkJLyogUGxhY2UgcmVxdWVzdCBiYWNrIG9uIHRvcCBvZiBkZXZpY2UgcXVldWUgKi8KKwkJCS8qIGFkZCB0byB0aGUgdG9wIG9mIHF1ZXVlICovCisJCQlhZGRfdG9fcGVuZGluZ19xdWV1ZV9oZWFkKHZpc19oYSwgc3ApOworCisJCQlzcC0+bHVuX3F1ZXVlLT5pb19jbnQtLTsKKwkJfQorCX0KKworCWlmICghSVNfUUxBMjEwMCh2aXNfaGEpICYmICFJU19RTEEyMjAwKHZpc19oYSkpIHsKKwkJLyogUHJvY2VzcyByZXNwb25zZV9xdWV1ZSBpZiBaSU8gc3VwcG9ydCBpcyBlbmFibGVkKi8gCisJCXFsYTJ4MDBfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZV9pbl96aW9fbW9kZSh2aXNfaGEpOworCisJfQorfQorCisvKiBYWFgoaGNoKTogY3J1ZGUgaGFjayB0byBlbXVsYXRlIGEgZG93bl90aW1lb3V0KCkgKi8KK2ludAorcWxhMngwMF9kb3duX3RpbWVvdXQoc3RydWN0IHNlbWFwaG9yZSAqc2VtYSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWNvbnN0IHVuc2lnbmVkIGludCBzdGVwID0gSFovMTA7CisKKwlkbyB7CisJCWlmICghZG93bl90cnlsb2NrKHNlbWEpKQorCQkJcmV0dXJuIDA7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzY2hlZHVsZV90aW1lb3V0KHN0ZXApKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoKHRpbWVvdXQgLT0gc3RlcCkgPiAwKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdm9pZAorcWxhMnh4eF9nZXRfcG9ydF9pZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KHNob3N0KTsKKwlzdHJ1Y3QgZmNfcG9ydCAqZmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjLCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJaWYgKGZjLT5vc190YXJnZXRfaWQgPT0gc3RhcmdldC0+aWQpIHsKKwkJCWZjX3N0YXJnZXRfcG9ydF9pZChzdGFyZ2V0KSA9IGZjLT5kX2lkLmIuZG9tYWluIDw8IDE2IHwKKwkJCQlmYy0+ZF9pZC5iLmFyZWEgPDwgOCB8IAorCQkJCWZjLT5kX2lkLmIuYWxfcGE7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZmNfc3RhcmdldF9wb3J0X2lkKHN0YXJnZXQpID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeHh4X2dldF9wb3J0X25hbWUoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfaG9zdChzaG9zdCk7CisJc3RydWN0IGZjX3BvcnQgKmZjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYywgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCWlmIChmYy0+b3NfdGFyZ2V0X2lkID09IHN0YXJnZXQtPmlkKSB7CisJCQlmY19zdGFyZ2V0X3BvcnRfbmFtZShzdGFyZ2V0KSA9CisJCQkJX19iZTY0X3RvX2NwdSgqKHVpbnQ2NF90ICopZmMtPnBvcnRfbmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZmNfc3RhcmdldF9wb3J0X25hbWUoc3RhcmdldCkgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK3FsYTJ4eHhfZ2V0X25vZGVfbmFtZShzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9ob3N0KHNob3N0KTsKKwlzdHJ1Y3QgZmNfcG9ydCAqZmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjLCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJaWYgKGZjLT5vc190YXJnZXRfaWQgPT0gc3RhcmdldC0+aWQpIHsKKwkJCWZjX3N0YXJnZXRfbm9kZV9uYW1lKHN0YXJnZXQpID0KKwkJCQlfX2JlNjRfdG9fY3B1KCoodWludDY0X3QgKilmYy0+bm9kZV9uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlmY19zdGFyZ2V0X25vZGVfbmFtZShzdGFyZ2V0KSA9IC0xOworfQorCitzdGF0aWMgc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlIHFsYTJ4eHhfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9IHsKKwkuZ2V0X3N0YXJnZXRfcG9ydF9pZCA9IHFsYTJ4eHhfZ2V0X3BvcnRfaWQsCisJLnNob3dfc3RhcmdldF9wb3J0X2lkID0gMSwKKwkuZ2V0X3N0YXJnZXRfcG9ydF9uYW1lID0gcWxhMnh4eF9nZXRfcG9ydF9uYW1lLAorCS5zaG93X3N0YXJnZXRfcG9ydF9uYW1lID0gMSwKKwkuZ2V0X3N0YXJnZXRfbm9kZV9uYW1lID0gcWxhMnh4eF9nZXRfbm9kZV9uYW1lLAorCS5zaG93X3N0YXJnZXRfbm9kZV9uYW1lID0gMSwKK307CisKKy8qKgorICogcWxhMngwMF9tb2R1bGVfaW5pdCAtIE1vZHVsZSBpbml0aWFsaXphdGlvbi4KKyAqKi8KK3N0YXRpYyBpbnQgX19pbml0CitxbGEyeDAwX21vZHVsZV9pbml0KHZvaWQpCit7CisJLyogQWxsb2NhdGUgY2FjaGUgZm9yIFNSQnMuICovCisJc3ByaW50ZihzcmJfY2FjaGVwX25hbWUsICJxbGEyeHh4X3NyYnMiKTsKKwlzcmJfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoc3JiX2NhY2hlcF9uYW1lLCBzaXplb2Yoc3JiX3QpLCAwLAorCSAgICBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChzcmJfY2FjaGVwID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAicWxhMnh4eDogVW5hYmxlIHRvIGFsbG9jYXRlIFNSQiBjYWNoZS4uLkZhaWxpbmcgbG9hZCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBEZXJpdmUgdmVyc2lvbiBzdHJpbmcuICovCisJc3RyY3B5KHFsYTJ4MDBfdmVyc2lvbl9zdHIsIFFMQTJYWFhfVkVSU0lPTik7CisjaWYgREVCVUdfUUxBMjEwMAorCXN0cmNhdChxbGEyeDAwX3ZlcnNpb25fc3RyLCAiLWRlYnVnIik7CisjZW5kaWYKKworCXFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlID0gZmNfYXR0YWNoX3RyYW5zcG9ydCgmcWxhMnh4eF90cmFuc3BvcnRfZnVuY3Rpb25zKTsKKwlpZiAoIXFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX0lORk8gIlFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXJcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHFsYTJ4MDBfbW9kdWxlX2V4aXQgLSBNb2R1bGUgY2xlYW51cC4KKyAqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdAorcWxhMngwMF9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIEZyZWUgU1JCcyBjYWNoZS4gKi8KKwlpZiAoc3JiX2NhY2hlcCAhPSBOVUxMKSB7CisJCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koc3JiX2NhY2hlcCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgInFsYTJ4eHg6IFVuYWJsZSB0byBmcmVlIFNSQiBjYWNoZS4uLk1lbW9yeSBwb29scyAiCisJCQkgICAgInN0aWxsIGFjdGl2ZT9cbiIpOworCQl9CisJCXNyYl9jYWNoZXAgPSBOVUxMOworCX0KKworCWZjX3JlbGVhc2VfdHJhbnNwb3J0KHFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKK30KKworbW9kdWxlX2luaXQocWxhMngwMF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChxbGEyeDAwX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUUxvZ2ljIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFFMQTJYWFhfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfcnNjbi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3JzY24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU0NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3JzY24uYwpAQCAtMCwwICsxLDE0MzcgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCisvKioKKyAqIElPIGRlc2NyaXB0b3IgaGFuZGxlIGRlZmluaXRpb25zLgorICoKKyAqIFNpZ25hdHVyZSBmb3JtOgorICoKKyAqCXwzMS0tLS0tLTI4fDI3LS0tLS0tLS0tLS0tLS0tLS0tLTEyfDExLS0tLS0tLTB8CisgKgl8ICAgVHlwZSAgIHwgICBSb2xsaW5nIFNpZ25hdHVyZSAgIHwgICBJbmRleCAgfAorICoJfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAqCisgKiovCisKKyNkZWZpbmUgSERMX1RZUEVfU0NTSQkJMAorI2RlZmluZSBIRExfVFlQRV9BU1lOQ19JT0NCCTB4MEEKKworI2RlZmluZSBIRExfSU5ERVhfQklUUwkxMgorI2RlZmluZSBIRExfSVRFUl9CSVRTCTE2CisjZGVmaW5lIEhETF9UWVBFX0JJVFMJNAorCisjZGVmaW5lIEhETF9JTkRFWF9NQVNLCSgoMVVMIDw8IEhETF9JTkRFWF9CSVRTKSAtIDEpCisjZGVmaW5lIEhETF9JVEVSX01BU0sJKCgxVUwgPDwgSERMX0lURVJfQklUUykgLSAxKQorI2RlZmluZSBIRExfVFlQRV9NQVNLCSgoMVVMIDw8IEhETF9UWVBFX0JJVFMpIC0gMSkKKworI2RlZmluZSBIRExfSU5ERVhfU0hJRlQJMAorI2RlZmluZSBIRExfSVRFUl9TSElGVAkoSERMX0lOREVYX1NISUZUICsgSERMX0lOREVYX0JJVFMpCisjZGVmaW5lIEhETF9UWVBFX1NISUZUCShIRExfSVRFUl9TSElGVCArIEhETF9JVEVSX0JJVFMpCisKKy8qIExvY2FsIFByb3RvdHlwZXMuICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHFsYTJ4MDBfdG9faGFuZGxlKHVpbnQxNl90LCB1aW50MTZfdCwgdWludDE2X3QpOworc3RhdGljIGlubGluZSB1aW50MTZfdCBxbGEyeDAwX2hhbmRsZV90b19pZHgodWludDMyX3QpOworc3RhdGljIGlubGluZSB1aW50MzJfdCBxbGEyeDAwX2lvZGVzY190b19oYW5kbGUoc3RydWN0IGlvX2Rlc2NyaXB0b3IgKik7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBpb19kZXNjcmlwdG9yICpxbGEyeDAwX2hhbmRsZV90b19pb2Rlc2Moc2NzaV9xbGFfaG9zdF90ICosCisgICAgdWludDMyX3QpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpb19kZXNjcmlwdG9yICpxbGEyeDAwX2FsbG9jX2lvZGVzYyhzY3NpX3FsYV9ob3N0X3QgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgcWxhMngwMF9mcmVlX2lvZGVzYyhzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBxbGEyeDAwX2luaXRfaW9fZGVzY3JpcHRvcnMoc2NzaV9xbGFfaG9zdF90ICopOworCitzdGF0aWMgdm9pZCBxbGEyeDAwX2lvZGVzY190aW1lb3V0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGlubGluZSB2b2lkIHFsYTJ4MDBfYWRkX2lvZGVzY190aW1lcihzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBxbGEyeDAwX3JlbW92ZV9pb2Rlc2NfdGltZXIoc3RydWN0IGlvX2Rlc2NyaXB0b3IgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxbGEyeDAwX3VwZGF0ZV9sb2dpbl9mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICosCisgICAgc3RydWN0IG1ieF9lbnRyeSAqLCBmY19wb3J0X3QgKik7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9zZW5kX2Fib3J0X2lvY2Ioc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBpb19kZXNjcmlwdG9yICosCisgICAgdWludDMyX3QsIGludCk7CitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKik7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9zZW5kX2FkaXNjX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBpb19kZXNjcmlwdG9yICosCisgICAgaW50KTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zZW5kX2FkaXNjX2lvY2JfY2Ioc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBpb19kZXNjcmlwdG9yICosCisgICAgc3RydWN0IG1ieF9lbnRyeSAqKTsKKworc3RhdGljIGludCBxbGEyeDAwX3NlbmRfbG9nb3V0X2lvY2Ioc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBpb19kZXNjcmlwdG9yICosCisgICAgaW50KTsKK3N0YXRpYyBpbnQgcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqLAorICAgIHN0cnVjdCBpb19kZXNjcmlwdG9yICosIHN0cnVjdCBtYnhfZW50cnkgKik7CisKK3N0YXRpYyBpbnQgcWxhMngwMF9zZW5kX2xvZ2luX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBpb19kZXNjcmlwdG9yICosCisgICAgcG9ydF9pZF90ICosIGludCk7CitzdGF0aWMgaW50IHFsYTJ4MDBfc2VuZF9sb2dpbl9pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKik7CisKKy8qKiAKKyAqIE1haWxib3ggSU9DQiBjYWxsYmFjayBhcnJheS4KKyAqKi8KK3N0YXRpYyBpbnQgKCppb2NiX2Z1bmN0aW9uX2NiX2xpc3RbTEFTVF9JT0NCX0NCXSkKKwkoc2NzaV9xbGFfaG9zdF90ICosIHN0cnVjdCBpb19kZXNjcmlwdG9yICosIHN0cnVjdCBtYnhfZW50cnkgKikgPSB7CisKKwlxbGEyeDAwX3NlbmRfYWJvcnRfaW9jYl9jYiwKKwlxbGEyeDAwX3NlbmRfYWRpc2NfaW9jYl9jYiwKKwlxbGEyeDAwX3NlbmRfbG9nb3V0X2lvY2JfY2IsCisJcWxhMngwMF9zZW5kX2xvZ2luX2lvY2JfY2IsCit9OworCisKKy8qKiAKKyAqIEdlbmVyaWMgSU8gZGVzY3JpcHRvciBoYW5kbGUgcm91dGluZXMuCisgKiovCisKKy8qKgorICogcWxhMngwMF90b19oYW5kbGUoKSAtIENyZWF0ZSBhIGRlc2NyaXB0b3IgaGFuZGxlLgorICogQHR5cGU6IGRlc2NyaXB0b3IgdHlwZQorICogQGl0ZXI6IGRlc2NyaXB0b3Igcm9sbGluZyBzaWduYXR1cmUKKyAqIEBpZHg6IGluZGV4IHRvIHRoZSBkZXNjcmlwdG9yIGFycmF5CisgKgorICogUmV0dXJucyBhIGNvbXBvc2l0ZSBoYW5kbGUgYmFzZWQgaW4gdGhlIEB0eXBlLCBAaXRlciwgYW5kIEBpZHguCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK3FsYTJ4MDBfdG9faGFuZGxlKHVpbnQxNl90IHR5cGUsIHVpbnQxNl90IGl0ZXIsIHVpbnQxNl90IGlkeCkKK3sKKwlyZXR1cm4gKCh1aW50MzJfdCkoKCh1aW50MzJfdCl0eXBlIDw8IEhETF9UWVBFX1NISUZUKSB8CisJICAgICgodWludDMyX3QpaXRlciA8PCBIRExfSVRFUl9TSElGVCkgfAorCSAgICAoKHVpbnQzMl90KWlkeCA8PCBIRExfSU5ERVhfU0hJRlQpKSk7Cit9CisKKy8qKgorICogcWxhMngwMF9oYW5kbGVfdG9faWR4KCkgLSBSZXRyaXZlIHRoZSBpbmRleCBmb3IgYSBnaXZlbiBoYW5kbGUuCisgKiBAaGFuZGxlOiBkZXNjcmlwdG9yIGhhbmRsZQorICoKKyAqIFJldHVybnMgdGhlIGluZGV4IHNwZWNpZmllZCBieSB0aGUgQGhhbmRsZS4KKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorcWxhMngwMF9oYW5kbGVfdG9faWR4KHVpbnQzMl90IGhhbmRsZSkKK3sKKwlyZXR1cm4gKCh1aW50MTZfdCkoKChoYW5kbGUpID4+IEhETF9JTkRFWF9TSElGVCkgJiBIRExfSU5ERVhfTUFTSykpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaW9kZXNjX3RvX2hhbmRsZSgpIC0gQ29udmVydCBhbiBJTyBkZXNjcmlwdG9yIHRvIGEgdW5pcXVlIGhhbmRsZS4KKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zIGEgdW5pcXVlIGhhbmRsZSBmb3IgQGlvZGVzYy4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdAorcWxhMngwMF9pb2Rlc2NfdG9faGFuZGxlKHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MpCit7CisJdWludDMyX3QgaGFuZGxlOworCisJaGFuZGxlID0gcWxhMngwMF90b19oYW5kbGUoSERMX1RZUEVfQVNZTkNfSU9DQiwKKwkgICAgKytpb2Rlc2MtPmhhLT5pb2Rlc2Nfc2lnbmF0dXJlLCBpb2Rlc2MtPmlkeCk7CisJaW9kZXNjLT5zaWduYXR1cmUgPSBoYW5kbGU7CisKKwlyZXR1cm4gKGhhbmRsZSk7Cit9CisKKy8qKgorICogcWxhMngwMF9oYW5kbGVfdG9faW9kZXNjKCkgLSBSZXRyaWV2ZSBhbiBJTyBkZXNjcmlwdG9yIGdpdmVuIGEgdW5pcXVlIGhhbmRsZS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGhhbmRsZTogaGFuZGxlIHRvIGlvIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW8gZGVzY3JpcHRvciwgb3IgTlVMTCwgaWYgdGhlIGlvIGRlc2NyaXB0b3IgZG9lcworICogbm90IGV4aXN0IG9yIHRoZSBpbyBkZXNjcmlwdG9ycyBzaWduYXR1cmUgZG9lcyBub3QgQGhhbmRsZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqCitxbGEyeDAwX2hhbmRsZV90b19pb2Rlc2Moc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgaGFuZGxlKQoreworCXVpbnQxNl90IGlkeDsKKwlzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjOworCisJaWR4ID0gcWxhMngwMF9oYW5kbGVfdG9faWR4KGhhbmRsZSk7CisJaW9kZXNjID0gJmhhLT5pb19kZXNjcmlwdG9yc1tpZHhdOworCWlmIChpb2Rlc2MpCisJCWlmIChpb2Rlc2MtPnNpZ25hdHVyZSAhPSBoYW5kbGUpCisJCQlpb2Rlc2MgPSBOVUxMOworCisJcmV0dXJuIChpb2Rlc2MpOworfQorCisKKy8qKiAKKyAqIElPIGRlc2NyaXB0b3IgYWxsb2NhdGlvbiByb3V0aW5lcy4KKyAqKi8KKworLyoqCisgKiBxbGEyeDAwX2FsbG9jX2lvZGVzYygpIC0gQWxsb2NhdGUgYW4gSU8gZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBpbyBkZXNjcmlwdG9yLCBvciBOVUxMLCBpZiBub25lIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqCitxbGEyeDAwX2FsbG9jX2lvZGVzYyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCXVpbnQxNl90IGl0ZXI7CisJc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYzsKKworCWlvZGVzYyA9IE5VTEw7CisJZm9yIChpdGVyID0gMDsgaXRlciA8IE1BWF9JT19ERVNDUklQVE9SUzsgaXRlcisrKSB7CisJCWlmIChoYS0+aW9fZGVzY3JpcHRvcnNbaXRlcl0udXNlZCkKKwkJCWNvbnRpbnVlOworCisJCWlvZGVzYyA9ICZoYS0+aW9fZGVzY3JpcHRvcnNbaXRlcl07CisJCWlvZGVzYy0+dXNlZCA9IDE7CisJCWlvZGVzYy0+aWR4ID0gaXRlcjsKKwkJaW5pdF90aW1lcigmaW9kZXNjLT50aW1lcik7CisJCWlvZGVzYy0+aGEgPSBoYTsKKwkJaW9kZXNjLT5zaWduYXR1cmUgPSBxbGEyeDAwX2lvZGVzY190b19oYW5kbGUoaW9kZXNjKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChpb2Rlc2MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfZnJlZV9pb2Rlc2MoKSAtIEZyZWUgYW4gSU8gZGVzY3JpcHRvci4KKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqCisgKiBOT1RFOiBUaGUgaW8gZGVzY3JpcHRvcnMgdGltZXIgKm11c3QqIGJlIHN0b3BwZWQgYmVmb3JlIGl0IGNhbiBiZSBmcmVlJ2QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF9mcmVlX2lvZGVzYyhzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjKQoreworCWlvZGVzYy0+dXNlZCA9IDA7CisJaW9kZXNjLT5zaWduYXR1cmUgPSAwOworfQorCisvKioKKyAqIHFsYTJ4MDBfcmVtb3ZlX2lvZGVzY190aW1lcigpIC0gUmVtb3ZlIGFuIGFjdGl2ZSB0aW1lciBmcm9tIGFuIElPIGRlc2NyaXB0b3IuCisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF9yZW1vdmVfaW9kZXNjX3RpbWVyKHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MpCit7CisJaWYgKGlvZGVzYy0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCkgeworCQlkZWxfdGltZXJfc3luYygmaW9kZXNjLT50aW1lcik7CisJCWlvZGVzYy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBOVUxMOworCQlpb2Rlc2MtPnRpbWVyLmZ1bmN0aW9uID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9pbml0X2lvX2Rlc2NyaXB0b3JzKCkgLSBJbml0aWFsaXplIHRoZSBwb29sIG9mIElPIGRlc2NyaXB0b3JzLgorICogQGhhOiBIQSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF9pbml0X2lvX2Rlc2NyaXB0b3JzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJdWludDE2X3QgaXRlcjsKKworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBNQVhfSU9fREVTQ1JJUFRPUlM7IGl0ZXIrKykgeworCQlpZiAoIWhhLT5pb19kZXNjcmlwdG9yc1tpdGVyXS51c2VkKQorCQkJY29udGludWU7CisKKwkJcWxhMngwMF9yZW1vdmVfaW9kZXNjX3RpbWVyKCZoYS0+aW9fZGVzY3JpcHRvcnNbaXRlcl0pOworCQlxbGEyeDAwX2ZyZWVfaW9kZXNjKCZoYS0+aW9fZGVzY3JpcHRvcnNbaXRlcl0pOworCX0KK30KKworCisvKiogCisgKiBJTyBkZXNjcmlwdG9yIHRpbWVyIHJvdXRpbmVzLgorICoqLworCisvKioKKyAqIHFsYTJ4MDBfaW9kZXNjX3RpbWVvdXQoKSAtIFRpbWVvdXQgSU8gZGVzY3JpcHRvciBoYW5kbGVyLgorICogQGRhdGE6IGlvIGRlc2NyaXB0b3IKKyAqLworc3RhdGljIHZvaWQKK3FsYTJ4MDBfaW9kZXNjX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2M7CisKKwlpb2Rlc2MgPSAoc3RydWN0IGlvX2Rlc2NyaXB0b3IgKikgZGF0YTsKKworCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IElPIGRlc2NyaXB0b3IgdGltZW91dCwgaW5kZXg9JXggIgorCSAgICAic2lnbmF0dXJlPSUwOHgsIHNjaGVkdWxpbmcgSVNQIGFib3J0LlxuIiwgaW9kZXNjLT5oYS0+aG9zdF9ubywKKwkgICAgaW9kZXNjLT5pZHgsIGlvZGVzYy0+c2lnbmF0dXJlKSk7CisKKwlxbGEyeDAwX2ZyZWVfaW9kZXNjKGlvZGVzYyk7CisKKwlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaW9kZXNjLT5oYSwKKwkgICAgIklPIGRlc2NyaXB0b3IgdGltZW91dC4gU2NoZWR1bGluZyBJU1AgYWJvcnQuXG4iKTsKKwlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZpb2Rlc2MtPmhhLT5kcGNfZmxhZ3MpOworfQorCisvKioKKyAqIHFsYTJ4MDBfYWRkX2lvZGVzY190aW1lcigpIC0gQWRkIGFuZCBzdGFydCBhIHRpbWVyIGZvciBhbiBJTyBkZXNjcmlwdG9yLgorICogQGlvZGVzYzogaW8gZGVzY3JpcHRvcgorICoKKyAqIE5PVEU6CisgKiBUaGUgZmlybXdhcmUgc2hhbGwgdGltZW91dCBhbiBvdXRzdGFuZGluZyBtYWlsYm94IElPQ0IgaW4gMiAqIFJfQV9UT1YgKGluCisgKiB0ZW50aHMgb2YgYSBzZWNvbmQpIGFmdGVyIGl0IGhpdHMgdGhlIHdpcmUuICBCdXQsIGlmIHRoZXJlIGFyZSBhbnkgcmVxdWVzdAorICogcmVzb3VyY2UgY29udHJhaW50cyAoaS5lLiBkdXJpbmcgaGVhdnkgSS9PKSwgZXhjaGFuZ2VzIGNhbiBiZSBoZWxkIG9mZiBmb3IKKyAqIGF0IG1vc3QgUl9BX1RPVi4gIFRoZXJlZm9yZSwgdGhlIGRyaXZlciB3aWxsIHdhaXQgNCAqIFJfQV9UT1YgYmVmb3JlCisgKiBzY2hlZHVsaW5nIGEgcmVjb3ZlcnkgKGJpZyBoYW1tZXIpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfYWRkX2lvZGVzY190aW1lcihzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXRpbWVvdXQgPSAoaW9kZXNjLT5oYS0+cl9hX3RvdiAqIDQpIC8gMTA7CisJaW5pdF90aW1lcigmaW9kZXNjLT50aW1lcik7CisJaW9kZXNjLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlvZGVzYzsKKwlpb2Rlc2MtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKHRpbWVvdXQgKiBIWik7CisJaW9kZXNjLT50aW1lci5mdW5jdGlvbiA9CisJICAgICh2b2lkICgqKSAodW5zaWduZWQgbG9uZykpIHFsYTJ4MDBfaW9kZXNjX3RpbWVvdXQ7CisJYWRkX3RpbWVyKCZpb2Rlc2MtPnRpbWVyKTsKK30KKworLyoqIAorICogSU8gZGVzY3JpcHRvciBzdXBwb3J0IHJvdXRpbmVzLgorICoqLworCisvKioKKyAqIHFsYTJ4MDBfdXBkYXRlX2xvZ2luX2ZjcG9ydCgpIC0gVXBkYXRlIGZjcG9ydCBkYXRhIGFmdGVyIGxvZ2luIHByb2Nlc3NpbmcuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBtYnhzdGF0OiBNYWlsYm94IGNvbW1hbmQgc3RhdHVzIElPQ0IKKyAqIEBmY3BvcnQ6IHBvcnQgdG8gdXBkYXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcWxhMngwMF91cGRhdGVfbG9naW5fZmNwb3J0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBtYnhfZW50cnkgKm1ieHN0YXQsCisgICAgZmNfcG9ydF90ICpmY3BvcnQpCit7CisJaWYgKGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMSkgJiBCSVRfMCkgeworCQlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9JTklUSUFUT1I7CisJfSBlbHNlIHsKKwkJZmNwb3J0LT5wb3J0X3R5cGUgPSBGQ1RfVEFSR0VUOworCQlpZiAobGUxNl90b19jcHUobWJ4c3RhdC0+bWIxKSAmIEJJVF8xKSB7CisJCQlmY3BvcnQtPmZsYWdzIHw9IEZDRl9UQVBFX1BSRVNFTlQ7CisJCX0KKwl9CisJZmNwb3J0LT5sb2dpbl9yZXRyeSA9IDA7CisJZmNwb3J0LT5wb3J0X2xvZ2luX3JldHJ5X2NvdW50ID0gaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCAqCisJICAgIFBPUlRfUkVUUllfVElNRTsKKwlhdG9taWNfc2V0KCZmY3BvcnQtPnBvcnRfZG93bl90aW1lciwgaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCAqCisJICAgIFBPUlRfUkVUUllfVElNRSk7CisJZmNwb3J0LT5mbGFncyB8PSBGQ0ZfRkFCUklDX0RFVklDRTsKKwlmY3BvcnQtPmZsYWdzICY9IH5GQ0ZfRkFJTE9WRVJfTkVFREVEOworCWZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gSU9ERVNDX0lOVkFMSURfSU5ERVg7CisJYXRvbWljX3NldCgmZmNwb3J0LT5zdGF0ZSwgRkNTX09OTElORSk7Cit9CisKKworLyoqIAorICogTWFpbGJveCBJT0NCIGNvbW1hbmRzLgorICoqLworCisvKioKKyAqIHFsYTJ4MDBfZ2V0X21ieF9pb2NiX2VudHJ5KCkgLSBSZXRyaWV2ZSBhbiBJT0NCIGZyb20gdGhlIHJlcXVlc3QgcXVldWUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBoYW5kbGU6IGhhbmRsZSB0byBpbyBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlcWVzdCBlbnRyeSwgb3IgTlVMTCwgaWYgbm9uZSB3ZXJlIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWJ4X2VudHJ5ICoKK3FsYTJ4MDBfZ2V0X21ieF9pb2NiX2VudHJ5KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwl1aW50MTZfdCBjbnQ7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJc3RydWN0IG1ieF9lbnRyeSAqbWJ4ZW50cnk7CisKKwltYnhlbnRyeSA9IE5VTEw7CisKKwlpZiAoaGEtPnJlcV9xX2NudCA8IDMpIHsKKwkJY250ID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcihJU1BfUkVRX1FfT1VUKGhhLCByZWcpKTsKKwkJaWYgIChoYS0+cmVxX3JpbmdfaW5kZXggPCBjbnQpCisJCQloYS0+cmVxX3FfY250ID0gY250IC0gaGEtPnJlcV9yaW5nX2luZGV4OworCQllbHNlCisJCQloYS0+cmVxX3FfY250ID0gaGEtPnJlcXVlc3RfcV9sZW5ndGggLQorCQkJICAgIChoYS0+cmVxX3JpbmdfaW5kZXggLSBjbnQpOworCX0KKwlpZiAoaGEtPnJlcV9xX2NudCA+PSAzKSB7CisJCW1ieGVudHJ5ID0gKHN0cnVjdCBtYnhfZW50cnkgKiloYS0+cmVxdWVzdF9yaW5nX3B0cjsKKworCQltZW1zZXQobWJ4ZW50cnksIDAsIHNpemVvZihzdHJ1Y3QgbWJ4X2VudHJ5KSk7CisJCW1ieGVudHJ5LT5lbnRyeV90eXBlID0gTUJYX0lPQ0JfVFlQRTsKKwkJbWJ4ZW50cnktPmVudHJ5X2NvdW50ID0gMTsKKwkJbWJ4ZW50cnktPnN5c19kZWZpbmUxID0gU09VUkNFX0FTWU5DX0lPQ0I7CisJCW1ieGVudHJ5LT5oYW5kbGUgPSBoYW5kbGU7CisJfQorCXJldHVybiAobWJ4ZW50cnkpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiKCkgLSBJc3N1ZSBhbiBhYm9ydCBJT0NCIHRvIHRoZSBmaXJtd2FyZS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGlvZGVzYzogaW8gZGVzY3JpcHRvcgorICogQGhhbmRsZV90b19hYm9ydDogZmlybXdhcmUgaGFuZGxlIHRvIGFib3J0CisgKiBAaGFfbG9ja2VkOiBpcyBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmUgbG9jaworICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgdGhlIElPQ0Igd2FzIGlzc3VlZC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZW5kX2Fib3J0X2lvY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYywgCisgICAgdWludDMyX3QgaGFuZGxlX3RvX2Fib3J0LCBpbnQgaGFfbG9ja2VkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBtYnhfZW50cnkgKm1ieGVudHJ5OworCisJLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQuICovCisJaWYgKHFsYTJ4MDBfaXNzdWVfbWFya2VyKGhhLCBoYV9sb2NrZWQpICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCisJaWYgKCFoYV9sb2NrZWQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogQnVpbGQgYWJvcnQgbWFpbGJveCBJT0NCLiAqLworCW1ieGVudHJ5ID0gcWxhMngwMF9nZXRfbWJ4X2lvY2JfZW50cnkoaGEsIGlvZGVzYy0+c2lnbmF0dXJlKTsKKwlpZiAobWJ4ZW50cnkgPT0gTlVMTCkgeworCQlpZiAoIWhhX2xvY2tlZCkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKwl9CisJbWJ4ZW50cnktPm1iMCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoTUJDX0FCT1JUX0NPTU1BTkQpOworCW1ieGVudHJ5LT5tYjEgPSBtYnhlbnRyeS0+bG9vcF9pZC5leHRlbmRlZCA9CisJICAgIGNwdV90b19sZTE2KGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCk7CisJbWJ4ZW50cnktPm1iMiA9IExTVyhoYW5kbGVfdG9fYWJvcnQpOworCW1ieGVudHJ5LT5tYjMgPSBNU1coaGFuZGxlX3RvX2Fib3J0KTsKKwl3bWIoKTsKKworCXFsYTJ4MDBfYWRkX2lvZGVzY190aW1lcihpb2Rlc2MpOworCisJLyogSXNzdWUgY29tbWFuZCB0byBJU1AuICovCisJcWxhMngwMF9pc3BfY21kKGhhKTsKKworCWlmICghaGFfbG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogU2VuZGluZyBBYm9ydCBJT0NCICglMDh4KSB0byBbJXhdLCBhYm9ydGluZyAiCisJICAgICIlMDh4LlxuIiwgaGEtPmhvc3Rfbm8sIGlvZGVzYy0+c2lnbmF0dXJlLAorCSAgICBpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsIGhhbmRsZV90b19hYm9ydCkpOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKy8qKgorICogcWxhMngwMF9zZW5kX2Fib3J0X2lvY2JfY2IoKSAtIEFib3J0IElPQ0IgY2FsbGJhY2suCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqIEBtYnhzdGF0OiBtYWlsYm94IHN0YXR1cyBJT0NCCisgKgorICogUmV0dXJucyBRTEFfU1VDQ0VTUyBpZiBAaW9kZXNjIGNhbiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLCBlbHNlLCBAaW9kZXNjCisgKiB3aWxsIGJlIHVzZWQgZm9yIGEgcmV0cnkuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc2VuZF9hYm9ydF9pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MsCisgICAgc3RydWN0IG1ieF9lbnRyeSAqbWJ4c3RhdCkKK3sKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBBYm9ydCBJT0NCIC0tIHNlbnQgdG8gWyV4LyUwMnglMDJ4JTAyeF0sICIKKwkgICAgInN0YXR1cz0leCBtYjA9JXguXG4iLCBoYS0+aG9zdF9ubywgaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCSAgICBpb2Rlc2MtPmRfaWQuYi5kb21haW4sIGlvZGVzYy0+ZF9pZC5iLmFyZWEsIGlvZGVzYy0+ZF9pZC5iLmFsX3BhLAorCSAgICBsZTE2X3RvX2NwdShtYnhzdGF0LT5zdGF0dXMpLCBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjApKSk7CisKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKK30KKworCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9hZGlzY19pb2NiKCkgLSBJc3N1ZSBhIEdldCBQb3J0IERhdGFiYXNlIElPQ0IgdG8gdGhlIGZpcm13YXJlLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKiBAaGFfbG9ja2VkOiBpcyBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmUgbG9jaworICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgdGhlIElPQ0Igd2FzIGlzc3VlZC4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZW5kX2FkaXNjX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYywKKyAgICBpbnQgaGFfbG9ja2VkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBtYnhfZW50cnkgKm1ieGVudHJ5OworCisJLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQuICovCisJaWYgKHFsYTJ4MDBfaXNzdWVfbWFya2VyKGhhLCBoYV9sb2NrZWQpICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCisJaWYgKCFoYV9sb2NrZWQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogQnVpbGQgR2V0IFBvcnQgRGF0YWJhc2UgSU9DQi4gKi8KKwltYnhlbnRyeSA9IHFsYTJ4MDBfZ2V0X21ieF9pb2NiX2VudHJ5KGhhLCBpb2Rlc2MtPnNpZ25hdHVyZSk7CisJaWYgKG1ieGVudHJ5ID09IE5VTEwpIHsKKwkJaWYgKCFoYV9sb2NrZWQpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJfQorCW1ieGVudHJ5LT5tYjAgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KE1CQ19HRVRfUE9SVF9EQVRBQkFTRSk7CisJbWJ4ZW50cnktPm1iMSA9IG1ieGVudHJ5LT5sb29wX2lkLmV4dGVuZGVkID0KKwkgICAgY3B1X3RvX2xlMTYoaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5sb29wX2lkKTsKKwltYnhlbnRyeS0+bWIyID0gY3B1X3RvX2xlMTYoTVNXKExTRChoYS0+aW9kZXNjX3BkX2RtYSkpKTsKKwltYnhlbnRyeS0+bWIzID0gY3B1X3RvX2xlMTYoTFNXKExTRChoYS0+aW9kZXNjX3BkX2RtYSkpKTsKKwltYnhlbnRyeS0+bWI2ID0gY3B1X3RvX2xlMTYoTVNXKE1TRChoYS0+aW9kZXNjX3BkX2RtYSkpKTsKKwltYnhlbnRyeS0+bWI3ID0gY3B1X3RvX2xlMTYoTFNXKE1TRChoYS0+aW9kZXNjX3BkX2RtYSkpKTsKKwltYnhlbnRyeS0+bWIxMCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQklUXzApOworCXdtYigpOworCisJcWxhMngwMF9hZGRfaW9kZXNjX3RpbWVyKGlvZGVzYyk7CisKKwkvKiBJc3N1ZSBjb21tYW5kIHRvIElTUC4gKi8KKwlxbGEyeDAwX2lzcF9jbWQoaGEpOworCisJaWYgKCFoYV9sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBTZW5kaW5nIEFkaXNjIElPQ0IgKCUwOHgpIHRvIFsleF0uXG4iLAorCSAgICBoYS0+aG9zdF9ubywgaW9kZXNjLT5zaWduYXR1cmUsIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCkpOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKy8qKgorICogcWxhMngwMF9zZW5kX2FkaXNjX2lvY2JfY2IoKSAtIEdldCBQb3J0IERhdGFiYXNlIElPQ0IgY2FsbGJhY2suCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqIEBtYnhzdGF0OiBtYWlsYm94IHN0YXR1cyBJT0NCCisgKgorICogUmV0dXJucyBRTEFfU1VDQ0VTUyBpZiBAaW9kZXNjIGNhbiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLCBlbHNlLCBAaW9kZXNjCisgKiB3aWxsIGJlIHVzZWQgZm9yIGEgcmV0cnkuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc2VuZF9hZGlzY19pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MsCisgICAgc3RydWN0IG1ieF9lbnRyeSAqbWJ4c3RhdCkKK3sKKwlmY19wb3J0X3QgKnJlbW90ZV9mY3BvcnQ7CisKKwlyZW1vdGVfZmNwb3J0ID0gaW9kZXNjLT5yZW1vdGVfZmNwb3J0OworCisJLyogRW5zdXJlIHRoZSBwb3J0IElEcyBhcmUgY29uc2lzdGVudC4gKi8KKwlpZiAocmVtb3RlX2ZjcG9ydC0+ZF9pZC5iMjQgIT0gaW9kZXNjLT5kX2lkLmIyNCkgeworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBBZGlzYyBJT0NCIC0tIGlnbm9yaW5nLCByZW1vdGUgcG9ydCAiCisJCSAgICAiaWQgY2hhbmdlZCBmcm9tIFslMDJ4JTAyeCUwMnhdIHRvIFslMDJ4JTAyeCUwMnhdLlxuIiwKKwkJICAgIGhhLT5ob3N0X25vLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hbF9wYSwKKwkJICAgIGlvZGVzYy0+ZF9pZC5iLmRvbWFpbiwgaW9kZXNjLT5kX2lkLmIuYXJlYSwKKwkJICAgIGlvZGVzYy0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfQorCisJLyogT25seSBwcm9jZXNzIHRoZSBsYXN0IGNvbW1hbmQuICovCisJaWYgKHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCAhPSBpb2Rlc2MtPmlkeCkgeworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBBZGlzYyBJT0NCIC0tIGlnbm9yaW5nLCBzZW50IHRvICIKKwkJICAgICJbJTAyeCUwMnglMDJ4XSwgZXhwZWN0ZWQgJXgsIHJlY2VpdmVkICV4LlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICBpb2Rlc2MtPmRfaWQuYi5kb21haW4sIGlvZGVzYy0+ZF9pZC5iLmFyZWEsCisJCSAgICBpb2Rlc2MtPmRfaWQuYi5hbF9wYSwgcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50LAorCQkgICAgaW9kZXNjLT5pZHgpKTsKKworCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwl9CisKKwlpZiAobGUxNl90b19jcHUobWJ4c3RhdC0+c3RhdHVzKSA9PSBDU19DT01QTEVURSkgeworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBBZGlzYyBJT0NCIC0tIG1hcmtpbmcgIgorCQkgICAgIlsleC8lMDJ4JTAyeCUwMnhdIG9ubGluZS5cbiIsIGhhLT5ob3N0X25vLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQlhdG9taWNfc2V0KCZyZW1vdGVfZmNwb3J0LT5zdGF0ZSwgRkNTX09OTElORSk7CisJfSBlbHNlIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogQWRpc2MgSU9DQiAtLSBtYXJraW5nICIKKwkJICAgICJbJXgvJTAyeCUwMnglMDJ4XSBsb3N0LCBzdGF0dXM9JXggbWIwPSV4LlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICByZW1vdGVfZmNwb3J0LT5sb29wX2lkLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hbF9wYSwKKwkJICAgIGxlMTZfdG9fY3B1KG1ieHN0YXQtPnN0YXR1cyksIGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMCkpKTsKKworCQlpZiAoYXRvbWljX3JlYWQoJnJlbW90ZV9mY3BvcnQtPnN0YXRlKSAhPSBGQ1NfREVWSUNFX0RFQUQpCisJCQlhdG9taWNfc2V0KCZyZW1vdGVfZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9MT1NUKTsKKwl9CisJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gSU9ERVNDX0lOVkFMSURfSU5ERVg7CisKKwlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKK30KKworCisvKioKKyAqIHFsYTJ4MDBfc2VuZF9sb2dvdXRfaW9jYigpIC0gSXNzdWUgYSBmYWJyaWMgcG9ydCBsb2dvdXQgSU9DQiB0byB0aGUgZmlybXdhcmUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqIEBoYV9sb2NrZWQ6IGlzIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBoYXJkd2FyZSBsb2NrCisgKgorICogUmV0dXJucyBRTEFfU1VDQ0VTUyBpZiB0aGUgSU9DQiB3YXMgaXNzdWVkLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3NlbmRfbG9nb3V0X2lvY2Ioc2NzaV9xbGFfaG9zdF90ICpoYSwgc3RydWN0IGlvX2Rlc2NyaXB0b3IgKmlvZGVzYywKKyAgICBpbnQgaGFfbG9ja2VkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBtYnhfZW50cnkgKm1ieGVudHJ5OworCisJLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQuICovCisJaWYgKHFsYTJ4MDBfaXNzdWVfbWFya2VyKGhhLCBoYV9sb2NrZWQpICE9IFFMQV9TVUNDRVNTKQorCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCisJaWYgKCFoYV9sb2NrZWQpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJLyogQnVpbGQgZmFicmljIHBvcnQgbG9nb3V0IG1haWxib3ggSU9DQi4gKi8KKwltYnhlbnRyeSA9IHFsYTJ4MDBfZ2V0X21ieF9pb2NiX2VudHJ5KGhhLCBpb2Rlc2MtPnNpZ25hdHVyZSk7CisJaWYgKG1ieGVudHJ5ID09IE5VTEwpIHsKKwkJaWYgKCFoYV9sb2NrZWQpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJfQorCW1ieGVudHJ5LT5tYjAgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KE1CQ19MT0dPVVRfRkFCUklDX1BPUlQpOworCW1ieGVudHJ5LT5tYjEgPSBtYnhlbnRyeS0+bG9vcF9pZC5leHRlbmRlZCA9CisJICAgIGNwdV90b19sZTE2KGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCk7CisJd21iKCk7CisKKwlxbGEyeDAwX2FkZF9pb2Rlc2NfdGltZXIoaW9kZXNjKTsKKworCS8qIElzc3VlIGNvbW1hbmQgdG8gSVNQLiAqLworCXFsYTJ4MDBfaXNwX2NtZChoYSk7CisKKwlpZiAoIWhhX2xvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IFNlbmRpbmcgTG9nb3V0IElPQ0IgKCUwOHgpIHRvIFsleF0uXG4iLAorCSAgICBoYS0+aG9zdF9ubywgaW9kZXNjLT5zaWduYXR1cmUsIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCkpOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKy8qKgorICogcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiX2NiKCkgLSBGYWJyaWMgcG9ydCBsb2dvdXQgSU9DQiBjYWxsYmFjay4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGlvZGVzYzogaW8gZGVzY3JpcHRvcgorICogQG1ieHN0YXQ6IG1haWxib3ggc3RhdHVzIElPQ0IKKyAqCisgKiBSZXR1cm5zIFFMQV9TVUNDRVNTIGlmIEBpb2Rlc2MgY2FuIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGVsc2UsIEBpb2Rlc2MKKyAqIHdpbGwgYmUgdXNlZCBmb3IgYSByZXRyeS4KKyAqLworc3RhdGljIGludAorcWxhMngwMF9zZW5kX2xvZ291dF9pb2NiX2NiKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2MsCisgICAgc3RydWN0IG1ieF9lbnRyeSAqbWJ4c3RhdCkKK3sKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dvdXQgSU9DQiAtLSBzZW50IHRvIFsleC8lMDJ4JTAyeCUwMnhdLCAiCisJICAgICJzdGF0dXM9JXggbWIwPSV4IG1iMT0leC5cbiIsIGhhLT5ob3N0X25vLAorCSAgICBpb2Rlc2MtPnJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJICAgIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkgICAgaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGxlMTZfdG9fY3B1KG1ieHN0YXQtPnN0YXR1cyksCisJICAgIGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMCksIGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMSkpKTsKKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisKKy8qKgorICogcWxhMngwMF9zZW5kX2xvZ2luX2lvY2IoKSAtIElzc3VlIGEgZmFicmljIHBvcnQgbG9naW4gSU9DQiB0byB0aGUgZmlybXdhcmUuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBpb2Rlc2M6IGlvIGRlc2NyaXB0b3IKKyAqIEBkX2lkOiBwb3J0IGlkIGZvciBkZXZpY2UKKyAqIEBoYV9sb2NrZWQ6IGlzIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBoYXJkd2FyZSBsb2NrCisgKgorICogUmV0dXJucyBRTEFfU1VDQ0VTUyBpZiB0aGUgSU9DQiB3YXMgaXNzdWVkLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3NlbmRfbG9naW5faW9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjLAorICAgIHBvcnRfaWRfdCAqZF9pZCwgaW50IGhhX2xvY2tlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgbWJ4X2VudHJ5ICptYnhlbnRyeTsKKworCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkLiAqLworCWlmIChxbGEyeDAwX2lzc3VlX21hcmtlcihoYSwgaGFfbG9ja2VkKSAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKKworCWlmICghaGFfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCS8qIEJ1aWxkIGZhYnJpYyBwb3J0IGxvZ2luIG1haWxib3ggSU9DQi4gKi8KKwltYnhlbnRyeSA9IHFsYTJ4MDBfZ2V0X21ieF9pb2NiX2VudHJ5KGhhLCBpb2Rlc2MtPnNpZ25hdHVyZSk7CisJaWYgKG1ieGVudHJ5ID09IE5VTEwpIHsKKwkJaWYgKCFoYV9sb2NrZWQpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJfQorCW1ieGVudHJ5LT5tYjAgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KE1CQ19MT0dJTl9GQUJSSUNfUE9SVCk7CisJbWJ4ZW50cnktPm1iMSA9IG1ieGVudHJ5LT5sb29wX2lkLmV4dGVuZGVkID0KKwkgICAgY3B1X3RvX2xlMTYoaW9kZXNjLT5yZW1vdGVfZmNwb3J0LT5sb29wX2lkKTsKKwltYnhlbnRyeS0+bWIyID0gY3B1X3RvX2xlMTYoZF9pZC0+Yi5kb21haW4pOworCW1ieGVudHJ5LT5tYjMgPSBjcHVfdG9fbGUxNihkX2lkLT5iLmFyZWEgPDwgOCB8IGRfaWQtPmIuYWxfcGEpOworCW1ieGVudHJ5LT5tYjEwID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihCSVRfMCk7CisJd21iKCk7CisKKwlxbGEyeDAwX2FkZF9pb2Rlc2NfdGltZXIoaW9kZXNjKTsKKworCS8qIElzc3VlIGNvbW1hbmQgdG8gSVNQLiAqLworCXFsYTJ4MDBfaXNwX2NtZChoYSk7CisKKwlpZiAoIWhhX2xvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IFNlbmRpbmcgTG9naW4gSU9DQiAoJTA4eCkgdG8gIgorCSAgICAiWyV4LyUwMnglMDJ4JTAyeF0uXG4iLCBoYS0+aG9zdF9ubywgaW9kZXNjLT5zaWduYXR1cmUsCisJICAgIGlvZGVzYy0+cmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwgZF9pZC0+Yi5kb21haW4sIGRfaWQtPmIuYXJlYSwKKwkgICAgZF9pZC0+Yi5hbF9wYSkpOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKy8qKgorICogcWxhMngwMF9zZW5kX2xvZ2luX2lvY2JfY2IoKSAtIEZhYnJpYyBwb3J0IGxvZ291dCBJT0NCIGNhbGxiYWNrLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAaW9kZXNjOiBpbyBkZXNjcmlwdG9yCisgKiBAbWJ4c3RhdDogbWFpbGJveCBzdGF0dXMgSU9DQgorICoKKyAqIFJldHVybnMgUUxBX1NVQ0NFU1MgaWYgQGlvZGVzYyBjYW4gYmUgZnJlZWQgYnkgdGhlIGNhbGxlciwgZWxzZSwgQGlvZGVzYworICogd2lsbCBiZSB1c2VkIGZvciBhIHJldHJ5LgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3NlbmRfbG9naW5faW9jYl9jYihzY3NpX3FsYV9ob3N0X3QgKmhhLCBzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjLAorICAgIHN0cnVjdCBtYnhfZW50cnkgKm1ieHN0YXQpCit7CisJaW50IHJ2YWw7CisJZmNfcG9ydF90ICpmY3BvcnQsICpyZW1vdGVfZmNwb3J0LCAqZXhpc3RfZmNwb3J0OworCXN0cnVjdCBpb19kZXNjcmlwdG9yICphYm9ydF9pb2Rlc2MsICpsb2dpbl9pb2Rlc2M7CisJdWludDE2X3Qgc3RhdHVzLCBtYls4XTsKKwl1aW50MTZfdCByZXVzZTsKKwl1aW50MTZfdCByZW1vdGVfbG9vcGlkOworCXBvcnRfaWRfdCByZW1vdGVfZGlkLCBpbnVzZV9kaWQ7CisKKwlyZW1vdGVfZmNwb3J0ID0gaW9kZXNjLT5yZW1vdGVfZmNwb3J0OworCisJLyogT25seSBwcm9jZXNzIHRoZSBsYXN0IGNvbW1hbmQuICovCisJaWYgKHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCAhPSBpb2Rlc2MtPmlkeCkgeworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIGlnbm9yaW5nLCBzZW50IHRvICIKKwkJICAgICJbJTAyeCUwMnglMDJ4XSwgZXhwZWN0ZWQgJXgsIHJlY2VpdmVkICV4LlxuIiwgCisJCSAgICBoYS0+aG9zdF9ubywgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLAorCQkgICAgaW9kZXNjLT5kX2lkLmIuYWxfcGEsIHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCwKKwkJICAgIGlvZGVzYy0+aWR4KSk7CisKKwkJLyogRnJlZSBSU0NOIGZjcG9ydCByZXNvdXJjZXMuICovCisJCWlmIChyZW1vdGVfZmNwb3J0LT5wb3J0X3R5cGUgPT0gRkNUX1JTQ04pIHsKKwkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gRnJlZWluZyBSU0NOICIKKwkJCSAgICAiZmNwb3J0ICVwIFsleC8lMDJ4JTAyeCUwMnhdIGdpdmVuIGlnbm9yZWQgTG9naW4gIgorCQkJICAgICJJT0NCLlxuIiwgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQsCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCQlsaXN0X2RlbCgmcmVtb3RlX2ZjcG9ydC0+bGlzdCk7CisJCQlrZnJlZShyZW1vdGVfZmNwb3J0KTsKKwkJfQorCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwl9CisKKwlzdGF0dXMgPSBsZTE2X3RvX2NwdShtYnhzdGF0LT5zdGF0dXMpOworCW1iWzBdID0gbGUxNl90b19jcHUobWJ4c3RhdC0+bWIwKTsKKwltYlsxXSA9IGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iMSk7CisJbWJbMl0gPSBsZTE2X3RvX2NwdShtYnhzdGF0LT5tYjIpOworCW1iWzZdID0gbGUxNl90b19jcHUobWJ4c3RhdC0+bWI2KTsKKwltYls3XSA9IGxlMTZfdG9fY3B1KG1ieHN0YXQtPm1iNyk7CisKKwkvKiBHb29kIHN0YXR1cz8gKi8KKwlpZiAoKHN0YXR1cyA9PSBDU19DT01QTEVURSB8fCBzdGF0dXMgPT0gQ1NfQ09NUExFVEVfQ0hLQ09ORCkgJiYKKwkgICAgbWJbMF0gPT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKKworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIHN0YXR1cz0leCBtYjE9JXggcG49IgorCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwgaGEtPmhvc3Rfbm8sIHN0YXR1cywKKwkJICAgIG1iWzFdLCBtYnhzdGF0LT5wb3J0X25hbWVbMF0sIG1ieHN0YXQtPnBvcnRfbmFtZVsxXSwgCisJCSAgICBtYnhzdGF0LT5wb3J0X25hbWVbMl0sIG1ieHN0YXQtPnBvcnRfbmFtZVszXSwgCisJCSAgICBtYnhzdGF0LT5wb3J0X25hbWVbNF0sIG1ieHN0YXQtPnBvcnRfbmFtZVs1XSwgCisJCSAgICBtYnhzdGF0LT5wb3J0X25hbWVbNl0sIG1ieHN0YXQtPnBvcnRfbmFtZVs3XSkpOworCisJCW1lbWNweShyZW1vdGVfZmNwb3J0LT5ub2RlX25hbWUsIG1ieHN0YXQtPm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCQltZW1jcHkocmVtb3RlX2ZjcG9ydC0+cG9ydF9uYW1lLCBtYnhzdGF0LT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKKworCQkvKiBJcyB0aGUgZGV2aWNlIGFscmVhZHkgaW4gb3VyIGZjcG9ydHMgbGlzdD8gKi8KKwkJaWYgKHJlbW90ZV9mY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfUlNDTikgeworCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBtYXJraW5nICIKKwkJCSAgICAiWyV4LyUwMnglMDJ4JTAyeF0gb25saW5lLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCQlxbGEyeDAwX3VwZGF0ZV9sb2dpbl9mY3BvcnQoaGEsIG1ieHN0YXQsIHJlbW90ZV9mY3BvcnQpOworCisJCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwkJfQorCisJCS8qIERvZXMgdGhlIFJTQ04gcG9ydG5hbWUgYWxyZWFkeSBleGlzdCBpbiBvdXIgZmNwb3J0cyBsaXN0PyAqLworCQlleGlzdF9mY3BvcnQgPSBOVUxMOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAobWVtY21wKHJlbW90ZV9mY3BvcnQtPnBvcnRfbmFtZSwgZmNwb3J0LT5wb3J0X25hbWUsCisJCQkgICAgV1dOX1NJWkUpID09IDApIHsKKwkJCQlleGlzdF9mY3BvcnQgPSBmY3BvcnQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGV4aXN0X2ZjcG9ydCAhPSBOVUxMKSB7CisJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIGZvdW5kIFJTQ04gIgorCQkJICAgICJmY3BvcnQgaW4gZmNwb3J0cyBsaXN0IFslcF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJCSAgICBleGlzdF9mY3BvcnQpKTsKKworCQkJLyogQWJvcnQgYW55IEFESVNDIHRoYXQgY291bGQgaGF2ZSBiZWVuIHNlbnQuICovCisJCQlpZiAoZXhpc3RfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgIT0gaW9kZXNjLT5pZHggJiYKKwkJCSAgICBleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA8CisJCQkgICAgTUFYX0lPX0RFU0NSSVBUT1JTICYmCisJCQkgICAgaGEtPmlvX2Rlc2NyaXB0b3JzW2V4aXN0X2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50XS4KKwkJCSAgICBjYl9pZHggPT0gQURJU0NfUE9SVF9JT0NCX0NCKSB7CisKKwkJCQlhYm9ydF9pb2Rlc2MgPSBxbGEyeDAwX2FsbG9jX2lvZGVzYyhoYSk7CisJCQkJaWYgKGFib3J0X2lvZGVzYykgeworCQkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCICIKKwkJCQkJICAgICItLSBpc3N1aW5nIGFib3J0IHRvIG91dHN0YW5kaW5nICIKKwkJCQkJICAgICJBZGlzYyBbJXgvJTAyeCUwMnglMDJ4XS5cbiIsCisJCQkJCSAgICBoYS0+aG9zdF9ubywgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCQkJCWFib3J0X2lvZGVzYy0+Y2JfaWR4ID0gQUJPUlRfSU9DQl9DQjsKKwkJCQkJYWJvcnRfaW9kZXNjLT5kX2lkLmIyNCA9CisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYjI0OworCQkJCQlhYm9ydF9pb2Rlc2MtPnJlbW90ZV9mY3BvcnQgPQorCQkJCQkgICAgZXhpc3RfZmNwb3J0OworCQkJCQlleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJCSAgICBhYm9ydF9pb2Rlc2MtPmlkeDsKKwkJCQkJcWxhMngwMF9zZW5kX2Fib3J0X2lvY2IoaGEsCisJCQkJCSAgICBhYm9ydF9pb2Rlc2MsIGhhLT5pb19kZXNjcmlwdG9yc1sKKwkJCQkJICAgICBleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudF0uCisJCQkJCSAgICAgIHNpZ25hdHVyZSwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAiCisJCQkJCSAgICAiLS0gdW5hYmxlIHRvIGFib3J0IG91dHN0YW5kaW5nICIKKwkJCQkJICAgICJBZGlzYyBbJXgvJTAyeCUwMnglMDJ4XS5cbiIsCisJCQkJCSAgICBoYS0+aG9zdF9ubywgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHRoZSBleGlzdGluZyBmY3BvcnQgaXMgd2FpdGluZyB0byBzZW5kIGFuIEFESVNDCisJCQkgKiBvciBMT0dJTiwgdGhlbiByZXVzZSByZW1vdGUgZmNwb3J0IChSU0NOKSB0bworCQkJICogY29udGludWUgd2FpdGluZy4KKwkJCSAqLworCQkJcmV1c2UgPSAwOworCQkJcmVtb3RlX2xvb3BpZCA9IHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQ7CisJCQlyZW1vdGVfZGlkLmIyNCA9IHJlbW90ZV9mY3BvcnQtPmRfaWQuYjI0OworCQkJaWYgKGV4aXN0X2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09CisJCQkgICAgSU9ERVNDX0FESVNDX05FRURFRCB8fAorCQkJICAgIGV4aXN0X2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09CisJCQkgICAgSU9ERVNDX0xPR0lOX05FRURFRCkgeworCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gIgorCQkJCSAgICAiZXhpc3RpbmcgZmNwb3J0IFsleC8lMDJ4JTAyeCUwMnhdICIKKwkJCQkgICAgIndhaXRpbmcgZm9yIElPIGRlc2NyaXB0b3IsIHJldXNlIFJTQ04gIgorCQkJCSAgICAiZmNwb3J0LlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkJICAgIGV4aXN0X2ZjcG9ydC0+bG9vcF9pZCwKKwkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCQkJcmV1c2UrKzsKKwkJCQlyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPQorCQkJCSAgICBleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudDsKKwkJCQlleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJICAgIElPREVTQ19JTlZBTElEX0lOREVYOworCQkJCXJlbW90ZV9mY3BvcnQtPmxvb3BfaWQgPSBleGlzdF9mY3BvcnQtPmxvb3BfaWQ7CisJCQkJcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iMjQgPQorCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYjI0OworCQkJfQorCisJCQkvKiBMb2dvdXQgdGhlIG9sZCBsb29waWQuICovCisJCQlpZiAoIXJldXNlICYmCisJCQkgICAgZXhpc3RfZmNwb3J0LT5sb29wX2lkICE9IHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQgJiYKKwkJCSAgICBleGlzdF9mY3BvcnQtPmxvb3BfaWQgIT0gRkNfTk9fTE9PUF9JRCkgeworCQkJCWxvZ2luX2lvZGVzYyA9IHFsYTJ4MDBfYWxsb2NfaW9kZXNjKGhhKTsKKwkJCQlpZiAobG9naW5faW9kZXNjKSB7CisJCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgIgorCQkJCQkgICAgIi0tIGlzc3VpbmcgbG9nb3V0IHRvIGZyZWUgb2xkICIKKwkJCQkJICAgICJsb29wIGlkIFsleC8lMDJ4JTAyeCUwMnhdLlxuIiwKKwkJCQkJICAgIGhhLT5ob3N0X25vLCBleGlzdF9mY3BvcnQtPmxvb3BfaWQsCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJCQlsb2dpbl9pb2Rlc2MtPmNiX2lkeCA9CisJCQkJCSAgICBMT0dPVVRfUE9SVF9JT0NCX0NCOworCQkJCQlsb2dpbl9pb2Rlc2MtPmRfaWQuYjI0ID0KKwkJCQkJICAgIGV4aXN0X2ZjcG9ydC0+ZF9pZC5iMjQ7CisJCQkJCWxvZ2luX2lvZGVzYy0+cmVtb3RlX2ZjcG9ydCA9CisJCQkJCSAgICBleGlzdF9mY3BvcnQ7CisJCQkJCWV4aXN0X2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0KKwkJCQkJICAgIGxvZ2luX2lvZGVzYy0+aWR4OworCQkJCQlxbGEyeDAwX3NlbmRfbG9nb3V0X2lvY2IoaGEsCisJCQkJCSAgICBsb2dpbl9pb2Rlc2MsIDEpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFJhbiBvdXQgb2YgSU8gZGVzY3JpcHRpb3JzLiAqLworCQkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCICIKKwkJCQkJICAgICItLSB1bmFibGUgdG8gbG9nb3V0IHRvIGZyZWUgb2xkICIKKwkJCQkJICAgICJsb29wIGlkIFsleC8lMDJ4JTAyeCUwMnhdLlxuIiwKKwkJCQkJICAgIGhhLT5ob3N0X25vLCBleGlzdF9mY3BvcnQtPmxvb3BfaWQsCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkJCSAgICBleGlzdF9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCQkgICAgZXhpc3RfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJCQlleGlzdF9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9CisJCQkJCSAgICBJT0RFU0NfSU5WQUxJRF9JTkRFWDsKKwkJCQl9CisKKwkJCX0KKworCQkJLyogVXBkYXRlIGV4aXN0aW5nIGZjcG9ydCB3aXRoIHJlbW90ZSBmY3BvcnQgaW5mby4gKi8KKwkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gbWFya2luZyAiCisJCQkgICAgImV4aXN0aW5nIGZjcG9ydCBbJXgvJTAyeCUwMnglMDJ4XSBvbmxpbmUuXG4iLAorCQkJICAgIGhhLT5ob3N0X25vLCByZW1vdGVfbG9vcGlkLCByZW1vdGVfZGlkLmIuZG9tYWluLAorCQkJICAgIHJlbW90ZV9kaWQuYi5hcmVhLCByZW1vdGVfZGlkLmIuYWxfcGEpKTsKKworCQkJbWVtY3B5KGV4aXN0X2ZjcG9ydC0+bm9kZV9uYW1lLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPm5vZGVfbmFtZSwgV1dOX1NJWkUpOworCQkJZXhpc3RfZmNwb3J0LT5sb29wX2lkID0gcmVtb3RlX2xvb3BpZDsKKwkJCWV4aXN0X2ZjcG9ydC0+ZF9pZC5iMjQgPSByZW1vdGVfZGlkLmIyNDsKKwkJCXFsYTJ4MDBfdXBkYXRlX2xvZ2luX2ZjcG9ydChoYSwgbWJ4c3RhdCwgZXhpc3RfZmNwb3J0KTsKKworCQkJLyogRmluYWxseSwgZnJlZSB0aGUgcmVtb3RlIChSU0NOKSBmY3BvcnQuICovCisJCQlpZiAoIXJldXNlKSB7CisJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSAiCisJCQkJICAgICJGcmVlaW5nIFJTQ04gZmNwb3J0ICVwICIKKwkJCQkgICAgIlsleC8lMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkJICAgIHJlbW90ZV9mY3BvcnQsIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJCWxpc3RfZGVsKCZyZW1vdGVfZmNwb3J0LT5saXN0KTsKKwkJCQlrZnJlZShyZW1vdGVfZmNwb3J0KTsKKwkJCX0KKworCQkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJCX0KKworCQkvKgorCQkgKiBBIG5ldyBkZXZpY2UgaGFzIGJlZW4gYWRkZWQsIG1vdmUgdGhlIFJTQ04gZmNwb3J0IHRvIG91cgorCQkgKiBmY3BvcnRzIGxpc3QuCisJCSAqLworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIGFkZGluZyBSU0NOIGZjcG9ydCAiCisJCSAgICAiWyV4LyUwMnglMDJ4JTAyeF0gdG8gZmNwb3J0cyBsaXN0LlxuIiwgaGEtPmhvc3Rfbm8sCisJCSAgICByZW1vdGVfZmNwb3J0LT5sb29wX2lkLCByZW1vdGVfZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCisJCWxpc3RfZGVsKCZyZW1vdGVfZmNwb3J0LT5saXN0KTsKKwkJcmVtb3RlX2ZjcG9ydC0+ZmxhZ3MgPSAoRkNGX1JMQ19TVVBQT1JUIHwgRkNGX1JFU0NBTl9ORUVERUQpOworCQlxbGEyeDAwX3VwZGF0ZV9sb2dpbl9mY3BvcnQoaGEsIG1ieHN0YXQsIHJlbW90ZV9mY3BvcnQpOworCQlsaXN0X2FkZF90YWlsKCZyZW1vdGVfZmNwb3J0LT5saXN0LCAmaGEtPmZjcG9ydHMpOworCQlzZXRfYml0KEZDUE9SVF9SRVNDQU5fTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJfSBlbHNlIHsKKwkJLyogSGFuZGxlIGxvZ2luIGZhaWx1cmUuICovCisJCWlmIChyZW1vdGVfZmNwb3J0LT5sb2dpbl9yZXRyeSAhPSAwKSB7CisJCQlpZiAobWJbMF0gPT0gTUJTX0xPT1BfSURfVVNFRCkgeworCQkJCWludXNlX2RpZC5iLmRvbWFpbiA9IExTQihtYlsxXSk7CisJCQkJaW51c2VfZGlkLmIuYXJlYSA9IE1TQihtYlsyXSk7CisJCQkJaW51c2VfZGlkLmIuYWxfcGEgPSBMU0IobWJbMl0pOworCisJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogTG9naW4gSU9DQiAtLSBsb29wICIKKwkJCQkgICAgImlkIFsleF0gdXNlZCBieSBwb3J0IGlkIFslMDJ4JTAyeCUwMnhdLlxuIiwKKwkJCQkgICAgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkJICAgIGludXNlX2RpZC5iLmRvbWFpbiwgaW51c2VfZGlkLmIuYXJlYSwKKwkJCQkgICAgaW51c2VfZGlkLmIuYWxfcGEpKTsKKworCQkJCWlmIChyZW1vdGVfZmNwb3J0LT5kX2lkLmIyNCA9PQorCQkJCSAgICBJTlZBTElEX1BPUlRfSUQpIHsKKwkJCQkJLyoKKwkJCQkJICogSW52YWxpZCBwb3J0IGlkIG1lYW5zIHdlIGFyZSB0cnlpbmcKKwkJCQkJICogdG8gbG9naW4gdG8gYSByZW1vdGUgcG9ydCB3aXRoIGp1c3QKKwkJCQkJICogYSBsb29wIGlkIHdpdGhvdXQga25vd2luZyBhYm91dCB0aGUKKwkJCQkJICogcG9ydCBpZC4gIENvcHkgdGhlIHBvcnQgaWQgYW5kIHRyeQorCQkJCQkgKiBhZ2Fpbi4KKwkJCQkJICovCisJCQkJCXJlbW90ZV9mY3BvcnQtPmRfaWQuYjI0ID0gaW51c2VfZGlkLmIyNDsKKwkJCQkJaW9kZXNjLT5kX2lkLmIyNCA9IGludXNlX2RpZC5iMjQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCsrOworCQkJCQlydmFsID0gcWxhMngwMF9maW5kX25ld19sb29wX2lkKGhhLAorCQkJCQkgICAgcmVtb3RlX2ZjcG9ydCk7CisJCQkJCWlmIChydmFsID09IFFMQV9GVU5DVElPTl9GQUlMRUQpIHsKKwkJCQkJCS8qIE5vIG1vcmUgbG9vcCBpZHMuICovCisJCQkJCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAobWJbMF0gPT0gTUJTX1BPUlRfSURfVVNFRCkgeworCQkJCS8qCisJCQkJICogRGV2aWNlIGhhcyBhbm90aGVyIGxvb3AgSUQuICBUaGUgZmlybXdhcmUKKwkJCQkgKiBncm91cCByZWNvbW1lbmRzIHRoZSBkcml2ZXIgcGVyZm9ybSBhbgorCQkJCSAqIGltcGxpY2l0IGxvZ2luIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KKwkJCQkgKi8KKwkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIHBvcnQgIgorCQkJCSAgICAiaWQgWyUwMnglMDJ4JTAyeF0gYWxyZWFkeSBhc3NpZ25lZCB0byAiCisJCQkJICAgICJsb29wIGlkIFsleF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJCQkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLAorCQkJCSAgICBpb2Rlc2MtPmRfaWQuYi5hbF9wYSwgbWJbMV0pKTsKKworCQkJCXJlbW90ZV9mY3BvcnQtPmxvb3BfaWQgPSBtYlsxXTsKKworCQkJfSBlbHNlIHsKKwkJCQkvKiBVbmFibGUgdG8gcGVyZm9ybSBsb2dpbiwgdHJ5IGFnYWluLiAqLworCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gIgorCQkJCSAgICAiZmFpbGVkIGxvZ2luIFsleC8lMDJ4JTAyeCUwMnhdLCBzdGF0dXM9JXggIgorCQkJCSAgICAibWIwPSV4IG1iMT0leCBtYjI9JXggbWI2PSV4IG1iNz0leC5cbiIsCisJCQkJICAgIGhhLT5ob3N0X25vLCByZW1vdGVfZmNwb3J0LT5sb29wX2lkLAorCQkJCSAgICBpb2Rlc2MtPmRfaWQuYi5kb21haW4sIGlvZGVzYy0+ZF9pZC5iLmFyZWEsCisJCQkJICAgIGlvZGVzYy0+ZF9pZC5iLmFsX3BhLCBzdGF0dXMsIG1iWzBdLCBtYlsxXSwKKwkJCQkgICAgbWJbMl0sIG1iWzZdLCBtYls3XSkpOworCQkJfQorCisJCQkvKiBSZWlzc3VlIExvZ2luIHdpdGggdGhlIHNhbWUgSU8gZGVzY3JpcHRvci4gKi8KKwkJCWlvZGVzYy0+c2lnbmF0dXJlID0KKwkJCSAgICBxbGEyeDAwX2lvZGVzY190b19oYW5kbGUoaW9kZXNjKTsKKwkJCWlvZGVzYy0+Y2JfaWR4ID0gTE9HSU5fUE9SVF9JT0NCX0NCOworCQkJaW9kZXNjLT5kX2lkLmIyNCA9IHJlbW90ZV9mY3BvcnQtPmRfaWQuYjI0OworCQkJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0gaW9kZXNjLT5pZHg7CisJCQlyZW1vdGVfZmNwb3J0LT5sb2dpbl9yZXRyeS0tOworCisJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBMb2dpbiBJT0NCIC0tIHJldHJ5aW5nICIKKwkJCSAgICAibG9naW4gdG8gWyV4LyUwMnglMDJ4JTAyeF0gKCVkKS5cbiIsIGhhLT5ob3N0X25vLAorCQkJICAgIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEsCisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+bG9naW5fcmV0cnkpKTsKKworCQkJcWxhMngwMF9zZW5kX2xvZ2luX2lvY2IoaGEsIGlvZGVzYywKKwkJCSAgICAmcmVtb3RlX2ZjcG9ydC0+ZF9pZCwgMSk7CisKKwkJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJCX0gZWxzZSB7CisJCQkvKiBObyBtb3JlIGxvZ2lucywgbWFyayBkZXZpY2UgZGVhZC4gKi8KKwkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gZmFpbGVkICIKKwkJCSAgICAibG9naW4gWyV4LyUwMnglMDJ4JTAyeF0gYWZ0ZXIgcmV0cmllcywgc3RhdHVzPSV4ICIKKwkJCSAgICAibWIwPSV4IG1iMT0leCBtYjI9JXggbWI2PSV4IG1iNz0leC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8sIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLAorCQkJICAgIGlvZGVzYy0+ZF9pZC5iLmFsX3BhLCBzdGF0dXMsIG1iWzBdLCBtYlsxXSwKKwkJCSAgICBtYlsyXSwgbWJbNl0sIG1iWzddKSk7CisKKwkJCWF0b21pY19zZXQoJnJlbW90ZV9mY3BvcnQtPnN0YXRlLCBGQ1NfREVWSUNFX0RFQUQpOworCQkJaWYgKHJlbW90ZV9mY3BvcnQtPnBvcnRfdHlwZSA9PSBGQ1RfUlNDTikgeworCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IExvZ2luIElPQ0IgLS0gIgorCQkJCSAgICAiRnJlZWluZyBkZWFkIFJTQ04gZmNwb3J0ICVwICIKKwkJCQkgICAgIlsleC8lMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sCisJCQkJICAgIHJlbW90ZV9mY3BvcnQsIHJlbW90ZV9mY3BvcnQtPmxvb3BfaWQsCisJCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQkJCWxpc3RfZGVsKCZyZW1vdGVfZmNwb3J0LT5saXN0KTsKKwkJCQlrZnJlZShyZW1vdGVfZmNwb3J0KTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoUUxBX1NVQ0NFU1MpOworfQorCisKKy8qKiAKKyAqIElPIGRlc2NyaXB0b3IgcHJvY2Vzc2luZyByb3V0aW5lcy4KKyAqKi8KKworLyoqCisgKiBxbGEyeDAwX2FsbG9jX3JzY25fZmNwb3J0KCkgLSBBbGxvY2F0ZSBhbiBSU0NOIHR5cGUgZmNwb3J0LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAZmxhZ3M6IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIFJTQ04gZmNwb3J0LCBvciBOVUxMLCBpZiBub25lIGF2YWlsYWJsZS4KKyAqLworZmNfcG9ydF90ICoKK3FsYTJ4MDBfYWxsb2NfcnNjbl9mY3BvcnQoc2NzaV9xbGFfaG9zdF90ICpoYSwgaW50IGZsYWdzKQoreworCWZjX3BvcnRfdCAqZmNwb3J0OworCisJZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQoaGEsIGZsYWdzKTsKKwlpZiAoZmNwb3J0ID09IE5VTEwpCisJCXJldHVybiAoZmNwb3J0KTsKKworCS8qIFNldHVwIFJTQ04gZmNwb3J0IHN0cnVjdHVyZS4gKi8KKwlmY3BvcnQtPnBvcnRfdHlwZSA9IEZDVF9SU0NOOworCisJcmV0dXJuIChmY3BvcnQpOworfQorCisvKioKKyAqIHFsYTJ4MDBfaGFuZGxlX3BvcnRfcnNjbigpIC0gSGFuZGxlIHBvcnQgUlNDTi4KKyAqIEBoYTogSEEgY29udGV4dAorICogQHJzY25fZW50cnk6IFJTQ04gZW50cnkKKyAqIEBmY3BvcnQ6IGZjcG9ydCBlbnRyeSB0byB1cGRhdGVkCisgKgorICogUmV0dXJucyBRTEFfU1VDQ0VTUyBpZiB0aGUgcG9ydCBSU0NOIHdhcyBoYW5kbGVkLgorICovCitpbnQKK3FsYTJ4MDBfaGFuZGxlX3BvcnRfcnNjbihzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCByc2NuX2VudHJ5LAorICAgIGZjX3BvcnRfdCAqa25vd25fZmNwb3J0LCBpbnQgaGFfbG9ja2VkKQoreworCWludAlydmFsOworCXBvcnRfaWRfdCByc2NuX3BpZDsKKwlmY19wb3J0X3QgKmZjcG9ydCwgKnJlbW90ZV9mY3BvcnQsICpyc2NuX2ZjcG9ydDsKKwlzdHJ1Y3QgaW9fZGVzY3JpcHRvciAqaW9kZXNjOworCisJcmVtb3RlX2ZjcG9ydCA9IE5VTEw7CisJcnNjbl9mY3BvcnQgPSBOVUxMOworCisJLyogUHJlcGFyZSBwb3J0IGlkIGJhc2VkIG9uIGluY29taW5nIGVudHJpZXMuICovCisJaWYgKGtub3duX2ZjcG9ydCkgeworCQlyc2NuX3BpZC5iMjQgPSBrbm93bl9mY3BvcnQtPmRfaWQuYjI0OworCQlyZW1vdGVfZmNwb3J0ID0ga25vd25fZmNwb3J0OworCisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIHByb2Nlc3MgUlNDTiBmb3IgIgorCQkgICAgImZjcG9ydCBbJTAyeCUwMnglMDJ4XS5cbiIsIGhhLT5ob3N0X25vLAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgcmVtb3RlX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICByZW1vdGVfZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwl9IGVsc2UgeworCQlyc2NuX3BpZC5iLmRvbWFpbiA9IExTQihNU1cocnNjbl9lbnRyeSkpOworCQlyc2NuX3BpZC5iLmFyZWEgPSBNU0IoTFNXKHJzY25fZW50cnkpKTsKKwkJcnNjbl9waWQuYi5hbF9wYSA9IExTQihMU1cocnNjbl9lbnRyeSkpOworCisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIHByb2Nlc3MgUlNDTiBmb3IgIgorCQkgICAgInBvcnQgaWQgWyUwMnglMDJ4JTAyeF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIHJzY25fcGlkLmIuZG9tYWluLCByc2NuX3BpZC5iLmFyZWEsIHJzY25fcGlkLmIuYWxfcGEpKTsKKworCQkvKgorCQkgKiBTZWFyY2ggZmNwb3J0IGxpc3RzIGZvciBhIGtub3duIGVudHJ5IGF0IHRoZSBzcGVjaWZpZWQgcG9ydAorCQkgKiBJRC4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJICAgIGlmIChyc2NuX3BpZC5iMjQgPT0gZmNwb3J0LT5kX2lkLmIyNCkgeworCQkJICAgIHJlbW90ZV9mY3BvcnQgPSBmY3BvcnQ7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+cnNjbl9mY3BvcnRzLCBsaXN0KSB7CisJCSAgICBpZiAocnNjbl9waWQuYjI0ID09IGZjcG9ydC0+ZF9pZC5iMjQpIHsKKwkJCSAgICByc2NuX2ZjcG9ydCA9IGZjcG9ydDsKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCQlpZiAocmVtb3RlX2ZjcG9ydCA9PSBOVUxMKQorCQkgICAgcmVtb3RlX2ZjcG9ydCA9IHJzY25fZmNwb3J0OworCX0KKworCS8qIAorCSAqIElmIHRoZSBwb3J0IGlzIGFscmVhZHkgaW4gb3VyIGZjcG9ydCBsaXN0IGFuZCBvbmxpbmUsIHNlbmQgYW4gQURJU0MKKwkgKiB0byBzZWUgaWYgaXQncyBzdGlsbCBhbGl2ZS4gIElzc3VlIGxvZ2luIGlmIGEgbmV3IGZjcG9ydCBvciB0aGUga25vd24KKwkgKiBmY3BvcnQgaXMgY3VycmVudGx5IG9mZmxpbmUuCisJICovCisJaWYgKHJlbW90ZV9mY3BvcnQpIHsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBzZW5kIHJlcXVlc3QgaWYgdGhlIHJlbW90ZSBmY3BvcnQgaXMgY3VycmVudGx5CisJCSAqIHdhaXRpbmcgZm9yIGFuIGF2YWlsYWJsZSBpbyBkZXNjcmlwdG9yLgorCQkgKi8KKwkJaWYgKGtub3duX2ZjcG9ydCA9PSBOVUxMICYmCisJCSAgICAocmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09IElPREVTQ19BRElTQ19ORUVERUQgfHwKKwkJICAgIHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PSBJT0RFU0NfTE9HSU5fTkVFREVEKSkgeworCQkJLyoKKwkJCSAqIElmIHByZXZpb3VzIHdhaXRpbmcgaW8gZGVzY3JpcHRvciBpcyBhbiBBRElTQywgdGhlbgorCQkJICogdGhlIG5ldyBSU0NOIG1heSBjb21lIGZyb20gYSBuZXcgcmVtb3RlIGZjcG9ydCBiZWluZworCQkJICogcGx1Z2dlZCBpbnRvIHRoZSBzYW1lIGxvY2F0aW9uLgorCQkJICovCisJCQlpZiAocmVtb3RlX2ZjcG9ydC0+cG9ydF90eXBlID09IEZDVF9SU0NOKSB7CisJCQkgICAgcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0KKwkJCQlJT0RFU0NfTE9HSU5fTkVFREVEOworCQkJfSBlbHNlIGlmIChyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPT0KKwkJCSAgICBJT0RFU0NfQURJU0NfTkVFREVEKSB7CisJCQkJZmNfcG9ydF90ICpuZXdfZmNwb3J0OworCisJCQkJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0KKwkJCQkgICAgSU9ERVNDX0lOVkFMSURfSU5ERVg7CisKKwkJCQkvKiBDcmVhdGUgbmV3IGZjcG9ydCBmb3IgbGF0ZXIgbG9naW4uICovCisJCQkJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfcnNjbl9mY3BvcnQoaGEsCisJCQkJICAgIGhhX2xvY2tlZCA/IEdGUF9BVE9NSUM6IEdGUF9LRVJORUwpOworCQkJCWlmIChuZXdfZmNwb3J0KSB7CisJCQkJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOICIKKwkJCQkJICAgICItLSBjcmVhdGluZyBSU0NOIGZjcG9ydCAlcCBmb3IgIgorCQkJCQkgICAgImZ1dHVyZSBsb2dpbi5cbiIsIGhhLT5ob3N0X25vLAorCQkJCQkgICAgbmV3X2ZjcG9ydCkpOworCisJCQkJCW5ld19mY3BvcnQtPmRfaWQuYjI0ID0KKwkJCQkJICAgIHJlbW90ZV9mY3BvcnQtPmRfaWQuYjI0OworCQkJCQluZXdfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPQorCQkJCQkgICAgSU9ERVNDX0xPR0lOX05FRURFRDsKKworCQkJCQlsaXN0X2FkZF90YWlsKCZuZXdfZmNwb3J0LT5saXN0LAorCQkJCQkgICAgJmhhLT5yc2NuX2ZjcG9ydHMpOworCQkJCQlzZXRfYml0KElPREVTQ19QUk9DRVNTX05FRURFRCwKKwkJCQkJICAgICZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAiCisJCQkJCSAgICAiLS0gdW5hYmxlIHRvIGFsbG9jYXRlIFJTQ04gZmNwb3J0ICIKKwkJCQkJICAgICJmb3IgZnV0dXJlIGxvZ2luLlxuIiwKKwkJCQkJICAgIGhhLT5ob3N0X25vKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJCX0KKwkJCisJCS8qIFNlbmQgQURJU0MgaWYgdGhlIGZjcG9ydCBpcyBvbmxpbmUgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZyZW1vdGVfZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSB8fAorCQkgICAgcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09IElPREVTQ19BRElTQ19ORUVERUQpIHsKKworCQkJYXRvbWljX3NldCgmcmVtb3RlX2ZjcG9ydC0+c3RhdGUsIEZDU19ERVZJQ0VfTE9TVCk7CisKKwkJCWlvZGVzYyA9IHFsYTJ4MDBfYWxsb2NfaW9kZXNjKGhhKTsKKwkJCWlmIChpb2Rlc2MgPT0gTlVMTCkgeworCQkJCS8qIE1hcmsgZmNwb3J0IGZvciBsYXRlciBhZGlzYyBwcm9jZXNzaW5nICovCisJCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogSGFuZGxlIFJTQ04gLS0gbm90ICIKKwkJCQkgICAgImVub3VnaCBJTyBkZXNjcmlwdG9ycyBmb3IgQWRpc2MsIGZsYWcgIgorCQkJCSAgICAiZm9yIGxhdGVyIHByb2Nlc3NpbmcuXG4iLCBoYS0+aG9zdF9ubykpOworCisJCQkJcmVtb3RlX2ZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID0KKwkJCQkgICAgSU9ERVNDX0FESVNDX05FRURFRDsKKwkJCQlzZXRfYml0KElPREVTQ19QUk9DRVNTX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCisJCQkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJCQl9CisKKwkJCWlvZGVzYy0+Y2JfaWR4ID0gQURJU0NfUE9SVF9JT0NCX0NCOworCQkJaW9kZXNjLT5kX2lkLmIyNCA9IHJzY25fcGlkLmIyNDsKKwkJCWlvZGVzYy0+cmVtb3RlX2ZjcG9ydCA9IHJlbW90ZV9mY3BvcnQ7CisJCQlyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPSBpb2Rlc2MtPmlkeDsKKwkJCXFsYTJ4MDBfc2VuZF9hZGlzY19pb2NiKGhhLCBpb2Rlc2MsIGhhX2xvY2tlZCk7CisKKwkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOworCQl9IGVsc2UgaWYgKHJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA8CisJCSAgICBNQVhfSU9fREVTQ1JJUFRPUlMgJiYKKwkJICAgIGhhLT5pb19kZXNjcmlwdG9yc1tyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnRdLmNiX2lkeCA9PQorCQkgICAgQURJU0NfUE9SVF9JT0NCX0NCKSB7CisJCQkvKgorCQkJICogUmVjZWl2aW5nIGFub3RoZXIgUlNDTiB3aGlsZSBhbiBBRElTQyBpcyBwZW5kaW5nLAorCQkJICogYWJvcnQgdGhlIElPQ0IuICBVc2UgdGhlIHNhbWUgZGVzY3JpcHRvciBmb3IgdGhlCisJCQkgKiBhYm9ydC4KKwkJCSAqLworCQkJdWludDMyX3QgaGFuZGxlX3RvX2Fib3J0OworCQkJCisJCQlpb2Rlc2MgPSAmaGEtPmlvX2Rlc2NyaXB0b3JzWworCQkJCXJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudF07CisJCQlxbGEyeDAwX3JlbW92ZV9pb2Rlc2NfdGltZXIoaW9kZXNjKTsKKwkJCWhhbmRsZV90b19hYm9ydCA9IGlvZGVzYy0+c2lnbmF0dXJlOworCQkJaW9kZXNjLT5zaWduYXR1cmUgPSBxbGEyeDAwX2lvZGVzY190b19oYW5kbGUoaW9kZXNjKTsKKwkJCWlvZGVzYy0+Y2JfaWR4ID0gQUJPUlRfSU9DQl9DQjsKKwkJCWlvZGVzYy0+ZF9pZC5iMjQgPSByZW1vdGVfZmNwb3J0LT5kX2lkLmIyNDsKKwkJCWlvZGVzYy0+cmVtb3RlX2ZjcG9ydCA9IHJlbW90ZV9mY3BvcnQ7CisJCQlyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPSBpb2Rlc2MtPmlkeDsKKworCQkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogSGFuZGxlIFJTQ04gLS0gaXNzdWluZyAiCisJCQkgICAgImFib3J0IHRvIG91dHN0YW5kaW5nIEFkaXNjIFsleC8lMDJ4JTAyeCUwMnhdLlxuIiwKKwkJCSAgICBoYS0+aG9zdF9ubywgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkJCSAgICBpb2Rlc2MtPmRfaWQuYi5kb21haW4sIGlvZGVzYy0+ZF9pZC5iLmFyZWEsCisJCQkgICAgaW9kZXNjLT5kX2lkLmIuYWxfcGEpKTsKKworCQkJcWxhMngwMF9zZW5kX2Fib3J0X2lvY2IoaGEsIGlvZGVzYywgaGFuZGxlX3RvX2Fib3J0LAorCQkJICAgIGhhX2xvY2tlZCk7CisJCX0KKwl9CisKKwkvKiBXZSBuZWVkIHRvIGxvZ2luIHRvIHRoZSByZW1vdGUgcG9ydCwgZmluZCBpdC4gKi8KKwlpZiAoa25vd25fZmNwb3J0KSB7CisJCXJlbW90ZV9mY3BvcnQgPSBrbm93bl9mY3BvcnQ7CisJfSBlbHNlIGlmIChyc2NuX2ZjcG9ydCAmJiByc2NuX2ZjcG9ydC0+ZF9pZC5iMjQgIT0gSU5WQUxJRF9QT1JUX0lEICYmCisJICAgIHJzY25fZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPCBNQVhfSU9fREVTQ1JJUFRPUlMgJiYKKwkgICAgaGEtPmlvX2Rlc2NyaXB0b3JzW3JzY25fZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnRdLmNiX2lkeCA9PQorCSAgICBMT0dJTl9QT1JUX0lPQ0JfQ0IpIHsKKwkJLyoKKwkJICogSWdub3JlIGR1cGxpY2F0ZSBSU0NOIG9uIGZjcG9ydCB3aGljaCBoYXMgYWxyZWFkeQorCQkgKiBpbml0aWF0ZWQgYSBsb2dpbiBJT0NCLgorCQkgKi8KKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogSGFuZGxlIFJTQ04gLS0gaWdub3JpbmcsIGxvZ2luICIKKwkJICAgICJhbHJlYWR5IHNlbnQgdG8gWyUwMnglMDJ4JTAyeF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIHJzY25fZmNwb3J0LT5kX2lkLmIuZG9tYWluLCByc2NuX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICByc2NuX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfSBlbHNlIGlmIChyc2NuX2ZjcG9ydCAmJiByc2NuX2ZjcG9ydC0+ZF9pZC5iMjQgIT0gSU5WQUxJRF9QT1JUX0lEICYmCisJICAgIHJzY25fZmNwb3J0ICE9IHJlbW90ZV9mY3BvcnQpIHsKKwkJLyogUmV1c2Ugc2FtZSByc2NuIGZjcG9ydC4gKi8KKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogSGFuZGxlIFJTQ04gLS0gcmV1c2luZyBSU0NOIGZjcG9ydCAiCisJCSAgICAiWyUwMnglMDJ4JTAyeF0uXG4iLCBoYS0+aG9zdF9ubywKKwkJICAgIHJzY25fZmNwb3J0LT5kX2lkLmIuZG9tYWluLCByc2NuX2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICByc2NuX2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisKKwkJcmVtb3RlX2ZjcG9ydCA9IHJzY25fZmNwb3J0OworCX0gZWxzZSB7CisJCS8qIENyZWF0ZSBuZXcgZmNwb3J0IGZvciBsYXRlciBsb2dpbi4gKi8KKwkJcmVtb3RlX2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfcnNjbl9mY3BvcnQoaGEsCisJCSAgICBoYV9sb2NrZWQgPyBHRlBfQVRPTUlDOiBHRlBfS0VSTkVMKTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVtb3RlX2ZjcG9ydC0+bGlzdCwgJmhhLT5yc2NuX2ZjcG9ydHMpOworCX0KKwlpZiAocmVtb3RlX2ZjcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKworCS8qIFByZXBhcmUgZmNwb3J0IGZvciBsb2dpbi4gKi8KKwlhdG9taWNfc2V0KCZyZW1vdGVfZmNwb3J0LT5zdGF0ZSwgRkNTX0RFVklDRV9MT1NUKTsKKwlyZW1vdGVfZmNwb3J0LT5sb2dpbl9yZXRyeSA9IDM7IC8qIGhhLT5sb2dpbl9yZXRyeV9jb3VudDsgKi8KKwlyZW1vdGVfZmNwb3J0LT5kX2lkLmIyNCA9IHJzY25fcGlkLmIyNDsKKworCWlvZGVzYyA9IHFsYTJ4MDBfYWxsb2NfaW9kZXNjKGhhKTsKKwlpZiAoaW9kZXNjID09IE5VTEwpIHsKKwkJLyogTWFyayBmY3BvcnQgZm9yIGxhdGVyIGFkaXNjIHByb2Nlc3NpbmcuICovCisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIG5vdCBlbm91Z2ggSU8gIgorCQkgICAgImRlc2NyaXB0b3JzIGZvciBMb2dpbiwgZmxhZyBmb3IgbGF0ZXIgcHJvY2Vzc2luZy5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCisJCXJlbW90ZV9mY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9IElPREVTQ19MT0dJTl9ORUVERUQ7CisJCXNldF9iaXQoSU9ERVNDX1BST0NFU1NfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisKKwkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CisJfQorCisJaWYgKGtub3duX2ZjcG9ydCA9PSBOVUxMIHx8IHJzY25fcGlkLmIyNCAhPSBJTlZBTElEX1BPUlRfSUQpIHsKKwkJcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCA9IGhhLT5taW5fZXh0ZXJuYWxfbG9vcGlkOworCisJCXJ2YWwgPSBxbGEyeDAwX2ZpbmRfbmV3X2xvb3BfaWQoaGEsIHJlbW90ZV9mY3BvcnQpOworCQlpZiAocnZhbCA9PSBRTEFfRlVOQ1RJT05fRkFJTEVEKSB7CisJCQkvKiBObyBtb3JlIGxvb3AgaWRzLCBmYWlsZWQuICovCisJCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBIYW5kbGUgUlNDTiAtLSBubyBhdmFpbGFibGUgIgorCQkJICAgICJsb29wIGlkIHRvIHBlcmZvcm0gTG9naW4sIGZhaWxlZC5cbiIsCisJCQkgICAgaGEtPmhvc3Rfbm8pKTsKKworCQkJcmV0dXJuIChydmFsKTsKKwkJfQorCX0KKworCWlvZGVzYy0+Y2JfaWR4ID0gTE9HSU5fUE9SVF9JT0NCX0NCOworCWlvZGVzYy0+ZF9pZC5iMjQgPSByc2NuX3BpZC5iMjQ7CisJaW9kZXNjLT5yZW1vdGVfZmNwb3J0ID0gcmVtb3RlX2ZjcG9ydDsKKwlyZW1vdGVfZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPSBpb2Rlc2MtPmlkeDsKKworCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IEhhbmRsZSBSU0NOIC0tIGF0dGVtcHRpbmcgbG9naW4gdG8gIgorCSAgICAiWyV4LyUwMnglMDJ4JTAyeF0uXG4iLCBoYS0+aG9zdF9ubywgcmVtb3RlX2ZjcG9ydC0+bG9vcF9pZCwKKwkgICAgaW9kZXNjLT5kX2lkLmIuZG9tYWluLCBpb2Rlc2MtPmRfaWQuYi5hcmVhLCBpb2Rlc2MtPmRfaWQuYi5hbF9wYSkpOworCisJcWxhMngwMF9zZW5kX2xvZ2luX2lvY2IoaGEsIGlvZGVzYywgJnJzY25fcGlkLCBoYV9sb2NrZWQpOworCisJcmV0dXJuIChRTEFfU1VDQ0VTUyk7Cit9CisKKy8qKgorICogcWxhMngwMF9wcm9jZXNzX2lvZGVzYygpIC0gQ29tcGxldGUgSU8gZGVzY3JpcHRvciBwcm9jZXNzaW5nLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbWJ4c3RhdDogTWFpbGJveCBJT0NCIHN0YXR1cworICovCit2b2lkCitxbGEyeDAwX3Byb2Nlc3NfaW9kZXNjKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN0cnVjdCBtYnhfZW50cnkgKm1ieHN0YXQpCit7CisJaW50IHJ2YWw7CisJdWludDMyX3Qgc2lnbmF0dXJlOworCWZjX3BvcnRfdCAqZmNwb3J0OworCXN0cnVjdCBpb19kZXNjcmlwdG9yICppb2Rlc2M7CisKKwlzaWduYXR1cmUgPSBtYnhzdGF0LT5oYW5kbGU7CisKKwlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBQcm9jZXNzIElPRGVzYyAtLSBwcm9jZXNzaW5nICUwOHguXG4iLAorCSAgICBoYS0+aG9zdF9ubywgc2lnbmF0dXJlKSk7CisKKwkvKiBSZXRyaWV2ZSBwcm9wZXIgSU8gZGVzY3JpcHRvci4gKi8KKwlpb2Rlc2MgPSBxbGEyeDAwX2hhbmRsZV90b19pb2Rlc2MoaGEsIHNpZ25hdHVyZSk7CisJaWYgKGlvZGVzYyA9PSBOVUxMKSB7CisJCURFQlVHMTQocHJpbnRrKCJzY3NpKCVsZCk6IFByb2Nlc3MgSU9EZXNjIC0tIGlnbm9yaW5nLCAiCisJCSAgICAiaW5jb3JyZWN0IHNpZ25hdHVyZSAlMDh4LlxuIiwgaGEtPmhvc3Rfbm8sIHNpZ25hdHVyZSkpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBTdG9wIElPIGRlc2NyaXB0b3IgdGltZXIuICovCisJcWxhMngwMF9yZW1vdmVfaW9kZXNjX3RpbWVyKGlvZGVzYyk7CisKKwkvKiBWZXJpZnkgc2lnbmF0dXJlIG1hdGNoLiAqLworCWlmIChpb2Rlc2MtPnNpZ25hdHVyZSAhPSBzaWduYXR1cmUpIHsKKwkJREVCVUcxNChwcmludGsoInNjc2koJWxkKTogUHJvY2VzcyBJT0Rlc2MgLS0gaWdub3JpbmcsICIKKwkJICAgICJzaWduYXR1cmUgbWlzbWF0Y2gsIHNlbnQgJTA4eCwgcmVjZWl2ZWQgJTA4eC5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgaW9kZXNjLT5zaWduYXR1cmUsIHNpZ25hdHVyZSkpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBHbyB3aXRoIElPQ0IgY2FsbGJhY2suICovCisJcnZhbCA9IGlvY2JfZnVuY3Rpb25fY2JfbGlzdFtpb2Rlc2MtPmNiX2lkeF0oaGEsIGlvZGVzYywgbWJ4c3RhdCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLyogSU8gZGVzY3JpcHRvciByZXVzZWQgYnkgY2FsbGJhY2suICovCisJCXJldHVybjsKKwl9CisKKwlxbGEyeDAwX2ZyZWVfaW9kZXNjKGlvZGVzYyk7CisKKwlpZiAodGVzdF9iaXQoSU9ERVNDX1BST0NFU1NfTkVFREVELCAmaGEtPmRwY19mbGFncykpIHsKKwkJLyogU2NhbiBvdXIgZmNwb3J0cyBsaXN0IGZvciBhbnkgUlNDTiByZXF1ZXN0cy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+ZmNwb3J0cywgbGlzdCkgeworCQkJaWYgKGZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09IElPREVTQ19BRElTQ19ORUVERUQgfHwKKwkJCSAgICBmY3BvcnQtPmlvZGVzY19pZHhfc2VudCA9PSBJT0RFU0NfTE9HSU5fTkVFREVEKSB7CisJCQkJcWxhMngwMF9oYW5kbGVfcG9ydF9yc2NuKGhhLCAwLCBmY3BvcnQsIDEpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIFNjYW4gb3VyIFJTQ04gZmNwb3J0cyBsaXN0IGZvciBhbnkgUlNDTiByZXF1ZXN0cy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZoYS0+cnNjbl9mY3BvcnRzLCBsaXN0KSB7CisJCQlpZiAoZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPT0gSU9ERVNDX0FESVNDX05FRURFRCB8fAorCQkJICAgIGZjcG9ydC0+aW9kZXNjX2lkeF9zZW50ID09IElPREVTQ19MT0dJTl9ORUVERUQpIHsKKwkJCQlxbGEyeDAwX2hhbmRsZV9wb3J0X3JzY24oaGEsIDAsIGZjcG9ydCwgMSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCWNsZWFyX2JpdChJT0RFU0NfUFJPQ0VTU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKK30KKworLyoqCisgKiBxbGEyeDAwX2NhbmNlbF9pb19kZXNjcmlwdG9ycygpIC0gQ2FuY2VsIGFsbCBvdXRzdGFuZGluZyBpbyBkZXNjcmlwdG9ycy4KKyAqIEBoYTogSEEgY29udGV4dAorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGFsc28gZGVsZXRlIGFueSBSU0NOIGVudHJpZXMgcmVsYXRlZCB0byB0aGUgb3V0c3RhbmRpbmcKKyAqIElPIGRlc2NyaXB0b3JzLgorICovCit2b2lkCitxbGEyeDAwX2NhbmNlbF9pb19kZXNjcmlwdG9ycyhzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWZjX3BvcnRfdCAqZmNwb3J0LCAqZmNwdGVtcDsKKworCWNsZWFyX2JpdChJT0RFU0NfUFJPQ0VTU19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKKworCS8qIEFib3J0IGFsbCBJTyBkZXNjcmlwdG9ycy4gKi8KKwlxbGEyeDAwX2luaXRfaW9fZGVzY3JpcHRvcnMoaGEpOworCisJLyogUmVzZXQgYWxsIHBlbmRpbmcgSU8gZGVzY3JpcHRvcnMgaW4gZmNwb3J0cyBsaXN0LiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmaGEtPmZjcG9ydHMsIGxpc3QpIHsKKwkJZmNwb3J0LT5pb2Rlc2NfaWR4X3NlbnQgPSBJT0RFU0NfSU5WQUxJRF9JTkRFWDsKKwl9CisKKwkvKiBSZXNldCBhbGwgcGVuZGluZyBJTyBkZXNjcmlwdG9ycyBpbiByc2NuIGZjcG9ydHMgbGlzdC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNwb3J0LCBmY3B0ZW1wLCAmaGEtPnJzY25fZmNwb3J0cywgbGlzdCkgeworCQlERUJVRzE0KHByaW50aygic2NzaSglbGQpOiBDYW5jZWwgSU9zIC0tIEZyZWVpbmcgUlNDTiBmY3BvcnQgIgorCQkgICAgIiVwIFsleC8lMDJ4JTAyeCUwMnhdLlxuIiwgaGEtPmhvc3Rfbm8sIGZjcG9ydCwKKwkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKworCQlsaXN0X2RlbCgmZmNwb3J0LT5saXN0KTsKKwkJa2ZyZWUoZmNwb3J0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc2V0dGluZ3MuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OGY1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc2V0dGluZ3MuaApAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDb21waWxlIHRpbWUgT3B0aW9uczoKKyAqICAgICAwIC0gRGlzYWJsZSBhbmQgMSAtIEVuYWJsZQorICovCisjZGVmaW5lIERFQlVHX1FMQTIxMDAJCTAJLyogRm9yIERlYnVnIG9mIHFsYTJ4MDAgKi8KKworI2RlZmluZSBTVE9QX09OX1JFU0VUCQkwCisjZGVmaW5lIFVTRV9BQk9SVF9UR1QJCTEJLyogVXNlIEFib3J0IFRhcmdldCBtYnggY21kICovCisKKyNkZWZpbmUgVlNBCQkJMAkvKiBWb2x1bWUgU2V0IEFkZHJlc3NpbmcgKi8KKworLyogRmFpbG92ZXIgb3B0aW9ucyAqLworI2RlZmluZSBNQVhfUkVDT1ZFUllUSU1FCTEwCS8qCisJCQkJCSAqIE1heCBzdXNwZW5kIHRpbWUgZm9yIGEgbHVuIHJlY292ZXJ5CisJCQkJCSAqIHRpbWUKKwkJCQkJICovCisjZGVmaW5lIE1BWF9GQUlMQkFDS1RJTUUJNQkvKiBNYXggc3VzcGVuZCB0aW1lIGJlZm9yZSBmYWlsIGJhY2sgKi8KKworI2RlZmluZSBRTEFfQ01EX1RJTUVSX0RFTFRBCTMKKworLyogCisgKiBXaGVuIGEgbHVuIGlzIHN1c3BlbmRlZCBmb3IgdGhlICJOb3QgUmVhZHkiIGNvbmRpdGlvbiB0aGVuIGl0IHdpbGwgc3VzcGVuZAorICogdGhlIGx1biBmb3IgaW5jcmVtZW50cyBvZiA2IHNlYyBkZWxheXMuICBTVVNQRU5EX0NPVU5UIGlzIHRoYXQgY291bnQuCisgKi8KKyNkZWZpbmUgU1VTUEVORF9DT1VOVAkJMTAJLyogNiBzZWNzICogMTAgcmV0cmllcyA9IDYwIHNlY3MgKi8KKworLyoKKyAqIERlZmluZXMgdGhlIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSBkcml2ZXIgZXh0ZW5kcyB0aGUgY29tbWFuZCB0aW1lb3V0IHRvCisgKiBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIHdoZXJlIHRoZSBtaWQtbGF5ZXIgb25seSBhbGxvd3MgNSByZXRyaWVzIGZvcgorICogY29tbWFuZHMgdGhhdCByZXR1cm4gQlVTX0JVU1kKKyAqLworI2RlZmluZSBFWFRFTkRfQ01EX1RJTUVPVVQJNjAKKworI2RlZmluZSBNQVhfUkVUUklFU19PRl9JU1BfQUJPUlQJNQorCisvKiBNYXggdGltZSB0byB3YWl0IGZvciB0aGUgbG9vcCB0byBiZSBpbiBMT09QX1JFQURZIHN0YXRlICovCisjZGVmaW5lIE1BWF9MT09QX1RJTUVPVVQJKDYwICogNSkKKyNkZWZpbmUgRUhfQUNUSVZFCQkxCS8qIEVycm9yIGhhbmRsZXIgYWN0aXZlICovCisKKy8qCisgKiBTb21lIHZlbmRvciBzdWJzeXN0ZW1zIGRvIG5vdCByZWNvdmVyIHByb3Blcmx5IGFmdGVyIGEgZGV2aWNlIHJlc2V0LiAgRGVmaW5lCisgKiB0aGUgZm9sbG93aW5nIHRvIGZvcmNlIGEgbG9nb3V0IGFmdGVyIGEgc3VjY2Vzc2Z1bCBkZXZpY2UgcmVzZXQuCisgKi8KKyN1bmRlZiBMT0dPVVRfQUZURVJfREVWSUNFX1JFU0VUCisKKyNpbmNsdWRlICJxbGFfdmVyc2lvbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzVmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgUUxPR0lDIExJTlVYIFNPRlRXQVJFCisgKgorICogUUxvZ2ljIElTUDJ4MDAgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMi42LngKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogKHd3dy5xbG9naWMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicWxhX2RlZi5oIgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgdWludDE2X3QgcWxhMngwMF9udnJhbV9yZXF1ZXN0KHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9pZCBxbGEyeDAwX252X2Rlc2VsZWN0KHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyB2b2lkIHFsYTJ4MDBfbnZfd3JpdGUoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90KTsKKworLyoKKyAqIE5WUkFNIHN1cHBvcnQgcm91dGluZXMKKyAqLworCisvKioKKyAqIHFsYTJ4MDBfbG9ja19udnJhbV9hY2Nlc3MoKSAtIAorICogQGhhOiBIQSBjb250ZXh0CisgKi8KK3ZvaWQKK3FsYTJ4MDBfbG9ja19udnJhbV9hY2Nlc3Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwl1aW50MTZfdCBkYXRhOworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiAhSVNfUUxBMjIwMChoYSkgJiYgIUlTX1FMQTIzMDAoaGEpKSB7CisJCWRhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CisJCXdoaWxlIChkYXRhICYgTlZSX0JVU1kpIHsKKwkJCXVkZWxheSgxMDApOworCQkJZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsKKwkJfQorCisJCS8qIExvY2sgcmVzb3VyY2UgKi8KKwkJV1JUX1JFR19XT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3NlbWFwaG9yZSwgMHgxKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc2VtYXBob3JlKTsKKwkJdWRlbGF5KDUpOworCQlkYXRhID0gUkRfUkVHX1dPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc2VtYXBob3JlKTsKKwkJd2hpbGUgKChkYXRhICYgQklUXzApID09IDApIHsKKwkJCS8qIExvY2sgZmFpbGVkICovCisJCQl1ZGVsYXkoMTAwKTsKKwkJCVdSVF9SRUdfV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zZW1hcGhvcmUsIDB4MSk7CisJCQlSRF9SRUdfV09SRCgmcmVnLT51LmlzcDIzMDAuaG9zdF9zZW1hcGhvcmUpOworCQkJdWRlbGF5KDUpOworCQkJZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPnUuaXNwMjMwMC5ob3N0X3NlbWFwaG9yZSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogcWxhMngwMF91bmxvY2tfbnZyYW1fYWNjZXNzKCkgLSAKKyAqIEBoYTogSEEgY29udGV4dAorICovCit2b2lkCitxbGEyeDAwX3VubG9ja19udnJhbV9hY2Nlc3Moc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpICYmICFJU19RTEEyMzAwKGhhKSkgeworCQlXUlRfUkVHX1dPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc2VtYXBob3JlLCAwKTsKKwkJUkRfUkVHX1dPUkQoJnJlZy0+dS5pc3AyMzAwLmhvc3Rfc2VtYXBob3JlKTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9yZWxlYXNlX252cmFtX3Byb3RlY3Rpb24oKSAtIAorICogQGhhOiBIQSBjb250ZXh0CisgKi8KK3ZvaWQKK3FsYTJ4MDBfcmVsZWFzZV9udnJhbV9wcm90ZWN0aW9uKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJZGV2aWNlX3JlZ190ICpyZWc7CisJdWludDMyX3Qgd29yZDsKKworCXJlZyA9IGhhLT5pb2Jhc2U7CisKKwkvKiBSZWxlYXNlIE5WUkFNIHdyaXRlIHByb3RlY3Rpb24uICovCisJaWYgKElTX1FMQTIzMjIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKSB7CisJCS8qIFdyaXRlIGVuYWJsZS4gKi8KKwkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKKwkJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIDApOworCQlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgODsgd29yZCsrKQorCQkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKKworCQlxbGEyeDAwX252X2Rlc2VsZWN0KGhhKTsKKworCQkvKiBFbmFibGUgcHJvdGVjdGlvbiByZWdpc3Rlci4gKi8KKwkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX1BSX0VOQUJMRSB8IE5WUl9EQVRBX09VVCk7CisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9QUl9FTkFCTEUpOworCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfUFJfRU5BQkxFKTsKKwkJZm9yICh3b3JkID0gMDsgd29yZCA8IDg7IHdvcmQrKykKKwkJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCB8IE5WUl9QUl9FTkFCTEUpOworCisJCXFsYTJ4MDBfbnZfZGVzZWxlY3QoaGEpOworCisJCS8qIENsZWFyIHByb3RlY3Rpb24gcmVnaXN0ZXIgKGZmZmYgaXMgY2xlYXJlZCkuICovCisJCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9QUl9FTkFCTEUgfCBOVlJfREFUQV9PVVQpOworCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfUFJfRU5BQkxFIHwgTlZSX0RBVEFfT1VUKTsKKwkJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX1BSX0VOQUJMRSB8IE5WUl9EQVRBX09VVCk7CisJCWZvciAod29yZCA9IDA7IHdvcmQgPCA4OyB3b3JkKyspCisJCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQgfCBOVlJfUFJfRU5BQkxFKTsKKworCQlxbGEyeDAwX252X2Rlc2VsZWN0KGhhKTsKKworCQkvKiBXYWl0IGZvciBOVlJBTSB0byBiZWNvbWUgcmVhZHkuICovCisJCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZSX1NFTEVDVCk7CisJCWRvIHsKKwkJCU5WUkFNX0RFTEFZKCk7CisJCQl3b3JkID0gUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOworCQl9IHdoaWxlICgod29yZCAmIE5WUl9EQVRBX0lOKSA9PSAwKTsKKwl9Cit9CisKKy8qKgorICogcWxhMngwMF9nZXRfbnZyYW1fd29yZCgpIC0gQ2FsY3VsYXRlcyB3b3JkIHBvc2l0aW9uIGluIE5WUkFNIGFuZCBjYWxscyB0aGUKKyAqCXJlcXVlc3Qgcm91dGluZSB0byBnZXQgdGhlIHdvcmQgZnJvbSBOVlJBTS4KKyAqIEBoYTogSEEgY29udGV4dAorICogQGFkZHI6IEFkZHJlc3MgaW4gTlZSQU0gdG8gcmVhZAorICoKKyAqIFJldHVybnMgdGhlIHdvcmQgcmVhZCBmcm9tIG52cmFtIEBhZGRyLgorICovCit1aW50MTZfdAorcWxhMngwMF9nZXRfbnZyYW1fd29yZChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBhZGRyKQoreworCXVpbnQxNl90CWRhdGE7CisJdWludDMyX3QJbnZfY21kOworCisJbnZfY21kID0gYWRkciA8PCAxNjsKKwludl9jbWQgfD0gTlZfUkVBRF9PUDsKKwlkYXRhID0gcWxhMngwMF9udnJhbV9yZXF1ZXN0KGhhLCBudl9jbWQpOworCisJcmV0dXJuIChkYXRhKTsKK30KKworLyoqCisgKiBxbGEyeDAwX3dyaXRlX252cmFtX3dvcmQoKSAtIFdyaXRlIE5WUkFNIGRhdGEuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBhZGRyOiBBZGRyZXNzIGluIE5WUkFNIHRvIHdyaXRlCisgKiBAZGF0YTogd29yZCB0byBwcm9ncmFtCisgKi8KK3ZvaWQKK3FsYTJ4MDBfd3JpdGVfbnZyYW1fd29yZChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBhZGRyLCB1aW50MTZfdCBkYXRhKQoreworCWludCBjb3VudDsKKwl1aW50MTZfdCB3b3JkOworCXVpbnQzMl90IG52X2NtZDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKworCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCk7CisJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CisJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CisKKwlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgODsgd29yZCsrKQorCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQpOworCisJcWxhMngwMF9udl9kZXNlbGVjdChoYSk7CisKKwkvKiBXcml0ZSBkYXRhICovCisJbnZfY21kID0gKGFkZHIgPDwgMTYpIHwgTlZfV1JJVEVfT1A7CisJbnZfY21kIHw9IGRhdGE7CisJbnZfY21kIDw8PSA1OworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI3OyBjb3VudCsrKSB7CisJCWlmIChudl9jbWQgJiBCSVRfMzEpCisJCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQpOworCQllbHNlCisJCQlxbGEyeDAwX252X3dyaXRlKGhhLCAwKTsKKworCQludl9jbWQgPDw9IDE7CisJfQorCisJcWxhMngwMF9udl9kZXNlbGVjdChoYSk7CisKKwkvKiBXYWl0IGZvciBOVlJBTSB0byBiZWNvbWUgcmVhZHkgKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WUl9TRUxFQ1QpOworCWRvIHsKKwkJTlZSQU1fREVMQVkoKTsKKwkJd29yZCA9IFJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsKKwl9IHdoaWxlICgod29yZCAmIE5WUl9EQVRBX0lOKSA9PSAwKTsKKworCXFsYTJ4MDBfbnZfZGVzZWxlY3QoaGEpOworCisJLyogRGlzYWJsZSB3cml0ZXMgKi8KKwlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwOyBjb3VudCsrKQorCQlxbGEyeDAwX252X3dyaXRlKGhhLCAwKTsKKworCXFsYTJ4MDBfbnZfZGVzZWxlY3QoaGEpOworfQorCisvKioKKyAqIHFsYTJ4MDBfbnZyYW1fcmVxdWVzdCgpIC0gU2VuZHMgcmVhZCBjb21tYW5kIHRvIE5WUkFNIGFuZCBnZXRzIGRhdGEgZnJvbQorICoJTlZSQU0uCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBudl9jbWQ6IE5WUkFNIGNvbW1hbmQKKyAqCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIE5WUkFNIGNvbW1hbmQ6CisgKgorICoJQml0IDI2ICAgICA9IHN0YXJ0IGJpdAorICoJQml0IDI1LCAyNCA9IG9wY29kZQorICoJQml0IDIzLTE2ICA9IGFkZHJlc3MKKyAqCUJpdCAxNS0wICAgPSB3cml0ZSBkYXRhCisgKgorICogUmV0dXJucyB0aGUgd29yZCByZWFkIGZyb20gbnZyYW0gQGFkZHIuCisgKi8KK3N0YXRpYyB1aW50MTZfdAorcWxhMngwMF9udnJhbV9yZXF1ZXN0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90IG52X2NtZCkKK3sKKwl1aW50OF90CQljbnQ7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJdWludDE2X3QJZGF0YSA9IDA7CisJdWludDE2X3QJcmVnX2RhdGE7CisKKwkvKiBTZW5kIGNvbW1hbmQgdG8gTlZSQU0uICovCisJbnZfY21kIDw8PSA1OworCWZvciAoY250ID0gMDsgY250IDwgMTE7IGNudCsrKSB7CisJCWlmIChudl9jbWQgJiBCSVRfMzEpCisJCQlxbGEyeDAwX252X3dyaXRlKGhhLCBOVlJfREFUQV9PVVQpOworCQllbHNlCisJCQlxbGEyeDAwX252X3dyaXRlKGhhLCAwKTsKKwkJbnZfY21kIDw8PSAxOworCX0KKworCS8qIFJlYWQgZGF0YSBmcm9tIE5WUkFNLiAqLworCWZvciAoY250ID0gMDsgY250IDwgMTY7IGNudCsrKSB7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZSX1NFTEVDVCB8IE5WUl9DTE9DSyk7CisJCU5WUkFNX0RFTEFZKCk7CisJCWRhdGEgPDw9IDE7CisJCXJlZ19kYXRhID0gUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOworCQlpZiAocmVnX2RhdGEgJiBOVlJfREFUQV9JTikKKwkJCWRhdGEgfD0gQklUXzA7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5udnJhbSwgTlZSX1NFTEVDVCk7CisJCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJLyogUENJIFBvc3RpbmcuICovCisJCU5WUkFNX0RFTEFZKCk7CisJfQorCisJLyogRGVzZWxlY3QgY2hpcC4gKi8KKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIE5WUl9ERVNFTEVDVCk7CisJUkRfUkVHX1dPUkQoJnJlZy0+bnZyYW0pOwkJLyogUENJIFBvc3RpbmcuICovCisJTlZSQU1fREVMQVkoKTsKKworCXJldHVybiAoZGF0YSk7Cit9CisKKy8qKgorICogcWxhMngwMF9udl93cml0ZSgpIC0gQ2xlYW4gTlZSQU0gb3BlcmF0aW9ucy4KKyAqIEBoYTogSEEgY29udGV4dAorICovCitzdGF0aWMgdm9pZAorcWxhMngwMF9udl9kZXNlbGVjdChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBOVlJfREVTRUxFQ1QpOworCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCU5WUkFNX0RFTEFZKCk7Cit9CisKKy8qKgorICogcWxhMngwMF9udl93cml0ZSgpIC0gUHJlcGFyZSBmb3IgTlZSQU0gcmVhZC93cml0ZSBvcGVyYXRpb24uCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBkYXRhOiBTZXJpYWwgaW50ZXJmYWNlIHNlbGVjdG9yCisgKi8KK3N0YXRpYyB2b2lkCitxbGEyeDAwX252X3dyaXRlKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGRhdGEpCit7CisJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisKKwlXUlRfUkVHX1dPUkQoJnJlZy0+bnZyYW0sIGRhdGEgfCBOVlJfU0VMRUNUIHwgTlZSX1dSVF9FTkFCTEUpOworCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCU5WUkFNX0RFTEFZKCk7CisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBkYXRhIHwgTlZSX1NFTEVDVHwgTlZSX0NMT0NLIHwKKwkgICAgTlZSX1dSVF9FTkFCTEUpOworCVJEX1JFR19XT1JEKCZyZWctPm52cmFtKTsJCS8qIFBDSSBQb3N0aW5nLiAqLworCU5WUkFNX0RFTEFZKCk7CisJV1JUX1JFR19XT1JEKCZyZWctPm52cmFtLCBkYXRhIHwgTlZSX1NFTEVDVCB8IE5WUl9XUlRfRU5BQkxFKTsKKwlSRF9SRUdfV09SRCgmcmVnLT5udnJhbSk7CQkvKiBQQ0kgUG9zdGluZy4gKi8KKwlOVlJBTV9ERUxBWSgpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZmODhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIFFMT0dJQyBMSU5VWCBTT0ZUV0FSRQorICoKKyAqIFFMb2dpYyBJU1AyeDAwIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IDIuNi54CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBRTG9naWMgQ29ycG9yYXRpb24KKyAqICh3d3cucWxvZ2ljLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEcml2ZXIgdmVyc2lvbiAKKyAqLworI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMC4wMmI0LWsiCisKKyNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAorI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgkwCisjZGVmaW5lIFFMQV9EUklWRVJfUEFUQ0hfVkVSCTIKKyNkZWZpbmUgUUxBX0RSSVZFUl9CRVRBX1ZFUgk0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhZGIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYXMuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIFFsb2dpYyBGQVM0MDggSVNBIGNhcmQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTQsIFRvbSBaZXJ1Y2hhLiAgIAorICogdHpAZXhlY3BjLmNvbQorICogCisgKiBSZWRpc3RyaWJ1dGFibGUgdW5kZXIgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgorICogRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqCisgKiBDaGVjayBxbG9naWNmYXM0MDguYyBmb3IgbW9yZSBjcmVkaXRzIGFuZCBpbmZvLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4JCS8qIHRvIGdldCBkaXNrIGNhcGFjaXR5ICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJxbG9naWNmYXM0MDguaCIKKworLyogU2V0IHRoZSBmb2xsb3dpbmcgdG8gMiB0byB1c2Ugbm9ybWFsIGludGVycnVwdCAoYWN0aXZlIGhpZ2gvdG90ZW1wb2xlLQorICogdHJpc3RhdGUpLCBvdGhlcndpc2UgdXNlIDAgKFJFUVVJUkVEIEZPUiBQQ01DSUEpIGZvciBhY3RpdmUgbG93LCBvcGVuCisgKiBkcmFpbgorICovCisjZGVmaW5lIElOVF9UWVBFCTIKKworc3RhdGljIGNoYXIgcWxvZ2ljZmFzX25hbWVbXSA9ICJxbG9naWNmYXMiOworCisvKgorICoJTG9vayBmb3IgcWxvZ2ljIGNhcmQgYW5kIGluaXQgaWYgZm91bmQgCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpfX3Fsb2dpY2Zhc19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpob3N0LAorCQkJCQkJCQlpbnQgcWJhc2UsCisJCQkJCQkJCWludCBxbGlycSkKK3sKKwlpbnQgcWx0eXA7CQkvKiB0eXBlIG9mIGNoaXAgKi8KKwlpbnQgcWluaXRpZDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpocmVnOwkvKiByZWdpc3RlcmVkIGhvc3Qgc3RydWN0dXJlICovCisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2OworCisJLyoJUWxvZ2ljIENhcmRzIG9ubHkgZXhpc3QgYXQgMHgyMzAgb3IgMHgzMzAgKHRoZSBjaGlwIGl0c2VsZgorCSAqCWRlY29kZXMgdGhlIGFkZHJlc3MgLSBJIGNoZWNrIDIzMCBmaXJzdCBzaW5jZSBNSURJIGNhcmRzIGFyZQorCSAqCXR5cGljYWxseSBhdCAweDMzMAorCSAqCisJICoJVGhlb3JldGljYWxseSwgdHdvIFFsb2dpYyBjYXJkcyBjYW4gY29leGlzdCBpbiB0aGUgc2FtZSBzeXN0ZW0uCisJICoJVGhpcyBzaG91bGQgd29yayBieSBzaW1wbHkgdXNpbmcgdGhpcyBhcyBhIGxvYWRhYmxlIG1vZHVsZSBmb3IKKwkgKgl0aGUgc2Vjb25kIGNhcmQsIGJ1dCBJIGhhdmVuJ3QgdGVzdGVkIHRoaXMuCisJICovCisKKwlpZiAoIXFiYXNlIHx8IHFsaXJxID09IC0xKQorCQlnb3RvIGVycjsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocWJhc2UsIDB4MTAsIHFsb2dpY2Zhc19uYW1lKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogYWRkcmVzcyAlI3ggaXMgYnVzeVxuIiwgcWxvZ2ljZmFzX25hbWUsCisJCQkJCQkJICAgICAgcWJhc2UpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIXFsb2dpY2ZhczQwOF9kZXRlY3QocWJhc2UsIElOVF9UWVBFKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcHJvYmUgZmFpbGVkIGZvciAlI3hcbiIsCisJCQkJCQkJCXFsb2dpY2Zhc19uYW1lLAorCQkJCQkJCQlxYmFzZSk7CisJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyBwcmVzZXQgYmFzZSBhZGRyZXNzIG9mICUwM3gsIgorCQkJICIgSVJRICVkXG4iLCBxbG9naWNmYXNfbmFtZSwgcWJhc2UsIHFsaXJxKTsKKworCXFsdHlwID0gcWxvZ2ljZmFzNDA4X2dldF9jaGlwX3R5cGUocWJhc2UsIElOVF9UWVBFKTsKKwlxaW5pdGlkID0gaG9zdC0+dGhpc19pZDsKKwlpZiAocWluaXRpZCA8IDApCisJCXFpbml0aWQgPSA3OwkvKiBpZiBubyBJRCwgdXNlIDcgKi8KKworCXFsb2dpY2ZhczQwOF9zZXR1cChxYmFzZSwgcWluaXRpZCwgSU5UX1RZUEUpOworCisJaHJlZyA9IHNjc2lfaG9zdF9hbGxvYyhob3N0LCBzaXplb2Yoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2KSk7CisJaWYgKCFocmVnKQorCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKKwlwcml2ID0gZ2V0X3ByaXZfYnlfaG9zdChocmVnKTsKKwlocmVnLT5pb19wb3J0ID0gcWJhc2U7CisJaHJlZy0+bl9pb19wb3J0ID0gMTY7CisJaHJlZy0+ZG1hX2NoYW5uZWwgPSAtMTsKKwlpZiAocWxpcnEgIT0gLTEpCisJCWhyZWctPmlycSA9IHFsaXJxOworCXByaXYtPnFiYXNlID0gcWJhc2U7CisJcHJpdi0+cWxpcnEgPSBxbGlycTsKKwlwcml2LT5xaW5pdGlkID0gcWluaXRpZDsKKwlwcml2LT5zaG9zdCA9IGhyZWc7CisJcHJpdi0+aW50X3R5cGUgPSBJTlRfVFlQRTsKKworCXNwcmludGYocHJpdi0+cWluZm8sCisJCSJRbG9naWNmYXMgRHJpdmVyIHZlcnNpb24gMC40NiwgY2hpcCAlMDJYIGF0ICUwM1gsIElSUSAlZCwgVFBkbWE6JWQiLAorCQlxbHR5cCwgcWJhc2UsIHFsaXJxLCBRTF9UVVJCT19QRE1BKTsKKwlob3N0LT5uYW1lID0gcWxvZ2ljZmFzX25hbWU7CisKKwlpZiAocmVxdWVzdF9pcnEocWxpcnEsIHFsb2dpY2ZhczQwOF9paGFuZGwsIDAsIHFsb2dpY2Zhc19uYW1lLCBocmVnKSkKKwkJZ290byBmcmVlX3Njc2lfaG9zdDsKKworCWlmIChzY3NpX2FkZF9ob3N0KGhyZWcsIE5VTEwpKQorCQlnb3RvIGZyZWVfaW50ZXJydXB0OworCisJc2NzaV9zY2FuX2hvc3QoaHJlZyk7CisKKwlyZXR1cm4gaHJlZzsKKworZnJlZV9pbnRlcnJ1cHQ6CisJZnJlZV9pcnEocWxpcnEsIGhyZWcpOworCitmcmVlX3Njc2lfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KGhyZWcpOworCitlcnJfcmVsZWFzZV9tZW06CisJcmVsZWFzZV9yZWdpb24ocWJhc2UsIDB4MTApOworZXJyOgorCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIE1BWF9RTE9HSUNGQVMJOAorc3RhdGljIHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqY2FyZHM7CitzdGF0aWMgaW50IGlvYmFzZVtNQVhfUUxPR0lDRkFTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9RTE9HSUNGQVNdID0geyBbMCAuLi4gTUFYX1FMT0dJQ0ZBUy0xXSA9IC0xIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9iYXNlLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9iYXNlLCAiSS9PIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIik7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHFsb2dpY2Zhc19kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICpzaHQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2OworCWludCBudW07CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IE1BWF9RTE9HSUNGQVM7IG51bSsrKSB7CisJCXNob3N0ID0gX19xbG9naWNmYXNfZGV0ZWN0KHNodCwgaW9iYXNlW251bV0sIGlycVtudW1dKTsKKwkJaWYgKHNob3N0ID09IE5VTEwpIHsKKwkJCS8qIG5vIG1vcmUgZGV2aWNlcyAqLworCQkJYnJlYWs7CisJCX0KKwkJcHJpdiA9IGdldF9wcml2X2J5X2hvc3Qoc2hvc3QpOworCQlwcml2LT5uZXh0ID0gY2FyZHM7CisJCWNhcmRzID0gcHJpdjsKKwl9CisKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgaW50IHFsb2dpY2Zhc19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2hvc3Qoc2hvc3QpOworCisJaWYgKHNob3N0LT5pcnEpIHsKKwkJcWxvZ2ljZmFzNDA4X2Rpc2FibGVfaW50cyhwcml2KTsJCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKKwl9CisJaWYgKHNob3N0LT5kbWFfY2hhbm5lbCAhPSAweGZmKQorCQlmcmVlX2RtYShzaG9zdC0+ZG1hX2NoYW5uZWwpOworCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7CisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoZSBkcml2ZXIgdGVtcGxhdGUgaXMgYWxzbyBuZWVkZWQgZm9yIFBDTUNJQQorICovCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIHFsb2dpY2Zhc19kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IHFsb2dpY2Zhc19uYW1lLAorCS5wcm9jX25hbWUJCT0gcWxvZ2ljZmFzX25hbWUsCisJLmluZm8JCQk9IHFsb2dpY2ZhczQwOF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gcWxvZ2ljZmFzNDA4X3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHFsb2dpY2ZhczQwOF9hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcj0gcWxvZ2ljZmFzNDA4X2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gcWxvZ2ljZmFzNDA4X2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gcWxvZ2ljZmFzNDA4X2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLnRoaXNfaWQJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHFsb2dpY2Zhc19pbml0KHZvaWQpCit7CisJaWYgKCFxbG9naWNmYXNfZGV0ZWN0KCZxbG9naWNmYXNfZHJpdmVyX3RlbXBsYXRlKSkgeworCQkvKiBubyBjYXJkcyBmb3VuZCAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gY2FyZHMgd2VyZSBmb3VuZCwgcGxlYXNlIHNwZWNpZnkgIgorCQkJCSAiSS9PIGFkZHJlc3MgYW5kIElSUSB1c2luZyBpb2Jhc2U9IGFuZCBpcnE9ICIKKwkJCQkgIm9wdGlvbnMiLCBxbG9naWNmYXNfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgcWxvZ2ljZmFzX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXY7CisKKwlmb3IgKHByaXYgPSBjYXJkczsgcHJpdiAhPSBOVUxMOyBwcml2ID0gcHJpdi0+bmV4dCkKKwkJcWxvZ2ljZmFzX3JlbGVhc2UocHJpdi0+c2hvc3QpOworfQorCitNT0RVTEVfQVVUSE9SKCJUb20gWmVydWNoYSwgTWljaGFlbCBHcmlmZml0aCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBRbG9naWMgRkFTNDA4IGJhc2VkIElTQSBjYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChxbG9naWNmYXNfaW5pdCk7Cittb2R1bGVfZXhpdChxbG9naWNmYXNfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjZjZTBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jCkBAIC0wLDAgKzEsNjM3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAgIFFsb2dpYyBsaW51eCBkcml2ZXIgLSB3b3JrIGluIHByb2dyZXNzLiBObyBXYXJyYW50eSBleHByZXNzIG9yIGltcGxpZWQuCisgICBVc2UgYXQgeW91ciBvd24gcmlzay4gIFN1cHBvcnQgVG9ydCBSZWZvcm0gc28geW91IHdvbid0IGhhdmUgdG8gcmVhZCBhbGwKKyAgIHRoZXNlIHNpbGx5IGRpc2NsYWltZXJzLgorCisgICBDb3B5cmlnaHQgMTk5NCwgVG9tIFplcnVjaGEuICAgCisgICB0ekBleGVjcGMuY29tCisgICAKKyAgIEFkZGl0aW9uYWwgQ29kZSwgYW5kIG11Y2ggYXBwcmVjaWF0ZWQgaGVscCBieQorICAgTWljaGFlbCBBLiBHcmlmZml0aAorICAgZ3JpZkBjcy51Y3IuZWR1CisKKyAgIFRoYW5rcyB0byBFcmljIFlvdW5nZGFsZSBhbmQgRGF2ZSBIaW5kcyBmb3IgbG9hZGFibGUgbW9kdWxlIGFuZCBQQ01DSUEKKyAgIGhlbHAgcmVzcGVjdGl2ZWx5LCBhbmQgZm9yIHN1ZmZlcmluZyB0aHJvdWdoIG15IGZvb2xpc2huZXNzIGR1cmluZyB0aGUKKyAgIGRlYnVnZ2luZyBwcm9jZXNzLgorCisgICBSZWZlcmVuY2UgUWxvZ2ljIEZBUzQwOCBUZWNobmljYWwgTWFudWFsLCA1MzQwOC01MTAtMDBBLCBNYXkgMTAsIDE5OTQKKyAgICh5b3UgY2FuIHJlZmVyZW5jZSBpdCwgYnV0IGl0IGlzIGluY29tcGxldGUgYW5kIGluYWNjdXJhdGUgaW4gcGxhY2VzKQorCisgICBWZXJzaW9uIDAuNDYgMS8zMC85NyAtIGtlcm5lbCAxLjIuMCsKKworICAgRnVuY3Rpb25zIGFzIHN0YW5kYWxvbmUsIGxvYWRhYmxlLCBhbmQgUENNQ0lBIGRyaXZlciwgdGhlIGxhdHRlciBmcm9tCisgICBEYXZlIEhpbmRzJyBQQ01DSUEgcGFja2FnZS4KKyAgIAorICAgQ2xlYW5lZCB1cCAyNi8xMC8yMDAyIGJ5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IGFzIHBhcnQgb2YgdGhlIDIuNQorICAgU0NTSSBkcml2ZXIgY2xlYW51cCBhbmQgYXVkaXQuIFRoaXMgZHJpdmVyIHN0aWxsIG5lZWRzIHdvcmsgb24gdGhlCisgICBmb2xsb3dpbmcKKyAgIAktCU5vbiB0ZXJtaW5hdGluZyBoYXJkd2FyZSB3YWl0cworICAgCS0JU29tZSBsYXllcmluZyB2aW9sYXRpb25zIHdpdGggaXRzIHBjbWNpYSBzdHViCisKKyAgIFJlZGlzdHJpYnV0YWJsZSB1bmRlciB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKworICAgRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICAgaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgICBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgICBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICAgYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgkJLyogdG8gZ2V0IGRpc2sgY2FwYWNpdHkgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInFsb2dpY2ZhczQwOC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBxbGNmZzUgPSAoWFRBTEZSRVEgPDwgNSk7CS8qIDE1NjI1LzUxMiAqLworc3RhdGljIGludCBxbGNmZzYgPSBTWU5DWEZSUEQ7CitzdGF0aWMgaW50IHFsY2ZnNyA9IFNZTkNPRkZTVDsKK3N0YXRpYyBpbnQgcWxjZmc4ID0gKFNMT1dDQUJMRSA8PCA3KSB8IChRTF9FTkFCTEVfUEFSSVRZIDw8IDQpOworc3RhdGljIGludCBxbGNmZzkgPSAoKFhUQUxGUkVRICsgNCkgLyA1KTsKK3N0YXRpYyBpbnQgcWxjZmdjID0gKEZBU1RDTEsgPDwgMykgfCAoRkFTVFNDU0kgPDwgNCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBsb2NhbCBmdW5jdGlvbnMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGVycm9yIHJlY292ZXJ5IC0gcmVzZXQgZXZlcnl0aGluZyAqLworCitzdGF0aWMgdm9pZCBxbF96YXAoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2KQoreworCWludCB4OworCWludCBxYmFzZSA9IHByaXYtPnFiYXNlOworCWludCBpbnRfdHlwZSA9IHByaXYtPmludF90eXBlOworCisJeCA9IGluYihxYmFzZSArIDB4ZCk7CisJUkVHMDsKKwlvdXRiKDMsIHFiYXNlICsgMyk7CS8qIHJlc2V0IFNDU0kgKi8KKwlvdXRiKDIsIHFiYXNlICsgMyk7CS8qIHJlc2V0IGNoaXAgKi8KKwlpZiAoeCAmIDB4ODApCisJCVJFRzE7Cit9CisKKy8qCisgKglEbyBhIHBzZXVkby1kbWEgdHJhbmZlcgorICovCisgCitzdGF0aWMgaW50IHFsX3BkbWEoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2LCBpbnQgcGhhc2UsIGNoYXIgKnJlcXVlc3QsIGludCByZXFsZW4pCit7CisJaW50IGo7CisJaW50IHFiYXNlID0gcHJpdi0+cWJhc2U7CisJaiA9IDA7CisJaWYgKHBoYXNlICYgMSkgewkvKiBpbiAqLworI2lmIFFMX1RVUkJPX1BETUEKKwkJcnRyYyg0KQorCQkvKiBlbXB0eSBmaWZvIGluIGxhcmdlIGNodW5rcyAqLworCQlpZiAocmVxbGVuID49IDEyOCAmJiAoaW5iKHFiYXNlICsgOCkgJiAyKSkgewkvKiBmdWxsICovCisJCQlpbnNsKHFiYXNlICsgNCwgcmVxdWVzdCwgMzIpOworCQkJcmVxbGVuIC09IDEyODsKKwkJCXJlcXVlc3QgKz0gMTI4OworCQl9CisJCXdoaWxlIChyZXFsZW4gPj0gODQgJiYgIShqICYgMHhjMCkpCS8qIDIvMyAqLworCQkJaWYgKChqID0gaW5iKHFiYXNlICsgOCkpICYgNCkgCisJCQl7CisJCQkJaW5zbChxYmFzZSArIDQsIHJlcXVlc3QsIDIxKTsKKwkJCQlyZXFsZW4gLT0gODQ7CisJCQkJcmVxdWVzdCArPSA4NDsKKwkJCX0KKwkJaWYgKHJlcWxlbiA+PSA0NCAmJiAoaW5iKHFiYXNlICsgOCkgJiA4KSkgewkvKiAxLzMgKi8KKwkJCWluc2wocWJhc2UgKyA0LCByZXF1ZXN0LCAxMSk7CisJCQlyZXFsZW4gLT0gNDQ7CisJCQlyZXF1ZXN0ICs9IDQ0OworCQl9CisjZW5kaWYKKwkJLyogdW50aWwgYm90aCBlbXB0eSBhbmQgaW50IChvciB1bnRpbCByZWNsZW4gaXMgMCkgKi8KKwkJcnRyYyg3KQorCQlqID0gMDsKKwkJd2hpbGUgKHJlcWxlbiAmJiAhKChqICYgMHgxMCkgJiYgKGogJiAweGMwKSkpIAorCQl7CisJCQkvKiB3aGlsZSBieXRlcyB0byByZWNlaXZlIGFuZCBub3QgZW1wdHkgKi8KKwkJCWogJj0gMHhjMDsKKwkJCXdoaWxlIChyZXFsZW4gJiYgISgoaiA9IGluYihxYmFzZSArIDgpKSAmIDB4MTApKSAKKwkJCXsKKwkJCQkqcmVxdWVzdCsrID0gaW5iKHFiYXNlICsgNCk7CisJCQkJcmVxbGVuLS07CisJCQl9CisJCQlpZiAoaiAmIDB4MTApCisJCQkJaiA9IGluYihxYmFzZSArIDgpOworCisJCX0KKwl9IGVsc2UgewkJLyogb3V0ICovCisjaWYgUUxfVFVSQk9fUERNQQorCQlydHJjKDQpCisJCSAgICBpZiAocmVxbGVuID49IDEyOCAmJiBpbmIocWJhc2UgKyA4KSAmIDB4MTApIHsJLyogZW1wdHkgKi8KKwkJCW91dHNsKHFiYXNlICsgNCwgcmVxdWVzdCwgMzIpOworCQkJcmVxbGVuIC09IDEyODsKKwkJCXJlcXVlc3QgKz0gMTI4OworCQl9CisJCXdoaWxlIChyZXFsZW4gPj0gODQgJiYgIShqICYgMHhjMCkpCS8qIDEvMyAqLworCQkJaWYgKCEoKGogPSBpbmIocWJhc2UgKyA4KSkgJiA4KSkgeworCQkJCW91dHNsKHFiYXNlICsgNCwgcmVxdWVzdCwgMjEpOworCQkJCXJlcWxlbiAtPSA4NDsKKwkJCQlyZXF1ZXN0ICs9IDg0OworCQkJfQorCQlpZiAocmVxbGVuID49IDQwICYmICEoaW5iKHFiYXNlICsgOCkgJiA0KSkgewkvKiAyLzMgKi8KKwkJCW91dHNsKHFiYXNlICsgNCwgcmVxdWVzdCwgMTApOworCQkJcmVxbGVuIC09IDQwOworCQkJcmVxdWVzdCArPSA0MDsKKwkJfQorI2VuZGlmCisJCS8qIHVudGlsIGZ1bGwgYW5kIGludCAob3IgdW50aWwgcmVjbGVuIGlzIDApICovCisJCXJ0cmMoNykKKwkJICAgIGogPSAwOworCQl3aGlsZSAocmVxbGVuICYmICEoKGogJiAyKSAmJiAoaiAmIDB4YzApKSkgeworCQkJLyogd2hpbGUgYnl0ZXMgdG8gc2VuZCBhbmQgbm90IGZ1bGwgKi8KKwkJCXdoaWxlIChyZXFsZW4gJiYgISgoaiA9IGluYihxYmFzZSArIDgpKSAmIDIpKSAKKwkJCXsKKwkJCQlvdXRiKCpyZXF1ZXN0KyssIHFiYXNlICsgNCk7CisJCQkJcmVxbGVuLS07CisJCQl9CisJCQlpZiAoaiAmIDIpCisJCQkJaiA9IGluYihxYmFzZSArIDgpOworCQl9CisJfQorCS8qIG1heWJlIHJldHVybiByZXFsZW4gKi8KKwlyZXR1cm4gaW5iKHFiYXNlICsgOCkgJiAweGMwOworfQorCisvKgorICoJV2FpdCBmb3IgaW50ZXJydXB0IGZsYWcgKHBvbGxlZCAtIG5vdCByZWFsIGhhcmR3YXJlIGludGVycnVwdCkgCisgKi8KKworc3RhdGljIGludCBxbF93YWkoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2KQoreworCWludCBrOworCWludCBxYmFzZSA9IHByaXYtPnFiYXNlOworCXVuc2lnbmVkIGxvbmcgaTsKKworCWsgPSAwOworCWkgPSBqaWZmaWVzICsgV0FUQ0hET0c7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGkpICYmICFwcml2LT5xYWJvcnQgJiYKKwkJCQkJISgoayA9IGluYihxYmFzZSArIDQpKSAmIDB4ZTApKSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGkpKQorCQlyZXR1cm4gKERJRF9USU1FX09VVCk7CisJaWYgKHByaXYtPnFhYm9ydCkKKwkJcmV0dXJuIChwcml2LT5xYWJvcnQgPT0gMSA/IERJRF9BQk9SVCA6IERJRF9SRVNFVCk7CisJaWYgKGsgJiAweDYwKQorCQlxbF96YXAocHJpdik7CisJaWYgKGsgJiAweDIwKQorCQlyZXR1cm4gKERJRF9QQVJJVFkpOworCWlmIChrICYgMHg0MCkKKwkJcmV0dXJuIChESURfRVJST1IpOworCXJldHVybiAwOworfQorCisvKgorICoJSW5pdGlhdGUgc2NzaSBjb21tYW5kIC0gcXVldWVpbmcgaGFuZGxlciAKKyAqCWNhbGxlciBtdXN0IGhvbGQgaG9zdCBsb2NrCisgKi8KKworc3RhdGljIHZvaWQgcWxfaWNtZChTY3NpX0NtbmQgKiBjbWQpCit7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CisJaW50IAlxYmFzZSA9IHByaXYtPnFiYXNlOworCWludAlpbnRfdHlwZSA9IHByaXYtPmludF90eXBlOworCXVuc2lnbmVkIGludCBpOworCisJcHJpdi0+cWFib3J0ID0gMDsKKworCVJFRzA7CisJLyogY2xlYXJpbmcgb2YgaW50ZXJydXB0cyBhbmQgdGhlIGZpZm8gaXMgbmVlZGVkICovCisKKwlpbmIocWJhc2UgKyA1KTsJCS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwlpZiAoaW5iKHFiYXNlICsgNSkpCS8qIGlmIHN0aWxsIGludGVycnVwdGluZyAqLworCQlvdXRiKDIsIHFiYXNlICsgMyk7CS8qIHJlc2V0IGNoaXAgKi8KKwllbHNlIGlmIChpbmIocWJhc2UgKyA3KSAmIDB4MWYpCisJCW91dGIoMSwgcWJhc2UgKyAzKTsJLyogY2xlYXIgZmlmbyAqLworCXdoaWxlIChpbmIocWJhc2UgKyA1KSk7CS8qIGNsZWFyIGludHMgKi8KKwlSRUcxOworCW91dGIoMSwgcWJhc2UgKyA4KTsJLyogc2V0IGZvciBQSU8gcHNldWRvIERNQSAqLworCW91dGIoMCwgcWJhc2UgKyAweGIpOwkvKiBkaXNhYmxlIGludHMgKi8KKwlpbmIocWJhc2UgKyA4KTsJCS8qIGNsZWFyIGludCBiaXRzICovCisJUkVHMDsKKwlvdXRiKDB4NDAsIHFiYXNlICsgMHhiKTsJLyogZW5hYmxlIGZlYXR1cmVzICovCisKKwkvKiBjb25maWd1cmFibGVzICovCisJb3V0YihxbGNmZ2MsIHFiYXNlICsgMHhjKTsKKwkvKiBjb25maWc6IG5vIHJlc2V0IGludGVycnVwdCwgKGluaXRpYXRvcikgYnVzIGlkICovCisJb3V0YigweDQwIHwgcWxjZmc4IHwgcHJpdi0+cWluaXRpZCwgcWJhc2UgKyA4KTsKKwlvdXRiKHFsY2ZnNywgcWJhc2UgKyA3KTsKKwlvdXRiKHFsY2ZnNiwgcWJhc2UgKyA2KTsKKwkgLyoqLyBvdXRiKHFsY2ZnNSwgcWJhc2UgKyA1KTsJLyogc2VsZWN0IHRpbWVyICovCisJb3V0YihxbGNmZzkgJiA3LCBxYmFzZSArIDkpOwkvKiBwcmVzY2FsZXIgKi8KKy8qCW91dGIoMHg5OSwgcWJhc2UgKyA1KTsJKi8KKwlvdXRiKGNtZC0+ZGV2aWNlLT5pZCwgcWJhc2UgKyA0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykKKwkJb3V0YihjbWQtPmNtbmRbaV0sIHFiYXNlICsgMik7CisKKwlwcml2LT5xbGNtZCA9IGNtZDsKKwlvdXRiKDB4NDEsIHFiYXNlICsgMyk7CS8qIHNlbGVjdCBhbmQgc2VuZCBjb21tYW5kICovCit9CisKKy8qCisgKglQcm9jZXNzIHNjc2kgY29tbWFuZCAtIHVzdWFsbHkgYWZ0ZXIgaW50ZXJydXB0IAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcWxfcGNtZChTY3NpX0NtbmQgKiBjbWQpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBrOworCXVuc2lnbmVkIGludCByZXN1bHQ7CS8qIHVsdGltYXRlIHJldHVybiByZXN1bHQgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwkvKiBzY3NpIHJldHVybmVkIHN0YXR1cyAqLworCXVuc2lnbmVkIGludCBtZXNzYWdlOwkvKiBzY3NpIHJldHVybmVkIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZCBpbnQgcGhhc2U7CS8qIHJlY29yZGVkIHNjc2kgcGhhc2UgKi8KKwl1bnNpZ25lZCBpbnQgcmVxbGVuOwkvKiB0b3RhbCBsZW5ndGggb2YgdHJhbnNmZXIgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdDsJLyogc2NhdHRlci1nYXRoZXIgbGlzdCBwb2ludGVyICovCisJdW5zaWduZWQgaW50IHNnY291bnQ7CS8qIHNnIGNvdW50ZXIgKi8KKwljaGFyICpidWY7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CisJaW50IHFiYXNlID0gcHJpdi0+cWJhc2U7CisJaW50IGludF90eXBlID0gcHJpdi0+aW50X3R5cGU7CisKKwlydHJjKDEpCisJaiA9IGluYihxYmFzZSArIDYpOworCWkgPSBpbmIocWJhc2UgKyA1KTsKKwlpZiAoaSA9PSAweDIwKSB7CisJCXJldHVybiAoRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCX0KKwlpIHw9IGluYihxYmFzZSArIDUpOwkvKiB0aGUgMHgxMCBiaXQgY2FuIGJlIHNldCBhZnRlciB0aGUgMHgwOCAqLworCWlmIChpICE9IDB4MTgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRbDpCYWQgSW50ZXJydXB0IHN0YXR1czolMDJ4XG4iLCBpKTsKKwkJcWxfemFwKHByaXYpOworCQlyZXR1cm4gKERJRF9CQURfSU5UUiA8PCAxNik7CisJfQorCWogJj0gNzsJCQkvKiBqID0gaW5iKCBxYmFzZSArIDcgKSA+PiA1OyAqLworCisJLyogY29ycmVjdCBzdGF0dXMgaXMgc3VwcG9zZWQgdG8gYmUgc3RlcCA0ICovCisJLyogaXQgc29tZXRpbWVzIHJldHVybnMgc3RlcCAzIGJ1dCB3aXRoIDAgYnl0ZXMgbGVmdCB0byBzZW5kICovCisJLyogV2UgY2FuIHRyeSBzdHVmZmluZyB0aGUgRklGTyB3aXRoIHRoZSBtYXggZWFjaCB0aW1lLCBidXQgd2Ugd2lsbCBnZXQgYQorCSAgIHNlcXVlbmNlIG9mIDMgaWYgYW55IGJ5dGVzIGFyZSBsZWZ0IChidXQgd2UgZG8gZmx1c2ggdGhlIEZJRk8gYW55d2F5ICovCisKKwlpZiAoaiAhPSAzICYmIGogIT0gNCkgeworCQlwcmludGsoS0VSTl9FUlIgIlFsOkJhZCBzZXF1ZW5jZSBmb3IgY29tbWFuZCAlZCwgaW50ICUwMlgsIGNtZGxlZnQgPSAlZFxuIiwKKwkJICAgICBqLCBpLCBpbmIocWJhc2UgKyA3KSAmIDB4MWYpOworCQlxbF96YXAocHJpdik7CisJCXJldHVybiAoRElEX0VSUk9SIDw8IDE2KTsKKwl9CisJcmVzdWx0ID0gRElEX09LOworCWlmIChpbmIocWJhc2UgKyA3KSAmIDB4MWYpCS8qIGlmIHNvbWUgYnl0ZXMgaW4gZmlmbyAqLworCQlvdXRiKDEsIHFiYXNlICsgMyk7CS8qIGNsZWFyIGZpZm8gKi8KKwkvKiBub3RlIHRoYXQgcmVxdWVzdF9idWZmbGVuIGlzIHRoZSB0b3RhbCB4ZmVyIHNpemUgd2hlbiBzZyBpcyB1c2VkICovCisJcmVxbGVuID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJLyogbm90ZSB0aGF0IGl0IHdvbid0IHdvcmsgaWYgdHJhbnNmZXJzID4gMTZNIGFyZSByZXF1ZXN0ZWQgKi8KKwlpZiAocmVxbGVuICYmICEoKHBoYXNlID0gaW5iKHFiYXNlICsgNCkpICYgNikpIHsJLyogZGF0YSBwaGFzZSAqLworCQlydHJjKDIpCisJCW91dGIocmVxbGVuLCBxYmFzZSk7CS8qIGxvdy1taWQgeGZlciBjbnQgKi8KKwkJb3V0YihyZXFsZW4gPj4gOCwgcWJhc2UgKyAxKTsJLyogbG93LW1pZCB4ZmVyIGNudCAqLworCQlvdXRiKHJlcWxlbiA+PiAxNiwgcWJhc2UgKyAweGUpOwkvKiBoaWdoIHhmZXIgY250ICovCisJCW91dGIoMHg5MCwgcWJhc2UgKyAzKTsJLyogY29tbWFuZCBkbyB4ZmVyICovCisJCS8qIFBJTyBwc2V1ZG8gRE1BIHRvIGJ1ZmZlciBvciBzZ2xpc3QgKi8KKwkJUkVHMTsKKwkJaWYgKCFjbWQtPnVzZV9zZykKKwkJCXFsX3BkbWEocHJpdiwgcGhhc2UsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQllbHNlIHsKKwkJCXNnY291bnQgPSBjbWQtPnVzZV9zZzsKKwkJCXNnbGlzdCA9IGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCQl3aGlsZSAoc2djb3VudC0tKSB7CisJCQkJaWYgKHByaXYtPnFhYm9ydCkgeworCQkJCQlSRUcwOworCQkJCQlyZXR1cm4gKChwcml2LT5xYWJvcnQgPT0gMSA/CisJCQkJCQlESURfQUJPUlQgOiBESURfUkVTRVQpIDw8IDE2KTsKKwkJCQl9CisJCQkJYnVmID0gcGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldDsKKwkJCQlpZiAocWxfcGRtYShwcml2LCBwaGFzZSwgYnVmLCBzZ2xpc3QtPmxlbmd0aCkpCisJCQkJCWJyZWFrOworCQkJCXNnbGlzdCsrOworCQkJfQorCQl9CisJCVJFRzA7CisJCXJ0cmMoMikKKwkJLyoKKwkJICoJV2FpdCBmb3IgaXJxIChzcGxpdCBpbnRvIHNlY29uZCBzdGF0ZSBvZiBpcnEgaGFuZGxlcgorCQkgKglpZiB0aGlzIGNhbiB0YWtlIHRpbWUpIAorCQkgKi8KKwkJaWYgKChrID0gcWxfd2FpKHByaXYpKSkKKwkJCXJldHVybiAoayA8PCAxNik7CisJCWsgPSBpbmIocWJhc2UgKyA1KTsJLyogc2hvdWxkIGJlIDB4MTAsIGJ1cyBzZXJ2aWNlICovCisJfQorCisJLyoKKwkgKglFbnRlciBTdGF0dXMgKGFuZCBNZXNzYWdlIEluKSBQaGFzZSAKKwkgKi8KKwkgCisJayA9IGppZmZpZXMgKyBXQVRDSERPRzsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBrKSAmJiAhcHJpdi0+cWFib3J0ICYmCisJCQkJCQkhKGluYihxYmFzZSArIDQpICYgNikpCisJCWNwdV9yZWxheCgpOwkvKiB3YWl0IGZvciBzdGF0dXMgcGhhc2UgKi8KKworCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGspKSB7CisJCXFsX3phcChwcml2KTsKKwkJcmV0dXJuIChESURfVElNRV9PVVQgPDwgMTYpOworCX0KKworCS8qIEZJWE1FOiB0aW1lb3V0ID8/ICovCisJd2hpbGUgKGluYihxYmFzZSArIDUpKQorCQljcHVfcmVsYXgoKTsJLyogY2xlYXIgcGVuZGluZyBpbnRzICovCisKKwlpZiAocHJpdi0+cWFib3J0KQorCQlyZXR1cm4gKChwcml2LT5xYWJvcnQgPT0gMSA/IERJRF9BQk9SVCA6IERJRF9SRVNFVCkgPDwgMTYpOworCisJb3V0YigweDExLCBxYmFzZSArIDMpOwkvKiBnZXQgc3RhdHVzIGFuZCBtZXNzYWdlICovCisJaWYgKChrID0gcWxfd2FpKHByaXYpKSkKKwkJcmV0dXJuIChrIDw8IDE2KTsKKwlpID0gaW5iKHFiYXNlICsgNSk7CS8qIGdldCBjaGlwIGlycSBzdGF0ICovCisJaiA9IGluYihxYmFzZSArIDcpICYgMHgxZjsJLyogYW5kIGJ5dGVzIHJlYydkICovCisJc3RhdHVzID0gaW5iKHFiYXNlICsgMik7CisJbWVzc2FnZSA9IGluYihxYmFzZSArIDIpOworCisJLyoKKwkgKglTaG91bGQgZ2V0IGZ1bmN0aW9uIGNvbXBsZXRlIGludCBpZiBTdGF0dXMgYW5kIG1lc3NhZ2UsIGVsc2UgCisJICoJYnVzIHNlcnYgaWYgb25seSBzdGF0dXMgCisJICovCisJaWYgKCEoKGkgPT0gOCAmJiBqID09IDIpIHx8IChpID09IDB4MTAgJiYgaiA9PSAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRbDpFcnJvciBkdXJpbmcgc3RhdHVzIHBoYXNlLCBpbnQ9JTAyWCwgJWQgYnl0ZXMgcmVjZFxuIiwgaSwgaik7CisJCXJlc3VsdCA9IERJRF9FUlJPUjsKKwl9CisJb3V0YigweDEyLCBxYmFzZSArIDMpOwkvKiBkb25lLCBkaXNjb25uZWN0ICovCisJcnRyYygxKQorCWlmICgoayA9IHFsX3dhaShwcml2KSkpCisJCXJldHVybiAoayA8PCAxNik7CisKKwkvKgorCSAqCVNob3VsZCBnZXQgYnVzIHNlcnZpY2UgaW50ZXJydXB0IGFuZCBkaXNjb25uZWN0IGludGVycnVwdCAKKwkgKi8KKwkgCisJaSA9IGluYihxYmFzZSArIDUpOwkvKiBzaG91bGQgYmUgYnVzIHNlcnZpY2UgKi8KKwl3aGlsZSAoIXByaXYtPnFhYm9ydCAmJiAoKGkgJiAweDIwKSAhPSAweDIwKSkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCQlpIHw9IGluYihxYmFzZSArIDUpOworCX0KKwlydHJjKDApCisKKwlpZiAocHJpdi0+cWFib3J0KQorCQlyZXR1cm4gKChwcml2LT5xYWJvcnQgPT0gMSA/IERJRF9BQk9SVCA6IERJRF9SRVNFVCkgPDwgMTYpOworCQkKKwlyZXR1cm4gKHJlc3VsdCA8PCAxNikgfCAobWVzc2FnZSA8PCA4KSB8IChzdGF0dXMgJiBTVEFUVVNfTUFTSyk7Cit9CisKKy8qCisgKglJbnRlcnJ1cHQgaGFuZGxlciAKKyAqLworCitzdGF0aWMgdm9pZCBxbF9paGFuZGwoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlTY3NpX0NtbmQgKmljbWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopZGV2X2lkOworCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2hvc3QoaG9zdCk7CisJaW50IHFiYXNlID0gcHJpdi0+cWJhc2U7CisJUkVHMDsKKworCWlmICghKGluYihxYmFzZSArIDQpICYgMHg4MCkpCS8qIGZhbHNlIGFsYXJtPyAqLworCQlyZXR1cm47CisKKwlpZiAocHJpdi0+cWxjbWQgPT0gTlVMTCkgewkvKiBubyBjb21tYW5kIHRvIHByb2Nlc3M/ICovCisJCWludCBpOworCQlpID0gMTY7CisJCXdoaWxlIChpLS0gJiYgaW5iKHFiYXNlICsgNSkpOwkvKiBtYXliZSBhbHNvIHFsX3phcCgpICovCisJCXJldHVybjsKKwl9CisJaWNtZCA9IHByaXYtPnFsY21kOworCWljbWQtPnJlc3VsdCA9IHFsX3BjbWQoaWNtZCk7CisJcHJpdi0+cWxjbWQgPSBOVUxMOworCS8qCisJICoJSWYgcmVzdWx0IGlzIENIRUNLIENPTkRJVElPTiBkb25lIGNhbGxzIHFjb21tYW5kIHRvIHJlcXVlc3QgCisJICoJc2Vuc2UgCisJICovCisJKGljbWQtPnNjc2lfZG9uZSkgKGljbWQpOworfQorCitpcnFyZXR1cm5fdCBxbG9naWNmYXM0MDhfaWhhbmRsKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcWxfaWhhbmRsKGlycSwgZGV2X2lkLCByZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqCVF1ZXVlZCBjb21tYW5kCisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK3sKKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9jbWQoY21kKTsKKwlpZiAoY21kLT5kZXZpY2UtPmlkID09IHByaXYtPnFpbml0aWQpIHsKKwkJY21kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKKwkJZG9uZShjbWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWQtPnNjc2lfZG9uZSA9IGRvbmU7CisJLyogd2FpdCBmb3IgdGhlIGxhc3QgY29tbWFuZCdzIGludGVycnVwdCB0byBmaW5pc2ggKi8KKwl3aGlsZSAocHJpdi0+cWxjbWQgIT0gTlVMTCkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlxbF9pY21kKGNtZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIAorICoJUmV0dXJuIGJpb3MgcGFyYW1ldGVycyAKKyAqLworCitpbnQgcWxvZ2ljZmFzNDA4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkaXNrLAorCQkgICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK3sKKy8qIFRoaXMgc2hvdWxkIG1pbWljIHRoZSBET1MgUWxvZ2ljIGRyaXZlcidzIGJlaGF2aW9yIGV4YWN0bHkgKi8KKwlpcFswXSA9IDB4NDA7CisJaXBbMV0gPSAweDIwOworCWlwWzJdID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKGlwWzBdICogaXBbMV0pOworCWlmIChpcFsyXSA+IDEwMjQpIHsKKwkJaXBbMF0gPSAweGZmOworCQlpcFsxXSA9IDB4M2Y7CisJCWlwWzJdID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKGlwWzBdICogaXBbMV0pOworI2lmIDAKKwkJaWYgKGlwWzJdID4gMTAyMykKKwkJCWlwWzJdID0gMTAyMzsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUFib3J0IGEgY29tbWFuZCBpbiBwcm9ncmVzcworICovCisgCitpbnQgcWxvZ2ljZmFzNDA4X2Fib3J0KFNjc2lfQ21uZCAqIGNtZCkKK3sKKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9jbWQoY21kKTsKKwlwcml2LT5xYWJvcnQgPSAxOworCXFsX3phcChwcml2KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogCisgKglSZXNldCBTQ1NJIGJ1cworICoJRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGNtZCA9IE5VTEwgZGlyZWN0bHkgYnkKKyAqCXRoZSBQQ01DSUEgcWxvZ2ljX3N0dWIgY29kZS4gVGhpcyB3YW50cyBmaXhpbmcKKyAqLworCitpbnQgcWxvZ2ljZmFzNDA4X2J1c19yZXNldChTY3NpX0NtbmQgKiBjbWQpCit7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CisJcHJpdi0+cWFib3J0ID0gMjsKKwlxbF96YXAocHJpdik7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qIAorICoJUmVzZXQgU0NTSSBob3N0IGNvbnRyb2xsZXIKKyAqLworCitpbnQgcWxvZ2ljZmFzNDA4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICogY21kKQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKKy8qIAorICoJUmVzZXQgU0NTSSBkZXZpY2UKKyAqLworCitpbnQgcWxvZ2ljZmFzNDA4X2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBjbWQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworLyoKKyAqCVJldHVybiBpbmZvIHN0cmluZworICovCisKK2NvbnN0IGNoYXIgKnFsb2dpY2ZhczQwOF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfaG9zdChob3N0KTsKKwlyZXR1cm4gcHJpdi0+cWluZm87Cit9CisKKy8qCisgKglHZXQgdHlwZSBvZiBjaGlwCisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9nZXRfY2hpcF90eXBlKGludCBxYmFzZSwgaW50IGludF90eXBlKQoreworCVJFRzE7CisJcmV0dXJuIGluYihxYmFzZSArIDB4ZSkgJiAweGY4OworfQorCisvKgorICoJUGVyZm9ybSBpbml0aWFsaXphdGlvbiB0YXNrcworICovCisKK3ZvaWQgcWxvZ2ljZmFzNDA4X3NldHVwKGludCBxYmFzZSwgaW50IGlkLCBpbnQgaW50X3R5cGUpCit7CisJb3V0YigxLCBxYmFzZSArIDgpOwkvKiBzZXQgZm9yIFBJTyBwc2V1ZG8gRE1BICovCisJUkVHMDsKKwlvdXRiKDB4NDAgfCBxbGNmZzggfCBpZCwgcWJhc2UgKyA4KTsJLyogKGluaSkgYnVzIGlkLCBkaXNhYmxlIHNjc2kgcnN0ICovCisJb3V0YihxbGNmZzUsIHFiYXNlICsgNSk7CS8qIHNlbGVjdCB0aW1lciAqLworCW91dGIocWxjZmc5LCBxYmFzZSArIDkpOwkvKiBwcmVzY2FsZXIgKi8KKworI2lmIFFMX1JFU0VUX0FUX1NUQVJUCisJb3V0YigzLCBxYmFzZSArIDMpOworCisJUkVHMTsKKwkvKiBGSVhNRTogdGltZW91dCAqLworCXdoaWxlIChpbmIocWJhc2UgKyAweGYpICYgNCkKKwkJY3B1X3JlbGF4KCk7CisKKwlSRUcwOworI2VuZGlmCit9CisKKy8qCisgKglDaGVja3MgaWYgdGhpcyBpcyBhIFFMb2dpYyBGQVMgNDA4CisgKi8KKworaW50IHFsb2dpY2ZhczQwOF9kZXRlY3QoaW50IHFiYXNlLCBpbnQgaW50X3R5cGUpCit7CisgICAgICAgIFJFRzE7CisJcmV0dXJuICgoKGluYihxYmFzZSArIDB4ZSkgXiBpbmIocWJhc2UgKyAweGUpKSA9PSA3KSAmJgorCSAgICAgICAoKGluYihxYmFzZSArIDB4ZSkgXiBpbmIocWJhc2UgKyAweGUpKSA9PSA3KSk7CQkKK30KKworLyoKKyAqCURpc2FibGUgaW50ZXJydXB0cworICovCisKK3ZvaWQgcWxvZ2ljZmFzNDA4X2Rpc2FibGVfaW50cyhzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYpCit7CisJaW50IHFiYXNlID0gcHJpdi0+cWJhc2U7CisJaW50IGludF90eXBlID0gcHJpdi0+aW50X3R5cGU7CisKKwlSRUcxOworCW91dGIoMCwgcWJhc2UgKyAweGIpOwkvKiBkaXNhYmxlIGludHMgKi8KK30KKworLyoKKyAqCUluaXQgYW5kIGV4aXQgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcWxvZ2ljZmFzNDA4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHFsb2dpY2ZhczQwOF9leGl0KHZvaWQpCit7CisKK30KKworTU9EVUxFX0FVVEhPUigiVG9tIFplcnVjaGEsIE1pY2hhZWwgR3JpZmZpdGgiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgUWxvZ2ljIEZBUyBTQ1NJIGNvbnRyb2xsZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChxbG9naWNmYXM0MDhfaW5pdCk7Cittb2R1bGVfZXhpdChxbG9naWNmYXM0MDhfZXhpdCk7CisKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2luZm8pOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfcXVldWVjb21tYW5kKTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2Fib3J0KTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2J1c19yZXNldCk7CitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9kZXZpY2VfcmVzZXQpOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfaG9zdF9yZXNldCk7CitFWFBPUlRfU1lNQk9MKHFsb2dpY2ZhczQwOF9iaW9zcGFyYW0pOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfaWhhbmRsKTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2dldF9jaGlwX3R5cGUpOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfc2V0dXApOworRVhQT1JUX1NZTUJPTChxbG9naWNmYXM0MDhfZGV0ZWN0KTsKK0VYUE9SVF9TWU1CT0wocWxvZ2ljZmFzNDA4X2Rpc2FibGVfaW50cyk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguaCBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFjYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiB0byBiZSB1c2VkIGJ5IHFsb2dpY2ZhcyBhbmQgcWxvZ2ljX2NzICovCisjaWZuZGVmIF9fUUxPR0lDRkFTNDA4X0gKKyNkZWZpbmUgX19RTE9HSUNGQVM0MDhfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29uZmlndXJhdGlvbiAqLworCisvKiBTZXQgdGhlIGZvbGxvd2luZyB0byBtYXggb3V0IHRoZSBzcGVlZCBvZiB0aGUgUElPIFBzZXVkb0RNQSB0cmFuc2ZlcnMsCisgICBhZ2FpbiwgMCB0ZW5kcyB0byBiZSBzbG93ZXIsIGJ1dCBtb3JlIHN0YWJsZS4gICovCisKKyNkZWZpbmUgUUxfVFVSQk9fUERNQSAxCisKKy8qIFRoaXMgc2hvdWxkIGJlIDEgdG8gZW5hYmxlIHBhcml0eSBkZXRlY3Rpb24gKi8KKworI2RlZmluZSBRTF9FTkFCTEVfUEFSSVRZIDEKKworLyogVGhpcyB3aWxsIHJlc2V0IGFsbCBkZXZpY2VzIHdoZW4gdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCAoZHVyaW5nIGJvb3R1cCkuCisgICBUaGUgb3RoZXIgbGludXggZHJpdmVycyBkb24ndCBkbyB0aGlzLCBidXQgdGhlIERPUyBkcml2ZXJzIGRvLCBhbmQgYWZ0ZXIKKyAgIHVzaW5nIERPUyBvciBzb21lIGtpbmQgb2YgY3Jhc2ggb3IgbG9ja3VwIHRoaXMgd2lsbCBicmluZyB0aGluZ3MgYmFjaworICAgd2l0aG91dCByZXF1aXJpbmcgYSBjb2xkIGJvb3QuICBJdCBkb2VzIHRha2Ugc29tZSB0aW1lIHRvIHJlY292ZXIgZnJvbSBhCisgICByZXNldCwgc28gaXQgaXMgc2xvd2VyLCBhbmQgSSBoYXZlIHNlZW4gdGltZW91dHMgc28gdGhhdCBkZXZpY2VzIHdlcmVuJ3QKKyAgIHJlY29nbml6ZWQgd2hlbiB0aGlzIHdhcyBzZXQuICovCisKKyNkZWZpbmUgUUxfUkVTRVRfQVRfU1RBUlQgMAorCisvKiBjcnlzdGFsIGZyZXF1ZW5jeSBpbiBtZWdhaGVydHogKGZvciBvZmZzZXQgNSBhbmQgOSkKKyAgIFBsZWFzZSBzZXQgdGhpcyBmb3IgeW91ciBjYXJkLiAgTW9zdCBRbG9naWMgY2FyZHMgYXJlIDQwIE1oei4gIFRoZQorICAgQ29udHJvbCBDb25jZXB0cyBJU0EgKG5vdCBWTEIpIGlzIDI0IE1oeiAqLworCisjZGVmaW5lIFhUQUxGUkVRCTQwCisKKy8qKioqKioqKioqLworLyogREFOR0VSISBtb2RpZnkgdGhlc2UgYXQgeW91ciBvd24gcmlzayAqLworLyogU0xPV0NBQkxFIGNhbiB1c3VhbGx5IGJlIHJlc2V0IHRvIHplcm8gaWYgeW91IGhhdmUgYSBjbGVhbiBzZXR1cCBhbmQKKyAgIHByb3BlciB0ZXJtaW5hdGlvbi4gIFRoZSByZXN0IGFyZSBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIGFuZCBvdGhlcgorICAgYWR2YW5jZWQgZmVhdHVyZXMgaWYgeW91ciBkZXZpY2UgY2FuIHRyYW5zZmVyIGZhc3RlciB0aGFuIDVNYi9zZWMuCisgICBJZiB5b3UgYXJlIHJlYWxseSBjdXJpb3VzLCBlbWFpbCBtZSBmb3IgYSBxdWljayBob3d0byB1bnRpbCBJIGhhdmUKKyAgIHNvbWV0aGluZyBvZmZpY2lhbCAqLworLyoqKioqKioqKiovCisKKy8qKioqKi8KKy8qIGNvbmZpZyByZWdpc3RlciAxIChvZmZzZXQgOCkgb3B0aW9ucyAqLworLyogVGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gMSBpZiB5b3VyIGNhYmxpbmcgaXMgbG9uZyBvciBub2lzeSAqLworI2RlZmluZSBTTE9XQ0FCTEUgMQorCisvKioqKiovCisvKiBvZmZzZXQgMHhjICovCisvKiBUaGlzIHdpbGwgc2V0IGZhc3QgKDEwTWh6KSBzeW5jaHJvbm91cyB0aW1pbmcgd2hlbiBzZXQgdG8gMQorICAgRm9yIHRoaXMgdG8gaGF2ZSBhbiBlZmZlY3QsIEZBU1RDTEsgbXVzdCBhbHNvIGJlIDEgKi8KKyNkZWZpbmUgRkFTVFNDU0kgMAorCisvKiBUaGlzIHdoZW4gc2V0IHRvIDEgd2lsbCBzZXQgYSBmYXN0ZXIgc3luYyB0cmFuc2ZlciByYXRlICovCisjZGVmaW5lIEZBU1RDTEsgMAkvKihYVEFMRlJFUT4yNT8xOjApKi8KKworLyoqKioqLworLyogb2Zmc2V0IDYgKi8KKy8qIFRoaXMgaXMgdGhlIHN5bmMgdHJhbnNmZXIgZGl2aXNvciwgWFRBTEZSRVEvWCB3aWxsIGJlIHRoZSBtYXhpbXVtCisgICBhY2hpZXZhYmxlIGRhdGEgcmF0ZSAoYXNzdW1pbmcgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSBpcyBjYXBhYmxlCisgICBhbmQgc2V0IHByb3Blcmx5KSAqLworI2RlZmluZSBTWU5DWEZSUEQgNQkvKihYVEFMRlJFUS81KSovCisKKy8qKioqKi8KKy8qIG9mZnNldCA3ICovCisvKiBUaGlzIGlzIHRoZSBjb3VudCBvZiBob3cgbWFueSBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgY2FuIHRha2UgcGxhY2UKKwlpLmUuIGhvdyBtYW55IHJlcXMgY2FuIG9jY3VyIGJlZm9yZSBhbiBhY2sgaXMgZ2l2ZW4uCisJVGhlIG1heGltdW0gdmFsdWUgZm9yIHRoaXMgaXMgMTUsIHRoZSB1cHBlciBiaXRzIGNhbiBtb2RpZnkKKwlSRVEvQUNLIGFzc2VydGlvbiBhbmQgZGVhc3NlcnRpb24gZHVyaW5nIHN5bmNocm9ub3VzIHRyYW5zZmVycworCUlmIHRoaXMgaXMgMCwgdGhlIGJ1cyB3aWxsIG9ubHkgdHJhbnNmZXIgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgU1lOQ09GRlNUIDAKKy8qIGZvciB0aGUgY3VyaW91cywgYml0cyA3JjYgY29udHJvbCB0aGUgZGVhc3NlcnRpb24gZGVsYXkgaW4gMS8yIGN5Y2xlcworCW9mIHRoZSA0ME1oeiBjbG9jay4gSWYgRkFTVENMSyBpcyAxLCBzcGVjaWZ5aW5nIDAxICgxLzIpIHdpbGwKKwljYXVzZSB0aGUgZGVhc3NlcnRpb24gdG8gYmUgZWFybHkgYnkgMS8yIGNsb2NrLiAgQml0cyA1JjQgY29udHJvbAorCXRoZSBhc3NlcnRpb24gZGVsYXksIGFsc28gaW4gMS8yIGNsb2NrcyAoRkFTVENMSyBpcyBpZ25vcmVkIGhlcmUpLiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgeworCSBpbnQJCXFiYXNlOwkJLyogUG9ydCAqLworCSBpbnQJCXFpbml0aWQ7CS8qIGluaXRpYXRvciBJRCAqLworCSBpbnQJCXFhYm9ydDsJCS8qIEZsYWcgdG8gY2F1c2UgYW4gYWJvcnQgKi8KKwkgaW50CQlxbGlycTsJCS8qIElSUSBiZWluZyB1c2VkICovCisJIGludAkJaW50X3R5cGU7CS8qIHR5cGUgb2YgaXJxLCAyIGZvciBJU0EgYm9hcmQsIDAgZm9yIFBDTUNJQSAqLworCSBjaGFyCQlxaW5mb1s4MF07CS8qIGRlc2NyaXB0aW9uICovCisJIFNjc2lfQ21uZCAJKnFsY21kOwkJLyogY3VycmVudCBjb21tYW5kIGJlaW5nIHByb2Nlc3NlZCAqLworCSBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsJLyogcG9pbnRlciBiYWNrIHRvIGhvc3QgKi8KKwkgc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpuZXh0OyAvKiBuZXh0IHByaXZhdGUgc3RydWN0ICovCit9OworCisvKiBUaGUgcWxvZ2ljIGNhcmQgdXNlcyB0d28gcmVnaXN0ZXIgbWFwcyAtIFRoZXNlIG1hY3JvcyBzZWxlY3Qgd2hpY2ggb25lICovCisjZGVmaW5lIFJFRzAgKCBvdXRiKCBpbmIoIHFiYXNlICsgMHhkICkgJiAweDdmICwgcWJhc2UgKyAweGQgKSwgb3V0YiggNCAsIHFiYXNlICsgMHhkICkpCisjZGVmaW5lIFJFRzEgKCBvdXRiKCBpbmIoIHFiYXNlICsgMHhkICkgfCAweDgwICwgcWJhc2UgKyAweGQgKSwgb3V0YiggMHhiNCB8IGludF90eXBlLCBxYmFzZSArIDB4ZCApKQorCisvKiBmb2xsb3dpbmcgaXMgd2F0Y2hkb2cgdGltZW91dCBpbiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgV0FUQ0hET0cgNTAwMDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIGZvbGxvd2luZyB3aWxsIHNldCB0aGUgbW9uaXRvciBib3JkZXIgY29sb3IgKHVzZWZ1bCB0byBmaW5kCisgICB3aGVyZSBzb21ldGhpbmcgY3Jhc2hlZCBvciBnZXRzIHN0dWNrIGF0IGFuZCBhcyBhIHNpbXBsZSBwcm9maWxlcikgKi8KKworI2RlZmluZSBydHJjKGkpIHt9CisKKyNkZWZpbmUgZ2V0X3ByaXZfYnlfY21kKHgpIChzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKikmKCh4KS0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXSkKKyNkZWZpbmUgZ2V0X3ByaXZfYnlfaG9zdCh4KSAoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICopJigoeCktPmhvc3RkYXRhWzBdKQorCitpcnFyZXR1cm5fdCBxbG9naWNmYXM0MDhfaWhhbmRsKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworaW50IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSk7CitpbnQgcWxvZ2ljZmFzNDA4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkaXNrLAorCQkgICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSk7CitpbnQgcWxvZ2ljZmFzNDA4X2Fib3J0KFNjc2lfQ21uZCAqIGNtZCk7CitpbnQgcWxvZ2ljZmFzNDA4X2J1c19yZXNldChTY3NpX0NtbmQgKiBjbWQpOworaW50IHFsb2dpY2ZhczQwOF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCk7CitpbnQgcWxvZ2ljZmFzNDA4X2RldmljZV9yZXNldChTY3NpX0NtbmQgKiBjbWQpOworY29uc3QgY2hhciAqcWxvZ2ljZmFzNDA4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CitpbnQgcWxvZ2ljZmFzNDA4X2dldF9jaGlwX3R5cGUoaW50IHFiYXNlLCBpbnQgaW50X3R5cGUpOwordm9pZCBxbG9naWNmYXM0MDhfc2V0dXAoaW50IHFiYXNlLCBpbnQgaWQsIGludCBpbnRfdHlwZSk7CitpbnQgcWxvZ2ljZmFzNDA4X2RldGVjdChpbnQgcWJhc2UsIGludCBpbnRfdHlwZSk7Cit2b2lkIHFsb2dpY2ZhczQwOF9kaXNhYmxlX2ludHMoc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2KTsKKyNlbmRpZgkvKiBfX1FMT0dJQ0ZBUzQwOF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYy5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjMTE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNmYy5jCkBAIC0wLDAgKzEsMjIyNyBAQAorLyoKKyAqIFFMb2dpYyBJU1AyeDAwIFNDU0ktRkNQCisgKiBXcml0dGVuIGJ5IEVyaWsgSC4gTW9lLCBlaG1AY3Jpcy5jb20KKyAqIENvcHlyaWdodCAxOTk1LCBFcmlrIEguIE1vZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBSZW5hbWVkIGFuZCB1cGRhdGVkIHRvIDEuMy54IGJ5IE1pY2hhZWwgR3JpZmZpdGggPGdyaWZAY3MudWNyLmVkdT4gKi8KKworLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgdGhlIGlzcDEwMjAgZHJpdmVyIHdoaWNoIHdhcyBtb2RpZmllZCBieQorICogQ2hyaXMgTG92ZWxhbmQgPGN3bEBpb2wudW5oLmVkdT4gdG8gc3VwcG9ydCB0aGUgaXNwMjEwMCBhbmQgaXNwMjIwMAorICoKKyAqIEJpZyBlbmRpYW4gc3VwcG9ydCBhbmQgZHluYW1pYyBETUEgbWFwcGluZyBhZGRlZAorICogYnkgSmFrdWIgSmVsaW5layA8amFrdWJAcmVkaGF0LmNvbT4uCisgKgorICogQ29udmVyc2lvbiB0byBmaW5hbCBwY2k2NCBETUEgaW50ZXJmYWNlcworICogYnkgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPi4KKyAqLworCisvKgorICogJERhdGU6IDE5OTUvMDkvMjIgMDI6MjM6MTUgJAorICogJFJldmlzaW9uOiAwLjUgJAorICoKKyAqICRMb2c6IGlzcDEwMjAuYyx2ICQKKyAqIFJldmlzaW9uIDAuNSAgMTk5NS8wOS8yMiAgMDI6MjM6MTUgIHJvb3QKKyAqIGRvIGF1dG8gcmVxdWVzdCBzZW5zZQorICoKKyAqIFJldmlzaW9uIDAuNCAgMTk5NS8wOC8wNyAgMDQ6NDQ6MzMgIHJvb3QKKyAqIHN1cHBseSBmaXJtd2FyZSB3aXRoIGRyaXZlci4KKyAqIG51bWVyb3VzIGJ1ZyBmaXhlcy9nZW5lcmFsIGNsZWFudXAgb2YgY29kZS4KKyAqCisgKiBSZXZpc2lvbiAwLjMgIDE5OTUvMDcvMTYgIDE2OjE1OjM5ICByb290CisgKiBhZGRlZCByZXNldC9hYm9ydCBjb2RlLgorICoKKyAqIFJldmlzaW9uIDAuMiAgMTk5NS8wNi8yOSAgMDM6MTQ6MTkgIHJvb3QKKyAqIGZpeGVkIGJpb3NwYXJhbS4KKyAqIGFkZGVkIHF1ZXVlIHByb3RvY29sLgorICoKKyAqIFJldmlzaW9uIDAuMSAgMTk5NS8wNi8yNSAgMDE6NTU6NDUgIHJvb3QKKyAqIEluaXRpYWwgcmVsZWFzZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjZGVmaW5lIHBjaTY0X2RtYV9oaTMyKGEpICgodTMyKSAoMHhmZmZmZmZmZiAmICgoKHU2NCkoYSkpPj4zMikpKQorI2RlZmluZSBwY2k2NF9kbWFfbG8zMihhKSAoKHUzMikgKDB4ZmZmZmZmZmYgJiAoKCh1NjQpKGEpKSkpKQorI2RlZmluZSBwY2k2NF9kbWFfYnVpbGQoaGksbG8pIFwKKwkoKGRtYV9hZGRyX3QpKCgodTY0KShsbykpfCgoKHU2NCkoaGkpKTw8MzIpKSkKKworLyoKKyAqIFdpdGggdGhlIHFsb2dpYyBpbnRlcmZhY2UsIGV2ZXJ5IHF1ZXVlIHNsb3QgY2FuIGhvbGQgYSBTQ1NJCisgKiBjb21tYW5kIHdpdGggdXAgdG8gMiBzY2F0dGVyL2dhdGhlciBlbnRyaWVzLiAgSWYgd2UgbmVlZCBtb3JlCisgKiB0aGFuIDIgZW50cmllcywgY29udGludWF0aW9uIGVudHJpZXMgY2FuIGJlIHVzZWQgdGhhdCBob2xkCisgKiBhbm90aGVyIDUgZW50cmllcyBlYWNoLiAgVW5saWtlIGZvciBvdGhlciBkcml2ZXJzLCB0aGlzIG1lYW5zCisgKiB0aGF0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBlbnRyaWVzIHdlIGNhbgorICogc3VwcG9ydCBhdCBhbnkgZ2l2ZW4gdGltZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBudW1iZXIgb2YgcXVldWUKKyAqIHNsb3RzIGF2YWlsYWJsZS4gIFRoYXQgaXMsIGhvc3QtPmNhbl9xdWV1ZSBhbmQgaG9zdC0+c2dfdGFibGVzaXplCisgKiBhcmUgZHluYW1pYyBhbmQgX25vdF8gaW5kZXBlbmRlbnQuICBUaGlzIGFsbCB3b3JrcyBmaW5lIGJlY2F1c2UKKyAqIHJlcXVlc3RzIGFyZSBxdWV1ZWQgc2VyaWFsbHkgYW5kIHRoZSBzY2F0dGVyL2dhdGhlciBsaW1pdCBpcworICogZGV0ZXJtaW5lZCBmb3IgZWFjaCBxdWV1ZSByZXF1ZXN0IGFuZXcuCisgKi8KKworI2RlZmluZSBEQVRBU0VHU19QRVJfQ09NTUFORCAyCisjZGVmaW5lIERBVEFTRUdTX1BFUl9DT05UIDUKKworI2RlZmluZSBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOIDI1NSAgICAgLyogbXVzdCBiZSBwb3dlciBvZiB0d28gLSAxICovCisjZGVmaW5lIFFMT0dJQ0ZDX01BWF9TRyhxbCkJKERBVEFTRUdTX1BFUl9DT01NQU5EICsgKCgocWwpID4gMCkgPyBEQVRBU0VHU19QRVJfQ09OVCooKHFsKSAtIDEpIDogMCkpCisjZGVmaW5lIFFMT0dJQ0ZDX0NNRF9QRVJfTFVOICAgIDgKKworLyogQ29uZmlndXJhdGlvbiBzZWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogU2V0IHRoZSBmb2xsb3dpbmcgbWFjcm8gdG8gMSB0byByZWxvYWQgdGhlIElTUDJ4MDAncyBmaXJtd2FyZS4gIFRoaXMgaXMKKyAgIHZlcnNpb24gMS4xNy4zMCBvZiB0aGUgaXNwMjEwMCdzIGZpcm13YXJlIGFuZCB2ZXJzaW9uIDIuMDAuNDAgb2YgdGhlIAorICAgaXNwMjIwMCdzIGZpcm13YXJlLiAKKyovCisKKyNkZWZpbmUgVVNFX05WUkFNX0RFRkFVTFRTICAgICAgMQorCisjZGVmaW5lIElTUDJ4MDBfUE9SVERCICAgICAgICAgIDEKKworLyogU2V0IHRoZSBmb2xsb3dpbmcgdG8gMSB0byBpbmNsdWRlIGZhYnJpYyBzdXBwb3J0LCBmYWJyaWMgc3VwcG9ydCBpcyAKKyAqIGN1cnJlbnRseSBub3QgYXMgd2VsbCB0ZXN0ZWQgYXMgdGhlIG90aGVyIGFzcGVjdHMgb2YgdGhlIGRyaXZlciAqLworCisjZGVmaW5lIElTUDJ4MDBfRkFCUklDICAgICAgICAgIDEKKworLyogIE1hY3JvcyB1c2VkIGZvciBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgREVCVUdfSVNQMngwMAkJMAorI2RlZmluZSBERUJVR19JU1AyeDAwX0lOVAkwCisjZGVmaW5lIERFQlVHX0lTUDJ4MDBfSU5UUgkwCisjZGVmaW5lIERFQlVHX0lTUDJ4MDBfU0VUVVAJMAorI2RlZmluZSBERUJVR19JU1AyeDAwX0ZBQlJJQyAgICAwCisjZGVmaW5lIFRSQUNFX0lTUCAJCTAgCisKKworI2RlZmluZSBERUZBVUxUX0xPT1BfQ09VTlQJMTAwMDAwMDAwMAorCisjZGVmaW5lIElTUF9USU1FT1VUICgyKkhaKQorLyogRW5kIENvbmZpZ3VyYXRpb24gc2VjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaWYgVFJBQ0VfSVNQCisKKyNkZWZpbmUgVFJBQ0VfQlVGX0xFTgkoMzIqMTAyNCkKKworc3RydWN0IHsKKwl1X2xvbmcgbmV4dDsKKwlzdHJ1Y3QgeworCQl1X2xvbmcgdGltZTsKKwkJdV9pbnQgaW5kZXg7CisJCXVfaW50IGFkZHI7CisJCXVfY2hhciAqbmFtZTsKKwl9IGJ1ZltUUkFDRV9CVUZfTEVOXTsKK30gdHJhY2U7CisKKyNkZWZpbmUgVFJBQ0UodywgaSwgYSkJCQkJCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKKwkJCQkJCQkJXAorCXNhdmVfZmxhZ3MoZmxhZ3MpOwkJCQkJXAorCWNsaSgpOwkJCQkJCQlcCisJdHJhY2UuYnVmW3RyYWNlLm5leHRdLm5hbWUgID0gKHcpOwkJCVwKKwl0cmFjZS5idWZbdHJhY2UubmV4dF0udGltZSAgPSBqaWZmaWVzOwkJCVwKKwl0cmFjZS5idWZbdHJhY2UubmV4dF0uaW5kZXggPSAoaSk7CQkJXAorCXRyYWNlLmJ1Zlt0cmFjZS5uZXh0XS5hZGRyICA9IChsb25nKSAoYSk7CQlcCisJdHJhY2UubmV4dCA9ICh0cmFjZS5uZXh0ICsgMSkgJiAoVFJBQ0VfQlVGX0xFTiAtIDEpOwlcCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CQkJCQlcCit9CisKKyNlbHNlCisjZGVmaW5lIFRSQUNFKHcsIGksIGEpCisjZW5kaWYKKworI2lmIERFQlVHX0lTUDJ4MDBfRkFCUklDCisjZGVmaW5lIERFQlVHX0ZBQlJJQyh4KQl4CisjZWxzZQorI2RlZmluZSBERUJVR19GQUJSSUMoeCkKKyNlbmRpZgkJCQkvKiBERUJVR19JU1AyeDAwX0ZBQlJJQyAqLworCisKKyNpZiBERUJVR19JU1AyeDAwCisjZGVmaW5lIEVOVEVSKHgpCXByaW50aygiaXNwMngwMCA6IGVudGVyaW5nICVzKClcbiIsIHgpOworI2RlZmluZSBMRUFWRSh4KQlwcmludGsoImlzcDJ4MDAgOiBsZWF2aW5nICVzKClcbiIsIHgpOworI2RlZmluZSBERUJVRyh4KQl4CisjZWxzZQorI2RlZmluZSBFTlRFUih4KQorI2RlZmluZSBMRUFWRSh4KQorI2RlZmluZSBERUJVRyh4KQorI2VuZGlmCQkJCS8qIERFQlVHX0lTUDJ4MDAgKi8KKworI2lmIERFQlVHX0lTUDJ4MDBfSU5UUgorI2RlZmluZSBFTlRFUl9JTlRSKHgpCXByaW50aygiaXNwMngwMCA6IGVudGVyaW5nICVzKClcbiIsIHgpOworI2RlZmluZSBMRUFWRV9JTlRSKHgpCXByaW50aygiaXNwMngwMCA6IGxlYXZpbmcgJXMoKVxuIiwgeCk7CisjZGVmaW5lIERFQlVHX0lOVFIoeCkJeAorI2Vsc2UKKyNkZWZpbmUgRU5URVJfSU5UUih4KQorI2RlZmluZSBMRUFWRV9JTlRSKHgpCisjZGVmaW5lIERFQlVHX0lOVFIoeCkKKyNlbmRpZgkJCQkvKiBERUJVRyBJU1AyeDAwX0lOVFIgKi8KKworCisjZGVmaW5lIElTUDIxMDBfUkVWX0lEMQkgICAgICAgMQorI2RlZmluZSBJU1AyMTAwX1JFVl9JRDMgICAgICAgIDMKKyNkZWZpbmUgSVNQMjIwMF9SRVZfSUQ1ICAgICAgICA1CisKKy8qIGhvc3QgY29uZmlndXJhdGlvbiBhbmQgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVF9IQ0NSCTB4YzAJLyogaG9zdCBjb21tYW5kIGFuZCBjb250cm9sICovCisKKy8qIHBjaSBidXMgaW50ZXJmYWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBGTEFTSF9CSU9TX0FERFIJMHgwMAorI2RlZmluZSBGTEFTSF9CSU9TX0RBVEEJMHgwMgorI2RlZmluZSBJU1BfQ1RSTF9TVEFUVVMJMHgwNgkvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICMxICovCisjZGVmaW5lIFBDSV9JTlRFUl9DVEwJMHgwOAkvKiBwY2kgaW50ZXJydXB0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUENJX0lOVEVSX1NUUwkweDBhCS8qIHBjaSBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFBDSV9TRU1BUEhPUkUJMHgwYwkvKiBwY2kgc2VtYXBob3JlICovCisjZGVmaW5lIFBDSV9OVlJBTQkweDBlCS8qIHBjaSBudnJhbSBpbnRlcmZhY2UgKi8KKworLyogbWFpbGJveCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUJPWDAJCTB4MTAJLyogbWFpbGJveCAwICovCisjZGVmaW5lIE1CT1gxCQkweDEyCS8qIG1haWxib3ggMSAqLworI2RlZmluZSBNQk9YMgkJMHgxNAkvKiBtYWlsYm94IDIgKi8KKyNkZWZpbmUgTUJPWDMJCTB4MTYJLyogbWFpbGJveCAzICovCisjZGVmaW5lIE1CT1g0CQkweDE4CS8qIG1haWxib3ggNCAqLworI2RlZmluZSBNQk9YNQkJMHgxYQkvKiBtYWlsYm94IDUgKi8KKyNkZWZpbmUgTUJPWDYJCTB4MWMJLyogbWFpbGJveCA2ICovCisjZGVmaW5lIE1CT1g3CQkweDFlCS8qIG1haWxib3ggNyAqLworCisvKiBtYWlsYm94IGNvbW1hbmQgY29tcGxldGUgc3RhdHVzIGNvZGVzICovCisjZGVmaW5lIE1CT1hfQ09NTUFORF9DT01QTEVURQkJMHg0MDAwCisjZGVmaW5lIElOVkFMSURfQ09NTUFORAkJCTB4NDAwMQorI2RlZmluZSBIT1NUX0lOVEVSRkFDRV9FUlJPUgkJMHg0MDAyCisjZGVmaW5lIFRFU1RfRkFJTEVECQkJMHg0MDAzCisjZGVmaW5lIENPTU1BTkRfRVJST1IJCQkweDQwMDUKKyNkZWZpbmUgQ09NTUFORF9QQVJBTV9FUlJPUgkJMHg0MDA2CisjZGVmaW5lIFBPUlRfSURfVVNFRCAgICAgICAgICAgICAgICAgICAgMHg0MDA3CisjZGVmaW5lIExPT1BfSURfVVNFRCAgICAgICAgICAgICAgICAgICAgMHg0MDA4CisjZGVmaW5lIEFMTF9JRFNfVVNFRCAgICAgICAgICAgICAgICAgICAgMHg0MDA5CisKKy8qIGFzeW5jIGV2ZW50IHN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBSRVNFVF9ERVRFQ1RFRCAgCQkweDgwMDEKKyNkZWZpbmUgU1lTVEVNX0VSUk9SCQkJMHg4MDAyCisjZGVmaW5lIFJFUVVFU1RfVFJBTlNGRVJfRVJST1IJCTB4ODAwMworI2RlZmluZSBSRVNQT05TRV9UUkFOU0ZFUl9FUlJPUgkJMHg4MDA0CisjZGVmaW5lIFJFUVVFU1RfUVVFVUVfV0FLRVVQCQkweDgwMDUKKyNkZWZpbmUgTElQX09DQ1VSUkVEICAgICAgICAgICAgICAgICAgICAgMHg4MDEwCisjZGVmaW5lIExPT1BfVVAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIExPT1BfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIExJUF9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgMHg4MDEzCisjZGVmaW5lIFBPUlRfREJfQ0hBTkdFRCAgICAgICAgICAgICAgICAgMHg4MDE0CisjZGVmaW5lIENIQU5HRV9OT1RJRklDQVRJT04gICAgICAgICAgICAgMHg4MDE1CisjZGVmaW5lIFNDU0lfQ09NTUFORF9DT01QTEVURSAgICAgICAgICAgMHg4MDIwCisjZGVmaW5lIFBPSU5UX1RPX1BPSU5UX1VQICAgICAgICAgICAgICAgMHg4MDMwCisjZGVmaW5lIENPTk5FQ1RJT05fTU9ERSAgICAgICAgICAgICAgICAgMHg4MDM2CisKK3N0cnVjdCBFbnRyeV9oZWFkZXIgeworCXVfY2hhciBlbnRyeV90eXBlOworCXVfY2hhciBlbnRyeV9jbnQ7CisJdV9jaGFyIHN5c19kZWZfMTsKKwl1X2NoYXIgZmxhZ3M7Cit9OworCisvKiBlbnRyeSBoZWFkZXIgdHlwZSBjb21tYW5kcyAqLworI2RlZmluZSBFTlRSWV9DT01NQU5ECQkweDE5CisjZGVmaW5lIEVOVFJZX0NPTlRJTlVBVElPTgkweDBhCisKKyNkZWZpbmUgRU5UUllfU1RBVFVTCQkweDAzCisjZGVmaW5lIEVOVFJZX01BUktFUgkJMHgwNAorCisKKy8qIGVudHJ5IGhlYWRlciBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVGTEFHX0JVU1kJCTIKKyNkZWZpbmUgRUZMQUdfQkFEX0hFQURFUgk0CisjZGVmaW5lIEVGTEFHX0JBRF9QQVlMT0FECTgKKworc3RydWN0IGRhdGFzZWcgeworCXVfaW50IGRfYmFzZTsKKwl1X2ludCBkX2Jhc2VfaGk7CisJdV9pbnQgZF9jb3VudDsKK307CisKK3N0cnVjdCBDb21tYW5kX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyIGhkcjsKKwl1X2ludCBoYW5kbGU7CisJdV9jaGFyIHRhcmdldF9sdW47CisJdV9jaGFyIHRhcmdldF9pZDsKKwl1X3Nob3J0IGV4cGFuZGVkX2x1bjsKKwl1X3Nob3J0IGNvbnRyb2xfZmxhZ3M7CisJdV9zaG9ydCByc3ZkMjsKKwl1X3Nob3J0IHRpbWVfb3V0OworCXVfc2hvcnQgc2VnbWVudF9jbnQ7CisJdV9jaGFyIGNkYlsxNl07CisJdV9pbnQgdG90YWxfYnl0ZV9jbnQ7CisJc3RydWN0IGRhdGFzZWcgZGF0YXNlZ1tEQVRBU0VHU19QRVJfQ09NTUFORF07Cit9OworCisvKiBjb21tYW5kIGVudHJ5IGNvbnRyb2wgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDRkxBR19OT0RJU0MJCTB4MDEKKyNkZWZpbmUgQ0ZMQUdfSEVBRF9UQUcJCTB4MDIKKyNkZWZpbmUgQ0ZMQUdfT1JERVJFRF9UQUcJMHgwNAorI2RlZmluZSBDRkxBR19TSU1QTEVfVEFHCTB4MDgKKyNkZWZpbmUgQ0ZMQUdfVEFSX1JUTgkJMHgxMAorI2RlZmluZSBDRkxBR19SRUFECQkweDIwCisjZGVmaW5lIENGTEFHX1dSSVRFCQkweDQwCisKK3N0cnVjdCBDb250aW51YXRpb25fRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIgaGRyOworCXN0cnVjdCBkYXRhc2VnIGRhdGFzZWdbREFUQVNFR1NfUEVSX0NPTlRdOworfTsKKworc3RydWN0IE1hcmtlcl9FbnRyeSB7CisJc3RydWN0IEVudHJ5X2hlYWRlciBoZHI7CisJdV9pbnQgcmVzZXJ2ZWQ7CisJdV9jaGFyIHRhcmdldF9sdW47CisJdV9jaGFyIHRhcmdldF9pZDsKKwl1X2NoYXIgbW9kaWZpZXI7CisJdV9jaGFyIGV4cGFuZGVkX2x1bjsKKwl1X2NoYXIgcnN2ZHNbNTJdOworfTsKKworLyogbWFya2VyIGVudHJ5IG1vZGlmaWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNZTkNfREVWSUNFCTAKKyNkZWZpbmUgU1lOQ19UQVJHRVQJMQorI2RlZmluZSBTWU5DX0FMTAkyCisKK3N0cnVjdCBTdGF0dXNfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIgaGRyOworCXVfaW50IGhhbmRsZTsKKwl1X3Nob3J0IHNjc2lfc3RhdHVzOworCXVfc2hvcnQgY29tcGxldGlvbl9zdGF0dXM7CisJdV9zaG9ydCBzdGF0ZV9mbGFnczsKKwl1X3Nob3J0IHN0YXR1c19mbGFnczsKKwl1X3Nob3J0IHJlc19pbmZvX2xlbjsKKwl1X3Nob3J0IHJlcV9zZW5zZV9sZW47CisJdV9pbnQgcmVzaWR1YWw7CisJdV9jaGFyIHJlc19pbmZvWzhdOworCXVfY2hhciByZXFfc2Vuc2VfZGF0YVszMl07Cit9OworCisvKiBzdGF0dXMgZW50cnkgY29tcGxldGlvbiBzdGF0dXMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ1NfQ09NUExFVEUJCQkweDAwMDAKKyNkZWZpbmUgQ1NfRE1BX0VSUk9SCQkJMHgwMDAyCisjZGVmaW5lIENTX1JFU0VUX09DQ1VSUkVECQkweDAwMDQKKyNkZWZpbmUgQ1NfQUJPUlRFRAkJCTB4MDAwNQorI2RlZmluZSBDU19USU1FT1VUCQkJMHgwMDA2CisjZGVmaW5lIENTX0RBVEFfT1ZFUlJVTgkJCTB4MDAwNworI2RlZmluZSBDU19EQVRBX1VOREVSUlVOCQkweDAwMTUKKyNkZWZpbmUgQ1NfUVVFVUVfRlVMTAkJCTB4MDAxYworI2RlZmluZSBDU19QT1JUX1VOQVZBSUxBQkxFICAgICAgICAgICAgIDB4MDAyOAorI2RlZmluZSBDU19QT1JUX0xPR0dFRF9PVVQgICAgICAgICAgICAgIDB4MDAyOQorI2RlZmluZSBDU19QT1JUX0NPTkZJR19DSEFOR0VECQkweDAwMmEKKworLyogc3RhdHVzIGVudHJ5IHN0YXRlIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0ZfU0VOVF9DREIJCQkweDA0MDAKKyNkZWZpbmUgU0ZfVFJBTlNGRVJSRURfREFUQQkJMHgwODAwCisjZGVmaW5lIFNGX0dPVF9TVEFUVVMJCQkweDEwMDAKKworLyogc3RhdHVzIGVudHJ5IHN0YXR1cyBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNURl9CVVNfUkVTRVQJCQkweDAwMDgKKyNkZWZpbmUgU1RGX0RFVklDRV9SRVNFVAkJMHgwMDEwCisjZGVmaW5lIFNURl9BQk9SVEVECQkJMHgwMDIwCisjZGVmaW5lIFNURl9USU1FT1VUCQkJMHgwMDQwCisKKy8qIGludGVycnVwdCBjb250cm9sIGNvbW1hbmRzICovCisjZGVmaW5lIElTUF9FTl9JTlQJCQkweDgwMDAKKyNkZWZpbmUgSVNQX0VOX1JJU0MJCQkweDAwMDgKKworLyogaG9zdCBjb250cm9sIGNvbW1hbmRzICovCisjZGVmaW5lIEhDQ1JfTk9QCQkJMHgwMDAwCisjZGVmaW5lIEhDQ1JfUkVTRVQJCQkweDEwMDAKKyNkZWZpbmUgSENDUl9QQVVTRQkJCTB4MjAwMAorI2RlZmluZSBIQ0NSX1JFTEVBU0UJCQkweDMwMDAKKyNkZWZpbmUgSENDUl9TSU5HTEVfU1RFUAkJMHg0MDAwCisjZGVmaW5lIEhDQ1JfU0VUX0hPU1RfSU5UUgkJMHg1MDAwCisjZGVmaW5lIEhDQ1JfQ0xFQVJfSE9TVF9JTlRSCQkweDYwMDAKKyNkZWZpbmUgSENDUl9DTEVBUl9SSVNDX0lOVFIJCTB4NzAwMAorI2RlZmluZSBIQ0NSX0JQX0VOQUJMRQkJCTB4ODAwMAorI2RlZmluZSBIQ0NSX0JJT1NfRElTQUJMRQkJMHg5MDAwCisjZGVmaW5lIEhDQ1JfVEVTVF9NT0RFCQkJMHhmMDAwCisKKyNkZWZpbmUgUklTQ19CVVNZCQkJMHgwMDA0CisKKy8qIG1haWxib3ggY29tbWFuZHMgKi8KKyNkZWZpbmUgTUJPWF9OT19PUAkJCTB4MDAwMAorI2RlZmluZSBNQk9YX0xPQURfUkFNCQkJMHgwMDAxCisjZGVmaW5lIE1CT1hfRVhFQ19GSVJNV0FSRQkJMHgwMDAyCisjZGVmaW5lIE1CT1hfRFVNUF9SQU0JCQkweDAwMDMKKyNkZWZpbmUgTUJPWF9XUklURV9SQU1fV09SRAkJMHgwMDA0CisjZGVmaW5lIE1CT1hfUkVBRF9SQU1fV09SRAkJMHgwMDA1CisjZGVmaW5lIE1CT1hfTUFJTEJPWF9SRUdfVEVTVAkJMHgwMDA2CisjZGVmaW5lIE1CT1hfVkVSSUZZX0NIRUNLU1VNCQkweDAwMDcKKyNkZWZpbmUgTUJPWF9BQk9VVF9GSVJNV0FSRQkJMHgwMDA4CisjZGVmaW5lIE1CT1hfTE9BRF9SSVNDX1JBTSAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIE1CT1hfRFVNUF9SSVNDX1JBTSAgICAgICAgICAgICAgMHgwMDBhCisjZGVmaW5lIE1CT1hfQ0hFQ0tfRklSTVdBUkUJCTB4MDAwZQorI2RlZmluZSBNQk9YX0lOSVRfUkVRX1FVRVVFCQkweDAwMTAKKyNkZWZpbmUgTUJPWF9JTklUX1JFU19RVUVVRQkJMHgwMDExCisjZGVmaW5lIE1CT1hfRVhFQ1VURV9JT0NCCQkweDAwMTIKKyNkZWZpbmUgTUJPWF9XQUtFX1VQCQkJMHgwMDEzCisjZGVmaW5lIE1CT1hfU1RPUF9GSVJNV0FSRQkJMHgwMDE0CisjZGVmaW5lIE1CT1hfQUJPUlRfSU9DQgkJCTB4MDAxNQorI2RlZmluZSBNQk9YX0FCT1JUX0RFVklDRQkJMHgwMDE2CisjZGVmaW5lIE1CT1hfQUJPUlRfVEFSR0VUCQkweDAwMTcKKyNkZWZpbmUgTUJPWF9CVVNfUkVTRVQJCQkweDAwMTgKKyNkZWZpbmUgTUJPWF9TVE9QX1FVRVVFCQkJMHgwMDE5CisjZGVmaW5lIE1CT1hfU1RBUlRfUVVFVUUJCTB4MDAxYQorI2RlZmluZSBNQk9YX1NJTkdMRV9TVEVQX1FVRVVFCQkweDAwMWIKKyNkZWZpbmUgTUJPWF9BQk9SVF9RVUVVRQkJMHgwMDFjCisjZGVmaW5lIE1CT1hfR0VUX0RFVl9RVUVVRV9TVEFUVVMJMHgwMDFkCisjZGVmaW5lIE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRVUwkweDAwMWYKKyNkZWZpbmUgTUJPWF9HRVRfSU5JVF9TQ1NJX0lECQkweDAwMjAKKyNkZWZpbmUgTUJPWF9HRVRfUkVUUllfQ09VTlQJCTB4MDAyMgorI2RlZmluZSBNQk9YX0dFVF9UQVJHRVRfUEFSQU1TCQkweDAwMjgKKyNkZWZpbmUgTUJPWF9HRVRfREVWX1FVRVVFX1BBUkFNUwkweDAwMjkKKyNkZWZpbmUgTUJPWF9TRVRfUkVUUllfQ09VTlQJCTB4MDAzMgorI2RlZmluZSBNQk9YX1NFVF9UQVJHRVRfUEFSQU1TCQkweDAwMzgKKyNkZWZpbmUgTUJPWF9TRVRfREVWX1FVRVVFX1BBUkFNUwkweDAwMzkKKyNkZWZpbmUgTUJPWF9FWEVDVVRFX0lPQ0I2NCAgICAgICAgICAgICAweDAwNTQKKyNkZWZpbmUgTUJPWF9JTklUX0ZJUk1XQVJFICAgICAgICAgICAgICAweDAwNjAKKyNkZWZpbmUgTUJPWF9HRVRfSU5JVF9DQiAgICAgICAgICAgICAgICAweDAwNjEKKyNkZWZpbmUgTUJPWF9JTklUX0xJUAkJCTB4MDA2MgorI2RlZmluZSBNQk9YX0dFVF9QT1NfTUFQICAgICAgICAgICAgICAgIDB4MDA2MworI2RlZmluZSBNQk9YX0dFVF9QT1JUX0RCICAgICAgICAgICAgICAgIDB4MDA2NAorI2RlZmluZSBNQk9YX0NMRUFSX0FDQSAgICAgICAgICAgICAgICAgIDB4MDA2NQorI2RlZmluZSBNQk9YX1RBUkdFVF9SRVNFVCAgICAgICAgICAgICAgIDB4MDA2NgorI2RlZmluZSBNQk9YX0NMRUFSX1RBU0tfU0VUICAgICAgICAgICAgIDB4MDA2NworI2RlZmluZSBNQk9YX0FCT1JUX1RBU0tfU0VUICAgICAgICAgICAgIDB4MDA2OAorI2RlZmluZSBNQk9YX0dFVF9GSVJNV0FSRV9TVEFURSAgICAgICAgIDB4MDA2OQorI2RlZmluZSBNQk9YX0dFVF9QT1JUX05BTUUgICAgICAgICAgICAgIDB4MDA2YQorI2RlZmluZSBNQk9YX1NFTkRfU05TICAgICAgICAgICAgICAgICAgIDB4MDA2ZQorI2RlZmluZSBNQk9YX1BPUlRfTE9HSU4gICAgICAgICAgICAgICAgIDB4MDA2ZgorI2RlZmluZSBNQk9YX1NFTkRfQ0hBTkdFX1JFUVVFU1QgICAgICAgIDB4MDA3MAorI2RlZmluZSBNQk9YX1BPUlRfTE9HT1VUICAgICAgICAgICAgICAgIDB4MDA3MQorCisvKgorICoJRmlybXdhcmUgaWYgbmVlZGVkIChub3RlIHRoaXMgaXMgYSBoYWNrLCBpdCBiZWxvbmdzIGluIGEgc2VwYXJhdGUKKyAqCW1vZHVsZS4KKyAqLworIAorI2lmZGVmIENPTkZJR19TQ1NJX1FMT0dJQ19GQ19GSVJNV0FSRQorI2luY2x1ZGUgInFsb2dpY2ZjX2FzbS5jIgorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjAxID0gMHgxMDAwIDsKKyNlbmRpZgorCisvKiBFYWNoIGVsZW1lbnQgaW4gbWJveF9wYXJhbSBpcyBhbiA4IGJpdCBiaXRtYXAgd2hlcmUgZWFjaCBiaXQgaW5kaWNhdGVzCisgICBpZiB0aGF0IG1ib3ggc2hvdWxkIGJlIGNvcGllZCBhcyBpbnB1dC4gIEZvciBleGFtcGxlIDB4MiB3b3VsZCBtZWFuCisgICBvbmx5IGNvcHkgbWJveDEuICovCisKK3N0YXRpYyBjb25zdCB1X2NoYXIgbWJveF9wYXJhbVtdID0KK3sKKwkweDAxLAkJCS8qIE1CT1hfTk9fT1AgKi8KKwkweDFmLAkJCS8qIE1CT1hfTE9BRF9SQU0gKi8KKwkweDAzLAkJCS8qIE1CT1hfRVhFQ19GSVJNV0FSRSAqLworCTB4MWYsCQkJLyogTUJPWF9EVU1QX1JBTSAqLworCTB4MDcsCQkJLyogTUJPWF9XUklURV9SQU1fV09SRCAqLworCTB4MDMsCQkJLyogTUJPWF9SRUFEX1JBTV9XT1JEICovCisJMHhmZiwJCQkvKiBNQk9YX01BSUxCT1hfUkVHX1RFU1QgKi8KKwkweDAzLAkJCS8qIE1CT1hfVkVSSUZZX0NIRUNLU1VNICovCisJMHgwMSwJCQkvKiBNQk9YX0FCT1VUX0ZJUk1XQVJFICovCisJMHhmZiwJCQkvKiBNQk9YX0xPQURfUklTQ19SQU0gKi8KKwkweGZmLAkJCS8qIE1CT1hfRFVNUF9SSVNDX1JBTSAqLworCTB4MDAsCQkJLyogMHgwMDBiICovCisJMHgwMCwJCQkvKiAweDAwMGMgKi8KKwkweDAwLAkJCS8qIDB4MDAwZCAqLworCTB4MDEsCQkJLyogTUJPWF9DSEVDS19GSVJNV0FSRSAqLworCTB4MDAsCQkJLyogMHgwMDBmICovCisJMHgxZiwJCQkvKiBNQk9YX0lOSVRfUkVRX1FVRVVFICovCisJMHgyZiwJCQkvKiBNQk9YX0lOSVRfUkVTX1FVRVVFICovCisJMHgwZiwJCQkvKiBNQk9YX0VYRUNVVEVfSU9DQiAqLworCTB4MDMsCQkJLyogTUJPWF9XQUtFX1VQICovCisJMHgwMSwJCQkvKiBNQk9YX1NUT1BfRklSTVdBUkUgKi8KKwkweDBmLAkJCS8qIE1CT1hfQUJPUlRfSU9DQiAqLworCTB4MDMsCQkJLyogTUJPWF9BQk9SVF9ERVZJQ0UgKi8KKwkweDA3LAkJCS8qIE1CT1hfQUJPUlRfVEFSR0VUICovCisJMHgwMywJCQkvKiBNQk9YX0JVU19SRVNFVCAqLworCTB4MDMsCQkJLyogTUJPWF9TVE9QX1FVRVVFICovCisJMHgwMywJCQkvKiBNQk9YX1NUQVJUX1FVRVVFICovCisJMHgwMywJCQkvKiBNQk9YX1NJTkdMRV9TVEVQX1FVRVVFICovCisJMHgwMywJCQkvKiBNQk9YX0FCT1JUX1FVRVVFICovCisJMHgwMywJCQkvKiBNQk9YX0dFVF9ERVZfUVVFVUVfU1RBVFVTICovCisJMHgwMCwJCQkvKiAweDAwMWUgKi8KKwkweDAxLAkJCS8qIE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRVUyAqLworCTB4MDEsCQkJLyogTUJPWF9HRVRfSU5JVF9TQ1NJX0lEICovCisJMHgwMCwJCQkvKiAweDAwMjEgKi8KKwkweDAxLAkJCS8qIE1CT1hfR0VUX1JFVFJZX0NPVU5UICovCisJMHgwMCwJCQkvKiAweDAwMjMgKi8KKwkweDAwLAkJCS8qIDB4MDAyNCAqLworCTB4MDAsCQkJLyogMHgwMDI1ICovCisJMHgwMCwJCQkvKiAweDAwMjYgKi8KKwkweDAwLAkJCS8qIDB4MDAyNyAqLworCTB4MDMsCQkJLyogTUJPWF9HRVRfVEFSR0VUX1BBUkFNUyAqLworCTB4MDMsCQkJLyogTUJPWF9HRVRfREVWX1FVRVVFX1BBUkFNUyAqLworCTB4MDAsCQkJLyogMHgwMDJhICovCisJMHgwMCwJCQkvKiAweDAwMmIgKi8KKwkweDAwLAkJCS8qIDB4MDAyYyAqLworCTB4MDAsCQkJLyogMHgwMDJkICovCisJMHgwMCwJCQkvKiAweDAwMmUgKi8KKwkweDAwLAkJCS8qIDB4MDAyZiAqLworCTB4MDAsCQkJLyogMHgwMDMwICovCisJMHgwMCwJCQkvKiAweDAwMzEgKi8KKwkweDA3LAkJCS8qIE1CT1hfU0VUX1JFVFJZX0NPVU5UICovCisJMHgwMCwJCQkvKiAweDAwMzMgKi8KKwkweDAwLAkJCS8qIDB4MDAzNCAqLworCTB4MDAsCQkJLyogMHgwMDM1ICovCisJMHgwMCwJCQkvKiAweDAwMzYgKi8KKwkweDAwLAkJCS8qIDB4MDAzNyAqLworCTB4MGYsCQkJLyogTUJPWF9TRVRfVEFSR0VUX1BBUkFNUyAqLworCTB4MGYsCQkJLyogTUJPWF9TRVRfREVWX1FVRVVFX1BBUkFNUyAqLworCTB4MDAsCQkJLyogMHgwMDNhICovCisJMHgwMCwJCQkvKiAweDAwM2IgKi8KKwkweDAwLAkJCS8qIDB4MDAzYyAqLworCTB4MDAsCQkJLyogMHgwMDNkICovCisJMHgwMCwJCQkvKiAweDAwM2UgKi8KKwkweDAwLAkJCS8qIDB4MDAzZiAqLworCTB4MDAsCQkJLyogMHgwMDQwICovCisJMHgwMCwJCQkvKiAweDAwNDEgKi8KKwkweDAwLAkJCS8qIDB4MDA0MiAqLworCTB4MDAsCQkJLyogMHgwMDQzICovCisJMHgwMCwJCQkvKiAweDAwNDQgKi8KKwkweDAwLAkJCS8qIDB4MDA0NSAqLworCTB4MDAsCQkJLyogMHgwMDQ2ICovCisJMHgwMCwJCQkvKiAweDAwNDcgKi8KKwkweDAwLAkJCS8qIDB4MDA0OCAqLworCTB4MDAsCQkJLyogMHgwMDQ5ICovCisJMHgwMCwJCQkvKiAweDAwNGEgKi8KKwkweDAwLAkJCS8qIDB4MDA0YiAqLworCTB4MDAsCQkJLyogMHgwMDRjICovCisJMHgwMCwJCQkvKiAweDAwNGQgKi8KKwkweDAwLAkJCS8qIDB4MDA0ZSAqLworCTB4MDAsCQkJLyogMHgwMDRmICovCisJMHgwMCwJCQkvKiAweDAwNTAgKi8KKwkweDAwLAkJCS8qIDB4MDA1MSAqLworCTB4MDAsCQkJLyogMHgwMDUyICovCisJMHgwMCwJCQkvKiAweDAwNTMgKi8KKwkweGNmLAkJCS8qIE1CT1hfRVhFQ1VURV9JT0NCNjQgKi8KKwkweDAwLAkJCS8qIDB4MDA1NSAqLworCTB4MDAsCQkJLyogMHgwMDU2ICovCisJMHgwMCwJCQkvKiAweDAwNTcgKi8KKwkweDAwLAkJCS8qIDB4MDA1OCAqLworCTB4MDAsCQkJLyogMHgwMDU5ICovCisJMHgwMCwJCQkvKiAweDAwNWEgKi8KKwkweDAwLAkJCS8qIDB4MDA1YiAqLworCTB4MDAsCQkJLyogMHgwMDVjICovCisJMHgwMCwJCQkvKiAweDAwNWQgKi8KKwkweDAwLAkJCS8qIDB4MDA1ZSAqLworCTB4MDAsCQkJLyogMHgwMDVmICovCisJMHhmZiwJCQkvKiBNQk9YX0lOSVRfRklSTVdBUkUgKi8KKwkweGNkLAkJCS8qIE1CT1hfR0VUX0lOSVRfQ0IgKi8KKwkweDAxLAkJCS8qIE1CT1hfSU5JVF9MSVAgKi8KKwkweGNkLAkJCS8qIE1CT1hfR0VUX1BPU19NQVAgKi8KKwkweGNmLAkJCS8qIE1CT1hfR0VUX1BPUlRfREIgKi8KKwkweDAzLAkJCS8qIE1CT1hfQ0xFQVJfQUNBICovCisJMHgwMywJCQkvKiBNQk9YX1RBUkdFVF9SRVNFVCAqLworCTB4MDMsCQkJLyogTUJPWF9DTEVBUl9UQVNLX1NFVCAqLworCTB4MDMsCQkJLyogTUJPWF9BQk9SVF9UQVNLX1NFVCAqLworCTB4MDEsCQkJLyogTUJPWF9HRVRfRklSTVdBUkVfU1RBVEUgKi8KKwkweDAzLAkJCS8qIE1CT1hfR0VUX1BPUlRfTkFNRSAqLworCTB4MDAsCQkJLyogMHgwMDZiICovCisJMHgwMCwJCQkvKiAweDAwNmMgKi8KKwkweDAwLAkJCS8qIDB4MDA2ZCAqLworCTB4Y2YsCQkJLyogTUJPWF9TRU5EX1NOUyAqLworCTB4MGYsCQkJLyogTUJPWF9QT1JUX0xPR0lOICovCisJMHgwMywJCQkvKiBNQk9YX1NFTkRfQ0hBTkdFX1JFUVVFU1QgKi8KKwkweDAzLAkJCS8qIE1CT1hfUE9SVF9MT0dPVVQgKi8KK307CisKKyNkZWZpbmUgTUFYX01CT1hfQ09NTUFORAkoc2l6ZW9mKG1ib3hfcGFyYW0pL3NpemVvZih1X3Nob3J0KSkKKworCitzdHJ1Y3QgaWRfbmFtZV9tYXAgeworCXU2NCB3d247CisJdV9jaGFyIGxvb3BfaWQ7Cit9OworCitzdHJ1Y3Qgc25zX2NiIHsKKwl1X3Nob3J0IGxlbjsKKwl1X3Nob3J0IHJlczE7CisJdV9pbnQgcmVzcG9uc2VfbG93OworCXVfaW50IHJlc3BvbnNlX2hpZ2g7CisJdV9zaG9ydCBzdWJfbGVuOworCXVfc2hvcnQgcmVzMjsKKwl1X2NoYXIgZGF0YVs0NF07Cit9OworCisvKiBhZGRyZXNzIG9mIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0IGlzIHBhc3NlZCB0byBhZGFwdGVyIHRvIGluaXRpYWxpemUgdGhpbmdzCisgKi8KK3N0cnVjdCBpbml0X2NiIHsKKwl1X2NoYXIgdmVyc2lvbjsKKwl1X2NoYXIgcmVzZXZlcmQxWzFdOworCXVfc2hvcnQgZmlybV9vcHRzOworCXVfc2hvcnQgbWF4X2ZyYW1lX2xlbjsKKwl1X3Nob3J0IG1heF9pb2NiOworCXVfc2hvcnQgZXhlY190aHJvdHRsZTsKKwl1X2NoYXIgcmV0cnlfY250OworCXVfY2hhciByZXRyeV9kZWxheTsKKwl1X3Nob3J0IG5vZGVfbmFtZVs0XTsKKwl1X3Nob3J0IGhhcmRfYWRkcjsKKwl1X2NoYXIgcmVzZXJ2ZWQyWzEwXTsKKwl1X3Nob3J0IHJlcV9xdWV1ZV9vdXQ7CisJdV9zaG9ydCByZXNfcXVldWVfaW47CisJdV9zaG9ydCByZXFfcXVldWVfbGVuOworCXVfc2hvcnQgcmVzX3F1ZXVlX2xlbjsKKwl1X2ludCByZXFfcXVldWVfYWRkcl9sbzsKKwl1X2ludCByZXFfcXVldWVfYWRkcl9oaWdoOworCXVfaW50IHJlc19xdWV1ZV9hZGRyX2xvOworCXVfaW50IHJlc19xdWV1ZV9hZGRyX2hpZ2g7CisgICAgICAgIC8qIHRoZSByZXN0IG9mIHRoaXMgc3RydWN0dXJlIG9ubHkgYXBwbGllcyB0byB0aGUgaXNwMjIwMCAqLworICAgICAgICB1X3Nob3J0IGx1bl9lbmFibGVzOworICAgICAgICB1X2NoYXIgY21kX3Jlc291cmNlX2NudDsKKyAgICAgICAgdV9jaGFyIG5vdGlmeV9yZXNvdXJjZV9jbnQ7CisgICAgICAgIHVfc2hvcnQgdGltZW91dDsKKyAgICAgICAgdV9zaG9ydCByZXNlcnZlZDM7CisgICAgICAgIHVfc2hvcnQgYWRkX2Zpcm1fb3B0czsKKyAgICAgICAgdV9jaGFyIHJlc19hY2N1bV90aW1lcjsKKyAgICAgICAgdV9jaGFyIGlycV9kZWxheV90aW1lcjsKKyAgICAgICAgdV9zaG9ydCBzcGVjaWFsX29wdGlvbnM7CisgICAgICAgIHVfc2hvcnQgcmVzZXJ2ZWQ0WzEzXTsKK307CisKKy8qCisgKiBUaGUgcmVzdWx0IHF1ZXVlIGNhbiBiZSBxdWl0ZSBhIGJpdCBzbWFsbGVyIHNpbmNlIGNvbnRpbnVhdGlvbiBlbnRyaWVzCisgKiBkbyBub3Qgc2hvdyB1cCB0aGVyZToKKyAqLworI2RlZmluZSBSRVNfUVVFVUVfTEVOCQkoKFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4gKyAxKSAvIDggLSAxKQorI2RlZmluZSBRVUVVRV9FTlRSWV9MRU4JCTY0CisKKyNpZiBJU1AyeDAwX0ZBQlJJQworI2RlZmluZSBRTE9HSUNGQ19NQVhfSUQgICAgMHhmZgorI2Vsc2UKKyNkZWZpbmUgUUxPR0lDRkNfTUFYX0lEICAgIDB4N2QKKyNlbmRpZgorCisjZGVmaW5lIFFMT0dJQ0ZDX01BWF9MVU4JMTI4CisjZGVmaW5lIFFMT0dJQ0ZDX01BWF9MT09QX0lECTB4N2QKKworLyogdGhlIGZvbGxvd2luZyBjb25uZWN0aW9uIG9wdGlvbnMgb25seSBhcHBseSB0byB0aGUgMjIwMC4gIGkgaGF2ZSBvbmx5CisgKiBoYWQgc3VjY2VzcyB3aXRoIExPT1BfT05MWSBhbmQgUDJQX09OTFkuCisgKi8KKworI2RlZmluZSBMT09QX09OTFkgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUDJQX09OTFkgICAgICAgICAgICAgICAxCisjZGVmaW5lIExPT1BfUFJFRkVSRUQgICAgICAgICAgMgorI2RlZmluZSBQMlBfUFJFRkVSRUQgICAgICAgICAgIDMKKworI2RlZmluZSBDT05ORUNUSU9OX1BSRUZFUkVOQ0UgIExPT1BfT05MWQorCisvKiBhZGFwdGVyX3N0YXRlIHZhbHVlcyAqLworI2RlZmluZSBBU19GSVJNV0FSRV9ERUFEICAgICAgLTEKKyNkZWZpbmUgQVNfTE9PUF9ET1dOICAgICAgICAgICAwCisjZGVmaW5lIEFTX0xPT1BfR09PRCAgICAgICAgICAgMQorI2RlZmluZSBBU19SRURPX0ZBQlJJQ19QT1JUREIgIDIKKyNkZWZpbmUgQVNfUkVET19MT09QX1BPUlREQiAgICA0CisKKyNkZWZpbmUgUkVTX1NJWkUJKChSRVNfUVVFVUVfTEVOICsgMSkqUVVFVUVfRU5UUllfTEVOKQorI2RlZmluZSBSRVFfU0laRQkoKFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4gKyAxKSpRVUVVRV9FTlRSWV9MRU4pCisKK3N0cnVjdCBpc3AyeDAwX2hvc3RkYXRhIHsKKwl1X2NoYXIgcmV2aXNpb247CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJLyogcmVzdWx0IGFuZCByZXF1ZXN0IHF1ZXVlcyAoc2hhcmVkIHdpdGggaXNwMngwMCk6ICovCisJdV9pbnQgcmVxX2luX3B0cjsJLyogaW5kZXggb2YgbmV4dCByZXF1ZXN0IHNsb3QgKi8KKwl1X2ludCByZXNfb3V0X3B0cjsJLyogaW5kZXggb2YgbmV4dCByZXN1bHQgc2xvdCAqLworCisJLyogdGhpcyBpcyBoZXJlIHNvIHRoZSBxdWV1ZXMgYXJlIG5pY2VseSBhbGlnbmVkICovCisJbG9uZyBzZW5kX21hcmtlcjsJLyogZG8gd2UgbmVlZCB0byBzZW5kIGEgbWFya2VyPyAqLworCisJY2hhciAqIHJlczsKKwljaGFyICogcmVxOworCXN0cnVjdCBpbml0X2NiIGNvbnRyb2xfYmxvY2s7CisJaW50IGFkYXB0ZXJfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBpbnQgdGFnX2FnZXNbUUxPR0lDRkNfTUFYX0lEICsgMV07CisJU2NzaV9DbW5kICpoYW5kbGVfcHRyc1tRTE9HSUNGQ19SRVFfUVVFVUVfTEVOICsgMV07CisJdW5zaWduZWQgbG9uZyBoYW5kbGVfc2VyaWFsc1tRTE9HSUNGQ19SRVFfUVVFVUVfTEVOICsgMV07CisJc3RydWN0IGlkX25hbWVfbWFwIHBvcnRfZGJbUUxPR0lDRkNfTUFYX0lEICsgMV07CisJdV9jaGFyIG1ib3hfZG9uZTsKKwl1NjQgd3duOworCXVfaW50IHBvcnRfaWQ7CisJdV9jaGFyIHF1ZXVlZDsKKwl1X2NoYXIgaG9zdF9pZDsKKyAgICAgICAgc3RydWN0IHRpbWVyX2xpc3QgZXhwbG9yZV90aW1lcjsKKwlzdHJ1Y3QgaWRfbmFtZV9tYXAgdGVtcG1hcFtRTE9HSUNGQ19NQVhfSUQgKyAxXTsKK307CisKKworLyogcXVldWUgbGVuZ3RoJ3MgX211c3RfIGJlIHBvd2VyIG9mIHR3bzogKi8KKyNkZWZpbmUgUVVFVUVfREVQVEgoaW4sIG91dCwgcWwpCSgoaW4gLSBvdXQpICYgKHFsKSkKKyNkZWZpbmUgUkVRX1FVRVVFX0RFUFRIKGluLCBvdXQpCVFVRVVFX0RFUFRIKGluLCBvdXQsIAkJICAgICBcCisJCQkJCQkgICAgUUxPR0lDRkNfUkVRX1FVRVVFX0xFTikKKyNkZWZpbmUgUkVTX1FVRVVFX0RFUFRIKGluLCBvdXQpCVFVRVVFX0RFUFRIKGluLCBvdXQsIFJFU19RVUVVRV9MRU4pCisKK3N0YXRpYyB2b2lkIGlzcDJ4MDBfZW5hYmxlX2lycXMoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyB2b2lkIGlzcDJ4MDBfZGlzYWJsZV9pcnFzKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IGlzcDJ4MDBfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBpc3AyeDAwX3Jlc2V0X2hhcmR3YXJlKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IGlzcDJ4MDBfbWJveF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKiwgdV9zaG9ydFtdKTsKK3N0YXRpYyBpbnQgaXNwMngwMF9yZXR1cm5fc3RhdHVzKFNjc2lfQ21uZCAqLCBzdHJ1Y3QgU3RhdHVzX0VudHJ5ICopOworc3RhdGljIHZvaWQgaXNwMngwMF9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGlycXJldHVybl90IGRvX2lzcDJ4MDBfaW50cl9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpbnQgaXNwMngwMF9tYWtlX3BvcnRkYihzdHJ1Y3QgU2NzaV9Ib3N0ICopOworCisjaWYgSVNQMngwMF9GQUJSSUMKK3N0YXRpYyBpbnQgaXNwMngwMF9pbml0X2ZhYnJpYyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBpZF9uYW1lX21hcCAqLCBpbnQpOworI2VuZGlmCisKKyNpZiBVU0VfTlZSQU1fREVGQVVMVFMKK3N0YXRpYyBpbnQgaXNwMngwMF9nZXRfbnZyYW1fZGVmYXVsdHMoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3QgaW5pdF9jYiAqKTsKK3N0YXRpYyB1X3Nob3J0IGlzcDJ4MDBfcmVhZF9udnJhbV93b3JkKHN0cnVjdCBTY3NpX0hvc3QgKiwgdV9zaG9ydCk7CisjZW5kaWYKKworI2lmIERFQlVHX0lTUDJ4MDAKK3N0YXRpYyB2b2lkIGlzcDJ4MDBfcHJpbnRfc2NzaV9jbWQoU2NzaV9DbW5kICopOworI2VuZGlmCisKKyNpZiBERUJVR19JU1AyeDAwX0lOVFIKK3N0YXRpYyB2b2lkIGlzcDJ4MDBfcHJpbnRfc3RhdHVzX2VudHJ5KHN0cnVjdCBTdGF0dXNfRW50cnkgKik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGlzcDJ4MDBfZW5hYmxlX2lycXMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlvdXR3KElTUF9FTl9JTlQgfCBJU1BfRU5fUklTQywgaG9zdC0+aW9fcG9ydCArIFBDSV9JTlRFUl9DVEwpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AyeDAwX2Rpc2FibGVfaXJxcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCW91dHcoMHgwLCBob3N0LT5pb19wb3J0ICsgUENJX0lOVEVSX0NUTCk7Cit9CisKKworc3RhdGljIGludCBpc3AyeDAwX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0bXB0KQoreworCWludCBob3N0cyA9IDA7CisJdW5zaWduZWQgbG9uZyB3YWl0X3RpbWU7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IE5VTEw7CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZHNbMl07CisJZG1hX2FkZHJfdCBidXNhZGRyOworCWludCBpOworCisKKwlFTlRFUigiaXNwMngwMF9kZXRlY3QiKTsKKworICAgICAgIAlkZXZpY2VfaWRzWzBdID0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjEwMDsKKwlkZXZpY2VfaWRzWzFdID0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjIwMDsKKworCXRtcHQtPnByb2NfbmFtZSA9ICJpc3AyeDAwIjsKKworCWZvciAoaT0wOyBpPDI7IGkrKyl7CisJCXBkZXYgPSBOVUxMOworCSAgICAgICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBkZXZpY2VfaWRzW2ldLCBwZGV2KSkpIHsKKwkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJCQljb250aW51ZTsKKworCQkJLyogVHJ5IHRvIGNvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KKwkJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgJiYKKwkJCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpKQorCQkJCQljb250aW51ZTsKKworCQkgICAgICAgIGhvc3QgPSBzY3NpX3JlZ2lzdGVyKHRtcHQsIHNpemVvZihzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSkpOworCQkJaWYgKCFob3N0KSB7CisJCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IGNvdWxkIG5vdCByZWdpc3RlciBob3N0LlxuIiwgaG9zdHMpOworCQkJCWNvbnRpbnVlOworCQkJfQorIAkJCXNjc2lfc2V0X2RldmljZShob3N0LCAmcGRldi0+ZGV2KTsKKwkJCWhvc3QtPm1heF9pZCA9IFFMT0dJQ0ZDX01BWF9JRCArIDE7CisJCQlob3N0LT5tYXhfbHVuID0gUUxPR0lDRkNfTUFYX0xVTjsKKwkJCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCisJCQltZW1zZXQoaG9zdGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSkpOworCQkJaG9zdGRhdGEtPnBjaV9kZXYgPSBwZGV2OworCQkJaG9zdGRhdGEtPnJlcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJFU19TSVpFICsgUkVRX1NJWkUsICZidXNhZGRyKTsKKworCQkJaWYgKCFob3N0ZGF0YS0+cmVzKXsKKwkJCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcXVldWUuXG4iLCBob3N0cyk7CisJCQkgICAgICAgIHNjc2lfdW5yZWdpc3Rlcihob3N0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWhvc3RkYXRhLT5yZXEgPSBob3N0ZGF0YS0+cmVzICsgKFJFU19RVUVVRV9MRU4gKyAxKSpRVUVVRV9FTlRSWV9MRU47CisJCQlob3N0ZGF0YS0+cXVldWVkID0gMDsKKwkJCS8qIHNldCB1cCB0aGUgY29udHJvbCBibG9jayAqLworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2sudmVyc2lvbiA9IDB4MTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLmZpcm1fb3B0cyA9IGNwdV90b19sZTE2KDB4ODAwZSk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5tYXhfZnJhbWVfbGVuID0gY3B1X3RvX2xlMTYoMjA0OCk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5tYXhfaW9jYiA9IGNwdV90b19sZTE2KFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4pOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2suZXhlY190aHJvdHRsZSA9IGNwdV90b19sZTE2KFFMT0dJQ0ZDX0NNRF9QRVJfTFVOKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJldHJ5X2RlbGF5ID0gNTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJldHJ5X2NudCA9IDE7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMF0gPSBjcHVfdG9fbGUxNigweDAwMjApOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzFdID0gY3B1X3RvX2xlMTYoMHhFMDAwKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLm5vZGVfbmFtZVsyXSA9IGNwdV90b19sZTE2KDB4MDA4Qik7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbM10gPSBjcHVfdG9fbGUxNigweDAwMDApOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2suaGFyZF9hZGRyID0gY3B1X3RvX2xlMTYoMHgwMDAzKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJlcV9xdWV1ZV9sZW4gPSBjcHVfdG9fbGUxNihRTE9HSUNGQ19SRVFfUVVFVUVfTEVOICsgMSk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXNfcXVldWVfbGVuID0gY3B1X3RvX2xlMTYoUkVTX1FVRVVFX0xFTiArIDEpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2sucmVzX3F1ZXVlX2FkZHJfbG8gPSBjcHVfdG9fbGUzMihwY2k2NF9kbWFfbG8zMihidXNhZGRyKSk7CisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXNfcXVldWVfYWRkcl9oaWdoID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoYnVzYWRkcikpOworCQkJaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2sucmVxX3F1ZXVlX2FkZHJfbG8gPSBjcHVfdG9fbGUzMihwY2k2NF9kbWFfbG8zMihidXNhZGRyICsgUkVTX1NJWkUpKTsKKwkJCWhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJlcV9xdWV1ZV9hZGRyX2hpZ2ggPSBjcHVfdG9fbGUzMihwY2k2NF9kbWFfaGkzMihidXNhZGRyICsgUkVTX1NJWkUpKTsKKworCisJCQlob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5hZGRfZmlybV9vcHRzIHw9IGNwdV90b19sZTE2KENPTk5FQ1RJT05fUFJFRkVSRU5DRTw8NCk7CisJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0xPT1BfRE9XTjsKKwkJCWhvc3RkYXRhLT5leHBsb3JlX3RpbWVyLmRhdGEgPSAxOworCQkJaG9zdGRhdGEtPmhvc3RfaWQgPSBob3N0czsKKworCQkJaWYgKGlzcDJ4MDBfaW5pdChob3N0KSB8fCBpc3AyeDAwX3Jlc2V0X2hhcmR3YXJlKGhvc3QpKSB7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgUkVTX1NJWkUgKyBSRVFfU0laRSwgaG9zdGRhdGEtPnJlcywgYnVzYWRkcik7CisJCQkgICAgICAgIHNjc2lfdW5yZWdpc3Rlcihob3N0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWhvc3QtPnRoaXNfaWQgPSAwOworCisJCQlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBkb19pc3AyeDAwX2ludHJfaGFuZGxlciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJxbG9naWNmYyIsIGhvc3QpKSB7CisJCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IGludGVycnVwdCAlZCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCQkgICAgICAgaG9zdGRhdGEtPmhvc3RfaWQsIGhvc3QtPmlycSk7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgUkVTX1NJWkUgKyBSRVFfU0laRSwgaG9zdGRhdGEtPnJlcywgYnVzYWRkcik7CisJCQkJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmLCAicWxvZ2ljZmMiKSkgeworCQkJICAgICAgICBwcmludGsoInFsb2dpY2ZjJWQgOiBpL28gcmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgIgorCQkJCSAgICAgICAiaW4gdXNlXG4iLAorCQkJCSAgICAgICBob3N0ZGF0YS0+aG9zdF9pZCwgaG9zdC0+aW9fcG9ydCwgaG9zdC0+aW9fcG9ydCArIDB4ZmYpOworCQkJCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgUkVTX1NJWkUgKyBSRVFfU0laRSwgaG9zdGRhdGEtPnJlcywgYnVzYWRkcik7CisJCQkJc2NzaV91bnJlZ2lzdGVyKGhvc3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlvdXR3KDB4MCwgaG9zdC0+aW9fcG9ydCArIFBDSV9TRU1BUEhPUkUpOworCQkJb3V0dyhIQ0NSX0NMRUFSX1JJU0NfSU5UUiwgaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUik7CisJCQlpc3AyeDAwX2VuYWJsZV9pcnFzKGhvc3QpOworCQkJLyogd2FpdCBmb3IgdGhlIGxvb3AgdG8gY29tZSB1cCAqLworCQkJZm9yICh3YWl0X3RpbWUgPSBqaWZmaWVzICsgMTAgKiBIWjsgdGltZV9iZWZvcmUoamlmZmllcywgd2FpdF90aW1lKSAmJiBob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9PSBBU19MT09QX0RPV047KSB7CisJCQkgICAgICAgIGJhcnJpZXIoKTsKKwkJCQljcHVfcmVsYXgoKTsKKwkJCX0KKwkJCWlmIChob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9PSBBU19MT09QX0RPV04pIHsKKwkJCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogbGluayBpcyBub3QgdXBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCX0KKwkJCWhvc3RzKys7CisJCQlob3N0ZGF0YS0+ZXhwbG9yZV90aW1lci5kYXRhID0gMDsKKwkJfQorCX0KKworCisJLyogdGhpcyBidXN5IGxvb3Agc2hvdWxkIG5vdCBiZSBuZWVkZWQgYnV0IHRoZSBpc3AyeDAwIHNlZW1zIHRvIG5lZWQgCisJICAgc29tZSB0aW1lIGJlZm9yZSByZWNvZ25pemluZyBpdCBpcyBhdHRhY2hlZCB0byBhIGZhYnJpYyAqLworCisjaWYgSVNQMngwMF9GQUJSSUMKKwlpZiAoaG9zdHMpIHsKKwkJZm9yICh3YWl0X3RpbWUgPSBqaWZmaWVzICsgNSAqIEhaOyB0aW1lX2JlZm9yZShqaWZmaWVzLCB3YWl0X3RpbWUpOykgeworCQkJYmFycmllcigpOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9CisjZW5kaWYKKworCUxFQVZFKCJpc3AyeDAwX2RldGVjdCIpOworCisJcmV0dXJuIGhvc3RzOworfQorCisKK3N0YXRpYyBpbnQgaXNwMngwMF9tYWtlX3BvcnRkYihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCisJc2hvcnQgcGFyYW1bOF07CisJaW50IGksIGo7CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCisJaXNwMngwMF9kaXNhYmxlX2lycXMoaG9zdCk7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKwltZW1zZXQoaG9zdGRhdGEtPnRlbXBtYXAsIDAsIHNpemVvZihob3N0ZGF0YS0+dGVtcG1hcCkpOworCisjaWYgSVNQMngwMF9GQUJSSUMKKwlmb3IgKGkgPSAweDgxOyBpIDwgUUxPR0lDRkNfTUFYX0lEOyBpKyspIHsKKwkJcGFyYW1bMF0gPSBNQk9YX1BPUlRfTE9HT1VUOworCQlwYXJhbVsxXSA9IGkgPDwgODsKKwkJcGFyYW1bMl0gPSAwOworCQlwYXJhbVszXSA9IDA7CisKKwkJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKworCQkJREVCVUdfRkFCUklDKHByaW50aygicWxvZ2ljZmMlZCA6IGxvZ291dCBmYWlsZWQgJXggICV4XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgaSwgcGFyYW1bMF0pKTsKKwkJfQorCX0KKyNlbmRpZgorCisKKwlwYXJhbVswXSA9IE1CT1hfR0VUX0lOSVRfU0NTSV9JRDsKKworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSA9PSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJaG9zdGRhdGEtPnBvcnRfaWQgPSAoKHVfaW50KSBwYXJhbVszXSkgPDwgMTY7CisJCWhvc3RkYXRhLT5wb3J0X2lkIHw9IHBhcmFtWzJdOworCQlob3N0ZGF0YS0+dGVtcG1hcFswXS5sb29wX2lkID0gcGFyYW1bMV07CisJCWhvc3RkYXRhLT50ZW1wbWFwWzBdLnd3biA9IGhvc3RkYXRhLT53d247CisJfQorCWVsc2UgeworCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogZXJyb3IgZ2V0dGluZyBzY3NpIGlkLlxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCX0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9UUxPR0lDRkNfTUFYX0lEOyBpKyspCisgICAgICAgICAgICAgICAgaG9zdGRhdGEtPnRlbXBtYXBbaV0ubG9vcF9pZCA9IGhvc3RkYXRhLT50ZW1wbWFwWzBdLmxvb3BfaWQ7CisgICAKKyAgICAgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPD0gUUxPR0lDRkNfTUFYX0xPT1BfSUQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBhcmFtWzBdID0gTUJPWF9HRVRfUE9SVF9OQU1FOworCQlwYXJhbVsxXSA9IChpIDw8IDgpICYgMHhmZjAwOworCisJCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCQlpZiAocGFyYW1bMF0gPT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS5sb29wX2lkID0gaTsKKwkJCWhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biA9ICgodTY0KSAocGFyYW1bMl0gJiAweGZmKSkgPDwgNTY7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS53d24gfD0gKCh1NjQpICgocGFyYW1bMl0gPj4gOCkgJiAweGZmKSkgPDwgNDg7CisJCQlob3N0ZGF0YS0+dGVtcG1hcFtqXS53d24gfD0gKCh1NjQpIChwYXJhbVszXSAmIDB4ZmYpKSA8PCA0MDsKKwkJCWhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biB8PSAoKHU2NCkgKChwYXJhbVszXSA+PiA4KSAmIDB4ZmYpKSA8PCAzMjsKKwkJCWhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biB8PSAoKHU2NCkgKHBhcmFtWzZdICYgMHhmZikpIDw8IDI0OworCQkJaG9zdGRhdGEtPnRlbXBtYXBbal0ud3duIHw9ICgodTY0KSAoKHBhcmFtWzZdID4+IDgpICYgMHhmZikpIDw8IDE2OworCQkJaG9zdGRhdGEtPnRlbXBtYXBbal0ud3duIHw9ICgodTY0KSAocGFyYW1bN10gJiAweGZmKSkgPDwgODsKKwkJCWhvc3RkYXRhLT50ZW1wbWFwW2pdLnd3biB8PSAoKHU2NCkgKChwYXJhbVs3XSA+PiA4KSAmIDB4ZmYpKTsKKworCQkJaisrOworCisJCX0KKwl9CisKKworI2lmIElTUDJ4MDBfRkFCUklDCisJaXNwMngwMF9pbml0X2ZhYnJpYyhob3N0LCBob3N0ZGF0YS0+dGVtcG1hcCwgaik7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPD0gUUxPR0lDRkNfTUFYX0lEOyBpKyspIHsKKwkJaWYgKGhvc3RkYXRhLT50ZW1wbWFwW2ldLnd3biAhPSBob3N0ZGF0YS0+cG9ydF9kYltpXS53d24pIHsKKwkJCWZvciAoaiA9IDA7IGogPD0gUUxPR0lDRkNfTUFYX0lEOyBqKyspIHsKKwkJCQlpZiAoaG9zdGRhdGEtPnRlbXBtYXBbal0ud3duID09IGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3bikgeworCQkJCQlob3N0ZGF0YS0+cG9ydF9kYltpXS5sb29wX2lkID0gaG9zdGRhdGEtPnRlbXBtYXBbal0ubG9vcF9pZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGogPT0gUUxPR0lDRkNfTUFYX0lEICsgMSkKKwkJCQlob3N0ZGF0YS0+cG9ydF9kYltpXS5sb29wX2lkID0gaG9zdGRhdGEtPnRlbXBtYXBbMF0ubG9vcF9pZDsKKworCQkJZm9yIChqID0gMDsgaiA8PSBRTE9HSUNGQ19NQVhfSUQ7IGorKykgeworCQkJCWlmIChob3N0ZGF0YS0+cG9ydF9kYltqXS53d24gPT0gaG9zdGRhdGEtPnRlbXBtYXBbaV0ud3duIHx8ICFob3N0ZGF0YS0+cG9ydF9kYltqXS53d24pIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGogPT0gUUxPR0lDRkNfTUFYX0lEICsgMSkKKwkJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBUb28gbWFueSBzY3NpIGRldmljZXMsIG5vIG1vcmUgcm9vbSBpbiBwb3J0IG1hcC5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCWlmICghaG9zdGRhdGEtPnBvcnRfZGJbal0ud3duKSB7CisJCQkJaG9zdGRhdGEtPnBvcnRfZGJbal0ubG9vcF9pZCA9IGhvc3RkYXRhLT50ZW1wbWFwW2ldLmxvb3BfaWQ7CisJCQkJaG9zdGRhdGEtPnBvcnRfZGJbal0ud3duID0gaG9zdGRhdGEtPnRlbXBtYXBbaV0ud3duOworCQkJfQorCQl9IGVsc2UKKwkJCWhvc3RkYXRhLT5wb3J0X2RiW2ldLmxvb3BfaWQgPSBob3N0ZGF0YS0+dGVtcG1hcFtpXS5sb29wX2lkOworCisJfQorCisJaXNwMngwMF9lbmFibGVfaXJxcyhob3N0KTsKKworCXJldHVybiAwOworfQorCisKKyNpZiBJU1AyeDAwX0ZBQlJJQworCisjZGVmaW5lIEZBQlJJQ19QT1JUICAgICAgICAgIDB4N2UKKyNkZWZpbmUgRkFCUklDX0NPTlRST0xMRVIgICAgMHg3ZgorI2RlZmluZSBGQUJSSUNfU05TICAgICAgICAgICAweDgwCisKK2ludCBpc3AyeDAwX2luaXRfZmFicmljKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBpZF9uYW1lX21hcCAqcG9ydF9kYiwgaW50IGN1cl9zY3NpX2lkKQoreworCisJdV9zaG9ydCBwYXJhbVs4XTsKKwl1NjQgd3duOworCWludCBkb25lID0gMDsKKwl1X3Nob3J0IGxvb3BfaWQgPSAweDgxOworCXVfc2hvcnQgc2NzaV9pZCA9IGN1cl9zY3NpX2lkOworCXVfaW50IHBvcnRfaWQ7CisJc3RydWN0IHNuc19jYiAqcmVxOworCXVfY2hhciAqc25zX3Jlc3BvbnNlOworCWRtYV9hZGRyX3QgYnVzYWRkcjsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKwkKKwlERUJVR19GQUJSSUMocHJpbnRrKCJxbG9naWNmYyVkIDogQ2hlY2tpbmcgZm9yIGEgZmFicmljLlxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKwlwYXJhbVswXSA9IE1CT1hfR0VUX1BPUlRfTkFNRTsKKwlwYXJhbVsxXSA9ICh1MTYpRkFCUklDX1BPUlQgPDwgODsKKworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJREVCVUdfRkFCUklDKHByaW50aygicWxvZ2ljZmMlZCA6IGZhYnJpYyBjaGVjayByZXN1bHQgJXhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBwYXJhbVswXSkpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRrKCJxbG9naWNmYyVkIDogRmFicmljIGZvdW5kLlxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCisJcmVxID0gKHN0cnVjdCBzbnNfY2IgKilwY2lfYWxsb2NfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2Rldiwgc2l6ZW9mKCpyZXEpICsgNjA4LCAmYnVzYWRkcik7CisJCisJaWYgKCFyZXEpeworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBDb3VsZCBub3QgYWxsb2NhdGUgRE1BIHJlc291cmNlcyBmb3IgZmFicmljIGluaXRpYWxpemF0aW9uXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCXJldHVybiAwOworCX0KKwlzbnNfcmVzcG9uc2UgPSAodV9jaGFyICopKHJlcSArIDEpOworCisJaWYgKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19MT09QX1BPUlREQil7CisJICAgICAgICBtZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOworCQorCQlyZXEtPmxlbiA9IGNwdV90b19sZTE2KDgpOworCQlyZXEtPnJlc3BvbnNlX2xvdyA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIgKyBzaXplb2YoKnJlcSkpKTsKKwkJcmVxLT5yZXNwb25zZV9oaWdoID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoYnVzYWRkciArIHNpemVvZigqcmVxKSkpOworCQlyZXEtPnN1Yl9sZW4gPSBjcHVfdG9fbGUxNigyMik7CisJCXJlcS0+ZGF0YVswXSA9IDB4MTc7CisJCXJlcS0+ZGF0YVsxXSA9IDB4MDI7CisJCXJlcS0+ZGF0YVs4XSA9ICh1X2NoYXIpIChob3N0ZGF0YS0+cG9ydF9pZCAmIDB4ZmYpOworCQlyZXEtPmRhdGFbOV0gPSAodV9jaGFyKSAoaG9zdGRhdGEtPnBvcnRfaWQgPj4gOCAmIDB4ZmYpOworCQlyZXEtPmRhdGFbMTBdID0gKHVfY2hhcikgKGhvc3RkYXRhLT5wb3J0X2lkID4+IDE2ICYgMHhmZik7CisJCXJlcS0+ZGF0YVsxM10gPSAweDAxOworCQlwYXJhbVswXSA9IE1CT1hfU0VORF9TTlM7CisJCXBhcmFtWzFdID0gMzA7CisJCXBhcmFtWzJdID0gcGNpNjRfZG1hX2xvMzIoYnVzYWRkcikgPj4gMTY7CisJCXBhcmFtWzNdID0gcGNpNjRfZG1hX2xvMzIoYnVzYWRkcik7CisJCXBhcmFtWzZdID0gcGNpNjRfZG1hX2hpMzIoYnVzYWRkcikgPj4gMTY7CisJCXBhcmFtWzddID0gcGNpNjRfZG1hX2hpMzIoYnVzYWRkcik7CisKKwkJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCQorCQlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKQorCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IGVycm9yIHNlbmRpbmcgUkZDLTRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwl9CisKKwlwb3J0X2lkID0gaG9zdGRhdGEtPnBvcnRfaWQ7CisJd2hpbGUgKCFkb25lKSB7CisJCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CisKKwkJcmVxLT5sZW4gPSBjcHVfdG9fbGUxNigzMDQpOworCQlyZXEtPnJlc3BvbnNlX2xvdyA9IGNwdV90b19sZTMyKHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIgKyBzaXplb2YoKnJlcSkpKTsKKwkJcmVxLT5yZXNwb25zZV9oaWdoID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoYnVzYWRkciArIHNpemVvZigqcmVxKSkpOworCQlyZXEtPnN1Yl9sZW4gPSBjcHVfdG9fbGUxNig2KTsKKwkJcmVxLT5kYXRhWzBdID0gMHgwMDsKKwkJcmVxLT5kYXRhWzFdID0gMHgwMTsKKwkJcmVxLT5kYXRhWzhdID0gKHVfY2hhcikgKHBvcnRfaWQgJiAweGZmKTsKKwkJcmVxLT5kYXRhWzldID0gKHVfY2hhcikgKHBvcnRfaWQgPj4gOCAmIDB4ZmYpOworCQlyZXEtPmRhdGFbMTBdID0gKHVfY2hhcikgKHBvcnRfaWQgPj4gMTYgJiAweGZmKTsKKworCQlwYXJhbVswXSA9IE1CT1hfU0VORF9TTlM7CisJCXBhcmFtWzFdID0gMTQ7CisJCXBhcmFtWzJdID0gcGNpNjRfZG1hX2xvMzIoYnVzYWRkcikgPj4gMTY7CisJCXBhcmFtWzNdID0gcGNpNjRfZG1hX2xvMzIoYnVzYWRkcik7CisJCXBhcmFtWzZdID0gcGNpNjRfZG1hX2hpMzIoYnVzYWRkcikgPj4gMTY7CisJCXBhcmFtWzddID0gcGNpNjRfZG1hX2hpMzIoYnVzYWRkcik7CisKKwkJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJCWlmIChwYXJhbVswXSA9PSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCURFQlVHX0ZBQlJJQyhwcmludGsoInFsb2dpY2ZjJWQgOiBmb3VuZCBub2RlICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIsIGhvc3RkYXRhLT5ob3N0X2lkLCBzbnNfcmVzcG9uc2VbMjBdLCBzbnNfcmVzcG9uc2VbMjFdLCBzbnNfcmVzcG9uc2VbMjJdLCBzbnNfcmVzcG9uc2VbMjNdLCBzbnNfcmVzcG9uc2VbMjRdLCBzbnNfcmVzcG9uc2VbMjVdLCBzbnNfcmVzcG9uc2VbMjZdLCBzbnNfcmVzcG9uc2VbMjddKSk7CisJCQlERUJVR19GQUJSSUMocHJpbnRrKCIgIHBvcnQgaWQ6ICUwMnglMDJ4JTAyeFxuIiwgc25zX3Jlc3BvbnNlWzE3XSwgc25zX3Jlc3BvbnNlWzE4XSwgc25zX3Jlc3BvbnNlWzE5XSkpOworCQkJcG9ydF9pZCA9ICgodV9pbnQpIHNuc19yZXNwb25zZVsxN10pIDw8IDE2OworCQkJcG9ydF9pZCB8PSAoKHVfaW50KSBzbnNfcmVzcG9uc2VbMThdKSA8PCA4OworCQkJcG9ydF9pZCB8PSAoKHVfaW50KSBzbnNfcmVzcG9uc2VbMTldKTsKKwkJCXd3biA9ICgodTY0KSBzbnNfcmVzcG9uc2VbMjBdKSA8PCA1NjsKKwkJCXd3biB8PSAoKHU2NCkgc25zX3Jlc3BvbnNlWzIxXSkgPDwgNDg7CisJCQl3d24gfD0gKCh1NjQpIHNuc19yZXNwb25zZVsyMl0pIDw8IDQwOworCQkJd3duIHw9ICgodTY0KSBzbnNfcmVzcG9uc2VbMjNdKSA8PCAzMjsKKwkJCXd3biB8PSAoKHU2NCkgc25zX3Jlc3BvbnNlWzI0XSkgPDwgMjQ7CisJCQl3d24gfD0gKCh1NjQpIHNuc19yZXNwb25zZVsyNV0pIDw8IDE2OworCQkJd3duIHw9ICgodTY0KSBzbnNfcmVzcG9uc2VbMjZdKSA8PCA4OworCQkJd3duIHw9ICgodTY0KSBzbnNfcmVzcG9uc2VbMjddKTsKKwkJCWlmIChob3N0ZGF0YS0+cG9ydF9pZCA+PiA4ICE9IHBvcnRfaWQgPj4gOCkgeworCQkJCURFQlVHX0ZBQlJJQyhwcmludGsoInFsb2dpY2ZjJWQgOiBhZGRpbmcgYSBmYWJyaWMgcG9ydDogJXhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBwb3J0X2lkKSk7CisJCQkJcGFyYW1bMF0gPSBNQk9YX1BPUlRfTE9HSU47CisJCQkJcGFyYW1bMV0gPSBsb29wX2lkIDw8IDg7CisJCQkJcGFyYW1bMl0gPSAodV9zaG9ydCkgKHBvcnRfaWQgPj4gMTYpOworCQkJCXBhcmFtWzNdID0gKHVfc2hvcnQpIChwb3J0X2lkKTsKKworCQkJCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCQkJCWlmIChwYXJhbVswXSA9PSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCQkJcG9ydF9kYltzY3NpX2lkXS53d24gPSB3d247CisJCQkJCXBvcnRfZGJbc2NzaV9pZF0ubG9vcF9pZCA9IGxvb3BfaWQ7CisJCQkJCWxvb3BfaWQrKzsKKwkJCQkJc2NzaV9pZCsrOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50aygicWxvZ2ljZmMlZCA6IEVycm9yIHBlcmZvcm1pbmcgcG9ydCBsb2dpbiAleFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIHBhcmFtWzBdKTsKKwkJCQkJREVCVUdfRkFCUklDKHByaW50aygicWxvZ2ljZmMlZCA6IGxvb3BfaWQ6ICV4XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgbG9vcF9pZCkpOworCQkJCQlwYXJhbVswXSA9IE1CT1hfUE9SVF9MT0dPVVQ7CisJCQkJCXBhcmFtWzFdID0gbG9vcF9pZCA8PCA4OworCQkJCQlwYXJhbVsyXSA9IDA7CisJCQkJCXBhcmFtWzNdID0gMDsKKworCQkJCQlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisJCQkJCQorCQkJCX0KKworCQkJfQorCQkJaWYgKGhvc3RkYXRhLT5wb3J0X2lkID09IHBvcnRfaWQpCisJCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBHZXQgQWxsIE5leHQgZmFpbGVkICV4LlxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIHBhcmFtWzBdKTsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsIHNpemVvZigqcmVxKSArIDYwOCwgcmVxLCBidXNhZGRyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcGNpX2ZyZWVfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2Rldiwgc2l6ZW9mKCpyZXEpICsgNjA4LCByZXEsIGJ1c2FkZHIpOworCXJldHVybiAxOworfQorCisjZW5kaWYJCQkJLyogSVNQMngwMF9GQUJSSUMgKi8KKworCitzdGF0aWMgaW50IGlzcDJ4MDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwlkbWFfYWRkcl90IGJ1c2FkZHI7CisKKwlFTlRFUigiaXNwMngwMF9yZWxlYXNlIik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCW91dHcoMHgwLCBob3N0LT5pb19wb3J0ICsgUENJX0lOVEVSX0NUTCk7CisJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKKworCXJlbGVhc2VfcmVnaW9uKGhvc3QtPmlvX3BvcnQsIDB4ZmYpOworCisJYnVzYWRkciA9IHBjaTY0X2RtYV9idWlsZChsZTMyX3RvX2NwdShob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5yZXNfcXVldWVfYWRkcl9oaWdoKSwKKwkJCQkgIGxlMzJfdG9fY3B1KGhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLnJlc19xdWV1ZV9hZGRyX2xvKSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2RldiwgUkVTX1NJWkUgKyBSRVFfU0laRSwgaG9zdGRhdGEtPnJlcywgYnVzYWRkcik7CisKKwlMRUFWRSgiaXNwMngwMF9yZWxlYXNlIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqaXNwMngwMF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJRU5URVIoImlzcDJ4MDBfaW5mbyIpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJc3ByaW50ZihidWYsCisJCSJRTG9naWMgSVNQJTA0eCBTQ1NJIG9uIFBDSSBidXMgJTAyeCBkZXZpY2UgJTAyeCBpcnEgJWQgYmFzZSAweCVseCIsCisJCWhvc3RkYXRhLT5wY2lfZGV2LT5kZXZpY2UsIGhvc3RkYXRhLT5wY2lfZGV2LT5idXMtPm51bWJlciwgaG9zdGRhdGEtPnBjaV9kZXYtPmRldmZuLCBob3N0LT5pcnEsCisJCWhvc3QtPmlvX3BvcnQpOworCisKKwlMRUFWRSgiaXNwMngwMF9pbmZvIik7CisKKwlyZXR1cm4gYnVmOworfQorCisKKy8qCisgKiBUaGUgbWlkZGxlIFNDU0kgbGF5ZXIgZW5zdXJlcyB0aGF0IHF1ZXVlY29tbWFuZCBuZXZlciBnZXRzIGludm9rZWQKKyAqIGNvbmN1cnJlbnRseSB3aXRoIGl0c2VsZiBvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKHRob3VnaCB0aGUKKyAqIGludGVycnVwdCBoYW5kbGVyIG1heSBjYWxsIHRoaXMgcm91dGluZSBhcyBwYXJ0IG9mCisgKiByZXF1ZXN0LWNvbXBsZXRpb24gaGFuZGxpbmcpLgorICovCitzdGF0aWMgaW50IGlzcDJ4MDBfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqIENtbmQsIHZvaWQgKCpkb25lKSAoU2NzaV9DbW5kICopKQoreworCWludCBpLCBzZ19jb3VudCwgbiwgbnVtX2ZyZWU7CisJdV9pbnQgaW5fcHRyLCBvdXRfcHRyOworCXN0cnVjdCBkYXRhc2VnICpkczsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBDb21tYW5kX0VudHJ5ICpjbWQ7CisJc3RydWN0IENvbnRpbnVhdGlvbl9FbnRyeSAqY29udDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKworCUVOVEVSKCJpc3AyeDAwX3F1ZXVlY29tbWFuZCIpOworCisJaG9zdCA9IENtbmQtPmRldmljZS0+aG9zdDsKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlDbW5kLT5zY3NpX2RvbmUgPSBkb25lOworCisJREVCVUcoaXNwMngwMF9wcmludF9zY3NpX2NtZChDbW5kKSk7CisKKwlpZiAoaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgJiBBU19SRURPX0ZBQlJJQ19QT1JUREIgfHwgaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgJiBBU19SRURPX0xPT1BfUE9SVERCKSB7CisJCWlzcDJ4MDBfbWFrZV9wb3J0ZGIoaG9zdCk7CisJCWhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlID0gQVNfTE9PUF9HT09EOworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBQb3J0IERhdGFiYXNlXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCWZvciAoaSA9IDA7IGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3biAhPSAwOyBpKyspIHsKKwkJCXByaW50aygid3duOiAlMDh4JTA4eCAgc2NzaV9pZDogJXggIGxvb3BfaWQ6ICIsICh1X2ludCkgKGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3biA+PiAzMiksICh1X2ludCkgaG9zdGRhdGEtPnBvcnRfZGJbaV0ud3duLCBpKTsKKwkJCWlmIChob3N0ZGF0YS0+cG9ydF9kYltpXS5sb29wX2lkICE9IGhvc3RkYXRhLT5wb3J0X2RiWzBdLmxvb3BfaWQgfHwgaSA9PSAwKQorCQkJICAgICAgICBwcmludGsoIiV4IiwgaG9zdGRhdGEtPnBvcnRfZGJbaV0ubG9vcF9pZCk7CisJCQllbHNlCisJCQkgICAgICAgIHByaW50aygiTm90IEF2YWlsYWJsZSIpOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCWlmIChob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9PSBBU19GSVJNV0FSRV9ERUFEKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IFRoZSBmaXJtd2FyZSBpcyBkZWFkLCBqdXN0IHJldHVybi5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJaG9zdC0+bWF4X2lkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJb3V0X3B0ciA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDQpOworCWluX3B0ciA9IGhvc3RkYXRhLT5yZXFfaW5fcHRyOworCisJREVCVUcocHJpbnRrKCJxbG9naWNmYyVkIDogcmVxdWVzdCBxdWV1ZSBkZXB0aCAlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsCisJCSAgICAgUkVRX1FVRVVFX0RFUFRIKGluX3B0ciwgb3V0X3B0cikpKTsKKworCWNtZCA9IChzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqKSAmaG9zdGRhdGEtPnJlcVtpbl9wdHIqUVVFVUVfRU5UUllfTEVOXTsKKwlpbl9wdHIgPSAoaW5fcHRyICsgMSkgJiBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOOworCWlmIChpbl9wdHIgPT0gb3V0X3B0cikgeworCQlERUJVRyhwcmludGsoInFsb2dpY2ZjJWQgOiByZXF1ZXN0IHF1ZXVlIG92ZXJmbG93XG4iLCBob3N0ZGF0YS0+aG9zdF9pZCkpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGhvc3RkYXRhLT5zZW5kX21hcmtlcikgeworCQlzdHJ1Y3QgTWFya2VyX0VudHJ5ICptYXJrZXI7CisKKwkJVFJBQ0UoInF1ZXVlIG1hcmtlciIsIGluX3B0ciwgMCk7CisKKwkJREVCVUcocHJpbnRrKCJxbG9naWNmYyVkIDogYWRkaW5nIG1hcmtlciBlbnRyeVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKwkJbWFya2VyID0gKHN0cnVjdCBNYXJrZXJfRW50cnkgKikgY21kOworCQltZW1zZXQobWFya2VyLCAwLCBzaXplb2Yoc3RydWN0IE1hcmtlcl9FbnRyeSkpOworCisJCW1hcmtlci0+aGRyLmVudHJ5X3R5cGUgPSBFTlRSWV9NQVJLRVI7CisJCW1hcmtlci0+aGRyLmVudHJ5X2NudCA9IDE7CisJCW1hcmtlci0+bW9kaWZpZXIgPSBTWU5DX0FMTDsKKworCQlob3N0ZGF0YS0+c2VuZF9tYXJrZXIgPSAwOworCisJCWlmICgoKGluX3B0ciArIDEpICYgUUxPR0lDRkNfUkVRX1FVRVVFX0xFTikgPT0gb3V0X3B0cikgeworCQkJb3V0dyhpbl9wdHIsIGhvc3QtPmlvX3BvcnQgKyBNQk9YNCk7CisJCQlob3N0ZGF0YS0+cmVxX2luX3B0ciA9IGluX3B0cjsKKwkJCURFQlVHKHByaW50aygicWxvZ2ljZmMlZCA6IHJlcXVlc3QgcXVldWUgb3ZlcmZsb3dcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljbWQgPSAoc3RydWN0IENvbW1hbmRfRW50cnkgKikgJmhvc3RkYXRhLT5yZXFbaW5fcHRyKlFVRVVFX0VOVFJZX0xFTl07CisJCWluX3B0ciA9IChpbl9wdHIgKyAxKSAmIFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47CisJfQorCVRSQUNFKCJxdWV1ZSBjb21tYW5kIiwgaW5fcHRyLCBDbW5kKTsKKworCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgQ29tbWFuZF9FbnRyeSkpOworCisJLyogZmluZCBhIGZyZWUgaGFuZGxlIG1hcHBpbmcgc2xvdCAqLworCWZvciAoaSA9IGluX3B0cjsgaSAhPSAoaW5fcHRyIC0gMSkgJiYgaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldOyBpID0gKChpICsgMSkgJSAoUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiArIDEpKSk7CisKKwlpZiAoIWhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXSkgeworCQljbWQtPmhhbmRsZSA9IGNwdV90b19sZTMyKGkpOworCQlob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0gPSBDbW5kOworCQlob3N0ZGF0YS0+aGFuZGxlX3NlcmlhbHNbaV0gPSBDbW5kLT5zZXJpYWxfbnVtYmVyOworCX0gZWxzZSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IG5vIGhhbmRsZSBzbG90cywgdGhpcyBzaG91bGQgbm90IGhhcHBlbi5cbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJcHJpbnRrKCJob3N0ZGF0YS0+cXVldWVkIGlzICV4LCBpbl9wdHI6ICV4XG4iLCBob3N0ZGF0YS0+cXVldWVkLCBpbl9wdHIpOworCQlmb3IgKGkgPSAwOyBpIDw9IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47IGkrKyl7CisJCQlpZiAoIWhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXSl7CisJCQkJcHJpbnRrKCJzbG90ICVkIGhhcyAlcFxuIiwgaSwgaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwljbWQtPmhkci5lbnRyeV90eXBlID0gRU5UUllfQ09NTUFORDsKKwljbWQtPmhkci5lbnRyeV9jbnQgPSAxOworCWNtZC0+dGFyZ2V0X2x1biA9IENtbmQtPmRldmljZS0+bHVuOworCWNtZC0+ZXhwYW5kZWRfbHVuID0gY3B1X3RvX2xlMTYoQ21uZC0+ZGV2aWNlLT5sdW4pOworI2lmIElTUDJ4MDBfUE9SVERCCisJY21kLT50YXJnZXRfaWQgPSBob3N0ZGF0YS0+cG9ydF9kYltDbW5kLT5kZXZpY2UtPmlkXS5sb29wX2lkOworI2Vsc2UKKwljbWQtPnRhcmdldF9pZCA9IENtbmQtPnRhcmdldDsKKyNlbmRpZgorCWNtZC0+dG90YWxfYnl0ZV9jbnQgPSBjcHVfdG9fbGUzMihDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pOworCWNtZC0+dGltZV9vdXQgPSAwOworCW1lbWNweShjbWQtPmNkYiwgQ21uZC0+Y21uZCwgQ21uZC0+Y21kX2xlbik7CisKKwlpZiAoQ21uZC0+dXNlX3NnKSB7CisJCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBDbW5kLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJc2dfY291bnQgPSBwY2lfbWFwX3NnKGhvc3RkYXRhLT5wY2lfZGV2LCBzZywgQ21uZC0+dXNlX3NnLCBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCWNtZC0+c2VnbWVudF9jbnQgPSBjcHVfdG9fbGUxNihzZ19jb3VudCk7CisJCWRzID0gY21kLT5kYXRhc2VnOworCQkvKiBmaWxsIGluIGZpcnN0IHR3byBzZyBlbnRyaWVzOiAqLworCQluID0gc2dfY291bnQ7CisJCWlmIChuID4gREFUQVNFR1NfUEVSX0NPTU1BTkQpCisJCQluID0gREFUQVNFR1NfUEVSX0NPTU1BTkQ7CisKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJZHNbaV0uZF9iYXNlID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQlkc1tpXS5kX2Jhc2VfaGkgPSBjcHVfdG9fbGUzMihwY2k2NF9kbWFfaGkzMihzZ19kbWFfYWRkcmVzcyhzZykpKTsKKwkJCWRzW2ldLmRfY291bnQgPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNnKSk7CisJCQkrK3NnOworCQl9CisJCXNnX2NvdW50IC09IERBVEFTRUdTX1BFUl9DT01NQU5EOworCisJCXdoaWxlIChzZ19jb3VudCA+IDApIHsKKwkJCSsrY21kLT5oZHIuZW50cnlfY250OworCQkJY29udCA9IChzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5ICopCisJCQkgICAgJmhvc3RkYXRhLT5yZXFbaW5fcHRyKlFVRVVFX0VOVFJZX0xFTl07CisJCQltZW1zZXQoY29udCwgMCwgc2l6ZW9mKHN0cnVjdCBDb250aW51YXRpb25fRW50cnkpKTsKKwkJCWluX3B0ciA9IChpbl9wdHIgKyAxKSAmIFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47CisJCQlpZiAoaW5fcHRyID09IG91dF9wdHIpIHsKKwkJCQlERUJVRyhwcmludGsoInFsb2dpY2ZjJWQgOiB1bmV4cGVjdGVkIHJlcXVlc3QgcXVldWUgb3ZlcmZsb3dcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlUUkFDRSgicXVldWUgY29udGludWF0aW9uIiwgaW5fcHRyLCAwKTsKKwkJCWNvbnQtPmhkci5lbnRyeV90eXBlID0gRU5UUllfQ09OVElOVUFUSU9OOworCQkJZHMgPSBjb250LT5kYXRhc2VnOworCQkJbiA9IHNnX2NvdW50OworCQkJaWYgKG4gPiBEQVRBU0VHU19QRVJfQ09OVCkKKwkJCQluID0gREFUQVNFR1NfUEVSX0NPTlQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCQkJZHNbaV0uZF9iYXNlID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2xvMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQkJZHNbaV0uZF9iYXNlX2hpID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQkJZHNbaV0uZF9jb3VudCA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJCQkrK3NnOworCQkJfQorCQkJc2dfY291bnQgLT0gbjsKKwkJfQorCX0gZWxzZSBpZiAoQ21uZC0+cmVxdWVzdF9idWZmbGVuICYmIENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uICE9IFBDSV9ETUFfTk9ORSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShDbW5kLT5yZXF1ZXN0X2J1ZmZlcik7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoQ21uZC0+cmVxdWVzdF9idWZmZXIpOworCQlkbWFfYWRkcl90IGJ1c2FkZHIgPSBwY2lfbWFwX3BhZ2UoaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJCQkgIHBhZ2UsIG9mZnNldCwKKwkJCQkJCSAgQ21uZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCUNtbmQtPlNDcC5kbWFfaGFuZGxlID0gYnVzYWRkcjsKKworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2xvMzIoYnVzYWRkcikpOworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlX2hpID0gY3B1X3RvX2xlMzIocGNpNjRfZG1hX2hpMzIoYnVzYWRkcikpOworCQljbWQtPmRhdGFzZWdbMF0uZF9jb3VudCA9IGNwdV90b19sZTMyKENtbmQtPnJlcXVlc3RfYnVmZmxlbik7CisJCWNtZC0+c2VnbWVudF9jbnQgPSBjcHVfdG9fbGUxNigxKTsKKwl9IGVsc2UgeworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlID0gMDsKKwkJY21kLT5kYXRhc2VnWzBdLmRfYmFzZV9oaSA9IDA7CisJCWNtZC0+c2VnbWVudF9jbnQgPSBjcHVfdG9fbGUxNigxKTsgLyogU2hvdWxkbid0IHRoaXMgYmUgMD8gKi8KKwl9CisKKwlpZiAoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gU0NTSV9EQVRBX1dSSVRFKQorCQljbWQtPmNvbnRyb2xfZmxhZ3MgPSBjcHVfdG9fbGUxNihDRkxBR19XUklURSk7CisJZWxzZSAKKwkJY21kLT5jb250cm9sX2ZsYWdzID0gY3B1X3RvX2xlMTYoQ0ZMQUdfUkVBRCk7CisKKwlpZiAoQ21uZC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCWlmICgoamlmZmllcyAtIGhvc3RkYXRhLT50YWdfYWdlc1tDbW5kLT5kZXZpY2UtPmlkXSkgPiAoMiAqIElTUF9USU1FT1VUKSkgeworCQkJY21kLT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KENGTEFHX09SREVSRURfVEFHKTsKKwkJCWhvc3RkYXRhLT50YWdfYWdlc1tDbW5kLT5kZXZpY2UtPmlkXSA9IGppZmZpZXM7CisJCX0gZWxzZQorCQkJc3dpdGNoIChDbW5kLT50YWcpIHsKKwkJCWNhc2UgSEVBRF9PRl9RVUVVRV9UQUc6CisJCQkJY21kLT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KENGTEFHX0hFQURfVEFHKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT1JERVJFRF9RVUVVRV9UQUc6CisJCQkJY21kLT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KENGTEFHX09SREVSRURfVEFHKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY21kLT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KENGTEFHX1NJTVBMRV9UQUcpOworCQkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogVEVTVF9VTklUX1JFQURZIGNvbW1hbmRzIGZyb20gc2NzaV9zY2FuIHdpbGwgZmFpbCBkdWUgdG8gIm92ZXJsYXBwZWQKKwkgKiBjb21tYW5kcyBhdHRlbXB0ZWQiIHVubGVzcyB3ZSBzZXR1cCBhdCBsZWFzdCBhIHNpbXBsZSBxdWV1ZSAobWlkbGF5ZXIgCisJICogd2lsbCBlbWJlbGlzaCB0aGlzIG9uY2UgaXQgY2FuIGRvIGFuIElOUVVJUlkgY29tbWFuZCB0byB0aGUgZGV2aWNlKQorCSAqLworCWVsc2UKKwkJY21kLT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KENGTEFHX1NJTVBMRV9UQUcpOworCW91dHcoaW5fcHRyLCBob3N0LT5pb19wb3J0ICsgTUJPWDQpOworCWhvc3RkYXRhLT5yZXFfaW5fcHRyID0gaW5fcHRyOworCisJaG9zdGRhdGEtPnF1ZXVlZCsrOworCisJbnVtX2ZyZWUgPSBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOIC0gUkVRX1FVRVVFX0RFUFRIKGluX3B0ciwgb3V0X3B0cik7CisJbnVtX2ZyZWUgPSAobnVtX2ZyZWUgPiAyKSA/IG51bV9mcmVlIC0gMiA6IDA7CisgICAgICAgaG9zdC0+Y2FuX3F1ZXVlID0gaG9zdC0+aG9zdF9idXN5ICsgbnVtX2ZyZWU7CisJaWYgKGhvc3QtPmNhbl9xdWV1ZSA+IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4pCisJCWhvc3QtPmNhbl9xdWV1ZSA9IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47CisJaG9zdC0+c2dfdGFibGVzaXplID0gUUxPR0lDRkNfTUFYX1NHKG51bV9mcmVlKTsKKworCUxFQVZFKCJpc3AyeDAwX3F1ZXVlY29tbWFuZCIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogd2UgaGF2ZSByZWNlaXZlZCBhbiBldmVudCwgc3VjaCBhcyBhIGxpcCBvciBhbiBSU0NOLCB3aGljaCBtYXkgbWVhbiB0aGF0CisgKiBvdXIgcG9ydCBkYXRhYmFzZSBpcyBpbmNvcnJlY3Qgc28gdGhlIHBvcnQgZGF0YWJhc2UgbXVzdCBiZSByZWNyZWF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJlZG9fcG9ydF9kYih1bnNpZ25lZCBsb25nIGFyZykKK3sKKworICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopIGFyZzsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqIGhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlob3N0ZGF0YS0+ZXhwbG9yZV90aW1lci5kYXRhID0gMDsKKwlkZWxfdGltZXIoJmhvc3RkYXRhLT5leHBsb3JlX3RpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19GQUJSSUNfUE9SVERCIHx8IGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19MT09QX1BPUlREQikgeworCQlpc3AyeDAwX21ha2VfcG9ydGRiKGhvc3QpOworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBQb3J0IERhdGFiYXNlXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCWZvciAoaSA9IDA7IGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3biAhPSAwOyBpKyspIHsKKwkJCXByaW50aygid3duOiAlMDh4JTA4eCAgc2NzaV9pZDogJXggIGxvb3BfaWQ6ICIsICh1X2ludCkgKGhvc3RkYXRhLT5wb3J0X2RiW2ldLnd3biA+PiAzMiksICh1X2ludCkgaG9zdGRhdGEtPnBvcnRfZGJbaV0ud3duLCBpKTsKKwkJCWlmIChob3N0ZGF0YS0+cG9ydF9kYltpXS5sb29wX2lkICE9IGhvc3RkYXRhLT5wb3J0X2RiWzBdLmxvb3BfaWQgfHwgaSA9PSAwKQorCQkJICAgICAgICBwcmludGsoIiV4IiwgaG9zdGRhdGEtPnBvcnRfZGJbaV0ubG9vcF9pZCk7CisJCQllbHNlCisJCQkgICAgICAgIHByaW50aygiTm90IEF2YWlsYWJsZSIpOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisJCQorCSAgICAgICAgZm9yIChpID0gMDsgaSA8IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47IGkrKyl7IAorCQkgICAgICAgIGlmIChob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0gJiYgKGhvc3RkYXRhLT5wb3J0X2RiW2hvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXS0+ZGV2aWNlLT5pZF0ubG9vcF9pZCA+IFFMT0dJQ0ZDX01BWF9MT09QX0lEIHx8IGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19MT09QX1BPUlREQikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdGRhdGEtPnBvcnRfZGJbaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldLT5kZXZpY2UtPmlkXS5sb29wX2lkICE9IGhvc3RkYXRhLT5wb3J0X2RiWzBdLmxvb3BfaWQpeworCQkJCQlTY3NpX0NtbmQgKkNtbmQgPSBob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV07CisKKwkJCQkJIGlmIChDbW5kLT51c2Vfc2cpCisJCQkJCQkgcGNpX3VubWFwX3NnKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJCSAgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilDbW5kLT5idWZmZXIsCisJCQkJCQkJICAgICAgQ21uZC0+dXNlX3NnLAorCQkJCQkJCSAgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQkJIGVsc2UgaWYgKENtbmQtPnJlcXVlc3RfYnVmZmxlbiAmJgorCQkJCQkJICBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBQQ0lfRE1BX05PTkUpIHsKKwkJCQkJCSBwY2lfdW5tYXBfcGFnZShob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJCQkJQ21uZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJCQkJCUNtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCQkJc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQkJCQkgfQorCisJCQkJCSBob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaV0tPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworCisJCQkJCSBpZiAoaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldLT5zY3NpX2RvbmUpeworCQkJCQkgICAoKmhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXS0+c2NzaV9kb25lKSAoaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldKTsKKwkJCQkJIH0KKwkJCQkJIGVsc2UgcHJpbnRrKCJxbG9naWNmYyVkIDogZG9uZSBpcyBudWxsP1xuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJCQkgaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2ldID0gTlVMTDsKKwkJCQkJIGhvc3RkYXRhLT5oYW5kbGVfc2VyaWFsc1tpXSA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0xPT1BfR09PRDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCit9CisKKyNkZWZpbmUgQVNZTkNfRVZFTlRfSU5URVJSVVBUCTB4MDEKKworaXJxcmV0dXJuX3QgZG9faXNwMngwMF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpc3AyeDAwX2ludHJfaGFuZGxlcihpcnEsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZCBpc3AyeDAwX2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCVNjc2lfQ21uZCAqQ21uZDsKKwlzdHJ1Y3QgU3RhdHVzX0VudHJ5ICpzdHM7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9pZDsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJdV9pbnQgaW5fcHRyLCBvdXRfcHRyLCBoYW5kbGUsIG51bV9mcmVlOworCXVfc2hvcnQgc3RhdHVzOworCisJRU5URVJfSU5UUigiaXNwMngwMF9pbnRyX2hhbmRsZXIiKTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCisJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2ZjJWQgOiBpbnRlcnJ1cHQgb24gbGluZSAlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIGlycSkpOworCisJaWYgKCEoaW53KGhvc3QtPmlvX3BvcnQgKyBQQ0lfSU5URVJfU1RTKSAmIDB4MDgpKSB7CisJCS8qIHNwdXJpb3VzIGludGVycnVwdHMgY2FuIGhhcHBlbiBsZWdhbGx5ICovCisJCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNmYyVkIDogZ290IHNwdXJpb3VzIGludGVycnVwdFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKwkJcmV0dXJuOworCX0KKwlpbl9wdHIgPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g1KTsKKwlvdXRfcHRyID0gaG9zdGRhdGEtPnJlc19vdXRfcHRyOworCisJaWYgKChpbncoaG9zdC0+aW9fcG9ydCArIFBDSV9TRU1BUEhPUkUpICYgQVNZTkNfRVZFTlRfSU5URVJSVVBUKSkgeworCQlzdGF0dXMgPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gwKTsKKworCQlERUJVR19JTlRSKHByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggY29tcGxldGlvbiBzdGF0dXM6ICV4XG4iLAorCQkJCSAgaG9zdGRhdGEtPmhvc3RfaWQsIHN0YXR1cykpOworCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgTE9PUF9VUDoKKwkJY2FzZSBQT0lOVF9UT19QT0lOVF9VUDoKKwkJICAgICAgICBwcmludGsoInFsb2dpY2ZjJWQgOiBMaW5rIGlzIFVwXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX1JFRE9fRkFCUklDX1BPUlREQiB8IEFTX1JFRE9fTE9PUF9QT1JUREI7CisJCQlicmVhazsKKwkJY2FzZSBMT09QX0RPV046CisJCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogTGluayBpcyBEb3duXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0xPT1BfRE9XTjsKKwkJCWJyZWFrOworCQljYXNlIENPTk5FQ1RJT05fTU9ERToKKwkJICAgICAgICBwcmludGsoInJlY2VpdmVkIENPTk5FQ1RJT05fTU9ERSBpcnEgJXhcbiIsIGludyhob3N0LT5pb19wb3J0ICsgTUJPWDEpKTsKKwkJCWJyZWFrOworCQljYXNlIENIQU5HRV9OT1RJRklDQVRJT046CisJCSAgICAgICAgcHJpbnRrKCJxbG9naWNmYyVkIDogUlNDTiBSZWNlaXZlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJaWYgKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlID09IEFTX0xPT1BfR09PRCkKKwkJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX1JFRE9fRkFCUklDX1BPUlREQjsKKwkJCWJyZWFrOwkJICAgICAgICAKKwkJY2FzZSBMSVBfT0NDVVJSRUQ6CisJCWNhc2UgTElQX1JFQ0VJVkVEOgorCQkgICAgICAgIHByaW50aygicWxvZ2ljZmMlZCA6IExvb3AgUmVpbml0aWFsaXplZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQkJaWYgKGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlID09IEFTX0xPT1BfR09PRCkKKwkJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX1JFRE9fTE9PUF9QT1JUREI7CisJCQlicmVhazsKKwkJY2FzZSBTWVNURU1fRVJST1I6CisJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBUaGUgZmlybXdhcmUganVzdCBjaG9rZWQuXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0ZJUk1XQVJFX0RFQUQ7CisJCQlicmVhazsKKwkJY2FzZSBTQ1NJX0NPTU1BTkRfQ09NUExFVEU6CisJCQloYW5kbGUgPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gxKSB8IChpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gyKSA8PCAxNik7CisJCQlDbW5kID0gaG9zdGRhdGEtPmhhbmRsZV9wdHJzW2hhbmRsZV07CisJCQlob3N0ZGF0YS0+aGFuZGxlX3B0cnNbaGFuZGxlXSA9IE5VTEw7CisJCQlob3N0ZGF0YS0+aGFuZGxlX3NlcmlhbHNbaGFuZGxlXSA9IDA7CisJCQlob3N0ZGF0YS0+cXVldWVkLS07CisJCQlpZiAoQ21uZCAhPSBOVUxMKSB7CisJCQkJaWYgKENtbmQtPnVzZV9zZykKKwkJCQkJcGNpX3VubWFwX3NnKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJICAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopQ21uZC0+YnVmZmVyLAorCQkJCQkJICAgICBDbW5kLT51c2Vfc2csCisJCQkJCQkgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQllbHNlIGlmIChDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4gJiYKKwkJCQkJIENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uICE9IFBDSV9ETUFfTk9ORSkKKwkJCQkJcGNpX3VubWFwX3BhZ2UoaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJCQkgICAgICAgQ21uZC0+U0NwLmRtYV9oYW5kbGUsCisJCQkJCQkgICAgICAgQ21uZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJICAgICAgIHNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKwkJCQlDbW5kLT5yZXN1bHQgPSAweDA7CisJCQkJKCpDbW5kLT5zY3NpX2RvbmUpIChDbW5kKTsKKwkJCX0gZWxzZQorCQkJCXByaW50aygicWxvZ2ljZmMlZC5jIDogZ290IGEgbnVsbCB2YWx1ZSBvdXQgb2YgaGFuZGxlX3B0cnMsIHRoaXMgc3Vja3NcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1CT1hfQ09NTUFORF9DT01QTEVURToKKwkJY2FzZSBJTlZBTElEX0NPTU1BTkQ6CisJCWNhc2UgSE9TVF9JTlRFUkZBQ0VfRVJST1I6CisJCWNhc2UgVEVTVF9GQUlMRUQ6CisJCWNhc2UgQ09NTUFORF9FUlJPUjoKKwkJY2FzZSBDT01NQU5EX1BBUkFNX0VSUk9SOgorCQljYXNlIFBPUlRfSURfVVNFRDoKKwkJY2FzZSBMT09QX0lEX1VTRUQ6CisJCWNhc2UgQUxMX0lEU19VU0VEOgorCQkJaG9zdGRhdGEtPm1ib3hfZG9uZSA9IDE7CisJCQlvdXR3KEhDQ1JfQ0xFQVJfUklTQ19JTlRSLCBob3N0LT5pb19wb3J0ICsgSE9TVF9IQ0NSKTsKKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygicWxvZ2ljZmMlZCA6IGdvdCBhbiB1bmtub3duIHN0YXR1cz8gJXhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBzdGF0dXMpOworCQl9CisJCWlmICgoaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgJiBBU19SRURPX0xPT1BfUE9SVERCIHx8IGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlICYgQVNfUkVET19GQUJSSUNfUE9SVERCKSAmJiBob3N0ZGF0YS0+ZXhwbG9yZV90aW1lci5kYXRhID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIuZnVuY3Rpb24gPSByZWRvX3BvcnRfZGI7CisJCQlob3N0ZGF0YS0+ZXhwbG9yZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaG9zdDsKKwkJCWhvc3RkYXRhLT5leHBsb3JlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaLzQpOworCQkJaW5pdF90aW1lcigmaG9zdGRhdGEtPmV4cGxvcmVfdGltZXIpOworCQkJYWRkX3RpbWVyKCZob3N0ZGF0YS0+ZXhwbG9yZV90aW1lcik7CisJCX0KKwkJb3V0dygweDAsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfU0VNQVBIT1JFKTsKKwl9IGVsc2UgeworCQlERUJVR19JTlRSKHByaW50aygicWxvZ2ljZmMlZCA6IHJlc3BvbnNlIHF1ZXVlIHVwZGF0ZVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKwkJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2ZjJWQgOiByZXNwb25zZSBxdWV1ZSBkZXB0aCAlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIFJFU19RVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIpKSk7CisKKwkJd2hpbGUgKG91dF9wdHIgIT0gaW5fcHRyKSB7CisJCQl1bnNpZ25lZCBsZV9oYW5kOworCQkJc3RzID0gKHN0cnVjdCBTdGF0dXNfRW50cnkgKikgJmhvc3RkYXRhLT5yZXNbb3V0X3B0cipRVUVVRV9FTlRSWV9MRU5dOworCQkJb3V0X3B0ciA9IChvdXRfcHRyICsgMSkgJiBSRVNfUVVFVUVfTEVOOworICAgICAgICAgICAgICAgICAKKwkJCVRSQUNFKCJkb25lIiwgb3V0X3B0ciwgQ21uZCk7CisJCQlERUJVR19JTlRSKGlzcDJ4MDBfcHJpbnRfc3RhdHVzX2VudHJ5KHN0cykpOworCQkJbGVfaGFuZCA9IGxlMzJfdG9fY3B1KHN0cy0+aGFuZGxlKTsKKwkJCWlmIChzdHMtPmhkci5lbnRyeV90eXBlID09IEVOVFJZX1NUQVRVUyAmJiAoQ21uZCA9IGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tsZV9oYW5kXSkpIHsKKwkJCQlDbW5kLT5yZXN1bHQgPSBpc3AyeDAwX3JldHVybl9zdGF0dXMoQ21uZCwgc3RzKTsKKwkJCQlob3N0ZGF0YS0+cXVldWVkLS07CisKKwkJCQlpZiAoQ21uZC0+dXNlX3NnKQorCQkJCQlwY2lfdW5tYXBfc2coaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJCQkgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilDbW5kLT5idWZmZXIsIENtbmQtPnVzZV9zZywKKwkJCQkJCSAgICAgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQkJCWVsc2UgaWYgKENtbmQtPnJlcXVlc3RfYnVmZmxlbiAmJiBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBQQ0lfRE1BX05PTkUpCisJCQkJCXBjaV91bm1hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJICAgICAgIENtbmQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCQkJICAgICAgIENtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCSAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisKKwkJCQkvKiAKKwkJCQkgKiBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZSB3ZSBkbyBub3QKKwkJCQkgKiBjYWxsIHNjc2lfZG9uZS4gIGlmIHRoZSBzdGF0dXMgaXMgQ1NfQUJPUlRFRAorCQkJCSAqIHdlIGRvbid0IGhhdmUgdG8gY2FsbCBkb25lIGJlY2F1c2UgdGhlIHVwcGVyCisJCQkJICogbGV2ZWwgc2hvdWxkIGFscmVhZHkga25vdyBpdHMgYWJvcnRlZC4KKwkJCQkgKi8KKwkJCQlpZiAoaG9zdGRhdGEtPmhhbmRsZV9zZXJpYWxzW2xlX2hhbmRdICE9IENtbmQtPnNlcmlhbF9udW1iZXIgCisJCQkJICAgIHx8IGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpID09IENTX0FCT1JURUQpeworCQkJCQlob3N0ZGF0YS0+aGFuZGxlX3NlcmlhbHNbbGVfaGFuZF0gPSAwOworCQkJCQlob3N0ZGF0YS0+aGFuZGxlX3B0cnNbbGVfaGFuZF0gPSBOVUxMOworCQkJCQlvdXR3KG91dF9wdHIsIGhvc3QtPmlvX3BvcnQgKyBNQk9YNSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIGlmIHdlIGdldCBiYWNrIGFuIGVycm9yIGluZGljYXRpbmcgdGhlIHBvcnQKKwkJCQkgKiBpcyBub3QgdGhlcmUgb3IgaWYgdGhlIGxpbmsgaXMgZG93biBhbmQgCisJCQkJICogdGhpcyBpcyBhIGRldmljZSB0aGF0IHVzZWQgdG8gYmUgdGhlcmUgCisJCQkJICogYWxsb3cgdGhlIGNvbW1hbmQgdG8gdGltZW91dC4KKwkJCQkgKiB0aGUgZGV2aWNlIG1heSB3ZWxsIGJlIGJhY2sgaW4gYSBjb3VwbGUgb2YKKwkJCQkgKiBzZWNvbmRzLgorCQkJCSAqLworCQkJCWlmICgoaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPT0gQVNfTE9PUF9ET1dOIHx8IHN0cy0+Y29tcGxldGlvbl9zdGF0dXMgPT0gY3B1X3RvX2xlMTYoQ1NfUE9SVF9VTkFWQUlMQUJMRSkgfHwgc3RzLT5jb21wbGV0aW9uX3N0YXR1cyA9PSBjcHVfdG9fbGUxNihDU19QT1JUX0xPR0dFRF9PVVQpIHx8IHN0cy0+Y29tcGxldGlvbl9zdGF0dXMgPT0gY3B1X3RvX2xlMTYoQ1NfUE9SVF9DT05GSUdfQ0hBTkdFRCkpICYmIGhvc3RkYXRhLT5wb3J0X2RiW0NtbmQtPmRldmljZS0+aWRdLnd3bil7CisJCQkJCW91dHcob3V0X3B0ciwgaG9zdC0+aW9fcG9ydCArIE1CT1g1KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlvdXR3KG91dF9wdHIsIGhvc3QtPmlvX3BvcnQgKyBNQk9YNSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWhvc3RkYXRhLT5oYW5kbGVfcHRyc1tsZV9oYW5kXSA9IE5VTEw7CisKKwkJCWlmIChzdHMtPmNvbXBsZXRpb25fc3RhdHVzID09IGNwdV90b19sZTE2KENTX1JFU0VUX09DQ1VSUkVEKQorCQkJICAgIHx8IChzdHMtPnN0YXR1c19mbGFncyAmIGNwdV90b19sZTE2KFNURl9CVVNfUkVTRVQpKSkKKwkJCQlob3N0ZGF0YS0+c2VuZF9tYXJrZXIgPSAxOworCisJCQlpZiAobGUxNl90b19jcHUoc3RzLT5zY3NpX3N0YXR1cykgJiAweDAyMDApCisJCQkJbWVtY3B5KENtbmQtPnNlbnNlX2J1ZmZlciwgc3RzLT5yZXFfc2Vuc2VfZGF0YSwKKwkJCQkgICAgICAgc2l6ZW9mKENtbmQtPnNlbnNlX2J1ZmZlcikpOworCisJCQlvdXR3KG91dF9wdHIsIGhvc3QtPmlvX3BvcnQgKyBNQk9YNSk7CisKKwkJCWlmIChDbW5kLT5zY3NpX2RvbmUgIT0gTlVMTCkgeworCQkJCSgqQ21uZC0+c2NzaV9kb25lKSAoQ21uZCk7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBPdWNoLCBzY3NpIGRvbmUgaXMgTlVMTFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQl9CisJCWhvc3RkYXRhLT5yZXNfb3V0X3B0ciA9IG91dF9wdHI7CisJfQorCisKKwlvdXRfcHRyID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNCk7CisJaW5fcHRyID0gaG9zdGRhdGEtPnJlcV9pbl9wdHI7CisKKwludW1fZnJlZSA9IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU4gLSBSRVFfUVVFVUVfREVQVEgoaW5fcHRyLCBvdXRfcHRyKTsKKwludW1fZnJlZSA9IChudW1fZnJlZSA+IDIpID8gbnVtX2ZyZWUgLSAyIDogMDsKKyAgICAgICBob3N0LT5jYW5fcXVldWUgPSBob3N0LT5ob3N0X2J1c3kgKyBudW1fZnJlZTsKKwlpZiAoaG9zdC0+Y2FuX3F1ZXVlID4gUUxPR0lDRkNfUkVRX1FVRVVFX0xFTikKKwkJaG9zdC0+Y2FuX3F1ZXVlID0gUUxPR0lDRkNfUkVRX1FVRVVFX0xFTjsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBRTE9HSUNGQ19NQVhfU0cobnVtX2ZyZWUpOworCisJb3V0dyhIQ0NSX0NMRUFSX1JJU0NfSU5UUiwgaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUik7CisJTEVBVkVfSU5UUigiaXNwMngwMF9pbnRyX2hhbmRsZXIiKTsKK30KKworCitzdGF0aWMgaW50IGlzcDJ4MDBfcmV0dXJuX3N0YXR1cyhTY3NpX0NtbmQgKkNtbmQsIHN0cnVjdCBTdGF0dXNfRW50cnkgKnN0cykKK3sKKwlpbnQgaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisjaWYgREVCVUdfSVNQMngwMF9JTlRSCisJc3RhdGljIGNoYXIgKnJlYXNvbltdID0KKwl7CisJCSJESURfT0siLAorCQkiRElEX05PX0NPTk5FQ1QiLAorCQkiRElEX0JVU19CVVNZIiwKKwkJIkRJRF9USU1FX09VVCIsCisJCSJESURfQkFEX1RBUkdFVCIsCisJCSJESURfQUJPUlQiLAorCQkiRElEX1BBUklUWSIsCisJCSJESURfRVJST1IiLAorCQkiRElEX1JFU0VUIiwKKwkJIkRJRF9CQURfSU5UUiIKKwl9OworI2VuZGlmCQkJCS8qIERFQlVHX0lTUDJ4MDBfSU5UUiAqLworCisJRU5URVIoImlzcDJ4MDBfcmV0dXJuX3N0YXR1cyIpOworCisJREVCVUcocHJpbnRrKCJxbG9naWNmYyA6IGNvbXBsZXRpb24gc3RhdHVzID0gMHglMDR4XG4iLAorCQkgICAgIGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpKSk7CisKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpKSB7CisJY2FzZSBDU19DT01QTEVURToKKwkJaG9zdF9zdGF0dXMgPSBESURfT0s7CisJCWJyZWFrOworCWNhc2UgQ1NfRE1BX0VSUk9SOgorCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBDU19SRVNFVF9PQ0NVUlJFRDoKKwkJaG9zdF9zdGF0dXMgPSBESURfUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgQ1NfQUJPUlRFRDoKKwkJaG9zdF9zdGF0dXMgPSBESURfQUJPUlQ7CisJCWJyZWFrOworCWNhc2UgQ1NfVElNRU9VVDoKKwkJaG9zdF9zdGF0dXMgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCWNhc2UgQ1NfREFUQV9PVkVSUlVOOgorCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBDU19EQVRBX1VOREVSUlVOOgorCSAgICAgICAgaWYgKENtbmQtPnVuZGVyZmxvdyA8PSAoQ21uZC0+cmVxdWVzdF9idWZmbGVuIC0gbGUzMl90b19jcHUoc3RzLT5yZXNpZHVhbCkpKQorCQkgICAgICAgIGhvc3Rfc3RhdHVzID0gRElEX09LOworCQllbHNlCisJCSAgICAgICAgaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQ1NfUE9SVF9VTkFWQUlMQUJMRToKKwljYXNlIENTX1BPUlRfTE9HR0VEX09VVDoKKwljYXNlIENTX1BPUlRfQ09ORklHX0NIQU5HRUQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX0JBRF9UQVJHRVQ7CisJCWJyZWFrOworCWNhc2UgQ1NfUVVFVUVfRlVMTDoKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygicWxvZ2ljZmMgOiB1bmtub3duIGNvbXBsZXRpb24gc3RhdHVzIDB4JTA0eFxuIiwKKwkJICAgICAgIGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpKTsKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCX0KKworCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNmYyA6IGhvc3Qgc3RhdHVzICglcykgc2NzaSBzdGF0dXMgJXhcbiIsCisJCQkgIHJlYXNvbltob3N0X3N0YXR1c10sIGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpKSk7CisKKwlMRUFWRSgiaXNwMngwMF9yZXR1cm5fc3RhdHVzIik7CisKKwlyZXR1cm4gKGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpICYgU1RBVFVTX01BU0spIHwgKGhvc3Rfc3RhdHVzIDw8IDE2KTsKK30KKworCitzdGF0aWMgaW50IGlzcDJ4MDBfYWJvcnQoU2NzaV9DbW5kICogQ21uZCkKK3sKKwl1X3Nob3J0IHBhcmFtWzhdOworCWludCBpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKmhvc3RkYXRhOworCWludCByZXR1cm5fc3RhdHVzID0gU1VDQ0VTUzsKKworCUVOVEVSKCJpc3AyeDAwX2Fib3J0Iik7CisKKwlob3N0ID0gQ21uZC0+ZGV2aWNlLT5ob3N0OworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCisJZm9yIChpID0gMDsgaSA8IFFMT0dJQ0ZDX1JFUV9RVUVVRV9MRU47IGkrKykKKwkJaWYgKGhvc3RkYXRhLT5oYW5kbGVfcHRyc1tpXSA9PSBDbW5kKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBRTE9HSUNGQ19SRVFfUVVFVUVfTEVOKXsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJaXNwMngwMF9kaXNhYmxlX2lycXMoaG9zdCk7CisKKwlwYXJhbVswXSA9IE1CT1hfQUJPUlRfSU9DQjsKKyNpZiBJU1AyeDAwX1BPUlREQgorCXBhcmFtWzFdID0gKCgodV9zaG9ydCkgaG9zdGRhdGEtPnBvcnRfZGJbQ21uZC0+ZGV2aWNlLT5pZF0ubG9vcF9pZCkgPDwgOCkgfCBDbW5kLT5kZXZpY2UtPmx1bjsKKyNlbHNlCisJcGFyYW1bMV0gPSAoKCh1X3Nob3J0KSBDbW5kLT50YXJnZXQpIDw8IDgpIHwgQ21uZC0+bHVuOworI2VuZGlmCisJcGFyYW1bMl0gPSBpICYgMHhmZmZmOworCXBhcmFtWzNdID0gaSA+PiAxNjsKKworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogc2NzaSBhYm9ydCBmYWlsdXJlOiAleFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsIHBhcmFtWzBdKTsKKwkJaWYgKHBhcmFtWzBdID09IDB4NDAwNSkKKwkJCUNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJaWYgKHBhcmFtWzBdID09IDB4NDAwNikKKwkJCUNtbmQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQlyZXR1cm5fc3RhdHVzID0gRkFJTEVEOworCX0KKworCWlmIChyZXR1cm5fc3RhdHVzICE9IFNVQ0NFU1MpeworCQlwYXJhbVswXSA9IE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRFOworCQlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IGFib3J0IGZhaWxlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBmaXJtd2FyZSBzdGF0dXMgaXMgJXggJXhcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCBwYXJhbVswXSwgcGFyYW1bMV0pOworCX0KKworCWlzcDJ4MDBfZW5hYmxlX2lycXMoaG9zdCk7CisKKwlMRUFWRSgiaXNwMngwMF9hYm9ydCIpOworCisJcmV0dXJuIHJldHVybl9zdGF0dXM7Cit9CisKKworc3RhdGljIGludCBpc3AyeDAwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKm4sCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK3sKKwlpbnQgc2l6ZSA9IGNhcGFjaXR5OworCisJRU5URVIoImlzcDJ4MDBfYmlvc3BhcmFtIik7CisKKwlpcFswXSA9IDY0OworCWlwWzFdID0gMzI7CisJaXBbMl0gPSBzaXplID4+IDExOworCWlmIChpcFsyXSA+IDEwMjQpIHsKKwkJaXBbMF0gPSAyNTU7CisJCWlwWzFdID0gNjM7CisJCWlwWzJdID0gc2l6ZSAvIChpcFswXSAqIGlwWzFdKTsKKwl9CisJTEVBVkUoImlzcDJ4MDBfYmlvc3BhcmFtIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc3AyeDAwX3Jlc2V0X2hhcmR3YXJlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJdV9zaG9ydCBwYXJhbVs4XTsKKwlzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJaW50IGxvb3BfY291bnQ7CisJZG1hX2FkZHJfdCBidXNhZGRyOworCisJRU5URVIoImlzcDJ4MDBfcmVzZXRfaGFyZHdhcmUiKTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCisJLyoKKwkgKglUaGlzIGNhbm5vdCBiZSByaWdodCAtIFBDSSB3cml0ZXMgYXJlIHBvc3RlZAorCSAqCShhcHBhcmVudGx5IHRoaXMgaXMgaGFyZHdhcmUgZGVzaWduIGZsYXcgbm90IHNvZnR3YXJlID8pCisJICovCisJIAorCW91dHcoMHgwMSwgaG9zdC0+aW9fcG9ydCArIElTUF9DVFJMX1NUQVRVUyk7CisJdWRlbGF5KDEwMCk7CisJb3V0dyhIQ0NSX1JFU0VULCBob3N0LT5pb19wb3J0ICsgSE9TVF9IQ0NSKTsKKwl1ZGVsYXkoMTAwKTsKKwlvdXR3KEhDQ1JfUkVMRUFTRSwgaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUik7CisJb3V0dyhIQ0NSX0JJT1NfRElTQUJMRSwgaG9zdC0+aW9fcG9ydCArIEhPU1RfSENDUik7CisKKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYgaW53KGhvc3QtPmlvX3BvcnQgKyBIT1NUX0hDQ1IpID09IFJJU0NfQlVTWSkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50aygicWxvZ2ljZmMlZCA6IHJlc2V0X2hhcmR3YXJlIGxvb3AgdGltZW91dFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCisKKworI2lmIERFQlVHX0lTUDJ4MDAKKwlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IDAgMHglMDR4IFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gwKSk7CisJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveCAxIDB4JTA0eCBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMSkpOworCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggMiAweCUwNHggXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIGludyhob3N0LT5pb19wb3J0ICsgTUJPWDIpKTsKKwlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IDMgMHglMDR4IFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gzKSk7CisJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveCA0IDB4JTA0eCBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNCkpOworCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggNSAweCUwNHggXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIGludyhob3N0LT5pb19wb3J0ICsgTUJPWDUpKTsKKwlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94IDYgMHglMDR4IFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g2KSk7CisJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveCA3IDB4JTA0eCBcbiIsIGhvc3RkYXRhLT5ob3N0X2lkLCAgaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNykpOworI2VuZGlmCQkJCS8qIERFQlVHX0lTUDJ4MDAgKi8KKworCURFQlVHKHByaW50aygicWxvZ2ljZmMlZCA6IHZlcmlmeWluZyBjaGVja3N1bVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfUUxPR0lDX0ZDX0ZJUk1XQVJFKQorCXsKKwkJaW50IGk7CisJCXVuc2lnbmVkIHNob3J0ICogcmlzY19jb2RlID0gTlVMTDsKKwkJdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2xlbiA9IDA7CisJCWlmIChob3N0ZGF0YS0+cGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDIxMDApeworCQkgICAgICAgIHJpc2NfY29kZSA9IHJpc2NfY29kZTIxMDA7CisJCQlyaXNjX2NvZGVfbGVuID0gcmlzY19jb2RlX2xlbmd0aDIxMDA7CisJCX0KKwkJZWxzZSBpZiAoaG9zdGRhdGEtPnBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMjAwKXsKKwkJICAgICAgICByaXNjX2NvZGUgPSByaXNjX2NvZGUyMjAwOworCQkJcmlzY19jb2RlX2xlbiA9IHJpc2NfY29kZV9sZW5ndGgyMjAwOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHJpc2NfY29kZV9sZW47IGkrKykgeworCQkJcGFyYW1bMF0gPSBNQk9YX1dSSVRFX1JBTV9XT1JEOworCQkJcGFyYW1bMV0gPSByaXNjX2NvZGVfYWRkcjAxICsgaTsKKwkJCXBhcmFtWzJdID0gcmlzY19jb2RlW2ldOworCisJCQlpc3AyeDAwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwkJCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBmaXJtd2FyZSBsb2FkIGZhaWx1cmVcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgkJCQkvKiBSRUxPQURfRklSTVdBUkUgKi8KKworCXBhcmFtWzBdID0gTUJPWF9WRVJJRllfQ0hFQ0tTVU07CisJcGFyYW1bMV0gPSByaXNjX2NvZGVfYWRkcjAxOworCisJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2ZjJWQgOiByYW0gY2hlY2tzdW0gZmFpbHVyZVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlyZXR1cm4gMTsKKwl9CisJREVCVUcocHJpbnRrKCJxbG9naWNmYyVkIDogZXhlY3V0aW5nIGZpcm13YXJlXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCkpOworCisJcGFyYW1bMF0gPSBNQk9YX0VYRUNfRklSTVdBUkU7CisJcGFyYW1bMV0gPSByaXNjX2NvZGVfYWRkcjAxOworCisJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJcGFyYW1bMF0gPSBNQk9YX0FCT1VUX0ZJUk1XQVJFOworCisJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2ZjJWQgOiBhYm91dCBmaXJtd2FyZSBmYWlsdXJlXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCXJldHVybiAxOworCX0KKwlERUJVRyhwcmludGsoInFsb2dpY2ZjJWQgOiBmaXJtd2FyZSBtYWpvciByZXZpc2lvbiAlZFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBwYXJhbVsxXSkpOworCURFQlVHKHByaW50aygicWxvZ2ljZmMlZCA6IGZpcm13YXJlIG1pbm9yIHJldmlzaW9uICVkXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIHBhcmFtWzJdKSk7CisKKyNpZmRlZiBVU0VfTlZSQU1fREVGQVVMVFMKKworCWlmIChpc3AyeDAwX2dldF9udnJhbV9kZWZhdWx0cyhob3N0LCAmaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2spICE9IDApIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogQ291bGQgbm90IHJlYWQgZnJvbSBOVlJBTVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCX0KKyNlbmRpZgorCisJaG9zdGRhdGEtPnd3biA9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMF0pKSA8PCA1NjsKKwlob3N0ZGF0YS0+d3duIHw9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMF0pICYgMHhmZjAwKSA8PCA0ODsKKwlob3N0ZGF0YS0+d3duIHw9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMV0pICYgMHhmZjAwKSA8PCAyNDsKKwlob3N0ZGF0YS0+d3duIHw9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMV0pICYgMHgwMGZmKSA8PCA0ODsKKwlob3N0ZGF0YS0+d3duIHw9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMl0pICYgMHgwMGZmKSA8PCAyNDsKKwlob3N0ZGF0YS0+d3duIHw9ICh1NjQpIChjcHVfdG9fbGUxNihob3N0ZGF0YS0+Y29udHJvbF9ibG9jay5ub2RlX25hbWVbMl0pICYgMHhmZjAwKSA8PCA4OworCWhvc3RkYXRhLT53d24gfD0gKHU2NCkgKGNwdV90b19sZTE2KGhvc3RkYXRhLT5jb250cm9sX2Jsb2NrLm5vZGVfbmFtZVszXSkgJiAweDAwZmYpIDw8IDg7CisJaG9zdGRhdGEtPnd3biB8PSAodTY0KSAoY3B1X3RvX2xlMTYoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2subm9kZV9uYW1lWzNdKSAmIDB4ZmYwMCkgPj4gODsKKworCS8qIEZJWE1FOiBJZiB0aGUgRE1BIHRyYW5zZmVyIGdvZXMgb25lIHdheSBvbmx5LCB0aGlzIHNob3VsZCB1c2UKKwkgKiAgICAgICAgUENJX0RNQV9UT0RFVklDRSBhbmQgYmVsb3cgYXMgd2VsbC4KKwkgKi8KKwlidXNhZGRyID0gcGNpX21hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJICAgICAgIHZpcnRfdG9fcGFnZSgmaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2spLAorCQkJICAgICAgIG9mZnNldF9pbl9wYWdlKCZob3N0ZGF0YS0+Y29udHJvbF9ibG9jayksCisJCQkgICAgICAgc2l6ZW9mKGhvc3RkYXRhLT5jb250cm9sX2Jsb2NrKSwKKwkJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJcGFyYW1bMF0gPSBNQk9YX0lOSVRfRklSTVdBUkU7CisJcGFyYW1bMl0gPSAodV9zaG9ydCkgKHBjaTY0X2RtYV9sbzMyKGJ1c2FkZHIpID4+IDE2KTsKKwlwYXJhbVszXSA9ICh1X3Nob3J0KSAocGNpNjRfZG1hX2xvMzIoYnVzYWRkcikgJiAweGZmZmYpOworCXBhcmFtWzRdID0gMDsKKwlwYXJhbVs1XSA9IDA7CisJcGFyYW1bNl0gPSAodV9zaG9ydCkgKHBjaTY0X2RtYV9oaTMyKGJ1c2FkZHIpID4+IDE2KTsKKwlwYXJhbVs3XSA9ICh1X3Nob3J0KSAocGNpNjRfZG1hX2hpMzIoYnVzYWRkcikgJiAweGZmZmYpOworCWlzcDJ4MDBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljZmMlZC5jOiBPdWNoIDB4JTA0eFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBwYXJhbVswXSk7CisJCXBjaV91bm1hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LCBidXNhZGRyLAorCQkJICAgICAgIHNpemVvZihob3N0ZGF0YS0+Y29udHJvbF9ibG9jayksCisJCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJcmV0dXJuIDE7CisJfQorCXBhcmFtWzBdID0gTUJPWF9HRVRfRklSTVdBUkVfU1RBVEU7CisJaXNwMngwMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkLmM6IDB4JTA0eFxuIiwgaG9zdGRhdGEtPmhvc3RfaWQsICBwYXJhbVswXSk7CisJCXBjaV91bm1hcF9wYWdlKGhvc3RkYXRhLT5wY2lfZGV2LCBidXNhZGRyLAorCQkJICAgICAgIHNpemVvZihob3N0ZGF0YS0+Y29udHJvbF9ibG9jayksCisJCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGNpX3VubWFwX3BhZ2UoaG9zdGRhdGEtPnBjaV9kZXYsIGJ1c2FkZHIsCisJCSAgICAgICBzaXplb2YoaG9zdGRhdGEtPmNvbnRyb2xfYmxvY2spLAorCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlMRUFWRSgiaXNwMngwMF9yZXNldF9oYXJkd2FyZSIpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBVU0VfTlZSQU1fREVGQVVMVFMKKworc3RhdGljIGludCBpc3AyeDAwX2dldF9udnJhbV9kZWZhdWx0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3QgaW5pdF9jYiAqY29udHJvbF9ibG9jaykKK3sKKworCXVfc2hvcnQgdmFsdWU7CisJaWYgKGlzcDJ4MDBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDApICE9IDB4NTM0OSkKKwkJcmV0dXJuIDE7CisKKwl2YWx1ZSA9IGlzcDJ4MDBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDgpOworCWNvbnRyb2xfYmxvY2stPm5vZGVfbmFtZVswXSA9IGNwdV90b19sZTE2KGlzcDJ4MDBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDkpKTsKKwljb250cm9sX2Jsb2NrLT5ub2RlX25hbWVbMV0gPSBjcHVfdG9fbGUxNihpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChob3N0LCAxMCkpOworCWNvbnRyb2xfYmxvY2stPm5vZGVfbmFtZVsyXSA9IGNwdV90b19sZTE2KGlzcDJ4MDBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDExKSk7CisJY29udHJvbF9ibG9jay0+bm9kZV9uYW1lWzNdID0gY3B1X3RvX2xlMTYoaXNwMngwMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgMTIpKTsKKwljb250cm9sX2Jsb2NrLT5oYXJkX2FkZHIgPSBjcHVfdG9fbGUxNihpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChob3N0LCAxMykpOworCisJcmV0dXJuIDA7CisKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgaXNwMngwMF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNoKQoreworCXVfbG9uZyBpb19iYXNlOworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKKwl1X2NoYXIgcmV2aXNpb247CisJdV9pbnQgaXJxOworCXVfc2hvcnQgY29tbWFuZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCisJRU5URVIoImlzcDJ4MDBfaW5pdCIpOworCisJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDJ4MDBfaG9zdGRhdGEgKikgc2gtPmhvc3RkYXRhOworCXBkZXYgPSBob3N0ZGF0YS0+cGNpX2RldjsKKworCWlmIChwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpCisJICB8fCBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXZpc2lvbikpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogZXJyb3IgcmVhZGluZyBQQ0kgY29uZmlndXJhdGlvblxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlyZXR1cm4gMTsKKwl9CisJaW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpcnEgPSBwZGV2LT5pcnE7CisKKworCWlmIChwZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9RTE9HSUMpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogMHglMDR4IGlzIG5vdCBRTG9naWMgdmVuZG9yIElEXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgCisJCSAgICAgICBwZGV2LT52ZW5kb3IpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMTAwICYmIHBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMjAwKSB7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IDB4JTA0eCBkb2VzIG5vdCBtYXRjaCBJU1AyMTAwIG9yIElTUDIyMDAgZGV2aWNlIGlkXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgCisJCSAgICAgICBwZGV2LT5kZXZpY2UpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCEoY29tbWFuZCAmIFBDSV9DT01NQU5EX0lPKSB8fAorCSAgICAhKHBkZXYtPnJlc291cmNlWzBdLmZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogaS9vIG1hcHBpbmcgaXMgZGlzYWJsZWRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJaWYgKHJldmlzaW9uICE9IElTUDIxMDBfUkVWX0lEMSAmJiByZXZpc2lvbiAhPSBJU1AyMTAwX1JFVl9JRDMgJiYgcmV2aXNpb24gIT0gSVNQMjIwMF9SRVZfSUQ1KQorCQlwcmludGsoInFsb2dpY2ZjJWQgOiBuZXcgaXNwMngwMCByZXZpc2lvbiBJRCAoJWQpXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCwgIHJldmlzaW9uKTsKKworCisJaG9zdGRhdGEtPnJldmlzaW9uID0gcmV2aXNpb247CisKKwlzaC0+aXJxID0gaXJxOworCXNoLT5pb19wb3J0ID0gaW9fYmFzZTsKKworCUxFQVZFKCJpc3AyeDAwX2luaXQiKTsKKworCXJldHVybiAwOworfQorCisjaWYgVVNFX05WUkFNX0RFRkFVTFRTCisKKyNkZWZpbmUgTlZSQU1fREVMQVkoKSB1ZGVsYXkoMTApCS8qIDEwIG1pY3Jvc2Vjb25kIGRlbGF5ICovCisKKwordV9zaG9ydCBpc3AyeDAwX3JlYWRfbnZyYW1fd29yZChzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCwgdV9zaG9ydCBieXRlKQoreworCWludCBpOworCXVfc2hvcnQgdmFsdWUsIG91dHB1dCwgaW5wdXQ7CisKKwlvdXR3KDB4MiwgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJTlZSQU1fREVMQVkoKTsKKwlvdXR3KDB4MywgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJTlZSQU1fREVMQVkoKTsKKworCWJ5dGUgJj0gMHhmZjsKKwlieXRlIHw9IDB4MDYwMDsKKwlmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0cHV0ID0gKChieXRlID4+IGkpICYgMHgxKSA/IDB4NCA6IDB4MDsKKwkJb3V0dyhvdXRwdXQgfCAweDIsIGhvc3QtPmlvX3BvcnQgKyBQQ0lfTlZSQU0pOworCQlOVlJBTV9ERUxBWSgpOworCQlvdXR3KG91dHB1dCB8IDB4MywgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJCU5WUkFNX0RFTEFZKCk7CisJCW91dHcob3V0cHV0IHwgMHgyLCBob3N0LT5pb19wb3J0ICsgUENJX05WUkFNKTsKKwkJTlZSQU1fREVMQVkoKTsKKwl9CisKKwlmb3IgKGkgPSAweGYsIHZhbHVlID0gMDsgaSA+PSAwOyBpLS0pIHsKKwkJdmFsdWUgPDw9IDE7CisJCW91dHcoMHgzLCBob3N0LT5pb19wb3J0ICsgUENJX05WUkFNKTsKKwkJTlZSQU1fREVMQVkoKTsKKwkJaW5wdXQgPSBpbncoaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJCU5WUkFNX0RFTEFZKCk7CisJCW91dHcoMHgyLCBob3N0LT5pb19wb3J0ICsgUENJX05WUkFNKTsKKwkJTlZSQU1fREVMQVkoKTsKKwkJaWYgKGlucHV0ICYgMHg4KQorCQkJdmFsdWUgfD0gMTsKKwl9CisKKwlvdXR3KDB4MCwgaG9zdC0+aW9fcG9ydCArIFBDSV9OVlJBTSk7CisJTlZSQU1fREVMQVkoKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworCisjZW5kaWYJCQkJLyogVVNFX05WUkFNX0RFRkFVTFRTICovCisKKworCisvKgorICogY3VycmVudGx5LCB0aGlzIGlzIG9ubHkgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBvciBhYm9ydC9yZXNldCwKKyAqIGF0IHdoaWNoIHRpbWVzIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBzbyBwb2xsaW5nIGlzIE9LLCBJIGd1ZXNzLi4uCisgKi8KK3N0YXRpYyBpbnQgaXNwMngwMF9tYm94X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgdV9zaG9ydCBwYXJhbVtdKQoreworCWludCBsb29wX2NvdW50OworCXN0cnVjdCBpc3AyeDAwX2hvc3RkYXRhICpob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMngwMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSA9PSAwIHx8IGhvc3RkYXRhLT5hZGFwdGVyX3N0YXRlID09IEFTX0ZJUk1XQVJFX0RFQUQpCisJCXJldHVybiAxOworCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmIGludyhob3N0LT5pb19wb3J0ICsgSE9TVF9IQ0NSKSAmIDB4MDA4MCkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAoIWxvb3BfY291bnQpIHsKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveF9jb21tYW5kIGxvb3AgdGltZW91dCAjMVxuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCQlwYXJhbVswXSA9IDB4NDAwNjsKKwkJaG9zdGRhdGEtPmFkYXB0ZXJfc3RhdGUgPSBBU19GSVJNV0FSRV9ERUFEOworCQlyZXR1cm4gMTsKKwl9CisJaG9zdGRhdGEtPm1ib3hfZG9uZSA9IDA7CisKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gPT0gMCkKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogaW52YWxpZCBtYm94IGNvbW1hbmRcbiIsIGhvc3RkYXRhLT5ob3N0X2lkKTsKKworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSAmIDB4ODApCisJCW91dHcocGFyYW1bN10sIGhvc3QtPmlvX3BvcnQgKyBNQk9YNyk7CisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHg0MCkKKwkJb3V0dyhwYXJhbVs2XSwgaG9zdC0+aW9fcG9ydCArIE1CT1g2KTsKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweDIwKQorCQlvdXR3KHBhcmFtWzVdLCBob3N0LT5pb19wb3J0ICsgTUJPWDUpOworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSAmIDB4MTApCisJCW91dHcocGFyYW1bNF0sIGhvc3QtPmlvX3BvcnQgKyBNQk9YNCk7CisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHgwOCkKKwkJb3V0dyhwYXJhbVszXSwgaG9zdC0+aW9fcG9ydCArIE1CT1gzKTsKKwlpZiAobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweDA0KQorCQlvdXR3KHBhcmFtWzJdLCBob3N0LT5pb19wb3J0ICsgTUJPWDIpOworCWlmIChtYm94X3BhcmFtW3BhcmFtWzBdXSAmIDB4MDIpCisJCW91dHcocGFyYW1bMV0sIGhvc3QtPmlvX3BvcnQgKyBNQk9YMSk7CisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dICYgMHgwMSkKKwkJb3V0dyhwYXJhbVswXSwgaG9zdC0+aW9fcG9ydCArIE1CT1gwKTsKKworCisJb3V0dyhIQ0NSX1NFVF9IT1NUX0lOVFIsIGhvc3QtPmlvX3BvcnQgKyBIT1NUX0hDQ1IpOworCisJd2hpbGUgKDEpIHsKKwkJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwkJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiAhKGludyhob3N0LT5pb19wb3J0ICsgUENJX0lOVEVSX1NUUykgJiAweDA4KSkgeyAKKwkJCWJhcnJpZXIoKTsKKwkJCWNwdV9yZWxheCgpOworCQl9CisKKwkJaWYgKCFsb29wX2NvdW50KSB7CisJCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0ZJUk1XQVJFX0RFQUQ7CisJCQlwcmludGsoInFsb2dpY2ZjJWQgOiBtYm94X2NvbW1hbmQgbG9vcCB0aW1lb3V0ICMyXG4iLCBob3N0ZGF0YS0+aG9zdF9pZCk7CisJCQlicmVhazsKKwkJfQorCQlpc3AyeDAwX2ludHJfaGFuZGxlcihob3N0LT5pcnEsIGhvc3QsIE5VTEwpOworCisJCWlmIChob3N0ZGF0YS0+bWJveF9kb25lID09IDEpCisJCQlicmVhazsKKworCX0KKworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gwKSA9PSAweDA0KSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKCJxbG9naWNmYyVkIDogbWJveF9jb21tYW5kIGxvb3AgdGltZW91dCAjM1xuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCisJcGFyYW1bN10gPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g3KTsKKwlwYXJhbVs2XSA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDYpOworCXBhcmFtWzVdID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YNSk7CisJcGFyYW1bNF0gPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1g0KTsKKwlwYXJhbVszXSA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDMpOworCXBhcmFtWzJdID0gaW53KGhvc3QtPmlvX3BvcnQgKyBNQk9YMik7CisJcGFyYW1bMV0gPSBpbncoaG9zdC0+aW9fcG9ydCArIE1CT1gxKTsKKwlwYXJhbVswXSA9IGludyhob3N0LT5pb19wb3J0ICsgTUJPWDApOworCisKKwlvdXR3KDB4MCwgaG9zdC0+aW9fcG9ydCArIFBDSV9TRU1BUEhPUkUpOworCisJaWYgKGludyhob3N0LT5pb19wb3J0ICsgSE9TVF9IQ0NSKSAmIDB4MDA4MCkgeworCQlob3N0ZGF0YS0+YWRhcHRlcl9zdGF0ZSA9IEFTX0ZJUk1XQVJFX0RFQUQ7CisJCXByaW50aygicWxvZ2ljZmMlZCA6IG1ib3ggb3AgaXMgc3RpbGwgcGVuZGluZ1xuIiwgaG9zdGRhdGEtPmhvc3RfaWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmIERFQlVHX0lTUDJ4MDBfSU5UUgorCit2b2lkIGlzcDJ4MDBfcHJpbnRfc3RhdHVzX2VudHJ5KHN0cnVjdCBTdGF0dXNfRW50cnkgKnN0YXR1cykKK3sKKwlwcmludGsoInFsb2dpY2ZjIDogZW50cnkgY291bnQgPSAweCUwMngsIHR5cGUgPSAweCUwMngsIGZsYWdzID0gMHglMDJ4XG4iLCAKKwlzdGF0dXMtPmhkci5lbnRyeV9jbnQsIHN0YXR1cy0+aGRyLmVudHJ5X3R5cGUsIHN0YXR1cy0+aGRyLmZsYWdzKTsKKwlwcmludGsoInFsb2dpY2ZjIDogc2NzaSBzdGF0dXMgPSAweCUwNHgsIGNvbXBsZXRpb24gc3RhdHVzID0gMHglMDR4XG4iLAorCSAgICAgICBsZTE2X3RvX2NwdShzdGF0dXMtPnNjc2lfc3RhdHVzKSwgbGUxNl90b19jcHUoc3RhdHVzLT5jb21wbGV0aW9uX3N0YXR1cykpOworCXByaW50aygicWxvZ2ljZmMgOiBzdGF0ZSBmbGFncyA9IDB4JTA0eCwgc3RhdHVzIGZsYWdzID0gMHglMDR4XG4iLCAKKwkgICAgICAgbGUxNl90b19jcHUoc3RhdHVzLT5zdGF0ZV9mbGFncyksIGxlMTZfdG9fY3B1KHN0YXR1cy0+c3RhdHVzX2ZsYWdzKSk7CisJcHJpbnRrKCJxbG9naWNmYyA6IHJlc3BvbnNlIGluZm8gbGVuZ3RoID0gMHglMDR4LCByZXF1ZXN0IHNlbnNlIGxlbmd0aCA9IDB4JTA0eFxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoc3RhdHVzLT5yZXNfaW5mb19sZW4pLCBsZTE2X3RvX2NwdShzdGF0dXMtPnJlcV9zZW5zZV9sZW4pKTsKKwlwcmludGsoInFsb2dpY2ZjIDogcmVzaWR1YWwgdHJhbnNmZXIgbGVuZ3RoID0gMHglMDh4LCByZXNwb25zZSA9IDB4JTAyeFxuIiwgbGUzMl90b19jcHUoc3RhdHVzLT5yZXNpZHVhbCksIHN0YXR1cy0+cmVzX2luZm9bM10pOworCit9CisKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUJVR19JU1AyeDAwX0lOVFIgKi8KKworCisjaWYgREVCVUdfSVNQMngwMAorCit2b2lkIGlzcDJ4MDBfcHJpbnRfc2NzaV9jbWQoU2NzaV9DbW5kICogY21kKQoreworCWludCBpOworCisJcHJpbnRrKCJxbG9naWNmYyA6IHRhcmdldCA9IDB4JTAyeCwgbHVuID0gMHglMDJ4LCBjbWRfbGVuID0gMHglMDJ4XG4iLCAKKwkgICAgICAgY21kLT50YXJnZXQsIGNtZC0+bHVuLCBjbWQtPmNtZF9sZW4pOworCXByaW50aygicWxvZ2ljZmMgOiBjb21tYW5kID0gIik7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgaSsrKQorCQlwcmludGsoIjB4JTAyeCAiLCBjbWQtPmNtbmRbaV0pOworCXByaW50aygiXG4iKTsKK30KKworI2VuZGlmCQkJCS8qIERFQlVHX0lTUDJ4MDAgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKyAgICAgICAgLmRldGVjdCAgICAgICAgICAgICAgICAgPSBpc3AyeDAwX2RldGVjdCwKKyAgICAgICAgLnJlbGVhc2UgICAgICAgICAgICAgICAgPSBpc3AyeDAwX3JlbGVhc2UsCisgICAgICAgIC5pbmZvICAgICAgICAgICAgICAgICAgID0gaXNwMngwMF9pbmZvLAorICAgICAgICAucXVldWVjb21tYW5kICAgICAgICAgICA9IGlzcDJ4MDBfcXVldWVjb21tYW5kLAorICAgICAgICAuZWhfYWJvcnRfaGFuZGxlciAgICAgICA9IGlzcDJ4MDBfYWJvcnQsCisgICAgICAgIC5iaW9zX3BhcmFtICAgICAgICAgICAgID0gaXNwMngwMF9iaW9zcGFyYW0sCisgICAgICAgIC5jYW5fcXVldWUgICAgICAgICAgICAgID0gUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiwKKyAgICAgICAgLnRoaXNfaWQgICAgICAgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnNnX3RhYmxlc2l6ZSAgICAgICAgICAgPSBRTE9HSUNGQ19NQVhfU0coUUxPR0lDRkNfUkVRX1FVRVVFX0xFTiksCisJLmNtZF9wZXJfbHVuCQk9IFFMT0dJQ0ZDX0NNRF9QRVJfTFVOLAorICAgICAgICAudXNlX2NsdXN0ZXJpbmcgICAgICAgICA9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2ZjX2FzbS5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZjX2FzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZDQ1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmNfYXNtLmMKQEAgLTAsMCArMSw5NzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJCSoKKyAqIAkgLS0tIElTUDIxMDAgRmFicmljIEluaXRpYXRvci9UYXJnZXQgRmlybXdhcmUgLS0tICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgd2l0aCBleHBhbmRlZCBMVU4gYWRkcmVzc2luZyAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgYW5kIEZjVGFwZSAoRkNQLTIpIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoJCQkJCQkJCQkqCisgKgkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ29weXJpZ2h0IChDKSAyMDAwIGFuZCAyMDAxIFFsb2dpYyBDb3Jwb3JhdGlvbiAKKyAgKHd3dy5xbG9naWMuY29tKQorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGaXJtd2FyZSBWZXJzaW9uIDEuMTkuMTYgKDEwOjM2IE5vdiAwMiwgMjAwMCkKKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2FkZHIwMSA9IDB4MTAwMCA7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfbGVuZ3RoMjEwMCA9IDB4OTI2MDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUyMTAwW10gPSB7CisJMHgwMDc4LCAweDEwMmQsIDB4MDAwMCwgMHg5MjYwLCAweDAwMDAsIDB4MDAwMSwgMHgwMDEzLCAweDAwMTAsCisJMHgwMDE3LCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLCAweDQ5NDcsIDB4NDg1NCwgMHgyMDMxLCAweDM5MzksCisJMHgzOTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLCAweDIwNDMsIDB4NGY1MiwgMHg1MDRmLCAweDUyNDEsCisJMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLCAweDMyMzEsIDB4MzAzMCwgMHgyMDQ2LCAweDY5NzIsCisJMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsCisJMHgzMTJlLCAweDMxMzksIDB4MjAyMCwgMHgyMDIwLCAweDI0MDAsIDB4MjA5MSwgMHgyMDAwLCAweDIwYzEsCisJMHgwMDIxLCAweDIwMzksIDB4ZmZmZiwgMHgyMDE5LCAweGFhYWEsIDB4Mjc2MCwgMHgyMDY5LCAweDdmZmYsCisJMHgyMGMxLCAweDAwMjAsIDB4MmMyYywgMHgyZDM0LCAweDI3NjIsIDB4MjM2YSwgMHgyYzI0LCAweDJkMDQsCisJMHgyNjZhLCAweDI1NjIsIDB4YTQwNiwgMHgwMGMwLCAweDEwNTIsIDB4MjBjMSwgMHgwMDIxLCAweDJjMmMsCisJMHgyMzYyLCAweDJjMDQsIDB4MjU2MiwgMHhhMzA2LCAweDAwNDAsIDB4MTA1MiwgMHgyMGMxLCAweDAwMjAsCisJMHgyMDM5LCAweDhmZmYsIDB4MjBhMSwgMHhhYTAwLCAweDI3MDgsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsCisJMHg4MTBkLCAweGExOGMsIDB4MDAwZiwgMHgyMDAxLCAweDAwMGEsIDB4YTExMiwgMHhhMDBlLCAweDIxYTgsCisJMHg0MWE0LCAweDM0MDAsIDB4ODIxMSwgMHgwMGMwLCAweDEwNWYsIDB4MjcwOCwgMHgzNDAwLCAweGExMDIsCisJMHgwMDQwLCAweDEwNmYsIDB4MDA0OCwgMHgxMDZmLCAweDIwYTgsIDB4YTAwZSwgMHg0MWE0LCAweDIwYTEsCisJMHhhMjYwLCAweDIwMDksIDB4MDAwMCwgMHgyMGE5LCAweDA3YTAsIDB4NDFhNCwgMHgzNDAwLCAweDIwYzksCisJMHhhN2ZmLCAweDIwNTksIDB4MDAwMCwgMHgyYjc4LCAweDc4MjMsIDB4MDAwNCwgMHgyMDg5LCAweDI1NWQsCisJMHgyMDUxLCAweGEzMDAsIDB4MmE3MCwgMHg3NzVlLCAweGE3ODYsIDB4OGZmZiwgMHgwMDQwLCAweDEwOTIsCisJMHg3MDViLCAweGNhMDAsIDB4NzA1NywgMHhjOWYxLCAweDcwNjMsIDB4MDIwMCwgMHg3MDY3LCAweDAyMDAsCisJMHgwMDc4LCAweDEwOWEsIDB4NzA1NywgMHhiYTAxLCAweDcwNjMsIDB4MDEwMCwgMHg3MDY3LCAweDAxMDAsCisJMHg3MDViLCAweGJhMDAsIDB4MTA3OCwgMHgxMmRmLCAweDEwNzgsIDB4MTNjMCwgMHgxMDc4LCAweDE1NjksCisJMHgxMDc4LCAweDFjYTQsIDB4MTA3OCwgMHg0MjI5LCAweDEwNzgsIDB4NzRjZiwgMHgxMDc4LCAweDEzNGIsCisJMHgxMDc4LCAweDJhM2YsIDB4MTA3OCwgMHg0ZGEyLCAweDEwNzgsIDB4NDhiMiwgMHgxMDc4LCAweDU3ZGYsCisJMHgxMDc4LCAweDIxZjcsIDB4MTA3OCwgMHg1YWJmLCAweDEwNzgsIDB4NTM2OSwgMHgxMDc4LCAweDIxMGQsCisJMHgxMDc4LCAweDIxZDQsIDB4MjA5MSwgMHgzMDA5LCAweDc4MjMsIDB4MDAwMCwgMHgwMDkwLCAweDEwY2YsCisJMHg3ODIwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDEwY2YsIDB4NzgyMywgMHg0MDAwLCAweDAwNjgsCisJMHgxMGM3LCAweDc4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDJhNzAsCisJMHg3MDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTdmLCAweDIwMDMsIDB4MDAwMCwgMHgyYTcwLCAweDcwMDAsCisJMHhhMDhlLCAweDAwMDMsIDB4MDBjMCwgMHgxMGVmLCAweDEwNzgsIDB4MzViYywgMHgxMDc4LCAweDJhNjcsCisJMHgxMDc4LCAweDRkZjIsIDB4MTA3OCwgMHg0YTc1LCAweDIwMDksIDB4MDEwMCwgMHgyMTA0LCAweGEwODIsCisJMHgwMDAyLCAweDAwNDgsIDB4MTBmMywgMHgxMDc4LCAweDU3ZmIsIDB4MDA3OCwgMHgxMGQ2LCAweDEwNzksCisJMHgxMGY3LCAweDAwNzgsIDB4MTBkYywgMHgxMDc4LCAweDZmYTksIDB4MDA3OCwgMHgxMGViLCAweDExMDEsCisJMHgxMTAyLCAweDExYmUsIDB4MTBmZiwgMHgxMjQ2LCAweDEyZGMsIDB4MTJkZCwgMHgxMmRlLCAweDEwNzgsCisJMHgxMzI4LCAweDAwN2MsIDB4MTI3ZSwgMHgwZjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAxLCAweDAwYzAsIDB4MTE5OCwgMHgxMDc4LCAweDNhNDMsIDB4MjA3OSwgMHgwMTAwLCAweDc4NDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MTE5OCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweDEwNzgsCisJMHgxYWIxLCAweDc4MGYsIDB4MDBmZiwgMHg3ODQwLCAweGEwODQsIDB4ZmZmYiwgMHg3ODQyLCAweDIwMTEsCisJMHg4MDEwLCAweDczYzAsIDB4MTA3OCwgMHgzNTc5LCAweDIwMDEsIDB4ZmZmZiwgMHgxMDc4LCAweDU5NzUsCisJMHg3MjM4LCAweGMyODQsIDB4NzIzYSwgMHgyMDAxLCAweGEzMGMsIDB4MjAxNCwgMHhjMmFjLCAweDIyMDIsCisJMHgxMDc4LCAweDZkYjUsIDB4MjAxMSwgMHgwMDA0LCAweDEwNzgsIDB4OGE1OSwgMHgxMDc4LCAweDQ3Y2UsCisJMHgxMDc4LCAweDQyMTEsIDB4MDA0MCwgMHgxMTQ0LCAweDcwODMsIDB4MDAwMSwgMHg3MGJiLCAweDAwMDAsCisJMHgxMDc4LCAweDNiZjUsIDB4MDA3OCwgMHgxMTk4LCAweDEwNzgsIDB4NDg5NywgMHgwMDQwLCAweDExNGQsCisJMHg3YTBjLCAweGMyYjQsIDB4N2EwZSwgMHgwMDc4LCAweDExNTksIDB4MTA3OCwgMHg4ZGRmLCAweDcwYzgsCisJMHhkMDljLCAweDAwYzAsIDB4MTE1OSwgMHg3MDk0LCAweGEwMDUsIDB4MDA0MCwgMHgxMTU5LCAweDEwNzgsCisJMHg0MWY1LCAweDcwZDMsIDB4MDAwMCwgMHg3MGNmLCAweDAwMDAsIDB4NzJjOCwgMHgyMDc5LCAweGEzNTEsCisJMHg3ODA0LCAweGQwYWMsIDB4MDA0MCwgMHgxMTY1LCAweGMyOTUsIDB4NzJjYSwgMHhhMjk2LCAweDAwMDQsCisJMHgwMDQwLCAweDExODYsIDB4MjAxMSwgMHgwMDAxLCAweDEwNzgsIDB4OGE1OSwgMHg3MDhmLCAweDAwMDAsCisJMHg3MDkzLCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDBmN2YsIDB4MTA3OCwgMHgyNjBkLCAweDIwMTEsCisJMHgwMDA1LCAweDEwNzgsIDB4NmVmMiwgMHgxMDc4LCAweDYxMDksIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsCisJMHg2MGUzLCAweDAwMDgsIDB4MGM3ZiwgMHgxMjdmLCAweDAwNzgsIDB4MTE5YSwgMHg3MDhmLCAweDAwMDAsCisJMHg3MDkzLCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDIwMTEsIDB4MDAwNSwgMHgxMDc4LCAweDZlZjIsCisJMHgxMDc4LCAweDYxMDksIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjBlMywgMHgwMDA4LCAweDBjN2YsCisJMHgwZjdmLCAweDEyN2YsIDB4MDA3YywgMHgwYzdlLCAweDIwYTksIDB4MDA4MiwgMHgyMDA5LCAweDAwN2UsCisJMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgyMTEwLCAweDAyN2UsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsCisJMHg3MWUwLCAweDAyN2YsIDB4MTA3OCwgMHhhMTkwLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDEwNzgsCisJMHgyOTIxLCAweDgxMDgsIDB4MDBmMCwgMHgxMWEwLCAweDBjN2YsIDB4NzA2YiwgMHgwMDAwLCAweDcwNmMsCisJMHhhMDg0LCAweDAwZmYsIDB4NzA2ZSwgMHg3MDk3LCAweDAwMDAsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTI0NCwgMHg3MDkwLCAweGEwODYsCisJMHhmZmZmLCAweDAwNDAsIDB4MTFkMSwgMHgxMDc4LCAweDI2MGQsIDB4MTA3OCwgMHg2MTA5LCAweDAwNzgsCisJMHgxMjQ0LCAweDcwYzgsIDB4ZDA5YywgMHgwMDQwLCAweDExZmQsIDB4ZDA4NCwgMHgwMDQwLCAweDExZmQsCisJMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHg3OTBjLCAweGMxYjUsIDB4NzkwZSwgMHgwZjdmLCAweGQwOGMsCisJMHgwMDQwLCAweDExZmQsIDB4NzBjYywgMHhhMDg2LCAweGZmZmYsIDB4MDA0MCwgMHgxMWY5LCAweDEwNzgsCisJMHgyNzhhLCAweDEwNzgsIDB4NjEwOSwgMHg3MGM4LCAweGQwOTQsIDB4MDBjMCwgMHgxMjQ0LCAweDIwMTEsCisJMHgwMDAxLCAweDIwMTksIDB4MDAwMCwgMHgxMDc4LCAweDI3YzIsIDB4MTA3OCwgMHg2MTA5LCAweDAwNzgsCisJMHgxMjQ0LCAweDcwZDAsIDB4YTAwNSwgMHgwMGMwLCAweDEyNDQsIDB4NzA4YywgMHhhMDA1LCAweDAwYzAsCisJMHgxMjQ0LCAweDEwNzgsIDB4NDg5NywgMHgwMGMwLCAweDEyNDQsIDB4MjAwMSwgMHhhMzUyLCAweDIwMDQsCisJMHhkMGFjLCAweDAwNDAsIDB4MTIyNywgMHgxNTdlLCAweDBjN2UsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksCisJMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4MTIxYSwgMHg2MDAwLCAweGQwZWMsCisJMHgwMGMwLCAweDEyMjIsIDB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsIDB4MTIxMSwgMHgwYzdmLCAweDE1N2YsCisJMHgwMDc4LCAweDEyMjcsIDB4MDE3ZiwgMHgwYzdmLCAweDE1N2YsIDB4MDA3OCwgMHgxMjQ0LCAweDcwMDMsCisJMHgwMDAzLCAweDcwOTMsIDB4ZmZmZiwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHgyNDgwLCAweDEwNzgsCisJMHgzNWY3LCAweDIwMDEsIDB4YTVhYywgMHgyMDA0LCAweGEwODYsIDB4MDAwNSwgMHgwMGMwLCAweDEyM2MsCisJMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg2ZWYyLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDZlZmMsCisJMHgxMDc4LCAweDYxMDksIDB4MTA3OCwgMHg2MWQzLCAweDEyN2YsIDB4MDA3YywgMHgwMTdlLCAweDBmN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDc5LCAweDAxMDAsIDB4MjAwOSwgMHgwMGY3LCAweDEwNzgsCisJMHg0MWRlLCAweDc5NDAsIDB4YTE4YywgMHgwMDEwLCAweDc5NDIsIDB4NzkyNCwgMHhkMWI0LCAweDAwNDAsCisJMHgxMjViLCAweDc4MjcsIDB4MDA0MCwgMHhkMTljLCAweDAwNDAsIDB4MTI2MCwgMHg3ODI3LCAweDAwMDgsCisJMHgwMDdlLCAweDAzN2UsIDB4MTU3ZSwgMHhhMDA2LCAweDEwNzgsIDB4NTk3NSwgMHg3OTAwLCAweGExOGEsCisJMHgwMDAzLCAweDAwNTAsIDB4MTI4OSwgMHg3OTU0LCAweGQxYWMsIDB4MDBjMCwgMHgxMjg5LCAweDIwMDksCisJMHgwMGY4LCAweDEwNzgsIDB4NDFkZSwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDIwYTksCisJMHgwOWM0LCAweDc4MjAsIDB4ZDA5YywgMHgwMGMwLCAweDEyODEsIDB4NzgyNCwgMHhkMGFjLCAweDAwYzAsCisJMHgxMmNhLCAweDAwZjAsIDB4MTI3OSwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHgyNDgwLCAweDAwNzgsCisJMHgxMmQ1LCAweDc4NTMsIDB4MDAwMCwgMHg3ODJmLCAweDAwMjAsIDB4MjBhOSwgMHgwMDUwLCAweDAwZTAsCisJMHgxMjhmLCAweDIwOTEsIDB4NjAwMCwgMHgwMGYwLCAweDEyOGYsIDB4Nzg1MywgMHgwNDAwLCAweDc4MmYsCisJMHgwMDAwLCAweDIwMDksIDB4MDBmOCwgMHgxMDc4LCAweDQxZGUsIDB4MjBhOSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMGYwLCAweDEyOWYsIDB4Nzg1MywgMHgxNDAwLCAweDc4NDMsIDB4MDA5MCwgMHg3ODQzLCAweDAwMTAsCisJMHgyMDE5LCAweDYxYTgsIDB4Nzg1NCwgMHgwMDA1LCAweDAwMDUsIDB4ZDA4YywgMHgwMDQwLCAweDEyYjQsCisJMHg3ODI0LCAweGQwYWMsIDB4MDBjMCwgMHgxMmNhLCAweDgzMTksIDB4MDBjMCwgMHgxMmFhLCAweDIwMDksCisJMHhhMzMxLCAweDIxMDQsIDB4ODAwMCwgMHgyMDBhLCAweGEwODQsIDB4ZmZmMCwgMHgwMDQwLCAweDEyYzQsCisJMHgyMDBiLCAweDAwMDAsIDB4MTA3OCwgMHgyNTFlLCAweDIwMDEsIDB4MDAwMSwgMHgxMDc4LCAweDI0ODAsCisJMHgwMDc4LCAweDEyZDMsIDB4MjAwMSwgMHhhMzMxLCAweDIwMDMsIDB4MDAwMCwgMHg3ODI4LCAweGMwOWQsCisJMHg3ODJhLCAweDc4MjcsIDB4MDA0OCwgMHg3ODUzLCAweDA0MDAsIDB4MTU3ZiwgMHgwMzdmLCAweDAwN2YsCisJMHgxMjdmLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDJhNzAsCisJMHgyMDA5LCAweDAxMDAsIDB4MjEwNCwgMHhhMDgyLCAweDAwMDIsIDB4MDA0OCwgMHgxMmViLCAweDcwNGYsCisJMHhmZmZmLCAweDAwNzgsIDB4MTJlZCwgMHg3MDRmLCAweDAwMDAsIDB4NzA1MywgMHhmZmZmLCAweDcwNmIsCisJMHgwMDAwLCAweDcwNmYsIDB4MDAwMCwgMHgxMDc4LCAweDhkZGYsIDB4MjA2MSwgMHhhNThjLCAweDYwMDMsCisJMHgwOTA5LCAweDYwMDcsIDB4MDAwMCwgMHg2MDBiLCAweDg4MDAsIDB4NjAwZiwgMHgwMjAwLCAweDYwMTMsCisJMHgwMGZmLCAweDYwMTcsIDB4MDAwMywgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwN2QwLCAweDIwNjEsCisJMHhhNTk0LCAweDYwMDMsIDB4ODAwMCwgMHg2MDA3LCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLCAweDYwMGYsCisJMHgwMjAwLCAweDYwMTMsIDB4MDBmZiwgMHg2MDE3LCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLCAweDYwMWYsCisJMHgwMDAwLCAweDIwNjEsIDB4YTVhMywgMHg2MDAzLCAweDUxNGMsIDB4NjAwNywgMHg0ZjQ3LCAweDYwMGIsCisJMHg0OTQzLCAweDYwMGYsIDB4MjAyMCwgMHgyMDAxLCAweGEzMjUsIDB4MjAwMywgMHgwMDAwLCAweDAwN2MsCisJMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHgxMzJhLCAweDAwN2UsIDB4MDE3ZSwgMHgyMDc5LCAweDAwMDAsCisJMHg3ODE4LCAweGQwODQsIDB4MDBjMCwgMHgxMzMwLCAweDAxN2YsIDB4NzkyZSwgMHgwMDdmLCAweDc4MmEsCisJMHgwMDdmLCAweDc4MjYsIDB4MzkwMCwgMHg3ODNhLCAweDc4MjMsIDB4ODAwMiwgMHg3ODFiLCAweDAwMDEsCisJMHgyMDkxLCAweDUwMDAsIDB4MjA5MSwgMHg0MDgwLCAweDIwNzksIDB4YTMwMCwgMHg3ODAzLCAweDAwMDUsCisJMHgwMDc4LCAweDEzNDgsIDB4MDA3YywgMHgyMDcxLCAweGEzMDAsIDB4NzE1OCwgMHg3MTJlLCAweDIwMjEsCisJMHgwMDAxLCAweGExOTAsIDB4MDAyZCwgMHhhMjk4LCAweDAwMmQsIDB4MDA0OCwgMHgxMzYxLCAweDcwNWMsCisJMHhhMzAyLCAweDAwYzgsIDB4MTM2MSwgMHgyMjBhLCAweDIyMDgsIDB4MjMxMCwgMHg4NDIwLCAweDAwNzgsCisJMHgxMzUzLCAweDIwMGIsIDB4MDAwMCwgMHg3NGE2LCAweDc0YWEsIDB4MDA3YywgMHgwZTdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhMzAwLCAweDcwYTgsIDB4YTBlYSwgMHgwMDEwLCAweDAwYzgsCisJMHgxMzc0LCAweGEwNmUsIDB4MDA3OCwgMHgxMzdlLCAweDgwMDEsIDB4NzBhYSwgMHg3MDJjLCAweDIwNjgsCisJMHgyZDA0LCAweDcwMmUsIDB4MjA2YiwgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHgxMjdmLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDcwYTgsCisJMHg4MDAxLCAweDAwYzgsIDB4MTM4ZSwgMHhhMDZlLCAweDAwNzgsIDB4MTM5NywgMHg3MGFhLCAweDcwMmMsCisJMHgyMDY4LCAweDJkMDQsIDB4NzAyZSwgMHgyMDZiLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDEyN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGEzMDAsCisJMHg3MDJjLCAweDIwNmEsIDB4MmQwMCwgMHg3MDJlLCAweDcwYTgsIDB4ODAwMCwgMHg3MGFhLCAweDEyN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4OGRmZiwgMHgwMDQwLCAweDEzYjYsIDB4NjgwNCwgMHg2ODA3LCAweDAwMDAsCisJMHgwMDdlLCAweDEwNzgsIDB4MTM5YSwgMHgwZDdmLCAweDAwNzgsIDB4MTNhYSwgMHgwMDdjLCAweDBlN2UsCisJMHgyMDcxLCAweGEzMDAsIDB4NzBhOCwgMHhhMDhhLCAweDAwMTAsIDB4YTAwZCwgMHgwZTdmLCAweDAwN2MsCisJMHgwZTdlLCAweDIwNzEsIDB4YTVkMCwgMHg3MDA3LCAweDAwMDAsIDB4NzAxYiwgMHgwMDAwLCAweDcwMWYsCisJMHgwMDAwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDEwLCAweGEwODUsIDB4ODAwNCwgMHg3MDEyLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MjI3MCwgMHg3MDBiLCAweDAwMDAsIDB4MjA3MSwgMHhhNWQwLCAweDcwMTgsCisJMHhhMDg4LCAweGE1ZDksIDB4MjIwYSwgMHg4MDAwLCAweGEwODQsIDB4MDAwNywgMHg3MDFhLCAweDcwMDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MTNlOSwgMHgwZjdlLCAweDIwNzksIDB4MDAxMCwgMHgxMDc4LCAweDEzZmEsCisJMHgwZjdmLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTVkMCwgMHg3MDA0LCAweGEwMDUsCisJMHgwMGMwLCAweDEzZjgsIDB4MGY3ZSwgMHgyMDc5LCAweDAwMTAsIDB4MTA3OCwgMHgxM2ZhLCAweDBmN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4NzAwMCwgMHgwMDc5LCAweDEzZmQsIDB4MTQwMSwgMHgxNDZiLCAweDE0ODgsCisJMHgxNDg4LCAweDcwMTgsIDB4NzExYywgMHhhMTA2LCAweDAwYzAsIDB4MTQwOSwgMHg3MDA3LCAweDAwMDAsCisJMHgwMDdjLCAweDBkN2UsIDB4YTE4MCwgMHhhNWQ5LCAweDIwMDQsIDB4NzAwYSwgMHgyMDY4LCAweDgxMDgsCisJMHhhMThjLCAweDAwMDcsIDB4NzExZSwgMHg3ODAzLCAweDAwMjYsIDB4NjgyNCwgMHg3ODMyLCAweDY4MjgsCisJMHg3ODM2LCAweDY4MmMsIDB4NzgzYSwgMHg2ODMwLCAweDc4M2UsIDB4NjgxMCwgMHg3MDBlLCAweDY4MGMsCisJMHg3MDE2LCAweDY4MDQsIDB4MGQ3ZiwgMHhkMDg0LCAweDAwNDAsIDB4MTQyYiwgMHg3MDA3LCAweDAwMDEsCisJMHgxMDc4LCAweDE0MzAsIDB4MDA3YywgMHg3MDA3LCAweDAwMDIsIDB4MTA3OCwgMHgxNDQ2LCAweDAwN2MsCisJMHgwMTdlLCAweDAyN2UsIDB4NzEwYywgMHgyMDExLCAweDAwNDAsIDB4YTE4MiwgMHgwMDQwLCAweDAwYzgsCisJMHgxNDNiLCAweDIxMTAsIDB4YTAwNiwgMHg3MDBlLCAweDcyMTIsIDB4ODIwMywgMHg3ODIyLCAweDc4MDMsCisJMHgwMDIwLCAweDc4MDMsIDB4MDA0MSwgMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgwMTdlLCAweDAyN2UsCisJMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHg3MDE0LCAweDIwOTgsIDB4MjBhMSwgMHgwMDE0LCAweDc4MDMsCisJMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweGExODIsIDB4MDA0MCwgMHgwMGM4LCAweDE0NWEsCisJMHgyMTEwLCAweGEwMDYsIDB4NzAwZSwgMHgyMmE4LCAweDUzYTYsIDB4ODIwMywgMHg3ODIyLCAweDc4MDMsCisJMHgwMDIwLCAweDMzMDAsIDB4NzAxNiwgMHg3ODAzLCAweDAwMDEsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsCisJMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHgyMDk5LCAweGEzZjksCisJMHgyMGExLCAweDAwMTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTMsIDB4NzgwMywgMHgwMDIwLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NzgwMywgMHgwMDQxLCAweDcwMDcsIDB4MDAwMywgMHg3MDAwLCAweGMwODQsCisJMHg3MDAyLCAweDcwMGIsIDB4YTNmNCwgMHgxMjdmLCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDAwN2MsCisJMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHgyMDAxLCAweGE0MjgsIDB4MjA5YywgMHgyMGExLCAweDAwMTQsCisJMHg3ODAzLCAweDAwMjYsIDB4MjAwMSwgMHhhNDI5LCAweDIwYWMsIDB4NTNhNiwgMHgyMDk5LCAweGE0MmEsCisJMHgyMGExLCAweDAwMTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTMsIDB4NzgwMywgMHgwMDIwLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NzgwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwNCwgMHg3MDAwLCAweGMwOGMsCisJMHg3MDAyLCAweDcwMGIsIDB4YTQyNSwgMHgxMjdmLCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDAwN2MsCisJMHgwMTdlLCAweDBlN2UsIDB4MjA3MSwgMHhhNWQwLCAweDBmN2UsIDB4MjA3OSwgMHgwMDEwLCAweDc5MDQsCisJMHg3ODAzLCAweDAwMDIsIDB4ZDFmYywgMHgwMDQwLCAweDE0YzIsIDB4YTE4YywgMHgwNzAwLCAweDcwMDQsCisJMHgxMDc5LCAweDE0YzYsIDB4MGY3ZiwgMHgwZTdmLCAweDAxN2YsIDB4MDA3YywgMHgxM2ZhLCAweDE0Y2UsCisJMHgxNGZiLCAweDE1MjMsIDB4MTU1NiwgMHgxNGNjLCAweDAwNzgsIDB4MTRjYywgMHhhMThjLCAweDA3MDAsCisJMHgwMGMwLCAweDE0ZjQsIDB4MTM3ZSwgMHgxNDdlLCAweDE1N2UsIDB4NzAxNCwgMHgyMGEwLCAweDIwOTksCisJMHgwMDE0LCAweDc4MDMsIDB4MDA0MCwgMHg3MDEwLCAweDIwYTgsIDB4NTNhNSwgMHgzNDAwLCAweDcwMTYsCisJMHgxNTdmLCAweDE0N2YsIDB4MTM3ZiwgMHg3MDBjLCAweGEwMDUsIDB4MDA0MCwgMHgxNTEwLCAweDEwNzgsCisJMHgxNDMwLCAweDAwN2MsIDB4NzAwOCwgMHhhMDgwLCAweDAwMDIsIDB4MjAwMywgMHgwMTAwLCAweDcwMDcsCisJMHgwMDAwLCAweDEwNzgsIDB4MTNmYSwgMHgwMDdjLCAweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsCisJMHgwMjAwLCAweDAwNzgsIDB4MTRlZiwgMHhhMThjLCAweDA3MDAsIDB4MDBjMCwgMHgxNTA2LCAweDcwMGMsCisJMHhhMDA1LCAweDAwNDAsIDB4MTUxMCwgMHgxMDc4LCAweDE0NDYsIDB4MDA3YywgMHg3MDA4LCAweGEwODAsCisJMHgwMDAyLCAweDIwMDMsIDB4MDIwMCwgMHg3MDA3LCAweDAwMDAsIDB4MTA3OCwgMHgxM2ZhLCAweDAwN2MsCisJMHgwZDdlLCAweDcwMDgsIDB4MjA2OCwgMHg3ODMwLCAweDY4MjYsIDB4NzgzNCwgMHg2ODJhLCAweDc4MzgsCisJMHg2ODJlLCAweDc4M2MsIDB4NjgzMiwgMHg2ODBiLCAweDAxMDAsIDB4MGQ3ZiwgMHg3MDA3LCAweDAwMDAsCisJMHgxMDc4LCAweDEzZmEsIDB4MDA3YywgMHhhMThjLCAweDA3MDAsIDB4MDBjMCwgMHgxNTUwLCAweDEzN2UsCisJMHgxNDdlLCAweDE1N2UsIDB4MjAwMSwgMHhhM2Y3LCAweDIwMDQsIDB4YTA4MCwgMHgwMDBkLCAweDIwYTAsCisJMHgyMDk5LCAweDAwMTQsIDB4NzgwMywgMHgwMDQwLCAweDIwYTksIDB4MDAyMCwgMHg1M2E1LCAweDIwMDEsCisJMHhhM2Y5LCAweDIwMDQsIDB4ZDBiYywgMHgwMDQwLCAweDE1NDYsIDB4MjAwMSwgMHhhNDAyLCAweDIwMDQsCisJMHhhMDgwLCAweDAwMGQsIDB4MjBhMCwgMHgyMGE5LCAweDAwMjAsIDB4NTNhNSwgMHgxNTdmLCAweDE0N2YsCisJMHgxMzdmLCAweDcwMDcsIDB4MDAwMCwgMHgxMDc4LCAweDRlOWIsIDB4MTA3OCwgMHgxM2ZhLCAweDAwN2MsCisJMHgyMDExLCAweDgwMDMsIDB4MTA3OCwgMHgzNTc5LCAweDAwNzgsIDB4MTU1NCwgMHhhMThjLCAweDA3MDAsCisJMHgwMGMwLCAweDE1NjMsIDB4MjAwMSwgMHhhNDI3LCAweDIwMDMsIDB4MDEwMCwgMHg3MDA3LCAweDAwMDAsCisJMHgxMDc4LCAweDEzZmEsIDB4MDA3YywgMHgyMDExLCAweDgwMDQsIDB4MTA3OCwgMHgzNTc5LCAweDAwNzgsCisJMHgxNTY3LCAweDEyN2UsIDB4MjA5MSwgMHgyMTAwLCAweDIwNzksIDB4MDAzMCwgMHgyMDcxLCAweGE1ZTEsCisJMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMGYsIDB4YTVlNywgMHg3MDEzLCAweGE1ZTcsCisJMHg3ODBmLCAweDAwNzYsIDB4NzgwMywgMHgwMDA0LCAweDEyN2YsIDB4MDA3YywgMHg2OTM0LCAweGExODQsCisJMHgwMDA3LCAweDAwNzksIDB4MTU4MywgMHgxNThiLCAweDE1ZDEsIDB4MTU4YiwgMHgxNThiLCAweDE1OGIsCisJMHgxNWI2LCAweDE1OWEsIDB4MTU4ZiwgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHgxNWViLCAweDY4NGMsCisJMHhkMGJjLCAweDAwNDAsIDB4MTU4YiwgMHg2ODYwLCAweDY4MmUsIDB4Njg1YywgMHg2ODJhLCAweDY4NTgsCisJMHgwMDc4LCAweDE1ZDksIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAxZSwgMHgwMGMwLCAweDE1OGIsCisJMHg2ODRjLCAweGQwYmMsIDB4MDA0MCwgMHgxNThiLCAweDY4NjAsIDB4NjgyZSwgMHg2ODVjLCAweDY4MmEsCisJMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMDE1LCAweDIwMDQsIDB4NjgzMiwgMHg2ODU4LCAweDAwNzgsIDB4MTVlMSwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMTUsIDB4MDBjMCwgMHgxNThiLCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDE1OGIsCisJMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMDE1LCAweDIwMDQsIDB4NjgzMiwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHg2ODU4LCAweDAwNzgsCisJMHgxNWUxLCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDE1OGIsIDB4YTAwNiwgMHg2ODJlLCAweDY4MmEsCisJMHg2ODU4LCAweGExOGMsIDB4MDAwZiwgMHhhMTg4LCAweDIwMTUsIDB4MjEwYywgMHg2OTMyLCAweDJkMDgsCisJMHg2OTFhLCAweDY4MjYsIDB4Njg0YywgMHhjMGRkLCAweDY4NGUsIDB4YTAwNiwgMHg2ODBhLCAweDY5N2MsCisJMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwgMHgwMDdjLCAweDIwZTEsIDB4MDAwNywgMHgyMGUxLCAweDIwMDAsCisJMHgyMDAxLCAweDAyMGEsIDB4MjAwNCwgMHg4MmZmLCAweDAwNDAsIDB4MTYwZSwgMHhhMjgwLCAweDAwMDQsCisJMHgwZDdlLCAweDIwNmMsIDB4Njg0YywgMHhkMGRjLCAweDAwYzAsIDB4MTYwYSwgMHgxMDc4LCAweDE1N2UsCisJMHgwMDQwLCAweDE2MGEsIDB4MGQ3ZiwgMHhhMjgwLCAweDAwMDAsIDB4MjAwMywgMHgwMDAyLCAweGEwMTYsCisJMHgwMDc4LCAweDE2MGUsIDB4NjgwOCwgMHg4MDAwLCAweDY4MGEsIDB4MGQ3ZiwgMHgxMjdlLCAweDA0N2UsCisJMHgwMzdlLCAweDAyN2UsIDB4MjA5MSwgMHgyMTAwLCAweDAyN2YsIDB4MDM3ZiwgMHgwNDdmLCAweDcwMDAsCisJMHhhMDA1LCAweDAwYzAsIDB4MTYyMiwgMHg3MjA2LCAweDIwMDEsIDB4MTY0MywgMHgwMDdlLCAweDIyNjAsCisJMHgwMDc4LCAweDE3YmUsIDB4NzEwYywgMHgyMjBhLCAweDgxMDgsIDB4MjMwYSwgMHg4MTA4LCAweDI0MGEsCisJMHg4MTA4LCAweGExODIsIDB4YTYwMiwgMHgwMDQ4LCAweDE2MmYsIDB4MjAwOSwgMHhhNWU3LCAweDcxMGUsCisJMHg3MDEwLCAweGExMDIsIDB4YTA4MiwgMHgwMDA5LCAweDAwNDAsIDB4MTYzYSwgMHhhMDgwLCAweDAwMWIsCisJMHgwMGMwLCAweDE2M2QsIDB4MjAwOSwgMHgwMTM4LCAweDIwMGEsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsCisJMHgxNjQzLCAweDEwNzgsIDB4MTc5ZiwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMjdlLCAweDAzN2UsCisJMHgwYzdlLCAweDAwN2UsIDB4MjA5MSwgMHgyMTAwLCAweDAwN2YsIDB4MDQ3ZiwgMHgwMzdmLCAweDAyN2YsCisJMHgwZDdlLCAweDBjN2UsIDB4MjQ2MCwgMHg2MTEwLCAweDIxNjgsIDB4NmE2MiwgMHg2YjVlLCAweGEwMDUsCisJMHgwMDQwLCAweDE2Y2YsIDB4NjgwOCwgMHhhMDA1LCAweDAwNDAsIDB4MTczYywgMHg3MDAwLCAweGEwMDUsCisJMHgwMGMwLCAweDE2NjQsIDB4MDA3OCwgMHgxNmM0LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAwYzAsCisJMHgxNzQ1LCAweDcwMDQsIDB4YTQwNiwgMHgwMGMwLCAweDE2YzQsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsCisJMHhkMDhjLCAweDAwNDAsIDB4MTY4MSwgMHgwNDdlLCAweDEwNzgsIDB4MThlMiwgMHgwNDdmLCAweDI0NjAsCisJMHg2MDEwLCAweGEwODAsIDB4MDAwMiwgMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHgxNzNjLCAweDAwNzgsCisJMHgxNjVlLCAweDIwMDEsIDB4MDIwNywgMHgyMDA0LCAweGQwOWMsIDB4MDBjMCwgMHgxNjZkLCAweDc4MDQsCisJMHhhMDg0LCAweDYwMDAsIDB4MDA0MCwgMHgxNjkyLCAweGEwODYsIDB4NjAwMCwgMHgwMDQwLCAweDE2OTIsCisJMHgwMDc4LCAweDE2NmQsIDB4NzEwMCwgMHhhMTg2LCAweDAwMDIsIDB4MDBjMCwgMHgxNmIyLCAweDBlN2UsCisJMHgyYjY4LCAweDY4MTgsIDB4MjA2MCwgMHgxMDc4LCAweDFmZWEsIDB4MjgwNCwgMHhhYzcwLCAweDYwMzQsCisJMHhkMDljLCAweDAwYzAsIDB4MTZhNywgMHg3MTA4LCAweDcyMGMsIDB4MDA3OCwgMHgxNmE5LCAweDcxMTAsCisJMHg3MjE0LCAweDY4MTAsIDB4YTEwMCwgMHg2ODEyLCAweDY4MTQsIDB4YTIwMSwgMHg2ODE2LCAweDBlN2YsCisJMHgwMDc4LCAweDE2YjYsIDB4YTE4NiwgMHgwMDAxLCAweDAwYzAsIDB4MTZiZSwgMHg3ODIwLCAweDY5MTAsCisJMHhhMTAwLCAweDY4MTIsIDB4NzgyNCwgMHg2OTE0LCAweGExMDEsIDB4NjgxNiwgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDYxMDAsIDB4YTE4ZSwgMHgwMDA0LCAweDAwYzAsCisJMHgxNzQ1LCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc1NmMsIDB4MDA3OCwgMHgxNzQ1LCAweDY4MDgsCisJMHhhMDA1LCAweDAwNDAsIDB4MTczYywgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgxNmQ5LCAweDAwNzgsCisJMHgxNzNjLCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAwYzAsIDB4MTZlMiwgMHg3MDA0LCAweGE0MDYsCisJMHgwMGMwLCAweDE3M2MsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywgMHgwMDQwLCAweDE2ZjYsCisJMHgwNDdlLCAweDEwNzgsIDB4MThlMiwgMHgwNDdmLCAweDI0NjAsIDB4NjAxMCwgMHhhMDgwLCAweDAwMDIsCisJMHgyMDA0LCAweGEwMDUsIDB4MDA0MCwgMHgxNzNjLCAweDAwNzgsIDB4MTZkMywgMHgyMDAxLCAweDAyMDcsCisJMHgyMDA0LCAweGQwOWMsIDB4MDBjMCwgMHgxNmUyLCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsCisJMHgwMGMwLCAweDE2ZTgsIDB4NzgwNCwgMHhhMDg0LCAweDYwMDAsIDB4MDA0MCwgMHgxNzBkLCAweGEwODYsCisJMHg2MDAwLCAweDAwNDAsIDB4MTcwZCwgMHgwMDc4LCAweDE2ZTIsIDB4NzAwNywgMHgwMDAwLCAweGEwMTYsCisJMHgyMjE4LCAweDcwMDAsIDB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsIDB4MTcyZSwgMHhhMDhlLCAweDAwMDIsCisJMHgwMGMwLCAweDE3M2MsIDB4MGM3ZSwgMHgwZTdlLCAweDY4MTgsIDB4MjA2MCwgMHgxMDc4LCAweDFmZWEsCisJMHgyODA0LCAweGFjNzAsIDB4NjAzNCwgMHhkMDljLCAweDAwYzAsIDB4MTcyYSwgMHg3MzA4LCAweDcyMGMsCisJMHgwMDc4LCAweDE3MmMsIDB4NzMxMCwgMHg3MjE0LCAweDBlN2YsIDB4MGM3ZiwgMHg3ODIwLCAweGEzMTgsCisJMHg3ODI0LCAweGEyMTEsIDB4NjgxMCwgMHhhMzAwLCAweDY4MTIsIDB4NjgxNCwgMHhhMjAxLCAweDY4MTYsCisJMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDYxMDAsIDB4YTE4ZSwgMHgwMDA0LCAweDAwYzAsCisJMHgxNzQ1LCAweDIwMDksIDB4MDA0OCwgMHgxMDc4LCAweDc1NmMsIDB4MGM3ZiwgMHgwZDdmLCAweDEyN2YsCisJMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MDQ3ZSwgMHgxMDc4LCAweDFhZjcsCisJMHgwMjdlLCAweDIwNzEsIDB4YTVlMSwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDE3OTAsCisJMHg3MDA0LCAweGFjMDYsIDB4MDBjMCwgMHgxNzgxLCAweDIwNzksIDB4MDAzMCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAzLCAweDAwNDAsIDB4MTc4MSwgMHg3ODA0LCAweGQwZmMsIDB4MDBjMCwgMHgxNzdkLCAweDIwMDEsCisJMHgwMjA3LCAweDIwMDQsIDB4ZDA5YywgMHgwMGMwLCAweDE3NjMsIDB4NzgwMywgMHgwMDA0LCAweDc4MDQsCisJMHhkMGFjLCAweDAwYzAsIDB4MTc2ZiwgMHg3ODAzLCAweDAwMDIsIDB4NzgwMywgMHgwMDA5LCAweDcwMDMsCisJMHgwMDAzLCAweDcwMDcsIDB4MDAwMCwgMHgwMDc4LCAweDE3ODEsIDB4MTA3OCwgMHgxOGUyLCAweDAwNzgsCisJMHgxNzUzLCAweDE1N2UsIDB4MjBhOSwgMHgwMDA5LCAweDIwMDksIDB4YTVlNywgMHgyMTA0LCAweGFjMDYsCisJMHgwMGMwLCAweDE3OGIsIDB4MjAwYSwgMHhhMTg4LCAweDAwMDMsIDB4MDBmMCwgMHgxNzg2LCAweDE1N2YsCisJMHgwMjdmLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDFjLCAweDgzMWEsIDB4MjMwMiwgMHgyMDAxLCAweDAxMzgsCisJMHgyMjAyLCAweDA0N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDcwMGMsCisJMHg3MTEwLCAweGExMDYsIDB4MDBjMCwgMHgxN2E3LCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDIxMDQsCisJMHg3MDA2LCAweDIwNjAsIDB4ODEwOCwgMHgyMTFjLCAweDgxMDgsIDB4MjEyNCwgMHg4MTA4LCAweGExODIsCisJMHhhNjAyLCAweDAwNDgsIDB4MTdiNSwgMHgyMDA5LCAweGE1ZTcsIDB4NzExMiwgMHg3MDBjLCAweGExMDYsCisJMHgwMGMwLCAweDE3YmUsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwOCwgMHg4Y2ZmLCAweDAwYzAsCisJMHgxN2M1LCAweDEwNzgsIDB4MWIyMiwgMHgwMDc4LCAweDE4MjMsIDB4NjAxMCwgMHgyMDY4LCAweDJkNTgsCisJMHg2ODI4LCAweGE0MDYsIDB4MDBjMCwgMHgxN2QwLCAweDY4MmMsIDB4YTMwNiwgMHgwMDQwLCAweDE3ZmUsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwOCwgMHgwMDQwLCAweDE3ZmUsIDB4NjAyNCwgMHhkMGY0LCAweDAwYzAsCisJMHgxN2ZhLCAweGQwZDQsIDB4MDA0MCwgMHgxN2Y2LCAweDYwMzgsIDB4YTQwMiwgMHg2MDM0LCAweGEzMDMsCisJMHgwMDQwLCAweDE3ZTQsIDB4MDBjOCwgMHgxN2Y2LCAweDY0M2EsIDB4NjMzNiwgMHg2YzJhLCAweDZiMmUsCisJMHgwNDdlLCAweDAzN2UsIDB4MjQwMCwgMHg2YzdjLCAweGE0MDIsIDB4NjgxMiwgMHgyMzAwLCAweDZiODAsCisJMHhhMzAzLCAweDY4MTYsIDB4MDM3ZiwgMHgwNDdmLCAweDAwNzgsIDB4MTdmYSwgMHgxMDc4LCAweDhkOGUsCisJMHgwMDQwLCAweDE3YzEsIDB4MTA3OCwgMHgyMDM1LCAweDAwYzAsIDB4MTdjMSwgMHgwYzdlLCAweDcwMDQsCisJMHgyMDYwLCAweDYwMjQsIDB4YzBkNCwgMHg2MDI2LCAweDBjN2YsIDB4Njg0YywgMHhkMGY0LCAweDAwNDAsCisJMHgxODBmLCAweDY4MTcsIDB4ZmZmZiwgMHg2ODEzLCAweGZmZmYsIDB4MDA3OCwgMHgxN2MxLCAweDY4MjQsCisJMHgyMDUwLCAweDY4MTgsIDB4MjA2MCwgMHg2ODMwLCAweDIwNDAsIDB4NjAzNCwgMHhhMGNjLCAweDAwMGYsCisJMHgyMDA5LCAweDAwMTEsIDB4MTA3OCwgMHgxODI0LCAweDAwNDAsIDB4MTgyMiwgMHgyMDA5LCAweDAwMDEsCisJMHgxMDc4LCAweDE4MjQsIDB4MmQ1OCwgMHgwMDdjLCAweDhhZmYsIDB4MDA0MCwgMHgxOGJiLCAweGEwM2UsCisJMHgyNzMwLCAweDY4NTAsIDB4ZDBmYywgMHgwMGMwLCAweDE4NDYsIDB4ZDBmNCwgMHgwMGMwLCAweDE4NTYsCisJMHgwZDdlLCAweDI4MDQsIDB4YWM2OCwgMHgyOTAwLCAweDAwNzksIDB4MTgzNiwgMHgxODlkLCAweDE4NWQsCisJMHgxODVkLCAweDE4OWQsIDB4MTg5ZCwgMHgxODk1LCAweDE4OWQsIDB4MTg1ZCwgMHgxODlkLCAweDE4NjMsCisJMHgxODYzLCAweDE4OWQsIDB4MTg5ZCwgMHgxODlkLCAweDE4OGMsIDB4MTg2MywgMHhjMGZjLCAweDY4NTIsCisJMHg2YjZjLCAweDZhNzAsIDB4NmQxYywgMHg2YzIwLCAweDBkN2UsIDB4ZDk5YywgMHgwMDQwLCAweDE4YTAsCisJMHgyODA0LCAweGFjNjgsIDB4NmYwOCwgMHg2ZTBjLCAweDAwNzgsIDB4MThhMCwgMHhjMGY0LCAweDY4NTIsCisJMHg2YjZjLCAweDZhNzAsIDB4MGQ3ZSwgMHgwMDc4LCAweDE4YTcsIDB4NmIwOCwgMHg2YTBjLCAweDZkMDAsCisJMHg2YzA0LCAweDAwNzgsIDB4MThhMCwgMHg3YjBjLCAweGQzYmMsIDB4MDA0MCwgMHgxODg0LCAweDcwMDQsCisJMHgwZTdlLCAweDIwNzAsIDB4NzAxYywgMHgwZTdmLCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDE4ODQsCisJMHg3YjA4LCAweGEzOWMsIDB4MGZmZiwgMHgyZDIwLCAweDBkN2YsIDB4MGQ3ZSwgMHg2YTE0LCAweDgyZmYsCisJMHgwMGMwLCAweDE4N2YsIDB4NjgxMCwgMHhhMzAyLCAweDAwNDgsIDB4MTg3ZiwgMHg2YjEwLCAweDIwMTEsCisJMHgwMDAwLCAweDI0NjgsIDB4MDA3OCwgMHgxODg2LCAweDZiMTAsIDB4NmExNCwgMHg2ZDAwLCAweDZjMDQsCisJMHg2ZjA4LCAweDZlMGMsIDB4MDA3OCwgMHgxOGEwLCAweDBkN2YsIDB4MGQ3ZSwgMHg2ODM0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgwMGMwLCAweDE4OWQsIDB4MGQ3ZiwgMHgxMDc4LCAweDFmZDEsCisJMHgwMGMwLCAweDE4MjQsIDB4YTAwZSwgMHgwMDc4LCAweDE4YmIsIDB4MGQ3ZiwgMHgxMDc4LCAweDEzMjgsCisJMHg3YjIyLCAweDdhMjYsIDB4N2QzMiwgMHg3YzM2LCAweDdmM2EsIDB4N2UzZSwgMHg3OTAyLCAweDcwMDAsCisJMHg4MDAwLCAweDcwMDIsIDB4MGQ3ZiwgMHg2ODI4LCAweGEzMDAsIDB4NjgyYSwgMHg2ODJjLCAweGEyMDEsCisJMHg2ODJlLCAweDIzMDAsIDB4NmIxMCwgMHhhMzAyLCAweDY4MTIsIDB4MjIwMCwgMHg2YTE0LCAweGEyMDMsCisJMHg2ODE2LCAweDEwNzgsIDB4MWZkMSwgMHgwMDdjLCAweDEwNzgsIDB4MTMyOCwgMHgxMDc4LCAweDFjNTIsCisJMHg3MDA0LCAweDIwNjAsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4NzAwMywgMHgwMDAwLCAweDEwNzgsCisJMHgxYWM2LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDE4ZGIsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsCisJMHg2OTdjLCAweDY5MTIsIDB4Njk4MCwgMHg2OTE2LCAweDY4MmIsIDB4ZmZmZiwgMHg2ODJmLCAweGZmZmYsCisJMHg2ODUwLCAweGMwYmQsIDB4Njg1MiwgMHgwZDdmLCAweDEwNzgsIDB4ODc1OCwgMHgwMDc4LCAweDFhYWQsCisJMHgxMDc4LCAweDEzMjgsIDB4MTI3ZSwgMHgyMDkxLCAweDIxMDAsIDB4MDA3ZSwgMHgwMTdlLCAweDJiNjgsCisJMHg2ODE4LCAweDIwNjAsIDB4NzkwNCwgMHg3ODAzLCAweDAwMDIsIDB4YTE4NCwgMHgwNzAwLCAweDAwYzAsCisJMHgxOGJlLCAweGExODQsIDB4MDAwMywgMHhhMDg2LCAweDAwMDMsIDB4MDA0MCwgMHgxOGUwLCAweDcwMDAsCisJMHgwMDc5LCAweDE4ZmEsIDB4MTkwMiwgMHgxOTA0LCAweDFhMDYsIDB4MWE4NCwgMHgxYTliLCAweDE5MDIsCisJMHgxOTAyLCAweDE5MDIsIDB4MTA3OCwgMHgxMzI4LCAweDgwMDEsIDB4NzAwMiwgMHhhMTg0LCAweDA4ODAsCisJMHgwMGMwLCAweDE5MTksIDB4OGFmZiwgMHgwMDQwLCAweDE5OWIsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsCisJMHgxODI0LCAweDAwNDAsIDB4MWFhZCwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxODI0LCAweDAwNzgsCisJMHgxYWFkLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4ZDFiYywgMHgwMGMwLCAweDE5NzksCisJMHgwMjdlLCAweDAzN2UsIDB4NzgwOCwgMHhkMGVjLCAweDAwYzAsIDB4MTkzMCwgMHg3YzIwLCAweDdkMjQsCisJMHg3ZTMwLCAweDdmMzQsIDB4NzgwMywgMHgwMDA5LCAweDcwMDMsIDB4MDAwNCwgMHgwMDc4LCAweDE5MzIsCisJMHgxMDc4LCAweDFiOWYsIDB4NmIyOCwgMHg2YTJjLCAweDI0MDAsIDB4Njg2ZSwgMHhhMzFhLCAweDI1MDAsCisJMHg2ODcyLCAweGEyMTMsIDB4NmIyYSwgMHg2YTJlLCAweDBjN2UsIDB4NzAwNCwgMHgyMDYwLCAweDYwMjQsCisJMHhkMGY0LCAweDAwYzAsIDB4MTk0NSwgMHg2MzNhLCAweDYyMzYsIDB4MGM3ZiwgMHgyNDAwLCAweDY5MTAsCisJMHhhMTAwLCAweDY4MTIsIDB4MjUwMCwgMHg2OTE0LCAweGExMDEsIDB4NjgxNiwgMHgwMzdmLCAweDAyN2YsCisJMHgyNjAwLCAweDY4MWUsIDB4MjcwMCwgMHg2ODIyLCAweDEwNzgsIDB4MWZlYSwgMHgyYTAwLCAweDY4MjYsCisJMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLCAweDY4MDgsCisJMHg4MDAxLCAweDY4MGEsIDB4MDBjMCwgMHgxOTZlLCAweDY4NGMsIDB4ZDBlNCwgMHgwMDQwLCAweDE5NmUsCisJMHg3MDA0LCAweDIwNjAsIDB4MjAwOSwgMHgwMDQ4LCAweDEwNzgsIDB4NzU2YywgMHg3MDAwLCAweGEwODYsCisJMHgwMDA0LCAweDAwNDAsIDB4MWFhZCwgMHg3MDAzLCAweDAwMDAsIDB4MTA3OCwgMHgxNzlmLCAweDAwNzgsCisJMHgxYWFkLCAweDA1N2UsIDB4N2QwYywgMHhkNWJjLCAweDAwYzAsIDB4MTk4MCwgMHgxMDc4LCAweGEyMGMsCisJMHgwNTdmLCAweDEwNzgsIDB4MWFjNiwgMHgwZjdlLCAweDcwMDQsIDB4MjA3OCwgMHgxMDc4LCAweDQ4OTMsCisJMHgwMDQwLCAweDE5OGQsIDB4NzgyNCwgMHhjMGY1LCAweDc4MjYsIDB4MGY3ZiwgMHg2ODJiLCAweGZmZmYsCisJMHg2ODJmLCAweGZmZmYsIDB4NjgwOCwgMHg4MDAxLCAweDY4MGEsIDB4Njk3YywgMHg2OTEyLCAweDY5ODAsCisJMHg2OTE2LCAweDAwNzgsIDB4MWFhZCwgMHg3MDA0LCAweDBjN2UsIDB4MjA2MCwgMHg2MDI0LCAweDBjN2YsCisJMHhkMGY0LCAweDAwNDAsIDB4MTlhOCwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgwMDc4LCAweDFhYWQsCisJMHg2ODRjLCAweGMwZjUsIDB4Njg0ZSwgMHg3ODE0LCAweGEwMDUsIDB4MDBjMCwgMHgxOWMwLCAweDcwMDMsCisJMHgwMDAwLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDAwYzAsIDB4MTliYywgMHg3MDA0LCAweDIwNjAsCisJMHgyMDA5LCAweDAwNDgsIDB4MTA3OCwgMHg3NTZjLCAweDEwNzgsIDB4MTc5ZiwgMHgwMDc4LCAweDFhYWQsCisJMHg3ODE0LCAweDY5MTAsIDB4YTEwMiwgMHg2ODEyLCAweDY5MTQsIDB4YTE4MywgMHgwMDAwLCAweDY4MTYsCisJMHg3ODE0LCAweDc5MDgsIDB4YTE4YywgMHgwZmZmLCAweGExODgsIDB4MDAwNywgMHg4MTE0LCAweDgyMTQsCisJMHg4MjE0LCAweGExMGEsIDB4ODEwNCwgMHg4MDA0LCAweDgwMDQsIDB4YTIwYSwgMHg4MTBiLCAweDgxMGIsCisJMHg4MTBiLCAweDEwNzgsIDB4MWI0ZCwgMHg3ODAzLCAweDAwMDQsIDB4NzgwZiwgMHhmZmZmLCAweDc4MDMsCisJMHgwMDAxLCAweDc4MDQsIDB4ZDBmYywgMHgwMDQwLCAweDE5ZTEsIDB4NzgwMywgMHgwMDAyLCAweDc4MDMsCisJMHgwMDA0LCAweDc4MGYsIDB4MDA3NiwgMHg3MDA0LCAweDcwMDcsIDB4MDAwMCwgMHgyMDYwLCAweDIwMDksCisJMHgwMDQ4LCAweDEwNzgsIDB4NzU2YywgMHgxMDc4LCAweDFiODEsIDB4MDA0MCwgMHgxOWJjLCAweDc5MDgsCisJMHhkMWVjLCAweDAwYzAsIDB4MTlmZiwgMHgyMDA5LCAweDAwMDksIDB4MDA3OCwgMHgxYTAxLCAweDIwMDksCisJMHgwMDE5LCAweDc5MDIsIDB4NzAwMywgMHgwMDAzLCAweDAwNzgsIDB4MWFhZCwgMHg4MDAxLCAweDcwMDIsCisJMHhkMTk0LCAweDAwNDAsIDB4MWExOCwgMHg3ODA0LCAweGQwZmMsIDB4MDBjMCwgMHgxOGVhLCAweDhhZmYsCisJMHgwMDQwLCAweDFhYWQsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4MTgyNCwgMHgwMDc4LCAweDFhYWQsCisJMHhhMTg0LCAweDA4ODAsIDB4MDBjMCwgMHgxYTI1LCAweDhhZmYsIDB4MDA0MCwgMHgxYWFkLCAweDIwMDksCisJMHgwMDAxLCAweDEwNzgsIDB4MTgyNCwgMHgwMDc4LCAweDFhYWQsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweGQxYmMsIDB4MDBjMCwgMHgxYTY1LCAweDAyN2UsIDB4MDM3ZSwgMHg3ODA4LCAweGQwZWMsCisJMHgwMGMwLCAweDFhMzgsIDB4NzgwMywgMHgwMDA5LCAweDcwMDMsIDB4MDAwNCwgMHgwMDc4LCAweDFhM2EsCisJMHgxMDc4LCAweDFiOWYsIDB4NmIyOCwgMHg2YTJjLCAweDEwNzgsIDB4MWZlYSwgMHgwZDdlLCAweDBmN2UsCisJMHgyZDc4LCAweDI4MDQsIDB4YWM2OCwgMHg2MDM0LCAweGQwOWMsIDB4MDBjMCwgMHgxYTU1LCAweDY4MDgsCisJMHgyMDA4LCAweGEzMWEsIDB4NjgwYywgMHhhMjEzLCAweDc4MTAsIDB4YTEwMCwgMHg3ODEyLCAweDY5MGMsCisJMHg3ODE0LCAweGExMDEsIDB4NzgxNiwgMHgwMDc4LCAweDFhNjEsIDB4NjgxMCwgMHgyMDA4LCAweGEzMWEsCisJMHg2ODE0LCAweGEyMTMsIDB4NzgxMCwgMHhhMTAwLCAweDc4MTIsIDB4NjkxNCwgMHg3ODE0LCAweGExMDEsCisJMHg3ODE2LCAweDBmN2YsIDB4MGQ3ZiwgMHgwMDc4LCAweDE5MzQsIDB4MDU3ZSwgMHg3ZDBjLCAweDEwNzgsCisJMHhhMjBjLCAweDA1N2YsIDB4MTA3OCwgMHgxYWM2LCAweDBmN2UsIDB4NzAwNCwgMHgyMDc4LCAweDEwNzgsCisJMHg0ODkzLCAweDAwNDAsIDB4MWE3NiwgMHg3ODI0LCAweGMwZjUsIDB4NzgyNiwgMHgwZjdmLCAweDY4MmIsCisJMHhmZmZmLCAweDY4MmYsIDB4ZmZmZiwgMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHg2OTdjLCAweDY5MTIsCisJMHg2OTgwLCAweDY5MTYsIDB4MDA3OCwgMHgxYWFkLCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsCisJMHg3MDA0LCAweGEwMGQsIDB4MDA0MCwgMHgxYTk3LCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDAwYzAsCisJMHgxYTk3LCAweDcwMDQsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsIDB4MTA3OCwgMHg3NTZjLCAweDEwNzgsCisJMHgxNzlmLCAweDAwNzgsIDB4MWFhZCwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDcwMDQsCisJMHgyMDYwLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDFhOTcsIDB4MjA2OCwgMHg2ODA4LCAweDgwMDAsCisJMHg2ODBhLCAweDZjMjgsIDB4NmIyYywgMHgxMDc4LCAweDE3YmUsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsCisJMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMTAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHgxYWM0LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDAwNDAsIDB4MWFjNCwgMHgyMGUxLCAweDkwMjgsCisJMHg3MDBmLCAweGE1ZTcsIDB4NzAxMywgMHhhNWU3LCAweDEyN2YsIDB4MDA3YywgMHgwYzdlLCAweDEwNzgsCisJMHgxYWY3LCAweDIwZTEsIDB4OTAyOCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMDQwLCAweDFhZWQsCisJMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwgMHgxYWRhLCAweDIwNjAsIDB4NjAxMCwgMHgyMDYwLCAweDYwMDgsCisJMHg4MDAxLCAweDYwMGEsIDB4YTE4OCwgMHgwMDAzLCAweGExODIsIDB4YTYwMiwgMHgwMDQ4LCAweDFhZTIsCisJMHgyMDA5LCAweGE1ZTcsIDB4NzExMiwgMHg3MDBjLCAweGExMDYsIDB4MDBjMCwgMHgxYWNiLCAweDIwMDEsCisJMHgwMTM4LCAweDIwMDMsIDB4MDAwOCwgMHgwMDc4LCAweDFhY2IsIDB4MjAwMSwgMHgwMTVkLCAweDIwMGMsCisJMHg4MTBhLCAweDIxMDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MGM3ZiwgMHgwMDdjLCAweDIwMDEsCisJMHgwMTM4LCAweDIwMTQsIDB4MjAwMywgMHgwMDAwLCAweDIwMjEsIDB4YjAxNSwgMHgyMDAxLCAweDAxNDEsCisJMHgyMDFjLCAweGQzZGMsIDB4MDBjMCwgMHgxYjE0LCAweDIwMDEsIDB4MDEwOSwgMHgyMDFjLCAweGEzOWMsCisJMHgwMDQ4LCAweDAwYzAsIDB4MWIxNCwgMHgyMDAxLCAweDAxMTEsIDB4MjAxYywgMHg4M2ZmLCAweDAwYzAsCisJMHgxYjE0LCAweDg0MjEsIDB4MDBjMCwgMHgxYWZlLCAweDAwN2MsIDB4MjAxMSwgMHgwMjAxLCAweDIwMDksCisJMHgwMDNjLCAweDIyMDQsIDB4YTAwNSwgMHgwMGMwLCAweDFiMjEsIDB4ODEwOSwgMHgwMGMwLCAweDFiMTksCisJMHgwMDdjLCAweDAwN2MsIDB4MTA3OCwgMHgxYjE1LCAweDAwNDAsIDB4MWI0YSwgMHg3OTA4LCAweGQxZWMsCisJMHgwMGMwLCAweDFiM2EsIDB4MTA3OCwgMHgxYjgxLCAweDAwNDAsIDB4MWIzYSwgMHg3ODAzLCAweDAwMDksCisJMHg3OTA0LCAweGQxZmMsIDB4MDA0MCwgMHgxYjMwLCAweDc4MDMsIDB4MDAwNiwgMHgxMDc4LCAweDFiMTUsCisJMHgwMDQwLCAweDFiNGEsIDB4NzgwYywgMHhkMGE0LCAweDAwYzAsIDB4MWI0YSwgMHg3MDA3LCAweDAwMDAsCisJMHgxMDc4LCAweDFiODEsIDB4MDA0MCwgMHgxYjRjLCAweDc4MDMsIDB4MDAxOSwgMHg3MDAzLCAweDAwMDMsCisJMHgwMDc4LCAweDFiNGMsIDB4MTA3OCwgMHgxYWM2LCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweDAyMDAsCisJMHg3ODA4LCAweGEwODQsIDB4ZjAwMCwgMHhhMTBkLCAweDEwNzgsIDB4MWFmNywgMHgyMDE5LCAweDUwMDAsCisJMHg4MzE5LCAweDAwNDAsIDB4MWI2YiwgMHgyMDAxLCAweGE2MDIsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDFiNmIsIDB4MjAwMSwgMHgwMDIxLCAweGQwZmMsIDB4MDA0MCwgMHgxYjU4LCAweDEwNzgsCisJMHgxZTVkLCAweDAwNzgsIDB4MWI1NiwgMHgyMGUxLCAweDcwMDAsIDB4NzMyNCwgMHg3NDIwLCAweDcwMjgsCisJMHg3MDI4LCAweDc0MjYsIDB4NzAzNywgMHgwMDAxLCAweDgxMGYsIDB4NzEyZSwgMHg3MDJmLCAweDAxMDAsCisJMHg3MDM3LCAweDAwMDgsIDB4NzMyNiwgMHg3NDIyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDBlN2YsCisJMHgwMDdjLCAweDc5MDgsIDB4YTE4YywgMHgwZmZmLCAweGExODIsIDB4MDAwOSwgMHgwMDQ4LCAweDFiOGMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHgxYjllLCAweDIwMDEsIDB4MDIwYSwgMHg4MWZmLCAweDAwNDAsCisJMHgxYjk3LCAweDIwZTEsIDB4NjAwMCwgMHgyMDBjLCAweDIwMGMsIDB4MjAwYywgMHgyMDBjLCAweDIwZTEsCisJMHg3MDAwLCAweDIwMGMsIDB4MjAwYywgMHg3MDAzLCAweDAwMDAsIDB4YTAwNiwgMHgwMDdjLCAweDdjMjAsCisJMHg3ZDI0LCAweDdlMzAsIDB4N2YzNCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMDQwLCAweDFjMjQsCisJMHg3MDA0LCAweDAxN2UsIDB4MjEwYywgMHhhMTA2LCAweDAxN2YsIDB4MDA0MCwgMHgxYzI0LCAweDBkN2UsCisJMHgwYzdlLCAweDIxNmMsIDB4MmQwMCwgMHhhMDA1LCAweDAwNDAsIDB4MWMyMiwgMHg2ODI0LCAweGQwZDQsCisJMHgwMGMwLCAweDFjMjIsIDB4NjgxMCwgMHgyMDY4LCAweDY4NTAsIDB4ZDBmYywgMHgwMDQwLCAweDFiZWMsCisJMHg4MTA4LCAweDIxMDQsIDB4NmIyYywgMHhhMzA2LCAweDAwYzAsIDB4MWMyMiwgMHg4MTA4LCAweDIxMDQsCisJMHg2YTI4LCAweGEyMDYsIDB4MDBjMCwgMHgxYzIyLCAweDY4NTAsIDB4YzBmYywgMHhjMGY1LCAweDY4NTIsCisJMHg2ODZjLCAweDc4MjIsIDB4Njg3MCwgMHg3ODI2LCAweDY4MWMsIDB4NzgzMiwgMHg2ODIwLCAweDc4MzYsCisJMHg2ODE4LCAweDIwNjAsIDB4NjAzNCwgMHhkMDljLCAweDAwNDAsIDB4MWJlNywgMHg2ODMwLCAweDIwMDQsCisJMHhhYzY4LCAweDY4MDgsIDB4NzgzYSwgMHg2ODBjLCAweDc4M2UsIDB4MDA3OCwgMHgxYzIwLCAweGEwMDYsCisJMHg3ODNhLCAweDc4M2UsIDB4MDA3OCwgMHgxYzIwLCAweDgxMDgsIDB4MjEwNCwgMHhhMDA1LCAweDAwYzAsCisJMHgxYzIyLCAweDgxMDgsIDB4MjEwNCwgMHhhMDA1LCAweDAwYzAsIDB4MWMyMiwgMHg2ODUwLCAweGMwZjUsCisJMHg2ODUyLCAweDY4MzAsIDB4MjAwNCwgMHg2OTE4LCAweGExNjAsIDB4YTE4MCwgMHgwMDBkLCAweDIwMDQsCisJMHhkMDljLCAweDAwYzAsIDB4MWMxMiwgMHg2MDA4LCAweDc4MjIsIDB4Njg2ZSwgMHg2MDBjLCAweDc4MjYsCisJMHg2ODcyLCAweDYwMDAsIDB4NzgzMiwgMHg2MDA0LCAweDc4MzYsIDB4YTAwNiwgMHg3ODNhLCAweDc4M2UsCisJMHgwMDc4LCAweDFjMjAsIDB4NjAxMCwgMHg3ODIyLCAweDY4NmUsIDB4NjAxNCwgMHg3ODI2LCAweDY4NzIsCisJMHg2MDAwLCAweDc4MzIsIDB4NjAwNCwgMHg3ODM2LCAweDYwMDgsIDB4NzgzYSwgMHg2MDBjLCAweDc4M2UsCisJMHg3ODAzLCAweDAwMTEsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDAxN2UsCisJMHgwMjdlLCAweDIwNzEsIDB4YTVlMSwgMHgyMDc5LCAweDAwMzAsIDB4MjAxMSwgMHgwMDUwLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgxYzRkLCAweDgyMTEsIDB4MDA0MCwgMHgxYzRiLCAweDIwMDEsCisJMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywgMHgwMDQwLCAweDFjMzQsIDB4NzkwNCwgMHhhMThjLCAweDA3ODAsCisJMHgwMTdlLCAweDEwNzgsIDB4MThlMiwgMHgwMTdmLCAweDgxZmYsIDB4MDBjMCwgMHgxYzRiLCAweDIwMTEsCisJMHgwMDUwLCAweDAwNzgsIDB4MWMyZiwgMHhhMDg1LCAweDAwMDEsIDB4MDI3ZiwgMHgwMTdmLCAweDBlN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4NzgwMywgMHgwMDA0LCAweDIwMDksIDB4MDA2NCwgMHg3ODA0LCAweGQwYWMsCisJMHgwMDQwLCAweDFjYTMsIDB4ODEwOSwgMHgwMGMwLCAweDFjNTYsIDB4MjAwOSwgMHgwMTAwLCAweDIxMGMsCisJMHhhMThhLCAweDAwMDMsIDB4MTA0OCwgMHgxMzI4LCAweDEwNzgsIDB4MWY3NSwgMHgwZTdlLCAweDBmN2UsCisJMHgyMDcxLCAweGE1ZDAsIDB4MjA3OSwgMHgwMDEwLCAweDcwMDQsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHgxYzliLCAweDc4MDAsIDB4MDA3ZSwgMHg3ODIwLCAweDAwN2UsIDB4NzgzMCwgMHgwMDdlLCAweDc4MzQsCisJMHgwMDdlLCAweDc4MzgsIDB4MDA3ZSwgMHg3ODNjLCAweDAwN2UsIDB4NzgwMywgMHgwMDA0LCAweDc4MjMsCisJMHgwMDAwLCAweDAwMDUsIDB4MDAwNSwgMHgyMDc5LCAweDAwMzAsIDB4NzgwNCwgMHhkMGFjLCAweDEwYzAsCisJMHgxMzI4LCAweDIwNzksIDB4MDAxMCwgMHgwMDdmLCAweDc4M2UsIDB4MDA3ZiwgMHg3ODNhLCAweDAwN2YsCisJMHg3ODM2LCAweDAwN2YsIDB4NzgzMiwgMHgwMDdmLCAweDc4MjIsIDB4MDA3ZiwgMHg3ODAyLCAweDBmN2YsCisJMHgwZTdmLCAweDAwNzgsIDB4MWNhMSwgMHgwZjdmLCAweDBlN2YsIDB4NzgwNCwgMHhkMGFjLCAweDEwYzAsCisJMHgxMzI4LCAweDEwNzgsIDB4NjFkMywgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNjAyLCAweDcwMDMsCisJMHgwMDAwLCAweDBlN2YsIDB4MDA3YywgMHgwZDdlLCAweGEyODAsIDB4MDAwNCwgMHgyMDZjLCAweDY5NGMsCisJMHhkMWRjLCAweDAwYzAsIDB4MWQyNiwgMHg2OTM0LCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDFjYjgsCisJMHgxY2MwLCAweDFkMTEsIDB4MWNjMCwgMHgxY2MwLCAweDFjYzAsIDB4MWNmNiwgMHgxY2QzLCAweDFjYzIsCisJMHgxMDc4LCAweDEzMjgsIDB4Njg0YywgMHhkMGI0LCAweDAwNDAsIDB4MWUzNCwgMHg2ODYwLCAweDY4MmUsCisJMHg2ODE2LCAweDY4NWMsIDB4NjgyYSwgMHg2ODEyLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLCAweDY4MGUsCisJMHg2OTU4LCAweDAwNzgsIDB4MWQxOSwgMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsCisJMHgwMGMwLCAweDFjYzAsIDB4Njg0YywgMHhkMGI0LCAweDAwNDAsIDB4MWUzNCwgMHg2ODYwLCAweDY4MmUsCisJMHg2ODE2LCAweDY4NWMsIDB4NjgyYSwgMHg2ODEyLCAweDY4N2MsIDB4NjgwYSwgMHg2ODgwLCAweDY4MGUsCisJMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMDE1LCAweDIwMDQsIDB4NjgzMiwgMHg2OTU4LCAweDAwNzgsIDB4MWQyMiwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMTUsIDB4MDBjMCwgMHgxZDI2LCAweDY4NGMsIDB4ZDBiNCwgMHgwMDQwLCAweDFlMzQsCisJMHg2ODA0LCAweDY4MWEsIDB4YTA4MCwgMHgwMDBkLCAweDIwMDQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMDE1LCAweDIwMDQsIDB4NjgzMiwgMHg2OTU4LCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDAwNzgsCisJMHgxZDIyLCAweDY4NGMsIDB4ZDBiNCwgMHgwMDQwLCAweDE4YmMsIDB4Njk1OCwgMHhhMDA2LCAweDY4MmUsCisJMHg2ODJhLCAweDJkMDAsIDB4NjgxYSwgMHg2ODM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIwMTUsCisJMHgyMDA0LCAweDY4MzIsIDB4NjkyNiwgMHg2ODRjLCAweGMwZGQsIDB4Njg0ZSwgMHgwZDdmLCAweDAwN2MsCisJMHgwZjdlLCAweDIwNzksIDB4MDAyMCwgMHg3ODA0LCAweGQwZmMsIDB4MTBjMCwgMHgxZTVkLCAweDBlN2UsCisJMHgwZDdlLCAweDIwNzEsIDB4YTYwMiwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgxZGFiLCAweDBjN2UsCisJMHg3MjA2LCAweGEyODAsIDB4MDAwNCwgMHgyMDVjLCAweDcwMDQsIDB4MjA2OCwgMHg3ODAzLCAweDAwMDQsCisJMHg2ODE4LCAweDBkN2UsIDB4MjA2OCwgMHg2ODZjLCAweDc4MTIsIDB4Njg5MCwgMHgwZjdlLCAweDIwZTEsCisJMHg5MDQwLCAweDIwNzksIDB4MDIwMCwgMHg3ODFhLCAweDIwNzksIDB4MDEwMCwgMHg4MDA0LCAweDc4ZDYsCisJMHgwZjdmLCAweDBkN2YsIDB4MmI2OCwgMHg2ODI0LCAweDIwNTAsIDB4NjgxOCwgMHgyMDYwLCAweDY4MzAsCisJMHgyMDQwLCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweDY5MDgsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMDcsIDB4MDA0MCwgMHgxZDZkLCAweGExODQsIDB4MDAwNywgMHgwMDQwLCAweDFkNmQsCisJMHgwMTdlLCAweDIwMDksIDB4MDAwOCwgMHhhMTAyLCAweDAxN2YsIDB4YTEwOCwgMHg3OTFhLCAweDcxMTYsCisJMHg3MDFlLCAweDY4MGMsIDB4YTA4MSwgMHgwMDAwLCAweDc4MWUsIDB4NzAxYSwgMHhhMDA2LCAweDcwMGUsCisJMHg3MDEyLCAweDcwMDQsIDB4NjkyYywgMHg2ODE0LCAweGExMDYsIDB4MDBjMCwgMHgxZDg0LCAweDY5MjgsCisJMHg2ODEwLCAweGExMDYsIDB4MDA0MCwgMHgxZDkxLCAweDAzN2UsIDB4MDQ3ZSwgMHg2YjE0LCAweDZjMTAsCisJMHgxMDc4LCAweDIwMzUsIDB4MDQ3ZiwgMHgwMzdmLCAweDAwNDAsIDB4MWQ5MSwgMHgwYzdmLCAweDAwNzgsCisJMHgxZGFiLCAweDhhZmYsIDB4MDBjMCwgMHgxZDk5LCAweDBjN2YsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsCisJMHgxZGFiLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4MDAyMCwgMHgyMDA5LCAweDAwMDEsCisJMHgxMDc4LCAweDFkYWYsIDB4MDA0MCwgMHgxZGE4LCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDFkYWYsCisJMHgxMjdmLCAweDBjN2YsIDB4YTAwNiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDA3N2UsCisJMHgwNjdlLCAweDA1N2UsIDB4MDQ3ZSwgMHgwMzdlLCAweDAyN2UsIDB4OGFmZiwgMHgwMDQwLCAweDFlMmQsCisJMHg3MDBjLCAweDcyMTQsIDB4YTIzYSwgMHg3MDEwLCAweDcyMTgsIDB4YTIwMywgMHgwMDQ4LCAweDFlMmMsCisJMHhhNzA1LCAweDAwNDAsIDB4MWUyYywgMHhhMDNlLCAweDI3MzAsIDB4Njg1MCwgMHhkMGZjLCAweDAwYzAsCisJMHgxZGRmLCAweDBkN2UsIDB4MjgwNCwgMHhhYzY4LCAweDI5MDAsIDB4MDA3OSwgMHgxZGNmLCAweDFlMGUsCisJMHgxZGVmLCAweDFkZWYsIDB4MWUwZSwgMHgxZTBlLCAweDFlMDYsIDB4MWUwZSwgMHgxZGVmLCAweDFlMGUsCisJMHgxZGY1LCAweDFkZjUsIDB4MWUwZSwgMHgxZTBlLCAweDFlMGUsIDB4MWRmZCwgMHgxZGY1LCAweGMwZmMsCisJMHg2ODUyLCAweDZiNmMsIDB4NmE3MCwgMHg2ZDFjLCAweDZjMjAsIDB4ZDk5YywgMHgwMDQwLCAweDFlMTIsCisJMHgwZDdlLCAweDI4MDQsIDB4YWM2OCwgMHg2ZjA4LCAweDZlMGMsIDB4MDA3OCwgMHgxZTExLCAweDZiMDgsCisJMHg2YTBjLCAweDZkMDAsIDB4NmMwNCwgMHgwMDc4LCAweDFlMTEsIDB4NmIxMCwgMHg2YTE0LCAweDZkMDAsCisJMHg2YzA0LCAweDZmMDgsIDB4NmUwYywgMHgwMDc4LCAweDFlMTEsIDB4MGQ3ZiwgMHgwZDdlLCAweDY4MzQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDAwYzAsIDB4MWUwZSwgMHgwZDdmLCAweDEwNzgsCisJMHgxZmQxLCAweDAwYzAsIDB4MWRiNSwgMHhhMDBlLCAweDAwNzgsIDB4MWUyZCwgMHgwZDdmLCAweDEwNzgsCisJMHgxMzI4LCAweDBkN2YsIDB4N2IyMiwgMHg3YTI2LCAweDdkMzIsIDB4N2MzNiwgMHg3ZjNhLCAweDdlM2UsCisJMHg3OTAyLCAweDcwMDAsIDB4ODAwMCwgMHg3MDAyLCAweDY4MjgsIDB4YTMwMCwgMHg2ODJhLCAweDY4MmMsCisJMHhhMjAxLCAweDY4MmUsIDB4NzAwYywgMHhhMzAwLCAweDcwMGUsIDB4NzAxMCwgMHhhMjAxLCAweDcwMTIsCisJMHgxMDc4LCAweDFmZDEsIDB4MDA3OCwgMHgxZTJkLCAweGEwMDYsIDB4MDI3ZiwgMHgwMzdmLCAweDA0N2YsCisJMHgwNTdmLCAweDA2N2YsIDB4MDc3ZiwgMHgwMDdjLCAweDEwNzgsIDB4MTMyOCwgMHgwMjdlLCAweDIwMDEsCisJMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsCisJMHgwMDQwLCAweDFlNGQsIDB4Njg1MCwgMHhjMGJkLCAweDY4NTIsIDB4MGQ3ZiwgMHgxMDc4LCAweDg3NTgsCisJMHgyMGUxLCAweDkwNDAsIDB4MTA3OCwgMHg3MTlhLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDZlZmMsCisJMHgxMDc4LCAweDYxZDMsIDB4MDI3ZiwgMHgwMDc4LCAweDFmMjksIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsCisJMHgwMDdlLCAweDAxN2UsIDB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsIDB4MGM3ZSwgMHgyMDc5LCAweDAwMjAsCisJMHgyMDcxLCAweGE2MDIsIDB4MmI2OCwgMHg2ODE4LCAweDIwNjAsIDB4NzkwNCwgMHg3ODAzLCAweDAwMDIsCisJMHhhMTg0LCAweDA3MDAsIDB4MDBjMCwgMHgxZTM2LCAweDcwMDAsIDB4MDA3OSwgMHgxZTc3LCAweDFmMjksCisJMHgxZTdiLCAweDFlZjYsIDB4MWYyNywgMHg4MDAxLCAweDcwMDIsIDB4ZDE5YywgMHgwMGMwLCAweDFlOGYsCisJMHg4YWZmLCAweDAwNDAsIDB4MWVhZSwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgxZGFmLCAweDAwNDAsCisJMHgxZjI5LCAweDIwMDksIDB4MDAwMSwgMHgxMDc4LCAweDFkYWYsIDB4MDA3OCwgMHgxZjI5LCAweDc4MDMsCisJMHgwMDA0LCAweGQxOTQsIDB4MDA0MCwgMHgxZTlmLCAweDY4NTAsIDB4YzBmYywgMHg2ODUyLCAweDhhZmYsCisJMHgwMGMwLCAweDFlYTQsIDB4Njg0YywgMHhjMGY1LCAweDY4NGUsIDB4MDA3OCwgMHgxZWE0LCAweDEwNzgsCisJMHgxZmVhLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLCAweDJhMDAsIDB4NjgyNiwgMHgyYzAwLCAweDY4MWEsCisJMHgyODAwLCAweDY4MzIsIDB4NzAwMywgMHgwMDAwLCAweDAwNzgsIDB4MWYyOSwgMHg3MTFjLCAweDgxZmYsCisJMHgwMDQwLCAweDFlYzQsIDB4NzkxOCwgMHg3OTIyLCAweDc4MjcsIDB4MDAwMCwgMHg3ODAzLCAweDAwMDEsCisJMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHg3MDBjLCAweGExMDAsIDB4NzAwZSwgMHg3MDEwLCAweGEwODEsCisJMHgwMDAwLCAweDcwMTIsIDB4MDA3OCwgMHgxZjI5LCAweDBmN2UsIDB4MDI3ZSwgMHg3ODFjLCAweDAwN2UsCisJMHg3ODE4LCAweDAwN2UsIDB4MjA3OSwgMHgwMTAwLCAweDdhMTQsIDB4YTI4NCwgMHgwMDA0LCAweGEwODUsCisJMHgwMDEyLCAweDc4MTYsIDB4MDM3ZSwgMHgyMDE5LCAweDEwMDAsIDB4ODMxOSwgMHgxMDQwLCAweDEzMjgsCisJMHg3ODIwLCAweGQwYmMsIDB4MDBjMCwgMHgxZWQ1LCAweDAzN2YsIDB4NzljOCwgMHgwMDdmLCAweGExMDIsCisJMHgwMTdmLCAweDAwN2UsIDB4MDE3ZSwgMHg3OWM0LCAweDAwN2YsIDB4YTEwMywgMHg3OGM2LCAweDAwN2YsCisJMHg3OGNhLCAweGEyODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMTIsIDB4NzgxNiwgMHgwMjdmLCAweDBmN2YsCisJMHg3ODAzLCAweDAwMDgsIDB4NzAwMywgMHgwMDAwLCAweDAwNzgsIDB4MWYyOSwgMHg4MDAxLCAweDcwMDIsCisJMHhkMTk0LCAweDAwNDAsIDB4MWYwYiwgMHg3ODA0LCAweGQwZmMsIDB4MDBjMCwgMHgxZTZkLCAweGQxOWMsCisJMHgwMGMwLCAweDFmMjUsIDB4OGFmZiwgMHgwMDQwLCAweDFmMjksIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsCisJMHgxZGFmLCAweDAwNzgsIDB4MWYyOSwgMHgwMjdlLCAweDAzN2UsIDB4NmIyOCwgMHg2YTJjLCAweDEwNzgsCisJMHgxZmVhLCAweDBkN2UsIDB4MjgwNCwgMHhhYzY4LCAweDYwMzQsIDB4ZDA5YywgMHgwMGMwLCAweDFmMWUsCisJMHg2ODA4LCAweGEzMWEsIDB4NjgwYywgMHhhMjEzLCAweDAwNzgsIDB4MWYyMiwgMHg2ODEwLCAweGEzMWEsCisJMHg2ODE0LCAweGEyMTMsIDB4MGQ3ZiwgMHgwMDc4LCAweDFlOWYsIDB4MDA3OCwgMHgxZTlmLCAweDEwNzgsCisJMHgxMzI4LCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsCisJMHgwMDdjLCAweDBmN2UsIDB4MGU3ZSwgMHgyMDcxLCAweGE2MDIsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDFmNzIsIDB4MjA3OSwgMHgwMDIwLCAweDAxN2UsIDB4MjAwOSwgMHgwMjA3LCAweDIxMGMsCisJMHhkMTk0LCAweDAwNDAsIDB4MWY0ZiwgMHgyMDA5LCAweDAyMGMsIDB4MjEwYywgMHhhMTg0LCAweDAwMDMsCisJMHgwMDQwLCAweDFmNGYsIDB4MjBlMSwgMHg5MDQwLCAweDIwMDEsIDB4MDIwYywgMHgyMTAyLCAweDIwMDksCisJMHgwMjA2LCAweDIxMDQsIDB4MjAwOSwgMHgwMjAzLCAweDIxMGMsIDB4YTEwNiwgMHgwMGMwLCAweDFmNWEsCisJMHgyMGUxLCAweDkwNDAsIDB4NzgwNCwgMHhkMGZjLCAweDAwNDAsIDB4MWYzZCwgMHgxMDc4LCAweDFlNWQsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDFmM2QsIDB4MDE3ZiwgMHg3ODAzLCAweDAwMDQsCisJMHg3ODA0LCAweGQwYWMsIDB4MDBjMCwgMHgxZjY4LCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDIsCisJMHg3MDAzLCAweDAwMDAsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwYzdlLCAweDBkN2UsCisJMHgwZTdlLCAweDBmN2UsIDB4MjA3MSwgMHhhNjAyLCAweDIwNzksIDB4MDAyMCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDAwNDAsIDB4MWZhZSwgMHg3MDA0LCAweDIwNjAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4MWY5OCwgMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHg2ODBjLCAweDdhMWMsCisJMHhhMjA2LCAweDAwYzAsIDB4MWY5OCwgMHg2ODA4LCAweDdhMTgsIDB4YTIwNiwgMHgwMDQwLCAweDFmYjQsCisJMHgyMDAxLCAweDAxMDUsIDB4MjAwMywgMHgwMDEwLCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHgyMDYwLCAweDEwNzgsIDB4ODc1OCwgMHgyMGUxLCAweDkwNDAsCisJMHgxMDc4LCAweDcxOWEsIDB4MjAxMSwgMHgwMDAwLCAweDEwNzgsIDB4NmVmYywgMHgwZjdmLCAweDBlN2YsCisJMHgwZDdmLCAweDBjN2YsIDB4MDI3ZiwgMHgwMDdjLCAweDY4MTAsIDB4NmExNCwgMHhhMjA1LCAweDAwYzAsCisJMHgxZjk4LCAweDY4NGMsIDB4YzBkYywgMHg2ODRlLCAweDJjMTAsIDB4MTA3OCwgMHgxY2FiLCAweDIwMDEsCisJMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDIwNjksIDB4YTVhYiwgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDAwNzgsCisJMHgxZmFlLCAweDg4NDAsIDB4MjgwNCwgMHhhMDA1LCAweDAwYzAsIDB4MWZlNSwgMHg2MDA0LCAweGEwMDUsCisJMHgwMDQwLCAweDFmZTcsIDB4NjgxYSwgMHgyMDYwLCAweDYwMzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMDE1LCAweDIwNDQsIDB4ODhmZiwgMHgxMDQwLCAweDEzMjgsIDB4OGE1MSwgMHgwMDdjLCAweDIwNTEsCisJMHgwMDAwLCAweDAwN2MsIDB4OGE1MCwgMHg4ODQxLCAweDI4MDQsIDB4YTAwNSwgMHgwMGMwLCAweDIwMDQsCisJMHgyYzAwLCAweGFkMDYsIDB4MDA0MCwgMHgxZmY5LCAweDYwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDFmZjksCisJMHgyZDAwLCAweDIwNjAsIDB4NjgxYSwgMHg2MDM0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIwMjUsCisJMHgyMDQ0LCAweDg4ZmYsIDB4MTA0MCwgMHgxMzI4LCAweDAwN2MsIDB4MDAwMCwgMHgwMDExLCAweDAwMTUsCisJMHgwMDE5LCAweDAwMWQsIDB4MDAyMSwgMHgwMDI1LCAweDAwMjksIDB4MDAwMCwgMHgwMDBmLCAweDAwMTUsCisJMHgwMDFiLCAweDAwMjEsIDB4MDAyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDBhLCAweDIwMDYsCisJMHgwMDAwLCAweDAwMDAsIDB4MjAxNCwgMHgwMDAwLCAweDIwMGEsIDB4MDAwMCwgMHgyMDExLCAweDIwMGUsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDE0LCAweDIwMTEsIDB4MDAwMCwgMHgyMDBjLCAweDIwMGMsCisJMHgwMDAwLCAweDAwMDAsIDB4MjAxNCwgMHgwMDAwLCAweDIwMGMsIDB4MDAwMCwgMHgyMDEyLCAweDIwMTIsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDE0LCAweDIwMTIsIDB4MGE3ZSwgMHgwOTdlLCAweDA4N2UsCisJMHg2YjJlLCAweDZjMmEsIDB4Njg1OCwgMHhhMDU1LCAweDAwNDAsIDB4MjBkOCwgMHgyZDYwLCAweDYwMzQsCisJMHhhMGNjLCAweDAwMGYsIDB4YTljMCwgMHgyMDE1LCAweGE5ODYsIDB4MDAwNywgMHgwMDQwLCAweDIwNTAsCisJMHhhOTg2LCAweDAwMGUsIDB4MDA0MCwgMHgyMDUwLCAweGE5ODYsIDB4MDAwZiwgMHgwMGMwLCAweDIwNTQsCisJMHg2MDVjLCAweGE0MjIsIDB4NjA2MCwgMHhhMzFhLCAweDI4MDQsIDB4YTA0NSwgMHgwMGMwLCAweDIwNjIsCisJMHgwMDUwLCAweDIwNWMsIDB4MDA3OCwgMHgyMGQ4LCAweDYwMDQsIDB4YTA2NSwgMHgwMDQwLCAweDIwZDgsCisJMHgwMDc4LCAweDIwM2YsIDB4MjgwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjA4MCwgMHhhYzY4LCAweGQ5OWMsCisJMHgwMGMwLCAweDIwNzAsIDB4NjgwOCwgMHhhNDIyLCAweDY4MGMsIDB4YTMxYiwgMHgwMDc4LCAweDIwNzQsCisJMHg2ODEwLCAweGE0MjIsIDB4NjgxNCwgMHhhMzFiLCAweDAwNDgsIDB4MjA5ZiwgMHgyMzAwLCAweGE0MDUsCisJMHgwMDQwLCAweDIwODYsIDB4OGE1MSwgMHgwMDQwLCAweDIwZDgsIDB4ODg0MCwgMHgwMDc4LCAweDIwNjIsCisJMHg2MDA0LCAweGEwNjUsIDB4MDA0MCwgMHgyMGQ4LCAweDAwNzgsIDB4MjAzZiwgMHg4YTUxLCAweDAwNDAsCisJMHgyMGQ4LCAweDg4NDAsIDB4MjgwNCwgMHhhMDA1LCAweDAwYzAsIDB4MjA5OSwgMHg2MDA0LCAweGEwNjUsCisJMHgwMDQwLCAweDIwZDgsIDB4NjAzNCwgMHhhMGNjLCAweDAwMGYsIDB4YTljMCwgMHgyMDE1LCAweDI4MDQsCisJMHgyMDQwLCAweDJiNjgsIDB4Njg1MCwgMHhjMGZjLCAweDY4NTIsIDB4MDA3OCwgMHgyMGNjLCAweDg0MjIsCisJMHg4NDIwLCAweDgzMWEsIDB4YTM5OSwgMHgwMDAwLCAweDBkN2UsIDB4MmI2OCwgMHg2YzZlLCAweDZiNzIsCisJMHgwZDdmLCAweGQ5OWMsIDB4MDBjMCwgMHgyMGJhLCAweDY5MDgsIDB4MjQwMCwgMHhhMTIyLCAweDY5MGMsCisJMHgyMzAwLCAweGExMWIsIDB4MTA0OCwgMHgxMzI4LCAweDY4MDAsIDB4YTQyMCwgMHg2ODA0LCAweGEzMTksCisJMHgwMDc4LCAweDIwYzYsIDB4NjkxMCwgMHgyNDAwLCAweGExMjIsIDB4NjkxNCwgMHgyMzAwLCAweGExMWIsCisJMHgxMDQ4LCAweDEzMjgsIDB4NjgwMCwgMHhhNDIwLCAweDY4MDQsIDB4YTMxOSwgMHgyYjY4LCAweDZjMWUsCisJMHg2YjIyLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsCisJMHgyYTAwLCAweDY4MjYsIDB4MDA3ZiwgMHgwMDdmLCAweDAwN2YsIDB4YTAwNiwgMHgwMDc4LCAweDIwZGQsCisJMHgwODdmLCAweDA5N2YsIDB4MGE3ZiwgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgyMDAxLCAweDAwMDUsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDIwZTUsIDB4MjBlZCwgMHgyMGVlLCAweDIwZjEsCisJMHgyMGY0LCAweDIwZjksIDB4MjBmYywgMHgyMTAxLCAweDIxMDYsIDB4MDA3YywgMHgxMDc4LCAweDFlNWQsCisJMHgwMDdjLCAweDEwNzgsIDB4MThlMiwgMHgwMDdjLCAweDEwNzgsIDB4MThlMiwgMHgxMDc4LCAweDFlNWQsCisJMHgwMDdjLCAweDEwNzgsIDB4MTRiMCwgMHgwMDdjLCAweDEwNzgsIDB4MWU1ZCwgMHgxMDc4LCAweDE0YjAsCisJMHgwMDdjLCAweDEwNzgsIDB4MThlMiwgMHgxMDc4LCAweDE0YjAsIDB4MDA3YywgMHgxMDc4LCAweDE4ZTIsCisJMHgxMDc4LCAweDFlNWQsIDB4MTA3OCwgMHgxNGIwLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsCisJMHgyMDc5LCAweDAyMDAsIDB4MjA3MSwgMHhhODgwLCAweDIwNjksIDB4YTMwMCwgMHgyMDA5LCAweDAwMDQsCisJMHg3OTEyLCAweDc4MTcsIDB4MDAwNCwgMHgxMDc4LCAweDI0YjUsIDB4NzgxYiwgMHgwMDAyLCAweDIwZTEsCisJMHg4NzAwLCAweDEyN2YsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHg3ODFjLCAweGEwODQsCisJMHgwMDA3LCAweDAwNzksIDB4MjEyYiwgMHgyMTRmLCAweDIxMzMsIDB4MjEzNywgMHgyMTNiLCAweDIxNDEsCisJMHgyMTQ1LCAweDIxNDksIDB4MjE0ZCwgMHgxMDc4LCAweDUzNzIsIDB4MDA3OCwgMHgyMTRmLCAweDEwNzgsCisJMHg1M2IzLCAweDAwNzgsIDB4MjE0ZiwgMHgxMDc4LCAweDUzNzIsIDB4MTA3OCwgMHg1M2IzLCAweDAwNzgsCisJMHgyMTRmLCAweDEwNzgsIDB4MjE1MSwgMHgwMDc4LCAweDIxNGYsIDB4MTA3OCwgMHgyMTUxLCAweDAwNzgsCisJMHgyMTRmLCAweDEwNzgsIDB4MjE1MSwgMHgwMDc4LCAweDIxNGYsIDB4MTA3OCwgMHgyMTUxLCAweDEyN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDc5MzAsIDB4YTE4NCwgMHgwMDAzLCAweDAwNDAsCisJMHgyMTVkLCAweDIwZTEsIDB4OTA0MCwgMHgwMDc4LCAweDIxODYsIDB4YTE4NCwgMHgwMDMwLCAweDAwNDAsCisJMHgyMTZlLCAweDZhMDAsIDB4YTI4NiwgMHgwMDAzLCAweDAwYzAsIDB4MjE2OCwgMHgwMDc4LCAweDIxNmEsCisJMHgxMDc4LCAweDQxNzEsIDB4MjBlMSwgMHg5MDEwLCAweDAwNzgsIDB4MjE4NiwgMHhhMTg0LCAweDAwYzAsCisJMHgwMDQwLCAweDIxODAsIDB4MGU3ZSwgMHgwMzdlLCAweDA0N2UsIDB4MDU3ZSwgMHgyMDcxLCAweGE1ZTEsCisJMHgxMDc4LCAweDFhYzYsIDB4MDU3ZiwgMHgwNDdmLCAweDAzN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDIxODYsCisJMHhhMTg0LCAweDAzMDAsIDB4MDA0MCwgMHgyMTg2LCAweDIwZTEsIDB4OTAyMCwgMHg3OTMyLCAweDAyN2YsCisJMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHgwMTdlLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDcxLCAweGEzMDAsCisJMHg3MTI4LCAweDIwMDEsIDB4YTU4ZiwgMHgyMTAyLCAweDIwMDEsIDB4YTU5NywgMHgyMTAyLCAweGExODIsCisJMHgwMjExLCAweDAwYzgsIDB4MjE5ZiwgMHgyMDA5LCAweDAwMDgsIDB4MDA3OCwgMHgyMWM5LCAweGExODIsCisJMHgwMjU5LCAweDAwYzgsIDB4MjFhNywgMHgyMDA5LCAweDAwMDcsIDB4MDA3OCwgMHgyMWM5LCAweGExODIsCisJMHgwMmMxLCAweDAwYzgsIDB4MjFhZiwgMHgyMDA5LCAweDAwMDYsIDB4MDA3OCwgMHgyMWM5LCAweGExODIsCisJMHgwMzQ5LCAweDAwYzgsIDB4MjFiNywgMHgyMDA5LCAweDAwMDUsIDB4MDA3OCwgMHgyMWM5LCAweGExODIsCisJMHgwNDIxLCAweDAwYzgsIDB4MjFiZiwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHgyMWM5LCAweGExODIsCisJMHgwNTgxLCAweDAwYzgsIDB4MjFjNywgMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHgyMWM5LCAweDIwMDksCisJMHgwMDAyLCAweDIwNzksIDB4MDIwMCwgMHg3OTEyLCAweDc4MTcsIDB4MDAwNCwgMHgxMDc4LCAweDI0YjUsCisJMHgwZjdmLCAweDBlN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDIwNjEsCisJMHgwMTAwLCAweDIwNzEsIDB4YTMwMCwgMHg2MDI0LCAweDYwMjYsIDB4NjA1MywgMHgwMDMwLCAweDYwMzMsCisJMHgwMGVmLCAweDYwZTcsIDB4MDAwMCwgMHg2MGViLCAweDAwZWYsIDB4NjBlMywgMHgwMDA4LCAweDYwNGIsCisJMHhmN2Y3LCAweDYwNDMsIDB4MDAwMCwgMHg2MDJmLCAweDAwODAsIDB4NjAyZiwgMHgwMDAwLCAweDYwMDcsCisJMHgwZWFmLCAweDYwMGYsIDB4MDBmZiwgMHg2MDJiLCAweDAwMmYsIDB4MTI3ZiwgMHgwMDdjLCAweDIwMDEsCisJMHhhMzJmLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweGEzMmUsIDB4MjAwMywgMHgwMDAxLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHg2MTI0LCAweGExODQsCisJMHgwMDJjLCAweDAwYzAsIDB4MjIwZiwgMHhhMTg0LCAweDAwMDcsIDB4MDA3OSwgMHgyMjE1LCAweGExOTUsCisJMHgwMDA0LCAweGEyODQsIDB4MDAwNywgMHgwMDc5LCAweDIyMTUsIDB4MjI0MSwgMHgyMjFkLCAweDIyMjEsCisJMHgyMjI1LCAweDIyMmIsIDB4MjIyZiwgMHgyMjM1LCAweDIyM2IsIDB4MTA3OCwgMHg1YWQyLCAweDAwNzgsCisJMHgyMjQxLCAweDEwNzgsIDB4NWJjMSwgMHgwMDc4LCAweDIyNDEsIDB4MTA3OCwgMHg1YmMxLCAweDEwNzgsCisJMHg1YWQyLCAweDAwNzgsIDB4MjI0MSwgMHgxMDc4LCAweDIyNDYsIDB4MDA3OCwgMHgyMjQxLCAweDEwNzgsCisJMHg1YWQyLCAweDEwNzgsIDB4MjI0NiwgMHgwMDc4LCAweDIyNDEsIDB4MTA3OCwgMHg1YmMxLCAweDEwNzgsCisJMHgyMjQ2LCAweDAwNzgsIDB4MjI0MSwgMHgxMDc4LCAweDViYzEsIDB4MTA3OCwgMHg1YWQyLCAweDEwNzgsCisJMHgyMjQ2LCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsIDB4MDA3YywgMHg2MTI0LCAweGQxYWMsCisJMHgwMDQwLCAweDIzNDIsIDB4MDE3ZSwgMHgwNDdlLCAweDBjN2UsIDB4NjQ0YywgMHhhNDg2LCAweGYwZjAsCisJMHgwMGMwLCAweDIyNTksIDB4MjA2MSwgMHgwMTAwLCAweDY0NGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsCisJMHgwMDEwLCAweDc0YzIsIDB4YTQ4YywgMHhmZjAwLCAweDcwMzQsIDB4ZDA4NCwgMHgwMDQwLCAweDIyNzEsCisJMHhhMTg2LCAweGY4MDAsIDB4MDBjMCwgMHgyMjcxLCAweDcwMzgsIDB4ZDA4NCwgMHgwMGMwLCAweDIyNzEsCisJMHhjMDg1LCAweDcwM2EsIDB4MDM3ZSwgMHgyNDE4LCAweDIwMTEsIDB4ODAxNiwgMHgxMDc4LCAweDM1NzksCisJMHgwMzdmLCAweGExOTYsIDB4ZmYwMCwgMHgwMDQwLCAweDIyYjMsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsCisJMHg4MTBmLCAweGExMTYsIDB4MDA0MCwgMHgyMmIzLCAweDcxMzAsIDB4ZDE4NCwgMHgwMGMwLCAweDIyYjMsCisJMHgyMDExLCAweGEzNTIsIDB4MjIxNCwgMHhkMmVjLCAweDAwNDAsIDB4MjI4ZSwgMHhjMThkLCAweDcxMzIsCisJMHgyMDExLCAweGEzNTIsIDB4MjIxNCwgMHhkMmFjLCAweDAwYzAsIDB4MjJiMywgMHg2MjQwLCAweGEyOTQsCisJMHgwMDEwLCAweDAwNDAsIDB4MjI5YSwgMHg2MjQ4LCAweGEyOTQsIDB4ZmYwMCwgMHhhMjk2LCAweGZmMDAsCisJMHgwMDQwLCAweDIyYjMsIDB4NzAzMCwgMHhkMDhjLCAweDAwNDAsIDB4MjMwNSwgMHg3MDM0LCAweGQwOGMsCisJMHgwMGMwLCAweDIyYWEsIDB4MjAwMSwgMHhhMzBjLCAweDIwMGMsIDB4ZDFhYywgMHgwMGMwLCAweDIzMDUsCisJMHhjMWFkLCAweDIxMDIsIDB4MDM3ZSwgMHg3M2MwLCAweDIwMTEsIDB4ODAxMywgMHgxMDc4LCAweDM1NzksCisJMHgwMzdmLCAweDAwNzgsIDB4MjMwNSwgMHg3MDM0LCAweGQwOGMsIDB4MDBjMCwgMHgyMmJmLCAweDIwMDEsCisJMHhhMzBjLCAweDIwMGMsIDB4ZDFhYywgMHgwMGMwLCAweDIzMDUsIDB4YzFhZCwgMHgyMTAyLCAweDAzN2UsCisJMHg3M2MwLCAweDIwMTEsIDB4ODAxMywgMHgxMDc4LCAweDM1NzksIDB4MDM3ZiwgMHg3MTMwLCAweGMxODUsCisJMHg3MTMyLCAweDIwMTEsIDB4YTM1MiwgMHgyMjBjLCAweGQxYTQsIDB4MDA0MCwgMHgyMmU5LCAweDAxN2UsCisJMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDEwNzgsIDB4NWE2ZCwgMHgyMDE5LCAweDAwMGUsCisJMHgxMDc4LCAweDllM2IsIDB4YTQ4NCwgMHgwMGZmLCAweGEwODAsIDB4MjkzZiwgMHgyMDBjLCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4ODEyNywgMHhhMDA2LCAweDIwMDksIDB4MDAwZSwgMHgxMDc4LCAweDllYzAsCisJMHgwMTdmLCAweGQxYWMsIDB4MDBjMCwgMHgyMmY2LCAweDAxN2UsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTksCisJMHgwMDA0LCAweDEwNzgsIDB4MjdlMiwgMHgwMTdmLCAweDAwNzgsIDB4MjMwNSwgMHgxNTdlLCAweDIwYTksCisJMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHgyMzAxLCAweDEwNzgsCisJMHg0MjM1LCAweDgxMDgsIDB4MDBmMCwgMHgyMmZiLCAweDE1N2YsIDB4MGM3ZiwgMHgwNDdmLCAweDBmN2UsCisJMHgyMDc5LCAweGE1YmUsIDB4NzgzYywgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgyMzE3LCAweDYwMjcsCisJMHgwMDA0LCAweDc4M2YsIDB4MDAwMCwgMHgyMDc5LCAweDAxNDAsIDB4NzgwMywgMHgwMDAwLCAweDBmN2YsCisJMHgyMDExLCAweDAwMDMsIDB4MTA3OCwgMHg2ZWYyLCAweDIwMTEsIDB4MDAwMiwgMHgxMDc4LCAweDZlZmMsCisJMHgxMDc4LCAweDZkZGEsIDB4MTA3OCwgMHg1OTVhLCAweDAzN2UsIDB4MjAxOSwgMHgwMDAwLCAweDEwNzgsCisJMHg2ZTZjLCAweDAzN2YsIDB4NjBlMywgMHgwMDAwLCAweDAxN2YsIDB4MjAwMSwgMHhhMzAwLCAweDIwMTQsCisJMHhhMjk2LCAweDAwMDQsIDB4MDBjMCwgMHgyMzNhLCAweGQxOWMsIDB4MDBjMCwgMHgyMzNhLCAweDYyMjgsCisJMHhjMjlkLCAweDYyMmEsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YTMyMSwgMHgyMDAzLCAweDAwMDAsCisJMHg2MDI3LCAweDAwMjAsIDB4ZDE5NCwgMHgwMDQwLCAweDI0MjYsIDB4MGY3ZSwgMHgyMDc5LCAweGE1YmUsCisJMHg3ODNjLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDIzNjYsIDB4MDE3ZSwgMHg2MDI3LCAweDAwMDQsCisJMHg3ODNmLCAweDAwMDAsIDB4MjA3OSwgMHgwMTQwLCAweDc4MDMsIDB4MTAwMCwgMHg3ODAzLCAweDAwMDAsCisJMHgyMDc5LCAweGE1YWIsIDB4NzgwNywgMHgwMDAwLCAweDc4MzMsIDB4MDAwMCwgMHgxMDc4LCAweDYxMDksCisJMHgxMDc4LCAweDYxZDMsIDB4MDE3ZiwgMHgwZjdmLCAweDAwNzgsIDB4MjQyNiwgMHgwZjdmLCAweDAxN2UsCisJMHgzOTAwLCAweGEwODIsIDB4YTZjZCwgMHgwMGM4LCAweDIzNzEsIDB4MDE3ZSwgMHgxMDc4LCAweDcyOGEsCisJMHgwMTdmLCAweDYyMjAsIDB4ZDJiNCwgMHgwMDQwLCAweDIzZGMsIDB4MTA3OCwgMHg1OTVhLCAweDEwNzgsCisJMHg2YzQxLCAweDYwMjcsIDB4MDAwNCwgMHgwZjdlLCAweDIwMTksIDB4YTViNCwgMHgyMzA0LCAweGEwN2QsCisJMHgwMDQwLCAweDIzYjIsIDB4NzgwNCwgMHhhMDg2LCAweDAwMzIsIDB4MDBjMCwgMHgyM2IyLCAweDBkN2UsCisJMHgwYzdlLCAweDBlN2UsIDB4MjA2OSwgMHgwMTQwLCAweDYxOGMsIDB4NjI4OCwgMHg3ODE4LCAweDYwOGUsCisJMHg3ODA4LCAweDYwOGEsIDB4NjA0MywgMHgwMDAyLCAweDIwMDEsIDB4MDAwMywgMHg4MDAxLCAweDAwYzAsCisJMHgyMzk2LCAweDYwNDMsIDB4MDAwMCwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDYxOGUsCisJMHg2MjhhLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDYxMDksIDB4NzgxMCwgMHgyMDcwLCAweDcwMzcsCisJMHgwMTAzLCAweDJmNjAsIDB4MTA3OCwgMHg3NTNkLCAweDBlN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBmN2YsCisJMHgwMTdmLCAweDAwN2MsIDB4MGY3ZiwgMHgwZDdlLCAweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweGEwODQsCisJMHg0MDAwLCAweDAwNDAsIDB4MjNiZiwgMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDBkN2YsCisJMHgwYzdlLCAweDIwNjEsIDB4YTVhYiwgMHg2MDI4LCAweGEwOWEsIDB4MDBjOCwgMHgwMGM4LCAweDIzY2YsCisJMHg4MDAwLCAweDYwMmEsIDB4MGM3ZiwgMHgxMDc4LCAweDZjMzMsIDB4MDA3OCwgMHgyNDI1LCAweDIwMTksCisJMHhhNWI0LCAweDIzMDQsIDB4YTA2NSwgMHgwMDQwLCAweDIzZDksIDB4MjAwOSwgMHgwMDI3LCAweDEwNzgsCisJMHg3NTZjLCAweDBjN2YsIDB4MDA3OCwgMHgyNDI1LCAweGQyYmMsIDB4MDA0MCwgMHgyNDI1LCAweDEwNzgsCisJMHg1OTY3LCAweDYwMTcsIDB4MDAxMCwgMHg2MDI3LCAweDAwMDQsIDB4MGQ3ZSwgMHgyMDY5LCAweDAxNDAsCisJMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDIzZjEsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsCisJMHgwMDAwLCAweDBkN2YsIDB4MGM3ZSwgMHgyMDYxLCAweGE1YWIsIDB4NjA0NCwgMHhhMDlhLCAweDAwYzgsCisJMHgwMGM4LCAweDI0MTQsIDB4ODAwMCwgMHg2MDQ2LCAweDYwM2MsIDB4MGM3ZiwgMHhhMDA1LCAweDAwNDAsCisJMHgyNDI1LCAweDIwMDksIDB4MDdkMCwgMHgxMDc4LCAweDU5NWYsIDB4YTA4MCwgMHgwMDA3LCAweDIwMDQsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgyNDEwLCAweDYwMTcsIDB4MDAxMiwgMHgwMDc4LCAweDI0MjUsCisJMHg2MDE3LCAweDAwMTYsIDB4MDA3OCwgMHgyNDI1LCAweDAzN2UsIDB4MjAxOSwgMHgwMDAxLCAweDEwNzgsCisJMHg2ZTZjLCAweDAzN2YsIDB4MjAxOSwgMHhhNWJhLCAweDIzMDQsIDB4YTA2NSwgMHgwMDQwLCAweDI0MjQsCisJMHgyMDA5LCAweDAwNGYsIDB4MTA3OCwgMHg3NTZjLCAweDBjN2YsIDB4MDE3ZiwgMHhkMTljLCAweDAwNDAsCisJMHgyNDdjLCAweDcwMzQsIDB4ZDBhYywgMHgwMGMwLCAweDI0NTcsIDB4MDE3ZSwgMHgxNTdlLCAweDYwMjcsCisJMHgwMDA4LCAweDYwMmYsIDB4MDAyMCwgMHgyMGE5LCAweDAwMGEsIDB4MDBmMCwgMHgyNDM1LCAweDYwMmYsCisJMHgwMDAwLCAweDYxNTAsIDB4YTE4NSwgMHgxNDAwLCAweDYwNTIsIDB4MjBhOSwgMHgwMzIwLCAweDAwZTAsCisJMHgyNDNmLCAweDIwOTEsIDB4NjAwMCwgMHg2MDIwLCAweGQwOWMsIDB4MDBjMCwgMHgyNDRlLCAweDE1N2YsCisJMHg2MTUyLCAweDAxN2YsIDB4NjAyNywgMHgwMDA4LCAweDAwNzgsIDB4MjQ3YywgMHgxMDc4LCAweDI1MGQsCisJMHgwMGYwLCAweDI0M2YsIDB4MTU3ZiwgMHg2MTUyLCAweDAxN2YsIDB4NjAyNywgMHgwMDA4LCAweDAxN2UsCisJMHg2MDI4LCAweGMwOWMsIDB4NjAyYSwgMHgyMDExLCAweDAwMDMsIDB4MTA3OCwgMHg2ZWYyLCAweDIwMTEsCisJMHgwMDAyLCAweDEwNzgsIDB4NmVmYywgMHgxMDc4LCAweDZkZGEsIDB4MTA3OCwgMHg1OTVhLCAweDAzN2UsCisJMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHg2ZTZjLCAweDAzN2YsIDB4NjBlMywgMHgwMDAwLCAweDEwNzgsCisJMHhhMjJhLCAweDEwNzgsIDB4YTI0OCwgMHgyMDAxLCAweGEzMDAsIDB4MjAwMywgMHgwMDA0LCAweDYwMjcsCisJMHgwMDA4LCAweDEwNzgsIDB4MTI0NiwgMHgwMTdmLCAweGExOGMsIDB4ZmZkMCwgMHg2MTI2LCAweDAwN2MsCisJMHgwMDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgwZTdlLCAweDBmN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGEzMDAsIDB4NzFiOCwgMHg3MGJhLCAweGExMTYsIDB4MDA0MCwgMHgyNGFlLCAweDgxZmYsCisJMHgwMDQwLCAweDI0OTgsIDB4MjAxMSwgMHg4MDExLCAweDEwNzgsIDB4MzU3OSwgMHgwMDc4LCAweDI0YWUsCisJMHgyMDExLCAweDgwMTIsIDB4MTA3OCwgMHgzNTc5LCAweDIwMDEsIDB4YTM3MSwgMHgyMDA0LCAweGQwZmMsCisJMHgwMGMwLCAweDI0YWUsIDB4MDM3ZSwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHgyMDE5LCAweDAwMjgsCisJMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHgyN2UyLCAweDBjN2YsIDB4MDM3ZiwgMHgxMjdmLCAweDBmN2YsCisJMHgwZTdmLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZjdlLCAweDAwN2UsCisJMHgwMjdlLCAweDIwNjEsIDB4MDEwMCwgMHhhMTkwLCAweDI0ZDEsIDB4MjIwNCwgMHg2MGYyLCAweDIwMTEsCisJMHgyNGRlLCAweDYwMDAsIDB4YTA4MiwgMHgwMDAzLCAweDAwYzgsIDB4MjRjYSwgMHgyMDAxLCAweDAwZmYsCisJMHgwMDc4LCAweDI0Y2IsIDB4MjIwNCwgMHg2MGVlLCAweDAyN2YsIDB4MDA3ZiwgMHgwZjdmLCAweDBjN2YsCisJMHgwMDdjLCAweDA4NDAsIDB4MDg0MCwgMHgwODQwLCAweDA1ODAsIDB4MDQyMCwgMHgwMzQ4LCAweDAyYzAsCisJMHgwMjU4LCAweDAyMTAsIDB4MDFhOCwgMHgwMWE4LCAweDAxYTgsIDB4MDFhOCwgMHgwMTQwLCAweDAwZjgsCisJMHgwMGQwLCAweDAwYjAsIDB4MDBhMCwgMHgyMDI4LCAweGExOGMsIDB4MDBmZiwgMHgyMTMwLCAweGEwOTQsCisJMHhmZjAwLCAweDAwYzAsIDB4MjRlZSwgMHg4MWZmLCAweDAwNDAsIDB4MjRmMiwgMHgxMDc4LCAweDU2MjMsCisJMHgwMDc4LCAweDI0ZjksIDB4YTA4MCwgMHgyOTNmLCAweDIwMGMsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMDA2LCAweDAwN2MsIDB4YTA4MCwgMHgyOTNmLCAweDIwMGMsIDB4YTE4YywgMHgwMGZmLCAweDAwN2MsCisJMHgwYzdlLCAweDIwNjEsIDB4YTMwMCwgMHg2MDMwLCAweDAwNDAsIDB4MjUwOSwgMHhjMDlkLCAweDAwNzgsCisJMHgyNTBhLCAweGMwOWMsIDB4NjAzMiwgMHgwYzdmLCAweDAwN2MsIDB4MDA3ZSwgMHgxNTdlLCAweDBmN2UsCisJMHgyMDc5LCAweDAxMDAsIDB4MjBhOSwgMHgwMDBhLCAweDc4NTQsIDB4ZDA4YywgMHgwMGMwLCAweDI1MWEsCisJMHgwMGYwLCAweDI1MTQsIDB4MGY3ZiwgMHgxNTdmLCAweDAwN2YsIDB4MDA3YywgMHgwYzdlLCAweDAwN2UsCisJMHgyMDYxLCAweDAxMDAsIDB4NjAzMCwgMHgwMDdlLCAweDYwNDgsIDB4MDA3ZSwgMHg2MGU0LCAweDAwN2UsCisJMHg2MGU4LCAweDAwN2UsIDB4NjA1MCwgMHgwMDdlLCAweDYwZjAsIDB4MDA3ZSwgMHg2MGVjLCAweDAwN2UsCisJMHg2MDBjLCAweDAwN2UsIDB4NjAwNCwgMHgwMDdlLCAweDYwMjgsIDB4MDA3ZSwgMHg2MGUwLCAweDAwN2UsCisJMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsCisJMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwN2YsIDB4NjBlMiwgMHgwMDdmLCAweDYwMmEsCisJMHgwMDdmLCAweDYwMDYsIDB4MDA3ZiwgMHg2MDBlLCAweDAwN2YsIDB4NjBlZSwgMHgwMDdmLCAweDYwZjIsCisJMHgwMDdmLCAweDYwNTIsIDB4MDA3ZiwgMHg2MGVhLCAweDAwN2YsIDB4NjBlNiwgMHgwMDdmLCAweDYwNGEsCisJMHgwMDdmLCAweDYwMzIsIDB4MDA3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MjU3ZCwgMHgyNTgxLCAweDI1ODUsCisJMHgyNThiLCAweDI1OTEsIDB4MjU5NywgMHgyNTlkLCAweDI1YTUsIDB4MjVhZCwgMHgyNWIzLCAweDI1YjksCisJMHgyNWMxLCAweDI1YzksIDB4MjVkMSwgMHgyNWQ5LCAweDI1ZTMsIDB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsCisJMHgyNWVkLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsCisJMHgyNWVkLCAweDI1ZWQsIDB4MjVlZCwgMHgyNWVkLCAweDI1ZWQsIDB4MTA3ZSwgMHgwMDdlLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMjAwLCAweDAwNzgsIDB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjAwLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIwZGUsIDB4MDA3OCwgMHgyNjA2LCAweDEwN2UsCisJMHgwMDdlLCAweDEwNzgsIDB4MjBkZSwgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMjAwLCAweDEwNzgsIDB4MjBkZSwgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMjAwLCAweDEwNzgsIDB4MjBkZSwgMHgwMDc4LCAweDI2MDYsIDB4MTA3ZSwgMHgwMDdlLCAweDEwNzgsCisJMHgyMTIzLCAweDAwNzgsIDB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMTIzLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIyMDAsIDB4MTA3OCwgMHgyMTIzLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIyMDAsIDB4MTA3OCwgMHgyMTIzLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIwZGUsIDB4MTA3OCwgMHgyMTIzLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIwZGUsIDB4MTA3OCwgMHgyMTIzLCAweDAwNzgsCisJMHgyNjA2LCAweDEwN2UsIDB4MDA3ZSwgMHgxMDc4LCAweDIyMDAsIDB4MTA3OCwgMHgyMGRlLCAweDEwNzgsCisJMHgyMTIzLCAweDAwNzgsIDB4MjYwNiwgMHgxMDdlLCAweDAwN2UsIDB4MTA3OCwgMHgyMjAwLCAweDEwNzgsCisJMHgyMGRlLCAweDEwNzgsIDB4MjEyMywgMHgwMDc4LCAweDI2MDYsIDB4MDAwNSwgMHgwMDc4LCAweDI1ZWQsCisJMHhiMDg0LCAweDAwM2MsIDB4ODAwNCwgMHg4MDA0LCAweDAwNzksIDB4MjVmNiwgMHgyNjA2LCAweDI1ODMsCisJMHgyNTg3LCAweDI1OGQsIDB4MjU5MywgMHgyNTk5LCAweDI1OWYsIDB4MjVhNywgMHgyNWFmLCAweDI1YjUsCisJMHgyNWJiLCAweDI1YzMsIDB4MjVjYiwgMHgyNWQzLCAweDI1ZGIsIDB4MjVlNSwgMHgwMDA4LCAweDI1ZjAsCisJMHgwMDdmLCAweDEwN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MGM3ZSwgMHgwMjdlLCAweDA0N2UsCisJMHgyMDIxLCAweDAwMDAsIDB4MTA3OCwgMHg0ODk3LCAweDAwYzAsIDB4MjcwNSwgMHg3MGM4LCAweGQwOWMsCisJMHgwMDQwLCAweDI2MjQsIDB4ZDA4NCwgMHgwMGMwLCAweDI2MjQsIDB4ZDBiYywgMHgwMGMwLCAweDI3MDUsCisJMHgxMDc4LCAweDI3MDksIDB4MDA3OCwgMHgyNzA1LCAweGQwOTQsIDB4MDA0MCwgMHgyNjJiLCAweDcwOTMsCisJMHhmZmZmLCAweDAwNzgsIDB4MjcwNSwgMHgyMDAxLCAweDAxMGMsIDB4MjAzYywgMHg3MjgwLCAweGQyODQsCisJMHgwMDQwLCAweDI2OTQsIDB4ZDI4YywgMHgwMGMwLCAweDI2OTQsIDB4MDM3ZSwgMHg3MzkwLCAweGEzOGUsCisJMHhmZmZmLCAweDAwNDAsIDB4MjYzZSwgMHg4M2ZmLCAweDAwYzAsIDB4MjY0MCwgMHgyMDE5LCAweDAwMDEsCisJMHg4MzE0LCAweGEyZTAsIDB4YTljMCwgMHgyYzA0LCAweGEzOGMsIDB4MDAwMSwgMHgwMDQwLCAweDI2NGQsCisJMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMDc4LCAweDI2NGYsIDB4YTA4NCwgMHgwMGZmLCAweGE3MGUsCisJMHgwMDQwLCAweDI2ODksIDB4YTA4ZSwgMHgwMDAwLCAweDAwNDAsIDB4MjY4OSwgMHhhMDhlLCAweDAwZmYsCisJMHgwMGMwLCAweDI2NjYsIDB4NzIzMCwgMHhkMjg0LCAweDAwYzAsIDB4MjY4ZiwgMHg3MjgwLCAweGMyOGQsCisJMHg3MjgyLCAweDcwOTMsIDB4ZmZmZiwgMHgwMzdmLCAweDAwNzgsIDB4MjY5NCwgMHgyMDA5LCAweDAwMDAsCisJMHgxMDc4LCAweDI0ZTMsIDB4MTA3OCwgMHg0NDk5LCAweDAwYzAsIDB4MjY4YywgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDI2ODMsIDB4NzAzMCwgMHhkMDhjLCAweDAwNDAsCisJMHgyNjdkLCAweDYwMDAsIDB4ZDBiYywgMHgwMDQwLCAweDI2ODMsIDB4MTA3OCwgMHgyNzFmLCAweDAwNDAsCisJMHgyNjhjLCAweDAwNzgsIDB4MjY4OSwgMHgxMDc4LCAweDI4NTcsIDB4MTA3OCwgMHgyNzRjLCAweDAwNDAsCisJMHgyNjhjLCAweDgzMTgsIDB4MDA3OCwgMHgyNjQwLCAweDczOTIsIDB4MDA3OCwgMHgyNjkxLCAweDcwOTMsCisJMHhmZmZmLCAweDAzN2YsIDB4MDA3OCwgMHgyNzA1LCAweGE3ODAsIDB4MjkzZiwgMHgyMDNjLCAweGE3YmMsCisJMHhmZjAwLCAweDg3M2YsIDB4MjA0MSwgMHgwMDdlLCAweDcwOTAsIDB4YTA5NiwgMHhmZmZmLCAweDAwYzAsCisJMHgyNmE2LCAweDIwMDksIDB4MDAwMCwgMHgyOGE4LCAweDAwNzgsIDB4MjZiMiwgMHhhODEyLCAweDAwNDgsCisJMHgyNmFlLCAweDIwMDgsIDB4YTgwMiwgMHgyMGE4LCAweDAwNzgsIDB4MjZiMiwgMHg3MDkzLCAweGZmZmYsCisJMHgwMDc4LCAweDI3MDUsIDB4MjcwMCwgMHgxNTdlLCAweDAxN2UsIDB4YTEwNiwgMHgwMDQwLCAweDI2ZjksCisJMHhjNDg0LCAweDEwNzgsIDB4NDUwMSwgMHgwMDQwLCAweDI2YzMsIDB4MTA3OCwgMHg0NDk5LCAweDAwYzAsCisJMHgyNzAyLCAweDAwNzgsIDB4MjZjNCwgMHhjNDg1LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDAwYzAsIDB4MjZkMywgMHg3MDMwLCAweGQwOGMsIDB4MDA0MCwgMHgyNmYxLCAweDYwMDAsCisJMHhkMGJjLCAweDAwYzAsIDB4MjZmMSwgMHg3MjgwLCAweGQyOGMsIDB4MDA0MCwgMHgyNmU5LCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDAwNDgsIDB4MjZmOSwgMHhkNDg0LCAweDAwYzAsCisJMHgyNmU1LCAweDEwNzgsIDB4NDRiYywgMHgwMDc4LCAweDI2ZTcsIDB4MTA3OCwgMHgyOTIxLCAweDAwNzgsCisJMHgyNmY5LCAweDEwNzgsIDB4Mjg1NywgMHgxMDc4LCAweDI3NGMsIDB4MDA0MCwgMHgyNzAyLCAweDAwNzgsCisJMHgyNmY5LCAweDEwNzgsIDB4MjhlYywgMHgwMDQwLCAweDI2ZjksIDB4MTA3OCwgMHgyNzFmLCAweDAwNDAsCisJMHgyNzAyLCAweDAxN2YsIDB4ODEwOCwgMHgxNTdmLCAweDAwZjAsIDB4MjZiMiwgMHg3MDkzLCAweGZmZmYsCisJMHgwMDc4LCAweDI3MDUsIDB4MDE3ZiwgMHgxNTdmLCAweDcxOTIsIDB4MDQ3ZiwgMHgwMjdmLCAweDBjN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4MDE3ZSwgMHg3MDkzLCAweDAwMDAsIDB4MjAwOSwgMHgwMDdlLCAweDEwNzgsCisJMHg0NDk5LCAweDAwYzAsIDB4MjcxYywgMHgxMDc4LCAweDI4NTcsIDB4MTA3OCwgMHgyNzRjLCAweDAwNDAsCisJMHgyNzFjLCAweDcwYzgsIDB4YzBiZCwgMHg3MGNhLCAweDAxN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDAxN2UsCisJMHgwNzdlLCAweDBkN2UsIDB4MGM3ZSwgMHgyYzY4LCAweDIwMDEsIDB4YTM1NiwgMHgyMDA0LCAweGEwODQsCisJMHgwMGZmLCAweDY4NDIsIDB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4Mjc0NywgMHgyZDAwLCAweDYwMWEsCisJMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgyMDAxLCAweDAwMDAsCisJMHgxMDc4LCAweDQ0M2YsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzA4YywgMHg4MDAwLCAweDcwOGUsCisJMHgxMjdmLCAweDIwMDksIDB4MDAwNCwgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDBjN2YsCisJMHgwZDdmLCAweDA3N2YsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MDc3ZSwgMHgwZDdlLCAweDBjN2UsCisJMHgyYzY4LCAweDIwMDEsIDB4YTM1NiwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDEwNzgsCisJMHg3NGQ3LCAweDAwNDAsIDB4Mjc4NSwgMHgyZDAwLCAweDYwMWEsIDB4NjgwMCwgMHhjMGM0LCAweDY4MDIsCisJMHg2OGEwLCAweGEwODYsIDB4MDA3ZSwgMHgwMDQwLCAweDI3NmUsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgyNzZlLCAweDEwNzgsIDB4MjgxMywgMHg2MDFmLCAweDAwMDEsCisJMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NDJiLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ0M2YsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDhjLCAweDgwMDAsIDB4NzA4ZSwgMHgxMjdmLCAweDIwMDksCisJMHgwMDAyLCAweDEwNzgsIDB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MGM3ZiwgMHgwZDdmLCAweDA3N2YsCisJMHgwMTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwMjdlLCAweDIwMDksIDB4MDA4MCwgMHgxMDc4LCAweDQ0OTksCisJMHgwMGMwLCAweDI3OTgsIDB4MTA3OCwgMHgyNzliLCAweDAwNDAsIDB4Mjc5OCwgMHg3MGNmLCAweGZmZmYsCisJMHgwMjdmLCAweDBjN2YsIDB4MDA3YywgMHgwMTdlLCAweDA3N2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDJjNjgsCisJMHgxMDc4LCAweDc0ZDcsIDB4MDA0MCwgMHgyN2JkLCAweDJkMDAsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDEsCisJMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NDJiLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ0M2YsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MGQwLCAweDgwMDAsIDB4NzBkMiwgMHgxMjdmLCAweDIwMDksCisJMHgwMDAyLCAweDEwNzgsIDB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MGM3ZiwgMHgwZDdmLCAweDA3N2YsCisJMHgwMTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksCisJMHgwMDdmLCAweDEwNzgsIDB4NDQ5OSwgMHgwMGMwLCAweDI3ZGUsIDB4MmM2OCwgMHgxMDc4LCAweDc0ZDcsCisJMHgwMDQwLCAweDI3ZGUsIDB4MmQwMCwgMHg2MDFhLCAweDYzMTIsIDB4NjAxZiwgMHgwMDAxLCAweDYyMGEsCisJMHgyMDA5LCAweDAwMjIsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBkN2YsCisJMHgwYzdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDM3ZSwgMHgwMjdlLCAweDEwNzgsCisJMHg1ZDYwLCAweDEwNzgsIDB4NWQwMiwgMHgxMDc4LCAweDdkZGYsIDB4MjEzMCwgMHg4MWZmLCAweDAwNDAsCisJMHgyN2Y3LCAweDIwYTksIDB4MDA3ZSwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHgyN2ZiLCAweDIwYTksCisJMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDI4MDQsCisJMHgxMDc4LCAweDQ3MWIsIDB4MTA3OCwgMHg0MjM1LCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLCAweDI3ZmIsCisJMHg4NmZmLCAweDAwYzAsIDB4MjgwZCwgMHgxMDc4LCAweDExOWIsIDB4MDI3ZiwgMHgwMzdmLCAweDA2N2YsCisJMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDBjN2UsIDB4MDM3ZSwgMHgwMjdlLCAweDAxN2UsCisJMHg2MjE4LCAweDIyNzAsIDB4NzJhMCwgMHgwMjdlLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVkNTMsCisJMHgwNzdlLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDVjNzgsIDB4MmMwOCwgMHgxMDc4LCAweDljMzgsCisJMHgwNzdmLCAweDAxN2YsIDB4MmU2MCwgMHgxMDc4LCAweDQ3MWIsIDB4NjIxMCwgMHg2MzE0LCAweDEwNzgsCisJMHg0MjM1LCAweDYyMTIsIDB4NjMxNiwgMHgwMTdmLCAweDAyN2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MDA3ZSwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGQwYmMsCisJMHgwMGMwLCAweDI4NGQsIDB4MjA3MSwgMHhhMzAwLCAweDcwOGMsIDB4YTAwNSwgMHgwMDQwLCAweDI4NGEsCisJMHg4MDAxLCAweDcwOGUsIDB4MDA3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MjA3MSwgMHhhMzAwLCAweDcwZDAsCisJMHhhMDA1LCAweDAwNDAsIDB4Mjg0YSwgMHg4MDAxLCAweDcwZDIsIDB4MDA3OCwgMHgyODRhLCAweDYwMDAsCisJMHhjMDhjLCAweDYwMDIsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MGM3ZSwgMHgwMzdlLCAweDAyN2UsCisJMHgwMTdlLCAweDE1N2UsIDB4MjE3OCwgMHg4MWZmLCAweDAwYzAsIDB4Mjg2YSwgMHgyMGE5LCAweDAwMDEsCisJMHgwMDc4LCAweDI4ODUsIDB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMDQwLCAweDI4ODEsCisJMHhkMGE0LCAweDAwNDAsIDB4Mjg4MSwgMHgwNDdlLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMjQsCisJMHhhNGE0LCAweDAwZmYsIDB4ODQyNywgMHhhMDA2LCAweDIwMDksIDB4MDAyZCwgMHgxMDc4LCAweDllYzAsCisJMHgwNDdmLCAweDIwYTksIDB4MDBmZiwgMHgyMDExLCAweDAwMDAsIDB4MDI3ZSwgMHhhMjhlLCAweDAwN2UsCisJMHgwMDQwLCAweDI4YzksIDB4YTI4ZSwgMHgwMDdmLCAweDAwNDAsIDB4MjhjOSwgMHhhMjhlLCAweDAwODAsCisJMHgwMDQwLCAweDI4YzksIDB4YTI4OCwgMHhhNDM0LCAweDIxMGMsIDB4ODFmZiwgMHgwMDQwLCAweDI4YzksCisJMHg4ZmZmLCAweDEwNDAsIDB4MjhkNSwgMHgwYzdlLCAweDIxNjAsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsCisJMHg0OGEyLCAweDBjN2YsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLCAweDIwMzksCisJMHgwMDAwLCAweDEwNzgsIDB4NWM3OCwgMHgwYzdlLCAweDAyN2UsIDB4MjE2MCwgMHg2MjA0LCAweGEyOTQsCisJMHgwMGZmLCAweGEyODYsIDB4MDAwNiwgMHgwMGMwLCAweDI4YjksIDB4NjAwNywgMHgwNDA0LCAweDAwNzgsCisJMHgyOGJlLCAweDIwMDEsIDB4MDAwNCwgMHg4MDA3LCAweGEyMTUsIDB4NjIwNiwgMHgwMjdmLCAweDBjN2YsCisJMHgwMTdlLCAweDJjMDgsIDB4MTA3OCwgMHg5YzM4LCAweDAxN2YsIDB4MDc3ZiwgMHgyMTYwLCAweDEwNzgsCisJMHg0NzFiLCAweDAyN2YsIDB4ODIxMCwgMHgwMGYwLCAweDI4ODUsIDB4MTU3ZiwgMHgwMTdmLCAweDAyN2YsCisJMHgwMzdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MDQ3ZSwgMHgwMjdlLCAweDAxN2UsCisJMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGM0LCAweDAwNDAsIDB4MjhlOCwgMHhkMGE0LCAweDAwNDAsCisJMHgyOGU4LCAweGEwMDYsIDB4MjIyMCwgMHg4NDI3LCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweDllYzAsCisJMHgwMTdmLCAweDAyN2YsIDB4MDQ3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgwMzdlLCAweDBjN2UsCisJMHg3MjgwLCAweDgyZmYsIDB4MDA0MCwgMHgyOTFhLCAweGEyOTAsIDB4YTM1MiwgMHgyMjE0LCAweGQyYWMsCisJMHgwMGMwLCAweDI5MWEsIDB4MjEwMCwgMHgxMDc4LCAweDI0ZmEsIDB4ODFmZiwgMHgwMDQwLCAweDI5MWMsCisJMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHhhMmUwLCAweGE5YzAsIDB4MmMwNCwgMHhkMzg0LCAweDAwNDAsCisJMHgyOTBlLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDAwNzgsIDB4MjkxMCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMTE2LCAweDAwNDAsIDB4MjkxYywgMHhhMDk2LCAweDAwZmYsIDB4MDA0MCwgMHgyOTFhLCAweDgzMTgsCisJMHgwMDc4LCAweDI5MDIsIDB4YTA4NSwgMHgwMDAxLCAweDBjN2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsCisJMHgwMDdjLCAweDAxN2UsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHhhMTgwLCAweGE0MzQsCisJMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHgyOTNiLCAweDAxN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDhlYzAsCisJMHgwMTdmLCAweDEwNDAsIDB4MTMyOCwgMHg2MTFhLCAweDEwNzgsIDB4MjgxMywgMHgxMDc4LCAweDc1M2QsCisJMHgwMTdmLCAweDEwNzgsIDB4NDRiYywgMHgxMjdmLCAweDBjN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDdlZWYsCisJMHg3ZGU4LCAweDdjZTQsIDB4ODBlMiwgMHg3YmUxLCAweDgwZTAsIDB4ODBkYywgMHg4MGRhLCAweDdhZDksCisJMHg4MGQ2LCAweDgwZDUsIDB4ODBkNCwgMHg4MGQzLCAweDgwZDIsIDB4ODBkMSwgMHg3OWNlLCAweDc4Y2QsCisJMHg4MGNjLCAweDgwY2IsIDB4ODBjYSwgMHg4MGM5LCAweDgwYzcsIDB4ODBjNiwgMHg3N2M1LCAweDc2YzMsCisJMHg4MGJjLCAweDgwYmEsIDB4NzViOSwgMHg4MGI2LCAweDc0YjUsIDB4NzNiNCwgMHg3MmIzLCAweDgwYjIsCisJMHg4MGIxLCAweDgwYWUsIDB4NzFhZCwgMHg4MGFjLCAweDcwYWIsIDB4NmZhYSwgMHg2ZWE5LCAweDgwYTcsCisJMHg2ZGE2LCAweDZjYTUsIDB4NmJhMywgMHg2YTlmLCAweDY5OWUsIDB4Njg5ZCwgMHg4MDliLCAweDgwOTgsCisJMHg2Nzk3LCAweDY2OTAsIDB4NjU4ZiwgMHg2NDg4LCAweDYzODQsIDB4NjI4MiwgMHg4MDgxLCAweDgwODAsCisJMHg2MTdjLCAweDYwN2EsIDB4ODA3OSwgMHg1Zjc2LCAweDgwNzUsIDB4ODA3NCwgMHg4MDczLCAweDgwNzIsCisJMHg4MDcxLCAweDgwNmUsIDB4NWU2ZCwgMHg4MDZjLCAweDVkNmIsIDB4NWM2YSwgMHg1YjY5LCAweDgwNjcsCisJMHg1YTY2LCAweDU5NjUsIDB4NTg2MywgMHg1NzVjLCAweDU2NWEsIDB4NTU1OSwgMHg4MDU2LCAweDgwNTUsCisJMHg1NDU0LCAweDUzNTMsIDB4NTI1MiwgMHg1MTUxLCAweDUwNGUsIDB4NGY0ZCwgMHg4MDRjLCAweDgwNGIsCisJMHg0ZTRhLCAweDRkNDksIDB4ODA0NywgMHg0YzQ2LCAweDgwNDUsIDB4ODA0MywgMHg4MDNjLCAweDgwM2EsCisJMHg4MDM5LCAweDgwMzYsIDB4NGIzNSwgMHg4MDM0LCAweDRhMzMsIDB4NDkzMiwgMHg0ODMxLCAweDgwMmUsCisJMHg0NzJkLCAweDQ2MmMsIDB4NDUyYiwgMHg0NDJhLCAweDQzMjksIDB4NDIyNywgMHg4MDI2LCAweDgwMjUsCisJMHg0MTIzLCAweDQwMWYsIDB4M2YxZSwgMHgzZTFkLCAweDNkMWIsIDB4M2MxOCwgMHg4MDE3LCAweDgwMTAsCisJMHgzYjBmLCAweDNhMDgsIDB4ODAwNCwgMHgzOTAyLCAweDgwMDEsIDB4ODAwMCwgMHg4MDAwLCAweDM4MDAsCisJMHgzNzAwLCAweDM2MDAsIDB4ODAwMCwgMHgzNTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDM0MDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzMzAwLCAweDMyMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzMTAwLCAweDMwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4MmYwMCwgMHg4MDAwLCAweDJlMDAsIDB4MmQwMCwgMHgyYzAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4MmIwMCwgMHg4MDAwLCAweDJhMDAsIDB4MjkwMCwgMHgyODAwLCAweDgwMDAsCisJMHgyNzAwLCAweDI2MDAsIDB4MjUwMCwgMHgyNDAwLCAweDIzMDAsIDB4MjIwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgyMTAwLCAweDIwMDAsIDB4MWYwMCwgMHgxZTAwLCAweDFkMDAsIDB4MWMwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgxYjAwLCAweDFhMDAsIDB4ODAwMCwgMHgxOTAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4MTgwMCwgMHg4MDAwLCAweDE3MDAsIDB4MTYwMCwgMHgxNTAwLCAweDgwMDAsCisJMHgxNDAwLCAweDEzMDAsIDB4MTIwMCwgMHgxMTAwLCAweDEwMDAsIDB4MGYwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgwZTAwLCAweDBkMDAsIDB4MGMwMCwgMHgwYjAwLCAweDBhMDAsIDB4MDkwMCwgMHg4MDAwLCAweDgwMDAsCisJMHgwODAwLCAweDA3MDAsIDB4ODAwMCwgMHgwNjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDA1MDAsCisJMHgwNDAwLCAweDAzMDAsIDB4ODAwMCwgMHgwMjAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDAxMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDIwNzEsCisJMHhhMzgxLCAweDcwMDMsIDB4MDAwMiwgMHhhMDA2LCAweDcwMTIsIDB4NzAxNiwgMHg3MDNhLCAweDcwM2UsCisJMHg3MDMzLCAweGEzOTEsIDB4NzAzNywgMHhhMzkxLCAweDcwMDcsIDB4MDAwMSwgMHgyMDYxLCAweGEzZDEsCisJMHg2MDAzLCAweDAwMDIsIDB4MDA3YywgMHgwMDkwLCAweDJhNjYsIDB4MDA2OCwgMHgyYTY2LCAweDIwNzEsCisJMHhhMzgxLCAweDJiNzgsIDB4NzgxOCwgMHhkMDg0LCAweDAwYzAsIDB4MmE2NiwgMHgyYTYwLCAweDc4MjAsCisJMHhhMDhlLCAweDAwNjksIDB4MDBjMCwgMHgyYjU2LCAweDAwNzksIDB4MmFlYSwgMHgwMDdjLCAweDIwNzEsCisJMHhhMzgxLCAweDcwMDQsIDB4MDA3OSwgMHgyYTZjLCAweDJhNzAsIDB4MmE3MSwgMHgyYTdiLCAweDJhOGQsCisJMHgwMDdjLCAweDAwOTAsIDB4MmE3YSwgMHgwMDY4LCAweDJhN2EsIDB4MmI3OCwgMHg3ODE4LCAweGQwODQsCisJMHgwMDQwLCAweDJhOTksIDB4MDA3YywgMHgyYjc4LCAweDIwNjEsIDB4YTNkMSwgMHg2MDA4LCAweGEwOGUsCisJMHgwMTAwLCAweDAwNDAsIDB4MmE4OCwgMHhhMDg2LCAweDAyMDAsIDB4MDA0MCwgMHgyYjRlLCAweDAwN2MsCisJMHg3MDE0LCAweDIwNjgsIDB4MmE2MCwgMHg3MDE4LCAweDAwN2EsIDB4NzAxMCwgMHgyMDY4LCAweDY4MzQsCisJMHhhMDg2LCAweDAxMDMsIDB4MDA0MCwgMHgyYTk1LCAweDAwN2MsIDB4MmE2MCwgMHgyYjc4LCAweDcwMTgsCisJMHgwMDdhLCAweDJhNjAsIDB4NzgyMCwgMHhhMDhhLCAweDAwNDAsIDB4MDBjOCwgMHgyYWEyLCAweDYxYjgsCisJMHgwMDc5LCAweDJhYWEsIDB4MjEwMCwgMHhhMDhhLCAweDAwM2YsIDB4MDBjOCwgMHgyYjRhLCAweDYxYjgsCisJMHgwMDc5LCAweDJhZWEsIDB4MmIyYywgMHgyYjVlLCAweDJiNjYsIDB4MmI2YSwgMHgyYjcyLCAweDJiNzgsCisJMHgyYjdjLCAweDJiODgsIDB4MmI4YywgMHgyYjk2LCAweDJiOWEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjllLCAweDJiNGEsIDB4MmJhZSwgMHgyYmM1LCAweDJiZGMsIDB4MmM1OCwgMHgyYzVkLCAweDJjOGEsCisJMHgyY2U0LCAweDJjZjUsIDB4MmQxMywgMHgyZDU0LCAweDJkNWUsIDB4MmQ2YiwgMHgyZDdlLCAweDJkOWQsCisJMHgyZGE2LCAweDJkZTMsIDB4MmRlOSwgMHgyYjRhLCAweDJlMDUsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDJiNGEsIDB4MmUwYywgMHgyZTE2LCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJlMWUsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDJiNGEsIDB4MmUzMCwgMHgyZTQ3LCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDJiNGEsIDB4MmU1OSwgMHgyZWIwLCAweDJmMGUsIDB4MmYxZiwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDM4ZjEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDJiNGEsIDB4MmI5NiwgMHgyYjlhLCAweDJmMzYsIDB4MmI0YSwgMHgyZjQzLCAweDM5N2QsCisJMHgzOWRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsCisJMHgyYjRhLCAweDJiNGEsIDB4MmY5MCwgMHgzMGM1LCAweDMwZTEsIDB4MzBlZCwgMHgzMTUwLCAweDMxYTksCisJMHgzMWI0LCAweDMxZjMsIDB4MzIwMiwgMHgzMjExLCAweDMyMTQsIDB4MmY0NywgMHgzMjM4LCAweDMyODQsCisJMHgzMjkxLCAweDMzYTIsIDB4MzRjZCwgMHgzNGY3LCAweDM2MDQsIDB4MzYxNCwgMHgzNjIxLCAweDM2NWIsCisJMHgzNzJhLCAweDJiNGEsIDB4MmI0YSwgMHgyYjRhLCAweDJiNGEsIDB4Mzc5MiwgMHgzN2FlLCAweDM4MjgsCisJMHgzOGUyLCAweDcxM2MsIDB4MDA3OCwgMHgyYjJjLCAweDIwMjEsIDB4NDAwMCwgMHgxMDc4LCAweDM1NTMsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDY4LCAweDJiMzksIDB4NzgxOCwgMHhkMDg0LCAweDAwNDAsCisJMHgyYjNjLCAweDEyN2YsIDB4MDA3OCwgMHgyYjMwLCAweDdjMjIsIDB4NzkyNiwgMHg3YTJhLCAweDdiMmUsCisJMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDcwMDcsIDB4MDAwMSwgMHgyMDkxLCAweDUwMDAsCisJMHgxMjdmLCAweDAwN2MsIDB4MjAyMSwgMHg0MDAxLCAweDAwNzgsIDB4MmIyZSwgMHgyMDIxLCAweDQwMDIsCisJMHgwMDc4LCAweDJiMmUsIDB4MjAyMSwgMHg0MDAzLCAweDAwNzgsIDB4MmIyZSwgMHgyMDIxLCAweDQwMDUsCisJMHgwMDc4LCAweDJiMmUsIDB4MjAyMSwgMHg0MDA2LCAweDAwNzgsIDB4MmIyZSwgMHhhMDJlLCAweDI1MjAsCisJMHg3YjI4LCAweDdhMmMsIDB4NzgyNCwgMHg3OTMwLCAweDAwNzgsIDB4MzU2MiwgMHg3ODIzLCAweDAwMDQsCisJMHg3ODI0LCAweDAwN2EsIDB4YTAyZSwgMHgyNTIwLCAweDdiMjgsIDB4N2EyYywgMHg3ODI0LCAweDc5MzAsCisJMHgwMDc4LCAweDM1NjYsIDB4NzkyNCwgMHg3ODI4LCAweDIxMTQsIDB4MjAwYSwgMHgwMDc4LCAweDJiMmMsCisJMHg3OTI0LCAweDIxMTQsIDB4MDA3OCwgMHgyYjJjLCAweDIwOTksIDB4MDAwOSwgMHgyMGExLCAweDAwMDksCisJMHgyMGE5LCAweDAwMDcsIDB4NTNhMywgMHg3OTI0LCAweDdhMjgsIDB4N2IyYywgMHgwMDc4LCAweDJiMmMsCisJMHg3ODI0LCAweDIwNjAsIDB4MDA3OCwgMHgyYmEwLCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAwMTMsCisJMHgyMDE5LCAweDAwMTAsIDB4NzgzYiwgMHgwMDE3LCAweDAwNzgsIDB4MmIyYywgMHg3ZDM4LCAweDdjM2MsCisJMHgwMDc4LCAweDJiNjAsIDB4N2QzOCwgMHg3YzNjLCAweDAwNzgsIDB4MmI2YywgMHgyMDYxLCAweDEwMDAsCisJMHg2MTBjLCAweGEwMDYsIDB4MmMxNCwgMHhhMjAwLCAweDhjNjAsIDB4ODEwOSwgMHgwMGMwLCAweDJiYTIsCisJMHgyMDEwLCAweGEwMDUsIDB4MDA0MCwgMHgyYjJjLCAweDAwNzgsIDB4MmI1MiwgMHgyMDY5LCAweGEzNTEsCisJMHg3ODI0LCAweDc5MzAsIDB4YTExYSwgMHgwMGM4LCAweDJiNWEsIDB4ODAxOSwgMHgwMDQwLCAweDJiNWEsCisJMHg2ODRhLCAweDY5NDIsIDB4NzgyYywgMHg2ODUyLCAweDc4MjgsIDB4Njg1NiwgMHhhMDA2LCAweDY4NWEsCisJMHg2ODVlLCAweDEwNzgsIDB4NGRiZCwgMHgwMDc4LCAweDJiMmMsIDB4MjA2OSwgMHhhMzUxLCAweDc4MjQsCisJMHg3OTM0LCAweGExMWEsIDB4MDBjOCwgMHgyYjVhLCAweDgwMTksIDB4MDA0MCwgMHgyYjVhLCAweDY4NGUsCisJMHg2OTQ2LCAweDc4MmMsIDB4Njg2MiwgMHg3ODI4LCAweDY4NjYsIDB4YTAwNiwgMHg2ODZhLCAweDY4NmUsCisJMHgxMDc4LCAweDQ5NGQsIDB4MDA3OCwgMHgyYjJjLCAweGEwMmUsIDB4MjUyMCwgMHg4MWZmLCAweDAwYzAsCisJMHgyYjU2LCAweDc5MjQsIDB4N2IyOCwgMHg3YTJjLCAweDIwYTksIDB4MDAwNSwgMHgyMGExLCAweGEzODgsCisJMHg0MWExLCAweDEwNzgsIDB4MzUxOCwgMHgwMDQwLCAweDJiNTYsIDB4MjAwOSwgMHgwMDIwLCAweDEwNzgsCisJMHgzNTYyLCAweDcwMWIsIDB4MmJmNCwgMHgwMDdjLCAweDY4MzQsIDB4MjAwOCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDk2LCAweDAwMTEsIDB4MDA0MCwgMHgyYzAwLCAweGEwOTYsIDB4MDAxOSwgMHgwMGMwLCAweDJiNTYsCisJMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLCAweDJiNTYsIDB4NzEwZSwgMHg3MDBjLCAweDgwMDEsCisJMHgwMDQwLCAweDJjMzEsIDB4NzAwZSwgMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyYjU2LCAweDIwMDksCisJMHgwMDIwLCAweDIwNjEsIDB4YTNkMSwgMHg2MjI0LCAweDYzMjgsIDB4NjQyYywgMHg2NTMwLCAweGEyOTAsCisJMHgwMDQwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLCAweDEwNzgsCisJMHgzNTYyLCAweDcwMWIsIDB4MmMyNCwgMHgwMDdjLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOTYsCisJMHgwMDAyLCAweDAwNDAsIDB4MmMyZiwgMHhhMDk2LCAweDAwMGEsIDB4MDBjMCwgMHgyYjU2LCAweDAwNzgsCisJMHgyYzA2LCAweDcwMTAsIDB4MjA2OCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDQzNmUsCisJMHgwMGMwLCAweDJjM2YsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MmM0MSwgMHgwMDdjLCAweDEwNzgsCisJMHg0YTYwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHgyMDk5LCAweGEzODgsCisJMHg1MzBhLCAweDIxMDAsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksCisJMHgwMDAwLCAweGFkODAsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MTI3ZiwgMHgwMDc4LCAweDM1NjYsCisJMHg2MWEwLCAweDc4MjQsIDB4NjBhMiwgMHgwMDc4LCAweDJiMmMsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjMsCisJMHg0MDAwLCAweDc4MjcsIDB4NDk1MywgMHg3ODJiLCAweDUwMjAsIDB4NzgyZiwgMHgyMDIwLCAweDIwMDksCisJMHgwMTdmLCAweDIxMDQsIDB4NzgzMiwgMHgzZjAwLCAweDc4MzYsIDB4MjA2MSwgMHgwMTAwLCAweDYyMDAsCisJMHgyMDYxLCAweDAyMDAsIDB4NjAzYywgMHg4MDA3LCAweGEyMDUsIDB4NzgzYSwgMHgyMDA5LCAweDA0ZmQsCisJMHgyMTA0LCAweDc4M2UsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsCisJMHgyMDcxLCAweDAwMTAsIDB4MjBjMSwgMHgwMGYwLCAweGEwOGEsIDB4MDAwMywgMHgwMGM4LCAweDA0MjcsCisJMHgwMDc4LCAweDA0MjMsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsCisJMHgwMGZmLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDJiNWEsIDB4N2UzOCwgMHhhNjg0LCAweDNmZmYsCisJMHhhMDgyLCAweDQwMDAsIDB4MDA0OCwgMHgyYzllLCAweDAwNzgsIDB4MmI1YSwgMHg3YzI4LCAweDdkMmMsCisJMHgxMDc4LCAweDQ2ZDYsIDB4ZDI4YywgMHgwMGMwLCAweDJjYTksIDB4MTA3OCwgMHg0NjZhLCAweDAwNzgsCisJMHgyY2FiLCAweDEwNzgsIDB4NDZhNCwgMHgwMGMwLCAweDJjZDUsIDB4MjA2MSwgMHhhYTAwLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgyY2MzLCAweDYwMTAsCisJMHhhMDZkLCAweDAwNDAsIDB4MmNjMywgMHg2ODNjLCAweGE0MDYsIDB4MDBjMCwgMHgyY2MzLCAweDY4NDAsCisJMHhhNTA2LCAweDAwNDAsIDB4MmNjZSwgMHgxMjdmLCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGEzMTUsCisJMHgyMDA0LCAweGFjMDIsIDB4MDBjOCwgMHgyYjU2LCAweDAwNzgsIDB4MmNhZiwgMHgxMDc4LCAweDg3NTgsCisJMHgxMjdmLCAweDAwNDAsIDB4MmI1NiwgMHgwMDc4LCAweDJiMmMsIDB4YTAwZSwgMHgyMDAxLCAweDAwMDUsCisJMHgxMDc4LCAweDRhNjAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg4Y2MwLCAweDEwNzgsCisJMHg0OTgyLCAweDEyN2YsIDB4MDA3OCwgMHgyYjJjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsCisJMHgzNTMwLCAweDAwNDAsIDB4MmI1YSwgMHgxMDc4LCAweDQ1YTcsIDB4MDA0MCwgMHgyYjU2LCAweDEwNzgsCisJMHg0NmU0LCAweDAwNDAsIDB4MmI1NiwgMHgwMDc4LCAweDJiMmMsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsCisJMHgxMDc4LCAweDM1NDIsIDB4MDA0MCwgMHgyYjVhLCAweDEwNzgsIDB4NDc1ZiwgMHgwMDQwLCAweDJiNTYsCisJMHgyMDE5LCAweDAwMDUsIDB4MTA3OCwgMHg0NzA1LCAweDAwNDAsIDB4MmI1NiwgMHg3ODI4LCAweGEwOGEsCisJMHgxMDAwLCAweDAwYzgsIDB4MmI1YSwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDEwNzgsCisJMHg1OGUxLCAweDAwNzgsIDB4MmIyYywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg4MWZmLCAweDAwNDAsCisJMHgyZDFkLCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LCAweDJkNGUsIDB4MjAyOSwgMHgwMGZmLCAweDY0NGMsCisJMHgyNDAwLCAweGE1MDYsIDB4MDA0MCwgMHgyZDQ4LCAweDI1MDgsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsCisJMHgyZDQ4LCAweDEwNzgsIDB4NDc1ZiwgMHgwMGMwLCAweDJkMzMsIDB4MjAwOSwgMHgwMDAyLCAweDYyYTgsCisJMHgyNTE4LCAweDAwNzgsIDB4MmQ0ZSwgMHgyMDE5LCAweDAwMDQsIDB4MTA3OCwgMHg0NzA1LCAweDAwYzAsCisJMHgyZDNkLCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDJkNGUsIDB4NzgyNCwgMHhhMDhhLCAweDEwMDAsCisJMHgwMGM4LCAweDJkNTEsIDB4ODAwMywgMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgxMDc4LCAweDU4ZTEsCisJMHg4NTI5LCAweDAwYzgsIDB4MmQyMCwgMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHgxMjdmLCAweDAwNzgsCisJMHgyYjU2LCAweDEyN2YsIDB4MDA3OCwgMHgyYjVhLCAweDEwNzgsIDB4MzUzMCwgMHgwMDQwLCAweDJiNWEsCisJMHgxMDc4LCAweDQ2MWIsIDB4MTA3OCwgMHg0NmQ2LCAweDAwNzgsIDB4MmIyYywgMHg4MWZmLCAweDAwYzAsCisJMHgyYjU2LCAweDEwNzgsIDB4MzUzMCwgMHgwMDQwLCAweDJiNWEsIDB4MTA3OCwgMHg0NjBhLCAweDEwNzgsCisJMHg0NmQ2LCAweDAwNzgsIDB4MmIyYywgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LCAweDM1MzAsCisJMHgwMDQwLCAweDJiNWEsIDB4MTA3OCwgMHg0NmE3LCAweDAwNDAsIDB4MmI1NiwgMHgxMDc4LCAweDQzYzEsCisJMHgxMDc4LCAweDQ2NjMsIDB4MTA3OCwgMHg0NmQ2LCAweDAwNzgsIDB4MmIyYywgMHgxMDc4LCAweDM1MzAsCisJMHgwMDQwLCAweDJiNWEsIDB4MTA3OCwgMHg0NWE3LCAweDAwNDAsIDB4MmI1NiwgMHg2MmEwLCAweDIwMTksCisJMHgwMDA1LCAweDBjN2UsIDB4MTA3OCwgMHg0NzFiLCAweDBjN2YsIDB4MTA3OCwgMHg1ZDUzLCAweDA3N2UsCisJMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg1Yzc4LCAweDIwMDksIDB4MDAwMCwgMHgxMDc4LCAweDljMzgsCisJMHgwNzdmLCAweDEwNzgsIDB4NDZkNiwgMHgwMDc4LCAweDJiMmMsIDB4MTA3OCwgMHgzNTMwLCAweDAwNDAsCisJMHgyYjVhLCAweDEwNzgsIDB4NDZkNiwgMHgyMjA4LCAweDAwNzgsIDB4MmIyYywgMHgxNTdlLCAweDBkN2UsCisJMHgwZTdlLCAweDIwNjksIDB4YTQxMywgMHg2ODEwLCAweDY5MTQsIDB4YTEwYSwgMHgwMGM4LCAweDJkYjIsCisJMHgyMDA5LCAweDAwMDAsIDB4NjgxNiwgMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHgwMDAwLCAweDIwYTksCisJMHgwMGZmLCAweDIwNjksIDB4YTQzNCwgMHgyZDA0LCAweGEwNzUsIDB4MDA0MCwgMHgyZGM3LCAweDcwNGMsCisJMHgxMDc4LCAweDJkZDEsIDB4YTIxMCwgMHg3MDgwLCAweDEwNzgsIDB4MmRkMSwgMHhhMzE4LCAweDhkNjgsCisJMHgwMGYwLCAweDJkYmIsIDB4MjMwMCwgMHhhMjE4LCAweDBlN2YsIDB4MGQ3ZiwgMHgxNTdmLCAweDAwNzgsCisJMHgyYjJjLCAweDBmN2UsIDB4MDE3ZSwgMHhhMDdkLCAweDAwNDAsIDB4MmRlMCwgMHgyMDAxLCAweDAwMDAsCisJMHg4MDAwLCAweDJmMGMsIDB4ODFmZiwgMHgwMDQwLCAweDJkZTAsIDB4MjE3OCwgMHgwMDc4LCAweDJkZDgsCisJMHgwMTdmLCAweDBmN2YsIDB4MDA3YywgMHgyMDY5LCAweGE0MTMsIDB4NjkxMCwgMHg2MmE0LCAweDAwNzgsCisJMHgyYjJjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDYxNGMsIDB4YTE5MCwgMHgyOTNmLCAweDIyMTQsCisJMHhhMjk0LCAweDAwZmYsIDB4NjA2YywgMHhhMDg0LCAweGZmMDAsIDB4YTIxNSwgMHg2MzY4LCAweDY3YzgsCisJMHhkNzljLCAweDAwNDAsIDB4MmRmZiwgMHgyMDMxLCAweDAwMDEsIDB4MDA3OCwgMHgyZTAxLCAweDIwMzEsCisJMHgwMDAwLCAweDdlM2EsIDB4N2YzZSwgMHgwMDc4LCAweDJiMmMsIDB4NjEzYywgMHg2MjQwLCAweDIwMTksCisJMHhhNWEwLCAweDIzMWMsIDB4MDA3OCwgMHgyYjJjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYxMzQsCisJMHhhMDA2LCAweDIwMTAsIDB4MjAxOCwgMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHgxMDc4LCAweDM1NDIsCisJMHgwMDQwLCAweDJiNWEsIDB4NjI0NCwgMHg2MzM4LCAweDAwNzgsIDB4MmIyYywgMHg2MTNjLCAweDYyNDAsCisJMHg3ODI0LCAweDYwM2UsIDB4N2IyOCwgMHg2MzQyLCAweDIwNjksIDB4YTM1MSwgMHg4MzFmLCAweGEzMDUsCisJMHg2ODE2LCAweDc4MmMsIDB4MjA2OSwgMHhhNWEwLCAweDJkMWMsIDB4MjA2YSwgMHgwMDc4LCAweDJiMmMsCisJMHgwMTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjQsIDB4NjAzNiwgMHhkMDk0LCAweDAwNDAsCisJMHgyZTQzLCAweDc4MjgsIDB4YTA4NSwgMHgwMDAxLCAweDIwMDksIDB4YTVhOSwgMHgyMDBhLCAweDIwMDEsCisJMHhmZmZmLCAweDEwNzgsIDB4NTk3NSwgMHgxMjdmLCAweDAxN2YsIDB4MDA3OCwgMHgyYjJjLCAweDEwNzgsCisJMHgzNTQyLCAweDAwNDAsIDB4MmI1YSwgMHg3ODI4LCAweGEwMGQsIDB4MDA0MCwgMHgyYjVhLCAweDc4MmMsCisJMHhhMDA1LCAweDAwNDAsIDB4MmI1YSwgMHg2MjQ0LCAweDYxNDYsIDB4NjMzOCwgMHg2MDNhLCAweDAwNzgsCisJMHgyYjJjLCAweDIwMDEsIDB4YTMwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDJiNTYsCisJMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweGExOTYsCisJMHgwMGZmLCAweDAwYzAsIDB4MmU3MCwgMHg2MDMwLCAweGEwODUsIDB4ZmYwMCwgMHgwMDc4LCAweDJlN2YsCisJMHhhMTgyLCAweDAwN2YsIDB4MDBjOCwgMHgyZWE5LCAweGExODgsIDB4MjkzZiwgMHgyMTBjLCAweGExOGMsCisJMHgwMGZmLCAweDYwMzAsIDB4YTExNiwgMHgwMDQwLCAweDJlYTksIDB4ODEwZiwgMHhhMTA1LCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MDA3ZSwgMHgxMDc4LCAweDc0ZDcsIDB4MDA3ZiwgMHgwMDQwLCAweDJlYTUsCisJMHg2MDFhLCAweDYwMGIsIDB4YmMwOSwgMHg2MDFmLCAweDAwMDEsIDB4MTA3OCwgMHgzNTE4LCAweDAwNDAsCisJMHgyZWFjLCAweDY4MzcsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDMsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4NzAxYiwgMHgyZjA3LCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMzIsCisJMHgxMDc4LCAweDc1NmMsIDB4MTI3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MTI3ZiwgMHgwYzdmLCAweDAwNzgsCisJMHgyYjU2LCAweDBjN2YsIDB4MDA3OCwgMHgyYjVhLCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LCAweDJlYTUsCisJMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYjU2LCAweDBjN2UsCisJMHgyMDYxLCAweDAxMDAsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LCAweDAwZmYsCisJMHgwMGMwLCAweDJlYzcsIDB4NjAzMCwgMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHgyZWQ2LCAweGExODIsCisJMHgwMDdmLCAweDAwYzgsIDB4MmYwMCwgMHhhMTg4LCAweDI5M2YsIDB4MjEwYywgMHhhMThjLCAweDAwZmYsCisJMHg2MDMwLCAweGExMTYsIDB4MDA0MCwgMHgyZjAwLCAweDgxMGYsIDB4YTEwNSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDAwN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAwN2YsIDB4MDA0MCwgMHgyZWZjLCAweDYwMWEsCisJMHg2MDBiLCAweGJjMDUsIDB4NjAxZiwgMHgwMDAxLCAweDEwNzgsIDB4MzUxOCwgMHgwMDQwLCAweDJmMDMsCisJMHg2ODM3LCAweDAwMDAsIDB4NzAwNywgMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDcwMWIsIDB4MmYwNywgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLCAweDEwNzgsCisJMHg3NTZjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDc4LCAweDJiNTYsCisJMHgwYzdmLCAweDAwNzgsIDB4MmI1YSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHgyZWZjLCAweDY4MzAsCisJMHhhMDg2LCAweDAxMDAsIDB4MDA0MCwgMHgyYjU2LCAweDAwNzgsIDB4MmIyYywgMHgyMDYxLCAweGE2MmQsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDAwLCAweGQwODQsIDB4MDA0MCwgMHgyZjFjLCAweDYxMDQsCisJMHg2MjA4LCAweDEyN2YsIDB4MDA3OCwgMHgyYjJjLCAweDEyN2YsIDB4MDA3OCwgMHgyYjVhLCAweDgxZmYsCisJMHgwMGMwLCAweDJiNTYsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjI0NCwgMHg2MDYwLCAweGEyMDIsCisJMHgwMDQ4LCAweDJmMzMsIDB4YTA4NSwgMHgwMDAxLCAweDEwNzgsIDB4MjUwMCwgMHgxMDc4LCAweDNiZjUsCisJMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHgxMjdmLCAweDAwNzgsIDB4MmI1YSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwYTksIDB4MDAxMSwgMHgyMDAxLCAweGEzNDAsIDB4MjBhMCwgMHhhMDA2LCAweDQwYTQsCisJMHgxMjdmLCAweDAwNzgsIDB4MmIyYywgMHg3ZDM4LCAweDdjM2MsIDB4MDA3OCwgMHgyYmRlLCAweDc4MjQsCisJMHhhMDljLCAweDAwZmYsIDB4YTM5YSwgMHgwMDAzLCAweDAwYzgsIDB4MmI1NiwgMHg2MjRjLCAweGEwODQsCisJMHhmZjAwLCAweDgwMDcsIDB4YTIwNiwgMHgwMGMwLCAweDJmNWYsIDB4MjAwMSwgMHhhMzQwLCAweDIwMDksCisJMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDA3OCwgMHgzNTY2LCAweDgxZmYsCisJMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHgzNTQyLCAweDAwNDAsIDB4MmI1YSwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDJiNTYsIDB4MGM3ZSwgMHgxMDc4LCAweDM1MTgsCisJMHgwYzdmLCAweDAwNDAsIDB4MmI1NiwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHgxMDc4LCAweDhiODUsIDB4MDA0MCwgMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDJmODEsCisJMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDAwNDAsIDB4MmI1NiwgMHhhZDgwLCAweDAwMGUsCisJMHgyMDA5LCAweDAwMGMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwMDc4LCAweDM1NjYsCisJMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyYjU2LCAweDEwNzgsIDB4NDIxYSwgMHgyMDA5LCAweDAwMWMsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsIDB4MzU2MiwgMHg3MDFiLCAweDJmYTEsCisJMHgwMDdjLCAweGFkZTgsIDB4MDAwZCwgMHg2ODAwLCAweGEwMDUsIDB4MDA0MCwgMHgyYjVhLCAweDY4MDQsCisJMHhkMGFjLCAweDAwNDAsIDB4MmZhZSwgMHhkMGE0LCAweDAwNDAsIDB4MmI1YSwgMHhkMDk0LCAweDAwNDAsCisJMHgyZmI5LCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsIDB4YTE4YywgMHhmZmRmLCAweDYxMDYsCisJMHgwYzdmLCAweGQwOGMsIDB4MDA0MCwgMHgyZmM0LCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYxMDQsCisJMHhhMThkLCAweDAwMTAsIDB4NjEwNiwgMHgwYzdmLCAweDIwMDksIDB4MDEwMCwgMHgyMTBjLCAweGExOGEsCisJMHgwMDAyLCAweDAwNDgsIDB4MmZkOSwgMHhkMDg0LCAweDAwNDAsIDB4MmZkOSwgMHg2YTI4LCAweGEyOGEsCisJMHgwMDdmLCAweDAwYzgsIDB4MmI1YSwgMHhhMjg4LCAweDI5M2YsIDB4MjEwYywgMHhhMThjLCAweDAwZmYsCisJMHg2MTUyLCAweGQwZGMsIDB4MDA0MCwgMHgyZmUyLCAweDY4MjgsIDB4YTA4YSwgMHgwMDdmLCAweDAwYzgsCisJMHgyYjVhLCAweDYwNGUsIDB4NjgwOCwgMHhhMDhhLCAweDAxMDAsIDB4MDA0OCwgMHgyYjVhLCAweGEwOGEsCisJMHgwODQxLCAweDAwYzgsIDB4MmI1YSwgMHhhMDg0LCAweDAwMDcsIDB4MDBjMCwgMHgyYjVhLCAweDY4MGMsCisJMHhhMDA1LCAweDAwNDAsIDB4MmI1YSwgMHg2ODEwLCAweGEwMDUsIDB4MDA0MCwgMHgyYjVhLCAweDY4NDgsCisJMHg2OTQwLCAweGExMGEsIDB4MDBjOCwgMHgyYjVhLCAweDgwMDEsIDB4MDA0MCwgMHgyYjVhLCAweDY4NGMsCisJMHg2OTQ0LCAweGExMGEsIDB4MDBjOCwgMHgyYjVhLCAweDgwMDEsIDB4MDA0MCwgMHgyYjVhLCAweDY4MDQsCisJMHhkMGZjLCAweDAwNDAsIDB4MzAzOCwgMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyYjU2LCAweDIwMDksCisJMHgwMDE0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4YTI5MCwgMHgwMDM4LCAweGEzOTksCisJMHgwMDAwLCAweDEwNzgsIDB4MzU2MiwgMHg3MDFiLCAweDMwMWUsIDB4MDA3YywgMHhhZGU4LCAweDAwMGQsCisJMHgyMGE5LCAweDAwMTQsIDB4MmQ5OCwgMHgyMDY5LCAweGEzNmQsIDB4MmRhMCwgMHg1M2EzLCAweDcwMTAsCisJMHhhMGU4LCAweDAwMGQsIDB4MjAwMSwgMHhhMzcxLCAweDIwMGMsIDB4ZDFlNCwgMHgwMDQwLCAweDMwMzgsCisJMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweGEwODUsIDB4MGIwMCwgMHg2MDA2LCAweDBjN2YsCisJMHgyMGE5LCAweDAwMWMsIDB4MmQ5OCwgMHgyMDY5LCAweGEzNTEsIDB4MmRhMCwgMHg1M2EzLCAweDY4MTQsCisJMHhhMDhjLCAweDAwZmYsIDB4NjEzZSwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg2MDQyLCAweDEwNzgsCisJMHg0ZGJkLCAweDEwNzgsIDB4NDhkZCwgMHgxMDc4LCAweDQ5NGQsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMGMwLCAweDMwYzMsIDB4NjgwOCwgMHg2MDJhLCAweDEwNzgsIDB4MjE4YiwgMHg2ODE4LCAweDY5MWMsCisJMHg2YTIwLCAweDZiMjQsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHg2MDE2LCAweDYxMWEsCisJMHg2MjFlLCAweDYzMjIsIDB4NmMwNCwgMHhkNGY0LCAweDAwNDAsIDB4MzA3MCwgMHg2ODMwLCAweDY5MzQsCisJMHg2YTM4LCAweDZiM2MsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHgwMDc4LCAweDMwNzIsCisJMHhhMDg0LCAweGYwZmYsIDB4NjAwNiwgMHg2MTBhLCAweDYyMGUsIDB4NjMxMiwgMHgxMDc4LCAweDU5YTgsCisJMHg2OTA0LCAweGQxZmMsIDB4MDA0MCwgMHgzMGE1LCAweDBjN2UsIDB4MjAwOSwgMHgwMDAwLCAweDIwYTksCisJMHgwMDAxLCAweDZiNzAsIDB4ZDM4NCwgMHgwMDQwLCAweDMwYTIsIDB4MDA3OCwgMHgzMDhjLCAweDgzOWQsCisJMHgwMGM4LCAweDMwYTIsIDB4MzUwOCwgMHg4MTA5LCAweDEwNzgsIDB4NTM2NCwgMHg2ODc4LCAweDYwMTYsCisJMHg2ODc0LCAweDIwMDgsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsIDB4NjAwYSwgMHhhMTg0LCAweDAwZmYsCisJMHg2MDA2LCAweDgxMDgsIDB4MDBjMCwgMHgzMGEwLCAweDYwMDMsIDB4MDAwMywgMHgwMDc4LCAweDMwYTIsCisJMHg2MDAzLCAweDAwMDEsIDB4MDBmMCwgMHgzMDg3LCAweDBjN2YsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsCisJMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDBjN2YsIDB4MTA3OCwgMHgzNzg0LCAweDAwNDAsCisJMHgzMGIzLCAweDEwNzgsIDB4MjUwMCwgMHg2MGJjLCAweGEwMDUsIDB4MDA0MCwgMHgzMGJmLCAweDYwMDMsCisJMHgwMDAxLCAweDIwOTEsIDB4MzAxZCwgMHgxMDc4LCAweDQxNzEsIDB4MDA3OCwgMHgzMGMzLCAweDYwMDMsCisJMHgwMDA0LCAweDIwOTEsIDB4MzAxZCwgMHgwMDc4LCAweDJiMmMsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDJiNTYsIDB4MjA2OSwgMHhhMzUxLCAweDc4MzAsIDB4Njg0MiwgMHg3ODM0LCAweDY4NDYsCisJMHg2ODA0LCAweGQwZmMsIDB4MDA0MCwgMHgzMGQ4LCAweDIwMDksIDB4MDAzMCwgMHgwMDc4LCAweDMwZGEsCisJMHgyMDA5LCAweDAwMWMsIDB4MmQwMCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDAwNzgsCisJMHgzNTY2LCAweGEwMDYsIDB4MTA3OCwgMHgyNTAwLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsCisJMHg0MjFhLCAweDEwNzgsIDB4NDE3MSwgMHgwMDc4LCAweDJiMmMsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsCisJMHg2MTgwLCAweDgxZmYsIDB4MDA0MCwgMHgzMTA3LCAweDcwM2YsIDB4MDAwMCwgMHgyMDAxLCAweGE5YzAsCisJMHgyMDA5LCAweDAwNDAsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4MzU2NiwgMHg3MDFiLCAweDJiMjksIDB4MTI3ZiwgMHgwMDdjLCAweDcwM2YsCisJMHgwMDAxLCAweDBkN2UsIDB4MjA2OSwgMHhhOWMwLCAweDIwYTksIDB4MDA0MCwgMHgyMGExLCAweGE5YzAsCisJMHgyMDE5LCAweGZmZmYsIDB4NDNhNCwgMHg2NTRjLCAweGE1ODgsIDB4MjkzZiwgMHgyMTBjLCAweGExOGMsCisJMHgwMGZmLCAweDIxNmEsIDB4YTAwZSwgMHgyMDExLCAweDAwMDIsIDB4MjEwMCwgMHhhNTA2LCAweDAwNDAsCisJMHgzMTM5LCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDMxMzksIDB4NjAxNCwgMHg4MjFjLCAweDAwNDgsCisJMHgzMTMxLCAweGEzOTgsIDB4YTljMCwgMHhhMDg1LCAweGZmMDAsIDB4ODAwNywgMHgyMDFhLCAweDAwNzgsCisJMHgzMTM4LCAweGEzOTgsIDB4YTljMCwgMHgyMzI0LCAweGE0YTQsIDB4ZmYwMCwgMHhhNDA1LCAweDIwMWEsCisJMHg4MjEwLCAweDgxMDgsIDB4YTE4MiwgMHgwMDgwLCAweDAwYzgsIDB4MzE0MCwgMHgwMDc4LCAweDMxMWQsCisJMHg4MjAxLCAweDgwMDcsIDB4MmQwYywgMHhhMTA1LCAweDIwNmEsIDB4MGQ3ZiwgMHgyMGE5LCAweDAwNDAsCisJMHgyMGExLCAweGE5YzAsIDB4MjA5OSwgMHhhOWMwLCAweDEwNzgsIDB4NDFiZSwgMHgwMDc4LCAweDMwZjYsCisJMHgxMDc4LCAweDM1NDIsIDB4MDA0MCwgMHgyYjVhLCAweDBjN2UsIDB4MTA3OCwgMHgzNTE4LCAweDBjN2YsCisJMHgwMGMwLCAweDMxNWUsIDB4MjAwOSwgMHgwMDAyLCAweDAwNzgsIDB4MmI1NiwgMHgyMDAxLCAweGEzNTIsCisJMHgyMDA0LCAweGQwYjQsIDB4MDA0MCwgMHgzMTg1LCAweDYwMDAsIDB4ZDA4YywgMHgwMGMwLCAweDMxODUsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzMTg1LCAweDY4MzcsCisJMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDEwNzgsIDB4OGJkOSwgMHgwMGMwLCAweDMxN2MsCisJMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDMxODEsCisJMHgwMDdjLCAweDEwNzgsIDB4MzU0MiwgMHgwMDQwLCAweDJiNWEsIDB4MjBhOSwgMHgwMDJiLCAweDJjOTgsCisJMHhhZGU4LCAweDAwMDIsIDB4MmRhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAwNCwgMHhhYzgwLCAweDAwMDYsCisJMHgyMDk4LCAweGFkODAsIDB4MDAwNiwgMHgyMGEwLCAweDEwNzgsIDB4NDFiZSwgMHgyMGE5LCAweDAwMDQsCisJMHhhYzgwLCAweDAwMGEsIDB4MjA5OCwgMHhhZDgwLCAweDAwMGEsIDB4MjBhMCwgMHgxMDc4LCAweDQxYmUsCisJMHgyZDAwLCAweDIwMDksIDB4MDAyYiwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDAwNzgsCisJMHgzNTY2LCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsIDB4MzUzMCwgMHgwMDQwLCAweDJiNWEsCisJMHgxMDc4LCAweDQ2ZWYsIDB4MDA3OCwgMHgyYjJjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDc4MjgsCisJMHhhMDhhLCAweDEwMDAsIDB4MDBjOCwgMHgyYjVhLCAweDEwNzgsIDB4MzU0MiwgMHgwMDQwLCAweDJiNWEsCisJMHgxMDc4LCAweDQ3NWYsIDB4MDA0MCwgMHgyYjU2LCAweDIwMTksIDB4MDAwNCwgMHgxMDc4LCAweDQ3MDUsCisJMHg3OTI0LCAweDgxMGYsIDB4N2EyOCwgMHgxMDc4LCAweDMxY2YsIDB4MDA3OCwgMHgyYjJjLCAweGExODYsCisJMHgwMGZmLCAweDAwNDAsIDB4MzFkNywgMHgxMDc4LCAweDMxZTcsIDB4MDA3OCwgMHgzMWU2LCAweDIwMjksCisJMHgwMDdlLCAweDIwNjEsIDB4YTMwMCwgMHg2NDRjLCAweDI0MDAsIDB4YTUwNiwgMHgwMDQwLCAweDMxZTMsCisJMHgyNTA4LCAweDEwNzgsIDB4MzFlNywgMHg4NTI5LCAweDAwYzgsIDB4MzFkYywgMHgwMDdjLCAweDEwNzgsCisJMHg0NTAxLCAweDAwYzAsIDB4MzFmMiwgMHgyMjAwLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsCisJMHgxMDc4LCAweDU4ZTEsIDB4MDA3YywgMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LCAweDM1MzAsCisJMHgwMDQwLCAweDJiNWEsIDB4MTA3OCwgMHg0NWE3LCAweDAwNDAsIDB4MmI1NiwgMHgxMDc4LCAweDQ2ZmEsCisJMHgwMDc4LCAweDJiMmMsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHgzNTMwLCAweDAwNDAsCisJMHgyYjVhLCAweDEwNzgsIDB4NDVhNywgMHgwMDQwLCAweDJiNTYsIDB4MTA3OCwgMHg0NmU0LCAweDAwNzgsCisJMHgyYjJjLCAweDYxMDAsIDB4MDA3OCwgMHgyYjJjLCAweDEwNzgsIDB4MzU0MiwgMHgwMDQwLCAweDJiNWEsCisJMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyYjU2LCAweDBkN2UsCisJMHhhY2U4LCAweDAwMGEsIDB4NzkyNCwgMHhkMTg0LCAweDAwNDAsIDB4MzIyOCwgMHhhY2U4LCAweDAwMDYsCisJMHg2ODBjLCAweDgwMDcsIDB4NzgzZSwgMHg2ODA4LCAweDgwMDcsIDB4NzgzYSwgMHg2YjA0LCAweDgzMWYsCisJMHg2YTAwLCAweDgyMTcsIDB4MGQ3ZiwgMHg2MTAwLCAweGExOGMsIDB4MDIwMCwgMHgwMDc4LCAweDJiMmMsCisJMHhhMDA2LCAweDEwNzgsIDB4MjUwMCwgMHg3ODI0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwZmYsCisJMHgwMDQwLCAweDMyNDUsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHg0MjFhLCAweDc4MjgsCisJMHhhMDhhLCAweDEwMDAsIDB4MDBjOCwgMHgyYjVhLCAweDc5MjQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMTg2LCAweDAwZmYsIDB4MDA0MCwgMHgzMjViLCAweGExODIsIDB4MDA3ZiwgMHgwMGM4LCAweDJiNWEsCisJMHgyMTAwLCAweDEwNzgsIDB4MjRmYSwgMHgwMjdlLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDYxLCAweGE1YmUsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHgyMDYxLCAweDAxMDAsCisJMHg2MDMwLCAweGEwODQsIDB4MDBmZiwgMHg4MTBmLCAweGExMDUsIDB4NjA0YSwgMHg2MDQzLCAweDAwOTAsCisJMHg2MDQzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDJkLCAweDIwMTEsIDB4NDE5NiwgMHgxMDc4LCAweDU5NmMsCisJMHg3OTI0LCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDdhMjgsIDB4MTA3OCwgMHgzMWNmLCAweDEyN2YsCisJMHgwYzdmLCAweDAyN2YsIDB4MDA3OCwgMHgyYjJjLCAweDc5MjQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHgwYzdlLCAweDEwNzgsIDB4NDQ5OSwgMHgyYzA4LCAweDBjN2YsIDB4MDBjMCwgMHgyYjVhLCAweDAwNzgsCisJMHgyYjJjLCAweDgxZmYsIDB4MDA0MCwgMHgzMjk4LCAweDIwMDksIDB4MDAwMSwgMHgwMDc4LCAweDJiNTYsCisJMHg2MGM4LCAweGQwOWMsIDB4MDBjMCwgMHgzMmEwLCAweDIwMDksIDB4MDAwNSwgMHgwMDc4LCAweDJiNTYsCisJMHgxMDc4LCAweDM1MTgsIDB4MDBjMCwgMHgzMmE4LCAweDIwMDksIDB4MDAwMiwgMHgwMDc4LCAweDJiNTYsCisJMHg3OTI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MTA3OCwgMHgzNTYyLCAweDcwMWIsCisJMHgzMmIyLCAweDAwN2MsIDB4MjAwOSwgMHgwMDgwLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDMyYmYsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHgzMmMzLCAweDIwMjEsCisJMHg0MDBhLCAweDAwNzgsIDB4MmIyZSwgMHgwZDdlLCAweGFkZTgsIDB4MDAwZCwgMHg2OTAwLCAweDZhMDgsCisJMHg2YjBjLCAweDZjMTAsIDB4NmQxNCwgMHg2ZTE4LCAweDY4MjAsIDB4YTBiZSwgMHgwMTAwLCAweDAwNDAsCisJMHgzMzM2LCAweGEwYmUsIDB4MDExMiwgMHgwMDQwLCAweDMzMzYsIDB4YTBiZSwgMHgwMTEzLCAweDAwNDAsCisJMHgzMzM2LCAweGEwYmUsIDB4MDExNCwgMHgwMDQwLCAweDMzMzYsIDB4YTBiZSwgMHgwMTE3LCAweDAwNDAsCisJMHgzMzM2LCAweGEwYmUsIDB4MDExYSwgMHgwMDQwLCAweDMzMzYsIDB4YTBiZSwgMHgwMTIxLCAweDAwNDAsCisJMHgzMzJjLCAweGEwYmUsIDB4MDEzMSwgMHgwMDQwLCAweDMzMmMsIDB4YTBiZSwgMHgwMTcxLCAweDAwNDAsCisJMHgzMzM2LCAweGEwYmUsIDB4MDE3MywgMHgwMDQwLCAweDMzMzYsIDB4YTBiZSwgMHgwMWExLCAweDAwYzAsCisJMHgzMmZlLCAweDY4MzAsIDB4ODAwNywgMHg2ODMyLCAweDAwNzgsIDB4MzMzYywgMHhhMGJlLCAweDAyMTIsCisJMHgwMDQwLCAweDMzMzIsIDB4YTBiZSwgMHgwMjEzLCAweDAwNDAsIDB4MzMzMiwgMHhhMGJlLCAweDAyMTQsCisJMHgwMDQwLCAweDMzMjQsIDB4YTBiZSwgMHgwMjE3LCAweDAwNDAsIDB4MzMxZSwgMHhhMGJlLCAweDAyMWEsCisJMHgwMGMwLCAweDMzMTcsIDB4NjgzOCwgMHg4MDA3LCAweDY4M2EsIDB4MDA3OCwgMHgzMzM2LCAweGEwYmUsCisJMHgwMzAwLCAweDAwNDAsIDB4MzMzNiwgMHgwZDdmLCAweDAwNzgsIDB4MmI1YSwgMHhhZDgwLCAweDAwMTAsCisJMHgyMGE5LCAweDAwMDcsIDB4MTA3OCwgMHgzMzdlLCAweGFkODAsIDB4MDAwZSwgMHgyMGE5LCAweDAwMDEsCisJMHgxMDc4LCAweDMzN2UsIDB4MDA3OCwgMHgzMzM2LCAweGFkODAsIDB4MDAwYywgMHgxMDc4LCAweDMzOGMsCisJMHgwMDc4LCAweDMzM2MsIDB4YWQ4MCwgMHgwMDBlLCAweDEwNzgsIDB4MzM4YywgMHhhZDgwLCAweDAwMGMsCisJMHgyMGE5LCAweDAwMDEsIDB4MTA3OCwgMHgzMzdlLCAweDBjN2UsIDB4MTA3OCwgMHgzNTE4LCAweDAwNDAsCisJMHgzMzZmLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDY4MzcsIDB4MDExOSwgMHg2ODUzLCAweDAwMDAsCisJMHg2ODRmLCAweDAwMjAsIDB4Njg1YiwgMHgwMDAxLCAweDgxMGIsIDB4Njk3ZSwgMHg2ODgzLCAweDAwMDAsCisJMHg2YTg2LCAweDZiOGEsIDB4NmM4ZSwgMHg2ZDkyLCAweDY5OTYsIDB4Njg5YiwgMHgwMDAwLCAweDBjN2YsCisJMHgwZDdmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODIzLCAweDAwMDAsCisJMHg2ODA0LCAweDIwNjgsIDB4MTA3OCwgMHg4YmExLCAweDAwYzAsIDB4MzM2YSwgMHgyMDA5LCAweDAwMDMsCisJMHgwMDc4LCAweDJiNTYsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MzM3NSwgMHgwMDdjLCAweDBjN2YsCisJMHgwZDdmLCAweDIwMDksIDB4MDAwMiwgMHgwMDc4LCAweDJiNTYsIDB4NjgyMCwgMHhhMDg2LCAweDgwMDEsCisJMHgwMGMwLCAweDJiMmMsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsIDB4MmI1NiwgMHgwMTdlLCAweDIwMDgsCisJMHgyMDQ0LCAweDgwMDAsIDB4MjA0YywgMHg4MDAwLCAweDI5MGEsIDB4ODEwOCwgMHgyODBhLCAweDgxMDgsCisJMHgwMGYwLCAweDMzODAsIDB4MDE3ZiwgMHgwMDdjLCAweDAxN2UsIDB4MGE3ZSwgMHgwYjdlLCAweDIwMDgsCisJMHgyMDQ0LCAweDgwMDAsIDB4MjA0YywgMHg4MDAwLCAweDIwNTQsIDB4ODAwMCwgMHgyMDVjLCAweDJiMGEsCisJMHg4MTA4LCAweDJhMGEsIDB4ODEwOCwgMHgyOTBhLCAweDgxMDgsIDB4MjgwYSwgMHgwYjdmLCAweDBhN2YsCisJMHgwMTdmLCAweDAwN2MsIDB4ODFmZiwgMHgwMDQwLCAweDMzYTksIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsCisJMHgyYjU2LCAweDc5MjQsIDB4MjE0MCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwODAsCisJMHgwMDQ4LCAweDJiNWEsIDB4YTE4MiwgMHgwMGZmLCAweDAwYzgsIDB4MmI1YSwgMHg3YTJjLCAweDdiMjgsCisJMHg2MDY4LCAweGEzMDYsIDB4MDBjMCwgMHgzM2M0LCAweDYwNmMsIDB4YTI0ZSwgMHgwMDQwLCAweDJiNWEsCisJMHhhOWNjLCAweGZmMDAsIDB4MDA0MCwgMHgyYjVhLCAweDBjN2UsIDB4MTA3OCwgMHgzNDZkLCAweDJjNjgsCisJMHgwYzdmLCAweDAwNDAsIDB4MzNmYywgMHhhMGM2LCAweDQwMDAsIDB4MDBjMCwgMHgzM2UyLCAweDBjN2UsCisJMHgwMDdlLCAweDJkNjAsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4NDdjYiwgMHgwMGMwLCAweDMzZDksCisJMHhjMTg1LCAweDYwMDAsIDB4ZDBiYywgMHgwMDQwLCAweDMzZGUsIDB4YzE4ZCwgMHgwMDdmLCAweDBjN2YsCisJMHgwMDc4LCAweDMzZjksIDB4YTBjNiwgMHg0MDA3LCAweDAwYzAsIDB4MzNlOSwgMHgyNDA4LCAweDAwNzgsCisJMHgzM2Y5LCAweGEwYzYsIDB4NDAwOCwgMHgwMGMwLCAweDMzZjEsIDB4MjcwOCwgMHgyNjEwLCAweDAwNzgsCisJMHgzM2Y5LCAweGEwYzYsIDB4NDAwOSwgMHgwMGMwLCAweDMzZjcsIDB4MDA3OCwgMHgzM2Y5LCAweDIwMDEsCisJMHg0MDA2LCAweDIwMjAsIDB4MDA3OCwgMHgyYjJlLCAweDJkMDAsIDB4NzAyMiwgMHgwMTdlLCAweDBiN2UsCisJMHgwYzdlLCAweDBlN2UsIDB4MmM3MCwgMHgxMDc4LCAweDc0ZDcsIDB4MDA0MCwgMHgzNDQyLCAweDJkMDAsCisJMHg2MDFhLCAweDIwMDEsIDB4YTM1NiwgMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDJlNTgsCisJMHgwZTdmLCAweDBlN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDM1MTgsIDB4MGM3ZiwgMHgyYjcwLCAweDAwYzAsCisJMHgzNDIzLCAweDEwNzgsIDB4NzUzZCwgMHgwZTdmLCAweDBjN2YsIDB4MGI3ZiwgMHgwMTdmLCAweDIwMDksCisJMHgwMDAyLCAweDAwNzgsIDB4MmI1NiwgMHg2ODM3LCAweDAwMDAsIDB4MmQwMCwgMHg2MDEyLCAweDY4MzMsCisJMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgyODEzLCAweDEyN2YsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsCisJMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NDNmLCAweDIwMDksIDB4MDAwMiwgMHgxMDc4LCAweDc1NmMsCisJMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwYzdmLCAweDBiN2YsIDB4MDE3ZiwgMHgwMGMwLCAweDM0NGMsCisJMHgyMDA5LCAweDAwMDMsIDB4MDA3OCwgMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM0NTEsCisJMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDcwMjAsIDB4MjA2MCwgMHgwMGMwLCAweDM0NWYsCisJMHgyMDA5LCAweDAwMDQsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4MDA3OCwgMHgyYjU2LCAweDIwMDksCisJMHgwMDAwLCAweDEwNzgsIDB4NDdjYiwgMHgwMGMwLCAweDM0NjYsIDB4YzE4NSwgMHg2MDAwLCAweGQwYmMsCisJMHgwMDQwLCAweDM0NmIsIDB4YzE4ZCwgMHgwMDc4LCAweDJiMmMsIDB4MGU3ZSwgMHgwZDdlLCAweDIwMjksCisJMHgwMDAwLCAweDIwMjEsIDB4MDA4MCwgMHgyMGE5LCAweDAwN2YsIDB4MjA3MSwgMHhhNGI0LCAweDJlMDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MzQ4MiwgMHgyMTAwLCAweGE0MDYsIDB4MDBjMCwgMHgzNGIzLCAweDI0MjgsCisJMHgwMDc4LCAweDM0YjMsIDB4MjA2OCwgMHg2ZjEwLCAweDI3MDAsIDB4YTMwNiwgMHgwMGMwLCAweDM0YTQsCisJMHg2ZTE0LCAweDI2MDAsIDB4YTIwNiwgMHgwMGMwLCAweDM0YTQsIDB4MjQwMCwgMHhhMTA2LCAweDAwYzAsCisJMHgzNGEwLCAweDJkNjAsIDB4ZDg4NCwgMHgwMDQwLCAweDM0YzgsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzNGM4LCAweDIwMDEsIDB4NDAwMCwgMHgwMDc4LCAweDM0YzksCisJMHgyMDAxLCAweDQwMDcsIDB4MDA3OCwgMHgzNGM5LCAweDI0MDAsIDB4YTEwNiwgMHgwMGMwLCAweDM0YjMsCisJMHg2ZTE0LCAweDg3ZmYsIDB4MDBjMCwgMHgzNGFmLCAweDg2ZmYsIDB4MDA0MCwgMHgzNDdmLCAweDIwMDEsCisJMHg0MDA4LCAweDAwNzgsIDB4MzRjOSwgMHg4NDIwLCAweDhlNzAsIDB4MDBmMCwgMHgzNDc3LCAweDg1ZmYsCisJMHgwMGMwLCAweDM0YzIsIDB4MjAwMSwgMHg0MDA5LCAweDAwNzgsIDB4MzRjOSwgMHgyMDAxLCAweDAwMDEsCisJMHgwMDc4LCAweDM0YzksIDB4MTA3OCwgMHg0NDk5LCAweDAwYzAsIDB4MzRiZSwgMHg2MzEyLCAweDYyMTYsCisJMHhhMDA2LCAweGEwMDUsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsCisJMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgyYjU2LCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDc4MjQsIDB4YTAwNSwgMHgwMDQwLCAweDJiNWEsIDB4YTA5NiwgMHgwMGZmLCAweDAwNDAsCisJMHgzNGU1LCAweGEwOTIsIDB4MDAwNCwgMHgwMGM4LCAweDJiNWEsIDB4MjAxMCwgMHgyZDE4LCAweDEwNzgsCisJMHgyN2MyLCAweDAwNDAsIDB4MmI1NiwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzNGYwLCAweDAwN2MsCisJMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwMDQwLCAweDJiNTYsIDB4MDA3OCwgMHgyYjJjLCAweDc5MjQsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwODAsIDB4MDA0OCwgMHgyYjVhLCAweGExODIsCisJMHgwMGZmLCAweDAwYzgsIDB4MmI1YSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDhhODksCisJMHgwMGMwLCAweDM1MTUsIDB4YTE5MCwgMHhhNDM0LCAweDIyMDQsIDB4YTA2NSwgMHgwMDQwLCAweDM1MTUsCisJMHgxMDc4LCAweDQyMzUsIDB4MTI3ZiwgMHgwMDc4LCAweDJiMmMsIDB4MTI3ZiwgMHgwMDc4LCAweDJiNTYsCisJMHgxMDc4LCAweDEzODEsIDB4MDA0MCwgMHgzNTJmLCAweGEwMDYsIDB4NjgwMiwgMHg3MDEwLCAweGEwMDUsCisJMHgwMGMwLCAweDM1MjcsIDB4MmQwMCwgMHg3MDEyLCAweDcwMTYsIDB4MDA3OCwgMHgzNTJkLCAweDcwMTQsCisJMHg2ODAyLCAweDIwNjAsIDB4MmQwMCwgMHg2MDA2LCAweDcwMTYsIDB4YWQ4MCwgMHgwMDBkLCAweDAwN2MsCisJMHg3OTI0LCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDEwNzgsIDB4NDUwMSwgMHgwMGMwLCAweDM1M2YsCisJMHg3ZTI4LCAweGE2ODQsIDB4M2ZmZiwgMHhhMDgyLCAweDQwMDAsIDB4MDA0OCwgMHgzNTQwLCAweGEwNjYsCisJMHg4Y2ZmLCAweDAwN2MsIDB4N2UyNCwgMHg4NjBmLCAweGExOGMsIDB4MDBmZiwgMHgxMDc4LCAweDQ1MDEsCisJMHgwMGMwLCAweDM1NTAsIDB4YTZiNCwgMHgwMGZmLCAweGE2ODIsIDB4NDAwMCwgMHgwMDQ4LCAweDM1NTEsCisJMHhhMDY2LCAweDhjZmYsIDB4MDA3YywgMHgwMTdlLCAweDcxMTAsIDB4ODFmZiwgMHgwMDQwLCAweDM1NWUsCisJMHgyMTY4LCAweDY5MDQsIDB4MTA3OCwgMHgxMzlhLCAweDAwNzgsIDB4MzU1NSwgMHg3MTEyLCAweDcxMTYsCisJMHgwMTdmLCAweDAwN2MsIDB4MjAzMSwgMHgwMDAxLCAweDAwNzgsIDB4MzU2OCwgMHgyMDMxLCAweDAwMDAsCisJMHgyMDYxLCAweGEzZDEsIDB4NjYwNiwgMHg2MTEyLCAweDYwMGUsIDB4NjIyNiwgMHg2MzJhLCAweDY0MmUsCisJMHg2NTMyLCAweDJjMTAsIDB4MTA3OCwgMHgxM2QxLCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLCAweDJiMmMsCisJMHgwMDdjLCAweDBmN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMDAwLCAweDIwMDEsCisJMHhhMzhmLCAweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDM1OTQsIDB4MDA2OCwgMHgzNTk0LCAweDc4MTgsCisJMHhkMDg0LCAweDAwYzAsIDB4MzU5NCwgMHg3YTIyLCAweDdiMjYsIDB4N2MyYSwgMHg3ODFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHgzNWI5LCAweDAxN2UsIDB4MGM3ZSwgMHgwZTdlLCAweDIwNzEsCisJMHhhMzgxLCAweDcxMzgsIDB4YTE4MiwgMHgwMDA4LCAweDAwNDgsIDB4MzVhMiwgMHg3MDMwLCAweDIwNjAsCisJMHgwMDc4LCAweDM1YjMsIDB4NzAzMCwgMHhhMGUwLCAweDAwMDgsIDB4YWM4MiwgMHhhM2QxLCAweDAwNDgsCisJMHgzNWFiLCAweDIwNjEsIDB4YTM5MSwgMHgyYzAwLCAweDcwMzIsIDB4ODFmZiwgMHgwMGMwLCAweDM1YjEsCisJMHg3MDM2LCAweDgxMDgsIDB4NzEzYSwgMHgyMjYyLCAweDYzMDYsIDB4NjQwYSwgMHgwZTdmLCAweDBjN2YsCisJMHgwMTdmLCAweDEyN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhMzgxLCAweDcwMzgsCisJMHhhMDA1LCAweDAwNDAsIDB4MzVmNSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDY4LCAweDM1ZjQsCisJMHgwZjdlLCAweDIwNzksIDB4MDAwMCwgMHg3ODE4LCAweGQwODQsIDB4MDBjMCwgMHgzNWYzLCAweDBjN2UsCisJMHg3MDM0LCAweDIwNjAsIDB4MmMwNCwgMHg3ODIyLCAweDYwMDQsIDB4NzgyNiwgMHg2MDA4LCAweDc4MmEsCisJMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDcwMzgsIDB4ODAwMSwgMHg3MDNhLCAweGEwMDUsCisJMHgwMGMwLCAweDM1ZTksIDB4NzAzMywgMHhhMzkxLCAweDcwMzcsIDB4YTM5MSwgMHgwYzdmLCAweDAwNzgsCisJMHgzNWYzLCAweGFjODAsIDB4MDAwOCwgMHhhMGZhLCAweGEzZDEsIDB4MDA0OCwgMHgzNWYxLCAweDIwMDEsCisJMHhhMzkxLCAweDcwMzYsIDB4MGM3ZiwgMHgwZjdmLCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDAyN2UsCisJMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGM0LCAweDAwNDAsIDB4MzYwMiwgMHgyMDExLCAweDgwMTQsCisJMHgxMDc4LCAweDM1NzksIDB4MDI3ZiwgMHgwMDdjLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NjAzMCwgMHhjMDhkLCAweGMwODUsIDB4YzBhYywgMHg2MDMyLCAweDEwNzgsCisJMHg0MTcxLCAweDEyN2YsIDB4MDA3OCwgMHgyYjJjLCAweDc4MjQsIDB4MjAwOCwgMHhhMThjLCAweGZmZmQsCisJMHgwMGMwLCAweDM2MWYsIDB4NjFkNCwgMHhhMTBkLCAweDYxZDYsIDB4MDA3OCwgMHgyYjJjLCAweDAwNzgsCisJMHgyYjVhLCAweDgxZmYsIDB4MDBjMCwgMHgyYjU2LCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHgyYjU2LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYWMsIDB4MDBjMCwgMHgyYjU2LCAweDEwNzgsCisJMHgzNTQyLCAweDAwNDAsIDB4MmI1YSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDM2M2UsIDB4NzgyOCwgMHhhMDA1LCAweDAwNDAsIDB4MmIyYywgMHgwYzdlLCAweDEwNzgsCisJMHgzNTE4LCAweDBjN2YsIDB4MDA0MCwgMHgyYjU2LCAweDY4MzcsIDB4MDAwMCwgMHg2ODMzLCAweDAwMDAsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgxMDc4LCAweDhjNGQsIDB4MDA0MCwgMHgyYjU2LCAweDcwMDcsCisJMHgwMDAzLCAweDcwMWIsIDB4MzY1NCwgMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDAwNDAsCisJMHgyYjU2LCAweDAwNzgsIDB4MmIyYywgMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDJiNTYsIDB4N2YyNCwgMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDEwNzgsCisJMHgzNTE4LCAweDAwNDAsIDB4MmI1NiwgMHgyMDA5LCAweDAwMDAsIDB4MjAzMSwgMHgwMDAwLCAweDcwMjMsCisJMHgwMDAwLCAweDcwMmYsIDB4MDAwMCwgMHhhZDgwLCAweDAwMDUsIDB4NzAyNiwgMHgyMGEwLCAweDEwNzgsCisJMHg0NTAxLCAweDAwYzAsIDB4MzZkOCwgMHg2MDA0LCAweGEwYzQsIDB4MDBmZiwgMHhhOGM2LCAweDAwMDYsCisJMHgwMDQwLCAweDM2ODgsIDB4YTBjNCwgMHhmZjAwLCAweGE4YzYsIDB4MDYwMCwgMHgwMGMwLCAweDM2ZDgsCisJMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGFjLCAweDAwYzAsIDB4MzY5NSwgMHgxMDc4LCAweDQ3Y2IsCisJMHgwMGMwLCAweDM2OTUsIDB4ZDc5YywgMHgwMDQwLCAweDM2ZDgsIDB4ZDc5NCwgMHgwMGMwLCAweDM2OWIsCisJMHhkNzg0LCAweDAwNDAsIDB4MzZhNywgMHhhYzgwLCAweDAwMDYsIDB4MjA5OCwgMHgzNDAwLCAweDIwYTksCisJMHgwMDA0LCAweDUzYTMsIDB4MTA3OCwgMHgzMzhjLCAweGQ3OTQsIDB4MDA0MCwgMHgzNmIwLCAweGFjODAsCisJMHgwMDBhLCAweDIwOTgsIDB4MzQwMCwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgxMDc4LCAweDMzOGMsCisJMHgyMWEyLCAweGQ3OTQsIDB4MDA0MCwgMHgzNmQwLCAweGFjODAsIDB4MDAwMCwgMHgyMDk4LCAweDk0YTAsCisJMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHhhYzgwLCAweDAwMDMsIDB4MjBhNiwgMHg5NGEwLCAweGFjODAsCisJMHgwMDA0LCAweDIwOTgsIDB4MzQwMCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgxMDc4LCAweDMzN2UsCisJMHhhYzgwLCAweDAwMjYsIDB4MjA5OCwgMHgyMGE5LCAweDAwMDIsIDB4NTNhMywgMHgwMDc4LCAweDM2ZDEsCisJMHg5NGEwLCAweGQ3OTQsIDB4MDA0MCwgMHgzNmQ2LCAweGE2YjAsIDB4MDAwYiwgMHhhNmIwLCAweDAwMDUsCisJMHg4MTA4LCAweGQ3OGMsIDB4MDA0MCwgMHgzNmUyLCAweGExODYsIDB4MDEwMCwgMHgwMDQwLCAweDM2ZjMsCisJMHgwMDc4LCAweDM2ZTYsIDB4YTE4NiwgMHgwMDdlLCAweDAwNDAsIDB4MzZmMywgMHhkNzk0LCAweDAwNDAsCisJMHgzNmVkLCAweGE2ODYsIDB4MDAyMCwgMHgwMDc4LCAweDM2ZWYsIDB4YTY4NiwgMHgwMDI4LCAweDAwNDAsCisJMHgzNmZjLCAweDAwNzgsIDB4MzY3NywgMHg4NmZmLCAweDAwYzAsIDB4MzZmYSwgMHg3MTIwLCAweDgxMGIsCisJMHgwMDc4LCAweDJiMmMsIDB4NzAyZiwgMHgwMDAxLCAweDcxMWUsIDB4NzAyMCwgMHhhNjAwLCAweDcwMjIsCisJMHg3NzJhLCAweDIwNjEsIDB4YTNkMSwgMHg2MDA3LCAweDAwMDAsIDB4NjYxMiwgMHg3MDI0LCAweDYwMGUsCisJMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwgMHg2NTMyLCAweDJjMTAsIDB4MTA3OCwgMHgxM2QxLCAweDcwMDcsCisJMHgwMDAyLCAweDcwMWIsIDB4MzcxNCwgMHgwMDdjLCAweDcwMmMsIDB4YTAwNSwgMHgwMGMwLCAweDM3MjYsCisJMHg3MTFjLCAweDcwMjQsIDB4MjBhMCwgMHg3NzI4LCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweGEzZDEsCisJMHg2MjI0LCAweDYzMjgsIDB4NjQyYywgMHg2NTMwLCAweDAwNzgsIDB4MzY3NywgMHg3MTIwLCAweDgxMGIsCisJMHgwMDc4LCAweDJiMmMsIDB4MjAyOSwgMHgwMDdlLCAweDc5MjQsIDB4N2EyOCwgMHg3YjJjLCAweDdjMzgsCisJMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsIDB4MDA0OCwgMHgyYjVhLCAweGE1MDIsCisJMHgwMDQ4LCAweDJiNWEsIDB4YTE4NCwgMHgwMGZmLCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiNWEsCisJMHhhNTAyLCAweDAwNDgsIDB4MmI1YSwgMHhhMjg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsCisJMHgwMDQ4LCAweDJiNWEsIDB4YTUwMiwgMHgwMDQ4LCAweDJiNWEsIDB4YTI4NCwgMHgwMGZmLCAweGEwZTIsCisJMHgwMDIwLCAweDAwNDgsIDB4MmI1YSwgMHhhNTAyLCAweDAwNDgsIDB4MmI1YSwgMHhhMzg0LCAweGZmMDAsCisJMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiNWEsIDB4YTUwMiwgMHgwMDQ4LCAweDJiNWEsCisJMHhhMzg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsIDB4MmI1YSwgMHhhNTAyLCAweDAwNDgsCisJMHgyYjVhLCAweGE0ODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwMDQ4LCAweDJiNWEsCisJMHhhNTAyLCAweDAwNDgsIDB4MmI1YSwgMHhhNDg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDAwNDgsCisJMHgyYjVhLCAweGE1MDIsIDB4MDA0OCwgMHgyYjVhLCAweDIwNjEsIDB4YTVhMywgMHg2MTAyLCAweDYyMDYsCisJMHg2MzBhLCAweDY0MGUsIDB4MDA3OCwgMHgyYjJjLCAweDAwN2UsIDB4MjAwMSwgMHhhMzUyLCAweDIwMDQsCisJMHhkMGNjLCAweDAwN2YsIDB4MDA3YywgMHgwMDdlLCAweDIwMDEsIDB4YTM3MSwgMHgyMDA0LCAweGQwYmMsCisJMHgwMDdmLCAweDAwN2MsIDB4NjE2MCwgMHg3YTI0LCAweDYzMDAsIDB4ODJmZiwgMHgwMGMwLCAweDM3OWIsCisJMHg3OTI2LCAweDAwNzgsIDB4MmIyYywgMHg4M2ZmLCAweDAwYzAsIDB4MmI1YSwgMHgyMDAxLCAweGZmZjAsCisJMHhhMjAwLCAweDAwYzgsIDB4MmI1YSwgMHgyMDE5LCAweGZmZmYsIDB4NjA2NCwgMHhhMzAyLCAweGEyMDAsCisJMHgwMDQ4LCAweDJiNWEsIDB4NzkyNiwgMHg2MjYyLCAweDAwNzgsIDB4MmIyYywgMHgyMDAxLCAweGEzMDAsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDJiNTYsIDB4N2MyOCwgMHg3ZDI0LCAweDdlMzgsCisJMHg3ZjJjLCAweDEwNzgsIDB4MzUxOCwgMHgwMDQwLCAweDJiNTYsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTksCisJMHgwMDAwLCAweDcwMjMsIDB4MDAwMCwgMHg3MDJmLCAweDAwMDAsIDB4YWQ4MCwgMHgwMDAzLCAweDcwMjYsCisJMHgyMGEwLCAweGExZTAsIDB4YTQzNCwgMHgyYzY0LCAweDhjZmYsIDB4MDA0MCwgMHgzN2U4LCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4MzdkZCwgMHg2MDA0LCAweGEwODQsCisJMHhmZjAwLCAweGEwODYsIDB4MDYwMCwgMHgwMGMwLCAweDM3ZTgsIDB4NjAxNCwgMHgyMGEyLCAweDk0YTAsCisJMHg2MDEwLCAweDgwMDcsIDB4YTEwNSwgMHg4MDA3LCAweDIwYTIsIDB4OTRhMCwgMHhhMzk4LCAweDAwMDIsCisJMHg4MTA4LCAweGExODIsIDB4MDBmZiwgMHgwMDQwLCAweDM3ZjMsIDB4YTM4NiwgMHgwMDJhLCAweDAwNDAsCisJMHgzN2ZjLCAweDAwNzgsIDB4MzdjOSwgMHg4M2ZmLCAweDAwYzAsIDB4MzdmYSwgMHg3MTIwLCAweDgxMGMsCisJMHgwMDc4LCAweDJiMmMsIDB4NzAyZiwgMHgwMDAxLCAweDcxMWUsIDB4NzAyMCwgMHhhMzAwLCAweDcwMjIsCisJMHgyMDYxLCAweGEzZDEsIDB4NjAwNywgMHgwMDAwLCAweDYzMTIsIDB4NzAyNCwgMHg2MDBlLCAweDY0MjYsCisJMHg2NTJhLCAweDY2MmUsIDB4NjczMiwgMHgyYzEwLCAweDEwNzgsIDB4MTNkMSwgMHg3MDA3LCAweDAwMDIsCisJMHg3MDFiLCAweDM4MTMsIDB4MDA3YywgMHg3MDJjLCAweGEwMDUsIDB4MDBjMCwgMHgzODI0LCAweDcxMWMsCisJMHg3MDI0LCAweDIwYTAsIDB4MjAxOSwgMHgwMDAwLCAweDIwNjEsIDB4YTNkMSwgMHg2NDI0LCAweDY1MjgsCisJMHg2NjJjLCAweDY3MzAsIDB4MDA3OCwgMHgzN2M5LCAweDcxMjAsIDB4ODEwYywgMHgwMDc4LCAweDJiMmMsCisJMHg4MWZmLCAweDAwYzAsIDB4MmI1NiwgMHg2MGM4LCAweGQwOWMsIDB4MDA0MCwgMHgyYjU2LCAweDEwNzgsCisJMHgzNTE4LCAweDAwNDAsIDB4MmI1NiwgMHg3OTI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgxMDc4LCAweDM1NjIsIDB4NzAxYiwgMHgzODNkLCAweDAwN2MsIDB4MGQ3ZSwgMHhhZGU4LCAweDAwMGQsCisJMHg2ODI4LCAweGEwYmUsIDB4NzAwMCwgMHgwMDQwLCAweDM4NTAsIDB4YTBiZSwgMHg3MTAwLCAweDAwNDAsCisJMHgzODUwLCAweGEwYmUsIDB4NzIwMCwgMHgwMDQwLCAweDM4NTAsIDB4MGQ3ZiwgMHgwMDc4LCAweDJiNWEsCisJMHg2ODIwLCAweDY5MjQsIDB4MTA3OCwgMHgyNGUzLCAweDAwYzAsIDB4Mzg3YiwgMHgxMDc4LCAweDQ0OTksCisJMHgwMGMwLCAweDM4N2IsIDB4NzEyMiwgMHg2NjEyLCAweDY1MTYsIDB4NmUxOCwgMHgwYzdlLCAweDEwNzgsCisJMHgzNTE4LCAweDAwNDAsIDB4Mzg3YiwgMHgxMDc4LCAweDM1MTgsIDB4MDA0MCwgMHgzODdiLCAweDBjN2YsCisJMHgwZDdmLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODIzLCAweDAwMDAsCisJMHg2ODA0LCAweDIwNjgsIDB4MTA3OCwgMHg4YmJkLCAweDAwNDAsIDB4MmI1NiwgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDM4N2UsIDB4MDA3YywgMHgwZDdmLCAweDAwNzgsIDB4MmI1NiwgMHg3MTIwLCAweDEwNzgsCisJMHgyOTIxLCAweDY4MjAsIDB4YTA4NiwgMHg4MDAxLCAweDAwNDAsIDB4MmI1NiwgMHgyZDAwLCAweDcwMWUsCisJMHg2ODA0LCAweGEwODAsIDB4MDAwMiwgMHgwMDdlLCAweDIwYTksIDB4MDAyYSwgMHgyMDk4LCAweDIwYTAsCisJMHgxMDc4LCAweDQxYmUsIDB4MDA3ZiwgMHhhZGU4LCAweDAwMGQsIDB4NmEwOCwgMHg2YjBjLCAweDZjMTAsCisJMHg2ZDE0LCAweDIwNjEsIDB4YTNkMSwgMHg2MDA3LCAweDAwMDAsIDB4NmUwMCwgMHg2ZjI4LCAweGE3YzYsCisJMHg3MDAwLCAweDAwYzAsIDB4MzhhNSwgMHgwMDc4LCAweDM4YTksIDB4YTdjNiwgMHg3MTAwLCAweDAwYzAsCisJMHgzOGIxLCAweGE2YzIsIDB4MDAwNCwgMHgwMDQ4LCAweDJiNWEsIDB4MjAwOSwgMHgwMDA0LCAweDAwNzgsCisJMHgzNTY2LCAweGE3YzYsIDB4NzIwMCwgMHgwMGMwLCAweDJiNWEsIDB4YTZjMiwgMHgwMDU0LCAweDAwNDgsCisJMHgyYjVhLCAweDYwMGUsIDB4NjAxMywgMHgwMDJhLCAweDYyMjYsIDB4NjMyYSwgMHg2NDJlLCAweDY1MzIsCisJMHgyYzEwLCAweDEwNzgsIDB4MTNkMSwgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHgzOGM4LCAweDAwN2MsCisJMHg3MDFjLCAweDIwNjgsIDB4NjgwNCwgMHhhMDgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDgwLCAweDAwMDIsCisJMHgwMDdlLCAweDIwYTksIDB4MDAyYSwgMHgyMDk4LCAweDIwYTAsIDB4MTA3OCwgMHg0MWJlLCAweDAwN2YsCisJMHgyMDA5LCAweDAwMmEsIDB4MjA2MSwgMHhhM2QxLCAweDYyMjQsIDB4NjMyOCwgMHg2NDJjLCAweDY1MzAsCisJMHgwMDc4LCAweDM1NjYsIDB4ODFmZiwgMHgwMGMwLCAweDJiNTYsIDB4MTA3OCwgMHgzNTMwLCAweDAwNDAsCisJMHgyYjVhLCAweDEwNzgsIDB4NDVhNywgMHgwMDQwLCAweDJiNTYsIDB4MTA3OCwgMHg0NzEwLCAweDAwNzgsCisJMHgyYjJjLCAweDc4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDMxNTAsIDB4MTA3OCwgMHgzNTQyLCAweDAwNDAsCisJMHgyYjVhLCAweDBjN2UsIDB4MTA3OCwgMHgzNTE4LCAweDBjN2YsIDB4MDBjMCwgMHgzOTAzLCAweDIwMDksCisJMHgwMDAyLCAweDAwNzgsIDB4MmI1NiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsCisJMHgwMDQwLCAweDM5MTAsIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4MzkxMCwgMHhhMDhlLCAweDAwMDUsCisJMHgwMGMwLCAweDM5MzQsIDB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBiNCwgMHgwMDQwLCAweDMxODUsCisJMHg2MDAwLCAweGQwOGMsIDB4MDBjMCwgMHgzMTg1LCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDEwNzgsIDB4OGJkOSwgMHgwMGMwLCAweDM5MjksIDB4MjAwOSwgMHgwMDAzLCAweDAwNzgsCisJMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM5MmUsIDB4MDA3YywgMHgxMDc4LCAweDM1NDIsCisJMHgwMDQwLCAweDJiNWEsIDB4MDA3OCwgMHgzMTg1LCAweDIwMDksIDB4YTMyZSwgMHgyMTBjLCAweDgxZmYsCisJMHgwMDQwLCAweDM5M2UsIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsIDB4MmI1NiwgMHgyMDAxLCAweGEzMDAsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDM5NDksIDB4MjAwOSwgMHgwMDA3LCAweDAwNzgsCisJMHgyYjU2LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYWMsIDB4MDA0MCwgMHgzOTUzLCAweDIwMDksCisJMHgwMDA4LCAweDAwNzgsIDB4MmI1NiwgMHg2MDljLCAweGQwYTQsIDB4MDBjMCwgMHgzOTVhLCAweGQwYWMsCisJMHgwMGMwLCAweDMxODUsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDEwNzgsIDB4OGM0ZCwgMHgwMGMwLCAweDM5NjksIDB4MjAwOSwgMHgwMDAzLCAweDAwNzgsCisJMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM5NmUsIDB4MDA3YywgMHg2ODMwLCAweGEwODYsCisJMHgwMTAwLCAweDAwYzAsIDB4Mzk3NywgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHgyYjU2LCAweDEwNzgsCisJMHgzNTQyLCAweDAwNDAsIDB4MmI1YSwgMHgwMDc4LCAweDM5MTIsIDB4ODFmZiwgMHgyMDA5LCAweDAwMDEsCisJMHgwMGMwLCAweDJiNTYsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MjAwOSwgMHgwMDA3LCAweDAwYzAsCisJMHgyYjU2LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYWMsIDB4MjAwOSwgMHgwMDA4LCAweDAwYzAsCisJMHgyYjU2LCAweDEwNzgsIDB4MzU0MiwgMHgwMDQwLCAweDJiNWEsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDYsIDB4MjAwOSwgMHgwMDA5LCAweDAwYzAsIDB4MmI1NiwgMHgwYzdlLCAweDEwNzgsCisJMHgzNTE4LCAweDBjN2YsIDB4MjAwOSwgMHgwMDAyLCAweDAwNDAsIDB4MmI1NiwgMHg2ODM3LCAweDAwMDAsCisJMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsIDB4NzkyOCwgMHhhMTk0LCAweGZmMDAsCisJMHhhMThjLCAweDAwZmYsIDB4YTAwNiwgMHg4MmZmLCAweDAwYzAsIDB4MzliYywgMHhjMGVkLCAweDY5NTIsCisJMHg3OTJjLCAweDY5NTYsIDB4MDA3OCwgMHgzOWM1LCAweGEyOGUsIDB4MDEwMCwgMHgwMGMwLCAweDJiNWEsCisJMHhjMGU1LCAweDY4NTMsIDB4MDAwMCwgMHg2ODU3LCAweDAwMDAsIDB4NjgzZSwgMHgxMDc4LCAweDhkZjYsCisJMHgyMDA5LCAweDAwMDMsIDB4MDA0MCwgMHgyYjU2LCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM5ZDEsCisJMHgwMDdjLCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLCAweDJiNTYsCisJMHgwMDc4LCAweDJiMmMsIDB4ODFmZiwgMHgyMDA5LCAweDAwMDEsIDB4MDBjMCwgMHgyYjU2LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDMsIDB4MjAwOSwgMHgwMDA3LCAweDAwYzAsIDB4MmI1NiwgMHgxMDc4LCAweDM1NDIsCisJMHgwMDQwLCAweDJiNWEsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDIwMDksCisJMHgwMDA5LCAweDAwYzAsIDB4MmI1NiwgMHgwYzdlLCAweDEwNzgsIDB4MzUxOCwgMHgwYzdmLCAweDIwMDksCisJMHgwMDAyLCAweDAwNDAsIDB4MmI1NiwgMHhhZDgwLCAweDAwMGYsIDB4MjAwOSwgMHgwMDA4LCAweDdhMmMsCisJMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgxMDc4LCAweDM1NjIsIDB4NzAxYiwgMHgzYTA4LCAweDAwN2MsCisJMHgwZDdlLCAweGFkZTgsIDB4MDAwZiwgMHg2ODAwLCAweGEwODYsIDB4MDUwMCwgMHgwMGMwLCAweDNhMWIsCisJMHg2ODA0LCAweGEwMDUsIDB4MDBjMCwgMHgzYTFiLCAweDY4MDgsIDB4YTA4NCwgMHhmZjAwLCAweDAwYzAsCisJMHgzYTFiLCAweDAwNzgsIDB4M2ExZSwgMHgwZDdmLCAweDAwYzAsIDB4MmI1YSwgMHgwZDdmLCAweDY4MzcsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwYzdlLCAweDEwNzgsCisJMHgzNTQyLCAweDAwYzAsIDB4M2EyZSwgMHgwYzdmLCAweDAwNzgsIDB4MmI1YSwgMHgxMDc4LCAweDhlNTIsCisJMHgyMDA5LCAweDAwMDMsIDB4MGM3ZiwgMHgwMDQwLCAweDJiNTYsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzYTNhLCAweDAwN2MsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MjAwOSwgMHgwMDA0LCAweDAwNDAsCisJMHgyYjU2LCAweDAwNzgsIDB4MmIyYywgMHgxMjdlLCAweDBjN2UsIDB4MGU3ZSwgMHgyMDYxLCAweDAxMDAsCisJMHgyMDcxLCAweGEzMDAsIDB4NjA0NCwgMHhkMGE0LCAweDAwYzAsIDB4M2E2YywgMHhkMDg0LCAweDAwNDAsCisJMHgzYTU1LCAweDEwNzgsIDB4M2JjYywgMHgwMDc4LCAweDNhNjgsIDB4ZDA4YywgMHgwMDQwLCAweDNhNWMsCisJMHgxMDc4LCAweDNhZTMsIDB4MDA3OCwgMHgzYTY4LCAweGQwOTQsIDB4MDA0MCwgMHgzYTYzLCAweDEwNzgsCisJMHgzYWI3LCAweDAwNzgsIDB4M2E2OCwgMHhkMDljLCAweDAwNDAsIDB4M2E2OCwgMHgxMDc4LCAweDNhNzYsCisJMHgwZTdmLCAweDBjN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDAxN2UsIDB4NjEyOCwgMHhkMTljLCAweDAwYzAsCisJMHgzYTczLCAweGMxOWQsIDB4NjEyYSwgMHgwMTdmLCAweDAwNzgsIDB4M2E2OCwgMHg2MjRjLCAweGEyODYsCisJMHhmMGYwLCAweDAwYzAsIDB4M2E4NywgMHg2MDQ4LCAweGEwODYsIDB4ZjBmMCwgMHgwMDQwLCAweDNhODcsCisJMHg2MjRhLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsIDB4MDA3OCwgMHgzYWI2LCAweGEyOTQsCisJMHhmZjAwLCAweGEyOTYsIDB4ZjcwMCwgMHgwMDQwLCAweDNhOWMsIDB4NzEzNCwgMHhkMWE0LCAweDAwYzAsCisJMHgzYTljLCAweDYyNDAsIDB4YTI5NCwgMHgwMDEwLCAweDAwNDAsIDB4M2E5YywgMHgyMDA5LCAweDAwZjcsCisJMHgxMDc4LCAweDQxZGUsIDB4MDA3OCwgMHgzYWI2LCAweDYwNDMsIDB4MDA0MCwgMHg2MDQzLCAweDAwMDAsCisJMHg3MDczLCAweDAwMDAsIDB4NzA4YiwgMHgwMDAxLCAweDcwYWYsIDB4MDAwMCwgMHg3MGNiLCAweDAwMDAsCisJMHgyMDA5LCAweGE5YzAsIDB4MjAwYiwgMHgwMDAwLCAweDcwODMsIDB4MDAwMCwgMHg3MDc3LCAweDAwMGYsCisJMHgyMDA5LCAweDAwMGYsIDB4MjAxMSwgMHg0MTIyLCAweDEwNzgsIDB4NTk2YywgMHgwMDdjLCAweDE1N2UsCisJMHg3MDc0LCAweGEwMDUsIDB4MDBjMCwgMHgzYWUxLCAweDIwMTEsIDB4NDEyMiwgMHgxMDc4LCAweDU4ZDQsCisJMHg2MDQwLCAweGEwOTQsIDB4MDAxMCwgMHhhMjg1LCAweDAwMjAsIDB4NjA0MiwgMHgyMGE5LCAweDAwYzgsCisJMHg2MDQ0LCAweGQwOGMsIDB4MDBjMCwgMHgzYWRhLCAweDAwZjAsIDB4M2FjOCwgMHg2MjQyLCAweDcwODcsCisJMHgwMDAwLCAweDYwNDAsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDA4MCwgMHg2MDQyLCAweDYyNDIsCisJMHgwMDc4LCAweDNhZTEsIDB4NjI0MiwgMHg3MDg3LCAweDAwMDAsIDB4NzA3YiwgMHgwMDAwLCAweDAwNzgsCisJMHgzYWUxLCAweDE1N2YsIDB4MDA3YywgMHg3MDc4LCAweGEwOGEsIDB4MDAwMywgMHgwMGM4LCAweDNhZWMsCisJMHgxMDc5LCAweDNhZWYsIDB4MDA3OCwgMHgzYWVlLCAweDEwNzgsIDB4MTMyOCwgMHgwMDdjLCAweDNhZjIsCisJMHgzYjQxLCAweDNiY2IsIDB4MGY3ZSwgMHg3MDdiLCAweDAwMDEsIDB4MjBlMSwgMHhhMDAwLCAweDIwZTEsCisJMHg4NzAwLCAweDEwNzgsIDB4MjE4YiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwNzksCisJMHhhODAwLCAweDIwN2IsIDB4MjIwMCwgMHg3ODA3LCAweDAwZWYsIDB4NzgwYiwgMHgwMDAwLCAweDc4MGYsCisJMHgwMGVmLCAweDc4MTMsIDB4MDEzOCwgMHg3ODE3LCAweDAwMDAsIDB4NzgxYiwgMHgwMDAwLCAweDc4MWYsCisJMHgwMDAwLCAweDc4MjMsIDB4ZmZmZiwgMHg3ODI3LCAweGZmZmYsIDB4NzgyYiwgMHgwMDAwLCAweDc4MmYsCisJMHgwMDAwLCAweDIwNzksIDB4YTgwYywgMHgyMDdiLCAweDExMDEsIDB4NzgwNywgMHgwMDAwLCAweDIwOTksCisJMHhhMzA1LCAweDIwYTEsIDB4YTgwZSwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDc5LCAweGE4MTIsCisJMHgyMDdiLCAweDAwMDAsIDB4NzgwNywgMHgwMDAwLCAweDIwOTksIDB4YTgwMCwgMHgyMGExLCAweDAyMGIsCisJMHgyMGE5LCAweDAwMTQsIDB4NTNhNiwgMHg2MGMzLCAweDAwMGMsIDB4NjAwZiwgMHgwMDAwLCAweDEwNzgsCisJMHg0MTU4LCAweDBmN2YsIDB4NzA3ZiwgMHgwMDAwLCAweDYwNDMsIDB4MDAwOCwgMHg2MDQzLCAweDAwMDAsCisJMHgwMDdjLCAweDBkN2UsIDB4NzA3YywgMHg3MDdmLCAweDAwMDAsIDB4YTAyNSwgMHgwMDQwLCAweDNiYjUsCisJMHg2MDIwLCAweGQwYjQsIDB4MDBjMCwgMHgzYmIzLCAweDcxODgsIDB4ODFmZiwgMHgwMDQwLCAweDNiYTIsCisJMHhhNDg2LCAweDAwMGMsIDB4MDBjMCwgMHgzYmFkLCAweGE0ODAsIDB4MDAxOCwgMHg4MDA0LCAweDIwYTgsCisJMHgyMDExLCAweGE4ODAsIDB4MjAxOSwgMHhhODAwLCAweDIyMGMsIDB4MjMwNCwgMHhhMTA2LCAweDAwYzAsCisJMHgzYjc5LCAweDgyMTAsIDB4ODMxOCwgMHgwMGYwLCAweDNiNWMsIDB4NjA0MywgMHgwMDA0LCAweDYwOGIsCisJMHhiYzk0LCAweDYwOGYsIDB4ZjBmMCwgMHg2MDQzLCAweDAwMDYsIDB4NzA3YiwgMHgwMDAyLCAweDcwODcsCisJMHgwMDAyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OTZjLCAweDAwNzgsCisJMHgzYmIzLCAweDIwNjksIDB4YTg4MCwgMHg2OTMwLCAweGExOGUsIDB4MTEwMSwgMHgwMGMwLCAweDNiYWQsCisJMHg2ODM0LCAweGEwMDUsIDB4MDBjMCwgMHgzYmFkLCAweDY5MDAsIDB4YTE4YywgMHgwMGZmLCAweDAwYzAsCisJMHgzYjhkLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLCAweDNiYTIsIDB4MjAxMSwgMHhhODhlLCAweDIwMTksCisJMHhhMzA1LCAweDIwYTksIDB4MDAwNCwgMHgyMjBjLCAweDIzMDQsIDB4YTEwMiwgMHgwMDQ4LCAweDNiYTAsCisJMHgwMGMwLCAweDNiYWQsIDB4ODIxMCwgMHg4MzE4LCAweDAwZjAsIDB4M2I5MywgMHgwMDc4LCAweDNiYWQsCisJMHg3MDhiLCAweDAwMDAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGE4ODAsCisJMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDE0LCAweDUzYTYsIDB4NjA0MywgMHgwMDA4LCAweDYwNDMsCisJMHgwMDAwLCAweDAwNzgsIDB4M2JiNSwgMHgwZDdmLCAweDAwN2MsIDB4NjAyMCwgMHhkMGI0LCAweDAwYzAsCisJMHgzYmIzLCAweDYwYzMsIDB4MDAwYywgMHgyMDExLCAweGE1YjUsIDB4MjAxMywgMHgwMDAwLCAweDcwN2YsCisJMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDEwNzgsCisJMHg2YzM4LCAweDAwNzgsIDB4M2JiMywgMHgwMDdjLCAweDcwODQsIDB4YTA4YSwgMHgwMDFkLCAweDAwYzgsCisJMHgzYmQ1LCAweDEwNzksIDB4M2JkOCwgMHgwMDc4LCAweDNiZDcsIDB4MTA3OCwgMHgxMzI4LCAweDAwN2MsCisJMHgzYzAyLCAweDNjMTEsIDB4M2M0MCwgMHgzYzU5LCAweDNjODUsIDB4M2NiMSwgMHgzY2RkLCAweDNkMTMsCisJMHgzZDNmLCAweDNkNjcsIDB4M2RhYSwgMHgzZGQ0LCAweDNkZjYsIDB4M2UwYywgMHgzZTMyLCAweDNlNDUsCisJMHgzZTRlLCAweDNlN2UsIDB4M2VhYSwgMHgzZWQ2LCAweDNmMDIsIDB4M2YzOCwgMHgzZjdkLCAweDNmYWMsCisJMHgzZmNlLCAweDQwMTAsIDB4NDAzNiwgMHg0MDRmLCAweDQwNTAsIDB4MGM3ZSwgMHgyMDYxLCAweGEzMDAsCisJMHg2MDAzLCAweDAwMDcsIDB4MjA2MSwgMHgwMTAwLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY5LCAweDYwMDYsCisJMHgwYzdmLCAweDAwN2MsIDB4NjA4YiwgMHhiYzk0LCAweDYwOGYsIDB4ZjBmMCwgMHg2MDQzLCAweDAwMDIsCisJMHg3MDg3LCAweDAwMDEsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU5NmMsCisJMHgwMDdjLCAweDBmN2UsIDB4NzA3YywgMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzYzNlLCAweDYwNDMsCisJMHgwMDAwLCAweDYwMjAsIDB4ZDBiNCwgMHgwMGMwLCAweDNjM2UsIDB4MjA3OSwgMHhhODgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDIsIDB4MDBjMCwgMHgzYzNjLCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDNjM2MsCisJMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzYzMyLCAweDcwYWMsIDB4YTAwNSwgMHgwMGMwLCAweDNjMzIsCisJMHg3MGFmLCAweDAwMDEsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsIDB4NThkNCwgMHg3MDg3LCAweDAwMTAsCisJMHgxMDc4LCAweDNlNGUsIDB4MDA3OCwgMHgzYzNlLCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsCisJMHg3MDg3LCAweDAwMDMsIDB4NjA0MywgMHgwMDA0LCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsCisJMHgxMDc4LCAweDQxYzYsIDB4MjBhMywgMHgxMTAyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGE5LCAweDAwMGEsCisJMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwgMHgzYzUwLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQxNTgsCisJMHgwMDdjLCAweDBmN2UsIDB4NzA3YywgMHhhMDA1LCAweDAwNDAsIDB4M2M4MywgMHgyMDExLCAweDQxMjksCisJMHgxMDc4LCAweDU4ZDQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2M4MSwgMHgyMDc5LCAweGE4ODAsCisJMHg3YTMwLCAweGEyOTYsIDB4MTEwMiwgMHgwMGMwLCAweDNjODEsIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsCisJMHgzYzgxLCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNjN2IsIDB4NzBhYywgMHhhMDA1LCAweDAwYzAsCisJMHgzYzdiLCAweDcwYWYsIDB4MDAwMSwgMHg3MDg3LCAweDAwMDQsIDB4MTA3OCwgMHgzYzg1LCAweDAwNzgsCisJMHgzYzgzLCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDA1LCAweDEwNzgsCisJMHg0MWM2LCAweDIwYTMsIDB4MTEwMywgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGE4OGUsCisJMHgxMDc4LCAweDQyMTEsIDB4MDBjMCwgMHgzY2EzLCAweDcwNzAsIDB4YTAwNSwgMHgwMGMwLCAweDNjYTMsCisJMHg3MTRjLCAweGExODYsIDB4ZmZmZiwgMHgwMDQwLCAweDNjYTMsIDB4MTA3OCwgMHg0MGVhLCAweDAwNDAsCisJMHgzY2EzLCAweDEwNzgsIDB4NDFmNSwgMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwgMHgyNmEwLCAweDUzYTYsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQxNTgsCisJMHgwMDdjLCAweDBmN2UsIDB4NzA3YywgMHhhMDA1LCAweDAwNDAsIDB4M2NkYiwgMHgyMDExLCAweDQxMjksCisJMHgxMDc4LCAweDU4ZDQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4M2NkOSwgMHgyMDc5LCAweGE4ODAsCisJMHg3YTMwLCAweGEyOTYsIDB4MTEwMywgMHgwMGMwLCAweDNjZDksIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsCisJMHgzY2Q5LCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNjZDMsIDB4NzBhYywgMHhhMDA1LCAweDAwYzAsCisJMHgzY2QzLCAweDcwYWYsIDB4MDAwMSwgMHg3MDg3LCAweDAwMDYsIDB4MTA3OCwgMHgzY2RkLCAweDAwNzgsCisJMHgzY2RiLCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDA3LCAweDEwNzgsCisJMHg0MWM2LCAweDIwYTMsIDB4MTEwNCwgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGE4OGUsCisJMHgxMDc4LCAweDQyMTEsIDB4MDBjMCwgMHgzZDA1LCAweDcwNzAsIDB4YTAwNSwgMHgwMGMwLCAweDNkMDUsCisJMHg3MTUwLCAweGExODYsIDB4ZmZmZiwgMHgwMDQwLCAweDNkMDUsIDB4YTE4MCwgMHgyOTNmLCAweDIwMGMsCisJMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgxMDc4LCAweDQwZWEsIDB4MDA0MCwgMHgzZDA1LCAweDEwNzgsCisJMHgzNzhiLCAweDAwNDAsIDB4M2QwNSwgMHgxMDc4LCAweDI1MDAsIDB4MjBhOSwgMHgwMDA4LCAweDIyOTgsCisJMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLCAweDNkM2QsCisJMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNkM2IsCisJMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDQsIDB4MDBjMCwgMHgzZDNiLCAweDc4MzQsCisJMHhhMDA1LCAweDAwYzAsIDB4M2QzYiwgMHg3YTM4LCAweGQyZmMsIDB4MDA0MCwgMHgzZDM1LCAweDcwYWMsCisJMHhhMDA1LCAweDAwYzAsIDB4M2QzNSwgMHg3MGFmLCAweDAwMDEsIDB4NzA4NywgMHgwMDA4LCAweDEwNzgsCisJMHgzZDNmLCAweDAwNzgsIDB4M2QzZCwgMHgxMDc4LCAweDQxNzEsIDB4MGY3ZiwgMHgwMDdjLCAweDcwODcsCisJMHgwMDA5LCAweDEwNzgsIDB4NDFjNiwgMHgyMGEzLCAweDExMDUsIDB4MjBhMywgMHgwMTAwLCAweDM0MzAsCisJMHgxMDc4LCAweDQyMTEsIDB4MDBjMCwgMHgzZDU4LCAweDcwNzAsIDB4YTAwNSwgMHgwMGMwLCAweDNkNTgsCisJMHgxMDc4LCAweDQwNTEsIDB4MDBjMCwgMHgzZDYyLCAweGEwODUsIDB4MDAwMSwgMHgxMDc4LCAweDI1MDAsCisJMHgyMGE5LCAweDAwMDgsIDB4MjA5OSwgMHhhODhlLCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLCAweDBmN2UsCisJMHg3MDdjLCAweGEwMDUsIDB4MDA0MCwgMHgzZGE4LCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsCisJMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHgzZGE2LCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTA1LCAweDAwYzAsIDB4M2RhNiwgMHg3ODM0LCAweDIwMTEsIDB4MDEwMCwgMHhhMjFlLCAweDAwYzAsCisJMHgzZDkxLCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNkOGIsIDB4NzBhYywgMHhhMDA1LCAweDAwYzAsCisJMHgzZDhiLCAweDcwYWYsIDB4MDAwMSwgMHg3MDg3LCAweDAwMGEsIDB4MTA3OCwgMHgzZGFhLCAweDAwNzgsCisJMHgzZGE4LCAweGEwMDUsIDB4MDBjMCwgMHgzZGE2LCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNkOWUsCisJMHg3MGFjLCAweGEwMDUsIDB4MDBjMCwgMHgzZDllLCAweDcwYWYsIDB4MDAwMSwgMHg3MDgzLCAweDAwMDAsCisJMHg3MDg3LCAweDAwMGUsIDB4MTA3OCwgMHgzZTMyLCAweDAwNzgsIDB4M2RhOCwgMHgxMDc4LCAweDQxNzEsCisJMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDBiLCAweDIwMTEsIDB4YTgwZSwgMHgyMmEwLCAweDIwYTksCisJMHgwMDQwLCAweDIwMTksIDB4ZmZmZiwgMHg0M2E0LCAweDIwYTksIDB4MDAwMiwgMHgyMDA5LCAweDAwMDAsCisJMHg0MWE0LCAweDEwNzgsIDB4NDFjNiwgMHgyMGEzLCAweDExMDYsIDB4MjBhMywgMHgwMDAwLCAweDEwNzgsCisJMHg0MjExLCAweDAwNDAsIDB4M2RjNywgMHgyMDEzLCAweDAwMDAsIDB4MDA3OCwgMHgzZGNiLCAweDYwMzAsCisJMHhhMDg1LCAweDAxMDAsIDB4MjAxMiwgMHgyMjk4LCAweDIwYTksIDB4MDA0MiwgMHg1M2E2LCAweDYwYzMsCisJMHgwMDg0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLCAweDBmN2UsIDB4NzA3YywgMHhhMDA1LCAweDAwNDAsCisJMHgzZGY0LCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsIDB4YTA4NiwgMHgwMDg0LCAweDAwYzAsCisJMHgzZGYyLCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNiwgMHgwMGMwLCAweDNkZjIsCisJMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHgzZGYyLCAweDcwODcsIDB4MDAwYywgMHgxMDc4LCAweDNkZjYsCisJMHgwMDc4LCAweDNkZjQsIDB4MTA3OCwgMHg0MTcxLCAweDBmN2YsIDB4MDA3YywgMHg3MDg3LCAweDAwMGQsCisJMHgxMDc4LCAweDQxYzYsIDB4MjBhMywgMHgxMTA3LCAweDIwYTMsIDB4MDAwMCwgMHgyMDk5LCAweGE4OGUsCisJMHgyMGE5LCAweDAwNDAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDg0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLCAweDBmN2UsIDB4NzA3YywgMHhhMDA1LCAweDAwNDAsCisJMHgzZTMwLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsIDB4YTA4NiwgMHgwMDg0LCAweDAwYzAsCisJMHgzZTJlLCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNywgMHgwMGMwLCAweDNlMmUsCisJMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHgzZTJlLCAweDcwODMsIDB4MDAwMSwgMHgxMDc4LCAweDQxYjgsCisJMHg3MDg3LCAweDAwMGUsIDB4MTA3OCwgMHgzZTMyLCAweDAwNzgsIDB4M2UzMCwgMHgxMDc4LCAweDQxNzEsCisJMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDBmLCAweDcwN2YsIDB4MDAwMCwgMHg2MDhiLCAweGJjODUsCisJMHg2MDhmLCAweGI1YjUsIDB4NjA0MywgMHgwMDA1LCAweDYwNDMsIDB4MDAwNCwgMHgyMDA5LCAweDA3ZDAsCisJMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGM3LCAweDAwN2MsIDB4NzA3YywgMHhhMDA1LCAweDAwNDAsCisJMHgzZTRkLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsIDB4MDA3YywgMHg3MDg3LCAweDAwMTEsCisJMHgxMDc4LCAweDQyMTEsIDB4MDBjMCwgMHgzZTY3LCAweDcxNjgsIDB4ODFmZiwgMHgwMDQwLCAweDNlNjcsCisJMHgyMDA5LCAweDAwMDAsIDB4NzA2YywgMHhhMDg0LCAweDAwZmYsIDB4MTA3OCwgMHgyNGUzLCAweGExODYsCisJMHgwMDgwLCAweDAwNDAsIDB4M2U2NywgMHgyMDExLCAweGE4OGUsIDB4MTA3OCwgMHg0MGVhLCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGE4ODAsIDB4MjBhMSwgMHgwMjBiLCAweDc0N2MsCisJMHhhNDgwLCAweDAwMTgsIDB4YTA4MCwgMHgwMDA3LCAweGEwODQsIDB4MDNmOCwgMHg4MDA0LCAweDIwYTgsCisJMHg1M2E2LCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLCAweDcwN2MsCisJMHhhMDA1LCAweDAwNDAsIDB4M2VhOCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweGEwODYsCisJMHgwMDE0LCAweDAwYzAsIDB4M2VhNiwgMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDMsCisJMHgwMGMwLCAweDNlYTYsIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2VhNiwgMHg3YTM4LCAweGQyZmMsCisJMHgwMDQwLCAweDNlYTAsIDB4NzBhYywgMHhhMDA1LCAweDAwYzAsIDB4M2VhMCwgMHg3MGFmLCAweDAwMDEsCisJMHg3MDg3LCAweDAwMTIsIDB4MTA3OCwgMHgzZWFhLCAweDAwNzgsIDB4M2VhOCwgMHgxMDc4LCAweDQxNzEsCisJMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDEzLCAweDEwNzgsIDB4NDFkMiwgMHgyMGEzLCAweDExMDMsCisJMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGE4OGUsIDB4MTA3OCwgMHg0MjExLCAweDAwYzAsCisJMHgzZWM4LCAweDcwNzAsIDB4YTAwNSwgMHgwMGMwLCAweDNlYzgsIDB4NzE0YywgMHhhMTg2LCAweGZmZmYsCisJMHgwMDQwLCAweDNlYzgsIDB4MTA3OCwgMHg0MGVhLCAweDAwNDAsIDB4M2VjOCwgMHgxMDc4LCAweDQxZjUsCisJMHgyMGE5LCAweDAwMDgsIDB4MjI5OCwgMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDQxNTgsIDB4MDA3YywgMHgwZjdlLCAweDcwN2MsCisJMHhhMDA1LCAweDAwNDAsIDB4M2YwMCwgMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweGEwODYsCisJMHgwMDE0LCAweDAwYzAsIDB4M2VmZSwgMHgyMDc5LCAweGE4ODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDQsCisJMHgwMGMwLCAweDNlZmUsIDB4NzgzNCwgMHhhMDA1LCAweDAwYzAsIDB4M2VmZSwgMHg3YTM4LCAweGQyZmMsCisJMHgwMDQwLCAweDNlZjgsIDB4NzBhYywgMHhhMDA1LCAweDAwYzAsIDB4M2VmOCwgMHg3MGFmLCAweDAwMDEsCisJMHg3MDg3LCAweDAwMTQsIDB4MTA3OCwgMHgzZjAyLCAweDAwNzgsIDB4M2YwMCwgMHgxMDc4LCAweDQxNzEsCisJMHgwZjdmLCAweDAwN2MsIDB4NzA4NywgMHgwMDE1LCAweDEwNzgsIDB4NDFkMiwgMHgyMGEzLCAweDExMDQsCisJMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGE4OGUsIDB4MTA3OCwgMHg0MjExLCAweDAwYzAsCisJMHgzZjJhLCAweDcwNzAsIDB4YTAwNSwgMHgwMGMwLCAweDNmMmEsIDB4NzE1MCwgMHhhMTg2LCAweGZmZmYsCisJMHgwMDQwLCAweDNmMmEsIDB4YTE4MCwgMHgyOTNmLCAweDIwMGMsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHgxMDc4LCAweDQwZWEsIDB4MDA0MCwgMHgzZjJhLCAweDEwNzgsIDB4Mzc4YiwgMHgwMDQwLCAweDNmMmEsCisJMHgxMDc4LCAweDI1MDAsIDB4MjBhOSwgMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg0MTU4LCAweDAwN2MsCisJMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLCAweDNmN2IsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsCisJMHg1OGQ0LCAweGEwODYsIDB4MDAxNCwgMHgwMGMwLCAweDNmNzksIDB4MjA3OSwgMHhhODgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDUsIDB4MDBjMCwgMHgzZjc5LCAweDc4MzQsIDB4MjAxMSwgMHgwMTAwLCAweGEyMWUsCisJMHgwMGMwLCAweDNmNWUsIDB4N2EzOCwgMHhkMmZjLCAweDAwNDAsIDB4M2Y1YywgMHg3MGFjLCAweGEwMDUsCisJMHgwMGMwLCAweDNmNWMsIDB4NzBhZiwgMHgwMDAxLCAweDAwNzgsIDB4M2Y2ZCwgMHhhMDA1LCAweDAwYzAsCisJMHgzZjc5LCAweDdhMzgsIDB4ZDJmYywgMHgwMDQwLCAweDNmNmIsIDB4NzBhYywgMHhhMDA1LCAweDAwYzAsCisJMHgzZjZiLCAweDcwYWYsIDB4MDAwMSwgMHg3MDgzLCAweDAwMDAsIDB4N2EzOCwgMHhkMmY0LCAweDAwNDAsCisJMHgzZjczLCAweDcwY2IsIDB4MDAwOCwgMHg3MDg3LCAweDAwMTYsIDB4MTA3OCwgMHgzZjdkLCAweDAwNzgsCisJMHgzZjdiLCAweDEwNzgsIDB4NDE3MSwgMHgwZjdmLCAweDAwN2MsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDIwOTksIDB4YTg4MCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBlLCAweDUzYTYsCisJMHgzNDMwLCAweDIwMTEsIDB4YTg4ZSwgMHg3MDg3LCAweDAwMTcsIDB4MTA3OCwgMHg0MjExLCAweDAwYzAsCisJMHgzZjlkLCAweDcwNzAsIDB4YTAwNSwgMHgwMGMwLCAweDNmOWQsIDB4MTA3OCwgMHg0MDUxLCAweDAwYzAsCisJMHgzZmE3LCAweGEwODUsIDB4MDAwMSwgMHgxMDc4LCAweDI1MDAsIDB4MjBhOSwgMHgwMDA4LCAweDIwOTksCisJMHhhODhlLCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLCAweDBmN2UsIDB4NzA3YywgMHhhMDA1LCAweDAwNDAsCisJMHgzZmNjLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsIDB4YTA4NiwgMHgwMDg0LCAweDAwYzAsCisJMHgzZmNhLCAweDIwNzksIDB4YTg4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNiwgMHgwMGMwLCAweDNmY2EsCisJMHg3ODM0LCAweGEwMDUsIDB4MDBjMCwgMHgzZmNhLCAweDcwODcsIDB4MDAxOCwgMHgxMDc4LCAweDNmY2UsCisJMHgwMDc4LCAweDNmY2MsIDB4MTA3OCwgMHg0MTcxLCAweDBmN2YsIDB4MDA3YywgMHg3MDg3LCAweDAwMTksCisJMHgxMDc4LCAweDQxZDIsIDB4MjBhMywgMHgxMTA2LCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLCAweDIwOTksCisJMHhhODhlLCAweDIwMzksIDB4YTgwZSwgMHgyN2EwLCAweDIwYTksIDB4MDA0MCwgMHg1M2EzLCAweDEwNzgsCisJMHg0MjExLCAweDAwYzAsIDB4NDAwMiwgMHgyNzI4LCAweDI1MTQsIDB4ODIwNywgMHhhMDg0LCAweDAwZmYsCisJMHg4MDAwLCAweDIwMTgsIDB4YTI5NCwgMHgwMGZmLCAweDgwMDcsIDB4YTIwNSwgMHgyMDJhLCAweDYwMzAsCisJMHgyMzEwLCAweDgyMTQsIDB4YTJhMCwgMHhhODBlLCAweDI0MTQsIDB4YTM4YywgMHgwMDAxLCAweDAwNDAsCisJMHgzZmZkLCAweGEyOTQsIDB4ZmYwMCwgMHgwMDc4LCAweDQwMDAsIDB4YTI5NCwgMHgwMGZmLCAweDgwMDcsCisJMHhhMjE1LCAweDIyMjIsIDB4Mjc5OCwgMHgyNmEwLCAweDIwYTksIDB4MDA0MCwgMHg1M2E2LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwODQsIDB4MTA3OCwgMHg0MTU4LCAweDAwN2MsCisJMHgwZjdlLCAweDcwN2MsIDB4YTAwNSwgMHgwMDQwLCAweDQwMzQsIDB4MjAxMSwgMHg0MTI5LCAweDEwNzgsCisJMHg1OGQ0LCAweGEwODYsIDB4MDA4NCwgMHgwMGMwLCAweDQwMzIsIDB4MjA3OSwgMHhhODgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDcsIDB4MDBjMCwgMHg0MDMyLCAweDc4MzQsIDB4YTAwNSwgMHgwMGMwLCAweDQwMzIsCisJMHg3MDgzLCAweDAwMDEsIDB4MTA3OCwgMHg0MWI4LCAweDcwODcsIDB4MDAxYSwgMHgxMDc4LCAweDQwMzYsCisJMHgwMDc4LCAweDQwMzQsIDB4MTA3OCwgMHg0MTcxLCAweDBmN2YsIDB4MDA3YywgMHg3MDg3LCAweDAwMWIsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksIDB4YTg4MCwgMHgyMGExLCAweDAyMGIsCisJMHg3NDdjLCAweGE0ODAsIDB4MDAxOCwgMHhhMDgwLCAweDAwMDcsIDB4YTA4NCwgMHgwM2Y4LCAweDgwMDQsCisJMHgyMGE4LCAweDUzYTYsIDB4NjBjMywgMHgwMDg0LCAweDEwNzgsIDB4NDE1OCwgMHgwMDdjLCAweDAwN2MsCisJMHgwMDdjLCAweDA4N2UsIDB4MDk3ZSwgMHgyMDI5LCAweGEzNTIsIDB4MjUyYywgMHgyMGE5LCAweDAwMDgsCisJMHgyMDQxLCAweGE4MGUsIDB4MjhhMCwgMHgyMDk5LCAweGE4OGUsIDB4NTNhMywgMHgyMGE5LCAweDAwMDgsCisJMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMDQwLCAweDQwNjcsIDB4MjAxMSwgMHgwMDAwLCAweDI4MDAsCisJMHhhMjAwLCAweDIwMGMsIDB4YTFhNiwgMHhmZmZmLCAweDAwYzAsIDB4NDA3OSwgMHhkNWQ0LCAweDAwNDAsCisJMHg0MDc0LCAweDgyMTAsIDB4MDA3OCwgMHg0MDc1LCAweDgyMTEsIDB4MDBmMCwgMHg0MDY3LCAweDAwNzgsCisJMHg0MGUxLCAweDgyZmYsIDB4MDBjMCwgMHg0MDhiLCAweGQ1ZDQsIDB4MDA0MCwgMHg0MDg1LCAweGExYTYsCisJMHgzZmZmLCAweDAwNDAsIDB4NDA3MSwgMHgwMDc4LCAweDQwODksIDB4YTFhNiwgMHgzZmZmLCAweDAwNDAsCisJMHg0MGUxLCAweGExOGQsIDB4YzAwMCwgMHgyMGE5LCAweDAwMTAsIDB4MjAxOSwgMHgwMDAxLCAweGQ1ZDQsCisJMHgwMDQwLCAweDQwOTQsIDB4MjAxOSwgMHgwMDEwLCAweDIxMjAsIDB4ZDVkNCwgMHgwMDQwLCAweDQwOWIsCisJMHg4NDIzLCAweDAwNzgsIDB4NDA5YywgMHg4NDI0LCAweDAwYzgsIDB4NDBhOSwgMHhkNWQ0LCAweDAwNDAsCisJMHg0MGE0LCAweDgzMTksIDB4MDA3OCwgMHg0MGE1LCAweDgzMTgsIDB4MDBmMCwgMHg0MDk1LCAweDAwNzgsCisJMHg0MGUxLCAweDIzYTgsIDB4MjAyMSwgMHgwMDAxLCAweDg0MjYsIDB4ODQyNSwgMHgwMGYwLCAweDQwYWQsCisJMHgyMzI4LCAweDg1MjksIDB4YTJiZSwgMHgwMDA3LCAweDAwNDAsIDB4NDBjMSwgMHgwMDdlLCAweDIwMzksCisJMHgwMDA3LCAweDIyMDAsIDB4YTczYSwgMHgwMDdmLCAweDI3YTgsIDB4YTVhOCwgMHgwMDEwLCAweDAwZjAsCisJMHg0MGJkLCAweDc1NGUsIDB4YTVjOCwgMHgyOTNmLCAweDI5MmMsIDB4YTVhYywgMHgwMGZmLCAweDY1MzIsCisJMHg2MGU3LCAweDAwMDAsIDB4NjVlYSwgMHg3MDZiLCAweDAwMDAsIDB4NzU2ZSwgMHgyMDE4LCAweDIzMDQsCisJMHhhNDA1LCAweDIwMWEsIDB4NzA3MywgMHgwMDAxLCAweDI2YTAsIDB4Mjg5OCwgMHgyMGE5LCAweDAwMDgsCisJMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsCisJMHg0MGU3LCAweGEwMDYsIDB4MDA3OCwgMHg0MGU3LCAweGEwMDYsIDB4MTA3OCwgMHgxMzI4LCAweDA5N2YsCisJMHgwODdmLCAweDAwN2MsIDB4MjExOCwgMHgyMDIxLCAweDAwMDAsIDB4MjAwMSwgMHgwMDA3LCAweGEzOWEsCisJMHgwMDEwLCAweDAwNDgsIDB4NDBmNywgMHg4NDIwLCAweDgwMDEsIDB4MDA3OCwgMHg0MGVmLCAweDIxMTgsCisJMHg4NGZmLCAweDAwNDAsIDB4NDEwMCwgMHhhMzlhLCAweDAwMTAsIDB4ODQyMSwgMHgwMGMwLCAweDQwZmIsCisJMHgyMDIxLCAweDAwMDEsIDB4ODNmZiwgMHgwMDQwLCAweDQxMDksIDB4ODQyMywgMHg4MzE5LCAweDAwYzAsCisJMHg0MTA1LCAweGEyMzgsIDB4MjcwNCwgMHhhNDJjLCAweDAwYzAsIDB4NDEyMSwgMHhhNDA1LCAweDIwM2EsCisJMHg3MTRlLCAweGExYTAsIDB4MjkzZiwgMHgyNDJjLCAweGE1YWMsIDB4MDBmZiwgMHg2NTMyLCAweDYwZTcsCisJMHgwMDAwLCAweDY1ZWEsIDB4NzA2YiwgMHgwMDAwLCAweDc1NmUsIDB4NzA3MywgMHgwMDAxLCAweGEwODQsCisJMHgwMDAwLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsIDB4NzA3NywgMHgwMDAwLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MGY3ZSwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg1OTc1LCAweDIwNzksCisJMHgwMTAwLCAweDIwNzEsIDB4MDE0MCwgMHgxMDc4LCAweDZjNDEsIDB4NzAwNCwgMHhhMDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDQxM2UsIDB4NzAwMywgMHgxMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4YTMyMSwgMHgyMDczLCAweDAwMDAsIDB4Nzg0MCwgMHgwMjdlLCAweDAxN2UsCisJMHgyMDA5LCAweDAwZjcsIDB4MTA3OCwgMHg0MWRlLCAweDAxN2YsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsCisJMHgwMDgwLCAweDc4NDIsIDB4N2E0MiwgMHgwMjdmLCAweDEyN2YsIDB4MGY3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDExLCAweGE1YjUsIDB4MjAxMywgMHgwMDAwLCAweDcwN2YsCisJMHgwMDAwLCAweDEyN2YsIDB4MjBlMSwgMHg5MDgwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsCisJMHgxMDc4LCAweDZjMzgsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU5NmMsCisJMHgwMDdjLCAweDAxN2UsIDB4MDI3ZSwgMHgwYzdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksCisJMHgwMGY3LCAweDEwNzgsIDB4NDFkZSwgMHgyMDYxLCAweGE1YmUsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsCisJMHgwMDAwLCAweDIwNjEsIDB4YTMwMCwgMHg2MDAzLCAweDAwMDEsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsCisJMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwgMHg0MTk2LCAweDEwNzgsCisJMHg1OGM3LCAweDEyN2YsIDB4MGM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3YywgMHgwZTdlLCAweDAwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg1OTc1LCAweDIwNzEsCisJMHgwMTAwLCAweDEwNzgsIDB4NmM0MSwgMHgyMDcxLCAweDAxNDAsIDB4NzAwNCwgMHhhMDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDQxYWUsIDB4NzAwMywgMHgxMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAwMDEsCisJMHgxMDc4LCAweDI0ODAsIDB4MTA3OCwgMHg0MTcxLCAweDEyN2YsIDB4MDA3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhhOWMwLCAweDIwOTksIDB4YTg4ZSwgMHgzMzA0LCAweDgwMDcsCisJMHgyMGEyLCAweDkzOTgsIDB4OTRhMCwgMHgwMGYwLCAweDQxYmUsIDB4MDA3YywgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhhODAwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMGMsCisJMHg1M2E2LCAweDAwN2MsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGE4ODAsCisJMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBjLCAweDUzYTYsIDB4MDA3YywgMHgwYzdlLCAweDAwN2UsCisJMHgyMDYxLCAweDAxMDAsIDB4ODEwZiwgMHgyMDAxLCAweGEzMmUsIDB4MjAwNCwgMHhhMDA1LCAweDAwYzAsCisJMHg0MWVmLCAweDYwMzAsIDB4YTA4NCwgMHgwMGZmLCAweGExMDUsIDB4MDA3OCwgMHg0MWYxLCAweGExODUsCisJMHgwMGY3LCAweDYwNGEsIDB4MDA3ZiwgMHgwYzdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwNDdlLCAweDIwMDEsCisJMHhhMzUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQyMDgsIDB4YTAwNiwgMHgyMDIwLCAweDIwMDksCisJMHgwMDJhLCAweDEwNzgsIDB4OWVjMCwgMHgyMDAxLCAweGEzMGMsIDB4MjAwYywgMHhjMTk1LCAweDIxMDIsCisJMHgyMDE5LCAweDAwMmEsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4MjdlMiwgMHgwNDdmLCAweDAxN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4MjAwMSwgMHhhMzBjLCAweDIwMDQsIDB4ZDA5YywgMHgwMDQwLCAweDQyMTgsCisJMHgwMDdmLCAweDAwN2MsIDB4MDA3ZSwgMHgwMTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsCisJMHgwMTAxLCAweDIwMGMsIDB4YTE4ZCwgMHgwMDA2LCAweDIxMDIsIDB4MTI3ZiwgMHgwMTdmLCAweDAwN2YsCisJMHgwMDdjLCAweDE1N2UsIDB4MjBhOSwgMHgwMGZmLCAweDIwMDksIDB4YTQzNCwgMHhhMDA2LCAweDIwMGEsCisJMHg4MTA4LCAweDAwZjAsIDB4NDIyZiwgMHgxNTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgwMzdlLCAweDE1N2UsCisJMHgxMzdlLCAweDE0N2UsIDB4MjA2OSwgMHhhMzUxLCAweGEwMDYsIDB4NjAwMiwgMHg2MDA3LCAweDA3MDcsCisJMHg2MDBhLCAweDYwMGUsIDB4NjAxMiwgMHhhMTk4LCAweDI5M2YsIDB4MjMxYywgMHhhMzljLCAweDAwZmYsCisJMHg2MzE2LCAweDIwYTksIDB4MDAwNCwgMHhhYzk4LCAweDAwMDYsIDB4MjNhMCwgMHg0MGE0LCAweDIwYTksCisJMHgwMDA0LCAweGFjOTgsIDB4MDAwYSwgMHgyM2EwLCAweDQwYTQsIDB4NjAzZSwgMHg2MDQyLCAweDYwNGUsCisJMHg2MDUyLCAweDYwNTYsIDB4NjA1YSwgMHg2MDVlLCAweDYwNjIsIDB4NjA2NiwgMHg2MDZhLCAweDYwNmUsCisJMHg2MDcyLCAweDYwNzYsIDB4NjA3YSwgMHg2MDdlLCAweDYwODIsIDB4NjA4NiwgMHg2MDhhLCAweDYwOGUsCisJMHg2MDkyLCAweDYwOTYsIDB4NjA5YSwgMHg2MDllLCAweDYwYWUsIDB4NjFhMiwgMHgwZDdlLCAweDYwYTQsCisJMHhhMDZkLCAweDAwNDAsIDB4NDI3NSwgMHgxMDc4LCAweDEzOWEsIDB4NjBhNywgMHgwMDAwLCAweDYwYTgsCisJMHhhMDZkLCAweDAwNDAsIDB4NDI3ZCwgMHgxMDc4LCAweDEzOWEsIDB4NjBhYiwgMHgwMDAwLCAweDBkN2YsCisJMHhhMDA2LCAweDYwNGEsIDB4NjgxMCwgMHg2MDNhLCAweDY4MGMsIDB4NjA0NiwgMHg2ODE0LCAweGEwODQsCisJMHgwMGZmLCAweDYwNDIsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDM3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2OTQ0LCAweDZlNDgsIDB4YTY4NCwgMHgzZmZmLCAweGEwODIsCisJMHg0MDAwLCAweDAwYzgsIDB4NDM2MSwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwZmYsCisJMHgwMGM4LCAweDQzNjcsIDB4MjAwMSwgMHhhMzBjLCAweDIwMDQsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsCisJMHg0MmMyLCAweDIwMDEsIDB4YTMwYywgMHgyMDA0LCAweGQwODQsIDB4MDBjMCwgMHg0MzQyLCAweGExODgsCisJMHhhNDM0LCAweDIxMDQsIDB4YTA2NSwgMHgwMDQwLCAweDQzNDIsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhlLCAweDAwMDYsIDB4MDBjMCwgMHg0MzQyLCAweDYwMDAsIDB4ZDBjNCwgMHgwMDQwLCAweDQzNDIsCisJMHgwMDc4LCAweDQyY2YsIDB4YTE4OCwgMHhhNDM0LCAweDIxMDQsIDB4YTA2NSwgMHgwMDQwLCAweDQzMjYsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsIDB4MDBjMCwgMHg0MzJjLCAweDYwYTQsCisJMHhhMDBkLCAweDAwNDAsIDB4NDJkNywgMHgxMDc4LCAweDQ3NDksIDB4MDA0MCwgMHg0MzIwLCAweDYwYTgsCisJMHhhMDBkLCAweDAwNDAsIDB4NDJmMSwgMHgxMDc4LCAweDQ3OWEsIDB4MDBjMCwgMHg0MmYxLCAweDY5NGMsCisJMHhkMWZjLCAweDAwYzAsIDB4NDJlNywgMHgxMDc4LCAweDQ0MWMsIDB4MDA3OCwgMHg0MzFiLCAweDEwNzgsCisJMHg0M2Q2LCAweDY5NGMsIDB4ZDFlYywgMHgwMGMwLCAweDQzMWIsIDB4MTA3OCwgMHg0NjBhLCAweDAwNzgsCisJMHg0MzFiLCAweDY5NGMsIDB4YTE4NCwgMHhhMDAwLCAweDAwNDAsIDB4NDMwYiwgMHhkMWVjLCAweDAwNDAsCisJMHg0MzA0LCAweGQxZmMsIDB4MDA0MCwgMHg0MzAwLCAweDEwNzgsIDB4NDYxYiwgMHgwMDc4LCAweDQzMDcsCisJMHgxMDc4LCAweDQ2MWIsIDB4MDA3OCwgMHg0MzBiLCAweGQxZmMsIDB4MDA0MCwgMHg0MzBiLCAweDEwNzgsCisJMHg0M2Q2LCAweDAwNzgsIDB4NDMxYiwgMHg2MDUwLCAweGEwMGQsIDB4MDA0MCwgMHg0MzE2LCAweDJkMDAsCisJMHgyMDBhLCAweDY4MDMsIDB4MDAwMCwgMHg2MDUyLCAweDAwNzgsIDB4NDMxYiwgMHgyZDAwLCAweDYwNTIsCisJMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgxMDc4LCAweDVjMTcsIDB4YTAwNiwgMHgxMjdmLCAweDAwN2MsCisJMHgyMDAxLCAweDAwMDUsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsIDB4NDM2YiwgMHgyMDAxLCAweDAwMjgsCisJMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg0MzZiLCAweGEwODIsIDB4MDAwNiwgMHgwMGM4LCAweDQzNDIsCisJMHg2MGEwLCAweGQwYmMsIDB4MDBjMCwgMHg0MzNlLCAweDYxMDAsIDB4ZDFmYywgMHgwMDQwLCAweDQyY2YsCisJMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwNzgsIDB4NDM2YiwgMHgyMDAxLCAweDAwMjgsCisJMHgwMDc4LCAweDQzNWQsIDB4MjAwOSwgMHhhMzBjLCAweDIxMGMsIDB4ZDE4YywgMHgwMDQwLCAweDQzNGMsCisJMHgyMDAxLCAweDAwMDQsIDB4MDA3OCwgMHg0MzVkLCAweGQxODQsIDB4MDA0MCwgMHg0MzUzLCAweDIwMDEsCisJMHgwMDA0LCAweDAwNzgsIDB4NDM1ZCwgMHgyMDAxLCAweDAwMjksIDB4NjEwMCwgMHhkMWZjLCAweDAwNDAsCisJMHg0MzVkLCAweDIwMDksIDB4MTAwMCwgMHgwMDc4LCAweDQzNmIsIDB4MjAwOSwgMHgwMDAwLCAweDAwNzgsCisJMHg0MzZiLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg0MzZiLCAweDIwMDEsCisJMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHhhMDA1LCAweDEyN2YsIDB4MDA3YywgMHg2OTQ0LCAweDZlNDgsCisJMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDAwYzgsIDB4NDNiYiwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweGExODIsIDB4MDBmZiwgMHgwMGM4LCAweDQzYTEsIDB4YTE4OCwgMHhhNDM0LCAweDIxMDQsCisJMHhhMDY1LCAweDAwNDAsIDB4NDNhMSwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDhlLCAweDAwMDYsCisJMHgwMGMwLCAweDQzYTcsIDB4Njg0YywgMHhkMGVjLCAweDAwNDAsIDB4NDM5NCwgMHgxMDc4LCAweDQ2MWIsCisJMHgxMDc4LCAweDQzZDYsIDB4MDA3OCwgMHg0MzljLCAweDEwNzgsIDB4NDNkNiwgMHg2ODRjLCAweGQwZmMsCisJMHgwMDQwLCAweDQzOWMsIDB4MTA3OCwgMHg0NjBhLCAweDEwNzgsIDB4NDY2MywgMHhhMDA2LCAweDAwNzgsCisJMHg0M2JmLCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg0M2JmLCAweGEwODIsCisJMHgwMDA2LCAweDAwYzgsIDB4NDNiNSwgMHg2MTAwLCAweGQxZmMsIDB4MDA0MCwgMHg0MzhhLCAweDIwMDEsCisJMHgwMDI5LCAweDIwMDksIDB4MTAwMCwgMHgwMDc4LCAweDQzYmYsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksCisJMHgwMDAwLCAweDAwNzgsIDB4NDNiZiwgMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgwMDAwLCAweGEwMDUsCisJMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwNTAsIDB4YTAwZCwgMHgwMDQwLCAweDQzY2YsCisJMHgyZDAwLCAweDIwMGEsIDB4NjgwMywgMHgwMDAwLCAweDYwNTIsIDB4MTI3ZiwgMHgwMDdjLCAweDJkMDAsCisJMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDAwNzgsIDB4NDNjZCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDYwNGMsIDB4YTAwNSwgMHgwMDQwLCAweDQzZWMsIDB4MGU3ZSwgMHgyMDcxLCAweGE1YWIsCisJMHg3MDA0LCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDQzZjMsIDB4MGU3ZiwgMHg2MDRjLCAweDY4MDIsCisJMHgyZDAwLCAweDYwNGUsIDB4MTI3ZiwgMHgwMDdjLCAweDJkMDAsIDB4NjA1MiwgMHg2MDRlLCAweDY4MDMsCisJMHgwMDAwLCAweDAwNzgsIDB4NDNlYSwgMHg3MDFjLCAweGFjMDYsIDB4MDBjMCwgMHg0M2U1LCAweDYwNGMsCisJMHgyMDcwLCAweDcwMDAsIDB4NjgwMiwgMHgyZDAwLCAweDcwMDIsIDB4MGU3ZiwgMHgxMjdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDRjLCAweGEwNmQsIDB4MDA0MCwgMHg0NDBlLCAweDY4MDAsCisJMHhhMDA1LCAweDAwYzAsIDB4NDQwYywgMHg2MDUyLCAweDYwNGUsIDB4YWQwNSwgMHgxMjdmLCAweDAwN2MsCisJMHg2MDRjLCAweGEwNmQsIDB4MDA0MCwgMHg0NDFiLCAweDY4MDAsIDB4YTAwNSwgMHgwMGMwLCAweDQ0MTksCisJMHg2MDUyLCAweDYwNGUsIDB4YWQwNSwgMHgwMDdjLCAweDY4MDMsIDB4MDAwMCwgMHg2MDg0LCAweGEwMGQsCisJMHgwMDQwLCAweDQ0MjYsIDB4MmQwMCwgMHgyMDBhLCAweDYwODYsIDB4MDA3YywgMHgyZDAwLCAweDYwODYsCisJMHg2MDgyLCAweDAwNzgsIDB4NDQyNSwgMHgxMjdlLCAweDBjN2UsIDB4MDI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg2MjE4LCAweDIyNjAsIDB4NjIwMCwgMHhhMDA1LCAweDAwNDAsIDB4NDQzOSwgMHhjMjg1LCAweDAwNzgsCisJMHg0NDNhLCAweGMyODQsIDB4NjIwMiwgMHgwMjdmLCAweDBjN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgwYzdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsIDB4NjIwNCwgMHgwMDdlLCAweGEwODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NDQ1ZSwgMHg2MDljLCAweGQwYWMsIDB4MDA0MCwgMHg0NDVlLCAweDIwMDEsCisJMHhhMzUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDQ0NWUsIDB4YTI4NCwgMHhmZjAwLCAweDgwMDcsCisJMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwgMHg0NDVlLCAweDIwMTEsIDB4MDYwMCwgMHgwMDdmLCAweGEyOTQsCisJMHhmZjAwLCAweGEyMTUsIDB4NjIwNiwgMHgwMDdlLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLCAweDQ0NmUsCisJMHg2MjkwLCAweDgyZmYsIDB4MDBjMCwgMHg0NDZlLCAweDEwNzgsIDB4MTMyOCwgMHgwMDdmLCAweDBjN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwYzdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsCisJMHg2MjA0LCAweDAwN2UsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDQ5MCwgMHg2MDljLCAweGQwYTQsCisJMHgwMDQwLCAweDQ0OTAsIDB4MjAwMSwgMHhhMzUyLCAweDIwMDQsIDB4ZDBhYywgMHgwMGMwLCAweDQ0OTAsCisJMHhhMjg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA3LCAweDAwYzAsIDB4NDQ5MCwgMHgyMDExLCAweDAwMDYsCisJMHgwMDdmLCAweGEyOTQsIDB4MDBmZiwgMHg4MDA3LCAweGEyMTUsIDB4NjIwNiwgMHgwYzdmLCAweDEyN2YsCisJMHgwMDdjLCAweDAyN2UsIDB4YTE4MiwgMHgwMGZmLCAweDAwNDgsIDB4NDRhMiwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDc4LCAweDQ0YmEsIDB4YTE5MCwgMHhhNDM0LCAweDIyMDQsIDB4YTA2NSwgMHgwMGMwLCAweDQ0YjksCisJMHgwMTdlLCAweDBkN2UsIDB4MTA3OCwgMHgxMzY2LCAweDJkNjAsIDB4MGQ3ZiwgMHgwMTdmLCAweDAwNDAsCisJMHg0NDllLCAweDJjMDAsIDB4MjAxMiwgMHg2MGE3LCAweDAwMDAsIDB4NjBhYiwgMHgwMDAwLCAweDEwNzgsCisJMHg0MjM1LCAweGEwMDYsIDB4MDI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAyN2UsCisJMHhhMTgyLCAweDAwZmYsIDB4MDA0OCwgMHg0NGM4LCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDQ0ZmUsCisJMHgwZDdlLCAweGExOTAsIDB4YTQzNCwgMHgyMjA0LCAweGEwNmQsIDB4MDA0MCwgMHg0NGZjLCAweDIwMTMsCisJMHgwMDAwLCAweDBkN2UsIDB4MGM3ZSwgMHgyZDYwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMDQwLCAweDQ0ZGEsCisJMHgxMDc4LCAweDEzOWEsIDB4NjBhOCwgMHhhMDZkLCAweDAwNDAsIDB4NDRlMCwgMHgxMDc4LCAweDEzOWEsCisJMHgwYzdmLCAweDBkN2YsIDB4MGQ3ZSwgMHgwYzdlLCAweDY4YWMsIDB4MjA2MCwgMHg4Y2ZmLCAweDAwNDAsCisJMHg0NGY4LCAweDYwMGMsIDB4MDA3ZSwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsCisJMHg0NGYzLCAweDEwNzgsIDB4MTNhYSwgMHgxMDc4LCAweDc1M2QsIDB4MGM3ZiwgMHgwMDc4LCAweDQ0ZTYsCisJMHgwYzdmLCAweDBkN2YsIDB4MTA3OCwgMHgxMzlhLCAweDBkN2YsIDB4YTAwNiwgMHgwMjdmLCAweDEyN2YsCisJMHgwMDdjLCAweDAxN2UsIDB4YTE4MiwgMHgwMGZmLCAweDAwNDgsIDB4NDUwYSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDc4LCAweDQ1MTEsIDB4YTE4OCwgMHhhNDM0LCAweDIxMDQsIDB4YTA2NSwgMHgwMDQwLCAweDQ1MDYsCisJMHhhMDA2LCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDYwMGIsCisJMHgwMDAwLCAweDYwMGYsIDB4MDAwMCwgMHg2MDAwLCAweGMwOGMsIDB4NjAwMiwgMHgyMDY5LCAweGE4OGUsCisJMHg2ODA4LCAweDYwNWUsIDB4NjgxMCwgMHg2MDYyLCAweDYxMzgsIDB4YTEwYSwgMHgwMDQ4LCAweDQ1MjksCisJMHg2MDNhLCAweDY4MTQsIDB4NjA2NiwgMHgyMDk5LCAweGE4OTYsIDB4YWM4OCwgMHgwMDBhLCAweDIxYTAsCisJMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDk5LCAweGE4OWEsIDB4YWM4OCwgMHgwMDA2LCAweDIxYTAsCisJMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgyMDY5LCAweGE4YWUsIDB4NjgwOCwgMHg2MDZhLCAweDY5MGMsCisJMHg2MTZlLCAweDY4MTAsIDB4NjA3MiwgMHg2ODE4LCAweDYwNzYsIDB4YTE4MiwgMHgwMjExLCAweDAwYzgsCisJMHg0NTRkLCAweDIwMDksIDB4MDAwOCwgMHgwMDc4LCAweDQ1NzcsIDB4YTE4MiwgMHgwMjU5LCAweDAwYzgsCisJMHg0NTU1LCAweDIwMDksIDB4MDAwNywgMHgwMDc4LCAweDQ1NzcsIDB4YTE4MiwgMHgwMmMxLCAweDAwYzgsCisJMHg0NTVkLCAweDIwMDksIDB4MDAwNiwgMHgwMDc4LCAweDQ1NzcsIDB4YTE4MiwgMHgwMzQ5LCAweDAwYzgsCisJMHg0NTY1LCAweDIwMDksIDB4MDAwNSwgMHgwMDc4LCAweDQ1NzcsIDB4YTE4MiwgMHgwNDIxLCAweDAwYzgsCisJMHg0NTZkLCAweDIwMDksIDB4MDAwNCwgMHgwMDc4LCAweDQ1NzcsIDB4YTE4MiwgMHgwNTgxLCAweDAwYzgsCisJMHg0NTc1LCAweDIwMDksIDB4MDAwMywgMHgwMDc4LCAweDQ1NzcsIDB4MjAwOSwgMHgwMDAyLCAweDYxOTIsCisJMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDE3ZSwgMHgwMjdlLCAweDBlN2UsCisJMHgyMDcxLCAweGE4OGQsIDB4MmUwNCwgMHg2ODk2LCAweDIwNzEsIDB4YTg4ZSwgMHg3MDA0LCAweDY4OWEsCisJMHg3MDFjLCAweDY4OWUsIDB4NmEwMCwgMHgyMDA5LCAweGEzNzEsIDB4MjEwYywgMHhkMGJjLCAweDAwNDAsCisJMHg0NTk3LCAweGQxZWMsIDB4MDA0MCwgMHg0NTk3LCAweGMyYWQsIDB4MDA3OCwgMHg0NTk4LCAweGMyYWMsCisJMHhkMGM0LCAweDAwNDAsIDB4NDVhMSwgMHhkMWU0LCAweDAwNDAsIDB4NDVhMSwgMHhjMmJkLCAweDAwNzgsCisJMHg0NWEyLCAweGMyYmMsIDB4NmEwMiwgMHgwZTdmLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE0LCAweGEwNmQsIDB4MDA0MCwgMHg0NWNiLCAweDY5MDAsCisJMHg4MWZmLCAweDAwYzAsIDB4NDVkZiwgMHg2YTA0LCAweGEyODIsIDB4MDAxMCwgMHgwMGM4LCAweDQ1ZTQsCisJMHhhZDg4LCAweDAwMDQsIDB4MjBhOSwgMHgwMDEwLCAweDIxMDQsIDB4YTA4NiwgMHhmZmZmLCAweDAwNDAsCisJMHg0NWM2LCAweDgxMDgsIDB4MDBmMCwgMHg0NWJjLCAweDEwNzgsIDB4MTMyOCwgMHgyNjBhLCAweDgyMTAsCisJMHg2YTA2LCAweDAwNzgsIDB4NDVkZiwgMHgxMDc4LCAweDEzODEsIDB4MDA0MCwgMHg0NWU0LCAweDJkMDAsCisJMHg2MGE2LCAweDY4MDMsIDB4MDAwMCwgMHhhZDg4LCAweDAwMDQsIDB4MjBhOSwgMHgwMDEwLCAweDIwMGIsCisJMHhmZmZmLCAweDgxMDgsIDB4MDBmMCwgMHg0NWQ3LCAweDY4MDcsIDB4MDAwMSwgMHg2ZTEyLCAweGEwODUsCisJMHgwMDAxLCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg0NWUxLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MGQ3ZSwgMHg2MGE0LCAweGEwMGQsIDB4MDA0MCwgMHg0NjA3LCAweDIxNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHg0NjAzLCAweDEwNzgsIDB4NDc0OSwgMHgwMGMwLCAweDQ2MDcsCisJMHgyMDBiLCAweGZmZmYsIDB4NjgwNCwgMHhhMDhhLCAweDAwMDIsIDB4MDA0OCwgMHg0NjAzLCAweDgwMDEsCisJMHg2ODA2LCAweDAwNzgsIDB4NDYwNywgMHgxMDc4LCAweDEzOWEsIDB4NjBhNywgMHgwMDAwLCAweDBkN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0N2FmLCAweDAwNzgsCisJMHg0NjEzLCAweDEwNzgsIDB4NDNjMSwgMHgxMDc4LCAweDQ2YTcsIDB4MDBjMCwgMHg0NjExLCAweDEwNzgsCisJMHg0NjYzLCAweDEyN2YsIDB4MDA3YywgMHgwZDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwYTgsCisJMHhhMDZkLCAweDAwNDAsIDB4NDYzZiwgMHg2OTUwLCAweDgxZmYsIDB4MDBjMCwgMHg0NjUzLCAweDZhNTQsCisJMHhhMjgyLCAweDAwMTAsIDB4MDBjOCwgMHg0NjYwLCAweGFkODgsIDB4MDAxOCwgMHgyMGE5LCAweDAwMTAsCisJMHgyMTA0LCAweGEwODYsIDB4ZmZmZiwgMHgwMDQwLCAweDQ2M2EsIDB4ODEwOCwgMHgwMGYwLCAweDQ2MzAsCisJMHgxMDc4LCAweDEzMjgsIDB4MjYwYSwgMHg4MjEwLCAweDZhNTYsIDB4MDA3OCwgMHg0NjUzLCAweDEwNzgsCisJMHgxMzgxLCAweDAwNDAsIDB4NDY2MCwgMHgyZDAwLCAweDYwYWEsIDB4Njg1MywgMHgwMDAwLCAweGFkODgsCisJMHgwMDE4LCAweDIwYTksIDB4MDAxMCwgMHgyMDBiLCAweGZmZmYsIDB4ODEwOCwgMHgwMGYwLCAweDQ2NGIsCisJMHg2ODU3LCAweDAwMDEsIDB4NmU2MiwgMHgwMDc4LCAweDQ2NTcsIDB4MTA3OCwgMHg0NDFjLCAweDEwNzgsCisJMHg0NjZkLCAweDAwYzAsIDB4NDY1NSwgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHhhMDA2LCAweDAwNzgsIDB4NDY1ZCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDVjMTcsCisJMHgxMjdmLCAweDAwN2MsIDB4YTAxZSwgMHgwMDc4LCAweDQ2NmYsIDB4MjAxOSwgMHgwMDAxLCAweGEwMGUsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDRjLCAweDIwNjgsIDB4NjAwMCwgMHhkMGRjLCAweDAwYzAsCisJMHg0NjhkLCAweDhkZmYsIDB4MDA0MCwgMHg0NmEyLCAweDgzZmYsIDB4MDA0MCwgMHg0Njg1LCAweDY4NDgsCisJMHhhNjA2LCAweDAwNDAsIDB4NDY5MiwgMHgwMDc4LCAweDQ2OGQsIDB4NjgzYywgMHhhNDA2LCAweDAwYzAsCisJMHg0NjhkLCAweDY4NDAsIDB4YTUwNiwgMHgwMDQwLCAweDQ2OTIsIDB4MmQwOCwgMHg2ODAwLCAweDIwNjgsCisJMHgwMDc4LCAweDQ2NzksIDB4NmEwMCwgMHg2MDRjLCAweGFkMDYsIDB4MDBjMCwgMHg0NjlhLCAweDYyNGUsCisJMHgwMDc4LCAweDQ2OWQsIDB4YTE4MCwgMHgwMDAwLCAweDIyMDIsIDB4ODJmZiwgMHgwMGMwLCAweDQ2YTIsCisJMHg2MTUyLCAweDhkZmYsIDB4MTI3ZiwgMHgwMDdjLCAweGEwMWUsIDB4MDA3OCwgMHg0NmE5LCAweDIwMTksCisJMHgwMDAxLCAweGEwMGUsIDB4NjA4MCwgMHgyMDY4LCAweDhkZmYsIDB4MDA0MCwgMHg0NmQ1LCAweDgzZmYsCisJMHgwMDQwLCAweDQ2YjgsIDB4Njg0OCwgMHhhNjA2LCAweDAwNDAsIDB4NDZjNSwgMHgwMDc4LCAweDQ2YzAsCisJMHg2ODNjLCAweGE0MDYsIDB4MDBjMCwgMHg0NmMwLCAweDY4NDAsIDB4YTUwNiwgMHgwMDQwLCAweDQ2YzUsCisJMHgyZDA4LCAweDY4MDAsIDB4MjA2OCwgMHgwMDc4LCAweDQ2YWMsIDB4NmEwMCwgMHg2MDgwLCAweGFkMDYsCisJMHgwMGMwLCAweDQ2Y2QsIDB4NjI4MiwgMHgwMDc4LCAweDQ2ZDAsIDB4YTE4MCwgMHgwMDAwLCAweDIyMDIsCisJMHg4MmZmLCAweDAwYzAsIDB4NDZkNSwgMHg2MTg2LCAweDhkZmYsIDB4MDA3YywgMHhhMDE2LCAweDEwNzgsCisJMHg0NzQyLCAweDAwYzAsIDB4NDZkZCwgMHgyMDExLCAweDAwMDEsIDB4MTA3OCwgMHg0NzkzLCAweDAwYzAsCisJMHg0NmUzLCAweGEyOTUsIDB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4NDdjYiwgMHgwMDQwLCAweDQ2ZWMsCisJMHgxMDc4LCAweDhiMTIsIDB4MDA3OCwgMHg0NmVlLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDEwNzgsCisJMHg0N2NiLCAweDAwNDAsIDB4NDZmNywgMHgxMDc4LCAweDhhYWEsIDB4MDA3OCwgMHg0NmY5LCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MTA3OCwgMHg0N2NiLCAweDAwNDAsIDB4NDcwMiwgMHgxMDc4LCAweDhhZjQsCisJMHgwMDc4LCAweDQ3MDQsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MTA3OCwgMHg0N2NiLCAweDAwNDAsCisJMHg0NzBkLCAweDEwNzgsIDB4OGFjNiwgMHgwMDc4LCAweDQ3MGYsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsCisJMHgxMDc4LCAweDQ3Y2IsIDB4MDA0MCwgMHg0NzE4LCAweDEwNzgsIDB4OGIzMCwgMHgwMDc4LCAweDQ3MWEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDgwLCAweGEwNmQsIDB4MDA0MCwgMHg0NzNhLCAweDY4MDAsIDB4MDA3ZSwgMHg2ODM3LCAweDAxMDMsCisJMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDhjYjgsIDB4MDA3ZSwgMHg2MDAwLCAweGQwZmMsCisJMHgwMDQwLCAweDQ3MzQsIDB4MTA3OCwgMHhhMThjLCAweDAwN2YsIDB4MTA3OCwgMHg0OTgyLCAweDAwN2YsCisJMHgwMDc4LCAweDQ3MjEsIDB4NjA4MywgMHgwMDAwLCAweDYwODcsIDB4MDAwMCwgMHgwZDdmLCAweDAwN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4NjBhNCwgMHhhMDBkLCAweDAwYzAsIDB4NDc0OSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDBlN2UsIDB4MjE3MCwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHg0NzVjLCAweDIwYTksCisJMHgwMDEwLCAweGFlODgsIDB4MDAwNCwgMHgyMTA0LCAweGE2MDYsIDB4MDA0MCwgMHg0NzVjLCAweDgxMDgsCisJMHgwMGYwLCAweDQ3NTMsIDB4YTA4NSwgMHgwMDAxLCAweGEwMDYsIDB4MGU3ZiwgMHgwMDdjLCAweDBkN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE0LCAweGEwNmQsIDB4MDBjMCwgMHg0NzZkLCAweDEwNzgsCisJMHgxMzgxLCAweDAwNDAsIDB4NDc3ZiwgMHgyZDAwLCAweDYwYTYsIDB4NjgwMywgMHgwMDAxLCAweDY4MDcsCisJMHgwMDAwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTAsIDB4MjAwYiwgMHhmZmZmLCAweDgxMDgsCisJMHgwMGYwLCAweDQ3NzUsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweGEwMDYsCisJMHgwMDc4LCAweDQ3N2MsIDB4MGQ3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MGE0LCAweGEwNmQsCisJMHgwMDQwLCAweDQ3OTAsIDB4NjBhNywgMHgwMDAwLCAweDEwNzgsIDB4MTM5YSwgMHhhMDg1LCAweDAwMDEsCisJMHgxMjdmLCAweDBkN2YsIDB4MDA3YywgMHg2MGE4LCAweGEwMGQsIDB4MDBjMCwgMHg0NzlhLCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MGU3ZSwgMHgyMTcwLCAweDcwNTAsIDB4YTAwNSwgMHgwMGMwLCAweDQ3YWQsCisJMHgyMGE5LCAweDAwMTAsIDB4YWU4OCwgMHgwMDE4LCAweDIxMDQsIDB4YTYwNiwgMHgwMDQwLCAweDQ3YWQsCisJMHg4MTA4LCAweDAwZjAsIDB4NDdhNCwgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwMDdjLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0NzkzLCAweDAwYzAsIDB4NDdjOSwgMHgyMDBiLCAweGZmZmYsCisJMHgwZDdlLCAweDYwYTgsIDB4MjA2OCwgMHg2ODU0LCAweGEwOGEsIDB4MDAwMiwgMHgwMDQ4LCAweDQ3YzQsCisJMHg4MDAxLCAweDY4NTYsIDB4MDA3OCwgMHg0N2M4LCAweDEwNzgsIDB4MTM5YSwgMHg2MGFiLCAweDAwMDAsCisJMHgwZDdmLCAweDEyN2YsIDB4MDA3YywgMHg2MDljLCAweGQwYTQsIDB4MDA3YywgMHgwZjdlLCAweDcxYWMsCisJMHg4MWZmLCAweDAwYzAsIDB4NDdlOSwgMHg3MWM4LCAweGQxOWMsIDB4MDA0MCwgMHg0N2U5LCAweDIwMDEsCisJMHgwMDdlLCAweGEwODAsIDB4YTQzNCwgMHgyMDA0LCAweGEwN2QsIDB4MDA0MCwgMHg0N2U5LCAweDc4MDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDdlOSwgMHg3ODAwLCAweGMwZWQsCisJMHg3ODAyLCAweDIwNzksIDB4YTM1MSwgMHg3ODA0LCAweGQwYTQsIDB4MDA0MCwgMHg0ODBmLCAweDE1N2UsCisJMHgwYzdlLCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDQ1MDEsCisJMHgwMGMwLCAweDQ4MDksIDB4NjAwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDk2LCAweDAwMDQsCisJMHgwMDQwLCAweDQ4MDYsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDgwOSwgMHg2MDAwLCAweGMwZWQsCisJMHg2MDAyLCAweDAxN2YsIDB4ODEwOCwgMHgwMGYwLCAweDQ3ZjUsIDB4MGM3ZiwgMHgxNTdmLCAweDEwNzgsCisJMHg0ODk3LCAweDAwNDAsIDB4NDgxOCwgMHgyMDAxLCAweGE1OWYsIDB4MjAwYywgMHgwMDc4LCAweDQ4MjAsCisJMHgyMDc5LCAweGEzNTEsIDB4NzgwNCwgMHhkMGE0LCAweDAwNDAsIDB4NDgyNCwgMHgyMDA5LCAweDA3ZDAsCisJMHgyMDExLCAweDQ4MjYsIDB4MTA3OCwgMHg1OTZjLCAweDBmN2YsIDB4MDA3YywgMHgyMDExLCAweDQ4MjYsCisJMHgxMDc4LCAweDU4ZDQsIDB4MTA3OCwgMHg0ODk3LCAweDAwNDAsIDB4NDg0ZSwgMHgyMDAxLCAweGE0YjIsCisJMHgyMDA0LCAweGEwODAsIDB4MDAwMCwgMHgyMDBjLCAweGMxZWMsIDB4MjEwMiwgMHgyMDAxLCAweGEzNTIsCisJMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg0ODQyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQ4MjYsCisJMHgxMDc4LCAweDU5NmMsIDB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsIDB4NzA2YiwgMHgwMDAwLCAweDcwNmYsCisJMHgwMDAwLCAweDEwNzgsIDB4MjYwZCwgMHgwZTdmLCAweDAwNzgsIDB4NDg4NiwgMHgxNTdlLCAweDBjN2UsCisJMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLCAweDAxN2UsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsCisJMHg0ODgwLCAweDYwMDAsIDB4ZDBlYywgMHgwMDQwLCAweDQ4ODAsIDB4MDQ3ZSwgMHg2MmEwLCAweGEyOTQsCisJMHgwMGZmLCAweDgyMjcsIDB4YTAwNiwgMHgyMDA5LCAweDAwMjksIDB4MTA3OCwgMHg5ZWMwLCAweDYwMDAsCisJMHhjMGU1LCAweGMwZWMsIDB4NjAwMiwgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDA3MDAsCisJMHg2MDA2LCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDVkNTMsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsCisJMHgxMDc4LCAweDVjNzgsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4OWMzOCwgMHgwNzdmLCAweDA0N2YsCisJMHgwMTdmLCAweDgxMDgsIDB4MDBmMCwgMHg0ODU0LCAweDBjN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHg2MDE4LCAweDIwNjAsIDB4NjAwMCwgMHhjMGVjLCAweDYwMDIsIDB4MGM3ZiwgMHgwMDdjLCAweDc4MTgsCisJMHgyMDA0LCAweGQwYWMsIDB4MDA3YywgMHg3ODE4LCAweDIwMDQsIDB4ZDBiYywgMHgwMDdjLCAweDBmN2UsCisJMHgyMDAxLCAweGE0YjIsIDB4MjAwNCwgMHhhMDdkLCAweDAwNDAsIDB4NDhhMCwgMHg3ODAwLCAweGQwZWMsCisJMHgwZjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MjAwLCAweGEwMDUsCisJMHgwMDQwLCAweDQ4YWQsIDB4YzJmZCwgMHgwMDc4LCAweDQ4YWUsIDB4YzJmYywgMHg2MjAyLCAweDAyN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MjA3MSwgMHhhNDEzLCAweDcwMDMsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDAsCisJMHg3MDEzLCAweDAwMDAsIDB4NzAxNywgMHgwMDAwLCAweDcwMWIsIDB4MDAwMCwgMHg3MDFmLCAweDAwMDAsCisJMHg3MDBiLCAweDAwMDAsIDB4NzA0YiwgMHgwMDAxLCAweDcwNGYsIDB4MDAwMCwgMHg3MDViLCAweDAwMjAsCisJMHg3MDVmLCAweDAwNDAsIDB4NzA3ZiwgMHgwMDAwLCAweDIwNzEsIDB4YTU3YywgMHg3MDAzLCAweGE0MTMsCisJMHg3MDA3LCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDcwMGYsIDB4YTU1YywgMHg3MDEzLCAweDAwMjAsCisJMHg3MDE3LCAweDAwNDAsIDB4NzAzNywgMHgwMDAwLCAweDAwN2MsIDB4MDE3ZSwgMHgwZTdlLCAweDIwNzEsCisJMHhhNTM0LCAweGEwMGUsIDB4NzE4NiwgMHg3MThhLCAweDcwOTcsIDB4MDAwMSwgMHgyMDAxLCAweGEzNTIsCisJMHgyMDA0LCAweGQwZmMsIDB4MDBjMCwgMHg0OGY3LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGEwMGUsCisJMHhkMDljLCAweDAwNDAsIDB4NDhmNCwgMHg4MTA4LCAweDcxMDIsIDB4MDA3OCwgMHg0OTRhLCAweDIwMDEsCisJMHhhMzcxLCAweDIwMGMsIDB4YTE4NCwgMHgwMDBmLCAweDIwMDksIDB4YTM3MiwgMHgyMTBjLCAweDAwNzksCisJMHg0OTAxLCAweDQ4ZWMsIDB4NDkyMiwgMHg0OTJhLCAweDQ5MzUsIDB4NDkzYiwgMHg0OGVjLCAweDQ4ZWMsCisJMHg0OGVjLCAweDQ5MTEsIDB4NDhlYywgMHg0OGVjLCAweDQ4ZWMsIDB4NDhlYywgMHg0OGVjLCAweDQ4ZWMsCisJMHg0OGVjLCAweDcwMDMsIDB4MDAwNCwgMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHgyMDk5LCAweGEzNzUsCisJMHgyMGExLCAweGE1ODUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MTU3ZiwgMHgxNDdmLCAweDEzN2YsCisJMHgwMDc4LCAweDQ5NGEsIDB4NzA4ZiwgMHgwMDA1LCAweDcwMDcsIDB4MDEyMiwgMHgyMDAxLCAweDAwMDIsCisJMHgwMDc4LCAweDQ5MzAsIDB4NzA4ZiwgMHgwMDAyLCAweDcwMDcsIDB4MDEyMSwgMHgyMDAxLCAweDAwMDMsCisJMHg3MDAyLCAweDcwOTcsIDB4MDAwMSwgMHgwMDc4LCAweDQ5NDcsIDB4NzAwNywgMHgwMTIyLCAweDIwMDEsCisJMHgwMDAyLCAweDAwNzgsIDB4NDkzZiwgMHg3MDA3LCAweDAxMjEsIDB4MjAwMSwgMHgwMDAzLCAweDcwMDIsCisJMHhhMDA2LCAweDcwOTYsIDB4NzA4ZSwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHg3MDlhLCAweGExODQsCisJMHgwMGZmLCAweDcwOTIsIDB4MGU3ZiwgMHgwMTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE0MTMsCisJMHg2ODRjLCAweGEwMDUsIDB4MDBjMCwgMHg0OTViLCAweDcwMjgsIDB4YzA4NSwgMHg3MDJhLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4NDk4MCwgMHg2YTYwLCAweDcyMzYsIDB4NmI2NCwgMHg3MzNhLCAweDY4NjgsCisJMHg3MDNlLCAweDcwNzYsIDB4Njg2YywgMHg3MDQyLCAweDcwN2EsIDB4Njg0YywgMHg3MDJlLCAweDY4NDQsCisJMHg3MDMyLCAweDIwMDksIDB4MDAwZCwgMHgyMDBhLCAweDcwMGIsIDB4MDAwMCwgMHg4MDA3LCAweDgwMDYsCisJMHg4MDA2LCAweGEwOGMsIDB4MDAzZiwgMHhhMDg0LCAweGZmYzAsIDB4YTIxMCwgMHgyMTAwLCAweGEzMTksCisJMHg3MjZlLCAweDczNzIsIDB4NzAyOCwgMHhjMDg0LCAweDcwMmEsIDB4NzAwNywgMHgwMDAxLCAweGEwMDYsCisJMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwMjdlLCAweDY4MzgsIDB4ZDBmYywgMHgwMGMwLCAweDQ5ZDgsCisJMHg2ODA0LCAweGEwMGQsIDB4MDA0MCwgMHg0OTllLCAweDBkN2UsIDB4MjA3MSwgMHhhMzAwLCAweGEwMTYsCisJMHg3MDJjLCAweDIxNjgsIDB4NjkwNCwgMHgyMDZhLCAweDgyMTAsIDB4MmQwMCwgMHg4MWZmLCAweDAwYzAsCisJMHg0OTkxLCAweDcwMmUsIDB4NzBhOCwgMHhhMjAwLCAweDcwYWEsIDB4MGQ3ZiwgMHgyMDcxLCAweGE0MTMsCisJMHg3MDFjLCAweGEwMDUsIDB4MDBjMCwgMHg0OWVhLCAweDAwNjgsIDB4NDllOCwgMHgyMDcxLCAweGE1MzQsCisJMHg3MjAwLCAweDgyZmYsIDB4MDA0MCwgMHg0OWU4LCAweDY5MzQsIDB4YTE4NiwgMHgwMTAzLCAweDAwYzAsCisJMHg0OWZiLCAweDY5NDgsIDB4Njg0NCwgMHhhMTA1LCAweDAwYzAsIDB4NDlkYiwgMHgyMDA5LCAweDgwMjAsCisJMHgyMjAwLCAweDAwNzksIDB4NDliYiwgMHg0OWU4LCAweDQ5YzAsIDB4NGExOCwgMHg0YTI2LCAweDQ5ZTgsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhkMDg0LCAweDAwYzAsIDB4NDllOCwgMHg3MTIyLCAweDY4M2MsCisJMHg3MDI2LCAweDY4NDAsIDB4NzAyYSwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDIwNzEsCisJMHhhMzAwLCAweDcwMmMsIDB4MjA2YSwgMHgyZDAwLCAweDcwMmUsIDB4NzBhOCwgMHg4MDAwLCAweDcwYWEsCisJMHgwMjdmLCAweDBlN2YsIDB4MDA3YywgMHg2ODQ0LCAweGEwODYsIDB4MDEwMCwgMHgwMGMwLCAweDQ5ZTgsCisJMHg2ODY4LCAweGEwMDUsIDB4MDBjMCwgMHg0OWU4LCAweDIwMDksIDB4ODAyMCwgMHgwMDc4LCAweDQ5YjgsCisJMHgyMDcxLCAweGE0MTMsIDB4MmQwOCwgMHgyMDZiLCAweDAwMDAsIDB4NzAxMCwgMHg4MDAwLCAweDcwMTIsCisJMHg3MDE4LCAweGEwNmQsIDB4NzExYSwgMHgwMDQwLCAweDQ5ZjgsIDB4NjkwMiwgMHgwMDc4LCAweDQ5ZjksCisJMHg3MTFlLCAweDAwNzgsIDB4NDlkOCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE3LCAweDAwNDAsCisJMHg0YTA5LCAweGExODYsIDB4MDAxZSwgMHgwMDQwLCAweDRhMDksIDB4YTE4ZSwgMHgwMDFmLCAweDAwYzAsCisJMHg0OWU4LCAweDY4NGMsIDB4ZDBjYywgMHgwMDQwLCAweDQ5ZTgsIDB4Njg1MCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg0OWU4LCAweDIwMDksIDB4ODAyMSwgMHgwMDc4LCAweDQ5YjgsCisJMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDFlLCAweDAwYzgsIDB4NDllOCwgMHg3MTg2LCAweGFlOTAsCisJMHgwMDAzLCAweGEyMTAsIDB4NjgzYywgMHgyMDEyLCAweDAwNzgsIDB4NGEzNiwgMHg3MDg0LCAweDgwMDgsCisJMHhhMDkyLCAweDAwMGYsIDB4MDBjOCwgMHg0OWU4LCAweDcxODYsIDB4YWU5MCwgMHgwMDAzLCAweDgwMDMsCisJMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg4MjEwLCAweDY4NDAsIDB4MjAxMiwgMHg3MDg4LCAweGExMGEsCisJMHgwMDQ4LCAweDQ5Y2YsIDB4NzE4YywgMHg3MDg0LCAweGExMGEsIDB4MDA0OCwgMHg0OWNmLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgwMGMwLCAweDQ5Y2YsIDB4MjA3MSwgMHhhNTM0LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHg0YTU2LCAweDEwNzgsIDB4NGNkMiwgMHgyMDcxLCAweDAwMDAsCisJMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAwNzgsIDB4NDljZiwgMHgxMDc4LCAweDRjZmQsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDc4LCAweDQ5Y2YsCisJMHgwMDdlLCAweDY4NGMsIDB4MDA3ZSwgMHg2ODM3LCAweDAxMDMsIDB4MjBhOSwgMHgwMDFjLCAweGFkODAsCisJMHgwMDExLCAweDIwYTAsIDB4MjAwMSwgMHgwMDAwLCAweDQwYTQsIDB4MDA3ZiwgMHhhMDg0LCAweDAwZmYsCisJMHg2ODRlLCAweDAwN2YsIDB4Njg0YSwgMHg2OTUyLCAweDAwN2MsIDB4MjA3MSwgMHhhNDEzLCAweDcwMDQsCisJMHgwMDc5LCAweDRhN2EsIDB4NGE4NCwgMHg0YTk1LCAweDRjYTMsIDB4NGNhNCwgMHg0Y2NiLCAweDRjZDEsCisJMHg0YTg1LCAweDRjOTEsIDB4NGMzMiwgMHg0Y2I0LCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgwMDY4LCAweDRhOTQsIDB4MjAwOSwgMHgwMDBkLCAweDcwMzAsIDB4MjAwYSwgMHgyMDkxLCAweDQwODAsCisJMHg3MDA3LCAweDAwMDEsIDB4NzAwYiwgMHgwMDAwLCAweDEyN2YsIDB4MjA2OSwgMHhhNWJlLCAweDY4NDQsCisJMHhhMDA1LCAweDAwNTAsIDB4NGFiZCwgMHgwMGMwLCAweDRhYmQsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDY5LCAweDAwMDAsIDB4NjkzNCwgMHgyMDAxLCAweGE0MWYsIDB4MjAwNCwgMHhhMTBhLCAweDAwNDAsCisJMHg0YWI4LCAweDAwNjgsIDB4NGFiYywgMHgyMDY5LCAweDAwMDAsIDB4NjgxOCwgMHhkMDg0LCAweDAwYzAsCisJMHg0YWJjLCAweDIwMDksIDB4ODA0MCwgMHg2OTIyLCAweDY4MWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgyMDY5LCAweGE1YmUsIDB4Njg0NywgMHhmZmZmLCAweDEyN2YsIDB4MjA2OSwgMHhhMzAwLCAweDY4NDQsCisJMHg2OTYwLCAweGExMDIsIDB4MjA2OSwgMHhhNTM0LCAweDY4OGEsIDB4Njk4NCwgMHg3MDFjLCAweGEwNmQsCisJMHgwMDQwLCAweDRhY2YsIDB4ODFmZiwgMHgwMDQwLCAweDRiMTcsIDB4MDA3OCwgMHg0YWU1LCAweDgxZmYsCisJMHgwMDQwLCAweDRiZTksIDB4MjA3MSwgMHhhNTM0LCAweDcxODQsIDB4NzA4OCwgMHhhMTBhLCAweDAwYzgsCisJMHg0YWU1LCAweDcxOTAsIDB4MjA3MSwgMHhhNWJlLCAweDcwNDAsIDB4YTAwNSwgMHgwMDQwLCAweDRhZTUsCisJMHgwMGQwLCAweDRiZTksIDB4NzE0MiwgMHgwMDc4LCAweDRiZTksIDB4MjA3MSwgMHhhNTM0LCAweDcxOGMsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDg0LCAweGExMGEsIDB4MDA0OCwgMHg0YzA2LCAweDAwNjgsCisJMHg0YjliLCAweDIwNzEsIDB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MDBjMCwgMHg0YjliLCAweDIwMDEsCisJMHhmZmZmLCAweDIwNzEsIDB4YTViZSwgMHg3MDQyLCAweDIwNzEsIDB4YTUzNCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4NGIwZCwgMHgxMDc4LCAweDRjZDIsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDc4LCAweDRiOWIsIDB4MTA3OCwgMHg0Y2ZkLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDA3OCwgMHg0YjliLCAweDIwNzEsCisJMHhhNTM0LCAweDcwMDAsIDB4YTAwNSwgMHgwMDQwLCAweDRiYzgsIDB4NjkzNCwgMHhhMTg2LCAweDAxMDMsCisJMHgwMGMwLCAweDRiOWUsIDB4Njg0YywgMHhkMGJjLCAweDAwYzAsIDB4NGJjOCwgMHg2OTQ4LCAweDY4NDQsCisJMHhhMTA1LCAweDAwYzAsIDB4NGJiYiwgMHgyMDA5LCAweDgwMjAsIDB4MjA3MSwgMHhhNTM0LCAweDcwMDAsCisJMHgwMDc5LCAweDRiMzIsIDB4NGJjOCwgMHg0YjgwLCAweDRiNTgsIDB4NGI2YSwgMHg0YjM3LCAweDEzN2UsCisJMHgxNDdlLCAweDE1N2UsIDB4MjA5OSwgMHhhMzc1LCAweDIwYTEsIDB4YTU4NSwgMHgyMGE5LCAweDAwMDQsCisJMHg1M2EzLCAweDE1N2YsIDB4MTQ3ZiwgMHgxMzdmLCAweDIwNzEsIDB4YTU3YywgMHhhZDgwLCAweDAwMGYsCisJMHg3MDBlLCAweDcwMTMsIDB4MDAwMiwgMHg3MDA3LCAweDAwMDIsIDB4NzAwYiwgMHgwMDAwLCAweDJlMTAsCisJMHgxMDc4LCAweDEzZDEsIDB4MjA3MSwgMHhhNDEzLCAweDcwMDcsIDB4MDAwOSwgMHgwMDc4LCAweDRiZTksCisJMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDFlLCAweDAwYzgsIDB4NGJlOSwgMHhhZTkwLCAweDAwMDMsCisJMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg3MTg2LCAweDIwNzEsIDB4YTQxMywgMHgxMDc4LCAweDRkNWIsCisJMHgwMDc4LCAweDRiZTksIDB4NzA4NCwgMHg4MDA4LCAweGEwOTIsIDB4MDAwZiwgMHgwMGM4LCAweDRiZTksCisJMHhhZTkwLCAweDAwMDMsIDB4ODAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg4MjEwLCAweDY4NDAsCisJMHgyMDEyLCAweDcxODYsIDB4MjA3MSwgMHhhNDEzLCAweDEwNzgsIDB4NGQ1YiwgMHgwMDc4LCAweDRiZTksCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwMDY4LCAweDRiOWIsIDB4MjA3MSwgMHgwMDAwLCAweDcwMTgsCisJMHhkMDg0LCAweDAwYzAsIDB4NGI5YiwgMHg3MTIyLCAweDY4M2MsIDB4NzAyNiwgMHg2ODQwLCAweDcwMmEsCisJMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDEyN2YsIDB4MjA3MSwgMHhhNDEzLCAweDEwNzgsCisJMHg0ZDViLCAweDAwNzgsIDB4NGJlOSwgMHgxMjdmLCAweDAwNzgsIDB4NGJlOSwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMTcsIDB4MDA0MCwgMHg0YmFjLCAweGExODYsIDB4MDAxZSwgMHgwMDQwLCAweDRiYWMsCisJMHhhMThlLCAweDAwMWYsIDB4MDBjMCwgMHg0YmM4LCAweDY4NGMsIDB4ZDBjYywgMHgwMDQwLCAweDRiYzgsCisJMHg2ODUwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHg0YmM4LCAweDIwMDksCisJMHg4MDIxLCAweDAwNzgsIDB4NGIyZCwgMHg2ODQ0LCAweGEwODYsIDB4MDEwMCwgMHgwMGMwLCAweDRiYzgsCisJMHg2ODY4LCAweGEwMDUsIDB4MDBjMCwgMHg0YmM4LCAweDIwMDksIDB4ODAyMCwgMHgwMDc4LCAweDRiMmQsCisJMHgyMDcxLCAweGE0MTMsIDB4MTA3OCwgMHg0ZDZmLCAweDAwNDAsIDB4NGJlOSwgMHgyMDcxLCAweGE0MTMsCisJMHg3MDBmLCAweDAwMDEsIDB4NjkzNCwgMHhhMTg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg0YmUwLCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDgxMDEsIDB4MDA0MCwgMHg0YmUwLCAweDcxMGUsCisJMHg3MDA3LCAweDAwMDMsIDB4MTA3OCwgMHg0ZDhmLCAweDcwNTAsIDB4YTA4NiwgMHgwMTAwLCAweDAwNDAsCisJMHg0Y2E0LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YTQxMywgMHg3MDA4LCAweGEwODYsCisJMHgwMDAxLCAweDAwYzAsIDB4NGMwNCwgMHgwMDY4LCAweDRjMDQsIDB4MjAwOSwgMHgwMDBkLCAweDcwMzAsCisJMHgyMDBhLCAweDIwOTEsIDB4NDA4MCwgMHg3MDBiLCAweDAwMDAsIDB4NzAwNCwgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDRjMDQsIDB4NzAwNywgMHgwMDAxLCAweDEyN2YsIDB4MDA3YywgMHgyMDcxLCAweGE0MTMsCisJMHgxMDc4LCAweDRkNmYsIDB4MDA0MCwgMHg0YzJmLCAweDIwNzEsIDB4YTUzNCwgMHg3MDg0LCAweDcwMGEsCisJMHgyMGE5LCAweDAwMjAsIDB4MjA5OSwgMHhhNTM1LCAweDIwYTEsIDB4YTU1YywgMHg1M2EzLCAweDcwODcsCisJMHgwMDAwLCAweDIwNzEsIDB4YTQxMywgMHgyMDY5LCAweGE1N2MsIDB4NzA2YywgMHg2ODI2LCAweDcwNzAsCisJMHg2ODJhLCAweDcwNzQsIDB4NjgyZSwgMHg3MDc4LCAweDY4MzIsIDB4MmQxMCwgMHgxMDc4LCAweDEzZDEsCisJMHg3MDA3LCAweDAwMDgsIDB4MjAwMSwgMHhmZmZmLCAweDIwNzEsIDB4YTViZSwgMHg3MDQyLCAweDEyN2YsCisJMHgwMDc4LCAweDRiZTksIDB4MjA2OSwgMHhhNTdjLCAweDY4MDgsIDB4YTA4ZSwgMHgwMDAwLCAweDAwNDAsCisJMHg0YzkwLCAweGEwOGUsIDB4MDIwMCwgMHgwMDQwLCAweDRjOGUsIDB4YTA4ZSwgMHgwMTAwLCAweDAwYzAsCisJMHg0YzkwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjgsIDB4NGM4YiwgMHgyMDY5LCAweDAwMDAsCisJMHg2ODE4LCAweGQwODQsIDB4MDBjMCwgMHg0YzhiLCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LCAweGExMDIsCisJMHgwMDQ4LCAweDRjNTksIDB4YTAwZSwgMHg3MDM0LCAweDcwNmUsIDB4NzAzOCwgMHg3MDcyLCAweDAwNzgsCisJMHg0YzYzLCAweDcwNmMsIDB4YTA4MCwgMHgwMDQwLCAweDcwNmUsIDB4MDBjOCwgMHg0YzYzLCAweDcwNzAsCisJMHhhMDgxLCAweDAwMDAsIDB4NzA3MiwgMHg3MTMyLCAweDY5MzYsIDB4NzAwYiwgMHgwMDAwLCAweDIwMDEsCisJMHhhNTU5LCAweDIwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDRjODIsIDB4NjkzNCwgMHgyMDY5LCAweGE1MzQsCisJMHg2ODljLCAweDY5OWUsIDB4MjA2OSwgMHhhNWJlLCAweGExMDIsIDB4MDBjMCwgMHg0YzdiLCAweDY4NDQsCisJMHhhMDA1LCAweDAwZDAsIDB4NGM4OSwgMHgyMDAxLCAweGE1NWEsIDB4MjAwYywgMHg4MTBkLCAweDY5NDYsCisJMHgwMDc4LCAweDRjODksIDB4MjAwOSwgMHg4MDQwLCAweDY5MjIsIDB4NjgxYiwgMHgwMDAxLCAweDIwOTEsCisJMHg0MDgwLCAweDcwMDcsIDB4MDAwMSwgMHgxMjdmLCAweDAwNzgsIDB4NGM5MCwgMHg3MDA3LCAweDAwMDUsCisJMHgwMDdjLCAweDcwMWMsIDB4YTA2ZCwgMHgwMDQwLCAweDRjYTIsIDB4MTA3OCwgMHg0ZDZmLCAweDAwNDAsCisJMHg0Y2EyLCAweDcwMDcsIDB4MDAwMywgMHgxMDc4LCAweDRkOGYsIDB4NzA1MCwgMHhhMDg2LCAweDAxMDAsCisJMHgwMDQwLCAweDRjYTQsIDB4MDA3YywgMHgwMDdjLCAweDcwNTAsIDB4YTA5ZSwgMHgwMTAwLCAweDAwYzAsCisJMHg0Y2FkLCAweDcwMDcsIDB4MDAwNCwgMHgwMDc4LCAweDRjY2IsIDB4YTA4NiwgMHgwMjAwLCAweDAwYzAsCisJMHg0Y2IzLCAweDcwMDcsIDB4MDAwNSwgMHgwMDdjLCAweDIwMDEsIDB4YTU3ZSwgMHgyMDA0LCAweGEwOGUsCisJMHgwMTAwLCAweDAwYzAsIDB4NGNjMCwgMHg3MDA3LCAweDAwMDEsIDB4MTA3OCwgMHg0ZDViLCAweDAwN2MsCisJMHhhMDhlLCAweDAwMDAsIDB4MDA0MCwgMHg0Y2JmLCAweGEwOGUsIDB4MDIwMCwgMHgwMGMwLCAweDRjYmYsCisJMHg3MDA3LCAweDAwMDUsIDB4MDA3YywgMHgxMDc4LCAweDRkMjUsIDB4NzAwNiwgMHgxMDc4LCAweDRkNWIsCisJMHgwMDdjLCAweDAwN2MsIDB4MGU3ZSwgMHgxNTdlLCAweDIwNzEsIDB4YTUzNCwgMHg3MTg0LCAweDgxZmYsCisJMHgwMDQwLCAweDRjZmEsIDB4YTAwNiwgMHg3MDg2LCAweGFlODAsIDB4MDAwMywgMHgyMDcxLCAweDAwMDAsCisJMHgyMWE4LCAweDIwMTQsIDB4NzIyNiwgMHg4MDAwLCAweDAwNzAsIDB4NGNmNywgMHgyMDE0LCAweDcyMmEsCisJMHg4MDAwLCAweDAwNzAsIDB4NGNmNywgMHgyMDE0LCAweDcyMmUsIDB4ODAwMCwgMHgwMDcwLCAweDRjZjcsCisJMHgyMDE0LCAweDcyM2EsIDB4ODAwMCwgMHgwMDcwLCAweDRjZjcsIDB4MjAxNCwgMHg3MjNlLCAweGExODAsCisJMHg4MDMwLCAweDcwMjIsIDB4MTU3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgxNTdlLCAweDIwNzEsCisJMHhhNTM0LCAweDcxODQsIDB4ODFmZiwgMHgwMDQwLCAweDRkMjIsIDB4YTAwNiwgMHg3MDg2LCAweGFlODAsCisJMHgwMDAzLCAweDIwNzEsIDB4MDAwMCwgMHgyMWE4LCAweDIwMTQsIDB4NzIyNiwgMHg4MDAwLCAweDIwMTQsCisJMHg3MjJhLCAweDgwMDAsIDB4MDA3MCwgMHg0ZDFiLCAweDIwMTQsIDB4NzIzYSwgMHg4MDAwLCAweDIwMTQsCisJMHg3MjNlLCAweDAwNzgsIDB4NGQxZiwgMHgyMDAxLCAweDgwMjAsIDB4MDA3OCwgMHg0ZDIxLCAweDIwMDEsCisJMHg4MDQyLCAweDcwMjIsIDB4MTU3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzAyYywgMHg3MTMwLCAweDgxMDgsCisJMHhhMTAyLCAweDAwNDgsIDB4NGQzMiwgMHhhMDBlLCAweDcwMzQsIDB4NzA2ZSwgMHg3MDM4LCAweDcwNzIsCisJMHgwMDc4LCAweDRkM2MsIDB4NzA2YywgMHhhMDgwLCAweDAwNDAsIDB4NzA2ZSwgMHgwMGM4LCAweDRkM2MsCisJMHg3MDcwLCAweGEwODEsIDB4MDAwMCwgMHg3MDcyLCAweDcxMzIsIDB4NzAwYywgMHg4MDAxLCAweDcwMGUsCisJMHgwMGMwLCAweDRkNTIsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MDA2OCwgMHg0ZDU1LCAweDIwMDEsCisJMHgwMDBkLCAweDIxMDIsIDB4MjA5MSwgMHg0MDgwLCAweDIwMDEsIDB4MDAwMSwgMHg3MDBiLCAweDAwMDAsCisJMHgxMjdmLCAweDAwN2MsIDB4MjAwMSwgMHgwMDA3LCAweDAwN2MsIDB4MjAwMSwgMHgwMDA2LCAweDcwMGIsCisJMHgwMDAxLCAweDEyN2YsIDB4MDA3YywgMHg3MDFjLCAweGEwNmQsIDB4MDA0MCwgMHg0ZDZlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsIDB4MmQwNCwgMHg3MDFlLCAweGEwMDUsCisJMHgwMGMwLCAweDRkNmIsIDB4NzAxYSwgMHgxMjdmLCAweDEwNzgsIDB4MTM5YSwgMHgwMDdjLCAweDIwMTksCisJMHgwMDBkLCAweDIzMDQsIDB4MjMwYywgMHhhMTBlLCAweDAwNDAsIDB4NGQ3ZSwgMHgyMzA0LCAweDIzMGMsCisJMHhhMTBlLCAweDAwNDAsIDB4NGQ3ZSwgMHhhMDA2LCAweDAwNzgsIDB4NGQ4ZSwgMHg3MzJjLCAweDgzMTksCisJMHg3MTMwLCAweGExMDIsIDB4MDBjMCwgMHg0ZDg4LCAweDIzMDAsIDB4YTAwNSwgMHgwMDc4LCAweDRkOGUsCisJMHgwMDQ4LCAweDRkOGQsIDB4YTMwMiwgMHgwMDc4LCAweDRkOGUsIDB4ODAwMiwgMHgwMDdjLCAweDJkMDAsCisJMHg3MDI2LCAweGEwODAsIDB4MDAwZCwgMHg3MDU2LCAweDcwNTMsIDB4MDAwMCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwMDksIDB4YTVkMCwgMHgyMTA0LCAweGMwOGQsIDB4MjAwYSwgMHgxMjdmLCAweDEwNzgsCisJMHgxM2ViLCAweDAwN2MsIDB4MjA3MSwgMHhhM2UxLCAweDcwMDMsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDAsCisJMHg3MDBmLCAweDAwMDAsIDB4NzAyYiwgMHgwMDAxLCAweDcwNGYsIDB4MDAwMCwgMHg3MDUzLCAweDAwMDEsCisJMHg3MDVmLCAweDAwMjAsIDB4NzA2MywgMHgwMDQwLCAweDcwODMsIDB4MDAwMCwgMHg3MDhiLCAweDAwMDAsCisJMHg3MDhmLCAweDAwMDEsIDB4NzBiZiwgMHgwMDAwLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGEzZTEsCisJMHg2ODQ4LCAweGEwMDUsIDB4MDBjMCwgMHg0ZGNiLCAweDcwMjgsIDB4YzA4NSwgMHg3MDJhLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4NGRmMCwgMHg2YTUwLCAweDcyMzYsIDB4NmI1NCwgMHg3MzNhLCAweDY4NTgsCisJMHg3MDNlLCAweDcwN2EsIDB4Njg1YywgMHg3MDQyLCAweDcwN2UsIDB4Njg0OCwgMHg3MDJlLCAweDY4NDAsCisJMHg3MDMyLCAweDIwMDksIDB4MDAwYywgMHgyMDBhLCAweDgwMDcsIDB4ODAwNiwgMHg4MDA2LCAweGEwOGMsCisJMHgwMDNmLCAweGEwODQsIDB4ZmZjMCwgMHhhMjEwLCAweDIxMDAsIDB4YTMxOSwgMHg3MjcyLCAweDczNzYsCisJMHg3MDI4LCAweGMwODQsIDB4NzAyYSwgMHg3MDA3LCAweDAwMDEsIDB4NzAwZiwgMHgwMDAwLCAweGEwMDYsCisJMHgwZTdmLCAweDAwN2MsIDB4MmI3OCwgMHgyMDcxLCAweGEzZTEsIDB4NzAwNCwgMHgxMDc5LCAweDRlNTAsCisJMHg3MDBjLCAweDAwNzksIDB4NGRmYiwgMHg0ZTAwLCAweDRkZjUsIDB4NGRmNSwgMHg0ZGY1LCAweDRkZjUsCisJMHgwMDdjLCAweDcwMGMsIDB4MDA3OSwgMHg0ZTA0LCAweDRlMDksIDB4NGU0ZSwgMHg0ZTRlLCAweDRlNGYsCisJMHg0ZTRmLCAweDc4MzAsIDB4NzkzMCwgMHhhMTA2LCAweDAwNDAsIDB4NGUxMywgMHg3ODMwLCAweDc5MzAsCisJMHhhMTA2LCAweDAwYzAsIDB4NGUzOSwgMHg3MDMwLCAweGExMGEsIDB4MDA0MCwgMHg0ZTM5LCAweDAwYzgsCisJMHg0ZTFiLCAweDcxMmMsIDB4YTEwYSwgMHhhMThhLCAweDAwMDIsIDB4MDBjOCwgMHg0ZTNhLCAweDEwNzgsCisJMHgxMzY2LCAweDAwNDAsIDB4NGUzOSwgMHgyZDAwLCAweDcwNWEsIDB4NzA2MywgMHgwMDQwLCAweDIwMDEsCisJMHgwMDAzLCAweDcwNTcsIDB4MDAwMCwgMHgxMjdlLCAweDAwN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksCisJMHhhNWQwLCAweDIxMDQsIDB4YzA4NSwgMHgyMDBhLCAweDAwN2YsIDB4NzAwZSwgMHgxMjdmLCAweDEwNzgsCisJMHgxM2ViLCAweDAwN2MsIDB4MTA3OCwgMHgxMzY2LCAweDAwNDAsIDB4NGUzOSwgMHgyZDAwLCAweDcwNWEsCisJMHgxMDc4LCAweDEzNjYsIDB4MDBjMCwgMHg0ZTQ2LCAweDAwNzgsIDB4NGUyNSwgMHgyZDAwLCAweDcwODYsCisJMHg3MDYzLCAweDAwODAsIDB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4NGUyOSwgMHgwMDdjLCAweDAwN2MsCisJMHg0ZTYxLCAweDRlNjIsIDB4NGU5OSwgMHg0ZTlhLCAweDRlNGUsIDB4NGVkMCwgMHg0ZWQ1LCAweDRmMGMsCisJMHg0ZjBkLCAweDRmMjgsIDB4NGYyOSwgMHg0ZjJhLCAweDRmMmIsIDB4NGYyYywgMHg0ZjJkLCAweDRmYWQsCisJMHg0ZmQ3LCAweDAwN2MsIDB4NzAwYywgMHgwMDc5LCAweDRlNjUsIDB4NGU2YSwgMHg0ZTZkLCAweDRlN2QsCisJMHg0ZTk4LCAweDRlOTgsIDB4MTA3OCwgMHg0ZTAxLCAweDAwN2MsIDB4MTI3ZSwgMHg4MDAxLCAweDcwMGUsCisJMHg3MDU4LCAweDAwN2UsIDB4MTA3OCwgMHg1MzQ4LCAweDAwNDAsIDB4NGU3YSwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDRlMDEsIDB4MGQ3ZiwgMHgwMDc4LCAweDRlODYsIDB4MTI3ZSwgMHg4MDAxLCAweDcwMGUsCisJMHgxMDc4LCAweDUzNDgsIDB4NzA1OCwgMHgyMDY4LCAweDcwODQsIDB4NzA1YSwgMHg2ODAzLCAweDAwMDAsCisJMHg2ODA3LCAweDAwMDAsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDIwLCAweDAwYzgsCisJMHg0ZTk1LCAweDEwNzksIDB4NGViMCwgMHgxMjdmLCAweDAwN2MsIDB4MTI3ZiwgMHgxMDc4LCAweDRmMmUsCisJMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTNlMSwgMHg3MDBjLCAweDAwNzksCisJMHg0ZWExLCAweDRlYTYsIDB4NGVhNiwgMHg0ZWE2LCAweDRlYTgsIDB4NGVhYywgMHgwZTdmLCAweDAwN2MsCisJMHg3MDBmLCAweDAwMDEsIDB4MDA3OCwgMHg0ZWFlLCAweDcwMGYsIDB4MDAwMiwgMHgwZTdmLCAweDAwN2MsCisJMHg0ZjJlLCAweDRmMmUsIDB4NGY0YSwgMHg0ZjJlLCAweDUwODAsIDB4NGYyZSwgMHg0ZjJlLCAweDRmMmUsCisJMHg0ZjJlLCAweDRmMmUsIDB4NGY0YSwgMHg1MGNhLCAweDUxMTcsIDB4NTE3MCwgMHg1MTg2LCAweDRmMmUsCisJMHg0ZjJlLCAweDRmNjYsIDB4NGY0YSwgMHg0ZjJlLCAweDRmMmUsIDB4NGY4NywgMHg1MjQ1LCAweDUyNjMsCisJMHg0ZjJlLCAweDRmNjYsIDB4NGYyZSwgMHg0ZjJlLCAweDRmMmUsIDB4NGYyZSwgMHg0ZjdjLCAweDUyNjMsCisJMHg3MDIwLCAweDIwNjgsIDB4MTA3OCwgMHgxMzlhLCAweDAwN2MsIDB4NzAwYywgMHgwMDc5LCAweDRlZDgsCisJMHg0ZWRkLCAweDRlZTAsIDB4NGVmMCwgMHg0ZjBiLCAweDRmMGIsIDB4MTA3OCwgMHg0ZTAxLCAweDAwN2MsCisJMHgxMjdlLCAweDgwMDEsIDB4NzAwZSwgMHg3MDU4LCAweDAwN2UsIDB4MTA3OCwgMHg1MzQ4LCAweDAwNDAsCisJMHg0ZWVkLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDRlMDEsIDB4MGQ3ZiwgMHgwMDc4LCAweDRlZjksCisJMHgxMjdlLCAweDgwMDEsIDB4NzAwZSwgMHgxMDc4LCAweDUzNDgsIDB4NzA1OCwgMHgyMDY4LCAweDcwODQsCisJMHg3MDVhLCAweDY4MDMsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhhLCAweDAwMWEsIDB4MDBjOCwgMHg0ZjA4LCAweDEwNzksIDB4NGYwZSwgMHgxMjdmLCAweDAwN2MsCisJMHgxMjdmLCAweDEwNzgsIDB4NGYyZSwgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHg0ZjJlLCAweDRmNGEsCisJMHg1MDZhLCAweDRmMmUsIDB4NGY0YSwgMHg0ZjJlLCAweDRmNGEsIDB4NGY0YSwgMHg0ZjJlLCAweDRmNGEsCisJMHg1MDZhLCAweDRmNGEsIDB4NGY0YSwgMHg0ZjRhLCAweDRmNGEsIDB4NGY0YSwgMHg0ZjJlLCAweDRmNGEsCisJMHg1MDZhLCAweDRmMmUsIDB4NGYyZSwgMHg0ZjRhLCAweDRmMmUsIDB4NGYyZSwgMHg0ZjJlLCAweDRmNGEsCisJMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHgwMDdjLCAweDAwN2MsIDB4MDA3YywgMHg3MDA3LCAweDAwMDEsCisJMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGQ1LCAweDY4M2EsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDQ5ODIsIDB4MTI3ZiwgMHgwMDdjLCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsCisJMHgwMGZmLCAweGMwZTUsIDB4NjgzYSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDQ5ODIsCisJMHgxMjdmLCAweDAwN2MsIDB4NzAwNywgMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZWQsCisJMHg2ODNhLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NDk4MiwgMHgxMjdmLCAweDAwN2MsCisJMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsIDB4YzBkZCwgMHg2ODNhLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg0OTgyLCAweDEyN2YsIDB4MDA3YywgMHg2ODM0LCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHg0ZjNjLCAweDgwMDEsIDB4MDBjMCwgMHg0ZjczLCAweDcwMDcsCisJMHgwMDAxLCAweDAwNzgsIDB4NTA0OSwgMHg3MDA3LCAweDAwMDYsIDB4NzAxMiwgMHgyZDAwLCAweDcwMTYsCisJMHg3MDFhLCAweDcwNGIsIDB4NTA0OSwgMHgwMDdjLCAweDY4NGMsIDB4YTA4NCwgMHgwMGMwLCAweGEwODYsCisJMHgwMGMwLCAweDAwYzAsIDB4NGY4NywgMHg3MDA3LCAweDAwMDEsIDB4MDA3OCwgMHg1MjgwLCAweDJkMDAsCisJMHg3MDE2LCAweDcwMWEsIDB4MjBhOSwgMHgwMDA0LCAweGEwODAsIDB4MDAyNCwgMHgyMDk4LCAweDIwYTEsCisJMHhhNDBjLCAweDUzYTMsIDB4Njg1OCwgMHg3MDEyLCAweGEwODIsIDB4MDQwMSwgMHgwMGM4LCAweDRmNTgsCisJMHg2ODg0LCAweGEwOGEsIDB4MDAwMiwgMHgwMGM4LCAweDRmNTgsIDB4ODJmZiwgMHgwMGMwLCAweDRmYTksCisJMHg2ODg4LCAweDY5OGMsIDB4YTEwNSwgMHgwMDQwLCAweDRmYTksIDB4MjAwMSwgMHg1MDE5LCAweDAwNzgsCisJMHg0ZmFjLCAweGEyODAsIDB4NTAwZiwgMHgyMDA0LCAweDcwYzYsIDB4NzAxMCwgMHhhMDE1LCAweDAwNDAsCisJMHg0ZmY3LCAweDEwNzgsIDB4MTM2NiwgMHgwMGMwLCAweDRmYjgsIDB4NzAwNywgMHgwMDBmLCAweDAwN2MsCisJMHgyZDAwLCAweDcwMjIsIDB4NzBjNCwgMHgyMDYwLCAweDYwMDAsIDB4NjgzNiwgMHg2MDA0LCAweGFkMDAsCisJMHg3MDk2LCAweDYwMDgsIDB4YTIwYSwgMHgwMGM4LCAweDRmYzcsIDB4YTAwZSwgMHgyMjAwLCAweDcxMTIsCisJMHg2MjBjLCAweDgwMDMsIDB4ODAwYiwgMHhhMjk2LCAweDAwMDQsIDB4MDA0MCwgMHg0ZmQwLCAweGExMDgsCisJMHg3MTlhLCAweDgxMGIsIDB4NzE5ZSwgMHhhZTkwLCAweDAwMjIsIDB4MTA3OCwgMHgxM2QxLCAweDcwOTAsCisJMHhhMDhlLCAweDAxMDAsIDB4MDA0MCwgMHg0ZmViLCAweGEwODYsIDB4MDIwMCwgMHgwMDQwLCAweDRmZTMsCisJMHg3MDA3LCAweDAwMTAsIDB4MDA3YywgMHg3MDIwLCAweDIwNjgsIDB4MTA3OCwgMHgxMzlhLCAweDcwMTQsCisJMHgyMDY4LCAweDAwNzgsIDB4NGY1OCwgMHg3MDIwLCAweDIwNjgsIDB4NzAxOCwgMHg2ODAyLCAweDY4MDcsCisJMHgwMDAwLCAweDJkMDgsIDB4MjA2OCwgMHg2OTA2LCAweDcxMWEsIDB4MDA3OCwgMHg0ZmFkLCAweDcwMTQsCisJMHgyMDY4LCAweDcwMDcsIDB4MDAwMSwgMHg2ODg0LCAweGEwMDUsIDB4MDBjMCwgMHg1MDA2LCAweDY4ODgsCisJMHg2OThjLCAweGExMDUsIDB4MDA0MCwgMHg1MDA2LCAweDEwNzgsIDB4NTAxZCwgMHg2ODM0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgwMDQwLCAweDUyODAsIDB4MDA3OCwgMHg1MDQ5LCAweDUwMTEsCisJMHg1MDE1LCAweDAwMDIsIDB4MDAxMSwgMHgwMDA3LCAweDAwMDQsIDB4MDAwYSwgMHgwMDBmLCAweDAwMDUsCisJMHgwMDA2LCAweDAwMGEsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDQsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsCisJMHgwNzdlLCAweDA2N2UsIDB4NmY4OCwgMHg2ZThjLCAweDY4MDQsIDB4MjA2MCwgMHhhY2YwLCAweDAwMjEsCisJMHhhY2Y4LCAweDAwMjcsIDB4MjAwOSwgMHgwMDA1LCAweDcwMGMsIDB4NzgxNiwgMHg3MDA4LCAweDc4MTIsCisJMHg3MDA0LCAweDc4MDYsIDB4NzAwMCwgMHg3ODAyLCAweDdlMGUsIDB4N2YwYSwgMHg4MTA5LCAweDAwNDAsCisJMHg1MDNmLCAweGFlZjIsIDB4MDAwNCwgMHhhZmZhLCAweDAwMDYsIDB4MDA3OCwgMHg1MDJjLCAweDYwMDQsCisJMHhhMDY1LCAweDAwYzAsIDB4NTAyNiwgMHgwNjdmLCAweDA3N2YsIDB4MGM3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwMDdjLCAweDIwMDksIDB4YTMyZSwgMHgyMTBjLCAweDgxZmYsIDB4MDBjMCwgMHg1MDY0LCAweDY4MzgsCisJMHhhMDg0LCAweDAwZmYsIDB4NjgzYSwgMHgxMDc4LCAweDQyOTAsIDB4MDBjMCwgMHg1MDU4LCAweDAwN2MsCisJMHgxMDc4LCAweDRhNjAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg4Y2I4LCAweDEwNzgsCisJMHg0OTgyLCAweDEyN2YsIDB4MDA3OCwgMHg1MDU3LCAweDIwMDEsIDB4MDAyOCwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDc4LCAweDUwNTgsIDB4NzAxOCwgMHg2ODAyLCAweDJkMDgsIDB4MjA2OCwgMHg2OTA2LCAweDcxMWEsCisJMHg3MDEwLCAweDgwMDEsIDB4NzAxMiwgMHgwMDQwLCAweDUwNzksIDB4NzAwNywgMHgwMDA2LCAweDAwNzgsCisJMHg1MDdmLCAweDcwMTQsIDB4MjA2OCwgMHg3MDA3LCAweDAwMDEsIDB4NzA0OCwgMHgxMDdhLCAweDAwN2MsCisJMHg3MDA3LCAweDAwMDEsIDB4Njk0NCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHg2ODQ4LCAweGEwODQsCisJMHgwMGZmLCAweDIwYTksIDB4MDAwMSwgMHhhMDk2LCAweDAwMDEsIDB4MDA0MCwgMHg1MGE5LCAweDIwMDksCisJMHgwMDAwLCAweDIwYTksIDB4MDBmZiwgMHhhMDk2LCAweDAwMDIsIDB4MDA0MCwgMHg1MGE5LCAweGEwMDUsCisJMHgwMGMwLCAweDUwYmMsIDB4Njk0NCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgxMDc4LCAweDQ1MDEsCisJMHgwMGMwLCAweDUwYmMsIDB4MDY3ZSwgMHg2ZTUwLCAweDEwNzgsIDB4NDVlNywgMHgwNjdmLCAweDAwNzgsCisJMHg1MGJjLCAweDA0N2UsIDB4MjAxMSwgMHhhMzBjLCAweDIyMjQsIDB4YzQ4NCwgMHhjNDhjLCAweDI0MTIsCisJMHgwNDdmLCAweDBjN2UsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4NTBiOCwgMHgxMDc4LCAweDQ3ODIsCisJMHg4MTA4LCAweDAwZjAsIDB4NTBiMiwgMHgwYzdmLCAweDY4NGMsIDB4ZDA4NCwgMHgwMGMwLCAweDUwYzMsCisJMHgxMDc4LCAweDEzOWEsIDB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDQ5ODIsCisJMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsCisJMHhhMzUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDUxMGUsIDB4MjA2MSwgMHhhNjJkLCAweDYxMDAsCisJMHhkMTg0LCAweDAwNDAsIDB4NTBlZSwgMHg2ODU4LCAweGEwODQsIDB4MDBmZiwgMHgwMGMwLCAweDUxMTEsCisJMHg2MDAwLCAweGQwODQsIDB4MDA0MCwgMHg1MTBlLCAweDYwMDQsIDB4YTAwNSwgMHgwMGMwLCAweDUxMTQsCisJMHg2MDAzLCAweDAwMDAsIDB4NjAwYiwgMHgwMDAwLCAweDAwNzgsIDB4NTEwYiwgMHgyMDExLCAweDAwMDEsCisJMHg2ODYwLCAweGEwMDUsIDB4MDBjMCwgMHg1MGY2LCAweDIwMDEsIDB4MDAxZSwgMHg4MDAwLCAweDYwMTYsCisJMHg2ODU4LCAweGEwODQsIDB4MDBmZiwgMHgwMDQwLCAweDUxMGUsIDB4NjAwNiwgMHg2ODU4LCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHg1MTBlLCAweDYwMGEsIDB4Njg1OCwgMHg4MDAwLCAweDAwYzAsCisJMHg1MTBhLCAweGMyOGQsIDB4NjIwMiwgMHgxMjdmLCAweDAwNzgsIDB4NTMzNywgMHgxMjdmLCAweDAwNzgsCisJMHg1MzJmLCAweDEyN2YsIDB4MDA3OCwgMHg1MzI3LCAweDEyN2YsIDB4MDA3OCwgMHg1MzJiLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYTQsCisJMHgwMDQwLCAweDUxNmQsIDB4MjA2MSwgMHhhNjJkLCAweDYwMDAsIDB4ZDA4NCwgMHgwMDQwLCAweDUxNmQsCisJMHg2MjA0LCAweDYzMDgsIDB4ZDA4YywgMHgwMGMwLCAweDUxNWYsIDB4NmM0OCwgMHhhNDg0LCAweDAwMDMsCisJMHgwMDQwLCAweDUxNDUsIDB4Njk1OCwgMHhhMThjLCAweDAwZmYsIDB4ODAwMSwgMHgwMGMwLCAweDUxM2UsCisJMHgyMTAwLCAweGEyMTAsIDB4MDA0OCwgMHg1MTZhLCAweDAwNzgsIDB4NTE0NSwgMHg4MDAxLCAweDAwYzAsCisJMHg1MTZhLCAweDIxMDAsIDB4YTIxMiwgMHgwMDQ4LCAweDUxNmEsIDB4YTQ4NCwgMHgwMDBjLCAweDAwNDAsCisJMHg1MTVmLCAweDY5NTgsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTA4MiwgMHgwMDA0LCAweDAwYzAsCisJMHg1MTU3LCAweDIxMDAsIDB4YTMxOCwgMHgwMDQ4LCAweDUxNmEsIDB4MDA3OCwgMHg1MTVmLCAweGEwODIsCisJMHgwMDA0LCAweDAwYzAsIDB4NTE2YSwgMHgyMTAwLCAweGEzMWEsIDB4MDA0OCwgMHg1MTZhLCAweDY4NjAsCisJMHhhMDA1LCAweDAwNDAsIDB4NTE2NSwgMHg4MDAwLCAweDYwMTYsIDB4NjIwNiwgMHg2MzBhLCAweDEyN2YsCisJMHgwMDc4LCAweDUzMzcsIDB4MTI3ZiwgMHgwMDc4LCAweDUzMzMsIDB4MTI3ZiwgMHgwMDc4LCAweDUzMmYsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4MjA2MSwgMHhhNjJkLCAweDYzMDAsCisJMHhkMzhjLCAweDAwYzAsIDB4NTE4MCwgMHg2MzA4LCAweDgzMTgsIDB4MDA0OCwgMHg1MTgzLCAweDYzMGEsCisJMHgxMjdmLCAweDAwNzgsIDB4NTM0NSwgMHgxMjdmLCAweDAwNzgsIDB4NTMzMywgMHgxMjdlLCAweDBjN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDY4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDUxOWEsCisJMHgwYzdlLCAweDIwNjEsIDB4YTYyZCwgMHg2MDAwLCAweGEwODQsIDB4ZmNmZiwgMHg2MDAyLCAweDBjN2YsCisJMHgwMDc4LCAweDUxYzksIDB4Njg1OCwgMHhhMDA1LCAweDAwNDAsIDB4NTFlMCwgMHg2ODVjLCAweGEwNjUsCisJMHgwMDQwLCAweDUxZGMsIDB4MjAwMSwgMHhhMzJlLCAweDIwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDUxYWMsCisJMHgxMDc4LCAweDhjMDEsIDB4MDA3OCwgMHg1MWJhLCAweDYwMTMsIDB4MDQwMCwgMHg2MDM3LCAweDAwMDAsCisJMHg2OTRjLCAweGQxYTQsIDB4MDA0MCwgMHg1MWI2LCAweDY5NTAsIDB4NjEzNiwgMHgyMDA5LCAweDAwNDEsCisJMHgxMDc4LCAweDc1NmMsIDB4Njk1OCwgMHhhMThjLCAweGZmMDAsIDB4YTE4NiwgMHgyMDAwLCAweDAwYzAsCisJMHg1MWM5LCAweDAyN2UsIDB4MjAwOSwgMHgwMDAwLCAweDIwMTEsIDB4ZmRmZiwgMHgxMDc4LCAweDVhNmQsCisJMHgwMjdmLCAweDY4NGMsIDB4ZDBjNCwgMHgwMDQwLCAweDUxZDgsIDB4MjA2MSwgMHhhNjJkLCAweDYwMDAsCisJMHhkMDhjLCAweDAwYzAsIDB4NTFkOCwgMHg2MDA4LCAweDgwMDAsIDB4MDA0OCwgMHg1MWRjLCAweDYwMGEsCisJMHgwYzdmLCAweDEyN2YsIDB4MDA3OCwgMHg1MzM3LCAweDBjN2YsIDB4MTI3ZiwgMHgwMDc4LCAweDUzMmYsCisJMHg2OTU0LCAweGExODYsIDB4MDA0NSwgMHgwMDQwLCAweDUyMTMsIDB4YTE4NiwgMHgwMDJhLCAweDAwYzAsCisJMHg1MWYwLCAweDIwMDEsIDB4YTMwYywgMHgyMDBjLCAweGMxOTQsIDB4MjEwMiwgMHgwMDc4LCAweDUxYzksCisJMHhhMTg2LCAweDAwMjAsIDB4MDA0MCwgMHg1MjA5LCAweGExODYsIDB4MDAyOSwgMHgwMDQwLCAweDUxZmMsCisJMHhhMTg2LCAweDAwMmQsIDB4MDBjMCwgMHg1MWRjLCAweDY5NDQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHg1MWM5LCAweDYwMDAsIDB4YzBlNCwgMHg2MDAyLCAweDAwNzgsCisJMHg1MWM5LCAweDY4NWMsIDB4YTA2NSwgMHgwMDQwLCAweDUxZGMsIDB4MjAwMSwgMHhhNWExLCAweDIwMDQsCisJMHg2MDE2LCAweDAwNzgsIDB4NTFjOSwgMHg2ODVjLCAweGEwNjUsIDB4MDA0MCwgMHg1MWRjLCAweDBlN2UsCisJMHg2ODYwLCAweGEwNzUsIDB4MjAwMSwgMHhhMzJlLCAweDIwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDUyMmIsCisJMHgxMDc4LCAweDhjMDEsIDB4OGVmZiwgMHgwMDQwLCAweDUyMjgsIDB4MmU2MCwgMHgxMDc4LCAweDhjMDEsCisJMHgwZTdmLCAweDAwNzgsIDB4NTFjOSwgMHg2MDI0LCAweGMwZGMsIDB4YzBkNSwgMHg2MDI2LCAweDJlNjAsCisJMHg2MDA3LCAweDAwM2EsIDB4Njg3MCwgMHhhMDA1LCAweDAwNDAsIDB4NTIzYywgMHg2MDA3LCAweDAwM2IsCisJMHg2ODc0LCAweDYwMmEsIDB4Njg3OCwgMHg2MDEyLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDViZjgsCisJMHgxMDc4LCAweDYxMDksIDB4MGU3ZiwgMHgwMDc4LCAweDUxYzksIDB4MjA2MSwgMHhhNjJkLCAweDYwMDAsCisJMHhkMDg0LCAweDAwNDAsIDB4NTI1ZiwgMHhkMDhjLCAweDAwYzAsIDB4NTM0NSwgMHgyMDkxLCAweDgwMDAsCisJMHg2MjA0LCAweDgyMTAsIDB4MDA0OCwgMHg1MjU5LCAweDYyMDYsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsCisJMHg1MzQ1LCAweDIwOTEsIDB4ODAwMSwgMHg2ODUzLCAweDAwMTYsIDB4MDA3OCwgMHg1MzNlLCAweDY4NTMsCisJMHgwMDA3LCAweDAwNzgsIDB4NTMzZSwgMHg2ODM0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAwYzAsCisJMHg1MjZkLCAweDEwNzgsIDB4NGYzYywgMHgwMDc4LCAweDUyN2YsIDB4MjAzMCwgMHg4MDAxLCAweDAwYzAsCisJMHg1Mjc3LCAweDcwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDUyODAsIDB4MDA3OCwgMHg1MjdmLCAweDcwMDcsCisJMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg1MjgwLCAweDAwN2MsCisJMHgwZTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4YTMyZSwgMHgyMTBjLCAweDgxZmYsCisJMHgwMGMwLCAweDUzMGIsIDB4MjAwOSwgMHhhMzBjLCAweDIxMGMsIDB4ZDE5NCwgMHgwMGMwLCAweDUzMTUsCisJMHg2ODQ4LCAweDIwNzAsIDB4YWU4MiwgMHhhYTAwLCAweDAwNDgsIDB4NTJmYiwgMHgyMDAxLCAweGEzMTUsCisJMHgyMDA0LCAweGFlMDIsIDB4MDBjOCwgMHg1MmZiLCAweDIwNjEsIDB4YTYyZCwgMHg2MTAwLCAweGExODQsCisJMHgwMzAxLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDUyZGUsIDB4NzExYywgMHhhMTg2LCAweDAwMDYsCisJMHgwMGMwLCAweDUyZTYsIDB4NzAxOCwgMHhhMDA1LCAweDAwNDAsIDB4NTMwYiwgMHgyMDA0LCAweGQwZTQsCisJMHgwMGMwLCAweDUzMGYsIDB4NzAyNCwgMHhkMGRjLCAweDAwYzAsIDB4NTMxOSwgMHg2ODUzLCAweDAwMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MmQwOCwgMHg3MDEwLCAweGEwMDUsIDB4MDBjMCwgMHg1MmNhLCAweDcxMTIsCisJMHg2ODRjLCAweGQwZjQsIDB4MDBjMCwgMHg1MzFkLCAweDJlNjAsIDB4MTA3OCwgMHg1OWI2LCAweDEyN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MjA2OCwgMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHg1MmNhLCAweDY5MDIsCisJMHgyMTY4LCAweDY4NGMsIDB4ZDBmNCwgMHgwMGMwLCAweDUzMWQsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHgxMjdmLCAweDBlN2YsIDB4Njg1MywgMHgwMDA2LCAweDAwNzgsIDB4NTMzZSwgMHhkMTg0LCAweDAwNDAsCisJMHg1MmQ4LCAweGQxYzQsIDB4MDBjMCwgMHg1MmZmLCAweDAwNzgsIDB4NTMwMywgMHg2OTQ0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4NTMwZiwgMHg2MDAwLCAweGQwZTQsCisJMHgwMGMwLCAweDUzMGYsIDB4NzExYywgMHhhMTg2LCAweDAwMDcsIDB4MDBjMCwgMHg1MmZiLCAweDY4NTMsCisJMHgwMDAyLCAweDAwNzgsIDB4NTMxMSwgMHg2ODUzLCAweDAwMDgsIDB4MDA3OCwgMHg1MzExLCAweDY4NTMsCisJMHgwMDBlLCAweDAwNzgsIDB4NTMxMSwgMHg2ODUzLCAweDAwMTcsIDB4MDA3OCwgMHg1MzExLCAweDY4NTMsCisJMHgwMDM1LCAweDAwNzgsIDB4NTMxMSwgMHg2ODUzLCAweDAwMjgsIDB4MDA3OCwgMHg1MzExLCAweDY4NTMsCisJMHgwMDI5LCAweDEyN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDUzM2UsIDB4Njg1MywgMHgwMDJhLCAweDAwNzgsCisJMHg1MzExLCAweDY4NTMsIDB4MDA0NSwgMHgwMDc4LCAweDUzMTEsIDB4MmU2MCwgMHgyMDE5LCAweDAwMDIsCisJMHg2MDE3LCAweDAwMTQsIDB4MTA3OCwgMHg5YTZhLCAweDEyN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDIwMDksCisJMHgwMDNlLCAweDAwNzgsIDB4NTMzOSwgMHgyMDA5LCAweDAwMDQsIDB4MDA3OCwgMHg1MzM5LCAweDIwMDksCisJMHgwMDA2LCAweDAwNzgsIDB4NTMzOSwgMHgyMDA5LCAweDAwMTYsIDB4MDA3OCwgMHg1MzM5LCAweDIwMDksCisJMHgwMDAxLCAweDY4NTQsIDB4YTA4NCwgMHhmZjAwLCAweGExMDUsIDB4Njg1NiwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDQ5ODIsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MTA3OCwgMHgxMzlhLCAweDAwN2MsCisJMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwgMHhhMTAyLCAweDAwNDgsIDB4NTM1NSwgMHhhMDBlLCAweDcwMzQsCisJMHg3MDcyLCAweDcwMzgsIDB4NzA3NiwgMHgwMDc4LCAweDUzNjEsIDB4NzA3MCwgMHhhMDgwLCAweDAwNDAsCisJMHg3MDcyLCAweDAwYzgsIDB4NTM2MSwgMHg3MDc0LCAweGEwODEsIDB4MDAwMCwgMHg3MDc2LCAweGEwODUsCisJMHgwMDAxLCAweDc5MzIsIDB4NzEzMiwgMHgwMDdjLCAweDBkN2UsIDB4MTA3OCwgMHg1OWFkLCAweDBkN2YsCisJMHgwMDdjLCAweDBkN2UsIDB4MjAxMSwgMHgwMDA0LCAweDIyMDQsIDB4YTA4NSwgMHg4MDAyLCAweDIwMTIsCisJMHgwZDdmLCAweDAwN2MsIDB4MjBlMSwgMHgwMDAyLCAweDNkMDgsIDB4MjBlMSwgMHgyMDAwLCAweDNkMDAsCisJMHhhMDg0LCAweDcwMDAsIDB4MDA0MCwgMHg1MzgwLCAweGEwODYsIDB4MTAwMCwgMHgwMGMwLCAweDUzYWMsCisJMHgyMGUxLCAweDAwMDAsIDB4M2QwMCwgMHhhMDk0LCAweGZmMDAsIDB4ODIxNywgMHhhMDg0LCAweGYwMDAsCisJMHhhMDg2LCAweDMwMDAsIDB4MDBjMCwgMHg1MzkwLCAweDEwNzgsIDB4NTU3MCwgMHgwMDc4LCAweDUzYTcsCisJMHgyMGUxLCAweDAwMDQsIDB4M2Q2MCwgMHhkMWJjLCAweDAwYzAsIDB4NTM5NywgMHgzZTYwLCAweGFjODQsCisJMHgwMDBmLCAweDAwYzAsIDB4NTNhYywgMHhhYzgyLCAweGFhMDAsIDB4MDA0OCwgMHg1M2FjLCAweDY4NTQsCisJMHhhYzAyLCAweDAwYzgsIDB4NTNhYywgMHgyMDA5LCAweDAwNDcsIDB4MTA3OCwgMHg3NTZjLCAweDdhMWMsCisJMHhkMjg0LCAweDAwYzAsIDB4NTM3MiwgMHgwMDdjLCAweGEwMTYsIDB4MTA3OCwgMHgxNWVjLCAweDAwNzgsCisJMHg1M2E3LCAweDAwNzgsIDB4NTNhYywgMHg3ODFjLCAweGQwOGMsIDB4MDA0MCwgMHg1M2RiLCAweDE1N2UsCisJMHgxMzdlLCAweDE0N2UsIDB4MjBlMSwgMHgzMDAwLCAweDNkMjAsIDB4M2UyOCwgMHhhNTg0LCAweDAwNzYsCisJMHgwMGMwLCAweDUzZjEsIDB4YTQ4NCwgMHg3MDAwLCAweGEwODYsIDB4MTAwMCwgMHgwMGMwLCAweDUzZTAsCisJMHgxMDc4LCAweDU0MGMsIDB4MDA0MCwgMHg1M2YxLCAweDIwZTEsIDB4MzAwMCwgMHg3ODI4LCAweDc4MjgsCisJMHgxMDc4LCAweDU0MmEsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MjAwOSwgMHhhNWIzLCAweDIxMDQsCisJMHhhMDA1LCAweDAwYzAsIDB4NTNkYywgMHgwMDdjLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDUzZGIsCisJMHhhNDg0LCAweDcwMDAsIDB4MDBjMCwgMHg1M2YxLCAweDEwNzgsIDB4NTQwYywgMHgwMDQwLCAweDU0MDMsCisJMHg3MDAwLCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDgxMDAsIDB4MDA0MCwgMHg1M2NjLCAweDAwNzgsCisJMHg1NDAzLCAweDEwNzgsIDB4YTFlZSwgMHhkNWE0LCAweDAwNDAsIDB4NTNmZiwgMHgxMDc4LCAweDFhZjcsCisJMHgyMGUxLCAweDkwMTAsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDA3OCwgMHg1NDA3LCAweDEwNzgsCisJMHg1NDBjLCAweDY4N2YsIDB4MDAwMCwgMHgyMGUxLCAweDMwMDAsIDB4NzgyOCwgMHg3ODI4LCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MDA3OCwgMHg1M2RiLCAweGE0ODQsIDB4MDFmZiwgMHg2ODdlLCAweGEwMDUsCisJMHgwMDQwLCAweDU0MWUsIDB4YTA4MCwgMHgwMDFmLCAweGEwODQsIDB4MDNmOCwgMHg4MGFjLCAweDIwZTEsCisJMHgxMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4MDA3YywgMHgyMGE5LCAweDAwMGMsCisJMHgyMGUxLCAweDEwMDAsIDB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDc4LCAweDU0MWQsIDB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4YywgMHhmMDAwLCAweDgwMDcsCisJMHhhMTk2LCAweDAwMDAsIDB4MDBjMCwgMHg1NDM3LCAweDAwNzgsIDB4NTY3YywgMHgwMDdjLCAweGExOTYsCisJMHgyMDAwLCAweDAwYzAsIDB4NTQ0OCwgMHg2OTAwLCAweGExOGUsIDB4MDAwMSwgMHgwMGMwLCAweDU0NDQsCisJMHgxMDc4LCAweDNhNDMsIDB4MDA3OCwgMHg1NDM2LCAweDEwNzgsIDB4NTQ1MCwgMHgwMDc4LCAweDU0MzYsCisJMHhhMTk2LCAweDgwMDAsIDB4MDBjMCwgMHg1NDM2LCAweDEwNzgsIDB4NTcwYywgMHgwMDc4LCAweDU0MzYsCisJMHgwYzdlLCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsIDB4YTE5NiwgMHgwMDAxLCAweDAwNDAsCisJMHg1NDVkLCAweGExOTYsIDB4MDAyMywgMHgwMGMwLCAweDU1NjgsIDB4YTA4ZSwgMHgwMDIzLCAweDAwYzAsCisJMHg1NDkyLCAweDEwNzgsIDB4NTdiMiwgMHgwMDQwLCAweDU1NjgsIDB4NzEyNCwgMHg2MTBhLCAweDcwMzAsCisJMHhhMDhlLCAweDAyMDAsIDB4MDBjMCwgMHg1NDc2LCAweDcwMzQsIDB4YTAwNSwgMHgwMGMwLCAweDU1NjgsCisJMHgyMDA5LCAweDAwMTUsIDB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4NTU2OCwgMHhhMDhlLCAweDAyMTQsCisJMHgwMDQwLCAweDU0N2UsIDB4YTA4ZSwgMHgwMjEwLCAweDAwYzAsIDB4NTQ4NCwgMHgyMDA5LCAweDAwMTUsCisJMHgxMDc4LCAweDc1NmMsIDB4MDA3OCwgMHg1NTY4LCAweGEwOGUsIDB4MDEwMCwgMHgwMGMwLCAweDU1NjgsCisJMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NTY4LCAweDIwMDksIDB4MDAxNiwgMHgxMDc4LCAweDc1NmMsCisJMHgwMDc4LCAweDU1NjgsIDB4YTA4ZSwgMHgwMDIyLCAweDAwYzAsIDB4NTU2OCwgMHg3MDMwLCAweGEwOGUsCisJMHgwMzAwLCAweDAwYzAsIDB4NTRhMywgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NTY4LCAweDIwMDksCisJMHgwMDE3LCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLCAweDA1MDAsIDB4MDBjMCwgMHg1NGFmLCAweDcwMzQsCisJMHhhMDA1LCAweDAwYzAsIDB4NTU2OCwgMHgyMDA5LCAweDAwMTgsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHgyMDEwLCAweDAwYzAsIDB4NTRiNywgMHgyMDA5LCAweDAwMTksIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHgyMTEwLCAweDAwYzAsIDB4NTRiZiwgMHgyMDA5LCAweDAwMWEsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHg1MjAwLCAweDAwYzAsIDB4NTRjYiwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NTY4LCAweDIwMDksCisJMHgwMDFiLCAweDAwNzgsIDB4NTUzNCwgMHhhMDhlLCAweDUwMDAsIDB4MDBjMCwgMHg1NGQ3LCAweDcwMzQsCisJMHhhMDA1LCAweDAwYzAsIDB4NTU2OCwgMHgyMDA5LCAweDAwMWMsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHgxMzAwLCAweDAwYzAsIDB4NTRkZiwgMHgyMDA5LCAweDAwMzQsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHgxMjAwLCAweDAwYzAsIDB4NTRlYiwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NTY4LCAweDIwMDksCisJMHgwMDI0LCAweDAwNzgsIDB4NTUzNCwgMHhhMDhjLCAweGZmMDAsIDB4YTE4ZSwgMHgyNDAwLCAweDAwYzAsCisJMHg1NGY1LCAweDIwMDksIDB4MDAyZCwgMHgwMDc4LCAweDU1MzQsIDB4YTA4YywgMHhmZjAwLCAweGExOGUsCisJMHg1MzAwLCAweDAwYzAsIDB4NTRmZiwgMHgyMDA5LCAweDAwMmEsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHgwZjAwLCAweDAwYzAsIDB4NTUwNywgMHgyMDA5LCAweDAwMjAsIDB4MDA3OCwgMHg1NTM0LCAweGEwOGUsCisJMHg1MzAwLCAweDAwYzAsIDB4NTUwZCwgMHgwMDc4LCAweDU1MmEsIDB4YTA4ZSwgMHg2MTA0LCAweDAwYzAsCisJMHg1NTJhLCAweDIwMTEsIDB4YTg4ZCwgMHg4MjA4LCAweDIyMDQsIDB4YTA4MiwgMHgwMDA0LCAweDIwYTgsCisJMHg5NWFjLCAweDk1YWMsIDB4MjAxMSwgMHg4MDE1LCAweDIxMWMsIDB4ODEwOCwgMHgwNDdlLCAweDIxMjQsCisJMHgxMDc4LCAweDM1NzksIDB4MDQ3ZiwgMHg4MTA4LCAweDAwZjAsIDB4NTUxYSwgMHgyMDA5LCAweDAwMjMsCisJMHgwMDc4LCAweDU1MzQsIDB4YTA4ZSwgMHg2MDAwLCAweDAwYzAsIDB4NTUzMiwgMHgyMDA5LCAweDAwM2YsCisJMHgwMDc4LCAweDU1MzQsIDB4MjAwOSwgMHgwMDFkLCAweDAxN2UsIDB4MjAxMSwgMHhhODgzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MTA3OCwgMHgyNGUzLCAweDAwYzAsIDB4NTU2YSwgMHgxMDc4LCAweDQ0OTksCisJMHgwMGMwLCAweDU1NmEsIDB4NjYxMiwgMHg2NTE2LCAweDg2ZmYsIDB4MDA0MCwgMHg1NTVhLCAweDAxN2YsCisJMHgwMTdlLCAweGExODYsIDB4MDAxNywgMHgwMGMwLCAweDU1NWEsIDB4Njg2OCwgMHhhNjA2LCAweDAwYzAsCisJMHg1NTVhLCAweDY4NmMsIDB4YTUwNiwgMHhhMDg0LCAweGZmMDAsIDB4MDBjMCwgMHg1NTVhLCAweDYwMDAsCisJMHhjMGY1LCAweDYwMDIsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsIDB4MDA0MCwgMHg1NTZkLCAweDAxN2YsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDE3ZiwgMHgxMDc4LCAweDc1NmMsCisJMHgwYzdmLCAweDAwN2MsIDB4MDE3ZiwgMHgwMDc4LCAweDU1NjgsIDB4MGM3ZiwgMHgwMDc4LCAweDU1NmEsCisJMHgwYzdlLCAweDEwNzgsIDB4NTVkNCwgMHgwMGMwLCAweDU1ZDIsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsCisJMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHg1NWQyLCAweGEyOGUsIDB4MDAzMywgMHgwMGMwLCAweDU1YTMsCisJMHgxMDc4LCAweDU3YjIsIDB4MDA0MCwgMHg1NWQyLCAweDcxMjQsIDB4NjEwYSwgMHg3MDMwLCAweGEwOGUsCisJMHgwMjAwLCAweDAwYzAsIDB4NTU5NSwgMHg3MDM0LCAweGEwMDUsIDB4MDBjMCwgMHg1NWQyLCAweDIwMDksCisJMHgwMDE1LCAweDEwNzgsIDB4NzU2YywgMHgwMDc4LCAweDU1ZDIsIDB4YTA4ZSwgMHgwMTAwLCAweDAwYzAsCisJMHg1NWQyLCAweDcwMzQsIDB4YTAwNSwgMHgwMGMwLCAweDU1ZDIsIDB4MjAwOSwgMHgwMDE2LCAweDEwNzgsCisJMHg3NTZjLCAweDAwNzgsIDB4NTVkMiwgMHhhMjhlLCAweDAwMzIsIDB4MDBjMCwgMHg1NWQyLCAweDcwMzAsCisJMHhhMDhlLCAweDE0MDAsIDB4MDBjMCwgMHg1NWQyLCAweDIwMDksIDB4MDAzOCwgMHgwMTdlLCAweDIwMTEsCisJMHhhODgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDEwNzgsIDB4MjRlMywgMHgwMGMwLCAweDU1ZDEsCisJMHgxMDc4LCAweDQ0OTksIDB4MDBjMCwgMHg1NWQxLCAweDY2MTIsIDB4NjUxNiwgMHgwYzdlLCAweDEwNzgsCisJMHg3NGQ3LCAweDAwNDAsIDB4NTVkMCwgMHgwMTdmLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDcxMjAsCisJMHg2MTBhLCAweDAxN2YsIDB4MTA3OCwgMHg3NTZjLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDU1ZDIsCisJMHgwYzdmLCAweDAxN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBmN2UsIDB4MGQ3ZSwgMHgwMjdlLCAweDAxN2UsCisJMHgxMzdlLCAweDE0N2UsIDB4MTU3ZSwgMHgzYzAwLCAweDAwN2UsIDB4MjA3OSwgMHgwMDMwLCAweDIwNjksCisJMHgwMjAwLCAweDEwNzgsIDB4MWMyNSwgMHgwMGMwLCAweDU2MTUsIDB4MTA3OCwgMHgxYjE1LCAweDAwNDAsCisJMHg1NjFmLCAweDc5MDgsIDB4YTE4YywgMHgxZmZmLCAweGExODIsIDB4MDAxMSwgMHgwMGM4LCAweDU2MWYsCisJMHgyMGE5LCAweDAwMGMsIDB4MjBlMSwgMHgwMDAwLCAweDJlYTAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsCisJMHgyMGUxLCAweDIwMDAsIDB4MjAwMSwgMHgwMjBhLCAweDIwMDQsIDB4N2EwYywgMHg3ODA4LCAweGEwODAsCisJMHgwMDA3LCAweGEwODQsIDB4MWZmOCwgMHhhMDhhLCAweDAxNDAsIDB4MTBjOCwgMHgxMzI4LCAweDgwYWMsCisJMHgyMGUxLCAweDYwMDAsIDB4MjA5OSwgMHgwMjBhLCAweDUzYTUsIDB4MjBlMSwgMHg3MDAwLCAweDY4MjgsCisJMHg2ODI4LCAweDc4MDMsIDB4MDAwNCwgMHhhMjk0LCAweDAwNzAsIDB4MDA3ZiwgMHgyMGUwLCAweDE1N2YsCisJMHgxNDdmLCAweDEzN2YsIDB4MDE3ZiwgMHgwMjdmLCAweDBkN2YsIDB4MGY3ZiwgMHgwMDdjLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4NTYxNSwgMHgwNDdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgyMDI4LCAweDIxMzAsCisJMHhhNjk2LCAweDAwZmYsIDB4MDBjMCwgMHg1NjQ0LCAweGE1OTYsIDB4ZmZmZCwgMHgwMGMwLCAweDU2MzQsCisJMHgyMDA5LCAweDAwN2YsIDB4MDA3OCwgMHg1Njc3LCAweGE1OTYsIDB4ZmZmZSwgMHgwMGMwLCAweDU2M2MsCisJMHgyMDA5LCAweDAwN2UsIDB4MDA3OCwgMHg1Njc3LCAweGE1OTYsIDB4ZmZmYywgMHgwMGMwLCAweDU2NDQsCisJMHgyMDA5LCAweDAwODAsIDB4MDA3OCwgMHg1Njc3LCAweDIwMTEsIDB4MDAwMCwgMHgyMDIxLCAweDAwODEsCisJMHgyMGE5LCAweDAwN2UsIDB4MjA3MSwgMHhhNGI1LCAweDJlMWMsIDB4ODNmZiwgMHgwMGMwLCAweDU2NTYsCisJMHg4MmZmLCAweDAwYzAsIDB4NTY2YiwgMHgyNDEwLCAweDAwNzgsIDB4NTY2YiwgMHgyMzY4LCAweDZmMTAsCisJMHgwMDdlLCAweDIxMDAsIDB4YTcwNiwgMHgwMDdmLCAweDZiMTQsIDB4MDBjMCwgMHg1NjY1LCAweGEzNDYsCisJMHgwMGMwLCAweDU2NjUsIDB4MjQwOCwgMHgwMDc4LCAweDU2NzcsIDB4ODdmZiwgMHgwMGMwLCAweDU2NmIsCisJMHg4M2ZmLCAweDAwNDAsIDB4NTY1MCwgMHg4NDIwLCAweDhlNzAsIDB4MDBmMCwgMHg1NjRjLCAweDgyZmYsCisJMHgwMGMwLCAweDU2NzYsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4NTY3OCwgMHgyMjA4LCAweGEwMDYsCisJMHgwZDdmLCAweDBlN2YsIDB4MDQ3ZiwgMHgwMDdjLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDU2ODEsCisJMHgwMDdjLCAweDU2ODksIDB4NTY4OSwgMHg1Njg5LCAweDU3YzgsIDB4NTY4OSwgMHg1NjhhLCAweDU2YTMsCisJMHg1NmYzLCAweDAwN2MsIDB4NzExMCwgMHhkMWJjLCAweDAwNDAsIDB4NTZhMiwgMHg3MTIwLCAweDIxNjAsCisJMHhhYzhjLCAweDAwMGYsIDB4MDBjMCwgMHg1NmEyLCAweGFjOGEsIDB4YWEwMCwgMHgwMDQ4LCAweDU2YTIsCisJMHg2ODU0LCAweGFjMDIsIDB4MDBjOCwgMHg1NmEyLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwNDYsCisJMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHgwYzdlLCAweDcxMTAsIDB4ZDFiYywgMHgwMGMwLCAweDU2ZjEsCisJMHgyMDExLCAweGE4ODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MTA3OCwgMHgyNGUzLCAweDAwYzAsCisJMHg1NmYxLCAweDEwNzgsIDB4NDQ5OSwgMHgwMGMwLCAweDU2ZjEsIDB4NjYxMiwgMHg2NTE2LCAweDYwMDAsCisJMHhkMGVjLCAweDAwYzAsIDB4NTZmMSwgMHg2MjA0LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweGEyODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NTZkNiwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwMTdmLCAweDAwNDAsCisJMHg1NmYxLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA2LCAweDcxMjAsIDB4NjEwYSwgMHg3MTMwLCAweDYxMjIsCisJMHgyMDA5LCAweDAwNDQsIDB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4NTZmMSwgMHgwYzdlLCAweDEwNzgsCisJMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg1NmYxLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDcxMjAsCisJMHg2MTBhLCAweGEyODYsIDB4MDAwNCwgMHgwMGMwLCAweDU2ZTksIDB4NjAwNywgMHgwMDA1LCAweDAwNzgsCisJMHg1NmViLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YzQ1LCAweDEwNzgsCisJMHg2MTA5LCAweDBjN2YsIDB4MDA3YywgMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1NzBiLCAweDcwMjAsCisJMHgyMDYwLCAweGFjODQsIDB4MDAwZiwgMHgwMGMwLCAweDU3MGIsIDB4YWM4MiwgMHhhYTAwLCAweDAwNDgsCisJMHg1NzBiLCAweDY4NTQsIDB4YWMwMiwgMHgwMGM4LCAweDU3MGIsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDQ1LCAweDEwNzgsIDB4NzU2YywgMHgwMDdjLCAweDcxMTAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMThlLCAweDAwMDAsIDB4MDBjMCwgMHg1NzFjLCAweGEwODQsIDB4MDAwZiwgMHhhMDhhLCAweDAwMDYsCisJMHgwMGM4LCAweDU3MWMsIDB4MTA3OSwgMHg1NzFkLCAweDAwN2MsIDB4NTcyMywgMHg1NzI0LCAweDU3MjMsCisJMHg1NzIzLCAweDU3OTQsIDB4NTdhMywgMHgwMDdjLCAweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU3MmMsCisJMHg3MDJjLCAweGQwODQsIDB4MDA0MCwgMHg1NzkzLCAweDcwMGMsIDB4NzEwOCwgMHgxMDc4LCAweDI0ZTMsCisJMHgwMGMwLCAweDU3OTMsIDB4MTA3OCwgMHg0NDk5LCAweDAwYzAsIDB4NTc5MywgMHg2NjEyLCAweDY1MTYsCisJMHg2MjA0LCAweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU3NWUsIDB4YTI4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDA0LCAweDAwNDAsIDB4NTc0NywgMHhhMTg2LCAweDAwMDYsIDB4MDBjMCwgMHg1Nzg0LCAweDBjN2UsCisJMHgxMDc4LCAweDU3YjIsIDB4MGM3ZiwgMHgwMDQwLCAweDU3OTMsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsCisJMHgwMTdmLCAweDAwNDAsIDB4NTc5MywgMHg2MTFhLCAweDYwMWYsIDB4MDAwMiwgMHg3MTIwLCAweDYxMGEsCisJMHgyMDA5LCAweDAwODgsIDB4MTA3OCwgMHg3NTZjLCAweDAwNzgsIDB4NTc5MywgMHhhMjhjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDYsIDB4MDA0MCwgMHg1NzczLCAweGExODYsIDB4MDAwNCwgMHgwMDQwLCAweDU3NzMsCisJMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LCAweDAwMDQsIDB4MDA0MCwgMHg1NzczLCAweGEyODYsCisJMHgwMDA2LCAweDAwYzAsIDB4NTc4NCwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgwMTdmLCAweDAwNDAsCisJMHg1NzkzLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA1LCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwODgsCisJMHgxMDc4LCAweDc1NmMsIDB4MDA3OCwgMHg1NzkzLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAxN2YsCisJMHgwMDQwLCAweDU3OTMsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4NzEyMCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDAxLCAweDEwNzgsIDB4NzU2YywgMHgwMDdjLCAweDcxMTAsIDB4ZDFiYywgMHgwMDQwLCAweDU3YTIsCisJMHgxMDc4LCAweDU3YjIsIDB4MDA0MCwgMHg1N2EyLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwODksCisJMHgxMDc4LCAweDc1NmMsIDB4MDA3YywgMHg3MTEwLCAweGQxYmMsIDB4MDA0MCwgMHg1N2IxLCAweDEwNzgsCisJMHg1N2IyLCAweDAwNDAsIDB4NTdiMSwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDhhLCAweDEwNzgsCisJMHg3NTZjLCAweDAwN2MsIDB4NzAyMCwgMHgyMDYwLCAweGFjODQsIDB4MDAwZiwgMHgwMGMwLCAweDU3YzUsCisJMHhhYzgyLCAweGFhMDAsIDB4MDA0OCwgMHg1N2M1LCAweDIwMDEsIDB4YTMxNSwgMHgyMDA0LCAweGFjMDIsCisJMHgwMGM4LCAweDU3YzUsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDU3YzQsCisJMHg3MTEwLCAweGQxYmMsIDB4MDBjMCwgMHg1N2RlLCAweDcwMjQsIDB4MjA2MCwgMHhhYzg0LCAweDAwMGYsCisJMHgwMGMwLCAweDU3ZGUsIDB4YWM4MiwgMHhhYTAwLCAweDAwNDgsIDB4NTdkZSwgMHg2ODU0LCAweGFjMDIsCisJMHgwMGM4LCAweDU3ZGUsIDB4MjAwOSwgMHgwMDUxLCAweDEwNzgsIDB4NzU2YywgMHgwMDdjLCAweDIwNzEsCisJMHhhNWJlLCAweDcwMDMsIDB4MDAwMywgMHg3MDBmLCAweDAzNjEsIDB4YTAwNiwgMHg3MDFhLCAweDcwMTIsCisJMHg3MDE3LCAweGFhMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjYsIDB4NzAyYiwgMHg2YzRlLCAweDcwMzIsCisJMHg3MDM3LCAweDZjYTAsIDB4NzAzYiwgMHgwMDAyLCAweDcwM2YsIDB4MDAwMCwgMHg3MDQzLCAweGZmZmYsCisJMHg3MDQ3LCAweGZmZmYsIDB4MDA3YywgMHgyMDcxLCAweGE1YmUsIDB4MDBlMCwgMHg1OGMxLCAweDIwOTEsCisJMHg2MDAwLCAweDcwMGMsIDB4ODAwMSwgMHg3MDBlLCAweDAwYzAsIDB4NTg3MywgMHg3MDBmLCAweDAzNjEsCisJMHg3MDA3LCAweDAwMDEsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NzEzOCwgMHg4MTA5LCAweDcxM2EsCisJMHgwMGMwLCAweDU4NzEsIDB4NzAzYiwgMHgwMDAyLCAweDIwMDksIDB4MDEwMCwgMHgyMTA0LCAweGEwODIsCisJMHgwMDAzLCAweDAwYzgsIDB4NTg3MSwgMHg3MDNjLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDU4NGUsCisJMHgwZDdlLCAweDIwNjksIDB4MDE0MCwgMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDU4MmMsCisJMHg2ODAzLCAweDEwMDAsIDB4MDA3OCwgMHg1ODMzLCAweDY4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAwNDAsCisJMHg1ODMzLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4NzAzZiwgMHgwMDAwLCAweDIwNjksCisJMHhhNWFiLCAweDY4MDQsIDB4YTA4MiwgMHgwMDA2LCAweDAwYzAsIDB4NTg0MCwgMHg2ODA3LCAweDAwMDAsCisJMHg2ODMwLCAweGEwODIsIDB4MDAwMywgMHgwMGMwLCAweDU4NDcsIDB4NjgzMywgMHgwMDAwLCAweDEwNzgsCisJMHg2MTA5LCAweDEwNzgsIDB4NjFkMywgMHgwZDdmLCAweDAwNzgsIDB4NTg3MSwgMHgwZDdlLCAweDIwNjksCisJMHhhMzAwLCAweDY5NDQsIDB4Njg2MCwgMHhhMTAyLCAweDAwYzgsIDB4NTg3MCwgMHgyMDY5LCAweGE1YWIsCisJMHg2ODA0LCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDU4NzAsIDB4NjgzMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMGMwLCAweDU4NzAsIDB4NzAzZiwgMHgwMDAxLCAweDY4MDcsIDB4MDAwNiwgMHg2ODMzLCAweDAwMDMsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgzMCwgMHg2ODllLCAweDIwNjksIDB4MDE0MCwgMHg2ODAzLCAweDA2MDAsCisJMHgwZDdmLCAweDAwNzgsIDB4NTg3NiwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg3MDI0LCAweGEwMGQsCisJMHgwMDQwLCAweDU4OGUsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4MDBjMCwgMHg1ODhlLCAweDcwMjMsCisJMHgwMDA5LCAweDgxMDksIDB4NzEyNiwgMHhhMTg2LCAweDAzZTgsIDB4MDBjMCwgMHg1ODg5LCAweDcwMjgsCisJMHgxMDdhLCAweDgxZmYsIDB4MDBjMCwgMHg1ODhlLCAweDcwMjgsIDB4MTA3YSwgMHg3MDMwLCAweGEwMGQsCisJMHgwMDQwLCAweDU4OWYsIDB4NzAyYywgMHg4MDAxLCAweDcwMmUsIDB4MDBjMCwgMHg1ODlmLCAweDcwMmYsCisJMHgwMDA5LCAweDgxMDksIDB4NzEzMiwgMHgwMGMwLCAweDU4OWYsIDB4NzAzNCwgMHgxMDdhLCAweDcwNDAsCisJMHhhMDA1LCAweDAwNDAsIDB4NThhNywgMHgwMDUwLCAweDU4YTcsIDB4ODAwMSwgMHg3MDQyLCAweDcwNDQsCisJMHhhMDA1LCAweDAwNDAsIDB4NThhZiwgMHgwMDUwLCAweDU4YWYsIDB4ODAwMSwgMHg3MDQ2LCAweDcwMTgsCisJMHhhMDBkLCAweDAwNDAsIDB4NThjMCwgMHg3MDA4LCAweDgwMDEsIDB4NzAwYSwgMHgwMGMwLCAweDU4YzAsCisJMHg3MDBiLCAweDAwMDksIDB4ODEwOSwgMHg3MTFhLCAweDAwYzAsIDB4NThjMCwgMHg3MDFjLCAweDEwN2EsCisJMHgxMjdmLCAweDcwMDQsIDB4MDA3OSwgMHg1OGM0LCAweDU4ZWIsIDB4NThlYywgMHg1OTA4LCAweDBlN2UsCisJMHgyMDcxLCAweGE1YmUsIDB4NzAxOCwgMHhhMDA1LCAweDAwYzAsIDB4NThkMiwgMHg3MTFhLCAweDcyMWUsCisJMHg3MDBiLCAweDAwMDksIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDA3ZSwgMHgyMDcxLCAweGE1YmUsCisJMHg3MDFjLCAweGEyMDYsIDB4MDBjMCwgMHg1OGRlLCAweDcwMWEsIDB4NzAxZSwgMHgwMDdmLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNWJlLCAweDYwODgsIDB4YTEwMiwgMHgwMDQ4LCAweDU4ZTksCisJMHg2MThhLCAweDBlN2YsIDB4MDA3YywgMHgwMDdjLCAweDcxMTAsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsCisJMHg1OGZlLCAweDYwODgsIDB4ODAwMSwgMHgwMDQ4LCAweDU4ZmUsIDB4NjA4YSwgMHgwMGMwLCAweDU4ZmUsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYxMDksIDB4MTI3ZiwgMHg4MTA4LCAweGExODIsCisJMHgwMGZmLCAweDAwNDgsIDB4NTkwNiwgMHhhMDBlLCAweDcwMDcsIDB4MDAwMiwgMHg3MTEyLCAweDAwN2MsCisJMHg3MDE0LCAweDIwNjAsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4NjAzYywgMHhhMDA1LCAweDAwNDAsCisJMHg1OTE3LCAweDgwMDEsIDB4NjAzZSwgMHgwMGMwLCAweDU5MTcsIDB4MTA3OCwgMHg4Y2Q3LCAweDYwMTQsCisJMHhhMDA1LCAweDAwNDAsIDB4NTk0MSwgMHg4MDAxLCAweDYwMTYsIDB4MDBjMCwgMHg1OTQxLCAweDYxMWMsCisJMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwgMHg1OTI4LCAweGExODYsIDB4MDAwNiwgMHgwMGMwLCAweDU5M2YsCisJMHg2MDEwLCAweDIwNjgsIDB4Njg1NCwgMHhhMDhhLCAweDE5OWEsIDB4MDA0OCwgMHg1OTNmLCAweGEwODIsCisJMHgxOTk5LCAweDY4NTYsIDB4YTA4YSwgMHgxOTlhLCAweDAwNDgsIDB4NTkzOCwgMHgyMDAxLCAweDE5OTksCisJMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDYxMTYsIDB4MDA3OCwgMHg1OTQxLCAweDEwNzgsCisJMHg4ODEwLCAweDEyN2YsIDB4YWM4OCwgMHgwMDEwLCAweDcxMTYsIDB4MjAwMSwgMHhjYTAwLCAweGExMDIsCisJMHgwMDQ4LCAweDU5NGUsIDB4NzAxNywgMHhhYTAwLCAweDcwMDcsIDB4MDAwMCwgMHgwMDdjLCAweDBlN2UsCisJMHgyMDcxLCAweGE1YmUsIDB4NzAyNywgMHgwN2QwLCAweDcwMjMsIDB4MDAwOSwgMHg3MDNiLCAweDAwMDIsCisJMHgwZTdmLCAweDAwN2MsIDB4MjAwMSwgMHhhNWM3LCAweDIwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDBlN2UsCisJMHgyMDcxLCAweGE1YmUsIDB4NzEzMiwgMHg3MDJmLCAweDAwMDksIDB4MGU3ZiwgMHgwMDdjLCAweDIwMTEsCisJMHhhNWNhLCAweDIwMTMsIDB4MDAwMCwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhNWJlLCAweDcxMWEsCisJMHg3MjFlLCAweDcwMGIsIDB4MDAwOSwgMHgwZTdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwZTdlLCAweDBmN2UsCisJMHgyMDc5LCAweGEzMDAsIDB4N2EzNCwgMHhkMjk0LCAweDAwNDAsIDB4NTlhNCwgMHgyMDcxLCAweGE1YWEsCisJMHgyZTE0LCAweGEwZmUsIDB4MDAwMCwgMHgwMDQwLCAweDU5OTEsIDB4YTBmZSwgMHgwMDAxLCAweDAwNDAsCisJMHg1OTk1LCAweGEwZmUsIDB4MDAwMiwgMHgwMGMwLCAweDU5YTAsIDB4YTI5MiwgMHgwMDg1LCAweDAwNzgsCisJMHg1OTk3LCAweGEyOTIsIDB4MDAwNSwgMHgwMDc4LCAweDU5OTcsIDB4YTI5MiwgMHgwMDAyLCAweDIyNzIsCisJMHgwMDQwLCAweDU5OWMsIDB4MDBjOCwgMHg1OWE0LCAweDIwMTEsIDB4ODAzNywgMHgxMDc4LCAweDM1NzksCisJMHgyMDExLCAweGE1YTksIDB4MjIwNCwgMHgyMDcyLCAweDBmN2YsIDB4MGU3ZiwgMHgwMjdmLCAweDAwN2MsCisJMHgwYzdlLCAweDIwNjEsIDB4YTYyZCwgMHgwYzdmLCAweDAwN2MsIDB4YTE4NCwgMHgwMDBmLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHhhNjJkLCAweDIwNjAsIDB4MDA3YywgMHg2ODU0LCAweGEwOGEsCisJMHgxOTlhLCAweDAwNDgsIDB4NTliZCwgMHgyMDAxLCAweDE5OTksIDB4YTAwNSwgMHgwMGMwLCAweDU5Y2MsCisJMHgwYzdlLCAweDIwNjEsIDB4YTYyZCwgMHg2MDE0LCAweDBjN2YsIDB4YTAwNSwgMHgwMGMwLCAweDU5ZDEsCisJMHgyMDAxLCAweDAwMWUsIDB4MDA3OCwgMHg1OWQxLCAweGEwOGUsIDB4ZmZmZiwgMHgwMGMwLCAweDU5ZDEsCisJMHhhMDA2LCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsIDB4NjExNiwgMHg2ODRjLCAweGEwOGMsCisJMHgwMGMwLCAweGExOGUsIDB4MDBjMCwgMHgwMDQwLCAweDVhMjQsIDB4ZDBiNCwgMHgwMGMwLCAweDU5ZTgsCisJMHhkMGJjLCAweDAwYzAsIDB4NWExNCwgMHgyMDA5LCAweDAwMDYsIDB4MTA3OCwgMHg1YTQzLCAweDAwN2MsCisJMHhkMGZjLCAweDAwNDAsIDB4NTlmMywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHg1OWYzLCAweGEwODYsCisJMHgwMDAzLCAweDAwYzAsIDB4NWEzYywgMHg2MDI0LCAweGQwZDQsIDB4MDA0MCwgMHg1OWZkLCAweGMwZDQsCisJMHg2MDI2LCAweDY4NjAsIDB4NjAyYSwgMHg2ODVjLCAweDYwMmUsIDB4MjAwOSwgMHhhMzczLCAweDIxMDQsCisJMHhkMDg0LCAweDAwNDAsIDB4NWEwZiwgMHg2MTE4LCAweGExODgsIDB4MDAyNywgMHgyMTA0LCAweGQwOGMsCisJMHgwMGMwLCAweDVhMGYsIDB4MjAwOSwgMHgwMDQyLCAweDEwNzgsIDB4NzU2YywgMHgwMDdjLCAweDIwMDksCisJMHgwMDQzLCAweDEwNzgsIDB4NzU2YywgMHgwMDdjLCAweGQwZmMsIDB4MDA0MCwgMHg1YTFmLCAweGEwODQsCisJMHgwMDAzLCAweDAwNDAsIDB4NWExZiwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg1YTNjLCAweDIwMDksCisJMHgwMDQyLCAweDEwNzgsIDB4NzU2YywgMHgwMDdjLCAweGQwZmMsIDB4MDA0MCwgMHg1YTMyLCAweGEwODQsCisJMHgwMDAzLCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLCAweDVhMzYsIDB4MjAwOSwgMHgwMDQxLCAweDEwNzgsCisJMHg3NTZjLCAweDAwN2MsIDB4MTA3OCwgMHg1YTQxLCAweDAwNzgsIDB4NWEzMSwgMHgyMDA5LCAweDAwNDMsCisJMHgxMDc4LCAweDc1NmMsIDB4MDA3OCwgMHg1YTMxLCAweDIwMDksIDB4MDAwNCwgMHgxMDc4LCAweDVhNDMsCisJMHgwMDdjLCAweDIwMDksIDB4MDAwMSwgMHgwZDdlLCAweDYwMTAsIDB4YTBlYywgMHhmMDAwLCAweDAwNDAsCisJMHg1YTZiLCAweDIwNjgsIDB4Njk1MiwgMHg2ODAwLCAweDYwMTIsIDB4YTE4NiwgMHgwMDAxLCAweDAwYzAsCisJMHg1YTY1LCAweDY5NGMsIDB4YTE4YywgMHg4MTAwLCAweGExOGUsIDB4ODEwMCwgMHgwMGMwLCAweDVhNjUsCisJMHgwYzdlLCAweDIwNjEsIDB4YTYyZCwgMHg2MjAwLCAweGQyOGMsIDB4MDBjMCwgMHg1YTY0LCAweDYyMDQsCisJMHg4MjEwLCAweDAwNDgsIDB4NWE2NCwgMHg2MjA2LCAweDBjN2YsIDB4MTA3OCwgMHg0OTgyLCAweDYwMTAsCisJMHhhMDZkLCAweDEwYzAsIDB4NTliNiwgMHgwZDdmLCAweDAwN2MsIDB4MTU3ZSwgMHgwYzdlLCAweDIwNjEsCisJMHhhNjJkLCAweDYwMDAsIDB4ODFmZiwgMHgwMDQwLCAweDVhNzgsIDB4YTIwNSwgMHgwMDc4LCAweDVhNzksCisJMHhhMjA0LCAweDYwMDIsIDB4MGM3ZiwgMHgxNTdmLCAweDAwN2MsIDB4NjgwMCwgMHhkMDhjLCAweDAwYzAsCisJMHg1YTg5LCAweDY4MDgsIDB4YTAwNSwgMHgwMDQwLCAweDVhODksIDB4ODAwMSwgMHg2ODBhLCAweGEwODUsCisJMHgwMDAxLCAweDAwN2MsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsIDB4ODAwNCwgMHg4MDg2LCAweDgxOGUsCisJMHgwMGM4LCAweDVhOTMsIDB4YTIwMCwgMHgwMGYwLCAweDVhOGUsIDB4ODA4NiwgMHg4MThlLCAweDAwN2MsCisJMHgxNTdlLCAweDIwYTksIDB4MDAxMCwgMHhhMDA1LCAweDAwNDAsIDB4NWFiOSwgMHhhMTFhLCAweDAwYzgsCisJMHg1YWI5LCAweDgyMTMsIDB4ODE4ZCwgMHgwMDQ4LCAweDVhYWMsIDB4YTExYSwgMHgwMGM4LCAweDVhYWQsCisJMHgwMGYwLCAweDVhYTEsIDB4MDA3OCwgMHg1YWIxLCAweGExMWEsIDB4MjMwOCwgMHg4MjEwLCAweDAwZjAsCisJMHg1YWExLCAweDAwN2UsIDB4MzIwMCwgMHhhMDg0LCAweGY3ZmYsIDB4MjA4MCwgMHgwMDdmLCAweDE1N2YsCisJMHgwMDdjLCAweDAwN2UsIDB4MzIwMCwgMHhhMDg1LCAweDA4MDAsIDB4MDA3OCwgMHg1YWI1LCAweDEyN2UsCisJMHgyMDkxLCAweDIyMDAsIDB4MjA3OSwgMHhhNWFiLCAweDEyN2YsIDB4MGQ3ZSwgMHgyMDY5LCAweGE1YWIsCisJMHg2ODAzLCAweDAwMDUsIDB4MjA2OSwgMHgwMDA0LCAweDJkMDQsIDB4YTA4NSwgMHg4MDAxLCAweDIwNmEsCisJMHgwZDdmLCAweDAwN2MsIDB4MGM3ZSwgMHg2MDI3LCAweDAwMDEsIDB4NzgwNCwgMHhhMDg0LCAweDAwMDcsCisJMHgwMDc5LCAweDVhZGEsIDB4NWFlNCwgMHg1YjA5LCAweDViNjQsIDB4NWFlYSwgMHg1YjA5LCAweDVhZTQsCisJMHg1YWUyLCAweDVhZTIsIDB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NTk1YSwgMHgxMDc4LCAweDYxMDksCisJMHgwYzdmLCAweDAwN2MsIDB4NjJjMCwgMHg4MmZmLCAweDAwYzAsIDB4NWFmMCwgMHgwYzdmLCAweDAwN2MsCisJMHgyMDExLCAweDQxMjksIDB4MTA3OCwgMHg1OGQ0LCAweDc4MjgsIDB4YTA5MiwgMHgwMGM4LCAweDAwYzgsCisJMHg1YWZmLCAweDgwMDAsIDB4NzgyYSwgMHgxMDc4LCAweDQxNjgsIDB4MDA3OCwgMHg1YWVlLCAweDEwNzgsCisJMHg0MTI5LCAweDc4MDcsIDB4MDAwMywgMHg3ODI3LCAweDAwMDAsIDB4NzgyYiwgMHgwMDAwLCAweDAwNzgsCisJMHg1YWVlLCAweDEwNzgsIDB4NTk1YSwgMHgzYzAwLCAweDAwN2UsIDB4MjAxMSwgMHgwMjA5LCAweDIwZTEsCisJMHg0MDAwLCAweDIyMTQsIDB4MDA3ZiwgMHgyMGUwLCAweDgyZmYsIDB4MDA0MCwgMHg1YjI3LCAweDYyYzAsCisJMHg4MmZmLCAweDAwYzAsIDB4NWIyNywgMHg3ODJiLCAweDAwMDAsIDB4NzgyNCwgMHhhMDY1LCAweDEwNDAsCisJMHgxMzI4LCAweDIwMDksIDB4MDAxMywgMHgxMDc4LCAweDc1NmMsIDB4MGM3ZiwgMHgwMDdjLCAweDM5MDAsCisJMHhhMDgyLCAweGE2Y2QsIDB4MDBjOCwgMHg1YjJlLCAweDEwNzgsIDB4NzI4YSwgMHgwYzdlLCAweDc4MjQsCisJMHhhMDY1LCAweDEwNDAsIDB4MTMyOCwgMHg3ODA0LCAweGEwODYsIDB4MDAwNCwgMHgwMDQwLCAweDViYTksCisJMHg3ODI4LCAweGEwOTIsIDB4MjcxMCwgMHgwMGM4LCAweDViNDQsIDB4ODAwMCwgMHg3ODJhLCAweDBjN2YsCisJMHgxMDc4LCAweDZjMzMsIDB4MDA3OCwgMHg1YjI1LCAweDYxMDQsIDB4YTE4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg1YjViLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLCAweDcwZDQsIDB4MGU3ZiwgMHhkMDhjLCAweDAwNDAsCisJMHg1YjViLCAweDBjN2UsIDB4MGU3ZSwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhMzAwLCAweDEwNzgsCisJMHg0MTcxLCAweDBlN2YsIDB4MGM3ZiwgMHgxMDc4LCAweGEyNDEsIDB4MjAwOSwgMHgwMDE0LCAweDEwNzgsCisJMHg3NTZjLCAweDBjN2YsIDB4MDA3OCwgMHg1YjI1LCAweDIwMDEsIDB4YTVjNywgMHgyMDAzLCAweDAwMDAsCisJMHg2MmMwLCAweDgyZmYsIDB4MDBjMCwgMHg1Yjc4LCAweDc4MmIsIDB4MDAwMCwgMHg3ODI0LCAweGEwNjUsCisJMHgxMDQwLCAweDEzMjgsIDB4MjAwOSwgMHgwMDEzLCAweDEwNzgsIDB4NzVjMywgMHgwYzdmLCAweDAwN2MsCisJMHgwYzdlLCAweDBkN2UsIDB4MzkwMCwgMHhhMDgyLCAweGE2Y2QsIDB4MDBjOCwgMHg1YjgxLCAweDEwNzgsCisJMHg3MjhhLCAweDc4MjQsIDB4YTAwNSwgMHgxMDQwLCAweDEzMjgsIDB4NzgxYywgMHhhMDZkLCAweDEwNDAsCisJMHgxMzI4LCAweDY4MDAsIDB4YzBkYywgMHg2ODAyLCAweDc5MjQsIDB4MjE2MCwgMHgxMDc4LCAweDc1M2QsCisJMHg2OTNjLCAweDgxZmYsIDB4MTA0MCwgMHgxMzI4LCAweDgxMDksIDB4NjkzZSwgMHg2ODU0LCAweGEwMTUsCisJMHgwMDQwLCAweDViOWQsIDB4N2ExZSwgMHgwMDc4LCAweDViOWYsIDB4NzkxOCwgMHg3OTFlLCAweDc4MDcsCisJMHgwMDAwLCAweDc4MjcsIDB4MDAwMCwgMHgwZDdmLCAweDBjN2YsIDB4MTA3OCwgMHg2MTA5LCAweDAwNzgsCisJMHg1Yjc2LCAweDYxMDQsIDB4YTE4NiwgMHgwMDAyLCAweDAwNDAsIDB4NWJiNCwgMHhhMTg2LCAweDAwMDQsCisJMHgwMDQwLCAweDViYjQsIDB4MDA3OCwgMHg1YjM4LCAweDc4MDgsIDB4YWMwNiwgMHgwMDQwLCAweDViMzgsCisJMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg1YzQ1LCAweDBjN2YsIDB4MTA3OCwgMHg2MTA5LCAweDAwNzgsCisJMHg1YjI1LCAweDBjN2UsIDB4NjAyNywgMHgwMDAyLCAweDYyYzgsIDB4ODJmZiwgMHgwMGMwLCAweDViZGIsCisJMHg2MmM0LCAweDgyZmYsIDB4MDBjMCwgMHg1YmRiLCAweDc5M2MsIDB4YTFlNSwgMHgwMDAwLCAweDAwNDAsCisJMHg1YmQ1LCAweDIwMDksIDB4MDA0OSwgMHgxMDc4LCAweDc1NmMsIDB4MjAxMSwgMHhhNWNhLCAweDIwMTMsCisJMHgwMDAwLCAweDBjN2YsIDB4MDA3YywgMHgzOTA4LCAweGExOTIsIDB4YTZjZCwgMHgwMGM4LCAweDViZTIsCisJMHgxMDc4LCAweDcyOGEsIDB4NjAxNywgMHgwMDEwLCAweDc5M2MsIDB4ODFmZiwgMHgwMDQwLCAweDViZDUsCisJMHg3OTNjLCAweGExODgsIDB4MDAwNywgMHgyMTBjLCAweGExOGUsIDB4MDAwNiwgMHgwMGMwLCAweDViZjQsCisJMHg2MDE3LCAweDAwMTIsIDB4MDA3OCwgMHg1YmQ5LCAweDYwMTcsIDB4MDAxNiwgMHgwMDc4LCAweDViZDksCisJMHgwMDdlLCAweDAxN2UsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLCAweDAwMDAsCisJMHgyYzA4LCAweDIwNjEsIDB4YTVhYiwgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDEwLCAweGEwMDUsCisJMHgwMDQwLCAweDVjMTMsIDB4YTA4MCwgMHgwMDAzLCAweDIxMDIsIDB4NjExMiwgMHgxMjdmLCAweDBjN2YsCisJMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHg2MTE2LCAweDYxMTIsIDB4MDA3OCwgMHg1YzBlLCAweDBkN2UsCisJMHgyMDY5LCAweGE1YWIsIDB4NjAwMCwgMHhkMGQ0LCAweDAwNDAsIDB4NWMyYywgMHg2ODIwLCAweDgwMDAsCisJMHg2ODIyLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDVjMjcsIDB4MmMwMCwgMHg2ODFlLCAweDY4MDQsCisJMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHg2MTExLCAweGMwZDUsIDB4NjAwMiwgMHg2ODE4LCAweGEwMDUsCisJMHgwMDQwLCAweDVjM2UsIDB4NjA1NiwgMHg2MDViLCAweDAwMDAsIDB4MDA3ZSwgMHgyYzAwLCAweDY4MWEsCisJMHgwZDdmLCAweDY4NWEsIDB4MjA2OSwgMHhhNWFiLCAweDAwNzgsIDB4NWMxZSwgMHg2MDU2LCAweDYwNWEsCisJMHgyYzAwLCAweDY4MWEsIDB4NjgxZSwgMHgwMDc4LCAweDVjMWUsIDB4MDA3ZSwgMHgwMTdlLCAweDBjN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLCAweDAwMDAsIDB4MmMwOCwgMHgyMDYxLCAweGE1YWIsCisJMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDA4LCAweGEwMDUsIDB4MDA0MCwgMHg1YzYwLCAweGEwODAsCisJMHgwMDAzLCAweDIxMDIsIDB4NjEwYSwgMHgxMjdmLCAweDBjN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDAwN2MsCisJMHg2MTBlLCAweDYxMGEsIDB4MDA3OCwgMHg1YzViLCAweDBjN2UsIDB4NjAwZiwgMHgwMDAwLCAweDJjMDgsCisJMHgyMDYxLCAweGE1YWIsIDB4NjAzNCwgMHhhMDA1LCAweDAwNDAsIDB4NWM3NCwgMHhhMDgwLCAweDAwMDMsCisJMHgyMTAyLCAweDYxMzYsIDB4MGM3ZiwgMHgwMDdjLCAweDYxM2EsIDB4NjEzNiwgMHgwMDc4LCAweDVjNzIsCisJMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDI3ZSwgMHgwMTdlLCAweDAwN2UsCisJMHgxMjdlLCAweDIwNzEsIDB4YTVhYiwgMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsCisJMHg4Y2ZmLCAweDAwNDAsIDB4NWNlZCwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEyMDYsCisJMHgwMGMwLCAweDVjZTgsIDB4ODdmZiwgMHgwMDQwLCAweDVjOTksIDB4NjAyMCwgMHhhMTA2LCAweDAwYzAsCisJMHg1Y2U4LCAweDcwM2MsIDB4YWMwNiwgMHgwMGMwLCAweDVjYWIsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDEsCisJMHgxMDc4LCAweDZlNmMsIDB4NzAzMywgMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDAsCisJMHg3MDQ3LCAweDAwMDAsIDB4MDM3ZiwgMHg3MDM4LCAweGFjMzYsIDB4MDBjMCwgMHg1Y2IxLCAweDY2MGMsCisJMHg3NjNhLCAweDcwMzQsIDB4YWMzNiwgMHgwMGMwLCAweDVjYmYsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsCisJMHg1Y2JkLCAweDJmMDAsIDB4NzAzNiwgMHgwMDc4LCAweDVjYmYsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsCisJMHgwNjdlLCAweDJjMDAsIDB4YWYwNiwgMHgwMDQwLCAweDVjYzgsIDB4N2UwZSwgMHgwMDc4LCAweDVjYzksCisJMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg1Y2UzLCAweDYwMTAsCisJMHgyMDY4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NWNmNywgMHg2ODM3LCAweDAxMDMsCisJMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDhjYjgsIDB4MTA3OCwgMHhhMTgxLCAweDEwNzgsCisJMHg0OTgyLCAweDEwNzgsIDB4OGJmNCwgMHgxMDc4LCAweDhjMDEsIDB4MGM3ZiwgMHgwMDc4LCAweDVjODgsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDVjODgsIDB4MTI3ZiwgMHgwMDdmLCAweDAxN2YsCisJMHgwMjdmLCAweDA2N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg1Y2Q2LCAweDEwNzgsIDB4YTE4MSwgMHgxMDc4LCAweDllNzAsCisJMHgwMDc4LCAweDVjZTMsIDB4MDA3ZSwgMHgwNjdlLCAweDBjN2UsIDB4MGQ3ZSwgMHgwZjdlLCAweDIwMzEsCisJMHgwMDAwLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksIDB4YTVhYiwgMHg3ODM4LCAweGEwNjUsCisJMHgwMDQwLCAweDVkNDEsIDB4NjAwYywgMHgwMDdlLCAweDYwMGYsIDB4MDAwMCwgMHg3ODNjLCAweGFjMDYsCisJMHgwMGMwLCAweDVkMjgsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg2ZTZjLCAweDc4MzMsCisJMHgwMDAwLCAweDc4M2YsIDB4MDAwMCwgMHg3ODQzLCAweDAwMDAsIDB4Nzg0NywgMHgwMDAwLCAweDAzN2YsCisJMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg1ZDNjLCAweDYwMTAsIDB4MjA2OCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAzLCAweDAwYzAsIDB4NWQ0YSwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsCisJMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDEwNzgsIDB4OGMwMSwgMHgwMDdmLCAweDAwNzgsCisJMHg1ZDBmLCAweDdlM2EsIDB4N2UzNiwgMHgxMjdmLCAweDBmN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDA2N2YsCisJMHgwMDdmLCAweDAwN2MsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg1ZDMzLCAweDEwNzgsCisJMHg5ZTcwLCAweDAwNzgsIDB4NWQzYywgMHgwMTdlLCAweDAyN2UsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsCisJMHgxMDc4LCAweDVkNmQsIDB4MTA3OCwgMHg1ZTIxLCAweDA4N2YsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsCisJMHgwZjdlLCAweDEyN2UsIDB4MjA3OSwgMHhhNWFiLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDVlYmMsCisJMHgxMDc4LCAweDVmMzIsIDB4MTI3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsCisJMHgwYzdlLCAweDA2N2UsIDB4MDE3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHhhNWFiLCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDA0MCwgMHg1ZTAxLCAweDYwMTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMjA2LCAweDAwYzAsIDB4NWRmYywgMHg4OGZmLCAweDAwNDAsCisJMHg1ZDhkLCAweDYwMjAsIDB4YTEwNiwgMHgwMGMwLCAweDVkZmMsIDB4NzAyNCwgMHhhYzA2LCAweDAwYzAsCisJMHg1ZGJkLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHg1ZGI4LCAweDEwNzgsCisJMHg1OTVhLCAweDEwNzgsIDB4NmM0MSwgMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LCAweDcwMjcsCisJMHgwMDAwLCAweDAzN2UsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsCisJMHg1ZGFkLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsCisJMHhkMDg0LCAweDAwNDAsIDB4NWRiNSwgMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHgwMDc4LCAweDVkYmQsCisJMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwMDc4LCAweDVkZmMsIDB4NzAxNCwgMHhhYzM2LCAweDAwYzAsCisJMHg1ZGMzLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweGFjMzYsIDB4MDBjMCwgMHg1ZGQxLCAweDJjMDAsCisJMHhhZjM2LCAweDAwNDAsIDB4NWRjZiwgMHgyZjAwLCAweDcwMTIsIDB4MDA3OCwgMHg1ZGQxLCAweDcwMTMsCisJMHgwMDAwLCAweDY2MGMsIDB4MDY3ZSwgMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg1ZGRhLCAweDdlMGUsCisJMHgwMDc4LCAweDVkZGIsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4NWRmNSwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDVlMGEsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg4Y2I4LCAweDEwNzgsCisJMHhhMTgxLCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDhiZjQsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg3MDQ1LCAweDBjN2YsIDB4MDA3OCwgMHg1ZDdjLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsCisJMHg1ZDdjLCAweDEyN2YsIDB4MDA3ZiwgMHgwMTdmLCAweDA2N2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg1ZTE1LCAweDEwNzgsCisJMHhhMTgxLCAweDEwNzgsIDB4OWU3MCwgMHgwMDc4LCAweDVkZjUsIDB4NjAxYywgMHhhMDg2LCAweDAwMDIsCisJMHgwMGMwLCAweDVkZjUsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsIDB4MDA0MCwgMHg1ZGU4LCAweDAwNzgsCisJMHg1ZGY1LCAweDBjN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHhhMjgwLCAweGE0MzQsCisJMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHg1ZWI4LCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDA2N2UsCisJMHgyMDcxLCAweGE1YWIsIDB4NjY1NCwgMHg3MDE4LCAweGFjMDYsIDB4MDBjMCwgMHg1ZTM4LCAweDc2MWEsCisJMHg3MDFjLCAweGFjMDYsIDB4MDBjMCwgMHg1ZTQ0LCAweDg2ZmYsIDB4MDBjMCwgMHg1ZTQzLCAweDcwMTgsCisJMHg3MDFlLCAweDAwNzgsIDB4NWU0NCwgMHg3NjFlLCAweDYwNTgsIDB4YTA3ZCwgMHgwMDQwLCAweDVlNDksCisJMHg3ZTU2LCAweGE2ZWQsIDB4MDAwMCwgMHgwMDQwLCAweDVlNGYsIDB4MmYwMCwgMHg2ODVhLCAweDYwNTcsCisJMHgwMDAwLCAweDYwNWIsIDB4MDAwMCwgMHg2MDAwLCAweGMwZDQsIDB4YzBkYywgMHg2MDAyLCAweDEwNzgsCisJMHg0NDEwLCAweDAwNDAsIDB4NWViNCwgMHg3NjI0LCAweDg2ZmYsIDB4MDA0MCwgMHg1ZWEyLCAweGE2ODAsCisJMHgwMDA0LCAweDIwMDQsIDB4YWQwNiwgMHgwMGMwLCAweDVlYTIsIDB4MGQ3ZSwgMHgyMDY5LCAweDAxMDAsCisJMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHg1ZTk5LCAweDEwNzgsIDB4NTk1YSwgMHgxMDc4LCAweDZjNDEsCisJMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LCAweDcwMjcsIDB4MDAwMCwgMHgwMzdlLCAweDIwNjksCisJMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NWU4MiwgMHg2ODAzLCAweDAxMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDVlOGEsCisJMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHgwZDdmLCAweDBjN2UsIDB4NjAzYywgMHhhMDA1LCAweDAwNDAsCisJMHg1ZTkzLCAweDgwMDEsIDB4NjAzZSwgMHgyNjYwLCAweDEwNzgsIDB4OGMwMSwgMHgwYzdmLCAweDAwNzgsCisJMHg1ZWEyLCAweDBkN2YsIDB4MGM3ZSwgMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDBjN2YsCisJMHgwMDc4LCAweDVlNTcsIDB4OGRmZiwgMHgwMDQwLCAweDVlYjAsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsCisJMHg2ODQ3LCAweDAwMDAsIDB4MTA3OCwgMHg4Y2I4LCAweDEwNzgsIDB4YTE4MSwgMHgxMDc4LCAweDQ5ODIsCisJMHgxMDc4LCAweDcwNDUsIDB4MDA3OCwgMHg1ZTU3LCAweDA2N2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgxMjdmLCAweDAwN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDAwN2UsIDB4MDY3ZSwgMHgwYzdlLCAweDBkN2UsCisJMHgyMDMxLCAweDAwMDAsIDB4NzgxNCwgMHhhMDY1LCAweDAwNDAsIDB4NWYxNiwgMHg2MDBjLCAweDAwN2UsCisJMHg2MDBmLCAweDAwMDAsIDB4NzgyNCwgMHhhYzA2LCAweDAwYzAsIDB4NWVmYiwgMHgyMDY5LCAweDAxMDAsCisJMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHg1ZWY1LCAweDEwNzgsIDB4NTk1YSwgMHgxMDc4LCAweDZjNDEsCisJMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LCAweDc4MjcsIDB4MDAwMCwgMHgwMzdlLCAweDIwNjksCisJMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NWVlYSwgMHg2ODAzLCAweDAxMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDVlZjIsCisJMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHgwMDc4LCAweDVlZmIsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsCisJMHgyYzMwLCAweDAwNzgsIDB4NWYxMywgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsCisJMHg1ZjBmLCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4NWYxZCwgMHg2ODM3LCAweDAxMDMsCisJMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDEwNzgsCisJMHg4YzAxLCAweDEwNzgsIDB4NzA0NSwgMHgwMDdmLCAweDAwNzgsIDB4NWVjMywgMHg3ZTE2LCAweDdlMTIsCisJMHgwZDdmLCAweDBjN2YsIDB4MDY3ZiwgMHgwMDdmLCAweDAwN2MsIDB4NjAxYywgMHhhMDg2LCAweDAwMDYsCisJMHgwMGMwLCAweDVmMjYsIDB4MTA3OCwgMHg5ZTcwLCAweDAwNzgsIDB4NWYwZiwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4NWYwZiwgMHg2MDA0LCAweGEwODYsIDB4MDA4NSwgMHgwMDQwLCAweDVmMDYsCisJMHgwMDc4LCAweDVmMGYsIDB4MDA3ZSwgMHgwNjdlLCAweDBjN2UsIDB4MGQ3ZSwgMHg3ODE4LCAweGEwNjUsCisJMHgwMDQwLCAweDVmYTAsIDB4NjA1NCwgMHgwMDdlLCAweDYwNTcsIDB4MDAwMCwgMHg2MDViLCAweDAwMDAsCisJMHg2MDAwLCAweGMwZDQsIDB4YzBkYywgMHg2MDAyLCAweDEwNzgsIDB4NDQxMCwgMHgwMDQwLCAweDVmOWQsCisJMHg3ZTI0LCAweDg2ZmYsIDB4MDA0MCwgMHg1ZjhmLCAweGE2ODAsIDB4MDAwNCwgMHgyMDA0LCAweGFkMDYsCisJMHgwMGMwLCAweDVmOGYsIDB4MGQ3ZSwgMHgyMDY5LCAweDAxMDAsIDB4NjhjMCwgMHhhMDA1LCAweDAwNDAsCisJMHg1Zjg2LCAweDEwNzgsIDB4NTk1YSwgMHgxMDc4LCAweDZjNDEsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsCisJMHg3MTg4LCAweDc4MjcsIDB4MDAwMCwgMHgwMzdlLCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsCisJMHgxMDAwLCAweDAwNDAsIDB4NWY2ZiwgMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksCisJMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDVmNzcsIDB4NjgyNywgMHgwMDAxLCAweDAzN2YsCisJMHgwZDdmLCAweDBjN2UsIDB4NjAzYywgMHhhMDA1LCAweDAwNDAsIDB4NWY4MCwgMHg4MDAxLCAweDYwM2UsCisJMHgyNjYwLCAweDEwNzgsIDB4OGMwMSwgMHgwYzdmLCAweDAwNzgsIDB4NWY4ZiwgMHgwZDdmLCAweDBjN2UsCisJMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDBjN2YsIDB4MDA3OCwgMHg1ZjQ0LCAweDhkZmYsCisJMHgwMDQwLCAweDVmOTksIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsCisJMHg0OTgyLCAweDEwNzgsIDB4NzA0NSwgMHgwMDc4LCAweDVmNDQsIDB4MDA3ZiwgMHgwMDc4LCAweDVmMzcsCisJMHg3ODFlLCAweDc4MWEsIDB4MGQ3ZiwgMHgwYzdmLCAweDA2N2YsIDB4MDA3ZiwgMHgwMDdjLCAweDBlN2UsCisJMHgwZDdlLCAweDA2N2UsIDB4NjAwMCwgMHhkMGRjLCAweDAwNDAsIDB4NWZjNCwgMHg2MDRjLCAweGEwNmQsCisJMHgwMDQwLCAweDVmYzQsIDB4Njg0OCwgMHhhNjA2LCAweDAwYzAsIDB4NWZjNCwgMHgyMDcxLCAweGE1YWIsCisJMHg3MDI0LCAweGEwMzUsIDB4MDA0MCwgMHg1ZmM0LCAweGEwODAsIDB4MDAwNCwgMHgyMDA0LCAweGFkMDYsCisJMHgwMGMwLCAweDVmYzQsIDB4MTA3OCwgMHg1ZmM4LCAweDA2N2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHg3OGMwLCAweGEwMDUsIDB4MDBjMCwgMHg1ZmQ3LCAweDBjN2UsCisJMHgyNjYwLCAweDYwMDMsIDB4MDAwOSwgMHg2MzBhLCAweDBjN2YsIDB4MDA3OCwgMHg2MDBlLCAweDEwNzgsCisJMHg2YzQxLCAweDc4YzMsIDB4MDAwMCwgMHgxMDc4LCAweDcxODgsIDB4NzAyNywgMHgwMDAwLCAweDAzN2UsCisJMHgyMDc5LCAweDAxNDAsIDB4N2IwNCwgMHhhMzg0LCAweDEwMDAsIDB4MDA0MCwgMHg1ZmViLCAweDc4MDMsCisJMHgwMTAwLCAweDc4MDMsIDB4MDAwMCwgMHgyMDc5LCAweDAxMDAsIDB4NzgyNCwgMHhkMDg0LCAweDAwNDAsCisJMHg1ZmYzLCAweDc4MjcsIDB4MDAwMSwgMHgxMDc4LCAweDcxODgsIDB4MDM3ZiwgMHgxMDc4LCAweDQ0MTAsCisJMHgwYzdlLCAweDYwM2MsIDB4YTAwNSwgMHgwMDQwLCAweDVmZmYsIDB4ODAwMSwgMHg2MDNlLCAweDI2NjAsCisJMHgxMDc4LCAweDc1M2QsIDB4MGM3ZiwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsCisJMHgxMDc4LCAweDhjYjgsIDB4MTA3OCwgMHg0OTgyLCAweDEwNzgsIDB4NzA0NSwgMHgwZjdmLCAweDAwN2MsCisJMHgwZTdlLCAweDBjN2UsIDB4MjA3MSwgMHhhNWFiLCAweDcwMDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksCisJMHg2MDE5LCAweDYwMjMsIDB4NjAyNiwgMHg2MDNmLCAweDYwNWIsIDB4NjBhMCwgMHg2MDIzLCAweDYwMjMsCisJMHg2MDIxLCAweDEwNzgsIDB4MTMyOCwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHg3MDI0LCAweGEwNjUsCisJMHgwMDQwLCAweDYwMzQsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsCisJMHg2MDNiLCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsCisJMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHg3MjE2LCAweDcyMTIsIDB4MDA3OCwgMHg2MDM0LCAweDYwMTgsCisJMHgyMDYwLCAweDEwNzgsIDB4NDQxMCwgMHg2MDAwLCAweGMwZGMsIDB4NjAwMiwgMHg3MDIwLCAweDgwMDEsCisJMHg3MDIyLCAweDAwNDAsIDB4NjA1MCwgMHg2MDU0LCAweGEwMTUsIDB4MDA0MCwgMHg2MDU3LCAweDcyMWUsCisJMHg3MDA3LCAweDAwMDAsIDB4NzAyNywgMHgwMDAwLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcyMTgsCisJMHg3MjFlLCAweDAwNzgsIDB4NjA1MCwgMHg3MDI0LCAweGEwNjUsIDB4MDA0MCwgMHg2MDlkLCAweDcwMGMsCisJMHhhYzA2LCAweDAwYzAsIDB4NjA3MiwgMHgxMDc4LCAweDcwNDUsIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsCisJMHg2MDZlLCAweDcyMGUsIDB4NjAwZiwgMHgwMDAwLCAweDAwNzgsIDB4NjA5YiwgMHg3MjBlLCAweDcyMGEsCisJMHgwMDc4LCAweDYwOWIsIDB4NzAxNCwgMHhhYzA2LCAweDAwYzAsIDB4NjA4NSwgMHgxMDc4LCAweDcwNDUsCisJMHg2MDBjLCAweGEwMTUsIDB4MDA0MCwgMHg2MDgxLCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDAwNzgsCisJMHg2MDliLCAweDcyMTYsIDB4NzIxMiwgMHgwMDc4LCAweDYwOWIsIDB4NjAxOCwgMHgyMDYwLCAweDEwNzgsCisJMHg0NDEwLCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLCAweDEwNzgsIDB4NzA0NSwgMHg3MDFjLCAweGEwNjUsCisJMHgwMDQwLCAweDYwOWIsIDB4NjA1NCwgMHhhMDE1LCAweDAwNDAsIDB4NjA5OSwgMHg3MjFlLCAweDAwNzgsCisJMHg2MDliLCAweDcyMTgsIDB4NzIxZSwgMHg3MDI3LCAweDAwMDAsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHg3MDI0LCAweGEwNjUsIDB4MDA0MCwgMHg2MGFkLCAweDEwNzgsIDB4NzA0NSwgMHg2MDBjLCAweGEwMTUsCisJMHgwMDQwLCAweDYwYjQsIDB4NzIwZSwgMHg2MDBmLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LCAweDcwMjcsCisJMHgwMDAwLCAweDBjN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDcyMGUsIDB4NzIwYSwgMHgwMDc4LCAweDYwYWQsCisJMHgwZDdlLCAweDIwNjksIDB4YTVhYiwgMHg2ODMwLCAweGEwODQsIDB4MDAwMywgMHgwMDc5LCAweDYwYzAsCisJMHg2MGM2LCAweDYwYzgsIDB4NjBlZSwgMHg2MGM2LCAweDEwNzgsIDB4MTMyOCwgMHgwZDdmLCAweDAwN2MsCisJMHgwYzdlLCAweDY4NDAsIDB4YTA4NiwgMHgwMDAxLCAweDAwNDAsIDB4NjBlNCwgMHg2ODNjLCAweGEwNjUsCisJMHgwMDQwLCAweDYwZDksIDB4NjAwYywgMHhhMDE1LCAweDAwNDAsIDB4NjBlMCwgMHg2YTNhLCAweDYwMGYsCisJMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHg2ODNhLCAweDY4MzYsIDB4MDA3OCwgMHg2MGQ5LCAweDY4NDMsIDB4MDAwMCwgMHg2ODM4LCAweGEwNjUsCisJMHgwMDQwLCAweDYwZDksIDB4NjAwMywgMHgwMDAzLCAweDAwNzgsIDB4NjBkOSwgMHgwYzdlLCAweDY4NDMsCisJMHgwMDAwLCAweDY4NDcsIDB4MDAwMCwgMHg2ODNjLCAweGEwNjUsIDB4MDA0MCwgMHg2MTA2LCAweDYwMGMsCisJMHhhMDE1LCAweDAwNDAsIDB4NjEwMiwgMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsCisJMHgwMDc4LCAweDYxMDYsIDB4NjgzZiwgMHgwMDAwLCAweDY4M2EsIDB4NjgzNiwgMHgwYzdmLCAweDBkN2YsCisJMHgwMDdjLCAweDBkN2UsIDB4MjA2OSwgMHhhNWFiLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwNzksCisJMHg2MTExLCAweDYxMWIsIDB4NjFjMiwgMHg2MWMyLCAweDYxYzIsIDB4NjFjMiwgMHg2MWM0LCAweDYxYzIsCisJMHg2MTE5LCAweDEwNzgsIDB4MTMyOCwgMHg2ODIwLCAweGEwMDUsIDB4MDBjMCwgMHg2MTIxLCAweDBkN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4NjgwYywgMHhhMDY1LCAweDAwNDAsIDB4NjEzMCwgMHg2ODA3LCAweDAwMDQsCisJMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgxMDc4LCAweDYyMGEsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHg2ODE0LCAweGEwNjUsIDB4MDA0MCwgMHg2MTNlLCAweDY4MDcsIDB4MDAwMSwgMHg2ODI2LCAweDY4MmIsCisJMHgwMDAwLCAweDEwNzgsIDB4NjIwYSwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHgwZTdlLCAweDAzN2UsCisJMHg2YTFjLCAweGEyZjUsIDB4MDAwMCwgMHgwMDQwLCAweDYxYmQsIDB4NzA0YywgMHhhMDBkLCAweDAwNDAsCisJMHg2MTRkLCAweDcwODgsIDB4YTAwNSwgMHgwMDQwLCAweDYxNjUsIDB4NzA1NCwgMHhhMDc1LCAweDAwNDAsCisJMHg2MTU2LCAweGEyMGUsIDB4MDA0MCwgMHg2MWJkLCAweDAwNzgsIDB4NjE1YiwgMHg2ODE4LCAweGEyMGUsCisJMHgwMDQwLCAweDYxYmQsIDB4MjA3MCwgMHg3MDRjLCAweGEwMGQsIDB4MDA0MCwgMHg2MTRkLCAweDcwODgsCisJMHhhMDA1LCAweDAwYzAsIDB4NjE0ZCwgMHgyZTAwLCAweDY4MWUsIDB4NzMzYywgMHg3MDM4LCAweGEzMDIsCisJMHgwMGM4LCAweDYxNGQsIDB4MTA3OCwgMHg3NTBjLCAweDAwNDAsIDB4NjFiZCwgMHg4MzE4LCAweDczM2UsCisJMHg2MTEyLCAweDJlMTAsIDB4NjIxYSwgMHhhMTgwLCAweDAwMTQsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHg2MDMyLCAweGExODAsIDB4MDAxNCwgMHgyMDAzLCAweDAwMDAsIDB4YTE4MCwgMHgwMDE1LCAweDIwMDQsCisJMHhhMDhhLCAweDE5OWEsIDB4MDA0OCwgMHg2MTg2LCAweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMWIsCisJMHg4MzFiLCAweGEzMTgsIDB4NjMxNiwgMHgwMzdmLCAweDBmN2UsIDB4MmM3OCwgMHg3MWEwLCAweGQxYmMsCisJMHgwMDQwLCAweDYxOWYsIDB4NzEwMCwgMHhkMWY0LCAweDAwNDAsIDB4NjE5YiwgMHg3MTE0LCAweGExOGMsCisJMHgwMGZmLCAweDAwNzgsIDB4NjFhNCwgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg2MWE0LCAweGExZTAsCisJMHgyOTNmLCAweDJjMGMsIDB4YTE4YywgMHgwMGZmLCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweDEwNzgsCisJMHg2NzliLCAweDczMDAsIDB4YzNkZCwgMHg3MzAyLCAweDY4MDcsIDB4MDAwMiwgMHgyZjE4LCAweDZiMjYsCisJMHg2ODJiLCAweDAwMDAsIDB4NzgxZiwgMHgwMDAzLCAweDc4MDMsIDB4MDAwMSwgMHg3ODA3LCAweDAwNDAsCisJMHgwZjdmLCAweDBlN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDM3ZiwgMHgwZTdmLCAweDBjN2YsCisJMHgwMDc4LCAweDYxYmIsIDB4MGQ3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NjgwYywgMHhhMDY1LCAweDAwNDAsCisJMHg2MWQwLCAweDY4MDcsIDB4MDAwNCwgMHg2ODI2LCAweDY4MmIsIDB4MDAwMCwgMHgxMDc4LCAweDYyMGEsCisJMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHgwZjdlLCAweDBkN2UsIDB4MjA2OSwgMHhhNWFiLCAweDY4MzAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDBjMCwgMHg2MWYxLCAweDY4MzgsIDB4YTA3ZCwgMHgwMDQwLCAweDYxZjEsCisJMHg2ODMzLCAweDAwMDEsIDB4NjgzZSwgMHg2ODQ3LCAweDAwMDAsIDB4MTI3ZSwgMHgwZjdlLCAweDIwOTEsCisJMHgyMjAwLCAweDAyN2YsIDB4MTA3OCwgMHgxZDI4LCAweDAwYzAsIDB4NjFmNCwgMHgxMjdmLCAweDEwNzgsCisJMHg2YWU1LCAweDBkN2YsIDB4MGY3ZiwgMHgwMDdjLCAweDEyN2YsIDB4Njg0MywgMHgwMDAwLCAweDc4MDMsCisJMHgwMDAyLCAweDc4MGMsIDB4YTAxNSwgMHgwMDQwLCAweDYyMDYsIDB4NmEzYSwgMHg3ODBmLCAweDAwMDAsCisJMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDAwNzgsIDB4NjFmMSwgMHg2ODNhLCAweDY4MzYsCisJMHgwMDc4LCAweDYyMDAsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg2MjEwLCAweDAwN2MsCisJMHg2MjE5LCAweDYyMWUsIDB4NjYzZiwgMHg2NzU4LCAweDYyMWUsIDB4NjYzZiwgMHg2NzU4LCAweDYyMTksCisJMHg2MjFlLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgxNTdlLCAweDEzN2UsCisJMHgxNDdlLCAweDBjN2UsIDB4MGY3ZSwgMHg2MDA0LCAweGEwOGEsIDB4MDA0NCwgMHgxMGM4LCAweDEzMjgsCisJMHg2MTE4LCAweDIxNzgsIDB4NzlhMCwgMHhkMWJjLCAweDAwNDAsIDB4NjIzYiwgMHg3OTAwLCAweGQxZjQsCisJMHgwMDQwLCAweDYyMzcsIDB4NzkxNCwgMHhhMThjLCAweDAwZmYsIDB4MDA3OCwgMHg2MjQwLCAweDIwMDksCisJMHgwMDAwLCAweDAwNzgsIDB4NjI0MCwgMHhhMWY4LCAweDI5M2YsIDB4MmYwYywgMHhhMThjLCAweDAwZmYsCisJMHgyYzc4LCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweGEwOGEsIDB4MDA0MCwgMHgwMGM4LCAweDYyOTIsCisJMHgxMDc5LCAweDYyNTAsIDB4MGY3ZiwgMHgwYzdmLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDAwN2MsCisJMHg2MmY4LCAweDYzNDAsIDB4NjM2OCwgMHg2NDAzLCAweDY0MzMsIDB4NjQzYiwgMHg2NDYyLCAweDY0NzMsCisJMHg2NDg0LCAweDY0OGMsIDB4NjRhNCwgMHg2NDhjLCAweDY1MGYsIDB4NjQ3MywgMHg2NTMwLCAweDY1MzgsCisJMHg2NDg0LCAweDY1MzgsIDB4NjU0OSwgMHg2MjkwLCAweDYyOTAsIDB4NjI5MCwgMHg2MjkwLCAweDYyOTAsCisJMHg2MjkwLCAweDYyOTAsIDB4NjI5MCwgMHg2MjkwLCAweDYyOTAsIDB4NjI5MCwgMHg2ZDA1LCAweDZkMmEsCisJMHg2ZDNmLCAweDZkNjIsIDB4NmQ4MywgMHg2NDYyLCAweDYyOTAsIDB4NjQ2MiwgMHg2NDhjLCAweDYyOTAsCisJMHg2MzY4LCAweDY0MDMsIDB4NjI5MCwgMHg3MmFjLCAweDY0OGMsIDB4NjI5MCwgMHg3MmNjLCAweDY0OGMsCisJMHg2MjkwLCAweDYyOTAsIDB4NjJmMywgMHg2MmExLCAweDYyOTAsIDB4NzJmMSwgMHg3MzY4LCAweDc0NTAsCisJMHg2MjkwLCAweDc0NjEsIDB4NjQ1YywgMHg3NDdkLCAweDYyOTAsIDB4NmQ5OCwgMHg2MjkwLCAweDYyOTAsCisJMHgxMDc4LCAweDEzMjgsIDB4MjEwMCwgMHgxMDc5LCAweDYyOWIsIDB4MGY3ZiwgMHgwYzdmLCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MDA3YywgMHg2MjlmLCAweDYyOWYsIDB4NjI5ZiwgMHg2MmQ1LCAweDEwNzgsCisJMHgxMzI4LCAweDBkN2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHg3ODEwLCAweDIwNjgsCisJMHgyMGEzLCAweDI0MTQsIDB4MjBhMywgMHgwMDE4LCAweDIwYTMsIDB4MDgwMCwgMHg2ODNjLCAweDIwYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2ODUwLCAweDIwYTIsIDB4Njg1NCwgMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTgsIDB4MTA3OCwgMHg2YzJkLCAweDBkN2YsIDB4MDA3YywgMHgwZDdlLCAweDc4MTgsCisJMHgyMDY4LCAweDY4YTAsIDB4YTA4MiwgMHgwMDdlLCAweDAwNDgsIDB4NjJkMiwgMHhhMDg1LCAweDAwMDEsCisJMHgwZDdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDYyZDAsIDB4MGQ3ZSwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY1NjcsIDB4MjBhMywgMHgwNTAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODEwLCAweGEwZTgsCisJMHgwMDBmLCAweDY4MDgsIDB4MjBhMiwgMHg2ODBjLCAweDIwYTIsIDB4NjgxMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDY4MTgsIDB4MjBhMiwgMHg2ODFjLCAweDIwYTIsIDB4NjBjMywgMHgwMDEwLCAweDEwNzgsCisJMHg2YzJkLCAweDBkN2YsIDB4MDA3YywgMHg2MDMwLCAweDYwOWEsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LCAweDIwYTMsIDB4NTIwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgwZDdlLCAweDIwNjksIDB4YTM1MSwgMHg2ODA0LCAweGQwODQsIDB4MDA0MCwgMHg2MzEyLCAweDY4MjgsCisJMHgyMGEzLCAweDAwMDAsIDB4MDE3ZSwgMHgxMDc4LCAweDI0ZmEsIDB4MjFhMiwgMHgwMTdmLCAweDBkN2YsCisJMHgwMDc4LCAweDYzMTcsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTksCisJMHgwMDA0LCAweDIwOTksIDB4YTMwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGEzMDEsCisJMHg1M2E2LCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4MiwgMHgwMDdmLCAweDAwNDgsCisJMHg2MzMxLCAweDIwMDEsIDB4YTMxYSwgMHgyMGE2LCAweDIwMDEsIDB4YTMxYiwgMHgyMGE2LCAweDAwNzgsCisJMHg2MzM3LCAweDIwYTMsIDB4MDAwMCwgMHg2MDMwLCAweGEwODQsIDB4MDBmZiwgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LCAweDIwYTMsIDB4MDUwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsIDB4MDA3ZiwgMHgwMDQ4LCAweDYzNTgsCisJMHgyMDAxLCAweGEzMWEsIDB4MjBhNiwgMHgyMDAxLCAweGEzMWIsIDB4MjBhNiwgMHgwMDc4LCAweDYzNWUsCisJMHgyMGEzLCAweDAwMDAsIDB4NjAzMCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGEzMDUsIDB4NTNhNiwgMHg2MGMzLCAweDAwMTAsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LCAweDBjN2UsIDB4NzgxOCwgMHgyMDYwLCAweDIwMDEsCisJMHgwMDAwLCAweDEwNzgsIDB4NDhhMiwgMHgwYzdmLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg2LCAweDAwN2UsIDB4MDBjMCwgMHg2MzgzLCAweDIwYTMsIDB4MDQwMCwgMHg2MjBjLCAweGMyYjQsCisJMHg2MjBlLCAweDAwNzgsIDB4NjM4NSwgMHgyMGEzLCAweDAzMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMDg2LCAweDAwN2UsIDB4MDBjMCwgMHg2M2QyLCAweDIwOTksCisJMHhhNThjLCAweDMzYTYsIDB4OTM5OCwgMHgzM2E2LCAweDkzOTgsIDB4MzMwNCwgMHhhMDg0LCAweDNmZmYsCisJMHgyMGEyLCAweDkzOTgsIDB4MzNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhMzA1LCAweDUzYTYsCisJMHgyMGE5LCAweDAwMDQsIDB4MjA5OSwgMHhhMzAxLCAweDUzYTYsIDB4MjBhOSwgMHgwMDEwLCAweDIwYTMsCisJMHgwMDAwLCAweDAwZjAsIDB4NjNhZiwgMHgyMDk5LCAweGE1OTQsIDB4MzMwNCwgMHhjMGRkLCAweDIwYTIsCisJMHgyMDAxLCAweGEzNzEsIDB4MjAwNCwgMHhkMGU0LCAweDAwNDAsIDB4NjNjYSwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4OTM5OCwgMHg5Mzk4LCAweDkzOTgsIDB4MzNhNiwgMHgyMGE5LCAweDAwMDQsCisJMHgwMDc4LCAweDYzY2MsIDB4MjBhOSwgMHgwMDA3LCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDYzY2MsCisJMHgwMDc4LCAweDYzZjIsIDB4MjA5OSwgMHhhNThjLCAweDIwYTksIDB4MDAwOCwgMHg1M2E2LCAweDIwYTksCisJMHgwMDA0LCAweDIwOTksIDB4YTMwNSwgMHg1M2E2LCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGEzMDEsCisJMHg1M2E2LCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MDBmMCwgMHg2M2UzLCAweDIwYTksCisJMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDYzZTksIDB4MjA5OSwgMHhhNTk0LCAweDIwYTksCisJMHgwMDA4LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgwMGYwLCAweDYzZjQsCisJMHgyMGE5LCAweDAwMGEsIDB4MjBhMywgMHgwMDAwLCAweDAwZjAsIDB4NjNmYSwgMHg2MGMzLCAweDAwNzQsCisJMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LCAweDIwYTMsCisJMHgyMDEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLCAweDA4MDAsIDB4MjBhMywgMHgyMDAwLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MGY3ZSwgMHgyMDc5LCAweGEzNTEsCisJMHg3OTA0LCAweDBmN2YsIDB4ZDFhYywgMHgwMGMwLCAweDY0MWYsIDB4YTA4NSwgMHgwMDIwLCAweGQxYTQsCisJMHgwMDQwLCAweDY0MjQsIDB4YTA4NSwgMHgwMDEwLCAweGEwODUsIDB4MDAwMiwgMHgwZDdlLCAweDAwNzgsCisJMHg2NGVkLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LCAweDIwYTMsCisJMHg1MDAwLCAweDAwNzgsIDB4NjM4NSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NTY3LCAweDIwYTMsCisJMHgyMTEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE0LCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZWYsCisJMHgwMDc4LCAweDY0NjYsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjVmOCwgMHgyMGEzLCAweDAyMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMDQsCisJMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LCAweDIwYTMsCisJMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgyYTAwLCAweDYwYzMsCisJMHgwMDA4LCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsCisJMHgyMGEzLCAweDAyMDAsIDB4MDA3OCwgMHg2Mzg1LCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsCisJMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MjgsIDB4YTAwNSwgMHgwMDQwLCAweDY0OWIsCisJMHgyMGEyLCAweDAwNzgsIDB4NjQ5ZCwgMHgyMGEzLCAweDAwMDMsIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsCisJMHgwMDA4LCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLCAweDBkN2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NWY4LCAweDIwYTMsIDB4MDIxMCwgMHgyMGEzLCAweDAwMTQsIDB4MjBhMywgMHgwODAwLCAweDc4MTgsCisJMHgyMDY4LCAweDY4OTQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsIDB4NjRjYSwgMHg2OTk4LCAweGExODQsCisJMHhjMDAwLCAweDAwYzAsIDB4NjRjNiwgMHhkMWVjLCAweDAwNDAsIDB4NjRjMiwgMHgyMGEzLCAweDIxMDAsCisJMHgwMDc4LCAweDY0Y2MsIDB4MjBhMywgMHgwMTAwLCAweDAwNzgsIDB4NjRjYywgMHgyMGEzLCAweDA0MDAsCisJMHgwMDc4LCAweDY0Y2MsIDB4MjBhMywgMHgwNzAwLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MGY3ZSwgMHgyMDc5LCAweGEzNTEsIDB4NzkwNCwgMHgwZjdmLCAweGQxYWMsCisJMHgwMGMwLCAweDY0ZGMsIDB4YTA4NSwgMHgwMDIwLCAweGQxYTQsIDB4MDA0MCwgMHg2NGUxLCAweGEwODUsCisJMHgwMDEwLCAweDIwMDksIDB4YTM3MywgMHgyMTBjLCAweGQxODQsIDB4MDA0MCwgMHg2NGViLCAweDY5OWMsCisJMHhkMThjLCAweDAwNDAsIDB4NjRlZCwgMHhhMDg1LCAweDAwMDIsIDB4MDI3ZSwgMHgyMDA5LCAweGEzNzEsCisJMHgyMTBjLCAweGQxZTQsIDB4MDA0MCwgMHg2NGZiLCAweGMwYzUsIDB4YTA5NCwgMHgwMDMwLCAweGEyOTYsCisJMHgwMDEwLCAweDAwNDAsIDB4NjUwNSwgMHhkMWVjLCAweDAwNDAsIDB4NjUwNSwgMHhhMDk0LCAweDAwMzAsCisJMHhhMjk2LCAweDAwMTAsIDB4MDA0MCwgMHg2NTA1LCAweGMwYmQsIDB4MDI3ZiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAxNCwgMHgxMDc4LCAweDZjMmQsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjVmOCwgMHgyMGEzLCAweDAyMTAsIDB4MjBhMywgMHgwMDE0LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LCAweDIwYTMsIDB4MDIwMCwgMHgwMDc4LCAweDYyZmUsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZjMmQsCisJMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NWY4LCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDBiLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgwMjdlLCAweDAzN2UsCisJMHgwNDdlLCAweDIwMTksIDB4MzIwMCwgMHgyMDIxLCAweDA4MDAsIDB4MDA3OCwgMHg2NTZlLCAweDAyN2UsCisJMHgwMzdlLCAweDA0N2UsIDB4MjAxOSwgMHgyMjAwLCAweDIwMjEsIDB4MDEwMCwgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAxNCwgMHhhMjg2LCAweDAwN2UsCisJMHgwMGMwLCAweDY1ODEsIDB4YTM4NSwgMHgwMGZmLCAweDIwYTIsIDB4MjBhMywgMHhmZmZlLCAweDAwNzgsCisJMHg2NWI2LCAweGEyODYsIDB4MDA3ZiwgMHgwMGMwLCAweDY1OGQsIDB4MGQ3ZSwgMHhhMzg1LCAweDAwZmYsCisJMHgyMGEyLCAweDIwYTMsIDB4ZmZmZCwgMHgwMDc4LCAweDY1YTQsIDB4ZDJiYywgMHgwMDQwLCAweDY1YWMsCisJMHhhMjg2LCAweDAwODAsIDB4MGQ3ZSwgMHgwMGMwLCAweDY1OWMsIDB4YTM4NSwgMHgwMGZmLCAweDIwYTIsCisJMHgyMGEzLCAweGZmZmMsIDB4MDA3OCwgMHg2NWE0LCAweGEyZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsCisJMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTMxYSwgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2NWJhLCAweDBkN2UsIDB4YTJlOCwgMHhhNDM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MjMwLCAweDIyYTIsIDB4YTQ4NSwgMHgwMDI5LCAweDIwYTIsIDB4MDQ3ZiwgMHgwMzdmLCAweDIwYTMsCisJMHgwMDAwLCAweDEwNzgsIDB4NmMxYywgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyZmEyLCAweDIwYTMsCisJMHhmZmZmLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDAyN2UsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwYTMsIDB4MDJmZiwgMHgyMDExLCAweGZmZmMsCisJMHgyMmEyLCAweDBkN2UsIDB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsCisJMHgyMGEzLCAweDIwMjksIDB4MjBhMywgMHgwMDAwLCAweDAwNzgsIDB4NjVjMSwgMHgyMGEzLCAweDAxMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhmYzAyLCAweDIwYTMsIDB4MDAwMCwgMHgwMDdjLCAweDAyN2UsCisJMHgwMzdlLCAweDA0N2UsIDB4MjAxOSwgMHgzMzAwLCAweDIwMjEsIDB4MDgwMCwgMHgwMDc4LCAweDY1ZmYsCisJMHgwMjdlLCAweDAzN2UsIDB4MDQ3ZSwgMHgyMDE5LCAweDIzMDAsIDB4MjAyMSwgMHgwMTAwLCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwOTIsCisJMHgwMDdlLCAweDAwNDgsIDB4NjYxYywgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsCisJMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTMxYSwgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2NjJhLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MjMwLCAweDIyYTIsIDB4YTQ4NSwgMHgwMDk4LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDA0N2YsCisJMHgwMzdmLCAweDEwNzgsIDB4NmMxYywgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsCisJMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwZjdlLCAweDYwMDQsIDB4YTA4YSwgMHgwMDg1LCAweDEwNDgsIDB4MTMyOCwgMHhhMDhhLCAweDAwOGMsCisJMHgxMGM4LCAweDEzMjgsIDB4NjExOCwgMHgyMTc4LCAweDc5YTAsIDB4ZDFiYywgMHgwMDQwLCAweDY2NWQsCisJMHg3OTAwLCAweGQxZjQsIDB4MDA0MCwgMHg2NjU5LCAweDc5MTQsIDB4YTE4YywgMHgwMGZmLCAweDAwNzgsCisJMHg2NjYyLCAweDIwMDksIDB4MDAwMCwgMHgwMDc4LCAweDY2NjIsIDB4YTFmOCwgMHgyOTNmLCAweDJmMGMsCisJMHhhMThjLCAweDAwZmYsIDB4MmM3OCwgMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDgyLCAweDAwODUsCisJMHgxMDc5LCAweDY2NmQsIDB4MGY3ZiwgMHgwYzdmLCAweDAwN2MsIDB4NjY3NiwgMHg2NjgxLCAweDY2OWMsCisJMHg2Njc0LCAweDY2NzQsIDB4NjY3NCwgMHg2Njc2LCAweDEwNzgsIDB4MTMyOCwgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjZhZiwgMHg2MGMzLCAweDAwMDAsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsCisJMHgwMDdjLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjZlMywgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLCAweDc4MTAsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMGMsCisJMHgxMDc4LCAweDZjMmQsIDB4MTQ3ZiwgMHgwMDdjLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NzI0LCAweDIwYTMsIDB4MDAwMywgMHgyMGEzLCAweDAzMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwNCwgMHgxMDc4LCAweDZjMmQsIDB4MTQ3ZiwgMHgwMDdjLCAweDAyN2UsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDkyLCAweDAwN2UsIDB4MDA0OCwgMHg2NmNlLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4ODEwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NjZkZCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDgxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgwZDdmLCAweDIwYTMsIDB4MDAwMCwgMHg2MjMwLCAweDIyYTIsIDB4MjBhMywgMHgwMDA5LCAweDIwYTMsCisJMHgwMDAwLCAweDAwNzgsIDB4NjVjMSwgMHgwMjdlLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwOTIsIDB4MDA3ZSwgMHgwMDQ4LCAweDY3MDIsCisJMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4NDAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhMzFhLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDBkN2YsCisJMHgwMDc4LCAweDY3MTEsIDB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHg4NDAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDBkN2YsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsCisJMHgyMmEyLCAweDIwYTMsIDB4MDA5OSwgMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwgMHg2YzFjLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDdhMTAsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MDI3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA5MiwgMHgwMDdlLCAweDAwNDgsCisJMHg2NzQzLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDg1MDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsCisJMHgwZDdmLCAweDAwNzgsIDB4Njc1MiwgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MjMwLCAweDIyYTIsIDB4MjBhMywgMHgwMDk5LCAweDIwYTMsIDB4MDAwMCwgMHgwMDc4LCAweDY3MTUsCisJMHgwYzdlLCAweDBmN2UsIDB4MmM3OCwgMHg3ODA0LCAweGEwOGEsIDB4MDA0MCwgMHgxMDQ4LCAweDEzMjgsCisJMHhhMDhhLCAweDAwNTMsIDB4MTBjOCwgMHgxMzI4LCAweDc5MTgsIDB4MjE2MCwgMHg2MWEwLCAweGQxYmMsCisJMHgwMDQwLCAweDY3NzcsIDB4NjEwMCwgMHhkMWY0LCAweDAwNDAsIDB4Njc3MywgMHg2MTE0LCAweGExOGMsCisJMHgwMGZmLCAweDAwNzgsIDB4Njc3YywgMHgyMDA5LCAweDAwMDAsIDB4MDA3OCwgMHg2NzdjLCAweGExZTAsCisJMHgyOTNmLCAweDJjMGMsIDB4YTE4YywgMHgwMGZmLCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweGEwODIsCisJMHgwMDQwLCAweDEwNzksIDB4Njc4NiwgMHgwZjdmLCAweDBjN2YsIDB4MDA3YywgMHg2NzliLCAweDY4YTksCisJMHg2ODRhLCAweDZhNTksIDB4Njc5OSwgMHg2Nzk5LCAweDY3OTksIDB4Njc5OSwgMHg2Nzk5LCAweDY3OTksCisJMHg2Nzk5LCAweDZmNWUsIDB4NmY2ZiwgMHg2ZjgwLCAweDZmOTEsIDB4Njc5OSwgMHg3NDhlLCAweDY3OTksCisJMHg2ZjRkLCAweDEwNzgsIDB4MTMyOCwgMHgwZDdlLCAweDE1N2UsIDB4MTQ3ZSwgMHg3ODBiLCAweGZmZmYsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2ODA2LCAweDc5MTAsIDB4MjE2OCwgMHg2OTQ4LCAweDc5MjIsCisJMHgyMWEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4Njk0YywgMHhhMTg0LCAweDAwMGYsCisJMHgwMGMwLCAweDY3YjYsIDB4MjAwMSwgMHgwMDA1LCAweDAwNzgsIDB4NjdjMCwgMHhkMTg0LCAweDAwNDAsCisJMHg2N2JkLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDY3YzAsIDB4YTA4NCwgMHgwMDA2LCAweDgwMDQsCisJMHgwMTdlLCAweDIwMDgsIDB4NzgzMCwgMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHhhMTA1LCAweDAxN2YsCisJMHgyMGEyLCAweGQxYWMsIDB4MDA0MCwgMHg2N2QwLCAweDIwYTMsIDB4MDAwMiwgMHgwMDc4LCAweDY3ZGMsCisJMHhkMWI0LCAweDAwNDAsIDB4NjdkNywgMHgyMGEzLCAweDAwMDEsIDB4MDA3OCwgMHg2N2RjLCAweDIwYTMsCisJMHgwMDAwLCAweDIyMzAsIDB4MDA3OCwgMHg2N2RlLCAweDZhODAsIDB4NmU3YywgMHgyMGE5LCAweDAwMDgsCisJMHhhZDgwLCAweDAwMTcsIDB4MjAwYywgMHg4MTBmLCAweDIxYTIsIDB4ODAwMCwgMHgwMGYwLCAweDY3ZTIsCisJMHgyMmEyLCAweDI2YTIsIDB4NjBjMywgMHgwMDIwLCAweDIwZTEsIDB4OTA4MCwgMHg2MDE0LCAweGEwODQsCisJMHgwMDA0LCAweGEwODUsIDB4MDAwOSwgMHg2MDE2LCAweDIwMDEsIDB4YTVjNywgMHgyMDAzLCAweDA3ZDAsCisJMHgyMDAxLCAweGE1YzYsIDB4MjAwMywgMHgwMDA5LCAweDIwMDEsIDB4YTVjYywgMHgyMDAzLCAweDAwMDIsCisJMHgxMDc4LCAweDE1N2UsIDB4MTQ3ZiwgMHgxNTdmLCAweDBkN2YsIDB4MDA3YywgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4N2ExOCwgMHhhMjgwLCAweDAwMjMsIDB4MjAxNCwgMHg4MjEwLCAweGEyOTQsCisJMHgwMGZmLCAweDIyMDIsIDB4ODIxNywgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGQwYmMsCisJMHgwMDQwLCAweDY4MmMsIDB4MGQ3ZSwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHgwNjAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YTMxYSwgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDBkN2YsIDB4MDA3OCwgMHg2ODNiLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4MDYwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwZDdmLCAweDIwYTMsCisJMHgwMDAwLCAweDYxMzAsIDB4MjFhMiwgMHgyMGEzLCAweDA4MjksIDB4MjBhMywgMHgwMDAwLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAwN2MsIDB4MGQ3ZSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY4NmEsIDB4NzgxMCwgMHgyMDY4LCAweDY4NjAsIDB4MjBhMiwgMHg2ODVjLCAweDIwYTIsCisJMHg2ODgwLCAweDIwYTIsIDB4Njg3YywgMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwYywgMHgxMDc4LCAweDZjMmQsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsCisJMHgwZDdmLCAweDAwN2MsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLCAweDAwNDAsIDB4Njg4OCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDY4OTcsCisJMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNTAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDIwYTMsCisJMHgwODg5LCAweDIwYTMsIDB4MDAwMCwgMHgxMDc4LCAweDZjMWMsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsCisJMHgwMDdjLCAweDBkN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4NzgxMCwgMHhhMDZkLCAweDEwNzgsCisJMHg0ODhmLCAweDAwNDAsIDB4NjhiZCwgMHg2ODRjLCAweGEwODQsIDB4MjAyMCwgMHhhMDg2LCAweDIwMjAsCisJMHgwMGMwLCAweDY4YmQsIDB4NzgyNCwgMHhjMGNkLCAweDc4MjYsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2YTEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDc4MTAsCisJMHhhMDg0LCAweGYwMDAsIDB4MDBjMCwgMHg2OGQ0LCAweDc4MTAsIDB4YTA4NCwgMHgwNzAwLCAweDgwMDcsCisJMHgxMDc5LCAweDY4ZGMsIDB4MDA3OCwgMHg2OGQ3LCAweGEwMDYsIDB4MTA3OSwgMHg2OGRjLCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDY4ZTYsIDB4Njk3ZSwgMHg2OTg5LCAweDY5YjMsCisJMHg2OWM3LCAweDY5ZTMsIDB4NjllZSwgMHg2OGU0LCAweDEwNzgsIDB4MTMyOCwgMHgwMTdlLCAweDAzN2UsCisJMHg2OTRjLCAweGExOGMsIDB4MDAwMywgMHgwMDQwLCAweDY4ZjEsIDB4YTE4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg2OTAwLCAweDZiNzgsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsIDB4NjhmNywgMHhjM2U1LCAweDIzYTIsCisJMHg2ODY4LCAweDIwYTIsIDB4Njg2NCwgMHgyMGEyLCAweDAzN2YsIDB4MDE3ZiwgMHgwMDc4LCAweDY5YmUsCisJMHhhMTg2LCAweDAwMDEsIDB4MTBjMCwgMHgxMzI4LCAweDZiNzgsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsCisJMHg2OTBhLCAweGMzZTUsIDB4MjNhMiwgMHg2ODY4LCAweDIwYTIsIDB4Njg2NCwgMHgyMGEyLCAweDIyYTIsCisJMHg2ODc0LCAweDIwYTIsIDB4MjJhMiwgMHg2ODdjLCAweDIwYTIsIDB4MjAwOSwgMHgwMDE4LCAweGEzODQsCisJMHgwMzAwLCAweDAwNDAsIDB4Njk3OCwgMHhkM2M0LCAweDAwNDAsIDB4NjkyMCwgMHg2ODdjLCAweGExMDgsCisJMHhkM2NjLCAweDAwNDAsIDB4NjkyNSwgMHg2ODc0LCAweGExMDgsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMGQsCisJMHhhZDgwLCAweDAwMjAsIDB4MjAxYywgMHg4MzFmLCAweDIzYTIsIDB4ODAwMCwgMHgwMGYwLCAweDY5MmEsCisJMHgxNTdmLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweGExODQsIDB4MDAwMywgMHgwMDQwLCAweDY5NzgsCisJMHgyMGExLCAweDAyMGIsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgwMDdlLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLCAweDAwNDAsIDB4Njk1OCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDY5NjcsCisJMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDAwN2YsCisJMHg3YjI0LCAweGQzY2MsIDB4MDA0MCwgMHg2OTcwLCAweDIwYTMsIDB4MDg4OSwgMHgwMDc4LCAweDY5NzIsCisJMHgyMGEzLCAweDA4OTgsIDB4MjBhMiwgMHgxMDc4LCAweDZjMWMsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MWMyLCAweDAzN2YsIDB4MDE3ZiwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMDExLCAweDAwMDgsCisJMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2OTg1LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDAwNzgsCisJMHg2OWJjLCAweDIwMTEsIDB4MDMwMiwgMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2OTkwLCAweGMyZTUsCisJMHgyMmEyLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHgwMDEyLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDgsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDcwMDAsCisJMHgyMGEzLCAweDA1MDAsIDB4MjJhMiwgMHgyMGEzLCAweDAwMGEsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsCisJMHgyNTAwLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg2MGMzLCAweDAwMzIsCisJMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMDExLCAweDAwMjgsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsCisJMHg2OWJhLCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDE4LCAweDEwNzgsIDB4NmMyZCwgMHgwMDdjLCAweDIwMTEsCisJMHgwMTAwLCAweDc4MjQsIDB4ZDBjYywgMHgwMDQwLCAweDY5Y2UsIDB4YzJlNSwgMHgyMmEyLCAweGEwMTYsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHgwMDA4LCAweDIyYTIsCisJMHg3ODM0LCAweGEwODQsIDB4MDBmZiwgMHgyMGEyLCAweDIyYTIsIDB4MjJhMiwgMHg2MGMzLCAweDAwMjAsCisJMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMDExLCAweDAwMDgsIDB4NzgyNCwgMHhkMGNjLCAweDAwNDAsCisJMHg2OWVhLCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDAwNzgsIDB4NjliYywgMHgwMzdlLCAweDdiMTAsCisJMHhhMzg0LCAweGZmMDAsIDB4NzgxMiwgMHhhMzg0LCAweDAwZmYsIDB4ODAwMSwgMHgwMGMwLCAweDZhMDEsCisJMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2OWZkLCAweGMyZTUsIDB4MjJhMiwgMHgwMzdmLCAweDAwNzgsCisJMHg2OWJjLCAweDA0N2UsIDB4MjAyMSwgMHgwODAwLCAweDAwN2UsIDB4NzgyNCwgMHhkMGNjLCAweDAwN2YsCisJMHgwMDQwLCAweDZhMGIsIDB4YzRlNSwgMHgyNGEyLCAweDA0N2YsIDB4MjJhMiwgMHgyMGEyLCAweDAzN2YsCisJMHgwMDc4LCAweDY5YmUsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLCAweDAwNDAsIDB4NmEzMCwgMHgwZDdlLCAweGEwZTgsCisJMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsIDB4MGQ3ZiwgMHgwMDc4LCAweDZhM2YsCisJMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsIDB4NjIzMCwgMHgyMmEyLCAweDc4MjQsCisJMHhkMGNjLCAweDAwNDAsIDB4NmE0NywgMHgyMGEzLCAweDA4ODksIDB4MDA3OCwgMHg2YTQ5LCAweDIwYTMsCisJMHgwODk4LCAweDIwYTMsIDB4MDAwMCwgMHgxMDc4LCAweDZjMWMsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAyN2YsCisJMHgwMDdjLCAweDBkN2UsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MDE3ZSwgMHgwMzdlLCAweDc4MTAsCisJMHhhMDg0LCAweDA3MDAsIDB4ODAwNywgMHgxMDc5LCAweDZhNmMsIDB4MDM3ZiwgMHgwMTdmLCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDZhNzQsIDB4NmE3NCwgMHg2YTc2LCAweDZhNzQsCisJMHg2YTc0LCAweDZhNzQsIDB4NmE5YiwgMHg2YTc0LCAweDEwNzgsIDB4MTMyOCwgMHg3OTEwLCAweGExOGMsCisJMHhmOGZmLCAweGExOGQsIDB4MDYwMCwgMHg3OTEyLCAweDIwYTEsIDB4MDIwYiwgMHgyMDA5LCAweDAwMDMsCisJMHgxMDc4LCAweDZhYTUsIDB4MGQ3ZSwgMHgyMDY5LCAweGEzNTEsIDB4NjgwNCwgMHhkMGJjLCAweDAwNDAsCisJMHg2YTkwLCAweDY4MmMsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4MjBhMiwgMHgwMDc4LCAweDZhOTIsCisJMHgyMGEzLCAweDNmMDAsIDB4MGQ3ZiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg2MGMzLCAweDAwMDEsCisJMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgyMGExLCAweDAyMGIsIDB4MjAwOSwgMHgwMDAzLCAweDEwNzgsCisJMHg2YWE1LCAweDIwYTMsIDB4N2YwMCwgMHgwMDc4LCAweDZhOTMsIDB4MDI3ZSwgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhkMGJjLCAweDAwNDAsCisJMHg2YWMzLCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDAxMDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsCisJMHgwZDdmLCAweDAwNzgsIDB4NmFkMiwgMHgwZDdlLCAweGEwZTgsIDB4YTQzNCwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDAxMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MGQ3ZiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MjMwLCAweDIyYTIsIDB4MjBhMywgMHgwODg4LCAweGExOGQsIDB4MDAwOCwgMHgyMWEyLCAweDEwNzgsCisJMHg2YzFjLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHgyZmEyLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMjdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsCisJMHgwNTdlLCAweDA0N2UsIDB4MDM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhMzAwLCAweDYxMzAsCisJMHg3ODE4LCAweDIwNjgsIDB4NjhhMCwgMHgyMDI4LCAweGQwYmMsIDB4MDBjMCwgMHg2YWZjLCAweDY5MTAsCisJMHg2YTE0LCAweDY0MzAsIDB4MDA3OCwgMHg2YjAwLCAweDY5MTAsIDB4NmExNCwgMHg3MzY4LCAweDc0NmMsCisJMHg3ODFjLCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLCAweDZiNWYsIDB4ZDViYywgMHgwMDQwLCAweDZiMTAsCisJMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHgwMDc4LCAweDZiMTcsCisJMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYwNmIsIDB4MDAwMCwgMHg2NDZlLCAweDYwNzMsCisJMHgwODA5LCAweDYwNzcsIDB4MDAwOCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsCisJMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsIDB4NjA4MiwgMHg3ODA4LCAweDYwODYsCisJMHg3ODEwLCAweDIwNzAsIDB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsCisJMHg3MDA4LCAweDYwY2EsIDB4Njg2YywgMHg2MGNlLCAweDYwYWIsIDB4MDAzNiwgMHg2MGFmLCAweDk1ZDUsCisJMHg2MGQ3LCAweDAwMDAsIDB4YTU4MiwgMHgwMDgwLCAweDAwNDgsIDB4NmI0OSwgMHg2YTAwLCAweGQyZjQsCisJMHgwMDQwLCAweDZiNDcsIDB4NmExNCwgMHhhMjk0LCAweDAwZmYsIDB4MDA3OCwgMHg2YjQ5LCAweDIwMTEsCisJMHgwMDAwLCAweDYyOWUsIDB4NjAxNywgMHgwMDE2LCAweDIwMDksIDB4MDdkMCwgMHg2MGM0LCAweGEwODQsCisJMHhmZmYwLCAweGEwMDUsIDB4MDA0MCwgMHg2YjU2LCAweDIwMDksIDB4MWI1OCwgMHgxMDc4LCAweDU5NWYsCisJMHgwMzdmLCAweDA0N2YsIDB4MDU3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDc4MTAsCisJMHgyMDcwLCAweDcwNGMsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDZiYjcsCisJMHhkNWJjLCAweDAwNDAsIDB4NmI3MywgMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsCisJMHg2NDZlLCAweDAwNzgsIDB4NmI3YSwgMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYwNmIsCisJMHgwMDAwLCAweDY0NmUsIDB4NjA3MywgMHgwODgwLCAweDYwNzcsIDB4MDAwOCwgMHg2ODhjLCAweDgwMDAsCisJMHhhMDg0LCAweDAwZmYsIDB4Njg4ZSwgMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsCisJMHg2MDg2LCAweDc4MDgsIDB4NjA4MiwgMHg3MDYwLCAweDYwOGEsIDB4NzA1YywgMHg2MDhlLCAweDcwODAsCisJMHg2MGM2LCAweDcwN2MsIDB4NjBjYSwgMHg3MDdjLCAweDc5MmMsIDB4YTEwOCwgMHg3OTJlLCAweDcwODAsCisJMHg3OTI4LCAweGExMDksIDB4NzkyYSwgMHg2ODZjLCAweDYwY2UsIDB4NjBhYiwgMHgwMDM2LCAweDYwYWYsCisJMHg5NWQ1LCAweDYwZDcsIDB4MDAwMCwgMHhhNTgyLCAweDAwODAsIDB4MDA0OCwgMHg2YmIyLCAweDZhMDAsCisJMHhkMmY0LCAweDAwNDAsIDB4NmJiMCwgMHg2YTE0LCAweGEyOTQsIDB4MDBmZiwgMHgwMDc4LCAweDZiYjIsCisJMHgyMDExLCAweDAwMDAsIDB4NjI5ZSwgMHg2MDE3LCAweDAwMTIsIDB4MDA3OCwgMHg2YjRjLCAweGQ1YmMsCisJMHgwMDQwLCAweDZiYzIsIDB4YTE4NSwgMHgwNzAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MzZhLCAweDY0NmUsCisJMHgwMDc4LCAweDZiYzksIDB4YTE4NSwgMHgwNzAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsCisJMHg2NDZlLCAweDEwNzgsIDB4NDg4ZiwgMHgwMDQwLCAweDZiZGYsIDB4MGQ3ZSwgMHg3ODEwLCAweGEwNmQsCisJMHg2ODRjLCAweDBkN2YsIDB4YTA4NCwgMHgyMDIwLCAweGEwODYsIDB4MjAyMCwgMHgwMGMwLCAweDZiZGYsCisJMHg3ODI0LCAweGMwY2QsIDB4NzgyNiwgMHg2MDczLCAweDA4ODksIDB4MDA3OCwgMHg2YmUxLCAweDYwNzMsCisJMHgwODk4LCAweDYwNzcsIDB4MDAwMCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsCisJMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsIDB4NjA4NiwgMHg3ODA4LCAweDYwODIsCisJMHg3MDE0LCAweDYwOGEsIDB4NzAxMCwgMHg2MDhlLCAweDcwMGMsIDB4NjBjNiwgMHg3MDA4LCAweDYwY2EsCisJMHg2ODZjLCAweDYwY2UsIDB4NjBhYiwgMHgwMDM2LCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsCisJMHhhNTgyLCAweDAwODAsIDB4MDA0OCwgMHg2YzBmLCAweDZhMDAsIDB4ZDJmNCwgMHgwMDQwLCAweDZjMGQsCisJMHg2YTE0LCAweGEyOTQsIDB4MDBmZiwgMHgwMDc4LCAweDZjMGYsIDB4MjAxMSwgMHgwMDAwLCAweDYyOWUsCisJMHg3ODI0LCAweGQwY2MsIDB4MDA0MCwgMHg2YzE4LCAweDYwMTcsIDB4MDAxNiwgMHgwMDc4LCAweDZiNGMsCisJMHg2MDE3LCAweDAwMTIsIDB4MDA3OCwgMHg2YjRjLCAweDdhMTgsIDB4YTI4MCwgMHgwMDIzLCAweDIwMTQsCisJMHg4MjEwLCAweGEyOTQsIDB4MDBmZiwgMHgyMjAyLCAweDgyMTcsIDB4MDA3YywgMHgwZDdlLCAweDIwNjksCisJMHhhNWFiLCAweDY4NDMsIDB4MDAwMSwgMHgwZDdmLCAweDAwN2MsIDB4MjBlMSwgMHg5MDgwLCAweDYwYTMsCisJMHgwMDU2LCAweDYwYTcsIDB4OTU3NSwgMHgxMDc4LCAweDZjMzgsIDB4MTA3OCwgMHg1OTRmLCAweDAwN2MsCisJMHgwMDdlLCAweDYwMTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsIDB4MDAwOSwgMHg2MDE2LCAweDAwN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjAxNCwgMHhhMDg0LCAweDAwMDQsCisJMHhhMDg1LCAweDAwMDgsIDB4NjAxNiwgMHgwYzdmLCAweDAwN2YsIDB4MDA3YywgMHgwYzdlLCAweDBkN2UsCisJMHgwMTdlLCAweDAyN2UsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksIDB4MDE0MCwgMHg2OTA0LCAweGExOTQsCisJMHg0MDAwLCAweDAwNDAsIDB4NmM4OSwgMHgxMDc4LCAweDZjNDEsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsCisJMHgwMDAwLCAweDBjN2UsIDB4MjA2MSwgMHhhNWFiLCAweDYxMjgsIDB4YTE5MiwgMHgwMGM4LCAweDAwYzgsCisJMHg2Yzc2LCAweDgxMDgsIDB4NjEyYSwgMHg2MTI0LCAweDBjN2YsIDB4ODFmZiwgMHgwMDQwLCAweDZjODQsCisJMHgxMDc4LCAweDU5NGYsIDB4MTA3OCwgMHg2YzM4LCAweDAwNzgsIDB4NmM4NCwgMHg2MTI0LCAweGExZTUsCisJMHgwMDAwLCAweDAwNDAsIDB4NmM4MSwgMHgxMDc4LCAweGEyNDEsIDB4MjAwOSwgMHgwMDE0LCAweDEwNzgsCisJMHg3NTZjLCAweDBjN2YsIDB4MDA3OCwgMHg2Yzg0LCAweDAyN2YsIDB4MDE3ZiwgMHgwZDdmLCAweDBjN2YsCisJMHgwMDdjLCAweDIwMDEsIDB4YTVjNywgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg2Yzg0LCAweDBjN2UsCisJMHgyMDYxLCAweGE1YWIsIDB4NjEyOCwgMHhhMTkyLCAweDAwMDMsIDB4MDBjOCwgMHg2Yzc2LCAweDgxMDgsCisJMHg2MTJhLCAweDBjN2YsIDB4MTA3OCwgMHg1OTRmLCAweDEwNzgsIDB4NDE3MSwgMHgwMDc4LCAweDZjODQsCisJMHgwYzdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwMTdlLCAweDAyN2UsIDB4MTA3OCwgMHg1OTY3LCAweDIwNzEsCisJMHhhNWFiLCAweDcxM2MsIDB4ODFmZiwgMHgwMDQwLCAweDZjY2EsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDY5MDQsIDB4YTE5NCwgMHg0MDAwLCAweDAwNDAsIDB4NmNkMCwgMHg2ODAzLCAweDEwMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMDEsIDB4MTA3OCwgMHg2ZTZjLCAweDAzN2YsCisJMHg3MTNjLCAweDIxNjAsIDB4MTA3OCwgMHhhMjQxLCAweDIwMDksIDB4MDA0YSwgMHgxMDc4LCAweDc1NmMsCisJMHgwMDc4LCAweDZjY2EsIDB4MDI3ZiwgMHgwMTdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHgwMDc4LCAweDZjYmEsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsIDB4MDY3ZSwgMHgwNTdlLCAweDA0N2UsCisJMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDYwMTgsIDB4MjA2OCwgMHg2Y2EwLCAweDIwNzEsCisJMHhhNWFiLCAweDcwMTgsIDB4MjA2OCwgMHg4ZGZmLCAweDAwNDAsIDB4NmNmYywgMHg2OGEwLCAweGE0MDYsCisJMHgwMDQwLCAweDZjZWUsIDB4Njg1NCwgMHgyMDY4LCAweDAwNzgsIDB4NmNlMywgMHg2MDEwLCAweDIwNjAsCisJMHg2NDNjLCAweDY1NDAsIDB4NmU0OCwgMHgyZDYwLCAweDEwNzgsIDB4NDY2YSwgMHgwMDQwLCAweDZjZmMsCisJMHgxMDc4LCAweDcwNDUsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MDA3ZiwgMHgwNDdmLCAweDA1N2YsCisJMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NTY3LCAweDIwYTMsIDB4MTIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MWMsCisJMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg2ZDE3LCAweDYwOTgsIDB4MDA3OCwgMHg2ZDE4LCAweDYwMzAsCisJMHgyMGEyLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsCisJMHgyMGEyLCAweDAwZjAsIDB4NmQyMCwgMHgyMGEyLCAweDIwYTIsIDB4NjBjMywgMHgwMDJjLCAweDEwNzgsCisJMHg2YzJkLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1NjcsCisJMHgyMGEzLCAweDBmMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LCAweDIwYTIsCisJMHg2MGMzLCAweDAwMDgsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsIDB4MTU3ZiwgMHgwMDdjLCAweDE1N2UsCisJMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsIDB4MjBhMywgMHgwMjAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweGEzNDAsIDB4MjAxOSwgMHhhMzQxLCAweDIzYTYsCisJMHgyMmE2LCAweGEzOTgsIDB4MDAwMiwgMHhhMjkwLCAweDAwMDIsIDB4MDBmMCwgMHg2ZDRmLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsCisJMHgxNTdmLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDAxN2UsIDB4MDI3ZSwgMHgyMGExLCAweDAyMGIsCisJMHgxMDc4LCAweDY1Y2YsIDB4MTA3OCwgMHg2NWU2LCAweDc4MTAsIDB4YTA4MCwgMHgwMDAwLCAweDIwMDQsCisJMHhhMDgwLCAweDAwMTUsIDB4MjA5OCwgMHg3ODA4LCAweGEwODgsIDB4MDAwMiwgMHgyMWE4LCAweDUzYTYsCisJMHhhMDgwLCAweDAwMDQsIDB4ODAwMywgMHg2MGMyLCAweDEwNzgsIDB4NmMyZCwgMHgwMjdmLCAweDAxN2YsCisJMHgxNDdmLCAweDE1N2YsIDB4MDA3YywgMHgxNTdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NTY3LCAweDIwYTMsIDB4NjIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MDgsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZjMmQsIDB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsCisJMHgxNTdlLCAweDE0N2UsIDB4MDE3ZSwgMHgwMjdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1NjcsCisJMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LCAweGEwODAsIDB4MDAxNywgMHgyMDk4LCAweDc4MDgsCisJMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LCAweDgwMDMsIDB4NjBjMiwgMHgxMDc4LCAweDZjMmQsCisJMHgwMjdmLCAweDAxN2YsIDB4MTQ3ZiwgMHgxNTdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwYzdlLCAweDAwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE1YWIsIDB4NzAwYywgMHgyMDYwLCAweDhjZmYsCisJMHgwMDQwLCAweDZkZDEsIDB4MTA3OCwgMHg4YzNiLCAweDAwYzAsIDB4NmRjOCwgMHgxMDc4LCAweDdhMDUsCisJMHg2MDBjLCAweDAwN2UsIDB4MTA3OCwgMHg3NTNkLCAweDEwNzgsIDB4NzA0NSwgMHgwYzdmLCAweDAwNzgsCisJMHg2ZGJmLCAweDcwMGYsIDB4MDAwMCwgMHg3MDBiLCAweDAwMDAsIDB4MTI3ZiwgMHgwMDdmLCAweDBjN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MTI3ZSwgMHgxNTdlLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsCisJMHgwMjdlLCAweDAxN2UsIDB4MDA3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDIwNzksCisJMHgwMTQwLCAweDIwNzEsIDB4YTVhYiwgMHg3MDI0LCAweDIwNjAsIDB4OGNmZiwgMHgwMDQwLCAweDZlMmEsCisJMHgxMDc4LCAweDZjNDEsIDB4NjhjMywgMHgwMDAwLCAweDEwNzgsIDB4NTk1YSwgMHgyMDA5LCAweDAwMTMsCisJMHgxMDc4LCAweDc1NmMsIDB4MjBhOSwgMHgwMWY0LCAweDY4MjQsIDB4ZDA5NCwgMHgwMDQwLCAweDZlMGQsCisJMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHg2ZTFmLCAweDc4MDMsCisJMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDZlMWYsIDB4ZDA4NCwgMHgwMDQwLCAweDZlMTQsCisJMHg2ODI3LCAweDAwMDEsIDB4MDA3OCwgMHg2ZTE2LCAweDAwZjAsIDB4NmRmYywgMHg3ODA0LCAweGEwODQsCisJMHgxMDAwLCAweDAwNDAsIDB4NmUxZiwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDY4MjQsCisJMHgwMDdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDE1N2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MjAwMSwgMHhhMzAwLCAweDIwMDQsIDB4YTA5NiwgMHgwMDAxLCAweDAwNDAsCisJMHg2ZTYyLCAweGEwOTYsIDB4MDAwNCwgMHgwMDQwLCAweDZlNjIsIDB4NjgxNywgMHgwMDA4LCAweDY4YzMsCisJMHgwMDAwLCAweDIwMTEsIDB4NDEyOSwgMHgxMDc4LCAweDU4ZDQsIDB4MjBhOSwgMHgwMWY0LCAweDY4MjQsCisJMHhkMDk0LCAweDAwNDAsIDB4NmU1MCwgMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDZlNjIsIDB4NzgwMywgMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDZlNjIsCisJMHhkMDg0LCAweDAwNDAsIDB4NmU1NywgMHg2ODI3LCAweDAwMDEsIDB4MDA3OCwgMHg2ZTU5LCAweDAwZjAsCisJMHg2ZTNmLCAweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAwNDAsIDB4NmU2MiwgMHg3ODAzLCAweDAxMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDA3ZiwgMHgwMTdmLCAweDAyN2YsIDB4MGM3ZiwgMHgwZDdmLCAweDBlN2YsCisJMHgwZjdmLCAweDE1N2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MTU3ZSwgMHgwZjdlLCAweDBlN2UsCisJMHgwZDdlLCAweDBjN2UsIDB4MDI3ZSwgMHgwMTdlLCAweDAwN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksCisJMHgwMTAwLCAweDIwNzksIDB4MDE0MCwgMHgyMDcxLCAweGE1YWIsIDB4NzAzYywgMHgyMDYwLCAweDhjZmYsCisJMHgwMDQwLCAweDZlZTgsIDB4NjgxNywgMHgwMDEwLCAweDIwMDksIDB4MDBmYSwgMHg4MTA5LCAweDAwYzAsCisJMHg2ZTg2LCAweDY4YzcsIDB4MDAwMCwgMHg2OGNiLCAweDAwMDgsIDB4MTA3OCwgMHg1OTY3LCAweDEwNzgsCisJMHgxZjMxLCAweDA0N2UsIDB4MDU3ZSwgMHgyMDA5LCAweDAxN2YsIDB4MjEyYywgMHgyMDBiLCAweDAwYTUsCisJMHgyMDIxLCAweDAxNjksIDB4MjQwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsCisJMHg2ZWI3LCAweDY4YzcsIDB4MDAwMCwgMHg2OGNiLCAweDAwMDgsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzksCisJMHgwMDIwLCAweDIwNzEsIDB4YTYwMiwgMHg2ODE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMTIsCisJMHg2ODE2LCAweDc4MDMsIDB4MDAwOCwgMHg3MDAzLCAweDAwMDAsIDB4MGY3ZiwgMHgwZTdmLCAweDI1MGEsCisJMHgwNTdmLCAweDA0N2YsIDB4YTM5ZCwgMHgwMDAwLCAweDAwYzAsIDB4NmVjMiwgMHgyMDA5LCAweDAwNDksCisJMHgxMDc4LCAweDc1NmMsIDB4MjBhOSwgMHgwM2U4LCAweDY4MjQsIDB4ZDA5NCwgMHgwMDQwLCAweDZlZDUsCisJMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHg2ZWU3LCAweDc4MDMsCisJMHgxMDAwLCAweDc4MDMsIDB4MDAwMCwgMHgwMDc4LCAweDZlZTcsIDB4ZDA4YywgMHgwMDQwLCAweDZlZGMsCisJMHg2ODI3LCAweDAwMDIsIDB4MDA3OCwgMHg2ZWRlLCAweDAwZjAsIDB4NmVjNCwgMHg3ODA0LCAweGEwODQsCisJMHgxMDAwLCAweDAwNDAsIDB4NmVlNywgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDY4MjQsCisJMHgwMDdmLCAweDAxN2YsIDB4MDI3ZiwgMHgwYzdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDE1N2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweGE1YWIsCisJMHg2YTA2LCAweDEyN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDY5LCAweGE1YWIsIDB4NmEzMiwgMHgxMjdmLCAweDBkN2YsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsCisJMHgwYzdlLCAweDA2N2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwNzEsIDB4YTVhYiwgMHg3NjE0LCAweDI2NjAsCisJMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLCAweDAwNDAsIDB4NmY0NiwgMHg2MDFjLCAweGEyMDYsCisJMHgwMGMwLCAweDZmNDEsIDB4NzAxNCwgMHhhYzM2LCAweDAwYzAsIDB4NmYyMCwgMHg2NjBjLCAweDc2MTYsCisJMHg3MDEwLCAweGFjMzYsIDB4MDBjMCwgMHg2ZjJlLCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDZmMmMsCisJMHgyZjAwLCAweDcwMTIsIDB4MDA3OCwgMHg2ZjJlLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLCAweDA2N2UsCisJMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg2ZjM3LCAweDdlMGUsIDB4MDA3OCwgMHg2ZjM4LCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsIDB4NzA0NSwgMHgwYzdmLCAweDAwNzgsCisJMHg2ZjEzLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsIDB4NmYxMywgMHgxMjdmLCAweDAwN2YsCisJMHgwNjdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MTU3ZSwgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NjgwNiwgMHg3ODEwLCAweDIwYTIsIDB4YTAwNiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgxMDAwLCAweDAwNzgsIDB4NmZhMCwgMHgxNTdlLCAweDE0N2UsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2ODA2LCAweDc4MTAsIDB4MjBhMiwgMHhhMDA2LCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDQwMDAsIDB4MDA3OCwgMHg2ZmEwLCAweDE1N2UsCisJMHgxNDdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY4MDYsIDB4NzgxMCwgMHgyMGEyLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTMsIDB4MjAwMCwgMHgwMDc4LCAweDZmYTAsCisJMHgxNTdlLCAweDE0N2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjgwNiwgMHg3ODEwLCAweDIwYTIsCisJMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgwNDAwLCAweDAwNzgsCisJMHg2ZmEwLCAweDE1N2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2ODA2LCAweDc4MTAsCisJMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDAyMDAsCisJMHgxMDc4LCAweDcwNTAsIDB4NjBjMywgMHgwMDIwLCAweDEwNzgsIDB4NmMyZCwgMHgxNDdmLCAweDE1N2YsCisJMHgwMDdjLCAweDEyN2UsIDB4MGM3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MjA2MSwgMHgwMTAwLCAweDYxMjAsCisJMHhkMWI0LCAweDAwYzAsIDB4NmZiOCwgMHhkMWJjLCAweDAwYzAsIDB4NzAwMiwgMHgwMDc4LCAweDcwNDIsCisJMHgyMDA5LCAweDAxN2YsIDB4MjAwYiwgMHgwMGExLCAweDE1N2UsIDB4MDA3ZSwgMHgwZDdlLCAweDIwNjksCisJMHgwMTQwLCAweDIwYTksIDB4MDAxZSwgMHgyMDA5LCAweDAxNjksIDB4NjgwNCwgMHhhMDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDZmZjksIDB4NjAyMCwgMHhkMGI0LCAweDAwNDAsIDB4NmZmOSwgMHg2MDI0LCAweGQwOTQsCisJMHgwMGMwLCAweDZmZjksIDB4MjEwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsCisJMHg2ZmY5LCAweDAwZjAsIDB4NmZjNSwgMHgwMjdlLCAweDYxOTgsIDB4YTE4YywgMHgwMGZmLCAweDgxMDcsCisJMHg2MTMwLCAweGExOGMsIDB4MDBmZiwgMHhhMTBkLCAweDYwODgsIDB4NjI4YywgMHg2MThlLCAweDYwOGIsCisJMHhiYzkxLCAweDYwNDMsIDB4MDAwMSwgMHg2MDQzLCAweDAwMDAsIDB4NjA4YSwgMHg2MjhlLCAweDYwMjQsCisJMHhkMDk0LCAweDAwYzAsIDB4NmZmOCwgMHg2YTA0LCAweGEyOTQsIDB4NDAwMCwgMHgwMGMwLCAweDZmZWYsCisJMHgwMjdmLCAweDBkN2YsIDB4MDA3ZiwgMHgxNTdmLCAweDIwMDksIDB4MDE3ZiwgMHgyMDBiLCAweDAwMDAsCisJMHgwMDc4LCAweDcwNDIsIDB4MjAwOSwgMHgwMTdmLCAweDIwMGIsIDB4MDBhMSwgMHgxNTdlLCAweDAwN2UsCisJMHgwZDdlLCAweDIwNjksIDB4MDE0MCwgMHgyMGE5LCAweDAwMWUsIDB4MjAwOSwgMHgwMTY5LCAweDY4MDQsCisJMHhhMDg0LCAweDQwMDAsIDB4MDA0MCwgMHg3MDNiLCAweDYwMjAsIDB4ZDBiYywgMHgwMDQwLCAweDcwM2IsCisJMHgyMTA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg3MDNiLCAweDAwZjAsCisJMHg3MDBmLCAweDAyN2UsIDB4NjE2NCwgMHhhMThjLCAweDAwZmYsIDB4ODEwNywgMHg2MTMwLCAweGExOGMsCisJMHgwMGZmLCAweGExMGQsIDB4NjA4OCwgMHg2MjhjLCAweDYwOGIsIDB4YmM5MSwgMHg2MThlLCAweDYwNDMsCisJMHgwMDAxLCAweDYwNDMsIDB4MDAwMCwgMHg2MDhhLCAweDYyOGUsIDB4NmEwNCwgMHhhMjk0LCAweDQwMDAsCisJMHgwMGMwLCAweDcwMzUsIDB4MDI3ZiwgMHgwZDdmLCAweDAwN2YsIDB4MTU3ZiwgMHgyMDA5LCAweDAxN2YsCisJMHgyMDBiLCAweDAwMDAsIDB4MGM3ZiwgMHgxMjdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE1YWIsCisJMHg3MDIwLCAweGEwMDUsIDB4MDA0MCwgMHg3MDRlLCAweDgwMDEsIDB4NzAyMiwgMHgwZTdmLCAweDAwN2MsCisJMHgyMGE5LCAweDAwMDgsIDB4MjBhMiwgMHgwMGYwLCAweDcwNTIsIDB4MjBhMiwgMHgyMGEyLCAweDAwN2MsCisJMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA3N2UsIDB4MDY3ZSwgMHgwMDdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhNWFiLCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDIwMzksCisJMHgwMDAxLCAweDg3ZmYsIDB4MDA0MCwgMHg3MGY0LCAweDhjZmYsIDB4MDA0MCwgMHg3MGY0LCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg3MGVmLCAweDg4ZmYsIDB4MDA0MCwgMHg3MDdmLCAweDI4MDAsCisJMHhhYzA2LCAweDAwYzAsIDB4NzBlZiwgMHgyMDM5LCAweDAwMDAsIDB4MDA3OCwgMHg3MDhhLCAweDYwMTgsCisJMHhhMjA2LCAweDAwYzAsIDB4NzBlZiwgMHg4NWZmLCAweDAwNDAsIDB4NzA4YSwgMHg2MDIwLCAweGExMDYsCisJMHgwMGMwLCAweDcwZWYsIDB4NzAyNCwgMHhhYzA2LCAweDAwYzAsIDB4NzBiYSwgMHgyMDY5LCAweDAxMDAsCisJMHg2OGMwLCAweGEwMDUsIDB4MDA0MCwgMHg3MGI1LCAweDEwNzgsIDB4NTk1YSwgMHg2ODE3LCAweDAwMDgsCisJMHg2OGMzLCAweDAwMDAsIDB4MTA3OCwgMHg3MTg4LCAweDcwMjcsIDB4MDAwMCwgMHgwMzdlLCAweDIwNjksCisJMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAwNDAsIDB4NzBhYSwgMHg2ODAzLCAweDAxMDAsCisJMHg2ODAzLCAweDAwMDAsIDB4MjA2OSwgMHgwMTAwLCAweDY4MjQsIDB4ZDA4NCwgMHgwMDQwLCAweDcwYjIsCisJMHg2ODI3LCAweDAwMDEsIDB4MDM3ZiwgMHgwMDc4LCAweDcwYmEsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsCisJMHgwMDc4LCAweDcwZWYsIDB4NzAxNCwgMHhhYzM2LCAweDAwYzAsIDB4NzBjMCwgMHg2NjBjLCAweDc2MTYsCisJMHg3MDEwLCAweGFjMzYsIDB4MDBjMCwgMHg3MGNlLCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDcwY2MsCisJMHgyZjAwLCAweDcwMTIsIDB4MDA3OCwgMHg3MGNlLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLCAweDA2N2UsCisJMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg3MGQ3LCAweDdlMGUsIDB4MDA3OCwgMHg3MGQ4LCAweDI2NzgsCisJMHg4OWZmLCAweDAwYzAsIDB4NzBlNywgMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4NzBlNSwgMHgxMDc4LCAweDllNzAsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg3MDQ1LCAweDg4ZmYsIDB4MDBjMCwgMHg3MGZlLCAweDBjN2YsIDB4MDA3OCwgMHg3MDY5LCAweDJjNzgsCisJMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg3MDY5LCAweGEwMDYsIDB4MTI3ZiwgMHgwMDdmLCAweDA2N2YsCisJMHgwNzdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHg2MDE3LCAweDAwMDAsCisJMHgwYzdmLCAweGE4YzUsIDB4MDAwMSwgMHgwMDc4LCAweDcwZjUsIDB4MGY3ZSwgMHgwZTdlLCAweDBkN2UsCisJMHgwYzdlLCAweDA2N2UsIDB4MDI3ZSwgMHgwMDdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHhhNWFiLCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsIDB4MDA0MCwgMHg3MTc3LCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg3MTcyLCAweDg3ZmYsIDB4MDA0MCwgMHg3MTI1LCAweDI3MDAsCisJMHhhYzA2LCAweDAwYzAsIDB4NzE3MiwgMHgwMDc4LCAweDcxMzAsIDB4NjAxOCwgMHhhMjA2LCAweDAwYzAsCisJMHg3MTcyLCAweDg1ZmYsIDB4MDA0MCwgMHg3MTMwLCAweDYwMjAsIDB4YTEwNiwgMHgwMGMwLCAweDcxNzIsCisJMHg3MDNjLCAweGFjMDYsIDB4MDBjMCwgMHg3MTQyLCAweDAzN2UsIDB4MjAxOSwgMHgwMDAxLCAweDEwNzgsCisJMHg2ZTZjLCAweDcwMzMsIDB4MDAwMCwgMHg3MDNmLCAweDAwMDAsIDB4NzA0MywgMHgwMDAwLCAweDcwNDcsCisJMHgwMDAwLCAweDAzN2YsIDB4NzAzOCwgMHhhYzM2LCAweDAwYzAsIDB4NzE0OCwgMHg2NjBjLCAweDc2M2EsCisJMHg3MDM0LCAweGFjMzYsIDB4MDBjMCwgMHg3MTU2LCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDcxNTQsCisJMHgyZjAwLCAweDcwMzYsIDB4MDA3OCwgMHg3MTU2LCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDA2N2UsCisJMHgyYzAwLCAweGFmMDYsIDB4MDA0MCwgMHg3MTVmLCAweDdlMGUsIDB4MDA3OCwgMHg3MTYwLCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDcxNmEsCisJMHgxMDc4LCAweDllNzAsIDB4MTA3OCwgMHg4YzAxLCAweDg3ZmYsIDB4MDBjMCwgMHg3MTgxLCAweDBjN2YsCisJMHgwMDc4LCAweDcxMTQsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsIDB4MDA3OCwgMHg3MTE0LCAweGEwMDYsCisJMHgxMjdmLCAweDAwN2YsIDB4MDI3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwMDdjLCAweDYwMTcsIDB4MDAwMCwgMHgwYzdmLCAweGE3YmQsIDB4MDAwMSwgMHgwMDc4LCAweDcxNzgsCisJMHgwZTdlLCAweDIwNzEsIDB4YTVhYiwgMHgyMDAxLCAweGEzMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDIsCisJMHgwMGMwLCAweDcxOTYsIDB4NzAwNywgMHgwMDA1LCAweDAwNzgsIDB4NzE5OCwgMHg3MDA3LCAweDAwMDAsCisJMHgwZTdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLCAweDBjN2UsIDB4MDY3ZSwgMHgwMjdlLCAweDAwN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGE1YWIsIDB4MmMxMCwgMHg3NjM4LCAweDI2NjAsCisJMHgyNjc4LCAweDhjZmYsIDB4MDA0MCwgMHg3MWQ4LCAweDIyMDAsIDB4YWMwNiwgMHgwMGMwLCAweDcxZDMsCisJMHg3MDM4LCAweGFjMzYsIDB4MDBjMCwgMHg3MWI2LCAweDY2MGMsIDB4NzYzYSwgMHg3MDM0LCAweGFjMzYsCisJMHgwMGMwLCAweDcxYzQsIDB4MmMwMCwgMHhhZjM2LCAweDAwNDAsIDB4NzFjMiwgMHgyZjAwLCAweDcwMzYsCisJMHgwMDc4LCAweDcxYzQsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsCisJMHg3MWNjLCAweDdlMGUsIDB4MDA3OCwgMHg3MWNkLCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4NzFkOCwgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwMDc4LCAweDcxYTksCisJMHgxMjdmLCAweDAwN2YsIDB4MDI3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsCisJMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDA2N2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4YTVhYiwgMHg3NjBjLCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDAwNDAsCisJMHg3Mjc5LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgwMGMwLCAweDcyNzQsCisJMHg3MDI0LCAweGFjMDYsIDB4MDBjMCwgMHg3MjFmLCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsCisJMHgwMDQwLCAweDcyNGQsIDB4MTA3OCwgMHg2YzQxLCAweDY4YzMsIDB4MDAwMCwgMHgxMDc4LCAweDcxODgsCisJMHg3MDI3LCAweDAwMDAsIDB4MDM3ZSwgMHgyMDY5LCAweDAxNDAsIDB4NmIwNCwgMHhhMzg0LCAweDEwMDAsCisJMHgwMDQwLCAweDcyMTYsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsCisJMHg2ODI0LCAweGQwODQsIDB4MDA0MCwgMHg3MjFlLCAweDY4MjcsIDB4MDAwMSwgMHgwMzdmLCAweDcwMGMsCisJMHhhYzM2LCAweDAwYzAsIDB4NzIyNSwgMHg2NjBjLCAweDc2MGUsIDB4NzAwOCwgMHhhYzM2LCAweDAwYzAsCisJMHg3MjMzLCAweDJjMDAsIDB4YWYzNiwgMHgwMDQwLCAweDcyMzEsIDB4MmYwMCwgMHg3MDBhLCAweDAwNzgsCisJMHg3MjMzLCAweDcwMGIsIDB4MDAwMCwgMHg2NjBjLCAweDA2N2UsIDB4MmMwMCwgMHhhZjA2LCAweDAwNDAsCisJMHg3MjNjLCAweDdlMGUsIDB4MDA3OCwgMHg3MjNkLCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDEwNzgsCisJMHg4YzI3LCAweDAwYzAsIDB4NzI1MSwgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg4YzNiLCAweDAwYzAsCisJMHg3MjZkLCAweDEwNzgsIDB4N2EwNSwgMHgwMDc4LCAweDcyNmQsIDB4MTA3OCwgMHg3MTg4LCAweDAwNzgsCisJMHg3MjFmLCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDcyNTksIDB4MTA3OCwgMHg3YTA1LCAweDAwNzgsCisJMHg3MjZkLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg3MjZkLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg3MjgxLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDhiZjQsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg3MDQ1LCAweDBjN2YsIDB4MDA3OCwgMHg3MWVlLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDAwNzgsCisJMHg3MWVlLCAweDEyN2YsIDB4MDA3ZiwgMHgwNjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwMDdjLCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDAwYzAsIDB4NzI2ZCwgMHgxMDc4LCAweDllNzAsCisJMHgwMDc4LCAweDcyNmQsIDB4MDM3ZSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgzOTA4LCAweGEwMDYsCisJMHhhMTkwLCAweDAwMjAsIDB4MjIxYywgMHhhMzllLCAweDI2MGMsIDB4MDBjMCwgMHg3MjliLCAweDgyMTAsCisJMHg4MDAwLCAweDAwNzgsIDB4NzI5MiwgMHhhMDA1LCAweDAwNDAsIDB4NzJhNywgMHgyMGE5LCAweDAwMjAsCisJMHgyMTk4LCAweDgyMTEsIDB4YTI4MiwgMHgwMDIwLCAweDIwYzgsIDB4MjBhMCwgMHg1M2EzLCAweDE0N2YsCisJMHgxMzdmLCAweDE1N2YsIDB4MDM3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NWY4LCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLCAweDAwMTQsIDB4NjBjMywgMHgwMDE0LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDk5LCAweGE1YTMsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTYsCisJMHgyMGEzLCAweDAwMDQsIDB4MjBhMywgMHg3ODc4LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgxMDc4LCAweDZjMmQsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsCisJMHgyMGEzLCAweDAyMTQsIDB4MjBhMywgMHgwMDE4LCAweDIwYTMsIDB4MDgwMCwgMHg3ODEwLCAweGEwODQsCisJMHhmZjAwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgxMCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHg3ODI4LCAweDIwYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDAxOCwgMHgxMDc4LCAweDZjMmQsCisJMHgwMDdjLCAweDBkN2UsIDB4MDE3ZSwgMHgyZjY4LCAweDIwMDksIDB4MDAzNSwgMHgxMDc4LCAweDhlZjUsCisJMHgwMGMwLCAweDczNjEsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsIDB4NjU2NywgMHgyMGEzLCAweDEzMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHgyMDY4LCAweDY4MWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsCisJMHg3MzNkLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsIDB4YTI4NiwgMHgwMDdlLCAweDAwYzAsCisJMHg3MzE3LCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmUsIDB4MDA3OCwgMHg3MzUyLCAweGEyODYsCisJMHgwMDdmLCAweDAwYzAsIDB4NzMyMSwgMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZkLCAweDAwNzgsCisJMHg3MzUyLCAweGQyYmMsIDB4MDA0MCwgMHg3MzM3LCAweGEyODYsIDB4MDA4MCwgMHgwMGMwLCAweDczMmUsCisJMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZjLCAweDAwNzgsIDB4NzM1MiwgMHhhMmU4LCAweGE0MzQsCisJMHgyZDZjLCAweDY4MTAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDA3OCwgMHg3MzUyLCAweDIwYTMsCisJMHgwMDAwLCAweDYwOTgsIDB4MjBhMiwgMHgwMDc4LCAweDczNTIsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwODIsIDB4MDA3ZSwgMHgwMDQ4LCAweDczNGUsIDB4MGQ3ZSwgMHgyMDY5LCAweGEzMWEsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NzM1MiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MDMwLCAweDIwYTIsIDB4NzgzNCwgMHgyMGEyLCAweDc4MzgsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDBjLCAweDEwNzgsIDB4NmMyZCwgMHgwMTdmLCAweDBkN2YsCisJMHgwMDdjLCAweDc4MTcsIDB4MDAwMSwgMHg3ODAzLCAweDAwMDYsIDB4MDE3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHgwZDdlLCAweDAyN2UsIDB4NzkyOCwgMHgyMTY4LCAweDY5MWMsIDB4YTE4NiwgMHgwMDA2LCAweDAwNDAsCisJMHg3MzhhLCAweGExODYsIDB4MDAwMywgMHgwMDQwLCAweDczZTUsIDB4YTE4NiwgMHgwMDA1LCAweDAwNDAsCisJMHg3M2M4LCAweGExODYsIDB4MDAwNCwgMHgwMDQwLCAweDczYjgsIDB4YTE4NiwgMHgwMDA4LCAweDAwNDAsCisJMHg3M2QyLCAweDc4MDcsIDB4MDAzNywgMHg3ODEzLCAweDE3MDAsIDB4MTA3OCwgMHg3NDUwLCAweDAyN2YsCisJMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg3NDBkLCAweDIwMDksIDB4NDAwMCwgMHg2ODAwLCAweDAwNzksCisJMHg3MzkxLCAweDczYTQsIDB4NzNiMiwgMHg3M2E2LCAweDczYjIsIDB4NzNhZCwgMHg3M2E0LCAweDczYTQsCisJMHg3M2IyLCAweDczYjIsIDB4NzNiMiwgMHg3M2IyLCAweDczYTQsIDB4NzNhNCwgMHg3M2E0LCAweDczYTQsCisJMHg3M2E0LCAweDczYjIsIDB4NzNhNCwgMHg3M2IyLCAweDEwNzgsIDB4MTMyOCwgMHg2ODI0LCAweGQwZTQsCisJMHgwMDQwLCAweDczYWQsIDB4ZDBjYywgMHgwMDQwLCAweDczYjAsIDB4YTAwZSwgMHgwMDc4LCAweDczYjIsCisJMHgyMDA5LCAweDIwMDAsIDB4NjgyOCwgMHgyMGEyLCAweDY4MmMsIDB4MjBhMiwgMHgwMDc4LCAweDc0MDMsCisJMHgxMDc4LCAweDc0MGQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsCisJMHg2YTAwLCAweGEyODYsIDB4MDAwMiwgMHgwMGMwLCAweDczYzYsIDB4YTAwZSwgMHgwMDc4LCAweDc0MDMsCisJMHgxMDc4LCAweDc0MGQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMDA5LCAweDQwMDAsCisJMHgwMDc4LCAweDc0MDMsIDB4MTA3OCwgMHg3NDBkLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDA5LCAweDQwMDAsIDB4YTI4NiwgMHgwMDA1LCAweDAwNDAsIDB4NzNlMiwgMHhhMjg2LCAweDAwMDIsCisJMHgwMGMwLCAweDczZTMsIDB4YTAwZSwgMHgwMDc4LCAweDc0MDMsIDB4MTA3OCwgMHg3NDBkLCAweDY4MTAsCisJMHgyMDY4LCAweDY5N2MsIDB4NjgxMCwgMHhhMTEyLCAweDY5ODAsIDB4NjgxNCwgMHhhMTAzLCAweDIwYTIsCisJMHgyMmEyLCAweDc5MjgsIDB4YTE4MCwgMHgwMDAwLCAweDIwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAwNDAsCisJMHg3NDAxLCAweGEwOGUsIDB4MDAwNCwgMHgwMDQwLCAweDc0MDEsIDB4MjAwOSwgMHg0MDAwLCAweDAwNzgsCisJMHg3NDAzLCAweDIwMDksIDB4MDAwMCwgMHgyMWEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTgsCisJMHgxMDc4LCAweDZjMmQsIDB4MDI3ZiwgMHgwZDdmLCAweDAwN2MsIDB4MDM3ZSwgMHgwNDdlLCAweDA1N2UsCisJMHgwNjdlLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1ZjgsIDB4YTAwNiwgMHgyMGEzLCAweDAyMDAsCisJMHgyMGEyLCAweDc5MzQsIDB4MjFhMiwgMHg3OTM4LCAweDIxYTIsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEwOTIsIDB4MDA3ZSwgMHgwMDQ4LCAweDc0MzMsIDB4MGQ3ZSwgMHgyMDY5LCAweGEzMWEsCisJMHgyZDJjLCAweDhkNjgsIDB4MmQzNCwgMHhhMGU4LCAweGE0MzQsIDB4MmQ2YywgMHg2YjEwLCAweDZjMTQsCisJMHgwZDdmLCAweDAwNzgsIDB4NzQzOSwgMHgyMDE5LCAweDAwMDAsIDB4NjQ5OCwgMHgyMDI5LCAweDAwMDAsCisJMHg2NjMwLCAweDc4MjgsIDB4YTA4MCwgMHgwMDA3LCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsCisJMHg3NDQ3LCAweDI1YTIsIDB4MjZhMiwgMHgyM2EyLCAweDI0YTIsIDB4MDA3OCwgMHg3NDRiLCAweDIzYTIsCisJMHgyNGEyLCAweDI1YTIsIDB4MjZhMiwgMHgwNjdmLCAweDA1N2YsIDB4MDQ3ZiwgMHgwMzdmLCAweDAwN2MsCisJMHgyMGExLCAweDAyMGIsIDB4MTA3OCwgMHg2NWY4LCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDksIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZjMmQsCisJMHgwMDdjLCAweDIwYTEsIDB4MDIwYiwgMHgxMDc4LCAweDY1NWUsIDB4MjBhMywgMHgxNDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4NzgyOCwgMHgyMGEyLCAweDc4MmMsCisJMHgyMGEyLCAweDc4MzAsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTAsIDB4MTA3OCwgMHg2YzJkLCAweDAwN2MsIDB4MjBhMSwgMHgwMjBiLCAweDEwNzgsCisJMHg2NWVmLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgyOCwgMHgyMGEyLCAweDc4MTAsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgxMDc4LCAweDZjMmQsIDB4MDA3YywgMHgxNDdlLCAweDIwYTEsCisJMHgwMjBiLCAweDEwNzgsIDB4NzQ5OSwgMHg2MGMzLCAweDAwMDAsIDB4MTA3OCwgMHg2YzJkLCAweDE0N2YsCisJMHgwMDdjLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg3NGI2LCAweDBkN2UsIDB4YTBlOCwgMHhhNDM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4MDMwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGEzMWEsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwZDdmLCAweDAwNzgsIDB4NzRiZSwgMHgyMGEzLCAweDAzMDAsCisJMHg2Mjk4LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDYyMzAsIDB4MjJhMiwgMHgyMGEzLCAweDA4MTksCisJMHgyMGEzLCAweDAwMDAsIDB4MTA3OCwgMHg2YzFjLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDJmYTIsCisJMHg3YTA4LCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDdjLCAweDIwNjEsCisJMHhhYTAwLCAweDJhNzAsIDB4NzA2MCwgMHg3MDQ2LCAweDcwNGIsIDB4YWEwMCwgMHgwMDdjLCAweDBlN2UsCisJMHgxMjdlLCAweDIwNzEsIDB4YTMwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU0NCwgMHhhNTgyLCAweDAwMTAsCisJMHgwMDQ4LCAweDc1MDksIDB4NzA0OCwgMHgyMDYwLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHg3NGY1LCAweGFjZTAsIDB4MDAxMCwgMHg3MDU0LCAweGFjMDIsIDB4MDBjOCwgMHg3NGYxLCAweDAwNzgsCisJMHg3NGU0LCAweDIwNjEsIDB4YWEwMCwgMHgwMDc4LCAweDc0ZTQsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksCisJMHg3NTQ2LCAweGFjYTgsIDB4MDAxMCwgMHg3MDU0LCAweGE1MDIsIDB4MDBjOCwgMHg3NTA1LCAweDc1NGEsCisJMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzA0YiwgMHhhYTAwLCAweDAwNzgsCisJMHg3NTAwLCAweGEwMDYsIDB4MDA3OCwgMHg3NTAyLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLCAweDc1NDQsCisJMHhhNTgyLCAweDAwMTAsIDB4MDA0OCwgMHg3NTNhLCAweDcwNDgsIDB4MjA2MCwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDAwNDAsIDB4NzUyNywgMHhhY2UwLCAweDAwMTAsIDB4NzA1NCwgMHhhYzAyLCAweDAwYzgsCisJMHg3NTIzLCAweDAwNzgsIDB4NzUxNiwgMHgyMDYxLCAweGFhMDAsIDB4MDA3OCwgMHg3NTE2LCAweDYwMDMsCisJMHgwMDA4LCAweDg1MjksIDB4NzU0NiwgMHhhY2E4LCAweDAwMTAsIDB4NzA1NCwgMHhhNTAyLCAweDAwYzgsCisJMHg3NTM2LCAweDc1NGEsIDB4YTA4NSwgMHgwMDAxLCAweDBlN2YsIDB4MDA3YywgMHg3MDRiLCAweGFhMDAsCisJMHgwMDc4LCAweDc1MzIsIDB4YTAwNiwgMHgwMDc4LCAweDc1MzQsIDB4YWM4MiwgMHhhYTAwLCAweDEwNDgsCisJMHgxMzI4LCAweDIwMDEsIDB4YTMxNSwgMHgyMDA0LCAweGFjMDIsIDB4MTBjOCwgMHgxMzI4LCAweGEwMDYsCisJMHg2MDA2LCAweDYwMGEsIDB4NjAwZSwgMHg2MDEyLCAweDYwMTYsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDAsCisJMHg2MDAzLCAweDAwMDAsIDB4NjAyMiwgMHg2MDI2LCAweDYwMmEsIDB4NjAyZSwgMHg2MDMyLCAweDYwMzYsCisJMHg2MDNhLCAweDYwM2UsIDB4MjA2MSwgMHhhMzAwLCAweDYwNDQsIDB4ODAwMCwgMHg2MDQ2LCAweGEwODYsCisJMHgwMDAxLCAweDAwNDAsIDB4NzU2NCwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg2MTA5LCAweDEyN2YsIDB4MDA3OCwgMHg3NTYzLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwNzksCisJMHg3NTcxLCAweDc1N2EsIDB4NzU4YiwgMHg3NWE3LCAweDc1YzMsIDB4OGYyZCwgMHg4ZjQ5LCAweDhmNjUsCisJMHg3NTdhLCAweDc1OGIsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsIDB4NzU4MywgMHgxMDc4LCAweDYwMTAsCisJMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHhhMThlLCAweDAwNDcsIDB4MDBjMCwgMHg3NThhLCAweGEwMTYsCisJMHgxMDc4LCAweDE1ZWMsIDB4MDA3YywgMHgwNjdlLCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsCisJMHgxMzI4LCAweDEwNzksIDB4NzU5NSwgMHgwNjdmLCAweDAwN2MsIDB4NzVhNSwgMHg3ODkxLCAweDdhMzQsCisJMHg3NWE1LCAweDdhYjgsIDB4NzVkZiwgMHg3NWE1LCAweDc1YTUsIDB4NzgyMywgMHg3ZTZkLCAweDc1YTUsCisJMHg3NWE1LCAweDc1YTUsIDB4NzVhNSwgMHg3NWE1LCAweDc1YTUsIDB4MTA3OCwgMHgxMzI4LCAweDA2N2UsCisJMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg3NWIxLCAweDA2N2YsCisJMHgwMDdjLCAweDc1YzEsIDB4ODUyMiwgMHg3NWMxLCAweDc1YzEsIDB4NzVjMSwgMHg3NWMxLCAweDc1YzEsCisJMHg3NWMxLCAweDg0YzUsIDB4ODZhOCwgMHg3NWMxLCAweDg1NTIsIDB4ODVkOCwgMHg4NTUyLCAweDg1ZDgsCisJMHg3NWMxLCAweDEwNzgsIDB4MTMyOCwgMHgwNjdlLCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDEwYzgsCisJMHgxMzI4LCAweDEwNzksIDB4NzVjZCwgMHgwNjdmLCAweDAwN2MsIDB4NzVkZCwgMHg3ZWI0LCAweDdmODEsCisJMHg4MGM2LCAweDgyNDIsIDB4NzVkZCwgMHg3NWRkLCAweDc1ZGQsIDB4N2U4ZCwgMHg4NDZkLCAweDg0NzEsCisJMHg3NWRkLCAweDc1ZGQsIDB4NzVkZCwgMHg3NWRkLCAweDg0YTEsIDB4MTA3OCwgMHgxMzI4LCAweGExYjYsCisJMHgwMDE1LCAweDAwYzAsIDB4NzVlNywgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg3NWVkLCAweGExYjYsCisJMHgwMDE2LCAweDEwYzAsIDB4MTMyOCwgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHgyMGE5LCAweDAwMGUsCisJMHgyZTk4LCAweDYwMTAsIDB4MjBhMCwgMHg1M2EzLCAweDIwYTksIDB4MDAwNiwgMHgzMzEwLCAweDM0MjAsCisJMHg5Mzk4LCAweDk0YTAsIDB4MzMxOCwgMHgzNDI4LCAweDIyMmUsIDB4MjMyNiwgMHhhMjkwLCAweDAwMDIsCisJMHhhNWE4LCAweDAwMDIsIDB4YTM5OCwgMHgwMDAyLCAweGE0YTAsIDB4MDAwMiwgMHgwMGYwLCAweDc1ZmMsCisJMHgwZTdlLCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDc2MTMsIDB4NjAxMCwgMHgyMDcwLCAweDcwMDcsCisJMHgwMDAwLCAweDcwMzcsIDB4MDEwMywgMHgwZTdmLCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweDBkN2UsCisJMHgwMzdlLCAweDczMzAsIDB4YTM4NiwgMHgwMjAwLCAweDAwYzAsIDB4NzYyNCwgMHg2MDE4LCAweDIwNjgsCisJMHg2ODEzLCAweDAwZmYsIDB4NjgxNywgMHhmZmZkLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLCAweDc2MmUsCisJMHgyMDY4LCAweDY4MDcsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsIDB4NmIzMiwgMHgxMDc4LCAweDc1M2QsCisJMHgwMzdmLCAweDBkN2YsIDB4MDA3YywgMHgwMTdlLCAweDIwYTksIDB4MDAyYSwgMHhhZTgwLCAweDAwMGMsCisJMHgyMDk4LCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLCAweDIwYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMmEsCisJMHg2MDEwLCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODAsIDB4MDAwMiwgMHgyMGEwLCAweDUzYTMsCisJMHgwZTdlLCAweDYwMTAsIDB4MjAwNCwgMHgyMDcwLCAweDcwMzcsIDB4MDEwMywgMHgwZTdmLCAweDEwNzgsCisJMHg3NTNkLCAweDAxN2YsIDB4MDA3YywgMHgwZTdlLCAweDBkN2UsIDB4NjAzZiwgMHgwMDAwLCAweDJjNjgsCisJMHgwMTdlLCAweDIwMDksIDB4MDAzNSwgMHgxMDc4LCAweDhlZjUsIDB4MDE3ZiwgMHgwMGMwLCAweDc2NmYsCisJMHgwMjdlLCAweDYyMjgsIDB4MjI2OCwgMHgwMjdmLCAweDIwNzEsIDB4YTg4YywgMHg2YjFjLCAweGEzODYsCisJMHgwMDAzLCAweDAwNDAsIDB4NzY3MywgMHhhMzg2LCAweDAwMDYsIDB4MDA0MCwgMHg3Njc3LCAweDEwNzgsCisJMHg3NTNkLCAweDAwNzgsIDB4NzY3OSwgMHgxMDc4LCAweDc2N2MsIDB4MDA3OCwgMHg3Njc5LCAweDEwNzgsCisJMHg3NzFlLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBmN2UsIDB4NjgxMCwgMHgyMDc4LCAweGExODYsCisJMHgwMDE1LCAweDAwNDAsIDB4NzcwNSwgMHhhMThlLCAweDAwMTYsIDB4MDBjMCwgMHg3NzFjLCAweDcwMGMsCisJMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgxNzAwLCAweDAwYzAsIDB4NzZlMCwgMHg4ZmZmLCAweDAwNDAsCisJMHg3NzFhLCAweDY4MDgsIDB4YTA4NiwgMHhmZmZmLCAweDAwYzAsIDB4NzcwOSwgMHg3ODRjLCAweGEwODQsCisJMHgwMDYwLCAweGEwODYsIDB4MDAyMCwgMHgwMGMwLCAweDc2YTcsIDB4Nzk3YywgMHg3ODEwLCAweGExMDYsCisJMHgwMGMwLCAweDc3MDksIDB4Nzk4MCwgMHg3ODE0LCAweGExMDYsIDB4MDBjMCwgMHg3NzA5LCAweDEwNzgsCisJMHg4YmY0LCAweDY4MzAsIDB4Nzg1MiwgMHg3ODRjLCAweGMwZGMsIDB4YzBmNCwgMHhjMGQ0LCAweDc4NGUsCisJMHgwMjdlLCAweGEwMGUsIDB4NmExNCwgMHgyMDAxLCAweDAwMGEsIDB4MTA3OCwgMHg1YTk4LCAweDc4NTQsCisJMHhhMjBhLCAweDAwNDgsIDB4NzZiYywgMHg4MDExLCAweDdhNTYsIDB4ODJmZiwgMHgwMjdmLCAweDAwYzAsCisJMHg3NmM4LCAweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDg4MzIsIDB4MGM3ZiwgMHgwMDc4LCAweDc3MWEsCisJMHgwYzdlLCAweDBkN2UsIDB4MmY2OCwgMHg2ODM4LCAweGQwZmMsIDB4MDBjMCwgMHg3NmQzLCAweDEwNzgsCisJMHg0MjkwLCAweDAwNzgsIDB4NzZkNSwgMHgxMDc4LCAweDQzNmUsIDB4MGQ3ZiwgMHgwYzdmLCAweDAwYzAsCisJMHg3NzA5LCAweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDc1M2QsIDB4MGM3ZiwgMHgwMDc4LCAweDc3MWEsCisJMHg3MDA4LCAweGEwODYsIDB4MDAwYiwgMHgwMGMwLCAweDc2ZmEsIDB4NjAxOCwgMHgyMDBjLCAweGMxYmMsCisJMHgyMTAyLCAweDBjN2UsIDB4MmQ2MCwgMHg3ODUzLCAweDAwMDMsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsCisJMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDBjN2YsCisJMHgwMDc4LCAweDc3MWEsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsIDB4MDBjMCwgMHg3NzA5LCAweDIwMDEsCisJMHhhNWEyLCAweDIwMDQsIDB4NjgzZSwgMHgwMDc4LCAweDc3MWEsIDB4MTA3OCwgMHg3NzM5LCAweDAwNzgsCisJMHg3NzFjLCAweDhmZmYsIDB4MTA0MCwgMHgxMzI4LCAweDBjN2UsIDB4MGQ3ZSwgMHgyZDYwLCAweDJmNjgsCisJMHg2ODRiLCAweDAwMDMsIDB4MTA3OCwgMHg4NzI2LCAweDEwNzgsIDB4OGJmNCwgMHgxMDc4LCAweDhjMDEsCisJMHgwZDdmLCAweDBjN2YsIDB4MTA3OCwgMHg3NTNkLCAweDBmN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTUsCisJMHgwMGMwLCAweDc3MjgsIDB4MjAwMSwgMHhhNWEyLCAweDIwMDQsIDB4NjgzZSwgMHgwMDc4LCAweDc3MzYsCisJMHhhMThlLCAweDAwMTYsIDB4MDBjMCwgMHg3NzM4LCAweDBjN2UsIDB4MmQwMCwgMHgyMDYwLCAweDEwNzgsCisJMHhhMTM0LCAweDEwNzgsIDB4NWE0MSwgMHgxMDc4LCAweDc1M2QsIDB4MGM3ZiwgMHgxMDc4LCAweDc1M2QsCisJMHgwMDdjLCAweDAyN2UsIDB4MDM3ZSwgMHgwNDdlLCAweDcyMjgsIDB4N2M4MCwgMHg3YjdjLCAweGQyZjQsCisJMHgwMDQwLCAweDc3NDgsIDB4MjAwMSwgMHhhNWEyLCAweDIwMDQsIDB4NjgzZSwgMHgwMDc4LCAweDc3YWMsCisJMHgwYzdlLCAweDJkNjAsIDB4MTA3OCwgMHg4NzRhLCAweDBjN2YsIDB4NjgwNCwgMHhhMDg2LCAweDAwNTAsCisJMHgwMGMwLCAweDc3NjAsIDB4MGM3ZSwgMHgyZDAwLCAweDIwNjAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDUwLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MGM3ZiwgMHgwMDc4LCAweDc3YWMsCisJMHg2ODAwLCAweGEwODYsIDB4MDAwZiwgMHgwMDQwLCAweDc3ODIsIDB4OGZmZiwgMHgxMDQwLCAweDEzMjgsCisJMHg2ODI0LCAweGQwZGMsIDB4MDBjMCwgMHg3NzgyLCAweDY4MDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsCisJMHg3Nzg3LCAweDc4NGMsIDB4ZDBhYywgMHgwMDQwLCAweDc3ODcsIDB4Nzg0YywgMHhjMGRjLCAweGMwZjQsCisJMHg3ODRlLCAweDc4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDc4NTIsIDB4MjAwMSwgMHgwMDAxLCAweDY4MmUsCisJMHgwMDc4LCAweDc3YTYsIDB4MjAwMSwgMHgwMDA3LCAweDY4MmUsIDB4MDA3OCwgMHg3N2E2LCAweDc4NGMsCisJMHhkMGI0LCAweDAwYzAsIDB4Nzc5NCwgMHhkMGFjLCAweDAwNDAsIDB4Nzc4MiwgMHg3ODRjLCAweGQwZjQsCisJMHgwMGMwLCAweDc3ODIsIDB4MDA3OCwgMHg3Nzc1LCAweGQyZWMsIDB4MDBjMCwgMHg3NzgyLCAweDcwMjQsCisJMHhhMzA2LCAweDAwYzAsIDB4Nzc5ZiwgMHg3MDIwLCAweGE0MDYsIDB4MDA0MCwgMHg3NzgyLCAweDcwMjAsCisJMHg2ODM2LCAweDcwMjQsIDB4NjgzYSwgMHgyMDAxLCAweDAwMDUsIDB4NjgyZSwgMHgxMDc4LCAweDhkMmIsCisJMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg3N2FlLCAweDEwNzgsIDB4NzUzZCwgMHgwNDdmLCAweDAzN2YsCisJMHgwMjdmLCAweDAwN2MsIDB4MGU3ZSwgMHgwZDdlLCAweDAyN2UsIDB4NjAzNCwgMHgyMDY4LCAweDZhMWMsCisJMHhhMjg2LCAweDAwMDcsIDB4MDA0MCwgMHg3ODA2LCAweGEyODYsIDB4MDAwMiwgMHgwMDQwLCAweDc4MDYsCisJMHhhMjg2LCAweDAwMDAsIDB4MDA0MCwgMHg3ODA2LCAweDY4MDgsIDB4NjMzOCwgMHhhMzA2LCAweDAwYzAsCisJMHg3ODA2LCAweDIwNzEsIDB4YTg4YywgMHhhMTg2LCAweDAwMTUsIDB4MDA0MCwgMHg3ODAwLCAweGExOGUsCisJMHgwMDE2LCAweDAwYzAsIDB4NzdlOCwgMHg2MDMwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDEsCisJMHgwMGMwLCAweDc3ZTgsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsIDB4MDBjMCwgMHg3N2U4LCAweDYwMzQsCisJMHhhMDgwLCAweDAwMDksIDB4MjAwYywgMHhjMWRkLCAweGMxZjUsIDB4MjEwMiwgMHgwMDc4LCAweDc4MDAsCisJMHgwYzdlLCAweDYwMzQsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDEwNDAsCisJMHgxMzI4LCAweDY4NTMsIDB4MDAwMywgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsCisJMHgwMDAyLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MGM3ZiwgMHgwMDc4LCAweDc4MDYsCisJMHg2MDM0LCAweDIwNjgsIDB4MjAwMSwgMHhhNWEyLCAweDIwMDQsIDB4NjgzZSwgMHgxMDc4LCAweDc1M2QsCisJMHgwMjdmLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDdjLCAweDBkN2UsIDB4MjBhOSwgMHgwMDBlLCAweDJlOTgsCisJMHg2MDEwLCAweDIwYTAsIDB4NTNhMywgMHhhMWI2LCAweDAwMTUsIDB4MDBjMCwgMHg3ODIwLCAweDYwMTgsCisJMHgyMDY4LCAweDcwMzgsIDB4NjgwYSwgMHg3MDNjLCAweDY4MGUsIDB4NjgwMCwgMHhjMDhkLCAweDY4MDIsCisJMHgwZDdmLCAweDAwNzgsIDB4NzYwOCwgMHgyMTAwLCAweGExYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMjgsCisJMHhhMWIyLCAweDAwNDAsIDB4MDBjOCwgMHg3ODg4LCAweDAwNzksIDB4NzgyZSwgMHg3ODdjLCAweDc4NzAsCisJMHg3ODdjLCAweDc4N2MsIDB4Nzg3YywgMHg3ODdjLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsCisJMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsCisJMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsCisJMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg3YywgMHg3ODZlLCAweDc4N2MsCisJMHg3ODdjLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODdjLCAweDc4NmUsCisJMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsCisJMHg3ODdjLCAweDc4N2MsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODZlLCAweDc4NmUsCisJMHg3ODZlLCAweDc4NmUsIDB4Nzg2ZSwgMHg3ODdjLCAweDc4NmUsIDB4Nzg2ZSwgMHgxMDc4LCAweDEzMjgsCisJMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDVjNDUsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDYxMDksIDB4MTI3ZiwgMHgwMDdjLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsCisJMHg1YzQ1LCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4NjEwOSwgMHgxMjdmLCAweDAwN2MsCisJMHgyNjAwLCAweDAwNzksIDB4Nzg4YiwgMHg3ODhmLCAweDc4OGYsIDB4Nzg4ZiwgMHg3ODdjLCAweDEwNzgsCisJMHgxMzI4LCAweDYwMDQsIDB4YTBiMiwgMHgwMDQ0LCAweDEwYzgsIDB4MTMyOCwgMHhhMWI2LCAweDAwMTMsCisJMHgwMGMwLCAweDc4YTEsIDB4YTBiMiwgMHgwMDQwLCAweDAwYzgsIDB4NzlmYiwgMHgyMDA4LCAweDAwNzksCisJMHg3OTQxLCAweGExYjYsIDB4MDAyNywgMHgwMGMwLCAweDc4ZmUsIDB4MTA3OCwgMHg2MDEwLCAweDYwMDQsCisJMHgxMDc4LCAweDhjMjcsIDB4MDA0MCwgMHg3OGJlLCAweDEwNzgsIDB4OGMzYiwgMHgwMDQwLCAweDc4ZjYsCisJMHhhMDhlLCAweDAwMjEsIDB4MDA0MCwgMHg3OGZhLCAweGEwOGUsIDB4MDAyMiwgMHgwMDQwLCAweDc4ZjYsCisJMHhhMDhlLCAweDAwM2QsIDB4MDA0MCwgMHg3OGZhLCAweDAwNzgsIDB4NzhmMSwgMHgxMDc4LCAweDI4MzksCisJMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NDNmLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMGMsCisJMHgxMDc4LCAweDdhMDUsIDB4YTE4NiwgMHgwMDdlLCAweDAwYzAsIDB4NzhkMywgMHgyMDAxLCAweGEzMzIsCisJMHgyMDE0LCAweGMyODUsIDB4MjIwMiwgMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgyMTEwLCAweDIwMTksCisJMHgwMDI4LCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDVjNzgsCisJMHgwYzdlLCAweDYwMTgsIDB4YTA2NSwgMHgwMDQwLCAweDc4ZTcsIDB4MTA3OCwgMHg0NzFiLCAweDBjN2YsCisJMHgyYzA4LCAweDEwNzgsIDB4OWMzOCwgMHgwNzdmLCAweDAzN2YsIDB4MDI3ZiwgMHgwMTdmLCAweDEwNzgsCisJMHg0NGJjLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgxMDc4LCAweDdhMDUsCisJMHgwMDc4LCAweDc4ZjEsIDB4MTA3OCwgMHg3YTI4LCAweDAwNzgsIDB4NzhmMSwgMHhhMTg2LCAweDAwMTQsCisJMHgwMGMwLCAweDc4ZjUsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4MjgxMywgMHgxMDc4LCAweDhjMjcsCisJMHgwMGMwLCAweDc5MWQsIDB4MTA3OCwgMHgyODM5LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMGMsCisJMHgxMDc4LCAweDdhMDUsIDB4YTE4NiwgMHgwMDdlLCAweDAwYzAsIDB4NzkxYiwgMHgyMDAxLCAweGEzMzIsCisJMHgyMDBjLCAweGMxODUsIDB4MjEwMiwgMHgwMDc4LCAweDc4ZjEsIDB4MTA3OCwgMHg4YzNiLCAweDAwYzAsCisJMHg3OTI1LCAweDEwNzgsIDB4N2EwNSwgMHgwMDc4LCAweDc4ZjEsIDB4NjAwNCwgMHhhMDhlLCAweDAwMzIsCisJMHgwMGMwLCAweDc5MzYsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsIDB4YTM4MSwgMHgyMDc5LCAweDAwMDAsCisJMHgxMDc4LCAweDJiNTYsIDB4MGY3ZiwgMHgwZTdmLCAweDAwNzgsIDB4NzhmMSwgMHg2MDA0LCAweGEwOGUsCisJMHgwMDIxLCAweDAwNDAsIDB4NzkyMSwgMHhhMDhlLCAweDAwMjIsIDB4MTA0MCwgMHg3YTA1LCAweDAwNzgsCisJMHg3OGYxLCAweDc5ODMsIDB4Nzk4NSwgMHg3OTg5LCAweDc5OGQsIDB4Nzk5MSwgMHg3OTk1LCAweDc5ODEsCisJMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsCisJMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsCisJMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5OTksCisJMHg3OWFiLCAweDc5ODEsIDB4NzlhZCwgMHg3OWFiLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsCisJMHg3OTgxLCAweDc5YWIsIDB4NzlhYiwgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OTgxLCAweDc5ODEsCisJMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OWRlLCAweDc5YWIsIDB4Nzk4MSwgMHg3OWE1LCAweDc5ODEsCisJMHg3OTgxLCAweDc5ODEsIDB4NzlhNywgMHg3OTgxLCAweDc5ODEsIDB4Nzk4MSwgMHg3OWFiLCAweDc5ODEsCisJMHg3OTgxLCAweDEwNzgsIDB4MTMyOCwgMHgwMDc4LCAweDc5YWIsIDB4MjAwMSwgMHgwMDBiLCAweDAwNzgsCisJMHg3OWI4LCAweDIwMDEsIDB4MDAwMywgMHgwMDc4LCAweDc5YjgsIDB4MjAwMSwgMHgwMDA1LCAweDAwNzgsCisJMHg3OWI4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDc4LCAweDc5YjgsIDB4MjAwMSwgMHgwMDA5LCAweDAwNzgsCisJMHg3OWI4LCAweDEwNzgsIDB4NjAxMCwgMHg2MDAzLCAweDAwMDUsIDB4MjAwMSwgMHhhNWEyLCAweDIwMDQsCisJMHg2MDNlLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDc5YjcsIDB4MDA3OCwgMHg3OWFiLCAweDAwNzgsCisJMHg3OWFiLCAweDEwNzgsIDB4NDQzZiwgMHgwMDc4LCAweDc5ZjAsIDB4MTA3OCwgMHg2MDEwLCAweDYwMDMsCisJMHgwMDA0LCAweDIwMDEsIDB4YTVhMCwgMHgyMDA0LCAweDYwMTYsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsCisJMHgxMDc4LCAweDQ0M2YsIDB4MTA3OCwgMHg2MDEwLCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDYwM2UsCisJMHg2MDAzLCAweDAwMDIsIDB4MDM3ZSwgMHgyMDE5LCAweGEzNWMsIDB4MjMwNCwgMHhhMDg0LCAweGZmMDAsCisJMHgwMGMwLCAweDc5Y2YsIDB4MjAxOSwgMHhhNWEwLCAweDIzMWMsIDB4MDA3OCwgMHg3OWQ4LCAweDgwMDcsCisJMHhhMDlhLCAweDAwMDQsIDB4MDA0OCwgMHg3OWNhLCAweDgwMDMsIDB4ODAxYiwgMHg4MzFiLCAweGEzMTgsCisJMHg2MzE2LCAweDAzN2YsIDB4MTA3OCwgMHg2MTA5LCAweDAwNzgsIDB4NzliNywgMHgwZTdlLCAweDBmN2UsCisJMHgyMDcxLCAweGEzODEsIDB4MjA3OSwgMHgwMDAwLCAweDEwNzgsIDB4MmI1NiwgMHgwZjdmLCAweDBlN2YsCisJMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg3NTNkLCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDc5YjcsCisJMHgxMDc4LCAweDYwMTAsIDB4NjAwMywgMHgwMDAyLCAweDIwMDEsIDB4YTVhMCwgMHgyMDA0LCAweDYwMTYsCisJMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgyNjAwLCAweDIwMDgsIDB4MDA3OSwgMHg3OWZmLCAweDdhMDMsCisJMHg3YTAzLCAweDdhMDMsIDB4NzlmMCwgMHgxMDc4LCAweDEzMjgsIDB4MGU3ZSwgMHgxMDc4LCAweDhhNDQsCisJMHgwMDQwLCAweDdhMjEsIDB4NjAxMCwgMHgyMDcwLCAweDcwMzgsIDB4ZDBmYywgMHgwMDQwLCAweDdhMjEsCisJMHg3MDA3LCAweDAwMDAsIDB4MDE3ZSwgMHg2MDA0LCAweGEwOGUsIDB4MDAyMSwgMHgwMDQwLCAweDdhMjMsCisJMHhhMDhlLCAweDAwM2QsIDB4MDA0MCwgMHg3YTIzLCAweDAxN2YsIDB4NzAzNywgMHgwMTAzLCAweDcwMzMsCisJMHgwMTAwLCAweDBlN2YsIDB4MDA3YywgMHgwMTdmLCAweDEwNzgsIDB4N2EyOCwgMHgwMDc4LCAweDdhMjEsCisJMHgwZTdlLCAweGFjZjAsIDB4MDAwNCwgMHgyZTc0LCAweDcwMDAsIDB4MjA3MCwgMHg3MDM3LCAweDAxMDMsCisJMHg3MDIzLCAweDgwMDEsIDB4MGU3ZiwgMHgwMDdjLCAweDBkN2UsIDB4NjYxOCwgMHgyNjY4LCAweDY4MDQsCisJMHhhMDg0LCAweDAwZmYsIDB4MGQ3ZiwgMHhhMGIyLCAweDAwMGMsIDB4MTBjOCwgMHgxMzI4LCAweDY2MDQsCisJMHhhNmI2LCAweDAwNDMsIDB4MDBjMCwgMHg3YTQ4LCAweDEwNzgsIDB4OGU2ZCwgMHgwMDc4LCAweDdhYTcsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAzMywgMHgwMGMwLCAweDdhNTEsIDB4MTA3OCwgMHg4ZTExLCAweDAwNzgsCisJMHg3YWE3LCAweDY2MDQsIDB4YTZiNiwgMHgwMDI4LCAweDAwYzAsIDB4N2E1YSwgMHgxMDc4LCAweDhjNmEsCisJMHgwMDc4LCAweDdhYTcsIDB4NjYwNCwgMHhhNmI2LCAweDAwMjksIDB4MDBjMCwgMHg3YTYzLCAweDEwNzgsCisJMHg4Yzg0LCAweDAwNzgsIDB4N2FhNywgMHg2NjA0LCAweGE2YjYsIDB4MDAxZiwgMHgwMGMwLCAweDdhNmMsCisJMHgxMDc4LCAweDc1ZWUsIDB4MDA3OCwgMHg3YWE3LCAweDY2MDQsIDB4YTZiNiwgMHgwMDAwLCAweDAwYzAsCisJMHg3YTc1LCAweDEwNzgsIDB4NzgwYywgMHgwMDc4LCAweDdhYTcsIDB4NjYwNCwgMHhhNmI2LCAweDAwMjIsCisJMHgwMGMwLCAweDdhN2UsIDB4MTA3OCwgMHg3NjE3LCAweDAwNzgsIDB4N2FhNywgMHg2NjA0LCAweGE2YjYsCisJMHgwMDM1LCAweDAwYzAsIDB4N2E4NywgMHgxMDc4LCAweDc2NTMsIDB4MDA3OCwgMHg3YWE3LCAweDY2MDQsCisJMHhhNmI2LCAweDAwMzksIDB4MDBjMCwgMHg3YTkwLCAweDEwNzgsIDB4NzdiMiwgMHgwMDc4LCAweDdhYTcsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAzZCwgMHgwMGMwLCAweDdhOTksIDB4MTA3OCwgMHg3NjMzLCAweDAwNzgsCisJMHg3YWE3LCAweGExYjYsIDB4MDAxNSwgMHgwMGMwLCAweDdhYTEsIDB4MTA3OSwgMHg3YWFjLCAweDAwNzgsCisJMHg3YWE3LCAweGExYjYsIDB4MDAxNiwgMHgwMGMwLCAweDdhYTgsIDB4MTA3OSwgMHg3YmZkLCAweDAwN2MsCisJMHgxMDc4LCAweDc1ODMsIDB4MDA3OCwgMHg3YWE3LCAweDdhZDAsIDB4N2FkMywgMHg3YWQwLCAweDdiMWUsCisJMHg3YWQwLCAweDdiOTEsIDB4N2MwOSwgMHg3YWQwLCAweDdhZDAsIDB4N2JkNSwgMHg3YWQwLCAweDdiZWIsCisJMHhhMWI2LCAweDAwNDgsIDB4MDA0MCwgMHg3YWM0LCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsCisJMHgyYzEwLCAweDEwNzgsIDB4MTVlYywgMHgwMDdjLCAweDBlN2UsIDB4YWNmMCwgMHgwMDA0LCAweDJlNzQsCisJMHg3MDAwLCAweDIwNzAsIDB4NzAzNywgMHgwMTAzLCAweDBlN2YsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsCisJMHgwMDA1LCAweDAwMDUsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHg3MDdjLCAweGEwODYsCisJMHgwMDc0LCAweDAwYzAsIDB4N2IwNywgMHgxMDc4LCAweDljMGMsIDB4MDBjMCwgMHg3YWY5LCAweDBkN2UsCisJMHg2MDE4LCAweDIwNjgsIDB4NzAzMCwgMHhkMDhjLCAweDAwNDAsIDB4N2FlYywgMHg2ODAwLCAweGQwYmMsCisJMHgwMDQwLCAweDdhZWMsIDB4YzBjNSwgMHg2ODAyLCAweDEwNzgsIDB4N2IwYiwgMHgwZDdmLCAweDIwMDEsCisJMHgwMDA2LCAweDEwNzgsIDB4NDQzZiwgMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg3NTNkLCAweDAwNzgsCisJMHg3YjA5LCAweDIwMDEsIDB4MDAwYSwgMHgxMDc4LCAweDQ0M2YsIDB4MTA3OCwgMHgyODM5LCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3YjA5LCAweDEwNzgsCisJMHg3YjgxLCAweDBlN2YsIDB4MDA3YywgMHg2ODAwLCAweGQwODQsIDB4MDA0MCwgMHg3YjFkLCAweDIwMDEsCisJMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgyMDY5LCAweGEzNTEsIDB4NjgwNCwgMHhkMGE0LCAweDAwNDAsCisJMHg3YjFkLCAweDIwMDEsIDB4MDAwNiwgMHgxMDc4LCAweDQ0NzIsIDB4MDA3YywgMHgwZDdlLCAweDIwMTEsCisJMHhhMzFmLCAweDIyMDQsIDB4YTA4NiwgMHgwMDc0LCAweDAwYzAsIDB4N2I3ZCwgMHg2MDE4LCAweDIwNjgsCisJMHg2YWEwLCAweGEyODYsIDB4MDA3ZSwgMHgwMGMwLCAweDdiMzEsIDB4MTA3OCwgMHg3ZDE3LCAweDAwNzgsCisJMHg3YjdmLCAweDEwNzgsIDB4N2QwZCwgMHg2MDE4LCAweDIwNjgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsCisJMHhhMjg2LCAweDAwODAsIDB4MDBjMCwgMHg3YjU1LCAweDY4MTMsIDB4MDBmZiwgMHg2ODE3LCAweGZmZmMsCisJMHg2MDEwLCAweGEwMDUsIDB4MDA0MCwgMHg3YjRiLCAweDIwNjgsIDB4NjgwNywgMHgwMDAwLCAweDY4MzcsCisJMHgwMTAzLCAweDY4MzMsIDB4MDIwMCwgMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwgMHg0NDNmLCAweDEwNzgsCisJMHgyODM5LCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LCAweDdiN2YsIDB4MGU3ZSwgMHgyMDcxLCAweGEzMzIsCisJMHgyZTA0LCAweGQwOWMsIDB4MDA0MCwgMHg3YjcwLCAweDIwNzEsIDB4YTg4MCwgMHg3MTA4LCAweDcyMGMsCisJMHhhMThjLCAweDAwZmYsIDB4MDBjMCwgMHg3YjY4LCAweGEyODQsIDB4ZmYwMCwgMHgwMDQwLCAweDdiNzAsCisJMHg2MDE4LCAweDIwNzAsIDB4NzBhMCwgMHhkMGJjLCAweDAwYzAsIDB4N2I3MCwgMHg3MTEyLCAweDcyMTYsCisJMHgwZTdmLCAweDIwMDEsIDB4MDAwNCwgMHgxMDc4LCAweDQ0M2YsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAzLCAweDEwNzgsIDB4NWM0NSwgMHgwMDc4LCAweDdiN2YsIDB4MTA3OCwgMHg3YjgxLCAweDBkN2YsCisJMHgwMDdjLCAweDIwMDEsIDB4YTMwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgwMDQwLCAweDdiOGMsCisJMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NDNmLCAweDEwNzgsIDB4MjgzOSwgMHgxMDc4LCAweDc1M2QsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhMzAwLCAweDcwN2MsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsCisJMHg3YmNmLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwYzAsIDB4N2JhNCwgMHg2MDEwLCAweGEwMDUsCisJMHgwMGMwLCAweDdiYTQsIDB4MTA3OCwgMHgzNWY3LCAweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDEwNzgsCisJMHg0NTdkLCAweDEwNzgsIDB4N2IwYiwgMHgwZDdmLCAweDEwNzgsIDB4N2RiYSwgMHgwMGMwLCAweDdiY2YsCisJMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHg2ODkwLCAweDBkN2YsIDB4YTAwNSwgMHgwMDQwLCAweDdiY2YsCisJMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwgMHg0NDNmLCAweDBlN2UsIDB4NjAxMCwgMHhhMDA1LCAweDAwNDAsCisJMHg3YmM4LCAweDIwNzAsIDB4NzAwNywgMHgwMDAwLCAweDcwMzcsIDB4MDEwMywgMHg3MDMzLCAweDAyMDAsCisJMHgwZTdmLCAweDEwNzgsIDB4MjgzOSwgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg3YmQzLCAweDEwNzgsCisJMHg3YTA1LCAweDEwNzgsIDB4N2I4MSwgMHgwZTdmLCAweDAwN2MsIDB4MjAxMSwgMHhhMzFmLCAweDIyMDQsCisJMHhhMDg2LCAweDAwMTQsIDB4MDBjMCwgMHg3YmU4LCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ0M2YsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgwMDc4LCAweDdiZWEsCisJMHgxMDc4LCAweDdiODEsIDB4MDA3YywgMHgyMDExLCAweGEzMWYsIDB4MjIwNCwgMHhhMDg2LCAweDAwMDQsCisJMHgwMGMwLCAweDdiZmEsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsIDB4NDQzZiwgMHgxMDc4LCAweDc1M2QsCisJMHgwMDc4LCAweDdiZmMsIDB4MTA3OCwgMHg3YjgxLCAweDAwN2MsIDB4N2FkMCwgMHg3YzExLCAweDdhZDAsCisJMHg3YzRlLCAweDdhZDAsIDB4N2NjMCwgMHg3YzA5LCAweDdhZDAsIDB4N2FkMCwgMHg3Y2Q1LCAweDdhZDAsCisJMHg3Y2U4LCAweDY2MDQsIDB4YTZiNiwgMHgwMDFlLCAweDAwYzAsIDB4N2MxMCwgMHgxMDc4LCAweDc1M2QsCisJMHgwMDdjLCAweDBkN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDdjZmIsIDB4MDBjMCwgMHg3YzI3LCAweDIwMDEsCisJMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgyMDAxLCAweDAwMDIsIDB4MTA3OCwgMHg0NDNmLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg3YzRiLCAweDIwMDksCisJMHhhODhlLCAweDIxMDQsIDB4YTA4NiwgMHgwMDA5LCAweDAwYzAsIDB4N2MzYywgMHg2MDE4LCAweDIwNjgsCisJMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAwNDAsIDB4N2M0OSwgMHg4MDAxLCAweDY4NDIsCisJMHg2MDE3LCAweDAwMGEsIDB4MDA3OCwgMHg3YzRiLCAweDIwMDksIDB4YTg4ZiwgMHgyMTA0LCAweGEwODQsCisJMHhmZjAwLCAweGEwODYsIDB4MTkwMCwgMHgwMGMwLCAweDdjNDksIDB4MTA3OCwgMHg3NTNkLCAweDAwNzgsCisJMHg3YzRiLCAweDEwNzgsIDB4N2I4MSwgMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDdkMGEsCisJMHgwMGMwLCAweDdjNjIsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgyMDAxLCAweDAwMDIsCisJMHgxMDc4LCAweDQ0M2YsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDVjNDUsCisJMHgwMDc4LCAweDdjOGUsIDB4MTA3OCwgMHg3YTA1LCAweDIwMDksIDB4YTg4ZSwgMHgyMTM0LCAweGE2YjQsCisJMHgwMGZmLCAweGE2ODYsIDB4MDAwNSwgMHgwMDQwLCAweDdjOGYsIDB4YTY4NiwgMHgwMDBiLCAweDAwNDAsCisJMHg3YzhjLCAweDIwMDksIDB4YTg4ZiwgMHgyMTA0LCAweGEwODQsIDB4ZmYwMCwgMHgwMGMwLCAweDdjN2MsCisJMHhhNjg2LCAweDAwMDksIDB4MDA0MCwgMHg3YzhmLCAweGEwODYsIDB4MTkwMCwgMHgwMGMwLCAweDdjOGMsCisJMHhhNjg2LCAweDAwMDksIDB4MDA0MCwgMHg3YzhmLCAweDIwMDEsIDB4MDAwNCwgMHgxMDc4LCAweDQ0M2YsCisJMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg3YzhlLCAweDEwNzgsIDB4N2I4MSwgMHgwMDdjLCAweDBkN2UsCisJMHg2MDEwLCAweDIwNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4N2M5ZCwgMHg2ODM4LCAweGQwZmMsCisJMHgwMDQwLCAweDdjOWQsIDB4MGQ3ZiwgMHgwMDc4LCAweDdjOGMsIDB4NjAxOCwgMHgyMDY4LCAweDY4NDAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMDQwLCAweDdjYWUsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTcsCisJMHgwMDBhLCAweDYwMDcsIDB4MDAxNiwgMHgwZDdmLCAweDAwNzgsIDB4N2M4ZSwgMHg2OGEwLCAweGEwODYsCisJMHgwMDdlLCAweDAwYzAsIDB4N2NiYiwgMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHgxMDc4LCAweDQxZjUsCisJMHgwZTdmLCAweDAwNzgsIDB4N2NiZCwgMHgxMDc4LCAweDI4MTMsIDB4MGQ3ZiwgMHgwMDc4LCAweDdjOGMsCisJMHgxMDc4LCAweDdkMGEsIDB4MDBjMCwgMHg3Y2QwLCAweDIwMDEsIDB4MDAwNCwgMHgxMDc4LCAweDQ0M2YsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAzLCAweDEwNzgsIDB4NWM0NSwgMHgwMDc4LCAweDdjZDQsCisJMHgxMDc4LCAweDdhMDUsIDB4MTA3OCwgMHg3YjgxLCAweDAwN2MsIDB4MTA3OCwgMHg3ZDBhLCAweDAwYzAsCisJMHg3Y2U1LCAweDIwMDEsIDB4MDAwOCwgMHgxMDc4LCAweDQ0M2YsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDA1LCAweDEwNzgsIDB4NWM0NSwgMHgwMDc4LCAweDdjZTcsIDB4MTA3OCwgMHg3YjgxLCAweDAwN2MsCisJMHgxMDc4LCAweDdkMGEsIDB4MDBjMCwgMHg3Y2Y4LCAweDIwMDEsIDB4MDAwYSwgMHgxMDc4LCAweDQ0M2YsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgwMDc4LCAweDdjZmEsCisJMHgxMDc4LCAweDdiODEsIDB4MDA3YywgMHgyMDA5LCAweGE4OGUsIDB4MjEwNCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDdkMDksIDB4MjAwOSwgMHhhODhmLCAweDIxMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsCisJMHgyYTAwLCAweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MGM3ZSwgMHgwMTdlLCAweGFjODgsCisJMHgwMDA2LCAweDIxNjQsIDB4MTA3OCwgMHg0NTEzLCAweDAxN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBmN2UsCisJMHgwZTdlLCAweDBkN2UsIDB4MDM3ZSwgMHgwMTdlLCAweDYwMTgsIDB4MjA2OCwgMHgyMDcxLCAweGEzMzIsCisJMHgyZTA0LCAweGEwODUsIDB4MDAwMywgMHgyMDcyLCAweDEwNzgsIDB4N2Q4YiwgMHgwMDQwLCAweDdkNTAsCisJMHgyMDAxLCAweGEzNTIsIDB4MjAwNCwgMHhkMGE0LCAweDAwNDAsIDB4N2QzOSwgMHhhMDA2LCAweDIwMjAsCisJMHgyMDA5LCAweDAwMmEsIDB4MTA3OCwgMHg5ZWMwLCAweDIwMDEsIDB4YTMwYywgMHgyMDBjLCAweGMxOTUsCisJMHgyMTAyLCAweDIwMTksIDB4MDAyYSwgMHgyMDA5LCAweDAwMDEsIDB4MTA3OCwgMHgyN2UyLCAweDIwNzEsCisJMHhhMzAwLCAweDEwNzgsIDB4MjYwZCwgMHgwYzdlLCAweDE1N2UsIDB4MjBhOSwgMHgwMDgxLCAweDIwMDksCisJMHgwMDdmLCAweDEwNzgsIDB4MjkyMSwgMHg4MTA4LCAweDAwZjAsIDB4N2Q0OSwgMHgxNTdmLCAweDBjN2YsCisJMHgxMDc4LCAweDdkMGQsIDB4NjgxMywgMHgwMGZmLCAweDY4MTcsIDB4ZmZmZSwgMHgyMDcxLCAweGE4ODAsCisJMHgyMDc5LCAweDAxMDAsIDB4MmUwNCwgMHhhMDg0LCAweDAwZmYsIDB4MjA2OSwgMHhhMzFhLCAweDIwNmEsCisJMHg3OGU2LCAweDAwN2UsIDB4OGU3MCwgMHgyZTA0LCAweDIwNjksIDB4YTMxYiwgMHgyMDZhLCAweDc4ZWEsCisJMHhhMDg0LCAweGZmMDAsIDB4MDE3ZiwgMHhhMTA1LCAweDIwMDksIDB4YTMyNSwgMHgyMDBhLCAweDIwNjksCisJMHhhODhlLCAweDIwNzEsIDB4YTU5YywgMHg2ODEwLCAweDIwNzIsIDB4NjgxNCwgMHg3MDA2LCAweDY4MTgsCisJMHg3MDBhLCAweDY4MWMsIDB4NzAwZSwgMHgxMDc4LCAweDhkYTksIDB4MjAwMSwgMHgwMDA2LCAweDEwNzgsCisJMHg0NDNmLCAweDEwNzgsIDB4MjgzOSwgMHgxMDc4LCAweDc1M2QsIDB4MDE3ZiwgMHgwMzdmLCAweDBkN2YsCisJMHgwZTdmLCAweDBmN2YsIDB4MDA3YywgMHgwMjdlLCAweDAzN2UsIDB4MGU3ZSwgMHgxNTdlLCAweDIwMTksCisJMHhhMzI1LCAweDIzMWMsIDB4ODNmZiwgMHgwMDQwLCAweDdkYjUsIDB4MjA3MSwgMHhhODgwLCAweDJlMTQsCisJMHhhMjk0LCAweDAwZmYsIDB4NzAwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTIwNSwgMHhhMzA2LCAweDAwYzAsCisJMHg3ZGI1LCAweDIwMTEsIDB4YTg5NiwgMHhhZDk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsCisJMHg3ZTU1LCAweDAwYzAsIDB4N2RiNSwgMHgyMDExLCAweGE4OWEsIDB4YWQ5OCwgMHgwMDA2LCAweDIwYTksCisJMHgwMDA0LCAweDEwNzgsIDB4N2U1NSwgMHgwMGMwLCAweDdkYjUsIDB4MTU3ZiwgMHgwZTdmLCAweDAzN2YsCisJMHgwMjdmLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLCAweGE4OGMsIDB4NzAwNCwgMHhhMDg2LCAweDAwMTQsCisJMHgwMGMwLCAweDdkZGQsIDB4NzAwOCwgMHhhMDg2LCAweDA4MDAsIDB4MDBjMCwgMHg3ZGRkLCAweDcwMGMsCisJMHhkMGVjLCAweDAwNDAsIDB4N2RkYiwgMHhhMDg0LCAweDBmMDAsIDB4YTA4NiwgMHgwMTAwLCAweDAwYzAsCisJMHg3ZGRiLCAweDcwMjQsIDB4ZDBhNCwgMHgwMGMwLCAweDdkZDgsIDB4ZDBhYywgMHgwMDQwLCAweDdkZGIsCisJMHhhMDA2LCAweDAwNzgsIDB4N2RkZCwgMHhhMDg1LCAweDAwMDEsIDB4MGU3ZiwgMHgwMDdjLCAweDBlN2UsCisJMHgwZDdlLCAweDBjN2UsIDB4MDc3ZSwgMHgwNTdlLCAweDA0N2UsIDB4MDI3ZSwgMHgwMDdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwgMHhhNWI0LCAweDI1MmMsIDB4MjAyMSwgMHhhNWJhLCAweDI0MjQsCisJMHgyMDYxLCAweGFhMDAsIDB4MjA3MSwgMHhhMzAwLCAweDcyNDQsIDB4NzA2MCwgMHhhMjAyLCAweDAwYzgsCisJMHg3ZTQzLCAweDEwNzgsIDB4OWVlNSwgMHgwMDQwLCAweDdlM2IsIDB4NjcxYywgMHhhNzg2LCAweDAwMDEsCisJMHgwMDQwLCAweDdlM2IsIDB4YTc4NiwgMHgwMDA3LCAweDAwNDAsIDB4N2UzYiwgMHgyNTAwLCAweGFjMDYsCisJMHgwMDQwLCAweDdlM2IsIDB4MjQwMCwgMHhhYzA2LCAweDAwNDAsIDB4N2UzYiwgMHgwYzdlLCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHg3ZTE2LCAweDEwNzgsIDB4MTc0OSwgMHhhNzg2LCAweDAwMDgsCisJMHgwMGMwLCAweDdlMjUsIDB4MTA3OCwgMHg4YzNiLCAweDAwYzAsIDB4N2UyNSwgMHgwYzdmLCAweDEwNzgsCisJMHg3YTA1LCAweDEwNzgsIDB4OGMwMSwgMHgwMDc4LCAweDdlM2IsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4N2UzOCwgMHhhNzg2LCAweDAwMDMsIDB4MDBjMCwgMHg3ZTRkLCAweDY4MzcsCisJMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDhiZjQsCisJMHgxMDc4LCAweDhjMDEsIDB4MGM3ZiwgMHhhY2UwLCAweDAwMTAsIDB4NzA1NCwgMHhhYzAyLCAweDAwYzgsCisJMHg3ZTQzLCAweDAwNzgsIDB4N2RmNCwgMHgxMjdmLCAweDAwN2YsIDB4MDI3ZiwgMHgwNDdmLCAweDA1N2YsCisJMHgwNzdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4YTc4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg3ZTJmLCAweDEwNzgsIDB4OWU3MCwgMHgwMDc4LCAweDdlMzgsIDB4MjIwYywgMHgyMzA0LCAweGExMDYsCisJMHgwMGMwLCAweDdlNjAsIDB4ODIxMCwgMHg4MzE4LCAweDAwZjAsIDB4N2U1NSwgMHhhMDA2LCAweDAwN2MsCisJMHgyMzA0LCAweGExMDIsIDB4MDA0OCwgMHg3ZTY4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDc4LCAweDdlNmEsCisJMHgyMDAxLCAweDAwMDAsIDB4YTE4ZCwgMHgwMDAxLCAweDAwN2MsIDB4NjAwNCwgMHhhMDhhLCAweDAwNDQsCisJMHgxMGM4LCAweDEzMjgsIDB4MTA3OCwgMHg4YzI3LCAweDAwNDAsIDB4N2U3YywgMHgxMDc4LCAweDhjM2IsCisJMHgwMDQwLCAweDdlODksIDB4MDA3OCwgMHg3ZTgyLCAweDEwNzgsIDB4MjgzOSwgMHgxMDc4LCAweDhjM2IsCisJMHgwMDQwLCAweDdlODksIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksCisJMHgwMDdjLCAweDEwNzgsIDB4N2EwNSwgMHgwMDc4LCAweDdlODIsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksCisJMHg3ZTkxLCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE0LCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE0LCAweDdlYTQsCisJMHg3ZWE0LCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE0LCAweDdlYTYsIDB4N2VhNiwgMHg3ZWE2LCAweDdlYTYsCisJMHg3ZWE0LCAweDdlYTQsIDB4N2VhNCwgMHg3ZWE2LCAweDEwNzgsIDB4MTMyOCwgMHg2MDBiLCAweGZmZmYsCisJMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgxMDc4LCAweDViZjgsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgxMDc4LCAweDYxMDksIDB4MTI3ZiwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMGMwLCAweDdlYmQsCisJMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgwMDc5LCAweDdmNDgsIDB4YTE4NiwgMHgwMDI3LCAweDAwYzAsCisJMHg3ZWRmLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDI4MTMsIDB4MGQ3ZSwgMHg2MTEwLCAweDIxNjgsCisJMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg3ZWQ5LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMjksCisJMHg2ODQ3LCAweDAwMDAsIDB4Njk0YywgMHhjMWM1LCAweDY5NGUsIDB4MTA3OCwgMHg0OTgyLCAweDEwNzgsCisJMHg4YmY0LCAweDBkN2YsIDB4MTA3OCwgMHg3NTNkLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweGExODYsCisJMHgwMDE0LCAweDAwYzAsIDB4N2VlOCwgMHg2MDA0LCAweGEwODIsIDB4MDA0MCwgMHgwMDc5LCAweDdmMTAsCisJMHhhMTg2LCAweDAwNDYsIDB4MDA0MCwgMHg3ZWY0LCAweGExODYsIDB4MDA0NSwgMHgwMDQwLCAweDdlZjQsCisJMHhhMTg2LCAweDAwNDcsIDB4MTBjMCwgMHgxMzI4LCAweDIwMDEsIDB4MDEwOSwgMHgyMDA0LCAweGQwODQsCisJMHgwMDQwLCAweDdmMGQsIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MDA3ZSwgMHgwMTdlLCAweDAyN2UsCisJMHgxMDc4LCAweDVhZDIsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2YsIDB4MTI3ZiwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAyLCAweDAwYzAsIDB4N2YwZCwgMHgwMDc4LCAweDdmODEsIDB4MTA3OCwgMHg3NTgzLCAweDAwN2MsCisJMHg3ZjI1LCAweDdmMjMsIDB4N2YyMywgMHg3ZjIzLCAweDdmMjMsIDB4N2YyMywgMHg3ZjIzLCAweDdmMjMsCisJMHg3ZjIzLCAweDdmMjMsIDB4N2YyMywgMHg3ZjQxLCAweDdmNDEsIDB4N2Y0MSwgMHg3ZjQxLCAweDdmMjMsCisJMHg3ZjQxLCAweDdmMjMsIDB4N2Y0MSwgMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDBkN2UsCisJMHg2MTEwLCAweDIxNjgsIDB4MTA3OCwgMHg4YTQ0LCAweDAwNDAsIDB4N2YzYiwgMHg2ODM3LCAweDAxMDMsCisJMHg2ODRiLCAweDAwMDYsIDB4Njg0NywgMHgwMDAwLCAweDY4NTAsIDB4YzBlYywgMHg2ODUyLCAweDEwNzgsCisJMHg0OTgyLCAweDEwNzgsIDB4OGJmNCwgMHgwZDdmLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksCisJMHgwMDdjLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDc1M2QsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsCisJMHg3ZjVkLCAweDdmNWIsIDB4N2Y1YiwgMHg3ZjViLCAweDdmNWIsIDB4N2Y1YiwgMHg3ZjViLCAweDdmNWIsCisJMHg3ZjViLCAweDdmNWIsIDB4N2Y1YiwgMHg3ZjZmLCAweDdmNmYsIDB4N2Y2ZiwgMHg3ZjZmLCAweDdmNWIsCisJMHg3ZjdhLCAweDdmNWIsIDB4N2Y2ZiwgMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDIwMDEsCisJMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDIsIDB4MTA3OCwgMHg2MTA5LCAweDYwMTAsCisJMHhhMDg4LCAweDAwMTMsIDB4MjEwNCwgMHhhMDg1LCAweDA0MDAsIDB4MjAwYSwgMHgwMDdjLCAweDEwNzgsCisJMHg2MDEwLCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDBmLCAweDEwNzgsCisJMHg2MTA5LCAweDAwN2MsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4NzUzZCwgMHgxMDc4LCAweDYxMDksCisJMHgwMDdjLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDdmODUsIDB4N2Y5OCwgMHg3Zjk4LCAweDdmOTgsCisJMHg3Zjk4LCAweDdmOTgsIDB4N2Y5YSwgMHg4MDk1LCAweDgwYjcsIDB4N2Y5OCwgMHg3Zjk4LCAweDdmOTgsCisJMHg3Zjk4LCAweDdmOTgsIDB4N2Y5OCwgMHg3Zjk4LCAweDdmOTgsIDB4N2Y5OCwgMHg3Zjk4LCAweDdmOTgsCisJMHgxMDc4LCAweDEzMjgsIDB4MGU3ZSwgMHgwZDdlLCAweDYwM2YsIDB4MDAwMCwgMHgyMDcxLCAweGE4ODAsCisJMHg3MTI0LCAweDYxMGEsIDB4MjA3MSwgMHhhODhjLCAweDYxMTAsIDB4MjE2OCwgMHg3NjE0LCAweGE2YjQsCisJMHgwZmZmLCAweDg2ZmYsIDB4MDA0MCwgMHg4MDU4LCAweGE2OGMsIDB4MGMwMCwgMHgwMDQwLCAweDdmZDEsCisJMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg3ZmNkLCAweDY4NGMsCisJMHhkMGFjLCAweDAwNDAsIDB4N2ZjZCwgMHg2MDI0LCAweGQwZGMsIDB4MDBjMCwgMHg3ZmNkLCAweDY4NTAsCisJMHhkMGJjLCAweDAwYzAsIDB4N2ZjZCwgMHg3MzE4LCAweDY4MTQsIDB4YTMwNiwgMHgwMGMwLCAweDgwNmYsCisJMHg3MzFjLCAweDY4MTAsIDB4YTMwNiwgMHgwMGMwLCAweDgwNmYsIDB4NzMxOCwgMHg2YjYyLCAweDczMWMsCisJMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg4MDA0LCAweGExODYsCisJMHgwMDI4LCAweDAwYzAsIDB4N2ZlMSwgMHgxMDc4LCAweDhjMTUsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsCisJMHg4MDA2LCAweGQ2ZGMsIDB4MDA0MCwgMHg3ZmZkLCAweDY4NGIsIDB4MDAxNSwgMHg2ODRjLCAweGQwYWMsCisJMHgwMDQwLCAweDdmZmIsIDB4NjkxNCwgMHg2YTEwLCAweDIxMDAsIDB4YTIwNSwgMHgwMDQwLCAweDdmZmIsCisJMHg3MDE4LCAweGExMDYsIDB4MDBjMCwgMHg3ZmY4LCAweDcwMWMsIDB4YTIwNiwgMHgwMDQwLCAweDdmZmIsCisJMHg2OTYyLCAweDZhNWUsIDB4YzZkYywgMHgwMDc4LCAweDgwMDYsIDB4ZDZkNCwgMHgwMDQwLCAweDgwMDQsCisJMHg2ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4MDA2LCAweDY4NGIsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsCisJMHg2ZTQ2LCAweGEwMWUsIDB4ZDZjNCwgMHgwMDQwLCAweDgwMmYsIDB4YTY4NiwgMHgwMTAwLCAweDAwYzAsCisJMHg4MDFhLCAweDIwMDEsIDB4YTg5OSwgMHgyMDA0LCAweGEwMDUsIDB4MDBjMCwgMHg4MDFhLCAweGM2YzQsCisJMHgwMDc4LCAweDdmYTksIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMDQwLCAweDgwMmYsCisJMHhhMzhhLCAweDAwMDksIDB4MDA0OCwgMHg4MDI2LCAweDIwMTksIDB4MDAwOCwgMHgwMzdlLCAweDIzMDgsCisJMHgyMDE5LCAweGE4OTgsIDB4YWQ5MCwgMHgwMDE5LCAweDEwNzgsIDB4ODczOSwgMHgwMzdmLCAweGQ2Y2MsCisJMHgwMDQwLCAweDgwODUsIDB4NzEyNCwgMHg2OTVhLCAweDgxZmYsIDB4MDA0MCwgMHg4MDg1LCAweGExOTIsCisJMHgwMDIxLCAweDAwYzgsIDB4ODA0NiwgMHgyMDcxLCAweGE4OTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsCisJMHhhZDkwLCAweDAwMWQsIDB4MTA3OCwgMHg4NzM5LCAweDAwNzgsIDB4ODA4NSwgMHg2ODM4LCAweGQwZmMsCisJMHgwMDQwLCAweDgwNGYsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsIDB4MDA3OCwgMHg4MDNiLCAweDBmN2UsCisJMHgyZDc4LCAweDEwNzgsIDB4ODZkMSwgMHgwZjdmLCAweDEwNzgsIDB4ODcyNiwgMHgwMDc4LCAweDgwODcsCisJMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg4MDc1LCAweDY4NGMsCisJMHhkMGFjLCAweDAwNDAsIDB4ODA3NSwgMHg2MDI0LCAweGQwZGMsIDB4MDBjMCwgMHg4MDc1LCAweDY4NTAsCisJMHhkMGJjLCAweDAwYzAsIDB4ODA3NSwgMHg2ODRjLCAweGQwZjQsIDB4MDBjMCwgMHg4MDc1LCAweDEwNzgsCisJMHg4Y2ZhLCAweDBkN2YsIDB4MGU3ZiwgMHgwMDc4LCAweDgwOTQsIDB4Njg0YiwgMHgwMDAwLCAweDY4MzcsCisJMHgwMTAzLCAweDZlNDYsIDB4Njg0YywgMHhkMGFjLCAweDAwNDAsIDB4ODA4NSwgMHg2ODEwLCAweDY5MTQsCisJMHhhMTE1LCAweDAwNDAsIDB4ODA4NSwgMHgxMDc4LCAweDgyMzMsIDB4MTA3OCwgMHg0OTgyLCAweDYyMTgsCisJMHgyMjY4LCAweDZhM2MsIDB4ODIxMSwgMHg2YTNlLCAweDEwNzgsIDB4OGNjNCwgMHgwZDdmLCAweDBlN2YsCisJMHgwMGMwLCAweDgwOTQsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsIDB4MGY3ZSwgMHg2MDAzLCAweDAwMDMsCisJMHgyMDc5LCAweGE4OGMsIDB4N2MwNCwgMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHg2MDEwLCAweDIwNzgsCisJMHg3ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg4MGE4LCAweDYwMDMsIDB4MDAwMiwgMHgwZjdmLCAweDAwN2MsCisJMHg3YzEyLCAweDdiMTYsIDB4N2UwYSwgMHg3ZDBlLCAweDBmN2YsIDB4NjAzZiwgMHgwMDAwLCAweDJjMTAsCisJMHgxMDc4LCAweDFjYWIsIDB4MTA3OCwgMHg1YzY0LCAweDEwNzgsIDB4NjFkMywgMHgwMDdjLCAweDIwMDEsCisJMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDQsIDB4NjExMCwgMHgyMGUxLCAweDAwMDUsCisJMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgxMDc4LCAweDE1ZWMsIDB4MDA3YywgMHhhMTgyLCAweDAwNDAsCisJMHgwMDc5LCAweDgwY2EsIDB4ODBkZCwgMHg4MGRkLCAweDgwZGQsIDB4ODBkZCwgMHg4MGRkLCAweDgwZGYsCisJMHg4MTgyLCAweDgwZGQsIDB4ODBkZCwgMHg4MTk4LCAweDgyMDksIDB4ODBkZCwgMHg4MGRkLCAweDgwZGQsCisJMHg4MGRkLCAweDgyMTgsIDB4ODBkZCwgMHg4MGRkLCAweDgwZGQsIDB4MTA3OCwgMHgxMzI4LCAweDA3N2UsCisJMHgwZjdlLCAweDBlN2UsIDB4MGQ3ZSwgMHgyMDcxLCAweGE4OGMsIDB4NjExMCwgMHgyMTc4LCAweDc2MTQsCisJMHhhNmI0LCAweDBmZmYsIDB4N2U0NiwgMHg3ZjRjLCAweGM3ZTUsIDB4N2Y0ZSwgMHg2MjE4LCAweDIyNjgsCisJMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLCAweDAwNDAsIDB4ODE3ZCwgMHhhNjk0LCAweGZmMDAsCisJMHhhMjg0LCAweDBjMDAsIDB4MDA0MCwgMHg4MTAwLCAweDcwMTgsIDB4Nzg2MiwgMHg3MDFjLCAweDc4NWUsCisJMHhhMjg0LCAweDAzMDAsIDB4MDA0MCwgMHg4MTdkLCAweDEwNzgsIDB4MTM4MSwgMHgxMDQwLCAweDEzMjgsCisJMHgyZDAwLCAweDc4NGEsIDB4N2Y0YywgMHhjN2NkLCAweDdmNGUsIDB4NjgzNywgMHgwMTAzLCAweDc4MzgsCisJMHg2ODNhLCAweDc4M2MsIDB4NjgzZSwgMHg3ODQwLCAweDY4NDIsIDB4NmU0NiwgMHhhNjhjLCAweDBjMDAsCisJMHgwMDQwLCAweDgxMWUsIDB4NzMxOCwgMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg4MTNhLCAweGExODYsIDB4MDAyOCwgMHgwMGMwLCAweDgxMmMsCisJMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwgMHg4MTNjLCAweGQ2ZGMsIDB4MDA0MCwgMHg4MTMzLCAweDY4NGIsCisJMHgwMDE1LCAweDAwNzgsIDB4ODEzYywgMHhkNmQ0LCAweDAwNDAsIDB4ODEzYSwgMHg2ODRiLCAweDAwMDcsCisJMHgwMDc4LCAweDgxM2MsIDB4Njg0YiwgMHgwMDAwLCAweDZmNGUsIDB4Nzg1MCwgMHg2ODUyLCAweDc4NTQsCisJMHg2ODU2LCAweGEwMWUsIDB4ZDZjNCwgMHgwMDQwLCAweDgxNWEsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsCisJMHg4M2ZmLCAweDAwNDAsIDB4ODE1YSwgMHhhMzhhLCAweDAwMDksIDB4MDA0OCwgMHg4MTUxLCAweDIwMTksCisJMHgwMDA4LCAweDAzN2UsIDB4MjMwOCwgMHgyMDE5LCAweGE4OTgsIDB4YWQ5MCwgMHgwMDE5LCAweDEwNzgsCisJMHg4NzM5LCAweDAzN2YsIDB4ZDZjYywgMHgwMDQwLCAweDgxN2QsIDB4NzEyNCwgMHg2OTVhLCAweDgxZmYsCisJMHgwMDQwLCAweDgxN2QsIDB4YTE5MiwgMHgwMDIxLCAweDAwYzgsIDB4ODE3MSwgMHgyMDcxLCAweGE4OTgsCisJMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MTA3OCwgMHg4NzM5LCAweDAwNzgsCisJMHg4MTdkLCAweDc4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDgxN2EsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsCisJMHgwMDc4LCAweDgxNjYsIDB4MmQ3OCwgMHgxMDc4LCAweDg2ZDEsIDB4MGQ3ZiwgMHgwZTdmLCAweDBmN2YsCisJMHgwNzdmLCAweDAwN2MsIDB4MGY3ZSwgMHg2MDAzLCAweDAwMDMsIDB4MjA3OSwgMHhhODhjLCAweDdjMDQsCisJMHg3YjAwLCAweDdlMGMsIDB4N2QwOCwgMHg2MDEwLCAweDIwNzgsIDB4N2MxMiwgMHg3YjE2LCAweDdlMGEsCisJMHg3ZDBlLCAweDBmN2YsIDB4MmMxMCwgMHgxMDc4LCAweDFjYWIsIDB4MTA3OCwgMHg2YzI2LCAweDAwN2MsCisJMHgwZDdlLCAweDBmN2UsIDB4MmM3OCwgMHgxMDc4LCAweDQ4OTMsIDB4MGY3ZiwgMHgwMDQwLCAweDgxYTQsCisJMHgyMDAxLCAweGE1YTIsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwMiwgMHgxMDc4LCAweDYwYjgsCisJMHgxMDc4LCAweDYxZDMsIDB4NjExMCwgMHgyMTY4LCAweDY5NGMsIDB4ZDFlNCwgMHgwMDQwLCAweDgyMDcsCisJMHhkMWNjLCAweDAwNDAsIDB4ODFkZSwgMHg2OTQ4LCAweDY4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDgxZDYsCisJMHgwMTdlLCAweDY4NGMsIDB4MDA3ZSwgMHg2ODUwLCAweDAwN2UsIDB4YWQ5MCwgMHgwMDBkLCAweGExOTgsCisJMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgxNTdlLCAweDIxYTgsIDB4MjMwNCwgMHgyMDEyLCAweDgzMTgsCisJMHg4MjEwLCAweDAwZjAsIDB4ODFjNSwgMHgxNTdmLCAweDAwN2YsIDB4Njg1MiwgMHgwMDdmLCAweDY4NGUsCisJMHgwMTdmLCAweDIxNjgsIDB4MTA3OCwgMHgxM2FhLCAweDAwNzgsIDB4ODIwMSwgMHgwMTdlLCAweDEwNzgsCisJMHgxM2FhLCAweDBkN2YsIDB4MTA3OCwgMHg4NzI2LCAweDAwNzgsIDB4ODIwMSwgMHg2ODM3LCAweDAxMDMsCisJMHg2OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsIDB4MDA0MCwgMHg4MWZkLCAweGEwODYsCisJMHgwMDI4LCAweDAwYzAsIDB4ODFlZiwgMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwgMHg4MWZmLCAweGQxZGMsCisJMHgwMDQwLCAweDgxZjYsIDB4Njg0YiwgMHgwMDE1LCAweDAwNzgsIDB4ODFmZiwgMHhkMWQ0LCAweDAwNDAsCisJMHg4MWZkLCAweDY4NGIsIDB4MDAwNywgMHgwMDc4LCAweDgxZmYsIDB4Njg0YiwgMHgwMDAwLCAweDEwNzgsCisJMHg0OTgyLCAweDEwNzgsIDB4OGNjNCwgMHgwMGMwLCAweDgyMDcsIDB4MTA3OCwgMHg3NTNkLCAweDBkN2YsCisJMHgwMDdjLCAweDIwMTksIDB4MDAwMSwgMHgxMDc4LCAweDZlNmMsIDB4NjAwMywgMHgwMDAyLCAweDIwMDEsCisJMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHgxMDc4LCAweDYwYjgsIDB4MTA3OCwgMHg2MWQzLCAweDAwN2MsCisJMHgxMDc4LCAweDYwYjgsIDB4MTA3OCwgMHgyODEzLCAweDBkN2UsIDB4NjExMCwgMHgyMTY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4ODIyZCwgMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDI5LCAweDY4NDcsCisJMHgwMDAwLCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDhiZjQsIDB4MGQ3ZiwgMHgxMDc4LCAweDc1M2QsCisJMHgxMDc4LCAweDYxZDMsIDB4MDA3YywgMHg2ODRiLCAweDAwMTUsIDB4ZDFmYywgMHgwMDQwLCAweDgyM2YsCisJMHg2ODRiLCAweDAwMDcsIDB4ODAwMiwgMHg4MDAwLCAweDgxMGEsIDB4YTE4OSwgMHgwMDAwLCAweDY5NjIsCisJMHg2ODVlLCAweDAwN2MsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4ODI0NiwgMHg4MjU5LCAweDgyNTksCisJMHg4MjU5LCAweDgyNTksIDB4ODI1OSwgMHg4MjViLCAweDgyNTksIDB4ODMzMywgMHg4MzNmLCAweDgyNTksCisJMHg4MjU5LCAweDgyNTksIDB4ODI1OSwgMHg4MjU5LCAweDgyNTksIDB4ODI1OSwgMHg4MjU5LCAweDgyNTksCisJMHg4MjU5LCAweDEwNzgsIDB4MTMyOCwgMHgwNzdlLCAweDBmN2UsIDB4MGU3ZSwgMHgwZDdlLCAweDIwNzEsCisJMHhhODhjLCAweDYxMTAsIDB4MjE3OCwgMHg3NjE0LCAweGE2YjQsIDB4MGZmZiwgMHgwZjdlLCAweDJjNzgsCisJMHgxMDc4LCAweDQ4OTMsIDB4MGY3ZiwgMHgwMDQwLCAweDgyN2UsIDB4YTY4NCwgMHgwMGZmLCAweDAwYzAsCisJMHg4MjdlLCAweDYwMjQsIDB4ZDBmNCwgMHgwMGMwLCAweDgyN2EsIDB4NzgwOCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMGMwLCAweDgyN2UsIDB4MTA3OCwgMHg4Y2ZhLCAweDAwNzgsIDB4ODMyZSwgMHg3ZTQ2LCAweDdmNGMsCisJMHhjN2U1LCAweDdmNGUsIDB4NjIxOCwgMHgyMjY4LCAweDZhM2MsIDB4ODIxMSwgMHg2YTNlLCAweDg2ZmYsCisJMHgwMDQwLCAweDgzMjMsIDB4YTY5NCwgMHhmZjAwLCAweGEyODQsIDB4MGMwMCwgMHgwMDQwLCAweDgyOTQsCisJMHg3MDE4LCAweDc4NjIsIDB4NzAxYywgMHg3ODVlLCAweGEyODQsIDB4MDMwMCwgMHgwMDQwLCAweDgzMjAsCisJMHhhNjg2LCAweDAxMDAsIDB4MDBjMCwgMHg4MmE2LCAweDIwMDEsIDB4YTg5OSwgMHgyMDA0LCAweGEwMDUsCisJMHgwMGMwLCAweDgyYTYsIDB4YzZjNCwgMHg3ZTQ2LCAweDAwNzgsIDB4ODI4NywgMHgxMDc4LCAweDEzODEsCisJMHgxMDQwLCAweDEzMjgsIDB4MmQwMCwgMHg3ODRhLCAweDdmNGMsIDB4YTdiZCwgMHgwMjAwLCAweDdmNGUsCisJMHg2ODM3LCAweDAxMDMsIDB4NzgzOCwgMHg2ODNhLCAweDc4M2MsIDB4NjgzZSwgMHg3ODQwLCAweDY4NDIsCisJMHg2ZTQ2LCAweGE2OGMsIDB4MGMwMCwgMHgwMDQwLCAweDgyYzEsIDB4NzMxOCwgMHg2YjYyLCAweDczMWMsCisJMHg2YjVlLCAweGE2OGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg4MmRkLCAweGExODYsCisJMHgwMDI4LCAweDAwYzAsIDB4ODJjZiwgMHg2ODRiLCAweDAwMWMsIDB4MDA3OCwgMHg4MmRmLCAweGQ2ZGMsCisJMHgwMDQwLCAweDgyZDYsIDB4Njg0YiwgMHgwMDE1LCAweDAwNzgsIDB4ODJkZiwgMHhkNmQ0LCAweDAwNDAsCisJMHg4MmRkLCAweDY4NGIsIDB4MDAwNywgMHgwMDc4LCAweDgyZGYsIDB4Njg0YiwgMHgwMDAwLCAweDZmNGUsCisJMHg3ODUwLCAweDY4NTIsIDB4Nzg1NCwgMHg2ODU2LCAweGEwMWUsIDB4ZDZjNCwgMHgwMDQwLCAweDgyZmQsCisJMHg3MzI4LCAweDczMmMsIDB4NmI1NiwgMHg4M2ZmLCAweDAwNDAsIDB4ODJmZCwgMHhhMzhhLCAweDAwMDksCisJMHgwMDQ4LCAweDgyZjQsIDB4MjAxOSwgMHgwMDA4LCAweDAzN2UsIDB4MjMwOCwgMHgyMDE5LCAweGE4OTgsCisJMHhhZDkwLCAweDAwMTksIDB4MTA3OCwgMHg4NzM5LCAweDAzN2YsIDB4ZDZjYywgMHgwMDQwLCAweDgzMjAsCisJMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwgMHgwMDQwLCAweDgzMjAsIDB4YTE5MiwgMHgwMDIxLCAweDAwYzgsCisJMHg4MzE0LCAweDIwNzEsIDB4YTg5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsCisJMHgxMDc4LCAweDg3MzksIDB4MDA3OCwgMHg4MzIwLCAweDc4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDgzMWQsCisJMHgyMDA5LCAweDAwMjAsIDB4Njk1YSwgMHgwMDc4LCAweDgzMDksIDB4MmQ3OCwgMHgxMDc4LCAweDg2ZDEsCisJMHhkNmRjLCAweDAwYzAsIDB4ODMyNiwgMHhhMDA2LCAweDAwNzgsIDB4ODMyYywgMHgyMDAxLCAweDAwMDEsCisJMHgyMDcxLCAweGE4OGMsIDB4NzIxOCwgMHg3MzFjLCAweDEwNzgsIDB4MTY0NSwgMHgwZDdmLCAweDBlN2YsCisJMHgwZjdmLCAweDA3N2YsIDB4MDA3YywgMHgyMDAxLCAweGE1YTIsIDB4MjAwNCwgMHg2MDNlLCAweDIwZTEsCisJMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDEwNzgsIDB4MTVlYywgMHgwMDdjLCAweDIwMDEsCisJMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHgwZDdlLCAweDYwMDMsIDB4MDAwMiwgMHg2MTEwLCAweDIxNjgsCisJMHg2OTRjLCAweGQxZTQsIDB4MDA0MCwgMHg4NDZiLCAweDYwM2YsIDB4MDAwMCwgMHgwZjdlLCAweDJjNzgsCisJMHgxMDc4LCAweDQ4OTMsIDB4MGY3ZiwgMHgwMDQwLCAweDgzODUsIDB4NjgxNCwgMHg2OTEwLCAweGExMTUsCisJMHgwMDQwLCAweDgzODUsIDB4NmE2MCwgMHhhMjA2LCAweDAwYzAsIDB4ODM2MiwgMHg2ODVjLCAweGExMDYsCisJMHgwMDQwLCAweDgzODUsIDB4Njg0YywgMHhjMGU0LCAweDY4NGUsIDB4Njg0NywgMHgwMDAwLCAweDY4NjMsCisJMHgwMDAwLCAweDY4NWYsIDB4MDAwMCwgMHg2MDI0LCAweGQwZjQsIDB4MDBjMCwgMHg4MzdhLCAweDY5N2MsCisJMHg2ODEwLCAweGExMDIsIDB4NjAzYSwgMHg2OTgwLCAweDY4MTQsIDB4YTEwMywgMHg2MDM2LCAweDYwMjQsCisJMHhjMGY1LCAweDYwMjYsIDB4MGQ3ZSwgMHg2MDE4LCAweDIwNjgsIDB4NjgzYywgMHg4MDAwLCAweDY4M2UsCisJMHgwZDdmLCAweDEwNzgsIDB4OGNmYSwgMHgwMDc4LCAweDg0NmIsIDB4Njk0YywgMHhkMWNjLCAweDAwNDAsCisJMHg4NDMwLCAweDY5NDgsIDB4NjgzOCwgMHhkMGZjLCAweDAwNDAsIDB4ODNlYSwgMHgwMTdlLCAweDY4NGMsCisJMHgwMDdlLCAweDY4NTAsIDB4MDA3ZSwgMHgwZjdlLCAweDIxNzgsIDB4Nzk0NCwgMHhhMTg0LCAweDAwZmYsCisJMHhhMGI2LCAweDAwMDIsIDB4MDA0MCwgMHg4M2JmLCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDgzYTYsCisJMHg2ODRiLCAweDAwMWMsIDB4Nzg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODNjYSwgMHhkMWRjLCAweDAwNDAsCisJMHg4M2I2LCAweDY4NGIsIDB4MDAxNSwgMHg3ODRiLCAweDAwMTUsIDB4MTA3OCwgMHg4ZWE1LCAweDAwNDAsCisJMHg4M2I0LCAweDc5NDQsIDB4YzFkYywgMHg3OTQ2LCAweDAwNzgsIDB4ODNjYSwgMHhkMWQ0LCAweDAwNDAsCisJMHg4M2JmLCAweDY4NGIsIDB4MDAwNywgMHg3ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4M2NhLCAweDY4NGMsCisJMHhkMGFjLCAweDAwNDAsIDB4ODNjYSwgMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMDQwLCAweDgzY2EsCisJMHgxMDc4LCAweDgyMzMsIDB4Njg0OCwgMHg3ODRhLCAweDY4NjAsIDB4Nzg2MiwgMHg2ODVjLCAweDc4NWUsCisJMHhhZDkwLCAweDAwMGQsIDB4YWY5OCwgMHgwMDBkLCAweDIwMDksIDB4MDAyMCwgMHgxNTdlLCAweDIxYTgsCisJMHgyMzA0LCAweDIwMTIsIDB4ODMxOCwgMHg4MjEwLCAweDAwZjAsIDB4ODNkOCwgMHgxNTdmLCAweDBmN2YsCisJMHgwMDdmLCAweDY4NTIsIDB4MDA3ZiwgMHg2ODRlLCAweDAxN2YsIDB4MjE2OCwgMHgxMDc4LCAweDEzYWEsCisJMHgwMDc4LCAweDg0NjUsIDB4MDE3ZSwgMHgwZjdlLCAweDIxNzgsIDB4Nzk0NCwgMHhhMTg0LCAweDAwZmYsCisJMHhhMGI2LCAweDAwMDIsIDB4MDA0MCwgMHg4NDE3LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDgzZmUsCisJMHg2ODRiLCAweDAwMWMsIDB4Nzg0YiwgMHgwMDFjLCAweDAwNzgsIDB4ODQyMiwgMHhkMWRjLCAweDAwNDAsCisJMHg4NDBlLCAweDY4NGIsIDB4MDAxNSwgMHg3ODRiLCAweDAwMTUsIDB4MTA3OCwgMHg4ZWE1LCAweDAwNDAsCisJMHg4NDBjLCAweDc5NDQsIDB4YzFkYywgMHg3OTQ2LCAweDAwNzgsIDB4ODQyMiwgMHhkMWQ0LCAweDAwNDAsCisJMHg4NDE3LCAweDY4NGIsIDB4MDAwNywgMHg3ODRiLCAweDAwMDcsIDB4MDA3OCwgMHg4NDIyLCAweDY4NGMsCisJMHhkMGFjLCAweDAwNDAsIDB4ODQyMiwgMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMDQwLCAweDg0MjIsCisJMHgxMDc4LCAweDgyMzMsIDB4Njg2MCwgMHg3ODYyLCAweDY4NWMsIDB4Nzg1ZSwgMHg2ODRjLCAweDc4NGUsCisJMHgwZjdmLCAweDEwNzgsIDB4MTNhYSwgMHgwZDdmLCAweDEwNzgsIDB4ODcyNiwgMHgwMDc4LCAweDg0NjUsCisJMHg2ODM3LCAweDAxMDMsIDB4Njk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwgMHgwMDAyLCAweDAwNDAsCisJMHg4NDU2LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLCAweDg0NDEsIDB4Njg0YiwgMHgwMDFjLCAweDAwNzgsCisJMHg4NDYzLCAweGQxZGMsIDB4MDA0MCwgMHg4NDRmLCAweDY4NGIsIDB4MDAxNSwgMHgxMDc4LCAweDhlYTUsCisJMHgwMDQwLCAweDg0NGQsIDB4Njk0NCwgMHhjMWRjLCAweDY5NDYsIDB4MDA3OCwgMHg4NDYzLCAweGQxZDQsCisJMHgwMDQwLCAweDg0NTYsIDB4Njg0YiwgMHgwMDA3LCAweDAwNzgsIDB4ODQ2MywgMHg2ODRiLCAweDAwMDAsCisJMHg2ODRjLCAweGQwYWMsIDB4MDA0MCwgMHg4NDYzLCAweDY4MTAsIDB4NjkxNCwgMHhhMTE1LCAweDAwNDAsCisJMHg4NDYzLCAweDEwNzgsIDB4ODIzMywgMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4Y2M0LCAweDAwYzAsCisJMHg4NDZiLCAweDEwNzgsIDB4NzUzZCwgMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHg2MDEwLCAweDAwNzgsCisJMHg4NDczLCAweDEwNzgsIDB4NjBiOCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg4NDkyLCAweDBkN2UsCisJMHg2MTEwLCAweDIxNjgsIDB4NjgzNywgMHgwMTAzLCAweDIwMDksIDB4YTMwYywgMHgyMTBjLCAweGQxOGMsCisJMHgwMGMwLCAweDg0OWQsIDB4ZDE4NCwgMHgwMGMwLCAweDg0OTksIDB4NjEwOCwgMHg2OTRhLCAweGExOGUsCisJMHgwMDI5LCAweDAwYzAsIDB4ODQ4ZCwgMHgxMDc4LCAweGExODEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsCisJMHg0OTgyLCAweDBkN2YsIDB4MTA3OCwgMHg3NTNkLCAweDEwNzgsIDB4NjEwOSwgMHgxMDc4LCAweDYxZDMsCisJMHgwMDdjLCAweDY4NGIsIDB4MDAwNCwgMHgwMDc4LCAweDg0OGQsIDB4Njg0YiwgMHgwMDA0LCAweDAwNzgsCisJMHg4NDhkLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDg0YTUsIDB4ODRiOCwgMHg4NGI4LCAweDg0YjgsCisJMHg4NGI4LCAweDg0YjgsIDB4ODRiYSwgMHg4NGI4LCAweDg0YmQsIDB4ODRiOCwgMHg4NGI4LCAweDg0YjgsCisJMHg4NGI4LCAweDg0YjgsIDB4ODRiOCwgMHg4NGI4LCAweDg0YjgsIDB4ODRiOCwgMHg4NGI4LCAweDg0YjgsCisJMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsIDB4MDA3ZSwgMHgwMjdlLCAweGEwMTYsCisJMHgxMDc4LCAweDE1ZWMsIDB4MDI3ZiwgMHgwMDdmLCAweDAwN2MsIDB4YTE4MiwgMHgwMDg1LCAweDAwNzksCisJMHg4NGM5LCAweDg0ZDIsIDB4ODRkMCwgMHg4NGQwLCAweDg0ZGUsIDB4ODRkMCwgMHg4NGQwLCAweDg0ZDAsCisJMHgxMDc4LCAweDEzMjgsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1YmY4LCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg2MTA5LCAweDEyN2YsIDB4MDA3YywgMHgwMjdlLCAweDA1N2UsCisJMHgwZDdlLCAweDBlN2UsIDB4MjA3MSwgMHhhODgwLCAweDcyMjQsIDB4NjIxMiwgMHg3MjIwLCAweDEwNzgsCisJMHg4YTMwLCAweDAwNDAsIDB4ODUwMywgMHgyMjY4LCAweDY4MDAsIDB4YTA4NiwgMHgwMDAwLCAweDAwNDAsCisJMHg4NTAzLCAweDYwMTgsIDB4NmQxOCwgMHhhNTJlLCAweDAwYzAsIDB4ODUwMywgMHgwYzdlLCAweDJkNjAsCisJMHgxMDc4LCAweDg3NGEsIDB4MGM3ZiwgMHgwMDQwLCAweDg1MDMsIDB4NjgwMywgMHgwMDAyLCAweDYwMDcsCisJMHgwMDg2LCAweDAwNzgsIDB4ODUwNSwgMHg2MDA3LCAweDAwODcsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwZjdlLCAweDIyNzgsIDB4MTA3OCwgMHg0ODkzLCAweDBmN2YsCisJMHgwMDQwLCAweDg1MWQsIDB4NjgyNCwgMHhkMGVjLCAweDAwNDAsIDB4ODUxZCwgMHgwYzdlLCAweDIyNjAsCisJMHg2MDNmLCAweDAwMDAsIDB4MTA3OCwgMHg4Y2ZhLCAweDBjN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDA1N2YsCisJMHgwMjdmLCAweDAwN2MsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsIDB4ODUzMywgMHg2MDA0LCAweGEwOGEsCisJMHgwMDg1LCAweDEwNDgsIDB4MTMyOCwgMHhhMDhhLCAweDAwOGMsIDB4MTBjOCwgMHgxMzI4LCAweGEwODIsCisJMHgwMDg1LCAweDAwNzksIDB4ODU0MiwgMHhhMTg2LCAweDAwMjcsIDB4MDA0MCwgMHg4NTNiLCAweGExODYsCisJMHgwMDE0LCAweDEwYzAsIDB4MTMyOCwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg2MTA5LCAweDAwN2MsIDB4ODU0OSwgMHg4NTRiLCAweDg1NGIsIDB4ODU0OSwgMHg4NTQ5LCAweDg1NDksCisJMHg4NTQ5LCAweDEwNzgsIDB4MTMyOCwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg2MTA5LCAweDAwN2MsIDB4YTE4NiwgMHgwMDEzLCAweDAwYzAsIDB4ODU1YywgMHg2MDA0LCAweGEwODIsCisJMHgwMDg1LCAweDIwMDgsIDB4MDA3OCwgMHg4NTk3LCAweGExODYsIDB4MDAyNywgMHgwMGMwLCAweDg1N2YsCisJMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHgyODEzLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4ODU3NSwgMHg2ODM3LCAweDAxMDMsIDB4Njg0NywgMHgwMDAwLCAweDY4NGIsCisJMHgwMDI5LCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDhiZjQsIDB4MGQ3ZiwgMHgxMDc4LCAweDc1M2QsCisJMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgxMDc4LCAweDc1ODMsIDB4MDA3OCwgMHg4NTdhLCAweGExODYsCisJMHgwMDE0LCAweDAwYzAsIDB4ODU3YiwgMHgxMDc4LCAweDYwMTAsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsCisJMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg4NTc1LCAweDY4MzcsIDB4MDEwMywgMHg2ODQ3LCAweDAwMDAsCisJMHg2ODRiLCAweDAwMDYsIDB4Njg1MCwgMHhjMGVjLCAweDY4NTIsIDB4MDA3OCwgMHg4NTcxLCAweDAwNzksCisJMHg4NTk5LCAweDg1YTIsIDB4ODVhMCwgMHg4NWEwLCAweDg1YTAsIDB4ODVhMCwgMHg4NWEwLCAweDg1YmQsCisJMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDYwMzAsIDB4YTA4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMTg2LCAweDAwMzksIDB4MDA0MCwgMHg4NWIwLCAweGExODYsIDB4MDAzNSwgMHgwMGMwLCAweDg1YjQsCisJMHgyMDAxLCAweGE1YTAsIDB4MDA3OCwgMHg4NWI2LCAweDIwMDEsIDB4YTVhMSwgMHgyMDA0LCAweDYwMTYsCisJMHg2MDAzLCAweDAwMGMsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MTA3OCwgMHg2MDEwLCAweDYwMzAsCisJMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzksIDB4MDA0MCwgMHg4NWNiLCAweGExODYsCisJMHgwMDM1LCAweDAwYzAsIDB4ODVjZiwgMHgyMDAxLCAweGE1YTAsIDB4MDA3OCwgMHg4NWQxLCAweDIwMDEsCisJMHhhNWExLCAweDIwMDQsIDB4NjAxNiwgMHg2MDAzLCAweDAwMGUsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsCisJMHhhMTgyLCAweDAwOGMsIDB4MDBjOCwgMHg4NWUyLCAweGExODIsIDB4MDA4NSwgMHgwMDQ4LCAweDg1ZTIsCisJMHgwMDc5LCAweDg1ZTUsIDB4MTA3OCwgMHg3NTgzLCAweDAwN2MsIDB4ODVlYywgMHg4NWVjLCAweDg1ZWMsCisJMHg4NWVjLCAweDg1ZWUsIDB4ODY0MywgMHg4NWVjLCAweDEwNzgsIDB4MTMyOCwgMHgwZjdlLCAweDJjNzgsCisJMHgxMDc4LCAweDQ4OTMsIDB4MGY3ZiwgMHgwMDQwLCAweDg2MDEsIDB4NjAzMCwgMHhhMDhjLCAweGZmMDAsCisJMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMDQwLCAweDg2NWEsIDB4YTE4NiwgMHgwMDM1LCAweDAwNDAsCisJMHg4NjVhLCAweDBkN2UsIDB4MTA3OCwgMHg4YmY0LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDg2MjUsCisJMHg2MDEwLCAweDIwNjgsIDB4NjgzNywgMHgwMTAzLCAweDY4NTAsIDB4ZDBiNCwgMHgwMDQwLCAweDg2MTYsCisJMHg2ODRiLCAweDAwMDYsIDB4YzBlYywgMHg2ODUyLCAweDAwNzgsIDB4ODYyMSwgMHhkMGJjLCAweDAwNDAsCisJMHg4NjFkLCAweDY4NGIsIDB4MDAwMiwgMHgwMDc4LCAweDg2MjEsIDB4Njg0YiwgMHgwMDA1LCAweDEwNzgsCisJMHg4Y2MwLCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDQ5ODIsIDB4MmM2OCwgMHgxMDc4LCAweDc0ZDcsCisJMHgwMDQwLCAweDg2M2UsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHgyMDA5LCAweGE4OGUsCisJMHgyMTBjLCAweDYxMzYsIDB4MjAwOSwgMHhhODhmLCAweDIxMGMsIDB4NjEzYSwgMHg2OTE4LCAweDYxMWEsCisJMHg2OTIwLCAweDYxMjIsIDB4NjAxZiwgMHgwMDAxLCAweDEwNzgsIDB4NWJmOCwgMHgyZDYwLCAweDEwNzgsCisJMHg3NTNkLCAweDBkN2YsIDB4MDA3YywgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0ODkzLCAweDBmN2YsCisJMHgwMDQwLCAweDg2ODAsIDB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzUsCisJMHgwMDQwLCAweDg2NWEsIDB4YTE4NiwgMHgwMDFlLCAweDAwNDAsIDB4ODY1YSwgMHhhMTg2LCAweDAwMzksCisJMHgwMGMwLCAweDg2ODAsIDB4MGQ3ZSwgMHgyYzY4LCAweDEwNzgsIDB4OGVmNSwgMHgwMGMwLCAweDg2YTQsCisJMHgxMDc4LCAweDc0ZDcsIDB4MDA0MCwgMHg4NjdkLCAweDYxMDYsIDB4NjAwMywgMHgwMDAxLCAweDYwMWYsCisJMHgwMDAxLCAweDY5MTgsIDB4NjExYSwgMHg2OTI4LCAweDYxMmEsIDB4NjkyYywgMHg2MTJlLCAweDY5MzAsCisJMHhhMThjLCAweDAwZmYsIDB4NjEzMiwgMHg2OTM0LCAweDYxMzYsIDB4NjkzOCwgMHg2MTNhLCAweDY5MjAsCisJMHg2MTIyLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MmQ2MCwgMHgwMDc4LCAweDg2YTQsCisJMHgwZDdlLCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg4NmE0LCAweDY4MzcsCisJMHgwMTAzLCAweDY4NTAsIDB4ZDBiNCwgMHgwMDQwLCAweDg2OTMsIDB4YzBlYywgMHg2ODUyLCAweDY4NGIsCisJMHgwMDA2LCAweDAwNzgsIDB4ODY5ZSwgMHhkMGJjLCAweDAwNDAsIDB4ODY5YSwgMHg2ODRiLCAweDAwMDIsCisJMHgwMDc4LCAweDg2OWUsIDB4Njg0YiwgMHgwMDA1LCAweDEwNzgsIDB4OGNjMCwgMHg2ODQ3LCAweDAwMDAsCisJMHgxMDc4LCAweDQ5ODIsIDB4MTA3OCwgMHg4YmY0LCAweDBkN2YsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsCisJMHgwMTdlLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDg2YjgsCisJMHg2ODM3LCAweDAxMDMsIDB4Njg0YiwgMHgwMDI4LCAweDY4NDcsIDB4MDAwMCwgMHgxMDc4LCAweDQ5ODIsCisJMHgwZDdmLCAweDAxN2YsIDB4YTE4NiwgMHgwMDEzLCAweDAwNDAsIDB4ODZjYSwgMHhhMTg2LCAweDAwMTQsCisJMHgwMDQwLCAweDg2Y2EsIDB4YTE4NiwgMHgwMDI3LCAweDAwNDAsIDB4ODZjYSwgMHgxMDc4LCAweDc1ODMsCisJMHgwMDc4LCAweDg2ZDAsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LCAweDYxMDksCisJMHgwMDdjLCAweDA1N2UsIDB4MDY3ZSwgMHgwZDdlLCAweDBmN2UsIDB4MjAyOSwgMHgwMDAxLCAweGExODIsCisJMHgwMTAxLCAweDAwYzgsIDB4ODZkZCwgMHgwMDc4LCAweDg2ZGYsIDB4MjAwOSwgMHgwMTAwLCAweDIxMzAsCisJMHgyMDY5LCAweGE4OTgsIDB4ODMxYywgMHgyMzAwLCAweGFkMTgsIDB4MjAwOSwgMHgwMDIwLCAweGFmOTAsCisJMHgwMDFkLCAweDEwNzgsIDB4ODczOSwgMHhhNmIyLCAweDAwMjAsIDB4NzgwNCwgMHhhMDZkLCAweDAwNDAsCisJMHg4NmYzLCAweDEwNzgsIDB4MTNhYSwgMHgxMDc4LCAweDEzODEsIDB4MDA0MCwgMHg4NzFkLCAweDg1MjgsCisJMHg2ODM3LCAweDAxMTAsIDB4NjgzYiwgMHgwMDAwLCAweDJkMjAsIDB4N2MwNiwgMHhhNjhhLCAweDAwM2QsCisJMHgwMGM4LCAweDg3MDksIDB4MjYwOCwgMHhhZDkwLCAweDAwMGYsIDB4MTA3OCwgMHg4NzM5LCAweDAwNzgsCisJMHg4NzFkLCAweGE2YjIsIDB4MDAzYywgMHgyMDA5LCAweDAwM2MsIDB4MmQ3OCwgMHhhZDkwLCAweDAwMGYsCisJMHgxMDc4LCAweDg3MzksIDB4MDA3OCwgMHg4NmYzLCAweDBmN2YsIDB4ODUyZiwgMHhhNWFkLCAweDAwMDMsCisJMHg3ZDM2LCAweGE1YWMsIDB4MDAwMCwgMHgwMDc4LCAweDg3MjIsIDB4MGY3ZiwgMHg4NTJmLCAweGE1YWQsCisJMHgwMDAzLCAweDdkMzYsIDB4MGQ3ZiwgMHgwNjdmLCAweDA1N2YsIDB4MDA3YywgMHgwZjdlLCAweDhkZmYsCisJMHgwMDQwLCAweDg3MzcsIDB4NjgwNCwgMHhhMDdkLCAweDAwNDAsIDB4ODczNSwgMHg2ODA3LCAweDAwMDAsCisJMHgxMDc4LCAweDQ5ODIsIDB4MmY2OCwgMHgwMDc4LCAweDg3MmEsIDB4MTA3OCwgMHg0OTgyLCAweDBmN2YsCisJMHgwMDdjLCAweDE1N2UsIDB4YTE4NCwgMHgwMDAxLCAweDAwNDAsIDB4ODczZiwgMHg4MTA4LCAweDgxMGMsCisJMHgyMWE4LCAweDIzMDQsIDB4ODAwNywgMHgyMDEyLCAweDgzMTgsIDB4ODIxMCwgMHgwMGYwLCAweDg3NDEsCisJMHgxNTdmLCAweDAwN2MsIDB4MDY3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDMxLCAweDAwMDEsCisJMHg2MDFjLCAweGEwODQsIDB4MDAwZiwgMHgxMDc5LCAweDg3NjYsIDB4MTI3ZiwgMHgwNjdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwNjdlLCAweDIwMzEsIDB4MDAwMCwgMHg2MDFjLCAweGEwODQsCisJMHgwMDBmLCAweDEwNzksIDB4ODc2NiwgMHgwNjdmLCAweDEyN2YsIDB4MDA3YywgMHg4NzgwLCAweDg3NmUsCisJMHg4NzdiLCAweDg3OWMsIDB4ODc2ZSwgMHg4NzdiLCAweDg3OWMsIDB4ODc3YiwgMHgxMDc4LCAweDEzMjgsCisJMHgwMzdlLCAweDIwMTksIDB4MDAxMCwgMHgxMDc4LCAweDlhNmEsIDB4NjAxZiwgMHgwMDA2LCAweDYwMDMsCisJMHgwMDA3LCAweDAzN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwN2MsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsCisJMHgwZDdlLCAweDg2ZmYsIDB4MDBjMCwgMHg4Nzk3LCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsCisJMHgwMDQwLCAweDg3OTksIDB4YTAwZSwgMHgyMDAxLCAweDAwMDUsIDB4MTA3OCwgMHg0YTYwLCAweDEwNzgsCisJMHg4Y2MwLCAweDEwNzgsIDB4NDk4MiwgMHgxMDc4LCAweDc1M2QsIDB4YTA4NSwgMHgwMDAxLCAweDBkN2YsCisJMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4Nzk3LCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLCAweDEwYzgsCisJMHgxMzI4LCAweDEwNzksIDB4ODdhNCwgMHgwMDdjLCAweDg3YjQsIDB4ODdkNCwgMHg4N2I2LCAweDg3ZjcsCisJMHg4N2QwLCAweDg3YjQsIDB4ODc3YiwgMHg4NzgwLCAweDg3ODAsIDB4ODc3YiwgMHg4NzdiLCAweDg3N2IsCisJMHg4NzdiLCAweDg3N2IsIDB4ODc3YiwgMHg4NzdiLCAweDEwNzgsIDB4MTMyOCwgMHg4NmZmLCAweDAwYzAsCisJMHg4N2NkLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsIDB4OGE0NCwgMHgwMDQwLCAweDg3YzIsCisJMHgxMDc4LCAweDhjYzAsIDB4MGQ3ZiwgMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsCisJMHgwMDAyLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsCisJMHgxMDc4LCAweDE3NDksIDB4MDA3OCwgMHg4N2I2LCAweDBlN2UsIDB4MjA3MSwgMHhhNWFiLCAweDcwMjQsCisJMHhhYzA2LCAweDAwYzAsIDB4ODdkZCwgMHgxMDc4LCAweDZkZGEsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg4N2VmLCAweDA4N2UsIDB4MDk3ZSwgMHgyMDQ5LCAweDAwMDEsCisJMHgyYzQwLCAweDEwNzgsIDB4NzA1OCwgMHgwOTdmLCAweDA4N2YsIDB4MDA3OCwgMHg4N2YxLCAweDEwNzgsCisJMHg2Y2QyLCAweDBlN2YsIDB4MDBjMCwgMHg4N2I2LCAweDEwNzgsIDB4ODc3YiwgMHgwMDdjLCAweDAzN2UsCisJMHgwZTdlLCAweDIwNzEsIDB4YTVhYiwgMHg3MDNjLCAweGFjMDYsIDB4MDBjMCwgMHg4ODA3LCAweDIwMTksCisJMHgwMDAwLCAweDEwNzgsIDB4NmU2YywgMHgwZTdmLCAweDAzN2YsIDB4MDA3OCwgMHg4N2I2LCAweDEwNzgsCisJMHg3MTlhLCAweDBlN2YsIDB4MDM3ZiwgMHgwMGMwLCAweDg3YjYsIDB4MTA3OCwgMHg4NzdiLCAweDAwN2MsCisJMHgwYzdlLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDEwNzksIDB4ODgxOCwgMHgwYzdmLCAweDAwN2MsCisJMHg4ODI3LCAweDg4OTUsIDB4ODljZCwgMHg4ODMyLCAweDhjMDEsIDB4ODgyNywgMHg5YTViLCAweDc1M2QsCisJMHg4ODk1LCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDg4MjcsIDB4MTA3OCwgMHg3YTA1LCAweDAwN2MsCisJMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg2MTA5LCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweDYwMTcsCisJMHgwMDAxLCAweDAwN2MsIDB4NjAxMCwgMHhhMDgwLCAweDAwMTksIDB4MmMwMiwgMHg2MDAwLCAweGEwOGEsCisJMHgwMDEwLCAweDEwYzgsIDB4MTMyOCwgMHgxMDc5LCAweDg4M2UsIDB4MDA3YywgMHg4ODRlLCAweDg4NTAsCisJMHg4ODcyLCAweDg4ODQsIDB4ODg5MSwgMHg4ODRlLCAweDg4MjcsIDB4ODgyNywgMHg4ODI3LCAweDg4ODQsCisJMHg4ODg0LCAweDg4NGUsIDB4ODg0ZSwgMHg4ODRlLCAweDg4NGUsIDB4ODg4ZSwgMHgxMDc4LCAweDEzMjgsCisJMHgwZTdlLCAweDYwMTAsIDB4MjA3MCwgMHg3MDUwLCAweGMwYjUsIDB4NzA1MiwgMHgyMDcxLCAweGE1YWIsCisJMHg3MDI0LCAweGFjMDYsIDB4MDA0MCwgMHg4ODZlLCAweDEwNzgsIDB4NmNkMiwgMHg2MDA3LCAweDAwODUsCisJMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDIwMDEsIDB4YTVhMSwgMHgyMDA0LCAweDYwMTYsCisJMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDBlN2YsIDB4MDA3YywgMHg2MDE3LCAweDAwMDEsCisJMHgwMDc4LCAweDg4NmMsIDB4MGQ3ZSwgMHg2MDEwLCAweDIwNjgsIDB4Njg1MCwgMHhjMGI1LCAweDY4NTIsCisJMHgwZDdmLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDEwNzgsCisJMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweDBkN2UsIDB4NjAxNywgMHgwMDAxLCAweDYwMTAsCisJMHgyMDY4LCAweDY4NTAsIDB4YzBiNSwgMHg2ODUyLCAweDBkN2YsIDB4MDA3YywgMHgxMDc4LCAweDc1M2QsCisJMHgwMDdjLCAweDEwNzgsIDB4MTc0OSwgMHgwMDc4LCAweDg4NzIsIDB4NjAwMCwgMHhhMDhhLCAweDAwMTAsCisJMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg4ODlkLCAweDAwN2MsIDB4ODhhZCwgMHg4ODJmLCAweDg4YWYsCisJMHg4OGFkLCAweDg4YWYsIDB4ODhhZiwgMHg4ODI4LCAweDg4YWQsIDB4ODgyMSwgMHg4ODIxLCAweDg4YWQsCisJMHg4OGFkLCAweDg4YWQsIDB4ODhhZCwgMHg4OGFkLCAweDg4YWQsIDB4MTA3OCwgMHgxMzI4LCAweDBkN2UsCisJMHg2MDE4LCAweDIwNjgsIDB4NjgwNCwgMHhhMDg0LCAweDAwZmYsIDB4MGQ3ZiwgMHhhMDhhLCAweDAwMGMsCisJMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg4OGJkLCAweDAwN2MsIDB4ODhjOSwgMHg4OTcxLCAweDg4Y2IsCisJMHg4OTBiLCAweDg4Y2IsIDB4ODkwYiwgMHg4OGNiLCAweDg4ZDgsIDB4ODhjOSwgMHg4OTBiLCAweDg4YzksCisJMHg4OGY1LCAweDEwNzgsIDB4MTMyOCwgMHg2MDA0LCAweGEwOGUsIDB4MDAxNiwgMHgwMDQwLCAweDg5MDYsCisJMHhhMDhlLCAweDAwMDQsIDB4MDA0MCwgMHg4OTA2LCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLCAweDg5MDYsCisJMHg2MDA0LCAweDEwNzgsIDB4OGMzYiwgMHgwMDQwLCAweDg5OGMsIDB4YTA4ZSwgMHgwMDIxLCAweDAwNDAsCisJMHg4OTkwLCAweGEwOGUsIDB4MDAyMiwgMHgwMDQwLCAweDg5OGMsIDB4YTA4ZSwgMHgwMDNkLCAweDAwNDAsCisJMHg4OTkwLCAweGEwOGUsIDB4MDAzOSwgMHgwMDQwLCAweDg5OTQsIDB4YTA4ZSwgMHgwMDM1LCAweDAwNDAsCisJMHg4OTk0LCAweGEwOGUsIDB4MDAxZSwgMHgwMDQwLCAweDg5MDgsIDB4YTA4ZSwgMHgwMDAxLCAweDAwYzAsCisJMHg4OTA0LCAweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweDBkN2YsCisJMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHg4OTA2LCAweDEwNzgsIDB4MjgxMywgMHgxMDc4LCAweDdhMDUsCisJMHgxMDc4LCAweDhjMDEsIDB4MDA3YywgMHgwYzdlLCAweDBkN2UsIDB4NjEwNCwgMHhhMTg2LCAweDAwMTYsCisJMHgwMDQwLCAweDg5NjEsIDB4YTE4NiwgMHgwMDAyLCAweDAwYzAsIDB4ODkzNCwgMHg2MDE4LCAweDIwNjgsCisJMHg2OGEwLCAweGQwYmMsIDB4MDBjMCwgMHg4OWI4LCAweDY4NDAsIDB4YTA4NCwgMHgwMGZmLCAweGEwMDUsCisJMHgwMDQwLCAweDg5MzQsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDcsCisJMHg2MDE3LCAweDAzOTgsIDB4MTA3OCwgMHg3NGQ3LCAweDAwNDAsIDB4ODkzNCwgMHgyZDAwLCAweDYwMWEsCisJMHg2MDFmLCAweDAwMDEsIDB4MDA3OCwgMHg4OTYxLCAweDBkN2YsIDB4MGM3ZiwgMHg2MDA0LCAweGEwOGUsCisJMHgwMDAyLCAweDAwYzAsIDB4ODk1MiwgMHg2MDE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODYsCisJMHgwMDdlLCAweDAwYzAsIDB4ODk1MiwgMHgyMDA5LCAweGEzMzIsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsCisJMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHgxMDc4LCAweDQxZjUsIDB4MGU3ZiwgMHgxMDc4LCAweDdhMDUsCisJMHgwMDc4LCAweDg5NTYsIDB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4MjgxMywgMHgwZTdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyODM5LCAweDEyN2YsIDB4MGU3ZiwgMHgxMDc4LCAweDhjMDEsCisJMHgwMDdjLCAweDIwMDEsIDB4MDAwMiwgMHgxMDc4LCAweDQ0M2YsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAyLCAweDEwNzgsIDB4NWM0NSwgMHgxMDc4LCAweDYxMDksIDB4MGQ3ZiwgMHgwYzdmLCAweDAwNzgsCisJMHg4OTYwLCAweDBjN2UsIDB4MGQ3ZSwgMHg2MTA0LCAweGExODYsIDB4MDAxNiwgMHgwMDQwLCAweDg5NjEsCisJMHg2MDE4LCAweDIwNjgsIDB4Njg0MCwgMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMDQwLCAweDg5MzQsCisJMHg4MDAxLCAweDY4NDIsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgxMDc4LCAweDYxMDksCisJMHgwZDdmLCAweDBjN2YsIDB4MDA3OCwgMHg4OTYwLCAweDEwNzgsIDB4N2EwNSwgMHgwMDc4LCAweDg5MDgsCisJMHgxMDc4LCAweDdhMjgsIDB4MDA3OCwgMHg4OTA4LCAweDBkN2UsIDB4MmM2OCwgMHg2MTA0LCAweDEwNzgsCisJMHg4ZWY1LCAweDBkN2YsIDB4MDA0MCwgMHg4OWEwLCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LCAweDg5YjcsCisJMHg2MDA0LCAweDgwMDcsIDB4NjEzMCwgMHhhMThjLCAweDAwZmYsIDB4YTEwNSwgMHg2MDMyLCAweDYwMDcsCisJMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4NjAzOCwgMHg2MDBhLCAweDIwMDEsCisJMHhhNWExLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsCisJMHgwZDdmLCAweDBjN2YsIDB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4MjgxMywgMHgwZTdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgyODM5LCAweDYwMTMsIDB4MDAwMCwgMHg2MDFmLCAweDAwMDcsCisJMHg2MDE3LCAweDAzOTgsIDB4MTI3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NjAwMCwgMHhhMDhhLCAweDAwMTAsCisJMHgxMGM4LCAweDEzMjgsIDB4MTA3OSwgMHg4OWQ1LCAweDAwN2MsIDB4ODllNSwgMHg4OWU1LCAweDg5ZTUsCisJMHg4OWU1LCAweDg5ZTUsIDB4ODllNSwgMHg4OWU1LCAweDg5ZTUsIDB4ODllNSwgMHg4ODI3LCAweDg5ZTUsCisJMHg4ODJmLCAweDg5ZTcsIDB4ODgyZiwgMHg4OWY1LCAweDg5ZTUsIDB4MTA3OCwgMHgxMzI4LCAweDYwMDQsCisJMHhhMDg2LCAweDAwOGIsIDB4MDA0MCwgMHg4OWY1LCAweDYwMDcsIDB4MDA4YiwgMHg2MDAzLCAweDAwMGQsCisJMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MTA3OCwgMHg4YmY0LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4OGEyZCwgMHgxMDc4LCAweDI4MTMsIDB4MGQ3ZSwgMHgxMDc4LCAweDhhNDQsCisJMHgwMDQwLCAweDhhMGYsIDB4NjAxMCwgMHgyMDY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMDYsCisJMHg2ODQ3LCAweDAwMDAsIDB4Njg1MCwgMHhjMGVkLCAweDY4NTIsIDB4MTA3OCwgMHg0OTgyLCAweDJjNjgsCisJMHgxMDc4LCAweDc0ZDcsIDB4MDA0MCwgMHg4YTFkLCAweDY4MTgsIDB4NjAxYSwgMHgwYzdlLCAweDJkNjAsCisJMHgxMDc4LCAweDhjMDEsIDB4MGM3ZiwgMHgwMDc4LCAweDhhMWUsIDB4MmQ2MCwgMHgwZDdmLCAweDYwMTMsCisJMHgwMDAwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1YzQ1LCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDhhMmYsIDB4MTA3OCwgMHg4YzAxLCAweDAwN2MsCisJMHhhMjg0LCAweDAwMGYsIDB4MDBjMCwgMHg4YTQxLCAweGEyODIsIDB4YWEwMCwgMHgwMDQ4LCAweDhhNDEsCisJMHgyMDAxLCAweGEzMTUsIDB4MjAwNCwgMHhhMjAyLCAweDAwYzgsIDB4OGE0MSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4YTQwLCAweDAyN2UsIDB4MGU3ZSwgMHgyMDcxLCAweGEzMDAsCisJMHg2MjEwLCAweDcwNTgsIDB4YTIwMiwgMHgwMDQ4LCAweDhhNTYsIDB4NzA1YywgMHhhMjAyLCAweDAwYzgsCisJMHg4YTU2LCAweGEwODUsIDB4MDAwMSwgMHgwZTdmLCAweDAyN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsCisJMHg4YTUzLCAweDBlN2UsIDB4MGM3ZSwgMHgwMzdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDYxLCAweGFhMDAsIDB4MjA3MSwgMHhhMzAwLCAweDczNDQsIDB4NzA2MCwgMHhhMzAyLCAweDAwYzgsCisJMHg4YTgzLCAweDYwMWMsIDB4YTIwNiwgMHgwMGMwLCAweDhhN2IsIDB4MTA3OCwgMHg4ZDY2LCAweDAwNDAsCisJMHg4YTdiLCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDhhNzcsIDB4MTA3OCwgMHg3YTA1LCAweDBjN2UsCisJMHgxMDc4LCAweDc1M2QsIDB4MGM3ZiwgMHhhY2UwLCAweDAwMTAsIDB4NzA1NCwgMHhhYzAyLCAweDAwYzgsCisJMHg4YTgzLCAweDAwNzgsIDB4OGE2NCwgMHgxMjdmLCAweDAwN2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4MGM3ZSwgMHgwMTdlLCAweGExODgsIDB4YTQzNCwgMHgyMTBjLCAweDgxZmYsCisJMHgwMDQwLCAweDhhYTEsIDB4MjA2MSwgMHhhYTAwLCAweDIwNzEsIDB4YTMwMCwgMHgwMTdlLCAweDEwNzgsCisJMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg4YWE0LCAweDYxMWEsIDB4MTA3OCwgMHgyODEzLCAweDEwNzgsCisJMHg3NTNkLCAweGEwMDYsIDB4MDA3OCwgMHg4YWE2LCAweGEwODUsIDB4MDAwMSwgMHgwMTdmLCAweDBjN2YsCisJMHgwZTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwNTdlLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDBjN2UsCisJMHgxMDc4LCAweDc0ZDcsIDB4MDU3ZiwgMHgwMDQwLCAweDhhYzMsIDB4NjYxMiwgMHg2NTFhLCAweDYwMWYsCisJMHgwMDAzLCAweDIwMDksIDB4MDA0YiwgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsCisJMHgwNTdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsIDB4OGFiZiwgMHgwYzdlLCAweDA1N2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHg2MmEwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDA1N2YsCisJMHgwMDQwLCAweDhhZjEsIDB4NjAxMywgMHgwMDAwLCAweDY1MWEsIDB4NjAxZiwgMHgwMDAzLCAweDBjN2UsCisJMHgyNTYwLCAweDEwNzgsIDB4NDcxYiwgMHgwYzdmLCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLCAweDIwMzksCisJMHgwMDAwLCAweDEwNzgsIDB4NWM3OCwgMHgyYzA4LCAweDEwNzgsIDB4OWMzOCwgMHgwNzdmLCAweDIwMDksCisJMHgwMDRjLCAweDEwNzgsIDB4NzU2YywgMHhhMDg1LCAweDAwMDEsIDB4MTI3ZiwgMHgwNTdmLCAweDBjN2YsCisJMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4YWVkLCAweDBmN2UsIDB4MGM3ZSwgMHgwNDdlLCAweDBjN2UsCisJMHgxMDc4LCAweDc0ZDcsIDB4MmM3OCwgMHgwYzdmLCAweDAwNDAsIDB4OGIwZSwgMHg3ZTEyLCAweDJjMDAsCisJMHg3ODFhLCAweDc4MWYsIDB4MDAwMywgMHgyMDIxLCAweDAwMDUsIDB4MTA3OCwgMHg4YjRlLCAweDJmNjAsCisJMHgyMDA5LCAweDAwNGQsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgwNDdmLCAweDBjN2YsCisJMHgwZjdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwYzdlLCAweDA0N2UsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsCisJMHgyYzc4LCAweDBjN2YsIDB4MDA0MCwgMHg4YjJjLCAweDdlMTIsIDB4MmMwMCwgMHg3ODFhLCAweDc4MWYsCisJMHgwMDAzLCAweDIwMjEsIDB4MDAwNSwgMHgxMDc4LCAweDhiNGUsIDB4MmY2MCwgMHgyMDA5LCAweDAwNGUsCisJMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDA0N2YsIDB4MGM3ZiwgMHgwZjdmLCAweDAwN2MsCisJMHgwZjdlLCAweDBjN2UsIDB4MDQ3ZSwgMHgwYzdlLCAweDEwNzgsIDB4NzRkNywgMHgyYzc4LCAweDBjN2YsCisJMHgwMDQwLCAweDhiNGEsIDB4N2UxMiwgMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwgMHgwMDAzLCAweDIwMjEsCisJMHgwMDA0LCAweDEwNzgsIDB4OGI0ZSwgMHgyZjYwLCAweDIwMDksIDB4MDA1MiwgMHgxMDc4LCAweDc1NmMsCisJMHhhMDg1LCAweDAwMDEsIDB4MDQ3ZiwgMHgwYzdmLCAweDBmN2YsIDB4MDA3YywgMHgwOTdlLCAweDA3N2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDQ2YTcsIDB4MDA0MCwgMHg4YjViLCAweDIwMDEsCisJMHg4YjUzLCAweDAwNzgsIDB4OGI2MSwgMHgxMDc4LCAweDQ2NmQsIDB4MDA0MCwgMHg4YjZhLCAweDIwMDEsCisJMHg4YjViLCAweDAwN2UsIDB4YTAwZSwgMHgyNDAwLCAweDEwNzgsIDB4NGE2MCwgMHgxMDc4LCAweDQ5ODIsCisJMHgwMDdmLCAweDAwN2EsIDB4MjQxOCwgMHgxMDc4LCAweDVmYTcsIDB4NjJhMCwgMHgwODdlLCAweDIwNDEsCisJMHgwMDAxLCAweDIwMzksIDB4MDAwMSwgMHgyNjA4LCAweDEwNzgsIDB4NWQ2ZCwgMHgwODdmLCAweDEwNzgsCisJMHg1Yzc4LCAweDJmMDgsIDB4MjY0OCwgMHgxMDc4LCAweDljMzgsIDB4NjEzYywgMHg4MWZmLCAweDEwNDAsCisJMHg1ZTIxLCAweDEyN2YsIDB4MDc3ZiwgMHgwOTdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg4YjllLCAweDY2MGEsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDFmLCAweDEwNzgsCisJMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsCisJMHg4YjliLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsCisJMHgwMTdmLCAweDAwNDAsIDB4OGJiYSwgMHg2NjBhLCAweDYxMWEsIDB4NjAxZiwgMHgwMDA4LCAweDJkMDAsCisJMHg2MDEyLCAweDIwMDksIDB4MDAyMSwgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsCisJMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDhiYjcsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg4YmQ2LCAweDY2MGEsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDNkLCAweDEwNzgsCisJMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsCisJMHg4YmQzLCAweDBjN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsCisJMHgwMTdmLCAweDAwNDAsIDB4OGJmMSwgMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsCisJMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsCisJMHgwMDdjLCAweGEwMDYsIDB4MDA3OCwgMHg4YmVlLCAweDAyN2UsIDB4MGQ3ZSwgMHg2MjE4LCAweDIyNjgsCisJMHg2YTNjLCAweDgyZmYsIDB4MDA0MCwgMHg4YmZlLCAweDgyMTEsIDB4NmEzZSwgMHgwZDdmLCAweDAyN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHg4YzEzLCAweDYwMTMsCisJMHgwMDAwLCAweDYwMWYsIDB4MDAwNywgMHgyMDAxLCAweGE1YTEsIDB4MjAwNCwgMHg2MDE2LCAweDEwNzgsCisJMHhhMTM0LCAweDYwM2YsIDB4MDAwMCwgMHgwMDdmLCAweDAwN2MsIDB4MDY3ZSwgMHgwYzdlLCAweDBkN2UsCisJMHgyMDMxLCAweGEzNTIsIDB4MjYzNCwgMHhkNmU0LCAweDAwNDAsIDB4OGMyMywgMHg2NjE4LCAweDI2NjAsCisJMHg2ZTQ4LCAweDEwNzgsIDB4NDYxYiwgMHgwZDdmLCAweDBjN2YsIDB4MDY3ZiwgMHgwMDdjLCAweDAwN2UsCisJMHgwMTdlLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAwNDAsIDB4OGMzOCwgMHhhMDhlLCAweDAwMDMsCisJMHgwMDQwLCAweDhjMzgsIDB4YTA4ZSwgMHgwMDA0LCAweDAwNDAsIDB4OGMzOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHgwMDdlLCAweDBkN2UsIDB4NjAxMCwgMHhhMDZkLCAweDAwNDAsCisJMHg4YzQ4LCAweDY4MzgsIDB4ZDBmYywgMHgwMDQwLCAweDhjNDgsIDB4YTAwNiwgMHgwMDc4LCAweDhjNGEsCisJMHhhMDg1LCAweDAwMDEsIDB4MGQ3ZiwgMHgwMDdmLCAweDAwN2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDBjN2UsIDB4MTA3OCwgMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg4YzY3LCAweDYxMWEsCisJMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDEwNzgsIDB4MjgxMywgMHgyMDA5LCAweDAwMjgsCisJMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweGEwMDYsCisJMHgwMDc4LCAweDhjNjQsIDB4YTE4NiwgMHgwMDE1LCAweDAwYzAsIDB4OGM3ZiwgMHgyMDExLCAweGEzMWYsCisJMHgyMjA0LCAweGEwODYsIDB4MDA3NCwgMHgwMGMwLCAweDhjN2YsIDB4MTA3OCwgMHg3ZDBkLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAyOSwgMHgxMDc4LCAweDVjNDUsIDB4MDA3OCwgMHg4YzgzLCAweDEwNzgsCisJMHg3YTA1LCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweGExODYsIDB4MDAxNiwgMHgwMGMwLCAweDhjOGUsCisJMHgyMDAxLCAweDAwMDQsIDB4MTA3OCwgMHg0NDNmLCAweDAwNzgsIDB4OGNhZiwgMHhhMTg2LCAweDAwMTUsCisJMHgwMGMwLCAweDhjYjMsIDB4MjAxMSwgMHhhMzFmLCAweDIyMDQsIDB4YTA4NiwgMHgwMDE0LCAweDAwYzAsCisJMHg4Y2IzLCAweDBkN2UsIDB4NjAxOCwgMHgyMDY4LCAweDEwNzgsIDB4NDU3ZCwgMHgwZDdmLCAweDEwNzgsCisJMHg3ZGJhLCAweDAwYzAsIDB4OGNiMywgMHgwZDdlLCAweDYwMTgsIDB4MjA2OCwgMHg2ODkwLCAweDBkN2YsCisJMHhhMDA1LCAweDAwNDAsIDB4OGNiMywgMHgyMDAxLCAweDAwMDYsIDB4MTA3OCwgMHg0NDNmLCAweDEwNzgsCisJMHg3NjA4LCAweDAwNzgsIDB4OGNiNywgMHgxMDc4LCAweDdhMDUsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsCisJMHg2ODQ4LCAweGEwODYsIDB4MDAwNSwgMHgwMGMwLCAweDhjYmYsIDB4MTA3OCwgMHg4Y2MwLCAweDAwN2MsCisJMHg2ODUwLCAweGMwYWQsIDB4Njg1MiwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhODhjLCAweDcwMTQsCisJMHhkMGU0LCAweDAwNDAsIDB4OGNkNSwgMHg2MDEzLCAweDAwMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDUwLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MGU3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0ODkzLCAweDBmN2YsIDB4MDA0MCwgMHg4Y2U0LCAweDYwMWMsCisJMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg4Y2U2LCAweDBjN2YsIDB4MDA3YywgMHg4ODI3LCAweDhjZjEsCisJMHg4Y2Y0LCAweDhjZjcsIDB4OWYwMCwgMHg5ZjFjLCAweDlmMWYsIDB4ODgyNywgMHg4ODI3LCAweDEwNzgsCisJMHgxMzI4LCAweDAwMDUsIDB4MDAwNSwgMHgwMDdjLCAweDAwMDUsIDB4MDAwNSwgMHgwMDdjLCAweDEwNzgsCisJMHg4Y2ZhLCAweDAwN2MsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg5MywgMHgwMDQwLCAweDhkMjksCisJMHgxMDc4LCAweDc0ZDcsIDB4MDBjMCwgMHg4ZDBhLCAweDIwMDEsIDB4YTVhMiwgMHgyMDA0LCAweDc4M2UsCisJMHgwMDc4LCAweDhkMjksIDB4NzgxOCwgMHg2MDFhLCAweDc4MWMsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsCisJMHg4ZDE3LCAweDc4MDgsIDB4NjAzNiwgMHgyZjAwLCAweDYwM2EsIDB4MDA3OCwgMHg4ZDFiLCAweDc4MDgsCisJMHg2MDNhLCAweDJmMDAsIDB4NjAzNiwgMHg2MDJhLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzUsCisJMHg2MDAzLCAweDAwMDEsIDB4NzkyMCwgMHg2MTIyLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksCisJMHgyZjYwLCAweDBmN2YsIDB4MDA3YywgMHgwMTdlLCAweDBmN2UsIDB4NjgyYywgMHg2MDMyLCAweGEwOGUsCisJMHgwMDAxLCAweDAwNDAsIDB4OGQzYywgMHhhMDg2LCAweDAwMDUsIDB4MDA0MCwgMHg4ZDQwLCAweGEwMDYsCisJMHg2MDJhLCAweDYwMmUsIDB4MDA3OCwgMHg4ZDUxLCAweDY4MjQsIDB4YzBmNCwgMHhjMGQ1LCAweDY4MjYsCisJMHg2ODEwLCAweDIwNzgsIDB4Nzg3YywgMHg2OTM4LCAweGExMDIsIDB4Nzg4MCwgMHg2OTM0LCAweGExMDMsCisJMHgwMGM4LCAweDhkMzcsIDB4NjgzNCwgMHg2MDJhLCAweDY4MzgsIDB4YTA4NCwgMHhmZmZjLCAweDY4M2EsCisJMHg2MDJlLCAweDJkMDAsIDB4NjAzNiwgMHg2ODA4LCAweDYwM2EsIDB4NjkxOCwgMHg2MTFhLCAweDY5MjAsCisJMHg2MTIyLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMzksIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1YmY4LCAweDY4MDMsIDB4MDAwMiwgMHgwZjdmLCAweDAxN2YsIDB4MDA3YywgMHgwMDdlLCAweDAxN2UsCisJMHg2MDA0LCAweGEwOGUsIDB4MDAzNCwgMHgwMDQwLCAweDhkOGIsIDB4YTA4ZSwgMHgwMDM1LCAweDAwNDAsCisJMHg4ZDhiLCAweGEwOGUsIDB4MDAzNiwgMHgwMDQwLCAweDhkOGIsIDB4YTA4ZSwgMHgwMDM3LCAweDAwNDAsCisJMHg4ZDhiLCAweGEwOGUsIDB4MDAzOCwgMHgwMDQwLCAweDhkOGIsIDB4YTA4ZSwgMHgwMDM5LCAweDAwNDAsCisJMHg4ZDhiLCAweGEwOGUsIDB4MDAzYSwgMHgwMDQwLCAweDhkOGIsIDB4YTA4ZSwgMHgwMDNiLCAweDAwNDAsCisJMHg4ZDhiLCAweGEwODUsIDB4MDAwMSwgMHgwMTdmLCAweDAwN2YsIDB4MDA3YywgMHgwZjdlLCAweDJjNzgsCisJMHgxMDc4LCAweDQ4OTMsIDB4MDBjMCwgMHg4ZDk4LCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDhkYTcsCisJMHg2MDI0LCAweGQwZjQsIDB4MDBjMCwgMHg4ZGE2LCAweGMwZjUsIDB4NjAyNiwgMHg2MDEwLCAweDIwNzgsCisJMHg3ODI4LCAweDYwM2EsIDB4NzgyYywgMHg2MDM2LCAweDEwNzgsIDB4MTc0OSwgMHhhMDA2LCAweDBmN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MGU3ZSwgMHgyMDAxLCAweGE1OWMsCisJMHgyMDBjLCAweDgwMDAsIDB4MjAxNCwgMHgyMDAxLCAweDAwMzIsIDB4MTA3OCwgMHg1YTk4LCAweDIwMDEsCisJMHhhNWEwLCAweDgyZmYsIDB4MDBjMCwgMHg4ZGJlLCAweDIwMTEsIDB4MDAwMiwgMHgyMjAyLCAweDIwMDEsCisJMHhhNTllLCAweDIwMGMsIDB4ODAwMCwgMHgyMDE0LCAweDIwNzEsIDB4YTU4YywgMHg3MTFhLCAweDcyMWUsCisJMHgyMDAxLCAweDAwNjQsIDB4MTA3OCwgMHg1YTk4LCAweDIwMDEsIDB4YTVhMSwgMHg4MmZmLCAweDAwYzAsCisJMHg4ZGQzLCAweDIwMTEsIDB4MDAwMiwgMHgyMjAyLCAweDIwMDksIDB4YTVhMiwgMHhhMjgwLCAweDAwMGEsCisJMHgyMDBhLCAweDBlN2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwMDdjLCAweDAwN2UsCisJMHgwZTdlLCAweDIwMDEsIDB4YTVhMCwgMHgyMDAzLCAweDAwMjgsIDB4MjAwMSwgMHhhNWExLCAweDIwMDMsCisJMHgwMDE0LCAweDIwNzEsIDB4YTU4YywgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwN2QwLCAweDIwMDEsCisJMHhhNWEyLCAweDIwMDMsIDB4MDAxZSwgMHgwZTdmLCAweDAwN2YsIDB4MDA3YywgMHgwYzdlLCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDc0ZDcsIDB4MDE3ZiwgMHgwMDQwLCAweDhlMGUsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMzLCAweDEwNzgsCisJMHg3NTZjLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBjN2YsIDB4MDA3YywgMHhhMDA2LCAweDAwNzgsCisJMHg4ZTBiLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDIwNzEsIDB4YTMwMCwgMHhhMTg2LCAweDAwMTUsCisJMHgwMGMwLCAweDhlNDAsIDB4NzA3YywgMHhhMDg2LCAweDAwMTgsIDB4MDBjMCwgMHg4ZTQwLCAweDYwMTAsCisJMHgyMDY4LCAweDZhM2MsIDB4ZDJlNCwgMHgwMGMwLCAweDhlMzQsIDB4MmM3OCwgMHgxMDc4LCAweDYyYzYsCisJMHgwMDQwLCAweDhlNDgsIDB4NzA2OCwgMHg2YTUwLCAweGEyMDYsIDB4MDBjMCwgMHg4ZTNjLCAweDcwNmMsCisJMHg2YTU0LCAweGEyMDYsIDB4MDBjMCwgMHg4ZTNjLCAweDYyMTgsIDB4YTI5MCwgMHgwMDI4LCAweDIyMTQsCisJMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHgyODViLCAweDEwNzgsIDB4NzYwOCwgMHgwMDc4LCAweDhlNDQsCisJMHgxMDc4LCAweDdhMDUsIDB4MTA3OCwgMHg3NTNkLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDAwN2MsCisJMHg3MDRjLCAweGEwODAsIDB4MjkzZiwgMHgyMDA0LCAweDZhNTQsIDB4YTIwNiwgMHgwMDQwLCAweDhlMzQsCisJMHgwMDc4LCAweDhlM2MsIDB4MGM3ZSwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDEwNzgsCisJMHg3NGQ3LCAweDAxN2YsIDB4MDA0MCwgMHg4ZTZhLCAweDYxMWEsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsCisJMHg2MDEyLCAweDIwMDksIDB4MDA0MywgMHgxMDc4LCAweDc1NmMsIDB4YTA4NSwgMHgwMDAxLCAweDEyN2YsCisJMHgwYzdmLCAweDAwN2MsIDB4YTAwNiwgMHgwMDc4LCAweDhlNjcsIDB4MGQ3ZSwgMHgwZTdlLCAweDBmN2UsCisJMHgyMDcxLCAweGEzMDAsIDB4YTE4NiwgMHgwMDE1LCAweDAwYzAsIDB4OGU5MywgMHg3MDdjLCAweGEwODYsCisJMHgwMDA0LCAweDAwYzAsIDB4OGU5MywgMHg2MDEwLCAweGEwZTgsIDB4MDAwZiwgMHgyYzc4LCAweDEwNzgsCisJMHg2MmM2LCAweDAwNDAsIDB4OGU5YiwgMHg3MDY4LCAweDZhMDgsIDB4YTIwNiwgMHgwMGMwLCAweDhlOGYsCisJMHg3MDZjLCAweDZhMGMsIDB4YTIwNiwgMHgwMGMwLCAweDhlOGYsIDB4MTA3OCwgMHgyODEzLCAweDEwNzgsCisJMHg3NjA4LCAweDAwNzgsIDB4OGU5NywgMHgxMDc4LCAweDdhMDUsIDB4MTA3OCwgMHg3NTNkLCAweDBmN2YsCisJMHgwZTdmLCAweDBkN2YsIDB4MDA3YywgMHg3MDRjLCAweGEwODAsIDB4MjkzZiwgMHgyMDA0LCAweDZhMGMsCisJMHhhMjA2LCAweDAwNDAsIDB4OGU4ZCwgMHgwMDc4LCAweDhlOGYsIDB4MDE3ZSwgMHgwMjdlLCAweDY4NGMsCisJMHhkMGFjLCAweDAwNDAsIDB4OGViZCwgMHg2OTE0LCAweDZhMTAsIDB4MjEwMCwgMHhhMjA1LCAweDAwNDAsCisJMHg4ZWJkLCAweDY4NjAsIDB4YTEwNiwgMHgwMGMwLCAweDhlYjksIDB4Njg1YywgMHhhMjA2LCAweDAwNDAsCisJMHg4ZWJkLCAweDY5NjIsIDB4NmE1ZSwgMHhhMDg1LCAweDAwMDEsIDB4MDI3ZiwgMHgwMTdmLCAweDAwN2MsCisJMHgwZTdlLCAweDEyN2UsIDB4MjA3MSwgMHhhMzAwLCAweDIwOTEsIDB4ODAwMCwgMHg3NTQ0LCAweGE1ODIsCisJMHgwMDAxLCAweDAwNDgsIDB4OGVmMiwgMHg3MDQ4LCAweDIwNjAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDhlZGUsIDB4YWNlMCwgMHgwMDEwLCAweDcwNTQsIDB4YWMwMiwgMHgwMGM4LCAweDhlZGEsCisJMHgwMDc4LCAweDhlY2QsIDB4MjA2MSwgMHhhYTAwLCAweDAwNzgsIDB4OGVjZCwgMHg2MDAzLCAweDAwMDgsCisJMHg4NTI5LCAweDc1NDYsIDB4YWNhOCwgMHgwMDEwLCAweDcwNTQsIDB4YTUwMiwgMHgwMGM4LCAweDhlZWUsCisJMHg3NTRhLCAweGEwODUsIDB4MDAwMSwgMHgxMjdmLCAweDBlN2YsIDB4MDA3YywgMHg3MDRiLCAweGFhMDAsCisJMHgwMDc4LCAweDhlZTksIDB4YTAwNiwgMHgwMDc4LCAweDhlZWIsIDB4MGM3ZSwgMHgwMjdlLCAweDAxN2UsCisJMHhhMTg2LCAweDAwMzUsIDB4MDA0MCwgMHg4ZWZmLCAweDZhMzQsIDB4MDA3OCwgMHg4ZjAwLCAweDZhMjgsCisJMHgxMDc4LCAweDhhMzAsIDB4MDA0MCwgMHg4ZjI5LCAweDIyNjAsIDB4NjExYywgMHhhMTg2LCAweDAwMDMsCisJMHgwMDQwLCAweDhmMGUsIDB4YTE4NiwgMHgwMDA2LCAweDAwYzAsIDB4OGYyNSwgMHg2ODM0LCAweGEyMDYsCisJMHgwMDQwLCAweDhmMWQsIDB4NjgzOCwgMHhhMjA2LCAweDAwYzAsIDB4OGYyNSwgMHg2MTA4LCAweDY4MzQsCisJMHhhMTA2LCAweDAwYzAsIDB4OGYyNSwgMHgwMDc4LCAweDhmMjIsIDB4NjAwOCwgMHg2OTM4LCAweGExMDYsCisJMHgwMGMwLCAweDhmMjUsIDB4NjAxOCwgMHg2OTE4LCAweGExMDYsIDB4MDE3ZiwgMHgwMjdmLCAweDBjN2YsCisJMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDc4LCAweDhmMjUsIDB4MDY3ZSwgMHg2MDAwLCAweGEwYjIsCisJMHgwMDEwLCAweDEwYzgsIDB4MTMyOCwgMHgxMDc5LCAweDhmMzcsIDB4MDY3ZiwgMHgwMDdjLCAweDhmNDcsCisJMHg5M2JiLCAweDk0ZDMsIDB4OGY0NywgMHg4ZjQ3LCAweDhmNDcsIDB4OGY0NywgMHg4ZjQ3LCAweDhmODEsCisJMHg5NTVlLCAweDhmNDcsIDB4OGY0NywgMHg4ZjQ3LCAweDhmNDcsIDB4OGY0NywgMHg4ZjQ3LCAweDEwNzgsCisJMHgxMzI4LCAweDA2N2UsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MTBjOCwgMHgxMzI4LCAweDEwNzksCisJMHg4ZjUzLCAweDA2N2YsIDB4MDA3YywgMHg4ZjYzLCAweDk5ZjYsIDB4OGY2MywgMHg4ZjYzLCAweDhmNjMsCisJMHg4ZjYzLCAweDhmNjMsIDB4OGY2MywgMHg5OWI0LCAweDlhNDQsIDB4OGY2MywgMHhhMDUzLCAweGEwODcsCisJMHhhMDUzLCAweGEwODcsIDB4OGY2MywgMHgxMDc4LCAweDEzMjgsIDB4MDY3ZSwgMHg2MDAwLCAweGEwYjIsCisJMHgwMDEwLCAweDEwYzgsIDB4MTMyOCwgMHgxMDc5LCAweDhmNmYsIDB4MDY3ZiwgMHgwMDdjLCAweDhmN2YsCisJMHg5NjlmLCAweDk3NmEsIDB4OTc5OCwgMHg5ODEzLCAweDhmN2YsIDB4OTkxOSwgMHg5OGMxLCAweDk1NmEsCisJMHg5OTg4LCAweDk5OWUsIDB4OGY3ZiwgMHg4ZjdmLCAweDhmN2YsIDB4OGY3ZiwgMHg4ZjdmLCAweDEwNzgsCisJMHgxMzI4LCAweGExYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMjgsIDB4MjEwMCwgMHgwMDc5LCAweDhmODgsCisJMHg4ZmM4LCAweDkxOWEsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OTFhMiwgMHg4ZmM4LCAweDhmYzgsCisJMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsCisJMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmY2EsCisJMHg5MDJkLCAweDkwMzgsIDB4OTA4MSwgMHg5MDljLCAweDkxMWIsIDB4OTE4YiwgMHg4ZmM4LCAweDhmYzgsCisJMHg5MWE2LCAweDhmYzgsIDB4OGZjOCwgMHg5MWI1LCAweDkxYmMsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsCisJMHg4ZmM4LCAweDhmYzgsIDB4OTFlYSwgMHg4ZmM4LCAweDhmYzgsIDB4OTFmNSwgMHg4ZmM4LCAweDhmYzgsCisJMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDkyMGEsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsCisJMHg5MjkxLCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDhmYzgsIDB4OGZjOCwgMHg4ZmM4LCAweDkzMDUsCisJMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg0ODk3LCAweDAwYzAsIDB4OGZkNywgMHgyMDAxLCAweGEzMzIsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwOSwgMHhhMDg2LCAweDAwMDgsIDB4MDBjMCwgMHg4ZmRmLCAweDYwMDcsCisJMHgwMDA5LCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDAwMDAsIDB4MDA3OCwgMHg5MTk1LCAweDEwNzgsCisJMHg0ODg3LCAweDBlN2UsIDB4MGM3ZSwgMHgwMzdlLCAweDAyN2UsIDB4MDE3ZSwgMHg2MjE4LCAweDIyNzAsCisJMHg3MmEwLCAweDAyN2UsIDB4MjAxOSwgMHgwMDI5LCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLCAweDIwMzksCisJMHgwMDAwLCAweDEwNzgsIDB4NWM3OCwgMHgyYzA4LCAweDEwNzgsIDB4OWMzOCwgMHgwNzdmLCAweDAxN2YsCisJMHgyZTYwLCAweDEwNzgsIDB4NDcxYiwgMHgwMTdmLCAweDAyN2YsIDB4MDM3ZiwgMHgwYzdmLCAweDBlN2YsCisJMHg2NjE4LCAweDBjN2UsIDB4MjY2MCwgMHgxMDc4LCAweDQ1MTMsIDB4MGM3ZiwgMHhhNmIwLCAweDAwMDEsCisJMHgyNjM0LCAweGE2ODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHg5MDFmLCAweDEwNzgsCisJMHg5YjZjLCAweDAwYzAsIDB4OTA3YiwgMHgxMDc4LCAweDlhZmQsIDB4MDBjMCwgMHg5MDFiLCAweDYwMDcsCisJMHgwMDA4LCAweDAwNzgsIDB4OTE5NSwgMHg2MDA3LCAweDAwMDksIDB4MDA3OCwgMHg5MTk1LCAweDEwNzgsCisJMHg5ZDQ1LCAweDAwNDAsIDB4OTAyOSwgMHgxMDc4LCAweDliNmMsIDB4MDA0MCwgMHg5MDEzLCAweDAwNzgsCisJMHg5MDdiLCAweDYwMTMsIDB4MTkwMCwgMHgwMDc4LCAweDkwMWIsIDB4NjEwNiwgMHgxMDc4LCAweDlhYTgsCisJMHg2MDA3LCAweDAwMDYsIDB4MDA3OCwgMHg5MTk1LCAweDYwMDcsIDB4MDAwNywgMHgwMDc4LCAweDkxOTUsCisJMHgxMDc4LCAweGEwYmYsIDB4MDBjMCwgMHg5MzQwLCAweDBkN2UsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsCisJMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDA0MCwgMHg5MDVkLCAweGE2ODYsCisJMHgwMDA0LCAweDAwNDAsIDB4OTA1ZCwgMHg2ZTA0LCAweGE2YjQsIDB4MDBmZiwgMHhhNjg2LCAweDAwMDYsCisJMHgwMDQwLCAweDkwNWQsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsIDB4OTA1ZCwgMHhhNjg2LCAweDAwMDUsCisJMHgwMDQwLCAweDkwNWQsIDB4MGQ3ZiwgMHgwMDc4LCAweDkwN2IsIDB4MTA3OCwgMHg5YmQyLCAweDAwYzAsCisJMHg5MDc2LCAweGE2ODYsIDB4MDAwNiwgMHgwMGMwLCAweDkwNmYsIDB4MDI3ZSwgMHg2MjE4LCAweGEyOTAsCisJMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4Mjg1YiwgMHgwMjdmLCAweDEwNzgsCisJMHg0NTdkLCAweDYwMDcsIDB4MDAwYSwgMHgwZDdmLCAweDAwNzgsIDB4OTE5NSwgMHg2MDA3LCAweDAwMGIsCisJMHgwZDdmLCAweDAwNzgsIDB4OTE5NSwgMHgxMDc4LCAweDI4MTMsIDB4NjAwNywgMHgwMDAxLCAweDAwNzgsCisJMHg5MTk1LCAweDEwNzgsIDB4YTBiZiwgMHgwMGMwLCAweDkzNDAsIDB4NjYxOCwgMHgwZDdlLCAweDI2NjgsCisJMHg2ZTA0LCAweDBkN2YsIDB4YTY4NiwgMHgwNzA3LCAweDAwNDAsIDB4OTA3YiwgMHgwMjdlLCAweDYyMTgsCisJMHhhMjkwLCAweDAwMjgsIDB4MjIxNCwgMHgyMDA5LCAweDAwMDAsIDB4MTA3OCwgMHgyODViLCAweDAyN2YsCisJMHg2MDA3LCAweDAwMGMsIDB4MDA3OCwgMHg5MTk1LCAweDEwNzgsIDB4NDg5NywgMHgwMGMwLCAweDkwYTksCisJMHgyMDAxLCAweGEzMzIsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksIDB4YTA4NiwgMHgwMDA4LCAweDAwYzAsCisJMHg5MGIxLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgwMDAwLCAweDAwNzgsCisJMHg5MTk1LCAweDEwNzgsIDB4NDg4NywgMHg2NjE4LCAweGE2YjAsIDB4MDAwMSwgMHgyNjM0LCAweGE2ODQsCisJMHgwMGZmLCAweGEwODIsIDB4MDAwNiwgMHgwMDQ4LCAweDkwZjUsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsCisJMHhhNjg2LCAweDAwMDQsIDB4MDA0MCwgMHg5MGM4LCAweGE2ODYsIDB4MDAwNiwgMHgwMGMwLCAweDkwN2IsCisJMHgxMDc4LCAweDliZTEsIDB4MDBjMCwgMHg5MGQwLCAweDYwMDcsIDB4MDAwZSwgMHgwMDc4LCAweDkxOTUsCisJMHgwNDdlLCAweDY0MTgsIDB4YTRhMCwgMHgwMDI4LCAweDI0MjQsIDB4YTRhNCwgMHgwMGZmLCAweDg0MjcsCisJMHgwNDdlLCAweDEwNzgsIDB4MjgxMywgMHgwNDdmLCAweDAxN2UsIDB4YTAwNiwgMHgyMDA5LCAweGEzNTIsCisJMHgyMTBjLCAweGQxYTQsIDB4MDA0MCwgMHg5MGVmLCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweDllYzAsCisJMHg2MDE4LCAweDBkN2UsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgwZDdmLCAweDAxN2YsCisJMHgwNDdmLCAweDYwMDcsIDB4MDAwMSwgMHgwMDc4LCAweDkxOTUsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsCisJMHg0NDJiLCAweDE1N2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHhhMzA1LCAweDIwMTEsIDB4YTg5MCwgMHgxMDc4LCAweDdlNTUsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsCisJMHgxNTdmLCAweGEwMDUsIDB4MDA0MCwgMHg5MTE1LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsCisJMHgwMDA2LCAweDAwNDAsIDB4OTBjOCwgMHgwMDc4LCAweDkwN2IsIDB4NjAxMywgMHgxOTAwLCAweDYwMDcsCisJMHgwMDA5LCAweDAwNzgsIDB4OTE5NSwgMHgxMDc4LCAweDQ4OTcsIDB4MDBjMCwgMHg5MTI4LCAweDIwMDEsCisJMHhhMzMyLCAweDIwMDQsIDB4YTA4NCwgMHgwMDA5LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDkxMzAsCisJMHg2MDA3LCAweDAwMDksIDB4NjAyYiwgMHgwMDA5LCAweDYwMTMsIDB4MDAwMCwgMHgwMDc4LCAweDkxOTUsCisJMHgxMDc4LCAweDQ4ODcsIDB4NjYxOCwgMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LCAweDAwZmYsCisJMHhhMDgyLCAweDAwMDYsIDB4MDA0OCwgMHg5MTc4LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsCisJMHgwMDA0LCAweDAwNDAsIDB4OTE0NywgMHhhNjg2LCAweDAwMDYsIDB4MDBjMCwgMHg5MDdiLCAweDEwNzgsCisJMHg5YzBjLCAweDAwYzAsIDB4OTE1MywgMHgxMDc4LCAweDlhZmQsIDB4MDBjMCwgMHg5MTUzLCAweDYwMDcsCisJMHgwMDEwLCAweDAwNzgsIDB4OTE5NSwgMHgwNDdlLCAweDY0MTgsIDB4YTRhMCwgMHgwMDI4LCAweDI0MjQsCisJMHhhNGE0LCAweDAwZmYsIDB4ODQyNywgMHgwNDdlLCAweDEwNzgsIDB4MjgxMywgMHgwNDdmLCAweDAxN2UsCisJMHhhMDA2LCAweDIwMDksIDB4YTM1MiwgMHgyMTBjLCAweGQxYTQsIDB4MDA0MCwgMHg5MTcyLCAweDIwMDksCisJMHgwMDI5LCAweDEwNzgsIDB4OWVjMCwgMHg2MDE4LCAweDBkN2UsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsCisJMHg2ODAyLCAweDBkN2YsIDB4MDE3ZiwgMHgwNDdmLCAweDYwMDcsIDB4MDAwMSwgMHgwMDc4LCAweDkxOTUsCisJMHgxMDc4LCAweDlkNDUsIDB4MDA0MCwgMHg5MTg1LCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsCisJMHgwMDA2LCAweDAwNDAsIDB4OTE0NywgMHgwMDc4LCAweDkwN2IsIDB4NjAxMywgMHgxOTAwLCAweDYwMDcsCisJMHgwMDA5LCAweDAwNzgsIDB4OTE5NSwgMHgxMDc4LCAweGEwYmYsIDB4MDBjMCwgMHg5MzQwLCAweDEwNzgsCisJMHg5MzQzLCAweDAwYzAsIDB4OTA3YiwgMHg2MDA3LCAweDAwMTIsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1YzQ1LCAweDAwN2MsIDB4NjAwNywgMHgwMDAxLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDVjNDUsCisJMHgwMDc4LCAweDkxOTksIDB4NjAwNywgMHgwMDA1LCAweDAwNzgsIDB4OTE5YywgMHgxMDc4LCAweGEwYmYsCisJMHgwMGMwLCAweDkzNDAsIDB4MTA3OCwgMHg5MzQzLCAweDAwYzAsIDB4OTA3YiwgMHg2MDA3LCAweDAwMjAsCisJMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YzQ1LCAweDAwN2MsIDB4NjAwNywgMHgwMDIzLCAweDYwMDMsCisJMHgwMDAxLCAweDEwNzgsIDB4NWM0NSwgMHgwMDdjLCAweDEwNzgsIDB4YTBiZiwgMHgwMGMwLCAweDkzNDAsCisJMHgxMDc4LCAweDkzNDMsIDB4MDBjMCwgMHg5MDdiLCAweDAxN2UsIDB4MDI3ZSwgMHgyMDExLCAweGE4OTAsCisJMHgyMjE0LCAweDJjMDgsIDB4MTA3OCwgMHg5ZThjLCAweDAwYzAsIDB4OTFkZSwgMHgyMTYwLCAweDYwMDcsCisJMHgwMDI2LCAweDYwMTMsIDB4MTcwMCwgMHgyMDExLCAweGE4ODksIDB4MjIxNCwgMHhhMjk2LCAweGZmZmYsCisJMHgwMGMwLCAweDkxZTMsIDB4NjAwNywgMHgwMDI1LCAweDAwNzgsIDB4OTFlMywgMHgxMDc4LCAweDc1M2QsCisJMHgyMTYwLCAweDYwMDcsIDB4MDAyNSwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YzQ1LCAweDAyN2YsCisJMHgwMTdmLCAweDAwN2MsIDB4NjEwNiwgMHgxMDc4LCAweDkzNjMsIDB4NjAwNywgMHgwMDJiLCAweDAwNzgsCisJMHg5MTk1LCAweDYwMDcsIDB4MDAyYywgMHgwMDc4LCAweDkxOTUsIDB4MTA3OCwgMHhhMGJmLCAweDAwYzAsCisJMHg5MzQwLCAweDEwNzgsIDB4OTM0MywgMHgwMGMwLCAweDkwN2IsIDB4NjEwNiwgMHgxMDc4LCAweDkzNjgsCisJMHgwMGMwLCAweDkyMDYsIDB4NjAwNywgMHgwMDJlLCAweDAwNzgsIDB4OTE5NSwgMHg2MDA3LCAweDAwMmYsCisJMHgwMDc4LCAweDkxOTUsIDB4MGU3ZSwgMHgwZDdlLCAweDBjN2UsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDEsCisJMHgyMDBjLCAweGExODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHg5MjIzLCAweGExODQsCisJMHhmZjAwLCAweDgwMDcsIDB4YTA4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTIyMywgMHgwYzdmLCAweDBkN2YsCisJMHgwZTdmLCAweDAwNzgsIDB4OTE5YSwgMHgyMDAxLCAweGEzNzEsIDB4MjAwNCwgMHhkMGU0LCAweDAwNDAsCisJMHg5MjhkLCAweDIwNzEsIDB4YTg4YywgMHg3MDEwLCAweDYwMzYsIDB4NzAxNCwgMHg2MDNhLCAweDcxMDgsCisJMHg3MjBjLCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDA0MCwgMHg5MjQxLCAweDYwMTgsCisJMHgyMDY4LCAweDY4MTAsIDB4YTEwNiwgMHgwMGMwLCAweDkyNDEsIDB4NjgxNCwgMHhhMjA2LCAweDAwNDAsCisJMHg5MjY1LCAweDIwMDEsIDB4YTM1MiwgMHgyMDA0LCAweGQwYWMsIDB4MDBjMCwgMHg5MjgxLCAweDIwNjksCisJMHhhMzAwLCAweDY4NmMsIDB4YTIwNiwgMHgwMGMwLCAweDkyODEsIDB4Njg2OCwgMHhhMTA2LCAweDAwYzAsCisJMHg5MjgxLCAweDcyMTAsIDB4MTA3OCwgMHg4YTMwLCAweDAwNDAsIDB4OTI4NywgMHgxMDc4LCAweDlmMzEsCisJMHgwMDQwLCAweDkyODcsIDB4NjIyYSwgMHg2MDA3LCAweDAwMzYsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1YmY4LCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NzIxNCwgMHhhMjg2LCAweGZmZmYsCisJMHgwMDQwLCAweDkyNzcsIDB4MTA3OCwgMHg4YTMwLCAweDAwNDAsIDB4OTI4NywgMHhhMjgwLCAweDAwMDIsCisJMHgyMDA0LCAweDcxMTAsIDB4YTEwNiwgMHgwMGMwLCAweDkyODcsIDB4MDA3OCwgMHg5MjUyLCAweDcyMTAsCisJMHgyYzA4LCAweDEwNzgsIDB4OWU4YywgMHgyYzEwLCAweDIxNjAsIDB4MDA0MCwgMHg5Mjg3LCAweDAwNzgsCisJMHg5MjUyLCAweDYwMDcsIDB4MDAzNywgMHg2MDEzLCAweDE1MDAsIDB4MDA3OCwgMHg5MjVkLCAweDYwMDcsCisJMHgwMDM3LCAweDYwMTMsIDB4MTcwMCwgMHgwMDc4LCAweDkyNWQsIDB4NjAwNywgMHgwMDEyLCAweDAwNzgsCisJMHg5MjVkLCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsCisJMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHg5MTlhLCAweDBlN2UsIDB4MGQ3ZSwgMHgwYzdlLCAweDIwMDEsCisJMHhhMzcxLCAweDIwMDQsIDB4ZDBlNCwgMHgwMDQwLCAweDkyZmQsIDB4MjA2OSwgMHhhMzAwLCAweDIwNzEsCisJMHhhODhjLCAweDcwMDgsIDB4NjAzNiwgMHg3MjBjLCAweDYyM2EsIDB4YTI4NiwgMHhmZmZmLCAweDAwYzAsCisJMHg5MmJhLCAweDcyMDgsIDB4MGM3ZSwgMHgyYzA4LCAweDEwNzgsIDB4OWU4YywgMHgyYzEwLCAweDBjN2YsCisJMHgwMDQwLCAweDkyZjEsIDB4MTA3OCwgMHg4YTMwLCAweDAwNDAsIDB4OTJmMSwgMHgwYzdlLCAweDAyN2UsCisJMHgyMjYwLCAweDEwNzgsIDB4ODc0YSwgMHgwMjdmLCAweDBjN2YsIDB4NzExOCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweGExODYsIDB4MDAwMSwgMHgwMDQwLCAweDkyZGIsIDB4YTE4NiwgMHgwMDA1LCAweDAwNDAsCisJMHg5MmQ1LCAweGExODYsIDB4MDAwNywgMHgwMGMwLCAweDkyZTUsIDB4YTI4MCwgMHgwMDA0LCAweDIwMDQsCisJMHhhMDA1LCAweDAwNDAsIDB4OTJlNSwgMHgwNTdlLCAweDc1MTAsIDB4NzYxNCwgMHgxMDc4LCAweDlmNDYsCisJMHgwNTdmLCAweDBjN2YsIDB4MGQ3ZiwgMHgwZTdmLCAweDAwN2MsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsCisJMHgwMDA5LCAweDYwMTMsIDB4MmEwMCwgMHg2MDAzLCAweDAwMDEsIDB4MTA3OCwgMHg1YmY4LCAweDAwNzgsCisJMHg5MmUxLCAweDYwMDcsIDB4MDAzYiwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgxNzAwLCAweDYwMDMsCisJMHgwMDAxLCAweDEwNzgsIDB4NWJmOCwgMHgwMDc4LCAweDkyZTEsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsCisJMHgwMDBiLCAweDYwMTMsIDB4MDAwMCwgMHgwMDc4LCAweDkyNWQsIDB4MGU3ZSwgMHgwMjdlLCAweDEwNzgsCisJMHg0ODk3LCAweDAwNDAsIDB4OTMzYSwgMHgxMDc4LCAweDQ4ODcsIDB4MTA3OCwgMHhhMTQ4LCAweDAwYzAsCisJMHg5MzM4LCAweDIwNzEsIDB4YTMwMCwgMHg3MGM4LCAweGMwODUsIDB4NzBjYSwgMHgwZjdlLCAweDIwNzksCisJMHgwMTAwLCAweDcyOTQsIDB4YTI4NCwgMHgwMGZmLCAweDcwNmEsIDB4NzhlNiwgMHhhMjg0LCAweGZmMDAsCisJMHg3MjZjLCAweGEyMDUsIDB4NzA2ZSwgMHg3OGVhLCAweDBmN2YsIDB4NzBkMywgMHgwMDAwLCAweDIwMDEsCisJMHhhMzUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMDQwLCAweDkzMzEsIDB4MjAxMSwgMHhhNWM0LCAweDIwMTMsCisJMHgwN2QwLCAweGQwYWMsIDB4MDBjMCwgMHg5MzNhLCAweDEwNzgsIDB4MjYwZCwgMHgwMDc4LCAweDkzM2EsCisJMHgxMDc4LCAweGExNzgsIDB4MDI3ZiwgMHgwZTdmLCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LCAweDkxOTksCisJMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHgwZDdlLCAweDA2N2UsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsCisJMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDA0MCwgMHg5MzYwLCAweGE2ODYsCisJMHgwMDA0LCAweDAwNDAsIDB4OTM2MCwgMHg2ZTA0LCAweGE2YjQsIDB4MDBmZiwgMHhhNjg2LCAweDAwMDYsCisJMHgwMDQwLCAweDkzNjAsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsIDB4OTM2MCwgMHhhMDg1LCAweDAwMDEsCisJMHgwNjdmLCAweDBkN2YsIDB4MDA3YywgMHgwZDdlLCAweDEwNzgsIDB4OTM5NywgMHgwZDdmLCAweDAwN2MsCisJMHgwZDdlLCAweDEwNzgsIDB4OTNhNiwgMHgwMGMwLCAweDkzOTAsIDB4NjgwYywgMHhhMDhjLCAweGZmMDAsCisJMHg2ODIwLCAweGEwODQsIDB4MDBmZiwgMHhhMTE1LCAweDYyMTIsIDB4NjgyNCwgMHg2MDJhLCAweGQxZTQsCisJMHgwMDQwLCAweDkzN2UsIDB4MjAwOSwgMHgwMDAxLCAweDAwNzgsIDB4OTM4YywgMHhkMWVjLCAweDAwNDAsCisJMHg5MzkwLCAweDY5MjAsIDB4YTE4YywgMHgwMGZmLCAweDY4MjQsIDB4MTA3OCwgMHgyNGUzLCAweDAwYzAsCisJMHg5MzkwLCAweDIxMTAsIDB4MjAwOSwgMHgwMDAwLCAweDEwNzgsIDB4Mjg1YiwgMHgwMDc4LCAweDkzOTQsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg5Mzk1LCAweGEwMDYsIDB4MGQ3ZiwgMHgwMDdjLCAweDIwNjksCisJMHhhODhkLCAweDY4MDAsIDB4YTA4MiwgMHgwMDEwLCAweDAwYzgsIDB4OTNhNCwgMHg2MDEzLCAweDAwMDAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHg5M2E1LCAweGEwMDYsIDB4MDA3YywgMHg2MDEzLCAweDAwMDAsCisJMHgyMDY5LCAweGE4OGMsIDB4NjgwOCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgwODAwLCAweDAwYzAsCisJMHg5M2JhLCAweDY4MDAsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAxNCwgMHgwMDQwLCAweDkzYmEsCisJMHhhMDhlLCAweDAwMTAsIDB4MDA3YywgMHg2MDA0LCAweGEwYjIsIDB4MDA0NCwgMHgxMGM4LCAweDEzMjgsCisJMHhhMWI2LCAweDAwMTMsIDB4MDBjMCwgMHg5M2M3LCAweDIwMDgsIDB4MDA3OSwgMHg5M2RhLCAweGExYjYsCisJMHgwMDI3LCAweDAwNDAsIDB4OTNjZiwgMHhhMWI2LCAweDAwMTQsIDB4MTBjMCwgMHgxMzI4LCAweDIwMDEsCisJMHgwMDA3LCAweDEwNzgsIDB4NDQ3MiwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg2MTA5LCAweDAwN2MsIDB4OTQxYSwgMHg5NDFjLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWMsCisJMHg5NDI0LCAweDk0YWUsIDB4OTQ3MSwgMHg5NGFlLCAweDk0ODUsIDB4OTRhZSwgMHg5NDI0LCAweDk0YWUsCisJMHg5NGE2LCAweDk0YWUsIDB4OTRhNiwgMHg5NGFlLCAweDk0YWUsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsCisJMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsCisJMHg5NDFjLCAweDk0MWEsIDB4OTRhZSwgMHg5NDFhLCAweDk0MWEsIDB4OTRhZSwgMHg5NDFhLCAweDk0YWUsCisJMHg5NGFlLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsIDB4OTRhZSwgMHg5NGFlLCAweDk0MWEsCisJMHg5NGFlLCAweDk0YWUsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWEsIDB4OTQxYSwgMHg5NDFhLCAweDk0MWMsCisJMHg5NGFlLCAweDk0YWUsIDB4OTQxYSwgMHg5NDFhLCAweDk0YWUsIDB4OTRhZSwgMHg5NDFhLCAweDk0MWEsCisJMHg5NDFhLCAweDk0MWEsIDB4MTA3OCwgMHgxMzI4LCAweDEwNzgsIDB4NjAxMCwgMHg2MDAzLCAweDAwMDIsCisJMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg5NGI0LCAweDBmN2UsIDB4MjA3OSwgMHhhMzUxLCAweDc4MDQsCisJMHgwZjdmLCAweGQwYWMsIDB4MDBjMCwgMHg5NGFlLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsCisJMHg2MDE4LCAweGEwODAsIDB4MDAwNCwgMHgyMDA0LCAweGEwODYsIDB4MDBmZiwgMHgwMDQwLCAweDk0YWUsCisJMHgwYzdlLCAweDYwMTgsIDB4MjA2MCwgMHg2MDAwLCAweGQwZjQsIDB4MDBjMCwgMHg5NDQ4LCAweDYwMTAsCisJMHhhMDA1LCAweDAwNDAsIDB4OTQ0OCwgMHgwYzdmLCAweDEwNzgsIDB4MzVmNywgMHgwMDc4LCAweDk0YWUsCisJMHgwYzdmLCAweDIwMDEsIDB4YTMwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDk0NTcsCisJMHgwZjdlLCAweDIwNzksIDB4YTMwMCwgMHg3ODhjLCAweDgwMDAsIDB4Nzg4ZSwgMHgwZjdmLCAweDIwMDEsCisJMHgwMDAyLCAweDEwNzgsIDB4NDQzZiwgMHgxMDc4LCAweDYwMTAsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgxMDc4LCAweDVjNDUsIDB4MTA3OCwgMHg2MTA5LCAweDBjN2UsCisJMHg2MTE4LCAweDIxNjAsIDB4MjAwOSwgMHgwMDAxLCAweDEwNzgsIDB4NThlMSwgMHgwYzdmLCAweDAwNzgsCisJMHg5NGI0LCAweDY2MTgsIDB4MGQ3ZSwgMHgyNjY4LCAweDZlMDQsIDB4MGQ3ZiwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNiwgMHgwMDQwLCAweDk0YWUsIDB4YTY4NiwgMHgwMDA0LCAweDAwNDAsCisJMHg5NGFlLCAweDIwMDEsIDB4MDAwNCwgMHgwMDc4LCAweDk0YWMsIDB4MjAwMSwgMHhhMzAwLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHg5NDhlLCAweDEwNzgsIDB4MzVmNywgMHgyMDAxLCAweDAwMDYsCisJMHgxMDc4LCAweDk0YjUsIDB4NjYxOCwgMHgwZDdlLCAweDI2NjgsIDB4NmUwNCwgMHgwZDdmLCAweGE2YjQsCisJMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDAwNDAsIDB4OTRhZSwgMHgyMDAxLCAweDAwMDYsCisJMHgwMDc4LCAweDk0YWMsIDB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4OTRhYywgMHgyMDAxLCAweDAwMDYsCisJMHgxMDc4LCAweDk0YjUsIDB4MDA3OCwgMHg5NGFlLCAweDEwNzgsIDB4NDQ3MiwgMHgxMDc4LCAweDYwMTAsCisJMHgxMDc4LCAweDc1M2QsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsIDB4MDE3ZSwgMHgwZDdlLCAweDYxMTgsCisJMHgyMTY4LCAweDY5MDAsIDB4ZDE4NCwgMHgwMDQwLCAweDk0ZDAsIDB4NjEwNCwgMHhhMThlLCAweDAwMGEsCisJMHgwMGMwLCAweDk0YzgsIDB4Njk5YywgMHhkMWE0LCAweDAwYzAsIDB4OTRjOCwgMHgyMDAxLCAweDAwMDcsCisJMHgxMDc4LCAweDQ0M2YsIDB4MjAwMSwgMHgwMDAwLCAweDEwNzgsIDB4NDQyYiwgMHgxMDc4LCAweDI4MzksCisJMHgwZDdmLCAweDAxN2YsIDB4MDA3YywgMHgwZDdlLCAweDY2MTgsIDB4MjY2OCwgMHg2ODA0LCAweGEwODQsCisJMHhmZjAwLCAweDgwMDcsIDB4MGQ3ZiwgMHhhMGIyLCAweDAwMGMsIDB4MTBjOCwgMHgxMzI4LCAweGExYjYsCisJMHgwMDE1LCAweDAwYzAsIDB4OTRlNywgMHgxMDc5LCAweDk0ZWUsIDB4MDA3OCwgMHg5NGVkLCAweGExYjYsCisJMHgwMDE2LCAweDEwYzAsIDB4MTMyOCwgMHgxMDc5LCAweDk0ZmEsIDB4MDA3YywgMHg3YWQwLCAweDdhZDAsCisJMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHg3YWQwLCAweDk1NDcsIDB4OTUwNiwgMHg3YWQwLCAweDdhZDAsCisJMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHg3YWQwLCAweDdhZDAsCisJMHg5NTQ3LCAweDk1NGYsIDB4N2FkMCwgMHg3YWQwLCAweDdhZDAsIDB4N2FkMCwgMHgwZjdlLCAweDIwNzksCisJMHhhMzUxLCAweDc4MDQsIDB4ZDBhYywgMHgwMGMwLCAweDk1MmQsIDB4NjAxOCwgMHhhMDdkLCAweDAwNDAsCisJMHg5NTJkLCAweDc4MDAsIDB4ZDBmNCwgMHgwMGMwLCAweDk1MTksIDB4NzgxMCwgMHhhMDA1LCAweDAwYzAsCisJMHg5NTJkLCAweDIwMDEsIDB4MDAwMCwgMHgxMDc4LCAweDQ0MmIsIDB4MjAwMSwgMHgwMDAyLCAweDEwNzgsCisJMHg0NDNmLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDEwNzgsCisJMHg1YzQ1LCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDk1NDUsIDB4MjAxMSwgMHhhODgzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MTA3OCwgMHgyNGUzLCAweDAwYzAsIDB4OTU0NSwgMHgwYzdlLCAweDEwNzgsCisJMHg0NTAxLCAweDAwNDAsIDB4OTU0MCwgMHgwYzdmLCAweDEwNzgsIDB4NzUzZCwgMHgwMDc4LCAweDk1NDUsCisJMHgxMDc4LCAweDQyMzUsIDB4MGM3ZiwgMHgxMDc4LCAweDc1M2QsIDB4MGY3ZiwgMHgwMDdjLCAweDY2MDQsCisJMHhhNmI2LCAweDAwMWUsIDB4MDBjMCwgMHg5NTRlLCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweDEwNzgsCisJMHg3ZDBhLCAweDAwYzAsIDB4OTU1YiwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDEwNzgsCisJMHg1YzQ1LCAweDAwNzgsIDB4OTU1ZCwgMHgxMDc4LCAweDc1M2QsIDB4MDA3YywgMHg2MDA0LCAweGEwOGEsCisJMHgwMDQ0LCAweDEwYzgsIDB4MTMyOCwgMHgxMDc4LCAweDYwMTAsIDB4MTA3OCwgMHg4YzAxLCAweDEwNzgsCisJMHg2MTA5LCAweDAwN2MsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4OTU2ZSwgMHg5NTgxLCAweDk1ODEsCisJMHg5NTgxLCAweDk1ODEsIDB4OTU4MywgMHg5NTgxLCAweDk1ODEsIDB4OTU4MSwgMHg5NTgxLCAweDk1ODEsCisJMHg5NTgxLCAweDk1ODEsIDB4OTU4MSwgMHg5NTgxLCAweDk1ODEsIDB4OTU4MSwgMHg5NTgxLCAweDk1ODEsCisJMHg5NTgxLCAweDEwNzgsIDB4MTMyOCwgMHgwZDdlLCAweDBlN2UsIDB4MGY3ZSwgMHgxNTdlLCAweDA0N2UsCisJMHgwMjdlLCAweDYyMTgsIDB4YTI4MCwgMHgwMDJiLCAweDIwMDQsIDB4YTAwNSwgMHgwMDQwLCAweDk1OTQsCisJMHgyMDIxLCAweDAwMDAsIDB4MTA3OCwgMHhhMTExLCAweDYxMDYsIDB4MjA3MSwgMHhhODgwLCAweDc0NDQsCisJMHhhNGE0LCAweGZmMDAsIDB4MDA0MCwgMHg5NWViLCAweGE0ODYsIDB4MjAwMCwgMHgwMGMwLCAweDk1YTYsCisJMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMjAwLCAweDEwNzgsIDB4NWE2ZCwgMHgxMDc4LCAweDEzODEsCisJMHgxMDQwLCAweDEzMjgsIDB4NjAwMywgMHgwMDA3LCAweDJkMDAsIDB4NjgzNywgMHgwMTBkLCAweDY4MDMsCisJMHgwMDAwLCAweDY4M2IsIDB4MDAwMCwgMHg2YzVhLCAweDJjMDAsIDB4Njg1ZSwgMHg2MDA4LCAweDY4YjIsCisJMHg2MDE4LCAweDIwNzgsIDB4NzhhMCwgMHg4MDA3LCAweDcxMzAsIDB4Njk0YSwgMHgwMTdlLCAweGEwODQsCisJMHhmZjAwLCAweDY4NDYsIDB4Njg0ZiwgMHgwMDAwLCAweDY4NTcsIDB4MDAzNiwgMHgxMDc4LCAweDQ5ODIsCisJMHgwMTdmLCAweGE0ODYsIDB4MjAwMCwgMHgwMGMwLCAweDk1ZDMsIDB4MjAxOSwgMHgwMDE3LCAweDEwNzgsCisJMHg5ZTNiLCAweDAwNzgsIDB4OTY0NSwgMHhhNDg2LCAweDA0MDAsIDB4MDBjMCwgMHg5NWRkLCAweDIwMTksCisJMHgwMDAyLCAweDEwNzgsIDB4OWRlYywgMHgwMDc4LCAweDk2NDUsIDB4YTQ4NiwgMHgwMjAwLCAweDAwYzAsCisJMHg5NWUzLCAweDEwNzgsIDB4OWRkMSwgMHhhNDg2LCAweDEwMDAsIDB4MDBjMCwgMHg5NWU5LCAweDEwNzgsCisJMHg5ZTIwLCAweDAwNzgsIDB4OTY0NSwgMHgyMDY5LCAweGE2MmQsIDB4NmEwMCwgMHhkMjg0LCAweDAwNDAsCisJMHg5NjliLCAweGEyODQsIDB4MDMwMCwgMHgwMGMwLCAweDk2OTMsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsCisJMHg5NjgzLCAweDJkNzgsIDB4NjAwMywgMHgwMDA3LCAweDEwNzgsIDB4MTM2NiwgMHgwMDQwLCAweDk2NGMsCisJMHg3ODAwLCAweGQwOGMsIDB4MDBjMCwgMHg5NjA3LCAweDc4MDQsIDB4ODAwMSwgMHg3ODA2LCAweDYwMTMsCisJMHgwMDAwLCAweDY4MDMsIDB4MDAwMCwgMHg2ODM3LCAweDAxMTYsIDB4NjgzYiwgMHgwMDAwLCAweDYwMDgsCisJMHg2OGIyLCAweDJjMDAsIDB4Njg0YSwgMHg2MDE4LCAweDIwNzgsIDB4NzhhMCwgMHg4MDA3LCAweDcxMzAsCisJMHg2OTg2LCAweDY4NDYsIDB4Njg1MywgMHgwMDNkLCAweDcyNDQsIDB4YTI5NCwgMHgwMDAzLCAweGEyODYsCisJMHgwMDAyLCAweDAwYzAsIDB4OTYyNywgMHg2ODRmLCAweDAwNDAsIDB4MDA3OCwgMHg5NjMxLCAweGEyODYsCisJMHgwMDAxLCAweDAwYzAsIDB4OTYyZiwgMHg2ODRmLCAweDAwODAsIDB4MDA3OCwgMHg5NjMxLCAweDY4NGYsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwYSwgMHgyMDAxLCAweGE4OTAsIDB4YWQ5MCwgMHgwMDE1LCAweDIwMGMsCisJMHg4MTBmLCAweDIxMTIsIDB4ODAwMCwgMHg4MjEwLCAweDAwZjAsIDB4OTYzNywgMHgyMDBjLCAweDY5ODIsCisJMHg4MDAwLCAweDIwMGMsIDB4Njk3ZSwgMHgxMDc4LCAweDQ5ODIsIDB4MDI3ZiwgMHgwNDdmLCAweDE1N2YsCisJMHgwZjdmLCAweDBlN2YsIDB4MGQ3ZiwgMHgwMDdjLCAweDYwMTMsIDB4MDEwMCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwNDEsIDB4MTA3OCwgMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDk2NDUsCisJMHgyMDY5LCAweGE4OTIsIDB4MmQwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgxMjAwLCAweDAwYzAsCisJMHg5Njc3LCAweDIwNjksIDB4YTg4MCwgMHg2ODZjLCAweGEwODQsIDB4MDBmZiwgMHgwMTdlLCAweDYxMTAsCisJMHhhMThjLCAweDA3MDAsIDB4YTEwZCwgMHg2MTEyLCAweDAxN2YsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDQzLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksIDB4MDA3OCwgMHg5NjQ1LCAweDYwMTMsCisJMHgwMjAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MTA3OCwgMHg1YmY4LCAweDEwNzgsCisJMHg2MTA5LCAweDAwNzgsIDB4OTY0NSwgMHg2MDEzLCAweDAzMDAsIDB4MDA3OCwgMHg5Njg5LCAweDYwMTMsCisJMHgwMTAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsIDB4MTA3OCwgMHg1YmY4LCAweDEwNzgsCisJMHg2MTA5LCAweDAwNzgsIDB4OTY0NSwgMHg2MDEzLCAweDA1MDAsIDB4MDA3OCwgMHg5Njg5LCAweDYwMTMsCisJMHgwNjAwLCAweDAwNzgsIDB4OTY1OCwgMHg2MDEzLCAweDAyMDAsIDB4MDA3OCwgMHg5NjU4LCAweGExODYsCisJMHgwMDEzLCAweDAwYzAsIDB4OTZiMSwgMHg2MDA0LCAweGEwOGEsIDB4MDA0MCwgMHgxMDQ4LCAweDEzMjgsCisJMHhhMDhhLCAweDAwNTMsIDB4MTBjOCwgMHgxMzI4LCAweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDAwNzksCisJMHg5NzI1LCAweGExODYsIDB4MDA1MSwgMHgwMDQwLCAweDk2YmUsIDB4YTE4NiwgMHgwMDQ3LCAweDAwYzAsCisJMHg5NmQ3LCAweDYwMDQsIDB4YTA4NiwgMHgwMDQxLCAweDAwNDAsIDB4OTZlNSwgMHgyMDAxLCAweDAxMDksCisJMHgyMDA0LCAweGQwODQsIDB4MDA0MCwgMHg5NmU1LCAweDEyN2UsIDB4MjA5MSwgMHgyMjAwLCAweDAwN2UsCisJMHgwMTdlLCAweDAyN2UsIDB4MTA3OCwgMHg1YWQyLCAweDAyN2YsIDB4MDE3ZiwgMHgwMDdmLCAweDEyN2YsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDk2ZTUsIDB4MDA3OCwgMHg5NzZhLCAweGExODYsCisJMHgwMDI3LCAweDAwNDAsIDB4OTZkZiwgMHhhMTg2LCAweDAwMTQsIDB4MTBjMCwgMHgxMzI4LCAweDYwMDQsCisJMHhhMDgyLCAweDAwNDAsIDB4MjAwOCwgMHgwMDc5LCAweDk2ZTgsIDB4MTA3OCwgMHg3NTgzLCAweDAwN2MsCisJMHg5NmZiLCAweDk2ZmQsIDB4OTZmZCwgMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsCisJMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHg5NmZiLCAweDk2ZmIsCisJMHg5NmZiLCAweDk2ZmIsIDB4OTZmYiwgMHgxMDc4LCAweDEzMjgsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsCisJMHg2MTA5LCAweDAzN2UsIDB4MGQ3ZSwgMHg2MDEwLCAweGEwNmQsIDB4MDA0MCwgMHg5NzIyLCAweGFkODQsCisJMHhmMDAwLCAweDAwNDAsIDB4OTcyMiwgMHg2MDAzLCAweDAwMDIsIDB4NjAxOCwgMHgyMDA0LCAweGQwYmMsCisJMHgwMGMwLCAweDk3MjIsIDB4MjAxOSwgMHgwMDA0LCAweDEwNzgsIDB4OWU3MCwgMHg2MDEzLCAweDAwMDAsCisJMHg2MDE0LCAweGEwMDUsIDB4MDBjMCwgMHg5NzIwLCAweDIwMDEsIDB4YTVhMSwgMHgyMDA0LCAweDYwMTYsCisJMHg2MDAzLCAweDAwMDcsIDB4MGQ3ZiwgMHgwMzdmLCAweDAwN2MsIDB4OTczOCwgMHg5NzU3LCAweDk3NDEsCisJMHg5NzY0LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LCAweDk3MzgsCisJMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LCAweDk3MzgsIDB4OTczOCwgMHg5NzM4LCAweDk3MzgsCisJMHgxMDc4LCAweDEzMjgsIDB4NjAxMCwgMHhhMDg4LCAweDAwMTMsIDB4MjEwNCwgMHhhMDg1LCAweDA0MDAsCisJMHgyMDBhLCAweDEwNzgsIDB4NjAxMCwgMHg2MDEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYjQsCisJMHgwMDQwLCAweDk3NTIsIDB4NjAwMywgMHgwMDA3LCAweDIwMDksIDB4MDA0MywgMHgxMDc4LCAweDc1NmMsCisJMHgwMDc4LCAweDk3NTQsIDB4NjAwMywgMHgwMDAyLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweDEwNzgsCisJMHg2MDEwLCAweDEwNzgsIDB4YTBjNiwgMHgwMGMwLCAweDk3NjEsIDB4MTA3OCwgMHg1YTQxLCAweDEwNzgsCisJMHg3NTNkLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweDEwNzgsIDB4NjAxMCwgMHgyMDA5LCAweDAwNDEsCisJMHgwMDc4LCAweDk4YzEsIDB4YTE4MiwgMHgwMDQwLCAweDAwNzksIDB4OTc2ZSwgMHg5NzgxLCAweDk3ODMsCisJMHg5NzgxLCAweDk3ODEsIDB4OTc4MSwgMHg5NzgxLCAweDk3ODEsIDB4OTc4NCwgMHg5NzgxLCAweDk3ODEsCisJMHg5NzgxLCAweDk3ODEsIDB4OTc4MSwgMHg5NzgxLCAweDk3ODEsIDB4OTc4MSwgMHg5NzgxLCAweDk3OGYsCisJMHg5NzgxLCAweDEwNzgsIDB4MTMyOCwgMHgwMDdjLCAweDYwMDMsIDB4MDAwNCwgMHg2MTEwLCAweDIwZTEsCisJMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDEwNzgsIDB4MTVlYywgMHgwMDdjLCAweDBkN2UsCisJMHgxMDc4LCAweDVhNDEsIDB4MGQ3ZiwgMHgxMDc4LCAweGExMzQsIDB4MTA3OCwgMHg3NTNkLCAweDAwN2MsCisJMHhhMTgyLCAweDAwNDAsIDB4MDA3OSwgMHg5NzljLCAweDk3YWYsIDB4OTdhZiwgMHg5N2FmLCAweDk3YWYsCisJMHg5N2FmLCAweDk3YWYsIDB4OTdhZiwgMHg5N2IxLCAweDk3YWYsIDB4OTdiNCwgMHg5N2RmLCAweDk3YWYsCisJMHg5N2FmLCAweDk3YWYsIDB4OTdhZiwgMHg5N2RmLCAweDk3YWYsIDB4OTdhZiwgMHg5N2FmLCAweDEwNzgsCisJMHgxMzI4LCAweDEwNzgsIDB4NzU4MywgMHgwMDdjLCAweDEwNzgsIDB4NjBiOCwgMHgxMDc4LCAweDYxZDMsCisJMHg2MDEwLCAweDBkN2UsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsIDB4MDA0MCwgMHg5N2NhLCAweGEwOGMsCisJMHgwMDAzLCAweGExOGUsIDB4MDAwMiwgMHgwMDQwLCAweDk3ZDIsIDB4MjAwOSwgMHgwMDQxLCAweDBkN2YsCisJMHgwMDc4LCAweDk4YzEsIDB4NjAwMywgMHgwMDA3LCAweDYwMTcsIDB4MDAwMCwgMHgxMDc4LCAweDVhNDEsCisJMHgwZDdmLCAweDAwN2MsIDB4MTA3OCwgMHhhMGM2LCAweDAwNDAsIDB4OTdkOCwgMHgwZDdmLCAweDAwN2MsCisJMHgxMDc4LCAweDVhNDEsIDB4MTA3OCwgMHg3NTNkLCAweDBkN2YsIDB4MDA3OCwgMHg5N2QxLCAweDAzN2UsCisJMHgxMDc4LCAweDYwYjgsIDB4MTA3OCwgMHg2MWQzLCAweDYwMTAsIDB4MGQ3ZSwgMHgyMDY4LCAweDYwMTgsCisJMHgyMDA0LCAweGQwYmMsIDB4MDA0MCwgMHg5N2ZmLCAweDY4NGMsIDB4YTA4NCwgMHgwMDAzLCAweGEwODYsCisJMHgwMDAyLCAweDAwNDAsIDB4OTdmYiwgMHg2ODdjLCAweDYzMmMsIDB4YTMxYSwgMHg2MzJlLCAweDY4ODAsCisJMHg2MzI4LCAweGEzMWIsIDB4NjMyYSwgMHg2MDAzLCAweDAwMDIsIDB4MDA3OCwgMHg5ODEwLCAweDIwMTksCisJMHgwMDA0LCAweDEwNzgsIDB4OWU3MCwgMHg2MDE0LCAweGEwMDUsIDB4MDBjMCwgMHg5ODBjLCAweDIwMDEsCisJMHhhNWExLCAweDIwMDQsIDB4ODAwMywgMHg2MDE2LCAweDYwMTMsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDcsCisJMHgwZDdmLCAweDAzN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHg5ODIxLCAweDYwMDQsCisJMHhhMDg2LCAweDAwNDIsIDB4MTBjMCwgMHgxMzI4LCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDYxMDksCisJMHgwMDdjLCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDk4MjksIDB4YTE4NiwgMHgwMDE0LCAweDAwYzAsCisJMHg5ODM5LCAweDYwMDQsIDB4YTA4NiwgMHgwMDQyLCAweDEwYzAsIDB4MTMyOCwgMHgyMDAxLCAweDAwMDcsCisJMHgxMDc4LCAweDQ0NzIsIDB4MTA3OCwgMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LCAweDYxMDksCisJMHgwMDdjLCAweGExODIsIDB4MDA0MCwgMHgwMDc5LCAweDk4M2QsIDB4OTg1MCwgMHg5ODUwLCAweDk4NTAsCisJMHg5ODUwLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUwLCAweDk4NTIsIDB4OTg1ZSwgMHg5ODUwLCAweDk4NTAsCisJMHg5ODUwLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUwLCAweDk4NTAsIDB4OTg1MCwgMHg5ODUwLCAweDk4NTAsCisJMHgxMDc4LCAweDEzMjgsIDB4MDM3ZSwgMHgwNDdlLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsCisJMHgyYzEwLCAweDEwNzgsIDB4MTVlYywgMHgwNDdmLCAweDAzN2YsIDB4MDA3YywgMHg2MDEwLCAweDBkN2UsCisJMHgyMDY4LCAweDY4MTAsIDB4NmExNCwgMHg2MTE4LCAweDIxMGMsIDB4ZDFiYywgMHgwMDQwLCAweDk4N2QsCisJMHg2MTI0LCAweGQxZjQsIDB4MDBjMCwgMHg5ODdkLCAweDAwN2UsIDB4MDQ3ZSwgMHgwNTdlLCAweDZjN2MsCisJMHhhNDIyLCAweDZkODAsIDB4MjIwMCwgMHhhNTJiLCAweDYwMmMsIDB4YTQyMCwgMHg2NDJlLCAweDYwMjgsCisJMHhhNTI5LCAweDY1MmEsIDB4MDU3ZiwgMHgwNDdmLCAweDAwN2YsIDB4YTIwZCwgMHgwMGMwLCAweDk4OTEsCisJMHg2ODRjLCAweGQwZmMsIDB4MDA0MCwgMHg5ODg5LCAweDIwMDksIDB4MDA0MSwgMHgwZDdmLCAweDAwNzgsCisJMHg5OGMxLCAweDYwMDMsIDB4MDAwNywgMHg2MDE3LCAweDAwMDAsIDB4MTA3OCwgMHg1YTQxLCAweDBkN2YsCisJMHgwMDdjLCAweDAwN2UsIDB4MGY3ZSwgMHgyYzc4LCAweDEwNzgsIDB4NDg5MywgMHgwZjdmLCAweDAwN2YsCisJMHgwMDQwLCAweDk4OWUsIDB4NjAwMywgMHgwMDAyLCAweDBkN2YsIDB4MDA3YywgMHgyMDA5LCAweGEzMGQsCisJMHgyMTBjLCAweGQxOWMsIDB4MDA0MCwgMHg5OGE4LCAweDYwMDMsIDB4MDAwNywgMHgwMDc4LCAweDk4YWEsCisJMHg2MDAzLCAweDAwMDYsIDB4MTA3OCwgMHg5OGIwLCAweDEwNzgsIDB4NWE0MywgMHgwZDdmLCAweDAwN2MsCisJMHhkMmZjLCAweDAwNDAsIDB4OThiYywgMHg4MDAyLCAweDgwMDAsIDB4ODIxMiwgMHhhMjkxLCAweDAwMDAsCisJMHgyMDA5LCAweDAwMDksIDB4MDA3OCwgMHg5OGJlLCAweDIwMDksIDB4MDAxNSwgMHg2YTZhLCAweDY4NjYsCisJMHgwMDdjLCAweGExODIsIDB4MDA0MCwgMHgwMDQ4LCAweDk4YzcsIDB4MDA3OSwgMHg5OGQ0LCAweGExODYsCisJMHgwMDEzLCAweDAwNDAsIDB4OThjZiwgMHhhMTg2LCAweDAwMTQsIDB4MTBjMCwgMHgxMzI4LCAweDYwMjQsCisJMHhkMGRjLCAweDEwNDAsIDB4MTMyOCwgMHgwMDdjLCAweDk4ZTcsIDB4OThlZSwgMHg5OGZhLCAweDk5MDYsCisJMHg5OGU3LCAweDk4ZTcsIDB4OThlNywgMHg5OTE1LCAweDk4ZTcsIDB4OThlOSwgMHg5OGU5LCAweDk4ZTcsCisJMHg5OGU3LCAweDk4ZTcsIDB4OThlNywgMHg5OGU3LCAweDk4ZTcsIDB4OThlNywgMHg5OGU3LCAweDEwNzgsCisJMHgxMzI4LCAweDYwMjQsIDB4ZDBkYywgMHgxMDQwLCAweDEzMjgsIDB4MDA3YywgMHg2MDAzLCAweDAwMDEsCisJMHg2MTA2LCAweDEwNzgsIDB4NWJmOCwgMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDYxMDksCisJMHgxMjdmLCAweDAwN2MsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MTA3OCwgMHg1YmY4LCAweDEyN2UsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHg2MTA5LCAweDEyN2YsIDB4MDA3YywgMHg2MDAzLCAweDAwMDMsCisJMHg2MTA2LCAweDJjMTAsIDB4MTA3OCwgMHgxY2FiLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHg1YzY0LCAweDEwNzgsIDB4NjFkMywgMHgxMjdmLCAweDAwN2MsIDB4YTAxNiwgMHgxMDc4LCAweDE1ZWMsCisJMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHg4MDAwLCAweDAzN2UsIDB4MGQ3ZSwgMHhhMTgyLCAweDAwNDAsCisJMHgxMDc5LCAweDk5MjYsIDB4MGQ3ZiwgMHgwMzdmLCAweDEyN2YsIDB4MDA3YywgMHg5OTM2LCAweDk5MzgsCisJMHg5OTRkLCAweDk5NmMsIDB4OTkzNiwgMHg5OTM2LCAweDk5MzYsIDB4OTk4NCwgMHg5OTM2LCAweDk5MzYsCisJMHg5OTM2LCAweDk5MzYsIDB4OTkzNiwgMHg5OTM2LCAweDk5MzYsIDB4OTkzNiwgMHgxMDc4LCAweDEzMjgsCisJMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAwNDAsIDB4OTk2MiwgMHhhMDljLCAweDAwMDMsCisJMHhhMzllLCAweDAwMDMsIDB4MDA0MCwgMHg5OTYyLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsCisJMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwMDc4LCAweDk5ODcsIDB4NjAxMCwgMHgyMDY4LCAweDY4NGMsCisJMHhkMGZjLCAweDAwNDAsIDB4OTk2MiwgMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDAwNDAsCisJMHg5OTYyLCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksCisJMHgwMDc4LCAweDk5ODcsIDB4NjAxMywgMHgwMDAwLCAweDYwMTcsIDB4MDAwMCwgMHgyMDE5LCAweDAwMDQsCisJMHgxMDc4LCAweDllNzAsIDB4MDA3OCwgMHg5OTg3LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsCisJMHgwMDQwLCAweDk5NjIsIDB4YTA5YywgMHgwMDAzLCAweGEzOWUsIDB4MDAwMywgMHgwMDQwLCAweDk5NjIsCisJMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDEwNzgsIDB4MWNhYiwgMHgxMDc4LCAweDVjNjQsCisJMHgxMDc4LCAweDYxZDMsIDB4MDA3OCwgMHg5OTg3LCAweGEwMTYsIDB4MTA3OCwgMHgxNWVjLCAweDAwN2MsCisJMHgxMDc4LCAweDYwMTAsIDB4NjExMCwgMHg4MWZmLCAweDAwNDAsIDB4OTk5OSwgMHgwZDdlLCAweDIxNjgsCisJMHgxMDc4LCAweGExODEsIDB4MDM3ZSwgMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg5ZTcwLCAweDAzN2YsCisJMHgwZDdmLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgxMDc4LCAweDYwYjgsCisJMHg2MTEwLCAweDgxZmYsIDB4MDA0MCwgMHg5OWFmLCAweDBkN2UsIDB4MjE2OCwgMHgxMDc4LCAweGExODEsCisJMHgwMzdlLCAweDIwMTksIDB4MDAyOSwgMHgxMDc4LCAweDllNzAsIDB4MDM3ZiwgMHgwZDdmLCAweDEwNzgsCisJMHg4YzAxLCAweDEwNzgsIDB4NjFkMywgMHgwMDdjLCAweGExODIsIDB4MDA4NSwgMHgwMDc5LCAweDk5YjgsCisJMHg5OWMxLCAweDk5YmYsIDB4OTliZiwgMHg5OWNkLCAweDk5YmYsIDB4OTliZiwgMHg5OWJmLCAweDEwNzgsCisJMHgxMzI4LCAweDYwMDMsIDB4MDAwYiwgMHg2MTA2LCAweDEwNzgsIDB4NWJmOCwgMHgxMjdlLCAweDIwOTEsCisJMHg4MDAwLCAweDEwNzgsIDB4NjEwOSwgMHgxMjdmLCAweDAwN2MsIDB4MDI3ZSwgMHgwZTdlLCAweDEwNzgsCisJMHhhMGJmLCAweDAwNDAsIDB4OTlkNywgMHgxMDc4LCAweDc1M2QsIDB4MDA3OCwgMHg5OWYzLCAweDIwNzEsCisJMHhhODgwLCAweDcyMjQsIDB4NjIxMiwgMHg3MjIwLCAweDEwNzgsIDB4OWQxMCwgMHgwMDQwLCAweDk5ZTQsCisJMHg2MDA3LCAweDAwODYsIDB4MDA3OCwgMHg5OWVkLCAweDYwMDcsIDB4MDA4NywgMHg3MjI0LCAweGEyOTYsCisJMHhmZmZmLCAweDAwYzAsIDB4OTllZCwgMHg2MDA3LCAweDAwODYsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsCisJMHg1YmY4LCAweDEwNzgsIDB4NjEwOSwgMHgwZTdmLCAweDAyN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsCisJMHgwMGMwLCAweDlhMDcsIDB4NjAwNCwgMHhhMDhhLCAweDAwODUsIDB4MTA0OCwgMHgxMzI4LCAweGEwOGEsCisJMHgwMDhjLCAweDEwYzgsIDB4MTMyOCwgMHhhMDgyLCAweDAwODUsIDB4MDA3OSwgMHg5YTFlLCAweGExODYsCisJMHgwMDI3LCAweDAwNDAsIDB4OWExMywgMHhhMTg2LCAweDAwMTQsIDB4MDA0MCwgMHg5YTEzLCAweDEwNzgsCisJMHg3NTgzLCAweDAwNzgsIDB4OWExZCwgMHgyMDAxLCAweDAwMDcsIDB4MTA3OCwgMHg0NDcyLCAweDEwNzgsCisJMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHg5YTI1LCAweDlhMjcsCisJMHg5YTI3LCAweDlhMjUsIDB4OWEyNSwgMHg5YTI1LCAweDlhMjUsIDB4MTA3OCwgMHgxMzI4LCAweDEwNzgsCisJMHg2MDEwLCAweDEwNzgsIDB4OGMwMSwgMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHhhMTgyLCAweDAwODUsCisJMHgxMDQ4LCAweDEzMjgsIDB4YTE4MiwgMHgwMDhjLCAweDEwYzgsIDB4MTMyOCwgMHhhMTgyLCAweDAwODUsCisJMHgwMDc5LCAweDlhM2EsIDB4OWE0MSwgMHg5YTQxLCAweDlhNDEsIDB4OWE0MywgMHg5YTQxLCAweDlhNDEsCisJMHg5YTQxLCAweDEwNzgsIDB4MTMyOCwgMHgwMDdjLCAweGExODYsIDB4MDAxMywgMHgwMDQwLCAweDlhNTQsCisJMHhhMTg2LCAweDAwMTQsIDB4MDA0MCwgMHg5YTU0LCAweGExODYsIDB4MDAyNywgMHgwMDQwLCAweDlhNTQsCisJMHgxMDc4LCAweDc1ODMsIDB4MDA3OCwgMHg5YTVhLCAweDEwNzgsIDB4NjAxMCwgMHgxMDc4LCAweDhjMDEsCisJMHgxMDc4LCAweDYxMDksIDB4MDA3YywgMHgwMzdlLCAweDEwNzgsIDB4YTEzNCwgMHg2MDNmLCAweDAwMDAsCisJMHgyMDE5LCAweDAwMGIsIDB4MTA3OCwgMHg5YTZhLCAweDYwMWYsIDB4MDAwNiwgMHg2MDAzLCAweDAwMDcsCisJMHgwMzdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMzdlLCAweDIwOTEsIDB4ODAwMCwgMHgwODdlLCAweDJjNDAsCisJMHgwOTdlLCAweDIwNDksIDB4MDAwMCwgMHgxMDc4LCAweDcwNTgsIDB4MDk3ZiwgMHgwODdmLCAweDAwYzAsCisJMHg5YWE1LCAweDA3N2UsIDB4MmMzOCwgMHgxMDc4LCAweDcxMDUsIDB4MDc3ZiwgMHgwMGMwLCAweDlhYTUsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMDQwLCAweDlhYTUsIDB4NjAxYywgMHhhMDg2LCAweDAwMDcsCisJMHgwMDQwLCAweDlhYTUsIDB4MGQ3ZSwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweDlhOTYsCisJMHgxMDc4LCAweGExMzQsIDB4NjAxZiwgMHgwMDA3LCAweDEwNzgsIDB4MTc0OSwgMHg2MDEwLCAweDIwNjgsCisJMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg5YTllLCAweDEwNzgsIDB4OWU3MCwgMHgwZDdmLCAweDYwMTMsCisJMHgwMDAwLCAweDEwNzgsIDB4YTEzNCwgMHg2MDFmLCAweDAwMDcsIDB4MDM3ZiwgMHgxMjdmLCAweDAwN2MsCisJMHgwZjdlLCAweDBjN2UsIDB4MDM3ZSwgMHgxNTdlLCAweDIwNzksIDB4YTg4MCwgMHg3OTM4LCAweDc4M2MsCisJMHgxMDc4LCAweDI0ZTMsIDB4MDBjMCwgMHg5YWY2LCAweDAxN2UsIDB4MGM3ZSwgMHgxMDc4LCAweDQ1MDEsCisJMHgwMGMwLCAweDlhZjYsIDB4MjAxMSwgMHhhODkwLCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgxMDc4LCAweDdlNTUsIDB4MDBjMCwgMHg5YWY2LCAweDAxN2YsIDB4MDI3ZiwgMHgwMjdlLCAweDAxN2UsCisJMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg3MWUwLCAweDEwNzgsIDB4NWQ1MywgMHgwNzdlLCAweDIwMzksCisJMHgwMDAwLCAweDEwNzgsIDB4NWM3OCwgMHgwNzdmLCAweDAxN2YsIDB4MDc3ZSwgMHgyMDM5LCAweDAwMDAsCisJMHgxMDc4LCAweDljMzgsIDB4MDc3ZiwgMHgxMDc4LCAweDQ3MWIsIDB4MDI3ZSwgMHg2MjA0LCAweGEyOTQsCisJMHhmZjAwLCAweDgyMTcsIDB4YTI4NiwgMHgwMDA2LCAweDAwNDAsIDB4OWFlYSwgMHhhMjg2LCAweDAwMDQsCisJMHgwMGMwLCAweDlhZWQsIDB4NjJhMCwgMHgxMDc4LCAweDI4ZDUsIDB4MDI3ZiwgMHgwMTdmLCAweDEwNzgsCisJMHg0MjM1LCAweDY2MTIsIDB4NjUxNiwgMHhhMDA2LCAweDAwNzgsIDB4OWFmOCwgMHgwYzdmLCAweDAxN2YsCisJMHgxNTdmLCAweDAzN2YsIDB4MGM3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MGM3ZSwgMHgwZDdlLCAweDBlN2UsCisJMHgwMTdlLCAweDIwMDksIDB4YTMxZiwgMHgyMTA0LCAweGEwODYsIDB4MDA3NCwgMHgwMGMwLCAweDliNjAsCisJMHgyMDY5LCAweGE4OGUsIDB4NjkwYywgMHhhMTgyLCAweDAxMDAsIDB4MDA0OCwgMHg5YjUwLCAweDY5MDgsCisJMHhhMTg0LCAweDgwMDAsIDB4MDA0MCwgMHg5YjVjLCAweDYwMTgsIDB4MjA3MCwgMHg3MDEwLCAweGEwODQsCisJMHgwMGZmLCAweDAwNDAsIDB4OWIxZiwgMHg3MDAwLCAweGQwZjQsIDB4MDA0MCwgMHg5YjIzLCAweGExODQsCisJMHgwODAwLCAweDAwNDAsIDB4OWI1YywgMHg2OTEwLCAweGExOGEsIDB4MDAwMSwgMHgwMDQ4LCAweDliNTQsCisJMHg2OTE0LCAweDIwNjksIDB4YThhZSwgMHg2OTA0LCAweDgxZmYsIDB4MDBjMCwgMHg5YjQ4LCAweDY5MGMsCisJMHhhMTgyLCAweDAxMDAsIDB4MDA0OCwgMHg5YjUwLCAweDY5MDgsIDB4ODFmZiwgMHgwMGMwLCAweDliNGMsCisJMHg2OTEwLCAweGExOGEsIDB4MDAwMSwgMHgwMDQ4LCAweDliNTQsIDB4NjkxOCwgMHhhMThhLCAweDAwMDEsCisJMHgwMDQ4LCAweDliNWMsIDB4MDA3OCwgMHg5YjY2LCAweDYwMTMsIDB4MDEwMCwgMHgwMDc4LCAweDliNjIsCisJMHg2MDEzLCAweDAzMDAsIDB4MDA3OCwgMHg5YjYyLCAweDYwMTMsIDB4MDUwMCwgMHgwMDc4LCAweDliNjIsCisJMHg2MDEzLCAweDA3MDAsIDB4MDA3OCwgMHg5YjYyLCAweDYwMTMsIDB4MDkwMCwgMHgwMDc4LCAweDliNjIsCisJMHg2MDEzLCAweDBiMDAsIDB4MDA3OCwgMHg5YjYyLCAweDYwMTMsIDB4MGYwMCwgMHgwMDc4LCAweDliNjIsCisJMHg2MDEzLCAweDJkMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4OWI2NywgMHhhMDA2LCAweDAxN2YsCisJMHgwZTdmLCAweDBkN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MGQ3ZSwgMHgwMjdlLCAweDAzN2UsCisJMHgxNTdlLCAweDYyMTgsIDB4MjI2OCwgMHg2YjA0LCAweGEzOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDYsCisJMHgwMDQwLCAweDliOTAsIDB4YTI4NiwgMHgwMDA0LCAweDAwNDAsIDB4OWI5MCwgMHhhMzk0LCAweGZmMDAsCisJMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMDQwLCAweDliOTAsIDB4YTI4NiwgMHgwMDA0LCAweDAwNDAsCisJMHg5YjkwLCAweDBjN2UsIDB4MmQ2MCwgMHgxMDc4LCAweDQ1MTMsIDB4MGM3ZiwgMHgwMDc4LCAweDliY2IsCisJMHgyMDExLCAweGE4OTYsIDB4YWQ5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDdlNTUsCisJMHgwMGMwLCAweDliY2MsIDB4MjAxMSwgMHhhODlhLCAweGFkOTgsIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsCisJMHgxMDc4LCAweDdlNTUsIDB4MDBjMCwgMHg5YmNjLCAweDA0N2UsIDB4MDE3ZSwgMHg2YWEwLCAweGEyOTQsCisJMHgwMGZmLCAweDgyMjcsIDB4YTAwNiwgMHgyMDA5LCAweGEzNTIsIDB4MjEwYywgMHhkMWE0LCAweDAwNDAsCisJMHg5YmI4LCAweDIwMDksIDB4MDAyOSwgMHgxMDc4LCAweDllYzAsIDB4NjgwMCwgMHhjMGU1LCAweDY4MDIsCisJMHgyMDE5LCAweDAwMjksIDB4MTA3OCwgMHg1ZDUzLCAweDA3N2UsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsCisJMHg1Yzc4LCAweDJjMDgsIDB4MTA3OCwgMHg5YzM4LCAweDA3N2YsIDB4MjAwMSwgMHgwMDA3LCAweDEwNzgsCisJMHg0NDcyLCAweDAxN2YsIDB4MDQ3ZiwgMHhhMDA2LCAweDE1N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDBkN2YsCisJMHgwYzdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgyMDY5LCAweGE4OGUsIDB4NjgwMCwgMHhhMDg2LCAweDA4MDAsCisJMHgwMDQwLCAweDliZGUsIDB4NjAxMywgMHgwMDAwLCAweDAwNzgsIDB4OWJkZiwgMHhhMDA2LCAweDBkN2YsCisJMHgwMDdjLCAweDBjN2UsIDB4MGY3ZSwgMHgwMTdlLCAweDAyN2UsIDB4MDM3ZSwgMHgxNTdlLCAweDIwNzksCisJMHhhODhjLCAweDc5MzAsIDB4NzgzNCwgMHgxMDc4LCAweDI0ZTMsIDB4MDBjMCwgMHg5YzA1LCAweDEwNzgsCisJMHg0NTAxLCAweDAwYzAsIDB4OWMwNSwgMHgyMDExLCAweGE4OTAsIDB4YWM5OCwgMHgwMDBhLCAweDIwYTksCisJMHgwMDA0LCAweDEwNzgsIDB4N2U1NSwgMHgwMGMwLCAweDljMDUsIDB4MjAxMSwgMHhhODk0LCAweGFjOTgsCisJMHgwMDA2LCAweDIwYTksIDB4MDAwNCwgMHgxMDc4LCAweDdlNTUsIDB4MTU3ZiwgMHgwMzdmLCAweDAyN2YsCisJMHgwMTdmLCAweDBmN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4MDA3ZSwgMHgwMTdlLCAweDAyN2UsCisJMHgwMzdlLCAweDE1N2UsIDB4MjAxMSwgMHhhODgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDEwNzgsCisJMHgyNGUzLCAweDAwYzAsIDB4OWMzMSwgMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHg5YzMxLCAweDIwMTEsCisJMHhhODk2LCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg3ZTU1LCAweDAwYzAsCisJMHg5YzMxLCAweDIwMTEsIDB4YTg5YSwgMHhhYzk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDEwNzgsCisJMHg3ZTU1LCAweDE1N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsIDB4MDA3ZiwgMHgwYzdmLCAweDAwN2MsCisJMHgwZTdlLCAweDBjN2UsIDB4MDg3ZSwgMHgwNzdlLCAweDA2N2UsIDB4MDU3ZSwgMHgwNDdlLCAweDAyN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyNzQwLCAweDIwMjksIDB4YTViNCwgMHgyNTJjLCAweDIwMjEsCisJMHhhNWJhLCAweDI0MjQsIDB4MjA2MSwgMHhhYTAwLCAweDIwNzEsIDB4YTMwMCwgMHg3NjQ0LCAweDcwNjAsCisJMHg4MWZmLCAweDAwNDAsIDB4OWM1OSwgMHg4MDAxLCAweGE2MDIsIDB4MDBjOCwgMHg5Y2MzLCAweDAwNzgsCisJMHg5YzVjLCAweGE2MDYsIDB4MDA0MCwgMHg5Y2MzLCAweDIxMDAsIDB4YWMwNiwgMHgwMDQwLCAweDljYjksCisJMHgxMDc4LCAweDllZTUsIDB4MDA0MCwgMHg5Y2I5LCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLCAweDAwNDAsCisJMHg5Y2RlLCAweGE3ODYsIDB4MDAwNCwgMHgwMDQwLCAweDljZGUsIDB4YTc4NiwgMHgwMDA3LCAweDAwNDAsCisJMHg5Y2I5LCAweDI1MDAsIDB4YWMwNiwgMHgwMDQwLCAweDljYjksIDB4MjQwMCwgMHhhYzA2LCAweDAwNDAsCisJMHg5Y2I5LCAweDEwNzgsIDB4OWVmOSwgMHgwMGMwLCAweDljYjksIDB4ODhmZiwgMHgwMDQwLCAweDljODQsCisJMHg2MDIwLCAweGE5MDYsIDB4MDBjMCwgMHg5Y2I5LCAweDBkN2UsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDQsCisJMHgwMGMwLCAweDljOGUsIDB4MDE3ZSwgMHgxMDc4LCAweDE3NDksIDB4MDE3ZiwgMHhhNzg2LCAweDAwMDgsCisJMHgwMGMwLCAweDljOWQsIDB4MTA3OCwgMHg4YzNiLCAweDAwYzAsIDB4OWM5ZCwgMHgxMDc4LCAweDdhMDUsCisJMHgwZDdmLCAweDEwNzgsIDB4OGMwMSwgMHgwMDc4LCAweDljYjksIDB4NjAxMCwgMHgyMDY4LCAweDEwNzgsCisJMHg4YTQ0LCAweDAwNDAsIDB4OWNiNiwgMHhhNzg2LCAweDAwMDMsIDB4MDBjMCwgMHg5Y2NkLCAweDY4MzcsCisJMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDEwNzgsIDB4YTE4MSwgMHgwMTdlLCAweDEwNzgsCisJMHg4Y2I4LCAweDEwNzgsIDB4NDk4MiwgMHgwMTdmLCAweDEwNzgsIDB4OGJmNCwgMHgwZDdmLCAweDEwNzgsCisJMHg4YzAxLCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGEzMTUsIDB4MjAwNCwgMHhhYzAyLCAweDAwYzgsCisJMHg5Y2MzLCAweDAwNzgsIDB4OWM0YywgMHgxMjdmLCAweDAyN2YsIDB4MDQ3ZiwgMHgwNTdmLCAweDA2N2YsCisJMHgwNzdmLCAweDA4N2YsIDB4MGM3ZiwgMHgwZTdmLCAweDAwN2MsIDB4YTc4NiwgMHgwMDA2LCAweDAwYzAsCisJMHg5Y2E3LCAweGEzODYsIDB4MDAwNSwgMHgwMDQwLCAweDljZGIsIDB4MTA3OCwgMHhhMTgxLCAweDEwNzgsCisJMHg5ZTcwLCAweDAwNzgsIDB4OWNiNiwgMHgwZDdmLCAweDAwNzgsIDB4OWNiOSwgMHgxMDc4LCAweDllZjksCisJMHgwMGMwLCAweDljYjksIDB4ODFmZiwgMHgwMDQwLCAweDljYjksIDB4YTE4MCwgMHgwMDAxLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMTgsIDB4MDA0MCwgMHg5Y2YzLCAweGExODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODYsCisJMHgwMDJkLCAweDAwYzAsIDB4OWNiOSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDljYjksCisJMHgxMDc4LCAweDhjMjcsIDB4MDA0MCwgMHg5ZDA0LCAweDEwNzgsIDB4OGMzYiwgMHgwMGMwLCAweDljYjksCisJMHgxMDc4LCAweDdhMDUsIDB4MDA3OCwgMHg5ZDBjLCAweDEwNzgsIDB4MjgzOSwgMHgxMDc4LCAweDhjM2IsCisJMHgwMGMwLCAweDlkMGMsIDB4MTA3OCwgMHg3YTA1LCAweDEwNzgsIDB4OGMwMSwgMHgwMDc4LCAweDljYjksCisJMHgwYzdlLCAweDBlN2UsIDB4MDE3ZSwgMHgyYzA4LCAweDIxNzAsIDB4MTA3OCwgMHg5ZThjLCAweDAxN2YsCisJMHgwMDQwLCAweDlkMWYsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MTA3OSwgMHg5ZDIyLCAweDBlN2YsCisJMHgwYzdmLCAweDAwN2MsIDB4OWQyYSwgMHg5ZDJhLCAweDlkMmEsIDB4OWQyYSwgMHg5ZDJhLCAweDlkMmEsCisJMHg5ZDJjLCAweDlkMmEsIDB4YTAwNiwgMHgwMDdjLCAweDA0N2UsIDB4MDE3ZSwgMHg3MDE4LCAweGEwODAsCisJMHgwMDI4LCAweDIwMjQsIDB4YTRhNCwgMHgwMGZmLCAweDg0MjcsIDB4MmMwMCwgMHgyMDA5LCAweDAwMjAsCisJMHgxMDc4LCAweDllYzAsIDB4MDE3ZiwgMHgwNDdmLCAweDAzN2UsIDB4MjAxOSwgMHgwMDAyLCAweDEwNzgsCisJMHg5YTZhLCAweDAzN2YsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MjAwMSwgMHgwMDAxLCAweDEwNzgsCisJMHg0NDJiLCAweDE1N2UsIDB4MDE3ZSwgMHgwMjdlLCAweDAzN2UsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHhhMzA1LCAweDIwMTEsIDB4YTg5NiwgMHgxMDc4LCAweDdlNTUsIDB4MDM3ZiwgMHgwMjdmLCAweDAxN2YsCisJMHgxNTdmLCAweGEwMDUsIDB4MDA3YywgMHgwZjdlLCAweDBlN2UsIDB4MGM3ZSwgMHgwODdlLCAweDA3N2UsCisJMHgwNjdlLCAweDAyN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDYxLCAweGFhMDAsCisJMHgyMDc5LCAweDAwMDEsIDB4OGZmZiwgMHgwMDQwLCAweDlkYzMsIDB4MjA3MSwgMHhhMzAwLCAweDc2NDQsCisJMHg3MDYwLCAweDgwMDEsIDB4YTYwMiwgMHgwMGM4LCAweDlkYzMsIDB4ODhmZiwgMHgwMDQwLCAweDlkN2UsCisJMHgyODAwLCAweGFjMDYsIDB4MDBjMCwgMHg5ZGI5LCAweDIwNzksIDB4MDAwMCwgMHgxMDc4LCAweDllZTUsCisJMHgwMDQwLCAweDlkYjksIDB4MjQwMCwgMHhhYzA2LCAweDAwNDAsIDB4OWRiOSwgMHg2NzFjLCAweGE3ODYsCisJMHgwMDA2LCAweDAwYzAsIDB4OWRiOSwgMHhhNzg2LCAweDAwMDcsIDB4MDA0MCwgMHg5ZGI5LCAweDg4ZmYsCisJMHgwMGMwLCAweDlkOWQsIDB4NjAxOCwgMHhhMjA2LCAweDAwYzAsIDB4OWRiOSwgMHg4NWZmLCAweDAwNDAsCisJMHg5ZDlkLCAweDYwMjAsIDB4YTEwNiwgMHgwMGMwLCAweDlkYjksIDB4MGQ3ZSwgMHg2MDAwLCAweGEwODYsCisJMHgwMDA0LCAweDAwYzAsIDB4OWRhOSwgMHgxMDc4LCAweGExMzQsIDB4NjAxZiwgMHgwMDA3LCAweDEwNzgsCisJMHgxNzQ5LCAweDYwMTAsIDB4MjA2OCwgMHgxMDc4LCAweDhhNDQsIDB4MDA0MCwgMHg5ZGIzLCAweDA0N2UsCisJMHgxMDc4LCAweDllNzAsIDB4MDQ3ZiwgMHgwZDdmLCAweDEwNzgsIDB4OGMwMSwgMHg4OGZmLCAweDAwYzAsCisJMHg5ZGNkLCAweGFjZTAsIDB4MDAxMCwgMHgyMDAxLCAweGEzMTUsIDB4MjAwNCwgMHhhYzAyLCAweDAwYzgsCisJMHg5ZGMzLCAweDAwNzgsIDB4OWQ2YSwgMHhhMDA2LCAweDEyN2YsIDB4MDI3ZiwgMHgwNjdmLCAweDA3N2YsCisJMHgwODdmLCAweDBjN2YsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4YThjNSwgMHgwMDAxLCAweDAwNzgsCisJMHg5ZGM0LCAweDA3N2UsIDB4MDU3ZSwgMHgwODdlLCAweDIwNDEsIDB4MDAwMCwgMHgyMDI5LCAweDAwMDEsCisJMHgyYzIwLCAweDIwMTksIDB4MDAwMiwgMHg2MjE4LCAweDA5N2UsIDB4MjA0OSwgMHgwMDAwLCAweDEwNzgsCisJMHg3MDU4LCAweDA5N2YsIDB4MDg3ZiwgMHgyMDM5LCAweDAwMDAsIDB4MTA3OCwgMHg3MTA1LCAweDEwNzgsCisJMHg5ZDViLCAweDA1N2YsIDB4MDc3ZiwgMHgwMDdjLCAweDAyN2UsIDB4MDQ3ZSwgMHgwNTdlLCAweDA3N2UsCisJMHgwYzdlLCAweDE1N2UsIDB4MmMyMCwgMHgyMTI4LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHgwMTdlLCAweDAzN2UsIDB4MTA3OCwgMHg0NTAxLCAweDAwYzAsIDB4OWUxNCwgMHgyYzEwLCAweDA1N2UsCisJMHgwODdlLCAweDIwNDEsIDB4MDAwMCwgMHgyNTA4LCAweDIwMjksIDB4MDAwMSwgMHgwOTdlLCAweDIwNDksCisJMHgwMDAwLCAweDEwNzgsIDB4NzA1OCwgMHgwOTdmLCAweDA4N2YsIDB4MjAzOSwgMHgwMDAwLCAweDEwNzgsCisJMHg3MTA1LCAweDEwNzgsIDB4OWQ1YiwgMHgwNTdmLCAweDAzN2YsIDB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsCisJMHg5ZGY4LCAweDE1N2YsIDB4MGM3ZiwgMHgwNzdmLCAweDA1N2YsIDB4MDQ3ZiwgMHgwMjdmLCAweDAwN2MsCisJMHgwNzdlLCAweDA1N2UsIDB4NjIxOCwgMHgwODdlLCAweDIwNDEsIDB4MDAwMCwgMHgyMDI5LCAweDAwMDEsCisJMHgyMDE5LCAweDAwNDgsIDB4MDk3ZSwgMHgyMDQ5LCAweDAwMDAsIDB4MTA3OCwgMHg3MDU4LCAweDA5N2YsCisJMHgwODdmLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDcxMDUsIDB4MmMyMCwgMHgxMDc4LCAweDlkNWIsCisJMHgwNTdmLCAweDA3N2YsIDB4MDA3YywgMHgwMjdlLCAweDA0N2UsIDB4MDU3ZSwgMHgwNzdlLCAweDBjN2UsCisJMHgxNTdlLCAweDJjMjAsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDAzN2UsCisJMHgxMDc4LCAweDQ1MDEsIDB4MDBjMCwgMHg5ZTY0LCAweDJjMTAsIDB4MDg3ZSwgMHgyMDQxLCAweDAwMDAsCisJMHgyODI4LCAweDA0N2UsIDB4MjAyMSwgMHgwMDAxLCAweDEwNzgsIDB4YTExMSwgMHgwNDdmLCAweDA5N2UsCisJMHgyMDQ5LCAweDAwMDAsIDB4MTA3OCwgMHg3MDU4LCAweDA5N2YsIDB4MDg3ZiwgMHgyMDM5LCAweDAwMDAsCisJMHgxMDc4LCAweDcxMDUsIDB4MTA3OCwgMHg5ZDViLCAweDAzN2YsIDB4MDE3ZiwgMHg4MTA4LCAweDAwZjAsCisJMHg5ZTQ2LCAweDE1N2YsIDB4MGM3ZiwgMHgwNzdmLCAweDA1N2YsIDB4MDQ3ZiwgMHgwMjdmLCAweDAwN2MsCisJMHgwMTdlLCAweDBmN2UsIDB4YWQ4MiwgMHhjYTAwLCAweDAwNDgsIDB4OWU4OSwgMHhhZDgyLCAweGZmZmYsCisJMHgwMGM4LCAweDllODksIDB4NjgwMCwgMHhhMDdkLCAweDAwNDAsIDB4OWU4NiwgMHg2ODAzLCAweDAwMDAsCisJMHg2YjUyLCAweDEwNzgsIDB4NDk4MiwgMHgyZjY4LCAweDAwNzgsIDB4OWU3YSwgMHg2YjUyLCAweDEwNzgsCisJMHg0OTgyLCAweDBmN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBlN2UsIDB4MDQ3ZSwgMHgwMzdlLCAweDIwNjEsCisJMHhhYTAwLCAweDIwNzEsIDB4YTMwMCwgMHg3NDQ0LCAweDcwNjAsIDB4ODAwMSwgMHhhNDAyLCAweDAwYzgsCisJMHg5ZWJiLCAweDIxMDAsIDB4YWMwNiwgMHgwMDQwLCAweDllYWQsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsCisJMHgwMDQwLCAweDllYWQsIDB4NjAwOCwgMHhhMjA2LCAweDAwYzAsIDB4OWVhZCwgMHg2MDE4LCAweGExYTAsCisJMHgwMDA2LCAweDI0MjQsIDB4YTQwNiwgMHgwMDQwLCAweDllYjcsIDB4YWNlMCwgMHgwMDEwLCAweDIwMDEsCisJMHhhMzE1LCAweDIwMDQsIDB4YWMwMiwgMHgwMGM4LCAweDllYmIsIDB4MDA3OCwgMHg5ZTkxLCAweGEwODUsCisJMHgwMDAxLCAweDAwNzgsIDB4OWViYywgMHhhMDA2LCAweDAzN2YsIDB4MDQ3ZiwgMHgwZTdmLCAweDAwN2MsCisJMHgwZDdlLCAweDAwN2UsIDB4MTA3OCwgMHgxMzgxLCAweDAwN2YsIDB4MTA0MCwgMHgxMzI4LCAweDY4MzcsCisJMHgwMTBkLCAweDY4NWUsIDB4MDI3ZSwgMHgyMDEwLCAweDEwNzgsIDB4OGEzMCwgMHgyMDAxLCAweDAwMDAsCisJMHgwMDQwLCAweDllZDYsIDB4MjIwMCwgMHhhMDgwLCAweDAwMDgsIDB4MjAwNCwgMHgwMjdmLCAweDY4NGEsCisJMHg2OTU2LCAweDZjNDYsIDB4Njg0ZiwgMHgwMDAwLCAweGEwMDYsIDB4NjhiMiwgMHg2ODAyLCAweDY4M2EsCisJMHg2ODVhLCAweDEwNzgsIDB4NDk4MiwgMHgwZDdmLCAweDAwN2MsIDB4NjcwMCwgMHhhNzg2LCAweDAwMDAsCisJMHgwMDQwLCAweDllZjgsIDB4YTc4NiwgMHgwMDAxLCAweDAwNDAsIDB4OWVmOCwgMHhhNzg2LCAweDAwMGEsCisJMHgwMDQwLCAweDllZjgsIDB4YTc4NiwgMHgwMDA5LCAweDAwNDAsIDB4OWVmOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDBlN2UsIDB4NjAxOCwgMHgyMDcwLCAweDcwYTAsIDB4YTIwNiwgMHgwZTdmLCAweDAwN2MsCisJMHgwMTdlLCAweDYwMDQsIDB4YTA4ZSwgMHgwMDFlLCAweDAwYzAsIDB4OWYxYSwgMHg4MDA3LCAweDYxMzAsCisJMHhhMThjLCAweDAwZmYsIDB4YTEwNSwgMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsCisJMHg2MDFmLCAweDAwMDUsIDB4MjAwMSwgMHhhNWExLCAweDIwMDQsIDB4NjAxNiwgMHgxMDc4LCAweDViZjgsCisJMHgxMDc4LCAweDYxMDksIDB4MDE3ZiwgMHgwMDdjLCAweDAwMDUsIDB4MDAwNSwgMHgwMDdjLCAweDYwMjQsCisJMHhkMGU0LCAweDAwNDAsIDB4OWYzMCwgMHhkMGNjLCAweDAwNDAsIDB4OWYyYSwgMHgxMDc4LCAweDhjZmEsCisJMHgwMDc4LCAweDlmMzAsIDB4MTA3OCwgMHhhMTM0LCAweDEwNzgsIDB4NWE0MSwgMHgxMDc4LCAweDc1M2QsCisJMHgwMDdjLCAweGEyODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweDlmMzgsCisJMHg5ZjQxLCAweDlmNDEsIDB4OWY0MSwgMHg5ZjQzLCAweDlmNDEsIDB4OWY0MywgMHg5ZjQzLCAweDlmNDEsCisJMHg5ZjQzLCAweGEwMDYsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhMjgwLCAweDAwMDcsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweDlmNGQsIDB4OWY1NiwgMHg5ZjU2LCAweDlmNTYsCisJMHg5ZjU2LCAweDlmNTYsIDB4OWY1NiwgMHg5ZjYxLCAweDlmNTYsIDB4OWY1NiwgMHg2MDA3LCAweDAwM2IsCisJMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgyYTAwLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDViZjgsCisJMHgwMDdjLCAweDBjN2UsIDB4MjI2MCwgMHgxMDc4LCAweGExMzQsIDB4NjAzZiwgMHgwMDAwLCAweDYwMjQsCisJMHhjMGY0LCAweGMwY2MsIDB4NjAyNiwgMHgwYzdmLCAweDBkN2UsIDB4MjI2OCwgMHhhMTg2LCAweDAwMDcsCisJMHgwMGMwLCAweDlmYzIsIDB4NjgxMCwgMHhhMDA1LCAweDAwNDAsIDB4OWY3ZiwgMHhhMDgwLCAweDAwMTMsCisJMHgyMDA0LCAweGQwZmMsIDB4MDBjMCwgMHg5ZjdmLCAweDBkN2YsIDB4MDA3OCwgMHg5ZjU2LCAweDYwMDcsCisJMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgxMDc4LCAweDViZjgsIDB4MTA3OCwgMHg2MTA5LCAweDBjN2UsCisJMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwgMHgwMDAyLCAweDAwYzAsIDB4YTA1MCwgMHg2MDEwLCAweGEwMDUsCisJMHgwMGMwLCAweDlmOTksIDB4NjAwMCwgMHhhMDg2LCAweDAwMDcsIDB4MTBjMCwgMHgxMzI4LCAweDAwNzgsCisJMHhhMDUwLCAweGEwOGMsIDB4ZjAwMCwgMHgwMGMwLCAweDlmYTUsIDB4MDA3OCwgMHg5ZmE1LCAweDIwNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MDBjMCwgMHg5ZjlmLCAweDJkMDAsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4OWZiZSwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODRjLCAweGMwZGMsIDB4YzBmNCwgMHg2ODRlLCAweDY4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDY4NTIsCisJMHgyMDA5LCAweDAwNDMsIDB4MTA3OCwgMHg5OGMxLCAweDAwNzgsIDB4YTA1MCwgMHgyMDA5LCAweDAwNDEsCisJMHgwMDc4LCAweGEwNGEsIDB4YTE4NiwgMHgwMDA1LCAweDAwYzAsIDB4YTAwOSwgMHg2ODEwLCAweGEwODAsCisJMHgwMDEzLCAweDIwMDQsIDB4ZDBiYywgMHgwMGMwLCAweDlmZDAsIDB4MGQ3ZiwgMHgwMDc4LCAweDlmNTYsCisJMHhkMGI0LCAweDAwNDAsIDB4OWZkOCwgMHhkMGZjLCAweDEwNDAsIDB4MTMyOCwgMHgwMDc4LCAweDlmNzIsCisJMHg2MDA3LCAweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDEwNzgsIDB4NWJmOCwgMHgxMDc4LCAweDYxMDksCisJMHgwYzdlLCAweDJkNjAsIDB4NjEwMCwgMHhhMTg2LCAweDAwMDIsIDB4MDA0MCwgMHg5ZmViLCAweGExODYsCisJMHgwMDA0LCAweDAwYzAsIDB4YTA1MCwgMHgyMDcxLCAweGE1ZTEsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMGMwLCAweDlmZjgsIDB4NzAwNCwgMHhhYzA2LCAweDAwYzAsIDB4OWZmOCwgMHg3MDAzLCAweDAwMDAsCisJMHg2ODEwLCAweGEwODAsIDB4MDAxMywgMHgyMDBjLCAweGMxZjQsIDB4YzFkYywgMHgyMTAyLCAweDgwMDAsCisJMHgyMDBjLCAweGMxZjQsIDB4YzFmYywgMHhjMWJjLCAweDIxMDIsIDB4MjAwOSwgMHgwMDQyLCAweDAwNzgsCisJMHhhMDRhLCAweDAzN2UsIDB4MGQ3ZSwgMHgwZDdlLCAweDEwNzgsIDB4MTM4MSwgMHgwMzdmLCAweDEwNDAsCisJMHgxMzI4LCAweDY4MzcsIDB4MDEwZCwgMHg2ODAzLCAweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDY4NWIsCisJMHgwMDAwLCAweDZiNWUsIDB4Njg1NywgMHgwMDQ1LCAweDJjMDAsIDB4Njg2MiwgMHg2MDM0LCAweDY4NzIsCisJMHgyMzYwLCAweDYwMjQsIDB4YzBkZCwgMHg2MDI2LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHg2MzIwLCAweDZiNGEsIDB4Njg0NiwgMHg2ODRmLCAweDAwMDAsCisJMHg2ZDZhLCAweDZlNjYsIDB4Njg2ZiwgMHgwMDAxLCAweDEwNzgsIDB4NDk4MiwgMHgyMDE5LCAweDAwNDUsCisJMHg2MDA4LCAweDIwNjgsIDB4MTA3OCwgMHg5YTZhLCAweDJkMDAsIDB4NjAwYSwgMHg2MDFmLCAweDAwMDYsCisJMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLCAweDYwM2YsIDB4MDAwMCwgMHgwZDdmLCAweDAzN2YsCisJMHgwMDc4LCAweGEwNTEsIDB4NjAzZiwgMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgxMDc4LCAweDk4YzEsCisJMHgwYzdmLCAweDBkN2YsIDB4MDA3YywgMHhhMTg2LCAweDAwMTMsIDB4MDBjMCwgMHhhMDVkLCAweDYwMDQsCisJMHhhMDgyLCAweDAwODUsIDB4MjAwOCwgMHgwMDc5LCAweGEwNzcsIDB4YTE4NiwgMHgwMDI3LCAweDAwYzAsCisJMHhhMDcwLCAweDEwNzgsIDB4NjAxMCwgMHgwMzdlLCAweDBkN2UsIDB4NjAxMCwgMHgyMDY4LCAweDIwMTksCisJMHgwMDA0LCAweDEwNzgsIDB4OWU3MCwgMHgwZDdmLCAweDAzN2YsIDB4MTA3OCwgMHg2MTA5LCAweDAwN2MsCisJMHhhMTg2LCAweDAwMTQsIDB4MDA0MCwgMHhhMDYxLCAweDEwNzgsIDB4NzU4MywgMHgwMDdjLCAweGEwODAsCisJMHhhMDdlLCAweGEwN2UsIDB4YTA3ZSwgMHhhMDdlLCAweGEwN2UsIDB4YTA4MCwgMHgxMDc4LCAweDEzMjgsCisJMHgxMDc4LCAweDYwMTAsIDB4NjAwMywgMHgwMDBjLCAweDEwNzgsIDB4NjEwOSwgMHgwMDdjLCAweGExODIsCisJMHgwMDhjLCAweDAwYzgsIDB4YTA5MSwgMHhhMTgyLCAweDAwODUsIDB4MDA0OCwgMHhhMDkxLCAweDAwNzksCisJMHhhMDk0LCAweDEwNzgsIDB4NzU4MywgMHgwMDdjLCAweGEwOWIsIDB4YTA5YiwgMHhhMDliLCAweGEwOWIsCisJMHhhMDlkLCAweGEwYmMsIDB4YTA5YiwgMHgxMDc4LCAweDEzMjgsIDB4MGQ3ZSwgMHgyYzY4LCAweDEwNzgsCisJMHg3NGQ3LCAweDAwNDAsIDB4YTBiNywgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDFlLCAweDIwMDksCisJMHhhODhlLCAweDIxMGMsIDB4NjEzNiwgMHgyMDA5LCAweGE4OGYsIDB4MjEwYywgMHg2MTNhLCAweDYwMGIsCisJMHhmZmZmLCAweDY5MTgsIDB4NjExYSwgMHg2MDFmLCAweDAwMDQsIDB4MTA3OCwgMHg1YmY4LCAweDJkNjAsCisJMHgxMDc4LCAweDc1M2QsIDB4MGQ3ZiwgMHgwMDdjLCAweDEwNzgsIDB4NzUzZCwgMHgwMDdjLCAweDBlN2UsCisJMHg2MDE4LCAweDIwNzAsIDB4NzAwMCwgMHhkMGVjLCAweDBlN2YsIDB4MDA3YywgMHg2MDEwLCAweGEwODAsCisJMHgwMDEzLCAweDIwMGMsIDB4ZDFlYywgMHgwMDQwLCAweGExMTAsIDB4MjAwMSwgMHhhMzcxLCAweDIwMDQsCisJMHhkMGVjLCAweDAwNDAsIDB4YTExMCwgMHg2MDAzLCAweDAwMDIsIDB4NjAyNCwgMHhjMGU1LCAweDYwMjYsCisJMHhkMWFjLCAweDAwNDAsIDB4YTBlZSwgMHgwZjdlLCAweDJjNzgsIDB4MTA3OCwgMHg0ODhmLCAweDBmN2YsCisJMHgwMDQwLCAweGEwZWUsIDB4MjAwMSwgMHhhNWEyLCAweDIwMDQsIDB4NjAzZSwgMHgyMDA5LCAweGEzNzEsCisJMHgyMTBjLCAweGQxZjQsIDB4MDBjMCwgMHhhMTBlLCAweDAwNzgsIDB4YTEwMCwgMHgyMDA5LCAweGEzNzEsCisJMHgyMTBjLCAweGQxZjQsIDB4MDA0MCwgMHhhMGZhLCAweDYwMjQsIDB4YzBlNCwgMHg2MDI2LCAweGEwMDYsCisJMHgwMDc4LCAweGExMTAsIDB4MjAwMSwgMHhhNWEyLCAweDIwMGMsIDB4ODEwMywgMHhhMTAwLCAweDYwM2UsCisJMHg2MDE4LCAweGEwODgsIDB4MDAyYiwgMHgyMTA0LCAweGEwMDUsIDB4MDA0MCwgMHhhMTBiLCAweGEwODgsCisJMHgwMDAzLCAweDAwNzgsIDB4YTEwMywgMHgyYzBhLCAweDYwMGYsIDB4MDAwMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDdjLCAweDAxN2UsIDB4MGM3ZSwgMHgwZTdlLCAweDYxMjAsIDB4YTJmMCwgMHgwMDJiLCAweDJlMDQsCisJMHgyMDYwLCAweDhjZmYsIDB4MDA0MCwgMHhhMTMwLCAweDg0ZmYsIDB4MDBjMCwgMHhhMTIzLCAweDYwMjAsCisJMHhhMTA2LCAweDAwYzAsIDB4YTEyYiwgMHg2MDBjLCAweDIwNzIsIDB4MTA3OCwgMHg1YTQxLCAweDEwNzgsCisJMHg3NTNkLCAweDAwNzgsIDB4YTEyZCwgMHhhY2YwLCAweDAwMDMsIDB4MmU2NCwgMHgwMDc4LCAweGExMTksCisJMHgwZTdmLCAweDBjN2YsIDB4MDE3ZiwgMHgwMDdjLCAweDBkN2UsIDB4NjAxOCwgMHhhMGU4LCAweDAwMmIsCisJMHgyZDA0LCAweGEwMDUsIDB4MDA0MCwgMHhhMTQ2LCAweGFjMDYsIDB4MDA0MCwgMHhhMTQ0LCAweDJkMDQsCisJMHhhMGU4LCAweDAwMDMsIDB4MDA3OCwgMHhhMTM4LCAweDYwMGMsIDB4MjA2YSwgMHgwZDdmLCAweDAwN2MsCisJMHgwMjdlLCAweDAzN2UsIDB4MTU3ZSwgMHgyMDExLCAweGEzMjUsIDB4MjIwNCwgMHhhMDg0LCAweDAwZmYsCisJMHgyMDE5LCAweGE4OGUsIDB4MjMzNCwgMHhhNjM2LCAweDAwYzAsIDB4YTE3NCwgMHg4MzE4LCAweDIzMzQsCisJMHgyMjA0LCAweGEwODQsIDB4ZmYwMCwgMHhhNjM2LCAweDAwYzAsIDB4YTE3NCwgMHgyMDExLCAweGE4OTAsCisJMHg2MDE4LCAweGEwOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MTA3OCwgMHg3ZTU1LCAweDAwYzAsCisJMHhhMTc0LCAweDIwMTEsIDB4YTg5NCwgMHg2MDE4LCAweGEwOTgsIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsCisJMHgxMDc4LCAweDdlNTUsIDB4MDBjMCwgMHhhMTc0LCAweDE1N2YsIDB4MDM3ZiwgMHgwMjdmLCAweDAwN2MsCisJMHgwZTdlLCAweDIwNzEsIDB4YTMwMCwgMHgxMDc4LCAweDQxZjUsIDB4MTA3OCwgMHgyNjBkLCAweDBlN2YsCisJMHgwMDdjLCAweDBlN2UsIDB4NjAxOCwgMHgyMDcwLCAweDcwMDAsIDB4ZDBmYywgMHgwMDQwLCAweGExOGEsCisJMHgxMDc4LCAweGExOGMsIDB4MGU3ZiwgMHgwMDdjLCAweDY4NTAsIDB4YzBlNSwgMHg2ODUyLCAweDAwN2MsCisJMHgwZTdlLCAweDBjN2UsIDB4MDc3ZSwgMHgwNjdlLCAweDA1N2UsIDB4MDQ3ZSwgMHgwMjdlLCAweDAxN2UsCisJMHgxMjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDI5LCAweGE1YjQsIDB4MjUyYywgMHgyMDIxLCAweGE1YmEsCisJMHgyNDI0LCAweDIwNjEsIDB4YWEwMCwgMHgyMDcxLCAweGEzMDAsIDB4NzY0NCwgMHg3MDYwLCAweGE2MDYsCisJMHgwMDQwLCAweGExZTQsIDB4NjcxYywgMHhhNzg2LCAweDAwMDEsIDB4MDA0MCwgMHhhMWIzLCAweGE3ODYsCisJMHgwMDA4LCAweDAwYzAsIDB4YTFkYSwgMHgyNTAwLCAweGFjMDYsIDB4MDA0MCwgMHhhMWRhLCAweDI0MDAsCisJMHhhYzA2LCAweDAwNDAsIDB4YTFkYSwgMHgxMDc4LCAweDllZTUsIDB4MDA0MCwgMHhhMWRhLCAweDEwNzgsCisJMHg5ZWY5LCAweDAwYzAsIDB4YTFkYSwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLCAweGExY2MsCisJMHgwMTdlLCAweDEwNzgsIDB4MTc0OSwgMHgwMTdmLCAweDEwNzgsIDB4OGMyNywgMHgwMGMwLCAweGExZDIsCisJMHgxMDc4LCAweDI4MzksIDB4MTA3OCwgMHg4YzNiLCAweDAwYzAsIDB4YTFkOCwgMHgxMDc4LCAweDdhMDUsCisJMHgxMDc4LCAweDhjMDEsIDB4YWNlMCwgMHgwMDEwLCAweDIwMDEsIDB4YTMxNSwgMHgyMDA0LCAweGFjMDIsCisJMHgwMGM4LCAweGExZTQsIDB4MDA3OCwgMHhhMWEzLCAweDEyN2YsIDB4MDE3ZiwgMHgwMjdmLCAweDA0N2YsCisJMHgwNTdmLCAweDA2N2YsIDB4MDc3ZiwgMHgwYzdmLCAweDBlN2YsIDB4MDA3YywgMHgxMjdlLCAweDAwN2UsCisJMHgwZTdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGEzNDAsIDB4ZDVhNCwgMHgwMDQwLCAweGExZmIsCisJMHg3MDM0LCAweDgwMDAsIDB4NzAzNiwgMHhkNWI0LCAweDAwNDAsIDB4YTIwMSwgMHg3MDMwLCAweDgwMDAsCisJMHg3MDMyLCAweGQ1YWMsIDB4MDA0MCwgMHhhMjA4LCAweDIwNzEsIDB4YTM0YSwgMHgxMDc4LCAweGEyMzcsCisJMHgwZTdmLCAweDAwN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwZTdlLCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4YTM0MCwgMHhkNWE0LCAweDAwNDAsIDB4YTIxOSwgMHg3MDM0LCAweDgwMDAsCisJMHg3MDM2LCAweGQ1YjQsIDB4MDA0MCwgMHhhMjFmLCAweDcwMzAsIDB4ODAwMCwgMHg3MDMyLCAweGQ1YWMsCisJMHgwMDQwLCAweGEyMjYsIDB4MjA3MSwgMHhhMzRhLCAweDEwNzgsIDB4YTIzNywgMHgwZTdmLCAweDAwN2YsCisJMHgxMjdmLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDBlN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsCisJMHhhMzQyLCAweDEwNzgsIDB4YTIzNywgMHgwZTdmLCAweDAwN2YsIDB4MTI3ZiwgMHgwMDdjLCAweDJlMDQsCisJMHg4MDAwLCAweDIwNzIsIDB4MDBjOCwgMHhhMjQwLCAweDhlNzAsIDB4MmUwNCwgMHg4MDAwLCAweDIwNzIsCisJMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHhhMzQwLCAweDEwNzgsIDB4YTIzNywgMHgwZTdmLCAweDAwN2MsCisJMHgwZTdlLCAweDIwNzEsIDB4YTM0NCwgMHgxMDc4LCAweGEyMzcsIDB4MGU3ZiwgMHgwMDdjLCAweDAwMDEsCisJMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLCAweDAxMDAsCisJMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCwgMHg4MDAwLCAweDYyODYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQkJCQkJKgorICogICAgICAgICAgICAgICAtLS0gSVNQMjIwMCBJbml0aWF0b3IvVGFyZ2V0IEZpcm13YXJlIC0tLSAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgd2l0aCBGYWJyaWMgKFB1YmxpYyBMb29wKSwgUG9pbnQtcG9pbnQsIGFuZCAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgZXhwYW5kZWQgTFVOIGFkZHJlc3NpbmcgZm9yIEZDVEFQRSAgICAgICAgICAgICAgICAgICAgICAgKgorICoJCQkJCQkJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIENvcHlyaWdodCAoQykgMjAwMCBhbmQgMjEwMCBRbG9naWMgQ29ycG9yYXRpb24gCisgICh3d3cucWxvZ2ljLmNvbSkKKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJRmlybXdhcmUgVmVyc2lvbiAyLjAxLjI3ICgxMTowNyBEZWMgMTgsIDIwMDApCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9sZW5ndGgyMjAwID0gMHg5Y2JmOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZTIyMDBbXSA9IHsgCisJMHgwNDcwLCAweDAwMDAsIDB4MDAwMCwgMHg5Y2JmLCAweDAwMDAsIDB4MDAwMiwgMHgwMDAxLCAweDAwMWIsCisJMHgwMDE3LCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLCAweDQ5NDcsIDB4NDg1NCwgMHgyMDMxLCAweDM5MzksCisJMHgzOTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLCAweDIwNDMsIDB4NGY1MiwgMHg1MDRmLCAweDUyNDEsCisJMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLCAweDMyMzIsIDB4MzAzMCwgMHgyMDQ2LCAweDY5NzIsCisJMHg2ZDc3LCAweDYxNzIsIDB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsCisJMHgzMjJlLCAweDMwMzEsIDB4MmUzMiwgMHgzNzIwLCAweDIwMjAsIDB4MjAyMCwgMHgyNDAwLCAweDIwYzEsCisJMHgwMDA1LCAweDIwMDEsIDB4MDE3ZiwgMHgyMDAzLCAweDAwMDAsIDB4MjBjOSwgMHhiMWZmLCAweDIwOTEsCisJMHgyMDAwLCAweDIwNTksIDB4MDAwMCwgMHgyYjc4LCAweDc4MjMsIDB4MDAwNCwgMHgyMDg5LCAweDI3YjUsCisJMHgyMDUxLCAweGFkMDAsIDB4MmE3MCwgMHgyMDI5LCAweGU0MDAsIDB4MjAzMSwgMHhmZmZmLCAweDIwMzksCisJMHhlM2U5LCAweDIwMjEsIDB4MDIwMCwgMHgwODA0LCAweDE0NDksIDB4MjBhMSwgMHhhY2JmLCAweGEwMGUsCisJMHgyMGE5LCAweDA3NDEsIDB4NDFhNCwgMHgzNDAwLCAweDc1NWUsIDB4NzY2MiwgMHg3NzVhLCAweDc0NjYsCisJMHg3NDZhLCAweDIwYTEsIDB4YjQwMCwgMHg3MTYwLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsCisJMHhhMThjLCAweDAwMGYsIDB4MjAwMSwgMHgwMDBiLCAweGExMTIsIDB4YTAwZSwgMHgyMWE4LCAweDQxYTQsCisJMHgzNDAwLCAweDgyMTEsIDB4MWRkOCwgMHg3MTYwLCAweDM0MDAsIDB4YTEwMiwgMHgwMTIwLCAweDAyMTgsCisJMHgyMGE4LCAweGEwMGUsIDB4NDFhNCwgMHgzODAwLCAweGQwOGMsIDB4MDFkOCwgMHgyMDA5LCAweGFkMDAsCisJMHg4MTBkLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLCAweGExOGMsIDB4MDAwZiwgMHgyMDAxLCAweDAwMDEsCisJMHhhMTEyLCAweDIwYTEsIDB4MTAwMCwgMHhhMDBlLCAweDIxYTgsIDB4NDFhNCwgMHg4MjExLCAweDFkZTAsCisJMHgyMDA5LCAweGFkMDAsIDB4MzQwMCwgMHhhMTAyLCAweDAxMjAsIDB4MDIxOCwgMHgyMGE4LCAweGEwMGUsCisJMHg0MWE0LCAweDA4MGMsIDB4MTNmYywgMHgwODBjLCAweDE2MTMsIDB4MDgwYywgMHgxN2FjLCAweDA4MGMsCisJMHgxZTY3LCAweDA4MGMsIDB4NDkyZSwgMHgwODBjLCAweDgwMWEsIDB4MDgwYywgMHgxNTljLCAweDA4MGMsCisJMHgyY2U2LCAweDA4MGMsIDB4NWEwMSwgMHgwODBjLCAweDUwNDUsIDB4MDgwYywgMHg2NDg3LCAweDA4MGMsCisJMHgyMzZhLCAweDA4MGMsIDB4NjY4NiwgMHgwODBjLCAweDVmYWUsIDB4MDgwYywgMHgyMjZiLCAweDA4MGMsCisJMHgyMzM4LCAweDIwOTEsIDB4MzAwOSwgMHg3ODIzLCAweDAwMDAsIDB4MTAwNCwgMHgxMGM1LCAweDc4MjAsCisJMHhhMDg2LCAweDAwMDIsIDB4MTE1MCwgMHg3ODIzLCAweDQwMDAsIDB4MGUwNCwgMHgxMGJkLCAweDc4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MmE3MCwgMHg3MDAzLCAweDAwMDAsCisJMHgyYTcwLCAweDcwMDAsIDB4YTA4ZSwgMHgwMDAzLCAweDExNTgsIDB4MDgwYywgMHgzYzk4LCAweDA4MGMsCisJMHgyZDBkLCAweDA4MGMsIDB4NWE0ZiwgMHgwODBjLCAweDUxZjQsIDB4MDgwYywgMHg2NGEyLCAweDBjODAsCisJMHgwMDBiLCAweDBjOTgsIDB4MTBlNCwgMHgxMGU1LCAweDEyMDMsIDB4MTBlMiwgMHgxMmNjLCAweDEzZjksCisJMHgxM2ZhLCAweDEzZmIsIDB4MDgwYywgMHgxNGY2LCAweDAwMDUsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAxLCAweDE5MDQsIDB4MTFkMSwgMHgwODBjLCAweDE1NjksCisJMHgwODBjLCAweDU3NGYsIDB4MDE1MCwgMHgwODBjLCAweDU3NzUsIDB4MTU4MCwgMHgyMDc5LCAweDAxMDAsCisJMHg3ODI4LCAweGEwODUsIDB4MTgwMCwgMHg3ODJhLCAweDA0NDgsIDB4MDgwYywgMHg1NjlhLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDEsIDB4MTkwNCwgMHgxMWQxLCAweDcwODgsIDB4YTA4NiwgMHgwMDI4LCAweDE5MDQsCisJMHgxMWQxLCAweDIwNzksIDB4MDEwMCwgMHg3ODI3LCAweGZmZmYsIDB4N2EyOCwgMHhhMjk1LCAweDFlMmYsCisJMHg3YTJhLCAweDIwMTEsIDB4NTY2ZSwgMHgwODBjLCAweDY1MGQsIDB4MjAxMSwgMHg1NjdiLCAweDA4MGMsCisJMHg2NTBkLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLCAweDY1MGQsIDB4MjAxMSwgMHg4MDMwLCAweDIwMTksCisJMHgwMDAwLCAweDcwODcsIDB4MDAwMCwgMHgwODBjLCAweDFkMGYsIDB4MDBlOCwgMHgwODBjLCAweDQxZDEsCisJMHgyMDc5LCAweDAxMDAsIDB4Nzg0NCwgMHhhMDA1LCAweDE5MDQsIDB4MTFkMSwgMHgyMDExLCAweDQ4MWIsCisJMHgwODBjLCAweDY1MGQsIDB4MjAxMSwgMHg1NjdiLCAweDA4MGMsIDB4NjUwZCwgMHgwODBjLCAweDFkMGYsCisJMHgyMDAxLCAweGFmOGMsIDB4MjAwNCwgMHg3ODBlLCAweDc4NDAsIDB4YTA4NCwgMHhmZmZiLCAweDc4NDIsCisJMHgyMDExLCAweDgwMTAsIDB4NzNjOCwgMHgwODBjLCAweDNjNWMsIDB4NzIzOCwgMHhjMjg0LCAweDcyM2EsCisJMHgyMDAxLCAweGFkMGMsIDB4MjAwYywgMHhjMWFjLCAweDIxMDIsIDB4MDgwYywgMHg3OWJkLCAweDIwMTEsCisJMHgwMDA0LCAweDA4MGMsIDB4OTU5YywgMHgwODBjLCAweDRmNzEsIDB4MDgwYywgMHg1NzRmLCAweDAxNTgsCisJMHgwODBjLCAweDQ5MTcsIDB4MDE0MCwgMHg3MDg3LCAweDAwMDEsIDB4NzBjMywgMHgwMDAwLCAweDA4MGMsCisJMHg0MzZlLCAweDA4MDQsIDB4MTFkMSwgMHgwODBjLCAweDUwMmQsIDB4MDEyMCwgMHg3YTBjLCAweGMyYjQsCisJMHg3YTBlLCAweDAwNTAsIDB4MDgwYywgMHg5OTM3LCAweDcwZDAsIDB4ZDA5YywgMHgxMTI4LCAweDcwOWMsCisJMHhhMDA1LCAweDAxMTAsIDB4MDgwYywgMHg0OGY1LCAweDcwZGIsIDB4MDAwMCwgMHg3MGQ3LCAweDAwMDAsCisJMHg3MmQwLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTc4LCAweDIwMTEsIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsCisJMHgyNzQ0LCAweDIwMTksIDB4YWY4ZSwgMHgyMTFhLCAweDAwMWUsIDB4NzA0ZiwgMHhmZmZmLCAweDcwNTMsCisJMHgwMGVmLCAweDcwNzMsIDB4MDAwMCwgMHgyMDc5LCAweGFkNTEsIDB4NzgwNCwgMHhkMGFjLCAweDAxMDgsCisJMHhjMjk1LCAweDcyZDIsIDB4MDgwYywgMHg1NzRmLCAweDAxMTgsIDB4YTI5NiwgMHgwMDA0LCAweDA1MDgsCisJMHgyMDExLCAweDAwMDEsIDB4MDgwYywgMHg5NTljLCAweDcwOTcsIDB4MDAwMCwgMHg3MDliLCAweGZmZmYsCisJMHg3MDAzLCAweDAwMDIsIDB4MDBmZSwgMHgwODBjLCAweDI4ZmEsIDB4MjAxMSwgMHgwMDA1LCAweDA4MGMsCisJMHg3YWRmLCAweDA4MGMsIDB4NmM1MCwgMHgwODBjLCAweDU3NGYsIDB4MDE0OCwgMHgwMGM2LCAweDIwNjEsCisJMHgwMTAwLCAweDAwMTYsIDB4MDgwYywgMHgyNzQ0LCAweDYxZTIsIDB4MDAxZSwgMHgwMGNlLCAweDAxMmUsCisJMHgwMGQwLCAweDcwOTcsIDB4MDAwMCwgMHg3MDliLCAweGZmZmYsIDB4NzAwMywgMHgwMDAyLCAweDIwMTEsCisJMHgwMDA1LCAweDA4MGMsIDB4N2FkZiwgMHgwODBjLCAweDZjNTAsIDB4MDgwYywgMHg1NzRmLCAweDAxNDgsCisJMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHgwMDE2LCAweDA4MGMsIDB4Mjc0NCwgMHg2MWUyLCAweDAwMWUsCisJMHgwMGNlLCAweDAwZmUsIDB4MDEyZSwgMHgwMDA1LCAweDAwYzYsIDB4MDgwYywgMHg1NzRmLCAweDExMTgsCisJMHgyMGE5LCAweDAxMDAsIDB4MDAxMCwgMHgyMGE5LCAweDAwODIsIDB4MDgwYywgMHg1NzRmLCAweDExMTgsCisJMHgyMDA5LCAweDAwMDAsIDB4MDAxMCwgMHgyMDA5LCAweDAwN2UsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsCisJMHgyMTEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4N2NmNCwgMHgwMDJlLCAweDA4MGMsCisJMHhhYzA3LCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDA4MGMsIDB4MmJjOSwgMHg4MTA4LCAweDFmMDQsCisJMHgxMWU1LCAweDAwY2UsIDB4NzA2ZiwgMHgwMDAwLCAweDcwNzAsIDB4YTA4NCwgMHgwMGZmLCAweDcwNzIsCisJMHg3MDlmLCAweDAwMDAsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAyLCAweDE5MDQsIDB4MTJjYSwgMHg3MDk4LCAweGEwODYsIDB4ZmZmZiwgMHgwMTMwLCAweDA4MGMsCisJMHgyOGZhLCAweDA4MGMsIDB4NmM1MCwgMHgwODA0LCAweDEyY2EsIDB4NzBkMCwgMHhkMGFjLCAweDExMTAsCisJMHhkMDljLCAweDA1NDAsIDB4ZDA4NCwgMHgwNTMwLCAweDAwMDYsIDB4MDAxNiwgMHgyMDAxLCAweDAxMDMsCisJMHgyMDA5LCAweGFmOGMsIDB4MjEwYywgMHgyMTAyLCAweDAwMWUsIDB4MDAwZSwgMHhkMDhjLCAweDAxZDAsCisJMHg3MGQ0LCAweGEwODYsIDB4ZmZmZiwgMHgwMTkwLCAweDA4MGMsIDB4MmE1NiwgMHgwODBjLCAweDZjNTAsCisJMHg3MGQwLCAweGQwOTQsIDB4MTkwNCwgMHgxMmNhLCAweDIwMTEsIDB4MDAwMSwgMHgyMDE5LCAweDAwMDAsCisJMHgwODBjLCAweDJhOGMsIDB4MDgwYywgMHg2YzUwLCAweDA4MDQsIDB4MTJjYSwgMHg3MGQ4LCAweGEwMDUsCisJMHgxOTA0LCAweDEyY2EsIDB4NzA5NCwgMHhhMDA1LCAweDE5MDQsIDB4MTJjYSwgMHg3MGQwLCAweGQwYTQsCisJMHgwMTE4LCAweGQwYjQsIDB4MDkwNCwgMHgxMmNhLCAweDA4MGMsIDB4NTAyZCwgMHgxOTA0LCAweDEyY2EsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGFjLCAweDAxYzgsIDB4MDE1NiwgMHgwMGM2LCAweDIwYTksCisJMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsIDB4NGNkYywgMHgxMTE4LCAweDYwMDAsCisJMHhkMGVjLCAweDExMzgsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsIDB4MTI1YiwgMHgwMGNlLCAweDAxNWUsCisJMHgwMDI4LCAweDAwMWUsIDB4MDBjZSwgMHgwMTVlLCAweDA4MDQsIDB4MTJjYSwgMHgwMDA2LCAweDAwMTYsCisJMHgyMDAxLCAweDAxMDMsIDB4MjAwOSwgMHhhZjhjLCAweDIxMGMsIDB4MjEwMiwgMHgwMDFlLCAweDAwMGUsCisJMHhhMDA2LCAweDIwMDksIDB4MDcwMCwgMHgyMGE5LCAweDAwMDIsIDB4MjBhMSwgMHhhZmI1LCAweDQwYTEsCisJMHg3MDZjLCAweDgwMDcsIDB4NzE3MCwgMHg4MTBmLCAweDIwYTksIDB4MDAwMiwgMHg0MGExLCAweDIwMDksCisJMHgwMDAwLCAweDA4MGMsIDB4MTRkYywgMHgyMDAxLCAweDAwMDAsIDB4ODEwZiwgMHgyMGE5LCAweDAwMDIsCisJMHg0MGExLCAweGEwMDYsIDB4MjAwOSwgMHgwMjAwLCAweDIwYTksIDB4MDAwMiwgMHgyMGExLCAweGFmYzUsCisJMHg0MGExLCAweDcwMzAsIDB4YzA4YywgMHg3MDMyLCAweDcwMDMsIDB4MDAwMywgMHg3MDliLCAweGZmZmYsCisJMHgwODBjLCAweDE1NjIsIDB4YTAwNiwgMHgwODBjLCAweDI2MWUsIDB4MDgwYywgMHgzY2NlLCAweDAwZjYsCisJMHgyMDc5LCAweDAxMDAsIDB4MDgwYywgMHg1Nzc1LCAweDAxNTAsIDB4MDgwYywgMHg1NzRmLCAweDc4MjgsCisJMHgwMTE4LCAweGEwODQsIDB4ZTFmZiwgMHgwMDEwLCAweGEwODQsIDB4ZmZkZiwgMHg3ODJhLCAweDAwZmUsCisJMHgyMDAxLCAweGFmYzgsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDUsIDB4MTEyMCwgMHgyMDExLCAweDAwMDAsCisJMHgwODBjLCAweDdhZGYsIDB4MjAxMSwgMHgwMDAwLCAweDA4MGMsIDB4N2FlOSwgMHgwODBjLCAweDZjNTAsCisJMHgwODBjLCAweDZkMGQsIDB4MDEyZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA0NiwgMHgwMGY2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDksIDB4YWQzMywgMHgyMTA0LCAweGEwMDUsCisJMHgxMTEwLCAweDA4MGMsIDB4Mjc3MCwgMHgyMDA5LCAweDAwZjcsIDB4MDgwYywgMHg0OGRlLCAweDc5NDAsCisJMHhhMThjLCAweDAwMTAsIDB4Nzk0MiwgMHg3OTI0LCAweGQxYjQsIDB4MDExMCwgMHg3ODI3LCAweDAwNDAsCisJMHhkMTljLCAweDAxMTAsIDB4NzgyNywgMHgwMDA4LCAweDAwMDYsIDB4MDAzNiwgMHgwMTU2LCAweDc5NTQsCisJMHhkMWFjLCAweDE5MDQsIDB4MTMzYSwgMHgwODBjLCAweDU3NjEsIDB4MDE1OCwgMHgwODBjLCAweDU3NzUsCisJMHgxMTI4LCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLCAweDAwMDAsIDB4MDA3MCwgMHgwODBjLCAweDU3NTcsCisJMHgwZGMwLCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NTY5YSwgMHgwMDU4LCAweDA4MGMsIDB4NTc0ZiwgMHgwMTQwLCAweDIwMDksCisJMHgwMGY4LCAweDA4MGMsIDB4NDhkZSwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDIwYTksCisJMHgwOWM0LCAweDc4MjAsIDB4ZDA5YywgMHgxMTM4LCAweDA4MGMsIDB4NTc0ZiwgMHgwMTM4LCAweDc4MjQsCisJMHhkMGFjLCAweDE5MDQsIDB4MTNlMCwgMHgxZjA0LCAweDEzMTksIDB4MDA3MCwgMHg3ODI0LCAweDA4MGMsCisJMHg1NzZiLCAweDAxMTgsIDB4ZDBhYywgMHgxOTA0LCAweDEzZTAsIDB4YTA4NCwgMHgxODAwLCAweDBkOTgsCisJMHg3MDAzLCAweDAwMDEsIDB4MDgwNCwgMHgxM2UwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI2MWUsCisJMHgwODA0LCAweDEzZWYsIDB4Nzg1MCwgMHhhMDg0LCAweDAxODAsIDB4Nzg1MiwgMHg3ODJmLCAweDAwMjAsCisJMHgyMGE5LCAweDAwNDYsIDB4MWQwNCwgMHgxMzQyLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDEzNDIsCisJMHg3ODUwLCAweGEwODQsIDB4MDE4MCwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1MiwgMHg3ODJmLCAweDAwMDAsCisJMHgwODBjLCAweDU3NjEsIDB4MDE1OCwgMHgwODBjLCAweDU3NzUsIDB4MTEyOCwgMHgyMDAxLCAweGFmOWQsCisJMHgyMDAzLCAweDAwMDAsIDB4MDA3MCwgMHgwODBjLCAweDU3NTcsIDB4MGRjMCwgMHgyMDAxLCAweGFmOWQsCisJMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDU2OWEsCisJMHgwMDIwLCAweDIwMDksIDB4MDBmOCwgMHgwODBjLCAweDQ4ZGUsIDB4MjBhOSwgMHgwMDBlLCAweGUwMDAsCisJMHgxZjA0LCAweDEzNmYsIDB4Nzg1MCwgMHhhMDg0LCAweDAxODAsIDB4YTA4NSwgMHgxNDAwLCAweDc4NTIsCisJMHgwODBjLCAweDU3NGYsIDB4MDEyMCwgMHg3ODQzLCAweDAwOTAsIDB4Nzg0MywgMHgwMDEwLCAweDIwMjEsCisJMHhlNjc4LCAweDIwMTksIDB4ZWE2MCwgMHg3ODIwLCAweGQwOWMsIDB4MTU1OCwgMHgwODBjLCAweDU3NGYsCisJMHgwNWI4LCAweDc4MjQsIDB4ZDBhYywgMHgxOTA0LCAweDEzZTAsIDB4MDgwYywgMHg1Nzc1LCAweDE1MDgsCisJMHgwMDQ2LCAweDIwMjEsIDB4MDE5MCwgMHg4NDIxLCAweDFkZjAsIDB4MDA0ZSwgMHg4NDIxLCAweDExYzgsCisJMHg3ODI3LCAweDAwNDgsIDB4MjBhOSwgMHgwMWY0LCAweDFkMDQsIDB4MTM5YywgMHgyMDkxLCAweDYwMDAsCisJMHgxZjA0LCAweDEzOWMsIDB4NzgyNCwgMHhhMDg0LCAweDAwNjgsIDB4MTVhOCwgMHgyMDAxLCAweGFmOWQsCisJMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHg3MDAzLCAweDAwMDEsCisJMHgwNDc4LCAweDgzMTksIDB4MTk4MCwgMHgyMDA5LCAweGFkMzMsIDB4MjEwNCwgMHg4MDAwLCAweDIwMGEsCisJMHhhMDg0LCAweGZmZjAsIDB4MDEyMCwgMHgyMDBiLCAweDAwMDAsIDB4MDgwYywgMHgyNzcwLCAweDAwZDgsCisJMHgwODBjLCAweDU3NjEsIDB4MTE0MCwgMHhhNGEyLCAweDAwNjQsIDB4MTEyOCwgMHgwODBjLCAweDU3MjYsCisJMHg3MDAzLCAweDAwMDEsIDB4MDBhOCwgMHg3ODI3LCAweDE4MDAsIDB4ZTAwMCwgMHhlMDAwLCAweDc4MjQsCisJMHgwODBjLCAweDU3NmIsIDB4MDExMCwgMHhkMGFjLCAweDExNTgsIDB4YTA4NCwgMHgxODAwLCAweDA5YzgsCisJMHg3MDAzLCAweDAwMDEsIDB4MDAyOCwgMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHgyNjFlLCAweDAwNDgsCisJMHgyMDAxLCAweGFkMzMsIDB4MjAwMywgMHgwMDAwLCAweDc4MjcsIDB4MDA0OCwgMHg3ODI4LCAweGMwOWQsCisJMHg3ODJhLCAweDc4NTAsIDB4YTA4NCwgMHgwMTgwLCAweGEwODUsIDB4MDQwMCwgMHg3ODUyLCAweDAxNWUsCisJMHgwMDNlLCAweDAwMGUsIDB4MDgwYywgMHgxNTM5LCAweDAxMmUsIDB4MDBmZSwgMHgwMDRlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDJhNzAsIDB4MjAwMSwgMHhhZjlkLCAweDIwMDMsCisJMHgwMDAwLCAweDcwODcsIDB4MDAwMCwgMHgyMDA5LCAweDAxMDAsIDB4MjEwNCwgMHhhMDgyLCAweDAwMDIsCisJMHgwMjE4LCAweDcwNGYsIDB4ZmZmZiwgMHgwMDEwLCAweDcwNGYsIDB4MDAwMCwgMHg3MDU3LCAweGZmZmYsCisJMHg3MDZmLCAweDAwMDAsIDB4NzA3MywgMHgwMDAwLCAweDA4MGMsIDB4OTkzNywgMHgyMDYxLCAweGFmOGQsCisJMHg2MDAzLCAweDA5MDksIDB4NjAwNywgMHgwMDAwLCAweDYwMGIsIDB4ODgwMCwgMHg2MDBmLCAweDAyMDAsCisJMHg2MDEzLCAweDAwZmYsIDB4NjAxNywgMHgwMDAzLCAweDYwMWIsIDB4MDAwMCwgMHg2MDFmLCAweDA3ZDAsCisJMHgyMDYxLCAweGFmOTUsIDB4NjAwMywgMHg4MDAwLCAweDYwMDcsIDB4MDAwMCwgMHg2MDBiLCAweDAwMDAsCisJMHg2MDBmLCAweDAyMDAsIDB4NjAxMywgMHgwMGZmLCAweDYwMTcsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDEsCisJMHg2MDFmLCAweDAwMDAsIDB4MjA2MSwgMHhhZmE2LCAweDYwMDMsIDB4NTE0YywgMHg2MDA3LCAweDRmNDcsCisJMHg2MDBiLCAweDQ5NDMsIDB4NjAwZiwgMHgyMDIwLCAweDIwMDEsIDB4YWQyNywgMHgyMDAzLCAweDAwMDAsCisJMHgwMDA1LCAweDA0YTAsIDB4MjAxMSwgMHgwMDAwLCAweDgxZmYsIDB4MDU3MCwgMHhhMTg2LCAweDAwMDEsCisJMHgxMTQ4LCAweDIwMzEsIDB4OGZmZiwgMHgyMDM5LCAweGNjMDEsIDB4MjAyMSwgMHgwMTAwLCAweDIwMjksCisJMHhjYzAwLCAweDAwZTgsIDB4YTE4NiwgMHgwMDAyLCAweDExMTgsIDB4MjAxMSwgMHgwMDAwLCAweDAwYjgsCisJMHhhMTg2LCAweDAwMDUsIDB4MTExOCwgMHgyMDExLCAweDAwMDEsIDB4MDA4OCwgMHhhMTg2LCAweDAwMDksCisJMHgxMTE4LCAweDIwMTEsIDB4MDAwMiwgMHgwMDU4LCAweGExODYsIDB4MDAwYSwgMHgxMTE4LCAweDIwMTEsCisJMHgwMDAyLCAweDAwMjgsIDB4YTE4NiwgMHgwMDU1LCAweDExMTAsIDB4MjAxMSwgMHgwMDAzLCAweDM4MDAsCisJMHhhMDg0LCAweGZmZmMsIDB4YTIwNSwgMHgyMGMwLCAweDA4MDQsIDB4MTA0ZCwgMHhhMDBlLCAweDIwMTEsCisJMHgwMDAzLCAweDIwMTksIDB4MTQ4NSwgMHgwODA0LCAweDE0ZDYsIDB4MjAxOSwgMHhhYWFhLCAweDIwNjEsCisJMHhmZmZmLCAweDJjMTQsIDB4MjM2MiwgMHhlMDAwLCAweGUwMDAsIDB4MmMwNCwgMHhhMzA2LCAweDIyNjIsCisJMHgxMTEwLCAweGMxYjUsIDB4YzFhNSwgMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHgxNDk4LCAweDA0ZjAsCisJMHgyMDE5LCAweGFhYWEsIDB4MjA2MSwgMHhmZmZmLCAweDJjMTQsIDB4MjM2MiwgMHhlMDAwLCAweGUwMDAsCisJMHgyYzFjLCAweDIwNjEsIDB4N2ZmZiwgMHhlMDAwLCAweGUwMDAsIDB4MmMwNCwgMHgyMDYxLCAweGZmZmYsCisJMHgyMjYyLCAweGEzMDYsIDB4MDExMCwgMHhjMThkLCAweDAwMDgsIDB4YzE4NSwgMHgyMDExLCAweDAwMDIsCisJMHgyMDE5LCAweDE0YjMsIDB4MDQxOCwgMHgyMDYxLCAweGZmZmYsIDB4MjAxOSwgMHhhYWFhLCAweDJjMTQsCisJMHgyMzYyLCAweGUwMDAsIDB4ZTAwMCwgMHgyYzA0LCAweDIyNjIsIDB4YTMwNiwgMHgxMTgwLCAweDJjMTQsCisJMHgyMzYyLCAweGUwMDAsIDB4ZTAwMCwgMHgyYzFjLCAweDIwNjEsIDB4N2ZmZiwgMHgyYzA0LCAweDIwNjEsCisJMHhmZmZmLCAweDIyNjIsIDB4YTMwNiwgMHgxMTEwLCAweGMxOTUsIDB4MDAwOCwgMHhjMTlkLCAweDIwMTEsCisJMHgwMDAxLCAweDIwMTksIDB4MTRkNCwgMHgwMDEwLCAweDA4MDQsIDB4MTQ0YSwgMHgzODAwLCAweGEwODQsCisJMHhmZmZjLCAweGEyMDUsIDB4MjBjMCwgMHgwODM3LCAweDIwMTEsIDB4MDAwMCwgMHgwODBjLCAweDRjZGMsCisJMHgxMTc4LCAweDYwMDQsIDB4YTBjNCwgMHgwMGZmLCAweGE4YzYsIDB4MDAwNiwgMHgwMTI4LCAweGEwYzQsCisJMHhmZjAwLCAweGE4YzYsIDB4MDYwMCwgMHgxMTIwLCAweGExODYsIDB4MDA4MCwgMHgwMTA4LCAweDgyMTAsCisJMHg4MTA4LCAweGExODYsIDB4MDEwMCwgMHgxZDUwLCAweDIyMDgsIDB4MDAwNSwgMHgyMDkxLCAweDgwMDAsCisJMHgwZTA0LCAweDE0ZjgsIDB4MDAwNiwgMHgwMDE2LCAweDIwNzksIDB4MDAwMCwgMHg3ODE4LCAweGQwODQsCisJMHgxZGU4LCAweDAwMWUsIDB4NzkyZSwgMHgwMDBlLCAweDc4MmEsIDB4MDAwZSwgMHg3ODI2LCAweDM5MDAsCisJMHg3ODNhLCAweDc4MjMsIDB4ODAwMiwgMHg3ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg1MDAwLCAweDAxMjYsCisJMHgwMTU2LCAweDAxNDYsIDB4MjBhOSwgMHgwMDEwLCAweDIwYTEsIDB4YjBjOCwgMHgyMDkxLCAweDIwMDAsCisJMHg0MGExLCAweDIwYTksIDB4MDAxMCwgMHgyMDkxLCAweDIyMDAsIDB4NDBhMSwgMHgyMGE5LCAweDAwMTAsCisJMHgyMDkxLCAweDI0MDAsIDB4NDBhMSwgMHgyMGE5LCAweDAwMTAsIDB4MjA5MSwgMHgyNjAwLCAweDQwYTEsCisJMHgyMGE5LCAweDAwMTAsIDB4MjA5MSwgMHgyODAwLCAweDQwYTEsIDB4MDE0ZSwgMHgwMTVlLCAweDAxMmUsCisJMHgyMDc5LCAweGFkMDAsIDB4NzgwMywgMHgwMDA1LCAweDIwOTEsIDB4NDA4MCwgMHgwNGM5LCAweDBjZjgsCisJMHgwMDA1LCAweDAwMDYsIDB4MDgwYywgMHgxNTg0LCAweDE1MTgsIDB4MDBmNiwgMHgyMDc5LCAweGFkMjMsCisJMHgyZjA0LCAweDgwMDAsIDB4MjA3YSwgMHhhMDgyLCAweDAwMGYsIDB4MDI1OCwgMHhhMDA2LCAweDIwN2EsCisJMHgyMDc5LCAweGFkMjUsIDB4MmYwNCwgMHhhMDg0LCAweDAwMDEsIDB4YTA4NiwgMHgwMDAxLCAweDIwN2EsCisJMHgwMDcwLCAweDIwNzksIDB4YWQyNSwgMHgyZjdjLCAweDhmZmYsIDB4MTEyOCwgMHgyMDAxLCAweDBjMDMsCisJMHgyMDAzLCAweDAwNDAsIDB4MDAyMCwgMHgyMDAxLCAweDBjMDMsIDB4MjAwMywgMHgwMGMwLCAweDAwZmUsCisJMHgwMDBlLCAweDAwMDUsIDB4MDQwOSwgMHgxMTIwLCAweDIwMDEsIDB4MGMwMywgMHgyMDAzLCAweDAwODAsCisJMHgwMDA1LCAweDAwZDEsIDB4MTEyMCwgMHgyMDAxLCAweDBjMDMsIDB4MjAwMywgMHgwMDQwLCAweDAwMDUsCisJMHgwMDA2LCAweDAwOTEsIDB4MTE3OCwgMHgyMDAxLCAweDBjMDMsIDB4MjAwMywgMHgwMDQwLCAweDIwMDksCisJMHgwZmZmLCAweDAwYTEsIDB4MjAwMSwgMHgwYzAzLCAweDIwMDMsIDB4MDA4MCwgMHgyMDA5LCAweDBmZmYsCisJMHgwMDY5LCAweDBjODgsIDB4MDAwZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHgwYzAwLCAweDJjMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMGFhLCAweDAwY2UsIDB4MDAwNSwgMHgwMTU2LCAweDAxMjYsCisJMHhhMThjLCAweDBmZmYsIDB4MjFhOCwgMHgxZDA0LCAweDE1OTMsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsCisJMHgxNTkzLCAweDAxMmUsIDB4MDE1ZSwgMHgwMDA1LCAweDIwNzEsIDB4YWQwMCwgMHg3MTVjLCAweDcxMmUsCisJMHgyMDIxLCAweDAwMDEsIDB4YTE5MCwgMHgwMDMwLCAweGEyOTgsIDB4MDAzMCwgMHgwMjQwLCAweDcwNjAsCisJMHhhMzAyLCAweDEyMjgsIDB4MjIwYSwgMHgyMjA4LCAweDIzMTAsIDB4ODQyMCwgMHgwY2E4LCAweDM4MDAsCisJMHhkMDhjLCAweDAxNDgsIDB4NzA2MCwgMHhhMDg2LCAweGFkMDAsIDB4MDEyOCwgMHg3MDYzLCAweGFkMDAsCisJMHgyMDExLCAweDEwMDAsIDB4MGM0OCwgMHgyMDBiLCAweDAwMDAsIDB4NzRhZSwgMHg3NGIyLCAweDAwMDUsCisJMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWQwMCwgMHg3MGIwLCAweGEwZWEsCisJMHgwMDEwLCAweDAyNjgsIDB4ODAwMSwgMHg3MGIyLCAweDcwMmMsIDB4MjA2OCwgMHgyZDA0LCAweDcwMmUsCisJMHgyMDZiLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweGEwNmUsCisJMHgwY2Q4LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwYjAsCisJMHg4MDAxLCAweDAyNjAsIDB4NzBiMiwgMHg3MDJjLCAweDIwNjgsIDB4MmQwNCwgMHg3MDJlLCAweDIwNmIsCisJMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHhhMDZlLCAweDBjZDgsCisJMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWQwMCwgMHg3MDJjLCAweDIwNmEsCisJMHgyZDAwLCAweDcwMmUsIDB4NzBiMCwgMHg4MDAwLCAweDcwYjIsIDB4MDEyZSwgMHgwMGVlLCAweDAwMDUsCisJMHg4ZGZmLCAweDAxMzgsIDB4NjgwNCwgMHg2ODA3LCAweDAwMDAsIDB4MDAwNiwgMHgwYzQ5LCAweDAwZGUsCisJMHgwY2I4LCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGFkMDAsIDB4NzBiMCwgMHhhMDhhLCAweDAwMTAsCisJMHhhMDBkLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWZlYywgMHg3MDA3LCAweDAwMDAsCisJMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwMDAwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDEwLCAweGEwODUsCisJMHg4MDA0LCAweDcwMTIsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjI3MCwgMHg3MDBiLCAweDAwMDAsCisJMHgyMDcxLCAweGFmZWMsIDB4NzAxOCwgMHhhMDg4LCAweGFmZjUsIDB4MjIwYSwgMHg4MDAwLCAweGEwODQsCisJMHgwMDA3LCAweDcwMWEsIDB4NzAwNCwgMHhhMDA1LCAweDExMjgsIDB4MDBmNiwgMHgyMDc5LCAweDAwMTAsCisJMHgwMDgxLCAweDAwZmUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZmVjLCAweDcwMDQsCisJMHhhMDA1LCAweDExMjgsIDB4MDBmNiwgMHgyMDc5LCAweDAwMTAsIDB4MDAxOSwgMHgwMGZlLCAweDAwZWUsCisJMHgwMDA1LCAweDcwMDAsIDB4MDAwMiwgMHgxNjRmLCAweDE2YjMsIDB4MTZkMCwgMHgxNmQwLCAweDcwMTgsCisJMHg3MTFjLCAweGExMDYsIDB4MTExOCwgMHg3MDA3LCAweDAwMDAsIDB4MDAwNSwgMHgwMGQ2LCAweGExODAsCisJMHhhZmY1LCAweDIwMDQsIDB4NzAwYSwgMHgyMDY4LCAweDgxMDgsIDB4YTE4YywgMHgwMDA3LCAweDcxMWUsCisJMHg3ODAzLCAweDAwMjYsIDB4NjgyNCwgMHg3ODMyLCAweDY4MjgsIDB4NzgzNiwgMHg2ODJjLCAweDc4M2EsCisJMHg2ODMwLCAweDc4M2UsIDB4NjgxMCwgMHg3MDBlLCAweDY4MGMsIDB4NzAxNiwgMHg2ODA0LCAweDAwZGUsCisJMHhkMDg0LCAweDAxMjAsIDB4NzAwNywgMHgwMDAxLCAweDAwMjksIDB4MDAwNSwgMHg3MDA3LCAweDAwMDIsCisJMHgwMGIxLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDcxMGMsIDB4MjAxMSwgMHgwMDQwLCAweGExODIsCisJMHgwMDQwLCAweDEyMTAsIDB4MjExMCwgMHhhMDA2LCAweDcwMGUsIDB4NzIxMiwgMHg4MjAzLCAweDc4MjIsCisJMHg3ODAzLCAweDAwMjAsIDB4NzgwMywgMHgwMDQxLCAweDAwMmUsIDB4MDAxZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMDI2LCAweDAxMzYsIDB4MDE0NiwgMHgwMTU2LCAweDcwMTQsIDB4MjA5OCwgMHgyMGExLCAweDAwMTQsCisJMHg3ODAzLCAweDAwMjYsIDB4NzEwYywgMHgyMDExLCAweDAwNDAsIDB4YTE4MiwgMHgwMDQwLCAweDEyMTAsCisJMHgyMTEwLCAweGEwMDYsIDB4NzAwZSwgMHgyMmE4LCAweDUzYTYsIDB4ODIwMywgMHg3ODIyLCAweDc4MDMsCisJMHgwMDIwLCAweDMzMDAsIDB4NzAxNiwgMHg3ODAzLCAweDAwMDEsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgyMDk5LCAweGFkZjksCisJMHgyMGExLCAweDAwMTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTMsIDB4NzgwMywgMHgwMDIwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzgwMywgMHgwMDQxLCAweDcwMDcsIDB4MDAwMywgMHg3MDAwLCAweGMwODQsCisJMHg3MDAyLCAweDcwMGIsIDB4YWRmNCwgMHgwMTJlLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAwMDUsCisJMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgyMDAxLCAweGFlMjgsIDB4MjA5YywgMHgyMGExLCAweDAwMTQsCisJMHg3ODAzLCAweDAwMjYsIDB4MjAwMSwgMHhhZTI5LCAweDIwYWMsIDB4NTNhNiwgMHgyMDk5LCAweGFlMmEsCisJMHgyMGExLCAweDAwMTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTMsIDB4NzgwMywgMHgwMDIwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzgwMywgMHgwMDAxLCAweDcwMDcsIDB4MDAwNCwgMHg3MDAwLCAweGMwOGMsCisJMHg3MDAyLCAweDcwMGIsIDB4YWUyNSwgMHgwMTJlLCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDAwMDUsCisJMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwgMHhhZmVjLCAweDAwZjYsIDB4MjA3OSwgMHgwMDEwLCAweDc5MDQsCisJMHg3ODAzLCAweDAwMDIsIDB4ZDFmYywgMHgwMTIwLCAweGExOGMsIDB4MDcwMCwgMHg3MDA0LCAweDAwMjMsCisJMHgwMGZlLCAweDAwZWUsIDB4MDAxZSwgMHgwMDA1LCAweDE2NDksIDB4MTcxMywgMHgxNzQxLCAweDE3NmIsCisJMHgxNzliLCAweDE3MTIsIDB4MGNmOCwgMHhhMThjLCAweDA3MDAsIDB4MTUyOCwgMHgwMTM2LCAweDAxNDYsCisJMHgwMTU2LCAweDcwMTQsIDB4MjBhMCwgMHgyMDk5LCAweDAwMTQsIDB4NzgwMywgMHgwMDQwLCAweDcwMTAsCisJMHgyMGE4LCAweDUzYTUsIDB4MzQwMCwgMHg3MDE2LCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDcwMGMsCisJMHhhMDA1LCAweDA1NzAsIDB4NzgzMCwgMHg3ODMyLCAweDc4MzQsIDB4NzgzNiwgMHgwODBjLCAweDE2N2EsCisJMHgwMDA1LCAweDcwMDgsIDB4YTA4MCwgMHgwMDAyLCAweDIwMDMsIDB4MDEwMCwgMHg3MDA3LCAweDAwMDAsCisJMHgwODBjLCAweDE2NDksIDB4MDAwNSwgMHg3MDA4LCAweGEwODAsIDB4MDAwMiwgMHgyMDAzLCAweDAyMDAsCisJMHgwY2E4LCAweGExOGMsIDB4MDcwMCwgMHgxMTUwLCAweDcwMGMsIDB4YTAwNSwgMHgwMTg4LCAweDc4MzAsCisJMHg3ODMyLCAweDc4MzQsIDB4NzgzNiwgMHgwODBjLCAweDE2OGYsIDB4MDAwNSwgMHg3MDA4LCAweGEwODAsCisJMHgwMDAyLCAweDIwMDMsIDB4MDIwMCwgMHg3MDA3LCAweDAwMDAsIDB4MDgwYywgMHgxNjQ5LCAweDAwMDUsCisJMHgwMGQ2LCAweDcwMDgsIDB4MjA2OCwgMHg3ODMwLCAweDY4MjYsIDB4NzgzNCwgMHg2ODJhLCAweDc4MzgsCisJMHg2ODJlLCAweDc4M2MsIDB4NjgzMiwgMHg2ODBiLCAweDAxMDAsIDB4MDBkZSwgMHg3MDA3LCAweDAwMDAsCisJMHgwODBjLCAweDE2NDksIDB4MDAwNSwgMHhhMThjLCAweDA3MDAsIDB4MTU0MCwgMHgwMTM2LCAweDAxNDYsCisJMHgwMTU2LCAweDIwMDEsIDB4YWRmNywgMHgyMDA0LCAweGEwODAsIDB4MDAwZCwgMHgyMGEwLCAweDIwOTksCisJMHgwMDE0LCAweDc4MDMsIDB4MDA0MCwgMHgyMGE5LCAweDAwMjAsIDB4NTNhNSwgMHgyMDAxLCAweGFkZjksCisJMHgyMDA0LCAweGQwYmMsIDB4MDE0OCwgMHgyMDAxLCAweGFlMDIsIDB4MjAwNCwgMHhhMDgwLCAweDAwMGQsCisJMHgyMGEwLCAweDIwYTksIDB4MDAyMCwgMHg1M2E1LCAweDAxNWUsIDB4MDE0ZSwgMHgwMTNlLCAweDcwMDcsCisJMHgwMDAwLCAweDA4MGMsIDB4NWFlNiwgMHgwODBjLCAweDE2NDksIDB4MDAwNSwgMHgyMDExLCAweDgwMDMsCisJMHgwODBjLCAweDNjNWMsIDB4MGNmOCwgMHhhMThjLCAweDA3MDAsIDB4MTE0OCwgMHgyMDAxLCAweGFlMjcsCisJMHgyMDAzLCAweDAxMDAsIDB4NzAwNywgMHgwMDAwLCAweDA4MGMsIDB4MTY0OSwgMHgwMDA1LCAweDIwMTEsCisJMHg4MDA0LCAweDA4MGMsIDB4M2M1YywgMHgwY2Y4LCAweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDIwNzksCisJMHgwMDMwLCAweDIwNzEsIDB4YWZmZCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwZiwgMHhiMDAzLCAweDcwMTMsCisJMHhiMDAzLCAweDc4MGYsIDB4MDBmNiwgMHg3ODAzLCAweDAwMDQsIDB4MDEyZSwgMHgwMDA1LCAweDY5MzQsCisJMHhhMTg0LCAweDAwMDcsIDB4MDAwMiwgMHgxN2NiLCAweDE4MDksIDB4MTdjYiwgMHgxN2NiLCAweDE3Y2IsCisJMHgxN2YxLCAweDE3ZDgsIDB4MTdjZiwgMHhhMDg1LCAweDAwMDEsIDB4MDgwNCwgMHgxODIzLCAweDY4NGMsCisJMHhkMGJjLCAweDBkYzgsIDB4Njg2MCwgMHg2ODJlLCAweDY4NWMsIDB4NjgyYSwgMHg2ODU4LCAweDA0YzgsCisJMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDFlLCAweDFkNzAsIDB4Njg0YywgMHhkMGJjLCAweDBkNTgsCisJMHg2ODYwLCAweDY4MmUsIDB4Njg1YywgMHg2ODJhLCAweDY4MDQsIDB4NjgxYSwgMHhhMDgwLCAweDAwMGQsCisJMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIxODYsIDB4MjAwNSwgMHg2ODMyLCAweDY4NTgsCisJMHgwNDQwLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTUsIDB4MTlhOCwgMHg2ODRjLCAweGQwYWMsCisJMHgwOTkwLCAweDY4MDQsIDB4NjgxYSwgMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsCisJMHhhMDgwLCAweDIxODYsIDB4MjAwNSwgMHg2ODMyLCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDY4NTgsCisJMHgwMDgwLCAweDY4NGMsIDB4ZDBhYywgMHgwOTA0LCAweDE3Y2IsIDB4YTAwNiwgMHg2ODJlLCAweDY4MmEsCisJMHg2ODU4LCAweGExOGMsIDB4MDAwZiwgMHhhMTg4LCAweDIxODYsIDB4MjEwZCwgMHg2OTMyLCAweDJkMDgsCisJMHg2OTFhLCAweDY4MjYsIDB4Njg0YywgMHhjMGRkLCAweDY4NGUsIDB4YTAwNiwgMHg2ODBhLCAweDY5N2MsCisJMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwgMHgwMDA1LCAweDIwZTEsIDB4MDAwNywgMHgyMGUxLCAweDIwMDAsCisJMHgyMDAxLCAweDAyMGEsIDB4MjAwNCwgMHg4MmZmLCAweDAxYTgsIDB4YTI4MCwgMHgwMDA0LCAweDAwZDYsCisJMHgyMDZjLCAweDY4NGMsIDB4ZDBkYywgMHgxMTUwLCAweDA4MGMsIDB4MTdiZiwgMHgwMTM4LCAweDAwZGUsCisJMHhhMjgwLCAweDAwMDAsIDB4MjAwMywgMHgwMDAyLCAweGEwMTYsIDB4MDAyMCwgMHg2ODA4LCAweDgwMDAsCisJMHg2ODBhLCAweDAwZGUsIDB4MDEyNiwgMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwgMHgyMDkxLCAweDIyMDAsCisJMHgwMDJlLCAweDAwM2UsIDB4MDA0ZSwgMHg3MDAwLCAweGEwMDUsIDB4MDFkMCwgMHg3MTBjLCAweDIyMGEsCisJMHg4MTA4LCAweDIzMGEsIDB4ODEwOCwgMHgyNDBhLCAweDgxMDgsIDB4YTE4MiwgMHhiMDFlLCAweDAyMTAsCisJMHgyMDA5LCAweGIwMDMsIDB4NzEwZSwgMHg3MDEwLCAweGExMDIsIDB4YTA4MiwgMHgwMDA5LCAweDAxMTgsCisJMHhhMDgwLCAweDAwMWIsIDB4MTExOCwgMHgyMDA5LCAweDAxMzgsIDB4MjAwYSwgMHgwMTJlLCAweDAwMDUsCisJMHg3MjA2LCAweDIwMDEsIDB4MTg2NiwgMHgwMDA2LCAweDIyNjAsIDB4MDgwNCwgMHgxOTdhLCAweDAxMjYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMDA2LCAweDIwOTEsIDB4MjIwMCwgMHgwMDBlLCAweDAwNGUsCisJMHgwMDNlLCAweDAwMmUsIDB4MDBkNiwgMHgwMGM2LCAweDI0NjAsIDB4NjExMCwgMHgyMTY4LCAweDZhNjIsCisJMHg2YjVlLCAweGEwMDUsIDB4MDkwNCwgMHgxOGM4LCAweDY4MDgsIDB4YTAwNSwgMHgwOTA0LCAweDE4ZmYsCisJMHg3MDAwLCAweGEwMDUsIDB4MTEwOCwgMHgwNDg4LCAweDcwMGMsIDB4NzExMCwgMHhhMTA2LCAweDE5MDQsCisJMHgxOTA3LCAweDcwMDQsIDB4YTQwNiwgMHgxNTQ4LCAweDIwMDEsIDB4MDAwNSwgMHgyMDA0LCAweGQwOGMsCisJMHgwMTY4LCAweDAwNDYsIDB4MDgwYywgMHgxYTZjLCAweDAwNGUsIDB4MjQ2MCwgMHg2MDEwLCAweGEwODAsCisJMHgwMDAyLCAweDIwMDQsIDB4YTAwNSwgMHgwOTA0LCAweDE4ZmYsIDB4MGMxMCwgMHgyMDAxLCAweDAyMDcsCisJMHgyMDA0LCAweGQwOWMsIDB4MWQ0OCwgMHg3ODA0LCAweGEwODQsIDB4NjAwMCwgMHgwMTIwLCAweGEwODYsCisJMHg2MDAwLCAweDAxMDgsIDB4MGMwOCwgMHg3ODE4LCAweDY4MTIsIDB4NzgxYywgMHg2ODE2LCAweDc4MDMsCisJMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4NjEwMCwgMHhhMThlLCAweDAwMDQsCisJMHgxOTA0LCAweDE5MDcsIDB4MjAwOSwgMHgwMDQ4LCAweDA4MGMsIDB4ODBhNywgMHgwODA0LCAweDE5MDcsCisJMHg2ODA4LCAweGEwMDUsIDB4MDVhMCwgMHg3MDAwLCAweGEwMDUsIDB4MDU4OCwgMHg3MDBjLCAweDcxMTAsCisJMHhhMTA2LCAweDExMTgsIDB4NzAwNCwgMHhhNDA2LCAweDE1NTAsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsCisJMHhkMDhjLCAweDAxNjAsIDB4MDA0NiwgMHgwODBjLCAweDFhNmMsIDB4MDA0ZSwgMHgyNDYwLCAweDYwMTAsCisJMHhhMDgwLCAweDAwMDIsIDB4MjAwNCwgMHhhMDA1LCAweDAxZDAsIDB4MGMyOCwgMHgyMDAxLCAweDAyMDcsCisJMHgyMDA0LCAweGQwOWMsIDB4MWQ1MCwgMHgyMDAxLCAweDAwMDUsIDB4MjAwNCwgMHhkMDhjLCAweDFkNTAsCisJMHg3ODA0LCAweGEwODQsIDB4NjAwMCwgMHgwMTE4LCAweGEwODYsIDB4NjAwMCwgMHgxOWYwLCAweDc4MTgsCisJMHg2ODEyLCAweDc4MWMsIDB4NjgxNiwgMHg3ODAzLCAweDAwMDQsIDB4NzAwMywgMHgwMDAwLCAweDYxMDAsCisJMHhhMThlLCAweDAwMDQsIDB4MTEyMCwgMHgyMDA5LCAweDAwNDgsIDB4MDgwYywgMHg4MGE3LCAweDAwY2UsCisJMHgwMGRlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsCisJMHgwMDU2LCAweDA4MGMsIDB4MWQ4NiwgMHgwMDI2LCAweDAwNTYsIDB4MjA3MSwgMHhhZmZkLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDU4MCwgMHg3MDA0LCAweGFjMDYsIDB4MTFmOCwgMHgyMDc5LCAweDAwMzAsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMWM4LCAweDc4MDQsIDB4ZDBmYywgMHgxMTk4LCAweDIwMDEsCisJMHgwMjA3LCAweDIwMDQsIDB4ZDA5YywgMHgxZGMwLCAweDc4MDMsIDB4MDAwNCwgMHg3ODA0LCAweGQwYWMsCisJMHgxZGU4LCAweDc4MDMsIDB4MDAwMiwgMHg3ODAzLCAweDAwMDksIDB4NzAwMywgMHgwMDAzLCAweDcwMDcsCisJMHgwMDAwLCAweDAwMTgsIDB4MDgwYywgMHgxYTZjLCAweDA4ZDAsIDB4MDE1NiwgMHgyMGE5LCAweDAwMDksCisJMHgyMDA5LCAweGIwMDMsIDB4MjEwNCwgMHhhYzA2LCAweDExMDgsIDB4MjAwYSwgMHhhMTg4LCAweDAwMDMsCisJMHgxZjA0LCAweDE5NDIsIDB4MDE1ZSwgMHgwMDVlLCAweDAwMmUsIDB4MjAwMSwgMHgwMTVkLCAweDIwMWMsCisJMHg4MzFhLCAweDIzMDIsIDB4MjAwMSwgMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsCisJMHgwMDVlLCAweDAwNGUsIDB4MDAzZSwgMHgwMDJlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDcwMGMsCisJMHg3MTEwLCAweGExMDYsIDB4MDkwNCwgMHgxOWRkLCAweDIxMDQsIDB4NzAwNiwgMHgyMDYwLCAweDgxMDgsCisJMHgyMTFjLCAweDgxMDgsIDB4MjEyNCwgMHg4MTA4LCAweGExODIsIDB4YjAxZSwgMHgwMjEwLCAweDIwMDksCisJMHhiMDAzLCAweDcxMTIsIDB4NzAwYywgMHhhMTA2LCAweDExMjgsIDB4MDgwYywgMHgyNzQ0LCAweDIwMDEsCisJMHgwMTM4LCAweDIxMDIsIDB4OGNmZiwgMHgwNTg4LCAweDYwMTAsIDB4MjA2OCwgMHgyZDU4LCAweDY4MjgsCisJMHhhNDA2LCAweDE1ODAsIDB4NjgyYywgMHhhMzA2LCAweDE1NjgsIDB4NzAwNCwgMHgyMDYwLCAweDYwMjAsCisJMHhjMGQ0LCAweDYwMjIsIDB4Njg0YywgMHhkMGY0LCAweDAxMjgsIDB4NjgxNywgMHhmZmZmLCAweDY4MTMsCisJMHhmZmZmLCAweDAwZDgsIDB4Njg1MCwgMHhkMGY0LCAweDExMzAsIDB4NzgwMywgMHgwMDA0LCAweDY4MTAsCisJMHg3ODFhLCAweDY4MTQsIDB4NzgxZSwgMHg2ODI0LCAweDIwNTAsIDB4NjgxOCwgMHgyMDYwLCAweDY4MzAsCisJMHgyMDQwLCAweDYwMzQsIDB4YTBjYywgMHgwMDBmLCAweDIwMDksIDB4MDAxMSwgMHgwNGM5LCAweDAxMTgsCisJMHgyMDA5LCAweDAwMDEsIDB4MDRhOSwgMHgyZDU4LCAweDAwMDUsIDB4MDgwYywgMHgxY2VkLCAweDA5MDQsCisJMHgxOTVmLCAweDBjZDAsIDB4NjAyMCwgMHhkMGQ0LCAweDAxYjgsIDB4NjAzOCwgMHhhNDAyLCAweDYwMzQsCisJMHhhMzAzLCAweDAxMDgsIDB4MTI4OCwgMHg2NDNhLCAweDYzMzYsIDB4NmMyYSwgMHg2YjJlLCAweDAwNDYsCisJMHgwMDM2LCAweDI0MDAsIDB4NmM3YywgMHhhNDAyLCAweDY4MTIsIDB4MjMwMCwgMHg2YjgwLCAweGEzMDMsCisJMHg2ODE2LCAweDAwM2UsIDB4MDA0ZSwgMHgwMDE4LCAweDA4MGMsIDB4OThjYiwgMHgwOWYwLCAweDYwMWMsCisJMHhhMDhlLCAweDAwMDgsIDB4MDkwNCwgMHgxOTg1LCAweGEwOGUsIDB4MDAwYSwgMHgwOTA0LCAweDE5ODUsCisJMHgwODBjLCAweDIxYTYsIDB4MTk5MCwgMHgwODA0LCAweDE5ODUsIDB4NzAwMywgMHgwMDAwLCAweDAwMDUsCisJMHg4YWZmLCAweDA5MDQsIDB4MWE0NiwgMHhhMDNlLCAweDI3MzAsIDB4Njg1MCwgMHhkMGZjLCAweDExYjgsCisJMHhkMGY0LCAweDE1MjgsIDB4MDBkNiwgMHgyODA1LCAweGFjNjgsIDB4MjkwMCwgMHgwMDAyLCAweDFhMzAsCisJMHgxYTE1LCAweDFhMTUsIDB4MWEzMCwgMHgxYTMwLCAweDFhMjksIDB4MWEzMCwgMHgxYTE1LCAweDFhMzAsCisJMHgxYTFhLCAweDFhMWEsIDB4MWEzMCwgMHgxYTMwLCAweDFhMzAsIDB4MWEyMSwgMHgxYTFhLCAweDc4MDMsCisJMHgwMDA0LCAweGMwZmMsIDB4Njg1MiwgMHg2YjZjLCAweDZhNzAsIDB4NmQxYywgMHg2YzIwLCAweDAwZDYsCisJMHhkOTljLCAweDA1NDgsIDB4MjgwNSwgMHhhYzY4LCAweDZmMDgsIDB4NmUwYywgMHgwNDIwLCAweGMwZjQsCisJMHg2ODUyLCAweDZiNmMsIDB4NmE3MCwgMHgwMGQ2LCAweDA0MjgsIDB4NmIwOCwgMHg2YTBjLCAweDZkMDAsCisJMHg2YzA0LCAweDAwYzgsIDB4NmIxMCwgMHg2YTE0LCAweDZkMDAsIDB4NmMwNCwgMHg2ZjA4LCAweDZlMGMsCisJMHgwMDkwLCAweDAwZGUsIDB4MDBkNiwgMHg2ODM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMWUsCisJMHgxMTM4LCAweDAwZGUsIDB4MDgwYywgMHgyMTQ4LCAweDE5MDQsIDB4MTllMCwgMHhhMDBlLCAweDAwYjAsCisJMHgwMGRlLCAweDA4MGMsIDB4MTRmNiwgMHg3YjIyLCAweDdhMjYsIDB4N2QzMiwgMHg3YzM2LCAweDdmM2EsCisJMHg3ZTNlLCAweDc5MDIsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsIDB4MDBkZSwgMHg2ODI4LCAweGEzMDAsCisJMHg2ODJhLCAweDY4MmMsIDB4YTIwMSwgMHg2ODJlLCAweDA4MGMsIDB4MjE0OCwgMHgwMDA1LCAweDA4MGMsCisJMHgxNGY2LCAweDA4MGMsIDB4MWUxYSwgMHg3MDA0LCAweDIwNjAsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsCisJMHg3MDAzLCAweDAwMDAsIDB4MDgwYywgMHgxZDIyLCAweDA4MGMsIDB4OTU5NiwgMHgwMTcwLCAweDY4MDgsCisJMHg4MDAxLCAweDY4MGEsIDB4Njk3YywgMHg2OTEyLCAweDY5ODAsIDB4NjkxNiwgMHg2ODJiLCAweGZmZmYsCisJMHg2ODJmLCAweGZmZmYsIDB4Njg1MCwgMHhjMGJkLCAweDY4NTIsIDB4MDBkZSwgMHgwODBjLCAweDkyOWMsCisJMHgwODA0LCAweDFjNWUsIDB4MDgwYywgMHgxNGY2LCAweDAxMjYsIDB4MjA5MSwgMHgyMjAwLCAweDAwMDYsCisJMHgwMDE2LCAweDJiNjgsIDB4NjgxOCwgMHgyMDYwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLCAweGExODQsCisJMHgwNzAwLCAweDE5NzgsIDB4YTE4NCwgMHgwMDAzLCAweGEwODYsIDB4MDAwMywgMHgwZDU4LCAweDcwMDAsCisJMHgwMDAyLCAweDFhODksIDB4MWE4ZiwgMHgxYjkyLCAweDFjMzksIDB4MWM0ZCwgMHgxYTg5LCAweDFhODksCisJMHgxYTg5LCAweDc4MDQsIDB4ZDA5YywgMHgxOTA0LCAweDFjNWUsIDB4MDgwYywgMHgxNGY2LCAweDgwMDEsCisJMHg3MDAyLCAweGExODQsIDB4MDg4MCwgMHgxMTkwLCAweGQxOWMsIDB4MTkwNCwgMHgxYjIwLCAweDhhZmYsCisJMHgwOTA0LCAweDFiMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsIDB4MTllMCwgMHgwOTA0LCAweDFjNWUsCisJMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHgxOWUwLCAweDA4MDQsIDB4MWM1ZSwgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4ZDFiYywgMHgxOTA0LCAweDFiMDAsIDB4MDAyNiwgMHgwMDM2LCAweDdjMjAsCisJMHg3ZDI0LCAweDdlMzAsIDB4N2YzNCwgMHg3ODE4LCAweDY4MTIsIDB4NzgxYywgMHg2ODE2LCAweDIwMDEsCisJMHgwMjAxLCAweDIwMDQsIDB4YTAwNSwgMHgwMTQwLCAweDc4MDgsIDB4ZDBlYywgMHgxMTI4LCAweDc4MDMsCisJMHgwMDA5LCAweDcwMDMsIDB4MDAwNCwgMHgwMDEwLCAweDA4MGMsIDB4MWM2MiwgMHg2YjI4LCAweDZhMmMsCisJMHgyNDAwLCAweDY4NmUsIDB4YTMxYSwgMHgyNTAwLCAweDY4NzIsIDB4YTIxMywgMHg2YjJhLCAweDZhMmUsCisJMHgwMGM2LCAweDcwMDQsIDB4MjA2MCwgMHg2MDIwLCAweGQwZjQsIDB4MTExMCwgMHg2MzNhLCAweDYyMzYsCisJMHgwMGNlLCAweDAwM2UsIDB4MDAyZSwgMHg2ZTFlLCAweDZmMjIsIDB4MDgwYywgMHgyMTVlLCAweDJhMDAsCisJMHg2ODI2LCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsIDB4Njg1MCwgMHhjMGZkLCAweDY4NTIsCisJMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgxMTQ4LCAweDY4NGMsIDB4ZDBlNCwgMHgwMTMwLCAweDcwMDQsCisJMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweDgwYTcsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsCisJMHgwOTA0LCAweDFjNWUsIDB4NzAwMywgMHgwMDAwLCAweDA4MGMsIDB4MTk1ZiwgMHgwODA0LCAweDFjNWUsCisJMHgwMDU2LCAweDdkMGMsIDB4ZDViYywgMHgxMTEwLCAweDA4MGMsIDB4YWM3MywgMHgwMDVlLCAweDA4MGMsCisJMHgxZDIyLCAweDAwZjYsIDB4NzAwNCwgMHgyMDc4LCAweDA4MGMsIDB4NTAyOSwgMHgwMTE4LCAweDc4MjAsCisJMHhjMGY1LCAweDc4MjIsIDB4MDBmZSwgMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwgMHhmZmZmLCAweDY4MDgsCisJMHg4MDAxLCAweDY4MGEsIDB4Njk3YywgMHg3OTFhLCAweDY5ODAsIDB4NzkxZSwgMHgwODA0LCAweDFjNWUsCisJMHg3MDA0LCAweDAwYzYsIDB4MjA2MCwgMHg2MDIwLCAweDAwY2UsIDB4ZDBmNCwgMHgwMTI4LCAweDY4MDgsCisJMHg4MDAxLCAweDY4MGEsIDB4MDgwNCwgMHgxYzVlLCAweDc4MTgsIDB4NjgxMiwgMHg3YTFjLCAweDZhMTYsCisJMHhkMTljLCAweDAxNjAsIDB4YTIwNSwgMHgwMTUwLCAweDcwMDQsIDB4YTA4MCwgMHgwMDA3LCAweDIwMDQsCisJMHhhMDg0LCAweGZmZmQsIDB4YTA4NiwgMHgwMDA4LCAweDE5MDQsIDB4MWFhNiwgMHg2ODRjLCAweGMwZjUsCisJMHg2ODRlLCAweDc4MTQsIDB4YTAwNSwgMHgxMTgwLCAweDcwMDMsIDB4MDAwMCwgMHg2ODA4LCAweDgwMDEsCisJMHg2ODBhLCAweDExMzAsIDB4NzAwNCwgMHgyMDYwLCAweDIwMDksIDB4MDA0OCwgMHgwODBjLCAweDgwYTcsCisJMHgwODBjLCAweDE5NWYsIDB4MDgwNCwgMHgxYzVlLCAweDc4MTgsIDB4NjgxMiwgMHg3ODFjLCAweDY4MTYsCisJMHg3ODE0LCAweDc5MDgsIDB4YTE4YywgMHgwZmZmLCAweGExODgsIDB4MDAwNywgMHg4MTE0LCAweDgyMTQsCisJMHg4MjE0LCAweGExMGEsIDB4ODEwNCwgMHg4MDA0LCAweDgwMDQsIDB4YTIwYSwgMHg4MTBiLCAweDgxMGIsCisJMHg4MTBiLCAweDA4MGMsIDB4MWRhNSwgMHg3ODAzLCAweDAwMDQsIDB4NzgwZiwgMHhmZmZmLCAweDc4MDMsCisJMHgwMDAxLCAweDc4MDQsIDB4ZDBmYywgMHgwZGU4LCAweDc4MDMsIDB4MDAwMiwgMHg3ODAzLCAweDAwMDQsCisJMHg3ODBmLCAweDAwZjYsIDB4NzAwNCwgMHg3MDA3LCAweDAwMDAsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsCisJMHgwODBjLCAweDgwYTcsIDB4MDgwYywgMHgxZGQ3LCAweDA5NTgsIDB4NzkwOCwgMHhkMWVjLCAweDExMTgsCisJMHgyMDA5LCAweDAwMDksIDB4MDAxMCwgMHgyMDA5LCAweDAwMTksIDB4NzkwMiwgMHg3MDAzLCAweDAwMDMsCisJMHgwODA0LCAweDFjNWUsIDB4ODAwMSwgMHg3MDAyLCAweGQxOTQsIDB4MDFhOCwgMHg3ODA0LCAweGQwZmMsCisJMHgxOTA0LCAweDFjMmMsIDB4ZDA5YywgMHgwMTMwLCAweDc4MDQsIDB4ZDBmYywgMHgxOTA0LCAweDFhNzQsCisJMHhkMDljLCAweDExYTgsIDB4OGFmZiwgMHgwOTA0LCAweDFjNWUsIDB4MjAwOSwgMHgwMDAxLCAweDA4MGMsCisJMHgxOWUwLCAweDA4MDQsIDB4MWM1ZSwgMHhhMTg0LCAweDA4ODgsIDB4MTE0OCwgMHg4YWZmLCAweDA5MDQsCisJMHgxYzVlLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDE5ZTAsIDB4MDgwNCwgMHgxYzVlLCAweDc4MTgsCisJMHg2ODEyLCAweDdhMWMsIDB4NmExNiwgMHhhMjA1LCAweDA5MDQsIDB4MWIzZSwgMHg3ODAzLCAweDAwMDQsCisJMHg3MDAzLCAweDAwMDAsIDB4ZDFiYywgMHgxOTA0LCAweDFjMGYsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMjksIDB4MTExOCwgMHhkMTljLCAweDE5MDQsIDB4MWIzZSwgMHgwMDI2LCAweDAwMzYsCisJMHg3YzIwLCAweDdkMjQsIDB4N2UzMCwgMHg3ZjM0LCAweDc4MTgsIDB4NjgxMiwgMHg3ODFjLCAweDY4MTYsCisJMHgyMDAxLCAweDAyMDEsIDB4MjAwNCwgMHhhMDA1LCAweDAxNDAsIDB4NzgwOCwgMHhkMGVjLCAweDExMjgsCisJMHg3ODAzLCAweDAwMDksIDB4NzAwMywgMHgwMDA0LCAweDAwMjAsIDB4MDAxNiwgMHgwODBjLCAweDFjNjIsCisJMHgwMDFlLCAweDZiMjgsIDB4NmEyYywgMHgwODBjLCAweDIxNWUsIDB4MDBkNiwgMHgyODA1LCAweGFjNjgsCisJMHg2MDM0LCAweGQwOWMsIDB4MTEyOCwgMHg2ODA4LCAweGEzMWEsIDB4NjgwYywgMHhhMjEzLCAweDAwMjAsCisJMHg2ODEwLCAweGEzMWEsIDB4NjgxNCwgMHhhMjEzLCAweDAwZGUsIDB4ZDE5NCwgMHgwOTA0LCAweDFhYzgsCisJMHgyYTAwLCAweDY4MjYsIDB4MmMwMCwgMHg2ODFhLCAweDI4MDAsIDB4NjgzMiwgMHg2ODA4LCAweDgwMDEsCisJMHg2ODBhLCAweDZiMmEsIDB4NmEyZSwgMHgwMDNlLCAweDAwMmUsIDB4MDgwNCwgMHgxYjUwLCAweDAwNTYsCisJMHg3ZDBjLCAweDA4MGMsIDB4YWM3MywgMHgwMDVlLCAweDA4MGMsIDB4MWQyMiwgMHgwMGY2LCAweDcwMDQsCisJMHgyMDc4LCAweDA4MGMsIDB4NTAyOSwgMHgwMTE4LCAweDc4MjAsIDB4YzBmNSwgMHg3ODIyLCAweDAwZmUsCisJMHg2ODJiLCAweGZmZmYsIDB4NjgyZiwgMHhmZmZmLCAweDY4MDgsIDB4ODAwMSwgMHg2ODBhLCAweDY5N2MsCisJMHg3OTFhLCAweDY5ODAsIDB4NzkxZSwgMHgwNDkwLCAweDc4MDQsIDB4ZDA5YywgMHgwOTA0LCAweDFhNzQsCisJMHg3YzIwLCAweDc4MjQsIDB4YTQwNSwgMHgxOTA0LCAweDFhNzQsIDB4NzgwMywgMHgwMDAyLCAweDA4MDQsCisJMHgxYmI3LCAweDc4MDMsIDB4MDAwNCwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNCwgMHhhMDBkLCAweDAxNTAsCisJMHg2ODA4LCAweDgwMDEsIDB4NjgwYSwgMHgxMTMwLCAweDcwMDQsIDB4MjA2MCwgMHgyMDA5LCAweDAwNDgsCisJMHgwODBjLCAweDgwYTcsIDB4MDgwYywgMHgxOTVmLCAweDAwODgsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHg2MDEwLCAweGEwMDUsIDB4MGRhMCwgMHgyMDY4LCAweDY4MDgsCisJMHg4MDAwLCAweDY4MGEsIDB4NmMyOCwgMHg2YjJjLCAweDA4MGMsIDB4MTk3YSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMTJlLCAweDAwMDUsIDB4NzAwYywgMHg3MTEwLCAweGExMDYsIDB4MDkwNCwgMHgxY2UxLCAweDcwMDQsCisJMHgwMDE2LCAweDIxMGMsIDB4YTEwNiwgMHgwMDFlLCAweDA5MDQsIDB4MWNlMSwgMHgwMGQ2LCAweDAwYzYsCisJMHgyMTZjLCAweDJkMDAsIDB4YTAwNSwgMHgwOTA0LCAweDFjZGYsIDB4NjgyMCwgMHhkMGQ0LCAweDE5MDQsCisJMHgxY2RmLCAweDY4MTAsIDB4MjA2OCwgMHg2ODUwLCAweGQwZmMsIDB4MDU1OCwgMHg4MTA4LCAweDIxMDQsCisJMHg2YjJjLCAweGEzMDYsIDB4MTkwNCwgMHgxY2RmLCAweDgxMDgsIDB4MjEwNCwgMHg2YTI4LCAweGEyMDYsCisJMHgxOTA0LCAweDFjZGYsIDB4Njg1MCwgMHhjMGZjLCAweGMwZjUsIDB4Njg1MiwgMHg2ODZjLCAweDc4MjIsCisJMHg2ODcwLCAweDc4MjYsIDB4NjgxYywgMHg3ODMyLCAweDY4MjAsIDB4NzgzNiwgMHg2ODE4LCAweDIwNjAsCisJMHg2MDM0LCAweGQwOWMsIDB4MDE1MCwgMHg2ODMwLCAweDIwMDUsIDB4MDBkNiwgMHhhYzY4LCAweDY4MDgsCisJMHg3ODNhLCAweDY4MGMsIDB4NzgzZSwgMHgwMGRlLCAweDA0YTAsIDB4YTAwNiwgMHg3ODNhLCAweDc4M2UsCisJMHgwNDgwLCAweDgxMDgsIDB4MjEwNCwgMHhhMDA1LCAweDE1OTAsIDB4ODEwOCwgMHgyMTA0LCAweGEwMDUsCisJMHgxNTcwLCAweDY4NTAsIDB4YzBmNSwgMHg2ODUyLCAweDY4MzAsIDB4MjAwNSwgMHg2OTE4LCAweGExNjAsCisJMHhhMTgwLCAweDAwMGQsIDB4MjAwNCwgMHhkMDljLCAweDExNzAsIDB4NjAwOCwgMHg3ODIyLCAweDY4NmUsCisJMHg2MDBjLCAweDc4MjYsIDB4Njg3MiwgMHg2MDAwLCAweDc4MzIsIDB4NjAwNCwgMHg3ODM2LCAweGEwMDYsCisJMHg3ODNhLCAweDc4M2UsIDB4MDA3MCwgMHg2MDEwLCAweDc4MjIsIDB4Njg2ZSwgMHg2MDE0LCAweDc4MjYsCisJMHg2ODcyLCAweDYwMDAsIDB4NzgzMiwgMHg2MDA0LCAweDc4MzYsIDB4NjAwOCwgMHg3ODNhLCAweDYwMGMsCisJMHg3ODNlLCAweDY4MTAsIDB4NzgxYSwgMHg2ODE0LCAweDc4MWUsIDB4NzgwMywgMHgwMDExLCAweDAwY2UsCisJMHgwMGRlLCAweDAwMDUsIDB4MjAxMSwgMHgwMjAxLCAweDIwMDksIDB4MDAzYywgMHgyMjA0LCAweGEwMDUsCisJMHgxMTE4LCAweDgxMDksIDB4MWRkOCwgMHgwMDA1LCAweDAwMDUsIDB4MGNhMSwgMHgwMWUwLCAweDc5MDgsCisJMHhkMWVjLCAweDExNjAsIDB4MDgwYywgMHgxZGQ3LCAweDAxNDgsIDB4NzgwMywgMHgwMDA5LCAweDc5MDQsCisJMHhkMWZjLCAweDBkZTgsIDB4NzgwMywgMHgwMDA2LCAweDBjMjksIDB4MDE2OCwgMHg3ODBjLCAweGQwYTQsCisJMHgxMTUwLCAweDcwMDcsIDB4MDAwMCwgMHgwODBjLCAweDFkZDcsIDB4MDE0MCwgMHg3ODAzLCAweDAwMTksCisJMHg3MDAzLCAweDAwMDMsIDB4MDAxOCwgMHgwMGIxLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDIyMDAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MTE1MCwgMHg3MDBjLCAweDcxMTAsCisJMHhhMTA2LCAweDAxMzAsIDB4MjBlMSwgMHg5MDI4LCAweDcwMGYsIDB4YjAwMywgMHg3MDEzLCAweGIwMDMsCisJMHgwMTJlLCAweDAwMDUsIDB4MDBjNiwgMHgwODBjLCAweDU3NGYsIDB4MTU1MCwgMHgyMDAxLCAweDAxNjAsCisJMHgyMDAzLCAweDAwMDAsIDB4MjAwMSwgMHgwMTM4LCAweDIwMDMsIDB4MDAwMCwgMHgyMDExLCAweDAwYzgsCisJMHhlMDAwLCAweGUwMDAsIDB4ODIxMSwgMHgxZGUwLCAweDA4MGMsIDB4MWQ3ZSwgMHg3MDBjLCAweDcxMTAsCisJMHhhMTA2LCAweDAxOTAsIDB4MjEwNCwgMHhhMDA1LCAweDAxMzAsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjAsCisJMHg2MDA4LCAweDgwMDEsIDB4NjAwYSwgMHhhMTg4LCAweDAwMDMsIDB4YTE4MiwgMHhiMDFlLCAweDAyMTAsCisJMHgyMDA5LCAweGIwMDMsIDB4NzExMiwgMHgwYzUwLCAweDA4MGMsIDB4NTdkMSwgMHgwMGNlLCAweDAwMDUsCisJMHgwNGE5LCAweDIwZTEsIDB4OTAyOCwgMHg3MDBjLCAweDcxMTAsIDB4YTEwNiwgMHgwMWQwLCAweDIxMDQsCisJMHhhMDA1LCAweDAxMzAsIDB4MjA2MCwgMHg2MDEwLCAweDIwNjAsIDB4NjAwOCwgMHg4MDAxLCAweDYwMGEsCisJMHhhMTg4LCAweDAwMDMsIDB4YTE4MiwgMHhiMDFlLCAweDAyMTAsIDB4MjAwOSwgMHhiMDAzLCAweDcxMTIsCisJMHg3MDBjLCAweGExMDYsIDB4MWQ0MCwgMHgwODBjLCAweDI3NDQsIDB4MjAwMSwgMHgwMTM4LCAweDIxMDIsCisJMHgwYzEwLCAweDIwMDEsIDB4MDE1ZCwgMHgyMDBjLCAweDgxMGEsIDB4MjEwMiwgMHgyMDAxLCAweDAxNjAsCisJMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwY2UsIDB4MDAwNSwgMHgyMGUxLCAweDkwMjgsCisJMHgyMDAxLCAweDAxNWQsIDB4MjAwYywgMHg4MTBhLCAweDIxMDIsIDB4MDAwNSwgMHgyMDAxLCAweDAxMzgsCisJMHgyMDE0LCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweDAxNjAsIDB4MjAyYywgMHgyMDAzLCAweDAwMDAsCisJMHgyMDIxLCAweGIwMTUsIDB4MjAwMSwgMHgwMTQxLCAweDIwMWMsIDB4ZDNkYywgMHgxMTY4LCAweDIwMDEsCisJMHgwMTA5LCAweDIwMWMsIDB4YTM5YywgMHgwMDQ4LCAweDExMzgsIDB4MjAwMSwgMHgwMTExLCAweDIwMWMsCisJMHg4M2ZmLCAweDExMTAsIDB4ODQyMSwgMHgxZDcwLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAyMDAsCisJMHg3ODA4LCAweGEwODQsIDB4ZjAwMCwgMHhhMTBkLCAweDA4YzksIDB4MjAxOSwgMHg1MDAwLCAweDgzMTksCisJMHgwMTY4LCAweDIwMDEsIDB4YjAxZSwgMHgyMDA0LCAweGEwODYsIDB4MDAwMCwgMHgwMTM4LCAweDIwMDEsCisJMHgwMDIxLCAweGQwZmMsIDB4MGRhMCwgMHgwODBjLCAweDFmZjQsIDB4MGM3OCwgMHgyMGUxLCAweDcwMDAsCisJMHg3MzI0LCAweDc0MjAsIDB4NzAyOCwgMHg3MDI4LCAweDc0MjYsIDB4NzAzNywgMHgwMDAxLCAweDgxMGYsCisJMHg3MTJlLCAweDcwMmYsIDB4MDEwMCwgMHg3MDM3LCAweDAwMDgsIDB4NzMyNiwgMHg3NDIyLCAweDIwMDEsCisJMHgwMTYwLCAweDI1MDIsIDB4MjAwMSwgMHgwMTM4LCAweDIyMDIsIDB4MDBlZSwgMHgwMDA1LCAweDc5MDgsCisJMHhhMThjLCAweDBmZmYsIDB4YTE4MiwgMHgwMDA5LCAweDAyMTgsIDB4YTA4NSwgMHgwMDAxLCAweDAwODgsCisJMHgyMDAxLCAweDAyMGEsIDB4ODFmZiwgMHgwMTMwLCAweDIwZTEsIDB4NjAwMCwgMHgyMDBjLCAweDIwMGMsCisJMHgyMDBjLCAweDIwMGMsIDB4MjBlMSwgMHg3MDAwLCAweDIwMGMsIDB4MjAwYywgMHg3MDAzLCAweDAwMDAsCisJMHhhMDA2LCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDcxLCAweGFmZmQsCisJMHgyMDc5LCAweDAwMzAsIDB4MjAxMSwgMHgwMDUwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDAxYTgsCisJMHg4MjExLCAweDAxODgsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsIDB4ZDA4YywgMHgwZGM4LCAweDc5MDQsCisJMHhhMThjLCAweDA3ODAsIDB4MDAxNiwgMHgwODBjLCAweDFhNmMsIDB4MDAxZSwgMHg4MWZmLCAweDExMTgsCisJMHgyMDExLCAweDAwNTAsIDB4MGM0OCwgMHhhMDg1LCAweDAwMDEsIDB4MDAyZSwgMHgwMDFlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NzgwMywgMHgwMDA0LCAweDIwMDksIDB4MDA2NCwgMHg3ODA0LCAweGQwYWMsCisJMHgwOTA0LCAweDFlNjYsIDB4ODEwOSwgMHgxZGQwLCAweDIwMDksIDB4MDEwMCwgMHgyMTBjLCAweGExOGEsCisJMHgwMDAzLCAweDBhMGMsIDB4MTRmNiwgMHgwODBjLCAweDIwZjIsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsCisJMHhhZmVjLCAweDIwNzksIDB4MDAxMCwgMHg3MDA0LCAweGEwODYsIDB4MDAwMCwgMHgwNTM4LCAweDc4MDAsCisJMHgwMDA2LCAweDc4MjAsIDB4MDAwNiwgMHg3ODMwLCAweDAwMDYsIDB4NzgzNCwgMHgwMDA2LCAweDc4MzgsCisJMHgwMDA2LCAweDc4M2MsIDB4MDAwNiwgMHg3ODAzLCAweDAwMDQsIDB4ZTAwMCwgMHhlMDAwLCAweDIwNzksCisJMHgwMDMwLCAweDc4MDQsIDB4ZDBhYywgMHgxOTBjLCAweDE0ZjYsIDB4MjA3OSwgMHgwMDEwLCAweDAwMGUsCisJMHg3ODNlLCAweDAwMGUsIDB4NzgzYSwgMHgwMDBlLCAweDc4MzYsIDB4MDAwZSwgMHg3ODMyLCAweDAwMGUsCisJMHg3ODIyLCAweDAwMGUsIDB4NzgwMiwgMHgwMGZlLCAweDAwZWUsIDB4MDAzMCwgMHgwMGZlLCAweDAwZWUsCisJMHg3ODA0LCAweGQwYWMsIDB4MTkwYywgMHgxNGY2LCAweDA4MGMsIDB4NmQwZCwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweGIwMWUsIDB4NzAwMywgMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGQ2LCAweGEyODAsCisJMHgwMDA0LCAweDIwNmMsIDB4Njk0YywgMHhkMWRjLCAweDE5MDQsIDB4MWVlNCwgMHg2OTM0LCAweGExODQsCisJMHgwMDA3LCAweDAwMDIsIDB4MWU4MiwgMHgxZWNmLCAweDFlODIsIDB4MWU4MiwgMHgxZTgyLCAweDFlYjYsCisJMHgxZTk1LCAweDFlODQsIDB4MDgwYywgMHgxNGY2LCAweDY4NGMsIDB4ZDBiNCwgMHgwOTA0LCAweDFmY2MsCisJMHg2ODYwLCAweDY4MmUsIDB4NjgxNiwgMHg2ODVjLCAweDY4MmEsIDB4NjgxMiwgMHg2ODdjLCAweDY4MGEsCisJMHg2ODgwLCAweDY4MGUsIDB4Njk1OCwgMHgwODA0LCAweDFlZDcsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMWUsIDB4MWQzOCwgMHg2ODRjLCAweGQwYjQsIDB4MDkwNCwgMHgxZmNjLCAweDY4NjAsCisJMHg2ODJlLCAweDY4MTYsIDB4Njg1YywgMHg2ODJhLCAweDY4MTIsIDB4Njg3YywgMHg2ODBhLCAweDY4ODAsCisJMHg2ODBlLCAweDY4MDQsIDB4NjgxYSwgMHhhMDgwLCAweDAwMGQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsCisJMHhhMDgwLCAweDIxODYsIDB4MjAwNSwgMHg2ODMyLCAweDY5NTgsIDB4MDQ1MCwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMTUsIDB4MTU0OCwgMHg2ODRjLCAweGQwYjQsIDB4MDkwNCwgMHgxZmNjLCAweDY4MDQsCisJMHg2ODFhLCAweGEwODAsIDB4MDAwZCwgMHgyMDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDgwLCAweDIxODYsCisJMHgyMDA1LCAweDY4MzIsIDB4Njk1OCwgMHhhMDA2LCAweDY4MmUsIDB4NjgyYSwgMHgwMDg4LCAweDY4NGMsCisJMHhkMGI0LCAweDA5MDQsIDB4MWE0NywgMHg2OTU4LCAweGEwMDYsIDB4NjgyZSwgMHg2ODJhLCAweDJkMDAsCisJMHg2ODFhLCAweDY4MzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjE4NiwgMHgyMDA1LCAweDY4MzIsCisJMHg2OTI2LCAweDY4NGMsIDB4YzBkZCwgMHg2ODRlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGY2LCAweDIwNzksCisJMHgwMDIwLCAweDc4MDQsIDB4ZDBmYywgMHgxOTBjLCAweDFmZjQsIDB4MDBlNiwgMHgwMGQ2LCAweDIwNzEsCisJMHhiMDFlLCAweDcwMDAsIDB4YTAwNSwgMHgxOTA0LCAweDFmNGMsIDB4MDBjNiwgMHg3MjA2LCAweGEyODAsCisJMHgwMDA0LCAweDIwNWMsIDB4NzAwNCwgMHgyMDY4LCAweDc4MDMsIDB4MDAwNCwgMHg2ODE4LCAweDAwZDYsCisJMHgyMDY4LCAweDY4NmMsIDB4NzgxMiwgMHg2ODkwLCAweDAwZjYsIDB4MjBlMSwgMHg5MDQwLCAweDIwNzksCisJMHgwMjAwLCAweDc4MWEsIDB4MjA3OSwgMHgwMTAwLCAweDgwMDQsIDB4NzhkNiwgMHgwMGZlLCAweDAwZGUsCisJMHgyYjY4LCAweDY4MjQsIDB4MjA1MCwgMHg2ODE4LCAweDIwNjAsIDB4NjgzMCwgMHgyMDQwLCAweDYwMzQsCisJMHhhMGNjLCAweDAwMGYsIDB4NjkwOCwgMHg3OTFhLCAweDcxMTYsIDB4NjgwYywgMHg3ODFlLCAweDcwMWEsCisJMHhhMDA2LCAweDcwMGUsIDB4NzAxMiwgMHg3MDA0LCAweDY5MmMsIDB4NjgxNCwgMHhhMTA2LCAweDExMjAsCisJMHg2OTI4LCAweDY4MTAsIDB4YTEwNiwgMHgwMTU4LCAweDAwMzYsIDB4MDA0NiwgMHg2YjE0LCAweDZjMTAsCisJMHgwODBjLCAweDIxYTYsIDB4MDA0ZSwgMHgwMDNlLCAweDAxMTAsIDB4MDBjZSwgMHgwMGE4LCAweDhhZmYsCisJMHgxMTIwLCAweDAwY2UsIDB4YTA4NSwgMHgwMDAxLCAweDAwNzgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDc5LCAweDAwMjAsIDB4MjAwOSwgMHgwMDAxLCAweDAwNTksIDB4MDExOCwgMHgyMDA5LCAweDAwMDEsCisJMHgwMDM5LCAweDAxMmUsIDB4MDBjZSwgMHhhMDA2LCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMDc2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzYsIDB4MDAyNiwgMHg4YWZmLCAweDA5MDQsCisJMHgxZmM1LCAweDcwMGMsIDB4NzIxNCwgMHhhMjNhLCAweDcwMTAsIDB4NzIxOCwgMHhhMjAzLCAweDBhMDQsCisJMHgxZmM0LCAweGE3MDUsIDB4MDkwNCwgMHgxZmM0LCAweGEwM2UsIDB4MjczMCwgMHg2ODUwLCAweGQwZmMsCisJMHgxMWE4LCAweDAwZDYsIDB4MjgwNSwgMHhhYzY4LCAweDI5MDAsIDB4MDAwMiwgMHgxZmE3LCAweDFmOGMsCisJMHgxZjhjLCAweDFmYTcsIDB4MWZhNywgMHgxZmEwLCAweDFmYTcsIDB4MWY4YywgMHgxZmE3LCAweDFmOTEsCisJMHgxZjkxLCAweDFmYTcsIDB4MWZhNywgMHgxZmE3LCAweDFmOTgsIDB4MWY5MSwgMHhjMGZjLCAweDY4NTIsCisJMHg2YjZjLCAweDZhNzAsIDB4NmQxYywgMHg2YzIwLCAweGQ5OWMsIDB4MDUyOCwgMHgwMGQ2LCAweDI4MDUsCisJMHhhYzY4LCAweDZmMDgsIDB4NmUwYywgMHgwMGYwLCAweDZiMDgsIDB4NmEwYywgMHg2ZDAwLCAweDZjMDQsCisJMHgwMGM4LCAweDZiMTAsIDB4NmExNCwgMHg2ZDAwLCAweDZjMDQsIDB4NmYwOCwgMHg2ZTBjLCAweDAwOTAsCisJMHgwMGRlLCAweDAwZDYsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDFlLCAweDExMzgsCisJMHgwMGRlLCAweDA4MGMsIDB4MjE0OCwgMHgxOTA0LCAweDFmNTYsIDB4YTAwZSwgMHgwMGYwLCAweDAwZGUsCisJMHgwODBjLCAweDE0ZjYsIDB4MDBkZSwgMHg3YjIyLCAweDdhMjYsIDB4N2QzMiwgMHg3YzM2LCAweDdmM2EsCisJMHg3ZTNlLCAweDc5MDIsIDB4NzAwMCwgMHg4MDAwLCAweDcwMDIsIDB4NjgyOCwgMHhhMzAwLCAweDY4MmEsCisJMHg2ODJjLCAweGEyMDEsIDB4NjgyZSwgMHg3MDBjLCAweGEzMDAsIDB4NzAwZSwgMHg3MDEwLCAweGEyMDEsCisJMHg3MDEyLCAweDA4MGMsIDB4MjE0OCwgMHgwMDA4LCAweGEwMDYsIDB4MDAyZSwgMHgwMDNlLCAweDAwNGUsCisJMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMDA1LCAweDA4MGMsIDB4MTRmNiwgMHgwMDI2LCAweDIwMDEsCisJMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDcwMDQsIDB4MjA2MCwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsCisJMHgwMTE4LCAweDY4NTAsIDB4YzBiZCwgMHg2ODUyLCAweDAwZGUsIDB4MDgwYywgMHg5MjljLCAweDIwZTEsCisJMHg5MDQwLCAweDA4MGMsIDB4N2NiOCwgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg3YWU5LCAweDA4MGMsCisJMHg2ZDBkLCAweDAwMmUsIDB4MDgwNCwgMHgyMGFkLCAweDAxMjYsIDB4MjA5MSwgMHgyNDAwLCAweDAwMDYsCisJMHgwMDE2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsIDB4MjA3OSwgMHgwMDIwLCAweDIwNzEsCisJMHhiMDFlLCAweDJiNjgsIDB4NjgxOCwgMHgyMDYwLCAweDc5MDQsIDB4NzgwMywgMHgwMDAyLCAweGExODQsCisJMHgwNzAwLCAweDE5MjAsIDB4NzAwMCwgMHgwMDAyLCAweDIwYWQsIDB4MjAxMCwgMHgyMDgwLCAweDIwYWIsCisJMHg4MDAxLCAweDcwMDIsIDB4ZDE5YywgMHgxMTcwLCAweDhhZmYsIDB4MDVkMCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODBjLCAweDFmNTAsIDB4MDkwNCwgMHgyMGFkLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDFmNTAsCisJMHgwODA0LCAweDIwYWQsIDB4NzgwMywgMHgwMDA0LCAweGQxOTQsIDB4MDE0OCwgMHg2ODUwLCAweGMwZmMsCisJMHg2ODUyLCAweDhhZmYsIDB4MTFkOCwgMHg2ODRjLCAweGMwZjUsIDB4Njg0ZSwgMHgwMGI4LCAweDAwMjYsCisJMHgwMDM2LCAweDZiMjgsIDB4NmEyYywgMHg3ODIwLCAweDY4NmUsIDB4YTMxYSwgMHg3ODI0LCAweDY4NzIsCisJMHhhMjEzLCAweDc4MzAsIDB4NjgxZSwgMHg3ODM0LCAweDY4MjIsIDB4NmIyYSwgMHg2YTJlLCAweDAwM2UsCisJMHgwMDJlLCAweDA4MGMsIDB4MjE1ZSwgMHg2ODUwLCAweGMwZmQsIDB4Njg1MiwgMHgyYTAwLCAweDY4MjYsCisJMHgyYzAwLCAweDY4MWEsIDB4MjgwMCwgMHg2ODMyLCAweDcwMDMsIDB4MDAwMCwgMHgwODA0LCAweDIwYWQsCisJMHgwMGY2LCAweDAwMjYsIDB4NzgxYywgMHgwMDA2LCAweDc4MTgsIDB4MDAwNiwgMHgyMDc5LCAweDAxMDAsCisJMHg3YTE0LCAweGEyODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMTIsIDB4NzgxNiwgMHgwMDM2LCAweDIwMTksCisJMHgxMDAwLCAweDgzMTksIDB4MDkwYywgMHgxNGY2LCAweDc4MjAsIDB4ZDBiYywgMHgxZGQwLCAweDAwM2UsCisJMHg3OWM4LCAweDAwMGUsIDB4YTEwMiwgMHgwMDFlLCAweDAwMDYsIDB4MDAxNiwgMHg3OWM0LCAweDAwMGUsCisJMHhhMTAzLCAweDc4YzYsIDB4MDAwZSwgMHg3OGNhLCAweGEyODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMTIsCisJMHg3ODE2LCAweDAwMmUsIDB4MDBmZSwgMHg3ODAzLCAweDAwMDgsIDB4NzAwMywgMHgwMDAwLCAweDA0NjgsCisJMHg4MDAxLCAweDcwMDIsIDB4ZDE5NCwgMHgwMTY4LCAweDc4MDQsIDB4ZDBmYywgMHgxOTA0LCAweDIwMDQsCisJMHhkMTljLCAweDExZjgsIDB4OGFmZiwgMHgwNTA4LCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDFmNTAsCisJMHgwMGUwLCAweDAwMjYsIDB4MDAzNiwgMHg2YjI4LCAweDZhMmMsIDB4MDgwYywgMHgyMTVlLCAweDAwZDYsCisJMHgyODA1LCAweGFjNjgsIDB4NjAzNCwgMHhkMDljLCAweDExMjgsIDB4NjgwOCwgMHhhMzFhLCAweDY4MGMsCisJMHhhMjEzLCAweDAwMjAsIDB4NjgxMCwgMHhhMzFhLCAweDY4MTQsIDB4YTIxMywgMHgwMGRlLCAweDA4MDQsCisJMHgyMDMzLCAweDA4MDQsIDB4MjAyZiwgMHgwODBjLCAweDE0ZjYsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDIwNzEsCisJMHhiMDFlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLCAweDA1OTAsIDB4MjA3OSwgMHgwMDIwLCAweDAwMTYsCisJMHgyMDA5LCAweDAyMDcsIDB4MjEwYywgMHhkMTk0LCAweDAxNTgsIDB4MjAwOSwgMHgwMjBjLCAweDIxMGMsCisJMHhhMTg0LCAweDAwMDMsIDB4MDEyOCwgMHgyMGUxLCAweDkwNDAsIDB4MjAwMSwgMHgwMjBjLCAweDIxMDIsCisJMHgyMDA5LCAweDAyMDYsIDB4MjEwNCwgMHgyMDA5LCAweDAyMDMsIDB4MjEwYywgMHhhMTA2LCAweDExMTAsCisJMHgyMGUxLCAweDkwNDAsIDB4NzgwNCwgMHhkMGZjLCAweDBkMTgsIDB4MDgwYywgMHgxZmY0LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MTllOCwgMHgwMDFlLCAweDc4MDMsIDB4MDAwNCwgMHg3ODA0LCAweGQwYWMsCisJMHgxZGU4LCAweDIwZTEsIDB4OTA0MCwgMHg3ODAzLCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4MDAyNiwgMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsCisJMHhiMDFlLCAweDIwNzksIDB4MDAyMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwNTQwLCAweDcwMDQsCisJMHgyMDYwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE1OCwgMHg2ODUwLCAweGMwYjUsCisJMHg2ODUyLCAweDY4MGMsIDB4N2ExYywgMHhhMjA2LCAweDExMjAsIDB4NjgwOCwgMHg3YTE4LCAweGEyMDYsCisJMHgwMWUwLCAweDIwMDEsIDB4MDEwNSwgMHgyMDAzLCAweDAwMTAsIDB4MjBlMSwgMHg5MDQwLCAweDc4MDMsCisJMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHg3MDA0LCAweDIwNjAsIDB4MDgwYywgMHg5MjljLCAweDIwZTEsCisJMHg5MDQwLCAweDA4MGMsIDB4N2NiOCwgMHgyMDExLCAweDAwMDAsIDB4MDgwYywgMHg3YWU5LCAweDAwZmUsCisJMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDJlLCAweDAwMDUsIDB4NjgxMCwgMHg2YTE0LCAweGEyMDUsCisJMHgxZDAwLCAweDY4NGMsIDB4YzBkYywgMHg2ODRlLCAweDJjMTAsIDB4MDgwYywgMHgxZTZlLCAweDIwMDEsCisJMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMGUxLCAweDkwNDAsIDB4NzgwMywgMHgwMDA0LCAweDcwMDMsCisJMHgwMDAwLCAweDIwNjksIDB4YWZjNywgMHg2ODMzLCAweDAwMDAsIDB4NjgzZiwgMHgwMDAwLCAweDA4ZjgsCisJMHg4ODQwLCAweDI4MDUsIDB4YTAwNSwgMHgxMTcwLCAweDYwMDQsIDB4YTAwNSwgMHgwMTY4LCAweDY4MWEsCisJMHgyMDYwLCAweDYwMzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsIDB4MjE4NiwgMHgyMDQ1LCAweDg4ZmYsCisJMHgwOTBjLCAweDE0ZjYsIDB4OGE1MSwgMHgwMDA1LCAweDIwNTAsIDB4MDAwNSwgMHg4YTUwLCAweDg4NDEsCisJMHgyODA1LCAweGEwMDUsIDB4MTE5MCwgMHgyYzAwLCAweGFkMDYsIDB4MDEyMCwgMHg2MDAwLCAweGEwMDUsCisJMHgxMTA4LCAweDJkMDAsIDB4MjA2MCwgMHg2ODFhLCAweDYwMzQsIDB4YTA4NCwgMHgwMDBmLCAweGEwODAsCisJMHgyMTk2LCAweDIwNDUsIDB4ODhmZiwgMHgwOTBjLCAweDE0ZjYsIDB4MDAwNSwgMHgwMDAwLCAweDAwMTEsCisJMHgwMDE1LCAweDAwMTksIDB4MDAxZCwgMHgwMDIxLCAweDAwMjUsIDB4MDAyOSwgMHgwMDAwLCAweDAwMGYsCisJMHgwMDE1LCAweDAwMWIsIDB4MDAyMSwgMHgwMDI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxN2IsCisJMHgyMTc3LCAweDAwMDAsIDB4MDAwMCwgMHgyMTg1LCAweDAwMDAsIDB4MjE3YiwgMHgwMDAwLCAweDIxODIsCisJMHgyMTdmLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxODUsIDB4MjE4MiwgMHgwMDAwLCAweDIxN2QsCisJMHgyMTdkLCAweDAwMDAsIDB4MDAwMCwgMHgyMTg1LCAweDAwMDAsIDB4MjE3ZCwgMHgwMDAwLCAweDIxODMsCisJMHgyMTgzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxODUsIDB4MjE4MywgMHgwMGE2LCAweDAwOTYsCisJMHgwMDg2LCAweDZiMmUsIDB4NmMyYSwgMHg2ODU4LCAweGEwNTUsIDB4MDkwNCwgMHgyMjM3LCAweDJkNjAsCisJMHg2MDM0LCAweGEwY2MsIDB4MDAwZiwgMHhhOWMwLCAweDIxODYsIDB4YTk4NiwgMHgwMDA3LCAweDAxMzAsCisJMHhhOTg2LCAweDAwMGUsIDB4MDExOCwgMHhhOTg2LCAweDAwMGYsIDB4MTEyMCwgMHg2MDVjLCAweGE0MjIsCisJMHg2MDYwLCAweGEzMWEsIDB4MjgwNSwgMHhhMDQ1LCAweDExNDAsIDB4MDMxMCwgMHgwODA0LCAweDIyMzcsCisJMHg2MDA0LCAweGEwNjUsIDB4MDkwNCwgMHgyMjM3LCAweDBjMTgsIDB4MjgwNSwgMHhhMDA1LCAweDAxYTgsCisJMHhhYzY4LCAweGQ5OWMsIDB4MTEyOCwgMHg2ODA4LCAweGE0MjIsIDB4NjgwYywgMHhhMzFiLCAweDAwMjAsCisJMHg2ODEwLCAweGE0MjIsIDB4NjgxNCwgMHhhMzFiLCAweDA2MjAsIDB4MjMwMCwgMHhhNDA1LCAweDAxNTAsCisJMHg4YTUxLCAweDA5MDQsIDB4MjIzNywgMHg4ODQwLCAweDBjNDAsIDB4NjAwNCwgMHhhMDY1LCAweDA5MDQsCisJMHgyMjM3LCAweDA4MzAsIDB4OGE1MSwgMHgwOTA0LCAweDIyMzcsIDB4ODg0MCwgMHgyODA1LCAweGEwMDUsCisJMHgxMTU4LCAweDYwMDQsIDB4YTA2NSwgMHgwOTA0LCAweDIyMzcsIDB4NjAzNCwgMHhhMGNjLCAweDAwMGYsCisJMHhhOWMwLCAweDIxODYsIDB4MjgwNSwgMHgyMDQwLCAweDJiNjgsIDB4Njg1MCwgMHhjMGZjLCAweDY4NTIsCisJMHgwNDU4LCAweDg0MjIsIDB4ODQyMCwgMHg4MzFhLCAweGEzOTksIDB4MDAwMCwgMHgwMGQ2LCAweDJiNjgsCisJMHg2YzZlLCAweDZiNzIsIDB4MDBkZSwgMHhkOTljLCAweDExNjgsIDB4NjkwOCwgMHgyNDAwLCAweGExMjIsCisJMHg2OTBjLCAweDIzMDAsIDB4YTExYiwgMHgwYTBjLCAweDE0ZjYsIDB4NjgwMCwgMHhhNDIwLCAweDY4MDQsCisJMHhhMzE5LCAweDAwNjAsIDB4NjkxMCwgMHgyNDAwLCAweGExMjIsIDB4NjkxNCwgMHgyMzAwLCAweGExMWIsCisJMHgwYTBjLCAweDE0ZjYsIDB4NjgwMCwgMHhhNDIwLCAweDY4MDQsIDB4YTMxOSwgMHgyYjY4LCAweDZjMWUsCisJMHg2YjIyLCAweDY4NTAsIDB4YzBmZCwgMHg2ODUyLCAweDJjMDAsIDB4NjgxYSwgMHgyODAwLCAweDY4MzIsCisJMHgyYTAwLCAweDY4MjYsIDB4MDAwZSwgMHgwMDBlLCAweDAwMGUsIDB4YTAwNiwgMHgwMDI4LCAweDAwOGUsCisJMHgwMDllLCAweDAwYWUsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MjAwMSwgMHgwMDA1LCAweDIwMDQsCisJMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHgyMjRiLCAweDIyNGMsIDB4MjI0ZiwgMHgyMjUyLCAweDIyNTcsCisJMHgyMjVhLCAweDIyNWYsIDB4MjI2NCwgMHgwMDA1LCAweDA4MGMsIDB4MWZmNCwgMHgwMDA1LCAweDA4MGMsCisJMHgxYTZjLCAweDAwMDUsIDB4MDgwYywgMHgxYTZjLCAweDA4MGMsIDB4MWZmNCwgMHgwMDA1LCAweDA4MGMsCisJMHgxNmY4LCAweDAwMDUsIDB4MDgwYywgMHgxZmY0LCAweDA4MGMsIDB4MTZmOCwgMHgwMDA1LCAweDA4MGMsCisJMHgxYTZjLCAweDA4MGMsIDB4MTZmOCwgMHgwMDA1LCAweDA4MGMsIDB4MWE2YywgMHgwODBjLCAweDFmZjQsCisJMHgwODBjLCAweDE2ZjgsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjYwMCwgMHgyMDc5LCAweDAyMDAsCisJMHgyMDcxLCAweGIyODAsIDB4MjA2OSwgMHhhZDAwLCAweDIwMDksIDB4MDAwNCwgMHg3OTEyLCAweDc4MTcsCisJMHgwMDA0LCAweDA4MGMsIDB4MjY1MSwgMHg3ODFiLCAweDAwMDIsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDIwYTksIDB4MDA4MCwgMHg3ODJmLCAweDAwMDAsIDB4MWYwNCwgMHgyMjgzLCAweDIwZTEsCisJMHg5MDgwLCAweDc4M2IsIDB4MDAxZiwgMHgyMGUxLCAweDg3MDAsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDI2MDAsIDB4NzgxYywgMHhkMGE0LCAweDE5MGMsIDB4MjMzNSwgMHhhMDg0LCAweDAwMDcsCisJMHgwMDAyLCAweDIyYjMsIDB4MjJhMSwgMHgyMmE0LCAweDIyYTcsIDB4MjJhYywgMHgyMmFlLCAweDIyYjAsCisJMHgyMmIyLCAweDA4MGMsIDB4NWZiNywgMHgwMDc4LCAweDA4MGMsIDB4NWZmMCwgMHgwMDYwLCAweDA4MGMsCisJMHg1ZmI3LCAweDA4MGMsIDB4NWZmMCwgMHgwMDM4LCAweDAwNDEsIDB4MDAyOCwgMHgwMDMxLCAweDAwMTgsCisJMHgwMDIxLCAweDAwMDgsIDB4MDAxMSwgMHgwMTJlLCAweDAwMDUsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsCisJMHg3OTMwLCAweGExODQsIDB4MDAwMywgMHgwMTE4LCAweDIwZTEsIDB4OTA0MCwgMHgwNGEwLCAweGExODQsCisJMHgwMDMwLCAweDAxZTAsIDB4NmEwMCwgMHhhMjg2LCAweDAwMDMsIDB4MTEwOCwgMHgwMGEwLCAweDA4MGMsCisJMHg1NzRmLCAweDExNzgsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGFkMDAsCisJMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NTc5MywgMHgwODBjLCAweDU2OWEsCisJMHgwMDEwLCAweDA4MGMsIDB4NDg1ZSwgMHgyMGUxLCAweDkwMTAsIDB4MDBhOCwgMHhhMTg0LCAweDAwYzAsCisJMHgwMTY4LCAweDAwZTYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwNTYsIDB4MjA3MSwgMHhhZmZkLCAweDA4MGMsCisJMHgxZDIyLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDNlLCAweDAwZWUsIDB4MDAyOCwgMHhhMTg0LCAweDAzMDAsCisJMHgwMTEwLCAweDIwZTEsIDB4OTAyMCwgMHg3OTMyLCAweDAwMmUsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDE2LCAweDAwZTYsIDB4MDBmNiwgMHgyMDcxLCAweGFkMDAsIDB4NzEyOCwgMHgyMDAxLCAweGFmOTAsCisJMHgyMTAyLCAweDIwMDEsIDB4YWY5OCwgMHgyMTAyLCAweGExODIsIDB4MDIxMSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDA4LCAweDA0MDAsIDB4YTE4MiwgMHgwMjU5LCAweDEyMTgsIDB4MjAwOSwgMHgwMDA3LCAweDAwZDAsCisJMHhhMTgyLCAweDAyYzEsIDB4MTIxOCwgMHgyMDA5LCAweDAwMDYsIDB4MDBhMCwgMHhhMTgyLCAweDAzNDksCisJMHgxMjE4LCAweDIwMDksIDB4MDAwNSwgMHgwMDcwLCAweGExODIsIDB4MDQyMSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDA0LCAweDAwNDAsIDB4YTE4MiwgMHgwNTgxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDAzLCAweDAwMTAsCisJMHgyMDA5LCAweDAwMDIsIDB4MjA3OSwgMHgwMjAwLCAweDc5MTIsIDB4NzgxNywgMHgwMDA0LCAweDA4MGMsCisJMHgyNjUxLCAweDAwZmUsIDB4MDBlZSwgMHgwMDFlLCAweDAwMDUsIDB4NzkzOCwgMHgwODBjLCAweDE0ZjYsCisJMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhZDAwLCAweDYwMjQsCisJMHg2MDI2LCAweDYwNTMsIDB4MDAzMCwgMHgwODBjLCAweDI2OTAsIDB4NjA1MCwgMHhhMDg0LCAweGZlN2YsCisJMHg2MDUyLCAweDIwMDksIDB4MDBlZiwgMHg2MTMyLCAweDYxMzYsIDB4MDgwYywgMHgyNmEwLCAweDYwZTcsCisJMHgwMDAwLCAweDYxZWEsIDB4NjBlMywgMHgwMDA4LCAweDYwNGIsIDB4ZjdmNywgMHg2MDQzLCAweDAwMDAsCisJMHg2MDJmLCAweDAwODAsIDB4NjAyZiwgMHgwMDAwLCAweDYwMDcsIDB4MGU5ZiwgMHg2MDFiLCAweDAwMWUsCisJMHg2MDBmLCAweDAwZmYsIDB4MjAwMSwgMHhhZjhjLCAweDIwMDMsIDB4MDBmZiwgMHg2MDJiLCAweDAwMmYsCisJMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDMxLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweGFkMzAsCisJMHgyMDAzLCAweDAwMDEsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsCisJMHgwMDI2LCAweDYxMjQsIDB4YTE4NCwgMHgxZTJjLCAweDExMTgsIDB4YTE4NCwgMHgwMDA3LCAweDAwMmEsCisJMHhhMTk1LCAweDAwMDQsIDB4YTI4NCwgMHgwMDA3LCAweDAwMDIsIDB4MjNhNywgMHgyMzhkLCAweDIzOTAsCisJMHgyMzkzLCAweDIzOTgsIDB4MjM5YSwgMHgyMzllLCAweDIzYTIsIDB4MDgwYywgMHg2Njk5LCAweDAwYjgsCisJMHgwODBjLCAweDY3NzQsIDB4MDBhMCwgMHgwODBjLCAweDY3NzQsIDB4MDgwYywgMHg2Njk5LCAweDAwNzgsCisJMHgwMDk5LCAweDAwNjgsIDB4MDgwYywgMHg2Njk5LCAweDAwNzksIDB4MDA0OCwgMHgwODBjLCAweDY3NzQsCisJMHgwMDU5LCAweDAwMjgsIDB4MDgwYywgMHg2Nzc0LCAweDA4MGMsIDB4NjY5OSwgMHgwMDI5LCAweDAwMmUsCisJMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDYxMjQsIDB4ZDE5YywgMHgxOTA0LCAweDI1YmYsCisJMHgwODBjLCAweDU3NGYsIDB4MDU3OCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMTk4LCAweDYwMjQsCisJMHhhMDg0LCAweDE4MDAsIDB4MDE3OCwgMHgwODBjLCAweDU3NzUsIDB4MDExOCwgMHgwODBjLCAweDU3NjEsCisJMHgxMTQ4LCAweDYwMjcsIDB4MDAyMCwgMHg2MDQzLCAweDAwMDAsIDB4MjAwMSwgMHhhZjlkLCAweDIwMDMsCisJMHhhYWFhLCAweDA0NTgsIDB4MDgwYywgMHg1Nzc1LCAweDE1ZDAsIDB4NjAyNCwgMHhhMDg0LCAweDE4MDAsCisJMHgxMTA4LCAweDA0YTgsIDB4MjAwMSwgMHhhZjlkLCAweDIwMDMsIDB4YWFhYSwgMHgyMDAxLCAweGFmOWUsCisJMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHgwODBjLCAweDU2OWEsCisJMHgwODA0LCAweDI1YmYsIDB4ZDFhYywgMHgxNTE4LCAweDYwMjQsIDB4ZDBkYywgMHgxMTcwLCAweGQwZTQsCisJMHgxMTg4LCAweGQwZDQsIDB4MTFhMCwgMHhkMGNjLCAweDAxMzAsIDB4NzA4OCwgMHhhMDg2LCAweDAwMjgsCisJMHgxMTEwLCAweDA4MGMsIDB4NThkYSwgMHgwODA0LCAweDI1YmYsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsCisJMHgwMDAwLCAweDAwNDgsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMiwgMHgwMDIwLCAweDA4MGMsCisJMHg1ODRkLCAweDA4MDQsIDB4MjViZiwgMHgwODBjLCAweDU5N2EsIDB4MDgwNCwgMHgyNWJmLCAweGQxYWMsCisJMHgwOTA0LCAweDI1MDcsIDB4MDgwYywgMHg1NzRmLCAweDExZDgsIDB4NjAyNywgMHgwMDIwLCAweDAwMDYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDgwYywgMHg1NzZiLCAweDExNzAsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsCisJMHgwMDAxLCAweDIwMDEsIDB4YWQwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDgwYywgMHg1NjlhLCAweDAwM2UsCisJMHgwMDJlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDNlLCAweDAwMmUsIDB4MDAwZSwgMHgwODBjLCAweDU3MjYsCisJMHgwMDE2LCAweDAwNDYsIDB4MDBjNiwgMHg2NDRjLCAweGE0ODYsIDB4ZjBmMCwgMHgxMTM4LCAweDIwNjEsCisJMHgwMTAwLCAweDY0NGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHg3NGNhLCAweGE0OGMsCisJMHhmZjAwLCAweDcwMzQsIDB4ZDA4NCwgMHgwMTc4LCAweGExODYsIDB4ZjgwMCwgMHgxMTYwLCAweDcwMzgsCisJMHhkMDg0LCAweDExNDgsIDB4YzA4NSwgMHg3MDNhLCAweDAwMzYsIDB4MjQxOCwgMHgyMDExLCAweDgwMTYsCisJMHgwODBjLCAweDNjNWMsIDB4MDAzZSwgMHhhMTk2LCAweGZmMDAsIDB4MDViOCwgMHg3MDUwLCAweGEwODQsCisJMHgwMGZmLCAweDgxMGYsIDB4YTExNiwgMHgwNTg4LCAweDcxMzAsIDB4ZDE4NCwgMHgxNTcwLCAweDIwMTEsCisJMHhhZDUyLCAweDIyMTQsIDB4ZDJlYywgMHgwMTM4LCAweGMxOGQsIDB4NzEzMiwgMHgyMDExLCAweGFkNTIsCisJMHgyMjE0LCAweGQyYWMsIDB4MTUxMCwgMHg2MjQwLCAweGEyOTQsIDB4MDAxMCwgMHgwMTMwLCAweDYyNDgsCisJMHhhMjk0LCAweGZmMDAsIDB4YTI5NiwgMHhmZjAwLCAweDAxYzAsIDB4NzAzMCwgMHhkMDhjLCAweDA5MDQsCisJMHgyNGQyLCAweDcwMzQsIDB4ZDA4YywgMHgxMTQwLCAweDIwMDEsIDB4YWQwYywgMHgyMDBjLCAweGQxYWMsCisJMHgxOTA0LCAweDI0ZDIsIDB4YzFhZCwgMHgyMTAyLCAweDAwMzYsIDB4NzNjOCwgMHgyMDExLCAweDgwMTMsCisJMHgwODBjLCAweDNjNWMsIDB4MDAzZSwgMHgwODA0LCAweDI0ZDIsIDB4NzAzNCwgMHhkMDhjLCAweDExNDAsCisJMHgyMDAxLCAweGFkMGMsIDB4MjAwYywgMHhkMWFjLCAweDE5MDQsIDB4MjRkMiwgMHhjMWFkLCAweDIxMDIsCisJMHgwMDM2LCAweDczYzgsIDB4MjAxMSwgMHg4MDEzLCAweDA4MGMsIDB4M2M1YywgMHgwMDNlLCAweDcxMzAsCisJMHhjMTg1LCAweDcxMzIsIDB4MjAxMSwgMHhhZDUyLCAweDIyMGMsIDB4ZDFhNCwgMHgwMWQwLCAweDAwMTYsCisJMHgyMDA5LCAweDAwMDEsIDB4MjAxMSwgMHgwMTAwLCAweDA4MGMsIDB4NjYzZiwgMHgyMDE5LCAweDAwMGUsCisJMHgwODBjLCAweGE4ZWIsIDB4YTQ4NCwgMHgwMGZmLCAweGEwODAsIDB4MmJlNiwgMHgyMDBkLCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4ODEyNywgMHhhMDA2LCAweDIwMDksIDB4MDAwZSwgMHgwODBjLCAweGE5NmMsCisJMHgwMDFlLCAweGQxYWMsIDB4MTE0OCwgMHgwMDE2LCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LCAweDAwMDQsCisJMHgwODBjLCAweDJhYWMsIDB4MDAxZSwgMHgwMDcwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksCisJMHgwMDAwLCAweDA4MGMsIDB4NGNkYywgMHgxMTEwLCAweDA4MGMsIDB4NDkzYSwgMHg4MTA4LCAweDFmMDQsCisJMHgyNGM5LCAweDAxNWUsIDB4MDBjZSwgMHgwMDRlLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDdhZGYsCisJMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg3YWU5LCAweDA4MGMsIDB4NzllMSwgMHgwODBjLCAweDY1ODEsCisJMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDdhNjQsIDB4MDAzZSwgMHg2MGUzLCAweDAwMDAsCisJMHgwMDFlLCAweDIwMDEsIDB4YWQwMCwgMHgyMDE0LCAweGEyOTYsIDB4MDAwNCwgMHgxMTI4LCAweGQxOWMsCisJMHgxMTE4LCAweDYyMjgsIDB4YzI5ZCwgMHg2MjJhLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGFkMjIsCisJMHgyMDAzLCAweDAwMDAsIDB4NjAyNywgMHgwMDIwLCAweDA4MGMsIDB4NTc3NSwgMHgxMTQwLCAweDAwMTYsCisJMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg1NjdiLCAweDA4MGMsIDB4NjU5MywgMHgwMDFlLCAweGQxOTQsCisJMHgwOTA0LCAweDI1YmYsIDB4MDAxNiwgMHg2MjIwLCAweGQyYjQsIDB4MDkwNCwgMHgyNTcwLCAweDA4MGMsCisJMHg2NTgxLCAweDA4MGMsIDB4NzgzNCwgMHg2MDI3LCAweDAwMDQsIDB4MDBmNiwgMHgyMDE5LCAweGFmZDAsCisJMHgyMzA0LCAweGEwN2QsIDB4MDU3MCwgMHg3ODA0LCAweGEwODYsIDB4MDAzMiwgMHgxNTUwLCAweDAwZDYsCisJMHgwMGM2LCAweDAwZTYsIDB4MjA2OSwgMHgwMTQwLCAweDYxOGMsIDB4NjI4OCwgMHg3ODE4LCAweDYwOGUsCisJMHg3ODA4LCAweDYwOGEsIDB4NjA0MywgMHgwMDAyLCAweDIwMDEsIDB4MDAwMywgMHg4MDAxLCAweDFkZjAsCisJMHg2MDQzLCAweDAwMDAsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsIDB4MDAwMCwgMHg2MThlLCAweDYyOGEsCisJMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg2YzUwLCAweDc4MTAsIDB4MjA3MCwgMHg3MDM3LCAweDAxMDMsCisJMHgyZjYwLCAweDA4MGMsIDB4ODA3OCwgMHgwMGVlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGZlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwZmUsIDB4MDBkNiwgMHgyMDY5LCAweDAxNDAsIDB4NjgwNCwgMHhhMDg0LCAweDQwMDAsCisJMHgwMTIwLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLCAweDAwMDAsIDB4MDBkZSwgMHgwMGM2LCAweDIwNjEsCisJMHhhZmM3LCAweDYwMjgsIDB4YTA5YSwgMHgwMGM4LCAweDEyMzgsIDB4ODAwMCwgMHg2MDJhLCAweDAwY2UsCisJMHgwODBjLCAweDc4MjcsIDB4MDgwNCwgMHgyNWJlLCAweDIwMTksIDB4YWZkMCwgMHgyMzA0LCAweGEwNjUsCisJMHgwMTIwLCAweDIwMDksIDB4MDAyNywgMHgwODBjLCAweDgwYTcsIDB4MDBjZSwgMHgwODA0LCAweDI1YmUsCisJMHhkMmJjLCAweDA5MDQsIDB4MjViZSwgMHgwODBjLCAweDY1OGUsIDB4NjAxNCwgMHhhMDg0LCAweDAxODQsCisJMHhhMDg1LCAweDAwMTAsIDB4NjAxNiwgMHg2MDI3LCAweDAwMDQsIDB4MDBkNiwgMHgyMDY5LCAweDAxNDAsCisJMHg2ODA0LCAweGEwODQsIDB4NDAwMCwgMHgwMTIwLCAweDY4MDMsIDB4MTAwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgwMGRlLCAweDAwYzYsIDB4MjA2MSwgMHhhZmM3LCAweDYwNDQsIDB4YTA5YSwgMHgwMGM4LCAweDEyZjAsCisJMHg4MDAwLCAweDYwNDYsIDB4NjAzYywgMHgwMGNlLCAweGEwMDUsIDB4MDU0MCwgMHgyMDA5LCAweDA3ZDAsCisJMHgwODBjLCAweDY1ODYsIDB4YTA4MCwgMHgwMDA3LCAweDIwMDQsIDB4YTA4NiwgMHgwMDA2LCAweDExMzgsCisJMHg2MTE0LCAweGExOGMsIDB4MDE4NCwgMHhhMThkLCAweDAwMTIsIDB4NjExNiwgMHgwMGI4LCAweDYxMTQsCisJMHhhMThjLCAweDAxODQsIDB4YTE4ZCwgMHgwMDE2LCAweDYxMTYsIDB4MDA4MCwgMHgwMDM2LCAweDIwMTksCisJMHgwMDAxLCAweDA4MGMsIDB4N2E2NCwgMHgwMDNlLCAweDIwMTksIDB4YWZkNiwgMHgyMzA0LCAweGEwNjUsCisJMHgwMTIwLCAweDIwMDksIDB4MDA0ZiwgMHgwODBjLCAweDgwYTcsIDB4MDBjZSwgMHgwMDFlLCAweGQxOWMsCisJMHgwOTA0LCAweDI2MWEsIDB4NzAzNCwgMHhkMGFjLCAweDE1NjAsIDB4MDAxNiwgMHgwMTU2LCAweDYwMjcsCisJMHgwMDA4LCAweDYwMmYsIDB4MDAyMCwgMHgyMGE5LCAweDAwMDYsIDB4MWQwNCwgMHgyNWNkLCAweDIwOTEsCisJMHg2MDAwLCAweDFmMDQsIDB4MjVjZCwgMHg2MDJmLCAweDAwMDAsIDB4NjE1MCwgMHhhMTg1LCAweDE0MDAsCisJMHg2MDUyLCAweDIwYTksIDB4MDM2NiwgMHgxZDA0LCAweDI1ZGIsIDB4MjA5MSwgMHg2MDAwLCAweDYwMjAsCisJMHhkMDljLCAweDExMzAsIDB4MDE1ZSwgMHg2MTUyLCAweDAwMWUsIDB4NjAyNywgMHgwMDA4LCAweDA0OTAsCisJMHgwODBjLCAweDI3NjAsIDB4MWYwNCwgMHgyNWRiLCAweDAxNWUsIDB4NjE1MiwgMHgwMDFlLCAweDYwMjcsCisJMHgwMDA4LCAweDAwMTYsIDB4NjAyOCwgMHhjMDljLCAweDYwMmEsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsCisJMHg3YWRmLCAweDIwMTEsIDB4MDAwMiwgMHgwODBjLCAweDdhZTksIDB4MDgwYywgMHg3OWUxLCAweDA4MGMsCisJMHg2NTgxLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsIDB4N2E2NCwgMHgwMDNlLCAweDYwZTMsCisJMHgwMDAwLCAweDA4MGMsIDB4YWM4ZCwgMHgwODBjLCAweGFjYTgsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsCisJMHg1NzkzLCAweDIwMDEsIDB4YWQwMCwgMHgyMDAzLCAweDAwMDQsIDB4NjAyNywgMHgwMDA4LCAweDA4MGMsCisJMHgxMmNjLCAweDAwMWUsIDB4YTE4YywgMHhmZmQwLCAweDYxMjYsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsCisJMHgwMDI2LCAweDAwZTYsIDB4MDBmNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFkMDAsCisJMHg3MWMwLCAweDcwYzIsIDB4YTExNiwgMHgwMWYwLCAweDgxZmYsIDB4MDEyOCwgMHgyMDExLCAweDgwMTEsCisJMHgwODBjLCAweDNjNWMsIDB4MDBiOCwgMHgyMDExLCAweDgwMTIsIDB4MDgwYywgMHgzYzVjLCAweDIwMDEsCisJMHhhZDcxLCAweDIwMDQsIDB4ZDBmYywgMHgxMTcwLCAweDAwMzYsIDB4MDBjNiwgMHgwODBjLCAweDI2ZWIsCisJMHgyMDYxLCAweDAxMDAsIDB4MjAxOSwgMHgwMDI4LCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJhYWMsCisJMHgwMGNlLCAweDAwM2UsIDB4MDEyZSwgMHgwMGZlLCAweDAwZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBmNiwgMHgwMDA2LCAweDAwMjYsIDB4MjA2MSwgMHgwMTAwLCAweGExOTAsCisJMHgyNjY0LCAweDIyMDUsIDB4NjBmMiwgMHgyMDExLCAweDI2NzEsIDB4MjIwNSwgMHg2MGVlLCAweDAwMmUsCisJMHgwMDBlLCAweDAwZmUsIDB4MDBjZSwgMHgwMDA1LCAweDA4NDAsIDB4MDg0MCwgMHgwODQwLCAweDA1ODAsCisJMHgwNDIwLCAweDAzNDgsIDB4MDJjMCwgMHgwMjU4LCAweDAyMTAsIDB4MDFhOCwgMHgwMWE4LCAweDAxYTgsCisJMHgwMWE4LCAweDAxNDAsIDB4MDBmOCwgMHgwMGQwLCAweDAwYjAsIDB4MDBhMCwgMHgyMDI4LCAweGExOGMsCisJMHgwMGZmLCAweDIxMzAsIDB4YTA5NCwgMHhmZjAwLCAweDExMTAsIDB4ODFmZiwgMHgwMTE4LCAweDA4MGMsCisJMHg2Mjc4LCAweDAwMzgsIDB4YTA4MCwgMHgyYmU2LCAweDIwMGQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHhhMDA2LCAweDAwMDUsIDB4YTA4MCwgMHgyYmU2LCAweDIwMGQsIDB4YTE4YywgMHgwMGZmLCAweDAwMDUsCisJMHgwMGQ2LCAweDIwNjksIDB4MDE0MCwgMHgyMDAxLCAweGFkMTQsIDB4MjAwMywgMHgwMGVmLCAweDIwYTksCisJMHgwMDEwLCAweGEwMDYsIDB4Njg1MiwgMHg2ODU2LCAweDFmMDQsIDB4MjY5YiwgMHgwMGRlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwZDYsIDB4MDAyNiwgMHgyMDY5LCAweDAxNDAsIDB4MjAwMSwgMHhhZDE0LCAweDIxMDIsCisJMHg4MTE0LCAweDgyMTQsIDB4ODIxNCwgMHg4MjE0LCAweDIwYTksIDB4MDAxMCwgMHg2ODUzLCAweDAwMDAsCisJMHhhMDA2LCAweDgyZmYsIDB4MTEyOCwgMHhhMTg0LCAweDAwMGYsIDB4YTA4MCwgMHhhY2FlLCAweDIwMDUsCisJMHg2ODU2LCAweDgyMTEsIDB4MWYwNCwgMHgyNmIwLCAweDAwMmUsIDB4MDBkZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMGM2LCAweDIwNjEsIDB4YWQwMCwgMHg2MDMwLCAweDAxMTAsIDB4YzA5ZCwgMHgwMDA4LCAweGMwOWMsCisJMHg2MDMyLCAweDAwY2UsIDB4MDAwNSwgMHgwMTU2LCAweDAwZDYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsCisJMHgyMDY5LCAweDAxNDAsIDB4Njk4MCwgMHhhMTE2LCAweDAxODAsIDB4YTExMiwgMHgxMjMwLCAweDgyMTIsCisJMHg4MjEwLCAweDIyYTgsIDB4MjAwMSwgMHgwNDAyLCAweDAwMTgsIDB4MjJhOCwgMHgyMDAxLCAweDA0MDQsCisJMHg2ODBlLCAweDFmMDQsIDB4MjZlMCwgMHg2ODBmLCAweDAwMDAsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMGRlLCAweDAxNWUsIDB4MDAwNSwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGM0LCAweDAxNTAsCisJMHhkMGE0LCAweDAxNDAsIDB4YTAwNiwgMHgwMDQ2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJlLCAweDA4MGMsCisJMHhhOTZjLCAweDAwNGUsIDB4MDAwNSwgMHgwMGY2LCAweDAwMTYsIDB4MDAyNiwgMHgyMDc5LCAweDAxNDAsCisJMHg3OGM0LCAweGQwZGMsIDB4MDU0OCwgMHhhMDg0LCAweDA3MDAsIDB4YTA4ZSwgMHgwMzAwLCAweDE1MjAsCisJMHgyMDExLCAweDAwMDAsIDB4MjAwOSwgMHgwMDAyLCAweDIzMDAsIDB4YTA4MCwgMHgwMDIwLCAweDIwMTgsCisJMHgyMzAwLCAweDA4MGMsIDB4NjY2NSwgMHgyMDExLCAweDAwMzAsIDB4MjIwMCwgMHg4MDA3LCAweGEwODUsCisJMHgwMDRjLCAweDc4YzIsIDB4MjAwOSwgMHgwMjA0LCAweDIxMGMsIDB4MjIwMCwgMHhhMTAwLCAweDIwMDksCisJMHgwMTM4LCAweDIwMGEsIDB4MDgwYywgMHg1NzRmLCAweDExMTgsIDB4MjAwOSwgMHhhZjhlLCAweDIwMGEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDBmZSwgMHgwMDA1LCAweDc4YzMsIDB4MDAwMCwgMHgwY2M4LCAweDAxMjYsCisJMHgyMDkxLCAweDI4MDAsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MjAwMSwgMHgwMTcwLCAweDIwMGMsCisJMHg4MDAwLCAweDIwMTQsIDB4YTE4NCwgMHgwMDAzLCAweDAxMTAsIDB4MDgwNCwgMHgxYTZhLCAweDAwMmUsCisJMHgwMDFlLCAweDAwMGUsIDB4MDEyZSwgMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsCisJMHhhMDgyLCAweDAwMDUsIDB4MDAwZSwgMHgwMjY4LCAweDIwMDEsIDB4MDE3MCwgMHgyMDBjLCAweGExOGMsCisJMHgwMGZmLCAweGExOGUsIDB4MDA0YywgMHgxMTI4LCAweDIwMGMsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHgwMDEwLCAweDIwMDksIDB4MDAwMCwgMHgyMDAxLCAweDAyMDQsIDB4MjAwNCwgMHhhMTA4LCAweDAwMDUsCisJMHgwMDA2LCAweDAxNTYsIDB4MDBmNiwgMHgyMDc5LCAweDAxMDAsIDB4MjBhOSwgMHgwMDBhLCAweDc4NTQsCisJMHhkMDhjLCAweDExMTAsIDB4MWYwNCwgMHgyNzY3LCAweDAwZmUsIDB4MDE1ZSwgMHgwMDBlLCAweDAwMDUsCisJMHgwMDE2LCAweDAwYzYsIDB4MDAwNiwgMHgyMDYxLCAweDAxMDAsIDB4NjAzMCwgMHgwMDA2LCAweDYwNDgsCisJMHgwMDA2LCAweDYwZTQsIDB4MDAwNiwgMHg2MGU4LCAweDAwMDYsIDB4NjA1MCwgMHgwMDA2LCAweDYwZjAsCisJMHgwMDA2LCAweDYwZWMsIDB4MDAwNiwgMHg2MDBjLCAweDAwMDYsIDB4NjAwNCwgMHgwMDA2LCAweDYwMjgsCisJMHgwMDA2LCAweDYwZTAsIDB4MDAwNiwgMHg2MDJmLCAweDAxMDAsIDB4NjAyZiwgMHgwMDAwLCAweGUwMDAsCisJMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCwgMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwMGUsCisJMHg2MGUyLCAweDAwMGUsIDB4NjAyYSwgMHgwMDBlLCAweDYwMDYsIDB4MDAwZSwgMHg2MDBlLCAweDAwMGUsCisJMHg2MGVlLCAweDAwMGUsIDB4NjBmMiwgMHgwMDBlLCAweDYwNTIsIDB4MDAwZSwgMHg2MGVhLCAweDAwMGUsCisJMHg2MGU2LCAweDAwMGUsIDB4NjA0YSwgMHgwMDBlLCAweDYwMzIsIDB4NjAzNiwgMHgyMDA4LCAweDA4MGMsCisJMHgyNmEwLCAweDAwMGUsIDB4MDBjZSwgMHgwMDFlLCAweDAwMDUsIDB4Mjg0NSwgMHgyODQ5LCAweDI4NGQsCisJMHgyODUzLCAweDI4NTksIDB4Mjg1ZiwgMHgyODY1LCAweDI4NmQsIDB4Mjg3NSwgMHgyODdiLCAweDI4ODEsCisJMHgyODg5LCAweDI4OTEsIDB4Mjg5OSwgMHgyOGExLCAweDI4YWIsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNywgMHgyOGI3LCAweDI4YmMsCisJMHgyOGJjLCAweDI4YzMsIDB4MjhjMywgMHgyOGNhLCAweDI4Y2EsIDB4MjhkMywgMHgyOGQzLCAweDI4ZGEsCisJMHgyOGRhLCAweDI4ZTMsIDB4MjhlMywgMHgyOGVjLCAweDI4ZWMsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsCisJMHgyOGI1LCAweDI4YjUsIDB4MjhiNSwgMHgyOGI1LCAweDI4YjUsIDB4MDEwNiwgMHgwMDA2LCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsCisJMHgyMzczLCAweDA4MDQsIDB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMzczLCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIyM2QsIDB4MDgwNCwgMHgyOGY3LCAweDAxMDYsCisJMHgwMDA2LCAweDA4MGMsIDB4MjIzZCwgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsCisJMHgyMzczLCAweDA4MGMsIDB4MjIzZCwgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsCisJMHgyMzczLCAweDA4MGMsIDB4MjIzZCwgMHgwODA0LCAweDI4ZjcsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsCisJMHgyMjhmLCAweDA4MDQsIDB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMjhmLCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIzNzMsIDB4MDgwYywgMHgyMjhmLCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIzNzMsIDB4MDgwYywgMHgyMjhmLCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIyM2QsIDB4MDgwYywgMHgyMjhmLCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIyM2QsIDB4MDgwYywgMHgyMjhmLCAweDA4MDQsCisJMHgyOGY3LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDIzNzMsIDB4MDgwYywgMHgyMjNkLCAweDA4MGMsCisJMHgyMjhmLCAweDA4MDQsIDB4MjhmNywgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyMzczLCAweDA4MGMsCisJMHgyMjNkLCAweDA4MGMsIDB4MjI4ZiwgMHgwODA0LCAweDI4ZjcsIDB4ZTAwMCwgMHgwY2YwLCAweDAxMDYsCisJMHgwMDA2LCAweDA4MGMsIDB4MjcyZiwgMHgwNGQ4LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI3MmYsCisJMHgwODBjLCAweDIzNzMsIDB4MDRhMCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNzJmLCAweDA4MGMsCisJMHgyMjNkLCAweDA0NjgsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjcyZiwgMHgwODBjLCAweDIzNzMsCisJMHgwODBjLCAweDIyM2QsIDB4MDQyMCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNzJmLCAweDA4MGMsCisJMHgyMjhmLCAweDAwZTgsIDB4MDEwNiwgMHgwMDA2LCAweDA4MGMsIDB4MjcyZiwgMHgwODBjLCAweDIzNzMsCisJMHgwODBjLCAweDIyOGYsIDB4MDBhMCwgMHgwMTA2LCAweDAwMDYsIDB4MDgwYywgMHgyNzJmLCAweDA4MGMsCisJMHgyMjNkLCAweDA4MGMsIDB4MjI4ZiwgMHgwMDU4LCAweDAxMDYsIDB4MDAwNiwgMHgwODBjLCAweDI3MmYsCisJMHgwODBjLCAweDIzNzMsIDB4MDgwYywgMHgyMjNkLCAweDA4MGMsIDB4MjI4ZiwgMHgwMDAwLCAweDAwMGUsCisJMHgwMTBlLCAweDAwMGQsIDB4MDBjNiwgMHgwMDI2LCAweDAwNDYsIDB4MjAyMSwgMHgwMDAwLCAweDA4MGMsCisJMHg1MDJkLCAweDE5MDQsIDB4MjlkNCwgMHg3MmQwLCAweDIwMDEsIDB4YWY5ZCwgMHgyMDA0LCAweGEwMDUsCisJMHgxMTEwLCAweGQyOWMsIDB4MDE0OCwgMHhkMjg0LCAweDExMzgsIDB4ZDJiYywgMHgxOTA0LCAweDI5ZDQsCisJMHgwODBjLCAweDI5ZDgsIDB4MDgwNCwgMHgyOWQ0LCAweDA4MGMsIDB4NTc0ZiwgMHgxMTIwLCAweDcwOWIsCisJMHhmZmZmLCAweDA4MDQsIDB4MjlkNCwgMHhkMjk0LCAweDAxMjAsIDB4NzA5YiwgMHhmZmZmLCAweDA4MDQsCisJMHgyOWQ0LCAweDIwMDEsIDB4YWQxNCwgMHgyMDNjLCAweDcyODQsIDB4ZDI4NCwgMHgwOTA0LCAweDI5NzYsCisJMHhkMjhjLCAweDE5MDQsIDB4Mjk3NiwgMHgwMDM2LCAweDczOTgsIDB4YTM4ZSwgMHhmZmZmLCAweDExMTAsCisJMHgyMDE5LCAweDAwMDEsIDB4ODMxNCwgMHhhMmUwLCAweGIzYzAsIDB4MmMwNCwgMHhhMzhjLCAweDAwMDEsCisJMHgwMTIwLCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweDAwMTAsIDB4YTA4NCwgMHgwMGZmLCAweGE3MGUsCisJMHgwNTYwLCAweGEwOGUsIDB4MDAwMCwgMHgwNTQ4LCAweGEwOGUsIDB4MDBmZiwgMHgxMTUwLCAweDcyMzAsCisJMHhkMjg0LCAweDE1MzgsIDB4NzI4NCwgMHhjMjhkLCAweDcyODYsIDB4NzA5YiwgMHhmZmZmLCAweDAwM2UsCisJMHgwNDI4LCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDI2NzYsIDB4MDgwYywgMHg0YzgwLCAweDExYjgsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTE1MCwgMHg3MDMwLCAweGQwOGMsCisJMHgwMTE4LCAweDYwMDAsIDB4ZDBiYywgMHgwMTIwLCAweDA4MGMsIDB4MjllYiwgMHgwMTQwLCAweDAwMjgsCisJMHgwODBjLCAweDJiMWEsIDB4MDgwYywgMHgyYTE5LCAweDAxMTAsIDB4ODMxOCwgMHgwODE4LCAweDczOWEsCisJMHgwMDEwLCAweDcwOWIsIDB4ZmZmZiwgMHgwMDNlLCAweDA4MDQsIDB4MjlkNCwgMHhhNzgwLCAweDJiZTYsCisJMHgyMDNkLCAweGE3YmMsIDB4ZmYwMCwgMHg4NzNmLCAweDIwNDEsIDB4MDA3ZSwgMHg3MDk4LCAweGEwOTYsCisJMHhmZmZmLCAweDExMjAsIDB4MjAwOSwgMHgwMDAwLCAweDI4YTgsIDB4MDA1MCwgMHhhODEyLCAweDAyMjAsCisJMHgyMDA4LCAweGE4MDIsIDB4MjBhOCwgMHgwMDIwLCAweDcwOWIsIDB4ZmZmZiwgMHgwODA0LCAweDI5ZDQsCisJMHgyNzAwLCAweDAxNTYsIDB4MDAxNiwgMHhhMTA2LCAweDA1YTAsIDB4YzQ4NCwgMHgwODBjLCAweDRjZGMsCisJMHgwMTIwLCAweDA4MGMsIDB4NGM4MCwgMHgxNWE4LCAweDAwMDgsIDB4YzQ4NSwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMTMwLCAweDcwMzAsIDB4ZDA4YywgMHgwMWU4LCAweDYwMDAsCisJMHhkMGJjLCAweDExZDAsIDB4NzI4NCwgMHhkMjhjLCAweDAxODgsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDgyLCAweDAwMDYsIDB4MDJiMCwgMHhkNDg0LCAweDExMTgsIDB4MDgwYywgMHg0YzlmLCAweDAwMjgsCisJMHgwODBjLCAweDJiOWMsIDB4MDE3MCwgMHgwODBjLCAweDJiYzksIDB4MDA1OCwgMHgwODBjLCAweDJiMWEsCisJMHgwODBjLCAweDJhMTksIDB4MDE3MCwgMHgwMDI4LCAweDA4MGMsIDB4MmI5YywgMHgwMTEwLCAweDA0MTksCisJMHgwMTQwLCAweDAwMWUsIDB4ODEwOCwgMHgwMTVlLCAweDFmMDQsIDB4Mjk5MCwgMHg3MDliLCAweGZmZmYsCisJMHgwMDE4LCAweDAwMWUsIDB4MDE1ZSwgMHg3MTlhLCAweDAwNGUsIDB4MDAyZSwgMHgwMGNlLCAweDAwMDUsCisJMHgwMGM2LCAweDAwMTYsIDB4NzA5YiwgMHgwMDAwLCAweDIwMDksIDB4MDA3ZSwgMHgwODBjLCAweDRjODAsCisJMHgxMTM4LCAweDA4MGMsIDB4MmIxYSwgMHgwNGE5LCAweDAxMTgsIDB4NzBkMCwgMHhjMGJkLCAweDcwZDIsCisJMHgwMDFlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDE2LCAweDAwNzYsIDB4MDBkNiwgMHgwMGM2LCAweDJjNjgsCisJMHgyMDAxLCAweGFkNTYsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4Njg0MiwgMHgwODBjLCAweDk4MDcsCisJMHgwMWQ4LCAweDJkMDAsIDB4NjAxYSwgMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsCisJMHgwMDAwLCAweDA4MGMsIDB4NGMxZSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzMwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzA5NCwgMHg4MDAwLCAweDcwOTYsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDQsCisJMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsIDB4MmM2OCwgMHgyMDAxLCAweGFkNTYsCisJMHgyMDA0LCAweGEwODQsIDB4MDBmZiwgMHg2ODQyLCAweDA4MGMsIDB4OTgwNywgMHgwNTUwLCAweDJkMDAsCisJMHg2MDFhLCAweDY4MDAsIDB4YzBjNCwgMHg2ODAyLCAweDY4YTAsIDB4YTA4NiwgMHgwMDdlLCAweDAxNDAsCisJMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MTExMCwgMHgwODBjLCAweDJhZDksCisJMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDAxLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRjMWUsCisJMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0YzMwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwOTQsCisJMHg4MDAwLCAweDcwOTYsIDB4MDEyZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsCisJMHgwMDAxLCAweDAwY2UsIDB4MDBkZSwgMHgwMDdlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwMjYsCisJMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg0YzgwLCAweDExMjAsIDB4MDAzMSwgMHgwMTEwLCAweDcwZDcsCisJMHhmZmZmLCAweDAwMmUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMTYsIDB4MDA3NiwgMHgwMGQ2LCAweDAwYzYsCisJMHgyYzY4LCAweDA4MGMsIDB4ODAyMiwgMHgwMWQ4LCAweDJkMDAsIDB4NjAxYSwgMHgwODBjLCAweDk5NTYsCisJMHg2MDFmLCAweDAwMDEsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGMxZSwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDRjMzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzBkOCwgMHg4MDAwLCAweDcwZGEsCisJMHgwMTJlLCAweDIwMDksIDB4MDAwMiwgMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAwY2UsCisJMHgwMGRlLCAweDAwN2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwMDksIDB4MDA3ZiwgMHgwODBjLCAweDRjODAsIDB4MTE5MCwgMHgyYzY4LCAweDA4MGMsCisJMHg4MDIyLCAweDAxNzAsIDB4MmQwMCwgMHg2MDFhLCAweDYzMTIsIDB4NjAxZiwgMHgwMDAxLCAweDYyMGEsCisJMHgwODBjLCAweDk5NTYsIDB4MjAwOSwgMHgwMDIyLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LCAweDAwMDEsCisJMHgwMTJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMzYsCisJMHgwMDI2LCAweDA4MGMsIDB4NjhmMywgMHgwODBjLCAweDY4OWQsIDB4MDgwYywgMHg4YTE1LCAweDIxMzAsCisJMHg4MWZmLCAweDAxMjgsIDB4MjBhOSwgMHgwMDdlLCAweDIwMDksIDB4MDAwMCwgMHgwMDIwLCAweDIwYTksCisJMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsIDB4NGNkYywgMHgxMTIwLCAweDA4MGMsCisJMHg0ZWNmLCAweDA4MGMsIDB4NDkzYSwgMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHgyYWMzLCAweDg2ZmYsCisJMHgxMTEwLCAweDA4MGMsIDB4MTFkNCwgMHgwMDJlLCAweDAwM2UsIDB4MDA2ZSwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMjYsIDB4MDAxNiwgMHg2MjE4LCAweDIyNzAsCisJMHg3MmEwLCAweDAwMjYsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4NjhlNywgMHgwMDc2LCAweDIwMzksCisJMHgwMDAwLCAweDA4MGMsIDB4NjgxZCwgMHgyYzA4LCAweDA4MGMsIDB4YTcxMiwgMHgwMDdlLCAweDAwMWUsCisJMHgyZTYwLCAweDA4MGMsIDB4NGVjZiwgMHg2MjEwLCAweDYzMTQsIDB4MDgwYywgMHg0OTNhLCAweDYyMTIsCisJMHg2MzE2LCAweDAwMWUsIDB4MDAyZSwgMHgwMDNlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwZTYsCisJMHgwMDA2LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4NiwgMHgwMDgwLCAweDAxNTAsCisJMHgyMDcxLCAweGFkMDAsIDB4NzA5NCwgMHhhMDA1LCAweDAxMTAsIDB4ODAwMSwgMHg3MDk2LCAweDAwMGUsCisJMHgwMGVlLCAweDAwMDUsIDB4MjA3MSwgMHhhZDAwLCAweDcwZDgsIDB4YTAwNSwgMHgwZGMwLCAweDgwMDEsCisJMHg3MGRhLCAweDBjYTgsIDB4NjAwMCwgMHhjMDhjLCAweDYwMDIsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGM2LCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAxNTYsIDB4MjE3OCwgMHg4MWZmLCAweDExMTgsCisJMHgyMGE5LCAweDAwMDEsIDB4MDA5OCwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGM0LCAweDAxNTAsCisJMHhkMGE0LCAweDAxNDAsIDB4YTAwNiwgMHgwMDQ2LCAweDIwMjAsIDB4MjAwOSwgMHgwMDJkLCAweDA4MGMsCisJMHhhOTZjLCAweDAwNGUsIDB4MjBhOSwgMHgwMGZmLCAweDIwMTEsIDB4MDAwMCwgMHgwMDI2LCAweGEyOGUsCisJMHgwMDdlLCAweDA1YzgsIDB4YTI4ZSwgMHgwMDdmLCAweDA1YjAsIDB4YTI4ZSwgMHgwMDgwLCAweDA1OTgsCisJMHhhMjg4LCAweGFlMzQsIDB4MjEwYywgMHg4MWZmLCAweDA1NzAsIDB4OGZmZiwgMHgwNWMxLCAweDAwYzYsCisJMHgyMTYwLCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDUwMzcsIDB4MDBjZSwgMHgyMDE5LCAweDAwMjksCisJMHgwODBjLCAweDY4ZTcsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ODFkLCAweDAwYzYsCisJMHgwMDI2LCAweDIxNjAsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LCAweDExMTgsCisJMHg2MDA3LCAweDA0MDQsIDB4MDAyOCwgMHgyMDAxLCAweDAwMDQsIDB4ODAwNywgMHhhMjE1LCAweDYyMDYsCisJMHgwMDJlLCAweDAwY2UsIDB4MDAxNiwgMHgyYzA4LCAweDA4MGMsIDB4YTcxMiwgMHgwMDFlLCAweDAwN2UsCisJMHgyMTYwLCAweDA4MGMsIDB4NGVjZiwgMHgwMDJlLCAweDgyMTAsIDB4MWYwNCwgMHgyYjNlLCAweDAxNWUsCisJMHgwMDFlLCAweDAwMmUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwNDYsCisJMHgwMDI2LCAweDAwMTYsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTQ4LCAweGQwYTQsCisJMHgwMTM4LCAweGEwMDYsIDB4MjIyMCwgMHg4NDI3LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGE5NmMsCisJMHgwMDFlLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDA1LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwYzYsCisJMHg3Mjg0LCAweDgyZmYsIDB4MDFmOCwgMHgyMDExLCAweGFkNTIsIDB4MjIxNCwgMHhkMmFjLCAweDExZDAsCisJMHgyMTAwLCAweDA4MGMsIDB4MjY4YSwgMHg4MWZmLCAweDAxYjgsIDB4MjAxOSwgMHgwMDAxLCAweDgzMTQsCisJMHhhMmUwLCAweGIzYzAsIDB4MmMwNCwgMHhkMzg0LCAweDAxMjAsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsCisJMHgwMDEwLCAweGEwODQsIDB4MDBmZiwgMHhhMTE2LCAweDAxMzgsIDB4YTA5NiwgMHgwMGZmLCAweDAxMTAsCisJMHg4MzE4LCAweDBjNjgsIDB4YTA4NSwgMHgwMDAxLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwMTYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhMTgwLCAweGFlMzQsCisJMHgyMDA0LCAweGEwNjUsIDB4MDE3OCwgMHgwMDE2LCAweDAwYzYsIDB4MDgwYywgMHg5ODA3LCAweDAwMWUsCisJMHgwOTBjLCAweDE0ZjYsIDB4NjExYSwgMHgwODBjLCAweDJhZDksIDB4MDgwYywgMHg4MDc4LCAweDAwMWUsCisJMHgwODBjLCAweDRjOWYsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHg3ZWVmLCAweDdkZTgsCisJMHg3Y2U0LCAweDgwZTIsIDB4N2JlMSwgMHg4MGUwLCAweDgwZGMsIDB4ODBkYSwgMHg3YWQ5LCAweDgwZDYsCisJMHg4MGQ1LCAweDgwZDQsIDB4ODBkMywgMHg4MGQyLCAweDgwZDEsIDB4NzljZSwgMHg3OGNkLCAweDgwY2MsCisJMHg4MGNiLCAweDgwY2EsIDB4ODBjOSwgMHg4MGM3LCAweDgwYzYsIDB4NzdjNSwgMHg3NmMzLCAweDgwYmMsCisJMHg4MGJhLCAweDc1YjksIDB4ODBiNiwgMHg3NGI1LCAweDczYjQsIDB4NzJiMywgMHg4MGIyLCAweDgwYjEsCisJMHg4MGFlLCAweDcxYWQsIDB4ODBhYywgMHg3MGFiLCAweDZmYWEsIDB4NmVhOSwgMHg4MGE3LCAweDZkYTYsCisJMHg2Y2E1LCAweDZiYTMsIDB4NmE5ZiwgMHg2OTllLCAweDY4OWQsIDB4ODA5YiwgMHg4MDk4LCAweDY3OTcsCisJMHg2NjkwLCAweDY1OGYsIDB4NjQ4OCwgMHg2Mzg0LCAweDYyODIsIDB4ODA4MSwgMHg4MDgwLCAweDYxN2MsCisJMHg2MDdhLCAweDgwNzksIDB4NWY3NiwgMHg4MDc1LCAweDgwNzQsIDB4ODA3MywgMHg4MDcyLCAweDgwNzEsCisJMHg4MDZlLCAweDVlNmQsIDB4ODA2YywgMHg1ZDZiLCAweDVjNmEsIDB4NWI2OSwgMHg4MDY3LCAweDVhNjYsCisJMHg1OTY1LCAweDU4NjMsIDB4NTc1YywgMHg1NjVhLCAweDU1NTksIDB4ODA1NiwgMHg4MDU1LCAweDU0NTQsCisJMHg1MzUzLCAweDUyNTIsIDB4NTE1MSwgMHg1MDRlLCAweDRmNGQsIDB4ODA0YywgMHg4MDRiLCAweDRlNGEsCisJMHg0ZDQ5LCAweDgwNDcsIDB4NGM0NiwgMHg4MDQ1LCAweDgwNDMsIDB4ODAzYywgMHg4MDNhLCAweDgwMzksCisJMHg4MDM2LCAweDRiMzUsIDB4ODAzNCwgMHg0YTMzLCAweDQ5MzIsIDB4NDgzMSwgMHg4MDJlLCAweDQ3MmQsCisJMHg0NjJjLCAweDQ1MmIsIDB4NDQyYSwgMHg0MzI5LCAweDQyMjcsIDB4ODAyNiwgMHg4MDI1LCAweDQxMjMsCisJMHg0MDFmLCAweDNmMWUsIDB4M2UxZCwgMHgzZDFiLCAweDNjMTgsIDB4ODAxNywgMHg4MDEwLCAweDNiMGYsCisJMHgzYTA4LCAweDgwMDQsIDB4MzkwMiwgMHg4MDAxLCAweDgwMDAsIDB4ODAwMCwgMHgzODAwLCAweDM3MDAsCisJMHgzNjAwLCAweDgwMDAsIDB4MzUwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgzNDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzMwMCwgMHgzMjAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MzEwMCwgMHgzMDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDJmMDAsIDB4ODAwMCwgMHgyZTAwLCAweDJkMDAsIDB4MmMwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDJiMDAsIDB4ODAwMCwgMHgyYTAwLCAweDI5MDAsIDB4MjgwMCwgMHg4MDAwLCAweDI3MDAsCisJMHgyNjAwLCAweDI1MDAsIDB4MjQwMCwgMHgyMzAwLCAweDIyMDAsIDB4ODAwMCwgMHg4MDAwLCAweDIxMDAsCisJMHgyMDAwLCAweDFmMDAsIDB4MWUwMCwgMHgxZDAwLCAweDFjMDAsIDB4ODAwMCwgMHg4MDAwLCAweDFiMDAsCisJMHgxYTAwLCAweDgwMDAsIDB4MTkwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDE4MDAsIDB4ODAwMCwgMHgxNzAwLCAweDE2MDAsIDB4MTUwMCwgMHg4MDAwLCAweDE0MDAsCisJMHgxMzAwLCAweDEyMDAsIDB4MTEwMCwgMHgxMDAwLCAweDBmMDAsIDB4ODAwMCwgMHg4MDAwLCAweDBlMDAsCisJMHgwZDAwLCAweDBjMDAsIDB4MGIwMCwgMHgwYTAwLCAweDA5MDAsIDB4ODAwMCwgMHg4MDAwLCAweDA4MDAsCisJMHgwNzAwLCAweDgwMDAsIDB4MDYwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwNTAwLCAweDA0MDAsCisJMHgwMzAwLCAweDgwMDAsIDB4MDIwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgwMTAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4MDAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHgyMDcxLCAweGFkODEsCisJMHg3MDAzLCAweDAwMDIsIDB4YTAwNiwgMHg3MDEyLCAweDcwMTYsIDB4NzAzYSwgMHg3MDNlLCAweDcwMzMsCisJMHhhZDkxLCAweDcwMzcsIDB4YWQ5MSwgMHg3MDA3LCAweDAwMDEsIDB4MjA2MSwgMHhhZGQxLCAweDYwMDMsCisJMHgwMDAyLCAweDAwMDUsIDB4MTAwNCwgMHgyZDBjLCAweDBlMDQsIDB4MmQwYywgMHgyMDcxLCAweGFkODEsCisJMHgyYjc4LCAweDc4MTgsIDB4ZDA4NCwgMHgxMTQwLCAweDJhNjAsIDB4NzgyMCwgMHhhMDhlLCAweDAwNjksCisJMHgxOTA0LCAweDJkZjEsIDB4MDgwNCwgMHgyZDhhLCAweDAwMDUsIDB4MjA3MSwgMHhhZDgxLCAweDcwMDQsCisJMHgwMDAyLCAweDJkMTUsIDB4MmQxNiwgMHgyZDFmLCAweDJkMzAsIDB4MDAwNSwgMHgxMDA0LCAweDJkMWUsCisJMHgwZTA0LCAweDJkMWUsIDB4MmI3OCwgMHg3ODE4LCAweGQwODQsIDB4MDFlOCwgMHgwMDA1LCAweDJiNzgsCisJMHgyMDYxLCAweGFkZDEsIDB4NjAwOCwgMHhhMDhlLCAweDAxMDAsIDB4MDEyOCwgMHhhMDg2LCAweDAyMDAsCisJMHgwOTA0LCAweDJkZWIsIDB4MDAwNSwgMHg3MDE0LCAweDIwNjgsIDB4MmE2MCwgMHg3MDE4LCAweDA4MDcsCisJMHg3MDEwLCAweDIwNjgsIDB4NjgzNCwgMHhhMDg2LCAweDAxMDMsIDB4MDEwOCwgMHgwMDA1LCAweDJhNjAsCisJMHgyYjc4LCAweDcwMTgsIDB4MDgwNywgMHgyYTYwLCAweDc4MjAsIDB4YTA4YSwgMHgwMDQwLCAweDEyMTAsCisJMHg2MWMwLCAweDAwNDIsIDB4MjEwMCwgMHhhMDhhLCAweDAwM2YsIDB4MWEwNCwgMHgyZGU4LCAweDYxYzAsCisJMHgwODA0LCAweDJkOGEsIDB4MmRjYywgMHgyZGY3LCAweDJkZmYsIDB4MmUwMywgMHgyZTBiLCAweDJlMTEsCisJMHgyZTE1LCAweDJlMjEsIDB4MmUyNCwgMHgyZTJlLCAweDJlMzEsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsCisJMHgyZTM0LCAweDJkZTgsIDB4MmU0MywgMHgyZTVhLCAweDJlNzEsIDB4MmVlOCwgMHgyZWVkLCAweDJmMTYsCisJMHgyZjY3LCAweDJmNzgsIDB4MmY5NiwgMHgyZmNkLCAweDJmZDcsIDB4MmZlNCwgMHgyZmY3LCAweDMwMTgsCisJMHgzMDIxLCAweDMwNTcsIDB4MzA1ZCwgMHgyZGU4LCAweDMwODYsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsCisJMHgyZGU4LCAweDJkZTgsIDB4MzA4ZCwgMHgzMDk3LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsCisJMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LCAweDMwOWYsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsCisJMHgyZGU4LCAweDJkZTgsIDB4MzBiMSwgMHgzMGI5LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsCisJMHgyZGU4LCAweDJkZTgsIDB4MDAwMiwgMHgzMGNiLCAweDMxMWYsIDB4MzE3YSwgMHgzMThhLCAweDJkZTgsCisJMHgzMWE0LCAweDM1Y2IsIDB4M2ZiYiwgMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsCisJMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgyZTJlLCAweDJlMzEsIDB4MzVjZCwgMHgyZGU4LCAweDM1ZGEsCisJMHg0MDNjLCAweDQwOTcsIDB4NDBmYiwgMHgyZGU4LCAweDQxNWEsIDB4NDE4MCwgMHg0MTlmLCAweDJkZTgsCisJMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgzNWRlLCAweDM3NmIsIDB4Mzc4NSwgMHgzN2EzLCAweDM4MDQsCisJMHgzODU4LCAweDM4NjMsIDB4Mzg5YSwgMHgzOGE5LCAweDM4YjgsIDB4MzhiYiwgMHgzOGRlLCAweDM5MjgsCisJMHgzOThlLCAweDM5OWIsIDB4M2E5YywgMHgzYmIzLCAweDNiZGMsIDB4M2NkYSwgMHgzY2ZjLCAweDNkMDgsCisJMHgzZDQxLCAweDNlMDUsIDB4MmRlOCwgMHgyZGU4LCAweDJkZTgsIDB4MmRlOCwgMHgzZTZkLCAweDNlODgsCisJMHgzZWZhLCAweDNmYWMsIDB4NzEzYywgMHgwMDAwLCAweDIwMjEsIDB4NDAwMCwgMHgwODBjLCAweDNjMzksCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDJkZDgsIDB4NzgxOCwgMHhkMDg0LCAweDAxMTAsCisJMHgwMTJlLCAweDBjYjAsIDB4N2MyMiwgMHg3OTI2LCAweDdhMmEsIDB4N2IyZSwgMHg3ODFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4NzAwNywgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgwMTJlLCAweDAwMDUsCisJMHgyMDIxLCAweDQwMDEsIDB4MGMxOCwgMHgyMDIxLCAweDQwMDIsIDB4MGMwMCwgMHgyMDIxLCAweDQwMDMsCisJMHgwOGU4LCAweDIwMjEsIDB4NDAwNSwgMHgwOGQwLCAweDIwMjEsIDB4NDAwNiwgMHgwOGI4LCAweGEwMmUsCisJMHgyNTIwLCAweDdiMjgsIDB4N2EyYywgMHg3ODI0LCAweDc5MzAsIDB4MDgwNCwgMHgzYzQ2LCAweDc4MjMsCisJMHgwMDA0LCAweDc4MjQsIDB4MDgwNywgMHhhMDJlLCAweDI1MjAsIDB4N2IyOCwgMHg3YTJjLCAweDc4MjQsCisJMHg3OTMwLCAweDA4MDQsIDB4M2M0OSwgMHg3OTI0LCAweDc4MjgsIDB4MjExNCwgMHgyMDBhLCAweDA4MDQsCisJMHgyZGNjLCAweDc5MjQsIDB4MjExNCwgMHgwODA0LCAweDJkY2MsIDB4MjA5OSwgMHgwMDA5LCAweDIwYTEsCisJMHgwMDA5LCAweDIwYTksIDB4MDAwNywgMHg1M2EzLCAweDc5MjQsIDB4N2EyOCwgMHg3YjJjLCAweDA4MDQsCisJMHgyZGNjLCAweDc4MjQsIDB4MjA2MCwgMHgwMDkwLCAweDIwMDksIDB4MDAwMiwgMHgyMDExLCAweDAwMDEsCisJMHgyMDE5LCAweDAwMWIsIDB4NzgzYiwgMHgwMDE3LCAweDA4MDQsIDB4MmRjYywgMHg3ZDM4LCAweDdjM2MsCisJMHgwODQwLCAweDdkMzgsIDB4N2MzYywgMHgwODg4LCAweDIwNjEsIDB4MTAwMCwgMHhlMTBjLCAweGEwMDYsCisJMHgyYzE1LCAweGEyMDAsIDB4OGM2MCwgMHg4MTA5LCAweDFkZDgsIDB4MjAxMCwgMHhhMDA1LCAweDA5MDQsCisJMHgyZGNjLCAweDA4MDQsIDB4MmRlZSwgMHgyMDY5LCAweGFkNTEsIDB4NzgyNCwgMHg3OTMwLCAweGExMWEsCisJMHgxYTA0LCAweDJkZjQsIDB4ODAxOSwgMHgwOTA0LCAweDJkZjQsIDB4Njg0YSwgMHg2OTQyLCAweDc4MmMsCisJMHg2ODUyLCAweDc4MjgsIDB4Njg1NiwgMHhhMDA2LCAweDY4NWEsIDB4Njg1ZSwgMHgwODBjLCAweDVhMWMsCisJMHgwODA0LCAweDJkY2MsIDB4MjA2OSwgMHhhZDUxLCAweDc4MjQsIDB4NzkzNCwgMHhhMTFhLCAweDFhMDQsCisJMHgyZGY0LCAweDgwMTksIDB4MDkwNCwgMHgyZGY0LCAweDY4NGUsIDB4Njk0NiwgMHg3ODJjLCAweDY4NjIsCisJMHg3ODI4LCAweDY4NjYsIDB4YTAwNiwgMHg2ODZhLCAweDY4NmUsIDB4MDgwYywgMHg1MGQ5LCAweDA4MDQsCisJMHgyZGNjLCAweGEwMmUsIDB4MjUyMCwgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHg3OTI0LCAweDdiMjgsCisJMHg3YTJjLCAweDIwYTksIDB4MDAwNSwgMHgyMGExLCAweGFkODgsIDB4NDFhMSwgMHgwODBjLCAweDNjMDUsCisJMHgwOTA0LCAweDJkZjEsIDB4MjAwOSwgMHgwMDIwLCAweDA4MGMsIDB4M2M0NiwgMHg3MDFiLCAweDJlODksCisJMHgwMDA1LCAweDY4MzQsIDB4MjAwOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA5NiwgMHgwMDExLCAweDAxMjAsCisJMHhhMDk2LCAweDAwMTksIDB4MTkwNCwgMHgyZGYxLCAweDgxMGYsIDB4YTE4YywgMHgwMGZmLCAweDA5MDQsCisJMHgyZGYxLCAweDcxMGUsIDB4NzAwYywgMHg4MDAxLCAweDA1MjgsIDB4NzAwZSwgMHgwODBjLCAweDNjMDUsCisJMHgwOTA0LCAweDJkZjEsIDB4MjAwOSwgMHgwMDIwLCAweDIwNjEsIDB4YWRkMSwgMHg2MjI0LCAweDYzMjgsCisJMHg2NDJjLCAweDY1MzAsIDB4YTI5MCwgMHgwMDQwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLCAweDAwMDAsCisJMHhhNWE5LCAweDAwMDAsIDB4MDgwYywgMHgzYzQ2LCAweDcwMWIsIDB4MmViNywgMHgwMDA1LCAweDY4MzQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA5NiwgMHgwMDAyLCAweDAxMjAsIDB4YTA5NiwgMHgwMDBhLCAweDE5MDQsCisJMHgyZGYxLCAweDA4YzAsIDB4NzAxMCwgMHgyMDY4LCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDA4MGMsCisJMHg0YjdjLCAweDExMjgsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4MmVkMSwgMHgwMDA1LCAweDA4MGMsCisJMHg1MWRmLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwYTksIDB4MDAwNSwgMHgyMDk5LCAweGFkODgsCisJMHg1MzBhLCAweDIxMDAsIDB4YTIxMCwgMHhhMzk5LCAweDAwMDAsIDB4YTRhMSwgMHgwMDAwLCAweGE1YTksCisJMHgwMDAwLCAweGFkODAsIDB4MDAwZCwgMHgyMDA5LCAweDAwMjAsIDB4MDEyZSwgMHgwODA0LCAweDNjNDksCisJMHg2MWE4LCAweDc4MjQsIDB4NjBhYSwgMHgwODA0LCAweDJkY2MsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjMsCisJMHg0MDAwLCAweDc4MjcsIDB4NDk1MywgMHg3ODJiLCAweDUwMjAsIDB4NzgyZiwgMHgyMDIwLCAweDIwMDksCisJMHgwMTdmLCAweDIxMDQsIDB4NzgzMiwgMHgzZjAwLCAweDc4MzYsIDB4MjA2MSwgMHgwMTAwLCAweDYyMDAsCisJMHgyMDYxLCAweDAyMDAsIDB4NjAzYywgMHg4MDA3LCAweGEyMDUsIDB4NzgzYSwgMHgyMDA5LCAweDA0ZmQsCisJMHgyMTA0LCAweDc4M2UsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsCisJMHgyMDcxLCAweDAwMTAsIDB4MjBjMSwgMHgwMGYwLCAweDA4MDQsIDB4MDQyNywgMHg4MWZmLCAweDE5MDQsCisJMHgyZGYxLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0Y2RjLCAweDE5MDQsCisJMHgyZGY0LCAweDdlMzgsIDB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgwMjEwLCAweDA4MDQsCisJMHgyZGY0LCAweDdjMjgsIDB4N2QyYywgMHgwODBjLCAweDRlOTYsIDB4ZDI4YywgMHgxMTE4LCAweDA4MGMsCisJMHg0ZTQxLCAweDAwMTAsIDB4MDgwYywgMHg0ZTZmLCAweDE1MTgsIDB4MjA2MSwgMHhiNDAwLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDEwLCAweGEwNmQsCisJMHgwMTMwLCAweDY4M2MsIDB4YTQwNiwgMHgxMTE4LCAweDY4NDAsIDB4YTUwNiwgMHgwMTUwLCAweDAxMmUsCisJMHhhY2UwLCAweDAwMTgsIDB4MjAwMSwgMHhhZDE2LCAweDIwMDQsIDB4YWMwMiwgMHgxYTA0LCAweDJkZjEsCisJMHgwYzMwLCAweDA4MGMsIDB4OTI5YywgMHgwMTJlLCAweDA5MDQsIDB4MmRmMSwgMHgwODA0LCAweDJkY2MsCisJMHhhMDBlLCAweDIwMDEsIDB4MDAwNSwgMHgwODBjLCAweDUxZGYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDk4MDMsIDB4MDgwYywgMHg1MTBjLCAweDAxMmUsIDB4MDgwNCwgMHgyZGNjLCAweDgxZmYsCisJMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLCAweDRkOTYsCisJMHgwOTA0LCAweDJkZjEsIDB4MDgwYywgMHg0ZWEyLCAweDA5MDQsIDB4MmRmMSwgMHgwODA0LCAweDJkY2MsCisJMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDA4MGMsCisJMHg0ZjBkLCAweDA5MDQsIDB4MmRmMSwgMHgyMDE5LCAweDAwMDUsIDB4MDgwYywgMHg0ZWJkLCAweDA5MDQsCisJMHgyZGYxLCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MmRmNCwgMHg4MDAzLCAweDgwMGIsCisJMHg4MTBiLCAweGExMDgsIDB4MDgwYywgMHg2NTE5LCAweDA4MDQsIDB4MmRjYywgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDgxZmYsIDB4MDExOCwgMHgyMDA5LCAweDAwMDEsIDB4MDQ0OCwgMHgyMDI5LCAweDAwZmYsCisJMHg2NDRjLCAweDI0MDAsIDB4YTUwNiwgMHgwMWYwLCAweDI1MDgsIDB4MDgwYywgMHg0Y2RjLCAweDExZDAsCisJMHgwODBjLCAweDRmMGQsIDB4MTEyOCwgMHgyMDA5LCAweDAwMDIsIDB4NjJiMCwgMHgyNTE4LCAweDAwYjgsCisJMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHg0ZWJkLCAweDExMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwNzgsCisJMHg3ODI0LCAweGEwOGEsIDB4MTAwMCwgMHgxMjcwLCAweDgwMDMsIDB4ODAwYiwgMHg4MTBiLCAweGExMDgsCisJMHgwODBjLCAweDY1MTksIDB4ODUyOSwgMHgxYWU4LCAweDAxMmUsIDB4MDgwNCwgMHgyZGNjLCAweDAxMmUsCisJMHgwODA0LCAweDJkZjEsIDB4MDEyZSwgMHgwODA0LCAweDJkZjQsIDB4MDgwYywgMHgzYzFhLCAweDA5MDQsCisJMHgyZGY0LCAweDA4MGMsIDB4NGRmYywgMHgwODBjLCAweDRlOTYsIDB4MDgwNCwgMHgyZGNjLCAweDgxZmYsCisJMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLCAweDRkZWQsCisJMHgwODBjLCAweDRlOTYsIDB4MDgwNCwgMHgyZGNjLCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDA4MGMsCisJMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLCAweDRlNzEsIDB4MDkwNCwgMHgyZGYxLCAweDA4MGMsCisJMHg0YmMwLCAweDA4MGMsIDB4NGUzYSwgMHgwODBjLCAweDRlOTYsIDB4MDgwNCwgMHgyZGNjLCAweDA4MGMsCisJMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLCAweDRkOTYsIDB4MDkwNCwgMHgyZGYxLCAweDYyYTAsCisJMHgyMDE5LCAweDAwMDUsIDB4MDBjNiwgMHgwODBjLCAweDRlY2YsIDB4MjA2MSwgMHgwMDAwLCAweDA4MGMsCisJMHg2OGU3LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NjgxZCwgMHgyMDA5LCAweDAwMDAsCisJMHgwODBjLCAweGE3MTIsIDB4MDA3ZSwgMHgwMGNlLCAweDA4MGMsIDB4NGU5NiwgMHgwODA0LCAweDJkY2MsCisJMHgwODBjLCAweDNjMWEsIDB4MDkwNCwgMHgyZGY0LCAweDA4MGMsIDB4NGU5NiwgMHgyMjA4LCAweDA4MDQsCisJMHgyZGNjLCAweDAxNTYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjksIDB4YWUxMywgMHg2ODEwLCAweDY5MTQsCisJMHhhMTBhLCAweDEyMTAsIDB4MjAwOSwgMHgwMDAwLCAweDY4MTYsIDB4MjAxMSwgMHgwMDAwLCAweDIwMTksCisJMHgwMDAwLCAweDIwYTksIDB4MDA3ZSwgMHgyMDY5LCAweGFlMzQsIDB4MmQwNCwgMHhhMDc1LCAweDAxMzAsCisJMHg3MDRjLCAweDAwNzEsIDB4YTIxMCwgMHg3MDgwLCAweDAwNTksIDB4YTMxOCwgMHg4ZDY4LCAweDFmMDQsCisJMHgzMDM1LCAweDIzMDAsIDB4YTIxOCwgMHgwMGVlLCAweDAwZGUsIDB4MDE1ZSwgMHgwODA0LCAweDJkY2MsCisJMHgwMGY2LCAweDAwMTYsIDB4YTA3ZCwgMHgwMTQwLCAweDIwMDEsIDB4MDAwMCwgMHg4MDAwLCAweDJmMGMsCisJMHg4MWZmLCAweDAxMTAsIDB4MjE3OCwgMHgwY2QwLCAweDAwMWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwNjksCisJMHhhZTEzLCAweDY5MTAsIDB4NjJhYywgMHgwODA0LCAweDJkY2MsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsCisJMHg2MTRjLCAweGExOTAsIDB4MmJlNiwgMHgyMjE1LCAweGEyOTQsIDB4MDBmZiwgMHg2MzZjLCAweDgzZmYsCisJMHgwMTA4LCAweDYyNzAsIDB4NjdkMCwgMHhkNzljLCAweDAxMTgsIDB4MjAzMSwgMHgwMDAxLCAweDAwOTAsCisJMHhkN2FjLCAweDAxMTgsIDB4MjAzMSwgMHgwMDAzLCAweDAwNjgsIDB4ZDdhNCwgMHgwMTE4LCAweDIwMzEsCisJMHgwMDAyLCAweDAwNDAsIDB4MDgwYywgMHg1NzRmLCAweDExMTgsIDB4MjAzMSwgMHgwMDA0LCAweDAwMTAsCisJMHgyMDMxLCAweDAwMDAsIDB4N2UzYSwgMHg3ZjNlLCAweDA4MDQsIDB4MmRjYywgMHg2MTNjLCAweDYyNDAsCisJMHgyMDE5LCAweGFmYTMsIDB4MjMxYywgMHgwODA0LCAweDJkY2MsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MTM0LCAweGEwMDYsIDB4MjAxMCwgMHgyMDE4LCAweDAxMmUsIDB4MDgwNCwgMHgyZGNjLCAweDA4MGMsCisJMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHg2MjQ0LCAweDYzMzgsIDB4MDgwNCwgMHgyZGNjLCAweDYxM2MsCisJMHg2MjQwLCAweDc4MjQsIDB4NjAzZSwgMHg3YjI4LCAweDYzNDIsIDB4MjA2OSwgMHhhZDUxLCAweDgzMWYsCisJMHhhMzA1LCAweDY4MTYsIDB4NzgyYywgMHgyMDY5LCAweGFmYTMsIDB4MmQxYywgMHgyMDZhLCAweDA4MDQsCisJMHgyZGNjLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjQsIDB4NjAzNiwgMHgwMTJlLCAweDA4MDQsCisJMHgyZGNjLCAweDA4MGMsIDB4M2MyYSwgMHgwOTA0LCAweDJkZjQsIDB4NzgyOCwgMHhhMDBkLCAweDA5MDQsCisJMHgyZGY0LCAweDc4MmMsIDB4YTAwNSwgMHgwOTA0LCAweDJkZjQsIDB4NjI0NCwgMHg2MTQ2LCAweDYzMzgsCisJMHg2MDNhLCAweDA4MDQsIDB4MmRjYywgMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsCisJMHgxOTA0LCAweDJkZjEsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsCisJMHgwMGZmLCAweGExOTYsIDB4MDBmZiwgMHgxMTMwLCAweDIwMDEsIDB4YWQxNCwgMHgyMDA0LCAweGEwODUsCisJMHhmZjAwLCAweDAwNzgsIDB4YTE4MiwgMHgwMDdmLCAweDE2YTAsIDB4YTE4OCwgMHgyYmU2LCAweDIxMGQsCisJMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHhhZDE0LCAweDIwMDQsIDB4YTExNiwgMHgwNTUwLCAweDgxMGYsCisJMHhhMTA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwMDYsIDB4MDgwYywgMHg4MDIyLCAweDAwMGUsCisJMHgwMWUwLCAweDYwMWEsIDB4NjAwYiwgMHhiYzA5LCAweDYwMWYsIDB4MDAwMSwgMHgwODBjLCAweDNjMDUsCisJMHgwMWQ4LCAweDY4MzcsIDB4MDAwMCwgMHg3MDA3LCAweDAwMDMsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4NzAxYiwgMHgzMTczLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMzIsCisJMHgwODBjLCAweDgwYTcsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4MDEyZSwgMHgwMGNlLCAweDA4MDQsCisJMHgyZGYxLCAweDAwY2UsIDB4MDgwNCwgMHgyZGY0LCAweDA4MGMsIDB4ODA3OCwgMHgwY2IwLCAweDIwMDEsCisJMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDE5MDQsIDB4MmRmMSwgMHgwMGM2LCAweDIwNjEsCisJMHgwMTAwLCAweDc5MjQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMGZmLCAweDExMzAsCisJMHgyMDAxLCAweGFkMTQsIDB4MjAwNCwgMHhhMDg1LCAweGZmMDAsIDB4MDA3OCwgMHhhMTgyLCAweDAwN2YsCisJMHgxNmEwLCAweGExODgsIDB4MmJlNiwgMHgyMTBkLCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLCAweGFkMTQsCisJMHgyMDA0LCAweGExMTYsIDB4MDU1MCwgMHg4MTBmLCAweGExMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwMDA2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDBlLCAweDAxZTAsIDB4NjAxYSwgMHg2MDBiLCAweGJjMDUsCisJMHg2MDFmLCAweDAwMDEsIDB4MDgwYywgMHgzYzA1LCAweDAxZDgsIDB4NjgzNywgMHgwMDAwLCAweDcwMDcsCisJMHgwMDAzLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg3MDFiLCAweDMxNzMsCisJMHgyZDAwLCAweDYwMTIsIDB4MjAwOSwgMHgwMDMyLCAweDA4MGMsIDB4ODBhNywgMHgwMTJlLCAweDAwY2UsCisJMHgwMDA1LCAweDAxMmUsIDB4MDBjZSwgMHgwODA0LCAweDJkZjEsIDB4MDBjZSwgMHgwODA0LCAweDJkZjQsCisJMHgwODBjLCAweDgwNzgsIDB4MGNiMCwgMHg2ODMwLCAweGEwODYsIDB4MDEwMCwgMHgwOTA0LCAweDJkZjEsCisJMHgwODA0LCAweDJkY2MsIDB4MjA2MSwgMHhiMDQ4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDAsCisJMHhkMDg0LCAweDAxMjgsIDB4NjEwNCwgMHg2MjA4LCAweDAxMmUsIDB4MDgwNCwgMHgyZGNjLCAweDAxMmUsCisJMHgwODA0LCAweDJkZjQsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHg1NzRmLCAweDA5MDQsCisJMHgyZGYxLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYyNDQsIDB4NjA2NCwgMHhhMjAyLCAweDAyNDgsCisJMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHgyNmMwLCAweDA4MGMsIDB4NDM2ZSwgMHgwMTJlLCAweDA4MDQsCisJMHgyZGNjLCAweDAxMmUsIDB4MDgwNCwgMHgyZGY0LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDc4MjQsCisJMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHgzMWI2LCAweDMxYmYsIDB4MzFjNiwgMHgzMWIzLCAweDMxYjMsCisJMHgzMWIzLCAweDMxYjMsIDB4MzFiMywgMHgwMTJlLCAweDA4MDQsIDB4MmRmNCwgMHgyMDA5LCAweDAxMTQsCisJMHgyMTA0LCAweGEwODUsIDB4MDgwMCwgMHgyMDBhLCAweDA4MGMsIDB4MzMyZiwgMHgwMDcwLCAweDIwMDksCisJMHgwMTBiLCAweDIwMGIsIDB4MDAxMCwgMHgwODBjLCAweDMzMmYsIDB4MDAzOCwgMHg4MWZmLCAweDAxMjgsCisJMHgwMTJlLCAweDIwMjEsIDB4NDAwYiwgMHgwODA0LCAweDJkY2UsIDB4MDA4NiwgMHgwMDk2LCAweDAwYTYsCisJMHgwMGI2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDAwZjYsIDB4MjAwOSwgMHgwMTAxLCAweDIxMGMsCisJMHgwMDE2LCAweDIwMDEsIDB4MDEzOCwgMHgyMDBjLCAweDIwMDMsIDB4MDAwMSwgMHgwMDE2LCAweDIwMDEsCisJMHgwMDdhLCAweDIwMzQsIDB4MjAwMSwgMHgwMDdiLCAweDIwMmMsIDB4YTAwNiwgMHgyMDQ4LCAweDIwNTAsCisJMHgyMDU4LCAweDA4MGMsIDB4MzU3MCwgMHgwODBjLCAweDM0ZGEsIDB4YTAzZSwgMHgyNzIwLCAweDAwZjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MmQ2MCwgMHgyMDcxLCAweGIwMWUsIDB4MjA3OSwgMHgwMDIwLCAweDAwZDYsCisJMHgyMDY5LCAweDAwMDAsIDB4NjgyNCwgMHhkMGI0LCAweDAxNDAsIDB4MjAwMSwgMHgwMDdkLCAweDIwMDQsCisJMHg3ODNlLCAweDIwMDEsIDB4MDA3YywgMHgyMDA0LCAweDc4M2EsIDB4MDBkZSwgMHgyMDExLCAweDAwMDEsCisJMHgwODBjLCAweDM0ODYsIDB4MDgwYywgMHgzNDg2LCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDA4MGMsCisJMHgzM2Q1LCAweDA4MGMsIDB4MzRhZSwgMHgwODBjLCAweDM0MmIsIDB4MDgwYywgMHgzMzk0LCAweDA4MGMsCisJMHgzM2M1LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc4MjQsIDB4ZDA5NCwgMHgwNTMwLCAweDc4MTQsCisJMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEwLCAweDc4MTYsIDB4MjA3OSwgMHgwMTQwLCAweDA4MGMsCisJMHgzMzBkLCAweDExMTAsIDB4MDBmZSwgMHgwNDMwLCAweDc4MDQsIDB4ZDBkYywgMHgwZGMwLCAweDIwNzksCisJMHgwMTAwLCAweDc4MjcsIDB4MDA4NiwgMHg3ODE0LCAweGEwODQsIDB4MDE4NCwgMHhhMDg1LCAweDAwMzIsCisJMHg3ODE2LCAweDA4MGMsIDB4MzMwZCwgMHgxMTEwLCAweDAwZmUsIDB4MDBhMCwgMHg3ODI0LCAweGQwYmMsCisJMHgwZGMwLCAweDc4MjcsIDB4MDA4MCwgMHhhMDI2LCAweDdjMTYsIDB4NzgyNCwgMHhkMGFjLCAweDAxMzAsCisJMHg4YjU4LCAweDA4MGMsIDB4MzMxNywgMHgwMGZlLCAweDA4MDQsIDB4MzJkNywgMHgwMGZlLCAweDA4MGMsCisJMHgzMzBkLCAweDExNTAsIDB4ODk0OCwgMHgyMDAxLCAweDAwN2EsIDB4MjYwMiwgMHgyMDAxLCAweDAwN2IsCisJMHgyNTAyLCAweDA4MGMsIDB4MzMxNywgMHgwMDg4LCAweDg3ZmYsIDB4MDE0MCwgMHgyMDAxLCAweDAyMDEsCisJMHgyMDA0LCAweGEwMDUsIDB4MTkwNCwgMHgzMjExLCAweDg3MzksIDB4MDAzOCwgMHgyMDAxLCAweGFmZmQsCisJMHgyMDA0LCAweGEwODYsIDB4MDAwMCwgMHgxOTA0LCAweDMyMTEsIDB4MjAwMSwgMHgwMDMzLCAweDIwMDMsCisJMHgwMGY2LCAweDg2MzEsIDB4MTIwOCwgMHg4NTI5LCAweDI1MDAsIDB4YTYwNSwgMHgwOTA0LCAweDMyZDcsCisJMHg3ODI0LCAweGQwYmMsIDB4MDEyOCwgMHgyOTAwLCAweGFhMDUsIDB4YWIwNSwgMHgxOTA0LCAweDMyZDcsCisJMHg2MDMzLCAweDAwMGQsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsIDB4MDAwNCwgMHg3ODI0LCAweGQwYWMsCisJMHgxMTQ4LCAweDIwMDEsIDB4YWZmZCwgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsCisJMHgwMDA5LCAweDAwNDAsIDB4NjAyNywgMHgwMDAxLCAweDIwMDEsIDB4MDA3NSwgMHgyMDA0LCAweGEwMDUsCisJMHgwMTA4LCAweDYwMjYsIDB4MmMwMCwgMHg2MDFhLCAweDIwZTEsIDB4OTA0MCwgMHgyZDAwLCAweDY4MWEsCisJMHg2ODMzLCAweDAwMGQsIDB4NzgyNCwgMHhkMGE0LCAweDExODAsIDB4NjgyNywgMHgwMDAwLCAweDAwYzYsCisJMHgyMGE5LCAweDAwMDQsIDB4MjA2MSwgMHgwMDIwLCAweDYwMDMsIDB4MDAwOCwgMHgyMDAxLCAweDAyMDMsCisJMHgyMDA0LCAweDFmMDQsIDB4MzJhYywgMHgwMGNlLCAweDAwNDAsIDB4NjgyNywgMHgwMDAxLCAweDIwMDEsCisJMHgwMDc0LCAweDIwMDQsIDB4YTAwNSwgMHgwMTA4LCAweDY4MjYsIDB4MDBmNiwgMHgwMGM2LCAweDIwNzksCisJMHgwMTAwLCAweDIwNjEsIDB4MDAyMCwgMHg3ODI3LCAweDAwMDIsIDB4MjAwMSwgMHgwMDcyLCAweDIwMDQsCisJMHhhMDg0LCAweGZmZjgsIDB4NjAxYSwgMHgwMDA2LCAweDIwMDEsIDB4MDA3MywgMHgyMDA0LCAweDYwMWUsCisJMHg3OGM2LCAweDAwMGUsIDB4NzhjYSwgMHgwMGNlLCAweDAwZmUsIDB4MDgwNCwgMHgzMWVmLCAweDIwNjEsCisJMHgwMTAwLCAweDYwMjcsIDB4MDAwMiwgMHgwMDFlLCAweDYxZTIsIDB4MDAxZSwgMHg2MTA2LCAweDc4MjQsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAxODgsIDB4MjBlMSwgMHg5MDI4LCAweDYwNTAsCisJMHhhMDg0LCAweGY3ZWYsIDB4NjA1MiwgMHg2MDJmLCAweDAwMDAsIDB4NjAyYywgMHhjMGFjLCAweDYwMmUsCisJMHg2MDRiLCAweGY3ZjcsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgyOTA4LCAweDJhMTAsCisJMHgyYjE4LCAweDJiMDAsIDB4YWEwNSwgMHhhOTA1LCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMGJlLCAweDAwYWUsIDB4MDA5ZSwgMHgwMDhlLCAweDExMTgsIDB4MDEyZSwgMHgwODA0LCAweDJkY2MsCisJMHgwMTJlLCAweDIwMjEsIDB4NDAwYywgMHgwODA0LCAweDJkY2UsIDB4YTA4NSwgMHgwMDAxLCAweDFkMDQsCisJMHgzMzE2LCAweDIwOTEsIDB4NjAwMCwgMHg4NDIwLCAweGE0ODYsIDB4MDA2NCwgMHgwMDA1LCAweDIwMDEsCisJMHgwMTA1LCAweDIwMDMsIDB4MDAxMCwgMHgyMDAxLCAweDAwMzAsIDB4MjAwMywgMHgwMDA0LCAweDIwMDEsCisJMHgwMDIwLCAweDIwMDMsIDB4MDAwNCwgMHgyMDAxLCAweGFmZmQsIDB4MjAwMywgMHgwMDAwLCAweDIwMDEsCisJMHhiMDFlLCAweDIwMDMsIDB4MDAwMCwgMHgyMGUxLCAweGYwMDAsIDB4YTAyNiwgMHgwMDA1LCAweDAwZjYsCisJMHgyMDc5LCAweDAxMDAsIDB4MjAwMSwgMHhhZDE0LCAweDIwMGMsIDB4NzkzMiwgMHg3OTM2LCAweDA4MGMsCisJMHgyNmEwLCAweDc4NTAsIDB4YTA4NCwgMHgwOTgwLCAweGEwODUsIDB4MDAzMCwgMHg3ODUyLCAweDIwMTksCisJMHgwMWY0LCAweDgzMTksIDB4MWRmMCwgMHhhMDg0LCAweDA5ODAsIDB4Nzg1MiwgMHg3ODJjLCAweGMwYWQsCisJMHg3ODJlLCAweDIwYTksIDB4MDA0NiwgMHgxZDA0LCAweDMzNGIsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsCisJMHgzMzRiLCAweDc4NTAsIDB4YTA4NSwgMHgwNDAwLCAweDc4NTIsIDB4MjAwMSwgMHgwMDA5LCAweDIwMDQsCisJMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAxLCAweDExMTgsIDB4NzgyYywgMHhjMGFjLCAweDc4MmUsCisJMHg3ODRiLCAweGY3ZjcsIDB4Nzg0MywgMHgwMDkwLCAweDc4NDMsIDB4MDAxMCwgMHgyMGE5LCAweDAwMGUsCisJMHhlMDAwLCAweDFmMDQsIDB4MzM2OCwgMHg3ODUwLCAweGEwODUsIDB4MTQwMCwgMHg3ODUyLCAweDIwMTksCisJMHg2MWE4LCAweDc4NTQsIDB4ZTAwMCwgMHhlMDAwLCAweGQwOGMsIDB4MTExMCwgMHg4MzE5LCAweDFkYzgsCisJMHg3ODI3LCAweDAwNDgsIDB4Nzg1MCwgMHhhMDg1LCAweDA0MDAsIDB4Nzg1MiwgMHg3ODQzLCAweDAwNDAsCisJMHgyMDE5LCAweDAxZjQsIDB4ZTAwMCwgMHhlMDAwLCAweDgzMTksIDB4MWRlMCwgMHgyMDAxLCAweDAxNDAsCisJMHgyMDAzLCAweDAxMDAsIDB4NzgyNywgMHgwMDIwLCAweDc4NDMsIDB4MDAwMCwgMHgyMDAzLCAweDAwMDAsCisJMHg3ODI3LCAweDAwNDgsIDB4MDBmZSwgMHgwMDA1LCAweDc4MjQsIDB4ZDBhYywgMHgxMWM4LCAweDAwZjYsCisJMHgwMGU2LCAweDIwNzEsIDB4YWZmZCwgMHgyMDc5LCAweDAwMzAsIDB4MjAwMSwgMHgwMjAxLCAweDIwMDQsCisJMHhhMDA1LCAweDAxNjAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MTE0MCwgMHgwMDUxLCAweGQwYmMsCisJMHgwMTA4LCAweDg3MzgsIDB4NzAwMywgMHgwMDAzLCAweDc4MDMsIDB4MDAxOSwgMHgwMGVlLCAweDAwZmUsCisJMHgwMDA1LCAweDc4MGMsIDB4YTA4YywgMHgwMDcwLCAweDAxNzgsIDB4MjAwOSwgMHgwMDdhLCAweDI2MGEsCisJMHgyMDA5LCAweDAwN2IsIDB4MjUwYSwgMHhkMGI0LCAweDAxMDgsIDB4OGE1MCwgMHhkMGFjLCAweDAxMDgsCisJMHg4OTQ4LCAweGQwYTQsIDB4MDEwOCwgMHg4YjU4LCAweDAwMDUsIDB4MDBmNiwgMHgyMDc5LCAweDAyMDAsCisJMHg3ODFjLCAweGQwODQsIDB4MDE0MCwgMHgyMGUxLCAweDAwMDcsIDB4MjBlMSwgMHgyMDAwLCAweDIwMDEsCisJMHgwMjBhLCAweDIwMDQsIDB4MGNhOCwgMHgwMGZlLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweDAxMDAsCisJMHgyMDA5LCAweGFkMTQsIDB4MjEwYywgMHg3MTZlLCAweDcwNjMsIDB4MDEwMCwgMHg3MTY2LCAweDcxOWUsCisJMHg3MDZiLCAweDAwMDAsIDB4NzA3MywgMHgwODA5LCAweDcwNzcsIDB4MDAwOCwgMHg3MDc4LCAweGEwODAsCisJMHgwMTAwLCAweDcwN2EsIDB4NzA4MCwgMHg4MDAwLCAweDcwODIsIDB4NzA4NywgMHhhYWFhLCAweGEwMDYsCisJMHg3MDhhLCAweDcwOGUsIDB4NzA3ZSwgMHg3MGQ2LCAweDcwYWIsIDB4MDAzNiwgMHg3MGFmLCAweDk1ZDUsCisJMHg3MDI3LCAweDAwODAsIDB4NzAxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDMyLCAweDcwMTYsCisJMHgwODBjLCAweDM0YWUsIDB4MDgwYywgMHgzMzBkLCAweDExMTAsIDB4ODQyMSwgMHgwMDI4LCAweDcwMjQsCisJMHhkMGJjLCAweDBkYjAsIDB4NzAyNywgMHgwMDgwLCAweDAwZjYsIDB4MDBlNiwgMHgyMDcxLCAweGFmZmQsCisJMHgyMDc5LCAweDAwMzAsIDB4MDBkNiwgMHgyMDY5LCAweDAwMDAsIDB4NjgyNCwgMHhkMGI0LCAweDAxMjAsCisJMHg2ODNjLCAweDc4M2UsIDB4NjgzOCwgMHg3ODNhLCAweDAwZGUsIDB4MjAxMSwgMHgwMDExLCAweDA4MGMsCisJMHgzNDg2LCAweDIwMTEsIDB4MDAwMSwgMHgwODBjLCAweDM0ODYsIDB4MDBlZSwgMHgwMGZlLCAweDcwMTcsCisJMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MjA3MSwgMHhhZmZkLCAweDIwNzksCisJMHgwMDMwLCAweDc5MDQsIDB4ZDFmYywgMHgwOTA0LCAweDM0ODMsIDB4NzgwMywgMHgwMDAyLCAweGEwMjYsCisJMHhkMTljLCAweDE5MDQsIDB4MzQ3ZiwgMHg3MDAwLCAweDAwMDIsIDB4MzQ4MywgMHgzNDQxLCAweDM0NjUsCisJMHgzNDdmLCAweGQxYmMsIDB4MTE1MCwgMHhkMWRjLCAweDExNTAsIDB4ODAwMSwgMHg3MDAyLCAweDIwMTEsCisJMHgwMDAxLCAweDA0ZTEsIDB4MDVjMCwgMHgwNGQxLCAweDA0YjAsIDB4NzgwZiwgMHgwMDAwLCAweDc4MjAsCisJMHg3OTI0LCAweDc4MDMsIDB4MDAwNCwgMHg3ODIyLCAweDc5MjYsIDB4MjAwMSwgMHgwMjAxLCAweDIwMGMsCisJMHg4MWZmLCAweDBkZTgsIDB4MDgwYywgMHgzM2IxLCAweDIwMDksIDB4MDAwMSwgMHg3ODA4LCAweGQwZWMsCisJMHgwMTEwLCAweDIwMDksIDB4MDAxMSwgMHg3OTAyLCAweDAwZjAsIDB4ODAwMSwgMHg3MDAyLCAweGExODQsCisJMHgwODgwLCAweDExMzgsIDB4NzgwNCwgMHhkMGZjLCAweDE5NDAsIDB4MjAxMSwgMHgwMDAxLCAweDAwYjEsCisJMHgwMDkwLCAweDYwMzAsIDB4YTA5MiwgMHgwMDA0LCAweGEwODYsIDB4MDAwOSwgMHgxMTIwLCAweDYwMDAsCisJMHg2MDFhLCAweDIwMTEsIDB4MDAyNSwgMHg2MjMyLCAweGQxZGMsIDB4MTk4OCwgMHgwODcwLCAweDc4MDMsCisJMHgwMDA0LCAweDcwMDMsIDB4MDAwMCwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDI0LCAweGEwMDUsCisJMHgwNTIwLCAweDgwMDEsIDB4NjAyNiwgMHg2MDE4LCAweDYxMzAsIDB4YTE0MCwgMHgyODA0LCAweDc4MzIsCisJMHg4ODQwLCAweDI4MDQsIDB4NzgzNiwgMHg4ODQwLCAweDI4MDQsIDB4NzgyMiwgMHg4ODQwLCAweDI4MDQsCisJMHg3ODI2LCAweDg4NDAsIDB4N2EwMiwgMHg3MDAwLCAweDgwMDAsIDB4NzAwMiwgMHg2MDE4LCAweGE4MDIsCisJMHhhMDhhLCAweDAwMjksIDB4MTEzOCwgMHg2MDE4LCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweDYwMWEsCisJMHgyMDAxLCAweDAwMGQsIDB4NjAzMiwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGM2LCAweDIwNzEsIDB4YjAxZSwgMHgyMDc5LCAweDAwMjAsIDB4NzkwNCwgMHhkMWZjLCAweDAxZjAsCisJMHg3ODAzLCAweDAwMDIsIDB4MmQ2MCwgMHhhMDI2LCAweDcwMDAsIDB4MDAwMiwgMHgzNGQ2LCAweDM0YzEsCisJMHgzNGNkLCAweDgwMDEsIDB4NzAwMiwgMHhkMTljLCAweDExODgsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsCisJMHgzNDg2LCAweDAxNjAsIDB4MDgwYywgMHgzNDg2LCAweDAwNDgsIDB4ODAwMSwgMHg3MDAyLCAweDc4MDQsCisJMHhkMGZjLCAweDFkMzAsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4MzQ4NiwgMHgwMGNlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwYzYsIDB4MjA2MSwgMHgwMjAwLCAweDYwMWIsCisJMHgwMDA0LCAweDIwNjEsIDB4MDEwMCwgMHg2MGNmLCAweDA0MDAsIDB4NjAwNCwgMHhjMGFjLCAweGEwODUsCisJMHgwMjAwLCAweDYwMDYsIDB4MjAwMSwgMHgwMDc0LCAweDIwMDQsIDB4YTAwNSwgMHgwMWY4LCAweDIwMzgsCisJMHgyMDAxLCAweDAwNzYsIDB4MjAyNCwgMHgyMDAxLCAweDAwNzcsIDB4MjAxYywgMHgwODBjLCAweDNjMDUsCisJMHg2ODMzLCAweDAwMGQsIDB4NmYyNiwgMHgyZDAwLCAweDY4MWEsIDB4YTc4YSwgMHgwMDA3LCAweDAyMjAsCisJMHgyMTM4LCAweDIwMDksIDB4MDAwNywgMHgwMDEwLCAweDI3MDgsIDB4YTAzZSwgMHg2ODE4LCAweGEwODAsCisJMHgwMDBkLCAweDA0YTEsIDB4MWQ5MCwgMHgyZDAwLCAweDY4MWEsIDB4MDA4OCwgMHgwODBjLCAweDNjMDUsCisJMHg2ODMzLCAweDAwMGQsIDB4MjA3MCwgMHg2ODI3LCAweDAwMDEsIDB4MmQwMCwgMHg2ODFhLCAweDIwMDEsCisJMHgwMDc2LCAweDIwMDQsIDB4MjA3MiwgMHgyMDAxLCAweDAwNzcsIDB4MjAwNCwgMHg3MDA2LCAweDIwNjEsCisJMHgwMDIwLCAweDIwNzksIDB4MDEwMCwgMHg2MDEzLCAweDA0MDAsIDB4MjBlMSwgMHg5MDQwLCAweDIwMDEsCisJMHgwMDcyLCAweDIwMDQsIDB4YTA4NCwgMHhmZmY4LCAweDcwMGEsIDB4NjAxYSwgMHgwMDA2LCAweDIwMDEsCisJMHgwMDczLCAweDIwMDQsIDB4NzAwZSwgMHg2MDFlLCAweDc4YzYsIDB4MDAwZSwgMHg3OGNhLCAweGEwMDYsCisJMHg2MDNhLCAweDYwM2UsIDB4MDBjZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHgwMDEwLCAweDIwYTAsIDB4MjA5OSwgMHgwMDE0LCAweDcwMDMsIDB4MDAyNiwgMHg3NDMyLCAweDczMzYsCisJMHhhMDA2LCAweDcwM2EsIDB4NzAzZSwgMHg4MTBiLCAweDgxMGIsIDB4MjFhOCwgMHg4MTBiLCAweDcxMjIsCisJMHg3MDAzLCAweDAwNDEsIDB4NzAwNCwgMHhkMGZjLCAweDBkZTgsIDB4NzAwMywgMHgwMDAyLCAweDcwMDMsCisJMHgwMDQwLCAweDUzYTUsIDB4NzQzMCwgMHg3MzM0LCAweDg3ZmYsIDB4MDE4MCwgMHgwMGM2LCAweDAwZDYsCisJMHgyZDYwLCAweDAwYzYsIDB4MDgwYywgMHgzYzA1LCAweDAwY2UsIDB4NjAxOCwgMHgyMDcwLCAweDJkMDAsCisJMHg3MDA2LCAweDYwMWEsIDB4MDBkZSwgMHgwMGNlLCAweGEwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwMDEsIDB4MDA3NSwgMHgyMDA0LCAweGEwMDUsIDB4MDUwOCwgMHgyMDM4LCAweDIwMDEsCisJMHgwMDc4LCAweDIwMjQsIDB4MjAwMSwgMHgwMDc5LCAweDIwMWMsIDB4MDgwYywgMHgzYzA1LCAweDJkNjAsCisJMHg2ODMzLCAweDAwMGQsIDB4NmYyNiwgMHgyZDAwLCAweDY4MWEsIDB4YTc4YSwgMHgwMDA3LCAweDAyMjAsCisJMHgyMTM4LCAweDIwMDksIDB4MDAwNywgMHgwMDEwLCAweDI3MDgsIDB4YTAzZSwgMHg2ODE4LCAweGEwODAsCisJMHgwMDBkLCAweDA4MGMsIDB4MzUzZSwgMHgxZDg4LCAweDJkMDAsIDB4NjgxYSwgMHgwMGUwLCAweDA4MGMsCisJMHgzYzA1LCAweDJkNjAsIDB4NjAzMywgMHgwMDBkLCAweDIwNzAsIDB4NjAyNywgMHgwMDAxLCAweDJjMDAsCisJMHg2MDFhLCAweDIwMDEsIDB4MDA3OCwgMHgyMDA0LCAweDIwNzIsIDB4MjAwMSwgMHgwMDc5LCAweDIwMDQsCisJMHg3MDA2LCAweDIwMDEsIDB4MDA3MiwgMHgyMDA0LCAweGEwODQsIDB4ZmZmOCwgMHg3MDBhLCAweDIwMDEsCisJMHgwMDczLCAweDIwMDQsIDB4NzAwZSwgMHgyMDAxLCAweDAwMzAsIDB4MjAwMywgMHgwMDA0LCAweDc4MjQsCisJMHhkMGFjLCAweDExNzgsIDB4MjAwMSwgMHgwMTAxLCAweDIwMGMsIDB4YzFlZCwgMHgyMTAyLCAweDYwMjcsCisJMHgwMDAwLCAweDIwMDEsIDB4YWZmZCwgMHgyMDAzLCAweDAwMDMsIDB4MjAwMSwgMHgwMDMwLCAweDIwMDMsCisJMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgwODA0LCAweDJkY2MsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMGE5LCAweDAwMTEsIDB4MjAwMSwgMHhhZDQwLCAweDIwYTAsIDB4YTAwNiwgMHg0MGE0LCAweDAxMmUsCisJMHgwODA0LCAweDJkY2MsIDB4N2QzOCwgMHg3YzNjLCAweDA4MDQsIDB4MmU3MywgMHgwODBjLCAweDNjMDUsCisJMHgwOTA0LCAweDJkZjEsIDB4MDgwYywgMHg1NzRmLCAweDAxMTAsIDB4MDgwYywgMHg0OTFmLCAweDIwMDksCisJMHgwMDFjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwYywgMHgzYzQ2LCAweDcwMWIsCisJMHgzNWYyLCAweDAwMDUsIDB4YWRlOCwgMHgwMDBkLCAweDY4MDAsIDB4YTAwNSwgMHgwOTA0LCAweDJkZjQsCisJMHg2ODA0LCAweGQwYWMsIDB4MDExOCwgMHhkMGE0LCAweDA5MDQsIDB4MmRmNCwgMHhkMDk0LCAweDAwYzYsCisJMHgyMDYxLCAweDAxMDAsIDB4NjEwNCwgMHgwMTM4LCAweDYyMDAsIDB4YTI5MiwgMHgwMDA1LCAweDAyMTgsCisJMHhhMThjLCAweGZmZGYsIDB4MDAxMCwgMHhhMThkLCAweDAwMjAsIDB4NjEwNiwgMHgwMGNlLCAweGQwOGMsCisJMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MTA0LCAweDAxMTgsIDB4YTE4ZCwgMHgwMDEwLCAweDAwMTAsCisJMHhhMThjLCAweGZmZWYsIDB4NjEwNiwgMHgwMGNlLCAweDIwMDksIDB4MDEwMCwgMHgyMTBjLCAweGExOGEsCisJMHgwMDAyLCAweDAyNjgsIDB4ZDA4NCwgMHgwMTU4LCAweDZhMjgsIDB4YTI4YSwgMHgwMDdmLCAweDFhMDQsCisJMHgyZGY0LCAweGEyODgsIDB4MmJlNiwgMHgyMTBkLCAweGExOGMsIDB4MDBmZiwgMHg2MTU2LCAweGQwZGMsCisJMHgwMTMwLCAweDY4MjgsIDB4YTA4YSwgMHgwMDdmLCAweDFhMDQsIDB4MmRmNCwgMHg2MDRlLCAweDY4MDgsCisJMHhhMDhhLCAweDAxMDAsIDB4MGEwNCwgMHgyZGY0LCAweGEwOGEsIDB4MDg0MSwgMHgxYTA0LCAweDJkZjQsCisJMHhhMDg0LCAweDAwMDcsIDB4MTkwNCwgMHgyZGY0LCAweDY4MGMsIDB4YTAwNSwgMHgwOTA0LCAweDJkZjQsCisJMHg2ODEwLCAweGEwMDUsIDB4MDkwNCwgMHgyZGY0LCAweDY4NDgsIDB4Njk0MCwgMHhhMTBhLCAweDFhMDQsCisJMHgyZGY0LCAweDgwMDEsIDB4MDkwNCwgMHgyZGY0LCAweDY4NGMsIDB4Njk0NCwgMHhhMTBhLCAweDFhMDQsCisJMHgyZGY0LCAweDgwMDEsIDB4MDkwNCwgMHgyZGY0LCAweDY4MDQsIDB4ZDBmYywgMHgwNTYwLCAweDA4MGMsCisJMHgzYzA1LCAweDA5MDQsIDB4MmRmMSwgMHgyMDA5LCAweDAwMTQsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsCisJMHg3ZDM4LCAweGEyOTAsIDB4MDAzOCwgMHhhMzk5LCAweDAwMDAsIDB4MDgwYywgMHgzYzQ2LCAweDcwMWIsCisJMHgzNjcyLCAweDAwMDUsIDB4YWRlOCwgMHgwMDBkLCAweDIwYTksIDB4MDAxNCwgMHgyZDk4LCAweDIwNjksCisJMHhhZDZkLCAweDJkYTAsIDB4NTNhMywgMHg3MDEwLCAweGEwZTgsIDB4MDAwZCwgMHgyMDAxLCAweGFkNzEsCisJMHgyMDBjLCAweGQxZTQsIDB4MDE0MCwgMHgwMGM2LCAweDIwNjEsIDB4MDEwMCwgMHg2MDA0LCAweGEwODUsCisJMHgwYjAwLCAweDYwMDYsIDB4MDBjZSwgMHgyMGE5LCAweDAwMWMsIDB4MmQ5OCwgMHgyMDY5LCAweGFkNTEsCisJMHgyZGEwLCAweDUzYTMsIDB4NjgxNCwgMHhhMDhjLCAweDAwZmYsIDB4NjEzZSwgMHg4MDA3LCAweGEwODQsCisJMHgwMGZmLCAweDYwNDIsIDB4MDgwYywgMHg1YTFjLCAweDA4MGMsIDB4NTA3MCwgMHgwODBjLCAweDUwZDksCisJMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgxOTA0LCAweDM3NTUsIDB4NjgwOCwgMHg2MDJhLCAweDA4MGMsCisJMHgyMmY4LCAweDAwMDYsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwMGUsCisJMHgwMjY4LCAweDIwMDksIDB4MDE3MCwgMHgyMDBiLCAweDAwODAsIDB4ZTAwMCwgMHhlMDAwLCAweDIwMGIsCisJMHgwMDAwLCAweDAwMzYsIDB4NmIwOCwgMHgwODBjLCAweDI2ZmIsIDB4MDAzZSwgMHg2ODE4LCAweDY5MWMsCisJMHg2YTIwLCAweDZiMjQsIDB4ODAwNywgMHg4MTBmLCAweDgyMTcsIDB4ODMxZiwgMHg2MDE2LCAweDYxMWEsCisJMHg2MjFlLCAweDYzMjIsIDB4NmMwNCwgMHhkNGY0LCAweDAxNDgsIDB4NjgzMCwgMHg2OTM0LCAweDZhMzgsCisJMHg2YjNjLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsIDB4MDAxMCwgMHhhMDg0LCAweGYwZmYsCisJMHg2MDA2LCAweDYxMGEsIDB4NjIwZSwgMHg2MzEyLCAweDgwMDcsIDB4ODEwZiwgMHg4MjE3LCAweDgzMWYsCisJMHgyMGE5LCAweDAwMDQsIDB4MjBhMSwgMHhhZmFkLCAweDQwYTEsIDB4MDgwYywgMHg2NTljLCAweDY5MDQsCisJMHhkMWZjLCAweDA1MjAsIDB4MDBjNiwgMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwMDAxLCAweDZiNzAsCisJMHhkMzg0LCAweDAxYzgsIDB4MDAyMCwgMHg4MzlkLCAweDEyYjAsIDB4MzUwOCwgMHg4MTA5LCAweDA4MGMsCisJMHg1ZmE5LCAweDY4NzgsIDB4NjAxNiwgMHg2ODc0LCAweDIwMDgsIDB4YTA4NCwgMHhmZjAwLCAweDgwMDcsCisJMHg2MDBhLCAweGExODQsIDB4MDBmZiwgMHg2MDA2LCAweDgxMDgsIDB4MTExOCwgMHg2MDAzLCAweDAwMDMsCisJMHgwMDEwLCAweDYwMDMsIDB4MDAwMSwgMHgxZjA0LCAweDM2ZjMsIDB4MDBjZSwgMHgyMDY5LCAweGFkNTEsCisJMHgyMDAxLCAweGFmOWQsIDB4NmE4MCwgMHhhMjk0LCAweDAwMzAsIDB4YTI4ZSwgMHgwMDAwLCAweDAxNzAsCisJMHhhMjhlLCAweDAwMTAsIDB4MDExOCwgMHhhMjhlLCAweDAwMjAsIDB4MDE0MCwgMHgyMDAzLCAweGFhYWEsCisJMHgwODBjLCAweDI3NDQsIDB4MjAwMSwgMHhhZjhlLCAweDIxMDIsIDB4MDAwOCwgMHgyMTAyLCAweDAwYzYsCisJMHgyMDYxLCAweDAxMDAsIDB4NjAyZiwgMHgwMDQwLCAweDYwMmYsIDB4MDAwMCwgMHgwMGNlLCAweDA4MGMsCisJMHg1NzRmLCAweDAxMjgsIDB4MDgwYywgMHgzZTVmLCAweDAxMTAsIDB4MDgwYywgMHgyNmMwLCAweDYwYzQsCisJMHhhMDA1LCAweDAxYjAsIDB4NjAwMywgMHgwMDAxLCAweDIwMDksIDB4MzczZiwgMHgwMGMwLCAweDA4MGMsCisJMHg1NzRmLCAweDExNTgsIDB4MjAxMSwgMHg1NjZlLCAweDA4MGMsIDB4NjUwZCwgMHgyMDAxLCAweGFmOWUsCisJMHgyMDAzLCAweDAwMDAsIDB4MDgwYywgMHg1NjlhLCAweDAwNDAsIDB4MDgwYywgMHg0ODVlLCAweDAwMjgsCisJMHg2MDAzLCAweDAwMDQsIDB4MjAwOSwgMHgzNzU1LCAweDAwMTAsIDB4MDgwNCwgMHgyZGNjLCAweDIwMDEsCisJMHgwMTAwLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAyNTgsIDB4MjAwMSwgMHgwMTcwLCAweDIwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDRjLCAweDExMTgsIDB4MjA5MSwgMHgzMDlkLCAweDA4MTcsCisJMHgyMDkxLCAweDMwMWQsIDB4MDgxNywgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwOTA0LCAweDJkZjEsCisJMHgyMDY5LCAweGFkNTEsIDB4NzgzMCwgMHg2ODQyLCAweDc4MzQsIDB4Njg0NiwgMHg2ODA0LCAweGQwZmMsCisJMHgwMTE4LCAweDIwMDksIDB4MDAzMCwgMHgwMDEwLCAweDIwMDksIDB4MDAxYywgMHgyZDAwLCAweDdhMmMsCisJMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LCAweDNjNDksIDB4YTAwNiwgMHgwODBjLCAweDI2YzAsCisJMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDU3NGYsIDB4MTE3OCwgMHgyMDAxLCAweGFmOWUsCisJMHgyMDAzLCAweDAwMDEsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LCAweDAwMDEsCisJMHgwODBjLCAweDU3OTMsIDB4MDgwYywgMHg1NjlhLCAweDAwMjAsIDB4MDgwYywgMHg0OTFmLCAweDA4MGMsCisJMHg0ODVlLCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDU3NGYsCisJMHgxMTEwLCAweDA4MDQsIDB4MmRmMSwgMHg2MTg0LCAweDgxZmYsIDB4MDE5OCwgMHg3MDNmLCAweDAwMDAsCisJMHgyMDAxLCAweGIzYzAsIDB4MjAwOSwgMHgwMDQwLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDNjNDksIDB4NzAxYiwgMHgyZGNhLCAweDAxMmUsCisJMHgwMDA1LCAweDcwM2YsIDB4MDAwMSwgMHgwMGQ2LCAweDIwNjksIDB4YjNjMCwgMHgyMGE5LCAweDAwNDAsCisJMHgyMGExLCAweGIzYzAsIDB4MjAxOSwgMHhmZmZmLCAweDQzYTQsIDB4NjU0YywgMHhhNTg4LCAweDJiZTYsCisJMHgyMTBkLCAweGExOGMsIDB4MDBmZiwgMHgyMTZhLCAweGEwMGUsIDB4MjAxMSwgMHgwMDAyLCAweDIxMDAsCisJMHhhNTA2LCAweDAxYTgsIDB4MDgwYywgMHg0Y2RjLCAweDExOTAsIDB4NjAxNCwgMHg4MjFjLCAweDAyMzgsCisJMHhhMzk4LCAweGIzYzAsIDB4YTA4NSwgMHhmZjAwLCAweDgwMDcsIDB4MjAxYSwgMHgwMDM4LCAweGEzOTgsCisJMHhiM2MwLCAweDIzMjQsIDB4YTRhNCwgMHhmZjAwLCAweGE0MDUsIDB4MjAxYSwgMHg4MjEwLCAweDgxMDgsCisJMHhhMTgyLCAweDAwODAsIDB4MTIwOCwgMHgwYzE4LCAweDgyMDEsIDB4ODAwNywgMHgyZDBjLCAweGExMDUsCisJMHgyMDZhLCAweDAwZGUsIDB4MjBhOSwgMHgwMDQwLCAweDIwYTEsIDB4YjNjMCwgMHgyMDk5LCAweGIzYzAsCisJMHgwODBjLCAweDQ4YmUsIDB4MDgwNCwgMHgzN2IwLCAweDA4MGMsIDB4M2MyYSwgMHgwOTA0LCAweDJkZjQsCisJMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwMGNlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgyZGYxLCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LCAweGQwYjQsIDB4MDFmMCwgMHg2MDAwLCAweGQwOGMsCisJMHgxMWQ4LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxMWE4LCAweDY4MzcsCisJMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDA4MGMsIDB4OTcwYiwgMHgxMTIwLCAweDIwMDksCisJMHgwMDAzLCAweDA4MDQsIDB4MmRmMSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzODMwLCAweDAwMDUsCisJMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDIwYTksIDB4MDAyYiwgMHgyYzk4LCAweGFkZTgsCisJMHgwMDAyLCAweDJkYTAsIDB4NTNhMywgMHgyMGE5LCAweDAwMDQsIDB4YWM4MCwgMHgwMDA2LCAweDIwOTgsCisJMHhhZDgwLCAweDAwMDYsIDB4MjBhMCwgMHgwODBjLCAweDQ4YmUsIDB4MjBhOSwgMHgwMDA0LCAweGFjODAsCisJMHgwMDBhLCAweDIwOTgsIDB4YWQ4MCwgMHgwMDBhLCAweDIwYTAsIDB4MDgwYywgMHg0OGJlLCAweDJkMDAsCisJMHgyMDA5LCAweDAwMmIsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LCAweDNjNDksCisJMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMWEsIDB4MDkwNCwgMHgyZGY0LCAweDA4MGMsCisJMHg0ZWFiLCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHg3ODI4LCAweGEwOGEsCisJMHgxMDAwLCAweDFhMDQsIDB4MmRmNCwgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDA4MGMsCisJMHg0ZjBkLCAweDA5MDQsIDB4MmRmMSwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHg0ZWJkLCAweDc5MjQsCisJMHg4MTBmLCAweDdhMjgsIDB4MDAxMSwgMHgwODA0LCAweDJkY2MsIDB4YTE4NiwgMHgwMGZmLCAweDAxMTAsCisJMHgwMDcxLCAweDAwNjAsIDB4MjAyOSwgMHgwMDdlLCAweDIwNjEsIDB4YWQwMCwgMHg2NDRjLCAweDI0MDAsCisJMHhhNTA2LCAweDAxMTAsIDB4MjUwOCwgMHgwMDE5LCAweDg1MjksIDB4MWVjOCwgMHgwMDA1LCAweDA4MGMsCisJMHg0Y2RjLCAweDExMzgsIDB4MjIwMCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDA4MGMsCisJMHg2NTE5LCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzFhLCAweDA5MDQsCisJMHgyZGY0LCAweDA4MGMsIDB4NGQ5NiwgMHgwOTA0LCAweDJkZjEsIDB4MDgwYywgMHg0ZWI0LCAweDA4MDQsCisJMHgyZGNjLCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4M2MxYSwgMHgwOTA0LCAweDJkZjQsCisJMHgwODBjLCAweDRkOTYsIDB4MDkwNCwgMHgyZGYxLCAweDA4MGMsIDB4NGVhMiwgMHgwODA0LCAweDJkY2MsCisJMHg2MTAwLCAweDA4MDQsIDB4MmRjYywgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDIwMDEsCisJMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDE5MDQsIDB4MmRmMSwgMHgwMGQ2LCAweGFjZTgsCisJMHgwMDBhLCAweDc5MjQsIDB4ZDE4NCwgMHgwMTEwLCAweGFjZTgsIDB4MDAwNiwgMHg2ODBjLCAweDgwMDcsCisJMHg3ODNlLCAweDY4MDgsIDB4ODAwNywgMHg3ODNhLCAweDZiMDQsIDB4ODMxZiwgMHg2YTAwLCAweDgyMTcsCisJMHgwMGRlLCAweDYxMDAsIDB4YTE4YywgMHgwMjAwLCAweDA4MDQsIDB4MmRjYywgMHg3ODI0LCAweGEwOWMsCisJMHgwMGZmLCAweGEzOWEsIDB4MDAwMywgMHgxYTA0LCAweDJkZjEsIDB4NjI0YywgMHhhMjk0LCAweDAwZmYsCisJMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMjA2LCAweDExNTAsIDB4MjAwMSwgMHhhZDQwLCAweDIwMDksCisJMHgwMDBjLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzYzQ5LCAweDgxZmYsCisJMHgxOTA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxOTA0LCAweDJkZjEsIDB4MDBjNiwgMHgwODBjLCAweDNjMDUsCisJMHgwMGNlLCAweDA5MDQsIDB4MmRmMSwgMHg2ODM3LCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweDY4M2EsCisJMHgwODBjLCAweDk2YjcsIDB4MDkwNCwgMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDM5MTksCisJMHgwMDA1LCAweDY4MzAsIDB4YTA4NiwgMHgwMTAwLCAweDA5MDQsIDB4MmRmMSwgMHhhZDgwLCAweDAwMGUsCisJMHgyMDA5LCAweDAwMGMsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODA0LCAweDNjNDksCisJMHhhMDA2LCAweDA4MGMsIDB4MjZjMCwgMHg3ODI0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwZmYsCisJMHgwMTE4LCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDA4MGMsIDB4NTc0ZiwgMHgwMTEwLCAweDA4MGMsCisJMHg0OTFmLCAweDc4MjgsIDB4YTA4YSwgMHgxMDAwLCAweDFhMDQsIDB4MmRmNCwgMHg3OTI0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMGZmLCAweDAxMzgsIDB4YTE4MiwgMHgwMDdmLCAweDFhMDQsCisJMHgyZGY0LCAweDIxMDAsIDB4MDgwYywgMHgyNjhhLCAweDAwMjYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNjEsIDB4YWZkYSwgMHg2MDFiLCAweDAwMDAsIDB4NjAxZiwgMHgwMDAwLCAweDA4MGMsCisJMHg1NzRmLCAweDExNzgsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGFkMDAsCisJMHgyMDAzLCAweDAwMDEsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4NTc5MywgMHgwODBjLCAweDU2OWEsCisJMHgwMGEwLCAweDIwNjEsIDB4MDEwMCwgMHgyMDAxLCAweGFkMTQsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsCisJMHg4MTBmLCAweGExMDUsIDB4NjA0YSwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDIwMDksCisJMHgwMDJkLCAweDIwMTEsIDB4NDg4MywgMHgwODBjLCAweDY1OTMsIDB4NzkyNCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTEwLCAweDIwMDksIDB4MDBmZiwgMHg3YTI4LCAweDA4MGMsCisJMHgzODdkLCAweDAxMmUsIDB4MDBjZSwgMHgwMDJlLCAweDA4MDQsIDB4MmRjYywgMHg3OTI0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4MDBjNiwgMHgwODBjLCAweDRjODAsIDB4MmMwOCwgMHgwMGNlLCAweDE5MDQsCisJMHgyZGY0LCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsCisJMHgyZGYxLCAweDYwZDAsIDB4ZDBhYywgMHgxMTMwLCAweGQwOWMsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDUsCisJMHgwODA0LCAweDJkZjEsIDB4MDgwYywgMHgzYzA1LCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgyZGYxLCAweDc5MjQsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsIDB4N2QzOCwgMHgwODBjLCAweDNjNDYsCisJMHg3MDFiLCAweDM5YmIsIDB4MDAwNSwgMHgyMDA5LCAweDAwODAsIDB4MDgwYywgMHg0Y2RjLCAweDExMzAsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEyMCwgMHgyMDIxLCAweDQwMGEsCisJMHgwODA0LCAweDJkY2UsIDB4MDBkNiwgMHhhZGU4LCAweDAwMGQsIDB4NjkwMCwgMHg2YTA4LCAweDZiMGMsCisJMHg2YzEwLCAweDZkMTQsIDB4NmUxOCwgMHg2ODIwLCAweGEwYmUsIDB4MDEwMCwgMHgwOTA0LCAweDNhMzIsCisJMHhhMGJlLCAweDAxMTIsIDB4MDkwNCwgMHgzYTMyLCAweGEwYmUsIDB4MDExMywgMHgwOTA0LCAweDNhMzIsCisJMHhhMGJlLCAweDAxMTQsIDB4MDkwNCwgMHgzYTMyLCAweGEwYmUsIDB4MDExNywgMHgwOTA0LCAweDNhMzIsCisJMHhhMGJlLCAweDAxMWEsIDB4MDkwNCwgMHgzYTMyLCAweGEwYmUsIDB4MDExYywgMHgwOTA0LCAweDNhMzIsCisJMHhhMGJlLCAweDAxMjEsIDB4MDViMCwgMHhhMGJlLCAweDAxMzEsIDB4MDU5OCwgMHhhMGJlLCAweDAxNzEsCisJMHgwNWM4LCAweGEwYmUsIDB4MDE3MywgMHgwNWIwLCAweGEwYmUsIDB4MDFhMSwgMHgxMTIwLCAweDY4MzAsCisJMHg4MDA3LCAweDY4MzIsIDB4MDRhOCwgMHhhMGJlLCAweDAyMTIsIDB4MDU0MCwgMHhhMGJlLCAweDAyMTMsCisJMHgwNTI4LCAweGEwYmUsIDB4MDIxNCwgMHgwMWIwLCAweGEwYmUsIDB4MDIxNywgMHgwMTY4LCAweGEwYmUsCisJMHgwMjFhLCAweDExMjAsIDB4NjgzOCwgMHg4MDA3LCAweDY4M2EsIDB4MDBlMCwgMHhhMGJlLCAweDAzMDAsCisJMHgwMWM4LCAweDAwZGUsIDB4MDgwNCwgMHgyZGY0LCAweGFkODAsIDB4MDAxMCwgMHgyMGE5LCAweDAwMDcsCisJMHgwODBjLCAweDNhNzgsIDB4YWQ4MCwgMHgwMDBlLCAweDIwYTksIDB4MDAwMSwgMHgwODBjLCAweDNhNzgsCisJMHgwMDQ4LCAweGFkODAsIDB4MDAwYywgMHgwODBjLCAweDNhODYsIDB4MDA1MCwgMHhhZDgwLCAweDAwMGUsCisJMHgwODBjLCAweDNhODYsIDB4YWQ4MCwgMHgwMDBjLCAweDIwYTksIDB4MDAwMSwgMHgwODBjLCAweDNhNzgsCisJMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwNTY4LCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDY4MzcsCisJMHgwMTE5LCAweDY4NTMsIDB4MDAwMCwgMHg2ODRmLCAweDAwMjAsIDB4Njg1YiwgMHgwMDAxLCAweDgxMGIsCisJMHg2OTdlLCAweDY4ODMsIDB4MDAwMCwgMHg2YTg2LCAweDZiOGEsIDB4NmM4ZSwgMHg2ZDkyLCAweDY5OTYsCisJMHg2ODliLCAweDAwMDAsIDB4MDBjZSwgMHgwMGRlLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDY4MjMsIDB4MDAwMCwgMHg2ODA0LCAweDIwNjgsIDB4MDgwYywgMHg5NmQzLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDMsIDB4MDgwNCwgMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDNhNmYsCisJMHgwMDA1LCAweDAwY2UsIDB4MDBkZSwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZGYxLCAweDY4MjAsCisJMHhhMDg2LCAweDgwMDEsIDB4MTkwNCwgMHgyZGNjLCAweDIwMDksIDB4MDAwNCwgMHgwODA0LCAweDJkZjEsCisJMHgwMDE2LCAweDIwMDgsIDB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyOTBhLCAweDgxMDgsCisJMHgyODBhLCAweDgxMDgsIDB4MWYwNCwgMHgzYTdhLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwYTYsCisJMHgwMGI2LCAweDIwMDgsIDB4MjA0NCwgMHg4MDAwLCAweDIwNGMsIDB4ODAwMCwgMHgyMDU0LCAweDgwMDAsCisJMHgyMDVjLCAweDJiMGEsIDB4ODEwOCwgMHgyYTBhLCAweDgxMDgsIDB4MjkwYSwgMHg4MTA4LCAweDI4MGEsCisJMHgwMGJlLCAweDAwYWUsIDB4MDAxZSwgMHgwMDA1LCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODA0LCAweDJkZjEsIDB4NzkyNCwgMHgyMTQwLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDYwZDAsCisJMHhkMGFjLCAweDExMjAsIDB4YTE4MiwgMHgwMDgwLCAweDBhMDQsIDB4MmRmNCwgMHhhMTgyLCAweDAwZmYsCisJMHgxYTA0LCAweDJkZjQsIDB4N2EyYywgMHg3YjI4LCAweDYwNmMsIDB4YTMwNiwgMHgxMTQwLCAweDYwNzAsCisJMHhhMjRlLCAweDA5MDQsIDB4MmRmNCwgMHhhOWNjLCAweGZmMDAsIDB4MDkwNCwgMHgyZGY0LCAweDAwYzYsCisJMHgwODBjLCAweDNiNTgsIDB4MmM2OCwgMHgwMGNlLCAweDA1MzgsIDB4YTBjNiwgMHg0MDAwLCAweDExODAsCisJMHgwMGM2LCAweDAwMDYsIDB4MmQ2MCwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHg0ZjZlLCAweDExMDgsCisJMHhjMTg1LCAweDYwMDAsIDB4ZDBiYywgMHgwMTA4LCAweGMxOGQsIDB4MDAwZSwgMHgwMGNlLCAweDAwODgsCisJMHhhMGM2LCAweDQwMDcsIDB4MTExMCwgMHgyNDA4LCAweDAwNjAsIDB4YTBjNiwgMHg0MDA4LCAweDExMTgsCisJMHgyNzA4LCAweDI2MTAsIDB4MDAzMCwgMHhhMGM2LCAweDQwMDksIDB4MTEwOCwgMHgwMDEwLCAweDIwMDEsCisJMHg0MDA2LCAweDIwMjAsIDB4MDgwNCwgMHgyZGNlLCAweDJkMDAsIDB4NzAyMiwgMHgwMDE2LCAweDAwYjYsCisJMHgwMGM2LCAweDAwZTYsIDB4MmM3MCwgMHgwODBjLCAweDgwMjIsIDB4MDVkOCwgMHgyZDAwLCAweDYwMWEsCisJMHgwODBjLCAweDk5NTYsIDB4MmU1OCwgMHgwMGVlLCAweDAwZTYsIDB4MDBjNiwgMHgwODBjLCAweDNjMDUsCisJMHgwMGNlLCAweDJiNzAsIDB4MTE1MCwgMHgwODBjLCAweDgwNzgsIDB4MDBlZSwgMHgwMGNlLCAweDAwYmUsCisJMHgwMDFlLCAweDIwMDksIDB4MDAwMiwgMHgwODA0LCAweDJkZjEsIDB4NjgzNywgMHgwMDAwLCAweDY4M2IsCisJMHgwMDAwLCAweDJkMDAsIDB4NjAxMiwgMHg2ODMzLCAweDAwMDAsIDB4NjgzOCwgMHhjMGZkLCAweGQ4OGMsCisJMHgwMTA4LCAweGMwZjUsIDB4NjgzYSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDJhZDksCisJMHgwMTJlLCAweDYwMWYsIDB4MDAwMSwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzFlLCAweDIwMDEsCisJMHgwMDAyLCAweDA4MGMsIDB4NGMzMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsCisJMHgwMDAxLCAweDAwZWUsIDB4MDBjZSwgMHgwMGJlLCAweDAwMWUsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDMsCisJMHgwODA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsIDB4M2IzZiwgMHgwMDA1LCAweDY4MzAsCisJMHhhMDg2LCAweDAxMDAsIDB4NzAyMCwgMHgyMDYwLCAweDExMzgsIDB4MjAwOSwgMHgwMDA0LCAweDYyMDQsCisJMHhhMjk0LCAweDAwZmYsIDB4MDgwNCwgMHgyZGYxLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDRmNmUsCisJMHgxMTA4LCAweGMxODUsIDB4NjAwMCwgMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHgwODA0LCAweDJkY2MsCisJMHgwMGU2LCAweDAwZDYsIDB4MjAyOSwgMHgwMDAwLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYWMsCisJMHgwMTM4LCAweDIwMjEsIDB4MDAwMCwgMHgyMGE5LCAweDAwZmYsIDB4MjA3MSwgMHhhZTM0LCAweDAwMzAsCisJMHgyMDIxLCAweDAwODAsIDB4MjBhOSwgMHgwMDdmLCAweDIwNzEsIDB4YWViNCwgMHgyZTA0LCAweGEwMDUsCisJMHgxMTMwLCAweDIxMDAsIDB4YTQwNiwgMHgxNTQ4LCAweDI0MjgsIDB4YzVmZCwgMHgwNDMwLCAweDIwNjgsCisJMHg2ZjEwLCAweDI3MDAsIDB4YTMwNiwgMHgxMWIwLCAweDZlMTQsIDB4MjYwMCwgMHhhMjA2LCAweDExOTAsCisJMHgyNDAwLCAweGExMDYsIDB4MTE2MCwgMHgyZDYwLCAweGQ4ODQsIDB4MDU0MCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgxNTEwLCAweDIwMDEsIDB4NDAwMCwgMHgwNDAwLCAweDIwMDEsCisJMHg0MDA3LCAweDAwZTgsIDB4MjQwMCwgMHhhMTA2LCAweDExNDAsIDB4NmUxNCwgMHg4N2ZmLCAweDExMTAsCisJMHg4NmZmLCAweDA5ZDAsIDB4MjAwMSwgMHg0MDA4LCAweDAwOTAsIDB4ODQyMCwgMHg4ZTcwLCAweDFmMDQsCisJMHgzYjZlLCAweDg1ZmYsIDB4MTEzMCwgMHgyMDAxLCAweDQwMDksIDB4MDA0OCwgMHgyMDAxLCAweDAwMDEsCisJMHgwMDMwLCAweDA4MGMsIDB4NGM4MCwgMHgxZGQwLCAweDYzMTIsIDB4NjIxNiwgMHhhMDA2LCAweGEwMDUsCisJMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMDUsCisJMHgwOTA0LCAweDJkZjEsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc4MjQsCisJMHhhMDA1LCAweDA5MDQsIDB4MmRmNCwgMHhhMDk2LCAweDAwZmYsIDB4MDEyMCwgMHhhMDkyLCAweDAwMDQsCisJMHgxYTA0LCAweDJkZjQsIDB4MjAxMCwgMHgyZDE4LCAweDA4MGMsIDB4MmE4YywgMHgwOTA0LCAweDJkZjEsCisJMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzYmQ1LCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsCisJMHgwOTA0LCAweDJkZjEsIDB4MDgwNCwgMHgyZGNjLCAweDc5MjQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHg2MGQwLCAweGQwYWMsIDB4MTEyMCwgMHhhMTgyLCAweDAwODAsIDB4MGEwNCwgMHgyZGY0LCAweGExODIsCisJMHgwMGZmLCAweDFhMDQsIDB4MmRmNCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDk1YzYsCisJMHgxMTg4LCAweGExOTAsIDB4YWUzNCwgMHgyMjA0LCAweGEwNjUsIDB4MDE2MCwgMHgwODBjLCAweDQ5M2EsCisJMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGFjLCAweDAxMTAsIDB4NjAxNywgMHgwMDAwLCAweDAxMmUsCisJMHgwODA0LCAweDJkY2MsIDB4MDEyZSwgMHgwODA0LCAweDJkZjEsIDB4MDgwYywgMHgxNWQ5LCAweDAxODgsCisJMHhhMDA2LCAweDY4MDIsIDB4NzAxMCwgMHhhMDA1LCAweDExMjAsIDB4MmQwMCwgMHg3MDEyLCAweDcwMTYsCisJMHgwMDMwLCAweDcwMTQsIDB4NjgwMiwgMHgyMDYwLCAweDJkMDAsIDB4NjAwNiwgMHg3MDE2LCAweGFkODAsCisJMHgwMDBkLCAweDAwMDUsIDB4NzkyNCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHgwODBjLCAweDRjZGMsCisJMHgxMTMwLCAweDdlMjgsIDB4YTY4NCwgMHgzZmZmLCAweGEwODIsIDB4NDAwMCwgMHgwMjA4LCAweGEwNjYsCisJMHg4Y2ZmLCAweDAwMDUsIDB4N2UyNCwgMHg4NjBmLCAweGExOGMsIDB4MDBmZiwgMHgwODBjLCAweDRjZGMsCisJMHgxMTI4LCAweGE2YjQsIDB4MDBmZiwgMHhhNjgyLCAweDQwMDAsIDB4MDIwOCwgMHhhMDY2LCAweDhjZmYsCisJMHgwMDA1LCAweDAwMTYsIDB4NzExMCwgMHg4MWZmLCAweDAxMjgsIDB4MjE2OCwgMHg2OTA0LCAweDA4MGMsCisJMHgxNWYwLCAweDBjYzgsIDB4NzExMiwgMHg3MTE2LCAweDAwMWUsIDB4MDAwNSwgMHgyMDMxLCAweDAwMDEsCisJMHgwMDEwLCAweDIwMzEsIDB4MDAwMCwgMHgyMDYxLCAweGFkZDEsIDB4NjYwNiwgMHg2MTEyLCAweDYwMGUsCisJMHg2MjI2LCAweDYzMmEsIDB4NjQyZSwgMHg2NTMyLCAweDJjMTAsIDB4MDgwYywgMHgxNjI0LCAweDcwMDcsCisJMHgwMDAyLCAweDcwMWIsIDB4MmRjYywgMHgwMDA1LCAweDAwZjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDc5LCAweDAwMDAsIDB4MjAwMSwgMHhhZDhmLCAweDIwMDQsIDB4YTAwNSwgMHgxMTY4LCAweDBlMDQsCisJMHgzYzc0LCAweDc4MTgsIDB4ZDA4NCwgMHgxMTQwLCAweDdhMjIsIDB4N2IyNiwgMHg3YzJhLCAweDc4MWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwNDA4LCAweDAwMTYsIDB4MDBjNiwgMHgwMGU2LCAweDIwNzEsCisJMHhhZDgxLCAweDcxMzgsIDB4YTE4MiwgMHgwMDEwLCAweDAyMTgsIDB4NzAzMCwgMHgyMDYwLCAweDAwNzgsCisJMHg3MDMwLCAweGEwZTAsIDB4MDAwNCwgMHhhYzgyLCAweGFkZDEsIDB4MDIxMCwgMHgyMDYxLCAweGFkOTEsCisJMHgyYzAwLCAweDcwMzIsIDB4ODFmZiwgMHgxMTA4LCAweDcwMzYsIDB4ODEwOCwgMHg3MTNhLCAweDIyNjIsCisJMHg2MzA2LCAweDY0MGEsIDB4MDBlZSwgMHgwMGNlLCAweDAwMWUsIDB4MDEyZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4YWQ4MSwgMHg3MDM4LCAweGEwMDUsIDB4MDU3MCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDBlMDQsIDB4M2NjYiwgMHgwMGY2LCAweDIwNzksIDB4MDAwMCwgMHg3ODE4LCAweGQwODQsCisJMHgxNTA4LCAweDAwYzYsIDB4NzAzNCwgMHgyMDYwLCAweDJjMDQsIDB4NzgyMiwgMHg2MDA0LCAweDc4MjYsCisJMHg2MDA4LCAweDc4MmEsIDB4NzgxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHg3MDM4LCAweDgwMDEsCisJMHg3MDNhLCAweGEwMDUsIDB4MTEzMCwgMHg3MDMzLCAweGFkOTEsIDB4NzAzNywgMHhhZDkxLCAweDAwY2UsCisJMHgwMDQ4LCAweGFjODAsIDB4MDAwNCwgMHhhMGZhLCAweGFkZDEsIDB4MDIxMCwgMHgyMDAxLCAweGFkOTEsCisJMHg3MDM2LCAweDAwY2UsIDB4MDBmZSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDI2LCAweDIwMDEsCisJMHhhZDUyLCAweDIwMDQsIDB4ZDBjNCwgMHgwMTIwLCAweDIwMTEsIDB4ODAxNCwgMHgwODBjLCAweDNjNWMsCisJMHgwMDJlLCAweDAwMDUsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDMwLCAweGMwOGQsIDB4YzA4NSwgMHhjMGFjLCAweDYwMzIsIDB4MDgwYywgMHg1NzRmLCAweDExNzgsCisJMHgyMDAxLCAweGFmOWUsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsIDB4YWQwMCwgMHgyMDAzLCAweDAwMDEsCisJMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHg1NzkzLCAweDA4MGMsIDB4NTY5YSwgMHgwMDEwLCAweDA4MGMsCisJMHg0ODVlLCAweDAxMmUsIDB4MDgwNCwgMHgyZGNjLCAweDc4MjQsIDB4MjAwOCwgMHhhMThjLCAweGZmZmQsCisJMHgxMTI4LCAweDYxZGMsIDB4YTEwZCwgMHg2MWRlLCAweDA4MDQsIDB4MmRjYywgMHgwODA0LCAweDJkZjQsCisJMHg4MWZmLCAweDE5MDQsIDB4MmRmMSwgMHg2MDAwLCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJkZjEsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGFjLCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMmEsCisJMHgwOTA0LCAweDJkZjQsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExMjAsCisJMHg3ODI4LCAweGEwMDUsIDB4MDkwNCwgMHgyZGNjLCAweDAwYzYsIDB4MDgwYywgMHgzYzA1LCAweDAwY2UsCisJMHgwOTA0LCAweDJkZjEsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsCisJMHg2ODNhLCAweDA4MGMsIDB4OTc5YywgMHgwOTA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHgzZDNhLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MDkwNCwgMHgyZGYxLCAweDA4MDQsCisJMHgyZGNjLCAweDIwMDEsIDB4YWQwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMywgMHgxOTA0LCAweDJkZjEsCisJMHg3ZjI0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwYywgMHgzYzA1LCAweDA5MDQsCisJMHgyZGYxLCAweDIwMDksIDB4MDAwMCwgMHgyMDMxLCAweDAwMDAsIDB4NzAyMywgMHgwMDAwLCAweDcwMmYsCisJMHgwMDAwLCAweGFkODAsIDB4MDAwNSwgMHg3MDI2LCAweDIwYTAsIDB4MDgwYywgMHg0Y2RjLCAweDE5MDQsCisJMHgzZGI0LCAweDYwMDQsIDB4YTBjNCwgMHgwMGZmLCAweGE4YzYsIDB4MDAwNiwgMHgwMTMwLCAweGEwYzQsCisJMHhmZjAwLCAweGE4YzYsIDB4MDYwMCwgMHgxOTA0LCAweDNkYjQsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsCisJMHhkMGFjLCAweDExMjgsIDB4MDgwYywgMHg0ZjZlLCAweDExMTAsIDB4ZDc5YywgMHgwNWU4LCAweGQ3OTQsCisJMHgxMTEwLCAweGQ3ODQsIDB4MDE1OCwgMHhhYzgwLCAweDAwMDYsIDB4MjA5OCwgMHgzNDAwLCAweDIwYTksCisJMHgwMDA0LCAweDUzYTMsIDB4MDgwYywgMHgzYTg2LCAweGQ3OTQsIDB4MDE0OCwgMHhhYzgwLCAweDAwMGEsCisJMHgyMDk4LCAweDM0MDAsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MDgwYywgMHgzYTg2LCAweDIxYTIsCisJMHhkNzk0LCAweDAxZDgsIDB4YWM4MCwgMHgwMDAwLCAweDIwOTgsIDB4OTRhMCwgMHgyMGE5LCAweDAwMDIsCisJMHg1M2EzLCAweGFjODAsIDB4MDAwMywgMHgyMGE2LCAweDk0YTAsIDB4YWM4MCwgMHgwMDA0LCAweDIwOTgsCisJMHgzNDAwLCAweDIwYTksIDB4MDAwMiwgMHg1M2EzLCAweDA4MGMsIDB4M2E3OCwgMHhhYzgwLCAweDAwMjYsCisJMHgyMDk4LCAweDIwYTksIDB4MDAwMiwgMHg1M2EzLCAweDAwMDgsIDB4OTRhMCwgMHhkNzk0LCAweDAxMTAsCisJMHhhNmIwLCAweDAwMGIsIDB4YTZiMCwgMHgwMDA1LCAweDgxMDgsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsCisJMHhkMGFjLCAweDAxMTgsIDB4YTE4NiwgMHgwMTAwLCAweDAwNDAsIDB4ZDc4YywgMHgwMTIwLCAweGExODYsCisJMHgwMTAwLCAweDAxNzAsIDB4MDAxOCwgMHhhMTg2LCAweDAwN2UsIDB4MDE1MCwgMHhkNzk0LCAweDAxMTgsCisJMHhhNjg2LCAweDAwMjAsIDB4MDAxMCwgMHhhNjg2LCAweDAwMjgsIDB4MDE1MCwgMHgwODA0LCAweDNkNWQsCisJMHg4NmZmLCAweDExMjAsIDB4NzEyMCwgMHg4MTBiLCAweDA4MDQsIDB4MmRjYywgMHg3MDJmLCAweDAwMDEsCisJMHg3MTFlLCAweDcwMjAsIDB4YTYwMCwgMHg3MDIyLCAweDc3MmEsIDB4MjA2MSwgMHhhZGQxLCAweDYwMDcsCisJMHgwMDAwLCAweDY2MTIsIDB4NzAyNCwgMHg2MDBlLCAweDYyMjYsIDB4NjMyYSwgMHg2NDJlLCAweDY1MzIsCisJMHgyYzEwLCAweDA4MGMsIDB4MTYyNCwgMHg3MDA3LCAweDAwMDIsIDB4NzAxYiwgMHgzZGYwLCAweDAwMDUsCisJMHg3MDJjLCAweGEwMDUsIDB4MTE3MCwgMHg3MTFjLCAweDcwMjQsIDB4MjBhMCwgMHg3NzI4LCAweDIwMzEsCisJMHgwMDAwLCAweDIwNjEsIDB4YWRkMSwgMHg2MjI0LCAweDYzMjgsIDB4NjQyYywgMHg2NTMwLCAweDA4MDQsCisJMHgzZDVkLCAweDcxMjAsIDB4ODEwYiwgMHgwODA0LCAweDJkY2MsIDB4MjAyOSwgMHgwMDdlLCAweDc5MjQsCisJMHg3YTI4LCAweDdiMmMsIDB4N2MzOCwgMHhhMTg0LCAweGZmMDAsIDB4ODAwNywgMHhhMGUyLCAweDAwMjAsCisJMHgwYTA0LCAweDJkZjQsIDB4YTUwMiwgMHgwYTA0LCAweDJkZjQsIDB4YTE4NCwgMHgwMGZmLCAweGEwZTIsCisJMHgwMDIwLCAweDBhMDQsIDB4MmRmNCwgMHhhNTAyLCAweDBhMDQsIDB4MmRmNCwgMHhhMjg0LCAweGZmMDAsCisJMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDJkZjQsIDB4YTUwMiwgMHgwYTA0LCAweDJkZjQsCisJMHhhMjg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDBhMDQsIDB4MmRmNCwgMHhhNTAyLCAweDBhMDQsCisJMHgyZGY0LCAweGEzODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsIDB4MDAyMCwgMHgwYTA0LCAweDJkZjQsCisJMHhhNTAyLCAweDBhMDQsIDB4MmRmNCwgMHhhMzg0LCAweDAwZmYsIDB4YTBlMiwgMHgwMDIwLCAweDBhMDQsCisJMHgyZGY0LCAweGE1MDIsIDB4MGEwNCwgMHgyZGY0LCAweGE0ODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwZTIsCisJMHgwMDIwLCAweDBhMDQsIDB4MmRmNCwgMHhhNTAyLCAweDBhMDQsIDB4MmRmNCwgMHhhNDg0LCAweDAwZmYsCisJMHhhMGUyLCAweDAwMjAsIDB4MGEwNCwgMHgyZGY0LCAweGE1MDIsIDB4MGEwNCwgMHgyZGY0LCAweDIwNjEsCisJMHhhZmE2LCAweDYxMDIsIDB4NjIwNiwgMHg2MzBhLCAweDY0MGUsIDB4MDgwNCwgMHgyZGNjLCAweDAwMDYsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGNjLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsCisJMHhhZDcxLCAweDIwMDQsIDB4ZDBiYywgMHgwMDBlLCAweDAwMDUsIDB4NjE2NCwgMHg3YTI0LCAweDYzMDAsCisJMHg4MmZmLCAweDExMTgsIDB4NzkyNiwgMHgwODA0LCAweDJkY2MsIDB4ODNmZiwgMHgxOTA0LCAweDJkZjQsCisJMHgyMDAxLCAweGZmZjAsIDB4YTIwMCwgMHgxYTA0LCAweDJkZjQsIDB4MjAxOSwgMHhmZmZmLCAweDYwNjgsCisJMHhhMzAyLCAweGEyMDAsIDB4MGEwNCwgMHgyZGY0LCAweDc5MjYsIDB4NjI2NiwgMHgwODA0LCAweDJkY2MsCisJMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTkwNCwgMHgyZGYxLCAweDdjMjgsCisJMHg3ZDI0LCAweDdlMzgsIDB4N2YyYywgMHgwODBjLCAweDNjMDUsIDB4MDkwNCwgMHgyZGYxLCAweDIwMDksCisJMHgwMDAwLCAweDIwMTksIDB4MDAwMCwgMHg3MDIzLCAweDAwMDAsIDB4NzAyZiwgMHgwMDAwLCAweGFkODAsCisJMHgwMDAzLCAweDcwMjYsIDB4MjBhMCwgMHhhMWUwLCAweGFlMzQsIDB4MmM2NCwgMHg4Y2ZmLCAweDAxYjgsCisJMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDEzMCwgMHg2MDA0LCAweGEwODQsCisJMHhmZjAwLCAweGEwODYsIDB4MDYwMCwgMHgxMTU4LCAweDYwMTQsIDB4MjBhMiwgMHg5NGEwLCAweDYwMTAsCisJMHg4MDA3LCAweGExMDUsIDB4ODAwNywgMHgyMGEyLCAweDk0YTAsIDB4YTM5OCwgMHgwMDAyLCAweDgxMDgsCisJMHhhMTgyLCAweDAwZmYsIDB4MDEyMCwgMHhhMzg2LCAweDAwMmEsIDB4MDE0OCwgMHgwOGUwLCAweDgzZmYsCisJMHgxMTIwLCAweDcxMjAsIDB4ODEwYywgMHgwODA0LCAweDJkY2MsIDB4NzAyZiwgMHgwMDAxLCAweDcxMWUsCisJMHg3MDIwLCAweGEzMDAsIDB4NzAyMiwgMHgyMDYxLCAweGFkZDEsIDB4NjAwNywgMHgwMDAwLCAweDYzMTIsCisJMHg3MDI0LCAweDYwMGUsIDB4NjQyNiwgMHg2NTJhLCAweDY2MmUsIDB4NjczMiwgMHgyYzEwLCAweDA4MGMsCisJMHgxNjI0LCAweDcwMDcsIDB4MDAwMiwgMHg3MDFiLCAweDNlZTYsIDB4MDAwNSwgMHg3MDJjLCAweGEwMDUsCisJMHgxMTY4LCAweDcxMWMsIDB4NzAyNCwgMHgyMGEwLCAweDIwMTksIDB4MDAwMCwgMHgyMDYxLCAweGFkZDEsCisJMHg2NDI0LCAweDY1MjgsIDB4NjYyYywgMHg2NzMwLCAweDA4MDQsIDB4M2VhMywgMHg3MTIwLCAweDgxMGMsCisJMHgwODA0LCAweDJkY2MsIDB4ODFmZiwgMHgxOTA0LCAweDJkZjEsIDB4NjBkMCwgMHhkMGFjLCAweDExMTgsCisJMHhkMDljLCAweDA5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMDUsIDB4MDkwNCwgMHgyZGYxLCAweDc5MjQsCisJMHg3YTJjLCAweDdiMjgsIDB4N2MzYywgMHg3ZDM4LCAweDA4MGMsIDB4M2M0NiwgMHg3MDFiLCAweDNmMTEsCisJMHgwMDA1LCAweDAwZDYsIDB4YWRlOCwgMHgwMDBkLCAweDY4MjgsIDB4YTBiZSwgMHg3MDAwLCAweDAxNDgsCisJMHhhMGJlLCAweDcxMDAsIDB4MDEzMCwgMHhhMGJlLCAweDcyMDAsIDB4MDExOCwgMHgwMGRlLCAweDA4MDQsCisJMHgyZGY0LCAweDY4MjAsIDB4NjkyNCwgMHgwODBjLCAweDI2NzYsIDB4MTUxMCwgMHgwODBjLCAweDRjODAsCisJMHgxMWY4LCAweDcxMjIsIDB4NjYxMiwgMHg2NTE2LCAweDZlMTgsIDB4MDBjNiwgMHgwODBjLCAweDNjMDUsCisJMHgwMWI4LCAweDA4MGMsIDB4M2MwNSwgMHgwMWEwLCAweDAwY2UsIDB4MDBkZSwgMHg2ODM3LCAweDAwMDAsCisJMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHg2ODIzLCAweDAwMDAsIDB4NjgwNCwgMHgyMDY4LCAweDA4MGMsCisJMHg5NmVmLCAweDA5MDQsIDB4MmRmMSwgMHg3MDA3LCAweDAwMDMsIDB4NzAxYiwgMHgzZjRiLCAweDAwMDUsCisJMHgwMGRlLCAweDA4MDQsIDB4MmRmMSwgMHg3MTIwLCAweDA4MGMsIDB4MmJjOSwgMHg2ODIwLCAweGEwODYsCisJMHg4MDAxLCAweDA5MDQsIDB4MmRmMSwgMHgyZDAwLCAweDcwMWUsIDB4NjgwNCwgMHhhMDgwLCAweDAwMDIsCisJMHgwMDA2LCAweDIwYTksIDB4MDAyYSwgMHgyMDk4LCAweDIwYTAsIDB4MDgwYywgMHg0OGJlLCAweDAwMGUsCisJMHhhZGU4LCAweDAwMGQsIDB4NmEwOCwgMHg2YjBjLCAweDZjMTAsIDB4NmQxNCwgMHgyMDYxLCAweGFkZDEsCisJMHg2MDA3LCAweDAwMDAsIDB4NmUwMCwgMHg2ZjI4LCAweGE3YzYsIDB4NzAwMCwgMHgxMTA4LCAweDAwMTgsCisJMHhhN2M2LCAweDcxMDAsIDB4MTE0MCwgMHhhNmMyLCAweDAwMDQsIDB4MGEwNCwgMHgyZGY0LCAweDIwMDksCisJMHgwMDA0LCAweDA4MDQsIDB4M2M0OSwgMHhhN2M2LCAweDcyMDAsIDB4MTkwNCwgMHgyZGY0LCAweGE2YzIsCisJMHgwMDU0LCAweDBhMDQsIDB4MmRmNCwgMHg2MDBlLCAweDYwMTMsIDB4MDAyYSwgMHg2MjI2LCAweDYzMmEsCisJMHg2NDJlLCAweDY1MzIsIDB4MmMxMCwgMHgwODBjLCAweDE2MjQsIDB4NzAwNywgMHgwMDAyLCAweDcwMWIsCisJMHgzZjkyLCAweDAwMDUsIDB4NzAxYywgMHgyMDY4LCAweDY4MDQsIDB4YTA4MCwgMHgwMDAxLCAweDIwMDQsCisJMHhhMDgwLCAweDAwMDIsIDB4MDAwNiwgMHgyMGE5LCAweDAwMmEsIDB4MjA5OCwgMHgyMGEwLCAweDA4MGMsCisJMHg0OGJlLCAweDAwMGUsIDB4MjAwOSwgMHgwMDJhLCAweDIwNjEsIDB4YWRkMSwgMHg2MjI0LCAweDYzMjgsCisJMHg2NDJjLCAweDY1MzAsIDB4MDgwNCwgMHgzYzQ5LCAweDgxZmYsIDB4MTkwNCwgMHgyZGYxLCAweDA4MGMsCisJMHgzYzFhLCAweDA5MDQsIDB4MmRmNCwgMHgwODBjLCAweDRkOTYsIDB4MDkwNCwgMHgyZGYxLCAweDA4MGMsCisJMHg0ZWM2LCAweDA4MDQsIDB4MmRjYywgMHg3ODI0LCAweGQwODQsIDB4MDkwNCwgMHgzODA0LCAweDA4MGMsCisJMHgzYzJhLCAweDA5MDQsIDB4MmRmNCwgMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwMGNlLCAweDExMjAsCisJMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZGYxLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDAxMjgsIDB4YTA4ZSwgMHgwMDA0LCAweDAxMTAsIDB4YTA4ZSwgMHgwMDA1LCAweDE1MDgsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGI0LCAweDA5MDQsIDB4MzgzNCwgMHg2MDAwLCAweGQwOGMsCisJMHgxOTA0LCAweDM4MzQsIDB4NjgzNywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDA4MGMsCisJMHg5NzBiLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsIDB4MmRmMSwgMHg3MDA3LCAweDAwMDMsCisJMHg3MDFiLCAweDNmZjMsIDB4MDAwNSwgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDA4MDQsCisJMHgzODM0LCAweDIwMDksIDB4YWQzMCwgMHgyMTBjLCAweDgxZmYsIDB4MDEyMCwgMHgyMDA5LCAweDAwMDEsCisJMHgwODA0LCAweDJkZjEsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMDcsIDB4MDgwNCwgMHgyZGYxLCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LCAweGQwYWMsCisJMHgwMTIwLCAweDIwMDksIDB4MDAwOCwgMHgwODA0LCAweDJkZjEsIDB4NjA5YywgMHhkMGE0LCAweDExMTgsCisJMHhkMGFjLCAweDE5MDQsIDB4MzgzNCwgMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsCisJMHhjMGZkLCAweDY4M2EsIDB4MDgwYywgMHg5NzljLCAweDExMjAsIDB4MjAwOSwgMHgwMDAzLCAweDA4MDQsCisJMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDQwMmUsIDB4MDAwNSwgMHg2ODMwLCAweGEwODYsCisJMHgwMTAwLCAweDExMjAsIDB4MjAwOSwgMHgwMDA0LCAweDA4MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMmEsCisJMHgwOTA0LCAweDJkZjQsIDB4MDgwNCwgMHgzZmQ4LCAweDgxZmYsIDB4MjAwOSwgMHgwMDAxLCAweDE5MDQsCisJMHgyZGYxLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksIDB4MDAwNywgMHgxOTA0LCAweDJkZjEsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGFjLCAweDIwMDksIDB4MDAwOCwgMHgxOTA0LCAweDJkZjEsCisJMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsCisJMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDJkZjEsIDB4MDBjNiwgMHgwODBjLCAweDNjMDUsCisJMHgwMGNlLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LCAweDJkZjEsIDB4NjgzNywgMHgwMDAwLCAweDY4MzMsCisJMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDc5MjgsIDB4YTE5NCwgMHhmZjAwLCAweGExOGMsCisJMHgwMGZmLCAweGEwMDYsIDB4ODJmZiwgMHgxMTI4LCAweGMwZWQsIDB4Njk1MiwgMHg3OTJjLCAweDY5NTYsCisJMHgwMDQ4LCAweGEyOGUsIDB4MDEwMCwgMHgxOTA0LCAweDJkZjQsIDB4YzBlNSwgMHg2ODUzLCAweDAwMDAsCisJMHg2ODU3LCAweDAwMDAsIDB4NjgzZSwgMHgwODBjLCAweDk5NTcsIDB4MjAwOSwgMHgwMDAzLCAweDA5MDQsCisJMHgyZGYxLCAweDcwMDcsIDB4MDAwMywgMHg3MDFiLCAweDQwOGUsIDB4MDAwNSwgMHg2ODMwLCAweGEwODYsCisJMHgwMTAwLCAweDIwMDksIDB4MDAwNCwgMHgwOTA0LCAweDJkZjEsIDB4MDgwNCwgMHgyZGNjLCAweDgxZmYsCisJMHgyMDA5LCAweDAwMDEsIDB4MTkwNCwgMHgyZGYxLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDIwMDksCisJMHgwMDA3LCAweDE5MDQsIDB4MmRmMSwgMHgwODBjLCAweDNjMmEsIDB4MDkwNCwgMHgyZGY0LCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDIwMDksIDB4MDAwOSwgMHgxOTA0LCAweDJkZjEsCisJMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwMGNlLCAweDIwMDksIDB4MDAwMiwgMHgwOTA0LCAweDJkZjEsCisJMHhhZDgwLCAweDAwMGYsIDB4MjAwOSwgMHgwMDA4LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgwODBjLCAweDNjNDYsIDB4NzAxYiwgMHg0MGM1LCAweDAwMDUsIDB4MDBkNiwgMHhhZGU4LCAweDAwMGYsCisJMHg2ODAwLCAweGEwODYsIDB4MDUwMCwgMHgxMTQwLCAweDY4MDQsIDB4YTAwNSwgMHgxMTI4LCAweDY4MDgsCisJMHhhMDg0LCAweGZmMDAsIDB4MTEwOCwgMHgwMDE4LCAweDAwZGUsIDB4MTkwNCwgMHgyZGY0LCAweDAwZGUsCisJMHg2ODM3LCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4MzgsIDB4YzBmZCwgMHg2ODNhLCAweDAwYzYsCisJMHgwODBjLCAweDNjMmEsIDB4MTExOCwgMHgwMGNlLCAweDA4MDQsIDB4MmRmNCwgMHgwODBjLCAweDk5YTYsCisJMHgyMDA5LCAweDAwMDMsIDB4MDBjZSwgMHgwOTA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHg0MGYyLCAweDAwMDUsIDB4NjgzMCwgMHhhMDg2LCAweDAxMDAsIDB4MjAwOSwgMHgwMDA0LCAweDA5MDQsCisJMHgyZGYxLCAweDA4MDQsIDB4MmRjYywgMHg4MWZmLCAweDAxMjAsIDB4MjAwOSwgMHgwMDAxLCAweDA4MDQsCisJMHgyZGYxLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAxMjAsIDB4MjAwOSwgMHgwMDA3LCAweDA4MDQsCisJMHgyZGYxLCAweDdlMjQsIDB4ODYwZiwgMHhhMThjLCAweDAwZmYsIDB4YTZiNCwgMHgwMGZmLCAweDA4MGMsCisJMHg0Y2RjLCAweDE5MDQsIDB4MmRmNCwgMHhhMTg2LCAweDAwN2YsIDB4MDE1MCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMTIwLCAweDIwMDksIDB4MDAwOSwgMHgwODA0LCAweDJkZjEsCisJMHgwMGM2LCAweDA4MGMsIDB4M2MwNSwgMHgwMGNlLCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgyZGYxLCAweDY4MzcsIDB4MDAwMCwgMHg2ODM4LCAweGMwZmQsIDB4NjgzYSwgMHgwODBjLCAweDk3MjYsCisJMHgxMTIwLCAweDIwMDksIDB4MDAwMywgMHgwODA0LCAweDJkZjEsIDB4NzAwNywgMHgwMDAzLCAweDcwMWIsCisJMHg0MTNhLCAweDAwMDUsIDB4NjgwOCwgMHg4MDA3LCAweGEwODYsIDB4MDEwMCwgMHgxMTIwLCAweDIwMDksCisJMHgwMDA0LCAweDA4MDQsIDB4MmRmMSwgMHg2OGIwLCAweDY4MzYsIDB4NjgxMCwgMHg4MDA3LCAweGEwODQsCisJMHgwMGZmLCAweDgwOGUsIDB4NjgxNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg4MDg2LCAweGEwODAsCisJMHgwMDAyLCAweGExMDgsIDB4YWQ4MCwgMHgwMDA0LCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsCisJMHgwODA0LCAweDNjNDksIDB4MDgwYywgMHgzYzA1LCAweDExMjAsIDB4MjAwOSwgMHgwMDAyLCAweDA4MDQsCisJMHgyZGYxLCAweDc5MjQsIDB4YTE5NCwgMHhmZjAwLCAweGExOGMsIDB4MDBmZiwgMHg4MjE3LCAweDgyZmYsCisJMHgwMTEwLCAweDA4MDQsIDB4MmRmNCwgMHgyMDA5LCAweDAwMWEsIDB4N2EyYywgMHg3YjI4LCAweDdjM2MsCisJMHg3ZDM4LCAweDA4MGMsIDB4M2M0NiwgMHg3MDFiLCAweDQxNzYsIDB4MDAwNSwgMHhhZDgwLCAweDAwMGQsCisJMHgyMDk4LCAweDIwYTksIDB4MDAxYSwgMHgyMGExLCAweGFmYWQsIDB4NTNhMywgMHgwODA0LCAweDJkY2MsCisJMHgwODBjLCAweDNjMDUsIDB4MTEyMCwgMHgyMDA5LCAweDAwMDIsIDB4MDgwNCwgMHgyZGYxLCAweDc5MjQsCisJMHhhMTk0LCAweGZmMDAsIDB4YTE4YywgMHgwMGZmLCAweDgyMTcsIDB4ODJmZiwgMHgwMTEwLCAweDA4MDQsCisJMHgyZGY0LCAweDIwOTksIDB4YWZhZCwgMHgyMGEwLCAweDIwYTksIDB4MDAxYSwgMHg1M2EzLCAweDIwMDksCisJMHgwMDFhLCAweDdhMmMsIDB4N2IyOCwgMHg3YzNjLCAweDdkMzgsIDB4MDgwNCwgMHgzYzQ5LCAweDc4MjQsCisJMHhhMDhhLCAweDEwMDAsIDB4MWEwNCwgMHgyZGY0LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDgwMDMsCisJMHg4MDBiLCAweDgxMGIsIDB4YTEwOCwgMHgwMGM2LCAweDIwNjEsIDB4YWZkYSwgMHg2MTQyLCAweDAwY2UsCisJMHgwMTJlLCAweDA4MDQsIDB4MmRjYywgMHgwMGM2LCAweDA4MGMsIDB4NTc0ZiwgMHgxMTg4LCAweDIwMDEsCisJMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDAxLCAweGEwODUsCisJMHgwMDAxLCAweDA4MGMsIDB4NTc5MywgMHgwODBjLCAweDU2OWEsIDB4MDgwYywgMHgxNGY2LCAweDAwMzgsCisJMHgyMDYxLCAweGFkMDAsIDB4NjAzMCwgMHhjMDlkLCAweDYwMzIsIDB4MDgwYywgMHg0ODVlLCAweDAwY2UsCisJMHgwMDA1LCAweDAxMjYsIDB4MDBjNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGFkMDAsCisJMHg2MDQ0LCAweGQwYTQsIDB4MTFiMCwgMHhkMDg0LCAweDAxMTgsIDB4MDgwYywgMHg0MzQ4LCAweDAwNjgsCisJMHhkMDhjLCAweDAxMTgsIDB4MDgwYywgMHg0MjY5LCAweDAwNDAsIDB4ZDA5NCwgMHgwMTE4LCAweDA4MGMsCisJMHg0MjNhLCAweDAwMTgsIDB4ZDA5YywgMHgwMTA4LCAweDAwNjEsIDB4MDBlZSwgMHgwMGNlLCAweDAxMmUsCisJMHgwMDA1LCAweDAwMTYsIDB4NjEyOCwgMHhkMTljLCAweDExMTAsIDB4YzE5ZCwgMHg2MTJhLCAweDAwMWUsCisJMHgwY2EwLCAweDYyNGMsIDB4YTI4NiwgMHhmMGYwLCAweDExNTAsIDB4NjA0OCwgMHhhMDg2LCAweGYwZjAsCisJMHgwMTMwLCAweDYyNGEsIDB4NjA0MywgMHgwMDkwLCAweDYwNDMsIDB4MDAxMCwgMHgwNDkwLCAweGEyOTQsCisJMHhmZjAwLCAweGEyOTYsIDB4ZjcwMCwgMHgwMTc4LCAweDcxMzQsIDB4ZDFhNCwgMHgxMTYwLCAweDYyNDAsCisJMHhhMjk1LCAweDAxMDAsIDB4NjI0MiwgMHhhMjk0LCAweDAwMTAsIDB4MDEyOCwgMHgyMDA5LCAweDAwZjcsCisJMHgwODBjLCAweDQ4ZGUsIDB4MDBmMCwgMHg2MDQwLCAweGEwODQsIDB4MDAxMCwgMHhhMDg1LCAweDAwNDAsCisJMHg2MDQyLCAweDYwNDMsIDB4MDAwMCwgMHg3MDc3LCAweDAwMDAsIDB4NzA5MywgMHgwMDAxLCAweDcwYjcsCisJMHgwMDAwLCAweDcwZDMsIDB4MDAwMCwgMHgyMDA5LCAweGIzYzAsIDB4MjAwYiwgMHgwMDAwLCAweDcwODcsCisJMHgwMDAwLCAweDcwN2IsIDB4MDAwYSwgMHgyMDA5LCAweDAwMGEsIDB4MjAxMSwgMHg0ODE0LCAweDA4MGMsCisJMHg2NTkzLCAweDAwMDUsIDB4MDE1NiwgMHgyMDAxLCAweGFkNzMsIDB4MjAwNCwgMHhkMDhjLCAweDAxMTAsCisJMHg3MDRmLCAweGZmZmYsIDB4NzA3OCwgMHhhMDA1LCAweDE1MTAsIDB4MjAxMSwgMHg0ODE0LCAweDA4MGMsCisJMHg2NTBkLCAweDYwNDAsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDAyMCwgMHg2MDQyLCAweDIwYTksCisJMHgwMGM4LCAweDYwNDQsIDB4ZDA4YywgMHgxMTY4LCAweDFmMDQsIDB4NDI1MSwgMHg2MjQyLCAweDcwOGIsCisJMHgwMDAwLCAweDYwNDAsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDA4MCwgMHg2MDQyLCAweDYyNDIsCisJMHgwMDMwLCAweDYyNDIsIDB4NzA4YiwgMHgwMDAwLCAweDcwN2YsIDB4MDAwMCwgMHgwMDAwLCAweDAxNWUsCisJMHgwMDA1LCAweDcwN2MsIDB4YTA4YSwgMHgwMDAzLCAweDEyMTAsIDB4MDAyMywgMHgwMDEwLCAweDA4MGMsCisJMHgxNGY2LCAweDAwMDUsIDB4NDI3NSwgMHg0MmM1LCAweDQzNDcsIDB4MDBmNiwgMHg3MDdmLCAweDAwMDEsCisJMHgyMGUxLCAweGEwMDAsIDB4ZTAwMCwgMHgyMGUxLCAweDg3MDAsIDB4MDgwYywgMHgyMmY4LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDc5LCAweGIyMDAsIDB4MjA3YiwgMHgyMjAwLCAweDc4MDcsCisJMHgwMGVmLCAweDc4MGIsIDB4MDAwMCwgMHg3ODBmLCAweDAwZWYsIDB4NzgxMywgMHgwMTM4LCAweDc4MTcsCisJMHgwMDAwLCAweDc4MWIsIDB4MDAwMCwgMHg3ODFmLCAweDAwMDAsIDB4NzgyMywgMHhmZmZmLCAweDc4MjcsCisJMHhmZmZmLCAweDc4MmIsIDB4MDAwMCwgMHg3ODJmLCAweDAwMDAsIDB4MjA3OSwgMHhiMjBjLCAweDIwN2IsCisJMHgxMTAxLCAweDc4MDcsIDB4MDAwMCwgMHgyMDk5LCAweGFkMDUsIDB4MjBhMSwgMHhiMjBlLCAweDIwYTksCisJMHgwMDA0LCAweDUzYTMsIDB4MjA3OSwgMHhiMjEyLCAweDIwN2IsIDB4MDAwMCwgMHg3ODA3LCAweDAwMDAsCisJMHgyMDk5LCAweGIyMDAsIDB4MjBhMSwgMHgwMjBiLCAweDIwYTksIDB4MDAxNCwgMHg1M2E2LCAweDYwYzMsCisJMHgwMDBjLCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweDQ4NDUsIDB4MDBmZSwgMHg3MDgzLCAweDAwMDAsCisJMHg2MDQzLCAweDAwMDgsIDB4NjA0MywgMHgwMDAwLCAweDAwMDUsIDB4MDBkNiwgMHg3MDgwLCAweDcwODMsCisJMHgwMDAwLCAweGEwMjUsIDB4MDkwNCwgMHg0MzJmLCAweDYwMjAsIDB4ZDBiNCwgMHgxOTA0LCAweDQzMmQsCisJMHg3MTkwLCAweDgxZmYsIDB4MDkwNCwgMHg0MzFkLCAweGE0ODYsIDB4MDAwYywgMHgxOTA0LCAweDQzMjgsCisJMHhhNDgwLCAweDAwMTgsIDB4ODAwNCwgMHgyMGE4LCAweDIwMTEsIDB4YjI4MCwgMHgyMDE5LCAweGIyMDAsCisJMHgyMjBjLCAweDIzMDQsIDB4YTEwNiwgMHgxMWI4LCAweDgyMTAsIDB4ODMxOCwgMHgxZjA0LCAweDQyZTAsCisJMHg2MDQzLCAweDAwMDQsIDB4NjA4YiwgMHhiYzk0LCAweDYwOGYsIDB4ZjBmMCwgMHg2MDQzLCAweDAwMDYsCisJMHg3MDdmLCAweDAwMDIsIDB4NzA4YiwgMHgwMDAyLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDQ4MWIsCisJMHgwODBjLCAweDY1OTMsIDB4MDQ5MCwgMHgyMDY5LCAweGIyODAsIDB4NjkzMCwgMHhhMThlLCAweDExMDEsCisJMHgxNTM4LCAweDY4MzQsIDB4YTAwNSwgMHgxNTIwLCAweDY5MDAsIDB4YTE4YywgMHgwMGZmLCAweDExMTgsCisJMHg2ODA0LCAweGEwMDUsIDB4MDE5MCwgMHgyMDExLCAweGIyOGUsIDB4MjAxOSwgMHhhZDA1LCAweDIwYTksCisJMHgwMDA0LCAweDIyMGMsIDB4MjMwNCwgMHhhMTAyLCAweDAyMzAsIDB4MTE5MCwgMHg4MjEwLCAweDgzMTgsCisJMHgxZjA0LCAweDQzMTEsIDB4MDA2OCwgMHg3MDkzLCAweDAwMDAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDIwOTksIDB4YjI4MCwgMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDE0LCAweDUzYTYsCisJMHg2MDQzLCAweDAwMDgsIDB4NjA0MywgMHgwMDAwLCAweDAwMTAsIDB4MDBkZSwgMHgwMDA1LCAweDYwNDAsCisJMHhhMDg1LCAweDAxMDAsIDB4NjA0MiwgMHg2MDIwLCAweGQwYjQsIDB4MWRiOCwgMHg2MGMzLCAweDAwMGMsCisJMHgyMDExLCAweGFmZDEsIDB4MjAxMywgMHgwMDAwLCAweDcwODMsIDB4MDAwMCwgMHgyMGUxLCAweDkwODAsCisJMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDA4MGMsIDB4NzgyYiwgMHgwYzMwLCAweDAwMDUsCisJMHg3MDg4LCAweGEwOGEsIDB4MDAxZCwgMHgxMjEwLCAweDAwMjMsIDB4MDAxMCwgMHgwODBjLCAweDE0ZjYsCisJMHgwMDA1LCAweDQzN2IsIDB4NDM4YSwgMHg0M2IyLCAweDQzY2IsIDB4NDNlZiwgMHg0NDE3LCAweDQ0M2IsCisJMHg0NDZjLCAweDQ0OTAsIDB4NDRiOCwgMHg0NGVmLCAweDQ1MTcsIDB4NDUzMywgMHg0NTQ5LCAweDQ1NjksCisJMHg0NTdjLCAweDQ1ODQsIDB4NDViMSwgMHg0NWQ1LCAweDQ1ZmQsIDB4NDYyMSwgMHg0NjUyLCAweDQ2OGYsCisJMHg0NmJlLCAweDQ2ZGEsIDB4NDcxOSwgMHg0NzM5LCAweDQ3NTIsIDB4NDc1MywgMHgwMGM2LCAweDIwNjEsCisJMHhhZDAwLCAweDYwMDMsIDB4MDAwNywgMHgyMDYxLCAweDAxMDAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjksCisJMHg2MDA2LCAweDAwY2UsIDB4MDAwNSwgMHg2MDhiLCAweGJjOTQsIDB4NjA4ZiwgMHhmMGYwLCAweDYwNDMsCisJMHgwMDAyLCAweDcwOGIsIDB4MDAwMSwgMHgyMDA5LCAweDA3ZDAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsCisJMHg2NTkzLCAweDAwMDUsIDB4MDBmNiwgMHg3MDgwLCAweGEwODYsIDB4MDAxNCwgMHgxNTA4LCAweDYwNDMsCisJMHgwMDAwLCAweDYwMjAsIDB4ZDBiNCwgMHgxMWUwLCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTAyLCAweDExYTAsIDB4NzgzNCwgMHhhMDA1LCAweDExODgsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsCisJMHg3MGI0LCAweGEwMDUsIDB4MTExMCwgMHg3MGI3LCAweDAwMDEsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsCisJMHg2NTBkLCAweDcwOGIsIDB4MDAxMCwgMHgwODBjLCAweDQ1ODQsIDB4MDAxMCwgMHgwODBjLCAweDQ4NWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NzA4YiwgMHgwMDAzLCAweDYwNDMsIDB4MDAwNCwgMHgyMDExLCAweDQ4MWIsCisJMHgwODBjLCAweDY1MGQsIDB4MDgwYywgMHg0OGM2LCAweDIwYTMsIDB4MTEwMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGE5LCAweDAwMGEsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NDNjMiwgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDQ4NDUsIDB4MDAwNSwgMHgwMGY2LCAweDcwODAsIDB4YTAwNSwgMHgwMWYwLCAweDIwMTEsCisJMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHhhMDg2LCAweDAwMTQsIDB4MTFhOCwgMHgyMDc5LCAweGIyODAsCisJMHg3YTMwLCAweGEyOTYsIDB4MTEwMiwgMHgxMTc4LCAweDc4MzQsIDB4YTAwNSwgMHgxMTYwLCAweDdhMzgsCisJMHhkMmZjLCAweDAxMjgsIDB4NzBiNCwgMHhhMDA1LCAweDExMTAsIDB4NzBiNywgMHgwMDAxLCAweDcwOGIsCisJMHgwMDA0LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDQ4NWUsIDB4MDBmZSwgMHgwMDA1LCAweDcwOGIsCisJMHgwMDA1LCAweDA4MGMsIDB4NDhjNiwgMHgyMGEzLCAweDExMDMsIDB4MjBhMywgMHgwMDAwLCAweDM0MzAsCisJMHgyMDExLCAweGIyOGUsIDB4MDgwYywgMHg0OTE3LCAweDExNjAsIDB4NzA3NCwgMHhhMDA1LCAweDExNDgsCisJMHg3MTRjLCAweGExODYsIDB4ZmZmZiwgMHgwMTI4LCAweDA4MGMsIDB4NDdkZiwgMHgwMTEwLCAweDA4MGMsCisJMHg0OGY1LCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NDg0NSwgMHgwMDA1LCAweDAwZjYsCisJMHg3MDgwLCAweGEwMDUsIDB4MDFmMCwgMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTBkLCAweGEwODYsCisJMHgwMDE0LCAweDExYTgsIDB4MjA3OSwgMHhiMjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTAzLCAweDExNzgsCisJMHg3ODM0LCAweGEwMDUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI0LCAweGEwMDUsCisJMHgxMTEwLCAweDcwYjcsIDB4MDAwMSwgMHg3MDhiLCAweDAwMDYsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsCisJMHg0ODVlLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhiLCAweDAwMDcsIDB4MDgwYywgMHg0OGM2LCAweDIwYTMsCisJMHgxMTA0LCAweDIwYTMsIDB4MDAwMCwgMHgzNDMwLCAweDIwMTEsIDB4YjI4ZSwgMHgwODBjLCAweDQ5MTcsCisJMHgxMWE4LCAweDcwNzQsIDB4YTAwNSwgMHgxMTkwLCAweDcxNTQsIDB4YTE4NiwgMHhmZmZmLCAweDAxNzAsCisJMHhhMTgwLCAweDJiZTYsIDB4MjAwZCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHgwODBjLCAweDQ3ZGYsCisJMHgwMTI4LCAweDA4MGMsIDB4M2U2NiwgMHgwMTEwLCAweDA4MGMsIDB4MjZjMCwgMHgyMGE5LCAweDAwMDgsCisJMHgyMjk4LCAweDI2YTAsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE0LCAweDA4MGMsIDB4NDg0NSwgMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDA1LCAweDAxZjAsCisJMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTBkLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LCAweDIwNzksCisJMHhiMjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA0LCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LCAweDExNjAsCisJMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI0LCAweGEwMDUsIDB4MTExMCwgMHg3MGI3LCAweDAwMDEsCisJMHg3MDhiLCAweDAwMDgsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGZlLCAweDAwMDUsCisJMHg3MDhiLCAweDAwMDksIDB4MDgwYywgMHg0OGM2LCAweDIwYTMsIDB4MTEwNSwgMHgyMGEzLCAweDAxMDAsCisJMHgzNDMwLCAweDA4MGMsIDB4NDkxNywgMHgxMTUwLCAweDcwNzQsIDB4YTAwNSwgMHgxMTM4LCAweDA4MGMsCisJMHg0NzU0LCAweDExNzAsIDB4YTA4NSwgMHgwMDAxLCAweDA4MGMsIDB4MjZjMCwgMHgyMGE5LCAweDAwMDgsCisJMHgyMDk5LCAweGIyOGUsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg0ODQ1LCAweDAwMTAsIDB4MDgwYywgMHg0MzZlLCAweDAwMDUsCisJMHgwMGY2LCAweDcwODAsIDB4YTAwNSwgMHgwNTg4LCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLCAweDY1MGQsCisJMHhhMDg2LCAweDAwMTQsIDB4MTU0MCwgMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDUsCisJMHgxNTEwLCAweDc4MzQsIDB4MjAxMSwgMHgwMTAwLCAweGEyMWUsIDB4MTE2MCwgMHg3YTM4LCAweGQyZmMsCisJMHgwMTI4LCAweDcwYjQsIDB4YTAwNSwgMHgxMTEwLCAweDcwYjcsIDB4MDAwMSwgMHg3MDhiLCAweDAwMGEsCisJMHgwMGIxLCAweDAwOTgsIDB4YTAwNSwgMHgxMTc4LCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjQsCisJMHhhMDA1LCAweDExMTAsIDB4NzBiNywgMHgwMDAxLCAweDcwODcsIDB4MDAwMCwgMHg3MDhiLCAweDAwMGUsCisJMHgwODBjLCAweDQ1NjksIDB4MDAxMCwgMHgwODBjLCAweDQ4NWUsIDB4MDBmZSwgMHgwMDA1LCAweDcwOGIsCisJMHgwMDBiLCAweDIwMTEsIDB4YjIwZSwgMHgyMmEwLCAweDIwYTksIDB4MDA0MCwgMHgyMDE5LCAweGZmZmYsCisJMHg0M2E0LCAweDIwYTksIDB4MDAwMiwgMHgyMDA5LCAweDAwMDAsIDB4NDFhNCwgMHgwODBjLCAweDQ4YzYsCisJMHgyMGEzLCAweDExMDYsIDB4MjBhMywgMHgwMDAwLCAweDA4MGMsIDB4NDkxNywgMHgwMTE4LCAweDIwMTMsCisJMHgwMDAwLCAweDAwMjAsIDB4NzA1MCwgMHhhMDg1LCAweDAxMDAsIDB4MjAxMiwgMHgyMjk4LCAweDIwYTksCisJMHgwMDQyLCAweDUzYTYsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsIDB4NDg0NSwgMHgwMDA1LCAweDAwZjYsCisJMHg3MDgwLCAweGEwMDUsIDB4MDFiMCwgMHgyMDExLCAweDQ4MWIsIDB4MDgwYywgMHg2NTBkLCAweGEwODYsCisJMHgwMDg0LCAweDExNjgsIDB4MjA3OSwgMHhiMjgwLCAweDdhMzAsIDB4YTI5NiwgMHgxMTA2LCAweDExMzgsCisJMHg3ODM0LCAweGEwMDUsIDB4MTEyMCwgMHg3MDhiLCAweDAwMGMsIDB4MDAyOSwgMHgwMDEwLCAweDA4MGMsCisJMHg0ODVlLCAweDAwZmUsIDB4MDAwNSwgMHg3MDhiLCAweDAwMGQsIDB4MDgwYywgMHg0OGM2LCAweDIwYTMsCisJMHgxMTA3LCAweDIwYTMsIDB4MDAwMCwgMHgyMDk5LCAweGIyOGUsIDB4MjBhOSwgMHgwMDQwLCAweDUzYTYsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDQ4NDUsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDA1LCAweDAxZDAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsCisJMHg2NTBkLCAweGEwODYsIDB4MDA4NCwgMHgxMTg4LCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTA3LCAweDExNTgsIDB4NzgzNCwgMHhhMDA1LCAweDExNDAsIDB4NzA4NywgMHgwMDAxLCAweDA4MGMsCisJMHg0OGI4LCAweDcwOGIsIDB4MDAwZSwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLCAweDAwZmUsCisJMHgwMDA1LCAweDcwOGIsIDB4MDAwZiwgMHg3MDgzLCAweDAwMDAsIDB4NjA4YiwgMHhiYzg1LCAweDYwOGYsCisJMHhiNWI1LCAweDYwNDMsIDB4MDAwNSwgMHg2MDQzLCAweDAwMDQsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg0ODFiLCAweDA4MGMsIDB4NjUwMSwgMHgwMDA1LCAweDcwODAsIDB4YTAwNSwgMHgwMTIwLCAweDIwMTEsCisJMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHgwMDA1LCAweDcwOGIsIDB4MDAxMSwgMHgwODBjLCAweDQ5MTcsCisJMHgxMTg4LCAweDcxNmMsIDB4ODFmZiwgMHgwMTcwLCAweDIwMDksIDB4MDAwMCwgMHg3MDcwLCAweGEwODQsCisJMHgwMGZmLCAweDA4MGMsIDB4MjY3NiwgMHhhMTg2LCAweDAwODAsIDB4MDEyMCwgMHgyMDExLCAweGIyOGUsCisJMHgwODBjLCAweDQ3ZGYsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGIyODAsCisJMHgyMGExLCAweDAyMGIsIDB4NzQ4MCwgMHhhNDgwLCAweDAwMTgsIDB4YTA4MCwgMHgwMDA3LCAweGEwODQsCisJMHgwM2Y4LCAweDgwMDQsIDB4MjBhOCwgMHg1M2E2LCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDQ4NDUsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDA1LCAweDAxZjAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsCisJMHg2NTBkLCAweGEwODYsIDB4MDAxNCwgMHgxMWE4LCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTAzLCAweDExNzgsIDB4NzgzNCwgMHhhMDA1LCAweDExNjAsIDB4N2EzOCwgMHhkMmZjLCAweDAxMjgsCisJMHg3MGI0LCAweGEwMDUsIDB4MTExMCwgMHg3MGI3LCAweDAwMDEsIDB4NzA4YiwgMHgwMDEyLCAweDAwMjksCisJMHgwMDEwLCAweDA4MGMsIDB4NDg1ZSwgMHgwMGZlLCAweDAwMDUsIDB4NzA4YiwgMHgwMDEzLCAweDA4MGMsCisJMHg0OGQyLCAweDIwYTMsIDB4MTEwMywgMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDExLCAweGIyOGUsCisJMHgwODBjLCAweDQ5MTcsIDB4MTE2MCwgMHg3MDc0LCAweGEwMDUsIDB4MTE0OCwgMHg3MTRjLCAweGExODYsCisJMHhmZmZmLCAweDAxMjgsIDB4MDgwYywgMHg0N2RmLCAweDAxMTAsIDB4MDgwYywgMHg0OGY1LCAweDIwYTksCisJMHgwMDA4LCAweDIyOTgsIDB4MjZhMCwgMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg0ODQ1LCAweDAwMDUsIDB4MDBmNiwgMHg3MDgwLCAweGEwMDUsCisJMHgwMWYwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLCAweDY1MGQsIDB4YTA4NiwgMHgwMDE0LCAweDExYTgsCisJMHgyMDc5LCAweGIyODAsIDB4N2EzMCwgMHhhMjk2LCAweDExMDQsIDB4MTE3OCwgMHg3ODM0LCAweGEwMDUsCisJMHgxMTYwLCAweDdhMzgsIDB4ZDJmYywgMHgwMTI4LCAweDcwYjQsIDB4YTAwNSwgMHgxMTEwLCAweDcwYjcsCisJMHgwMDAxLCAweDcwOGIsIDB4MDAxNCwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLCAweDAwZmUsCisJMHgwMDA1LCAweDcwOGIsIDB4MDAxNSwgMHgwODBjLCAweDQ4ZDIsIDB4MjBhMywgMHgxMTA0LCAweDIwYTMsCisJMHgwMDAwLCAweDM0MzAsIDB4MjAxMSwgMHhiMjhlLCAweDA4MGMsIDB4NDkxNywgMHgxMWE4LCAweDcwNzQsCisJMHhhMDA1LCAweDExOTAsIDB4NzE1NCwgMHhhMTg2LCAweGZmZmYsIDB4MDE3MCwgMHhhMTgwLCAweDJiZTYsCisJMHgyMDBkLCAweGExOGMsIDB4ZmYwMCwgMHg4MTBmLCAweDA4MGMsIDB4NDdkZiwgMHgwMTI4LCAweDA4MGMsCisJMHgzZTY2LCAweDAxMTAsIDB4MDgwYywgMHgyNmMwLCAweDIwYTksIDB4MDAwOCwgMHgyMjk4LCAweDI2YTAsCisJMHg1M2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsCisJMHg0ODQ1LCAweDAwMDUsIDB4MDBmNiwgMHg3MDgwLCAweGEwMDUsIDB4MDViOCwgMHgyMDExLCAweDQ4MWIsCisJMHgwODBjLCAweDY1MGQsIDB4YTA4NiwgMHgwMDE0LCAweDE1NzAsIDB4MjA3OSwgMHhiMjgwLCAweDdhMzAsCisJMHhhMjk2LCAweDExMDUsIDB4MTU0MCwgMHg3ODM0LCAweDIwMTEsIDB4MDEwMCwgMHhhMjFlLCAweDExNDgsCisJMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI0LCAweGEwMDUsIDB4MTExMCwgMHg3MGI3LCAweDAwMDEsCisJMHgwMDYwLCAweGEwMDUsIDB4MTFjMCwgMHg3YTM4LCAweGQyZmMsIDB4MDEyOCwgMHg3MGI0LCAweGEwMDUsCisJMHgxMTEwLCAweDcwYjcsIDB4MDAwMSwgMHg3MDg3LCAweDAwMDAsIDB4N2EzOCwgMHhkMmY0LCAweDAxMzgsCisJMHgyMDAxLCAweGFkNzMsIDB4MjAwNCwgMHhkMGE0LCAweDExMTAsIDB4NzBkMywgMHgwMDA4LCAweDcwOGIsCisJMHgwMDE2LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDQ4NWUsIDB4MDBmZSwgMHgwMDA1LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGIyODAsIDB4MjBhMSwgMHgwMjBiLCAweDIwYTksCisJMHgwMDBlLCAweDUzYTYsIDB4MzQzMCwgMHgyMDExLCAweGIyOGUsIDB4NzA4YiwgMHgwMDE3LCAweDA4MGMsCisJMHg0OTE3LCAweDExNTAsIDB4NzA3NCwgMHhhMDA1LCAweDExMzgsIDB4MDgwYywgMHg0NzU0LCAweDExNzAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDgwYywgMHgyNmMwLCAweDIwYTksIDB4MDAwOCwgMHgyMDk5LCAweGIyOGUsCisJMHgyNmEwLCAweDUzYTYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsCisJMHgwODBjLCAweDQ4NDUsIDB4MDAxMCwgMHgwODBjLCAweDQzNmUsIDB4MDAwNSwgMHgwMGY2LCAweDcwODAsCisJMHhhMDA1LCAweDAxYjAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHhhMDg2LCAweDAwODQsCisJMHgxMTY4LCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsIDB4MTEwNiwgMHgxMTM4LCAweDc4MzQsCisJMHhhMDA1LCAweDExMjAsIDB4NzA4YiwgMHgwMDE4LCAweDAwMjksIDB4MDAxMCwgMHgwODBjLCAweDQ4NWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NzA4YiwgMHgwMDE5LCAweDA4MGMsIDB4NDhkMiwgMHgyMGEzLCAweDExMDYsCisJMHgyMGEzLCAweDAwMDAsIDB4MzQzMCwgMHgyMDk5LCAweGIyOGUsIDB4MjAzOSwgMHhiMjBlLCAweDI3YTAsCisJMHgyMGE5LCAweDAwNDAsIDB4NTNhMywgMHgwODBjLCAweDQ5MTcsIDB4MTFlOCwgMHgyNzI4LCAweDI1MTQsCisJMHg4MjA3LCAweGEwODQsIDB4MDBmZiwgMHg4MDAwLCAweDIwMTgsIDB4YTI5NCwgMHgwMGZmLCAweDgwMDcsCisJMHhhMjA1LCAweDIwMmEsIDB4NzA1MCwgMHgyMzEwLCAweDgyMTQsIDB4YTJhMCwgMHhiMjBlLCAweDI0MTQsCisJMHhhMzhjLCAweDAwMDEsIDB4MDExOCwgMHhhMjk0LCAweGZmMDAsIDB4MDAxOCwgMHhhMjk0LCAweDAwZmYsCisJMHg4MDA3LCAweGEyMTUsIDB4MjIyMiwgMHgyNzk4LCAweDI2YTAsIDB4MjBhOSwgMHgwMDQwLCAweDUzYTYsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsIDB4MDA4NCwgMHgwODBjLCAweDQ4NDUsCisJMHgwMDA1LCAweDAwZjYsIDB4NzA4MCwgMHhhMDA1LCAweDAxZDAsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsCisJMHg2NTBkLCAweGEwODYsIDB4MDA4NCwgMHgxMTg4LCAweDIwNzksIDB4YjI4MCwgMHg3YTMwLCAweGEyOTYsCisJMHgxMTA3LCAweDExNTgsIDB4NzgzNCwgMHhhMDA1LCAweDExNDAsIDB4NzA4NywgMHgwMDAxLCAweDA4MGMsCisJMHg0OGI4LCAweDcwOGIsIDB4MDAxYSwgMHgwMDI5LCAweDAwMTAsIDB4MDgwYywgMHg0ODVlLCAweDAwZmUsCisJMHgwMDA1LCAweDcwOGIsIDB4MDAxYiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDIwOTksCisJMHhiMjgwLCAweDIwYTEsIDB4MDIwYiwgMHg3NDgwLCAweGE0ODAsIDB4MDAxOCwgMHhhMDgwLCAweDAwMDcsCisJMHhhMDg0LCAweDAzZjgsIDB4ODAwNCwgMHgyMGE4LCAweDUzYTYsIDB4NjBjMywgMHgwMDg0LCAweDA4MGMsCisJMHg0ODQ1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwODYsIDB4MDA5NiwgMHgyMDI5LCAweGFkNTIsCisJMHgyNTJjLCAweDIwYTksIDB4MDAwOCwgMHgyMDQxLCAweGIyMGUsIDB4MjhhMCwgMHgyMDk5LCAweGIyOGUsCisJMHg1M2EzLCAweDIwYTksIDB4MDAwOCwgMHgyMDExLCAweDAwMDcsIDB4ZDVkNCwgMHgwMTEwLCAweDIwMTEsCisJMHgwMDAwLCAweDI4MDAsIDB4YTIwMCwgMHgyMDBjLCAweGExYTYsIDB4ZmZmZiwgMHgxMTQ4LCAweGQ1ZDQsCisJMHgwMTEwLCAweDgyMTAsIDB4MDAwOCwgMHg4MjExLCAweDFmMDQsIDB4NDc2OSwgMHgwODA0LCAweDQ3ZDcsCisJMHg4MmZmLCAweDExNjAsIDB4ZDVkNCwgMHgwMTIwLCAweGExYTYsIDB4M2ZmZiwgMHgwZDkwLCAweDAwMjAsCisJMHhhMWE2LCAweDNmZmYsIDB4MDkwNCwgMHg0N2Q3LCAweGExOGQsIDB4YzAwMCwgMHgyMGE5LCAweDAwMTAsCisJMHgyMDE5LCAweDAwMDEsIDB4ZDVkNCwgMHgwMTEwLCAweDIwMTksIDB4MDAxMCwgMHgyMTIwLCAweGQ1ZDQsCisJMHgwMTEwLCAweDg0MjMsIDB4MDAwOCwgMHg4NDI0LCAweDEyNDAsIDB4ZDVkNCwgMHgwMTEwLCAweDgzMTksCisJMHgwMDA4LCAweDgzMTgsIDB4MWYwNCwgMHg0NzhmLCAweDA0ZDAsIDB4MjNhOCwgMHgyMDIxLCAweDAwMDEsCisJMHg4NDI2LCAweDg0MjUsIDB4MWYwNCwgMHg0N2ExLCAweDIzMjgsIDB4ODUyOSwgMHhhMmJlLCAweDAwMDcsCisJMHgwMTU4LCAweDAwMDYsIDB4MjAzOSwgMHgwMDA3LCAweDIyMDAsIDB4YTczYSwgMHgwMDBlLCAweDI3YTgsCisJMHhhNWE4LCAweDAwMTAsIDB4MWYwNCwgMHg0N2IwLCAweDc1NGUsIDB4YTVjOCwgMHgyYmU2LCAweDI5MmQsCisJMHhhNWFjLCAweDAwZmYsIDB4NzU3MiwgMHg2NTMyLCAweDY1MzYsIDB4MDAxNiwgMHgyNTA4LCAweDA4MGMsCisJMHgyNmEwLCAweDAwMWUsIDB4NjBlNywgMHgwMDAwLCAweDY1ZWEsIDB4MjAxOCwgMHgyMzA0LCAweGE0MDUsCisJMHgyMDFhLCAweDcwNzcsIDB4MDAwMSwgMHgyNmEwLCAweDI4OTgsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTYsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweGEwODUsIDB4MDAwMSwgMHgwMDI4LCAweGEwMDYsCisJMHgwMDE4LCAweGEwMDYsIDB4MDgwYywgMHgxNGY2LCAweDAwOWUsIDB4MDA4ZSwgMHgwMDA1LCAweDIxMTgsCisJMHgyMDIxLCAweDAwMDAsIDB4MjAwMSwgMHgwMDA3LCAweGEzOWEsIDB4MDAxMCwgMHgwMjE4LCAweDg0MjAsCisJMHg4MDAxLCAweDBjZDAsIDB4MjExOCwgMHg4NGZmLCAweDAxMjAsIDB4YTM5YSwgMHgwMDEwLCAweDg0MjEsCisJMHgxZGUwLCAweDIwMjEsIDB4MDAwMSwgMHg4M2ZmLCAweDAxMTgsIDB4ODQyMywgMHg4MzE5LCAweDFkZTgsCisJMHhhMjM4LCAweDI3MDQsIDB4YTQyYywgMHgxMWI4LCAweGE0MDUsIDB4MjAzYSwgMHg3MTRlLCAweGExYTAsCisJMHgyYmU2LCAweDI0MmQsIDB4YTVhYywgMHgwMGZmLCAweDc1NzIsIDB4NjUzMiwgMHg2NTM2LCAweDAwMTYsCisJMHgyNTA4LCAweDA4MGMsIDB4MjZhMCwgMHgwMDFlLCAweDYwZTcsIDB4MDAwMCwgMHg2NWVhLCAweDcwNzcsCisJMHgwMDAxLCAweGEwODQsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLCAweDcwN2IsCisJMHgwMDAwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDIwNzEsCisJMHgwMTQwLCAweDA4MGMsIDB4NzgzNCwgMHg3MDA0LCAweGEwODQsIDB4NDAwMCwgMHgwMTIwLCAweDcwMDMsCisJMHgxMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFkMjIsCisJMHgyMDczLCAweDAwMDAsIDB4Nzg0MCwgMHgwMDI2LCAweDAwMTYsIDB4MjAwOSwgMHgwMGY3LCAweDA4MGMsCisJMHg0OGRlLCAweDAwMWUsIDB4YTA5NCwgMHgwMDEwLCAweGEyODUsIDB4MDA4MCwgMHg3ODQyLCAweDdhNDIsCisJMHgwMDJlLCAweDAxMmUsIDB4MDBmZSwgMHgwMGVlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDExLCAweGFmZDEsIDB4MjAxMywgMHgwMDAwLCAweDcwODMsIDB4MDAwMCwgMHgwMTJlLCAweDIwZTEsCisJMHg5MDgwLCAweDYwYTMsIDB4MDA1NiwgMHg2MGE3LCAweDk1NzUsIDB4MDgwYywgMHg3ODJiLCAweDIwMDksCisJMHgwN2QwLCAweDIwMTEsIDB4NDgxYiwgMHgwODBjLCAweDY1OTMsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsCisJMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4MDBmNywgMHgwODBjLCAweDQ4ZGUsCisJMHgyMDYxLCAweGFmZGEsIDB4NjAxYiwgMHgwMDAwLCAweDYwMWYsIDB4MDAwMCwgMHgyMDYxLCAweGFkMDAsCisJMHg2MDAzLCAweDAwMDEsIDB4MjA2MSwgMHgwMTAwLCAweDYwNDMsIDB4MDA5MCwgMHg2MDQzLCAweDAwMTAsCisJMHgyMDA5LCAweDAwMmQsIDB4MjAxMSwgMHg0ODgzLCAweDA4MGMsIDB4NjUwMSwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweDAxMDAsIDB4MDgwYywgMHg3ODM0LCAweDIwNzEsIDB4MDE0MCwgMHg3MDA0LCAweGEwODQsCisJMHg0MDAwLCAweDAxMjAsIDB4NzAwMywgMHgxMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgwODBjLCAweDU3NTcsCisJMHgwMWE4LCAweDA4MGMsIDB4NTc3NSwgMHgxMTkwLCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLCAweGFhYWEsCisJMHgwMDE2LCAweDA4MGMsIDB4Mjc0NCwgMHgyMDAxLCAweGFmOGUsIDB4MjEwMiwgMHgwMDFlLCAweDIwMDEsCisJMHhhZjllLCAweDIwMDMsIDB4MDAwMCwgMHgwODBjLCAweDU2OWEsIDB4MDAzMCwgMHgyMDAxLCAweDAwMDEsCisJMHgwODBjLCAweDI2MWUsIDB4MDgwYywgMHg0ODVlLCAweDAxMmUsIDB4MDAwZSwgMHgwMGVlLCAweDAwMDUsCisJMHgyMGE5LCAweDAwNDAsIDB4MjBhMSwgMHhiM2MwLCAweDIwOTksIDB4YjI4ZSwgMHgzMzA0LCAweDgwMDcsCisJMHgyMGEyLCAweDkzOTgsIDB4OTRhMCwgMHgxZjA0LCAweDQ4YmUsIDB4MDAwNSwgMHgyMGUxLCAweDkwODAsCisJMHgyMGUxLCAweDQwMDAsIDB4MjA5OSwgMHhiMjAwLCAweDIwYTEsIDB4MDIwYiwgMHgyMGE5LCAweDAwMGMsCisJMHg1M2E2LCAweDAwMDUsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHgyMDk5LCAweGIyODAsCisJMHgyMGExLCAweDAyMGIsIDB4MjBhOSwgMHgwMDBjLCAweDUzYTYsIDB4MDAwNSwgMHgwMGM2LCAweDAwMDYsCisJMHgyMDYxLCAweDAxMDAsIDB4ODEwZiwgMHgyMDAxLCAweGFkMzAsIDB4MjAwNCwgMHhhMDA1LCAweDExMzgsCisJMHgyMDAxLCAweGFkMTQsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTEwNSwgMHgwMDEwLCAweGExODUsCisJMHgwMGY3LCAweDYwNGEsIDB4MDAwZSwgMHgwMGNlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDQ2LCAweDIwMDEsCisJMHhhZDUyLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTU4LCAweGEwMDYsIDB4MjAyMCwgMHgyMDA5LCAweDAwMmEsCisJMHgwODBjLCAweGE5NmMsIDB4MjAwMSwgMHhhZDBjLCAweDIwMGMsIDB4YzE5NSwgMHgyMTAyLCAweDIwMTksCisJMHgwMDJhLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJhYWMsIDB4MDA0ZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwODBjLCAweDQ4NWUsIDB4NzA4YiwgMHgwMDAwLCAweDcwODMsIDB4MDAwMCwgMHgwMDA1LCAweDAwMDYsCisJMHgyMDAxLCAweGFkMGMsIDB4MjAwNCwgMHhkMDljLCAweDAxMDAsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwMDE2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDEsIDB4MDEwMSwgMHgyMDBjLCAweGExOGQsCisJMHgwMDA2LCAweDIxMDIsIDB4MDEyZSwgMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMTU2LCAweDIwYTksCisJMHgwMGZmLCAweDIwMDksIDB4YWUzNCwgMHhhMDA2LCAweDIwMGEsIDB4ODEwOCwgMHgxZjA0LCAweDQ5MzQsCisJMHgwMTVlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDIwNjksCisJMHhhZDUxLCAweGEwMDYsIDB4NjAwMiwgMHg2MDA3LCAweDA3MDcsIDB4NjAwYSwgMHg2MDBlLCAweDYwMTIsCisJMHhhMTk4LCAweDJiZTYsIDB4MjMxZCwgMHhhMzljLCAweDAwZmYsIDB4NjMxNiwgMHgyMGE5LCAweDAwMDQsCisJMHhhYzk4LCAweDAwMDYsIDB4MjNhMCwgMHg0MGE0LCAweDIwYTksIDB4MDAwNCwgMHhhYzk4LCAweDAwMGEsCisJMHgyM2EwLCAweDQwYTQsIDB4NjAzZSwgMHg2MDQyLCAweDYwNGUsIDB4NjA1MiwgMHg2MDU2LCAweDYwNWEsCisJMHg2MDVlLCAweDYwNjIsIDB4NjA2NiwgMHg2MDZhLCAweDYwNmUsIDB4NjA3MiwgMHg2MDc2LCAweDYwN2EsCisJMHg2MDdlLCAweDYwODIsIDB4NjA4NiwgMHg2MDhhLCAweDYwOGUsIDB4NjA5MiwgMHg2MDk2LCAweDYwOWEsCisJMHg2MDllLCAweDYwYWUsIDB4NjFhMiwgMHgwMGQ2LCAweDYwYTQsIDB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsCisJMHgxNWYwLCAweDYwYTcsIDB4MDAwMCwgMHg2MGE4LCAweGEwNmQsIDB4MDExMCwgMHgwODBjLCAweDE1ZjAsCisJMHg2MGFiLCAweDAwMDAsIDB4MDBkZSwgMHhhMDA2LCAweDYwNGEsIDB4NjgxMCwgMHg2MDNhLCAweDY4MGMsCisJMHg2MDQ2LCAweDY4MTQsIDB4YTA4NCwgMHgwMGZmLCAweDYwNDIsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMDNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2OTQ0LCAweDZlNDgsCisJMHhhNjg0LCAweDNmZmYsIDB4YTA4MiwgMHg0MDAwLCAweDFhMDQsIDB4NGE0OSwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweGExODIsIDB4MDBmZiwgMHgxYTA0LCAweDRhNGUsIDB4MjAwMSwgMHhhZDBjLCAweDIwMDQsCisJMHhhMDg0LCAweDAwMDMsIDB4MDFjMCwgMHgyMDAxLCAweGFkMGMsIDB4MjAwNCwgMHhkMDg0LCAweDE5MDQsCisJMHg0YTMxLCAweGExODgsIDB4YWUzNCwgMHgyMTA0LCAweGEwNjUsIDB4MDkwNCwgMHg0YTMxLCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDE5MDQsIDB4NGEzMSwgMHg2MDAwLCAweGQwYzQsCisJMHgwOTA0LCAweDRhMzEsIDB4MDA2OCwgMHhhMTg4LCAweGFlMzQsIDB4MjEwNCwgMHhhMDY1LCAweDA5MDQsCisJMHg0YTE1LCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgxOTA0LCAweDRhMWEsCisJMHg2MGE0LCAweGEwMGQsIDB4MDExOCwgMHgwODBjLCAweDRlZjksIDB4MDVkMCwgMHg2MGE4LCAweGEwMGQsCisJMHgwMTg4LCAweDA4MGMsIDB4NGY0MywgMHgxMTcwLCAweDY5NGMsIDB4ZDFmYywgMHgxMTE4LCAweDA4MGMsCisJMHg0YzExLCAweDA0NDgsIDB4MDgwYywgMHg0YmQzLCAweDY5NGMsIDB4ZDFlYywgMHgxNTIwLCAweDA4MGMsCisJMHg0ZGVkLCAweDA0MDgsIDB4Njk0YywgMHhhMTg0LCAweGEwMDAsIDB4MDE3OCwgMHhkMWVjLCAweDAxNDAsCisJMHhkMWZjLCAweDAxMTgsIDB4MDgwYywgMHg0ZGZjLCAweDAwMjgsIDB4MDgwYywgMHg0ZGZjLCAweDAwMjgsCisJMHhkMWZjLCAweDAxMTgsIDB4MDgwYywgMHg0YmQzLCAweDAwNzAsIDB4NjA1MCwgMHhhMDBkLCAweDAxMzAsCisJMHgyZDAwLCAweDIwMGEsIDB4NjgwMywgMHgwMDAwLCAweDYwNTIsIDB4MDAyOCwgMHgyZDAwLCAweDYwNTIsCisJMHg2MDRlLCAweDY4MDMsIDB4MDAwMCwgMHgwODBjLCAweDY3YzUsIDB4YTAwNiwgMHgwMTJlLCAweDAwMDUsCisJMHgyMDAxLCAweDAwMDUsIDB4MjAwOSwgMHgwMDAwLCAweDA0ZTgsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksCisJMHgwMDAwLCAweDA0YzAsIDB4YTA4MiwgMHgwMDA2LCAweDEyYTAsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsCisJMHhkMGFjLCAweDExNjAsIDB4NjBhMCwgMHhkMGJjLCAweDExNDgsIDB4NjEwMCwgMHhkMWZjLCAweDA5MDQsCisJMHg0OWQwLCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDEwMDAsIDB4MDQyMCwgMHgyMDAxLCAweDAwMjgsCisJMHgwMGE4LCAweDIwMDksIDB4YWQwYywgMHgyMTBjLCAweGQxOGMsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsCisJMHgwMDY4LCAweGQxODQsIDB4MDExOCwgMHgyMDAxLCAweDAwMDQsIDB4MDA0MCwgMHgyMDAxLCAweDAwMjksCisJMHg2MTAwLCAweGQxZmMsIDB4MDExOCwgMHgyMDA5LCAweDEwMDAsIDB4MDA2MCwgMHgyMDA5LCAweDAwMDAsCisJMHgwMDQ4LCAweDIwMDEsIDB4MDAyOSwgMHgyMDA5LCAweDAwMDAsIDB4MDAyMCwgMHgyMDAxLCAweDAwMjksCisJMHgyMDA5LCAweDAwMDAsIDB4YTAwNSwgMHgwMTJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDY4NDQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsIDB4MjAwOCwgMHhhMTgyLCAweDAwZmYsCisJMHgxYTA0LCAweDRhYTgsIDB4YTE4OCwgMHhhZTM0LCAweDIxMDQsIDB4YTA2NSwgMHgwMWMwLCAweDYwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDA2LCAweDExYTgsIDB4MmM3MCwgMHgwODBjLCAweDgwMjIsCisJMHgwNWU4LCAweDJlMDAsIDB4NjAxYSwgMHgyZDAwLCAweDYwMTIsIDB4NjAwYiwgMHhmZmZmLCAweDYwMWYsCisJMHgwMDBhLCAweDIwMDksIDB4MDAwMywgMHgwODBjLCAweDgwYTcsIDB4YTAwNiwgMHgwNDYwLCAweDIwMDEsCisJMHgwMDI4LCAweDA0NDAsIDB4YTA4MiwgMHgwMDA2LCAweDEyOTgsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsCisJMHhkMGFjLCAweDExNTgsIDB4NjBhMCwgMHhkMGJjLCAweDExNDAsIDB4NjEwMCwgMHhkMWZjLCAweDA5ZTgsCisJMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwYTgsIDB4MjAwMSwgMHgwMDI4LCAweDAwOTAsCisJMHgyMDA5LCAweGFkMGMsIDB4MjEwYywgMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwNTAsCisJMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMjgsIDB4MjAwMSwgMHgwMDI5LCAweDAwMTAsCisJMHgyMDAxLCAweDAwMjksIDB4YTAwNSwgMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMmMsCisJMHgwY2M4LCAweDAwZjYsIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDExLCAweDAwMDAsCisJMHgyMDc5LCAweGFkMDAsIDB4Njk0NCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwZmYsCisJMHgxYTA0LCAweDRiNzcsIDB4MjAwMSwgMHhhZDBjLCAweDIwMDQsIDB4YTA4NCwgMHgwMDAzLCAweDE5MDQsCisJMHg0YjY1LCAweDA4MGMsIDB4NGNkYywgMHgxMTgwLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODIsCisJMHgwMDA2LCAweDEyNTAsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgxOTA0LCAweDRiNjAsCisJMHg2MGEwLCAweGQwYmMsIDB4MTkwNCwgMHg0YjYwLCAweDY4NjQsIDB4YTBjNiwgMHgwMDZmLCAweDAxMTgsCisJMHgyMDA4LCAweDA4MDQsIDB4NGIyOCwgMHg2OTY4LCAweDIxNDAsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHg3OGQwLCAweGQwYWMsIDB4MTExOCwgMHhhMTgyLCAweDAwODAsIDB4MDZkMCwgMHhhMTgyLCAweDAwZmYsCisJMHgxNmI4LCAweDZhNzAsIDB4NmI2YywgMHg3ODZjLCAweGEzMDYsIDB4MTE2MCwgMHg3ODcwLCAweGEyNGUsCisJMHgxMTE4LCAweDIyMDgsIDB4MjMxMCwgMHgwNDYwLCAweGE5Y2MsIDB4ZmYwMCwgMHgxMTE4LCAweDIyMDgsCisJMHgyMzEwLCAweDA0MzAsIDB4MDgwYywgMHgzYjU4LCAweDJjNzAsIDB4MDU1MCwgMHgyMDA5LCAweDAwMDAsCisJMHgyMDExLCAweDAwMDAsIDB4YTBjNiwgMHg0MDAwLCAweDExNjAsIDB4MDAwNiwgMHgyZTYwLCAweDA4MGMsCisJMHg0ZjZlLCAweDExMDgsIDB4YzE4NSwgMHg3MDAwLCAweGQwYmMsIDB4MDEwOCwgMHhjMThkLCAweDAwMGUsCisJMHgwMDg4LCAweGEwYzYsIDB4NDAwNywgMHgxMTEwLCAweDI0MDgsIDB4MDA2MCwgMHhhMGM2LCAweDQwMDgsCisJMHgxMTE4LCAweDI3MDgsIDB4MjYxMCwgMHgwMDMwLCAweGEwYzYsIDB4NDAwOSwgMHgxMTA4LCAweDAwMTAsCisJMHgyMDAxLCAweDQwMDYsIDB4Njg2NiwgMHg2OTZhLCAweDZhNmUsIDB4MjAwMSwgMHgwMDMwLCAweDA0NTgsCisJMHgwODBjLCAweDgwMjIsIDB4MTEzOCwgMHgyMDAxLCAweDQwMDUsIDB4MjAwOSwgMHgwMDAzLCAweDIwMTEsCisJMHgwMDAwLCAweDBjODAsIDB4MmUwMCwgMHg2MDFhLCAweDA4MGMsIDB4OTk1NiwgMHgyZDAwLCAweDYwMTIsCisJMHg2MDFmLCAweDAwMDEsIDB4YTAwNiwgMHhkODhjLCAweDAxMTAsIDB4MjAwMSwgMHg0MDAwLCAweDY4M2EsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDJhZDksIDB4MDEyZSwgMHgyMDAxLCAweDAwMDAsCisJMHgwODBjLCAweDRjMWUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsIDB4NGMzMCwgMHgyMDA5LCAweDAwMDIsCisJMHgwODBjLCAweDgwYTcsIDB4YTAwNiwgMHhhMDA1LCAweDAxMmUsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDBjYjAsIDB4MjAwOSwgMHhhZDBjLCAweDIxMGMsCisJMHhkMThjLCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMzgsIDB4ZDE4NCwgMHgwMTE4LCAweDIwMDEsCisJMHgwMDA0LCAweDAwMTAsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHgwYzIwLCAweDIwMDEsCisJMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHgwOGY4LCAweDY5NDQsIDB4NmU0OCwgMHhhNjg0LCAweDNmZmYsCisJMHhhMDgyLCAweDQwMDAsIDB4MTZiOCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTgyLCAweDAwZmYsCisJMHgxMmUwLCAweGExODgsIDB4YWUzNCwgMHgyMTA0LCAweGEwNjUsIDB4MDFiOCwgMHg2MDA0LCAweGEwODQsCisJMHgwMGZmLCAweGEwOGUsIDB4MDAwNiwgMHgxMWIwLCAweDY4NGMsIDB4ZDBlYywgMHgwMTIwLCAweDA4MGMsCisJMHg0ZGZjLCAweDA0YzksIDB4MDAzMCwgMHgwNGI5LCAweDY4NGMsIDB4ZDBmYywgMHgwMTEwLCAweDA4MGMsCisJMHg0ZGVkLCAweDA4MGMsIDB4NGUzYSwgMHhhMDA2LCAweDAwYzgsIDB4MjAwMSwgMHgwMDI4LCAweDIwMDksCisJMHgwMDAwLCAweDAwYTAsIDB4YTA4MiwgMHgwMDA2LCAweDEyNDAsIDB4NjEwMCwgMHhkMWZjLCAweDBkMjAsCisJMHgyMDAxLCAweDAwMjksIDB4MjAwOSwgMHgxMDAwLCAweDAwNDgsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksCisJMHgwMDAwLCAweDAwMjAsIDB4MjAwMSwgMHgwMDI5LCAweDIwMDksIDB4MDAwMCwgMHhhMDA1LCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDUwLCAweGEwMGQsIDB4MDEzOCwgMHgyZDAwLCAweDIwMGEsCisJMHg2ODAzLCAweDAwMDAsIDB4NjA1MiwgMHgwMTJlLCAweDAwMDUsIDB4MmQwMCwgMHg2MDUyLCAweDYwNGUsCisJMHg2ODAzLCAweDAwMDAsIDB4MGNjMCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDRjLCAweGEwMDUsCisJMHgwMTcwLCAweDAwZTYsIDB4MjA3MSwgMHhhZmM3LCAweDcwMDQsIDB4YTA4NiwgMHgwMDAyLCAweDAxNjgsCisJMHgwMGVlLCAweDYwNGMsIDB4NjgwMiwgMHgyZDAwLCAweDYwNGUsIDB4MDEyZSwgMHgwMDA1LCAweDJkMDAsCisJMHg2MDUyLCAweDYwNGUsIDB4NjgwMywgMHgwMDAwLCAweDBjYzAsIDB4NzAxYywgMHhhYzA2LCAweDFkODAsCisJMHg2MDRjLCAweDIwNzAsIDB4NzAwMCwgMHg2ODAyLCAweDJkMDAsIDB4NzAwMiwgMHgwMGVlLCAweDAxMmUsCisJMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwNGMsIDB4YTA2ZCwgMHgwMTMwLCAweDY4MDAsCisJMHhhMDA1LCAweDExMDgsIDB4NjA1MiwgMHg2MDRlLCAweGFkMDUsIDB4MDEyZSwgMHgwMDA1LCAweDYwNGMsCisJMHhhMDZkLCAweDAxMzAsIDB4NjgwMCwgMHhhMDA1LCAweDExMDgsIDB4NjA1MiwgMHg2MDRlLCAweGFkMDUsCisJMHgwMDA1LCAweDY4MDMsIDB4MDAwMCwgMHg2MDg0LCAweGEwMGQsIDB4MDEyMCwgMHgyZDAwLCAweDIwMGEsCisJMHg2MDg2LCAweDAwMDUsIDB4MmQwMCwgMHg2MDg2LCAweDYwODIsIDB4MGNkOCwgMHgwMTI2LCAweDAwYzYsCisJMHgwMDI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjE4LCAweDIyNjAsIDB4NjIwMCwgMHhhMDA1LCAweDAxMTAsCisJMHhjMjg1LCAweDAwMDgsIDB4YzI4NCwgMHg2MjAyLCAweDAwMmUsIDB4MDBjZSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMTI2LCAweDAwYzYsIDB4MjA5MSwgMHg4MDAwLCAweDYyMTgsIDB4MjI2MCwgMHg2MjA0LCAweDAwMDYsCisJMHhhMDg2LCAweDAwMDYsIDB4MTE4MCwgMHg2MDljLCAweGQwYWMsIDB4MDE2OCwgMHgyMDAxLCAweGFkNTIsCisJMHgyMDA0LCAweGQwYTQsIDB4MDE0MCwgMHhhMjg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDg2LCAweDAwMDcsCisJMHgxMTEwLCAweDIwMTEsIDB4MDYwMCwgMHgwMDBlLCAweGEyOTQsIDB4ZmYwMCwgMHhhMjE1LCAweDYyMDYsCisJMHgwMDA2LCAweGEwODYsIDB4MDAwNiwgMHgxMTI4LCAweDYyOTAsIDB4ODJmZiwgMHgxMTEwLCAweDA4MGMsCisJMHgxNGY2LCAweDAwMGUsIDB4MDBjZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgwMGM2LCAweDIwOTEsCisJMHg4MDAwLCAweDYyMTgsIDB4MjI2MCwgMHg2MjA0LCAweDAwMDYsIDB4YTA4NiwgMHgwMDA2LCAweDExNzgsCisJMHg2MDljLCAweGQwYTQsIDB4MDE2MCwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGFjLCAweDExMzgsCisJMHhhMjg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA3LCAweDExMTAsIDB4MjAxMSwgMHgwMDA2LCAweDAwMGUsCisJMHhhMjk0LCAweDAwZmYsIDB4ODAwNywgMHhhMjE1LCAweDYyMDYsIDB4MDBjZSwgMHgwMTJlLCAweDAwMDUsCisJMHgwMDI2LCAweGExODIsIDB4MDBmZiwgMHgwMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMGIwLCAweGExOTAsCisJMHhhZTM0LCAweDIyMDQsIDB4YTA2NSwgMHgxMTgwLCAweDAwMTYsIDB4MDBkNiwgMHgwODBjLCAweDE1YzAsCisJMHgyZDYwLCAweDAwZGUsIDB4MDAxZSwgMHgwZDgwLCAweDJjMDAsIDB4MjAxMiwgMHg2MGE3LCAweDAwMDAsCisJMHg2MGFiLCAweDAwMDAsIDB4MDgwYywgMHg0OTNhLCAweGEwMDYsIDB4MDAyZSwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDAyNiwgMHhhMTgyLCAweDAwZmYsIDB4MDIxOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwNDgwLCAweDAwZDYsIDB4YTE5MCwgMHhhZTM0LCAweDIyMDQsIDB4YTA2ZCwgMHgwNTQwLCAweDIwMTMsCisJMHgwMDAwLCAweDAwZDYsIDB4MDBjNiwgMHgyZDYwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsCisJMHgxNWYwLCAweDYwYTgsIDB4YTA2ZCwgMHgwMTEwLCAweDA4MGMsIDB4MTVmMCwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGQ2LCAweDAwYzYsIDB4NjhhYywgMHgyMDYwLCAweDhjZmYsIDB4MDE2OCwgMHg2MDBjLCAweDAwMDYsCisJMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxMTAsIDB4MDgwYywgMHgxNjAwLCAweDA4MGMsCisJMHg4MDc4LCAweDAwY2UsIDB4MGM4OCwgMHgwMGNlLCAweDAwZGUsIDB4MDgwYywgMHgxNWYwLCAweDAwZGUsCisJMHhhMDA2LCAweDAwMmUsIDB4MDEyZSwgMHgwMDA1LCAweDAwMTYsIDB4YTE4MiwgMHgwMGZmLCAweDAyMTgsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAzMCwgMHhhMTg4LCAweGFlMzQsIDB4MjEwNCwgMHhhMDY1LCAweDBkYzAsCisJMHhhMDA2LCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDYwMGIsCisJMHgwMDAwLCAweDYwMGYsIDB4MDAwMCwgMHg2MDAwLCAweGMwOGMsIDB4NjAwMiwgMHgwODBjLCAweDU3NGYsCisJMHgxNTM4LCAweDYwYTAsIDB4YTA4NiwgMHgwMDdlLCAweDIwNjksIDB4YjI5MCwgMHgwMTMwLCAweDIwMDEsCisJMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgxMWUwLCAweDAwOTgsIDB4MmQwNCwgMHhkMGU0LCAweDAxYzAsCisJMHgwMGQ2LCAweDIwNjksIDB4YjI4ZSwgMHgwMGM2LCAweDIwNjEsIDB4YWY5ZiwgMHg2ODEwLCAweDIwNjIsCisJMHg2ODE0LCAweDYwMDYsIDB4NjgxOCwgMHg2MDBhLCAweDY4MWMsIDB4NjAwZSwgMHgwMGNlLCAweDAwZGUsCisJMHg4ZDY5LCAweDJkMDQsIDB4MjA2OSwgMHgwMTQwLCAweDY4ODYsIDB4MjA2OSwgMHhhZDAwLCAweDY4YTIsCisJMHgyMDY5LCAweGIyOGUsIDB4NjgwOCwgMHg2MDVlLCAweDY4MTAsIDB4NjA2MiwgMHg2MTM4LCAweGExMGEsCisJMHgwMjA4LCAweDYwM2EsIDB4NjgxNCwgMHg2MDY2LCAweDIwOTksIDB4YjI5NiwgMHhhYzg4LCAweDAwMGEsCisJMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwOTksIDB4YjI5YSwgMHhhYzg4LCAweDAwMDYsCisJMHgyMWEwLCAweDIwYTksIDB4MDAwNCwgMHg1M2EzLCAweDIwNjksIDB4YjJhZSwgMHg2ODA4LCAweDYwNmEsCisJMHg2OTBjLCAweDYxNmUsIDB4NjgxMCwgMHg2MDcyLCAweDY4MTgsIDB4NjA3NiwgMHhhMTgyLCAweDAyMTEsCisJMHgxMjE4LCAweDIwMDksIDB4MDAwOCwgMHgwNDAwLCAweGExODIsIDB4MDI1OSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDA3LCAweDAwZDAsIDB4YTE4MiwgMHgwMmMxLCAweDEyMTgsIDB4MjAwOSwgMHgwMDA2LCAweDAwYTAsCisJMHhhMTgyLCAweDAzNDksIDB4MTIxOCwgMHgyMDA5LCAweDAwMDUsIDB4MDA3MCwgMHhhMTgyLCAweDA0MjEsCisJMHgxMjE4LCAweDIwMDksIDB4MDAwNCwgMHgwMDQwLCAweGExODIsIDB4MDU4MSwgMHgxMjE4LCAweDIwMDksCisJMHgwMDAzLCAweDAwMTAsIDB4MjAwOSwgMHgwMDAyLCAweDYxOTIsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMGRlLCAweDAwMDUsIDB4MDAxNiwgMHgwMDI2LCAweDAwZTYsIDB4MjA3MSwgMHhiMjhkLCAweDJlMDQsCisJMHg2ODk2LCAweDIwNzEsIDB4YjI4ZSwgMHg3MDA0LCAweDY4OWEsIDB4NzAxYywgMHg2ODllLCAweDZhMDAsCisJMHgyMDA5LCAweGFkNzEsIDB4MjEwYywgMHhkMGJjLCAweDAxMjAsIDB4ZDFlYywgMHgwMTEwLCAweGMyYWQsCisJMHgwMDA4LCAweGMyYWMsIDB4ZDBjNCwgMHgwMTIwLCAweGQxZTQsIDB4MDExMCwgMHhjMmJkLCAweDAwMDgsCisJMHhjMmJjLCAweDZhMDIsIDB4MDBlZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NjBhNCwgMHhhMDZkLCAweDAxYzAsIDB4NjkwMCwgMHg4MWZmLCAweDE1NDAsCisJMHg2YTA0LCAweGEyODIsIDB4MDAxMCwgMHgxNjQ4LCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTAsCisJMHgyMTA0LCAweGEwODYsIDB4ZmZmZiwgMHgwMTI4LCAweDgxMDgsIDB4MWYwNCwgMHg0ZGE4LCAweDA4MGMsCisJMHgxNGY2LCAweDI2MGEsIDB4ODIxMCwgMHg2YTA2LCAweDAwOTgsIDB4MDgwYywgMHgxNWQ5LCAweDAxYTgsCisJMHgyZDAwLCAweDYwYTYsIDB4NjgwMywgMHgwMDAwLCAweGFkODgsIDB4MDAwNCwgMHgyMGE5LCAweDAwMTAsCisJMHgyMDBiLCAweGZmZmYsIDB4ODEwOCwgMHgxZjA0LCAweDRkYzAsIDB4NjgwNywgMHgwMDAxLCAweDZlMTIsCisJMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2Q4LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDBkNiwgMHg2MGE0LCAweGEwMGQsIDB4MDFhMCwgMHgyMTY4LCAweDY4MDAsCisJMHhhMDA1LCAweDExNjAsIDB4MDgwYywgMHg0ZWY5LCAweDExNjgsIDB4MjAwYiwgMHhmZmZmLCAweDY4MDQsCisJMHhhMDhhLCAweDAwMDIsIDB4MDIxOCwgMHg4MDAxLCAweDY4MDYsIDB4MDAyMCwgMHgwODBjLCAweDE1ZjAsCisJMHg2MGE3LCAweDAwMDAsIDB4MDBkZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDRmNTYsIDB4MDAxMCwgMHgwODBjLCAweDRiYzAsIDB4MDgwYywgMHg0ZTcxLCAweDFkZDgsCisJMHgwODBjLCAweDRlM2EsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MGE4LCAweGEwNmQsIDB4MDFjMCwgMHg2OTUwLCAweDgxZmYsIDB4MTU0MCwgMHg2YTU0LCAweGEyODIsCisJMHgwMDEwLCAweDE2NzAsIDB4YWQ4OCwgMHgwMDE4LCAweDIwYTksIDB4MDAxMCwgMHgyMTA0LCAweGEwODYsCisJMHhmZmZmLCAweDAxMjgsIDB4ODEwOCwgMHgxZjA0LCAweDRlMGUsIDB4MDgwYywgMHgxNGY2LCAweDI2MGEsCisJMHg4MjEwLCAweDZhNTYsIDB4MDA5OCwgMHgwODBjLCAweDE1ZDksIDB4MDFkMCwgMHgyZDAwLCAweDYwYWEsCisJMHg2ODUzLCAweDAwMDAsIDB4YWQ4OCwgMHgwMDE4LCAweDIwYTksIDB4MDAxMCwgMHgyMDBiLCAweGZmZmYsCisJMHg4MTA4LCAweDFmMDQsIDB4NGUyNiwgMHg2ODU3LCAweDAwMDEsIDB4NmU2MiwgMHgwMDEwLCAweDA4MGMsCisJMHg0YzExLCAweDAwODksIDB4MWRlMCwgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2N2M1LCAweDAxMmUsCisJMHgwMDA1LCAweGEwMWUsIDB4MDAxMCwgMHgyMDE5LCAweDAwMDEsIDB4YTAwZSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwNGMsIDB4MjA2OCwgMHg2MDAwLCAweGQwZGMsIDB4MTE3MCwgMHg4ZGZmLCAweDAxZTgsCisJMHg4M2ZmLCAweDAxMjAsIDB4Njg0OCwgMHhhNjA2LCAweDAxNTgsIDB4MDAzMCwgMHg2ODNjLCAweGE0MDYsCisJMHgxMTE4LCAweDY4NDAsIDB4YTUwNiwgMHgwMTIwLCAweDJkMDgsIDB4NjgwMCwgMHgyMDY4LCAweDBjNzAsCisJMHg2YTAwLCAweDYwNGMsIDB4YWQwNiwgMHgxMTEwLCAweDYyNGUsIDB4MDAxOCwgMHhhMTgwLCAweDAwMDAsCisJMHgyMjAyLCAweDgyZmYsIDB4MTExMCwgMHg2MTUyLCAweDhkZmYsIDB4MDEyZSwgMHgwMDA1LCAweGEwMWUsCisJMHgwMDEwLCAweDIwMTksIDB4MDAwMSwgMHhhMDBlLCAweDYwODAsIDB4MjA2OCwgMHg4ZGZmLCAweDAxZTgsCisJMHg4M2ZmLCAweDAxMjAsIDB4Njg0OCwgMHhhNjA2LCAweDAxNTgsIDB4MDAzMCwgMHg2ODNjLCAweGE0MDYsCisJMHgxMTE4LCAweDY4NDAsIDB4YTUwNiwgMHgwMTIwLCAweDJkMDgsIDB4NjgwMCwgMHgyMDY4LCAweDBjNzAsCisJMHg2YTAwLCAweDYwODAsIDB4YWQwNiwgMHgxMTEwLCAweDYyODIsIDB4MDAxOCwgMHhhMTgwLCAweDAwMDAsCisJMHgyMjAyLCAweDgyZmYsIDB4MTExMCwgMHg2MTg2LCAweDhkZmYsIDB4MDAwNSwgMHhhMDE2LCAweDA4MGMsCisJMHg0ZWYzLCAweDExMTAsIDB4MjAxMSwgMHgwMDAxLCAweDA4MGMsIDB4NGYzZCwgMHgxMTEwLCAweGEyOTUsCisJMHgwMDAyLCAweDAwMDUsIDB4MDgwYywgMHg0ZjZlLCAweDAxMTgsIDB4MDgwYywgMHg5NjRiLCAweDAwMTAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDRmNmUsIDB4MDExOCwgMHgwODBjLCAweDk1ZTQsCisJMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDA4MGMsIDB4NGY2ZSwgMHgwMTE4LCAweDA4MGMsCisJMHg5NjJlLCAweDAwMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsIDB4MDgwYywgMHg0ZjZlLCAweDAxMTgsCisJMHgwODBjLCAweDk2MDAsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDRmNmUsCisJMHgwMTE4LCAweDA4MGMsIDB4OTY2NywgMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweDAxMjYsCisJMHgwMDA2LCAweDAwZDYsIDB4MjA5MSwgMHg4MDAwLCAweDYwODAsIDB4YTA2ZCwgMHgwMWEwLCAweDY4MDAsCisJMHgwMDA2LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDk3ZmQsCisJMHgwMDA2LCAweDYwMDAsIDB4ZDBmYywgMHgwMTEwLCAweDA4MGMsIDB4YWMwMywgMHgwMDBlLCAweDA4MGMsCisJMHg1MTBjLCAweDAwMGUsIDB4MGM1MCwgMHg2MDgzLCAweDAwMDAsIDB4NjA4NywgMHgwMDAwLCAweDAwZGUsCisJMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHg2MGE0LCAweGEwMGQsIDB4MTExOCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDA1LCAweDAwZTYsIDB4MjE3MCwgMHg3MDAwLCAweGEwMDUsIDB4MTE2MCwgMHgyMGE5LCAweDAwMTAsCisJMHhhZTg4LCAweDAwMDQsIDB4MjEwNCwgMHhhNjA2LCAweDAxMjgsIDB4ODEwOCwgMHgxZjA0LCAweDRmMDIsCisJMHhhMDg1LCAweDAwMDEsIDB4YTAwNiwgMHgwMGVlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwgMHgxMTI4LCAweDA4MGMsIDB4MTVkOSwgMHgwMWEwLCAweDJkMDAsCisJMHg2MGE2LCAweDY4MDMsIDB4MDAwMSwgMHg2ODA3LCAweDAwMDAsIDB4YWQ4OCwgMHgwMDA0LCAweDIwYTksCisJMHgwMDEwLCAweDIwMGIsIDB4ZmZmZiwgMHg4MTA4LCAweDFmMDQsIDB4NGYyMSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDgsIDB4MDBkNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDYwYTQsIDB4YTA2ZCwgMHgwMTMwLCAweDYwYTcsIDB4MDAwMCwgMHgwODBjLCAweDE1ZjAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGRlLCAweDAwMDUsIDB4NjBhOCwgMHhhMDBkLCAweDExMTgsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGU2LCAweDIxNzAsIDB4NzA1MCwgMHhhMDA1LCAweDExNjAsCisJMHgyMGE5LCAweDAwMTAsIDB4YWU4OCwgMHgwMDE4LCAweDIxMDQsIDB4YTYwNiwgMHgwMTI4LCAweDgxMDgsCisJMHgxZjA0LCAweDRmNGMsIDB4YTA4NSwgMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDBjMTksIDB4MTE4OCwgMHgyMDBiLCAweGZmZmYsIDB4MDBkNiwgMHg2MGE4LCAweDIwNjgsCisJMHg2ODU0LCAweGEwOGEsIDB4MDAwMiwgMHgwMjE4LCAweDgwMDEsIDB4Njg1NiwgMHgwMDIwLCAweDA4MGMsCisJMHgxNWYwLCAweDYwYWIsIDB4MDAwMCwgMHgwMGRlLCAweDAxMmUsIDB4MDAwNSwgMHg2MDljLCAweGQwYTQsCisJMHgwMDA1LCAweDAwZjYsIDB4MDgwYywgMHg1NzRmLCAweDAxYjAsIDB4NzFiNCwgMHg4MWZmLCAweDExOTgsCisJMHg3MWQwLCAweGQxOWMsIDB4MDE4MCwgMHgyMDAxLCAweDAwN2UsIDB4YTA4MCwgMHhhZTM0LCAweDIwMDQsCisJMHhhMDdkLCAweDAxNDgsIDB4NzgwNCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDExMTgsCisJMHg3ODAwLCAweGMwZWQsIDB4NzgwMiwgMHgyMDc5LCAweGFkNTEsIDB4NzgwNCwgMHhkMGE0LCAweDAxZTgsCisJMHgwMTU2LCAweDAwYzYsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDA4MGMsCisJMHg0Y2RjLCAweDExNjgsIDB4NjAwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHhhMDk2LCAweDAwMDQsCisJMHgwMTE4LCAweGEwODYsIDB4MDAwNiwgMHgxMTE4LCAweDYwMDAsIDB4YzBlZCwgMHg2MDAyLCAweDAwMWUsCisJMHg4MTA4LCAweDFmMDQsIDB4NGY5NiwgMHgwMGNlLCAweDAxNWUsIDB4MDgwYywgMHg1MDJkLCAweDAxMjAsCisJMHgyMDAxLCAweGFmYTIsIDB4MjAwYywgMHgwMDM4LCAweDIwNzksIDB4YWQ1MSwgMHg3ODA0LCAweGQwYTQsCisJMHgwMTMwLCAweDIwMDksIDB4MDdkMCwgMHgyMDExLCAweDRmYzEsIDB4MDgwYywgMHg2NTkzLCAweDAwZmUsCisJMHgwMDA1LCAweDIwMTEsIDB4NGZjMSwgMHgwODBjLCAweDY1MGQsIDB4MDgwYywgMHg1MDJkLCAweDAxZjAsCisJMHgyMDAxLCAweGFlYjIsIDB4MjAwNCwgMHhhMDgwLCAweDAwMDAsIDB4MjAwYywgMHhjMWVjLCAweDIxMDIsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGE0LCAweDAxMzAsIDB4MjAwOSwgMHgwN2QwLCAweDIwMTEsCisJMHg0ZmMxLCAweDA4MGMsIDB4NjU5MywgMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHg3MDZmLCAweDAwMDAsCisJMHg3MDczLCAweDAwMDAsIDB4MDgwYywgMHgyOGZhLCAweDAwZWUsIDB4MDRiMCwgMHgwMTU2LCAweDAwYzYsCisJMHgyMGE5LCAweDAwN2YsIDB4MjAwOSwgMHgwMDAwLCAweDAwMTYsIDB4MDgwYywgMHg0Y2RjLCAweDE1MzAsCisJMHg2MDAwLCAweGQwZWMsIDB4MDUxOCwgMHgwMDQ2LCAweDYyYTAsIDB4YTI5NCwgMHgwMGZmLCAweDgyMjcsCisJMHhhMDA2LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGE5NmMsIDB4NjAwMCwgMHhjMGU1LCAweGMwZWMsCisJMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODUsIDB4MDcwMCwgMHg2MDA2LCAweDIwMTksCisJMHgwMDI5LCAweDA4MGMsIDB4NjhlNywgMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDY4MWQsCisJMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHhhNzEyLCAweDAwN2UsIDB4MDA0ZSwgMHgwMDFlLCAweDgxMDgsCisJMHgxZjA0LCAweDRmZWMsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsIDB4MDBjNiwgMHg2MDE4LCAweDIwNjAsCisJMHg2MDAwLCAweGMwZWMsIDB4NjAwMiwgMHgwMGNlLCAweDAwMDUsIDB4NzgxOCwgMHgyMDA0LCAweGQwYWMsCisJMHgwMDA1LCAweDc4MTgsIDB4MjAwNCwgMHhkMGJjLCAweDAwMDUsIDB4MDBmNiwgMHgyMDAxLCAweGFlYjIsCisJMHgyMDA0LCAweGEwN2QsIDB4MDExMCwgMHg3ODAwLCAweGQwZWMsIDB4MDBmZSwgMHgwMDA1LCAweDAxMjYsCisJMHgwMDI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MjAwLCAweGEwMDUsIDB4MDExMCwgMHhjMmZkLCAweDAwMDgsCisJMHhjMmZjLCAweDYyMDIsIDB4MDAyZSwgMHgwMTJlLCAweDAwMDUsIDB4MjA3MSwgMHhhZTEzLCAweDcwMDMsCisJMHgwMDAxLCAweDcwMDcsIDB4MDAwMCwgMHg3MDEzLCAweDAwMDAsIDB4NzAxNywgMHgwMDAwLCAweDcwMWIsCisJMHgwMDAwLCAweDcwMWYsIDB4MDAwMCwgMHg3MDBiLCAweDAwMDAsIDB4NzA0YiwgMHgwMDAxLCAweDcwNGYsCisJMHgwMDAwLCAweDcwNWIsIDB4MDAyMCwgMHg3MDVmLCAweDAwNDAsIDB4NzA3ZiwgMHgwMDAwLCAweDIwNzEsCisJMHhhZjdjLCAweDcwMDMsIDB4YWUxMywgMHg3MDA3LCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDcwMGYsCisJMHhhZjVjLCAweDcwMTMsIDB4MDAyMCwgMHg3MDE3LCAweDAwNDAsIDB4NzAzNywgMHgwMDAwLCAweDAwMDUsCisJMHgwMDE2LCAweDAwZTYsIDB4MjA3MSwgMHhhZjM0LCAweGEwMGUsIDB4NzE4NiwgMHg3MThhLCAweDcwOTcsCisJMHgwMDAxLCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LCAweGQwZmMsIDB4MTE1MCwgMHgyMDAxLCAweGFkNTIsCisJMHgyMDA0LCAweGEwMGUsIDB4ZDA5YywgMHgwMTA4LCAweDgxMDgsIDB4NzEwMiwgMHgwODA0LCAweDUwZDYsCisJMHgyMDAxLCAweGFkNzEsIDB4MjAwYywgMHhhMTg0LCAweDAwMGYsIDB4MjAwOSwgMHhhZDcyLCAweDIxMGMsCisJMHgwMDAyLCAweDUwN2UsIDB4NTBiMSwgMHg1MGI4LCAweDUwYzIsIDB4NTBjNywgMHg1MDdlLCAweDUwN2UsCisJMHg1MDdlLCAweDUwYTEsIDB4NTA3ZSwgMHg1MDdlLCAweDUwN2UsIDB4NTA3ZSwgMHg1MDdlLCAweDUwN2UsCisJMHg1MDdlLCAweDcwMDMsIDB4MDAwNCwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgyMDk5LCAweGFkNzUsCisJMHgyMGExLCAweGFmODUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsCisJMHgwNDI4LCAweDcwOGYsIDB4MDAwNSwgMHg3MDA3LCAweDAxMjIsIDB4MjAwMSwgMHgwMDAyLCAweDAwMzAsCisJMHg3MDhmLCAweDAwMDIsIDB4NzAwNywgMHgwMTIxLCAweDIwMDEsIDB4MDAwMywgMHg3MDAyLCAweDcwOTcsCisJMHgwMDAxLCAweDAwODgsIDB4NzAwNywgMHgwMTIyLCAweDIwMDEsIDB4MDAwMiwgMHgwMDIwLCAweDcwMDcsCisJMHgwMTIxLCAweDIwMDEsIDB4MDAwMywgMHg3MDAyLCAweGEwMDYsIDB4NzA5NiwgMHg3MDhlLCAweGExODQsCisJMHhmZjAwLCAweDgwMDcsIDB4NzA5YSwgMHhhMTg0LCAweDAwZmYsIDB4NzA5MiwgMHgwMGVlLCAweDAwMWUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZTEzLCAweDY4NGMsIDB4YTAwNSwgMHgxMTMwLCAweDcwMjgsCisJMHhjMDg1LCAweDcwMmEsIDB4YTA4NSwgMHgwMDAxLCAweDA0MjgsIDB4NmE2MCwgMHg3MjM2LCAweDZiNjQsCisJMHg3MzNhLCAweDY4NjgsIDB4NzAzZSwgMHg3MDc2LCAweDY4NmMsIDB4NzA0MiwgMHg3MDdhLCAweDY4NGMsCisJMHg3MDJlLCAweDY4NDQsIDB4NzAzMiwgMHgyMDA5LCAweDAwMGQsIDB4MjAwYSwgMHg3MDBiLCAweDAwMDAsCisJMHg4MDA3LCAweDgwMDYsIDB4ODAwNiwgMHhhMDhjLCAweDAwM2YsIDB4YTA4NCwgMHhmZmMwLCAweGEyMTAsCisJMHgyMTAwLCAweGEzMTksIDB4NzI2ZSwgMHg3MzcyLCAweDcwMjgsIDB4YzA4NCwgMHg3MDJhLCAweDcwMDcsCisJMHgwMDAxLCAweGEwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDAxNTYsIDB4MDBlNiwgMHgwMDI2LCAweDY4MzgsCisJMHhkMGZjLCAweDE5MDQsIDB4NTE2NSwgMHg2ODA0LCAweGEwMGQsIDB4MDE4OCwgMHgwMGQ2LCAweDIwNzEsCisJMHhhZDAwLCAweGEwMTYsIDB4NzAyYywgMHgyMTY4LCAweDY5MDQsIDB4MjA2YSwgMHg4MjEwLCAweDJkMDAsCisJMHg4MWZmLCAweDFkYzgsIDB4NzAyZSwgMHg3MGIwLCAweGEyMDAsIDB4NzBiMiwgMHgwMGRlLCAweDIwNzEsCisJMHhhZTEzLCAweDcwMWMsIDB4YTAwNSwgMHgxOTA0LCAweDUxNzUsIDB4MjBhOSwgMHgwMDMyLCAweDBmMDQsCisJMHg1MTczLCAweDBlMDQsIDB4NTEyZiwgMHgyMDcxLCAweGFmMzQsIDB4NzIwMCwgMHg4MmZmLCAweDA1ZDgsCisJMHg2OTM0LCAweGExODYsIDB4MDEwMywgMHgxOTA0LCAweDUxODMsIDB4Njk0OCwgMHg2ODQ0LCAweGExMDUsCisJMHgxNTQwLCAweDIwMDksIDB4ODAyMCwgMHgyMjAwLCAweDAwMDIsIDB4NTE3MywgMHg1MTRhLCAweDUxOWIsCisJMHg1MWE3LCAweDUxNzMsIDB4MjA3MSwgMHgwMDAwLCAweDIwYTksIDB4MDAzMiwgMHgwZjA0LCAweDUxNzMsCisJMHg3MDE4LCAweGQwODQsIDB4MWRkOCwgMHg3MTIyLCAweDY4M2MsIDB4NzAyNiwgMHg2ODQwLCAweDcwMmEsCisJMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDIwNzEsIDB4YWQwMCwgMHg3MDJjLCAweDIwNmEsCisJMHgyZDAwLCAweDcwMmUsIDB4NzBiMCwgMHg4MDAwLCAweDcwYjIsIDB4MDAyZSwgMHgwMGVlLCAweDAxNWUsCisJMHgwMDA1LCAweDY4NDQsIDB4YTA4NiwgMHgwMTAwLCAweDExMzAsIDB4Njg2OCwgMHhhMDA1LCAweDExMTgsCisJMHgyMDA5LCAweDgwMjAsIDB4MDg4MCwgMHgyMDcxLCAweGFlMTMsIDB4MmQwOCwgMHgyMDZiLCAweDAwMDAsCisJMHg3MDEwLCAweDgwMDAsIDB4NzAxMiwgMHg3MDE4LCAweGEwNmQsIDB4NzExYSwgMHgwMTEwLCAweDY5MDIsCisJMHgwMDA4LCAweDcxMWUsIDB4MGMxMCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDE3LCAweDAxMzAsCisJMHhhMTg2LCAweDAwMWUsIDB4MDExOCwgMHhhMThlLCAweDAwMWYsIDB4MWQyOCwgMHg2ODRjLCAweGQwY2MsCisJMHgwZDEwLCAweDY4NTAsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwMSwgMHgxOWUwLCAweDIwMDksCisJMHg4MDIxLCAweDA4MDQsIDB4NTE0MywgMHg3MDg0LCAweDgwMDgsIDB4YTA5MiwgMHgwMDFlLCAweDFhOTgsCisJMHg3MTg2LCAweGFlOTAsIDB4MDAwMywgMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHgwMDc4LCAweDcwODQsCisJMHg4MDA4LCAweGEwOTIsIDB4MDAwZiwgMHgxYTM4LCAweDcxODYsIDB4YWU5MCwgMHgwMDAzLCAweDgwMDMsCisJMHhhMjEwLCAweDY4M2MsIDB4MjAxMiwgMHg4MjEwLCAweDY4NDAsIDB4MjAxMiwgMHg3MDg4LCAweGExMGEsCisJMHgwYTA0LCAweDUxNWMsIDB4NzE4YywgMHg3MDg0LCAweGExMGEsIDB4MGEwNCwgMHg1MTVjLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgxOTA0LCAweDUxNWMsIDB4MjA3MSwgMHhhZjM0LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDIsIDB4MTE1MCwgMHgwODBjLCAweDU0MjYsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwODA0LCAweDUxNWMsIDB4MDgwYywgMHg1NDUwLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsIDB4MDgwNCwgMHg1MTVjLCAweDAwMDYsCisJMHg2ODRjLCAweDAwMDYsIDB4NjgzNywgMHgwMTAzLCAweDIwYTksIDB4MDAxYywgMHhhZDgwLCAweDAwMTEsCisJMHgyMGEwLCAweDIwMDEsIDB4MDAwMCwgMHg0MGE0LCAweDAwMGUsIDB4YTA4NCwgMHgwMGZmLCAweDY4NGUsCisJMHgwMDBlLCAweDY4NGEsIDB4Njk1MiwgMHgwMDA1LCAweDIwNzEsIDB4YWUxMywgMHg3MDA0LCAweDAwMDIsCisJMHg1MjAyLCAweDUyMTMsIDB4NTQxMSwgMHg1NDEyLCAweDU0MWYsIDB4NTQyNSwgMHg1MjAzLCAweDU0MDIsCisJMHg1Mzk4LCAweDUzZWUsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwZTA0LCAweDUyMTIsCisJMHgyMDA5LCAweDAwMGQsIDB4NzAzMCwgMHgyMDBhLCAweDIwOTEsIDB4NDA4MCwgMHg3MDA3LCAweDAwMDEsCisJMHg3MDBiLCAweDAwMDAsIDB4MDEyZSwgMHgyMDY5LCAweGFmZGEsIDB4NjgzYywgMHhhMDA1LCAweDAzZjgsCisJMHgxMWYwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDAwMCwgMHg2OTM0LCAweDIwMDEsCisJMHhhZTFmLCAweDIwMDQsIDB4YTEwYSwgMHgwMTcwLCAweDBlMDQsIDB4NTIzNiwgMHgyMDY5LCAweDAwMDAsCisJMHg2ODE4LCAweGQwODQsIDB4MTE1OCwgMHgyMDA5LCAweDgwNDAsIDB4NjkyMiwgMHg2ODFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4MjA2OSwgMHhhZmRhLCAweDY4M2YsIDB4ZmZmZiwgMHgwMTJlLCAweDIwNjksCisJMHhhZDAwLCAweDY4NDQsIDB4Njk2NCwgMHhhMTAyLCAweDIwNjksIDB4YWYzNCwgMHg2ODhhLCAweDY5ODQsCisJMHg3MDFjLCAweGEwNmQsIDB4MDEyMCwgMHg4MWZmLCAweDA5MDQsIDB4NTI4YywgMHgwMGEwLCAweDgxZmYsCisJMHgwOTA0LCAweDUzNTIsIDB4MjA3MSwgMHhhZjM0LCAweDcxODQsIDB4NzA4OCwgMHhhMTBhLCAweDEyNTgsCisJMHg3MTkwLCAweDIwNzEsIDB4YWZkYSwgMHg3MDM4LCAweGEwMDUsIDB4MDEyOCwgMHgxYjA0LCAweDUzNTIsCisJMHg3MTNhLCAweDA4MDQsIDB4NTM1MiwgMHgyMDcxLCAweGFmMzQsIDB4NzE4YywgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDcwODQsIDB4YTEwYSwgMHgwYTA0LCAweDUzNmQsIDB4MGUwNCwgMHg1MzBlLCAweDIwNzEsCisJMHgwMDAwLCAweDcwMTgsIDB4ZDA4NCwgMHgxOTA0LCAweDUzMGUsIDB4MjAwMSwgMHhmZmZmLCAweDIwNzEsCisJMHhhZmRhLCAweDcwM2EsIDB4MjA3MSwgMHhhZjM0LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDExNTAsCisJMHgwODBjLCAweDU0MjYsIDB4MjA3MSwgMHgwMDAwLCAweDcwMWIsIDB4MDAwMSwgMHgyMDkxLCAweDQwODAsCisJMHgwODA0LCAweDUzMGUsIDB4MDgwYywgMHg1NDUwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4MDgwNCwgMHg1MzBlLCAweDIwNzEsIDB4YWYzNCwgMHg3MDAwLCAweGEwMDUsCisJMHgwOTA0LCAweDUzMzQsIDB4NjkzNCwgMHhhMTg2LCAweDAxMDMsIDB4MTkwNCwgMHg1MzExLCAweDY4NGMsCisJMHhkMGJjLCAweDE5MDQsIDB4NTMzNCwgMHg2OTQ4LCAweDY4NDQsIDB4YTEwNSwgMHgxOTA0LCAweDUzMjksCisJMHgyMDA5LCAweDgwMjAsIDB4MjA3MSwgMHhhZjM0LCAweDcwMDAsIDB4MDAwMiwgMHg1MzM0LCAweDUyZjQsCisJMHg1MmNjLCAweDUyZGUsIDB4NTJhYiwgMHgwMTM2LCAweDAxNDYsIDB4MDE1NiwgMHgyMDk5LCAweGFkNzUsCisJMHgyMGExLCAweGFmODUsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTMsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsCisJMHgyMDcxLCAweGFmN2MsIDB4YWQ4MCwgMHgwMDBmLCAweDcwMGUsIDB4NzAxMywgMHgwMDAyLCAweDcwMDcsCisJMHgwMDAyLCAweDcwMGIsIDB4MDAwMCwgMHgyZTEwLCAweDA4MGMsIDB4MTYyNCwgMHgyMDcxLCAweGFlMTMsCisJMHg3MDA3LCAweDAwMDksIDB4MDgwNCwgMHg1MzUyLCAweDcwODQsIDB4ODAwOCwgMHhhMDkyLCAweDAwMWUsCisJMHgxYTA0LCAweDUzNTIsIDB4YWU5MCwgMHgwMDAzLCAweGEyMTAsIDB4NjgzYywgMHgyMDEyLCAweDcxODYsCisJMHgyMDcxLCAweGFlMTMsIDB4MDgwYywgMHg1NGE3LCAweDA4MDQsIDB4NTM1MiwgMHg3MDg0LCAweDgwMDgsCisJMHhhMDkyLCAweDAwMGYsIDB4MWEwNCwgMHg1MzUyLCAweGFlOTAsIDB4MDAwMywgMHg4MDAzLCAweGEyMTAsCisJMHg2ODNjLCAweDIwMTIsIDB4ODIxMCwgMHg2ODQwLCAweDIwMTIsIDB4NzE4NiwgMHgyMDcxLCAweGFlMTMsCisJMHgwODBjLCAweDU0YTcsIDB4MDgwNCwgMHg1MzUyLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDBlMDQsCisJMHg1MzBlLCAweDIwNzEsIDB4MDAwMCwgMHg3MDE4LCAweGQwODQsIDB4MTE4MCwgMHg3MTIyLCAweDY4M2MsCisJMHg3MDI2LCAweDY4NDAsIDB4NzAyYSwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDAxMmUsCisJMHgyMDcxLCAweGFlMTMsIDB4MDgwYywgMHg1NGE3LCAweDA4MDQsIDB4NTM1MiwgMHgwMTJlLCAweDA4MDQsCisJMHg1MzUyLCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMTcsIDB4MDEzMCwgMHhhMTg2LCAweDAwMWUsCisJMHgwMTE4LCAweGExOGUsIDB4MDAxZiwgMHgxMWMwLCAweDY4NGMsIDB4ZDBjYywgMHgwMWE4LCAweDY4NTAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAxLCAweDExNzgsIDB4MjAwOSwgMHg4MDIxLCAweDA4MDQsCisJMHg1MmEyLCAweDY4NDQsIDB4YTA4NiwgMHgwMTAwLCAweDExMzgsIDB4Njg2OCwgMHhhMDA1LCAweDExMjAsCisJMHgyMDA5LCAweDgwMjAsIDB4MDgwNCwgMHg1MmEyLCAweDIwNzEsIDB4YWUxMywgMHgwODBjLCAweDU0YjksCisJMHgwMWM4LCAweDIwNzEsIDB4YWUxMywgMHg3MDBmLCAweDAwMDEsIDB4NjkzNCwgMHhhMTg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDMsIDB4MTEzMCwgMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHg4MTAxLCAweDAxMDgsCisJMHg3MTBlLCAweDcwMDcsIDB4MDAwMywgMHgwODBjLCAweDU0ZDIsIDB4NzA1MCwgMHhhMDg2LCAweDAxMDAsCisJMHgwOTA0LCAweDU0MTIsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZTEzLCAweDcwMDgsCisJMHhhMDg2LCAweDAwMDEsIDB4MTE4MCwgMHgwZTA0LCAweDUzNmIsIDB4MjAwOSwgMHgwMDBkLCAweDcwMzAsCisJMHgyMDBhLCAweDIwOTEsIDB4NDA4MCwgMHg3MDBiLCAweDAwMDAsIDB4NzAwNCwgMHhhMDg2LCAweDAwMDYsCisJMHgxMTEwLCAweDcwMDcsIDB4MDAwMSwgMHgwMTJlLCAweDAwMDUsIDB4MjA3MSwgMHhhZTEzLCAweDA4MGMsCisJMHg1NGI5LCAweDA1MTgsIDB4MjA3MSwgMHhhZjM0LCAweDcwODQsIDB4NzAwYSwgMHgyMGE5LCAweDAwMjAsCisJMHgyMDk5LCAweGFmMzUsIDB4MjBhMSwgMHhhZjVjLCAweDUzYTMsIDB4NzA4NywgMHgwMDAwLCAweDIwNzEsCisJMHhhZTEzLCAweDIwNjksIDB4YWY3YywgMHg3MDZjLCAweDY4MjYsIDB4NzA3MCwgMHg2ODJhLCAweDcwNzQsCisJMHg2ODJlLCAweDcwNzgsIDB4NjgzMiwgMHgyZDEwLCAweDA4MGMsIDB4MTYyNCwgMHg3MDA3LCAweDAwMDgsCisJMHgyMDAxLCAweGZmZmYsIDB4MjA3MSwgMHhhZmRhLCAweDcwM2EsIDB4MDEyZSwgMHgwODA0LCAweDUzNTIsCisJMHgyMDY5LCAweGFmN2MsIDB4NjgwOCwgMHhhMDhlLCAweDAwMDAsIDB4MDkwNCwgMHg1M2VkLCAweGEwOGUsCisJMHgwMjAwLCAweDA5MDQsIDB4NTNlYiwgMHhhMDhlLCAweDAxMDAsIDB4MTkwNCwgMHg1M2VkLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MGUwNCwgMHg1M2U5LCAweDIwNjksIDB4MDAwMCwgMHg2ODE4LCAweGQwODQsCisJMHgxNWMwLCAweDcwMmMsIDB4NzEzMCwgMHg4MTA4LCAweGExMDIsIDB4MDIzMCwgMHhhMDBlLCAweDcwMzQsCisJMHg3MDZlLCAweDcwMzgsIDB4NzA3MiwgMHgwMDQ4LCAweDcwNmMsIDB4YTA4MCwgMHgwMDQwLCAweDcwNmUsCisJMHgxMjIwLCAweDcwNzAsIDB4YTA4MSwgMHgwMDAwLCAweDcwNzIsIDB4NzEzMiwgMHg2OTM2LCAweDcwMGIsCisJMHgwMDAwLCAweDIwMDEsIDB4YWY1OSwgMHgyMDA0LCAweGEwMDUsIDB4MTE5MCwgMHg2OTM0LCAweDIwNjksCisJMHhhZjM0LCAweDY4OWMsIDB4Njk5ZSwgMHgyMDY5LCAweGFmZGEsIDB4YTEwMiwgMHgxMTE4LCAweDY4M2MsCisJMHhhMDA1LCAweDEzNjgsIDB4MjAwMSwgMHhhZjVhLCAweDIwMGMsIDB4ODEwZCwgMHg2OTNlLCAweDAwMzgsCisJMHgyMDA5LCAweDgwNDAsIDB4NjkyMiwgMHg2ODFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLCAweDcwMDcsCisJMHgwMDAxLCAweDAxMmUsIDB4MDAxMCwgMHg3MDA3LCAweDAwMDUsIDB4MDAwNSwgMHgyMDAxLCAweGFmN2UsCisJMHgyMDA0LCAweGEwOGUsIDB4MDEwMCwgMHgxMTI4LCAweDcwMDcsIDB4MDAwMSwgMHgwODBjLCAweDU0YTcsCisJMHgwMDA1LCAweGEwOGUsIDB4MDAwMCwgMHgwZGUwLCAweGEwOGUsIDB4MDIwMCwgMHgxZGM4LCAweDcwMDcsCisJMHgwMDA1LCAweDAwMDUsIDB4NzAxYywgMHhhMDZkLCAweDAxNTgsIDB4MDgwYywgMHg1NGI5LCAweDAxNDAsCisJMHg3MDA3LCAweDAwMDMsIDB4MDgwYywgMHg1NGQyLCAweDcwNTAsIDB4YTA4NiwgMHgwMTAwLCAweDAxMTAsCisJMHgwMDA1LCAweDAwMDUsIDB4NzA1MCwgMHhhMDllLCAweDAxMDAsIDB4MTExOCwgMHg3MDA3LCAweDAwMDQsCisJMHgwMDMwLCAweGEwODYsIDB4MDIwMCwgMHgxMTEwLCAweDcwMDcsIDB4MDAwNSwgMHgwMDA1LCAweDA4MGMsCisJMHg1NDc1LCAweDcwMDYsIDB4MDgwYywgMHg1NGE3LCAweDAwMDUsIDB4MDAwNSwgMHgwMGU2LCAweDAxNTYsCisJMHgyMDcxLCAweGFmMzQsIDB4NzE4NCwgMHg4MWZmLCAweDA1MDAsIDB4YTAwNiwgMHg3MDg2LCAweGFlODAsCisJMHgwMDAzLCAweDIwNzEsIDB4MDAwMCwgMHgyMWE4LCAweDIwMTQsIDB4NzIyNiwgMHg4MDAwLCAweDBmMDQsCisJMHg1NDRhLCAweDIwMTQsIDB4NzIyYSwgMHg4MDAwLCAweDBmMDQsIDB4NTQ0YSwgMHgyMDE0LCAweDcyMmUsCisJMHg4MDAwLCAweDBmMDQsIDB4NTQ0YSwgMHgyMDE0LCAweDcyM2EsIDB4ODAwMCwgMHgwZjA0LCAweDU0NGEsCisJMHgyMDE0LCAweDcyM2UsIDB4YTE4MCwgMHg4MDMwLCAweDcwMjIsIDB4MDE1ZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGU2LCAweDAxNTYsIDB4MjA3MSwgMHhhZjM0LCAweDcxODQsIDB4ODFmZiwgMHgwMWQ4LCAweGEwMDYsCisJMHg3MDg2LCAweGFlODAsIDB4MDAwMywgMHgyMDcxLCAweDAwMDAsIDB4MjFhOCwgMHgyMDE0LCAweDcyMjYsCisJMHg4MDAwLCAweDIwMTQsIDB4NzIyYSwgMHg4MDAwLCAweDBmMDQsIDB4NTQ2YywgMHgyMDE0LCAweDcyM2EsCisJMHg4MDAwLCAweDIwMTQsIDB4NzIzZSwgMHgwMDE4LCAweDIwMDEsIDB4ODAyMCwgMHgwMDEwLCAweDIwMDEsCisJMHg4MDQyLCAweDcwMjIsIDB4MDE1ZSwgMHgwMGVlLCAweDAwMDUsIDB4NzAyYywgMHg3MTMwLCAweDgxMDgsCisJMHhhMTAyLCAweDAyMzAsIDB4YTAwZSwgMHg3MDM0LCAweDcwNmUsIDB4NzAzOCwgMHg3MDcyLCAweDAwNDgsCisJMHg3MDZjLCAweGEwODAsIDB4MDA0MCwgMHg3MDZlLCAweDEyMjAsIDB4NzA3MCwgMHhhMDgxLCAweDAwMDAsCisJMHg3MDcyLCAweDcxMzIsIDB4NzAwYywgMHg4MDAxLCAweDcwMGUsIDB4MTE4MCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDBlMDQsIDB4NTRhMSwgMHgyMDAxLCAweDAwMGQsIDB4MjEwMiwgMHgyMDkxLCAweDQwODAsCisJMHgyMDAxLCAweDAwMDEsIDB4NzAwYiwgMHgwMDAwLCAweDAxMmUsIDB4MDAwNSwgMHgyMDAxLCAweDAwMDcsCisJMHgwMDA1LCAweDIwMDEsIDB4MDAwNiwgMHg3MDBiLCAweDAwMDEsIDB4MDEyZSwgMHgwMDA1LCAweDcwMWMsCisJMHhhMDZkLCAweDAxNzAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NzAxMCwgMHg4MDAxLCAweDcwMTIsCisJMHgyZDA0LCAweDcwMWUsIDB4YTAwNSwgMHgxMTA4LCAweDcwMWEsIDB4MDEyZSwgMHgwODBjLCAweDE1ZjAsCisJMHgwMDA1LCAweDIwMTksIDB4MDAwZCwgMHgyMzA0LCAweDIzMGMsIDB4YTEwZSwgMHgwMTMwLCAweDIzMDQsCisJMHgyMzBjLCAweGExMGUsIDB4MDExMCwgMHhhMDA2LCAweDAwNjAsIDB4NzMyYywgMHg4MzE5LCAweDcxMzAsCisJMHhhMTAyLCAweDExMTgsIDB4MjMwMCwgMHhhMDA1LCAweDAwMjAsIDB4MDIxMCwgMHhhMzAyLCAweDAwMDgsCisJMHg4MDAyLCAweDAwMDUsIDB4MmQwMCwgMHg3MDI2LCAweGEwODAsIDB4MDAwZCwgMHg3MDU2LCAweDcwNTMsCisJMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4YWZlYywgMHgyMTA0LCAweGMwOGQsCisJMHgyMDBhLCAweDAxMmUsIDB4MDgwYywgMHgxNjNjLCAweDAwMDUsIDB4NzA4OCwgMHhhMDhhLCAweDAwMjksCisJMHgxMjIwLCAweGEwODIsIDB4MDAxZCwgMHgwMDMzLCAweDAwMTAsIDB4MDgwYywgMHgxNGY2LCAweDYwMjcsCisJMHgxZTAwLCAweDAwMDUsIDB4NTVjMSwgMHg1NTViLCAweDU1NzEsIDB4NTU5NSwgMHg1NWI0LCAweDU1ZTYsCisJMHg1NWY4LCAweDU1NzEsIDB4NTVkMiwgMHg1NGZmLCAweDU1MmQsIDB4NTRmZSwgMHgwMDA1LCAweDAwZDYsCisJMHgyMDY5LCAweDAyMDAsIDB4NjgwNCwgMHhhMDA1LCAweDExODAsIDB4NjgwOCwgMHhhMDA1LCAweDE1MTgsCisJMHg3MDhiLCAweDAwMjgsIDB4MjA2OSwgMHhhZmFjLCAweDJkMDQsIDB4NzAwMiwgMHgwODBjLCAweDU4NGQsCisJMHg2MDI4LCAweGEwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwYjAsIDB4NzA4YiwgMHgwMDI4LCAweDIwNjksCisJMHhhZmFjLCAweDJkMDQsIDB4NzAwMiwgMHg2MDI4LCAweGEwODUsIDB4MDYwMCwgMHg2MDJhLCAweDAwZTYsCisJMHgwMDM2LCAweDAwNDYsIDB4MDA1NiwgMHgyMDcxLCAweGFmZmQsIDB4MDgwYywgMHgxZDIyLCAweDAwNWUsCisJMHgwMDRlLCAweDAwM2UsIDB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweDAyMDAsCisJMHg2ODA0LCAweGEwMDUsIDB4MTE4MCwgMHg2ODA4LCAweGEwMDUsIDB4MTUxOCwgMHg3MDhiLCAweDAwMjgsCisJMHgyMDY5LCAweGFmYWMsIDB4MmQwNCwgMHg3MDAyLCAweDA4MGMsIDB4NThkYSwgMHg2MDI4LCAweGEwODUsCisJMHgwNjAwLCAweDYwMmEsIDB4MDBiMCwgMHg3MDhiLCAweDAwMjgsIDB4MjA2OSwgMHhhZmFjLCAweDJkMDQsCisJMHg3MDAyLCAweDYwMjgsIDB4YTA4NSwgMHgwNjAwLCAweDYwMmEsIDB4MDBlNiwgMHgwMDM2LCAweDAwNDYsCisJMHgwMDU2LCAweDIwNzEsIDB4YWZmZCwgMHgwODBjLCAweDFkMjIsIDB4MDA1ZSwgMHgwMDRlLCAweDAwM2UsCisJMHgwMGVlLCAweDAwZGUsIDB4MDAwNSwgMHg2ODAzLCAweDAwOTAsIDB4NjEyNCwgMHhkMWU0LCAweDExODAsCisJMHgwODBjLCAweDU2NjMsIDB4ZDFkNCwgMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwgMHhkMWNjLCAweDAxNDAsCisJMHg3MDhiLCAweDAwMjAsIDB4MDAyOCwgMHg3MDhiLCAweDAwMWQsIDB4MDAxMCwgMHg3MDhiLCAweDAwMWYsCisJMHgwMDA1LCAweDY4MDMsIDB4MDA4OCwgMHg2MTI0LCAweGQxY2MsIDB4MTFjOCwgMHhkMWRjLCAweDExYTAsCisJMHhkMWU0LCAweDExNzgsIDB4YTE4NCwgMHgxZTAwLCAweDExYjgsIDB4NjBlMywgMHgwMDAxLCAweDYwMGMsCisJMHhjMGI0LCAweDYwMGUsIDB4MDgwYywgMHg1NzdmLCAweDY4MDMsIDB4MDA4MCwgMHg3MDhiLCAweDAwMjgsCisJMHgwMDU4LCAweDcwOGIsIDB4MDAxZSwgMHgwMDQwLCAweDcwOGIsIDB4MDAxZCwgMHgwMDI4LCAweDcwOGIsCisJMHgwMDIwLCAweDAwMTAsIDB4NzA4YiwgMHgwMDFmLCAweDAwMDUsIDB4NjBlMywgMHgwMDAxLCAweDYwMGMsCisJMHhjMGI0LCAweDYwMGUsIDB4MDgwYywgMHg1NzdmLCAweDY4MDMsIDB4MDA4MCwgMHg2MTI0LCAweGQxZDQsCisJMHgxMTgwLCAweGQxZGMsIDB4MTE1OCwgMHhkMWU0LCAweDExMzAsIDB4YTE4NCwgMHgxZTAwLCAweDExNTgsCisJMHg3MDhiLCAweDAwMjgsIDB4MDA0MCwgMHg3MDhiLCAweDAwMWUsIDB4MDAyOCwgMHg3MDhiLCAweDAwMWQsCisJMHgwMDEwLCAweDcwOGIsIDB4MDAxZiwgMHgwMDA1LCAweDY4MDMsIDB4MDBhMCwgMHg2MTI0LCAweGQxZGMsCisJMHgxMTI4LCAweGQxZTQsIDB4MDEyOCwgMHg3MDhiLCAweDAwMWUsIDB4MDAxMCwgMHg3MDhiLCAweDAwMWQsCisJMHgwMDA1LCAweDA4MGMsIDB4NTY4ZCwgMHg2MTI0LCAweGQxZGMsIDB4MTE1OCwgMHgwODBjLCAweDU2NjMsCisJMHhkMWQ0LCAweDExMjgsIDB4ZDFlNCwgMHgwMTI4LCAweDcwOGIsIDB4MDAxZSwgMHgwMDEwLCAweDcwOGIsCisJMHgwMDFmLCAweDAwMDUsIDB4NjgwMywgMHgwMGEwLCAweDYxMjQsIDB4ZDFkNCwgMHgxMTYwLCAweGQxY2MsCisJMHgxMTUwLCAweGQxZGMsIDB4MTEyOCwgMHhkMWU0LCAweDAxNDAsIDB4NzA4YiwgMHgwMDFlLCAweDAwMjgsCisJMHg3MDhiLCAweDAwMWQsIDB4MDAxMCwgMHg3MDhiLCAweDAwMjEsIDB4MDAwNSwgMHgwODBjLCAweDU2OGQsCisJMHg2MTI0LCAweGQxZDQsIDB4MTE1MCwgMHhkMWRjLCAweDExMjgsIDB4ZDFlNCwgMHgwMTQwLCAweDcwOGIsCisJMHgwMDFlLCAweDAwMjgsIDB4NzA4YiwgMHgwMDFkLCAweDAwMTAsIDB4NzA4YiwgMHgwMDFmLCAweDAwMDUsCisJMHg2ODAzLCAweDAwOTAsIDB4NjEyNCwgMHhkMWQ0LCAweDExNzgsIDB4ZDFjYywgMHgxMTUwLCAweGQxZGMsCisJMHgxMTI4LCAweGQxZTQsIDB4MDE1OCwgMHg3MDhiLCAweDAwMWUsIDB4MDA0MCwgMHg3MDhiLCAweDAwMWQsCisJMHgwMDI4LCAweDcwOGIsIDB4MDAyMCwgMHgwMDEwLCAweDcwOGIsIDB4MDAxZiwgMHgwMDA1LCAweDAwMTYsCisJMHgwMGM2LCAweDAwZDYsIDB4MDBlNiwgMHgwMTI2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsCisJMHgyMDcxLCAweGFkMDAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NTc0ZiwgMHgxMWU4LCAweDIwMDEsCisJMHhhZDBjLCAweDIwMGMsIDB4ZDFiNCwgMHgwMWMwLCAweGMxYjQsIDB4MjEwMiwgMHg2MDI3LCAweDAyMDAsCisJMHhlMDAwLCAweGUwMDAsIDB4NjAyNCwgMHhkMGNjLCAweDAxNTgsIDB4NjgwMywgMHgwMGEwLCAweDIwMDEsCisJMHhhZjllLCAweDIwMDMsIDB4MDAwMSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDAxLCAweDA0MjgsCisJMHg2MDI4LCAweGMwY2QsIDB4NjAyYSwgMHgwNDA4LCAweDA4MGMsIDB4NTc2YiwgMHgwMTUwLCAweDA4MGMsCisJMHg1NzYxLCAweDExMzgsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjYxZSwgMHgwODBjLCAweDU3MjYsCisJMHgwMGEwLCAweDA4MGMsIDB4NTY4YSwgMHgwMTc4LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDI2MWUsCisJMHg3MDg4LCAweGEwODYsIDB4MDAxZSwgMHgwMTIwLCAweDcwODgsIDB4YTA4NiwgMHgwMDIyLCAweDExMTgsCisJMHg3MDhiLCAweDAwMjUsIDB4MDAxMCwgMHg3MDhiLCAweDAwMjEsIDB4MDEyZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMGNlLCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDAwMjYsIDB4MjAwOSwgMHgwMDY0LCAweDIwMTEsCisJMHg1NjZlLCAweDA4MGMsIDB4NjUwMSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZjYsCisJMHgwMDE2LCAweDA4MGMsIDB4NzgzNCwgMHgyMDcxLCAweGFkMDAsIDB4MDgwYywgMHg1NjBmLCAweDAwMWUsCisJMHgwMGZlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDQsCisJMHgwMTQwLCAweDIwMDEsIDB4YWY5ZCwgMHgyMDAzLCAweGFhYWEsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsCisJMHgwMDAwLCAweDAwMDUsIDB4NjAyMCwgMHhkMDljLCAweDAwMDUsIDB4NjgwMywgMHgwMGMwLCAweDAxNTYsCisJMHgyMGE5LCAweDAwMmQsIDB4MWQwNCwgMHg1NjkyLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDU2OTIsCisJMHgwMTVlLCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDIwNzEsIDB4YWQwMCwgMHgyMDAxLCAweGFmOWUsIDB4MjAwYywgMHhhMTg2LCAweDAwMDAsCisJMHgwMTU4LCAweGExODYsIDB4MDAwMSwgMHgwMTU4LCAweGExODYsIDB4MDAwMiwgMHgwMTU4LCAweGExODYsCisJMHgwMDAzLCAweDAxNTgsIDB4MDgwNCwgMHg1NzE0LCAweDcwOGIsIDB4MDAyMiwgMHgwMDQwLCAweDcwOGIsCisJMHgwMDIxLCAweDAwMjgsIDB4NzA4YiwgMHgwMDIzLCAweDAwMjAsIDB4NzA4YiwgMHgwMDI0LCAweDYwNDMsCisJMHgwMDAwLCAweDYwZTMsIDB4MDAwMCwgMHg2ODg3LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHgyNmNiLCAweDAwMjYsIDB4MjAxMSwgMHgwMDAzLCAweDA4MGMsIDB4N2FkZiwgMHgyMDExLCAweDAwMDIsCisJMHgwODBjLCAweDdhZTksIDB4MDAyZSwgMHg3MDAwLCAweGEwOGUsIDB4MDAwNCwgMHgwMTE4LCAweDYwMmIsCisJMHgwMDI4LCAweDAwMTAsIDB4NjAyYiwgMHgwMDIwLCAweDAxNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMGE5LCAweDAwMDUsIDB4NjAyNCwgMHhkMGFjLCAweDAxMTgsIDB4MDEyZSwgMHgwMTVlLCAweDA0ZDAsCisJMHg2ODAwLCAweGEwODQsIDB4MDBhMCwgMHhjMGJkLCAweDY4MDIsIDB4NjkwNCwgMHhkMWQ0LCAweDExMzAsCisJMHg2ODAzLCAweDAxMDAsIDB4MWYwNCwgMHg1NmUyLCAweDA4MGMsIDB4NTdhMCwgMHgwMTJlLCAweDAxNWUsCisJMHgwODBjLCAweDU3NjEsIDB4MDFhOCwgMHg2MDQ0LCAweGEwMDUsIDB4MDE2OCwgMHg2MDUwLCAweDAwMDYsCisJMHhhMDg1LCAweDAwMjAsIDB4NjA1MiwgMHgwODBjLCAweDU3YTAsIDB4YTAwNiwgMHg4MDAxLCAweDFkZjAsCisJMHgwMDBlLCAweDYwNTIsIDB4MDAyOCwgMHg2ODA0LCAweGQwZDQsIDB4MTExMCwgMHgwODBjLCAweDU3YTAsCisJMHgyMDAxLCAweGFmOWUsIDB4MjAwMywgMHgwMDA0LCAweDA4MGMsIDB4NTRlNSwgMHgwODBjLCAweDU3NjEsCisJMHgwMTQ4LCAweDY4MDQsIDB4ZDBkNCwgMHgxMTMwLCAweGQwZGMsIDB4MTEwMCwgMHgyMDAxLCAweGFmOWUsCisJMHgyMDAzLCAweDAwMDAsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MjA3MSwgMHhhZDAwLCAweDIwMDEsCisJMHhhZjlkLCAweDIwMDMsIDB4MDAwMCwgMHgyMDAxLCAweGFmOGUsIDB4MjAwMywgMHgwMDAwLCAweDcwOGIsCisJMHgwMDAwLCAweDYwZTMsIDB4MDAwMCwgMHg2ODg3LCAweDAwMDAsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsCisJMHgyNmNiLCAweDY4MDMsIDB4MDAwMCwgMHg2MDQzLCAweDAwOTAsIDB4NjA0MywgMHgwMDEwLCAweDYwMjcsCisJMHhmZmZmLCAweDYwMmIsIDB4MTgyZiwgMHgwMGVlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwMDYsCisJMHgyMDAxLCAweGFmOWQsIDB4MjAwNCwgMHhhMDg2LCAweGFhYWEsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsCisJMHgyMDAxLCAweGFkNzEsIDB4MjAwNCwgMHhhMDg0LCAweDAwMzAsIDB4YTA4NiwgMHgwMDAwLCAweDAwMGUsCisJMHgwMDA1LCAweDAwMDYsIDB4MjAwMSwgMHhhZDcxLCAweDIwMDQsIDB4YTA4NCwgMHgwMDMwLCAweGEwODYsCisJMHgwMDMwLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDIwMDEsIDB4YWQ3MSwgMHgyMDA0LCAweGEwODQsCisJMHgwMDMwLCAweGEwODYsIDB4MDAxMCwgMHgwMDBlLCAweDAwMDUsIDB4MDAwNiwgMHgyMDAxLCAweGFkNzEsCisJMHgyMDA0LCAweGEwODQsIDB4MDAzMCwgMHhhMDg2LCAweDAwMjAsIDB4MDAwZSwgMHgwMDA1LCAweDIwMDEsCisJMHhhZDBjLCAweDIwMDQsIDB4ZDBhNCwgMHgwMTcwLCAweDA4MGMsIDB4MjZlYiwgMHgwMDM2LCAweDAwMTYsCisJMHgyMDA5LCAweDAwMDAsIDB4MjAxOSwgMHgwMDI4LCAweDA4MGMsIDB4MmFhYywgMHgwMDFlLCAweDAwM2UsCisJMHhhMDA2LCAweDAwMDksIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWQwYywgMHgyZTA0LCAweDAxMTgsCisJMHhhMDg1LCAweDAwMTAsIDB4MDAxMCwgMHhhMDg0LCAweGZmZWYsIDB4MjA3MiwgMHgwMGVlLCAweDAwMDUsCisJMHg2MDUwLCAweDAwMDYsIDB4NjBmMCwgMHgwMDA2LCAweDYwZWMsIDB4MDAwNiwgMHg2MDBjLCAweDAwMDYsCisJMHg2MDA0LCAweDAwMDYsIDB4NjAyOCwgMHgwMDA2LCAweDYwMmYsIDB4MDEwMCwgMHg2MDJmLCAweDAwMDAsCisJMHg2MDJmLCAweDAwNDAsIDB4NjAyZiwgMHgwMDAwLCAweDAwMGUsIDB4NjAyYSwgMHgwMDBlLCAweDYwMDYsCisJMHgwMDBlLCAweDYwMGUsIDB4MDAwZSwgMHg2MGVlLCAweDAwMGUsIDB4NjBmMiwgMHg2MGUzLCAweDAwMDAsCisJMHg2ODg3LCAweDAwMDEsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsIDB4MjZjYiwgMHg2ODAwLCAweGEwODQsCisJMHgwMGEwLCAweGMwYmQsIDB4NjgwMiwgMHg2ODAzLCAweDAwYTAsIDB4MDAwZSwgMHg2MDUyLCAweDYwNTAsCisJMHgwMDA1LCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgyMDYxLCAweDAxMDAsIDB4MjA2OSwgMHgwMTQwLCAweDIwNzEsIDB4YWQwMCwgMHg2MDIwLCAweGEwODQsCisJMHgwMDgwLCAweDAxMzgsIDB4MjAwMSwgMHhhZDBjLCAweDIwMGMsIDB4YzFiZCwgMHgyMTAyLCAweDA4MDQsCisJMHg1ODQ1LCAweDIwMDEsIDB4YWQwYywgMHgyMDBjLCAweGMxYmMsIDB4MjEwMiwgMHg2MDI4LCAweGEwODQsCisJMHhlMWZmLCAweDYwMmEsIDB4NjAyNywgMHgwMjAwLCAweDY4MDMsIDB4MDA5MCwgMHgyMGE5LCAweDAzODQsCisJMHg2MDI0LCAweGQwY2MsIDB4MTUxOCwgMHgxZDA0LCAweDU3ZjgsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsCisJMHg1N2Y4LCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDdhZGYsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsCisJMHg3YWU5LCAweDA4MGMsIDB4NzllMSwgMHgwODBjLCAweDY1ODEsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3YTY0LCAweDY4MDMsIDB4MDBhMCwgMHgyMDAxLCAweGFmOWUsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsCisJMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LCAweDAwMDEsIDB4MDQzOCwgMHg2MGUzLCAweDAwMDAsCisJMHgyMDAxLCAweGFmOGUsIDB4MjAwNCwgMHgwODBjLCAweDI2Y2IsIDB4NjBlMiwgMHg2ODAzLCAweDAwODAsCisJMHgyMGE5LCAweDAzODQsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksIDB4MWUwMCwgMHhlMDAwLCAweDYwMjQsCisJMHhhMTBjLCAweDAxMzgsIDB4MWQwNCwgMHg1ODJhLCAweDIwOTEsIDB4NjAwMCwgMHgxZjA0LCAweDU4MmEsCisJMHgwODQwLCAweDYwMjgsIDB4YTA4NSwgMHgxZTAwLCAweDYwMmEsIDB4NzBhMCwgMHhhMDA1LCAweDExMTgsCisJMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LCAweGEwMDYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDM2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGFkMDAsCisJMHgyMDY5LCAweDAxNDAsIDB4NjAyMCwgMHhhMDg0LCAweDAwYzAsIDB4MDEyMCwgMHg2ODg0LCAweGEwMDUsCisJMHgxOTA0LCAweDU4YTEsIDB4NjgwMywgMHgwMDg4LCAweDYwZTMsIDB4MDAwMCwgMHg2ODg3LCAweDAwMDAsCisJMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHgyNmNiLCAweDIwNjksIDB4MDIwMCwgMHg2ODA0LCAweGEwMDUsCisJMHgxMTE4LCAweDY4MDgsIDB4YTAwNSwgMHgwMWMwLCAweDYwMjgsIDB4YTA4NCwgMHhmYmZmLCAweDYwMmEsCisJMHg2MDI3LCAweDA0MDAsIDB4MjA2OSwgMHhhZmFjLCAweDcwMDAsIDB4MjA2YSwgMHg3MDhiLCAweDAwMjYsCisJMHg3MDAzLCAweDAwMDEsIDB4MjBhOSwgMHgwMDAyLCAweDFkMDQsIDB4NTg4NCwgMHgyMDkxLCAweDYwMDAsCisJMHgxZjA0LCAweDU4ODQsIDB4MDgwNCwgMHg1OGQyLCAweDIwNjksIDB4MDE0MCwgMHgyMGE5LCAweDAzODQsCisJMHg2MDI3LCAweDFlMDAsIDB4MjAwOSwgMHgxZTAwLCAweGUwMDAsIDB4NjAyNCwgMHhhMTBjLCAweDA1MzAsCisJMHhhMDg0LCAweDFhMDAsIDB4MTUxOCwgMHgxZDA0LCAweDU4OTAsIDB4MjA5MSwgMHg2MDAwLCAweDFmMDQsCisJMHg1ODkwLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDdhZGYsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsCisJMHg3YWU5LCAweDA4MGMsIDB4NzllMSwgMHgwODBjLCAweDY1ODEsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3YTY0LCAweDY4MDMsIDB4MDBhMCwgMHgyMDAxLCAweGFmOWUsIDB4MjAwMywgMHgwMDAxLCAweDIwMDEsCisJMHhhZDAwLCAweDIwMDMsIDB4MDAwMSwgMHhhMDg1LCAweDAwMDEsIDB4MDBhMCwgMHg2ODAzLCAweDAwODAsCisJMHgyMDY5LCAweDAxNDAsIDB4NjBlMywgMHgwMDAwLCAweDcwYTAsIDB4YTAwNSwgMHgxMTE4LCAweDY4ODcsCisJMHgwMDAxLCAweDAwMDgsIDB4Njg4NiwgMHgyMDAxLCAweGFmOGUsIDB4MjAwNCwgMHgwODBjLCAweDI2Y2IsCisJMHg2MGUyLCAweGEwMDYsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGFkMDAsIDB4NjAyMCwgMHhhMDg0LCAweDAwYzAsCisJMHgwMWYwLCAweDIwMTEsIDB4MDAwMywgMHgwODBjLCAweDdhZGYsIDB4MjAxMSwgMHgwMDAyLCAweDA4MGMsCisJMHg3YWU5LCAweDA4MGMsIDB4NzllMSwgMHgwODBjLCAweDY1ODEsIDB4MjAxOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3YTY0LCAweDIwNjksIDB4MDE0MCwgMHg2ODAzLCAweDAwYTAsIDB4MjAwMSwgMHhhZjllLCAweDIwMDMsCisJMHgwMDAxLCAweDIwMDEsIDB4YWQwMCwgMHgyMDAzLCAweDAwMDEsIDB4MDgwNCwgMHg1OTcyLCAweDIwMDEsCisJMHhhZDBjLCAweDIwMGMsIDB4ZDFiNCwgMHgxMTUwLCAweGMxYjUsIDB4MjEwMiwgMHgwODBjLCAweDU2NjMsCisJMHgyMDY5LCAweDAxNDAsIDB4NjgwMywgMHgwMDgwLCAweDYwZTMsIDB4MDAwMCwgMHgyMDY5LCAweDAyMDAsCisJMHg2ODA0LCAweGEwMDUsIDB4MTExOCwgMHg2ODA4LCAweGEwMDUsIDB4MDFiOCwgMHg2MDI4LCAweGEwODQsCisJMHhmZGZmLCAweDYwMmEsIDB4NjAyNywgMHgwMjAwLCAweDIwNjksIDB4YWZhYywgMHg3MDAwLCAweDIwNmEsCisJMHg3MDhiLCAweDAwMjcsIDB4NzAwMywgMHgwMDAxLCAweDIwYTksIDB4MDAwMiwgMHgxZDA0LCAweDU5MmUsCisJMHgyMDkxLCAweDYwMDAsIDB4MWYwNCwgMHg1OTJlLCAweDA0ZTgsIDB4NjAyNywgMHgxZTAwLCAweDIwMDksCisJMHgxZTAwLCAweGUwMDAsIDB4NjAyNCwgMHhhMTBjLCAweDAxYzgsIDB4YTA4NCwgMHgxYzAwLCAweDExYjAsCisJMHgxZDA0LCAweDU5MzUsIDB4MDAwNiwgMHgwMDE2LCAweDAwYzYsIDB4MDBkNiwgMHgwMGU2LCAweDA4MGMsCisJMHg2NGEyLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMWUsIDB4MDAwZSwgMHgwMGU2LCAweDIwNzEsCisJMHhhZmRhLCAweDcwMTgsIDB4MDBlZSwgMHhhMDA1LCAweDFkMDAsIDB4MDFlMCwgMHgwMDI2LCAweDIwMTEsCisJMHg1NjZlLCAweDA4MGMsIDB4NjUwZCwgMHgwMDJlLCAweDIwNjksIDB4MDE0MCwgMHg2MGUzLCAweDAwMDAsCisJMHg3MGEwLCAweGEwMDUsIDB4MTExOCwgMHg2ODg3LCAweDAwMDEsIDB4MDAwOCwgMHg2ODg2LCAweDIwMDEsCisJMHhhZjhlLCAweDIwMDQsIDB4MDgwYywgMHgyNmNiLCAweDYwZTIsIDB4MjAwMSwgMHhhZDBjLCAweDIwMGMsCisJMHhjMWI0LCAweDIxMDIsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMDQ2LCAweDAwYzYsCisJMHgwMGU2LCAweDIwNjEsIDB4MDEwMCwgMHgyMDcxLCAweGFkMDAsIDB4NzEzMCwgMHhkMTg0LCAweDExODAsCisJMHgyMDExLCAweGFkNTIsIDB4MjIxNCwgMHhkMmVjLCAweDAxMzgsIDB4YzE4ZCwgMHg3MTMyLCAweDIwMTEsCisJMHhhZDUyLCAweDIyMTQsIDB4ZDJhYywgMHgxMTIwLCAweDcwMzAsIDB4ZDA4YywgMHgwOTA0LCAweDU5ZGYsCisJMHg3MTMwLCAweGMxODUsIDB4NzEzMiwgMHgyMDExLCAweGFkNTIsIDB4MjIwYywgMHhkMWE0LCAweDA1MzAsCisJMHgwMDE2LCAweDIwMDksIDB4MDAwMSwgMHgyMDExLCAweDAxMDAsIDB4MDgwYywgMHg2NjNmLCAweDIwMTksCisJMHgwMDBlLCAweDA4MGMsIDB4YThlYiwgMHgwMTU2LCAweDIwYTksIDB4MDA3ZiwgMHgyMDA5LCAweDAwMDAsCisJMHhhMTg2LCAweDAwN2UsIDB4MDE3MCwgMHhhMTg2LCAweDAwODAsIDB4MDE1OCwgMHgwODBjLCAweDRjZGMsCisJMHgxMTQwLCAweDgxMjcsIDB4YTAwNiwgMHgwMDE2LCAweDIwMDksIDB4MDAwZSwgMHgwODBjLCAweGE5NmMsCisJMHgwMDFlLCAweDgxMDgsIDB4MWYwNCwgMHg1OWIwLCAweDAxNWUsIDB4MDAxZSwgMHhkMWFjLCAweDExNDgsCisJMHgwMDE2LCAweDIwMDksIDB4MDAwMCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHgyYWFjLCAweDAwMWUsCisJMHgwMDcwLCAweDAxNTYsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDRjZGMsCisJMHgxMTEwLCAweDA4MGMsIDB4NDkzYSwgMHg4MTA4LCAweDFmMDQsIDB4NTlkNiwgMHgwMTVlLCAweDIwMTEsCisJMHgwMDAzLCAweDA4MGMsIDB4N2FkZiwgMHgyMDExLCAweDAwMDIsIDB4MDgwYywgMHg3YWU5LCAweDA4MGMsCisJMHg3OWUxLCAweDA4MGMsIDB4NjU4MSwgMHgwMDM2LCAweDIwMTksIDB4MDAwMCwgMHgwODBjLCAweDdhNjQsCisJMHgwMDNlLCAweDYwZTMsIDB4MDAwMCwgMHgyMDAxLCAweGFkMDAsIDB4MjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg1NjlhLCAweDAwZWUsIDB4MDBjZSwgMHgwMDRlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsCisJMHgwMDA1LCAweDIwNzEsIDB4YWRlMSwgMHg3MDAzLCAweDAwMDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMGYsCisJMHgwMDAwLCAweDcwMmIsIDB4MDAwMSwgMHg3MDRmLCAweDAwMDAsIDB4NzA1MywgMHgwMDAxLCAweDcwNWYsCisJMHgwMDIwLCAweDcwNjMsIDB4MDA0MCwgMHg3MDgzLCAweDAwMDAsIDB4NzA4YiwgMHgwMDAwLCAweDcwOGYsCisJMHgwMDAxLCAweDcwYmYsIDB4MDAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZGUxLCAweDY4NDgsCisJMHhhMDA1LCAweDExMzAsIDB4NzAyOCwgMHhjMDg1LCAweDcwMmEsIDB4YTA4NSwgMHgwMDAxLCAweDA0MjgsCisJMHg2YTUwLCAweDcyMzYsIDB4NmI1NCwgMHg3MzNhLCAweDY4NTgsIDB4NzAzZSwgMHg3MDdhLCAweDY4NWMsCisJMHg3MDQyLCAweDcwN2UsIDB4Njg0OCwgMHg3MDJlLCAweDY4NDAsIDB4NzAzMiwgMHgyMDA5LCAweDAwMGMsCisJMHgyMDBhLCAweDgwMDcsIDB4ODAwNiwgMHg4MDA2LCAweGEwOGMsIDB4MDAzZiwgMHhhMDg0LCAweGZmYzAsCisJMHhhMjEwLCAweDIxMDAsIDB4YTMxOSwgMHg3MjcyLCAweDczNzYsIDB4NzAyOCwgMHhjMDg0LCAweDcwMmEsCisJMHg3MDA3LCAweDAwMDEsIDB4NzAwZiwgMHgwMDAwLCAweGEwMDYsIDB4MDBlZSwgMHgwMDA1LCAweDJiNzgsCisJMHgyMDcxLCAweGFkZTEsIDB4NzAwNCwgMHgwMDQzLCAweDcwMGMsIDB4MDAwMiwgMHg1YTViLCAweDVhNTIsCisJMHg1YTUyLCAweDVhNTIsIDB4NWE1MiwgMHgwMDA1LCAweDVhYjEsIDB4NWFiMiwgMHg1YWU0LCAweDVhZTUsCisJMHg1YWFmLCAweDViMzMsIDB4NWIzOCwgMHg1YjY5LCAweDViNmEsIDB4NWI4NSwgMHg1Yjg2LCAweDViODcsCisJMHg1Yjg4LCAweDViODksIDB4NWI4YSwgMHg1YzQwLCAweDVjNjcsIDB4NzAwYywgMHgwMDAyLCAweDVhNzQsCisJMHg1YWFmLCAweDVhYWYsIDB4NWFiMCwgMHg1YWIwLCAweDc4MzAsIDB4NzkzMCwgMHhhMTA2LCAweDAxMjAsCisJMHg3ODMwLCAweDc5MzAsIDB4YTEwNiwgMHgxNTEwLCAweDcwMzAsIDB4YTEwYSwgMHgwMWY4LCAweDEyMTAsCisJMHg3MTJjLCAweGExMGEsIDB4YTE4YSwgMHgwMDAyLCAweDEyZDAsIDB4MDgwYywgMHgxNWMwLCAweDAxYjAsCisJMHgyZDAwLCAweDcwNWEsIDB4NzA2MywgMHgwMDQwLCAweDIwMDEsIDB4MDAwMywgMHg3MDU3LCAweDAwMDAsCisJMHgwMTI2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4YWZlYywgMHgyMTA0LCAweGMwODUsCisJMHgyMDBhLCAweDAwMGUsIDB4NzAwZSwgMHgwMTJlLCAweDA4MGMsIDB4MTYzYywgMHgwMDA1LCAweDA4MGMsCisJMHgxNWMwLCAweDBkZTAsIDB4MmQwMCwgMHg3MDVhLCAweDA4MGMsIDB4MTVjMCwgMHgxMTA4LCAweDBjMTAsCisJMHgyZDAwLCAweDcwODYsIDB4NzA2MywgMHgwMDgwLCAweDIwMDEsIDB4MDAwNCwgMHgwOGY4LCAweDAwMDUsCisJMHgwMDA1LCAweDAwMDUsIDB4NzAwYywgMHgwMDAyLCAweDVhYjksIDB4NWFiYywgMHg1YWNhLCAweDVhZTMsCisJMHg1YWUzLCAweDA4MGMsIDB4NWE2ZCwgMHgwMDA1LCAweDAxMjYsIDB4ODAwMSwgMHg3MDBlLCAweDcwNTgsCisJMHgwMDA2LCAweDA4MGMsIDB4NWY5MCwgMHgwMTIwLCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDVhNmQsCisJMHgwMGRlLCAweDAwNDgsIDB4MDEyNiwgMHg4MDAxLCAweDcwMGUsIDB4MDgwYywgMHg1ZjkwLCAweDcwNTgsCisJMHgyMDY4LCAweDcwODQsIDB4NzA1YSwgMHg2ODAzLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDY4MzQsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDNhLCAweDEyMTgsIDB4MDBkYiwgMHgwMTJlLCAweDAwMDUsCisJMHgwMTJlLCAweDA4MGMsIDB4NWI4YiwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHhhZGUxLCAweDcwMGMsIDB4MDAwMiwgMHg1YWYwLCAweDVhZjAsIDB4NWFmMCwgMHg1YWYyLCAweDVhZjUsCisJMHgwMGVlLCAweDAwMDUsIDB4NzAwZiwgMHgwMDAxLCAweDAwMTAsIDB4NzAwZiwgMHgwMDAyLCAweDAwZWUsCisJMHgwMDA1LCAweDViOGIsIDB4NWI4YiwgMHg1YmE3LCAweDViOGIsIDB4NWQyMiwgMHg1YjhiLCAweDViOGIsCisJMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YmE3LCAweDVkNjQsIDB4NWRhNywgMHg1ZGYwLCAweDVlMDQsCisJMHg1YjhiLCAweDViOGIsIDB4NWJjMywgMHg1YmE3LCAweDViOGIsIDB4NWI4YiwgMHg1YzFkLCAweDVlYWQsCisJMHg1ZWM4LCAweDViOGIsIDB4NWJjMywgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDVjMTMsCisJMHg1ZWM4LCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsCisJMHg1YjhiLCAweDViOGIsIDB4NWJkNywgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsCisJMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViOGIsCisJMHg1YjhiLCAweDViOGIsIDB4NWJlYywgMHg3MDIwLCAweDIwNjgsIDB4MDgwYywgMHgxNWYwLCAweDAwMDUsCisJMHg3MDBjLCAweDAwMDIsIDB4NWIzZiwgMHg1YjQyLCAweDViNTAsIDB4NWI2OCwgMHg1YjY4LCAweDA4MGMsCisJMHg1YTZkLCAweDAwMDUsIDB4MDEyNiwgMHg4MDAxLCAweDcwMGUsIDB4NzA1OCwgMHgwMDA2LCAweDA4MGMsCisJMHg1ZjkwLCAweDAxMjAsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NWE2ZCwgMHgwMGRlLCAweDAwNDgsCisJMHgwMTI2LCAweDgwMDEsIDB4NzAwZSwgMHgwODBjLCAweDVmOTAsIDB4NzA1OCwgMHgyMDY4LCAweDcwODQsCisJMHg3MDVhLCAweDY4MDMsIDB4MDAwMCwgMHg2ODA3LCAweDAwMDAsIDB4NjgzNCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhhLCAweDAwMWEsIDB4MTIxOCwgMHgwMDNiLCAweDAxMmUsIDB4MDAwNSwgMHgwMTJlLCAweDA0MTksCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg1YjhiLCAweDViYTcsIDB4NWQwZSwgMHg1YjhiLCAweDViYTcsCisJMHg1YjhiLCAweDViYTcsIDB4NWJhNywgMHg1YjhiLCAweDViYTcsIDB4NWQwZSwgMHg1YmE3LCAweDViYTcsCisJMHg1YmE3LCAweDViYTcsIDB4NWJhNywgMHg1YjhiLCAweDViYTcsIDB4NWQwZSwgMHg1YjhiLCAweDViOGIsCisJMHg1YmE3LCAweDViOGIsIDB4NWI4YiwgMHg1YjhiLCAweDViYTcsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3MDA3LCAweDAwMDEsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsCisJMHhjMGQ1LCAweDY4M2EsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1MTBjLCAweDAxMmUsCisJMHgwMDA1LCAweDcwMDcsIDB4MDAwMSwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHhjMGU1LCAweDY4M2EsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwMDA1LCAweDcwMDcsCisJMHgwMDAxLCAweDY4MzgsIDB4YTA4NCwgMHgwMGZmLCAweGMwZWQsIDB4NjgzYSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLCAweDY4MzgsCisJMHhhMDg0LCAweDAwZmYsIDB4YzBkZCwgMHg2ODNhLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg1MTBjLCAweDAxMmUsIDB4MDAwNSwgMHg2ODM0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDA5ODgsCisJMHg4MDAxLCAweDExMjAsIDB4NzAwNywgMHgwMDAxLCAweDA4MDQsIDB4NWNkMCwgMHg3MDA3LCAweDAwMDYsCisJMHg3MDEyLCAweDJkMDAsIDB4NzAxNiwgMHg3MDFhLCAweDcwNGIsIDB4NWNkMCwgMHgwMDA1LCAweDY4MzQsCisJMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHgwOTA0LCAweDViOTksIDB4ODAwMSwgMHgxMTIwLCAweDcwMDcsCisJMHgwMDAxLCAweDA4MDQsIDB4NWNlZCwgMHg3MDA3LCAweDAwMDYsIDB4NzAxMiwgMHgyZDAwLCAweDcwMTYsCisJMHg3MDFhLCAweDcwNGIsIDB4NWNlZCwgMHgwMDA1LCAweDY4MzQsIDB4ODAwNywgMHhhMDg0LCAweDAwZmYsCisJMHhhMDg2LCAweDAwMDEsIDB4MTkwNCwgMHg1Yjk5LCAweDcwMDcsIDB4MDAwMSwgMHgyMDA5LCAweGFkMzAsCisJMHgyMTBjLCAweDgxZmYsIDB4MTFhOCwgMHg2ODM4LCAweGEwODQsIDB4MDBmZiwgMHg2ODNhLCAweDY4NTMsCisJMHgwMDAwLCAweDA4MGMsIDB4NGFiMSwgMHgxMTA4LCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2ODM3LCAweDAxMzksIDB4Njg0YSwgMHg2OTUyLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLCAweDBjYTAsCisJMHgyMDAxLCAweDAwMjgsIDB4MGM5MCwgMHg2ODRjLCAweGEwODQsIDB4MDBjMCwgMHhhMDg2LCAweDAwYzAsCisJMHgxMTIwLCAweDcwMDcsIDB4MDAwMSwgMHgwODA0LCAweDVlZTAsIDB4MmQwMCwgMHg3MDE2LCAweDcwMWEsCisJMHgyMGE5LCAweDAwMDQsIDB4YTA4MCwgMHgwMDI0LCAweDIwOTgsIDB4MjBhMSwgMHhhZTBjLCAweDUzYTMsCisJMHg2ODU4LCAweDcwMTIsIDB4YTA4MiwgMHgwNDAxLCAweDFhMDQsIDB4NWJiNSwgMHg2YTg0LCAweGEyOGEsCisJMHgwMDAyLCAweDFhMDQsIDB4NWJiNSwgMHg4MmZmLCAweDExMzgsIDB4Njg4OCwgMHg2OThjLCAweGExMDUsCisJMHgwMTE4LCAweDIwMDEsIDB4NWNhMywgMHgwMDE4LCAweGEyODAsIDB4NWM5OSwgMHgyMDA1LCAweDcwYzYsCisJMHg3MDEwLCAweGEwMTUsIDB4MDkwNCwgMHg1Yzg1LCAweDA4MGMsIDB4MTVjMCwgMHgxMTE4LCAweDcwMDcsCisJMHgwMDBmLCAweDAwMDUsIDB4MmQwMCwgMHg3MDIyLCAweDcwYzQsIDB4MjA2MCwgMHgyYzA1LCAweDY4MzYsCisJMHhlMDA0LCAweGFkMDAsIDB4NzA5NiwgMHhlMDA4LCAweGEyMGEsIDB4MTIxMCwgMHhhMDBlLCAweDIyMDAsCisJMHg3MTEyLCAweGUyMGMsIDB4ODAwMywgMHg4MDBiLCAweGEyOTYsIDB4MDAwNCwgMHgwMTA4LCAweGExMDgsCisJMHg3MTlhLCAweDgxMGIsIDB4NzE5ZSwgMHhhZTkwLCAweDAwMjIsIDB4MDgwYywgMHgxNjI0LCAweDcwOTAsCisJMHhhMDhlLCAweDAxMDAsIDB4MDE3MCwgMHhhMDg2LCAweDAyMDAsIDB4MDExOCwgMHg3MDA3LCAweDAwMTAsCisJMHgwMDA1LCAweDcwMjAsIDB4MjA2OCwgMHgwODBjLCAweDE1ZjAsIDB4NzAxNCwgMHgyMDY4LCAweDA4MDQsCisJMHg1YmI1LCAweDcwMjAsIDB4MjA2OCwgMHg3MDE4LCAweDY4MDIsIDB4NjgwNywgMHgwMDAwLCAweDJkMDgsCisJMHgyMDY4LCAweDY5MDYsIDB4NzExYSwgMHgwODA0LCAweDVjNDAsIDB4NzAxNCwgMHgyMDY4LCAweDcwMDcsCisJMHgwMDAxLCAweDY4ODQsIDB4YTAwNSwgMHgxMTI4LCAweDY4ODgsIDB4Njk4YywgMHhhMTA1LCAweDAxMDgsCisJMHgwMGIxLCAweDY4MzQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAxZSwgMHgwOTA0LCAweDVlZTAsCisJMHgwNGI4LCAweDVjOWIsIDB4NWM5ZiwgMHgwMDAyLCAweDAwMTEsIDB4MDAwNywgMHgwMDA0LCAweDAwMGEsCisJMHgwMDBmLCAweDAwMDUsIDB4MDAwNiwgMHgwMDBhLCAweDAwMTEsIDB4MDAwNSwgMHgwMDA0LCAweDAwZjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MDA3NiwgMHgwMDY2LCAweDZmODgsIDB4NmU4YywgMHg2ODA0LCAweDIwNjAsCisJMHhhY2YwLCAweDAwMjEsIDB4YWNmOCwgMHgwMDI3LCAweDIwMDksIDB4MDAwNSwgMHg3MDBjLCAweDc4MTYsCisJMHg3MDA4LCAweDc4MTIsIDB4NzAwNCwgMHg3ODA2LCAweDcwMDAsIDB4NzgwMiwgMHg3ZTBlLCAweDdmMGEsCisJMHg4MTA5LCAweDAxMjgsIDB4YWVmMiwgMHgwMDA0LCAweGFmZmEsIDB4MDAwNiwgMHgwYzc4LCAweDYwMDQsCisJMHhhMDY1LCAweDFkMzAsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHgyMDA5LCAweGFkMzAsIDB4MjEwYywgMHg4MWZmLCAweDExOTgsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsCisJMHg2ODNhLCAweDA4MGMsIDB4NDk5MywgMHgxMTA4LCAweDAwMDUsIDB4MDgwYywgMHg1MWRmLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg5N2ZkLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLCAweDBjYTAsCisJMHgyMDAxLCAweDAwMjgsIDB4MjAwOSwgMHgwMDAwLCAweDBjODAsIDB4MjAwOSwgMHhhZDMwLCAweDIxMGMsCisJMHg4MWZmLCAweDExYjAsIDB4Njg1OCwgMHhhMDA1LCAweDAxYjAsIDB4NjgzOCwgMHhhMDg0LCAweDAwZmYsCisJMHg2ODNhLCAweDY4NTMsIDB4MDAwMCwgMHgwODBjLCAweDRhNTUsIDB4MTEwOCwgMHgwMDA1LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg1MWRmLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLCAweDBjYjAsCisJMHgyMDAxLCAweDAwMjgsIDB4MGNhMCwgMHgyMDAxLCAweDAwMDAsIDB4MGM4OCwgMHg3MDE4LCAweDY4MDIsCisJMHgyZDA4LCAweDIwNjgsIDB4NjkwNiwgMHg3MTFhLCAweDcwMTAsIDB4ODAwMSwgMHg3MDEyLCAweDAxMTgsCisJMHg3MDA3LCAweDAwMDYsIDB4MDAzMCwgMHg3MDE0LCAweDIwNjgsIDB4NzAwNywgMHgwMDAxLCAweDcwNDgsCisJMHgwODBmLCAweDAwMDUsIDB4NzAwNywgMHgwMDAxLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsCisJMHg2ODQ4LCAweGEwODQsIDB4MDBmZiwgMHgyMGE5LCAweDAwMDEsIDB4YTA5NiwgMHgwMDAxLCAweDAxYjAsCisJMHgyMDA5LCAweDAwMDAsIDB4MjBhOSwgMHgwMGZmLCAweGEwOTYsIDB4MDAwMiwgMHgwMTc4LCAweGEwMDUsCisJMHgxMWYwLCAweDY5NDQsIDB4ODEwZiwgMHhhMThjLCAweDAwZmYsIDB4MDgwYywgMHg0Y2RjLCAweDExYjgsCisJMHgwMDY2LCAweDZlNTAsIDB4MDgwYywgMHg0ZGNmLCAweDAwNmUsIDB4MDA4OCwgMHgwMDQ2LCAweDIwMTEsCisJMHhhZDBjLCAweDIyMjQsIDB4YzQ4NCwgMHgyNDEyLCAweDAwNGUsIDB4MDBjNiwgMHgwODBjLCAweDRjZGMsCisJMHgxMTEwLCAweDA4MGMsIDB4NGYyZCwgMHg4MTA4LCAweDFmMDQsIDB4NWQ0ZSwgMHgwMGNlLCAweDY4NGMsCisJMHhkMDg0LCAweDExMTgsIDB4MDgwYywgMHgxNWYwLCAweDAwMDUsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDUxMGMsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMDcsCisJMHgwMDAxLCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LCAweGQwYTQsIDB4MDU4MCwgMHgyMDYxLCAweGIwNDgsCisJMHg2MTAwLCAweGQxODQsIDB4MDE3OCwgMHg2ODU4LCAweGEwODQsIDB4MDBmZiwgMHgxNTUwLCAweDYwMDAsCisJMHhkMDg0LCAweDA1MjAsIDB4NjAwNCwgMHhhMDA1LCAweDE1MzgsIDB4NjAwMywgMHgwMDAwLCAweDYwMGIsCisJMHgwMDAwLCAweDAwYzgsIDB4MjAxMSwgMHgwMDAxLCAweDY4NjAsIDB4YTAwNSwgMHgxMTEwLCAweDIwMDEsCisJMHgwMDFlLCAweDgwMDAsIDB4NjAxNiwgMHg2ODU4LCAweGEwODQsIDB4MDBmZiwgMHgwMTc4LCAweDYwMDYsCisJMHg2ODU4LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAxNDgsIDB4NjAwYSwgMHg2ODU4LCAweDgwMDAsCisJMHgxMTA4LCAweGMyOGQsIDB4NjIwMiwgMHgwMTJlLCAweDA4MDQsIDB4NWY3ZiwgMHgwMTJlLCAweDA4MDQsCisJMHg1Zjc5LCAweDAxMmUsIDB4MDgwNCwgMHg1ZjczLCAweDAxMmUsIDB4MDgwNCwgMHg1Zjc2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4NzAwNywgMHgwMDAxLCAweDIwMDEsIDB4YWQ1MiwgMHgyMDA0LCAweGQwYTQsCisJMHgwNWUwLCAweDIwNjEsIDB4YjA0OCwgMHg2MDAwLCAweGQwODQsIDB4MDViOCwgMHg2MjA0LCAweDYzMDgsCisJMHhkMDhjLCAweDE1MzAsIDB4NmM0OCwgMHhhNDg0LCAweDAwMDMsIDB4MDE3MCwgMHg2OTU4LCAweGExOGMsCisJMHgwMGZmLCAweDgwMDEsIDB4MTEyMCwgMHgyMTAwLCAweGEyMTAsIDB4MDYyMCwgMHgwMDI4LCAweDgwMDEsCisJMHgxNTA4LCAweDIxMDAsIDB4YTIxMiwgMHgwMmYwLCAweGE0ODQsIDB4MDAwYywgMHgwMTg4LCAweDY5NTgsCisJMHg4MTBmLCAweGExOGMsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDQsIDB4MTEyMCwgMHgyMTAwLCAweGEzMTgsCisJMHgwMjg4LCAweDAwMzAsIDB4YTA4MiwgMHgwMDA0LCAweDExNjgsIDB4MjEwMCwgMHhhMzFhLCAweDAyNTAsCisJMHg2ODYwLCAweGEwMDUsIDB4MDExMCwgMHg4MDAwLCAweDYwMTYsIDB4NjIwNiwgMHg2MzBhLCAweDAxMmUsCisJMHgwODA0LCAweDVmN2YsIDB4MDEyZSwgMHgwODA0LCAweDVmN2MsIDB4MDEyZSwgMHgwODA0LCAweDVmNzksCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDA3LCAweDAwMDEsIDB4MjA2MSwgMHhiMDQ4LCAweDYzMDAsCisJMHhkMzhjLCAweDExMjAsIDB4NjMwOCwgMHg4MzE4LCAweDAyMjAsIDB4NjMwYSwgMHgwMTJlLCAweDA4MDQsCisJMHg1ZjhkLCAweDAxMmUsIDB4MDgwNCwgMHg1ZjdjLCAweDAxMjYsIDB4MDBjNiwgMHgyMDkxLCAweDgwMDAsCisJMHg3MDA3LCAweDAwMDEsIDB4Njg0YywgMHhkMGFjLCAweDAxNDgsIDB4MDBjNiwgMHgyMDYxLCAweGIwNDgsCisJMHg2MDAwLCAweGEwODQsIDB4ZmNmZiwgMHg2MDAyLCAweDAwY2UsIDB4MDQ0OCwgMHg2ODU4LCAweGEwMDUsCisJMHgwNWQwLCAweDY4NWMsIDB4YTA2NSwgMHgwNTk4LCAweDIwMDEsIDB4YWQzMCwgMHgyMDA0LCAweGEwMDUsCisJMHgwMTE4LCAweDA4MGMsIDB4OTc0ZSwgMHgwMDY4LCAweDYwMTMsIDB4MDQwMCwgMHg2MDU3LCAweDAwMDAsCisJMHg2OTRjLCAweGQxYTQsIDB4MDExMCwgMHg2OTUwLCAweDYxNTYsIDB4MjAwOSwgMHgwMDQxLCAweDA4MGMsCisJMHg4MGE3LCAweDY5NTgsIDB4YTE4YywgMHhmZjAwLCAweGExODYsIDB4MjAwMCwgMHgxMTQwLCAweDAwMjYsCisJMHgyMDA5LCAweDAwMDAsIDB4MjAxMSwgMHhmZGZmLCAweDA4MGMsIDB4NjYzZiwgMHgwMDJlLCAweDY4NGMsCisJMHhkMGM0LCAweDAxNDgsIDB4MjA2MSwgMHhiMDQ4LCAweDYwMDAsIDB4ZDA4YywgMHgxMTIwLCAweDYwMDgsCisJMHg4MDAwLCAweDAyMDgsIDB4NjAwYSwgMHgwMGNlLCAweDAxMmUsIDB4MDgwNCwgMHg1ZjdmLCAweDAwY2UsCisJMHgwMTJlLCAweDA4MDQsIDB4NWY3OSwgMHg2OTU0LCAweGExODYsIDB4MDAyZSwgMHgwZDQwLCAweGExODYsCisJMHgwMDJkLCAweDBkMjgsIDB4YTE4NiwgMHgwMDQ1LCAweDA1MTAsIDB4YTE4NiwgMHgwMDJhLCAweDExMzAsCisJMHgyMDAxLCAweGFkMGMsIDB4MjAwYywgMHhjMTk0LCAweDIxMDIsIDB4MDhjOCwgMHhhMTg2LCAweDAwMjAsCisJMHgwMTcwLCAweGExODYsIDB4MDAyOSwgMHgxZDE4LCAweDY5NDQsIDB4YTE4YywgMHhmZjAwLCAweDgxMGYsCisJMHgwODBjLCAweDRjZGMsIDB4MTk2MCwgMHg2MDAwLCAweGMwZTQsIDB4NjAwMiwgMHgwODQwLCAweDY4NWMsCisJMHhhMDY1LCAweDA5YTgsIDB4MjAwMSwgMHhhZmEzLCAweDIwMDQsIDB4NjAxNiwgMHgwODAwLCAweDY4NWMsCisJMHhhMDY1LCAweDA5NjgsIDB4MDBlNiwgMHg2ODYwLCAweGEwNzUsIDB4MjAwMSwgMHhhZDMwLCAweDIwMDQsCisJMHhhMDA1LCAweDAxNTAsIDB4MDgwYywgMHg5NzRlLCAweDhlZmYsIDB4MDExOCwgMHgyZTYwLCAweDA4MGMsCisJMHg5NzRlLCAweDAwZWUsIDB4MDgwNCwgMHg1ZTNmLCAweDYwMjAsIDB4YzBkYywgMHhjMGQ1LCAweDYwMjIsCisJMHgyZTYwLCAweDYwMDcsIDB4MDAzYSwgMHg2ODcwLCAweGEwMDUsIDB4MDEzMCwgMHg2MDA3LCAweDAwM2IsCisJMHg2ODc0LCAweDYwMmEsIDB4Njg3OCwgMHg2MDEyLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3YTgsCisJMHgwODBjLCAweDZjNTAsIDB4MDBlZSwgMHgwODA0LCAweDVlM2YsIDB4MjA2MSwgMHhiMDQ4LCAweDYwMDAsCisJMHhkMDg0LCAweDAxOTAsIDB4ZDA4YywgMHgxOTA0LCAweDVmOGQsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MjA0LCAweDgyMTAsIDB4MDIyMCwgMHg2MjA2LCAweDAxMmUsIDB4MDgwNCwgMHg1ZjhkLCAweDAxMmUsCisJMHg2ODUzLCAweDAwMTYsIDB4MDgwNCwgMHg1Zjg2LCAweDY4NTMsIDB4MDAwNywgMHgwODA0LCAweDVmODYsCisJMHg2ODM0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDExMTgsIDB4MDgwYywgMHg1Yjk5LCAweDAwNzgsCisJMHgyMDMwLCAweDgwMDEsIDB4MTEyMCwgMHg3MDA3LCAweDAwMDEsIDB4MDA1MSwgMHgwMDQwLCAweDcwMDcsCisJMHgwMDA2LCAweDcwMTIsIDB4MmQwMCwgMHg3MDE2LCAweDcwMWEsIDB4NzA0YiwgMHg1ZWUwLCAweDAwMDUsCisJMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwMDksIDB4YWQzMCwgMHgyMTBjLCAweDgxZmYsCisJMHgxOTA0LCAweDVmNWIsIDB4MjAwOSwgMHhhZDBjLCAweDIxMGMsIDB4ZDE5NCwgMHgxOTA0LCAweDVmNjMsCisJMHg2ODQ4LCAweDIwNzAsIDB4YWU4MiwgMHhiNDAwLCAweDBhMDQsIDB4NWY0ZiwgMHgyMDAxLCAweGFkMTYsCisJMHgyMDA0LCAweGFlMDIsIDB4MWEwNCwgMHg1ZjRmLCAweDIwNjEsIDB4YjA0OCwgMHg2MTAwLCAweGExODQsCisJMHgwMzAxLCAweGEwODYsIDB4MDAwMSwgMHgxNWE4LCAweDcxMWMsIDB4YTE4NiwgMHgwMDA2LCAweDE1YjAsCisJMHg3MDE4LCAweGEwMDUsIDB4MDkwNCwgMHg1ZjViLCAweDIwMDQsIDB4ZDBlNCwgMHgxOTA0LCAweDVmNWUsCisJMHg3MDIwLCAweGQwZGMsIDB4MTkwNCwgMHg1ZjY2LCAweDY4NTMsIDB4MDAwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgyZDA4LCAweDcwMTAsIDB4YTAwNSwgMHgxMTU4LCAweDcxMTIsIDB4Njg0YywgMHhkMGY0LCAweDE5MDQsCisJMHg1ZjY5LCAweDJlNjAsIDB4MDgwYywgMHg2NWFhLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDIwNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MWRlMCwgMHg2OTAyLCAweDIxNjgsIDB4Njg0YywgMHhkMGY0LCAweDE1YzgsCisJMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMTJlLCAweDAwZWUsIDB4Njg1MywgMHgwMDA2LCAweDA4MDQsCisJMHg1Zjg2LCAweGQxODQsIDB4MGRjMCwgMHhkMWM0LCAweDExYTgsIDB4MDBiOCwgMHg2OTQ0LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4MDgwYywgMHg0Y2RjLCAweDExYzgsIDB4NjAwMCwgMHhkMGU0LCAweDExYjAsCisJMHg3MTFjLCAweGExODYsIDB4MDAwNywgMHgxMTE4LCAweDY4NTMsIDB4MDAwMiwgMHgwMDg4LCAweDY4NTMsCisJMHgwMDA4LCAweDAwNzAsIDB4Njg1MywgMHgwMDBlLCAweDAwNTgsIDB4Njg1MywgMHgwMDE3LCAweDAwNDAsCisJMHg2ODUzLCAweDAwMzUsIDB4MDAyOCwgMHg2ODUzLCAweDAwMjgsIDB4MDAxMCwgMHg2ODUzLCAweDAwMjksCisJMHgwMTJlLCAweDAwZWUsIDB4MDQxOCwgMHg2ODUzLCAweDAwMmEsIDB4MGNkMCwgMHg2ODUzLCAweDAwNDUsCisJMHgwY2I4LCAweDJlNjAsIDB4MjAxOSwgMHgwMDAyLCAweDYwMTcsIDB4MDAxNCwgMHgwODBjLCAweGE1NjYsCisJMHgwMTJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDA5LCAweDAwM2UsIDB4MDA1OCwgMHgyMDA5LCAweDAwMDQsCisJMHgwMDQwLCAweDIwMDksIDB4MDAwNiwgMHgwMDI4LCAweDIwMDksIDB4MDAxNiwgMHgwMDEwLCAweDIwMDksCisJMHgwMDAxLCAweDY4NTQsIDB4YTA4NCwgMHhmZjAwLCAweGExMDUsIDB4Njg1NiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NTEwYywgMHgwMTJlLCAweDAwMDUsIDB4MDgwYywgMHgxNWYwLCAweDAwMDUsCisJMHg3MDJjLCAweDcxMzAsIDB4ODEwOCwgMHhhMTAyLCAweDAyMzAsIDB4YTAwZSwgMHg3MDM0LCAweDcwNzIsCisJMHg3MDM4LCAweDcwNzYsIDB4MDA1OCwgMHg3MDcwLCAweGEwODAsIDB4MDA0MCwgMHg3MDcyLCAweDEyMzAsCisJMHg3MDc0LCAweGEwODEsIDB4MDAwMCwgMHg3MDc2LCAweGEwODUsIDB4MDAwMSwgMHg3OTMyLCAweDcxMzIsCisJMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg2NWExLCAweDAwZGUsIDB4MDAwNSwgMHgwMGQ2LCAweDIwMTEsCisJMHgwMDA0LCAweDIyMDQsIDB4YTA4NSwgMHg4MDAyLCAweDIwMTIsIDB4MDBkZSwgMHgwMDA1LCAweDIwZTEsCisJMHgwMDAyLCAweDNkMDgsIDB4MjBlMSwgMHgyMDAwLCAweDNkMDAsIDB4YTA4NCwgMHg3MDAwLCAweDAxMTgsCisJMHhhMDg2LCAweDEwMDAsIDB4MTU0MCwgMHgyMGUxLCAweDAwMDAsIDB4M2QwMCwgMHhhMDk0LCAweGZmMDAsCisJMHg4MjE3LCAweGEwODQsIDB4ZjAwMCwgMHhhMDg2LCAweDMwMDAsIDB4MTExOCwgMHgwODBjLCAweDYxYzYsCisJMHgwMGIwLCAweDIwZTEsIDB4MDAwNCwgMHgzZDYwLCAweGQxYmMsIDB4MTEwOCwgMHgzZTYwLCAweGFjODQsCisJMHgwMDA3LCAweDExODgsIDB4YWM4MiwgMHhiNDAwLCAweDAyNzAsIDB4Njg1OCwgMHhhYzAyLCAweDEyNTgsCisJMHg2MTIwLCAweGQxZjQsIDB4MTE2MCwgMHgyMDA5LCAweDAwNDcsIDB4MDgwYywgMHg4MGE3LCAweDdhMWMsCisJMHhkMjg0LCAweDE5NjgsIDB4MDAwNSwgMHhhMDE2LCAweDA4MGMsIDB4MTgyNCwgMHgwY2MwLCAweDBjZDgsCisJMHg3ODFjLCAweGQwOGMsIDB4MDUwMCwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgyMGUxLCAweDMwMDAsCisJMHgzZDIwLCAweDNlMjgsIDB4YTU4NCwgMHgwMDc2LCAweDE1MzAsIDB4YTQ4NCwgMHg3MDAwLCAweGEwODYsCisJMHgxMDAwLCAweDExYTgsIDB4MDgwYywgMHg2MDRlLCAweDAxZjAsIDB4MjBlMSwgMHgzMDAwLCAweDc4MjgsCisJMHg3ODI4LCAweDA4MGMsIDB4NjA2YSwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgyMDA5LCAweGFmY2YsCisJMHgyMTA0LCAweGEwMDUsIDB4MTEwOCwgMHgwMDA1LCAweDA4MGMsIDB4NmM1MCwgMHgwY2UwLCAweGE0ODQsCisJMHg3MDAwLCAweDE1MTgsIDB4MDQ5OSwgMHgwMWI4LCAweDcwMDAsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsCisJMHg4MTAwLCAweDBkMTgsIDB4MDA4MCwgMHhkNWE0LCAweDAxNTgsIDB4MDgwYywgMHgxZDg2LCAweDIwZTEsCisJMHg5MDEwLCAweDIwMDEsIDB4MDE2MCwgMHgyNTAyLCAweDIwMDEsIDB4MDEzOCwgMHgyMjAyLCAweDAwNDgsCisJMHgwMGU5LCAweDY4ODMsIDB4MDAwMCwgMHgwODBjLCAweGFjNTksIDB4MjBlMSwgMHgzMDAwLCAweDc4MjgsCisJMHg3ODI4LCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDA4YjAsIDB4MDA4MSwgMHgxMTMwLCAweDcwMDAsCisJMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHg4MTAwLCAweDFkNzAsIDB4MDgwYywgMHhhYzU5LCAweDIwZTEsCisJMHgzMDAwLCAweDc4MjgsIDB4NzgyOCwgMHgwODBjLCAweDY0MmQsIDB4MGM1OCwgMHhhNDg0LCAweDAxZmYsCisJMHg2ODgyLCAweGEwMDUsIDB4MDE2MCwgMHhhMDgwLCAweDAwMWYsIDB4YTA4NCwgMHgwM2Y4LCAweDgwYWMsCisJMHgyMGUxLCAweDEwMDAsIDB4MmVhMCwgMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHgwMDA1LCAweDIwYTksCisJMHgwMDBjLCAweDIwZTEsIDB4MTAwMCwgMHgyZWEwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweGEwODUsCisJMHgwMDAxLCAweDBjYTAsIDB4NzAwMCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4YywgMHhmMDAwLCAweDgwMDcsCisJMHhhMTk2LCAweDAwMDAsIDB4MTExOCwgMHgwODA0LCAweDYyY2YsIDB4MDAwNSwgMHhhMTk2LCAweDIwMDAsCisJMHgxMTQ4LCAweDY5MDAsIDB4YTE4ZSwgMHgwMDAxLCAweDExMTgsIDB4MDgwYywgMHg0MWQxLCAweDBjYTgsCisJMHgwMDM5LCAweDBjOTgsIDB4YTE5NiwgMHg4MDAwLCAweDFkODAsIDB4MDgwYywgMHg2MzcyLCAweDBjNjgsCisJMHgwMGM2LCAweDZhODAsIDB4ODJmZiwgMHgwOTA0LCAweDYxYzAsIDB4NzExMCwgMHhhMThjLCAweGZmMDAsCisJMHg4MTBmLCAweGExOTYsIDB4MDAwMSwgMHgwMTIwLCAweGExOTYsIDB4MDAyMywgMHgxOTA0LCAweDYxYzAsCisJMHhhMDhlLCAweDAwMjMsIDB4MTU3MCwgMHgwODBjLCAweDY0MDgsIDB4MDkwNCwgMHg2MWMwLCAweDcxMjQsCisJMHg2MTBhLCAweDcwMzAsIDB4YTA4ZSwgMHgwMjAwLCAweDExNTAsIDB4NzAzNCwgMHhhMDA1LCAweDE5MDQsCisJMHg2MWMwLCAweDIwMDksIDB4MDAxNSwgMHgwODBjLCAweDgwYTcsIDB4MDgwNCwgMHg2MWMwLCAweGEwOGUsCisJMHgwMjE0LCAweDAxMTgsIDB4YTA4ZSwgMHgwMjEwLCAweDExMzAsIDB4MjAwOSwgMHgwMDE1LCAweDA4MGMsCisJMHg4MGE3LCAweDA4MDQsIDB4NjFjMCwgMHhhMDhlLCAweDAxMDAsIDB4MTkwNCwgMHg2MWMwLCAweDcwMzQsCisJMHhhMDA1LCAweDE5MDQsIDB4NjFjMCwgMHgyMDA5LCAweDAwMTYsIDB4MDgwYywgMHg4MGE3LCAweDA4MDQsCisJMHg2MWMwLCAweGEwOGUsIDB4MDAyMiwgMHgxOTA0LCAweDYxYzAsIDB4NzAzMCwgMHhhMDhlLCAweDAzMDAsCisJMHgxNTgwLCAweDY4ZDAsIDB4ZDBhNCwgMHgwNTI4LCAweGMwYjUsIDB4NjhkMiwgMHg3MTAwLCAweGExOGMsCisJMHgwMGZmLCAweDY5NmUsIDB4NzAwNCwgMHg2ODcyLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZTYsCisJMHg3OGVhLCAweDAwMDYsIDB4YTA4NCwgMHgwMGZmLCAweDAwMTYsIDB4MjAwOCwgMHgwODBjLCAweDI2YTAsCisJMHg3OTMyLCAweDc5MzYsIDB4MDAxZSwgMHgwMDBlLCAweDAwZmUsIDB4MDgwYywgMHgyNjc2LCAweDY5NGUsCisJMHg3MDNjLCAweDAwZTYsIDB4MjA3MSwgMHgwMTQwLCAweDcwODYsIDB4MjA3MSwgMHhhZDAwLCAweDcwYTIsCisJMHgwMGVlLCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LCAweDYxYzAsIDB4MjAwOSwgMHgwMDE3LCAweDA4MDQsCisJMHg2MTkzLCAweGEwOGUsIDB4MDQwMCwgMHgxMTU4LCAweDcwMzQsIDB4YTAwNSwgMHgxOTA0LCAweDYxYzAsCisJMHg2OGQwLCAweGMwYTUsIDB4NjhkMiwgMHgyMDA5LCAweDAwMzAsIDB4MDgwNCwgMHg2MTkzLCAweGEwOGUsCisJMHgwNTAwLCAweDExNDAsIDB4NzAzNCwgMHhhMDA1LCAweDE5MDQsIDB4NjFjMCwgMHgyMDA5LCAweDAwMTgsCisJMHgwODA0LCAweDYxOTMsIDB4YTA4ZSwgMHgyMDEwLCAweDExMjAsIDB4MjAwOSwgMHgwMDE5LCAweDA4MDQsCisJMHg2MTkzLCAweGEwOGUsIDB4MjExMCwgMHgxMTIwLCAweDIwMDksIDB4MDAxYSwgMHgwODA0LCAweDYxOTMsCisJMHhhMDhlLCAweDUyMDAsIDB4MTE0MCwgMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2MWMwLCAweDIwMDksCisJMHgwMDFiLCAweDA4MDQsIDB4NjE5MywgMHhhMDhlLCAweDUwMDAsIDB4MTE0MCwgMHg3MDM0LCAweGEwMDUsCisJMHgxOTA0LCAweDYxYzAsIDB4MjAwOSwgMHgwMDFjLCAweDA4MDQsIDB4NjE5MywgMHhhMDhlLCAweDEzMDAsCisJMHgxMTIwLCAweDIwMDksIDB4MDAzNCwgMHgwODA0LCAweDYxOTMsIDB4YTA4ZSwgMHgxMjAwLCAweDExNDAsCisJMHg3MDM0LCAweGEwMDUsIDB4MTkwNCwgMHg2MWMwLCAweDIwMDksIDB4MDAyNCwgMHgwODA0LCAweDYxOTMsCisJMHhhMDhjLCAweGZmMDAsIDB4YTE4ZSwgMHgyNDAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDJkLCAweDA0ZDgsCisJMHhhMDhjLCAweGZmMDAsIDB4YTE4ZSwgMHg1MzAwLCAweDExMTgsIDB4MjAwOSwgMHgwMDJhLCAweDA0OTgsCisJMHhhMDhlLCAweDBmMDAsIDB4MTExOCwgMHgyMDA5LCAweDAwMjAsIDB4MDQ2OCwgMHhhMDhlLCAweDUzMDAsCisJMHgxMTA4LCAweDAwZDgsIDB4YTA4ZSwgMHg2MTA0LCAweDExYzAsIDB4MjAxMSwgMHhiMjhkLCAweDgyMDgsCisJMHgyMjA0LCAweGEwODIsIDB4MDAwNCwgMHgyMGE4LCAweDk1YWMsIDB4OTVhYywgMHgyMDExLCAweDgwMTUsCisJMHgyMTFjLCAweDgxMDgsIDB4MDA0NiwgMHgyMTI0LCAweDA4MGMsIDB4M2M1YywgMHgwMDRlLCAweDgxMDgsCisJMHgxZjA0LCAweDYxNzYsIDB4MjAwOSwgMHgwMDIzLCAweDAwNzAsIDB4YTA4ZSwgMHg2MDAwLCAweDExMTgsCisJMHgyMDA5LCAweDAwM2YsIDB4MDA0MCwgMHhhMDhlLCAweDc4MDAsIDB4MTExOCwgMHgyMDA5LCAweDAwNDUsCisJMHgwMDEwLCAweDIwMDksIDB4MDAxZCwgMHgwMDE2LCAweDIwMTEsIDB4YjI4MywgMHgyMjA0LCAweDgyMTEsCisJMHgyMjBjLCAweDA4MGMsIDB4MjY3NiwgMHgxNTMwLCAweDA4MGMsIDB4NGM4MCwgMHgxNTE4LCAweDY2MTIsCisJMHg2NTE2LCAweDg2ZmYsIDB4MDE4MCwgMHgwMDFlLCAweDAwMTYsIDB4YTE4NiwgMHgwMDE3LCAweDExNTgsCisJMHg2ODZjLCAweGE2MDYsIDB4MTE0MCwgMHg2ODcwLCAweGE1MDYsIDB4YTA4NCwgMHhmZjAwLCAweDExMTgsCisJMHg2MDAwLCAweGMwZjUsIDB4NjAwMiwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMTY4LCAweDAwMWUsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwNCwgMHg3MTIwLCAweDYxMGEsIDB4MDAxZSwgMHgwODBjLCAweDgwYTcsCisJMHgwMGNlLCAweDAwMDUsIDB4MDAxZSwgMHgwY2UwLCAweDAwY2UsIDB4MGNlMCwgMHgwMGM2LCAweDAwNDYsCisJMHgwODBjLCAweDYyMjEsIDB4MTkwNCwgMHg2MjFlLCAweGExODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwODYsCisJMHgwMDA4LCAweDE5MDQsIDB4NjIxZSwgMHhhMjhlLCAweDAwMzMsIDB4MTFlOCwgMHgwODBjLCAweDY0MDgsCisJMHgwOTA0LCAweDYyMWUsIDB4NzEyNCwgMHg2MTBhLCAweDcwMzAsIDB4YTA4ZSwgMHgwMjAwLCAweDExNDAsCisJMHg3MDM0LCAweGEwMDUsIDB4MTVkOCwgMHgyMDA5LCAweDAwMTUsIDB4MDgwYywgMHg4MGE3LCAweDA0YjAsCisJMHhhMDhlLCAweDAxMDAsIDB4MTU5OCwgMHg3MDM0LCAweGEwMDUsIDB4MTU4MCwgMHgyMDA5LCAweDAwMTYsCisJMHgwODBjLCAweDgwYTcsIDB4MDQ1OCwgMHhhMjhlLCAweDAwMzIsIDB4MTU0MCwgMHg3MDMwLCAweGEwOGUsCisJMHgxNDAwLCAweDE1MjAsIDB4MjAwOSwgMHgwMDM4LCAweDAwMTYsIDB4MjAxMSwgMHhiMjgzLCAweDIyMDQsCisJMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjc2LCAweDExYzAsIDB4MDgwYywgMHg0YzgwLCAweDExYTgsCisJMHg2NjEyLCAweDY1MTYsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDE3MCwgMHgwMDFlLCAweDYxMWEsCisJMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgwMDFlLCAweDA4MGMsCisJMHg4MGE3LCAweDA4MGMsIDB4NmM1MCwgMHgwMDEwLCAweDAwY2UsIDB4MDAxZSwgMHgwMDRlLCAweDAwY2UsCisJMHgwMDA1LCAweDAwZjYsIDB4MDBkNiwgMHgwMDI2LCAweDAwMTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAxNTYsCisJMHgzYzAwLCAweDAwMDYsIDB4MjA3OSwgMHgwMDMwLCAweDIwNjksIDB4MDIwMCwgMHgwODBjLCAweDFkZjIsCisJMHgxNTkwLCAweDA4MGMsIDB4MWNlMiwgMHgwNWM4LCAweDA0ZDksIDB4MTEzMCwgMHg3OTA4LCAweGExOGMsCisJMHgxZmZmLCAweGExODIsIDB4MDAxMSwgMHgxNjg4LCAweDIwYTksIDB4MDAwYywgMHgyMGUxLCAweDAwMDAsCisJMHgyZWEwLCAweDIwOTksIDB4MDIwYSwgMHg1M2E1LCAweDIwZTEsIDB4MjAwMCwgMHgyMDAxLCAweDAyMGEsCisJMHgyMDA0LCAweDdhMGMsIDB4NzgwOCwgMHhhMDgwLCAweDAwMDcsIDB4YTA4NCwgMHgxZmY4LCAweDA0MDEsCisJMHgxMTIwLCAweGEwOGEsIDB4MDE0MCwgMHgxYTBjLCAweDE0ZjYsIDB4ODBhYywgMHgyMGUxLCAweDYwMDAsCisJMHgyMDk5LCAweDAyMGEsIDB4NTNhNSwgMHgyMGUxLCAweDcwMDAsIDB4NjgyOCwgMHg2ODI4LCAweDc4MDMsCisJMHgwMDA0LCAweGEyOTQsIDB4MDA3MCwgMHgwMDBlLCAweDIwZTAsIDB4MDE1ZSwgMHgwMTRlLCAweDAxM2UsCisJMHgwMDFlLCAweDAwMmUsIDB4MDBkZSwgMHgwMGZlLCAweDAwMDUsIDB4YTA4NSwgMHgwMDAxLCAweDBjOTgsCisJMHgwMDA2LCAweDIwMDEsIDB4MDExMSwgMHgyMDA0LCAweGEwODQsIDB4MDAwMywgMHgwMDBlLCAweDAwMDUsCisJMHgwMDQ2LCAweDAwZTYsIDB4MDBkNiwgMHgyMDI4LCAweDIxMzAsIDB4YTY5NiwgMHgwMGZmLCAweDExOTgsCisJMHhhNTk2LCAweGZmZmQsIDB4MTEyMCwgMHgyMDA5LCAweDAwN2YsIDB4MDgwNCwgMHg2MmNhLCAweGE1OTYsCisJMHhmZmZlLCAweDExMTgsIDB4MjAwOSwgMHgwMDdlLCAweDA0ZTgsIDB4YTU5NiwgMHhmZmZjLCAweDExMTgsCisJMHgyMDA5LCAweDAwODAsIDB4MDRiOCwgMHgyMDExLCAweDAwMDAsIDB4MjAxOSwgMHhhZDM0LCAweDIzMWMsCisJMHhkM2FjLCAweDAxMzgsIDB4MjAyMSwgMHgwMDAwLCAweDIwYTksIDB4MDBmZiwgMHgyMDcxLCAweGFlMzQsCisJMHgwMDMwLCAweDIwMjEsIDB4MDA4MSwgMHgyMGE5LCAweDAwN2UsIDB4MjA3MSwgMHhhZWI1LCAweDJlMWMsCisJMHg4M2ZmLCAweDExMjgsIDB4ODJmZiwgMHgxMTk4LCAweDI0MTAsIDB4YzJmZCwgMHgwMDgwLCAweDIzNjgsCisJMHg2ZjEwLCAweDAwMDYsIDB4MjEwMCwgMHhhNzA2LCAweDAwMGUsIDB4NmIxNCwgMHgxMTIwLCAweGEzNDYsCisJMHgxMTEwLCAweDI0MDgsIDB4MDA3OCwgMHg4N2ZmLCAweDExMTAsIDB4ODNmZiwgMHgwZDU4LCAweDg0MjAsCisJMHg4ZTcwLCAweDFmMDQsIDB4NjJhNywgMHg4MmZmLCAweDExMTgsIDB4YTA4NSwgMHgwMDAxLCAweDAwMTgsCisJMHhjMmZjLCAweDIyMDgsIDB4YTAwNiwgMHgwMGRlLCAweDAwZWUsIDB4MDA0ZSwgMHgwMDA1LCAweGEwODQsCisJMHgwMDA3LCAweDAwMGEsIDB4MDAwNSwgMHg2MmRiLCAweDYyZGIsIDB4NjJkYiwgMHg2NDFhLCAweDYyZGIsCisJMHg2MmRjLCAweDYyZjEsIDB4NjM1ZCwgMHgwMDA1LCAweDcxMTAsIDB4ZDFiYywgMHgwMTg4LCAweDcxMjAsCisJMHgyMTYwLCAweGFjOGMsIDB4MDAwNywgMHgxMTYwLCAweGFjOGEsIDB4YjQwMCwgMHgwMjQ4LCAweDY4NTgsCisJMHhhYzAyLCAweDEyMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksIDB4MDA0NiwgMHgwODBjLCAweDgwYTcsCisJMHgwMDA1LCAweDAwYzYsIDB4NzExMCwgMHhkMWJjLCAweDE5MDQsIDB4NjM0NCwgMHgyMDExLCAweGIyODMsCisJMHgyMjA0LCAweDgyMTEsIDB4MjIwYywgMHgwODBjLCAweDI2NzYsIDB4MTkwNCwgMHg2MzQ0LCAweDA4MGMsCisJMHg0YzgwLCAweDE5MDQsIDB4NjM0NCwgMHg2NjEyLCAweDY1MTYsIDB4NjAwMCwgMHhkMGVjLCAweDE1ZTAsCisJMHg2MjA0LCAweGEyOTQsIDB4ZmYwMCwgMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMTYwLCAweDA4MGMsCisJMHg1NzRmLCAweDExZDAsIDB4NjIwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LCAweDExYTAsCisJMHhhMjk1LCAweDA2MDAsIDB4NjIwNiwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLCAweDA1MzAsCisJMHg2MTFhLCAweDYwMWYsIDB4MDAwNiwgMHg3MTIwLCAweDYxMGEsIDB4NzEzMCwgMHg2MTUyLCAweDIwMDksCisJMHgwMDQ0LCAweDA4MGMsIDB4ODBhNywgMHgwMGMwLCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDAwMWUsCisJMHgwMTk4LCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHhhMjg2LCAweDAwMDQsCisJMHgxMTE4LCAweDYwMDcsIDB4MDAwNSwgMHgwMDEwLCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsCisJMHgwODBjLCAweDY3ZWUsIDB4MDgwYywgMHg2YzUwLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDA4MGMsCisJMHg5ODA3LCAweDAwMWUsIDB4MGRjOCwgMHg2MTFhLCAweDYwMWYsIDB4MDAwNiwgMHg3MTIwLCAweDYxMGEsCisJMHg3MTMwLCAweDYxNTIsIDB4NjAxMywgMHgwMzAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDEsCisJMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDBjMzgsIDB4NzExMCwgMHhkMWJjLCAweDAxODgsCisJMHg3MDIwLCAweDIwNjAsIDB4YWM4NCwgMHgwMDA3LCAweDExNjAsIDB4YWM4MiwgMHhiNDAwLCAweDAyNDgsCisJMHg2ODU4LCAweGFjMDIsIDB4MTIzMCwgMHg3MTI0LCAweDYxMGEsIDB4MjAwOSwgMHgwMDQ1LCAweDA4MGMsCisJMHg4MGE3LCAweDAwMDUsIDB4NzExMCwgMHhhMThjLCAweGZmMDAsIDB4ODEwZiwgMHhhMThlLCAweDAwMDAsCisJMHgxMTMwLCAweGEwODQsIDB4MDAwZiwgMHhhMDhhLCAweDAwMDYsIDB4MTIwOCwgMHgwMDBiLCAweDAwMDUsCisJMHg2Mzg2LCAweDYzODcsIDB4NjM4NiwgMHg2Mzg2LCAweDYzZjAsIDB4NjNmYywgMHgwMDA1LCAweDcxMTAsCisJMHhkMWJjLCAweDAxMjAsIDB4NzAyYywgMHhkMDg0LCAweDA5MDQsIDB4NjNlZiwgMHg3MDBjLCAweDcxMDgsCisJMHgwODBjLCAweDI2NzYsIDB4MTkwNCwgMHg2M2VmLCAweDA4MGMsIDB4NGM4MCwgMHgxOTA0LCAweDYzZWYsCisJMHg2NjEyLCAweDY1MTYsIDB4NjIwNCwgMHg3MTEwLCAweGQxYmMsIDB4MDFmOCwgMHhhMjhjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDQsIDB4MDExOCwgMHhhMTg2LCAweDAwMDYsIDB4MTVjOCwgMHgwMGM2LCAweDA4MGMsCisJMHg2NDA4LCAweDAwY2UsIDB4MDkwNCwgMHg2M2VmLCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDAwMWUsCisJMHgwNWYwLCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMiwgMHg3MTIwLCAweDYxMGEsCisJMHgyMDA5LCAweDAwODgsIDB4MDgwYywgMHg4MGE3LCAweDA0OTAsIDB4YTI4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDA2LCAweDAxNjAsIDB4YTE4NiwgMHgwMDA0LCAweDAxNDgsIDB4YTI5NCwgMHhmZjAwLCAweDgyMTcsCisJMHhhMjg2LCAweDAwMDQsIDB4MDExOCwgMHhhMjg2LCAweDAwMDYsIDB4MTE4OCwgMHgwMGM2LCAweDA4MGMsCisJMHg4MDIyLCAweDAwMWUsIDB4MDFlMCwgMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLCAweDAwMDUsCisJMHg3MTIwLCAweDYxMGEsIDB4MjAwOSwgMHgwMDg4LCAweDA4MGMsIDB4ODBhNywgMHgwMDgwLCAweDAwYzYsCisJMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTU4LCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LCAweDYwMWYsCisJMHgwMDA0LCAweDcxMjAsIDB4NjEwYSwgMHgyMDA5LCAweDAwMDEsIDB4MDgwYywgMHg4MGE3LCAweDAwMDUsCisJMHg3MTEwLCAweGQxYmMsIDB4MDE0MCwgMHgwMGExLCAweDAxMzAsIDB4NzEyNCwgMHg2MTBhLCAweDIwMDksCisJMHgwMDg5LCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LCAweDcxMTAsIDB4ZDFiYywgMHgwMTQwLCAweDAwNDEsCisJMHgwMTMwLCAweDcxMjQsIDB4NjEwYSwgMHgyMDA5LCAweDAwOGEsIDB4MDgwYywgMHg4MGE3LCAweDAwMDUsCisJMHg3MDIwLCAweDIwNjAsIDB4YWM4NCwgMHgwMDA3LCAweDExNTgsIDB4YWM4MiwgMHhiNDAwLCAweDAyNDAsCisJMHgyMDAxLCAweGFkMTYsIDB4MjAwNCwgMHhhYzAyLCAweDEyMTgsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZTgsIDB4NzExMCwgMHhkMWJjLCAweDExNzgsIDB4NzAyNCwgMHgyMDYwLCAweGFjODQsCisJMHgwMDA3LCAweDExNTAsIDB4YWM4MiwgMHhiNDAwLCAweDAyMzgsIDB4Njg1OCwgMHhhYzAyLCAweDEyMjAsCisJMHgyMDA5LCAweDAwNTEsIDB4MDgwYywgMHg4MGE3LCAweDAwMDUsIDB4MjAzMSwgMHgwMTA1LCAweDAwNjksCisJMHgwMDA1LCAweDIwMzEsIDB4MDIwNiwgMHgwMDQ5LCAweDAwMDUsIDB4MjAzMSwgMHgwMjA3LCAweDAwMjksCisJMHgwMDA1LCAweDIwMzEsIDB4MDIxMywgMHgwMDA5LCAweDAwMDUsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZjYsCisJMHg3MDAwLCAweGEwODQsIDB4ZjAwMCwgMHhhMDg2LCAweGMwMDAsIDB4MDViMCwgMHgwODBjLCAweDgwMjIsCisJMHgwNTk4LCAweDAwNjYsIDB4MDBjNiwgMHgwMDQ2LCAweDIwMTEsIDB4YjI4MywgMHgyMjA0LCAweDgyMTEsCisJMHgyMjBjLCAweDA4MGMsIDB4MjY3NiwgMHgxNTgwLCAweDA4MGMsIDB4NGM4MCwgMHgxNTY4LCAweDY2MTIsCisJMHg2NTE2LCAweDJjMDAsIDB4MDA0ZSwgMHgwMGNlLCAweDYwMWEsIDB4MDgwYywgMHg5OTU2LCAweDA4MGMsCisJMHgxNWQ5LCAweDAxZjAsIDB4MmQwMCwgMHg2MDU2LCAweDY4MDMsIDB4MDAwMCwgMHg2ODM3LCAweDAwMDAsCisJMHg2YzNhLCAweGFkZjgsIDB4MDAwZiwgMHgyMGE5LCAweDAwMGUsIDB4MmZhMCwgMHgyZTk4LCAweDUzYTMsCisJMHgwMDZlLCAweDY2MTIsIDB4NjAwNywgMHgwMDNlLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsCisJMHgwODBjLCAweDY3ZWUsIDB4MDgwYywgMHg2YzUwLCAweDAwZmUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsCisJMHgwODBjLCAweDgwNzgsIDB4MDA2ZSwgMHgwY2MwLCAweDAwNGUsIDB4MDBjZSwgMHgwY2M4LCAweDIwNzEsCisJMHhhZmRhLCAweDcwMDMsIDB4MDAwMywgMHg3MDBmLCAweDAzNjEsIDB4YTAwNiwgMHg3MDFhLCAweDcwMTIsCisJMHg3MDE3LCAweGI0MDAsIDB4NzAwNywgMHgwMDAwLCAweDcwMjYsIDB4NzAyYiwgMHg3ODQxLCAweDcwMzIsCisJMHg3MDM3LCAweDc4OWQsIDB4NzAzYiwgMHhmZmZmLCAweDcwM2YsIDB4ZmZmZiwgMHg3MDQyLCAweDcwNDcsCisJMHg0MWIzLCAweDAwMDUsIDB4MjA3MSwgMHhhZmRhLCAweDFkMDQsIDB4NjRmYywgMHgyMDkxLCAweDYwMDAsCisJMHg3MDBjLCAweDgwMDEsIDB4NzAwZSwgMHgxMTgwLCAweDcwMGYsIDB4MDM2MSwgMHg3MDA3LCAweDAwMDEsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg3MDQwLCAweGEwMGQsIDB4MDE0OCwgMHg4MTA5LCAweDcxNDIsCisJMHgxMTMwLCAweDcwNDQsIDB4MDgwZiwgMHgwMDE4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDcwMjQsCisJMHhhMDBkLCAweDAxODgsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsIDB4MTE2OCwgMHg3MDIzLCAweDAwMDksCisJMHg4MTA5LCAweDcxMjYsIDB4YTE4NiwgMHgwM2U4LCAweDExMTAsIDB4NzAyOCwgMHgwODBmLCAweDgxZmYsCisJMHgxMTEwLCAweDcwMjgsIDB4MDgwZiwgMHg3MDMwLCAweGEwMGQsIDB4MDE1OCwgMHg3MDJjLCAweDgwMDEsCisJMHg3MDJlLCAweDExMzgsIDB4NzAyZiwgMHgwMDA5LCAweDgxMDksIDB4NzEzMiwgMHgxMTEwLCAweDcwMzQsCisJMHgwODBmLCAweDcwMzgsIDB4YTAwNSwgMHgwMTE4LCAweDAzMTAsIDB4ODAwMSwgMHg3MDNhLCAweDcwM2MsCisJMHhhMDA1LCAweDAxMTgsIDB4MDMxMCwgMHg4MDAxLCAweDcwM2UsIDB4NzAxOCwgMHhhMDBkLCAweDAxNTgsCisJMHg3MDA4LCAweDgwMDEsIDB4NzAwYSwgMHgxMTM4LCAweDcwMGIsIDB4MDAwOSwgMHg4MTA5LCAweDcxMWEsCisJMHgxMTEwLCAweDcwMWMsIDB4MDgwZiwgMHgwMTJlLCAweDcwMDQsIDB4MDAwMiwgMHg2NTIyLCAweDY1MjMsCisJMHg2NTNiLCAweDAwZTYsIDB4MjA3MSwgMHhhZmRhLCAweDcwMTgsIDB4YTAwNSwgMHgxMTIwLCAweDcxMWEsCisJMHg3MjFlLCAweDcwMGIsIDB4MDAwOSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMDA2LCAweDIwNzEsCisJMHhhZmRhLCAweDcwMWMsIDB4YTIwNiwgMHgxMTEwLCAweDcwMWEsIDB4NzAxZSwgMHgwMDBlLCAweDAwZWUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZmRhLCAweDYwODgsIDB4YTEwMiwgMHgwMjA4LCAweDYxOGEsCisJMHgwMGVlLCAweDAwMDUsIDB4MDAwNSwgMHg3MTEwLCAweDA4MGMsIDB4NGNkYywgMHgxMTU4LCAweDYwODgsCisJMHg4MDAxLCAweDAyNDAsIDB4NjA4YSwgMHgxMTMwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsCisJMHg2YzUwLCAweDAxMmUsIDB4ODEwOCwgMHhhMTgyLCAweDAwZmYsIDB4MDIxOCwgMHhhMDBlLCAweDcwMDcsCisJMHgwMDAyLCAweDcxMTIsIDB4MDAwNSwgMHg3MDE0LCAweDIwNjAsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDNjLCAweGEwMDUsIDB4MDEyOCwgMHg4MDAxLCAweDYwM2UsIDB4MTExMCwgMHgwODBjLCAweDk4NDYsCisJMHg2MDE0LCAweGEwMDUsIDB4MDUwMCwgMHg4MDAxLCAweDYwMTYsIDB4MTFlOCwgMHg2MTFjLCAweGExODYsCisJMHgwMDAzLCAweDAxMTgsIDB4YTE4NiwgMHgwMDA2LCAweDExYTAsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTQsCisJMHhhMDhhLCAweDE5OWEsIDB4MDI3MCwgMHhhMDgyLCAweDE5OTksIDB4Njg1NiwgMHhhMDhhLCAweDE5OWEsCisJMHgwMjEwLCAweDIwMDEsIDB4MTk5OSwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDYxMTYsCisJMHgwMDEwLCAweDA4MGMsIDB4OTM1MCwgMHgwMTJlLCAweGFjODgsIDB4MDAxOCwgMHg3MTE2LCAweDIwMDEsCisJMHhlNDAwLCAweGExMDIsIDB4MDIyMCwgMHg3MDE3LCAweGI0MDAsIDB4NzAwNywgMHgwMDAwLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4YWZkYSwgMHg3MDI3LCAweDA3ZDAsIDB4NzAyMywgMHgwMDA5LCAweDAwZWUsCisJMHgwMDA1LCAweDIwMDEsIDB4YWZlMywgMHgyMDAzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsCisJMHhhZmRhLCAweDcxMzIsIDB4NzAyZiwgMHgwMDA5LCAweDAwZWUsIDB4MDAwNSwgMHgyMDExLCAweGFmZTYsCisJMHgyMDEzLCAweDAwMDAsIDB4MDAwNSwgMHgwMGU2LCAweDIwNzEsIDB4YWZkYSwgMHg3MTFhLCAweDcyMWUsCisJMHg3MDBiLCAweDAwMDksIDB4MDBlZSwgMHgwMDA1LCAweDAwYzYsIDB4MjA2MSwgMHhiMDQ4LCAweDAwY2UsCisJMHgwMDA1LCAweGExODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweGIwNDgsCisJMHgyMDYwLCAweDAwMDUsIDB4Njg1NCwgMHhhMDhhLCAweDE5OWEsIDB4MDIxMCwgMHgyMDAxLCAweDE5OTksCisJMHhhMDA1LCAweDExNTAsIDB4MDBjNiwgMHgyMDYxLCAweGIwNDgsIDB4NjAxNCwgMHgwMGNlLCAweGEwMDUsCisJMHgxMTM4LCAweDIwMDEsIDB4MDAxZSwgMHgwMDIwLCAweGEwOGUsIDB4ZmZmZiwgMHgxMTA4LCAweGEwMDYsCisJMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDYxMTYsIDB4Njg0YywgMHhhMDhjLCAweDAwYzAsCisJMHhhMThlLCAweDAwYzAsIDB4MDViMCwgMHhkMGI0LCAweDExMzgsIDB4ZDBiYywgMHgxNTI4LCAweDIwMDksCisJMHgwMDA2LCAweDA4MGMsIDB4NjYxYSwgMHgwMDA1LCAweGQwZmMsIDB4MDEzMCwgMHhhMDg0LCAweDAwMDMsCisJMHgwMTE4LCAweGEwODYsIDB4MDAwMywgMHgxNWMwLCAweDYwMjAsIDB4ZDBkNCwgMHgwMTMwLCAweGMwZDQsCisJMHg2MDIyLCAweDY4NjAsIDB4NjAyYSwgMHg2ODVjLCAweDYwMmUsIDB4MjAwOSwgMHhhZDczLCAweDIxMDQsCisJMHhkMDg0LCAweDAxMjgsIDB4MjAwOSwgMHgwMDQyLCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LCAweDIwMDksCisJMHgwMDQzLCAweDA4MGMsIDB4ODBhNywgMHgwMDA1LCAweGQwZmMsIDB4MDEzMCwgMHhhMDg0LCAweDAwMDMsCisJMHgwMTE4LCAweGEwODYsIDB4MDAwMywgMHgxMWMwLCAweDIwMDksIDB4MDA0MiwgMHgwODBjLCAweDgwYTcsCisJMHgwMDA1LCAweGQwZmMsIDB4MDE1MCwgMHhhMDg0LCAweDAwMDMsIDB4YTA4ZSwgMHgwMDAyLCAweDAxMzgsCisJMHgyMDA5LCAweDAwNDEsIDB4MDgwYywgMHg4MGE3LCAweDAwMDUsIDB4MDA1MSwgMHgwY2U4LCAweDIwMDksCisJMHgwMDQzLCAweDA4MGMsIDB4ODBhNywgMHgwY2MwLCAweDIwMDksIDB4MDAwNCwgMHgwMDE5LCAweDAwMDUsCisJMHgyMDA5LCAweDAwMDEsIDB4MDBkNiwgMHg2MDEwLCAweGEwZWMsIDB4ZjAwMCwgMHgwMWYwLCAweDIwNjgsCisJMHg2OTUyLCAweDY4MDAsIDB4NjAxMiwgMHhhMTg2LCAweDAwMDEsIDB4MTE4OCwgMHg2OTRjLCAweGExOGMsCisJMHg4MTAwLCAweGExOGUsIDB4ODEwMCwgMHgxMTU4LCAweDAwYzYsIDB4MjA2MSwgMHhiMDQ4LCAweDYyMDAsCisJMHhkMjhjLCAweDExMjAsIDB4NjIwNCwgMHg4MjEwLCAweDAyMDgsIDB4NjIwNiwgMHgwMGNlLCAweDA4MGMsCisJMHg1MTBjLCAweDYwMTAsIDB4YTA2ZCwgMHgxOTBjLCAweDY1YWEsIDB4MDBkZSwgMHgwMDA1LCAweDAxNTYsCisJMHgwMGM2LCAweDIwNjEsIDB4YjA0OCwgMHg2MDAwLCAweDgxZmYsIDB4MDExMCwgMHhhMjA1LCAweDAwMDgsCisJMHhhMjA0LCAweDYwMDIsIDB4MDBjZSwgMHgwMTVlLCAweDAwMDUsIDB4NjgwMCwgMHhkMDhjLCAweDExMzgsCisJMHg2ODA4LCAweGEwMDUsIDB4MDEyMCwgMHg4MDAxLCAweDY4MGEsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHgyMGE5LCAweDAwMTAsIDB4YTAwNiwgMHg4MDA0LCAweDgwODYsIDB4ODE4ZSwgMHgxMjA4LCAweGEyMDAsCisJMHgxZjA0LCAweDY2NWMsIDB4ODA4NiwgMHg4MThlLCAweDAwMDUsIDB4MDE1NiwgMHgyMGE5LCAweDAwMTAsCisJMHhhMDA1LCAweDAxYjgsIDB4YTExYSwgMHgxMmE4LCAweDgyMTMsIDB4ODE4ZCwgMHgwMjI4LCAweGExMWEsCisJMHgxMjIwLCAweDFmMDQsIDB4NjY2YywgMHgwMDI4LCAweGExMWEsIDB4MjMwOCwgMHg4MjEwLCAweDFmMDQsCisJMHg2NjZjLCAweDAwMDYsIDB4MzIwMCwgMHhhMDg0LCAweGVmZmYsIDB4MjA4MCwgMHgwMDBlLCAweDAxNWUsCisJMHgwMDA1LCAweDAwMDYsIDB4MzIwMCwgMHhhMDg1LCAweDEwMDAsIDB4MGNiOCwgMHgwMTI2LCAweDIwOTEsCisJMHgyODAwLCAweDIwNzksIDB4YWZjNywgMHgwMTJlLCAweDAwZDYsIDB4MjA2OSwgMHhhZmM3LCAweDY4MDMsCisJMHgwMDA1LCAweDIwNjksIDB4MDAwNCwgMHgyZDA0LCAweGEwODUsIDB4ODAwMSwgMHgyMDZhLCAweDAwZGUsCisJMHgwMDA1LCAweDAwYzYsIDB4NjAyNywgMHgwMDAxLCAweDc4MDQsIDB4YTA4NCwgMHgwMDA3LCAweDAwMDIsCisJMHg2NmFhLCAweDY2Y2IsIDB4NjcxZSwgMHg2NmIwLCAweDY2Y2IsIDB4NjZhYSwgMHg2NmE4LCAweDY2YTgsCisJMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg2NTgxLCAweDA4MGMsIDB4NmM1MCwgMHgwMGNlLCAweDAwMDUsCisJMHg2MmMwLCAweDgyZmYsIDB4MTExMCwgMHgwMGNlLCAweDAwMDUsIDB4MjAxMSwgMHg0ODFiLCAweDA4MGMsCisJMHg2NTBkLCAweDc4MjgsIDB4YTA5MiwgMHgwMGM4LCAweDEyMjgsIDB4ODAwMCwgMHg3ODJhLCAweDA4MGMsCisJMHg0ODU1LCAweDBjODgsIDB4MDgwYywgMHg0ODFiLCAweDc4MDcsIDB4MDAwMywgMHg3ODI3LCAweDAwMDAsCisJMHg3ODJiLCAweDAwMDAsIDB4MGM0MCwgMHgwODBjLCAweDY1ODEsIDB4M2MwMCwgMHgwMDA2LCAweDIwMTEsCisJMHgwMjA5LCAweDIwZTEsIDB4NDAwMCwgMHgyMjE0LCAweDAwMGUsIDB4MjBlMCwgMHg4MmZmLCAweDAxNzgsCisJMHg2MmMwLCAweDgyZmYsIDB4MTE2MCwgMHg3ODJiLCAweDAwMDAsIDB4NzgyNCwgMHhhMDY1LCAweDA5MGMsCisJMHgxNGY2LCAweDIwMDksIDB4MDAxMywgMHgwODBjLCAweDgwYTcsIDB4MDBjZSwgMHgwMDA1LCAweDM5MDAsCisJMHhhMDgyLCAweGIwZTgsIDB4MTIxMCwgMHgwODBjLCAweDdkOGQsIDB4MDBjNiwgMHg3ODI0LCAweGEwNjUsCisJMHgwOTBjLCAweDE0ZjYsIDB4NzgwNCwgMHhhMDg2LCAweDAwMDQsIDB4MDkwNCwgMHg2NzVlLCAweDc4MjgsCisJMHhhMDkyLCAweDI3MTAsIDB4MTIzMCwgMHg4MDAwLCAweDc4MmEsIDB4MDBjZSwgMHgwODBjLCAweDc4MjcsCisJMHgwYzIwLCAweDYxMDQsIDB4YTE4NiwgMHgwMDAzLCAweDExODgsIDB4MDBlNiwgMHgyMDcxLCAweGFkMDAsCisJMHg3MGRjLCAweDAwZWUsIDB4ZDA4YywgMHgwMTUwLCAweDAwYzYsIDB4MDBlNiwgMHgyMDYxLCAweDAxMDAsCisJMHgyMDcxLCAweGFkMDAsIDB4MDgwYywgMHg0ODVlLCAweDAwZWUsIDB4MDBjZSwgMHgwODBjLCAweGFjYTIsCisJMHgyMDA5LCAweDAwMTQsIDB4MDgwYywgMHg4MGE3LCAweDAwY2UsIDB4MDgzOCwgMHgyMDAxLCAweGFmZTMsCisJMHgyMDAzLCAweDAwMDAsIDB4NjJjMCwgMHg4MmZmLCAweDExNjAsIDB4NzgyYiwgMHgwMDAwLCAweDc4MjQsCisJMHhhMDY1LCAweDA5MGMsIDB4MTRmNiwgMHgyMDA5LCAweDAwMTMsIDB4MDgwYywgMHg4MGZiLCAweDAwY2UsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgzOTAwLCAweGEwODIsIDB4YjBlOCwgMHgxMjEwLCAweDA4MGMsCisJMHg3ZDhkLCAweDc4MjQsIDB4YTAwNSwgMHgwOTBjLCAweDE0ZjYsIDB4NzgxYywgMHhhMDZkLCAweDA5MGMsCisJMHgxNGY2LCAweDY4MDAsIDB4YzBkYywgMHg2ODAyLCAweDc5MjQsIDB4MjE2MCwgMHgwODBjLCAweDgwNzgsCisJMHg2OTNjLCAweDgxZmYsIDB4MDkwYywgMHgxNGY2LCAweDgxMDksIDB4NjkzZSwgMHg2ODU0LCAweGEwMTUsCisJMHgwMTEwLCAweDdhMWUsIDB4MDAxMCwgMHg3OTE4LCAweDc5MWUsIDB4NzgwNywgMHgwMDAwLCAweDc4MjcsCisJMHgwMDAwLCAweDAwZGUsIDB4MDBjZSwgMHgwODBjLCAweDZjNTAsIDB4MDg4OCwgMHg2MTA0LCAweGExODYsCisJMHgwMDAyLCAweDAxMjgsIDB4YTE4NiwgMHgwMDA0LCAweDAxMTAsIDB4MDgwNCwgMHg2NmY3LCAweDc4MDgsCisJMHhhYzA2LCAweDA5MDQsIDB4NjZmNywgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg2N2VlLCAweDAwY2UsCisJMHgwODBjLCAweDZjNTAsIDB4MDgwNCwgMHg2NmU1LCAweDAwYzYsIDB4NjAyNywgMHgwMDAyLCAweDYyYzgsCisJMHg2MGM0LCAweGEyMDUsIDB4MTE3OCwgMHg3OTNjLCAweGExZTUsIDB4MDAwMCwgMHgwMTMwLCAweDIwMDksCisJMHgwMDQ5LCAweDA4MGMsIDB4ODBhNywgMHgwMGNlLCAweDAwMDUsIDB4MjAxMSwgMHhhZmU2LCAweDIwMTMsCisJMHgwMDAwLCAweDBjYzgsIDB4MzkwOCwgMHhhMTkyLCAweGIwZTgsIDB4MTIxMCwgMHgwODBjLCAweDdkOGQsCisJMHg3OTNjLCAweDgxZmYsIDB4MGQ5MCwgMHg3OTNjLCAweGExODgsIDB4MDAwNywgMHgyMTBjLCAweGExOGUsCisJMHgwMDA2LCAweDExMzgsIDB4NjAxNCwgMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLCAweDYwMTYsCisJMHgwYzEwLCAweDYwMTQsIDB4YTA4NCwgMHgwMTg0LCAweGEwODUsIDB4MDAxNiwgMHg2MDE2LCAweDA4ZDgsCisJMHgwMDA2LCAweDAwMTYsIDB4MDBjNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHg2MDBmLCAweDAwMDAsCisJMHgyYzA4LCAweDIwNjEsIDB4YWZjNywgMHg2MDIwLCAweDgwMDAsIDB4NjAyMiwgMHg2MDEwLCAweGEwMDUsCisJMHgwMTQ4LCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMTIsIDB4MDEyZSwgMHgwMGNlLCAweDAwMWUsCisJMHgwMDBlLCAweDAwMDUsIDB4NjExNiwgMHg2MTEyLCAweDBjYzAsIDB4MDBkNiwgMHgyMDY5LCAweGFmYzcsCisJMHg2MDAwLCAweGQwZDQsIDB4MDE2OCwgMHg2ODIwLCAweDgwMDAsIDB4NjgyMiwgMHhhMDg2LCAweDAwMDEsCisJMHgxMTEwLCAweDJjMDAsIDB4NjgxZSwgMHg2ODA0LCAweGEwODQsIDB4MDAwNywgMHgwODA0LCAweDZjNTYsCisJMHhjMGQ1LCAweDYwMDIsIDB4NjgxOCwgMHhhMDA1LCAweDAxNTgsIDB4NjA1NiwgMHg2MDViLCAweDAwMDAsCisJMHgwMDA2LCAweDJjMDAsIDB4NjgxYSwgMHgwMGRlLCAweDY4NWEsIDB4MjA2OSwgMHhhZmM3LCAweDBjMTgsCisJMHg2MDU2LCAweDYwNWEsIDB4MmMwMCwgMHg2ODFhLCAweDY4MWUsIDB4MDhlOCwgMHgwMDA2LCAweDAwMTYsCisJMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDYwMGYsIDB4MDAwMCwgMHgyYzA4LCAweDIwNjEsCisJMHhhZmM3LCAweDYwMjAsIDB4ODAwMCwgMHg2MDIyLCAweDYwMDgsIDB4YTAwNSwgMHgwMTQ4LCAweGEwODAsCisJMHgwMDAzLCAweDIxMDIsIDB4NjEwYSwgMHgwMTJlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDBlLCAweDAwMDUsCisJMHg2MTBlLCAweDYxMGEsIDB4MGNjMCwgMHgwMGM2LCAweDYwMGYsIDB4MDAwMCwgMHgyYzA4LCAweDIwNjEsCisJMHhhZmM3LCAweDYwMzQsIDB4YTAwNSwgMHgwMTMwLCAweGEwODAsIDB4MDAwMywgMHgyMTAyLCAweDYxMzYsCisJMHgwMGNlLCAweDAwMDUsIDB4NjEzYSwgMHg2MTM2LCAweDBjZDgsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsCisJMHgwMGM2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgwMTI2LCAweDIwNzEsCisJMHhhZmM3LCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDIwOTEsIDB4ODAwMCwgMHg4Y2ZmLCAweDA5MDQsCisJMHg2ODg5LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTIwNiwgMHgxOTA0LCAweDY4ODQsCisJMHg4N2ZmLCAweDAxMjAsIDB4NjA1MCwgMHhhMTA2LCAweDE5MDQsIDB4Njg4NCwgMHg3MDNjLCAweGFjMDYsCisJMHgxMTcwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2E2NCwgMHg3MDMzLCAweDAwMDAsCisJMHg3MDNmLCAweDAwMDAsIDB4NzA0MywgMHgwMDAwLCAweDcwNDcsIDB4MDAwMCwgMHgwMDNlLCAweDcwMzgsCisJMHhhYzM2LCAweDExMTAsIDB4NjYwYywgMHg3NjNhLCAweDcwMzQsIDB4YWMzNiwgMHgxMTQwLCAweDJjMDAsCisJMHhhZjM2LCAweDAxMTgsIDB4MmYwMCwgMHg3MDM2LCAweDAwMTAsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsCisJMHgwMDY2LCAweDJjMDAsIDB4YWYwNiwgMHgwMTEwLCAweDdlMGUsIDB4MDAwOCwgMHgyNjc4LCAweDYwMGYsCisJMHgwMDAwLCAweDA4MGMsIDB4OTU5NiwgMHgwMTk4LCAweDYwMTAsIDB4MjA2OCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAzLCAweDE1MTAsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsCisJMHg5N2ZkLCAweDA4MGMsIDB4YWJmYSwgMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg5NzQyLCAweDA4MGMsCisJMHg5NzRlLCAweDAwY2UsIDB4MDgwNCwgMHg2ODJlLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsCisJMHg2ODJlLCAweDAxMmUsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwY2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDE5ZDAsCisJMHgwODBjLCAweGFiZmEsIDB4MDgwYywgMHhhOTFmLCAweDBjMTAsIDB4MDAwNiwgMHgwMDY2LCAweDAwYzYsCisJMHgwMGQ2LCAweDAwZjYsIDB4MjAzMSwgMHgwMDAwLCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzksCisJMHhhZmM3LCAweDc4MzgsIDB4YTA2NSwgMHgwNTU4LCAweDYwMGMsIDB4MDAwNiwgMHg2MDBmLCAweDAwMDAsCisJMHg3ODNjLCAweGFjMDYsIDB4MTE3MCwgMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdhNjQsCisJMHg3ODMzLCAweDAwMDAsIDB4NzgzZiwgMHgwMDAwLCAweDc4NDMsIDB4MDAwMCwgMHg3ODQ3LCAweDAwMDAsCisJMHgwMDNlLCAweDA4MGMsIDB4OTU5NiwgMHgwMTc4LCAweDYwMTAsIDB4MjA2OCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAzLCAweDExYjAsIDB4NjgzNywgMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsCisJMHg1MTBjLCAweDA4MGMsIDB4OTc0MiwgMHgwODBjLCAweDk3NGUsIDB4MDAwZSwgMHgwODk4LCAweDdlM2EsCisJMHg3ZTM2LCAweDAxMmUsIDB4MDBmZSwgMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDBlLCAweDAwMDUsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwNiwgMHgxZDMwLCAweDA4MGMsIDB4YTkxZiwgMHgwYzYwLCAweDAwMTYsCisJMHgwMDI2LCAweDAwODYsIDB4MjA0MSwgMHgwMDAwLCAweDAwOTksIDB4MDgwYywgMHg2OWE5LCAweDAwOGUsCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGY2LCAweDAxMjYsIDB4MjA3OSwgMHhhZmM3LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NmEzNiwgMHgwODBjLCAweDZhYTgsIDB4MDEyZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwNjYsIDB4MDAxNiwgMHgwMDA2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZmM3LCAweDc2MTQsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsCisJMHgwOTA0LCAweDY5ODUsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHhhMjA2LCAweDE5MDQsCisJMHg2OTgwLCAweDg4ZmYsIDB4MDEyMCwgMHg2MDUwLCAweGExMDYsIDB4MTkwNCwgMHg2OTgwLCAweDcwMjQsCisJMHhhYzA2LCAweDE1MzgsIDB4MjA2OSwgMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwMWYwLCAweDA4MGMsCisJMHg2NTgxLCAweDA4MGMsIDB4NzgzNCwgMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg3Y2E4LCAweDcwMjcsCisJMHgwMDAwLCAweDAwMzYsIDB4MjA2OSwgMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAxMjAsCisJMHg2ODAzLCAweDAxMDAsIDB4NjgwMywgMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsCisJMHgwMTEwLCAweDY4MjcsIDB4MDAwMSwgMHgwMDNlLCAweDAwMjAsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsCisJMHgwNGI4LCAweDcwMTQsIDB4YWMzNiwgMHgxMTEwLCAweDY2MGMsIDB4NzYxNiwgMHg3MDEwLCAweGFjMzYsCisJMHgxMTQwLCAweDJjMDAsIDB4YWYzNiwgMHgwMTE4LCAweDJmMDAsIDB4NzAxMiwgMHgwMDEwLCAweDcwMTMsCisJMHgwMDAwLCAweDY2MGMsIDB4MDA2NiwgMHgyYzAwLCAweGFmMDYsIDB4MDExMCwgMHg3ZTBlLCAweDAwMDgsCisJMHgyNjc4LCAweDYwMGYsIDB4MDAwMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxODgsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgxNTEwLCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsCisJMHgwMDAwLCAweDA4MGMsIDB4OTdmZCwgMHgwODBjLCAweGFiZmEsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsCisJMHg5NzQyLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDdiODgsIDB4MDBjZSwgMHgwODA0LCAweDY5MGYsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDY5MGYsIDB4MDEyZSwgMHgwMDBlLCAweDAwMWUsCisJMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFjLCAweGEwODYsCisJMHgwMDA2LCAweDExMjgsIDB4MDgwYywgMHhhYmZhLCAweDA4MGMsIDB4YTkxZiwgMHgwYzEwLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDIsIDB4MTEyOCwgMHg2MDA0LCAweGEwODYsIDB4MDA4NSwgMHgwOTY4LCAweDA4YzgsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwNSwgMHgxOWE4LCAweDYwMDQsIDB4YTA4NiwgMHgwMDg1LCAweDBkNTAsCisJMHgwODgwLCAweDAwYzYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHhhMjgwLCAweGFlMzQsCisJMHgyMDA0LCAweGEwNjUsIDB4MDkwNCwgMHg2YTMyLCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwNjYsCisJMHgyMDcxLCAweGFmYzcsIDB4NjY1NCwgMHg3MDE4LCAweGFjMDYsIDB4MTEwOCwgMHg3NjFhLCAweDcwMWMsCisJMHhhYzA2LCAweDExMzAsIDB4ODZmZiwgMHgxMTE4LCAweDcwMTgsIDB4NzAxZSwgMHgwMDA4LCAweDc2MWUsCisJMHg2MDU4LCAweGEwN2QsIDB4MDEwOCwgMHg3ZTU2LCAweGE2ZWQsIDB4MDAwMCwgMHgwMTEwLCAweDJmMDAsCisJMHg2ODVhLCAweDYwNTcsIDB4MDAwMCwgMHg2MDViLCAweDAwMDAsIDB4NjAwMCwgMHhjMGQ0LCAweGMwZGMsCisJMHg2MDAyLCAweDA4MGMsIDB4NGMwNywgMHgwOTA0LCAweDZhMmUsIDB4NzYyNCwgMHg4NmZmLCAweDA1ZTgsCisJMHhhNjgwLCAweDAwMDQsIDB4MjAwNCwgMHhhZDA2LCAweDE1YzAsIDB4MDBkNiwgMHgyMDY5LCAweDAxMDAsCisJMHg2OGMwLCAweGEwMDUsIDB4MDU0OCwgMHgwODBjLCAweDY1ODEsIDB4MDgwYywgMHg3ODM0LCAweDY4YzMsCisJMHgwMDAwLCAweDA4MGMsIDB4N2NhOCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsCisJMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsCisJMHgwMGRlLCAweDAwYzYsIDB4NjAzYywgMHhhMDA1LCAweDAxMTAsIDB4ODAwMSwgMHg2MDNlLCAweDI2NjAsCisJMHgwODBjLCAweDk3NGUsIDB4MDBjZSwgMHgwMDQ4LCAweDAwZGUsIDB4MDBjNiwgMHgyNjYwLCAweDYwMDMsCisJMHgwMDA5LCAweDYzMGEsIDB4MDBjZSwgMHgwODA0LCAweDY5ZDksIDB4OGRmZiwgMHgwMTU4LCAweDY4MzcsCisJMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4OTdmZCwgMHgwODBjLCAweGFiZmEsCisJMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg3Yjg4LCAweDA4MDQsIDB4NjlkOSwgMHgwMDZlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwZmUsIDB4MDEyZSwgMHgwMDBlLCAweDAwY2UsIDB4MDAwNSwgMHgwMDA2LCAweDAwNjYsCisJMHgwMGM2LCAweDAwZDYsIDB4MjAzMSwgMHgwMDAwLCAweDc4MTQsIDB4YTA2NSwgMHgwOTA0LCAweDZhODgsCisJMHg2MDBjLCAweDAwMDYsIDB4NjAwZiwgMHgwMDAwLCAweDc4MjQsIDB4YWMwNiwgMHgxNTQwLCAweDIwNjksCisJMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwMWYwLCAweDA4MGMsIDB4NjU4MSwgMHgwODBjLCAweDc4MzQsCisJMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg3Y2E4LCAweDc4MjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksCisJMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAxMjAsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsCisJMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsCisJMHgwMDNlLCAweDAwMjgsIDB4NjAwMywgMHgwMDA5LCAweDYzMGEsIDB4MmMzMCwgMHgwMGIwLCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTY4LCAweDYwMWMsIDB4YTA4NiwgMHgwMDAzLCAweDExYjgsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsCisJMHg5NzQyLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDdiODgsIDB4MDAwZSwgMHgwODA0LCAweDZhM2QsCisJMHg3ZTE2LCAweDdlMTIsIDB4MDBkZSwgMHgwMGNlLCAweDAwNmUsIDB4MDAwZSwgMHgwMDA1LCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDYsIDB4MTExOCwgMHgwODBjLCAweGE5MWYsIDB4MGM1OCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDAyLCAweDExMjgsIDB4NjAwNCwgMHhhMDg2LCAweDAwODUsIDB4MDlkMCwgMHgwYzEwLCAweDYwMWMsCisJMHhhMDg2LCAweDAwMDUsIDB4MTlmMCwgMHg2MDA0LCAweGEwODYsIDB4MDA4NSwgMHgwZDYwLCAweDA4YzgsCisJMHgwMDA2LCAweDAwNjYsIDB4MDBjNiwgMHgwMGQ2LCAweDc4MTgsIDB4YTA2NSwgMHgwOTA0LCAweDZiMGUsCisJMHg2MDU0LCAweDAwMDYsIDB4NjA1NywgMHgwMDAwLCAweDYwNWIsIDB4MDAwMCwgMHg2MDAwLCAweGMwZDQsCisJMHhjMGRjLCAweDYwMDIsIDB4MDgwYywgMHg0YzA3LCAweDA5MDQsIDB4NmIwYiwgMHg3ZTI0LCAweDg2ZmYsCisJMHgwNWU4LCAweGE2ODAsIDB4MDAwNCwgMHgyMDA0LCAweGFkMDYsIDB4MTVjMCwgMHgwMGQ2LCAweDIwNjksCisJMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwNTQ4LCAweDA4MGMsIDB4NjU4MSwgMHgwODBjLCAweDc4MzQsCisJMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg3Y2E4LCAweDc4MjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksCisJMHgwMTQwLCAweDZiMDQsIDB4YTM4NCwgMHgxMDAwLCAweDAxMjAsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsCisJMHgwMDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsCisJMHgwMDNlLCAweDAwZGUsIDB4MDBjNiwgMHg2MDNjLCAweGEwMDUsIDB4MDExMCwgMHg4MDAxLCAweDYwM2UsCisJMHgyNjYwLCAweDA4MGMsIDB4OTc0ZSwgMHgwMGNlLCAweDAwNDgsIDB4MDBkZSwgMHgwMGM2LCAweDI2NjAsCisJMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwMGNlLCAweDA4MDQsIDB4NmFiYSwgMHg4ZGZmLCAweDAxMzgsCisJMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsCisJMHg3Yjg4LCAweDA4MDQsIDB4NmFiYSwgMHgwMDBlLCAweDA4MDQsIDB4NmFhZCwgMHg3ODFlLCAweDc4MWEsCisJMHgwMGRlLCAweDAwY2UsIDB4MDA2ZSwgMHgwMDBlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwNjYsCisJMHg2MDAwLCAweGQwZGMsIDB4MDE4OCwgMHg2MDRjLCAweGEwNmQsIDB4MDE3MCwgMHg2ODQ4LCAweGE2MDYsCisJMHgxMTU4LCAweDIwNzEsIDB4YWZjNywgMHg3MDI0LCAweGEwMzUsIDB4MDEzMCwgMHhhMDgwLCAweDAwMDQsCisJMHgyMDA0LCAweGFkMDYsIDB4MTEwOCwgMHgwMDIxLCAweDAwNmUsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OGMwLCAweGEwMDUsIDB4MTEzOCwgMHgwMGM2LCAweDI2NjAsCisJMHg2MDAzLCAweDAwMDksIDB4NjMwYSwgMHgwMGNlLCAweDA0YTAsIDB4MDgwYywgMHg3ODM0LCAweDc4YzMsCisJMHgwMDAwLCAweDA4MGMsIDB4N2NhOCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDc5LCAweDAxNDAsCisJMHg3YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDc4MDMsIDB4MDEwMCwgMHg3ODAzLCAweDAwMDAsCisJMHgyMDc5LCAweDAxMDAsIDB4NzgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NzgyNywgMHgwMDAxLCAweDA4MGMsCisJMHg3Y2E4LCAweDAwM2UsIDB4MDgwYywgMHg0YzA3LCAweDAwYzYsIDB4NjAzYywgMHhhMDA1LCAweDAxMTAsCisJMHg4MDAxLCAweDYwM2UsIDB4MjY2MCwgMHgwODBjLCAweDgwNzgsIDB4MDBjZSwgMHg2ODM3LCAweDAxMDMsCisJMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDk3ZmQsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsCisJMHg3Yjg4LCAweDAwZmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsIDB4MjA3MSwgMHhhZmM3LCAweDcwMDQsCisJMHhhMDg0LCAweDAwMDcsIDB4MDAwMiwgMHg2Yjg1LCAweDZiODgsIDB4NmI5ZSwgMHg2YmI3LCAweDZiZjAsCisJMHg2Yjg1LCAweDZiODMsIDB4NmI4MywgMHgwODBjLCAweDE0ZjYsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsCisJMHg3MDI0LCAweGEwNjUsIDB4MDE0OCwgMHg3MDIwLCAweDgwMDEsIDB4NzAyMiwgMHg2MDBjLCAweGEwMTUsCisJMHgwMTUwLCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDI3LCAweDAwMDAsCisJMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHg3MjE2LCAweDcyMTIsIDB4MGNiMCwgMHg2MDE4LCAweDIwNjAsCisJMHgwODBjLCAweDRjMDcsIDB4NjAwMCwgMHhjMGRjLCAweDYwMDIsIDB4NzAyMCwgMHg4MDAxLCAweDcwMjIsCisJMHgwMTIwLCAweDYwNTQsIDB4YTAxNSwgMHgwMTQwLCAweDcyMWUsIDB4NzAwNywgMHgwMDAwLCAweDcwMjcsCisJMHgwMDAwLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDcyMTgsIDB4NzIxZSwgMHgwY2IwLCAweDcwMjQsCisJMHhhMDY1LCAweDA1OTgsIDB4NzAwYywgMHhhYzA2LCAweDExNjAsIDB4MDgwYywgMHg3Yjg4LCAweDYwMGMsCisJMHhhMDE1LCAweDAxMjAsIDB4NzIwZSwgMHg2MDBmLCAweDAwMDAsIDB4MDQyOCwgMHg3MjBlLCAweDcyMGEsCisJMHgwNDEwLCAweDcwMTQsIDB4YWMwNiwgMHgxMTYwLCAweDA4MGMsIDB4N2I4OCwgMHg2MDBjLCAweGEwMTUsCisJMHgwMTIwLCAweDcyMTYsIDB4NjAwZiwgMHgwMDAwLCAweDAwYjAsIDB4NzIxNiwgMHg3MjEyLCAweDAwOTgsCisJMHg2MDE4LCAweDIwNjAsIDB4MDgwYywgMHg0YzA3LCAweDYwMDAsIDB4YzBkYywgMHg2MDAyLCAweDA4MGMsCisJMHg3Yjg4LCAweDcwMWMsIDB4YTA2NSwgMHgwMTM4LCAweDYwNTQsIDB4YTAxNSwgMHgwMTEwLCAweDcyMWUsCisJMHgwMDEwLCAweDcyMTgsIDB4NzIxZSwgMHg3MDI3LCAweDAwMDAsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsCisJMHg3MDI0LCAweGEwNjUsIDB4MDE0MCwgMHgwODBjLCAweDdiODgsIDB4NjAwYywgMHhhMDE1LCAweDAxNTAsCisJMHg3MjBlLCAweDYwMGYsIDB4MDAwMCwgMHgwODBjLCAweDdjYTgsIDB4NzAyNywgMHgwMDAwLCAweDAwY2UsCisJMHgwMGVlLCAweDAwMDUsIDB4NzIwZSwgMHg3MjBhLCAweDBjYjAsIDB4MDBkNiwgMHgyMDY5LCAweGFmYzcsCisJMHg2ODMwLCAweGEwODQsIDB4MDAwMywgMHgwMDAyLCAweDZjMTIsIDB4NmMxNCwgMHg2YzM4LCAweDZjMTAsCisJMHgwODBjLCAweDE0ZjYsIDB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4Njg0MCwgMHhhMDg2LCAweDAwMDEsCisJMHgwMWI4LCAweDY4M2MsIDB4YTA2NSwgMHgwMTMwLCAweDYwMGMsIDB4YTAxNSwgMHgwMTcwLCAweDZhM2EsCisJMHg2MDBmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDY4M2YsIDB4MDAwMCwgMHgyMDExLCAweGFmZTYsCisJMHgyMDEzLCAweDAwMDAsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4NjgzYSwgMHg2ODM2LCAweDBjOTAsCisJMHg2ODQzLCAweDAwMDAsIDB4NjgzOCwgMHhhMDY1LCAweDBkNjgsIDB4NjAwMywgMHgwMDAzLCAweDBjNTAsCisJMHgwMGM2LCAweDY4NDMsIDB4MDAwMCwgMHg2ODQ3LCAweDAwMDAsIDB4NjgzYywgMHhhMDY1LCAweDAxNjgsCisJMHg2MDBjLCAweGEwMTUsIDB4MDEzMCwgMHg2YTNhLCAweDYwMGYsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsCisJMHgwMDIwLCAweDY4M2YsIDB4MDAwMCwgMHg2ODNhLCAweDY4MzYsIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMGQ2LCAweDIwNjksIDB4YWZjNywgMHg2ODA0LCAweGEwODQsIDB4MDAwNywgMHgwMDAyLCAweDZjNjEsCisJMHg2Y2ZkLCAweDZjZmQsIDB4NmNmZCwgMHg2Y2ZkLCAweDZjZmYsIDB4NmM1ZiwgMHg2YzVmLCAweDA4MGMsCisJMHgxNGY2LCAweDY4MjAsIDB4YTAwNSwgMHgxMTEwLCAweDAwZGUsIDB4MDAwNSwgMHgwMGM2LCAweDY4MGMsCisJMHhhMDY1LCAweDAxNTAsIDB4NjgwNywgMHgwMDA0LCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsCisJMHg2ZDQ5LCAweDAwY2UsIDB4MDBkZSwgMHgwMDA1LCAweDY4MTQsIDB4YTA2NSwgMHgwMTUwLCAweDY4MDcsCisJMHgwMDAxLCAweDY4MjYsIDB4NjgyYiwgMHgwMDAwLCAweDA4MGMsIDB4NmQ0OSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZTYsIDB4MDAzNiwgMHg2YTFjLCAweGEyZjUsIDB4MDAwMCwgMHgwOTA0LCAweDZjZjksCisJMHg3MDRjLCAweGEwMGQsIDB4MDExOCwgMHg3MDg4LCAweGEwMDUsIDB4MDFhMCwgMHg3MDU0LCAweGEwNzUsCisJMHgwMTIwLCAweGEyMGUsIDB4MDkwNCwgMHg2Y2Y5LCAweDAwMjgsIDB4NjgxOCwgMHhhMjBlLCAweDA5MDQsCisJMHg2Y2Y5LCAweDIwNzAsIDB4NzA0YywgMHhhMDBkLCAweDBkODgsIDB4NzA4OCwgMHhhMDA1LCAweDFkNzAsCisJMHgyZTAwLCAweDY4MWUsIDB4NzMzYywgMHg3MDM4LCAweGEzMDIsIDB4MWU0MCwgMHgwODBjLCAweDgwNGYsCisJMHgwOTA0LCAweDZjZjksIDB4ODMxOCwgMHg3MzNlLCAweDYxMTIsIDB4MmUxMCwgMHg2MjFhLCAweGExODAsCisJMHgwMDE0LCAweDIwMDQsIDB4YTA4NCwgMHgwMGZmLCAweDYwNWEsIDB4YTE4MCwgMHgwMDE0LCAweDIwMDMsCisJMHgwMDAwLCAweGExODAsIDB4MDAxNSwgMHgyMDA0LCAweGEwOGEsIDB4MTk5YSwgMHgwMjEwLCAweDIwMDEsCisJMHgxOTk5LCAweDgwMDMsIDB4ODAxYiwgMHg4MzFiLCAweGEzMTgsIDB4NjMxNiwgMHgwMDNlLCAweDAwZjYsCisJMHgyYzc4LCAweDcxYTAsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgxMTEwLCAweGQxYmMsCisJMHgwMTUwLCAweDcxMDAsIDB4ZDFmNCwgMHgwMTIwLCAweDcxMTQsIDB4YTE4YywgMHgwMGZmLCAweDAwNDAsCisJMHgyMDA5LCAweDAwMDAsIDB4MDAyOCwgMHhhMWUwLCAweDJiZTYsIDB4MmMwZCwgMHhhMThjLCAweDAwZmYsCisJMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHgwODBjLCAweDczNmYsIDB4NzMwMCwgMHhjM2RkLCAweDczMDIsCisJMHg2ODA3LCAweDAwMDIsIDB4MmYxOCwgMHg2YjI2LCAweDY4MmIsIDB4MDAwMCwgMHg3ODFmLCAweDAwMDMsCisJMHg3ODAzLCAweDAwMDEsIDB4NzgwNywgMHgwMDQwLCAweDAwZmUsIDB4MDBlZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwM2UsIDB4MDBlZSwgMHgwMGNlLCAweDBjZDAsIDB4MDBkZSwgMHgwMDA1LCAweDAwYzYsCisJMHg2ODBjLCAweGEwNjUsIDB4MDEzOCwgMHg2ODA3LCAweDAwMDQsIDB4NjgyNiwgMHg2ODJiLCAweDAwMDAsCisJMHgwODBjLCAweDZkNDksIDB4MDBjZSwgMHgwMGRlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGQ2LCAweDIwNjksCisJMHhhZmM3LCAweDY4MzAsIDB4YTA4NiwgMHgwMDAwLCAweDExYzAsIDB4MjAwMSwgMHhhZDBjLCAweDIwMGMsCisJMHhkMWJjLCAweDE1NTAsIDB4NjgzOCwgMHhhMDdkLCAweDAxODAsIDB4NjgzMywgMHgwMDAxLCAweDY4M2UsCisJMHg2ODQ3LCAweDAwMDAsIDB4MDEyNiwgMHgwMGY2LCAweDIwOTEsIDB4MjQwMCwgMHgwMDJlLCAweDA4MGMsCisJMHgxZWU2LCAweDExMzAsIDB4MDEyZSwgMHgwODBjLCAweDc2YTUsIDB4MDBkZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMTJlLCAweGUwMDAsIDB4Njg0MywgMHgwMDAwLCAweDc4MDMsIDB4MDAwMiwgMHg3ODBjLCAweGEwMTUsCisJMHgwMTQwLCAweDZhM2EsIDB4NzgwZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHg2ODNmLCAweDAwMDAsCisJMHgwYzYwLCAweDY4M2EsIDB4NjgzNiwgMHgwY2MwLCAweGMxYmMsIDB4MjEwMiwgMHgwODBjLCAweDU3ZDEsCisJMHgwODg4LCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMGIsIDB4MDAwNSwgMHg2ZDU3LCAweDZkNWMsCisJMHg3MjEwLCAweDczMmMsIDB4NmQ1YywgMHg3MjEwLCAweDczMmMsIDB4NmQ1NywgMHg2ZDVjLCAweDA4MGMsCisJMHg2YjczLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDAwYzYsCisJMHgwMGY2LCAweDYwMDQsIDB4YTA4YSwgMHgwMDgwLCAweDFhMGMsIDB4MTRmNiwgMHg2MTE4LCAweDIxNzgsCisJMHg3OWEwLCAweDIwMTEsIDB4YWQzNCwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMWJjLCAweDAxNTAsCisJMHg3OTAwLCAweGQxZjQsIDB4MDEyMCwgMHg3OTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLCAweDIwMDksCisJMHgwMDAwLCAweDAwMjgsIDB4YTFmOCwgMHgyYmU2LCAweDJmMGQsIDB4YTE4YywgMHgwMGZmLCAweDJjNzgsCisJMHgyMDYxLCAweDAxMDAsIDB4NjE5YSwgMHhhMDhhLCAweDAwNDAsIDB4MWEwNCwgMHg2ZGQwLCAweDAwMzMsCisJMHgwMGZlLCAweDAwY2UsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDAwNSwgMHg2ZTdjLCAweDZlYzcsCisJMHg2ZWY0LCAweDZmYzEsIDB4NmZlZiwgMHg2ZmY3LCAweDcwMWQsIDB4NzAyZSwgMHg3MDNmLCAweDcwNDcsCisJMHg3MDVkLCAweDcwNDcsIDB4NzBiNywgMHg3MDJlLCAweDcwZDgsIDB4NzBlMCwgMHg3MDNmLCAweDcwZTAsCisJMHg3MGYxLCAweDZkY2UsIDB4NmRjZSwgMHg2ZGNlLCAweDZkY2UsIDB4NmRjZSwgMHg2ZGNlLCAweDZkY2UsCisJMHg2ZGNlLCAweDZkY2UsIDB4NmRjZSwgMHg2ZGNlLCAweDc5MGQsIDB4NzkzMiwgMHg3OTQ3LCAweDc5NmEsCisJMHg3OThiLCAweDcwMWQsIDB4NmRjZSwgMHg3MDFkLCAweDcwNDcsIDB4NmRjZSwgMHg2ZWY0LCAweDZmYzEsCisJMHg2ZGNlLCAweDdkYWEsIDB4NzA0NywgMHg2ZGNlLCAweDdkY2EsIDB4NzA0NywgMHg2ZGNlLCAweDcwM2YsCisJMHg2ZTc1LCAweDZkZTAsIDB4NmRjZSwgMHg3ZGVmLCAweDdlNjQsIDB4N2YzYiwgMHg2ZGNlLCAweDdmNGMsCisJMHg3MDE4LCAweDdmNjgsIDB4NmRjZSwgMHg3OWEwLCAweDdmYzMsIDB4NmRjZSwgMHgwODBjLCAweDE0ZjYsCisJMHgyMTAwLCAweDAwMzMsIDB4MDBmZSwgMHgwMGNlLCAweDAxNGUsIDB4MDEzZSwgMHgwMTVlLCAweDAwMDUsCisJMHg2ZGRlLCAweDZkZGUsIDB4NmRkZSwgMHg2ZTE0LCAweDZlMzIsIDB4NmU0OCwgMHgwODBjLCAweDE0ZjYsCisJMHgwMGQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsIDB4NzgxMCwgMHgyMDY4LCAweDIwYTMsCisJMHgyNDE0LCAweDIwYTMsIDB4MDAxOCwgMHgyMGEzLCAweDA4MDAsIDB4NjgzYywgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDY4NTAsCisJMHgyMGEyLCAweDY4NTQsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDE4LCAweDA4MGMsIDB4NzgyMSwgMHgwMGRlLCAweDAwMDUsIDB4MDBkNiwgMHg3ODE4LCAweDIwNjgsCisJMHg2OGEwLCAweDIwNjksIDB4YWQwMCwgMHg2YWQwLCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxMTAsCisJMHhhMDg1LCAweDAwMDEsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3MTBlLCAweDIwYTMsIDB4MDUwMCwgMHgyMGEzLCAweDAwMDAsIDB4NzgxMCwgMHhhMGU4LCAweDAwMGYsCisJMHg2ODA4LCAweDIwYTIsIDB4NjgwYywgMHgyMGEyLCAweDY4MTAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHg2ODE4LCAweDIwYTIsIDB4NjgxYywgMHgyMGEyLCAweDYwYzMsIDB4MDAxMCwgMHgwODBjLCAweDc4MjEsCisJMHgwMGRlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsCisJMHgyMGEzLCAweDc4MDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MDgsIDB4ODAwNywgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsCisJMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAyMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhkZjEwLCAweDIwYTMsIDB4MDAzNCwgMHgyMDk5LCAweGFkMDUsCisJMHgyMGE5LCAweDAwMDQsIDB4NTNhNiwgMHgyMDk5LCAweGFkMDEsIDB4MjBhOSwgMHgwMDA0LCAweDUzYTYsCisJMHgyMDk5LCAweGFmYWQsIDB4MjBhOSwgMHgwMDFhLCAweDMzMDQsIDB4ODAwNywgMHgyMGEyLCAweDkzOTgsCisJMHgxZjA0LCAweDZlNjQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwNGMsCisJMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDE0LCAweDIwMDQsCisJMHg2MDlhLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsCisJMHgyMGEzLCAweDUyMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwZDYsIDB4MjA2OSwgMHhhZDUxLCAweDY4MDQsCisJMHhkMDg0LCAweDAxNTAsIDB4NjgyOCwgMHgyMGEzLCAweDAwMDAsIDB4MDAxNiwgMHgwODBjLCAweDI2OGEsCisJMHgyMWEyLCAweDAwMWUsIDB4MDBkZSwgMHgwMDI4LCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGFkMDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGFkMDEsIDB4NTNhNiwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGFjLCAweDExMzgsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsIDB4MDA3ZiwgMHgwMjM4LCAweDIwMDEsCisJMHhhZDFiLCAweDIwYTYsIDB4MjAwMSwgMHhhZDFjLCAweDIwYTYsIDB4MDA0MCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDAxLCAweGFkMTQsIDB4MjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDFjLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzEwZSwgMHgyMGEzLCAweDA1MDAsIDB4MjBhMywgMHgwMDAwLCAweDIwMDEsCisJMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgxMTM4LCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDgyLCAweDAwN2YsIDB4MDIzOCwgMHgyMDAxLCAweGFkMWIsIDB4MjBhNiwgMHgyMDAxLCAweGFkMWMsCisJMHgyMGE2LCAweDAwNDAsIDB4MjBhMywgMHgwMDAwLCAweDIwMDEsIDB4YWQxNCwgMHgyMDA0LCAweGEwODQsCisJMHgwMGZmLCAweDIwYTIsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YWQwNSwgMHg1M2E2LCAweDYwYzMsCisJMHgwMDEwLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsCisJMHgwMGM2LCAweDc4MTgsIDB4MjA2MCwgMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg1MDM3LCAweDAwY2UsCisJMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODYsIDB4MDA3ZSwgMHgxMTMwLCAweDIwYTMsCisJMHgwNDAwLCAweDYyMGMsIDB4YzJiNCwgMHg2MjBlLCAweDAwMTAsIDB4MjBhMywgMHgwMzAwLCAweDIwYTMsCisJMHgwMDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsIDB4YTA4NiwgMHgwMDdlLCAweDE5MDQsCisJMHg2ZjgzLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYTQsIDB4MDFjOCwgMHgyMDk5LCAweGFmOGQsCisJMHgzM2E2LCAweDkzOTgsIDB4MjBhMywgMHgwMDAwLCAweDkzOTgsIDB4MzMwNCwgMHhhMDg0LCAweDIwMDAsCisJMHgyMGEyLCAweDkzOTgsIDB4MzNhNiwgMHg5Mzk4LCAweDIwYTMsIDB4MDAwMCwgMHg5Mzk4LCAweDIwMDEsCisJMHgyNzEwLCAweDIwYTIsIDB4OTM5OCwgMHgzM2E2LCAweDkzOTgsIDB4MzNhNiwgMHgwMGQwLCAweDIwOTksCisJMHhhZjhkLCAweDMzYTYsIDB4OTM5OCwgMHgzM2E2LCAweDkzOTgsIDB4MzMwNCwgMHgwODBjLCAweDU3NGYsCisJMHgxMTE4LCAweGEwODQsIDB4MzdmZiwgMHgwMDEwLCAweGEwODQsIDB4M2ZmZiwgMHgyMGEyLCAweDkzOTgsCisJMHgzM2E2LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwNCwgMHgyMDk5LCAweGFkMDUsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDQsCisJMHgyMDk5LCAweGFkMDEsIDB4NTNhNiwgMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsCisJMHg2ZjVkLCAweDIwYTksIDB4MDAwOCwgMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg2ZjYzLCAweDIwOTksCisJMHhhZjk1LCAweDMzMDQsIDB4YzBkZCwgMHgyMGEyLCAweDIwMDEsIDB4YWQ3MSwgMHgyMDA0LCAweGQwZTQsCisJMHgwMTU4LCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4OTM5OCwgMHg5Mzk4LCAweDkzOTgsCisJMHgzM2E2LCAweDIwYTksIDB4MDAwNCwgMHgwMDEwLCAweDIwYTksIDB4MDAwNywgMHgyMGEzLCAweDAwMDAsCisJMHgxZjA0LCAweDZmN2UsIDB4MDQ2OCwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhkMGE0LCAweDAxNDAsCisJMHgyMDAxLCAweGFmOGUsIDB4MjAwNCwgMHg2MGUzLCAweDAwMDAsIDB4MDgwYywgMHgyNmNiLCAweDYwZTIsCisJMHgyMDk5LCAweGFmOGQsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksCisJMHhhZDA1LCAweDUzYTYsIDB4MjBhOSwgMHgwMDA0LCAweDIwOTksIDB4YWQwMSwgMHg1M2E2LCAweDIwYTksCisJMHgwMDA4LCAweDIwYTMsIDB4MDAwMCwgMHgxZjA0LCAweDZmYTEsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTMsCisJMHgwMDAwLCAweDFmMDQsIDB4NmZhNywgMHgyMDk5LCAweGFmOTUsIDB4MjBhOSwgMHgwMDA4LCAweDUzYTYsCisJMHgyMGE5LCAweDAwMDgsIDB4MjBhMywgMHgwMDAwLCAweDFmMDQsIDB4NmZiMiwgMHgyMGE5LCAweDAwMGEsCisJMHgyMGEzLCAweDAwMDAsIDB4MWYwNCwgMHg2ZmI4LCAweDYwYzMsIDB4MDA3NCwgMHgwODBjLCAweDc4MjEsCisJMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsIDB4MjBhMywgMHgyMDEwLCAweDIwYTMsCisJMHgwMDE0LCAweDIwYTMsIDB4MDgwMCwgMHgyMGEzLCAweDIwMDAsIDB4YTAwNiwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgwMGY2LCAweDIwNzksIDB4YWQ1MSwgMHg3OTA0LCAweDAwZmUsCisJMHhkMWFjLCAweDExMTAsIDB4YTA4NSwgMHgwMDIwLCAweGQxYTQsIDB4MDExMCwgMHhhMDg1LCAweDAwMTAsCisJMHhhMDg1LCAweDAwMDIsIDB4MDBkNiwgMHgwODA0LCAweDcwOTksIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE0LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzEwZSwgMHgyMGEzLCAweDUwMDAsIDB4MDgwNCwgMHg2ZjBmLCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzEwZSwgMHgyMGEzLCAweDIxMTAsIDB4MjBhMywgMHgwMDE0LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWEyLCAweDAwMjAsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3MWFhLCAweDIwYTMsIDB4MDIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwNCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsCisJMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDMsCisJMHgyMGEzLCAweDJhMDAsIDB4NjBjMywgMHgwMDA4LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAyMDAsIDB4MDgwNCwgMHg2ZjBmLCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAxMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MjgsCisJMHhhMDA1LCAweDAxMTAsIDB4MjBhMiwgMHgwMDEwLCAweDIwYTMsIDB4MDAwMywgMHg3ODEwLCAweDIwYTIsCisJMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsIDB4MDBkNiwgMHgyMGExLCAweDAyMGIsCisJMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMjEwLCAweDIwYTMsIDB4MDAxNCwgMHgyMGEzLCAweDA4MDAsCisJMHg3ODE4LCAweDIwNjgsIDB4Njg5NCwgMHhhMDg2LCAweDAwMTQsIDB4MTE3OCwgMHg2OTk4LCAweGExODQsCisJMHhjMDAwLCAweDExNDAsIDB4ZDFlYywgMHgwMTE4LCAweDIwYTMsIDB4MjEwMCwgMHgwMDQwLCAweDIwYTMsCisJMHgwMTAwLCAweDAwMjgsIDB4MjBhMywgMHgwNDAwLCAweDAwMTAsIDB4MjBhMywgMHgwNzAwLCAweGEwMDYsCisJMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MDBmNiwgMHgyMDc5LCAweGFkNTEsCisJMHg3OTA0LCAweDAwZmUsIDB4ZDFhYywgMHgxMTEwLCAweGEwODUsIDB4MDAyMCwgMHhkMWE0LCAweDAxMTAsCisJMHhhMDg1LCAweDAwMTAsIDB4MjAwOSwgMHhhZDczLCAweDIxMGMsIDB4ZDE4NCwgMHgxMTEwLCAweGEwODUsCisJMHgwMDAyLCAweDAwMjYsIDB4MjAwOSwgMHhhZDcxLCAweDIxMGMsIDB4ZDFlNCwgMHgwMTMwLCAweGMwYzUsCisJMHhhMDk0LCAweDAwMzAsIDB4YTI5NiwgMHgwMDEwLCAweDAxNDAsIDB4ZDFlYywgMHgwMTMwLCAweGEwOTQsCisJMHgwMDMwLCAweGEyOTYsIDB4MDAxMCwgMHgwMTA4LCAweGMwYmQsIDB4MDAyZSwgMHgyMGEyLCAweDIwYTIsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAxNCwgMHgwODBjLCAweDc4MjEsIDB4MDBkZSwgMHgwMDA1LCAweDIwYTEsCisJMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAyMTAsIDB4MjBhMywgMHgwMDE0LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTQsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWFhLCAweDIwYTMsIDB4MDIwMCwgMHgwODA0LCAweDZlODIsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWFhLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDMsIDB4MjBhMywgMHgyYTAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDc4MjEsCisJMHgwMDA1LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3MWFhLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDBiLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDc4MjEsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsCisJMHgwMDQ2LCAweDIwMTksIDB4MzIwMCwgMHgyMDIxLCAweDA4MDAsIDB4MDAzOCwgMHgwMDI2LCAweDAwMzYsCisJMHgwMDQ2LCAweDIwMTksIDB4MjIwMCwgMHgyMDIxLCAweDAxMDAsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsCisJMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMTQsIDB4YTI4NiwgMHgwMDdlLCAweDExYTAsCisJMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsCisJMHhhZDE0LCAweDIyMTQsIDB4MjAwMSwgMHhhZjlkLCAweDIwMDQsIDB4YTAwNSwgMHgwMTE4LCAweDIwMTEsCisJMHhhZDFjLCAweDIyMTQsIDB4MjJhMiwgMHgwNGQwLCAweGEyODYsIDB4MDA3ZiwgMHgxMTM4LCAweDAwZDYsCisJMHhhMzg1LCAweDAwZmYsIDB4MjBhMiwgMHgyMGEzLCAweGZmZmQsIDB4MDBjOCwgMHgyMDAxLCAweGFkMzQsCisJMHgyMDA0LCAweGQwYWMsIDB4MTExMCwgMHhkMmJjLCAweDAxYzgsIDB4YTI4NiwgMHgwMDgwLCAweDAwZDYsCisJMHgxMTMwLCAweGEzODUsIDB4MDBmZiwgMHgyMGEyLCAweDIwYTMsIDB4ZmZmYywgMHgwMDQwLCAweGEyZTgsCisJMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksCisJMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsIDB4MDA4MCwgMHgwMGQ2LCAweGEyZTgsCisJMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsCisJMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhhZDE0LCAweDIyMTQsIDB4MjJhMiwgMHhhNDg1LCAweDAwMjksCisJMHgyMGEyLCAweDAwNGUsIDB4MDAzZSwgMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ODEwLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MmZhMiwgMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMDI2LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsCisJMHgyMGEzLCAweDAyZmYsIDB4MjAxMSwgMHhmZmZjLCAweDIyYTIsIDB4MDBkNiwgMHgyMDY5LCAweGFkMWIsCisJMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDIwYTMsIDB4MjAyOSwgMHgyMGEzLCAweDAwMDAsCisJMHgwOGUwLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHhmYzAyLCAweDIwYTMsCisJMHgwMDAwLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgzMzAwLCAweDIwMjEsCisJMHgwODAwLCAweDAwMzgsIDB4MDAyNiwgMHgwMDM2LCAweDAwNDYsIDB4MjAxOSwgMHgyMzAwLCAweDIwMjEsCisJMHgwMTAwLCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweDIwMTEsIDB4YWQzNCwgMHgyMjE0LCAweGQyYWMsIDB4MTExOCwgMHhhMDkyLCAweDAwN2UsCisJMHgwMmQ4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMzA1LCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4NjgxMCwgMHhhMDA1LCAweDExNDAsIDB4NjgxNCwgMHhhMDA1LCAweDExMjgsCisJMHgyMGEzLCAweDAwZmYsIDB4MjBhMywgMHhmZmZlLCAweDAwMjgsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsCisJMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDgwLCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEzMDUsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsCisJMHgyMDExLCAweGFkMTQsIDB4MjIxNCwgMHgyMmEyLCAweGE0ODUsIDB4MDA5OCwgMHgyMGEyLCAweDIwYTMsCisJMHgwMDAwLCAweDAwNGUsIDB4MDAzZSwgMHgwODBjLCAweDc4MTAsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg3YTA4LCAweDIyYTIsIDB4MmZhMiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwMmUsCisJMHgwMDA1LCAweDA4MGMsIDB4NzgxMCwgMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHg3YTA4LCAweDIyYTIsCisJMHg3ODEwLCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDUsCisJMHgwMGM2LCAweDAwZjYsIDB4NjAwNCwgMHhhMDhhLCAweDAwODUsIDB4MGEwYywgMHgxNGY2LCAweGEwOGEsCisJMHgwMDhjLCAweDFhMGMsIDB4MTRmNiwgMHg2MTE4LCAweDIxNzgsIDB4NzlhMCwgMHgyMDExLCAweGFkMzQsCisJMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMWJjLCAweDAxNTAsIDB4NzkwMCwgMHhkMWY0LCAweDAxMjAsCisJMHg3OTE0LCAweGExOGMsIDB4MDBmZiwgMHgwMDQwLCAweDIwMDksIDB4MDAwMCwgMHgwMDI4LCAweGExZjgsCisJMHgyYmU2LCAweDJmMGQsIDB4YTE4YywgMHgwMGZmLCAweDJjNzgsIDB4MjA2MSwgMHgwMTAwLCAweDYxOWEsCisJMHhhMDgyLCAweDAwODUsIDB4MDAxYiwgMHgwMGZlLCAweDAwY2UsIDB4MDAwNSwgMHg3MjQ3LCAweDcyNTEsCisJMHg3MjZjLCAweDcyNDUsIDB4NzI0NSwgMHg3MjQ1LCAweDcyNDcsIDB4MDgwYywgMHgxNGY2LCAweDAxNDYsCisJMHgyMGExLCAweDAyMGIsIDB4MDRhMSwgMHg2MGMzLCAweDAwMDAsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsCisJMHgwMDA1LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzJiOCwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NzgwOCwgMHgyMGEyLCAweDc4MTAsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweGZmZmYsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMGMsCisJMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMDA1LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3MmYyLCAweDIwYTMsIDB4MDAwMywgMHgyMGEzLCAweDAzMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDYwYzMsIDB4MDAwNCwgMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMDA1LCAweDAwMjYsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsIDB4YTA5MiwgMHgwMDdlLCAweDAyODgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHg4MTAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsCisJMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDgxMDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGFkMTQsCisJMHgyMjE0LCAweDIyYTIsIDB4MjBhMywgMHgwMDA5LCAweDIwYTMsIDB4MDAwMCwgMHgwODA0LCAweDcxNzUsCisJMHgwMDI2LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweDIwMTEsIDB4YWQzNCwgMHgyMjE0LCAweGQyYWMsIDB4MTExOCwgMHhhMDkyLCAweDAwN2UsCisJMHgwMjg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDg0MDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgyMDY5LCAweGFkMWIsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsCisJMHgwMGRlLCAweDAwODgsIDB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHg4NDAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDAwZGUsIDB4MjBhMywgMHgwMDAwLCAweDIwMTEsCisJMHhhZDE0LCAweDIyMTQsIDB4MjJhMiwgMHgyMDAxLCAweDAwOTksIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgwODA0LCAweDcyMDEsIDB4MDAyNiwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsCisJMHhhMDkyLCAweDAwN2UsIDB4MDI4OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDg1MDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsCisJMHg4ZDY4LCAweDJkYTYsIDB4MDBkZSwgMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsCisJMHg2ODEwLCAweGEwODUsIDB4ODUwMCwgMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsCisJMHgwMDAwLCAweDIwMTEsIDB4YWQxNCwgMHgyMjE0LCAweDIyYTIsIDB4MjAwMSwgMHgwMDk5LCAweDIwYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MDgwNCwgMHg3MjAxLCAweDAwYzYsIDB4MDBmNiwgMHgyYzc4LCAweDc4MDQsCisJMHhhMDhhLCAweDAwNDAsIDB4MGEwYywgMHgxNGY2LCAweGEwOGEsIDB4MDA1MywgMHgxYTBjLCAweDE0ZjYsCisJMHg3OTE4LCAweDIxNjAsIDB4NjFhMCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsCisJMHhkMWJjLCAweDAxNTAsIDB4NjEwMCwgMHhkMWY0LCAweDAxMjAsIDB4NjExNCwgMHhhMThjLCAweDAwZmYsCisJMHgwMDQwLCAweDIwMDksIDB4MDAwMCwgMHgwMDI4LCAweGExZTAsIDB4MmJlNiwgMHgyYzBkLCAweGExOGMsCisJMHgwMGZmLCAweDIwNjEsIDB4MDEwMCwgMHg2MTlhLCAweGEwODIsIDB4MDA0MCwgMHgwMDFiLCAweDAwZmUsCisJMHgwMGNlLCAweDAwMDUsIDB4NzM2ZiwgMHg3NDdiLCAweDc0MTgsIDB4NzYxYSwgMHg3MzZkLCAweDczNmQsCisJMHg3MzZkLCAweDczNmQsIDB4NzM2ZCwgMHg3MzZkLCAweDczNmQsIDB4N2I0MSwgMHg3YjUxLCAweDdiNjEsCisJMHg3YjcxLCAweDczNmQsIDB4N2Y3OSwgMHg3MzZkLCAweDdiMzAsIDB4MDgwYywgMHgxNGY2LCAweDAwZDYsCisJMHgwMTU2LCAweDAxNDYsIDB4NzgwYiwgMHhmZmZmLCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDczY2YsCisJMHg3OTEwLCAweDIxNjgsIDB4Njk0OCwgMHg3OTUyLCAweDIxYTIsIDB4YTAxNiwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDY5NGMsIDB4YTE4NCwgMHgwMDBmLCAweDExMTgsIDB4MjAwMSwgMHgwMDA1LCAweDAwNDAsCisJMHhkMTg0LCAweDAxMTgsIDB4MjAwMSwgMHgwMDA0LCAweDAwMTgsIDB4YTA4NCwgMHgwMDA2LCAweDgwMDQsCisJMHgwMDE2LCAweDIwMDgsIDB4Nzg1OCwgMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHhhMTA1LCAweDAwMWUsCisJMHgyMGEyLCAweGQxYWMsIDB4MDExOCwgMHgyMGEzLCAweDAwMDIsIDB4MDA0OCwgMHhkMWI0LCAweDAxMTgsCisJMHgyMGEzLCAweDAwMDEsIDB4MDAyMCwgMHgyMGEzLCAweDAwMDAsIDB4MjIzMCwgMHgwMDEwLCAweDZhODAsCisJMHg2ZTdjLCAweDIwYTksIDB4MDAwOCwgMHgwMTM2LCAweGFkODgsIDB4MDAxNywgMHgyMTk4LCAweDIwYTEsCisJMHgwMjFiLCAweDUzYTYsIDB4MDEzZSwgMHgyMGExLCAweDAyMGIsIDB4MjJhMiwgMHgyNmEyLCAweDYwYzMsCisJMHgwMDIwLCAweDIwZTEsIDB4OTA4MCwgMHg2MDE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMDksCisJMHg2MDE2LCAweDIwMDEsIDB4YWZlMywgMHgyMDAzLCAweDA3ZDAsIDB4MjAwMSwgMHhhZmUyLCAweDIwMDMsCisJMHgwMDA5LCAweDA4MGMsIDB4MTdiZiwgMHgwMTRlLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDIwZTEsCisJMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3YTE4LCAweGEyODAsIDB4MDAyMywgMHgyMDE0LCAweDgyMTAsCisJMHhhMjk0LCAweDAwZmYsIDB4MjIwMiwgMHg4MjE3LCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHgyMDE5LCAweGFkMzQsIDB4MjMxYywgMHhkM2FjLCAweDExMTAsIDB4ZDBiYywgMHgwMTg4LCAweDAwZDYsCisJMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDYwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDAwODgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNjAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAwOSwgMHhhZDE0LCAweDIxMGMsCisJMHgyMWEyLCAweDIwYTMsIDB4MDgyOSwgMHgyMGEzLCAweDAwMDAsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyZmEyLCAweDIwYTMsIDB4ZmZmZiwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDAwMDUsCisJMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwMGMxLCAweDc4MTAsCisJMHgyMDY4LCAweDY4NjAsIDB4MjBhMiwgMHg2ODVjLCAweDIwYTIsIDB4Njg4MCwgMHgyMGEyLCAweDY4N2MsCisJMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHg2MGMzLCAweDAwMGMsCisJMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMjYsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsIDB4ZDBiYywgMHgwMTg4LCAweDAwZDYsCisJMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsIDB4MDUwMCwgMHgyMGEyLCAweDY4MTQsCisJMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsIDB4MmRhNiwgMHgwMGRlLCAweDAwODgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNTAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsIDB4MjAxMSwgMHhhZDE0LCAweDIyMTQsCisJMHgyMmEyLCAweDIwYTMsIDB4MDg4OSwgMHgyMGEzLCAweDAwMDAsIDB4MDgwYywgMHg3ODEwLCAweDIyYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4N2EwOCwgMHgyMmEyLCAweDJmYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDAwMmUsIDB4MDAwNSwgMHgwMGQ2LCAweDAxNTYsIDB4MDEzNiwgMHgwMTQ2LCAweDc4MTAsCisJMHhhMDZkLCAweDA4MGMsIDB4NTAyNSwgMHgwMTQ4LCAweDY4NGMsIDB4YTA4NCwgMHgyMDIwLCAweGEwODYsCisJMHgyMDIwLCAweDExMTgsIDB4NzgyMCwgMHhjMGNkLCAweDc4MjIsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3NWQwLCAweGEwMTYsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDc4MTAsCisJMHhhMDg0LCAweGYwMDAsIDB4MTEzMCwgMHg3ODEwLCAweGEwODQsIDB4MDcwMCwgMHg4MDA3LCAweDAwNDMsCisJMHgwMDEwLCAweGEwMDYsIDB4MDAyYiwgMHgwMTRlLCAweDAxM2UsIDB4MDE1ZSwgMHgwMGRlLCAweDAwMDUsCisJMHg3NGIyLCAweDc1NDcsIDB4NzU1MCwgMHg3NTc5LCAweDc1OGMsIDB4NzVhNywgMHg3NWIwLCAweDc0YjAsCisJMHgwODBjLCAweDE0ZjYsIDB4MDAxNiwgMHgwMDM2LCAweDY5NGMsIDB4YTE4YywgMHgwMDAzLCAweDAxMTgsCisJMHhhMTg2LCAweDAwMDMsIDB4MTE3MCwgMHg2Yjc4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMzZTUsCisJMHgyM2EyLCAweDY4NjgsIDB4MjBhMiwgMHg2ODY0LCAweDIwYTIsIDB4MDAzZSwgMHgwMDFlLCAweDA4MDQsCisJMHg3NTgzLCAweGExODYsIDB4MDAwMSwgMHgxOTBjLCAweDE0ZjYsIDB4NmI3OCwgMHg3ODIwLCAweGQwY2MsCisJMHgwMTA4LCAweGMzZTUsIDB4MjNhMiwgMHg2ODY4LCAweDIwYTIsIDB4Njg2NCwgMHgyMGEyLCAweDIyYTIsCisJMHg2ODc0LCAweDIwYTIsIDB4MjJhMiwgMHg2ODdjLCAweDIwYTIsIDB4MjAwOSwgMHgwMDE4LCAweGEzODQsCisJMHgwMzAwLCAweDA5MDQsIDB4NzU0MSwgMHhkM2M0LCAweDAxMTAsIDB4Njg3YywgMHhhMTA4LCAweGQzY2MsCisJMHgwMTEwLCAweDY4NzQsIDB4YTEwOCwgMHgwMTU2LCAweDIwYTksIDB4MDAwZCwgMHhhZDgwLCAweDAwMjAsCisJMHgyMDFjLCAweDgzMWYsIDB4MjNhMiwgMHg4MDAwLCAweDFmMDQsIDB4NzRmMCwgMHgwMTVlLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4YTE4NCwgMHgwMDAzLCAweDA5MDQsIDB4NzU0MSwgMHgyMGExLCAweDAyMGIsCisJMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDAwMDYsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweDIwMTEsIDB4YWQzNCwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxODgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsCisJMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGFkMTQsCisJMHgyMjE0LCAweDIyYTIsIDB4MDAwZSwgMHg3YjIwLCAweGQzY2MsIDB4MDExOCwgMHgyMGEzLCAweDA4ODksCisJMHgwMDEwLCAweDIwYTMsIDB4MDg5OCwgMHgyMGEyLCAweDA4MGMsIDB4NzgxMCwgMHgyMmEyLCAweDIwYTMsCisJMHgwMDAwLCAweDYxYzIsIDB4MDAzZSwgMHgwMDFlLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwMTEsCisJMHgwMDA4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDA0ODgsCisJMHgyMDExLCAweDAzMDIsIDB4NzgyMCwgMHhkMGNjLCAweDAxMDgsIDB4YzJlNSwgMHgyMmEyLCAweGEwMTYsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMGEzLCAweDAwMTIsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDgsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIwYTMsIDB4NzAwMCwgMHgyMGEzLCAweDA1MDAsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAwYSwgMHgyMmEyLCAweDIyYTIsIDB4MjBhMywgMHgyNTAwLCAweDIyYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDYwYzMsIDB4MDAzMiwgMHgwODBjLCAweDc4MjEsCisJMHgwMDA1LCAweDIwMTEsIDB4MDAyOCwgMHg3ODIwLCAweGQwY2MsIDB4MDEwOCwgMHhjMmU1LCAweDIyYTIsCisJMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDYwYzMsCisJMHgwMDE4LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwMTEsIDB4MDEwMCwgMHg3ODIwLCAweGQwY2MsCisJMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDIyYTIsIDB4MjJhMiwgMHgyMmEyLCAweDIyYTIsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAwOCwgMHgyMmEyLCAweDc4NTQsIDB4YTA4NCwgMHgwMGZmLCAweDIwYTIsCisJMHgyMmEyLCAweDIyYTIsIDB4NjBjMywgMHgwMDIwLCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwMTEsCisJMHgwMDA4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHhhMDE2LCAweDA4ODgsCisJMHgwMDM2LCAweDdiMTAsIDB4YTM4NCwgMHhmZjAwLCAweDc4MTIsIDB4YTM4NCwgMHgwMGZmLCAweDgwMDEsCisJMHgxMTM4LCAweDc4MjAsIDB4ZDBjYywgMHgwMTA4LCAweGMyZTUsIDB4MjJhMiwgMHgwMDNlLCAweDA4MDgsCisJMHgwMDQ2LCAweDIwMjEsIDB4MDgwMCwgMHgwMDA2LCAweDc4MjAsIDB4ZDBjYywgMHgwMDBlLCAweDAxMDgsCisJMHhjNGU1LCAweDI0YTIsIDB4MDA0ZSwgMHgyMmEyLCAweDIwYTIsIDB4MDAzZSwgMHgwODA0LCAweDc1ODMsCisJMHgwMDI2LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweDIwMTEsIDB4YWQzNCwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxODgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwNzAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsCisJMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDA3MDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGFkMTQsCisJMHgyMjE0LCAweDIyYTIsIDB4NzgyMCwgMHhkMGNjLCAweDAxMTgsIDB4MjBhMywgMHgwODg5LCAweDAwMTAsCisJMHgyMGEzLCAweDA4OTgsIDB4MjBhMywgMHgwMDAwLCAweDA4MGMsIDB4NzgxMCwgMHgyMmEyLCAweDIwYTMsCisJMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHgyZmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHgwMDJlLCAweDAwMDUsIDB4MDBkNiwgMHgwMTU2LCAweDAxMzYsIDB4MDE0NiwgMHgwMDE2LCAweDAwMzYsCisJMHg3ODEwLCAweGEwODQsIDB4MDcwMCwgMHg4MDA3LCAweDAwM2IsIDB4MDAzZSwgMHgwMDFlLCAweDAxNGUsCisJMHgwMTNlLCAweDAxNWUsIDB4MDBkZSwgMHgwMDA1LCAweDc2MzQsIDB4NzYzNCwgMHg3NjM2LCAweDc2MzQsCisJMHg3NjM0LCAweDc2MzQsIDB4NzY1OCwgMHg3NjM0LCAweDA4MGMsIDB4MTRmNiwgMHg3OTEwLCAweGExOGMsCisJMHhmOGZmLCAweGExOGQsIDB4MDYwMCwgMHg3OTEyLCAweDIwYTEsIDB4MDIwYiwgMHgyMDA5LCAweDAwMDMsCisJMHgwMGY5LCAweDAwZDYsIDB4MjA2OSwgMHhhZDUxLCAweDY4MDQsIDB4ZDBiYywgMHgwMTMwLCAweDY4MmMsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHgyMGEyLCAweDAwMTAsIDB4MjBhMywgMHgzZjAwLCAweDAwZGUsCisJMHgyMmEyLCAweDIyYTIsIDB4MjJhMiwgMHg2MGMzLCAweDAwMDEsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MjAwOSwgMHgwMDAzLCAweDAwMTksIDB4MjBhMywgMHg3ZjAwLCAweDBjODAsCisJMHgwMDI2LCAweDIwZTEsIDB4OTA4MCwgMHgyMGUxLCAweDQwMDAsIDB4NzgxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweDIwMTEsIDB4YWQzNCwgMHgyMjE0LCAweGQyYWMsIDB4MTExMCwgMHhkMGJjLCAweDAxODgsCisJMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4YTA4NSwgMHgwMTAwLCAweDIwYTIsCisJMHg2ODE0LCAweDIwYTIsIDB4MjA2OSwgMHhhZDFiLCAweDJkYTYsIDB4OGQ2OCwgMHgyZGE2LCAweDAwZGUsCisJMHgwMDg4LCAweDAwZDYsIDB4YTBlOCwgMHhhZTM0LCAweDJkNmMsIDB4NjgxMCwgMHhhMDg1LCAweDAxMDAsCisJMHgyMGEyLCAweDY4MTQsIDB4MjBhMiwgMHgwMGRlLCAweDIwYTMsIDB4MDAwMCwgMHgyMDExLCAweGFkMTQsCisJMHgyMjE0LCAweDIyYTIsIDB4MjBhMywgMHgwODg4LCAweGExOGQsIDB4MDAwOCwgMHgyMWEyLCAweDA4MGMsCisJMHg3ODEwLCAweDIyYTIsIDB4MjBhMywgMHgwMDAwLCAweDdhMDgsIDB4MjJhMiwgMHgyZmEyLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwMDJlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDU2LCAweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweDAxMDAsIDB4MjA3MSwgMHhhZDAwLCAweDcxNTAsCisJMHg3ODE4LCAweDIwNjgsIDB4NjhhMCwgMHgyMDI4LCAweDc2ZDAsIDB4ZDZhYywgMHgxMTMwLCAweGQwYmMsCisJMHgxMTIwLCAweDY5MTAsIDB4NmExNCwgMHg3NDUwLCAweDAwMjAsIDB4NjkxMCwgMHg2YTE0LCAweDczNmMsCisJMHg3NDcwLCAweDc4MWMsIDB4YTBiZSwgMHgwMDA2LCAweDA5MDQsIDB4Nzc1YiwgMHhhMGJlLCAweDAwMGEsCisJMHgxNWU4LCAweGExODUsIDB4MDIwMCwgMHg2MDYyLCAweDYyNjYsIDB4NjM2YSwgMHg2NDZlLCAweDYwNzMsCisJMHgyMDI5LCAweDYwNzcsIDB4MDAwMCwgMHg2ODhjLCAweDgwMDAsIDB4YTA4NCwgMHgwMGZmLCAweDY4OGUsCisJMHg4MDA3LCAweDYwN2EsIDB4NjA3ZiwgMHgwMDAwLCAweDJmMDAsIDB4NjA4MiwgMHg3ODA4LCAweDYwODYsCisJMHg3ODEwLCAweDIwNzAsIDB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsCisJMHg3MDA4LCAweDYwY2EsIDB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsCisJMHg2MDlmLCAweDAwMDAsIDB4MDgwYywgMHg4MDE0LCAweDIwMDksIDB4MDdkMCwgMHg2MGM0LCAweGEwODQsCisJMHhmZmYwLCAweGEwMDUsIDB4MDExMCwgMHgyMDA5LCAweDFiNTgsIDB4MDgwYywgMHg2NTg2LCAweDAwM2UsCisJMHgwMDRlLCAweDAwNWUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg3MGQwLCAweGQwYWMsCisJMHgxMTEwLCAweGQ1YmMsIDB4MDEzOCwgMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsCisJMHg2NDZlLCAweDAwMzgsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsCisJMHg2NDZlLCAweDYwNzMsIDB4MDgwOSwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsCisJMHgwMGZmLCAweDY4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODIsCisJMHg3ODA4LCAweDYwODYsIDB4NzgxMCwgMHgyMDcwLCAweDcwMTQsIDB4NjA4YSwgMHg3MDEwLCAweDYwOGUsCisJMHg3MDBjLCAweDYwYzYsIDB4NzAwOCwgMHg2MGNhLCAweDY4NmMsIDB4NjBjZSwgMHg2MGFmLCAweDk1ZDUsCisJMHg2MGQ3LCAweDAwMDAsIDB4YTU4MiwgMHgwMDgwLCAweDAyNDgsIDB4NmEwMCwgMHhkMmY0LCAweDAxMjAsCisJMHg2YTE0LCAweGEyOTQsIDB4MDBmZiwgMHgwMDEwLCAweDIwMTEsIDB4MDAwMCwgMHg2MjllLCAweDA4MGMsCisJMHg4MDE0LCAweDIwMDksIDB4MDdkMCwgMHg2MGM0LCAweGEwODQsIDB4ZmZmMCwgMHhhMDA1LCAweDAxMTAsCisJMHgyMDA5LCAweDFiNTgsIDB4MDgwYywgMHg2NTg2LCAweDAwM2UsIDB4MDA0ZSwgMHgwMDVlLCAweDAwY2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHg3ODEwLCAweDIwNzAsIDB4NzA0YywgMHhhMDg0LCAweDAwMDMsCisJMHhhMDg2LCAweDAwMDIsIDB4MDkwNCwgMHg3N2IxLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYWMsCisJMHgxMTEwLCAweGQ1YmMsIDB4MDEzOCwgMHhhMTg1LCAweDAxMDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsCisJMHg2NDZlLCAweDAwMzgsIDB4YTE4NSwgMHgwMTAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsCisJMHg2NDZlLCAweDYwNzMsIDB4MDg4MCwgMHg2MDc3LCAweDAwMDgsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsCisJMHgwMGZmLCAweDY4OGUsIDB4ODAwNywgMHg2MDdhLCAweDc4MzQsIDB4NjA3ZSwgMHgyZjAwLCAweDYwODYsCisJMHg3ODA4LCAweDYwODIsIDB4NzA2MCwgMHg2MDhhLCAweDcwNWMsIDB4NjA4ZSwgMHg3MDgwLCAweDYwYzYsCisJMHg3MDdjLCAweDYwY2EsIDB4NzA3YywgMHg3OTJjLCAweGExMDgsIDB4NzkyZSwgMHg3MDgwLCAweDc5MjgsCisJMHhhMTA5LCAweDc5MmEsIDB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsCisJMHhhNTgyLCAweDAwODAsIDB4MDI0OCwgMHg2YTAwLCAweGQyZjQsIDB4MDEyMCwgMHg2YTE0LCAweGEyOTQsCisJMHgwMGZmLCAweDAwMTAsIDB4MjAxMSwgMHgwMDAwLCAweDYyOWUsIDB4MDgwYywgMHg4MDExLCAweDA4MDQsCisJMHg3NzQ5LCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGQwYWMsIDB4MTExMCwgMHhkNWJjLCAweDAxMzgsCisJMHhhMTg1LCAweDA3MDAsIDB4NjA2MiwgMHg2MjY2LCAweDYzNmEsIDB4NjQ2ZSwgMHgwMDM4LCAweGExODUsCisJMHgwNzAwLCAweDYwNjIsIDB4NjI2NiwgMHg2MDZiLCAweDAwMDAsIDB4NjQ2ZSwgMHgwODBjLCAweDUwMjUsCisJMHgwMTgwLCAweDAwZDYsIDB4NzgxMCwgMHhhMDZkLCAweDY4NGMsIDB4MDBkZSwgMHhhMDg0LCAweDIwMjAsCisJMHhhMDg2LCAweDIwMjAsIDB4MTEzMCwgMHg3ODIwLCAweGMwY2QsIDB4NzgyMiwgMHg2MDczLCAweDA4ODksCisJMHgwMDEwLCAweDYwNzMsIDB4MDg5OCwgMHg2MDc3LCAweDAwMDAsIDB4Njg4YywgMHg4MDAwLCAweGEwODQsCisJMHgwMGZmLCAweDY4OGUsIDB4ODAwNywgMHg2MDdhLCAweDYwN2YsIDB4MDAwMCwgMHgyZjAwLCAweDYwODYsCisJMHg3ODA4LCAweDYwODIsIDB4NzAxNCwgMHg2MDhhLCAweDcwMTAsIDB4NjA4ZSwgMHg3MDBjLCAweDYwYzYsCisJMHg3MDA4LCAweDYwY2EsIDB4Njg2YywgMHg2MGNlLCAweDYwYWYsIDB4OTVkNSwgMHg2MGQ3LCAweDAwMDAsCisJMHhhNTgyLCAweDAwODAsIDB4MDI0OCwgMHg2YTAwLCAweGQyZjQsIDB4MDEyMCwgMHg2YTE0LCAweGEyOTQsCisJMHgwMGZmLCAweDAwMTAsIDB4MjAxMSwgMHgwMDAwLCAweDYyOWUsIDB4NzgyMCwgMHhkMGNjLCAweDAxMjAsCisJMHgwODBjLCAweDgwMTQsIDB4MDgwNCwgMHg3NzQ5LCAweDA4MGMsIDB4ODAxMSwgMHgwODA0LCAweDc3NDksCisJMHg3YTE4LCAweGEyODAsIDB4MDAyMywgMHgyMDE0LCAweDgyMTAsIDB4YTI5NCwgMHgwMGZmLCAweDIyMDIsCisJMHg4MjE3LCAweDAwMDUsIDB4MDBkNiwgMHgyMDY5LCAweGFmYzcsIDB4Njg0MywgMHgwMDAxLCAweDAwZGUsCisJMHgwMDA1LCAweDIwZTEsIDB4OTA4MCwgMHg2MGEzLCAweDAwNTYsIDB4NjBhNywgMHg5NTc1LCAweDAwMTksCisJMHgwODBjLCAweDY1NzgsIDB4MDAwNSwgMHgwMDA2LCAweDYwMTQsIDB4YTA4NCwgMHgwMDA0LCAweGEwODUsCisJMHgwMDA5LCAweDYwMTYsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBjNiwgMHgyMDYxLCAweDAxMDAsCisJMHg2MDE0LCAweGEwODQsIDB4MDAwNCwgMHhhMDg1LCAweDAwMDgsIDB4NjAxNiwgMHgwMGNlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHgwMDE2LCAweDAwMjYsIDB4MjA2MSwgMHgwMTAwLCAweDIwNjksCisJMHgwMTQwLCAweDA4MGMsIDB4NTc0ZiwgMHgxMTc4LCAweDIwMDEsIDB4YWZlMywgMHgyMDA0LCAweGEwMDUsCisJMHgxNTk4LCAweDA4MGMsIDB4NTdkMSwgMHgxMTE4LCAweDA4MGMsIDB4NjU3OCwgMHgwNDY4LCAweDAwYzYsCisJMHgyMDYxLCAweGFmYzcsIDB4MDBkOCwgMHg2OTA0LCAweGExOTQsIDB4NDAwMCwgMHgwNTUwLCAweDA4YTEsCisJMHg2ODAzLCAweDEwMDAsIDB4NjgwMywgMHgwMDAwLCAweDAwYzYsIDB4MjA2MSwgMHhhZmM3LCAweDYxMjgsCisJMHhhMTkyLCAweDAwYzgsIDB4MTI1OCwgMHg4MTA4LCAweDYxMmEsIDB4NjEyNCwgMHgwMGNlLCAweDgxZmYsCisJMHgwMTk4LCAweDA4MGMsIDB4NjU3OCwgMHgwODBjLCAweDc4MmIsIDB4MDA3MCwgMHg2MTI0LCAweGExZTUsCisJMHgwMDAwLCAweDAxNDAsIDB4MDgwYywgMHhhY2EyLCAweDIwMDksIDB4MDAxNCwgMHgwODBjLCAweDgwYTcsCisJMHgwODBjLCAweDY1ODEsIDB4MDBjZSwgMHgwMDAwLCAweDAwMmUsIDB4MDAxZSwgMHgwMGRlLCAweDAwY2UsCisJMHgwMDA1LCAweDIwMDEsIDB4YWZlMywgMHgyMDA0LCAweGEwMDUsIDB4MWRiMCwgMHgwMGM2LCAweDIwNjEsCisJMHhhZmM3LCAweDYxMjgsIDB4YTE5MiwgMHgwMDAzLCAweDFlMDgsIDB4ODEwOCwgMHg2MTJhLCAweDAwY2UsCisJMHgwODBjLCAweDY1NzgsIDB4MDgwYywgMHg0ODVlLCAweDBjMzgsIDB4MDBjNiwgMHgwMGQ2LCAweDAwZTYsCisJMHgwMDE2LCAweDAwMjYsIDB4MDgwYywgMHg2NThlLCAweDIwNzEsIDB4YWZjNywgMHg3MTNjLCAweDgxZmYsCisJMHgwNTcwLCAweDIwNjEsIDB4MDEwMCwgMHgyMDY5LCAweDAxNDAsIDB4MDgwYywgMHg1NzRmLCAweDExODgsCisJMHgwMDM2LCAweDIwMTksIDB4MDAwMSwgMHgwODBjLCAweDdhNjQsIDB4MDAzZSwgMHg3MTNjLCAweDIxNjAsCisJMHgwODBjLCAweGFjYTIsIDB4MjAwOSwgMHgwMDRhLCAweDA4MGMsIDB4ODBhNywgMHgwODBjLCAweDU3ZDEsCisJMHgwMGIwLCAweDY5MDQsIDB4YTE5NCwgMHg0MDAwLCAweDAxYzAsIDB4NjgwMywgMHgxMDAwLCAweDY4MDMsCisJMHgwMDAwLCAweDAwMzYsIDB4MjAxOSwgMHgwMDAxLCAweDA4MGMsIDB4N2E2NCwgMHgwMDNlLCAweDcxM2MsCisJMHgyMTYwLCAweDA4MGMsIDB4YWNhMiwgMHgyMDA5LCAweDAwNGEsIDB4MDgwYywgMHg4MGE3LCAweDAwMmUsCisJMHgwMDFlLCAweDAwZWUsIDB4MDBkZSwgMHgwMGNlLCAweDAwMDUsIDB4MGM1OCwgMHgwMGU2LCAweDAwZDYsCisJMHgwMGM2LCAweDAwNjYsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHg2MDE4LCAweDIwNjgsIDB4NmNhMCwgMHgyMDcxLCAweGFmYzcsIDB4NzAxOCwgMHgyMDY4LCAweDhkZmYsCisJMHgwMTk4LCAweDY4YTAsIDB4YTQwNiwgMHgwMTE4LCAweDY4NTQsIDB4MjA2OCwgMHgwY2MwLCAweDYwMTAsCisJMHgyMDYwLCAweDY0M2MsIDB4NjU0MCwgMHg2ZTQ4LCAweDJkNjAsIDB4MDgwYywgMHg0ZTQxLCAweDAxMjAsCisJMHgwODBjLCAweDdiODgsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDAwZSwgMHgwMDRlLCAweDAwNWUsCisJMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3MTBlLCAweDIwYTMsIDB4MTIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MWMsCisJMHhhMDg2LCAweDAwMDQsIDB4MTExMCwgMHg2MDk4LCAweDAwMTgsIDB4MjAwMSwgMHhhZDE0LCAweDIwMDQsCisJMHgyMGEyLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsIDB4MjBhOSwgMHgwMDEwLCAweGEwMDYsCisJMHgyMGEyLCAweDFmMDQsIDB4NzkyOCwgMHgyMGEyLCAweDIwYTIsIDB4NjBjMywgMHgwMDJjLCAweDA4MGMsCisJMHg3ODIxLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsCisJMHgyMGEzLCAweDBmMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg3ODA4LCAweDIwYTIsCisJMHg2MGMzLCAweDAwMDgsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsIDB4MDE1ZSwgMHgwMDA1LCAweDAxNTYsCisJMHgwMTQ2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxYWEsIDB4MjBhMywgMHgwMjAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTksIDB4MDAwNiwgMHgyMDExLCAweGFkNDAsIDB4MjAxOSwgMHhhZDQxLCAweDIzYTYsCisJMHgyMmE2LCAweGEzOTgsIDB4MDAwMiwgMHhhMjkwLCAweDAwMDIsIDB4MWYwNCwgMHg3OTU3LCAweDIwYTMsCisJMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMWMsIDB4MDgwYywgMHg3ODIxLCAweDAxNGUsCisJMHgwMTVlLCAweDAwMDUsIDB4MDE1NiwgMHgwMTQ2LCAweDAwMTYsIDB4MDAyNiwgMHgyMGExLCAweDAyMGIsCisJMHgwODBjLCAweDcxODMsIDB4MDgwYywgMHg3MTk5LCAweDc4MTAsIDB4YTA4MCwgMHgwMDAwLCAweDIwMDQsCisJMHhhMDgwLCAweDAwMTUsIDB4MjA5OCwgMHg3ODA4LCAweGEwODgsIDB4MDAwMiwgMHgyMWE4LCAweDUzYTYsCisJMHhhMDgwLCAweDAwMDQsIDB4ODAwMywgMHg2MGMyLCAweDA4MGMsIDB4NzgyMSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTRlLCAweDAxNWUsIDB4MDAwNSwgMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsCisJMHg3MTBlLCAweDIwYTMsIDB4NjIwMCwgMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MDgsCisJMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsCisJMHgwMTU2LCAweDAxNDYsIDB4MDAxNiwgMHgwMDI2LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMGUsCisJMHg3ODEwLCAweGEwODAsIDB4MDAwMCwgMHgyMDA0LCAweGEwODAsIDB4MDAxNywgMHgyMDk4LCAweDc4MDgsCisJMHhhMDg4LCAweDAwMDIsIDB4MjFhOCwgMHg1M2E2LCAweDgwMDMsIDB4NjBjMiwgMHgwODBjLCAweDc4MjEsCisJMHgwMDJlLCAweDAwMWUsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwMDYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFmYzcsIDB4NzAwYywgMHgyMDYwLCAweDhjZmYsCisJMHgwMTc4LCAweDA4MGMsIDB4OTc4OSwgMHgxMTEwLCAweDA4MGMsIDB4ODVmMywgMHg2MDBjLCAweDAwMDYsCisJMHgwODBjLCAweDk5NGUsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsIDB4N2I4OCwgMHgwMGNlLCAweDBjNzgsCisJMHg3MDBmLCAweDAwMDAsIDB4NzAwYiwgMHgwMDAwLCAweDAxMmUsIDB4MDAwZSwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDAwMjYsCisJMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDEwMCwgMHgyMDc5LCAweDAxNDAsCisJMHgyMDcxLCAweGFmYzcsIDB4NzAyNCwgMHgyMDYwLCAweDhjZmYsIDB4MDVhMCwgMHgwODBjLCAweDc4MzQsCisJMHg2OGMzLCAweDAwMDAsIDB4MDgwYywgMHg2NTgxLCAweDIwMDksIDB4MDAxMywgMHgwODBjLCAweDgwYTcsCisJMHgyMGE5LCAweDAxZjQsIDB4NjgyNCwgMHhkMDk0LCAweDAxNTgsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsCisJMHhhMDg0LCAweDQwMDAsIDB4MDFhMCwgMHg3ODAzLCAweDEwMDAsIDB4NzgwMywgMHgwMDAwLCAweDAwNzgsCisJMHhkMDg0LCAweDAxMTgsIDB4NjgyNywgMHgwMDAxLCAweDAwMTAsIDB4MWYwNCwgMHg3YTAyLCAweDc4MDQsCisJMHhhMDg0LCAweDEwMDAsIDB4MDEyMCwgMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDY4MjQsCisJMHgwMDBlLCAweDAwMWUsIDB4MDAyZSwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxNWUsCisJMHgwMTJlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDQsIDB4YTA5NiwgMHgwMDAxLCAweDA1NTAsCisJMHhhMDk2LCAweDAwMDQsIDB4MDUzOCwgMHg2ODE3LCAweDAwMDgsIDB4NjhjMywgMHgwMDAwLCAweDIwMTEsCisJMHg0ODFiLCAweDA4MGMsIDB4NjUwZCwgMHgyMGE5LCAweDAxZjQsIDB4NjgyNCwgMHhkMDk0LCAweDAxNTgsCisJMHg2ODI3LCAweDAwMDQsIDB4NzgwNCwgMHhhMDg0LCAweDQwMDAsIDB4MDFhMCwgMHg3ODAzLCAweDEwMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDA3OCwgMHhkMDg0LCAweDAxMTgsIDB4NjgyNywgMHgwMDAxLCAweDAwMTAsCisJMHgxZjA0LCAweDdhM2QsIDB4NzgwNCwgMHhhMDg0LCAweDEwMDAsIDB4MDEyMCwgMHg3ODAzLCAweDAxMDAsCisJMHg3ODAzLCAweDAwMDAsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDAxMjYsIDB4MDE1NiwgMHgwMGY2LCAweDAwZTYsCisJMHgwMGQ2LCAweDAwYzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjksCisJMHgwMTAwLCAweDIwNzksIDB4MDE0MCwgMHgyMDcxLCAweGFmYzcsIDB4NzAzYywgMHgyMDYwLCAweDhjZmYsCisJMHgwOTA0LCAweDdhZDUsIDB4NjgxNywgMHgwMDEwLCAweDIwMDksIDB4MDBmYSwgMHg4MTA5LCAweDFkZjAsCisJMHg2OGM3LCAweDAwMDAsIDB4NjhjYiwgMHgwMDA4LCAweDA4MGMsIDB4NjU4ZSwgMHgwODBjLCAweDIwYjUsCisJMHgwMDQ2LCAweDIwMDksIDB4MDE3ZiwgMHgyMDBiLCAweDAwYTUsIDB4MjAyMSwgMHgwMTY5LCAweDI0MDQsCisJMHhhMDg0LCAweDAwMGYsIDB4YTA4NiwgMHgwMDA0LCAweDExYjAsIDB4NjhjNywgMHgwMDAwLCAweDY4Y2IsCisJMHgwMDA4LCAweDAwZTYsIDB4MDBmNiwgMHgyMDc5LCAweDAwMjAsIDB4MjA3MSwgMHhiMDFlLCAweDY4MTQsCisJMHhhMDg0LCAweDAxODQsIDB4YTA4NSwgMHgwMDEyLCAweDY4MTYsIDB4NzgwMywgMHgwMDA4LCAweDcwMDMsCisJMHgwMDAwLCAweDAwZmUsIDB4MDBlZSwgMHgyMDBiLCAweDAwMDAsIDB4MDA0ZSwgMHhhMzlkLCAweDAwMDAsCisJMHgxMTIwLCAweDIwMDksIDB4MDA0OSwgMHgwODBjLCAweDgwYTcsIDB4MjBhOSwgMHgwM2U4LCAweDY4MjQsCisJMHhkMDk0LCAweDAxNTgsIDB4NjgyNywgMHgwMDA0LCAweDc4MDQsIDB4YTA4NCwgMHg0MDAwLCAweDAxYTAsCisJMHg3ODAzLCAweDEwMDAsIDB4NzgwMywgMHgwMDAwLCAweDAwNzgsIDB4ZDA4YywgMHgwMTE4LCAweDY4MjcsCisJMHgwMDAyLCAweDAwMTAsIDB4MWYwNCwgMHg3YWI3LCAweDc4MDQsIDB4YTA4NCwgMHgxMDAwLCAweDAxMjAsCisJMHg3ODAzLCAweDAxMDAsIDB4NzgwMywgMHgwMDAwLCAweDY4MjQsIDB4MDAwZSwgMHgwMDFlLCAweDAwMmUsCisJMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAxNWUsIDB4MDEyZSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweGFmYzcsIDB4NmEwNiwgMHgwMTJlLCAweDAwZGUsCisJMHgwMDA1LCAweDAwZDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHhhZmM3LCAweDZhMzIsCisJMHgwMTJlLCAweDAwZGUsIDB4MDAwNSwgMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMDYsCisJMHgwMTI2LCAweDIwNzEsIDB4YWZjNywgMHg3NjE0LCAweDI2NjAsIDB4MjY3OCwgMHgyMDkxLCAweDgwMDAsCisJMHg4Y2ZmLCAweDA1MzgsIDB4NjAxYywgMHhhMjA2LCAweDE1MDAsIDB4NzAxNCwgMHhhYzM2LCAweDExMTAsCisJMHg2NjBjLCAweDc2MTYsIDB4NzAxMCwgMHhhYzM2LCAweDExNDAsIDB4MmMwMCwgMHhhZjM2LCAweDAxMTgsCisJMHgyZjAwLCAweDcwMTIsIDB4MDAxMCwgMHg3MDEzLCAweDAwMDAsIDB4NjYwYywgMHgwMDY2LCAweDJjMDAsCisJMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsIDB4NjAwZiwgMHgwMDAwLCAweDA4MGMsCisJMHg5NzRlLCAweDA4MGMsIDB4N2I4OCwgMHgwMGNlLCAweDA4ZDgsIDB4MmM3OCwgMHg2MDBjLCAweDIwNjAsCisJMHgwOGI4LCAweDAxMmUsIDB4MDAwZSwgMHgwMDZlLCAweDAwY2UsIDB4MDBlZSwgMHgwMGZlLCAweDAwMDUsCisJMHgwMTU2LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzNjZiwgMHg3ODEwLCAweDIwYTIsCisJMHhhMDA2LCAweDIwYTIsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMywgMHgxMDAwLCAweDA4MDQsCisJMHg3YjgwLCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3M2NmLCAweDc4MTAsCisJMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDQwMDAsCisJMHgwNDc4LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3M2NmLCAweDc4MTAsCisJMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDIwMDAsCisJMHgwMGY4LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3M2NmLCAweDc4MTAsCisJMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDA0MDAsCisJMHgwMDc4LCAweDAxNTYsIDB4MDE0NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3M2NmLCAweDc4MTAsCisJMHgyMGEyLCAweGEwMDYsIDB4MjBhMiwgMHgyMGEyLCAweDIwYTIsIDB4MjBhMiwgMHgyMGEzLCAweDAyMDAsCisJMHgwMDg5LCAweDYwYzMsIDB4MDAyMCwgMHgwODBjLCAweDc4MjEsIDB4MDE0ZSwgMHgwMTVlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4YWZjNywgMHg3MDIwLCAweGEwMDUsIDB4MDExMCwgMHg4MDAxLCAweDcwMjIsCisJMHgwMGVlLCAweDAwMDUsIDB4MjBhOSwgMHgwMDA4LCAweDIwYTIsIDB4MWYwNCwgMHg3Yjk0LCAweDIwYTIsCisJMHgyMGEyLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgwMDc2LCAweDAwNjYsCisJMHgwMDA2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4YWZjNywgMHg3NjE0LCAweDI2NjAsCisJMHgyNjc4LCAweDIwMzksIDB4MDAwMSwgMHg4N2ZmLCAweDA5MDQsIDB4N2MyNCwgMHg4Y2ZmLCAweDA5MDQsCisJMHg3YzI0LCAweDYwMWMsIDB4YTA4NiwgMHgwMDA2LCAweDE5MDQsIDB4N2MxZiwgMHg4OGZmLCAweDAxMzgsCisJMHgyODAwLCAweGFjMDYsIDB4MTkwNCwgMHg3YzFmLCAweDIwMzksIDB4MDAwMCwgMHgwMDUwLCAweDYwMTgsCisJMHhhMjA2LCAweDE5MDQsIDB4N2MxZiwgMHg4NWZmLCAweDAxMjAsIDB4NjA1MCwgMHhhMTA2LCAweDE5MDQsCisJMHg3YzFmLCAweDcwMjQsIDB4YWMwNiwgMHgxNTM4LCAweDIwNjksIDB4MDEwMCwgMHg2OGMwLCAweGEwMDUsCisJMHgwMWYwLCAweDA4MGMsIDB4NjU4MSwgMHg2ODE3LCAweDAwMDgsIDB4NjhjMywgMHgwMDAwLCAweDA4MGMsCisJMHg3Y2E4LCAweDcwMjcsIDB4MDAwMCwgMHgwMDM2LCAweDIwNjksIDB4MDE0MCwgMHg2YjA0LCAweGEzODQsCisJMHgxMDAwLCAweDAxMjAsIDB4NjgwMywgMHgwMTAwLCAweDY4MDMsIDB4MDAwMCwgMHgyMDY5LCAweDAxMDAsCisJMHg2ODI0LCAweGQwODQsIDB4MDExMCwgMHg2ODI3LCAweDAwMDEsIDB4MDAzZSwgMHgwMDIwLCAweDYwMDMsCisJMHgwMDA5LCAweDYzMGEsIDB4MDQ2MCwgMHg3MDE0LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MTYsCisJMHg3MDEwLCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMTIsCisJMHgwMDEwLCAweDcwMTMsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsCisJMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg4OWZmLCAweDExNTgsIDB4NjAwZiwgMHgwMDAwLCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTEwLCAweDA4MGMsIDB4YTkxZiwgMHgwODBjLCAweDk3NGUsCisJMHgwODBjLCAweDdiODgsIDB4ODhmZiwgMHgxMTkwLCAweDAwY2UsIDB4MDgwNCwgMHg3YmFiLCAweDJjNzgsCisJMHg2MDBjLCAweDIwNjAsIDB4MDgwNCwgMHg3YmFiLCAweGEwMDYsIDB4MDEyZSwgMHgwMDBlLCAweDAwNmUsCisJMHgwMDdlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDAsCisJMHgwMGNlLCAweGE4YzUsIDB4MDAwMSwgMHgwYzg4LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDY2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFmYzcsCisJMHg3NjM4LCAweDI2NjAsIDB4MjY3OCwgMHg4Y2ZmLCAweDA5MDQsIDB4N2M5OCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDA2LCAweDE5MDQsIDB4N2M5MywgMHg4N2ZmLCAweDAxMjgsIDB4MjcwMCwgMHhhYzA2LCAweDE5MDQsCisJMHg3YzkzLCAweDAwNDAsIDB4NjAxOCwgMHhhMjA2LCAweDE1ZjAsIDB4ODVmZiwgMHgwMTE4LCAweDYwNTAsCisJMHhhMTA2LCAweDE1YzgsIDB4NzAzYywgMHhhYzA2LCAweDExNzAsIDB4MDAzNiwgMHgyMDE5LCAweDAwMDEsCisJMHgwODBjLCAweDdhNjQsIDB4NzAzMywgMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDAsCisJMHg3MDQ3LCAweDAwMDAsIDB4MDAzZSwgMHg3MDM4LCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2M2EsCisJMHg3MDM0LCAweGFjMzYsIDB4MTE0MCwgMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMzYsCisJMHgwMDEwLCAweDcwMzcsIDB4MDAwMCwgMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsCisJMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsCisJMHg5NTk2LCAweDAxMTAsIDB4MDgwYywgMHhhOTFmLCAweDA4MGMsIDB4OTc0ZSwgMHg4N2ZmLCAweDExOTAsCisJMHgwMGNlLCAweDA4MDQsIDB4N2M0MywgMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwODA0LCAweDdjNDMsCisJMHhhMDA2LCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwMDUsIDB4NjAxNywgMHgwMDAwLCAweDAwY2UsIDB4YTdiZCwgMHgwMDAxLCAweDBjODgsCisJMHgwMGU2LCAweDIwNzEsIDB4YWZjNywgMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDIsCisJMHgxMTE4LCAweDcwMDcsIDB4MDAwNSwgMHgwMDEwLCAweDcwMDcsIDB4MDAwMCwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGY2LCAweDAwZTYsIDB4MDBjNiwgMHgwMDY2LCAweDAwMjYsIDB4MDAwNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDIwNzEsIDB4YWZjNywgMHgyYzEwLCAweDc2MzgsIDB4MjY2MCwgMHgyNjc4LCAweDhjZmYsCisJMHgwNTE4LCAweDIyMDAsIDB4YWMwNiwgMHgxMWUwLCAweDcwMzgsIDB4YWMzNiwgMHgxMTEwLCAweDY2MGMsCisJMHg3NjNhLCAweDcwMzQsIDB4YWMzNiwgMHgxMTQwLCAweDJjMDAsIDB4YWYzNiwgMHgwMTE4LCAweDJmMDAsCisJMHg3MDM2LCAweDAwMTAsIDB4NzAzNywgMHgwMDAwLCAweDY2MGMsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsCisJMHg3ZTBlLCAweDAwMDgsIDB4MjY3OCwgMHg2MDBmLCAweDAwMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMjAsCisJMHgyYzc4LCAweDYwMGMsIDB4MjA2MCwgMHgwOGQ4LCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNmUsCisJMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDY2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZmM3LCAweDc2MGMsCisJMHgyNjYwLCAweDI2NzgsIDB4OGNmZiwgMHgwOTA0LCAweDdkN2UsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsCisJMHgyMDA0LCAweGEyMDYsIDB4MTkwNCwgMHg3ZDc5LCAweDcwMjQsIDB4YWMwNiwgMHgxNTA4LCAweDIwNjksCisJMHgwMTAwLCAweDY4YzAsIDB4YTAwNSwgMHgwOTA0LCAweDdkNTUsIDB4MDgwYywgMHg3ODM0LCAweDY4YzMsCisJMHgwMDAwLCAweDA4MGMsIDB4N2NhOCwgMHg3MDI3LCAweDAwMDAsIDB4MDAzNiwgMHgyMDY5LCAweDAxNDAsCisJMHg2YjA0LCAweGEzODQsIDB4MTAwMCwgMHgwMTIwLCAweDY4MDMsIDB4MDEwMCwgMHg2ODAzLCAweDAwMDAsCisJMHgyMDY5LCAweDAxMDAsIDB4NjgyNCwgMHhkMDg0LCAweDAxMTAsIDB4NjgyNywgMHgwMDAxLCAweDAwM2UsCisJMHg3MDBjLCAweGFjMzYsIDB4MTExMCwgMHg2NjBjLCAweDc2MGUsIDB4NzAwOCwgMHhhYzM2LCAweDExNDAsCisJMHgyYzAwLCAweGFmMzYsIDB4MDExOCwgMHgyZjAwLCAweDcwMGEsIDB4MDAxMCwgMHg3MDBiLCAweDAwMDAsCisJMHg2NjBjLCAweDAwNjYsIDB4MmMwMCwgMHhhZjA2LCAweDAxMTAsIDB4N2UwZSwgMHgwMDA4LCAweDI2NzgsCisJMHg2MDBmLCAweDAwMDAsIDB4MDgwYywgMHg5Nzc4LCAweDExNTgsIDB4MDgwYywgMHgyYWZmLCAweDA4MGMsCisJMHg5Nzg5LCAweDExZjAsIDB4MDgwYywgMHg4NWYzLCAweDAwZDgsIDB4MDgwYywgMHg3Y2E4LCAweDA4YzAsCisJMHgwODBjLCAweDk3ODksIDB4MTExOCwgMHgwODBjLCAweDg1ZjMsIDB4MDA5MCwgMHg2MDEwLCAweDIwNjgsCisJMHgwODBjLCAweDk1OTYsIDB4MDE2OCwgMHg2MDFjLCAweGEwODYsIDB4MDAwMywgMHgxMWY4LCAweDY4MzcsCisJMHgwMTAzLCAweDZiNGEsIDB4Njg0NywgMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwODBjLCAweDk3NDIsCisJMHgwODBjLCAweDk5NGUsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4N2I4OCwgMHgwMGNlLCAweDA4MDQsCisJMHg3ZDAyLCAweDJjNzgsIDB4NjAwYywgMHgyMDYwLCAweDA4MDQsIDB4N2QwMiwgMHgwMTJlLCAweDAwMGUsCisJMHgwMDZlLCAweDAwY2UsIDB4MDBkZSwgMHgwMGVlLCAweDAwZmUsIDB4MDAwNSwgMHg2MDFjLCAweGEwODYsCisJMHgwMDA2LCAweDFkMzAsIDB4MDgwYywgMHhhOTFmLCAweDBjMTgsIDB4MDAzNiwgMHgwMTU2LCAweDAxMzYsCisJMHgwMTQ2LCAweDM5MDgsIDB4YTAwNiwgMHhhMTkwLCAweDAwMjAsIDB4MjIxYywgMHhhMzllLCAweDI4ZjksCisJMHgxMTE4LCAweDgyMTAsIDB4ODAwMCwgMHgwY2M4LCAweGEwMDUsIDB4MDEzOCwgMHgyMGE5LCAweDAwMjAsCisJMHgyMTk4LCAweGExMTAsIDB4MjJhMCwgMHgyMmM4LCAweDUzYTMsIDB4MDE0ZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMDNlLCAweDAwMDUsIDB4MDBkNiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWFhLCAweDIwYTMsCisJMHgwMjAwLCAweDIwYTMsIDB4MDAxNCwgMHg2MGMzLCAweDAwMTQsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwOTksIDB4YWZhNiwgMHgyMGE5LCAweDAwMDQsIDB4NTNhNiwgMHgyMGEzLCAweDAwMDQsCisJMHgyMGEzLCAweDc4NzgsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgwODBjLCAweDc4MjEsCisJMHgwMGRlLCAweDAwMDUsIDB4MjBhMSwgMHgwMjBiLCAweDA4MGMsIDB4NzFhYSwgMHgyMGEzLCAweDAyMTQsCisJMHgyMGEzLCAweDAwMTgsIDB4MjBhMywgMHgwODAwLCAweDc4MTAsIDB4YTA4NCwgMHhmZjAwLCAweDIwYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODEwLCAweGEwODQsIDB4MDBmZiwgMHgyMGEyLCAweDc4MjgsIDB4MjBhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDE4LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMDE2LCAweDJmNjgsIDB4MjAwOSwgMHgwMDM1LCAweDA4MGMsIDB4OWEzNCwgMHgxOTA0LCAweDdlNWQsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MTBlLCAweDIwYTMsIDB4MTMwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODI4LCAweDIwNjgsIDB4NjgxYywgMHhhMDg2LCAweDAwMDMsIDB4MDU4MCwgMHg3ODE4LCAweGEwODAsCisJMHgwMDI4LCAweDIwMTQsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsIDB4ZDBhYywgMHgxMWQwLCAweGEyODYsCisJMHgwMDdlLCAweDExMjgsIDB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmZSwgMHgwNGI4LCAweGEyODYsCisJMHgwMDdmLCAweDExMjgsIDB4MjBhMywgMHgwMGZmLCAweDIwYTMsIDB4ZmZmZCwgMHgwNDc4LCAweGQyYmMsCisJMHgwMTgwLCAweGEyODYsIDB4MDA4MCwgMHgxMTI4LCAweDIwYTMsIDB4MDBmZiwgMHgyMGEzLCAweGZmZmMsCisJMHgwNDI4LCAweGEyZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsCisJMHgwMGU4LCAweDIwYTMsIDB4MDAwMCwgMHg2MDk4LCAweDIwYTIsIDB4MDBjMCwgMHgyMDAxLCAweGFkMzQsCisJMHgyMDA0LCAweGQwYWMsIDB4MTEzOCwgMHg3ODE4LCAweGEwODAsIDB4MDAyOCwgMHgyMDA0LCAweGEwODIsCisJMHgwMDdlLCAweDAyNDAsIDB4MDBkNiwgMHgyMDY5LCAweGFkMWIsIDB4MmRhNiwgMHg4ZDY4LCAweDJkYTYsCisJMHgwMGRlLCAweDAwMjAsIDB4MjBhMywgMHgwMDAwLCAweDYwMzQsIDB4MjBhMiwgMHg3ODM0LCAweDIwYTIsCisJMHg3ODM4LCAweDIwYTIsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMGMsCisJMHgwODBjLCAweDc4MjEsIDB4MDAxZSwgMHgwMGRlLCAweDAwMDUsIDB4NzgxNywgMHgwMDAxLCAweDc4MDMsCisJMHgwMDA2LCAweDAwMWUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDAyNiwgMHg3OTI4LCAweDIxNjgsCisJMHg2OTFjLCAweGExODYsIDB4MDAwNiwgMHgwMWMwLCAweGExODYsIDB4MDAwMywgMHgwOTA0LCAweDdlZDMsCisJMHhhMTg2LCAweDAwMDUsIDB4MDkwNCwgMHg3ZWJjLCAweGExODYsIDB4MDAwNCwgMHgwNWI4LCAweGExODYsCisJMHgwMDA4LCAweDA5MDQsIDB4N2VjNCwgMHg3ODA3LCAweDAwMzcsIDB4NzgxMywgMHgxNzAwLCAweDA4MGMsCisJMHg3ZjNiLCAweDAwMmUsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsIDB4N2VmNywgMHgyMDA5LCAweDQwMDAsCisJMHg2ODAwLCAweDAwMDIsIDB4N2U5ZCwgMHg3ZWE4LCAweDdlOWYsIDB4N2VhOCwgMHg3ZWE0LCAweDdlOWQsCisJMHg3ZTlkLCAweDdlYTgsIDB4N2VhOCwgMHg3ZWE4LCAweDdlYTgsIDB4N2U5ZCwgMHg3ZTlkLCAweDdlOWQsCisJMHg3ZTlkLCAweDdlOWQsIDB4N2VhOCwgMHg3ZTlkLCAweDdlYTgsIDB4MDgwYywgMHgxNGY2LCAweDY4MjAsCisJMHhkMGU0LCAweDAxMTAsIDB4ZDBjYywgMHgwMTEwLCAweGEwMGUsIDB4MDAxMCwgMHgyMDA5LCAweDIwMDAsCisJMHg2ODI4LCAweDIwYTIsIDB4NjgyYywgMHgyMGEyLCAweDA4MDQsIDB4N2VlZCwgMHgwODBjLCAweDdlZjcsCisJMHgyMGEzLCAweDAwMDAsIDB4MjBhMywgMHgwMDAwLCAweDIwMDksIDB4NDAwMCwgMHg2YTAwLCAweGEyODYsCisJMHgwMDAyLCAweDExMDgsIDB4YTAwZSwgMHgwNDg4LCAweDA0ZDEsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwMDksIDB4NDAwMCwgMHgwNDQ4LCAweDA0OTEsIDB4MjBhMywgMHgwMDAwLCAweDIwYTMsCisJMHgwMDAwLCAweDIwMDksIDB4NDAwMCwgMHhhMjg2LCAweDAwMDUsIDB4MDExOCwgMHhhMjg2LCAweDAwMDIsCisJMHgxMTA4LCAweGEwMGUsIDB4MDBkMCwgMHgwNDE5LCAweDY4MTAsIDB4MjA2OCwgMHg2OTdjLCAweDY4MTAsCisJMHhhMTEyLCAweDY5ODAsIDB4NjgxNCwgMHhhMTAzLCAweDIwYTIsIDB4MjJhMiwgMHg3OTI4LCAweGExODAsCisJMHgwMDAwLCAweDIwMDQsIDB4YTA4ZSwgMHgwMDAyLCAweDAxMzAsIDB4YTA4ZSwgMHgwMDA0LCAweDAxMTgsCisJMHgyMDA5LCAweDQwMDAsIDB4MDAxMCwgMHgyMDA5LCAweDAwMDAsIDB4MjFhMiwgMHgyMGEzLCAweDAwMDAsCisJMHg2MGMzLCAweDAwMTgsIDB4MDgwYywgMHg3ODIxLCAweDAwMmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwMzYsCisJMHgwMDQ2LCAweDAwNTYsIDB4MDA2NiwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWFhLCAweGEwMDYsCisJMHgyMGEzLCAweDAyMDAsIDB4MjBhMiwgMHg3OTM0LCAweDIxYTIsIDB4NzkzOCwgMHgyMWEyLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTgsCisJMHhhMDkyLCAweDAwN2UsIDB4MDI2OCwgMHgwMGQ2LCAweDIwNjksIDB4YWQxYiwgMHgyZDJjLCAweDhkNjgsCisJMHgyZDM0LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDZiMTAsIDB4NmMxNCwgMHgwMGRlLCAweDAwMzAsCisJMHgyMDE5LCAweDAwMDAsIDB4NjQ5OCwgMHgyMDI5LCAweDAwMDAsIDB4NjYzNCwgMHg3ODI4LCAweGEwODAsCisJMHgwMDA3LCAweDIwMDQsIDB4YTA4NiwgMHgwMDAzLCAweDExMjgsIDB4MjVhMiwgMHgyNmEyLCAweDIzYTIsCisJMHgyNGEyLCAweDAwMjAsIDB4MjNhMiwgMHgyNGEyLCAweDI1YTIsIDB4MjZhMiwgMHgwMDZlLCAweDAwNWUsCisJMHgwMDRlLCAweDAwM2UsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWFhLCAweDIwYTMsCisJMHgwMTAwLCAweDIwYTMsIDB4MDAwMCwgMHgyMGEzLCAweDAwMDksIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsCisJMHgwMDA4LCAweDA4MGMsIDB4NzgyMSwgMHgwMDA1LCAweDIwYTEsIDB4MDIwYiwgMHgwODBjLCAweDcxMDYsCisJMHgyMGEzLCAweDE0MDAsIDB4MjBhMywgMHgwMDAwLCAweDc4MzQsIDB4MjBhMiwgMHg3ODM4LCAweDIwYTIsCisJMHg3ODI4LCAweDIwYTIsIDB4NzgyYywgMHgyMGEyLCAweDc4MzAsIDB4YTA4NCwgMHgwMGZmLCAweDgwMDcsCisJMHgyMGEyLCAweDIwYTMsIDB4MDAwMCwgMHg2MGMzLCAweDAwMTAsIDB4MDgwYywgMHg3ODIxLCAweDAwMDUsCisJMHgyMGExLCAweDAyMGIsIDB4MDgwYywgMHg3MWEyLCAweDIwYTMsIDB4MDEwMCwgMHgyMGEzLCAweDAwMDAsCisJMHg3ODI4LCAweDIwYTIsIDB4NzgxMCwgMHgyMGEyLCAweDYwYzMsIDB4MDAwOCwgMHgwODBjLCAweDc4MjEsCisJMHgwMDA1LCAweDAxNDYsIDB4MjBhMSwgMHgwMjBiLCAweDAwMzEsIDB4NjBjMywgMHgwMDAwLCAweDA4MGMsCisJMHg3ODIxLCAweDAxNGUsIDB4MDAwNSwgMHgyMGUxLCAweDkwODAsIDB4MjBlMSwgMHg0MDAwLCAweDc4MTgsCisJMHhhMDgwLCAweDAwMjgsIDB4MjAwNCwgMHgyMDExLCAweGFkMzQsIDB4MjIxNCwgMHhkMmFjLCAweDExMTAsCisJMHhkMGJjLCAweDAxODgsIDB4MDBkNiwgMHhhMGU4LCAweGFlMzQsIDB4MmQ2YywgMHg2ODEwLCAweGEwODUsCisJMHgwMzAwLCAweDIwYTIsIDB4NjgxNCwgMHgyMGEyLCAweDIwNjksIDB4YWQxYiwgMHgyZGE2LCAweDhkNjgsCisJMHgyZGE2LCAweDAwZGUsIDB4MDA3OCwgMHgwMGQ2LCAweGEwZTgsIDB4YWUzNCwgMHgyZDZjLCAweDY4MTAsCisJMHhhMDg1LCAweDAzMDAsIDB4MjBhMiwgMHg2ODE0LCAweDIwYTIsIDB4MDBkZSwgMHgyMGEzLCAweDAwMDAsCisJMHg2MjM0LCAweDIyYTIsIDB4MjBhMywgMHgwODE5LCAweDIwYTMsIDB4MDAwMCwgMHgwODBjLCAweDc4MTAsCisJMHgyMmEyLCAweDIwYTMsIDB4MDAwMCwgMHgyZmEyLCAweDdhMDgsIDB4MjJhMiwgMHgyMGEzLCAweDAwMDAsCisJMHgyMGEzLCAweDAwMDAsIDB4MDAwNSwgMHgyMGExLCAweDAyMGIsIDB4MDA3OSwgMHg3OTEwLCAweDIxYTIsCisJMHgyMGEzLCAweDAwMDAsIDB4NjBjMywgMHgwMDAwLCAweDIwZTEsIDB4OTA4MCwgMHg2MGE3LCAweDk1NzUsCisJMHgwODBjLCAweDc4MmIsIDB4MDgwYywgMHg2NTc4LCAweDAwMDUsIDB4MDE1NiwgMHgwMTM2LCAweDAwMzYsCisJMHgwMGQ2LCAweDAwZTYsIDB4MjBlMSwgMHg5MDgwLCAweDIwZTEsIDB4NDAwMCwgMHg3ODU0LCAweDIwNjgsCisJMHhhZGYwLCAweDAwMGYsIDB4NzIxMCwgMHhhMjk2LCAweDAwYzAsIDB4YTI5NCwgMHhmZmZkLCAweDcyMTIsCisJMHg3MjE0LCAweGEyOTQsIDB4MDMwMCwgMHg3MjE2LCAweDcxMDAsIDB4YTE5NCwgMHgwMGZmLCAweDczMDgsCisJMHhhMzg0LCAweDAwZmYsIDB4YTA4ZCwgMHhjMjAwLCAweDcxMDIsIDB4YTM4NCwgMHhmZjAwLCAweGEyMTUsCisJMHg3MjBhLCAweDcwMDQsIDB4NzIwYywgMHg3MDBlLCAweDcyMDYsIDB4MjBhOSwgMHgwMDBhLCAweDJlOTgsCisJMHg1M2E2LCAweDYwYTMsIDB4MDAzNSwgMHg2YTM4LCAweGEyOTQsIDB4NzAwMCwgMHhhMjg2LCAweDMwMDAsCisJMHgwMTEwLCAweDYwYTMsIDB4MDAzNywgMHgwMGVlLCAweDAwZGUsIDB4MDAzZSwgMHgwMTNlLCAweDAxNWUsCisJMHgwMDA1LCAweDIwMDksIDB4MDA5MiwgMHgwMDEwLCAweDIwMDksIDB4MDA5NiwgMHg2MGFiLCAweDAwMzYsCisJMHg2MTE2LCAweDAwMDUsIDB4MjA2MSwgMHhiNDAwLCAweDJhNzAsIDB4NzA2NCwgMHg3MDQ2LCAweDcwNGIsCisJMHhiNDAwLCAweDAwMDUsIDB4MDBlNiwgMHgwMTI2LCAweDIwNzEsIDB4YWQwMCwgMHgyMDkxLCAweDgwMDAsCisJMHg3NTQ0LCAweGE1ODIsIDB4MDAxMCwgMHgwNjA4LCAweDcwNDgsIDB4MjA2MCwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAwLCAweDAxNDgsIDB4YWNlMCwgMHgwMDE4LCAweDcwNTgsIDB4YWMwMiwgMHgxMjA4LCAweDBjYjAsCisJMHgyMDYxLCAweGI0MDAsIDB4MGM5OCwgMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTQ2LCAweGFjYTgsCisJMHgwMDE4LCAweDcwNTgsIDB4YTUwMiwgMHgxMjMwLCAweDc1NGEsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsCisJMHgwMGVlLCAweDAwMDUsIDB4NzA0YiwgMHhiNDAwLCAweDBjYzAsIDB4YTAwNiwgMHgwY2MwLCAweDAwZTYsCisJMHgyMDcxLCAweGFkMDAsIDB4NzU0NCwgMHhhNTgyLCAweDAwMTAsIDB4MDYwMCwgMHg3MDQ4LCAweDIwNjAsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMTQ4LCAweGFjZTAsIDB4MDAxOCwgMHg3MDU4LCAweGFjMDIsCisJMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHhiNDAwLCAweDBjOTgsIDB4NjAwMywgMHgwMDA4LCAweDg1MjksCisJMHg3NTQ2LCAweGFjYTgsIDB4MDAxOCwgMHg3MDU4LCAweGE1MDIsIDB4MTIyOCwgMHg3NTRhLCAweGEwODUsCisJMHgwMDAxLCAweDAwZWUsIDB4MDAwNSwgMHg3MDRiLCAweGI0MDAsIDB4MGNjOCwgMHhhMDA2LCAweDBjYzgsCisJMHhhYzgyLCAweGI0MDAsIDB4MGEwYywgMHgxNGY2LCAweDIwMDEsIDB4YWQxNiwgMHgyMDA0LCAweGFjMDIsCisJMHgxYTBjLCAweDE0ZjYsIDB4YTAwNiwgMHg2MDA2LCAweDYwMGEsIDB4NjAwZSwgMHg2MDEyLCAweDYwMTYsCisJMHg2MDFhLCAweDYwMWYsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDAsIDB4NjA1MiwgMHg2MDU2LCAweDYwMjIsCisJMHg2MDI2LCAweDYwMmEsIDB4NjAyZSwgMHg2MDMyLCAweDYwMzYsIDB4NjAzYSwgMHg2MDNlLCAweDIwNjEsCisJMHhhZDAwLCAweDYwNDQsIDB4ODAwMCwgMHg2MDQ2LCAweGEwODYsIDB4MDAwMSwgMHgwMTA4LCAweDAwMDUsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZjNTAsIDB4MDEyZSwgMHgwY2MwLCAweDYwMWMsCisJMHhhMDg0LCAweDAwMGYsIDB4MDAwMiwgMHg4MGI2LCAweDgwYzUsIDB4ODBlMCwgMHg4MGZiLCAweDlhNjEsCisJMHg5YTdjLCAweDlhOTcsIDB4ODBiNiwgMHg4MGM1LCAweDgwYjYsIDB4ODExNiwgMHhhMTg2LCAweDAwMTMsCisJMHgxMTI4LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHhhMThlLCAweDAwNDcsCisJMHgxMTE4LCAweGEwMTYsIDB4MDgwYywgMHgxODI0LCAweDAwMDUsIDB4MDA2NiwgMHg2MDAwLCAweGEwYjIsCisJMHgwMDEwLCAweDFhMGMsIDB4MTRmNiwgMHgwMDEzLCAweDAwNmUsIDB4MDAwNSwgMHg4MGRlLCAweDg0NzgsCisJMHg4NjJkLCAweDgwZGUsIDB4ODZhMiwgMHg4MWNmLCAweDgwZGUsIDB4ODBkZSwgMHg4NDBhLCAweDhhOTEsCisJMHg4MGRlLCAweDgwZGUsIDB4ODBkZSwgMHg4MGRlLCAweDgwZGUsIDB4ODBkZSwgMHgwODBjLCAweDE0ZjYsCisJMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDFhMGMsIDB4MTRmNiwgMHgwMDEzLCAweDAwNmUsCisJMHgwMDA1LCAweDgwZjksIDB4OTA5YSwgMHg4MGY5LCAweDgwZjksIDB4ODBmOSwgMHg4MGY5LCAweDgwZjksCisJMHg4MGY5LCAweDkwNDUsIDB4OTIwMCwgMHg4MGY5LCAweDkwYzcsIDB4OTEzZSwgMHg5MGM3LCAweDkxM2UsCisJMHg4MGY5LCAweDA4MGMsIDB4MTRmNiwgMHgwMDY2LCAweDYwMDAsIDB4YTBiMiwgMHgwMDEwLCAweDFhMGMsCisJMHgxNGY2LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweDgxMTQsIDB4OGFkMiwgMHg4Yjk4LCAweDhjYjgsCisJMHg4ZTEyLCAweDgxMTQsIDB4ODExNCwgMHg4MTE0LCAweDhhYWMsIDB4OGZmNSwgMHg4ZmY4LCAweDgxMTQsCisJMHg4MTE0LCAweDgxMTQsIDB4ODExNCwgMHg5MDIyLCAweDA4MGMsIDB4MTRmNiwgMHgwMDY2LCAweDYwMDAsCisJMHhhMGIyLCAweDAwMTAsIDB4MWEwYywgMHgxNGY2LCAweDAwMTMsIDB4MDA2ZSwgMHgwMDA1LCAweDgxMmYsCisJMHg4MTJmLCAweDgxMmYsIDB4ODE1MiwgMHg4MWE1LCAweDgxMmYsIDB4ODEyZiwgMHg4MTJmLCAweDgxMzEsCisJMHg4MTJmLCAweDgxMmYsIDB4ODEyZiwgMHg4MTJmLCAweDgxMmYsIDB4ODEyZiwgMHg4MTJmLCAweDA4MGMsCisJMHgxNGY2LCAweGExODYsIDB4MDAwMywgMHgxOTBjLCAweDE0ZjYsIDB4MDBkNiwgMHg2MDAzLCAweDAwMDMsCisJMHg2MTA2LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRmLCAweDAwNDAsIDB4Njg3YywgMHg2ODBhLCAweDY4ODAsCisJMHg2ODBlLCAweDY4MTMsIDB4MDAwMCwgMHg2ODE3LCAweDAwMDAsIDB4MDBkZSwgMHgyYzEwLCAweDA4MGMsCisJMHgxZTZlLCAweDA4MGMsIDB4NjgwYiwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZkMGQsCisJMHgwMTJlLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQ3LCAweDAwMDIsIDB4ODE1ZSwgMHg4MTVlLCAweDgxNjAsCisJMHg4MTdmLCAweDgxNWUsIDB4ODE1ZSwgMHg4MTVlLCAweDgxNWUsIDB4ODE5MSwgMHgwODBjLCAweDE0ZjYsCisJMHgwMGQ2LCAweDAwMTYsIDB4MDgwYywgMHg2YzA1LCAweDA4MGMsIDB4NmQwZCwgMHg2MDAzLCAweDAwMDQsCisJMHg2MTEwLCAweDIxNjgsIDB4Njg1NCwgMHg4MDAzLCAweDgwMGIsIDB4ODEwYiwgMHhhMTA4LCAweDYxMTYsCisJMHg2ODRmLCAweDAwMjAsIDB4Njg1YywgMHg2ODVhLCAweDY4NzQsIDB4Njg3ZSwgMHg2ODc4LCAweDY4ODIsCisJMHg2ODk3LCAweDAwMDAsIDB4Njg5YiwgMHgwMDAwLCAweDAwMWUsIDB4MDBkZSwgMHgwMDA1LCAweDA4MGMsCisJMHg2YzA1LCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTIwLCAweDY4NGIsCisJMHgwMDA2LCAweDA4MGMsIDB4NTEwYywgMHgwMGRlLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLCAweDZkMGQsCisJMHgwMDA1LCAweDA4MGMsIDB4NmMwNSwgMHgwODBjLCAweDJhZDksIDB4MDBkNiwgMHg2MTEwLCAweDIxNjgsCisJMHgwODBjLCAweDk1OTYsIDB4MDEyMCwgMHg2ODRiLCAweDAwMjksIDB4MDgwYywgMHg1MTBjLCAweDAwZGUsCisJMHgwODBjLCAweDgwNzgsIDB4MDgwYywgMHg2ZDBkLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQ3LCAweDAwMDIsCisJMHg4MWIzLCAweDgxYzIsIDB4ODFiMSwgMHg4MWIxLCAweDgxYjEsIDB4ODFiMSwgMHg4MWIxLCAweDgxYjEsCisJMHg4MWIxLCAweDA4MGMsIDB4MTRmNiwgMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGMwZjQsCisJMHg2ODRlLCAweDAwZGUsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDA4MGMsCisJMHgxODI0LCAweDAwMDUsIDB4MDBkNiwgMHg2MTEwLCAweDIxNjgsIDB4Njg0YiwgMHgwMDAwLCAweDY4NTMsCisJMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgwMGRlLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweGExYjYsCisJMHgwMDE1LCAweDExMTgsIDB4MDgwYywgMHg4MDc4LCAweDAwMzAsIDB4YTFiNiwgMHgwMDE2LCAweDE5MGMsCisJMHgxNGY2LCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweDIwYTksIDB4MDAwZSwgMHgyZTk4LCAweDYwMTAsCisJMHgyMGEwLCAweDUzYTMsIDB4MjBhOSwgMHgwMDA2LCAweDMzMTAsIDB4MzQyMCwgMHg5Mzk4LCAweDk0YTAsCisJMHgzMzE4LCAweDM0MjgsIDB4MjIyZSwgMHgyMzI2LCAweGEyOTAsIDB4MDAwMiwgMHhhNWE4LCAweDAwMDIsCisJMHhhMzk4LCAweDAwMDIsIDB4YTRhMCwgMHgwMDAyLCAweDFmMDQsIDB4ODFlYSwgMHgwMGU2LCAweDA4MGMsCisJMHg5NTk2LCAweDAxMzAsIDB4NjAxMCwgMHgyMDcwLCAweDcwMDcsIDB4MDAwMCwgMHg3MDM3LCAweDAxMDMsCisJMHgwMGVlLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweDAwZDYsIDB4MDAzNiwgMHg3MzMwLCAweGEzODYsCisJMHgwMjAwLCAweDExMzAsIDB4NjAxOCwgMHgyMDY4LCAweDY4MTMsIDB4MDBmZiwgMHg2ODE3LCAweGZmZmQsCisJMHg2MDEwLCAweGEwMDUsIDB4MDEzMCwgMHgyMDY4LCAweDY4MDcsIDB4MDAwMCwgMHg2ODM3LCAweDAxMDMsCisJMHg2YjMyLCAweDA4MGMsIDB4ODA3OCwgMHgwMDNlLCAweDAwZGUsIDB4MDAwNSwgMHgwMDE2LCAweDIwYTksCisJMHgwMDJhLCAweGFlODAsIDB4MDAwYywgMHgyMDk4LCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLCAweDIwYTAsCisJMHg1M2EzLCAweDIwYTksIDB4MDAyYSwgMHg2MDEwLCAweGEwODAsIDB4MDAwMSwgMHgyMDA0LCAweGEwODAsCisJMHgwMDAyLCAweDIwYTAsIDB4NTNhMywgMHgwMGU2LCAweDYwMTAsIDB4MjAwNCwgMHgyMDcwLCAweDcwMzcsCisJMHgwMTAzLCAweDAwZWUsIDB4MDgwYywgMHg4MDc4LCAweDAwMWUsIDB4MDAwNSwgMHgwMDE2LCAweDIwMDksCisJMHgwMDAwLCAweDcwMzAsIDB4YTA4NiwgMHgwMTAwLCAweDAxNDAsIDB4NzAzOCwgMHhhMDg0LCAweDAwZmYsCisJMHg4MDhlLCAweDcwM2MsIDB4YTA4NCwgMHgwMGZmLCAweDgwODYsIDB4YTA4MCwgMHgwMDA0LCAweGExMDgsCisJMHgyMWE4LCAweGFlODAsIDB4MDAwYywgMHgyMDk4LCAweDYwMTAsIDB4YTA4MCwgMHgwMDAyLCAweDIwYTAsCisJMHgwODBjLCAweDQ4YmUsIDB4MDBlNiwgMHgwODBjLCAweDk1OTYsIDB4MDE0MCwgMHg2MDEwLCAweDIwNzAsCisJMHg3MDA3LCAweDAwMDAsIDB4NzAzNCwgMHg3MGIyLCAweDcwMzcsIDB4MDEwMywgMHgwMGVlLCAweDA4MGMsCisJMHg4MDc4LCAweDAwMWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4NjAzZiwgMHgwMDAwLCAweDJjNjgsCisJMHgwMDE2LCAweDIwMDksIDB4MDAzNSwgMHgwODBjLCAweDlhMzQsIDB4MDAxZSwgMHgxMTY4LCAweDAwMjYsCisJMHg2MjI4LCAweDIyNjgsIDB4MDAyZSwgMHgyMDcxLCAweGIyOGMsIDB4NmIxYywgMHhhMzg2LCAweDAwMDMsCisJMHgwMTMwLCAweGEzODYsIDB4MDAwNiwgMHgwMTI4LCAweDA4MGMsIDB4ODA3OCwgMHgwMDIwLCAweDAwMzEsCisJMHgwMDEwLCAweDA4MGMsIDB4ODMyMywgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGY2LCAweDY4MTAsCisJMHgyMDc4LCAweGExODYsIDB4MDAxNSwgMHgwOTA0LCAweDgzMGMsIDB4YTE4ZSwgMHgwMDE2LCAweDE5MDQsCisJMHg4MzIxLCAweDcwMGMsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsIDB4MTcwMCwgMHgxOTA0LCAweDgyZWIsCisJMHg4ZmZmLCAweDA5MDQsIDB4ODMxZiwgMHg2ODA4LCAweGEwODYsIDB4ZmZmZiwgMHgxOTA0LCAweDgzMGUsCisJMHg3ODRjLCAweGEwODQsIDB4MDA2MCwgMHhhMDg2LCAweDAwMjAsIDB4MTE1MCwgMHg3OTdjLCAweDc4MTAsCisJMHhhMTA2LCAweDE5MDQsIDB4ODMwZSwgMHg3OTgwLCAweDc4MTQsIDB4YTEwNiwgMHgxOTA0LCAweDgzMGUsCisJMHgwODBjLCAweDk3NDIsIDB4Njg1OCwgMHg3ODUyLCAweDc4NGMsIDB4YzBkYywgMHhjMGY0LCAweGMwZDQsCisJMHg3ODRlLCAweDAwMjYsIDB4YTAwZSwgMHg2YTE0LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDY2NjUsCisJMHg3ODU0LCAweGEyMGEsIDB4MDIwOCwgMHg4MDExLCAweDdhNTYsIDB4ODJmZiwgMHgwMDJlLCAweDExMzgsCisJMHgwMGM2LCAweDJkNjAsIDB4MDgwYywgMHg5Mzc0LCAweDAwY2UsIDB4MDgwNCwgMHg4MzFmLCAweDAwYzYsCisJMHgwMGQ2LCAweDJmNjgsIDB4NjgzOCwgMHhkMGZjLCAweDExMTgsIDB4MDgwYywgMHg0OTkzLCAweDAwMTAsCisJMHgwODBjLCAweDRiN2MsIDB4MDBkZSwgMHgwMGNlLCAweDE1NDgsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsCisJMHg4MDc4LCAweDAwY2UsIDB4MDRhMCwgMHg3MDA4LCAweGEwODYsIDB4MDAwYiwgMHgxMWEwLCAweDYwMTgsCisJMHgyMDBjLCAweGMxYmMsIDB4MjEwMiwgMHgwMGM2LCAweDJkNjAsIDB4Nzg1MywgMHgwMDAzLCAweDYwMDcsCisJMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDIsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsCisJMHg2YzUwLCAweDAwY2UsIDB4MDBlMCwgMHg3MDBjLCAweGEwODYsIDB4MmEwMCwgMHgxMTM4LCAweDIwMDEsCisJMHhhZmE1LCAweDIwMDQsIDB4NjgzZSwgMHgwMDk4LCAweDA0NzEsIDB4MDA5OCwgMHg4ZmZmLCAweDA5MGMsCisJMHgxNGY2LCAweDAwYzYsIDB4MDBkNiwgMHgyZDYwLCAweDJmNjgsIDB4Njg0YiwgMHgwMDAzLCAweDA4MGMsCisJMHg5MjZmLCAweDA4MGMsIDB4OTc0MiwgMHgwODBjLCAweDk3NGUsIDB4MDBkZSwgMHgwMGNlLCAweDA4MGMsCisJMHg4MDc4LCAweDAwZmUsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTUsIDB4MTEyOCwgMHgyMDAxLCAweGFmYTUsCisJMHgyMDA0LCAweDY4M2UsIDB4MDA2OCwgMHhhMThlLCAweDAwMTYsIDB4MTE2MCwgMHgwMGM2LCAweDJkMDAsCisJMHgyMDYwLCAweDA4MGMsIDB4YWJiNCwgMHgwODBjLCAweDY2MTgsIDB4MDgwYywgMHg4MDc4LCAweDAwY2UsCisJMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgwMDI2LCAweDAwMzYsIDB4MDA0NiwgMHg3MjI4LCAweDdjODAsCisJMHg3YjdjLCAweGQyZjQsIDB4MDEzMCwgMHgyMDAxLCAweGFmYTUsIDB4MjAwNCwgMHg2ODNlLCAweDA4MDQsCisJMHg4MzlkLCAweDAwYzYsIDB4MmQ2MCwgMHgwODBjLCAweDkyOGYsIDB4MDBjZSwgMHg2ODA0LCAweGEwODYsCisJMHgwMDUwLCAweDExNjgsIDB4MDBjNiwgMHgyZDAwLCAweDIwNjAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDUwLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MDBjZSwgMHgwNGYwLCAweDY4MDAsCisJMHhhMDg2LCAweDAwMGYsIDB4MDFjOCwgMHg4ZmZmLCAweDA5MGMsIDB4MTRmNiwgMHg2ODIwLCAweGQwZGMsCisJMHgxMTk4LCAweDY4MDAsIDB4YTA4NiwgMHgwMDA0LCAweDExOTgsIDB4Nzg0YywgMHhkMGFjLCAweDAxODAsCisJMHg3ODRjLCAweGMwZGMsIDB4YzBmNCwgMHg3ODRlLCAweDc4NTAsIDB4YzBmNCwgMHhjMGZjLCAweDc4NTIsCisJMHgyMDAxLCAweDAwMDEsIDB4NjgyZSwgMHgwMGUwLCAweDIwMDEsIDB4MDAwNywgMHg2ODJlLCAweDAwYzAsCisJMHg3ODRjLCAweGQwYjQsIDB4MTEzMCwgMHhkMGFjLCAweDBkYjgsIDB4Nzg0YywgMHhkMGY0LCAweDFkYTAsCisJMHgwYzM4LCAweGQyZWMsIDB4MWQ4OCwgMHg3MDI0LCAweGEzMDYsIDB4MTExOCwgMHg3MDIwLCAweGE0MDYsCisJMHgwZDU4LCAweDcwMjAsIDB4NjgzNiwgMHg3MDI0LCAweDY4M2EsIDB4MjAwMSwgMHgwMDA1LCAweDY4MmUsCisJMHgwODBjLCAweDk4OTQsIDB4MDgwYywgMHg2YzUwLCAweDAwMTAsIDB4MDgwYywgMHg4MDc4LCAweDAwNGUsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAwNSwgMHgwMGU2LCAweDAwZDYsIDB4MDAyNiwgMHg2MDM0LCAweDIwNjgsCisJMHg2YTFjLCAweGEyODYsIDB4MDAwNywgMHgwOTA0LCAweDgzZWUsIDB4YTI4NiwgMHgwMDAyLCAweDA1ZjAsCisJMHhhMjg2LCAweDAwMDAsIDB4MDVkOCwgMHg2ODA4LCAweDYzMzgsIDB4YTMwNiwgMHgxNWI4LCAweDIwNzEsCisJMHhiMjhjLCAweGExODYsIDB4MDAxNSwgMHgwNTYwLCAweGExOGUsIDB4MDAxNiwgMHgxMTkwLCAweDYwMzAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDAxLCAweDExNjAsIDB4NzAwYywgMHhhMDg2LCAweDJhMDAsCisJMHgxMTQwLCAweDYwMzQsIDB4YTA4MCwgMHgwMDA4LCAweDIwMGMsIDB4YzFkZCwgMHhjMWY1LCAweDIxMDIsCisJMHgwMGI4LCAweDAwYzYsIDB4NjAzNCwgMHgyMDYwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsCisJMHgwOTBjLCAweDE0ZjYsIDB4Njg1MywgMHgwMDAzLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsCisJMHg2MDFmLCAweDAwMDIsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwMGNlLCAweDAwMzAsCisJMHg2MDM0LCAweDIwNzAsIDB4MjAwMSwgMHhhZmE1LCAweDIwMDQsIDB4NzAzZSwgMHgwODBjLCAweDgwNzgsCisJMHgwMDJlLCAweDAwZGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4MjBhOSwgMHgwMDBlLCAweDJlOTgsCisJMHg2MDEwLCAweDIwYTAsIDB4NTNhMywgMHhhMWI2LCAweDAwMTUsIDB4MTE0OCwgMHg2MDE4LCAweDIwNjgsCisJMHg3MDM4LCAweDY4MGEsIDB4NzAzYywgMHg2ODBlLCAweDY4MDAsIDB4YzA4ZCwgMHg2ODAyLCAweDAwZGUsCisJMHgwODA0LCAweDgxZjYsIDB4MjEwMCwgMHhhMWIyLCAweDAwODAsIDB4MWEwYywgMHgxNGY2LCAweGExYjIsCisJMHgwMDQwLCAweDFhMDQsIDB4ODQ2ZSwgMHgwMDAyLCAweDg0NjIsIDB4ODQ1NiwgMHg4NDYyLCAweDg0NjIsCisJMHg4NDYyLCAweDg0NjIsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsCisJMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsCisJMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsCisJMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDYyLCAweDg0NTQsIDB4ODQ2MiwgMHg4NDYyLCAweDg0NTQsCisJMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NjIsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsCisJMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDYyLCAweDg0NjIsCisJMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsIDB4ODQ1NCwgMHg4NDU0LCAweDg0NTQsCisJMHg4NDU0LCAweDg0NjIsIDB4ODQ1NCwgMHg4NDU0LCAweDA4MGMsIDB4MTRmNiwgMHg2MDAzLCAweDAwMDEsCisJMHg2MTA2LCAweDA4MGMsIDB4NjdlZSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZjNTAsCisJMHgwMTJlLCAweDAwMDUsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsIDB4MDgwYywgMHg2N2VlLCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YzUwLCAweDAxMmUsIDB4MDAwNSwgMHgyNjAwLCAweDAwMDIsCisJMHg4NDYyLCAweDg0NzYsIDB4ODQ3NiwgMHg4NDYyLCAweDg0NjIsIDB4ODQ3NiwgMHgwODBjLCAweDE0ZjYsCisJMHg2MDA0LCAweGEwYjIsIDB4MDA4MCwgMHgxYTBjLCAweDE0ZjYsIDB4YTFiNiwgMHgwMDEzLCAweDA5MDQsCisJMHg4NTE4LCAweGExYjYsIDB4MDAyNywgMHgxOTA0LCAweDg0ZGUsIDB4MDgwYywgMHg2YjczLCAweDYwMDQsCisJMHgwODBjLCAweDk3NzgsIDB4MDE4OCwgMHgwODBjLCAweDk3ODksIDB4MDkwNCwgMHg4NGQ4LCAweGEwOGUsCisJMHgwMDIxLCAweDA5MDQsIDB4ODRkYiwgMHhhMDhlLCAweDAwMjIsIDB4MDkwNCwgMHg4NGQ4LCAweGEwOGUsCisJMHgwMDNkLCAweDA5MDQsIDB4ODRkYiwgMHgwNGE4LCAweDA4MGMsIDB4MmFmZiwgMHgyMDAxLCAweDAwMDcsCisJMHgwODBjLCAweDRjMzAsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwYywgMHgwODBjLCAweDg1ZjMsCisJMHhhMTg2LCAweDAwN2UsIDB4MTE0OCwgMHgyMDAxLCAweGFkMzQsIDB4MjAxNCwgMHhjMjg1LCAweDA4MGMsCisJMHg1NzRmLCAweDExMDgsIDB4YzJhZCwgMHgyMjAyLCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDIxMTAsCisJMHgyMDE5LCAweDAwMjgsIDB4MDgwYywgMHg2OGU3LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsCisJMHg2ODFkLCAweDAwYzYsIDB4NjAxOCwgMHhhMDY1LCAweDAxMTAsIDB4MDgwYywgMHg0ZWNmLCAweDAwY2UsCisJMHgyYzA4LCAweDA4MGMsIDB4YTcxMiwgMHgwMDdlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDA4MGMsCisJMHg0YzlmLCAweDA4MGMsIDB4OTk0ZSwgMHgwODBjLCAweDgwNzgsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsCisJMHgwODBjLCAweDg1ZjMsIDB4MGNiMCwgMHgwODBjLCAweDg2MjEsIDB4MGM5OCwgMHhhMTg2LCAweDAwMTQsCisJMHgxZGIwLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDJhZDksIDB4MDgwYywgMHg5Nzc4LCAweDExODgsCisJMHgwODBjLCAweDJhZmYsIDB4NjAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAwYywgMHgwODBjLCAweDg1ZjMsCisJMHhhMTg2LCAweDAwN2UsIDB4MTEyOCwgMHgyMDAxLCAweGFkMzQsIDB4MjAwYywgMHhjMTg1LCAweDIxMDIsCisJMHgwOGMwLCAweDA4MGMsIDB4OTc4OSwgMHgxMTE4LCAweDA4MGMsIDB4ODVmMywgMHgwODkwLCAweDYwMDQsCisJMHhhMDhlLCAweDAwMzIsIDB4MTE1OCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhhZDgxLCAweDIwNzksCisJMHgwMDAwLCAweDA4MGMsIDB4MmRmMSwgMHgwMGZlLCAweDAwZWUsIDB4MDgxOCwgMHg2MDA0LCAweGEwOGUsCisJMHgwMDIxLCAweDBkNTAsIDB4YTA4ZSwgMHgwMDIyLCAweDA5MGMsIDB4ODVmMywgMHgwODA0LCAweDg0ZDEsCisJMHhhMGIyLCAweDAwNDAsIDB4MWEwNCwgMHg4NWRiLCAweDIwMDgsIDB4MDAwMiwgMHg4NTYwLCAweDg1NjEsCisJMHg4NTY0LCAweDg1NjcsIDB4ODU2YSwgMHg4NTZkLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsCisJMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsCisJMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsCisJMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NzAsIDB4ODU3ZiwgMHg4NTVlLCAweDg1ODEsCisJMHg4NTdmLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTdmLCAweDg1N2YsCisJMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1NWUsCisJMHg4NWJiLCAweDg1N2YsIDB4ODU1ZSwgMHg4NTdiLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTVlLCAweDg1N2MsCisJMHg4NTVlLCAweDg1NWUsIDB4ODU1ZSwgMHg4NTdmLCAweDg1YjIsIDB4ODU1ZSwgMHgwODBjLCAweDE0ZjYsCisJMHgwMGYwLCAweDIwMDEsIDB4MDAwYiwgMHgwNDYwLCAweDIwMDEsIDB4MDAwMywgMHgwNDQ4LCAweDIwMDEsCisJMHgwMDA1LCAweDA0MzAsIDB4MjAwMSwgMHgwMDAxLCAweDA0MTgsIDB4MjAwMSwgMHgwMDA5LCAweDA0MDAsCisJMHgwODBjLCAweDZiNzMsIDB4NjAwMywgMHgwMDA1LCAweDIwMDEsIDB4YWZhNSwgMHgyMDA0LCAweDYwM2UsCisJMHgwODBjLCAweDZjNTAsIDB4MDBhMCwgMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg0YzMwLCAweDA4MDQsCisJMHg4NWNjLCAweDA4MGMsIDB4NmI3MywgMHgyMDAxLCAweGFmYTMsIDB4MjAwNCwgMHg2MDE2LCAweDIwMDEsCisJMHhhZmE1LCAweDIwMDQsIDB4NjAzZSwgMHg2MDAzLCAweDAwMDQsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsCisJMHgwODBjLCAweDRjMzAsIDB4MDgwYywgMHg2YjczLCAweDYwMDMsIDB4MDAwMiwgMHgyMDAxLCAweGFmYTUsCisJMHgyMDA0LCAweDYwM2UsIDB4MDAzNiwgMHgyMDE5LCAweGFkNWMsIDB4MjMwNCwgMHhhMDg0LCAweGZmMDAsCisJMHgxMTIwLCAweDIwMDEsIDB4YWZhMywgMHgyMDFjLCAweDAwNDAsIDB4ODAwNywgMHhhMDlhLCAweDAwMDQsCisJMHgwZWMwLCAweDgwMDMsIDB4ODAxYiwgMHg4MzFiLCAweGEzMTgsIDB4NjMxNiwgMHgwMDNlLCAweDA4MGMsCisJMHg2YzUwLCAweDA4ZTgsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4OTk0ZSwgMHgwODBjLCAweDgwNzgsCisJMHgwODBjLCAweDZjNTAsIDB4MDhhMCwgMHgwMGU2LCAweDAwZjYsIDB4MjA3MSwgMHhhZDgxLCAweDIwNzksCisJMHgwMDAwLCAweDA4MGMsIDB4MmRmMSwgMHgwMGZlLCAweDAwZWUsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsCisJMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwODE4LCAweDA4MGMsIDB4NmI3MywgMHgyMDAxLCAweGFmYTUsCisJMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDAyLCAweDIwMDEsIDB4YWZhMywgMHgyMDA0LCAweDYwMTYsCisJMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgyNjAwLCAweDIwMDgsIDB4MDAwMiwgMHg4NWU2LCAweDg1ZTQsCisJMHg4NWU0LCAweDg1Y2MsIDB4ODVjYywgMHg4NWU0LCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsCisJMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDE1ZjAsIDB4MDBkZSwgMHgwODBjLCAweDgwNzgsCisJMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwMGU2LCAweDAwMjYsIDB4MDAxNiwgMHgwODBjLCAweDk1OTYsCisJMHgwNTA4LCAweDYwMTAsIDB4MjA3MCwgMHg3MDM0LCAweGEwODYsIDB4MDEzOSwgMHgxMTQ4LCAweDIwMDEsCisJMHgwMDMwLCAweDIwMDksIDB4MDAwMCwgMHgyMDExLCAweDQwMDUsIDB4MDgwYywgMHg5YTA1LCAweDAwOTAsCisJMHg3MDM4LCAweGQwZmMsIDB4MDE3OCwgMHg3MDA3LCAweDAwMDAsIDB4MDAxNiwgMHg2MDA0LCAweGEwOGUsCisJMHgwMDIxLCAweDAxNjAsIDB4YTA4ZSwgMHgwMDNkLCAweDAxNDgsIDB4MDAxZSwgMHg3MDM3LCAweDAxMDMsCisJMHg3MDMzLCAweDAxMDAsIDB4MDAxZSwgMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgwMDFlLCAweDAwMDksCisJMHgwY2M4LCAweDAwZTYsIDB4YWNmMCwgMHgwMDA0LCAweDJlNzQsIDB4NzAwMCwgMHgyMDcwLCAweDcwMzcsCisJMHgwMTAzLCAweDcwMjMsIDB4ODAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDBkNiwgMHg2NjE4LCAweDI2NjgsCisJMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHgwMGRlLCAweGEwYjIsIDB4MDAwYywgMHgxYTBjLCAweDE0ZjYsCisJMHg2NjA0LCAweGE2YjYsIDB4MDA0MywgMHgxMTIwLCAweDA4MGMsIDB4OTljMSwgMHgwODA0LCAweDg2OTIsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAzMywgMHgxMTIwLCAweDA4MGMsIDB4OTk3MSwgMHgwODA0LCAweDg2OTIsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAyOCwgMHgxMTIwLCAweDA4MGMsIDB4OTdiOSwgMHgwODA0LCAweDg2OTIsCisJMHg2NjA0LCAweGE2YjYsIDB4MDAyOSwgMHgxMTE4LCAweDA4MGMsIDB4OTdkMCwgMHgwNGQ4LCAweDY2MDQsCisJMHhhNmI2LCAweDAwMWYsIDB4MTExOCwgMHgwODBjLCAweDgxZGMsIDB4MDRhMCwgMHg2NjA0LCAweGE2YjYsCisJMHgwMDAwLCAweDExMTgsIDB4MDgwYywgMHg4M2Y0LCAweDA0NjgsIDB4NjYwNCwgMHhhNmI2LCAweDAwMjIsCisJMHgxMTE4LCAweDA4MGMsIDB4ODIwNCwgMHgwNDMwLCAweDY2MDQsIDB4YTZiNiwgMHgwMDM1LCAweDExMTgsCisJMHgwODBjLCAweDgyNmIsIDB4MDBmOCwgMHg2NjA0LCAweGE2YjYsIDB4MDAzOSwgMHgxMTE4LCAweDA4MGMsCisJMHg4M2EzLCAweDAwYzAsIDB4NjYwNCwgMHhhNmI2LCAweDAwM2QsIDB4MTExOCwgMHgwODBjLCAweDgyMWUsCisJMHgwMDg4LCAweDY2MDQsIDB4YTZiNiwgMHgwMDQ0LCAweDExMTgsIDB4MDgwYywgMHg4MjNlLCAweDAwNTAsCisJMHhhMWI2LCAweDAwMTUsIDB4MTExMCwgMHgwMDUzLCAweDAwMjgsIDB4YTFiNiwgMHgwMDE2LCAweDExMTgsCisJMHgwODA0LCAweDg4M2YsIDB4MDAwNSwgMHgwODBjLCAweDgwYmUsIDB4MGNlMCwgMHg4NmI5LCAweDg2YmMsCisJMHg4NmI5LCAweDg2ZmUsIDB4ODZiOSwgMHg4N2NjLCAweDg4NGQsIDB4ODZiOSwgMHg4NmI5LCAweDg4MWIsCisJMHg4NmI5LCAweDg4MmYsIDB4YTFiNiwgMHgwMDQ4LCAweDAxNDAsIDB4MjBlMSwgMHgwMDA1LCAweDNkMTgsCisJMHgzZTIwLCAweDJjMTAsIDB4MDgwYywgMHgxODI0LCAweDAwMDUsIDB4MDBlNiwgMHhhY2YwLCAweDAwMDQsCisJMHgyZTc0LCAweDcwMDAsIDB4MjA3MCwgMHg3MDM3LCAweDAxMDMsIDB4MDBlZSwgMHgwODBjLCAweDgwNzgsCisJMHgwMDA1LCAweGUwMDAsIDB4ZTAwMCwgMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLCAweDcwODAsCisJMHhhMDg2LCAweDAwNzQsIDB4MTUzMCwgMHgwODBjLCAweGE2ZTksIDB4MTFiMCwgMHgwMGQ2LCAweDYwMTgsCisJMHgyMDY4LCAweDcwMzAsIDB4ZDA4YywgMHgwMTI4LCAweDY4MDAsIDB4ZDBiYywgMHgwMTEwLCAweGMwYzUsCisJMHg2ODAyLCAweDAwZDksIDB4MDBkZSwgMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0YzMwLCAweDA4MGMsCisJMHgyYWZmLCAweDA4MGMsIDB4ODA3OCwgMHgwMDc4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDRjMzAsCisJMHgwODBjLCAweDJhZmYsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAwMSwgMHgwODBjLCAweDY3ZWUsCisJMHgwMDEwLCAweDA4MGMsIDB4ODdiZCwgMHgwMGVlLCAweDAwMDUsIDB4NjgwMCwgMHhkMDg0LCAweDAxNjgsCisJMHgyMDAxLCAweDAwMDAsIDB4MDgwYywgMHg0YzFlLCAweDIwNjksIDB4YWQ1MSwgMHg2ODA0LCAweGQwYTQsCisJMHgwMTIwLCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDRjNWQsIDB4MDAwNSwgMHgwMGQ2LCAweDIwMTEsCisJMHhhZDIwLCAweDIyMDQsIDB4YTA4NiwgMHgwMDc0LCAweDE5MDQsIDB4ODdiYSwgMHg2MDE4LCAweDIwNjgsCisJMHg2YWEwLCAweGEyODYsIDB4MDA3ZSwgMHgxMTIwLCAweDA4MGMsIDB4ODk0ZCwgMHgwODA0LCAweDg3NWUsCisJMHgwODBjLCAweDg5NDMsIDB4NjAxOCwgMHgyMDY4LCAweGEwODAsIDB4MDAyOCwgMHgyMDE0LCAweGEyODYsCisJMHgwMDgwLCAweDExYzAsIDB4NjgxMywgMHgwMGZmLCAweDY4MTcsIDB4ZmZmYywgMHg2MDEwLCAweGEwMDUsCisJMHgwMTM4LCAweDIwNjgsIDB4NjgwNywgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ODMzLCAweDAyMDAsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0YzMwLCAweDA4MGMsIDB4MmFmZiwgMHgwODBjLCAweDgwNzgsCisJMHgwODA0LCAweDg3YmIsIDB4MDBlNiwgMHgyMDcxLCAweGFkMzQsIDB4MmUwNCwgMHhkMDljLCAweDAxODgsCisJMHgyMDcxLCAweGIyODAsIDB4NzEwOCwgMHg3MjBjLCAweGExOGMsIDB4MDBmZiwgMHgxMTE4LCAweGEyODQsCisJMHhmZjAwLCAweDAxMzgsIDB4NjAxOCwgMHgyMDcwLCAweDcwYTAsIDB4ZDBiYywgMHgxMTEwLCAweDcxMTIsCisJMHg3MjE2LCAweDAwZWUsIDB4NjAxMCwgMHhhMDA1LCAweDAxMjgsIDB4MjA2OCwgMHg2ODM4LCAweGQwZjQsCisJMHgwMTA4LCAweDA4ODAsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NGMzMCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDMsIDB4MDgwYywgMHg2N2VlLCAweDA4MDQsIDB4ODdiYiwgMHg2ODVjLCAweGQwZTQsCisJMHgwMWQwLCAweDA4MGMsIDB4OTkwMywgMHgwODBjLCAweDU3NGYsIDB4MDExMCwgMHhkMGRjLCAweDE5MDAsCisJMHgyMDExLCAweGFkMzQsIDB4MjIwNCwgMHhjMGFkLCAweDIwMTIsIDB4MjAwMSwgMHhhZjhlLCAweDIwMDQsCisJMHgwMGY2LCAweDIwNzksIDB4MDEwMCwgMHg3OGUzLCAweDAwMDAsIDB4MDgwYywgMHgyNmNiLCAweDc4ZTIsCisJMHgwMGZlLCAweDA4MDQsIDB4ODcyOCwgMHgwODBjLCAweDk5MzcsIDB4MjAxMSwgMHhhZDM0LCAweDIyMDQsCisJMHhjMGE1LCAweDIwMTIsIDB4MDAwNiwgMHgwODBjLCAweGE4MDEsIDB4MDAwZSwgMHgxOTA0LCAweDg3MjgsCisJMHhjMGI1LCAweDIwMTIsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsIDB4NGMxZSwgMHgwMGM2LCAweDIwMDksCisJMHgwMGVmLCAweDAwZjYsIDB4MjA3OSwgMHgwMTAwLCAweDc5ZWEsIDB4NzkzMiwgMHg3OTM2LCAweDAwZmUsCisJMHgwODBjLCAweDI2YTAsIDB4MDBmNiwgMHgyMDc5LCAweGFkMDAsIDB4Nzk3MiwgMHgyMTAwLCAweDIwMDksCisJMHgwMDAwLCAweDA4MGMsIDB4MjY3NiwgMHg3OTRlLCAweDAwZmUsIDB4ODEwOCwgMHgwODBjLCAweDRjODAsCisJMHgyYzAwLCAweDAwY2UsIDB4MTkwNCwgMHg4NzI4LCAweDYwMWEsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsCisJMHg0YzMwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAyLCAweDA4MGMsCisJMHg2N2VlLCAweDAwMDgsIDB4MDAxMSwgMHgwMGRlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDAwLCAweDIwMDQsCisJMHhhMDg2LCAweDAwMDMsIDB4MDEyMCwgMHgyMDAxLCAweDAwMDcsIDB4MDgwYywgMHg0YzMwLCAweDA4MGMsCisJMHgyYWZmLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweDAwZTYsIDB4MDAyNiwgMHgwMDE2LCAweDIwNzEsCisJMHhhZDAwLCAweDcwODAsIDB4YTA4NiwgMHgwMDE0LCAweDE1ZjAsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsCisJMHgxMTI4LCAweDYwMTAsIDB4YTAwNSwgMHgxMTEwLCAweDA4MGMsIDB4M2NjZSwgMHgwMGQ2LCAweDYwMTgsCisJMHgyMDY4LCAweDA4MGMsIDB4NGQ3MiwgMHgwODBjLCAweDg2ZWQsIDB4MDBkZSwgMHgwODBjLCAweDg5ZjcsCisJMHgxNTUwLCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4OTAsIDB4MDBkZSwgMHhhMDA1LCAweDA1MTgsCisJMHgyMDAxLCAweDAwMDYsIDB4MDgwYywgMHg0YzMwLCAweDAwZTYsIDB4NjAxMCwgMHhhMDc1LCAweDAxYTgsCisJMHg3MDM0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMzksIDB4MTE0OCwgMHgyMDAxLCAweDAwMDAsCisJMHgyMDA5LCAweDAwMDAsIDB4MjAxMSwgMHg0MDAwLCAweDA4MGMsIDB4OWEwNSwgMHgwMDMwLCAweDcwMDcsCisJMHgwMDAwLCAweDcwMzcsIDB4MDEwMywgMHg3MDMzLCAweDAyMDAsIDB4MDBlZSwgMHgwODBjLCAweDJhZmYsCisJMHgwODBjLCAweDgwNzgsIDB4MDAyMCwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg4N2JkLCAweDAwMWUsCisJMHgwMDJlLCAweDAwZWUsIDB4MDAwNSwgMHgyMDExLCAweGFkMjAsIDB4MjIwNCwgMHhhMDg2LCAweDAwMTQsCisJMHgxMTU4LCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDRjMzAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwMDEwLCAweDA4MGMsIDB4ODdiZCwgMHgwMDA1LCAweDIwMTEsCisJMHhhZDIwLCAweDIyMDQsIDB4YTA4NiwgMHgwMDA0LCAweDExMzgsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsCisJMHg0YzMwLCAweDA4MGMsIDB4ODA3OCwgMHgwMDEwLCAweDA4MGMsIDB4ODdiZCwgMHgwMDA1LCAweDAwMGIsCisJMHgwMDA1LCAweDg2YjksIDB4ODg1NCwgMHg4NmI5LCAweDg4OGEsIDB4ODZiOSwgMHg4OGZmLCAweDg4NGQsCisJMHg4NmI5LCAweDg2YjksIDB4ODkxMiwgMHg4NmI5LCAweDg5MjIsIDB4NjYwNCwgMHhhNmI2LCAweDAwMWUsCisJMHgxMTEwLCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweDAwZDYsIDB4MDBjNiwgMHgwODBjLCAweDg5MzIsCisJMHgxMTc4LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsCisJMHg0YzMwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg2N2VlLCAweDAwZjgsCisJMHgyMDA5LCAweGIyOGUsIDB4MjEwNCwgMHhhMDg2LCAweDAwMDksIDB4MTE2MCwgMHg2MDE4LCAweDIwNjgsCisJMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAxODAsIDB4ODAwMSwgMHg2ODQyLCAweDYwMTcsCisJMHgwMDBhLCAweDAwNjgsIDB4MjAwOSwgMHhiMjhmLCAweDIxMDQsIDB4YTA4NCwgMHhmZjAwLCAweGEwODYsCisJMHgxOTAwLCAweDExMTgsIDB4MDgwYywgMHg4MDc4LCAweDAwMTAsIDB4MDgwYywgMHg4N2JkLCAweDAwY2UsCisJMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg4OTQwLCAweDAwZDYsIDB4MjA2OSwgMHhhZjlkLCAweDJkMDQsCisJMHhhMDA1LCAweDAxNjgsIDB4NjAxOCwgMHgyMDY4LCAweDY4YTAsIDB4YTA4NiwgMHgwMDdlLCAweDExMzgsCisJMHgyMDY5LCAweGFkMWMsIDB4MmQwNCwgMHg4MDAwLCAweDIwNmEsIDB4MDBkZSwgMHgwMDEwLCAweDAwZGUsCisJMHgwMDc4LCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4MjAwMSwgMHgwMDAyLCAweDA4MGMsCisJMHg0YzMwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg2N2VlLCAweDA0MjgsCisJMHgwODBjLCAweDg1ZjMsIDB4MjAwOSwgMHhiMjhlLCAweDIxMzQsIDB4YTZiNCwgMHgwMGZmLCAweGE2ODYsCisJMHgwMDA1LCAweDAxZTAsIDB4YTY4NiwgMHgwMDBiLCAweDAxYjAsIDB4MjAwOSwgMHhiMjhmLCAweDIxMDQsCisJMHhhMDg0LCAweGZmMDAsIDB4MTExOCwgMHhhNjg2LCAweDAwMDksIDB4MDE4MCwgMHhhMDg2LCAweDE5MDAsCisJMHgxMTUwLCAweGE2ODYsIDB4MDAwOSwgMHgwMTUwLCAweDIwMDEsIDB4MDAwNCwgMHgwODBjLCAweDRjMzAsCisJMHgwODBjLCAweDgwNzgsIDB4MDAxMCwgMHgwODBjLCAweDg3YmQsIDB4MDAwNSwgMHgwMGQ2LCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTI4LCAweDY4MzgsIDB4ZDBmYywgMHgwMTEwLCAweDAwZGUsCisJMHgwYzkwLCAweDYwMTgsIDB4MjA2OCwgMHg2ODQwLCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAxNDAsCisJMHg4MDAxLCAweDY4NDIsIDB4NjAxNywgMHgwMDBhLCAweDYwMDcsIDB4MDAxNiwgMHgwMGRlLCAweDBjMjgsCisJMHg2OGEwLCAweGEwODYsIDB4MDA3ZSwgMHgxMTM4LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLCAweDA4MGMsCisJMHg0OGY1LCAweDAwZWUsIDB4MDAxMCwgMHgwODBjLCAweDJhZDksIDB4MDBkZSwgMHgwOGEwLCAweDA4MGMsCisJMHg4OTQwLCAweDExNTgsIDB4MjAwMSwgMHgwMDA0LCAweDA4MGMsIDB4NGMzMCwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDMsIDB4MDgwYywgMHg2N2VlLCAweDAwMjAsIDB4MDgwYywgMHg4NWYzLCAweDA4MGMsCisJMHg4N2JkLCAweDAwMDUsIDB4MDQ2OSwgMHgxMTU4LCAweDIwMDEsIDB4MDAwOCwgMHgwODBjLCAweDRjMzAsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDA1LCAweDA4MGMsIDB4NjdlZSwgMHgwMDEwLCAweDA4MGMsCisJMHg4N2JkLCAweDAwMDUsIDB4MDBlOSwgMHgxMTU4LCAweDIwMDEsIDB4MDAwYSwgMHgwODBjLCAweDRjMzAsCisJMHg2MDAzLCAweDAwMDEsIDB4NjAwNywgMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwMDEwLCAweDA4MGMsCisJMHg4N2JkLCAweDAwMDUsIDB4MjAwOSwgMHhiMjhlLCAweDIxMDQsIDB4YTA4NiwgMHgwMDAzLCAweDExMzgsCisJMHgyMDA5LCAweGIyOGYsIDB4MjEwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgyYTAwLCAweDAwMDUsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGM2LCAweDAwMTYsIDB4YWM4OCwgMHgwMDA2LCAweDIxNjQsCisJMHgwODBjLCAweDRjZWIsIDB4MDAxZSwgMHgwMGNlLCAweDAwMDUsIDB4MDBmNiwgMHgwMGU2LCAweDAwZDYsCisJMHgwMDM2LCAweDAwMTYsIDB4NjAxOCwgMHgyMDY4LCAweDIwNzEsIDB4YWQzNCwgMHgyZTA0LCAweGEwODUsCisJMHgwMDAzLCAweDIwNzIsIDB4MDgwYywgMHg4OWNjLCAweDA1MzgsIDB4MjAwMSwgMHhhZDUyLCAweDIwMDQsCisJMHhkMGE0LCAweDAxNTgsIDB4YTAwNiwgMHgyMDIwLCAweDIwMDksIDB4MDAyYSwgMHgwODBjLCAweGE5NmMsCisJMHgyMDAxLCAweGFkMGMsIDB4MjAwYywgMHhjMTk1LCAweDIxMDIsIDB4MjAxOSwgMHgwMDJhLCAweDIwMDksCisJMHgwMDAxLCAweDA4MGMsIDB4MmFhYywgMHgyMDcxLCAweGFkMDAsIDB4MDgwYywgMHgyOGZhLCAweDAwYzYsCisJMHgwMTU2LCAweDIwYTksIDB4MDA4MSwgMHgyMDA5LCAweDAwN2YsIDB4MDgwYywgMHgyYmM5LCAweDgxMDgsCisJMHgxZjA0LCAweDg5N2QsIDB4MDE1ZSwgMHgwMGNlLCAweDA4MGMsIDB4ODk0MywgMHg2ODEzLCAweDAwZmYsCisJMHg2ODE3LCAweGZmZmUsIDB4MjA3MSwgMHhiMjgwLCAweDIwNzksIDB4MDEwMCwgMHgyZTA0LCAweGEwODQsCisJMHgwMGZmLCAweDIwNjksIDB4YWQxYiwgMHgyMDZhLCAweDc4ZTYsIDB4MDAwNiwgMHg4ZTcwLCAweDJlMDQsCisJMHgyMDY5LCAweGFkMWMsIDB4MjA2YSwgMHg3OGVhLCAweDc4MzIsIDB4NzgzNiwgMHgyMDEwLCAweGEwODQsCisJMHhmZjAwLCAweDAwMWUsIDB4YTEwNSwgMHgyMDA5LCAweGFkMjcsIDB4MjAwYSwgMHgyMjAwLCAweGEwODQsCisJMHgwMGZmLCAweDIwMDgsIDB4MDgwYywgMHgyNmEwLCAweDA4MGMsIDB4NTc0ZiwgMHgwMTcwLCAweDIwNjksCisJMHhiMjhlLCAweDIwNzEsIDB4YWY5ZiwgMHg2ODEwLCAweDIwNzIsIDB4NjgxNCwgMHg3MDA2LCAweDY4MTgsCisJMHg3MDBhLCAweDY4MWMsIDB4NzAwZSwgMHgwODBjLCAweDk5MDMsIDB4MDA0MCwgMHgyMDAxLCAweDAwMDYsCisJMHgwODBjLCAweDRjMzAsIDB4MDgwYywgMHgyYWZmLCAweDA4MGMsIDB4ODA3OCwgMHgwMDFlLCAweDAwM2UsCisJMHgwMGRlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweDAwMjYsIDB4MDAzNiwgMHgwMGU2LCAweDAxNTYsCisJMHgyMDE5LCAweGFkMjcsIDB4MjMxYywgMHg4M2ZmLCAweDAxZTgsIDB4MjA3MSwgMHhiMjgwLCAweDJlMTQsCisJMHhhMjk0LCAweDAwZmYsIDB4NzAwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTIwNSwgMHhhMzA2LCAweDExOTAsCisJMHgyMDExLCAweGIyOTYsIDB4YWQ5OCwgMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweDhhN2MsCisJMHgxMTQ4LCAweDIwMTEsIDB4YjI5YSwgMHhhZDk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsCisJMHg4YTdjLCAweDExMDAsIDB4MDE1ZSwgMHgwMGVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsCisJMHgyMDcxLCAweGIyOGMsIDB4NzAwNCwgMHhhMDg2LCAweDAwMTQsIDB4MTFhOCwgMHg3MDA4LCAweGEwODYsCisJMHgwODAwLCAweDExODgsIDB4NzAwYywgMHhkMGVjLCAweDAxNjAsIDB4YTA4NCwgMHgwZjAwLCAweGEwODYsCisJMHgwMTAwLCAweDExMzgsIDB4NzAyNCwgMHhkMGE0LCAweDExMTAsIDB4ZDBhYywgMHgwMTEwLCAweGEwMDYsCisJMHgwMDEwLCAweGEwODUsIDB4MDAwMSwgMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGQ2LCAweDAwYzYsCisJMHgwMDc2LCAweDAwNTYsIDB4MDA0NiwgMHgwMDI2LCAweDAwMDYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDI5LCAweGFmZDAsIDB4MjUyYywgMHgyMDIxLCAweGFmZDYsIDB4MjQyNCwgMHgyMDYxLCAweGI0MDAsCisJMHgyMDcxLCAweGFkMDAsIDB4NzI0NCwgMHg3MDY0LCAweGEyMDIsIDB4MTZmMCwgMHgwODBjLCAweGE5OTAsCisJMHgwNWEwLCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLCAweDA1ODAsIDB4YTc4NiwgMHgwMDA3LCAweDA1NjgsCisJMHgyNTAwLCAweGFjMDYsIDB4MDU1MCwgMHgyNDAwLCAweGFjMDYsIDB4MDUzOCwgMHgwMGM2LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDQsIDB4MTExMCwgMHgwODBjLCAweDE5MGIsIDB4YTc4NiwgMHgwMDA4LCAweDExNDgsCisJMHgwODBjLCAweDk3ODksIDB4MTEzMCwgMHgwMGNlLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDk3NGUsCisJMHgwMGEwLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDE2MCwgMHhhNzg2LCAweDAwMDMsCisJMHgxMWU4LCAweDY4MzcsIDB4MDEwMywgMHg2YjRhLCAweDY4NDcsIDB4MDAwMCwgMHgwODBjLCAweDUxMGMsCisJMHgwODBjLCAweDk3NDIsIDB4MDgwYywgMHg5NzRlLCAweDAwY2UsIDB4YWNlMCwgMHgwMDE4LCAweDcwNTgsCisJMHhhYzAyLCAweDEyMTAsIDB4MDgwNCwgMHg4YTJhLCAweDAxMmUsIDB4MDAwZSwgMHgwMDJlLCAweDAwNGUsCisJMHgwMDVlLCAweDAwN2UsIDB4MDBjZSwgMHgwMGRlLCAweDAwZWUsIDB4MDAwNSwgMHhhNzg2LCAweDAwMDYsCisJMHgxZDAwLCAweDA4MGMsIDB4YTkxZiwgMHgwYzMwLCAweDIyMGMsIDB4MjMwNCwgMHhhMTA2LCAweDExMzAsCisJMHg4MjEwLCAweDgzMTgsIDB4MWYwNCwgMHg4YTdjLCAweGEwMDYsIDB4MDAwNSwgMHgyMzA0LCAweGExMDIsCisJMHgwMjE4LCAweDIwMDEsIDB4MDAwMSwgMHgwMDEwLCAweDIwMDEsIDB4MDAwMCwgMHhhMThkLCAweDAwMDEsCisJMHgwMDA1LCAweDYwMDQsIDB4YTA4YSwgMHgwMDgwLCAweDFhMGMsIDB4MTRmNiwgMHgwODBjLCAweDk3NzgsCisJMHgwMTIwLCAweDA4MGMsIDB4OTc4OSwgMHgwMTY4LCAweDAwMjgsIDB4MDgwYywgMHgyYWZmLCAweDA4MGMsCisJMHg5Nzg5LCAweDAxMzgsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLCAweDZjNTAsCisJMHgwMDA1LCAweDA4MGMsIDB4ODVmMywgMHgwY2IwLCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweDhhYzIsCisJMHg4YWMyLCAweDhhYzIsIDB4OGFjMiwgMHg4YWMyLCAweDhhYzIsIDB4OGFjMiwgMHg4YWMyLCAweDhhYzIsCisJMHg4YWMyLCAweDhhYzIsIDB4OGFjNCwgMHg4YWM0LCAweDhhYzQsIDB4OGFjNCwgMHg4YWMyLCAweDhhYzIsCisJMHg4YWMyLCAweDhhYzQsIDB4MDgwYywgMHgxNGY2LCAweDYwMGIsIDB4ZmZmZiwgMHg2MDAzLCAweDAwMDEsCisJMHg2MTA2LCAweDA4MGMsIDB4NjdhOCwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwODBjLCAweDZjNTAsCisJMHgwMTJlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsCisJMHgwODA0LCAweDhiNWUsIDB4YTE4NiwgMHgwMDI3LCAweDExZTgsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsCisJMHgyYWQ5LCAweDAwZDYsIDB4NjExMCwgMHgyMTY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTY4LCAweDY4MzcsCisJMHgwMTAzLCAweDY4NGIsIDB4MDAyOSwgMHg2ODQ3LCAweDAwMDAsIDB4Njk0YywgMHhjMWM1LCAweDY5NGUsCisJMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg5NzQyLCAweDAwZGUsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsCisJMHg2YzUwLCAweDAwMDUsIDB4YTE4NiwgMHgwMDE0LCAweDExMjAsIDB4NjAwNCwgMHhhMDgyLCAweDAwNDAsCisJMHgwNDI4LCAweGExODYsIDB4MDA0NiwgMHgwMTM4LCAweGExODYsIDB4MDA0NSwgMHgwMTIwLCAweGExODYsCisJMHgwMDQ3LCAweDE5MGMsIDB4MTRmNiwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDAxOTgsCisJMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDY2OTksCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweGUwMDAsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDIsCisJMHgxMTEwLCAweDA4MDQsIDB4OGI5OCwgMHgwODBjLCAweDgwYmUsIDB4MDAwNSwgMHgwMDAyLCAweDhiM2MsCisJMHg4YjNhLCAweDhiM2EsIDB4OGIzYSwgMHg4YjNhLCAweDhiM2EsIDB4OGIzYSwgMHg4YjNhLCAweDhiM2EsCisJMHg4YjNhLCAweDhiM2EsIDB4OGI1NywgMHg4YjU3LCAweDhiNTcsIDB4OGI1NywgMHg4YjNhLCAweDhiNTcsCisJMHg4YjNhLCAweDhiNTcsIDB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4NmI3MywgMHgwMGQ2LCAweDYxMTAsCisJMHgyMTY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMDYsCisJMHg2ODQ3LCAweDAwMDAsIDB4Njg1MCwgMHhjMGVjLCAweDY4NTIsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsCisJMHg5NzQyLCAweDAwZGUsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDA4MGMsCisJMHg2YjczLCAweDA4MGMsIDB4ODA3OCwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwMDAyLCAweDhiNzQsCisJMHg4YjcyLCAweDhiNzIsIDB4OGI3MiwgMHg4YjcyLCAweDhiNzIsIDB4OGI3MiwgMHg4YjcyLCAweDhiNzIsCisJMHg4YjcyLCAweDhiNzIsIDB4OGI4NiwgMHg4Yjg2LCAweDhiODYsIDB4OGI4NiwgMHg4YjcyLCAweDhiOTEsCisJMHg4YjcyLCAweDhiODYsIDB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4NmI3MywgMHgyMDAxLCAweGFmYTUsCisJMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4NmM1MCwgMHg2MDEwLCAweGEwODgsCisJMHgwMDEzLCAweDIxMDQsIDB4YTA4NSwgMHgwNDAwLCAweDIwMGEsIDB4MDAwNSwgMHgwODBjLCAweDZiNzMsCisJMHgyMDAxLCAweGFmYTUsIDB4MjAwNCwgMHg2MDNlLCAweDYwMDMsIDB4MDAwZiwgMHgwODBjLCAweDZjNTAsCisJMHgwMDA1LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDgwNzgsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsCisJMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHg4YmFlLCAweDhiYWUsCisJMHg4YmIwLCAweDhjODgsIDB4OGNhOSwgMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHg4YmFlLCAweDhiYWUsCisJMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHg4YmFlLCAweDhiYWUsIDB4OGJhZSwgMHgwODBjLCAweDE0ZjYsCisJMHgwMGU2LCAweDAwZDYsIDB4NjAzZiwgMHgwMDAwLCAweDIwNzEsIDB4YjI4MCwgMHg3MTI0LCAweDYxMGEsCisJMHgyMDcxLCAweGIyOGMsIDB4NjExMCwgMHgyMTY4LCAweDc2MTQsIDB4YTZiNCwgMHgwZmZmLCAweDg2ZmYsCisJMHgwOTA0LCAweDhjNTQsIDB4YTY4YywgMHgwYzAwLCAweDAxZTgsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHg1MDI5LCAweDAwZmUsIDB4MDE5OCwgMHg2ODRjLCAweGQwYWMsIDB4MDE4MCwgMHg2MDIwLCAweGQwZGMsCisJMHgxMTY4LCAweDY4NTAsIDB4ZDBiYywgMHgxMTUwLCAweDczMTgsIDB4NjgxNCwgMHhhMzA2LCAweDE5MDQsCisJMHg4YzY2LCAweDczMWMsIDB4NjgxMCwgMHhhMzA2LCAweDE5MDQsIDB4OGM2NiwgMHg3MzE4LCAweDZiNjIsCisJMHg3MzFjLCAweDZiNWUsIDB4YTY4YywgMHgwMGZmLCAweGExODYsIDB4MDAwMiwgMHgwNTE4LCAweGExODYsCisJMHgwMDI4LCAweDExMjgsIDB4MDgwYywgMHg5NzY3LCAweDY4NGIsIDB4MDAxYywgMHgwMGU4LCAweGQ2ZGMsCisJMHgwMWEwLCAweDY4NGIsIDB4MDAxNSwgMHg2ODRjLCAweGQwYWMsIDB4MDE3MCwgMHg2OTE0LCAweDZhMTAsCisJMHgyMTAwLCAweGEyMDUsIDB4MDE0OCwgMHg3MDE4LCAweGExMDYsIDB4MTExOCwgMHg3MDFjLCAweGEyMDYsCisJMHgwMTE4LCAweDY5NjIsIDB4NmE1ZSwgMHhjNmRjLCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweDY4NGIsCisJMHgwMDA3LCAweDAwMTAsIDB4Njg0YiwgMHgwMDAwLCAweDY4MzcsIDB4MDEwMywgMHg2ZTQ2LCAweGEwMWUsCisJMHhkNmM0LCAweDAxZjAsIDB4YTY4NiwgMHgwMTAwLCAweDExNDAsIDB4MjAwMSwgMHhiMjk5LCAweDIwMDQsCisJMHhhMDA1LCAweDExMTgsIDB4YzZjNCwgMHgwODA0LCAweDhiYmYsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsCisJMHg4M2ZmLCAweDAxNzAsIDB4YTM4YSwgMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsCisJMHgyMzA4LCAweDIwMTksIDB4YjI5OCwgMHhhZDkwLCAweDAwMTksIDB4MDgwYywgMHg5MjdmLCAweDAwM2UsCisJMHhkNmNjLCAweDA5MDQsIDB4OGM3OSwgMHg3MTI0LCAweDY5NWEsIDB4ODFmZiwgMHgwOTA0LCAweDhjNzksCisJMHhhMTkyLCAweDAwMjEsIDB4MTI1MCwgMHgyMDcxLCAweGIyOTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsCisJMHhhZDkwLCAweDAwMWQsIDB4MDgwYywgMHg5MjdmLCAweDA0YTAsIDB4NjgzOCwgMHhkMGZjLCAweDAxMjAsCisJMHgyMDA5LCAweDAwMjAsIDB4Njk1YSwgMHgwYzc4LCAweDAwZjYsIDB4MmQ3OCwgMHgwODBjLCAweDkyMjQsCisJMHgwMGZlLCAweDA4MGMsIDB4OTI2ZiwgMHgwNDM4LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUwMjksCisJMHgwMGZlLCAweDAxODgsIDB4Njg0YywgMHhkMGFjLCAweDAxNzAsIDB4NjAyMCwgMHhkMGRjLCAweDExNTgsCisJMHg2ODUwLCAweGQwYmMsIDB4MTE0MCwgMHg2ODRjLCAweGQwZjQsIDB4MTEyOCwgMHgwODBjLCAweDk4NjYsCisJMHgwMGRlLCAweDAwZWUsIDB4MDBlMCwgMHg2ODRiLCAweDAwMDAsIDB4NjgzNywgMHgwMTAzLCAweDZlNDYsCisJMHg2ODRjLCAweGQwYWMsIDB4MDEzMCwgMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMTEwLCAweDA4MGMsCisJMHg4ZTA0LCAweDA4MGMsIDB4NTEwYywgMHg2MjE4LCAweDIyNjgsIDB4NmEzYywgMHg4MjExLCAweDZhM2UsCisJMHgwODBjLCAweDk4MzQsIDB4MDBkZSwgMHgwMGVlLCAweDExMTAsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsCisJMHgwMGY2LCAweDYwMDMsIDB4MDAwMywgMHgyMDc5LCAweGIyOGMsIDB4N2MwNCwgMHg3YjAwLCAweDdlMGMsCisJMHg3ZDA4LCAweDYwMTAsIDB4MjA3OCwgMHg3ODRjLCAweGQwYWMsIDB4MDEyMCwgMHg2MDAzLCAweDAwMDIsCisJMHgwMGZlLCAweDAwMDUsIDB4N2MxMiwgMHg3YjE2LCAweDdlMGEsIDB4N2QwZSwgMHgwMGZlLCAweDYwM2YsCisJMHgwMDAwLCAweDJjMTAsIDB4MDgwYywgMHgxZTZlLCAweDA4MGMsIDB4NjgwYiwgMHgwODBjLCAweDZkMGQsCisJMHgwMDA1LCAweDIwMDEsIDB4YWZhNSwgMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDA0LCAweDYxMTAsCisJMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsIDB4MDgwYywgMHgxODI0LCAweDAwMDUsCisJMHhhMTgyLCAweDAwNDAsIDB4MDAwMiwgMHg4Y2NlLCAweDhjY2UsIDB4OGNjZSwgMHg4Y2NlLCAweDhjY2UsCisJMHg4Y2QwLCAweDhkNjEsIDB4OGNjZSwgMHg4Y2NlLCAweDhkNzcsIDB4OGRkYiwgMHg4Y2NlLCAweDhjY2UsCisJMHg4Y2NlLCAweDhjY2UsIDB4OGRlYSwgMHg4Y2NlLCAweDhjY2UsIDB4OGNjZSwgMHgwODBjLCAweDE0ZjYsCisJMHgwMDc2LCAweDAwZjYsIDB4MDBlNiwgMHgwMGQ2LCAweDIwNzEsIDB4YjI4YywgMHg2MTEwLCAweDIxNzgsCisJMHg3NjE0LCAweGE2YjQsIDB4MGZmZiwgMHg3ZTQ2LCAweDdmNGMsIDB4YzdlNSwgMHg3ZjRlLCAweDYyMTgsCisJMHgyMjY4LCAweDZhM2MsIDB4ODIxMSwgMHg2YTNlLCAweDg2ZmYsIDB4MDkwNCwgMHg4ZDVjLCAweGE2OTQsCisJMHhmZjAwLCAweGEyODQsIDB4MGMwMCwgMHgwMTIwLCAweDcwMTgsIDB4Nzg2MiwgMHg3MDFjLCAweDc4NWUsCisJMHhhMjg0LCAweDAzMDAsIDB4MDkwNCwgMHg4ZDVjLCAweDA4MGMsIDB4MTVkOSwgMHgwOTBjLCAweDE0ZjYsCisJMHgyZDAwLCAweDc4NGEsIDB4N2Y0YywgMHhjN2NkLCAweDdmNGUsIDB4NjgzNywgMHgwMTAzLCAweDc4MzgsCisJMHg2ODNhLCAweDc4M2MsIDB4NjgzZSwgMHg3ODQwLCAweDY4NDIsIDB4NmU0NiwgMHhhNjhjLCAweDBjMDAsCisJMHgwMTIwLCAweDczMTgsIDB4NmI2MiwgMHg3MzFjLCAweDZiNWUsIDB4YTY4YywgMHgwMGZmLCAweGExODYsCisJMHgwMDAyLCAweDAxODAsIDB4YTE4NiwgMHgwMDI4LCAweDExMTgsIDB4Njg0YiwgMHgwMDFjLCAweDAwNjAsCisJMHhkNmRjLCAweDAxMTgsIDB4Njg0YiwgMHgwMDE1LCAweDAwMzgsIDB4ZDZkNCwgMHgwMTE4LCAweDY4NGIsCisJMHgwMDA3LCAweDAwMTAsIDB4Njg0YiwgMHgwMDAwLCAweDZmNGUsIDB4Nzg1MCwgMHg2ODUyLCAweDc4NTQsCisJMHg2ODU2LCAweGEwMWUsIDB4ZDZjNCwgMHgwMTk4LCAweDczMjgsIDB4NzMyYywgMHg2YjU2LCAweDgzZmYsCisJMHgwMTcwLCAweGEzOGEsIDB4MDAwOSwgMHgwMjEwLCAweDIwMTksIDB4MDAwOCwgMHgwMDM2LCAweDIzMDgsCisJMHgyMDE5LCAweGIyOTgsIDB4YWQ5MCwgMHgwMDE5LCAweDA4MGMsIDB4OTI3ZiwgMHgwMDNlLCAweGQ2Y2MsCisJMHgwMWQ4LCAweDcxMjQsIDB4Njk1YSwgMHg4MWZmLCAweDAxYjgsIDB4YTE5MiwgMHgwMDIxLCAweDEyNTAsCisJMHgyMDcxLCAweGIyOTgsIDB4ODMxYywgMHgyMzAwLCAweGFlMTgsIDB4YWQ5MCwgMHgwMDFkLCAweDA4MGMsCisJMHg5MjdmLCAweDAwNTAsIDB4NzgzOCwgMHhkMGZjLCAweDAxMjAsIDB4MjAwOSwgMHgwMDIwLCAweDY5NWEsCisJMHgwYzc4LCAweDJkNzgsIDB4MDgwYywgMHg5MjI0LCAweDAwZGUsIDB4MDBlZSwgMHgwMGZlLCAweDAwN2UsCisJMHgwMDA1LCAweDAwZjYsIDB4NjAwMywgMHgwMDAzLCAweDIwNzksIDB4YjI4YywgMHg3YzA0LCAweDdiMDAsCisJMHg3ZTBjLCAweDdkMDgsIDB4NjAxMCwgMHgyMDc4LCAweDdjMTIsIDB4N2IxNiwgMHg3ZTBhLCAweDdkMGUsCisJMHgwMGZlLCAweDJjMTAsIDB4MDgwYywgMHgxZTZlLCAweDA4MGMsIDB4NzgxYSwgMHgwMDA1LCAweDAwZDYsCisJMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg1MDI5LCAweDAwZmUsIDB4MDEyMCwgMHgyMDAxLCAweGFmYTUsCisJMHgyMDA0LCAweDYwM2UsIDB4NjAwMywgMHgwMDAyLCAweDA4MGMsIDB4NmMwNSwgMHgwODBjLCAweDZkMGQsCisJMHg2MTEwLCAweDIxNjgsIDB4Njk0YywgMHhkMWU0LCAweDA5MDQsIDB4OGRkOSwgMHhkMWNjLCAweDA1NDAsCisJMHg2OTQ4LCAweDY4MzgsIDB4ZDBmYywgMHgwMWU4LCAweDAwMTYsIDB4Njg0YywgMHgwMDA2LCAweDY4NTAsCisJMHgwMDA2LCAweGFkOTAsIDB4MDAwZCwgMHhhMTk4LCAweDAwMGQsIDB4MjAwOSwgMHgwMDIwLCAweDAxNTYsCisJMHgyMWE4LCAweDIzMDQsIDB4MjAxMiwgMHg4MzE4LCAweDgyMTAsIDB4MWYwNCwgMHg4ZGExLCAweDAxNWUsCisJMHgwMDBlLCAweDY4NTIsIDB4MDAwZSwgMHg2ODRlLCAweDAwMWUsIDB4MjE2OCwgMHgwODBjLCAweDE2MDAsCisJMHgwNDE4LCAweDAwMTYsIDB4MDgwYywgMHgxNjAwLCAweDAwZGUsIDB4MDgwYywgMHg5MjZmLCAweDAwZTAsCisJMHg2ODM3LCAweDAxMDMsIDB4Njk0NCwgMHhhMTg0LCAweDAwZmYsIDB4YTBiNiwgMHgwMDAyLCAweDAxODAsCisJMHhhMDg2LCAweDAwMjgsIDB4MTExOCwgMHg2ODRiLCAweDAwMWMsIDB4MDA2MCwgMHhkMWRjLCAweDAxMTgsCisJMHg2ODRiLCAweDAwMTUsIDB4MDAzOCwgMHhkMWQ0LCAweDAxMTgsIDB4Njg0YiwgMHgwMDA3LCAweDAwMTAsCisJMHg2ODRiLCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4OTgzNCwgMHgxMTEwLCAweDA4MGMsCisJMHg4MDc4LCAweDAwZGUsIDB4MDAwNSwgMHgyMDE5LCAweDAwMDEsIDB4MDgwYywgMHg3YTY0LCAweDYwMDMsCisJMHgwMDAyLCAweDIwMDEsIDB4YWZhNSwgMHgyMDA0LCAweDYwM2UsIDB4MDgwYywgMHg2YzA1LCAweDA4MGMsCisJMHg2ZDBkLCAweDAwMDUsIDB4MDgwYywgMHg2YzA1LCAweDA4MGMsIDB4MmFkOSwgMHgwMGQ2LCAweDYxMTAsCisJMHgyMTY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTUwLCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMjksCisJMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4OTc0MiwgMHgwMGRlLCAweDA4MGMsCisJMHg4MDc4LCAweDA4MGMsIDB4NmQwZCwgMHgwMDA1LCAweDY4NGIsIDB4MDAxNSwgMHhkMWZjLCAweDAxMzgsCisJMHg2ODRiLCAweDAwMDcsIDB4ODAwMiwgMHg4MDAwLCAweDgxMGEsIDB4YTE4OSwgMHgwMDAwLCAweDY5NjIsCisJMHg2ODVlLCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OGUyOCwgMHg4ZTI4LCAweDhlMjgsCisJMHg4ZTI4LCAweDhlMjgsIDB4OGUyYSwgMHg4ZTI4LCAweDhlZTMsIDB4OGVlZiwgMHg4ZTI4LCAweDhlMjgsCisJMHg4ZTI4LCAweDhlMjgsIDB4OGUyOCwgMHg4ZTI4LCAweDhlMjgsIDB4OGUyOCwgMHg4ZTI4LCAweDhlMjgsCisJMHgwODBjLCAweDE0ZjYsIDB4MDA3NiwgMHgwMGY2LCAweDAwZTYsIDB4MDBkNiwgMHgyMDcxLCAweGIyOGMsCisJMHg2MTEwLCAweDIxNzgsIDB4NzYxNCwgMHhhNmI0LCAweDBmZmYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHg1MDI5LCAweDAwZmUsIDB4MDE1MCwgMHhhNjg0LCAweDAwZmYsIDB4MTEzOCwgMHg2MDIwLCAweGQwZjQsCisJMHgwMTIwLCAweDA4MGMsIDB4OTg2NiwgMHgwODA0LCAweDhlZGUsIDB4N2U0NiwgMHg3ZjRjLCAweGM3ZTUsCisJMHg3ZjRlLCAweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyMTEsIDB4NmEzZSwgMHg4NmZmLCAweDA5MDQsCisJMHg4ZWQ0LCAweGE2OTQsIDB4ZmYwMCwgMHhhMjg0LCAweDBjMDAsIDB4MDEyMCwgMHg3MDE4LCAweDc4NjIsCisJMHg3MDFjLCAweDc4NWUsIDB4YTI4NCwgMHgwMzAwLCAweDA5MDQsIDB4OGVkMiwgMHhhNjg2LCAweDAxMDAsCisJMHgxMTQwLCAweDIwMDEsIDB4YjI5OSwgMHgyMDA0LCAweGEwMDUsIDB4MTExOCwgMHhjNmM0LCAweDdlNDYsCisJMHgwYzI4LCAweDA4MGMsIDB4MTVkOSwgMHgwOTBjLCAweDE0ZjYsIDB4MmQwMCwgMHg3ODRhLCAweDdmNGMsCisJMHhhN2JkLCAweDAyMDAsIDB4N2Y0ZSwgMHg2ODM3LCAweDAxMDMsIDB4NzgzOCwgMHg2ODNhLCAweDc4M2MsCisJMHg2ODNlLCAweDc4NDAsIDB4Njg0MiwgMHg2ZTQ2LCAweGE2OGMsIDB4MGMwMCwgMHgwMTIwLCAweDczMTgsCisJMHg2YjYyLCAweDczMWMsIDB4NmI1ZSwgMHhhNjhjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDAyLCAweDAxODAsCisJMHhhMTg2LCAweDAwMjgsIDB4MTExOCwgMHg2ODRiLCAweDAwMWMsIDB4MDA2MCwgMHhkNmRjLCAweDAxMTgsCisJMHg2ODRiLCAweDAwMTUsIDB4MDAzOCwgMHhkNmQ0LCAweDAxMTgsIDB4Njg0YiwgMHgwMDA3LCAweDAwMTAsCisJMHg2ODRiLCAweDAwMDAsIDB4NmY0ZSwgMHg3ODUwLCAweDY4NTIsIDB4Nzg1NCwgMHg2ODU2LCAweGEwMWUsCisJMHhkNmM0LCAweDAxOTgsIDB4NzMyOCwgMHg3MzJjLCAweDZiNTYsIDB4ODNmZiwgMHgwMTcwLCAweGEzOGEsCisJMHgwMDA5LCAweDAyMTAsIDB4MjAxOSwgMHgwMDA4LCAweDAwMzYsIDB4MjMwOCwgMHgyMDE5LCAweGIyOTgsCisJMHhhZDkwLCAweDAwMTksIDB4MDgwYywgMHg5MjdmLCAweDAwM2UsIDB4ZDZjYywgMHgwMWQ4LCAweDcxMjQsCisJMHg2OTVhLCAweDgxZmYsIDB4MDFiOCwgMHhhMTkyLCAweDAwMjEsIDB4MTI1MCwgMHgyMDcxLCAweGIyOTgsCisJMHg4MzFjLCAweDIzMDAsIDB4YWUxOCwgMHhhZDkwLCAweDAwMWQsIDB4MDgwYywgMHg5MjdmLCAweDAwNTAsCisJMHg3ODM4LCAweGQwZmMsIDB4MDEyMCwgMHgyMDA5LCAweDAwMjAsIDB4Njk1YSwgMHgwYzc4LCAweDJkNzgsCisJMHgwODBjLCAweDkyMjQsIDB4ZDZkYywgMHgxMTEwLCAweGEwMDYsIDB4MDAzMCwgMHgyMDAxLCAweDAwMDEsCisJMHgyMDcxLCAweGIyOGMsIDB4NzIxOCwgMHg3MzFjLCAweDA4MGMsIDB4MTg2ZiwgMHgwMGRlLCAweDAwZWUsCisJMHgwMGZlLCAweDAwN2UsIDB4MDAwNSwgMHgyMDAxLCAweGFmYTUsIDB4MjAwNCwgMHg2MDNlLCAweDIwZTEsCisJMHgwMDA1LCAweDNkMTgsIDB4M2UyMCwgMHgyYzEwLCAweDA4MGMsIDB4MTgyNCwgMHgwMDA1LCAweDIwMDEsCisJMHhhZmE1LCAweDIwMDQsIDB4NjAzZSwgMHgwMGQ2LCAweDYwMDMsIDB4MDAwMiwgMHg2MTEwLCAweDIxNjgsCisJMHg2OTRjLCAweGQxZTQsIDB4MDkwNCwgMHg4ZmYzLCAweDYwM2YsIDB4MDAwMCwgMHgwMGY2LCAweDJjNzgsCisJMHgwODBjLCAweDUwMjksIDB4MDBmZSwgMHgwNTQ4LCAweDY4MTQsIDB4NjkxMCwgMHhhMTE1LCAweDA1MjgsCisJMHg2YTYwLCAweGEyMDYsIDB4MTExOCwgMHg2ODVjLCAweGExMDYsIDB4MDFmOCwgMHg2ODRjLCAweGMwZTQsCisJMHg2ODRlLCAweDY4NDcsIDB4MDAwMCwgMHg2ODYzLCAweDAwMDAsIDB4Njg1ZiwgMHgwMDAwLCAweDY5N2MsCisJMHg2ODEwLCAweGExMDIsIDB4NjAzYSwgMHg2OTgwLCAweDY4MTQsIDB4YTEwMywgMHg2MDM2LCAweDYwMjAsCisJMHhjMGY1LCAweDYwMjIsIDB4MDBkNiwgMHg2MDE4LCAweDIwNjgsIDB4NjgzYywgMHg4MDAwLCAweDY4M2UsCisJMHgwMGRlLCAweDA4MGMsIDB4OTg2NiwgMHgwODA0LCAweDhmZjMsIDB4Njk0YywgMHhkMWNjLCAweDA5MDQsCisJMHg4ZmMzLCAweDY5NDgsIDB4NjgzOCwgMHhkMGZjLCAweDA5MDQsIDB4OGY4OCwgMHgwMDE2LCAweDY4NGMsCisJMHgwMDA2LCAweDY4NTAsIDB4MDAwNiwgMHgwMGY2LCAweDIxNzgsIDB4Nzk0NCwgMHhhMTg0LCAweDAwZmYsCisJMHhhMGI2LCAweDAwMDIsIDB4MDFlMCwgMHhhMDg2LCAweDAwMjgsIDB4MTEyOCwgMHg2ODRiLCAweDAwMWMsCisJMHg3ODRiLCAweDAwMWMsIDB4MDBlOCwgMHhkMWRjLCAweDAxNTgsIDB4Njg0YiwgMHgwMDE1LCAweDc4NGIsCisJMHgwMDE1LCAweDA4MGMsIDB4OTllZSwgMHgwMTE4LCAweDc5NDQsIDB4YzFkYywgMHg3OTQ2LCAweDAwODAsCisJMHhkMWQ0LCAweDAxMjgsIDB4Njg0YiwgMHgwMDA3LCAweDc4NGIsIDB4MDAwNywgMHgwMDQ4LCAweDY4NGMsCisJMHhkMGFjLCAweDAxMzAsIDB4NjgxMCwgMHg2OTE0LCAweGExMTUsIDB4MDExMCwgMHgwODBjLCAweDhlMDQsCisJMHg2ODQ4LCAweDc4NGEsIDB4Njg2MCwgMHg3ODYyLCAweDY4NWMsIDB4Nzg1ZSwgMHhhZDkwLCAweDAwMGQsCisJMHhhZjk4LCAweDAwMGQsIDB4MjAwOSwgMHgwMDIwLCAweDAxNTYsIDB4MjFhOCwgMHgyMzA0LCAweDIwMTIsCisJMHg4MzE4LCAweDgyMTAsIDB4MWYwNCwgMHg4Zjc2LCAweDAxNWUsIDB4MDBmZSwgMHgwMDBlLCAweDY4NTIsCisJMHgwMDBlLCAweDY4NGUsIDB4MDAxZSwgMHgyMTY4LCAweDA4MGMsIDB4MTYwMCwgMHgwODA0LCAweDhmZWUsCisJMHgwMDE2LCAweDAwZjYsIDB4MjE3OCwgMHg3OTQ0LCAweGExODQsIDB4MDBmZiwgMHhhMGI2LCAweDAwMDIsCisJMHgwMWUwLCAweGEwODYsIDB4MDAyOCwgMHgxMTI4LCAweDY4NGIsIDB4MDAxYywgMHg3ODRiLCAweDAwMWMsCisJMHgwMGU4LCAweGQxZGMsIDB4MDE1OCwgMHg2ODRiLCAweDAwMTUsIDB4Nzg0YiwgMHgwMDE1LCAweDA4MGMsCisJMHg5OWVlLCAweDAxMTgsIDB4Nzk0NCwgMHhjMWRjLCAweDc5NDYsIDB4MDA4MCwgMHhkMWQ0LCAweDAxMjgsCisJMHg2ODRiLCAweDAwMDcsIDB4Nzg0YiwgMHgwMDA3LCAweDAwNDgsIDB4Njg0YywgMHhkMGFjLCAweDAxMzAsCisJMHg2ODEwLCAweDY5MTQsIDB4YTExNSwgMHgwMTEwLCAweDA4MGMsIDB4OGUwNCwgMHg2ODYwLCAweDc4NjIsCisJMHg2ODVjLCAweDc4NWUsIDB4Njg0YywgMHg3ODRlLCAweDAwZmUsIDB4MDgwYywgMHgxNjAwLCAweDAwZGUsCisJMHgwODBjLCAweDkyNmYsIDB4MDQ1OCwgMHg2ODM3LCAweDAxMDMsIDB4Njk0NCwgMHhhMTg0LCAweDAwZmYsCisJMHhhMGI2LCAweDAwMDIsIDB4MDFiMCwgMHhhMDg2LCAweDAwMjgsIDB4MTExOCwgMHg2ODRiLCAweDAwMWMsCisJMHgwMGQ4LCAweGQxZGMsIDB4MDE0OCwgMHg2ODRiLCAweDAwMTUsIDB4MDgwYywgMHg5OWVlLCAweDAxMTgsCisJMHg2OTQ0LCAweGMxZGMsIDB4Njk0NiwgMHgwMDgwLCAweGQxZDQsIDB4MDExOCwgMHg2ODRiLCAweDAwMDcsCisJMHgwMDU4LCAweDY4NGIsIDB4MDAwMCwgMHg2ODRjLCAweGQwYWMsIDB4MDEzMCwgMHg2ODEwLCAweDY5MTQsCisJMHhhMTE1LCAweDAxMTAsIDB4MDgwYywgMHg4ZTA0LCAweDA4MGMsIDB4NTEwYywgMHgwODBjLCAweDk4MzQsCisJMHgxMTEwLCAweDA4MGMsIDB4ODA3OCwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg2YjczLCAweDAwMTAsCisJMHgwODBjLCAweDZjMDUsIDB4MDgwYywgMHg5NTk2LCAweDAxYzAsIDB4MDBkNiwgMHg2MTEwLCAweDIxNjgsCisJMHg2ODM3LCAweDAxMDMsIDB4MjAwOSwgMHhhZDBjLCAweDIxMGMsIDB4ZDE4YywgMHgxMWMwLCAweGQxODQsCisJMHgxMTk4LCAweDYxMDgsIDB4Njk0YSwgMHhhMThlLCAweDAwMjksIDB4MTExMCwgMHgwODBjLCAweGFiZmEsCisJMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLCAweDAwZGUsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsCisJMHg2YzUwLCAweDA4MGMsIDB4NmQwZCwgMHgwMDA1LCAweDY4NGIsIDB4MDAwNCwgMHgwYzg4LCAweDY4NGIsCisJMHgwMDA0LCAweDBjNzAsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4OTAzOCwgMHg5MDM4LCAweDkwMzgsCisJMHg5MDM4LCAweDkwMzgsIDB4OTAzYSwgMHg5MDM4LCAweDkwM2QsIDB4OTAzOCwgMHg5MDM4LCAweDkwMzgsCisJMHg5MDM4LCAweDkwMzgsIDB4OTAzOCwgMHg5MDM4LCAweDkwMzgsIDB4OTAzOCwgMHg5MDM4LCAweDkwMzgsCisJMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4MDAwNiwgMHgwMDI2LCAweGEwMTYsCisJMHgwODBjLCAweDE4MjQsIDB4MDAyZSwgMHgwMDBlLCAweDAwMDUsIDB4YTE4MiwgMHgwMDg1LCAweDAwMDIsCisJMHg5MDUxLCAweDkwNGYsIDB4OTA0ZiwgMHg5MDVkLCAweDkwNGYsIDB4OTA0ZiwgMHg5MDRmLCAweDA4MGMsCisJMHgxNGY2LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsIDB4NjdhOCwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NmM1MCwgMHgwMTJlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDU2LCAweDAwZDYsCisJMHgwMGU2LCAweDIwNzEsIDB4YjI4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwgMHgwODBjLCAweDk1ODYsCisJMHgwMWEwLCAweDIyNjgsIDB4NjgwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDE3OCwgMHg2MDE4LCAweDZkMTgsCisJMHhhNTJlLCAweDExNTgsIDB4MDBjNiwgMHgyZDYwLCAweDA4MGMsIDB4OTI4ZiwgMHgwMGNlLCAweDAxMjgsCisJMHg2ODAzLCAweDAwMDIsIDB4NjAwNywgMHgwMDg2LCAweDAwMTAsIDB4NjAwNywgMHgwMDg3LCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MDBmNiwgMHgyMjc4LCAweDA4MGMsCisJMHg1MDI5LCAweDAwZmUsIDB4MDE1MCwgMHg2ODIwLCAweGQwZWMsIDB4MDEzOCwgMHgwMGM2LCAweDIyNjAsCisJMHg2MDNmLCAweDAwMDAsIDB4MDgwYywgMHg5ODY2LCAweDAwY2UsIDB4MDBlZSwgMHgwMGRlLCAweDAwNWUsCisJMHgwMDJlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLCAweDExNjAsIDB4NjAwNCwgMHhhMDhhLCAweDAwODUsCisJMHgwYTBjLCAweDE0ZjYsIDB4YTA4YSwgMHgwMDhjLCAweDFhMGMsIDB4MTRmNiwgMHhhMDgyLCAweDAwODUsCisJMHgwMDcyLCAweGExODYsIDB4MDAyNywgMHgwMTIwLCAweGExODYsIDB4MDAxNCwgMHgxOTBjLCAweDE0ZjYsCisJMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDkwYmUsCisJMHg5MGMwLCAweDkwYzAsIDB4OTBiZSwgMHg5MGJlLCAweDkwYmUsIDB4OTBiZSwgMHgwODBjLCAweDE0ZjYsCisJMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweGExODYsCisJMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHhhMDgyLCAweDAwODUsIDB4MjAwOCwgMHgwNGE4LCAweGExODYsCisJMHgwMDI3LCAweDExZTgsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4MmFkOSwgMHgwMGQ2LCAweDYwMTAsCisJMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTUwLCAweDY4MzcsIDB4MDEwMywgMHg2ODQ3LCAweDAwMDAsCisJMHg2ODRiLCAweDAwMjksIDB4MDgwYywgMHg1MTBjLCAweDA4MGMsIDB4OTc0MiwgMHgwMGRlLCAweDA4MGMsCisJMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDA4MGMsIDB4ODBiZSwgMHgwY2UwLCAweGExODYsCisJMHgwMDE0LCAweDFkZDAsIDB4MDgwYywgMHg2YjczLCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsCisJMHg5NTk2LCAweDBkNjAsIDB4NjgzNywgMHgwMTAzLCAweDY4NDcsIDB4MDAwMCwgMHg2ODRiLCAweDAwMDYsCisJMHg2ODUwLCAweGMwZWMsIDB4Njg1MiwgMHgwOGYwLCAweDAwMDIsIDB4OTEwZSwgMHg5MTBjLCAweDkxMGMsCisJMHg5MTBjLCAweDkxMGMsIDB4OTEwYywgMHg5MTI2LCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMTE4LCAweGExODYsCisJMHgwMDM1LCAweDExMTgsIDB4MjAwMSwgMHhhZmEzLCAweDAwMTAsIDB4MjAwMSwgMHhhZmE0LCAweDIwMDQsCisJMHg2MDE2LCAweDYwMDMsIDB4MDAwYywgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLCAweDZiNzMsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMTE4LCAweGExODYsCisJMHgwMDM1LCAweDExMTgsIDB4MjAwMSwgMHhhZmEzLCAweDAwMTAsIDB4MjAwMSwgMHhhZmE0LCAweDIwMDQsCisJMHg2MDE2LCAweDYwMDMsIDB4MDAwZSwgMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHhhMTgyLCAweDAwOGMsCisJMHgxMjIwLCAweGExODIsIDB4MDA4NSwgMHgwMjA4LCAweDAwMWEsIDB4MDgwYywgMHg4MGJlLCAweDAwMDUsCisJMHg5MTRmLCAweDkxNGYsIDB4OTE0ZiwgMHg5MTRmLCAweDkxNTEsIDB4OTFhNCwgMHg5MTRmLCAweDA4MGMsCisJMHgxNGY2LCAweDAwZDYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsIDB4NTAyOSwgMHgwMGZlLCAweDAxNjgsCisJMHg2MDMwLCAweGEwOGMsIDB4ZmYwMCwgMHg4MTBmLCAweGExODYsIDB4MDAzOSwgMHgwMTE4LCAweGExODYsCisJMHgwMDM1LCAweDExMTgsIDB4MDBkZSwgMHgwODA0LCAweDkxYjcsIDB4MDgwYywgMHg5NzQyLCAweDA4MGMsCisJMHg5NTk2LCAweDAxYzgsIDB4NjAxMCwgMHgyMDY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODUwLCAweGQwYjQsCisJMHgwMTI4LCAweDY4NGIsIDB4MDAwNiwgMHhjMGVjLCAweDY4NTIsIDB4MDA0OCwgMHhkMGJjLCAweDAxMTgsCisJMHg2ODRiLCAweDAwMDIsIDB4MDAyMCwgMHg2ODRiLCAweDAwMDUsIDB4MDgwYywgMHg5ODAzLCAweDY4NDcsCisJMHgwMDAwLCAweDA4MGMsIDB4NTEwYywgMHgyYzY4LCAweDA4MGMsIDB4ODAyMiwgMHgwMWMwLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHg2MDBiLCAweGZmZmYsIDB4MjAwOSwgMHhiMjhlLCAweDIxMGMsCisJMHg2MTM2LCAweDIwMDksIDB4YjI4ZiwgMHgyMTBjLCAweDYxM2EsIDB4NjkxOCwgMHg2MTFhLCAweDA4MGMsCisJMHg5OTU2LCAweDY5NTAsIDB4NjE1MiwgMHg2MDFmLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LCAweDJkNjAsCisJMHgwODBjLCAweDgwNzgsIDB4MDBkZSwgMHgwMDA1LCAweDAwZjYsIDB4MmM3OCwgMHgwODBjLCAweDUwMjksCisJMHgwMGZlLCAweDA1OTgsIDB4NjAzMCwgMHhhMDhjLCAweGZmMDAsIDB4ODEwZiwgMHhhMTg2LCAweDAwMzUsCisJMHgwMTMwLCAweGExODYsIDB4MDAxZSwgMHgwMTE4LCAweGExODYsIDB4MDAzOSwgMHgxNTMwLCAweDAwZDYsCisJMHgyYzY4LCAweDA4MGMsIDB4OWEzNCwgMHgxOTA0LCAweDkxZmMsIDB4MDgwYywgMHg4MDIyLCAweDAxZDgsCisJMHg2MTA2LCAweDYwMDMsIDB4MDAwMSwgMHg2MDFmLCAweDAwMDEsIDB4NjkxOCwgMHg2MTFhLCAweDY5MjgsCisJMHg2MTJhLCAweDY5MmMsIDB4NjEyZSwgMHg2OTMwLCAweGExOGMsIDB4MDBmZiwgMHg2MTMyLCAweDY5MzQsCisJMHg2MTM2LCAweDY5MzgsIDB4NjEzYSwgMHg2OTUwLCAweDYxNTIsIDB4MDgwYywgMHg5OTU2LCAweDA4MGMsCisJMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgyZDYwLCAweDAwZjgsIDB4MDBkNiwgMHg2MDEwLCAweDIwNjgsCisJMHgwODBjLCAweDk1OTYsIDB4MDFjOCwgMHg2ODM3LCAweDAxMDMsIDB4Njg1MCwgMHhkMGI0LCAweDAxMjgsCisJMHhjMGVjLCAweDY4NTIsIDB4Njg0YiwgMHgwMDA2LCAweDAwNDgsIDB4ZDBiYywgMHgwMTE4LCAweDY4NGIsCisJMHgwMDAyLCAweDAwMjAsIDB4Njg0YiwgMHgwMDA1LCAweDA4MGMsIDB4OTgwMywgMHg2ODQ3LCAweDAwMDAsCisJMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg5NzQyLCAweDAwZGUsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsCisJMHgwMDE2LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDA4MGMsIDB4OTU5NiwgMHgwMTQwLCAweDY4MzcsCisJMHgwMTAzLCAweDY4NGIsIDB4MDAyOCwgMHg2ODQ3LCAweDAwMDAsIDB4MDgwYywgMHg1MTBjLCAweDAwZGUsCisJMHgwMDFlLCAweGExODYsIDB4MDAxMywgMHgwMTQ4LCAweGExODYsIDB4MDAxNCwgMHgwMTMwLCAweGExODYsCisJMHgwMDI3LCAweDAxMTgsIDB4MDgwYywgMHg4MGJlLCAweDAwMzAsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsCisJMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDAwNTYsIDB4MDA2NiwgMHgwMGQ2LCAweDAwZjYsCisJMHgyMDI5LCAweDAwMDEsIDB4YTE4MiwgMHgwMTAxLCAweDEyMDgsIDB4MDAxMCwgMHgyMDA5LCAweDAxMDAsCisJMHgyMTMwLCAweDIwNjksIDB4YjI5OCwgMHg4MzFjLCAweDIzMDAsIDB4YWQxOCwgMHgyMDA5LCAweDAwMjAsCisJMHhhZjkwLCAweDAwMWQsIDB4MDgwYywgMHg5MjdmLCAweGE2YjIsIDB4MDAyMCwgMHg3ODA0LCAweGEwNmQsCisJMHgwMTEwLCAweDA4MGMsIDB4MTYwMCwgMHgwODBjLCAweDE1ZDksIDB4MDUwMCwgMHg4NTI4LCAweDY4MzcsCisJMHgwMTEwLCAweDY4M2IsIDB4MDAwMCwgMHgyZDIwLCAweDdjMDYsIDB4YTY4YSwgMHgwMDNkLCAweDEyMjgsCisJMHgyNjA4LCAweGFkOTAsIDB4MDAwZiwgMHgwNDU5LCAweDAwODgsIDB4YTZiMiwgMHgwMDNjLCAweDIwMDksCisJMHgwMDNjLCAweDJkNzgsIDB4YWQ5MCwgMHgwMDBmLCAweDA0MTEsIDB4MGMyOCwgMHgwMGZlLCAweDg1MmYsCisJMHhhNWFkLCAweDAwMDMsIDB4N2QzNiwgMHhhNWFjLCAweDAwMDAsIDB4MDAyOCwgMHgwMGZlLCAweDg1MmYsCisJMHhhNWFkLCAweDAwMDMsIDB4N2QzNiwgMHgwMGRlLCAweDAwNmUsIDB4MDA1ZSwgMHgwMDA1LCAweDAwZjYsCisJMHg4ZGZmLCAweDAxNTgsIDB4NjgwNCwgMHhhMDdkLCAweDAxMzAsIDB4NjgwNywgMHgwMDAwLCAweDA4MGMsCisJMHg1MTBjLCAweDJmNjgsIDB4MGNiOCwgMHgwODBjLCAweDUxMGMsIDB4MDBmZSwgMHgwMDA1LCAweDAxNTYsCisJMHhhMTg0LCAweDAwMDEsIDB4MDEwOCwgMHg4MTA4LCAweDgxMGMsIDB4MjFhOCwgMHgyMzA0LCAweDgwMDcsCisJMHgyMDEyLCAweDgzMTgsIDB4ODIxMCwgMHgxZjA0LCAweDkyODYsIDB4MDE1ZSwgMHgwMDA1LCAweDAwNjYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDMxLCAweDAwMDEsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsCisJMHgwMDgzLCAweDAxMmUsIDB4MDA2ZSwgMHgwMDA1LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwNjYsCisJMHgyMDMxLCAweDAwMDAsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsIDB4MDAxYiwgMHgwMDZlLCAweDAxMmUsCisJMHgwMDA1LCAweDkyYzMsIDB4OTJjMywgMHg5MmJlLCAweDkyZTUsIDB4OTJiMSwgMHg5MmJlLCAweDkyZTUsCisJMHg5MmJlLCAweDA4MGMsIDB4MTRmNiwgMHgwMDM2LCAweDIwMTksIDB4MDAxMCwgMHgwODBjLCAweGE1NjYsCisJMHg2MDFmLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwgMHhhMDA2LCAweDAwMDUsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMGQ2LCAweDg2ZmYsIDB4MTFkOCwgMHg2MDEwLCAweDIwNjgsCisJMHgwODBjLCAweDk1OTYsIDB4MDFjMCwgMHg2ODM0LCAweGEwODYsIDB4MDEzOSwgMHgxMTI4LCAweDY4NGIsCisJMHgwMDA1LCAweDY4NTMsIDB4MDAwMCwgMHgwMDI4LCAweGEwMGUsIDB4MjAwMSwgMHgwMDA1LCAweDA4MGMsCisJMHg1MWRmLCAweDA4MGMsIDB4OTgwMywgMHgwODBjLCAweDUxMGMsIDB4MDgwYywgMHg4MDc4LCAweGEwODUsCisJMHgwMDAxLCAweDAwZGUsIDB4MDAwNSwgMHhhMDA2LCAweDBjZTAsIDB4NjAwMCwgMHhhMDhhLCAweDAwMTAsCisJMHgxYTBjLCAweDE0ZjYsIDB4MDAwYiwgMHgwMDA1LCAweDkyZmMsIDB4OTMxOSwgMHg5MmZlLCAweDkzMzgsCisJMHg5MzE2LCAweDkyZmMsIDB4OTJiZSwgMHg5MmMzLCAweDkyYzMsIDB4OTJiZSwgMHg5MmJlLCAweDkyYmUsCisJMHg5MmJlLCAweDkyYmUsIDB4OTJiZSwgMHg5MmJlLCAweDA4MGMsIDB4MTRmNiwgMHg4NmZmLCAweDExOTgsCisJMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDExMCwgMHgwODBjLCAweDk4MDMsCisJMHgwMGRlLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDA4MGMsCisJMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwODBjLCAweDE5MGIsCisJMHgwYzI4LCAweDAwZTYsIDB4MjA3MSwgMHhhZmM3LCAweDcwMjQsIDB4YWMwNiwgMHgxMTEwLCAweDA4MGMsCisJMHg3OWUxLCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweGEwODYsIDB4MDAwNiwgMHgxMTUwLCAweDAwODYsCisJMHgwMDk2LCAweDIwNDksIDB4MDAwMSwgMHgyYzQwLCAweDA4MGMsIDB4N2I5YSwgMHgwMDllLCAweDAwOGUsCisJMHgwMDEwLCAweDA4MGMsIDB4NzhkZSwgMHgwMGVlLCAweDE5NDgsIDB4MDgwYywgMHg5MmJlLCAweDAwMDUsCisJMHgwMDM2LCAweDAwZTYsIDB4MjA3MSwgMHhhZmM3LCAweDcwM2MsIDB4YWMwNiwgMHgxMTQwLCAweDIwMTksCisJMHgwMDAwLCAweDA4MGMsIDB4N2E2NCwgMHgwMGVlLCAweDAwM2UsIDB4MDgwNCwgMHg5MmZlLCAweDA4MGMsCisJMHg3Y2I4LCAweDAwZWUsIDB4MDAzZSwgMHgxOTA0LCAweDkyZmUsIDB4MDgwYywgMHg5MmJlLCAweDAwMDUsCisJMHgwMGM2LCAweDYwMWMsIDB4YTA4NCwgMHgwMDBmLCAweDAwMTMsIDB4MDBjZSwgMHgwMDA1LCAweDkzNjksCisJMHg5M2QzLCAweDk1MDEsIDB4OTM3NCwgMHg5NzRlLCAweDkzNjksIDB4YTU1OCwgMHg4MDc4LCAweDkzZDMsCisJMHg5MzYyLCAweDk1NWYsIDB4MDgwYywgMHgxNGY2LCAweDA4MGMsIDB4OTc4OSwgMHgxMTEwLCAweDA4MGMsCisJMHg4NWYzLCAweDAwMDUsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4NmM1MCwgMHgwODBjLCAweDgwNzgsCisJMHgwMDA1LCAweDYwMTcsIDB4MDAwMSwgMHgwMDA1LCAweDYwMTAsIDB4YTA4MCwgMHgwMDE5LCAweDJjMDIsCisJMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLCAweDE0ZjYsIDB4MDAwYiwgMHgwMDA1LCAweDkzOGYsCisJMHg5MzkxLCAweDkzYjEsIDB4OTNjMywgMHg5M2QwLCAweDkzOGYsIDB4OTM2OSwgMHg5MzY5LCAweDkzNjksCisJMHg5M2MzLCAweDkzYzMsIDB4OTM4ZiwgMHg5MzhmLCAweDkzOGYsIDB4OTM4ZiwgMHg5M2NkLCAweDA4MGMsCisJMHgxNGY2LCAweDAwZTYsIDB4NjAxMCwgMHgyMDcwLCAweDcwNTAsIDB4YzBiNSwgMHg3MDUyLCAweDIwNzEsCisJMHhhZmM3LCAweDcwMjQsIDB4YWMwNiwgMHgwMTkwLCAweDA4MGMsIDB4NzhkZSwgMHg2MDA3LCAweDAwODUsCisJMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDIwMDEsIDB4YWZhNCwgMHgyMDA0LCAweDYwMTYsCisJMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDAwZWUsIDB4MDAwNSwgMHg2MDE3LCAweDAwMDEsCisJMHgwY2Q4LCAweDAwZDYsIDB4NjAxMCwgMHgyMDY4LCAweDY4NTAsIDB4YzBiNSwgMHg2ODUyLCAweDAwZGUsCisJMHg2MDA3LCAweDAwODUsIDB4NjAwMywgMHgwMDBiLCAweDYwMWYsIDB4MDAwMiwgMHgwODBjLCAweDY3YTgsCisJMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwMGQ2LCAweDYwMTcsIDB4MDAwMSwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODUwLCAweGMwYjUsIDB4Njg1MiwgMHgwMGRlLCAweDAwMDUsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsCisJMHgwODBjLCAweDE5MGIsIDB4MDhmMCwgMHg2MDAwLCAweGEwOGEsIDB4MDAxMCwgMHgxYTBjLCAweDE0ZjYsCisJMHgwMDBiLCAweDAwMDUsIDB4OTNlYSwgMHg5MzcxLCAweDkzZWMsIDB4OTNlYSwgMHg5M2VjLCAweDkzZWMsCisJMHg5MzZhLCAweDkzZWEsIDB4OTM2NCwgMHg5MzY0LCAweDkzZWEsIDB4OTNlYSwgMHg5M2VhLCAweDkzZWEsCisJMHg5M2VhLCAweDkzZWEsIDB4MDgwYywgMHgxNGY2LCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDQsCisJMHhhMDg0LCAweDAwZmYsIDB4MDBkZSwgMHhhMDhhLCAweDAwMGMsIDB4MWEwYywgMHgxNGY2LCAweDAwMGIsCisJMHgwMDA1LCAweDk0MDUsIDB4OTRhNywgMHg5NDA3LCAweDk0NDEsIDB4OTQwNywgMHg5NDQxLCAweDk0MDcsCisJMHg5NDExLCAweDk0MDUsIDB4OTQ0MSwgMHg5NDA1LCAweDk0MmQsIDB4MDgwYywgMHgxNGY2LCAweDYwMDQsCisJMHhhMDhlLCAweDAwMTYsIDB4MDU4OCwgMHhhMDhlLCAweDAwMDQsIDB4MDU3MCwgMHhhMDhlLCAweDAwMDIsCisJMHgwNTU4LCAweDYwMDQsIDB4MDgwYywgMHg5Nzg5LCAweDA5MDQsIDB4OTRjMCwgMHhhMDhlLCAweDAwMjEsCisJMHgwOTA0LCAweDk0YzQsIDB4YTA4ZSwgMHgwMDIyLCAweDA5MDQsIDB4OTRjMCwgMHhhMDhlLCAweDAwM2QsCisJMHgwOTA0LCAweDk0YzQsIDB4YTA4ZSwgMHgwMDM5LCAweDA5MDQsIDB4OTRjOCwgMHhhMDhlLCAweDAwMzUsCisJMHgwOTA0LCAweDk0YzgsIDB4YTA4ZSwgMHgwMDFlLCAweDAxODgsIDB4YTA4ZSwgMHgwMDAxLCAweDExNTAsCisJMHgwMGQ2LCAweDYwMTgsIDB4MjA2OCwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHgwMGRlLCAweGEwODYsCisJMHgwMDA2LCAweDAxMTAsIDB4MDgwYywgMHgyYWQ5LCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDk3NGUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBkNiwgMHg2MTA0LCAweGExODYsIDB4MDAxNiwgMHgwOTA0LCAweDk0OTgsCisJMHhhMTg2LCAweDAwMDIsIDB4MTUxOCwgMHg2MDE4LCAweDIwNjgsIDB4MjAwMSwgMHhhZDM0LCAweDIwMDQsCisJMHhkMGFjLCAweDE5MDQsIDB4OTRlYSwgMHg2OGEwLCAweGQwYmMsIDB4MTkwNCwgMHg5NGVhLCAweDY4NDAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwMTkwLCAweDgwMDEsIDB4Njg0MiwgMHg2MDEzLCAweDAwMDAsCisJMHg2MDFmLCAweDAwMDcsIDB4NjAxNywgMHgwMzk4LCAweDYwM2YsIDB4MDAwMCwgMHgwODBjLCAweDgwMjIsCisJMHgwMTI4LCAweDJkMDAsIDB4NjAxYSwgMHg2MDFmLCAweDAwMDEsIDB4MDQ1MCwgMHgwMGRlLCAweDAwY2UsCisJMHg2MDA0LCAweGEwOGUsIDB4MDAwMiwgMHgxMWE4LCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg2LCAweDAwN2UsIDB4MTE3MCwgMHgyMDA5LCAweGFkMzQsIDB4MjEwNCwgMHhjMDg1LCAweDIwMGEsCisJMHgwMGU2LCAweDIwNzEsIDB4YWQwMCwgMHgwODBjLCAweDQ4ZjUsIDB4MDBlZSwgMHgwODBjLCAweDg1ZjMsCisJMHgwMDIwLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDJhZDksIDB4MDBlNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4MmFmZiwgMHgwMTJlLCAweDAwZWUsIDB4MDgwYywgMHg5NzRlLCAweDAwMDUsCisJMHgyMDAxLCAweDAwMDIsIDB4MDgwYywgMHg0YzMwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDIsCisJMHgwODBjLCAweDY3ZWUsIDB4MDgwYywgMHg2YzUwLCAweDAwZGUsIDB4MDBjZSwgMHgwYzgwLCAweDAwYzYsCisJMHgwMGQ2LCAweDYxMDQsIDB4YTE4NiwgMHgwMDE2LCAweDBkNTgsIDB4NjAxOCwgMHgyMDY4LCAweDY4NDAsCisJMHhhMDg0LCAweDAwZmYsIDB4YTAwNSwgMHgwOTA0LCAweDk0NmUsIDB4ODAwMSwgMHg2ODQyLCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwODBjLCAweDZjNTAsIDB4MDBkZSwgMHgwMGNlLCAweDA4YjgsCisJMHgwODBjLCAweDg1ZjMsIDB4MDgwNCwgMHg5NDNlLCAweDA4MGMsIDB4ODYyMSwgMHgwODA0LCAweDk0M2UsCisJMHgwMGQ2LCAweDJjNjgsIDB4NjEwNCwgMHgwODBjLCAweDlhMzQsIDB4MDBkZSwgMHgwMTE4LCAweDA4MGMsCisJMHg4MDc4LCAweDAwYjgsIDB4NjAwNCwgMHg4MDA3LCAweDYxMzAsIDB4YTE4YywgMHgwMGZmLCAweGExMDUsCisJMHg2MDMyLCAweDYwMDcsIDB4MDA4NSwgMHg2MDAzLCAweDAwMGIsIDB4NjAxZiwgMHgwMDAyLCAweDYwMzgsCisJMHg2MDBhLCAweDIwMDEsIDB4YWZhNCwgMHgyMDA0LCAweDYwMTYsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsCisJMHg2YzUwLCAweDAwMDUsIDB4MDBkZSwgMHgwMGNlLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDJhZDksCisJMHgwMGU2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4MmFmZiwgMHg2MDEzLCAweDAwMDAsCisJMHg2MDFmLCAweDAwMDcsIDB4NjAxNywgMHgwMzk4LCAweDYwM2YsIDB4MDAwMCwgMHgwMTJlLCAweDAwZWUsCisJMHgwMDA1LCAweDYwMDAsIDB4YTA4YSwgMHgwMDEwLCAweDFhMGMsIDB4MTRmNiwgMHgwMDBiLCAweDAwMDUsCisJMHg5NTE4LCAweDk1MTgsIDB4OTUxOCwgMHg5NTE4LCAweDk1MTgsIDB4OTUxOCwgMHg5NTE4LCAweDk1MTgsCisJMHg5NTE4LCAweDkzNjksIDB4OTUxOCwgMHg5MzcxLCAweDk1MWEsIDB4OTM3MSwgMHg5NTI3LCAweDk1MTgsCisJMHgwODBjLCAweDE0ZjYsIDB4NjAwNCwgMHhhMDg2LCAweDAwOGIsIDB4MDE0OCwgMHg2MDA3LCAweDAwOGIsCisJMHg2MDAzLCAweDAwMGQsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDA4MGMsCisJMHg5NzQyLCAweDA4MGMsIDB4OTU5NiwgMHgwNTgwLCAweDA4MGMsIDB4MmFkOSwgMHgwMGQ2LCAweDA4MGMsCisJMHg5NTk2LCAweDAxNjgsIDB4NjAxMCwgMHgyMDY4LCAweDY4MzcsIDB4MDEwMywgMHg2ODRiLCAweDAwMDYsCisJMHg2ODQ3LCAweDAwMDAsIDB4Njg1MCwgMHhjMGVkLCAweDY4NTIsIDB4MDgwYywgMHg1MTBjLCAweDJjNjgsCisJMHgwODBjLCAweDgwMjIsIDB4MDE1MCwgMHg2ODE4LCAweDYwMWEsIDB4MDgwYywgMHg5OTU2LCAweDAwYzYsCisJMHgyZDYwLCAweDA4MGMsIDB4OTc0ZSwgMHgwMGNlLCAweDAwMDgsIDB4MmQ2MCwgMHgwMGRlLCAweDYwMTMsCisJMHgwMDAwLCAweDYwMWYsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg2N2VlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDEwLCAweDA4MGMsIDB4OTc0ZSwgMHgwMDA1LCAweDYwMDAsCisJMHhhMDhhLCAweDAwMTAsIDB4MWEwYywgMHgxNGY2LCAweDAwMGIsIDB4MDAwNSwgMHg5NTc2LCAweDk1NzYsCisJMHg5NTc2LCAweDk1NzgsIDB4OTU3OSwgMHg5NTc2LCAweDk1NzYsIDB4OTU3NiwgMHg5NTc2LCAweDk1NzYsCisJMHg5NTc2LCAweDk1NzYsIDB4OTU3NiwgMHg5NTc2LCAweDk1NzYsIDB4OTU3NiwgMHgwODBjLCAweDE0ZjYsCisJMHgwMDA1LCAweDA4MGMsIDB4N2NiOCwgMHgxOTBjLCAweDE0ZjYsIDB4NjExMCwgMHgyMTY4LCAweDY4NGIsCisJMHgwMDA2LCAweDA4MGMsIDB4NTEwYywgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHhhMjg0LCAweDAwMDcsCisJMHgxMTU4LCAweGEyODIsIDB4YjQwMCwgMHgwMjQwLCAweDIwMDEsIDB4YWQxNiwgMHgyMDA0LCAweGEyMDIsCisJMHgxMjE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA1LCAweGEwMDYsIDB4MGNlOCwgMHgwMDI2LCAweDYyMTAsCisJMHhhMjk0LCAweGYwMDAsIDB4MDAyZSwgMHgwMDA1LCAweDAwZTYsIDB4MDBjNiwgMHgwMDM2LCAweDAwMDYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDYxLCAweGI0MDAsIDB4MjA3MSwgMHhhZDAwLCAweDczNDQsCisJMHg3MDY0LCAweGEzMDIsIDB4MTJhOCwgMHg2MDFjLCAweGEyMDYsIDB4MTE2MCwgMHgwODBjLCAweDk4ZTMsCisJMHgwMTQ4LCAweDA4MGMsIDB4OTc4OSwgMHgxMTEwLCAweDA4MGMsIDB4ODVmMywgMHgwMGM2LCAweDA4MGMsCisJMHg4MDc4LCAweDAwY2UsIDB4YWNlMCwgMHgwMDE4LCAweDcwNTgsIDB4YWMwMiwgMHgxMjA4LCAweDBjMzgsCisJMHgwMTJlLCAweDAwMGUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZWUsIDB4MDAwNSwgMHgwMGU2LCAweDAwYzYsCisJMHgwMDE2LCAweGExODgsIDB4YWUzNCwgMHgyMTBjLCAweDgxZmYsIDB4MDE3MCwgMHgyMDYxLCAweGI0MDAsCisJMHgyMDcxLCAweGFkMDAsIDB4MDAxNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTM4LCAweDYxMWEsCisJMHgwODBjLCAweDJhZDksIDB4MDgwYywgMHg4MDc4LCAweGEwMDYsIDB4MDAxMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDFlLCAweDAwY2UsIDB4MDBlZSwgMHgwMDA1LCAweDAwYzYsIDB4MDA1NiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDAwNWUsIDB4MDE4MCwgMHg2NjEyLCAweDY1MWEsCisJMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDAzLCAweDIwMDksIDB4MDA0YiwgMHgwODBjLCAweDgwYTcsCisJMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMDVlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDA2LCAweDBjZDAsCisJMHgwMGM2LCAweDAwNTYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4NjJhMCwgMHgwMGM2LCAweDA4MGMsCisJMHg4MDIyLCAweDAwNWUsIDB4MDUwOCwgMHg2MDEzLCAweDAwMDAsIDB4NjUxYSwgMHgwODBjLCAweDk5NTYsCisJMHg2MDFmLCAweDAwMDMsIDB4MDBjNiwgMHgyNTYwLCAweDA4MGMsIDB4NGVjZiwgMHgwMGNlLCAweDA4MGMsCisJMHg2OGU3LCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4NjgxZCwgMHgyYzA4LCAweDA4MGMsCisJMHhhNzEyLCAweDAwN2UsIDB4MjAwOSwgMHgwMDRjLCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LCAweDAwMDEsCisJMHgwMTJlLCAweDAwNWUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsIDB4MGNkMCwgMHgwMGY2LCAweDAwYzYsCisJMHgwMDQ2LCAweDAwYzYsIDB4MDgwYywgMHg4MDIyLCAweDJjNzgsIDB4MDBjZSwgMHgwMTgwLCAweDdlMTIsCisJMHgyYzAwLCAweDc4MWEsIDB4NzgxZiwgMHgwMDAzLCAweDIwMjEsIDB4MDAwNSwgMHgwODBjLCAweDk2ODMsCisJMHgyZjYwLCAweDIwMDksIDB4MDA0ZCwgMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAwNGUsCisJMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsIDB4MDA0NiwgMHgwMGM2LCAweDA4MGMsCisJMHg4MDIyLCAweDJjNzgsIDB4MDBjZSwgMHgwMTc4LCAweDdlMTIsIDB4MmMwMCwgMHg3ODFhLCAweDc4MWYsCisJMHgwMDAzLCAweDIwMjEsIDB4MDAwNSwgMHgwNDM5LCAweDJmNjAsIDB4MjAwOSwgMHgwMDRlLCAweDA4MGMsCisJMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMDRlLCAweDAwY2UsIDB4MDBmZSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGM2LCAweDAwNDYsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MmM3OCwgMHgwMGNlLCAweDAxNzgsCisJMHg3ZTEyLCAweDJjMDAsIDB4NzgxYSwgMHg3ODFmLCAweDAwMDMsIDB4MjAyMSwgMHgwMDA0LCAweDAwNTksCisJMHgyZjYwLCAweDIwMDksIDB4MDA1MiwgMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAwNGUsCisJMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMDk2LCAweDAwNzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDRlNzEsIDB4MDExOCwgMHgyMDAxLCAweDk2ODgsIDB4MDAyOCwgMHgwODBjLCAweDRlNDMsCisJMHgwMTU4LCAweDIwMDEsIDB4OTY4ZSwgMHgwMDA2LCAweGEwMGUsIDB4MjQwMCwgMHgwODBjLCAweDUxZGYsCisJMHgwODBjLCAweDUxMGMsIDB4MDAwZSwgMHgwODA3LCAweDI0MTgsIDB4MDgwYywgMHg2YjE1LCAweDYyYTAsCisJMHgwMDg2LCAweDIwNDEsIDB4MDAwMSwgMHgyMDM5LCAweDAwMDEsIDB4MjYwOCwgMHgwODBjLCAweDY5MDAsCisJMHgwMDhlLCAweDA4MGMsIDB4NjgxZCwgMHgyZjA4LCAweDI2NDgsIDB4MDgwYywgMHhhNzEyLCAweDYxM2MsCisJMHg4MWZmLCAweDA5MGMsIDB4NjlhOSwgMHgwMTJlLCAweDAwN2UsIDB4MDA5ZSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLCAweDAxODgsCisJMHg2NjBhLCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsCisJMHgyMDA5LCAweDAwMWYsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsCisJMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTg4LCAweDY2MGEsIDB4NjExYSwgMHgwODBjLCAweDk5NTYsCisJMHg2MDFmLCAweDAwMDgsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksIDB4MDAyMSwgMHgwODBjLCAweDgwYTcsCisJMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsIDB4YTAwNiwgMHgwY2Q4LCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLCAweDAxODgsCisJMHg2NjBhLCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LCAweDYwMWYsIDB4MDAwMSwgMHgyZDAwLCAweDYwMTIsCisJMHgyMDA5LCAweDAwM2QsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsIDB4MDAwMSwgMHgwMTJlLCAweDAwY2UsCisJMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDAwYzYsCisJMHgwODBjLCAweDk4MDcsIDB4MDAxZSwgMHgwMTgwLCAweDYxMWEsIDB4MDgwYywgMHg5OTU2LCAweDYwMWYsCisJMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMDAsIDB4MDgwYywgMHg4MGE3LCAweGEwODUsCisJMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsIDB4MGNkOCwgMHgwMGM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTg4LCAweDY2MGEsCisJMHg2MTFhLCAweDA4MGMsIDB4OTk1NiwgMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDIwMDksCisJMHgwMDQ0LCAweDA4MGMsIDB4ODBhNywgMHhhMDg1LCAweDAwMDEsIDB4MDEyZSwgMHgwMGNlLCAweDAwMDUsCisJMHhhMDA2LCAweDBjZDgsIDB4MDAyNiwgMHgwMGQ2LCAweDYyMTgsIDB4MjI2OCwgMHg2YTNjLCAweDgyZmYsCisJMHgwMTEwLCAweDgyMTEsIDB4NmEzZSwgMHgwMGRlLCAweDAwMmUsIDB4MDAwNSwgMHgwMDA2LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDE5MCwgMHg2MDEzLCAweDAwMDAsIDB4NjAxZiwgMHgwMDA3LCAweDIwMDEsCisJMHhhZmEzLCAweDIwMDQsIDB4MDAwNiwgMHhhMDgyLCAweDAwNTEsIDB4MDAwZSwgMHgwMjA4LCAweDgwMDQsCisJMHg2MDE2LCAweDA4MGMsIDB4YWJiNCwgMHg2MDNmLCAweDAwMDAsIDB4MDAwZSwgMHgwMDA1LCAweDAwNjYsCisJMHgwMGM2LCAweDAwZDYsIDB4MjAzMSwgMHhhZDUyLCAweDI2MzQsIDB4ZDZlNCwgMHgwMTI4LCAweDY2MTgsCisJMHgyNjYwLCAweDZlNDgsIDB4MDgwYywgMHg0ZGZjLCAweDAwZGUsIDB4MDBjZSwgMHgwMDZlLCAweDAwMDUsCisJMHgwMDA2LCAweDAwMTYsIDB4NjAwNCwgMHhhMDhlLCAweDAwMDIsIDB4MDE0MCwgMHhhMDhlLCAweDAwMDMsCisJMHgwMTI4LCAweGEwOGUsIDB4MDAwNCwgMHgwMTEwLCAweGEwODUsIDB4MDAwMSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMDA1LCAweDAwMDYsIDB4MDBkNiwgMHg2MDEwLCAweGEwNmQsIDB4MDE0OCwgMHg2ODM0LCAweGEwODYsCisJMHgwMTM5LCAweDAxMzgsIDB4NjgzOCwgMHhkMGZjLCAweDAxMTAsIDB4YTAwNiwgMHgwMDEwLCAweGEwODUsCisJMHgwMDAxLCAweDAwZGUsIDB4MDAwZSwgMHgwMDA1LCAweDAwYzYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLCAweDAxOTAsIDB4NjExYSwgMHgwODBjLCAweDk5NTYsCisJMHg2MDFmLCAweDAwMDEsIDB4MmQwMCwgMHg2MDEyLCAweDA4MGMsIDB4MmFkOSwgMHgyMDA5LCAweDAwMjgsCisJMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsCisJMHgwY2Q4LCAweGExODYsIDB4MDAxNSwgMHgxMTc4LCAweDIwMTEsIDB4YWQyMCwgMHgyMjA0LCAweGEwODYsCisJMHgwMDc0LCAweDExNDgsIDB4MDgwYywgMHg4OTQzLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMjksCisJMHgwODBjLCAweDY3ZWUsIDB4MDAyMCwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsCisJMHhhMTg2LCAweDAwMTYsIDB4MTEyOCwgMHgyMDAxLCAweDAwMDQsIDB4MDgwYywgMHg0YzMwLCAweDAwZTgsCisJMHhhMTg2LCAweDAwMTUsIDB4MTFlOCwgMHgyMDExLCAweGFkMjAsIDB4MjIwNCwgMHhhMDg2LCAweDAwMTQsCisJMHgxMWI4LCAweDAwZDYsIDB4NjAxOCwgMHgyMDY4LCAweDA4MGMsIDB4NGQ3MiwgMHgwMGRlLCAweDA4MGMsCisJMHg4OWY3LCAweDExNzAsIDB4MDBkNiwgMHg2MDE4LCAweDIwNjgsIDB4Njg5MCwgMHgwMGRlLCAweGEwMDUsCisJMHgwMTM4LCAweDIwMDEsIDB4MDAwNiwgMHgwODBjLCAweDRjMzAsIDB4MDgwYywgMHg4MWY2LCAweDAwMjAsCisJMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg4MDc4LCAweDAwMDUsIDB4Njg0OCwgMHhhMDg2LCAweDAwMDUsCisJMHgxMTA4LCAweDAwMDksIDB4MDAwNSwgMHg2ODUwLCAweGMwYWQsIDB4Njg1MiwgMHgwMDA1LCAweDAwZTYsCisJMHgwMTI2LCAweDIwNzEsIDB4YWQwMCwgMHgyMDkxLCAweDgwMDAsIDB4NzU0NCwgMHhhNTgyLCAweDAwMDEsCisJMHgwNjA4LCAweDcwNDgsIDB4MjA2MCwgMHg2MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMTQ4LCAweGFjZTAsCisJMHgwMDE4LCAweDcwNTgsIDB4YWMwMiwgMHgxMjA4LCAweDBjYjAsIDB4MjA2MSwgMHhiNDAwLCAweDBjOTgsCisJMHg2MDAzLCAweDAwMDgsIDB4ODUyOSwgMHg3NTQ2LCAweGFjYTgsIDB4MDAxOCwgMHg3MDU4LCAweGE1MDIsCisJMHgxMjMwLCAweDc1NGEsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBlZSwgMHgwMDA1LCAweDcwNGIsCisJMHhiNDAwLCAweDBjYzAsIDB4YTAwNiwgMHgwY2MwLCAweDAwZTYsIDB4MjA3MSwgMHhiMjhjLCAweDcwMTQsCisJMHhkMGU0LCAweDAxNTAsIDB4NjAxMywgMHgwMDAwLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNTAsCisJMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDAwZWUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4NTAyOSwgMHgwMGZlLCAweDAxMjAsIDB4NjAxYywgMHhhMDg0LCAweDAwMGYsCisJMHgwMDEzLCAweDAwY2UsIDB4MDAwNSwgMHg5MzY5LCAweDk4NWUsIDB4OTg2MSwgMHg5ODY0LCAweGE5YTcsCisJMHhhOWMyLCAweGE5YzUsIDB4OTM2OSwgMHg5MzY5LCAweDA4MGMsIDB4MTRmNiwgMHhlMDAwLCAweGUwMDAsCisJMHgwMDA1LCAweGUwMDAsIDB4ZTAwMCwgMHgwMDA1LCAweDAwMDksIDB4MDAwNSwgMHgwMGY2LCAweDJjNzgsCisJMHgwODBjLCAweDUwMjksIDB4MDUzOCwgMHgwODBjLCAweDgwMjIsIDB4MTEyOCwgMHgyMDAxLCAweGFmYTUsCisJMHgyMDA0LCAweDc4M2UsIDB4MDBmOCwgMHg3ODE4LCAweDYwMWEsIDB4MDgwYywgMHg5OTU2LCAweDc4MWMsCisJMHhhMDg2LCAweDAwMDMsIDB4MDEyOCwgMHg3ODA4LCAweDYwMzYsIDB4MmYwMCwgMHg2MDNhLCAweDAwMjAsCisJMHg3ODA4LCAweDYwM2EsIDB4MmYwMCwgMHg2MDM2LCAweDYwMmEsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDcsCisJMHgwMDM1LCAweDYwMDMsIDB4MDAwMSwgMHg3OTUwLCAweDYxNTIsIDB4MDgwYywgMHg2N2E4LCAweDA4MGMsCisJMHg2YzUwLCAweDJmNjAsIDB4MDBmZSwgMHgwMDA1LCAweDAwMTYsIDB4MDBmNiwgMHg2ODJjLCAweDYwMzIsCisJMHhhMDhlLCAweDAwMDEsIDB4MDEzOCwgMHhhMDg2LCAweDAwMDUsIDB4MDE0MCwgMHhhMDA2LCAweDYwMmEsCisJMHg2MDJlLCAweDAwYTAsIDB4NjgyMCwgMHhjMGY0LCAweGMwZDUsIDB4NjgyMiwgMHg2ODEwLCAweDIwNzgsCisJMHg3ODdjLCAweDY5MzgsIDB4YTEwMiwgMHg3ODgwLCAweDY5MzQsIDB4YTEwMywgMHgxZTc4LCAweDY4MzQsCisJMHg2MDJhLCAweDY4MzgsIDB4YTA4NCwgMHhmZmZjLCAweDY4M2EsIDB4NjAyZSwgMHgyZDAwLCAweDYwMzYsCisJMHg2ODA4LCAweDYwM2EsIDB4NjkxOCwgMHg2MTFhLCAweDY5NTAsIDB4NjE1MiwgMHg2MDFmLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMzksIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHg2ODAzLCAweDAwMDIsCisJMHgwMGZlLCAweDAwMWUsIDB4MDAwNSwgMHgwMGY2LCAweDJjNzgsIDB4MDgwYywgMHg1MDI5LCAweDExMTgsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3MCwgMHg2MDIwLCAweGQwZjQsIDB4MTE1MCwgMHhjMGY1LCAweDYwMjIsCisJMHg2MDEwLCAweDIwNzgsIDB4NzgyOCwgMHg2MDNhLCAweDc4MmMsIDB4NjAzNiwgMHgwODBjLCAweDE5MGIsCisJMHhhMDA2LCAweDAwZmUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4NjAwNCwgMHhhMDhlLCAweDAwMzQsCisJMHgwMWI4LCAweGEwOGUsIDB4MDAzNSwgMHgwMWEwLCAweGEwOGUsIDB4MDAzNiwgMHgwMTg4LCAweGEwOGUsCisJMHgwMDM3LCAweDAxNzAsIDB4YTA4ZSwgMHgwMDM4LCAweDAxNTgsIDB4YTA4ZSwgMHgwMDM5LCAweDAxNDAsCisJMHhhMDhlLCAweDAwM2EsIDB4MDEyOCwgMHhhMDhlLCAweDAwM2IsIDB4MDExMCwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDFlLCAweDAwMGUsIDB4MDAwNSwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwMDM2LCAweDAwZTYsCisJMHgyMDAxLCAweGFmOWYsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4MjAwMSwgMHgwMDMyLCAweDA4MGMsCisJMHg2NjY1LCAweDIwMDEsIDB4YWZhMywgMHg4MmZmLCAweDExMTAsIDB4MjAxMSwgMHgwMDAyLCAweDIyMDIsCisJMHgyMDAxLCAweGFmYTEsIDB4MjAwYywgMHg4MDAwLCAweDIwMTQsIDB4MjA3MSwgMHhhZjhkLCAweDcxMWEsCisJMHg3MjFlLCAweDIwMDEsIDB4MDA2NCwgMHgwODBjLCAweDY2NjUsIDB4MjAwMSwgMHhhZmE0LCAweDgyZmYsCisJMHgxMTEwLCAweDIwMTEsIDB4MDAwMiwgMHgyMjAyLCAweDIwMDksIDB4YWZhNSwgMHhhMjgwLCAweDAwMGEsCisJMHgyMDBhLCAweDAwZWUsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMDA1LCAweDAwMDYsCisJMHgwMGU2LCAweDIwMDEsIDB4YWZhMywgMHgyMDAzLCAweDAwMjgsIDB4MjAwMSwgMHhhZmE0LCAweDIwMDMsCisJMHgwMDE0LCAweDIwNzEsIDB4YWY4ZCwgMHg3MDFiLCAweDAwMDAsIDB4NzAxZiwgMHgwN2QwLCAweDIwMDEsCisJMHhhZmE1LCAweDIwMDMsIDB4MDAxZSwgMHgwMGVlLCAweDAwMGUsIDB4MDAwNSwgMHgwMGQ2LCAweDYwNTQsCisJMHhhMDZkLCAweDAxMTAsIDB4MDgwYywgMHgxNWYwLCAweDAwZGUsIDB4MDAwNSwgMHgwMDA1LCAweDAwYzYsCisJMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMGM2LCAweDA4MGMsIDB4ODAyMiwgMHgwMDFlLCAweDAxNzgsCisJMHg2MTFhLCAweDBjYTEsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwMzMsCisJMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsCisJMHgwY2Q4LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YWQwMCwgMHhhMTg2LCAweDAwMTUsCisJMHgxNTAwLCAweDcwODAsIDB4YTA4NiwgMHgwMDE4LCAweDExZTAsIDB4NjAxMCwgMHgyMDY4LCAweDZhM2MsCisJMHhkMmU0LCAweDExNjAsIDB4MmM3OCwgMHgwODBjLCAweDZlMDUsIDB4MDFkOCwgMHg3MDZjLCAweDZhNTAsCisJMHhhMjA2LCAweDExNjAsIDB4NzA3MCwgMHg2YTU0LCAweGEyMDYsIDB4MTE0MCwgMHg2MjE4LCAweGEyOTAsCisJMHgwMDI4LCAweDIyMTQsIDB4MjAwOSwgMHgwMDAwLCAweDA4MGMsIDB4MmIxZSwgMHgwODBjLCAweDgxZjYsCisJMHgwMDIwLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDgwNzgsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMDA1LCAweDcwNTAsIDB4NmE1NCwgMHhhMjA2LCAweDBkNDgsIDB4MGM4MCwgMHgwMGM2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDBjNiwgMHgwODBjLCAweDgwMjIsIDB4MDAxZSwgMHgwMTgwLCAweDYxMWEsCisJMHgwODBjLCAweDk5NTYsIDB4NjAxZiwgMHgwMDAxLCAweDJkMDAsIDB4NjAxMiwgMHgyMDA5LCAweDAwNDMsCisJMHgwODBjLCAweDgwYTcsIDB4YTA4NSwgMHgwMDAxLCAweDAxMmUsIDB4MDBjZSwgMHgwMDA1LCAweGEwMDYsCisJMHgwY2Q4LCAweDAwZDYsIDB4MDBlNiwgMHgwMGY2LCAweDIwNzEsIDB4YWQwMCwgMHhhMTg2LCAweDAwMTUsCisJMHgxMWMwLCAweDcwODAsIDB4YTA4NiwgMHgwMDA0LCAweDExYTAsIDB4NjAxMCwgMHhhMGU4LCAweDAwMGYsCisJMHgyYzc4LCAweDA4MGMsIDB4NmUwNSwgMHgwMWE4LCAweDcwNmMsIDB4NmEwOCwgMHhhMjA2LCAweDExMzAsCisJMHg3MDcwLCAweDZhMGMsIDB4YTIwNiwgMHgxMTEwLCAweDA4MGMsIDB4MmFkOSwgMHgwODBjLCAweDgxZjYsCisJMHgwMDIwLCAweDA4MGMsIDB4ODVmMywgMHgwODBjLCAweDgwNzgsIDB4MDBmZSwgMHgwMGVlLCAweDAwZGUsCisJMHgwMDA1LCAweDcwNTAsIDB4NmEwYywgMHhhMjA2LCAweDBkNzgsIDB4MGM4MCwgMHgwMDE2LCAweDAwMjYsCisJMHg2ODRjLCAweGQwYWMsIDB4MDE3OCwgMHg2OTE0LCAweDZhMTAsIDB4MjEwMCwgMHhhMjA1LCAweDAxNTAsCisJMHg2ODYwLCAweGExMDYsIDB4MTExOCwgMHg2ODVjLCAweGEyMDYsIDB4MDEyMCwgMHg2OTYyLCAweDZhNWUsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsIDB4MDBkNiwgMHgwMDM2LCAweDYzMTAsCisJMHgyMzY4LCAweDY4NGEsIDB4Njk1MiwgMHhhMjllLCAweDQwMDAsIDB4MTE4OCwgMHgwMGM2LCAweDYzMTgsCisJMHgyMzYwLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDRmNmUsIDB4MTEwOCwgMHhjMTg1LCAweDYwMDAsCisJMHhkMGJjLCAweDAxMDgsIDB4YzE4ZCwgMHg2YTY2LCAweDY5NmEsIDB4MDBjZSwgMHgwMDgwLCAweDZhNjYsCisJMHgzOTE4LCAweGEzOTgsIDB4MDAwNiwgMHgyMzFjLCAweDY4NmIsIDB4MDAwNCwgMHg2YjcyLCAweDAwYzYsCisJMHg2MzE4LCAweDIzNjAsIDB4NjAwNCwgMHhhMDg0LCAweDAwZmYsIDB4Njg2ZSwgMHgwMGNlLCAweDA4MGMsCisJMHg1MTBjLCAweDAwM2UsIDB4MDBkZSwgMHgwMDA1LCAweDAwYzYsIDB4MDAyNiwgMHgwMDE2LCAweGExODYsCisJMHgwMDM1LCAweDAxMTAsIDB4NmEzNCwgMHgwMDA4LCAweDZhMjgsIDB4MDgwYywgMHg5NTg2LCAweDAxZjAsCisJMHgyMjYwLCAweDYxMWMsIDB4YTE4NiwgMHgwMDAzLCAweDAxMTgsIDB4YTE4NiwgMHgwMDA2LCAweDExOTAsCisJMHg2ODM0LCAweGEyMDYsIDB4MDE0MCwgMHg2ODM4LCAweGEyMDYsIDB4MTE2MCwgMHg2MTA4LCAweDY4MzQsCisJMHhhMTA2LCAweDExNDAsIDB4MDAyMCwgMHg2MDA4LCAweDY5MzgsIDB4YTEwNiwgMHgxMTE4LCAweDYwMTgsCisJMHg2OTE4LCAweGExMDYsIDB4MDAxZSwgMHgwMDJlLCAweDAwY2UsIDB4MDAwNSwgMHhhMDg1LCAweDAwMDEsCisJMHgwY2M4LCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsIDB4MWEwYywgMHgxNGY2LCAweDAwMTMsCisJMHgwMDZlLCAweDAwMDUsIDB4OWE3YSwgMHg5ZWZmLCAweGEwMjcsIDB4OWE3YSwgMHg5YTdhLCAweDlhN2EsCisJMHg5YTdhLCAweDlhN2EsIDB4OWFiMiwgMHhhMGEzLCAweDlhN2EsIDB4OWE3YSwgMHg5YTdhLCAweDlhN2EsCisJMHg5YTdhLCAweDlhN2EsIDB4MDgwYywgMHgxNGY2LCAweDAwNjYsIDB4NjAwMCwgMHhhMGIyLCAweDAwMTAsCisJMHgxYTBjLCAweDE0ZjYsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsIDB4OWE5NSwgMHhhNGZkLCAweDlhOTUsCisJMHg5YTk1LCAweDlhOTUsIDB4OWE5NSwgMHg5YTk1LCAweDlhOTUsIDB4YTRjMSwgMHhhNTQ1LCAweDlhOTUsCisJMHhhYWVhLCAweGFiMWEsIDB4YWFlYSwgMHhhYjFhLCAweDlhOTUsIDB4MDgwYywgMHgxNGY2LCAweDAwNjYsCisJMHg2MDAwLCAweGEwYjIsIDB4MDAxMCwgMHgxYTBjLCAweDE0ZjYsIDB4MDAxMywgMHgwMDZlLCAweDAwMDUsCisJMHg5YWIwLCAweGExZDgsIDB4YTI5NSwgMHhhMmMyLCAweGEzNDYsIDB4OWFiMCwgMHhhNDMzLCAweGEzZGUsCisJMHhhMGFmLCAweGE0OTcsIDB4YTRhYywgMHg5YWIwLCAweDlhYjAsIDB4OWFiMCwgMHg5YWIwLCAweDlhYjAsCisJMHgwODBjLCAweDE0ZjYsIDB4YTFiMiwgMHgwMDgwLCAweDFhMGMsIDB4MTRmNiwgMHgyMTAwLCAweGExYjIsCisJMHgwMDQwLCAweDFhMDQsIDB4OWU3OSwgMHgwMDAyLCAweDlhZmMsIDB4OWNhYiwgMHg5YWZjLCAweDlhZmMsCisJMHg5YWZjLCAweDljYjIsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsCisJMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsCisJMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5YWZlLCAweDliNWEsIDB4OWI2NSwgMHg5YmE2LCAweDliYzAsCisJMHg5YzNlLCAweDljOWMsIDB4OWFmYywgMHg5YWZjLCAweDljYjUsIDB4OWFmYywgMHg5YWZjLCAweDljYzQsCisJMHg5Y2NiLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5ZDQyLCAweDlhZmMsCisJMHg5YWZjLCAweDlkNGQsIDB4OWFmYywgMHg5YWZjLCAweDlkMTgsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsCisJMHg5ZDYxLCAweDlhZmMsIDB4OWFmYywgMHg5YWZjLCAweDlkZDUsIDB4OWFmYywgMHg5YWZjLCAweDlhZmMsCisJMHg5YWZjLCAweDlhZmMsIDB4OWFmYywgMHg5ZTQwLCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDUwMmQsCisJMHgxMTQwLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGEwODQsIDB4MDAwOSwgMHhhMDg2LCAweDAwMDgsCisJMHgxMTQwLCAweDYwMDcsIDB4MDAwOSwgMHg2MDJiLCAweDAwMDksIDB4NjAxMywgMHgwMDAwLCAweDA4MDQsCisJMHg5Y2E2LCAweDA4MGMsIDB4NTAxZCwgMHgwMGU2LCAweDAwYzYsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsCisJMHg2MjE4LCAweDIyNzAsIDB4NzJhMCwgMHgwMDI2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDY4ZTcsCisJMHgwMDc2LCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDY4MWQsIDB4MmMwOCwgMHgwODBjLCAweGE3MTIsCisJMHgwMDdlLCAweDAwMWUsIDB4MmU2MCwgMHgwODBjLCAweDRlY2YsIDB4MDAxZSwgMHgwMDJlLCAweDAwM2UsCisJMHgwMGNlLCAweDAwZWUsIDB4NjYxOCwgMHgwMGM2LCAweDI2NjAsIDB4MDgwYywgMHg0Y2ViLCAweDAwY2UsCisJMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDAyNzgsCisJMHgwODBjLCAweGE2NTYsIDB4MTkwNCwgMHg5YmEwLCAweDA4MGMsIDB4YTVmNiwgMHgxMTIwLCAweDYwMDcsCisJMHgwMDA4LCAweDA4MDQsIDB4OWNhNiwgMHg2MDA3LCAweDAwMDksIDB4MDgwNCwgMHg5Y2E2LCAweDA4MGMsCisJMHhhODAxLCAweDAxMjgsIDB4MDgwYywgMHhhNjU2LCAweDBkNzgsIDB4MDgwNCwgMHg5YmEwLCAweDYwMTMsCisJMHgxOTAwLCAweDBjODgsIDB4NjEwNiwgMHgwODBjLCAweGE1YTYsIDB4NjAwNywgMHgwMDA2LCAweDA4MDQsCisJMHg5Y2E2LCAweDYwMDcsIDB4MDAwNywgMHgwODA0LCAweDljYTYsIDB4MDgwYywgMHhhYjRlLCAweDE5MDQsCisJMHg5ZTc2LCAweDAwZDYsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsCisJMHhhNjg2LCAweDAwMDYsIDB4MDE4OCwgMHhhNjg2LCAweDAwMDQsIDB4MDE3MCwgMHg2ZTA0LCAweGE2YjQsCisJMHgwMGZmLCAweGE2ODYsIDB4MDAwNiwgMHgwMTQwLCAweGE2ODYsIDB4MDAwNCwgMHgwMTI4LCAweGE2ODYsCisJMHgwMDA1LCAweDAxMTAsIDB4MDBkZSwgMHgwMGUwLCAweDA4MGMsIDB4YTZiNCwgMHgxMWEwLCAweGE2ODYsCisJMHgwMDA2LCAweDExNTAsIDB4MDAyNiwgMHg2MjE4LCAweGEyOTAsIDB4MDAyOCwgMHgyMjE0LCAweDIwMDksCisJMHgwMDAwLCAweDA4MGMsIDB4MmIxZSwgMHgwMDJlLCAweDA4MGMsIDB4NGQ3MiwgMHg2MDA3LCAweDAwMGEsCisJMHgwMGRlLCAweDA4MDQsIDB4OWNhNiwgMHg2MDA3LCAweDAwMGIsIDB4MDBkZSwgMHgwODA0LCAweDljYTYsCisJMHgwODBjLCAweDJhZDksIDB4NjAwNywgMHgwMDAxLCAweDA4MDQsIDB4OWNhNiwgMHgwODBjLCAweGFiNGUsCisJMHgxOTA0LCAweDllNzYsIDB4NjYxOCwgMHgwMGQ2LCAweDI2NjgsIDB4NmUwNCwgMHgwMGRlLCAweGE2ODYsCisJMHgwNzA3LCAweDBkNzAsIDB4MDAyNiwgMHg2MjE4LCAweGEyOTAsIDB4MDAyOCwgMHgyMjE0LCAweDIwMDksCisJMHgwMDAwLCAweDA4MGMsIDB4MmIxZSwgMHgwMDJlLCAweDYwMDcsIDB4MDAwYywgMHgwODA0LCAweDljYTYsCisJMHgwODBjLCAweDUwMmQsIDB4MTE0MCwgMHgyMDAxLCAweGFkMzQsIDB4MjAwNCwgMHhhMDg0LCAweDAwMDksCisJMHhhMDg2LCAweDAwMDgsIDB4MTExMCwgMHgwODA0LCAweDliMDksIDB4MDgwYywgMHg1MDFkLCAweDY2MTgsCisJMHhhNmIwLCAweDAwMDEsIDB4MjYzNCwgMHhhNjg0LCAweDAwZmYsIDB4YTA4MiwgMHgwMDA2LCAweDA2ZTgsCisJMHgxMTM4LCAweDAwMjYsIDB4MjAwMSwgMHgwMDA2LCAweDA4MGMsIDB4NGM1ZCwgMHgwMDJlLCAweDAwNTAsCisJMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDQsIDB4MDEyMCwgMHhhNjg2LCAweDAwMDYsCisJMHgxOTA0LCAweDliYTAsIDB4MDgwYywgMHhhNmMxLCAweDExMjAsIDB4NjAwNywgMHgwMDBlLCAweDA4MDQsCisJMHg5Y2E2LCAweDAwNDYsIDB4NjQxOCwgMHhhNGEwLCAweDAwMjgsIDB4MjQyNCwgMHhhNGE0LCAweDAwZmYsCisJMHg4NDI3LCAweDAwNDYsIDB4MDgwYywgMHgyYWQ5LCAweDAwNGUsIDB4MDAxNiwgMHhhMDA2LCAweDIwMDksCisJMHhhZDUyLCAweDIxMGMsIDB4ZDFhNCwgMHgwMTU4LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGE5NmMsCisJMHg2MDE4LCAweDAwZDYsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgwMGRlLCAweDAwMWUsCisJMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwgMHgwODA0LCAweDljYTYsIDB4MjAwMSwgMHgwMDAxLCAweDA4MGMsCisJMHg0YzFlLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsIDB4MjBhOSwgMHgwMDA0LCAweDIwMTksCisJMHhhZDA1LCAweDIwMTEsIDB4YjI5MCwgMHgwODBjLCAweDhhN2MsIDB4MDAzZSwgMHgwMDJlLCAweDAwMWUsCisJMHgwMTVlLCAweGEwMDUsIDB4MDE2OCwgMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjgyLCAweDAwMDQsCisJMHgwYTA0LCAweDliYTAsIDB4YTY4MiwgMHgwMDA3LCAweDBhMDQsIDB4OWJlYSwgMHgwODA0LCAweDliYTAsCisJMHg2MDEzLCAweDE5MDAsIDB4NjAwNywgMHgwMDA5LCAweDA4MDQsIDB4OWNhNiwgMHgwODBjLCAweDUwMmQsCisJMHgxMTQwLCAweDIwMDEsIDB4YWQzNCwgMHgyMDA0LCAweGEwODQsIDB4MDAwOSwgMHhhMDg2LCAweDAwMDgsCisJMHgxMTEwLCAweDA4MDQsIDB4OWIwOSwgMHgwODBjLCAweDUwMWQsIDB4NjYxOCwgMHhhNmIwLCAweDAwMDEsCisJMHgyNjM0LCAweGE2ODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMDYsIDB4MDZiMCwgMHhhNmI0LCAweGZmMDAsCisJMHg4NjM3LCAweGE2ODYsIDB4MDAwNCwgMHgwMTIwLCAweGE2ODYsIDB4MDAwNiwgMHgxOTA0LCAweDliYTAsCisJMHgwODBjLCAweGE2ZTksIDB4MTEzMCwgMHgwODBjLCAweGE1ZjYsIDB4MTExOCwgMHg2MDA3LCAweDAwMTAsCisJMHgwNGU4LCAweDAwNDYsIDB4NjQxOCwgMHhhNGEwLCAweDAwMjgsIDB4MjQyNCwgMHhhNGE0LCAweDAwZmYsCisJMHg4NDI3LCAweDAwNDYsIDB4MDgwYywgMHgyYWQ5LCAweDAwNGUsIDB4MDAxNiwgMHhhMDA2LCAweDIwMDksCisJMHhhZDUyLCAweDIxMGMsIDB4ZDFhNCwgMHgwMTU4LCAweDIwMDksIDB4MDAyOSwgMHgwODBjLCAweGE5NmMsCisJMHg2MDE4LCAweDAwZDYsIDB4MjA2OCwgMHg2ODAwLCAweGMwZTUsIDB4NjgwMiwgMHgwMGRlLCAweDAwMWUsCisJMHgwMDRlLCAweDYwMDcsIDB4MDAwMSwgMHgwMGQwLCAweDA4MGMsIDB4YTgwMSwgMHgwMTQwLCAweGE2YjQsCisJMHhmZjAwLCAweDg2MzcsIDB4YTY4NiwgMHgwMDA2LCAweDA5NTgsIDB4MDgwNCwgMHg5YmEwLCAweDYwMTMsCisJMHgxOTAwLCAweDYwMDcsIDB4MDAwOSwgMHgwMDUwLCAweDA4MGMsIDB4YWI0ZSwgMHgxOTA0LCAweDllNzYsCisJMHgwODBjLCAweDllOTgsIDB4MTkwNCwgMHg5YmEwLCAweDYwMDcsIDB4MDAxMiwgMHg2MDAzLCAweDAwMDEsCisJMHgwODBjLCAweDY3ZWUsIDB4MDAwNSwgMHg2MDA3LCAweDAwMDEsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg2N2VlLCAweDBjYzAsIDB4NjAwNywgMHgwMDA1LCAweDBjYzAsIDB4MDgwYywgMHhhYjRlLCAweDE5MDQsCisJMHg5ZTc2LCAweDA4MGMsIDB4OWU5OCwgMHgxOTA0LCAweDliYTAsIDB4NjAwNywgMHgwMDIwLCAweDYwMDMsCisJMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwMDA1LCAweDYwMDcsIDB4MDAyMywgMHg2MDAzLCAweDAwMDEsCisJMHgwODBjLCAweDY3ZWUsIDB4MDAwNSwgMHgwODBjLCAweGFiNGUsIDB4MTkwNCwgMHg5ZTc2LCAweDA4MGMsCisJMHg5ZTk4LCAweDE5MDQsIDB4OWJhMCwgMHgwMDE2LCAweDAwMjYsIDB4MjAxMSwgMHhiMjkxLCAweDIyMTQsCisJMHhhMjg2LCAweGZmZmYsIDB4MDE5MCwgMHgyYzA4LCAweDA4MGMsIDB4OTU4NiwgMHgwMWQ4LCAweDIyNjAsCisJMHgyMDExLCAweGIyOTAsIDB4MjIxNCwgMHg2MDA4LCAweGEyMDYsIDB4MTFhMCwgMHg2MDE4LCAweGExOTAsCisJMHgwMDA2LCAweDIyMTQsIDB4YTIwNiwgMHgwMWUwLCAweDAwNjgsIDB4MjAxMSwgMHhiMjkwLCAweDIyMTQsCisJMHgyYzA4LCAweDA4MGMsIDB4YTk0MCwgMHgxMWEwLCAweDIwMTEsIDB4YjI5MSwgMHgyMjE0LCAweGEyODYsCisJMHhmZmZmLCAweDAxYTAsIDB4MjE2MCwgMHg2MDA3LCAweDAwMjYsIDB4NjAxMywgMHgxNzAwLCAweDIwMTEsCisJMHhiMjg5LCAweDIyMTQsIDB4YTI5NiwgMHhmZmZmLCAweDExNjAsIDB4NjAwNywgMHgwMDI1LCAweDAwNDgsCisJMHg2MDFjLCAweGEwODYsIDB4MDAwNywgMHgxZDcwLCAweDA4MGMsIDB4ODA3OCwgMHgyMTYwLCAweDYwMDcsCisJMHgwMDI1LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3ZWUsIDB4MDAyZSwgMHgwMDFlLCAweDAwMDUsCisJMHgyMDAxLCAweDAwMDEsIDB4MDgwYywgMHg0YzFlLCAweDAxNTYsIDB4MDAxNiwgMHgwMDI2LCAweDAwMzYsCisJMHgyMGE5LCAweDAwMDQsIDB4MjAxOSwgMHhhZDA1LCAweDIwMTEsIDB4YjI5NiwgMHgwODBjLCAweDhhN2MsCisJMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMTVlLCAweDAxMjAsIDB4NjAwNywgMHgwMDMxLCAweDA4MDQsCisJMHg5Y2E2LCAweDA4MGMsIDB4ODdiZCwgMHgwODBjLCAweDU3NGYsIDB4MTE1OCwgMHgwMDA2LCAweDAwMjYsCisJMHgwMDM2LCAweDA4MGMsIDB4NTc2YiwgMHgwMTEwLCAweDA4MGMsIDB4NTcyNiwgMHgwMDNlLCAweDAwMmUsCisJMHgwMDBlLCAweDAwMDUsIDB4NjEwNiwgMHgwODBjLCAweDllYjQsIDB4NjAwNywgMHgwMDJiLCAweDA4MDQsCisJMHg5Y2E2LCAweDYwMDcsIDB4MDAyYywgMHgwODA0LCAweDljYTYsIDB4MDgwYywgMHhhYjRlLCAweDE5MDQsCisJMHg5ZTc2LCAweDA4MGMsIDB4OWU5OCwgMHgxOTA0LCAweDliYTAsIDB4NjEwNiwgMHgwODBjLCAweDllYjgsCisJMHgxMTIwLCAweDYwMDcsIDB4MDAyZSwgMHgwODA0LCAweDljYTYsIDB4NjAwNywgMHgwMDJmLCAweDA4MDQsCisJMHg5Y2E2LCAweDAwZTYsIDB4MDBkNiwgMHgwMGM2LCAweDYwMTgsIDB4YTA4MCwgMHgwMDAxLCAweDIwMGMsCisJMHhhMTg0LCAweDAwZmYsIDB4YTA4NiwgMHgwMDA2LCAweDAxNTgsIDB4YTE4NCwgMHhmZjAwLCAweDgwMDcsCisJMHhhMDg2LCAweDAwMDYsIDB4MDEyOCwgMHgwMGNlLCAweDAwZGUsIDB4MDBlZSwgMHgwODA0LCAweDljYWIsCisJMHgyMDAxLCAweGFkNzEsIDB4MjAwNCwgMHhkMGU0LCAweDA5MDQsIDB4OWRkMiwgMHgyMDcxLCAweGIyOGMsCisJMHg3MDEwLCAweDYwMzYsIDB4NzAxNCwgMHg2MDNhLCAweDcxMDgsIDB4NzIwYywgMHgyMDAxLCAweGFkNTIsCisJMHgyMDA0LCAweGQwYTQsIDB4MDE0MCwgMHg2MDE4LCAweDIwNjgsIDB4NjgxMCwgMHhhMTA2LCAweDExMTgsCisJMHg2ODE0LCAweGEyMDYsIDB4MDFmOCwgMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGFjLCAweDE1ODAsCisJMHgyMDY5LCAweGFkMDAsIDB4Njg3MCwgMHhhMjA2LCAweDE1NTgsIDB4Njg2YywgMHhhMTA2LCAweDE1NDAsCisJMHg3MjEwLCAweDA4MGMsIDB4OTU4NiwgMHgwNTQ4LCAweDA4MGMsIDB4YTlkNCwgMHgwNTMwLCAweDYyMmEsCisJMHg2MDA3LCAweDAwMzYsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdhOCwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwMDUsIDB4NzIxNCwgMHhhMjg2LCAweGZmZmYsIDB4MDE1MCwgMHgwODBjLCAweDk1ODYsCisJMHgwMWEwLCAweGEyODAsIDB4MDAwMiwgMHgyMDA0LCAweDcxMTAsIDB4YTEwNiwgMHgxMTcwLCAweDBjMDgsCisJMHg3MjEwLCAweDJjMDgsIDB4MDgwYywgMHhhOTQwLCAweDJjMTAsIDB4MjE2MCwgMHgwMTMwLCAweDA4YzgsCisJMHg2MDA3LCAweDAwMzcsIDB4NjAxMywgMHgxNTAwLCAweDA4ZTgsIDB4NjAwNywgMHgwMDM3LCAweDYwMTMsCisJMHgxNzAwLCAweDA4YzAsIDB4NjAwNywgMHgwMDEyLCAweDA4YTgsIDB4NjAxOCwgMHhhMDgwLCAweDAwMDEsCisJMHgyMDA0LCAweGEwODQsIDB4ZmYwMCwgMHg4MDA3LCAweGEwODYsIDB4MDAwNiwgMHgxOTA0LCAweDljYWIsCisJMHgwMGU2LCAweDAwZDYsIDB4MDBjNiwgMHgyMDAxLCAweGFkNzEsIDB4MjAwNCwgMHhkMGU0LCAweDA5MDQsCisJMHg5ZTM4LCAweDIwNjksIDB4YWQwMCwgMHgyMDcxLCAweGIyOGMsIDB4NzAwOCwgMHg2MDM2LCAweDcyMGMsCisJMHg2MjNhLCAweGEyODYsIDB4ZmZmZiwgMHgxMTQwLCAweDcyMDgsIDB4MDBjNiwgMHgyYzA4LCAweDA4MGMsCisJMHhhOTQwLCAweDJjMTAsIDB4MDBjZSwgMHgwNTg4LCAweDA4MGMsIDB4OTU4NiwgMHgwNTcwLCAweDAwYzYsCisJMHgwMDI2LCAweDIyNjAsIDB4MDgwYywgMHg5MjhmLCAweDAwMmUsIDB4MDBjZSwgMHg3MTE4LCAweGExOGMsCisJMHhmZjAwLCAweDgxMGYsIDB4YTE4NiwgMHgwMDAxLCAweDAxNTgsIDB4YTE4NiwgMHgwMDA1LCAweDAxMTgsCisJMHhhMTg2LCAweDAwMDcsIDB4MTE3OCwgMHhhMjgwLCAweDAwMDQsIDB4MjAwNCwgMHhhMDA1LCAweDAxNTAsCisJMHgwMDU2LCAweDc1MTAsIDB4NzYxNCwgMHgwODBjLCAweGE5ZWIsIDB4MDA1ZSwgMHgwMGNlLCAweDAwZGUsCisJMHgwMGVlLCAweDAwMDUsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDJhMDAsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LCAweDBjODgsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsCisJMHgwMDA5LCAweDYwMTMsIDB4MTcwMCwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LCAweDBjMzAsCisJMHg2MDA3LCAweDAwM2IsIDB4NjAyYiwgMHgwMDBiLCAweDYwMTMsIDB4MDAwMCwgMHgwODA0LCAweDlkYWEsCisJMHgwMGU2LCAweDAwMjYsIDB4MDgwYywgMHg1MDJkLCAweDA1NTgsIDB4MDgwYywgMHg1MDFkLCAweDA4MGMsCisJMHhhYmM1LCAweDE1MjAsIDB4MjA3MSwgMHhhZDAwLCAweDcwZDAsIDB4YzA4NSwgMHg3MGQyLCAweDAwZjYsCisJMHgyMDc5LCAweDAxMDAsIDB4NzI5YywgMHhhMjg0LCAweDAwZmYsIDB4NzA2ZSwgMHg3OGU2LCAweGEyODQsCisJMHhmZjAwLCAweDcyNzAsIDB4YTIwNSwgMHg3MDcyLCAweDc4ZWEsIDB4MDBmZSwgMHg3MGRiLCAweDAwMDAsCisJMHgyMDAxLCAweGFkNTIsIDB4MjAwNCwgMHhkMGE0LCAweDAxMjAsIDB4MjAxMSwgMHhhZmUwLCAweDIwMTMsCisJMHgwN2QwLCAweGQwYWMsIDB4MTEyOCwgMHgwODBjLCAweDI4ZmEsIDB4MDAxMCwgMHgwODBjLCAweGFiZjEsCisJMHgwMDJlLCAweDAwZWUsIDB4MDgwYywgMHg4MDc4LCAweDA4MDQsIDB4OWNhYSwgMHgwODBjLCAweDgwNzgsCisJMHgwMDA1LCAweDI2MDAsIDB4MDAwMiwgMHg5ZTgxLCAweDllODEsIDB4OWU4MSwgMHg5ZTgxLCAweDllODEsCisJMHg5ZTgzLCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweGFiNGUsIDB4MWQ4MCwgMHgwMDg5LCAweDExMzgsCisJMHg2MDA3LCAweDAwNDUsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsIDB4NjdlZSwgMHgwMDA1LCAweDA4MGMsCisJMHgyYWQ5LCAweDYwMDcsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2VlLCAweDAwMDUsCisJMHgwMGQ2LCAweDAwNjYsIDB4NjYxOCwgMHgyNjY4LCAweDZlMDQsIDB4YTZiNCwgMHhmZjAwLCAweDg2MzcsCisJMHhhNjg2LCAweDAwMDYsIDB4MDE3MCwgMHhhNjg2LCAweDAwMDQsIDB4MDE1OCwgMHg2ZTA0LCAweGE2YjQsCisJMHgwMGZmLCAweGE2ODYsIDB4MDAwNiwgMHgwMTI4LCAweGE2ODYsIDB4MDAwNCwgMHgwMTEwLCAweGEwODUsCisJMHgwMDAxLCAweDAwNmUsIDB4MDBkZSwgMHgwMDA1LCAweDAwZDYsIDB4MDQ0OSwgMHgwMGRlLCAweDAwMDUsCisJMHgwMGQ2LCAweDA0OTEsIDB4MTFmMCwgMHg2ODBjLCAweGEwOGMsIDB4ZmYwMCwgMHg2ODIwLCAweGEwODQsCisJMHgwMGZmLCAweGExMTUsIDB4NjIxMiwgMHg2ODI0LCAweDYwMmEsIDB4ZDFlNCwgMHgwMTE4LCAweDIwMDksCisJMHgwMDAxLCAweDAwNjAsIDB4ZDFlYywgMHgwMTY4LCAweDY5MjAsIDB4YTE4YywgMHgwMGZmLCAweDY4MjQsCisJMHgwODBjLCAweDI2NzYsIDB4MTEzMCwgMHgyMTEwLCAweDIwMDksIDB4MDAwMCwgMHgwODBjLCAweDJiMWUsCisJMHgwMDE4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA4LCAweGEwMDYsIDB4MDBkZSwgMHgwMDA1LCAweDIwNjksCisJMHhiMjhkLCAweDY4MDAsIDB4YTA4MiwgMHgwMDEwLCAweDEyMjgsIDB4NjAxMywgMHgwMDAwLCAweGEwODUsCisJMHgwMDAxLCAweDAwMDgsIDB4YTAwNiwgMHgwMDA1LCAweDYwMTMsIDB4MDAwMCwgMHgyMDY5LCAweGIyOGMsCisJMHg2ODA4LCAweGEwODQsIDB4ZmYwMCwgMHhhMDg2LCAweDA4MDAsIDB4MTE0MCwgMHg2ODAwLCAweGEwODQsCisJMHgwMGZmLCAweGEwOGUsIDB4MDAxNCwgMHgwMTEwLCAweGEwOGUsIDB4MDAxMCwgMHgwMDA1LCAweDYwMDQsCisJMHhhMGIyLCAweDAwODAsIDB4MWEwYywgMHgxNGY2LCAweGExYjYsIDB4MDAxMywgMHgxMTMwLCAweDIwMDgsCisJMHhhMWIyLCAweDAwNDAsIDB4MWEwNCwgMHg5ZmZiLCAweDAwOTIsIDB4YTFiNiwgMHgwMDI3LCAweDAxMjAsCisJMHhhMWI2LCAweDAwMTQsIDB4MTkwYywgMHgxNGY2LCAweDIwMDEsIDB4MDAwNywgMHgwODBjLCAweDRjNWQsCisJMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDlmNWYsCisJMHg5ZjYxLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNjEsIDB4OWY2ZiwgMHg5ZmY0LCAweDlmYmYsCisJMHg5ZmY0LCAweDlmZDAsIDB4OWZmNCwgMHg5ZjZmLCAweDlmZjQsIDB4OWZlYywgMHg5ZmY0LCAweDlmZWMsCisJMHg5ZmY0LCAweDlmZjQsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsCisJMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsIDB4OWY2MSwgMHg5ZjVmLCAweDlmZjQsCisJMHg5ZjVmLCAweDlmNWYsIDB4OWZmNCwgMHg5ZjVmLCAweDlmZjEsIDB4OWZmNCwgMHg5ZjVmLCAweDlmNWYsCisJMHg5ZjVmLCAweDlmNWYsIDB4OWZmNCwgMHg5ZmY0LCAweDlmNWYsIDB4OWZmNCwgMHg5ZmY0LCAweDlmNWYsCisJMHg5ZjY5LCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDlmNWYsIDB4OWZmMCwgMHg5ZmY0LCAweDlmNWYsCisJMHg5ZjVmLCAweDlmZjQsIDB4OWZmNCwgMHg5ZjVmLCAweDlmNWYsIDB4OWY1ZiwgMHg5ZjVmLCAweDA4MGMsCisJMHgxNGY2LCAweDA4MGMsIDB4NmI3MywgMHg2MDAzLCAweDAwMDIsIDB4MDgwYywgMHg2YzUwLCAweDA4MDQsCisJMHg5ZmZhLCAweDIwMDEsIDB4MDAwMCwgMHgwODBjLCAweDRjMWUsIDB4MDgwNCwgMHg5ZmY0LCAweDAwZjYsCisJMHgyMDc5LCAweGFkNTEsIDB4NzgwNCwgMHgwMGZlLCAweGQwYWMsIDB4MTkwNCwgMHg5ZmY0LCAweDIwMDEsCisJMHgwMDAwLCAweDA4MGMsIDB4NGMxZSwgMHg2MDE4LCAweGEwODAsIDB4MDAwNCwgMHgyMDA0LCAweGEwODYsCisJMHgwMGZmLCAweDExNDAsIDB4MDBmNiwgMHgyMDc5LCAweGFkMDAsIDB4Nzg5NCwgMHg4MDAwLCAweDc4OTYsCisJMHgwMGZlLCAweDAwZTAsIDB4MDBjNiwgMHg2MDE4LCAweDIwNjAsIDB4NjAwMCwgMHhkMGY0LCAweDExNDAsCisJMHg2MDEwLCAweGEwMDUsIDB4MDEyOCwgMHgwMGNlLCAweDA4MGMsIDB4M2NjZSwgMHgwODA0LCAweDlmZjQsCisJMHgwMGNlLCAweDIwMDEsIDB4YWQwMCwgMHgyMDA0LCAweGEwODYsIDB4MDAwMiwgMHgxMTM4LCAweDAwZjYsCisJMHgyMDc5LCAweGFkMDAsIDB4Nzg5NCwgMHg4MDAwLCAweDc4OTYsIDB4MDBmZSwgMHgyMDAxLCAweDAwMDIsCisJMHgwODBjLCAweDRjMzAsIDB4MDgwYywgMHg2YjczLCAweDYwMWYsIDB4MDAwMSwgMHg2MDAzLCAweDAwMDEsCisJMHg2MDA3LCAweDAwMDIsIDB4MDgwYywgMHg2N2VlLCAweDA4MGMsIDB4NmM1MCwgMHgwMGM2LCAweDYxMTgsCisJMHgyMTYwLCAweDIwMDksIDB4MDAwMSwgMHgwODBjLCAweDY1MTksIDB4MDBjZSwgMHgwNGQ4LCAweDY2MTgsCisJMHgwMGQ2LCAweDI2NjgsIDB4NmUwNCwgMHgwMGRlLCAweGE2YjQsIDB4ZmYwMCwgMHg4NjM3LCAweGE2ODYsCisJMHgwMDA2LCAweDA1NTAsIDB4YTY4NiwgMHgwMDA0LCAweDA1MzgsIDB4MjAwMSwgMHgwMDA0LCAweDA0MTAsCisJMHgyMDAxLCAweGFkMDAsIDB4MjAwNCwgMHhhMDg2LCAweDAwMDMsIDB4MTExMCwgMHgwODBjLCAweDNjY2UsCisJMHgyMDAxLCAweDAwMDYsIDB4MDQ4OSwgMHg2NjE4LCAweDAwZDYsIDB4MjY2OCwgMHg2ZTA0LCAweDAwZGUsCisJMHhhNmI0LCAweGZmMDAsIDB4ODYzNywgMHhhNjg2LCAweDAwMDYsIDB4MDE3MCwgMHgyMDAxLCAweDAwMDYsCisJMHgwMDQ4LCAweDIwMDEsIDB4MDAwNCwgMHgwMDMwLCAweDIwMDEsIDB4MDAwNiwgMHgwMGU5LCAweDAwMjAsCisJMHgwMDE4LCAweDAwMTAsIDB4MDgwYywgMHg0YzVkLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDgwNzgsCisJMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgyNjAwLCAweDAwMDIsIDB4YTAwMywgMHhhMDAzLCAweGEwMDMsCisJMHhhMDAzLCAweGEwMDMsIDB4YTAwNSwgMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsCisJMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDAwMTYsIDB4MDBkNiwgMHg2MTE4LCAweDIxNjgsCisJMHg2OTAwLCAweGQxODQsIDB4MDE4OCwgMHg2MTA0LCAweGExOGUsIDB4MDAwYSwgMHgxMTI4LCAweDY5OWMsCisJMHhkMWE0LCAweDExMTAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsIDB4NGMzMCwgMHgyMDAxLCAweDAwMDAsCisJMHgwODBjLCAweDRjMWUsIDB4MDgwYywgMHgyYWZmLCAweDAwZGUsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsCisJMHg2NjE4LCAweDI2NjgsIDB4NjgwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHgwMGRlLCAweGEwYjIsCisJMHgwMDBjLCAweDFhMGMsIDB4MTRmNiwgMHhhMWI2LCAweDAwMTUsIDB4MTExMCwgMHgwMDNiLCAweDAwMjgsCisJMHhhMWI2LCAweDAwMTYsIDB4MTkwYywgMHgxNGY2LCAweDAwNmIsIDB4MDAwNSwgMHg4NmI5LCAweDg2YjksCisJMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LCAweGEwOGYsIDB4YTA1NiwgMHg4NmI5LCAweDg2YjksCisJMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHg4NmI5LCAweDg2YjksCisJMHhhMDhmLCAweGEwOTYsIDB4ODZiOSwgMHg4NmI5LCAweDg2YjksIDB4ODZiOSwgMHgwMGY2LCAweDIwNzksCisJMHhhZDUxLCAweDc4MDQsIDB4ZDBhYywgMHgxMWUwLCAweDYwMTgsIDB4YTA3ZCwgMHgwMWM4LCAweDc4MDAsCisJMHhkMGY0LCAweDExMTgsIDB4NzgxMCwgMHhhMDA1LCAweDExOTgsIDB4MjAwMSwgMHgwMDAwLCAweDA4MGMsCisJMHg0YzFlLCAweDIwMDEsIDB4MDAwMiwgMHgwODBjLCAweDRjMzAsIDB4NjAxZiwgMHgwMDAxLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDAwMiwgMHgwODBjLCAweDY3ZWUsIDB4MDgwYywgMHg2YzUwLCAweDAwYTgsCisJMHgyMDExLCAweGIyODMsIDB4MjIwNCwgMHg4MjExLCAweDIyMGMsIDB4MDgwYywgMHgyNjc2LCAweDExNjgsCisJMHgwMGM2LCAweDA4MGMsIDB4NGNkYywgMHgwMTIwLCAweDAwY2UsIDB4MDgwYywgMHg4MDc4LCAweDAwMjgsCisJMHgwODBjLCAweDQ5M2EsIDB4MDBjZSwgMHgwODBjLCAweDgwNzgsIDB4MDBmZSwgMHgwMDA1LCAweDY2MDQsCisJMHhhNmI2LCAweDAwMWUsIDB4MTExMCwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgwODBjLCAweDg5NDAsCisJMHgxMTM4LCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwMDEsIDB4MDgwYywgMHg2N2VlLCAweDAwMTAsCisJMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHg2MDA0LCAweGEwOGEsIDB4MDA4MCwgMHgxYTBjLCAweDE0ZjYsCisJMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweGExODIsCisJMHgwMDQwLCAweDAwMDIsIDB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM3LCAweGEwYzUsCisJMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LCAweGEwYzUsCisJMHhhMGM1LCAweGEwYzUsIDB4YTBjNSwgMHhhMGM1LCAweGEwYzUsIDB4MDgwYywgMHgxNGY2LCAweDAwZDYsCisJMHgwMGU2LCAweDAwZjYsIDB4MDE1NiwgMHgwMDQ2LCAweDAwMjYsIDB4NjIxOCwgMHhhMjgwLCAweDAwMmIsCisJMHgyMDA0LCAweGEwMDUsIDB4MDEyMCwgMHgyMDIxLCAweDAwMDAsIDB4MDgwYywgMHhhYjk2LCAweDYxMDYsCisJMHgyMDcxLCAweGIyODAsIDB4NzQ0NCwgMHhhNGE0LCAweGZmMDAsIDB4MDkwNCwgMHhhMTI5LCAweGE0ODYsCisJMHgyMDAwLCAweDExMzAsIDB4MjAwOSwgMHgwMDAxLCAweDIwMTEsIDB4MDIwMCwgMHgwODBjLCAweDY2M2YsCisJMHgwODBjLCAweDE1ZDksIDB4MDkwYywgMHgxNGY2LCAweDYwMDMsIDB4MDAwNywgMHgyZDAwLCAweDY4MzcsCisJMHgwMTBkLCAweDY4MDMsIDB4MDAwMCwgMHg2ODNiLCAweDAwMDAsIDB4NmM1YSwgMHgyYzAwLCAweDY4NWUsCisJMHg2MDA4LCAweDY4YjIsIDB4NjAxOCwgMHgyMDc4LCAweDc4YTAsIDB4ODAwNywgMHg3MTMwLCAweDY5NGEsCisJMHgwMDE2LCAweGEwODQsIDB4ZmYwMCwgMHg2ODQ2LCAweDY4NGYsIDB4MDAwMCwgMHg2ODU3LCAweDAwMzYsCisJMHgwODBjLCAweDUxMGMsIDB4MDAxZSwgMHhhNDg2LCAweDIwMDAsIDB4MTEzMCwgMHgyMDE5LCAweDAwMTcsCisJMHgwODBjLCAweGE4ZWIsIDB4MDgwNCwgMHhhMTg2LCAweGE0ODYsIDB4MDQwMCwgMHgxMTMwLCAweDIwMTksCisJMHgwMDAyLCAweDA4MGMsIDB4YTg5ZCwgMHgwODA0LCAweGExODYsIDB4YTQ4NiwgMHgwMjAwLCAweDExMTAsCisJMHgwODBjLCAweGE4ODIsIDB4YTQ4NiwgMHgxMDAwLCAweDExMTAsIDB4MDgwYywgMHhhOGQwLCAweDA4MDQsCisJMHhhMTg2LCAweDIwNjksIDB4YjA0OCwgMHg2YTAwLCAweGQyODQsIDB4MDkwNCwgMHhhMWQ1LCAweGEyODQsCisJMHgwMzAwLCAweDE5MDQsIDB4YTFjZiwgMHg2ODA0LCAweGEwMDUsIDB4MDkwNCwgMHhhMWMwLCAweDJkNzgsCisJMHg2MDAzLCAweDAwMDcsIDB4MDgwYywgMHgxNWMwLCAweDA5MDQsIDB4YTE4ZCwgMHg3ODAwLCAweGQwOGMsCisJMHgxMTE4LCAweDc4MDQsIDB4ODAwMSwgMHg3ODA2LCAweDYwMTMsIDB4MDAwMCwgMHg2ODAzLCAweDAwMDAsCisJMHg2ODM3LCAweDAxMTYsIDB4NjgzYiwgMHgwMDAwLCAweDYwMDgsIDB4NjhiMiwgMHgyYzAwLCAweDY4NGEsCisJMHg2MDE4LCAweDIwNzgsIDB4NzhhMCwgMHg4MDA3LCAweDcxMzAsIDB4Njk4NiwgMHg2ODQ2LCAweDc5MjgsCisJMHg2OThhLCAweDc5MmMsIDB4Njk4ZSwgMHg3OTMwLCAweDY5OTIsIDB4NzkzNCwgMHg2OTk2LCAweDY4NTMsCisJMHgwMDNkLCAweDcyNDQsIDB4YTI5NCwgMHgwMDAzLCAweGEyODYsIDB4MDAwMiwgMHgxMTE4LCAweDY4NGYsCisJMHgwMDQwLCAweDAwNDAsIDB4YTI4NiwgMHgwMDAxLCAweDExMTgsIDB4Njg0ZiwgMHgwMDgwLCAweDAwMTAsCisJMHg2ODRmLCAweDAwMDAsIDB4MjBhOSwgMHgwMDBhLCAweDIwMDEsIDB4YjI5MCwgMHhhZDkwLCAweDAwMTUsCisJMHgyMDBjLCAweDgxMGYsIDB4MjExMiwgMHg4MDAwLCAweDgyMTAsIDB4MWYwNCwgMHhhMTc4LCAweDIwMGMsCisJMHg2OTgyLCAweDgwMDAsIDB4MjAwYywgMHg2OTdlLCAweDA4MGMsIDB4NTEwYywgMHgwMDJlLCAweDAwNGUsCisJMHgwMTVlLCAweDAwZmUsIDB4MDBlZSwgMHgwMGRlLCAweDAwMDUsIDB4NjAxMywgMHgwMTAwLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDBjNzAsCisJMHgyMDY5LCAweGIyOTIsIDB4MmQwNCwgMHhhMDg0LCAweGZmMDAsIDB4YTA4NiwgMHgxMjAwLCAweDExYTgsCisJMHgyMDY5LCAweGIyODAsIDB4Njg2YywgMHhhMDg0LCAweDAwZmYsIDB4MDAxNiwgMHg2MTEwLCAweGExOGMsCisJMHgwNzAwLCAweGExMGQsIDB4NjExMiwgMHgwMDFlLCAweDYwMDMsIDB4MDAwMSwgMHg2MDA3LCAweDAwNDMsCisJMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDA4ODgsIDB4NjAxMywgMHgwMjAwLCAweDYwMDMsCisJMHgwMDAxLCAweDYwMDcsIDB4MDA0MSwgMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDA4MzAsCisJMHg2MDEzLCAweDAzMDAsIDB4MDAxMCwgMHg2MDEzLCAweDAxMDAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsCisJMHgwMDQxLCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLCAweDZjNTAsIDB4MDgwNCwgMHhhMTg2LCAweDYwMTMsCisJMHgwNTAwLCAweDBjOTgsIDB4NjAxMywgMHgwNjAwLCAweDA4MTgsIDB4NjAxMywgMHgwMjAwLCAweDA4MDAsCisJMHhhMTg2LCAweDAwMTMsIDB4MTE3MCwgMHg2MDA0LCAweGEwOGEsIDB4MDA0MCwgMHgwYTBjLCAweDE0ZjYsCisJMHhhMDhhLCAweDAwNTMsIDB4MWEwYywgMHgxNGY2LCAweGEwODIsIDB4MDA0MCwgMHgyMDA4LCAweDA4MDQsCisJMHhhMjUyLCAweGExODYsIDB4MDA1MSwgMHgwMTM4LCAweGExODYsIDB4MDA0NywgMHgxMWQ4LCAweDYwMDQsCisJMHhhMDg2LCAweDAwNDEsIDB4MDUxOCwgMHgyMDAxLCAweDAxMDksIDB4MjAwNCwgMHhkMDg0LCAweDAxZjAsCisJMHgwMTI2LCAweDIwOTEsIDB4MjgwMCwgMHgwMDA2LCAweDAwMTYsIDB4MDAyNiwgMHgwODBjLCAweDY2OTksCisJMHgwMDJlLCAweDAwMWUsIDB4MDAwZSwgMHgwMTJlLCAweDYwMDAsIDB4YTA4NiwgMHgwMDAyLCAweDExNzAsCisJMHgwODA0LCAweGEyOTUsIDB4YTE4NiwgMHgwMDI3LCAweDAxMjAsIDB4YTE4NiwgMHgwMDE0LCAweDE5MGMsCisJMHgxNGY2LCAweDYwMDQsIDB4YTA4MiwgMHgwMDQwLCAweDIwMDgsIDB4MDAxYSwgMHgwODBjLCAweDgwYmUsCisJMHgwMDA1LCAweGEyMmMsIDB4YTIyZSwgMHhhMjJlLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLCAweGEyMmMsCisJMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLCAweGEyMmMsCisJMHhhMjJjLCAweGEyMmMsIDB4YTIyYywgMHhhMjJjLCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsCisJMHgwODBjLCAweDZjNTAsIDB4MDAzNiwgMHgwMGQ2LCAweDYwMTAsIDB4YTA2ZCwgMHgwMWMwLCAweGFkODQsCisJMHhmMDAwLCAweDAxYTgsIDB4NjAwMywgMHgwMDAyLCAweDYwMTgsIDB4MjAwNCwgMHhkMGJjLCAweDExNzgsCisJMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhhOTFmLCAweDYwMTMsIDB4MDAwMCwgMHg2MDE0LCAweGEwMDUsCisJMHgxMTIwLCAweDIwMDEsIDB4YWZhNCwgMHgyMDA0LCAweDYwMTYsIDB4NjAwMywgMHgwMDA3LCAweDAwZGUsCisJMHgwMDNlLCAweDAwMDUsIDB4MDAwMiwgMHhhMjY2LCAweGEyODMsIDB4YTI2ZiwgMHhhMjhmLCAweGEyNjYsCisJMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHhhMjY2LCAweGEyNjYsCisJMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHhhMjY2LCAweGEyNjYsIDB4YTI2NiwgMHgwODBjLCAweDE0ZjYsCisJMHg2MDEwLCAweGEwODgsIDB4MDAxMywgMHgyMTA0LCAweGEwODUsIDB4MDQwMCwgMHgyMDBhLCAweDA4MGMsCisJMHg2YjczLCAweDYwMTAsIDB4YTA4MCwgMHgwMDEzLCAweDIwMDQsIDB4ZDBiNCwgMHgwMTM4LCAweDYwMDMsCisJMHgwMDA3LCAweDIwMDksIDB4MDA0MywgMHgwODBjLCAweDgwYTcsIDB4MDAxMCwgMHg2MDAzLCAweDAwMDIsCisJMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHgwODBjLCAweDZiNzMsIDB4MDgwYywgMHhhYjU1LCAweDExMjAsCisJMHgwODBjLCAweDY2MTgsIDB4MDgwYywgMHg4MDc4LCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDA4MGMsCisJMHg2YjczLCAweDIwMDksIDB4MDA0MSwgMHgwODA0LCAweGEzZGUsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsCisJMHhhMmFiLCAweGEyYWQsIDB4YTJhYiwgMHhhMmFiLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFiLCAweGEyYWUsCisJMHhhMmFiLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFiLCAweGEyYWIsIDB4YTJhYiwgMHhhMmFiLCAweGEyYWIsCisJMHhhMmFiLCAweGEyYjksIDB4YTJhYiwgMHgwODBjLCAweDE0ZjYsIDB4MDAwNSwgMHg2MDAzLCAweDAwMDQsCisJMHg2MTEwLCAweDIwZTEsIDB4MDAwNSwgMHgzZDE4LCAweDNlMjAsIDB4MmMxMCwgMHgwODBjLCAweDE4MjQsCisJMHgwMDA1LCAweDAwZDYsIDB4MDgwYywgMHg2NjE4LCAweDAwZGUsIDB4MDgwYywgMHhhYmI0LCAweDA4MGMsCisJMHg4MDc4LCAweDAwMDUsIDB4YTE4MiwgMHgwMDQwLCAweDAwMDIsIDB4YTJkOCwgMHhhMmQ4LCAweGEyZDgsCisJMHhhMmQ4LCAweGEyZDgsIDB4YTJkOCwgMHhhMmQ4LCAweGEyZGEsIDB4YTJkOCwgMHhhMmRkLCAweGEzMTYsCisJMHhhMmQ4LCAweGEyZDgsIDB4YTJkOCwgMHhhMmQ4LCAweGEzMTYsIDB4YTJkOCwgMHhhMmQ4LCAweGEyZDgsCisJMHgwODBjLCAweDE0ZjYsIDB4MDgwYywgMHg4MGJlLCAweDAwMDUsIDB4MjAwMSwgMHhhZDcxLCAweDIwMDQsCisJMHhkMGU0LCAweDAxNTgsIDB4MjAwMSwgMHgwMTAwLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAyMjgsCisJMHgyMDAxLCAweDAxMWYsIDB4MjAwNCwgMHg2MDM2LCAweDAwMTAsIDB4NjAzNywgMHgwMDAwLCAweDA4MGMsCisJMHg2YzA1LCAweDA4MGMsIDB4NmQwZCwgMHg2MDEwLCAweDAwZDYsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsCisJMHgwMTUwLCAweGEwOGMsIDB4MDAwMywgMHhhMThlLCAweDAwMDIsIDB4MDE2OCwgMHgyMDA5LCAweDAwNDEsCisJMHgwMGRlLCAweDA4MDQsIDB4YTNkZSwgMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLCAweDA4MGMsCisJMHg2NjE4LCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweGFiNTUsIDB4MDExMCwgMHgwMGRlLCAweDAwMDUsCisJMHgwODBjLCAweDY2MTgsIDB4MDgwYywgMHg4MDc4LCAweDAwZGUsIDB4MGNhMCwgMHgwMDM2LCAweDA4MGMsCisJMHg2YzA1LCAweDA4MGMsIDB4NmQwZCwgMHg2MDEwLCAweDAwZDYsIDB4MjA2OCwgMHg2MDE4LCAweDIwMDQsCisJMHhkMGJjLCAweDAxODgsIDB4Njg0YywgMHhhMDg0LCAweDAwMDMsIDB4YTA4NiwgMHgwMDAyLCAweDAxNDAsCisJMHg2ODdjLCAweDYzMmMsIDB4YTMxYSwgMHg2MzJlLCAweDY4ODAsIDB4NjMyOCwgMHhhMzFiLCAweDYzMmEsCisJMHg2MDAzLCAweDAwMDIsIDB4MDA4MCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhhOTFmLCAweDYwMTQsCisJMHhhMDA1LCAweDExMjgsIDB4MjAwMSwgMHhhZmE0LCAweDIwMDQsIDB4ODAwMywgMHg2MDE2LCAweDYwMTMsCisJMHgwMDAwLCAweDYwMDMsIDB4MDAwNywgMHgwMGRlLCAweDAwM2UsIDB4MDAwNSwgMHhhMTg2LCAweDAwMTMsCisJMHgxMTUwLCAweDYwMDQsIDB4YTA4NiwgMHgwMDQyLCAweDE5MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsCisJMHgwODBjLCAweDZjNTAsIDB4MDAwNSwgMHhhMTg2LCAweDAwMjcsIDB4MDExOCwgMHhhMTg2LCAweDAwMTQsCisJMHgxMTgwLCAweDYwMDQsIDB4YTA4NiwgMHgwMDQyLCAweDE5MGMsIDB4MTRmNiwgMHgyMDAxLCAweDAwMDcsCisJMHgwODBjLCAweDRjNWQsIDB4MDgwYywgMHg2YjczLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDZjNTAsCisJMHgwMDA1LCAweGExODIsIDB4MDA0MCwgMHgwMDAyLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzdmLCAweGEzN2YsCisJMHhhMzdmLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzgxLCAweGEzOGQsIDB4YTM3ZiwgMHhhMzdmLCAweGEzN2YsCisJMHhhMzdmLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzdmLCAweGEzN2YsIDB4YTM3ZiwgMHhhMzdmLCAweDA4MGMsCisJMHgxNGY2LCAweDAwMzYsIDB4MDA0NiwgMHgyMGUxLCAweDAwMDUsIDB4M2QxOCwgMHgzZTIwLCAweDJjMTAsCisJMHgwODBjLCAweDE4MjQsIDB4MDA0ZSwgMHgwMDNlLCAweDAwMDUsIDB4NjAxMCwgMHgwMGQ2LCAweDIwNjgsCisJMHg2ODEwLCAweDZhMTQsIDB4MDAwNiwgMHgwMDQ2LCAweDAwNTYsIDB4NmM3YywgMHhhNDIyLCAweDZkODAsCisJMHgyMjAwLCAweGE1MmIsIDB4NjAyYywgMHhhNDIwLCAweDY0MmUsIDB4NjAyOCwgMHhhNTI5LCAweDY1MmEsCisJMHgwMDVlLCAweDAwNGUsIDB4MDAwZSwgMHhhMjBkLCAweDExNzgsIDB4Njg0YywgMHhkMGZjLCAweDAxMjAsCisJMHgyMDA5LCAweDAwNDEsIDB4MDBkZSwgMHgwNDkwLCAweDYwMDMsIDB4MDAwNywgMHg2MDE3LCAweDAwMDAsCisJMHgwODBjLCAweDY2MTgsIDB4MDBkZSwgMHgwMDA1LCAweDAwMDYsIDB4MDBmNiwgMHgyYzc4LCAweDA4MGMsCisJMHg1MDI5LCAweDAwZmUsIDB4MDAwZSwgMHgwMTIwLCAweDYwMDMsIDB4MDAwMiwgMHgwMGRlLCAweDAwMDUsCisJMHgyMDA5LCAweGFkMGQsIDB4MjEwYywgMHhkMTljLCAweDAxMTgsIDB4NjAwMywgMHgwMDA3LCAweDAwMTAsCisJMHg2MDAzLCAweDAwMDYsIDB4MDAyMSwgMHgwODBjLCAweDY2MWEsIDB4MDBkZSwgMHgwMDA1LCAweGQyZmMsCisJMHgwMTQwLCAweDgwMDIsIDB4ODAwMCwgMHg4MjEyLCAweGEyOTEsIDB4MDAwMCwgMHgyMDA5LCAweDAwMDksCisJMHgwMDEwLCAweDIwMDksIDB4MDAxNSwgMHg2YTZhLCAweDY4NjYsIDB4MDAwNSwgMHhhMTgyLCAweDAwNDAsCisJMHgwMjA4LCAweDAwNjIsIDB4YTE4NiwgMHgwMDEzLCAweDAxMjAsIDB4YTE4NiwgMHgwMDE0LCAweDE5MGMsCisJMHgxNGY2LCAweDYwMjAsIDB4ZDBkYywgMHgwOTBjLCAweDE0ZjYsIDB4MDAwNSwgMHhhNDAxLCAweGE0MDgsCisJMHhhNDE0LCAweGE0MjAsIDB4YTQwMSwgMHhhNDAxLCAweGE0MDEsIDB4YTQyZiwgMHhhNDAxLCAweGE0MDMsCisJMHhhNDAzLCAweGE0MDEsIDB4YTQwMSwgMHhhNDAxLCAweGE0MDEsIDB4YTQwMywgMHhhNDAxLCAweGE0MDMsCisJMHhhNDAxLCAweDA4MGMsIDB4MTRmNiwgMHg2MDIwLCAweGQwZGMsIDB4MDkwYywgMHgxNGY2LCAweDAwMDUsCisJMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDY3YTgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsCisJMHgwODBjLCAweDZjNTAsIDB4MDEyZSwgMHgwMDA1LCAweDYwMDMsIDB4MDAwMSwgMHg2MTA2LCAweDA4MGMsCisJMHg2N2E4LCAweDAxMjYsIDB4MjA5MSwgMHg4MDAwLCAweDA4MGMsIDB4NmM1MCwgMHgwMTJlLCAweDAwMDUsCisJMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDA4MGMsIDB4MWU2ZSwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDA4MGMsIDB4NjgwYiwgMHgwODBjLCAweDZkMGQsIDB4MDEyZSwgMHgwMDA1LCAweGEwMTYsCisJMHgwODBjLCAweDE4MjQsIDB4MDAwNSwgMHgwMTI2LCAweDIwOTEsIDB4ODAwMCwgMHgwMDM2LCAweDAwZDYsCisJMHhhMTgyLCAweDAwNDAsIDB4MDAyMywgMHgwMGRlLCAweDAwM2UsIDB4MDEyZSwgMHgwMDA1LCAweGE0NGYsCisJMHhhNDUxLCAweGE0NjMsIDB4YTQ3ZSwgMHhhNDRmLCAweGE0NGYsIDB4YTQ0ZiwgMHhhNDkzLCAweGE0NGYsCisJMHhhNDRmLCAweGE0NGYsIDB4YTQ0ZiwgMHhhNDRmLCAweGE0NGYsIDB4YTQ0ZiwgMHhhNDRmLCAweDA4MGMsCisJMHgxNGY2LCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGQwZmMsIDB4MDFmOCwgMHhhMDljLCAweDAwMDMsCisJMHhhMzllLCAweDAwMDMsIDB4MDFkMCwgMHg2MDAzLCAweDAwMDEsIDB4NjEwNiwgMHgwODBjLCAweDY3YTgsCisJMHgwODBjLCAweDZjNTAsIDB4MDQ5OCwgMHg2MDEwLCAweDIwNjgsIDB4Njg0YywgMHhkMGZjLCAweDAxNjgsCisJMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDAxNDAsIDB4NjAwMywgMHgwMDAxLCAweDYxMDYsCisJMHgwODBjLCAweDY3YTgsIDB4MDgwYywgMHg2YzUwLCAweDA0MDgsIDB4NjAxMywgMHgwMDAwLCAweDYwMTcsCisJMHgwMDAwLCAweDIwMTksIDB4MDAwNCwgMHgwODBjLCAweGE5MWYsIDB4MDBjMCwgMHg2MDEwLCAweDIwNjgsCisJMHg2ODRjLCAweGQwZmMsIDB4MGQ5MCwgMHhhMDljLCAweDAwMDMsIDB4YTM5ZSwgMHgwMDAzLCAweDBkNjgsCisJMHg2MDAzLCAweDAwMDMsIDB4NjEwNiwgMHgyYzEwLCAweDA4MGMsIDB4MWU2ZSwgMHgwODBjLCAweDY4MGIsCisJMHgwODBjLCAweDZkMGQsIDB4MDAxOCwgMHhhMDE2LCAweDA4MGMsIDB4MTgyNCwgMHgwMDA1LCAweDA4MGMsCisJMHg2YjczLCAweDYxMTAsIDB4ODFmZiwgMHgwMTU4LCAweDAwZDYsIDB4MjE2OCwgMHgwODBjLCAweGFiZmEsCisJMHgwMDM2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweGE5MWYsIDB4MDAzZSwgMHgwMGRlLCAweDA4MGMsCisJMHg5NzRlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweDA4MGMsIDB4NmMwNSwgMHg2MTEwLCAweDgxZmYsCisJMHgwMTU4LCAweDAwZDYsIDB4MjE2OCwgMHgwODBjLCAweGFiZmEsIDB4MDAzNiwgMHgyMDE5LCAweDAwMjksCisJMHgwODBjLCAweGE5MWYsIDB4MDAzZSwgMHgwMGRlLCAweDA4MGMsIDB4OTc0ZSwgMHgwODBjLCAweDZkMGQsCisJMHgwMDA1LCAweGExODIsIDB4MDA4NSwgMHgwMDAyLCAweGE0Y2QsIDB4YTRjYiwgMHhhNGNiLCAweGE0ZDksCisJMHhhNGNiLCAweGE0Y2IsIDB4YTRjYiwgMHgwODBjLCAweDE0ZjYsIDB4NjAwMywgMHgwMDBiLCAweDYxMDYsCisJMHgwODBjLCAweDY3YTgsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4MDgwYywgMHg2YzUwLCAweDAxMmUsCisJMHgwMDA1LCAweDAwMjYsIDB4MDBlNiwgMHgwODBjLCAweGFiNGUsIDB4MDExOCwgMHgwODBjLCAweDgwNzgsCisJMHgwMGM4LCAweDIwNzEsIDB4YjI4MCwgMHg3MjI0LCAweDYyMTIsIDB4NzIyMCwgMHgwODBjLCAweGE3Y2UsCisJMHgwMTE4LCAweDYwMDcsIDB4MDA4NiwgMHgwMDQwLCAweDYwMDcsIDB4MDA4NywgMHg3MjI0LCAweGEyOTYsCisJMHhmZmZmLCAweDExMTAsIDB4NjAwNywgMHgwMDg2LCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3YTgsCisJMHgwODBjLCAweDZjNTAsIDB4MDBlZSwgMHgwMDJlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLCAweDExNjAsCisJMHg2MDA0LCAweGEwOGEsIDB4MDA4NSwgMHgwYTBjLCAweDE0ZjYsIDB4YTA4YSwgMHgwMDhjLCAweDFhMGMsCisJMHgxNGY2LCAweGEwODIsIDB4MDA4NSwgMHgwMGEyLCAweGExODYsIDB4MDAyNywgMHgwMTMwLCAweGExODYsCisJMHgwMDE0LCAweDAxMTgsIDB4MDgwYywgMHg4MGJlLCAweDAwNTAsIDB4MjAwMSwgMHgwMDA3LCAweDA4MGMsCisJMHg0YzVkLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsCisJMHhhNTI3LCAweGE1MjksIDB4YTUyOSwgMHhhNTI3LCAweGE1MjcsIDB4YTUyNywgMHhhNTI3LCAweDA4MGMsCisJMHgxNGY2LCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsCisJMHhhMTgyLCAweDAwODUsIDB4MGEwYywgMHgxNGY2LCAweGExODIsIDB4MDA4YywgMHgxYTBjLCAweDE0ZjYsCisJMHhhMTgyLCAweDAwODUsIDB4MDAwMiwgMHhhNTQyLCAweGE1NDIsIDB4YTU0MiwgMHhhNTQ0LCAweGE1NDIsCisJMHhhNTQyLCAweGE1NDIsIDB4MDgwYywgMHgxNGY2LCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLCAweDAxNDgsCisJMHhhMTg2LCAweDAwMTQsIDB4MDEzMCwgMHhhMTg2LCAweDAwMjcsIDB4MDExOCwgMHgwODBjLCAweDgwYmUsCisJMHgwMDMwLCAweDA4MGMsIDB4NmI3MywgMHgwODBjLCAweDk3NGUsIDB4MDgwYywgMHg2YzUwLCAweDAwMDUsCisJMHgwMDM2LCAweDA4MGMsIDB4YWJiNCwgMHg2MDNmLCAweDAwMDAsIDB4MjAxOSwgMHgwMDBiLCAweDAwMzEsCisJMHg2MDFmLCAweDAwMDYsIDB4NjAwMywgMHgwMDA3LCAweDAwM2UsIDB4MDAwNSwgMHgwMTI2LCAweDAwMzYsCisJMHgyMDkxLCAweDgwMDAsIDB4MDA4NiwgMHgyYzQwLCAweDAwOTYsIDB4MjA0OSwgMHgwMDAwLCAweDA4MGMsCisJMHg3YjlhLCAweDAwOWUsIDB4MDA4ZSwgMHgxNTc4LCAweDAwNzYsIDB4MmMzOCwgMHgwODBjLCAweDdjMzQsCisJMHgwMDdlLCAweDE1NDgsIDB4NjAwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDUyOCwgMHg2MDFjLCAweGEwODYsCisJMHgwMDA3LCAweDA1MDgsIDB4MDBkNiwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTUwLCAweDA4MGMsCisJMHhhYmI0LCAweDYwMWYsIDB4MDAwNywgMHgyMDAxLCAweGFmYTMsIDB4MjAwNCwgMHg2MDE2LCAweDA4MGMsCisJMHgxOTBiLCAweDYwMTAsIDB4MjA2OCwgMHgwODBjLCAweDk1OTYsIDB4MDExMCwgMHgwODBjLCAweGE5MWYsCisJMHgwMGRlLCAweDYwMTMsIDB4MDAwMCwgMHgwODBjLCAweGFiYjQsIDB4NjAxZiwgMHgwMDA3LCAweDIwMDEsCisJMHhhZmEzLCAweDIwMDQsIDB4NjAxNiwgMHgwMDNlLCAweDAxMmUsIDB4MDAwNSwgMHgwMGY2LCAweDAwYzYsCisJMHgwMDM2LCAweDAxNTYsIDB4MjA3OSwgMHhiMjgwLCAweDc5MzgsIDB4NzgzYywgMHgwODBjLCAweDI2NzYsCisJMHgxOTA0LCAweGE1ZjEsIDB4MDAxNiwgMHgwMGM2LCAweDA4MGMsIDB4NGNkYywgMHgxNWMwLCAweDIwMTEsCisJMHhiMjkwLCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHg4YTdjLCAweDE1NzgsCisJMHgwMDFlLCAweDAwMmUsIDB4MDAyNiwgMHgwMDE2LCAweDIwMTksIDB4MDAyOSwgMHgwODBjLCAweDdjZjQsCisJMHgwODBjLCAweDY4ZTcsIDB4MDA3NiwgMHgyMDM5LCAweDAwMDAsIDB4MDgwYywgMHg2ODFkLCAweDAwN2UsCisJMHgwMDFlLCAweDAwNzYsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsIDB4YTcxMiwgMHgwMDdlLCAweDA4MGMsCisJMHg0ZWNmLCAweDAwMjYsIDB4NjIwNCwgMHhhMjk0LCAweGZmMDAsIDB4ODIxNywgMHhhMjg2LCAweDAwMDYsCisJMHgwMTE4LCAweGEyODYsIDB4MDAwNCwgMHgxMTE4LCAweDYyYTAsIDB4MDgwYywgMHgyYjg3LCAweDAwMmUsCisJMHgwMDFlLCAweDA4MGMsIDB4NDkzYSwgMHg2NjEyLCAweDY1MTYsIDB4YTAwNiwgMHgwMDEwLCAweDAwY2UsCisJMHgwMDFlLCAweDAxNWUsIDB4MDAzZSwgMHgwMGNlLCAweDAwZmUsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMGU2LCAweDAwMTYsIDB4MjAwOSwgMHhhZDIwLCAweDIxMDQsIDB4YTA4NiwgMHgwMDc0LCAweDE5MDQsCisJMHhhNjRiLCAweDIwNjksIDB4YjI4ZSwgMHg2OTBjLCAweGExODIsIDB4MDEwMCwgMHgwNmMwLCAweDY5MDgsCisJMHhhMTg0LCAweDgwMDAsIDB4MDVlOCwgMHgyMDAxLCAweGFmOWQsIDB4MjAwNCwgMHhhMDA1LCAweDExNjAsCisJMHg2MDE4LCAweDIwNzAsIDB4NzAxMCwgMHhhMDg0LCAweDAwZmYsIDB4MDExOCwgMHg3MDAwLCAweGQwZjQsCisJMHgwMTE4LCAweGExODQsIDB4MDgwMCwgMHgwNTYwLCAweDY5MTAsIDB4YTE4YSwgMHgwMDAxLCAweDA2MTAsCisJMHg2OTE0LCAweDIwNjksIDB4YjJhZSwgMHg2OTA0LCAweDgxZmYsIDB4MTE5OCwgMHg2OTBjLCAweGExODIsCisJMHgwMTAwLCAweDAyYTgsIDB4NjkwOCwgMHg4MWZmLCAweDExNzgsIDB4NjkxMCwgMHhhMThhLCAweDAwMDEsCisJMHgwMjg4LCAweDY5MTgsIDB4YTE4YSwgMHgwMDAxLCAweDAyOTgsIDB4MDBkMCwgMHg2MDEzLCAweDAxMDAsCisJMHgwMGEwLCAweDYwMTMsIDB4MDMwMCwgMHgwMDg4LCAweDYwMTMsIDB4MDUwMCwgMHgwMDcwLCAweDYwMTMsCisJMHgwNzAwLCAweDAwNTgsIDB4NjAxMywgMHgwOTAwLCAweDAwNDAsIDB4NjAxMywgMHgwYjAwLCAweDAwMjgsCisJMHg2MDEzLCAweDBmMDAsIDB4MDAxMCwgMHg2MDEzLCAweDJkMDAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDgsCisJMHhhMDA2LCAweDAwMWUsIDB4MDBlZSwgMHgwMGRlLCAweDAwY2UsIDB4MDAwNSwgMHgwMGM2LCAweDAwZDYsCisJMHgwMDI2LCAweDAwMzYsIDB4MDE1NiwgMHg2MjE4LCAweDIyNjgsIDB4NmIwNCwgMHhhMzk0LCAweDAwZmYsCisJMHhhMjg2LCAweDAwMDYsIDB4MDE5MCwgMHhhMjg2LCAweDAwMDQsIDB4MDE3OCwgMHhhMzk0LCAweGZmMDAsCisJMHg4MjE3LCAweGEyODYsIDB4MDAwNiwgMHgwMTQ4LCAweGEyODYsIDB4MDAwNCwgMHgwMTMwLCAweDAwYzYsCisJMHgyZDYwLCAweDA4MGMsIDB4NGNlYiwgMHgwMGNlLCAweDA0YzAsIDB4MjAxMSwgMHhiMjk2LCAweGFkOTgsCisJMHgwMDBhLCAweDIwYTksIDB4MDAwNCwgMHgwODBjLCAweDhhN2MsIDB4MTU4MCwgMHgyMDExLCAweGIyOWEsCisJMHhhZDk4LCAweDAwMDYsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsIDB4OGE3YywgMHgxNTM4LCAweDAwNDYsCisJMHgwMDE2LCAweDZhYTAsIDB4YTI5NCwgMHgwMGZmLCAweDgyMjcsIDB4YTAwNiwgMHgyMDA5LCAweGFkNTIsCisJMHgyMTBjLCAweGQxYTQsIDB4MDEzOCwgMHgyMDA5LCAweDAwMjksIDB4MDgwYywgMHhhOTZjLCAweDY4MDAsCisJMHhjMGU1LCAweDY4MDIsIDB4MjAxOSwgMHgwMDI5LCAweDA4MGMsIDB4NjhlNywgMHgwMDc2LCAweDIwMzksCisJMHgwMDAwLCAweDA4MGMsIDB4NjgxZCwgMHgyYzA4LCAweDA4MGMsIDB4YTcxMiwgMHgwMDdlLCAweDIwMDEsCisJMHgwMDA3LCAweDA4MGMsIDB4NGM1ZCwgMHgwMDFlLCAweDAwNGUsIDB4YTAwNiwgMHgwMTVlLCAweDAwM2UsCisJMHgwMDJlLCAweDAwZGUsIDB4MDBjZSwgMHgwMDA1LCAweDAwZDYsIDB4MjA2OSwgMHhiMjhlLCAweDY4MDAsCisJMHhhMDg2LCAweDA4MDAsIDB4MDExOCwgMHg2MDEzLCAweDAwMDAsIDB4MDAwOCwgMHhhMDA2LCAweDAwZGUsCisJMHgwMDA1LCAweDAwYzYsIDB4MDBmNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwNzksCisJMHhiMjhjLCAweDc5MzAsIDB4NzgzNCwgMHgwODBjLCAweDI2NzYsIDB4MTFhMCwgMHgwODBjLCAweDRjZGMsCisJMHgxMTg4LCAweDIwMTEsIDB4YjI5MCwgMHhhYzk4LCAweDAwMGEsIDB4MjBhOSwgMHgwMDA0LCAweDA4MGMsCisJMHg4YTdjLCAweDExNDAsIDB4MjAxMSwgMHhiMjk0LCAweGFjOTgsIDB4MDAwNiwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDhhN2MsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsIDB4MDAxZSwgMHgwMGZlLCAweDAwY2UsCisJMHgwMDA1LCAweDAwYzYsIDB4MDAwNiwgMHgwMDE2LCAweDAwMjYsIDB4MDAzNiwgMHgwMTU2LCAweDIwMTEsCisJMHhiMjgzLCAweDIyMDQsIDB4ODIxMSwgMHgyMjBjLCAweDA4MGMsIDB4MjY3NiwgMHgxMWEwLCAweDA4MGMsCisJMHg0Y2RjLCAweDExODgsIDB4MjAxMSwgMHhiMjk2LCAweGFjOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDhhN2MsIDB4MTE0MCwgMHgyMDExLCAweGIyOWEsIDB4YWM5OCwgMHgwMDA2LCAweDIwYTksCisJMHgwMDA0LCAweDA4MGMsIDB4OGE3YywgMHgwMTVlLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAwMGUsCisJMHgwMGNlLCAweDAwMDUsIDB4MDBlNiwgMHgwMGM2LCAweDAwODYsIDB4MDA3NiwgMHgwMDY2LCAweDAwNTYsCisJMHgwMDQ2LCAweDAwMjYsIDB4MDEyNiwgMHgyMDkxLCAweDgwMDAsIDB4Mjc0MCwgMHgyMDI5LCAweGFmZDAsCisJMHgyNTJjLCAweDIwMjEsIDB4YWZkNiwgMHgyNDI0LCAweDIwNjEsIDB4YjQwMCwgMHgyMDcxLCAweGFkMDAsCisJMHg3NjQ0LCAweDcwNjQsIDB4ODFmZiwgMHgwMTI4LCAweDgwMDEsIDB4YTYwMiwgMHgxYTA0LCAweGE3OGUsCisJMHgwMDE4LCAweGE2MDYsIDB4MDkwNCwgMHhhNzhlLCAweDIxMDAsIDB4YWMwNiwgMHgwOTA0LCAweGE3ODUsCisJMHgwODBjLCAweGE5OTAsIDB4MDkwNCwgMHhhNzg1LCAweDY3MWMsIDB4YTc4NiwgMHgwMDAxLCAweDA5MDQsCisJMHhhN2E1LCAweGE3ODYsIDB4MDAwNCwgMHgwOTA0LCAweGE3YTUsIDB4YTc4NiwgMHgwMDA3LCAweDA1ZTgsCisJMHgyNTAwLCAweGFjMDYsIDB4MDVkMCwgMHgyNDAwLCAweGFjMDYsIDB4MDViOCwgMHgwODBjLCAweGE5YTAsCisJMHgxNWEwLCAweDg4ZmYsIDB4MDExOCwgMHg2MDUwLCAweGE5MDYsIDB4MTU3OCwgMHgwMGQ2LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDQsIDB4MTEyMCwgMHgwMDE2LCAweDA4MGMsIDB4MTkwYiwgMHgwMDFlLCAweGE3ODYsCisJMHgwMDA4LCAweDExNDgsIDB4MDgwYywgMHg5Nzg5LCAweDExMzAsIDB4MDgwYywgMHg4NWYzLCAweDAwZGUsCisJMHgwODBjLCAweDk3NGUsIDB4MDBkMCwgMHg2MDEwLCAweDIwNjgsIDB4MDgwYywgMHg5NTk2LCAweDAxOTAsCisJMHhhNzg2LCAweDAwMDMsIDB4MTUyOCwgMHg2ODM3LCAweDAxMDMsIDB4NmI0YSwgMHg2ODQ3LCAweDAwMDAsCisJMHgwODBjLCAweGFiZmEsIDB4MDAxNiwgMHgwODBjLCAweDk3ZmQsIDB4MDgwYywgMHg1MTBjLCAweDAwMWUsCisJMHgwODBjLCAweDk3NDIsIDB4MDBkZSwgMHgwODBjLCAweDk3NGUsIDB4YWNlMCwgMHgwMDE4LCAweDIwMDEsCisJMHhhZDE2LCAweDIwMDQsIDB4YWMwMiwgMHgxMjEwLCAweDA4MDQsIDB4YTcyNiwgMHgwMTJlLCAweDAwMmUsCisJMHgwMDRlLCAweDAwNWUsIDB4MDA2ZSwgMHgwMDdlLCAweDAwOGUsIDB4MDBjZSwgMHgwMGVlLCAweDAwMDUsCisJMHhhNzg2LCAweDAwMDYsIDB4MTljMCwgMHhhMzg2LCAweDAwMDUsIDB4MDEyOCwgMHgwODBjLCAweGFiZmEsCisJMHgwODBjLCAweGE5MWYsIDB4MDhmOCwgMHgwMGRlLCAweDBjMDAsIDB4MDgwYywgMHhhOWEwLCAweDE5ZTgsCisJMHg4MWZmLCAweDA5ZDgsIDB4YTE4MCwgMHgwMDAxLCAweDIwMDQsIDB4YTA4NiwgMHgwMDE4LCAweDAxMzAsCisJMHhhMTgwLCAweDAwMDEsIDB4MjAwNCwgMHhhMDg2LCAweDAwMmQsIDB4MTk3OCwgMHg2MDAwLCAweGEwODYsCisJMHgwMDAyLCAweDE5NTgsIDB4MDgwYywgMHg5Nzc4LCAweDAxMzAsIDB4MDgwYywgMHg5Nzg5LCAweDE5MjgsCisJMHgwODBjLCAweDg1ZjMsIDB4MDAzOCwgMHgwODBjLCAweDJhZmYsIDB4MDgwYywgMHg5Nzg5LCAweDExMTAsCisJMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg5NzRlLCAweDA4MDQsIDB4YTc4NSwgMHgwMGM2LCAweDAwZTYsCisJMHgwMDE2LCAweDJjMDgsIDB4MjE3MCwgMHgwODBjLCAweGE5NDAsIDB4MDAxZSwgMHgwMTIwLCAweDYwMWMsCisJMHhhMDg0LCAweDAwMGYsIDB4MDAxYiwgMHgwMGVlLCAweDAwY2UsIDB4MDAwNSwgMHhhN2U2LCAweGE3ZTYsCisJMHhhN2U2LCAweGE3ZTYsIDB4YTdlNiwgMHhhN2U2LCAweGE3ZTgsIDB4YTdlNiwgMHhhMDA2LCAweDAwMDUsCisJMHgwMDQ2LCAweDAwMTYsIDB4NzAxOCwgMHhhMDgwLCAweDAwMjgsIDB4MjAyNCwgMHhhNGE0LCAweDAwZmYsCisJMHg4NDI3LCAweDJjMDAsIDB4MjAwOSwgMHgwMDIwLCAweDA4MGMsIDB4YTk2YywgMHgwMDFlLCAweDAwNGUsCisJMHgwMDM2LCAweDIwMTksIDB4MDAwMiwgMHgwODBjLCAweGE1NjYsIDB4MDAzZSwgMHhhMDg1LCAweDAwMDEsCisJMHgwMDA1LCAweDIwMDEsIDB4MDAwMSwgMHgwODBjLCAweDRjMWUsIDB4MDE1NiwgMHgwMDE2LCAweDAwMjYsCisJMHgwMDM2LCAweDIwYTksIDB4MDAwNCwgMHgyMDE5LCAweGFkMDUsIDB4MjAxMSwgMHhiMjk2LCAweDA4MGMsCisJMHg4YTdjLCAweDAwM2UsIDB4MDAyZSwgMHgwMDFlLCAweDAxNWUsIDB4YTAwNSwgMHgwMDA1LCAweDAwZjYsCisJMHgwMGU2LCAweDAwYzYsIDB4MDA4NiwgMHgwMDc2LCAweDAwNjYsIDB4MDAyNiwgMHgwMTI2LCAweDIwOTEsCisJMHg4MDAwLCAweDI3NDAsIDB4MjA2MSwgMHhiNDAwLCAweDIwNzksIDB4MDAwMSwgMHg4ZmZmLCAweDA5MDQsCisJMHhhODc1LCAweDIwNzEsIDB4YWQwMCwgMHg3NjQ0LCAweDcwNjQsIDB4ODAwMSwgMHhhNjAyLCAweDFhMDQsCisJMHhhODc1LCAweDg4ZmYsIDB4MDEyOCwgMHgyODAwLCAweGFjMDYsIDB4MTViMCwgMHgyMDc5LCAweDAwMDAsCisJMHgwODBjLCAweGE5OTAsIDB4MDU4OCwgMHgyNDAwLCAweGFjMDYsIDB4MDU3MCwgMHg2NzFjLCAweGE3ODYsCisJMHgwMDA2LCAweDE1NTAsIDB4YTc4NiwgMHgwMDA3LCAweDA1MzgsIDB4ODhmZiwgMHgxMTQwLCAweDYwMTgsCisJMHhhMjA2LCAweDE1MTAsIDB4ODVmZiwgMHgwMTE4LCAweDYwNTAsIDB4YTEwNiwgMHgxMWU4LCAweDAwZDYsCisJMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTUwLCAweDA4MGMsIDB4YWJiNCwgMHg2MDFmLCAweDAwMDcsCisJMHgyMDAxLCAweGFmYTMsIDB4MjAwNCwgMHg2MDE2LCAweDA4MGMsIDB4MTkwYiwgMHg2MDEwLCAweDIwNjgsCisJMHgwODBjLCAweDk1OTYsIDB4MDEyMCwgMHgwMDQ2LCAweDA4MGMsIDB4YTkxZiwgMHgwMDRlLCAweDAwZGUsCisJMHgwODBjLCAweDk3NGUsIDB4ODhmZiwgMHgxMTk4LCAweGFjZTAsIDB4MDAxOCwgMHgyMDAxLCAweGFkMTYsCisJMHgyMDA0LCAweGFjMDIsIDB4MTIxMCwgMHgwODA0LCAweGE4MjYsIDB4YTAwNiwgMHgwMTJlLCAweDAwMmUsCisJMHgwMDZlLCAweDAwN2UsIDB4MDA4ZSwgMHgwMGNlLCAweDAwZWUsIDB4MDBmZSwgMHgwMDA1LCAweGE4YzUsCisJMHgwMDAxLCAweDBjYTAsIDB4MDA3NiwgMHgwMDU2LCAweDAwODYsIDB4MjA0MSwgMHgwMDAwLCAweDIwMjksCisJMHgwMDAxLCAweDJjMjAsIDB4MjAxOSwgMHgwMDAyLCAweDYyMTgsIDB4MDA5NiwgMHgyMDQ5LCAweDAwMDAsCisJMHgwODBjLCAweDdiOWEsIDB4MDA5ZSwgMHgwMDhlLCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDdjMzQsCisJMHgwODBjLCAweGE4MTcsIDB4MDA1ZSwgMHgwMDdlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDQ2LCAweDAwNTYsCisJMHgwMDc2LCAweDAwYzYsIDB4MDE1NiwgMHgyYzIwLCAweDIxMjgsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksCisJMHgwMDAwLCAweDAwMTYsIDB4MDAzNiwgMHgwODBjLCAweDRjZGMsIDB4MTFiMCwgMHgyYzEwLCAweDAwNTYsCisJMHgwMDg2LCAweDIwNDEsIDB4MDAwMCwgMHgyNTA4LCAweDIwMjksIDB4MDAwMSwgMHgwMDk2LCAweDIwNDksCisJMHgwMDAwLCAweDA4MGMsIDB4N2I5YSwgMHgwMDllLCAweDAwOGUsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3YzM0LCAweDA4MGMsIDB4YTgxNywgMHgwMDVlLCAweDAwM2UsIDB4MDAxZSwgMHg4MTA4LCAweDFmMDQsCisJMHhhOGE5LCAweDAxNWUsIDB4MDBjZSwgMHgwMDdlLCAweDAwNWUsIDB4MDA0ZSwgMHgwMDJlLCAweDAwMDUsCisJMHgwMDc2LCAweDAwNTYsIDB4NjIxOCwgMHgwMDg2LCAweDIwNDEsIDB4MDAwMCwgMHgyMDI5LCAweDAwMDEsCisJMHgyMDE5LCAweDAwNDgsIDB4MDA5NiwgMHgyMDQ5LCAweDAwMDAsIDB4MDgwYywgMHg3YjlhLCAweDAwOWUsCisJMHgwMDhlLCAweDIwMzksIDB4MDAwMCwgMHgwODBjLCAweDdjMzQsIDB4MmMyMCwgMHgwODBjLCAweGE4MTcsCisJMHgwMDVlLCAweDAwN2UsIDB4MDAwNSwgMHgwMDI2LCAweDAwNDYsIDB4MDA1NiwgMHgwMDc2LCAweDAwYzYsCisJMHgwMTU2LCAweDJjMjAsIDB4MjBhOSwgMHgwMDdmLCAweDIwMDksIDB4MDAwMCwgMHgwMDE2LCAweDAwMzYsCisJMHgwODBjLCAweDRjZGMsIDB4MTFjMCwgMHgyYzEwLCAweDAwODYsIDB4MjA0MSwgMHgwMDAwLCAweDI4MjgsCisJMHgwMDQ2LCAweDIwMjEsIDB4MDAwMSwgMHgwODBjLCAweGFiOTYsIDB4MDA0ZSwgMHgwMDk2LCAweDIwNDksCisJMHgwMDAwLCAweDA4MGMsIDB4N2I5YSwgMHgwMDllLCAweDAwOGUsIDB4MjAzOSwgMHgwMDAwLCAweDA4MGMsCisJMHg3YzM0LCAweDA4MGMsIDB4YTgxNywgMHgwMDNlLCAweDAwMWUsIDB4ODEwOCwgMHgxZjA0LCAweGE4ZjYsCisJMHgwMTVlLCAweDAwY2UsIDB4MDA3ZSwgMHgwMDVlLCAweDAwNGUsIDB4MDAyZSwgMHgwMDA1LCAweDAwMTYsCisJMHgwMGY2LCAweDM4MDAsIDB4ZDA4YywgMHgwMTMwLCAweGFkODIsIDB4MTAwMCwgMHgwMmIwLCAweGFkODIsCisJMHhhZDAwLCAweDAyMzAsIDB4YWQ4MiwgMHhlNDAwLCAweDAyODAsIDB4YWQ4MiwgMHhmZmZmLCAweDEyNjgsCisJMHg2ODAwLCAweGEwN2QsIDB4MDEzOCwgMHg2ODAzLCAweDAwMDAsIDB4NmI1MiwgMHgwODBjLCAweDUxMGMsCisJMHgyZjY4LCAweDBjYjAsIDB4NmI1MiwgMHgwODBjLCAweDUxMGMsIDB4MDBmZSwgMHgwMDFlLCAweDAwMDUsCisJMHgwMGU2LCAweDAwNDYsIDB4MDAzNiwgMHgyMDYxLCAweGI0MDAsIDB4MjA3MSwgMHhhZDAwLCAweDc0NDQsCisJMHg3MDY0LCAweDgwMDEsIDB4YTQwMiwgMHgxMmQ4LCAweDIxMDAsIDB4YWMwNiwgMHgwMTY4LCAweDYwMDAsCisJMHhhMDg2LCAweDAwMDAsIDB4MDE0OCwgMHg2MDA4LCAweGEyMDYsIDB4MTEzMCwgMHg2MDE4LCAweGExYTAsCisJMHgwMDA2LCAweDI0MjQsIDB4YTQwNiwgMHgwMTQwLCAweGFjZTAsIDB4MDAxOCwgMHgyMDAxLCAweGFkMTYsCisJMHgyMDA0LCAweGFjMDIsIDB4MTIyMCwgMHgwYzA4LCAweGEwODUsIDB4MDAwMSwgMHgwMDA4LCAweGEwMDYsCisJMHgwMDNlLCAweDAwNGUsIDB4MDBlZSwgMHgwMDA1LCAweDAwZDYsIDB4MDAwNiwgMHgwODBjLCAweDE1ZDksCisJMHgwMDBlLCAweDA5MGMsIDB4MTRmNiwgMHg2ODM3LCAweDAxMGQsIDB4Njg1ZSwgMHgwMDI2LCAweDIwMTAsCisJMHgwODBjLCAweDk1ODYsIDB4MjAwMSwgMHgwMDAwLCAweDAxMjAsIDB4MjIwMCwgMHhhMDgwLCAweDAwMTQsCisJMHgyMDA0LCAweDAwMmUsIDB4Njg0YSwgMHg2OTU2LCAweDZjNDYsIDB4Njg0ZiwgMHgwMDAwLCAweGEwMDYsCisJMHg2OGIyLCAweDY4MDIsIDB4NjgzYSwgMHg2ODVhLCAweDA4MGMsIDB4NTEwYywgMHgwMGRlLCAweDAwMDUsCisJMHg2NzAwLCAweGE3ODYsIDB4MDAwMCwgMHgwMTU4LCAweGE3ODYsIDB4MDAwMSwgMHgwMTQwLCAweGE3ODYsCisJMHgwMDBhLCAweDAxMjgsIDB4YTc4NiwgMHgwMDA5LCAweDAxMTAsIDB4YTA4NSwgMHgwMDAxLCAweDAwMDUsCisJMHgwMGU2LCAweDYwMTgsIDB4MjA3MCwgMHg3MGEwLCAweGEyMDYsIDB4MDBlZSwgMHgwMDA1LCAweDAwMTYsCisJMHg2MDA0LCAweGEwOGUsIDB4MDAxZSwgMHgxMWEwLCAweDgwMDcsIDB4NjEzMCwgMHhhMThjLCAweDAwZmYsCisJMHhhMTA1LCAweDYwMzIsIDB4NjAwNywgMHgwMDg1LCAweDYwMDMsIDB4MDAwYiwgMHg2MDFmLCAweDAwMDUsCisJMHgyMDAxLCAweGFmYTQsIDB4MjAwNCwgMHg2MDE2LCAweDA4MGMsIDB4NjdhOCwgMHgwODBjLCAweDZjNTAsCisJMHgwMDFlLCAweDAwMDUsIDB4ZTAwMCwgMHhlMDAwLCAweDAwMDUsIDB4NjAyMCwgMHhkMGU0LCAweDAxNTgsCisJMHhkMGNjLCAweDAxMTgsIDB4MDgwYywgMHg5ODY2LCAweDAwMzAsIDB4MDgwYywgMHhhYmI0LCAweDA4MGMsCisJMHg2NjE4LCAweDA4MGMsIDB4ODA3OCwgMHgwMDA1LCAweGEyODAsIDB4MDAwNywgMHgyMDA0LCAweGEwODQsCisJMHgwMDBmLCAweDAwMDIsIDB4YTllMywgMHhhOWUzLCAweGE5ZTMsIDB4YTllOCwgMHhhOWUzLCAweGE5ZTUsCisJMHhhOWU1LCAweGE5ZTMsIDB4YTllNSwgMHhhMDA2LCAweDAwMDUsIDB4MDBjNiwgMHgyMjYwLCAweDAwY2UsCisJMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHhhMjgwLCAweDAwMDcsIDB4MjAwNCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMDAyLCAweGE5ZmEsIDB4YTlmYSwgMHhhOWZhLCAweGE5ZmEsIDB4YTlmYSwgMHhhOWZhLCAweGFhMDUsCisJMHhhOWZhLCAweGE5ZmEsIDB4NjAwNywgMHgwMDNiLCAweDYwMmIsIDB4MDAwOSwgMHg2MDEzLCAweDJhMDAsCisJMHg2MDAzLCAweDAwMDEsIDB4MDgwYywgMHg2N2E4LCAweDAwMDUsIDB4MDBjNiwgMHgyMjYwLCAweDA4MGMsCisJMHhhYmI0LCAweDYwM2YsIDB4MDAwMCwgMHg2MDIwLCAweGMwZjQsIDB4YzBjYywgMHg2MDIyLCAweDYwMzcsCisJMHgwMDAwLCAweDAwY2UsIDB4MDBkNiwgMHgyMjY4LCAweGExODYsIDB4MDAwNywgMHgxOTA0LCAweGFhNjAsCisJMHg2ODEwLCAweGEwMDUsIDB4MDEzOCwgMHhhMDgwLCAweDAwMTMsIDB4MjAwNCwgMHhkMGZjLCAweDExMTAsCisJMHgwMGRlLCAweDA4YzAsIDB4NjAwNywgMHgwMDNhLCAweDYwMDMsIDB4MDAwMSwgMHgwODBjLCAweDY3YTgsCisJMHgwODBjLCAweDZjNTAsIDB4MDBjNiwgMHgyZDYwLCAweDYxMDAsIDB4YTE4NiwgMHgwMDAyLCAweDE5MDQsCisJMHhhYWU3LCAweDYwMTAsIDB4YTAwNSwgMHgxMTM4LCAweDYwMDAsIDB4YTA4NiwgMHgwMDA3LCAweDE5MGMsCisJMHgxNGY2LCAweDA4MDQsIDB4YWFlNywgMHhhMDhjLCAweGYwMDAsIDB4MTEzMCwgMHgwMDI4LCAweDIwNjgsCisJMHg2ODAwLCAweGEwMDUsIDB4MWRlMCwgMHgyZDAwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGEwODQsCisJMHgwMDAzLCAweGEwODYsIDB4MDAwMiwgMHgxMTgwLCAweDYwMTAsIDB4MjA2OCwgMHg2ODRjLCAweGMwZGMsCisJMHhjMGY0LCAweDY4NGUsIDB4Njg1MCwgMHhjMGY0LCAweGMwZmMsIDB4Njg1MiwgMHgyMDA5LCAweDAwNDMsCisJMHgwODBjLCAweGEzZGUsIDB4MDgwNCwgMHhhYWU3LCAweDIwMDksIDB4MDA0MSwgMHgwODA0LCAweGFhZTEsCisJMHhhMTg2LCAweDAwMDUsIDB4MTVmMCwgMHg2ODEwLCAweGEwODAsIDB4MDAxMywgMHgyMDA0LCAweGQwYmMsCisJMHgxMTE4LCAweDAwZGUsIDB4MDgwNCwgMHhhOWZhLCAweGQwYjQsIDB4MDEyOCwgMHhkMGZjLCAweDA5MGMsCisJMHgxNGY2LCAweDA4MDQsIDB4YWExOCwgMHg2MDA3LCAweDAwM2EsIDB4NjAwMywgMHgwMDAxLCAweDA4MGMsCisJMHg2N2E4LCAweDA4MGMsIDB4NmM1MCwgMHgwMGM2LCAweDJkNjAsIDB4NjEwMCwgMHhhMTg2LCAweDAwMDIsCisJMHgwMTIwLCAweGExODYsIDB4MDAwNCwgMHgxOTA0LCAweGFhZTcsIDB4MjA3MSwgMHhhZmZkLCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDMsIDB4MTEyOCwgMHg3MDA0LCAweGFjMDYsIDB4MTExMCwgMHg3MDAzLCAweDAwMDAsCisJMHg2ODEwLCAweGEwODAsIDB4MDAxMywgMHgyMDBjLCAweGMxZjQsIDB4YzFkYywgMHgyMTAyLCAweDgwMDAsCisJMHgyMDBjLCAweGMxZjQsIDB4YzFmYywgMHhjMWJjLCAweDIxMDIsIDB4MjAwOSwgMHgwMDQyLCAweDA4MDQsCisJMHhhYWUxLCAweDAwMzYsIDB4MDBkNiwgMHgwMGQ2LCAweDA4MGMsIDB4MTVkOSwgMHgwMDNlLCAweDA5MGMsCisJMHgxNGY2LCAweDY4MzcsIDB4MDEwZCwgMHg2ODAzLCAweDAwMDAsIDB4NjgzYiwgMHgwMDAwLCAweDY4NWIsCisJMHgwMDAwLCAweDZiNWUsIDB4Njg1NywgMHgwMDQ1LCAweDJjMDAsIDB4Njg2MiwgMHg2MDM0LCAweDY4NzIsCisJMHgyMzYwLCAweDYwMjAsIDB4YzBkZCwgMHg2MDIyLCAweDYwMTgsIDB4YTA4MCwgMHgwMDI4LCAweDIwMDQsCisJMHhhMDg0LCAweDAwZmYsIDB4ODAwNywgMHg2MzUwLCAweDZiNGEsIDB4Njg0NiwgMHg2ODRmLCAweDAwMDAsCisJMHg2ZDZhLCAweDZlNjYsIDB4Njg2ZiwgMHgwMDAxLCAweDA4MGMsIDB4NTEwYywgMHgyMDE5LCAweDAwNDUsCisJMHg2MDA4LCAweDIwNjgsIDB4MDgwYywgMHhhNTY2LCAweDJkMDAsIDB4NjAwYSwgMHg2MDFmLCAweDAwMDYsCisJMHg2MDAzLCAweDAwMDcsIDB4NjAxNywgMHgwMDAwLCAweDYwM2YsIDB4MDAwMCwgMHgwMGRlLCAweDAwM2UsCisJMHgwMDM4LCAweDYwM2YsIDB4MDAwMCwgMHg2MDAzLCAweDAwMDcsIDB4MDgwYywgMHhhM2RlLCAweDAwY2UsCisJMHgwMGRlLCAweDAwMDUsIDB4YTE4NiwgMHgwMDEzLCAweDExMjgsIDB4NjAwNCwgMHhhMDgyLCAweDAwODUsCisJMHgyMDA4LCAweDAwYzIsIDB4YTE4NiwgMHgwMDI3LCAweDExNzgsIDB4MDgwYywgMHg2YjczLCAweDAwMzYsCisJMHgwMGQ2LCAweDYwMTAsIDB4MjA2OCwgMHgyMDE5LCAweDAwMDQsIDB4MDgwYywgMHhhOTFmLCAweDAwZGUsCisJMHgwMDNlLCAweDA4MGMsIDB4NmM1MCwgMHgwMDA1LCAweGExODYsIDB4MDAxNCwgMHgwZDcwLCAweDA4MGMsCisJMHg4MGJlLCAweDAwMDUsIDB4YWIxMywgMHhhYjExLCAweGFiMTEsIDB4YWIxMSwgMHhhYjExLCAweGFiMTEsCisJMHhhYjEzLCAweDA4MGMsIDB4MTRmNiwgMHgwODBjLCAweDZiNzMsIDB4NjAwMywgMHgwMDBjLCAweDA4MGMsCisJMHg2YzUwLCAweDAwMDUsIDB4YTE4MiwgMHgwMDhjLCAweDEyMjAsIDB4YTE4MiwgMHgwMDg1LCAweDAyMDgsCisJMHgwMDFhLCAweDA4MGMsIDB4ODBiZSwgMHgwMDA1LCAweGFiMmIsIDB4YWIyYiwgMHhhYjJiLCAweGFiMmIsCisJMHhhYjJkLCAweGFiNGIsIDB4YWIyYiwgMHgwODBjLCAweDE0ZjYsIDB4MDBkNiwgMHgyYzY4LCAweDA4MGMsCisJMHg4MDIyLCAweDAxYTAsIDB4NjAwMywgMHgwMDAxLCAweDYwMDcsIDB4MDAxZSwgMHgyMDA5LCAweGIyOGUsCisJMHgyMTBjLCAweDYxMzYsIDB4MjAwOSwgMHhiMjhmLCAweDIxMGMsIDB4NjEzYSwgMHg2MDBiLCAweGZmZmYsCisJMHg2OTE4LCAweDYxMWEsIDB4NjAxZiwgMHgwMDA0LCAweDA4MGMsIDB4NjdhOCwgMHgyZDYwLCAweDA4MGMsCisJMHg4MDc4LCAweDAwZGUsIDB4MDAwNSwgMHgwODBjLCAweDgwNzgsIDB4MDAwNSwgMHgwMGU2LCAweDYwMTgsCisJMHgyMDcwLCAweDcwMDAsIDB4ZDBlYywgMHgwMGVlLCAweDAwMDUsIDB4NjAxMCwgMHhhMDgwLCAweDAwMTMsCisJMHgyMDBjLCAweGQxZWMsIDB4MDVkMCwgMHgyMDAxLCAweGFkNzEsIDB4MjAwNCwgMHhkMGVjLCAweDA1YTgsCisJMHg2MDAzLCAweDAwMDIsIDB4NjAyMCwgMHhjMGU1LCAweDYwMjIsIDB4ZDFhYywgMHgwMTgwLCAweDAwZjYsCisJMHgyYzc4LCAweDA4MGMsIDB4NTAyNSwgMHgwMGZlLCAweDAxNTAsIDB4MjAwMSwgMHhhZmE1LCAweDIwMDQsCisJMHg2MDNlLCAweDIwMDksIDB4YWQ3MSwgMHgyMTBjLCAweGQxZjQsIDB4MTFlOCwgMHgwMDgwLCAweDIwMDksCisJMHhhZDcxLCAweDIxMGMsIDB4ZDFmNCwgMHgwMTI4LCAweDYwMjAsIDB4YzBlNCwgMHg2MDIyLCAweGEwMDYsCisJMHgwMGEwLCAweDIwMDEsIDB4YWZhNSwgMHgyMDBjLCAweDgxMDMsIDB4YTEwMCwgMHg2MDNlLCAweDYwMTgsCisJMHhhMDg4LCAweDAwMmIsIDB4MjEwNCwgMHhhMDA1LCAweDAxMTgsIDB4YTA4OCwgMHgwMDAzLCAweDBjZDAsCisJMHgyYzBhLCAweDYwMGYsIDB4MDAwMCwgMHhhMDg1LCAweDAwMDEsIDB4MDAwNSwgMHgwMDE2LCAweDAwYzYsCisJMHgwMGU2LCAweDYxNTAsIDB4YTJmMCwgMHgwMDJiLCAweDJlMDQsIDB4MjA2MCwgMHg4Y2ZmLCAweDAxODAsCisJMHg4NGZmLCAweDExMTgsIDB4NjA1MCwgMHhhMTA2LCAweDExMzgsIDB4NjAwYywgMHgyMDcyLCAweDA4MGMsCisJMHg2NjE4LCAweDA4MGMsIDB4ODA3OCwgMHgwMDEwLCAweGFjZjAsIDB4MDAwMywgMHgyZTY0LCAweDBjNzAsCisJMHgwMGVlLCAweDAwY2UsIDB4MDAxZSwgMHgwMDA1LCAweDAwZDYsIDB4NjAxOCwgMHhhMGU4LCAweDAwMmIsCisJMHgyZDA0LCAweGEwMDUsIDB4MDE0MCwgMHhhYzA2LCAweDAxMjAsIDB4MmQwNCwgMHhhMGU4LCAweDAwMDMsCisJMHgwY2I4LCAweDYwMGMsIDB4MjA2YSwgMHgwMGRlLCAweDAwMDUsIDB4MDAyNiwgMHgwMDM2LCAweDAxNTYsCisJMHgyMDExLCAweGFkMjcsIDB4MjIwNCwgMHhhMDg0LCAweDAwZmYsIDB4MjAxOSwgMHhiMjhlLCAweDIzMzQsCisJMHhhNjM2LCAweDExZDgsIDB4ODMxOCwgMHgyMzM0LCAweDIyMDQsIDB4YTA4NCwgMHhmZjAwLCAweGE2MzYsCisJMHgxMWEwLCAweDIwMTEsIDB4YjI5MCwgMHg2MDE4LCAweGEwOTgsIDB4MDAwYSwgMHgyMGE5LCAweDAwMDQsCisJMHgwODBjLCAweDhhN2MsIDB4MTE1MCwgMHgyMDExLCAweGIyOTQsIDB4NjAxOCwgMHhhMDk4LCAweDAwMDYsCisJMHgyMGE5LCAweDAwMDQsIDB4MDgwYywgMHg4YTdjLCAweDExMDAsIDB4MDE1ZSwgMHgwMDNlLCAweDAwMmUsCisJMHgwMDA1LCAweDAwZTYsIDB4MjA3MSwgMHhhZDAwLCAweDA4MGMsIDB4NDhmNSwgMHgwODBjLCAweDI4ZmEsCisJMHgwMGVlLCAweDAwMDUsIDB4MDBlNiwgMHg2MDE4LCAweDIwNzAsIDB4NzAwMCwgMHhkMGZjLCAweDAxMDgsCisJMHgwMDExLCAweDAwZWUsIDB4MDAwNSwgMHg2ODUwLCAweGMwZTUsIDB4Njg1MiwgMHgwMDA1LCAweDAwZTYsCisJMHgwMGM2LCAweDAwNzYsIDB4MDA2NiwgMHgwMDU2LCAweDAwNDYsIDB4MDAyNiwgMHgwMDE2LCAweDAxMjYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjAyOSwgMHhhZmQwLCAweDI1MmMsIDB4MjAyMSwgMHhhZmQ2LCAweDI0MjQsCisJMHgyMDYxLCAweGI0MDAsIDB4MjA3MSwgMHhhZDAwLCAweDc2NDQsIDB4NzA2NCwgMHhhNjA2LCAweDA1NzgsCisJMHg2NzFjLCAweGE3ODYsIDB4MDAwMSwgMHgwMTE4LCAweGE3ODYsIDB4MDAwOCwgMHgxNTAwLCAweDI1MDAsCisJMHhhYzA2LCAweDAxZTgsIDB4MjQwMCwgMHhhYzA2LCAweDAxZDAsIDB4MDgwYywgMHhhOTkwLCAweDAxYjgsCisJMHgwODBjLCAweGE5YTAsIDB4MTFhMCwgMHg2MDAwLCAweGEwODYsIDB4MDAwNCwgMHgxMTIwLCAweDAwMTYsCisJMHgwODBjLCAweDE5MGIsIDB4MDAxZSwgMHgwODBjLCAweDk3NzgsIDB4MTExMCwgMHgwODBjLCAweDJhZmYsCisJMHgwODBjLCAweDk3ODksIDB4MTExMCwgMHgwODBjLCAweDg1ZjMsIDB4MDgwYywgMHg5NzRlLCAweGFjZTAsCisJMHgwMDE4LCAweDIwMDEsIDB4YWQxNiwgMHgyMDA0LCAweGFjMDIsIDB4MTIwOCwgMHgwODU4LCAweDAxMmUsCisJMHgwMDFlLCAweDAwMmUsIDB4MDA0ZSwgMHgwMDVlLCAweDAwNmUsIDB4MDA3ZSwgMHgwMGNlLCAweDAwZWUsCisJMHgwMDA1LCAweDAxMjYsIDB4MDAwNiwgMHgwMGU2LCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLCAweGFkNDAsCisJMHhkNWE0LCAweDAxMTgsIDB4NzAzNCwgMHg4MDAwLCAweDcwMzYsIDB4ZDViNCwgMHgwMTE4LCAweDcwMzAsCisJMHg4MDAwLCAweDcwMzIsIDB4ZDVhYywgMHgwMTE4LCAweDIwNzEsIDB4YWQ0YSwgMHgwNDUxLCAweDAwZWUsCisJMHgwMDBlLCAweDAxMmUsIDB4MDAwNSwgMHgwMTI2LCAweDAwMDYsIDB4MDBlNiwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDcxLCAweGFkNDAsIDB4ZDVhNCwgMHgwMTE4LCAweDcwMzQsIDB4ODAwMCwgMHg3MDM2LCAweGQ1YjQsCisJMHgwMTE4LCAweDcwMzAsIDB4ODAwMCwgMHg3MDMyLCAweGQ1YWMsIDB4MDExOCwgMHgyMDcxLCAweGFkNGEsCisJMHgwMDgxLCAweDAwZWUsIDB4MDAwZSwgMHgwMTJlLCAweDAwMDUsIDB4MDEyNiwgMHgwMDA2LCAweDAwZTYsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHhhZDQyLCAweDAwMjEsIDB4MDBlZSwgMHgwMDBlLCAweDAxMmUsCisJMHgwMDA1LCAweDJlMDQsIDB4ODAwMCwgMHgyMDcyLCAweDEyMjAsIDB4OGU3MCwgMHgyZTA0LCAweDgwMDAsCisJMHgyMDcyLCAweDAwMDUsIDB4MDBlNiwgMHgyMDcxLCAweGFkNDAsIDB4MGM5OSwgMHgwMGVlLCAweDAwMDUsCisJMHgwMGU2LCAweDIwNzEsIDB4YWQ0NCwgMHgwYzY5LCAweDAwZWUsIDB4MDAwNSwgMHgwMDAxLCAweDAwMDIsCisJMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwgMHgwMTAwLCAweDAyMDAsCisJMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAsIDB4ODAwMCwgMHg4NTI5Cit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljaXNwLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljaXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkNTk3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNpc3AuYwpAQCAtMCwwICsxLDE5MzUgQEAKKy8qCisgKiBRTG9naWMgSVNQMTAyMCBJbnRlbGxpZ2VudCBTQ1NJIFByb2Nlc3NvciBEcml2ZXIgKFBDSSkKKyAqIFdyaXR0ZW4gYnkgRXJpayBILiBNb2UsIGVobUBjcmlzLmNvbQorICogQ29weXJpZ2h0IDE5OTUsIEVyaWsgSC4gTW9lCisgKiBDb3B5cmlnaHQgMTk5NiwgMTk5NyAgTWljaGFlbCBBLiBHcmlmZml0aCA8Z3JpZkBhY20ub3JnPgorICogQ29weXJpZ2h0IDIwMDAsIEpheXNvbiBDLiBWYW50dXlsIDx2YW50dXlsQGNzYy5zbXN1LmVkdT4KKyAqICAgICAgICAgICAgIGFuZCBCcnlvbiBXLiBSb2NoZSAgICA8YnJ5b25AY3NjLnNtc3UuZWR1PgorICoKKyAqIDY0LWJpdCBhZGRyZXNzaW5nIGFkZGVkIGJ5IEthbm9qIFNhcmNhciA8a2Fub2pAc2dpLmNvbT4KKyAqIAkJCSAgIGFuZCBMZW8gRGFndW0gICAgPGRhZ3VtQHNnaS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKy8qCisgKiBXaXRoIHRoZSBxbG9naWMgaW50ZXJmYWNlLCBldmVyeSBxdWV1ZSBzbG90IGNhbiBob2xkIGEgU0NTSQorICogY29tbWFuZCB3aXRoIHVwIHRvIDQgc2NhdHRlci9nYXRoZXIgZW50cmllcy4gIElmIHdlIG5lZWQgbW9yZQorICogdGhhbiA0IGVudHJpZXMsIGNvbnRpbnVhdGlvbiBlbnRyaWVzIGNhbiBiZSB1c2VkIHRoYXQgaG9sZAorICogYW5vdGhlciA3IGVudHJpZXMgZWFjaC4gIFVubGlrZSBmb3Igb3RoZXIgZHJpdmVycywgdGhpcyBtZWFucworICogdGhhdCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgZW50cmllcyB3ZSBjYW4KKyAqIHN1cHBvcnQgYXQgYW55IGdpdmVuIHRpbWUgaXMgYSBmdW5jdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHF1ZXVlCisgKiBzbG90cyBhdmFpbGFibGUuICBUaGF0IGlzLCBob3N0LT5jYW5fcXVldWUgYW5kIGhvc3QtPnNnX3RhYmxlc2l6ZQorICogYXJlIGR5bmFtaWMgYW5kIF9ub3RfIGluZGVwZW5kZW50LiAgVGhpcyBhbGwgd29ya3MgZmluZSBiZWNhdXNlCisgKiByZXF1ZXN0cyBhcmUgcXVldWVkIHNlcmlhbGx5IGFuZCB0aGUgc2NhdHRlci9nYXRoZXIgbGltaXQgaXMKKyAqIGRldGVybWluZWQgZm9yIGVhY2ggcXVldWUgcmVxdWVzdCBhbmV3LgorICovCisjZGVmaW5lIFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOCTYzCS8qIG11c3QgYmUgcG93ZXIgb2YgdHdvIC0gMSAqLworI2RlZmluZSBRTE9HSUNJU1BfTUFYX1NHKHFsKQkoNCArICgocWwpID4gMCkgPyA3KigocWwpIC0gMSkgOiAwKQorCisvKiBDb25maWd1cmF0aW9uIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNldCB0aGUgZm9sbG93aW5nIG1hY3JvIHRvIDEgdG8gcmVsb2FkIHRoZSBJU1AxMDIwJ3MgZmlybXdhcmUuICBUaGlzIGlzCisgICB0aGUgbGF0ZXN0IGZpcm13YXJlIHByb3ZpZGVkIGJ5IFFMb2dpYy4gIFRoaXMgbWF5IGJlIGFuIGVhcmxpZXIvbGF0ZXIKKyAgIHJldmlzaW9uIHRoYW4gc3VwcGxpZWQgYnkgeW91ciBib2FyZC4gKi8KKworI2RlZmluZSBSRUxPQURfRklSTVdBUkUJCTEKKworLyogU2V0IHRoZSBmb2xsb3dpbmcgbWFjcm8gdG8gMSB0byByZWxvYWQgdGhlIElTUDEwMjAncyBkZWZhdWx0cyBmcm9tIG52cmFtLgorICAgSWYgeW91IGFyZSBub3Qgc3VyZSBvZiB5b3VyIHNldHRpbmdzLCBsZWF2ZSB0aGlzIGFsb25lLCB0aGUgZHJpdmVyIHdpbGwKKyAgIHVzZSBhIHNldCBvZiAnc2FmZScgZGVmYXVsdHMgKi8KKworI2RlZmluZSBVU0VfTlZSQU1fREVGQVVMVFMJMAorCisvKiAgTWFjcm9zIHVzZWQgZm9yIGRlYnVnZ2luZyAqLworCisjZGVmaW5lIERFQlVHX0lTUDEwMjAJCTAKKyNkZWZpbmUgREVCVUdfSVNQMTAyMF9JTlRSCTAKKyNkZWZpbmUgREVCVUdfSVNQMTAyMF9TRVRVUAkwCisjZGVmaW5lIFRSQUNFX0lTUAkJMAorCisjZGVmaW5lIERFRkFVTFRfTE9PUF9DT1VOVAkxMDAwMDAwCisKKy8qIEVuZCBDb25maWd1cmF0aW9uIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaWYgVFJBQ0VfSVNQCisKKyMgZGVmaW5lIFRSQUNFX0JVRl9MRU4JKDMyKjEwMjQpCisKK3N0cnVjdCB7CisJdV9sb25nCQluZXh0OworCXN0cnVjdCB7CisJCXVfbG9uZwkJdGltZTsKKwkJdV9pbnQJCWluZGV4OworCQl1X2ludAkJYWRkcjsKKwkJdV9jaGFyICoJbmFtZTsKKwl9IGJ1ZltUUkFDRV9CVUZfTEVOXTsKK30gdHJhY2U7CisKKyNkZWZpbmUgVFJBQ0UodywgaSwgYSkJCQkJCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKKwkJCQkJCQkJXAorCXRyYWNlLmJ1Zlt0cmFjZS5uZXh0XS5uYW1lICA9ICh3KTsJCQlcCisJdHJhY2UuYnVmW3RyYWNlLm5leHRdLnRpbWUgID0gamlmZmllczsJCQlcCisJdHJhY2UuYnVmW3RyYWNlLm5leHRdLmluZGV4ID0gKGkpOwkJCVwKKwl0cmFjZS5idWZbdHJhY2UubmV4dF0uYWRkciAgPSAobG9uZykgKGEpOwkJXAorCXRyYWNlLm5leHQgPSAodHJhY2UubmV4dCArIDEpICYgKFRSQUNFX0JVRl9MRU4gLSAxKTsJXAorfQorCisjZWxzZQorIyBkZWZpbmUgVFJBQ0UodywgaSwgYSkKKyNlbmRpZgorCisjaWYgREVCVUdfSVNQMTAyMAorI2RlZmluZSBFTlRFUih4KQlwcmludGsoImlzcDEwMjAgOiBlbnRlcmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgTEVBVkUoeCkJcHJpbnRrKCJpc3AxMDIwIDogbGVhdmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgREVCVUcoeCkJeAorI2Vsc2UKKyNkZWZpbmUgRU5URVIoeCkKKyNkZWZpbmUgTEVBVkUoeCkKKyNkZWZpbmUgREVCVUcoeCkKKyNlbmRpZiAvKiBERUJVR19JU1AxMDIwICovCisKKyNpZiBERUJVR19JU1AxMDIwX0lOVFIKKyNkZWZpbmUgRU5URVJfSU5UUih4KQlwcmludGsoImlzcDEwMjAgOiBlbnRlcmluZyAlcygpXG4iLCB4KTsKKyNkZWZpbmUgTEVBVkVfSU5UUih4KQlwcmludGsoImlzcDEwMjAgOiBsZWF2aW5nICVzKClcbiIsIHgpOworI2RlZmluZSBERUJVR19JTlRSKHgpCXgKKyNlbHNlCisjZGVmaW5lIEVOVEVSX0lOVFIoeCkKKyNkZWZpbmUgTEVBVkVfSU5UUih4KQorI2RlZmluZSBERUJVR19JTlRSKHgpCisjZW5kaWYgLyogREVCVUcgSVNQMTAyMF9JTlRSICovCisKKyNkZWZpbmUgSVNQMTAyMF9SRVZfSUQJMQorCisjZGVmaW5lIE1BWF9UQVJHRVRTCTE2CisjZGVmaW5lIE1BWF9MVU5TCTgKKworLyogaG9zdCBjb25maWd1cmF0aW9uIGFuZCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBIT1NUX0hDQ1IJMHhjMAkvKiBob3N0IGNvbW1hbmQgYW5kIGNvbnRyb2wgKi8KKworLyogcGNpIGJ1cyBpbnRlcmZhY2UgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSV9JRF9MT1cJMHgwMAkvKiB2ZW5kb3IgaWQgKi8KKyNkZWZpbmUgUENJX0lEX0hJR0gJMHgwMgkvKiBkZXZpY2UgaWQgKi8KKyNkZWZpbmUgSVNQX0NGRzAJMHgwNAkvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICMwICovCisjZGVmaW5lICBJU1BfQ0ZHMF9IV01TSyAgMHgwMDBmCS8qIEhhcmR3YXJlIHJldmlzaW9uIG1hc2sgKi8KKyNkZWZpbmUgIElTUF9DRkcwXzEwMjAJIDB4MDAwMSAvKiBJU1AxMDIwICovCisjZGVmaW5lICBJU1BfQ0ZHMF8xMDIwQQkgMHgwMDAyIC8qIElTUDEwMjBBICovCisjZGVmaW5lICBJU1BfQ0ZHMF8xMDQwCSAweDAwMDMgLyogSVNQMTA0MCAqLworI2RlZmluZSAgSVNQX0NGRzBfMTA0MEEJIDB4MDAwNCAvKiBJU1AxMDQwQSAqLworI2RlZmluZSAgSVNQX0NGRzBfMTA0MEIJIDB4MDAwNSAvKiBJU1AxMDQwQiAqLworI2RlZmluZSAgSVNQX0NGRzBfMTA0MEMJIDB4MDAwNiAvKiBJU1AxMDQwQyAqLworI2RlZmluZSBJU1BfQ0ZHMQkweDA2CS8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgIzEgKi8KKyNkZWZpbmUgIElTUF9DRkcxX0YxMjgJIDB4MDA0MAkvKiAxMjgtYnl0ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSAgSVNQX0NGRzFfRjY0CSAweDAwMzAJLyogMTI4LWJ5dGUgRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgIElTUF9DRkcxX0YzMgkgMHgwMDIwCS8qIDEyOC1ieXRlIEZJRk8gdGhyZXNob2xkICovCisjZGVmaW5lICBJU1BfQ0ZHMV9GMTYJIDB4MDAxMAkvKiAxMjgtYnl0ZSBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZSAgSVNQX0NGRzFfQkVOQUIJIDB4MDAwNAkvKiBHbG9iYWwgQnVzIGJ1cnN0IGVuYWJsZSAqLworI2RlZmluZSAgSVNQX0NGRzFfU1hQCSAweDAwMDEJLyogU1hQIHJlZ2lzdGVyIHNlbGVjdCAqLworI2RlZmluZSBQQ0lfSU5URl9DVEwJMHgwOAkvKiBwY2kgaW50ZXJmYWNlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUENJX0lOVEZfU1RTCTB4MGEJLyogcGNpIGludGVyZmFjZSBzdGF0dXMgKi8KKyNkZWZpbmUgUENJX1NFTUFQSE9SRQkweDBjCS8qIHBjaSBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgUENJX05WUkFNCTB4MGUJLyogcGNpIG52cmFtIGludGVyZmFjZSAqLworI2RlZmluZSBDRE1BX0NPTkYJMHgyMAkvKiBDb21tYW5kIERNQSBDb25maWcgKi8KKyNkZWZpbmUgRERNQV9DT05GCTB4NDAJLyogRGF0YSBETUEgQ29uZmlnICovCisjZGVmaW5lICBETUFfQ09ORl9TRU5BQgkgMHgwMDA4CS8qIFNYUCB0byBETUEgRGF0YSBlbmFibGUgKi8KKyNkZWZpbmUgIERNQV9DT05GX1JJUlEJIDB4MDAwNAkvKiBSSVNDIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgIERNQV9DT05GX0JFTkFCCSAweDAwMDIJLyogQnVzIGJ1cnN0IGVuYWJsZSAqLworI2RlZmluZSAgRE1BX0NPTkZfRElSCSAweDAwMDEJLyogRE1BIGRpcmVjdGlvbiAoMD1maWZvLT5ob3N0IDE9aG9zdC0+ZmlmbykgKi8KKworLyogbWFpbGJveCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUJPWDAJCTB4NzAJLyogbWFpbGJveCAwICovCisjZGVmaW5lIE1CT1gxCQkweDcyCS8qIG1haWxib3ggMSAqLworI2RlZmluZSBNQk9YMgkJMHg3NAkvKiBtYWlsYm94IDIgKi8KKyNkZWZpbmUgTUJPWDMJCTB4NzYJLyogbWFpbGJveCAzICovCisjZGVmaW5lIE1CT1g0CQkweDc4CS8qIG1haWxib3ggNCAqLworI2RlZmluZSBNQk9YNQkJMHg3YQkvKiBtYWlsYm94IDUgKi8KKyNkZWZpbmUgTUJPWDYgICAgICAgICAgIDB4N2MgICAgLyogbWFpbGJveCA2ICovCisjZGVmaW5lIE1CT1g3ICAgICAgICAgICAweDdlICAgIC8qIG1haWxib3ggNyAqLworCisvKiBtYWlsYm94IGNvbW1hbmQgY29tcGxldGUgc3RhdHVzIGNvZGVzICovCisjZGVmaW5lIE1CT1hfQ09NTUFORF9DT01QTEVURQkJMHg0MDAwCisjZGVmaW5lIElOVkFMSURfQ09NTUFORAkJCTB4NDAwMQorI2RlZmluZSBIT1NUX0lOVEVSRkFDRV9FUlJPUgkJMHg0MDAyCisjZGVmaW5lIFRFU1RfRkFJTEVECQkJMHg0MDAzCisjZGVmaW5lIENPTU1BTkRfRVJST1IJCQkweDQwMDUKKyNkZWZpbmUgQ09NTUFORF9QQVJBTV9FUlJPUgkJMHg0MDA2CisKKy8qIGFzeW5jIGV2ZW50IHN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBBU1lOQ19TQ1NJX0JVU19SRVNFVAkJMHg4MDAxCisjZGVmaW5lIFNZU1RFTV9FUlJPUgkJCTB4ODAwMgorI2RlZmluZSBSRVFVRVNUX1RSQU5TRkVSX0VSUk9SCQkweDgwMDMKKyNkZWZpbmUgUkVTUE9OU0VfVFJBTlNGRVJfRVJST1IJCTB4ODAwNAorI2RlZmluZSBSRVFVRVNUX1FVRVVFX1dBS0VVUAkJMHg4MDA1CisjZGVmaW5lIEVYRUNVVElPTl9USU1FT1VUX1JFU0VUCQkweDgwMDYKKworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisjZGVmaW5lIElPQ0JfU0VHUyAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDT05USU5VQVRJT05fU0VHUyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUFYX0NPTlRJTlVBVElPTl9FTlRSSUVTICAgICAgICAyNTQKKyNlbHNlCisjZGVmaW5lIElPQ0JfU0VHUyAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDT05USU5VQVRJT05fU0VHUyAgICAgICAgICAgICAgIDcKKyNlbmRpZiAvKiBDT05GSUdfUUxfSVNQX0E2NCAqLworCitzdHJ1Y3QgRW50cnlfaGVhZGVyIHsKKwl1X2NoYXIJZW50cnlfdHlwZTsKKwl1X2NoYXIJZW50cnlfY250OworCXVfY2hhcglzeXNfZGVmXzE7CisJdV9jaGFyCWZsYWdzOworfTsKKworLyogZW50cnkgaGVhZGVyIHR5cGUgY29tbWFuZHMgKi8KKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorI2RlZmluZSBFTlRSWV9DT01NQU5EICAgICAgICAgICA5CisjZGVmaW5lIEVOVFJZX0NPTlRJTlVBVElPTiAgICAgIDB4YQorI2Vsc2UKKyNkZWZpbmUgRU5UUllfQ09NTUFORAkJMQorI2RlZmluZSBFTlRSWV9DT05USU5VQVRJT04JMgorI2VuZGlmIC8qIENPTkZJR19RTF9JU1BfQTY0ICovCisKKyNkZWZpbmUgRU5UUllfU1RBVFVTCQkzCisjZGVmaW5lIEVOVFJZX01BUktFUgkJNAorI2RlZmluZSBFTlRSWV9FWFRFTkRFRF9DT01NQU5ECTUKKworLyogZW50cnkgaGVhZGVyIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRUZMQUdfQ09OVElOVUFUSU9OCTEKKyNkZWZpbmUgRUZMQUdfQlVTWQkJMgorI2RlZmluZSBFRkxBR19CQURfSEVBREVSCTQKKyNkZWZpbmUgRUZMQUdfQkFEX1BBWUxPQUQJOAorCitzdHJ1Y3QgZGF0YXNlZyB7CisJdV9pbnQJCQlkX2Jhc2U7CisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKwl1X2ludCAgICAgICAgICAgICAgICAgICBkX2Jhc2VfaGk7CisjZW5kaWYKKwl1X2ludAkJCWRfY291bnQ7Cit9OworCitzdHJ1Y3QgQ29tbWFuZF9FbnRyeSB7CisJc3RydWN0IEVudHJ5X2hlYWRlcgloZHI7CisJdV9pbnQJCQloYW5kbGU7CisJdV9jaGFyCQkJdGFyZ2V0X2x1bjsKKwl1X2NoYXIJCQl0YXJnZXRfaWQ7CisJdV9zaG9ydAkJCWNkYl9sZW5ndGg7CisJdV9zaG9ydAkJCWNvbnRyb2xfZmxhZ3M7CisJdV9zaG9ydAkJCXJzdmQ7CisJdV9zaG9ydAkJCXRpbWVfb3V0OworCXVfc2hvcnQJCQlzZWdtZW50X2NudDsKKwl1X2NoYXIJCQljZGJbMTJdOworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJdV9pbnQgICAgICAgICAgICAgICAgICAgcnN2ZDE7CisJdV9pbnQgICAgICAgICAgICAgICAgICAgcnN2ZDI7CisjZW5kaWYKKwlzdHJ1Y3QgZGF0YXNlZwkJZGF0YXNlZ1tJT0NCX1NFR1NdOworfTsKKworLyogY29tbWFuZCBlbnRyeSBjb250cm9sIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ0ZMQUdfTk9ESVNDCQkweDAxCisjZGVmaW5lIENGTEFHX0hFQURfVEFHCQkweDAyCisjZGVmaW5lIENGTEFHX09SREVSRURfVEFHCTB4MDQKKyNkZWZpbmUgQ0ZMQUdfU0lNUExFX1RBRwkweDA4CisjZGVmaW5lIENGTEFHX1RBUl9SVE4JCTB4MTAKKyNkZWZpbmUgQ0ZMQUdfUkVBRAkJMHgyMAorI2RlZmluZSBDRkxBR19XUklURQkJMHg0MAorCitzdHJ1Y3QgRXh0X0NvbW1hbmRfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXVfaW50CQkJaGFuZGxlOworCXVfY2hhcgkJCXRhcmdldF9sdW47CisJdV9jaGFyCQkJdGFyZ2V0X2lkOworCXVfc2hvcnQJCQljZGJfbGVuZ3RoOworCXVfc2hvcnQJCQljb250cm9sX2ZsYWdzOworCXVfc2hvcnQJCQlyc3ZkOworCXVfc2hvcnQJCQl0aW1lX291dDsKKwl1X3Nob3J0CQkJc2VnbWVudF9jbnQ7CisJdV9jaGFyCQkJY2RiWzQ0XTsKK307CisKK3N0cnVjdCBDb250aW51YXRpb25fRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworI2lmbmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXVfaW50CQkJcmVzZXJ2ZWQ7CisjZW5kaWYKKwlzdHJ1Y3QgZGF0YXNlZwkJZGF0YXNlZ1tDT05USU5VQVRJT05fU0VHU107Cit9OworCitzdHJ1Y3QgTWFya2VyX0VudHJ5IHsKKwlzdHJ1Y3QgRW50cnlfaGVhZGVyCWhkcjsKKwl1X2ludAkJCXJlc2VydmVkOworCXVfY2hhcgkJCXRhcmdldF9sdW47CisJdV9jaGFyCQkJdGFyZ2V0X2lkOworCXVfY2hhcgkJCW1vZGlmaWVyOworCXVfY2hhcgkJCXJzdmQ7CisJdV9jaGFyCQkJcnN2ZHNbNTJdOworfTsKKworLyogbWFya2VyIGVudHJ5IG1vZGlmaWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNZTkNfREVWSUNFCTAKKyNkZWZpbmUgU1lOQ19UQVJHRVQJMQorI2RlZmluZSBTWU5DX0FMTAkyCisKK3N0cnVjdCBTdGF0dXNfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXVfaW50CQkJaGFuZGxlOworCXVfc2hvcnQJCQlzY3NpX3N0YXR1czsKKwl1X3Nob3J0CQkJY29tcGxldGlvbl9zdGF0dXM7CisJdV9zaG9ydAkJCXN0YXRlX2ZsYWdzOworCXVfc2hvcnQJCQlzdGF0dXNfZmxhZ3M7CisJdV9zaG9ydAkJCXRpbWU7CisJdV9zaG9ydAkJCXJlcV9zZW5zZV9sZW47CisJdV9pbnQJCQlyZXNpZHVhbDsKKwl1X2NoYXIJCQlyc3ZkWzhdOworCXVfY2hhcgkJCXJlcV9zZW5zZV9kYXRhWzMyXTsKK307CisKKy8qIHN0YXR1cyBlbnRyeSBjb21wbGV0aW9uIHN0YXR1cyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDU19DT01QTEVURQkJCTB4MDAwMAorI2RlZmluZSBDU19JTkNPTVBMRVRFCQkJMHgwMDAxCisjZGVmaW5lIENTX0RNQV9FUlJPUgkJCTB4MDAwMgorI2RlZmluZSBDU19UUkFOU1BPUlRfRVJST1IJCTB4MDAwMworI2RlZmluZSBDU19SRVNFVF9PQ0NVUlJFRAkJMHgwMDA0CisjZGVmaW5lIENTX0FCT1JURUQJCQkweDAwMDUKKyNkZWZpbmUgQ1NfVElNRU9VVAkJCTB4MDAwNgorI2RlZmluZSBDU19EQVRBX09WRVJSVU4JCQkweDAwMDcKKyNkZWZpbmUgQ1NfQ09NTUFORF9PVkVSUlVOCQkweDAwMDgKKyNkZWZpbmUgQ1NfU1RBVFVTX09WRVJSVU4JCTB4MDAwOQorI2RlZmluZSBDU19CQURfTUVTU0FHRQkJCTB4MDAwYQorI2RlZmluZSBDU19OT19NRVNTQUdFX09VVAkJMHgwMDBiCisjZGVmaW5lIENTX0VYVF9JRF9GQUlMRUQJCTB4MDAwYworI2RlZmluZSBDU19JREVfTVNHX0ZBSUxFRAkJMHgwMDBkCisjZGVmaW5lIENTX0FCT1JUX01TR19GQUlMRUQJCTB4MDAwZQorI2RlZmluZSBDU19SRUpFQ1RfTVNHX0ZBSUxFRAkJMHgwMDBmCisjZGVmaW5lIENTX05PUF9NU0dfRkFJTEVECQkweDAwMTAKKyNkZWZpbmUgQ1NfUEFSSVRZX0VSUk9SX01TR19GQUlMRUQJMHgwMDExCisjZGVmaW5lIENTX0RFVklDRV9SRVNFVF9NU0dfRkFJTEVECTB4MDAxMgorI2RlZmluZSBDU19JRF9NU0dfRkFJTEVECQkweDAwMTMKKyNkZWZpbmUgQ1NfVU5FWFBfQlVTX0ZSRUUJCTB4MDAxNAorI2RlZmluZSBDU19EQVRBX1VOREVSUlVOCQkweDAwMTUKKworLyogc3RhdHVzIGVudHJ5IHN0YXRlIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0ZfR09UX0JVUwkJCTB4MDEwMAorI2RlZmluZSBTRl9HT1RfVEFSR0VUCQkJMHgwMjAwCisjZGVmaW5lIFNGX1NFTlRfQ0RCCQkJMHgwNDAwCisjZGVmaW5lIFNGX1RSQU5TRkVSUkVEX0RBVEEJCTB4MDgwMAorI2RlZmluZSBTRl9HT1RfU1RBVFVTCQkJMHgxMDAwCisjZGVmaW5lIFNGX0dPVF9TRU5TRQkJCTB4MjAwMAorCisvKiBzdGF0dXMgZW50cnkgc3RhdHVzIGZsYWcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU1RGX0RJU0NPTk5FQ1QJCQkweDAwMDEKKyNkZWZpbmUgU1RGX1NZTkNIUk9OT1VTCQkJMHgwMDAyCisjZGVmaW5lIFNURl9QQVJJVFlfRVJST1IJCTB4MDAwNAorI2RlZmluZSBTVEZfQlVTX1JFU0VUCQkJMHgwMDA4CisjZGVmaW5lIFNURl9ERVZJQ0VfUkVTRVQJCTB4MDAxMAorI2RlZmluZSBTVEZfQUJPUlRFRAkJCTB4MDAyMAorI2RlZmluZSBTVEZfVElNRU9VVAkJCTB4MDA0MAorI2RlZmluZSBTVEZfTkVHT1RJQVRJT04JCQkweDAwODAKKworLyogaW50ZXJmYWNlIGNvbnRyb2wgY29tbWFuZHMgKi8KKyNkZWZpbmUgSVNQX1JFU0VUCQkJMHgwMDAxCisjZGVmaW5lIElTUF9FTl9JTlQJCQkweDAwMDIKKyNkZWZpbmUgSVNQX0VOX1JJU0MJCQkweDAwMDQKKworLyogaG9zdCBjb250cm9sIGNvbW1hbmRzICovCisjZGVmaW5lIEhDQ1JfTk9QCQkJMHgwMDAwCisjZGVmaW5lIEhDQ1JfUkVTRVQJCQkweDEwMDAKKyNkZWZpbmUgSENDUl9QQVVTRQkJCTB4MjAwMAorI2RlZmluZSBIQ0NSX1JFTEVBU0UJCQkweDMwMDAKKyNkZWZpbmUgSENDUl9TSU5HTEVfU1RFUAkJMHg0MDAwCisjZGVmaW5lIEhDQ1JfU0VUX0hPU1RfSU5UUgkJMHg1MDAwCisjZGVmaW5lIEhDQ1JfQ0xFQVJfSE9TVF9JTlRSCQkweDYwMDAKKyNkZWZpbmUgSENDUl9DTEVBUl9SSVNDX0lOVFIJCTB4NzAwMAorI2RlZmluZSBIQ0NSX0JQX0VOQUJMRQkJCTB4ODAwMAorI2RlZmluZSBIQ0NSX0JJT1NfRElTQUJMRQkJMHg5MDAwCisjZGVmaW5lIEhDQ1JfVEVTVF9NT0RFCQkJMHhmMDAwCisKKyNkZWZpbmUgUklTQ19CVVNZCQkJMHgwMDA0CisKKy8qIG1haWxib3ggY29tbWFuZHMgKi8KKyNkZWZpbmUgTUJPWF9OT19PUAkJCTB4MDAwMAorI2RlZmluZSBNQk9YX0xPQURfUkFNCQkJMHgwMDAxCisjZGVmaW5lIE1CT1hfRVhFQ19GSVJNV0FSRQkJMHgwMDAyCisjZGVmaW5lIE1CT1hfRFVNUF9SQU0JCQkweDAwMDMKKyNkZWZpbmUgTUJPWF9XUklURV9SQU1fV09SRAkJMHgwMDA0CisjZGVmaW5lIE1CT1hfUkVBRF9SQU1fV09SRAkJMHgwMDA1CisjZGVmaW5lIE1CT1hfTUFJTEJPWF9SRUdfVEVTVAkJMHgwMDA2CisjZGVmaW5lIE1CT1hfVkVSSUZZX0NIRUNLU1VNCQkweDAwMDcKKyNkZWZpbmUgTUJPWF9BQk9VVF9GSVJNV0FSRQkJMHgwMDA4CisjZGVmaW5lIE1CT1hfQ0hFQ0tfRklSTVdBUkUJCTB4MDAwZQorI2RlZmluZSBNQk9YX0lOSVRfUkVRX1FVRVVFCQkweDAwMTAKKyNkZWZpbmUgTUJPWF9JTklUX1JFU19RVUVVRQkJMHgwMDExCisjZGVmaW5lIE1CT1hfRVhFQ1VURV9JT0NCCQkweDAwMTIKKyNkZWZpbmUgTUJPWF9XQUtFX1VQCQkJMHgwMDEzCisjZGVmaW5lIE1CT1hfU1RPUF9GSVJNV0FSRQkJMHgwMDE0CisjZGVmaW5lIE1CT1hfQUJPUlQJCQkweDAwMTUKKyNkZWZpbmUgTUJPWF9BQk9SVF9ERVZJQ0UJCTB4MDAxNgorI2RlZmluZSBNQk9YX0FCT1JUX1RBUkdFVAkJMHgwMDE3CisjZGVmaW5lIE1CT1hfQlVTX1JFU0VUCQkJMHgwMDE4CisjZGVmaW5lIE1CT1hfU1RPUF9RVUVVRQkJCTB4MDAxOQorI2RlZmluZSBNQk9YX1NUQVJUX1FVRVVFCQkweDAwMWEKKyNkZWZpbmUgTUJPWF9TSU5HTEVfU1RFUF9RVUVVRQkJMHgwMDFiCisjZGVmaW5lIE1CT1hfQUJPUlRfUVVFVUUJCTB4MDAxYworI2RlZmluZSBNQk9YX0dFVF9ERVZfUVVFVUVfU1RBVFVTCTB4MDAxZAorI2RlZmluZSBNQk9YX0dFVF9GSVJNV0FSRV9TVEFUVVMJMHgwMDFmCisjZGVmaW5lIE1CT1hfR0VUX0lOSVRfU0NTSV9JRAkJMHgwMDIwCisjZGVmaW5lIE1CT1hfR0VUX1NFTEVDVF9USU1FT1VUCQkweDAwMjEKKyNkZWZpbmUgTUJPWF9HRVRfUkVUUllfQ09VTlQJCTB4MDAyMgorI2RlZmluZSBNQk9YX0dFVF9UQUdfQUdFX0xJTUlUCQkweDAwMjMKKyNkZWZpbmUgTUJPWF9HRVRfQ0xPQ0tfUkFURQkJMHgwMDI0CisjZGVmaW5lIE1CT1hfR0VUX0FDVF9ORUdfU1RBVEUJCTB4MDAyNQorI2RlZmluZSBNQk9YX0dFVF9BU1lOQ19EQVRBX1NFVFVQX1RJTUUJMHgwMDI2CisjZGVmaW5lIE1CT1hfR0VUX1BDSV9QQVJBTVMJCTB4MDAyNworI2RlZmluZSBNQk9YX0dFVF9UQVJHRVRfUEFSQU1TCQkweDAwMjgKKyNkZWZpbmUgTUJPWF9HRVRfREVWX1FVRVVFX1BBUkFNUwkweDAwMjkKKyNkZWZpbmUgTUJPWF9TRVRfSU5JVF9TQ1NJX0lECQkweDAwMzAKKyNkZWZpbmUgTUJPWF9TRVRfU0VMRUNUX1RJTUVPVVQJCTB4MDAzMQorI2RlZmluZSBNQk9YX1NFVF9SRVRSWV9DT1VOVAkJMHgwMDMyCisjZGVmaW5lIE1CT1hfU0VUX1RBR19BR0VfTElNSVQJCTB4MDAzMworI2RlZmluZSBNQk9YX1NFVF9DTE9DS19SQVRFCQkweDAwMzQKKyNkZWZpbmUgTUJPWF9TRVRfQUNUSVZFX05FR19TVEFURQkweDAwMzUKKyNkZWZpbmUgTUJPWF9TRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FCTB4MDAzNgorI2RlZmluZSBNQk9YX1NFVF9QQ0lfQ09OVFJPTF9QQVJBTVMJMHgwMDM3CisjZGVmaW5lIE1CT1hfU0VUX1RBUkdFVF9QQVJBTVMJCTB4MDAzOAorI2RlZmluZSBNQk9YX1NFVF9ERVZfUVVFVUVfUEFSQU1TCTB4MDAzOQorI2RlZmluZSBNQk9YX1JFVFVSTl9CSU9TX0JMT0NLX0FERFIJMHgwMDQwCisjZGVmaW5lIE1CT1hfV1JJVEVfRk9VUl9SQU1fV09SRFMJMHgwMDQxCisjZGVmaW5lIE1CT1hfRVhFQ19CSU9TX0lPQ0IJCTB4MDA0MgorCisjaWZkZWYgQ09ORklHX1FMX0lTUF9BNjQKKyNkZWZpbmUgTUJPWF9DTURfSU5JVF9SRVFVRVNUX1FVRVVFXzY0ICAgICAgMHgwMDUyCisjZGVmaW5lIE1CT1hfQ01EX0lOSVRfUkVTUE9OU0VfUVVFVUVfNjQgICAgIDB4MDA1MworI2VuZGlmIC8qIENPTkZJR19RTF9JU1BfQTY0ICovCisKKyNpbmNsdWRlICJxbG9naWNpc3BfYXNtLmMiCisKKyNkZWZpbmUgUEFDS0IoYSwgYikJCQkoKChhKTw8NCl8KGIpKQorCitzdGF0aWMgY29uc3QgdV9jaGFyIG1ib3hfcGFyYW1bXSA9IHsKKwlQQUNLQigxLCAxKSwJLyogTUJPWF9OT19PUCAqLworCVBBQ0tCKDUsIDUpLAkvKiBNQk9YX0xPQURfUkFNICovCisJUEFDS0IoMiwgMCksCS8qIE1CT1hfRVhFQ19GSVJNV0FSRSAqLworCVBBQ0tCKDUsIDUpLAkvKiBNQk9YX0RVTVBfUkFNICovCisJUEFDS0IoMywgMyksCS8qIE1CT1hfV1JJVEVfUkFNX1dPUkQgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9SRUFEX1JBTV9XT1JEICovCisJUEFDS0IoNiwgNiksCS8qIE1CT1hfTUFJTEJPWF9SRUdfVEVTVCAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX1ZFUklGWV9DSEVDS1NVTQkqLworCVBBQ0tCKDEsIDMpLAkvKiBNQk9YX0FCT1VUX0ZJUk1XQVJFICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwOSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMGEgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBiICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwYyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMGQgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9DSEVDS19GSVJNV0FSRSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMGYgKi8KKwlQQUNLQig1LCA1KSwJLyogTUJPWF9JTklUX1JFUV9RVUVVRSAqLworCVBBQ0tCKDYsIDYpLAkvKiBNQk9YX0lOSVRfUkVTX1FVRVVFICovCisJUEFDS0IoNCwgNCksCS8qIE1CT1hfRVhFQ1VURV9JT0NCICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfV0FLRV9VUAkqLworCVBBQ0tCKDEsIDYpLAkvKiBNQk9YX1NUT1BfRklSTVdBUkUgKi8KKwlQQUNLQig0LCA0KSwJLyogTUJPWF9BQk9SVCAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX0FCT1JUX0RFVklDRSAqLworCVBBQ0tCKDMsIDMpLAkvKiBNQk9YX0FCT1JUX1RBUkdFVCAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX0JVU19SRVNFVCAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX1NUT1BfUVVFVUUgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9TVEFSVF9RVUVVRSAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX1NJTkdMRV9TVEVQX1FVRVVFICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfQUJPUlRfUVVFVUUgKi8KKwlQQUNLQigyLCA0KSwJLyogTUJPWF9HRVRfREVWX1FVRVVFX1NUQVRVUyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMWUgKi8KKwlQQUNLQigxLCAzKSwJLyogTUJPWF9HRVRfRklSTVdBUkVfU1RBVFVTICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX0lOSVRfU0NTSV9JRCAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9TRUxFQ1RfVElNRU9VVCAqLworCVBBQ0tCKDEsIDMpLAkvKiBNQk9YX0dFVF9SRVRSWV9DT1VOVAkqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9UQUdfQUdFX0xJTUlUICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX0NMT0NLX1JBVEUgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfQUNUX05FR19TVEFURSAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9BU1lOQ19EQVRBX1NFVFVQX1RJTUUgKi8KKwlQQUNLQigxLCAzKSwJLyogTUJPWF9HRVRfUENJX1BBUkFNUyAqLworCVBBQ0tCKDIsIDQpLAkvKiBNQk9YX0dFVF9UQVJHRVRfUEFSQU1TICovCisJUEFDS0IoMiwgNCksCS8qIE1CT1hfR0VUX0RFVl9RVUVVRV9QQVJBTVMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJhICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyYiAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJkICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyZSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmYgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfSU5JVF9TQ1NJX0lEICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX1NFTEVDVF9USU1FT1VUICovCisJUEFDS0IoMywgMyksCS8qIE1CT1hfU0VUX1JFVFJZX0NPVU5UCSovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX1RBR19BR0VfTElNSVQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfQ0xPQ0tfUkFURSAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9BQ1RJVkVfTkVHX1NUQVRFICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX0FTWU5DX0RBVEFfU0VUVVBfVElNRSAqLworCVBBQ0tCKDMsIDMpLAkvKiBNQk9YX1NFVF9QQ0lfQ09OVFJPTF9QQVJBTVMgKi8KKwlQQUNLQig0LCA0KSwJLyogTUJPWF9TRVRfVEFSR0VUX1BBUkFNUyAqLworCVBBQ0tCKDQsIDQpLAkvKiBNQk9YX1NFVF9ERVZfUVVFVUVfUEFSQU1TICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzYSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2IgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNjICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzZCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2UgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNmICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfUkVUVVJOX0JJT1NfQkxPQ0tfQUREUiAqLworCVBBQ0tCKDYsIDEpLAkvKiBNQk9YX1dSSVRFX0ZPVVJfUkFNX1dPUkRTICovCisJUEFDS0IoMiwgMykJLyogTUJPWF9FWEVDX0JJT1NfSU9DQiAqLworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJLFBBQ0tCKDAsIDApLAkvKiAweDAwNDMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDQ0ICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0NSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNDYgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDQ3ICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0OCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNDkgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDRhICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0YiAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNGMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDRkICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0ZSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNGYgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDUwICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA1MSAqLworCVBBQ0tCKDgsIDgpLAkvKiBNQk9YX0NNRF9JTklUX1JFUVVFU1RfUVVFVUVfNjQgKDB4MDA1MikgKi8KKwlQQUNLQig4LCA4KQkvKiBNQk9YX0NNRF9JTklUX1JFU1BPTlNFX1FVRVVFXzY0ICgweDAwNTMpICovCisjZW5kaWYgLyogQ09ORklHX1FMX0lTUF9BNjQgKi8KK307CisKKyNkZWZpbmUgTUFYX01CT1hfQ09NTUFORAkoc2l6ZW9mKG1ib3hfcGFyYW0pL3NpemVvZih1X3Nob3J0KSkKKworc3RydWN0IGhvc3RfcGFyYW0geworCXVfc2hvcnQJCWZpZm9fdGhyZXNob2xkOworCXVfc2hvcnQJCWhvc3RfYWRhcHRlcl9lbmFibGU7CisJdV9zaG9ydAkJaW5pdGlhdG9yX3Njc2lfaWQ7CisJdV9zaG9ydAkJYnVzX3Jlc2V0X2RlbGF5OworCXVfc2hvcnQJCXJldHJ5X2NvdW50OworCXVfc2hvcnQJCXJldHJ5X2RlbGF5OworCXVfc2hvcnQJCWFzeW5jX2RhdGFfc2V0dXBfdGltZTsKKwl1X3Nob3J0CQlyZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbjsKKwl1X3Nob3J0CQlkYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uOworCXVfc2hvcnQJCWRhdGFfZG1hX2J1cnN0X2VuYWJsZTsKKwl1X3Nob3J0CQljb21tYW5kX2RtYV9idXJzdF9lbmFibGU7CisJdV9zaG9ydAkJdGFnX2FnaW5nOworCXVfc2hvcnQJCXNlbGVjdGlvbl90aW1lb3V0OworCXVfc2hvcnQJCW1heF9xdWV1ZV9kZXB0aDsKK307CisKKy8qCisgKiBEZXZpY2UgRmxhZ3M6CisgKgorICogQml0ICBOYW1lCisgKiAtLS0tLS0tLS0KKyAqICA3ICAgRGlzY29ubmVjdCBQcml2aWxlZ2UKKyAqICA2ICAgUGFyaXR5IENoZWNraW5nCisgKiAgNSAgIFdpZGUgRGF0YSBUcmFuc2ZlcnMKKyAqICA0ICAgU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlcnMKKyAqICAzICAgVGFnZ2VkIFF1ZXVpbmcKKyAqICAyICAgQXV0b21hdGljIFJlcXVlc3QgU2Vuc2UKKyAqICAxICAgU3RvcCBRdWV1ZSBvbiBDaGVjayBDb25kaXRpb24KKyAqICAwICAgUmVuZWdvdGlhdGUgb24gRXJyb3IKKyAqLworCitzdHJ1Y3QgZGV2X3BhcmFtIHsKKwl1X3Nob3J0CQlkZXZpY2VfZmxhZ3M7CisJdV9zaG9ydAkJZXhlY3V0aW9uX3Rocm90dGxlOworCXVfc2hvcnQJCXN5bmNocm9ub3VzX3BlcmlvZDsKKwl1X3Nob3J0CQlzeW5jaHJvbm91c19vZmZzZXQ7CisJdV9zaG9ydAkJZGV2aWNlX2VuYWJsZTsKKwl1X3Nob3J0CQlyZXNlcnZlZDsgLyogcGFkICovCit9OworCisvKgorICogVGhlIHJlc3VsdCBxdWV1ZSBjYW4gYmUgcXVpdGUgYSBiaXQgc21hbGxlciBzaW5jZSBjb250aW51YXRpb24gZW50cmllcworICogZG8gbm90IHNob3cgdXAgdGhlcmU6CisgKi8KKyNkZWZpbmUgUkVTX1FVRVVFX0xFTgkJKChRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiArIDEpIC8gOCAtIDEpCisjZGVmaW5lIFFVRVVFX0VOVFJZX0xFTgkJNjQKKyNkZWZpbmUgUVNJWkUoZW50cmllcykgICgoKGVudHJpZXMpICsgMSkgKiBRVUVVRV9FTlRSWV9MRU4pCisKK3N0cnVjdCBpc3BfcXVldWVfZW50cnkgeworCWNoYXIgX19vcGFxdWVbUVVFVUVfRU5UUllfTEVOXTsKK307CisKK3N0cnVjdCBpc3AxMDIwX2hvc3RkYXRhIHsKKwl2b2lkIF9faW9tZW0gKm1lbWFkZHI7CisJdV9jaGFyCXJldmlzaW9uOworCXN0cnVjdAlob3N0X3BhcmFtIGhvc3RfcGFyYW07CisJc3RydWN0CWRldl9wYXJhbSBkZXZfcGFyYW1bTUFYX1RBUkdFVFNdOworCXN0cnVjdAlwY2lfZGV2ICpwY2lfZGV2OworCQorCXN0cnVjdCBpc3BfcXVldWVfZW50cnkgKnJlc19jcHU7IC8qIENQVS1zaWRlIGFkZHJlc3Mgb2YgcmVzcG9uc2UgcXVldWUuICovCisJc3RydWN0IGlzcF9xdWV1ZV9lbnRyeSAqcmVxX2NwdTsgLyogQ1BVLXNpemUgYWRkcmVzcyBvZiByZXF1ZXN0IHF1ZXVlLiAqLworCisJLyogcmVzdWx0IGFuZCByZXF1ZXN0IHF1ZXVlcyAoc2hhcmVkIHdpdGggaXNwMTAyMCk6ICovCisJdV9pbnQJcmVxX2luX3B0cjsJCS8qIGluZGV4IG9mIG5leHQgcmVxdWVzdCBzbG90ICovCisJdV9pbnQJcmVzX291dF9wdHI7CQkvKiBpbmRleCBvZiBuZXh0IHJlc3VsdCBzbG90ICovCisKKwkvKiB0aGlzIGlzIGhlcmUgc28gdGhlIHF1ZXVlcyBhcmUgbmljZWx5IGFsaWduZWQgKi8KKwlsb25nCXNlbmRfbWFya2VyOwkJLyogZG8gd2UgbmVlZCB0byBzZW5kIGEgbWFya2VyPyAqLworCisJLyogVGhlIGNtZC0+aGFuZGxlIGhhcyBhIGZpeGVkIHNpemUsIGFuZCBpcyBvbmx5IDMyLWJpdHMuICBXZQorCSAqIG5lZWQgdG8gdGFrZSBjYXJlIHRvIGhhbmRsZSA2NC1iaXQgc3lzdGVtcyBjb3JyZWN0bHkgdGh1cyB3aGF0CisJICogd2UgYWN0dWFsbHkgcGxhY2UgaW4gY21kLT5oYW5kbGUgaXMgYW4gaW5kZXggdG8gdGhlIGZvbGxvd2luZworCSAqIHRhYmxlLiAgS3Vkb3MgdG8gTWF0dCBKYWNvYiBmb3IgdGhlIHRlY2huaXF1ZS4gIC1EYXZlTQorCSAqLworCVNjc2lfQ21uZCAqY21kX3Nsb3RzW1FMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOICsgMV07CisKKwlkbWFfYWRkcl90IHJlc19kbWE7CS8qIFBDSSBzaWRlIHZpZXcgb2YgcmVzcG9uc2UgcXVldWUgKi8KKwlkbWFfYWRkcl90IHJlcV9kbWE7CS8qIFBDSSBzaWRlIHZpZXcgb2YgcmVxdWVzdCBxdWV1ZSAqLworfTsKKworLyogcXVldWUgbGVuZ3RoJ3MgX211c3RfIGJlIHBvd2VyIG9mIHR3bzogKi8KKyNkZWZpbmUgUVVFVUVfREVQVEgoaW4sIG91dCwgcWwpCSgoaW4gLSBvdXQpICYgKHFsKSkKKyNkZWZpbmUgUkVRX1FVRVVFX0RFUFRIKGluLCBvdXQpCVFVRVVFX0RFUFRIKGluLCBvdXQsIAkJICAgICBcCisJCQkJCQkgICAgUUxPR0lDSVNQX1JFUV9RVUVVRV9MRU4pCisjZGVmaW5lIFJFU19RVUVVRV9ERVBUSChpbiwgb3V0KQlRVUVVRV9ERVBUSChpbiwgb3V0LCBSRVNfUVVFVUVfTEVOKQorCitzdGF0aWMgdm9pZAlpc3AxMDIwX2VuYWJsZV9pcnFzKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgdm9pZAlpc3AxMDIwX2Rpc2FibGVfaXJxcyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludAlpc3AxMDIwX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQJaXNwMTAyMF9yZXNldF9oYXJkd2FyZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludAlpc3AxMDIwX3NldF9kZWZhdWx0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludAlpc3AxMDIwX2xvYWRfcGFyYW1ldGVycyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludAlpc3AxMDIwX21ib3hfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVfc2hvcnQgW10pOyAKK3N0YXRpYyBpbnQJaXNwMTAyMF9yZXR1cm5fc3RhdHVzKHN0cnVjdCBTdGF0dXNfRW50cnkgKik7CitzdGF0aWMgdm9pZAlpc3AxMDIwX2ludHJfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZG9faXNwMTAyMF9pbnRyX2hhbmRsZXIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCisjaWYgVVNFX05WUkFNX0RFRkFVTFRTCitzdGF0aWMgaW50CWlzcDEwMjBfZ2V0X2RlZmF1bHRzKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50CWlzcDEwMjBfdmVyaWZ5X252cmFtKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgdV9zaG9ydAlpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHVfc2hvcnQpOworI2VuZGlmCisKKyNpZiBERUJVR19JU1AxMDIwCitzdGF0aWMgdm9pZAlpc3AxMDIwX3ByaW50X3Njc2lfY21kKFNjc2lfQ21uZCAqKTsKKyNlbmRpZgorI2lmIERFQlVHX0lTUDEwMjBfSU5UUgorc3RhdGljIHZvaWQJaXNwMTAyMF9wcmludF9zdGF0dXNfZW50cnkoc3RydWN0IFN0YXR1c19FbnRyeSAqKTsKKyNlbmRpZgorCisvKiBtZW1hZGRyIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBtZW1tYXBwZWQgcG9ydCBpL28gaXMgYmVpbmcgdXNlZAorICogbm9uLW51bGwgbWVtYWRkciA9PSBtbWFwJ2QKKyAqIEpWIDctSmFuLTIwMDAKKyAqLworc3RhdGljIGlubGluZSB1X3Nob3J0IGlzcF9pbncoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmggPSAoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoaC0+bWVtYWRkcikKKwkJcmV0dXJuIHJlYWR3KGgtPm1lbWFkZHIgKyBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIGludyhob3N0LT5pb19wb3J0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcF9vdXR3KHVfc2hvcnQgdmFsLCBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaCA9IChzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKWhvc3QtPmhvc3RkYXRhOworCWlmIChoLT5tZW1hZGRyKQorCQl3cml0ZXcodmFsLCBoLT5tZW1hZGRyICsgb2Zmc2V0KTsKKwllbHNlCisJCW91dHcodmFsLCBob3N0LT5pb19wb3J0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcDEwMjBfZW5hYmxlX2lycXMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlpc3Bfb3V0dyhJU1BfRU5fSU5UfElTUF9FTl9SSVNDLCBob3N0LCBQQ0lfSU5URl9DVEwpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMDIwX2Rpc2FibGVfaXJxcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCWlzcF9vdXR3KDB4MCwgaG9zdCwgUENJX0lOVEZfQ1RMKTsKK30KKworCitzdGF0aWMgaW50IGlzcDEwMjBfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdG1wdCkKK3sKKwlpbnQgaG9zdHMgPSAwOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKmhvc3RkYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworCUVOVEVSKCJpc3AxMDIwX2RldGVjdCIpOworCisJdG1wdC0+cHJvY19uYW1lID0gImlzcDEwMjAiOworCisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDIwLCBwZGV2KSkpCisJeworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCQljb250aW51ZTsKKworCQlob3N0ID0gc2NzaV9yZWdpc3Rlcih0bXB0LCBzaXplb2Yoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEpKTsKKwkJaWYgKCFob3N0KQorCQkJY29udGludWU7CisKKwkJaG9zdGRhdGEgPSAoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisKKwkJbWVtc2V0KGhvc3RkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEpKTsKKworCQlob3N0ZGF0YS0+cGNpX2RldiA9IHBkZXY7CisJCXNjc2lfc2V0X2RldmljZShob3N0LCAmcGRldi0+ZGV2KTsKKworCQlpZiAoaXNwMTAyMF9pbml0KGhvc3QpKQorCQkJZ290byBmYWlsX2FuZF91bnJlZ2lzdGVyOworCisJCWlmIChpc3AxMDIwX3Jlc2V0X2hhcmR3YXJlKGhvc3QpCisjaWYgVVNFX05WUkFNX0RFRkFVTFRTCisJCSAgICB8fCBpc3AxMDIwX2dldF9kZWZhdWx0cyhob3N0KQorI2Vsc2UKKwkJICAgIHx8IGlzcDEwMjBfc2V0X2RlZmF1bHRzKGhvc3QpCisjZW5kaWYgLyogVVNFX05WUkFNX0RFRkFVTFRTICovCisJCSAgICB8fCBpc3AxMDIwX2xvYWRfcGFyYW1ldGVycyhob3N0KSkgeworCQkJZ290byBmYWlsX3VuaW5pdDsKKwkJfQorCisJCWhvc3QtPnRoaXNfaWQgPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5pbml0aWF0b3Jfc2NzaV9pZDsKKwkJaG9zdC0+bWF4X3NlY3RvcnMgPSA2NDsKKworCQlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCBkb19pc3AxMDIwX2ludHJfaGFuZGxlciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJCQkJInFsb2dpY2lzcCIsIGhvc3QpKQorCQl7CisJCQlwcmludGsoInFsb2dpY2lzcCA6IGludGVycnVwdCAlZCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCSAgICAgICBob3N0LT5pcnEpOworCQkJZ290byBmYWlsX3VuaW5pdDsKKwkJfQorCisJCWlzcF9vdXR3KDB4MCwgaG9zdCwgUENJX1NFTUFQSE9SRSk7CisJCWlzcF9vdXR3KEhDQ1JfQ0xFQVJfUklTQ19JTlRSLCBob3N0LCBIT1NUX0hDQ1IpOworCQlpc3AxMDIwX2VuYWJsZV9pcnFzKGhvc3QpOworCisJCWhvc3RzKys7CisJCWNvbnRpbnVlOworCisJZmFpbF91bmluaXQ6CisJCWlvdW5tYXAoaG9zdGRhdGEtPm1lbWFkZHIpOworCQlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmKTsKKwlmYWlsX2FuZF91bnJlZ2lzdGVyOgorCQlpZiAoaG9zdGRhdGEtPnJlc19jcHUpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkgICAgUVNJWkUoUkVTX1FVRVVFX0xFTiksCisJCQkJCSAgICBob3N0ZGF0YS0+cmVzX2NwdSwKKwkJCQkJICAgIGhvc3RkYXRhLT5yZXNfZG1hKTsKKwkJaWYgKGhvc3RkYXRhLT5yZXFfY3B1KQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkJICAgIFFTSVpFKFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOKSwKKwkJCQkJICAgIGhvc3RkYXRhLT5yZXFfY3B1LAorCQkJCQkgICAgaG9zdGRhdGEtPnJlcV9kbWEpOworCQlzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisJfQorCisJTEVBVkUoImlzcDEwMjBfZGV0ZWN0Iik7CisKKwlyZXR1cm4gaG9zdHM7Cit9CisKKworc3RhdGljIGludCBpc3AxMDIwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisKKwlFTlRFUigiaXNwMTAyMF9yZWxlYXNlIik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCWlzcF9vdXR3KDB4MCwgaG9zdCwgUENJX0lOVEZfQ1RMKTsKKwlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCisJaW91bm1hcChob3N0ZGF0YS0+bWVtYWRkcik7CisKKwlyZWxlYXNlX3JlZ2lvbihob3N0LT5pb19wb3J0LCAweGZmKTsKKworCUxFQVZFKCJpc3AxMDIwX3JlbGVhc2UiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICppc3AxMDIwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdGF0aWMgY2hhciBidWZbODBdOworCXN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICpob3N0ZGF0YTsKKworCUVOVEVSKCJpc3AxMDIwX2luZm8iKTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCXNwcmludGYoYnVmLAorCQkiUUxvZ2ljIElTUDEwMjAgU0NTSSBvbiBQQ0kgYnVzICUwMnggZGV2aWNlICUwMnggaXJxICVkICVzIGJhc2UgMHglbHgiLAorCQlob3N0ZGF0YS0+cGNpX2Rldi0+YnVzLT5udW1iZXIsIGhvc3RkYXRhLT5wY2lfZGV2LT5kZXZmbiwgaG9zdC0+aXJxLAorCQkoaG9zdGRhdGEtPm1lbWFkZHIgPyAiTUVNIiA6ICJJL08iKSwKKwkJKGhvc3RkYXRhLT5tZW1hZGRyID8gKHVuc2lnbmVkIGxvbmcpaG9zdGRhdGEtPm1lbWFkZHIgOiBob3N0LT5pb19wb3J0KSk7CisKKwlMRUFWRSgiaXNwMTAyMF9pbmZvIik7CisKKwlyZXR1cm4gYnVmOworfQorCisKKy8qCisgKiBUaGUgbWlkZGxlIFNDU0kgbGF5ZXIgZW5zdXJlcyB0aGF0IHF1ZXVlY29tbWFuZCBuZXZlciBnZXRzIGludm9rZWQKKyAqIGNvbmN1cnJlbnRseSB3aXRoIGl0c2VsZiBvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKHRob3VnaCB0aGUKKyAqIGludGVycnVwdCBoYW5kbGVyIG1heSBjYWxsIHRoaXMgcm91dGluZSBhcyBwYXJ0IG9mCisgKiByZXF1ZXN0LWNvbXBsZXRpb24gaGFuZGxpbmcpLgorICovCitzdGF0aWMgaW50IGlzcDEwMjBfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqQ21uZCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKwlpbnQgaSwgbiwgbnVtX2ZyZWU7CisJdV9pbnQgaW5fcHRyLCBvdXRfcHRyOworCXN0cnVjdCBkYXRhc2VnICogZHM7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqY21kOworCXN0cnVjdCBDb250aW51YXRpb25fRW50cnkgKmNvbnQ7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJZG1hX2FkZHJfdAlkbWFfYWRkcjsKKworCUVOVEVSKCJpc3AxMDIwX3F1ZXVlY29tbWFuZCIpOworCisJaG9zdCA9IENtbmQtPmRldmljZS0+aG9zdDsKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlDbW5kLT5zY3NpX2RvbmUgPSBkb25lOworCisJREVCVUcoaXNwMTAyMF9wcmludF9zY3NpX2NtZChDbW5kKSk7CisKKwlvdXRfcHRyID0gaXNwX2ludyhob3N0LCArIE1CT1g0KTsKKwlpbl9wdHIgID0gaG9zdGRhdGEtPnJlcV9pbl9wdHI7CisKKwlERUJVRyhwcmludGsoInFsb2dpY2lzcCA6IHJlcXVlc3QgcXVldWUgZGVwdGggJWRcbiIsCisJCSAgICAgUkVRX1FVRVVFX0RFUFRIKGluX3B0ciwgb3V0X3B0cikpKTsKKworCWNtZCA9IChzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqKSAmaG9zdGRhdGEtPnJlcV9jcHVbaW5fcHRyXTsKKwlpbl9wdHIgPSAoaW5fcHRyICsgMSkgJiBRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTjsKKwlpZiAoaW5fcHRyID09IG91dF9wdHIpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiByZXF1ZXN0IHF1ZXVlIG92ZXJmbG93XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGhvc3RkYXRhLT5zZW5kX21hcmtlcikgeworCQlzdHJ1Y3QgTWFya2VyX0VudHJ5ICptYXJrZXI7CisKKwkJVFJBQ0UoInF1ZXVlIG1hcmtlciIsIGluX3B0ciwgMCk7CisKKwkJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiBhZGRpbmcgbWFya2VyIGVudHJ5XG4iKSk7CisJCW1hcmtlciA9IChzdHJ1Y3QgTWFya2VyX0VudHJ5ICopIGNtZDsKKwkJbWVtc2V0KG1hcmtlciwgMCwgc2l6ZW9mKHN0cnVjdCBNYXJrZXJfRW50cnkpKTsKKworCQltYXJrZXItPmhkci5lbnRyeV90eXBlID0gRU5UUllfTUFSS0VSOworCQltYXJrZXItPmhkci5lbnRyeV9jbnQgPSAxOworCQltYXJrZXItPm1vZGlmaWVyID0gU1lOQ19BTEw7CisKKwkJaG9zdGRhdGEtPnNlbmRfbWFya2VyID0gMDsKKworCQlpZiAoKChpbl9wdHIgKyAxKSAmIFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOKSA9PSBvdXRfcHRyKSB7CisJCQlpc3Bfb3V0dyhpbl9wdHIsIGhvc3QsIE1CT1g0KTsKKwkJCWhvc3RkYXRhLT5yZXFfaW5fcHRyID0gaW5fcHRyOworCQkJcHJpbnRrKCJxbG9naWNpc3AgOiByZXF1ZXN0IHF1ZXVlIG92ZXJmbG93XG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWNtZCA9IChzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqKSAmaG9zdGRhdGEtPnJlcV9jcHVbaW5fcHRyXTsKKwkJaW5fcHRyID0gKGluX3B0ciArIDEpICYgUUxPR0lDSVNQX1JFUV9RVUVVRV9MRU47CisJfQorCisJVFJBQ0UoInF1ZXVlIGNvbW1hbmQiLCBpbl9wdHIsIENtbmQpOworCisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBDb21tYW5kX0VudHJ5KSk7CisKKwljbWQtPmhkci5lbnRyeV90eXBlID0gRU5UUllfQ09NTUFORDsKKwljbWQtPmhkci5lbnRyeV9jbnQgPSAxOworCisJY21kLT50YXJnZXRfbHVuID0gQ21uZC0+ZGV2aWNlLT5sdW47CisJY21kLT50YXJnZXRfaWQgPSBDbW5kLT5kZXZpY2UtPmlkOworCWNtZC0+Y2RiX2xlbmd0aCA9IGNwdV90b19sZTE2KENtbmQtPmNtZF9sZW4pOworCWNtZC0+Y29udHJvbF9mbGFncyA9IGNwdV90b19sZTE2KENGTEFHX1JFQUQgfCBDRkxBR19XUklURSk7CisJY21kLT50aW1lX291dCA9IGNwdV90b19sZTE2KDMwKTsKKworCW1lbWNweShjbWQtPmNkYiwgQ21uZC0+Y21uZCwgQ21uZC0+Y21kX2xlbik7CisKKwlpZiAoQ21uZC0+dXNlX3NnKSB7CisJCWludCBzZ19jb3VudDsKKworCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgQ21uZC0+cmVxdWVzdF9idWZmZXI7CisJCWRzID0gY21kLT5kYXRhc2VnOworCisJCXNnX2NvdW50ID0gcGNpX21hcF9zZyhob3N0ZGF0YS0+cGNpX2Rldiwgc2csIENtbmQtPnVzZV9zZywKKwkJCQkgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisKKwkJY21kLT5zZWdtZW50X2NudCA9IGNwdV90b19sZTE2KHNnX2NvdW50KTsKKworCQkvKiBmaWxsIGluIGZpcnN0IGZvdXIgc2cgZW50cmllczogKi8KKwkJbiA9IHNnX2NvdW50OworCQlpZiAobiA+IElPQ0JfU0VHUykKKwkJCW4gPSBJT0NCX1NFR1M7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWRtYV9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQkJZHNbaV0uZF9iYXNlICA9IGNwdV90b19sZTMyKCh1MzIpIGRtYV9hZGRyKTsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCQkJZHNbaV0uZF9iYXNlX2hpID0gY3B1X3RvX2xlMzIoKHUzMikgKGRtYV9hZGRyPj4zMikpOworI2VuZGlmIC8qIENPTkZJR19RTF9JU1BfQTY0ICovCisJCQlkc1tpXS5kX2NvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJKytzZzsKKwkJfQorCQlzZ19jb3VudCAtPSBJT0NCX1NFR1M7CisKKwkJd2hpbGUgKHNnX2NvdW50ID4gMCkgeworCQkJKytjbWQtPmhkci5lbnRyeV9jbnQ7CisJCQljb250ID0gKHN0cnVjdCBDb250aW51YXRpb25fRW50cnkgKikKKwkJCQkmaG9zdGRhdGEtPnJlcV9jcHVbaW5fcHRyXTsKKwkJCWluX3B0ciA9IChpbl9wdHIgKyAxKSAmIFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOOworCQkJaWYgKGluX3B0ciA9PSBvdXRfcHRyKSB7CisJCQkJcHJpbnRrKCJpc3AxMDIwOiB1bmV4cGVjdGVkIHJlcXVlc3QgcXVldWUgIgorCQkJCSAgICAgICAib3ZlcmZsb3dcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJVFJBQ0UoInF1ZXVlIGNvbnRpbnVhdGlvbiIsIGluX3B0ciwgMCk7CisJCQljb250LT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX0NPTlRJTlVBVElPTjsKKwkJCWNvbnQtPmhkci5lbnRyeV9jbnQgID0gMDsKKwkJCWNvbnQtPmhkci5zeXNfZGVmXzEgID0gMDsKKwkJCWNvbnQtPmhkci5mbGFncyAgICAgID0gMDsKKyNpZm5kZWYgQ09ORklHX1FMX0lTUF9BNjQKKwkJCWNvbnQtPnJlc2VydmVkID0gMDsKKyNlbmRpZgorCQkJZHMgPSBjb250LT5kYXRhc2VnOworCQkJbiA9IHNnX2NvdW50OworCQkJaWYgKG4gPiBDT05USU5VQVRJT05fU0VHUykKKwkJCQluID0gQ09OVElOVUFUSU9OX1NFR1M7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCQkJZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQkJZHNbaV0uZF9iYXNlID0gY3B1X3RvX2xlMzIoKHUzMikgZG1hX2FkZHIpOworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJCQkJZHNbaV0uZF9iYXNlX2hpID0gY3B1X3RvX2xlMzIoKHUzMikoZG1hX2FkZHI+PjMyKSk7CisjZW5kaWYgLyogQ09ORklHX1FMX0lTUF9BNjQgKi8KKwkJCQlkc1tpXS5kX2NvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQkJCSsrc2c7CisJCQl9CisJCQlzZ19jb3VudCAtPSBuOworCQl9CisJfSBlbHNlIGlmIChDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJLypDbW5kLT5TQ3AucHRyID0gKGNoYXIgKikodW5zaWduZWQgbG9uZykqLworCQlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCSAgICAgICBDbW5kLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgICAgQ21uZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSAgICAgICBzY3NpX3RvX3BjaV9kbWFfZGlyKENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSk7CisJCUNtbmQtPlNDcC5wdHIgPSAoY2hhciAqKSh1bnNpZ25lZCBsb25nKSBkbWFfYWRkcjsKKworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlID0KKwkJCWNwdV90b19sZTMyKCh1MzIpIGRtYV9hZGRyKTsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlX2hpID0KKwkJCWNwdV90b19sZTMyKCh1MzIpIChkbWFfYWRkcj4+MzIpKTsKKyNlbmRpZiAvKiBDT05GSUdfUUxfSVNQX0E2NCAqLworCQljbWQtPmRhdGFzZWdbMF0uZF9jb3VudCA9CisJCQljcHVfdG9fbGUzMigodTMyKUNtbmQtPnJlcXVlc3RfYnVmZmxlbik7CisJCWNtZC0+c2VnbWVudF9jbnQgPSBjcHVfdG9fbGUxNigxKTsKKwl9IGVsc2UgeworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlID0gMDsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlX2hpID0gMDsKKyNlbmRpZiAvKiBDT05GSUdfUUxfSVNQX0E2NCAqLworCQljbWQtPmRhdGFzZWdbMF0uZF9jb3VudCA9IDA7CisJCWNtZC0+c2VnbWVudF9jbnQgPSBjcHVfdG9fbGUxNigxKTsgLyogU2hvdWxkbid0IHRoaXMgYmUgMD8gKi8KKwl9CisKKwkvKiBDb21taXR0ZWQsIHJlY29yZCBTY3NpX0NtZCBzbyB3ZSBjYW4gZmluZCBpdCBsYXRlci4gKi8KKwljbWQtPmhhbmRsZSA9IGluX3B0cjsKKwlob3N0ZGF0YS0+Y21kX3Nsb3RzW2luX3B0cl0gPSBDbW5kOworCisJaXNwX291dHcoaW5fcHRyLCBob3N0LCBNQk9YNCk7CisJaG9zdGRhdGEtPnJlcV9pbl9wdHIgPSBpbl9wdHI7CisKKwludW1fZnJlZSA9IFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOIC0gUkVRX1FVRVVFX0RFUFRIKGluX3B0ciwgb3V0X3B0cik7CisJaG9zdC0+Y2FuX3F1ZXVlID0gaG9zdC0+aG9zdF9idXN5ICsgbnVtX2ZyZWU7CisJaG9zdC0+c2dfdGFibGVzaXplID0gUUxPR0lDSVNQX01BWF9TRyhudW1fZnJlZSk7CisKKwlMRUFWRSgiaXNwMTAyMF9xdWV1ZWNvbW1hbmQiKTsKKworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgQVNZTkNfRVZFTlRfSU5URVJSVVBUCTB4MDEKKworaXJxcmV0dXJuX3QgZG9faXNwMTAyMF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpc3AxMDIwX2ludHJfaGFuZGxlcihpcnEsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZCBpc3AxMDIwX2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCVNjc2lfQ21uZCAqQ21uZDsKKwlzdHJ1Y3QgU3RhdHVzX0VudHJ5ICpzdHM7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9pZDsKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJdV9pbnQgaW5fcHRyLCBvdXRfcHRyOworCXVfc2hvcnQgc3RhdHVzOworCisJRU5URVJfSU5UUigiaXNwMTAyMF9pbnRyX2hhbmRsZXIiKTsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCisJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2lzcCA6IGludGVycnVwdCBvbiBsaW5lICVkXG4iLCBpcnEpKTsKKworCWlmICghKGlzcF9pbncoaG9zdCwgUENJX0lOVEZfU1RTKSAmIDB4MDQpKSB7CisJCS8qIHNwdXJpb3VzIGludGVycnVwdHMgY2FuIGhhcHBlbiBsZWdhbGx5ICovCisJCURFQlVHX0lOVFIocHJpbnRrKCJxbG9naWNpc3A6IGdvdCBzcHVyaW91cyBpbnRlcnJ1cHRcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlpbl9wdHIgPSBpc3BfaW53KGhvc3QsIE1CT1g1KTsKKwlpc3Bfb3V0dyhIQ0NSX0NMRUFSX1JJU0NfSU5UUiwgaG9zdCwgSE9TVF9IQ0NSKTsKKworCWlmICgoaXNwX2ludyhob3N0LCBQQ0lfU0VNQVBIT1JFKSAmIEFTWU5DX0VWRU5UX0lOVEVSUlVQVCkpIHsKKwkJc3RhdHVzID0gaXNwX2ludyhob3N0LCBNQk9YMCk7CisKKwkJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2lzcCA6IG1ib3ggY29tcGxldGlvbiBzdGF0dXM6ICV4XG4iLAorCQkJCSAgc3RhdHVzKSk7CisKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJICAgICAgY2FzZSBBU1lOQ19TQ1NJX0JVU19SRVNFVDoKKwkJICAgICAgY2FzZSBFWEVDVVRJT05fVElNRU9VVF9SRVNFVDoKKwkJCWhvc3RkYXRhLT5zZW5kX21hcmtlciA9IDE7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBJTlZBTElEX0NPTU1BTkQ6CisJCSAgICAgIGNhc2UgSE9TVF9JTlRFUkZBQ0VfRVJST1I6CisJCSAgICAgIGNhc2UgQ09NTUFORF9FUlJPUjoKKwkJICAgICAgY2FzZSBDT01NQU5EX1BBUkFNX0VSUk9SOgorCQkJcHJpbnRrKCJxbG9naWNpc3AgOiBiYWQgbWFpbGJveCByZXR1cm4gc3RhdHVzXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWlzcF9vdXR3KDB4MCwgaG9zdCwgUENJX1NFTUFQSE9SRSk7CisJfQorCW91dF9wdHIgPSBob3N0ZGF0YS0+cmVzX291dF9wdHI7CisKKwlERUJVR19JTlRSKHByaW50aygicWxvZ2ljaXNwIDogcmVzcG9uc2UgcXVldWUgdXBkYXRlXG4iKSk7CisJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2lzcCA6IHJlc3BvbnNlIHF1ZXVlIGRlcHRoICVkXG4iLAorCQkJICBRVUVVRV9ERVBUSChpbl9wdHIsIG91dF9wdHIsIFJFU19RVUVVRV9MRU4pKSk7CisKKwl3aGlsZSAob3V0X3B0ciAhPSBpbl9wdHIpIHsKKwkJdV9pbnQgY21kX3Nsb3Q7CisKKwkJc3RzID0gKHN0cnVjdCBTdGF0dXNfRW50cnkgKikgJmhvc3RkYXRhLT5yZXNfY3B1W291dF9wdHJdOworCQlvdXRfcHRyID0gKG91dF9wdHIgKyAxKSAmIFJFU19RVUVVRV9MRU47CisKKwkJY21kX3Nsb3QgPSBzdHMtPmhhbmRsZTsKKwkJQ21uZCA9IGhvc3RkYXRhLT5jbWRfc2xvdHNbY21kX3Nsb3RdOworCQlob3N0ZGF0YS0+Y21kX3Nsb3RzW2NtZF9zbG90XSA9IE5VTEw7CisKKwkJVFJBQ0UoImRvbmUiLCBvdXRfcHRyLCBDbW5kKTsKKworCQlpZiAobGUxNl90b19jcHUoc3RzLT5jb21wbGV0aW9uX3N0YXR1cykgPT0gQ1NfUkVTRVRfT0NDVVJSRUQKKwkJICAgIHx8IGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpID09IENTX0FCT1JURUQKKwkJICAgIHx8IChsZTE2X3RvX2NwdShzdHMtPnN0YXR1c19mbGFncykgJiBTVEZfQlVTX1JFU0VUKSkKKwkJCWhvc3RkYXRhLT5zZW5kX21hcmtlciA9IDE7CisKKwkJaWYgKGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpICYgU0ZfR09UX1NFTlNFKQorCQkJbWVtY3B5KENtbmQtPnNlbnNlX2J1ZmZlciwgc3RzLT5yZXFfc2Vuc2VfZGF0YSwKKwkJCSAgICAgICBzaXplb2YoQ21uZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwkJREVCVUdfSU5UUihpc3AxMDIwX3ByaW50X3N0YXR1c19lbnRyeShzdHMpKTsKKworCQlpZiAoc3RzLT5oZHIuZW50cnlfdHlwZSA9PSBFTlRSWV9TVEFUVVMpCisJCQlDbW5kLT5yZXN1bHQgPSBpc3AxMDIwX3JldHVybl9zdGF0dXMoc3RzKTsKKwkJZWxzZQorCQkJQ21uZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCisJCWlmIChDbW5kLT51c2Vfc2cpCisJCQlwY2lfdW5tYXBfc2coaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJICAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopQ21uZC0+YnVmZmVyLAorCQkJCSAgICAgQ21uZC0+dXNlX3NnLAorCQkJCSAgICAgc2NzaV90b19wY2lfZG1hX2RpcihDbW5kLT5zY19kYXRhX2RpcmVjdGlvbikpOworCQllbHNlIGlmIChDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pCisJCQlwY2lfdW5tYXBfc2luZ2xlKGhvc3RkYXRhLT5wY2lfZGV2LAorI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJCQkJCSAoZG1hX2FkZHJfdCkoKGxvbmcpQ21uZC0+U0NwLnB0ciksCisjZWxzZQorCQkJCQkgKHUzMikoKGxvbmcpQ21uZC0+U0NwLnB0ciksCisjZW5kaWYKKwkJCQkJIENtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJIHNjc2lfdG9fcGNpX2RtYV9kaXIoQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pKTsKKworCQlpc3Bfb3V0dyhvdXRfcHRyLCBob3N0LCBNQk9YNSk7CisJCSgqQ21uZC0+c2NzaV9kb25lKShDbW5kKTsKKwl9CisJaG9zdGRhdGEtPnJlc19vdXRfcHRyID0gb3V0X3B0cjsKKworCUxFQVZFX0lOVFIoImlzcDEwMjBfaW50cl9oYW5kbGVyIik7Cit9CisKKworc3RhdGljIGludCBpc3AxMDIwX3JldHVybl9zdGF0dXMoc3RydWN0IFN0YXR1c19FbnRyeSAqc3RzKQoreworCWludCBob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKyNpZiBERUJVR19JU1AxMDIwX0lOVFIKKwlzdGF0aWMgY2hhciAqcmVhc29uW10gPSB7CisJCSJESURfT0siLAorCQkiRElEX05PX0NPTk5FQ1QiLAorCQkiRElEX0JVU19CVVNZIiwKKwkJIkRJRF9USU1FX09VVCIsCisJCSJESURfQkFEX1RBUkdFVCIsCisJCSJESURfQUJPUlQiLAorCQkiRElEX1BBUklUWSIsCisJCSJESURfRVJST1IiLAorCQkiRElEX1JFU0VUIiwKKwkJIkRJRF9CQURfSU5UUiIKKwl9OworI2VuZGlmIC8qIERFQlVHX0lTUDEwMjBfSU5UUiAqLworCisJRU5URVIoImlzcDEwMjBfcmV0dXJuX3N0YXR1cyIpOworCisJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiBjb21wbGV0aW9uIHN0YXR1cyA9IDB4JTA0eFxuIiwKKwkJICAgICBsZTE2X3RvX2NwdShzdHMtPmNvbXBsZXRpb25fc3RhdHVzKSkpOworCisJc3dpdGNoKGxlMTZfdG9fY3B1KHN0cy0+Y29tcGxldGlvbl9zdGF0dXMpKSB7CisJICAgICAgY2FzZSBDU19DT01QTEVURToKKwkJaG9zdF9zdGF0dXMgPSBESURfT0s7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfSU5DT01QTEVURToKKwkJaWYgKCEobGUxNl90b19jcHUoc3RzLT5zdGF0ZV9mbGFncykgJiBTRl9HT1RfQlVTKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX05PX0NPTk5FQ1Q7CisJCWVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zdGF0ZV9mbGFncykgJiBTRl9HT1RfVEFSR0VUKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0JBRF9UQVJHRVQ7CisJCWVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zdGF0ZV9mbGFncykgJiBTRl9TRU5UX0NEQikpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJZWxzZSBpZiAoIShsZTE2X3RvX2NwdShzdHMtPnN0YXRlX2ZsYWdzKSAmIFNGX1RSQU5TRkVSUkVEX0RBVEEpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zdGF0ZV9mbGFncykgJiBTRl9HT1RfU1RBVFVTKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQllbHNlIGlmICghKGxlMTZfdG9fY3B1KHN0cy0+c3RhdGVfZmxhZ3MpICYgU0ZfR09UX1NFTlNFKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX0RNQV9FUlJPUjoKKwkgICAgICBjYXNlIENTX1RSQU5TUE9SVF9FUlJPUjoKKwkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQ1NfUkVTRVRfT0NDVVJSRUQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX1JFU0VUOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX0FCT1JURUQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX0FCT1JUOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX1RJTUVPVVQ6CisJCWhvc3Rfc3RhdHVzID0gRElEX1RJTUVfT1VUOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX0RBVEFfT1ZFUlJVTjoKKwkgICAgICBjYXNlIENTX0NPTU1BTkRfT1ZFUlJVTjoKKwkgICAgICBjYXNlIENTX1NUQVRVU19PVkVSUlVOOgorCSAgICAgIGNhc2UgQ1NfQkFEX01FU1NBR0U6CisJICAgICAgY2FzZSBDU19OT19NRVNTQUdFX09VVDoKKwkgICAgICBjYXNlIENTX0VYVF9JRF9GQUlMRUQ6CisJICAgICAgY2FzZSBDU19JREVfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX0FCT1JUX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19OT1BfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX1BBUklUWV9FUlJPUl9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfREVWSUNFX1JFU0VUX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19JRF9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfVU5FWFBfQlVTX0ZSRUU6CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX0RBVEFfVU5ERVJSVU46CisJCWhvc3Rfc3RhdHVzID0gRElEX09LOworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQlwcmludGsoInFsb2dpY2lzcCA6IHVua25vd24gY29tcGxldGlvbiBzdGF0dXMgMHglMDR4XG4iLAorCQkgICAgICAgbGUxNl90b19jcHUoc3RzLT5jb21wbGV0aW9uX3N0YXR1cykpOworCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisJREVCVUdfSU5UUihwcmludGsoInFsb2dpY2lzcCA6IGhvc3Qgc3RhdHVzICglcykgc2NzaSBzdGF0dXMgJXhcbiIsCisJCQkgIHJlYXNvbltob3N0X3N0YXR1c10sIGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpKSk7CisKKwlMRUFWRSgiaXNwMTAyMF9yZXR1cm5fc3RhdHVzIik7CisKKwlyZXR1cm4gKGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpICYgU1RBVFVTX01BU0spIHwgKGhvc3Rfc3RhdHVzIDw8IDE2KTsKK30KKworCitzdGF0aWMgaW50IGlzcDEwMjBfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqbiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQoreworCWludCBzaXplID0gY2FwYWNpdHk7CisKKwlFTlRFUigiaXNwMTAyMF9iaW9zcGFyYW0iKTsKKworCWlwWzBdID0gNjQ7CisJaXBbMV0gPSAzMjsKKwlpcFsyXSA9IHNpemUgPj4gMTE7CisJaWYgKGlwWzJdID4gMTAyNCkgeworCQlpcFswXSA9IDI1NTsKKwkJaXBbMV0gPSA2MzsKKwkJaXBbMl0gPSBzaXplIC8gKGlwWzBdICogaXBbMV0pOworI2lmIDAKKwkJaWYgKGlwWzJdID4gMTAyMykKKwkJCWlwWzJdID0gMTAyMzsKKyNlbmRpZgkJCQorCX0KKworCUxFQVZFKCJpc3AxMDIwX2Jpb3NwYXJhbSIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpc3AxMDIwX3Jlc2V0X2hhcmR3YXJlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJdV9zaG9ydCBwYXJhbVs2XTsKKwlpbnQgbG9vcF9jb3VudDsKKworCUVOVEVSKCJpc3AxMDIwX3Jlc2V0X2hhcmR3YXJlIik7CisKKwlpc3Bfb3V0dyhJU1BfUkVTRVQsIGhvc3QsIFBDSV9JTlRGX0NUTCk7CisJdWRlbGF5KDEwMCk7CisJaXNwX291dHcoSENDUl9SRVNFVCwgaG9zdCwgSE9TVF9IQ0NSKTsKKwl1ZGVsYXkoMTAwKTsKKwlpc3Bfb3V0dyhIQ0NSX1JFTEVBU0UsIGhvc3QsIEhPU1RfSENDUik7CisJaXNwX291dHcoSENDUl9CSU9TX0RJU0FCTEUsIGhvc3QsIEhPU1RfSENDUik7CisKKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYgaXNwX2ludyhob3N0LCBIT1NUX0hDQ1IpID09IFJJU0NfQlVTWSkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50aygicWxvZ2ljaXNwOiByZXNldF9oYXJkd2FyZSBsb29wIHRpbWVvdXRcbiIpOworCisJaXNwX291dHcoMCwgaG9zdCwgSVNQX0NGRzEpOworCisjaWYgREVCVUdfSVNQMTAyMAorCXByaW50aygicWxvZ2ljaXNwIDogbWJveCAwIDB4JTA0eCBcbiIsIGlzcF9pbncoaG9zdCwgTUJPWDApKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IG1ib3ggMSAweCUwNHggXG4iLCBpc3BfaW53KGhvc3QsIE1CT1gxKSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBtYm94IDIgMHglMDR4IFxuIiwgaXNwX2ludyhob3N0LCBNQk9YMikpOworCXByaW50aygicWxvZ2ljaXNwIDogbWJveCAzIDB4JTA0eCBcbiIsIGlzcF9pbncoaG9zdCwgTUJPWDMpKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IG1ib3ggNCAweCUwNHggXG4iLCBpc3BfaW53KGhvc3QsIE1CT1g0KSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBtYm94IDUgMHglMDR4IFxuIiwgaXNwX2ludyhob3N0LCBNQk9YNSkpOworI2VuZGlmIC8qIERFQlVHX0lTUDEwMjAgKi8KKworCXBhcmFtWzBdID0gTUJPWF9OT19PUDsKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IE5PUCB0ZXN0IGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCURFQlVHKHByaW50aygicWxvZ2ljaXNwIDogbG9hZGluZyByaXNjIHJhbVxuIikpOworCisjaWYgUkVMT0FEX0ZJUk1XQVJFCisJZm9yIChsb29wX2NvdW50ID0gMDsgbG9vcF9jb3VudCA8IHJpc2NfY29kZV9sZW5ndGgwMTsgbG9vcF9jb3VudCsrKSB7CisJCXBhcmFtWzBdID0gTUJPWF9XUklURV9SQU1fV09SRDsKKwkJcGFyYW1bMV0gPSByaXNjX2NvZGVfYWRkcjAxICsgbG9vcF9jb3VudDsKKwkJcGFyYW1bMl0gPSByaXNjX2NvZGUwMVtsb29wX2NvdW50XTsKKwkJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCQlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCQlwcmludGsoInFsb2dpY2lzcCA6IGZpcm13YXJlIGxvYWQgZmFpbHVyZSBhdCAlZFxuIiwKKwkJCSAgICBsb29wX2NvdW50KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorI2VuZGlmIC8qIFJFTE9BRF9GSVJNV0FSRSAqLworCisJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiB2ZXJpZnlpbmcgY2hlY2tzdW1cbiIpKTsKKworCXBhcmFtWzBdID0gTUJPWF9WRVJJRllfQ0hFQ0tTVU07CisJcGFyYW1bMV0gPSByaXNjX2NvZGVfYWRkcjAxOworCisJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IHJhbSBjaGVja3N1bSBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiBleGVjdXRpbmcgZmlybXdhcmVcbiIpKTsKKworCXBhcmFtWzBdID0gTUJPWF9FWEVDX0ZJUk1XQVJFOworCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIwMTsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCXBhcmFtWzBdID0gTUJPWF9BQk9VVF9GSVJNV0FSRTsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBhYm91dCBmaXJtd2FyZSBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJREVCVUcocHJpbnRrKCJxbG9naWNpc3AgOiBmaXJtd2FyZSBtYWpvciByZXZpc2lvbiAlZFxuIiwgcGFyYW1bMV0pKTsKKwlERUJVRyhwcmludGsoInFsb2dpY2lzcCA6IGZpcm13YXJlIG1pbm9yIHJldmlzaW9uICVkXG4iLCBwYXJhbVsyXSkpOworCisJTEVBVkUoImlzcDEwMjBfcmVzZXRfaGFyZHdhcmUiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNoKQoreworCXVfbG9uZyBpb19iYXNlLCBtZW1fYmFzZSwgaW9fZmxhZ3MsIG1lbV9mbGFnczsKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisJdV9jaGFyIHJldmlzaW9uOworCXVfaW50IGlycTsKKwl1X3Nob3J0IGNvbW1hbmQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlFTlRFUigiaXNwMTAyMF9pbml0Iik7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBzaC0+aG9zdGRhdGE7CisJcGRldiA9IGhvc3RkYXRhLT5wY2lfZGV2OworCisJaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCkKKwkgICAgfHwgcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pKQorCXsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBlcnJvciByZWFkaW5nIFBDSSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwltZW1fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlpb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKTsKKwltZW1fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSk7CisJaXJxID0gcGRldi0+aXJxOworCisJaWYgKHBkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX1FMT0dJQykgeworCQlwcmludGsoInFsb2dpY2lzcCA6IDB4JTA0eCBpcyBub3QgUUxvZ2ljIHZlbmRvciBJRFxuIiwKKwkJICAgICAgIHBkZXYtPnZlbmRvcik7CisJCXJldHVybiAxOworCX0KKworCWlmIChwZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAyMCkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IDB4JTA0eCBkb2VzIG5vdCBtYXRjaCBJU1AxMDIwIGRldmljZSBpZFxuIiwKKwkJICAgICAgIHBkZXYtPmRldmljZSk7CisJCXJldHVybiAxOworCX0KKworI2lmZGVmIF9fYWxwaGFfXworCS8qIEZvcmNlIEFMUEhBIHRvIHVzZSBidXMgSS9PIGFuZCBub3QgYnVzIE1FTS4KKwkgICBUaGlzIGlzIHRvIGF2b2lkIGhhdmluZyB0byB1c2UgSEFFX01FTSByZWdpc3RlcnMsCisJICAgd2hpY2ggaXMgYnJva2VuIG9uIHNvbWUgcGxhdGZvcm1zIGFuZCB3aXRoIFNNUC4gICovCisJY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfTUVNT1JZOyAKKyNlbmRpZgorCisJc2gtPmlvX3BvcnQgPSBpb19iYXNlOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzaC0+aW9fcG9ydCwgMHhmZiwgInFsb2dpY2lzcCIpKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogaS9vIHJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5ICIKKwkJICAgICAgICJpbiB1c2VcbiIsCisJCSAgICAgICBzaC0+aW9fcG9ydCwgc2gtPmlvX3BvcnQgKyAweGZmKTsKKwkJcmV0dXJuIDE7CisJfQorCisgCWlmICgoY29tbWFuZCAmIFBDSV9DT01NQU5EX01FTU9SWSkgJiYKKyAJICAgICgobWVtX2ZsYWdzICYgMSkgPT0gMCkpIHsKKyAJCWhvc3RkYXRhLT5tZW1hZGRyID0gaW9yZW1hcChtZW1fYmFzZSwgUEFHRV9TSVpFKTsKKwkJaWYgKCFob3N0ZGF0YS0+bWVtYWRkcikgeworIAkJCXByaW50aygicWxvZ2ljaXNwIDogaS9vIHJlbWFwcGluZyBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisJCX0KKyAJfSBlbHNlIHsKKwkJaWYgKGNvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTyAmJiAoaW9fZmxhZ3MgJiAzKSAhPSAxKSB7CisJCQlwcmludGsoInFsb2dpY2lzcCA6IGkvbyBtYXBwaW5nIGlzIGRpc2FibGVkXG4iKTsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisgCQl9CisgCQlob3N0ZGF0YS0+bWVtYWRkciA9IE5VTEw7IC8qIHplcm8gdG8gc2lnbmlmeSBubyBpL28gbWFwcGluZyAqLworIAkJbWVtX2Jhc2UgPSAwOworCX0KKworCWlmIChyZXZpc2lvbiAhPSBJU1AxMDIwX1JFVl9JRCkKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBuZXcgaXNwMTAyMCByZXZpc2lvbiBJRCAoJWQpXG4iLCByZXZpc2lvbik7CisKKwlpZiAoaXNwX2ludyhzaCwgIFBDSV9JRF9MT1cpICE9IFBDSV9WRU5ET1JfSURfUUxPR0lDCisJICAgIHx8IGlzcF9pbncoc2gsIFBDSV9JRF9ISUdIKSAhPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDIwKQorCXsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBjYW4ndCBkZWNvZGUgJXMgYWRkcmVzcyBzcGFjZSAweCVseFxuIiwKKwkJICAgICAgIChpb19iYXNlID8gIkkvTyIgOiAiTUVNIiksCisJCSAgICAgICAoaW9fYmFzZSA/IGlvX2Jhc2UgOiBtZW1fYmFzZSkpOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwlob3N0ZGF0YS0+cmV2aXNpb24gPSByZXZpc2lvbjsKKworCXNoLT5pcnEgPSBpcnE7CisJc2gtPm1heF9pZCA9IE1BWF9UQVJHRVRTOworCXNoLT5tYXhfbHVuID0gTUFYX0xVTlM7CisKKwlob3N0ZGF0YS0+cmVzX2NwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhvc3RkYXRhLT5wY2lfZGV2LAorCQkJCQkJIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCQkJICZob3N0ZGF0YS0+cmVzX2RtYSk7CisJaWYgKGhvc3RkYXRhLT5yZXNfY3B1ID09IE5VTEwpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBjYW4ndCBhbGxvY2F0ZSByZXNwb25zZSBxdWV1ZVxuIik7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCWhvc3RkYXRhLT5yZXFfY3B1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaG9zdGRhdGEtPnBjaV9kZXYsCisJCQkJCQkgUVNJWkUoUUxPR0lDSVNQX1JFUV9RVUVVRV9MRU4pLAorCQkJCQkJICZob3N0ZGF0YS0+cmVxX2RtYSk7CisJaWYgKGhvc3RkYXRhLT5yZXFfY3B1ID09IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChob3N0ZGF0YS0+cGNpX2RldiwKKwkJCQkgICAgUVNJWkUoUkVTX1FVRVVFX0xFTiksCisJCQkJICAgIGhvc3RkYXRhLT5yZXNfY3B1LAorCQkJCSAgICBob3N0ZGF0YS0+cmVzX2RtYSk7CisJCXByaW50aygicWxvZ2ljaXNwIDogY2FuJ3QgYWxsb2NhdGUgcmVxdWVzdCBxdWV1ZVxuIik7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJTEVBVkUoImlzcDEwMjBfaW5pdCIpOworCisJcmV0dXJuIDA7CisKK291dF91bm1hcDoKKwlpb3VubWFwKGhvc3RkYXRhLT5tZW1hZGRyKTsKK291dF9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKHNoLT5pb19wb3J0LCAweGZmKTsKKwlyZXR1cm4gMTsKK30KKworCisjaWYgVVNFX05WUkFNX0RFRkFVTFRTCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9nZXRfZGVmYXVsdHMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlpbnQgaTsKKwl1X3Nob3J0IHZhbHVlOworCXN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCUVOVEVSKCJpc3AxMDIwX2dldF9kZWZhdWx0cyIpOworCisJaWYgKCFpc3AxMDIwX3ZlcmlmeV9udnJhbShob3N0KSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IG52cmFtIGNoZWNrc3VtIGZhaWx1cmVcbiIpOworCQlwcmludGsoInFsb2dpY2lzcCA6IGF0dGVtcHRpbmcgdG8gdXNlIGRlZmF1bHQgcGFyYW1ldGVyc1xuIik7CisJCXJldHVybiBpc3AxMDIwX3NldF9kZWZhdWx0cyhob3N0KTsKKwl9CisKKwl2YWx1ZSA9IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDIpOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmZpZm9fdGhyZXNob2xkID0gKHZhbHVlID4+IDgpICYgMHgwMzsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5ob3N0X2FkYXB0ZXJfZW5hYmxlID0gKHZhbHVlID4+IDExKSAmIDB4MDE7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uaW5pdGlhdG9yX3Njc2lfaWQgPSAodmFsdWUgPj4gMTIpICYgMHgwZjsKKworCXZhbHVlID0gaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgMyk7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uYnVzX3Jlc2V0X2RlbGF5ID0gdmFsdWUgJiAweGZmOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLnJldHJ5X2NvdW50ID0gdmFsdWUgPj4gODsKKworCXZhbHVlID0gaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoaG9zdCwgNCk7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmV0cnlfZGVsYXkgPSB2YWx1ZSAmIDB4ZmY7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uYXN5bmNfZGF0YV9zZXR1cF90aW1lID0gKHZhbHVlID4+IDgpICYgMHgwZjsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbiA9ICh2YWx1ZSA+PiAxMikgJiAweDAxOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb24gPSAodmFsdWUgPj4gMTMpICYgMHgwMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2RtYV9idXJzdF9lbmFibGUgPSAodmFsdWUgPj4gMTQpICYgMHgwMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5jb21tYW5kX2RtYV9idXJzdF9lbmFibGUgPSAodmFsdWUgPj4gMTUpOworCisJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCA1KTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS50YWdfYWdpbmcgPSB2YWx1ZSAmIDB4ZmY7CisKKwl2YWx1ZSA9IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDYpOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLnNlbGVjdGlvbl90aW1lb3V0ID0gdmFsdWUgJiAweGZmZmY7CisKKwl2YWx1ZSA9IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDcpOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLm1heF9xdWV1ZV9kZXB0aCA9IHZhbHVlICYgMHhmZmZmOworCisjaWYgREVCVUdfSVNQMTAyMF9TRVRVUAorCXByaW50aygicWxvZ2ljaXNwIDogZmlmbyB0aHJlc2hvbGQ9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLmZpZm9fdGhyZXNob2xkKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IGluaXRpYXRvciBzY3NpIGlkPSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5pbml0aWF0b3Jfc2NzaV9pZCk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBidXMgcmVzZXQgZGVsYXk9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLmJ1c19yZXNldF9kZWxheSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiByZXRyeSBjb3VudD0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmV0cnlfY291bnQpOworCXByaW50aygicWxvZ2ljaXNwIDogcmV0cnkgZGVsYXk9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLnJldHJ5X2RlbGF5KTsKKwlwcmludGsoInFsb2dpY2lzcCA6IGFzeW5jIGRhdGEgc2V0dXAgdGltZT0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0uYXN5bmNfZGF0YV9zZXR1cF90aW1lKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IHJlcS9hY2sgYWN0aXZlIG5lZ2F0aW9uPSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbik7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBkYXRhIGxpbmUgYWN0aXZlIG5lZ2F0aW9uPSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IGRhdGEgRE1BIGJ1cnN0IGVuYWJsZT0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0uZGF0YV9kbWFfYnVyc3RfZW5hYmxlKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IGNvbW1hbmQgRE1BIGJ1cnN0IGVuYWJsZT0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0uY29tbWFuZF9kbWFfYnVyc3RfZW5hYmxlKTsKKwlwcmludGsoInFsb2dpY2lzcCA6IHRhZyBhZ2UgbGltaXQ9JWRcbiIsCisJICAgICAgIGhvc3RkYXRhLT5ob3N0X3BhcmFtLnRhZ19hZ2luZyk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBzZWxlY3Rpb24gdGltZW91dCBsaW1pdD0lZFxuIiwKKwkgICAgICAgaG9zdGRhdGEtPmhvc3RfcGFyYW0uc2VsZWN0aW9uX3RpbWVvdXQpOworCXByaW50aygicWxvZ2ljaXNwIDogbWF4IHF1ZXVlIGRlcHRoPSVkXG4iLAorCSAgICAgICBob3N0ZGF0YS0+aG9zdF9wYXJhbS5tYXhfcXVldWVfZGVwdGgpOworI2VuZGlmIC8qIERFQlVHX0lTUDEwMjBfU0VUVVAgKi8KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVEFSR0VUUzsgaSsrKSB7CisKKwkJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCAxNCArIGkgKiAzKTsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5kZXZpY2VfZmxhZ3MgPSB2YWx1ZSAmIDB4ZmY7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZXhlY3V0aW9uX3Rocm90dGxlID0gdmFsdWUgPj4gODsKKworCQl2YWx1ZSA9IGlzcDEwMjBfcmVhZF9udnJhbV93b3JkKGhvc3QsIDE1ICsgaSAqIDMpOworCQlob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX3BlcmlvZCA9IHZhbHVlICYgMHhmZjsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19vZmZzZXQgPSAodmFsdWUgPj4gOCkgJiAweDBmOworCQlob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLmRldmljZV9lbmFibGUgPSAodmFsdWUgPj4gMTIpICYgMHgwMTsKKworI2lmIERFQlVHX0lTUDEwMjBfU0VUVVAKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiB0YXJnZXQgMHglMDJ4XG4iLCBpKTsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiAgICAgZGV2aWNlIGZsYWdzPTB4JTAyeFxuIiwKKwkJICAgICAgIGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzKTsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiAgICAgZXhlY3V0aW9uIHRocm90dGxlPSVkXG4iLAorCQkgICAgICAgaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5leGVjdXRpb25fdGhyb3R0bGUpOworCQlwcmludGsoInFsb2dpY2lzcCA6ICAgICBzeW5jaHJvbm91cyBwZXJpb2Q9JWRcbiIsCisJCSAgICAgICBob3N0ZGF0YS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX3BlcmlvZCk7CisJCXByaW50aygicWxvZ2ljaXNwIDogICAgIHN5bmNocm9ub3VzIG9mZnNldD0lZFxuIiwKKwkJICAgICAgIGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfb2Zmc2V0KTsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiAgICAgZGV2aWNlIGVuYWJsZT0lZFxuIiwKKwkJICAgICAgIGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2VuYWJsZSk7CisjZW5kaWYgLyogREVCVUdfSVNQMTAyMF9TRVRVUCAqLworCX0KKworCUxFQVZFKCJpc3AxMDIwX2dldF9kZWZhdWx0cyIpOworCisJcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBJU1AxMDIwX05WUkFNX0xFTgkweDQwCisjZGVmaW5lIElTUDEwMjBfTlZSQU1fU0lHMQkweDUzNDkKKyNkZWZpbmUgSVNQMTAyMF9OVlJBTV9TSUcyCTB4MjA1MAorCitzdGF0aWMgaW50IGlzcDEwMjBfdmVyaWZ5X252cmFtKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJaW50CWk7CisJdV9zaG9ydCB2YWx1ZTsKKwl1X2NoYXIgY2hlY2tzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IElTUDEwMjBfTlZSQU1fTEVOOyBpKyspIHsKKwkJdmFsdWUgPSBpc3AxMDIwX3JlYWRfbnZyYW1fd29yZChob3N0LCBpKTsKKworCQlzd2l0Y2ggKGkpIHsKKwkJICAgICAgY2FzZSAwOgorCQkJaWYgKHZhbHVlICE9IElTUDEwMjBfTlZSQU1fU0lHMSkgcmV0dXJuIDA7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSAxOgorCQkJaWYgKHZhbHVlICE9IElTUDEwMjBfTlZSQU1fU0lHMikgcmV0dXJuIDA7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSAyOgorCQkJaWYgKCh2YWx1ZSAmIDB4ZmYpICE9IDB4MDIpIHJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKwkJY2hlY2tzdW0gKz0gdmFsdWUgJiAweGZmOworCQljaGVja3N1bSArPSB2YWx1ZSA+PiA4OworCX0KKworCXJldHVybiAoY2hlY2tzdW0gPT0gMCk7Cit9CisKKyNkZWZpbmUgTlZSQU1fREVMQVkoKSB1ZGVsYXkoMikgLyogMiBtaWNyb3NlY29uZCBkZWxheSAqLworCisKK3Vfc2hvcnQgaXNwMTAyMF9yZWFkX252cmFtX3dvcmQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgdV9zaG9ydCBieXRlKQoreworCWludCBpOworCXVfc2hvcnQgdmFsdWUsIG91dHB1dCwgaW5wdXQ7CisKKwlieXRlICY9IDB4M2Y7IGJ5dGUgfD0gMHgwMTgwOworCisJZm9yIChpID0gODsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0cHV0ID0gKChieXRlID4+IGkpICYgMHgxKSA/IDB4NCA6IDB4MDsKKwkJaXNwX291dHcob3V0cHV0IHwgMHgyLCBob3N0LCBQQ0lfTlZSQU0pOyBOVlJBTV9ERUxBWSgpOworCQlpc3Bfb3V0dyhvdXRwdXQgfCAweDMsIGhvc3QsIFBDSV9OVlJBTSk7IE5WUkFNX0RFTEFZKCk7CisJCWlzcF9vdXR3KG91dHB1dCB8IDB4MiwgaG9zdCwgUENJX05WUkFNKTsgTlZSQU1fREVMQVkoKTsKKwl9CisKKwlmb3IgKGkgPSAweGYsIHZhbHVlID0gMDsgaSA+PSAwOyBpLS0pIHsKKwkJdmFsdWUgPDw9IDE7CisJCWlzcF9vdXR3KDB4MywgaG9zdCwgUENJX05WUkFNKTsgTlZSQU1fREVMQVkoKTsKKwkJaW5wdXQgPSBpc3BfaW53KGhvc3QsIFBDSV9OVlJBTSk7IE5WUkFNX0RFTEFZKCk7CisJCWlzcF9vdXR3KDB4MiwgaG9zdCwgUENJX05WUkFNKTsgTlZSQU1fREVMQVkoKTsKKwkJaWYgKGlucHV0ICYgMHg4KSB2YWx1ZSB8PSAxOworCX0KKworCWlzcF9vdXR3KDB4MCwgaG9zdCwgUENJX05WUkFNKTsgTlZSQU1fREVMQVkoKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworI2VuZGlmIC8qIFVTRV9OVlJBTV9ERUZBVUxUUyAqLworCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9zZXRfZGVmYXVsdHMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqaG9zdGRhdGEgPQorCQkoc3RydWN0IGlzcDEwMjBfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CisJaW50IGk7CisKKwlFTlRFUigiaXNwMTAyMF9zZXRfZGVmYXVsdHMiKTsKKworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmZpZm9fdGhyZXNob2xkID0gMjsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5ob3N0X2FkYXB0ZXJfZW5hYmxlID0gMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5pbml0aWF0b3Jfc2NzaV9pZCA9IDc7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uYnVzX3Jlc2V0X2RlbGF5ID0gMzsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXRyeV9jb3VudCA9IDA7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmV0cnlfZGVsYXkgPSAxOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmFzeW5jX2RhdGFfc2V0dXBfdGltZSA9IDY7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmVxX2Fja19hY3RpdmVfbmVnYXRpb24gPSAxOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb24gPSAxOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLmRhdGFfZG1hX2J1cnN0X2VuYWJsZSA9IDE7CisJaG9zdGRhdGEtPmhvc3RfcGFyYW0uY29tbWFuZF9kbWFfYnVyc3RfZW5hYmxlID0gMTsKKwlob3N0ZGF0YS0+aG9zdF9wYXJhbS50YWdfYWdpbmcgPSA4OworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLnNlbGVjdGlvbl90aW1lb3V0ID0gMjUwOworCWhvc3RkYXRhLT5ob3N0X3BhcmFtLm1heF9xdWV1ZV9kZXB0aCA9IDI1NjsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVEFSR0VUUzsgaSsrKSB7CisJCWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzID0gMHhmZDsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5leGVjdXRpb25fdGhyb3R0bGUgPSAxNjsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19wZXJpb2QgPSAyNTsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19vZmZzZXQgPSAxMjsKKwkJaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5kZXZpY2VfZW5hYmxlID0gMTsKKwl9CisKKwlMRUFWRSgiaXNwMTAyMF9zZXRfZGVmYXVsdHMiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXNwMTAyMF9sb2FkX3BhcmFtZXRlcnMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlpbnQgaSwgazsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXVfbG9uZyBxdWV1ZV9hZGRyOworCXVfc2hvcnQgcGFyYW1bOF07CisjZWxzZQorCXVfaW50IHF1ZXVlX2FkZHI7CisJdV9zaG9ydCBwYXJhbVs2XTsKKyNlbmRpZgorCXVfc2hvcnQgaXNwX2NmZzEsIGh3cmV2OworCXN0cnVjdCBpc3AxMDIwX2hvc3RkYXRhICpob3N0ZGF0YSA9CisJCShzdHJ1Y3QgaXNwMTAyMF9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCUVOVEVSKCJpc3AxMDIwX2xvYWRfcGFyYW1ldGVycyIpOworCisJaHdyZXYgPSBpc3BfaW53KGhvc3QsIElTUF9DRkcwKSAmIElTUF9DRkcwX0hXTVNLOworCWlzcF9jZmcxID0gSVNQX0NGRzFfRjY0IHwgSVNQX0NGRzFfQkVOQUI7CisJaWYgKGh3cmV2ID09IElTUF9DRkcwXzEwNDBBKSB7CisJCS8qIEJ1c3RlZCBmaWZvLCBzYXlzIG1qYWNvYi4gKi8KKwkJaXNwX2NmZzEgJj0gSVNQX0NGRzFfQkVOQUI7CisJfQorCisJaXNwX291dHcoaXNwX2ludyhob3N0LCBJU1BfQ0ZHMSkgfCBpc3BfY2ZnMSwgaG9zdCwgSVNQX0NGRzEpOworCWlzcF9vdXR3KGlzcF9pbncoaG9zdCwgQ0RNQV9DT05GKSB8IERNQV9DT05GX0JFTkFCLCBob3N0LCBDRE1BX0NPTkYpOworCWlzcF9vdXR3KGlzcF9pbncoaG9zdCwgRERNQV9DT05GKSB8IERNQV9DT05GX0JFTkFCLCBob3N0LCBERE1BX0NPTkYpOworCisJcGFyYW1bMF0gPSBNQk9YX1NFVF9JTklUX1NDU0lfSUQ7CisJcGFyYW1bMV0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5pbml0aWF0b3Jfc2NzaV9pZDsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgaW5pdGlhdG9yIGlkIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwYXJhbVswXSA9IE1CT1hfU0VUX1JFVFJZX0NPVU5UOworCXBhcmFtWzFdID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0ucmV0cnlfY291bnQ7CisJcGFyYW1bMl0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5yZXRyeV9kZWxheTsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgcmV0cnkgY291bnQgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXBhcmFtWzBdID0gTUJPWF9TRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FOworCXBhcmFtWzFdID0gaG9zdGRhdGEtPmhvc3RfcGFyYW0uYXN5bmNfZGF0YV9zZXR1cF90aW1lOworCisJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IGFzeW5jIGRhdGEgc2V0dXAgdGltZSBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW1bMF0gPSBNQk9YX1NFVF9BQ1RJVkVfTkVHX1NUQVRFOworCXBhcmFtWzFdID0gKGhvc3RkYXRhLT5ob3N0X3BhcmFtLnJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uIDw8IDQpCisJCXwgKGhvc3RkYXRhLT5ob3N0X3BhcmFtLmRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb24gPDwgNSk7CisKKwlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwlpZiAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSB7CisJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IGFjdGl2ZSBuZWdhdGlvbiBzdGF0ZSBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW1bMF0gPSBNQk9YX1NFVF9QQ0lfQ09OVFJPTF9QQVJBTVM7CisJcGFyYW1bMV0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5kYXRhX2RtYV9idXJzdF9lbmFibGUgPDwgMTsKKwlwYXJhbVsyXSA9IGhvc3RkYXRhLT5ob3N0X3BhcmFtLmNvbW1hbmRfZG1hX2J1cnN0X2VuYWJsZSA8PCAxOworCisJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IHNldCBwY2kgY29udHJvbCBwYXJhbWV0ZXIgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXBhcmFtWzBdID0gTUJPWF9TRVRfVEFHX0FHRV9MSU1JVDsKKwlwYXJhbVsxXSA9IGhvc3RkYXRhLT5ob3N0X3BhcmFtLnRhZ19hZ2luZzsKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgdGFnIGFnZSBsaW1pdCBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcGFyYW1bMF0gPSBNQk9YX1NFVF9TRUxFQ1RfVElNRU9VVDsKKwlwYXJhbVsxXSA9IGhvc3RkYXRhLT5ob3N0X3BhcmFtLnNlbGVjdGlvbl90aW1lb3V0OworCisJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJaWYgKHBhcmFtWzBdICE9IE1CT1hfQ09NTUFORF9DT01QTEVURSkgeworCQlwcmludGsoInFsb2dpY2lzcCA6IHNldCBzZWxlY3Rpb24gdGltZW91dCBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9UQVJHRVRTOyBpKyspIHsKKworCQlpZiAoIWhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZGV2aWNlX2VuYWJsZSkKKwkJCWNvbnRpbnVlOworCisJCXBhcmFtWzBdID0gTUJPWF9TRVRfVEFSR0VUX1BBUkFNUzsKKwkJcGFyYW1bMV0gPSBpIDw8IDg7CisJCXBhcmFtWzJdID0gaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5kZXZpY2VfZmxhZ3MgPDwgODsKKwkJcGFyYW1bM10gPSAoaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19vZmZzZXQgPDwgOCkKKwkJCXwgaG9zdGRhdGEtPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19wZXJpb2Q7CisKKwkJaXNwMTAyMF9tYm94X2NvbW1hbmQoaG9zdCwgcGFyYW0pOworCisJCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCXByaW50aygicWxvZ2ljaXNwIDogc2V0IHRhcmdldCBwYXJhbWV0ZXIgZmFpbHVyZVxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWZvciAoayA9IDA7IGsgPCBNQVhfTFVOUzsgaysrKSB7CisKKwkJCXBhcmFtWzBdID0gTUJPWF9TRVRfREVWX1FVRVVFX1BBUkFNUzsKKwkJCXBhcmFtWzFdID0gKGkgPDwgOCkgfCBrOworCQkJcGFyYW1bMl0gPSBob3N0ZGF0YS0+aG9zdF9wYXJhbS5tYXhfcXVldWVfZGVwdGg7CisJCQlwYXJhbVszXSA9IGhvc3RkYXRhLT5kZXZfcGFyYW1baV0uZXhlY3V0aW9uX3Rocm90dGxlOworCisJCQlpc3AxMDIwX21ib3hfY29tbWFuZChob3N0LCBwYXJhbSk7CisKKwkJCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCQlwcmludGsoInFsb2dpY2lzcCA6IHNldCBkZXZpY2UgcXVldWUgIgorCQkJCSAgICAgICAicGFyYW1ldGVyIGZhaWx1cmVcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJcXVldWVfYWRkciA9IGhvc3RkYXRhLT5yZXNfZG1hOworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJcGFyYW1bMF0gPSBNQk9YX0NNRF9JTklUX1JFU1BPTlNFX1FVRVVFXzY0OworI2Vsc2UKKwlwYXJhbVswXSA9IE1CT1hfSU5JVF9SRVNfUVVFVUU7CisjZW5kaWYKKwlwYXJhbVsxXSA9IFJFU19RVUVVRV9MRU4gKyAxOworCXBhcmFtWzJdID0gKHVfc2hvcnQpIChxdWV1ZV9hZGRyID4+IDE2KTsKKwlwYXJhbVszXSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciAmIDB4ZmZmZik7CisJcGFyYW1bNF0gPSAwOworCXBhcmFtWzVdID0gMDsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXBhcmFtWzZdID0gKHVfc2hvcnQpIChxdWV1ZV9hZGRyID4+IDQ4KTsKKwlwYXJhbVs3XSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciA+PiAzMik7CisjZW5kaWYKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgcmVzcG9uc2UgcXVldWUgZmFpbHVyZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXF1ZXVlX2FkZHIgPSBob3N0ZGF0YS0+cmVxX2RtYTsKKyNpZmRlZiBDT05GSUdfUUxfSVNQX0E2NAorCXBhcmFtWzBdID0gTUJPWF9DTURfSU5JVF9SRVFVRVNUX1FVRVVFXzY0OworI2Vsc2UKKwlwYXJhbVswXSA9IE1CT1hfSU5JVF9SRVFfUVVFVUU7CisjZW5kaWYKKwlwYXJhbVsxXSA9IFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOICsgMTsKKwlwYXJhbVsyXSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciA+PiAxNik7CisJcGFyYW1bM10gPSAodV9zaG9ydCkgKHF1ZXVlX2FkZHIgJiAweGZmZmYpOworCXBhcmFtWzRdID0gMDsKKworI2lmZGVmIENPTkZJR19RTF9JU1BfQTY0CisJcGFyYW1bNV0gPSAwOworCXBhcmFtWzZdID0gKHVfc2hvcnQpIChxdWV1ZV9hZGRyID4+IDQ4KTsKKwlwYXJhbVs3XSA9ICh1X3Nob3J0KSAocXVldWVfYWRkciA+PiAzMik7CisjZW5kaWYKKworCWlzcDEwMjBfbWJveF9jb21tYW5kKGhvc3QsIHBhcmFtKTsKKworCWlmIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJcHJpbnRrKCJxbG9naWNpc3AgOiBzZXQgcmVxdWVzdCBxdWV1ZSBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJTEVBVkUoImlzcDEwMjBfbG9hZF9wYXJhbWV0ZXJzIik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogY3VycmVudGx5LCB0aGlzIGlzIG9ubHkgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBvciBhYm9ydC9yZXNldCwKKyAqIGF0IHdoaWNoIHRpbWVzIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBzbyBwb2xsaW5nIGlzIE9LLCBJIGd1ZXNzLi4uCisgKi8KK3N0YXRpYyBpbnQgaXNwMTAyMF9tYm94X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgdV9zaG9ydCBwYXJhbVtdKQoreworCWludCBsb29wX2NvdW50OworCisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dID09IDApCisJCXJldHVybiAxOworCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmIGlzcF9pbncoaG9zdCwgSE9TVF9IQ0NSKSAmIDB4MDA4MCkgeworCQliYXJyaWVyKCk7CisJCWNwdV9yZWxheCgpOworCX0KKwlpZiAoIWxvb3BfY291bnQpCisJCXByaW50aygicWxvZ2ljaXNwOiBtYm94X2NvbW1hbmQgbG9vcCB0aW1lb3V0ICMxXG4iKTsKKworCXN3aXRjaChtYm94X3BhcmFtW3BhcmFtWzBdXSA+PiA0KSB7CisJICAgICAgY2FzZSA4OiBpc3Bfb3V0dyhwYXJhbVs3XSwgaG9zdCwgTUJPWDcpOworCSAgICAgIGNhc2UgNzogaXNwX291dHcocGFyYW1bNl0sIGhvc3QsIE1CT1g2KTsKKwkgICAgICBjYXNlIDY6IGlzcF9vdXR3KHBhcmFtWzVdLCBob3N0LCBNQk9YNSk7CisJICAgICAgY2FzZSA1OiBpc3Bfb3V0dyhwYXJhbVs0XSwgaG9zdCwgTUJPWDQpOworCSAgICAgIGNhc2UgNDogaXNwX291dHcocGFyYW1bM10sIGhvc3QsIE1CT1gzKTsKKwkgICAgICBjYXNlIDM6IGlzcF9vdXR3KHBhcmFtWzJdLCBob3N0LCBNQk9YMik7CisJICAgICAgY2FzZSAyOiBpc3Bfb3V0dyhwYXJhbVsxXSwgaG9zdCwgTUJPWDEpOworCSAgICAgIGNhc2UgMTogaXNwX291dHcocGFyYW1bMF0sIGhvc3QsIE1CT1gwKTsKKwl9CisKKwlpc3Bfb3V0dygweDAsIGhvc3QsIFBDSV9TRU1BUEhPUkUpOworCWlzcF9vdXR3KEhDQ1JfQ0xFQVJfUklTQ19JTlRSLCBob3N0LCBIT1NUX0hDQ1IpOworCWlzcF9vdXR3KEhDQ1JfU0VUX0hPU1RfSU5UUiwgaG9zdCwgSE9TVF9IQ0NSKTsKKworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiAhKGlzcF9pbncoaG9zdCwgUENJX0lOVEZfU1RTKSAmIDB4MDQpKSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKCJxbG9naWNpc3A6IG1ib3hfY29tbWFuZCBsb29wIHRpbWVvdXQgIzJcbiIpOworCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmIGlzcF9pbncoaG9zdCwgTUJPWDApID09IDB4MDQpIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoInFsb2dpY2lzcDogbWJveF9jb21tYW5kIGxvb3AgdGltZW91dCAjM1xuIik7CisKKwlzd2l0Y2gobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweGYpIHsKKwkgICAgICBjYXNlIDg6IHBhcmFtWzddID0gaXNwX2ludyhob3N0LCBNQk9YNyk7CisJICAgICAgY2FzZSA3OiBwYXJhbVs2XSA9IGlzcF9pbncoaG9zdCwgTUJPWDYpOworCSAgICAgIGNhc2UgNjogcGFyYW1bNV0gPSBpc3BfaW53KGhvc3QsIE1CT1g1KTsKKwkgICAgICBjYXNlIDU6IHBhcmFtWzRdID0gaXNwX2ludyhob3N0LCBNQk9YNCk7CisJICAgICAgY2FzZSA0OiBwYXJhbVszXSA9IGlzcF9pbncoaG9zdCwgTUJPWDMpOworCSAgICAgIGNhc2UgMzogcGFyYW1bMl0gPSBpc3BfaW53KGhvc3QsIE1CT1gyKTsKKwkgICAgICBjYXNlIDI6IHBhcmFtWzFdID0gaXNwX2ludyhob3N0LCBNQk9YMSk7CisJICAgICAgY2FzZSAxOiBwYXJhbVswXSA9IGlzcF9pbncoaG9zdCwgTUJPWDApOworCX0KKworCWlzcF9vdXR3KDB4MCwgaG9zdCwgUENJX1NFTUFQSE9SRSk7CisJaXNwX291dHcoSENDUl9DTEVBUl9SSVNDX0lOVFIsIGhvc3QsIEhPU1RfSENDUik7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWYgREVCVUdfSVNQMTAyMF9JTlRSCisKK3ZvaWQgaXNwMTAyMF9wcmludF9zdGF0dXNfZW50cnkoc3RydWN0IFN0YXR1c19FbnRyeSAqc3RhdHVzKQoreworCWludCBpOworCisJcHJpbnRrKCJxbG9naWNpc3AgOiBlbnRyeSBjb3VudCA9IDB4JTAyeCwgdHlwZSA9IDB4JTAyeCwgZmxhZ3MgPSAweCUwMnhcbiIsCisJICAgICAgIHN0YXR1cy0+aGRyLmVudHJ5X2NudCwgc3RhdHVzLT5oZHIuZW50cnlfdHlwZSwgc3RhdHVzLT5oZHIuZmxhZ3MpOworCXByaW50aygicWxvZ2ljaXNwIDogc2NzaSBzdGF0dXMgPSAweCUwNHgsIGNvbXBsZXRpb24gc3RhdHVzID0gMHglMDR4XG4iLAorCSAgICAgICBsZTE2X3RvX2NwdShzdGF0dXMtPnNjc2lfc3RhdHVzKSwgbGUxNl90b19jcHUoc3RhdHVzLT5jb21wbGV0aW9uX3N0YXR1cykpOworCXByaW50aygicWxvZ2ljaXNwIDogc3RhdGUgZmxhZ3MgPSAweCUwNHgsIHN0YXR1cyBmbGFncyA9IDB4JTA0eFxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoc3RhdHVzLT5zdGF0ZV9mbGFncyksIGxlMTZfdG9fY3B1KHN0YXR1cy0+c3RhdHVzX2ZsYWdzKSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiB0aW1lID0gMHglMDR4LCByZXF1ZXN0IHNlbnNlIGxlbmd0aCA9IDB4JTA0eFxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoc3RhdHVzLT50aW1lKSwgbGUxNl90b19jcHUoc3RhdHVzLT5yZXFfc2Vuc2VfbGVuKSk7CisJcHJpbnRrKCJxbG9naWNpc3AgOiByZXNpZHVhbCB0cmFuc2ZlciBsZW5ndGggPSAweCUwOHhcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHN0YXR1cy0+cmVzaWR1YWwpKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShzdGF0dXMtPnJlcV9zZW5zZV9sZW4pOyBpKyspCisJCXByaW50aygicWxvZ2ljaXNwIDogc2Vuc2UgZGF0YSA9IDB4JTAyeFxuIiwgc3RhdHVzLT5yZXFfc2Vuc2VfZGF0YVtpXSk7Cit9CisKKyNlbmRpZiAvKiBERUJVR19JU1AxMDIwX0lOVFIgKi8KKworCisjaWYgREVCVUdfSVNQMTAyMAorCit2b2lkIGlzcDEwMjBfcHJpbnRfc2NzaV9jbWQoU2NzaV9DbW5kICpjbWQpCit7CisJaW50IGk7CisKKwlwcmludGsoInFsb2dpY2lzcCA6IHRhcmdldCA9IDB4JTAyeCwgbHVuID0gMHglMDJ4LCBjbWRfbGVuID0gMHglMDJ4XG4iLAorCSAgICAgICBjbWQtPnRhcmdldCwgY21kLT5sdW4sIGNtZC0+Y21kX2xlbik7CisJcHJpbnRrKCJxbG9naWNpc3AgOiBjb21tYW5kID0gIik7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgaSsrKQorCQlwcmludGsoIjB4JTAyeCAiLCBjbWQtPmNtbmRbaV0pOworCXByaW50aygiXG4iKTsKK30KKworI2VuZGlmIC8qIERFQlVHX0lTUDEwMjAgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkuZGV0ZWN0CQkJPSBpc3AxMDIwX2RldGVjdCwKKwkucmVsZWFzZQkJPSBpc3AxMDIwX3JlbGVhc2UsCisJLmluZm8JCQk9IGlzcDEwMjBfaW5mbywJCisJLnF1ZXVlY29tbWFuZAkJPSBpc3AxMDIwX3F1ZXVlY29tbWFuZCwKKwkuYmlvc19wYXJhbQkJPSBpc3AxMDIwX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IFFMT0dJQ0lTUF9SRVFfUVVFVUVfTEVOLAorCS50aGlzX2lkCQk9IC0xLAorCS5zZ190YWJsZXNpemUJCT0gUUxPR0lDSVNQX01BWF9TRyhRTE9HSUNJU1BfUkVRX1FVRVVFX0xFTiksCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNpc3BfYXNtLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljaXNwX2FzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTRiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljaXNwX2FzbS5jCkBAIC0wLDAgKzEsMjAzNCBAQAorLyoKKyAqICAgICAgRmlybXdhcmUgVmVyc2lvbiA3LjYzLjAwICgxMjowNyBKYW4gMjcsIDE5OTkpCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfdmVyc2lvbiA9IDcqMTAyNCs2MzsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHJpc2NfY29kZV9hZGRyMDEgPSAweDEwMDAgOworCisjaWYgUkVMT0FEX0ZJUk1XQVJFCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGUwMVtdID0geworCTB4MDA3OCwgMHgxMDNhLCAweDAwMDAsIDB4M2YxNCwgMHgwMDAwLCAweDIwNDMsIDB4NGY1MCwgMHg1OTUyLAorCTB4NDk0NywgMHg0ODU0LCAweDIwMzEsIDB4MzkzOSwgMHgzNTIwLCAweDUxNGMsIDB4NGY0NywgMHg0OTQzLAorCTB4MjA0MywgMHg0ZjUyLCAweDUwNGYsIDB4NTI0MSwgMHg1NDQ5LCAweDRmNGUsIDB4MjA0OSwgMHg1MzUwLAorCTB4MzEzMCwgMHgzMjMwLCAweDIwNDksIDB4MmY1NCwgMHgyMDQ2LCAweDY5NzIsIDB4NmQ3NywgMHg2MTcyLAorCTB4NjUyMCwgMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsIDB4MzcyZSwgMHgzNjMzLAorCTB4MjAyMCwgMHgyMDQzLCAweDc1NzMsIDB4NzQ2ZiwgMHg2ZDY1LCAweDcyMjAsIDB4NGU2ZiwgMHgyZTIwLAorCTB4MzAzMCwgMHgyMDUwLCAweDcyNmYsIDB4NjQ3NSwgMHg2Mzc0LCAweDIwNGUsIDB4NmYyZSwgMHgyMDIwLAorCTB4MzAzMSwgMHgyMDI0LCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMDQ4LAorCTB4MTA0NSwgMHgwMDM4LCAweDEwNGIsIDB4MDA3OCwgMHgxMDQ3LCAweDAwMjgsIDB4MTA0YiwgMHgyMGI5LAorCTB4MTIxMiwgMHgwMDc4LCAweDEwNGQsIDB4MjBiOSwgMHgyMjIyLCAweDIwYzEsIDB4MDAwOCwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MGMzLCAweDAwMDQsIDB4MjBjOSwgMHg3NmZmLCAweDIwODksIDB4MTE4NiwgMHg3MGM3LAorCTB4NDk1MywgMHg3MGNiLCAweDUwMjAsIDB4NzBjZiwgMHgyMDIwLCAweDcwZDMsIDB4MDAwNywgMHgzZjAwLAorCTB4NzBkNiwgMHgyMGMxLCAweDAwMDgsIDB4MjAxOSwgMHgwMDAwLCAweDIwMDksIDB4ZmVmZiwgMHgyMTAwLAorCTB4MjAwYiwgMHhhNWE1LCAweGExZWMsIDB4N2ZmZiwgMHgyZDY0LCAweDIwNmIsIDB4MGEwYSwgMHhhZGRjLAorCTB4M2ZmZiwgMHgyYjU0LCAweDIwNWIsIDB4NTA1MCwgMHgyMTE0LCAweGEyODYsIDB4YTVhNSwgMHgwMDQwLAorCTB4MTBiZiwgMHhhMzg2LCAweDAwMGYsIDB4MDA0MCwgMHgxMDg1LCAweDJjNmEsIDB4MmE1YSwgMHgyMGMxLAorCTB4MDAwMCwgMHgyMDE5LCAweDAwMGYsIDB4MDA3OCwgMHgxMDY1LCAweDJjNmEsIDB4MmE1YSwgMHgyMGMxLAorCTB4MDAwOCwgMHgyMDA5LCAweDdmZmYsIDB4MjE0OCwgMHgyOTQ0LCAweDIwNGIsIDB4MGEwYSwgMHhhOWJjLAorCTB4M2ZmZiwgMHgyNzM0LCAweDIwM2IsIDB4NTA1MCwgMHgyMTE0LCAweGEyODYsIDB4MGEwYSwgMHgwMDQwLAorCTB4MTBhOSwgMHgyODRhLCAweDI2M2EsIDB4MjBjMSwgMHgwMDA0LCAweDIwMDksIDB4M2ZmZiwgMHgyMTM0LAorCTB4MjAwYiwgMHg1MDUwLCAweDIxMTQsIDB4YTI4NiwgMHg1MDUwLCAweDAwNDAsIDB4MTBhYSwgMHgwMDc4LAorCTB4MTE4ZSwgMHgyODRhLCAweDI2M2EsIDB4OThjMCwgMHhhMTg4LCAweDEwMDAsIDB4MjEyYywgMHgyMDBiLAorCTB4YTVhNSwgMHgyMTE0LCAweGEyODYsIDB4YTVhNSwgMHgwMDQwLCAweDEwYmMsIDB4MjUwYSwgMHhhMThhLAorCTB4MTAwMCwgMHg5OGMxLCAweDAwNzgsIDB4MTBjMSwgMHgyNTBhLCAweDAwNzgsIDB4MTBjMSwgMHgyYzZhLAorCTB4MmE1YSwgMHgyMTMwLCAweGExOGEsIDB4MDA0MCwgMHgyMTI4LCAweGExYTIsIDB4NTAwMCwgMHg4NDI0LAorCTB4ODQyNCwgMHg4NDI0LCAweDg0MjQsIDB4ODQyNCwgMHg4NDI0LCAweGExOTIsIDB4NzcwMCwgMHgyMDA5LAorCTB4MDAwMCwgMHgyMDAxLCAweDAwMzEsIDB4MTA3OCwgMHgxYzlkLCAweDIyMTgsIDB4MjA3OSwgMHg1MDAwLAorCTB4MmZhMCwgMHgyNDA4LCAweDIwMTEsIDB4MDAwMCwgMHgyMGE5LCAweDAwNDAsIDB4NDJhNCwgMHg4MTA5LAorCTB4MDBjMCwgMHgxMGRjLCAweDdlZjIsIDB4ODUyOCwgMHg3ZGU2LCAweDdjZWEsIDB4N2JlZSwgMHg3ODgzLAorCTB4MDAwMCwgMHgyMDMxLCAweDAwMzAsIDB4NzhjZiwgMHgwMTAxLCAweDc4MGIsIDB4MDAwMiwgMHg3ODBmLAorCTB4MDAwMiwgMHg3ODRmLCAweDAwMDMsIDB4MjA2OSwgMHg1MDQwLCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LAorCTB4YTA4MiwgMHgwMDA1LCAweDAwNDgsIDB4MTEwNCwgMHgwMDM4LCAweDExMDAsIDB4MDA3OCwgMHgxMTA4LAorCTB4NjgxYiwgMHgwMDNjLCAweDAwNzgsIDB4MTEwYSwgMHgwMGE4LCAweDExMDgsIDB4NjgxYiwgMHgwMDNjLAorCTB4NjgxYiwgMHgwMDI4LCAweDY4MDcsIDB4MDAwNywgMHg2ODBiLCAweDAwZmEsIDB4NjgwZiwgMHgwMDA4LAorCTB4NjgxMywgMHgwMDA1LCAweDY4MjMsIDB4MDAwMCwgMHg2ODI3LCAweDAwMDYsIDB4NjgxNywgMHgwMDA4LAorCTB4NjgyYiwgMHgwMDAwLCAweDY4MWYsIDB4MDAxOSwgMHgyMDY5LCAweDUyODAsIDB4MjAxMSwgMHgwMDIwLAorCTB4MjAwOSwgMHgwMDEwLCAweDY4MGIsIDB4MDgwYywgMHg2ODBmLCAweDAwMTksIDB4NjgwMywgMHhmZDAwLAorCTB4NjgwNywgMHgwMDE4LCAweDZhMWEsIDB4MmQwMCwgMHhhMGU4LCAweDAwMDgsIDB4YTI5MCwgMHgwMDA0LAorCTB4ODEwOSwgMHgwMGMwLCAweDExMjIsIDB4MjA2OSwgMHg1MzAwLCAweDIwMDksIDB4MDAwMiwgMHgyMGE5LAorCTB4MDEwMCwgMHg2ODM3LCAweDAwMDAsIDB4NjgwYiwgMHgwMDQwLCAweDdiZjAsIDB4YTM4NiwgMHhmZWZmLAorCTB4MDBjMCwgMHgxMTQ4LCAweDY4MTcsIDB4MDEwMCwgMHg2ODFmLCAweDAwNjQsIDB4MDA3OCwgMHgxMTRjLAorCTB4NjgxNywgMHgwMDY0LCAweDY4MWYsIDB4MDAwMiwgMHhhZGU4LCAweDAwMTAsIDB4MDA3MCwgMHgxMTUyLAorCTB4MDA3OCwgMHgxMTM5LCAweDgxMDksIDB4MDBjMCwgMHgxMTM3LCAweDEwNzgsIDB4MjFlOSwgMHgxMDc4LAorCTB4NDZlOSwgMHgxMDc4LCAweDE5NDYsIDB4MTA3OCwgMHg0YmRmLCAweDMyMDAsIDB4YTA4NSwgMHgwMDBkLAorCTB4MjA5MCwgMHg3MGMzLCAweDAwMDAsIDB4MDA5MCwgMHgxMTZjLCAweDcwYzAsIDB4YTA4NiwgMHgwMDAyLAorCTB4MDBjMCwgMHgxMTZjLCAweDEwNzgsIDB4MTI4NCwgMHgxMDc4LCAweDExOTYsIDB4NzhjYywgMHhhMDA1LAorCTB4MDBjMCwgMHgxMTdhLCAweDEwNzgsIDB4MWNjNiwgMHgwMDEwLCAweDExODAsIDB4MDA2OCwgMHgxMTgwLAorCTB4MTA3OCwgMHgyMGM4LCAweDAwMTAsIDB4MTE4MCwgMHgwMDY4LCAweDExODAsIDB4MTA3OCwgMHgxYTJiLAorCTB4MDBlMCwgMHgxMTZjLCAweDEwNzgsIDB4NGE2NiwgMHgwMDc4LCAweDExNmMsIDB4MTE4ZSwgMHgxMTkwLAorCTB4MjNlYSwgMHgyM2VhLCAweDQ3NmEsIDB4NDc2YSwgMHgyM2VhLCAweDIzZWEsIDB4MDA3OCwgMHgxMThlLAorCTB4MDA3OCwgMHgxMTkwLCAweDAwNzgsIDB4MTE5MiwgMHgwMDc4LCAweDExOTQsIDB4MDA2OCwgMHgxMjAxLAorCTB4MjA2MSwgMHgwMDAwLCAweDYwMTgsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MTIwMSwgMHg3ODE0LAorCTB4YTAwNSwgMHgwMGMwLCAweDExYTcsIDB4MDAxMCwgMHgxMjAyLCAweDAwNzgsIDB4MTIwMSwgMHgyMDA5LAorCTB4NTA1YiwgMHgyMTA0LCAweGEwMDUsIDB4MDBjMCwgMHgxMjAxLCAweDIwMDksIDB4NTA2NCwgMHgyMDBiLAorCTB4MDAwMCwgMHg3OTE0LCAweGExODYsIDB4MDA0MiwgMHgwMGMwLCAweDExY2MsIDB4NzgxNiwgMHgyMDA5LAorCTB4NTA2MiwgMHgyMTY0LCAweDIwMGIsIDB4MDAwMCwgMHg2MDE4LCAweDcwYzYsIDB4NjAxNCwgMHg3MGNhLAorCTB4NjExYywgMHhhMThjLCAweGZmMDAsIDB4NjAyMCwgMHhhMDg0LCAweDAwZmYsIDB4YTEwNSwgMHg3MGNlLAorCTB4MTA3OCwgMHgxOTJiLCAweDAwNzgsIDB4MTFmZiwgMHg3ODE0LCAweGEwODYsIDB4MDAxOCwgMHgwMGMwLAorCTB4MTFkMywgMHgxMDc4LCAweDE2NWEsIDB4NzgxNywgMHgwMDAwLCAweDIwMDksIDB4NTA2MiwgMHgyMTA0LAorCTB4YTA2NSwgMHgwMDQwLCAweDExZWYsIDB4MGM3ZSwgMHg2MDljLCAweDIwNjAsIDB4MTA3OCwgMHgxOTk2LAorCTB4MGM3ZiwgMHg2MDlmLCAweDAwMDAsIDB4MTA3OCwgMHgxNzMwLCAweDIwMDksIDB4MDAwYywgMHg2MDA3LAorCTB4MDEwMywgMHgxMDc4LCAweDE5MDcsIDB4MDBjMCwgMHgxMWZiLCAweDEwNzgsIDB4MTkyYiwgMHgyMDA5LAorCTB4NTA2MiwgMHgyMDBiLCAweDAwMDAsIDB4MjAwOSwgMHg1MDVjLCAweDIxMDQsIDB4MjAwYiwgMHgwMDAwLAorCTB4YTAwNSwgMHgwMDQwLCAweDExZmYsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHgwMDc4LAorCTB4MTI4NCwgMHgwMDdjLCAweDcwYzMsIDB4MDAwMCwgMHg3MGM3LCAweDAwMDAsIDB4NzBjYiwgMHgwMDAwLAorCTB4NzBjZiwgMHgwMDAwLCAweDcwYzAsIDB4YTBiYywgMHhmZmMwLCAweDAwYzAsIDB4MTI1MiwgMHgyMDM4LAorCTB4MDA3OSwgMHgxMjEyLCAweDEyODQsIDB4MTJlNSwgMHgxMmE5LCAweDEyZmUsIDB4MTMwZCwgMHgxMzEzLAorCTB4MTJhMCwgMHgxNzQ4LCAweDEzMTcsIDB4MTI5OCwgMHgxMmFkLCAweDEyYWYsIDB4MTJiMSwgMHgxMmIzLAorCTB4MTc0ZCwgMHgxMjk4LCAweDEzMjksIDB4MTM2MCwgMHgxNjcyLCAweDE3NDIsIDB4MTJiNSwgMHgxNTkxLAorCTB4MTVhZCwgMHgxNWM5LCAweDE1ZjQsIDB4MTU0YSwgMHgxNTU4LCAweDE1NmMsIDB4MTU4MCwgMHgxM2RmLAorCTB4MTI5OCwgMHgxMzhkLCAweDEzOTMsIDB4MTM5OCwgMHgxMzlkLCAweDEzYTMsIDB4MTNhOCwgMHgxM2FkLAorCTB4MTNiMiwgMHgxM2I3LCAweDEzYmIsIDB4MTNkMCwgMHgxM2RjLCAweDEyOTgsIDB4MTI5OCwgMHgxMjk4LAorCTB4MTI5OCwgMHgxM2ViLCAweDEzZjQsIDB4MTQwMywgMHgxNDI5LCAweDE0MzMsIDB4MTQzYSwgMHgxNDgwLAorCTB4MTQ4ZiwgMHgxNDllLCAweDE0YjAsIDB4MTUyYSwgMHgxNTNhLCAweDEyOTgsIDB4MTI5OCwgMHgxMjk4LAorCTB4MTI5OCwgMHgxNTNmLCAweGEwYmMsIDB4ZmZhMCwgMHgwMGMwLCAweDEyOTgsIDB4MjAzOCwgMHhhMDg0LAorCTB4MDAxZiwgMHgwMDc5LCAweDEyNWIsIDB4MTc4NiwgMHgxNzg5LCAweDE3OTksIDB4MTI5OCwgMHgxMjk4LAorCTB4MThkOCwgMHgxOGY1LCAweDEyOTgsIDB4MTI5OCwgMHgxMjk4LCAweDE4ZjksIDB4MTkwMSwgMHgxMjk4LAorCTB4MTI5OCwgMHgxMjk4LCAweDEyOTgsIDB4MTJkYiwgMHgxMmY0LCAweDEzMWYsIDB4MTM1NiwgMHgxNjY4LAorCTB4MTc2NCwgMHgxNzc4LCAweDEyOTgsIDB4MTgyOSwgMHgxMjk4LCAweDE4YjQsIDB4MThiZSwgMHgxOGMyLAorCTB4MThkMCwgMHgxMjk4LCAweDEyOTgsIDB4NzJjYSwgMHg3MWM2LCAweDIwMDEsIDB4NDAwNiwgMHgwMDc4LAorCTB4MTI4NiwgMHg3M2NlLCAweDcyY2EsIDB4NzFjNiwgMHgyMDAxLCAweDQwMDAsIDB4NzBjMiwgMHgwMDY4LAorCTB4MTI4NywgMHgyMDYxLCAweDAwMDAsIDB4NjAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgwMGUwLAorCTB4MTI4ZiwgMHgwMGUwLCAweDEyOTEsIDB4MDA2OCwgMHgxMjkxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdjLAorCTB4NzBjMywgMHg0MDAxLCAweDAwNzgsIDB4MTI4NywgMHg3MGMzLCAweDQwMDYsIDB4MDA3OCwgMHgxMjg3LAorCTB4MjA5OSwgMHgwMDQxLCAweDIwYTEsIDB4MDA0MSwgMHgyMGE5LCAweDAwMDUsIDB4NTNhMywgMHgwMDc4LAorCTB4MTI4NCwgMHg3MGM0LCAweDcwYzMsIDB4MDAwNCwgMHgwMDdhLCAweDAwNzgsIDB4MTI4NCwgMHgwMDc4LAorCTB4MTI4NCwgMHgwMDc4LCAweDEyODQsIDB4MDA3OCwgMHgxMjg0LCAweDIwOTEsIDB4ODAwMCwgMHg3MGMzLAorCTB4MDAwMCwgMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsIDB4MjAyMCwgMHg3MGQzLAorCTB4MDAwNywgMHgzZjAwLCAweDcwZDYsIDB4MjA3OSwgMHgwMDAwLCAweDc4MWIsIDB4MDAwMSwgMHgyMDMxLAorCTB4MDAzMCwgMHgyMDU5LCAweDEwMDAsIDB4MjAyOSwgMHgwNDU3LCAweDIwNTEsIDB4MDQ3MCwgMHgyMDYxLAorCTB4MDQ3MiwgMHgyMGI5LCAweGZmZmYsIDB4MjBjMSwgMHgwMDAwLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDc4LCAweDA0NTUsIDB4MTA3OCwgMHgxYjM2LCAweDAwYzAsIDB4MTI5YywgMHg3NWQ4LAorCTB4NzRkYywgMHg3NWRhLCAweDc0ZGUsIDB4MDA3OCwgMHgxMmU4LCAweDIwMjksIDB4MDAwMCwgMHgyNTIwLAorCTB4NzFkMCwgMHg3M2M4LCAweDcyY2MsIDB4NzBjNCwgMHgxMDc4LCAweDFhNzAsIDB4MDA0MCwgMHgxMjg0LAorCTB4NzBjMywgMHg0MDAyLCAweDAwNzgsIDB4MTI4NCwgMHgxMDc4LCAweDFiMzYsIDB4MDBjMCwgMHgxMjljLAorCTB4NzVkOCwgMHg3NGRjLCAweDc1ZGEsIDB4NzRkZSwgMHgwMDc4LCAweDEzMDEsIDB4MjAyOSwgMHgwMDAwLAorCTB4MjUyMCwgMHg3MWQwLCAweDczYzgsIDB4NzJjYywgMHg3MGM0LCAweDEwNzgsIDB4MWFkMCwgMHgwMDQwLAorCTB4MTI4NCwgMHg3MGMzLCAweDQwMDIsIDB4MDA3OCwgMHgxMjg0LCAweDcxYzQsIDB4NzBjOCwgMHgyMTE0LAorCTB4MjAwYSwgMHgwMDc4LCAweDEyODIsIDB4NzFjNCwgMHgyMTE0LCAweDAwNzgsIDB4MTI4MiwgMHg3MGM3LAorCTB4MDAwNywgMHg3MGNiLCAweDAwM2YsIDB4NzBjZiwgMHgwMDAwLCAweDAwNzgsIDB4MTI4NCwgMHgxMDc4LAorCTB4MWIzNiwgMHgwMGMwLCAweDEyOWMsIDB4NzVkOCwgMHg3NmRjLCAweDc1ZGEsIDB4NzZkZSwgMHgwMDc4LAorCTB4MTMyYywgMHgyMDI5LCAweDAwMDAsIDB4MjUzMCwgMHg3MGM0LCAweDcyYzgsIDB4NzNjYywgMHg3NGQwLAorCTB4NzBjNiwgMHg3MmNhLCAweDczY2UsIDB4NzRkMiwgMHhhMDA1LCAweDAwNDAsIDB4MTM1MCwgMHg4MDAxLAorCTB4Nzg5MiwgMHhhMDg0LCAweGZjMDAsIDB4MDA0MCwgMHgxMzQ1LCAweDc4Y2MsIDB4YTA4NSwgMHgwMDAxLAorCTB4NzhjZSwgMHgyMDAxLCAweDQwMDUsIDB4MDA3OCwgMHgxMjg2LCAweDdhOWEsIDB4N2I5ZSwgMHg3ZGEyLAorCTB4N2VhNiwgMHg3Yzk2LCAweDc4Y2MsIDB4YTA4NCwgMHhmZmZjLCAweDc4Y2UsIDB4MDA3OCwgMHgxMzU0LAorCTB4NzhjYywgMHhhMDg1LCAweDAwMDEsIDB4NzhjZSwgMHgwMDc4LCAweDEyODQsIDB4MTA3OCwgMHgxYjM2LAorCTB4MDBjMCwgMHgxMjljLCAweDc1ZDgsIDB4NzZkYywgMHg3NWRhLCAweDc2ZGUsIDB4MDA3OCwgMHgxMzYzLAorCTB4MjAyOSwgMHgwMDAwLCAweDI1MzAsIDB4NzBjNCwgMHg3MmM4LCAweDczY2MsIDB4NzRkNCwgMHg3MGM2LAorCTB4NzJjYSwgMHg3M2NlLCAweDc0ZDYsIDB4YTAwNSwgMHgwMDQwLCAweDEzODcsIDB4ODAwMSwgMHg3OGFlLAorCTB4YTA4NCwgMHhmYzAwLCAweDAwNDAsIDB4MTM3YywgMHg3OGNjLCAweGEwODUsIDB4MDEwMCwgMHg3OGNlLAorCTB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHg3YWI2LCAweDdiYmEsIDB4N2RiZSwgMHg3ZWMyLAorCTB4N2NiMiwgMHg3OGNjLCAweGEwODQsIDB4ZmNmZiwgMHg3OGNlLCAweDAwNzgsIDB4MTM4YiwgMHg3OGNjLAorCTB4YTA4NSwgMHgwMTAwLCAweDc4Y2UsIDB4MDA3OCwgMHgxMjg0LCAweDIwMDksIDB4NTA2MSwgMHgyMTBjLAorCTB4N2FlYywgMHgwMDc4LCAweDEyODIsIDB4MjAwOSwgMHg1MDQxLCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLAorCTB4MjAwOSwgMHg1MDQyLCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLCAweDIwNjEsIDB4NTA0MCwgMHg2MTBjLAorCTB4NjIxMCwgMHgwMDc4LCAweDEyODIsIDB4MjAwOSwgMHg1MDQ1LCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLAorCTB4MjAwOSwgMHg1MDQ2LCAweDIxMGMsIDB4MDA3OCwgMHgxMjgzLCAweDIwMDksIDB4NTA0OCwgMHgyMTBjLAorCTB4MDA3OCwgMHgxMjgzLCAweDIwMDksIDB4NTA0OSwgMHgyMTBjLCAweDAwNzgsIDB4MTI4MywgMHg3OTA4LAorCTB4N2EwYywgMHgwMDc4LCAweDEyODIsIDB4NzFjNCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLAorCTB4ODAwMywgMHg4MDAzLCAweGEwZTgsIDB4NTI4MCwgMHg2YTAwLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgxM2NkLCAweDZiMDgsIDB4MDA3OCwgMHgxM2NlLCAweDZiMGMsIDB4MDA3OCwgMHgxMjgxLAorCTB4NzdjNCwgMHgxMDc4LCAweDE5NTYsIDB4MjA5MSwgMHg4MDAwLCAweDZiMWMsIDB4NmExNCwgMHgyMDkxLAorCTB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTI4MSwgMHg3OTRjLCAweDAwNzgsIDB4MTI4MywgMHg3N2M0LAorCTB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2OTA4LCAweDZhMTgsIDB4NmIxMCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDEyODEsIDB4NzFjNCwgMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMjdjLAorCTB4MTA3OCwgMHgyMmMxLCAweDAwNzgsIDB4MTI4MSwgMHg3MWM0LCAweGExODIsIDB4MDAxMCwgMHgwMGM4LAorCTB4MTI3YywgMHgyMDExLCAweDUwNDEsIDB4MjIwNCwgMHgwMDdlLCAweDIxMTIsIDB4MTA3OCwgMHgyMjdhLAorCTB4MDE3ZiwgMHgwMDc4LCAweDEyODMsIDB4NzFjNCwgMHgyMDExLCAweDE0MjEsIDB4MjBhOSwgMHgwMDA4LAorCTB4MjIwNCwgMHhhMTA2LCAweDAwNDAsIDB4MTQxMywgMHg4MjEwLCAweDAwNzAsIDB4MTQxMSwgMHgwMDc4LAorCTB4MTQwOCwgMHgwMDc4LCAweDEyN2MsIDB4YTI5MiwgMHgxNDIxLCAweDAyN2UsIDB4MjAxMSwgMHg1MDQyLAorCTB4MjIwNCwgMHgyMTEyLCAweDAxN2YsIDB4MDA3ZSwgMHgxMDc4LCAweDIyODYsIDB4MDE3ZiwgMHgwMDc4LAorCTB4MTI4MywgMHgwM2U4LCAweDAwZmEsIDB4MDFmNCwgMHgwMmVlLCAweDAwNjQsIDB4MDAxOSwgMHgwMDMyLAorCTB4MDA0YiwgMHgyMDYxLCAweDUwNDAsIDB4NjEwYywgMHg2MjEwLCAweDcwYzQsIDB4NjAwZSwgMHg3MGM4LAorCTB4NjAxMiwgMHgwMDc4LCAweDEyODIsIDB4MjA2MSwgMHg1MDQwLCAweDYxMTQsIDB4NzBjNCwgMHg2MDE2LAorCTB4MDA3OCwgMHgxMjgzLCAweDIwNjEsIDB4NTA0MCwgMHg3MWM0LCAweDIwMTEsIDB4MDAwNCwgMHg2MDFmLAorCTB4MDAxOSwgMHgyMDE5LCAweDEyMTIsIDB4YTE4NiwgMHgwMDI4LCAweDAwNDAsIDB4MTQ1YiwgMHgyMDExLAorCTB4MDAwNSwgMHg2MDFmLCAweDAwMTksIDB4MjAxOSwgMHgxMjEyLCAweGExODYsIDB4MDAzMiwgMHgwMDQwLAorCTB4MTQ1YiwgMHgyMDExLCAweDAwMDYsIDB4NjAxZiwgMHgwMDBjLCAweDIwMTksIDB4MjIyMiwgMHhhMTg2LAorCTB4MDAzYywgMHgwMGMwLCAweDEyN2MsIDB4NjAxOCwgMHgwMDdlLCAweDYxMWEsIDB4NzgwMCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDE0NzYsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LAorCTB4MDA0OCwgMHgxNDZlLCAweDAwMzgsIDB4MTQ3MiwgMHgwMDc4LCAweDE0NzYsIDB4MDAyOCwgMHgxNDcyLAorCTB4MDA3OCwgMHgxNDc2LCAweDIwMTksIDB4MjIyMiwgMHgwMDc4LCAweDE0NzgsIDB4MjAxOSwgMHgxMjEyLAorCTB4MjNiOCwgMHgxMDc4LCAweDIyOTcsIDB4MTA3OCwgMHg0YmRmLCAweDAxN2YsIDB4MDA3OCwgMHgxMjgzLAorCTB4NzFjNCwgMHhhMTg0LCAweGZmY2YsIDB4MDBjMCwgMHgxMjdjLCAweDIwMTEsIDB4NTA0OCwgMHgyMjA0LAorCTB4MjExMiwgMHgwMDdlLCAweDEwNzgsIDB4MjJiOSwgMHgwMTdmLCAweDAwNzgsIDB4MTI4MywgMHg3MWM0LAorCTB4YTE4MiwgMHgwMDEwLCAweDAwYzgsIDB4MTI3YywgMHgyMDExLCAweDUwNDksIDB4MjIwNCwgMHgwMDdlLAorCTB4MjExMiwgMHgxMDc4LCAweDIyYTgsIDB4MDE3ZiwgMHgwMDc4LCAweDEyODMsIDB4NzFjNCwgMHg3MmM4LAorCTB4YTE4NCwgMHhmZmZkLCAweDAwYzAsIDB4MTI3YiwgMHhhMjg0LCAweGZmZmQsIDB4MDBjMCwgMHgxMjdiLAorCTB4MjEwMCwgMHg3OTA4LCAweDc4MGEsIDB4MjIwMCwgMHg3YTBjLCAweDc4MGUsIDB4MDA3OCwgMHgxMjgyLAorCTB4NzFjNCwgMHg4MTA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGU4LAorCTB4NTI4MCwgMHgyMDE5LCAweDAwMDAsIDB4NzJjOCwgMHhhMjg0LCAweDAwODAsIDB4MDA0MCwgMHgxNGM2LAorCTB4NmMxNCwgMHg4NGZmLCAweDAwYzAsIDB4MTRjNiwgMHg2ODE3LCAweDAwNDAsIDB4YTI4NCwgMHgwMDQwLAorCTB4MDA0MCwgMHgxNGQwLCAweDZjMTAsIDB4ODRmZiwgMHgwMGMwLCAweDE0ZDAsIDB4NjgxMywgMHgwMDAxLAorCTB4NjgwMCwgMHgwMDdlLCAweGEyMjYsIDB4MDA0MCwgMHgxNGYzLCAweDZhMDIsIDB4YTQ4NCwgMHgyMDAwLAorCTB4MDA0MCwgMHgxNGRjLCAweGEzOWQsIDB4MDAxMCwgMHhhNDg0LCAweDEwMDAsIDB4MDA0MCwgMHgxNGUyLAorCTB4YTM5ZCwgMHgwMDA4LCAweGE0ODQsIDB4NDAwMCwgMHgwMDQwLCAweDE0ZjMsIDB4ODEwZiwgMHhhMjg0LAorCTB4NDAwMCwgMHgwMDQwLCAweDE0ZWYsIDB4MTA3OCwgMHgyMmRiLCAweDAwNzgsIDB4MTRmMywgMHgxMDc4LAorCTB4MjJjZCwgMHgwMDc4LCAweDE0ZjMsIDB4NzJjYywgMHg2ODA4LCAweGEyMDYsIDB4MDA0MCwgMHgxNTIyLAorCTB4YTJhNCwgMHgwMGZmLCAweDIwNjEsIDB4NTA0MCwgMHg2MTE4LCAweGExODYsIDB4MDAyOCwgMHgwMDQwLAorCTB4MTUwOSwgMHhhMTg2LCAweDAwMzIsIDB4MDA0MCwgMHgxNTBmLCAweGExODYsIDB4MDAzYywgMHgwMDQwLAorCTB4MTUxNSwgMHhhNDgyLCAweDAwNjQsIDB4MDA0OCwgMHgxNTFmLCAweDAwNzgsIDB4MTUxOSwgMHhhNDgyLAorCTB4MDA1MCwgMHgwMDQ4LCAweDE1MWYsIDB4MDA3OCwgMHgxNTE5LCAweGE0ODIsIDB4MDA0MywgMHgwMDQ4LAorCTB4MTUxZiwgMHg3MWM0LCAweDcxYzYsIDB4MDI3ZiwgMHg3MmNhLCAweDAwNzgsIDB4MTI3ZCwgMHg2YTBhLAorCTB4YTM5ZCwgMHgwMDBhLCAweDY4MDQsIDB4YTMwNSwgMHg2ODA2LCAweDAyN2YsIDB4NmIwYywgMHg3MWM0LAorCTB4MDA3OCwgMHgxMjgxLCAweDc3YzQsIDB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2YTE0LAorCTB4NmIxYywgMHgyMDkxLCAweDgwMDEsIDB4NzBjOCwgMHg2ODE2LCAweDcwY2MsIDB4NjgxZSwgMHgyNzA4LAorCTB4MDA3OCwgMHgxMjgxLCAweDcwYzQsIDB4Nzk0YywgMHg3ODRlLCAweDAwNzgsIDB4MTI4MywgMHg3MWM0LAorCTB4NzJjOCwgMHg3M2NjLCAweGExODIsIDB4MDAxMCwgMHgwMGM4LCAweDEyN2MsIDB4MTA3OCwgMHgyMmU5LAorCTB4MDA3OCwgMHgxMjgxLCAweDc3YzQsIDB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LAorCTB4YTI5NSwgMHgwMDAyLCAweDZhMGEsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMjgyLAorCTB4NzdjNCwgMHgxMDc4LCAweDE5NTYsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsIDB4YTI5NCwgMHhmZmY5LAorCTB4NmEwYSwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxNTY3LCAweDEwNzgsIDB4MjFiMSwgMHgyMDkxLAorCTB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTI4MiwgMHg3N2M0LCAweDEwNzgsIDB4MTk1NiwgMHgyMDkxLAorCTB4ODAwMCwgMHg2YTA4LCAweGEyOTUsIDB4MDAwNCwgMHg2YTBhLCAweDY4MDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4MTU3YiwgMHgxMDc4LCAweDIxYjEsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMjgyLAorCTB4NzdjNCwgMHgyMDQxLCAweDAwMDEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsIDB4MDAyMCwgMHgyMDkxLAorCTB4ODAwMCwgMHgxMDc4LCAweDE5NjMsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4NmEwOCwgMHgwMDc4LAorCTB4MTI4MiwgMHg3N2M0LCAweDcyYzgsIDB4NzNjYywgMHg3N2M2LCAweDcyY2EsIDB4NzNjZSwgMHgxMDc4LAorCTB4MTljNCwgMHgwMGMwLCAweDE1YTksIDB4NjgxOCwgMHhhMDA1LCAweDAwNDAsIDB4MTVhOSwgMHgyNzA4LAorCTB4MTA3OCwgMHgyMmY5LCAweDAwYzAsIDB4MTVhOSwgMHg3ODE3LCAweDAwMTUsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3YywgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxMjg0LCAweDc3YzQsIDB4NzdjNiwgMHgyMDQxLAorCTB4MDAyMSwgMHgyMDQ5LCAweDAwMDUsIDB4MjA1MSwgMHgwMDIwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTk2MywgMHgyMDYxLCAweDUwNDAsIDB4NjA2ZiwgMHgwMDAzLCAweDY3ODIsIDB4NjA5MywgMHgwMDBmLAorCTB4NjA3MywgMHgwMDAwLCAweDc4MTcsIDB4MDAxNiwgMHgxMDc4LCAweDIxYjEsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3YywgMHg3N2M4LCAweDc3Y2EsIDB4NzdjNCwgMHg3N2M2LCAweGE3YmMsIDB4ZmYwMCwgMHgyMDkxLAorCTB4ODAwMCwgMHgyMDYxLCAweDUwNDAsIDB4NjA2ZiwgMHgwMDAyLCAweDYwNzMsIDB4MDAwMCwgMHg2NzgyLAorCTB4NjA5MywgMHgwMDBmLCAweDc4MTcsIDB4MDAxNywgMHgxMDc4LCAweDIxYjEsIDB4MjA5MSwgMHg4MDAxLAorCTB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMTAsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgxOTYzLCAweDcwYzgsIDB4NjgzNiwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLAorCTB4MTVlOCwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3OGNjLCAweGEwODQsIDB4MDAwMywgMHgwMGMwLAorCTB4MTYxOCwgMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLAorCTB4MDAwOCwgMHgxMDc4LCAweDE5NTYsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDgsIDB4YTgwZCwgMHg2OTBhLAorCTB4MjA5MSwgMHg4MDAxLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MTYwMSwgMHhhN2JjLAorCTB4ZmYwMCwgMHg4NzNmLCAweDg3MzgsIDB4ODczZiwgMHhhNzg0LCAweDBmMDAsIDB4MDBjMCwgMHgxNjAxLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNjksIDB4MDEwMCwgMHg2ODMwLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4MTY0MSwgMHg2ODRiLCAweDAwMDQsIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDA0LAorCTB4MDA0MCwgMHgxNjJlLCAweDAwNzAsIDB4MTYyZSwgMHgwMDc4LCAweDE2MjUsIDB4Njg0YiwgMHgwMDA5LAorCTB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MTYzYiwgMHgwMDcwLAorCTB4MTYzYiwgMHgwMDc4LCAweDE2MzIsIDB4MjBhOSwgMHgwMGZhLCAweDAwNzAsIDB4MTY0MSwgMHgwMDc4LAorCTB4MTYzZCwgMHgyMDc5LCAweDUwMDAsIDB4NzgxNywgMHgwMDE4LCAweDIwNjEsIDB4NTA0MCwgMHg2MDZmLAorCTB4MDAwMSwgMHg2MDczLCAweDAwMDAsIDB4NjA5MywgMHgwMDBmLCAweDc4Y2MsIDB4YTA4NSwgMHgwMDAyLAorCTB4NzhjZSwgMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MWIsIDB4MDA0OCwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDdjLCAweDc4Y2MsIDB4YTA4NCwgMHhmZmZkLCAweDc4Y2UsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDBjMCwgMHgxNjY0LCAweDEwNzgsIDB4MWEwZSwgMHg3MWM0LCAweDcxYzYsIDB4Nzk0YSwgMHgwMDdjLAorCTB4MTA3OCwgMHgxYjM2LCAweDAwYzAsIDB4MTI5YywgMHg3NWQ4LCAweDc0ZGMsIDB4NzVkYSwgMHg3NGRlLAorCTB4MDA3OCwgMHgxNjc1LCAweDIwMjksIDB4MDAwMCwgMHgyNTIwLCAweDcxYzQsIDB4NzNjOCwgMHg3MmNjLAorCTB4NzFjNiwgMHg3M2NhLCAweDcyY2UsIDB4MjA3OSwgMHg1MDAwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTkxMSwgMHgyMDkxLCAweDgwMDEsIDB4MDA0MCwgMHgxNzJjLCAweDIwYTksIDB4MDAwNSwgMHgyMGExLAorCTB4NTAxOCwgMHgyMDkxLCAweDgwMDAsIDB4NDFhMSwgMHgyMDkxLCAweDgwMDEsIDB4MjAwOSwgMHgwMDIwLAorCTB4MTA3OCwgMHgxOTBjLCAweDAwNDAsIDB4MTY5OCwgMHgxMDc4LCAweDE5MmIsIDB4MDA3OCwgMHgxNzJjLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmMDAsIDB4ODAwNywgMHg4MDA5LCAweDAwNDAsIDB4MTZmYiwgMHgwYzdlLAorCTB4MmM2OCwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxOTExLCAweDIwOTEsIDB4ODAwMSwgMHgwMDQwLAorCTB4MTZjYywgMHgyYzAwLCAweDY4OWUsIDB4ODEwOSwgMHgwMGMwLCAweDE2YTAsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MGM3ZiwgMHgwYzdlLCAweDcyMTgsIDB4NzMxYywgMHg3NDIwLCAweDc1MjQsIDB4MmM2OCwgMHg2ODljLAorCTB4YTA2NSwgMHgwMDQwLCAweDE2ZmEsIDB4MjAwOSwgMHgwMDIwLCAweDEwNzgsIDB4MTkwYywgMHgwMGMwLAorCTB4MTZlMywgMHg2MDA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgxNmNjLAorCTB4MmQwMCwgMHg2MDAyLCAweDAwNzgsIDB4MTZiMiwgMHgwYzdmLCAweDBjN2UsIDB4NjA5YywgMHgyMDYwLAorCTB4MTA3OCwgMHgxOTk2LCAweDBjN2YsIDB4NjA5ZiwgMHgwMDAwLCAweDEwNzgsIDB4MTczMCwgMHgyMDA5LAorCTB4MDAwYywgMHg2MDA4LCAweGEwODUsIDB4MDIwMCwgMHg2MDBhLCAweDEwNzgsIDB4MTkwNywgMHgxMDc4LAorCTB4MTkyYiwgMHgwMDc4LCAweDE3MmMsIDB4MGM3ZiwgMHgwYzdlLCAweDYwOWMsIDB4MjA2MCwgMHgxMDc4LAorCTB4MTk5NiwgMHgwYzdmLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LCAweDE3MzAsIDB4MjAwOSwgMHgwMDBjLAorCTB4NjAwNywgMHgwMTAzLCAweDYwMWIsIDB4MDAwMywgMHgxMDc4LCAweDE5MDcsIDB4MTA3OCwgMHgxOTJiLAorCTB4MDA3OCwgMHgxNzJjLCAweDBjN2YsIDB4NzRjNCwgMHg3M2M4LCAweDcyY2MsIDB4NjAxNCwgMHgyMDkxLAorCTB4ODAwMCwgMHg3ODE3LCAweDAwMTIsIDB4MGU3ZSwgMHgyMDcxLCAweDUwNDAsIDB4NzA2ZiwgMHgwMDA1LAorCTB4NzA3MywgMHgwMDAwLCAweDczNzYsIDB4NzI3YSwgMHg3NDdlLCAweDcwODIsIDB4NzA4NywgMHgwMDAwLAorCTB4MmMwMCwgMHg3MDhhLCAweDcwOGYsIDB4MDAwMCwgMHhhMDJlLCAweDI1MzAsIDB4NjExYywgMHg2MWEyLAorCTB4YTE4NCwgMHgwMDYwLCAweDAwNDAsIDB4MTcxZSwgMHgxMDc4LCAweDQ2N2YsIDB4MGU3ZiwgMHg2NTk2LAorCTB4NjVhNiwgMHg2NjlhLCAweDY2YWEsIDB4NjBhZiwgMHgwMDAwLCAweDYwYjMsIDB4MDAwMCwgMHgxMDc4LAorCTB4MjFiMSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3MGMzLCAweDQwMDUsIDB4MDA3OCwgMHgxMjg3LAorCTB4MjBhOSwgMHgwMDA1LCAweDIwOTksIDB4NTAxOCwgMHgyMDkxLCAweDgwMDAsIDB4NTMwYSwgMHgyMDkxLAorCTB4ODAwMSwgMHgyMTAwLCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LAorCTB4MDAwMCwgMHgwMDdjLCAweDcxYzQsIDB4NzBjNywgMHgwMDAwLCAweDc5MDYsIDB4MDA3OCwgMHgxMjg0LAorCTB4NzFjNCwgMHg3MWM2LCAweDIxNjgsIDB4MDA3OCwgMHgxNzRmLCAweDIwNjksIDB4MTAwMCwgMHg2OTBjLAorCTB4YTAxNiwgMHgyZDA0LCAweGEyMTAsIDB4OGQ2OCwgMHg4MTA5LCAweDAwYzAsIDB4MTc1MSwgMHhhMjg1LAorCTB4MDAwMCwgMHgwMGMwLCAweDE3NWYsIDB4NzBjMywgMHg0MDAwLCAweDAwNzgsIDB4MTc2MSwgMHg3MGMzLAorCTB4NDAwMywgMHg3MGNhLCAweDAwNzgsIDB4MTI4NywgMHgyMDExLCAweDUwNjcsIDB4MjIwYywgMHg3MGM0LAorCTB4ODAwMywgMHgwMDQ4LCAweDE3NzEsIDB4MTA3OCwgMHgzYjQ5LCAweGExODQsIDB4N2ZmZiwgMHgwMDc4LAorCTB4MTc3NSwgMHgxMDc4LCAweDNiM2MsIDB4YTE4NSwgMHg4MDAwLCAweDIwMTIsIDB4MDA3OCwgMHgxMjgzLAorCTB4NzFjNCwgMHgxMDc4LCAweDNiMzMsIDB4NjEwMCwgMHgyMDAxLCAweDUwNjcsIDB4MjAwNCwgMHhhMDg0LAorCTB4ODAwMCwgMHhhMTBkLCAweDYyMDQsIDB4NjMwOCwgMHgwMDc4LCAweDEyODEsIDB4NzllNCwgMHgwMDc4LAorCTB4MTI4MywgMHg3MWM0LCAweDcxYzYsIDB4MjE5OCwgMHgyMGExLCAweDAwNDIsIDB4MjBhOSwgMHgwMDA0LAorCTB4NTNhMywgMHgyMWEwLCAweDIwOTksIDB4MDA0MiwgMHgyMGE5LCAweDAwMDQsIDB4NTNhMywgMHgwMDc4LAorCTB4MTI4NCwgMHg3MGM0LCAweDIwNjgsIDB4MjA3OSwgMHg1MDAwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LAorCTB4MTkxMSwgMHgyMDkxLCAweDgwMDEsIDB4MDA0MCwgMHgxODI1LCAweDYwMDcsIDB4MDAwMSwgMHg2MDBiLAorCTB4MDAwMCwgMHg2MDJiLCAweDAwMDAsIDB4NjAxYiwgMHgwMDA2LCAweDZhMTAsIDB4YTI4YywgMHgwMDBmLAorCTB4YTI4NCwgMHgwMGYwLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHg2MDE2LAorCTB4YTI4NCwgMHgwODAwLCAweDAwNDAsIDB4MTdjMCwgMHg2MDFiLCAweDAwMGEsIDB4MDA3OCwgMHgxN2M2LAorCTB4YTI4NCwgMHgxMDAwLCAweDAwNDAsIDB4MTdjNiwgMHg2MDFiLCAweDAwMGMsIDB4YTI4NCwgMHgwMzAwLAorCTB4MDA0MCwgMHgxN2NmLCAweDYwMmIsIDB4MDAwMSwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHhhMDg1LAorCTB4MDAwMSwgMHg2MDFlLCAweDYwMjMsIDB4MDAwMCwgMHg2MDI3LCAweDAwMDAsIDB4YTI4NCwgMHgwNDAwLAorCTB4MDA0MCwgMHgxN2RjLCAweDYwMmIsIDB4MDAwMCwgMHgyMGE5LCAweDAwMDYsIDB4YWM4MCwgMHgwMDBiLAorCTB4MjBhMCwgMHhhZDgwLCAweDAwMDUsIDB4MjA5OCwgMHg1M2EzLCAweGEyODQsIDB4MDMwMCwgMHgwMGMwLAorCTB4MTdmMSwgMHg2MDQ2LCAweDYwNGEsIDB4NjA0ZSwgMHg2MDUyLCAweDYwOTYsIDB4NjA5YSwgMHgwMDc4LAorCTB4MTdmYiwgMHg2ODAwLCAweDYwNDYsIDB4NjgwNCwgMHg2MDRhLCAweDZlMDgsIDB4NjY0ZSwgMHg2ZDBjLAorCTB4NjU1MiwgMHg2NTk2LCAweDY2OWEsIDB4NjAxNCwgMHgyMDkxLCAweDgwMDAsIDB4NzgxNywgMHgwMDQyLAorCTB4MmMwOCwgMHgyMDYxLCAweDUwNDAsIDB4NjA2ZiwgMHgwMDA1LCAweDYwNzMsIDB4MDAwMCwgMHg2MDc3LAorCTB4MDAwMCwgMHg2MDdiLCAweDAwMDAsIDB4NjA3ZiwgMHgwMDAwLCAweDYwODIsIDB4NjE4YSwgMHhhMjg0LAorCTB4MDQwMCwgMHg2MDhlLCAweDIwOTEsIDB4ODAwMSwgMHgwZTdlLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA3LAorCTB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDBlN2YsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgyMWIxLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDcwYzMsIDB4NDAwNSwgMHgwMDc4LAorCTB4MTI4NywgMHgwYzdlLCAweDBkN2UsIDB4MGU3ZSwgMHgwZjdlLCAweDIwOTEsIDB4ODAwMCwgMHgyMDcxLAorCTB4NTA0MCwgMHgyMDc5LCAweDAxMDAsIDB4MjA2MSwgMHgwMDEwLCAweDcwYTAsIDB4YTA2ZCwgMHgwMDQwLAorCTB4MThhYSwgMHg2YTA0LCAweGEyOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDcsIDB4MDA0MCwgMHgxODQ0LAorCTB4YTI4NiwgMHgwMDBmLCAweDAwYzAsIDB4MThhYSwgMHg2OTFjLCAweGExODQsIDB4MDA4MCwgMHgwMGMwLAorCTB4MThhYSwgMHg2ODI0LCAweGExOGMsIDB4ZmYwMCwgMHhhMDg1LCAweDAwMTksIDB4NjgyNiwgMHg3MWIwLAorCTB4ODFmZiwgMHgwMDQwLCAweDE4NjUsIDB4MGQ3ZSwgMHgyMDY5LCAweDAwMjAsIDB4NjkwOCwgMHg2ODA4LAorCTB4YTEwNiwgMHgwMGMwLCAweDE4NTYsIDB4NjkwYywgMHg2ODBjLCAweGExMDYsIDB4MDBjMCwgMHgxODViLAorCTB4YTE4NCwgMHgwMGZmLCAweDAwYzAsIDB4MTg1YiwgMHgwZDdmLCAweDc4YjgsIDB4YTA4NCwgMHg4MDFmLAorCTB4MDBjMCwgMHgxODY1LCAweDc4NDgsIDB4YTA4NSwgMHgwMDBjLCAweDc4NGEsIDB4NzFiMCwgMHg4MWZmLAorCTB4MDA0MCwgMHgxODg4LCAweDcwYjMsIDB4MDAwMCwgMHgwZDdlLCAweDIwNjksIDB4MDAyMCwgMHg2ODA3LAorCTB4MDAwOCwgMHg2ODA0LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDE4NzksIDB4NjgwNywgMHgwMDA4LAorCTB4NjgwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgxODgwLCAweDY4MDcsIDB4MDAwMiwgMHgwZDdmLAorCTB4NjFjNCwgMHg2MmM4LCAweDYzY2MsIDB4NjFjNiwgMHg2MmNhLCAweDYzY2UsIDB4MGU3ZSwgMHgyMDcxLAorCTB4NTAwMCwgMHg3MjY2LCAweDczNmEsIDB4YWU4MCwgMHgwMDE5LCAweDBlN2YsIDB4MTA3OCwgMHg0NTk4LAorCTB4NzhhMywgMHgwMDAwLCAweDc4NTgsIDB4YTA4NCwgMHhlZGZmLCAweDc4NWEsIDB4NzBiNCwgMHhhMDgwLAorCTB4MDBkYSwgMHg3ODFhLCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3OCwgMHgxMjg0LCAweDBmN2YsIDB4MGU3ZiwgMHgwZDdmLCAweDBjN2YsIDB4MjA5MSwgMHg4MDAxLAorCTB4MjAwMSwgMHg0MDA1LCAweDAwNzgsIDB4MTI4NiwgMHg3OTgwLCAweDcxYzYsIDB4NzFjNCwgMHhhMTgyLAorCTB4MDAwMywgMHgwMGM4LCAweDEyN2MsIDB4Nzk4MiwgMHgwMDc4LCAweDEyODQsIDB4Nzk4MCwgMHg3MWM2LAorCTB4MDA3OCwgMHgxMjg0LCAweDc5NzQsIDB4NzFjNiwgMHg3MWM0LCAweDc5NzYsIDB4Nzk3OCwgMHg3MWNhLAorCTB4NzFjOCwgMHg3OTdhLCAweDc5N2MsIDB4NzFjZSwgMHg3MWNjLCAweDc5N2UsIDB4MDA3OCwgMHgxMjg0LAorCTB4Nzk3NCwgMHg3MWM2LCAweDc5NzgsIDB4NzFjYSwgMHg3OTdjLCAweDcxY2UsIDB4MDA3OCwgMHgxMjg0LAorCTB4NzkwMCwgMHg3MWM2LCAweDcxYzQsIDB4NzkwMiwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLAorCTB4MDAwNSwgMHgwMDQ4LCAweDE4ZTcsIDB4MDAzOCwgMHgxOGU5LCAweDAwNzgsIDB4MThmMywgMHgwMGE4LAorCTB4MThmMywgMHhhMThjLCAweDAwMDEsIDB4MDBjMCwgMHgxOGYxLCAweDIwYjksIDB4MjIyMiwgMHgwMDc4LAorCTB4MThmMywgMHgyMGI5LCAweDEyMTIsIDB4MDA3OCwgMHgxMjg0LCAweDc5MDAsIDB4NzFjNiwgMHgwMDc4LAorCTB4MTI4NCwgMHgyMDA5LCAweDUwNzQsIDB4MjEwNCwgMHg3MGM2LCAweDcwYzQsIDB4MjAwYSwgMHgwMDc4LAorCTB4MTI4NCwgMHgyMDA5LCAweDUwNzQsIDB4MjEwNCwgMHg3MGM2LCAweDAwNzgsIDB4MTI4NCwgMHhhYzgwLAorCTB4MDAwMSwgMHgxMDc4LCAweDFhZjIsIDB4MDA3YywgMHhhYzgwLCAweDAwMDEsIDB4MTA3OCwgMHgxYTkyLAorCTB4MDA3YywgMHg3ODUwLCAweGEwNjUsIDB4MDA0MCwgMHgxOTE5LCAweDJjMDQsIDB4Nzg1MiwgMHgyMDYzLAorCTB4MDAwMCwgMHgwMDdjLCAweDBmN2UsIDB4MjA3OSwgMHg1MDAwLCAweDc4NTAsIDB4YTA2ZCwgMHgwMDQwLAorCTB4MTkyOSwgMHgyZDA0LCAweDc4NTIsIDB4NjgwMywgMHgwMDAwLCAweDY4MDcsIDB4MDAwMCwgMHg2ODBiLAorCTB4MDAwMCwgMHgwZjdmLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDBmN2UsIDB4MjA3OSwgMHg1MDAwLAorCTB4Nzg1MCwgMHgyMDYyLCAweDJjMDAsIDB4YTAwNSwgMHgwMGMwLCAweDE5MzgsIDB4MTA3OCwgMHgyM2NhLAorCTB4Nzg1MiwgMHgwZjdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDBmN2UsIDB4MjA3OSwgMHg1MDAwLAorCTB4Nzg1MCwgMHgyMDZhLCAweDJkMDAsIDB4Nzg1MiwgMHgwZjdmLCAweDAwN2MsIDB4MjAxMSwgMHg3NzAwLAorCTB4N2E1MiwgMHg3YmVjLCAweDgzMTksIDB4MDA0MCwgMHgxOTUzLCAweGEyODAsIDB4MDAzMSwgMHgyMDEyLAorCTB4MjAxMCwgMHgwMDc4LCAweDE5NGEsIDB4MjAxMywgMHgwMDAwLCAweDAwN2MsIDB4YTc4NCwgMHgwZjAwLAorCTB4ODAwYiwgMHhhNzg0LCAweDAwMWYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LAorCTB4YTBlOCwgMHg1MzAwLCAweDAwN2MsIDB4MTA3OCwgMHgxOTU2LCAweDI5MDAsIDB4NjgyYSwgMHgyYTAwLAorCTB4NjgyZSwgMHg2ODA4LCAweGEwODQsIDB4ZmZlZiwgMHhhODBkLCAweDY5MGEsIDB4MjAwOSwgMHg1MDUyLAorCTB4MjEwYywgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxOTk1LCAweGExMTYsIDB4MDBjMCwgMHgxOTgwLAorCTB4MjA2MCwgMHg2MDAwLCAweDY4MDYsIDB4MDE3ZSwgMHgyMDBiLCAweDAwMDAsIDB4MDA3OCwgMHgxOTgzLAorCTB4MjAwOSwgMHgwMDAwLCAweDAxN2UsIDB4NjgwNCwgMHhhMDY1LCAweDAwNDAsIDB4MTk5MiwgMHg2MDAwLAorCTB4NjgwNiwgMHgxMDc4LCAweDE5YTMsIDB4MTA3OCwgMHgxYzQyLCAweDY4MTAsIDB4ODAwMSwgMHg2ODEyLAorCTB4MDBjMCwgMHgxOTgzLCAweDAxN2YsIDB4NjkwMiwgMHg2OTA2LCAweDAwN2MsIDB4YTA2NSwgMHgwMDQwLAorCTB4MTlhMiwgMHg2MDljLCAweDYwOWYsIDB4MDAwMCwgMHgyMDA4LCAweDEwNzgsIDB4MTkyYiwgMHgyMTAwLAorCTB4MDA3OCwgMHgxOTk2LCAweDAwN2MsIDB4NjAwNywgMHgwMTAzLCAweDYwOGYsIDB4MDAwMCwgMHgyMGE5LAorCTB4MDAxYywgMHhhYzgwLCAweDAwMDUsIDB4MjBhMCwgMHgyMDAxLCAweDAwMDAsIDB4NDBhNCwgMHg2ODI4LAorCTB4NjAxYSwgMHg2ODJjLCAweDYwMjIsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsIDB4NTA0MCwgMHg3MDRjLAorCTB4YTA4YywgMHgwMjAwLCAweDAwYzAsIDB4MTljMiwgMHhhMDg4LCAweDUwODAsIDB4MmQwYSwgMHg4MDAwLAorCTB4NzA0ZSwgMHhhMDA2LCAweDBlN2YsIDB4MDA3YywgMHgxMDc4LCAweDE5NTYsIDB4MjA5MSwgMHg4MDAwLAorCTB4NjgwNCwgMHg3ODFlLCAweGEwNjUsIDB4MDA0MCwgMHgxYTBkLCAweDAwNzgsIDB4MTlkNSwgMHgyYzAwLAorCTB4NzgxZSwgMHg2MDAwLCAweGEwNjUsIDB4MDA0MCwgMHgxYTBkLCAweDYwMGMsIDB4YTMwNiwgMHgwMGMwLAorCTB4MTljZiwgMHg2MDEwLCAweGEyMDYsIDB4MDBjMCwgMHgxOWNmLCAweDJjMjgsIDB4MjAwMSwgMHg1MDUyLAorCTB4MjAwNCwgMHhhYzA2LCAweDAwYzAsIDB4MTllNiwgMHgwMDc4LCAweDFhMGIsIDB4NjgwNCwgMHhhYzA2LAorCTB4MDBjMCwgMHgxOWYzLCAweDYwMDAsIDB4YTA2NSwgMHg2ODA2LCAweDAwYzAsIDB4MTlmZCwgMHg2ODAzLAorCTB4MDAwMCwgMHgwMDc4LCAweDE5ZmQsIDB4NjQwMCwgMHg3ODFjLCAweDIwNjAsIDB4NjQwMiwgMHhhNDg2LAorCTB4MDAwMCwgMHgwMGMwLCAweDE5ZmQsIDB4MmMwMCwgMHg2ODAyLCAweDI1NjAsIDB4MTA3OCwgMHgxOWEzLAorCTB4NjAxYiwgMHgwMDA1LCAweDYwMjMsIDB4MDAyMCwgMHgxMDc4LCAweDFjNDIsIDB4NjgxMCwgMHg4MDAxLAorCTB4MTA1MCwgMHgyM2NhLCAweDY4MTIsIDB4YTA4NSwgMHhmZmZmLCAweDAwN2MsIDB4MjAzOSwgMHgwMDAwLAorCTB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMDgsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgxOTYzLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLCAweDAwYzAsIDB4MWExOCwgMHhhN2JjLAorCTB4ZmYwMCwgMHg4NzNmLCAweDg3MzgsIDB4ODczZiwgMHhhNzg0LCAweDBmMDAsIDB4MDBjMCwgMHgxYTE4LAorCTB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MjA2MSwgMHgwMDAwLCAweDYwMTgsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDBjMCwgMHgxYTNjLCAweDIwOTEsIDB4ODAwMCwgMHg3OGUwLCAweDc4ZTMsIDB4MDAwMCwgMHgyMDkxLAorCTB4ODAwMSwgMHhhMDA1LCAweDAwYzAsIDB4MWEzZCwgMHgwMDdjLCAweGEwOGMsIDB4ZmZmMCwgMHgwMDQwLAorCTB4MWE0MywgMHgxMDc4LCAweDIzY2EsIDB4MDA3OSwgMHgxYTQ1LCAweDFhNTUsIDB4MWE1OCwgMHgxYTVlLAorCTB4MWE2MiwgMHgxYTU2LCAweDFhNjYsIDB4MWE2YywgMHgxYTU2LCAweDFhNTYsIDB4MWMwYywgMHgxYzMwLAorCTB4MWMzNCwgMHgxYTU2LCAweDFhNTYsIDB4MWE1NiwgMHgxYTU2LCAweDAwN2MsIDB4MTA3OCwgMHgyM2NhLAorCTB4MTA3OCwgMHgxYTBlLCAweDIwMDEsIDB4ODAwMSwgMHgwMDc4LCAweDFjM2EsIDB4MjAwMSwgMHg4MDAzLAorCTB4MDA3OCwgMHgxYzNhLCAweDIwMDEsIDB4ODAwNCwgMHgwMDc4LCAweDFjM2EsIDB4MTA3OCwgMHgxYTBlLAorCTB4MjAwMSwgMHg4MDA2LCAweDAwNzgsIDB4MWMzYSwgMHgyMDAxLCAweDgwMDcsIDB4MDA3OCwgMHgxYzNhLAorCTB4MjAzMCwgMHgyMTM4LCAweGE3ODIsIDB4MDAyMSwgMHgwMDQ4LCAweDFhNzgsIDB4MjAwOSwgMHgwMDIwLAorCTB4MjYwMCwgMHgxMDc4LCAweDFhOTIsIDB4MDBjMCwgMHgxYTkxLCAweGE3YmEsIDB4MDAyMCwgMHgwMDQ4LAorCTB4MWE5MCwgMHgwMDQwLCAweDFhOTAsIDB4MjcwOCwgMHhhNmIwLCAweDAwMjAsIDB4YTI5MCwgMHgwMDQwLAorCTB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3OCwgMHgxYTcyLAorCTB4YTAwNiwgMHgwMDdjLCAweDgxZmYsIDB4MDA0MCwgMHgxYWNkLCAweDIwOTksIDB4MDAzMCwgMHgyMGEwLAorCTB4NzAwYywgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHgxYWE0LCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LAorCTB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MWE5ZiwgMHgyMWE4LCAweDcwMTcsIDB4MDAwMCwgMHg4MTBiLAorCTB4NzExMiwgMHg3MjFhLCAweDczMWUsIDB4NzQyMiwgMHg3NTI2LCAweDc4MGMsIDB4YTA4NSwgMHgwMDAxLAorCTB4NzAwMiwgMHg3MDA3LCAweDAwMDEsIDB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LAorCTB4MDBjOCwgMHgxYWMxLCAweDIwMDksIDB4MDAyMiwgMHgyMTA0LCAweGEwODQsIDB4NDAwMCwgMHgwMGMwLAorCTB4MWFiMywgMHg3MDA4LCAweDgwMGIsIDB4MDBjOCwgMHgxYWIzLCAweDcwMDcsIDB4MDAwMiwgMHhhMDhjLAorCTB4MDFlMCwgMHgwMGMwLCAweDFhY2QsIDB4NTNhNSwgMHhhMDA2LCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLAorCTB4MjAzMCwgMHgyMTM4LCAweGE3ODIsIDB4MDAyMSwgMHgwMDQ4LCAweDFhZDgsIDB4MjAwOSwgMHgwMDIwLAorCTB4MjYwMCwgMHgxMDc4LCAweDFhZjIsIDB4MDBjMCwgMHgxYWYxLCAweGE3YmEsIDB4MDAyMCwgMHgwMDQ4LAorCTB4MWFmMCwgMHgwMDQwLCAweDFhZjAsIDB4MjcwOCwgMHhhNmIwLCAweDAwMjAsIDB4YTI5MCwgMHgwMDQwLAorCTB4YTM5OSwgMHgwMDAwLCAweGE0YTEsIDB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3OCwgMHgxYWQyLAorCTB4YTAwNiwgMHgwMDdjLCAweDgxZmYsIDB4MDA0MCwgMHgxYjMzLCAweDIwOTgsIDB4MjBhMSwgMHgwMDMwLAorCTB4NzAwYywgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHgxYjA0LCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LAorCTB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MWFmZiwgMHgyMWE4LCAweDcwMTcsIDB4MDAwMCwgMHg4MTBiLAorCTB4NzExMiwgMHg3MjFhLCAweDczMWUsIDB4NzQyMiwgMHg3NTI2LCAweDc4MGMsIDB4YTA4NSwgMHgwMDAwLAorCTB4NzAwMiwgMHg1M2E2LCAweDcwMDcsIDB4MDAwMSwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLAorCTB4MDAwNSwgMHgwMGM4LCAweDFiMjIsIDB4MjAwOSwgMHgwMDIyLCAweDIxMDQsIDB4YTA4NCwgMHg0MDAwLAorCTB4MDBjMCwgMHgxYjE0LCAweDcwMTAsIDB4YTA4NCwgMHhmMDAwLCAweDAwNDAsIDB4MWIyYiwgMHg3MDA3LAorCTB4MDAwOCwgMHgwMDc4LCAweDFiMmYsIDB4NzEwOCwgMHg4MTAzLCAweDAwYzgsIDB4MWIxNCwgMHg3MDA3LAorCTB4MDAwMiwgMHhhMTg0LCAweDAxZTAsIDB4NzAwMywgMHgwMDAwLCAweDAwN2MsIDB4MjAwMSwgMHgwNGZkLAorCTB4MjAwNCwgMHhhMDgyLCAweDAwMDQsIDB4MDBjOCwgMHgxYjNmLCAweDAwNzgsIDB4MWI0MiwgMHhhMDA2LAorCTB4MDA3OCwgMHgxYjQ0LCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweDBlN2UsIDB4MjA3MSwgMHg1MDAwLAorCTB4MmQwOCwgMHg3MDU4LCAweDY4MDIsIDB4YTAwNSwgMHgwMGMwLCAweDFiNGYsIDB4NzE1ZSwgMHg3MTVhLAorCTB4MGU3ZiwgMHgwMDdjLCAweDJjMDgsIDB4Nzg1OCwgMHg2MDAyLCAweGEwMDUsIDB4MDBjMCwgMHgxYjU5LAorCTB4Nzk1ZSwgMHg3OTVhLCAweDAwN2MsIDB4MjA5MSwgMHg4MDAwLCAweDYwMDMsIDB4MDAwMCwgMHgyYzA4LAorCTB4Nzg1YywgMHhhMDY1LCAweDAwYzAsIDB4MWI2NywgMHg3OTVhLCAweDAwNzgsIDB4MWI2OCwgMHg2MTAyLAorCTB4Nzk1ZSwgMHgyMDkxLCAweDgwMDEsIDB4MTA3OCwgMHgyMWNlLCAweDAwN2MsIDB4MGU3ZSwgMHgyMDcxLAorCTB4NTAwMCwgMHg3MDU4LCAweGEwNmQsIDB4MDA0MCwgMHgxYjdjLCAweDY4MDAsIDB4NzA1YSwgMHhhMDA1LAorCTB4MDBjMCwgMHgxYjdiLCAweDcwNWUsIDB4OGRmZiwgMHgwZTdmLCAweDAwN2MsIDB4MGQ3ZSwgMHgwYzdlLAorCTB4MGY3ZSwgMHgyMDc5LCAweDUwMDAsIDB4YWY4MCwgMHgwMDE2LCAweDIwNjAsIDB4NjAwMCwgMHhhMDA1LAorCTB4MDA0MCwgMHgxYmFjLCAweDIwNjgsIDB4NjgxNCwgMHhhMzA2LCAweDAwYzAsIDB4MWI5NSwgMHg2ODI4LAorCTB4YTA4NCwgMHgwMGZmLCAweGE0MDYsIDB4MDA0MCwgMHgxYjk4LCAweDJkNjAsIDB4MDA3OCwgMHgxYjg2LAorCTB4NjgwMCwgMHhhMDA1LCAweDYwMDIsIDB4MDBjMCwgMHgxYmE0LCAweGFmODAsIDB4MDAxNiwgMHhhYzA2LAorCTB4MDA0MCwgMHgxYmEzLCAweDJjMDAsIDB4Nzg1ZSwgMHgwZDdlLCAweDY4OWMsIDB4YTAwNSwgMHgwMDQwLAorCTB4MWJhYiwgMHgxMDc4LCAweDE5OTYsIDB4MDA3ZiwgMHgwZjdmLCAweDBjN2YsIDB4MGQ3ZiwgMHhhMDA1LAorCTB4MDA3YywgMHgwZDdlLCAweDBjN2UsIDB4MGY3ZSwgMHgyMDc5LCAweDUwMDAsIDB4YWY4MCwgMHgwMDE2LAorCTB4MjA2MCwgMHg2MDAwLCAweGEwMDUsIDB4MDA0MCwgMHgxYmRiLCAweDIwNjgsIDB4NjgxNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhMzA2LCAweDAwNDAsIDB4MWJjNywgMHgyZDYwLCAweDAwNzgsIDB4MWJiOSwgMHg2ODAwLAorCTB4YTAwNSwgMHg2MDAyLCAweDAwYzAsIDB4MWJkMywgMHhhZjgwLCAweDAwMTYsIDB4YWMwNiwgMHgwMDQwLAorCTB4MWJkMiwgMHgyYzAwLCAweDc4NWUsIDB4MGQ3ZSwgMHg2ODljLCAweGEwMDUsIDB4MDA0MCwgMHgxYmRhLAorCTB4MTA3OCwgMHgxOTk2LCAweDAwN2YsIDB4MGY3ZiwgMHgwYzdmLCAweDBkN2YsIDB4YTAwNSwgMHgwMDdjLAorCTB4MGQ3ZSwgMHgwYzdlLCAweDBmN2UsIDB4MjA3OSwgMHg1MDAwLCAweGFmODAsIDB4MDAxNiwgMHgyMDYwLAorCTB4NjAwMCwgMHhhMDZkLCAweDAwNDAsIDB4MWMwNywgMHg2ODE0LCAweGEzMDYsIDB4MDA0MCwgMHgxYmYzLAorCTB4MmQ2MCwgMHgwMDc4LCAweDFiZTgsIDB4NjgwMCwgMHhhMDA1LCAweDYwMDIsIDB4MDBjMCwgMHgxYmZmLAorCTB4YWY4MCwgMHgwMDE2LCAweGFjMDYsIDB4MDA0MCwgMHgxYmZlLCAweDJjMDAsIDB4Nzg1ZSwgMHgwZDdlLAorCTB4Njg5YywgMHhhMDA1LCAweDAwNDAsIDB4MWMwNiwgMHgxMDc4LCAweDE5OTYsIDB4MDA3ZiwgMHgwZjdmLAorCTB4MGM3ZiwgMHgwZDdmLCAweGEwMDUsIDB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHg1MDQwLAorCTB4NjgwMCwgMHhhMDg2LCAweDAwMDAsIDB4MDA0MCwgMHgxYzFhLCAweDIwOTEsIDB4ODAwMSwgMHg3OGUzLAorCTB4MDAwOSwgMHgwMDdjLCAweDY4ODAsIDB4YTBiYywgMHhmZjAwLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LAorCTB4MDAwNCwgMHgyMDUxLCAweDAwMTAsIDB4MTA3OCwgMHgxOTYzLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLAorCTB4MDBjMCwgMHgxYzIzLCAweDIwOTEsIDB4ODAwMSwgMHgyMDAxLCAweDgwMGEsIDB4MDA3OCwgMHgxYzNhLAorCTB4MjAwMSwgMHg4MDBjLCAweDAwNzgsIDB4MWMzYSwgMHgxMDc4LCAweDFhMGUsIDB4MjAwMSwgMHg4MDBkLAorCTB4MDA3OCwgMHgxYzNhLCAweDcwYzIsIDB4MjA2MSwgMHgwMDAwLCAweDYwMWIsIDB4MDAwMSwgMHgyMDkxLAorCTB4NDA4MCwgMHgwMDdjLCAweDYwMDQsIDB4MmMwOCwgMHgyMDYzLCAweDAwMDAsIDB4Nzg4NCwgMHg4MDAwLAorCTB4Nzg4NiwgMHg3ODg4LCAweGEwMDUsIDB4Nzk4YSwgMHgwMDQwLCAweDFjNTEsIDB4MmMwMiwgMHgwMDc4LAorCTB4MWM1MiwgMHg3OThlLCAweDAwN2MsIDB4NjgwNywgMHgwMTAzLCAweDBjN2UsIDB4MjA2MSwgMHg1MDAwLAorCTB4MmQwOCwgMHgyMDZiLCAweDAwMDAsIDB4NjA4NCwgMHg4MDAwLCAweDYwODYsIDB4NjA4OCwgMHhhMDA1LAorCTB4NjE4YSwgMHgwMDQwLCAweDFjNjYsIDB4MmQwMiwgMHgwMDc4LCAweDFjNjcsIDB4NjE4ZSwgMHgwYzdmLAorCTB4MDA3YywgMHgxMDc4LCAweDFjN2EsIDB4MDA0MCwgMHgxYzc5LCAweDBjN2UsIDB4NjA5YywgMHhhMDY1LAorCTB4MDA0MCwgMHgxYzc0LCAweDEwNzgsIDB4MTk5NiwgMHgwYzdmLCAweDYwOWYsIDB4MDAwMCwgMHgxMDc4LAorCTB4MTkyYiwgMHgwMDdjLCAweDc4OGMsIDB4YTA2NSwgMHgwMDQwLCAweDFjOGMsIDB4MjA5MSwgMHg4MDAwLAorCTB4Nzg4NCwgMHg4MDAxLCAweDc4ODYsIDB4MmMwNCwgMHg3ODhlLCAweGEwMDUsIDB4MDBjMCwgMHgxYzhhLAorCTB4Nzg4YSwgMHg4MDAwLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDIwYTksIDB4MDAxMCwgMHhhMDA2LAorCTB4ODAwNCwgMHg4MDg2LCAweDgxOGUsIDB4MDBjOCwgMHgxYzk2LCAweGEyMDAsIDB4MDA3MCwgMHgxYzlhLAorCTB4MDA3OCwgMHgxYzkxLCAweDgwODYsIDB4ODE4ZSwgMHgwMDdjLCAweDE1N2UsIDB4MjBhOSwgMHgwMDEwLAorCTB4YTAwNSwgMHgwMDQwLCAweDFjYzAsIDB4YTExYSwgMHgwMGM4LCAweDFjYzAsIDB4ODIxMywgMHg4MThkLAorCTB4MDA0OCwgMHgxY2IxLCAweGExMWEsIDB4MDBjOCwgMHgxY2IyLCAweDAwNzAsIDB4MWNiOCwgMHgwMDc4LAorCTB4MWNhNiwgMHhhMTFhLCAweDIzMDgsIDB4ODIxMCwgMHgwMDcwLCAweDFjYjgsIDB4MDA3OCwgMHgxY2E2LAorCTB4MDA3ZSwgMHgzMjAwLCAweGEwODQsIDB4ZjdmZiwgMHgyMDgwLCAweDAwN2YsIDB4MTU3ZiwgMHgwMDdjLAorCTB4MDA3ZSwgMHgzMjAwLCAweGEwODUsIDB4MDgwMCwgMHgwMDc4LCAweDFjYmMsIDB4Nzk5NCwgMHg3MGQwLAorCTB4YTEwNiwgMHgwMDQwLCAweDFkMzQsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDFkMzQsIDB4NzAwOCwgMHg3MjA4LCAweGEyMDYsIDB4MDBjMCwgMHgxZDM0LAorCTB4YTI4NiwgMHgwMDA4LCAweDAwYzAsIDB4MWQzNCwgMHgyMDcxLCAweDAwMTAsIDB4MTA3OCwgMHgxOTExLAorCTB4MDA0MCwgMHgxZDM0LCAweDdhOWMsIDB4N2I5OCwgMHg3Y2E0LCAweDdkYTAsIDB4YTE4NCwgMHhmZjAwLAorCTB4MDA0MCwgMHgxZDAyLCAweDIwMzEsIDB4MDAwMCwgMHg4MTBiLCAweDg2YjUsIDB4ODEwYiwgMHg4NmI1LAorCTB4ODEwYiwgMHg4NmI1LCAweDgxMGIsIDB4ODZiNSwgMHg4MTBiLCAweDg2YjUsIDB4ODEwYiwgMHg4NmI1LAorCTB4MjEwMCwgMHhhMjEwLCAweDI2MDAsIDB4YTMxOSwgMHhhNGExLCAweDAwMDAsIDB4YTVhOSwgMHgwMDAwLAorCTB4MDA3OCwgMHgxZDBjLCAweDgxMDcsIDB4ODAwNCwgMHg4MDA0LCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLAorCTB4YTRhMSwgMHgwMDAwLCAweGE1YTksIDB4MDAwMCwgMHgyMDA5LCAweDAwMjAsIDB4MTA3OCwgMHgxOTBjLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwNDAsIDB4MWQyYiwgMHgxMDc4LCAweDE5MmIsIDB4NzhhOCwgMHg4MDAwLAorCTB4NzhhYSwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgxZDM0LCAweDIwOTEsIDB4ODAwMCwgMHg3OGUzLAorCTB4MDAwMiwgMHg3OGFiLCAweDAwMDAsIDB4NzhjYywgMHhhMDg1LCAweDAwMDMsIDB4NzhjZSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDFkMzQsIDB4NzhhYiwgMHgwMDAwLCAweDEwNzgsIDB4MjA4YiwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMDBmLCAweDAwNzksIDB4MWQzOSwgMHgyMDcxLCAweDAwMTAsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3YywgMHgxZDQ5LCAweDFkNmIsIDB4MWQ5MSwgMHgxZDQ5LCAweDFkYWUsIDB4MWQ1OCwgMHgxZjBkLAorCTB4MWYyOCwgMHgxZDQ5LCAweDFkNjUsIDB4MWQ4YiwgMHgxZGY2LCAweDFlNjMsIDB4MWViMywgMHgxZWM1LAorCTB4MWYyNCwgMHgyMDM5LCAweDA0MDAsIDB4NzhkYywgMHhhNzA1LCAweDc4ZGUsIDB4NjAwOCwgMHhhNzA1LAorCTB4NjAwYSwgMHgxMDc4LCAweDFmYTYsIDB4NjA5YywgMHg3OGRhLCAweDEwNzgsIDB4MjA3MywgMHgwMDdjLAorCTB4NzhkYywgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxZDVmLCAweDAwNzgsIDB4MWQ0OSwgMHg2MDFjLAorCTB4YTA4NSwgMHgwMDgwLCAweDYwMWUsIDB4MDA3OCwgMHgxZDcyLCAweDEwNzgsIDB4MWIzNiwgMHgwMGMwLAorCTB4MWQ0OSwgMHgxMDc4LCAweDIwYTUsIDB4NzhkYywgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxZDcyLAorCTB4MDA3OCwgMHgxZDQ5LCAweDc4ZGYsIDB4MDAwMCwgMHg2MDA0LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4NzhkMiwgMHg4MDAxLCAweDYwOWYsIDB4MDAwMCwgMHgwMDQwLCAweDFkODgsIDB4MTA3OCwgMHgxZmE2LAorCTB4MDA0MCwgMHgxZDg4LCAweDc4ZGMsIDB4YTA4NSwgMHgwMTAwLCAweDc4ZGUsIDB4MDA3OCwgMHgxZDhhLAorCTB4MTA3OCwgMHgxZmNhLCAweDAwN2MsIDB4MTA3OCwgMHgxYjM2LCAweDAwYzAsIDB4MWQ0OSwgMHgxMDc4LAorCTB4MjBhMSwgMHg3OGRjLCAweGEwOGMsIDB4MGUwMCwgMHgwMGMwLCAweDFkOWEsIDB4YTA4NCwgMHgwMTAwLAorCTB4MDBjMCwgMHgxZDljLCAweDAwNzgsIDB4MWQ0OSwgMHgxMDc4LCAweDFmYTYsIDB4MDBjMCwgMHgxZGFkLAorCTB4NjEwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4MWY2MywgMHhhMTg2LAorCTB4MDAwZiwgMHgwMDQwLCAweDFmNjMsIDB4MTA3OCwgMHgxZmNhLCAweDAwN2MsIDB4NzhkYywgMHhhMDg0LAorCTB4MDEwMCwgMHgwMDQwLCAweDFkYjUsIDB4MDA3OCwgMHgxZDQ5LCAweDc4ZGYsIDB4MDAwMCwgMHg2NzE0LAorCTB4MjAxMSwgMHgwMDAxLCAweDIwYTksIDB4MDAwMSwgMHg2MDE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LAorCTB4MDA0MCwgMHgxZGQ4LCAweDIwMTEsIDB4MDAwMSwgMHhhN2JjLCAweGZmMDAsIDB4MjBhOSwgMHgwMDIwLAorCTB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsIDB4MWRkOCwgMHgyMDM5LCAweDAwMDAsIDB4MjAxMSwgMHgwMDAyLAorCTB4MjBhOSwgMHgwMTAwLCAweGEwOGUsIDB4MDAwMiwgMHgwMDQwLCAweDFkZDgsIDB4MDA3OCwgMHgxZGYzLAorCTB4MTA3OCwgMHgxOTU2LCAweDIwOTEsIDB4ODAwMCwgMHg2ODJiLCAweDAwMDAsIDB4NjgyZiwgMHgwMDAwLAorCTB4NjgwOCwgMHhhMDg0LCAweGZmZGUsIDB4NjgwYSwgMHhhZGU4LCAweDAwMTAsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3MCwgMHgxZGVjLCAweDAwNzgsIDB4MWRkYSwgMHg4MjExLCAweDAwNDAsIDB4MWRmMywgMHgyMGE5LAorCTB4MDEwMCwgMHgwMDc4LCAweDFkZGEsIDB4MTA3OCwgMHgxOTJiLCAweDAwN2MsIDB4MjAwMSwgMHg1MDY3LAorCTB4MjAwNCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgxZjhiLCAweDYxMTQsIDB4MTA3OCwgMHgyMGMyLAorCTB4NjkwMCwgMHhhMTg0LCAweDAwMDEsIDB4MDA0MCwgMHgxZTE3LCAweDYwMjgsIDB4YTA4NCwgMHgwMGZmLAorCTB4MDBjMCwgMHgxZjgzLCAweDY4MDAsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MWY4YiwgMHg2ODAzLAorCTB4MDAwMCwgMHg2ODBiLCAweDAwMDAsIDB4NjgwNywgMHgwMDAwLCAweDAwNzgsIDB4MWY5MywgMHgyMDExLAorCTB4MDAwMSwgMHg2MDIwLCAweGEwODQsIDB4NDAwMCwgMHgwMDQwLCAweDFlMjAsIDB4YTI5NSwgMHgwMDAyLAorCTB4NjAyMCwgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxZTI3LCAweGEyOTUsIDB4MDAwOCwgMHg2MDFjLAorCTB4YTA4NCwgMHgwMDAyLCAweDAwNDAsIDB4MWUyZSwgMHhhMjk1LCAweDAwMDQsIDB4NjAyYywgMHhhMDhjLAorCTB4MDBmZiwgMHhhMTgyLCAweDAwMDIsIDB4MDA0OCwgMHgxZjhmLCAweGExODIsIDB4MDAxYiwgMHgwMGM4LAorCTB4MWY4ZiwgMHgwMDQwLCAweDFmOGYsIDB4NjkwZSwgMHg2MDJjLCAweDgwMDcsIDB4YTA4YywgMHgwMGZmLAorCTB4YTE4MiwgMHgwMDAyLCAweDAwNDgsIDB4MWY4ZiwgMHhhMTgyLCAweDAwMWIsIDB4MDBjOCwgMHgxZjhmLAorCTB4MDA0MCwgMHgxZjhmLCAweDY5MTIsIDB4NjAzMCwgMHhhMDA1LCAweDAwYzAsIDB4MWU1MSwgMHgyMDAxLAorCTB4MDAxZSwgMHg4MDAwLCAweDY4MTYsIDB4NjAyOCwgMHhhMDg0LCAweDAwZmYsIDB4MDA0MCwgMHgxZjhiLAorCTB4NjgwNiwgMHg2MDI4LCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLCAweDAwNDAsIDB4MWY4YiwgMHg2ODBhLAorCTB4NmEwMiwgMHgwMDc4LCAweDFmOTMsIDB4MjAwMSwgMHg1MDY3LCAweDIwMDQsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgxZjhiLCAweDYxMTQsIDB4MTA3OCwgMHgyMGMyLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA0LAorCTB4NmIwOCwgMHg2NDE4LCAweGE0ODQsIDB4MDAwMywgMHgwMDQwLCAweDFlODksIDB4NjEyOCwgMHhhMThjLAorCTB4MDBmZiwgMHg4MDAxLCAweDAwYzAsIDB4MWU4MiwgMHgyMTAwLCAweGEyMTAsIDB4MDA0OCwgMHgxZWFmLAorCTB4MDA3OCwgMHgxZTg5LCAweDgwMDEsIDB4MDBjMCwgMHgxZWFmLCAweDIxMDAsIDB4YTIxMiwgMHgwMDQ4LAorCTB4MWVhZiwgMHhhNDg0LCAweDAwMGMsIDB4MDA0MCwgMHgxZWEzLCAweDYxMjgsIDB4ODEwZiwgMHhhMThjLAorCTB4MDBmZiwgMHhhMDgyLCAweDAwMDQsIDB4MDBjMCwgMHgxZTliLCAweDIxMDAsIDB4YTMxOCwgMHgwMDQ4LAorCTB4MWVhZiwgMHgwMDc4LCAweDFlYTMsIDB4YTA4MiwgMHgwMDA0LCAweDAwYzAsIDB4MWVhZiwgMHgyMTAwLAorCTB4YTMxYSwgMHgwMDQ4LCAweDFlYWYsIDB4NjAzMCwgMHhhMDA1LCAweDAwNDAsIDB4MWVhOSwgMHg4MDAwLAorCTB4NjgxNiwgMHg2YTA2LCAweDZiMGEsIDB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWY5MywgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDFmOGYsIDB4NjExNCwgMHgxMDc4LCAweDIwYzIsIDB4MjA5MSwgMHg4MDAwLAorCTB4NmIwOCwgMHg4MzE4LCAweDAwNDgsIDB4MWVjMSwgMHg2YjBhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LAorCTB4MWZhMiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZjhmLCAweDYwMjQsIDB4ODAwNywgMHhhMDg0LAorCTB4MDBmZiwgMHgwMDQwLCAweDFlZTMsIDB4YTA4NiwgMHgwMDgwLCAweDAwYzAsIDB4MWYwYiwgMHgyMGE5LAorCTB4MDAwOCwgMHgyMDY5LCAweDc0MTAsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDAsIDB4YTA4NCwgMHhmY2ZmLAorCTB4NjgwMiwgMHhhZGU4LCAweDAwMDgsIDB4MDA3MCwgMHgxZWRmLCAweDAwNzgsIDB4MWVkNSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDFmOTMsIDB4NjAyOCwgMHhhMDE1LCAweDAwNDAsIDB4MWYwYiwgMHg2MTE0LAorCTB4MTA3OCwgMHgyMGMyLCAweDBkN2UsIDB4YWRlOCwgMHgwMDA3LCAweDIwOTEsIDB4ODAwMCwgMHg2ODAwLAorCTB4YTAwZCwgMHgwMDQwLCAweDFmMDgsIDB4YTIwNiwgMHgwMDQwLCAweDFlZjksIDB4MjE2OCwgMHgwMDc4LAorCTB4MWVlZiwgMHgwYzdlLCAweDIxNjAsIDB4NjAwMCwgMHg2ODAyLCAweDEwNzgsIDB4MTkyYiwgMHgwYzdmLAorCTB4MGQ3ZiwgMHg2ODA4LCAweDgwMDAsIDB4NjgwYSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZmEyLAorCTB4MjA5MSwgMHg4MDAxLCAweDBkN2YsIDB4MDA3OCwgMHgxZjhiLCAweDYxMTQsIDB4MTA3OCwgMHgyMGMyLAorCTB4NjgwMCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxZjdiLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA0LAorCTB4ODIxMCwgMHgwMDQ4LCAweDFmMjAsIDB4NmEwNiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxZmEyLAorCTB4MjA5MSwgMHg4MDAxLCAweDAwNzgsIDB4MWY4ZiwgMHgxMDc4LCAweDFiMzYsIDB4MDBjMCwgMHgxZDQ5LAorCTB4NjExNCwgMHgxMDc4LCAweDIwYzIsIDB4NjBiZSwgMHg2OTAwLCAweGExODQsIDB4MDAwOCwgMHgwMDQwLAorCTB4MWYzNSwgMHg2MDIwLCAweGEwODUsIDB4MDEwMCwgMHg2MDIyLCAweGExODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4MWY4YiwgMHhhMTg0LCAweDAxMDAsIDB4MDBjMCwgMHgxZjc3LCAweGExODQsIDB4MDIwMCwgMHgwMGMwLAorCTB4MWY3MywgMHg2ODFjLCAweGEwMDUsIDB4MDBjMCwgMHgxZjdmLCAweDYwMDQsIDB4YTA4NCwgMHgwMGZmLAorCTB4YTA4NiwgMHgwMDBmLCAweDAwYzAsIDB4MWY0ZSwgMHgxMDc4LCAweDIwYTUsIDB4NzhkZiwgMHgwMDAwLAorCTB4NjAwNCwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg3OGQyLCAweDgwMDEsIDB4NjA5ZiwgMHgwMDAwLAorCTB4MDA0MCwgMHgxZjYzLCAweDEwNzgsIDB4MWZhNiwgMHgwMDQwLCAweDFmNjMsIDB4NzhkYywgMHhhMDg1LAorCTB4MDEwMCwgMHg3OGRlLCAweDAwN2MsIDB4NzhkNywgMHgwMDAwLCAweDc4ZGIsIDB4MDAwMCwgMHg2MDI0LAorCTB4YTA4NCwgMHhmZjAwLCAweDYwMjYsIDB4MTA3OCwgMHgzOWFhLCAweDAwNDAsIDB4MWNjNiwgMHgxMDc4LAorCTB4MWI1YiwgMHgwMDc4LCAweDFjYzYsIDB4MjAwOSwgMHgwMDE3LCAweDAwNzgsIDB4MWY5NSwgMHgyMDA5LAorCTB4MDAwZSwgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwgMHgwMDA3LCAweDAwNzgsIDB4MWY5NSwgMHgyMDA5LAorCTB4MDAzNSwgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwgMHgwMDNlLCAweDAwNzgsIDB4MWY5NSwgMHgyMDA5LAorCTB4MDAwNCwgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwgMHgwMDA2LCAweDAwNzgsIDB4MWY5NSwgMHgyMDA5LAorCTB4MDAxNiwgMHgwMDc4LCAweDFmOTUsIDB4MjAwOSwgMHgwMDAxLCAweDYwMjQsIDB4YTA4NCwgMHhmZjAwLAorCTB4YTEwNSwgMHg2MDI2LCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDFjNDIsIDB4MjA5MSwgMHg4MDAxLAorCTB4MDA3OCwgMHgxY2M2LCAweDEwNzgsIDB4MTkyYiwgMHgwMDc4LCAweDFjYzYsIDB4NzhkNCwgMHhhMDZkLAorCTB4MDBjMCwgMHgxZmIxLCAweDJjMDAsIDB4NzhkNiwgMHg3OGRhLCAweDYwOWYsIDB4MDAwMCwgMHgwMDc4LAorCTB4MWZiZCwgMHgyYzAwLCAweDY4OWUsIDB4NjA5ZiwgMHgwMDAwLCAweDc4ZDYsIDB4MmQwMCwgMHg2MDAyLAorCTB4NzhkOCwgMHhhZDA2LCAweDAwYzAsIDB4MWZiZCwgMHg2MDAyLCAweDc4ZDAsIDB4ODAwMSwgMHg3OGQyLAorCTB4MDBjMCwgMHgxZmM5LCAweDc4ZGMsIDB4YTA4NCwgMHhmZWZmLCAweDc4ZGUsIDB4NzhkOCwgMHgyMDYwLAorCTB4YTAwNiwgMHgwMDdjLCAweGEwMmUsIDB4MjUzMCwgMHg2MTFjLCAweDYxYTIsIDB4YTE4NCwgMHhlMWZmLAorCTB4NjAxZSwgMHhhMTg0LCAweDAwNjAsIDB4MDA0MCwgMHgxZmQ5LCAweDBlN2UsIDB4MTA3OCwgMHg0NjdmLAorCTB4MGU3ZiwgMHg2NTk2LCAweDY1YTYsIDB4NjY5YSwgMHg2NmFhLCAweDYwYWYsIDB4MDAwMCwgMHg2MGIzLAorCTB4MDAwMCwgMHg2NzE0LCAweDEwNzgsIDB4MTk1NiwgMHgyMDkxLCAweDgwMDAsIDB4NjBhMCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMGMwLCAweDIwMDAsIDB4NjgwOCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgyMDAwLAorCTB4MjA5MSwgMHg4MDAxLCAweDEwNzgsIDB4MTlhMywgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxYzQyLAorCTB4MjA5MSwgMHg4MDAxLCAweDc4ZDcsIDB4MDAwMCwgMHg3OGRiLCAweDAwMDAsIDB4MDA3OCwgMHgyMDcyLAorCTB4NjAyNCwgMHhhMDk2LCAweDAwMDEsIDB4MDBjMCwgMHgyMDA3LCAweDgwMDAsIDB4NjAyNiwgMHg2YTEwLAorCTB4NjgxNCwgMHgyMDkxLCAweDgwMDEsIDB4YTIwMiwgMHgwMDQ4LCAweDIwMTYsIDB4MDA0MCwgMHgyMDE2LAorCTB4MjAzOSwgMHgwMjAwLCAweDEwNzgsIDB4MjA3MywgMHgwMDc4LCAweDIwNzIsIDB4MmMwOCwgMHgyMDkxLAorCTB4ODAwMCwgMHg2MGEwLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDIwNDMsIDB4NjgwMCwgMHhhMDY1LAorCTB4MDA0MCwgMHgyMDQ4LCAweDZhMDQsIDB4MGU3ZSwgMHgyMDcxLCAweDUwNDAsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMDQwLCAweDIwM2QsIDB4NzA0OCwgMHhhMjA2LCAweDAwYzAsIDB4MjAzZCwgMHg2YjA0LAorCTB4MjMxYywgMHgyMTYwLCAweDYzMDIsIDB4MjMwMCwgMHhhMDA1LCAweDAwYzAsIDB4MjAzOCwgMHg2OTAyLAorCTB4MjI2MCwgMHg2MTAyLCAweDBlN2YsIDB4MDA3OCwgMHgyMDRmLCAweDIxNjAsIDB4NjIwMiwgMHg2OTA2LAorCTB4MGU3ZiwgMHgwMDc4LCAweDIwNGYsIDB4NjgwMCwgMHhhMDY1LCAweDAwNDAsIDB4MjA0OCwgMHg2MTAyLAorCTB4NjkwMiwgMHgwMGMwLCAweDIwNGMsIDB4NjkwNiwgMHgyMTYwLCAweDYwMDMsIDB4MDAwMCwgMHgyMTYwLAorCTB4NjBhMCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyMDU5LCAweDY4MDgsIDB4YTA4NCwgMHhmZmZjLAorCTB4NjgwYSwgMHg2ODEwLCAweDgwMDAsIDB4NjgxMiwgMHgyMDkxLCAweDgwMDEsIDB4NjgwOCwgMHhhMDhjLAorCTB4MDA0MCwgMHgwMDQwLCAweDIwNjgsIDB4YTA4NiwgMHgwMDQwLCAweDY4MGEsIDB4MTA3OCwgMHgxOWI0LAorCTB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MjFiMSwgMHgyMDkxLCAweDgwMDEsIDB4NzhkYiwgMHgwMDAwLAorCTB4NzhkNywgMHgwMDAwLCAweDAwN2MsIDB4NjAwOCwgMHhhNzA1LCAweDYwMGEsIDB4MjA5MSwgMHg4MDAwLAorCTB4MTA3OCwgMHgxYzQyLCAweDIwOTEsIDB4ODAwMSwgMHg3OGQ4LCAweGEwNjUsIDB4MDA0MCwgMHgyMDg2LAorCTB4NjA5YywgMHg3OGRhLCAweDYwOWYsIDB4MDAwMCwgMHgwMDc4LCAweDIwNzYsIDB4NzhkNywgMHgwMDAwLAorCTB4NzhkYiwgMHgwMDAwLCAweDAwN2MsIDB4Nzk5MCwgMHg3ODk0LCAweDgwMDAsIDB4YTEwYSwgMHgwMGM4LAorCTB4MjA5MiwgMHhhMDA2LCAweDc4OTYsIDB4NzBkMiwgMHg3ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgyMGEwLAorCTB4ODAwMSwgMHg3ODA2LCAweDAwYzAsIDB4MjBhMCwgMHgwMDY4LCAweDIwYTAsIDB4MjA5MSwgMHg0MDgwLAorCTB4MDA3YywgMHgyMDM5LCAweDIwYjksIDB4MDA3OCwgMHgyMGE3LCAweDIwMzksIDB4MjBiZiwgMHgyNzA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDIwYjgsIDB4YWMwMCwgMHgyMDY4LCAweDZiMDgsIDB4NmMwYywgMHg2OTEwLAorCTB4NmExNCwgMHg2OTBhLCAweDZhMGUsIDB4NmIxMiwgMHg2YzE2LCAweDg3MzgsIDB4MDA3OCwgMHgyMGE3LAorCTB4MDA3YywgMHgwMDAzLCAweDAwMDksIDB4MDAwZiwgMHgwMDE1LCAweDAwMWIsIDB4MDAwMCwgMHgwMDE1LAorCTB4MDAxYiwgMHgwMDAwLCAweDBjN2UsIDB4MTA3OCwgMHgzYjMzLCAweDJjNjgsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MDAxMCwgMHgyMTM5LCAweDAwNjgsIDB4MjEzOSwgMHgyMDI5LCAweDAwMDAsIDB4NzhjYiwgMHgwMDAwLAorCTB4Nzg4YywgMHhhMDY1LCAweDAwNDAsIDB4MjEzMiwgMHgyMDA5LCAweDUwNzQsIDB4MjEwNCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMDQwLCAweDIxMDAsIDB4NjAwNCwgMHhhMDg2LCAweDAxMDMsIDB4MDBjMCwgMHgyMTAwLAorCTB4NjAxOCwgMHhhMDA1LCAweDAwYzAsIDB4MjEwMCwgMHg2MDE0LCAweGEwMDUsIDB4MDBjMCwgMHgyMTAwLAorCTB4MGQ3ZSwgMHgyMDY5LCAweDAwMDAsIDB4NjgxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyMGZmLAorCTB4NjAwYywgMHg3MGM2LCAweDYwMTAsIDB4NzBjYSwgMHg3MGMzLCAweDgwMjAsIDB4NjgxYiwgMHgwMDAxLAorCTB4MjA5MSwgMHg0MDgwLCAweDBkN2YsIDB4MTA3OCwgMHgxYzY5LCAweDAwNzgsIDB4MjEzNywgMHgwZDdmLAorCTB4MTA3OCwgMHgyMTNhLCAweDAwNDAsIDB4MjEzMiwgMHg2MjA0LCAweGEyOTQsIDB4MDBmZiwgMHhhMjk2LAorCTB4MDAwMywgMHgwMDQwLCAweDIxMTIsIDB4NjIwNCwgMHhhMjk2LCAweDAxMTAsIDB4MDBjMCwgMHgyMTIwLAorCTB4NzhjYiwgMHgwMDAxLCAweDYyMDQsIDB4YTI5NCwgMHhmZjAwLCAweDgyMTcsIDB4ODIxMSwgMHgwMDQwLAorCTB4MjEyMCwgMHg4NWZmLCAweDAwYzAsIDB4MjEzMiwgMHg4MjEwLCAweGEyMDIsIDB4MDBjOCwgMHgyMTMyLAorCTB4MDU3ZSwgMHgxMDc4LCAweDIxNDksIDB4MDU3ZiwgMHgwMDQwLCAweDIxMmQsIDB4NzhlMCwgMHhhMDg2LAorCTB4MDAwMywgMHgwMDQwLCAweDIxMzIsIDB4MDA3OCwgMHgyMTIwLCAweDg1MjgsIDB4NzhjOCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyMGQwLCAweDg1ZmYsIDB4MDA0MCwgMHgyMTM5LCAweDIwOTEsIDB4NDA4MCwgMHg3OGIwLAorCTB4NzBkNiwgMHgwMDdjLCAweDdiYWMsIDB4NzliMCwgMHg3MGQ0LCAweGExMDIsIDB4MDBjMCwgMHgyMTQzLAorCTB4MjMwMCwgMHhhMDA1LCAweDAwN2MsIDB4MDA0OCwgMHgyMTQ3LCAweGEzMDIsIDB4MDA3YywgMHg4MDAyLAorCTB4MDA3YywgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLCAweDAwMDUsIDB4MDBjOCwgMHgyMTYzLAorCTB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4MDAyMCwgMHg3MDA0LCAweGEwMDUsIDB4MDBjMCwgMHgyMTk4LAorCTB4NzAwOCwgMHg3MjA4LCAweGEyMDYsIDB4MDBjMCwgMHgyMTk4LCAweGEyODYsIDB4MDAwOCwgMHgwMGMwLAorCTB4MjE5OCwgMHgyMDcxLCAweDAwMTAsIDB4MTA3OCwgMHgyMTlkLCAweDIwMDksIDB4MDAyMCwgMHg2MDA0LAorCTB4YTA4NiwgMHgwMTAzLCAweDAwYzAsIDB4MjE3MiwgMHg2MDI4LCAweGEwMDUsIDB4MDBjMCwgMHgyMTcyLAorCTB4MjAwOSwgMHgwMDBjLCAweDEwNzgsIDB4MTkwNywgMHgwMDQwLCAweDIxOGIsIDB4NzhjNCwgMHg4MDAwLAorCTB4NzhjNiwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgyMTk4LCAweDIwOTEsIDB4ODAwMCwgMHg3OGUzLAorCTB4MDAwMywgMHg3OGM3LCAweDAwMDAsIDB4NzhjYywgMHhhMDg1LCAweDAzMDAsIDB4NzhjZSwgMHgyMDkxLAorCTB4ODAwMSwgMHgwMDc4LCAweDIxOTgsIDB4NzhjNywgMHgwMDAwLCAweDEwNzgsIDB4MWM2OSwgMHg3OWFjLAorCTB4NzhiMCwgMHg4MDAwLCAweGExMGEsIDB4MDBjOCwgMHgyMTk2LCAweGEwMDYsIDB4NzhiMiwgMHhhMDA2LAorCTB4MjA3MSwgMHgwMDEwLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDgxMDcsIDB4ODAwNCwgMHg4MDA0LAorCTB4N2FiOCwgMHg3YmI0LCAweDdjYzAsIDB4N2RiYywgMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHhhNGExLAorCTB4MDAwMCwgMHhhNWE5LCAweDAwMDAsIDB4MDA3YywgMHgyMDA5LCAweDUwNWIsIDB4MjA5MSwgMHg4MDAwLAorCTB4MjAwYSwgMHgwZjdlLCAweDBlN2UsIDB4MjA3MSwgMHg1MDQwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDBjMCwgMHgyMWNiLCAweDIwMDksIDB4NTAxMiwgMHgyMTA0LCAweGEwMDUsIDB4MDBjMCwgMHgyMWNiLAorCTB4MjA3OSwgMHgwMTAwLCAweDc4MzAsIDB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MjFjYiwgMHgwMDE4LAorCTB4MjFjYiwgMHg3ODFiLCAweDAwNGIsIDB4MGU3ZiwgMHgwZjdmLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLAorCTB4MjA3MSwgMHg1MDQwLCAweDIwOTEsIDB4ODAwMCwgMHg3MDAwLCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLAorCTB4MjFlNCwgMHgyMDc5LCAweDAxMDAsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgyMWU0LAorCTB4MDAxOCwgMHgyMWU0LCAweDc4MWIsIDB4MDA0ZCwgMHgyMDkxLCAweDgwMDEsIDB4MGU3ZiwgMHgwZjdmLAorCTB4MDA3YywgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgyMDcxLCAweDUwNDAsIDB4MjA3OSwgMHgwMTAwLAorCTB4Nzg0YiwgMHgwMDBmLCAweDAwOTgsIDB4MjFmNywgMHg3ODM4LCAweDAwNzgsIDB4MjFmMCwgMHgyMGE5LAorCTB4MDA0MCwgMHg3ODAwLCAweGEwODIsIDB4MDAwNCwgMHgwMDQ4LCAweDIyMDAsIDB4MjBhOSwgMHgwMDYwLAorCTB4Nzg5YiwgMHgwMDAwLCAweDc4YWYsIDB4MDAwMCwgMHg3OGFmLCAweDAwMDAsIDB4MDA3MCwgMHgyMjBhLAorCTB4MDA3OCwgMHgyMjAyLCAweDc4MDAsIDB4YTA4MiwgMHgwMDA0LCAweDAwNDgsIDB4MjIxOSwgMHg3MGI3LAorCTB4MDA5YiwgMHgyMDE5LCAweDRkYTQsIDB4MTA3OCwgMHgyMjU1LCAweDcwMmYsIDB4ODAwMSwgMHgwMDc4LAorCTB4MjIyNSwgMHg3MGI3LCAweDAwMDAsIDB4MjAxOSwgMHg0YzFjLCAweDEwNzgsIDB4MjI1NSwgMHgyMDE5LAorCTB4NGM1YiwgMHgxMDc4LCAweDIyNTUsIDB4NzAyZiwgMHg4MDAwLCAweDcwMDMsIDB4MDAwMCwgMHgxMDc4LAorCTB4MjM1ZSwgMHg3MDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMTdlLCAweDIwMDksIDB4MDRmZCwgMHgyMTBjLAorCTB4YTE4YSwgMHgwMDA1LCAweDAwNDgsIDB4MjIzYSwgMHgwMDM4LCAweDIyNDAsIDB4YTA4NSwgMHg2MjgwLAorCTB4MDA3OCwgMHgyMjQyLCAweDAwMjgsIDB4MjI0MCwgMHhhMDg1LCAweDYyODAsIDB4MDA3OCwgMHgyMjQyLAorCTB4YTA4NSwgMHg2MmMwLCAweDAxN2YsIDB4NzgwNiwgMHg3ODBmLCAweGIyMDQsIDB4Nzg0MywgMHgwMGQ4LAorCTB4Nzg1MywgMHgwMDgwLCAweDc4MGIsIDB4MDAwOCwgMHg3MDQ3LCAweDAwMDgsIDB4NzA1MywgMHg1MDdmLAorCTB4NzA0ZiwgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEzN2UsIDB4MTQ3ZSwgMHgxNTdlLAorCTB4MDQ3ZSwgMHgyMGExLCAweDAxMmIsIDB4MjMwNCwgMHhhMDA1LCAweDc4OWEsIDB4MDA0MCwgMHgyMjc1LAorCTB4ODMxOCwgMHgyMzI0LCAweDgzMTgsIDB4MjM5OCwgMHgyNGE4LCAweGE0ODQsIDB4ZmYwMCwgMHgwMDQwLAorCTB4MjI2ZCwgMHhhNDgyLCAweDAxMDAsIDB4MjBhOSwgMHgwMTAwLCAweDIwMjAsIDB4NTNhNiwgMHhhMDA1LAorCTB4MDBjMCwgMHgyMjY0LCAweDMzMTgsIDB4MDA3OCwgMHgyMjViLCAweDA0N2YsIDB4MTU3ZiwgMHgxNDdmLAorCTB4MTM3ZiwgMHgwMDdjLCAweGExOGMsIDB4MDAwZiwgMHgyMDExLCAweDAxMDEsIDB4MjIwNCwgMHhhMDg0LAorCTB4ZmZmMCwgMHhhMTA1LCAweDIwMTIsIDB4MTA3OCwgMHgyMzVlLCAweDAwN2MsIDB4MjAxMSwgMHgwMTAxLAorCTB4MjBhOSwgMHgwMDA5LCAweDgxMGIsIDB4MDA3MCwgMHgyMjhmLCAweDAwNzgsIDB4MjI4YSwgMHhhMThjLAorCTB4MGUwMCwgMHgyMjA0LCAweGEwODQsIDB4ZjFmZiwgMHhhMTA1LCAweDIwMTIsIDB4MDA3YywgMHgyMDA5LAorCTB4MDEwMSwgMHgyMGE5LCAweDAwMDUsIDB4ODIxMywgMHgwMDcwLCAweDIyYTAsIDB4MDA3OCwgMHgyMjliLAorCTB4YTI5NCwgMHgwMGUwLCAweDIxMDQsIDB4YTA4NCwgMHhmZjFmLCAweGEyMDUsIDB4MjAwYSwgMHgwMDdjLAorCTB4MjAxMSwgMHgwMTAxLCAweDIwYTksIDB4MDAwYywgMHg4MTBiLCAweDAwNzAsIDB4MjJiMSwgMHgwMDc4LAorCTB4MjJhYywgMHhhMThjLCAweGYwMDAsIDB4MjIwNCwgMHhhMDg0LCAweDBmZmYsIDB4YTEwNSwgMHgyMDEyLAorCTB4MDA3YywgMHgyMDExLCAweDAxMDIsIDB4MjIwNCwgMHhhMDg0LCAweGZmY2YsIDB4YTEwNSwgMHgyMDEyLAorCTB4MDA3YywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIwLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjA5YSwgMHg2MmFjLCAweDYzYWMsIDB4MGM3ZiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLAorCTB4MDAyMiwgMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDlhLCAweDYwYTQsIDB4YTA4NCwgMHhmZmRmLAorCTB4NjBhZSwgMHgwYzdmLCAweDAwN2MsIDB4ODEwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMiwgMHgwYzdlLAorCTB4MjA2MSwgMHgwMTAwLCAweDYwOWEsIDB4NjBhNCwgMHhhMDg1LCAweDAwMjAsIDB4NjBhZSwgMHgwYzdmLAorCTB4MDA3YywgMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIwLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLAorCTB4NjA5YSwgMHg2MGE0LCAweDYyYWUsIDB4MjAxMCwgMHg2MGE0LCAweDYzYWUsIDB4MjAxOCwgMHgwYzdmLAorCTB4MDA3YywgMHgyMDkxLCAweDgwMDAsIDB4MGM3ZSwgMHgwZTdlLCAweDY4MTgsIDB4YTAwNSwgMHgwMDQwLAorCTB4MjMzYywgMHgyMDYxLCAweDc0MDAsIDB4MTA3OCwgMHgyMzQ0LCAweDAwNDAsIDB4MjMyOCwgMHgyMGE5LAorCTB4MDAwMCwgMHgyMDYxLCAweDczMDAsIDB4MGM3ZSwgMHgxMDc4LCAweDIzNDQsIDB4MDA0MCwgMHgyMzE4LAorCTB4MGM3ZiwgMHg4YzYwLCAweDAwNzAsIDB4MjMxNiwgMHgwMDc4LCAweDIzMGIsIDB4MDA3OCwgMHgyMzNjLAorCTB4MDA3ZiwgMHhhMDgyLCAweDczMDAsIDB4MjA3MSwgMHg1MDQwLCAweDcwODYsIDB4NzE4MiwgMHgyMDAxLAorCTB4MDAwNCwgMHg3MDZlLCAweDcwOTMsIDB4MDAwZiwgMHgxMDc4LCAweDIxYWMsIDB4MDA3OCwgMHgyMzM4LAorCTB4NjBjMCwgMHhhMDA1LCAweDAwYzAsIDB4MjMzYywgMHgyMDcxLCAweDUwNDAsIDB4NzE4MiwgMHgyYzAwLAorCTB4NzA4YSwgMHgyMDAxLCAweDAwMDYsIDB4NzA2ZSwgMHg3MDkzLCAweDAwMGYsIDB4MTA3OCwgMHgyMWFjLAorCTB4MjAwMSwgMHgwMDAwLCAweDAwNzgsIDB4MjMzZSwgMHgyMDAxLCAweDAwMDEsIDB4MjA5MSwgMHg4MDAxLAorCTB4YTAwNSwgMHgwZTdmLCAweDBjN2YsIDB4MDA3YywgMHgyYzA0LCAweGEwMDUsIDB4MDA0MCwgMHgyMzViLAorCTB4MjA2MCwgMHg2MDBjLCAweGEzMDYsIDB4MDBjMCwgMHgyMzU4LCAweDYwMTAsIDB4YTIwNiwgMHgwMGMwLAorCTB4MjM1OCwgMHg2MDE0LCAweGExMDYsIDB4MDBjMCwgMHgyMzU4LCAweGEwMDYsIDB4MDA3OCwgMHgyMzVkLAorCTB4NjAwMCwgMHgwMDc4LCAweDIzNDUsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MjAxMSwgMHg1MDQxLAorCTB4MjIwYywgMHhhMThjLCAweDAwMGYsIDB4MjAxMSwgMHgwMTNiLCAweDIyMDQsIDB4YTA4NCwgMHgwMTAwLAorCTB4MDA0MCwgMHgyMzc0LCAweDIwMjEsIDB4ZmYwNCwgMHgyMTIyLCAweDgxMGIsIDB4ODEwYiwgMHg4MTBiLAorCTB4ODEwYiwgMHhhMThkLCAweDBmMDAsIDB4MjEwNCwgMHgwMDdjLCAweDBlN2UsIDB4NjhlNCwgMHhhMDhjLAorCTB4MDAyMCwgMHgwMDQwLCAweDIzYzgsIDB4YTA4NCwgMHgwMDA2LCAweDAwYzAsIDB4MjNjOCwgMHg2MDE0LAorCTB4ODAwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBmMCwgMHg1MjgwLAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMGEsIDB4MDBjMCwgMHgyM2M4LCAweDcxMDgsIDB4YTE5NCwgMHhmZjAwLAorCTB4MDA0MCwgMHgyM2M4LCAweGExOGMsIDB4MDBmZiwgMHgyMDAxLCAweDAwMGMsIDB4YTEwNiwgMHgwMDQwLAorCTB4MjNhZiwgMHgyMDAxLCAweDAwMTIsIDB4YTEwNiwgMHgwMDQwLCAweDIzYjMsIDB4MjAwMSwgMHgwMDE0LAorCTB4YTEwNiwgMHgwMDQwLCAweDIzYjcsIDB4MjAwMSwgMHgwMDE5LCAweGExMDYsIDB4MDA0MCwgMHgyM2JiLAorCTB4MjAwMSwgMHgwMDMyLCAweGExMDYsIDB4MDA0MCwgMHgyM2JmLCAweDAwNzgsIDB4MjNjMywgMHgyMDA5LAorCTB4MDAxMiwgMHgwMDc4LCAweDIzYzUsIDB4MjAwOSwgMHgwMDE0LCAweDAwNzgsIDB4MjNjNSwgMHgyMDA5LAorCTB4MDAxOSwgMHgwMDc4LCAweDIzYzUsIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsIDB4MjNjNSwgMHgyMDA5LAorCTB4MDAzZiwgMHgwMDc4LCAweDIzYzUsIDB4MjAxMSwgMHgwMDAwLCAweDIxMDAsIDB4YTIwNSwgMHg3MDBhLAorCTB4MGU3ZiwgMHgwMDdjLCAweDAwNjgsIDB4MjNjYSwgMHgyMDkxLCAweDgwMDAsIDB4MjA3MSwgMHgwMDAwLAorCTB4MDA3ZSwgMHg3MDE4LCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDIzZDEsIDB4MDA3ZiwgMHgyMDcxLAorCTB4MDAxMCwgMHg3MGNhLCAweDAwN2YsIDB4NzBjNiwgMHg3MGMzLCAweDgwMDIsIDB4NzBkYiwgMHgwNzNmLAorCTB4NzBkZiwgMHgwMDAwLCAweDIwNzEsIDB4MDAwMCwgMHg3MDFiLCAweDAwMDEsIDB4MjA5MSwgMHg0MDgwLAorCTB4MDA3OCwgMHgyM2U4LCAweDEwN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHg3ZjNjLAorCTB4N2U1OCwgMHg3YzMwLCAweDdkMzgsIDB4NzdjMiwgMHg3NGM2LCAweDc2Y2EsIDB4NzVjZSwgMHhhNTk0LAorCTB4MDAzZiwgMHhhNDljLCAweDAwMDMsIDB4YTQ4NCwgMHgwMDBmLCAweDAwNzksIDB4MjNmZiwgMHgyNDExLAorCTB4MjQxMSwgMHgyNDExLCAweDI3NGIsIDB4MzkwNywgMHgyNDBmLCAweDI0NDAsIDB4MjQ0YSwgMHgyNDBmLAorCTB4MjQwZiwgMHgyNDBmLCAweDI0MGYsIDB4MjQwZiwgMHgyNDBmLCAweDI0MGYsIDB4MjQwZiwgMHgxMDc4LAorCTB4MjNjYSwgMHg4NTA3LCAweGEwODQsIDB4MDAxZiwgMHgwMDc5LCAweDI0MTYsIDB4MjQ1NCwgMHgyNzRiLAorCTB4MjkwNSwgMHgyYTAyLCAweDJhMmEsIDB4MmNjMywgMHgyZjZlLCAweDJmYjEsIDB4MmZmYywgMHgzMDgxLAorCTB4MzEzOSwgMHgzMWUyLCAweDI0NDAsIDB4MjgyNywgMHgyZjQzLCAweDI0MzYsIDB4M2M3OCwgMHgzYzk4LAorCTB4M2U1ZSwgMHgzZTZhLCAweDNmM2YsIDB4MjQzNiwgMHgyNDM2LCAweDQwMTIsIDB4NDAxNiwgMHgzYzc2LAorCTB4MjQzNiwgMHgzZGM5LCAweDI0MzYsIDB4M2I1NiwgMHgyNDRhLCAweDI0MzYsIDB4MTA3OCwgMHgyM2NhLAorCTB4MDAxOCwgMHgyM2VmLCAweDEyN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2YsIDB4MTA3ZiwgMHgwMDdjLAorCTB4MjAxOSwgMHg0Y2ZkLCAweDEwNzgsIDB4MjI1NSwgMHg3MDJmLCAweDAwMDEsIDB4NzgxYiwgMHgwMDRmLAorCTB4MDA3OCwgMHgyNDM4LCAweDIwMTksIDB4NGM1YiwgMHgxMDc4LCAweDIyNTUsIDB4NzAyZiwgMHg4MDAwLAorCTB4NzgxYiwgMHgwMGQ1LCAweDAwNzgsIDB4MjQzOCwgMHg3MjQyLCAweDIwMDksIDB4NTAwZiwgMHgyMDBiLAorCTB4MDAwMCwgMHhhNTg0LCAweDAwMDEsIDB4MDBjMCwgMHgzYjZhLCAweDAwNDAsIDB4MjQ3MSwgMHgxMDc4LAorCTB4MjNjYSwgMHg3MDAzLCAweDAwMDAsIDB4NzA0YiwgMHgwMDAwLCAweDcwNDMsIDB4MDAwMCwgMHg3MDM3LAorCTB4MDAwMCwgMHgxMDc4LCAweDM4ZGUsIDB4MDAxOCwgMHgyM2VmLCAweDIwMDksIDB4NTAwZiwgMHgyMDBiLAorCTB4MDAwMCwgMHg3MDY4LCAweGEwMDUsIDB4MDBjMCwgMHgyNTNjLCAweDcwNmMsIDB4YTA4NCwgMHgwMDA3LAorCTB4MDA3OSwgMHgyNDdhLCAweDI1NzMsIDB4MjQ4MiwgMHgyNDhlLCAweDI0YWIsIDB4MjRjZCwgMHgyNTFhLAorCTB4MjRmMywgMHgyNDgyLCAweDEwNzgsIDB4MzhjNiwgMHgyMDA5LCAweDAwNDgsIDB4MTA3OCwgMHgyZTBmLAorCTB4MDBjMCwgMHgyNDhjLCAweDcwMDMsIDB4MDAwNCwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgzOGM2LAorCTB4MDBjMCwgMHgyNGE5LCAweDcwODAsIDB4ODAwNywgMHg3ODgyLCAweDc4OWIsIDB4MDAxMCwgMHg3OGFiLAorCTB4MDAwYywgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDAxLCAweDc4NWIsIDB4MDAwNCwgMHgyMDA5LAorCTB4MDBlNSwgMHgxMDc4LCAweDJlMDMsIDB4MDBjMCwgMHgyNGE5LCAweDcwMDMsIDB4MDAwNCwgMHg3MDkzLAorCTB4MDAwZiwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4MjRjYiwgMHg3MTgwLAorCTB4ODEwNywgMHg3ODgyLCAweDc4OWIsIDB4MDAxMCwgMHhhMThjLCAweDAwMWYsIDB4YTE4ZCwgMHgwMGMwLAorCTB4NzlhYSwgMHg3OGFiLCAweDAwMDYsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMiwgMHg3ODViLAorCTB4MDAwNCwgMHgyMDA5LCAweDAwZTUsIDB4MTA3OCwgMHgyZTAzLCAweDAwYzAsIDB4MjRjYiwgMHg3MDAzLAorCTB4MDAwNCwgMHg3MDkzLCAweDAwMGYsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzhjNiwgMHgwMGMwLAorCTB4MjRmMSwgMHg3MTgwLCAweDgxMDcsIDB4Nzg4MiwgMHg3ODliLCAweDAwMTAsIDB4YTE4YywgMHgwMDFmLAorCTB4YTE4ZCwgMHgwMGMwLCAweDc5YWEsIDB4NzhhYiwgMHgwMDIwLCAweDcxODQsIDB4NzlhYSwgMHg3OGFiLAorCTB4MDAwZCwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA0LCAweDc4NWIsIDB4MDAwNCwgMHgyMDA5LAorCTB4MDBlNSwgMHgxMDc4LCAweDJlMDMsIDB4MDBjMCwgMHgyNGYxLCAweDcwMDMsIDB4MDAwNCwgMHg3MDkzLAorCTB4MDAwZiwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4MjUxOCwgMHg3MTgwLAorCTB4ODEwNywgMHg3ODgyLCAweDc4OWIsIDB4MDAxMCwgMHhhMThjLCAweDAwMWYsIDB4YTE4ZCwgMHgwMGMwLAorCTB4NzlhYSwgMHg3OGFiLCAweDAwMDYsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMiwgMHg3ODViLAorCTB4MDAwNCwgMHgyMDA5LCAweDAwZTUsIDB4MTA3OCwgMHgyZTAzLCAweDAwYzAsIDB4MjUxOCwgMHg3MDg4LAorCTB4NzA4YiwgMHgwMDAwLCAweDIwNjgsIDB4NzA0YSwgMHg3MDAzLCAweDAwMDIsIDB4NzA5MywgMHgwMDBmLAorCTB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzhjNiwgMHgwMGMwLCAweDI0MzgsIDB4NzA4OCwgMHgyMDY4LAorCTB4NmYxNCwgMHgxMDc4LCAweDM3YmQsIDB4MmM1MCwgMHgxMDc4LCAweDM5NzgsIDB4Nzg5YiwgMHgwMDEwLAorCTB4NjgxNCwgMHhhMDg0LCAweDAwMWYsIDB4YTA4NSwgMHgwMDgwLCAweDc4YWEsIDB4NmUxYywgMHgyMDQxLAorCTB4MDAwMSwgMHg3MDhjLCAweGEwODQsIDB4MDQwMCwgMHgyMDAxLCAweDAwMDQsIDB4MDA0MCwgMHgyNTNhLAorCTB4MjAwMSwgMHgwMDA2LCAweDAwNzgsIDB4MjY1YiwgMHgxMDc4LCAweDM4YzYsIDB4MDBjMCwgMHgyNDM4LAorCTB4Nzg5YiwgMHgwMDEwLCAweDcwNjgsIDB4MjA2OCwgMHg2ZjE0LCAweDEwNzgsIDB4MzdiZCwgMHgyYzUwLAorCTB4MTA3OCwgMHgzOTc4LCAweDYwMDgsIDB4YTA4NSwgMHgwMDEwLCAweDYwMGEsIDB4NjgyNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyNTVhLCAweGEwODIsIDB4MDAwNiwgMHgwMDQ4LCAweDI1NTgsIDB4MDA3OCwgMHgyNTVhLAorCTB4NjgyNywgMHgwMDA1LCAweDZiMTQsIDB4YTM5YywgMHgwMDFmLCAweGEzOWQsIDB4MDBjMCwgMHg3MDU4LAorCTB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjU2OCwgMHhhNjg0LCAweDAwMDEsIDB4MDA0MCwgMHgyNTZhLAorCTB4YTM5YywgMHhmZmJmLCAweDdiYWEsIDB4MjAzMSwgMHgwMDIwLCAweDIwNDEsIDB4MDAwMSwgMHgyMDAxLAorCTB4MDAwMywgMHgwMDc4LCAweDI2NWIsIDB4MDAxOCwgMHgyM2VmLCAweDc0NGMsIDB4YTQ4NSwgMHgwMDAwLAorCTB4MDA0MCwgMHgyNThkLCAweGEwODAsIDB4NTA4MCwgMHgyMDMwLCAweDcxNTAsIDB4ODEwOCwgMHhhMTJhLAorCTB4MDA0OCwgMHgyNTg0LCAweDIwMDksIDB4NTA4MCwgMHgyMTY0LCAweDY1MDQsIDB4ODVmZiwgMHgwMGMwLAorCTB4MjU5ZSwgMHg4NDIxLCAweDAwYzAsIDB4MjU3ZSwgMHg3MTUyLCAweDcwMDMsIDB4MDAwMCwgMHg3MDRiLAorCTB4MDAwMCwgMHg3MDQwLCAweGEwMDUsIDB4MDA0MCwgMHgzYjZhLCAweDAwNzgsIDB4MjQzOCwgMHg3NjRjLAorCTB4YTZiMCwgMHg1MDgwLCAweDcxNTAsIDB4MjYwMCwgMHgwMDc4LCAweDI1ODksIDB4NzE1MiwgMHgyNTY4LAorCTB4MjU1OCwgMHg3NTRhLCAweDJjNTAsIDB4NjAzNCwgMHhhMDg1LCAweDAwMDAsIDB4MDBjMCwgMHgyNTliLAorCTB4NjcwOCwgMHg3NzNhLCAweGE3ODQsIDB4MDMzZiwgMHgwMDQwLCAweDI1ZDQsIDB4YTc4NCwgMHgwMDIxLAorCTB4MDBjMCwgMHgyNTliLCAweGE3ODQsIDB4MDAwMiwgMHgwMDQwLCAweDI1YmQsIDB4YTc4NCwgMHgwMDA0LAorCTB4MDA0MCwgMHgyNTliLCAweGE3YmMsIDB4ZmZmYiwgMHg2NzBhLCAweGE3ODQsIDB4MDAwOCwgMHgwMGMwLAorCTB4MjU5YiwgMHhhNzg0LCAweDAwMTAsIDB4MDBjMCwgMHgyNTliLCAweGE3ODQsIDB4MDIwMCwgMHgwMGMwLAorCTB4MjU5YiwgMHhhNzg0LCAweDAxMDAsIDB4MDA0MCwgMHgyNWQ0LCAweDYwMTgsIDB4YTAwNSwgMHgwMGMwLAorCTB4MjU5YiwgMHhhN2JjLCAweGZlZmYsIDB4NjcwYSwgMHg2ODIzLCAweDAwMDAsIDB4NmUxYywgMHhhNjg0LAorCTB4MDAwZSwgMHg2MTE4LCAweDAwNDAsIDB4MjVlNCwgMHg2MDFjLCAweGExMDIsIDB4MDA0OCwgMHgyNWU3LAorCTB4MDA0MCwgMHgyNWU3LCAweDAwNzgsIDB4MjU5NywgMHg4MWZmLCAweDAwYzAsIDB4MjU5NywgMHg2OGMzLAorCTB4MDAwMCwgMHhhNzg0LCAweDAwODAsIDB4MDBjMCwgMHgyNWVmLCAweDcwMGMsIDB4NjAyMiwgMHhhN2JjLAorCTB4ZmY3ZiwgMHg2NzBhLCAweDEwNzgsIDB4Mzk3OCwgMHgwMDE4LCAweDIzZWYsIDB4Nzg5YiwgMHgwMDEwLAorCTB4YTA0NiwgMHgxMDc4LCAweDM4YzYsIDB4MDBjMCwgMHgyNDM4LCAweDZiMTQsIDB4YTM5YywgMHgwMDFmLAorCTB4YTM5ZCwgMHgwMGMwLCAweDcwNTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjYwYiwgMHhhNjg0LAorCTB4MDAwMSwgMHgwMDQwLCAweDI2MGQsIDB4YTM5YywgMHhmZmJmLCAweGE2ODQsIDB4MDAxMCwgMHgwMDQwLAorCTB4MjYxMywgMHhhMzlkLCAweDAwMjAsIDB4N2JhYSwgMHg4ODQwLCAweGE2ODQsIDB4MDAwZSwgMHgwMGMwLAorCTB4MjYxZSwgMHhhN2JkLCAweDAwMTAsIDB4NjcwYSwgMHgwMDc4LCAweDI2NTksIDB4NzE1OCwgMHhhMThjLAorCTB4MDgwMCwgMHgwMDQwLCAweDMzZDcsIDB4MjAxMSwgMHgwMDIwLCAweGE2ODQsIDB4MDAwOCwgMHgwMGMwLAorCTB4MjYyZiwgMHg4MjEwLCAweGE2ODQsIDB4MDAwMiwgMHgwMGMwLCAweDI2MmYsIDB4ODIxMCwgMHg3YWFhLAorCTB4ODg0MCwgMHgxMDc4LCAweDM4ZGUsIDB4NmExNCwgMHg2MTBjLCAweDgxMDgsIDB4YTE4YywgMHgwMGZmLAorCTB4YTFlMCwgMHg3MzAwLCAweDJjNjQsIDB4OGNmZiwgMHgwMDQwLCAweDI2NTAsIDB4NjAxNCwgMHhhMjA2LAorCTB4MDBjMCwgMHgyNjNhLCAweDYwYjgsIDB4ODAwMSwgMHg2MGJhLCAweDAwYzAsIDB4MjYzNSwgMHgwYzdlLAorCTB4MmE2MCwgMHg2MDA4LCAweGEwODUsIDB4MDEwMCwgMHg2MDBhLCAweDBjN2YsIDB4MDA3OCwgMHgyNTczLAorCTB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4MjQzOCwgMHgyYTYwLCAweDYxMGUsIDB4NzlhYSwgMHg4ODQwLAorCTB4NzEzMiwgMHgyMDAxLCAweDAwMDEsIDB4MDA3ZSwgMHg3MTVjLCAweGExODQsIDB4MDAxOCwgMHgwMDQwLAorCTB4MjY3NiwgMHhhMTg0LCAweDAwMTAsIDB4MDA0MCwgMHgyNjY5LCAweDEwNzgsIDB4MzVkNiwgMHgwMGMwLAorCTB4MjY5OSwgMHhhMTg0LCAweDAwMDgsIDB4MDA0MCwgMHgyNjc2LCAweDY5YTAsIDB4YTE4NCwgMHgwNjAwLAorCTB4MDBjMCwgMHgyNjc2LCAweDEwNzgsIDB4MzRjNywgMHgwMDc4LCAweDI2OTksIDB4NjlhMCwgMHhhMTg0LAorCTB4MDgwMCwgMHgwMDQwLCAweDI2OGQsIDB4MGM3ZSwgMHgwMjdlLCAweDI5NjAsIDB4NjAwMCwgMHhhMDg1LAorCTB4MjAwMCwgMHg2MDAyLCAweDYxMDQsIDB4YTE4ZCwgMHgwMDEwLCAweDYxMDYsIDB4MDI3ZiwgMHgwYzdmLAorCTB4MTA3OCwgMHgzNWQ2LCAweDAwYzAsIDB4MjY5OSwgMHg2OWEwLCAweGExODQsIDB4MDIwMCwgMHgwMDQwLAorCTB4MjY5NSwgMHgxMDc4LCAweDM1MTYsIDB4MDA3OCwgMHgyNjk5LCAweGExODQsIDB4MDQwMCwgMHgwMGMwLAorCTB4MjY3MiwgMHg2OWEwLCAweGExODQsIDB4MTAwMCwgMHgwMDQwLCAweDI2YTQsIDB4NjkxNCwgMHhhMThjLAorCTB4ZmYwMCwgMHg4MTBmLCAweDEwNzgsIDB4MjJjZCwgMHgwMDdmLCAweDcwMDIsIDB4YTY4YywgMHgwMGUwLAorCTB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MjZiMiwgMHhhMDg2LCAweDAwNjAsIDB4MDBjMCwgMHgyNmIyLAorCTB4YTE4ZCwgMHg0MDAwLCAweDg4ZmYsIDB4MDA0MCwgMHgyNmI3LCAweGExOGQsIDB4MDAwNCwgMHg3OTVhLAorCTB4NjliNiwgMHg3ODliLCAweDAwNjAsIDB4MjgwMCwgMHg3OGFhLCAweDc4OWIsIDB4MDA2MSwgMHg2ODE4LAorCTB4YTA4ZCwgMHg4MDAwLCAweGEwODQsIDB4N2ZmZiwgMHg2OTFhLCAweGE2OGMsIDB4MDA4MCwgMHgwMDQwLAorCTB4MjZkNiwgMHg3MDk3LCAweDAwMDAsIDB4YTA4YSwgMHgwMDBkLCAweDAwNTAsIDB4MjZkNCwgMHhhMDhhLAorCTB4MDAwYywgMHg3MTk2LCAweDIwMDEsIDB4MDAwYywgMHg4MDBjLCAweDcxOWEsIDB4NzhhYSwgMHg4MDA4LAorCTB4ODEwYywgMHgwMDQwLCAweDMzZGQsIDB4YTE4YywgMHgwMGY4LCAweDAwYzAsIDB4MzNkZCwgMHgxNTdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDEyYiwgMHg3ODliLCAweDAwMDAsIDB4ODAwMCwgMHg4MGFjLAorCTB4YWQ4MCwgMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHg2ODE0LAorCTB4ODAwNywgMHg3ODgyLCAweDZkOTQsIDB4N2RkNiwgMHg3ZGRlLCAweDZlOTgsIDB4N2VkMiwgMHg3ZWRhLAorCTB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4MjcwZCwgMHg3MDJjLCAweDgwMDMsIDB4MDA0OCwgMHgyNzA2LAorCTB4MjAxOSwgMHg0YzViLCAweDEwNzgsIDB4MjI1NSwgMHg3MDJmLCAweDgwMDAsIDB4NzgzMCwgMHhhMDg0LAorCTB4MDBjMCwgMHgwMGMwLCAweDI3MGQsIDB4MDA5OCwgMHgyNzE1LCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHgxMDc4LCAweDM4ZGUsIDB4MDA3OCwgMHgyNDYxLCAweDcyMDAsIDB4YTI4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MjcyMiwgMHg3ODFiLCAweDAwNGYsIDB4MTA3OCwgMHgzOGRlLAorCTB4MDA3OCwgMHgyNzMzLCAweDZhYjQsIDB4YTI5NSwgMHgyMDAwLCAweDdhNWEsIDB4NzgxYiwgMHgwMDRmLAorCTB4MTA3OCwgMHgzOGRlLCAweDcyMDAsIDB4MjUwMCwgMHhhNjA1LCAweDAwNDAsIDB4MjczMywgMHhhMjg0LAorCTB4MDAwNywgMHgxMDc5LCAweDI3NDEsIDB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4YTI4NCwgMHgwMDA3LAorCTB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MjQzOCwgMHg2MDE4LCAweDgwMDAsIDB4NjAxYSwgMHgwMDc4LAorCTB4MjQzOCwgMHgyNzQ5LCAweDQ4ZjcsIDB4NDhmNywgMHg0OGU2LCAweDQ4ZjcsIDB4Mjc0OSwgMHg0OGU2LAorCTB4Mjc0OSwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHgzOGM2LCAweDBmN2UsIDB4MjA3OSwgMHg1MDAwLAorCTB4NzhjYywgMHgwZjdmLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDI3NmYsIDB4NzA2YywgMHhhMDg2LAorCTB4MDAwMSwgMHgwMGMwLCAweDI3NWUsIDB4NzA2ZSwgMHgwMDc4LCAweDI4MDIsIDB4NzA2YywgMHhhMDg2LAorCTB4MDAwNSwgMHgwMGMwLCAweDI3NmQsIDB4NzA4OCwgMHgyMDY4LCAweDY4MWIsIDB4MDAwNCwgMHg2ODE3LAorCTB4MDAwMCwgMHg2ODIwLCAweGEwODUsIDB4MDAwOCwgMHg2ODIyLCAweDcwNmYsIDB4MDAwMCwgMHgyMDExLAorCTB4MDAwNCwgMHg3MTZjLCAweGExODYsIDB4MDAwMSwgMHgwMDQwLCAweDI3OTAsIDB4YTE4NiwgMHgwMDA3LAorCTB4MDBjMCwgMHgyNzgwLCAweDIwMDksIDB4NTAzOCwgMHgyMDBiLCAweDAwMDUsIDB4MDA3OCwgMHgyNzkwLAorCTB4MjAwOSwgMHg1MDEzLCAweDIxMDQsIDB4MjAwOSwgMHg1MDEyLCAweDIwMGEsIDB4MjAwOSwgMHg1MDM4LAorCTB4MjAwYiwgMHgwMDAxLCAweDcwNmYsIDB4MDAwMCwgMHg3MDczLCAweDAwMDEsIDB4MDA3OCwgMHgyNzkyLAorCTB4NzA2ZiwgMHgwMDAwLCAweDEwNzgsIDB4NDYzMywgMHgxNTdlLCAweDIwYTksIDB4MDAxMCwgMHgyMDM5LAorCTB4MDAwMCwgMHgxMDc4LCAweDM2YjAsIDB4YTdiOCwgMHgwMTAwLCAweDAwNzAsIDB4MjdhMSwgMHgwMDc4LAorCTB4Mjc5OSwgMHgxNTdmLCAweDcwMDAsIDB4MDA3OSwgMHgyN2E1LCAweDI3ZDMsIDB4MjdiYSwgMHgyN2JhLAorCTB4MjdhZCwgMHgyN2QzLCAweDI3ZDMsIDB4MjdkMywgMHgyN2QzLCAweDIwMjEsIDB4NTA1YSwgMHgyNDA0LAorCTB4YTAwNSwgMHgwMDQwLCAweDI3ZDMsIDB4YWQwNiwgMHgwMGMwLCAweDI3YmEsIDB4NjgwMCwgMHgyMDIyLAorCTB4MDA3OCwgMHgyN2NhLCAweDY4MjAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MjdjNiwgMHg2ZjE0LAorCTB4MTA3OCwgMHgzN2JkLCAweDEwNzgsIDB4MzNhZSwgMHgwMDc4LCAweDI3Y2EsIDB4NzA2MCwgMHgyMDYwLAorCTB4NjgwMCwgMHg2MDAyLCAweDZhMWEsIDB4NjgxNywgMHgwMDAwLCAweDY4MjAsIDB4YTA4NSwgMHgwMDA4LAorCTB4NjgyMiwgMHgxMDc4LCAweDFjNTMsIDB4MjAyMSwgMHg3NDAwLCAweDEwNzgsIDB4MjgwZiwgMHgyMDIxLAorCTB4NTA1YSwgMHgxMDc4LCAweDI4MGYsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMDAsIDB4MjAyMSwgMHg3MzAwLAorCTB4MTA3OCwgMHgyODBmLCAweDg0MjAsIDB4MDA3MCwgMHgyN2U3LCAweDAwNzgsIDB4MjdlMCwgMHgyMDYxLAorCTB4NTMwMCwgMHgyMDIxLCAweDAwMDIsIDB4MjBhOSwgMHgwMTAwLCAweDYwMTgsIDB4NjExMCwgMHg4MWZmLAorCTB4MDA0MCwgMHgyN2Y2LCAweGExMDIsIDB4MDA1MCwgMHgyN2Y2LCAweDYwMTIsIDB4NjAxYiwgMHgwMDAwLAorCTB4YWNlMCwgMHgwMDEwLCAweDAwNzAsIDB4MjdmZSwgMHgwMDc4LCAweDI3ZWQsIDB4ODQyMSwgMHgwMGMwLAorCTB4MjdlYiwgMHgxNTdmLCAweDcwOWMsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjgwOSwgMHgxMDc4LAorCTB4MzljYywgMHg3MDAzLCAweDAwMDAsIDB4NzA0YiwgMHgwMDAwLCAweDAwNzgsIDB4MjQzOCwgMHgwNDdlLAorCTB4MjQwNCwgMHhhMDA1LCAweDAwNDAsIDB4MjgyMywgMHgyMDY4LCAweDY4MDAsIDB4MDA3ZSwgMHg2YTFhLAorCTB4NjgxNywgMHgwMDAwLCAweDY4MjAsIDB4YTA4NSwgMHgwMDA4LCAweDY4MjIsIDB4MTA3OCwgMHgxYzUzLAorCTB4MDA3ZiwgMHgwMDc4LCAweDI4MTEsIDB4MDQ3ZiwgMHgyMDIzLCAweDAwMDAsIDB4MDA3YywgMHhhMjgyLAorCTB4MDAwMywgMHgwMDUwLCAweDI4MmQsIDB4MTA3OCwgMHgyM2NhLCAweDIzMDAsIDB4MDA3OSwgMHgyODMwLAorCTB4MjgzMywgMHgyOGE2LCAweDI4YzMsIDB4YTI4MiwgMHgwMDAyLCAweDAwNDAsIDB4MjgzOSwgMHgxMDc4LAorCTB4MjNjYSwgMHg3MDZjLCAweDcwNmYsIDB4MDAwMCwgMHg3MDkzLCAweDAwMDAsIDB4MDA3OSwgMHgyODQwLAorCTB4Mjg0OCwgMHgyODQ4LCAweDI4NGEsIDB4Mjg3ZSwgMHgzM2UzLCAweDI4NDgsIDB4Mjg3ZSwgMHgyODQ4LAorCTB4MTA3OCwgMHgyM2NhLCAweDc3ODAsIDB4MTA3OCwgMHgzNmIwLCAweDc3ODAsIDB4YTdiYywgMHgwZjAwLAorCTB4MTA3OCwgMHgzN2JkLCAweDYwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDI4NzUsIDB4MjAyMSwgMHg3NDAwLAorCTB4MjAwOSwgMHgwMDA0LCAweDIwMTEsIDB4MDAxMCwgMHgxMDc4LCAweDI4ZGUsIDB4MDA0MCwgMHgyODc1LAorCTB4MTU3ZSwgMHgyMGE5LCAweDAwMDAsIDB4MjAyMSwgMHg3MzAwLCAweDA0N2UsIDB4MjAwOSwgMHgwMDA0LAorCTB4MjAxMSwgMHgwMDEwLCAweDEwNzgsIDB4MjhkZSwgMHgwNDdmLCAweDAwNDAsIDB4Mjg3NCwgMHg4NDIwLAorCTB4MDA3MCwgMHgyODc0LCAweDAwNzgsIDB4Mjg2NSwgMHgxNTdmLCAweDg3MzgsIDB4YTc4NCwgMHgwMDFmLAorCTB4MDBjMCwgMHgyODUwLCAweDAwNzgsIDB4MjQ2MSwgMHgwMDc4LCAweDI0NjEsIDB4Nzc4MCwgMHgxMDc4LAorCTB4MzdiZCwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyOGE0LCAweDIwMjEsIDB4NzQwMCwgMHgyMDA5LAorCTB4MDAwNSwgMHgyMDExLCAweDAwMjAsIDB4MTA3OCwgMHgyOGRlLCAweDAwNDAsIDB4MjhhNCwgMHgxNTdlLAorCTB4MjBhOSwgMHgwMDAwLCAweDIwMjEsIDB4NzMwMCwgMHgwNDdlLCAweDIwMDksIDB4MDAwNSwgMHgyMDExLAorCTB4MDAyMCwgMHgxMDc4LCAweDI4ZGUsIDB4MDQ3ZiwgMHgwMDQwLCAweDI4YTMsIDB4ODQyMCwgMHgwMDcwLAorCTB4MjhhMywgMHgwMDc4LCAweDI4OTQsIDB4MTU3ZiwgMHgwMDc4LCAweDI0NjEsIDB4MjIwMCwgMHgwMDc5LAorCTB4MjhhOSwgMHgyOGFjLCAweDI4YWUsIDB4MjhhZSwgMHgxMDc4LCAweDIzY2EsIDB4MjAwOSwgMHgwMDEyLAorCTB4NzA2YywgMHhhMDg2LCAweDAwMDIsIDB4MDA0MCwgMHgyOGI3LCAweDIwMDksIDB4MDAwZSwgMHg2ODE4LAorCTB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4MjhiZCwgMHg2OTFhLCAweDcwNmYsIDB4MDAwMCwgMHg3MDczLAorCTB4MDAwMSwgMHgwMDc4LCAweDM4NTQsIDB4MjIwMCwgMHgwMDc5LCAweDI4YzYsIDB4MjhjYiwgMHgyOGFlLAorCTB4MjhjOSwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHg0NjMzLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAxLAorCTB4MDBjMCwgMHgzMzczLCAweDEwNzgsIDB4MzNjNCwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLAorCTB4MTA3OCwgMHgzMzY2LCAweDAwNDAsIDB4MzM3MywgMHgwMDc4LCAweDI1NzMsIDB4MjQwNCwgMHhhMDA1LAorCTB4MDA0MCwgMHgyOTAxLCAweDIwNjgsIDB4MmQwNCwgMHgwMDdlLCAweDY4MTQsIDB4YTcwNiwgMHgwMDQwLAorCTB4MjhlZCwgMHgyZDIwLCAweDAwN2YsIDB4MDA3OCwgMHgyOGRmLCAweDAwN2YsIDB4MjAyMiwgMHg2OTFhLAorCTB4NjgxNywgMHgwMDAwLCAweDY4MjAsIDB4YTIwNSwgMHg2ODIyLCAweDEwNzgsIDB4MWM1MywgMHg2MDEwLAorCTB4ODAwMSwgMHg2MDEyLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MTA3OCwgMHgzM2M0LAorCTB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3OCwgMHgyOTAwLCAweDIzMDAsIDB4MDA3OSwgMHgyOTA4LAorCTB4MjkwZCwgMHgyOTBiLCAweDI5YTYsIDB4MTA3OCwgMHgyM2NhLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAxLAorCTB4MDBjMCwgMHgyOTIxLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA0LCAweDAwYzAsIDB4MjkxOSwgMHgwMDc4LAorCTB4Mjk0NCwgMHgxMDc4LCAweDMzYzQsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgwMDc4LAorCTB4MzM3MywgMHg3OGU0LCAweGEwMDUsIDB4MDBkMCwgMHgyOTQ0LCAweDAwMTgsIDB4MjQzOCwgMHgyMDA4LAorCTB4YTA4NCwgMHgwMDMwLCAweDAwYzAsIDB4MjkzMCwgMHg3ODFiLCAweDAwNGYsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgyOTJjLCAweDIxMDAsIDB4YTA4NCwgMHgwMDA3LAorCTB4MDA3OSwgMHgyOTNhLCAweDI5N2QsIDB4Mjk4OCwgMHgyOTZlLCAweDI5NDIsIDB4MzhiOSwgMHgzOGI5LAorCTB4Mjk0MiwgMHgyOTk3LCAweDEwNzgsIDB4MjNjYSwgMHg3MDAwLCAweGEwODYsIDB4MDAwNCwgMHgwMGMwLAorCTB4Mjk1ZSwgMHg3MDZjLCAweGEwODYsIDB4MDAwMiwgMHgwMGMwLCAweDI5NTQsIDB4MjAxMSwgMHgwMDAyLAorCTB4MjAxOSwgMHgwMDAwLCAweDAwNzgsIDB4MjgyNywgMHg3MDZjLCAweGEwODYsIDB4MDAwNiwgMHgwMDQwLAorCTB4Mjk0ZSwgMHg3MDZjLCAweGEwODYsIDB4MDAwNCwgMHgwMDQwLCAweDI5NGUsIDB4NzllNCwgMHhhMTg0LAorCTB4MDAzMCwgMHgwMDQwLCAweDI5NjgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDBjMCwgMHgyOTZhLAorCTB4MDA3OCwgMHgyZjQzLCAweDIwMDEsIDB4MDAwMywgMHgwMDc4LCAweDJjZDcsIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDI5NzUsIDB4NjgxYiwgMHgwMDFkLCAweDEwNzgsIDB4MzY4ZiwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDM4LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgyOTg0LCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LCAweDM2OGYsIDB4MDA3OCwgMHgzODg0LAorCTB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyOThmLCAweDY4MWIsIDB4MDAxZCwgMHgxMDc4LAorCTB4MzY4ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMGQyLCAweDAwNzgsIDB4MjQzOCwgMHg2ODE4LAorCTB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4Mjk5ZSwgMHg2ODFiLCAweDAwMWQsIDB4MTA3OCwgMHgzNjhmLAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA5MywgMHgwMDc4LCAweDI0MzgsIDB4YTU4NCwgMHgwMDBmLAorCTB4MDBjMCwgMHgyOWMzLCAweDcwMDAsIDB4MDA3OSwgMHgyOWFkLCAweDI0NjEsIDB4MjliNywgMHgyOWI1LAorCTB4MzM3MywgMHgzMzczLCAweDMzNzMsIDB4MzM3MywgMHgyOWI1LCAweDEwNzgsIDB4MjNjYSwgMHgxMDc4LAorCTB4MzNjNCwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLCAweDEwNzgsIDB4MzM2NiwgMHgwMDQwLAorCTB4MzM3MywgMHgwMDc4LCAweDI1NzMsIDB4NzhlNCwgMHhhMDA1LCAweDAwZDAsIDB4Mjk0NCwgMHgwMDE4LAorCTB4Mjk0NCwgMHgyMDA4LCAweGEwODQsIDB4MDAzMCwgMHgwMGMwLCAweDI5ZDIsIDB4NzgxYiwgMHgwMDRmLAorCTB4MDA3OCwgMHgyNDM4LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MjljZSwgMHgyMTAwLAorCTB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MjlkYywgMHgyOWVlLCAweDI5ZjIsIDB4MjllNiwgMHgyOWU0LAorCTB4MzhiOSwgMHgzOGI5LCAweDI5ZTQsIDB4MzhhZiwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHgzNjk3LAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA1NiwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgzNjk3LAorCTB4MDA3OCwgMHgzODg0LCAweDEwNzgsIDB4MzY5NywgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMGQyLAorCTB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MzY5NywgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDkzLAorCTB4MDA3OCwgMHgyNDM4LCAweDIzMDAsIDB4MDA3OSwgMHgyYTA1LCAweDJhMGEsIDB4MmEwOCwgMHgyYTBjLAorCTB4MTA3OCwgMHgyM2NhLCAweDAwNzgsIDB4MzA4MSwgMHg2ODFiLCAweDAwMDgsIDB4NzhhMywgMHgwMDAwLAorCTB4NzllNCwgMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgzMDgxLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgzMDgxLCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDJhMWUsIDB4MmEyNiwgMHgyOWYyLAorCTB4Mjk2ZSwgMHgzODU0LCAweDM4YjksIDB4MzhiOSwgMHgyYTI2LCAweDM4YWYsIDB4MTA3OCwgMHgzODY4LAorCTB4MDA3OCwgMHgyNDM4LCAweGEyODIsIDB4MDAwNSwgMHgwMDUwLCAweDJhMzAsIDB4MTA3OCwgMHgyM2NhLAorCTB4MjMwMCwgMHgwMDc5LCAweDJhMzMsIDB4MmEzNiwgMHgyYzg0LCAweDJjOTIsIDB4MjIwMCwgMHgwMDc5LAorCTB4MmEzOSwgMHgyYTUzLCAweDJhNDAsIDB4MmE1MywgMHgyYTNlLCAweDJjNjksIDB4MTA3OCwgMHgyM2NhLAorCTB4Nzg5YiwgMHgwMDE4LCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLCAweGEwODIsIDB4MDAyMCwgMHgwMDQ4LAorCTB4MzY2YiwgMHhhMDhhLCAweDAwMDQsIDB4MDBjOCwgMHgzNjZiLCAweDAwNzksIDB4MmE0ZiwgMHgzNjZiLAorCTB4MzY2YiwgMHgzNjZiLCAweDM2MTksIDB4Nzg5YiwgMHgwMDE4LCAweDc5YTgsIDB4YTE4NCwgMHgwMDgwLAorCTB4MDA0MCwgMHgyYTY0LCAweDAwNzgsIDB4MzY2YiwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHgyYTVhLAorCTB4MjAxMSwgMHgwMDA0LCAweDAwNzgsIDB4MzFmNSwgMHhhMTg0LCAweDAwZmYsIDB4YTA4YSwgMHgwMDEwLAorCTB4MDBjOCwgMHgzNjZiLCAweDAwNzksIDB4MmE2YywgMHgyYTdlLCAweDJhN2MsIDB4MmE5NiwgMHgyYTlhLAorCTB4MmI1NSwgMHgzNjZiLCAweDM2NmIsIDB4MmI1NywgMHgzNjZiLCAweDM2NmIsIDB4MmM2NSwgMHgyYzY1LAorCTB4MzY2YiwgMHgzNjZiLCAweDM2NmIsIDB4MmM2NywgMHgxMDc4LCAweDIzY2EsIDB4YTY4NCwgMHgxMDAwLAorCTB4MDA0MCwgMHgyYThiLCAweDIwMDEsIDB4MDUwMCwgMHg4MDAwLCAweDgwMDAsIDB4NzgzYSwgMHg3ODFiLAorCTB4MDA5MSwgMHgwMDc4LCAweDI0MzgsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyYTk0LAorCTB4NjgxYiwgMHgwMDFkLCAweDAwNzgsIDB4MmE4MiwgMHgwMDc4LCAweDM4NTQsIDB4NjgxYiwgMHgwMDFkLAorCTB4MDA3OCwgMHgzNjdiLCAweDY5MjAsIDB4NjkyMiwgMHhhNjg0LCAweDE4MDAsIDB4MDBjMCwgMHgyYWRiLAorCTB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgyYWUxLCAweDY4MTgsIDB4YTA4NiwgMHgwMDA4LAorCTB4MDBjMCwgMHgyYWFjLCAweDY4MWIsIDB4MDAwMCwgMHhhNjg0LCAweDA0MDAsIDB4MDA0MCwgMHgyYjUxLAorCTB4YTY4NCwgMHgwMDgwLCAweDAwNDAsIDB4MmFkNywgMHg3MDk3LCAweDAwMDAsIDB4NjgxOCwgMHhhMDg0LAorCTB4MDAzZiwgMHhhMDhhLCAweDAwMGQsIDB4MDA1MCwgMHgyYWQ3LCAweGEwOGEsIDB4MDAwYywgMHg3MTk2LAorCTB4MjAwMSwgMHgwMDBjLCAweDgwMGMsIDB4NzE5YSwgMHg3ODliLCAweDAwNjEsIDB4NzhhYSwgMHgxNTdlLAorCTB4MTM3ZSwgMHgxNDdlLCAweDIwYTEsIDB4MDEyYiwgMHg3ODliLCAweDAwMDAsIDB4ODAwMCwgMHg4MGFjLAorCTB4YWQ4MCwgMHgwMDBiLCAweDIwOTgsIDB4NTNhNiwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHg3ODFiLAorCTB4MDA1OCwgMHgwMDc4LCAweDI0MzgsIDB4YTY4NCwgMHgxMDAwLCAweDAwNDAsIDB4MmFlMSwgMHgwMDc4LAorCTB4MjQzOCwgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgyYjRkLCAweGE2ODQsIDB4MDgwMCwgMHgwMDQwLAorCTB4MmI0ZCwgMHhhNjg0LCAweDgwMDAsIDB4MDBjMCwgMHgyYWVmLCAweDAwNzgsIDB4MmIwOSwgMHhhNmI0LAorCTB4N2ZmZiwgMHg3ZTVhLCAweDZlYjYsIDB4Nzg5YiwgMHgwMDc2LCAweDdhYWMsIDB4NzlhYywgMHg3OGFjLAorCTB4ODAxYiwgMHgwMGM4LCAweDJhZmMsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLAorCTB4MDAwMCwgMHg2Yjk4LCAweDIxMDAsIDB4YTMwMiwgMHg2OGIyLCAweDZiOTQsIDB4MjIwMCwgMHhhMzAzLAorCTB4NjhhZSwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgyYjExLCAweGE2YjQsIDB4YmZmZiwgMHg3ZTVhLAorCTB4NmViNiwgMHg3MDAwLCAweGEwODYsIDB4MDAwMywgMHgwMGMwLCAweDJiMWUsIDB4MTA3OCwgMHg0NmU5LAorCTB4MTA3OCwgMHg0OGU2LCAweDc4MWIsIDB4MDA2NCwgMHgwMDc4LCAweDI0MzgsIDB4YTAwNiwgMHgxMDc4LAorCTB4NDllZCwgMHg2YWIwLCAweDY5YWMsIDB4NmM5OCwgMHg2Yjk0LCAweDIyMDAsIDB4YTEwNSwgMHgwMDQwLAorCTB4MmIyZCwgMHgyMjAwLCAweGE0MjIsIDB4MjEwMCwgMHhhMzFiLCAweDZjYWEsIDB4N2NkMiwgMHg3Y2RhLAorCTB4NmJhNiwgMHg3YmQ2LCAweDdiZGUsIDB4MjMwMCwgMHhhNDA1LCAweDAwYzAsIDB4MmIzZiwgMHhhNmI1LAorCTB4NDAwMCwgMHg3ZTVhLCAweDZlYjYsIDB4NzgxYiwgMHgwMDY0LCAweDAwNzgsIDB4MjQzOCwgMHg3ODFiLAorCTB4MDA2NCwgMHgyMjAwLCAweGExMTUsIDB4MDBjMCwgMHgyYjQ5LCAweDEwNzgsIDB4NDhmNywgMHgwMDc4LAorCTB4MjQzOCwgMHgxMDc4LCAweDQ5NDIsIDB4MDA3OCwgMHgyNDM4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LAorCTB4MjQzOCwgMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4MjNjYSwgMHgwMDc4LAorCTB4MmJiOCwgMHg2OTIwLCAweGExODQsIDB4MDEwMCwgMHgwMDQwLCAweDJiNmYsIDB4YTE4YywgMHhmZWZmLAorCTB4NjkyMiwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDAwLCAweGEwODQsIDB4ZWZmZiwgMHg2MDAyLAorCTB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgwYzdmLCAweDAwNzgsIDB4MmJhNywgMHhhMTg0LAorCTB4MDIwMCwgMHgwMDQwLCAweDJiYTcsIDB4YTE4YywgMHhmZGZmLCAweDY5MjIsIDB4MGM3ZSwgMHg3MDU0LAorCTB4MjA2MCwgMHg2MDAwLCAweGEwODQsIDB4ZGZmZiwgMHg2MDAyLCAweDYwMDQsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwNiwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhhMTg0LCAweDAwMDgsIDB4MDA0MCwgMHgyYmE3LAorCTB4MTA3OCwgMHgzN2I5LCAweDEwNzgsIDB4MzRjNywgMHg4OGZmLCAweDAwNDAsIDB4MmJhNywgMHg3ODliLAorCTB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHhhNjg0LAorCTB4MDQwMCwgMHgwMGMwLCAweDJiYTEsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA1NiwgMHgwMDc4LAorCTB4MjQzOCwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHg3ZTU4LAorCTB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmJiMCwgMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDM2NzMsIDB4MDA3OCwgMHgzNjczLAorCTB4MjAxOSwgMHgwMDAwLCAweDc5OTAsIDB4YTE4YywgMHgwMDA3LCAweDAwNDAsIDB4MmJiNiwgMHg3ODliLAorCTB4MDAxMCwgMHg3OGE4LCAweGEwOTQsIDB4MDBmZiwgMHhhMjg2LCAweDAwMDEsIDB4MDBjMCwgMHgyYmY2LAorCTB4MjMwMCwgMHg3Y2E4LCAweGE0MDAsIDB4MjAxOCwgMHhhMTAyLCAweDAwNDAsIDB4MmJlZSwgMHgwMDQ4LAorCTB4MmJkMywgMHgwMDc4LCAweDJiZjAsIDB4YTM4MCwgMHgwMDAyLCAweGExMDIsIDB4MDBjOCwgMHgyYmVlLAorCTB4NjkyMCwgMHhhMThjLCAweGZjZmYsIDB4NjkyMiwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDAwLAorCTB4YTA4NCwgMHhlZmVmLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweGZmZTUsIDB4NjAwNiwgMHgwYzdmLAorCTB4N2U1OCwgMHhhNmI0LCAweGZmZmIsIDB4N2U1YSwgMHgwMDc4LCAweDJiYTgsIDB4MDA3OCwgMHgyYjU5LAorCTB4MjRhOCwgMHg3YWE4LCAweDAwZjAsIDB4MmJmMCwgMHgwMDc4LCAweDJiYzEsIDB4YTI4NCwgMHgwMGYwLAorCTB4YTA4NiwgMHgwMDIwLCAweDAwYzAsIDB4MmM1NiwgMHg4MzE4LCAweDgzMTgsIDB4MjMwMCwgMHhhMTAyLAorCTB4MDA0MCwgMHgyYzA2LCAweDAwNDgsIDB4MmMwNiwgMHgwMDc4LCAweDJjNTMsIDB4YTI4NiwgMHgwMDIzLAorCTB4MDA0MCwgMHgyYmI2LCAweDY4MWMsIDB4YTA4NCwgMHhmZmYxLCAweDY4MWUsIDB4N2U1OCwgMHhhNjg0LAorCTB4ZmZmMSwgMHhhMDg1LCAweDAwMTAsIDB4MjAzMCwgMHg3ZTVhLCAweDYwMDgsIDB4YTA4NSwgMHgwMDEwLAorCTB4NjAwYSwgMHgwYzdlLCAweDcwNTQsIDB4MjA2MCwgMHg2MDA0LCAweDIwMDgsIDB4MmM0OCwgMHgwYzdmLAorCTB4YTE4NCwgMHgwMDEwLCAweDAwNDAsIDB4MmMyYSwgMHgxMDc4LCAweDM3YjksIDB4MTA3OCwgMHgzNWQ2LAorCTB4MDA3OCwgMHgyYzM5LCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLCAweDYwMDQsIDB4MjAwOCwgMHgyYzQ4LAorCTB4MGM3ZiwgMHhhMTg0LCAweDAwMDgsIDB4MDA0MCwgMHgyYmE3LCAweDEwNzgsIDB4MzdiOSwgMHgxMDc4LAorCTB4MzRjNywgMHg4OGZmLCAweDAwNDAsIDB4MmJhNywgMHg3ODliLCAweDAwNjAsIDB4MjgwMCwgMHg3OGFhLAorCTB4YTZiNSwgMHgwMDA0LCAweDdlNWEsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MmM0ZCwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDM4LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4N2FhOCwgMHgwMDc4LCAweDJiYzEsIDB4ODMxOCwgMHgyMzAwLAorCTB4YTEwMiwgMHgwMDQwLCAweDJjNWYsIDB4MDA0OCwgMHgyYzVmLCAweDAwNzgsIDB4MmJjMSwgMHhhMjg0LAorCTB4MDA4MCwgMHgwMGMwLCAweDM2N2IsIDB4MDA3OCwgMHgzNjczLCAweDAwNzgsIDB4MzY3YiwgMHgwMDc4LAorCTB4MzY2YiwgMHg3ODliLCAweDAwMTgsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsIDB4YTA4ZSwgMHgwMDAxLAorCTB4MDA0MCwgMHgyYzc0LCAweDEwNzgsIDB4MjNjYSwgMHg3YWE4LCAweGEyOTQsIDB4MDBmZiwgMHg3OGE4LAorCTB4YTA4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAwNCwgMHgwMGM4LCAweDM2NmIsIDB4MDA3OSwgMHgyYzgwLAorCTB4MzY2YiwgMHgzNDE0LCAweDM2NmIsIDB4MzU2YiwgMHhhMjgyLCAweDAwMDAsIDB4MDBjMCwgMHgyYzhhLAorCTB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzY4ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDM4LCAweGEyODIsIDB4MDAwMywgMHgwMGMwLCAweDJjOTgsIDB4MTA3OCwgMHgyM2NhLAorCTB4YTQ4NCwgMHg4MDAwLCAweDAwYzAsIDB4MmNiYiwgMHg3MDZjLCAweGEwMDUsIDB4MDA0MCwgMHgyY2EyLAorCTB4MTA3OCwgMHgyM2NhLCAweDZmMTQsIDB4Nzc4MiwgMHhhN2JjLCAweDBmMDAsIDB4MTA3OCwgMHgzN2JkLAorCTB4NjAwOCwgMHhhMDg1LCAweDAwMjEsIDB4NjAwYSwgMHg4NzM4LCAweGE3ODQsIDB4MDAxZiwgMHgwMGMwLAorCTB4MmNhNiwgMHgxMDc4LCAweDM2OTMsIDB4NzA2ZiwgMHgwMDAyLCAweDIwMDksIDB4NTAzOCwgMHgyMDBiLAorCTB4MDAwOSwgMHgwMDc4LCAweDJjYmQsIDB4MTA3OCwgMHgzNjlmLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4YTI4MiwgMHgwMDA0LCAweDAwNTAsIDB4MmNjOSwgMHgxMDc4LAorCTB4MjNjYSwgMHgyMzAwLCAweDAwNzksIDB4MmNjYywgMHgyY2NmLCAweDJkYjgsIDB4MmRlYiwgMHhhMjg2LAorCTB4MDAwMywgMHgwMDQwLCAweDJjZDUsIDB4MTA3OCwgMHgyM2NhLCAweDIwMDEsIDB4MDAwMCwgMHgwMDdlLAorCTB4NjhjMCwgMHhhMDA1LCAweDAwNDAsIDB4MmNkZSwgMHg3MDAzLCAweDAwMDMsIDB4NjhhMCwgMHhhMDg0LAorCTB4MjAwMCwgMHgwMDQwLCAweDJjZTcsIDB4NjAwOCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwYSwgMHgwMDdmLAorCTB4NzAzZSwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDJjZWUsIDB4MjQ2MSwgMHgyY2Y4LAorCTB4MmNmOCwgMHgyZWVkLCAweDJmMjksIDB4MjQ2MSwgMHgyZjI5LCAweDJjZjYsIDB4MTA3OCwgMHgyM2NhLAorCTB4YTY4NCwgMHgxMDAwLCAweDAwYzAsIDB4MmQwMCwgMHgxMDc4LCAweDQ2MzMsIDB4MDA0MCwgMHgyZDkyLAorCTB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHgyZDQ4LCAweGExODYsIDB4MDAwOCwgMHgwMGMwLAorCTB4MmQxNywgMHgxMDc4LCAweDMzYzQsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgxMDc4LAorCTB4MzM2NiwgMHgwMDQwLCAweDJkNDgsIDB4MTA3OCwgMHg0NjMzLCAweDAwNzgsIDB4MmQyZiwgMHhhMTg2LAorCTB4MDAyOCwgMHgwMGMwLCAweDJkNDgsIDB4MTA3OCwgMHg0NjMzLCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLAorCTB4NjAwYSwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyZDJmLCAweDgwMDEsIDB4NjAxYSwgMHhhMDA1LAorCTB4MDA0MCwgMHgyZDJmLCAweDgwMDEsIDB4YTAwNSwgMHgwMDQwLCAweDJkMmYsIDB4NjAxZSwgMHg2ODIwLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MjQ2MSwgMHg2ODIwLCAweGEwODQsIDB4ZmZmZSwgMHg2ODIyLAorCTB4NzA2MCwgMHgwYzdlLCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLCAweDBjN2YsIDB4NjAwNCwgMHg2ODAyLAorCTB4YTAwNSwgMHgyZDAwLCAweDAwYzAsIDB4MmQ0NSwgMHg2MDAyLCAweDYwMDYsIDB4MDA3OCwgMHgyNDYxLAorCTB4MDE3ZSwgMHgxMDc4LCAweDJlMWMsIDB4MDE3ZiwgMHhhNjg0LCAweGRmMDAsIDB4NjgxZSwgMHg2ODJiLAorCTB4MDAwMCwgMHg2ZjE0LCAweDgxZmYsIDB4MDA0MCwgMHgyZDkyLCAweGExODYsIDB4MDAwMiwgMHgwMGMwLAorCTB4MmQ5MiwgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyZDY1LCAweGE2ODQsIDB4MDA2MCwgMHgwMDQwLAorCTB4MmQ2NSwgMHg3OGQ4LCAweDdhZGMsIDB4NjgyZSwgMHg2YTMyLCAweDY4MjAsIDB4YTA4NCwgMHgwODAwLAorCTB4MDBjMCwgMHgyZDkyLCAweDg3MTcsIDB4YTI5NCwgMHgwMDBmLCAweDgyMTMsIDB4ODIxMywgMHg4MjEzLAorCTB4YTI5MCwgMHg1MjgwLCAweGEyOTAsIDB4MDAwMCwgMHgyMjFjLCAweGEzODQsIDB4MDEwMCwgMHgwMGMwLAorCTB4MmQ3YiwgMHgwMDc4LCAweDJkODEsIDB4ODIxMCwgMHgyMjA0LCAweGEwODUsIDB4MDAxOCwgMHgyMDEyLAorCTB4ODIxMSwgMHhhMzg0LCAweDA0MDAsIDB4MDA0MCwgMHgyZDhlLCAweDY4YTAsIDB4YTA4NCwgMHgwMTAwLAorCTB4MDBjMCwgMHgyZDhlLCAweDEwNzgsIDB4MmVhMCwgMHgwMDc4LCAweDI0NjEsIDB4NjAwOCwgMHhhMDg1LAorCTB4MDAwMiwgMHg2MDBhLCAweDY5MTYsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgyZDlhLAorCTB4NzAzYywgMHg2ODFhLCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFlLCAweDEwNzgsIDB4MzNiNSwgMHgxMDc4LAorCTB4MzNjNCwgMHgwMGMwLCAweDJkYTcsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHg2ODIwLAorCTB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MmRiMCwgMHgxMDc4LCAweDMzYWUsIDB4MDA3OCwgMHgyZGI0LAorCTB4NzA2MCwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgxMDc4LCAweDFjNTMsIDB4MDA3OCwgMHgyNDYxLAorCTB4YTI4MiwgMHgwMDA0LCAweDAwNDgsIDB4MmRiZSwgMHgxMDc4LCAweDIzY2EsIDB4MjIwMCwgMHgwMDc5LAorCTB4MmRjMSwgMHgyZGJjLCAweDJkYzUsIDB4MmRkMiwgMHgyZGM1LCAweDcwMDAsIDB4YTA4NiwgMHgwMDA1LAorCTB4MDA0MCwgMHgyZGNlLCAweDEwNzgsIDB4MzY4ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDM4LCAweDc4OTAsIDB4ODAwNywgMHg4MDAxLCAweGEwODQsIDB4MDAwNywgMHhhMDgwLAorCTB4MDAxOCwgMHg3ODlhLCAweDc5YTgsIDB4YTE4YywgMHgwMGZmLCAweGExODYsIDB4MDAwMywgMHgwMDQwLAorCTB4MmRlNywgMHhhMTg2LCAweDAwMDAsIDB4MDA0MCwgMHgyZGU3LCAweDAwNzgsIDB4MzY2YiwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4NjgyMCwgMHhhMDg1LCAweDAwMDQsIDB4NjgyMiwgMHg4MmZmLAorCTB4MDBjMCwgMHgyZGY2LCAweDEwNzgsIDB4MzY4ZiwgMHgwMDc4LCAweDJkZmQsIDB4ODIxMSwgMHgwMDQwLAorCTB4MmRmYiwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHgzNjlmLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4NzAyYywgMHg4MDAzLCAweDAwNDgsIDB4MmUwZCwgMHgyMDE5LAorCTB4NGM1YiwgMHgxMDc4LCAweDIyNTUsIDB4NzAyZiwgMHg4MDAwLCAweDEwNzgsIDB4MzhkZSwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MmUxOSwgMHgwMDE4LCAweDJlMTksIDB4NzkxYSwgMHhhMDA2LAorCTB4MDA3YywgMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHhhNjg0LCAweDAwNjAsIDB4MDBjMCwgMHgyZTI2LAorCTB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDJlOWYsIDB4YTY4NCwgMHgwODAwLAorCTB4MDBjMCwgMHgyZTQ4LCAweDY4YjQsIDB4YTA4NCwgMHg0ODAwLCAweGE2MzUsIDB4YTY4NCwgMHgwODAwLAorCTB4MDBjMCwgMHgyZTQ4LCAweDY5OTgsIDB4NmE5NCwgMHg2OTJlLCAweDZhMzIsIDB4NzAzYywgMHhhMDA1LAorCTB4MDBjMCwgMHgyZTQwLCAweDIyMDAsIDB4YTEwNSwgMHgwMDQwLCAweDJlNDcsIDB4NzAzZiwgMHgwMDE1LAorCTB4NzAwMCwgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHgyZTQ3LCAweDEwNzgsIDB4NDYzMywgMHgwMDdjLAorCTB4YTY4NCwgMHgwMDIwLCAweDAwNDAsIDB4MmU2YSwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgyZTU2LAorCTB4NjgyZiwgMHgwMDAwLCAweDY4MzMsIDB4MDAwMCwgMHgwMDc4LCAweDJlNDAsIDB4NjhiNCwgMHhhMDg0LAorCTB4NDgwMCwgMHhhNjM1LCAweGE2ODQsIDB4NDAwMCwgMHgwMGMwLCAweDJlNTAsIDB4NzAzYywgMHhhMDA1LAorCTB4MDBjMCwgMHgyZTY0LCAweDcwM2YsIDB4MDAxNSwgMHg3OWQ4LCAweDdhZGMsIDB4NjkyZSwgMHg2YTMyLAorCTB4MDA3OCwgMHgyZTQwLCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLCAweDJlNzQsIDB4NjgyZiwgMHgwMDAwLAorCTB4NjgzMywgMHgwMDAwLCAweDAwNzgsIDB4MmU0MCwgMHg2OGI0LCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LAorCTB4YTY4NCwgMHg0MDAwLCAweDAwYzAsIDB4MmU2ZSwgMHg3MDNjLCAweGEwMDUsIDB4MDBjMCwgMHgyZTgyLAorCTB4NzAzZiwgMHgwMDE1LCAweDc5ZDgsIDB4N2FkYywgMHg3OGQwLCAweDgwZmIsIDB4MDBjOCwgMHgyZTg5LAorCTB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4NjkyZSwgMHg2YTMyLAorCTB4MjEwMCwgMHhhMjA1LCAweDAwYzAsIDB4MmU5NiwgMHgwMDc4LCAweDJlNDAsIDB4NzAwMCwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMDQwLCAweDJlOWYsIDB4MTA3OCwgMHg0OWVkLCAweDAwNzgsIDB4MmU0MCwgMHgwMDdjLAorCTB4NjAwOCwgMHhhMDg1LCAweDAyMDAsIDB4NjAwYSwgMHhhMzg0LCAweDAyMDAsIDB4MDA0MCwgMHgyZWFjLAorCTB4NjAwOCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwYSwgMHg2ODFiLCAweDAwMDYsIDB4Njg4ZiwgMHgwMDAwLAorCTB4Njg5MywgMHgwMDAwLCAweDZhMzAsIDB4NjkyYywgMHg2YTNlLCAweDY5NDIsIDB4NjgyZiwgMHgwMDAzLAorCTB4NjgzMywgMHgwMDAwLCAweDY4MzcsIDB4MDAyMCwgMHg2ODk3LCAweDAwMDAsIDB4Njg5YiwgMHgwMDIwLAorCTB4NjhiMywgMHgwMDAwLCAweDY4YWYsIDB4MDAwMCwgMHg3MDAwLCAweDAwNzksIDB4MmVjNywgMHgyNDYxLAorCTB4MmVkMSwgMHgyZWRhLCAweDJlY2YsIDB4MmVjZiwgMHgyZWNmLCAweDJlY2YsIDB4MmVjZiwgMHgxMDc4LAorCTB4MjNjYSwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDJlZGEsIDB4MTA3OCwgMHgzM2FlLAorCTB4MDA3OCwgMHgyZWUwLCAweDcwNjAsIDB4MmM1MCwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHgyYTYwLAorCTB4MjAyMSwgMHg1MDVhLCAweDI0MDQsIDB4YTAwNSwgMHgwMDQwLCAweDJlZTksIDB4MjAyMCwgMHgwMDc4LAorCTB4MmVlMiwgMHgyZDIyLCAweDIwNmIsIDB4MDAwMCwgMHgwMDdjLCAweDEwNzgsIDB4MzNiNSwgMHgxMDc4LAorCTB4MzNjNCwgMHg2MDA4LCAweGEwODQsIDB4ZmRmZiwgMHg2MDBhLCAweDY4MmIsIDB4MDAwMCwgMHg3ODliLAorCTB4MDAwZSwgMHg2ZjE0LCAweDY4MTcsIDB4MDAwMiwgMHgxMDc4LCAweDRhMzUsIDB4YTY4NCwgMHgwODAwLAorCTB4MDA0MCwgMHgyZjA2LCAweDY5MWMsIDB4YTE4ZCwgMHgyMDAwLCAweDY5MWUsIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDJmMTYsIDB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHgyZjE0LAorCTB4NjgxYiwgMHgwMDFlLCAweDAwNzgsIDB4MmYxNiwgMHg2ODFiLCAweDAwMDAsIDB4MjAyMSwgMHg1MDVhLAorCTB4MjQwNCwgMHhhZDA2LCAweDAwNDAsIDB4MmYxZCwgMHg3NDYwLCAweDY4MDAsIDB4MjAyMiwgMHg2OGMzLAorCTB4MDAwMCwgMHg2YTNjLCAweDY5NDAsIDB4NmEzMiwgMHg2OTJlLCAweDEwNzgsIDB4MWM1MywgMHgwMDc4LAorCTB4MjQ2MSwgMHgxMDc4LCAweDJlMWMsIDB4NjgyYiwgMHgwMDAwLCAweDIwMDEsIDB4MDAwZSwgMHg2ZjE0LAorCTB4MTA3OCwgMHgzOGU0LCAweGEwOGMsIDB4MDBmZiwgMHg2OTE2LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLAorCTB4MDA0MCwgMHgyZjNjLCAweDcwM2MsIDB4NjgxYSwgMHhhNjhjLCAweGRmMDAsIDB4NjkxZSwgMHg3MDZmLAorCTB4MDAwMCwgMHgwMDc4LCAweDI0NjEsIDB4NzAwMCwgMHhhMDA1LCAweDAwYzAsIDB4MmY0OSwgMHgwMDc4LAorCTB4MjQ2MSwgMHhhMDA2LCAweDEwNzgsIDB4NDYzMywgMHg2ODE3LCAweDAwMDAsIDB4NjgxYiwgMHgwMDE0LAorCTB4YTY4YywgMHhkZjAwLCAweDY5MWUsIDB4NjgyYiwgMHgwMDAwLCAweDY4MjAsIDB4YTA4NSwgMHgwMGZmLAorCTB4NjgyMiwgMHg3MDAwLCAweDAwNzksIDB4MmY1YywgMHgyNDYxLCAweDJmNjYsIDB4MmY2NiwgMHgyZjY4LAorCTB4MmY2OCwgMHgyZjY4LCAweDJmNjgsIDB4MmY2NCwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHgzM2M0LAorCTB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgwMDc4LCAweDMzN2UsIDB4MjMwMCwgMHgwMDc5LAorCTB4MmY3MSwgMHgyZjc0LCAweDJmNzYsIDB4MmZhZiwgMHgxMDc4LCAweDIzY2EsIDB4NzAwMCwgMHgwMDc5LAorCTB4MmY3OSwgMHgyNDYxLCAweDJmODMsIDB4MmY4MywgMHgyZjllLCAweDJmODMsIDB4MmZhYiwgMHgyZjllLAorCTB4MmY4MSwgMHgxMDc4LCAweDIzY2EsIDB4YTY4NCwgMHgwMDYwLCAweGEwODYsIDB4MDA2MCwgMHgwMGMwLAorCTB4MmY5YSwgMHhhNmI0LCAweGZmZGYsIDB4YTZiNCwgMHhiZmZmLCAweGE2YjUsIDB4MjAwMCwgMHg3ZTVhLAorCTB4NjgxYywgMHhhMDg0LCAweGZmZGYsIDB4NjgxZSwgMHgxMDc4LCAweDQ2MzMsIDB4MTA3OCwgMHg0OGY3LAorCTB4MDA3OCwgMHgzODU0LCAweGE2ODQsIDB4MjAwMCwgMHgwMDQwLCAweDJmOGQsIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDJmYWIsIDB4NjgxYiwgMHgwMDE1LCAweGE2ODQsIDB4NDAwMCwgMHgwMDQwLAorCTB4MmZhYiwgMHg2ODFiLCAweDAwMDcsIDB4MTA3OCwgMHgzODY4LCAweDAwNzgsIDB4MjQzOCwgMHgxMDc4LAorCTB4MjNjYSwgMHgyMzAwLCAweDAwNzksIDB4MmZiNCwgMHgyZmI3LCAweDJmYjksIDB4MmZlYywgMHgxMDc4LAorCTB4MjNjYSwgMHg3MDAwLCAweDAwNzksIDB4MmZiYywgMHgyNDYxLCAweDJmYzYsIDB4MmZjNiwgMHgyZmUxLAorCTB4MmZjNiwgMHgyZmU4LCAweDJmZTEsIDB4MmZjNCwgMHgxMDc4LCAweDIzY2EsIDB4YTY4NCwgMHgwMDYwLAorCTB4YTA4NiwgMHgwMDYwLCAweDAwYzAsIDB4MmZkZCwgMHhhNmI0LCAweGZmYmYsIDB4YTZiNCwgMHhiZmZmLAorCTB4YTZiNSwgMHgyMDAwLCAweDdlNWEsIDB4NjgxYywgMHhhMDg0LCAweGZmYmYsIDB4NjgxZSwgMHgxMDc4LAorCTB4NDYzMywgMHgxMDc4LCAweDQ4ZjcsIDB4MDA3OCwgMHgzODU0LCAweGE2ODQsIDB4MjAwMCwgMHgwMDQwLAorCTB4MmZkMCwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDJmZTgsIDB4NjgxYiwgMHgwMDA3LAorCTB4NzgxYiwgMHgwMGQyLCAweDAwNzgsIDB4MjQzOCwgMHg2ODIwLCAweGEwODUsIDB4MDAwNCwgMHg2ODIyLAorCTB4MTA3OCwgMHgzODFmLCAweGE2YjUsIDB4MDgwMCwgMHgxMDc4LCAweDM2OGYsIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHgyMzAwLCAweDAwNzksIDB4MmZmZiwgMHgzMDAyLAorCTB4MzAwNCwgMHgzMDA2LCAweDEwNzgsIDB4MjNjYSwgMHgwMDc4LCAweDM2N2IsIDB4YTY4NCwgMHgwNDAwLAorCTB4MDBjMCwgMHgzMDJmLCAweDc5ZTQsIDB4YTE4NCwgMHgwMDIwLCAweDAwNDAsIDB4MzAxNiwgMHg3OGVjLAorCTB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MzAxNiwgMHg3ODJiLCAweDMwMDksIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzhhYiwgMHgwMDAwLCAweGE2ODQsIDB4ZmZmYiwgMHg3ODVhLCAweDc5ZTQsIDB4YTE4NCwgMHgwMDIwLAorCTB4MDA0MCwgMHgzMDI3LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwYzAsIDB4MzAyYiwgMHgyMDAxLAorCTB4MDAxNCwgMHgwMDc4LCAweDJjZDcsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MzA2NywgMHg3YTkwLAorCTB4YTI5NCwgMHgwMDA3LCAweDc4OWIsIDB4MDA2MCwgMHg3OWE4LCAweDgxZmYsIDB4MDA0MCwgMHgzMDY1LAorCTB4Nzg5YiwgMHgwMDEwLCAweDdiYTgsIDB4YTM4NCwgMHgwMDAxLCAweDAwYzAsIDB4MzA1NiwgMHg3YmE4LAorCTB4N2JhOCwgMHhhMzg2LCAweDAwMDEsIDB4MDBjMCwgMHgzMDQ5LCAweDIwMDksIDB4ZmZmNywgMHgwMDc4LAorCTB4MzA0ZiwgMHhhMzg2LCAweDAwMDMsIDB4MDBjMCwgMHgzMDU2LCAweDIwMDksIDB4ZmZlZiwgMHgwYzdlLAorCTB4NzA1NCwgMHgyMDYwLCAweDYwMDQsIDB4YTEwNCwgMHg2MDA2LCAweDBjN2YsIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzhhYiwgMHgwMDAwLCAweGE2ODQsIDB4ZmZmYiwgMHg3ODVhLCAweDc4MmIsIDB4MzAwOSwgMHg2OTIwLAorCTB4YTE4YywgMHhmZGZmLCAweGExOGMsIDB4ZmVmZiwgMHg2OTIyLCAweDAwNzgsIDB4Mzg1NCwgMHgyOTdkLAorCTB4Mjk4OCwgMHgzMDcxLCAweDMwNzksIDB4MzA2ZiwgMHgzMDZmLCAweDM4NTQsIDB4Mzg1NCwgMHgxMDc4LAorCTB4MjNjYSwgMHg2OTIwLCAweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHgwMDc4LAorCTB4Mzg1ZSwgMHg2OTIwLCAweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsIDB4NjkyMiwgMHgwMDc4LAorCTB4Mzg1NCwgMHg3OWU0LCAweGExODQsIDB4MDAzMCwgMHgwMDQwLCAweDMwOGIsIDB4NzhlYywgMHhhMDg0LAorCTB4MDAwMywgMHgwMGMwLCAweDMwYjIsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDQsIDB4MDBjMCwgMHgzMGE1LAorCTB4NzA2YywgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgzMDliLCAweDIwMTEsIDB4MDAwMiwgMHgyMDE5LAorCTB4MDAwMCwgMHgwMDc4LCAweDI4MjcsIDB4NzA2YywgMHhhMDg2LCAweDAwMDYsIDB4MDA0MCwgMHgzMDk1LAorCTB4NzA2YywgMHhhMDg2LCAweDAwMDQsIDB4MDA0MCwgMHgzMDk1LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAwLAorCTB4MDA0MCwgMHgyNDM4LCAweDY4MTgsIDB4YTA4NSwgMHg4MDAwLCAweDY4MWEsIDB4MjAwMSwgMHgwMDE0LAorCTB4MDA3OCwgMHgyY2Q3LCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDMwYjYsIDB4Mzg1NCwgMHgzODU0LAorCTB4MzBiZSwgMHgzODU0LCAweDM4YjksIDB4MzhiOSwgMHgzODU0LCAweDM4NTQsIDB4YTY4NCwgMHgwMDgwLAorCTB4MDA0MCwgMHgzMGVkLCAweDcxOTQsIDB4ODFmZiwgMHgwMDQwLCAweDMwZWQsIDB4YTE4MiwgMHgwMDBkLAorCTB4MDBkMCwgMHgzMGNlLCAweDcwOTcsIDB4MDAwMCwgMHgwMDc4LCAweDMwZDMsIDB4YTE4MiwgMHgwMDBjLAorCTB4NzA5NiwgMHgyMDA5LCAweDAwMGMsIDB4Nzg5YiwgMHgwMDYxLCAweDc5YWEsIDB4MTU3ZSwgMHgxMzdlLAorCTB4MTQ3ZSwgMHg3MDk4LCAweDgxMTQsIDB4YTIxMCwgMHg3MjlhLCAweGEwODAsIDB4MDAwYiwgMHhhZDAwLAorCTB4MjA5OCwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLCAweDgxMDgsIDB4ODFhYywgMHg1M2E2LAorCTB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3OCwgMHgzODVlLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLAorCTB4MzEyZSwgMHg2ODIwLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDM4NWUsIDB4YTY4YywgMHgwMDYwLAorCTB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MzEwMiwgMHhhMDg2LCAweDAwNjAsIDB4MDBjMCwgMHgzMTAyLAorCTB4YTE4ZCwgMHg0MDAwLCAweGExOGMsIDB4ZmZmYiwgMHg3OTVhLCAweDY5YjYsIDB4Nzg5YiwgMHgwMDYwLAorCTB4NzhhYiwgMHgwMDAwLCAweDc4OWIsIDB4MDA2MSwgMHg2ODE4LCAweGEwODUsIDB4ODAwMCwgMHg2ODFhLAorCTB4NzhhYSwgMHg4MDA4LCAweDgxMGMsIDB4MDA0MCwgMHgzM2RkLCAweGExOGMsIDB4MDBmOCwgMHgwMGMwLAorCTB4MzNkZCwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmIsIDB4Nzg5YiwgMHgwMDAwLAorCTB4ODAwMCwgMHg4MGFjLCAweGFkODAsIDB4MDAwYiwgMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MTU3ZiwgMHg2ODE0LCAweDgwMDcsIDB4Nzg4MiwgMHgwMDc4LCAweDM4NWUsIDB4NjgxOCwgMHhhMDg0LAorCTB4ODAwMCwgMHgwMDQwLCAweDMxMzUsIDB4NjgxYiwgMHgwMDA4LCAweDc4MWIsIDB4MDBjOCwgMHgwMDc4LAorCTB4MjQzOCwgMHgyMzAwLCAweDAwNzksIDB4MzEzYywgMHgzMTQxLCAweDMxZTAsIDB4MzEzZiwgMHgxMDc4LAorCTB4MjNjYSwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDMxNDYsIDB4MjQ2MSwgMHgzMTUwLAorCTB4MzE4NSwgMHgzMTViLCAweDMxNGUsIDB4MjQ2MSwgMHgzMTRlLCAweDMxNGUsIDB4MTA3OCwgMHgyM2NhLAorCTB4NjgxYywgMHhhMDg0LCAweDIwMDAsIDB4MDA0MCwgMHgzMTY5LCAweDYwMDgsIDB4YTA4NSwgMHgwMDAyLAorCTB4NjAwYSwgMHgwMDc4LCAweDMxNjksIDB4NjhjMCwgMHhhMDA1LCAweDAwYzAsIDB4MzE4NSwgMHg2OTIwLAorCTB4YTE4ZCwgMHgwMDAxLCAweDY5MjIsIDB4NjhjMywgMHgwMDAxLCAweDY4MDAsIDB4NzA2YSwgMHgwMDc4LAorCTB4MzE3ZiwgMHg2OTIwLCAweGExOGQsIDB4MDAwMSwgMHg2OTIyLCAweDY4MDAsIDB4NjAwNiwgMHhhMDA1LAorCTB4MDBjMCwgMHgzMTczLCAweDYwMDIsIDB4NjgxYywgMHhhMDg0LCAweDAwMGUsIDB4MDA0MCwgMHgzMTdmLAorCTB4NzAxNCwgMHg2OGJhLCAweDcxMzAsIDB4YTE4OCwgMHg3MzAwLCAweDAwNzgsIDB4MzE4MSwgMHgyMDA5LAorCTB4NzQwMCwgMHgyMTA0LCAweDY4MDIsIDB4MmQwYSwgMHg3MTYyLCAweDZlYjYsIDB4YTY4NCwgMHgwMDYwLAorCTB4MDA0MCwgMHgzMWRlLCAweGE2ODQsIDB4MDgwMCwgMHgwMGMwLCAweDMxOTksIDB4YTY4NCwgMHg3ZmZmLAorCTB4NjhiNiwgMHg2ODk0LCAweDY4YTYsIDB4Njg5OCwgMHg2OGFhLCAweDEwNzgsIDB4NDYzMywgMHgwMDc4LAorCTB4MzFkZSwgMHhhNjg0LCAweDAwMjAsIDB4MDA0MCwgMHgzMWFlLCAweDY4YzAsIDB4YTAwNSwgMHgwMDQwLAorCTB4MzFhNSwgMHgxMDc4LCAweDRhMzUsIDB4MDA3OCwgMHgzMWE4LCAweGEwMDYsIDB4MTA3OCwgMHg0OWVkLAorCTB4NzlkOCwgMHg3YWRjLCAweDY5YWEsIDB4NmFhNiwgMHgwMDc4LCAweDMxYjQsIDB4MTA3OCwgMHgzN2NhLAorCTB4NjlhYSwgMHg2YWE2LCAweDEwNzgsIDB4NDllZCwgMHhhNjg0LCAweDgwMDAsIDB4MDA0MCwgMHgzMWRlLAorCTB4YTY4NCwgMHg3ZmZmLCAweDY4YjYsIDB4MjAwMSwgMHgwMDc2LCAweDEwNzgsIDB4MzhlNCwgMHgyMDEwLAorCTB4MjAwMSwgMHgwMDc4LCAweDEwNzgsIDB4MzhlNCwgMHgyMDA4LCAweGE2ODQsIDB4MDAyMCwgMHgwMGMwLAorCTB4MzFkNiwgMHgyMDAxLCAweDAwN2EsIDB4MTA3OCwgMHgzOGU0LCAweDgwMWIsIDB4MDBjOCwgMHgzMWQxLAorCTB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4NmI5OCwgMHgyMTAwLAorCTB4YTMwMiwgMHg2OGIyLCAweDZiOTQsIDB4MjIwMCwgMHhhMzAzLCAweDY4YWUsIDB4MDA3OCwgMHgyNDYxLAorCTB4MDA3OCwgMHgzNjdiLCAweDcwMzcsIDB4MDAwMCwgMHhhMjgyLCAweDAwMDYsIDB4MDA1MCwgMHgzMWVhLAorCTB4MTA3OCwgMHgyM2NhLCAweDcwMDAsIDB4YTA4NCwgMHgwMDA3LCAweDEwYzAsIDB4Mzk4YSwgMHgyMzAwLAorCTB4MDA3OSwgMHgzMWYyLCAweDMxZjUsIDB4MzIxZSwgMHgzMjMyLCAweDIyMDAsIDB4MDA3OSwgMHgzMWY4LAorCTB4MzIxYywgMHgzNjdiLCAweDMxZmUsIDB4MzIxYywgMHgzMjRlLCAweDMyOTAsIDB4NzAwMywgMHgwMDA1LAorCTB4MjAwMSwgMHg3NTEwLCAweDIwNjgsIDB4NzA0YSwgMHgxNTdlLCAweDIwYTksIDB4MDAzMSwgMHgyMDAzLAorCTB4MDAwMCwgMHg4MDAwLCAweDAwNzAsIDB4MzIwZSwgMHgwMDc4LCAweDMyMDcsIDB4MTU3ZiwgMHhhZDgwLAorCTB4MDAwOSwgMHg3MDM2LCAweDY4MTcsIDB4MDAwMCwgMHg2OGI3LCAweDA3MDAsIDB4NjgyMywgMHgwODAwLAorCTB4NjgyNywgMHgwMDAzLCAweDAwNzgsIDB4MzY2YiwgMHgxMDc4LCAweDIzY2EsIDB4NzAwMywgMHgwMDA1LAorCTB4MjAwMSwgMHg3NTEwLCAweDIwNjgsIDB4NzA0YSwgMHhhZDgwLCAweDAwMDksIDB4NzAzNiwgMHgyMjAwLAorCTB4MDA3OSwgMHgzMjJhLCAweDM2N2IsIDB4MzIzMCwgMHgzMjMwLCAweDMyNGUsIDB4MzIzMCwgMHgzNjdiLAorCTB4MTA3OCwgMHgyM2NhLCAweDcwMDMsIDB4MDAwNSwgMHgyMDAxLCAweDc1MTAsIDB4MjA2OCwgMHg3MDRhLAorCTB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4MjIwMCwgMHgwMDc5LCAweDMyM2UsIDB4MzI0NiwgMHgzMjQ0LAorCTB4MzI0NCwgMHgzMjQ2LCAweDMyNDQsIDB4MzI0NiwgMHgxMDc4LCAweDIzY2EsIDB4MTA3OCwgMHgzNjlmLAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4NzAwMywgMHgwMDAyLAorCTB4N2E4MCwgMHhhMjk0LCAweDBmMDAsIDB4Nzg5YiwgMHgwMDE4LCAweDdjYTgsIDB4YTQ4NCwgMHgwMDFmLAorCTB4YTIxNSwgMHgyMDY5LCAweDc0MDAsIDB4MmQwNCwgMHgyZDA4LCAweDcxNjIsIDB4MjA2OCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzMjY5LCAweDY4MTQsIDB4YTIwNiwgMHgwMDQwLCAweDMyODUsIDB4NjgwMCwgMHgwMDc4LAorCTB4MzI1YywgMHg3MDAzLCAweDAwMDUsIDB4MjAwMSwgMHg3NTEwLCAweDIwNjgsIDB4NzA0YSwgMHg3MDM2LAorCTB4MTU3ZSwgMHgyMGE5LCAweDAwMzEsIDB4MjAwMywgMHgwMDAwLCAweDgwMDAsIDB4MDA3MCwgMHgzMjdhLAorCTB4MDA3OCwgMHgzMjczLCAweDE1N2YsIDB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4NmExNiwgMHg2OGI3LAorCTB4MDcwMCwgMHg2ODIzLCAweDA4MDAsIDB4NjgyNywgMHgwMDAzLCAweDZlYjQsIDB4N2U1YSwgMHg2ODIwLAorCTB4YTA4NCwgMHgwYzAwLCAweDAwNDAsIDB4MzJkZiwgMHgxMDc4LCAweDM2OTcsIDB4MDA3OCwgMHgzMmRmLAorCTB4NzAwMywgMHgwMDAyLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDc4OWIsIDB4MDAxOCwgMHg3Y2E4LAorCTB4YTQ4NCwgMHgwMDFmLCAweGEyMTUsIDB4NzlhOCwgMHg3OWE4LCAweGExOGMsIDB4MDBmZiwgMHhhMWU4LAorCTB4NzMwMCwgMHgyZDA0LCAweDJkMDgsIDB4NzE2MiwgMHgyMDY4LCAweGEwMDUsIDB4MDA0MCwgMHgzMmFmLAorCTB4NjgxNCwgMHhhMjA2LCAweDAwNDAsIDB4MzJjYSwgMHg2ODAwLCAweDAwNzgsIDB4MzJhMiwgMHg3MDAzLAorCTB4MDAwNSwgMHgyMDAxLCAweDc1MTAsIDB4MjA2OCwgMHg3MDRhLCAweDE1N2UsIDB4MjBhOSwgMHgwMDMxLAorCTB4MjAwMywgMHgwMDAwLCAweDgwMDAsIDB4MDA3MCwgMHgzMmJmLCAweDAwNzgsIDB4MzJiOCwgMHgxNTdmLAorCTB4YWQ4MCwgMHgwMDA5LCAweDcwMzYsIDB4NmExNiwgMHg2OGI3LCAweDA3MDAsIDB4NjgyMywgMHgwODAwLAorCTB4NjgyNywgMHgwMDAzLCAweDZlYjQsIDB4N2U1YSwgMHg2ODIwLCAweGEwODQsIDB4MGMwMCwgMHgwMDQwLAorCTB4MzJkZiwgMHhhMDg0LCAweDA4MDAsIDB4MDA0MCwgMHgzMmQ5LCAweDEwNzgsIDB4MzY5YiwgMHgwMDc4LAorCTB4MzJkZiwgMHgxMDc4LCAweDM2OTcsIDB4NzA4YiwgMHgwMDAwLCAweDAwNzgsIDB4MzJkZiwgMHgwMjdlLAorCTB4ODIwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHg1MjgwLAorCTB4MjA2MCwgMHg3MDU2LCAweDYwMDAsIDB4NzA1YSwgMHg2MDA0LCAweDcwNWUsIDB4YTY4NCwgMHgwMDYwLAorCTB4MDA0MCwgMHgzMzM3LCAweDZiOTgsIDB4NmM5NCwgMHg2OWFjLCAweDY4YjAsIDB4YTEwNSwgMHgwMGMwLAorCTB4MzMxOSwgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweGE2YjQsIDB4YjdmZiwgMHg3ZTVhLAorCTB4YTY4NCwgMHgwMDYwLCAweGEwODYsIDB4MDA2MCwgMHgwMDQwLCAweDMzMzcsIDB4NjhjMCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzMzEyLCAweDcwMDMsIDB4MDAwMywgMHg2ODJiLCAweDAwMDAsIDB4MTA3OCwgMHg0OGU2LAorCTB4MDA3OCwgMHgzMzE0LCAweDEwNzgsIDB4NDhmNywgMHhhNmI1LCAweDIwMDAsIDB4N2U1YSwgMHgwMDc4LAorCTB4MzMzNywgMHg2OGIwLCAweGEzMWEsIDB4MjEwMCwgMHhhNDIzLCAweDI0MDAsIDB4YTMwNSwgMHgwMDQwLAorCTB4MzMzNywgMHg3YmQyLCAweDdiZGEsIDB4N2NkNiwgMHg3Y2RlLCAweDY4YjAsIDB4YTZiNCwgMHhiZmZmLAorCTB4N2U1YSwgMHgwMDdlLCAweDY4YzAsIDB4YTAwNSwgMHgwMDdmLCAweDAwNDAsIDB4MzMzNSwgMHg3MDAzLAorCTB4MDAwMywgMHgxMDc4LCAweDQ4ZTYsIDB4MDA3OCwgMHgzMzM3LCAweDEwNzgsIDB4NDk0MiwgMHgwNzdmLAorCTB4MTA3OCwgMHgzN2JkLCAweDIwMDksIDB4MDA2NSwgMHhhNjg0LCAweDAwMDQsIDB4MDA0MCwgMHgzMzU4LAorCTB4NzhlNCwgMHhhMDg0LCAweDAwMzAsIDB4MDA0MCwgMHgzMzUwLCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLAorCTB4MDA0MCwgMHgzMzUwLCAweDc4MmIsIDB4MzAwOCwgMHgyMDA5LCAweDAwNjUsIDB4MDA3OCwgMHgzMzU4LAorCTB4MGY3ZSwgMHgyMDc5LCAweDUwMDAsIDB4MTA3OCwgMHg0NjMzLCAweDBmN2YsIDB4MDA0MCwgMHgyNDYxLAorCTB4NzkxYSwgMHgyZDAwLCAweDcwNGEsIDB4ODIwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHhhMDgwLCAweDUyODAsIDB4MjA0OCwgMHgwMDc4LCAweDI0MzgsIDB4NjAyMCwgMHhhMDA1LAorCTB4MDA0MCwgMHgzMzcyLCAweDgwMDEsIDB4NjAyMiwgMHg2MDA4LCAweGEwODUsIDB4MDAwOCwgMHg2MDBhLAorCTB4NzAxMCwgMHg2MDI2LCAweDAwN2MsIDB4YTAwNiwgMHgxMDc4LCAweDQ2MzMsIDB4NjgxNywgMHgwMDAwLAorCTB4NjgxYiwgMHgwMDAxLCAweDY4MjMsIDB4MDA0MCwgMHg2ODFmLCAweDAxMDAsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDc5LCAweDMzODMsIDB4MjQ2MSwgMHgzMzhkLCAweDMzOGQsIDB4MzNhYSwgMHgzMzk1LAorCTB4MzM5MywgMHgzMzk1LCAweDMzOGIsIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MzNiNSwgMHgxMDc4LAorCTB4MzNhZSwgMHgxMDc4LCAweDFjNTMsIDB4MDA3OCwgMHgyNDYxLCAweDcwNmMsIDB4NzA2ZiwgMHgwMDAwLAorCTB4NzA5MywgMHgwMDAwLCAweDAwNzksIDB4MzM5YywgMHgzM2E2LCAweDMzYTYsIDB4MzNhNCwgMHgzM2E0LAorCTB4MzNhNCwgMHgzM2E2LCAweDMzYTQsIDB4MzNhNiwgMHgwMDc5LCAweDI4NDAsIDB4NzA2ZiwgMHgwMDAwLAorCTB4MDA3OCwgMHgyNDYxLCAweDY4MWIsIDB4MDAwMCwgMHgwMDc4LCAweDJlZWQsIDB4NjgwMCwgMHhhMDA1LAorCTB4MDBjMCwgMHgzM2IzLCAweDYwMDIsIDB4NjAwNiwgMHgwMDdjLCAweDYwMTAsIDB4YTAwNSwgMHgwMDQwLAorCTB4MzNiZSwgMHg4MDAxLCAweDAwZDAsIDB4MzNiZSwgMHgxMDc4LCAweDIzY2EsIDB4NjAxMiwgMHg2MDA4LAorCTB4YTA4NCwgMHhmZmVmLCAweDYwMGEsIDB4MDA3YywgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgzM2NhLAorCTB4ODAwMSwgMHg2MDFhLCAweDAwN2MsIDB4MTA3OCwgMHgzOGRlLCAweDY4MWIsIDB4MDAxOCwgMHgwMDc4LAorCTB4MzQwMSwgMHgxMDc4LCAweDM4ZGUsIDB4NjgxYiwgMHgwMDE5LCAweDAwNzgsIDB4MzQwMSwgMHgxMDc4LAorCTB4MzhkZSwgMHg2ODFiLCAweDAwMWEsIDB4MDA3OCwgMHgzNDAxLCAweDEwNzgsIDB4MzhkZSwgMHg2ODFiLAorCTB4MDAwMywgMHgwMDc4LCAweDM0MDEsIDB4Nzc4MCwgMHgxMDc4LCAweDM3YmQsIDB4NzE4NCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMWU4LCAweDczMDAsIDB4MmQwNCwgMHgyZDA4LCAweDIwNjgsIDB4YTAwNSwgMHgwMGMwLAorCTB4MzNmMywgMHgwMDc4LCAweDI0NjEsIDB4NjgxNCwgMHg3MjgwLCAweGEyMDYsIDB4MDA0MCwgMHgzM2ZiLAorCTB4NjgwMCwgMHgwMDc4LCAweDMzZWMsIDB4NjgwMCwgMHgyMDBhLCAweDY4MWIsIDB4MDAwNSwgMHg3MDhiLAorCTB4MDAwMCwgMHgxMDc4LCAweDMzYjUsIDB4NjgyMCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgzNDBhLAorCTB4MTA3OCwgMHgzM2FlLCAweDEwNzgsIDB4MzNjNCwgMHg2ODFmLCAweDAwMDAsIDB4NjgyMywgMHgwMDIwLAorCTB4MTA3OCwgMHgxYzUzLCAweDAwNzgsIDB4MjQ2MSwgMHhhMjgyLCAweDAwMDMsIDB4MDBjMCwgMHgzNjZiLAorCTB4N2RhOCwgMHhhNWFjLCAweDAwZmYsIDB4N2NhOCwgMHhhNGE0LCAweDAwZmYsIDB4NjkyMCwgMHhhMThkLAorCTB4MDA4MCwgMHg2OTIyLCAweGExODQsIDB4MDEwMCwgMHgwMDQwLCAweDM0NzgsIDB4YTE4YywgMHhmZWZmLAorCTB4NjkyMiwgMHhhNGE0LCAweDAwZmYsIDB4MDA0MCwgMHgzNDYyLCAweGE0ODIsIDB4MDAwYywgMHgwMDQ4LAorCTB4MzQzNSwgMHgwMDQwLCAweDM0MzUsIDB4MjAyMSwgMHgwMDBjLCAweDg1MmIsIDB4ODUyYiwgMHgxMDc4LAorCTB4MzcyZSwgMHgwMDQwLCAweDM0M2YsIDB4MTA3OCwgMHgzNTMxLCAweDAwNzgsIDB4MzQ2YiwgMHgxMDc4LAorCTB4MzZlOSwgMHgwYzdlLCAweDI5NjAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgxMDc4LAorCTB4MzU1OCwgMHgwYzdmLCAweDY5MjAsIDB4YTE4ZCwgMHgwMTAwLCAweDY5MjIsIDB4N2U1OCwgMHhhNmI1LAorCTB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDM0NWMsIDB4NzgyYiwgMHgzMDA4LAorCTB4NzgxYiwgMHgwMDU2LCAweDAwNzgsIDB4MjQzOCwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LAorCTB4MDA3OCwgMHgyNDM4LCAweDBjN2UsIDB4Mjk2MCwgMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LAorCTB4MTA3OCwgMHgzNTU4LCAweDBjN2YsIDB4N2U1OCwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgzNDc0LAorCTB4NzgxYiwgMHgwMDU4LCAweDAwNzgsIDB4MjQzOCwgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDM4LAorCTB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4NjEwMCwgMHhhMThjLCAweDEwMDAsIDB4MDA0MCwgMHgzNGI4LAorCTB4NjIwOCwgMHg4MjE3LCAweGEyOTQsIDB4MDBmZiwgMHhhMjgyLCAweDAwMGMsIDB4MDA0OCwgMHgzNDhjLAorCTB4MDA0MCwgMHgzNDhjLCAweDIwMTEsIDB4MDAwYywgMHgyNDAwLCAweGEyMDIsIDB4MDBjOCwgMHgzNDkxLAorCTB4MjIyMCwgMHg2MjA4LCAweGEyOTQsIDB4MDBmZiwgMHg3MDE4LCAweGEwODYsIDB4MDAyOCwgMHgwMGMwLAorCTB4MzRhMSwgMHhhMjgyLCAweDAwMTksIDB4MDBjOCwgMHgzNGE3LCAweDIwMTEsIDB4MDAxOSwgMHgwMDc4LAorCTB4MzRhNywgMHhhMjgyLCAweDAwMGMsIDB4MDBjOCwgMHgzNGE3LCAweDIwMTEsIDB4MDAwYywgMHgyMjAwLAorCTB4YTUwMiwgMHgwMGM4LCAweDM0YWMsIDB4MjIyOCwgMHgxMDc4LCAweDM2ZWQsIDB4ODUyYiwgMHg4NTJiLAorCTB4MTA3OCwgMHgzNzJlLCAweDAwNDAsIDB4MzRiOCwgMHgxMDc4LCAweDM1MzEsIDB4MDA3OCwgMHgzNGJjLAorCTB4MTA3OCwgMHgzNmU5LCAweDEwNzgsIDB4MzU1OCwgMHg3ODU4LCAweGEwODUsIDB4MDAwNCwgMHg3ODVhLAorCTB4MGM3ZiwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHgwYzdlLAorCTB4Mjk2MCwgMHg2MDAwLCAweGEwODQsIDB4MTAwMCwgMHgwMGMwLCAweDM0ZGYsIDB4NjAxMCwgMHhhMDg0LAorCTB4MDAwZiwgMHgwMGMwLCAweDM0ZDksIDB4NjEwNCwgMHhhMThjLCAweGZmZjUsIDB4NjEwNiwgMHgwYzdmLAorCTB4MDA3YywgMHgyMDExLCAweDAwMzIsIDB4MjAxOSwgMHgwMDAwLCAweDAwNzgsIDB4MzUwNiwgMHg2OGEwLAorCTB4YTA4NCwgMHgwMjAwLCAweDAwYzAsIDB4MzRkOSwgMHg2MjA4LCAweGEyOTQsIDB4MDBmZiwgMHg3MDE4LAorCTB4YTA4NiwgMHgwMDI4LCAweDAwYzAsIDB4MzRmNCwgMHhhMjgyLCAweDAwMTksIDB4MDBjOCwgMHgzNGZhLAorCTB4MjAxMSwgMHgwMDE5LCAweDAwNzgsIDB4MzRmYSwgMHhhMjgyLCAweDAwMGMsIDB4MDBjOCwgMHgzNGZhLAorCTB4MjAxMSwgMHgwMDBjLCAweDYzMDgsIDB4ODMxZiwgMHhhMzljLCAweDAwZmYsIDB4YTM4MiwgMHgwMDBjLAorCTB4MDA0OCwgMHgzNTA2LCAweDAwNDAsIDB4MzUwNiwgMHgyMDE5LCAweDAwMGMsIDB4NzhhYiwgMHgwMDAxLAorCTB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLCAweDdiYWEsIDB4YThjMCwgMHgwMDA1LAorCTB4NjgyMCwgMHhhMDg1LCAweDAxMDAsIDB4NjgyMiwgMHgwYzdmLCAweDAwN2MsIDB4MGM3ZSwgMHgyOTYwLAorCTB4YTE4YywgMHhmZmY1LCAweDYxMDYsIDB4MjAxMSwgMHgwMDMyLCAweDIwMTksIDB4MDAwMCwgMHgwMDc4LAorCTB4MzUyMSwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3YWFhLAorCTB4N2JhYSwgMHhhOGMwLCAweDAwMDUsIDB4NjgyMCwgMHhhMDg1LCAweDAxMDAsIDB4NjgyMiwgMHgwYzdmLAorCTB4MDA3YywgMHgwYzdlLCAweDcxNTQsIDB4MjE2MCwgMHgxMDc4LCAweDM1MzgsIDB4MGM3ZiwgMHgwMDdjLAorCTB4MjAwOCwgMHhhMDg0LCAweGZmZjAsIDB4YTQyNSwgMHg3Yzg2LCAweDYwMTgsIDB4Nzg5YSwgMHg3Y2FlLAorCTB4NjQxMiwgMHg3OGE0LCAweGEwODQsIDB4ZmZmOCwgMHhhMThjLCAweDAwMDcsIDB4YTEwNSwgMHg3OGE2LAorCTB4NjAxNiwgMHg3ODhhLCAweGE0YTQsIDB4MDAwZiwgMHg4NDI3LCAweDgyMDQsIDB4ODAwNCwgMHhhMDg0LAorCTB4MDBmZiwgMHhhNDA1LCAweDYwMGUsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsIDB4NjAwNiwgMHgwMDdjLAorCTB4MGM3ZSwgMHg3MDU0LCAweDIwNjAsIDB4MTA3OCwgMHgzNTVmLCAweDBjN2YsIDB4MDA3YywgMHg2MDE4LAorCTB4Nzg5YSwgMHg3OGE0LCAweGEwODQsIDB4ZmZmMCwgMHg3OGE2LCAweDYwMTIsIDB4Nzg4NCwgMHhhMDg0LAorCTB4ZmZmMCwgMHg3ODg2LCAweDAwN2MsIDB4YTI4MiwgMHgwMDAyLCAweDAwYzAsIDB4MzY2YiwgMHg3YWE4LAorCTB4NjkyMCwgMHhhMThkLCAweDAwODAsIDB4NjkyMiwgMHhhMTg0LCAweDAyMDAsIDB4MDA0MCwgMHgzNWI0LAorCTB4YTE4YywgMHhmZGZmLCAweDY5MjIsIDB4YTI5NCwgMHgwMGZmLCAweGEyODIsIDB4MDAwMiwgMHgwMGM4LAorCTB4MzY2YiwgMHgxMDc4LCAweDM1ZmQsIDB4MTA3OCwgMHgzNTU4LCAweGE5ODAsIDB4MDAwMSwgMHgyMDBjLAorCTB4MTA3OCwgMHgzN2I5LCAweDEwNzgsIDB4MzRjNywgMHg4OGZmLCAweDAwNDAsIDB4MzVhNywgMHg3ODliLAorCTB4MDA2MCwgMHgyODAwLCAweDc4YWEsIDB4N2U1OCwgMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHhhNjg0LAorCTB4MDQwMCwgMHgwMGMwLCAweDM1YTEsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA1NiwgMHgwMDc4LAorCTB4MjQzOCwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHg3ZTU4LAorCTB4YTY4NCwgMHgwNDAwLCAweDAwYzAsIDB4MzViMCwgMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHhhMjgyLCAweDAwMDIsIDB4MDBjOCwgMHgzNWJjLAorCTB4YTI4NCwgMHgwMDAxLCAweDAwNDAsIDB4MzVjNiwgMHg3MTU0LCAweGExODgsIDB4MDAwMCwgMHgyMTBjLAorCTB4YTE4YywgMHgyMDAwLCAweDAwYzAsIDB4MzVjNiwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHgzNmRiLAorCTB4MTA3OCwgMHgzNWZkLCAweDEwNzgsIDB4MzU1OCwgMHg3ODU4LCAweGEwODUsIDB4MDAwNCwgMHg3ODVhLAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MGM3ZSwgMHgwMjdlLAorCTB4Mjk2MCwgMHg2MDAwLCAweDIwMTEsIDB4MDAwMSwgMHhhMDg0LCAweDIwMDAsIDB4MDBjMCwgMHgzNWVkLAorCTB4NjAxNCwgMHhhMDg0LCAweDAwNDAsIDB4MDBjMCwgMHgzNWViLCAweGExOGMsIDB4ZmZlZiwgMHg2MTA2LAorCTB4YTAwNiwgMHgwMDc4LCAweDM1ZmEsIDB4MjAxMSwgMHgwMDAwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLAorCTB4MDAwMiwgMHg3OGFiLCAweDAwMDMsIDB4N2FhYSwgMHhhOGMwLCAweDAwMDQsIDB4NjgyMCwgMHhhMDg1LAorCTB4MDIwMCwgMHg2ODIyLCAweDAyN2YsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NzA1NCwgMHgyMDYwLAorCTB4MTA3OCwgMHgzNjA0LCAweDBjN2YsIDB4MDA3YywgMHg4MmZmLCAweDAwNDAsIDB4MzYwOSwgMHgyMDExLAorCTB4MDA0MCwgMHg2MDE4LCAweGEwODAsIDB4MDAwMiwgMHg3ODlhLCAweDc4YTQsIDB4YTA4NCwgMHhmZmJmLAorCTB4YTIwNSwgMHg3OGE2LCAweDc4OGEsIDB4NjAxNiwgMHg2MDA0LCAweGEwODQsIDB4ZmZlZiwgMHg2MDA2LAorCTB4MDA3YywgMHgwMDdlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4MzYyMiwgMHgwMDdmLAorCTB4MDA3OCwgMHgzNjI1LCAweDAwN2YsIDB4MDA3OCwgMHgzNjY3LCAweGE2ODQsIDB4MDAyMCwgMHgwMDQwLAorCTB4MzY2NywgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDM2NjcsIDB4N2JiOCwgMHhhMzg0LAorCTB4MDAzZiwgMHg4MzFiLCAweDAwYzgsIDB4MzYzNSwgMHg4MDAwLCAweGEwMDUsIDB4MDA0MCwgMHgzNjRiLAorCTB4ODMxYiwgMHgwMGM4LCAweDM2M2UsIDB4ODAwMSwgMHgwMDQwLCAweDM2NjMsIDB4YTY4NCwgMHg0MDAwLAorCTB4MDA0MCwgMHgzNjRiLCAweDc4YjgsIDB4ODAxYiwgMHgwMGM4LCAweDM2NDcsIDB4ODAwMCwgMHhhMDg0LAorCTB4MDAzZiwgMHgwMGMwLCAweDM2NjMsIDB4YTZiNCwgMHhiZmZmLCAweDdlNWEsIDB4NzlkOCwgMHg3YWRjLAorCTB4MjAwMSwgMHgwMDAxLCAweGExMDgsIDB4MDBjOCwgMHgzNjU3LCAweGEyOTEsIDB4MDAwMCwgMHg3OWQyLAorCTB4NzlkYSwgMHg3YWQ2LCAweDdhZGUsIDB4MTA3OCwgMHg0OWVkLCAweDc4MWIsIDB4MDA2NCwgMHgxMDc4LAorCTB4NDg3MiwgMHgwMDc4LCAweDI0MzgsIDB4NzgxYiwgMHgwMDY0LCAweDAwNzgsIDB4MjQzOCwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgzNmEzLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHgzNjhmLCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLAorCTB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4MzY5NywgMHg3OGU0LAorCTB4YTA4NCwgMHgwMDMwLCAweDAwNDAsIDB4MjQ2MSwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLAorCTB4MjQ2MSwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMDY1LCAweDAwNzgsIDB4MjQzOCwgMHgyMDAxLAorCTB4MDAwNSwgMHgwMDc4LCAweDM2YTUsIDB4MjAwMSwgMHgwMDBjLCAweDAwNzgsIDB4MzZhNSwgMHgyMDAxLAorCTB4MDAwNiwgMHgwMDc4LCAweDM2YTUsIDB4MjAwMSwgMHgwMDBkLCAweDAwNzgsIDB4MzZhNSwgMHgyMDAxLAorCTB4MDAwOSwgMHgwMDc4LCAweDM2YTUsIDB4MjAwMSwgMHgwMDA3LCAweDc4OWIsIDB4MDAxMCwgMHg3OGFhLAorCTB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMSwgMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHgwMDdjLAorCTB4MDc3ZSwgMHg4NzNmLCAweGE3YmMsIDB4MDAwZiwgMHg4NzNiLCAweDg3M2IsIDB4ODcwMywgMHhhMGUwLAorCTB4NTI4MCwgMHhhN2I4LCAweDAwMjAsIDB4N2Y5YSwgMHg3OWE0LCAweGExODQsIDB4MDAwZiwgMHgwMDQwLAorCTB4MzZjOSwgMHhhMTg0LCAweGZmZjAsIDB4NzhhNiwgMHg2MDEyLCAweDYwMDQsIDB4YTA4NSwgMHgwMDA4LAorCTB4NjAwNiwgMHg4NzM4LCAweDg3MzgsIDB4N2Y5YSwgMHg3OWE0LCAweGExODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4MzZkOSwgMHhhMTg0LCAweGZmYmYsIDB4NzhhNiwgMHg2MDE2LCAweDYwMDQsIDB4YTA4NSwgMHgwMDEwLAorCTB4NjAwNiwgMHgwNzdmLCAweDAwN2MsIDB4Nzg5YiwgMHgwMDEwLCAweDc4YWIsIDB4MDAwMSwgMHg3OGFiLAorCTB4MDAwMiwgMHg3OGFiLCAweDAwMDMsIDB4N2FhYSwgMHg3ODliLCAweDAwNjAsIDB4NzhhYiwgMHgwMDA0LAorCTB4MDA3YywgMHgyMDIxLCAweDAwMDAsIDB4MjAyOSwgMHgwMDMyLCAweDc4OWIsIDB4MDAxMCwgMHg3OGFiLAorCTB4MDAwMSwgMHg3OGFiLCAweDAwMDMsIDB4NzhhYiwgMHgwMDAxLCAweDdkYWEsIDB4N2NhYSwgMHg3ODliLAorCTB4MDA2MCwgMHg3OGFiLCAweDAwMDUsIDB4MDA3YywgMHgxNTdlLCAweDgwMDcsIDB4YTA4NCwgMHgwMGZmLAorCTB4ODAwMywgMHg4MDAzLCAweGEwODAsIDB4MDAyMCwgMHg3ODlhLCAweDc5YTQsIDB4YTE4YywgMHhmZmYwLAorCTB4MjAwMSwgMHg1MDQ2LCAweDIwMDQsIDB4YTA4MiwgMHgwMDI4LCAweDAwNDAsIDB4MzcxNywgMHgyMDIxLAorCTB4MzdhMCwgMHgyMDE5LCAweDAwMTQsIDB4MjBhOSwgMHgwMDBjLCAweDAwNzgsIDB4MzcxZCwgMHgyMDIxLAorCTB4MzdhYywgMHgyMDE5LCAweDAwMTksIDB4MjBhOSwgMHgwMDBkLCAweDIwMTEsIDB4MDA2NCwgMHgyNDA0LAorCTB4YTA4NCwgMHhmZmYwLCAweGExMDYsIDB4MDA0MCwgMHgzNzJjLCAweDg0MjAsIDB4MjMwMCwgMHhhMjEwLAorCTB4MDA3MCwgMHgzNzJjLCAweDAwNzgsIDB4MzcxZiwgMHgxNTdmLCAweDAwN2MsIDB4MTU3ZSwgMHgyMDA5LAorCTB4NTA0NiwgMHgyMTBjLCAweGExODIsIDB4MDAzMiwgMHgwMDQ4LCAweDM3NDIsIDB4MDA0MCwgMHgzNzQ2LAorCTB4MjAwOSwgMHgzNzkyLCAweDIwMTksIDB4MDAxMSwgMHgyMGE5LCAweDAwMGUsIDB4MjAxMSwgMHgwMDMyLAorCTB4MDA3OCwgMHgzNzU4LCAweGExODIsIDB4MDAyOCwgMHgwMDQwLCAweDM3NTAsIDB4MjAwOSwgMHgzN2EwLAorCTB4MjAxOSwgMHgwMDE0LCAweDIwYTksIDB4MDAwYywgMHgyMDExLCAweDAwNjQsIDB4MDA3OCwgMHgzNzU4LAorCTB4MjAwOSwgMHgzN2FjLCAweDIwMTksIDB4MDAxOSwgMHgyMGE5LCAweDAwMGQsIDB4MjAxMSwgMHgwMDY0LAorCTB4MjIwMCwgMHhhNTAyLCAweDAwNDAsIDB4Mzc2OCwgMHgwMDQ4LCAweDM3NjgsIDB4ODEwOCwgMHgyMzAwLAorCTB4YTIxMCwgMHgwMDcwLCAweDM3NjUsIDB4MDA3OCwgMHgzNzU4LCAweDE1N2YsIDB4YTAwNiwgMHgwMDdjLAorCTB4MTU3ZiwgMHhhNTgyLCAweDAwNjQsIDB4MDBjOCwgMHgzNzc3LCAweDc4MDgsIDB4YTA4NSwgMHgwMDcwLAorCTB4NzgwYSwgMHg3MDQ0LCAweGEwODUsIDB4MDA3MCwgMHg3MDQ2LCAweDAwNzgsIDB4Mzc3NywgMHg3OGVjLAorCTB4YTA4NCwgMHgwMzAwLCAweDAwNDAsIDB4Mzc3ZiwgMHgyMTA0LCAweDAwNzgsIDB4Mzc5MCwgMHgyMTA0LAorCTB4YTA5ZSwgMHgxMTAyLCAweDAwYzAsIDB4Mzc5MCwgMHgyMDAxLCAweDA0ZmQsIDB4MjAwNCwgMHhhMDgyLAorCTB4MDAwNSwgMHgwMDQ4LCAweDM3OGYsIDB4MjAwMSwgMHgxMjAxLCAweDAwNzgsIDB4Mzc5MCwgMHgyMTA0LAorCTB4YTAwNSwgMHgwMDdjLCAweDExMDIsIDB4MzAwMiwgMHgzMjAyLCAweDQyMDMsIDB4NDQwMywgMHg1NDA0LAorCTB4NTYwNCwgMHg2NjA1LCAweDY4MDUsIDB4NzgwNiwgMHg3YTA2LCAweDBjMDcsIDB4MGMwNywgMHgwZTA3LAorCTB4MzIwMiwgMHg0MjAyLCAweDUyMDIsIDB4NjIwMiwgMHg3MjAyLCAweDY2MDUsIDB4NzYwNSwgMHg3ODA1LAorCTB4N2EwNSwgMHg3YzA1LCAweDdlMDUsIDB4N2YwNSwgMHgyMjAyLCAweDMyMDIsIDB4NDIwMiwgMHg1MjAyLAorCTB4NTQwNCwgMHg2NDA0LCAweDc0MDQsIDB4NzYwNCwgMHg3ODA0LCAweDdhMDQsIDB4N2MwNCwgMHg3ZTA0LAorCTB4N2YwNCwgMHg3ODliLCAweDAwMTAsIDB4YTA0NiwgMHgwMDdjLCAweGE3ODQsIDB4MGYwMCwgMHg4MDBiLAorCTB4YTc4NCwgMHgwMDFmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHhhMGUwLAorCTB4NTMwMCwgMHgwMDdjLCAweDc5ZDgsIDB4N2FkYywgMHg3OGQwLCAweDgwMWIsIDB4MDBjOCwgMHgzN2QxLAorCTB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsIDB4MDA3YywgMHgwZjdlLAorCTB4MjA3OSwgMHgwMTAwLCAweDIwMDksIDB4NTA0MCwgMHgyMDkxLCAweDgwMDAsIDB4MjEwNCwgMHgwMDc5LAorCTB4MzdlMSwgMHgzODE3LCAweDM3ZWIsIDB4MzdlYiwgMHgzN2ViLCAweDM3ZWIsIDB4MzdlYiwgMHgzN2ViLAorCTB4MzgxYiwgMHgxMDc4LCAweDIzY2EsIDB4Nzg0YiwgMHgwMDA0LCAweDc4NDgsIDB4YTA4NCwgMHgwMDA0LAorCTB4MDBjMCwgMHgzN2VkLCAweDc4NGIsIDB4MDAwOCwgMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLAorCTB4MzdmNCwgMHg2OGI0LCAweGEwODUsIDB4NDAwMCwgMHg2OGI2LCAweDc4NTgsIDB4YTA4NSwgMHg0MDAwLAorCTB4Nzg1YSwgMHg3ODMwLCAweGEwODQsIDB4MDA4MCwgMHgwMGMwLCAweDM4MTcsIDB4MDAxOCwgMHgzODE3LAorCTB4NjgxYywgMHhhMDg0LCAweDAwMjAsIDB4MDBjMCwgMHgzODE1LCAweDBlN2UsIDB4MjA3MSwgMHg1MDQwLAorCTB4MTA3OCwgMHgzODY4LCAweDBlN2YsIDB4MDA3OCwgMHgzODE3LCAweDc4MWIsIDB4MDBkMiwgMHgyMDkxLAorCTB4ODAwMSwgMHgwZjdmLCAweDAwN2MsIDB4MTA3OCwgMHgzYTQyLCAweDAwNzgsIDB4MzgxNywgMHgwYzdlLAorCTB4NjgxNCwgMHg4MDA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGUwLAorCTB4NTI4MCwgMHg2MDA0LCAweGEwODQsIDB4MDAwYSwgMHgwMGMwLCAweDM4NTIsIDB4NjEwOCwgMHhhMTk0LAorCTB4ZmYwMCwgMHgwMDQwLCAweDM4NTIsIDB4YTE4YywgMHgwMGZmLCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LAorCTB4MDA0MCwgMHgzODQxLCAweDIwMDEsIDB4MDAzMiwgMHhhMTA2LCAweDAwNDAsIDB4Mzg0NSwgMHgwMDc4LAorCTB4Mzg0OSwgMHgyMDA5LCAweDAwMjAsIDB4MDA3OCwgMHgzODRiLCAweDIwMDksIDB4MDAzZiwgMHgwMDc4LAorCTB4Mzg0YiwgMHgyMDExLCAweDAwMDAsIDB4MjEwMCwgMHhhMjA1LCAweDYwMGEsIDB4NjAwNCwgMHhhMDg1LAorCTB4MDAwMiwgMHg2MDA2LCAweDBjN2YsIDB4MDA3YywgMHg3ODFiLCAweDAwNjUsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA2NSwgMHgwMDc4LCAweDI0MzgsIDB4NzgxYiwgMHgwMDU4LAorCTB4MDA3OCwgMHgyNDM4LCAweDc4MmIsIDB4MzAwOCwgMHg3ODFiLCAweDAwNTYsIDB4MDA3OCwgMHgyNDM4LAorCTB4MjAwOSwgMHg1MDIwLCAweDIxMGMsIDB4YTE4NiwgMHgwMDAwLCAweDAwNDAsIDB4Mzg3YywgMHhhMTg2LAorCTB4MDAwMSwgMHgwMDQwLCAweDM4N2YsIDB4MjAwOSwgMHg1MDM4LCAweDIwMGIsIDB4MDAwYiwgMHg3MDZmLAorCTB4MDAwMSwgMHg3ODFiLCAweDAwNDgsIDB4MDA3YywgMHg3ODFiLCAweDAwY2MsIDB4MDA3YywgMHgyMDA5LAorCTB4NTAzOCwgMHgyMDBiLCAweDAwMGEsIDB4MDA3YywgMHgyMDA5LCAweDUwMjAsIDB4MjEwYywgMHhhMTg2LAorCTB4MDAwMCwgMHgwMDQwLCAweDM4OWYsIDB4YTE4NiwgMHgwMDAxLCAweDAwNDAsIDB4Mzg5OSwgMHgyMDA5LAorCTB4NTAzOCwgMHgyMDBiLCAweDAwMGIsIDB4NzA2ZiwgMHgwMDAxLCAweDc4MWIsIDB4MDA0OCwgMHgwMDc4LAorCTB4MjQzOCwgMHgyMDA5LCAweDUwMzgsIDB4MjAwYiwgMHgwMDBhLCAweDAwNzgsIDB4MjQzOCwgMHg3ODJiLAorCTB4MzAwOCwgMHg3ODFiLCAweDAwY2MsIDB4MDA3OCwgMHgyNDM4LCAweDc4MWIsIDB4MDBkMiwgMHgwMDc4LAorCTB4MjQzOCwgMHg3ODJiLCAweDMwMDgsIDB4NzgxYiwgMHgwMGQyLCAweDAwNzgsIDB4MjQzOCwgMHg3ODFiLAorCTB4MDA5MywgMHgwMDc4LCAweDI0MzgsIDB4NzgyYiwgMHgzMDA4LCAweDc4MWIsIDB4MDA5MywgMHgwMDc4LAorCTB4MjQzOCwgMHg2ODE4LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDM4YzAsIDB4NjgxYiwgMHgwMDFkLAorCTB4NzA2ZiwgMHgwMDAxLCAweDc4MWIsIDB4MDA0OCwgMHgwMDc4LCAweDI0MzgsIDB4MDA3ZSwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4MzhkYywgMHg3ODA4LCAweGEwODQsIDB4ZmZmYywgMHg3ODBhLAorCTB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHg3OGVjLCAweGEwODQsIDB4MDAyMSwgMHgwMDQwLAorCTB4MzhkYywgMHg3MDQ0LCAweDc4MGEsIDB4YTAwNSwgMHgwMDdmLCAweDAwN2MsIDB4NzA0NCwgMHhhMDg1LAorCTB4MDAwMiwgMHg3MDQ2LCAweDc4MGEsIDB4MDA3YywgMHgwMDdlLCAweDc4MzAsIDB4YTA4NCwgMHgwMDQwLAorCTB4MDBjMCwgMHgzOGU1LCAweDAwOTgsIDB4MzhmMCwgMHgwMDdmLCAweDc4OWEsIDB4NzhhYywgMHgwMDdjLAorCTB4NzgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NzgwYSwgMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LAorCTB4NzhlYywgMHhhMDg0LCAweDAwMjEsIDB4MDA0MCwgMHgzOGZmLCAweDAwOTgsIDB4MzhmZCwgMHgwMDdmLAorCTB4Nzg5YSwgMHg3OGFjLCAweDAwN2UsIDB4NzA0NCwgMHg3ODBhLCAweDAwN2YsIDB4MDA3YywgMHg3OGVjLAorCTB4YTA4NCwgMHgwMDAyLCAweDAwYzAsIDB4NDYxZCwgMHhhNzg0LCAweDAwN2QsIDB4MDBjMCwgMHgzOTEzLAorCTB4MjcwMCwgMHgxMDc4LCAweDIzY2EsIDB4YTc4NCwgMHgwMDAxLCAweDAwYzAsIDB4MmY0MywgMHhhNzg0LAorCTB4MDA3MCwgMHgwMDQwLCAweDM5MjMsIDB4MGM3ZSwgMHgyZDYwLCAweDJmNjgsIDB4MTA3OCwgMHgyMzc1LAorCTB4MmQ3OCwgMHgyYzY4LCAweDBjN2YsIDB4YTc4NCwgMHgwMDA4LCAweDAwNDAsIDB4MzkzMCwgMHg3ODRiLAorCTB4MDAwOCwgMHg3OGVjLCAweGEwODQsIDB4MDAwMywgMHgwMDQwLCAweDI0NjEsIDB4MDA3OCwgMHgzODU0LAorCTB4YTc4NCwgMHgwMDA0LCAweDAwNDAsIDB4Mzk2MywgMHg3OGI4LCAweGEwODQsIDB4NDAwMSwgMHgwMDQwLAorCTB4Mzk2MywgMHg3ODRiLCAweDAwMDgsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDA0MCwgMHgyNDYxLAorCTB4NzhlNCwgMHhhMDg0LCAweDAwMDcsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4Mzk2MywgMHg3OGMwLAorCTB4YTA4NSwgMHg0ODAwLCAweDIwMzAsIDB4N2U1YSwgMHg3ODFiLCAweDAwZDIsIDB4MDA3OCwgMHgyNDM4LAorCTB4Nzg0YiwgMHgwMDA4LCAweDY4MTgsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4Mzk1ZiwgMHg2ODFiLAorCTB4MDAxNSwgMHhhNjg0LCAweDQwMDAsIDB4MDA0MCwgMHgzOTVmLCAweDY4MWIsIDB4MDAwNywgMHgxMDc4LAorCTB4Mzg2OCwgMHgwMDc4LCAweDI0MzgsIDB4NjgxYiwgMHgwMDAzLCAweDc4NTgsIDB4YTA4NCwgMHgzZjAwLAorCTB4NjgxZSwgMHg2ODJmLCAweDAwMDAsIDB4NjgzMywgMHgwMDAwLCAweDc4NGIsIDB4MDAwOCwgMHg3OGVjLAorCTB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4Mjk0NCwgMHgwMDE4LCAweDI0MzgsIDB4MDA3OCwgMHgzNjczLAorCTB4NmIxNCwgMHg4MzA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLAorCTB4NTI4MCwgMHgyMDYwLCAweDIwNDgsIDB4NzA1NiwgMHg2MDAwLCAweDcwNWEsIDB4NjAwNCwgMHg3MDVlLAorCTB4MmE2MCwgMHgwMDdjLCAweDAwNzksIDB4Mzk4YywgMHgzOTk0LCAweDM5OTUsIDB4Mzk5NCwgMHgzOTk3LAorCTB4Mzk5NCwgMHgzOTk0LCAweDM5OTQsIDB4Mzk5YywgMHgwMDdjLCAweDEwNzgsIDB4MzNjNCwgMHgxMDc4LAorCTB4NDYzMywgMHg3MDM4LCAweDYwMGEsIDB4MDA3YywgMHg3MGEwLCAweGEwMDUsIDB4MDA0MCwgMHgzOWE5LAorCTB4MjA2OCwgMHgxMDc4LCAweDFiNDUsIDB4MTA3OCwgMHg0NWI1LCAweDEwNzgsIDB4NDViYywgMHg3MGEzLAorCTB4MDAwMCwgMHgwMDdjLCAweDBlN2UsIDB4MjA5MSwgMHg4MDAwLCAweDIwNzEsIDB4NTA0MCwgMHg3MDAwLAorCTB4YTA4NiwgMHgwMDA3LCAweDAwYzAsIDB4MzljMCwgMHg2MTEwLCAweDcwYmMsIDB4YTEwNiwgMHgwMGMwLAorCTB4MzljMCwgMHgwZTdmLCAweDEwNzgsIDB4MWI1MiwgMHgxMDc4LCAweDM5YzYsIDB4YTAwNiwgMHgwMDdjLAorCTB4MjA5MSwgMHg4MDAxLCAweDBlN2YsIDB4YTA4NSwgMHgwMDAxLCAweDAwN2MsIDB4MGY3ZSwgMHgwZTdlLAorCTB4MjA3MSwgMHg1MDQwLCAweDAwNzgsIDB4MjFkOSwgMHg3ODViLCAweDAwMDAsIDB4NzBhZiwgMHgwMDBlLAorCTB4MjAwOSwgMHgwMTAwLCAweDAxN2UsIDB4NzBhMCwgMHhhMDZkLCAweDAwNDAsIDB4MzlkYiwgMHg3MGEzLAorCTB4MDAwMCwgMHgwMDc4LCAweDM5ZTEsIDB4NzBiMywgMHgwMDAwLCAweDEwNzgsIDB4MWI2ZSwgMHgwMDQwLAorCTB4MzllNywgMHg3MGFjLCAweDY4MjYsIDB4MTA3OCwgMHgzYWMyLCAweDAwNzgsIDB4MzlkYiwgMHgwMTdmLAorCTB4MTU3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MjBhOSwgMHgwMDA4LCAweDIwNjEsIDB4NzQxMCwgMHg2MDAwLAorCTB4YTEwNSwgMHg2MDAyLCAweDYwMWMsIDB4YTA2ZCwgMHgwMDQwLCAweDM5ZmYsIDB4NjgwMCwgMHg2MDFlLAorCTB4MTA3OCwgMHgxOTNkLCAweDYwMDgsIDB4ODAwMCwgMHg2MDBhLCAweDAwNzgsIDB4MzlmMiwgMHg2MDE4LAorCTB4YTA2ZCwgMHgwMDQwLCAweDNhMDksIDB4NjgwMCwgMHg2MDFhLCAweDEwNzgsIDB4MTkzZCwgMHgwMDc4LAorCTB4MzlmZiwgMHhhY2UwLCAweDAwMDgsIDB4MDA3MCwgMHgzYTBmLCAweDAwNzgsIDB4MzllZiwgMHg3MDljLAorCTB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4M2ExNiwgMHgxMDc4LCAweDNiM2MsIDB4MGQ3ZiwgMHgwYzdmLAorCTB4MTU3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLCAweDY4MDQsIDB4YTA4NCwgMHgwMDBmLAorCTB4MDA3OSwgMHgzYTIyLCAweDNhMzIsIDB4M2EzMiwgMHgzYTMyLCAweDNhMzIsIDB4M2EzMiwgMHgzYTMyLAorCTB4M2EzNCwgMHgzYTNhLCAweDNhMzIsIDB4M2EzMiwgMHgzYTMyLCAweDNhMzIsIDB4M2EzMiwgMHgzYTNjLAorCTB4M2EzMiwgMHgzYTM0LCAweDEwNzgsIDB4MjNjYSwgMHgxMDc4LCAweDQ0NjYsIDB4MTA3OCwgMHgxOTNkLAorCTB4MDA3OCwgMHgzYTQwLCAweDY4MjcsIDB4MDAwYiwgMHgxMDc4LCAweDQ0NjYsIDB4MTA3OCwgMHgzYWMyLAorCTB4MTI3ZiwgMHgwMDdjLCAweDEyN2UsIDB4MjA5MSwgMHgyMzAwLCAweDAwOTgsIDB4M2E1ZSwgMHg3ODMwLAorCTB4YTA4NCwgMHgwMGMwLCAweDAwYzAsIDB4M2E1ZSwgMHgwZDdlLCAweDEwNzgsIDB4NDVjNSwgMHgyZDAwLAorCTB4NjgyZSwgMHgyMDA5LCAweDAwMDQsIDB4MjAwMSwgMHgwMDAwLCAweDY4MjcsIDB4MDA4NCwgMHgxMDc4LAorCTB4NDU3ZSwgMHgxMDc4LCAweDNhYzIsIDB4MGQ3ZiwgMHgwMDc4LCAweDNhOTAsIDB4Nzk0OCwgMHhhMTg1LAorCTB4NDAwMCwgMHg3ODRhLCAweDAwOTgsIDB4M2E2NywgMHg3OTRhLCAweDAwNzgsIDB4M2E0YywgMHg3ODI4LAorCTB4YTA4NiwgMHgxODM0LCAweDAwYzAsIDB4M2E3MCwgMHhhMTg1LCAweDAwMDQsIDB4MDA3OCwgMHgzYTc3LAorCTB4NzgyOCwgMHhhMTg2LCAweDE4MTQsIDB4MDBjMCwgMHgzYTY0LCAweGExODUsIDB4MDAwYywgMHg3ODRhLAorCTB4Nzg5YiwgMHgwMDBlLCAweDc4YWIsIDB4MDAwMiwgMHg3ODU4LCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LAorCTB4MDQwMCwgMHg3ODVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMDkxLCAweDc4MWEsIDB4NjgyNywgMHgwMDAyLAorCTB4NjgyNywgMHgwMDg0LCAweDIwMDksIDB4MDAwNCwgMHgyMDAxLCAweDAwMDAsIDB4MTA3OCwgMHg0NTdlLAorCTB4MTI3ZiwgMHgwMDdjLCAweDBkN2UsIDB4NmIxNCwgMHgxMDc4LCAweDFiZTAsIDB4MDA0MCwgMHgzYTlmLAorCTB4MjA2OCwgMHg2ODI3LCAweDAwMDIsIDB4MTA3OCwgMHgzYWMyLCAweDAwNzgsIDB4M2E5NCwgMHgwZDdmLAorCTB4MDA3YywgMHgwZDdlLCAweDZiMTQsIDB4NmMyOCwgMHhhNGE0LCAweDAwZmYsIDB4MTA3OCwgMHgxYjdlLAorCTB4MDA0MCwgMHgzYWFmLCAweDIwNjgsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4M2FjMiwgMHgwZDdmLAorCTB4MDA3YywgMHgwZDdlLCAweDZiMTQsIDB4YTM5YywgMHgwMGZmLCAweDEwNzgsIDB4MWJiMSwgMHgwMDQwLAorCTB4M2FjMCwgMHgyMDY4LCAweDY4MjcsIDB4MDAwMiwgMHgxMDc4LCAweDNhYzIsIDB4MDA3OCwgMHgzYWI1LAorCTB4MGQ3ZiwgMHgwMDdjLCAweDBjN2UsIDB4NjkxNCwgMHgxMDc4LCAweDNiMzMsIDB4NjkwNCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTg2LCAweDAwMDYsIDB4MDA0MCwgMHgzYWRkLCAweGExODYsIDB4MDAwZCwgMHgwMDQwLAorCTB4M2FmYywgMHhhMTg2LCAweDAwMTcsIDB4MDBjMCwgMHgzYWQ5LCAweDEwNzgsIDB4MTkzZCwgMHgwMDc4LAorCTB4M2FkYiwgMHgxMDc4LCAweDFjNTUsIDB4MGM3ZiwgMHgwMDdjLCAweDYwMDQsIDB4ODAwMSwgMHgwMDQ4LAorCTB4M2FmYSwgMHg2MDA2LCAweDIwMDksIDB4MDAwMCwgMHhhNjg0LCAweDAwMDEsIDB4MDBjMCwgMHgzYWVhLAorCTB4YTE4ZCwgMHg4MDAwLCAweGE2ODQsIDB4MDAwNCwgMHgwMDQwLCAweDNhZjAsIDB4YTE4ZCwgMHgwMDAyLAorCTB4NjkxZSwgMHg2ODIzLCAweDAwMDAsIDB4NzEwNCwgMHg4MTBmLCAweDY4MTgsIDB4YTEwNSwgMHg2ODFhLAorCTB4MDA3OCwgMHgzYWQ5LCAweDEwNzgsIDB4MjNjYSwgMHg2MDE4LCAweGEwMDUsIDB4MDBjMCwgMHgzYjBiLAorCTB4NjAwOCwgMHg4MDAxLCAweDAwNDgsIDB4M2IwYiwgMHg2MDBhLCAweDYwMWMsIDB4NjgwMiwgMHgyZDAwLAorCTB4NjAxZSwgMHgwMDc4LCAweDNiMjEsIDB4YWM4OCwgMHgwMDA2LCAweDIxMDQsIDB4YTAwNSwgMHgwMDQwLAorCTB4M2IxNCwgMHgyMDA4LCAweDAwNzgsIDB4M2IwZCwgMHg2ODAyLCAweDJkMGEsIDB4NjAwOCwgMHg4MDAxLAorCTB4MDA0OCwgMHgzYWRiLCAweDYwMGEsIDB4NjAxOCwgMHgyMDY4LCAweDY4MDAsIDB4NjAxYSwgMHgwMDc4LAorCTB4M2IwNSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MTA3OCwgMHgxOTFhLAorCTB4MmRhMCwgMHgxMzdmLCAweDIwYTksIDB4MDAzMSwgMHg1M2EzLCAweDBjN2YsIDB4MTQ3ZiwgMHgxMzdmLAorCTB4MTU3ZiwgMHgwMDc4LCAweDNhZDksIDB4YTE4NCwgMHgwMDFmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLAorCTB4YTA4MCwgMHg3NDEwLCAweDIwNjAsIDB4MDA3YywgMHgyMDE5LCAweDUwNTEsIDB4MjMwNCwgMHhhMDg1LAorCTB4MDAwMSwgMHgyMDFhLCAweDIwMTksIDB4MDEwMiwgMHgyMzA0LCAweGEwODUsIDB4MDAwMSwgMHgyMDFhLAorCTB4MDA3YywgMHgyMDE5LCAweDUwNTEsIDB4MjMwNCwgMHhhMDg0LCAweGZmZmUsIDB4MjAxYSwgMHgyMDE5LAorCTB4MDEwMiwgMHgyMzA0LCAweGEwODQsIDB4ZmZmZSwgMHgyMDFhLCAweDAwN2MsIDB4Nzk5MCwgMHhhMThjLAorCTB4ZmZmOCwgMHg3OTkyLCAweDcwYjQsIDB4YTA4MCwgMHgwMGQ4LCAweDc4MWEsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzBhMywgMHgwMDAwLCAweDcwMDMsIDB4MDAwMCwgMHg3MDQzLCAweDAwMDEsIDB4NzAzNywgMHgwMDAwLAorCTB4MDAxOCwgMHgyM2VmLCAweDEwNzgsIDB4MWI2ZSwgMHgwMDQwLCAweDNiOTEsIDB4MjAwOSwgMHg1MDBmLAorCTB4MjAwYiwgMHgwMDAwLCAweDY4YmMsIDB4MjA2MCwgMHg2MTAwLCAweGExODQsIDB4MDMwMCwgMHgwMDQwLAorCTB4M2I4NSwgMHg2ODI3LCAweDAwMGUsIDB4YTA4NCwgMHgwMjAwLCAweDAwNDAsIDB4M2I4MSwgMHg2ODI3LAorCTB4MDAxNywgMHgxMDc4LCAweDNhYzIsIDB4MDA3OCwgMHgzYjYwLCAweDcwMDAsIDB4YTA4NiwgMHgwMDA3LAorCTB4MDBjMCwgMHgzYmUzLCAweDJkMDAsIDB4NzBhMiwgMHhhZDgwLCAweDAwMGYsIDB4NzAzNiwgMHgwMDc4LAorCTB4M2I5OCwgMHg3MDQwLCAweGEwODYsIDB4MDAwMSwgMHgwMDQwLCAweDI0NzEsIDB4MDA3OCwgMHgyNDM4LAorCTB4MjAzMSwgMHgwMDAwLCAweDY5MWMsIDB4YTE4NCwgMHgwMDAyLCAweDAwNDAsIDB4M2JhMSwgMHhhNmI1LAorCTB4MDAwNCwgMHhhMTg0LCAweDAwYzAsIDB4ODAwMywgMHg4MDAzLCAweDgwMDcsIDB4YTA4MCwgMHgzYzcyLAorCTB4MjAwNCwgMHhhNjM1LCAweDY4MjAsIDB4YTA4NCwgMHgwNDAwLCAweDAwNDAsIDB4M2JiOSwgMHg3ODliLAorCTB4MDAxOCwgMHg3OGFiLCAweDAwMDMsIDB4Nzg5YiwgMHgwMDgxLCAweDc4YWIsIDB4MDAwMSwgMHhhNmI1LAorCTB4MTAwMCwgMHg2ODIwLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDNiYzUsIDB4YTZiNSwgMHgwNDAwLAorCTB4Nzg5YiwgMHgwMDBlLCAweDY4MjQsIDB4ODAwNywgMHg3OGFhLCAweGE2ODQsIDB4MDIwMCwgMHgwMDQwLAorCTB4M2JkZiwgMHg2ODJjLCAweDc4ZDIsIDB4NjgzMCwgMHg3OGQ2LCAweGE2ODQsIDB4MDEwMCwgMHgwMDQwLAorCTB4M2JkZCwgMHg2ODJjLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDNiZGQsIDB4Nzg4OCwgMHhhMDg0LAorCTB4MDA0MCwgMHgwMDQwLCAweDNiZGQsIDB4YTZiNSwgMHg4MDAwLCAweDEwNzgsIDB4NDVhZCwgMHg3ZTVhLAorCTB4NmViNiwgMHgwMDc4LCAweDQ1ZTQsIDB4MTA3OCwgMHgzOGM2LCAweDAwYzAsIDB4M2M2YywgMHg3MDJjLAorCTB4ODAwNCwgMHgwMDQ4LCAweDNiZjEsIDB4MjAxOSwgMHg0Y2ZkLCAweDEwNzgsIDB4MjI1NSwgMHg3MDJmLAorCTB4MDAwMSwgMHgyMDExLCAweDAwMDEsIDB4MjAzMSwgMHgxMDAwLCAweDc4OWIsIDB4MDAxOCwgMHg2ODE0LAorCTB4YTA4NCwgMHgwMDFmLCAweGEwODUsIDB4MDA4MCwgMHg3OGFhLCAweDY5MWMsIDB4YTE4NCwgMHgwMDAyLAorCTB4MDA0MCwgMHgzYzBhLCAweGE2YjUsIDB4MDAwNCwgMHg3OGFiLCAweDAwMjAsIDB4NjgyOCwgMHg3OGFhLAorCTB4YTI5MCwgMHgwMDAyLCAweDY4MjAsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsIDB4M2MxOCwgMHhhNmI1LAorCTB4MDQwMCwgMHg3ODliLCAweDAwMGUsIDB4NjgyNCwgMHg4MDA3LCAweDc4YWEsIDB4MDA3OCwgMHgzYzI2LAorCTB4NjgxYywgMHhhMDg0LCAweDgwMDAsIDB4MDBjMCwgMHgzYzI2LCAweGE2YjUsIDB4MDgwMCwgMHg2ODIwLAorCTB4YTA4NCwgMHgwMTAwLCAweDAwNDAsIDB4M2MyNiwgMHhhNmI1LCAweDQwMDAsIDB4NjgxYywgMHhhMDg0LAorCTB4MDBjMCwgMHg4MDAzLCAweDgwMDMsIDB4ODAwNywgMHhhMDgwLCAweDNjNzIsIDB4MjAwNCwgMHhhNjM1LAorCTB4YTY4NCwgMHgwMTAwLCAweDAwNDAsIDB4M2M0MCwgMHg2ODJjLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLAorCTB4M2M0MCwgMHg3ODg4LCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDNjNDAsIDB4YTZiNSwgMHg4MDAwLAorCTB4Nzg5YiwgMHgwMDdlLCAweDdlYWUsIDB4NmViNiwgMHg2ODE0LCAweDgwMDcsIDB4NzhhYSwgMHg3ODgyLAorCTB4N2FhYSwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDNjNmMsIDB4MDAxOCwgMHgzYzZjLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwZGQsIDB4NzgxYSwgMHgxMDc4LCAweDM4ZGUsIDB4YTY4NCwgMHgwMjAwLAorCTB4MDA0MCwgMHgzYzYwLCAweDY4MmMsIDB4NzhkMiwgMHg2ODMwLCAweDc4ZDYsIDB4MTA3OCwgMHg0NWFkLAorCTB4MmQwMCwgMHg3MGEyLCAweDcwNGEsIDB4NjgxMCwgMHg3MGJlLCAweDcwMDMsIDB4MDAwNywgMHhhZDgwLAorCTB4MDAwZiwgMHg3MDM2LCAweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDFiNDUsIDB4MTA3OCwgMHgzOGRlLAorCTB4MDA3OCwgMHgyNDM4LCAweDAwMDAsIDB4MDMwMCwgMHgwMjAwLCAweDAwMDAsIDB4MTA3OCwgMHgyM2NhLAorCTB4MjMwMCwgMHgwMDc5LCAweDNjN2IsIDB4M2M3ZSwgMHgzYzdlLCAweDNjODAsIDB4MTA3OCwgMHgyM2NhLAorCTB4MTA3OCwgMHg0NWJjLCAweDY5MjQsIDB4YTE4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwYSwgMHgwMDQwLAorCTB4M2M5MiwgMHhhMTg0LCAweGZmMDAsIDB4YTA4NSwgMHgwMDBhLCAweDY4MjYsIDB4MTA3OCwgMHgxYjQ1LAorCTB4MDA3OCwgMHgzYjYwLCAweDIwMDEsIDB4MDAwYSwgMHgxMDc4LCAweDQ1NGMsIDB4MDA3OCwgMHgzYjYwLAorCTB4YTI4MiwgMHgwMDA1LCAweDAwNTAsIDB4M2M5ZSwgMHgxMDc4LCAweDIzY2EsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwNywgMHgxMGMwLCAweDM5OGEsIDB4MTA3OCwgMHgxOTFhLCAweDAwYzAsIDB4M2NiZCwgMHhhNjg0LAorCTB4MDAwNCwgMHgwMDQwLCAweDNjYWYsIDB4MjAwMSwgMHgyODAwLCAweDAwNzgsIDB4M2NiMSwgMHgyMDAxLAorCTB4MDgwMCwgMHg3MWI0LCAweGExODgsIDB4MDA5MSwgMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHgyMDMxLAorCTB4MDQwMCwgMHg3ZTVhLCAweDc5MWEsIDB4MDA3OCwgMHgyNDM4LCAweDY4MDcsIDB4MDEwNiwgMHg2ODBiLAorCTB4MDAwMCwgMHg2ODlmLCAweDAwMDAsIDB4NjgyNywgMHgwMDAwLCAweGEzODYsIDB4MDAwMiwgMHgwMGMwLAorCTB4M2NkZSwgMHhhMjg2LCAweDAwMDIsIDB4MDBjMCwgMHgzY2RlLCAweDc4YTAsIDB4YTAwNSwgMHgwMGMwLAorCTB4M2NkZSwgMHhhNDg0LCAweDgwMDAsIDB4MDBjMCwgMHgzY2RlLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgzY2RlLCAweGE2YjUsIDB4MDAwOCwgMHgyMDE5LCAweDAwMDAsIDB4MTA3OCwgMHg0MGQzLAorCTB4MmQwMCwgMHg3MGEyLCAweDcwNGEsIDB4NzAwMywgMHgwMDA3LCAweDcwMzcsIDB4MDAwMCwgMHg2ODI0LAorCTB4YTA4NCwgMHgwMDgwLCAweDAwNDAsIDB4M2NmMCwgMHgxMDc4LCAweDQxODAsIDB4MDA3OCwgMHgyNDM4LAorCTB4MjMwMCwgMHgwMDc5LCAweDNjZjMsIDB4M2NmNiwgMHgzZDc3LCAweDNkOTYsIDB4MjIwMCwgMHgwMDc5LAorCTB4M2NmOSwgMHgzY2ZlLCAweDNkMGUsIDB4M2QzNCwgMHgzZDQwLCAweDNkNjMsIDB4MjAyOSwgMHgwMDAxLAorCTB4YTAyNiwgMHgyMDExLCAweDAwMDAsIDB4MTA3OCwgMHg0MjhkLCAweDAwNzksIDB4M2QwNywgMHgzZDBjLAorCTB4MjQzOCwgMHgzYjYwLCAweDNkMGMsIDB4M2QwYywgMHgxMDc4LCAweDIzY2EsIDB4Nzk5MCwgMHhhMThjLAorCTB4MDAwNywgMHgwMGMwLCAweDNkMTUsIDB4MjAwOSwgMHgwMDA4LCAweDIwMTEsIDB4MDAwMSwgMHhhNjg0LAorCTB4MDAwNCwgMHgwMDQwLCAweDNkMWQsIDB4MjAxMSwgMHgwMDAzLCAweDIyMjAsIDB4YTEyYSwgMHgyMDExLAorCTB4MDAwMSwgMHgxMDc4LCAweDQyOGQsIDB4MDA3OSwgMHgzZDI1LCAweDNkMmEsIDB4MjQzOCwgMHgzYjYwLAorCTB4M2QzMiwgMHgzZDJjLCAweDAwNzgsIDB4NDVlYSwgMHg3MGFiLCAweDNkMzAsIDB4MDA3OCwgMHgyNDM4LAorCTB4MDA3OCwgMHgzZDJhLCAweDEwNzgsIDB4MjNjYSwgMHhhNjg0LCAweDAwMTAsIDB4MDA0MCwgMHgzZDNlLAorCTB4MTA3OCwgMHg0MTRmLCAweDAwNDAsIDB4M2QzZSwgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHg0MWJjLAorCTB4NjAwMCwgMHhhMDg0LCAweDAwMDIsIDB4MDA0MCwgMHgzZDVkLCAweDcwYjQsIDB4YTA4MCwgMHgwMGNkLAorCTB4NzgxYSwgMHgwZDdlLCAweDEwNzgsIDB4NDVjNSwgMHgyZDAwLCAweDY4MmUsIDB4NjgyNywgMHgwMDAwLAorCTB4MTA3OCwgMHgzYWMyLCAweDBkN2YsIDB4MTA3OCwgMHgxOTNkLCAweDcwMDMsIDB4MDAwMCwgMHg3MDM3LAorCTB4MDAwMCwgMHg3MDRiLCAweDAwMDAsIDB4MDA3OCwgMHgzYjYwLCAweGE2ODQsIDB4MDAwNCwgMHgwMGMwLAorCTB4M2Q2MywgMHgwMDc4LCAweDQ1ZWEsIDB4NjAwMCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgzZDc1LAorCTB4NjAwMCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgzZDc1LCAweDcwYWIsIDB4M2Q3NSwgMHgyMDAxLAorCTB4MDAwNywgMHgxMDc4LCAweDQ1NDQsIDB4MDA3OCwgMHg0NWYwLCAweDAwNzgsIDB4NDVlYSwgMHgyMjAwLAorCTB4MDA3OSwgMHgzZDdhLCAweDNkN2YsIDB4M2Q3ZiwgMHgzZDdmLCAweDNkODEsIDB4M2Q3ZiwgMHgxMDc4LAorCTB4MjNjYSwgMHg3MGE3LCAweDNkODUsIDB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAxOCwgMHgxMDc4LAorCTB4NDI4NywgMHgwMDc5LCAweDNkOGIsIDB4M2Q5MCwgMHgyNDM4LCAweDNiNjAsIDB4M2Q5MiwgMHgzZDk0LAorCTB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MjNjYSwgMHgxMDc4LCAweDIzY2EsIDB4MjIwMCwgMHgwMDc5LAorCTB4M2Q5OSwgMHgzZDllLCAweDNkYTAsIDB4M2RhMCwgMHgzZDllLCAweDNkOWUsIDB4MTA3OCwgMHgyM2NhLAorCTB4NzhlNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHgzZGI1LCAweDcwYTcsIDB4M2RhOSwgMHgwMDc4LAorCTB4NDVmNiwgMHgyMDExLCAweDAwMDQsIDB4MTA3OCwgMHg0Mjg3LCAweDAwNzksIDB4M2RhZiwgMHgzZGI1LAorCTB4MjQzOCwgMHgzYjYwLCAweDNkYjUsIDB4M2RiZiwgMHgzZGMzLCAweDcwYWIsIDB4M2RiZCwgMHgyMDAxLAorCTB4MDAwMywgMHgxMDc4LCAweDQ1NDQsIDB4MDA3OCwgMHg0NWYwLCAweDAwNzgsIDB4NDVlYSwgMHg3MGFiLAorCTB4M2RiNSwgMHgwMDc4LCAweDI0MzgsIDB4NzBhYiwgMHgzZGM3LCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LAorCTB4M2RiZCwgMHhhMjgyLCAweDAwMDMsIDB4MDA1MCwgMHgzZGNmLCAweDEwNzgsIDB4MjNjYSwgMHhhMzg2LAorCTB4MDAwMiwgMHgwMGMwLCAweDNkZTgsIDB4YTI4NiwgMHgwMDAyLCAweDAwYzAsIDB4M2RlZSwgMHg3OGEwLAorCTB4YTAwNSwgMHgwMGMwLCAweDNkZWUsIDB4YTQ4NCwgMHg4MDAwLCAweDAwYzAsIDB4M2RlZSwgMHg3OGU0LAorCTB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4M2RlOCwgMHhhNmI1LCAweDAwMDgsIDB4MjAxOSwgMHgwMDAwLAorCTB4YTY4NCwgMHgwMDA4LCAweDAwNDAsIDB4M2RlZSwgMHgxMDc4LCAweDQxMmMsIDB4NjgxMCwgMHg3MGJlLAorCTB4NzAwMywgMHgwMDA3LCAweDIzMDAsIDB4MDA3OSwgMHgzZGY1LCAweDNkZjgsIDB4M2UyNSwgMHgzZTJkLAorCTB4MjIwMCwgMHgwMDc5LCAweDNkZmIsIDB4M2UwMCwgMHgzZGZlLCAweDNlMTksIDB4MTA3OCwgMHgyM2NhLAorCTB4Nzk5MCwgMHhhMWFjLCAweDAwMDcsIDB4YTAyNiwgMHgyMDExLCAweDAwMDEsIDB4MTA3OCwgMHg0MjhkLAorCTB4MDA3OSwgMHgzZTBhLCAweDNlMGYsIDB4MjQzOCwgMHgzYjYwLCAweDNlMTcsIDB4M2UxMSwgMHgwMDc4LAorCTB4NDVlYSwgMHg3MGFiLCAweDNlMTUsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4M2UwZiwgMHgxMDc4LAorCTB4MjNjYSwgMHhhNjg0LCAweDAwMTAsIDB4MDA0MCwgMHgzZTIzLCAweDEwNzgsIDB4NDE0ZiwgMHgwMDQwLAorCTB4M2UyMywgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHg0MWJjLCAweDIyMDAsIDB4MDA3OSwgMHgzZTI4LAorCTB4M2UyYiwgMHgzZTJiLCAweDNlMmIsIDB4MTA3OCwgMHgyM2NhLCAweDIyMDAsIDB4MDA3OSwgMHgzZTMwLAorCTB4M2UzMywgMHgzZTM1LCAweDNlMzUsIDB4MTA3OCwgMHgyM2NhLCAweDc4ZTQsIDB4YTA4NCwgMHgwMDA4LAorCTB4MDA0MCwgMHgzZTRhLCAweDcwYTcsIDB4M2UzZSwgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDA0LAorCTB4MTA3OCwgMHg0Mjg3LCAweDAwNzksIDB4M2U0NCwgMHgzZTRhLCAweDI0MzgsIDB4M2I2MCwgMHgzZTRhLAorCTB4M2U1NCwgMHgzZTU4LCAweDcwYWIsIDB4M2U1MiwgMHgyMDAxLCAweDAwMDMsIDB4MTA3OCwgMHg0NTQ0LAorCTB4MDA3OCwgMHg0NWYwLCAweDAwNzgsIDB4NDVlYSwgMHg3MGFiLCAweDNlNGEsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzBhYiwgMHgzZTVjLCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDNlNTIsIDB4MjMwMCwgMHgwMDc5LAorCTB4M2U2MSwgMHgzZTY2LCAweDNlNjgsIDB4M2U2NCwgMHgxMDc4LCAweDIzY2EsIDB4NzBhNCwgMHgwMDdhLAorCTB4NzBhNCwgMHgwMDdhLCAweGEyODIsIDB4MDAwMiwgMHgwMDUwLCAweDNlNzAsIDB4MTA3OCwgMHgyM2NhLAorCTB4YTY4NCwgMHgwMjAwLCAweDAwNDAsIDB4M2U3YSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwgMHg0MjZmLAorCTB4MTA3OCwgMHg0NWJjLCAweDIzMDAsIDB4MDA3OSwgMHgzZTdkLCAweDNlODAsIDB4M2VhNCwgMHgzZjBhLAorCTB4YTI4NiwgMHgwMDAxLCAweDAwNDAsIDB4M2U4NiwgMHgxMDc4LCAweDIzY2EsIDB4YTY4NCwgMHgwMjAwLAorCTB4MDA0MCwgMHgzZThlLCAweDEwNzgsIDB4NDViNSwgMHgxMDc4LCAweDQ1YmMsIDB4MjAwMSwgMHgwMDAxLAorCTB4MTA3OCwgMHg0NTRjLCAweDc4YjgsIDB4YTA4NCwgMHhjMDAxLCAweDAwNDAsIDB4M2VhMCwgMHg3ODQ4LAorCTB4YTA4NSwgMHgwMDA4LCAweDc4NGEsIDB4Nzg0OCwgMHhhMDg0LCAweDAwMDgsIDB4MDBjMCwgMHgzZTliLAorCTB4NzAwMywgMHgwMDAwLCAweDAwNzgsIDB4M2I2MCwgMHgyMjAwLCAweDAwNzksIDB4M2VhNywgMHgzZWE5LAorCTB4M2VkYSwgMHg3MGE3LCAweDNlYWQsIDB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAwZCwgMHgxMDc4LAorCTB4NDI4NywgMHgwMDc5LCAweDNlYjMsIDB4M2ViYSwgMHgyNDM4LCAweDNiNjAsIDB4M2VjMiwgMHgzZWNhLAorCTB4M2VkMCwgMHgzZWQyLCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4MDA3OCwgMHg0NWU0LCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4MDA3OCwgMHg0NWU0LCAweDcwYWIsIDB4M2VjZSwgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHgzZWJhLAorCTB4MTA3OCwgMHgyM2NhLCAweDcwYWIsIDB4M2VkNiwgMHgwMDc4LCAweDI0MzgsIDB4MTA3OCwgMHg0NWZjLAorCTB4MDA3OCwgMHgyNDM4LCAweDcwYTcsIDB4M2VkZSwgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDEyLAorCTB4MTA3OCwgMHg0Mjg3LCAweDAwNzksIDB4M2VlNCwgMHgzZWVhLCAweDI0MzgsIDB4M2I2MCwgMHgzZWY2LAorCTB4M2VmZSwgMHgzZjA0LCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4NzBiNCwgMHhhMDgwLCAweDAwYTUsIDB4NzgxYSwgMHgwMDc4LCAweDI0MzgsIDB4YTZiNCwgMHgwMGZmLAorCTB4YTZiNSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHgwMDc4LCAweDQ1ZTQsIDB4NzBhYiwgMHgzZjAyLAorCTB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4M2VlYSwgMHg3MGFiLCAweDNmMDgsIDB4MDA3OCwgMHgyNDM4LAorCTB4MDA3OCwgMHgzZWY2LCAweGEyODYsIDB4MDAwMSwgMHgwMDQwLCAweDNmMTAsIDB4MTA3OCwgMHgyM2NhLAorCTB4NzBhNywgMHgzZjE0LCAweDAwNzgsIDB4NDVmNiwgMHgyMDExLCAweDAwMTUsIDB4MTA3OCwgMHg0Mjg3LAorCTB4MDA3OSwgMHgzZjFhLCAweDNmMWYsIDB4MjQzOCwgMHgzYjYwLCAweDNmMmQsIDB4M2YzOSwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNmI1LCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLCAweDc4M2IsIDB4MTMwMSwgMHg3MGI0LAorCTB4YTA4MCwgMHgwMGI1LCAweDc4MWEsIDB4MDA3OCwgMHgyNDM4LCAweGE2YjQsIDB4MDBmZiwgMHhhNmI1LAorCTB4MDQwMCwgMHg2ZWI2LCAweDdlNWEsIDB4NzBiNCwgMHhhMDgwLCAweDAwYTUsIDB4NzgxYSwgMHgwMDc4LAorCTB4MjQzOCwgMHg3MGFiLCAweDNmM2QsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4M2YxZiwgMHhhMjgyLAorCTB4MDAwMywgMHgwMDUwLCAweDNmNDUsIDB4MTA3OCwgMHgyM2NhLCAweDIzMDAsIDB4MDA3OSwgMHgzZjQ4LAorCTB4M2Y0YiwgMHgzZjgyLCAweDNmZGQsIDB4YTI4NiwgMHgwMDAxLCAweDAwNDAsIDB4M2Y1MSwgMHgxMDc4LAorCTB4MjNjYSwgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LCAweDAwMDYsIDB4MDBjMCwgMHgzZjVlLAorCTB4MTA3OCwgMHgzYWMyLCAweDcwMDMsIDB4MDAwMCwgMHgwMDc4LCAweDNiNjAsIDB4NjgzYiwgMHgwMDAwLAorCTB4NjgzNywgMHgwMDAwLCAweGE2ODQsIDB4MDIwMCwgMHgwMDQwLCAweDNmNmMsIDB4MTA3OCwgMHg0NWI1LAorCTB4MTA3OCwgMHg0MjZmLCAweDEwNzgsIDB4NDViYywgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0NTRjLAorCTB4NzhiOCwgMHhhMDg0LCAweGMwMDEsIDB4MDA0MCwgMHgzZjdlLCAweDc4NDgsIDB4YTA4NSwgMHgwMDA4LAorCTB4Nzg0YSwgMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDNmNzksIDB4NzAwMywgMHgwMDAwLAorCTB4MDA3OCwgMHgzYjYwLCAweDIyMDAsIDB4MDA3OSwgMHgzZjg1LCAweDNmODcsIDB4M2ZiOCwgMHg3MGE3LAorCTB4M2Y4YiwgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDBkLCAweDEwNzgsIDB4NDI4NywgMHgwMDc5LAorCTB4M2Y5MSwgMHgzZjk4LCAweDI0MzgsIDB4M2I2MCwgMHgzZmEwLCAweDNmYTgsIDB4M2ZhZSwgMHgzZmIwLAorCTB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NWU0LAorCTB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NWU0LAorCTB4NzBhYiwgMHgzZmFjLCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LCAweDNmOTgsIDB4MTA3OCwgMHgyM2NhLAorCTB4NzBhYiwgMHgzZmI0LCAweDAwNzgsIDB4MjQzOCwgMHgxMDc4LCAweDQ1ZmMsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzBhNywgMHgzZmJjLCAweDAwNzgsIDB4NDVmNiwgMHgyMDExLCAweDAwMDUsIDB4MTA3OCwgMHg0Mjg3LAorCTB4MDA3OSwgMHgzZmMyLCAweDNmYzcsIDB4MjQzOCwgMHgzYjYwLCAweDNmY2YsIDB4M2ZkNywgMHhhNmI0LAorCTB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDVlNCwgMHhhNmI0LAorCTB4MDBmZiwgMHhhNmI1LCAweDA4MDAsIDB4NmViNiwgMHg3ZTVhLCAweDAwNzgsIDB4NDVlNCwgMHg3MGFiLAorCTB4M2ZkYiwgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHgzZmM3LCAweGEyODYsIDB4MDAwMSwgMHgwMDQwLAorCTB4M2ZlMywgMHgxMDc4LCAweDIzY2EsIDB4NzBhNywgMHgzZmU3LCAweDAwNzgsIDB4NDVmNiwgMHgyMDExLAorCTB4MDAwNiwgMHgxMDc4LCAweDQyODcsIDB4MDA3OSwgMHgzZmVkLCAweDNmZjIsIDB4MjQzOCwgMHgzYjYwLAorCTB4M2ZmOCwgMHg0MDAyLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweDdlNWEsIDB4MDA3OCwgMHg0NWU0LAorCTB4YTZiNCwgMHgwMGZmLCAweGE2YjUsIDB4MDgwMCwgMHg2ZWI2LCAweGE2YjUsIDB4NDAwMCwgMHg3ZTVhLAorCTB4MDA3OCwgMHg0NWU0LCAweDcwYWIsIDB4NDAwNiwgMHgwMDc4LCAweDI0MzgsIDB4MDA3OCwgMHgzZmYyLAorCTB4MjMwMCwgMHgwMDc5LCAweDQwMGIsIDB4NDAxMCwgMHg0MDBlLCAweDQwMGUsIDB4MTA3OCwgMHgyM2NhLAorCTB4MTA3OCwgMHgyM2NhLCAweDIzMDAsIDB4NzFhOCwgMHhhMDA1LCAweDAxN2EsIDB4NjgxMCwgMHg3MGJlLAorCTB4YTI4MiwgMHgwMDAzLCAweDAwNTAsIDB4NDAxZSwgMHgxMDc4LCAweDIzY2EsIDB4MjMwMCwgMHgwMDc5LAorCTB4NDAyMSwgMHg0MDI0LCAweDQwMzcsIDB4NDA1OSwgMHg4MmZmLCAweDAwYzAsIDB4NDAyOSwgMHgxMDc4LAorCTB4MjNjYSwgMHhhNjg0LCAweDAyMDAsIDB4MDA0MCwgMHg0MDMxLCAweDEwNzgsIDB4NDViNSwgMHgxMDc4LAorCTB4NDViYywgMHgyMDAxLCAweDAwMDEsIDB4MTA3OCwgMHg0NTRjLCAweDAwNzgsIDB4MjQzOCwgMHhhMjk2LAorCTB4MDAwMiwgMHgwMDQwLCAweDQwNDAsIDB4ODJmZiwgMHgwMDQwLCAweDQwNDAsIDB4MTA3OCwgMHgyM2NhLAorCTB4NzBhNywgMHg0MDQ0LCAweDAwNzgsIDB4NDVmNiwgMHgyMDExLCAweDAwMTgsIDB4MTA3OCwgMHg0Mjg3LAorCTB4MDA3OSwgMHg0MDRhLCAweDQwNGYsIDB4MjQzOCwgMHgzYjYwLCAweDQwNTEsIDB4NDA1MywgMHgwMDc4LAorCTB4NDVlNCwgMHgwMDc4LCAweDQ1ZTQsIDB4NzBhYiwgMHg0MDU3LCAweDAwNzgsIDB4MjQzOCwgMHgwMDc4LAorCTB4NDA0ZiwgMHgyMjAwLCAweDAwNzksIDB4NDA1YywgMHg0MDVlLCAweDQwNzcsIDB4NzBhNywgMHg0MDYyLAorCTB4MDA3OCwgMHg0NWY2LCAweDIwMTEsIDB4MDAxNywgMHgxMDc4LCAweDQyODcsIDB4MDA3OSwgMHg0MDY4LAorCTB4NDA2ZCwgMHgyNDM4LCAweDNiNjAsIDB4NDA2ZiwgMHg0MDcxLCAweDAwNzgsIDB4NDVlNCwgMHgwMDc4LAorCTB4NDVlNCwgMHg3MGFiLCAweDQwNzUsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4NDA2ZCwgMHhhNDg0LAorCTB4ODAwMCwgMHgwMGMwLCAweDQwYzEsIDB4YTY4NCwgMHgwMTAwLCAweDAwNDAsIDB4NDA4YiwgMHgxMDc4LAorCTB4NDViNSwgMHgxMDc4LCAweDQyNmYsIDB4MTA3OCwgMHg0NWJjLCAweDc4NDgsIDB4YTA4NSwgMHgwMDBjLAorCTB4Nzg0YSwgMHgwMDc4LCAweDQwOGYsIDB4NzhkOCwgMHg3OGQyLCAweDc4ZGMsIDB4NzhkNiwgMHhhNmI0LAorCTB4ZWZmZiwgMHg3ZTVhLCAweDcwYTcsIDB4NDA5NiwgMHgwMDc4LCAweDQ1ZjYsIDB4MjAxMSwgMHgwMDBkLAorCTB4MTA3OCwgMHg0Mjg3LCAweDAwNzksIDB4NDA5YywgMHg0MGEzLCAweDI0MzgsIDB4M2I2MCwgMHg0MGEzLAorCTB4NDBiMSwgMHg0MGI3LCAweDQwYjksIDB4YTY4NCwgMHgwMTAwLCAweDAwNDAsIDB4NDBhZiwgMHgxMDc4LAorCTB4NDU3MywgMHg2ODJjLCAweDc4ZDIsIDB4NjgzMCwgMHg3OGQ2LCAweDEwNzgsIDB4NDVhZCwgMHgwMDc4LAorCTB4NDVlNCwgMHg3MGFiLCAweDQwYjUsIDB4MDA3OCwgMHgyNDM4LCAweDAwNzgsIDB4NDBhMywgMHgxMDc4LAorCTB4MjNjYSwgMHg3MGFiLCAweDQwYmQsIDB4MDA3OCwgMHgyNDM4LCAweDEwNzgsIDB4NDVmYywgMHgwMDc4LAorCTB4MjQzOCwgMHgxMDc4LCAweDQ1YmMsIDB4NzBhYiwgMHg0MGNiLCAweDIwMDEsIDB4MDAwMywgMHgxMDc4LAorCTB4NDU0NCwgMHgwMDc4LCAweDQ1ZjAsIDB4MTA3OCwgMHg0NWFkLCAweDY4MmMsIDB4NzhkMiwgMHg2ODMwLAorCTB4NzhkNiwgMHgwMDc4LCAweDQ1ZTQsIDB4NzBiOCwgMHg2ODEyLCAweDcwYmUsIDB4ODAwMCwgMHg3MGJhLAorCTB4NjgxYiwgMHgwMDAwLCAweGE2ODQsIDB4MDAwOCwgMHgwMDQwLCAweDQwZjYsIDB4MTU3ZSwgMHgxMzdlLAorCTB4MTQ3ZSwgMHg3ODkwLCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweDgwMDQsIDB4YTA4NCwgMHgwMDBmLAorCTB4NjgxYSwgMHg4MGFjLCAweDc4OWIsIDB4MDAwMCwgMHhhZjgwLCAweDAwMmIsIDB4MjA5OCwgMHhhZDgwLAorCTB4MDAwYiwgMHgyMGEwLCAweDUzYTUsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4YTZjNCwgMHgwZjAwLAorCTB4YTY4NCwgMHgwMDAyLCAweDAwYzAsIDB4NDEwMiwgMHg2OTJjLCAweDgxMGQsIDB4ODEwZCwgMHg4MTBkLAorCTB4MDA3OCwgMHg0MTBmLCAweDc4OWIsIDB4MDAxMCwgMHg3OWFjLCAweDAwNzgsIDB4NDEwZiwgMHgwMTdlLAorCTB4MjAwOSwgMHgwMDA1LCAweDIwMDEsIDB4M2QwMCwgMHgxMDc4LCAweDQ1N2UsIDB4MDE3ZiwgMHhhMTg0LAorCTB4MDAxZiwgMHhhODA1LCAweDY4MTYsIDB4MTA3OCwgMHgzYjMzLCAweDY4YmUsIDB4YTY4NCwgMHgwMDA0LAorCTB4MDA0MCwgMHg0MTIwLCAweGExOGMsIDB4ZmYwMCwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMTA1LAorCTB4NjgyYSwgMHhhNmI0LCAweDAwZmYsIDB4NjAwMCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0MTJhLAorCTB4YTZiNSwgMHg0MDAwLCAweDZlYjYsIDB4MDA3YywgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHg2OTE4LAorCTB4Nzg5MCwgMHg4MDA0LCAweDgwMDQsIDB4ODAwNCwgMHg4MDA0LCAweGEwODQsIDB4MDAwZiwgMHgwMDdlLAorCTB4YTEwMCwgMHg2ODFhLCAweDAwN2YsIDB4ODAwMCwgMHg4MDA0LCAweDAwNDAsIDB4NDE0YiwgMHgyMGE4LAorCTB4ODEwNCwgMHhhMDgwLCAweDAwMGIsIDB4YWQwMCwgMHgyMGEwLCAweDc4OWIsIDB4MDAwMCwgMHhhZjgwLAorCTB4MDAyYiwgMHgyMDk4LCAweDUzYTUsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4MDA3YywgMHg2ODJjLAorCTB4YTA4NCwgMHgwMDIwLCAweDAwYzAsIDB4NDE1NywgMHg2MjBjLCAweDAwNzgsIDB4NDE1OCwgMHg2MjEwLAorCTB4NmIxOCwgMHgyMzAwLCAweGEyMDIsIDB4MDA0MCwgMHg0MTc4LCAweDIwMTgsIDB4YTM4MiwgMHgwMDBlLAorCTB4MDA0OCwgMHg0MTY4LCAweDAwNDAsIDB4NDE2OCwgMHgyMDE5LCAweDAwMGUsIDB4MDA3OCwgMHg0MTZjLAorCTB4Nzg1OCwgMHhhMDg0LCAweGZmZWYsIDB4Nzg1YSwgMHg3ODNiLCAweDFiMDEsIDB4Nzg5MywgMHgwMDAwLAorCTB4N2JhMiwgMHg3MGI0LCAweGEwODAsIDB4MDA4ZSwgMHg3ODFhLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLAorCTB4Nzg1OCwgMHhhMDg0LCAweGZmZWYsIDB4Nzg1YSwgMHg3ODkzLCAweDAwMDAsIDB4YTAwNiwgMHgwMDdjLAorCTB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE5NiwgMHgwMDA3LCAweDAwNDAsIDB4NDE4ZCwgMHhhMTk2LAorCTB4MDAwZiwgMHgwMDQwLCAweDQxOGQsIDB4NjgwNywgMHgwMTE3LCAweDY5MTQsIDB4MTA3OCwgMHgzYjMzLAorCTB4NjEwMCwgMHg4MTA0LCAweDAwYzgsIDB4NDFhOCwgMHg2MDFjLCAweGEwMDUsIDB4MDA0MCwgMHg0MTljLAorCTB4MjAwMSwgMHgwODAwLCAweDAwNzgsIDB4NDFhYSwgMHgwZDdlLCAweDY4MjQsIDB4MDA3ZSwgMHgxMDc4LAorCTB4NDVjNSwgMHgwMDdmLCAweDY4MjYsIDB4MmQwMCwgMHg2ODJlLCAweDEwNzgsIDB4M2FjMiwgMHgwZDdmLAorCTB4MjAwMSwgMHgwMjAwLCAweDY4MjYsIDB4ODAwNywgMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHg2ODIwLAorCTB4YTA4NSwgMHg4MDAwLCAweDY4MjIsIDB4MjAzMSwgMHgwNDAwLCAweDZlYjYsIDB4N2U1YSwgMHg3MWI0LAorCTB4YTE4OCwgMHgwMDkxLCAweDc5MWEsIDB4MDA3YywgMHhhNmM0LCAweDBmMDAsIDB4YTY4NCwgMHgwMDAyLAorCTB4MDBjMCwgMHg0MWNmLCAweDY5MmMsIDB4ODEwZCwgMHg4MTBkLCAweDgxMGQsIDB4YTE4NCwgMHgwMDFmLAorCTB4YTgwNSwgMHg2ODE2LCAweDEwNzgsIDB4M2IzMywgMHg2OGJlLCAweDAwNzgsIDB4NDFkMiwgMHg2OTE0LAorCTB4MTA3OCwgMHgzYjMzLCAweDYxMDAsIDB4ODEwNCwgMHgwMGM4LCAweDQyMWMsIDB4YTE4NCwgMHgwMzAwLAorCTB4MDA0MCwgMHg0MWRlLCAweDY4MDcsIDB4MDExNywgMHgwMDc4LCAweDQxZmMsIDB4NjAwNCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0MjA1LCAweDY4MDcsIDB4MDExNywgMHg2MDFjLCAweGEwMDUsIDB4MDBjMCwgMHg0MWYyLAorCTB4MGQ3ZSwgMHgxMDc4LCAweDQ1YzUsIDB4NjgyNywgMHgwMDM0LCAweDJkMDAsIDB4NjgyZSwgMHgxMDc4LAorCTB4M2FjMiwgMHgwZDdmLCAweGE2ODQsIDB4MDAwNCwgMHgwMDQwLCAweDQxZmMsIDB4MjAzMSwgMHgwNDAwLAorCTB4MjAwMSwgMHgyODAwLCAweDAwNzgsIDB4NDIwMCwgMHgyMDMxLCAweDA0MDAsIDB4MjAwMSwgMHgwODAwLAorCTB4NzFiNCwgMHhhMTg4LCAweDAwOTEsIDB4MDA3OCwgMHg0MjRhLCAweDYwMTgsIDB4YTAwNSwgMHgwMGMwLAorCTB4NDFmMiwgMHg2MDFjLCAweGEwMDUsIDB4MDBjMCwgMHg0MWYyLCAweDY4OWYsIDB4MDAwMCwgMHg2ODI3LAorCTB4MDAzZCwgMHhhNjg0LCAweDAwMDEsIDB4MDA0MCwgMHg0MjU4LCAweGE2YjUsIDB4MDgwMCwgMHg3MWI0LAorCTB4YTE4OCwgMHgwMGFlLCAweDAwNzgsIDB4NDI1MywgMHg2ODA3LCAweDAxMTcsIDB4MjAzMSwgMHgwNDAwLAorCTB4NjkyYywgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDEyLCAweDAwYzAsIDB4NDIyZCwgMHgyMDAxLAorCTB4NDI2NSwgMHgyMDA5LCAweDAwMDEsIDB4MDA3OCwgMHg0MjNlLCAweGExODYsIDB4MDAwMywgMHgwMGMwLAorCTB4NDIzNywgMHgyMDAxLCAweDQyNjYsIDB4MjAwOSwgMHgwMDEyLCAweDAwNzgsIDB4NDIzZSwgMHgyMDAxLAorCTB4MDIwMCwgMHg3MWI0LCAweGExODgsIDB4MDA5MSwgMHgwMDc4LCAweDQyNGEsIDB4MTA3OCwgMHg0NTk4LAorCTB4NzhhMywgMHgwMDAwLCAweDY4MWMsIDB4YTA4NSwgMHgwMDQwLCAweDY4MWUsIDB4NzFiNCwgMHhhMTg4LAorCTB4MDBkYSwgMHhhMDA2LCAweDY4MjYsIDB4ODAwNywgMHg3ODliLCAweDAwMGUsIDB4NzhhYSwgMHg2ODIwLAorCTB4YTA4NSwgMHg4MDAwLCAweDY4MjIsIDB4NmViNiwgMHg3ZTVhLCAweDc5MWEsIDB4MDA3OCwgMHgyNDM4LAorCTB4NmViNiwgMHgxMDc4LCAweDNhYzIsIDB4NjgxMCwgMHg3MGJlLCAweDcwMDMsIDB4MDAwNywgMHg3MGEzLAorCTB4MDAwMCwgMHg3MDRiLCAweDAwMDAsIDB4MDA3OCwgMHgyNDM4LCAweDAwMjMsIDB4MDA3MCwgMHgwMDA1LAorCTB4MDAwMCwgMHgwYTAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDI1LCAweDAwMDAsIDB4MDAwMCwgMHg2ODNiLAorCTB4MDAwMCwgMHg2ODM3LCAweDAwMDAsIDB4YTY4NCwgMHgwMjAwLCAweDAwNDAsIDB4NDI4NiwgMHg3OGI4LAorCTB4YTA4YywgMHgwMDFmLCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDQyN2YsIDB4ODEwOCwgMHg3OGQ4LAorCTB4YTEwMCwgMHg2ODM2LCAweDc4ZGMsIDB4YTA4MSwgMHgwMDAwLCAweDY4M2EsIDB4MDA3YywgMHg3OTkwLAorCTB4ODEwZiwgMHhhNWFjLCAweDAwMDcsIDB4MjAyMSwgMHgwMDAwLCAweGE0ODAsIDB4MDAxMCwgMHg3ODlhLAorCTB4NzlhOCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NCwgMHgwMDgwLCAweDAwYzAsIDB4NDJiNSwgMHhhMTgyLAorCTB4MDAyMCwgMHgwMGM4LCAweDQyY2YsIDB4YTE4MiwgMHgwMDEyLCAweDAwYzgsIDB4NDUzNiwgMHgyMTAwLAorCTB4MTA3OSwgMHg0MmEzLCAweDAwN2MsIDB4NDUzNiwgMHg0NDdlLCAweDQ1MzYsIDB4NDUzNiwgMHg0MmRjLAorCTB4NDJkZiwgMHg0MzE5LCAweDQzNGYsIDB4NDM4MSwgMHg0Mzg0LCAweDQ1MzYsIDB4NDUzNiwgMHg0MzNhLAorCTB4NDNhOCwgMHg0M2UyLCAweDQ1MzYsIDB4NDUzNiwgMHg0NDA5LCAweGExOGMsIDB4MDAxZiwgMHg2ODE0LAorCTB4YTA4NCwgMHgwMDFmLCAweGExMDYsIDB4MDA0MCwgMHg0MmNjLCAweDcwYjQsIDB4YTA4MCwgMHgwMGNkLAorCTB4NzgxYSwgMHgyMDAxLCAweDAwMTQsIDB4MTA3OCwgMHg0NTRjLCAweDEwNzgsIDB4NDViYywgMHg3MDAzLAorCTB4MDAwMCwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHhhMTgyLAorCTB4MDAyNCwgMHgwMGM4LCAweDQ1MzYsIDB4YTE4NCwgMHgwMDAzLCAweDEwNzksIDB4NDJhMywgMHgwMDdjLAorCTB4NDUzNiwgMHg0NTM2LCAweDQ1MzYsIDB4NDUzNiwgMHgxMDc4LCAweDQ1MzYsIDB4MDA3YywgMHgyMjAwLAorCTB4MDA3OSwgMHg0MmUyLCAweDQ0MGMsIDB4NDQwYywgMHg0MzA2LCAweDQzMDYsIDB4NDMwNiwgMHg0MzA2LAorCTB4NDMwNiwgMHg0MzA2LCAweDQzMDYsIDB4NDMwNiwgMHg0MzA0LCAweDQzMDYsIDB4NDJmYiwgMHg0MzA2LAorCTB4NDMwNiwgMHg0MzA2LCAweDQzMDYsIDB4NDMwNiwgMHg0MzBlLCAweDQzMTEsIDB4NDQwYywgMHg0MzExLAorCTB4NDMwNiwgMHg0MzA2LCAweDQzMDYsIDB4MGM3ZSwgMHgwNzdlLCAweDZmMTQsIDB4MTA3OCwgMHgzNmIwLAorCTB4MDc3ZiwgMHgwYzdmLCAweDAwNzgsIDB4NDMwNiwgMHgxMDc4LCAweDQ0ZDEsIDB4NjgyNywgMHgwMmIzLAorCTB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDgwMCwgMHgwMDc4LCAweDQ0NDAsIDB4MTA3OCwgMHg0NTJiLAorCTB4MDA3YywgMHg2ODI3LCAweDAwOTMsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDgwMCwgMHgwMDc4LAorCTB4NDQyOCwgMHgyZDU4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLAorCTB4NDMyMywgMHg2ODA3LCAweDAxMTcsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4NDVjNSwgMHg2ODI3LAorCTB4MDAzNiwgMHg2OTMyLCAweDJkMDAsIDB4NjgyZSwgMHgwZDdlLCAweDEwNzgsIDB4M2E5MiwgMHgxMDc4LAorCTB4NDQ2NiwgMHgyYjY4LCAweDEwNzgsIDB4M2FjMiwgMHgwZDdmLCAweDEwNzgsIDB4M2FjMiwgMHgyMDAxLAorCTB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4NDQ2NiwgMHgyMDAxLCAweDAwMTcsIDB4MTA3OCwgMHg0NTRjLAorCTB4NzBhMywgMHgwMDAwLCAweDIwMDksIDB4NTAzOCwgMHgyMDBiLCAweDAwMDYsIDB4NzBhZiwgMHgwMDE3LAorCTB4MjAwOSwgMHgwMjAwLCAweDEwNzgsIDB4MzlkMiwgMHgyMDAxLCAweDAwMDEsIDB4MDA3YywgMHgyMjAwLAorCTB4MDA3OSwgMHg0MzUyLCAweDQ0MGMsIDB4NDQzZCwgMHg0NDNkLCAweDQ0M2QsIDB4NDM3MywgMHg0NDRkLAorCTB4NDM3OSwgMHg0NDRkLCAweDQ0NGQsIDB4NDQ1MCwgMHg0NDUwLCAweDQ0NTUsIDB4NDQ1NSwgMHg0MzZiLAorCTB4NDM2YiwgMHg0NDNkLCAweDQ0M2QsIDB4NDQ0ZCwgMHg0NDNkLCAweDQzNzksIDB4NDQwYywgMHg0Mzc5LAorCTB4NDM3OSwgMHg0Mzc5LCAweDQzNzksIDB4NjgyNywgMHgwMDg0LCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLAorCTB4NDMwMCwgMHgwMDc4LCAweDQ0NWYsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDMwMCwgMHgwMDc4LAorCTB4NDQ0MCwgMHg2ODI3LCAweDAwOTMsIDB4MjAwOSwgMHgwMDBiLCAweDIwMDEsIDB4NDMwMCwgMHgwMDc4LAorCTB4NDQyOCwgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHgyMjAwLCAweDAwNzksIDB4NDM4NywgMHg0NDBjLAorCTB4NDNhMCwgMHg0M2EwLCAweDQzYTAsIDB4NDNhMCwgMHg0NDRkLCAweDQ0NGQsIDB4NDQ0ZCwgMHg0NDRkLAorCTB4NDQ0ZCwgMHg0NDRkLCAweDQ0NGQsIDB4NDQ0ZCwgMHg0M2EwLCAweDQzYTAsIDB4NDNhMCwgMHg0M2EwLAorCTB4NDQ0ZCwgMHg0M2EwLCAweDQzYTAsIDB4NDQ0ZCwgMHg0NDRkLCAweDQ0NGQsIDB4NDQ0ZCwgMHg0NDBjLAorCTB4NjgyNywgMHgwMDkzLCAweDIwMDksIDB4MDAwYiwgMHgyMDAxLCAweDQzMDAsIDB4MDA3OCwgMHg0NDI4LAorCTB4YTY4NCwgMHgwMDA0LCAweDAwYzAsIDB4NDNiYywgMHg2ODA0LCAweGEwODQsIDB4MDBmZiwgMHhhMDg2LAorCTB4MDAwNiwgMHgwMGMwLCAweDQ1MzYsIDB4MTA3OCwgMHg0NDY2LCAweDY4MDcsIDB4MDExNywgMHgxMDc4LAorCTB4M2FjMiwgMHgyMDAxLCAweDAwMDIsIDB4MDA3YywgMHg2MDAwLCAweGEwODQsIDB4MDAwNCwgMHgwMDQwLAorCTB4NDUzNiwgMHgyZDU4LCAweDY4MDQsIDB4YTA4NCwgMHgwMGZmLCAweGEwODYsIDB4MDAwNiwgMHgwMGMwLAorCTB4NDNjYiwgMHg2ODA3LCAweDAxMTcsIDB4NjgyNywgMHgwMDAyLCAweDEwNzgsIDB4NDVjNSwgMHg2ODI3LAorCTB4MDAzNiwgMHg2OTMyLCAweDJkMDAsIDB4NjgyZSwgMHgwZDdlLCAweDEwNzgsIDB4M2FhMSwgMHgxMDc4LAorCTB4NDQ2NiwgMHgyYjY4LCAweDEwNzgsIDB4M2FjMiwgMHgwZDdmLCAweDEwNzgsIDB4M2FjMiwgMHgyMDAxLAorCTB4MDAwMiwgMHgwMDdjLCAweDYwMDAsIDB4YTA4NCwgMHgwMDA0LCAweDAwNDAsIDB4NDUzNiwgMHgyZDU4LAorCTB4NmEwNCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDA2LCAweDAwYzAsIDB4NDNmMSwgMHg2ODA3LAorCTB4MDExNywgMHg2ODI3LCAweDAwMDIsIDB4MmQ1OCwgMHgxMDc4LCAweDQ1YzUsIDB4NjgyNywgMHgwMDM2LAorCTB4NjkzMiwgMHgyZDAwLCAweDY4MmUsIDB4MGQ3ZSwgMHgxMDc4LCAweDNhYjEsIDB4MTA3OCwgMHg0NDY2LAorCTB4MmI2OCwgMHgxMDc4LCAweDNhYzIsIDB4MGQ3ZiwgMHgxMDc4LCAweDNhYzIsIDB4MjAwMSwgMHgwMDAyLAorCTB4MDA3YywgMHgxMDc4LCAweDQ1MzYsIDB4MDA3YywgMHg3MGI0LCAweGEwODAsIDB4MDBjZCwgMHg3ODFhLAorCTB4MjAwMSwgMHgwMDAxLCAweDEwNzgsIDB4NDU0YywgMHgxMDc4LCAweDQ1YmMsIDB4NzAwMywgMHgwMDAwLAorCTB4MjAwMSwgMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHg0NTdlLCAweDEwNzgsIDB4NDViNSwgMHgxMDc4LAorCTB4NDI2ZiwgMHgxMDc4LCAweDQxODAsIDB4MTA3OCwgMHg0NWJjLCAweDIwMDEsIDB4MDAwMSwgMHgwMDdjLAorCTB4MTA3OCwgMHg0NTdlLCAweDEwNzgsIDB4NDViNSwgMHgxMDc4LCAweDQyNmYsIDB4NzBiNCwgMHhhMDgwLAorCTB4MDBjZCwgMHg3ODFhLCAweDIwMDEsIDB4MDAxMywgMHgxMDc4LCAweDQ1NGMsIDB4MTA3OCwgMHg0NWJjLAorCTB4NzAwMywgMHgwMDAwLCAweDIwMDEsIDB4MDAwMiwgMHgwMDdjLCAweDEwNzgsIDB4NDUzNiwgMHgwMDdjLAorCTB4MTA3OCwgMHg0NTdlLCAweDEwNzgsIDB4NDViNSwgMHgxMDc4LCAweDQyNmYsIDB4MTA3OCwgMHg0MTgwLAorCTB4MTA3OCwgMHg0NWJjLCAweDIwMDEsIDB4MDAwMSwgMHgwMDdjLCAweDIwMDEsIDB4MDAwMywgMHgwMDdjLAorCTB4MTA3OCwgMHg0NGQxLCAweDIwMDEsIDB4MDAwMCwgMHgwMDdjLCAweDBjN2UsIDB4MDc3ZSwgMHg2ZjE0LAorCTB4MTA3OCwgMHgzNmIwLCAweDA3N2YsIDB4MGM3ZiwgMHgyMDAxLCAweDAwMDAsIDB4MDA3YywgMHgxMDc4LAorCTB4NDU3ZSwgMHgxMDc4LCAweDQ1MzYsIDB4MjAwMSwgMHgwMDA2LCAweDAwN2MsIDB4NjkwNCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTg2LCAweDAwMDcsIDB4MDA0MCwgMHg0NDcxLCAweGExODYsIDB4MDAwZiwgMHgwMGMwLAorCTB4NDQ3NSwgMHgxMDc4LCAweDQ1YjUsIDB4MTA3OCwgMHg0MjZmLCAweDcwYjQsIDB4YTA4MCwgMHgwMGNkLAorCTB4NzgxYSwgMHgxMDc4LCAweDQ1YmMsIDB4NzAwMywgMHgwMDAwLCAweDAwN2MsIDB4N2FhOCwgMHhhMjk0LAorCTB4MDBmZiwgMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDhhLCAweDAwMDQsIDB4MDBjOCwgMHg0NTM2LAorCTB4MTA3OSwgMHg0NDhiLCAweDAwN2MsIDB4NDUzNiwgMHg0NDhmLCAweDQ1MzYsIDB4NDRkZiwgMHhhMjgyLAorCTB4MDAwMywgMHgwMDQwLCAweDQ0OTYsIDB4MTA3OCwgMHg0NTM2LCAweDAwN2MsIDB4N2RhOCwgMHhhNWFjLAorCTB4MDBmZiwgMHg3Y2E4LCAweGE0YTQsIDB4MDBmZiwgMHhhNDgyLCAweDAwMGMsIDB4MDA0OCwgMHg0NGE0LAorCTB4MDA0MCwgMHg0NGE0LCAweDIwMjEsIDB4MDAwYywgMHg3MDFjLCAweGE1MDIsIDB4MDBjOCwgMHg0NGE5LAorCTB4NzUxYywgMHgxMDc4LCAweDQ1MWMsIDB4ODUyYiwgMHg4NTJiLCAweDEwNzgsIDB4MzcyZSwgMHgwMDQwLAorCTB4NDRiNSwgMHgxMDc4LCAweDQ0YzMsIDB4MDA3OCwgMHg0NGI5LCAweDEwNzgsIDB4NDUxOCwgMHgxMDc4LAorCTB4NDRkMSwgMHhhNmI1LCAweDEwMDAsIDB4N2U1YSwgMHg3MGI0LCAweGEwODAsIDB4MDBiOSwgMHg3ODFhLAorCTB4MjAwMSwgMHgwMDA0LCAweDAwN2MsIDB4MGM3ZSwgMHg2OTE0LCAweDgxMGYsIDB4YTE4YywgMHgwMDBmLAorCTB4ODEwYiwgMHg4MTBiLCAweDgxMGIsIDB4YTFlMCwgMHg1MjgwLCAweDEwNzgsIDB4MzUzOCwgMHgwYzdmLAorCTB4MDA3YywgMHgwYzdlLCAweDY4MTQsIDB4ODAwNywgMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLAorCTB4ODAwMywgMHhhMGUwLCAweDUyODAsIDB4MTA3OCwgMHgzNTVmLCAweDBjN2YsIDB4MDA3YywgMHhhMjgyLAorCTB4MDAwMiwgMHgwMGMwLCAweDQ1MzYsIDB4N2FhOCwgMHhhMjk0LCAweDAwZmYsIDB4YTI4NCwgMHhmZmZlLAorCTB4MDA0MCwgMHg0NGVjLCAweDIwMTEsIDB4MDAwMSwgMHgxMDc4LCAweDQ1MGEsIDB4MTA3OCwgMHg0NGZjLAorCTB4MTA3OCwgMHg0NGQxLCAweGE2YjUsIDB4MTAwMCwgMHg3ZTVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMGI5LAorCTB4NzgxYSwgMHgyMDAxLCAweDAwMDQsIDB4MDA3YywgMHgwYzdlLCAweDY4MTQsIDB4ODAwNywgMHhhMDg0LAorCTB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGUwLCAweDUyODAsIDB4MTA3OCwgMHgzNjA0LAorCTB4MGM3ZiwgMHgwMDdjLCAweDc4OWIsIDB4MDAxOCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAyLAorCTB4NzhhYiwgMHgwMDAzLCAweDdhYWEsIDB4Nzg5YiwgMHgwMDgxLCAweDc4YWIsIDB4MDAwNCwgMHgwMDdjLAorCTB4MjAyMSwgMHgwMDAwLCAweDIwMjksIDB4MDAzMiwgMHg3ODliLCAweDAwMTgsIDB4NzhhYiwgMHgwMDAxLAorCTB4NzhhYiwgMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3ZGFhLCAweDdjYWEsIDB4Nzg5YiwgMHgwMDgxLAorCTB4NzhhYiwgMHgwMDA1LCAweDAwN2MsIDB4MjAwMSwgMHgwMDAzLCAweDEwNzgsIDB4NDU0NCwgMHg3MGI0LAorCTB4YTA4MCwgMHgwMGI5LCAweDc4MWEsIDB4MjAwMSwgMHgwMDA1LCAweDAwN2MsIDB4MjAwMSwgMHgwMDA3LAorCTB4MTA3OCwgMHg0NTQ0LCAweGE2YjUsIDB4MTAwMCwgMHg3ZTVhLCAweDcwYjQsIDB4YTA4MCwgMHgwMGI5LAorCTB4NzgxYSwgMHgyMDAxLCAweDAwMDQsIDB4MDA3YywgMHg3ODliLCAweDAwMTgsIDB4NzhhYSwgMHg3ODliLAorCTB4MDA4MSwgMHg3OGFiLCAweDAwMDEsIDB4MDA3YywgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LAorCTB4MDAwNywgMHgwMDQwLCAweDQ1NWEsIDB4YTE5NiwgMHgwMDBmLCAweDAwNDAsIDB4NDU1YSwgMHgxMDc4LAorCTB4MTkzZCwgMHgwMDdjLCAweDY5MjQsIDB4YTE5NCwgMHgwMDNmLCAweDAwYzAsIDB4NDU2MywgMHhhMThjLAorCTB4ZmZjMCwgMHhhMTA1LCAweDY4MjYsIDB4MTA3OCwgMHgzYWMyLCAweDY5MWMsIDB4YTE4NCwgMHgwMTAwLAorCTB4MDA0MCwgMHg0NTcyLCAweDEwNzgsIDB4MWI3ZSwgMHg2OTE0LCAweDEwNzgsIDB4M2IzMywgMHg2MjA0LAorCTB4ODIxMCwgMHg2MjA2LCAweDAwN2MsIDB4NjkyYywgMHg2ODM0LCAweDY4MmUsIDB4YTExMiwgMHg2OTMwLAorCTB4NjgzOCwgMHg2ODMyLCAweGExMWIsIDB4YTIwMCwgMHhhMzAxLCAweDAwN2MsIDB4MGM3ZSwgMHhhZGUwLAorCTB4MDAxOCwgMHg2MDAzLCAweDAwNzAsIDB4NjEwNiwgMHg2MDBiLCAweDAwMDAsIDB4NjAwZiwgMHgwYTAwLAorCTB4NjAxMywgMHgwMDAwLCAweDYwMTcsIDB4MDAwMCwgMHg4MDA3LCAweDYwMWEsIDB4NjAxZiwgMHgwMDAwLAorCTB4NjAyMywgMHgwMDAwLCAweDBjN2YsIDB4NjgyNCwgMHhhMDg1LCAweDAwODAsIDB4NjgyNiwgMHgwMDdjLAorCTB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsIDB4MjA5OCwgMHhhZjgwLCAweDAwMmQsIDB4MjBhMCwgMHg4MWFjLAorCTB4MDA0MCwgMHg0NWEzLCAweDUzYTYsIDB4YTE4NCwgMHgwMDAxLCAweDAwNDAsIDB4NDVhOSwgMHgzMzA0LAorCTB4NzhiZSwgMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDcwYjAsIDB4YTAwNSwgMHgxMGMwLAorCTB4MjNjYSwgMHg3MGIzLCAweDgwMDAsIDB4MDA3OCwgMHg0OGY3LCAweDcxYjAsIDB4ODFmZiwgMHgwMDQwLAorCTB4NDViYiwgMHgxMDc4LCAweDQ5ZWQsIDB4MDA3YywgMHg3MWIwLCAweDgxZmYsIDB4MDA0MCwgMHg0NWM0LAorCTB4NzBiMywgMHgwMDAwLCAweDEwNzgsIDB4NDYzMywgMHgwMDdjLCAweDBjN2UsIDB4MGQ3ZSwgMHgxMDc4LAorCTB4MTkxYSwgMHgwYzdmLCAweDE1N2UsIDB4MTM3ZSwgMHgxNDdlLCAweDJkYTAsIDB4MmM5OCwgMHgyMGE5LAorCTB4MDAzMSwgMHg1M2EzLCAweDE0N2YsIDB4MTM3ZiwgMHgxNTdmLCAweDY4MDcsIDB4MDEwZCwgMHg2ODBiLAorCTB4MDAwMCwgMHg3MDA0LCAweDgwMDcsIDB4NjgxYSwgMHg2ODIzLCAweDAwMDAsIDB4NjgxZiwgMHgwMDAwLAorCTB4Njg5ZiwgMHgwMDAwLCAweDBjN2YsIDB4MDA3YywgMHg3MGI0LCAweGEwODAsIDB4MDA5MSwgMHg3ODFhLAorCTB4MDA3OCwgMHgyNDM4LCAweDcwYjQsIDB4YTA4MCwgMHgwMDgxLCAweDc4MWEsIDB4MDA3OCwgMHgyNDM4LAorCTB4NzBiNCwgMHhhMDgwLCAweDAwYjksIDB4NzgxYSwgMHgwMDc4LCAweDI0MzgsIDB4NzBiNCwgMHhhMDgwLAorCTB4MDBjMywgMHg3ODFhLCAweDAwNzgsIDB4MjQzOCwgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTk2LAorCTB4MDAwNywgMHgwMDQwLCAweDQ2MDksIDB4YTE5NiwgMHgwMDBmLCAweDAwNDAsIDB4NDYwOSwgMHg2ODA3LAorCTB4MDExNywgMHgyMDAxLCAweDAyMDAsIDB4NjgyNiwgMHg4MDA3LCAweDc4OWIsIDB4MDAwZSwgMHg3OGFhLAorCTB4NjgyMCwgMHhhMDg1LCAweDgwMDAsIDB4NjgyMiwgMHgyMDMxLCAweDA0MDAsIDB4NmViNiwgMHg3ZTVhLAorCTB4NzFiNCwgMHhhMTg4LCAweDAwOTEsIDB4NzkxYSwgMHgwMDdjLCAweDEwNzgsIDB4NDViYywgMHg3ODQ4LAorCTB4YTA4NSwgMHgwMDBjLCAweDc4NGEsIDB4NzBiNCwgMHhhMDgwLCAweDAwY2QsIDB4NzgxYSwgMHgyMDA5LAorCTB4MDAwYiwgMHgyMDAxLCAweDQ0MDAsIDB4MTA3OCwgMHg0NTdlLCAweDIwMDEsIDB4MDAxMywgMHgxMDc4LAorCTB4NDU0YywgMHgwMDc4LCAweDNiNjAsIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MjA0OSwgMHg0NjMzLAorCTB4NzAwMCwgMHg3MjA0LCAweGEyMDUsIDB4NzIwYywgMHhhMjE1LCAweDcwMDgsIDB4YTA4NCwgMHhmZmY3LAorCTB4YTIwNSwgMHgwMDQwLCAweDQ2NDUsIDB4MDA3OCwgMHg0NjRhLCAweDcwMDMsIDB4MDAwMCwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDcwMDAsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4NDY3OCwgMHg3MTA4LAorCTB4ODEwMywgMHgwMGM4LCAweDQ2NTcsIDB4MTA3OCwgMHg0NzdhLCAweDAwNzgsIDB4NDY0ZiwgMHg3MDBjLAorCTB4YTA4YywgMHgwMGZmLCAweDAwNDAsIDB4NDY3OCwgMHg3MDA0LCAweDgwMDQsIDB4MDBjOCwgMHg0NjZmLAorCTB4NzAxNCwgMHhhMDA1LCAweDAwYzAsIDB4NDY2YiwgMHg3MDEwLCAweGEwMDUsIDB4MDA0MCwgMHg0NjZmLAorCTB4YTEwMiwgMHgwMGM4LCAweDQ2NGYsIDB4NzAwNywgMHgwMDEwLCAweDAwNzgsIDB4NDY3OCwgMHg4YWZmLAorCTB4MDA0MCwgMHg0Njc4LCAweDEwNzgsIDB4NDljNCwgMHgwMGMwLCAweDQ2NzIsIDB4MDA0MCwgMHg0NjRmLAorCTB4MTA3OCwgMHg0NzAzLCAweDcwMDMsIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgwMTdlLAorCTB4NjEwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NDY4YiwgMHhhMThlLAorCTB4MDAwZiwgMHgwMGMwLCAweDQ2OGUsIDB4NjA0MCwgMHgwMDc4LCAweDQ2OGYsIDB4NjQyOCwgMHgwMTdmLAorCTB4ODRmZiwgMHgwMDQwLCAweDQ2YjksIDB4MmM3MCwgMHg3MDA0LCAweGEwYmMsIDB4MDAwZiwgMHhhN2I4LAorCTB4NDZjOSwgMHgyNzNjLCAweDg3ZmIsIDB4MDBjMCwgMHg0NmE3LCAweDAwNDgsIDB4NDZhMSwgMHgxMDc4LAorCTB4MjNjYSwgMHg2MDljLCAweGEwNzUsIDB4MDA0MCwgMHg0NmI5LCAweDAwNzgsIDB4NDY5NCwgMHgyNzA0LAorCTB4YWU2OCwgMHg2ODA4LCAweGE2MzAsIDB4NjgwYywgMHhhNTI5LCAweDg0MjEsIDB4MDA0MCwgMHg0NmI5LAorCTB4ODczOCwgMHgyNzA0LCAweGEwMDUsIDB4MDBjMCwgMHg0NmE4LCAweDcwOWMsIDB4YTA3NSwgMHgwMGMwLAorCTB4NDY5NCwgMHgwMDdjLCAweDAwMDAsIDB4MDAwNSwgMHgwMDA5LCAweDAwMGQsIDB4MDAxMSwgMHgwMDE1LAorCTB4MDAxOSwgMHgwMDFkLCAweDAwMDAsIDB4MDAwMywgMHgwMDA5LCAweDAwMGYsIDB4MDAxNSwgMHgwMDFiLAorCTB4MDAwMCwgMHgwMDAwLCAweDQ2YmUsIDB4NDZiYiwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLAorCTB4NDZiZSwgMHgwMDAwLCAweDQ2YzYsIDB4NDZjMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4NDZjNiwgMHgwMDAwLCAweDQ2YzEsIDB4NDZjMSwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLAorCTB4NDZjMSwgMHgwMDAwLCAweDQ2YzcsIDB4NDZjNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4NDZjNywgMHgxMjdlLCAweDIwOTEsIDB4MjIwMCwgMHgyMDc5LCAweDUwMDAsIDB4MjA3MSwgMHgwMDEwLAorCTB4NzAwNywgMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MjA3MSwgMHgwMDIwLAorCTB4NzAwNywgMHgwMDBhLCAweDcwMDcsIDB4MDAwMiwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLAorCTB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MjA0OSwgMHg0NzAzLCAweDIwMTksIDB4MDAwMCwgMHg3MDA0LAorCTB4ODAwNCwgMHgwMGM4LCAweDQ3NTYsIDB4NzAwNywgMHgwMDEyLCAweDcxMDgsIDB4NzAwOCwgMHhhMTA2LAorCTB4MDBjMCwgMHg0NzBkLCAweGExODQsIDB4MDFlMCwgMHgwMDQwLCAweDQ3MTgsIDB4MTA3OCwgMHgyM2NhLAorCTB4MjAwMSwgMHgwNGZkLCAweDIwMDQsIDB4YTA4MiwgMHgwMDA1LCAweDAwYzgsIDB4NDcyMywgMHhhMTg0LAorCTB4NDAwMCwgMHgwMGMwLCAweDQ3MGQsIDB4YTE5YywgMHgzMDBjLCAweGEzODYsIDB4MjAwNCwgMHgwMDQwLAorCTB4NDczMSwgMHhhMzg2LCAweDAwMDgsIDB4MDA0MCwgMHg0NzNjLCAweGEzODYsIDB4MjAwYywgMHgwMGMwLAorCTB4NDcwZCwgMHg3MjAwLCAweDgyMDQsIDB4MDA0OCwgMHg0NzNjLCAweDczMGMsIDB4YTM4NCwgMHgwMGZmLAorCTB4MDA0MCwgMHg0NzNjLCAweDEwNzgsIDB4MjNjYSwgMHg3MDA3LCAweDAwMTIsIDB4NzAwMCwgMHhhMDg0LAorCTB4MDAwMSwgMHgwMGMwLCAweDQ3NTYsIDB4NzAwOCwgMHhhMDg0LCAweDAxZTAsIDB4MDBjMCwgMHg0NzU2LAorCTB4NzMxMCwgMHg3MDE0LCAweGEzMDUsIDB4MDA0MCwgMHg0NzU2LCAweDcxMGMsIDB4YTE4NCwgMHgwMzAwLAorCTB4MDBjMCwgMHg0NzU2LCAweGExODQsIDB4MDBmZiwgMHgwMGMwLCAweDQ3MDMsIDB4NzAwNywgMHgwMDEyLAorCTB4NzAwNywgMHgwMDA4LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwYzAsIDB4NDc1YSwgMHg3MDA3LAorCTB4MDAxMiwgMHg3MTA4LCAweDgxMDMsIDB4MDA0OCwgMHg0NzVmLCAweDcwMDMsIDB4MDAwMCwgMHgyMDQ5LAorCTB4MDAwMCwgMHgwMDdjLCAweDEwN2UsIDB4MDA3ZSwgMHgxMjdlLCAweDE1N2UsIDB4MjA5MSwgMHgyMjAwLAorCTB4NzEwOCwgMHgxMDc4LCAweDQ3N2EsIDB4MTU3ZiwgMHgxMjdmLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdmLAorCTB4MTA3ZiwgMHgwMDdjLCAweDcyMDQsIDB4NzUwMCwgMHg3MzBjLCAweGEzODQsIDB4MDMwMCwgMHgwMGMwLAorCTB4NDdhMSwgMHhhMTg0LCAweDAxZTAsIDB4MDBjMCwgMHg0N2M1LCAweDcxMDgsIDB4YTE4NCwgMHgwMWUwLAorCTB4MDBjMCwgMHg0N2M1LCAweDIwMDEsIDB4MDRmZCwgMHgyMDA0LCAweGEwODIsIDB4MDAwNSwgMHgwMGM4LAorCTB4NDc5NSwgMHhhMTg0LCAweDQwMDAsIDB4MDBjMCwgMHg0Nzg1LCAweGExODQsIDB4MDAwNywgMHgwMDc5LAorCTB4NDc5OSwgMHg0N2EzLCAweDQ3YjUsIDB4NDdhMSwgMHg0N2I1LCAweDQ3YTEsIDB4NDgwMSwgMHg0N2ExLAorCTB4NDdmZiwgMHgxMDc4LCAweDIzY2EsIDB4NzAwNCwgMHhhMDg0LCAweDAwMTAsIDB4YTA4NSwgMHgwMDAyLAorCTB4NzAwNiwgMHg4YWZmLCAweDAwYzAsIDB4NDdiMCwgMHgyMDQ5LCAweDAwMDAsIDB4MDA3OCwgMHg0N2I0LAorCTB4MTA3OCwgMHg0OWM0LCAweDAwYzAsIDB4NDdiMCwgMHgwMDdjLCAweDcwMDQsIDB4YTA4NCwgMHgwMDEwLAorCTB4YTA4NSwgMHgwMDAyLCAweDcwMDYsIDB4OGFmZiwgMHgwMGMwLCAweDQ3YzAsIDB4MDA3OCwgMHg0N2M0LAorCTB4MTA3OCwgMHg0OWM0LCAweDAwYzAsIDB4NDdjMCwgMHgwMDdjLCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LAorCTB4MDBlMCwgMHg0N2M4LCAweDIwOTEsIDB4NjAwMCwgMHgwMGUwLCAweDQ3Y2MsIDB4MjA5MSwgMHg2MDAwLAorCTB4NzAwNywgMHgwMDEyLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA0LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLAorCTB4NDdkNCwgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHg4MTAzLCAweDAwNDgsIDB4NDdkOSwgMHg3MDAzLAorCTB4MDAwMCwgMHg3MDAwLCAweGEwMDUsIDB4MDBjMCwgMHg0N2VkLCAweDcwMDQsIDB4YTAwNSwgMHgwMGMwLAorCTB4NDdlZCwgMHg3MDBjLCAweGEwMDUsIDB4MDA0MCwgMHg0N2VmLCAweDAwNzgsIDB4NDdkMCwgMHgyMDQ5LAorCTB4MDAwMCwgMHgxMDc4LCAweDM3ZDcsIDB4NjgxOCwgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHg0N2ZhLAorCTB4NjgxYiwgMHgwMDAyLCAweDAwN2MsIDB4MTA3OCwgMHgyM2NhLCAweDEwNzgsIDB4MjNjYSwgMHgxMDc4LAorCTB4NDg1ZCwgMHg3MjEwLCAweDcxMTQsIDB4NzAwYywgMHhhMDljLCAweDAwZmYsIDB4MjgwMCwgMHhhMzAwLAorCTB4YTIxMSwgMHhhMTg5LCAweDAwMDAsIDB4MTA3OCwgMHg0ODVkLCAweDI3MDQsIDB4MmM1OCwgMHhhYzYwLAorCTB4NjMwOCwgMHgyMjAwLCAweGEzMjIsIDB4NjMwYywgMHgyMTAwLCAweGEzMWIsIDB4MjQwMCwgMHhhMzA1LAorCTB4MDA0MCwgMHg0ODI0LCAweDAwYzgsIDB4NDgyNCwgMHg4NDEyLCAweDgyMTAsIDB4ODMwYSwgMHhhMTg5LAorCTB4MDAwMCwgMHgyYjYwLCAweDAwNzgsIDB4NDgwYiwgMHgyYjYwLCAweDhhMDcsIDB4MDA3ZSwgMHg2MDA0LAorCTB4YTA4NCwgMHgwMDA4LCAweDAwNDAsIDB4NDgzMCwgMHhhN2JhLCAweDQ2YzMsIDB4MDA3OCwgMHg0ODMyLAorCTB4YTdiYSwgMHg0NmJiLCAweDAwN2YsIDB4YTczZCwgMHgyYzAwLCAweDY4ODYsIDB4NmY4YSwgMHg2YzkyLAorCTB4NmI4ZSwgMHg3MDA3LCAweDAwMTIsIDB4MTA3OCwgMHg0NzAzLCAweDAwN2MsIDB4ODczOCwgMHgyNzA0LAorCTB4YTAwNSwgMHgwMGMwLCAweDQ4NTEsIDB4NjA5YywgMHhhMDA1LCAweDAwNDAsIDB4NDg1YSwgMHgyMDYwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHg0NmM5LCAweDIwM2MsIDB4ODdmYiwgMHgxMDQwLAorCTB4MjNjYSwgMHg4YTUxLCAweDAwNDAsIDB4NDg1OSwgMHg3MDA4LCAweGEwODQsIDB4MDAwMywgMHhhMDg2LAorCTB4MDAwMywgMHgwMDdjLCAweDIwNTEsIDB4MDAwMCwgMHgwMDdjLCAweDhhNTAsIDB4ODczOSwgMHgyNzA0LAorCTB4YTAwNCwgMHgwMGMwLCAweDQ4NzEsIDB4NjAwMCwgMHhhMDY0LCAweDAwYzAsIDB4NDg2OCwgMHgyZDYwLAorCTB4NjAwNCwgMHhhMDg0LCAweDAwMGYsIDB4YTA4MCwgMHg0NmQ5LCAweDIwM2MsIDB4ODdmYiwgMHgxMDQwLAorCTB4MjNjYSwgMHgwMDdjLCAweDEyN2UsIDB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHg2ODg0LAorCTB4MjA2MCwgMHg2ODg4LCAweDZiOGMsIDB4NmM5MCwgMHg4MDU3LCAweGFhZDQsIDB4MDBmZiwgMHhhMDg0LAorCTB4MDBmZiwgMHgwMDdlLCAweDY4MDQsIDB4YTA4NCwgMHgwMDA4LCAweDAwN2YsIDB4MDA0MCwgMHg0ODhjLAorCTB4YTBiOCwgMHg0NmMzLCAweDAwNzgsIDB4NDg4ZSwgMHhhMGI4LCAweDQ2YmIsIDB4N2UwOCwgMHhhNmI1LAorCTB4MDAwYywgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LCAweDAwMDcsIDB4MDA0MCwgMHg0ODljLAorCTB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NDhhNSwgMHg2ODFjLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLAorCTB4NDhhYywgMHhhNmI1LCAweDAwMDEsIDB4MDA3OCwgMHg0OGFjLCAweDY4MWMsIDB4YTA4NCwgMHgwMDQwLAorCTB4MDA0MCwgMHg0OGFjLCAweGE2YjUsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAwNCwgMHgwMGMwLCAweDQ4YWUsIDB4MjQwMCwgMHhhMzA1LCAweDAwYzAsIDB4NDhiOSwgMHgwMDc4LAorCTB4NDhkZiwgMHgyYzU4LCAweDI3MDQsIDB4NjEwNCwgMHhhYzYwLCAweDYwMDAsIDB4YTQwMCwgMHg3MDFhLAorCTB4NjAwNCwgMHhhMzAxLCAweDcwMWUsIDB4YTE4NCwgMHgwMDA4LCAweDAwNDAsIDB4NDhjZiwgMHg2MDEwLAorCTB4YTA4MSwgMHgwMDAwLCAweDcwMjIsIDB4NjAxNCwgMHhhMDgxLCAweDAwMDAsIDB4NzAyNiwgMHg2MjA4LAorCTB4MjQwMCwgMHhhMjAyLCAweDcwMTIsIDB4NjIwYywgMHgyMzAwLCAweGEyMDMsIDB4NzAxNiwgMHg3NjAyLAorCTB4NzAwNywgMHgwMDAxLCAweDJiNjAsIDB4MTA3OCwgMHg0ODNlLCAweDAwNzgsIDB4NDhlMSwgMHgxMDc4LAorCTB4NDljNCwgMHgwMGMwLCAweDQ4ZGYsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwZDdlLAorCTB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4NzAwNywgMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LAorCTB4MDBjMCwgMHg0OGVkLCAweDcwMDMsIDB4MDAwOCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgxMjdlLAorCTB4MGQ3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHgyMDQ5LCAweDQ4ZjcsIDB4NzAwNywgMHgwMDA0LAorCTB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHg0OTAwLCAweDdlMDgsIDB4YTZiNSwgMHgwMDBjLAorCTB4NjkwNCwgMHhhMThjLCAweDAwZmYsIDB4YTE4NiwgMHgwMDA3LCAweDAwNDAsIDB4NDkxMywgMHhhMThlLAorCTB4MDAwZiwgMHgwMGMwLCAweDQ5MWUsIDB4NjgxYywgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHg0OTFhLAorCTB4YTZiNSwgMHgwMDAxLCAweDY4NDAsIDB4MjA1MCwgMHgwMDc4LCAweDQ5MjcsIDB4NjgxYywgMHhhMDg0LAorCTB4MDAyMCwgMHgwMGMwLCAweDQ5MjUsIDB4YTZiNSwgMHgwMDAxLCAweDY4MjgsIDB4MjA1MCwgMHgyZDYwLAorCTB4NjAwNCwgMHhhMGJjLCAweDAwMGYsIDB4YTdiOCwgMHg0NmM5LCAweDI3M2MsIDB4ODdmYiwgMHgwMGMwLAorCTB4NDkzYiwgMHgwMDQ4LCAweDQ5MzUsIDB4MTA3OCwgMHgyM2NhLCAweDY4OWMsIDB4YTA2NSwgMHgwMDQwLAorCTB4NDkzZiwgMHgwMDc4LCAweDQ5MjgsIDB4MTA3OCwgMHg0OWM0LCAweDAwYzAsIDB4NDkzYiwgMHgxMjdmLAorCTB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwMTdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLAorCTB4MGQ3ZiwgMHgwMzdmLCAweDA0N2YsIDB4N2UwOCwgMHhhNmI1LCAweDAwMGMsIDB4NjkwNCwgMHhhMThjLAorCTB4MDBmZiwgMHhhMTg2LCAweDAwMDcsIDB4MDA0MCwgMHg0OTU5LCAweGExOGUsIDB4MDAwZiwgMHgwMGMwLAorCTB4NDk2MiwgMHg2ODFjLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDQ5NjksIDB4YTZiNSwgMHgwMDAxLAorCTB4MDA3OCwgMHg0OTY5LCAweDY4MWMsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4NDk2OSwgMHhhNmI1LAorCTB4MDAwMSwgMHgyMDQ5LCAweDQ5NDIsIDB4MDE3ZSwgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNywgMHgwMDQwLCAweDQ5NzcsIDB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NDk3YSwgMHg2ODQwLAorCTB4MDA3OCwgMHg0OTdiLCAweDY4MjgsIDB4MDE3ZiwgMHhhMDU1LCAweDAwNDAsIDB4NDljMSwgMHgyZDcwLAorCTB4MmU2MCwgMHg3MDA0LCAweGEwYmMsIDB4MDAwZiwgMHhhN2I4LCAweDQ2YzksIDB4MjczYywgMHg4N2ZiLAorCTB4MDBjMCwgMHg0OTk1LCAweDAwNDgsIDB4NDk4ZSwgMHgxMDc4LCAweDIzY2EsIDB4NzA5YywgMHhhMDc1LAorCTB4MjA2MCwgMHgwMDQwLCAweDQ5YzEsIDB4MDA3OCwgMHg0OTgxLCAweDI3MDQsIDB4YWU2OCwgMHg2ODA4LAorCTB4YTQyMiwgMHg2ODBjLCAweGEzMWIsIDB4MDA0OCwgMHg0OWFlLCAweDhhNTEsIDB4MDBjMCwgMHg0OWEyLAorCTB4MTA3OCwgMHgyM2NhLCAweDg3MzgsIDB4MjcwNCwgMHhhMDA1LCAweDAwYzAsIDB4NDk5NiwgMHg3MDljLAorCTB4YTA3NSwgMHgyMDYwLCAweDAwNDAsIDB4NDljMSwgMHgwMDc4LCAweDQ5ODEsIDB4ODQyMiwgMHg4NDIwLAorCTB4ODMxYSwgMHhhMzk5LCAweDAwMDAsIDB4NjkwOCwgMHgyNDAwLCAweGExMjIsIDB4NjkwYywgMHgyMzAwLAorCTB4YTExYiwgMHgwMGM4LCAweDQ5YmQsIDB4MTA3OCwgMHgyM2NhLCAweDIwNzEsIDB4MDAyMCwgMHgwMDc4LAorCTB4NDhhYywgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHg3MDA4LCAweGEwODQsIDB4MDAwMywgMHhhMDg2LAorCTB4MDAwMywgMHgwMDQwLCAweDQ5ZWMsIDB4MjcwNCwgMHhhYzA4LCAweDIxMDQsIDB4NzAxYSwgMHg4MTA4LAorCTB4MjEwNCwgMHg3MDFlLCAweDgxMDgsIDB4MjEwNCwgMHg3MDEyLCAweDgxMDgsIDB4MjEwNCwgMHg3MDE2LAorCTB4NjAwNCwgMHhhMDg0LCAweDAwMDgsIDB4MDA0MCwgMHg0OWUzLCAweDgxMDgsIDB4MjEwNCwgMHg3MDIyLAorCTB4ODEwOCwgMHgyMTA0LCAweDcwMjYsIDB4NzYwMiwgMHg3MDA0LCAweGEwODQsIDB4MDAxMCwgMHhhMDg1LAorCTB4MDAwMSwgMHg3MDA2LCAweDEwNzgsIDB4NDgzZSwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwZDdlLAorCTB4MjA5MSwgMHgyMjAwLCAweDIwNDksIDB4NDllZCwgMHgwZDdmLCAweDA4N2YsIDB4NzEwOCwgMHhhMTg0LAorCTB4MDAwMywgMHgwMGMwLCAweDRhMTcsIDB4MDE3ZSwgMHg2OTA0LCAweGExOGMsIDB4MDBmZiwgMHhhMTg2LAorCTB4MDAwNywgMHgwMDQwLCAweDRhMDcsIDB4YTE4ZSwgMHgwMDBmLCAweDAwYzAsIDB4NGEwYSwgMHg2ODQwLAorCTB4MDA3OCwgMHg0YTBiLCAweDY4MjgsIDB4MDE3ZiwgMHhhMDA1LCAweDAwNDAsIDB4NGEyNSwgMHgwMDc4LAorCTB4NDY0YSwgMHgwMDIwLCAweDRhMTcsIDB4MTA3OCwgMHg0ODAxLCAweDAwNzgsIDB4NGEyNSwgMHgwMGEwLAorCTB4NGExZSwgMHg3MTA4LCAweDEwNzgsIDB4NDc3YSwgMHgwMDc4LCAweDQ5ZjYsIDB4NzAwNywgMHgwMDEwLAorCTB4MDBhMCwgMHg0YTIwLCAweDcxMDgsIDB4MTA3OCwgMHg0NzdhLCAweDcwMDgsIDB4YTA4NiwgMHgwMDA4LAorCTB4MDBjMCwgMHg0OWY2LCAweDcwMDAsIDB4YTAwNSwgMHgwMGMwLCAweDQ5ZjYsIDB4NzAwMywgMHgwMDAwLAorCTB4MjA0OSwgMHgwMDAwLCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsIDB4MTQ3ZSwgMHgxMzdlLAorCTB4MTU3ZSwgMHgwYzdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4MjA0OSwgMHg0YTM1LAorCTB4YWQ4MCwgMHgwMDExLCAweDIwYTAsIDB4MjA5OSwgMHgwMDMxLCAweDcwMGMsIDB4YTA4NCwgMHgwMGZmLAorCTB4NjgyYSwgMHg3MDA3LCAweDAwMDgsIDB4NzAwNywgMHgwMDAyLCAweDcwMDMsIDB4MDAwMSwgMHgwMDQwLAorCTB4NGE1NCwgMHg4MDAwLCAweDgwYWMsIDB4NTNhNSwgMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LAorCTB4MDAwNCwgMHgwMGMwLCAweDRhNTYsIDB4MGM3ZiwgMHgyMDQ5LCAweDAwMDAsIDB4NzAwMywgMHgwMDAwLAorCTB4MTU3ZiwgMHgxMzdmLCAweDE0N2YsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MjA5MSwgMHg2MDAwLAorCTB4MjA5MSwgMHg4MDAwLCAweDc4Y2MsIDB4YTAwNSwgMHgwMDQwLCAweDRhN2QsIDB4Nzk5NCwgMHg3MGQwLAorCTB4YTEwNiwgMHgwMGMwLCAweDRhN2QsIDB4NzgwNCwgMHhhMDA1LCAweDAwNDAsIDB4NGE3ZCwgMHg3ODA3LAorCTB4MDAwMCwgMHgwMDY4LCAweDRhN2QsIDB4MjA5MSwgMHg0MDgwLCAweDc4MjAsIDB4ODAwMSwgMHg3ODIyLAorCTB4MDBjMCwgMHg0YWQ4LCAweDc4MjQsIDB4NzgyMiwgMHgyMDY5LCAweDUwNDAsIDB4NjgwMCwgMHhhMDg0LAorCTB4MDAwNywgMHgwMDQwLCAweDRhOWIsIDB4YTA4NiwgMHgwMDAyLCAweDAwNDAsIDB4NGE5YiwgMHg2ODM0LAorCTB4YTAwZCwgMHgwMDQwLCAweDRhOWIsIDB4MjEwNCwgMHhhMDA1LCAweDAwNDAsIDB4NGE5YiwgMHg4MDAxLAorCTB4MjAwYSwgMHgwMDQwLCAweDRiODAsIDB4Nzg0OCwgMHhhMDA1LCAweDAwNDAsIDB4NGFhOSwgMHg4MDAxLAorCTB4Nzg0YSwgMHgwMGMwLCAweDRhYTksIDB4MjAwOSwgMHgwMTAyLCAweDY4NDQsIDB4MjAwYSwgMHgxMDc4LAorCTB4MjFiMSwgMHg2ODkwLCAweGEwMDUsIDB4MDA0MCwgMHg0YWI1LCAweDgwMDEsIDB4Njg5MiwgMHgwMGMwLAorCTB4NGFiNSwgMHg2ODZmLCAweDAwMDAsIDB4Njg3MywgMHgwMDAxLCAweDIwNjEsIDB4NTMwMCwgMHgyMGE5LAorCTB4MDEwMCwgMHgyMDA5LCAweDAwMDIsIDB4NjAzNCwgMHhhMDA1LCAweDAwNDAsIDB4NGFjYiwgMHg4MDAxLAorCTB4NjAzNiwgMHgwMGMwLCAweDRhY2IsIDB4NjAxMCwgMHhhMDA1LCAweDAwNDAsIDB4NGFjYiwgMHgwMTdlLAorCTB4MTA3OCwgMHgyMWIxLCAweDAxN2YsIDB4YWNlMCwgMHgwMDEwLCAweDAwNzAsIDB4NGFkMSwgMHgwMDc4LAorCTB4NGFiYiwgMHg4MTA5LCAweDAwNDAsIDB4NGFkOCwgMHgyMGE5LCAweDAxMDAsIDB4MDA3OCwgMHg0YWJiLAorCTB4MTA3OCwgMHg0YWU1LCAweDEwNzgsIDB4NGIwYSwgMHgyMDA5LCAweDUwNTEsIDB4MjEwNCwgMHgyMDA5LAorCTB4MDEwMiwgMHgyMDBhLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDc4MzQsIDB4ODAwMSwgMHg3ODM2LAorCTB4MDBjMCwgMHg0YjA5LCAweDc4MzgsIDB4NzgzNiwgMHgyMDkxLCAweDgwMDAsIDB4Nzg0NCwgMHhhMDA1LAorCTB4MDBjMCwgMHg0YWY0LCAweDIwMDEsIDB4MDEwMSwgMHg4MDAxLCAweDc4NDYsIDB4YTA4MCwgMHg3MzAwLAorCTB4MjA0MCwgMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHg0YjA5LCAweDYwMjQsIDB4YTAwNSwgMHgwMDQwLAorCTB4NGIwNSwgMHg4MDAxLCAweDYwMjYsIDB4MDA0MCwgMHg0YjM5LCAweDYwMDAsIDB4MmM0MCwgMHgwMDc4LAorCTB4NGFmYSwgMHgwMDdjLCAweDc4MjgsIDB4ODAwMSwgMHg3ODJhLCAweDAwYzAsIDB4NGIzOCwgMHg3ODJjLAorCTB4NzgyYSwgMHg3ODMwLCAweGEwMDUsIDB4MDBjMCwgMHg0YjE3LCAweDIwMDEsIDB4MDIwMCwgMHg4MDAxLAorCTB4NzgzMiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwOTAsIDB4NTMwMCwgMHhhMjk4LAorCTB4MDAwMiwgMHgyMzA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDRiMzgsIDB4YTI5MCwgMHgwMDA5LAorCTB4MjIwNCwgMHhhMDA1LCAweDAwNDAsIDB4NGIzMCwgMHg4MDAxLCAweDIwMTIsIDB4MDBjMCwgMHg0YjM4LAorCTB4MjMwNCwgMHhhMDg0LCAweGZmZjcsIDB4YTA4NSwgMHgwMDgwLCAweDIwMWEsIDB4MTA3OCwgMHgyMWIxLAorCTB4MDA3YywgMHgyMDY5LCAweDUwNDAsIDB4NjgwMCwgMHhhMDA1LCAweDAwNDAsIDB4NGI0MywgMHg2ODQ4LAorCTB4YWMwNiwgMHgwMDQwLCAweDRiODAsIDB4NjAxYiwgMHgwMDA2LCAweDYwYjQsIDB4YTA4NCwgMHgzZjAwLAorCTB4NjAxZSwgMHg2MDIwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDAwNjAsIDB4NjAyMiwgMHg2MDAwLAorCTB4MjA0MiwgMHg2NzE0LCAweDZmODIsIDB4MTA3OCwgMHgxOTU2LCAweDY4MTgsIDB4YTAwNSwgMHgwMDQwLAorCTB4NGI1YiwgMHg4MDAxLCAweDY4MWEsIDB4NjgwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjgwYSwgMHg2ODEwLAorCTB4ODAwMSwgMHgwMGQwLCAweDRiNjUsIDB4MTA3OCwgMHgyM2NhLCAweDY4MTIsIDB4NjAyZiwgMHgwMDAwLAorCTB4NjAzMywgMHgwMDAwLCAweDJjNjgsIDB4MTA3OCwgMHgxYzUzLCAweDIwNjksIDB4NTA0MCwgMHg3OTQ0LAorCTB4YTE4NCwgMHgwMTAwLCAweDIwMDEsIDB4MDAwNiwgMHg2ODZlLCAweDAwYzAsIDB4NGI3YiwgMHg2OTg2LAorCTB4MjAwMSwgMHgwMDA0LCAweDY4NmUsIDB4MTA3OCwgMHgyMWFjLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLAorCTB4MjA2OSwgMHgwMTAwLCAweDIwMDksIDB4NTA0MCwgMHgyMTA0LCAweGEwODQsIDB4MDAwNywgMHgwMDQwLAorCTB4NGJkYywgMHhhMDg2LCAweDAwMDcsIDB4MDBjMCwgMHg0Yjk2LCAweDBkN2UsIDB4MjAwOSwgMHg1MDUyLAorCTB4MjE2YywgMHgxMDc4LCAweDNhMWEsIDB4MGQ3ZiwgMHgwMDc4LCAweDRiZGMsIDB4MjAwOSwgMHg1MDUyLAorCTB4MjE2NCwgMHgxMDc4LCAweDIzNzUsIDB4NjAxYiwgMHgwMDA2LCAweDY4NTgsIDB4YTA4NCwgMHgzZjAwLAorCTB4NjAxZSwgMHg2MDIwLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDAwNDgsIDB4NjAyMiwgMHg2MDJmLAorCTB4MDAwMCwgMHg2MDMzLCAweDAwMDAsIDB4NjgzMCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHg0YmQwLAorCTB4Njg0YiwgMHgwMDA0LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwNCwgMHgwMDQwLAorCTB4NGJiZCwgMHgwMDcwLCAweDRiYmQsIDB4MDA3OCwgMHg0YmI0LCAweDY4NGIsIDB4MDAwOSwgMHgyMGE5LAorCTB4MDAxNCwgMHg2ODQ4LCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDRiY2EsIDB4MDA3MCwgMHg0YmNhLAorCTB4MDA3OCwgMHg0YmMxLCAweDIwYTksIDB4MDBmYSwgMHgwMDcwLCAweDRiZDAsIDB4MDA3OCwgMHg0YmNjLAorCTB4NjgwOCwgMHhhMDg0LCAweGZmZmQsIDB4NjgwYSwgMHg2ODFiLCAweDAwNDgsIDB4MjAwOSwgMHg1MDViLAorCTB4MjAwYiwgMHgwMDA3LCAweDc4NGMsIDB4Nzg0YSwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgyMDc5LAorCTB4NTAwMCwgMHgxMDc4LCAweDRjMGEsIDB4MTA3OCwgMHg0YmVlLCAweDEwNzgsIDB4NGJmYywgMHg3ODMzLAorCTB4MDAwMCwgMHg3ODQ3LCAweDAwMDAsIDB4Nzg0YiwgMHgwMDAwLCAweDAwN2MsIDB4MjAxOSwgMHgwMDAzLAorCTB4MjAxMSwgMHg1MDQ2LCAweDIyMDQsIDB4YTA4NiwgMHgwMDNjLCAweDAwNDAsIDB4NGJmOSwgMHgyMDE5LAorCTB4MDAwMiwgMHg3YjJhLCAweDdiMmUsIDB4MDA3YywgMHgyMDE5LCAweDAwMzksIDB4MjAxMSwgMHg1MDQ2LAorCTB4MjIwNCwgMHhhMDg2LCAweDAwM2MsIDB4MDA0MCwgMHg0YzA3LCAweDIwMTksIDB4MDAyNywgMHg3YjM2LAorCTB4N2IzYSwgMHgwMDdjLCAweDIwMTksIDB4Mzk3MSwgMHgyMDExLCAweDUwNDYsIDB4MjIwNCwgMHhhMDg2LAorCTB4MDAzYywgMHgwMDQwLCAweDRjMTUsIDB4MjAxOSwgMHgyNjI2LCAweDdiMjIsIDB4N2IyNiwgMHg3ODNmLAorCTB4MDAwMCwgMHg3ODQzLCAweDAwMGEsIDB4MDA3YywgMHgwMDIwLCAweDAwMmIsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDE0LAorCTB4MDAxNCwgMHg5ODQ5LCAweDAwMTQsIDB4MDAxNCwgMHgwMDE0LCAweDAwMTQsIDB4MDAxNCwgMHgwMDE0LAorCTB4MDAxNCwgMHgwMDgwLCAweDAwMGYsIDB4MDAwMCwgMHgwMjAxLCAweDA2MDQsIDB4MGMwOCwgMHgyMTIwLAorCTB4NDAyMiwgMHhmODgwLCAweDAwMTgsIDB4MzAwYiwgMHhhMjAxLCAweDAwMTQsIDB4YTIwMCwgMHgwMDE0LAorCTB4YTIwMCwgMHgwMjE0LCAweDAwMDAsIDB4MDA2YywgMHgwMDAyLCAweDAwMTQsIDB4OThkNSwgMHgwMDllLAorCTB4MDA5YiwgMHhhMjAyLCAweDg4MzgsIDB4MzgwNiwgMHg4ODM5LCAweDIwYzMsIDB4MDg2NCwgMHg5ODg5LAorCTB4MjhjMSwgMHg5Y2I2LCAweGEyMDMsIDB4MzAwYywgMHgyODQ2LCAweDgxNjEsIDB4ODQ2YSwgMHg4MzAwLAorCTB4MTg1NiwgMHg4ODNhLCAweDk4NjUsIDB4MjhmMiwgMHg5Yzk1LCAweDk4NTgsIDB4MzAwYywgMHgyOGUxLAorCTB4OWM5NSwgMHgyODA5LCAweGEyMDYsIDB4NjRjMCwgMHg2N2EwLCAweDZmYzAsIDB4MTgxNCwgMHg4ODNiLAorCTB4NzgyYywgMHg3ODZkLCAweDk4NzksIDB4MjgyYiwgMHhhMjA3LCAweDY0YTAsIDB4NjdhMCwgMHg2ZmMwLAorCTB4MTgxNCwgMHg4ODNiLCAweDc4MjIsIDB4ODgzZSwgMHg5ODdkLCAweDg1NzYsIDB4ODY3NywgMHgyMDZiLAorCTB4MjhjMSwgMHg5Y2I2LCAweDIwNDQsIDB4MjEwMywgMHgyMGEyLCAweDIwODEsIDB4OTg2NSwgMHhhMjA5LAorCTB4MjkwMSwgMHg5ODkxLCAweDAwMTQsIDB4YTIwNSwgMHhhMzAwLCAweDE4NzIsIDB4ODc5YSwgMHg4ODNjLAorCTB4MWZlMiwgMHhjNjAxLCAweGEyMGEsIDB4ODU2ZSwgMHgwNzA0LCAweDljOTUsIDB4MDAxNCwgMHhhMjA0LAorCTB4YTMwMCwgMHgzMDA5LCAweDE5ZTIsIDB4Zjg2OCwgMHg4MTc2LCAweDg2ZWIsIDB4ODVlYiwgMHg4NzJlLAorCTB4ODdhOSwgMHg4ODNmLCAweDA4ZTYsIDB4OTg5NSwgMHhmODgxLCAweDk4OTAsIDB4YzgwMSwgMHgwMDE0LAorCTB4ZjhjMSwgMHgwMDE2LCAweDg1YjIsIDB4ODBmMCwgMHg5NTMyLCAweGZiMDIsIDB4MWRlMiwgMHgwMDE0LAorCTB4ODUzMiwgMHhmMjQxLCAweDAwMTQsIDB4MWRlMiwgMHg4NGE4LCAweGQ3YTAsIDB4MWZlNiwgMHgwMDE0LAorCTB4YTIwOCwgMHg2MDQzLCAweDgwMDgsIDB4MWRjMSwgMHgwMDE2LCAweDgzMDAsIDB4ODE2MCwgMHg4NDJhLAorCTB4ZjA0MSwgMHgzMDA4LCAweDg0YTgsIDB4MTFkNiwgMHg3MDQyLCAweDIwZGQsIDB4MDAxMSwgMHgyMGQ1LAorCTB4ODgyMiwgMHgwMDE2LCAweDgwMDAsIDB4Mjg0NywgMHgxMDExLCAweDk4YzgsIDB4ODAwMCwgMHhhMDAwLAorCTB4MjgwMiwgMHgxMDExLCAweDk4Y2UsIDB4OTg2NSwgMHgyODNlLCAweDEwMTEsIDB4OThkMiwgMHhhMjBiLAorCTB4MDAxNywgMHgzMDBjLCAweGEzMDAsIDB4MWRlMiwgMHhkYjgxLCAweDAwMTQsIDB4MDIxMCwgMHg5OGRmLAorCTB4MDAxNCwgMHgyNmUwLCAweDg3M2EsIDB4ZmIwMiwgMHgxOWYyLCAweDFmZTIsIDB4MDAxNCwgMHhhMjBkLAorCTB4MzgwNiwgMHgwMjEwLCAweDljYmIsIDB4MDcwNCwgMHgwMDAwLCAweDAwNmMsIDB4MDAwMiwgMHg5ODRmLAorCTB4MDAxNCwgMHgwMDllLCAweDAwYTAsIDB4MDAxNywgMHg2MGZmLCAweDMwMGMsIDB4ODcyMCwgMHhhMjExLAorCTB4OWNkMCwgMHg4NzcyLCAweDg4MzcsIDB4MjEwMSwgMHg5ODdhLCAweDEwZDIsIDB4NzhlMiwgMHg5Y2QzLAorCTB4OTg1OSwgMHhkOTg0LCAweGYwZTIsIDB4ZjBhMSwgMHg5OGNkLCAweDAwMTQsIDB4ODgzMSwgMHhkMTY2LAorCTB4ODgzMCwgMHg4MDBmLCAweDk0MDEsIDB4YjUyMCwgMHhjODAyLCAweDg4MjAsIDB4OTg3YSwgMHgyMzAxLAorCTB4OTg3YSwgMHgxMGQyLCAweDc4ZTQsIDB4OWNkMywgMHg4ODIxLCAweDg4MjAsIDB4OTg1OSwgMHhmMTIzLAorCTB4ZjE0MiwgMHhmMTAxLCAweDk4YzYsIDB4MTBkMiwgMHg3MGY2LCAweDg4MzIsIDB4ODIwMywgMHg4NzBjLAorCTB4ZDk5ZSwgMHg2MDAxLCAweDAwMTQsIDB4Njg0NSwgMHgwMjE0LCAweGEyMWIsIDB4OWNkMCwgMHgyMDAxLAorCTB4OThjNSwgMHg4MjAxLCAweDE4NTIsIDB4ZDE4NCwgMHhkMTYzLCAweDg4MzQsIDB4ODAwMSwgMHg5ODhkLAorCTB4MzAyNywgMHg4NGE4LCAweDFhNTYsIDB4ODgzMywgMHgwMDE0LCAweGEyMTgsIDB4Njk4MSwgMHg5Y2JjLAorCTB4NmIyYSwgMHg2OTAyLCAweDE4MzQsIDB4OTg5ZCwgMHgxODE0LCAweDgwMTAsIDB4ODU5MiwgMHg4MDI2LAorCTB4ODRiOSwgMHg3MDIxLCAweDAwMTQsIDB4YTMwMCwgMHg2OWUxLCAweDljYTksIDB4Njk0YiwgMHhhMjEzLAorCTB4MTQ2MiwgMHhhMjEzLCAweDgwMDAsIDB4MTZlMSwgMHg5OGI1LCAweDgwMjMsIDB4MTZlMSwgMHg4MDAxLAorCTB4MTBmMSwgMHgwMDE2LCAweDY5NjksIDB4YTIxNCwgMHg2MWMyLCAweDgwMDIsIDB4MTRlMSwgMHg4MDA0LAorCTB4MTZlMSwgMHgwMTAxLCAweDMwMGEsIDB4ODgyNywgMHgwMDE0LCAweGEyMTcsIDB4OWNiYywgMHgwMDE0LAorCTB4YTMwMCwgMHg4MTgxLCAweDg0MmEsIDB4ODRhOCwgMHgxY2U2LCAweDg4MmMsIDB4MDAxNiwgMHhhMjEyLAorCTB4OWNkMCwgMHgxMGQyLCAweDcwZTQsIDB4MDAwNCwgMHg4MDA3LCAweDk0MjQsIDB4Y2MxYSwgMHg5Y2QzLAorCTB4OThjNSwgMHg4ODI3LCAweDMwMGEsIDB4MDAxMywgMHg4MDAwLCAweDg0YTQsIDB4MDAxNiwgMHgxMWMyLAorCTB4MjExZSwgMHg4NzBlLCAweGEyMWQsIDB4MDAxNCwgMHg4NzhlLCAweDAwMTYsIDB4YTIxYywgMHgxMDM1LAorCTB4OTg5MSwgMHhhMjEwLCAweGEwMDAsIDB4ODAxMCwgMHg4NTkyLCAweDg1M2IsIDB4ZDA0NCwgMHg4MDIyLAorCTB4MzgwNywgMHg4NGJiLCAweDk4ZWEsIDB4ODAyMSwgMHgzODA3LCAweDg0YjksIDB4MzAwYywgMHg4MTdlLAorCTB4ODcyYiwgMHg4NzcyLCAweDk4OTEsIDB4MDAwMCwgMHgwMDIwLCAweDAwMmIsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLAorCTB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDE0LAorCTB4MDAxNCwgMHg5ODQ5LCAweDAwMTQsIDB4MDAxNCwgMHg5OGVhLCAweDk4ZDUsIDB4MDAxNCwgMHgwMDE0LAorCTB4MDAxNCwgMHgwMDgwLCAweDAxM2YsIDB4MDAwMCwgMHgwMjAxLCAweDA2MDQsIDB4MGMwOCwgMHgyMTIwLAorCTB4NDAyMiwgMHhmODgwLCAweDAwMTgsIDB4MzAwYiwgMHhhMjAxLCAweDAwMTQsIDB4YTIwMCwgMHgwMDE0LAorCTB4YTIwMCwgMHgwMjE0LCAweGEyMDIsIDB4ODgzOCwgMHgzODA2LCAweDg4MzksIDB4MjBjMywgMHgwODY0LAorCTB4YTgzMywgMHgyOGMxLCAweDljYjYsIDB4YTIwMywgMHgzMDBjLCAweDI4NDYsIDB4ODE2MSwgMHg4NDZhLAorCTB4ODMwMCwgMHgxODU2LCAweDg4M2EsIDB4YTgwNCwgMHgyOGYyLCAweDljOTUsIDB4YThmNCwgMHgzMDBjLAorCTB4MjhlMSwgMHg5Yzk1LCAweDI4MDksIDB4YTIwNiwgMHg2NGMwLCAweDY3YTAsIDB4NmZjMCwgMHgxODE0LAorCTB4ODgzYiwgMHg3ODJjLCAweDc4NmQsIDB4YTgwOCwgMHgyODJiLCAweGEyMDcsIDB4NjRhMCwgMHg2N2EwLAorCTB4NmZjMCwgMHgxODE0LCAweDg4M2IsIDB4NzgyMiwgMHg4ODNlLCAweGE4MDIsIDB4ODU3NiwgMHg4Njc3LAorCTB4MjA2YiwgMHgyOGMxLCAweDljYjYsIDB4MjA0NCwgMHgyMTAzLCAweDIwYTIsIDB4MjA4MSwgMHhhOGUwLAorCTB4YTIwOSwgMHgyOTAxLCAweGE4MDksIDB4MDAxNCwgMHhhMjA1LCAweGEzMDAsIDB4MTg3MiwgMHg4NzlhLAorCTB4ODgzYywgMHgxZmUyLCAweGM2MDEsIDB4YTIwYSwgMHg4NTZlLCAweDA3MDQsIDB4OWM5NSwgMHgwMDE0LAorCTB4YTIwNCwgMHhhMzAwLCAweDMwMDksIDB4MTllMiwgMHhmODY4LCAweDgxNzYsIDB4ODZlYiwgMHg4NWViLAorCTB4ODcyZSwgMHg4N2E5LCAweDg4M2YsIDB4MDhlNiwgMHhhOGYzLCAweGY4ODEsIDB4YThlYywgMHhjODAxLAorCTB4MDAxNCwgMHhmOGMxLCAweDAwMTYsIDB4ODViMiwgMHg4MGYwLCAweDk1MzIsIDB4ZmIwMiwgMHgxZGUyLAorCTB4MDAxNCwgMHg4NTMyLCAweGYyNDEsIDB4MDAxNCwgMHgxZGUyLCAweDg0YTgsIDB4ZDdhMCwgMHgxZmU2LAorCTB4MDAxNCwgMHhhMjA4LCAweDYwNDMsIDB4ODAwOCwgMHgxZGMxLCAweDAwMTYsIDB4ODMwMCwgMHg4MTYwLAorCTB4ODQyYSwgMHhmMDQxLCAweDMwMDgsIDB4ODRhOCwgMHgxMWQ2LCAweDcwNDIsIDB4MjBkZCwgMHgwMDExLAorCTB4MjBkNSwgMHg4ODIyLCAweDAwMTYsIDB4ODAwMCwgMHgyODQ3LCAweDEwMTEsIDB4YThmYywgMHg4MDAwLAorCTB4YTAwMCwgMHgyODAyLCAweDEwMTEsIDB4YThmZCwgMHhhODkzLCAweDI4M2UsIDB4MTAxMSwgMHhhOGZkLAorCTB4YTIwYiwgMHgwMDE3LCAweDMwMGMsIDB4YTMwMCwgMHgxZGUyLCAweGRiODEsIDB4MDAxNCwgMHgwMjEwLAorCTB4YTgwMSwgMHgwMDE0LCAweDI2ZTAsIDB4ODczYSwgMHhmYjAyLCAweDE5ZjIsIDB4MWZlMiwgMHgwMDE0LAorCTB4YTIwZCwgMHgzODA2LCAweDAyMTAsIDB4OWNiYiwgMHgwNzA0LCAweDAwMTcsIDB4NjBmZiwgMHgzMDBjLAorCTB4ODcyMCwgMHhhMjExLCAweDlkNmIsIDB4ODc3MiwgMHg4ODM3LCAweDIxMDEsIDB4YTgyMSwgMHgxMGQyLAorCTB4NzhlMiwgMHg5ZDZlLCAweGE4ZmMsIDB4ZDk4NCwgMHhmMGUyLCAweGYwYTEsIDB4YTg2YywgMHgwMDE0LAorCTB4ODgzMSwgMHhkMTY2LCAweDg4MzAsIDB4ODAwZiwgMHg5NDAxLCAweGI1MjAsIDB4YzgwMiwgMHg4ODIwLAorCTB4YTgwZiwgMHgyMzAxLCAweGE4MGQsIDB4MTBkMiwgMHg3OGU0LCAweDlkNmUsIDB4ODgyMSwgMHg4ODIwLAorCTB4YThlNiwgMHhmMTIzLCAweGYxNDIsIDB4ZjEwMSwgMHhhODRmLCAweDEwZDIsIDB4NzBmNiwgMHg4ODMyLAorCTB4ODIwMywgMHg4NzBjLCAweGQ5OWUsIDB4NjAwMSwgMHgwMDE0LCAweDY4NDUsIDB4MDIxNCwgMHhhMjFiLAorCTB4OWQ2YiwgMHgyMDAxLCAweGE4NDAsIDB4ODIwMSwgMHgxODUyLCAweGQxODQsIDB4ZDE2MywgMHg4ODM0LAorCTB4ODAwMSwgMHhhODAxLCAweDMwMjcsIDB4ODRhOCwgMHgxYTU2LCAweDg4MzMsIDB4MDAxNCwgMHhhMjE4LAorCTB4Njk4MSwgMHg5ZDU3LCAweDZiMmEsIDB4NjkwMiwgMHgxODM0LCAweGE4MDUsIDB4MTgxNCwgMHg4MDEwLAorCTB4ODU5MiwgMHg4MDI2LCAweDg0YjksIDB4NzAyMSwgMHgwMDE0LCAweGEzMDAsIDB4NjllMSwgMHg5ZDQ0LAorCTB4Njk0YiwgMHhhMjEzLCAweDE0NjIsIDB4YTIxMywgMHg4MDAwLCAweDE2ZTEsIDB4YTgwYywgMHg4MDIzLAorCTB4MTZlMSwgMHg4MDAxLCAweDEwZjEsIDB4MDAxNiwgMHg2OTY5LCAweGEyMTQsIDB4NjFjMiwgMHg4MDAyLAorCTB4MTRlMSwgMHg4MDA0LCAweDE2ZTEsIDB4MDEwMSwgMHgzMDBhLCAweDg4MjcsIDB4MDAxNCwgMHhhMjE3LAorCTB4OWQ1NywgMHgwMDE0LCAweGEzMDAsIDB4ODE4MSwgMHg4NDJhLCAweDg0YTgsIDB4MWNlNiwgMHg4ODJjLAorCTB4MDAxNiwgMHhhMjEyLCAweDlkNmIsIDB4MTBkMiwgMHg3MGU0LCAweDAwMDQsIDB4ODAwNywgMHg5NDI0LAorCTB4Y2MxYSwgMHg5ZDZlLCAweGE4ZjgsIDB4ODgyNywgMHgzMDBhLCAweDAwMTMsIDB4ODAwMCwgMHg4NGE0LAorCTB4MDAxNiwgMHgxMWMyLCAweDIxMWUsIDB4ODcwZSwgMHhhMjFkLCAweDAwMTQsIDB4ODc4ZSwgMHgwMDE2LAorCTB4YTIxYywgMHgxMDM1LCAweGE4YjQsIDB4YTIxMCwgMHgzODA3LCAweDMwMGMsIDB4ODE3ZSwgMHg4NzJiLAorCTB4ODc3MiwgMHhhOGFkLCAweDAwMDAsIDB4OGVjNgorfTsKKworI2VuZGlmIC8qIFJFTE9BRF9GSVJNV0FSRSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcmlzY19jb2RlX2xlbmd0aDAxID0gMHgzZjE0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTdhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKQEAgLTAsMCArMSwxNTQxIEBACisvKiBxbG9naWNwdGkuYzogUGVyZm9ybWFuY2UgVGVjaG5vbG9naWVzIFFsb2dpY0lTUCBzYnVzIGNhcmQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXBmcy5ydXRnZXJzLmVkdSkKKyAqCisgKiBBIGxvdCBvZiB0aGlzIGRyaXZlciB3YXMgZGlyZWN0bHkgc3RvbGVuIGZyb20gRXJpayBILiBNb2UncyBQQ0kKKyAqIFFsb2dpYyBJU1AgZHJpdmVyLiAgTXVjaG8ga3Vkb3MgdG8gaGltIGZvciB0aGlzIGNvZGUuCisgKgorICogQW4gZXZlbiBiaWdnZXIga3Vkb3MgdG8gSm9obiBHcmFuYSBhdCBQZXJmb3JtYW5jZSBUZWNobm9sb2dpZXMKKyAqIGZvciBwcm92aWRpbmcgbWUgd2l0aCB0aGUgaGFyZHdhcmUgdG8gd3JpdGUgdGhpcyBkcml2ZXIsIHlvdSBydWxlCisgKiBKb2huIHlvdSByZWFsbHkgZG8uCisgKgorICogTWF5LCAyLCAxOTk3OiBBZGRlZCBzdXBwb3J0IGZvciBRTEdDLGlzcCAtLWpqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgInFsb2dpY3B0aS5oIgorCisjaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKworCisjZGVmaW5lIE1BWF9UQVJHRVRTCTE2CisjZGVmaW5lIE1BWF9MVU5TCTgJLyogMzIgZm9yIDEuMzEgRi9XICovCisKKyNkZWZpbmUgREVGQVVMVF9MT09QX0NPVU5UCTEwMDAwCisKKyNpbmNsdWRlICJxbG9naWNwdGlfYXNtLmMiCisKK3N0YXRpYyBzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpY2hhaW4gPSBOVUxMOworc3RhdGljIERFRklORV9TUElOTE9DSyhxcHRpY2hhaW5fbG9jayk7CitzdGF0aWMgaW50IHFwdGlzX3J1bm5pbmcgPSAwOworCisjZGVmaW5lIFBBQ0tCKGEsIGIpCQkJKCgoYSk8PDQpfChiKSkKKworc3RhdGljIGNvbnN0IHVfY2hhciBtYm94X3BhcmFtW10gPSB7CisJUEFDS0IoMSwgMSksCS8qIE1CT1hfTk9fT1AgKi8KKwlQQUNLQig1LCA1KSwJLyogTUJPWF9MT0FEX1JBTSAqLworCVBBQ0tCKDIsIDApLAkvKiBNQk9YX0VYRUNfRklSTVdBUkUgKi8KKwlQQUNLQig1LCA1KSwJLyogTUJPWF9EVU1QX1JBTSAqLworCVBBQ0tCKDMsIDMpLAkvKiBNQk9YX1dSSVRFX1JBTV9XT1JEICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfUkVBRF9SQU1fV09SRCAqLworCVBBQ0tCKDYsIDYpLAkvKiBNQk9YX01BSUxCT1hfUkVHX1RFU1QgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9WRVJJRllfQ0hFQ0tTVU0JKi8KKwlQQUNLQigxLCAzKSwJLyogTUJPWF9BQk9VVF9GSVJNV0FSRSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMDkgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBhICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAwYiAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMGMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBkICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfQ0hFQ0tfRklSTVdBUkUgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDBmICovCisJUEFDS0IoNSwgNSksCS8qIE1CT1hfSU5JVF9SRVFfUVVFVUUgKi8KKwlQQUNLQig2LCA2KSwJLyogTUJPWF9JTklUX1JFU19RVUVVRSAqLworCVBBQ0tCKDQsIDQpLAkvKiBNQk9YX0VYRUNVVEVfSU9DQiAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1dBS0VfVVAJKi8KKwlQQUNLQigxLCA2KSwJLyogTUJPWF9TVE9QX0ZJUk1XQVJFICovCisJUEFDS0IoNCwgNCksCS8qIE1CT1hfQUJPUlQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9BQk9SVF9ERVZJQ0UgKi8KKwlQQUNLQigzLCAzKSwJLyogTUJPWF9BQk9SVF9UQVJHRVQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9CVVNfUkVTRVQgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9TVE9QX1FVRVVFICovCisJUEFDS0IoMiwgMyksCS8qIE1CT1hfU1RBUlRfUVVFVUUgKi8KKwlQQUNLQigyLCAzKSwJLyogTUJPWF9TSU5HTEVfU1RFUF9RVUVVRSAqLworCVBBQ0tCKDIsIDMpLAkvKiBNQk9YX0FCT1JUX1FVRVVFICovCisJUEFDS0IoMiwgNCksCS8qIE1CT1hfR0VUX0RFVl9RVUVVRV9TVEFUVVMgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDFlICovCisJUEFDS0IoMSwgMyksCS8qIE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRVUyAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9JTklUX1NDU0lfSUQgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfU0VMRUNUX1RJTUVPVVQgKi8KKwlQQUNLQigxLCAzKSwJLyogTUJPWF9HRVRfUkVUUllfQ09VTlQJKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfVEFHX0FHRV9MSU1JVCAqLworCVBBQ0tCKDEsIDIpLAkvKiBNQk9YX0dFVF9DTE9DS19SQVRFICovCisJUEFDS0IoMSwgMiksCS8qIE1CT1hfR0VUX0FDVF9ORUdfU1RBVEUgKi8KKwlQQUNLQigxLCAyKSwJLyogTUJPWF9HRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FICovCisJUEFDS0IoMSwgMyksCS8qIE1CT1hfR0VUX1NCVVNfUEFSQU1TICovCisJUEFDS0IoMiwgNCksCS8qIE1CT1hfR0VUX1RBUkdFVF9QQVJBTVMgKi8KKwlQQUNLQigyLCA0KSwJLyogTUJPWF9HRVRfREVWX1FVRVVFX1BBUkFNUyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmEgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJiICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyYyAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwMmQgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDJlICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAyZiAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9JTklUX1NDU0lfSUQgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfU0VMRUNUX1RJTUVPVVQgKi8KKwlQQUNLQigzLCAzKSwJLyogTUJPWF9TRVRfUkVUUllfQ09VTlQJKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfVEFHX0FHRV9MSU1JVCAqLworCVBBQ0tCKDIsIDIpLAkvKiBNQk9YX1NFVF9DTE9DS19SQVRFICovCisJUEFDS0IoMiwgMiksCS8qIE1CT1hfU0VUX0FDVElWRV9ORUdfU1RBVEUgKi8KKwlQQUNLQigyLCAyKSwJLyogTUJPWF9TRVRfQVNZTkNfREFUQV9TRVRVUF9USU1FICovCisJUEFDS0IoMywgMyksCS8qIE1CT1hfU0VUX1NCVVNfQ09OVFJPTF9QQVJBTVMgKi8KKwlQQUNLQig0LCA0KSwJLyogTUJPWF9TRVRfVEFSR0VUX1BBUkFNUyAqLworCVBBQ0tCKDQsIDQpLAkvKiBNQk9YX1NFVF9ERVZfUVVFVUVfUEFSQU1TICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzYSAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2IgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNjICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDAzZCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwM2UgKi8KKwlQQUNLQigwLCAwKSwJLyogMHgwMDNmICovCisJUEFDS0IoMCwgMCksCS8qIDB4MDA0MCAqLworCVBBQ0tCKDAsIDApLAkvKiAweDAwNDEgKi8KKwlQQUNLQigwLCAwKQkvKiAweDAwNDIgKi8KK307CisKKyNkZWZpbmUgTUFYX01CT1hfQ09NTUFORAkoc2l6ZW9mKG1ib3hfcGFyYW0pL3NpemVvZih1X3Nob3J0KSkKKworLyogcXVldWUgbGVuZ3RoJ3MgX211c3RfIGJlIHBvd2VyIG9mIHR3bzogKi8KKyNkZWZpbmUgUVVFVUVfREVQVEgoaW4sIG91dCwgcWwpCSgoaW4gLSBvdXQpICYgKHFsKSkKKyNkZWZpbmUgUkVRX1FVRVVFX0RFUFRIKGluLCBvdXQpCVFVRVVFX0RFUFRIKGluLCBvdXQsIAkJICAgICBcCisJCQkJCQkgICAgUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pCisjZGVmaW5lIFJFU19RVUVVRV9ERVBUSChpbiwgb3V0KQlRVUVVRV9ERVBUSChpbiwgb3V0LCBSRVNfUVVFVUVfTEVOKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWxvZ2ljcHRpX2VuYWJsZV9pcnFzKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc2J1c193cml0ZXcoU0JVU19DVFJMX0VSSVJRIHwgU0JVU19DVFJMX0dFTkFCLAorCQkgICAgcXB0aS0+cXJlZ3MgKyBTQlVTX0NUUkwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWxvZ2ljcHRpX2Rpc2FibGVfaXJxcyhzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXNidXNfd3JpdGV3KDAsIHFwdGktPnFyZWdzICsgU0JVU19DVFJMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zYnVzX2NmZzEoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwl1MTYgdmFsOworCXU4IGJ1cnN0cyA9IHFwdGktPmJ1cnN0czsKKworI2lmIDAJLyogSXQgYXBwZWFycyB0aGF0IGF0IGxlYXN0IFBUSSBjYXJkcyBkbyBub3Qgc3VwcG9ydAorCSAqIDY0LWJ5dGUgYnVyc3RzIGFuZCB0aGF0IHNldHRpbmcgdGhlIEI2NCBiaXQgYWN0dWFsbHkKKwkgKiBpcyBhIG5vcCBhbmQgdGhlIGNoaXAgZW5kcyB1cCB1c2luZyB0aGUgc21hbGxlc3QgYnVyc3QKKwkgKiBzaXplLiAtRGF2ZU0KKwkgKi8KKwlpZiAoc2J1c19jYW5fYnVyc3Q2NChxcHRpLT5zZGV2KSAmJiAoYnVyc3RzICYgRE1BX0JVUlNUNjQpKSB7CisJCXZhbCA9IChTQlVTX0NGRzFfQkVOQUIgfCBTQlVTX0NGRzFfQjY0KTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChidXJzdHMgJiBETUFfQlVSU1QzMikgeworCQl2YWwgPSAoU0JVU19DRkcxX0JFTkFCIHwgU0JVU19DRkcxX0IzMik7CisJfSBlbHNlIGlmIChidXJzdHMgJiBETUFfQlVSU1QxNikgeworCQl2YWwgPSAoU0JVU19DRkcxX0JFTkFCIHwgU0JVU19DRkcxX0IxNik7CisJfSBlbHNlIGlmIChidXJzdHMgJiBETUFfQlVSU1Q4KSB7CisJCXZhbCA9IChTQlVTX0NGRzFfQkVOQUIgfCBTQlVTX0NGRzFfQjgpOworCX0gZWxzZSB7CisJCXZhbCA9IDA7IC8qIE5vIHNidXMgYnVyc3RzIGZvciB5b3UuLi4gKi8KKwl9CisJc2J1c193cml0ZXcodmFsLCBxcHRpLT5xcmVncyArIFNCVVNfQ0ZHMSk7Cit9CisKK3N0YXRpYyBpbnQgcWxvZ2ljcHRpX21ib3hfY29tbWFuZChzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpLCB1X3Nob3J0IHBhcmFtW10sIGludCBmb3JjZSkKK3sKKwlpbnQgbG9vcF9jb3VudDsKKwl1MTYgdG1wOworCisJaWYgKG1ib3hfcGFyYW1bcGFyYW1bMF1dID09IDApCisJCXJldHVybiAxOworCisJLyogU2V0IFNCVVMgc2VtYXBob3JlLiAqLworCXRtcCA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBTQlVTX1NFTUFQSE9SRSk7CisJdG1wIHw9IFNCVVNfU0VNQVBIT1JFX0xDSzsKKwlzYnVzX3dyaXRldyh0bXAsIHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpOworCisJLyogV2FpdCBmb3IgaG9zdCBJUlEgYml0IHRvIGNsZWFyLiAqLworCWxvb3BfY291bnQgPSBERUZBVUxUX0xPT1BfQ09VTlQ7CisJd2hpbGUgKC0tbG9vcF9jb3VudCAmJiAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIEhDQ1RSTCkgJiBIQ0NUUkxfSElSUSkpIHsKKwkJYmFycmllcigpOworCQljcHVfcmVsYXgoKTsKKwl9CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpOiBtYm94X2NvbW1hbmQgbG9vcCB0aW1lb3V0ICMxXG4iKTsKKworCS8qIFdyaXRlIG1haWxib3ggY29tbWFuZCByZWdpc3RlcnMuICovCisJc3dpdGNoIChtYm94X3BhcmFtW3BhcmFtWzBdXSA+PiA0KSB7CisJY2FzZSA2OiBzYnVzX3dyaXRldyhwYXJhbVs1XSwgcXB0aS0+cXJlZ3MgKyBNQk9YNSk7CisJY2FzZSA1OiBzYnVzX3dyaXRldyhwYXJhbVs0XSwgcXB0aS0+cXJlZ3MgKyBNQk9YNCk7CisJY2FzZSA0OiBzYnVzX3dyaXRldyhwYXJhbVszXSwgcXB0aS0+cXJlZ3MgKyBNQk9YMyk7CisJY2FzZSAzOiBzYnVzX3dyaXRldyhwYXJhbVsyXSwgcXB0aS0+cXJlZ3MgKyBNQk9YMik7CisJY2FzZSAyOiBzYnVzX3dyaXRldyhwYXJhbVsxXSwgcXB0aS0+cXJlZ3MgKyBNQk9YMSk7CisJY2FzZSAxOiBzYnVzX3dyaXRldyhwYXJhbVswXSwgcXB0aS0+cXJlZ3MgKyBNQk9YMCk7CisJfQorCisJLyogQ2xlYXIgUklTQyBpbnRlcnJ1cHQuICovCisJdG1wID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIEhDQ1RSTCk7CisJdG1wIHw9IEhDQ1RSTF9DUklSUTsKKwlzYnVzX3dyaXRldyh0bXAsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKworCS8qIENsZWFyIFNCVVMgc2VtYXBob3JlLiAqLworCXNidXNfd3JpdGV3KDAsIHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpOworCisJLyogU2V0IEhPU1QgaW50ZXJydXB0LiAqLworCXRtcCA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCXRtcCB8PSBIQ0NUUkxfU0hJUlE7CisJc2J1c193cml0ZXcodG1wLCBxcHRpLT5xcmVncyArIEhDQ1RSTCk7CisKKwkvKiBXYWl0IGZvciBIT1NUIGludGVycnVwdCBjbGVhcnMuICovCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmCisJICAgICAgIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgSENDVFJMKSAmIEhDQ1RSTF9DUklSUSkpCisJCXVkZWxheSgyMCk7CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpOiBtYm94X2NvbW1hbmRbJTA0eF0gbG9vcCB0aW1lb3V0ICMyXG4iLAorCQkgICAgICAgcGFyYW1bMF0pOworCisJLyogV2FpdCBmb3IgU0JVUyBzZW1hcGhvcmUgdG8gZ2V0IHNldC4gKi8KKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYKKwkgICAgICAgIShzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpICYgU0JVU19TRU1BUEhPUkVfTENLKSkgeworCQl1ZGVsYXkoMjApOworCisJCS8qIFdvcmthcm91bmQgZm9yIHNvbWUgYnVnZ3kgY2hpcHMuICovCisJCWlmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgTUJPWDApICYgMHg0MDAwKQorCQkJYnJlYWs7CisJfQorCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aTogbWJveF9jb21tYW5kWyUwNHhdIGxvb3AgdGltZW91dCAjM1xuIiwKKwkJICAgICAgIHBhcmFtWzBdKTsKKworCS8qIFdhaXQgZm9yIE1CT1ggYnVzeSBjb25kaXRpb24gdG8gZ28gYXdheS4gKi8KKwlsb29wX2NvdW50ID0gREVGQVVMVF9MT09QX0NPVU5UOworCXdoaWxlICgtLWxvb3BfY291bnQgJiYgKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YMCkgPT0gMHgwNCkpCisJCXVkZWxheSgyMCk7CisJaWYgKCFsb29wX2NvdW50KQorCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpOiBtYm94X2NvbW1hbmRbJTA0eF0gbG9vcCB0aW1lb3V0ICM0XG4iLAorCQkgICAgICAgcGFyYW1bMF0pOworCisJLyogUmVhZCBiYWNrIG91dHB1dCBwYXJhbWV0ZXJzLiAqLworCXN3aXRjaCAobWJveF9wYXJhbVtwYXJhbVswXV0gJiAweGYpIHsKKwljYXNlIDY6IHBhcmFtWzVdID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1g1KTsKKwljYXNlIDU6IHBhcmFtWzRdID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1g0KTsKKwljYXNlIDQ6IHBhcmFtWzNdID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gzKTsKKwljYXNlIDM6IHBhcmFtWzJdID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gyKTsKKwljYXNlIDI6IHBhcmFtWzFdID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gxKTsKKwljYXNlIDE6IHBhcmFtWzBdID0gc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gwKTsKKwl9CisKKwkvKiBDbGVhciBSSVNDIGludGVycnVwdC4gKi8KKwl0bXAgPSBzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwl0bXAgfD0gSENDVFJMX0NSSVJROworCXNidXNfd3JpdGV3KHRtcCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogUmVsZWFzZSBTQlVTIHNlbWFwaG9yZS4gKi8KKwl0bXAgPSBzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpOworCXRtcCAmPSB+KFNCVVNfU0VNQVBIT1JFX0xDSyk7CisJc2J1c193cml0ZXcodG1wLCBxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKTsKKworCS8qIFdlJ3JlIGRvbmUuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxbG9naWNwdGlfc2V0X2hvc3RkZXZfZGVmYXVsdHMoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlpbnQgaTsKKworCXFwdGktPmhvc3RfcGFyYW0uaW5pdGlhdG9yX3Njc2lfaWQgPSBxcHRpLT5zY3NpX2lkOworCXFwdGktPmhvc3RfcGFyYW0uYnVzX3Jlc2V0X2RlbGF5ID0gMzsKKwlxcHRpLT5ob3N0X3BhcmFtLnJldHJ5X2NvdW50ID0gMDsKKwlxcHRpLT5ob3N0X3BhcmFtLnJldHJ5X2RlbGF5ID0gNTsKKwlxcHRpLT5ob3N0X3BhcmFtLmFzeW5jX2RhdGFfc2V0dXBfdGltZSA9IDM7CisJcXB0aS0+aG9zdF9wYXJhbS5yZXFfYWNrX2FjdGl2ZV9uZWdhdGlvbiA9IDE7CisJcXB0aS0+aG9zdF9wYXJhbS5kYXRhX2xpbmVfYWN0aXZlX25lZ2F0aW9uID0gMTsKKwlxcHRpLT5ob3N0X3BhcmFtLmRhdGFfZG1hX2J1cnN0X2VuYWJsZSA9IDE7CisJcXB0aS0+aG9zdF9wYXJhbS5jb21tYW5kX2RtYV9idXJzdF9lbmFibGUgPSAxOworCXFwdGktPmhvc3RfcGFyYW0udGFnX2FnaW5nID0gODsKKwlxcHRpLT5ob3N0X3BhcmFtLnNlbGVjdGlvbl90aW1lb3V0ID0gMjUwOworCXFwdGktPmhvc3RfcGFyYW0ubWF4X3F1ZXVlX2RlcHRoID0gMjU2OworCisJZm9yKGkgPSAwOyBpIDwgTUFYX1RBUkdFVFM7IGkrKykgeworCQkvKgorCQkgKiBkaXNjb25uZWN0LCBwYXJpdHksIGFycSwgcmVuZWcgb24gcmVzZXQsIGFuZCwgb2RkbHkgZW5vdWdoCisJCSAqIHRhZ3MuLi50aGUgbWlkbGF5ZXIncyBub3Rpb24gb2YgdGFnZ2VkIHN1cHBvcnQgaGFzIHRvIG1hdGNoCisJCSAqIG91ciBkZXZpY2Ugc2V0dGluZ3MsIGFuZCBzaW5jZSB3ZSBiYXNlIHdoZXRoZXIgd2UgZW5hYmxlIGEKKwkJICogdGFnIG9uIGEgIHBlci1jbW5kIGJhc2lzIHVwb24gd2hhdCB0aGUgbWlkbGF5ZXIgc2V6LCB3ZQorCQkgKiBhY3R1YWxseSBlbmFibGUgdGhlIGNhcGFiaWxpdHkgaGVyZS4KKwkJICovCisJCXFwdGktPmRldl9wYXJhbVtpXS5kZXZpY2VfZmxhZ3MgPSAweGNkOworCQlxcHRpLT5kZXZfcGFyYW1baV0uZXhlY3V0aW9uX3Rocm90dGxlID0gMTY7CisJCWlmIChxcHRpLT51bHRyYSkgeworCQkJcXB0aS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX3BlcmlvZCA9IDEyOworCQkJcXB0aS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX29mZnNldCA9IDg7CisJCX0gZWxzZSB7CisJCQlxcHRpLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfcGVyaW9kID0gMjU7CisJCQlxcHRpLT5kZXZfcGFyYW1baV0uc3luY2hyb25vdXNfb2Zmc2V0ID0gMTI7CisJCX0KKwkJcXB0aS0+ZGV2X3BhcmFtW2ldLmRldmljZV9lbmFibGUgPSAxOworCX0KKwkvKiB0aGlzIGlzIHZlcnkgaW1wb3J0YW50IHRvIHNldCEgKi8KKwlxcHRpLT5zYml0cyA9IDEgPDwgcXB0aS0+c2NzaV9pZDsKK30KKworc3RhdGljIGludCBxbG9naWNwdGlfcmVzZXRfaGFyZHdhcmUoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gKHN0cnVjdCBxbG9naWNwdGkgKikgaG9zdC0+aG9zdGRhdGE7CisJdV9zaG9ydCBwYXJhbVs2XTsKKwl1bnNpZ25lZCBzaG9ydCByaXNjX2NvZGVfYWRkcjsKKwlpbnQgbG9vcF9jb3VudCwgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmlzY19jb2RlX2FkZHIgPSAweDEwMDA7CS8qIGFsbCBsb2FkIGFkZHJlc3NlcyBhcmUgYXQgMHgxMDAwICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXNidXNfd3JpdGV3KEhDQ1RSTF9QQVVTRSwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogT25seSByZXNldCB0aGUgc2NzaSBidXMgaWYgaXQgaXMgbm90IGZyZWUuICovCisJaWYgKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBDUFVfUENUUkwpICYgQ1BVX1BDVFJMX0JTWSkgeworCQlzYnVzX3dyaXRldyhDUFVfT1JJREVfUk1PRCwgcXB0aS0+cXJlZ3MgKyBDUFVfT1JJREUpOworCQlzYnVzX3dyaXRldyhDUFVfQ01EX0JSRVNFVCwgcXB0aS0+cXJlZ3MgKyBDUFVfQ01EKTsKKwkJdWRlbGF5KDQwMCk7CisJfQorCisJc2J1c193cml0ZXcoU0JVU19DVFJMX1JFU0VULCBxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCk7CisJc2J1c193cml0ZXcoKERNQV9DVFJMX0NDTEVBUiB8IERNQV9DVFJMX0NJUlEpLCBxcHRpLT5xcmVncyArIENNRF9ETUFfQ1RSTCk7CisJc2J1c193cml0ZXcoKERNQV9DVFJMX0NDTEVBUiB8IERNQV9DVFJMX0NJUlEpLCBxcHRpLT5xcmVncyArIERBVEFfRE1BX0NUUkwpOworCisJbG9vcF9jb3VudCA9IERFRkFVTFRfTE9PUF9DT1VOVDsKKwl3aGlsZSAoLS1sb29wX2NvdW50ICYmICgoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gwKSAmIDB4ZmYpID09IDB4MDQpKQorCQl1ZGVsYXkoMjApOworCWlmICghbG9vcF9jb3VudCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFsb2dpY3B0aTogcmVzZXRfaGFyZHdhcmUgbG9vcCB0aW1lb3V0XG4iKTsKKworCXNidXNfd3JpdGV3KEhDQ1RSTF9QQVVTRSwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCXNldF9zYnVzX2NmZzEocXB0aSk7CisJcWxvZ2ljcHRpX2VuYWJsZV9pcnFzKHFwdGkpOworCisJaWYgKHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBSSVNDX1BTUikgJiBSSVNDX1BTUl9VTFRSQSkgeworCQlxcHRpLT51bHRyYSA9IDE7CisJCXNidXNfd3JpdGV3KChSSVNDX01UUkVHX1AwVUxUUkEgfCBSSVNDX01UUkVHX1AxVUxUUkEpLAorCQkJICAgIHFwdGktPnFyZWdzICsgUklTQ19NVFJFRyk7CisJfSBlbHNlIHsKKwkJcXB0aS0+dWx0cmEgPSAwOworCQlzYnVzX3dyaXRldygoUklTQ19NVFJFR19QMERGTFQgfCBSSVNDX01UUkVHX1AxREZMVCksCisJCQkgICAgcXB0aS0+cXJlZ3MgKyBSSVNDX01UUkVHKTsKKwl9CisKKwkvKiByZXNldCBhZGFwdGVyIGFuZCBwZXItZGV2aWNlIGRlZmF1bHQgdmFsdWVzLiAqLworCS8qIGRvIGl0IGFmdGVyIGZpbmRpbmcgb3V0IHdoZXRoZXIgd2UncmUgdWx0cmEgbW9kZSBjYXBhYmxlICovCisJcWxvZ2ljcHRpX3NldF9ob3N0ZGV2X2RlZmF1bHRzKHFwdGkpOworCisJLyogUmVsZWFzZSB0aGUgUklTQyBwcm9jZXNzb3IuICovCisJc2J1c193cml0ZXcoSENDVFJMX1JFTCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogR2V0IFJJU0MgdG8gc3RhcnQgZXhlY3V0aW5nIHRoZSBmaXJtd2FyZSBjb2RlLiAqLworCXBhcmFtWzBdID0gTUJPWF9FWEVDX0ZJUk1XQVJFOworCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHI7CisJaWYgKHFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDEpKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNwdGklZDogQ2Fubm90IGV4ZWN1dGUgSVNQIGZpcm13YXJlLlxuIiwKKwkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTZXQgaW5pdGlhdG9yIHNjc2kgSUQuICovCisJcGFyYW1bMF0gPSBNQk9YX1NFVF9JTklUX1NDU0lfSUQ7CisJcGFyYW1bMV0gPSBxcHRpLT5ob3N0X3BhcmFtLmluaXRpYXRvcl9zY3NpX2lkOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSB8fAorCSAgIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNwdGklZDogQ2Fubm90IHNldCBpbml0aWF0b3IgU0NTSSBJRC5cbiIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzdGF0ZSBvZiB0aGUgcXVldWVzLCBib3RoIGh3IGFuZCBzdy4gKi8KKwlxcHRpLT5yZXFfaW5fcHRyID0gcXB0aS0+cmVzX291dF9wdHIgPSAwOworCisJcGFyYW1bMF0gPSBNQk9YX0lOSVRfUkVTX1FVRVVFOworCXBhcmFtWzFdID0gUkVTX1FVRVVFX0xFTiArIDE7CisJcGFyYW1bMl0gPSAodV9zaG9ydCkgKHFwdGktPnJlc19kdm1hID4+IDE2KTsKKwlwYXJhbVszXSA9ICh1X3Nob3J0KSAocXB0aS0+cmVzX2R2bWEgJiAweGZmZmYpOworCXBhcmFtWzRdID0gcGFyYW1bNV0gPSAwOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IENhbm5vdCBpbml0IHJlc3BvbnNlIHF1ZXVlLlxuIiwKKwkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwYXJhbVswXSA9IE1CT1hfSU5JVF9SRVFfUVVFVUU7CisJcGFyYW1bMV0gPSBRTE9HSUNQVElfUkVRX1FVRVVFX0xFTiArIDE7CisJcGFyYW1bMl0gPSAodV9zaG9ydCkgKHFwdGktPnJlcV9kdm1hID4+IDE2KTsKKwlwYXJhbVszXSA9ICh1X3Nob3J0KSAocXB0aS0+cmVxX2R2bWEgJiAweGZmZmYpOworCXBhcmFtWzRdID0gcGFyYW1bNV0gPSAwOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IENhbm5vdCBpbml0IHJlcXVlc3QgcXVldWUuXG4iLAorCQkgICAgICAgcXB0aS0+cXB0aV9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCXBhcmFtWzBdID0gTUJPWF9TRVRfUkVUUllfQ09VTlQ7CisJcGFyYW1bMV0gPSBxcHRpLT5ob3N0X3BhcmFtLnJldHJ5X2NvdW50OworCXBhcmFtWzJdID0gcXB0aS0+aG9zdF9wYXJhbS5yZXRyeV9kZWxheTsKKwlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKworCXBhcmFtWzBdID0gTUJPWF9TRVRfVEFHX0FHRV9MSU1JVDsKKwlwYXJhbVsxXSA9IHFwdGktPmhvc3RfcGFyYW0udGFnX2FnaW5nOworCXFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDApOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UQVJHRVRTOyBpKyspIHsKKwkJcGFyYW1bMF0gPSBNQk9YX0dFVF9ERVZfUVVFVUVfUEFSQU1TOworCQlwYXJhbVsxXSA9IChpIDw8IDgpOworCQlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKwl9CisKKwlwYXJhbVswXSA9IE1CT1hfR0VUX0ZJUk1XQVJFX1NUQVRVUzsKKwlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKworCXBhcmFtWzBdID0gTUJPWF9TRVRfU0VMRUNUX1RJTUVPVVQ7CisJcGFyYW1bMV0gPSBxcHRpLT5ob3N0X3BhcmFtLnNlbGVjdGlvbl90aW1lb3V0OworCXFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDApOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UQVJHRVRTOyBpKyspIHsKKwkJcGFyYW1bMF0gPSBNQk9YX1NFVF9UQVJHRVRfUEFSQU1TOworCQlwYXJhbVsxXSA9IChpIDw8IDgpOworCQlwYXJhbVsyXSA9IChxcHRpLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzIDw8IDgpOworCQkvKgorCQkgKiBTaW5jZSB3ZSdyZSBub3cgbG9hZGluZyAxLjMxIGYvdywgZm9yY2UgbmFycm93L2FzeW5jLgorCQkgKi8KKwkJcGFyYW1bMl0gfD0gMHhjMDsKKwkJcGFyYW1bM10gPSAwOwkvKiBubyBvZmZzZXQsIHdlIGRvIG5vdCBoYXZlIHN5bmMgbW9kZSB5ZXQgKi8KKwkJcWxvZ2ljcHRpX21ib3hfY29tbWFuZChxcHRpLCBwYXJhbSwgMCk7CisJfQorCisJLyoKKwkgKiBBbHdheXMgKHNpZ2gpIGRvIGFuIGluaXRpYWwgYnVzIHJlc2V0IChraWNrcyBmL3cpLgorCSAqLworCXBhcmFtWzBdID0gTUJPWF9CVVNfUkVTRVQ7CisJcGFyYW1bMV0gPSBxcHRpLT5ob3N0X3BhcmFtLmJ1c19yZXNldF9kZWxheTsKKwlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKwlxcHRpLT5zZW5kX21hcmtlciA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFBUSV9SRVNFVF9MSU1JVCA0MDAKKworc3RhdGljIGludCBfX2luaXQgcWxvZ2ljcHRpX2xvYWRfZmlybXdhcmUoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcXB0aS0+cWhvc3Q7CisJdW5zaWduZWQgc2hvcnQgY3N1bSA9IDA7CisJdW5zaWduZWQgc2hvcnQgcGFyYW1bNl07CisJdW5zaWduZWQgc2hvcnQgKnJpc2NfY29kZSwgcmlzY19jb2RlX2FkZHIsIHJpc2NfY29kZV9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgdGltZW91dDsKKworCXJpc2NfY29kZSA9ICZzYnVzX3Jpc2NfY29kZTAxWzBdOworCXJpc2NfY29kZV9hZGRyID0gMHgxMDAwOwkvKiBhbGwgZi93IG1vZHVsZXMgbG9hZCBhdCAweDEwMDAgKi8KKwlyaXNjX2NvZGVfbGVuZ3RoID0gc2J1c19yaXNjX2NvZGVfbGVuZ3RoMDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCS8qIFZlcmlmeSB0aGUgY2hlY2tzdW0gdHdpY2UsIG9uZSBiZWZvcmUgbG9hZGluZyBpdCwgYW5kIG9uY2UKKwkgKiBhZnRlcndhcmRzIHZpYSB0aGUgbWFpbGJveCBjb21tYW5kcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmlzY19jb2RlX2xlbmd0aDsgaSsrKQorCQljc3VtICs9IHJpc2NfY29kZVtpXTsKKwlpZiAoY3N1bSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IEFpZWVlLCBmaXJtd2FyZSBjaGVja3N1bSBmYWlsZWQhIiwKKwkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQlyZXR1cm4gMTsKKwl9CQkKKwlzYnVzX3dyaXRldyhTQlVTX0NUUkxfUkVTRVQsIHFwdGktPnFyZWdzICsgU0JVU19DVFJMKTsKKwlzYnVzX3dyaXRldygoRE1BX0NUUkxfQ0NMRUFSIHwgRE1BX0NUUkxfQ0lSUSksIHFwdGktPnFyZWdzICsgQ01EX0RNQV9DVFJMKTsKKwlzYnVzX3dyaXRldygoRE1BX0NUUkxfQ0NMRUFSIHwgRE1BX0NUUkxfQ0lSUSksIHFwdGktPnFyZWdzICsgREFUQV9ETUFfQ1RSTCk7CisJdGltZW91dCA9IFBUSV9SRVNFVF9MSU1JVDsKKwl3aGlsZSAoLS10aW1lb3V0ICYmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgU0JVU19DVFJMKSAmIFNCVVNfQ1RSTF9SRVNFVCkpCisJCXVkZWxheSgyMCk7CisJaWYgKCF0aW1lb3V0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNwdGklZDogQ2Fubm90IHJlc2V0IHRoZSBJU1AuIiwgcXB0aS0+cXB0aV9pZCk7CisJCXJldHVybiAxOworCX0KKworCXNidXNfd3JpdGV3KEhDQ1RSTF9SRVNFVCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCW1kZWxheSgxKTsKKworCXNidXNfd3JpdGV3KChTQlVTX0NUUkxfR0VOQUIgfCBTQlVTX0NUUkxfRVJJUlEpLCBxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCk7CisJc2V0X3NidXNfY2ZnMShxcHRpKTsKKwlzYnVzX3dyaXRldygwLCBxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKTsKKworCWlmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgUklTQ19QU1IpICYgUklTQ19QU1JfVUxUUkEpIHsKKwkJcXB0aS0+dWx0cmEgPSAxOworCQlzYnVzX3dyaXRldygoUklTQ19NVFJFR19QMFVMVFJBIHwgUklTQ19NVFJFR19QMVVMVFJBKSwKKwkJCSAgICBxcHRpLT5xcmVncyArIFJJU0NfTVRSRUcpOworCX0gZWxzZSB7CisJCXFwdGktPnVsdHJhID0gMDsKKwkJc2J1c193cml0ZXcoKFJJU0NfTVRSRUdfUDBERkxUIHwgUklTQ19NVFJFR19QMURGTFQpLAorCQkJICAgIHFwdGktPnFyZWdzICsgUklTQ19NVFJFRyk7CisJfQorCisJc2J1c193cml0ZXcoSENDVFJMX1JFTCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogUGluIGxpbmVzIGFyZSBvbmx5IHN0YWJsZSB3aGlsZSBSSVNDIGlzIHBhdXNlZC4gKi8KKwlzYnVzX3dyaXRldyhIQ0NUUkxfUEFVU0UsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwlpZiAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIENQVV9QRElGRikgJiBDUFVfUERJRkZfTU9ERSkKKwkJcXB0aS0+ZGlmZmVyZW50aWFsID0gMTsKKwllbHNlCisJCXFwdGktPmRpZmZlcmVudGlhbCA9IDA7CisJc2J1c193cml0ZXcoSENDVFJMX1JFTCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LSB3ZSd2ZSByZXNldCB0aGluZ3Mgc28gd2Ugc2hvdWxkIGJlCisJICAgcnVubmluZyBmcm9tIHRoZSBST00gbm93Li4gKi8KKworCXBhcmFtWzBdID0gTUJPWF9TVE9QX0ZJUk1XQVJFOworCXBhcmFtWzFdID0gcGFyYW1bMl0gPSBwYXJhbVszXSA9IHBhcmFtWzRdID0gcGFyYW1bNV0gPSAwOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IENhbm5vdCBzdG9wIGZpcm13YXJlIGZvciByZWxvYWQuXG4iLAorCQkgICAgICAgcXB0aS0+cXB0aV9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0JCQorCisJLyogTG9hZCBpdCB1cC4uICovCisJZm9yIChpID0gMDsgaSA8IHJpc2NfY29kZV9sZW5ndGg7IGkrKykgeworCQlwYXJhbVswXSA9IE1CT1hfV1JJVEVfUkFNX1dPUkQ7CisJCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHIgKyBpOworCQlwYXJhbVsyXSA9IHJpc2NfY29kZVtpXTsKKwkJaWYgKHFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDEpIHx8CisJCSAgICBwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpIHsKKwkJCXByaW50aygicWxvZ2ljcHRpJWQ6IEZpcm13YXJlIGRsb2FkIGZhaWxlZCwgSSdtIGJvbGl4ZWQhXG4iLAorCQkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogUmVzZXQgdGhlIElTUCBhZ2Fpbi4gKi8KKwlzYnVzX3dyaXRldyhIQ0NUUkxfUkVTRVQsIHFwdGktPnFyZWdzICsgSENDVFJMKTsKKwltZGVsYXkoMSk7CisKKwlxbG9naWNwdGlfZW5hYmxlX2lycXMocXB0aSk7CisJc2J1c193cml0ZXcoMCwgcXB0aS0+cXJlZ3MgKyBTQlVTX1NFTUFQSE9SRSk7CisJc2J1c193cml0ZXcoSENDVFJMX1JFTCwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCisJLyogQXNrIElTUCB0byB2ZXJpZnkgdGhlIGNoZWNrc3VtIG9mIHRoZSBuZXcgY29kZS4gKi8KKwlwYXJhbVswXSA9IE1CT1hfVkVSSUZZX0NIRUNLU1VNOworCXBhcmFtWzFdID0gcmlzY19jb2RlX2FkZHI7CisJaWYgKHFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDEpIHx8CisJICAgIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNwdGklZDogTmV3IGZpcm13YXJlIGNzdW0gZmFpbHVyZSFcbiIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU3RhcnQgdXNpbmcgbmV3bHkgZG93bmxvYWRlZCBmaXJtd2FyZS4gKi8KKwlwYXJhbVswXSA9IE1CT1hfRVhFQ19GSVJNV0FSRTsKKwlwYXJhbVsxXSA9IHJpc2NfY29kZV9hZGRyOworCXFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDEpOworCisJcGFyYW1bMF0gPSBNQk9YX0FCT1VUX0ZJUk1XQVJFOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSB8fAorCSAgICAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IEFib3V0RmlybXdhcmUgY21kIGZhaWxzLlxuIiwKKwkJICAgICAgIHFwdGktPnFwdGlfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTbmFnIHRoZSBtYWpvciBhbmQgbWlub3IgcmV2aXNpb25zIGZyb20gdGhlIHJlc3VsdC4gKi8KKwlxcHRpLT5md2FyZV9tYWpyZXYgPSBwYXJhbVsxXTsKKwlxcHRpLT5md2FyZV9taW5yZXYgPSBwYXJhbVsyXTsKKwlxcHRpLT5md2FyZV9taWNyZXYgPSBwYXJhbVszXTsKKworCS8qIFNldCB0aGUgY2xvY2sgcmF0ZSAqLworCXBhcmFtWzBdID0gTUJPWF9TRVRfQ0xPQ0tfUkFURTsKKwlwYXJhbVsxXSA9IHFwdGktPmNsb2NrOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKSB8fAorCSAgICAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IGNvdWxkIG5vdCBzZXQgY2xvY2sgcmF0ZS5cbiIsCisJCSAgICAgICBxcHRpLT5xcHRpX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHFwdGktPmlzX3B0aSAhPSAwKSB7CisJCS8qIExvYWQgc2NzaSBpbml0aWF0b3IgSUQgYW5kIGludGVycnVwdCBsZXZlbCBpbnRvIHNidXMgc3RhdGljIHJhbS4gKi8KKwkJcGFyYW1bMF0gPSBNQk9YX1dSSVRFX1JBTV9XT1JEOworCQlwYXJhbVsxXSA9IDB4ZmY4MDsKKwkJcGFyYW1bMl0gPSAodW5zaWduZWQgc2hvcnQpIHFwdGktPnNjc2lfaWQ7CisJCXFsb2dpY3B0aV9tYm94X2NvbW1hbmQocXB0aSwgcGFyYW0sIDEpOworCisJCXBhcmFtWzBdID0gTUJPWF9XUklURV9SQU1fV09SRDsKKwkJcGFyYW1bMV0gPSAweGZmMDA7CisJCXBhcmFtWzJdID0gKHVuc2lnbmVkIHNob3J0KSAzOworCQlxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAxKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV92ZXJpZnlfdG1vbihzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCWludCBjdXJzdGF0ID0gc2J1c19yZWFkYihxcHRpLT5zcmVnKTsKKworCWN1cnN0YXQgJj0gMHhmMDsKKwlpZiAoIShjdXJzdGF0ICYgU1JFR19GVVNFKSAmJiAocXB0aS0+c3dzcmVnICYgU1JFR19GVVNFKSkKKwkJcHJpbnRrKCJxbG9naWNwdGklZDogRnVzZSByZXR1cm5lZCB0byBub3JtYWwgc3RhdGUuXG4iLCBxcHRpLT5xcHRpX2lkKTsKKwlpZiAoIShjdXJzdGF0ICYgU1JFR19UUE9XRVIpICYmIChxcHRpLT5zd3NyZWcgJiBTUkVHX1RQT1dFUikpCisJCXByaW50aygicWxvZ2ljcHRpJWQ6IHRlcm1wd3IgYmFjayB0byBub3JtYWwgc3RhdGUuXG4iLCBxcHRpLT5xcHRpX2lkKTsKKwlpZiAoY3Vyc3RhdCAhPSBxcHRpLT5zd3NyZWcpIHsKKwkJaW50IGVycm9yID0gMDsKKwkJaWYgKGN1cnN0YXQgJiBTUkVHX0ZVU0UpIHsKKwkJCWVycm9yKys7CisJCQlwcmludGsoInFsb2dpY3B0aSVkOiBGdXNlIGlzIG9wZW4hXG4iLCBxcHRpLT5xcHRpX2lkKTsKKwkJfQorCQlpZiAoY3Vyc3RhdCAmIFNSRUdfVFBPV0VSKSB7CisJCQllcnJvcisrOworCQkJcHJpbnRrKCJxbG9naWNwdGklZDogdGVybXB3ciBmYWlsdXJlXG4iLCBxcHRpLT5xcHRpX2lkKTsKKwkJfQorCQlpZiAocXB0aS0+ZGlmZmVyZW50aWFsICYmCisJCSAgICAoY3Vyc3RhdCAmIFNSRUdfRFNFTlNFKSAhPSBTUkVHX0RTRU5TRSkgeworCQkJZXJyb3IrKzsKKwkJCXByaW50aygicWxvZ2ljcHRpJWQ6IFlvdSBoYXZlIGEgc2luZ2xlIGVuZGVkIGRldmljZSBvbiBhICIKKwkJCSAgICAgICAiZGlmZmVyZW50aWFsIGJ1cyEgIFBsZWFzZSBmaXghXG4iLCBxcHRpLT5xcHRpX2lkKTsKKwkJfQorCQlxcHRpLT5zd3NyZWcgPSBjdXJzdGF0OworCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcXB0aV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgdm9pZCBfX2luaXQgcXB0aV9jaGFpbl9hZGQoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlzcGluX2xvY2tfaXJxKCZxcHRpY2hhaW5fbG9jayk7CisJaWYgKHFwdGljaGFpbiAhPSBOVUxMKSB7CisJCXN0cnVjdCBxbG9naWNwdGkgKnFsaW5rID0gcXB0aWNoYWluOworCisJCXdoaWxlKHFsaW5rLT5uZXh0KQorCQkJcWxpbmsgPSBxbGluay0+bmV4dDsKKwkJcWxpbmstPm5leHQgPSBxcHRpOworCX0gZWxzZSB7CisJCXFwdGljaGFpbiA9IHFwdGk7CisJfQorCXFwdGktPm5leHQgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmcXB0aWNoYWluX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcXB0aV9jaGFpbl9kZWwoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlzcGluX2xvY2tfaXJxKCZxcHRpY2hhaW5fbG9jayk7CisJaWYgKHFwdGljaGFpbiA9PSBxcHRpKSB7CisJCXFwdGljaGFpbiA9IHFwdGktPm5leHQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IHFsb2dpY3B0aSAqcWxpbmsgPSBxcHRpY2hhaW47CisJCXdoaWxlKHFsaW5rLT5uZXh0ICE9IHFwdGkpCisJCQlxbGluayA9IHFsaW5rLT5uZXh0OworCQlxbGluay0+bmV4dCA9IHFwdGktPm5leHQ7CisJfQorCXFwdGktPm5leHQgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmcXB0aWNoYWluX2xvY2spOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxcHRpX21hcF9yZWdzKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXB0aS0+c2RldjsKKworCXFwdGktPnFyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgICBzZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemUsCisJCQkJICAgIlBUSSBRbG9naWMvSVNQIik7CisJaWYgKCFxcHRpLT5xcmVncykgeworCQlwcmludGsoIlBUSTogUWxvZ2ljL0lTUCByZWdpc3RlcnMgYXJlIHVubWFwcGFibGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChxcHRpLT5pc19wdGkpIHsKKwkJcXB0aS0+c3JlZyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sICgxNiAqIDQwOTYpLAorCQkJCQkgIHNpemVvZih1bnNpZ25lZCBjaGFyKSwKKwkJCQkJICAiUFRJIFFsb2dpYy9JU1Agc3RhdHJlZyIpOworCQlpZiAoIXFwdGktPnNyZWcpIHsKKwkJCXByaW50aygiUFRJOiBRbG9naWMvSVNQIHN0YXR1cyByZWdpc3RlciBpcyB1bm1hcHBhYmxlXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcXB0aV9yZWdpc3Rlcl9pcnEoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBxcHRpLT5zZGV2OworCisJcXB0aS0+cWhvc3QtPmlycSA9IHFwdGktPmlycSA9IHNkZXYtPmlycXNbMF07CisKKwkvKiBXZSB1c2VkIHRvIHRyeSB2YXJpb3VzIG92ZXJseS1jbGV2ZXIgdGhpbmdzIHRvCisJICogcmVkdWNlIHRoZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBvdmVyaGVhZCBvbgorCSAqIHN1bjRjL3N1bjRtIHdoZW4gbXVsdGlwbGUgUFRJJ3Mgc2hhcmVkIHRoZQorCSAqIHNhbWUgSVJRLiAgSXQgd2FzIHRvbyBjb21wbGV4IGFuZCBtZXNzeSB0bworCSAqIHNhbmVseSBtYWludGFpbi4KKwkgKi8KKwlpZiAocmVxdWVzdF9pcnEocXB0aS0+aXJxLCBxcHRpX2ludHIsCisJCQlTQV9TSElSUSwgIlFsb2dpYy9QVEkiLCBxcHRpKSkKKwkJZ290byBmYWlsOworCisJcHJpbnRrKCJxcHRpJWQ6IElSUSAlcyAiLCBxcHRpLT5xcHRpX2lkLCBfX2lycV9pdG9hKHFwdGktPmlycSkpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcHJpbnRrKCJxcHRpJWQ6IENhbm5vdCBhY3F1aXJlIGlycSBsaW5lXG4iLCBxcHRpLT5xcHRpX2lkKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBxcHRpX2dldF9zY3NpX2lkKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJcXB0aS0+c2NzaV9pZCA9IHByb21fZ2V0aW50ZGVmYXVsdChxcHRpLT5wcm9tX25vZGUsCisJCQkJCSAgICJpbml0aWF0b3ItaWQiLAorCQkJCQkgICAtMSk7CisJaWYgKHFwdGktPnNjc2lfaWQgPT0gLTEpCisJCXFwdGktPnNjc2lfaWQgPSBwcm9tX2dldGludGRlZmF1bHQocXB0aS0+cHJvbV9ub2RlLAorCQkJCQkJICAgInNjc2ktaW5pdGlhdG9yLWlkIiwKKwkJCQkJCSAgIC0xKTsKKwlpZiAocXB0aS0+c2NzaV9pZCA9PSAtMSkKKwkJcXB0aS0+c2NzaV9pZCA9CisJCQlwcm9tX2dldGludGRlZmF1bHQocXB0aS0+c2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAgICJzY3NpLWluaXRpYXRvci1pZCIsIDcpOworCXFwdGktPnFob3N0LT50aGlzX2lkID0gcXB0aS0+c2NzaV9pZDsKKwlxcHRpLT5xaG9zdC0+bWF4X3NlY3RvcnMgPSA2NDsKKworCXByaW50aygiU0NTSSBJRCAlZCAiLCBxcHRpLT5zY3NpX2lkKTsKK30KKworc3RhdGljIHZvaWQgcXB0aV9nZXRfYnVyc3RzKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXB0aS0+c2RldjsKKwl1OCBidXJzdHMsIGJtYXNrOworCisJYnVyc3RzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHFwdGktPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJYm1hc2sgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJICAgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJaWYgKGJtYXNrICE9IDB4ZmYpCisJCWJ1cnN0cyAmPSBibWFzazsKKwlpZiAoYnVyc3RzID09IDB4ZmYgfHwKKwkgICAgKGJ1cnN0cyAmIERNQV9CVVJTVDE2KSA9PSAwIHx8CisJICAgIChidXJzdHMgJiBETUFfQlVSU1QzMikgPT0gMCkKKwkJYnVyc3RzID0gKERNQV9CVVJTVDMyIC0gMSk7CisKKwlxcHRpLT5idXJzdHMgPSBidXJzdHM7Cit9CisKK3N0YXRpYyB2b2lkIHFwdGlfZ2V0X2Nsb2NrKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJdW5zaWduZWQgaW50IGNmcmVxOworCisJLyogQ2hlY2sgZm9yIHdoYXQgdGhlIGNsb2NrIGlucHV0IHRvIHRoaXMgY2FyZCBpcy4KKwkgKiBEZWZhdWx0IHRvIDQwTWh6LgorCSAqLworCWNmcmVxID0gcHJvbV9nZXRpbnRkZWZhdWx0KHFwdGktPnByb21fbm9kZSwiY2xvY2stZnJlcXVlbmN5Iiw0MDAwMDAwMCk7CisJcXB0aS0+Y2xvY2sgPSAoY2ZyZXEgKyA1MDAwMDApLzEwMDAwMDA7CisJaWYgKHFwdGktPmNsb2NrID09IDApIC8qIGJ1bGxzaGl0ICovCisJCXFwdGktPmNsb2NrID0gNDA7Cit9CisKKy8qIFRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBxdWV1ZXMgbXVzdCBlYWNoIGJlIGFsaWduZWQKKyAqIG9uIGEgcGFnZSBib3VuZGFyeS4KKyAqLworc3RhdGljIGludCBfX2luaXQgcXB0aV9tYXBfcXVldWVzKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXB0aS0+c2RldjsKKworI2RlZmluZSBRU0laRShlbnRyaWVzKQkoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQorCXFwdGktPnJlc19jcHUgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2RldiwKKwkJCQkJICAgICAgUVNJWkUoUkVTX1FVRVVFX0xFTiksCisJCQkJCSAgICAgICZxcHRpLT5yZXNfZHZtYSk7CisJaWYgKHFwdGktPnJlc19jcHUgPT0gTlVMTCB8fAorCSAgICBxcHRpLT5yZXNfZHZtYSA9PSAwKSB7CisJCXByaW50aygiUVBUSTogQ2Fubm90IG1hcCByZXNwb25zZSBxdWV1ZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcXB0aS0+cmVxX2NwdSA9IHNidXNfYWxsb2NfY29uc2lzdGVudChzZGV2LAorCQkJCQkgICAgICBRU0laRShRTE9HSUNQVElfUkVRX1FVRVVFX0xFTiksCisJCQkJCSAgICAgICZxcHRpLT5yZXFfZHZtYSk7CisJaWYgKHFwdGktPnJlcV9jcHUgPT0gTlVMTCB8fAorCSAgICBxcHRpLT5yZXFfZHZtYSA9PSAwKSB7CisJCXNidXNfZnJlZV9jb25zaXN0ZW50KHNkZXYsIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCSAgICAgcXB0aS0+cmVzX2NwdSwgcXB0aS0+cmVzX2R2bWEpOworCQlwcmludGsoIlFQVEk6IENhbm5vdCBtYXAgcmVxdWVzdCBxdWV1ZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChxcHRpLT5yZXNfY3B1LCAwLCBRU0laRShSRVNfUVVFVUVfTEVOKSk7CisJbWVtc2V0KHFwdGktPnJlcV9jcHUsIDAsIFFTSVpFKFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERldGVjdCBhbGwgUFRJIFFsb2dpYyBJU1AncyBpbiB0aGUgbWFjaGluZS4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHFsb2dpY3B0aV9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpOworCXN0cnVjdCBTY3NpX0hvc3QgKnFwdGlfaG9zdDsKKwlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2OworCWludCBucXB0aXMgPSAwLCBucXB0aXNfaW5fdXNlID0gMDsKKworCXRwbnQtPnByb2NfbmFtZSA9ICJxbG9naWNwdGkiOworCWZvcl9lYWNoX3NidXMoc2J1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKKwkJCS8qIElzIHRoaXMgYSByZWQgc25hcHBlcj8gKi8KKwkJCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAicHRpc3AiKSAmJgorCQkJICAgIHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJQVEkscHRpc3AiKSAmJgorCQkJICAgIHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJRTEdDLGlzcCIpICYmCisJCQkgICAgc3RyY21wKHNkZXYtPnByb21fbmFtZSwgIlNVTlcsaXNwIikpCisJCQkJY29udGludWU7CisKKwkJCS8qIFNvbWV0aW1lcyBBbnRhcmVzIGNhcmRzIGNvbWUgdXAgbm90IGNvbXBsZXRlbHkKKwkJCSAqIHNldHVwLCBhbmQgd2UgZ2V0IGEgcmVwb3J0IG9mIGEgemVybyBJUlEuCisJCQkgKiBTa2lwIG92ZXIgdGhlbSBpbiBzdWNoIGNhc2VzIHNvIHdlIHN1cnZpdmUuCisJCQkgKi8KKwkJCWlmIChzZGV2LT5pcnFzWzBdID09IDApIHsKKwkJCQlwcmludGsoInFwdGklZDogQWRhcHRlciByZXBvcnRzIG5vIGludGVycnVwdCwgIgorCQkJCSAgICAgICAic2tpcHBpbmcgb3ZlciB0aGlzIGNhcmQuIiwgbnFwdGlzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogWWVwLCByZWdpc3RlciBhbmQgYWxsb2NhdGUgc29mdHdhcmUgc3RhdGUuICovCisJCQlxcHRpX2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgcWxvZ2ljcHRpKSk7CisJCQlpZiAoIXFwdGlfaG9zdCkgeworCQkJCXByaW50aygiUVBUSTogQ2Fubm90IHJlZ2lzdGVyIFBUSSBRbG9naWMgSVNQIFNDU0kgaG9zdCIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcXB0aSA9IChzdHJ1Y3QgcWxvZ2ljcHRpICopIHFwdGlfaG9zdC0+aG9zdGRhdGE7CisKKwkJCS8qIFdlIGFyZSB3aWRlIGNhcGFibGUsIDE2IHRhcmdldHMuICovCisJCQlxcHRpX2hvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTOworCisJCQkvKiBTZXR1cCBiYWNrIHBvaW50ZXJzIGFuZCBtaXNjLiBzdGF0ZS4gKi8KKwkJCXFwdGktPnFob3N0ID0gcXB0aV9ob3N0OworCQkJcXB0aS0+c2RldiA9IHNkZXY7CisJCQlxcHRpLT5xcHRpX2lkID0gbnFwdGlzKys7CisJCQlxcHRpLT5wcm9tX25vZGUgPSBzZGV2LT5wcm9tX25vZGU7CisJCQlwcm9tX2dldHN0cmluZyhxcHRpLT5wcm9tX25vZGUsICJuYW1lIiwKKwkJCQkgICAgICAgcXB0aS0+cHJvbV9uYW1lLAorCQkJCSAgICAgICBzaXplb2YocXB0aS0+cHJvbV9uYW1lKSk7CisKKwkJCS8qIFRoaXMgaXMgbm90IGNvcnJlY3QsIGFjdHVhbGx5LiBUaGVyZSdzIGEgc3dpdGNoCisJCQkgKiBvbiB0aGUgUFRJIGNhcmRzIHRoYXQgcHV0IHRoZW0gaW50byAiZW11bGF0aW9uIgorCQkJICogbW9kZS0gaS5lLiwgcmVwb3J0IHRoZW1zZWx2ZXMgYXMgUUxHQyxpc3AKKwkJCSAqIGluc3RlYWQgb2YgUFRJLHB0aXNwLiBUaGUgb25seSByZWFsIHN1YnN0YW50aXZlCisJCQkgKiBkaWZmZXJlbmNlIGJldHdlZW4gbm9uLXB0aSBhbmQgcHRpIGNhcmRzIGlzCisJCQkgKiB0aGUgdG1vbiByZWdpc3Rlci4gV2hpY2ggaXMgcG9zc2libHkgZXZlbgorCQkJICogdGhlcmUgZm9yIFFsb2dpYyBjYXJkcywgYnV0IG5vbi1mdW5jdGlvbmFsLgorCQkJICovCisJCQlxcHRpLT5pc19wdGkgPSAoc3RyY21wIChxcHRpLT5wcm9tX25hbWUsICJRTEdDLGlzcCIpICE9IDApOworCisJCQlxcHRpX2NoYWluX2FkZChxcHRpKTsKKwkJCWlmIChxcHRpX21hcF9yZWdzKHFwdGkpIDwgMCkKKwkJCQlnb3RvIGZhaWxfdW5saW5rOworCisJCQlpZiAocXB0aV9yZWdpc3Rlcl9pcnEocXB0aSkgPCAwKQorCQkJCWdvdG8gZmFpbF91bm1hcF9yZWdzOworCisJCQlxcHRpX2dldF9zY3NpX2lkKHFwdGkpOworCQkJcXB0aV9nZXRfYnVyc3RzKHFwdGkpOworCQkJcXB0aV9nZXRfY2xvY2socXB0aSk7CisKKwkJCS8qIENsZWFyIG91dCBzY3NpX2NtbmQgYXJyYXkuICovCisJCQltZW1zZXQocXB0aS0+Y21kX3Nsb3RzLCAwLCBzaXplb2YocXB0aS0+Y21kX3Nsb3RzKSk7CisKKwkJCWlmIChxcHRpX21hcF9xdWV1ZXMocXB0aSkgPCAwKQorCQkJCWdvdG8gZmFpbF9mcmVlX2lycTsKKworCQkJLyogTG9hZCB0aGUgZmlybXdhcmUuICovCisJCQlpZiAocWxvZ2ljcHRpX2xvYWRfZmlybXdhcmUocXB0aSkpCisJCQkJZ290byBmYWlsX3VubWFwX3F1ZXVlczsKKwkJCWlmIChxcHRpLT5pc19wdGkpIHsKKwkJCQkvKiBDaGVjayB0aGUgUFRJIHN0YXR1cyByZWcuICovCisJCQkJaWYgKHFsb2dpY3B0aV92ZXJpZnlfdG1vbihxcHRpKSkKKwkJCQkJZ290byBmYWlsX3VubWFwX3F1ZXVlczsKKwkJCX0KKworCQkJLyogUmVzZXQgdGhlIElTUCBhbmQgaW5pdCByZXMvcmVxIHF1ZXVlcy4gKi8KKwkJCWlmIChxbG9naWNwdGlfcmVzZXRfaGFyZHdhcmUocXB0aV9ob3N0KSkKKwkJCQlnb3RvIGZhaWxfdW5tYXBfcXVldWVzOworCisJCQlwcmludGsoIihGaXJtd2FyZSB2JWQuJWQuJWQpIiwgcXB0aS0+ZndhcmVfbWFqcmV2LAorCQkJICAgIHFwdGktPmZ3YXJlX21pbnJldiwgcXB0aS0+ZndhcmVfbWljcmV2KTsKKwkJCXsKKwkJCQljaGFyIGJ1ZmZlcls2MF07CisJCQkJCisJCQkJcHJvbV9nZXRzdHJpbmcgKHFwdGktPnByb21fbm9kZSwKKwkJCQkJCSJpc3AtZmNvZGUiLCBidWZmZXIsIDYwKTsKKwkJCQlpZiAoYnVmZmVyWzBdKQorCQkJCQlwcmludGsoIihGaXJtd2FyZSAlcykiLCBidWZmZXIpOworCQkJCWlmIChwcm9tX2dldGJvb2wocXB0aS0+cHJvbV9ub2RlLCAiZGlmZmVyZW50aWFsIikpCisJCQkJCXFwdGktPmRpZmZlcmVudGlhbCA9IDE7CisJCQl9CisJCQkKKwkJCXByaW50ayAoIiBbJXMgV2lkZSwgdXNpbmcgJXMgaW50ZXJmYWNlXVxuIiwKKwkJCSAgICAgICAocXB0aS0+dWx0cmEgPyAiVWx0cmEiIDogIkZhc3QiKSwKKwkJCSAgICAgICAocXB0aS0+ZGlmZmVyZW50aWFsID8gImRpZmZlcmVudGlhbCIgOiAic2luZ2xlIGVuZGVkIikpOworCisJCQlucXB0aXNfaW5fdXNlKys7CisJCQljb250aW51ZTsKKworCQlmYWlsX3VubWFwX3F1ZXVlczoKKyNkZWZpbmUgUVNJWkUoZW50cmllcykJKCgoZW50cmllcykgKyAxKSAqIFFVRVVFX0VOVFJZX0xFTikKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCisJCQkJCSAgICAgUVNJWkUoUkVTX1FVRVVFX0xFTiksCisJCQkJCSAgICAgcXB0aS0+cmVzX2NwdSwgcXB0aS0+cmVzX2R2bWEpOworCQkJc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKKwkJCQkJICAgICBRU0laRShRTE9HSUNQVElfUkVRX1FVRVVFX0xFTiksCisJCQkJCSAgICAgcXB0aS0+cmVxX2NwdSwgcXB0aS0+cmVxX2R2bWEpOworI3VuZGVmIFFTSVpFCisJCWZhaWxfZnJlZV9pcnE6CisJCQlmcmVlX2lycShxcHRpLT5pcnEsIHFwdGkpOworCisJCWZhaWxfdW5tYXBfcmVnczoKKwkJCXNidXNfaW91bm1hcChxcHRpLT5xcmVncywKKwkJCQkgICAgIHFwdGktPnNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZSk7CisJCQlpZiAocXB0aS0+aXNfcHRpKQorCQkJCXNidXNfaW91bm1hcChxcHRpLT5zcmVnLCBzaXplb2YodW5zaWduZWQgY2hhcikpOworCQlmYWlsX3VubGluazoKKwkJCXFwdGlfY2hhaW5fZGVsKHFwdGkpOworCQkJc2NzaV91bnJlZ2lzdGVyKHFwdGktPnFob3N0KTsKKwkJfQorCX0KKwlpZiAobnFwdGlzKQorCQlwcmludGsoIlFQVEk6IFRvdGFsIG9mICVkIFBUSSBRbG9naWMvSVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLAorCQkgICAgICAgbnFwdGlzLCBucXB0aXNfaW5fdXNlKTsKKwlxcHRpc19ydW5uaW5nID0gbnFwdGlzX2luX3VzZTsKKwlyZXR1cm4gbnFwdGlzOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IChzdHJ1Y3QgcWxvZ2ljcHRpICopIGhvc3QtPmhvc3RkYXRhOworCisJLyogUmVtb3ZlIHZpc2liaWxpdHkgZnJvbSBJUlEgaGFuZGxlcnMuICovCisJcXB0aV9jaGFpbl9kZWwocXB0aSk7CisKKwkvKiBTaHV0IHVwIHRoZSBjYXJkLiAqLworCXNidXNfd3JpdGV3KDAsIHFwdGktPnFyZWdzICsgU0JVU19DVFJMKTsKKworCS8qIEZyZWUgSVJRIGhhbmRsZXIgYW5kIHVubWFwIFFsb2dpYyxJU1AgYW5kIFBUSSBzdGF0dXMgcmVncy4gKi8KKwlmcmVlX2lycShxcHRpLT5pcnEsIHFwdGkpOworCisjZGVmaW5lIFFTSVpFKGVudHJpZXMpCSgoKGVudHJpZXMpICsgMSkgKiBRVUVVRV9FTlRSWV9MRU4pCisJc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKKwkJCSAgICAgUVNJWkUoUkVTX1FVRVVFX0xFTiksCisJCQkgICAgIHFwdGktPnJlc19jcHUsIHFwdGktPnJlc19kdm1hKTsKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChxcHRpLT5zZGV2LAorCQkJICAgICBRU0laRShRTE9HSUNQVElfUkVRX1FVRVVFX0xFTiksCisJCQkgICAgIHFwdGktPnJlcV9jcHUsIHFwdGktPnJlcV9kdm1hKTsKKyN1bmRlZiBRU0laRQorCisJc2J1c19pb3VubWFwKHFwdGktPnFyZWdzLCBxcHRpLT5zZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemUpOworCWlmIChxcHRpLT5pc19wdGkpCisJCXNidXNfaW91bm1hcChxcHRpLT5zcmVnLCBzaXplb2YodW5zaWduZWQgY2hhcikpOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKnFsb2dpY3B0aV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gKHN0cnVjdCBxbG9naWNwdGkgKikgaG9zdC0+aG9zdGRhdGE7CisKKwlzcHJpbnRmKGJ1ZiwgIlBUSSBRbG9naWMsSVNQIFNCVVMgU0NTSSBpcnEgJXMgcmVncyBhdCAlcCIsCisJCV9faXJxX2l0b2EocXB0aS0+cWhvc3QtPmlycSksIHFwdGktPnFyZWdzKTsKKwlyZXR1cm4gYnVmOworfQorCisvKiBJIGFtIGEgY2VydGlmaWVkIGZyb2J0cm9uaWNpc3QuICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya2VyX2Zyb2Ioc3RydWN0IENvbW1hbmRfRW50cnkgKmNtZCkKK3sKKwlzdHJ1Y3QgTWFya2VyX0VudHJ5ICptYXJrZXIgPSAoc3RydWN0IE1hcmtlcl9FbnRyeSAqKSBjbWQ7CisKKwltZW1zZXQobWFya2VyLCAwLCBzaXplb2Yoc3RydWN0IE1hcmtlcl9FbnRyeSkpOworCW1hcmtlci0+aGRyLmVudHJ5X2NudCA9IDE7CisJbWFya2VyLT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX01BUktFUjsKKwltYXJrZXItPm1vZGlmaWVyID0gU1lOQ19BTEw7CisJbWFya2VyLT5yc3ZkID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNtZF9mcm9iKHN0cnVjdCBDb21tYW5kX0VudHJ5ICpjbWQsIHN0cnVjdCBzY3NpX2NtbmQgKkNtbmQsCisJCQkgICAgc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKK3sKKwltZW1zZXQoY21kLCAwLCBzaXplb2Yoc3RydWN0IENvbW1hbmRfRW50cnkpKTsKKwljbWQtPmhkci5lbnRyeV9jbnQgPSAxOworCWNtZC0+aGRyLmVudHJ5X3R5cGUgPSBFTlRSWV9DT01NQU5EOworCWNtZC0+dGFyZ2V0X2lkID0gQ21uZC0+ZGV2aWNlLT5pZDsKKwljbWQtPnRhcmdldF9sdW4gPSBDbW5kLT5kZXZpY2UtPmx1bjsKKwljbWQtPmNkYl9sZW5ndGggPSBDbW5kLT5jbWRfbGVuOworCWNtZC0+Y29udHJvbF9mbGFncyA9IDA7CisJaWYgKENtbmQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCQlpZiAocXB0aS0+Y21kX2NvdW50W0NtbmQtPmRldmljZS0+aWRdID09IDApCisJCQlxcHRpLT50YWdfYWdlc1tDbW5kLT5kZXZpY2UtPmlkXSA9IGppZmZpZXM7CisJCWlmICgoamlmZmllcyAtIHFwdGktPnRhZ19hZ2VzW0NtbmQtPmRldmljZS0+aWRdKSA+ICg1KkhaKSkgeworCQkJY21kLT5jb250cm9sX2ZsYWdzID0gQ0ZMQUdfT1JERVJFRF9UQUc7CisJCQlxcHRpLT50YWdfYWdlc1tDbW5kLT5kZXZpY2UtPmlkXSA9IGppZmZpZXM7CisJCX0gZWxzZQorCQkJY21kLT5jb250cm9sX2ZsYWdzID0gQ0ZMQUdfU0lNUExFX1RBRzsKKwl9CisJaWYgKChDbW5kLT5jbW5kWzBdID09IFdSSVRFXzYpIHx8CisJICAgIChDbW5kLT5jbW5kWzBdID09IFdSSVRFXzEwKSB8fAorCSAgICAoQ21uZC0+Y21uZFswXSA9PSBXUklURV8xMikpCisJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBDRkxBR19XUklURTsKKwllbHNlCisJCWNtZC0+Y29udHJvbF9mbGFncyB8PSBDRkxBR19SRUFEOworCWNtZC0+dGltZV9vdXQgPSAzMDsKKwltZW1jcHkoY21kLT5jZGIsIENtbmQtPmNtbmQsIENtbmQtPmNtZF9sZW4pOworfQorCisvKiBEbyBpdCB0byBpdCBiYWJ5LiAqLworc3RhdGljIGlubGluZSBpbnQgbG9hZF9jbWQoc3RydWN0IHNjc2lfY21uZCAqQ21uZCwgc3RydWN0IENvbW1hbmRfRW50cnkgKmNtZCwKKwkJCSAgIHN0cnVjdCBxbG9naWNwdGkgKnFwdGksIHVfaW50IGluX3B0ciwgdV9pbnQgb3V0X3B0cikKK3sKKwlzdHJ1Y3QgZGF0YXNlZyAqZHM7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaSwgbjsKKworCWlmIChDbW5kLT51c2Vfc2cpIHsKKwkJaW50IHNnX2NvdW50OworCisJCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBDbW5kLT5idWZmZXI7CisJCXNnX2NvdW50ID0gc2J1c19tYXBfc2cocXB0aS0+c2Rldiwgc2csIENtbmQtPnVzZV9zZywgQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCWRzID0gY21kLT5kYXRhc2VnOworCQljbWQtPnNlZ21lbnRfY250ID0gc2dfY291bnQ7CisKKwkJLyogRmlsbCBpbiBmaXJzdCBmb3VyIHNnIGVudHJpZXM6ICovCisJCW4gPSBzZ19jb3VudDsKKwkJaWYgKG4gPiA0KQorCQkJbiA9IDQ7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHNnKyspIHsKKwkJCWRzW2ldLmRfYmFzZSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCWRzW2ldLmRfY291bnQgPSBzZ19kbWFfbGVuKHNnKTsKKwkJfQorCQlzZ19jb3VudCAtPSA0OworCQl3aGlsZSAoc2dfY291bnQgPiAwKSB7CisJCQlzdHJ1Y3QgQ29udGludWF0aW9uX0VudHJ5ICpjb250OworCisJCQkrK2NtZC0+aGRyLmVudHJ5X2NudDsKKwkJCWNvbnQgPSAoc3RydWN0IENvbnRpbnVhdGlvbl9FbnRyeSAqKSAmcXB0aS0+cmVxX2NwdVtpbl9wdHJdOworCQkJaW5fcHRyID0gTkVYVF9SRVFfUFRSKGluX3B0cik7CisJCQlpZiAoaW5fcHRyID09IG91dF9wdHIpCisJCQkJcmV0dXJuIC0xOworCisJCQljb250LT5oZHIuZW50cnlfdHlwZSA9IEVOVFJZX0NPTlRJTlVBVElPTjsKKwkJCWNvbnQtPmhkci5lbnRyeV9jbnQgPSAwOworCQkJY29udC0+aGRyLnN5c19kZWZfMSA9IDA7CisJCQljb250LT5oZHIuZmxhZ3MgPSAwOworCQkJY29udC0+cmVzZXJ2ZWQgPSAwOworCQkJZHMgPSBjb250LT5kYXRhc2VnOworCQkJbiA9IHNnX2NvdW50OworCQkJaWYgKG4gPiA3KQorCQkJCW4gPSA3OworCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKywgc2crKykgeworCQkJCWRzW2ldLmRfYmFzZSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCQlkc1tpXS5kX2NvdW50ID0gc2dfZG1hX2xlbihzZyk7CisJCQl9CisJCQlzZ19jb3VudCAtPSBuOworCQl9CisJfSBlbHNlIGlmIChDbW5kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJQ21uZC0+U0NwLnB0ciA9IChjaGFyICopKHVuc2lnbmVkIGxvbmcpCisJCQlzYnVzX21hcF9zaW5nbGUocXB0aS0+c2RldiwKKwkJCQkJQ21uZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCUNtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCWNtZC0+ZGF0YXNlZ1swXS5kX2Jhc2UgPSAodTMyKSAoKHVuc2lnbmVkIGxvbmcpQ21uZC0+U0NwLnB0cik7CisJCWNtZC0+ZGF0YXNlZ1swXS5kX2NvdW50ID0gQ21uZC0+cmVxdWVzdF9idWZmbGVuOworCQljbWQtPnNlZ21lbnRfY250ID0gMTsKKwl9IGVsc2UgeworCQljbWQtPmRhdGFzZWdbMF0uZF9iYXNlID0gMDsKKwkJY21kLT5kYXRhc2VnWzBdLmRfY291bnQgPSAwOworCQljbWQtPnNlZ21lbnRfY250ID0gMTsgLyogU2hvdWxkbid0IHRoaXMgYmUgMD8gKi8KKwl9CisKKwkvKiBDb21taXR0ZWQsIHJlY29yZCBTY3NpX0NtZCBzbyB3ZSBjYW4gZmluZCBpdCBsYXRlci4gKi8KKwljbWQtPmhhbmRsZSA9IGluX3B0cjsKKwlxcHRpLT5jbWRfc2xvdHNbaW5fcHRyXSA9IENtbmQ7CisKKwlxcHRpLT5jbWRfY291bnRbQ21uZC0+ZGV2aWNlLT5pZF0rKzsKKwlzYnVzX3dyaXRldyhpbl9wdHIsIHFwdGktPnFyZWdzICsgTUJPWDQpOworCXFwdGktPnJlcV9pbl9wdHIgPSBpbl9wdHI7CisKKwlyZXR1cm4gaW5fcHRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2Nhbl9xdWV1ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB1X2ludCBpbl9wdHIsIHVfaW50IG91dF9wdHIpCit7CisJLyogVGVtcG9yYXJ5IHdvcmthcm91bmQgdW50aWwgYnVnIGlzIGZvdW5kIGFuZCBmaXhlZCAob25lIGJ1ZyBoYXMgYmVlbiBmb3VuZAorCSAgIGFscmVhZHksIGJ1dCBmaXhpbmcgaXQgbWFrZXMgdGhpbmdzIGV2ZW4gd29yc2UpIC1qaiAqLworCWludCBudW1fZnJlZSA9IFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOIC0gUkVRX1FVRVVFX0RFUFRIKGluX3B0ciwgb3V0X3B0cikgLSA2NDsKKwlob3N0LT5jYW5fcXVldWUgPSBob3N0LT5ob3N0X2J1c3kgKyBudW1fZnJlZTsKKwlob3N0LT5zZ190YWJsZXNpemUgPSBRTE9HSUNQVElfTUFYX1NHKG51bV9mcmVlKTsKK30KKworLyoKKyAqIFVudGlsIHdlIHNjYW4gdGhlIGVudGlyZSBidXMgd2l0aCBpbnF1aXJpZXMsIGdvIHRocm91Z2h0IHRoaXMgZmVsbGEuLi4KKyAqLworc3RhdGljIHZvaWQgb3VyZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kKQoreworCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCWludCB0Z3QgPSBDbW5kLT5kZXZpY2UtPmlkOworCXZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKKworCS8qIFRoaXMgZ3JvdCBhZGRlZCBieSBEYXZlTSwgYmxhbWUgaGltIGZvciB1Z2xpbmVzcy4KKwkgKiBUaGUgaXNzdWUgaXMgdGhhdCBpbiB0aGUgMi4zLnggZHJpdmVyIHdlIHVzZSB0aGUKKwkgKiBob3N0X3NjcmliYmxlIHBvcnRpb24gb2YgdGhlIHNjc2kgY29tbWFuZCBhcyBhCisJICogY29tcGxldGlvbiBsaW5rZWQgbGlzdCBhdCBpbnRlcnJ1cHQgc2VydmljZSB0aW1lLAorCSAqIHNvIHdlIGhhdmUgdG8gc3RvcmUgdGhlIGRvbmUgZnVuY3Rpb24gcG9pbnRlciBlbHNld2hlcmUuCisJICovCisJZG9uZSA9ICh2b2lkICgqKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQorCQkoKCh1bnNpZ25lZCBsb25nKSBDbW5kLT5TQ3AuTWVzc2FnZSkKKyNpZmRlZiBfX3NwYXJjX3Y5X18KKwkJIHwgKCh1bnNpZ25lZCBsb25nKSBDbW5kLT5TQ3AuU3RhdHVzIDw8IDMyVUwpCisjZW5kaWYKKwkJICk7CisKKwlpZiAoKHFwdGktPnNiaXRzICYgKDEgPDwgdGd0KSkgPT0gMCkgeworCQlpbnQgb2sgPSBob3N0X2J5dGUoQ21uZC0+cmVzdWx0KSA9PSBESURfT0s7CisJCWlmIChDbW5kLT5jbW5kWzBdID09IDB4MTIgJiYgb2spIHsKKwkJCXVuc2lnbmVkIGNoYXIgKmlxZDsKKworCQkJaWYgKENtbmQtPnVzZV9zZyAhPSAwKQorCQkJCUJVRygpOworCisJCQlpcWQgPSAoKHVuc2lnbmVkIGNoYXIgKilDbW5kLT5idWZmZXIpOworCisJCQkvKiB0YWdzIGhhbmRsZWQgaW4gbWlkbGF5ZXIgKi8KKwkJCS8qIGVuYWJsZSBzeW5jIG1vZGU/ICovCisJCQlpZiAoaXFkWzddICYgMHgxMCkgeworCQkJCXFwdGktPmRldl9wYXJhbVt0Z3RdLmRldmljZV9mbGFncyB8PSAweDEwOworCQkJfSBlbHNlIHsKKwkJCQlxcHRpLT5kZXZfcGFyYW1bdGd0XS5zeW5jaHJvbm91c19vZmZzZXQgPSAwOworCQkJCXFwdGktPmRldl9wYXJhbVt0Z3RdLnN5bmNocm9ub3VzX3BlcmlvZCA9IDA7CisJCQl9CisJCQkvKiBhcmUgd2Ugd2lkZSBjYXBhYmxlPyAqLworCQkJaWYgKGlxZFs3XSAmIDB4MjApIHsKKwkJCQlxcHRpLT5kZXZfcGFyYW1bdGd0XS5kZXZpY2VfZmxhZ3MgfD0gMHgyMDsKKwkJCX0KKwkJCXFwdGktPnNiaXRzIHw9ICgxIDw8IHRndCk7CisJCX0gZWxzZSBpZiAoIW9rKSB7CisJCQlxcHRpLT5zYml0cyB8PSAoMSA8PCB0Z3QpOworCQl9CisJfQorCWRvbmUoQ21uZCk7Cit9CisKK3N0YXRpYyBpbnQgcWxvZ2ljcHRpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CisKK3N0YXRpYyBpbnQgcWxvZ2ljcHRpX3F1ZXVlY29tbWFuZF9zbG93KHN0cnVjdCBzY3NpX2NtbmQgKkNtbmQsCisJCQkJICAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJLyoKKwkgKiBkb25lIGNoZWNraW5nIHRoaXMgaG9zdCBhZGFwdGVyPworCSAqIElmIG5vdCwgdGhlbiByZXdyaXRlIHRoZSBjb21tYW5kCisJICogdG8gZmluaXNoIHRocm91Z2ggb3VyZG9uZSBzbyB3ZQorCSAqIGNhbiBwZWVrIGF0IElucXVpcnkgZGF0YSByZXN1bHRzLgorCSAqLworCWlmIChxcHRpLT5zYml0cyAmJiBxcHRpLT5zYml0cyAhPSAweGZmZmYpIHsKKwkJLyogU2VlIGFib3ZlIGFib3V0IGluIG91cmRvbmUgdGhpcyB1Z2xpbmVzcy4uLiAqLworCQlDbW5kLT5TQ3AuTWVzc2FnZSA9ICgodW5zaWduZWQgbG9uZylkb25lKSAmIDB4ZmZmZmZmZmY7CisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwkJQ21uZC0+U0NwLlN0YXR1cyA9ICgodW5zaWduZWQgbG9uZylkb25lID4+IDMyVUwpICYgMHhmZmZmZmZmZjsKKyNlbmRpZgorCQlyZXR1cm4gcWxvZ2ljcHRpX3F1ZXVlY29tbWFuZChDbW5kLCBvdXJkb25lKTsKKwl9CisKKwkvKgorCSAqIFdlJ3ZlIHBlZWtlZCBhdCBhbGwgdGFyZ2V0cyBmb3IgdGhpcyBidXMtIHRpbWUKKwkgKiB0byBzZXQgcGFyYW1ldGVycyBmb3IgZGV2aWNlcyBmb3IgcmVhbCBub3cuCisJICovCisJaWYgKHFwdGktPnNiaXRzID09IDB4ZmZmZikgeworCQlpbnQgaTsKKwkJZm9yKGkgPSAwOyBpIDwgTUFYX1RBUkdFVFM7IGkrKykgeworCQkJdV9zaG9ydCBwYXJhbVs2XTsKKwkJCXBhcmFtWzBdID0gTUJPWF9TRVRfVEFSR0VUX1BBUkFNUzsKKwkJCXBhcmFtWzFdID0gKGkgPDwgOCk7CisJCQlwYXJhbVsyXSA9IChxcHRpLT5kZXZfcGFyYW1baV0uZGV2aWNlX2ZsYWdzIDw8IDgpOworCQkJaWYgKHFwdGktPmRldl9wYXJhbVtpXS5kZXZpY2VfZmxhZ3MgJiAweDEwKSB7CisJCQkJcGFyYW1bM10gPSAocXB0aS0+ZGV2X3BhcmFtW2ldLnN5bmNocm9ub3VzX29mZnNldCA8PCA4KSB8CisJCQkJCXFwdGktPmRldl9wYXJhbVtpXS5zeW5jaHJvbm91c19wZXJpb2Q7CisJCQl9IGVsc2UgeworCQkJCXBhcmFtWzNdID0gMDsKKwkJCX0KKwkJCSh2b2lkKSBxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKTsKKwkJfQorCQkvKgorCQkgKiBzZXQgdG8gemVybyBzbyBhbnkgdHJhdmVyc2UgdGhyb3VnaCBvdXJkb25lCisJCSAqIGRvZXNuJ3Qgc3RhcnQgdGhlIHdob2xlIHByb2Nlc3MgYWdhaW4sCisJCSAqLworCQlxcHRpLT5zYml0cyA9IDA7CisJfQorCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlJ3JlIGRvbmUgd2l0aCBhbGwgYWRhcHRlcnMuLi4gKi8KKwlmb3IgKHFwdGkgPSBxcHRpY2hhaW47IHFwdGkgIT0gTlVMTDsgcXB0aSA9IHFwdGktPm5leHQpIHsKKwkJaWYgKHFwdGktPnNiaXRzKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGNoYWluIHcvbyBmaW5kaW5nIGFkYXB0ZXJzIHN0aWxsCisJICogY2FwYWJpbGl0eS1jb25maWd1cmluZywgdGhlbiB3ZSdyZSBkb25lIHdpdGggYWxsIGFkYXB0ZXJzCisJICogYW5kIGNhbiByb2NrIG9uLi4KKwkgKi8KKwlpZiAocXB0aSA9PSBOVUxMKQorCQlDbW5kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5xdWV1ZWNvbW1hbmQgPSBxbG9naWNwdGlfcXVldWVjb21tYW5kOworCisJcmV0dXJuIHFsb2dpY3B0aV9xdWV1ZWNvbW1hbmQoQ21uZCwgZG9uZSk7Cit9CisKKy8qCisgKiBUaGUgbWlkZGxlIFNDU0kgbGF5ZXIgZW5zdXJlcyB0aGF0IHF1ZXVlY29tbWFuZCBuZXZlciBnZXRzIGludm9rZWQKKyAqIGNvbmN1cnJlbnRseSB3aXRoIGl0c2VsZiBvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKHRob3VnaCB0aGUKKyAqIGludGVycnVwdCBoYW5kbGVyIG1heSBjYWxsIHRoaXMgcm91dGluZSBhcyBwYXJ0IG9mCisgKiByZXF1ZXN0LWNvbXBsZXRpb24gaGFuZGxpbmcpLgorICoKKyAqICJUaGlzIGNvZGUgbXVzdCBmbHkuIiAtZGF2ZW0KKyAqLworc3RhdGljIGludCBxbG9naWNwdGlfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKkNtbmQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBDbW5kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IChzdHJ1Y3QgcWxvZ2ljcHRpICopIGhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBDb21tYW5kX0VudHJ5ICpjbWQ7CisJdV9pbnQgb3V0X3B0cjsKKwlpbnQgaW5fcHRyOworCisJQ21uZC0+c2NzaV9kb25lID0gZG9uZTsKKworCWluX3B0ciA9IHFwdGktPnJlcV9pbl9wdHI7CisJY21kID0gKHN0cnVjdCBDb21tYW5kX0VudHJ5ICopICZxcHRpLT5yZXFfY3B1W2luX3B0cl07CisJb3V0X3B0ciA9IHNidXNfcmVhZHcocXB0aS0+cXJlZ3MgKyBNQk9YNCk7CisJaW5fcHRyID0gTkVYVF9SRVFfUFRSKGluX3B0cik7CisJaWYgKGluX3B0ciA9PSBvdXRfcHRyKQorCQlnb3RvIHRvc3NfY29tbWFuZDsKKworCWlmIChxcHRpLT5zZW5kX21hcmtlcikgeworCQltYXJrZXJfZnJvYihjbWQpOworCQlxcHRpLT5zZW5kX21hcmtlciA9IDA7CisJCWlmIChORVhUX1JFUV9QVFIoaW5fcHRyKSA9PSBvdXRfcHRyKSB7CisJCQlzYnVzX3dyaXRldyhpbl9wdHIsIHFwdGktPnFyZWdzICsgTUJPWDQpOworCQkJcXB0aS0+cmVxX2luX3B0ciA9IGluX3B0cjsKKwkJCWdvdG8gdG9zc19jb21tYW5kOworCQl9CisJCWNtZCA9IChzdHJ1Y3QgQ29tbWFuZF9FbnRyeSAqKSAmcXB0aS0+cmVxX2NwdVtpbl9wdHJdOworCQlpbl9wdHIgPSBORVhUX1JFUV9QVFIoaW5fcHRyKTsKKwl9CisJY21kX2Zyb2IoY21kLCBDbW5kLCBxcHRpKTsKKwlpZiAoKGluX3B0ciA9IGxvYWRfY21kKENtbmQsIGNtZCwgcXB0aSwgaW5fcHRyLCBvdXRfcHRyKSkgPT0gLTEpCisJCWdvdG8gdG9zc19jb21tYW5kOworCisJdXBkYXRlX2Nhbl9xdWV1ZShob3N0LCBpbl9wdHIsIG91dF9wdHIpOworCisJcmV0dXJuIDA7CisKK3Rvc3NfY29tbWFuZDoKKwlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpJWQ6IHJlcXVlc3QgcXVldWUgb3ZlcmZsb3dcbiIsCisJICAgICAgIHFwdGktPnFwdGlfaWQpOworCisJLyogVW5mb3J0dW5hdGVseSwgdW5sZXNzIHlvdSB1c2UgdGhlIG5ldyBFSCBjb2RlLCB3aGljaAorCSAqIHdlIGRvbid0LCB0aGUgbWlkbGF5ZXIgd2lsbCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSwKKwkgKiB3aGljaCBpcyBpbnNhbmUuICBXZSBwaWNrIHVwIHRoZSBwaWVjZXMgbGlrZSB0aGlzLgorCSAqLworCUNtbmQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWTsKKwlkb25lKENtbmQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV9yZXR1cm5fc3RhdHVzKHN0cnVjdCBTdGF0dXNfRW50cnkgKnN0cywgaW50IGlkKQoreworCWludCBob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKworCXN3aXRjaCAoc3RzLT5jb21wbGV0aW9uX3N0YXR1cykgeworCSAgICAgIGNhc2UgQ1NfQ09NUExFVEU6CisJCWhvc3Rfc3RhdHVzID0gRElEX09LOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX0lOQ09NUExFVEU6CisJCWlmICghKHN0cy0+c3RhdGVfZmxhZ3MgJiBTRl9HT1RfQlVTKSkKKwkJCWhvc3Rfc3RhdHVzID0gRElEX05PX0NPTk5FQ1Q7CisJCWVsc2UgaWYgKCEoc3RzLT5zdGF0ZV9mbGFncyAmIFNGX0dPVF9UQVJHRVQpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfQkFEX1RBUkdFVDsKKwkJZWxzZSBpZiAoIShzdHMtPnN0YXRlX2ZsYWdzICYgU0ZfU0VOVF9DREIpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEoc3RzLT5zdGF0ZV9mbGFncyAmIFNGX1RSQU5TRkVSUkVEX0RBVEEpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEoc3RzLT5zdGF0ZV9mbGFncyAmIFNGX0dPVF9TVEFUVVMpKQorCQkJaG9zdF9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYgKCEoc3RzLT5zdGF0ZV9mbGFncyAmIFNGX0dPVF9TRU5TRSkpCisJCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19ETUFfRVJST1I6CisJICAgICAgY2FzZSBDU19UUkFOU1BPUlRfRVJST1I6CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwkgICAgICBjYXNlIENTX1JFU0VUX09DQ1VSUkVEOgorCSAgICAgIGNhc2UgQ1NfQlVTX1JFU0VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19BQk9SVEVEOgorCQlob3N0X3N0YXR1cyA9IERJRF9BQk9SVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19USU1FT1VUOgorCQlob3N0X3N0YXR1cyA9IERJRF9USU1FX09VVDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19EQVRBX09WRVJSVU46CisJICAgICAgY2FzZSBDU19DT01NQU5EX09WRVJSVU46CisJICAgICAgY2FzZSBDU19TVEFUVVNfT1ZFUlJVTjoKKwkgICAgICBjYXNlIENTX0JBRF9NRVNTQUdFOgorCSAgICAgIGNhc2UgQ1NfTk9fTUVTU0FHRV9PVVQ6CisJICAgICAgY2FzZSBDU19FWFRfSURfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfSURFX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19BQk9SVF9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfTk9QX01TR19GQUlMRUQ6CisJICAgICAgY2FzZSBDU19QQVJJVFlfRVJST1JfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX0RFVklDRV9SRVNFVF9NU0dfRkFJTEVEOgorCSAgICAgIGNhc2UgQ1NfSURfTVNHX0ZBSUxFRDoKKwkgICAgICBjYXNlIENTX1VORVhQX0JVU19GUkVFOgorCQlob3N0X3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBDU19EQVRBX1VOREVSUlVOOgorCQlob3N0X3N0YXR1cyA9IERJRF9PSzsKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRU1FUkcgInFwdGklZDogdW5rbm93biBjb21wbGV0aW9uIHN0YXR1cyAweCUwNHhcbiIsCisJCSAgICAgICBpZCwgc3RzLT5jb21wbGV0aW9uX3N0YXR1cyk7CisJCWhvc3Rfc3RhdHVzID0gRElEX0VSUk9SOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHN0cy0+c2NzaV9zdGF0dXMgJiBTVEFUVVNfTUFTSykgfCAoaG9zdF9zdGF0dXMgPDwgMTYpOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqcWxvZ2ljcHRpX2ludHJfaGFuZGxlcihzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKkNtbmQsICpkb25lX3F1ZXVlID0gTlVMTDsKKwlzdHJ1Y3QgU3RhdHVzX0VudHJ5ICpzdHM7CisJdV9pbnQgaW5fcHRyLCBvdXRfcHRyOworCisJaWYgKCEoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIFNCVVNfU1RBVCkgJiBTQlVTX1NUQVRfUklOVCkpCisJCXJldHVybiBOVUxMOworCQkKKwlpbl9wdHIgPSBzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgTUJPWDUpOworCXNidXNfd3JpdGV3KEhDQ1RSTF9DUklSUSwgcXB0aS0+cXJlZ3MgKyBIQ0NUUkwpOworCWlmIChzYnVzX3JlYWR3KHFwdGktPnFyZWdzICsgU0JVU19TRU1BUEhPUkUpICYgU0JVU19TRU1BUEhPUkVfTENLKSB7CisJCXN3aXRjaCAoc2J1c19yZWFkdyhxcHRpLT5xcmVncyArIE1CT1gwKSkgeworCQljYXNlIEFTWU5DX1NDU0lfQlVTX1JFU0VUOgorCQljYXNlIEVYRUNVVElPTl9USU1FT1VUX1JFU0VUOgorCQkJcXB0aS0+c2VuZF9tYXJrZXIgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU5WQUxJRF9DT01NQU5EOgorCQljYXNlIEhPU1RfSU5URVJGQUNFX0VSUk9SOgorCQljYXNlIENPTU1BTkRfRVJST1I6CisJCWNhc2UgQ09NTUFORF9QQVJBTV9FUlJPUjoKKwkJCWJyZWFrOworCQl9OworCQlzYnVzX3dyaXRldygwLCBxcHRpLT5xcmVncyArIFNCVVNfU0VNQVBIT1JFKTsKKwl9CisKKwkvKiBUaGlzIGxvb2tzIGxpa2UgYSBuZXR3b3JrIGRyaXZlciEgKi8KKwlvdXRfcHRyID0gcXB0aS0+cmVzX291dF9wdHI7CisJd2hpbGUgKG91dF9wdHIgIT0gaW5fcHRyKSB7CisJCXVfaW50IGNtZF9zbG90OworCisJCXN0cyA9IChzdHJ1Y3QgU3RhdHVzX0VudHJ5ICopICZxcHRpLT5yZXNfY3B1W291dF9wdHJdOworCQlvdXRfcHRyID0gTkVYVF9SRVNfUFRSKG91dF9wdHIpOworCisJCS8qIFdlIHN0b3JlIGFuIGluZGV4IGluIHRoZSBoYW5kbGUsIG5vdCB0aGUgcG9pbnRlciBpbgorCQkgKiBzb21lIGZvcm0uICBUaGlzIGF2b2lkcyBwcm9ibGVtcyBkdWUgdG8gdGhlIGZhY3QKKwkJICogdGhhdCB0aGUgaGFuZGxlIHByb3ZpZGVkIGlzIG9ubHkgMzItYml0cy4gLURhdmVNCisJCSAqLworCQljbWRfc2xvdCA9IHN0cy0+aGFuZGxlOworCQlDbW5kID0gcXB0aS0+Y21kX3Nsb3RzW2NtZF9zbG90XTsKKwkJcXB0aS0+Y21kX3Nsb3RzW2NtZF9zbG90XSA9IE5VTEw7CisKKwkJaWYgKHN0cy0+Y29tcGxldGlvbl9zdGF0dXMgPT0gQ1NfUkVTRVRfT0NDVVJSRUQgfHwKKwkJICAgIHN0cy0+Y29tcGxldGlvbl9zdGF0dXMgPT0gQ1NfQUJPUlRFRCB8fAorCQkgICAgKHN0cy0+c3RhdHVzX2ZsYWdzICYgU1RGX0JVU19SRVNFVCkpCisJCQlxcHRpLT5zZW5kX21hcmtlciA9IDE7CisKKwkJaWYgKHN0cy0+c3RhdGVfZmxhZ3MgJiBTRl9HT1RfU0VOU0UpCisJCQltZW1jcHkoQ21uZC0+c2Vuc2VfYnVmZmVyLCBzdHMtPnJlcV9zZW5zZV9kYXRhLAorCQkJICAgICAgIHNpemVvZihDbW5kLT5zZW5zZV9idWZmZXIpKTsKKworCQlpZiAoc3RzLT5oZHIuZW50cnlfdHlwZSA9PSBFTlRSWV9TVEFUVVMpCisJCQlDbW5kLT5yZXN1bHQgPQorCQkJICAgIHFsb2dpY3B0aV9yZXR1cm5fc3RhdHVzKHN0cywgcXB0aS0+cXB0aV9pZCk7CisJCWVsc2UKKwkJCUNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKworCQlpZiAoQ21uZC0+dXNlX3NnKSB7CisJCQlzYnVzX3VubWFwX3NnKHFwdGktPnNkZXYsCisJCQkJICAgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKUNtbmQtPmJ1ZmZlciwKKwkJCQkgICAgICBDbW5kLT51c2Vfc2csCisJCQkJICAgICAgQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJc2J1c191bm1hcF9zaW5nbGUocXB0aS0+c2RldiwKKwkJCQkJICAoX191MzIpKCh1bnNpZ25lZCBsb25nKUNtbmQtPlNDcC5wdHIpLAorCQkJCQkgIENtbmQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJICBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0KKwkJcXB0aS0+Y21kX2NvdW50W0NtbmQtPmRldmljZS0+aWRdLS07CisJCXNidXNfd3JpdGV3KG91dF9wdHIsIHFwdGktPnFyZWdzICsgTUJPWDUpOworCQlDbW5kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgZG9uZV9xdWV1ZTsKKwkJZG9uZV9xdWV1ZSA9IENtbmQ7CisJfQorCXFwdGktPnJlc19vdXRfcHRyID0gb3V0X3B0cjsKKworCXJldHVybiBkb25lX3F1ZXVlOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcXB0aV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKmRxOworCisJc3Bpbl9sb2NrX2lycXNhdmUocXB0aS0+cWhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWRxID0gcWxvZ2ljcHRpX2ludHJfaGFuZGxlcihxcHRpKTsKKworCWlmIChkcSAhPSBOVUxMKSB7CisJCWRvIHsKKwkJCXN0cnVjdCBzY3NpX2NtbmQgKm5leHQ7CisKKwkJCW5leHQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBkcS0+aG9zdF9zY3JpYmJsZTsKKwkJCWRxLT5zY3NpX2RvbmUoZHEpOworCQkJZHEgPSBuZXh0OworCQl9IHdoaWxlIChkcSAhPSBOVUxMKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxcHRpLT5xaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcWxvZ2ljcHRpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKkNtbmQpCit7CisJdV9zaG9ydCBwYXJhbVs2XTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gQ21uZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlpbnQgcmV0dXJuX3N0YXR1cyA9IFNVQ0NFU1M7CisJdTMyIGNtZF9jb29raWU7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJxbG9naWNwdGkgOiBBYm9ydGluZyBjbWQgZm9yIHRndFslZF0gbHVuWyVkXVxuIiwKKwkgICAgICAgKGludClDbW5kLT5kZXZpY2UtPmlkLCAoaW50KUNtbmQtPmRldmljZS0+bHVuKTsKKworCXFsb2dpY3B0aV9kaXNhYmxlX2lycXMocXB0aSk7CisKKwkvKiBGaW5kIHRoZSAzMi1iaXQgY29va2llIHdlIGdhdmUgdG8gdGhlIGZpcm13YXJlIGZvcgorCSAqIHRoaXMgY29tbWFuZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4gKyAxOyBpKyspCisJCWlmIChxcHRpLT5jbWRfc2xvdHNbaV0gPT0gQ21uZCkKKwkJCWJyZWFrOworCWNtZF9jb29raWUgPSBpOworCisJcGFyYW1bMF0gPSBNQk9YX0FCT1JUOworCXBhcmFtWzFdID0gKCgodV9zaG9ydCkgQ21uZC0+ZGV2aWNlLT5pZCkgPDwgOCkgfCBDbW5kLT5kZXZpY2UtPmx1bjsKKwlwYXJhbVsyXSA9IGNtZF9jb29raWUgPj4gMTY7CisJcGFyYW1bM10gPSBjbWRfY29va2llICYgMHhmZmZmOworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKSB8fAorCSAgICAocGFyYW1bMF0gIT0gTUJPWF9DT01NQU5EX0NPTVBMRVRFKSkgeworCQlwcmludGsoS0VSTl9FTUVSRyAicWxvZ2ljcHRpIDogc2NzaSBhYm9ydCBmYWlsdXJlOiAleFxuIiwgcGFyYW1bMF0pOworCQlyZXR1cm5fc3RhdHVzID0gRkFJTEVEOworCX0KKworCXFsb2dpY3B0aV9lbmFibGVfaXJxcyhxcHRpKTsKKworCXJldHVybiByZXR1cm5fc3RhdHVzOworfQorCitzdGF0aWMgaW50IHFsb2dpY3B0aV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpDbW5kKQoreworCXVfc2hvcnQgcGFyYW1bNl07CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IENtbmQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gKHN0cnVjdCBxbG9naWNwdGkgKikgaG9zdC0+aG9zdGRhdGE7CisJaW50IHJldHVybl9zdGF0dXMgPSBTVUNDRVNTOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAicWxvZ2ljcHRpIDogUmVzZXR0aW5nIFNDU0kgYnVzIVxuIik7CisKKwlxbG9naWNwdGlfZGlzYWJsZV9pcnFzKHFwdGkpOworCisJcGFyYW1bMF0gPSBNQk9YX0JVU19SRVNFVDsKKwlwYXJhbVsxXSA9IHFwdGktPmhvc3RfcGFyYW0uYnVzX3Jlc2V0X2RlbGF5OworCWlmIChxbG9naWNwdGlfbWJveF9jb21tYW5kKHFwdGksIHBhcmFtLCAwKSB8fAorCSAgIChwYXJhbVswXSAhPSBNQk9YX0NPTU1BTkRfQ09NUExFVEUpKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJxbG9naWNpc3AgOiBzY3NpIGJ1cyByZXNldCBmYWlsdXJlOiAleFxuIiwgcGFyYW1bMF0pOworCQlyZXR1cm5fc3RhdHVzID0gRkFJTEVEOworCX0KKworCXFsb2dpY3B0aV9lbmFibGVfaXJxcyhxcHRpKTsKKworCXJldHVybiByZXR1cm5fc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLmRldGVjdAkJCT0gcWxvZ2ljcHRpX2RldGVjdCwKKwkucmVsZWFzZQkJPSBxbG9naWNwdGlfcmVsZWFzZSwKKwkuaW5mbwkJCT0gcWxvZ2ljcHRpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBxbG9naWNwdGlfcXVldWVjb21tYW5kX3Nsb3csCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBxbG9naWNwdGlfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcWxvZ2ljcHRpX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4sCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFFMT0dJQ1BUSV9NQVhfU0coUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAorCS5jbWRfcGVyX2x1bgkJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5oIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDFjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmgKQEAgLTAsMCArMSw1MDggQEAKKy8qIHFsb2dpY3B0aS5oOiBQZXJmb3JtYW5jZSBUZWNobm9sb2dpZXMgUWxvZ2ljSVNQIHNidXMgY2FyZCBkZWZpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXBmcy5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9RTE9HSUNQVElfSAorI2RlZmluZSBfUUxPR0lDUFRJX0gKKworLyogUWxvZ2ljL1NCVVMgY29udHJvbGxlciByZWdpc3RlcnMuICovCisjZGVmaW5lIFNCVVNfQ0ZHMQkweDAwNlVMCisjZGVmaW5lIFNCVVNfQ1RSTAkweDAwOFVMCisjZGVmaW5lIFNCVVNfU1RBVAkweDAwYVVMCisjZGVmaW5lIFNCVVNfU0VNQVBIT1JFCTB4MDBjVUwKKyNkZWZpbmUgQ01EX0RNQV9DVFJMCTB4MDIyVUwKKyNkZWZpbmUgREFUQV9ETUFfQ1RSTAkweDA0MlVMCisjZGVmaW5lIE1CT1gwCQkweDA4MFVMCisjZGVmaW5lIE1CT1gxCQkweDA4MlVMCisjZGVmaW5lIE1CT1gyCQkweDA4NFVMCisjZGVmaW5lIE1CT1gzCQkweDA4NlVMCisjZGVmaW5lIE1CT1g0CQkweDA4OFVMCisjZGVmaW5lIE1CT1g1CQkweDA4YVVMCisjZGVmaW5lIENQVV9DTUQJCTB4MjE0VUwKKyNkZWZpbmUgQ1BVX09SSURFCTB4MjI0VUwKKyNkZWZpbmUgQ1BVX1BDVFJMCTB4MjcyVUwKKyNkZWZpbmUgQ1BVX1BESUZGCTB4Mjc2VUwKKyNkZWZpbmUgUklTQ19QU1IJMHg0MjBVTAorI2RlZmluZSBSSVNDX01UUkVHCTB4NDJFVUwKKyNkZWZpbmUgSENDVFJMCQkweDQ0MFVMCisKKy8qIFNDU0kgcGFyYW1ldGVycyBmb3IgdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIE1BWF9UQVJHRVRTCTE2CisjZGVmaW5lIE1BWF9MVU5TCTgKKworLyogV2l0aCB0aGUgcWxvZ2ljIGludGVyZmFjZSwgZXZlcnkgcXVldWUgc2xvdCBjYW4gaG9sZCBhIFNDU0kKKyAqIGNvbW1hbmQgd2l0aCB1cCB0byA0IHNjYXR0ZXIvZ2F0aGVyIGVudHJpZXMuICBJZiB3ZSBuZWVkIG1vcmUKKyAqIHRoYW4gNCBlbnRyaWVzLCBjb250aW51YXRpb24gZW50cmllcyBjYW4gYmUgdXNlZCB0aGF0IGhvbGQKKyAqIGFub3RoZXIgNyBlbnRyaWVzIGVhY2guICBVbmxpa2UgZm9yIG90aGVyIGRyaXZlcnMsIHRoaXMgbWVhbnMKKyAqIHRoYXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIGVudHJpZXMgd2UgY2FuCisgKiBzdXBwb3J0IGF0IGFueSBnaXZlbiB0aW1lIGlzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBxdWV1ZQorICogc2xvdHMgYXZhaWxhYmxlLiAgVGhhdCBpcywgaG9zdC0+Y2FuX3F1ZXVlIGFuZCBob3N0LT5zZ190YWJsZXNpemUKKyAqIGFyZSBkeW5hbWljIGFuZCBfbm90XyBpbmRlcGVuZGVudC4gIFRoaXMgYWxsIHdvcmtzIGZpbmUgYmVjYXVzZQorICogcmVxdWVzdHMgYXJlIHF1ZXVlZCBzZXJpYWxseSBhbmQgdGhlIHNjYXR0ZXIvZ2F0aGVyIGxpbWl0IGlzCisgKiBkZXRlcm1pbmVkIGZvciBlYWNoIHF1ZXVlIHJlcXVlc3QgYW5ldy4KKyAqLworI2RlZmluZSBRTE9HSUNQVElfUkVRX1FVRVVFX0xFTgkyNTUJLyogbXVzdCBiZSBwb3dlciBvZiB0d28gLSAxICovCisjZGVmaW5lIFFMT0dJQ1BUSV9NQVhfU0cocWwpCSg0ICsgKChxbCkgPiAwKSA/IDcqKChxbCkgLSAxKSA6IDApCisKKy8qIG1haWxib3ggY29tbWFuZCBjb21wbGV0ZSBzdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgTUJPWF9DT01NQU5EX0NPTVBMRVRFCQkweDQwMDAKKyNkZWZpbmUgSU5WQUxJRF9DT01NQU5ECQkJMHg0MDAxCisjZGVmaW5lIEhPU1RfSU5URVJGQUNFX0VSUk9SCQkweDQwMDIKKyNkZWZpbmUgVEVTVF9GQUlMRUQJCQkweDQwMDMKKyNkZWZpbmUgQ09NTUFORF9FUlJPUgkJCTB4NDAwNQorI2RlZmluZSBDT01NQU5EX1BBUkFNX0VSUk9SCQkweDQwMDYKKworLyogYXN5bmMgZXZlbnQgc3RhdHVzIGNvZGVzICovCisjZGVmaW5lIEFTWU5DX1NDU0lfQlVTX1JFU0VUCQkweDgwMDEKKyNkZWZpbmUgU1lTVEVNX0VSUk9SCQkJMHg4MDAyCisjZGVmaW5lIFJFUVVFU1RfVFJBTlNGRVJfRVJST1IJCTB4ODAwMworI2RlZmluZSBSRVNQT05TRV9UUkFOU0ZFUl9FUlJPUgkJMHg4MDA0CisjZGVmaW5lIFJFUVVFU1RfUVVFVUVfV0FLRVVQCQkweDgwMDUKKyNkZWZpbmUgRVhFQ1VUSU9OX1RJTUVPVVRfUkVTRVQJCTB4ODAwNgorCisvKiBBbSBJIGZ1Y2tpbmcgcGVkYW50aWMgb3Igd2hhdD8gKi8KK3N0cnVjdCBFbnRyeV9oZWFkZXIgeworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CWVudHJ5X2NudDsKKwl1OAllbnRyeV90eXBlOworCXU4CWZsYWdzOworCXU4CXN5c19kZWZfMTsKKyNlbHNlIC8qIF9fTElUVExFX0VORElBTiAqLworCXU4CWVudHJ5X3R5cGU7CisJdTgJZW50cnlfY250OworCXU4CXN5c19kZWZfMTsKKwl1OAlmbGFnczsKKyNlbmRpZgorfTsKKworLyogZW50cnkgaGVhZGVyIHR5cGUgY29tbWFuZHMgKi8KKyNkZWZpbmUgRU5UUllfQ09NTUFORAkJMQorI2RlZmluZSBFTlRSWV9DT05USU5VQVRJT04JMgorI2RlZmluZSBFTlRSWV9TVEFUVVMJCTMKKyNkZWZpbmUgRU5UUllfTUFSS0VSCQk0CisjZGVmaW5lIEVOVFJZX0VYVEVOREVEX0NPTU1BTkQJNQorCisvKiBlbnRyeSBoZWFkZXIgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFRkxBR19DT05USU5VQVRJT04JMQorI2RlZmluZSBFRkxBR19CVVNZCQkyCisjZGVmaW5lIEVGTEFHX0JBRF9IRUFERVIJNAorI2RlZmluZSBFRkxBR19CQURfUEFZTE9BRAk4CisKK3N0cnVjdCBkYXRhc2VnIHsKKwl1MzIJZF9iYXNlOworCXUzMglkX2NvdW50OworfTsKKworc3RydWN0IENvbW1hbmRfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXUzMgkJCWhhbmRsZTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAkJCXRhcmdldF9pZDsKKwl1OAkJCXRhcmdldF9sdW47CisjZWxzZSAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KKwl1OAkJCXRhcmdldF9sdW47CisJdTgJCQl0YXJnZXRfaWQ7CisjZW5kaWYKKwl1MTYJCQljZGJfbGVuZ3RoOworCXUxNgkJCWNvbnRyb2xfZmxhZ3M7CisJdTE2CQkJcnN2ZDsKKwl1MTYJCQl0aW1lX291dDsKKwl1MTYJCQlzZWdtZW50X2NudDsKKwl1OAkJCWNkYlsxMl07CisJc3RydWN0IGRhdGFzZWcJCWRhdGFzZWdbNF07Cit9OworCisvKiBjb21tYW5kIGVudHJ5IGNvbnRyb2wgZmxhZyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDRkxBR19OT0RJU0MJCTB4MDEKKyNkZWZpbmUgQ0ZMQUdfSEVBRF9UQUcJCTB4MDIKKyNkZWZpbmUgQ0ZMQUdfT1JERVJFRF9UQUcJMHgwNAorI2RlZmluZSBDRkxBR19TSU1QTEVfVEFHCTB4MDgKKyNkZWZpbmUgQ0ZMQUdfVEFSX1JUTgkJMHgxMAorI2RlZmluZSBDRkxBR19SRUFECQkweDIwCisjZGVmaW5lIENGTEFHX1dSSVRFCQkweDQwCisKK3N0cnVjdCBFeHRfQ29tbWFuZF9FbnRyeSB7CisJc3RydWN0IEVudHJ5X2hlYWRlcgloZHI7CisJdTMyCQkJaGFuZGxlOworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQkJdGFyZ2V0X2lkOworCXU4CQkJdGFyZ2V0X2x1bjsKKyNlbHNlIC8qIF9fTElUVExFX0VORElBTiAqLworCXU4CQkJdGFyZ2V0X2x1bjsKKwl1OAkJCXRhcmdldF9pZDsKKyNlbmRpZgorCXUxNgkJCWNkYl9sZW5ndGg7CisJdTE2CQkJY29udHJvbF9mbGFnczsKKwl1MTYJCQlyc3ZkOworCXUxNgkJCXRpbWVfb3V0OworCXUxNgkJCXNlZ21lbnRfY250OworCXU4CQkJY2RiWzQ0XTsKK307CisKK3N0cnVjdCBDb250aW51YXRpb25fRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXUzMgkJCXJlc2VydmVkOworCXN0cnVjdCBkYXRhc2VnCQlkYXRhc2VnWzddOworfTsKKworc3RydWN0IE1hcmtlcl9FbnRyeSB7CisJc3RydWN0IEVudHJ5X2hlYWRlcgloZHI7CisJdTMyCQkJcmVzZXJ2ZWQ7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCQl0YXJnZXRfaWQ7CisJdTgJCQl0YXJnZXRfbHVuOworI2Vsc2UgLyogX19MSVRUTEVfRU5ESUFOICovCisJdTgJCQl0YXJnZXRfbHVuOworCXU4CQkJdGFyZ2V0X2lkOworI2VuZGlmCisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCQlyc3ZkOworCXU4CQkJbW9kaWZpZXI7CisjZWxzZSAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KKwl1OAkJCW1vZGlmaWVyOworCXU4CQkJcnN2ZDsKKyNlbmRpZgorCXU4CQkJcnN2ZHNbNTJdOworfTsKKworLyogbWFya2VyIGVudHJ5IG1vZGlmaWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNZTkNfREVWSUNFCTAKKyNkZWZpbmUgU1lOQ19UQVJHRVQJMQorI2RlZmluZSBTWU5DX0FMTAkyCisKK3N0cnVjdCBTdGF0dXNfRW50cnkgeworCXN0cnVjdCBFbnRyeV9oZWFkZXIJaGRyOworCXUzMgkJCWhhbmRsZTsKKwl1MTYJCQlzY3NpX3N0YXR1czsKKwl1MTYJCQljb21wbGV0aW9uX3N0YXR1czsKKwl1MTYJCQlzdGF0ZV9mbGFnczsKKwl1MTYJCQlzdGF0dXNfZmxhZ3M7CisJdTE2CQkJdGltZTsKKwl1MTYJCQlyZXFfc2Vuc2VfbGVuOworCXUzMgkJCXJlc2lkdWFsOworCXU4CQkJcnN2ZFs4XTsKKwl1OAkJCXJlcV9zZW5zZV9kYXRhWzMyXTsKK307CisKKy8qIHN0YXR1cyBlbnRyeSBjb21wbGV0aW9uIHN0YXR1cyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDU19DT01QTEVURQkJCTB4MDAwMAorI2RlZmluZSBDU19JTkNPTVBMRVRFCQkJMHgwMDAxCisjZGVmaW5lIENTX0RNQV9FUlJPUgkJCTB4MDAwMgorI2RlZmluZSBDU19UUkFOU1BPUlRfRVJST1IJCTB4MDAwMworI2RlZmluZSBDU19SRVNFVF9PQ0NVUlJFRAkJMHgwMDA0CisjZGVmaW5lIENTX0FCT1JURUQJCQkweDAwMDUKKyNkZWZpbmUgQ1NfVElNRU9VVAkJCTB4MDAwNgorI2RlZmluZSBDU19EQVRBX09WRVJSVU4JCQkweDAwMDcKKyNkZWZpbmUgQ1NfQ09NTUFORF9PVkVSUlVOCQkweDAwMDgKKyNkZWZpbmUgQ1NfU1RBVFVTX09WRVJSVU4JCTB4MDAwOQorI2RlZmluZSBDU19CQURfTUVTU0FHRQkJCTB4MDAwYQorI2RlZmluZSBDU19OT19NRVNTQUdFX09VVAkJMHgwMDBiCisjZGVmaW5lIENTX0VYVF9JRF9GQUlMRUQJCTB4MDAwYworI2RlZmluZSBDU19JREVfTVNHX0ZBSUxFRAkJMHgwMDBkCisjZGVmaW5lIENTX0FCT1JUX01TR19GQUlMRUQJCTB4MDAwZQorI2RlZmluZSBDU19SRUpFQ1RfTVNHX0ZBSUxFRAkJMHgwMDBmCisjZGVmaW5lIENTX05PUF9NU0dfRkFJTEVECQkweDAwMTAKKyNkZWZpbmUgQ1NfUEFSSVRZX0VSUk9SX01TR19GQUlMRUQJMHgwMDExCisjZGVmaW5lIENTX0RFVklDRV9SRVNFVF9NU0dfRkFJTEVECTB4MDAxMgorI2RlZmluZSBDU19JRF9NU0dfRkFJTEVECQkweDAwMTMKKyNkZWZpbmUgQ1NfVU5FWFBfQlVTX0ZSRUUJCTB4MDAxNAorI2RlZmluZSBDU19EQVRBX1VOREVSUlVOCQkweDAwMTUKKyNkZWZpbmUgQ1NfQlVTX1JFU0VUCQkJMHgwMDFjCisKKy8qIHN0YXR1cyBlbnRyeSBzdGF0ZSBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNGX0dPVF9CVVMJCQkweDAxMDAKKyNkZWZpbmUgU0ZfR09UX1RBUkdFVAkJCTB4MDIwMAorI2RlZmluZSBTRl9TRU5UX0NEQgkJCTB4MDQwMAorI2RlZmluZSBTRl9UUkFOU0ZFUlJFRF9EQVRBCQkweDA4MDAKKyNkZWZpbmUgU0ZfR09UX1NUQVRVUwkJCTB4MTAwMAorI2RlZmluZSBTRl9HT1RfU0VOU0UJCQkweDIwMDAKKworLyogc3RhdHVzIGVudHJ5IHN0YXR1cyBmbGFnIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNURl9ESVNDT05ORUNUCQkJMHgwMDAxCisjZGVmaW5lIFNURl9TWU5DSFJPTk9VUwkJCTB4MDAwMgorI2RlZmluZSBTVEZfUEFSSVRZX0VSUk9SCQkweDAwMDQKKyNkZWZpbmUgU1RGX0JVU19SRVNFVAkJCTB4MDAwOAorI2RlZmluZSBTVEZfREVWSUNFX1JFU0VUCQkweDAwMTAKKyNkZWZpbmUgU1RGX0FCT1JURUQJCQkweDAwMjAKKyNkZWZpbmUgU1RGX1RJTUVPVVQJCQkweDAwNDAKKyNkZWZpbmUgU1RGX05FR09USUFUSU9OCQkJMHgwMDgwCisKKy8qIG1haWxib3ggY29tbWFuZHMgKi8KKyNkZWZpbmUgTUJPWF9OT19PUAkJCTB4MDAwMAorI2RlZmluZSBNQk9YX0xPQURfUkFNCQkJMHgwMDAxCisjZGVmaW5lIE1CT1hfRVhFQ19GSVJNV0FSRQkJMHgwMDAyCisjZGVmaW5lIE1CT1hfRFVNUF9SQU0JCQkweDAwMDMKKyNkZWZpbmUgTUJPWF9XUklURV9SQU1fV09SRAkJMHgwMDA0CisjZGVmaW5lIE1CT1hfUkVBRF9SQU1fV09SRAkJMHgwMDA1CisjZGVmaW5lIE1CT1hfTUFJTEJPWF9SRUdfVEVTVAkJMHgwMDA2CisjZGVmaW5lIE1CT1hfVkVSSUZZX0NIRUNLU1VNCQkweDAwMDcKKyNkZWZpbmUgTUJPWF9BQk9VVF9GSVJNV0FSRQkJMHgwMDA4CisjZGVmaW5lIE1CT1hfQ0hFQ0tfRklSTVdBUkUJCTB4MDAwZQorI2RlZmluZSBNQk9YX0lOSVRfUkVRX1FVRVVFCQkweDAwMTAKKyNkZWZpbmUgTUJPWF9JTklUX1JFU19RVUVVRQkJMHgwMDExCisjZGVmaW5lIE1CT1hfRVhFQ1VURV9JT0NCCQkweDAwMTIKKyNkZWZpbmUgTUJPWF9XQUtFX1VQCQkJMHgwMDEzCisjZGVmaW5lIE1CT1hfU1RPUF9GSVJNV0FSRQkJMHgwMDE0CisjZGVmaW5lIE1CT1hfQUJPUlQJCQkweDAwMTUKKyNkZWZpbmUgTUJPWF9BQk9SVF9ERVZJQ0UJCTB4MDAxNgorI2RlZmluZSBNQk9YX0FCT1JUX1RBUkdFVAkJMHgwMDE3CisjZGVmaW5lIE1CT1hfQlVTX1JFU0VUCQkJMHgwMDE4CisjZGVmaW5lIE1CT1hfU1RPUF9RVUVVRQkJCTB4MDAxOQorI2RlZmluZSBNQk9YX1NUQVJUX1FVRVVFCQkweDAwMWEKKyNkZWZpbmUgTUJPWF9TSU5HTEVfU1RFUF9RVUVVRQkJMHgwMDFiCisjZGVmaW5lIE1CT1hfQUJPUlRfUVVFVUUJCTB4MDAxYworI2RlZmluZSBNQk9YX0dFVF9ERVZfUVVFVUVfU1RBVFVTCTB4MDAxZAorI2RlZmluZSBNQk9YX0dFVF9GSVJNV0FSRV9TVEFUVVMJMHgwMDFmCisjZGVmaW5lIE1CT1hfR0VUX0lOSVRfU0NTSV9JRAkJMHgwMDIwCisjZGVmaW5lIE1CT1hfR0VUX1NFTEVDVF9USU1FT1VUCQkweDAwMjEKKyNkZWZpbmUgTUJPWF9HRVRfUkVUUllfQ09VTlQJCTB4MDAyMgorI2RlZmluZSBNQk9YX0dFVF9UQUdfQUdFX0xJTUlUCQkweDAwMjMKKyNkZWZpbmUgTUJPWF9HRVRfQ0xPQ0tfUkFURQkJMHgwMDI0CisjZGVmaW5lIE1CT1hfR0VUX0FDVF9ORUdfU1RBVEUJCTB4MDAyNQorI2RlZmluZSBNQk9YX0dFVF9BU1lOQ19EQVRBX1NFVFVQX1RJTUUJMHgwMDI2CisjZGVmaW5lIE1CT1hfR0VUX1NCVVNfUEFSQU1TCQkweDAwMjcKKyNkZWZpbmUgTUJPWF9HRVRfVEFSR0VUX1BBUkFNUwkJMHgwMDI4CisjZGVmaW5lIE1CT1hfR0VUX0RFVl9RVUVVRV9QQVJBTVMJMHgwMDI5CisjZGVmaW5lIE1CT1hfU0VUX0lOSVRfU0NTSV9JRAkJMHgwMDMwCisjZGVmaW5lIE1CT1hfU0VUX1NFTEVDVF9USU1FT1VUCQkweDAwMzEKKyNkZWZpbmUgTUJPWF9TRVRfUkVUUllfQ09VTlQJCTB4MDAzMgorI2RlZmluZSBNQk9YX1NFVF9UQUdfQUdFX0xJTUlUCQkweDAwMzMKKyNkZWZpbmUgTUJPWF9TRVRfQ0xPQ0tfUkFURQkJMHgwMDM0CisjZGVmaW5lIE1CT1hfU0VUX0FDVElWRV9ORUdfU1RBVEUJMHgwMDM1CisjZGVmaW5lIE1CT1hfU0VUX0FTWU5DX0RBVEFfU0VUVVBfVElNRQkweDAwMzYKKyNkZWZpbmUgTUJPWF9TRVRfU0JVU19DT05UUk9MX1BBUkFNUwkweDAwMzcKKyNkZWZpbmUgTUJPWF9TRVRfVEFSR0VUX1BBUkFNUwkJMHgwMDM4CisjZGVmaW5lIE1CT1hfU0VUX0RFVl9RVUVVRV9QQVJBTVMJMHgwMDM5CisKK3N0cnVjdCBob3N0X3BhcmFtIHsKKwl1X3Nob3J0CQlpbml0aWF0b3Jfc2NzaV9pZDsKKwl1X3Nob3J0CQlidXNfcmVzZXRfZGVsYXk7CisJdV9zaG9ydAkJcmV0cnlfY291bnQ7CisJdV9zaG9ydAkJcmV0cnlfZGVsYXk7CisJdV9zaG9ydAkJYXN5bmNfZGF0YV9zZXR1cF90aW1lOworCXVfc2hvcnQJCXJlcV9hY2tfYWN0aXZlX25lZ2F0aW9uOworCXVfc2hvcnQJCWRhdGFfbGluZV9hY3RpdmVfbmVnYXRpb247CisJdV9zaG9ydAkJZGF0YV9kbWFfYnVyc3RfZW5hYmxlOworCXVfc2hvcnQJCWNvbW1hbmRfZG1hX2J1cnN0X2VuYWJsZTsKKwl1X3Nob3J0CQl0YWdfYWdpbmc7CisJdV9zaG9ydAkJc2VsZWN0aW9uX3RpbWVvdXQ7CisJdV9zaG9ydAkJbWF4X3F1ZXVlX2RlcHRoOworfTsKKworLyoKKyAqIERldmljZSBGbGFnczoKKyAqCisgKiBCaXQgIE5hbWUKKyAqIC0tLS0tLS0tLQorICogIDcgICBEaXNjb25uZWN0IFByaXZpbGVnZQorICogIDYgICBQYXJpdHkgQ2hlY2tpbmcKKyAqICA1ICAgV2lkZSBEYXRhIFRyYW5zZmVycworICogIDQgICBTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVycworICogIDMgICBUYWdnZWQgUXVldWluZworICogIDIgICBBdXRvbWF0aWMgUmVxdWVzdCBTZW5zZQorICogIDEgICBTdG9wIFF1ZXVlIG9uIENoZWNrIENvbmRpdGlvbgorICogIDAgICBSZW5lZ290aWF0ZSBvbiBFcnJvcgorICovCisKK3N0cnVjdCBkZXZfcGFyYW0geworCXVfc2hvcnQJCWRldmljZV9mbGFnczsKKwl1X3Nob3J0CQlleGVjdXRpb25fdGhyb3R0bGU7CisJdV9zaG9ydAkJc3luY2hyb25vdXNfcGVyaW9kOworCXVfc2hvcnQJCXN5bmNocm9ub3VzX29mZnNldDsKKwl1X3Nob3J0CQlkZXZpY2VfZW5hYmxlOworCXVfc2hvcnQJCXJlc2VydmVkOyAvKiBwYWQgKi8KK307CisKKy8qCisgKiBUaGUgcmVzdWx0IHF1ZXVlIGNhbiBiZSBxdWl0ZSBhIGJpdCBzbWFsbGVyIHNpbmNlIGNvbnRpbnVhdGlvbiBlbnRyaWVzCisgKiBkbyBub3Qgc2hvdyB1cCB0aGVyZToKKyAqLworI2RlZmluZSBSRVNfUVVFVUVfTEVOCQkyNTUJLyogTXVzdCBiZSBwb3dlciBvZiB0d28gLSAxICovCisjZGVmaW5lIFFVRVVFX0VOVFJZX0xFTgkJNjQKKworI2RlZmluZSBORVhUX1JFUV9QVFIod2hlZWUpICAgKCgod2hlZWUpICsgMSkgJiBRTE9HSUNQVElfUkVRX1FVRVVFX0xFTikKKyNkZWZpbmUgTkVYVF9SRVNfUFRSKHdoZWVlKSAgICgoKHdoZWVlKSArIDEpICYgUkVTX1FVRVVFX0xFTikKKyNkZWZpbmUgUFJFVl9SRVFfUFRSKHdoZWVlKSAgICgoKHdoZWVlKSAtIDEpICYgUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pCisjZGVmaW5lIFBSRVZfUkVTX1BUUih3aGVlZSkgICAoKCh3aGVlZSkgLSAxKSAmIFJFU19RVUVVRV9MRU4pCisKK3N0cnVjdCBwdGlfcXVldWVfZW50cnkgeworCWNoYXIgX19vcGFxdWVbUVVFVUVfRU5UUllfTEVOXTsKK307CisKK3N0cnVjdCBzY3NpX2NtbmQ7CisKKy8qIFNvZnR3YXJlIHN0YXRlIGZvciB0aGUgZHJpdmVyLiAqLworc3RydWN0IHFsb2dpY3B0aSB7CisJLyogVGhlc2UgYXJlIHRoZSBob3QgZWxlbWVudHMgaW4gdGhlIGNhY2hlLCBzbyB0aGV5IGNvbWUgZmlyc3QuICovCisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICpxcmVnczsgICAgICAgICAgICAgICAgLyogQWRhcHRlciByZWdpc3RlcnMgICAgICAgICAgKi8KKwlzdHJ1Y3QgcHRpX3F1ZXVlX2VudHJ5ICAgKnJlc19jcHU7ICAgICAgICAgICAgICAvKiBQdHIgdG8gUkVTUE9OU0UgYnVmcyAoQ1BVKSAqLworCXN0cnVjdCBwdGlfcXVldWVfZW50cnkgICAqcmVxX2NwdTsgICAgICAgICAgICAgIC8qIFB0ciB0byBSRVFVRVNUIGJ1ZnMgKENQVSkgICovCisKKwl1X2ludAkgICAgICAgICAgICAgICAgICByZXFfaW5fcHRyOwkJLyogaW5kZXggb2YgbmV4dCByZXF1ZXN0IHNsb3QgKi8KKwl1X2ludAkgICAgICAgICAgICAgICAgICByZXNfb3V0X3B0cjsJCS8qIGluZGV4IG9mIG5leHQgcmVzdWx0IHNsb3QgICovCisJbG9uZwkgICAgICAgICAgICAgICAgICBzZW5kX21hcmtlcjsJCS8qIG11c3Qgd2Ugc2VuZCBhIG1hcmtlcj8gICAgICovCisJc3RydWN0IHNidXNfZGV2CQkgKnNkZXY7CisJdW5zaWduZWQgbG9uZwkJICBfX3BhZDsKKworCWludCAgICAgICAgICAgICAgICAgICAgICAgY21kX2NvdW50W01BWF9UQVJHRVRTXTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgIHRhZ19hZ2VzW01BWF9UQVJHRVRTXTsKKworCS8qIFRoZSBjbWQtPmhhbmRsZXIgaXMgb25seSAzMi1iaXRzLCBzbyB0aGF0IHRoaW5ncyB3b3JrIGV2ZW4gb24gbW9uc3RlcgorCSAqIEV4MDAwIHNwYXJjNjQgbWFjaGluZXMgd2l0aCA+NEdCIG9mIHJhbSB3ZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCisJICogc2NzaSBjb21tYW5kIHBvaW50ZXJzIGhlcmUuICBUaGlzIGlzIGVzc2VudGlhbGx5IHdoYXQgTWF0dCBKYWNvYiBkb2VzLiAtRGF2ZU0KKwkgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICAgKmNtZF9zbG90c1tRTE9HSUNQVElfUkVRX1FVRVVFX0xFTiArIDFdOworCisJLyogVGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzIGFyZSB1bmltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2UuICovCisJc3RydWN0IHFsb2dpY3B0aSAgICAgICAgICpuZXh0OworCV9fdTMyICAgICAgICAgICAgICAgICAgICAgcmVzX2R2bWE7ICAgICAgICAgICAgIC8qIFB0ciB0byBSRVNQT05TRSBidWZzIChEVk1BKSovCisJX191MzIgICAgICAgICAgICAgICAgICAgICByZXFfZHZtYTsgICAgICAgICAgICAgLyogUHRyIHRvIFJFUVVFU1QgYnVmcyAoRFZNQSkgKi8KKwl1X2NoYXIJICAgICAgICAgICAgICAgICAgZndhcmVfbWFqcmV2LCBmd2FyZV9taW5yZXYsIGZ3YXJlX21pY3JldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICAgICAgICAgKnFob3N0OworCWludCAgICAgICAgICAgICAgICAgICAgICAgcXB0aV9pZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHNjc2lfaWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICBwcm9tX25vZGU7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICBwcm9tX25hbWVbNjRdOworCWludCAgICAgICAgICAgICAgICAgICAgICAgaXJxOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50aWFsLCB1bHRyYSwgY2xvY2s7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICBidXJzdHM7CisJc3RydWN0CWhvc3RfcGFyYW0gICAgICAgIGhvc3RfcGFyYW07CisJc3RydWN0CWRldl9wYXJhbSAgICAgICAgIGRldl9wYXJhbVtNQVhfVEFSR0VUU107CisKKwl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICpzcmVnOworI2RlZmluZSBTUkVHX1RQT1dFUiAgICAgICAgICAgICAgIDB4ODAgICAvKiBTdGF0ZSBvZiB0ZXJtcHdyICAgICAgICAgICAqLworI2RlZmluZSBTUkVHX0ZVU0UgICAgICAgICAgICAgICAgIDB4NDAgICAvKiBTdGF0ZSBvZiBvbiBib2FyZCBmdXNlICAgICAqLworI2RlZmluZSBTUkVHX1BESVNBQiAgICAgICAgICAgICAgIDB4MjAgICAvKiBEaXNhYmxlIHN0YXRlIGZvciBwb3dlciBvbiAqLworI2RlZmluZSBTUkVHX0RTRU5TRSAgICAgICAgICAgICAgIDB4MTAgICAvKiBTZW5zZSBmb3IgZGlmZmVyZW50aWFsICAgICAqLworI2RlZmluZSBTUkVHX0lNQVNLICAgICAgICAgICAgICAgIDB4MGMgICAvKiBJbnRlcnJ1cHQgbGV2ZWwgICAgICAgICAgICAqLworI2RlZmluZSBTUkVHX1NQTUFTSyAgICAgICAgICAgICAgIDB4MDMgICAvKiBNYXNrIGZvciBzd2l0Y2ggcGFjayAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgc3dzcmVnOworCXVuc2lnbmVkIGludAkKKwkJZ290aXJxCToJMSwJLyogdGhpcyBpbnN0YW5jZSBnb3QgYW4gaXJxICovCisJCWlzX3B0aQk6IAkxLAkvKiBOb24temVybyBpZiB0aGlzIGlzIGEgUFRJIGJvYXJkLiAqLworCQlzYml0cwk6CTE2OwkvKiBzeW5jbW9kZSBrbm93biBiaXRzICovCit9OworCisvKiBIb3cgdG8gdHdpZGRsZSB0aGVtIGJpdHMuLi4gKi8KKworLyogU0JVUyBjb25maWcgcmVnaXN0ZXIgb25lLiAqLworI2RlZmluZSBTQlVTX0NGRzFfRVBBUiAgICAgICAgICAweDAxMDAgICAgICAvKiBFbmFibGUgcGFyaXR5IGNoZWNraW5nICAgICAgICAgICAqLworI2RlZmluZSBTQlVTX0NGRzFfRk1BU0sgICAgICAgICAweDAwZjAgICAgICAvKiBGb3J0aCBjb2RlIGN5Y2xlIG1hc2sgICAgICAgICAgICAqLworI2RlZmluZSBTQlVTX0NGRzFfQkVOQUIgICAgICAgICAweDAwMDQgICAgICAvKiBCdXJzdCBkdm1hIGVuYWJsZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQlVTX0NGRzFfQjY0ICAgICAgICAgICAweDAwMDMgICAgICAvKiBFbmFibGUgNjRieXRlIGJ1cnN0cyAgICAgICAgICAgICAqLworI2RlZmluZSBTQlVTX0NGRzFfQjMyICAgICAgICAgICAweDAwMDIgICAgICAvKiBFbmFibGUgMzJieXRlIGJ1cnN0cyAgICAgICAgICAgICAqLworI2RlZmluZSBTQlVTX0NGRzFfQjE2ICAgICAgICAgICAweDAwMDEgICAgICAvKiBFbmFibGUgMTZieXRlIGJ1cnN0cyAgICAgICAgICAgICAqLworI2RlZmluZSBTQlVTX0NGRzFfQjggICAgICAgICAgICAweDAwMDggICAgICAvKiBFbmFibGUgOGJ5dGUgYnVyc3RzICAgICAgICAgICAgICAqLworCisvKiBTQlVTIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0JVU19DVFJMX0VESVJRICAgICAgICAgMHgwMDIwICAgICAgLyogRW5hYmxlIERhdGEgRFZNQSBJbnRlcnJ1cHRzICAgICAgKi8KKyNkZWZpbmUgU0JVU19DVFJMX0VDSVJRICAgICAgICAgMHgwMDEwICAgICAgLyogRW5hYmxlIENvbW1hbmQgRFZNQSBJbnRlcnJ1cHRzICAgKi8KKyNkZWZpbmUgU0JVU19DVFJMX0VTSVJRICAgICAgICAgMHgwMDA4ICAgICAgLyogRW5hYmxlIFNDU0kgUHJvY2Vzc29yIEludGVycnVwdHMgKi8KKyNkZWZpbmUgU0JVU19DVFJMX0VSSVJRICAgICAgICAgMHgwMDA0ICAgICAgLyogRW5hYmxlIFJJU0MgUHJvY2Vzc29yIEludGVycnVwdHMgKi8KKyNkZWZpbmUgU0JVU19DVFJMX0dFTkFCICAgICAgICAgMHgwMDAyICAgICAgLyogR2xvYmFsIEludGVycnVwdCBFbmFibGUgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19DVFJMX1JFU0VUICAgICAgICAgMHgwMDAxICAgICAgLyogU29mdCBSZXNldCAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogU0JVUyBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0JVU19TVEFUX0RJTlQgICAgICAgICAgMHgwMDIwICAgICAgLyogRGF0YSBEVk1BIElSUSBwZW5kaW5nICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19TVEFUX0NJTlQgICAgICAgICAgMHgwMDEwICAgICAgLyogQ29tbWFuZCBEVk1BIElSUSBwZW5kaW5nICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19TVEFUX1NJTlQgICAgICAgICAgMHgwMDA4ICAgICAgLyogU0NTSSBQcm9jZXNzb3IgSVJRIHBlbmRpbmcgICAgICAgKi8KKyNkZWZpbmUgU0JVU19TVEFUX1JJTlQgICAgICAgICAgMHgwMDA0ICAgICAgLyogUklTQyBQcm9jZXNzb3IgSVJRIHBlbmRpbmcgICAgICAgKi8KKyNkZWZpbmUgU0JVU19TVEFUX0dJTlQgICAgICAgICAgMHgwMDAyICAgICAgLyogR2xvYmFsIElSUSBwZW5kaW5nICAgICAgICAgICAgICAgKi8KKworLyogU0JVUyBzZW1hcGhvcmUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0JVU19TRU1BUEhPUkVfU1RBVCAgICAgMHgwMDAyICAgICAgLyogU2VtYXBob3JlIHN0YXR1cyBiaXQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0JVU19TRU1BUEhPUkVfTENLICAgICAgMHgwMDAxICAgICAgLyogU2VtYXBob3JlIGxvY2sgYml0ICAgICAgICAgICAgICAgKi8KKworLyogRFZNQSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9DVFJMX0NTVVNQRU5EICAgICAgIDB4MDAxMCAgICAgIC8qIERNQSBjaGFubmVsIHN1c3BlbmQgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9DVFJMX0NDTEVBUiAgICAgICAgIDB4MDAwOCAgICAgIC8qIERNQSBjaGFubmVsIGNsZWFyIGFuZCByZXNldCAgICAgICovCisjZGVmaW5lIERNQV9DVFJMX0ZDTEVBUiAgICAgICAgIDB4MDAwNCAgICAgIC8qIERNQSBmaWZvIGNsZWFyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9DVFJMX0NJUlEgICAgICAgICAgIDB4MDAwMiAgICAgIC8qIERNQSBpcnEgY2xlYXIgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9DVFJMX0RNQVNUQVJUICAgICAgIDB4MDAwMSAgICAgIC8qIERNQSB0cmFuc2ZlciBzdGFydCAgICAgICAgICAgICAgICovCisKKy8qIFNDU0kgcHJvY2Vzc29yIG92ZXJyaWRlIHJlZ2lzdGVyICovCisjZGVmaW5lIENQVV9PUklERV9FVFJJRyAgICAgICAgIDB4ODAwMCAgICAgIC8qIEV4dGVybmFsIHRyaWdnZXIgZW5hYmxlICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9TVEVQICAgICAgICAgIDB4NDAwMCAgICAgIC8qIFNpbmdsZSBzdGVwIG1vZGUgZW5hYmxlICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9CS1BUICAgICAgICAgIDB4MjAwMCAgICAgIC8qIEJyZWFrcG9pbnQgcmVnIGVuYWJsZSAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9QV1JJVEUgICAgICAgIDB4MTAwMCAgICAgIC8qIFNDU0kgcGluIHdyaXRlIGVuYWJsZSAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9PRk9SQ0UgICAgICAgIDB4MDgwMCAgICAgIC8qIEZvcmNlIG91dHB1dHMgb24gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9MQkFDSyAgICAgICAgIDB4MDQwMCAgICAgIC8qIFNDU0kgbG9vcGJhY2sgZW5hYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9QVEVTVCAgICAgICAgIDB4MDIwMCAgICAgIC8qIFBhcml0eSB0ZXN0IGVuYWJsZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9URU5BQiAgICAgICAgIDB4MDEwMCAgICAgIC8qIFNDU0kgcGlucyB0cmlzdGF0ZSBlbmFibGUgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9UUElOUyAgICAgICAgIDB4MDA4MCAgICAgIC8qIFNDU0kgcGlucyBlbmFibGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9GUkVTRVQgICAgICAgIDB4MDAwOCAgICAgIC8qIEZJRk8gcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9DVEVSTSAgICAgICAgIDB4MDAwNCAgICAgIC8qIENvbW1hbmQgdGVybWluYXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9SUkVHICAgICAgICAgIDB4MDAwMiAgICAgIC8qIFJlc2V0IFNDU0kgcHJvY2Vzc29yIHJlZ3MgICAgICAgICovCisjZGVmaW5lIENQVV9PUklERV9STU9EICAgICAgICAgIDB4MDAwMSAgICAgIC8qIFJlc2V0IFNDU0kgcHJvY2Vzc29yIG1vZHVsZSAgICAgICovCisKKy8qIFNDU0kgcHJvY2Vzc29yIGNvbW1hbmRzICovCisjZGVmaW5lIENQVV9DTURfQlJFU0VUICAgICAgICAgIDB4MzAwYiAgICAgIC8qIFJlc2V0IFNDU0kgYnVzICAgICAgICAgICAgICAgICAgICovCisKKy8qIFNDU0kgcHJvY2Vzc29yIHBpbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIENQVV9QQ1RSTF9QVkFMSUQgICAgICAgIDB4ODAwMCAgICAgIC8qIFBoYXNlIGJpdHMgYXJlIHZhbGlkICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9QSEkgICAgICAgICAgIDB4MDQwMCAgICAgIC8qIFBhcml0eSBiaXQgaGlnaCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9QTE8gICAgICAgICAgIDB4MDIwMCAgICAgIC8qIFBhcml0eSBiaXQgbG93ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9SRVEgICAgICAgICAgIDB4MDEwMCAgICAgIC8qIFJFUSBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9BQ0sgICAgICAgICAgIDB4MDA4MCAgICAgIC8qIEFDSyBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9SU1QgICAgICAgICAgIDB4MDA0MCAgICAgIC8qIFJTVCBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9CU1kgICAgICAgICAgIDB4MDAyMCAgICAgIC8qIEJTWSBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9TRUwgICAgICAgICAgIDB4MDAxMCAgICAgIC8qIFNFTCBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9BVE4gICAgICAgICAgIDB4MDAwOCAgICAgIC8qIEFUTiBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9NU0cgICAgICAgICAgIDB4MDAwNCAgICAgIC8qIE1TRyBidXMgc2lnbmFsICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9DRCAgICAgICAgICAgIDB4MDAwMiAgICAgIC8qIENEIGJ1cyBzaWduYWwgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QQ1RSTF9JTyAgICAgICAgICAgIDB4MDAwMSAgICAgIC8qIElPIGJ1cyBzaWduYWwgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFNDU0kgcHJvY2Vzc29yIGRpZmZlcmVudGlhbCBwaW5zIHJlZ2lzdGVyICovCisjZGVmaW5lIENQVV9QRElGRl9TRU5TRSAgICAgICAgIDB4MDIwMCAgICAgIC8qIERpZmZlcmVudGlhbCBzZW5zZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QRElGRl9NT0RFICAgICAgICAgIDB4MDEwMCAgICAgIC8qIERpZmZlcmVudGlhbCBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QRElGRl9PRU5BQiAgICAgICAgIDB4MDA4MCAgICAgIC8qIE91dHB1dHMgZW5hYmxlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QRElGRl9QTUFTSyAgICAgICAgIDB4MDA3YyAgICAgIC8qIERpZmZlcmVudGlhbCBjb250cm9sIHBpbnMgICAgICAgICovCisjZGVmaW5lIENQVV9QRElGRl9UR1QgICAgICAgICAgIDB4MDAwMiAgICAgIC8qIFRhcmdldCBtb2RlIGVuYWJsZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENQVV9QRElGRl9JTklUICAgICAgICAgIDB4MDAwMSAgICAgIC8qIEluaXRpYXRvciBtb2RlIGVuYWJsZSAgICAgICAgICAgICovCisKKy8qIFJJU0MgcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBSSVNDX1BTUl9GVFJVRSAgICAgICAgICAweDgwMDAgICAgICAvKiBGb3JjZSB0cnVlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9MQ0QgICAgICAgICAgICAweDQwMDAgICAgICAvKiBMb29wIGNvdW50ZXIgc2hvd3MgZG9uZSBzdGF0dXMgICAqLworI2RlZmluZSBSSVNDX1BTUl9SSVJRICAgICAgICAgICAweDIwMDAgICAgICAvKiBSSVNDIGlycSBzdGF0dXMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9UT0ZMT1cgICAgICAgICAweDEwMDAgICAgICAvKiBUaW1lciBvdmVyZmxvdyAocm9sbG92ZXIpICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9BT0ZMT1cgICAgICAgICAweDA4MDAgICAgICAvKiBBcml0aG1ldGljIG92ZXJmbG93ICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9BTVNCICAgICAgICAgICAweDA0MDAgICAgICAvKiBBcml0aG1ldGljIGJpZyBlbmRpYW4gICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9BQ0FSUlkgICAgICAgICAweDAyMDAgICAgICAvKiBBcml0aG1ldGljIGNhcnJ5ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9BWkVSTyAgICAgICAgICAweDAxMDAgICAgICAvKiBBcml0aG1ldGljIHplcm8gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9VTFRSQSAgICAgICAgICAweDAwMjAgICAgICAvKiBVbHRyYSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9ESVJRICAgICAgICAgICAweDAwMTAgICAgICAvKiBEVk1BIGludGVycnVwdCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9TSVJRICAgICAgICAgICAweDAwMDggICAgICAvKiBTQ1NJIHByb2Nlc3NvciBpbnRlcnJ1cHQgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9ISVJRICAgICAgICAgICAweDAwMDQgICAgICAvKiBIb3N0IGludGVycnVwdCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9JUEVORCAgICAgICAgICAweDAwMDIgICAgICAvKiBJbnRlcnJ1cHQgcGVuZGluZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSSVNDX1BTUl9GRkFMU0UgICAgICAgICAweDAwMDEgICAgICAvKiBGb3JjZSBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBSSVNDIHByb2Nlc3NvciBtZW1vcnkgdGltaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lIFJJU0NfTVRSRUdfUDFERkxUICAgICAgIDB4MTIwMCAgICAgIC8qIERlZmF1bHQgcmVhZC93cml0ZSB0aW1pbmcsIHBnMSAgICovCisjZGVmaW5lIFJJU0NfTVRSRUdfUDBERkxUICAgICAgIDB4MDAxMiAgICAgIC8qIERlZmF1bHQgcmVhZC93cml0ZSB0aW1pbmcsIHBnMCAgICovCisjZGVmaW5lIFJJU0NfTVRSRUdfUDFVTFRSQSAgICAgIDB4MjMwMCAgICAgIC8qIFVsdHJhLW1vZGUgcncgdGltaW5nLCBwZzEgICAgICAgICovCisjZGVmaW5lIFJJU0NfTVRSRUdfUDBVTFRSQSAgICAgIDB4MDAyMyAgICAgIC8qIFVsdHJhLW1vZGUgcncgdGltaW5nLCBwZzAgICAgICAgICovCisKKy8qIEhvc3QgY29tbWFuZC9jdHJsIHJlZ2lzdGVyICovCisjZGVmaW5lIEhDQ1RSTF9OT1AgICAgICAgICAgICAgIDB4MDAwMCAgICAgIC8qIENNRDogTm8gb3BlcmF0aW9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9SRVNFVCAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIENNRDogUmVzZXQgUklTQyBjcHUgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9QQVVTRSAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIENNRDogUGF1c2UgUklTQyBjcHUgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9SRUwgICAgICAgICAgICAgIDB4MzAwMCAgICAgIC8qIENNRDogUmVsZWFzZSBwYXVzZWQgUklTQyBjcHUgICAgICovCisjZGVmaW5lIEhDQ1RSTF9TVEVQICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIENNRDogU2luZ2xlIHN0ZXAgUklTQyBjcHUgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9TSElSUSAgICAgICAgICAgIDB4NTAwMCAgICAgIC8qIENNRDogU2V0IGhvc3QgaXJxICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9DSElSUSAgICAgICAgICAgIDB4NjAwMCAgICAgIC8qIENNRDogQ2xlYXIgaG9zdCBpcnEgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9DUklSUSAgICAgICAgICAgIDB4NzAwMCAgICAgIC8qIENNRDogQ2xlYXIgUklTQyBjcHUgaXJxICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9CS1BUICAgICAgICAgICAgIDB4ODAwMCAgICAgIC8qIENNRDogQnJlYWtwb2ludCBlbmFibGVzIGNoYW5nZSAgICovCisjZGVmaW5lIEhDQ1RSTF9UTU9ERSAgICAgICAgICAgIDB4ZjAwMCAgICAgIC8qIENNRDogRW5hYmxlIHRlc3QgbW9kZSAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9ISVJRICAgICAgICAgICAgIDB4MDA4MCAgICAgIC8qIEhvc3QgSVJRIHBlbmRpbmcgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9SUklQICAgICAgICAgICAgIDB4MDA0MCAgICAgIC8qIFJJU0MgY3B1IHJlc2V0IGluIGhhcHBlbmluZyBub3cgICovCisjZGVmaW5lIEhDQ1RSTF9SUEFVU0VEICAgICAgICAgIDB4MDAyMCAgICAgIC8qIFJJU0MgY3B1IGlzIHBhdXNlZCBub3cgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9FQkVOQUIgICAgICAgICAgIDB4MDAxMCAgICAgIC8qIEV4dGVybmFsIGJyZWFrcG9pbnQgZW5hYmxlICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9CMUVOQUIgICAgICAgICAgIDB4MDAwOCAgICAgIC8qIEJyZWFrcG9pbnQgMSBlbmFibGUgICAgICAgICAgICAgICovCisjZGVmaW5lIEhDQ1RSTF9CMEVOQUIgICAgICAgICAgIDB4MDAwNCAgICAgIC8qIEJyZWFrcG9pbnQgMCBlbmFibGUgICAgICAgICAgICAgICovCisKKy8qIEZvciBvdXIgaW50ZXJydXB0IGVuZ2luZS4gKi8KKyNkZWZpbmUgZm9yX2VhY2hfcWxvZ2ljcHRpKHFwKSBcCisgICAgICAgIGZvcigocXApID0gcXB0aWNoYWluOyAocXApOyAocXApID0gKHFwKS0+bmV4dCkKKworI2VuZGlmIC8qICEoX1FMT0dJQ1BUSV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aV9hc20uYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGlfYXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0NWIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGlfYXNtLmMKQEAgLTAsMCArMSwxMTYwIEBACisvKiBWZXJzaW9uIDEuMzEuMDAgSVNQMTAwMCBJbml0aWF0b3IgUklTQyBmaXJtd2FyZSAqLwordW5zaWduZWQgc2hvcnQgc2J1c19yaXNjX2NvZGUwMVtdIF9faW5pdGRhdGEgPSB7CisJMHgwMDc4LCAweDEwMzAsIDB4MDAwMCwgMHgyNDE5LCAweDAwMDAsIDB4MTJmZiwgMHgyMDQzLCAweDRmNTAsCisJMHg1OTUyLCAweDQ5NDcsIDB4NDg1NCwgMHgyMDMxLCAweDM5MzksIDB4MzEyYywgMHgzMTM5LCAweDM5MzIsCisJMHgyYzMxLCAweDM5MzksIDB4MzMyYywgMHgzMTM5LCAweDM5MzQsIDB4MjA1MSwgMHg0YzRmLCAweDQ3NDksCisJMHg0MzIwLCAweDQzNGYsIDB4NTI1MCwgMHg0ZjUyLCAweDQxNTQsIDB4NDk0ZiwgMHg0ZTAwLCAweDIwNDksCisJMHg1MzUwLCAweDMxMzAsIDB4MzAzMCwgMHgyMDQ2LCAweDY5NzIsIDB4NmQ3NywgMHg2MTcyLCAweDY1MjAsCisJMHgyMDU2LCAweDY1NzIsIDB4NzM2OSwgMHg2ZjZlLCAweDIwMzAsIDB4MzEyZSwgMHgzMzMxLCAweDIwMjAsCisJMHgyMGI5LCAweDEyMTIsIDB4MjBjMSwgMHgwMDA4LCAweDIwNzEsIDB4MDAxMCwgMHg3MGMzLCAweDAwMDQsCisJMHgyMGM5LCAweDNmZmYsIDB4MjA4OSwgMHgxMGM4LCAweDcwYzcsIDB4NDk1MywgMHg3MGNiLCAweDUwMjAsCisJMHg3MGNmLCAweDIwMjAsIDB4NzBkMywgMHgwMDAxLCAweDNmMDAsIDB4NzBkNiwgMHgyMDMxLCAweDAwMzAsCisJMHgyMDc5LCAweDM1MDAsIDB4Nzg2MywgMHgwMDAwLCAweDJmYTAsIDB4MjAwOSwgMHgwMzI3LCAweDIwMTEsCisJMHgwMDAwLCAweDIwYTksIDB4MDA0MCwgMHg0MmE0LCAweDgxMDksIDB4MDBjMCwgMHgxMDUxLCAweDc4OWIsCisJMHgwMTAxLCAweDc4MGIsIDB4MDAwMiwgMHg3ODBmLCAweDAwMDIsIDB4Nzg0ZiwgMHgwYmI4LCAweDIwNjksCisJMHgzNTQwLCAweDAwYTgsIDB4MTA2YSwgMHg2ODFiLCAweDAwM2MsIDB4MjAwOSwgMHgxMzEzLCAweDIxYjgsCisJMHgwMDc4LCAweDEwNmMsIDB4NjgxYiwgMHgwMDI4LCAweDY4MDcsIDB4MDAwNywgMHg2ODBiLCAweDAwZmEsCisJMHg2ODBmLCAweDAwMDgsIDB4NjgxMywgMHgwMDA1LCAweDY4MWYsIDB4MDAwMCwgMHg2ODIzLCAweDAwMDYsCisJMHg2ODE3LCAweDAwMDgsIDB4NjgyNywgMHgwMDAwLCAweDIwNjksIDB4MzYwMCwgMHgyMDExLCAweDAwMjAsCisJMHgyMDA5LCAweDAwMTAsIDB4NjgwYiwgMHgwYzE5LCAweDY4MGYsIDB4MDAxOSwgMHg2ODAzLCAweGRkMDAsCisJMHg2ODA3LCAweDAwMWEsIDB4NmExYSwgMHgyZDAwLCAweGEwZTgsIDB4MDAwOCwgMHhhMjkwLCAweDAwMDQsCisJMHg4MTA5LCAweDAwYzAsIDB4MTA4MiwgMHgyMDY5LCAweDM2ODAsIDB4MjBhOSwgMHgwMDgwLCAweDY4MzcsCisJMHgwMDAwLCAweDY4MGIsIDB4MDA0MCwgMHg2ODE3LCAweDAxMDAsIDB4NjgxZiwgMHgwMDY0LCAweGFkZTgsCisJMHgwMDEwLCAweDAwNzAsIDB4MTBhNSwgMHgwMDc4LCAweDEwOTcsIDB4MTA3OCwgMHgxYTM4LCAweDEwNzgsCisJMHgyZjNhLCAweDEwNzgsIDB4MTY4MSwgMHgxMDc4LCAweDMzYmEsIDB4MzIwMCwgMHhhMDg1LCAweDAwMGQsCisJMHgyMDkwLCAweDcwYzMsIDB4MDAwMCwgMHgwMDkwLCAweDEwYmMsIDB4NzBjMCwgMHhhMDg2LCAweDAwMDIsCisJMHgwMGMwLCAweDEwYmMsIDB4MTA3OCwgMHgxMWJhLCAweDEwNzgsIDB4MTBlYywgMHgxMDc4LCAweDE4MTcsCisJMHgxMDc4LCAweDE5YTgsIDB4MTA3OCwgMHgzMjdkLCAweDEwNzgsIDB4MTc3ZCwgMHgwMDc4LCAweDEwYmMsCisJMHgxMGQwLCAweDEwZDIsIDB4MWJjMywgMHgxYmMzLCAweDJmOTgsIDB4MmY5OCwgMHgxYmMzLCAweDFiYzMsCisJMHgwMDc4LCAweDEwZDAsIDB4MDA3OCwgMHgxMGQyLCAweDAwNzgsIDB4MTBkNCwgMHgwMDc4LCAweDEwZDYsCisJMHg3MDA4LCAweDgwMGMsIDB4MDBjOCwgMHgxMGU3LCAweDcwMDcsIDB4MDAwMiwgMHhhMDhjLCAweDAwMGMsCisJMHgwMGMwLCAweDEwZTgsIDB4ODAwNCwgMHg4MDA0LCAweDAwYzgsIDB4MTBlNywgMHgwODdhLCAweDA5N2EsCisJMHg3MGMzLCAweDQwMDIsIDB4MDA3OCwgMHgxMWJkLCAweDc4MTQsIDB4YTAwNSwgMHgwMGMwLCAweDEwZjQsCisJMHgwMDEwLCAweDExMzAsIDB4MDA3OCwgMHgxMTJmLCAweDIwMDksIDB4MzU2OCwgMHgyMTA0LCAweGEwMDUsCisJMHgwMGMwLCAweDExMmYsIDB4NzgxNCwgMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgxMTAxLCAweDEwNzgsCisJMHgxNTM2LCAweDc4MTcsIDB4MDAwMCwgMHgyMDA5LCAweDM1NmYsIDB4MjEwNCwgMHhhMDY1LCAweDAwNDAsCisJMHgxMTFkLCAweDIwMDksIDB4MzU2YSwgMHgyMTFjLCAweDgxMDgsIDB4MjExNCwgMHg4MTA4LCAweDIxMDQsCisJMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHgyMDA5LCAweDAwMWMsIDB4NjA4MywgMHgwMTAzLCAweDEwNzgsCisJMHgxNjExLCAweDAwYzAsIDB4MTEyOSwgMHgxMDc4LCAweDE2NzgsIDB4MjAwOSwgMHgzNTZmLCAweDIwMGIsCisJMHgwMDAwLCAweDIwMDksIDB4MzU2OSwgMHgyMTA0LCAweDIwMGIsIDB4MDAwMCwgMHhhMDA1LCAweDAwNDAsCisJMHgxMTJkLCAweDIwMDEsIDB4NDAwNSwgMHgwMDc4LCAweDExYmMsIDB4MDA3OCwgMHgxMWJhLCAweDAwN2MsCisJMHgyMDYxLCAweDAwMDAsIDB4NjAxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxMTM4LCAweDAwN2MsCisJMHg3MGMzLCAweDAwMDAsIDB4NzBjNywgMHgwMDAwLCAweDcwY2IsIDB4MDAwMCwgMHg3MGNmLCAweDAwMDAsCisJMHg3MGMwLCAweGEwYmMsIDB4ZmZjMCwgMHgwMGMwLCAweDExODgsIDB4MjAzOCwgMHgwMDc5LCAweDExNDgsCisJMHgxMWJhLCAweDEyMDUsIDB4MTFkMywgMHgxMjA1LCAweDEyNTYsIDB4MTI1NiwgMHgxMWNhLCAweDE1OTAsCisJMHgxMjYxLCAweDExYzYsIDB4MTFkNywgMHgxMWQ5LCAweDExZGIsIDB4MTFkZCwgMHgxNTk1LCAweDExYzYsCisJMHgxMjY3LCAweDEyODMsIDB4MTU0NCwgMHgxNThhLCAweDExZGYsIDB4MTQ2YiwgMHgxNDhkLCAweDE0YTcsCisJMHgxNGQwLCAweDE0MjQsIDB4MTQzMiwgMHgxNDQ2LCAweDE0NWEsIDB4MTJlZiwgMHgxMWM2LCAweDEyOWYsCisJMHgxMmE2LCAweDEyYWIsIDB4MTJiMCwgMHgxMmI2LCAweDEyYmIsIDB4MTJjMCwgMHgxMmM1LCAweDEyY2EsCisJMHgxMmNlLCAweDEyZTMsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDEyZmIsCisJMHgxMzA0LCAweDEzMTMsIDB4MTMzOSwgMHgxMzQzLCAweDEzNGEsIDB4MTM3MCwgMHgxMzdmLCAweDEzOGUsCisJMHgxM2EwLCAweDE0MDksIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDE0MTksCisJMHhhMGJjLCAweGZmYTAsIDB4MDBjMCwgMHgxMWM2LCAweDIwMzgsIDB4YTA4NCwgMHgwMDFmLCAweDAwNzksCisJMHgxMTkxLCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsCisJMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsCisJMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxMWM2LCAweDExYzYsCisJMHgxMWM2LCAweDExYzYsIDB4MTFjNiwgMHgxNWVkLCAweDE1ZjcsIDB4MTVmYiwgMHgxNjA5LCAweDExYzYsCisJMHgxMWM2LCAweDcyY2EsIDB4NzFjNiwgMHgyMDAxLCAweDQwMDYsIDB4MDA3OCwgMHgxMWJjLCAweDczY2UsCisJMHg3MmNhLCAweDcxYzYsIDB4MjAwMSwgMHg0MDAwLCAweDcwYzIsIDB4MjA2MSwgMHgwMDAwLCAweDYwMWIsCisJMHgwMDAxLCAweDIwOTEsIDB4NTAwMCwgMHgyMDkxLCAweDQwODAsIDB4MDA3YywgMHg3MGMzLCAweDQwMDEsCisJMHgwMDc4LCAweDExYmQsIDB4MjA5OSwgMHgwMDQxLCAweDIwYTEsIDB4MDA0MSwgMHgyMGE5LCAweDAwMDUsCisJMHg1M2EzLCAweDAwNzgsIDB4MTFiYSwgMHg3MGM0LCAweDcwYzMsIDB4MDAwNCwgMHgwMDdhLCAweDAwNzgsCisJMHgxMWJhLCAweDAwNzgsIDB4MTFiYSwgMHgwMDc4LCAweDExYmEsIDB4MDA3OCwgMHgxMWJhLCAweDIwOTEsCisJMHg4MDAwLCAweDcwYzMsIDB4MDAwMCwgMHg3MGM3LCAweDQ5NTMsIDB4NzBjYiwgMHg1MDIwLCAweDcwY2YsCisJMHgyMDIwLCAweDcwZDMsIDB4MDAwMSwgMHgzZjAwLCAweDcwZDYsIDB4MjA3OSwgMHgwMDAwLCAweDc4MWIsCisJMHgwMDAxLCAweDIwMzEsIDB4MDAzMCwgMHgyMDU5LCAweDEwMDAsIDB4MjAyOSwgMHgwNDU3LCAweDIwNTEsCisJMHgwNDcwLCAweDIwNjEsIDB4MDQ3MiwgMHgyMGI5LCAweGZmZmYsIDB4MjBjMSwgMHgwMDAwLCAweDIwOTEsCisJMHg1MDAwLCAweDIwOTEsIDB4NDA4MCwgMHgwMDc4LCAweDA0NTUsIDB4NzFkMCwgMHg3MmM4LCAweDczY2MsCisJMHg3MGM0LCAweDIwYTAsIDB4MjA5OCwgMHgyMDMxLCAweDAwMzAsIDB4ODFmZiwgMHgwMDQwLCAweDExYmEsCisJMHg3MDA3LCAweDAwMDQsIDB4NzMxYSwgMHg3MjFlLCAweDIwNTEsIDB4MDAxMiwgMHgyMDQ5LCAweDEyMzQsCisJMHgyMDQxLCAweDExYmEsIDB4NzAwMywgMHgwMDAyLCAweGE3ODYsIDB4MDAwMSwgMHgwMGMwLCAweDEyMjYsCisJMHgyMDQ5LCAweDEyNDIsIDB4MjA0MSwgMHgxMjRlLCAweDcwMDMsIDB4MDAwMywgMHg3MDE3LCAweDAwMDAsCisJMHg4MTBiLCAweDcxMTIsIDB4MDBjOCwgMHgxMjJlLCAweDcwMTcsIDB4MDAwMSwgMHg3MDA3LCAweDAwMDEsCisJMHhhNzg2LCAweDAwMDEsIDB4MDA0MCwgMHgxMjQyLCAweDcwMGMsIDB4YTA4NCwgMHgwMDdmLCAweDgwMDQsCisJMHgyMDA5LCAweDAwMjAsIDB4YTEwMiwgMHgwOTQyLCAweDA5NGEsIDB4MjBhOCwgMHgyNmEwLCAweDUzYTYsCisJMHgwMDc4LCAweDEwZDgsIDB4NzAwYywgMHhhMDg0LCAweDAwN2YsIDB4MDA0MCwgMHgxMjQyLCAweDgwYWMsCisJMHgwMDQ4LCAweDEyNDIsIDB4MjY5OCwgMHg1M2E1LCAweDAwNzgsIDB4MTBkOCwgMHg3MDBjLCAweGEwODQsCisJMHgwMDdmLCAweDgwYWMsIDB4MjY5OCwgMHg1M2E1LCAweDAwNzgsIDB4MTFiYSwgMHg3MWM0LCAweDcwYzgsCisJMHgyMTE0LCAweGE3OWUsIDB4MDAwNCwgMHgwMGMwLCAweDEyNWUsIDB4MjAwYSwgMHg3MmNhLCAweDAwNzgsCisJMHgxMWI5LCAweDcwYzcsIDB4MDAwMSwgMHg3MGNiLCAweDAwMWYsIDB4MDA3OCwgMHgxMWJhLCAweDcwYzQsCisJMHg3MmM4LCAweDczY2MsIDB4NzRkMCwgMHg3MGM2LCAweDcyY2EsIDB4NzNjZSwgMHg3NGQyLCAweGEwMDUsCisJMHgwMDQwLCAweDEyN2QsIDB4ODAwMSwgMHg3ODcyLCAweDdhN2EsIDB4N2I3ZSwgMHg3Yzc2LCAweDc4OTgsCisJMHhhMDg0LCAweGZmZmMsIDB4Nzg5YSwgMHgwMDc4LCAweDEyODEsIDB4Nzg5OCwgMHhhMDg1LCAweDAwMDEsCisJMHg3ODlhLCAweDAwNzgsIDB4MTFiYSwgMHg3MGM0LCAweDcyYzgsIDB4NzNjYywgMHg3NGQ0LCAweDcwYzYsCisJMHg3MmNhLCAweDczY2UsIDB4NzRkNiwgMHhhMDA1LCAweDAwNDAsIDB4MTI5OSwgMHg4MDAxLCAweDc4ODYsCisJMHg3YThlLCAweDdiOTIsIDB4N2M4YSwgMHg3ODk4LCAweGEwODQsIDB4ZmNmZiwgMHg3ODlhLCAweDAwNzgsCisJMHgxMjlkLCAweDc4OTgsIDB4YTA4NSwgMHgwMTAwLCAweDc4OWEsIDB4MDA3OCwgMHgxMWJhLCAweDIwMDksCisJMHgzNTU5LCAweDIxMGMsIDB4MjAxMSwgMHgwNDEwLCAweDAwNzgsIDB4MTFiOCwgMHgyMDA5LCAweDM1NDEsCisJMHgyMTBjLCAweDAwNzgsIDB4MTFiOSwgMHgyMDA5LCAweDM1NDIsIDB4MjEwYywgMHgwMDc4LCAweDExYjksCisJMHgyMDYxLCAweDM1NDAsIDB4NjEwYywgMHg2MjEwLCAweDAwNzgsIDB4MTFiOCwgMHgyMDA5LCAweDM1NDUsCisJMHgyMTBjLCAweDAwNzgsIDB4MTFiOSwgMHgyMDA5LCAweDM1NDYsIDB4MjEwYywgMHgwMDc4LCAweDExYjksCisJMHgyMDA5LCAweDM1NDcsIDB4MjEwYywgMHgwMDc4LCAweDExYjksIDB4MjAwOSwgMHgzNTQ4LCAweDIxMGMsCisJMHgwMDc4LCAweDExYjksIDB4NzkwOCwgMHg3YTBjLCAweDAwNzgsIDB4MTFiOCwgMHg3MWM0LCAweDgxMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTBlOCwgMHgzNjAwLCAweDZhMDAsCisJMHg2ODA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDEyZTAsIDB4NmIwOCwgMHgwMDc4LCAweDEyZTEsCisJMHg2YjBjLCAweDAwNzgsIDB4MTFiNywgMHg3N2M0LCAweDEwNzgsIDB4MTY5MiwgMHgyMDkxLCAweDgwMDAsCisJMHg2YjFjLCAweDZhMTQsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsIDB4MDA3OCwgMHgxMWI3LCAweDc3YzQsCisJMHgxMDc4LCAweDE2OTIsIDB4MjA5MSwgMHg4MDAwLCAweDY5MDgsIDB4NmExOCwgMHg2YjEwLCAweDIwOTEsCisJMHg4MDAxLCAweDAwNzgsIDB4MTFiNywgMHg3MWM0LCAweGExODIsIDB4MDAxMCwgMHgwMGM4LCAweDExYjIsCisJMHgxMDc4LCAweDFhYmMsIDB4MDA3OCwgMHgxMWI3LCAweDcxYzQsIDB4YTE4MiwgMHgwMDEwLCAweDAwYzgsCisJMHgxMWIyLCAweDIwMTEsIDB4MzU0MSwgMHgyMjA0LCAweDAwN2UsIDB4MjExMiwgMHgxMDc4LCAweDFhNzUsCisJMHgwMTdmLCAweDAwNzgsIDB4MTFiOSwgMHg3MWM0LCAweDIwMTEsIDB4MTMzMSwgMHgyMGE5LCAweDAwMDgsCisJMHgyMjA0LCAweGExMDYsIDB4MDA0MCwgMHgxMzIzLCAweDgyMTAsIDB4MDA3MCwgMHgxMzIxLCAweDAwNzgsCisJMHgxMzE4LCAweDAwNzgsIDB4MTFiMiwgMHhhMjkyLCAweDEzMzEsIDB4MDI3ZSwgMHgyMDExLCAweDM1NDIsCisJMHgyMjA0LCAweDIxMTIsIDB4MDE3ZiwgMHgwMDdlLCAweDEwNzgsIDB4MWE4MSwgMHgwMTdmLCAweDAwNzgsCisJMHgxMWI5LCAweDAzZTgsIDB4MDBmYSwgMHgwMWY0LCAweDAyZWUsIDB4MDA2NCwgMHgwMDE5LCAweDAwMzIsCisJMHgwMDRiLCAweDIwNjEsIDB4MzU0MCwgMHg2MTBjLCAweDYyMTAsIDB4NzBjNCwgMHg2MDBlLCAweDcwYzgsCisJMHg2MDEyLCAweDAwNzgsIDB4MTFiOCwgMHgyMDYxLCAweDM1NDAsIDB4NjExNCwgMHg3MGM0LCAweDYwMTYsCisJMHgwMDc4LCAweDExYjksIDB4NzFjNCwgMHgyMDExLCAweDAwMDQsIDB4MjAxOSwgMHgxMjEyLCAweGExODYsCisJMHgwMDI4LCAweDAwNDAsIDB4MTM2MywgMHgyMDExLCAweDAwMDUsIDB4MjAxOSwgMHgxMjEyLCAweGExODYsCisJMHgwMDMyLCAweDAwNDAsIDB4MTM2MywgMHgyMDExLCAweDAwMDYsIDB4MjAxOSwgMHgxMzEzLCAweGExODYsCisJMHgwMDNjLCAweDAwYzAsIDB4MTFiMiwgMHgyMDYxLCAweDM1NDAsIDB4NjAxOCwgMHgwMDdlLCAweDYxMWEsCisJMHgyM2I4LCAweDEwNzgsIDB4MWE5MiwgMHgxMDc4LCAweDMzYmEsIDB4MDE3ZiwgMHgwMDc4LCAweDExYjksCisJMHg3MWM0LCAweGExODQsIDB4ZmZjZiwgMHgwMGMwLCAweDExYjIsIDB4MjAxMSwgMHgzNTQ3LCAweDIyMDQsCisJMHgyMTEyLCAweDAwN2UsIDB4MTA3OCwgMHgxYWI0LCAweDAxN2YsIDB4MDA3OCwgMHgxMWI5LCAweDcxYzQsCisJMHhhMTgyLCAweDAwMTAsIDB4MDBjOCwgMHgxMWIyLCAweDIwMTEsIDB4MzU0OCwgMHgyMjA0LCAweDAwN2UsCisJMHgyMTEyLCAweDEwNzgsIDB4MWFhMywgMHgwMTdmLCAweDAwNzgsIDB4MTFiOSwgMHg3MWM0LCAweDcyYzgsCisJMHhhMTg0LCAweGZmZmQsIDB4MDBjMCwgMHgxMWIxLCAweGEyODQsIDB4ZmZmZCwgMHgwMGMwLCAweDExYjEsCisJMHgyMTAwLCAweDc5MDgsIDB4NzgwYSwgMHgyMjAwLCAweDdhMGMsIDB4NzgwZSwgMHgwMDc4LCAweDExYjgsCisJMHg3MWM0LCAweDgxMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZTgsCisJMHgzNjAwLCAweDIwMTksIDB4MDAwMCwgMHg3MmM4LCAweDY4MDAsIDB4MDA3ZSwgMHhhMjI2LCAweDAwNDAsCisJMHgxM2NmLCAweDZhMDIsIDB4YTQ4NCwgMHgyMDAwLCAweDAwNDAsIDB4MTNiOCwgMHhhMzlkLCAweDAwMTAsCisJMHhhNDg0LCAweDEwMDAsIDB4MDA0MCwgMHgxM2JlLCAweGEzOWQsIDB4MDAwOCwgMHhhNDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDEzY2YsIDB4ODEwZiwgMHhhMjg0LCAweDQwMDAsIDB4MDA0MCwgMHgxM2NiLCAweDEwNzgsCisJMHgxYWQ2LCAweDAwNzgsIDB4MTNjZiwgMHgxMDc4LCAweDFhYzgsIDB4MDA3OCwgMHgxM2NmLCAweDcyY2MsCisJMHg4MmZmLCAweDAwNDAsIDB4MTQwMSwgMHg2ODA4LCAweGEyMDYsIDB4MDA0MCwgMHgxNDAxLCAweGEyYTQsCisJMHgwMGZmLCAweDIwNjEsIDB4MzU0MCwgMHg2MTE4LCAweGExODYsIDB4MDAyOCwgMHgwMDQwLCAweDEzZTgsCisJMHhhMTg2LCAweDAwMzIsIDB4MDA0MCwgMHgxM2VlLCAweGExODYsIDB4MDAzYywgMHgwMDQwLCAweDEzZjQsCisJMHhhNDgyLCAweDAwNjQsIDB4MDA0OCwgMHgxM2ZlLCAweDAwNzgsIDB4MTNmOCwgMHhhNDgyLCAweDAwNTAsCisJMHgwMDQ4LCAweDEzZmUsIDB4MDA3OCwgMHgxM2Y4LCAweGE0ODIsIDB4MDA0MywgMHgwMDQ4LCAweDEzZmUsCisJMHg3MWM0LCAweDcxYzYsIDB4MDI3ZiwgMHg3MmNhLCAweDAwNzgsIDB4MTFiMywgMHg2YTBhLCAweGEzOWQsCisJMHgwMDBhLCAweDY4MDQsIDB4YTMwNSwgMHg2ODA2LCAweDAyN2YsIDB4NmIwYywgMHg3MWM0LCAweDAwNzgsCisJMHgxMWI3LCAweDc3YzQsIDB4MTA3OCwgMHgxNjkyLCAweDIwOTEsIDB4ODAwMCwgMHg2YTE0LCAweDZiMWMsCisJMHgyMDkxLCAweDgwMDEsIDB4NzBjOCwgMHg2ODE2LCAweDcwY2MsIDB4NjgxZSwgMHgyNzA4LCAweDAwNzgsCisJMHgxMWI3LCAweDcxYzQsIDB4NzJjOCwgMHg3M2NjLCAweGExODIsIDB4MDAxMCwgMHgwMGM4LCAweDExYjIsCisJMHgxMDc4LCAweDFhZTQsIDB4MDA3OCwgMHgxMWI3LCAweDc3YzQsIDB4MTA3OCwgMHgxNjkyLCAweDIwOTEsCisJMHg4MDAwLCAweDZhMDgsIDB4YTI5NSwgMHgwMDAyLCAweDZhMGEsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsCisJMHgwMDc4LCAweDExYjgsIDB4NzdjNCwgMHgxMDc4LCAweDE2OTIsIDB4MjA5MSwgMHg4MDAwLCAweDZhMDgsCisJMHhhMjk0LCAweGZmZjksIDB4NmEwYSwgMHg2ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxNDQxLCAweDEwNzgsCisJMHgxYTE5LCAweDIwOTEsIDB4ODAwMSwgMHgyNzA4LCAweDAwNzgsIDB4MTFiOCwgMHg3N2M0LCAweDEwNzgsCisJMHgxNjkyLCAweDIwOTEsIDB4ODAwMCwgMHg2YTA4LCAweGEyOTUsIDB4MDAwNCwgMHg2YTBhLCAweDY4MDQsCisJMHhhMDA1LCAweDAwNDAsIDB4MTQ1NSwgMHgxMDc4LCAweDFhMTksIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsCisJMHgwMDc4LCAweDExYjgsIDB4NzdjNCwgMHgyMDQxLCAweDAwMDEsIDB4MjA0OSwgMHgwMDA1LCAweDIwNTEsCisJMHgwMDIwLCAweDIwOTEsIDB4ODAwMCwgMHgxMDc4LCAweDE2OWYsIDB4MjA5MSwgMHg4MDAxLCAweDI3MDgsCisJMHg2YTA4LCAweDAwNzgsIDB4MTFiOCwgMHg3N2M0LCAweDcyYzgsIDB4NzNjYywgMHg3N2M2LCAweDcyY2EsCisJMHg3M2NlLCAweDEwNzgsIDB4MTcxOCwgMHgwMGMwLCAweDE0ODksIDB4NjgxOCwgMHhhMDA1LCAweDAwNDAsCisJMHgxNDgzLCAweDI3MDgsIDB4MTA3OCwgMHgxYWY0LCAweDAwYzAsIDB4MTQ4MywgMHg3ODE3LCAweGZmZmYsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHgyMDkxLCAweDgwMDEsIDB4MjAwMSwgMHg0MDA1LCAweDAwNzgsCisJMHgxMWJjLCAweDIwOTEsIDB4ODAwMSwgMHgwMDc4LCAweDExYmEsIDB4NzdjNCwgMHg3N2M2LCAweDIwNDEsCisJMHgwMDIxLCAweDIwNDksIDB4MDAwNSwgMHgyMDUxLCAweDAwMjAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxNjlmLCAweDIwNjEsIDB4MzU0MCwgMHg2MGEzLCAweDAwMDMsIDB4NjdiNiwgMHg2MGE3LCAweDAwMDAsCisJMHg3ODE3LCAweGZmZmYsIDB4MjA5MSwgMHg4MDAxLCAweDEwNzgsIDB4MWExOSwgMHgwMDdjLCAweDc3YzgsCisJMHg3N2NhLCAweDc3YzQsIDB4NzdjNiwgMHhhN2JjLCAweGZmMDAsIDB4MjA5MSwgMHg4MDAwLCAweDIwNjEsCisJMHgzNTQwLCAweDYwYTMsIDB4MDAwMiwgMHg2MGE3LCAweDAwMDAsIDB4NjdiNiwgMHg3ODE3LCAweGZmZmYsCisJMHgxMDc4LCAweDFhMTksIDB4MjA5MSwgMHg4MDAxLCAweDIwNDEsIDB4MDAyMSwgMHgyMDQ5LCAweDAwMDQsCisJMHgyMDUxLCAweDAwMTAsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsIDB4MTY5ZiwgMHg3MGM4LCAweDY4MzYsCisJMHg4NzM4LCAweGE3ODQsIDB4MDAwNywgMHgwMGMwLCAweDE0YzQsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsCisJMHg3ODk4LCAweGEwODQsIDB4MDAwMywgMHgwMGMwLCAweDE0ZjQsIDB4MjAzOSwgMHgwMDAwLCAweDIwNDEsCisJMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMDgsIDB4MTA3OCwgMHgxNjkyLCAweDIwOTEsCisJMHg4MDAwLCAweDY4MDgsIDB4YTgwZCwgMHg2OTBhLCAweDIwOTEsIDB4ODAwMSwgMHg4NzM4LCAweGE3ODQsCisJMHgwMDA3LCAweDAwYzAsIDB4MTRkZCwgMHhhN2JjLCAweGZmMDAsIDB4ODczZiwgMHg4NzM4LCAweDg3M2YsCisJMHhhNzg0LCAweDBmMDAsIDB4MDBjMCwgMHgxNGRkLCAweDIwOTEsIDB4ODAwMCwgMHgyMDY5LCAweDAxMDAsCisJMHg2ODMwLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDE1MWQsIDB4Njg0YiwgMHgwMDA0LCAweDIwYTksCisJMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDA0LCAweDAwNDAsIDB4MTUwYSwgMHgwMDcwLCAweDE1MGEsCisJMHgwMDc4LCAweDE1MDEsIDB4Njg0YiwgMHgwMDA5LCAweDIwYTksIDB4MDAxNCwgMHg2ODQ4LCAweGEwODQsCisJMHgwMDAxLCAweDAwNDAsIDB4MTUxNywgMHgwMDcwLCAweDE1MTcsIDB4MDA3OCwgMHgxNTBlLCAweDIwYTksCisJMHgwMGZhLCAweDAwNzAsIDB4MTUxZCwgMHgwMDc4LCAweDE1MTksIDB4MjA3OSwgMHgzNTAwLCAweDc4MTcsCisJMHgwMDAxLCAweDIwNjEsIDB4MzU0MCwgMHg2MGEzLCAweDAwMDEsIDB4NjBhNywgMHgwMDAwLCAweDYwYzMsCisJMHgwMDBmLCAweDc4OTgsIDB4YTA4NSwgMHgwMDAyLCAweDc4OWEsIDB4NjgwOCwgMHhhMDg0LCAweGZmZmQsCisJMHg2ODBhLCAweDY4MWIsIDB4MDA0NiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3YywgMHg3ODk4LCAweGEwODQsCisJMHhmZmZkLCAweDc4OWEsIDB4YTA4NCwgMHgwMDAxLCAweDAwYzAsIDB4MTU0MCwgMHgxMDc4LCAweDE3NjAsCisJMHg3MWM0LCAweDcxYzYsIDB4Nzk0YSwgMHgwMDdjLCAweDc0YzQsIDB4NzNjOCwgMHg3MmNjLCAweDc0YzYsCisJMHg3M2NhLCAweDcyY2UsIDB4MjA3OSwgMHgzNTAwLCAweDIwMDksIDB4MDA0MCwgMHgxMDc4LCAweDE2NmYsCisJMHgwMDQwLCAweDE1ODYsIDB4MTA3OCwgMHgxNjNmLCAweDAwNDAsIDB4MTU1YSwgMHgxMDc4LCAweDE2NzgsCisJMHgwMDc4LCAweDE1ODYsIDB4NjAxMCwgMHgyMDkxLCAweDgwMDEsIDB4NzgxNywgMHhmZmZmLCAweDIwMDksCisJMHgzNTY4LCAweDIwMGIsIDB4MDAwNSwgMHg4MTA4LCAweDIwMGIsIDB4MDAwMCwgMHg4MTA4LCAweDIzMGEsCisJMHg4MTA4LCAweDIyMGEsIDB4ODEwOCwgMHgyNDBhLCAweDgxMDgsIDB4MjAwYSwgMHg4MTA4LCAweDIwMGIsCisJMHgwMDAwLCAweDgxMDgsIDB4MmMwYSwgMHhhMDJlLCAweDI1MzAsIDB4MGU3ZSwgMHgxMDc4LCAweDJmMTMsCisJMHgwZTdmLCAweDY1OTIsIDB4NjVhMiwgMHg2Njk2LCAweDY2YTYsIDB4NjBhYiwgMHgwMDAwLCAweDYwYWYsCisJMHgwMDAwLCAweDIwOTEsIDB4ODAwMSwgMHgxMDc4LCAweDFhMTksIDB4MDA3YywgMHg3MGMzLCAweDQwMDUsCisJMHgwMDc4LCAweDExYmQsIDB4NzFjNCwgMHg3MGM3LCAweDAwMDAsIDB4NzkwNiwgMHgwMDc4LCAweDExYmEsCisJMHg3MWM0LCAweDcxYzYsIDB4MjE2OCwgMHgwMDc4LCAweDE1OTcsIDB4MjA2OSwgMHgxMDAwLCAweDY5MGMsCisJMHhhMDE2LCAweDJkMDQsIDB4YTIxMCwgMHg4ZDY4LCAweDgxMDksIDB4MDBjMCwgMHgxNTk5LCAweGEyODUsCisJMHgwMDAwLCAweDAwYzAsIDB4MTVhNywgMHg3MGMzLCAweDQwMDAsIDB4MDA3OCwgMHgxNWE5LCAweDcwYzMsCisJMHg0MDAzLCAweDcwY2EsIDB4MDA3OCwgMHgxMWJkLCAweDcxYzQsIDB4NzJjOCwgMHg3M2NjLCAweDIxMDAsCisJMHhhMTg0LCAweGZmZmMsIDB4MDBjMCwgMHgxMWM2LCAweDIxMDAsIDB4MDA3OSwgMHgxNWI3LCAweDE1Y2UsCisJMHgxNWUzLCAweDE1ZTUsIDB4MTVlNywgMHg3MGMzLCAweDQwMDMsIDB4NzFjZSwgMHg3MmQyLCAweDczZDYsCisJMHgwMDc4LCAweDE1Y2EsIDB4NzBjMywgMHg0MDAwLCAweDcwY2YsIDB4MDAwMCwgMHg3MGQzLCAweDAwMDAsCisJMHg3MGQ3LCAweDAwMDAsIDB4NzdjNiwgMHg3MWNhLCAweDAwNzgsIDB4MTFiYSwgMHgyMDMxLCAweDE1ZTksCisJMHgyNjI0LCAweDg2MzAsIDB4MjQxMiwgMHgyMjA0LCAweGE0NDYsIDB4MDBjMCwgMHgxNWJiLCAweGE0ODQsCisJMHhmZmZmLCAweDAwYzAsIDB4MTVkMCwgMHgyMDMxLCAweDE1ZTksIDB4ODIxMCwgMHg4MzE5LCAweGEzODQsCisJMHhmZmZmLCAweDAwYzAsIDB4MTVkMCwgMHgwMDc4LCAweDE1YzIsIDB4MDA3OCwgMHgxNWMyLCAweDAwNzgsCisJMHgxNWMyLCAweDU1NTUsIDB4YWFhYSwgMHhmZmZmLCAweDAwMDAsIDB4Nzk2MCwgMHg3MWM2LCAweDcxYzQsCisJMHhhMTgyLCAweDAwMDMsIDB4MDBjOCwgMHgxMWIyLCAweDc5NjIsIDB4MDA3OCwgMHgxMWJhLCAweDc5NjAsCisJMHg3MWM2LCAweDAwNzgsIDB4MTFiYSwgMHg3OTU0LCAweDcxYzYsIDB4NzFjNCwgMHg3OTU2LCAweDc5NTgsCisJMHg3MWNhLCAweDcxYzgsIDB4Nzk1YSwgMHg3OTVjLCAweDcxY2UsIDB4NzFjYywgMHg3OTVlLCAweDAwNzgsCisJMHgxMWJhLCAweDc5NTQsIDB4NzFjNiwgMHg3OTU4LCAweDcxY2EsIDB4Nzk1YywgMHg3MWNlLCAweDAwNzgsCisJMHgxMWJhLCAweDcwMGMsIDB4YTA4NCwgMHgwMDdmLCAweDAwNDAsIDB4MTYxZCwgMHg3MDA3LCAweDAwMDQsCisJMHg3MDA0LCAweGEwODQsIDB4MDAwNCwgMHgwMGMwLCAweDE2MTgsIDB4NzAxNywgMHgwMDAwLCAweDcxMTIsCisJMHg3MjFhLCAweDczMWUsIDB4ODEwOCwgMHg4MTBjLCAweDgxYTksIDB4OGM5OCwgMHgyMGExLCAweDAwMzAsCisJMHg2MDgwLCAweDIwYTIsIDB4NTNhNiwgMHg3ODBjLCAweGEwODUsIDB4MDAwMCwgMHg3MDAyLCAweDcwMDcsCisJMHgwMDAxLCAweDcxMDgsIDB4ODEwNCwgMHgwMGM4LCAweDE2MzEsIDB4NzAwNywgMHgwMDAyLCAweGExODQsCisJMHgwMDBjLCAweDcxMGMsIDB4YTE4NCwgMHgwMzAwLCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDcwMGMsCisJMHhhMDg0LCAweDAwN2YsIDB4MDA0MCwgMHgxNjRiLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsCisJMHgwMDA0LCAweDAwYzAsIDB4MTY0NiwgMHg3MDE3LCAweDAwMDAsIDB4NzExMiwgMHg3MjFhLCAweDczMWUsCisJMHgyMDk5LCAweDAwMzAsIDB4ODEwOCwgMHg4MWFjLCAweDc4MGMsIDB4YTA4NSwgMHgwMDAxLCAweDcwMDIsCisJMHg3MDA3LCAweDAwMDEsIDB4NzAwOCwgMHg4MDBjLCAweDAwYzgsIDB4MTY1YSwgMHg3MDA3LCAweDAwMDIsCisJMHhhMDhjLCAweDAwMGMsIDB4MDBjMCwgMHgxNjZjLCAweDcxMGMsIDB4YTE4NCwgMHgwMzAwLCAweDAwYzAsCisJMHgxNjZjLCAweDJjYTAsIDB4NTNhNSwgMHhhMDA2LCAweDcwMDMsIDB4MDAwMCwgMHgwMDdjLCAweDc4NTAsCisJMHhhMDY1LCAweDAwNDAsIDB4MTY3NywgMHgyYzA0LCAweDc4NTIsIDB4MjA2MywgMHgwMDAwLCAweDAwN2MsCisJMHgwZjdlLCAweDIwNzksIDB4MzUwMCwgMHg3ODUwLCAweDIwNjIsIDB4MmMwMCwgMHg3ODUyLCAweDBmN2YsCisJMHgwMDdjLCAweDIwMTEsIDB4NDAwMCwgMHg3YTUyLCAweDIwMTksIDB4MDQxMCwgMHg4MzE5LCAweDAwNDAsCisJMHgxNjhmLCAweGEyODAsIDB4MDAyZiwgMHgyMDEyLCAweDIwMTAsIDB4MDA3OCwgMHgxNjg2LCAweDIwMTMsCisJMHgwMDAwLCAweDAwN2MsIDB4YTc4NCwgMHgwZjAwLCAweDgwMGMsIDB4YTc4NCwgMHgwMDA3LCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMTA1LCAweGEwZTgsIDB4MzY4MCwgMHgwMDdjLCAweDEwNzgsCisJMHgxNjkyLCAweDI5MDAsIDB4NjgyYSwgMHgyYTAwLCAweDY4MmUsIDB4NjgwOCwgMHhhMDg0LCAweGZmZWYsCisJMHhhODBkLCAweDY5MGEsIDB4MjAwOSwgMHgzNTRmLCAweDIxMGMsIDB4NjgwNCwgMHhhMDA1LCAweDAwNDAsCisJMHgxNmJjLCAweGExMTYsIDB4MDBjMCwgMHgxNmJjLCAweDIwNjAsIDB4NjAwMCwgMHg2ODA2LCAweDAxN2UsCisJMHgyMDBiLCAweDAwMDAsIDB4MDA3OCwgMHgxNmJmLCAweDIwMDksIDB4MDAwMCwgMHgwMTdlLCAweDY4MDQsCisJMHhhMDY1LCAweDAwNDAsIDB4MTZjZSwgMHg2MDAwLCAweDY4MDYsIDB4MTA3OCwgMHgxNmRmLCAweDEwNzgsCisJMHgxN2NiLCAweDY4MTAsIDB4ODAwMSwgMHg2ODEyLCAweDAwYzAsIDB4MTZiZiwgMHgwMTdmLCAweDY5MDIsCisJMHg2OTA2LCAweDAwN2MsIDB4YTA2NSwgMHgwMDQwLCAweDE2ZGUsIDB4NjA5OCwgMHg2MDliLCAweDAwMDAsCisJMHgyMDA4LCAweDEwNzgsIDB4MTY3OCwgMHgyMTAwLCAweDAwNzgsIDB4MTZkMiwgMHgwMDdjLCAweDYwMDMsCisJMHgwMTAzLCAweDIwYTksIDB4MDAxYywgMHhhYzgwLCAweDAwMDQsIDB4MjBhMCwgMHgyMDAxLCAweDAwMDAsCisJMHg0MGE0LCAweDY4MjgsIDB4NjAxNiwgMHg2ODJjLCAweDYwMWUsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsCisJMHgzNTQwLCAweDcwNDAsIDB4YTA4YywgMHgwMDgwLCAweDAwYzAsIDB4MTZmYywgMHhhMDg4LCAweDM1ODAsCisJMHgyZDBhLCAweDgwMDAsIDB4NzA0MiwgMHhhMDA2LCAweDBlN2YsIDB4MDA3YywgMHgwZTdlLCAweDIwNzEsCisJMHgzNTQwLCAweDIwMDksIDB4MzU4MCwgMHg3MjQwLCAweDgyMjEsIDB4ODIxMSwgMHgwMDQ4LCAweDE3MTYsCisJMHgyMTA0LCAweDgxMDgsIDB4YWQwNiwgMHgwMGMwLCAweDE3MDUsIDB4ODExOSwgMHgyMTFlLCAweDgxMDgsCisJMHg4MzE4LCAweDgyMTEsIDB4MDBjOCwgMHgxNzBlLCAweDc0NDIsIDB4YTAwNiwgMHgwZTdmLCAweDAwN2MsCisJMHgxMDc4LCAweDE2OTIsIDB4MjA5MSwgMHg4MDAwLCAweDY4MDQsIDB4NzgxZSwgMHhhMDY1LCAweDAwNDAsCisJMHgxNzVmLCAweDAwNzgsIDB4MTcyOSwgMHgyYzAwLCAweDc4MWUsIDB4NjAwMCwgMHhhMDY1LCAweDAwNDAsCisJMHgxNzVmLCAweDYwMGMsIDB4YTMwNiwgMHgwMGMwLCAweDE3MjMsIDB4NjAwOCwgMHhhMjA2LCAweDAwYzAsCisJMHgxNzIzLCAweDJjMjgsIDB4MjAwMSwgMHgzNTRmLCAweDIwMDQsIDB4YWMwNiwgMHgwMDQwLCAweDE3NWYsCisJMHg2ODA0LCAweGFjMDYsIDB4MDBjMCwgMHgxNzQ2LCAweDYwMDAsIDB4MjA2MCwgMHg2ODA2LCAweGEwMDUsCisJMHgwMGMwLCAweDE3NDYsIDB4NjgwMywgMHgwMDAwLCAweDAwNzgsIDB4MTc1MCwgMHg2NDAwLCAweDc4MWMsCisJMHgyMDYwLCAweDY0MDIsIDB4YTQ4NiwgMHgwMDAwLCAweDAwYzAsIDB4MTc1MCwgMHgyYzAwLCAweDY4MDIsCisJMHgyNTYwLCAweDEwNzgsIDB4MTZkZiwgMHg2MDE3LCAweDAwMDUsIDB4NjAxZiwgMHgwMDIwLCAweDEwNzgsCisJMHgxN2NiLCAweDY4MTAsIDB4ODAwMSwgMHg2ODEyLCAweDIwMDEsIDB4ZmZmZiwgMHhhMDA1LCAweDAwN2MsCisJMHgyMDM5LCAweDAwMDAsIDB4MjA0MSwgMHgwMDIxLCAweDIwNDksIDB4MDAwNCwgMHgyMDUxLCAweDAwMDgsCisJMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxNjlmLCAweDg3MzgsIDB4YTc4NCwgMHgwMDA3LCAweDAwYzAsCisJMHgxNzZhLCAweGE3YmMsIDB4ZmYwMCwgMHg4NzNmLCAweDg3MzgsIDB4ODczZiwgMHhhNzg0LCAweDBmMDAsCisJMHgwMGMwLCAweDE3NmEsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2MsIDB4MjA2MSwgMHgwMDAwLCAweDYwMTgsCisJMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgxNzhhLCAweDc4YWMsIDB4NzhhZiwgMHgwMDAwLCAweGEwMDUsCisJMHgwMGMwLCAweDE3OGIsIDB4MDA3YywgMHhhMDhjLCAweGZmZjAsIDB4MDA0MCwgMHgxNzkxLCAweDEwNzgsCisJMHgxYmE1LCAweDAwNzksIDB4MTc5MywgMHgxN2EzLCAweDE3YTUsIDB4MTdhYiwgMHgxN2FmLCAweDE3YTMsCisJMHgxN2IzLCAweDE3YTMsIDB4MTdhMywgMHgxN2EzLCAweDE3YTMsIDB4MTdiOSwgMHgxN2JkLCAweDE3YTMsCisJMHgxN2EzLCAweDE3YTMsIDB4MTdhMywgMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgxNzYwLCAweDIwMDEsCisJMHg4MDAxLCAweDAwNzgsIDB4MTdjMywgMHgyMDAxLCAweDgwMDMsIDB4MDA3OCwgMHgxN2MzLCAweDIwMDEsCisJMHg4MDA0LCAweDAwNzgsIDB4MTdjMywgMHgxMDc4LCAweDE3NjAsIDB4MjAwMSwgMHg4MDA2LCAweDAwNzgsCisJMHgxN2MzLCAweDIwMDEsIDB4ODAwYywgMHgwMDc4LCAweDE3YzMsIDB4MTA3OCwgMHgxNzYwLCAweDIwMDEsCisJMHg4MDBkLCAweDAwNzgsIDB4MTdjMywgMHg3MGMyLCAweDIwNjEsIDB4MDAwMCwgMHg2MDFiLCAweDAwMDEsCisJMHgyMDkxLCAweDQwODAsIDB4MDA3YywgMHgyYzA0LCAweDYwODIsIDB4MmMwOCwgMHgyMDYzLCAweDAwMDAsCisJMHg3ODY0LCAweDgwMDAsIDB4Nzg2NiwgMHg3ODY4LCAweGEwMDUsIDB4Nzk2YSwgMHgwMDQwLCAweDE3ZGIsCisJMHgyYzAyLCAweDAwNzgsIDB4MTdkYywgMHg3OTZlLCAweDAwN2MsIDB4MGM3ZSwgMHgyMDYxLCAweDM1MDAsCisJMHg2ODgzLCAweDAxMDMsIDB4MmQwOCwgMHgyMDZiLCAweDAwMDAsIDB4NjA2NCwgMHg4MDAwLCAweDYwNjYsCisJMHg2MDY4LCAweGEwMDUsIDB4NjE2YSwgMHgwMDQwLCAweDE3ZjAsIDB4MmQwMiwgMHgwMDc4LCAweDE3ZjEsCisJMHg2MTZlLCAweDBjN2YsIDB4MDA3YywgMHgxMDc4LCAweDE4MDQsIDB4MDA0MCwgMHgxODAzLCAweDBjN2UsCisJMHg2MDk4LCAweGEwNjUsIDB4MDA0MCwgMHgxN2ZlLCAweDEwNzgsIDB4MTZkMiwgMHgwYzdmLCAweDYwOWIsCisJMHgwMDAwLCAweDEwNzgsIDB4MTY3OCwgMHgwMDdjLCAweDc4NmMsIDB4YTA2NSwgMHgwMDQwLCAweDE4MTYsCisJMHgyMDkxLCAweDgwMDAsIDB4Nzg2NCwgMHg4MDAxLCAweDc4NjYsIDB4MmMwNCwgMHg3ODZlLCAweGEwMDUsCisJMHgwMGMwLCAweDE4MTQsIDB4Nzg2YSwgMHg4MDAwLCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDc4OTgsCisJMHhhMDA1LCAweDAwYzAsIDB4MTg2NSwgMHg3OTc0LCAweDcwZDAsIDB4MDAwNSwgMHgwMDA1LCAweDcyZDAsCisJMHhhMjA2LCAweDAwYzAsIDB4MTgxYywgMHgyMjAwLCAweGExMDYsIDB4MDBjMCwgMHgxODMzLCAweDc4MDQsCisJMHhhMDA1LCAweDAwNDAsIDB4MTg2NSwgMHg3ODA3LCAweDAwMDAsIDB4MDA2OCwgMHgxODY1LCAweDIwOTEsCisJMHg0MDgwLCAweDAwNzgsIDB4MTg2NSwgMHgxMDc4LCAweDE2NmYsIDB4MDA0MCwgMHgxODY1LCAweDdhN2MsCisJMHg3Yjc4LCAweDgxMDcsIDB4ODAwNCwgMHg4MDA0LCAweGEyMTAsIDB4YTM5OSwgMHgwMDAwLCAweDIwMDksCisJMHgwMDQwLCAweDEwNzgsIDB4MTYzZiwgMHgwMDQwLCAweDE4NWMsIDB4MTA3OCwgMHgxNjc4LCAweDc4ODAsCisJMHg4MDAwLCAweDc4ODIsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MTg2NSwgMHgyMDkxLCAweDgwMDAsCisJMHg3OGFmLCAweDAwMDIsIDB4Nzg4MywgMHgwMDAwLCAweDc4OTgsIDB4YTA4NSwgMHgwMDAzLCAweDc4OWEsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxODY1LCAweDc4ODMsIDB4MDAwMCwgMHgxMDc4LCAweDE5OTIsCisJMHg2MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDE4NjYsIDB4MDA3YywgMHgxODZlLCAweDE4N2QsCisJMHgxODlkLCAweDE4NmUsIDB4MThhZiwgMHgxODZlLCAweDE4NmUsIDB4MTg2ZSwgMHgyMDM5LCAweDA0MDAsCisJMHg3OGE4LCAweGE3MDUsIDB4NzhhYSwgMHg2MDA0LCAweGE3MDUsIDB4NjAwNiwgMHgxMDc4LCAweDE4ZWQsCisJMHg2MDE4LCAweDc4YTYsIDB4MTA3OCwgMHgxOTdhLCAweDAwN2MsIDB4NzhhOCwgMHhhMDg0LCAweDAxMDAsCisJMHgwMDQwLCAweDE4ODQsIDB4MDA3OCwgMHgxODZlLCAweDc4YWIsIDB4MDAwMCwgMHg2MDAwLCAweDgwMDcsCisJMHhhMDg0LCAweDAwZmYsIDB4Nzg5ZSwgMHg4MDAxLCAweDYwOWIsIDB4MDAwMCwgMHgwMDQwLCAweDE4OWEsCisJMHgxMDc4LCAweDE4ZWQsIDB4MDA0MCwgMHgxODlhLCAweDc4YTgsIDB4YTA4NSwgMHgwMTAwLCAweDc4YWEsCisJMHgwMDc4LCAweDE4OWMsIDB4MTA3OCwgMHgxOTExLCAweDAwN2MsIDB4NzhhOCwgMHhhMDhjLCAweDBlMDAsCisJMHgwMGMwLCAweDE4YTYsIDB4YTA4NCwgMHgwMTAwLCAweDAwYzAsIDB4MThhOCwgMHgwMDc4LCAweDE4NmUsCisJMHgxMDc4LCAweDE4ZWQsIDB4MDBjMCwgMHgxOGFlLCAweDEwNzgsIDB4MTkxMSwgMHgwMDdjLCAweDc4YTgsCisJMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxOGI2LCAweDAwNzgsIDB4MTg2ZSwgMHg3OGFiLCAweDAwMDAsCisJMHg2NzEwLCAweDIwYTksIDB4MDAwMSwgMHg2MDE0LCAweGEwODQsIDB4MDBmZiwgMHhhMDA1LCAweDAwNDAsCisJMHgxOGQzLCAweGE3YmMsIDB4ZmYwMCwgMHgyMGE5LCAweDAwMDgsIDB4YTA4ZSwgMHgwMDAxLCAweDAwNDAsCisJMHgxOGQzLCAweDIwMzksIDB4MDAwMCwgMHgyMGE5LCAweDAwODAsIDB4YTA4ZSwgMHgwMDAyLCAweDAwNDAsCisJMHgxOGQzLCAweDAwNzgsIDB4MThlYSwgMHgxMDc4LCAweDE2OTIsIDB4MmQwMCwgMHgyMDkxLCAweDgwMDAsCisJMHg2ODJiLCAweDAwMDAsIDB4NjgyZiwgMHgwMDAwLCAweDY4MDgsIDB4YTA4NCwgMHhmZmRlLCAweDY4MGEsCisJMHgyZDAwLCAweGEwODAsIDB4MDAxMCwgMHgyMDY4LCAweDIwOTEsIDB4ODAwMSwgMHgwMDcwLCAweDE4ZWEsCisJMHgwMDc4LCAweDE4ZDYsIDB4MTA3OCwgMHgxNjc4LCAweDAwN2MsIDB4NzhhMCwgMHhhMDZkLCAweDAwYzAsCisJMHgxOGY4LCAweDJjMDAsIDB4NzhhMiwgMHg3OGE2LCAweDYwOWIsIDB4MDAwMCwgMHgwMDc4LCAweDE5MDQsCisJMHgyYzAwLCAweDY4OWEsIDB4NjA5YiwgMHgwMDAwLCAweDc4YTIsIDB4MmQwMCwgMHg2MDAyLCAweDc4YTQsCisJMHhhZDA2LCAweDAwYzAsIDB4MTkwNCwgMHg2MDAyLCAweDc4OWMsIDB4ODAwMSwgMHg3ODllLCAweDAwYzAsCisJMHgxOTEwLCAweDc4YTgsIDB4YTA4NCwgMHgwMDAwLCAweDc4YWEsIDB4NzhhNCwgMHgyMDYwLCAweGEwMDYsCisJMHgwMDdjLCAweGEwMmUsIDB4MjUzMCwgMHg2MTE4LCAweGExODQsIDB4MDA2MCwgMHg2MTllLCAweDAwNDAsCisJMHgxOTFkLCAweDBlN2UsIDB4MTA3OCwgMHgyZjEzLCAweDBlN2YsIDB4NjU5MiwgMHg2NWEyLCAweDY2OTYsCisJMHg2NmE2LCAweDYwYWIsIDB4MDAwMCwgMHg2MGFmLCAweDAwMDAsIDB4NjcxMCwgMHgxMDc4LCAweDE2OTIsCisJMHgyMDkxLCAweDgwMDAsIDB4NjgwOCwgMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgxOTNmLCAweDIwOTEsCisJMHg4MDAxLCAweDEwNzgsIDB4MTZkZiwgMHgyMDkxLCAweDgwMDAsIDB4MTA3OCwgMHgxN2NiLCAweDIwOTEsCisJMHg4MDAxLCAweDc4YTMsIDB4MDAwMCwgMHg3OGE3LCAweDAwMDAsIDB4MDA3OCwgMHgxOTc5LCAweDYwMjAsCisJMHhhMDk2LCAweDAwMDEsIDB4MDBjMCwgMHgxOTQ2LCAweDgwMDAsIDB4NjAyMiwgMHg2YTEwLCAweDY4MTQsCisJMHgyMDkxLCAweDgwMDEsIDB4YTIwMiwgMHgwMDQ4LCAweDE5NTUsIDB4MDA0MCwgMHgxOTU1LCAweDIwMzksCisJMHgwMjAwLCAweDEwNzgsIDB4MTk3YSwgMHgwMDc4LCAweDE5NzksIDB4MmMwOCwgMHgyMDkxLCAweDgwMDAsCisJMHg2ODAwLCAweGEwNjUsIDB4MDA0MCwgMHgxOTVkLCAweDYxMDIsIDB4NjkwMiwgMHgwMGMwLCAweDE5NjEsCisJMHg2OTA2LCAweDIxNjAsIDB4NjAwMywgMHgwMDAwLCAweDY4MTAsIDB4ODAwMCwgMHg2ODEyLCAweDIwOTEsCisJMHg4MDAxLCAweDY4MDgsIDB4YTA4YywgMHgwMDQwLCAweDAwNDAsIDB4MTk3MywgMHhhMDg2LCAweDAwNDAsCisJMHg2ODBhLCAweDEwNzgsIDB4MTZlZSwgMHgxMDc4LCAweDFhMTksIDB4NzhhNywgMHgwMDAwLCAweDc4YTMsCisJMHgwMDAwLCAweDAwN2MsIDB4NjAwNCwgMHhhNzA1LCAweDYwMDYsIDB4MjA5MSwgMHg4MDAwLCAweDEwNzgsCisJMHgxN2NiLCAweDIwOTEsIDB4ODAwMSwgMHg3OGE0LCAweGEwNjUsIDB4MDA0MCwgMHgxOThkLCAweDYwOTgsCisJMHg3OGE2LCAweDYwOWIsIDB4MDAwMCwgMHgwMDc4LCAweDE5N2QsIDB4NzhhMywgMHgwMDAwLCAweDc4YTcsCisJMHgwMDAwLCAweDAwN2MsIDB4Nzk3MCwgMHg3ODc0LCAweDgwMDAsIDB4YTEwYSwgMHgwMGM4LCAweDE5OTksCisJMHhhMDA2LCAweDc4NzYsIDB4NzBkMiwgMHg3ODA0LCAweGEwMDUsIDB4MDA0MCwgMHgxOWE3LCAweDgwMDEsCisJMHg3ODA2LCAweDAwYzAsIDB4MTlhNywgMHgwMDY4LCAweDE5YTcsIDB4MjA5MSwgMHg0MDgwLCAweDAwN2MsCisJMHgwMDY4LCAweDE5YzIsIDB4MjAyOSwgMHgwMDAwLCAweDc4NmMsIDB4YTA2NSwgMHgwMDQwLCAweDE5YmQsCisJMHgxMDc4LCAweDE5YzMsIDB4MDA0MCwgMHgxOWJkLCAweDA1N2UsIDB4MTA3OCwgMHgxOWQ5LCAweDA1N2YsCisJMHgwMGMwLCAweDE5YmQsIDB4ODUyOCwgMHgwMDc4LCAweDE5YWMsIDB4ODVmZiwgMHgwMDQwLCAweDE5YzIsCisJMHgyMDkxLCAweDQwODAsIDB4MDA3YywgMHg3Yjg0LCAweDc5ODgsIDB4NzJkNCwgMHgwMDA1LCAweDAwMDUsCisJMHg3MGQ0LCAweGEyMDYsIDB4MDBjMCwgMHgxOWM1LCAweDIyMDAsIDB4YTEwMiwgMHgwMGMwLCAweDE5ZDMsCisJMHgyMzAwLCAweGEwMDUsIDB4MDA3YywgMHgwMDQ4LCAweDE5ZDcsIDB4YTMwMiwgMHgwMDdjLCAweDgwMDIsCisJMHgwMDdjLCAweDEwNzgsIDB4MWEwYiwgMHgyMDA5LCAweDAwMWMsIDB4NjAyNCwgMHhhMDA1LCAweDAwNDAsCisJMHgxOWUzLCAweDIwMDksIDB4MDA0MCwgMHgxMDc4LCAweDE2MTEsIDB4MDA0MCwgMHgxOWZjLCAweDc4OTQsCisJMHg4MDAwLCAweDc4OTYsIDB4YTA4NiwgMHgwMDAyLCAweDAwYzAsIDB4MWEwYSwgMHgyMDkxLCAweDgwMDAsCisJMHg3OGFmLCAweDAwMDMsIDB4Nzg5NywgMHgwMDAwLCAweDc4OTgsIDB4YTA4NSwgMHgwMzAwLCAweDc4OWEsCisJMHgyMDkxLCAweDgwMDEsIDB4MDA3OCwgMHgxYTBhLCAweDc4OTcsIDB4MDAwMCwgMHgxMDc4LCAweDE3ZjMsCisJMHg3OTg0LCAweDc4ODgsIDB4ODAwMCwgMHhhMTBhLCAweDAwYzgsIDB4MWEwNywgMHhhMDA2LCAweDc4OGEsCisJMHg3MGQ2LCAweGEwMDYsIDB4MDA3YywgMHg4MTA3LCAweDgwMDQsIDB4ODAwNCwgMHg3YTkwLCAweDdiOGMsCisJMHhhMjEwLCAweGEzOTksIDB4MDAwMCwgMHgwMDdjLCAweDIwMDksIDB4MzU2OCwgMHgyMDkxLCAweDgwMDAsCisJMHgyMDBhLCAweDBmN2UsIDB4MjA3OSwgMHgwMTAwLCAweDIwMDksIDB4MzU0MCwgMHgyMDkxLCAweDgwMDAsCisJMHgyMTA0LCAweGEwODYsIDB4MDAwMCwgMHgwMGMwLCAweDFhMzQsIDB4MjAwOSwgMHgzNTEyLCAweDIxMDQsCisJMHhhMDA1LCAweDAwYzAsIDB4MWEzNCwgMHg3ODMwLCAweGEwODQsIDB4MDBjMCwgMHgwMGMwLCAweDFhMzQsCisJMHgwMDE4LCAweDFhMzQsIDB4NzgxYiwgMHgwMDQ0LCAweDIwOTEsIDB4ODAwMSwgMHgwZjdmLCAweDAwN2MsCisJMHgxMjdlLCAweDIwOTEsIDB4MjMwMCwgMHgyMDcxLCAweDM1NDAsIDB4MjA3OSwgMHgwMTAwLCAweDIwMTksCisJMHgyZGQ4LCAweDIwYTEsIDB4MDEyYiwgMHgyMzA0LCAweGEwMDUsIDB4MDA0MCwgMHgxYTUwLCAweDc4OWEsCisJMHg4MzE4LCAweDIzYWMsIDB4ODMxOCwgMHgyMzk4LCAweDUzYTYsIDB4MzMxOCwgMHgwMDc4LCAweDFhNDMsCisJMHg3ODliLCAweDAwMjAsIDB4MjBhOSwgMHgwMDEwLCAweDc4YWYsIDB4MDAwMCwgMHg3OGFmLCAweDAyMjAsCisJMHgwMDcwLCAweDFhNWMsIDB4MDA3OCwgMHgxYTU0LCAweDcwMDMsIDB4MDAwMCwgMHgxMDc4LCAweDFiNWIsCisJMHg3MDA0LCAweGEwODQsIDB4MDAwZiwgMHhhMDg1LCAweDYyODAsIDB4NzgwNiwgMHg3ODBmLCAweDkyMDAsCisJMHg3ODQzLCAweDAwZDgsIDB4Nzg1MywgMHgwMDgwLCAweDc4MGIsIDB4MDAzOCwgMHg3MDQ3LCAweDM1N2YsCisJMHg3MDQzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4YTE4YywgMHgwMDBmLCAweDIwMTEsCisJMHgwMTAxLCAweDIyMDQsIDB4YTA4NCwgMHhmZmYwLCAweGExMDUsIDB4MjAxMiwgMHgxMDc4LCAweDFiNWIsCisJMHgwMDdjLCAweDIwMTEsIDB4MDEwMSwgMHgyMGE5LCAweDAwMDksIDB4ODEwYiwgMHgwMDcwLCAweDFhOGEsCisJMHgwMDc4LCAweDFhODUsIDB4YTE4YywgMHgwZTAwLCAweDIyMDQsIDB4YTA4NCwgMHhmMWZmLCAweGExMDUsCisJMHgyMDEyLCAweDAwN2MsIDB4MjAwOSwgMHgwMTAxLCAweDIwYTksIDB4MDAwNSwgMHg4MjEzLCAweDAwNzAsCisJMHgxYTliLCAweDAwNzgsIDB4MWE5NiwgMHhhMjk0LCAweDAwZTAsIDB4MjEwNCwgMHhhMDg0LCAweGZmMWYsCisJMHhhMjA1LCAweDIwMGEsIDB4MDA3YywgMHgyMDExLCAweDAxMDEsIDB4MjBhOSwgMHgwMDBjLCAweDgxMGIsCisJMHgwMDcwLCAweDFhYWMsIDB4MDA3OCwgMHgxYWE3LCAweGExOGMsIDB4ZjAwMCwgMHgyMjA0LCAweGEwODQsCisJMHgwZmZmLCAweGExMDUsIDB4MjAxMiwgMHgwMDdjLCAweDIwMTEsIDB4MDEwMiwgMHgyMjA0LCAweGEwODQsCisJMHhmZmNmLCAweGExMDUsIDB4MjAxMiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsCisJMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDlhLCAweDYyYWMsIDB4NjNhYywgMHgwYzdmLCAweDAwN2MsCisJMHg4MTAzLCAweDgwMDMsIDB4YTA4MCwgMHgwMDIyLCAweDBjN2UsIDB4MjA2MSwgMHgwMTAwLCAweDYwOWEsCisJMHg2MGE0LCAweGEwODQsIDB4ZmZkZiwgMHg2MGFlLCAweDBjN2YsIDB4MDA3YywgMHg4MTAzLCAweDgwMDMsCisJMHhhMDgwLCAweDAwMjIsIDB4MGM3ZSwgMHgyMDYxLCAweDAxMDAsIDB4NjA5YSwgMHg2MGE0LCAweGEwODUsCisJMHgwMDIwLCAweDYwYWUsIDB4MGM3ZiwgMHgwMDdjLCAweDgxMDMsIDB4ODAwMywgMHhhMDgwLCAweDAwMjAsCisJMHgwYzdlLCAweDIwNjEsIDB4MDEwMCwgMHg2MDlhLCAweDYwYTQsIDB4NjJhZSwgMHgyMDEwLCAweDYwYTQsCisJMHg2M2FlLCAweDIwMTgsIDB4MGM3ZiwgMHgwMDdjLCAweDIwOTEsIDB4ODAwMCwgMHgwYzdlLCAweDBlN2UsCisJMHg2ODE4LCAweGEwMDUsIDB4MDA0MCwgMHgxYjM5LCAweDIwNjEsIDB4M2Y4MCwgMHgxMDc4LCAweDFiNDEsCisJMHgwMDQwLCAweDFiMjcsIDB4MjBhOSwgMHgwMDAwLCAweDIwNjEsIDB4M2U4MCwgMHgwYzdlLCAweDEwNzgsCisJMHgxYjQxLCAweDAwNDAsIDB4MWIxMywgMHgwYzdmLCAweDhjNjAsIDB4MDA3MCwgMHgxYjExLCAweDAwNzgsCisJMHgxYjA2LCAweDAwNzgsIDB4MWIzOSwgMHgwMDdmLCAweGEwODIsIDB4M2U4MCwgMHgyMDcxLCAweDM1NDAsCisJMHg3MGJhLCAweDYwMWMsIDB4YTA4NSwgMHgwODAwLCAweDYwMWUsIDB4NzFiNiwgMHg2MGE3LCAweDAwMDAsCisJMHgyMDAxLCAweDAwMDQsIDB4NzBhMiwgMHgxMDc4LCAweDFhMTQsIDB4MDA3OCwgMHgxYjM1LCAweDIwNzEsCisJMHgzNTQwLCAweDYwMWMsIDB4YTA4NSwgMHgwODAwLCAweDYwMWUsIDB4NzFiNiwgMHg2MGE3LCAweDAwMDAsCisJMHgyMDAxLCAweDAwMDYsIDB4NzBhMiwgMHgxMDc4LCAweDFhMTQsIDB4MjAwMSwgMHgwMDAwLCAweDAwNzgsCisJMHgxYjNiLCAweDIwMDEsIDB4MDAwMSwgMHgyMDkxLCAweDgwMDEsIDB4YTAwNSwgMHgwZTdmLCAweDBjN2YsCisJMHgwMDdjLCAweDJjMDQsIDB4YTAwNSwgMHgwMDQwLCAweDFiNTgsIDB4MjA2MCwgMHg2MDBjLCAweGEzMDYsCisJMHgwMGMwLCAweDFiNTUsIDB4NjAwOCwgMHhhMjA2LCAweDAwYzAsIDB4MWI1NSwgMHg2MDEwLCAweGExMDYsCisJMHgwMGMwLCAweDFiNTUsIDB4YTAwNiwgMHgwMDc4LCAweDFiNWEsIDB4NjAwMCwgMHgwMDc4LCAweDFiNDIsCisJMHhhMDg1LCAweDAwMDEsIDB4MDA3YywgMHgyMDExLCAweDM1NDEsIDB4MjIwYywgMHhhMThjLCAweDAwMGYsCisJMHgyMDExLCAweDAxM2IsIDB4MjIwNCwgMHhhMDg0LCAweDAxMDAsIDB4MDA0MCwgMHgxYjZhLCAweDIwMjEsCisJMHhmZjgwLCAweDIxMjIsIDB4MDA3YywgMHgwZTdlLCAweDY4ZTQsIDB4YTA4YywgMHgwMDIwLCAweDAwNDAsCisJMHgxYmEzLCAweGEwODQsIDB4MDAwNiwgMHgwMGMwLCAweDFiYTMsIDB4NjAxMCwgMHg4MDA3LCAweGEwODQsCisJMHgwMDBmLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwZjAsIDB4MzYwMCwgMHg3MDA0LCAweGEwODQsCisJMHgwMDBhLCAweDAwYzAsIDB4MWJhMywgMHg3MTA4LCAweGExOTQsIDB4ZmYwMCwgMHgwMDQwLCAweDFiYTMsCisJMHhhMThjLCAweDAwZmYsIDB4MjAwMSwgMHgwMDE5LCAweGExMDYsIDB4MDA0MCwgMHgxYjk2LCAweDIwMDEsCisJMHgwMDMyLCAweGExMDYsIDB4MDA0MCwgMHgxYjlhLCAweDAwNzgsIDB4MWI5ZSwgMHgyMDA5LCAweDAwMjAsCisJMHgwMDc4LCAweDFiYTAsIDB4MjAwOSwgMHgwMDNmLCAweDAwNzgsIDB4MWJhMCwgMHgyMDExLCAweDAwMDAsCisJMHgyMTAwLCAweGEyMDUsIDB4NzAwYSwgMHgwZTdmLCAweDAwN2MsIDB4MDA2OCwgMHgxYmE1LCAweDAwN2UsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxOCwgMHhhMDg0LCAweDAwMDEsIDB4MDBjMCwgMHgxYmFhLCAweDAwN2YsCisJMHgyZTA4LCAweDIwNzEsIDB4MDAxMCwgMHg3MGNhLCAweDAwN2YsIDB4NzBjNiwgMHg3MGMzLCAweDgwMDIsCisJMHgyMDcxLCAweDAwMDAsIDB4NzAxYiwgMHgwMDAxLCAweDIwOTEsIDB4NDA4MCwgMHgwMDdmLCAweDIwNzAsCisJMHgwMDdmLCAweDAwNzgsIDB4MWJjMSwgMHgxMDdlLCAweDAwN2UsIDB4MTI3ZSwgMHgyMDkxLCAweDIzMDAsCisJMHg3ZjNjLCAweDdlNTgsIDB4N2MzMCwgMHg3ZDM4LCAweGE1OTQsIDB4MDAzZiwgMHhhNDg0LCAweDQwMDAsCisJMHgwMDQwLCAweDFiZDgsIDB4YTc4NCwgMHgwMDdjLCAweDAwYzAsIDB4MmQ5YywgMHgxMDc4LCAweDFiYTUsCisJMHhhNDljLCAweDAwMGYsIDB4YTM4MiwgMHgwMDA0LCAweDAwNTAsIDB4MWJlMCwgMHgxMDc4LCAweDFiYTUsCisJMHg4NTA3LCAweGEwODQsIDB4MDAwZiwgMHgwMDc5LCAweDFiZTUsIDB4MWZlYSwgMHgyMDlhLCAweDIwYzAsCisJMHgyMmU2LCAweDI1NmIsIDB4MjViMywgMHgyNWVhLCAweDI2NjUsIDB4MjZiZiwgMHgyNzQ0LCAweDFjMGIsCisJMHgxYmY1LCAweDFlNTMsIDB4MWYxZCwgMHgyNTRhLCAweDFiZjUsIDB4MTA3OCwgMHgxYmE1LCAweDAwMTgsCisJMHgxYmM4LCAweDEyN2YsIDB4MjA5MSwgMHg4MDAxLCAweDAwN2YsIDB4MTA3ZiwgMHgwMDdjLCAweDcwMDMsCisJMHgwMDAwLCAweDcwM2YsIDB4MDAwMCwgMHg3MDMwLCAweGEwMDUsIDB4MDA0MCwgMHgxYzA5LCAweDcwMzMsCisJMHgwMDAwLCAweDAwMTgsIDB4MWJjOCwgMHg3MDVjLCAweGEwMDUsIDB4MDBjMCwgMHgxY2I2LCAweDcwYTAsCisJMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgxYzE0LCAweDFjZDYsIDB4MWMxYywgMHgxYzJhLCAweDFjNGIsCisJMHgxYzcxLCAweDFjOWQsIDB4MWM5YiwgMHgxYzFjLCAweDc4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDc4MGEsCisJMHgyMDA5LCAweDAwNDYsIDB4MTA3OCwgMHgyNDEyLCAweDAwYzAsIDB4MWMyOCwgMHg3MDAzLCAweDAwMDQsCisJMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgyZDVlLCAweDAwYzAsIDB4MWM0OSwgMHg3MGI0LCAweDgwMDcsCisJMHg3ODliLCAweDAwN2UsIDB4NzhhYSwgMHg3ODliLCAweDAwMTAsIDB4NzhhYiwgMHgwMDBjLCAweDc4OWIsCisJMHgwMDYwLCAweDc4YWIsIDB4MDAwMSwgMHg3ODViLCAweDAwMDQsIDB4MjAwOSwgMHgwMGY3LCAweDEwNzgsCisJMHgyNDEwLCAweDAwYzAsIDB4MWM0OSwgMHg3MDAzLCAweDAwMDQsIDB4NzBjMywgMHgwMDBmLCAweDcwMzMsCisJMHgzNTcwLCAweDAwNzgsIDB4MWJmNywgMHgxMDc4LCAweDJkNWUsIDB4MDBjMCwgMHgxYzZmLCAweDcxYjQsCisJMHg4MTA3LCAweDc4OWIsIDB4MDA3ZSwgMHg3OGFhLCAweDc4OWIsIDB4MDAxMCwgMHhhMThjLCAweDAwMDcsCisJMHhhMThkLCAweDAwYzAsIDB4NzlhYSwgMHg3OGFiLCAweDAwMDYsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsCisJMHgwMDAyLCAweDc4NWIsIDB4MDAwNCwgMHgyMDA5LCAweDAwZjcsIDB4MTA3OCwgMHgyNDEwLCAweDAwYzAsCisJMHgxYzZmLCAweDcwMDMsIDB4MDAwNCwgMHg3MGMzLCAweDAwMGYsIDB4NzAzMywgMHgzNTcwLCAweDAwNzgsCisJMHgxYmY3LCAweDEwNzgsIDB4MmQ1ZSwgMHgwMGMwLCAweDFjOTksIDB4NzFiNCwgMHg4MTA3LCAweDc4OWIsCisJMHgwMDdlLCAweDc4YWEsIDB4Nzg5YiwgMHgwMDEwLCAweGExOGMsIDB4MDAwNywgMHhhMThkLCAweDAwYzAsCisJMHg3OWFhLCAweDc4YWIsIDB4MDAyMCwgMHg3MWI4LCAweDc5YWEsIDB4NzhhYiwgMHgwMDBkLCAweDc4OWIsCisJMHgwMDYwLCAweDc4YWIsIDB4MDAwNCwgMHg3ODViLCAweDAwMDQsIDB4MjAwOSwgMHgwMGY3LCAweDEwNzgsCisJMHgyNDEwLCAweDAwYzAsIDB4MWM5OSwgMHg3MDAzLCAweDAwMDQsIDB4NzBjMywgMHgwMDBmLCAweDcwMzMsCisJMHgzNTcwLCAweDAwNzgsIDB4MWJmNywgMHgwMDc4LCAweDFjNGIsIDB4MTA3OCwgMHgyZDVlLCAweDAwYzAsCisJMHgxYmY3LCAweDcwYmMsIDB4MjA2OCwgMHg3ODliLCAweDAwMTAsIDB4NmYxMCwgMHgxMDc4LCAweDJjYTEsCisJMHgyYzUwLCAweDY4MTAsIDB4YTA4NCwgMHgwMDA3LCAweGEwODUsIDB4MDA4MCwgMHg3OGFhLCAweDZlMTgsCisJMHgyMDQxLCAweDAwMDEsIDB4MjAwMSwgMHgwMDA0LCAweDAwNzgsIDB4MWRkZSwgMHgxMDc4LCAweDJkNWUsCisJMHgwMGMwLCAweDFiZjcsIDB4Nzg5YiwgMHgwMDEwLCAweDcwNWMsIDB4MjA2OCwgMHg2ZjEwLCAweDEwNzgsCisJMHgyY2ExLCAweDJjNTAsIDB4NjAwOCwgMHhhMDg1LCAweDAwMTAsIDB4NjAwYSwgMHg2ODEwLCAweGEwODQsCisJMHgwMDA3LCAweGEwODUsIDB4MDA4MCwgMHg3OGFhLCAweDIwMzEsIDB4MDAyMCwgMHgyMDQxLCAweDAwMDEsCisJMHgxMDc4LCAweDJkYzUsIDB4MjAwMSwgMHgwMDAzLCAweDAwNzgsIDB4MWRjOSwgMHgwMDE4LCAweDFiYzgsCisJMHg3NDQwLCAweGE0ODUsIDB4MDAwMCwgMHgwMDQwLCAweDFjZjAsIDB4YTA4MCwgMHgzNTgwLCAweDIwMzAsCisJMHg3MTQ0LCAweDgxMDgsIDB4YTEyYSwgMHgwMDQ4LCAweDFjZTcsIDB4MjAwOSwgMHgzNTgwLCAweDIxNjQsCisJMHg2NTA0LCAweDg1ZmYsIDB4MDBjMCwgMHgxY2ZkLCAweDg0MjEsIDB4MDBjMCwgMHgxY2UxLCAweDcxNDYsCisJMHg3MDAzLCAweDAwMDAsIDB4NzAzZiwgMHgwMDAwLCAweDAwNzgsIDB4MWJmNywgMHg3NjQwLCAweGE2YjAsCisJMHgzNTgwLCAweDcxNDQsIDB4MjYwMCwgMHgwMDc4LCAweDFjZWMsIDB4NzE0NiwgMHgyNTY4LCAweDI1NTgsCisJMHg3NTNlLCAweDJjNTAsIDB4NjAzNCwgMHhhMDg1LCAweDAwMDAsIDB4MDBjMCwgMHgxY2ZhLCAweDY3MDgsCisJMHg3NzM2LCAweGE3ODQsIDB4MDEzZiwgMHgwMDQwLCAweDFkMmYsIDB4YTc4NCwgMHgwMDIxLCAweDAwYzAsCisJMHgxY2ZhLCAweGE3ODQsIDB4MDAwMiwgMHgwMDQwLCAweDFkMWMsIDB4YTc4NCwgMHgwMDA0LCAweDAwNDAsCisJMHgxY2ZhLCAweGE3YmMsIDB4ZmZmYiwgMHg2NzBhLCAweGE3ODQsIDB4MDAwOCwgMHgwMGMwLCAweDFjZmEsCisJMHhhNzg0LCAweDAwMTAsIDB4MDBjMCwgMHgxY2ZhLCAweGE3ODQsIDB4MDEwMCwgMHgwMDQwLCAweDFkMmYsCisJMHg2MDE4LCAweGEwMDUsIDB4MDBjMCwgMHgxY2ZhLCAweGE3YmMsIDB4ZmVmZiwgMHg2NzBhLCAweDY4MWYsCisJMHgwMDAwLCAweDZlMTgsIDB4YTY4NCwgMHgwMDBlLCAweDYxMTgsIDB4MDA0MCwgMHgxZDNmLCAweDYwMWMsCisJMHhhMTAyLCAweDAwNDgsIDB4MWQ0MiwgMHgwMDQwLCAweDFkNDIsIDB4MDA3OCwgMHgxY2Y2LCAweDgxZmYsCisJMHgwMGMwLCAweDFjZjYsIDB4YTc4NCwgMHgwMDgwLCAweDAwYzAsIDB4MWQ0OCwgMHg3MDBjLCAweDYwMjIsCisJMHhhN2JjLCAweGZmN2YsIDB4NjcwYSwgMHg2YjEwLCAweDgzMDcsIDB4YTA4NCwgMHgwMDBmLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHgzNjAwLCAweDIwNjAsIDB4MjA0OCwgMHg3MDRhLCAweDYwMDAsCisJMHg3MDRlLCAweDYwMDQsIDB4NzA1MiwgMHgyYTYwLCAweDAwMTgsIDB4MWJjOCwgMHg3ODliLCAweDAwMTAsCisJMHhhMDQ2LCAweDEwNzgsIDB4MmQ1ZSwgMHgwMGMwLCAweDFiZjcsIDB4NmIxMCwgMHhhMzljLCAweDAwMDcsCisJMHhhMzlkLCAweDAwYzAsIDB4NzA0YywgMHhhMDg0LCAweDgwMDAsIDB4MDA0MCwgMHgxZDczLCAweGE2ODQsCisJMHgwMDAxLCAweDAwNDAsIDB4MWQ3NSwgMHhhMzljLCAweGZmYmYsIDB4YTY4NCwgMHgwMDEwLCAweDAwNDAsCisJMHgxZDdiLCAweGEzOWQsIDB4MDAyMCwgMHg3YmFhLCAweDg4NDAsIDB4YTY4NCwgMHgwMDBlLCAweDAwYzAsCisJMHgxZDg2LCAweGE3YmQsIDB4MDAxMCwgMHg2NzBhLCAweDAwNzgsIDB4MWRjNywgMHg3MTRjLCAweGExOGMsCisJMHgwODAwLCAweDAwNDAsIDB4MjkwMiwgMHgyMDExLCAweDAwMjEsIDB4ODAwNCwgMHg4MDA0LCAweDAwNDgsCisJMHgxZDlkLCAweDIwMTEsIDB4MDAyMiwgMHg4MDA0LCAweDAwNDgsIDB4MWQ5ZCwgMHgyMDExLCAweDAwMjAsCisJMHg4MDA0LCAweDAwNDgsIDB4MWQ5ZCwgMHgwMDQwLCAweDFkYzcsIDB4N2FhYSwgMHg4ODQwLCAweDEwNzgsCisJMHgyZDc3LCAweDZhMTAsIDB4NjEwYywgMHg4MTA4LCAweGExOGMsIDB4MDBmZiwgMHhhMWUwLCAweDNlODAsCisJMHgyYzY0LCAweDhjZmYsIDB4MDA0MCwgMHgxZGJlLCAweDYwMTAsIDB4YTIwNiwgMHgwMGMwLCAweDFkYTgsCisJMHg2MGI0LCAweDgwMDEsIDB4NjBiNiwgMHgwMGMwLCAweDFkYTMsIDB4MGM3ZSwgMHgyYTYwLCAweDYwMDgsCisJMHhhMDg1LCAweDAxMDAsIDB4NjAwYSwgMHgwYzdmLCAweDAwNzgsIDB4MWNkNiwgMHgxMDc4LCAweDJkNWUsCisJMHgwMGMwLCAweDFiZjcsIDB4MmE2MCwgMHg2MTBlLCAweDc5YWEsIDB4ODg0MCwgMHg3MTJlLCAweDIwMDEsCisJMHgwMDAxLCAweDAwN2UsIDB4NzE1MCwgMHhhMTg0LCAweDAwMTgsIDB4MDA0MCwgMHgxZGRkLCAweGExODQsCisJMHgwMDEwLCAweDAwNDAsIDB4MWRkNywgMHgxMDc4LCAweDJhY2MsIDB4MDBjMCwgMHgxZGRkLCAweGExODQsCisJMHgwMDA4LCAweDAwNDAsIDB4MWRkZCwgMHgxMDc4LCAweDI5ZTYsIDB4MDA3ZiwgMHg3MDAyLCAweGE2OGMsCisJMHgwMDYwLCAweDg4ZmYsIDB4MDA0MCwgMHgxZGU2LCAweGExOGQsIDB4MDAwNCwgMHg3OTVhLCAweDY5YjIsCisJMHg3ODliLCAweDAwNjAsIDB4MjgwMCwgMHg3OGFhLCAweDc4OWIsIDB4MDA2MSwgMHg2ODE0LCAweGEwODUsCisJMHg4MDAwLCAweDY4MTYsIDB4NzhhYSwgMHgxNTdlLCAweDEzN2UsIDB4MTQ3ZSwgMHgyMGExLCAweDAxMmMsCisJMHg3ODliLCAweDAwMDAsIDB4ODAwMCwgMHg4MGFjLCAweGFkODAsIDB4MDAwYSwgMHgyMDk4LCAweDUzYTYsCisJMHgxNDdmLCAweDEzN2YsIDB4MTU3ZiwgMHg2ODEwLCAweDgwMDcsIDB4Nzg5YiwgMHgwMDdlLCAweDc4YWEsCisJMHg2ZDkwLCAweDdkZDYsIDB4N2RkZSwgMHg2ZTk0LCAweDdlZDIsIDB4N2VkYSwgMHg3ODMwLCAweGEwODQsCisJMHgwMGMwLCAweDAwYzAsIDB4MWUxNSwgMHgwMDk4LCAweDFlMWQsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDEwNzgsIDB4MmQ3NywgMHgwMDc4LCAweDFiZmYsIDB4NzIwMCwgMHhhMjg0LCAweDAwMDcsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgxZTJhLCAweDc4MWIsIDB4MDA0OSwgMHgxMDc4LCAweDJkNzcsCisJMHgwMDc4LCAweDFlM2IsIDB4NmFiMCwgMHhhMjk1LCAweDIwMDAsIDB4N2E1YSwgMHg3ODFiLCAweDAwNDksCisJMHgxMDc4LCAweDJkNzcsIDB4NzIwMCwgMHgyNTAwLCAweGE2MDUsIDB4MDA0MCwgMHgxZTNiLCAweGEyODQsCisJMHgwMDA3LCAweDEwNzksIDB4MWU0OSwgMHhhZDgwLCAweDAwMDgsIDB4NzAzMiwgMHhhMjg0LCAweDAwMDcsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgxZTQ3LCAweDYwMTgsIDB4ODAwMCwgMHg2MDFhLCAweDAwNzgsCisJMHgxYmY3LCAweDFlNTEsIDB4MzBmMCwgMHgzMGYwLCAweDMwZGYsIDB4MzBmMCwgMHgxZTUxLCAweDFlNTEsCisJMHgxZTUxLCAweDEwNzgsIDB4MWJhNSwgMHg3ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg3ODBhLCAweDBmN2UsCisJMHgyMDc5LCAweDM1MDAsIDB4Nzg5OCwgMHgwZjdmLCAweGEwODQsIDB4MDAwMSwgMHgwMDQwLCAweDFlNzksCisJMHg3MGEwLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDFlNjgsIDB4NzBhMiwgMHgwMDc4LCAweDFmMDEsCisJMHg3MGEwLCAweGEwODYsIDB4MDAwNSwgMHgwMGMwLCAweDFlNzcsIDB4NzBiYywgMHgyMDY4LCAweDY4MTcsCisJMHgwMDA0LCAweDY4MTMsIDB4MDAwMCwgMHg2ODFjLCAweGEwODUsIDB4MDAwOCwgMHg2ODFlLCAweDcwYTMsCisJMHgwMDAwLCAweDE1N2UsIDB4MjAxMSwgMHgwMDA0LCAweDcxYTAsIDB4YTE4NiwgMHgwMDAxLCAweDAwNDAsCisJMHgxZTliLCAweGExODYsIDB4MDAwNywgMHgwMGMwLCAweDFlOGIsIDB4MjAwOSwgMHgzNTJiLCAweDIwMGIsCisJMHgwMDA1LCAweDAwNzgsIDB4MWU5YiwgMHgyMDA5LCAweDM1MTMsIDB4MjEwNCwgMHgyMDA5LCAweDM1MTIsCisJMHgyMDBhLCAweDIwMDksIDB4MzUyYiwgMHgyMDBiLCAweDAwMDEsIDB4NzBhMywgMHgwMDAwLCAweDcwYTcsCisJMHgwMDAxLCAweDAwNzgsIDB4MWU5ZCwgMHg3MGEzLCAweDAwMDAsIDB4MTA3OCwgMHgyZWM3LCAweDIwYTksCisJMHgwMDEwLCAweDIwMzksIDB4MDAwMCwgMHgxMDc4LCAweDJiYTYsIDB4YTdiOCwgMHgwMTAwLCAweDAwNzAsCisJMHgxZWFiLCAweDAwNzgsIDB4MWVhMywgMHg3MDAwLCAweDIwMjAsIDB4MDA3OSwgMHgxZWFmLCAweDFlZGQsCisJMHgxZWM2LCAweDFlYzYsIDB4MWViOSwgMHgxZWRkLCAweDFlZGQsIDB4MWViNywgMHgxZWI3LCAweDEwNzgsCisJMHgxYmE1LCAweDIwMjEsIDB4MzU1NywgMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgxZWM2LCAweGFkMDYsCisJMHgwMGMwLCAweDFlYzYsIDB4NjgwMCwgMHgyMDIyLCAweDAwNzgsIDB4MWVkNiwgMHg2ODFjLCAweGEwODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MWVkMiwgMHg2ZjEwLCAweDEwNzgsIDB4MmNhMSwgMHgxMDc4LCAweDI4ZDksCisJMHgwMDc4LCAweDFlZDYsIDB4NzA1NCwgMHgyMDYwLCAweDY4MDAsIDB4NjAwMiwgMHg2YTE2LCAweDY4MWMsCisJMHhhMDg1LCAweDAwMDgsIDB4NjgxZSwgMHgxMDc4LCAweDE3ZGQsIDB4MjAyMSwgMHgzZjgwLCAweDEwNzgsCisJMHgxZjA3LCAweDIwMjEsIDB4MzU1NywgMHgxMDc4LCAweDFmMDcsIDB4MjBhOSwgMHgwMDAwLCAweDIwMjEsCisJMHgzZTgwLCAweDEwNzgsIDB4MWYwNywgMHg4NDIwLCAweDAwNzAsIDB4MWVmMCwgMHgwMDc4LCAweDFlZTksCisJMHgyMGE5LCAweDAwODAsIDB4MjA2MSwgMHgzNjgwLCAweDYwMTgsIDB4NjExMCwgMHhhMTAyLCAweDYwMTIsCisJMHg2MDFiLCAweDAwMDAsIDB4YWNlMCwgMHgwMDEwLCAweDAwNzAsIDB4MWYwMCwgMHgwMDc4LCAweDFlZjQsCisJMHgxNTdmLCAweDcwMDMsIDB4MDAwMCwgMHg3MDNmLCAweDAwMDAsIDB4MDA3OCwgMHgxYmY3LCAweDA0N2UsCisJMHgyNDA0LCAweGEwMDUsIDB4MDA0MCwgMHgxZjE5LCAweDIwNjgsIDB4NjgwMCwgMHgwMDdlLCAweDZhMTYsCisJMHg2ODFjLCAweGEwODUsIDB4MDAwOCwgMHg2ODFlLCAweDEwNzgsIDB4MTdkZCwgMHgwMDdmLCAweDAwNzgsCisJMHgxZjA5LCAweDA0N2YsIDB4MjAyMywgMHgwMDAwLCAweDAwN2MsIDB4YTI4MiwgMHgwMDAzLCAweDAwNTAsCisJMHgxZjIzLCAweDEwNzgsIDB4MWJhNSwgMHgyMzAwLCAweDAwNzksIDB4MWYyNiwgMHgxZjI5LCAweDFmOWMsCisJMHgxZmFhLCAweGEyODIsIDB4MDAwMiwgMHgwMDQwLCAweDFmMmYsIDB4MTA3OCwgMHgxYmE1LCAweDcwYTAsCisJMHg3MGEzLCAweDAwMDAsIDB4NzBjMywgMHgwMDAwLCAweDAwNzksIDB4MWYzNiwgMHgxZjNlLCAweDFmM2UsCisJMHgxZjQwLCAweDFmNzQsIDB4MjkwOCwgMHgxZjNlLCAweDFmNzQsIDB4MWYzZSwgMHgxMDc4LCAweDFiYTUsCisJMHg3N2I0LCAweDEwNzgsIDB4MmJhNiwgMHg3N2I0LCAweGE3YmMsIDB4MGYwMCwgMHgxMDc4LCAweDJjYTEsCisJMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgxZjZiLCAweDIwMjEsIDB4M2Y4MCwgMHgyMDA5LCAweDAwMDQsCisJMHgyMDExLCAweDAwMTAsIDB4MTA3OCwgMHgxZmM1LCAweDAwNDAsIDB4MWY2YiwgMHgxNTdlLCAweDIwYTksCisJMHgwMDAwLCAweDIwMjEsIDB4M2U4MCwgMHgwNDdlLCAweDIwMDksIDB4MDAwNCwgMHgyMDExLCAweDAwMTAsCisJMHgxMDc4LCAweDFmYzUsIDB4MDQ3ZiwgMHgwMDQwLCAweDFmNmEsIDB4ODQyMCwgMHgwMDcwLCAweDFmNmEsCisJMHgwMDc4LCAweDFmNWIsIDB4MTU3ZiwgMHg4NzM4LCAweGE3ODQsIDB4MDAwNywgMHgwMGMwLCAweDFmNDYsCisJMHgwMDc4LCAweDFiZmYsIDB4MDA3OCwgMHgxYmZmLCAweDc3YjQsIDB4MTA3OCwgMHgyY2ExLCAweDYwMTgsCisJMHhhMDA1LCAweDAwNDAsIDB4MWY5YSwgMHgyMDIxLCAweDNmODAsIDB4MjAwOSwgMHgwMDA1LCAweDIwMTEsCisJMHgwMDIwLCAweDEwNzgsIDB4MWZjNSwgMHgwMDQwLCAweDFmOWEsIDB4MTU3ZSwgMHgyMGE5LCAweDAwMDAsCisJMHgyMDIxLCAweDNlODAsIDB4MDQ3ZSwgMHgyMDA5LCAweDAwMDUsIDB4MjAxMSwgMHgwMDIwLCAweDEwNzgsCisJMHgxZmM1LCAweDA0N2YsIDB4MDA0MCwgMHgxZjk5LCAweDg0MjAsIDB4MDA3MCwgMHgxZjk5LCAweDAwNzgsCisJMHgxZjhhLCAweDE1N2YsIDB4MDA3OCwgMHgxYmZmLCAweDIyMDAsIDB4MDA3OSwgMHgxZjlmLCAweDFmYTIsCisJMHgxZmE0LCAweDFmYTQsIDB4MTA3OCwgMHgxYmE1LCAweDcwYTMsIDB4MDAwMCwgMHg3MGE3LCAweDAwMDEsCisJMHgwMDc4LCAweDFiZjcsIDB4MjIwMCwgMHgwMDc5LCAweDFmYWQsIDB4MWZiMiwgMHgxZmE0LCAweDFmYjAsCisJMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgyNDFmLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgyOGFmLCAweDEwNzgsIDB4MjhlZiwgMHg2MDA4LCAweGEwODQsIDB4ZmZlZiwgMHg2MDBhLCAweDEwNzgsCisJMHgyOGEyLCAweDAwNDAsIDB4MjhhZiwgMHgwMDc4LCAweDFjZDYsIDB4MjQwNCwgMHhhMDA1LCAweDAwNDAsCisJMHgxZmU2LCAweDIwNjgsIDB4MmQwNCwgMHgwMDdlLCAweDY4MTAsIDB4YTcwNiwgMHgwMDQwLCAweDFmZDQsCisJMHgyZDIwLCAweDAwN2YsIDB4MDA3OCwgMHgxZmM2LCAweDAwN2YsIDB4MjAyMiwgMHg2OTE2LCAweDY4MWMsCisJMHhhMjA1LCAweDY4MWUsIDB4MTA3OCwgMHgxN2RkLCAweDYwMTAsIDB4ODAwMSwgMHg2MDEyLCAweDYwMDgsCisJMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgxMDc4LCAweDI4ZWYsIDB4MDA3YywgMHhhMDg1LCAweDAwMDEsCisJMHgwMDc4LCAweDFmZTUsIDB4MjMwMCwgMHgwMDc5LCAweDFmZWQsIDB4MWZmMiwgMHgxZmYwLCAweDIwMzUsCisJMHgxMDc4LCAweDFiYTUsIDB4NzhlNCwgMHhhMDA1LCAweDAwZDAsIDB4MjAxNSwgMHgwMDE4LCAweDIwMTUsCisJMHgyMDA4LCAweGEwODQsIDB4MDAzMCwgMHgwMGMwLCAweDIwMDEsIDB4NzgxYiwgMHgwMDQ5LCAweDAwNzgsCisJMHgxYmY3LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsIDB4MWZmZCwgMHgyMTAwLCAweGEwODQsCisJMHgwMDA3LCAweDAwNzksIDB4MjAwYiwgMHgyMDIzLCAweDIwMjksIDB4MjAxZCwgMHgyMDEzLCAweDJkNTgsCisJMHgyZDU4LCAweDIwMTMsIDB4MjAyZiwgMHgxMDc4LCAweDFiYTUsIDB4NzAwMCwgMHhhMDA1LCAweDAwNDAsCisJMHgxYmZmLCAweDIwMDEsIDB4MDAwMywgMHgwMDc4LCAweDIyZmEsIDB4MTA3OCwgMHgyYjg5LCAweDc4MWIsCisJMHgwMDU1LCAweDAwNzgsIDB4MWJmNywgMHgxMDc4LCAweDJiODksIDB4NzgxYiwgMHgwMGRjLCAweDAwNzgsCisJMHgxYmY3LCAweDEwNzgsIDB4MmI4OSwgMHg3ODFiLCAweDAwZTMsIDB4MDA3OCwgMHgxYmY3LCAweDEwNzgsCisJMHgyYjg5LCAweDc4MWIsIDB4MDA5ZCwgMHgwMDc4LCAweDFiZjcsIDB4YTU4NCwgMHgwMDBmLCAweDAwYzAsCisJMHgyMDVmLCAweDEwNzgsIDB4MjQxZiwgMHg3MDAwLCAweDAwNzksIDB4MjAzZSwgMHgyMDQ2LCAweDIwNTMsCisJMHgyMDQ2LCAweDI4YWYsIDB4MjA0OCwgMHgyOGFmLCAweDIwNDYsIDB4MjA0NiwgMHgxMDc4LCAweDFiYTUsCisJMHg3MWEwLCAweDcwYTMsIDB4MDAwMCwgMHhhMTg2LCAweDAwMDQsIDB4MDBjMCwgMHgyMDUxLCAweDAwNzgsCisJMHgyOTA4LCAweDAwNzgsIDB4MjhhZiwgMHgxMDc4LCAweDI4ZWYsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDEwNzgsIDB4MjhhMiwgMHgwMDQwLCAweDI4YWYsIDB4MDA3OCwgMHgxY2Q2LCAweDc4ZTQsCisJMHhhMDA1LCAweDAwZDAsIDB4MjAxNSwgMHgwMDE4LCAweDIwMTUsIDB4MjAwOCwgMHhhMDg0LCAweDAwMzAsCisJMHgwMGMwLCAweDIwNmUsIDB4NzgxYiwgMHgwMDQ5LCAweDAwNzgsIDB4MWJmNywgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDAwNDAsIDB4MjA2YSwgMHgyMTAwLCAweGExODQsIDB4MDAwNywgMHgwMDc5LCAweDIwNzgsCisJMHgyMDg4LCAweDIwOGUsIDB4MjA4MiwgMHgyMDgwLCAweDJkNTgsIDB4MmQ1OCwgMHgyMDgwLCAweDJkNTAsCisJMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgyYjkxLCAweDc4MWIsIDB4MDA1NSwgMHgwMDc4LCAweDFiZjcsCisJMHgxMDc4LCAweDJiOTEsIDB4NzgxYiwgMHgwMGRjLCAweDAwNzgsIDB4MWJmNywgMHgxMDc4LCAweDJiOTEsCisJMHg3ODFiLCAweDAwZTMsIDB4MDA3OCwgMHgxYmY3LCAweDEwNzgsIDB4MmI5MSwgMHg3ODFiLCAweDAwOWQsCisJMHgwMDc4LCAweDFiZjcsIDB4MjMwMCwgMHgwMDc5LCAweDIwOWQsIDB4MjBhMiwgMHgyMGEwLCAweDIwYTQsCisJMHgxMDc4LCAweDFiYTUsIDB4MDA3OCwgMHgyNjY1LCAweDY4MTcsIDB4MDAwOCwgMHg3OGEzLCAweDAwMDAsCisJMHg3OWU0LCAweGExODQsIDB4MDAzMCwgMHgwMDQwLCAweDI2NjUsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsCisJMHgwMDQwLCAweDI2NjUsIDB4YTE4NCwgMHgwMDA3LCAweDAwNzksIDB4MjBiNiwgMHgyMDIzLCAweDIwMjksCisJMHgyMDFkLCAweDJkMzAsIDB4MmQ1OCwgMHgyZDU4LCAweDIwYmUsIDB4MmQ1MCwgMHgxMDc4LCAweDFiYTUsCisJMHhhMjgyLCAweDAwMDUsIDB4MDA1MCwgMHgyMGM2LCAweDEwNzgsIDB4MWJhNSwgMHgyMzAwLCAweDAwNzksCisJMHgyMGM5LCAweDIwY2MsIDB4MjJjZSwgMHgyMmRhLCAweDIyMDAsIDB4MDA3OSwgMHgyMGNmLCAweDIwZDQsCisJMHgyMGQ2LCAweDIwZTksIDB4MjBkNCwgMHgyMmIzLCAweDEwNzgsIDB4MWJhNSwgMHg3ODliLCAweDAwMTgsCisJMHg3OGE4LCAweGEwODQsIDB4MDBmZiwgMHhhMDgyLCAweDAwMjAsIDB4MDA0OCwgMHgyYjZhLCAweGEwOGEsCisJMHgwMDA0LCAweDAwYzgsIDB4MmI2YSwgMHgwMDc5LCAweDIwZTUsIDB4MmI2YSwgMHgyYjZhLCAweDJiNmEsCisJMHgyYjBjLCAweDc4OWIsIDB4MDAxOCwgMHg3OWE4LCAweGExODQsIDB4MDA4MCwgMHgwMDQwLCAweDIwZmUsCisJMHhhMTg0LCAweDAwMTgsIDB4MDA0MCwgMHgyMGZhLCAweDAwNzgsIDB4MmI2YSwgMHg3MDAwLCAweGEwMDUsCisJMHgwMGMwLCAweDIwZjQsIDB4MjAxMSwgMHgwMDAzLCAweDAwNzgsIDB4Mjc1MiwgMHhhMTg0LCAweDAwZmYsCisJMHhhMDhhLCAweDAwMTAsIDB4MDBjOCwgMHgyYjZhLCAweDAwNzksIDB4MjEwNiwgMHgyMTE4LCAweDIxMTYsCisJMHgyMTJlLCAweDIxMzAsIDB4MjFjMiwgMHgyYjZhLCAweDJiNmEsIDB4MjFjNCwgMHgyYjZhLCAweDJiNmEsCisJMHgyMmFmLCAweDIyYWYsIDB4MmI2YSwgMHgyYjZhLCAweDJiNmEsIDB4MjJiMSwgMHgxMDc4LCAweDFiYTUsCisJMHhhNjg0LCAweDEwMDAsIDB4MDA0MCwgMHgyMTI1LCAweDIwMDEsIDB4MDMwMCwgMHg4MDAwLCAweDgwMDAsCisJMHg3ODNhLCAweDc4MWIsIDB4MDA5YSwgMHgwMDc4LCAweDFiZjcsIDB4NjgxNCwgMHhhMDg0LCAweDgwMDAsCisJMHgwMDQwLCAweDIxMmMsIDB4NjgxNywgMHgwMDAzLCAweDAwNzgsIDB4MmQzMCwgMHgxMDc4LCAweDFiYTUsCisJMHg2OTFjLCAweDY5MWUsIDB4YTY4NCwgMHgxODAwLCAweDAwYzAsIDB4MjE0YSwgMHg2ODFjLCAweGEwODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MjE1MiwgMHg2ODE0LCAweGEwODYsIDB4MDAwOCwgMHgwMGMwLCAweDIxNDIsCisJMHg2ODE3LCAweDAwMDAsIDB4YTY4NCwgMHgwNDAwLCAweDAwNDAsIDB4MjFiZSwgMHg3ODFiLCAweDAwNTgsCisJMHgwMDc4LCAweDFiZjcsIDB4YTY4NCwgMHgxMDAwLCAweDAwNDAsIDB4MjE1MiwgMHg3ODFiLCAweDAwNTgsCisJMHgwMDc4LCAweDFiZjcsIDB4YTY4NCwgMHgwMDYwLCAweDAwNDAsIDB4MjFiYSwgMHhhNjg0LCAweDA4MDAsCisJMHgwMDQwLCAweDIxYmEsIDB4YTY4NCwgMHg4MDAwLCAweDAwYzAsIDB4MjE2MCwgMHgwMDc4LCAweDIxN2EsCisJMHhhNmI0LCAweDdmZmYsIDB4N2U1YSwgMHg2ZWIyLCAweDc4OWIsIDB4MDA3NCwgMHg3YWFjLCAweDc5YWMsCisJMHg3OGFjLCAweDgwMWIsIDB4MDBjOCwgMHgyMTZkLCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsCisJMHhhMjkxLCAweDAwMDAsIDB4NmI5NCwgMHgyMTAwLCAweGEzMDIsIDB4NjhhZSwgMHg2YjkwLCAweDIyMDAsCisJMHhhMzAzLCAweDY4YWEsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsIDB4MjE4MiwgMHhhNmI0LCAweGJmZmYsCisJMHg3ZTVhLCAweDZlYjIsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsIDB4MDBjMCwgMHgyMThmLCAweDEwNzgsCisJMHgyZjNhLCAweDEwNzgsIDB4MzBkZiwgMHg3ODFiLCAweDAwNjcsIDB4MDA3OCwgMHgxYmY3LCAweGEwMDYsCisJMHgxMDc4LCAweDMxOTQsIDB4NmFhYywgMHg2OWE4LCAweDZjOTQsIDB4NmI5MCwgMHgyMjAwLCAweGExMDUsCisJMHgwMDQwLCAweDIxOWUsIDB4MjIwMCwgMHhhNDIyLCAweDIxMDAsIDB4YTMxYiwgMHg3Y2QyLCAweDdiZDYsCisJMHgyMzAwLCAweGE0MDUsIDB4MDBjMCwgMHgyMWFjLCAweGE2YjUsIDB4NDAwMCwgMHg3ZTVhLCAweDZlYjIsCisJMHg3ODFiLCAweDAwNjcsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA2NywgMHgyMjAwLCAweGExMTUsCisJMHgwMGMwLCAweDIxYjYsIDB4MTA3OCwgMHgzMGYwLCAweDAwNzgsIDB4MWJmNywgMHgxMDc4LCAweDMxMWQsCisJMHgwMDc4LCAweDFiZjcsIDB4NzgxYiwgMHgwMDZhLCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNTgsCisJMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgxYmE1LCAweDAwNzgsIDB4MjIyMSwgMHg2OTFjLCAweGExODQsCisJMHgwMTAwLCAweDAwNDAsIDB4MjFkYywgMHhhMThjLCAweGZlZmYsIDB4NjkxZSwgMHgwYzdlLCAweDcwNDgsCisJMHgyMDYwLCAweDYwMDAsIDB4YTA4NCwgMHhlZmZmLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsCisJMHg2MDA2LCAweDBjN2YsIDB4MDA3OCwgMHgyMjEwLCAweGExODQsIDB4MDIwMCwgMHgwMDQwLCAweDIyMTAsCisJMHhhMThjLCAweGZkZmYsIDB4NjkxZSwgMHgwYzdlLCAweDcwNDgsIDB4MjA2MCwgMHg2MDAwLCAweGEwODQsCisJMHhkZmZmLCAweDYwMDIsIDB4NjAwNCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwNiwgMHgyMDA4LCAweDJjNDgsCisJMHgwYzdmLCAweGExODQsIDB4MDAwOCwgMHgwMDQwLCAweDIyMTAsIDB4MTA3OCwgMHgyYzlkLCAweDEwNzgsCisJMHgyOWU2LCAweDg4ZmYsIDB4MDA0MCwgMHgyMjEwLCAweDc4OWIsIDB4MDA2MCwgMHgyODAwLCAweDc4YWEsCisJMHg3ZTU4LCAweGE2YjUsIDB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDIyMGMsCisJMHg3ODFiLCAweDAwNTUsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsCisJMHg3ZTU4LCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDIyMTksIDB4NzgxYiwgMHgwMDU4LCAweDAwNzgsCisJMHgxYmY3LCAweDc4MWIsIDB4MDA2YSwgMHgwMDc4LCAweDFiZjcsIDB4MDA3OCwgMHgyYjcwLCAweDAwNzgsCisJMHgyYjcwLCAweDIwMTksIDB4MDAwMCwgMHg3OTkwLCAweGExOGMsIDB4MDAwNywgMHgwMDQwLCAweDIyMWYsCisJMHg3ODliLCAweDAwMTAsIDB4NzhhOCwgMHhhMDk0LCAweDAwZmYsIDB4YTI4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgyMjQ0LCAweDIzMDAsIDB4N2NhOCwgMHhhNDAwLCAweDIwMTgsIDB4YTEwMiwgMHgwMDQwLCAweDIyM2MsCisJMHgwMDQ4LCAweDIyM2MsIDB4MDA3OCwgMHgyMjNlLCAweDAwNzgsIDB4MjFjNiwgMHgyNGE4LCAweDdhYTgsCisJMHgwMGYwLCAweDIyM2UsIDB4MDA3OCwgMHgyMjJhLCAweGEyODQsIDB4MDBmMCwgMHhhMDg2LCAweDAwMjAsCisJMHgwMGMwLCAweDIyYTAsIDB4ODMxOCwgMHg4MzE4LCAweDIzMDAsIDB4YTEwMiwgMHgwMDQwLCAweDIyNTQsCisJMHgwMDQ4LCAweDIyNTQsIDB4MDA3OCwgMHgyMjlkLCAweGEyODYsIDB4MDAyMywgMHgwMDQwLCAweDIyMWYsCisJMHg2ODE4LCAweGEwODQsIDB4ZmZmMSwgMHg2ODFhLCAweDdlNTgsIDB4YTY4NCwgMHhmZmYxLCAweGEwODUsCisJMHgwMDEwLCAweDIwMzAsIDB4N2U1YSwgMHg2MDA4LCAweGEwODUsIDB4MDAxMCwgMHg2MDBhLCAweDBjN2UsCisJMHg3MDQ4LCAweDIwNjAsIDB4NjAwNCwgMHgyMDA4LCAweDJjNDgsIDB4MGM3ZiwgMHhhMTg0LCAweDAwMTAsCisJMHgwMDQwLCAweDIyNzgsIDB4MTA3OCwgMHgyYzlkLCAweDEwNzgsIDB4MmFjYywgMHgwMDc4LCAweDIyODcsCisJMHgwYzdlLCAweDcwNDgsIDB4MjA2MCwgMHg2MDA0LCAweDIwMDgsIDB4MmM0OCwgMHgwYzdmLCAweGExODQsCisJMHgwMDA4LCAweDAwNDAsIDB4MjIxMCwgMHgxMDc4LCAweDJjOWQsIDB4MTA3OCwgMHgyOWU2LCAweDg4ZmYsCisJMHgwMDQwLCAweDIyMTAsIDB4Nzg5YiwgMHgwMDYwLCAweDI4MDAsIDB4NzhhYSwgMHhhNmI1LCAweDAwMDQsCisJMHg3ZTVhLCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDIyOTksIDB4NzgxYiwgMHgwMDU1LCAweDAwNzgsCisJMHgxYmY3LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsIDB4N2FhOCwgMHgwMDc4LCAweDIyMmEsCisJMHg4MzE4LCAweDIzMDAsIDB4YTEwMiwgMHgwMDQwLCAweDIyYTksIDB4MDA0OCwgMHgyMmE5LCAweDAwNzgsCisJMHgyMjJhLCAweGEyODQsIDB4MDA4MCwgMHgwMGMwLCAweDJiNzYsIDB4MDA3OCwgMHgyYjcwLCAweDAwNzgsCisJMHgyYjc2LCAweDAwNzgsIDB4MmI2YSwgMHg3ODliLCAweDAwMTgsIDB4NzhhOCwgMHhhMDg0LCAweDAwZmYsCisJMHhhMDhlLCAweDAwMDEsIDB4MDA0MCwgMHgyMmJlLCAweDEwNzgsIDB4MWJhNSwgMHg3YWE4LCAweGEyOTQsCisJMHgwMGZmLCAweDc4YTgsIDB4YTA4NCwgMHgwMGZmLCAweGEwOGEsIDB4MDAwNCwgMHgwMGM4LCAweDJiNmEsCisJMHgwMDc5LCAweDIyY2EsIDB4MmI2YSwgMHgyOTM5LCAweDJiNmEsIDB4MmE2NywgMHhhMjgyLCAweDAwMDAsCisJMHgwMGMwLCAweDIyZDQsIDB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MmI4OSwgMHg3ODFiLCAweDAwNjksCisJMHgwMDc4LCAweDFiZjcsIDB4YTI4MiwgMHgwMDAzLCAweDAwYzAsIDB4MjJlMCwgMHgxMDc4LCAweDFiYTUsCisJMHgxMDc4LCAweDJiOTksIDB4NzgxYiwgMHgwMDY5LCAweDAwNzgsIDB4MWJmNywgMHhhMjgyLCAweDAwMDQsCisJMHgwMDUwLCAweDIyZWMsIDB4MTA3OCwgMHgxYmE1LCAweDIzMDAsIDB4MDA3OSwgMHgyMmVmLCAweDIyZjIsCisJMHgyM2M5LCAweDIzZmEsIDB4YTI4NiwgMHgwMDAzLCAweDAwNDAsIDB4MjJmOCwgMHgxMDc4LCAweDFiYTUsCisJMHgyMDAxLCAweDAwMDAsIDB4NzAzYSwgMHg3MDAwLCAweGEwODQsIDB4MDAwNywgMHgwMDc5LCAweDIzMDAsCisJMHgyMzA4LCAweDIzMGEsIDB4MjMwYSwgMHgyNTA4LCAweDI1MzAsIDB4MjRkMiwgMHgyMzA4LCAweDIzMDgsCisJMHgxMDc4LCAweDFiYTUsIDB4YTY4NCwgMHgxMDAwLCAweDAwYzAsIDB4MjMxMiwgMHgxMDc4LCAweDJlYzcsCisJMHgwMDQwLCAweDIzYTMsIDB4Nzg2OCwgMHhhMDhjLCAweDAwZmYsIDB4MDA0MCwgMHgyMzVhLCAweGExODYsCisJMHgwMDA4LCAweDAwYzAsIDB4MjMyOSwgMHgxMDc4LCAweDI4ZWYsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDEwNzgsIDB4MjhhMiwgMHgwMDQwLCAweDIzNWEsIDB4MTA3OCwgMHgyZWM3LCAweDAwNzgsCisJMHgyMzQxLCAweGExODYsIDB4MDAyOCwgMHgwMGMwLCAweDIzNWEsIDB4MTA3OCwgMHgyZWM3LCAweDYwMDgsCisJMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHg2MDE4LCAweGEwMDUsIDB4MDA0MCwgMHgyMzQxLCAweDgwMDEsCisJMHg2MDFhLCAweGEwMDUsIDB4MDA0MCwgMHgyMzQxLCAweDgwMDEsIDB4YTAwNSwgMHgwMDQwLCAweDIzNDEsCisJMHg2MDFlLCAweDY4MWMsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsIDB4MWJmZiwgMHg2ODFjLCAweGEwODQsCisJMHhmZmZlLCAweDY4MWUsIDB4NzA1NCwgMHgwYzdlLCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLCAweDBjN2YsCisJMHg2MDA0LCAweDY4MDIsIDB4YTAwNSwgMHgyZDAwLCAweDAwYzAsIDB4MjM1NywgMHg2MDAyLCAweDYwMDYsCisJMHgwMDc4LCAweDFiZmYsIDB4MDE3ZSwgMHgxMDc4LCAweDI0MWYsIDB4MDE3ZiwgMHhhNjg0LCAweGRmMDAsCisJMHg2ODFhLCAweDY4MjcsIDB4MDAwMCwgMHg2ZjEwLCAweDgxZmYsIDB4MDA0MCwgMHgyM2EzLCAweGExODYsCisJMHgwMDAyLCAweDAwYzAsIDB4MjM5YiwgMHhhNjg0LCAweDA4MDAsIDB4MDBjMCwgMHgyMzc3LCAweGE2ODQsCisJMHgwMDYwLCAweDAwNDAsIDB4MjM3NywgMHg3OGQ4LCAweDdhZGMsIDB4NjgyZSwgMHg2YTJhLCAweDg3MTcsCisJMHhhMjk0LCAweDAwMGYsIDB4ODIxMywgMHg4MjEzLCAweDgyMTMsIDB4YTI5MCwgMHgzNjAwLCAweGEyOTAsCisJMHgwMDAwLCAweDIyMWMsIDB4YTM4NCwgMHgwMTAwLCAweDAwYzAsIDB4MjM4OCwgMHgwMDc4LCAweDIzOGUsCisJMHg4MjEwLCAweDIyMDQsIDB4YTA4NSwgMHgwMDE4LCAweDIwMTIsIDB4ODIxMSwgMHhhMzg0LCAweDA0MDAsCisJMHgwMDQwLCAweDIzOWIsIDB4Njg5YywgMHhhMDg0LCAweDAxMDAsIDB4MDBjMCwgMHgyMzliLCAweDEwNzgsCisJMHgyNDkxLCAweDAwNzgsIDB4MWJmZiwgMHhhMTg2LCAweDAwMTgsIDB4MDA0MCwgMHgyM2EzLCAweGExODYsCisJMHgwMDE0LCAweDAwNDAsIDB4MWJmZiwgMHg2OTEyLCAweDY4MTQsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsCisJMHgyM2FiLCAweDcwMzgsIDB4NjgxNiwgMHhhNjhjLCAweGRmMDAsIDB4NjkxYSwgMHgxMDc4LCAweDI4ZTAsCisJMHgxMDc4LCAweDI4ZWYsIDB4MDBjMCwgMHgyM2I4LCAweDYwMDgsIDB4YTA4NCwgMHhmZmVmLCAweDYwMGEsCisJMHg2ODFjLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDIzYzEsIDB4MTA3OCwgMHgyOGQ5LCAweDAwNzgsCisJMHgyM2M1LCAweDcwNTQsIDB4MjA2MCwgMHg2ODAwLCAweDYwMDIsIDB4MTA3OCwgMHgxN2RkLCAweDAwNzgsCisJMHgxYmZmLCAweGEyODIsIDB4MDAwNCwgMHgwMDQ4LCAweDIzY2YsIDB4MTA3OCwgMHgxYmE1LCAweDIyMDAsCisJMHgwMDc5LCAweDIzZDIsIDB4MjNkNiwgMHgyM2Q4LCAweDIzZTUsIDB4MjNkOCwgMHgxMDc4LCAweDFiYTUsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwNSwgMHgwMDQwLCAweDIzZTEsIDB4MTA3OCwgMHgyYjg5LCAweDc4MWIsCisJMHgwMDY5LCAweDc4MWIsIDB4MDA2YSwgMHgwMDc4LCAweDFiZjcsIDB4Nzg5MCwgMHg4MDA3LCAweDgwMDEsCisJMHhhMDg0LCAweDAwMDcsIDB4YTA4MCwgMHgwMDE4LCAweDc4OWEsIDB4NzlhOCwgMHhhMThjLCAweDAwZmYsCisJMHhhMTg2LCAweDAwMDMsIDB4MDA0MCwgMHgyM2Y2LCAweDAwNzgsIDB4MmI2YSwgMHg3ODFiLCAweDAwNmEsCisJMHgwMDc4LCAweDFiZjcsIDB4NjgxYywgMHhhMDg1LCAweDAwMDQsIDB4NjgxZSwgMHg4MmZmLCAweDAwYzAsCisJMHgyNDA1LCAweDEwNzgsIDB4MmI4OSwgMHgwMDc4LCAweDI0MGMsIDB4ODIxMSwgMHgwMDQwLCAweDI0MGEsCisJMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgyYjk5LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsCisJMHgxMDc4LCAweDJkNzcsIDB4NzgzMCwgMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgyNDFjLCAweDAwMTgsCisJMHgyNDFjLCAweDc5MWEsIDB4YTAwNiwgMHgwMDdjLCAweGEwODUsIDB4MDAwMSwgMHgwMDdjLCAweGE2ODQsCisJMHgwMDYwLCAweDAwYzAsIDB4MjQyOSwgMHg2ODJmLCAweDAwMDAsIDB4NjgyYiwgMHgwMDAwLCAweDAwNzgsCisJMHgyNDkwLCAweGE2ODQsIDB4MDgwMCwgMHgwMGMwLCAweDI0MzgsIDB4NjhiMCwgMHhhMDg0LCAweDQ4MDAsCisJMHhhNjM1LCAweGE2ODQsIDB4MDgwMCwgMHgwMGMwLCAweDI0MzgsIDB4MTA3OCwgMHgyZWM3LCAweDAwN2MsCisJMHhhNjg0LCAweDAwMjAsIDB4MDA0MCwgMHgyNDYyLCAweDc4ZDAsIDB4ODAwMywgMHgwMGM4LCAweDI0NDYsCisJMHhhMDA2LCAweDEwNzgsIDB4MzE5NCwgMHg3OGQ0LCAweDEwNzgsIDB4MzFmOSwgMHhhNjg0LCAweDQwMDAsCisJMHgwMDQwLCAweDI0NTAsIDB4NjgyZiwgMHgwMDAwLCAweDY4MmIsIDB4MDAwMCwgMHgwMDc4LCAweDI0MzUsCisJMHg2OGIwLCAweGEwODQsIDB4NDgwMCwgMHhhNjM1LCAweGE2ODQsIDB4NDAwMCwgMHgwMGMwLCAweDI0NGEsCisJMHg3MDM4LCAweGEwMDUsIDB4MDBjMCwgMHgyNDVjLCAweDc5ZDgsIDB4N2FkYywgMHg2OTJlLCAweDZhMmEsCisJMHgwMDc4LCAweDI0MzUsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsIDB4MjQ2YywgMHg2ODJmLCAweDAwMDAsCisJMHg2ODJiLCAweDAwMDAsIDB4MDA3OCwgMHgyNDM1LCAweDY4YjAsIDB4YTA4NCwgMHg0ODAwLCAweGE2MzUsCisJMHhhNjg0LCAweDQwMDAsIDB4MDBjMCwgMHgyNDY2LCAweDcwMzgsIDB4YTAwNSwgMHgwMGMwLCAweDI0N2EsCisJMHg3MDNiLCAweDAwMDcsIDB4NzlkOCwgMHg3YWRjLCAweDc4ZDAsIDB4ODBmMywgMHgwMGM4LCAweDI0ODEsCisJMHg4MDAwLCAweGEwODQsIDB4MDAzZiwgMHhhMTA4LCAweGEyOTEsIDB4MDAwMCwgMHg2OTJlLCAweDZhMmEsCisJMHgyMTAwLCAweGEyMDUsIDB4MDBjMCwgMHgyNDhlLCAweDAwNzgsIDB4MjQzNSwgMHgxMDc4LCAweDMxOTQsCisJMHgwMDdjLCAweGEzODQsIDB4MDIwMCwgMHgwMDQwLCAweDI0OTksIDB4NjAwOCwgMHhhMDg1LCAweDAwMDIsCisJMHg2MDBhLCAweDY4MTcsIDB4MDAwNiwgMHg2YTI4LCAweDY5MmMsIDB4NmEzYSwgMHg2OTNlLCAweDY4MmIsCisJMHgwMzAwLCAweDY4MmYsIDB4MDAwMCwgMHg2ODMzLCAweDIwMDAsIDB4Njg5MywgMHgwMDAwLCAweDY4OTcsCisJMHgwMDIwLCAweDcwMDAsIDB4MDA3OSwgMHgyNGFjLCAweDI0YjQsIDB4MjRiNiwgMHgyNGJmLCAweDI0YjQsCisJMHgyNGI0LCAweDI0YjQsIDB4MjRiNCwgMHgyNGI0LCAweDEwNzgsIDB4MWJhNSwgMHg2ODFjLCAweGEwODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MjRiZiwgMHgxMDc4LCAweDI4ZDksIDB4MDA3OCwgMHgyNGM1LCAweDcwNTQsCisJMHgyYzUwLCAweDIwNjAsIDB4NjgwMCwgMHg2MDAyLCAweDJhNjAsIDB4MjAyMSwgMHgzNTU3LCAweDI0MDQsCisJMHhhMDA1LCAweDAwNDAsIDB4MjRjZSwgMHgyMDIwLCAweDAwNzgsIDB4MjRjNywgMHgyZDIyLCAweDIwNmIsCisJMHgwMDAwLCAweDAwN2MsIDB4NzdiNCwgMHgxMDc4LCAweDJiYTYsIDB4YTdiYywgMHgwZjAwLCAweDEwNzgsCisJMHgyY2ExLCAweDYwMTgsIDB4YTAwNSwgMHgwMDQwLCAweDI1MDEsIDB4MGQ3ZSwgMHgyMDAxLCAweDNmOTAsCisJMHgyMDY4LCAweDBkN2YsIDB4MjAyMSwgMHgzZjgwLCAweDIwMDksIDB4MDAwNCwgMHgyMDExLCAweDAwMTAsCisJMHgxMDc4LCAweDFmYzUsIDB4MDA0MCwgMHgyNTAxLCAweDE1N2UsIDB4MjBhOSwgMHgwMDAwLCAweDIwMjEsCisJMHgzZTgwLCAweDA0N2UsIDB4MjAwOSwgMHgwMDA0LCAweDIwMTEsIDB4MDAxMCwgMHgxMDc4LCAweDFmYzUsCisJMHgwNDdmLCAweDAwNDAsIDB4MjUwMCwgMHg4NDIwLCAweDAwNzAsIDB4MjUwMCwgMHgwMDc4LCAweDI0ZjEsCisJMHgxNTdmLCAweDg3MzgsIDB4YTc4NCwgMHgwMDA3LCAweDAwYzAsIDB4MjRkNywgMHgwMDc4LCAweDFiZmYsCisJMHgxMDc4LCAweDI4ZTAsIDB4MTA3OCwgMHgyOGVmLCAweDY4MjcsIDB4MDAwMCwgMHg3ODliLCAweDAwMGUsCisJMHg2ZjEwLCAweDY4MTMsIDB4MDAwMiwgMHgxMDc4LCAweDMxY2EsIDB4YTY4NCwgMHgwODAwLCAweDAwNDAsCisJMHgyNTFkLCAweDY5MTgsIDB4YTE4ZCwgMHgyMDAwLCAweDY5MWEsIDB4NjgxNCwgMHhhMDg0LCAweDgwMDAsCisJMHgwMDQwLCAweDI1MjQsIDB4NjgxNywgMHgwMDAwLCAweDIwMjEsIDB4MzU1NywgMHg2ODAwLCAweDIwMjIsCisJMHg2YTM4LCAweDY5M2MsIDB4NmEyYSwgMHg2OTJlLCAweDEwNzgsIDB4MTdkZCwgMHgwMDc4LCAweDFiZmYsCisJMHgxMDc4LCAweDI0MWYsIDB4NjgyNywgMHgwMDAwLCAweDc4OWIsIDB4MDAwZSwgMHg2ZjEwLCAweDEwNzgsCisJMHgyZDdjLCAweGEwOGMsIDB4MDBmZiwgMHg2OTEyLCAweDY4MTQsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsCisJMHgyNTQzLCAweDcwMzgsIDB4NjgxNiwgMHhhNjhjLCAweGRmMDAsIDB4NjkxYSwgMHg3MGEzLCAweDAwMDAsCisJMHgwMDc4LCAweDFiZmYsIDB4YTAwNiwgMHgxMDc4LCAweDJlYzcsIDB4NjgxMywgMHgwMDAwLCAweDY4MTcsCisJMHgwMDAxLCAweGE2OGMsIDB4ZGYwMCwgMHg2OTFhLCAweDY4MjcsIDB4MDAwMCwgMHg3MDAwLCAweDAwNzksCisJMHgyNTU5LCAweDI1NjEsIDB4MjU2MywgMHgyNTYzLCAweDI1NjUsIDB4MjU2NSwgMHgyNTY1LCAweDI1NjEsCisJMHgyNTYxLCAweDEwNzgsIDB4MWJhNSwgMHgxMDc4LCAweDI4ZWYsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsCisJMHg2MDBhLCAweDAwNzgsIDB4MjhiYSwgMHgyMzAwLCAweDAwNzksIDB4MjU2ZSwgMHgyNTcxLCAweDI1NzMsCisJMHgyNWIxLCAweDEwNzgsIDB4MWJhNSwgMHg3MDAwLCAweDAwNzksIDB4MjU3NiwgMHgyNTdlLCAweDI1ODAsCisJMHgyNTgwLCAweDI1OGIsIDB4MjU4MCwgMHgyNTkyLCAweDI1N2UsIDB4MjU3ZSwgMHgxMDc4LCAweDFiYTUsCisJMHhhNjg0LCAweDIwMDAsIDB4MDBjMCwgMHgyNThiLCAweGE2YjUsIDB4MjAwMCwgMHg3ZTVhLCAweDEwNzgsCisJMHgzMGYwLCAweDAwNzgsIDB4MmQzMCwgMHg2ODE0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI1OTIsCisJMHg2ODE3LCAweDAwMDcsIDB4MjAwOSwgMHgzNTE4LCAweDIxMGMsIDB4YTE4NiwgMHgwMDAwLCAweDAwNDAsCisJMHgyNWE3LCAweGExODYsIDB4MDAwMSwgMHgwMDQwLCAweDI1YWIsIDB4MjAwOSwgMHgzNTJiLCAweDIwMGIsCisJMHgwMDBiLCAweDcwYTMsIDB4MDAwMSwgMHg3ODFiLCAweDAwNDYsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsCisJMHgwMGRkLCAweDAwNzgsIDB4MWJmNywgMHgyMDA5LCAweDM1MmIsIDB4MjAwYiwgMHgwMDBhLCAweDAwNzgsCisJMHgxYmY3LCAweDEwNzgsIDB4MWJhNSwgMHgyMzAwLCAweDAwNzksIDB4MjViNiwgMHgyNWI5LCAweDI1YmIsCisJMHgyNWRlLCAweDEwNzgsIDB4MWJhNSwgMHg3MDAwLCAweDAwNzksIDB4MjViZSwgMHgyNWM2LCAweDI1YzgsCisJMHgyNWM4LCAweDI1ZDMsIDB4MjVjOCwgMHgyNWRhLCAweDI1YzYsIDB4MjVjNiwgMHgxMDc4LCAweDFiYTUsCisJMHhhNjg0LCAweDIwMDAsIDB4MDBjMCwgMHgyNWQzLCAweGE2YjUsIDB4MjAwMCwgMHg3ZTVhLCAweDEwNzgsCisJMHgzMGYwLCAweDAwNzgsIDB4MmQzMCwgMHg2ODE0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDI1ZGEsCisJMHg2ODE3LCAweDAwMDcsIDB4NzgxYiwgMHgwMGU0LCAweDAwNzgsIDB4MWJmNywgMHg2ODFjLCAweGEwODUsCisJMHgwMDA0LCAweDY4MWUsIDB4YTZiNSwgMHgwODAwLCAweDEwNzgsIDB4MmI4OSwgMHg3ODFiLCAweDAwNjksCisJMHgwMDc4LCAweDFiZjcsIDB4MjMwMCwgMHgwMDc5LCAweDI1ZWQsIDB4MjVmMCwgMHgyNWYyLCAweDI1ZjQsCisJMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgxYmE1LCAweGE2ODQsIDB4MDQwMCwgMHgwMGMwLCAweDI2MTMsCisJMHg3ODJiLCAweDMwMDksIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsCisJMHg3ODVhLCAweDc5ZTQsIDB4YTE4NCwgMHgwMDIwLCAweDAwNDAsIDB4MjYwYiwgMHg3OGVjLCAweGEwODQsCisJMHgwMDAzLCAweDAwYzAsIDB4MjYwZiwgMHgyMDAxLCAweDAwMTQsIDB4MDA3OCwgMHgyMmZhLCAweGExODQsCisJMHgwMDA3LCAweDAwNzksIDB4MjY0YiwgMHg3YTkwLCAweGEyOTQsIDB4MDAwNywgMHg3ODliLCAweDAwNjAsCisJMHg3OWE4LCAweDgxZmYsIDB4MDA0MCwgMHgyNjQ5LCAweDc4OWIsIDB4MDAxMCwgMHg3YmE4LCAweGEzODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MjYzYSwgMHg3YmE4LCAweDdiYTgsIDB4YTM4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgyNjJkLCAweDIwMDksIDB4ZmZmNywgMHgwMDc4LCAweDI2MzMsIDB4YTM4NiwgMHgwMDAzLCAweDAwYzAsCisJMHgyNjNhLCAweDIwMDksIDB4ZmZlZiwgMHgwYzdlLCAweDcwNDgsIDB4MjA2MCwgMHg2MDA0LCAweGExMDQsCisJMHg2MDA2LCAweDBjN2YsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHhhNjg0LCAweGZmZmIsCisJMHg3ODVhLCAweDc4MmIsIDB4MzAwOSwgMHg2OTFjLCAweGExOGMsIDB4ZmRmZiwgMHhhMThjLCAweGZlZmYsCisJMHg2OTFlLCAweDAwNzgsIDB4MmQzMCwgMHgyMDIzLCAweDIwMjksIDB4MjY1NSwgMHgyNjVkLCAweDI2NTMsCisJMHgyNjUzLCAweDI2NTMsIDB4MmQzMCwgMHgxMDc4LCAweDFiYTUsIDB4NjkxYywgMHhhMThjLCAweGZkZmYsCisJMHhhMThjLCAweGZlZmYsIDB4NjkxZSwgMHgwMDc4LCAweDJkMzgsIDB4NjkxYywgMHhhMThjLCAweGZkZmYsCisJMHhhMThjLCAweGZlZmYsIDB4NjkxZSwgMHgwMDc4LCAweDJkMzAsIDB4NzllNCwgMHhhMTg0LCAweDAwMzAsCisJMHgwMDQwLCAweDI2NmYsIDB4NzhlYywgMHhhMDg0LCAweDAwMDMsIDB4MDBjMCwgMHgyNjc3LCAweDY4MTQsCisJMHhhMDg1LCAweDgwMDAsIDB4NjgxNiwgMHgyMDAxLCAweDAwMTQsIDB4MDA3OCwgMHgyMmZhLCAweGExODQsCisJMHgwMDA3LCAweDAwNzksIDB4MjY3YiwgMHgyZDMwLCAweDJkMzAsIDB4MjY4MywgMHgyZDMwLCAweDJkNTgsCisJMHgyZDU4LCAweDJkMzAsIDB4MmQzMCwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyNmI0LCAweDY4MWMsCisJMHhhMDg0LCAweDAwMDEsIDB4MDA0MCwgMHgyZDM4LCAweGE2OGMsIDB4MjA2MCwgMHhhMThjLCAweGZmZmIsCisJMHg3OTVhLCAweDY5YjIsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwMCwgMHg3ODliLCAweDAwNjEsCisJMHg2ODE0LCAweGEwODUsIDB4ODAwMCwgMHg2ODE2LCAweDc4YWEsIDB4MTU3ZSwgMHgxMzdlLCAweDE0N2UsCisJMHgyMGExLCAweDAxMmMsIDB4Nzg5YiwgMHgwMDAwLCAweDgwMDAsIDB4ODBhYywgMHhhZDgwLCAweDAwMGEsCisJMHgyMDk4LCAweDUzYTYsIDB4MTQ3ZiwgMHgxMzdmLCAweDE1N2YsIDB4NjgxMCwgMHg4MDA3LCAweDc4OWIsCisJMHgwMDdlLCAweDc4YWEsIDB4MDA3OCwgMHgyZDM4LCAweDY4MTQsIDB4YTA4NCwgMHg4MDAwLCAweDAwNDAsCisJMHgyNmJiLCAweDY4MTcsIDB4MDAwOCwgMHg3ODFiLCAweDAwZDgsIDB4MDA3OCwgMHgxYmY3LCAweDIzMDAsCisJMHgwMDc5LCAweDI2YzIsIDB4MjZjNywgMHgyNzQyLCAweDI2YzUsIDB4MTA3OCwgMHgxYmE1LCAweDcwMDAsCisJMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgyNmNjLCAweDI2ZDQsIDB4MjZkNiwgMHgyNmYyLCAweDI2ZDQsCisJMHgyNmQ0LCAweDI0ZDIsIDB4MjZkNCwgMHgyNmQ0LCAweDEwNzgsIDB4MWJhNSwgMHg2OTFjLCAweGExOGQsCisJMHgwMDAxLCAweDY5MWUsIDB4NjgwMCwgMHg2MDA2LCAweGEwMDUsIDB4MDBjMCwgMHgyNmUwLCAweDYwMDIsCisJMHg2ODE4LCAweGEwODQsIDB4MDAwZSwgMHgwMDQwLCAweDI2ZWMsIDB4NzAxNCwgMHg2OGI2LCAweDcxMmMsCisJMHhhMTg4LCAweDNlODAsIDB4MDA3OCwgMHgyNmVlLCAweDIwMDksIDB4M2Y4MCwgMHgyMTA0LCAweDY4MDIsCisJMHgyZDBhLCAweDcxNTYsIDB4NmViMiwgMHhhNjg0LCAweDAwNjAsIDB4MDA0MCwgMHgyNzQwLCAweGE2ODQsCisJMHgwODAwLCAweDAwYzAsIDB4MjcwNCwgMHhhNjg0LCAweDdmZmYsIDB4NjhiMiwgMHg2ODkwLCAweDY4OTQsCisJMHgxMDc4LCAweDJlYzcsIDB4MDA3OCwgMHgyNzQwLCAweGE2ODQsIDB4MDAyMCwgMHgwMDQwLCAweDI3MTYsCisJMHhhMDA2LCAweDEwNzgsIDB4MzE5NCwgMHg3OGQwLCAweDgwMDMsIDB4MDBjOCwgMHgyNzEyLCAweDc4ZDQsCisJMHgxMDc4LCAweDMxZjksIDB4NzlkOCwgMHg3YWRjLCAweDAwNzgsIDB4MjcxYSwgMHgxMDc4LCAweDJjYWUsCisJMHgxMDc4LCAweDMxOTQsIDB4YTY4NCwgMHg4MDAwLCAweDAwNDAsIDB4Mjc0MCwgMHhhNjg0LCAweDdmZmYsCisJMHg2OGIyLCAweDc4OWIsIDB4MDA3NCwgMHgxMDc4LCAweDJkN2MsIDB4MjAxMCwgMHgxMDc4LCAweDJkN2MsCisJMHgyMDA4LCAweGE2ODQsIDB4MDAyMCwgMHgwMGMwLCAweDI3MzgsIDB4MTA3OCwgMHgyZDdjLCAweDgwMWIsCisJMHgwMGM4LCAweDI3MzMsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsIDB4YTEwOCwgMHhhMjkxLCAweDAwMDAsCisJMHg2Yjk0LCAweDIxMDAsIDB4YTMwMiwgMHg2OGFlLCAweDZiOTAsIDB4MjIwMCwgMHhhMzAzLCAweDY4YWEsCisJMHgwMDc4LCAweDFiZmYsIDB4MDA3OCwgMHgyYjc2LCAweDcwMzMsIDB4MDAwMCwgMHhhMjgyLCAweDAwMDUsCisJMHgwMDUwLCAweDI3NGMsIDB4MTA3OCwgMHgxYmE1LCAweDIzMDAsIDB4MDA3OSwgMHgyNzRmLCAweDI3NTIsCisJMHgyNzVjLCAweDI3N2YsIDB4MjIwMCwgMHgwMDc5LCAweDI3NTUsIDB4Mjc1YSwgMHgyYjc2LCAweDI3NWEsCisJMHgyN2E4LCAweDI3ZjksIDB4MTA3OCwgMHgxYmE1LCAweDcwMDAsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsCisJMHgyNzY5LCAweDEwNzgsIDB4MjhlZiwgMHgxMDc4LCAweDJlYzcsIDB4NzAzNCwgMHg2MDBhLCAweDAwNzgsCisJMHgyNzZlLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsIDB4Mjc2MywgMHg3MDAzLCAweDAwMDUsCisJMHgyMDAxLCAweDNmOTAsIDB4MjA2OCwgMHg3MDNlLCAweDcwMzIsIDB4MjIwMCwgMHgwMDc5LCAweDI3NzgsCisJMHgyYjc2LCAweDI3N2QsIDB4MjdhOCwgMHgyNzdkLCAweDJiNzYsIDB4MTA3OCwgMHgxYmE1LCAweDcwMDAsCisJMHhhMDg2LCAweDAwMDEsIDB4MDBjMCwgMHgyNzhjLCAweDEwNzgsIDB4MjhlZiwgMHgxMDc4LCAweDJlYzcsCisJMHg3MDM0LCAweDYwMGEsIDB4MDA3OCwgMHgyNzkxLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAzLCAweDAwNDAsCisJMHgyNzg2LCAweDcwMDMsIDB4MDAwNSwgMHgyMDAxLCAweDNmOTAsIDB4MjA2OCwgMHg3MDNlLCAweDcwMzIsCisJMHgyMjAwLCAweDAwNzksIDB4Mjc5YiwgMHgyN2EyLCAweDI3YTAsIDB4MjdhMiwgMHgyN2EwLCAweDI3YTIsCisJMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgyYjk5LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsCisJMHg3MDAwLCAweGEwODYsIDB4MDAwMSwgMHgwMGMwLCAweDI3YjUsIDB4MTA3OCwgMHgyOGVmLCAweDEwNzgsCisJMHgyZWM3LCAweDcwMzQsIDB4NjAwYSwgMHgwMDc4LCAweDI3YmEsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMDQwLCAweDI3YWYsIDB4NzAwMywgMHgwMDAyLCAweDdhODAsIDB4YTI5NCwgMHgwZjAwLCAweDc4OWIsCisJMHgwMDE4LCAweDdjYTgsIDB4YTQ4NCwgMHgwMDA3LCAweGEyMTUsIDB4MjA2OSwgMHgzZjgwLCAweDJkMDQsCisJMHgyZDA4LCAweDcxNTYsIDB4MjA2OCwgMHhhMDA1LCAweDAwNDAsIDB4MjdkNSwgMHg2ODEwLCAweGEyMDYsCisJMHgwMDQwLCAweDI3ZWUsIDB4NjgwMCwgMHgwMDc4LCAweDI3YzgsIDB4NzAwMywgMHgwMDA1LCAweDIwMDEsCisJMHgzZjkwLCAweDIwNjgsIDB4NzAzZSwgMHg3MDMyLCAweDE1N2UsIDB4MjBhOSwgMHgwMDJmLCAweDIwMDMsCisJMHgwMDAwLCAweDgwMDAsIDB4MDA3MCwgMHgyN2U2LCAweDAwNzgsIDB4MjdkZiwgMHgxNTdmLCAweDZhMTIsCisJMHg2OGIzLCAweDA3MDAsIDB4NjgxZiwgMHgwODAwLCAweDY4MjMsIDB4MDAwMywgMHg2ZWIwLCAweDdlNWEsCisJMHg2ODFjLCAweGEwODQsIDB4MGMwMCwgMHgwMDQwLCAweDI4NGYsIDB4MTA3OCwgMHgyYjkxLCAweDAwNzgsCisJMHgyODRmLCAweDcwMDAsIDB4YTA4NiwgMHgwMDAxLCAweDAwYzAsIDB4MjgwNiwgMHgxMDc4LCAweDI4ZWYsCisJMHgxMDc4LCAweDJlYzcsIDB4NzAzNCwgMHg2MDBhLCAweDAwNzgsIDB4MjgwYiwgMHg3MDAwLCAweGEwODYsCisJMHgwMDAzLCAweDAwNDAsIDB4MjgwMCwgMHg3MDAzLCAweDAwMDIsIDB4N2E4MCwgMHhhMjk0LCAweDBmMDAsCisJMHg3ODliLCAweDAwMTgsIDB4N2NhOCwgMHhhNDg0LCAweDAwMDcsIDB4YTIxNSwgMHg3OWE4LCAweDc5YTgsCisJMHhhMThjLCAweDAwZmYsIDB4YTFlOCwgMHgzZTgwLCAweDJkMDQsIDB4MmQwOCwgMHg3MTU2LCAweDIwNjgsCisJMHhhMDA1LCAweDAwNDAsIDB4MjgyYSwgMHg2ODEwLCAweGEyMDYsIDB4MDA0MCwgMHgyODQzLCAweDY4MDAsCisJMHgwMDc4LCAweDI4MWQsIDB4NzAwMywgMHgwMDA1LCAweDIwMDEsIDB4M2Y5MCwgMHgyMDY4LCAweDcwM2UsCisJMHg3MDMyLCAweDE1N2UsIDB4MjBhOSwgMHgwMDJmLCAweDIwMDMsIDB4MDAwMCwgMHg4MDAwLCAweDAwNzAsCisJMHgyODNiLCAweDAwNzgsIDB4MjgzNCwgMHgxNTdmLCAweDZhMTIsIDB4NjhiMywgMHgwNzAwLCAweDY4MWYsCisJMHgwODAwLCAweDY4MjMsIDB4MDAwMywgMHg2ZWIwLCAweDdlNWEsIDB4NjgxYywgMHhhMDg0LCAweDBjMDAsCisJMHgwMDQwLCAweDI4NGYsIDB4MTA3OCwgMHgyYjhkLCAweDdlNTgsIDB4MDA3OCwgMHgyODRmLCAweDAyN2UsCisJMHg4MjA3LCAweGEwODQsIDB4MDAwZiwgMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMDgwLCAweDM2MDAsCisJMHgyMDYwLCAweDcwNGEsIDB4NjAwMCwgMHg3MDRlLCAweDYwMDQsIDB4NzA1MiwgMHhhNjg0LCAweDAwNjAsCisJMHgwMDQwLCAweDI4ODYsIDB4NmI5NCwgMHg2YzkwLCAweDY5YTgsIDB4NjhhYywgMHhhMTA1LCAweDAwYzAsCisJMHgyODc0LCAweDdiZDIsIDB4N2JkYSwgMHg3Y2Q2LCAweDdjZGUsIDB4YTZiNCwgMHhiN2ZmLCAweDdlNWEsCisJMHgxMDc4LCAweDMwZjAsIDB4MDA3OCwgMHgyODg2LCAweDY4YWMsIDB4YTMxYSwgMHgyMTAwLCAweGE0MjMsCisJMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwgMHgyODg2LCAweDdiZDIsIDB4N2JkYSwgMHg3Y2Q2LCAweDdjZGUsCisJMHg2OGFjLCAweGE2YjQsIDB4YmZmZiwgMHg3ZTVhLCAweDEwNzgsIDB4MzExZCwgMHgwNzdmLCAweDEwNzgsCisJMHgyY2ExLCAweDIwMDksIDB4MDA2YSwgMHhhNjg0LCAweDAwMDgsIDB4MDA0MCwgMHgyODkxLCAweDIwMDksCisJMHgwMDY5LCAweGE2YjUsIDB4MjAwMCwgMHg3ZTVhLCAweDc5MWEsIDB4MmQwMCwgMHg3MDNlLCAweDgyMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHgzNjAwLCAweDIwNDgsCisJMHgwMDc4LCAweDFiZjcsIDB4NjAyMCwgMHhhMDA1LCAweDAwNDAsIDB4MjhhZSwgMHg4MDAxLCAweDYwMjIsCisJMHg2MDA4LCAweGEwODUsIDB4MDAwOCwgMHg2MDBhLCAweDcwMTAsIDB4NjAyNiwgMHgwMDdjLCAweGEwMDYsCisJMHgxMDc4LCAweDJlYzcsIDB4NjgxMywgMHgwMDAwLCAweDY4MTcsIDB4MDAwMSwgMHg2ODFmLCAweDAwNDAsCisJMHg2ODFiLCAweDAxMDAsIDB4NzAwMCwgMHhhMDg0LCAweDAwMDcsIDB4MDA3OSwgMHgyOGJmLCAweDI4YzcsCisJMHgyOGM5LCAweDI4YzksIDB4MjhkNSwgMHgyOGQxLCAweDI4YzcsIDB4MjhjNywgMHgyOGM3LCAweDEwNzgsCisJMHgxYmE1LCAweDEwNzgsIDB4MjhlMCwgMHgxMDc4LCAweDI4ZDksIDB4MTA3OCwgMHgxN2RkLCAweDAwNzgsCisJMHgxYmZmLCAweDcwYTMsIDB4MDAwMCwgMHgwMDc4LCAweDFiZmYsIDB4NjgxNywgMHgwMDAwLCAweDAwNzgsCisJMHgyNTA4LCAweDY4MDAsIDB4YTAwNSwgMHgwMGMwLCAweDI4ZGUsIDB4NjAwMiwgMHg2MDA2LCAweDAwN2MsCisJMHg2MDEwLCAweGEwMDUsIDB4MDA0MCwgMHgyOGU5LCAweDgwMDEsIDB4MDBkMCwgMHgyOGU5LCAweDEwNzgsCisJMHgxYmE1LCAweDYwMTIsIDB4NjAwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjAwYSwgMHgwMDdjLCAweDYwMTgsCisJMHhhMDA1LCAweDAwNDAsIDB4MjhmNSwgMHg4MDAxLCAweDYwMWEsIDB4MDA3YywgMHgxMDc4LCAweDJkNzcsCisJMHg2ODE3LCAweDAwMTgsIDB4MDA3OCwgMHgyOTI2LCAweDEwNzgsIDB4MmQ3NywgMHg2ODE3LCAweDAwMTksCisJMHgwMDc4LCAweDI5MjYsIDB4MTA3OCwgMHgyZDc3LCAweDY4MTcsIDB4MDAxYSwgMHgwMDc4LCAweDI5MjYsCisJMHg3N2I0LCAweDEwNzgsIDB4MmNhMSwgMHg3MWI4LCAweGExOGMsIDB4MDBmZiwgMHhhMWU4LCAweDNlODAsCisJMHgyZDA0LCAweDJkMDgsIDB4MjA2OCwgMHhhMDA1LCAweDAwYzAsIDB4MjkxOCwgMHgwMDc4LCAweDFiZmYsCisJMHg2ODEwLCAweDcyYjQsIDB4YTIwNiwgMHgwMDQwLCAweDI5MjAsIDB4NjgwMCwgMHgwMDc4LCAweDI5MTEsCisJMHg2ODAwLCAweDIwMGEsIDB4NjgxNywgMHgwMDA1LCAweDcwYmYsIDB4MDAwMCwgMHgxMDc4LCAweDI4ZTAsCisJMHg2ODFjLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDI5MmYsIDB4MTA3OCwgMHgyOGQ5LCAweDEwNzgsCisJMHgyOGVmLCAweDY4MWIsIDB4MDAwMCwgMHg2ODFmLCAweDAwMjAsIDB4MTA3OCwgMHgxN2RkLCAweDAwNzgsCisJMHgxYmZmLCAweGEyODIsIDB4MDAwMywgMHgwMGMwLCAweDJiNmEsIDB4N2RhOCwgMHhhNWFjLCAweDAwZmYsCisJMHg3ZWE4LCAweGE2YjQsIDB4MDBmZiwgMHg2OTFjLCAweGExOGQsIDB4MDA4MCwgMHg2OTFlLCAweGExODQsCisJMHgwMTAwLCAweDAwNDAsIDB4Mjk5OSwgMHhhMThjLCAweGZlZmYsIDB4NjkxZSwgMHhhNmI0LCAweDAwZmYsCisJMHgwMDQwLCAweDI5ODMsIDB4YTY4MiwgMHgwMDBmLCAweDAwNDgsIDB4Mjk1YSwgMHgwMDQwLCAweDI5NWEsCisJMHgyMDMxLCAweDAwMGYsIDB4ODUyYiwgMHg4NTJiLCAweDEwNzgsIDB4MmMyNCwgMHgwMDQwLCAweDI5NjQsCisJMHgxMDc4LCAweDJhMzMsIDB4MDA3OCwgMHgyOThjLCAweDEwNzgsIDB4MmJkZiwgMHgwYzdlLCAweDI5NjAsCisJMHg2MDA0LCAweGEwODQsIDB4ZmZmNSwgMHg2MDA2LCAweDEwNzgsIDB4MmE1NywgMHgwYzdmLCAweDY5MWMsCisJMHhhMThkLCAweDAxMDAsIDB4NjkxZSwgMHg3ZTU4LCAweGE2YjUsIDB4MDAwNCwgMHg3ZTVhLCAweGE2ODQsCisJMHgwNDAwLCAweDAwYzAsIDB4Mjk3ZiwgMHg3ODFiLCAweDAwNTUsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsCisJMHgwMDY5LCAweDAwNzgsIDB4MWJmNywgMHgwYzdlLCAweDI5NjAsIDB4NjAwNCwgMHhhMDg0LCAweGZmZjUsCisJMHg2MDA2LCAweDEwNzgsIDB4MmE1NywgMHgwYzdmLCAweDdlNTgsIDB4YTY4NCwgMHgwNDAwLCAweDAwYzAsCisJMHgyOTk1LCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDFiZjcsIDB4NzgxYiwgMHgwMDZhLCAweDAwNzgsCisJMHgxYmY3LCAweDBjN2UsIDB4NzA0OCwgMHgyMDYwLCAweDYxMDAsIDB4YTE4YywgMHgxMDAwLCAweDAwNDAsCisJMHgyOWQ5LCAweDYyMDgsIDB4ODIxNywgMHhhMjk0LCAweDAwZmYsIDB4YTI4MiwgMHgwMDBmLCAweDAwNDgsCisJMHgyOWFkLCAweDAwNDAsIDB4MjlhZCwgMHgyMDExLCAweDAwMGYsIDB4MjYwMCwgMHhhMjAyLCAweDAwYzgsCisJMHgyOWIyLCAweDIyMzAsIDB4NjIwOCwgMHhhMjk0LCAweDAwZmYsIDB4NzAxOCwgMHhhMDg2LCAweDAwMjgsCisJMHgwMGMwLCAweDI5YzIsIDB4YTI4MiwgMHgwMDE5LCAweDAwYzgsIDB4MjljOCwgMHgyMDExLCAweDAwMTksCisJMHgwMDc4LCAweDI5YzgsIDB4YTI4MiwgMHgwMDBjLCAweDAwYzgsIDB4MjljOCwgMHgyMDExLCAweDAwMGMsCisJMHgyMjAwLCAweGE1MDIsIDB4MDBjOCwgMHgyOWNkLCAweDIyMjgsIDB4MTA3OCwgMHgyYmUzLCAweDg1MmIsCisJMHg4NTJiLCAweDEwNzgsIDB4MmMyNCwgMHgwMDQwLCAweDI5ZDksIDB4MTA3OCwgMHgyYTMzLCAweDAwNzgsCisJMHgyOWRkLCAweDEwNzgsIDB4MmJkZiwgMHgxMDc4LCAweDJhNTcsIDB4Nzg1OCwgMHhhMDg1LCAweDAwMDQsCisJMHg3ODVhLCAweDBjN2YsIDB4NzgxYiwgMHgwMDY5LCAweDAwNzgsIDB4MWJmNywgMHgwYzdlLCAweDI5NjAsCisJMHg2MDAwLCAweGEwODQsIDB4MTAwMCwgMHgwMGMwLCAweDJhMDEsIDB4NjAxMCwgMHhhMDg0LCAweDAwMGYsCisJMHgwMGMwLCAweDI5ZmIsIDB4YTE4YywgMHgwMDAyLCAweDAwYzAsIDB4MjlmYiwgMHhhMThjLCAweGZmZjUsCisJMHg2MTA2LCAweDBjN2YsIDB4MDA3YywgMHgyMDExLCAweDAwMzIsIDB4MjAxOSwgMHgwMDAwLCAweDAwNzgsCisJMHgyYTIzLCAweDYyMDgsIDB4YTI5NCwgMHgwMGZmLCAweDcwMTgsIDB4YTA4NiwgMHgwMDI4LCAweDAwYzAsCisJMHgyYTExLCAweGEyODIsIDB4MDAxOSwgMHgwMGM4LCAweDJhMTcsIDB4MjAxMSwgMHgwMDE5LCAweDAwNzgsCisJMHgyYTE3LCAweGEyODIsIDB4MDAwYywgMHgwMGM4LCAweDJhMTcsIDB4MjAxMSwgMHgwMDBjLCAweDYzMDgsCisJMHg4MzFmLCAweGEzOWMsIDB4MDBmZiwgMHhhMzgyLCAweDAwMGYsIDB4MDA0OCwgMHgyYTIzLCAweDAwNDAsCisJMHgyYTIzLCAweDIwMTksIDB4MDAwZiwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAzLCAweDc4YWIsCisJMHgwMDAxLCAweDdhYWEsIDB4N2JhYSwgMHhhOGMwLCAweDAwMDUsIDB4NjgxYywgMHhhMDg1LCAweDAxMDAsCisJMHg2ODFlLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDcxNDgsIDB4MjE2MCwgMHgyMDA4LCAweGEwODQsCisJMHhmZmYwLCAweGE2MzUsIDB4N2U4NiwgMHg2MDE4LCAweDc4OWEsIDB4N2VhZSwgMHg2NjEyLCAweDc4YTQsCisJMHhhMDg0LCAweGZmZjgsIDB4YTE4YywgMHgwMDA3LCAweGExMDUsIDB4NzhhNiwgMHg2MDE2LCAweDc4OGEsCisJMHhhNmI0LCAweDAwMGYsIDB4ODYzNywgMHg4MjA0LCAweDgwMDQsIDB4YTA4NCwgMHgwMGZmLCAweGE2MDUsCisJMHg2MDBlLCAweDYwMDQsIDB4YTA4NCwgMHhmZmY1LCAweDYwMDYsIDB4MGM3ZiwgMHgwMDdjLCAweDBjN2UsCisJMHg3MDQ4LCAweDIwNjAsIDB4NjAxOCwgMHg3ODlhLCAweDc4YTQsIDB4YTA4NCwgMHhmZmYwLCAweDc4YTYsCisJMHg2MDEyLCAweDc4ODQsIDB4YTA4NCwgMHhmZmYwLCAweDc4ODYsIDB4MGM3ZiwgMHgwMDdjLCAweGEyODIsCisJMHgwMDAyLCAweDAwYzAsIDB4MmI2YSwgMHg3YWE4LCAweDY5MWMsIDB4YTE4ZCwgMHgwMDgwLCAweDY5MWUsCisJMHhhMTg0LCAweDAyMDAsIDB4MDA0MCwgMHgyYWFjLCAweGExOGMsIDB4ZmRmZiwgMHg2OTFlLCAweGEyOTQsCisJMHgwMGZmLCAweGEyODIsIDB4MDAwMiwgMHgwMGM4LCAweDJiNmEsIDB4MTA3OCwgMHgyYWYzLCAweDEwNzgsCisJMHgyYTU3LCAweGE5ODAsIDB4MDAwMSwgMHgyMDBjLCAweDEwNzgsIDB4MmM5ZCwgMHgxMDc4LCAweDI5ZTYsCisJMHg4OGZmLCAweDAwNDAsIDB4MmE5ZiwgMHg3ODliLCAweDAwNjAsIDB4MjgwMCwgMHg3OGFhLCAweDdlNTgsCisJMHhhNmI1LCAweDAwMDQsIDB4N2U1YSwgMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyYTliLCAweDc4MWIsCisJMHgwMDU1LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LCAweDdlNTgsCisJMHhhNjg0LCAweDA0MDAsIDB4MDBjMCwgMHgyYWE4LCAweDc4MWIsIDB4MDA1OCwgMHgwMDc4LCAweDFiZjcsCisJMHg3ODFiLCAweDAwNmEsIDB4MDA3OCwgMHgxYmY3LCAweGEyODIsIDB4MDAwMiwgMHgwMGM4LCAweDJhYjQsCisJMHhhMjg0LCAweDAwMDEsIDB4MDA0MCwgMHgyYWJlLCAweDcxNDgsIDB4YTE4OCwgMHgwMDAwLCAweDIxMGMsCisJMHhhMThjLCAweDIwMDAsIDB4MDBjMCwgMHgyYWJlLCAweDIwMTEsIDB4MDAwMCwgMHgxMDc4LCAweDJiZDEsCisJMHgxMDc4LCAweDJhZjMsIDB4MTA3OCwgMHgyYTU3LCAweDc4NTgsIDB4YTA4NSwgMHgwMDA0LCAweDc4NWEsCisJMHg3ODFiLCAweDAwNjksIDB4MDA3OCwgMHgxYmY3LCAweDBjN2UsIDB4MDI3ZSwgMHgyOTYwLCAweDYwMDAsCisJMHgyMDExLCAweDAwMDEsIDB4YTA4NCwgMHgyMDAwLCAweDAwYzAsIDB4MmFlMywgMHg2MDE0LCAweGEwODQsCisJMHgwMDQwLCAweDAwYzAsIDB4MmFlMSwgMHhhMThjLCAweGZmZWYsIDB4NjEwNiwgMHhhMDA2LCAweDAwNzgsCisJMHgyYWYwLCAweDIwMTEsIDB4MDAwMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAyLCAweDc4YWIsCisJMHgwMDAzLCAweDdhYWEsIDB4YThjMCwgMHgwMDA0LCAweDY4MWMsIDB4YTA4NSwgMHgwMjAwLCAweDY4MWUsCisJMHgwMjdmLCAweDBjN2YsIDB4MDA3YywgMHgwYzdlLCAweDcwNDgsIDB4MjA2MCwgMHg4MmZmLCAweDAwNDAsCisJMHgyYWZiLCAweDIwMTEsIDB4MDA0MCwgMHg2MDE4LCAweGEwODAsIDB4MDAwMiwgMHg3ODlhLCAweDc4YTQsCisJMHhhMDg0LCAweGZmYmYsIDB4YTIwNSwgMHg3OGE2LCAweDYwMTYsIDB4Nzg4YSwgMHg2MDA0LCAweGEwODQsCisJMHhmZmVmLCAweDYwMDYsIDB4MGM3ZiwgMHgwMDdjLCAweDAwN2UsIDB4NzAwMCwgMHhhMDg2LCAweDAwMDMsCisJMHgwMDQwLCAweDJiMTUsIDB4MDA3ZiwgMHgwMDc4LCAweDJiMTgsIDB4MDA3ZiwgMHgwMDc4LCAweDJiNjYsCisJMHhhNjg0LCAweDAwMjAsIDB4MDA0MCwgMHgyYjY2LCAweDc4ODgsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsCisJMHgyYjY2LCAweDc4YTgsIDB4ODAwMSwgMHgwMDQwLCAweDJiMjUsIDB4N2JiOCwgMHhhMzg0LCAweDAwM2YsCisJMHg4MzFiLCAweDAwYzgsIDB4MmIyYywgMHg4MDAwLCAweGEwMDUsIDB4MDA0MCwgMHgyYjRkLCAweDgzMWIsCisJMHgwMGM4LCAweDJiMzUsIDB4ODAwMSwgMHgwMDQwLCAweDJiNjIsIDB4YTAwNiwgMHgxMDc4LCAweDMxOTQsCisJMHg3OGI0LCAweDEwNzgsIDB4MzFmOSwgMHgwMDc4LCAweDJiNjYsIDB4YTY4NCwgMHg0MDAwLCAweDAwNDAsCisJMHgyYjRkLCAweDc4YjgsIDB4ODAxYiwgMHgwMGM4LCAweDJiNDYsIDB4ODAwMCwgMHhhMDg0LCAweDAwM2YsCisJMHgwMGMwLCAweDJiNjIsIDB4YTZiNCwgMHhiZmZmLCAweDdlNWEsIDB4NzlkOCwgMHg3YWRjLCAweDIwMDEsCisJMHgwMDAxLCAweGExMDgsIDB4MDBjOCwgMHgyYjU2LCAweGEyOTEsIDB4MDAwMCwgMHg3OWQyLCAweDc5ZGEsCisJMHg3YWQ2LCAweDdhZGUsIDB4MTA3OCwgMHgzMTk0LCAweDc4MWIsIDB4MDA2NywgMHgxMDc4LCAweDMwNWUsCisJMHgwMDc4LCAweDFiZjcsIDB4NzgxYiwgMHgwMDY3LCAweDAwNzgsIDB4MWJmNywgMHg3ODFiLCAweDAwNmEsCisJMHgwMDc4LCAweDFiZjcsIDB4MTA3OCwgMHgyYjlkLCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsCisJMHgxMDc4LCAweDJiODksIDB4NzgxYiwgMHgwMDY5LCAweDAwNzgsIDB4MWJmNywgMHg2ODIzLCAweDAwMDIsCisJMHgxMDc4LCAweDJiOTEsIDB4NjkxYywgMHhhMThkLCAweDAwMjAsIDB4NjkxZSwgMHg2ODE0LCAweGEwODQsCisJMHg4MDAwLCAweDAwNDAsIDB4MmI4NSwgMHg2ODE3LCAweDAwMDUsIDB4NzgxYiwgMHgwMDY5LCAweDAwNzgsCisJMHgxYmY3LCAweDIwMDEsIDB4MDAwNSwgMHgwMDc4LCAweDJiOWYsIDB4MjAwMSwgMHgwMDBjLCAweDAwNzgsCisJMHgyYjlmLCAweDIwMDEsIDB4MDAwNiwgMHgwMDc4LCAweDJiOWYsIDB4MjAwMSwgMHgwMDBkLCAweDAwNzgsCisJMHgyYjlmLCAweDIwMDEsIDB4MDAwOSwgMHgwMDc4LCAweDJiOWYsIDB4MjAwMSwgMHgwMDA3LCAweDc4OWIsCisJMHgwMDdmLCAweDc4YWEsIDB4YTZiNSwgMHgwMDA4LCAweDdlNWEsIDB4MDA3YywgMHgwNzdlLCAweDg3M2YsCisJMHhhN2JjLCAweDAwMGYsIDB4ODczYiwgMHg4NzNiLCAweDg3MDMsIDB4YTBlMCwgMHgzNjAwLCAweGE3YjgsCisJMHgwMDIwLCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LCAweDAwMGYsIDB4MDA0MCwgMHgyYmJmLCAweGExODQsCisJMHhmZmYwLCAweDc4YTYsIDB4NjAxMiwgMHg2MDA0LCAweGEwODUsIDB4MDAwOCwgMHg2MDA2LCAweDg3MzgsCisJMHg4NzM4LCAweDdmOWEsIDB4NzlhNCwgMHhhMTg0LCAweDAwNDAsIDB4MDA0MCwgMHgyYmNmLCAweGExODQsCisJMHhmZmJmLCAweDc4YTYsIDB4NjAxNiwgMHg2MDA0LCAweGEwODUsIDB4MDAxMCwgMHg2MDA2LCAweDA3N2YsCisJMHgwMDdjLCAweDc4OWIsIDB4MDAxMCwgMHg3OGFiLCAweDAwMDEsIDB4NzhhYiwgMHgwMDAyLCAweDc4YWIsCisJMHgwMDAzLCAweDdhYWEsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsIDB4MDAwNCwgMHgwMDdjLCAweDIwMzEsCisJMHgwMDAwLCAweDIwMjksIDB4MDAzMiwgMHg3ODliLCAweDAwMTAsIDB4NzhhYiwgMHgwMDAxLCAweDc4YWIsCisJMHgwMDAzLCAweDc4YWIsIDB4MDAwMSwgMHg3ZGFhLCAweDdlYWEsIDB4Nzg5YiwgMHgwMDYwLCAweDc4YWIsCisJMHgwMDA1LCAweDAwN2MsIDB4MTU3ZSwgMHg4MDA3LCAweGEwODQsIDB4MDBmZiwgMHg4MDAzLCAweDgwMDMsCisJMHhhMDgwLCAweDAwMjAsIDB4Nzg5YSwgMHg3OWE0LCAweGExOGMsIDB4ZmZmMCwgMHgyMDAxLCAweDM1NDYsCisJMHgyMDA0LCAweGEwODIsIDB4MDAyOCwgMHgwMDQwLCAweDJjMGQsIDB4MjAyMSwgMHgyYzg0LCAweDIwMTksCisJMHgwMDE0LCAweDIwYTksIDB4MDAwYywgMHgwMDc4LCAweDJjMTMsIDB4MjAyMSwgMHgyYzkwLCAweDIwMTksCisJMHgwMDE5LCAweDIwYTksIDB4MDAwZCwgMHgyMDExLCAweDAwNjQsIDB4MjQwNCwgMHhhMDg0LCAweGZmZjAsCisJMHhhMTA2LCAweDAwNDAsIDB4MmMyMiwgMHg4NDIwLCAweDIzMDAsIDB4YTIxMCwgMHgwMDcwLCAweDJjMjIsCisJMHgwMDc4LCAweDJjMTUsIDB4MTU3ZiwgMHgwMDdjLCAweDE1N2UsIDB4MjAxMSwgMHgzNTQ2LCAweDIyMTQsCisJMHhhMjgyLCAweDAwMzIsIDB4MDA0OCwgMHgyYzM4LCAweDAwNDAsIDB4MmMzYywgMHgyMDIxLCAweDJjNzYsCisJMHgyMDE5LCAweDAwMTEsIDB4MjBhOSwgMHgwMDBlLCAweDIwMTEsIDB4MDAzMiwgMHgwMDc4LCAweDJjNGMsCisJMHhhMjgyLCAweDAwMjgsIDB4MDA0MCwgMHgyYzQ0LCAweDIwMjEsIDB4MmM4NCwgMHgyMDE5LCAweDAwMTQsCisJMHgyMGE5LCAweDAwMGMsIDB4MDA3OCwgMHgyYzRhLCAweDIwMjEsIDB4MmM5MCwgMHgyMDE5LCAweDAwMTksCisJMHgyMGE5LCAweDAwMGQsIDB4MjAxMSwgMHgwMDY0LCAweDIyMDAsIDB4YTUwMiwgMHgwMDQwLCAweDJjNWMsCisJMHgwMDQ4LCAweDJjNWMsIDB4ODQyMCwgMHgyMzAwLCAweGEyMTAsIDB4MDA3MCwgMHgyYzU5LCAweDAwNzgsCisJMHgyYzRjLCAweDE1N2YsIDB4YTAwNiwgMHgwMDdjLCAweDE1N2YsIDB4YTU4MiwgMHgwMDY0LCAweDAwYzgsCisJMHgyYzY1LCAweDc4MDgsIDB4YTA4NSwgMHgwMDcwLCAweDc4MGEsIDB4NzhlYywgMHhhMDg0LCAweDAzMDAsCisJMHgwMDQwLCAweDJjNzMsIDB4MjQwNCwgMHhhMDllLCAweDEyMDEsIDB4MDBjMCwgMHgyYzczLCAweDIwMDEsCisJMHgyMTAxLCAweDAwNzgsIDB4MmM3NCwgMHgyNDA0LCAweGEwMDUsIDB4MDA3YywgMHgxMjAxLCAweDMwMDIsCisJMHgzMjAyLCAweDQyMDMsIDB4NDQwMywgMHg1NDA0LCAweDU2MDQsIDB4NjYwNSwgMHg2ODA1LCAweDc4MDYsCisJMHg3YTA2LCAweDBhMDcsIDB4MGMwNywgMHgwZTA3LCAweDMyMDIsIDB4NDIwMiwgMHg1MjAyLCAweDYyMDIsCisJMHg3MjAyLCAweDY2MDUsIDB4NzYwNSwgMHg3ODA1LCAweDdhMDUsIDB4N2MwNSwgMHg3ZTA1LCAweDdmMDUsCisJMHgyMjAyLCAweDMyMDIsIDB4NDIwMiwgMHg1MjAyLCAweDU0MDQsIDB4NjQwNCwgMHg3NDA0LCAweDc2MDQsCisJMHg3ODA0LCAweDdhMDQsIDB4N2MwNCwgMHg3ZTA0LCAweDdmMDQsIDB4Nzg5YiwgMHgwMDEwLCAweGEwNDYsCisJMHgwMDdjLCAweGE3ODQsIDB4MGYwMCwgMHg4MDBjLCAweGE3ODQsIDB4MDAwNywgMHg4MDAzLCAweDgwMDMsCisJMHg4MDAzLCAweDgwMDMsIDB4YTEwNSwgMHhhMGUwLCAweDM2ODAsIDB4MDA3YywgMHg3OWQ4LCAweDdhZGMsCisJMHg3OGQwLCAweDgwMWIsIDB4MDBjOCwgMHgyY2I1LCAweDgwMDAsIDB4YTA4NCwgMHgwMDNmLCAweGExMDgsCisJMHhhMjkxLCAweDAwMDAsIDB4MDA3YywgMHgwZjdlLCAweDIwNzksIDB4MDEwMCwgMHgyMDA5LCAweDM1NDAsCisJMHgyMDkxLCAweDgwMDAsIDB4MjEwNCwgMHgwMDc5LCAweDJjYzUsIDB4MmNmNywgMHgyY2NmLCAweDJjY2YsCisJMHgyY2NmLCAweDJjY2YsIDB4MmNjZiwgMHgyY2NkLCAweDJjY2QsIDB4MTA3OCwgMHgxYmE1LCAweDc4NGIsCisJMHgwMDA0LCAweDc4NDgsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MmNkMSwgMHg3ODRiLCAweDAwMDgsCisJMHg3ODQ4LCAweGEwODQsIDB4MDAwOCwgMHgwMGMwLCAweDJjZDgsIDB4NjhiMCwgMHhhMDg1LCAweDQwMDAsCisJMHg2OGIyLCAweDc4NTgsIDB4YTA4NSwgMHg0MDAwLCAweDc4NWEsIDB4NzgzMCwgMHhhMDg0LCAweDAwODAsCisJMHgwMGMwLCAweDJjZjcsIDB4MDAxOCwgMHgyY2Y3LCAweDY4MTgsIDB4YTA4NCwgMHgwMDIwLCAweDAwYzAsCisJMHgyY2Y1LCAweDc4MWIsIDB4MDBkZCwgMHgwMDc4LCAweDJjZjcsIDB4NzgxYiwgMHgwMGU0LCAweDIwOTEsCisJMHg4MDAxLCAweDBmN2YsIDB4MDA3YywgMHgwYzdlLCAweDY4MTAsIDB4ODAwNywgMHhhMDg0LCAweDAwMGYsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHhhMGUwLCAweDM2MDAsIDB4NjAwNCwgMHhhMDg0LCAweDAwMGEsCisJMHgwMGMwLCAweDJkMmUsIDB4NjEwOCwgMHhhMTk0LCAweGZmMDAsIDB4MDA0MCwgMHgyZDJlLCAweGExOGMsCisJMHgwMGZmLCAweDIwMDEsIDB4MDAxOSwgMHhhMTA2LCAweDAwNDAsIDB4MmQxZCwgMHgyMDAxLCAweDAwMzIsCisJMHhhMTA2LCAweDAwNDAsIDB4MmQyMSwgMHgwMDc4LCAweDJkMjUsIDB4MjAwOSwgMHgwMDIwLCAweDAwNzgsCisJMHgyZDI3LCAweDIwMDksIDB4MDAzZiwgMHgwMDc4LCAweDJkMjcsIDB4MjAxMSwgMHgwMDAwLCAweDIxMDAsCisJMHhhMjA1LCAweDYwMGEsIDB4NjAwNCwgMHhhMDg1LCAweDAwMDIsIDB4NjAwNiwgMHgwYzdmLCAweDAwN2MsCisJMHg3ODFiLCAweDAwNmEsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA2OSwgMHgwMDc4LCAweDFiZjcsCisJMHg3ODFiLCAweDAwNTgsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA1NSwgMHgwMDc4LCAweDFiZjcsCisJMHg3ODFiLCAweDAwZGQsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDBkYywgMHgwMDc4LCAweDFiZjcsCisJMHg3ODFiLCAweDAwZTQsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDBlMywgMHgwMDc4LCAweDFiZjcsCisJMHg3ODFiLCAweDAwOWUsIDB4MDA3OCwgMHgxYmY3LCAweDc4MWIsIDB4MDA5ZCwgMHgwMDc4LCAweDFiZjcsCisJMHg3MGEzLCAweDAwMDEsIDB4NzgxYiwgMHgwMDQ2LCAweDAwNzgsIDB4MWJmNywgMHgwMDdlLCAweDc4MzAsCisJMHhhMDg0LCAweDAwYzAsIDB4MDBjMCwgMHgyZDc1LCAweDc4MDgsIDB4YTA4NCwgMHhmZmZkLCAweDc4MGEsCisJMHgwMDA1LCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDIxLCAweDAwNDAsCisJMHgyZDc1LCAweDc4MDgsIDB4YTA4NSwgMHgwMDAyLCAweDc4MGEsIDB4MDA3ZiwgMHgwMDdjLCAweDc4MDgsCisJMHhhMDg1LCAweDAwMDIsIDB4NzgwYSwgMHgwMDdjLCAweDc4MzAsIDB4YTA4NCwgMHgwMDQwLCAweDAwYzAsCisJMHgyZDdjLCAweDAwOTgsIDB4MmQ4NSwgMHg3OGFjLCAweDAwN2MsIDB4NzgwOCwgMHhhMDg0LCAweGZmZmQsCisJMHg3ODBhLCAweDAwMDUsIDB4MDAwNSwgMHgwMDA1LCAweDAwMDUsIDB4NzhlYywgMHhhMDg0LCAweDAwMjEsCisJMHgwMDQwLCAweDJkOTQsIDB4MDA5OCwgMHgyZDkyLCAweDc4YWMsIDB4MDA3ZSwgMHg3ODA4LCAweGEwODUsCisJMHgwMDAyLCAweDc4MGEsIDB4MDA3ZiwgMHgwMDdjLCAweGE3ODQsIDB4MDA3MCwgMHgwMDQwLCAweDJkYTgsCisJMHgwYzdlLCAweDJkNjAsIDB4MmY2OCwgMHgxMDc4LCAweDFiNmIsIDB4MmQ3OCwgMHgyYzY4LCAweDBjN2YsCisJMHg2ODE3LCAweDAwMDMsIDB4Nzg1OCwgMHhhMDg0LCAweDNmMDAsIDB4NjgxYSwgMHg2ODJmLCAweDAwMDAsCisJMHg2ODJiLCAweDAwMDAsIDB4Nzg0YiwgMHgwMDA4LCAweDc4ZTQsIDB4YTAwNSwgMHgwMGQwLCAweDIwMTUsCisJMHhhMDg0LCAweDAwMjAsIDB4MDA0MCwgMHgyMDE1LCAweDc4ZWMsIDB4YTA4NCwgMHgwMDAzLCAweDAwNDAsCisJMHgyMDE1LCAweDAwMTgsIDB4MjAxNSwgMHgwMDc4LCAweDJiNzAsIDB4MGM3ZSwgMHg2ODEwLCAweDgwMDcsCisJMHhhMDg0LCAweDAwMGYsIDB4ODAwMywgMHg4MDAzLCAweDgwMDMsIDB4YTA4MCwgMHgzNjAwLCAweDIwNjAsCisJMHgyMDQ4LCAweDcwNGEsIDB4NjAwMCwgMHg3MDRlLCAweDYwMDQsIDB4NzA1MiwgMHgwYzdmLCAweDAwN2MsCisJMHgwMDIwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsCisJMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsCisJMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsCisJMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDAwLCAweDAwMjAsCisJMHgwMDAwLCAweDAwMjAsIDB4MDA2MiwgMHgwMDA5LCAweDAwMTQsIDB4MDAxNCwgMHg5ODQ3LCAweDAwMTQsCisJMHgwMDE0LCAweDk4ZjUsIDB4OThlNywgMHgwMDE0LCAweDAwMTQsIDB4MDA4MCwgMHgwMGJmLCAweDAxMDAsCisJMHgwNDAyLCAweDIwMDgsIDB4Zjg4MCwgMHhhMjBhLCAweDAwMTQsIDB4MzAwYiwgMHhhMjBjLCAweDAwMTQsCisJMHhhMjAwLCAweDg4MzgsIDB4ODE3ZSwgMHg4NDJhLCAweDg0YTAsIDB4MzgwNiwgMHg4ODM5LCAweDI4YzIsCisJMHg5Y2MzLCAweGE4MDUsIDB4MDg2NCwgMHhhODNiLCAweDMwMDgsIDB4MjhjMSwgMHg5Y2MzLCAweGEyMDEsCisJMHgzMDBjLCAweDI4NDcsIDB4ODE2MSwgMHg4NDZhLCAweDgwMDAsIDB4ODRhNCwgMHgxODU2LCAweDg4M2EsCisJMHhhODA4LCAweDI4ZTIsIDB4OWNhMCwgMHhhOGYzLCAweDA4NjQsIDB4YTgyOSwgMHgzMDBjLCAweGE4MDEsCisJMHgzMDA4LCAweDI4ZTEsIDB4OWNhMCwgMHgyODBkLCAweGEyMDQsIDB4NjRjMCwgMHg2N2EwLCAweDZmYzAsCisJMHgxODE0LCAweDg4M2IsIDB4NzAyMywgMHg4NTc2LCAweDg2NzcsIDB4YTgwZiwgMHg3ODZlLCAweDg4M2UsCisJMHhhODBjLCAweDI4MmIsIDB4YTIwNSwgMHg2NGEwLCAweDY3YTAsIDB4NmZjMCwgMHgxODE0LCAweDg4M2IsCisJMHg3MDIzLCAweDg1NzYsIDB4ODY3NywgMHhhODAxLCAweDg4M2UsIDB4MjA2OSwgMHgyOGMxLCAweDljYzMsCisJMHgyMDQ0LCAweDIxMDMsIDB4MjBhMiwgMHgyMDgxLCAweGE4ZGMsIDB4YTIwNywgMHgwMDE0LCAweGEyMDMsCisJMHg4MDAwLCAweDg0YTgsIDB4ODVhNCwgMHgxODcyLCAweDg0OWEsIDB4ODgzYywgMHgxZmUyLCAweGY2MDEsCisJMHhhMjA4LCAweDg1NmUsIDB4ODY2ZiwgMHgwNzA0LCAweDMwMDgsIDB4OWNhMCwgMHgwMDE0LCAweGEyMDIsCisJMHg4MDAwLCAweDg1YTQsIDB4MzAwOSwgMHg4NGE4LCAweDE5ZTIsIDB4Zjg0OCwgMHg4MTc0LCAweDg2ZWIsCisJMHg4NWViLCAweDg3MmUsIDB4ODdhOSwgMHg4ODNmLCAweDA4ZTYsIDB4YThmMSwgMHhmODYxLCAweGE4ZTgsCisJMHhmODAxLCAweDAwMTQsIDB4Zjg4MSwgMHgwMDE2LCAweDg1YjIsIDB4ODBmMCwgMHg5NTMyLCAweGZhYTIsCisJMHgxZGUyLCAweDAwMTQsIDB4ODUzMiwgMHhmMjIxLCAweDAwMTQsIDB4MWRlMiwgMHg4NGE4LCAweGQ2ZTAsCisJMHgxZmU2LCAweDAwMTQsIDB4YTIwNiwgMHg2ODY1LCAweDgxN2YsIDB4ODQyYSwgMHgxZGMxLCAweDg4MjMsCisJMHgwMDE2LCAweDYwNDIsIDB4ODAwOCwgMHhhOGZhLCAweDgwMDAsIDB4ODRhNCwgMHg4MTYwLCAweDg0MmEsCisJMHhmMDIxLCAweDMwMDgsIDB4ODRhOCwgMHgxZGM2LCAweDIwZDcsIDB4ODgyMiwgMHgwMDE2LCAweDgwMDAsCisJMHgyODQ4LCAweDEwMTEsIDB4YThmYywgMHgzMDA4LCAweDgwMDAsIDB4YTAwMCwgMHgyODAyLCAweDEwMTEsCisJMHhhOGZkLCAweGE4ODcsIDB4MzAwOCwgMHgyODNkLCAweDEwMTEsIDB4YThmZCwgMHhhMjA5LCAweDAwMTcsCisJMHgzMDBjLCAweDgwMDAsIDB4ODVhNCwgMHgxZGUyLCAweGRhYzEsIDB4MDAxNCwgMHgyNmUwLCAweDg3M2EsCisJMHhmYWEyLCAweDE5ZjIsIDB4MWZlMiwgMHgwMDE0LCAweGEyMGIsIDB4MDAxNCwgMHhhMjBkLCAweDgxN2UsCisJMHg4NDJhLCAweDg0YTAsIDB4MzgwNiwgMHgwMjEwLCAweDljY2QsIDB4MDcwNCwgMHgwMDAwLCAweDEyN2UsCisJMHgyMDkxLCAweDIyMDAsIDB4MjA0OSwgMHgyZWM3LCAweDcwMDAsIDB4NzIwNCwgMHhhMjA1LCAweDcyMGMsCisJMHhhMjE1LCAweDcwMDgsIDB4YTA4NCwgMHhmZmZkLCAweGEyMDUsIDB4MDA0MCwgMHgyZWQ5LCAweDAwNzgsCisJMHgyZWRlLCAweDcwMDMsIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHg3MDAwLCAweGEwODQsCisJMHgwMDAxLCAweDAwYzAsIDB4MmYwYywgMHg3MTA4LCAweDgxMDQsIDB4MDBjOCwgMHgyZWViLCAweDEwNzgsCisJMHgyZmE4LCAweDAwNzgsIDB4MmVlMywgMHg3MDBjLCAweGEwOGMsIDB4MDA3ZiwgMHgwMDQwLCAweDJmMGMsCisJMHg3MDA0LCAweDgwMDQsIDB4MDBjOCwgMHgyZjAzLCAweDcwMTQsIDB4YTAwNSwgMHgwMGMwLCAweDJlZmYsCisJMHg3MDEwLCAweGEwMDUsIDB4MDA0MCwgMHgyZjAzLCAweGExMDIsIDB4MDBjOCwgMHgyZWUzLCAweDcwMDcsCisJMHgwMDEwLCAweDAwNzgsIDB4MmYwYywgMHg4YWZmLCAweDAwNDAsIDB4MmYwYywgMHgxMDc4LCAweDMxNmIsCisJMHgwMGMwLCAweDJmMDYsIDB4MDA0MCwgMHgyZWUzLCAweDEwNzgsIDB4MmY1NiwgMHg3MDAzLCAweDAwMDAsCisJMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHg2NDI0LCAweDg0ZmYsIDB4MDA0MCwgMHgyZjMwLCAweDJjNzAsCisJMHgyMDM5LCAweDJmMzUsIDB4MjcwNCwgMHhhZTY4LCAweDY4MGMsIDB4YTYzMCwgMHg2ODA4LCAweGE1MjksCisJMHg4NDIxLCAweDAwNDAsIDB4MmYzMCwgMHg4NzM4LCAweDI3MDQsIDB4YTAwNSwgMHgwMGMwLCAweDJmMWIsCisJMHg3MDk4LCAweGEwNzUsIDB4MDA0MCwgMHgyZjMwLCAweDIwMzksIDB4MmYzMiwgMHgwMDc4LCAweDJmMWEsCisJMHgwMDdjLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDAwMGMsIDB4MDAxMCwgMHgwMDE0LCAweDAwMTgsCisJMHgwMDFjLCAweDAwMDAsIDB4MTI3ZSwgMHgyMDkxLCAweDIyMDAsIDB4MjA3OSwgMHgzNTAwLCAweDIwNzEsCisJMHgwMDEwLCAweDcwMDcsIDB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDIwNzEsCisJMHgwMDIwLCAweDcwMDcsIDB4MDAwYSwgMHg3MDA3LCAweDAwMDIsIDB4NzAwMywgMHgwMDAwLCAweDIwNDksCisJMHgwMDAwLCAweDc4YjMsIDB4MDAwMCwgMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHgyMDQ5LCAweDJmNTYsCisJMHg3MDA0LCAweDgwMDQsIDB4MDBjOCwgMHgyZjgyLCAweDcwMDcsIDB4MDAxMiwgMHg3MTA4LCAweDcwMDgsCisJMHhhMTA2LCAweDAwYzAsIDB4MmY1ZSwgMHhhMTg0LCAweDAwMzAsIDB4MDA0MCwgMHgyZjZiLCAweGEwODYsCisJMHgwMDMwLCAweDAwYzAsIDB4MmY1ZSwgMHg3MDAwLCAweGEwODQsIDB4MDAwMSwgMHgwMGMwLCAweDJmODIsCisJMHg3MDA4LCAweGEwODQsIDB4MDAwYywgMHgwMGMwLCAweDJmODAsIDB4NzEwYywgMHhhMTg0LCAweDAzMDAsCisJMHgwMGMwLCAweDJmODAsIDB4YTE4NCwgMHgwMDdmLCAweDAwYzAsIDB4MmY1NiwgMHgwMDc4LCAweDJmODIsCisJMHg2ODE3LCAweDAwMDMsIDB4NzAwNywgMHgwMDEyLCAweDcwMDcsIDB4MDAwOCwgMHg3MDA0LCAweGEwODQsCisJMHgwMDA4LCAweDAwYzAsIDB4MmY4NiwgMHg3MDA3LCAweDAwMTIsIDB4NzEwOCwgMHg4MTA0LCAweDAwNDgsCisJMHgyZjhiLCAweDc4YjMsIDB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLCAweDAwN2MsCisJMHgxMDdlLCAweDAwN2UsIDB4MTI3ZSwgMHgxNTdlLCAweDIwOTEsIDB4MjIwMCwgMHg3MTA4LCAweDEwNzgsCisJMHgyZmE4LCAweDE1N2YsIDB4MTI3ZiwgMHgyMDkxLCAweDgwMDEsIDB4MDA3ZiwgMHgxMDdmLCAweDAwN2MsCisJMHg3MjA0LCAweDIxMTgsIDB4NzEwOCwgMHg3MDBjLCAweGEwODQsIDB4MDMwMCwgMHgwMGMwLCAweDJmZWEsCisJMHhhMTg0LCAweDAwMGMsIDB4MDBjMCwgMHgyZmVhLCAweDgyMTMsIDB4ODIxMywgMHg4MjEzLCAweDgyMTMsCisJMHhhMjg0LCAweDAxMDAsIDB4YTEwZCwgMHg4MTBiLCAweDgxMGIsIDB4ODEwZiwgMHhhMTg0LCAweDAwMDcsCisJMHgwMDc5LCAweDJmYzIsIDB4MmZjYywgMHgyZmRjLCAweDJmZWEsIDB4MmZkYywgMHgyZmZlLCAweDJmZmUsCisJMHgyZmVhLCAweDJmZmMsIDB4MTA3OCwgMHgxYmE1LCAweDcwMDcsIDB4MDAwMiwgMHg4YWZmLCAweDAwYzAsCisJMHgyZmQ1LCAweDIwNDksIDB4MDAwMCwgMHgwMDc4LCAweDJmZDksIDB4MTA3OCwgMHgzMTZiLCAweDAwYzAsCisJMHgyZmQ1LCAweDc4YjMsIDB4MDAwMCwgMHgwMDdjLCAweDcwMDcsIDB4MDAwMiwgMHg4YWZmLCAweDAwYzAsCisJMHgyZmUzLCAweDAwNzgsIDB4MmZlNywgMHgxMDc4LCAweDMxNmIsIDB4MDBjMCwgMHgyZmUzLCAweDc4YjMsCisJMHgwMDAwLCAweDAwN2MsIDB4NzAwNywgMHgwMDAyLCAweDEwNzgsIDB4MmY1NiwgMHgxMDc4LCAweDJjYmIsCisJMHg2ODE0LCAweGEwODQsIDB4ODAwMCwgMHgwMDQwLCAweDJmZjcsIDB4NjgxNywgMHgwMDAyLCAweDAwN2MsCisJMHgxMDc4LCAweDFiYTUsIDB4MTA3OCwgMHgxYmE1LCAweDEwNzgsIDB4MzA1MCwgMHg3MjEwLCAweDcxMTQsCisJMHg3MDBjLCAweGEwOWMsIDB4MDA3ZiwgMHgyODAwLCAweGEzMDAsIDB4YTIxMSwgMHhhMTg5LCAweDAwMDAsCisJMHg3OGIwLCAweGEwMDUsIDB4MDA0MCwgMHgzMDEwLCAweDc4YjMsIDB4MDAwMCwgMHgwMDc4LCAweDMwMzMsCisJMHgxMDc4LCAweDMwNTAsIDB4MjcwNCwgMHgyYzU4LCAweGFjNjAsIDB4NjMwYywgMHgyMjAwLCAweGEzMjIsCisJMHg2MzA4LCAweDIxMDAsIDB4YTMxYiwgMHgyNDAwLCAweGEzMDUsIDB4MDA0MCwgMHgzMDI5LCAweDAwYzgsCisJMHgzMDI5LCAweDg0MTIsIDB4ODIxMCwgMHg4MzBhLCAweGExODksIDB4MDAwMCwgMHgyYjYwLCAweDAwNzgsCisJMHgzMDEwLCAweDJiNjAsIDB4OGEwNywgMHhhN2JhLCAweDJmMzIsIDB4YTczZCwgMHgyYzAwLCAweDY4ODIsCisJMHg2Zjg2LCAweDZjOGUsIDB4NmI4YSwgMHg3MDA3LCAweDAwMTIsIDB4MTA3OCwgMHgyZjU2LCAweDAwN2MsCisJMHg4NzM4LCAweDI3MDQsIDB4YTAwNSwgMHgwMGMwLCAweDMwNDQsIDB4NjA5OCwgMHhhMDA1LCAweDAwNDAsCisJMHgzMDRkLCAweDIwNjAsIDB4MjAzOSwgMHgyZjMyLCAweDhhNTEsIDB4MDA0MCwgMHgzMDRjLCAweDcwMDgsCisJMHhhMDg0LCAweDAwYzAsIDB4YTA4NiwgMHgwMGMwLCAweDAwN2MsIDB4MjA1MSwgMHgwMDAwLCAweDAwN2MsCisJMHg4YTUwLCAweDg3MzksIDB4MjcwNCwgMHhhMDA0LCAweDAwYzAsIDB4MzA1ZCwgMHgyMDM5LCAweDJmMzgsCisJMHg2MDAwLCAweGEwNjQsIDB4MDBjMCwgMHgzMDVkLCAweDJkNjAsIDB4MDA3YywgMHgxMjdlLCAweDBkN2UsCisJMHgyMDkxLCAweDIyMDAsIDB4MGQ3ZiwgMHg2ODgwLCAweDIwNjAsIDB4Njg4NCwgMHg2Yjg4LCAweDZjOGMsCisJMHg4MDU3LCAweGFhZDQsIDB4MDBmZiwgMHhhMDg0LCAweDAwZmYsIDB4YTBiOCwgMHgyZjMyLCAweDdlMDgsCisJMHhhNmI1LCAweDAwMGMsIDB4NjgxOCwgMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzMDc5LCAweGE2YjUsCisJMHgwMDAxLCAweDBmN2UsIDB4MjA3OSwgMHgwMTAwLCAweDc4NTgsIDB4MGY3ZiwgMHhhMDg0LCAweDAwNDAsCisJMHgwMDQwLCAweDMwODgsIDB4YTY4NCwgMHgwMDAxLCAweDAwYzAsIDB4MzA4OCwgMHhhNmI1LCAweDAwMDEsCisJMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgzMDhhLCAweDcwMDAsCisJMHhhMDA1LCAweDAwNDAsIDB4MzA5NSwgMHgxMDc4LCAweDFiYTUsIDB4MjQwMCwgMHhhMzA1LCAweDAwYzAsCisJMHgzMDliLCAweDAwNzgsIDB4MzBkOCwgMHgyYzU4LCAweDI3MDQsIDB4YWM2MCwgMHg2MDA0LCAweGE0MDAsCisJMHgwMDdlLCAweDcwMWEsIDB4NjAwMCwgMHhhMzAxLCAweDcwMWUsIDB4MjAwOSwgMHgwNGZkLCAweDIxMDQsCisJMHhhMDg2LCAweDA0ZmQsIDB4MDA3ZiwgMHgwMGMwLCAweDMwYzgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsCisJMHgzMGM4LCAweGE2ODQsIDB4MDAwMSwgMHgwMGMwLCAweDMwYzgsIDB4NzAxMywgMHgwMDAxLCAweDcwMTcsCisJMHgwMDAwLCAweDc2MDIsIDB4NzAwNywgMHgwMDAxLCAweDc4YjMsIDB4MDAwMSwgMHhhNGEwLCAweDAwMDEsCisJMHhhMzk5LCAweDAwMDAsIDB4NjAwNCwgMHhhNDAwLCAweDcwMWEsIDB4NjAwMCwgMHhhMzAxLCAweDcwMWUsCisJMHg2MjBjLCAweDI0MDAsIDB4YTIwMiwgMHg3MDEyLCAweDYyMDgsIDB4MjMwMCwgMHhhMjAzLCAweDcwMTYsCisJMHg3NjAyLCAweDcwMDcsIDB4MDAwMSwgMHgyYjYwLCAweDEwNzgsIDB4MzAzOCwgMHgwMDc4LCAweDMwZGEsCisJMHgxMDc4LCAweDMxNmIsIDB4MDBjMCwgMHgzMGQ4LCAweDEyN2YsIDB4MjAwMCwgMHgwMDdjLCAweDEyN2UsCisJMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDcwMDcsIDB4MDAwNCwgMHg3MDA0LCAweGEwODQsCisJMHgwMDA0LCAweDAwYzAsIDB4MzBlNiwgMHg3MDAzLCAweDAwMDgsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsCisJMHgxMjdlLCAweDBkN2UsIDB4MjA5MSwgMHgyMjAwLCAweDBkN2YsIDB4MjA0OSwgMHgzMGYwLCAweDcwMDcsCisJMHgwMDA0LCAweDcwMDQsIDB4YTA4NCwgMHgwMDA0LCAweDAwYzAsIDB4MzBmOSwgMHg3MDAwLCAweGEwMDUsCisJMHgwMDQwLCAweDMxMDQsIDB4MTA3OCwgMHgxYmE1LCAweDdlMDgsIDB4YTZiNSwgMHgwMDBjLCAweDY4MTgsCisJMHhhMDg0LCAweDAwNDAsIDB4MDA0MCwgMHgzMTBlLCAweGE2YjUsIDB4MDAwMSwgMHg2ODI0LCAweGEwMDUsCisJMHgwMDQwLCAweDMxMWEsIDB4MjA1MCwgMHgyMDM5LCAweDJmMzUsIDB4MmQ2MCwgMHgxMDc4LCAweDMxNmIsCisJMHgwMGMwLCAweDMxMTYsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgwMDdlLCAweDAxN2UsCisJMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDAzN2YsIDB4MDQ3ZiwgMHg3ZTA4LCAweGE2YjUsCisJMHgwMDBjLCAweDY4MTgsIDB4YTA4NCwgMHgwMDQwLCAweDAwNDAsIDB4MzEzMCwgMHhhNmI1LCAweDAwMDEsCisJMHgyMDQ5LCAweDMxMWQsIDB4NjgyNCwgMHhhMDU1LCAweDAwNDAsIDB4MzE2OCwgMHgyZDcwLCAweDJlNjAsCisJMHgyMDM5LCAweDJmMzUsIDB4MjcwNCwgMHhhZTY4LCAweDY4MGMsIDB4YTQyMiwgMHg2ODA4LCAweGEzMWIsCisJMHgwMDQ4LCAweDMxNTUsIDB4OGE1MSwgMHgwMGMwLCAweDMxNDcsIDB4MTA3OCwgMHgxYmE1LCAweDg3MzgsCisJMHgyNzA0LCAweGEwMDUsIDB4MDBjMCwgMHgzMTNiLCAweDcwOTgsIDB4YTA3NSwgMHgyMDYwLCAweDAwNDAsCisJMHgzMTY4LCAweDIwMzksIDB4MmYzMiwgMHgwMDc4LCAweDMxM2EsIDB4ODQyMiwgMHg4NDIwLCAweDgzMWEsCisJMHhhMzk5LCAweDAwMDAsIDB4NjkwYywgMHgyNDAwLCAweGExMjIsIDB4NjkwOCwgMHgyMzAwLCAweGExMWIsCisJMHgwMGM4LCAweDMxNjQsIDB4MTA3OCwgMHgxYmE1LCAweDIwNzEsIDB4MDAyMCwgMHgwMDc4LCAweDMwODgsCisJMHgxMjdmLCAweDIwMDAsIDB4MDA3YywgMHg3MDA4LCAweGEwODQsIDB4MDBjMCwgMHhhMDg2LCAweDAwYzAsCisJMHgwMDQwLCAweDMxOTMsIDB4MjcwNCwgMHhhYzA4LCAweDIxMDQsIDB4NzAxZSwgMHg4MTA4LCAweDIxMDQsCisJMHg3MDFhLCAweDgxMDgsIDB4MjEwNCwgMHg3MDE2LCAweDgxMDgsIDB4MjEwNCwgMHg3MDEyLCAweDBmN2UsCisJMHgyMDc5LCAweDAxMDAsIDB4Nzg1OCwgMHgwZjdmLCAweGEwODQsIDB4MDA0MCwgMHgwMDQwLCAweDMxOGUsCisJMHhhNjg0LCAweDAwMDEsIDB4MDBjMCwgMHgzMThlLCAweGE2YjUsIDB4MDAwMSwgMHg3NjAyLCAweDcwMDcsCisJMHgwMDAxLCAweDEwNzgsIDB4MzAzOCwgMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwZDdlLCAweDIwOTEsCisJMHgyMjAwLCAweDIwNDksIDB4MzE5NCwgMHgwZDdmLCAweDA4N2YsIDB4NzEwOCwgMHhhMTg0LCAweDAwYzAsCisJMHgwMGMwLCAweDMxYWEsIDB4NjgyNCwgMHhhMDA1LCAweDAwNDAsIDB4MzFiYSwgMHgwMDc4LCAweDJlZGUsCisJMHgwMDc4LCAweDMxYmEsIDB4NzEwOCwgMHg4MTA0LCAweDAwYzgsIDB4MzFiMiwgMHgxMDc4LCAweDJmYTgsCisJMHgwMDc4LCAweDMxOWQsIDB4NzAwNywgMHgwMDEwLCAweDcxMDgsIDB4ODEwNCwgMHgwMGM4LCAweDMxYjQsCisJMHgxMDc4LCAweDJmYTgsIDB4NzAwOCwgMHhhMDg2LCAweDAwMDIsIDB4MDBjMCwgMHgzMTlkLCAweDcwMDAsCisJMHhhMDA1LCAweDAwYzAsIDB4MzE5ZCwgMHg3MDAzLCAweDAwMDAsIDB4MjA0OSwgMHgwMDAwLCAweDEyN2YsCisJMHgyMDAwLCAweDAwN2MsIDB4MTI3ZSwgMHgxNDdlLCAweDEzN2UsIDB4MTU3ZSwgMHgwZDdlLCAweDIwOTEsCisJMHgyMjAwLCAweDBkN2YsIDB4MjA0OSwgMHgzMWNhLCAweGFkODAsIDB4MDAxMCwgMHgyMGEwLCAweDIwOTksCisJMHgwMDMxLCAweDcwMGMsIDB4YTA4NCwgMHgwMDdmLCAweDY4MjYsIDB4NzAwNywgMHgwMDA4LCAweDcwMDcsCisJMHgwMDAyLCAweDcwMDMsIDB4MDAwMSwgMHgwMDQwLCAweDMxZTgsIDB4ODAwMCwgMHg4MGFjLCAweDUzYTUsCisJMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgzMWVhLCAweDIwNDksCisJMHgwMDAwLCAweDcwMDMsIDB4MDAwMCwgMHgxNTdmLCAweDEzN2YsIDB4MTQ3ZiwgMHgxMjdmLCAweDIwMDAsCisJMHgwMDdjLCAweDEyN2UsIDB4MDA3ZSwgMHgwZDdlLCAweDIwOTEsIDB4MjIwMCwgMHgwZDdmLCAweDIwNDksCisJMHgzMWY5LCAweDY4ODAsIDB4MjA2MCwgMHg2ODg0LCAweDZiODgsIDB4NmM4YywgMHg4MDU3LCAweGFhZDQsCisJMHgwMGZmLCAweGEwODQsIDB4MDBmZiwgMHhhMGI4LCAweDJmMzIsIDB4N2UwOCwgMHhhNmI1LCAweDAwMDQsCisJMHg3MDA3LCAweDAwMDQsIDB4NzAwNCwgMHhhMDg0LCAweDAwMDQsIDB4MDBjMCwgMHgzMjEyLCAweDJjNTgsCisJMHgyNzA0LCAweGFjNjAsIDB4NjAwNCwgMHhhNDAwLCAweDcwMWEsIDB4NjAwMCwgMHhhMzAxLCAweDcwMWUsCisJMHg3MDEzLCAweDAwMDEsIDB4NzAxNywgMHgwMDAwLCAweDc2MDIsIDB4NzAwNywgMHgwMDAxLCAweDAwN2YsCisJMHg4MDA3LCAweDIwMDksIDB4MDAzMSwgMHgyMDBhLCAweDAwYTAsIDB4MzIyYywgMHg3MTA4LCAweDcwMDcsCisJMHgwMDAyLCAweDgxMGMsIDB4MDBjOCwgMHgzMjJjLCAweDgxMGMsIDB4MDA0OCwgMHgzMjM5LCAweDAwNzgsCisJMHgyZmVhLCAweGE0YTAsIDB4MDAwMSwgMHhhMzk5LCAweDAwMDAsIDB4NmI4YSwgMHg2YzhlLCAweDcwMDcsCisJMHgwMDA0LCAweDIwNDksIDB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4MTI3ZiwgMHgyMDAwLCAweDAwN2MsCisJMHgyMGE5LCAweDAwMTAsIDB4YTAwNiwgMHg4MDA0LCAweDgwODYsIDB4ODE4ZSwgMHgwMGM4LCAweDMyNTEsCisJMHhhMjAwLCAweDAwZjAsIDB4MzI0YywgMHg4MDg2LCAweDgxOGUsIDB4MDA3YywgMHgxNTdlLCAweDIwYTksCisJMHgwMDEwLCAweGEwMDUsIDB4MDA0MCwgMHgzMjc3LCAweGExMWEsIDB4MDBjOCwgMHgzMjc3LCAweDgyMTMsCisJMHg4MThkLCAweDAwNDgsIDB4MzI2YSwgMHhhMTFhLCAweDAwYzgsIDB4MzI2YiwgMHgwMGYwLCAweDMyNWYsCisJMHgwMDc4LCAweDMyNmYsIDB4YTExYSwgMHgyMzA4LCAweDgyMTAsIDB4MDBmMCwgMHgzMjVmLCAweDAwN2UsCisJMHgzMjAwLCAweGEwODQsIDB4ZjdmZiwgMHgyMDgwLCAweDAwN2YsIDB4MTU3ZiwgMHgwMDdjLCAweDAwN2UsCisJMHgzMjAwLCAweGEwODUsIDB4MDgwMCwgMHgwMDc4LCAweDMyNzMsIDB4MDBlMCwgMHgzMmJmLCAweDIwOTEsCisJMHg2MDAwLCAweDc4MjAsIDB4ODAwMSwgMHg3ODIyLCAweDAwYzAsIDB4MzJiOSwgMHg3ODI0LCAweDc4MjIsCisJMHgyMDkxLCAweDgwMDAsIDB4MjA2OSwgMHgzNTQwLCAweDY4MDAsIDB4YTA4NCwgMHgwMDA3LCAweDAwNDAsCisJMHgzMmExLCAweGEwODYsIDB4MDAwMiwgMHgwMDQwLCAweDMyYTEsIDB4NjgzMCwgMHhhMDBkLCAweDAwNDAsCisJMHgzMmExLCAweDIxMDQsIDB4YTAwNSwgMHgwMDQwLCAweDMyYTEsIDB4ODAwMSwgMHgyMDBhLCAweDAwNDAsCisJMHgzMzZmLCAweDIwNjEsIDB4MzY4MCwgMHgyMGE5LCAweDAwODAsIDB4NjAzNCwgMHhhMDA1LCAweDAwNDAsCisJMHgzMmIzLCAweDgwMDEsIDB4NjAzNiwgMHgwMGMwLCAweDMyYjMsIDB4NjAxMCwgMHhhMDA1LCAweDAwNDAsCisJMHgzMmIzLCAweDEwNzgsIDB4MWExOSwgMHhhY2UwLCAweDAwMTAsIDB4MDA3MCwgMHgzMmI5LCAweDAwNzgsCisJMHgzMmE1LCAweDEwNzgsIDB4MzJkNCwgMHgxMDc4LCAweDMyYzIsIDB4MTA3OCwgMHgzMmY5LCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4NzgzYywgMHg4MDAxLCAweDc4M2UsIDB4MDBjMCwgMHgzMmQzLCAweDc4NDAsCisJMHg3ODNlLCAweDc4NDgsIDB4YTAwNSwgMHgwMDQwLCAweDMyZDMsIDB4ODAwMSwgMHg3ODRhLCAweDAwYzAsCisJMHgzMmQzLCAweDEwNzgsIDB4MWExOSwgMHgwMDdjLCAweDc4MzQsIDB4ODAwMSwgMHg3ODM2LCAweDAwYzAsCisJMHgzMmY4LCAweDc4MzgsIDB4NzgzNiwgMHgyMDkxLCAweDgwMDAsIDB4Nzg0NCwgMHhhMDA1LCAweDAwYzAsCisJMHgzMmUzLCAweDIwMDEsIDB4MDEwMSwgMHg4MDAxLCAweDc4NDYsIDB4YTA4MCwgMHgzZTgwLCAweDIwNDAsCisJMHgyMDA0LCAweGEwNjUsIDB4MDA0MCwgMHgzMmY4LCAweDYwMjAsIDB4YTAwNSwgMHgwMDQwLCAweDMyZjQsCisJMHg4MDAxLCAweDYwMjIsIDB4MDA0MCwgMHgzMzI4LCAweDYwMDAsIDB4MmM0MCwgMHgwMDc4LCAweDMyZTksCisJMHgwMDdjLCAweDc4MjgsIDB4ODAwMSwgMHg3ODJhLCAweDAwYzAsIDB4MzMyNywgMHg3ODJjLCAweDc4MmEsCisJMHg3ODMwLCAweGEwMDUsIDB4MDBjMCwgMHgzMzA2LCAweDIwMDEsIDB4MDA4MCwgMHg4MDAxLCAweDc4MzIsCisJMHg4MDAzLCAweDgwMDMsIDB4ODAwMywgMHg4MDAzLCAweGEwOTAsIDB4MzY4MCwgMHhhMjk4LCAweDAwMDIsCisJMHgyMzA0LCAweGEwODQsIDB4MDAwOCwgMHgwMDQwLCAweDMzMjcsIDB4YTI5MCwgMHgwMDA5LCAweDIyMDQsCisJMHhhMDA1LCAweDAwNDAsIDB4MzMxZiwgMHg4MDAxLCAweDIwMTIsIDB4MDBjMCwgMHgzMzI3LCAweDIzMDQsCisJMHhhMDg0LCAweGZmZjcsIDB4YTA4NSwgMHgwMDgwLCAweDIwMWEsIDB4MTA3OCwgMHgxYTE5LCAweDAwN2MsCisJMHgyMDY5LCAweDM1NDAsIDB4NjgwMCwgMHhhMDA1LCAweDAwNDAsIDB4MzMzMiwgMHg2ODNjLCAweGFjMDYsCisJMHgwMDQwLCAweDMzNmYsIDB4NjAxNywgMHgwMDA2LCAweDYwYjAsIDB4YTA4NCwgMHgzZjAwLCAweDYwMWEsCisJMHg2MDFjLCAweGEwODQsIDB4MDBmZiwgMHhhMDg1LCAweDAwNjAsIDB4NjAxZSwgMHg2MDAwLCAweDIwNDIsCisJMHg2NzEwLCAweDZmYjYsIDB4MTA3OCwgMHgxNjkyLCAweDY4MTgsIDB4YTAwNSwgMHgwMDQwLCAweDMzNGEsCisJMHg4MDAxLCAweDY4MWEsIDB4NjgwOCwgMHhhMDg0LCAweGZmZWYsIDB4NjgwYSwgMHg2ODEwLCAweDgwMDEsCisJMHgwMGQwLCAweDMzNTQsIDB4MTA3OCwgMHgxYmE1LCAweDY4MTIsIDB4NjAyZiwgMHgwMDAwLCAweDYwMmIsCisJMHgwMDAwLCAweDJjNjgsIDB4MTA3OCwgMHgxN2RkLCAweDIwNjksIDB4MzU0MCwgMHgyMDAxLCAweDAwMDYsCisJMHg2OGEyLCAweDc5NDQsIDB4YTE4NCwgMHgwMTAwLCAweDAwYzAsIDB4MzM2YSwgMHg2OWJhLCAweDIwMDEsCisJMHgwMDA0LCAweDY4YTIsIDB4MTA3OCwgMHgxYTE0LCAweDIwOTEsIDB4ODAwMSwgMHgwMDdjLCAweDIwMDksCisJMHgzNTRmLCAweDIxNjQsIDB4MjA2OSwgMHgwMTAwLCAweDEwNzgsIDB4MWI2YiwgMHg2MDE3LCAweDAwMDYsCisJMHg2ODU4LCAweGEwODQsIDB4M2YwMCwgMHg2MDFhLCAweDYwMWMsIDB4YTA4NCwgMHgwMGZmLCAweGEwODUsCisJMHgwMDQ4LCAweDYwMWUsIDB4NjAyZiwgMHgwMDAwLCAweDYwMmIsIDB4MDAwMCwgMHg2ODMwLCAweGEwODQsCisJMHgwMDQwLCAweDAwNDAsIDB4MzNhYiwgMHg2ODRiLCAweDAwMDQsIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsCisJMHhhMDg0LCAweDAwMDQsIDB4MDA0MCwgMHgzMzk4LCAweDAwNzAsIDB4MzM5OCwgMHgwMDc4LCAweDMzOGYsCisJMHg2ODRiLCAweDAwMDksIDB4MjBhOSwgMHgwMDE0LCAweDY4NDgsIDB4YTA4NCwgMHgwMDAxLCAweDAwNDAsCisJMHgzM2E1LCAweDAwNzAsIDB4MzNhNSwgMHgwMDc4LCAweDMzOWMsIDB4MjBhOSwgMHgwMGZhLCAweDAwNzAsCisJMHgzM2FiLCAweDAwNzgsIDB4MzNhNywgMHg2ODA4LCAweGEwODQsIDB4ZmZmZCwgMHg2ODBhLCAweDY4MWIsCisJMHgwMDQ2LCAweDIwMDksIDB4MzU2OCwgMHgyMDBiLCAweDAwMDcsIDB4Nzg0YywgMHg3ODRhLCAweDIwOTEsCisJMHg4MDAxLCAweDAwN2MsIDB4MjA3OSwgMHgzNTAwLCAweDEwNzgsIDB4MzQwMywgMHgxMDc4LCAweDMzY2IsCisJMHgxMDc4LCAweDMzZTAsIDB4MTA3OCwgMHgzM2Y1LCAweDc4MzMsIDB4MDAwMCwgMHg3ODQ3LCAweDAwMDAsCisJMHg3ODRiLCAweDAwMDAsIDB4MDA3YywgMHgyMDE5LCAweDAwMGEsIDB4MjAxMSwgMHgzNTQ2LCAweDIyMDQsCisJMHhhMDg2LCAweDAwMzIsIDB4MDA0MCwgMHgzM2RkLCAweDIwMTksIDB4MDAwYywgMHgyMjA0LCAweGEwODYsCisJMHgwMDNjLCAweDAwNDAsIDB4MzNkZCwgMHgyMDE5LCAweDAwMDgsIDB4N2IyYSwgMHg3YjJlLCAweDAwN2MsCisJMHgyMDE5LCAweDAwMzAsIDB4MjAxMSwgMHgzNTQ2LCAweDIyMDQsIDB4YTA4NiwgMHgwMDMyLCAweDAwNDAsCisJMHgzM2YyLCAweDIwMTksIDB4MDAzOSwgMHgyMjA0LCAweGEwODYsIDB4MDAzYywgMHgwMDQwLCAweDMzZjIsCisJMHgyMDE5LCAweDAwMjcsIDB4N2IzNiwgMHg3YjNhLCAweDAwN2MsIDB4MjAxOSwgMHgwMDBkLCAweDIwMTEsCisJMHgzNTQ2LCAweDIyMDQsIDB4YTA4NiwgMHgwMDNjLCAweDAwNDAsIDB4MzQwMCwgMHgyMDE5LCAweDAwMGEsCisJMHg3YjNlLCAweDdiNDIsIDB4MDA3YywgMHgyMDE5LCAweDJmYWYsIDB4MjAxMSwgMHgzNTQ2LCAweDIyMDQsCisJMHhhMDg2LCAweDAwMzIsIDB4MDA0MCwgMHgzNDE1LCAweDIwMTksIDB4Mzk3MSwgMHgyMjA0LCAweGEwODYsCisJMHgwMDNjLCAweDAwNDAsIDB4MzQxNSwgMHgyMDE5LCAweDI2MjYsIDB4N2IyMiwgMHg3YjI2LCAweDAwN2MsCisJMHg5MmE3Cit9OwordW5zaWduZWQgc2hvcnQgc2J1c19yaXNjX2NvZGVfbGVuZ3RoMDEgPSAweDI0MTk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9udi5jIGIvZHJpdmVycy9zY3NpL3NhdGFfbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTAwOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfbnYuYwpAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqICBzYXRhX252LmMgLSBOVklESUEgbkZvcmNlIFNBVEEKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDQgTlZJRElBIENvcnAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvcHlyaWdodCAyMDA0IEFuZHJldyBDaGV3CisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICogIDAuMDYKKyAqICAgICAtIEFkZGVkIGdlbmVyaWMgU0FUQSBzdXBwb3J0IGJ5IHVzaW5nIGEgcGNpX2RldmljZV9pZCB0aGF0IGZpbHRlcnMgb24KKyAqICAgICAgIHRoZSBJREUgc3RvcmFnZSBjbGFzcyBjb2RlLgorICoKKyAqICAwLjAzCisgKiAgICAgLSBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgaG90cGx1ZyBoYW5kbGVycyBmb3Igbm9uLUNLODA0L01DUDA0IHdlcmUgdXNpbmcKKyAqICAgICAgIG1taW9fYmFzZSwgd2hpY2ggaXMgb25seSBzZXQgZm9yIHRoZSBDSzgwNC9NQ1AwNCBjYXNlLgorICoKKyAqICAwLjAyCisgKiAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBDSzgwNCBTQVRBIGNvbnRyb2xsZXIuCisgKgorICogIDAuMDEKKyAqICAgICAtIEluaXRpYWwgcmV2aXNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCQkJInNhdGFfbnYiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkJIjAuNiIKKworI2RlZmluZSBOVl9QT1JUUwkJCTIKKyNkZWZpbmUgTlZfUElPX01BU0sJCQkweDFmCisjZGVmaW5lIE5WX01XRE1BX01BU0sJCQkweDA3CisjZGVmaW5lIE5WX1VETUFfTUFTSwkJCTB4N2YKKyNkZWZpbmUgTlZfUE9SVDBfU0NSX1JFR19PRkZTRVQJCTB4MDAKKyNkZWZpbmUgTlZfUE9SVDFfU0NSX1JFR19PRkZTRVQJCTB4NDAKKworI2RlZmluZSBOVl9JTlRfU1RBVFVTCQkJMHgxMAorI2RlZmluZSBOVl9JTlRfU1RBVFVTX0NLODA0CQkweDQ0MAorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1BERVZfSU5UCQkweDAxCisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfUERFVl9QTQkJMHgwMgorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1BERVZfQURERUQJMHgwNAorI2RlZmluZSBOVl9JTlRfU1RBVFVTX1BERVZfUkVNT1ZFRAkweDA4CisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfU0RFVl9JTlQJCTB4MTAKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19TREVWX1BNCQkweDIwCisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfU0RFVl9BRERFRAkweDQwCisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfU0RFVl9SRU1PVkVECTB4ODAKKyNkZWZpbmUgTlZfSU5UX1NUQVRVU19QREVWX0hPVFBMVUcJKE5WX0lOVF9TVEFUVVNfUERFVl9BRERFRCB8IFwKKwkJCQkJTlZfSU5UX1NUQVRVU19QREVWX1JFTU9WRUQpCisjZGVmaW5lIE5WX0lOVF9TVEFUVVNfU0RFVl9IT1RQTFVHCShOVl9JTlRfU1RBVFVTX1NERVZfQURERUQgfCBcCisJCQkJCU5WX0lOVF9TVEFUVVNfU0RFVl9SRU1PVkVEKQorI2RlZmluZSBOVl9JTlRfU1RBVFVTX0hPVFBMVUcJCShOVl9JTlRfU1RBVFVTX1BERVZfSE9UUExVRyB8IFwKKwkJCQkJTlZfSU5UX1NUQVRVU19TREVWX0hPVFBMVUcpCisKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRQkJCTB4MTEKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9DSzgwNAkJMHg0NDEKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9QREVWX01BU0sJCTB4MDEKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9QREVWX1BNCQkweDAyCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfUERFVl9BRERFRAkweDA0CisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfUERFVl9SRU1PVkVECTB4MDgKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9TREVWX01BU0sJCTB4MTAKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9TREVWX1BNCQkweDIwCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfU0RFVl9BRERFRAkweDQwCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfU0RFVl9SRU1PVkVECTB4ODAKKyNkZWZpbmUgTlZfSU5UX0VOQUJMRV9QREVWX0hPVFBMVUcJKE5WX0lOVF9FTkFCTEVfUERFVl9BRERFRCB8IFwKKwkJCQkJTlZfSU5UX0VOQUJMRV9QREVWX1JFTU9WRUQpCisjZGVmaW5lIE5WX0lOVF9FTkFCTEVfU0RFVl9IT1RQTFVHCShOVl9JTlRfRU5BQkxFX1NERVZfQURERUQgfCBcCisJCQkJCU5WX0lOVF9FTkFCTEVfU0RFVl9SRU1PVkVEKQorI2RlZmluZSBOVl9JTlRfRU5BQkxFX0hPVFBMVUcJCShOVl9JTlRfRU5BQkxFX1BERVZfSE9UUExVRyB8IFwKKwkJCQkJTlZfSU5UX0VOQUJMRV9TREVWX0hPVFBMVUcpCisKKyNkZWZpbmUgTlZfSU5UX0NPTkZJRwkJCTB4MTIKKyNkZWZpbmUgTlZfSU5UX0NPTkZJR19NRVRIRAkJMHgwMSAvLyAwID0gSU5ULCAxID0gU01JCisKKy8vIEZvciBQQ0kgY29uZmlnIHJlZ2lzdGVyIDIwCisjZGVmaW5lIE5WX01DUF9TQVRBX0NGR18yMAkJMHg1MAorI2RlZmluZSBOVl9NQ1BfU0FUQV9DRkdfMjBfU0FUQV9TUEFDRV9FTgkweDA0CisKK3N0YXRpYyBpbnQgbnZfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHUzMiBudl9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZyk7CitzdGF0aWMgdm9pZCBudl9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIHZvaWQgbnZfaG9zdF9zdG9wIChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CitzdGF0aWMgdm9pZCBudl9lbmFibGVfaG90cGx1ZyhzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKK3N0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7CitzdGF0aWMgdm9pZCBudl9jaGVja19ob3RwbHVnKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKK3N0YXRpYyB2b2lkIG52X2VuYWJsZV9ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpOworc3RhdGljIHZvaWQgbnZfZGlzYWJsZV9ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKK3N0YXRpYyB2b2lkIG52X2NoZWNrX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworCitlbnVtIG52X2hvc3RfdHlwZQoreworCUdFTkVSSUMsCisJTkZPUkNFMiwKKwlORk9SQ0UzLAorCUNLODA0Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbnZfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJTX1NBVEEsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE5GT1JDRTIgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzU19TQVRBLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBORk9SQ0UzIH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFM1NfU0FUQTIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE5GT1JDRTMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfQ0s4MDRfU0FUQSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0s4MDQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfQ0s4MDRfU0FUQTIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENLODA0IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDA0X1NBVEEsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENLODA0IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDA0X1NBVEEyLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSzgwNCB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9BTllfSUQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJCVBDSV9DTEFTU19TVE9SQUdFX0lERTw8OCwgMHhmZmZmMDAsIEdFTkVSSUMgfSwKKwl7IDAsIH0gLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKKyNkZWZpbmUgTlZfSE9TVF9GTEFHU19TQ1JfTU1JTwkweDAwMDAwMDAxCisKK3N0cnVjdCBudl9ob3N0X2Rlc2MKK3sKKwllbnVtIG52X2hvc3RfdHlwZQlob3N0X3R5cGU7CisJdm9pZAkJCSgqZW5hYmxlX2hvdHBsdWcpKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpOworCXZvaWQJCQkoKmRpc2FibGVfaG90cGx1Zykoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworCXZvaWQJCQkoKmNoZWNrX2hvdHBsdWcpKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKKworfTsKK3N0YXRpYyBzdHJ1Y3QgbnZfaG9zdF9kZXNjIG52X2RldmljZV90YmxbXSA9IHsKKwl7CisJCS5ob3N0X3R5cGUJPSBHRU5FUklDLAorCQkuZW5hYmxlX2hvdHBsdWcJPSBOVUxMLAorCQkuZGlzYWJsZV9ob3RwbHVnPSBOVUxMLAorCQkuY2hlY2tfaG90cGx1Zwk9IE5VTEwsCisJfSwKKwl7CisJCS5ob3N0X3R5cGUJPSBORk9SQ0UyLAorCQkuZW5hYmxlX2hvdHBsdWcJPSBudl9lbmFibGVfaG90cGx1ZywKKwkJLmRpc2FibGVfaG90cGx1Zz0gbnZfZGlzYWJsZV9ob3RwbHVnLAorCQkuY2hlY2tfaG90cGx1Zwk9IG52X2NoZWNrX2hvdHBsdWcsCisJfSwKKwl7CisJCS5ob3N0X3R5cGUJPSBORk9SQ0UzLAorCQkuZW5hYmxlX2hvdHBsdWcJPSBudl9lbmFibGVfaG90cGx1ZywKKwkJLmRpc2FibGVfaG90cGx1Zz0gbnZfZGlzYWJsZV9ob3RwbHVnLAorCQkuY2hlY2tfaG90cGx1Zwk9IG52X2NoZWNrX2hvdHBsdWcsCisJfSwKKwl7CS5ob3N0X3R5cGUJPSBDSzgwNCwKKwkJLmVuYWJsZV9ob3RwbHVnCT0gbnZfZW5hYmxlX2hvdHBsdWdfY2s4MDQsCisJCS5kaXNhYmxlX2hvdHBsdWc9IG52X2Rpc2FibGVfaG90cGx1Z19jazgwNCwKKwkJLmNoZWNrX2hvdHBsdWcJPSBudl9jaGVja19ob3RwbHVnX2NrODA0LAorCX0sCit9OworCitzdHJ1Y3QgbnZfaG9zdAoreworCXN0cnVjdCBudl9ob3N0X2Rlc2MJKmhvc3RfZGVzYzsKKwl1bnNpZ25lZCBsb25nCQlob3N0X2ZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG52X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBudl9wY2lfdGJsLAorCS5wcm9iZQkJCT0gbnZfaW5pdF9vbmUsCisJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorfTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBudl9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkucGh5X3Jlc2V0CQk9IHNhdGFfcGh5X3Jlc2V0LAorCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IG52X2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCisJLnNjcl9yZWFkCQk9IG52X3Njcl9yZWFkLAorCS5zY3Jfd3JpdGUJCT0gbnZfc2NyX3dyaXRlLAorCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCQk9IG52X2hvc3Rfc3RvcCwKK307CisKKy8qIEZJWE1FOiBUaGUgaGFyZHdhcmUgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBTQVRBIFBIWSBjb250cm9scworICogdG8gc3VwcG9ydCBBVEFfRkxBR19TQVRBX1JFU0VULiAgSG93ZXZlciwgaXQgaXMgY3VycmVudGx5CisgKiBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGF0IGZsYWcsIHRvIHNvbHZlIG1pc2RldGVjdGlvbiBwcm9ibGVtcy4KKyAqIFNlZSBodHRwOi8vYnVnbWUub3NkbC5vcmcvc2hvd19idWcuY2dpP2lkPTMzNTIgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBUaGlzIHByb2JsZW0gcmVhbGx5IG5lZWRzIHRvIGJlIGludmVzdGlnYXRlZCBmdXJ0aGVyLiAgQnV0IGluIHRoZQorICogbWVhbnRpbWUsIHdlIGF2b2lkIEFUQV9GTEFHX1NBVEFfUkVTRVQgdG8gZ2V0IHBlb3BsZSB3b3JraW5nLgorICovCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gbnZfcG9ydF9pbmZvID0geworCS5zaHQJCT0gJm52X3NodCwKKwkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfAorCQkJICAvKiBBVEFfRkxBR19TQVRBX1JFU0VUIHwgKi8KKwkJCSAgQVRBX0ZMQUdfU1JTVCB8CisJCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKKwkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKKwkubXdkbWFfbWFzawk9IE5WX01XRE1BX01BU0ssCisJLnVkbWFfbWFzawk9IE5WX1VETUFfTUFTSywKKwkucG9ydF9vcHMJPSAmbnZfb3BzLAorfTsKKworTU9EVUxFX0FVVEhPUigiTlZJRElBIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIE5WSURJQSBuRm9yY2UgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbnZfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG52X2hvc3QgKmhvc3QgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdF9zZXQtPm5fcG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCQlpZiAoYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQorCQkJCWhhbmRsZWQgKz0gYXRhX2hvc3RfaW50cihhcCwgcWMpOworCQl9CisKKwl9CisKKwlpZiAoaG9zdC0+aG9zdF9kZXNjLT5jaGVja19ob3RwbHVnKQorCQlob3N0LT5ob3N0X2Rlc2MtPmNoZWNrX2hvdHBsdWcoaG9zdF9zZXQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdTMyIG52X3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OworCXN0cnVjdCBudl9ob3N0ICpob3N0ID0gaG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCisJaWYgKGhvc3QtPmhvc3RfZmxhZ3MgJiBOVl9IT1NUX0ZMQUdTX1NDUl9NTUlPKQorCQlyZXR1cm4gcmVhZGwoKHZvaWQqKWFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCWVsc2UKKwkJcmV0dXJuIGlubChhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworc3RhdGljIHZvaWQgbnZfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OworCXN0cnVjdCBudl9ob3N0ICpob3N0ID0gaG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuOworCisJaWYgKGhvc3QtPmhvc3RfZmxhZ3MgJiBOVl9IT1NUX0ZMQUdTX1NDUl9NTUlPKQorCQl3cml0ZWwodmFsLCAodm9pZCopYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisJZWxzZQorCQlvdXRsKHZhbCwgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2hvc3Rfc3RvcCAoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCit7CisJc3RydWN0IG52X2hvc3QgKmhvc3QgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCisJLy8gRGlzYWJsZSBob3RwbHVnIGV2ZW50IGludGVycnVwdHMuCisJaWYgKGhvc3QtPmhvc3RfZGVzYy0+ZGlzYWJsZV9ob3RwbHVnKQorCQlob3N0LT5ob3N0X2Rlc2MtPmRpc2FibGVfaG90cGx1Zyhob3N0X3NldCk7CisKKwlrZnJlZShob3N0KTsKK30KKworc3RhdGljIGludCBudl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb24gPSAwOworCXN0cnVjdCBudl9ob3N0ICpob3N0OworCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGk7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwlpbnQgcmM7CisJdTMyIGJhcjsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBpcyBhIFNBVEEgY29udHJvbGxlciBieSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGJhcnMKKyAgICAgICAgLy8gKE5WSURJQSBTQVRBIGNvbnRyb2xsZXJzIHdpbGwgYWx3YXlzIGhhdmUgc2l4IGJhcnMpLiAgT3RoZXJ3aXNlLAorICAgICAgICAvLyBpdCdzIGFuIElERSBjb250cm9sbGVyIGFuZCB3ZSBpZ25vcmUgaXQuCisJZm9yIChiYXI9MDsgYmFyPDY7IGJhcisrKQorCQlpZiAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhcikgPT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlyYyA9IC1FTk9NRU07CisKKwlwcGkgPSAmbnZfcG9ydF9pbmZvOworCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCAmcHBpKTsKKwlpZiAoIXByb2JlX2VudCkKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlob3N0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG52X2hvc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gZXJyX291dF9mcmVlX2VudDsKKworCW1lbXNldChob3N0LCAwLCBzaXplb2Yoc3RydWN0IG52X2hvc3QpKTsKKwlob3N0LT5ob3N0X2Rlc2MgPSAmbnZfZGV2aWNlX3RibFtlbnQtPmRyaXZlcl9kYXRhXTsKKworCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gaG9zdDsKKworCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgNSkgJiBJT1JFU09VUkNFX01FTSkKKwkJaG9zdC0+aG9zdF9mbGFncyB8PSBOVl9IT1NUX0ZMQUdTX1NDUl9NTUlPOworCisJaWYgKGhvc3QtPmhvc3RfZmxhZ3MgJiBOVl9IT1NUX0ZMQUdTX1NDUl9NTUlPKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZTsKKworCQlwcm9iZV9lbnQtPm1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLAorCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSkpOworCQlpZiAocHJvYmVfZW50LT5tbWlvX2Jhc2UgPT0gTlVMTCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X2ZyZWVfaG9zdDsKKwkJfQorCisJCWJhc2UgPSAodW5zaWduZWQgbG9uZylwcm9iZV9lbnQtPm1taW9fYmFzZTsKKworCQlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPQorCQkJYmFzZSArIE5WX1BPUlQwX1NDUl9SRUdfT0ZGU0VUOworCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPQorCQkJYmFzZSArIE5WX1BPUlQxX1NDUl9SRUdfT0ZGU0VUOworCX0gZWxzZSB7CisKKwkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0KKwkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSB8IE5WX1BPUlQwX1NDUl9SRUdfT0ZGU0VUOworCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPQorCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpIHwgTlZfUE9SVDFfU0NSX1JFR19PRkZTRVQ7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyYyA9IGF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJaWYgKHJjICE9IE5WX1BPUlRTKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKworCS8vIEVuYWJsZSBob3RwbHVnIGV2ZW50IGludGVycnVwdHMuCisJaWYgKGhvc3QtPmhvc3RfZGVzYy0+ZW5hYmxlX2hvdHBsdWcpCisJCWhvc3QtPmhvc3RfZGVzYy0+ZW5hYmxlX2hvdHBsdWcocHJvYmVfZW50KTsKKworCWtmcmVlKHByb2JlX2VudCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwOgorCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgTlZfSE9TVF9GTEFHU19TQ1JfTU1JTykKKwkJaW91bm1hcChwcm9iZV9lbnQtPm1taW9fYmFzZSk7CitlcnJfb3V0X2ZyZWVfaG9zdDoKKwlrZnJlZShob3N0KTsKK2Vycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCWlmICghcGNpX2Rldl9idXN5KQorCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbnZfZW5hYmxlX2hvdHBsdWcoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKK3sKKwl1OCBpbnRyX21hc2s7CisKKwlvdXRiKE5WX0lOVF9TVEFUVVNfSE9UUExVRywKKwkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyICsgTlZfSU5UX1NUQVRVUyk7CisKKwlpbnRyX21hc2sgPSBpbmIocHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyICsgTlZfSU5UX0VOQUJMRSk7CisJaW50cl9tYXNrIHw9IE5WX0lOVF9FTkFCTEVfSE9UUExVRzsKKworCW91dGIoaW50cl9tYXNrLCBwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgKyBOVl9JTlRfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgbnZfZGlzYWJsZV9ob3RwbHVnKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXU4IGludHJfbWFzazsKKworCWludHJfbWFzayA9IGluYihob3N0X3NldC0+cG9ydHNbMF0tPmlvYWRkci5zY3JfYWRkciArIE5WX0lOVF9FTkFCTEUpOworCisJaW50cl9tYXNrICY9IH4oTlZfSU5UX0VOQUJMRV9IT1RQTFVHKTsKKworCW91dGIoaW50cl9tYXNrLCBob3N0X3NldC0+cG9ydHNbMF0tPmlvYWRkci5zY3JfYWRkciArIE5WX0lOVF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBudl9jaGVja19ob3RwbHVnKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXU4IGludHJfc3RhdHVzOworCisJaW50cl9zdGF0dXMgPSBpbmIoaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfU1RBVFVTKTsKKworCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMuCisJb3V0YigweGZmLCBob3N0X3NldC0+cG9ydHNbMF0tPmlvYWRkci5zY3JfYWRkciArIE5WX0lOVF9TVEFUVVMpOworCisJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19IT1RQTFVHKSB7CisJCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfUERFVl9BRERFRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKKwkJCQkiUHJpbWFyeSBkZXZpY2UgYWRkZWRcbiIpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfUERFVl9SRU1PVkVEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgorCQkJCSJQcmltYXJ5IGRldmljZSByZW1vdmVkXG4iKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1NERVZfQURERUQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCisJCQkJIlNlY29uZGFyeSBkZXZpY2UgYWRkZWRcbiIpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfU0RFVl9SRU1PVkVEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgorCQkJCSJTZWNvbmRhcnkgZGV2aWNlIHJlbW92ZWRcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgbnZfZW5hYmxlX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocHJvYmVfZW50LT5kZXYpOworCXU4IGludHJfbWFzazsKKwl1OCByZWd2YWw7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZyZWd2YWwpOworCXJlZ3ZhbCB8PSBOVl9NQ1BfU0FUQV9DRkdfMjBfU0FUQV9TUEFDRV9FTjsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTlZfTUNQX1NBVEFfQ0ZHXzIwLCByZWd2YWwpOworCisJd3JpdGViKE5WX0lOVF9TVEFUVVNfSE9UUExVRywgcHJvYmVfZW50LT5tbWlvX2Jhc2UgKyBOVl9JTlRfU1RBVFVTX0NLODA0KTsKKworCWludHJfbWFzayA9IHJlYWRiKHByb2JlX2VudC0+bW1pb19iYXNlICsgTlZfSU5UX0VOQUJMRV9DSzgwNCk7CisJaW50cl9tYXNrIHw9IE5WX0lOVF9FTkFCTEVfSE9UUExVRzsKKworCXdyaXRlYihpbnRyX21hc2ssIHByb2JlX2VudC0+bW1pb19iYXNlICsgTlZfSU5UX0VOQUJMRV9DSzgwNCk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdF9zZXQtPmRldik7CisJdTggaW50cl9tYXNrOworCXU4IHJlZ3ZhbDsKKworCWludHJfbWFzayA9IHJlYWRiKGhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyBOVl9JTlRfRU5BQkxFX0NLODA0KTsKKworCWludHJfbWFzayAmPSB+KE5WX0lOVF9FTkFCTEVfSE9UUExVRyk7CisKKwl3cml0ZWIoaW50cl9tYXNrLCBob3N0X3NldC0+bW1pb19iYXNlICsgTlZfSU5UX0VOQUJMRV9DSzgwNCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZyZWd2YWwpOworCXJlZ3ZhbCAmPSB+TlZfTUNQX1NBVEFfQ0ZHXzIwX1NBVEFfU1BBQ0VfRU47CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgcmVndmFsKTsKK30KKworc3RhdGljIHZvaWQgbnZfY2hlY2tfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwl1OCBpbnRyX3N0YXR1czsKKworCWludHJfc3RhdHVzID0gcmVhZGIoaG9zdF9zZXQtPm1taW9fYmFzZSArIE5WX0lOVF9TVEFUVVNfQ0s4MDQpOworCisJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cy4KKwl3cml0ZWIoMHhmZiwgaG9zdF9zZXQtPm1taW9fYmFzZSArIE5WX0lOVF9TVEFUVVNfQ0s4MDQpOworCisJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19IT1RQTFVHKSB7CisJCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfUERFVl9BRERFRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKKwkJCQkiUHJpbWFyeSBkZXZpY2UgYWRkZWRcbiIpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfUERFVl9SRU1PVkVEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgorCQkJCSJQcmltYXJ5IGRldmljZSByZW1vdmVkXG4iKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1NERVZfQURERUQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCisJCQkJIlNlY29uZGFyeSBkZXZpY2UgYWRkZWRcbiIpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfU0RFVl9SRU1PVkVEKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgorCQkJCSJTZWNvbmRhcnkgZGV2aWNlIHJlbW92ZWRcbiIpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgbnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm52X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnZfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbnZfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG52X2luaXQpOworbW9kdWxlX2V4aXQobnZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhMTNlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuYwpAQCAtMCwwICsxLDY4MiBAQAorLyoKKyAqICBzYXRhX3Byb21pc2UuYyAtIFByb21pc2UgU0FUQQorICoKKyAqICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogIAkJICAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisgKgkJICAgIG9uIGVtYWlscy4KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInNhdGFfcHJvbWlzZS5oIgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3Byb21pc2UiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAxIgorCisKK2VudW0geworCVBEQ19QS1RfU1VCTUlUCQk9IDB4NDAsIC8qIENvbW1hbmQgcGFja2V0IHBvaW50ZXIgYWRkciAqLworCVBEQ19JTlRfU0VRTUFTSwkJPSAweDQwLAkvKiBNYXNrIG9mIGFzc2VydGVkIFNFUSBJTlRzICovCisJUERDX1RCR19NT0RFCQk9IDB4NDEsCS8qIFRCRyBtb2RlICovCisJUERDX0ZMQVNIX0NUTAkJPSAweDQ0LCAvKiBGbGFzaCBjb250cm9sIHJlZ2lzdGVyICovCisJUERDX1BDSV9DVEwJCT0gMHg0OCwgLyogUENJIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciAqLworCVBEQ19HTE9CQUxfQ1RMCQk9IDB4NDgsIC8qIEdsb2JhbCBjb250cm9sL3N0YXR1cyAocGVyIHBvcnQpICovCisJUERDX0NUTFNUQVQJCT0gMHg2MCwJLyogSURFIGNvbnRyb2wgYW5kIHN0YXR1cyAocGVyIHBvcnQpICovCisJUERDX1NBVEFfUExVR19DU1IJPSAweDZDLCAvKiBTQVRBIFBsdWcgY29udHJvbC9zdGF0dXMgcmVnICovCisJUERDX1NMRVdfQ1RMCQk9IDB4NDcwLCAvKiBzbGV3IHJhdGUgY29udHJvbCByZWcgKi8KKworCVBEQ19FUlJfTUFTSwkJPSAoMTw8MTkpIHwgKDE8PDIwKSB8ICgxPDwyMSkgfCAoMTw8MjIpIHwKKwkJCQkgICgxPDw4KSB8ICgxPDw5KSB8ICgxPDwxMCksCisKKwlib2FyZF8yMDM3eAkJPSAwLAkvKiBGYXN0VHJhayBTMTUwIFRYMnBsdXMgKi8KKwlib2FyZF8yMDMxOQkJPSAxLAkvKiBGYXN0VHJhayBTMTUwIFRYNCAqLworCisJUERDX0hBU19QQVRBCQk9ICgxIDw8IDEpLCAvKiBQREMyMDM3NSBoYXMgUEFUQSAqLworCisJUERDX1JFU0VUCQk9ICgxIDw8IDExKSwgLyogSERNQSByZXNldCAqLworfTsKKworCitzdHJ1Y3QgcGRjX3BvcnRfcHJpdiB7CisJdTgJCQkqcGt0OworCWRtYV9hZGRyX3QJCXBrdF9kbWE7Cit9OworCitzdGF0aWMgdTMyIHBkY19zYXRhX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKTsKK3N0YXRpYyB2b2lkIHBkY19zYXRhX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IHBkY19hdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwZGNfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgcGRjX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwZGNfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcGRjX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkY19xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgcGRjX3RmX2xvYWRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CitzdGF0aWMgdm9pZCBwZGNfZXhlY19jb21tYW5kX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOworc3RhdGljIHZvaWQgcGRjX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgcGRjX3FjX2lzc3VlX3Byb3Qoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgcGRjX2F0YV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGRjX2F0YV9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCS50Zl9sb2FkCQk9IHBkY190Zl9sb2FkX21taW8sCisJLnRmX3JlYWQJCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gcGRjX2V4ZWNfY29tbWFuZF9tbWlvLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkucGh5X3Jlc2V0CQk9IHBkY19waHlfcmVzZXQsCisJLnFjX3ByZXAJCT0gcGRjX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IHBkY19xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBwZGNfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IHBkY19pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBwZGNfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBwZGNfc2F0YV9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IHBkY19zYXRhX3Njcl93cml0ZSwKKwkucG9ydF9zdGFydAkJPSBwZGNfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IHBkY19wb3J0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gcGRjX3BvcnRfaW5mb1tdID0geworCS8qIGJvYXJkXzIwMzd4ICovCisJeworCQkuc2h0CQk9ICZwZGNfYXRhX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19NTUlPLAorCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZwZGNfYXRhX29wcywKKwl9LAorCisJLyogYm9hcmRfMjAzMTkgKi8KKwl7CisJCS5zaHQJCT0gJnBkY19hdGFfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX01NSU8sCisJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLworCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCisJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KKwkJLnBvcnRfb3BzCT0gJnBkY19hdGFfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGRjX2F0YV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzM3MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzd4IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzM3MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzd4IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzM3NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzd4IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzM3NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzd4IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4MzU3NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzd4IH0sCisJeyBQQ0lfVkVORE9SX0lEX1BST01JU0UsIDB4M2Q3NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkXzIwMzd4IH0sCisKKwl7IFBDSV9WRU5ET1JfSURfUFJPTUlTRSwgMHgzMzE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfMjAzMTkgfSwKKwl7IFBDSV9WRU5ET1JfSURfUFJPTUlTRSwgMHgzMzE5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfMjAzMTkgfSwKKwl7IFBDSV9WRU5ET1JfSURfUFJPTUlTRSwgMHgzZDE4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfMjAzMTkgfSwKKworCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGRjX2F0YV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gcGRjX2F0YV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gcGRjX2F0YV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCisKK3N0YXRpYyBpbnQgcGRjX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHA7CisJaW50IHJjOworCisJcmMgPSBhdGFfcG9ydF9zdGFydChhcCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwcCA9IGttYWxsb2Moc2l6ZW9mKCpwcCksIEdGUF9LRVJORUwpOworCWlmICghcHApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW1lbXNldChwcCwgMCwgc2l6ZW9mKCpwcCkpOworCisJcHAtPnBrdCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIDEyOCwgJnBwLT5wa3RfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwLT5wa3QpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfa2ZyZWU7CisJfQorCisJYXAtPnByaXZhdGVfZGF0YSA9IHBwOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfa2ZyZWU6CisJa2ZyZWUocHApOworZXJyX291dDoKKwlhdGFfcG9ydF9zdG9wKGFwKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgcGRjX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OworCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwlhcC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIDEyOCwgcHAtPnBrdCwgcHAtPnBrdF9kbWEpOworCWtmcmVlKHBwKTsKKwlhdGFfcG9ydF9zdG9wKGFwKTsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfcmVzZXRfcG9ydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgKm1taW8gPSAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX0NUTFNUQVQ7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHRtcDsKKworCWZvciAoaSA9IDExOyBpID4gMDsgaS0tKSB7CisJCXRtcCA9IHJlYWRsKG1taW8pOworCQlpZiAodG1wICYgUERDX1JFU0VUKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwMCk7CisKKwkJdG1wIHw9IFBEQ19SRVNFVDsKKwkJd3JpdGVsKHRtcCwgbW1pbyk7CisJfQorCisJdG1wICY9IH5QRENfUkVTRVQ7CisJd3JpdGVsKHRtcCwgbW1pbyk7CisJcmVhZGwobW1pbyk7CS8qIGZsdXNoICovCit9CisKK3N0YXRpYyB2b2lkIHBkY19waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlwZGNfcmVzZXRfcG9ydChhcCk7CisJc2F0YV9waHlfcmVzZXQoYXApOworfQorCitzdGF0aWMgdTMyIHBkY19zYXRhX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfc2F0YV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsCisJCQkgICAgICAgdTMyIHZhbCkKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybjsKKwl3cml0ZWwodmFsLCAodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworc3RhdGljIHZvaWQgcGRjX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHAgPSBxYy0+YXAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJCWF0YV9xY19wcmVwKHFjKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJaSA9IHBkY19wa3RfaGVhZGVyKCZxYy0+dGYsIHFjLT5hcC0+cHJkX2RtYSwKKwkJCQkgICBxYy0+ZGV2LT5kZXZubywgcHAtPnBrdCk7CisKKwkJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkKKwkJCWkgPSBwZGNfcHJlcF9sYmE0OCgmcWMtPnRmLCBwcC0+cGt0LCBpKTsKKwkJZWxzZQorCQkJaSA9IHBkY19wcmVwX2xiYTI4KCZxYy0+dGYsIHBwLT5wa3QsIGkpOworCisJCXBkY19wa3RfZm9vdGVyKCZxYy0+dGYsIHBwLT5wa3QsIGkpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcGRjX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTggZHJ2X3N0YXQ7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJaWYgKCFxYykgeworCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBCVUc6IHRpbWVvdXQgd2l0aG91dCBjb21tYW5kXG4iLAorCQkgICAgICAgYXAtPmlkKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogaGFjayBhbGVydCEgIFdlIGNhbm5vdCB1c2UgdGhlIHN1cHBsaWVkIGNvbXBsZXRpb24KKwkgKiBmdW5jdGlvbiBmcm9tIGluc2lkZSB0aGUgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgdGhyZWFkLgorCSAqIGxpYmF0YSBpcyB0aGUgb25seSB1c2VyIG9mIC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcigpIGluCisJICogYW55IGtlcm5lbCwgc28gdGhlIGRlZmF1bHQgc2NzaV9kb25lKCkgYXNzdW1lcyBpdCBpcworCSAqIG5vdCBiZWluZyBjYWxsZWQgZnJvbSB0aGUgU0NTSSBFSC4KKwkgKi8KKwlxYy0+c2NzaWRvbmUgPSBzY3NpX2ZpbmlzaF9jb21tYW5kOworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogY29tbWFuZCB0aW1lb3V0XG4iLCBhcC0+aWQpOworCQlhdGFfcWNfY29tcGxldGUocWMsIGF0YV93YWl0X2lkbGUoYXApIHwgQVRBX0VSUik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHJ2X3N0YXQgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSB8IEFUQV9EUlEsIDEwMDApOworCisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IHVua25vd24gdGltZW91dCwgY21kIDB4JXggc3RhdCAweCV4XG4iLAorCQkgICAgICAgYXAtPmlkLCBxYy0+dGYuY29tbWFuZCwgZHJ2X3N0YXQpOworCisJCWF0YV9xY19jb21wbGV0ZShxYywgZHJ2X3N0YXQpOworCQlicmVhazsKKwl9CisKK291dDoKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjX2hvc3RfaW50ciggc3RydWN0IGF0YV9wb3J0ICphcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJdTggc3RhdHVzOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMCwgaGF2ZV9lcnIgPSAwOworCXUzMiB0bXA7CisJdm9pZCAqbW1pbyA9ICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfR0xPQkFMX0NUTDsKKworCXRtcCA9IHJlYWRsKG1taW8pOworCWlmICh0bXAgJiBQRENfRVJSX01BU0spIHsKKwkJaGF2ZV9lcnIgPSAxOworCQlwZGNfcmVzZXRfcG9ydChhcCk7CisJfQorCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJc3RhdHVzID0gYXRhX3dhaXRfaWRsZShhcCk7CisJCWlmIChoYXZlX2VycikKKwkJCXN0YXR1cyB8PSBBVEFfRVJSOworCQlhdGFfcWNfY29tcGxldGUocWMsIHN0YXR1cyk7CisJCWhhbmRsZWQgPSAxOworCQlicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFwLT5zdGF0cy5pZGxlX2lycSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHBkY19pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGFwLT5ob3N0X3NldDsKKwl2b2lkICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKworCXJlYWRsKG1taW8gKyBQRENfSU5UX1NFUU1BU0spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGRjX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXUzMiBtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgaSwgdG1wOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwl2b2lkICptbWlvX2Jhc2U7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlpZiAoIWhvc3Rfc2V0IHx8ICFob3N0X3NldC0+bW1pb19iYXNlKSB7CisJCVZQUklOVEsoIlFVSUNLIEVYSVRcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbW1pb19iYXNlID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKworCS8qIHJlYWRpbmcgc2hvdWxkIGFsc28gY2xlYXIgaW50ZXJydXB0cyAqLworCW1hc2sgPSByZWFkbChtbWlvX2Jhc2UgKyBQRENfSU5UX1NFUU1BU0spOworCisJaWYgKG1hc2sgPT0gMHhmZmZmZmZmZikgeworCQlWUFJJTlRLKCJRVUlDSyBFWElUIDJcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCW1hc2sgJj0gMHhmZmZmOwkJLyogb25seSAxNiB0YWdzIHBvc3NpYmxlICovCisJaWYgKCFtYXNrKSB7CisJCVZQUklOVEsoIlFVSUNLIEVYSVQgM1xuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCXdyaXRlbChtYXNrLCBtbWlvX2Jhc2UgKyBQRENfSU5UX1NFUU1BU0spOworCisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspIHsKKwkJVlBSSU5USygicG9ydCAldVxuIiwgaSk7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCQl0bXAgPSBtYXNrICYgKDEgPDwgKGkgKyAxKSk7CisJCWlmICh0bXAgJiYgYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQorCQkJCWhhbmRsZWQgKz0gcGRjX2hvc3RfaW50cihhcCwgcWMpOworCQl9CisJfQorCisgICAgICAgIHNwaW5fdW5sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwlWUFJJTlRLKCJFWElUXG4iKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGRjX3BhY2tldF9zdGFydChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IHBkY19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9ubyA9IGFwLT5wb3J0X25vOworCXU4IHNlcSA9ICh1OCkgKHBvcnRfbm8gKyAxKTsKKworCVZQUklOVEsoIkVOVEVSLCBhcCAlcFxuIiwgYXApOworCisJd3JpdGVsKDB4MDAwMDAwMDEsIGFwLT5ob3N0X3NldC0+bW1pb19iYXNlICsgKHNlcSAqIDQpKTsKKwlyZWFkbChhcC0+aG9zdF9zZXQtPm1taW9fYmFzZSArIChzZXEgKiA0KSk7CS8qIGZsdXNoICovCisKKwlwcC0+cGt0WzJdID0gc2VxOworCXdtYigpOwkJCS8qIGZsdXNoIFBSRCwgcGt0IHdyaXRlcyAqLworCXdyaXRlbChwcC0+cGt0X2RtYSwgKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19QS1RfU1VCTUlUKTsKKwlyZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX1BLVF9TVUJNSVQpOyAvKiBmbHVzaCAqLworfQorCitzdGF0aWMgaW50IHBkY19xY19pc3N1ZV9wcm90KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJcGRjX3BhY2tldF9zdGFydChxYyk7CisJCXJldHVybiAwOworCisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCUJVRygpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBhdGFfcWNfaXNzdWVfcHJvdChxYyk7Cit9CisKK3N0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJV0FSTl9PTiAodGYtPnByb3RvY29sID09IEFUQV9QUk9UX0RNQSB8fAorCQkgdGYtPnByb3RvY29sID09IEFUQV9QUk9UX05PREFUQSk7CisJYXRhX3RmX2xvYWQoYXAsIHRmKTsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfZXhlY19jb21tYW5kX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJV0FSTl9PTiAodGYtPnByb3RvY29sID09IEFUQV9QUk9UX0RNQSB8fAorCQkgdGYtPnByb3RvY29sID09IEFUQV9QUk9UX05PREFUQSk7CisJYXRhX2V4ZWNfY29tbWFuZChhcCwgdGYpOworfQorCisKK3N0YXRpYyB2b2lkIHBkY19hdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlOworCXBvcnQtPmRhdGFfYWRkcgkJPSBiYXNlOworCXBvcnQtPmZlYXR1cmVfYWRkcgk9CisJcG9ydC0+ZXJyb3JfYWRkcgk9IGJhc2UgKyAweDQ7CisJcG9ydC0+bnNlY3RfYWRkcgk9IGJhc2UgKyAweDg7CisJcG9ydC0+bGJhbF9hZGRyCQk9IGJhc2UgKyAweGM7CisJcG9ydC0+bGJhbV9hZGRyCQk9IGJhc2UgKyAweDEwOworCXBvcnQtPmxiYWhfYWRkcgkJPSBiYXNlICsgMHgxNDsKKwlwb3J0LT5kZXZpY2VfYWRkcgk9IGJhc2UgKyAweDE4OworCXBvcnQtPmNvbW1hbmRfYWRkcgk9CisJcG9ydC0+c3RhdHVzX2FkZHIJPSBiYXNlICsgMHgxYzsKKwlwb3J0LT5hbHRzdGF0dXNfYWRkcgk9CisJcG9ydC0+Y3RsX2FkZHIJCT0gYmFzZSArIDB4Mzg7Cit9CisKKworc3RhdGljIHZvaWQgcGRjX2hvc3RfaW5pdCh1bnNpZ25lZCBpbnQgY2hpcF9pZCwgc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXUzMiB0bXA7CisKKwkvKgorCSAqIEV4Y2VwdCBmb3IgdGhlIGhvdHBsdWcgc3R1ZmYsIHRoaXMgaXMgdm9vZG9vIGZyb20gdGhlCisJICogUHJvbWlzZSBkcml2ZXIuICBMYWJlbCB0aGlzIGVudGlyZSBzZWN0aW9uCisJICogIlRPRE86IGZpZ3VyZSBvdXQgd2h5IHdlIGRvIHRoaXMiCisJICovCisKKwkvKiBjaGFuZ2UgRklGT19TSEQgdG8gOCBkd29yZHMsIGVuYWJsZSBCTVJfQlVSU1QgKi8KKwl0bXAgPSByZWFkbChtbWlvICsgUERDX0ZMQVNIX0NUTCk7CisJdG1wIHw9IDB4MTIwMDA7CS8qIGJpdCAxNiAoZmlmbyA4IGR3KSBhbmQgMTMgKGJtciBidXJzdD8pICovCisJd3JpdGVsKHRtcCwgbW1pbyArIFBEQ19GTEFTSF9DVEwpOworCisJLyogY2xlYXIgcGx1Zy91bnBsdWcgZmxhZ3MgZm9yIGFsbCBwb3J0cyAqLworCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfU0FUQV9QTFVHX0NTUik7CisJd3JpdGVsKHRtcCB8IDB4ZmYsIG1taW8gKyBQRENfU0FUQV9QTFVHX0NTUik7CisKKwkvKiBtYXNrIHBsdWcvdW5wbHVnIGludHMgKi8KKwl0bXAgPSByZWFkbChtbWlvICsgUERDX1NBVEFfUExVR19DU1IpOworCXdyaXRlbCh0bXAgfCAweGZmMDAwMCwgbW1pbyArIFBEQ19TQVRBX1BMVUdfQ1NSKTsKKworCS8qIHJlZHVjZSBUQkcgY2xvY2sgdG8gMTMzIE1oei4gKi8KKwl0bXAgPSByZWFkbChtbWlvICsgUERDX1RCR19NT0RFKTsKKwl0bXAgJj0gfjB4MzAwMDA7IC8qIGNsZWFyIGJpdCAxNywgMTYqLworCXRtcCB8PSAweDEwMDAwOyAgLyogc2V0IGJpdCAxNzoxNiA9IDA6MSAqLworCXdyaXRlbCh0bXAsIG1taW8gKyBQRENfVEJHX01PREUpOworCisJcmVhZGwobW1pbyArIFBEQ19UQkdfTU9ERSk7CS8qIGZsdXNoICovCisJbXNsZWVwKDEwKTsKKworCS8qIGFkanVzdCBzbGV3IHJhdGUgY29udHJvbCByZWdpc3Rlci4gKi8KKwl0bXAgPSByZWFkbChtbWlvICsgUERDX1NMRVdfQ1RMKTsKKwl0bXAgJj0gMHhGRkZGRjAzRjsgLyogY2xlYXIgYml0IDExIH4gNiAqLworCXRtcCAgfD0gMHgwMDAwMDkwMDsgLyogc2V0IGJpdCAxMS05ID0gMTAwYiAsIGJpdCA4LTYgPSAxMDAgKi8KKwl3cml0ZWwodG1wLCBtbWlvICsgUERDX1NMRVdfQ1RMKTsKK30KKworc3RhdGljIGludCBwZGNfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdm9pZCAqbW1pb19iYXNlOworCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBwY2lfZGV2X2J1c3kgPSAwOworCWludCByYzsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJLyoKKwkgKiBJZiB0aGlzIGRyaXZlciBoYXBwZW5zIHRvIG9ubHkgYmUgdXNlZnVsIG9uIEFwcGxlJ3MgSzIsIHRoZW4KKwkgKiB3ZSBzaG91bGQgY2hlY2sgdGhhdCBoZXJlIGFzIGl0IGhhcyBhIG5vcm1hbCBTZXJ2ZXJ3b3JrcyBJRAorCSAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksCisJCSAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMykpOworCWlmIChtbWlvX2Jhc2UgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2VudDsKKwl9CisJYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBtbWlvX2Jhc2U7CisKKwlwcm9iZV9lbnQtPnNodAkJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OworCXByb2JlX2VudC0+aG9zdF9mbGFncwk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5ob3N0X2ZsYWdzOworCXByb2JlX2VudC0+cGlvX21hc2sJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7CisJcHJvYmVfZW50LT5td2RtYV9tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLm13ZG1hX21hc2s7CisJcHJvYmVfZW50LT51ZG1hX21hc2sJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0udWRtYV9tYXNrOworCXByb2JlX2VudC0+cG9ydF9vcHMJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7CisKKyAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisKKwlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFswXSwgYmFzZSArIDB4MjAwKTsKKwlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgYmFzZSArIDB4MjgwKTsKKworCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9IGJhc2UgKyAweDQwMDsKKwlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBiYXNlICsgMHg1MDA7CisKKwkvKiBub3RpY2UgNC1wb3J0IGJvYXJkcyAqLworCXN3aXRjaCAoYm9hcmRfaWR4KSB7CisJY2FzZSBib2FyZF8yMDMxOToKKyAgICAgICAJCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CisKKwkJcGRjX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMl0sIGJhc2UgKyAweDMwMCk7CisJCXBkY19hdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzNdLCBiYXNlICsgMHgzODApOworCisJCXByb2JlX2VudC0+cG9ydFsyXS5zY3JfYWRkciA9IGJhc2UgKyAweDYwMDsKKwkJcHJvYmVfZW50LT5wb3J0WzNdLnNjcl9hZGRyID0gYmFzZSArIDB4NzAwOworCQlicmVhazsKKwljYXNlIGJvYXJkXzIwMzd4OgorICAgICAgIAkJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCisJcGRjX2hvc3RfaW5pdChib2FyZF9pZHgsIHByb2JlX2VudCk7CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBwZGNfYXRhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwZGNfYXRhX3BjaV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwZGNfYXRhX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBkY19hdGFfcGNpX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUHJvbWlzZSBTQVRBIFRYMi9UWDQgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBkY19hdGFfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KHBkY19hdGFfaW5pdCk7Cittb2R1bGVfZXhpdChwZGNfYXRhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5oIGIvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2U5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiAgc2F0YV9wcm9taXNlLmggLSBQcm9taXNlIFNBVEEgY29tbW9uIGRlZmluaXRpb25zIGFuZCBpbmxpbmUgZnVuY3MKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpZm5kZWYgX19TQVRBX1BST01JU0VfSF9fCisjZGVmaW5lIF9fU0FUQV9QUk9NSVNFX0hfXworCisjaW5jbHVkZSA8bGludXgvYXRhLmg+CisKK2VudW0gcGRjX3BhY2tldF9iaXRzIHsKKwlQRENfUEtUX1JFQUQJCT0gKDEgPDwgMiksCisJUERDX1BLVF9OT0RBVEEJCT0gKDEgPDwgMyksCisKKwlQRENfUEtUX1NJWkVNQVNLCT0gKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDUpLAorCVBEQ19QS1RfQ0xFQVJfQlNZCT0gKDEgPDwgNCksCisJUERDX1BLVF9XQUlUX0RSRFkJPSAoMSA8PCAzKSB8ICgxIDw8IDQpLAorCVBEQ19MQVNUX1JFRwkJPSAoMSA8PCAzKSwKKworCVBEQ19SRUdfREVWQ1RMCQk9ICgxIDw8IDMpIHwgKDEgPDwgMikgfCAoMSA8PCAxKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBkY19wa3RfaGVhZGVyKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLAorCQkJCQkgIGRtYV9hZGRyX3Qgc2dfdGFibGUsCisJCQkJCSAgdW5zaWduZWQgaW50IGRldm5vLCB1OCAqYnVmKQoreworCXU4IGRldl9yZWc7CisJdTMyICpidWYzMiA9ICh1MzIgKikgYnVmOworCisJLyogc2V0IGNvbnRyb2wgYml0cyAoYnl0ZSAwKSwgemVybyBkZWxheSBzZXEgaWQgKGJ5dGUgMyksCisJICogYW5kIHNlcSBpZCAoYnl0ZSAyKQorCSAqLworCXN3aXRjaCAodGYtPnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJCWlmICghKHRmLT5mbGFncyAmIEFUQV9URkxBR19XUklURSkpCisJCQlidWYzMlswXSA9IGNwdV90b19sZTMyKFBEQ19QS1RfUkVBRCk7CisJCWVsc2UKKwkJCWJ1ZjMyWzBdID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJYnVmMzJbMF0gPSBjcHVfdG9fbGUzMihQRENfUEtUX05PREFUQSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCWJ1ZjMyWzFdID0gY3B1X3RvX2xlMzIoc2dfdGFibGUpOwkvKiBTL0cgdGFibGUgYWRkciAqLworCWJ1ZjMyWzJdID0gMDsJCQkJLyogbm8gbmV4dC1wYWNrZXQgKi8KKworCWlmIChkZXZubyA9PSAwKQorCQlkZXZfcmVnID0gQVRBX0RFVklDRV9PQlM7CisJZWxzZQorCQlkZXZfcmVnID0gQVRBX0RFVklDRV9PQlMgfCBBVEFfREVWMTsKKworCS8qIHNlbGVjdCBkZXZpY2UgKi8KKwlidWZbMTJdID0gKDEgPDwgNSkgfCBQRENfUEtUX0NMRUFSX0JTWSB8IEFUQV9SRUdfREVWSUNFOworCWJ1ZlsxM10gPSBkZXZfcmVnOworCisJLyogZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlidWZbMTRdID0gKDEgPDwgNSkgfCBQRENfUkVHX0RFVkNUTDsKKwlidWZbMTVdID0gdGYtPmN0bDsKKworCXJldHVybiAxNjsgCS8qIG9mZnNldCBvZiBuZXh0IGJ5dGUgKi8KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjX3BrdF9mb290ZXIoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHU4ICpidWYsCisJCQkJICB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0RFVklDRSkgeworCQlidWZbaSsrXSA9ICgxIDw8IDUpIHwgQVRBX1JFR19ERVZJQ0U7CisJCWJ1ZltpKytdID0gdGYtPmRldmljZTsKKwl9CisKKwkvKiBhbmQgZmluYWxseSB0aGUgY29tbWFuZCBpdHNlbGY7IGFsc28gaW5jbHVkZXMgZW5kLW9mLXBrdCBtYXJrZXIgKi8KKwlidWZbaSsrXSA9ICgxIDw8IDUpIHwgUERDX0xBU1RfUkVHIHwgQVRBX1JFR19DTUQ7CisJYnVmW2krK10gPSB0Zi0+Y29tbWFuZDsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwZGNfcHJlcF9sYmEyOChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGkpCit7CisJLyogdGhlICIoMSA8PCA1KSIgc2hvdWxkIGJlIHJlYWQgIihjb3VudCA8PCA1KSIgKi8KKworCS8qIEFUQSBjb21tYW5kIGJsb2NrIHJlZ2lzdGVycyAqLworCWJ1ZltpKytdID0gKDEgPDwgNSkgfCBBVEFfUkVHX0ZFQVRVUkU7CisJYnVmW2krK10gPSB0Zi0+ZmVhdHVyZTsKKworCWJ1ZltpKytdID0gKDEgPDwgNSkgfCBBVEFfUkVHX05TRUNUOworCWJ1ZltpKytdID0gdGYtPm5zZWN0OworCisJYnVmW2krK10gPSAoMSA8PCA1KSB8IEFUQV9SRUdfTEJBTDsKKwlidWZbaSsrXSA9IHRmLT5sYmFsOworCisJYnVmW2krK10gPSAoMSA8PCA1KSB8IEFUQV9SRUdfTEJBTTsKKwlidWZbaSsrXSA9IHRmLT5sYmFtOworCisJYnVmW2krK10gPSAoMSA8PCA1KSB8IEFUQV9SRUdfTEJBSDsKKwlidWZbaSsrXSA9IHRmLT5sYmFoOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBkY19wcmVwX2xiYTQ4KHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgaSkKK3sKKwkvKiB0aGUgIigyIDw8IDUpIiBzaG91bGQgYmUgcmVhZCAiKGNvdW50IDw8IDUpIiAqLworCisJLyogQVRBIGNvbW1hbmQgYmxvY2sgcmVnaXN0ZXJzICovCisJYnVmW2krK10gPSAoMiA8PCA1KSB8IEFUQV9SRUdfRkVBVFVSRTsKKwlidWZbaSsrXSA9IHRmLT5ob2JfZmVhdHVyZTsKKwlidWZbaSsrXSA9IHRmLT5mZWF0dXJlOworCisJYnVmW2krK10gPSAoMiA8PCA1KSB8IEFUQV9SRUdfTlNFQ1Q7CisJYnVmW2krK10gPSB0Zi0+aG9iX25zZWN0OworCWJ1ZltpKytdID0gdGYtPm5zZWN0OworCisJYnVmW2krK10gPSAoMiA8PCA1KSB8IEFUQV9SRUdfTEJBTDsKKwlidWZbaSsrXSA9IHRmLT5ob2JfbGJhbDsKKwlidWZbaSsrXSA9IHRmLT5sYmFsOworCisJYnVmW2krK10gPSAoMiA8PCA1KSB8IEFUQV9SRUdfTEJBTTsKKwlidWZbaSsrXSA9IHRmLT5ob2JfbGJhbTsKKwlidWZbaSsrXSA9IHRmLT5sYmFtOworCisJYnVmW2krK10gPSAoMiA8PCA1KSB8IEFUQV9SRUdfTEJBSDsKKwlidWZbaSsrXSA9IHRmLT5ob2JfbGJhaDsKKwlidWZbaSsrXSA9IHRmLT5sYmFoOworCisJcmV0dXJuIGk7Cit9CisKKworI2VuZGlmIC8qIF9fU0FUQV9QUk9NSVNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfcXN0b3IuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkMzYyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMKQEAgLTAsMCArMSw3MTggQEAKKy8qCisgKiAgc2F0YV9xc3Rvci5jIC0gUGFjaWZpYyBEaWdpdGFsIENvcnBvcmF0aW9uIFFTdG9yIFNBVEEKKyAqCisgKiAgTWFpbnRhaW5lZCBieTogIE1hcmsgTG9yZCA8bWxvcmRAcG9ib3guY29tPgorICoKKyAqICBDb3B5cmlnaHQgMjAwNSBQYWNpZmljIERpZ2l0YWwgQ29ycG9yYXRpb24uCisgKiAgKE9TTC9HUEwgY29kZSByZWxlYXNlIGF1dGhvcml6ZWQgYnkgSmFsaWwgRmFkYXZpKS4KKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICogIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEgdGhhdCBjYW4gYmUgZm91bmQgYXQKKyAqICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAqICBieSByZWZlcmVuY2UuCisgKgorICogIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSBhcyBkaXN0cmlidXRlZAorICogIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICogIHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICogIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4KKyAqICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgKiAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfcXN0b3IiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjA0IgorCitlbnVtIHsKKwlRU19QT1JUUwkJPSA0LAorCVFTX01BWF9QUkQJCT0gTElCQVRBX01BWF9QUkQsCisJUVNfQ1BCX09SREVSCQk9IDYsCisJUVNfQ1BCX0JZVEVTCQk9ICgxIDw8IFFTX0NQQl9PUkRFUiksCisJUVNfUFJEX0JZVEVTCQk9IFFTX01BWF9QUkQgKiAxNiwKKwlRU19QS1RfQllURVMJCT0gUVNfQ1BCX0JZVEVTICsgUVNfUFJEX0JZVEVTLAorCisJUVNfRE1BX0JPVU5EQVJZCQk9IH4wVUwsCisKKwkvKiBnbG9iYWwgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCVFTX0hDRl9DTkZHMwkJPSAweDAwMDMsIC8qIGhvc3QgY29uZmlndXJhdGlvbiBvZmZzZXQgKi8KKwlRU19ISURfSFBIWQkJPSAweDAwMDQsIC8qIGhvc3QgcGh5c2ljYWwgaW50ZXJmYWNlIGluZm8gKi8KKwlRU19IQ1RfQ1RSTAkJPSAweDAwZTQsIC8qIGdsb2JhbCBpbnRlcnJ1cHQgbWFzayBvZmZzZXQgKi8KKwlRU19IU1RfU0ZGCQk9IDB4MDEwMCwgLyogaG9zdCBzdGF0dXMgZmlmbyBvZmZzZXQgKi8KKwlRU19IVlNfU0VSRDMJCT0gMHgwMzkzLCAvKiBQSFkgZW5hYmxlIG9mZnNldCAqLworCisJLyogZ2xvYmFsIGNvbnRyb2wgYml0cyAqLworCVFTX0hQSFlfNjRCSVQJCT0gKDEgPDwgMSksIC8qIDY0LWJpdCBidXMgZGV0ZWN0ZWQgKi8KKwlRU19DTkZHM19HU1JTVAkJPSAweDAxLCAgICAgLyogZ2xvYmFsIGNoaXAgcmVzZXQgKi8KKwlRU19TRVJEM19QSFlfRU5BCT0gMHhmMCwgICAgIC8qIFBIWSBkZXRlY3Rpb24gRU5BYmxlKi8KKworCS8qIHBlci1jaGFubmVsIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwlRU19DQ0ZfQ1BCQQkJPSAweDA3MTAsIC8qIGNoYW4gQ1BCIGJhc2UgYWRkcmVzcyAqLworCVFTX0NDRl9DU0VQCQk9IDB4MDcxOCwgLyogY2hhbiBDUEIgc2VwYXJhdGlvbiBmYWN0b3IgKi8KKwlRU19DRkNfSFVGVAkJPSAweDA4MDAsIC8qIGhvc3QgdXBzdHJlYW0gZmlmbyB0aHJlc2hvbGQgKi8KKwlRU19DRkNfSERGVAkJPSAweDA4MDQsIC8qIGhvc3QgZG93bnN0cmVhbSBmaWZvIHRocmVzaG9sZCAqLworCVFTX0NGQ19EVUZUCQk9IDB4MDgwOCwgLyogZGV2IHVwc3RyZWFtIGZpZm8gdGhyZXNob2xkICovCisJUVNfQ0ZDX0RERlQJCT0gMHgwODBjLCAvKiBkZXYgZG93bnN0cmVhbSBmaWZvIHRocmVzaG9sZCAqLworCVFTX0NDVF9DVFIwCQk9IDB4MDkwMCwgLyogY2hhbiBjb250cm9sLTAgb2Zmc2V0ICovCisJUVNfQ0NUX0NUUjEJCT0gMHgwOTAxLCAvKiBjaGFuIGNvbnRyb2wtMSBvZmZzZXQgKi8KKwlRU19DQ1RfQ0ZGCQk9IDB4MGEwMCwgLyogY2hhbiBjb21tYW5kIGZpZm8gb2Zmc2V0ICovCisKKwkvKiBjaGFubmVsIGNvbnRyb2wgYml0cyAqLworCVFTX0NUUjBfUkVHCQk9ICgxIDw8IDEpLCAgIC8qIHJlZ2lzdGVyIG1vZGUgKHZzLiBwa3QgbW9kZSkgKi8KKwlRU19DVFIwX0NMRVIJCT0gKDEgPDwgMiksICAgLyogY2xlYXIgY2hhbm5lbCBlcnJvcnMgKi8KKwlRU19DVFIxX1JERVYJCT0gKDEgPDwgMSksICAgLyogc2F0YSBwaHkvY29tbXMgcmVzZXQgKi8KKwlRU19DVFIxX1JDSE4JCT0gKDEgPDwgNCksICAgLyogcmVzZXQgY2hhbm5lbCBsb2dpYyAqLworCVFTX0NDRl9SVU5fUEtUCQk9IDB4MTA3LCAgICAgIC8qIFJVTiBhIG5ldyBkbWEgUEtUICovCisKKwkvKiBwa3Qgc3ViLWZpZWxkIGhlYWRlcnMgKi8KKwlRU19IQ0JfSERSCQk9IDB4MDEsICAgLyogSG9zdCBDb250cm9sIEJsb2NrIGhlYWRlciAqLworCVFTX0RDQl9IRFIJCT0gMHgwMiwgICAvKiBEZXZpY2UgQ29udHJvbCBCbG9jayBoZWFkZXIgKi8KKworCS8qIHBrdCBIQ0IgZmxhZyBiaXRzICovCisJUVNfSEZfRElSTwkJPSAoMSA8PCAwKSwgICAvKiBkYXRhIERJUmVjdGlvbiBPdXQgKi8KKwlRU19IRl9EQVQJCT0gKDEgPDwgMyksICAgLyogREFUYSBwa3QgKi8KKwlRU19IRl9JRU4JCT0gKDEgPDwgNCksICAgLyogSW50ZXJydXB0IEVOYWJsZSAqLworCVFTX0hGX1ZMRAkJPSAoMSA8PCA1KSwgICAvKiBWYUxpRCBwa3QgKi8KKworCS8qIHBrdCBEQ0IgZmxhZyBiaXRzICovCisJUVNfREZfUE9SRAkJPSAoMSA8PCAyKSwgICAvKiBQaW8gT1IgRG1hICovCisJUVNfREZfRUxCQQkJPSAoMSA8PCAzKSwgICAvKiBFeHRlbmRlZCBMQkEgKGxiYTQ4KSAqLworCisJLyogUENJIGRldmljZSBJRHMgKi8KKwlib2FyZF8yMDY4X2lkeAkJPSAwLAkvKiBRU3RvciA0LXBvcnQgU0FUQS9SQUlEICovCit9OworCit0eXBlZGVmIGVudW0geyBxc19zdGF0ZV9pZGxlLCBxc19zdGF0ZV9wa3QsIHFzX3N0YXRlX21taW8gfSBxc19zdGF0ZV90OworCitzdHJ1Y3QgcXNfcG9ydF9wcml2IHsKKwl1OAkJCSpwa3Q7CisJZG1hX2FkZHJfdAkJcGt0X2RtYTsKKwlxc19zdGF0ZV90CQlzdGF0ZTsKK307CisKK3N0YXRpYyB1MzIgcXNfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOworc3RhdGljIHZvaWQgcXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKK3N0YXRpYyBpbnQgcXNfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcXNfaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHFzX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBxc19ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworc3RhdGljIHZvaWQgcXNfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcXNfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcXNfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyBpbnQgcXNfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgaW50IHFzX2NoZWNrX2F0YXBpX2RtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyB2b2lkIHFzX2JtZG1hX3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdTggcXNfYm1kbWFfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcXNfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcXNfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgcXNfYXRhX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IFFTX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkvL0ZJWE1FIC51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gUVNfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHFzX2F0YV9vcHMgPSB7CisJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAorCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuY2hlY2tfYXRhcGlfZG1hCT0gcXNfY2hlY2tfYXRhcGlfZG1hLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBxc19waHlfcmVzZXQsCisJLnFjX3ByZXAJCT0gcXNfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gcXNfcWNfaXNzdWUsCisJLmVuZ190aW1lb3V0CQk9IHFzX2VuZ190aW1lb3V0LAorCS5pcnFfaGFuZGxlcgkJPSBxc19pbnRyLAorCS5pcnFfY2xlYXIJCT0gcXNfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBxc19zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IHFzX3Njcl93cml0ZSwKKwkucG9ydF9zdGFydAkJPSBxc19wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gcXNfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gcXNfaG9zdF9zdG9wLAorCS5ibWRtYV9zdG9wCQk9IHFzX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBxc19ibWRtYV9zdGF0dXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gcXNfcG9ydF9pbmZvW10gPSB7CisJLyogYm9hcmRfMjA2OF9pZHggKi8KKwl7CisJCS5zaHQJCT0gJnFzX2F0YV9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19TQVRBX1JFU0VUIHwKKwkJCQkgIC8vRklYTUUgQVRBX0ZMQUdfU1JTVCB8CisJCQkJICBBVEFfRkxBR19NTUlPLAorCQkucGlvX21hc2sJPSAweDEwLCAvKiBwaW80ICovCisJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02ICovCisJCS5wb3J0X29wcwk9ICZxc19hdGFfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcXNfYXRhX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfUERDLCAweDIwNjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDY4X2lkeCB9LAorCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcXNfYXRhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBxc19hdGFfcGNpX3RibCwKKwkucHJvYmUJCQk9IHFzX2F0YV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCitzdGF0aWMgaW50IHFzX2NoZWNrX2F0YXBpX2RtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXJldHVybiAxOwkvKiBBVEFQSSBETUEgbm90IHN1cHBvcnRlZCAqLworfQorCitzdGF0aWMgdm9pZCBxc19ibWRtYV9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJLyogbm90aGluZyAqLworfQorCitzdGF0aWMgdTggcXNfYm1kbWFfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFzX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCS8qIG5vdGhpbmcgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHFzX2VudGVyX3JlZ19tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTggX19pb21lbSAqY2hhbiA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlICsgKGFwLT5wb3J0X25vICogMHg0MDAwKTsKKworCXdyaXRlYihRU19DVFIwX1JFRywgY2hhbiArIFFTX0NDVF9DVFIwKTsKKwlyZWFkYihjaGFuICsgUVNfQ0NUX0NUUjApOyAgICAgICAgLyogZmx1c2ggKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHFzX3Jlc2V0X2NoYW5uZWxfbG9naWMoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1OCBfX2lvbWVtICpjaGFuID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyAoYXAtPnBvcnRfbm8gKiAweDQwMDApOworCisJd3JpdGViKFFTX0NUUjFfUkNITiwgY2hhbiArIFFTX0NDVF9DVFIxKTsKKwlyZWFkYihjaGFuICsgUVNfQ0NUX0NUUjApOyAgICAgICAgLyogZmx1c2ggKi8KKwlxc19lbnRlcl9yZWdfbW9kZShhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHFzX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKworCXBwLT5zdGF0ZSA9IHFzX3N0YXRlX2lkbGU7CisJcXNfcmVzZXRfY2hhbm5lbF9sb2dpYyhhcCk7CisJc2F0YV9waHlfcmVzZXQoYXApOworfQorCitzdGF0aWMgdm9pZCBxc19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKworCWlmIChwcC0+c3RhdGUgIT0gcXNfc3RhdGVfaWRsZSkgLyogaGVhbHRoeSBwYXJhbm9pYSAqLworCQlwcC0+c3RhdGUgPSBxc19zdGF0ZV9tbWlvOworCXFzX3Jlc2V0X2NoYW5uZWxfbG9naWMoYXApOworCWF0YV9lbmdfdGltZW91dChhcCk7Cit9CisKK3N0YXRpYyB1MzIgcXNfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm4gfjBVOworCXJldHVybiByZWFkbCgodm9pZCBfX2lvbWVtICopKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogOCkpKTsKK30KKworc3RhdGljIHZvaWQgcXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKikoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA4KSkpOworfQorCitzdGF0aWMgdm9pZCBxc19maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbmVsZW07CisJdTggKnByZCA9IHBwLT5wa3QgKyBRU19DUEJfQllURVM7CisKKwlhc3NlcnQoc2cgIT0gTlVMTCk7CisJYXNzZXJ0KHFjLT5uX2VsZW0gPiAwKTsKKworCWZvciAobmVsZW0gPSAwOyBuZWxlbSA8IHFjLT5uX2VsZW07IG5lbGVtKyssc2crKykgeworCQl1NjQgYWRkcjsKKwkJdTMyIGxlbjsKKworCQlhZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQkqKF9fbGU2NCAqKXByZCA9IGNwdV90b19sZTY0KGFkZHIpOworCQlwcmQgKz0gc2l6ZW9mKHU2NCk7CisKKwkJbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCSooX19sZTMyICopcHJkID0gY3B1X3RvX2xlMzIobGVuKTsKKwkJcHJkICs9IHNpemVvZih1NjQpOworCisJCVZQUklOVEsoIlBSRFsldV0gPSAoMHglbGxYLCAweCVYKVxuIiwgbmVsZW0sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYWRkciwgbGVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHFzX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOworCXU4IGRmbGFncyA9IFFTX0RGX1BPUkQsICpidWYgPSBwcC0+cGt0OworCXU4IGhmbGFncyA9IFFTX0hGX0RBVCB8IFFTX0hGX0lFTiB8IFFTX0hGX1ZMRDsKKwl1NjQgYWRkcjsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCXFzX2VudGVyX3JlZ19tb2RlKHFjLT5hcCk7CisJaWYgKHFjLT50Zi5wcm90b2NvbCAhPSBBVEFfUFJPVF9ETUEpIHsKKwkJYXRhX3FjX3ByZXAocWMpOworCQlyZXR1cm47CisJfQorCisJcXNfZmlsbF9zZyhxYyk7CisKKwlpZiAoKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkpCisJCWhmbGFncyB8PSBRU19IRl9ESVJPOworCWlmICgocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSkKKwkJZGZsYWdzIHw9IFFTX0RGX0VMQkE7CisKKwkvKiBob3N0IGNvbnRyb2wgYmxvY2sgKEhDQikgKi8KKwlidWZbIDBdID0gUVNfSENCX0hEUjsKKwlidWZbIDFdID0gaGZsYWdzOworCSooX19sZTMyICopKCZidWZbIDRdKSA9IGNwdV90b19sZTMyKHFjLT5uc2VjdCAqIEFUQV9TRUNUX1NJWkUpOworCSooX19sZTMyICopKCZidWZbIDhdKSA9IGNwdV90b19sZTMyKHFjLT5uX2VsZW0pOworCWFkZHIgPSAoKHU2NClwcC0+cGt0X2RtYSkgKyBRU19DUEJfQllURVM7CisJKihfX2xlNjQgKikoJmJ1ZlsxNl0pID0gY3B1X3RvX2xlNjQoYWRkcik7CisKKwkvKiBkZXZpY2UgY29udHJvbCBibG9jayAoRENCKSAqLworCWJ1ZlsyNF0gPSBRU19EQ0JfSERSOworCWJ1ZlsyOF0gPSBkZmxhZ3M7CisKKwkvKiBmcmFtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKEZJUykgKi8KKwlhdGFfdGZfdG9fZmlzKCZxYy0+dGYsICZidWZbMzJdLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFzX3BhY2tldF9zdGFydChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdTggX19pb21lbSAqY2hhbiA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlICsgKGFwLT5wb3J0X25vICogMHg0MDAwKTsKKworCVZQUklOVEsoIkVOVEVSLCBhcCAlcFxuIiwgYXApOworCisJd3JpdGViKFFTX0NUUjBfQ0xFUiwgY2hhbiArIFFTX0NDVF9DVFIwKTsKKwl3bWIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoIFBSRHMgYW5kIHBrdCB0byBtZW1vcnkgKi8KKwl3cml0ZWwoUVNfQ0NGX1JVTl9QS1QsIGNoYW4gKyBRU19DQ1RfQ0ZGKTsKKwlyZWFkbChjaGFuICsgUVNfQ0NUX0NGRik7ICAgICAgICAgIC8qIGZsdXNoICovCit9CisKK3N0YXRpYyBpbnQgcXNfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKworCQlwcC0+c3RhdGUgPSBxc19zdGF0ZV9wa3Q7CisJCXFzX3BhY2tldF9zdGFydChxYyk7CisJCXJldHVybiAwOworCisJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCUJVRygpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXBwLT5zdGF0ZSA9IHFzX3N0YXRlX21taW87CisJcmV0dXJuIGF0YV9xY19pc3N1ZV9wcm90KHFjKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcXNfaW50cl9wa3Qoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCit7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCXU4IHNGRkU7CisJdTggX19pb21lbSAqbW1pb19iYXNlID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKworCWRvIHsKKwkJdTMyIHNmZjAgPSByZWFkbChtbWlvX2Jhc2UgKyBRU19IU1RfU0ZGKTsKKwkJdTMyIHNmZjEgPSByZWFkbChtbWlvX2Jhc2UgKyBRU19IU1RfU0ZGICsgNCk7CisJCXU4IHNFVkxEID0gKHNmZjEgPj4gMzApICYgMHgwMTsJLyogdmFsaWQgZmxhZyAqLworCQlzRkZFICA9IHNmZjEgPj4gMzE7CQkvKiBlbXB0eSBmbGFnICovCisKKwkJaWYgKHNFVkxEKSB7CisJCQl1OCBzRFNUID0gc2ZmMCA+PiAxNjsJLyogZGV2IHN0YXR1cyAqLworCQkJdTggc0hTVCA9IHNmZjEgJiAweDNmOwkvKiBob3N0IHN0YXR1cyAqLworCQkJdW5zaWduZWQgaW50IHBvcnRfbm8gPSAoc2ZmMSA+PiA4KSAmIDB4MDM7CisJCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdF9zZXQtPnBvcnRzW3BvcnRfbm9dOworCisJCQlEUFJJTlRLKCJTRkY9JTA4eCUwOHg6IHNDSEFOPSV1IHNIU1Q9JWQgc0RTVD0lMDJ4XG4iLAorCQkJCQlzZmYxLCBzZmYwLCBwb3J0X25vLCBzSFNULCBzRFNUKTsKKwkJCWhhbmRsZWQgPSAxOworCQkJaWYgKGFwICYmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpKSkgeworCQkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJCQkJc3RydWN0IHFzX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCQkJCWlmICghcHAgfHwgcHAtPnN0YXRlICE9IHFzX3N0YXRlX3BrdCkKKwkJCQkJY29udGludWU7CisJCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkpIHsKKwkJCQkJc3dpdGNoIChzSFNUKSB7CisJCQkJCWNhc2UgMDogLyogc3VjZXNzZnVsIENQQiAqLworCQkJCQljYXNlIDM6IC8qIGRldmljZSBlcnJvciAqLworCQkJCQkJcHAtPnN0YXRlID0gcXNfc3RhdGVfaWRsZTsKKwkJCQkJCXFzX2VudGVyX3JlZ19tb2RlKHFjLT5hcCk7CisJCQkJCQlhdGFfcWNfY29tcGxldGUocWMsIHNEU1QpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKCFzRkZFKTsKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcXNfaW50cl9tbWlvKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMCwgcG9ydF9ubzsKKworCWZvciAocG9ydF9ubyA9IDA7IHBvcnRfbm8gPCBob3N0X3NldC0+bl9wb3J0czsgKytwb3J0X25vKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCWFwID0gaG9zdF9zZXQtPnBvcnRzW3BvcnRfbm9dOworCQlpZiAoYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCQkJc3RydWN0IHFzX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCQkJaWYgKCFwcCB8fCBwcC0+c3RhdGUgIT0gcXNfc3RhdGVfbW1pbykKKwkJCQljb250aW51ZTsKKwkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkpIHsKKworCQkJCS8qIGNoZWNrIG1haW4gc3RhdHVzLCBjbGVhcmluZyBJTlRSUSAqLworCQkJCXU4IHN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKwkJCQlpZiAoKHN0YXR1cyAmIEFUQV9CVVNZKSkKKwkJCQkJY29udGludWU7CisJCQkJRFBSSU5USygiYXRhJXU6IHByb3RvY29sICVkIChkZXZfc3RhdCAweCVYKVxuIiwKKwkJCQkJYXAtPmlkLCBxYy0+dGYucHJvdG9jb2wsIHN0YXR1cyk7CisJCQorCQkJCS8qIGNvbXBsZXRlIHRhc2tmaWxlIHRyYW5zYWN0aW9uICovCisJCQkJcHAtPnN0YXRlID0gcXNfc3RhdGVfaWRsZTsKKwkJCQlhdGFfcWNfY29tcGxldGUocWMsIHN0YXR1cyk7CisJCQkJaGFuZGxlZCA9IDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBxc19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisJaGFuZGxlZCAgPSBxc19pbnRyX3BrdChob3N0X3NldCkgfCBxc19pbnRyX21taW8oaG9zdF9zZXQpOworCXNwaW5fdW5sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwlWUFJJTlRLKCJFWElUXG4iKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBxc19hdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlwb3J0LT5jbWRfYWRkcgkJPQorCXBvcnQtPmRhdGFfYWRkcgkJPSBiYXNlICsgMHg0MDA7CisJcG9ydC0+ZXJyb3JfYWRkcgk9CisJcG9ydC0+ZmVhdHVyZV9hZGRyCT0gYmFzZSArIDB4NDA4OyAvKiBob2JfZmVhdHVyZSA9IDB4NDA5ICovCisJcG9ydC0+bnNlY3RfYWRkcgk9IGJhc2UgKyAweDQxMDsgLyogaG9iX25zZWN0ICAgPSAweDQxMSAqLworCXBvcnQtPmxiYWxfYWRkcgkJPSBiYXNlICsgMHg0MTg7IC8qIGhvYl9sYmFsICAgID0gMHg0MTkgKi8KKwlwb3J0LT5sYmFtX2FkZHIJCT0gYmFzZSArIDB4NDIwOyAvKiBob2JfbGJhbSAgICA9IDB4NDIxICovCisJcG9ydC0+bGJhaF9hZGRyCQk9IGJhc2UgKyAweDQyODsgLyogaG9iX2xiYWggICAgPSAweDQyOSAqLworCXBvcnQtPmRldmljZV9hZGRyCT0gYmFzZSArIDB4NDMwOworCXBvcnQtPnN0YXR1c19hZGRyCT0KKwlwb3J0LT5jb21tYW5kX2FkZHIJPSBiYXNlICsgMHg0Mzg7CisJcG9ydC0+YWx0c3RhdHVzX2FkZHIJPQorCXBvcnQtPmN0bF9hZGRyCQk9IGJhc2UgKyAweDQ0MDsKKwlwb3J0LT5zY3JfYWRkcgkJPSBiYXNlICsgMHhjMDA7Cit9CisKK3N0YXRpYyBpbnQgcXNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OworCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpjaGFuID0gbW1pb19iYXNlICsgKGFwLT5wb3J0X25vICogMHg0MDAwKTsKKwl1NjQgYWRkcjsKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9wb3J0X3N0YXJ0KGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlxc19lbnRlcl9yZWdfbW9kZShhcCk7CisJcHAgPSBrY2FsbG9jKDEsIHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlwcC0+cGt0ID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgUVNfUEtUX0JZVEVTLCAmcHAtPnBrdF9kbWEsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghcHAtPnBrdCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisJbWVtc2V0KHBwLT5wa3QsIDAsIFFTX1BLVF9CWVRFUyk7CisJYXAtPnByaXZhdGVfZGF0YSA9IHBwOworCisJYWRkciA9ICh1NjQpcHAtPnBrdF9kbWE7CisJd3JpdGVsKCh1MzIpIGFkZHIsICAgICAgICBjaGFuICsgUVNfQ0NGX0NQQkEpOworCXdyaXRlbCgodTMyKShhZGRyID4+IDMyKSwgY2hhbiArIFFTX0NDRl9DUEJBICsgNCk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfa2ZyZWU6CisJa2ZyZWUocHApOworZXJyX291dDoKKwlhdGFfcG9ydF9zdG9wKGFwKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHFzX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OworCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKworCWlmIChwcCAhPSBOVUxMKSB7CisJCWFwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCQlpZiAocHAtPnBrdCAhPSBOVUxMKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBRU19QS1RfQllURVMsIHBwLT5wa3QsCisJCQkJCQkJCXBwLT5wa3RfZG1hKTsKKwkJa2ZyZWUocHApOworCX0KKwlhdGFfcG9ydF9zdG9wKGFwKTsKK30KKworc3RhdGljIHZvaWQgcXNfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQoreworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKworCXdyaXRlYigwLCBtbWlvX2Jhc2UgKyBRU19IQ1RfQ1RSTCk7IC8qIGRpc2FibGUgaG9zdCBpbnRlcnJ1cHRzICovCisJd3JpdGViKFFTX0NORkczX0dTUlNULCBtbWlvX2Jhc2UgKyBRU19IQ0ZfQ05GRzMpOyAvKiBnbG9iYWwgcmVzZXQgKi8KK30KKworc3RhdGljIHZvaWQgcXNfaG9zdF9pbml0KHVuc2lnbmVkIGludCBjaGlwX2lkLCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUpCit7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBwZS0+bW1pb19iYXNlOworCXVuc2lnbmVkIGludCBwb3J0X25vOworCisJd3JpdGViKDAsIG1taW9fYmFzZSArIFFTX0hDVF9DVFJMKTsgLyogZGlzYWJsZSBob3N0IGludGVycnVwdHMgKi8KKwl3cml0ZWIoUVNfQ05GRzNfR1NSU1QsIG1taW9fYmFzZSArIFFTX0hDRl9DTkZHMyk7IC8qIGdsb2JhbCByZXNldCAqLworCisJLyogcmVzZXQgZWFjaCBjaGFubmVsIGluIHR1cm4gKi8KKwlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgcGUtPm5fcG9ydHM7ICsrcG9ydF9ubykgeworCQl1OCBfX2lvbWVtICpjaGFuID0gbW1pb19iYXNlICsgKHBvcnRfbm8gKiAweDQwMDApOworCQl3cml0ZWIoUVNfQ1RSMV9SREVWfFFTX0NUUjFfUkNITiwgY2hhbiArIFFTX0NDVF9DVFIxKTsKKwkJd3JpdGViKFFTX0NUUjBfUkVHLCBjaGFuICsgUVNfQ0NUX0NUUjApOworCQlyZWFkYihjaGFuICsgUVNfQ0NUX0NUUjApOyAgICAgICAgLyogZmx1c2ggKi8KKwl9CisJd3JpdGViKFFTX1NFUkQzX1BIWV9FTkEsIG1taW9fYmFzZSArIFFTX0hWU19TRVJEMyk7IC8qIGVuYWJsZSBwaHkgKi8KKworCWZvciAocG9ydF9ubyA9IDA7IHBvcnRfbm8gPCBwZS0+bl9wb3J0czsgKytwb3J0X25vKSB7CisJCXU4IF9faW9tZW0gKmNoYW4gPSBtbWlvX2Jhc2UgKyAocG9ydF9ubyAqIDB4NDAwMCk7CisJCS8qIHNldCBGSUZPIGRlcHRocyB0byBzYW1lIHNldHRpbmdzIGFzIFdpbmRvd3MgZHJpdmVyICovCisJCXdyaXRldygzMiwgY2hhbiArIFFTX0NGQ19IVUZUKTsKKwkJd3JpdGV3KDMyLCBjaGFuICsgUVNfQ0ZDX0hERlQpOworCQl3cml0ZXcoMTAsIGNoYW4gKyBRU19DRkNfRFVGVCk7CisJCXdyaXRldyggOCwgY2hhbiArIFFTX0NGQ19EREZUKTsKKwkJLyogc2V0IENQQiBzaXplIGluIGJ5dGVzLCBhcyBhIHBvd2VyIG9mIHR3byAqLworCQl3cml0ZWIoUVNfQ1BCX09SREVSLCAgICBjaGFuICsgUVNfQ0NGX0NTRVApOworCX0KKwl3cml0ZWIoMSwgbW1pb19iYXNlICsgUVNfSENUX0NUUkwpOyAvKiBlbmFibGUgaG9zdCBpbnRlcnJ1cHRzICovCit9CisKKy8qCisgKiBUaGUgUVN0b3IgdW5kZXJzdGFuZHMgNjQtYml0IGJ1c2VzLCBhbmQgdXNlcyA2NC1iaXQgZmllbGRzCisgKiBmb3IgRE1BIHBvaW50ZXJzIHJlZ2FyZGxlc3Mgb2YgYnVzIHdpZHRoLiAgV2UganVzdCBoYXZlIHRvCisgKiBtYWtlIHN1cmUgb3VyIERNQSBtYXNrcyBhcmUgc2V0IGFwcHJvcHJpYXRlbHkgZm9yIHdoYXRldmVyCisgKiBicmlkZ2UgbGllcyBiZXR3ZWVuIHVzIGFuZCB0aGUgUVN0b3IsIGFuZCB0aGVuIHRoZSBETUEgbWFwcGluZworICogY29kZSB3aWxsIGVuc3VyZSB3ZSBvbmx5IGV2ZXIgInNlZSIgYXBwcm9wcmlhdGUgYnVmZmVyIGFkZHJlc3Nlcy4KKyAqIElmIHdlJ3JlIDMyLWJpdCBsaW1pdGVkIHNvbWV3aGVyZSwgdGhlbiBvdXIgNjQtYml0IGZpZWxkcyB3aWxsCisgKiBqdXN0IGVuZCB1cCB3aXRoIHplcm9zIGluIHRoZSB1cHBlciAzMi1iaXRzLCB3aXRob3V0IGFueSBzcGVjaWFsCisgKiBsb2dpYyByZXF1aXJlZCBvdXRzaWRlIG9mIHRoaXMgcm91dGluZSAoYmVsb3cpLgorICovCitzdGF0aWMgaW50IHFzX3NldF9kbWFfbWFza3Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqbW1pb19iYXNlKQoreworCXUzMiBidXNfaW5mbyA9IHJlYWRsKG1taW9fYmFzZSArIFFTX0hJRF9IUEhZKTsKKwlpbnQgcmMsIGhhdmVfNjRiaXRfYnVzID0gKGJ1c19pbmZvICYgUVNfSFBIWV82NEJJVCk7CisKKwlpZiAoaGF2ZV82NGJpdF9idXMgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSB7CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCQkJIiglcyk6IDY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQkJcGNpX25hbWUocGRldikpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJIiglcyk6IDMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCSIoJXMpOiAzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXNfYXRhX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CisJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJaW50IHJjLCBwb3J0X25vOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDQpICYgSU9SRVNPVVJDRV9NRU0pID09IDApIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwltbWlvX2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSwKKwkJICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCA0KSk7CisJaWYgKG1taW9fYmFzZSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJcmMgPSBxc19zZXRfZG1hX21hc2tzKHBkZXYsIG1taW9fYmFzZSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKworCXByb2JlX2VudCA9IGttYWxsb2Moc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYmVfZW50ID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YoKnByb2JlX2VudCkpOworCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7CisJSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7CisKKwlwcm9iZV9lbnQtPnNodAkJPSBxc19wb3J0X2luZm9bYm9hcmRfaWR4XS5zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uaG9zdF9mbGFnczsKKwlwcm9iZV9lbnQtPnBpb19tYXNrCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7CisJcHJvYmVfZW50LT5td2RtYV9tYXNrCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ubXdkbWFfbWFzazsKKwlwcm9iZV9lbnQtPnVkbWFfbWFzawk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7CisKKwlwcm9iZV9lbnQtPmlycQkJPSBwZGV2LT5pcnE7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MJPSBTQV9TSElSUTsKKwlwcm9iZV9lbnQtPm1taW9fYmFzZQk9IG1taW9fYmFzZTsKKwlwcm9iZV9lbnQtPm5fcG9ydHMJPSBRU19QT1JUUzsKKworCWZvciAocG9ydF9ubyA9IDA7IHBvcnRfbm8gPCBwcm9iZV9lbnQtPm5fcG9ydHM7ICsrcG9ydF9ubykgeworCQl1bnNpZ25lZCBsb25nIGNoYW4gPSAodW5zaWduZWQgbG9uZyltbWlvX2Jhc2UgKworCQkJCQkJCShwb3J0X25vICogMHg0MDAwKTsKKwkJcXNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFtwb3J0X25vXSwgY2hhbik7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KKwlxc19ob3N0X2luaXQoYm9hcmRfaWR4LCBwcm9iZV9lbnQpOworCisJcmMgPSBhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCWtmcmVlKHByb2JlX2VudCk7CisJaWYgKHJjICE9IFFTX1BPUlRTKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAobW1pb19iYXNlKTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxc19hdGFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnFzX2F0YV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHFzX2F0YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxc19hdGFfcGNpX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgTG9yZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNpZmljIERpZ2l0YWwgQ29ycG9yYXRpb24gUVN0b3IgU0FUQSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcXNfYXRhX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChxc19hdGFfaW5pdCk7Cittb2R1bGVfZXhpdChxc19hdGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3NpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDg5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqICBzYXRhX3NpbC5jIC0gU2lsaWNvbiBJbWFnZSBTQVRBCisgKgorICogIE1haW50YWluZWQgYnk6ICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKiAgCQkgICAgUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcKKyAqCQkgICAgb24gZW1haWxzLgorICoKKyAqICBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0LCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDMgQmVuamFtaW4gSGVycmVuc2NobWlkdAorICoKKyAqICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgKiAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICogIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgKiAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgKiAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgKiAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICogIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfc2lsIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45IgorCitlbnVtIHsKKwlzaWxfMzExMgkJPSAwLAorCXNpbF8zMTE0CQk9IDEsCisKKwlTSUxfRklGT19SMAkJPSAweDQwLAorCVNJTF9GSUZPX1cwCQk9IDB4NDEsCisJU0lMX0ZJRk9fUjEJCT0gMHg0NCwKKwlTSUxfRklGT19XMQkJPSAweDQ1LAorCVNJTF9GSUZPX1IyCQk9IDB4MjQwLAorCVNJTF9GSUZPX1cyCQk9IDB4MjQxLAorCVNJTF9GSUZPX1IzCQk9IDB4MjQ0LAorCVNJTF9GSUZPX1czCQk9IDB4MjQ1LAorCisJU0lMX1NZU0NGRwkJPSAweDQ4LAorCVNJTF9NQVNLX0lERTBfSU5UCT0gKDEgPDwgMjIpLAorCVNJTF9NQVNLX0lERTFfSU5UCT0gKDEgPDwgMjMpLAorCVNJTF9NQVNLX0lERTJfSU5UCT0gKDEgPDwgMjQpLAorCVNJTF9NQVNLX0lERTNfSU5UCT0gKDEgPDwgMjUpLAorCVNJTF9NQVNLXzJQT1JUCQk9IFNJTF9NQVNLX0lERTBfSU5UIHwgU0lMX01BU0tfSURFMV9JTlQsCisJU0lMX01BU0tfNFBPUlQJCT0gU0lMX01BU0tfMlBPUlQgfAorCQkJCSAgU0lMX01BU0tfSURFMl9JTlQgfCBTSUxfTUFTS19JREUzX0lOVCwKKworCVNJTF9JREUyX0JNRE1BCQk9IDB4MjAwLAorCisJU0lMX0lOVFJfU1RFRVJJTkcJPSAoMSA8PCAxKSwKKwlTSUxfUVVJUktfTU9EMTVXUklURQk9ICgxIDw8IDApLAorCVNJTF9RVUlSS19VRE1BNU1BWAk9ICgxIDw8IDEpLAorfTsKKworc3RhdGljIGludCBzaWxfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIHNpbF9kZXZfY29uZmlnKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOworc3RhdGljIHUzMiBzaWxfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOworc3RhdGljIHZvaWQgc2lsX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgdm9pZCBzaWxfcG9zdF9zZXRfbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaWxfcGNpX3RibFtdID0geworCXsgMHgxMDk1LCAweDMxMTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpbF8zMTEyIH0sCisJeyAweDEwOTUsIDB4MDI0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lsXzMxMTIgfSwKKwl7IDB4MTA5NSwgMHgzNTEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaWxfMzExMiB9LAorCXsgMHgxMDk1LCAweDMxMTQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpbF8zMTE0IH0sCisJeyAweDEwMDIsIDB4NDM2ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgc2lsXzMxMTIgfSwKKwl7IDB4MTAwMiwgMHg0Mzc5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaWxfMzExMiB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworCisvKiBUT0RPIGZpcm13YXJlIHZlcnNpb25zIHNob3VsZCBiZSBhZGRlZCAtIGVyaWMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lsX2RyaXZlbGlzdCB7CisJY29uc3QgY2hhciAqIHByb2R1Y3Q7CisJdW5zaWduZWQgaW50IHF1aXJrOworfSBzaWxfYmxhY2tsaXN0IFtdID0geworCXsgIlNUMzIwMDEyQVMiLAkJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDMzMDAxM0FTIiwJCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzNDAwMTdBUyIsCQlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzYwMDE1QVMiLAkJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDM4MDAxM0FTIiwJCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzODAwMjNBUyIsCQlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzEyMDAyM0FTIiwJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDMxNjAwMjNBUyIsCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzMTIwMDI2QVMiLAlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzIwMDgyMkFTIiwJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDM0MDAxNEFTTCIsCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiU1QzNjAwMTRBU0wiLAlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzgwMDExQVNMIiwJU0lMX1FVSVJLX01PRDE1V1JJVEUgfSwKKwl7ICJTVDMxMjAwMjJBU0wiLAlTSUxfUVVJUktfTU9EMTVXUklURSB9LAorCXsgIlNUMzE2MDAyMUFTTCIsCVNJTF9RVUlSS19NT0QxNVdSSVRFIH0sCisJeyAiTWF4dG9yIDREMDYwSDMiLAlTSUxfUVVJUktfVURNQTVNQVggfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzaWxfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IHNpbF9wY2lfdGJsLAorCS5wcm9iZQkJCT0gc2lsX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgc2lsX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLm9yZGVyZWRfZmx1c2gJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaWxfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkuZGV2X2NvbmZpZwkJPSBzaWxfZGV2X2NvbmZpZywKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkucGh5X3Jlc2V0CQk9IHNhdGFfcGh5X3Jlc2V0LAorCS5wb3N0X3NldF9tb2RlCQk9IHNpbF9wb3N0X3NldF9tb2RlLAorCS5ibWRtYV9zZXR1cCAgICAgICAgICAgID0gYXRhX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydCAgICAgICAgICAgID0gYXRhX2JtZG1hX3N0YXJ0LAorCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisJLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKwkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCisJLnNjcl9yZWFkCQk9IHNpbF9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IHNpbF9zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpbF9wb3J0X2luZm9bXSA9IHsKKwkvKiBzaWxfMzExMiAqLworCXsKKwkJLnNodAkJPSAmc2lsX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19NTUlPLAorCQkucGlvX21hc2sJPSAweDFmLAkJCS8qIHBpbzAtNCAqLworCQkubXdkbWFfbWFzawk9IDB4MDcsCQkJLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4M2YsCQkJLyogdWRtYTAtNSAqLworCQkucG9ydF9vcHMJPSAmc2lsX29wcywKKwl9LCAvKiBzaWxfMzExNCAqLworCXsKKwkJLnNodAkJPSAmc2lsX3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19NTUlPLAorCQkucGlvX21hc2sJPSAweDFmLAkJCS8qIHBpbzAtNCAqLworCQkubXdkbWFfbWFzawk9IDB4MDcsCQkJLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4M2YsCQkJLyogdWRtYTAtNSAqLworCQkucG9ydF9vcHMJPSAmc2lsX29wcywKKwl9LAorfTsKKworLyogcGVyLXBvcnQgcmVnaXN0ZXIgb2Zmc2V0cyAqLworLyogVE9ETzogd2UgY2FuIHByb2JhYmx5IGNhbGN1bGF0ZSByYXRoZXIgdGhhbiB1c2UgYSB0YWJsZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyB0ZjsJLyogQVRBIHRhc2tmaWxlIHJlZ2lzdGVyIGJsb2NrICovCisJdW5zaWduZWQgbG9uZyBjdGw7CS8qIEFUQSBjb250cm9sL2FsdHN0YXR1cyByZWdpc3RlciBibG9jayAqLworCXVuc2lnbmVkIGxvbmcgYm1kbWE7CS8qIERNQSByZWdpc3RlciBibG9jayAqLworCXVuc2lnbmVkIGxvbmcgc2NyOwkvKiBTQVRBIGNvbnRyb2wgcmVnaXN0ZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIHNpZW47CS8qIFNBVEEgSW50ZXJydXB0IEVuYWJsZSByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgeGZlcl9tb2RlOy8qIGRhdGEgdHJhbnNmZXIgbW9kZSByZWdpc3RlciAqLworfSBzaWxfcG9ydFtdID0geworCS8qIHBvcnQgMCAuLi4gKi8KKwl7IDB4ODAsIDB4OEEsIDB4MDAsIDB4MTAwLCAweDE0OCwgMHhiNCB9LAorCXsgMHhDMCwgMHhDQSwgMHgwOCwgMHgxODAsIDB4MWM4LCAweGY0IH0sCisJeyAweDI4MCwgMHgyOEEsIDB4MjAwLCAweDMwMCwgMHgzNDgsIDB4MmI0IH0sCisJeyAweDJDMCwgMHgyQ0EsIDB4MjA4LCAweDM4MCwgMHgzYzgsIDB4MmY0IH0sCisJLyogLi4uIHBvcnQgMyAqLworfTsKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgU2lsaWNvbiBJbWFnZSBTQVRBIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaWxfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNpbF9nZXRfZGV2aWNlX2NhY2hlX2xpbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTggY2FjaGVfbGluZSA9IDA7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNhY2hlX2xpbmUpOworCXJldHVybiBjYWNoZV9saW5lOworfQorCitzdGF0aWMgdm9pZCBzaWxfcG9zdF9zZXRfbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGFwLT5ob3N0X3NldDsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCXZvaWQgKmFkZHIgPSBob3N0X3NldC0+bW1pb19iYXNlICsgc2lsX3BvcnRbYXAtPnBvcnRfbm9dLnhmZXJfbW9kZTsKKwl1MzIgdG1wLCBkZXZfbW9kZVsyXTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CisJCWlmICghYXRhX2Rldl9wcmVzZW50KGRldikpCisJCQlkZXZfbW9kZVtpXSA9IDA7CS8qIFBJTzAvMS8yICovCisJCWVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfUElPKQorCQkJZGV2X21vZGVbaV0gPSAxOwkvKiBQSU8zLzQgKi8KKwkJZWxzZQorCQkJZGV2X21vZGVbaV0gPSAzOwkvKiBVRE1BICovCisJCS8qIHZhbHVlIDIgaW5kaWNhdGVzIE1ETUEgKi8KKwl9CisKKwl0bXAgPSByZWFkbChhZGRyKTsKKwl0bXAgJj0gfigoMTw8NSkgfCAoMTw8NCkgfCAoMTw8MSkgfCAoMTw8MCkpOworCXRtcCB8PSBkZXZfbW9kZVswXTsKKwl0bXAgfD0gKGRldl9tb2RlWzFdIDw8IDQpOworCXdyaXRlbCh0bXAsIGFkZHIpOworCXJlYWRsKGFkZHIpOwkvKiBmbHVzaCAqLworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2lsX3Njcl9hZGRyKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBhcC0+aW9hZGRyLnNjcl9hZGRyOworCisJc3dpdGNoIChzY19yZWcpIHsKKwljYXNlIFNDUl9TVEFUVVM6CisJCXJldHVybiBvZmZzZXQgKyA0OworCWNhc2UgU0NSX0VSUk9SOgorCQlyZXR1cm4gb2Zmc2V0ICsgODsKKwljYXNlIFNDUl9DT05UUk9MOgorCQlyZXR1cm4gb2Zmc2V0OworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgc2lsX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCXZvaWQgKm1taW8gPSAodm9pZCAqKSBzaWxfc2NyX2FkZHIoYXAsIHNjX3JlZyk7CisJaWYgKG1taW8pCisJCXJldHVybiByZWFkbChtbWlvKTsKKwlyZXR1cm4gMHhmZmZmZmZmZlU7Cit9CisKK3N0YXRpYyB2b2lkIHNpbF9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCit7CisJdm9pZCAqbW1pbyA9ICh2b2lkICopIHNpbF9zY3JfYWRkcihhcCwgc2NfcmVnKTsKKwlpZiAobW1pbykKKwkJd3JpdGVsKHZhbCwgbW1pbyk7Cit9CisKKy8qKgorICoJc2lsX2Rldl9jb25maWcgLSBBcHBseSBkZXZpY2UvaG9zdC1zcGVjaWZpYyBlcnJhdGEgZml4dXBzCisgKglAYXA6IFBvcnQgY29udGFpbmluZyBkZXZpY2UgdG8gYmUgZXhhbWluZWQKKyAqCUBkZXY6IERldmljZSB0byBiZSBleGFtaW5lZAorICoKKyAqCUFmdGVyIHRoZSBJREVOVElGWSBbUEFDS0VUXSBERVZJQ0Ugc3RlcCBpcyBjb21wbGV0ZSwgYW5kIGEKKyAqCWRldmljZSBpcyBrbm93biB0byBiZSBwcmVzZW50LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqCVdlIGFwcGx5IHR3byBlcnJhdGEgZml4dXBzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBTaWxpY29uIEltYWdlLAorICoJYSBTZWFnYXRlIGFuZCBhIE1heHRvciBmaXh1cC4KKyAqCisgKglGb3IgY2VydGFpbiBTZWFnYXRlIGRldmljZXMsIHdlIG11c3QgbGltaXQgdGhlIG1heGltdW0gc2VjdG9ycworICoJdG8gdW5kZXIgOEsuCisgKgorICoJRm9yIGNlcnRhaW4gTWF4dG9yIGRldmljZXMsIHdlIG11c3Qgbm90IHByb2dyYW0gdGhlIGRyaXZlCisgKgliZXlvbmQgdWRtYTUuCisgKgorICoJQm90aCBmaXh1cHMgYXJlIHVuZmFpcmx5IHBlc3NpbWlzdGljLiAgQXMgc29vbiBhcyBJIGdldCBtb3JlCisgKglpbmZvcm1hdGlvbiBvbiB0aGVzZSBlcnJhdGEsIEkgd2lsbCBjcmVhdGUgYSBtb3JlIGV4aGF1c3RpdmUKKyAqCWxpc3QsIGFuZCBhcHBseSB0aGUgZml4dXBzIHRvIG9ubHkgdGhlIHNwZWNpZmljCisgKglkZXZpY2VzL2hvc3RzL2Zpcm13YXJlcyB0aGF0IG5lZWQgaXQuCisgKgorICoJMjAwNDAxMTEgLSBTZWFnYXRlIGRyaXZlcyBhZmZlY3RlZCBieSB0aGUgTW9kMTVXcml0ZSBidWcgYXJlIGJsYWNrbGlzdGVkCisgKglUaGUgTWF4dG9yIHF1aXJrIGlzIGluIHRoZSBibGFja2xpc3QsIGJ1dCBJJ20ga2VlcGluZyB0aGUgb3JpZ2luYWwKKyAqCXBlc3NpbWlzdGljIGZpeCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zLi4uCisgKgktIFRoZXJlIHNlZW1zIHRvIGJlIGxlc3MgaW5mbyBvbiBpdCwgb25seSBvbmUgZGV2aWNlIGdsZWFuZWQgb2ZmIHRoZQorICoJV2luZG93cwlkcml2ZXIsIG1heWJlIG9ubHkgb25lIGlzIGFmZmVjdGVkLiAgTW9yZSBpbmZvIHdvdWxkIGJlIGdyZWF0bHkKKyAqCWFwcHJlY2lhdGVkLgorICoJLSBCdXQgdGhlbiBhZ2FpbiBVRE1BNSBpcyBoYXJkbHkgYW55dGhpbmcgdG8gY29tcGxhaW4gYWJvdXQKKyAqLworc3RhdGljIHZvaWQgc2lsX2Rldl9jb25maWcoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbiwgcXVpcmtzID0gMDsKKwl1bnNpZ25lZCBjaGFyIG1vZGVsX251bVs0MF07CisJY29uc3QgY2hhciAqczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJYXRhX2Rldl9pZF9zdHJpbmcoZGV2LT5pZCwgbW9kZWxfbnVtLCBBVEFfSURfUFJPRF9PRlMsCisJCQkgIHNpemVvZihtb2RlbF9udW0pKTsKKwlzID0gJm1vZGVsX251bVswXTsKKwlsZW4gPSBzdHJubGVuKHMsIHNpemVvZihtb2RlbF9udW0pKTsKKworCS8qIEFUQVBJIHNwZWNpZmllcyB0aGF0IGVtcHR5IHNwYWNlIGlzIGJsYW5rLWZpbGxlZDsgcmVtb3ZlIGJsYW5rcyAqLworCXdoaWxlICgobGVuID4gMCkgJiYgKHNbbGVuIC0gMV0gPT0gJyAnKSkKKwkJbGVuLS07CisKKwlmb3IgKG4gPSAwOyBzaWxfYmxhY2tsaXN0W25dLnByb2R1Y3Q7IG4rKykgCisJCWlmICghbWVtY21wKHNpbF9ibGFja2xpc3Rbbl0ucHJvZHVjdCwgcywKKwkJCSAgICBzdHJsZW4oc2lsX2JsYWNrbGlzdFtuXS5wcm9kdWN0KSkpIHsKKwkJCXF1aXJrcyA9IHNpbF9ibGFja2xpc3Rbbl0ucXVpcms7CisJCQlicmVhazsKKwkJfQorCQorCS8qIGxpbWl0IHJlcXVlc3RzIHRvIDE1IHNlY3RvcnMgKi8KKwlpZiAocXVpcmtzICYgU0lMX1FVSVJLX01PRDE1V1JJVEUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXUoJXUpOiBhcHBseWluZyBTZWFnYXRlIGVycmF0YSBmaXhcbiIsCisJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8pOworCQlhcC0+aG9zdC0+bWF4X3NlY3RvcnMgPSAxNTsKKwkJYXAtPmhvc3QtPmhvc3R0LT5tYXhfc2VjdG9ycyA9IDE1OworCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19MT0NLX1NFQ1RPUlM7CisJCXJldHVybjsKKwl9CisKKwkvKiBsaW1pdCB0byB1ZG1hNSAqLworCWlmIChxdWlya3MgJiBTSUxfUVVJUktfVURNQTVNQVgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXUoJXUpOiBhcHBseWluZyBNYXh0b3IgZXJyYXRhIGZpeCAlc1xuIiwKKwkJICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubywgcyk7CisJCWFwLT51ZG1hX21hc2sgJj0gQVRBX1VETUE1OworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50IHNpbF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXZvaWQgKm1taW9fYmFzZTsKKwlpbnQgcmM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHBjaV9kZXZfYnVzeSA9IDA7CisJdTMyIHRtcCwgaXJxX21hc2s7CisJdTggY2xzOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwkvKgorCSAqIElmIHRoaXMgZHJpdmVyIGhhcHBlbnMgdG8gb25seSBiZSB1c2VmdWwgb24gQXBwbGUncyBLMiwgdGhlbgorCSAqIHdlIHNob3VsZCBjaGVjayB0aGF0IGhlcmUgYXMgaXQgaGFzIGEgbm9ybWFsIFNlcnZlcndvcmtzIElECisJICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKworCXByb2JlX2VudCA9IGttYWxsb2Moc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYmVfZW50ID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YoKnByb2JlX2VudCkpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7CisJcHJvYmVfZW50LT5wb3J0X29wcyA9IHNpbF9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0ucG9ydF9vcHM7CisJcHJvYmVfZW50LT5zaHQgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLnNodDsKKwlwcm9iZV9lbnQtPm5fcG9ydHMgPSAoZW50LT5kcml2ZXJfZGF0YSA9PSBzaWxfMzExNCkgPyA0IDogMjsKKwlwcm9iZV9lbnQtPnBpb19tYXNrID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5waW9fbWFzazsKKwlwcm9iZV9lbnQtPm13ZG1hX21hc2sgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm13ZG1hX21hc2s7CisJcHJvYmVfZW50LT51ZG1hX21hc2sgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLnVkbWFfbWFzazsKKyAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5ob3N0X2ZsYWdzOworCisJbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSksCisJCSAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSkpOworCWlmIChtbWlvX2Jhc2UgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2VudDsKKwl9CisKKwlwcm9iZV9lbnQtPm1taW9fYmFzZSA9IG1taW9fYmFzZTsKKworCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJZm9yIChpID0gMDsgaSA8IHByb2JlX2VudC0+bl9wb3J0czsgaSsrKSB7CisJCXByb2JlX2VudC0+cG9ydFtpXS5jbWRfYWRkciA9IGJhc2UgKyBzaWxfcG9ydFtpXS50ZjsKKwkJcHJvYmVfZW50LT5wb3J0W2ldLmFsdHN0YXR1c19hZGRyID0KKwkJcHJvYmVfZW50LT5wb3J0W2ldLmN0bF9hZGRyID0gYmFzZSArIHNpbF9wb3J0W2ldLmN0bDsKKwkJcHJvYmVfZW50LT5wb3J0W2ldLmJtZG1hX2FkZHIgPSBiYXNlICsgc2lsX3BvcnRbaV0uYm1kbWE7CisJCXByb2JlX2VudC0+cG9ydFtpXS5zY3JfYWRkciA9IGJhc2UgKyBzaWxfcG9ydFtpXS5zY3I7CisJCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFtpXSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSBGSUZPIFBDSSBidXMgYXJiaXRyYXRpb24gKi8KKwljbHMgPSBzaWxfZ2V0X2RldmljZV9jYWNoZV9saW5lKHBkZXYpOworCWlmIChjbHMpIHsKKwkJY2xzID4+PSAzOworCQljbHMrKzsgIC8qIGNscyA9IChsaW5lX3NpemUvOCkrMSAqLworCQl3cml0ZWIoY2xzLCBtbWlvX2Jhc2UgKyBTSUxfRklGT19SMCk7CisJCXdyaXRlYihjbHMsIG1taW9fYmFzZSArIFNJTF9GSUZPX1cwKTsKKwkJd3JpdGViKGNscywgbW1pb19iYXNlICsgU0lMX0ZJRk9fUjEpOworCQl3cml0ZWIoY2xzLCBtbWlvX2Jhc2UgKyBTSUxfRklGT19XMik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIiglcyk6IGNhY2hlIGxpbmUgc2l6ZSBub3Qgc2V0LiAgRHJpdmVyIG1heSBub3QgZnVuY3Rpb25cbiIsCisJCQlwY2lfbmFtZShwZGV2KSk7CisKKwlpZiAoZW50LT5kcml2ZXJfZGF0YSA9PSBzaWxfMzExNCkgeworCQlpcnFfbWFzayA9IFNJTF9NQVNLXzRQT1JUOworCisJCS8qIGZsaXAgdGhlIG1hZ2ljICJtYWtlIDQgcG9ydHMgd29yayIgYml0ICovCisJCXRtcCA9IHJlYWRsKG1taW9fYmFzZSArIFNJTF9JREUyX0JNRE1BKTsKKwkJaWYgKCh0bXAgJiBTSUxfSU5UUl9TVEVFUklORykgPT0gMCkKKwkJCXdyaXRlbCh0bXAgfCBTSUxfSU5UUl9TVEVFUklORywKKwkJCSAgICAgICBtbWlvX2Jhc2UgKyBTSUxfSURFMl9CTURNQSk7CisKKwl9IGVsc2UgeworCQlpcnFfbWFzayA9IFNJTF9NQVNLXzJQT1JUOworCX0KKworCS8qIG1ha2Ugc3VyZSBJREUwLzEvMi8zIGludGVycnVwdHMgYXJlIG5vdCBtYXNrZWQgKi8KKwl0bXAgPSByZWFkbChtbWlvX2Jhc2UgKyBTSUxfU1lTQ0ZHKTsKKwlpZiAodG1wICYgaXJxX21hc2spIHsKKwkJdG1wICY9IH5pcnFfbWFzazsKKwkJd3JpdGVsKHRtcCwgbW1pb19iYXNlICsgU0lMX1NZU0NGRyk7CisJCXJlYWRsKG1taW9fYmFzZSArIFNJTF9TWVNDRkcpOwkvKiBmbHVzaCAqLworCX0KKworCS8qIG1hc2sgYWxsIFNBVEEgcGh5LXJlbGF0ZWQgaW50ZXJydXB0cyAqLworCS8qIFRPRE86IHVubWFzayBiaXQgNiAoU0Vycm9yIE4gYml0KSBmb3IgaG90cGx1ZyAqLworCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykKKwkJd3JpdGVsKDAsIG1taW9fYmFzZSArIHNpbF9wb3J0W2ldLnNpZW4pOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2luaXQgc2lsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzaWxfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaWxfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2lsX3BjaV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHNpbF9pbml0KTsKK21vZHVsZV9leGl0KHNpbF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNWRkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogIHNhdGFfc2lzLmMgLSBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBTQVRBCisgKgorICogIE1haW50YWluZWQgYnk6ICBVd2UgS296aW9sZWsKKyAqICAJCSAgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworICoJCSAgICBvbiBlbWFpbHMuCisgKgorICogIENvcHlyaWdodCAyMDA0IFV3ZSBLb3ppb2xlaworICoKKyAqICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBPcGVuCisgKiAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICogIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvb3NsLTEuMS50eHQgYW5kIGlzIGluY2x1ZGVkIGhlcmVpbgorICogIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgKiAgaW4gdGhlIGtlcm5lbCBzb3VyY2UgQ09QWUlORyBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mCisgKiAgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93CisgKiAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogIHRoZSBPU0wsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICogIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIKKyAqICB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfc2lzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41IgorCitlbnVtIHsKKwlzaXNfMTgwCQkJPSAwLAorCVNJU19TQ1JfUENJX0JBUgkJPSA1LAorCisJLyogUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJU0lTX0dFTkNUTAkJPSAweDU0LCAvKiBJREUgR2VuZXJhbCBDb250cm9sIHJlZ2lzdGVyICovCisJU0lTX1NDUl9CQVNFCQk9IDB4YzAsIC8qIHNhdGEwIHBoeSBTQ1IgcmVnaXN0ZXJzICovCisJU0lTX1NBVEExX09GUwkJPSAweDEwLCAvKiBvZmZzZXQgZnJvbSBzYXRhMC0+c2F0YTEgcGh5IHJlZ3MgKi8KKworCS8qIHJhbmRvbSBiaXRzICovCisJU0lTX0ZMQUdfQ0ZHU0NSCQk9ICgxIDw8IDMwKSwgLyogaG9zdCBmbGFnOiBTQ1JzIHZpYSBQQ0kgY2ZnICovCisKKwlHRU5DVExfSU9NQVBQRURfU0NSCT0gKDEgPDwgMjYpLCAvKiBpZiBzZXQsIFNDUnMgYXJlIGluIElPIHNwYWNlICovCit9OworCitzdGF0aWMgaW50IHNpc19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHUzMiBzaXNfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOworc3RhdGljIHZvaWQgc2lzX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXNfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TSSwgMHgxODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHNpc18xODAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU0ksIDB4MTgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzaXNfMTgwIH0sCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzaXNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IHNpc19wY2lfdGJsLAorCS5wcm9iZQkJCT0gc2lzX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgc2lzX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IEFUQV9NQVhfUFJELAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLm9yZGVyZWRfZmx1c2gJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaXNfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkucGh5X3Jlc2V0CQk9IHNhdGFfcGh5X3Jlc2V0LAorCS5ibWRtYV9zZXR1cCAgICAgICAgICAgID0gYXRhX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydCAgICAgICAgICAgID0gYXRhX2JtZG1hX3N0YXJ0LAorCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisJLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKwkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCisJLnNjcl9yZWFkCQk9IHNpc19zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IHNpc19zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpc19wb3J0X2luZm8gPSB7CisJLnNodAkJPSAmc2lzX3NodCwKKwkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TQVRBX1JFU0VUIHwKKwkJCSAgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCS5waW9fbWFzawk9IDB4MWYsCisJLm13ZG1hX21hc2sJPSAweDcsCisJLnVkbWFfbWFzawk9IDB4N2YsCisJLnBvcnRfb3BzCT0gJnNpc19vcHMsCit9OworCisKK01PRFVMRV9BVVRIT1IoIlV3ZSBLb3ppb2xlayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBTaWxpY29uIEludGVncmF0YWQgU3lzdGVtcyBTQVRBIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaXNfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3Njcl9jZmdfYWRkcih1bnNpZ25lZCBpbnQgcG9ydF9ubywgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwl1bnNpZ25lZCBpbnQgYWRkciA9IFNJU19TQ1JfQkFTRSArICg0ICogc2NfcmVnKTsKKworCWlmIChwb3J0X25vKQorCQlhZGRyICs9IFNJU19TQVRBMV9PRlM7CisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyB1MzIgc2lzX3Njcl9jZmdfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAtPnBvcnRfbm8sIHNjX3JlZyk7CisJdTMyIHZhbDsKKworCWlmIChzY19yZWcgPT0gU0NSX0VSUk9SKSAvKiBkb2Vzbid0IGV4aXN0IGluIFBDSSBjZmcgc3BhY2UgKi8KKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyLCAmdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBzaXNfc2NyX2NmZ193cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjciwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOworCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAtPnBvcnRfbm8sIHNjcik7CisKKwlpZiAoc2NyID09IFNDUl9FUlJPUikgLyogZG9lc24ndCBleGlzdCBpbiBQQ0kgY2ZnIHNwYWNlICovCisJCXJldHVybjsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyLCB2YWwpOworfQorCitzdGF0aWMgdTMyIHNpc19zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKworCWlmIChhcC0+ZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpCisJCXJldHVybiBzaXNfc2NyX2NmZ19yZWFkKGFwLCBzY19yZWcpOworCXJldHVybiBpbmwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpc19zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQorCQlyZXR1cm47CisKKwlpZiAoYXAtPmZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKQorCQlzaXNfc2NyX2NmZ193cml0ZShhcCwgc2NfcmVnLCB2YWwpOworCWVsc2UKKwkJb3V0bCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworfQorCisvKiBtb3ZlIHRvIFBDSSBsYXllciwgaW50ZWdyYXRlIHcvIE1TSSBzdHVmZiAqLworc3RhdGljIHZvaWQgcGNpX2VuYWJsZV9pbnR4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBwY2lfY29tbWFuZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOworCWlmIChwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkgeworCQlwY2lfY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2lzX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50ID0gTlVMTDsKKwlpbnQgcmM7CisJdTMyIGdlbmN0bDsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpOworCWludCBwY2lfZGV2X2J1c3kgPSAwOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJjKSB7CisJCXBjaV9kZXZfYnVzeSA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKworCXBwaSA9ICZzaXNfcG9ydF9pbmZvOworCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCAmcHBpKTsKKwlpZiAoIXByb2JlX2VudCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCS8qIGNoZWNrIGFuZCBzZWUgaWYgdGhlIFNDUnMgYXJlIGluIElPIHNwYWNlIG9yIFBDSSBjZmcgc3BhY2UgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgU0lTX0dFTkNUTCwgJmdlbmN0bCk7CisJaWYgKChnZW5jdGwgJiBHRU5DVExfSU9NQVBQRURfU0NSKSA9PSAwKQorCQlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgfD0gU0lTX0ZMQUdfQ0ZHU0NSOworCQorCS8qIGlmIGhhcmR3YXJlIHRoaW5rcyBTQ1JzIGFyZSBpbiBJTyBzcGFjZSwgYnV0IHRoZXJlIGFyZQorCSAqIG5vIElPIHJlc291cmNlcyBhc3NpZ25lZCwgY2hhbmdlIHRvIFBDSSBjZmcgc3BhY2UuCisJICovCisJaWYgKCghKHByb2JlX2VudC0+aG9zdF9mbGFncyAmIFNJU19GTEFHX0NGR1NDUikpICYmCisJICAgICgocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNJU19TQ1JfUENJX0JBUikgPT0gMCkgfHwKKwkgICAgIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFNJU19TQ1JfUENJX0JBUikgPCAxMjgpKSkgeworCQlnZW5jdGwgJj0gfkdFTkNUTF9JT01BUFBFRF9TQ1I7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgU0lTX0dFTkNUTCwgZ2VuY3RsKTsKKwkJcHJvYmVfZW50LT5ob3N0X2ZsYWdzIHw9IFNJU19GTEFHX0NGR1NDUjsKKwl9CisKKwlpZiAoIShwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSB7CisJCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9CisJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgU0lTX1NDUl9QQ0lfQkFSKTsKKwkJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0KKwkJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTSVNfU0NSX1BDSV9CQVIpICsgNjQ7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX2VuYWJsZV9pbnR4KHBkZXYpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKKworfQorCitzdGF0aWMgaW50IF9faW5pdCBzaXNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNpc19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNpc19leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaXNfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNpc19pbml0KTsKK21vZHVsZV9leGl0KHNpc19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zdncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFhNWQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qCisgKiAgc2F0YV9zdncuYyAtIFNlcnZlcldvcmtzIC8gQXBwbGUgSzIgU0FUQQorICoKKyAqICBNYWludGFpbmVkIGJ5OiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+IGFuZAorICoJCSAgIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqICAJCSAgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworICoJCSAgICBvbiBlbWFpbHMuCisgKgorICogIENvcHlyaWdodCAyMDAzIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgQml0cyBmcm9tIEplZmYgR2FyemlrLCBDb3B5cmlnaHQgUmVkSGF0LCBJbmMuCisgKgorICogIFRoaXMgZHJpdmVyIHByb2JhYmx5IHdvcmtzIHdpdGggbm9uLUFwcGxlIHZlcnNpb25zIG9mIHRoZQorICogIEJyb2FkY29tIGNoaXBzZXQuLi4KKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICogIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEgdGhhdCBjYW4gYmUgZm91bmQgYXQKKyAqICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAqICBieSByZWZlcmVuY2UuCisgKgorICogIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSBhcyBkaXN0cmlidXRlZAorICogIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICogIHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICogIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4KKyAqICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgKiAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjaWZkZWYgQ09ORklHX1BQQ19PRgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfc3Z3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wNSIKKworLyogVGFza2ZpbGUgcmVnaXN0ZXJzIG9mZnNldHMgKi8KKyNkZWZpbmUgSzJfU0FUQV9URl9DTURfT0ZGU0VUCQkweDAwCisjZGVmaW5lIEsyX1NBVEFfVEZfREFUQV9PRkZTRVQJCTB4MDAKKyNkZWZpbmUgSzJfU0FUQV9URl9FUlJPUl9PRkZTRVQJCTB4MDQKKyNkZWZpbmUgSzJfU0FUQV9URl9OU0VDVF9PRkZTRVQJCTB4MDgKKyNkZWZpbmUgSzJfU0FUQV9URl9MQkFMX09GRlNFVAkJMHgwYworI2RlZmluZSBLMl9TQVRBX1RGX0xCQU1fT0ZGU0VUCQkweDEwCisjZGVmaW5lIEsyX1NBVEFfVEZfTEJBSF9PRkZTRVQJCTB4MTQKKyNkZWZpbmUgSzJfU0FUQV9URl9ERVZJQ0VfT0ZGU0VUCTB4MTgKKyNkZWZpbmUgSzJfU0FUQV9URl9DTURTVEFUX09GRlNFVCAgICAgIAkweDFjCisjZGVmaW5lIEsyX1NBVEFfVEZfQ1RMX09GRlNFVAkJMHgyMAorCisvKiBETUEgYmFzZSAqLworI2RlZmluZSBLMl9TQVRBX0RNQV9DTURfT0ZGU0VUCQkweDMwCisKKy8qIFNDUnMgYmFzZSAqLworI2RlZmluZSBLMl9TQVRBX1NDUl9TVEFUVVNfT0ZGU0VUCTB4NDAKKyNkZWZpbmUgSzJfU0FUQV9TQ1JfRVJST1JfT0ZGU0VUCTB4NDQKKyNkZWZpbmUgSzJfU0FUQV9TQ1JfQ09OVFJPTF9PRkZTRVQJMHg0OAorCisvKiBPdGhlcnMgKi8KKyNkZWZpbmUgSzJfU0FUQV9TSUNSMV9PRkZTRVQJCTB4ODAKKyNkZWZpbmUgSzJfU0FUQV9TSUNSMl9PRkZTRVQJCTB4ODQKKyNkZWZpbmUgSzJfU0FUQV9TSU1fT0ZGU0VUCQkweDg4CisKKy8qIFBvcnQgc3RyaWRlICovCisjZGVmaW5lIEsyX1NBVEFfUE9SVF9PRkZTRVQJCTB4MTAwCisKKworc3RhdGljIHUzMiBrMl9zYXRhX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCBrMl9zYXRhX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywKKwkJCSAgICAgICB1MzIgdmFsKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuOworCXdyaXRlbCh2YWwsICh2b2lkICopIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworfQorCisKK3N0YXRpYyB2b2lkIGsyX3NhdGFfdGZfbG9hZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkciA9ICZhcC0+aW9hZGRyOworCXVuc2lnbmVkIGludCBpc19hZGRyID0gdGYtPmZsYWdzICYgQVRBX1RGTEFHX0lTQUREUjsKKworCWlmICh0Zi0+Y3RsICE9IGFwLT5sYXN0X2N0bCkgeworCQl3cml0ZWIodGYtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJCWFwLT5sYXN0X2N0bCA9IHRmLT5jdGw7CisJCWF0YV93YWl0X2lkbGUoYXApOworCX0KKwlpZiAoaXNfYWRkciAmJiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0xCQTQ4KSkgeworCQl3cml0ZXcodGYtPmZlYXR1cmUgfCAoKCh1MTYpdGYtPmhvYl9mZWF0dXJlKSA8PCA4KSwgaW9hZGRyLT5mZWF0dXJlX2FkZHIpOworCQl3cml0ZXcodGYtPm5zZWN0IHwgKCgodTE2KXRmLT5ob2JfbnNlY3QpIDw8IDgpLCBpb2FkZHItPm5zZWN0X2FkZHIpOworCQl3cml0ZXcodGYtPmxiYWwgfCAoKCh1MTYpdGYtPmhvYl9sYmFsKSA8PCA4KSwgaW9hZGRyLT5sYmFsX2FkZHIpOworCQl3cml0ZXcodGYtPmxiYW0gfCAoKCh1MTYpdGYtPmhvYl9sYmFtKSA8PCA4KSwgaW9hZGRyLT5sYmFtX2FkZHIpOworCQl3cml0ZXcodGYtPmxiYWggfCAoKCh1MTYpdGYtPmhvYl9sYmFoKSA8PCA4KSwgaW9hZGRyLT5sYmFoX2FkZHIpOworCX0gZWxzZSBpZiAoaXNfYWRkcikgeworCQl3cml0ZXcodGYtPmZlYXR1cmUsIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5uc2VjdCwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFsLCBpb2FkZHItPmxiYWxfYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhbSwgaW9hZGRyLT5sYmFtX2FkZHIpOworCQl3cml0ZXcodGYtPmxiYWgsIGlvYWRkci0+bGJhaF9hZGRyKTsKKwl9CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0RFVklDRSkKKwkJd3JpdGViKHRmLT5kZXZpY2UsIGlvYWRkci0+ZGV2aWNlX2FkZHIpOworCisJYXRhX3dhaXRfaWRsZShhcCk7Cit9CisKKworc3RhdGljIHZvaWQgazJfc2F0YV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdTE2IG5zZWN0LCBsYmFsLCBsYmFtLCBsYmFoOworCisJbnNlY3QgPSB0Zi0+bnNlY3QgPSByZWFkdyhpb2FkZHItPm5zZWN0X2FkZHIpOworCWxiYWwgPSB0Zi0+bGJhbCA9IHJlYWR3KGlvYWRkci0+bGJhbF9hZGRyKTsKKwlsYmFtID0gdGYtPmxiYW0gPSByZWFkdyhpb2FkZHItPmxiYW1fYWRkcik7CisJbGJhaCA9IHRmLT5sYmFoID0gcmVhZHcoaW9hZGRyLT5sYmFoX2FkZHIpOworCXRmLT5kZXZpY2UgPSByZWFkdyhpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKKwkJdGYtPmhvYl9mZWF0dXJlID0gcmVhZHcoaW9hZGRyLT5lcnJvcl9hZGRyKSA+PiA4OworCQl0Zi0+aG9iX25zZWN0ID0gbnNlY3QgPj4gODsKKwkJdGYtPmhvYl9sYmFsID0gbGJhbCA+PiA4OworCQl0Zi0+aG9iX2xiYW0gPSBsYmFtID4+IDg7CisJCXRmLT5ob2JfbGJhaCA9IGxiYWggPj4gODsKKyAgICAgICAgfQorfQorCisvKioKKyAqCWsyX2JtZG1hX3NldHVwX21taW8gLSBTZXQgdXAgUENJIElERSBCTURNQSB0cmFuc2FjdGlvbiAoTU1JTykKKyAqCUBxYzogSW5mbyBhc3NvY2lhdGVkIHdpdGggdGhpcyBBVEEgdHJhbnNhY3Rpb24uCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KKworc3RhdGljIHZvaWQgazJfYm1kbWFfc2V0dXBfbW1pbyAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXVuc2lnbmVkIGludCBydyA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpOworCXU4IGRtYWN0bDsKKwl2b2lkICptbWlvID0gKHZvaWQgKikgYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCS8qIGxvYWQgUFJEIHRhYmxlIGFkZHIuICovCisJbWIoKTsJLyogbWFrZSBzdXJlIFBSRCB0YWJsZSB3cml0ZXMgYXJlIHZpc2libGUgdG8gY29udHJvbGxlciAqLworCXdyaXRlbChhcC0+cHJkX2RtYSwgbW1pbyArIEFUQV9ETUFfVEFCTEVfT0ZTKTsKKworCS8qIHNwZWNpZnkgZGF0YSBkaXJlY3Rpb24sIHRyaXBsZS1jaGVjayBzdGFydCBiaXQgaXMgY2xlYXIgKi8KKwlkbWFjdGwgPSByZWFkYihtbWlvICsgQVRBX0RNQV9DTUQpOworCWRtYWN0bCAmPSB+KEFUQV9ETUFfV1IgfCBBVEFfRE1BX1NUQVJUKTsKKwlpZiAoIXJ3KQorCQlkbWFjdGwgfD0gQVRBX0RNQV9XUjsKKwl3cml0ZWIoZG1hY3RsLCBtbWlvICsgQVRBX0RNQV9DTUQpOworCisJLyogaXNzdWUgci93IGNvbW1hbmQgaWYgdGhpcyBpcyBub3QgYSBBVEEgRE1BIGNvbW1hbmQqLworCWlmIChxYy0+dGYucHJvdG9jb2wgIT0gQVRBX1BST1RfRE1BKQorCQlhcC0+b3BzLT5leGVjX2NvbW1hbmQoYXAsICZxYy0+dGYpOworfQorCisvKioKKyAqCWsyX2JtZG1hX3N0YXJ0X21taW8gLSBTdGFydCBhIFBDSSBJREUgQk1ETUEgdHJhbnNhY3Rpb24gKE1NSU8pCisgKglAcWM6IEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVRBIHRyYW5zYWN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCisKK3N0YXRpYyB2b2lkIGsyX2JtZG1hX3N0YXJ0X21taW8gKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl2b2lkICptbWlvID0gKHZvaWQgKikgYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCXU4IGRtYWN0bDsKKworCS8qIHN0YXJ0IGhvc3QgRE1BIHRyYW5zYWN0aW9uICovCisJZG1hY3RsID0gcmVhZGIobW1pbyArIEFUQV9ETUFfQ01EKTsKKwl3cml0ZWIoZG1hY3RsIHwgQVRBX0RNQV9TVEFSVCwgbW1pbyArIEFUQV9ETUFfQ01EKTsKKwkvKiBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGluIGNlcnRhaW4gU0FUQSBjb250cm9sbGVycyB0aGF0IGNhbiAKKwkgICBiZSBzZWVuIHdoZW4gdGhlIHIvdyBjb21tYW5kIGlzIGdpdmVuIHRvIHRoZSBjb250cm9sbGVyIGJlZm9yZSB0aGUgCisJICAgaG9zdCBETUEgaXMgc3RhcnRlZC4gT24gYSBSZWFkIGNvbW1hbmQsIHRoZSBjb250cm9sbGVyIHdvdWxkIGluaXRpYXRlCisJICAgdGhlIGNvbW1hbmQgdG8gdGhlIGRyaXZlIGV2ZW4gYmVmb3JlIGl0IHNlZXMgdGhlIERNQSBzdGFydC4gV2hlbiB0aGVyZQorCSAgIGFyZSB2ZXJ5IGZhc3QgZHJpdmVzIGNvbm5lY3RlZCB0byB0aGUgY29udHJvbGxlciwgb3Igd2hlbiB0aGUgZGF0YSByZXF1ZXN0IAorCSAgIGhpdHMgaW4gdGhlIGRyaXZlIGNhY2hlLCB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgZHJpdmUgcmV0dXJucyBhIHBhcnQKKwkgICBvciBhbGwgb2YgdGhlIHJlcXVlc3RlZCBkYXRhIHRvIHRoZSBjb250cm9sbGVyIGJlZm9yZSB0aGUgRE1BIHN0YXJ0IGlzIGlzc3VlZC4KKwkgICBJbiB0aGlzIGNhc2UsIHRoZSBjb250cm9sbGVyIHdvdWxkIGJlY29tZSBjb25mdXNlZCBhcyB0byB3aGF0IHRvIGRvIHdpdGggdGhlIGRhdGEuCisJICAgSW4gdGhlIHdvcnN0IGNhc2Ugd2hlbiBhbGwgdGhlIGRhdGEgaXMgcmV0dXJuZWQgYmFjayB0byB0aGUgY29udHJvbGxlciwgdGhlCisJICAgY29udHJvbGxlciBjb3VsZCBoYW5nLiBJbiBvdGhlciBjYXNlcyBpdCBjb3VsZCByZXR1cm4gcGFydGlhbCBkYXRhIHJldHVybmluZworCSAgIGluIGRhdGEgY29ycnVwdGlvbi4gVGhpcyBwcm9ibGVtIGhhcyBiZWVuIHNlZW4gaW4gUFBDIHN5c3RlbXMgYW5kIGNhbiBhbHNvIGFwcGVhcgorCSAgIG9uIGFuIHN5c3RlbSB3aXRoIHZlcnkgZmFzdCBkaXNrcywgd2hlcmUgdGhlIFNBVEEgY29udHJvbGxlciBpcyBzaXR0aW5nIGJlaGluZCBhIAorCSAgIG51bWJlciBvZiBicmlkZ2VzLCBhbmQgaGVuY2UgdGhlcmUgaXMgc2lnbmlmaWNhbnQgbGF0ZW5jeSBiZXR3ZWVuIHRoZSByL3cgY29tbWFuZAorCSAgIGFuZCB0aGUgc3RhcnQgY29tbWFuZC4gKi8KKwkvKiBpc3N1ZSByL3cgY29tbWFuZCBpZiB0aGUgYWNjZXNzIGlzIHRvIEFUQSovCisJaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEpCisJCWFwLT5vcHMtPmV4ZWNfY29tbWFuZChhcCwgJnFjLT50Zik7Cit9CisKKwkJCQkJCQkJCSAgICAgIAorc3RhdGljIHU4IGsyX3N0YXRfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisgICAgICAgCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnN0YXR1c19hZGRyKTsKK30KKworI2lmZGVmIENPTkZJR19QUENfT0YKKy8qCisgKiBrMl9zYXRhX3Byb2NfaW5mbworICogaW5vdXQgOiBkZWNpZGVzIG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGRhdGFmbG93IGFuZCB0aGUgbWVhbmluZyBvZiB0aGUKKyAqCSAgIHZhcmlhYmxlcworICogYnVmZmVyOiBJZiBpbm91dD09RkFMU0UgZGF0YSBpcyBiZWluZyB3cml0dGVuIHRvIGl0IGVsc2UgcmVhZCBmcm9tIGl0CisgKiAqc3RhcnQ6IElmIGlub3V0PT1GQUxTRSBzdGFydCBvZiB0aGUgdmFsaWQgZGF0YSBpbiB0aGUgYnVmZmVyCisgKiBvZmZzZXQ6IElmIGlub3V0PT1GQUxTRSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbWFnaW5hcnkgZmlsZQorICoJICAgZnJvbSB3aGljaCB3ZSBzdGFydCB3cml0aW5nIGludG8gdGhlIGJ1ZmZlcgorICogbGVuZ3RoOiBJZiBpbm91dD09RkFMU0UgbWF4IG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIGludG8gdGhlIGJ1ZmZlcgorICoJICAgZWxzZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGsyX3NhdGFfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBsZW4sIGluZGV4OworCisJLyogRmluZCAgdGhlIGF0YV9wb3J0ICovCisJYXAgPSAoc3RydWN0IGF0YV9wb3J0ICopICZzaG9zdC0+aG9zdGRhdGFbMF07CisJaWYgKGFwID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyogRmluZCB0aGUgT0Ygbm9kZSBmb3IgdGhlIFBDSSBkZXZpY2UgcHJvcGVyICovCisJbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUodG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldikpOworCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIE1hdGNoIGl0IHRvIGEgcG9ydCBub2RlICovCisJaW5kZXggPSAoYXAgPT0gYXAtPmhvc3Rfc2V0LT5wb3J0c1swXSkgPyAwIDogMTsKKwlmb3IgKG5wID0gbnAtPmNoaWxkOyBucCAhPSBOVUxMOyBucCA9IG5wLT5zaWJsaW5nKSB7CisJCXUzMiAqcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAoIXJlZykKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5kZXggPT0gKnJlZykKKwkJCWJyZWFrOworCX0KKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICJkZXZzcGVjOiAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KKworCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGsyX3NhdGFfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJPSBhdGFfc2NzaV9lcnJvciwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorI2lmZGVmIENPTkZJR19QUENfT0YKKwkucHJvY19pbmZvCQk9IGsyX3NhdGFfcHJvY19pbmZvLAorI2VuZGlmCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBrMl9zYXRhX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnRmX2xvYWQJCT0gazJfc2F0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGsyX3NhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGsyX3N0YXRfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBzYXRhX3BoeV9yZXNldCwKKwkuYm1kbWFfc2V0dXAJCT0gazJfYm1kbWFfc2V0dXBfbW1pbywKKwkuYm1kbWFfc3RhcnQJCT0gazJfYm1kbWFfc3RhcnRfbW1pbywKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBrMl9zYXRhX3Njcl9yZWFkLAorCS5zY3Jfd3JpdGUJCT0gazJfc2F0YV9zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorfTsKKworc3RhdGljIHZvaWQgazJfc2F0YV9zZXR1cF9wb3J0KHN0cnVjdCBhdGFfaW9wb3J0cyAqcG9ydCwgdW5zaWduZWQgbG9uZyBiYXNlKQoreworCXBvcnQtPmNtZF9hZGRyCQk9IGJhc2UgKyBLMl9TQVRBX1RGX0NNRF9PRkZTRVQ7CisJcG9ydC0+ZGF0YV9hZGRyCQk9IGJhc2UgKyBLMl9TQVRBX1RGX0RBVEFfT0ZGU0VUOworCXBvcnQtPmZlYXR1cmVfYWRkcgk9CisJcG9ydC0+ZXJyb3JfYWRkcgk9IGJhc2UgKyBLMl9TQVRBX1RGX0VSUk9SX09GRlNFVDsKKwlwb3J0LT5uc2VjdF9hZGRyCT0gYmFzZSArIEsyX1NBVEFfVEZfTlNFQ1RfT0ZGU0VUOworCXBvcnQtPmxiYWxfYWRkcgkJPSBiYXNlICsgSzJfU0FUQV9URl9MQkFMX09GRlNFVDsKKwlwb3J0LT5sYmFtX2FkZHIJCT0gYmFzZSArIEsyX1NBVEFfVEZfTEJBTV9PRkZTRVQ7CisJcG9ydC0+bGJhaF9hZGRyCQk9IGJhc2UgKyBLMl9TQVRBX1RGX0xCQUhfT0ZGU0VUOworCXBvcnQtPmRldmljZV9hZGRyCT0gYmFzZSArIEsyX1NBVEFfVEZfREVWSUNFX09GRlNFVDsKKwlwb3J0LT5jb21tYW5kX2FkZHIJPQorCXBvcnQtPnN0YXR1c19hZGRyCT0gYmFzZSArIEsyX1NBVEFfVEZfQ01EU1RBVF9PRkZTRVQ7CisJcG9ydC0+YWx0c3RhdHVzX2FkZHIJPQorCXBvcnQtPmN0bF9hZGRyCQk9IGJhc2UgKyBLMl9TQVRBX1RGX0NUTF9PRkZTRVQ7CisJcG9ydC0+Ym1kbWFfYWRkcgk9IGJhc2UgKyBLMl9TQVRBX0RNQV9DTURfT0ZGU0VUOworCXBvcnQtPnNjcl9hZGRyCQk9IGJhc2UgKyBLMl9TQVRBX1NDUl9TVEFUVVNfT0ZGU0VUOworfQorCisKK3N0YXRpYyBpbnQgazJfc2F0YV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXZvaWQgKm1taW9fYmFzZTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCS8qCisJICogSWYgdGhpcyBkcml2ZXIgaGFwcGVucyB0byBvbmx5IGJlIHVzZWZ1bCBvbiBBcHBsZSdzIEsyLCB0aGVuCisJICogd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaGVyZSBhcyBpdCBoYXMgYSBub3JtYWwgU2VydmVyd29ya3MgSUQKKwkgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCS8qCisJICogQ2hlY2sgaWYgd2UgaGF2ZSByZXNvdXJjZXMgbWFwcGVkIGF0IGFsbCAoc2Vjb25kIGZ1bmN0aW9uIG1heQorCSAqIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBmaXJtd2FyZSkKKwkgKi8KKwlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCA1KSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFJlcXVlc3QgUENJIHJlZ2lvbnMgKi8KKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCisJbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKKwlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOworCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCisJbW1pb19iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSksCisJCSAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSkpOworCWlmIChtbWlvX2Jhc2UgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2VudDsKKwl9CisJYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBtbWlvX2Jhc2U7CisKKwkvKiBDbGVhciBhIG1hZ2ljIGJpdCBpbiBTQ1IxIGFjY29yZGluZyB0byBEYXJ3aW4sIHRob3NlIGhlbHAKKwkgKiBzb21lIGZ1bmt5IHNlYWdhdGUgZHJpdmVzICh0aG91Z2ggc28gZmFyLCB0aG9zZSB3ZXJlIGFscmVhZHkKKwkgKiBzZXQgYnkgdGhlIGZpcm13YXJlIG9uIHRoZSBtYWNoaW5lcyBJIGhhZCBhY2Nlc3MgdG8KKwkgKi8KKwl3cml0ZWwocmVhZGwobW1pb19iYXNlICsgSzJfU0FUQV9TSUNSMV9PRkZTRVQpICYgfjB4MDAwNDAwMDAsCisJICAgICAgIG1taW9fYmFzZSArIEsyX1NBVEFfU0lDUjFfT0ZGU0VUKTsKKworCS8qIENsZWFyIFNBVEEgZXJyb3IgJiBpbnRlcnJ1cHRzIHdlIGRvbid0IHVzZSAqLworCXdyaXRlbCgweGZmZmZmZmZmLCBtbWlvX2Jhc2UgKyBLMl9TQVRBX1NDUl9FUlJPUl9PRkZTRVQpOworCXdyaXRlbCgweDAsIG1taW9fYmFzZSArIEsyX1NBVEFfU0lNX09GRlNFVCk7CisKKwlwcm9iZV9lbnQtPnNodCA9ICZrMl9zYXRhX3NodDsKKwlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8CisJCQkJQVRBX0ZMQUdfTk9fTEVHQUNZIHwgQVRBX0ZMQUdfTU1JTzsKKwlwcm9iZV9lbnQtPnBvcnRfb3BzID0gJmsyX3NhdGFfb3BzOworCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CisJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBTQV9TSElSUTsKKwlwcm9iZV9lbnQtPm1taW9fYmFzZSA9IG1taW9fYmFzZTsKKworCS8qIFdlIGRvbid0IGNhcmUgbXVjaCBhYm91dCB0aGUgUElPL1VETUEgbWFza3MsIGJ1dCB0aGUgY29yZSB3b24ndCBsaWtlIHVzCisJICogaWYgd2UgZG9uJ3QgZmlsbCB0aGVzZQorCSAqLworCXByb2JlX2VudC0+cGlvX21hc2sgPSAweDFmOworCXByb2JlX2VudC0+bXdkbWFfbWFzayA9IDB4NzsKKwlwcm9iZV9lbnQtPnVkbWFfbWFzayA9IDB4N2Y7CisKKwkvKiBXZSBoYXZlIDQgcG9ydHMgcGVyIFBDSSBmdW5jdGlvbiAqLworCWsyX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzBdLCBiYXNlICsgMCAqIEsyX1NBVEFfUE9SVF9PRkZTRVQpOworCWsyX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzFdLCBiYXNlICsgMSAqIEsyX1NBVEFfUE9SVF9PRkZTRVQpOworCWsyX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzJdLCBiYXNlICsgMiAqIEsyX1NBVEFfUE9SVF9PRkZTRVQpOworCWsyX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzNdLCBiYXNlICsgMyAqIEsyX1NBVEFfUE9SVF9PRkZTRVQpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgazJfc2F0YV9wY2lfdGJsW10gPSB7CisJeyAweDExNjYsIDB4MDI0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMHgxMTY2LCAweDAyNDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTE2NiwgMHgwMjQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBrMl9zYXRhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBrMl9zYXRhX3BjaV90YmwsCisJLnByb2JlCQkJPSBrMl9zYXRhX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgazJfc2F0YV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmazJfc2F0YV9wY2lfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgazJfc2F0YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZrMl9zYXRhX3BjaV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQiKTsKK01PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgSzIgU0FUQSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgazJfc2F0YV9wY2lfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoazJfc2F0YV9pbml0KTsKK21vZHVsZV9leGl0KGsyX3NhdGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3N4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTE4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYwpAQCAtMCwwICsxLDE1MDMgQEAKKy8qCisgKiAgc2F0YV9zeDQuYyAtIFByb21pc2UgU0FUQQorICoKKyAqICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogIAkJICAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisgKgkJICAgIG9uIGVtYWlscy4KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0LCBJbmMuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4KKyAqICBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMS4xIHRoYXQgY2FuIGJlIGZvdW5kIGF0CisgKiAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgKiAgYnkgcmVmZXJlbmNlLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgZGlzdHJpYnV0ZWQKKyAqICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cKKyAqICB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiAgdGhlIE9TTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKKyAqICByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuCisgKiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICogIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgT1NMIG9yIHRoZSBHUEwuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInNhdGFfcHJvbWlzZS5oIgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3N4NCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNyIKKworCitlbnVtIHsKKwlQRENfUFJEX1RCTAkJPSAweDQ0LAkvKiBEaXJlY3QgY29tbWFuZCBETUEgdGFibGUgYWRkciAqLworCisJUERDX1BLVF9TVUJNSVQJCT0gMHg0MCwgLyogQ29tbWFuZCBwYWNrZXQgcG9pbnRlciBhZGRyICovCisJUERDX0hETUFfUEtUX1NVQk1JVAk9IDB4MTAwLCAvKiBIb3N0IERNQSBwYWNrZXQgcG9pbnRlciBhZGRyICovCisJUERDX0lOVF9TRVFNQVNLCQk9IDB4NDAsCS8qIE1hc2sgb2YgYXNzZXJ0ZWQgU0VRIElOVHMgKi8KKwlQRENfSERNQV9DVExTVEFUCT0gMHgxMkMsIC8qIEhvc3QgRE1BIGNvbnRyb2wgLyBzdGF0dXMgKi8KKworCVBEQ18yMDYyMV9TRVFDVEwJPSAweDQwMCwKKwlQRENfMjA2MjFfU0VRTUFTSwk9IDB4NDgwLAorCVBEQ18yMDYyMV9HRU5FUkFMX0NUTAk9IDB4NDg0LAorCVBEQ18yMDYyMV9QQUdFX1NJWkUJPSAoMzIgKiAxMDI0KSwKKworCS8qIGNob3Nlbiwgbm90IGNvbnN0YW50LCB2YWx1ZXM7IHdlIGRlc2lnbiBvdXIgb3duIERJTU0gbWVtIG1hcCAqLworCVBEQ18yMDYyMV9ESU1NX1dJTkRPVwk9IDB4MEMsCS8qIHBhZ2UjIGZvciAzMksgRElNTSB3aW5kb3cgKi8KKwlQRENfMjA2MjFfRElNTV9CQVNFCT0gMHgwMDIwMDAwMCwKKwlQRENfMjA2MjFfRElNTV9EQVRBCT0gKDY0ICogMTAyNCksCisJUERDX0RJTU1fREFUQV9TVEVQCT0gKDI1NiAqIDEwMjQpLAorCVBEQ19ESU1NX1dJTkRPV19TVEVQCT0gKDggKiAxMDI0KSwKKwlQRENfRElNTV9IT1NUX1BSRAk9ICg2ICogMTAyNCksCisJUERDX0RJTU1fSE9TVF9QS1QJPSAoMTI4ICogMCksCisJUERDX0RJTU1fSFBLVF9QUkQJPSAoMTI4ICogMSksCisJUERDX0RJTU1fQVRBX1BLVAk9ICgxMjggKiAyKSwKKwlQRENfRElNTV9BUEtUX1BSRAk9ICgxMjggKiAzKSwKKwlQRENfRElNTV9IRUFERVJfU1oJPSBQRENfRElNTV9BUEtUX1BSRCArIDEyOCwKKwlQRENfUEFHRV9XSU5ET1cJCT0gMHg0MCwKKwlQRENfUEFHRV9EQVRBCQk9IFBEQ19QQUdFX1dJTkRPVyArCisJCQkJICAoUERDXzIwNjIxX0RJTU1fREFUQSAvIFBEQ18yMDYyMV9QQUdFX1NJWkUpLAorCVBEQ19QQUdFX1NFVAkJPSBQRENfRElNTV9EQVRBX1NURVAgLyBQRENfMjA2MjFfUEFHRV9TSVpFLAorCisJUERDX0NISVAwX09GUwkJPSAweEMwMDAwLCAvKiBvZmZzZXQgb2YgY2hpcCAjMCAqLworCisJUERDXzIwNjIxX0VSUl9NQVNLCT0gKDE8PDE5KSB8ICgxPDwyMCkgfCAoMTw8MjEpIHwgKDE8PDIyKSB8CisJCQkJICAoMTw8MjMpLAorCisJYm9hcmRfMjA2MjEJCT0gMCwJLyogRmFzdFRyYWsgUzE1MCBTWDQgKi8KKworCVBEQ19SRVNFVAkJPSAoMSA8PCAxMSksIC8qIEhETUEgcmVzZXQgKi8KKworCVBEQ19NQVhfSERNQQkJPSAzMiwKKwlQRENfSERNQV9RX01BU0sJCT0gKFBEQ19NQVhfSERNQSAtIDEpLAorCisJUERDX0RJTU0wX1NQRF9ERVZfQUREUkVTUyAgICAgPSAweDUwLAorCVBEQ19ESU1NMV9TUERfREVWX0FERFJFU1MgICAgID0gMHg1MSwKKwlQRENfTUFYX0RJTU1fTU9EVUxFICAgICAgICAgICA9IDB4MDIsCisJUERDX0kyQ19DT05UUk9MX09GRlNFVCAgICAgICAgPSAweDQ4LAorCVBEQ19JMkNfQUREUl9EQVRBX09GRlNFVCAgICAgID0gMHg0QywKKwlQRENfRElNTTBfQ09OVFJPTF9PRkZTRVQgICAgICA9IDB4ODAsCisJUERDX0RJTU0xX0NPTlRST0xfT0ZGU0VUICAgICAgPSAweDg0LAorCVBEQ19TRFJBTV9DT05UUk9MX09GRlNFVCAgICAgID0gMHg4OCwKKwlQRENfSTJDX1dSSVRFICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisJUERDX0kyQ19SRUFEICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDQwLAkKKwlQRENfSTJDX1NUQVJUICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwODAsCisJUERDX0kyQ19NQVNLX0lOVCAgICAgICAgICAgICAgPSAweDAwMDAwMDIwLAorCVBEQ19JMkNfQ09NUExFVEUgICAgICAgICAgICAgID0gMHgwMDAxMDAwMCwKKwlQRENfSTJDX05PX0FDSyAgICAgICAgICAgICAgICA9IDB4MDAxMDAwMDAsCisJUERDX0RJTU1fU1BEX1NVQkFERFJFU1NfU1RBUlQgPSAweDAwLAorCVBEQ19ESU1NX1NQRF9TVUJBRERSRVNTX0VORCAgID0gMHg3RiwKKwlQRENfRElNTV9TUERfUk9XX05VTSAgICAgICAgICA9IDMsCisJUERDX0RJTU1fU1BEX0NPTFVNTl9OVU0gICAgICAgPSA0LAorCVBEQ19ESU1NX1NQRF9NT0RVTEVfUk9XICAgICAgID0gNSwKKwlQRENfRElNTV9TUERfVFlQRSAgICAgICAgICAgICA9IDExLAorCVBEQ19ESU1NX1NQRF9GUkVTSF9SQVRFICAgICAgID0gMTIsICAgICAgICAgCisJUERDX0RJTU1fU1BEX0JBTktfTlVNICAgICAgICAgPSAxNywJCisJUERDX0RJTU1fU1BEX0NBU19MQVRFTkNZICAgICAgPSAxOCwKKwlQRENfRElNTV9TUERfQVRUUklCVVRFICAgICAgICA9IDIxLCAgICAKKwlQRENfRElNTV9TUERfUk9XX1BSRV9DSEFSR0UgICA9IDI3LAorCVBEQ19ESU1NX1NQRF9ST1dfQUNUSVZFX0RFTEFZID0gMjgsICAgICAgCisJUERDX0RJTU1fU1BEX1JBU19DQVNfREVMQVkgICAgPSAyOSwKKwlQRENfRElNTV9TUERfQUNUSVZFX1BSRUNIQVJHRSA9IDMwLAorCVBEQ19ESU1NX1NQRF9TWVNURU1fRlJFUSAgICAgID0gMTI2LAorCVBEQ19DVExfU1RBVFVTCQkgICAgICA9IDB4MDgsCQorCVBEQ19ESU1NX1dJTkRPV19DVExSCSAgICAgID0gMHgwQywKKwlQRENfVElNRV9DT05UUk9MICAgICAgICAgICAgICA9IDB4M0MsCisJUERDX1RJTUVfUEVSSU9EICAgICAgICAgICAgICAgPSAweDQwLAorCVBEQ19USU1FX0NPVU5URVIgICAgICAgICAgICAgID0gMHg0NCwKKwlQRENfR0VORVJBTF9DVExSCSAgICAgID0gMHg0ODQsCisJUENJX1BMTF9JTklUICAgICAgICAgICAgICAgICAgPSAweDhBNTMxODI0LAorCVBDSV9YX1RDT1VOVCAgICAgICAgICAgICAgICAgID0gMHhFRTFFNUNGRgorfTsKKworCitzdHJ1Y3QgcGRjX3BvcnRfcHJpdiB7CisJdTgJCQlkaW1tX2J1ZlsoQVRBX1BSRF9TWiAqIEFUQV9NQVhfUFJEKSArIDUxMl07CisJdTgJCQkqcGt0OworCWRtYV9hZGRyX3QJCXBrdF9kbWE7Cit9OworCitzdHJ1Y3QgcGRjX2hvc3RfcHJpdiB7CisJdm9pZAkJCSpkaW1tX21taW87CisKKwl1bnNpZ25lZCBpbnQJCWRvaW5nX2hkbWE7CisJdW5zaWduZWQgaW50CQloZG1hX3Byb2Q7CisJdW5zaWduZWQgaW50CQloZG1hX2NvbnM7CisJc3RydWN0IHsKKwkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwkJdW5zaWduZWQgaW50CXNlcTsKKwkJdW5zaWduZWQgbG9uZwlwa3Rfb2ZzOworCX0gaGRtYVszMl07Cit9OworCisKK3N0YXRpYyBpbnQgcGRjX3NhdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwZGMyMDYyMV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgcGRjX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcGRjXzIwNjIxX3BoeV9yZXNldCAoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcGRjX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdm9pZCBwZGNfdGZfbG9hZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKK3N0YXRpYyB2b2lkIHBkY19leGVjX2NvbW1hbmRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CitzdGF0aWMgdm9pZCBwZGMyMDYyMV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9kaW1tX2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKTsKK3N0YXRpYyBpbnQgcGRjMjA2MjFfZGV0ZWN0X2RpbW0oc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfaTJjX3JlYWQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlLCAKKwkJCQkgICAgICB1MzIgZGV2aWNlLCB1MzIgc3ViYWRkciwgdTMyICpwZGF0YSk7CitzdGF0aWMgaW50IHBkYzIwNjIxX3Byb2dfZGltbTAoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfcHJvZ19kaW1tX2dsb2JhbChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUpOworI2lmZGVmIEFUQV9WRVJCT1NFX0RFQlVHCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwgCisJCQkJICAgdm9pZCAqcHNvdXJjZSwgdTMyIG9mZnNldCwgdTMyIHNpemUpOworI2VuZGlmCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9wdXRfdG9fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIAorCQkJCSB2b2lkICpwc291cmNlLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSk7CitzdGF0aWMgdm9pZCBwZGMyMDYyMV9pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IHBkYzIwNjIxX3FjX2lzc3VlX3Byb3Qoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CisKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBwZGNfc2F0YV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGRjXzIwNjIxX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLnRmX2xvYWQJCT0gcGRjX3RmX2xvYWRfbW1pbywKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBwZGNfZXhlY19jb21tYW5kX21taW8sCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCS5waHlfcmVzZXQJCT0gcGRjXzIwNjIxX3BoeV9yZXNldCwKKwkucWNfcHJlcAkJPSBwZGMyMDYyMV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBwZGMyMDYyMV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBwZGNfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IHBkYzIwNjIxX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IHBkYzIwNjIxX2lycV9jbGVhciwKKwkucG9ydF9zdGFydAkJPSBwZGNfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IHBkY19wb3J0X3N0b3AsCisJLmhvc3Rfc3RvcAkJPSBwZGMyMDYyMV9ob3N0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gcGRjX3BvcnRfaW5mb1tdID0geworCS8qIGJvYXJkXzIwNjIxICovCisJeworCQkuc2h0CQk9ICZwZGNfc2F0YV9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTU1JTywKKwkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLworCQkucG9ydF9vcHMJPSAmcGRjXzIwNjIxX29wcywKKwl9LAorCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGRjX3NhdGFfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9QUk9NSVNFLCAweDY2MjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF8yMDYyMSB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGRjX3NhdGFfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IHBkY19zYXRhX3BjaV90YmwsCisJLnByb2JlCQkJPSBwZGNfc2F0YV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCit9OworCisKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKK3sKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CisKKwlpb3VubWFwKGRpbW1fbW1pbyk7CisJa2ZyZWUoaHByaXYpOworfQorCitzdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CisJc3RydWN0IHBkY19wb3J0X3ByaXYgKnBwOworCWludCByYzsKKworCXJjID0gYXRhX3BvcnRfc3RhcnQoYXApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcHAgPSBrbWFsbG9jKHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwltZW1zZXQocHAsIDAsIHNpemVvZigqcHApKTsKKworCXBwLT5wa3QgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCAxMjgsICZwcC0+cGt0X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcC0+cGt0KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2tmcmVlOworCX0KKworCWFwLT5wcml2YXRlX2RhdGEgPSBwcDsKKworCXJldHVybiAwOworCitlcnJfb3V0X2tmcmVlOgorCWtmcmVlKHBwKTsKK2Vycl9vdXQ6CisJYXRhX3BvcnRfc3RvcChhcCk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyB2b2lkIHBkY19wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdF9zZXQtPmRldjsKKwlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCisJYXAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCAxMjgsIHBwLT5wa3QsIHBwLT5wa3RfZG1hKTsKKwlrZnJlZShwcCk7CisJYXRhX3BvcnRfc3RvcChhcCk7Cit9CisKKworc3RhdGljIHZvaWQgcGRjXzIwNjIxX3BoeV9yZXNldCAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisgICAgICAgIGFwLT5jYmwgPSBBVEFfQ0JMX1NBVEE7CisgICAgICAgIGF0YV9wb3J0X3Byb2JlKGFwKTsKKyAgICAgICAgYXRhX2J1c19yZXNldChhcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZGMyMDYyMV9hdGFfc2coc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHU4ICpidWYsCisJCQkJICAgIAkgICB1bnNpZ25lZCBpbnQgcG9ydG5vLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKQoreworCXUzMiBhZGRyOworCXVuc2lnbmVkIGludCBkdyA9IFBEQ19ESU1NX0FQS1RfUFJEID4+IDI7CisJdTMyICpidWYzMiA9ICh1MzIgKikgYnVmOworCisJLyogb3V0cHV0IEFUQSBwYWNrZXQgUy9HIHRhYmxlICovCisJYWRkciA9IFBEQ18yMDYyMV9ESU1NX0JBU0UgKyBQRENfMjA2MjFfRElNTV9EQVRBICsKKwkgICAgICAgKFBEQ19ESU1NX0RBVEFfU1RFUCAqIHBvcnRubyk7CisJVlBSSU5USygiQVRBIHNnIGFkZHIgMHgleCwgJWRcbiIsIGFkZHIsIGFkZHIpOworCWJ1ZjMyW2R3XSA9IGNwdV90b19sZTMyKGFkZHIpOworCWJ1ZjMyW2R3ICsgMV0gPSBjcHVfdG9fbGUzMih0b3RhbF9sZW4gfCBBVEFfUFJEX0VPVCk7CisKKwlWUFJJTlRLKCJBVEEgUFNHIEAgJXggPT0gKDB4JXgsIDB4JXgpXG4iLAorCQlQRENfMjA2MjFfRElNTV9CQVNFICsKKwkJICAgICAgIChQRENfRElNTV9XSU5ET1dfU1RFUCAqIHBvcnRubykgKworCQkgICAgICAgUERDX0RJTU1fQVBLVF9QUkQsCisJCWJ1ZjMyW2R3XSwgYnVmMzJbZHcgKyAxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZGMyMDYyMV9ob3N0X3NnKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCB1OCAqYnVmLAorCQkJCSAgICAJICAgIHVuc2lnbmVkIGludCBwb3J0bm8sCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuKQoreworCXUzMiBhZGRyOworCXVuc2lnbmVkIGludCBkdyA9IFBEQ19ESU1NX0hQS1RfUFJEID4+IDI7CisJdTMyICpidWYzMiA9ICh1MzIgKikgYnVmOworCisJLyogb3V0cHV0IEhvc3QgRE1BIHBhY2tldCBTL0cgdGFibGUgKi8KKwlhZGRyID0gUERDXzIwNjIxX0RJTU1fQkFTRSArIFBEQ18yMDYyMV9ESU1NX0RBVEEgKworCSAgICAgICAoUERDX0RJTU1fREFUQV9TVEVQICogcG9ydG5vKTsKKworCWJ1ZjMyW2R3XSA9IGNwdV90b19sZTMyKGFkZHIpOworCWJ1ZjMyW2R3ICsgMV0gPSBjcHVfdG9fbGUzMih0b3RhbF9sZW4gfCBBVEFfUFJEX0VPVCk7CisKKwlWUFJJTlRLKCJIT1NUIFBTRyBAICV4ID09ICgweCV4LCAweCV4KVxuIiwKKwkJUERDXzIwNjIxX0RJTU1fQkFTRSArCisJCSAgICAgICAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0bm8pICsKKwkJICAgICAgIFBEQ19ESU1NX0hQS1RfUFJELAorCQlidWYzMltkd10sIGJ1ZjMyW2R3ICsgMV0pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwZGMyMDYyMV9hdGFfcGt0KHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLAorCQkJCQkgICAgdW5zaWduZWQgaW50IGRldm5vLCB1OCAqYnVmLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHBvcnRubykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgZHc7CisJdTMyICpidWYzMiA9ICh1MzIgKikgYnVmOworCXU4IGRldl9yZWc7CisKKwl1bnNpZ25lZCBpbnQgZGltbV9zZyA9IFBEQ18yMDYyMV9ESU1NX0JBU0UgKworCQkJICAgICAgIChQRENfRElNTV9XSU5ET1dfU1RFUCAqIHBvcnRubykgKworCQkJICAgICAgIFBEQ19ESU1NX0FQS1RfUFJEOworCVZQUklOVEsoIkVOVEVSLCBkaW1tX3NnID09IDB4JXgsICVkXG4iLCBkaW1tX3NnLCBkaW1tX3NnKTsKKworCWkgPSBQRENfRElNTV9BVEFfUEtUOworCisJLyoKKwkgKiBTZXQgdXAgQVRBIHBhY2tldAorCSAqLworCWlmICgodGYtPnByb3RvY29sID09IEFUQV9QUk9UX0RNQSkgJiYgKCEodGYtPmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKSkpCisJCWJ1ZltpKytdID0gUERDX1BLVF9SRUFEOworCWVsc2UgaWYgKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9OT0RBVEEpCisJCWJ1ZltpKytdID0gUERDX1BLVF9OT0RBVEE7CisJZWxzZQorCQlidWZbaSsrXSA9IDA7CisJYnVmW2krK10gPSAwOwkJCS8qIHJlc2VydmVkICovCisJYnVmW2krK10gPSBwb3J0bm8gKyAxOwkJLyogc2VxLiBpZCAqLworCWJ1ZltpKytdID0gMHhmZjsJCS8qIGRlbGF5IHNlcS4gaWQgKi8KKworCS8qIGRpbW0gZG1hIFMvRywgYW5kIG5leHQtcGt0ICovCisJZHcgPSBpID4+IDI7CisJaWYgKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9OT0RBVEEpCisJCWJ1ZjMyW2R3XSA9IDA7CisJZWxzZQorCQlidWYzMltkd10gPSBjcHVfdG9fbGUzMihkaW1tX3NnKTsKKwlidWYzMltkdyArIDFdID0gMDsKKwlpICs9IDg7CisKKwlpZiAoZGV2bm8gPT0gMCkKKwkJZGV2X3JlZyA9IEFUQV9ERVZJQ0VfT0JTOworCWVsc2UKKwkJZGV2X3JlZyA9IEFUQV9ERVZJQ0VfT0JTIHwgQVRBX0RFVjE7CisKKwkvKiBzZWxlY3QgZGV2aWNlICovCisJYnVmW2krK10gPSAoMSA8PCA1KSB8IFBEQ19QS1RfQ0xFQVJfQlNZIHwgQVRBX1JFR19ERVZJQ0U7CisJYnVmW2krK10gPSBkZXZfcmVnOworCisJLyogZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlidWZbaSsrXSA9ICgxIDw8IDUpIHwgUERDX1JFR19ERVZDVEw7CisJYnVmW2krK10gPSB0Zi0+Y3RsOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZGMyMDYyMV9ob3N0X3BrdChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTggKmJ1ZiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBwb3J0bm8pCit7CisJdW5zaWduZWQgaW50IGR3OworCXUzMiB0bXAsICpidWYzMiA9ICh1MzIgKikgYnVmOworCisJdW5zaWduZWQgaW50IGhvc3Rfc2cgPSBQRENfMjA2MjFfRElNTV9CQVNFICsKKwkJCSAgICAgICAoUERDX0RJTU1fV0lORE9XX1NURVAgKiBwb3J0bm8pICsKKwkJCSAgICAgICBQRENfRElNTV9IT1NUX1BSRDsKKwl1bnNpZ25lZCBpbnQgZGltbV9zZyA9IFBEQ18yMDYyMV9ESU1NX0JBU0UgKworCQkJICAgICAgIChQRENfRElNTV9XSU5ET1dfU1RFUCAqIHBvcnRubykgKworCQkJICAgICAgIFBEQ19ESU1NX0hQS1RfUFJEOworCVZQUklOVEsoIkVOVEVSLCBkaW1tX3NnID09IDB4JXgsICVkXG4iLCBkaW1tX3NnLCBkaW1tX3NnKTsKKwlWUFJJTlRLKCJob3N0X3NnID09IDB4JXgsICVkXG4iLCBob3N0X3NnLCBob3N0X3NnKTsKKworCWR3ID0gUERDX0RJTU1fSE9TVF9QS1QgPj4gMjsKKworCS8qCisJICogU2V0IHVwIEhvc3QgRE1BIHBhY2tldAorCSAqLworCWlmICgodGYtPnByb3RvY29sID09IEFUQV9QUk9UX0RNQSkgJiYgKCEodGYtPmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKSkpCisJCXRtcCA9IFBEQ19QS1RfUkVBRDsKKwllbHNlCisJCXRtcCA9IDA7CisJdG1wIHw9ICgocG9ydG5vICsgMSArIDQpIDw8IDE2KTsJLyogc2VxLiBpZCAqLworCXRtcCB8PSAoMHhmZiA8PCAyNCk7CQkJLyogZGVsYXkgc2VxLiBpZCAqLworCWJ1ZjMyW2R3ICsgMF0gPSBjcHVfdG9fbGUzMih0bXApOworCWJ1ZjMyW2R3ICsgMV0gPSBjcHVfdG9fbGUzMihob3N0X3NnKTsKKwlidWYzMltkdyArIDJdID0gY3B1X3RvX2xlMzIoZGltbV9zZyk7CisJYnVmMzJbZHcgKyAzXSA9IDA7CisKKwlWUFJJTlRLKCJIT1NUIFBLVCBAICV4ID09ICgweCV4IDB4JXggMHgleCAweCV4KVxuIiwKKwkJUERDXzIwNjIxX0RJTU1fQkFTRSArIChQRENfRElNTV9XSU5ET1dfU1RFUCAqIHBvcnRubykgKworCQkJUERDX0RJTU1fSE9TVF9QS1QsCisJCWJ1ZjMyW2R3ICsgMF0sCisJCWJ1ZjMyW2R3ICsgMV0sCisJCWJ1ZjMyW2R3ICsgMl0sCisJCWJ1ZjMyW2R3ICsgM10pOworfQorCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9kbWFfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBxYy0+c2c7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCXVuc2lnbmVkIGludCBwb3J0bm8gPSBhcC0+cG9ydF9ubzsKKwl1bnNpZ25lZCBpbnQgaSwgbGFzdCwgaWR4LCB0b3RhbF9sZW4gPSAwLCBzZ3RfbGVuOworCXUzMiAqYnVmID0gKHUzMiAqKSAmcHAtPmRpbW1fYnVmW1BEQ19ESU1NX0hFQURFUl9TWl07CisKKwlhc3NlcnQocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApOworCisJVlBSSU5USygiYXRhJXU6IEVOVEVSXG4iLCBhcC0+aWQpOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwkvKgorCSAqIEJ1aWxkIFMvRyB0YWJsZQorCSAqLworCWxhc3QgPSBxYy0+bl9lbGVtOworCWlkeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxhc3Q7IGkrKykgeworCQlidWZbaWR4KytdID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3MoJnNnW2ldKSk7CisJCWJ1ZltpZHgrK10gPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKCZzZ1tpXSkpOworCQl0b3RhbF9sZW4gKz0gc2dbaV0ubGVuZ3RoOworCX0KKwlidWZbaWR4IC0gMV0gfD0gY3B1X3RvX2xlMzIoQVRBX1BSRF9FT1QpOworCXNndF9sZW4gPSBpZHggKiA0OworCisJLyoKKwkgKiBCdWlsZCBBVEEsIGhvc3QgRE1BIHBhY2tldHMKKwkgKi8KKwlwZGMyMDYyMV9ob3N0X3NnKCZxYy0+dGYsICZwcC0+ZGltbV9idWZbMF0sIHBvcnRubywgdG90YWxfbGVuKTsKKwlwZGMyMDYyMV9ob3N0X3BrdCgmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBwb3J0bm8pOworCisJcGRjMjA2MjFfYXRhX3NnKCZxYy0+dGYsICZwcC0+ZGltbV9idWZbMF0sIHBvcnRubywgdG90YWxfbGVuKTsKKwlpID0gcGRjMjA2MjFfYXRhX3BrdCgmcWMtPnRmLCBxYy0+ZGV2LT5kZXZubywgJnBwLT5kaW1tX2J1ZlswXSwgcG9ydG5vKTsKKworCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpCisJCWkgPSBwZGNfcHJlcF9sYmE0OCgmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBpKTsKKwllbHNlCisJCWkgPSBwZGNfcHJlcF9sYmEyOCgmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBpKTsKKworCXBkY19wa3RfZm9vdGVyKCZxYy0+dGYsICZwcC0+ZGltbV9idWZbMF0sIGkpOworCisJLyogY29weSB0aHJlZSBTL0cgdGFibGVzIGFuZCB0d28gcGFja2V0cyB0byBESU1NIE1NSU8gd2luZG93ICovCisJbWVtY3B5X3RvaW8oZGltbV9tbWlvICsgKHBvcnRubyAqIFBEQ19ESU1NX1dJTkRPV19TVEVQKSwKKwkJICAgICZwcC0+ZGltbV9idWYsIFBEQ19ESU1NX0hFQURFUl9TWik7CisJbWVtY3B5X3RvaW8oZGltbV9tbWlvICsgKHBvcnRubyAqIFBEQ19ESU1NX1dJTkRPV19TVEVQKSArCisJCSAgICBQRENfRElNTV9IT1NUX1BSRCwKKwkJICAgICZwcC0+ZGltbV9idWZbUERDX0RJTU1fSEVBREVSX1NaXSwgc2d0X2xlbik7CisKKwkvKiBmb3JjZSBob3N0IEZJRk8gZHVtcCAqLworCXdyaXRlbCgweDAwMDAwMDAxLCBtbWlvICsgUERDXzIwNjIxX0dFTkVSQUxfQ1RMKTsKKworCXJlYWRsKGRpbW1fbW1pbyk7CS8qIE1NSU8gUENJIHBvc3RpbmcgZmx1c2ggKi8KKworCVZQUklOVEsoImF0YSBwa3QgYnVmIG9mcyAldSwgcHJkIHNpemUgJXUsIG1taW8gY29waWVkXG4iLCBpLCBzZ3RfbGVuKTsKK30KKworc3RhdGljIHZvaWQgcGRjMjA2MjFfbm9kYXRhX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJdm9pZCAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CisJdW5zaWduZWQgaW50IHBvcnRubyA9IGFwLT5wb3J0X25vOworCXVuc2lnbmVkIGludCBpOworCisJVlBSSU5USygiYXRhJXU6IEVOVEVSXG4iLCBhcC0+aWQpOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwlpID0gcGRjMjA2MjFfYXRhX3BrdCgmcWMtPnRmLCBxYy0+ZGV2LT5kZXZubywgJnBwLT5kaW1tX2J1ZlswXSwgcG9ydG5vKTsKKworCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpCisJCWkgPSBwZGNfcHJlcF9sYmE0OCgmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBpKTsKKwllbHNlCisJCWkgPSBwZGNfcHJlcF9sYmEyOCgmcWMtPnRmLCAmcHAtPmRpbW1fYnVmWzBdLCBpKTsKKworCXBkY19wa3RfZm9vdGVyKCZxYy0+dGYsICZwcC0+ZGltbV9idWZbMF0sIGkpOworCisJLyogY29weSB0aHJlZSBTL0cgdGFibGVzIGFuZCB0d28gcGFja2V0cyB0byBESU1NIE1NSU8gd2luZG93ICovCisJbWVtY3B5X3RvaW8oZGltbV9tbWlvICsgKHBvcnRubyAqIFBEQ19ESU1NX1dJTkRPV19TVEVQKSwKKwkJICAgICZwcC0+ZGltbV9idWYsIFBEQ19ESU1NX0hFQURFUl9TWik7CisKKwkvKiBmb3JjZSBob3N0IEZJRk8gZHVtcCAqLworCXdyaXRlbCgweDAwMDAwMDAxLCBtbWlvICsgUERDXzIwNjIxX0dFTkVSQUxfQ1RMKTsKKworCXJlYWRsKGRpbW1fbW1pbyk7CS8qIE1NSU8gUENJIHBvc3RpbmcgZmx1c2ggKi8KKworCVZQUklOVEsoImF0YSBwa3QgYnVmIG9mcyAldSwgbW1pbyBjb3BpZWRcbiIsIGkpOworfQorCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwkJcGRjMjA2MjFfZG1hX3ByZXAocWMpOworCQlicmVhazsKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJcGRjMjA2MjFfbm9kYXRhX3ByZXAocWMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fcGRjMjA2MjFfcHVzaF9oZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsCisJCQkJIHVuc2lnbmVkIGludCBzZXEsCisJCQkJIHUzMiBwa3Rfb2ZzKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7CisJdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLworCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCXdyaXRlbCgweDAwMDAwMDAxLCBtbWlvICsgUERDXzIwNjIxX1NFUUNUTCArIChzZXEgKiA0KSk7CisJcmVhZGwobW1pbyArIFBEQ18yMDYyMV9TRVFDVEwgKyAoc2VxICogNCkpOwkvKiBmbHVzaCAqLworCisJd3JpdGVsKHBrdF9vZnMsIG1taW8gKyBQRENfSERNQV9QS1RfU1VCTUlUKTsKKwlyZWFkbChtbWlvICsgUERDX0hETUFfUEtUX1NVQk1JVCk7CS8qIGZsdXNoICovCit9CisKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX3B1c2hfaGRtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLAorCQkJCXVuc2lnbmVkIGludCBzZXEsCisJCQkJdTMyIHBrdF9vZnMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqcHAgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gcHAtPmhkbWFfcHJvZCAmIFBEQ19IRE1BX1FfTUFTSzsKKworCWlmICghcHAtPmRvaW5nX2hkbWEpIHsKKwkJX19wZGMyMDYyMV9wdXNoX2hkbWEocWMsIHNlcSwgcGt0X29mcyk7CisJCXBwLT5kb2luZ19oZG1hID0gMTsKKwkJcmV0dXJuOworCX0KKworCXBwLT5oZG1hW2lkeF0ucWMgPSBxYzsKKwlwcC0+aGRtYVtpZHhdLnNlcSA9IHNlcTsKKwlwcC0+aGRtYVtpZHhdLnBrdF9vZnMgPSBwa3Rfb2ZzOworCXBwLT5oZG1hX3Byb2QrKzsKK30KKworc3RhdGljIHZvaWQgcGRjMjA2MjFfcG9wX2hkbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpwcCA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBpZHggPSBwcC0+aGRtYV9jb25zICYgUERDX0hETUFfUV9NQVNLOworCisJLyogaWYgbm90aGluZyBvbiBxdWV1ZSwgd2UncmUgZG9uZSAqLworCWlmIChwcC0+aGRtYV9wcm9kID09IHBwLT5oZG1hX2NvbnMpIHsKKwkJcHAtPmRvaW5nX2hkbWEgPSAwOworCQlyZXR1cm47CisJfQorCisJX19wZGMyMDYyMV9wdXNoX2hkbWEocHAtPmhkbWFbaWR4XS5xYywgcHAtPmhkbWFbaWR4XS5zZXEsCisJCQkgICAgIHBwLT5oZG1hW2lkeF0ucGt0X29mcyk7CisJcHAtPmhkbWFfY29ucysrOworfQorCisjaWZkZWYgQVRBX1ZFUkJPU0VfREVCVUcKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX2R1bXBfaGRtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdW5zaWduZWQgaW50IHBvcnRfbm8gPSBhcC0+cG9ydF9ubzsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKKwl2b2lkICpkaW1tX21taW8gPSBocHJpdi0+ZGltbV9tbWlvOworCisJZGltbV9tbWlvICs9IChwb3J0X25vICogUERDX0RJTU1fV0lORE9XX1NURVApOworCWRpbW1fbW1pbyArPSBQRENfRElNTV9IT1NUX1BLVDsKKworCXByaW50ayhLRVJOX0VSUiAiSERNQVswXSA9PSAweCUwOFhcbiIsIHJlYWRsKGRpbW1fbW1pbykpOworCXByaW50ayhLRVJOX0VSUiAiSERNQVsxXSA9PSAweCUwOFhcbiIsIHJlYWRsKGRpbW1fbW1pbyArIDQpKTsKKwlwcmludGsoS0VSTl9FUlIgIkhETUFbMl0gPT0gMHglMDhYXG4iLCByZWFkbChkaW1tX21taW8gKyA4KSk7CisJcHJpbnRrKEtFUk5fRVJSICJIRE1BWzNdID09IDB4JTA4WFxuIiwgcmVhZGwoZGltbV9tbWlvICsgMTIpKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGRjMjA2MjFfZHVtcF9oZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpIHsgfQorI2VuZGlmIC8qIEFUQV9WRVJCT1NFX0RFQlVHICovCisKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX3BhY2tldF9zdGFydChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7CisJdW5zaWduZWQgaW50IHBvcnRfbm8gPSBhcC0+cG9ydF9ubzsKKwl2b2lkICptbWlvID0gaG9zdF9zZXQtPm1taW9fYmFzZTsKKwl1bnNpZ25lZCBpbnQgcncgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKTsKKwl1OCBzZXEgPSAodTgpIChwb3J0X25vICsgMSk7CisJdW5zaWduZWQgaW50IHBvcnRfb2ZzOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwlWUFJJTlRLKCJhdGEldTogRU5URVJcbiIsIGFwLT5pZCk7CisKKwl3bWIoKTsJCQkvKiBmbHVzaCBQUkQsIHBrdCB3cml0ZXMgKi8KKworCXBvcnRfb2ZzID0gUERDXzIwNjIxX0RJTU1fQkFTRSArIChQRENfRElNTV9XSU5ET1dfU1RFUCAqIHBvcnRfbm8pOworCisJLyogaWYgd3JpdGluZywgd2UgKDEpIERNQSB0byBESU1NLCB0aGVuICgyKSBkbyBBVEEgY29tbWFuZCAqLworCWlmIChydyAmJiBxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BKSB7CisJCXNlcSArPSA0OworCisJCXBkYzIwNjIxX2R1bXBfaGRtYShxYyk7CisJCXBkYzIwNjIxX3B1c2hfaGRtYShxYywgc2VxLCBwb3J0X29mcyArIFBEQ19ESU1NX0hPU1RfUEtUKTsKKwkJVlBSSU5USygicXVldWVkIG9mcyAweCV4ICgldSksIHNlcSAldVxuIiwKKwkJCXBvcnRfb2ZzICsgUERDX0RJTU1fSE9TVF9QS1QsCisJCQlwb3J0X29mcyArIFBEQ19ESU1NX0hPU1RfUEtULAorCQkJc2VxKTsKKwl9IGVsc2UgeworCQl3cml0ZWwoMHgwMDAwMDAwMSwgbW1pbyArIFBEQ18yMDYyMV9TRVFDVEwgKyAoc2VxICogNCkpOworCQlyZWFkbChtbWlvICsgUERDXzIwNjIxX1NFUUNUTCArIChzZXEgKiA0KSk7CS8qIGZsdXNoICovCisKKwkJd3JpdGVsKHBvcnRfb2ZzICsgUERDX0RJTU1fQVRBX1BLVCwKKwkJICAgICAgICh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfUEtUX1NVQk1JVCk7CisJCXJlYWRsKCh2b2lkICopIGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfUEtUX1NVQk1JVCk7CisJCVZQUklOVEsoInN1Ym1pdHRlZCBvZnMgMHgleCAoJXUpLCBzZXEgJXVcbiIsCisJCQlwb3J0X29mcyArIFBEQ19ESU1NX0FUQV9QS1QsCisJCQlwb3J0X29mcyArIFBEQ19ESU1NX0FUQV9QS1QsCisJCQlzZXEpOworCX0KK30KKworc3RhdGljIGludCBwZGMyMDYyMV9xY19pc3N1ZV9wcm90KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJcGRjMjA2MjFfcGFja2V0X3N0YXJ0KHFjKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEFUQV9QUk9UX0FUQVBJX0RNQToKKwkJQlVHKCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGF0YV9xY19pc3N1ZV9wcm90KHFjKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfaG9zdF9pbnRyKCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywKKwkJCQkJICB1bnNpZ25lZCBpbnQgZG9pbmdfaGRtYSwKKwkJCQkJICB2b2lkICptbWlvKQoreworCXVuc2lnbmVkIGludCBwb3J0X25vID0gYXAtPnBvcnRfbm87CisJdW5zaWduZWQgaW50IHBvcnRfb2ZzID0KKwkJUERDXzIwNjIxX0RJTU1fQkFTRSArIChQRENfRElNTV9XSU5ET1dfU1RFUCAqIHBvcnRfbm8pOworCXU4IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlpZiAoKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEpICYmCS8qIHJlYWQgKi8KKwkgICAgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKSkpIHsKKworCQkvKiBzdGVwIHR3byAtIERNQSBmcm9tIERJTU0gdG8gaG9zdCAqLworCQlpZiAoZG9pbmdfaGRtYSkgeworCQkJVlBSSU5USygiYXRhJXU6IHJlYWQgaGRtYSwgMHgleCAweCV4XG4iLCBhcC0+aWQsCisJCQkJcmVhZGwobW1pbyArIDB4MTA0KSwgcmVhZGwobW1pbyArIFBEQ19IRE1BX0NUTFNUQVQpKTsKKwkJCS8qIGdldCBkcml2ZSBzdGF0dXM7IGNsZWFyIGludHI7IGNvbXBsZXRlIHR4biAqLworCQkJYXRhX3FjX2NvbXBsZXRlKHFjLCBhdGFfd2FpdF9pZGxlKGFwKSk7CisJCQlwZGMyMDYyMV9wb3BfaGRtYShxYyk7CisJCX0KKworCQkvKiBzdGVwIG9uZSAtIGV4ZWMgQVRBIGNvbW1hbmQgKi8KKwkJZWxzZSB7CisJCQl1OCBzZXEgPSAodTgpIChwb3J0X25vICsgMSArIDQpOworCQkJVlBSSU5USygiYXRhJXU6IHJlYWQgYXRhLCAweCV4IDB4JXhcbiIsIGFwLT5pZCwKKwkJCQlyZWFkbChtbWlvICsgMHgxMDQpLCByZWFkbChtbWlvICsgUERDX0hETUFfQ1RMU1RBVCkpOworCisJCQkvKiBzdWJtaXQgaGRtYSBwa3QgKi8KKwkJCXBkYzIwNjIxX2R1bXBfaGRtYShxYyk7CisJCQlwZGMyMDYyMV9wdXNoX2hkbWEocWMsIHNlcSwKKwkJCQkJICAgcG9ydF9vZnMgKyBQRENfRElNTV9IT1NUX1BLVCk7CisJCX0KKwkJaGFuZGxlZCA9IDE7CisKKwl9IGVsc2UgaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEpIHsJLyogd3JpdGUgKi8KKworCQkvKiBzdGVwIG9uZSAtIERNQSBmcm9tIGhvc3QgdG8gRElNTSAqLworCQlpZiAoZG9pbmdfaGRtYSkgeworCQkJdTggc2VxID0gKHU4KSAocG9ydF9ubyArIDEpOworCQkJVlBSSU5USygiYXRhJXU6IHdyaXRlIGhkbWEsIDB4JXggMHgleFxuIiwgYXAtPmlkLAorCQkJCXJlYWRsKG1taW8gKyAweDEwNCksIHJlYWRsKG1taW8gKyBQRENfSERNQV9DVExTVEFUKSk7CisKKwkJCS8qIHN1Ym1pdCBhdGEgcGt0ICovCisJCQl3cml0ZWwoMHgwMDAwMDAwMSwgbW1pbyArIFBEQ18yMDYyMV9TRVFDVEwgKyAoc2VxICogNCkpOworCQkJcmVhZGwobW1pbyArIFBEQ18yMDYyMV9TRVFDVEwgKyAoc2VxICogNCkpOworCQkJd3JpdGVsKHBvcnRfb2ZzICsgUERDX0RJTU1fQVRBX1BLVCwKKwkJCSAgICAgICAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX1BLVF9TVUJNSVQpOworCQkJcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19QS1RfU1VCTUlUKTsKKwkJfQorCisJCS8qIHN0ZXAgdHdvIC0gZXhlY3V0ZSBBVEEgY29tbWFuZCAqLworCQllbHNlIHsKKwkJCVZQUklOVEsoImF0YSV1OiB3cml0ZSBhdGEsIDB4JXggMHgleFxuIiwgYXAtPmlkLAorCQkJCXJlYWRsKG1taW8gKyAweDEwNCksIHJlYWRsKG1taW8gKyBQRENfSERNQV9DVExTVEFUKSk7CisJCQkvKiBnZXQgZHJpdmUgc3RhdHVzOyBjbGVhciBpbnRyOyBjb21wbGV0ZSB0eG4gKi8KKwkJCWF0YV9xY19jb21wbGV0ZShxYywgYXRhX3dhaXRfaWRsZShhcCkpOworCQkJcGRjMjA2MjFfcG9wX2hkbWEocWMpOworCQl9CisJCWhhbmRsZWQgPSAxOworCisJLyogY29tbWFuZCBjb21wbGV0aW9uLCBidXQgbm8gZGF0YSB4ZmVyICovCisJfSBlbHNlIGlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfTk9EQVRBKSB7CisKKwkJc3RhdHVzID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1kgfCBBVEFfRFJRLCAxMDAwKTsKKwkJRFBSSU5USygiQlVTX05PREFUQSAoZHJ2X3N0YXQgMHglWClcbiIsIHN0YXR1cyk7CisJCWF0YV9xY19jb21wbGV0ZShxYywgc3RhdHVzKTsKKwkJaGFuZGxlZCA9IDE7CisKKwl9IGVsc2UgeworCQlhcC0+c3RhdHMuaWRsZV9pcnErKzsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIHZvaWQgcGRjMjA2MjFfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBhcC0+aG9zdF9zZXQ7CisJdm9pZCAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisKKwltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKwlyZWFkbChtbWlvICsgUERDXzIwNjIxX1NFUU1BU0spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGRjMjA2MjFfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJdTMyIG1hc2sgPSAwOworCXVuc2lnbmVkIGludCBpLCB0bXAsIHBvcnRfbm87CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCXZvaWQgKm1taW9fYmFzZTsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCWlmICghaG9zdF9zZXQgfHwgIWhvc3Rfc2V0LT5tbWlvX2Jhc2UpIHsKKwkJVlBSSU5USygiUVVJQ0sgRVhJVFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwltbWlvX2Jhc2UgPSBob3N0X3NldC0+bW1pb19iYXNlOworCisJLyogcmVhZGluZyBzaG91bGQgYWxzbyBjbGVhciBpbnRlcnJ1cHRzICovCisJbW1pb19iYXNlICs9IFBEQ19DSElQMF9PRlM7CisJbWFzayA9IHJlYWRsKG1taW9fYmFzZSArIFBEQ18yMDYyMV9TRVFNQVNLKTsKKwlWUFJJTlRLKCJtYXNrID09IDB4JXhcbiIsIG1hc2spOworCisJaWYgKG1hc2sgPT0gMHhmZmZmZmZmZikgeworCQlWUFJJTlRLKCJRVUlDSyBFWElUIDJcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCW1hc2sgJj0gMHhmZmZmOwkJLyogb25seSAxNiB0YWdzIHBvc3NpYmxlICovCisJaWYgKCFtYXNrKSB7CisJCVZQUklOVEsoIlFVSUNLIEVYSVQgM1xuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKyAgICAgICAgc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDk7IGkrKykgeworCQlwb3J0X25vID0gaSAtIDE7CisJCWlmIChwb3J0X25vID4gMykKKwkJCXBvcnRfbm8gLT0gNDsKKwkJaWYgKHBvcnRfbm8gPj0gaG9zdF9zZXQtPm5fcG9ydHMpCisJCQlhcCA9IE5VTEw7CisJCWVsc2UKKwkJCWFwID0gaG9zdF9zZXQtPnBvcnRzW3BvcnRfbm9dOworCQl0bXAgPSBtYXNrICYgKDEgPDwgaSk7CisJCVZQUklOVEsoInNlcSAldSwgcG9ydF9ubyAldSwgYXAgJXAsIHRtcCAleFxuIiwgaSwgcG9ydF9ubywgYXAsIHRtcCk7CisJCWlmICh0bXAgJiYgYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpKSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQorCQkJCWhhbmRsZWQgKz0gcGRjMjA2MjFfaG9zdF9pbnRyKGFwLCBxYywgKGkgPiA0KSwKKwkJCQkJCQkgICAgICBtbWlvX2Jhc2UpOworCQl9CisJfQorCisgICAgICAgIHNwaW5fdW5sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwlWUFJJTlRLKCJtYXNrID09IDB4JXhcbiIsIG1hc2spOworCisJVlBSSU5USygiRVhJVFxuIik7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgcGRjX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTggZHJ2X3N0YXQ7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJaWYgKCFxYykgeworCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBCVUc6IHRpbWVvdXQgd2l0aG91dCBjb21tYW5kXG4iLAorCQkgICAgICAgYXAtPmlkKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogaGFjayBhbGVydCEgIFdlIGNhbm5vdCB1c2UgdGhlIHN1cHBsaWVkIGNvbXBsZXRpb24KKwkgKiBmdW5jdGlvbiBmcm9tIGluc2lkZSB0aGUgLT5laF9zdHJhdGVneV9oYW5kbGVyKCkgdGhyZWFkLgorCSAqIGxpYmF0YSBpcyB0aGUgb25seSB1c2VyIG9mIC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcigpIGluCisJICogYW55IGtlcm5lbCwgc28gdGhlIGRlZmF1bHQgc2NzaV9kb25lKCkgYXNzdW1lcyBpdCBpcworCSAqIG5vdCBiZWluZyBjYWxsZWQgZnJvbSB0aGUgU0NTSSBFSC4KKwkgKi8KKwlxYy0+c2NzaWRvbmUgPSBzY3NpX2ZpbmlzaF9jb21tYW5kOworCisJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogY29tbWFuZCB0aW1lb3V0XG4iLCBhcC0+aWQpOworCQlhdGFfcWNfY29tcGxldGUocWMsIGF0YV93YWl0X2lkbGUoYXApIHwgQVRBX0VSUik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHJ2X3N0YXQgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSB8IEFUQV9EUlEsIDEwMDApOworCisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IHVua25vd24gdGltZW91dCwgY21kIDB4JXggc3RhdCAweCV4XG4iLAorCQkgICAgICAgYXAtPmlkLCBxYy0+dGYuY29tbWFuZCwgZHJ2X3N0YXQpOworCisJCWF0YV9xY19jb21wbGV0ZShxYywgZHJ2X3N0YXQpOworCQlicmVhazsKKwl9CisKK291dDoKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworc3RhdGljIHZvaWQgcGRjX3RmX2xvYWRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlXQVJOX09OICh0Zi0+cHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BIHx8CisJCSB0Zi0+cHJvdG9jb2wgPT0gQVRBX1BST1RfTk9EQVRBKTsKKwlhdGFfdGZfbG9hZChhcCwgdGYpOworfQorCisKK3N0YXRpYyB2b2lkIHBkY19leGVjX2NvbW1hbmRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlXQVJOX09OICh0Zi0+cHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BIHx8CisJCSB0Zi0+cHJvdG9jb2wgPT0gQVRBX1BST1RfTk9EQVRBKTsKKwlhdGFfZXhlY19jb21tYW5kKGFwLCB0Zik7Cit9CisKKworc3RhdGljIHZvaWQgcGRjX3NhdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlOworCXBvcnQtPmRhdGFfYWRkcgkJPSBiYXNlOworCXBvcnQtPmZlYXR1cmVfYWRkcgk9CisJcG9ydC0+ZXJyb3JfYWRkcgk9IGJhc2UgKyAweDQ7CisJcG9ydC0+bnNlY3RfYWRkcgk9IGJhc2UgKyAweDg7CisJcG9ydC0+bGJhbF9hZGRyCQk9IGJhc2UgKyAweGM7CisJcG9ydC0+bGJhbV9hZGRyCQk9IGJhc2UgKyAweDEwOworCXBvcnQtPmxiYWhfYWRkcgkJPSBiYXNlICsgMHgxNDsKKwlwb3J0LT5kZXZpY2VfYWRkcgk9IGJhc2UgKyAweDE4OworCXBvcnQtPmNvbW1hbmRfYWRkcgk9CisJcG9ydC0+c3RhdHVzX2FkZHIJPSBiYXNlICsgMHgxYzsKKwlwb3J0LT5hbHRzdGF0dXNfYWRkcgk9CisJcG9ydC0+Y3RsX2FkZHIJCT0gYmFzZSArIDB4Mzg7Cit9CisKKworI2lmZGVmIEFUQV9WRVJCT1NFX0RFQlVHCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwgdm9pZCAqcHNvdXJjZSwgCisJCQkJICAgdTMyIG9mZnNldCwgdTMyIHNpemUpCit7CisJdTMyIHdpbmRvd19zaXplOworCXUxNiBpZHg7CisJdTggcGFnZV9tYXNrOworCWxvbmcgZGlzdDsKKwl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKwlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXYgPSBwZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKmRpbW1fbW1pbyA9IGhwcml2LT5kaW1tX21taW87CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLworCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCXBhZ2VfbWFzayA9IDB4MDA7CQorICAgCXdpbmRvd19zaXplID0gMHgyMDAwICogNDsgLyogMzJLIGJ5dGUgdWNoYXIgc2l6ZSAqLyAgCisJaWR4ID0gKHUxNikgKG9mZnNldCAvIHdpbmRvd19zaXplKTsgCisKKwl3cml0ZWwoMHgwMSwgbW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOworCXJlYWRsKG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwl3cml0ZWwoKChpZHgpIDw8IHBhZ2VfbWFzayksIG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisJcmVhZGwobW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKworCW9mZnNldCAtPSAoaWR4ICogd2luZG93X3NpemUpOworCWlkeCsrOworCWRpc3QgPSAoKGxvbmcpICh3aW5kb3dfc2l6ZSAtIChvZmZzZXQgKyBzaXplKSkpID49IDAgPyBzaXplIDogCisJCShsb25nKSAod2luZG93X3NpemUgLSBvZmZzZXQpOworCW1lbWNweV9mcm9taW8oKGNoYXIgKikgcHNvdXJjZSwgKGNoYXIgKikgKGRpbW1fbW1pbyArIG9mZnNldCAvIDQpLCAKKwkJICAgICAgZGlzdCk7CisKKwlwc291cmNlICs9IGRpc3Q7ICAgIAorCXNpemUgLT0gZGlzdDsKKwlmb3IgKDsgKGxvbmcpIHNpemUgPj0gKGxvbmcpIHdpbmRvd19zaXplIDspIHsKKwkJd3JpdGVsKDB4MDEsIG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwkJcmVhZGwobW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOworCQl3cml0ZWwoKChpZHgpIDw8IHBhZ2VfbWFzayksIG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisJCXJlYWRsKG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisJCW1lbWNweV9mcm9taW8oKGNoYXIgKikgcHNvdXJjZSwgKGNoYXIgKikgKGRpbW1fbW1pbyksIAorCQkJICAgICAgd2luZG93X3NpemUgLyA0KTsKKwkJcHNvdXJjZSArPSB3aW5kb3dfc2l6ZTsKKwkJc2l6ZSAtPSB3aW5kb3dfc2l6ZTsKKwkJaWR4ICsrOworCX0KKworCWlmIChzaXplKSB7CisJCXdyaXRlbCgweDAxLCBtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisJCXJlYWRsKG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwkJd3JpdGVsKCgoaWR4KSA8PCBwYWdlX21hc2spLCBtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCQlyZWFkbChtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCQltZW1jcHlfZnJvbWlvKChjaGFyICopIHBzb3VyY2UsIChjaGFyICopIChkaW1tX21taW8pLCAKKwkJCSAgICAgIHNpemUgLyA0KTsKKwl9Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9wdXRfdG9fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIHZvaWQgKnBzb3VyY2UsIAorCQkJCSB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSkKK3sKKwl1MzIgd2luZG93X3NpemU7CisJdTE2IGlkeDsKKwl1OCBwYWdlX21hc2s7CisJbG9uZyBkaXN0OworCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocHJpdiA9IHBlLT5wcml2YXRlX2RhdGE7CisJdm9pZCAqZGltbV9tbWlvID0gaHByaXYtPmRpbW1fbW1pbzsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovICAgCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJcGFnZV9tYXNrID0gMHgwMDsJCisgICAJd2luZG93X3NpemUgPSAweDIwMDAgKiA0OyAgICAgICAvKiAzMksgYnl0ZSB1Y2hhciBzaXplICovICAKKwlpZHggPSAodTE2KSAob2Zmc2V0IC8gd2luZG93X3NpemUpOworCisJd3JpdGVsKCgoaWR4KSA8PCBwYWdlX21hc2spLCBtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCXJlYWRsKG1taW8gKyBQRENfRElNTV9XSU5ET1dfQ1RMUik7CisJb2Zmc2V0IC09IChpZHggKiB3aW5kb3dfc2l6ZSk7IAorCWlkeCsrOworCWRpc3QgPSAoKGxvbmcpKHMzMikod2luZG93X3NpemUgLSAob2Zmc2V0ICsgc2l6ZSkpKSA+PSAwID8gc2l6ZSA6CisJCShsb25nKSAod2luZG93X3NpemUgLSBvZmZzZXQpOworCW1lbWNweV90b2lvKChjaGFyICopIChkaW1tX21taW8gKyBvZmZzZXQgLyA0KSwgKGNoYXIgKikgcHNvdXJjZSwgZGlzdCk7CisJd3JpdGVsKDB4MDEsIG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwlyZWFkbChtbWlvICsgUERDX0dFTkVSQUxfQ1RMUik7CisKKwlwc291cmNlICs9IGRpc3Q7ICAgIAorCXNpemUgLT0gZGlzdDsKKwlmb3IgKDsgKGxvbmcpIHNpemUgPj0gKGxvbmcpIHdpbmRvd19zaXplIDspIHsKKwkJd3JpdGVsKCgoaWR4KSA8PCBwYWdlX21hc2spLCBtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCQlyZWFkbChtbWlvICsgUERDX0RJTU1fV0lORE9XX0NUTFIpOworCQltZW1jcHlfdG9pbygoY2hhciAqKSAoZGltbV9tbWlvKSwgKGNoYXIgKikgcHNvdXJjZSwgCisJCQkgICAgd2luZG93X3NpemUgLyA0KTsKKwkJd3JpdGVsKDB4MDEsIG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwkJcmVhZGwobW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOworCQlwc291cmNlICs9IHdpbmRvd19zaXplOworCQlzaXplIC09IHdpbmRvd19zaXplOworCQlpZHggKys7CisJfQorICAgIAorCWlmIChzaXplKSB7CisJCXdyaXRlbCgoKGlkeCkgPDwgcGFnZV9tYXNrKSwgbW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwkJcmVhZGwobW1pbyArIFBEQ19ESU1NX1dJTkRPV19DVExSKTsKKwkJbWVtY3B5X3RvaW8oKGNoYXIgKikgKGRpbW1fbW1pbyksIChjaGFyICopIHBzb3VyY2UsIHNpemUgLyA0KTsKKwkJd3JpdGVsKDB4MDEsIG1taW8gKyBQRENfR0VORVJBTF9DVExSKTsKKwkJcmVhZGwobW1pbyArIFBEQ19HRU5FUkFMX0NUTFIpOworCX0KK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX2kyY19yZWFkKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwgdTMyIGRldmljZSwgCisJCQkJICAgICAgdTMyIHN1YmFkZHIsIHUzMiAqcGRhdGEpCit7CisJdm9pZCAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CisJdTMyIGkyY3JlZyAgPSAwOworCXUzMiBzdGF0dXM7ICAgICAKKwl1MzIgY291bnQgPTA7CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLworCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCWkyY3JlZyB8PSBkZXZpY2UgPDwgMjQ7CisJaTJjcmVnIHw9IHN1YmFkZHIgPDwgMTY7CisKKwkvKiBTZXQgdGhlIGRldmljZSBhbmQgc3ViYWRkcmVzcyAqLworCXdyaXRlbChpMmNyZWcsIG1taW8gKyBQRENfSTJDX0FERFJfREFUQV9PRkZTRVQpOworCXJlYWRsKG1taW8gKyBQRENfSTJDX0FERFJfREFUQV9PRkZTRVQpOworCisJLyogV3JpdGUgQ29udHJvbCB0byBwZXJmb3JtIHJlYWQgb3BlcmF0aW9uLCBtYXNrIGludCAqLworCXdyaXRlbChQRENfSTJDX1JFQUQgfCBQRENfSTJDX1NUQVJUIHwgUERDX0kyQ19NQVNLX0lOVCwgCisJICAgICAgIG1taW8gKyBQRENfSTJDX0NPTlRST0xfT0ZGU0VUKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8PSAxMDAwOyBjb3VudCArKykgeworCQlzdGF0dXMgPSByZWFkbChtbWlvICsgUERDX0kyQ19DT05UUk9MX09GRlNFVCk7CisJCWlmIChzdGF0dXMgJiBQRENfSTJDX0NPTVBMRVRFKSB7CisJCQlzdGF0dXMgPSByZWFkbChtbWlvICsgUERDX0kyQ19BRERSX0RBVEFfT0ZGU0VUKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGNvdW50ID09IDEwMDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkqcGRhdGEgPSAoc3RhdHVzID4+IDgpICYgMHgwMDAwMDBmZjsKKwlyZXR1cm4gMTsgICAgICAgICAgIAorfQorCisKK3N0YXRpYyBpbnQgcGRjMjA2MjFfZGV0ZWN0X2RpbW0oc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCXUzMiBkYXRhPTAgOworICAJaWYgKHBkYzIwNjIxX2kyY19yZWFkKHBlLCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLCAKKwkJCSAgICAgUERDX0RJTU1fU1BEX1NZU1RFTV9GUkVRLCAmZGF0YSkpIHsKKyAgIAkJaWYgKGRhdGEgPT0gMTAwKQorCQkJcmV0dXJuIDEwMDsKKyAgCX0gZWxzZQorCQlyZXR1cm4gMDsKKyAJCisgICAJaWYgKHBkYzIwNjIxX2kyY19yZWFkKHBlLCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLCA5LCAmZGF0YSkpIHsKKwkJaWYoZGF0YSA8PSAweDc1KSAKKwkJCXJldHVybiAxMzM7CisgICAJfSBlbHNlCisJCXJldHVybiAwOworICAgCQorICAgCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcGRjMjA2MjFfcHJvZ19kaW1tMChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUpCit7CisJdTMyIHNwZDBbNTBdOworCXUzMiBkYXRhID0gMDsKKyAgIAlpbnQgc2l6ZSwgaTsKKyAgIAl1OCBiZGltbXNpemU7IAorICAgCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgcmVnOworCQl1bnNpZ25lZCBpbnQgb2ZzOworCX0gcGRjX2kyY19yZWFkX2RhdGEgW10gPSB7CisJCXsgUERDX0RJTU1fU1BEX1RZUEUsIDExIH0sCQkKKwkJeyBQRENfRElNTV9TUERfRlJFU0hfUkFURSwgMTIgfSwKKwkJeyBQRENfRElNTV9TUERfQ09MVU1OX05VTSwgNCB9LCAKKwkJeyBQRENfRElNTV9TUERfQVRUUklCVVRFLCAyMSB9LAorCQl7IFBEQ19ESU1NX1NQRF9ST1dfTlVNLCAzIH0sCisJCXsgUERDX0RJTU1fU1BEX0JBTktfTlVNLCAxNyB9LAorCQl7IFBEQ19ESU1NX1NQRF9NT0RVTEVfUk9XLCA1IH0sCisJCXsgUERDX0RJTU1fU1BEX1JPV19QUkVfQ0hBUkdFLCAyNyB9LAorCQl7IFBEQ19ESU1NX1NQRF9ST1dfQUNUSVZFX0RFTEFZLCAyOCB9LAorCQl7IFBEQ19ESU1NX1NQRF9SQVNfQ0FTX0RFTEFZLCAyOSB9LAorCQl7IFBEQ19ESU1NX1NQRF9BQ1RJVkVfUFJFQ0hBUkdFLCAzMCB9LAorCQl7IFBEQ19ESU1NX1NQRF9DQVNfTEFURU5DWSwgMTggfSwgICAgICAgCisJfTsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJZm9yKGk9MDsgaTxBUlJBWV9TSVpFKHBkY19pMmNfcmVhZF9kYXRhKTsgaSsrKQorCQlwZGMyMDYyMV9pMmNfcmVhZChwZSwgUERDX0RJTU0wX1NQRF9ERVZfQUREUkVTUywKKwkJCQkgIHBkY19pMmNfcmVhZF9kYXRhW2ldLnJlZywgCisJCQkJICAmc3BkMFtwZGNfaTJjX3JlYWRfZGF0YVtpXS5vZnNdKTsKKyAgCisgICAJZGF0YSB8PSAoc3BkMFs0XSAtIDgpIHwgKChzcGQwWzIxXSAhPSAwKSA8PCAzKSB8ICgoc3BkMFszXS0xMSkgPDwgNCk7CisgICAJZGF0YSB8PSAoKHNwZDBbMTddIC8gNCkgPDwgNikgfCAoKHNwZDBbNV0gLyAyKSA8PCA3KSB8IAorCQkoKCgoc3BkMFsyN10gKyA5KSAvIDEwKSAtIDEpIDw8IDgpIDsKKyAgIAlkYXRhIHw9ICgoKCgoc3BkMFsyOV0gPiBzcGQwWzI4XSkgCisJCSAgICA/IHNwZDBbMjldIDogc3BkMFsyOF0pICsgOSkgLyAxMCkgLSAxKSA8PCAxMDsgCisgICAJZGF0YSB8PSAoKHNwZDBbMzBdIC0gc3BkMFsyOV0gKyA5KSAvIDEwIC0gMikgPDwgMTI7CisgICAKKyAgIAlpZiAoc3BkMFsxOF0gJiAweDA4KSAKKwkJZGF0YSB8PSAoKDB4MDMpIDw8IDE0KTsKKyAgIAllbHNlIGlmIChzcGQwWzE4XSAmIDB4MDQpCisJCWRhdGEgfD0gKCgweDAyKSA8PCAxNCk7CisgICAJZWxzZSBpZiAoc3BkMFsxOF0gJiAweDAxKQorCQlkYXRhIHw9ICgoMHgwMSkgPDwgMTQpOworICAgCWVsc2UKKwkJZGF0YSB8PSAoMCA8PCAxNCk7CisKKyAgCS8qIAorCSAgIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBiRElNTVNpemUgKHBvd2VyIG9mIDIpIGFuZAorCSAgIG1lcmdlIHRoZSBESU1NIHNpemUgYnkgcHJvZ3JhbSBzdGFydC9lbmQgYWRkcmVzcy4KKwkqLworCisgICAJYmRpbW1zaXplID0gc3BkMFs0XSArIChzcGQwWzVdIC8gMikgKyBzcGQwWzNdICsgKHNwZDBbMTddIC8gMikgKyAzOworICAgCXNpemUgPSAoMSA8PCBiZGltbXNpemUpID4+IDIwOwkvKiBzaXplID0geHh4KE1CKSAqLworICAgCWRhdGEgfD0gKCgoc2l6ZSAvIDE2KSAtIDEpIDw8IDE2KTsKKyAgIAlkYXRhIHw9ICgwIDw8IDIzKTsKKwlkYXRhIHw9IDg7CisgICAJd3JpdGVsKGRhdGEsIG1taW8gKyBQRENfRElNTTBfQ09OVFJPTF9PRkZTRVQpOyAKKwlyZWFkbChtbWlvICsgUERDX0RJTU0wX0NPTlRST0xfT0ZGU0VUKTsKKyAgIAlyZXR1cm4gc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfcHJvZ19kaW1tX2dsb2JhbChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUpCit7CisJdTMyIGRhdGEsIHNwZDA7CisgICAJaW50IGVycm9yLCBpOworICAgCXZvaWQgKm1taW8gPSBwZS0+bW1pb19iYXNlOworCisJLyogaGFyZC1jb2RlIGNoaXAgIzAgKi8KKyAgIAltbWlvICs9IFBEQ19DSElQMF9PRlM7CisKKyAgIAkvKgorCSAgU2V0IFRvIERlZmF1bHQgOiBESU1NIE1vZHVsZSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAoMHgwMjIyNTlGMSkKKwkgIERJTU0gQXJiaXRyYXRpb24gRGlzYWJsZSAoYml0IDIwKQorCSAgRElNTSBEYXRhL0NvbnRyb2wgT3V0cHV0IERyaXZpbmcgU2VsZWN0aW9uIChiaXQxMiAtIGJpdDE1KQorCSAgUmVmcmVzaCBFbmFibGUgKGJpdCAxNykKKwkqLworCisJZGF0YSA9IDB4MDIyMjU5RjE7ICAgCisJd3JpdGVsKGRhdGEsIG1taW8gKyBQRENfU0RSQU1fQ09OVFJPTF9PRkZTRVQpOworCXJlYWRsKG1taW8gKyBQRENfU0RSQU1fQ09OVFJPTF9PRkZTRVQpOworCisJLyogVHVybiBvbiBmb3IgRUNDICovCisJcGRjMjA2MjFfaTJjX3JlYWQocGUsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsIAorCQkJICBQRENfRElNTV9TUERfVFlQRSwgJnNwZDApOworCWlmIChzcGQwID09IDB4MDIpIHsKKwkJZGF0YSB8PSAoMHgwMSA8PCAxNik7CisJCXdyaXRlbChkYXRhLCBtbWlvICsgUERDX1NEUkFNX0NPTlRST0xfT0ZGU0VUKTsKKwkJcmVhZGwobW1pbyArIFBEQ19TRFJBTV9DT05UUk9MX09GRlNFVCk7CisJCXByaW50ayhLRVJOX0VSUiAiTG9jYWwgRElNTSBFQ0MgRW5hYmxlZFxuIik7CisgICAJfQorCisgICAJLyogRElNTSBJbml0aWFsaXphdGlvbiBTZWxlY3QvRW5hYmxlIChiaXQgMTgvMTkpICovCisgICAJZGF0YSAmPSAofigxPDwxOCkpOworICAgCWRhdGEgfD0gKDE8PDE5KTsKKyAgIAl3cml0ZWwoZGF0YSwgbW1pbyArIFBEQ19TRFJBTV9DT05UUk9MX09GRlNFVCk7CisKKyAgIAllcnJvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgCisgICAJZm9yIChpID0gMTsgaSA8PSAxMDsgaSsrKSB7ICAgLyogcG9sbGluZyB+NSBzZWNzICovCisJCWRhdGEgPSByZWFkbChtbWlvICsgUERDX1NEUkFNX0NPTlRST0xfT0ZGU0VUKTsKKwkJaWYgKCEoZGF0YSAmICgxPDwxOSkpKSB7CisJICAgCQllcnJvciA9IDA7CisJICAgCQlicmVhazsgICAgIAorCQl9CisJCW1zbGVlcChpKjEwMCk7CisgICAJfQorICAgCXJldHVybiBlcnJvcjsKK30KKwkKKworc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9kaW1tX2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQoreworCWludCBzcGVlZCwgc2l6ZSwgbGVuZ3RoOyAKKwl1MzIgYWRkcixzcGQwLHBjaV9zdGF0dXM7CisJdTMyIHRtcD0wOworCXUzMiB0aW1lX3BlcmlvZD0wOworCXUzMiB0Y291bnQ9MDsKKwl1MzIgdGlja3M9MDsKKwl1MzIgY2xvY2s9MDsKKwl1MzIgZnBhcmFtPTA7CisgICAJdm9pZCAqbW1pbyA9IHBlLT5tbWlvX2Jhc2U7CisKKwkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLworICAgCW1taW8gKz0gUERDX0NISVAwX09GUzsKKworCS8qIEluaXRpYWxpemUgUExMIGJhc2VkIHVwb24gUENJIEJ1cyBGcmVxdWVuY3kgKi8KKworCS8qIEluaXRpYWxpemUgVGltZSBQZXJpb2QgUmVnaXN0ZXIgKi8KKwl3cml0ZWwoMHhmZmZmZmZmZiwgbW1pbyArIFBEQ19USU1FX1BFUklPRCk7CisJdGltZV9wZXJpb2QgPSByZWFkbChtbWlvICsgUERDX1RJTUVfUEVSSU9EKTsKKwlWUFJJTlRLKCJUaW1lIFBlcmlvZCBSZWdpc3RlciAoMHg0MCk6IDB4JXhcbiIsIHRpbWVfcGVyaW9kKTsKKworCS8qIEVuYWJsZSB0aW1lciAqLworCXdyaXRlbCgweDAwMDAxYTAsIG1taW8gKyBQRENfVElNRV9DT05UUk9MKTsKKwlyZWFkbChtbWlvICsgUERDX1RJTUVfQ09OVFJPTCk7CisKKwkvKiBXYWl0IDMgc2Vjb25kcyAqLworCW1zbGVlcCgzMDAwKTsKKworCS8qIAorCSAgIFdoZW4gdGltZXIgaXMgZW5hYmxlZCwgY291bnRlciBpcyBkZWNyZWFzZWQgZXZlcnkgaW50ZXJuYWwKKwkgICBjbG9jayBjeWNsZS4KKwkqLworCisJdGNvdW50ID0gcmVhZGwobW1pbyArIFBEQ19USU1FX0NPVU5URVIpOworCVZQUklOVEsoIlRpbWUgQ291bnRlciBSZWdpc3RlciAoMHg0NCk6IDB4JXhcbiIsIHRjb3VudCk7CisKKwkvKiAKKwkgICBJZiBTWDQgaXMgb24gUENJLVggYnVzLCBhZnRlciAzIHNlY29uZHMsIHRoZSB0aW1lciBjb3VudGVyCisJICAgcmVnaXN0ZXIgc2hvdWxkIGJlID49ICgweGZmZmZmZmZmIC0gM3gxMF44KS4KKwkqLworCWlmKHRjb3VudCA+PSBQQ0lfWF9UQ09VTlQpIHsKKwkJdGlja3MgPSAodGltZV9wZXJpb2QgLSB0Y291bnQpOworCQlWUFJJTlRLKCJOdW0gY291bnRlcnMgMHgleCAoJWQpXG4iLCB0aWNrcywgdGlja3MpOworCQorCQljbG9jayA9ICh0aWNrcyAvIDMwMDAwMCk7CisJCVZQUklOVEsoIjEwICogSW50ZXJuYWwgY2xrID0gMHgleCAoJWQpXG4iLCBjbG9jaywgY2xvY2spOworCQkKKwkJY2xvY2sgPSAoY2xvY2sgKiAzMyk7CisJCVZQUklOVEsoIjEwICogSW50ZXJuYWwgY2xrICogMzMgPSAweCV4ICglZClcbiIsIGNsb2NrLCBjbG9jayk7CisKKwkJLyogUExMIEYgUGFyYW0gKGJpdCAyMjoxNikgKi8KKwkJZnBhcmFtID0gKDE0MDAwMDAgLyBjbG9jaykgLSAyOworCQlWUFJJTlRLKCJQTEwgRiBQYXJhbTogMHgleCAoJWQpXG4iLCBmcGFyYW0sIGZwYXJhbSk7CisJCQorCQkvKiBPRCBwYXJhbSA9IDB4MiAoYml0IDMxOjMwKSwgUiBwYXJhbSA9IDB4NSAoYml0IDI5OjI1KSAqLworCQlwY2lfc3RhdHVzID0gKDB4OGEwMDE4MjQgfCAoZnBhcmFtIDw8IDE2KSk7CisJfSBlbHNlCisJCXBjaV9zdGF0dXMgPSBQQ0lfUExMX0lOSVQ7CisKKwkvKiBJbml0aWFsaXplIFBMTC4gKi8KKwlWUFJJTlRLKCJwY2lfc3RhdHVzOiAweCV4XG4iLCBwY2lfc3RhdHVzKTsKKwl3cml0ZWwocGNpX3N0YXR1cywgbW1pbyArIFBEQ19DVExfU1RBVFVTKTsKKwlyZWFkbChtbWlvICsgUERDX0NUTF9TVEFUVVMpOworCisJLyogCisJICAgUmVhZCBTUEQgb2YgRElNTSBieSBJMkMgaW50ZXJmYWNlLAorCSAgIGFuZCBwcm9ncmFtIHRoZSBESU1NIE1vZHVsZSBDb250cm9sbGVyLgorCSovCisgCWlmICghKHNwZWVkID0gcGRjMjA2MjFfZGV0ZWN0X2RpbW0ocGUpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRldGVjdCBMb2NhbCBESU1NIEZhaWxcbiIpOyAgCisJCXJldHVybiAxOwkvKiBESU1NIGVycm9yICovCisgICAJfQorICAgCVZQUklOVEsoIkxvY2FsIERJTU0gU3BlZWQgPSAlZFxuIiwgc3BlZWQpOworCisgICAJLyogUHJvZ3JhbW1pbmcgRElNTTAgTW9kdWxlIENvbnRyb2wgUmVnaXN0ZXIgKGluZGV4X0NJRDA6ODBoKSAqLyAKKyAgIAlzaXplID0gcGRjMjA2MjFfcHJvZ19kaW1tMChwZSk7CisgICAJVlBSSU5USygiTG9jYWwgRElNTSBTaXplID0gJWRNQlxuIixzaXplKTsKKworICAgCS8qIFByb2dyYW1taW5nIERJTU0gTW9kdWxlIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyIChpbmRleF9DSUQwOjg4aCkgKi8gCisgICAJaWYgKHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwocGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUHJvZ3JhbW1pbmcgRElNTSBNb2R1bGUgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgRmFpbFxuIik7CisJCXJldHVybiAxOworICAgCX0KKworI2lmZGVmIEFUQV9WRVJCT1NFX0RFQlVHCisJeworCQl1OCB0ZXN0X3BhcnR0ZXJuMVs0MF0gPSB7MHg1NSwweEFBLCdQJywncicsJ28nLCdtJywnaScsJ3MnLCdlJywnICcsCisgIAkJCQknTicsJ28nLCd0JywnICcsJ1knLCdlJywndCcsJyAnLCdEJywnZScsJ2YnLCdpJywnbicsJ2UnLCdkJywnICcsCisgCQkJCSAnMScsJy4nLCcxJywnMCcsCisgIAkJCQknOScsJzgnLCcwJywnMycsJzEnLCc2JywnMScsJzInLDAsMH07CisJCXU4IHRlc3RfcGFydHRlcm4yWzQwXSA9IHswfTsKKworCQlwZGMyMDYyMV9wdXRfdG9fZGltbShwZSwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjIsIDB4MTAwNDAsIDQwKTsKKwkJcGRjMjA2MjFfcHV0X3RvX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDQwLCA0MCk7CisKKwkJcGRjMjA2MjFfcHV0X3RvX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4xLCAweDEwMDQwLCA0MCk7CisJCXBkYzIwNjIxX2dldF9mcm9tX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDQwLCA0MCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXgsICV4LCAlc1xuIiwgdGVzdF9wYXJ0dGVybjJbMF0sIAorCQkgICAgICAgdGVzdF9wYXJ0dGVybjJbMV0sICYodGVzdF9wYXJ0dGVybjJbMl0pKTsKKwkJcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShwZSwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjIsIDB4MTAwNDAsIAorCQkJCSAgICAgICA0MCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXgsICV4LCAlc1xuIiwgdGVzdF9wYXJ0dGVybjJbMF0sIAorCQkgICAgICAgdGVzdF9wYXJ0dGVybjJbMV0sICYodGVzdF9wYXJ0dGVybjJbMl0pKTsKKworCQlwZGMyMDYyMV9wdXRfdG9fZGltbShwZSwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjEsIDB4NDAsIDQwKTsKKwkJcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShwZSwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjIsIDB4NDAsIDQwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIleCwgJXgsICVzXG4iLCB0ZXN0X3BhcnR0ZXJuMlswXSwgCisJCSAgICAgICB0ZXN0X3BhcnR0ZXJuMlsxXSwgJih0ZXN0X3BhcnR0ZXJuMlsyXSkpOworCX0KKyNlbmRpZgorCisJLyogRUNDIGluaXRpbGlhemF0aW9uLiAqLworCisJcGRjMjA2MjFfaTJjX3JlYWQocGUsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsIAorCQkJICBQRENfRElNTV9TUERfVFlQRSwgJnNwZDApOworCWlmIChzcGQwID09IDB4MDIpIHsKKwkJVlBSSU5USygiU3RhcnQgRUNDIGluaXRpYWxpemF0aW9uXG4iKTsKKwkJYWRkciA9IDA7CisJCWxlbmd0aCA9IHNpemUgKiAxMDI0ICogMTAyNDsKKwkJd2hpbGUgKGFkZHIgPCBsZW5ndGgpIHsKKwkJCXBkYzIwNjIxX3B1dF90b19kaW1tKHBlLCAodm9pZCAqKSAmdG1wLCBhZGRyLCAKKwkJCQkJICAgICBzaXplb2YodTMyKSk7CisJCQlhZGRyICs9IHNpemVvZih1MzIpOworCQl9CisJCVZQUklOVEsoIkZpbmlzaCBFQ0MgaW5pdGlhbGl6YXRpb25cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBwZGNfMjA2MjFfaW5pdChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUpCit7CisJdTMyIHRtcDsKKwl2b2lkICptbWlvID0gcGUtPm1taW9fYmFzZTsKKworCS8qIGhhcmQtY29kZSBjaGlwICMwICovCisJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOworCisJLyoKKwkgKiBTZWxlY3QgcGFnZSAweDQwIGZvciBvdXIgMzJrIERJTU0gd2luZG93CisJICovCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ18yMDYyMV9ESU1NX1dJTkRPVykgJiAweGZmZmYwMDAwOworCXRtcCB8PSBQRENfUEFHRV9XSU5ET1c7CS8qIHBhZ2UgNDBoOyBhcmJpdHJhcmlseSBzZWxlY3RlZCAqLworCXdyaXRlbCh0bXAsIG1taW8gKyBQRENfMjA2MjFfRElNTV9XSU5ET1cpOworCisJLyoKKwkgKiBSZXNldCBIb3N0IERNQQorCSAqLworCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfSERNQV9DVExTVEFUKTsKKwl0bXAgfD0gUERDX1JFU0VUOworCXdyaXRlbCh0bXAsIG1taW8gKyBQRENfSERNQV9DVExTVEFUKTsKKwlyZWFkbChtbWlvICsgUERDX0hETUFfQ1RMU1RBVCk7CQkvKiBmbHVzaCAqLworCisJdWRlbGF5KDEwKTsKKworCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfSERNQV9DVExTVEFUKTsKKwl0bXAgJj0gflBEQ19SRVNFVDsKKwl3cml0ZWwodG1wLCBtbWlvICsgUERDX0hETUFfQ1RMU1RBVCk7CisJcmVhZGwobW1pbyArIFBEQ19IRE1BX0NUTFNUQVQpOwkJLyogZmx1c2ggKi8KK30KKworc3RhdGljIGludCBwZGNfc2F0YV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXZvaWQgKm1taW9fYmFzZSwgKmRpbW1fbW1pbyA9IE5VTEw7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwcml2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCS8qCisJICogSWYgdGhpcyBkcml2ZXIgaGFwcGVucyB0byBvbmx5IGJlIHVzZWZ1bCBvbiBBcHBsZSdzIEsyLCB0aGVuCisJICogd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaGVyZSBhcyBpdCBoYXMgYSBub3JtYWwgU2VydmVyd29ya3MgSUQKKwkgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCisJcHJvYmVfZW50ID0ga21hbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOworCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCW1lbXNldChwcm9iZV9lbnQsIDAsIHNpemVvZigqcHJvYmVfZW50KSk7CisJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKKworCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpLAorCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJaHByaXYgPSBrbWFsbG9jKHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCW1lbXNldChocHJpdiwgMCwgc2l6ZW9mKCpocHJpdikpOworCisJZGltbV9tbWlvID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCksCisJCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCA0KSk7CisJaWYgKCFkaW1tX21taW8pIHsKKwkJa2ZyZWUoaHByaXYpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWhwcml2LT5kaW1tX21taW8gPSBkaW1tX21taW87CisKKwlwcm9iZV9lbnQtPnNodAkJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OworCXByb2JlX2VudC0+aG9zdF9mbGFncwk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5ob3N0X2ZsYWdzOworCXByb2JlX2VudC0+cGlvX21hc2sJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7CisJcHJvYmVfZW50LT5td2RtYV9tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLm13ZG1hX21hc2s7CisJcHJvYmVfZW50LT51ZG1hX21hc2sJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0udWRtYV9tYXNrOworCXByb2JlX2VudC0+cG9ydF9vcHMJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7CisKKyAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gU0FfU0hJUlE7CisJcHJvYmVfZW50LT5tbWlvX2Jhc2UgPSBtbWlvX2Jhc2U7CisKKwlwcm9iZV9lbnQtPnByaXZhdGVfZGF0YSA9IGhwcml2OworCWJhc2UgKz0gUERDX0NISVAwX09GUzsKKworCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CisJcGRjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzBdLCBiYXNlICsgMHgyMDApOworCXBkY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgYmFzZSArIDB4MjgwKTsKKwlwZGNfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMl0sIGJhc2UgKyAweDMwMCk7CisJcGRjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzNdLCBiYXNlICsgMHgzODApOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KKwkvKiBpbml0aWFsaXplIGxvY2FsIGRpbW0gKi8KKwlpZiAocGRjMjA2MjFfZGltbV9pbml0KHByb2JlX2VudCkpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfaW91bm1hcF9kaW1tOworCX0KKwlwZGNfMjA2MjFfaW5pdChwcm9iZV9lbnQpOworCisJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLworCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7CisJa2ZyZWUocHJvYmVfZW50KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2lvdW5tYXBfZGltbToJCS8qIG9ubHkgZ2V0IHRvIHRoaXMgbGFiZWwgaWYgMjA2MjEgKi8KKwlrZnJlZShocHJpdik7CisJaW91bm1hcChkaW1tX21taW8pOworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAobW1pb19iYXNlKTsKK2Vycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBwZGNfc2F0YV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcGRjX3NhdGFfcGNpX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHBkY19zYXRhX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBkY19zYXRhX3BjaV9kcml2ZXIpOworfQorCisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlByb21pc2UgU0FUQSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGRjX3NhdGFfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KHBkY19zYXRhX2luaXQpOworbW9kdWxlX2V4aXQocGRjX3NhdGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV91bGkuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZmY0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2F0YV91bGkuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqICBzYXRhX3VsaS5jIC0gVUxpIEVsZWN0cm9uaWNzIFNBVEEKKyAqCisgKiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICogIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAxLjEgdGhhdCBjYW4gYmUgZm91bmQgYXQKKyAqICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0xLjEudHh0IGFuZCBpcyBpbmNsdWRlZCBoZXJlaW4KKyAqICBieSByZWZlcmVuY2UuCisgKgorICogIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSBhcyBkaXN0cmlidXRlZAorICogIGluIHRoZSBrZXJuZWwgc291cmNlIENPUFlJTkcgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICogIHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICogIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4KKyAqICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyCisgKiAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorCisjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3VsaSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNSIKKworZW51bSB7CisJdWxpXzUyODkJCT0gMCwKKwl1bGlfNTI4NwkJPSAxLAorCXVsaV81MjgxCQk9IDIsCisKKwkvKiBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwlVTEk1Mjg3X0JBU0UJCT0gMHg5MCwgLyogc2F0YTAgcGh5IFNDUiByZWdpc3RlcnMgKi8KKwlVTEk1Mjg3X09GRlMJCT0gMHgxMCwgLyogb2Zmc2V0IGZyb20gc2F0YTAtPnNhdGExIHBoeSByZWdzICovCisJVUxJNTI4MV9CQVNFCQk9IDB4NjAsIC8qIHNhdGEwIHBoeSBTQ1IgIHJlZ2lzdGVycyAqLworCVVMSTUyODFfT0ZGUwkJPSAweDYwLCAvKiBvZmZzZXQgZnJvbSBzYXRhMC0+c2F0YTEgcGh5IHJlZ3MgKi8KK307CisKK3N0YXRpYyBpbnQgdWxpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdTMyIHVsaV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZyk7CitzdGF0aWMgdm9pZCB1bGlfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHVsaV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDUyODksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHVsaV81Mjg5IH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDUyODcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHVsaV81Mjg3IH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDUyODEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHVsaV81MjgxIH0sCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB1bGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IHVsaV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gdWxpX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgdWxpX3NodCA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKKwkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAorCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAorCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCisJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLm9yZGVyZWRfZmx1c2gJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyB1bGlfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKworCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCisJLnBoeV9yZXNldAkJPSBzYXRhX3BoeV9yZXNldCwKKworCS5ibWRtYV9zZXR1cCAgICAgICAgICAgID0gYXRhX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydCAgICAgICAgICAgID0gYXRhX2JtZG1hX3N0YXJ0LAorCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLnNjcl9yZWFkCQk9IHVsaV9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IHVsaV9zY3Jfd3JpdGUsCisKKwkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKKwkucG9ydF9zdG9wCQk9IGF0YV9wb3J0X3N0b3AsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdWxpX3BvcnRfaW5mbyA9IHsKKwkuc2h0ICAgICAgICAgICAgPSAmdWxpX3NodCwKKwkuaG9zdF9mbGFncyAgICAgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8CisJCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKKwkucGlvX21hc2sgICAgICAgPSAweDAzLAkJLy9zdXBwb3J0IHBpbyBtb2RlIDQgKEZJWE1FKQorCS51ZG1hX21hc2sgICAgICA9IDB4N2YsCQkvL3N1cHBvcnQgdWRtYSBtb2RlIDYKKwkucG9ydF9vcHMgICAgICAgPSAmdWxpX29wcywKK307CisKKworTU9EVUxFX0FVVEhPUigiUGVlciBDaGVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIFVMaSBFbGVjdHJvbmljcyBTQVRBIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB1bGlfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3Njcl9jZmdfYWRkcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCXJldHVybiBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKDQgKiBzY19yZWcpOworfQorCitzdGF0aWMgdTMyIHVsaV9zY3JfY2ZnX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0X3NldC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLCBzY19yZWcpOworCXUzMiB2YWw7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgY2ZnX2FkZHIsICZ2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHVsaV9zY3JfY2ZnX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NyLCB1MzIgdmFsKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldik7CisJdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcCwgc2NyKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgY2ZnX2FkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyB1MzIgdWxpX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCisJcmV0dXJuIHVsaV9zY3JfY2ZnX3JlYWQoYXAsIHNjX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHVsaV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCit7CisJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQkvL1NDUl9DT05UUk9MPTIsIFNDUl9FUlJPUj0xLCBTQ1JfU1RBVFVTPTAKKwkJcmV0dXJuOworCisJdWxpX3Njcl9jZmdfd3JpdGUoYXAsIHNjX3JlZywgdmFsKTsKK30KKworLyogbW92ZSB0byBQQ0kgbGF5ZXIsIGludGVncmF0ZSB3LyBNU0kgc3R1ZmYgKi8KK3N0YXRpYyB2b2lkIHBjaV9lbmFibGVfaW50eChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgcGNpX2NvbW1hbmQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKKwlpZiAocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKKwkJcGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7CisJfQorfQorCitzdGF0aWMgaW50IHVsaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpOworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlwcGkgPSAmdWxpX3BvcnRfaW5mbzsKKwlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgJnBwaSk7CisJaWYgKCFwcm9iZV9lbnQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisJCisJc3dpdGNoIChib2FyZF9pZHgpIHsKKwljYXNlIHVsaV81Mjg3OgorCQlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0U7CisJCXByb2JlX2VudC0+cG9ydFsxXS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUzsKKyAgICAgICAJCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CisKKyAgICAgICAJCXByb2JlX2VudC0+cG9ydFsyXS5jbWRfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIDg7CisJCXByb2JlX2VudC0+cG9ydFsyXS5hbHRzdGF0dXNfYWRkciA9CisJCXByb2JlX2VudC0+cG9ydFsyXS5jdGxfYWRkciA9CisJCQkocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpIHwgQVRBX1BDSV9DVExfT0ZTKSArIDQ7CisJCXByb2JlX2VudC0+cG9ydFsyXS5ibWRtYV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpICsgMTY7CisJCXByb2JlX2VudC0+cG9ydFsyXS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUyo0OworCisJCXByb2JlX2VudC0+cG9ydFszXS5jbWRfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSArIDg7CisJCXByb2JlX2VudC0+cG9ydFszXS5hbHRzdGF0dXNfYWRkciA9CisJCXByb2JlX2VudC0+cG9ydFszXS5jdGxfYWRkciA9CisJCQkocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpIHwgQVRBX1BDSV9DVExfT0ZTKSArIDQ7CisJCXByb2JlX2VudC0+cG9ydFszXS5ibWRtYV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpICsgMjQ7CisJCXByb2JlX2VudC0+cG9ydFszXS5zY3JfYWRkciA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUyo1OworCisJCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFsyXSk7CisJCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFszXSk7CisJCWJyZWFrOworCisJY2FzZSB1bGlfNTI4OToKKwkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0gVUxJNTI4N19CQVNFOworCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBVTEk1Mjg3X0JBU0UgKyBVTEk1Mjg3X09GRlM7CisJCWJyZWFrOworCisJY2FzZSB1bGlfNTI4MToKKwkJcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0gVUxJNTI4MV9CQVNFOworCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBVTEk1MjgxX0JBU0UgKyBVTEk1MjgxX09GRlM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9lbmFibGVfaW50eChwZGV2KTsKKworCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gdmFsdWUgKi8KKwlhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpOworCWtmcmVlKHByb2JlX2VudCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXQ6CisJaWYgKCFwY2lfZGV2X2J1c3kpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7CisKK30KKworc3RhdGljIGludCBfX2luaXQgdWxpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ1bGlfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bGlfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdWxpX3BjaV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHVsaV9pbml0KTsKK21vZHVsZV9leGl0KHVsaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3ZpYS5jIGIvZHJpdmVycy9zY3NpL3NhdGFfdmlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3ODMwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3ZpYS5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICAgc2F0YV92aWEuYyAtIFZJQSBTZXJpYWwgQVRBIGNvbnRyb2xsZXJzCisKKyAgIE1haW50YWluZWQgYnk6ICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgICAJCSAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisgCQkgICBvbiBlbWFpbHMuCisKKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgIENvcHlyaWdodCAyMDAzLTIwMDQgSmVmZiBHYXJ6aWsKKworICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgT3BlbgorICAgU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMSB0aGF0IGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgaW5jbHVkZWQgaGVyZWluCisgICBieSByZWZlcmVuY2UuCisKKyAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpIGFzIGRpc3RyaWJ1dGVkCisgICBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YKKyAgIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdworICAgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgICB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICAgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLgorICAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91cgorICAgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBPU0wgb3IgdGhlIEdQTC4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBUby1kbyBsaXN0OgorICAgKiBWVDY0MjEgUEFUQSBzdXBwb3J0CisKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfdmlhIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xIgorCitlbnVtIGJvYXJkX2lkc19lbnVtIHsKKwl2dDY0MjAsCisJdnQ2NDIxLAorfTsKKworZW51bSB7CisJU0FUQV9DSEFOX0VOQUIJCT0gMHg0MCwgLyogU0FUQSBjaGFubmVsIGVuYWJsZSAqLworCVNBVEFfSU5UX0dBVEUJCT0gMHg0MSwgLyogU0FUQSBpbnRlcnJ1cHQgZ2F0aW5nICovCisJU0FUQV9OQVRJVkVfTU9ERQk9IDB4NDIsIC8qIE5hdGl2ZSBtb2RlIGVuYWJsZSAqLworCVNBVEFfUEFUQV9TSEFSSU5HCT0gMHg0OSwgLyogUEFUQS9TQVRBIHNoYXJpbmcgZnVuYyBjdHJsICovCisKKwlQT1JUMAkJCT0gKDEgPDwgMSksCisJUE9SVDEJCQk9ICgxIDw8IDApLAorCUFMTF9QT1JUUwkJPSBQT1JUMCB8IFBPUlQxLAorCU5fUE9SVFMJCQk9IDIsCisKKwlOQVRJVkVfTU9ERV9BTEwJCT0gKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDUpIHwgKDEgPDwgNCksCisKKwlTQVRBX0VYVF9QSFkJCT0gKDEgPDwgNiksIC8qIDA9PXVzZSBQQVRBLCAxPT1leHQgcGh5ICovCisJU0FUQV8yREVWCQk9ICgxIDw8IDUpLCAvKiBTQVRBIGlzIG1hc3Rlci9zbGF2ZSAqLworfTsKKworc3RhdGljIGludCBzdmlhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdTMyIHN2aWFfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOworc3RhdGljIHZvaWQgc3ZpYV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3ZpYV9wY2lfdGJsW10gPSB7CisJeyAweDExMDYsIDB4MzE0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgdnQ2NDIwIH0sCisJeyAweDExMDYsIDB4MzI0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgdnQ2NDIxIH0sCisKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdmlhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBzdmlhX3BjaV90YmwsCisJLnByb2JlCQkJPSBzdmlhX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgc3ZpYV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuZWhfc3RyYXRlZ3lfaGFuZGxlcgk9IGF0YV9zY3NpX2Vycm9yLAorCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCisJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKKwkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5vcmRlcmVkX2ZsdXNoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc3ZpYV9zYXRhX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKworCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCisKKwkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisKKwkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisKKwkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCisJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAorCisJLnNjcl9yZWFkCQk9IHN2aWFfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBzdmlhX3Njcl93cml0ZSwKKworCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzdmlhX3BvcnRfaW5mbyA9IHsKKwkuc2h0CQk9ICZzdmlhX3NodCwKKwkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCS5waW9fbWFzawk9IDB4MWYsCisJLm13ZG1hX21hc2sJPSAweDA3LAorCS51ZG1hX21hc2sJPSAweDdmLAorCS5wb3J0X29wcwk9ICZzdmlhX3NhdGFfb3BzLAorfTsKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBWSUEgU0FUQSBjb250cm9sbGVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN2aWFfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyB1MzIgc3ZpYV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybiAweGZmZmZmZmZmVTsKKwlyZXR1cm4gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoNCAqIHNjX3JlZykpOworfQorCitzdGF0aWMgdm9pZCBzdmlhX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybjsKKwlvdXRsKHZhbCwgYXAtPmlvYWRkci5zY3JfYWRkciArICg0ICogc2NfcmVnKSk7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3ZpYV9iYXJfc2l6ZXNbXSA9IHsKKwk4LCA0LCA4LCA0LCAxNiwgMjU2Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZ0NjQyMV9iYXJfc2l6ZXNbXSA9IHsKKwkxNiwgMTYsIDE2LCAxNiwgMzIsIDEyOAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3ZpYV9zY3JfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBwb3J0KQoreworCXJldHVybiBhZGRyICsgKHBvcnQgKiAxMjgpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2dDY0MjFfc2NyX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gYWRkciArIChwb3J0ICogNjQpOworfQorCitzdGF0aWMgdm9pZCB2dDY0MjFfaW5pdF9hZGRycyhzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50LAorCQkJICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHBvcnQpOworCXVuc2lnbmVkIGxvbmcgYm1kbWFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSArIChwb3J0ICogOCk7CisJdW5zaWduZWQgbG9uZyBzY3JfYWRkcjsKKworCXByb2JlX2VudC0+cG9ydFtwb3J0XS5jbWRfYWRkciA9IHJlZ19hZGRyOworCXByb2JlX2VudC0+cG9ydFtwb3J0XS5hbHRzdGF0dXNfYWRkciA9CisJcHJvYmVfZW50LT5wb3J0W3BvcnRdLmN0bF9hZGRyID0gKHJlZ19hZGRyICsgOCkgfCBBVEFfUENJX0NUTF9PRlM7CisJcHJvYmVfZW50LT5wb3J0W3BvcnRdLmJtZG1hX2FkZHIgPSBibWRtYV9hZGRyOworCisJc2NyX2FkZHIgPSB2dDY0MjFfc2NyX2FkZHIocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLCBwb3J0KTsKKwlwcm9iZV9lbnQtPnBvcnRbcG9ydF0uc2NyX2FkZHIgPSBzY3JfYWRkcjsKKworCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFtwb3J0XSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqdnQ2NDIwX2luaXRfcHJvYmVfZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaSA9ICZzdmlhX3BvcnRfaW5mbzsKKworCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCAmcHBpKTsKKwlpZiAoIXByb2JlX2VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPQorCQlzdmlhX3Njcl9hZGRyKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KSwgMCk7CisJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0KKwkJc3ZpYV9zY3JfYWRkcihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSksIDEpOworCisJcmV0dXJuIHByb2JlX2VudDsKK30KKworc3RhdGljIHN0cnVjdCBhdGFfcHJvYmVfZW50ICp2dDY0MjFfaW5pdF9wcm9iZV9lbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByb2JlX2VudCA9IGttYWxsb2Moc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByb2JlX2VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQocHJvYmVfZW50LCAwLCBzaXplb2YoKnByb2JlX2VudCkpOworCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7CisJSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7CisKKwlwcm9iZV9lbnQtPnNodAkJPSAmc3ZpYV9zaHQ7CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NBVEFfUkVTRVQgfAorCQkJCSAgQVRBX0ZMQUdfTk9fTEVHQUNZOworCXByb2JlX2VudC0+cG9ydF9vcHMJPSAmc3ZpYV9zYXRhX29wczsKKwlwcm9iZV9lbnQtPm5fcG9ydHMJPSBOX1BPUlRTOworCXByb2JlX2VudC0+aXJxCQk9IHBkZXYtPmlycTsKKwlwcm9iZV9lbnQtPmlycV9mbGFncwk9IFNBX1NISVJROworCXByb2JlX2VudC0+cGlvX21hc2sJPSAweDFmOworCXByb2JlX2VudC0+bXdkbWFfbWFzawk9IDB4MDc7CisJcHJvYmVfZW50LT51ZG1hX21hc2sJPSAweDdmOworCisJZm9yIChpID0gMDsgaSA8IE5fUE9SVFM7IGkrKykKKwkJdnQ2NDIxX2luaXRfYWRkcnMocHJvYmVfZW50LCBwZGV2LCBpKTsKKworCXJldHVybiBwcm9iZV9lbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHN2aWFfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU4IHRtcDg7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZ0bXA4KTsKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICIoJXMpOiByb3V0ZWQgdG8gaGFyZCBpcnEgbGluZSAlZFxuIiwKKwkgICAgICAgcGNpX25hbWUocGRldiksCisJICAgICAgIChpbnQpICh0bXA4ICYgMHhmMCkgPT0gMHhmMCA/IDAgOiB0bXA4ICYgMHgwZik7CisKKwkvKiBtYWtlIHN1cmUgU0FUQSBjaGFubmVscyBhcmUgZW5hYmxlZCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfQ0hBTl9FTkFCLCAmdG1wOCk7CisJaWYgKCh0bXA4ICYgQUxMX1BPUlRTKSAhPSBBTExfUE9SVFMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiglcyk6IGVuYWJsaW5nIFNBVEEgY2hhbm5lbHMgKDB4JXgpXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIChpbnQpIHRtcDgpOworCQl0bXA4IHw9IEFMTF9QT1JUUzsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfQ0hBTl9FTkFCLCB0bXA4KTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgaW50ZXJydXB0cyBmb3IgZWFjaCBjaGFubmVsIHNlbnQgdG8gdXMgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTQVRBX0lOVF9HQVRFLCAmdG1wOCk7CisJaWYgKCh0bXA4ICYgQUxMX1BPUlRTKSAhPSBBTExfUE9SVFMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiglcyk6IGVuYWJsaW5nIFNBVEEgY2hhbm5lbCBpbnRlcnJ1cHRzICgweCV4KVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCAoaW50KSB0bXA4KTsKKwkJdG1wOCB8PSBBTExfUE9SVFM7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTQVRBX0lOVF9HQVRFLCB0bXA4KTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgbmF0aXZlIG1vZGUgaXMgZW5hYmxlZCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfTkFUSVZFX01PREUsICZ0bXA4KTsKKwlpZiAoKHRtcDggJiBOQVRJVkVfTU9ERV9BTEwpICE9IE5BVElWRV9NT0RFX0FMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiKCVzKTogZW5hYmxpbmcgU0FUQSBjaGFubmVsIG5hdGl2ZSBtb2RlICgweCV4KVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCAoaW50KSB0bXA4KTsKKwkJdG1wOCB8PSBOQVRJVkVfTU9ERV9BTEw7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBTQVRBX05BVElWRV9NT0RFLCB0bXA4KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3ZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJaW50IGJvYXJkX2lkID0gKGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwljb25zdCBpbnQgKmJhcl9zaXplczsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwl1OCB0bXA4OworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJcGNpX2Rldl9idXN5ID0gMTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChib2FyZF9pZCA9PSB2dDY0MjApIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU0FUQV9QQVRBX1NIQVJJTkcsICZ0bXA4KTsKKwkJaWYgKHRtcDggJiBTQVRBXzJERVYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogU0FUQSBtYXN0ZXIvc2xhdmUgbm90IHN1cHBvcnRlZCAoMHgleClcbiIsCisJCSAgICAgICAJcGNpX25hbWUocGRldiksIChpbnQpIHRtcDgpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJCX0KKworCQliYXJfc2l6ZXMgPSAmc3ZpYV9iYXJfc2l6ZXNbMF07CisJfSBlbHNlIHsKKwkJYmFyX3NpemVzID0gJnZ0NjQyMV9iYXJfc2l6ZXNbMF07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3ZpYV9iYXJfc2l6ZXMpOyBpKyspCisJCWlmICgocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpID09IDApIHx8CisJCSAgICAocGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSA8IGJhcl9zaXplc1tpXSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogaW52YWxpZCBQQ0kgQkFSICV1IChzeiAweCVseCwgdmFsIDB4JWx4KVxuIiwKKwkJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgaSwKKwkJCSAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSksCisJCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwkJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlpZiAoYm9hcmRfaWQgPT0gdnQ2NDIwKQorCQlwcm9iZV9lbnQgPSB2dDY0MjBfaW5pdF9wcm9iZV9lbnQocGRldik7CisJZWxzZQorCQlwcm9iZV9lbnQgPSB2dDY0MjFfaW5pdF9wcm9iZV9lbnQocGRldik7CisJCisJaWYgKCFwcm9iZV9lbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKworCXN2aWFfY29uZmlndXJlKHBkZXYpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2luaXQgc3ZpYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc3ZpYV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN2aWFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3ZpYV9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3ZpYV9pbml0KTsKK21vZHVsZV9leGl0KHN2aWFfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfdnNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyOGYwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogIHNhdGFfdnNjLmMgLSBWaXRlc3NlIFZTQzcxNzQgNCBwb3J0IERQQSBTQVRBCisgKgorICogIE1haW50YWluZWQgYnk6ICBKZXJlbXkgSGlnZG9uIEAgU0dJCisgKiAJCSAgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworICoJCSAgICBvbiBlbWFpbHMuCisgKgorICogIENvcHlyaWdodCAyMDA0IFNHSQorICoKKyAqICBCaXRzIGZyb20gSmVmZiBHYXJ6aWssIENvcHlyaWdodCBSZWRIYXQsIEluYy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInNhdGFfdnNjIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgorCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgb2Zmc2V0cyAoZnJvbSBjaGlwIGJhc2UgYWRkcmVzcykgKi8KKyNkZWZpbmUgVlNDX1NBVEFfSU5UX1NUQVRfT0ZGU0VUCTB4MDAKKyNkZWZpbmUgVlNDX1NBVEFfSU5UX01BU0tfT0ZGU0VUCTB4MDQKKworLyogVGFza2ZpbGUgcmVnaXN0ZXJzIG9mZnNldHMgKi8KKyNkZWZpbmUgVlNDX1NBVEFfVEZfQ01EX09GRlNFVAkJMHgwMAorI2RlZmluZSBWU0NfU0FUQV9URl9EQVRBX09GRlNFVAkJMHgwMAorI2RlZmluZSBWU0NfU0FUQV9URl9FUlJPUl9PRkZTRVQJMHgwNAorI2RlZmluZSBWU0NfU0FUQV9URl9GRUFUVVJFX09GRlNFVAkweDA2CisjZGVmaW5lIFZTQ19TQVRBX1RGX05TRUNUX09GRlNFVAkweDA4CisjZGVmaW5lIFZTQ19TQVRBX1RGX0xCQUxfT0ZGU0VUCQkweDBjCisjZGVmaW5lIFZTQ19TQVRBX1RGX0xCQU1fT0ZGU0VUCQkweDEwCisjZGVmaW5lIFZTQ19TQVRBX1RGX0xCQUhfT0ZGU0VUCQkweDE0CisjZGVmaW5lIFZTQ19TQVRBX1RGX0RFVklDRV9PRkZTRVQJMHgxOAorI2RlZmluZSBWU0NfU0FUQV9URl9TVEFUVVNfT0ZGU0VUCTB4MWMKKyNkZWZpbmUgVlNDX1NBVEFfVEZfQ09NTUFORF9PRkZTRVQJMHgxZAorI2RlZmluZSBWU0NfU0FUQV9URl9BTFRTVEFUVVNfT0ZGU0VUCTB4MjgKKyNkZWZpbmUgVlNDX1NBVEFfVEZfQ1RMX09GRlNFVAkJMHgyOQorCisvKiBETUEgYmFzZSAqLworI2RlZmluZSBWU0NfU0FUQV9VUF9ERVNDUklQVE9SX09GRlNFVAkweDY0CisjZGVmaW5lIFZTQ19TQVRBX1VQX0RBVEFfQlVGRkVSX09GRlNFVAkweDZDCisjZGVmaW5lIFZTQ19TQVRBX0RNQV9DTURfT0ZGU0VUCQkweDcwCisKKy8qIFNDUnMgYmFzZSAqLworI2RlZmluZSBWU0NfU0FUQV9TQ1JfU1RBVFVTX09GRlNFVAkweDEwMAorI2RlZmluZSBWU0NfU0FUQV9TQ1JfRVJST1JfT0ZGU0VUCTB4MTA0CisjZGVmaW5lIFZTQ19TQVRBX1NDUl9DT05UUk9MX09GRlNFVAkweDEwOAorCisvKiBQb3J0IHN0cmlkZSAqLworI2RlZmluZSBWU0NfU0FUQV9QT1JUX09GRlNFVAkJMHgyMDAKKworCitzdGF0aWMgdTMyIHZzY19zYXRhX3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQoreworCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKKwkJcmV0dXJuIDB4ZmZmZmZmZmZVOworCXJldHVybiByZWFkbCgodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCB2c2Nfc2F0YV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsCisJCQkgICAgICAgdTMyIHZhbCkKK3sKKwlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCisJCXJldHVybjsKKwl3cml0ZWwodmFsLCAodm9pZCAqKSBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKK30KKworCitzdGF0aWMgdm9pZCB2c2NfaW50cl9tYXNrX3VwZGF0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1OCBjdGwpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrX2FkZHI7CisJdTggbWFzazsKKworCW1hc2tfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZSArCisJCVZTQ19TQVRBX0lOVF9NQVNLX09GRlNFVCArIGFwLT5wb3J0X25vOworCW1hc2sgPSByZWFkYihtYXNrX2FkZHIpOworCWlmIChjdGwgJiBBVEFfTklFTikKKwkJbWFzayB8PSAweDgwOworCWVsc2UKKwkJbWFzayAmPSAweDdGOworCXdyaXRlYihtYXNrLCBtYXNrX2FkZHIpOworfQorCisKK3N0YXRpYyB2b2lkIHZzY19zYXRhX3RmX2xvYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXNfYWRkciA9IHRmLT5mbGFncyAmIEFUQV9URkxBR19JU0FERFI7CisKKwkvKgorCSAqIFRoZSBvbmx5IHRoaW5nIHRoZSBjdGwgcmVnaXN0ZXIgaXMgdXNlZCBmb3IgaXMgU1JTVC4KKwkgKiBUaGF0IGlzIG5vdCBlbmFibGVkIG9yIGRpc2FibGVkIHZpYSB0Zl9sb2FkLgorCSAqIEhvd2V2ZXIsIGlmIEFUQV9OSUVOIGlzIGNoYW5nZWQsIHRoZW4gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGludGVycnVwdCByZWdpc3Rlci4KKwkgKi8KKwlpZiAoKHRmLT5jdGwgJiBBVEFfTklFTikgIT0gKGFwLT5sYXN0X2N0bCAmIEFUQV9OSUVOKSkgeworCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOworCQl2c2NfaW50cl9tYXNrX3VwZGF0ZShhcCwgdGYtPmN0bCAmIEFUQV9OSUVOKTsKKwl9CisJaWYgKGlzX2FkZHIgJiYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkpIHsKKwkJd3JpdGV3KHRmLT5mZWF0dXJlIHwgKCgodTE2KXRmLT5ob2JfZmVhdHVyZSkgPDwgOCksIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5uc2VjdCB8ICgoKHUxNil0Zi0+aG9iX25zZWN0KSA8PCA4KSwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFsIHwgKCgodTE2KXRmLT5ob2JfbGJhbCkgPDwgOCksIGlvYWRkci0+bGJhbF9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFtIHwgKCgodTE2KXRmLT5ob2JfbGJhbSkgPDwgOCksIGlvYWRkci0+bGJhbV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFoIHwgKCgodTE2KXRmLT5ob2JfbGJhaCkgPDwgOCksIGlvYWRkci0+bGJhaF9hZGRyKTsKKwl9IGVsc2UgaWYgKGlzX2FkZHIpIHsKKwkJd3JpdGV3KHRmLT5mZWF0dXJlLCBpb2FkZHItPmZlYXR1cmVfYWRkcik7CisJCXdyaXRldyh0Zi0+bnNlY3QsIGlvYWRkci0+bnNlY3RfYWRkcik7CisJCXdyaXRldyh0Zi0+bGJhbCwgaW9hZGRyLT5sYmFsX2FkZHIpOworCQl3cml0ZXcodGYtPmxiYW0sIGlvYWRkci0+bGJhbV9hZGRyKTsKKwkJd3JpdGV3KHRmLT5sYmFoLCBpb2FkZHItPmxiYWhfYWRkcik7CisJfQorCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19ERVZJQ0UpCisJCXdyaXRlYih0Zi0+ZGV2aWNlLCBpb2FkZHItPmRldmljZV9hZGRyKTsKKworCWF0YV93YWl0X2lkbGUoYXApOworfQorCisKK3N0YXRpYyB2b2lkIHZzY19zYXRhX3RmX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKKwl1MTYgbnNlY3QsIGxiYWwsIGxiYW0sIGxiYWg7CisKKwluc2VjdCA9IHRmLT5uc2VjdCA9IHJlYWR3KGlvYWRkci0+bnNlY3RfYWRkcik7CisJbGJhbCA9IHRmLT5sYmFsID0gcmVhZHcoaW9hZGRyLT5sYmFsX2FkZHIpOworCWxiYW0gPSB0Zi0+bGJhbSA9IHJlYWR3KGlvYWRkci0+bGJhbV9hZGRyKTsKKwlsYmFoID0gdGYtPmxiYWggPSByZWFkdyhpb2FkZHItPmxiYWhfYWRkcik7CisJdGYtPmRldmljZSA9IHJlYWR3KGlvYWRkci0+ZGV2aWNlX2FkZHIpOworCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkgeworCQl0Zi0+aG9iX2ZlYXR1cmUgPSByZWFkYihpb2FkZHItPmVycm9yX2FkZHIpOworCQl0Zi0+aG9iX25zZWN0ID0gbnNlY3QgPj4gODsKKwkJdGYtPmhvYl9sYmFsID0gbGJhbCA+PiA4OworCQl0Zi0+aG9iX2xiYW0gPSBsYmFtID4+IDg7CisJCXRmLT5ob2JfbGJhaCA9IGxiYWggPj4gODsKKyAgICAgICAgfQorfQorCisKKy8qCisgKiB2c2Nfc2F0YV9pbnRlcnJ1cHQKKyAqCisgKiBSZWFkIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgYW5kIHByb2Nlc3MgZm9yIHRoZSBkZXZpY2VzIHRoYXQgaGF2ZSB0aGVtIHBlbmRpbmcuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB2c2Nfc2F0YV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCXUzMiBpbnRfc3RhdHVzOworCisJc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisKKwlpbnRfc3RhdHVzID0gcmVhZGwoaG9zdF9zZXQtPm1taW9fYmFzZSArIFZTQ19TQVRBX0lOVF9TVEFUX09GRlNFVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdF9zZXQtPm5fcG9ydHM7IGkrKykgeworCQlpZiAoaW50X3N0YXR1cyAmICgodTMyKSAweEZGIDw8ICg4ICogaSkpKSB7CisJCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCisJCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKwkJCWlmIChhcCAmJiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSkpIHsKKwkJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKKwkJCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkpCisJCQkJCWhhbmRsZWQgKz0gYXRhX2hvc3RfaW50cihhcCwgcWMpOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgdnNjX3NhdGFfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmVoX3N0cmF0ZWd5X2hhbmRsZXIJPSBhdGFfc2NzaV9lcnJvciwKKwkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCisJLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKKwkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKKwkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKKwkucHJvY19uYW1lCQk9IERSVl9OQU1FLAorCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKKwkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkub3JkZXJlZF9mbHVzaAkJPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgdnNjX3NhdGFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSB2c2Nfc2F0YV90Zl9sb2FkLAorCS50Zl9yZWFkCQk9IHZzY19zYXRhX3RmX3JlYWQsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLnBoeV9yZXNldAkJPSBzYXRhX3BoeV9yZXNldCwKKwkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKKwkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCisJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmlycV9oYW5kbGVyCQk9IHZzY19zYXRhX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCisJLnNjcl9yZWFkCQk9IHZzY19zYXRhX3Njcl9yZWFkLAorCS5zY3Jfd3JpdGUJCT0gdnNjX3NhdGFfc2NyX3dyaXRlLAorCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0b3AJCT0gYXRhX3BvcnRfc3RvcCwKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2c2Nfc2F0YV9zZXR1cF9wb3J0KHN0cnVjdCBhdGFfaW9wb3J0cyAqcG9ydCwgdW5zaWduZWQgbG9uZyBiYXNlKQoreworCXBvcnQtPmNtZF9hZGRyCQk9IGJhc2UgKyBWU0NfU0FUQV9URl9DTURfT0ZGU0VUOworCXBvcnQtPmRhdGFfYWRkcgkJPSBiYXNlICsgVlNDX1NBVEFfVEZfREFUQV9PRkZTRVQ7CisJcG9ydC0+ZXJyb3JfYWRkcgk9IGJhc2UgKyBWU0NfU0FUQV9URl9FUlJPUl9PRkZTRVQ7CisJcG9ydC0+ZmVhdHVyZV9hZGRyCT0gYmFzZSArIFZTQ19TQVRBX1RGX0ZFQVRVUkVfT0ZGU0VUOworCXBvcnQtPm5zZWN0X2FkZHIJPSBiYXNlICsgVlNDX1NBVEFfVEZfTlNFQ1RfT0ZGU0VUOworCXBvcnQtPmxiYWxfYWRkcgkJPSBiYXNlICsgVlNDX1NBVEFfVEZfTEJBTF9PRkZTRVQ7CisJcG9ydC0+bGJhbV9hZGRyCQk9IGJhc2UgKyBWU0NfU0FUQV9URl9MQkFNX09GRlNFVDsKKwlwb3J0LT5sYmFoX2FkZHIJCT0gYmFzZSArIFZTQ19TQVRBX1RGX0xCQUhfT0ZGU0VUOworCXBvcnQtPmRldmljZV9hZGRyCT0gYmFzZSArIFZTQ19TQVRBX1RGX0RFVklDRV9PRkZTRVQ7CisJcG9ydC0+c3RhdHVzX2FkZHIJPSBiYXNlICsgVlNDX1NBVEFfVEZfU1RBVFVTX09GRlNFVDsKKwlwb3J0LT5jb21tYW5kX2FkZHIJPSBiYXNlICsgVlNDX1NBVEFfVEZfQ09NTUFORF9PRkZTRVQ7CisJcG9ydC0+YWx0c3RhdHVzX2FkZHIJPSBiYXNlICsgVlNDX1NBVEFfVEZfQUxUU1RBVFVTX09GRlNFVDsKKwlwb3J0LT5jdGxfYWRkcgkJPSBiYXNlICsgVlNDX1NBVEFfVEZfQ1RMX09GRlNFVDsKKwlwb3J0LT5ibWRtYV9hZGRyCT0gYmFzZSArIFZTQ19TQVRBX0RNQV9DTURfT0ZGU0VUOworCXBvcnQtPnNjcl9hZGRyCQk9IGJhc2UgKyBWU0NfU0FUQV9TQ1JfU1RBVFVTX09GRlNFVDsKKwl3cml0ZWwoMCwgYmFzZSArIFZTQ19TQVRBX1VQX0RFU0NSSVBUT1JfT0ZGU0VUKTsKKwl3cml0ZWwoMCwgYmFzZSArIFZTQ19TQVRBX1VQX0RBVEFfQlVGRkVSX09GRlNFVCk7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgdnNjX3NhdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwlpbnQgcGNpX2Rldl9idXN5ID0gMDsKKwl2b2lkICptbWlvX2Jhc2U7CisJaW50IHJjOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBoYXZlIG5lZWRlZCByZXNvdXJjZSBtYXBwZWQuCisJICovCisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPT0gMCkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlwY2lfZGV2X2J1c3kgPSAxOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiBVc2UgMzIgYml0IERNQSBtYXNrLCBiZWNhdXNlIDY0IGJpdCBhZGRyZXNzIHN1cHBvcnQgaXMgcG9vci4KKwkgKi8KKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisKKwlwcm9iZV9lbnQgPSBrbWFsbG9jKHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2JlX2VudCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQorCW1lbXNldChwcm9iZV9lbnQsIDAsIHNpemVvZigqcHJvYmVfZW50KSk7CisJcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKKworCW1taW9fYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpZiAobW1pb19iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CisJfQorCWJhc2UgPSAodW5zaWduZWQgbG9uZykgbW1pb19iYXNlOworCisJLyoKKwkgKiBEdWUgdG8gYSBidWcgaW4gdGhlIGNoaXAsIHRoZSBkZWZhdWx0IGNhY2hlIGxpbmUgc2l6ZSBjYW4ndCBiZSB1c2VkCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDB4ODApOworCisJcHJvYmVfZW50LT5zaHQgPSAmdnNjX3NhdGFfc2h0OworCXByb2JlX2VudC0+aG9zdF9mbGFncyA9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCUFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19TQVRBX1JFU0VUOworCXByb2JlX2VudC0+cG9ydF9vcHMgPSAmdnNjX3NhdGFfb3BzOworCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CisJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBTQV9TSElSUTsKKwlwcm9iZV9lbnQtPm1taW9fYmFzZSA9IG1taW9fYmFzZTsKKworCS8qIFdlIGRvbid0IGNhcmUgbXVjaCBhYm91dCB0aGUgUElPL1VETUEgbWFza3MsIGJ1dCB0aGUgY29yZSB3b24ndCBsaWtlIHVzCisJICogaWYgd2UgZG9uJ3QgZmlsbCB0aGVzZQorCSAqLworCXByb2JlX2VudC0+cGlvX21hc2sgPSAweDFmOworCXByb2JlX2VudC0+bXdkbWFfbWFzayA9IDB4MDc7CisJcHJvYmVfZW50LT51ZG1hX21hc2sgPSAweDdmOworCisJLyogV2UgaGF2ZSA0IHBvcnRzIHBlciBQQ0kgZnVuY3Rpb24gKi8KKwl2c2Nfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMF0sIGJhc2UgKyAxICogVlNDX1NBVEFfUE9SVF9PRkZTRVQpOworCXZzY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgYmFzZSArIDIgKiBWU0NfU0FUQV9QT1JUX09GRlNFVCk7CisJdnNjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzJdLCBiYXNlICsgMyAqIFZTQ19TQVRBX1BPUlRfT0ZGU0VUKTsKKwl2c2Nfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbM10sIGJhc2UgKyA0ICogVlNDX1NBVEFfUE9SVF9PRkZTRVQpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiAKKwkgKiBDb25maWcgb2Zmc2V0IDB4OTggaXMgIkV4dGVuZGVkIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIgorCSAqIERlZmF1bHQgdmFsdWUgaXMgKDEgPDwgMjgpLiAgQWxsIGJpdHMgZXhjZXB0IGJpdCAyOCBhcmUgcmVzZXJ2ZWQgaW4KKwkgKiBEUEEgbW9kZS4gIElmIGJpdCAyOCBpcyBzZXQsIExFRCAwIHJlZmxlY3RzIGFsbCBwb3J0cycgYWN0aXZpdHkuCisJICogSWYgYml0IDI4IGlzIGNsZWFyLCBlYWNoIHBvcnQgaGFzIGl0cyBvd24gTEVELgorCSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg5OCwgMCk7CisKKwkvKiBGSVhNRTogY2hlY2sgYXRhX2RldmljZV9hZGQgcmV0dXJuIHZhbHVlICovCisJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKKwlrZnJlZShwcm9iZV9lbnQpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9lbnQ6CisJa2ZyZWUocHJvYmVfZW50KTsKK2Vycl9vdXRfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dDoKKwlpZiAoIXBjaV9kZXZfYnVzeSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworCisvKgorICogMHgxNzI1LzB4NzE3NCBpcyB0aGUgVml0ZXNzZSBWU0MtNzE3NAorICogMHg4MDg2LzB4MzIwMCBpcyB0aGUgSW50ZWwgMzEyNDQsIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGlkZW50aWNhbAorICogY29tcGF0aWJpbGl0eSBpcyB1bnRlc3RlZCBhcyBvZiB5ZXQKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZzY19zYXRhX3BjaV90YmxbXSA9IHsKKwl7IDB4MTcyNSwgMHg3MTc0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAweDEwNjAwLCAweEZGRkZGRiwgMCB9LAorCXsgMHg4MDg2LCAweDMyMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB4MTA2MDAsIDB4RkZGRkZGLCAwIH0sCisJeyB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2c2Nfc2F0YV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gdnNjX3NhdGFfcGNpX3RibCwKKwkucHJvYmUJCQk9IHZzY19zYXRhX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgdnNjX3NhdGFfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnZzY19zYXRhX3BjaV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2c2Nfc2F0YV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2c2Nfc2F0YV9wY2lfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJKZXJlbXkgSGlnZG9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIFZpdGVzc2UgVlNDNzE3NCBTQVRBIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2c2Nfc2F0YV9wY2lfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQodnNjX3NhdGFfaW5pdCk7Cittb2R1bGVfZXhpdCh2c2Nfc2F0YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3JpcHRfYXNtLnBsIGIvZHJpdmVycy9zY3NpL3NjcmlwdF9hc20ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NTFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3JpcHRfYXNtLnBsCkBAIC0wLDAgKzEsOTg0IEBACisjIS91c3IvYmluL3BlcmwgLXMKKworIyBOQ1IgNTNjODEwIHNjcmlwdCBhc3NlbWJsZXIKKyMgU3BvbnNvcmVkIGJ5IAorIyAgICAgICBpWCBNdWx0aXVzZXIgTXVsdGl0YXNraW5nIE1hZ2F6aW5lCisjCisjIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisjICAgICAgVmlzaW9uYXJ5IENvbXB1dGluZyAKKyMgICAgICAoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorIyAgICAgIGRyZXdAQ29sb3JhZG8uRURVCisjICAgICAgKzEgKDMwMykgNzg2LTc5NzUgCisjCisjICAgU3VwcG9ydCBmb3IgNTNjNzEwICh2aWEgLW5jcjd4MF9mYW1pbHkgc3dpdGNoKSBhZGRlZCBieSBSaWNoYXJkCisjICAgSGlyc3QgPHJpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51az4gLSAxNXRoIE1hcmNoIDE5OTcKKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyBUb2xlckFOVCBhbmQgU0NTSSBTQ1JJUFRTIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgTkNSIENvcnBvcmF0aW9uLgorIworCisjIAorIyBCYXNpY2FsbHksIEkgZm9sbG93IHRoZSBOQ1Igc3ludGF4IGRvY3VtZW50ZWQgaW4gdGhlIE5DUjUzYzcxMCAKKyMgUHJvZ3JhbW1lcidzIGd1aWRlLCB3aXRoIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLCByZWdpc3RlcnMsIGV0Yy4KKyMgZnJvbSB0aGUgTkNSNTNjODEwLgorIworIyBEaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgYXNzZW1ibGVyIGFuZCBOQ1IncyBhcmUgdGhhdCAKKyMgMS4gIFBBU1MsIFJFTCAoZGF0YSwgSlVNUHMgd29yayBmaW5lKSwgYW5kIHRoZSBvcHRpb24gdG8gc3RhcnQgYSBuZXcgCisjCXNjcmlwdCwgIGFyZSB1bmltcGxlbWVudGVkLCBzaW5jZSBJIGRpZG4ndCB1c2UgdGhlbSBpbiBteSBzY3JpcHRzLgorIyAKKyMgMi4gIEkgYWxzbyBlbWl0IGEgc2NyaXB0X3UuaCBmaWxlLCB3aGljaCB3aWxsIHVuZGVmaW5lIGFsbCBvZiAKKyMgCXRoZSBBXyosIEVfKiwgZXRjLiBzeW1ib2xzIGRlZmluZWQgaW4gdGhlIHNjcmlwdC4gIFRoaXMgCisjCW1ha2VzIGluY2x1ZGluZyBtdWx0aXBsZSBzY3JpcHRzIGluIG9uZSBwcm9ncmFtIGVhc2llcgorIyAJCisjIDMuICBUaGlzIGlzIGEgc2luZ2xlIHBhc3MgYXNzZW1ibGVyLCB3aGljaCBvbmx5IGVtaXRzIAorIwkuaCBmaWxlcy4KKyMKKworCisjIFhYWCAtIHNldCB0aGVzZSB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zCiskZGVidWcgPSAwOwkJIyBQcmludCBnZW5lcmFsIGRlYnVnZ2luZyBtZXNzYWdlcworJGRlYnVnX2V4dGVybmFsID0gMDsJIyBQcmludCBleHRlcm5hbC9mb3J3YXJkIHJlZmVyZW5jZSBtZXNzYWdlcworJGxpc3RfaW5fYXJyYXkgPSAxOwkjIEVtaXQgb3JpZ2luYWwgU0NSSVBUUyBhc3NlbWJsZXIgaW4gY29tbWVudHMgaW4KKwkJCSMgc2NyaXB0LmgKKyMkcHJlZml4OwkJIyAoc2V0IGJ5IHBlcmwgLXMpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmluZSBhbGwgYXJyYXlzIGhhdmluZyB0aGlzIHByZWZpeCBzbyB3ZSAKKwkJCSMgZG9uJ3QgaGF2ZSBuYW1lIHNwYWNlIGNvbGxpc2lvbnMgYWZ0ZXIgCisJCQkjIGFzc2VtYmxpbmcgdGhpcyBmaWxlIGluIGRpZmZlcmVudCB3YXlzIGZvcgorCQkJIyBkaWZmZXJlbnQgaG9zdCBhZGFwdGVycworCisjIENvbnN0YW50cworCisKKyMgVGFibGUgb2YgdGhlIFNDU0kgcGhhc2UgZW5jb2RpbmdzCislc2NzaV9waGFzZXMgPSAoIAkJCQorICAgICdEQVRBX09VVCcsIDB4MDBfMDBfMDBfMDAsICdEQVRBX0lOJywgMHgwMV8wMF8wMF8wMCwgJ0NNRCcsIDB4MDJfMDBfMDBfMDAsCisgICAgJ1NUQVRVUycsIDB4MDNfMDBfMDBfMDAsICdNU0dfT1VUJywgMHgwNl8wMF8wMF8wMCwgJ01TR19JTicsIDB4MDdfMDBfMDBfMDAKKyk7CisKKyMgWFhYIC0gcmVwbGFjZSByZWZlcmVuY2VzIHRvIHRoZSAqXzgxMCBjb25zdGFudHMgd2l0aCBnZW5lcmFsIGNvbnN0YW50cworIyBhc3NpZ25lZCBhdCBjb21waWxlIHRpbWUgYmFzZWQgb24gY2hpcCB0eXBlLgorCisjIFRhYmxlIG9mIG9wZXJhdG9yIGVuY29kaW5ncworIyBYWFggLSBOQ1I1M2M3MTAgb25seSBpbXBsZW1lbnRzIAorIyAJbW92ZSAobm9wKSA9IDB4MDBfMDBfMDBfMDAKKyMJb3IgPSAweDAyXzAwXzAwXzAwCisjIAlhbmQgPSAweDA0XzAwXzAwXzAwCisjIAlhZGQgPSAweDA2XzAwXzAwXzAwCisKK2lmICgkbmNyN3gwX2ZhbWlseSkgeworICAlb3BlcmF0b3JzID0gKAorICAgICd8JywgMHgwMl8wMF8wMF8wMCwgJ09SJywgMHgwMl8wMF8wMF8wMCwKKyAgICAnJicsIDB4MDRfMDBfMDBfMDAsICdBTkQnLCAweDA0XzAwXzAwXzAwLAorICAgICcrJywgMHgwNl8wMF8wMF8wMAorICApOworfQorZWxzZSB7CisgICVvcGVyYXRvcnMgPSAoCisgICAgJ1NITCcsICAweDAxXzAwXzAwXzAwLCAKKyAgICAnfCcsIDB4MDJfMDBfMDBfMDAsICdPUicsIDB4MDJfMDBfMDBfMDAsIAorICAgICdYT1InLCAweDAzXzAwXzAwXzAwLCAKKyAgICAnJicsIDB4MDRfMDBfMDBfMDAsICdBTkQnLCAweDA0XzAwXzAwXzAwLCAKKyAgICAnU0hSJywgMHgwNV8wMF8wMF8wMCwgCisgICAgIyBOb3RlIDogbG93IGJpdCBvZiB0aGUgb3BlcmF0b3IgYml0IHNob3VsZCBiZSBzZXQgZm9yIGFkZCB3aXRoIAorICAgICMgY2FycnkuCisgICAgJysnLCAweDA2XzAwXzAwXzAwIAorICApOworfQorCisjIFRhYmxlIG9mIHJlZ2lzdGVyIGFkZHJlc3NlcworCitpZiAoJG5jcjd4MF9mYW1pbHkpIHsKKyAgJXJlZ2lzdGVycyA9ICgKKyAgICAnU0NOVEwwJywgMCwgJ1NDTlRMMScsIDEsICdTRElEJywgMiwgJ1NJRU4nLCAzLAorICAgICdTQ0lEJywgNCwgJ1NYRkVSJywgNSwgJ1NPREwnLCA2LCAnU09DTCcsIDcsCisgICAgJ1NGQlInLCA4LCAnU0lETCcsIDksICdTQkRMJywgMTAsICdTQkNMJywgMTEsCisgICAgJ0RTVEFUJywgMTIsICdTU1RBVDAnLCAxMywgJ1NTVEFUMScsIDE0LCAnU1NUQVQyJywgMTUsCisgICAgJ0RTQTAnLCAxNiwgJ0RTQTEnLCAxNywgJ0RTQTInLCAxOCwgJ0RTQTMnLCAxOSwKKyAgICAnQ1RFU1QwJywgMjAsICdDVEVTVDEnLCAyMSwgJ0NURVNUMicsIDIyLCAnQ1RFU1QzJywgMjMsCisgICAgJ0NURVNUNCcsIDI0LCAnQ1RFU1Q1JywgMjUsICdDVEVTVDYnLCAyNiwgJ0NURVNUNycsIDI3LAorICAgICdURU1QMCcsIDI4LCAnVEVNUDEnLCAyOSwgJ1RFTVAyJywgMzAsICdURU1QMycsIDMxLAorICAgICdERklGTycsIDMyLCAnSVNUQVQnLCAzMywgJ0NURVNUOCcsIDM0LCAnTENSQycsIDM1LAorICAgICdEQkMwJywgMzYsICdEQkMxJywgMzcsICdEQkMyJywgMzgsICdEQ01EJywgMzksCisgICAgJ0ROQUQwJywgNDAsICdETkFEMScsIDQxLCAnRE5BRDInLCA0MiwgJ0ROQUQzJywgNDMsCisgICAgJ0RTUDAnLCA0NCwgJ0RTUDEnLCA0NSwgJ0RTUDInLCA0NiwgJ0RTUDMnLCA0NywKKyAgICAnRFNQUzAnLCA0OCwgJ0RTUFMxJywgNDksICdEU1BTMicsIDUwLCAnRFNQUzMnLCA1MSwKKyAgICAnU0NSQVRDSDAnLCA1MiwgJ1NDUkFUQ0gxJywgNTMsICdTQ1JBVENIMicsIDU0LCAnU0NSQVRDSDMnLCA1NSwKKyAgICAnRE1PREUnLCA1NiwgJ0RJRU4nLCA1NywgJ0RXVCcsIDU4LCAnRENOVEwnLCA1OSwKKyAgICAnQURERVIwJywgNjAsICdBRERFUjEnLCA2MSwgJ0FEREVSMicsIDYyLCAnQURERVIzJywgNjMsCisgICk7Cit9CitlbHNlIHsKKyAgJXJlZ2lzdGVycyA9ICgKKyAgICAnU0NOVEwwJywgMCwgJ1NDTlRMMScsIDEsICdTQ05UTDInLCAyLCAnU0NOVEwzJywgMywKKyAgICAnU0NJRCcsIDQsICdTWEZFUicsIDUsICdTRElEJywgNiwgJ0dQUkVHJywgNywKKyAgICAnU0ZCUicsIDgsICdTT0NMJywgOSwgJ1NTSUQnLCAxMCwgJ1NCQ0wnLCAxMSwKKyAgICAnRFNUQVQnLCAxMiwgJ1NTVEFUMCcsIDEzLCAnU1NUQVQxJywgMTQsICdTU1RBVDInLCAxNSwKKyAgICAnRFNBMCcsIDE2LCAnRFNBMScsIDE3LCAnRFNBMicsIDE4LCAnRFNBMycsIDE5LAorICAgICdJU1RBVCcsIDIwLAorICAgICdDVEVTVDAnLCAyNCwgJ0NURVNUMScsIDI1LCAnQ1RFU1QyJywgMjYsICdDVEVTVDMnLCAyNywKKyAgICAnVEVNUDAnLCAyOCwgJ1RFTVAxJywgMjksICdURU1QMicsIDMwLCAnVEVNUDMnLCAzMSwKKyAgICAnREZJRk8nLCAzMiwgJ0NURVNUNCcsIDMzLCAnQ1RFU1Q1JywgMzQsICdDVEVTVDYnLCAzNSwKKyAgICAnREJDMCcsIDM2LCAnREJDMScsIDM3LCAnREJDMicsIDM4LCAnRENNRCcsIDM5LAorICAgICdETkFEMCcsIDQwLCAnRE5BRDEnLCA0MSwgJ0ROQUQyJywgNDIsICdETkFEMycsIDQzLAorICAgICdEU1AwJywgNDQsICdEU1AxJywgNDUsICdEU1AyJywgNDYsICdEU1AzJywgNDcsCisgICAgJ0RTUFMwJywgNDgsICdEU1BTMScsIDQ5LCAnRFNQUzInLCA1MCwgJ0RTUFMzJywgNTEsCisgICAgJ1NDUkFUQ0gwJywgNTIsICdTQ1JBVENIMScsIDUzLCAnU0NSQVRDSDInLCA1NCwgJ1NDUkFUQ0gzJywgNTUsCisgICAgJ1NDUkFUQ0hBMCcsIDUyLCAnU0NSQVRDSEExJywgNTMsICdTQ1JBVENIQTInLCA1NCwgJ1NDUkFUQ0hBMycsIDU1LAorICAgICdETU9ERScsIDU2LCAnRElFTicsIDU3LCAnRFdUJywgNTgsICdEQ05UTCcsIDU5LAorICAgICdBRERFUjAnLCA2MCwgJ0FEREVSMScsIDYxLCAnQURERVIyJywgNjIsICdBRERFUjMnLCA2MywKKyAgICAnU0lFTjAnLCA2NCwgJ1NJRU4xJywgNjUsICdTSVNUMCcsIDY2LCAnU0lTVDEnLCA2NywKKyAgICAnU0xQQVInLCA2OCwgCSAgICAgICdNQUNOVEwnLCA3MCwgJ0dQQ05UTCcsIDcxLAorICAgICdTVElNRTAnLCA3MiwgJ1NUSU1FMScsIDczLCAnUkVTUElEJywgNzQsIAorICAgICdTVEVTVDAnLCA3NiwgJ1NURVNUMScsIDc3LCAnU1RFU1QyJywgNzgsICdTVEVTVDMnLCA3OSwKKyAgICAnU0lETCcsIDgwLAorICAgICdTT0RMJywgODQsCisgICAgJ1NCREwnLCA4OCwKKyAgICAnU0NSQVRDSEIwJywgOTIsICdTQ1JBVENIQjEnLCA5MywgJ1NDUkFUQ0hCMicsIDk0LCAnU0NSQVRDSEIzJywgOTUKKyAgKTsKK30KKworIyBQYXJzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyRpZGVudGlmaWVyID0gJ1tBLVphLXpfXVtBLVphLXpfMC05XSonOwkJCiskZGVjbnVtID0gJy0/XFxkKyc7CiskaGV4bnVtID0gJzBbeFhdWzAtOUEtRmEtZl0rJzsJCQorJGNvbnN0YW50ID0gIiRoZXhudW18JGRlY251bSI7CisKKyMgeXVja3kgLSBzaW5jZSB3ZSBjYW4ndCBjb250cm9sIGdyb3VwaW5nIG9mICMgJGNvbnN0YW50LCB3ZSBuZWVkIHRvIAorIyBleHBhbmQgb3V0IGVhY2ggYWx0ZXJuYXRpdmUgZm9yICR2YWx1ZS4KKworJHZhbHVlID0gIiRpZGVudGlmaWVyfCRpZGVudGlmaWVyXFxzKlsrXC1dXFxzKiRkZWNudW18Ii4KKyAgICAiJGlkZW50aWZpZXJcXHMqWystXVxzKiRoZXhudW18JGNvbnN0YW50IjsKKworcHJpbnQgU1RERVJSICJ2YWx1ZSByZWdleCA9ICR2YWx1ZVxuIiBpZiAoJGRlYnVnKTsKKworJHBoYXNlID0gam9pbiAoJ3wnLCBrZXlzICVzY3NpX3BoYXNlcyk7CitwcmludCBTVERFUlIgInBoYXNlIHJlZ2V4ID0gJHBoYXNlXG4iIGlmICgkZGVidWcpOworJHJlZ2lzdGVyID0gam9pbiAoJ3wnLCBrZXlzICVyZWdpc3RlcnMpOworCisjIHl1Y2t5IC0gc2luY2UgJW9wZXJhdG9ycyBpbmNsdWRlcyBtZXRhLWNoYXJhY3RlcnMgd2hpY2ggbXVzdAorIyBiZSBlc2NhcGVkLCBJIGNhbid0IHVzZSB0aGUgam9pbigpIHRyaWNrIEkgdXNlZCBmb3IgdGhlIHJlZ2lzdGVyCisjIHJlZ2V4CisKK2lmICgkbmNyN3gwX2ZhbWlseSkgeworICAkb3BlcmF0b3IgPSAnXHx8T1J8QU5EfFwmfFwrJzsKK30KK2Vsc2UgeworICAkb3BlcmF0b3IgPSAnXHx8T1J8QU5EfFhPUnxcJnxcKyc7Cit9CisKKyMgR2xvYmFsIHZhcmlhYmxlcworCislc3ltYm9sX3ZhbHVlcyA9ICglcmVnaXN0ZXJzKSA7CQkjIFRyYWRpdGlvbmFsIHN5bWJvbCB0YWJsZQorCislc3ltYm9sX3JlZmVyZW5jZXMgPSAoKSA7CQkjIFRhYmxlIG9mIHN5bWJvbCByZWZlcmVuY2VzLCB3aGVyZQorCQkJCQkjIHRoZSBpbmRleCBpcyB0aGUgc3ltYm9sIG5hbWUsIAorCQkJCQkjIGFuZCB0aGUgY29udGVudHMgYSB3aGl0ZSBzcGFjZSAKKwkJCQkJIyBkZWxpbWl0ZWQgbGlzdCBvZiBhZGRyZXNzLHNpemUKKwkJCQkJIyB0dXBsZXMgd2hlcmUgc2l6ZSBpcyBpbiBieXRlcy4KKworQGNvZGUgPSAoKTsJCQkJIyBBcnJheSBvZiAzMiBiaXQgd29yZHMgZm9yIFNJT1AgCisKK0BlbnRyeSA9ICgpOwkJCQkjIEFycmF5IG9mIGVudHJ5IHBvaW50IG5hbWVzCisKK0BsYWJlbCA9ICgpOwkJCQkjIEFycmF5IG9mIGxhYmVsIG5hbWVzCisKK0BhYnNvbHV0ZSA9ICgpOwkJCQkjIEFycmF5IG9mIGFic29sdXRlIG5hbWVzCisKK0ByZWxhdGl2ZSA9ICgpOwkJCQkjIEFycmF5IG9mIHJlbGF0aXZlIG5hbWVzCisKK0BleHRlcm5hbCA9ICgpOwkJCQkjIEFycmF5IG9mIGV4dGVybmFsIG5hbWVzCisKKyRhZGRyZXNzID0gMDsJCQkJIyBBZGRyZXNzIG9mIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KKworJGxpbmVubyA9IDA7CQkJCSMgTGluZSBudW1iZXIgd2UgYXJlIHBhcnNpbmcKKworJG91dHB1dCA9ICdzY3JpcHQuaCc7CQkJIyBPdXRwdXQgZmlsZQorJG91dHB1dHUgPSAnc2NyaXB0dS5oJzsKKworIyAmcGF0Y2ggKCRhZGRyZXNzLCAkb2Zmc2V0LCAkbGVuZ3RoLCAkdmFsdWUpIHBhdGNoZXMgJGNvZGVbJGFkZHJlc3NdCisjIAlzbyB0aGF0IHRoZSAkbGVuZ3RoIGJ5dGVzIGF0ICRvZmZzZXQgaGF2ZSAkdmFsdWUgYWRkZWQgdG8KKyMgCXRoZW0uICAKKworQGludmVydGVkX21hc2tzID0gKDB4MDBfMDBfMDBfMDAsIDB4MDBfMDBfMDBfZmYsIDB4MDBfMDBfZmZfZmYsIDB4MDBfZmZfZmZfZmYsIAorICAgIDB4ZmZfZmZfZmZfZmYpOworCitzdWIgcGF0Y2ggeworICAgIGxvY2FsICgkYWRkcmVzcywgJG9mZnNldCwgJGxlbmd0aCwgJHZhbHVlKSA9IEBfOworICAgIGlmICgkZGVidWcpIHsKKwlwcmludCBTVERFUlIgIlBhdGNoaW5nICRhZGRyZXNzIGF0IG9mZnNldCAkb2Zmc2V0LCBsZW5ndGggJGxlbmd0aCB0byAkdmFsdWVcbiI7CisJcHJpbnRmIFNUREVSUiAiT2xkIGNvZGUgOiAlMDh4XG4iLCAkY29kZVskYWRkcmVzc107CisgICAgIH0KKworICAgICRtYXNrID0gKCRpbnZlcnRlZF9tYXNrc1skbGVuZ3RoXSA8PCAoJG9mZnNldCAqIDgpKTsKKyAgIAorICAgICRjb2RlWyRhZGRyZXNzXSA9ICgkY29kZVskYWRkcmVzc10gJiB+JG1hc2spIHwgCisJKCgkY29kZVskYWRkcmVzc10gJiAkbWFzaykgKyAoJHZhbHVlIDw8ICgkb2Zmc2V0ICogOCkpICYgCisJJG1hc2spOworICAgIAorICAgIHByaW50ZiBTVERFUlIgIk5ldyBjb2RlIDogJTA4eFxuIiwgJGNvZGVbJGFkZHJlc3NdIGlmICgkZGVidWcpOworfQorCisjICZwYXJzZV92YWx1ZSgkdmFsdWUsICR3b3JkLCAkb2Zmc2V0LCAkbGVuZ3RoKSB3aGVyZSAkdmFsdWUgaXMgCisjIAlhbiBpZGVudGlmaWVyIG9yIGNvbnN0YW50LCAkd29yZCBpcyB0aGUgd29yZCBvZmZzZXQgcmVsYXRpdmUgdG8gCisjCSRhZGRyZXNzLCAkb2Zmc2V0IGlzIHRoZSBzdGFydGluZyBieXRlIHdpdGhpbiB0aGF0IHdvcmQsIGFuZCAKKyMJJGxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbiBieXRlcy4KKyMKKyMgU2lkZSBlZmZlY3RzIGFyZSB0aGF0IHRoZSBieXRlcyBhcmUgY29tYmluZWQgaW50byB0aGUgQGNvZGUgYXJyYXkKKyMJcmVsYXRpdmUgdG8gJGFkZHJlc3MsIGFuZCB0aGF0IHRoZSAlc3ltYm9sX3JlZmVyZW5jZXMgdGFibGUgaXMgCisjIAl1cGRhdGVkIGFzIGFwcHJvcHJpYXRlLgorCitzdWIgcGFyc2VfdmFsdWUgeworICAgIGxvY2FsICgkdmFsdWUsICR3b3JkLCAkb2Zmc2V0LCAkbGVuZ3RoKSA9IEBfOworICAgIGxvY2FsICgkdG1wKTsKKworICAgICRzeW1ib2wgPSAnJzsKKworICAgIGlmICgkdmFsdWUgPX4gL15SRUxccypcKFxzKigkaWRlbnRpZmllcilccypcKVxzKiguKikvaSkgeworCSRyZWxhdGl2ZSA9ICdSRUwnOworCSRzeW1ib2wgPSAkMTsKKwkkdmFsdWUgPSAkMjsKK3ByaW50IFNUREVSUiAiUmVsYXRpdmUgcmVmZXJlbmNlICRzeW1ib2xcbiIgaWYgKCRkZWJ1Zyk7CisgICAgfSBlbHNpZiAoJHZhbHVlID1+IC9eKCRpZGVudGlmaWVyKVxzKiguKikvKSB7CisJJHJlbGF0aXZlID0gJ0FCUyc7CisJJHN5bWJvbCA9ICQxOworCSR2YWx1ZSA9ICQyOworcHJpbnQgU1RERVJSICJBYnNvbHV0ZSByZWZlcmVuY2UgJHN5bWJvbFxuIiBpZiAoJGRlYnVnKTsKKyAgICB9IAorCisgICAgaWYgKCRzeW1ib2wgbmUgJycpIHsKK3ByaW50IFNUREVSUiAiUmVmZXJlbmNpbmcgc3ltYm9sICQxLCBsZW5ndGggPSAkbGVuZ3RoIGluICRfXG4iIGlmICgkZGVidWcpOworICAgICAJJHRtcCA9ICgkYWRkcmVzcyArICR3b3JkKSAqIDQgKyAkb2Zmc2V0OworCWlmICgkc3ltYm9sX3JlZmVyZW5jZXN7JHN5bWJvbH0gbmUgdW5kZWYpIHsKKwkgICAgJHN5bWJvbF9yZWZlcmVuY2VzeyRzeW1ib2x9ID0gCisJCSIkc3ltYm9sX3JlZmVyZW5jZXN7JHN5bWJvbH0gJHJlbGF0aXZlLCR0bXAsJGxlbmd0aCI7CisJfSBlbHNlIHsKKwkgICAgaWYgKCFkZWZpbmVkKCRzeW1ib2xfdmFsdWVzeyRzeW1ib2x9KSkgeworcHJpbnQgU1RERVJSICJmb3J3YXJkICQxXG4iIGlmICgkZGVidWdfZXh0ZXJuYWwpOworCQkkZm9yd2FyZHskc3ltYm9sfSA9ICJsaW5lICRsaW5lbm8gOiAkXyI7CisJICAgIH0gCisJICAgICRzeW1ib2xfcmVmZXJlbmNlc3skc3ltYm9sfSA9ICIkcmVsYXRpdmUsJHRtcCwkbGVuZ3RoIjsKKwl9CisgICAgfSAKKworICAgICR2YWx1ZSA9IGV2YWwgJHZhbHVlOworICAgICZwYXRjaCAoJGFkZHJlc3MgKyAkd29yZCwgJG9mZnNldCwgJGxlbmd0aCwgJHZhbHVlKTsKK30KKworIyAmcGFyc2VfY29uZGl0aW9uYWwgKCRjb25kaXRpb25hbCkgd2hlcmUgJGNvbmRpdGlvbmFsIGlzIHRoZSBjb25kaXRpb25hbAorIyBjbGF1c2UgZnJvbSBhIHRyYW5zZmVyIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gKFJFVFVSTiwgQ0FMTCwgSlVNUCwgSU5UKS4KKworc3ViIHBhcnNlX2NvbmRpdGlvbmFsIHsKKyAgICBsb2NhbCAoJGNvbmRpdGlvbmFsKSA9IEBfOworICAgIGlmICgkY29uZGl0aW9uYWwgPX4gL15ccyooSUZ8V0hFTilccyooLiopL2kpIHsKKwkkaWYgPSAkMTsKKwkkY29uZGl0aW9uYWwgPSAkMjsKKwlpZiAoJGlmID1+IC9XSEVOL2kpIHsKKwkgICAgJGFsbG93X2F0biA9IDA7CisJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzAxXzAwXzAwOworCSAgICAkYWxsb3dfYXRuID0gMDsKKwkgICAgcHJpbnQgU1RERVJSICIkMCA6IHBhcnNlZCBXSEVOXG4iIGlmICgkZGVidWcpOworCX0gZWxzZSB7CisJICAgICRhbGxvd19hdG4gPSAxOworCSAgICBwcmludCBTVERFUlIgIiQwIDogcGFyc2VkIElGXG4iIGlmICgkZGVidWcpOworCX0KKyAgICB9IGVsc2UgeworCSAgICBkaWUgIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgSUYgb3IgV0hFTgorIjsKKyAgICB9CisKKyAgICBpZiAoJGNvbmRpdGlvbmFsID1+IC9eTk9UXHMrKC4qKSQvaSkgeworCSRub3QgPSAnTk9UICc7CisJJG90aGVyID0gJ09SJzsKKwkkY29uZGl0aW9uYWwgPSAkMTsKKwlwcmludCBTVERFUlIgIiQwIDogcGFyc2VkIE5PVFxuIiBpZiAoJGRlYnVnKTsKKyAgICB9IGVsc2UgeworCSRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzA4XzAwXzAwOworCSRub3QgPSAnJzsKKwkkb3RoZXIgPSAnQU5EJworICAgIH0KKworICAgICRuZWVkX2RhdGEgPSAwOworICAgIGlmICgkY29uZGl0aW9uYWwgPX4gL15BVE5ccyooLiopL2kpIHsjCisJZGllICIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCVdIRU4gY29uZGl0aW9uYWwgaXMgaW5jb21wYXRpYmxlIHdpdGggQVROIAorIiBpZiAoISRhbGxvd19hdG4pOworCSRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzAyXzAwXzAwOworCSRjb25kaXRpb25hbCA9ICQxOworCXByaW50IFNUREVSUiAiJDAgOiBwYXJzZWQgQVROXG4iIGlmICgkZGVidWcpOworICAgIH0gZWxzaWYgKCRjb25kaXRpb25hbCA9fiAvXigkcGhhc2UpXHMqKC4qKS9pKSB7CisJJHBoYXNlX2luZGV4ID0gIlxVJDFcRSI7CisJJHAgPSAkc2NzaV9waGFzZXN7JHBoYXNlX2luZGV4fTsKKwkkY29kZVskYWRkcmVzc10gfD0gJHAgfCAweDAwXzAyXzAwXzAwOworCSRjb25kaXRpb25hbCA9ICQyOworCXByaW50IFNUREVSUiAiJDAgOiBwYXJzZWQgcGhhc2UgJHBoYXNlX2luZGV4XG4iIGlmICgkZGVidWcpOworICAgIH0gZWxzZSB7CisJJG90aGVyID0gJyc7CisJJG5lZWRfZGF0YSA9IDE7CisgICAgfQorCitwcmludCBTVERFUlIgIlBhcnNpbmcgY29uanVuY3Rpb24sIGV4cGVjdGluZyAkb3RoZXJcbiIgaWYgKCRkZWJ1Zyk7CisgICAgaWYgKCRjb25kaXRpb25hbCA9fiAvXihBTkR8T1IpXHMqKC4qKS9pKSB7CisJJGNvbmp1bmN0aW9uID0gJDE7CisJJGNvbmRpdGlvbmFsID0gJDI7CisJJG5lZWRfZGF0YSA9IDE7CisJZGllICIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCSAgICBJbGxlZ2FsIHVzZSBvZiAkMS4gIFZhbGlkIHVzZXMgYXJlIAorCSAgICAiLiRub3QuIjxwaGFzZT4gJDEgZGF0YQorCSAgICAiLiRub3QuIkFUTiAkMSBkYXRhCisiIGlmICgkb3RoZXIgZXEgJycpOworCWRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlJbGxlZ2FsIHVzZSBvZiAkY29uanVuY3Rpb24uICBWYWxpZCBzeW50YXhlcyBhcmUgCisJCU5PVCA8cGhhc2U+fEFUTiBPUiBkYXRhCisJCTxwaGFzZT58QVROIEFORCBkYXRhCisiIGlmICgkY29uanVuY3Rpb24gIX4gL1xzKiRvdGhlclxzKi9pKTsKKwlwcmludCBTVERFUlIgIiQwIDogcGFyc2VkICQxXG4iIGlmICgkZGVidWcpOworICAgIH0KKworICAgIGlmICgkbmVlZF9kYXRhKSB7CitwcmludCBTVERFUlIgImxvb2tpbmcgZm9yIGRhdGEgaW4gJGNvbmRpdGlvbmFsXG4iIGlmICgkZGVidWcpOworCWlmICgkY29uZGl0aW9uYWw9fiAvXigkdmFsdWUpXHMqKC4qKS9pKSB7CisJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzA0XzAwXzAwOworCSAgICAkY29uZGl0aW9uYWwgPSAkMjsKKwkgICAgJnBhcnNlX3ZhbHVlKCQxLCAwLCAwLCAxKTsKKwkgICAgcHJpbnQgU1RERVJSICIkMCA6IHBhcnNlZCBkYXRhXG4iIGlmICgkZGVidWcpOworCX0gZWxzZSB7CisJZGllICIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIDxkYXRhPi4KKyI7CisJfQorICAgIH0KKworICAgIGlmICgkY29uZGl0aW9uYWwgPX4gL15ccyosXHMqKC4qKS8pIHsKKwkkY29uZGl0aW9uYWwgPSAkMTsKKwlpZiAoJGNvbmRpdGlvbmFsID1+IC9eQU5EXHNccypNQVNLXHNccyooJHZhbHVlKVxzKiguKikvaSkgeworCSAgICAmcGFyc2VfdmFsdWUgKCQxLCAwLCAxLCAxKTsKKwkgICAgcHJpbnQgU1RERVJSICIkMCBwYXJzZWQgQU5EIE1BU0sgJDFcbiIgaWYgKCRkZWJ1Zyk7CisJICAgIGRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCBlbmQgb2YgbGluZSwgbm90IFwiJDJcIgorIiBpZiAoJDIgbmUgJycpOworCX0gZWxzZSB7CisJICAgIGRpZSAiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCBcIixBTkQgTUFTSyA8ZGF0YT5cIiwgbm90IFwiJDJcIgorIjsKKwl9CisgICAgfSBlbHNpZiAoJGNvbmRpdGlvbmFsICF+IC9eXHMqJC8pIHsgCisJZGllICIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIGVuZCBvZiBsaW5lIiAuICgoJG5lZWRfZGF0YSkgPyAiIG9yIFwiQU5EIE1BU0sgPGRhdGE+XCIiIDogIiIpIC4gIgorCW5vdCBcIiRjb25kaXRpb25hbFwiCisiOworICAgIH0KK30KKworIyBQYXJzZSBjb21tYW5kIGxpbmUKKyRvdXRwdXQgPSBzaGlmdDsKKyRvdXRwdXR1ID0gc2hpZnQ7CisKKyAgICAKKyMgTWFpbiBsb29wCit3aGlsZSAoPFNURElOPikgeworICAgICRsaW5lbm8gPSAkbGluZW5vICsgMTsKKyAgICAkbGlzdFskYWRkcmVzc10gPSAkbGlzdFskYWRkcmVzc10uJF87CisgICAgcy87LiokLy87CQkJCSMgU3RyaXAgY29tbWVudHMKKworCisgICAgY2hvcDsJCQkJIyBMZWF2ZSBuZXcgbGluZSBvdXQgb2YgZXJyb3IgbWVzc2FnZXMKKworIyBIYW5kbGUgc3ltYm9sIGRlZmluaXRpb25zIG9mIHRoZSBmb3JtIGxhYmVsOgorICAgIGlmICgvXlxzKigkaWRlbnRpZmllcilccyo6KC4qKS8pIHsKKwlpZiAoIWRlZmluZWQoJHN5bWJvbF92YWx1ZXN7JDF9KSkgeworCSAgICAkc3ltYm9sX3ZhbHVlc3skMX0gPSAkYWRkcmVzcyAqIDQ7CSMgQWRkcmVzcyBpcyBhbiBpbmRleCBpbnRvCisJICAgIGRlbGV0ZSAkZm9yd2FyZHskMX07CQkjIGFuIGFycmF5IG9mIGxvbmdzCisJICAgIHB1c2ggKEBsYWJlbCwgJDEpOworCSAgICAkXyA9ICQyOworCX0gZWxzZSB7CisJICAgIGRpZSAiJDAgOiByZWRlZmluaXRpb24gb2Ygc3ltYm9sICQxIGluIGxpbmUgJGxpbmVubyA6ICRfXG4iOworCX0KKyAgICB9CisKKyMgSGFuZGxlIHN5bWJvbCBkZWZpbml0aW9ucyBvZiB0aGUgZm9ybSBBQlNPTFVURSBvciBSRUxBVElWRSBpZGVudGlmaWVyID0gCisjIHZhbHVlCisgICAgaWYgKC9eXHMqKEFCU09MVVRFfFJFTEFUSVZFKVxzKyguKikvaSkgeworCSRpc19hYnNvbHV0ZSA9ICQxOworCSRyZXN0ID0gJDI7CisJZm9yZWFjaCAkcmVzdCAoc3BsaXQgKC9ccyosXHMqLywgJHJlc3QpKSB7CisJICAgIGlmICgkcmVzdCA9fiAvXigkaWRlbnRpZmllcilccyo9XHMqKCRjb25zdGFudClccyokLykgeworCSAgICAgICAgbG9jYWwgKCRpZCwgJGNuc3QpID0gKCQxLCAkMik7CisJCWlmICgkc3ltYm9sX3ZhbHVlc3skaWR9IGVxIHVuZGVmKSB7CisJCSAgICAkc3ltYm9sX3ZhbHVlc3skaWR9ID0gZXZhbCAkY25zdDsKKwkJICAgIGRlbGV0ZSAkZm9yd2FyZHskaWR9OworCQkgICAgaWYgKCRpc19hYnNvbHV0ZSA9fiAvQUJTT0xVVEUvaSkgeworCQkJcHVzaCAoQGFic29sdXRlICwgJGlkKTsKKwkJICAgIH0gZWxzZSB7CisJCQlwdXNoIChAcmVsYXRpdmUsICRpZCk7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBkaWUgIiQwIDogcmVkZWZpbml0aW9uIG9mIHN5bWJvbCAkaWQgaW4gbGluZSAkbGluZW5vIDogJF9cbiI7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJZGllIAorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJICAgIGV4cGVjdGVkIDxpZGVudGlmaWVyPiA9IDx2YWx1ZT4KKyI7CisJICAgIH0KKwl9CisgICAgfSBlbHNpZiAoL15ccypFWFRFUk5BTFxzKyguKikvaSkgeworCSRleHRlcm5hbHMgPSAkMTsKKwlmb3JlYWNoICRleHRlcm5hbCAoc3BsaXQgKC8sLywkZXh0ZXJuYWxzKSkgeworCSAgICBpZiAoJGV4dGVybmFsID1+IC9ccyooJGlkZW50aWZpZXIpXHMqJC8pIHsKKwkJJGV4dGVybmFsID0gJDE7CisJCXB1c2ggKEBleHRlcm5hbCwgJGV4dGVybmFsKTsKKwkJZGVsZXRlICRmb3J3YXJkeyRleHRlcm5hbH07CisJCWlmIChkZWZpbmVkKCRzeW1ib2xfdmFsdWVzeyRleHRlcm5hbH0pKSB7CisJCQlkaWUgIiQwIDogcmVkZWZpbml0aW9uIG9mIHN5bWJvbCAkMSBpbiBsaW5lICRsaW5lbm8gOiAkX1xuIjsKKwkJfQorCQkkc3ltYm9sX3ZhbHVlc3skZXh0ZXJuYWx9ID0gJGV4dGVybmFsOworcHJpbnQgU1RERVJSICJkZWZpbmVkIGV4dGVybmFsICQxIHRvICRleHRlcm5hbFxuIiBpZiAoJGRlYnVnX2V4dGVybmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJZGllIAorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgPGlkZW50aWZpZXI+LCBnb3QgJGV4dGVybmFsCisiOworCSAgICB9CisJfQorIyBQcm9jZXNzIEVOVFJZIGlkZW50aWZpZXIgZGVjbGFyYXRpb25zCisgICAgfSBlbHNpZiAoL15ccypFTlRSWVxzKyguKikvaSkgeworCWlmICgkMSA9fiAvXigkaWRlbnRpZmllcilccyokLykgeworCSAgICBwdXNoIChAZW50cnksICQxKTsKKwl9IGVsc2UgeworCSAgICBkaWUKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIEVOVFJZIDxpZGVudGlmaWVyPgorIjsKKwl9CisjIFByb2Nlc3MgTU9WRSBsZW5ndGgsIGFkZHJlc3MsIFdJVEh8V0hFTiBwaGFzZSBpbnN0cnVjdGlvbgorICAgIH0gZWxzaWYgKC9eXHMqTU9WRVxzKyguKikvaSkgeworCSRyZXN0ID0gJDE7CisJaWYgKCRyZXN0ID1+IC9eRlJPTVxzKygkdmFsdWUpXHMqLFxzKihXSVRIfFdIRU4pXHMrKCRwaGFzZSlccyokL2kpIHsKKwkgICAgJHRyYW5zZmVyX2FkZHIgPSAkMTsKKwkgICAgJHdpdGhfd2hlbiA9ICQyOworCSAgICAkc2NzaV9waGFzZSA9ICQzOworcHJpbnQgU1RERVJSICJQYXJzaW5nIE1PVkUgRlJPTSAkdHJhbnNmZXJfYWRkciwgJHdpdGhfd2hlbiAkM1xuIiBpZiAoJGRlYnVnKTsKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gMHgxOF8wMF8wMF8wMCB8ICgoJHdpdGhfd2hlbiA9fiAvV0lUSC9pKSA/IAorCQkweDAwXzAwXzAwXzAwIDogMHgwOF8wMF8wMF8wMCkgfCAkc2NzaV9waGFzZXN7JHNjc2lfcGhhc2V9OworCSAgICAmcGFyc2VfdmFsdWUgKCR0cmFuc2Zlcl9hZGRyLCAxLCAwLCA0KTsKKwkgICAgJGFkZHJlc3MgKz0gMjsKKwl9IGVsc2lmICgkcmVzdCA9fiAvXigkdmFsdWUpXHMqLFxzKihQVFJccyt8KSgkdmFsdWUpXHMqLFxzKihXSVRIfFdIRU4pXHMrKCRwaGFzZSlccyokL2kpIHsKKwkgICAgJHRyYW5zZmVyX2xlbiA9ICQxOworCSAgICAkcHRyID0gJDI7CisJICAgICR0cmFuc2Zlcl9hZGRyID0gJDM7CisJICAgICR3aXRoX3doZW4gPSAkNDsKKwkgICAgJHNjc2lfcGhhc2UgPSAkNTsKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gKCgkd2l0aF93aGVuID1+IC9XSVRIL2kpID8gMHgwMF8wMF8wMF8wMCA6IAorCQkweDA4XzAwXzAwXzAwKSAgfCAoKCRwdHIgPX4gL1BUUi9pKSA/ICgxIDw8IDI5KSA6IDApIHwgCisJCSRzY3NpX3BoYXNlc3skc2NzaV9waGFzZX07CisJICAgICZwYXJzZV92YWx1ZSAoJHRyYW5zZmVyX2xlbiwgMCwgMCwgMyk7CisJICAgICZwYXJzZV92YWx1ZSAoJHRyYW5zZmVyX2FkZHIsIDEsIDAsIDQpOworCSAgICAkYWRkcmVzcyArPSAyOworCX0gZWxzaWYgKCRyZXN0ID1+IC9eTUVNT1JZXHMrKC4qKS9pKSB7CisJICAgICRyZXN0ID0gJDE7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4YzBfMDBfMDBfMDA7IAorCSAgICBpZiAoJHJlc3QgPX4gL14oJHZhbHVlKVxzKixccyooJHZhbHVlKVxzKixccyooJHZhbHVlKVxzKiQvKSB7CisJCSRjb3VudCA9ICQxOworCQkkc291cmNlID0gJDI7CisJCSRkZXN0ID0gICQzOworcHJpbnQgU1RERVJSICJQYXJzaW5nIE1PVkUgTUVNT1JZICRjb3VudCwgJHNvdXJjZSwgJGRlc3RcbiIgaWYgKCRkZWJ1Zyk7CisJCSZwYXJzZV92YWx1ZSAoJGNvdW50LCAwLCAwLCAzKTsKKwkJJnBhcnNlX3ZhbHVlICgkc291cmNlLCAxLCAwLCA0KTsKKwkJJnBhcnNlX3ZhbHVlICgkZGVzdCwgMiwgMCwgNCk7CitwcmludGYgU1RERVJSICJNb3ZlIG1lbW9yeSBpbnN0cnVjdGlvbiA9ICUwOHgsJTA4eCwlMDh4XG4iLCAKKwkJJGNvZGVbJGFkZHJlc3NdLCAkY29kZVskYWRkcmVzcysxXSwgJGNvZGVbJGFkZHJlc3MgKzJdIGlmCisJCSgkZGVidWcpOworCQkkYWRkcmVzcyArPSAzOworCQorCSAgICB9IGVsc2UgeworCQlkaWUgCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCA8Y291bnQ+LCA8c291cmNlPiwgPGRlc3RpbmF0aW9uPgorIgorCSAgICB9CisJfSBlbHNpZiAoJDEgPX4gL14oLiopXHMrKFRPfFNITHxTSFIpXHMrKC4qKS9pKSB7CitwcmludCBTVERFUlIgIlBhcnNpbmcgcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgbW92ZVxuIiBpZiAoJGRlYnVnKTsKKwkgICAgJHNyYyA9ICQxOworCSAgICAkb3AgPSAiXFUkMlxFIjsKKwkgICAgJHJlc3QgPSAkMzsKKworCSAgICAkY29kZVskYWRkcmVzc10gPSAweDQwXzAwXzAwXzAwOworCQorCSAgICAkZm9yY2UgPSAoJG9wICF+IC9UTy9pKTsgCisKKworcHJpbnQgU1RERVJSICJGb3JjaW5nIHJlZ2lzdGVyIHNvdXJjZSBcbiIgaWYgKCRmb3JjZSAmJiAkZGVidWcpOworCisJICAgIGlmICghJGZvcmNlICYmICRzcmMgPX4gCisJCS9eKCRyZWdpc3RlcilccysoLXwkb3BlcmF0b3IpXHMrKCR2YWx1ZSlccyokL2kpIHsKK3ByaW50IFNUREVSUiAicmVnaXN0ZXIgb3BlcmFuZCAgZGF0YTggc291cmNlXG4iIGlmICgkZGVidWcpOworCQkkc3JjX3JlZyA9ICJcVSQxXEUiOworCQkkb3AgPSAiXFUkMlxFIjsKKwkJaWYgKCRvcCBuZSAnLScpIHsKKwkJICAgICRkYXRhOCA9ICQzOworCQl9IGVsc2UgeworCQkgICAgZGllICItIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4iCisJCX0KKwkgICAgfSBlbHNpZiAoJHNyYyA9fiAvXigkcmVnaXN0ZXIpXHMqJC9pKSB7CitwcmludCBTVERFUlIgInJlZ2lzdGVyIHNvdXJjZVxuIiBpZiAoJGRlYnVnKTsKKwkJJHNyY19yZWcgPSAiXFUkMVxFIjsKKwkJIyBFbmNvZGUgcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgbW92ZSBhcyBhIHJlZ2lzdGVyIHwgMCAKKwkJIyBtb3ZlIHRvIHJlZ2lzdGVyLgorCQlpZiAoISRmb3JjZSkgeworCQkgICAgJG9wID0gJ3wnOworCQl9CisJCSRkYXRhOCA9IDA7CisJICAgIH0gZWxzaWYgKCEkZm9yY2UgJiYgJHNyYyA9fiAvXigkdmFsdWUpXHMqJC9pKSB7CitwcmludCBTVERFUlIgImRhdGE4IHNvdXJjZVxuIiBpZiAoJGRlYnVnKTsKKwkJJHNyY19yZWcgPSB1bmRlZjsKKwkJJG9wID0gJ05PTkUnOworCQkkZGF0YTggPSAkMTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKCEkZm9yY2UpIHsKKwkJICAgIGRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIDxyZWdpc3Rlcj4KKwkJPGRhdGE4PgorCQk8cmVnaXN0ZXI+IDxvcGVyYW5kPiA8ZGF0YTg+CisiOworCQl9IGVsc2UgeworCQkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCA8cmVnaXN0ZXI+CisiOworCQl9CisJICAgIH0KKwkgICAgaWYgKCRyZXN0ID1+IC9eKCRyZWdpc3RlcilccyooLiopJC9pKSB7CisJCSRkc3RfcmVnID0gIlxVJDFcRSI7CisJCSRyZXN0ID0gJDI7CisJICAgIH0gZWxzZSB7CisJICAgIGRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiAkbGluZW5vIDogJF8KKwlleHBlY3RlZCA8cmVnaXN0ZXI+LCBnb3QgJHJlc3QKKyI7CisJICAgIH0KKworCSAgICBpZiAoJHJlc3QgPX4gL15XSVRIXHMrQ0FSUllccyooLiopL2kpIHsKKwkJJHJlc3QgPSAkMTsKKwkJaWYgKCRvcCBlcSAnKycpIHsKKwkJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAweDAxXzAwXzAwXzAwOworCQl9IGVsc2UgeworCQkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gJGxpbmVubyA6ICRfCisJV0lUSCBDQVJSWSBvcHRpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlICRvcCBvcGVyYXRvci4KKyI7CisJCX0KKwkgICAgfQorCisJICAgIGlmICgkcmVzdCAhfiAvXlxzKiQvKSB7CisJCWRpZQorIiQwIDogc3ludGF4IGVycm9yIGluICRsaW5lbm8gOiAkXworCUV4cGVjdGVkIGVuZCBvZiBsaW5lLCBnb3QgJHJlc3QKKyI7CisJICAgIH0KKworCSAgICBwcmludCBTVERFUlIgInNvdXJjZSA9ICRzcmNfcmVnLCBkYXRhID0gJGRhdGE4ICwgZGVzdGluYXRpb24gPSAkZHN0X3JlZ1xuIgorCQlpZiAoJGRlYnVnKTsKKwkgICAgIyBOb3RlIHRoYXQgTW92ZSBkYXRhOCB0byByZWcgaXMgZW5jb2RlZCBhcyBhIHJlYWQtbW9kaWZ5LXdyaXRlCisJICAgICMgaW5zdHJ1Y3Rpb24uCisJICAgIGlmICgoJHNyY19yZWcgZXEgdW5kZWYpIHx8ICgkc3JjX3JlZyBlcSAkZHN0X3JlZykpIHsKKwkJJGNvZGVbJGFkZHJlc3NdIHw9IDB4MzhfMDBfMDBfMDAgfCAKKwkJICAgICgkcmVnaXN0ZXJzeyRkc3RfcmVnfSA8PCAxNik7CisJICAgIH0gZWxzaWYgKCRkc3RfcmVnID1+IC9TRkJSL2kpIHsKKwkJJGNvZGVbJGFkZHJlc3NdIHw9IDB4MzBfMDBfMDBfMDAgfAorCQkgICAgKCRyZWdpc3RlcnN7JHNyY19yZWd9IDw8IDE2KTsKKwkgICAgfSBlbHNpZiAoJHNyY19yZWcgPX4gL1NGQlIvaSkgeworCQkkY29kZVskYWRkcmVzc10gfD0gMHgyOF8wMF8wMF8wMCB8CisJCSAgICAoJHJlZ2lzdGVyc3skZHN0X3JlZ30gPDwgMTYpOworCSAgICB9IGVsc2UgeworCQlkaWUKKyIkMCA6IElsbGVnYWwgY29tYmluYXRpb24gb2YgcmVnaXN0ZXJzIGluIGxpbmUgJGxpbmVubyA6ICRfCisJRWl0aGVyIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXJzIG11c3QgYmUgdGhlIHNhbWUsCisJb3IgZWl0aGVyIHNvdXJjZSBvciBkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIFNGQlIuCisiOworCSAgICB9CisKKwkgICAgJGNvZGVbJGFkZHJlc3NdIHw9ICRvcGVyYXRvcnN7JG9wfTsKKwkgICAgCisJICAgICZwYXJzZV92YWx1ZSAoJGRhdGE4LCAwLCAxLCAxKTsKKwkgICAgJGNvZGVbJGFkZHJlc3NdIHw9ICRvcGVyYXRvcnN7JG9wfTsKKwkgICAgJGNvZGVbJGFkZHJlc3MgKyAxXSA9IDB4MDBfMDBfMDBfMDA7IyBSZXNlcnZlZAorCSAgICAkYWRkcmVzcyArPSAyOworCX0gZWxzZSB7CisJICAgIGRpZSAKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIChpbml0aWF0b3IpIDxsZW5ndGg+LCA8YWRkcmVzcz4sIFdIRU4gPHBoYXNlPgorCQkgKHRhcmdldCkgPGxlbmd0aD4sIDxhZGRyZXNzPiwgV0lUSCA8cGhhc2U+CisJCSBNRU1PUlkgPGxlbmd0aD4sIDxzb3VyY2U+LCA8ZGVzdGluYXRpb24+CisJCSA8ZXhwcmVzc2lvbj4gVE8gPHJlZ2lzdGVyPgorIjsKKwl9CisjIFByb2Nlc3MgU0VMRUNUIHtBVE58fSBpZCwgZmFpbF9hZGRyZXNzCisgICAgfSBlbHNpZiAoL15ccyooU0VMRUNUfFJFU0VMRUNUKVxzKyguKikvaSkgeworCSRyZXN0ID0gJDI7CisJaWYgKCRyZXN0ID1+IC9eKEFUTnwpXHMqKCR2YWx1ZSlccyosXHMqKCRpZGVudGlmaWVyKVxzKiQvaSkgeworCSAgICAkYXRuID0gJDE7CisJICAgICRpZCA9ICQyOworCSAgICAkYWx0X2FkZHIgPSAkMzsKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gMHg0MF8wMF8wMF8wMCB8IAorCQkoKCRhdG4gPX4gL0FUTi9pKSA/IDB4MDFfMDBfMDBfMDAgOiAwKTsKKwkgICAgJGNvZGVbJGFkZHJlc3MgKyAxXSA9IDB4MDBfMDBfMDBfMDA7CisJICAgICZwYXJzZV92YWx1ZSgkaWQsIDAsIDIsIDEpOworCSAgICAmcGFyc2VfdmFsdWUoJGFsdF9hZGRyLCAxLCAwLCA0KTsKKwkgICAgJGFkZHJlc3MgKz0gMjsKKwl9IGVsc2lmICgkcmVzdCA9fiAvXihBVE58KVxzKkZST01ccysoJHZhbHVlKVxzKixccyooJGlkZW50aWZpZXIpXHMqJC9pKSB7CisJICAgICRhdG4gPSAkMTsKKwkgICAgJGFkZHIgPSAkMjsKKwkgICAgJGFsdF9hZGRyID0gJDM7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4NDJfMDBfMDBfMDAgfCAKKwkJKCgkYXRuID1+IC9BVE4vaSkgPyAweDAxXzAwXzAwXzAwIDogMCk7CisJICAgICRjb2RlWyRhZGRyZXNzICsgMV0gPSAweDAwXzAwXzAwXzAwOworCSAgICAmcGFyc2VfdmFsdWUoJGFkZHIsIDAsIDAsIDMpOworCSAgICAmcGFyc2VfdmFsdWUoJGFsdF9hZGRyLCAxLCAwLCA0KTsKKwkgICAgJGFkZHJlc3MgKz0gMjsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgZGllIAorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgU0VMRUNUIGlkLCBhbHRlcm5hdGVfYWRkcmVzcyBvciAKKwkJU0VMRUNUIEZST00gYWRkcmVzcywgYWx0ZXJuYXRlX2FkZHJlc3Mgb3IgCisJCVJFU0VMRUNUIGlkLCBhbHRlcm5hdGVfYWRkcmVzcyBvcgorCQlSRVNFTEVDVCBGUk9NIGFkZHJlc3MsIGFsdGVybmF0ZV9hZGRyZXNzCisiOworCX0KKyAgICB9IGVsc2lmICgvXlxzKldBSVRccysoLiopL2kpIHsKKwkgICAgJHJlc3QgPSAkMTsKK3ByaW50IFNUREVSUiAiUGFyc2luZyBXQUlUICRyZXN0XG4iIGlmICgkZGVidWcpOworCWlmICgkcmVzdCA9fiAvXkRJU0NPTk5FQ1RccyokL2kpIHsKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gMHg0OF8wMF8wMF8wMDsKKwkgICAgJGNvZGVbJGFkZHJlc3MgKyAxXSA9IDB4MDBfMDBfMDBfMDA7CisJICAgICRhZGRyZXNzICs9IDI7CisJfSBlbHNpZiAoJHJlc3QgPX4gL14oUkVTRUxFQ1R8U0VMRUNUKVxzKygkaWRlbnRpZmllcilccyokL2kpIHsKKwkgICAgJGFsdF9hZGRyID0gJDI7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4NTBfMDBfMDBfMDA7CisJICAgICZwYXJzZV92YWx1ZSAoJGFsdF9hZGRyLCAxLCAwLCA0KTsKKwkgICAgJGFkZHJlc3MgKz0gMjsKKwl9IGVsc2UgeworCSAgICBkaWUKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIChpbml0aWF0b3IpIFdBSVQgRElTQ09OTkVDVCBvciAKKwkJIChpbml0aWF0b3IpIFdBSVQgUkVTRUxFQ1QgYWx0ZXJuYXRlX2FkZHJlc3Mgb3IKKwkJICh0YXJnZXQpIFdBSVQgU0VMRUNUIGFsdGVybmF0ZV9hZGRyZXNzCisiOworCX0KKyMgSGFuZGxlIFNFVCBhbmQgQ0xFQVIgaW5zdHJ1Y3Rpb25zLiAgTm90ZSB0aGF0IHdlIHNob3VsZCBhbHNvIGRvIHNvbWV0aGluZworIyB3aXRoIHRoaXMgc3ludGF4IHRvIHNldCB0YXJnZXQgbW9kZS4KKyAgICB9IGVsc2lmICgvXlxzKihTRVR8Q0xFQVIpXHMrKC4qKS9pKSB7CisJJHNldCA9ICQxOworCSRsaXN0ID0gJDI7CisJJGNvZGVbJGFkZHJlc3NdID0gKCRzZXQgPX4gL1NFVC9pKSA/ICAweDU4XzAwXzAwXzAwIDogCisJICAgIDB4NjBfMDBfMDBfMDA7CisJZm9yZWFjaCAkYXJnIChzcGxpdCAoL1xzK0FORFxzKy9pLCRsaXN0KSkgeworCSAgICBpZiAoJGFyZyA9fiAvQVROL2kpIHsKKwkJJGNvZGVbJGFkZHJlc3NdIHw9IDB4MDBfMDBfMDBfMDg7CisJICAgIH0gZWxzaWYgKCRhcmcgPX4gL0FDSy9pKSB7CisJCSRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzAwXzAwXzQwOworCSAgICB9IGVsc2lmICgkYXJnID1+IC9UQVJHRVQvaSkgeworCQkkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wMF8wMl8wMDsKKwkgICAgfSBlbHNpZiAoJGFyZyA9fiAvQ0FSUlkvaSkgeworCQkkY29kZVskYWRkcmVzc10gfD0gMHgwMF8wMF8wNF8wMDsKKwkgICAgfSBlbHNlIHsKKwkJZGllIAorIiQwIDogc3ludGF4IGVycm9yIGluIGxpbmUgJGxpbmVubyA6ICRfCisJZXhwZWN0ZWQgJHNldCBmb2xsb3dlZCBieSBhIEFORCBkZWxpbWl0ZWQgbGlzdCBvZiBvbmUgb3IgCisJbW9yZSBzdHJpbmdzIGZyb20gdGhlIGxpc3QgQUNLLCBBVE4sIENBUlJZLCBUQVJHRVQuCisiOworCSAgICB9CisJfQorCSRjb2RlWyRhZGRyZXNzICsgMV0gPSAweDAwXzAwXzAwXzAwOworCSRhZGRyZXNzICs9IDI7CisgICAgfSBlbHNpZiAoL15ccyooSlVNUHxDQUxMfElOVClccysoLiopL2kpIHsKKwkkaW5zdHJ1Y3Rpb24gPSAkMTsKKwkkcmVzdCA9ICQyOworCWlmICgkaW5zdHJ1Y3Rpb24gPX4gL0pVTVAvaSkgeworCSAgICAkY29kZVskYWRkcmVzc10gPSAweDgwXzAwXzAwXzAwOworCX0gZWxzaWYgKCRpbnN0cnVjdGlvbiA9fiAvQ0FMTC9pKSB7CisJICAgICRjb2RlWyRhZGRyZXNzXSA9IDB4ODhfMDBfMDBfMDA7CisJfSBlbHNlIHsKKwkgICAgJGNvZGVbJGFkZHJlc3NdID0gMHg5OF8wMF8wMF8wMDsKKwl9CitwcmludCBTVERFUlIgInBhcnNpbmcgSlVNUCwgcmVzdCA9ICRyZXN0XG4iIGlmICgkZGVidWcpOworCisjIFJlbGF0aXZlIGp1bXAuIAorCWlmICgkcmVzdCA9fiAvXihSRUxccypcKFxzKiRpZGVudGlmaWVyXHMqXCkpXHMqKC4qKS9pKSB7IAorCSAgICAkYWRkciA9ICQxOworCSAgICAkcmVzdCA9ICQyOworcHJpbnQgU1RERVJSICJwYXJzaW5nIEpVTVAgUkVMLCBhZGRyID0gJGFkZHIsIHJlc3QgPSAkcmVzdFxuIiBpZiAoJGRlYnVnKTsKKwkgICAgJGNvZGVbJGFkZHJlc3NdICB8PSAweDAwXzgwXzAwXzAwOworCSAgICAmcGFyc2VfdmFsdWUoJGFkZHIsIDEsIDAsIDQpOworIyBBYnNvbHV0ZSBqdW1wLCByZXF1aXJlcyBubyBtb3JlIGd1bmsKKwl9IGVsc2lmICgkcmVzdCA9fiAvXigkdmFsdWUpXHMqKC4qKS8pIHsKKwkgICAgJGFkZHIgPSAkMTsKKwkgICAgJHJlc3QgPSAkMjsKKwkgICAgJnBhcnNlX3ZhbHVlKCRhZGRyLCAxLCAwLCA0KTsKKwl9IGVsc2UgeworCSAgICBkaWUKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkIDxhZGRyZXNzPiBvciBSRUwgKGFkZHJlc3MpCisiOworCX0KKworCWlmICgkcmVzdCA9fiAvXixccyooLiopLykgeworCSAgICAmcGFyc2VfY29uZGl0aW9uYWwoJDEpOworCX0gZWxzaWYgKCRyZXN0ID1+IC9eXHMqJC8pIHsKKwkgICAgJGNvZGVbJGFkZHJlc3NdIHw9ICgxIDw8IDE5KTsKKwl9IGVsc2UgeworCSAgICBkaWUKKyIkMCA6IHN5bnRheCBlcnJvciBpbiBsaW5lICRsaW5lbm8gOiAkXworCWV4cGVjdGVkICwgPGNvbmRpdGlvbmFsPiBvciBlbmQgb2YgbGluZSwgZ290ICQxCisiOworCX0KKwkKKwkkYWRkcmVzcyArPSAyOworICAgIH0gZWxzaWYgKC9eXHMqKFJFVFVSTnxJTlRGTFkpXHMqKC4qKS9pKSB7CisJJGluc3RydWN0aW9uID0gJDE7CisJJGNvbmRpdGlvbmFsID0gJDI7IAorcHJpbnQgU1RERVJSICJQYXJzaW5nICRpbnN0cnVjdGlvblxuIiBpZiAoJGRlYnVnKTsKKwkkY29kZVskYWRkcmVzc10gPSAoJGluc3RydWN0aW9uID1+IC9SRVRVUk4vaSkgPyAweDkwXzAwXzAwXzAwIDoKKwkgICAgMHg5OF8xMF8wMF8wMDsKKwlpZiAoJGNvbmRpdGlvbmFsID1+IC9eLFxzKiguKikvKSB7CisJICAgICRjb25kaXRpb25hbCA9ICQxOworCSAgICAmcGFyc2VfY29uZGl0aW9uYWwgKCRjb25kaXRpb25hbCk7CisJfSBlbHNpZiAoJGNvbmRpdGlvbmFsICF+IC9eXHMqJC8pIHsKKwkgICAgZGllCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vIDogJF8KKwlleHBlY3RlZCAsIDxjb25kaXRpb25hbD4gCisiOworCX0gZWxzZSB7CisJICAgICRjb2RlWyRhZGRyZXNzXSB8PSAweDAwXzA4XzAwXzAwOworCX0KKwkgICAKKwkkY29kZVskYWRkcmVzcyArIDFdID0gMHgwMF8wMF8wMF8wMDsKKwkkYWRkcmVzcyArPSAyOworICAgIH0gZWxzaWYgKC9eXHMqRElTQ09OTkVDVFxzKiQvKSB7CisJJGNvZGVbJGFkZHJlc3NdID0gMHg0OF8wMF8wMF8wMDsKKwkkY29kZVskYWRkcmVzcyArIDFdID0gMHgwMF8wMF8wMF8wMDsKKwkkYWRkcmVzcyArPSAyOworIyBJJ20gbm90IHN1cmUgdGhhdCBJIHNob3VsZCBiZSBpbmNsdWRpbmcgdGhpcyBleHRlbnNpb24sIGJ1dCAKKyMgd2hhdCB0aGUgaGVsbD8KKyAgICB9IGVsc2lmICgvXlxzKk5PUFxzKiQvaSkgeworCSRjb2RlWyRhZGRyZXNzXSA9IDB4ODBfODhfMDBfMDA7CisJJGNvZGVbJGFkZHJlc3MgKyAxXSA9IDB4MDBfMDBfMDBfMDA7CisJJGFkZHJlc3MgKz0gMjsKKyMgSWdub3JlIGxpbmVzIGNvbnNpc3RpbmcgZW50aXJlbHkgb2Ygd2hpdGUgc3BhY2UKKyAgICB9IGVsc2lmICgvXlxzKiQvKSB7CisgICAgfSBlbHNlIHsKKwlkaWUgCisiJDAgOiBzeW50YXggZXJyb3IgaW4gbGluZSAkbGluZW5vOiAkXworCWV4cGVjdGVkIGxhYmVsOiwgQUJTT0xVVEUsIENMRUFSLCBESVNDT05ORUNULCBFWFRFUk5BTCwgTU9WRSwgUkVTRUxFQ1QsCisJICAgIFNFTEVDVCBTRVQsIG9yIFdBSVQKKyI7CisgICAgfQorfQorCisjIEZpbGwgaW4gbGFiZWwgcmVmZXJlbmNlcworCitAdW5kZWZpbmVkID0ga2V5cyAlZm9yd2FyZDsKK2lmICgkI3VuZGVmaW5lZCA+PSAwKSB7CisgICAgcHJpbnQgU1RERVJSICJVbmRlZmluZWQgc3ltYm9scyA6IFxuIjsKKyAgICBmb3JlYWNoICR1bmRlZiAoQHVuZGVmaW5lZCkgeworCXByaW50IFNUREVSUiAiJHVuZGVmIGluICRmb3J3YXJkeyR1bmRlZn1cbiI7CisgICAgfQorICAgIGV4aXQgMTsKK30KKworQGxhYmVsX3BhdGNoZXMgPSAoKTsKKworQGV4dGVybmFsX3BhdGNoZXMgPSAoKTsKKworQGFic29sdXRlID0gc29ydCBAYWJzb2x1dGU7CisKK2ZvcmVhY2ggJGkgKEBhYnNvbHV0ZSkgeworICAgIGZvcmVhY2ggJGogKHNwbGl0ICgvXHMrLywkc3ltYm9sX3JlZmVyZW5jZXN7JGl9KSkgeworCSRqID1+IC8oUkVMfEFCUyksKC4qKSwoLiopLzsKKwkkdHlwZSA9ICQxOworCSRhZGRyZXNzID0gJDI7CisJJGxlbmd0aCA9ICQzOworCWRpZSAKKyIkMCA6ICRzeW1ib2wgJGkgaGFzIGludmFsaWQgcmVsYXRpdmUgcmVmZXJlbmNlIGF0IGFkZHJlc3MgJGFkZHJlc3MsCisgICAgc2l6ZSAkbGVuZ3RoXG4iCisJaWYgKCR0eXBlIGVxICdSRUwnKTsKKwkgICAgCisJJnBhdGNoICgkYWRkcmVzcyAvIDQsICRhZGRyZXNzICUgNCwgJGxlbmd0aCwgJHN5bWJvbF92YWx1ZXN7JGl9KTsKKyAgICB9Cit9CisKK2ZvcmVhY2ggJGV4dGVybmFsIChAZXh0ZXJuYWwpIHsKK3ByaW50IFNUREVSUiAiY2hlY2tpbmcgZXh0ZXJuYWwgJGV4dGVybmFsIFxuIiBpZiAoJGRlYnVnX2V4dGVybmFsKTsKKyAgICBpZiAoJHN5bWJvbF9yZWZlcmVuY2VzeyRleHRlcm5hbH0gbmUgdW5kZWYpIHsKKwlmb3IgJHJlZmVyZW5jZSAoc3BsaXQoL1xzKy8sJHN5bWJvbF9yZWZlcmVuY2VzeyRleHRlcm5hbH0pKSB7CisJICAgICRyZWZlcmVuY2UgPX4gLyhSRUx8QUJTKSwoLiopLCguKikvOworCSAgICAkdHlwZSA9ICQxOworCSAgICAkYWRkcmVzcyA9ICQyOworCSAgICAkbGVuZ3RoID0gJDM7CisJICAgIAorCSAgICBkaWUgCisiJDAgOiBzeW1ib2wgJGxhYmVsIGlzIGV4dGVybmFsLCBoYXMgaW52YWxpZCByZWxhdGl2ZSByZWZlcmVuY2UgYXQgJGFkZHJlc3MsCisgICAgc2l6ZSAkbGVuZ3RoXG4iCisJCWlmICgkdHlwZSBlcSAnUkVMJyk7CisKKwkgICAgZGllIAorIiQwIDogc3ltYm9sICRsYWJlbCBoYXMgaW52YWxpZCByZWZlcmVuY2UgYXQgJGFkZHJlc3MsIHNpemUgJGxlbmd0aFxuIgorCQlpZiAoKCgkYWRkcmVzcyAlIDQpICE9MCkgfHwgKCRsZW5ndGggIT0gNCkpOworCisJICAgICRzeW1ib2wgPSAkc3ltYm9sX3ZhbHVlc3skZXh0ZXJuYWx9OworCSAgICAkYWRkID0gJGNvZGVbJGFkZHJlc3MgLyA0XTsKKwkgICAgaWYgKCRhZGQgZXEgMCkgeworCQkkY29kZVskYWRkcmVzcyAvIDRdID0gJHN5bWJvbDsKKwkgICAgfSBlbHNlIHsKKwkJJGFkZCA9IHNwcmludGYgKCIweCUwOHgiLCAkYWRkKTsKKwkJJGNvZGVbJGFkZHJlc3MgLyA0XSA9ICIkc3ltYm9sICsgJGFkZCI7CisJICAgIH0KKwkJCitwcmludCBTVERFUlIgInJlZmVyZW5jZWQgZXh0ZXJuYWwgJGV4dGVybmFsIGF0ICQxXG4iIGlmICgkZGVidWdfZXh0ZXJuYWwpOworCX0KKyAgICB9Cit9CisKK2ZvcmVhY2ggJGxhYmVsIChAbGFiZWwpIHsKKyAgICBpZiAoJHN5bWJvbF9yZWZlcmVuY2VzeyRsYWJlbH0gbmUgdW5kZWYpIHsKKwlmb3IgJHJlZmVyZW5jZSAoc3BsaXQoL1xzKy8sJHN5bWJvbF9yZWZlcmVuY2VzeyRsYWJlbH0pKSB7CisJICAgICRyZWZlcmVuY2UgPX4gLyhSRUx8QUJTKSwoLiopLCguKikvOworCSAgICAkdHlwZSA9ICQxOworCSAgICAkYWRkcmVzcyA9ICQyOworCSAgICAkbGVuZ3RoID0gJDM7CisKKwkgICAgaWYgKCgoJGFkZHJlc3MgJSA0KSAhPTApIHx8ICgkbGVuZ3RoICE9IDQpKSB7CisJCWRpZSAiJDAgOiBzeW1ib2wgJGxhYmVsIGhhcyBpbnZhbGlkIHJlZmVyZW5jZSBhdCAkMSwgc2l6ZSAkMlxuIjsKKwkgICAgfQorCisJICAgIGlmICgkdHlwZSBlcSAnQUJTJykgeworCQkkY29kZVskYWRkcmVzcyAvIDRdICs9ICRzeW1ib2xfdmFsdWVzeyRsYWJlbH07CisJCXB1c2ggKEBsYWJlbF9wYXRjaGVzLCAkYWRkcmVzcyAvIDQpOworCSAgICB9IGVsc2UgeworIyAKKyMgLSBUaGUgYWRkcmVzcyBvZiB0aGUgcmVmZXJlbmNlIHNob3VsZCBiZSBpbiB0aGUgc2Vjb25kIGFuZCBsYXN0IHdvcmQKKyMJb2YgYW4gaW5zdHJ1Y3Rpb24KKyMgLSBSZWxhdGl2ZSBqdW1wcywgZXRjLiBhcmUgcmVsYXRpdmUgdG8gdGhlIERTUCBvZiB0aGUgX25leHRfIGluc3RydWN0aW9uCisjCisjIFNvLCB3ZSBuZWVkIHRvIGFkZCBmb3VyIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSByZWZlcmVuY2UsIHRvIGdldCAKKyMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHdoZW4gY29tcHV0aW5nIHRoZSByZWZlcmVuY2UuCisgIAorCQkkdG1wID0gJHN5bWJvbF92YWx1ZXN7JGxhYmVsfSAtIAorCQkgICAgKCRhZGRyZXNzICsgNCk7CisJCWRpZSAKKyMgUmVsYXRpdmUgYWRkcmVzc2luZyBpcyBsaW1pdGVkIHRvIDI0IGJpdHMuCisiJDAgOiBzeW1ib2wgJGxhYmVsIGlzIHRvbyBmYXIgKCR0bXApIGZyb20gJGFkZHJlc3MgdG8gcmVmZXJlbmNlIGFzIAorICAgIHJlbGF0aXZlL1xuIiBpZiAoKCR0bXAgPj0gMHg4MF8wMF8wMCkgfHwgKCR0bXAgPCAtMHg4MF8wMF8wMCkpOworCQkkY29kZVskYWRkcmVzcyAvIDRdID0gJHRtcCAmIDB4MDBfZmZfZmZfZmY7CisJICAgIH0KKwl9CisgICAgfQorfQorCisjIE91dHB1dCBTQ1JJUFRbXSBhcnJheSwgb25lIGluc3RydWN0aW9uIHBlciBsaW5lLiAgT3B0aW9uYWxseSAKKyMgcHJpbnQgdGhlIG9yaWdpbmFsIGNvZGUgdG9vLgorCitvcGVuIChPVVRQVVQsICI+JG91dHB1dCIpIHx8IGRpZSAiJDAgOiBjYW4ndCBvcGVuICRvdXRwdXQgZm9yIHdyaXRpbmdcbiI7CitvcGVuIChPVVRQVVRVLCAiPiRvdXRwdXR1IikgfHwgZGllICIkMCA6IGNhbid0IG9wZW4gJG91dHB1dHUgZm9yIHdyaXRpbmdcbiI7CisKKygkXyA9ICQwKSA9fiBzOi4qLzo6OworcHJpbnQgT1VUUFVUICIvKiBETyBOT1QgRURJVCAtIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICIuJF8uIiAqL1xuIjsKK3ByaW50IE9VVFBVVCAic3RhdGljIHUzMiAiLiRwcmVmaXguIlNDUklQVFtdID0ge1xuIjsKKyRpbnN0cnVjdGlvbnMgPSAwOworZm9yICgkaSA9IDA7ICRpIDwgJCNjb2RlOyApIHsKKyAgICBpZiAoJGxpc3RfaW5fYXJyYXkpIHsKKwlwcmludGYgT1VUUFVUICIvKlxuJGxpc3RbJGldXG5hdCAweCUwOHggOiAqLyIsICRpOworICAgIH0KKyAgICBwcmludGYgT1VUUFVUICJcdDB4JTA4eCwiLCAkY29kZVskaV07CisgICAgcHJpbnRmIFNUREVSUiAiQWRkcmVzcyAkaSA9ICV4XG4iLCAkY29kZVskaV0gaWYgKCRkZWJ1Zyk7CisgICAgaWYgKCRjb2RlWyRpICsgMV0gPX4gL1xzKigkaWRlbnRpZmllcikoLiopJC8pIHsKKwlwdXNoIChAZXh0ZXJuYWxfcGF0Y2hlcywgJGkrMSwgJDEpOworCXByaW50ZiBPVVRQVVQgIjAlcywiLCAkMgorICAgIH0gZWxzZSB7CisJcHJpbnRmIE9VVFBVVCAiMHglMDh4LCIsJGNvZGVbJGkrMV07CisgICAgfQorCisgICAgaWYgKCgkY29kZVskaV0gJiAweGZmXzAwXzAwXzAwKSA9PSAweGMwXzAwXzAwXzAwKSB7CisJaWYgKCRjb2RlWyRpICsgMl0gPX4gLyRpZGVudGlmaWVyLykgeworCSAgICBwdXNoIChAZXh0ZXJuYWxfcGF0Y2hlcywgJGkrMiwgJGNvZGVbJGkrMl0pOworCSAgICBwcmludGYgT1VUUFVUICIwLFxuIjsKKwl9IGVsc2UgeworCSAgICBwcmludGYgT1VUUFVUICIweCUwOHgsXG4iLCRjb2RlWyRpKzJdOworCX0KKwkkaSArPSAzOworICAgIH0gZWxzZSB7CisJcHJpbnRmIE9VVFBVVCAiXG4iOworCSRpICs9IDI7CisgICAgfQorICAgICRpbnN0cnVjdGlvbnMgKz0gMTsKK30KK3ByaW50IE9VVFBVVCAifTtcblxuIjsKKworZm9yZWFjaCAkaSAoQGFic29sdXRlKSB7CisgICAgcHJpbnRmIE9VVFBVVCAiI2RlZmluZSBBXyRpXHQweCUwOHhcbiIsICRzeW1ib2xfdmFsdWVzeyRpfTsKKyAgICBpZiAoZGVmaW5lZCgkcHJlZml4KSAmJiAkcHJlZml4IG5lICcnKSB7CisJcHJpbnRmIE9VVFBVVCAiI2RlZmluZSBBXyIuJGkuIl91c2VkICIuJHByZWZpeC4iQV8iLiRpLiJfdXNlZFxuIjsKKwlwcmludGYgT1VUUFVUVSAiI3VuZGVmIEFfIi4kaS4iX3VzZWRcbiI7CisgICAgfQorICAgIHByaW50ZiBPVVRQVVRVICIjdW5kZWYgQV8kaVxuIjsKKworICAgIHByaW50ZiBPVVRQVVQgInN0YXRpYyB1MzIgQV8iLiRpLiJfdXNlZFxbXF0gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0ge1xuIjsKK3ByaW50ZiBTVERFUlIgIiRpIGlzIHVzZWQgJHN5bWJvbF9yZWZlcmVuY2VzeyRpfVxuIiBpZiAoJGRlYnVnKTsKKyAgICBmb3JlYWNoICRqIChzcGxpdCAoL1xzKy8sJHN5bWJvbF9yZWZlcmVuY2VzeyRpfSkpIHsKKwkkaiA9fiAvKEFCU3xSRUwpLCguKiksKC4qKS87CisJaWYgKCQxIGVxICdBQlMnKSB7CisJICAgICRhZGRyZXNzID0gJDI7CisJICAgICRsZW5ndGggPSAkMzsKKwkgICAgcHJpbnRmIE9VVFBVVCAiXHQweCUwOHgsXG4iLCAkYWRkcmVzcyAvIDQ7CisJfQorICAgIH0KKyAgICBwcmludGYgT1VUUFVUICJ9O1xuXG4iOworfQorCitmb3JlYWNoICRpIChzb3J0IEBlbnRyeSkgeworICAgIHByaW50ZiBPVVRQVVQgIiNkZWZpbmUgRW50XyRpXHQweCUwOHhcbiIsICRzeW1ib2xfdmFsdWVzeyRpfTsKKyAgICBwcmludGYgT1VUUFVUVSAiI3VuZGVmIEVudF8kaVxuIiwgJHN5bWJvbF92YWx1ZXN7JGl9OworfQorCisjCisjIE5DUiBhc3NlbWJsZXIgb3V0cHV0cyBsYWJlbCBwYXRjaGVzIGluIHRoZSBmb3JtIG9mIGluZGljZXMgaW50byAKKyMgdGhlIGNvZGUuCisjCitwcmludGYgT1VUUFVUICJzdGF0aWMgdTMyICIuJHByZWZpeC4iTEFCRUxQQVRDSEVTW10gX19hdHRyaWJ1dGUoKHVudXNlZCkpID0ge1xuIjsKK2ZvciAkcGF0Y2ggKHNvcnQgeyRhIDw9PiAkYn0gQGxhYmVsX3BhdGNoZXMpIHsKKyAgICBwcmludGYgT1VUUFVUICJcdDB4JTA4eCxcbiIsICRwYXRjaDsKK30KK3ByaW50ZiBPVVRQVVQgIn07XG5cbiI7CisKKyRudW1fZXh0ZXJuYWxfcGF0Y2hlcyA9IDA7CitwcmludGYgT1VUUFVUICJzdGF0aWMgc3RydWN0IHtcblx0dTMyXHRvZmZzZXQ7XG5cdHZvaWRcdFx0KmFkZHJlc3M7XG4iLgorICAgICJ9ICIuJHByZWZpeC4iRVhURVJOQUxfUEFUQ0hFU1tdIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IHtcbiI7Cit3aGlsZSAoJGlkZW50ID0gcG9wKEBleHRlcm5hbF9wYXRjaGVzKSkgeworICAgICRvZmYgPSBwb3AoQGV4dGVybmFsX3BhdGNoZXMpOworICAgIHByaW50ZiBPVVRQVVQgIlx0ezB4JTA4eCwgJiVzfSxcbiIsICRvZmYsICRpZGVudDsKKyAgICArKyRudW1fZXh0ZXJuYWxfcGF0Y2hlczsKK30KK3ByaW50ZiBPVVRQVVQgIn07XG5cbiI7CisKK3ByaW50ZiBPVVRQVVQgInN0YXRpYyB1MzIgIi4kcHJlZml4LiJJTlNUUlVDVElPTlMgX19hdHRyaWJ1dGUoKHVudXNlZCkpXHQ9ICVkO1xuIiwgCisgICAgJGluc3RydWN0aW9uczsKK3ByaW50ZiBPVVRQVVQgInN0YXRpYyB1MzIgIi4kcHJlZml4LiJQQVRDSEVTIF9fYXR0cmlidXRlKCh1bnVzZWQpKVx0PSAlZDtcbiIsIAorICAgICQjbGFiZWxfcGF0Y2hlcysxOworcHJpbnRmIE9VVFBVVCAic3RhdGljIHUzMiAiLiRwcmVmaXguIkVYVEVSTkFMX1BBVENIRVNfTEVOIF9fYXR0cmlidXRlKCh1bnVzZWQpKVx0PSAlZDtcbiIsCisgICAgJG51bV9leHRlcm5hbF9wYXRjaGVzOworY2xvc2UgT1VUUFVUOworY2xvc2UgT1VUUFVUVTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2FiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC0wLDAgKzEsMTM3NSBAQAorLyoKKyAqICBzY3NpLmMgQ29weXJpZ2h0IChDKSAxOTkyIERyZXcgRWNraGFyZHQKKyAqICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEVyaWMgWW91bmdkYWxlCisgKiAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBDaHJpc3RvcGggSGVsbHdpZworICoKKyAqICBnZW5lcmljIG1pZC1sZXZlbCBTQ1NJIGRyaXZlcgorICogICAgICBJbml0aWFsIHZlcnNpb25zOiBEcmV3IEVja2hhcmR0CisgKiAgICAgIFN1YnNlcXVlbnQgcmV2aXNpb25zOiBFcmljIFlvdW5nZGFsZQorICoKKyAqICA8ZHJld0Bjb2xvcmFkby5lZHU+CisgKgorICogIEJ1ZyBjb3JyZWN0aW9uIHRoYW5rcyBnbyB0byA6CisgKiAgICAgIFJpayBGYWl0aCA8ZmFpdGhAY3MudW5jLmVkdT4KKyAqICAgICAgVG9tbXkgVGhvcm4gPHR0aG9ybj4KKyAqICAgICAgVGhvbWFzIFd1ZW5zY2hlIDx0d0BmZ2IxLmZnYi5tdy50dS1tdWVuY2hlbi5kZT4KKyAqCisgKiAgTW9kaWZpZWQgYnkgRXJpYyBZb3VuZ2RhbGUgZXJpY0BhbmRhbnRlLm9yZyBvciBlcmljeUBnbnUuYWkubWl0LmVkdSB0bworICogIGFkZCBzY2F0dGVyLWdhdGhlciwgbXVsdGlwbGUgb3V0c3RhbmRpbmcgcmVxdWVzdCwgYW5kIG90aGVyCisgKiAgZW5oYW5jZW1lbnRzLgorICoKKyAqICBOYXRpdmUgbXVsdGljaGFubmVsLCB3aWRlIHNjc2ksIC9wcm9jL3Njc2kgYW5kIGhvdCBwbHVnZ2luZworICogIHN1cHBvcnQgYWRkZWQgYnkgTWljaGFlbCBOZXVmZmVyIDxtaWtlQGktY29ubmVjdC5uZXQ+CisgKgorICogIEFkZGVkIHJlcXVlc3RfbW9kdWxlKCJzY3NpX2hvc3RhZGFwdGVyIikgZm9yIGtlcm5lbGQ6CisgKiAgKFB1dCBhbiAiYWxpYXMgc2NzaV9ob3N0YWRhcHRlciB5b3VyX2hvc3RhZGFwdGVyIiBpbiAvZXRjL21vZHByb2JlLmNvbmYpCisgKiAgQmpvcm4gRWt3YWxsICA8Ymowcm5AYmxveC5zZT4KKyAqICAoY2hhbmdlZCB0byBrbW9kKQorICoKKyAqICBNYWpvciBpbXByb3ZlbWVudHMgdG8gdGhlIHRpbWVvdXQsIGFib3J0LCBhbmQgcmVzZXQgcHJvY2Vzc2luZywKKyAqICBhcyB3ZWxsIGFzIHBlcmZvcm1hbmNlIG1vZGlmaWNhdGlvbnMgZm9yIGxhcmdlIHF1ZXVlIGRlcHRocyBieQorICogIExlb25hcmQgTi4gWnVia29mZiA8bG56QGRhbmRlbGlvbi5jb20+CisgKgorICogIENvbnZlcnRlZCBjbGkoKSBjb2RlIHRvIHNwaW5sb2NrcywgSW5nbyBNb2xuYXIKKyAqCisgKiAgSmlmZmllcyB3cmFwIGZpeGVzIChob3N0LT5yZXNldHRpbmcpLCAzIERlYyAxOTk4IEFuZHJlYSBBcmNhbmdlbGkKKyAqCisgKiAgb3V0X29mX3NwYWNlIGhhY2tzLCBELiBHaWxiZXJ0IChkcGcpIDk5MDYwOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKworI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCisKKy8qCisgKiBEZWZpbml0aW9ucyBhbmQgY29uc3RhbnRzLgorICovCisKKyNkZWZpbmUgTUlOX1JFU0VUX0RFTEFZICgyKkhaKQorCisvKiBEbyBub3QgY2FsbCByZXNldCBvbiBlcnJvciBpZiB3ZSBqdXN0IGRpZCBhIHJlc2V0IHdpdGhpbiAxNSBzZWMuICovCisjZGVmaW5lIE1JTl9SRVNFVF9QRVJJT0QgKDE1KkhaKQorCisvKgorICogTWFjcm8gdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIFNDU0kgY29tbWFuZC4gVGhpcyBtYWNybyB0YWtlcyB2ZW5kb3IKKyAqIHVuaXF1ZSBjb21tYW5kcyBpbnRvIGFjY291bnQuIFNDU0kgY29tbWFuZHMgaW4gZ3JvdXBzIDYgYW5kIDcgYXJlCisgKiB2ZW5kb3IgdW5pcXVlIGFuZCB3ZSB3aWxsIGRlcGVuZCB1cG9uIHRoZSBjb21tYW5kIGxlbmd0aCBiZWluZworICogc3VwcGxpZWQgY29ycmVjdGx5IGluIGNtZF9sZW4uCisgKi8KKyNkZWZpbmUgQ0RCX1NJWkUoY21kKQkoKCgoKGNtZCktPmNtbmRbMF0gPj4gNSkgJiA3KSA8IDYpID8gXAorCQkJCUNPTU1BTkRfU0laRSgoY21kKS0+Y21uZFswXSkgOiAoY21kKS0+Y21kX2xlbikKKworLyoKKyAqIE5vdGUgLSB0aGUgaW5pdGlhbCBsb2dnaW5nIGxldmVsIGNhbiBiZSBzZXQgaGVyZSB0byBsb2cgZXZlbnRzIGF0IGJvb3QgdGltZS4KKyAqIEFmdGVyIHRoZSBzeXN0ZW0gaXMgdXAsIHlvdSBtYXkgZW5hYmxlIGxvZ2dpbmcgdmlhIHRoZSAvcHJvYyBpbnRlcmZhY2UuCisgKi8KK3Vuc2lnbmVkIGludCBzY3NpX2xvZ2dpbmdfbGV2ZWw7CisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9MT0dHSU5HKQorRVhQT1JUX1NZTUJPTChzY3NpX2xvZ2dpbmdfbGV2ZWwpOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKmNvbnN0IHNjc2lfZGV2aWNlX3R5cGVzW01BWF9TQ1NJX0RFVklDRV9DT0RFXSA9IHsKKwkiRGlyZWN0LUFjY2VzcyAgICAiLAorCSJTZXF1ZW50aWFsLUFjY2VzcyIsCisJIlByaW50ZXIgICAgICAgICAgIiwKKwkiUHJvY2Vzc29yICAgICAgICAiLAorCSJXT1JNICAgICAgICAgICAgICIsCisJIkNELVJPTSAgICAgICAgICAgIiwKKwkiU2Nhbm5lciAgICAgICAgICAiLAorCSJPcHRpY2FsIERldmljZSAgICIsCisJIk1lZGl1bSBDaGFuZ2VyICAgIiwKKwkiQ29tbXVuaWNhdGlvbnMgICAiLAorCSJVbmtub3duICAgICAgICAgICIsCisJIlVua25vd24gICAgICAgICAgIiwKKwkiUkFJRCAgICAgICAgICAgICAiLAorCSJFbmNsb3N1cmUgICAgICAgICIsCit9OworRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV90eXBlcyk7CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0CisgKgorICogUHVycG9zZTogICAgIEFsbG9jYXRlIGEgcmVxdWVzdCBkZXNjcmlwdG9yLgorICoKKyAqIEFyZ3VtZW50czogICBkZXZpY2UJCS0gZGV2aWNlIGZvciB3aGljaCB3ZSB3YW50IGEgcmVxdWVzdAorICoJCWdmcF9tYXNrCS0gYWxsb2NhdGlvbiBmbGFncyBwYXNzZWQgdG8ga21hbGxvYworICoKKyAqIExvY2sgc3RhdHVzOiBObyBsb2NrcyBhc3N1bWVkIHRvIGJlIGhlbGQuICBUaGlzIGZ1bmN0aW9uIGlzIFNNUC1zYWZlLgorICoKKyAqIFJldHVybnM6ICAgICBQb2ludGVyIHRvIHJlcXVlc3QgYmxvY2suCisgKi8KK3N0cnVjdCBzY3NpX3JlcXVlc3QgKnNjc2lfYWxsb2NhdGVfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkJCSAgIGludCBnZnBfbWFzaykKK3sKKwljb25zdCBpbnQgb2Zmc2V0ID0gQUxJR04oc2l6ZW9mKHN0cnVjdCBzY3NpX3JlcXVlc3QpLCA0KTsKKwljb25zdCBpbnQgc2l6ZSA9IG9mZnNldCArIHNpemVvZihzdHJ1Y3QgcmVxdWVzdCk7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKKyAgCisJc3JlcSA9IGttYWxsb2Moc2l6ZSwgZ2ZwX21hc2spOworCWlmIChsaWtlbHkoc3JlcSAhPSBOVUxMKSkgeworCQltZW1zZXQoc3JlcSwgMCwgc2l6ZSk7CisJCXNyZXEtPnNyX3JlcXVlc3QgPSAoc3RydWN0IHJlcXVlc3QgKikoKChjaGFyICopc3JlcSkgKyBvZmZzZXQpOworCQlzcmVxLT5zcl9kZXZpY2UgPSBzZGV2OworCQlzcmVxLT5zcl9ob3N0ID0gc2Rldi0+aG9zdDsKKwkJc3JlcS0+c3JfbWFnaWMgPSBTQ1NJX1JFUV9NQUdJQzsKKwkJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfQklESVJFQ1RJT05BTDsKKwl9CisKKwlyZXR1cm4gc3JlcTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KTsKKwordm9pZCBfX3Njc2lfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcSA9IHNyZXEtPnNyX3JlcXVlc3Q7CisKKwkvKiB1bmxpa2VseSBiZWNhdXNlIHRoZSB0YWcgd2FzIHVzdWFsbHkgZW5kZWQgZWFybGllciBieSB0aGUKKwkgKiBtaWQtbGF5ZXIuIEhvd2V2ZXIsIGZvciBsYXllcmluZyByZWFzb25zIFVMRCdzIGRvbid0IGVuZAorCSAqIHRoZSB0YWcgb2YgY29tbWFuZHMgdGhleSBnZW5lcmF0ZS4gKi8KKwlpZiAodW5saWtlbHkoYmxrX3JxX3RhZ2dlZChyZXEpKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHJlcS0+cTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWJsa19xdWV1ZV9lbmRfdGFnKHEsIHJlcSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCX0KKworCisJaWYgKGxpa2VseShzcmVxLT5zcl9jb21tYW5kICE9IE5VTEwpKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNyZXEtPnNyX2NvbW1hbmQ7CisKKwkJc3JlcS0+c3JfY29tbWFuZCA9IE5VTEw7CisJCXNjc2lfbmV4dF9jb21tYW5kKGNtZCk7CisJfQorfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfcmVsZWFzZV9yZXF1ZXN0CisgKgorICogUHVycG9zZTogICAgIFJlbGVhc2UgYSByZXF1ZXN0IGRlc2NyaXB0b3IuCisgKgorICogQXJndW1lbnRzOiAgIHNyZXEgICAgLSByZXF1ZXN0IHRvIHJlbGVhc2UKKyAqCisgKiBMb2NrIHN0YXR1czogTm8gbG9ja3MgYXNzdW1lZCB0byBiZSBoZWxkLiAgVGhpcyBmdW5jdGlvbiBpcyBTTVAtc2FmZS4KKyAqLwordm9pZCBzY3NpX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxKQoreworCV9fc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CisJa2ZyZWUoc3JlcSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVsZWFzZV9yZXF1ZXN0KTsKKworc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCB7CisJa21lbV9jYWNoZV90CSpzbGFiOworCXVuc2lnbmVkIGludAl1c2VyczsKKwljaGFyCQkqbmFtZTsKKwl1bnNpZ25lZCBpbnQJc2xhYl9mbGFnczsKKwl1bnNpZ25lZCBpbnQJZ2ZwX21hc2s7Cit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCBzY3NpX2NtZF9wb29sID0geworCS5uYW1lCQk9ICJzY3NpX2NtZF9jYWNoZSIsCisJLnNsYWJfZmxhZ3MJPSBTTEFCX0hXQ0FDSEVfQUxJR04sCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF9jbWRfcG9vbCBzY3NpX2NtZF9kbWFfcG9vbCA9IHsKKwkubmFtZQkJPSAic2NzaV9jbWRfY2FjaGUoRE1BKSIsCisJLnNsYWJfZmxhZ3MJPSBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9DQUNIRV9ETUEsCisJLmdmcF9tYXNrCT0gX19HRlBfRE1BLAorfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoaG9zdF9jbWRfcG9vbF9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9jbW5kICpfX3Njc2lfZ2V0X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJCSAgICBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJY21kID0ga21lbV9jYWNoZV9hbGxvYyhzaG9zdC0+Y21kX3Bvb2wtPnNsYWIsCisJCQlnZnBfbWFzayB8IHNob3N0LT5jbWRfcG9vbC0+Z2ZwX21hc2spOworCisJaWYgKHVubGlrZWx5KCFjbWQpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOworCQlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZzaG9zdC0+ZnJlZV9saXN0KSkpIHsKKwkJCWNtZCA9IGxpc3RfZW50cnkoc2hvc3QtPmZyZWVfbGlzdC5uZXh0LAorCQkJCQkgc3RydWN0IHNjc2lfY21uZCwgbGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZjbWQtPmxpc3QpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBjbWQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJc2NzaV9nZXRfY29tbWFuZCgpCisgKgorICogUHVycG9zZToJQWxsb2NhdGUgYW5kIHNldHVwIGEgc2NzaSBjb21tYW5kIGJsb2NrCisgKgorICogQXJndW1lbnRzOglkZXYJLSBwYXJlbnQgc2NzaSBkZXZpY2UKKyAqCQlnZnBfbWFzay0gYWxsb2NhdG9yIGZsYWdzCisgKgorICogUmV0dXJuczoJVGhlIGFsbG9jYXRlZCBzY3NpIGNvbW1hbmQgc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2dldF9jb21tYW5kKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJLyogQmFpbCBpZiB3ZSBjYW4ndCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGRldmljZSAqLworCWlmICghZ2V0X2RldmljZSgmZGV2LT5zZGV2X2dlbmRldikpCisJCXJldHVybiBOVUxMOworCisJY21kID0gX19zY3NpX2dldF9jb21tYW5kKGRldi0+aG9zdCwgZ2ZwX21hc2spOworCisJaWYgKGxpa2VseShjbWQgIT0gTlVMTCkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCQljbWQtPmRldmljZSA9IGRldjsKKwkJY21kLT5zdGF0ZSA9IFNDU0lfU1RBVEVfVU5VU0VEOworCQljbWQtPm93bmVyID0gU0NTSV9PV05FUl9OT0JPRFk7CisJCWluaXRfdGltZXIoJmNtZC0+ZWhfdGltZW91dCk7CisJCUlOSVRfTElTVF9IRUFEKCZjbWQtPmxpc3QpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmY21kLT5saXN0LCAmZGV2LT5jbWRfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bGlzdF9sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCXB1dF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpOworCisJcmV0dXJuIGNtZDsKK30JCQkJCitFWFBPUlRfU1lNQk9MKHNjc2lfZ2V0X2NvbW1hbmQpOworCisvKgorICogRnVuY3Rpb246CXNjc2lfcHV0X2NvbW1hbmQoKQorICoKKyAqIFB1cnBvc2U6CUZyZWUgYSBzY3NpIGNvbW1hbmQgYmxvY2sKKyAqCisgKiBBcmd1bWVudHM6CWNtZAktIGNvbW1hbmQgYmxvY2sgdG8gZnJlZQorICoKKyAqIFJldHVybnM6CU5vdGhpbmcuCisgKgorICogTm90ZXM6CVRoZSBjb21tYW5kIG11c3Qgbm90IGJlbG9uZyB0byBhbnkgbGlzdHMuCisgKi8KK3ZvaWQgc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJLyogc2VyaW91cyBlcnJvciBpZiB0aGUgY29tbWFuZCBoYXNuJ3QgY29tZSBmcm9tIGEgZGV2aWNlIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT5kZXZpY2UtPmxpc3RfbG9jaywgZmxhZ3MpOworCUJVR19PTihsaXN0X2VtcHR5KCZjbWQtPmxpc3QpKTsKKwlsaXN0X2RlbF9pbml0KCZjbWQtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZjbWQtPmRldmljZS0+bGlzdF9sb2NrKTsKKwkvKiBjaGFuZ2luZyBsb2NrcyBoZXJlLCBkb24ndCBuZWVkIHRvIHJlc3RvcmUgdGhlIGlycSBzdGF0ZSAqLworCXNwaW5fbG9jaygmc2hvc3QtPmZyZWVfbGlzdF9sb2NrKTsKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmc2hvc3QtPmZyZWVfbGlzdCkpKSB7CisJCWxpc3RfYWRkKCZjbWQtPmxpc3QsICZzaG9zdC0+ZnJlZV9saXN0KTsKKwkJY21kID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAobGlrZWx5KGNtZCAhPSBOVUxMKSkKKwkJa21lbV9jYWNoZV9mcmVlKHNob3N0LT5jbWRfcG9vbC0+c2xhYiwgY21kKTsKKworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9wdXRfY29tbWFuZCk7CisKKy8qCisgKiBGdW5jdGlvbjoJc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0KCkKKyAqCisgKiBQdXJwb3NlOglTZXR1cCB0aGUgY29tbWFuZCBmcmVlbGlzdCBmb3IgYSBzY3NpIGhvc3QuCisgKgorICogQXJndW1lbnRzOglzaG9zdAktIGhvc3QgdG8gYWxsb2NhdGUgdGhlIGZyZWVsaXN0IGZvci4KKyAqCisgKiBSZXR1cm5zOglOb3RoaW5nLgorICovCitpbnQgc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgKnBvb2w7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJc3Bpbl9sb2NrX2luaXQoJnNob3N0LT5mcmVlX2xpc3RfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5mcmVlX2xpc3QpOworCisJLyoKKwkgKiBTZWxlY3QgYSBjb21tYW5kIHNsYWIgZm9yIHRoaXMgaG9zdCBhbmQgY3JlYXRlIGl0IGlmIG5vdAorCSAqIHlldCBleGlzdGFudC4KKwkgKi8KKwlkb3duKCZob3N0X2NtZF9wb29sX211dGV4KTsKKwlwb29sID0gKHNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA/ICZzY3NpX2NtZF9kbWFfcG9vbCA6ICZzY3NpX2NtZF9wb29sKTsKKwlpZiAoIXBvb2wtPnVzZXJzKSB7CisJCXBvb2wtPnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShwb29sLT5uYW1lLAorCQkJCXNpemVvZihzdHJ1Y3Qgc2NzaV9jbW5kKSwgMCwKKwkJCQlwb29sLT5zbGFiX2ZsYWdzLCBOVUxMLCBOVUxMKTsKKwkJaWYgKCFwb29sLT5zbGFiKQorCQkJZ290byBmYWlsOworCX0KKworCXBvb2wtPnVzZXJzKys7CisJc2hvc3QtPmNtZF9wb29sID0gcG9vbDsKKwl1cCgmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisKKwkvKgorCSAqIEdldCBvbmUgYmFja3VwIGNvbW1hbmQgZm9yIHRoaXMgaG9zdC4KKwkgKi8KKwljbWQgPSBrbWVtX2NhY2hlX2FsbG9jKHNob3N0LT5jbWRfcG9vbC0+c2xhYiwKKwkJCUdGUF9LRVJORUwgfCBzaG9zdC0+Y21kX3Bvb2wtPmdmcF9tYXNrKTsKKwlpZiAoIWNtZCkKKwkJZ290byBmYWlsMjsKKwlsaXN0X2FkZCgmY21kLT5saXN0LCAmc2hvc3QtPmZyZWVfbGlzdCk7CQkKKwlyZXR1cm4gMDsKKworIGZhaWwyOgorCWlmICghLS1wb29sLT51c2VycykKKwkJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPnNsYWIpOworCXJldHVybiAtRU5PTUVNOworIGZhaWw6CisJdXAoJmhvc3RfY21kX3Bvb2xfbXV0ZXgpOworCXJldHVybiAtRU5PTUVNOworCit9CisKKy8qCisgKiBGdW5jdGlvbjoJc2NzaV9kZXN0cm95X2NvbW1hbmRfZnJlZWxpc3QoKQorICoKKyAqIFB1cnBvc2U6CVJlbGVhc2UgdGhlIGNvbW1hbmQgZnJlZWxpc3QgZm9yIGEgc2NzaSBob3N0LgorICoKKyAqIEFyZ3VtZW50czoJc2hvc3QJLSBob3N0IHRoYXQncyBmcmVlbGlzdCBpcyBnb2luZyB0byBiZSBkZXN0cm95ZWQKKyAqLwordm9pZCBzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnNob3N0LT5mcmVlX2xpc3QpKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKworCQljbWQgPSBsaXN0X2VudHJ5KHNob3N0LT5mcmVlX2xpc3QubmV4dCwgc3RydWN0IHNjc2lfY21uZCwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmNtZC0+bGlzdCk7CisJCWttZW1fY2FjaGVfZnJlZShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIsIGNtZCk7CisJfQorCisJZG93bigmaG9zdF9jbWRfcG9vbF9tdXRleCk7CisJaWYgKCEtLXNob3N0LT5jbWRfcG9vbC0+dXNlcnMpCisJCWttZW1fY2FjaGVfZGVzdHJveShzaG9zdC0+Y21kX3Bvb2wtPnNsYWIpOworCXVwKCZob3N0X2NtZF9wb29sX211dGV4KTsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKK3ZvaWQgc2NzaV9sb2dfc2VuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdW5zaWduZWQgaW50IGxldmVsOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCS8qCisJICogSWYgTUwgUVVFVUUgbG9nIGxldmVsIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bzoKKwkgKgorCSAqIDE6IG5vdGhpbmcgKG1hdGNoIGNvbXBsZXRpb24pCisJICoKKwkgKiAyOiBsb2cgb3Bjb2RlICsgY29tbWFuZCBvZiBhbGwgY29tbWFuZHMKKwkgKgorCSAqIDM6IHNhbWUgYXMgMiBwbHVzIGR1bXAgY21kIGFkZHJlc3MKKwkgKgorCSAqIDQ6IHNhbWUgYXMgMyBwbHVzIGR1bXAgZXh0cmEganVuaworCSAqLworCWlmICh1bmxpa2VseShzY3NpX2xvZ2dpbmdfbGV2ZWwpKSB7CisJCWxldmVsID0gU0NTSV9MT0dfTEVWRUwoU0NTSV9MT0dfTUxRVUVVRV9TSElGVCwKKwkJCQkgICAgICAgU0NTSV9MT0dfTUxRVUVVRV9CSVRTKTsKKwkJaWYgKGxldmVsID4gMSkgeworCQkJc2RldiA9IGNtZC0+ZGV2aWNlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSA8JWQ6JWQ6JWQ6JWQ+IHNlbmQgIiwKKwkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwKKwkJCSAgICAgICBzZGV2LT5sdW4pOworCQkJaWYgKGxldmVsID4gMikKKwkJCQlwcmludGsoIjB4JXAgIiwgY21kKTsKKwkJCS8qCisJCQkgKiBzcGFjZXMgdG8gbWF0Y2ggZGlzcG9zaXRpb24gYW5kIGNtZC0+cmVzdWx0CisJCQkgKiBvdXRwdXQgaW4gc2NzaV9sb2dfY29tcGxldGlvbi4KKwkJCSAqLworCQkJcHJpbnRrKCIgICAgICAgICAgICAgICAgICIpOworCQkJc2NzaV9wcmludF9jb21tYW5kKGNtZCk7CisJCQlpZiAobGV2ZWwgPiAzKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVmZmVyID0gMHglcCwgYnVmZmxlbiA9ICVkLCIKKwkJCQkgICAgICAgIiBkb25lID0gMHglcCwgcXVldWVjb21tYW5kIDB4JXBcbiIsCisJCQkJCWNtZC0+YnVmZmVyLCBjbWQtPmJ1ZmZsZW4sCisJCQkJCWNtZC0+ZG9uZSwKKwkJCQkJc2Rldi0+aG9zdC0+aG9zdHQtPnF1ZXVlY29tbWFuZCk7CisKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBzY3NpX2xvZ19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IGRpc3Bvc2l0aW9uKQoreworCXVuc2lnbmVkIGludCBsZXZlbDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwkvKgorCSAqIElmIE1MIENPTVBMRVRFIGxvZyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG86CisJICoKKwkgKiAxOiBsb2cgZGlzcG9zaXRpb24sIHJlc3VsdCwgb3Bjb2RlICsgY29tbWFuZCwgYW5kIGNvbmRpdGlvbmFsbHkKKwkgKiBzZW5zZSBkYXRhIGZvciBmYWlsdXJlcyBvciBub24gU1VDQ0VTUyBkaXNwb3NpdGlvbnMuCisJICoKKwkgKiAyOiBzYW1lIGFzIDEgYnV0IGZvciBhbGwgY29tbWFuZCBjb21wbGV0aW9ucy4KKwkgKgorCSAqIDM6IHNhbWUgYXMgMiBwbHVzIGR1bXAgY21kIGFkZHJlc3MKKwkgKgorCSAqIDQ6IHNhbWUgYXMgMyBwbHVzIGR1bXAgZXh0cmEganVuaworCSAqLworCWlmICh1bmxpa2VseShzY3NpX2xvZ2dpbmdfbGV2ZWwpKSB7CisJCWxldmVsID0gU0NTSV9MT0dfTEVWRUwoU0NTSV9MT0dfTUxDT01QTEVURV9TSElGVCwKKwkJCQkgICAgICAgU0NTSV9MT0dfTUxDT01QTEVURV9CSVRTKTsKKwkJaWYgKCgobGV2ZWwgPiAwKSAmJiAoY21kLT5yZXN1bHQgfHwgZGlzcG9zaXRpb24gIT0gU1VDQ0VTUykpIHx8CisJCSAgICAobGV2ZWwgPiAxKSkgeworCQkJc2RldiA9IGNtZC0+ZGV2aWNlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSA8JWQ6JWQ6JWQ6JWQ+IGRvbmUgIiwKKwkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwKKwkJCSAgICAgICBzZGV2LT5sdW4pOworCQkJaWYgKGxldmVsID4gMikKKwkJCQlwcmludGsoIjB4JXAgIiwgY21kKTsKKwkJCS8qCisJCQkgKiBEdW1wIHRydW5jYXRlZCB2YWx1ZXMsIHNvIHdlIHVzdWFsbHkgZml0IHdpdGhpbgorCQkJICogODAgY2hhcnMuCisJCQkgKi8KKwkJCXN3aXRjaCAoZGlzcG9zaXRpb24pIHsKKwkJCWNhc2UgU1VDQ0VTUzoKKwkJCQlwcmludGsoIlNVQ0NFU1MiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTkVFRFNfUkVUUlk6CisJCQkJcHJpbnRrKCJSRVRSWSAgIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFERF9UT19NTFFVRVVFOgorCQkJCXByaW50aygiTUxRVUVVRSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBGQUlMRUQ6CisJCQkJcHJpbnRrKCJGQUlMRUQgIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJTUVPVVRfRVJST1I6CisJCQkJLyogCisJCQkJICogSWYgY2FsbGVkIHZpYSBzY3NpX3RpbWVzX291dC4KKwkJCQkgKi8KKwkJCQlwcmludGsoIlRJTUVPVVQiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCJVTktOT1dOIik7CisJCQl9CisJCQlwcmludGsoIiAlOHggIiwgY21kLT5yZXN1bHQpOworCQkJc2NzaV9wcmludF9jb21tYW5kKGNtZCk7CisJCQlpZiAoc3RhdHVzX2J5dGUoY21kLT5yZXN1bHQpICYgQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQkJLyoKKwkJCQkgKiBYWFggVGhlIHByaW50X3NlbnNlIGZvcm1hdHRpbmcvcHJlZml4CisJCQkJICogZG9lc24ndCBtYXRjaCB0aGlzIGZ1bmN0aW9uLgorCQkJCSAqLworCQkJCXNjc2lfcHJpbnRfc2Vuc2UoIiIsIGNtZCk7CisJCQl9CisJCQlpZiAobGV2ZWwgPiAzKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBob3N0IGJ1c3kgJWQgZmFpbGVkICVkXG4iLAorCQkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X2J1c3ksCisJCQkJICAgICAgIHNkZXYtPmhvc3QtPmhvc3RfZmFpbGVkKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZgorCisvKiAKKyAqIEFzc2lnbiBhIHNlcmlhbCBudW1iZXIgYW5kIHBpZCB0byB0aGUgcmVxdWVzdCBmb3IgZXJyb3IgcmVjb3ZlcnkKKyAqIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMuICBQcm90ZWN0ZWQgYnkgdGhlIEhvc3RfTG9jayBvZiBob3N0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9jbWRfZ2V0X3NlcmlhbChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJY21kLT5zZXJpYWxfbnVtYmVyID0gaG9zdC0+Y21kX3NlcmlhbF9udW1iZXIrKzsKKwlpZiAoY21kLT5zZXJpYWxfbnVtYmVyID09IDApIAorCQljbWQtPnNlcmlhbF9udW1iZXIgPSBob3N0LT5jbWRfc2VyaWFsX251bWJlcisrOworCQorCWNtZC0+cGlkID0gaG9zdC0+Y21kX3BpZCsrOworCWlmIChjbWQtPnBpZCA9PSAwKQorCQljbWQtPnBpZCA9IGhvc3QtPmNtZF9waWQrKzsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX2Rpc3BhdGNoX2NvbW1hbmQKKyAqCisgKiBQdXJwb3NlOiAgICAgRGlzcGF0Y2ggYSBjb21tYW5kIHRvIHRoZSBsb3ctbGV2ZWwgZHJpdmVyLgorICoKKyAqIEFyZ3VtZW50czogICBjbWQgLSBjb21tYW5kIGJsb2NrIHdlIGFyZSBkaXNwYXRjaGluZy4KKyAqCisgKiBOb3RlczoKKyAqLworaW50IHNjc2lfZGlzcGF0Y2hfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBydG4gPSAwOworCisJLyogY2hlY2sgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB1c2FibGUgKi8KKwlpZiAodW5saWtlbHkoY21kLT5kZXZpY2UtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwpKSB7CisJCS8qIGluIFNERVZfREVMIHdlIGVycm9yIGFsbCBjb21tYW5kcy4gRElEX05PX0NPTk5FQ1QKKwkJICogcmV0dXJucyBhbiBpbW1lZGlhdGUgZXJyb3IgdXB3YXJkcywgYW5kIHNpZ25hbHMKKwkJICogdGhhdCB0aGUgZGV2aWNlIGlzIG5vIGxvbmdlciBwcmVzZW50ICovCisJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb3JlcXVlc3RfY250KTsKKwkJc2NzaV9kb25lKGNtZCk7CisJCS8qIHJldHVybiAwIChiZWNhdXNlIHRoZSBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZCkgKi8KKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzY3NpIGxsZCBwdXQgdGhpcyBkZXZpY2UgaW50byBzdGF0ZSBTREVWX0JMT0NLLiAqLworCWlmICh1bmxpa2VseShjbWQtPmRldmljZS0+c2Rldl9zdGF0ZSA9PSBTREVWX0JMT0NLKSkgeworCQkvKiAKKwkJICogaW4gU0RFVl9CTE9DSywgdGhlIGNvbW1hbmQgaXMganVzdCBwdXQgYmFjayBvbiB0aGUgZGV2aWNlCisJCSAqIHF1ZXVlLiAgVGhlIHN1c3BlbmQgc3RhdGUgaGFzIGFscmVhZHkgYmxvY2tlZCB0aGUgcXVldWUgc28KKwkJICogZnV0dXJlIHJlcXVlc3RzIHNob3VsZCBub3Qgb2NjdXIgdW50aWwgdGhlIGRldmljZSAKKwkJICogdHJhbnNpdGlvbnMgb3V0IG9mIHRoZSBzdXNwZW5kIHN0YXRlLgorCQkgKi8KKwkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpOworCisJCVNDU0lfTE9HX01MUVVFVUUoMywgcHJpbnRrKCJxdWV1ZWNvbW1hbmQgOiBkZXZpY2UgYmxvY2tlZCBcbiIpKTsKKworCQkvKgorCQkgKiBOT1RFOiBydG4gaXMgc3RpbGwgemVybyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0aGUKKwkJICogcXVldWUgdG8gYmUgcGx1Z2dlZCBvbiByZXR1cm4gKGl0J3MgYWxyZWFkeSBzdG9wcGVkKQorCQkgKi8KKwkJZ290byBvdXQ7CisJfQorCisJLyogCisJICogSWYgU0NTSS0yIG9yIGxvd2VyLCBzdG9yZSB0aGUgTFVOIHZhbHVlIGluIGNtbmQuCisJICovCisJaWYgKGNtZC0+ZGV2aWNlLT5zY3NpX2xldmVsIDw9IFNDU0lfMikgeworCQljbWQtPmNtbmRbMV0gPSAoY21kLT5jbW5kWzFdICYgMHgxZikgfAorCQkJICAgICAgIChjbWQtPmRldmljZS0+bHVuIDw8IDUgJiAweGUwKTsKKwl9CisKKwkvKgorCSAqIFdlIHdpbGwgd2FpdCBNSU5fUkVTRVRfREVMQVkgY2xvY2sgdGlja3MgYWZ0ZXIgdGhlIGxhc3QgcmVzZXQgc28KKwkgKiB3ZSBjYW4gYXZvaWQgdGhlIGRyaXZlIG5vdCBiZWluZyByZWFkeS4KKwkgKi8KKwl0aW1lb3V0ID0gaG9zdC0+bGFzdF9yZXNldCArIE1JTl9SRVNFVF9ERUxBWTsKKworCWlmIChob3N0LT5yZXNldHRpbmcgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaW50IHRpY2tzX3JlbWFpbmluZyA9IHRpbWVvdXQgLSBqaWZmaWVzOworCQkvKgorCQkgKiBOT1RFOiBUaGlzIG1heSBiZSBleGVjdXRlZCBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQKKwkJICogaGFuZGxlciEgIFRoaXMgaXMgYmFkLCBidXQgZm9yIG5vdywgaXQnbGwgZG8uICBUaGUgaXJxCisJCSAqIGxldmVsIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgYmVlbiBtYXNrZWQgb3V0IGJ5IHRoZQorCQkgKiBwbGF0Zm9ybSBkZXBlbmRlbnQgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgYWxyZWFkeSwgc28gdGhlCisJCSAqIHN0aSgpIGhlcmUgd2lsbCBub3QgY2F1c2UgYW5vdGhlciBjYWxsIHRvIHRoZSBTQ1NJIGhvc3QncworCQkgKiBpbnRlcnJ1cHQgaGFuZGxlciAoYXNzdW1pbmcgdGhlcmUgaXMgb25lIGlycS1sZXZlbCBwZXIKKwkJICogaG9zdCkuCisJCSAqLworCQl3aGlsZSAoLS10aWNrc19yZW1haW5pbmcgPj0gMCkKKwkJCW1kZWxheSgxICsgOTk5IC8gSFopOworCQlob3N0LT5yZXNldHRpbmcgPSAwOworCX0KKworCS8qIAorCSAqIEFLOiB1bmxpa2VseSByYWNlIGhlcmU6IGZvciBzb21lIHJlYXNvbiB0aGUgdGltZXIgY291bGQKKwkgKiBleHBpcmUgYmVmb3JlIHRoZSBzZXJpYWwgbnVtYmVyIGlzIHNldCB1cCBiZWxvdy4KKwkgKi8KKwlzY3NpX2FkZF90aW1lcihjbWQsIGNtZC0+dGltZW91dF9wZXJfY29tbWFuZCwgc2NzaV90aW1lc19vdXQpOworCisJc2NzaV9sb2dfc2VuZChjbWQpOworCisJLyoKKwkgKiBXZSB3aWxsIHVzZSBhIHF1ZXVlZCBjb21tYW5kIGlmIHBvc3NpYmxlLCBvdGhlcndpc2Ugd2Ugd2lsbAorCSAqIGVtdWxhdGUgdGhlIHF1ZXVpbmcgYW5kIGNhbGxpbmcgb2YgY29tcGxldGlvbiBmdW5jdGlvbiBvdXJzZWx2ZXMuCisJICovCisKKwljbWQtPnN0YXRlID0gU0NTSV9TVEFURV9RVUVVRUQ7CisJY21kLT5vd25lciA9IFNDU0lfT1dORVJfTE9XTEVWRUw7CisKKwlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9yZXF1ZXN0X2NudCk7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSBxdWV1ZSB0aGlzIGNvbW1hbmQsIGNoZWNrIGlmIHRoZSBjb21tYW5kCisJICogbGVuZ3RoIGV4Y2VlZHMgd2hhdCB0aGUgaG9zdCBhZGFwdGVyIGNhbiBoYW5kbGUuCisJICovCisJaWYgKENEQl9TSVpFKGNtZCkgPiBjbWQtPmRldmljZS0+aG9zdC0+bWF4X2NtZF9sZW4pIHsKKwkJU0NTSV9MT0dfTUxRVUVVRSgzLAorCQkJCXByaW50aygicXVldWVjb21tYW5kIDogY29tbWFuZCB0b28gbG9uZy5cbiIpKTsKKwkJY21kLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KTsKKworCQlzY3NpX2RvbmUoY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9jbWRfZ2V0X3NlcmlhbChob3N0LCBjbWQpOyAKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChTSE9TVF9DQU5DRUwsICZob3N0LT5zaG9zdF9zdGF0ZSkpKSB7CisJCWNtZC0+cmVzdWx0ID0gKERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwkJc2NzaV9kb25lKGNtZCk7CisJfSBlbHNlIHsKKwkJcnRuID0gaG9zdC0+aG9zdHQtPnF1ZXVlY29tbWFuZChjbWQsIHNjc2lfZG9uZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHJ0bikgeworCQlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9kb25lX2NudCk7CisJCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwKKwkJCQkocnRuID09IFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWSkgPworCQkJCSBydG4gOiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZKTsKKwkJU0NTSV9MT0dfTUxRVUVVRSgzLAorCQkgICAgcHJpbnRrKCJxdWV1ZWNvbW1hbmQgOiByZXF1ZXN0IHJlamVjdGVkXG4iKSk7CisJfQorCisgb3V0OgorCVNDU0lfTE9HX01MUVVFVUUoMywgcHJpbnRrKCJsZWF2aW5nIHNjc2lfZGlzcGF0Y2hfY21uZCgpXG4iKSk7CisJcmV0dXJuIHJ0bjsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX2luaXRfY21kX2Zyb21fcmVxCisgKgorICogUHVycG9zZTogICAgIFF1ZXVlIGEgU0NTSSBjb21tYW5kCisgKiBQdXJwb3NlOiAgICAgSW5pdGlhbGl6ZSBhIHN0cnVjdCBzY3NpX2NtbmQgZnJvbSBhIHN0cnVjdCBzY3NpX3JlcXVlc3QKKyAqCisgKiBBcmd1bWVudHM6ICAgY21kICAgICAgIC0gY29tbWFuZCBkZXNjcmlwdG9yLgorICogICAgICAgICAgICAgIHNyZXEgICAgICAtIFJlcXVlc3QgZnJvbSB0aGUgcXVldWUuCisgKgorICogTG9jayBzdGF0dXM6IE5vbmUgbmVlZGVkLgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nLgorICoKKyAqIE5vdGVzOiAgICAgICBNYWlubHkgdHJhbnNmZXIgZGF0YSBmcm9tIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSB0byB0aGUKKyAqICAgICAgICAgICAgICBjb21tYW5kIHN0cnVjdHVyZS4gIFRoZSByZXF1ZXN0IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICB1c2luZyB0aGUgbm9ybWFsIG1lbW9yeSBhbGxvY2F0b3IsIGFuZCByZXF1ZXN0cyBjYW4gcGlsZQorICogICAgICAgICAgICAgIHVwIHRvIG1vcmUgb3IgbGVzcyBhbnkgZGVwdGguICBUaGUgY29tbWFuZCBzdHJ1Y3R1cmUgcmVwcmVzZW50cworICogICAgICAgICAgICAgIGEgY29uc3VtYWJsZSByZXNvdXJjZSwgYXMgdGhlc2UgYXJlIGFsbG9jYXRlZCBpbnRvIGEgcG9vbAorICogICAgICAgICAgICAgIHdoZW4gdGhlIFNDU0kgc3Vic3lzdGVtIGluaXRpYWxpemVzLiAgVGhlIHByZWFsbG9jYXRpb24gaXMKKyAqICAgICAgICAgICAgICByZXF1aXJlZCBzbyB0aGF0IGluIGxvdy1tZW1vcnkgc2l0dWF0aW9ucyBhIGRpc2sgSS9PIHJlcXVlc3QKKyAqICAgICAgICAgICAgICB3b24ndCBjYXVzZSB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gdHJ5IGFuZCB3cml0ZSBvdXQgYSBwYWdlLgorICogICAgICAgICAgICAgIFRoZSByZXF1ZXN0IHN0cnVjdHVyZSBpcyBnZW5lcmFsbHkgdXNlZCBieSBpb2N0bHMgYW5kIGNoYXJhY3RlcgorICogICAgICAgICAgICAgIGRldmljZXMuCisgKi8KK3ZvaWQgc2NzaV9pbml0X2NtZF9mcm9tX3JlcShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEpCit7CisJc3JlcS0+c3JfY29tbWFuZCA9IGNtZDsKKworCWNtZC0+b3duZXIgPSBTQ1NJX09XTkVSX01JRExFVkVMOworCWNtZC0+Y21kX2xlbiA9IHNyZXEtPnNyX2NtZF9sZW47CisJY21kLT51c2Vfc2cgPSBzcmVxLT5zcl91c2Vfc2c7CisKKwljbWQtPnJlcXVlc3QgPSBzcmVxLT5zcl9yZXF1ZXN0OworCW1lbWNweShjbWQtPmRhdGFfY21uZCwgc3JlcS0+c3JfY21uZCwgc2l6ZW9mKGNtZC0+ZGF0YV9jbW5kKSk7CisJY21kLT5zZXJpYWxfbnVtYmVyID0gMDsKKwljbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCA9IDA7CisJY21kLT5idWZmbGVuID0gc3JlcS0+c3JfYnVmZmxlbjsKKwljbWQtPmJ1ZmZlciA9IHNyZXEtPnNyX2J1ZmZlcjsKKwljbWQtPnJldHJpZXMgPSAwOworCWNtZC0+YWxsb3dlZCA9IHNyZXEtPnNyX2FsbG93ZWQ7CisJY21kLT5kb25lID0gc3JlcS0+c3JfZG9uZTsKKwljbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSBzcmVxLT5zcl90aW1lb3V0X3Blcl9jb21tYW5kOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbjsKKwljbWQtPnNnbGlzdF9sZW4gPSBzcmVxLT5zcl9zZ2xpc3RfbGVuOworCWNtZC0+dW5kZXJmbG93ID0gc3JlcS0+c3JfdW5kZXJmbG93OworCWNtZC0+c2NfcmVxdWVzdCA9IHNyZXE7CisJbWVtY3B5KGNtZC0+Y21uZCwgc3JlcS0+c3JfY21uZCwgc2l6ZW9mKHNyZXEtPnNyX2NtbmQpKTsKKworCS8qCisJICogWmVybyB0aGUgc2Vuc2UgYnVmZmVyLiAgU29tZSBob3N0IGFkYXB0ZXJzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdAorCSAqIHNlbnNlIG9uIGVycm9yLiAgMCBpcyBub3QgYSB2YWxpZCBzZW5zZSBjb2RlLgorCSAqLworCW1lbXNldChjbWQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKHNyZXEtPnNyX3NlbnNlX2J1ZmZlcikpOworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSBzcmVxLT5zcl9idWZmZXI7CisJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSBzcmVxLT5zcl9idWZmbGVuOworCWNtZC0+b2xkX3VzZV9zZyA9IGNtZC0+dXNlX3NnOworCWlmIChjbWQtPmNtZF9sZW4gPT0gMCkKKwkJY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKGNtZC0+Y21uZFswXSk7CisJY21kLT5vbGRfY21kX2xlbiA9IGNtZC0+Y21kX2xlbjsKKwljbWQtPnNjX29sZF9kYXRhX2RpcmVjdGlvbiA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisJY21kLT5vbGRfdW5kZXJmbG93ID0gY21kLT51bmRlcmZsb3c7CisKKwkvKgorCSAqIFN0YXJ0IHRoZSB0aW1lciB0aWNraW5nLgorCSAqLworCWNtZC0+aW50ZXJuYWxfdGltZW91dCA9IE5PUk1BTF9USU1FT1VUOworCWNtZC0+YWJvcnRfcmVhc29uID0gMDsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwlTQ1NJX0xPR19NTFFVRVVFKDMsIHByaW50aygiTGVhdmluZyBzY3NpX2luaXRfY21kX2Zyb21fcmVxKClcbiIpKTsKK30KKworLyoKKyAqIFBlci1DUFUgSS9PIGNvbXBsZXRpb24gcXVldWUuCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbGlzdF9oZWFkLCBzY3NpX2RvbmVfcSk7CisKKy8qKgorICogc2NzaV9kb25lIC0gRW5xdWV1ZSB0aGUgZmluaXNoZWQgU0NTSSBjb21tYW5kIGludG8gdGhlIGRvbmUgcXVldWUuCisgKiBAY21kOiBUaGUgU0NTSSBDb21tYW5kIGZvciB3aGljaCBhIGxvdy1sZXZlbCBkZXZpY2UgZHJpdmVyIChMTEREKSBnaXZlcworICogb3duZXJzaGlwIGJhY2sgdG8gU0NTSSBDb3JlIC0tIGkuZS4gdGhlIExMREQgaGFzIGZpbmlzaGVkIHdpdGggaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWlkLWxldmVsJ3MgKFNDU0kgQ29yZSkgaW50ZXJydXB0IHJvdXRpbmUsIHdoaWNoCisgKiByZWdhaW5zIG93bmVyc2hpcCBvZiB0aGUgU0NTSSBjb21tYW5kIChkZSBmYWN0bykgZnJvbSBhIExMREQsIGFuZCBlbnF1ZXVlcworICogdGhlIGNvbW1hbmQgdG8gdGhlIGRvbmUgcXVldWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqCisgKiBUaGlzIGlzIHRoZSBwcm9kdWNlciBvZiB0aGUgZG9uZSBxdWV1ZSB3aG8gZW5xdWV1ZXMgYXQgdGhlIHRhaWwuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlcnJ1cHQgY29udGV4dCBzYWZlLgorICovCit2b2lkIHNjc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJLyoKKwkgKiBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgb25lIHRpbWluZyBvdXQgYW55IG1vcmUuCisJICogSWYgd2UgYXJlIHVuYWJsZSB0byByZW1vdmUgdGhlIHRpbWVyLCB0aGVuIHRoZSBjb21tYW5kCisJICogaGFzIGFscmVhZHkgdGltZWQgb3V0LiAgSW4gd2hpY2ggY2FzZSwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvCisJICogbGV0IHRoZSB0aW1lb3V0IGZ1bmN0aW9uIHJ1biwgYXMgd2UgaGF2ZSBubyBpZGVhIHdoZXJlIGluIGZhY3QKKwkgKiB0aGF0IGZ1bmN0aW9uIGNvdWxkIHJlYWxseSBiZS4gIEl0IG1pZ2h0IGJlIG9uIGFub3RoZXIgcHJvY2Vzc29yLAorCSAqIGV0YywgZXRjLgorCSAqLworCWlmICghc2NzaV9kZWxldGVfdGltZXIoY21kKSkKKwkJcmV0dXJuOworCV9fc2NzaV9kb25lKGNtZCk7Cit9CisKKy8qIFByaXZhdGUgZW50cnkgdG8gc2NzaV9kb25lKCkgdG8gY29tcGxldGUgYSBjb21tYW5kIHdoZW4gdGhlIHRpbWVyCisgKiBpc24ndCBydW5uaW5nIC0tLSB1c2VkIGJ5IHNjc2lfdGltZXNfb3V0ICovCit2b2lkIF9fc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBTZXQgdGhlIHNlcmlhbCBudW1iZXJzIGJhY2sgdG8gemVybworCSAqLworCWNtZC0+c2VyaWFsX251bWJlciA9IDA7CisJY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgPSAwOworCWNtZC0+c3RhdGUgPSBTQ1NJX1NUQVRFX0JIUVVFVUU7CisJY21kLT5vd25lciA9IFNDU0lfT1dORVJfQkhfSEFORExFUjsKKworCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb2RvbmVfY250KTsKKwlpZiAoY21kLT5yZXN1bHQpCisJCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb2Vycl9jbnQpOworCisJLyoKKwkgKiBOZXh0LCBlbnF1ZXVlIHRoZSBjb21tYW5kIGludG8gdGhlIGRvbmUgcXVldWUuCisJICogSXQgaXMgYSBwZXItQ1BVIHF1ZXVlLCBzbyB3ZSBqdXN0IGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cworCSAqIGFuZCBuZWVkIG5vIHNwaW5sb2NrLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZjbWQtPmVoX2VudHJ5LCAmX19nZXRfY3B1X3ZhcihzY3NpX2RvbmVfcSkpOworCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKFNDU0lfU09GVElSUSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHNjc2lfc29mdGlycSAtIFBlcmZvcm0gcG9zdC1pbnRlcnJ1cHQgcHJvY2Vzc2luZyBvZiBmaW5pc2hlZCBTQ1NJIGNvbW1hbmRzLgorICoKKyAqIFRoaXMgaXMgdGhlIGNvbnN1bWVyIG9mIHRoZSBkb25lIHF1ZXVlLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdpdGggYWxsIGludGVycnVwdHMgZW5hYmxlZC4gIFRoaXMgc2hvdWxkIHJlZHVjZQorICogaW50ZXJydXB0IGxhdGVuY3ksIHN0YWNrIGRlcHRoLCBhbmQgcmVlbnRyYW5jeSBvZiB0aGUgbG93LWxldmVsCisgKiBkcml2ZXJzLgorICovCitzdGF0aWMgdm9pZCBzY3NpX3NvZnRpcnEoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQoreworCWludCBkaXNwb3NpdGlvbjsKKwlMSVNUX0hFQUQobG9jYWxfcSk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxpc3Rfc3BsaWNlX2luaXQoJl9fZ2V0X2NwdV92YXIoc2NzaV9kb25lX3EpLCAmbG9jYWxfcSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9xKSkgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBsaXN0X2VudHJ5KGxvY2FsX3EubmV4dCwKKwkJCQkJCSAgIHN0cnVjdCBzY3NpX2NtbmQsIGVoX2VudHJ5KTsKKwkJbGlzdF9kZWxfaW5pdCgmY21kLT5laF9lbnRyeSk7CisKKwkJZGlzcG9zaXRpb24gPSBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbihjbWQpOworCQlzY3NpX2xvZ19jb21wbGV0aW9uKGNtZCwgZGlzcG9zaXRpb24pOworCQlzd2l0Y2ggKGRpc3Bvc2l0aW9uKSB7CisJCWNhc2UgU1VDQ0VTUzoKKwkJCXNjc2lfZmluaXNoX2NvbW1hbmQoY21kKTsKKwkJCWJyZWFrOworCQljYXNlIE5FRURTX1JFVFJZOgorCQkJc2NzaV9yZXRyeV9jb21tYW5kKGNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBBRERfVE9fTUxRVUVVRToKKwkJCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKCFzY3NpX2VoX3NjbWRfYWRkKGNtZCwgMCkpCisJCQkJc2NzaV9maW5pc2hfY29tbWFuZChjbWQpOworCQl9CisJfQorfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfcmV0cnlfY29tbWFuZAorICoKKyAqIFB1cnBvc2U6ICAgICBTZW5kIGEgY29tbWFuZCBiYWNrIHRvIHRoZSBsb3cgbGV2ZWwgdG8gYmUgcmV0cmllZC4KKyAqCisgKiBOb3RlczogICAgICAgVGhpcyBjb21tYW5kIGlzIGFsd2F5cyBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUKKyAqICAgICAgICAgICAgICBib3R0b20gaGFsZiBoYW5kbGVyLCBvciB0aGUgZXJyb3IgaGFuZGxlciB0aHJlYWQuIExvdworICogICAgICAgICAgICAgIGxldmVsIGRyaXZlcnMgc2hvdWxkIG5vdCBiZWNvbWUgcmUtZW50cmFudCBhcyBhIHJlc3VsdCBvZgorICogICAgICAgICAgICAgIHRoaXMuCisgKi8KK2ludCBzY3NpX3JldHJ5X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCS8qCisJICogUmVzdG9yZSB0aGUgU0NTSSBjb21tYW5kIHN0YXRlLgorCSAqLworCXNjc2lfc2V0dXBfY21kX3JldHJ5KGNtZCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogWmVybyB0aGUgc2Vuc2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCB0aW1lIHdlIHRyaWVkCisgICAgICAgICAqIHRoaXMgY29tbWFuZC4KKyAgICAgICAgICovCisJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKKworCXJldHVybiBzY3NpX3F1ZXVlX2luc2VydChjbWQsIFNDU0lfTUxRVUVVRV9FSF9SRVRSWSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9maW5pc2hfY29tbWFuZAorICoKKyAqIFB1cnBvc2U6ICAgICBQYXNzIGNvbW1hbmQgb2ZmIHRvIHVwcGVyIGxheWVyIGZvciBmaW5pc2hpbmcgb2YgSS9PCisgKiAgICAgICAgICAgICAgcmVxdWVzdCwgd2FraW5nIHByb2Nlc3NlcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHJlc3VsdHMsCisgKiAgICAgICAgICAgICAgZXRjLgorICovCit2b2lkIHNjc2lfZmluaXNoX2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCisJc2NzaV9kZXZpY2VfdW5idXN5KHNkZXYpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBmbGFncyB3aGljaCBzYXkgdGhhdCB0aGUgZGV2aWNlL2hvc3QgaXMgbm8gbG9uZ2VyCisgICAgICAgICAqIGNhcGFibGUgb2YgYWNjZXB0aW5nIG5ldyBjb21tYW5kcy4gIFRoZXNlIGFyZSBzZXQgaW4gc2NzaV9xdWV1ZS5jCisgICAgICAgICAqIGZvciBib3RoIHRoZSBxdWV1ZSBmdWxsIGNvbmRpdGlvbiBvbiBhIGRldmljZSwgYW5kIGZvciBhCisgICAgICAgICAqIGhvc3QgZnVsbCBjb25kaXRpb24gb24gdGhlIGhvc3QuCisJICoKKwkgKiBYWFgoaGNoKTogV2hhdCBhYm91dCBsb2NraW5nPworICAgICAgICAgKi8KKyAgICAgICAgc2hvc3QtPmhvc3RfYmxvY2tlZCA9IDA7CisgICAgICAgIHNkZXYtPmRldmljZV9ibG9ja2VkID0gMDsKKworCS8qCisJICogSWYgd2UgaGF2ZSB2YWxpZCBzZW5zZSBpbmZvcm1hdGlvbiwgdGhlbiBzb21lIGtpbmQgb2YgcmVjb3ZlcnkKKwkgKiBtdXN0IGhhdmUgdGFrZW4gcGxhY2UuICBNYWtlIGEgbm90ZSBvZiB0aGlzLgorCSAqLworCWlmIChTQ1NJX1NFTlNFX1ZBTElEKGNtZCkpCisJCWNtZC0+cmVzdWx0IHw9IChEUklWRVJfU0VOU0UgPDwgMjQpOworCisJU0NTSV9MT0dfTUxDT01QTEVURSg0LCBwcmludGsoIk5vdGlmeWluZyB1cHBlciBkcml2ZXIgb2YgY29tcGxldGlvbiAiCisJCQkJImZvciBkZXZpY2UgJWQgJXhcbiIsIHNkZXYtPmlkLCBjbWQtPnJlc3VsdCkpOworCisJY21kLT5vd25lciA9IFNDU0lfT1dORVJfSElHSExFVkVMOworCWNtZC0+c3RhdGUgPSBTQ1NJX1NUQVRFX0ZJTklTSEVEOworCisJLyoKKwkgKiBXZSBjYW4gZ2V0IGhlcmUgd2l0aCB1c2Vfc2c9MCwgY2F1c2luZyBhIHBhbmljIGluIHRoZSB1cHBlciBsZXZlbAorCSAqLworCWNtZC0+dXNlX3NnID0gY21kLT5vbGRfdXNlX3NnOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhbiBhc3NvY2lhdGVkIHJlcXVlc3Qgc3RydWN0dXJlLCBjb3B5IHRoZSBkYXRhIG92ZXIKKwkgKiBiZWZvcmUgd2UgY2FsbCB0aGUgY29tcGxldGlvbiBmdW5jdGlvbi4KKwkgKi8KKwlzcmVxID0gY21kLT5zY19yZXF1ZXN0OworCWlmIChzcmVxKSB7CisJICAgICAgIHNyZXEtPnNyX3Jlc3VsdCA9IHNyZXEtPnNyX2NvbW1hbmQtPnJlc3VsdDsKKwkgICAgICAgaWYgKHNyZXEtPnNyX3Jlc3VsdCkgeworCQkgICAgICAgbWVtY3B5KHNyZXEtPnNyX3NlbnNlX2J1ZmZlciwKKwkJCSAgICAgIHNyZXEtPnNyX2NvbW1hbmQtPnNlbnNlX2J1ZmZlciwKKwkJCSAgICAgIHNpemVvZihzcmVxLT5zcl9zZW5zZV9idWZmZXIpKTsKKwkgICAgICAgfQorCX0KKworCWNtZC0+ZG9uZShjbWQpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2ZpbmlzaF9jb21tYW5kKTsKKworLyoKKyAqIEZ1bmN0aW9uOglzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aCgpCisgKgorICogUHVycG9zZToJQWxsb3cgbG93IGxldmVsIGRyaXZlcnMgdG8gdGVsbCB1cyB0byBjaGFuZ2UgdGhlIHF1ZXVlIGRlcHRoCisgKiAJCW9uIGEgc3BlY2lmaWMgU0NTSSBkZXZpY2UKKyAqCisgKiBBcmd1bWVudHM6CXNkZXYJLSBTQ1NJIERldmljZSBpbiBxdWVzdGlvbgorICogCQl0YWdnZWQJLSBEbyB3ZSB1c2UgdGFnZ2VkIHF1ZXVlaW5nIChub24tMCkgb3IgZG8gd2UgdHJlYXQKKyAqIAkJCSAgdGhpcyBkZXZpY2UgYXMgYW4gdW50YWdnZWQgZGV2aWNlICgwKQorICogCQl0YWdzCS0gTnVtYmVyIG9mIHRhZ3MgYWxsb3dlZCBpZiB0YWdnZWQgcXVldWVpbmcgZW5hYmxlZCwKKyAqIAkJCSAgb3IgbnVtYmVyIG9mIGNvbW1hbmRzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIGNhbgorICogCQkJICBxdWV1ZSB1cCBpbiBub24tdGFnZ2VkIG1vZGUgKGFzIHBlciBjbWRfcGVyX2x1bikuCisgKgorICogUmV0dXJuczoJTm90aGluZworICoKKyAqIExvY2sgU3RhdHVzOglOb25lIGhlbGQgb24gZW50cnkKKyAqCisgKiBOb3RlczoJTG93IGxldmVsIGRyaXZlcnMgbWF5IGNhbGwgdGhpcyBhdCBhbnkgdGltZSBhbmQgd2Ugd2lsbCBkbworICogCQl0aGUgcmlnaHQgdGhpbmcgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBkZXZpY2UgaXMKKyAqIAkJY3VycmVudGx5IGFjdGl2ZSBhbmQgd2hldGhlciBvciBub3QgaXQgZXZlbiBoYXMgdGhlCisgKiAJCWNvbW1hbmQgYmxvY2tzIGJ1aWx0IHlldC4KKyAqLwordm9pZCBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCB0YWdnZWQsIGludCB0YWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIHJlZnVzZSB0byBzZXQgdGFnZ2VkIGRlcHRoIHRvIGFuIHVud29ya2FibGUgc2l6ZQorCSAqLworCWlmICh0YWdzIDw9IDApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgcXVldWUgaXMgbWFuYWdlZCBieSB0aGUgYmxvY2sgbGF5ZXIKKwkgKiBpZiBpdCBpcywgYW5kIHdlIGZhaWwgdG8gYWRqdXN0IHRoZSBkZXB0aCwgZXhpdCAqLworCWlmIChibGtfcXVldWVfdGFnZ2VkKHNkZXYtPnJlcXVlc3RfcXVldWUpICYmCisJICAgIGJsa19xdWV1ZV9yZXNpemVfdGFncyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCB0YWdzKSAhPSAwKQorCQlnb3RvIG91dDsKKworCXNkZXYtPnF1ZXVlX2RlcHRoID0gdGFnczsKKwlzd2l0Y2ggKHRhZ2dlZCkgeworCQljYXNlIE1TR19PUkRFUkVEX1RBRzoKKwkJCXNkZXYtPm9yZGVyZWRfdGFncyA9IDE7CisJCQlzZGV2LT5zaW1wbGVfdGFncyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBNU0dfU0lNUExFX1RBRzoKKwkJCXNkZXYtPm9yZGVyZWRfdGFncyA9IDA7CisJCQlzZGV2LT5zaW1wbGVfdGFncyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIihzY3NpJWQ6JWQ6JWQ6JWQpICIKKwkJCQkic2NzaV9hZGp1c3RfcXVldWVfZGVwdGgsIGJhZCBxdWV1ZSB0eXBlLCAiCisJCQkJImRpc2FibGVkXG4iLCBzZGV2LT5ob3N0LT5ob3N0X25vLAorCQkJCXNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4pOyAKKwkJY2FzZSAwOgorCQkJc2Rldi0+b3JkZXJlZF90YWdzID0gc2Rldi0+c2ltcGxlX3RhZ3MgPSAwOworCQkJc2Rldi0+cXVldWVfZGVwdGggPSB0YWdzOworCQkJYnJlYWs7CisJfQorIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgpOworCisvKgorICogRnVuY3Rpb246CXNjc2lfdHJhY2tfcXVldWVfZnVsbCgpCisgKgorICogUHVycG9zZToJVGhpcyBmdW5jdGlvbiB3aWxsIHRyYWNrIHN1Y2Nlc3NpdmUgUVVFVUVfRlVMTCBldmVudHMgb24gYQorICogCQlzcGVjaWZpYyBTQ1NJIGRldmljZSB0byBkZXRlcm1pbmUgaWYgYW5kIHdoZW4gdGhlcmUgaXMgYQorICogCQluZWVkIHRvIGFkanVzdCB0aGUgcXVldWUgZGVwdGggb24gdGhlIGRldmljZS4KKyAqCisgKiBBcmd1bWVudHM6CXNkZXYJLSBTQ1NJIERldmljZSBpbiBxdWVzdGlvbgorICogCQlkZXB0aAktIEN1cnJlbnQgbnVtYmVyIG9mIG91dHN0YW5kaW5nIFNDU0kgY29tbWFuZHMgb24KKyAqIAkJCSAgdGhpcyBkZXZpY2UsIG5vdCBjb3VudGluZyB0aGUgb25lIHJldHVybmVkIGFzCisgKiAJCQkgIFFVRVVFX0ZVTEwuCisgKgorICogUmV0dXJuczoJMCAtIE5vIGNoYW5nZSBuZWVkZWQKKyAqIAkJPjAgLSBBZGp1c3QgcXVldWUgZGVwdGggdG8gdGhpcyBuZXcgZGVwdGgKKyAqIAkJLTEgLSBEcm9wIGJhY2sgdG8gdW50YWdnZWQgb3BlcmF0aW9uIHVzaW5nIGhvc3QtPmNtZF9wZXJfbHVuCisgKiAJCQlhcyB0aGUgdW50YWdnZWQgY29tbWFuZCBkZXB0aAorICoKKyAqIExvY2sgU3RhdHVzOglOb25lIGhlbGQgb24gZW50cnkKKyAqCisgKiBOb3RlczoJTG93IGxldmVsIGRyaXZlcnMgbWF5IGNhbGwgdGhpcyBhdCBhbnkgdGltZSBhbmQgd2Ugd2lsbCBkbworICogCQkiVGhlIFJpZ2h0IFRoaW5nLiIgIFdlIGFyZSBpbnRlcnJ1cHQgY29udGV4dCBzYWZlLgorICovCitpbnQgc2NzaV90cmFja19xdWV1ZV9mdWxsKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRlcHRoKQoreworCWlmICgoamlmZmllcyA+PiA0KSA9PSBzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfdGltZSkKKwkJcmV0dXJuIDA7CisKKwlzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfdGltZSA9IChqaWZmaWVzID4+IDQpOworCWlmIChzZGV2LT5sYXN0X3F1ZXVlX2Z1bGxfZGVwdGggIT0gZGVwdGgpIHsKKwkJc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX2NvdW50ID0gMTsKKwkJc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX2RlcHRoID0gZGVwdGg7CisJfSBlbHNlIHsKKwkJc2Rldi0+bGFzdF9xdWV1ZV9mdWxsX2NvdW50Kys7CisJfQorCisJaWYgKHNkZXYtPmxhc3RfcXVldWVfZnVsbF9jb3VudCA8PSAxMCkKKwkJcmV0dXJuIDA7CisJaWYgKHNkZXYtPmxhc3RfcXVldWVfZnVsbF9kZXB0aCA8IDgpIHsKKwkJLyogRHJvcCBiYWNrIHRvIHVudGFnZ2VkICovCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIDAsIHNkZXYtPmhvc3QtPmNtZF9wZXJfbHVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwlpZiAoc2Rldi0+b3JkZXJlZF90YWdzKQorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfT1JERVJFRF9UQUcsIGRlcHRoKTsKKwllbHNlCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19TSU1QTEVfVEFHLCBkZXB0aCk7CisJcmV0dXJuIGRlcHRoOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwpOworCisvKioKKyAqIHNjc2lfZGV2aWNlX2dldCAgLSAgZ2V0IGFuIGFkZGl0aW9uIHJlZmVyZW5jZSB0byBhIHNjc2lfZGV2aWNlCisgKiBAc2RldjoJZGV2aWNlIHRvIGdldCBhIHJlZmVyZW5jZSB0bworICoKKyAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHNjc2lfZGV2aWNlIGFuZCBpbmNyZW1lbnRzIHRoZSB1c2UgY291bnQKKyAqIG9mIHRoZSB1bmRlcmx5aW5nIExMREQgbW9kdWxlLiAgWW91IG11c3QgaG9sZCBob3N0X2xvY2sgb2YgdGhlCisgKiBwYXJlbnQgU2NzaV9Ib3N0IG9yIGFscmVhZHkgaGF2ZSBhIHJlZmVyZW5jZSB3aGVuIGNhbGxpbmcgdGhpcy4KKyAqLworaW50IHNjc2lfZGV2aWNlX2dldChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwgfHwgc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0NBTkNFTCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNkZXYtPmhvc3QtPmhvc3R0LT5tb2R1bGUpKSB7CisJCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX2dldCk7CisKKy8qKgorICogc2NzaV9kZXZpY2VfcHV0ICAtICByZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGEgc2NzaV9kZXZpY2UKKyAqIEBzZGV2OglkZXZpY2UgdG8gcmVsZWFzZSBhIHJlZmVyZW5jZSBvbi4KKyAqCisgKiBSZWxlYXNlIGEgcmVmZXJlbmNlIHRvIHRoZSBzY3NpX2RldmljZSBhbmQgZGVjcmVtZW50cyB0aGUgdXNlIGNvdW50CisgKiBvZiB0aGUgdW5kZXJseWluZyBMTEREIG1vZHVsZS4gIFRoZSBkZXZpY2UgaXMgZnJlZWQgb25jZSB0aGUgbGFzdAorICogdXNlciB2YW5pc2hlcy4KKyAqLwordm9pZCBzY3NpX2RldmljZV9wdXQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCW1vZHVsZV9wdXQoc2Rldi0+aG9zdC0+aG9zdHQtPm1vZHVsZSk7CisJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RldmljZV9wdXQpOworCisvKiBoZWxwZXIgZm9yIHNob3N0X2Zvcl9lYWNoX2RldmljZSwgdGh1cyBub3QgZG9jdW1lbnRlZCAqLworc3RydWN0IHNjc2lfZGV2aWNlICpfX3Njc2lfaXRlcmF0ZV9kZXZpY2VzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCQkgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnByZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9IChwcmV2ID8gJnByZXYtPnNpYmxpbmdzIDogJnNob3N0LT5fX2RldmljZXMpOworCXN0cnVjdCBzY3NpX2RldmljZSAqbmV4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAobGlzdC0+bmV4dCAhPSAmc2hvc3QtPl9fZGV2aWNlcykgeworCQluZXh0ID0gbGlzdF9lbnRyeShsaXN0LT5uZXh0LCBzdHJ1Y3Qgc2NzaV9kZXZpY2UsIHNpYmxpbmdzKTsKKwkJLyogc2tpcCBkZXZpY2VzIHRoYXQgd2UgY2FuJ3QgZ2V0IGEgcmVmZXJlbmNlIHRvICovCisJCWlmICghc2NzaV9kZXZpY2VfZ2V0KG5leHQpKQorCQkJYnJlYWs7CisJCW5leHQgPSBOVUxMOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJldikKKwkJc2NzaV9kZXZpY2VfcHV0KHByZXYpOworCXJldHVybiBuZXh0OworfQorRVhQT1JUX1NZTUJPTChfX3Njc2lfaXRlcmF0ZV9kZXZpY2VzKTsKKworLyoqCisgKiBzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSAgLSAgaGVscGVyIHRvIHdhbGsgYWxsIGRldmljZXMgb2YgYSB0YXJnZXQKKyAqIEBzdGFyZ2V0Ogl0YXJnZXQgd2hvc2UgZGV2aWNlcyB3ZSB3YW50IHRvIGl0ZXJhdGUgb3Zlci4KKyAqCisgKiBUaGlzIHRyYXZlcnNlcyBvdmVyIGVhY2ggZGV2aWNlcyBvZiBAc2hvc3QuICBUaGUgZGV2aWNlcyBoYXZlCisgKiBhIHJlZmVyZW5jZSB0aGF0IG11c3QgYmUgcmVsZWFzZWQgYnkgc2NzaV9ob3N0X3B1dCB3aGVuIGJyZWFraW5nCisgKiBvdXQgb2YgdGhlIGxvb3AuCisgKi8KK3ZvaWQgc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCB2b2lkICogZGF0YSwKKwkJICAgICB2b2lkICgqZm4pKHN0cnVjdCBzY3NpX2RldmljZSAqLCB2b2lkICopKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQlpZiAoKHNkZXYtPmNoYW5uZWwgPT0gc3RhcmdldC0+Y2hhbm5lbCkgJiYKKwkJICAgIChzZGV2LT5pZCA9PSBzdGFyZ2V0LT5pZCkpCisJCQlmbihzZGV2LCBkYXRhKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKTsKKworLyoqCisgKiBfX3Njc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQgLSBmaW5kIGEgZGV2aWNlIGdpdmVuIHRoZSB0YXJnZXQgKFVOTE9DS0VEKQorICogQHN0YXJnZXQ6CVNDU0kgdGFyZ2V0IHBvaW50ZXIKKyAqIEBsdW46CVNDU0kgTG9naWNhbCBVbml0IE51bWJlcgorICoKKyAqIExvb2tzIHVwIHRoZSBzY3NpX2RldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgQGx1biBmb3IgYSBnaXZlCisgKiBAc3RhcmdldC4gVGhlIHJldHVybmVkIHNjc2lfZGV2aWNlIGRvZXMgbm90IGhhdmUgYW4gYWRkaXRpb25hbAorICogcmVmZXJlbmNlLiAgWW91IG11c3QgaG9sZCB0aGUgaG9zdCdzIGhvc3RfbG9jayBvdmVyIHRoaXMgY2FsbCBhbmQKKyAqIGFueSBhY2Nlc3MgdG8gdGhlIHJldHVybmVkIHNjc2lfZGV2aWNlLgorICoKKyAqIE5vdGU6ICBUaGUgb25seSByZWFzb24gd2h5IGRyaXZlcnMgd291bGQgd2FudCB0byB1c2UgdGhpcyBpcyBiZWNhdXNlCisgKiB0aGV5J3JlIG5lZWQgdG8gYWNjZXNzIHRoZSBkZXZpY2UgbGlzdCBpbiBpcnEgY29udGV4dC4gIE90aGVyd2lzZSB5b3UKKyAqIHJlYWxseSB3YW50IHRvIHVzZSBzY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0IGluc3RlYWQuCisgKiovCitzdHJ1Y3Qgc2NzaV9kZXZpY2UgKl9fc2NzaV9kZXZpY2VfbG9va3VwX2J5X3RhcmdldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsCisJCQkJCQkgICB1aW50IGx1bikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkZXYsICZzdGFyZ2V0LT5kZXZpY2VzLCBzYW1lX3RhcmdldF9zaWJsaW5ncykgeworCQlpZiAoc2Rldi0+bHVuID09bHVuKQorCQkJcmV0dXJuIHNkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9kZXZpY2VfbG9va3VwX2J5X3RhcmdldCk7CisKKy8qKgorICogc2NzaV9kZXZpY2VfbG9va3VwX2J5X3RhcmdldCAtIGZpbmQgYSBkZXZpY2UgZ2l2ZW4gdGhlIHRhcmdldAorICogQHN0YXJnZXQ6CVNDU0kgdGFyZ2V0IHBvaW50ZXIKKyAqIEBsdW46CVNDU0kgTG9naWNhbCBVbml0IE51bWJlcgorICoKKyAqIExvb2tzIHVwIHRoZSBzY3NpX2RldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgQGNoYW5uZWwsIEBpZCwgQGx1biBmb3IgYQorICogZ2l2ZSBob3N0LiAgVGhlIHJldHVybmVkIHNjc2lfZGV2aWNlIGhhcyBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0aGF0CisgKiBuZWVkcyB0byBiZSByZWxlYXNlIHdpdGggc2NzaV9ob3N0X3B1dCBvbmNlIHlvdSdyZSBkb25lIHdpdGggaXQuCisgKiovCitzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LAorCQkJCQkJIHVpbnQgbHVuKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNkZXYgPSBfX3Njc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQoc3RhcmdldCwgbHVuKTsKKwlpZiAoc2RldiAmJiBzY3NpX2RldmljZV9nZXQoc2RldikpCisJCXNkZXYgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHNkZXY7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQpOworCisvKioKKyAqIHNjc2lfZGV2aWNlX2xvb2t1cCAtIGZpbmQgYSBkZXZpY2UgZ2l2ZW4gdGhlIGhvc3QgKFVOTE9DS0VEKQorICogQHNob3N0OglTQ1NJIGhvc3QgcG9pbnRlcgorICogQGNoYW5uZWw6CVNDU0kgY2hhbm5lbCAoemVybyBpZiBvbmx5IG9uZSBjaGFubmVsKQorICogQHB1bjoJU0NTSSB0YXJnZXQgbnVtYmVyIChwaHlzaWNhbCB1bml0IG51bWJlcikKKyAqIEBsdW46CVNDU0kgTG9naWNhbCBVbml0IE51bWJlcgorICoKKyAqIExvb2tzIHVwIHRoZSBzY3NpX2RldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgQGNoYW5uZWwsIEBpZCwgQGx1biBmb3IgYQorICogZ2l2ZSBob3N0LiBUaGUgcmV0dXJuZWQgc2NzaV9kZXZpY2UgZG9lcyBub3QgaGF2ZSBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZS4KKyAqIFlvdSBtdXN0IGhvbGQgdGhlIGhvc3QncyBob3N0X2xvY2sgb3ZlciB0aGlzIGNhbGwgYW5kIGFueSBhY2Nlc3MgdG8gdGhlCisgKiByZXR1cm5lZCBzY3NpX2RldmljZS4KKyAqCisgKiBOb3RlOiAgVGhlIG9ubHkgcmVhc29uIHdoeSBkcml2ZXJzIHdvdWxkIHdhbnQgdG8gdXNlIHRoaXMgaXMgYmVjYXVzZQorICogdGhleSdyZSBuZWVkIHRvIGFjY2VzcyB0aGUgZGV2aWNlIGxpc3QgaW4gaXJxIGNvbnRleHQuICBPdGhlcndpc2UgeW91CisgKiByZWFsbHkgd2FudCB0byB1c2Ugc2NzaV9kZXZpY2VfbG9va3VwIGluc3RlYWQuCisgKiovCitzdHJ1Y3Qgc2NzaV9kZXZpY2UgKl9fc2NzaV9kZXZpY2VfbG9va3VwKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQl1aW50IGNoYW5uZWwsIHVpbnQgaWQsIHVpbnQgbHVuKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RldiwgJnNob3N0LT5fX2RldmljZXMsIHNpYmxpbmdzKSB7CisJCWlmIChzZGV2LT5jaGFubmVsID09IGNoYW5uZWwgJiYgc2Rldi0+aWQgPT0gaWQgJiYKKwkJCQlzZGV2LT5sdW4gPT1sdW4pCisJCQlyZXR1cm4gc2RldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woX19zY3NpX2RldmljZV9sb29rdXApOworCisvKioKKyAqIHNjc2lfZGV2aWNlX2xvb2t1cCAtIGZpbmQgYSBkZXZpY2UgZ2l2ZW4gdGhlIGhvc3QKKyAqIEBzaG9zdDoJU0NTSSBob3N0IHBvaW50ZXIKKyAqIEBjaGFubmVsOglTQ1NJIGNoYW5uZWwgKHplcm8gaWYgb25seSBvbmUgY2hhbm5lbCkKKyAqIEBpZDoJCVNDU0kgdGFyZ2V0IG51bWJlciAocGh5c2ljYWwgdW5pdCBudW1iZXIpCisgKiBAbHVuOglTQ1NJIExvZ2ljYWwgVW5pdCBOdW1iZXIKKyAqCisgKiBMb29rcyB1cCB0aGUgc2NzaV9kZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEBjaGFubmVsLCBAaWQsIEBsdW4gZm9yIGEKKyAqIGdpdmUgaG9zdC4gIFRoZSByZXR1cm5lZCBzY3NpX2RldmljZSBoYXMgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdGhhdAorICogbmVlZHMgdG8gYmUgcmVsZWFzZSB3aXRoIHNjc2lfaG9zdF9wdXQgb25jZSB5b3UncmUgZG9uZSB3aXRoIGl0LgorICoqLworc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldmljZV9sb29rdXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCXVpbnQgY2hhbm5lbCwgdWludCBpZCwgdWludCBsdW4pCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2RldiA9IF9fc2NzaV9kZXZpY2VfbG9va3VwKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuKTsKKwlpZiAoc2RldiAmJiBzY3NpX2RldmljZV9nZXQoc2RldikpCisJCXNkZXYgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHNkZXY7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX2xvb2t1cCk7CisKKy8qKgorICogc2NzaV9kZXZpY2VfY2FuY2VsIC0gY2FuY2VsIG91dHN0YW5kaW5nIElPIHRvIHRoaXMgZGV2aWNlCisgKiBAc2RldjoJUG9pbnRlciB0byBzdHJ1Y3Qgc2NzaV9kZXZpY2UKKyAqIEByZWNvdmVyeToJQm9vbGVhbiBpbnN0cnVjdGluZyBmdW5jdGlvbiB0byByZWNvdmVyIGRldmljZSBvciBub3QuCisgKgorICoqLworaW50IHNjc2lfZGV2aWNlX2NhbmNlbChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCByZWNvdmVyeSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCUxJU1RfSEVBRChhY3RpdmVfbGlzdCk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfQ0FOQ0VMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjbWQsICZzZGV2LT5jbWRfbGlzdCwgbGlzdCkgeworCQlpZiAoc2NtZC0+cmVxdWVzdCAmJiBzY21kLT5yZXF1ZXN0LT5ycV9zdGF0dXMgIT0gUlFfSU5BQ1RJVkUpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgdW5hYmxlIHRvIHJlbW92ZSB0aGUgdGltZXIsIGl0IG1lYW5zCisJCQkgKiB0aGF0IHRoZSBjb21tYW5kIGhhcyBhbHJlYWR5IHRpbWVkIG91dCBvcgorCQkJICogZmluaXNoZWQuCisJCQkgKi8KKwkJCWlmICghc2NzaV9kZWxldGVfdGltZXIoc2NtZCkpCisJCQkJY29udGludWU7CisJCQlsaXN0X2FkZF90YWlsKCZzY21kLT5laF9lbnRyeSwgJmFjdGl2ZV9saXN0KTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmICghbGlzdF9lbXB0eSgmYWN0aXZlX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsICZhY3RpdmVfbGlzdCkgeworCQkJc2NtZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzY3NpX2NtbmQsIGVoX2VudHJ5KTsKKwkJCWxpc3RfZGVsX2luaXQobGgpOworCQkJaWYgKHJlY292ZXJ5KSB7CisJCQkJc2NzaV9laF9zY21kX2FkZChzY21kLCBTQ1NJX0VIX0NBTkNFTF9DTUQpOworCQkJfSBlbHNlIHsKKwkJCQlzY21kLT5yZXN1bHQgPSAoRElEX0FCT1JUIDw8IDE2KTsKKwkJCQlzY3NpX2ZpbmlzaF9jb21tYW5kKHNjbWQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX2NhbmNlbCk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgc2NzaV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCWludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCisJc3dpdGNoKGFjdGlvbikgeworCWNhc2UgQ1BVX0RFQUQ6CisJCS8qIERyYWluIHNjc2lfZG9uZV9xLiAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlsaXN0X3NwbGljZV9pbml0KCZwZXJfY3B1KHNjc2lfZG9uZV9xLCBjcHUpLAorCQkJCSAmX19nZXRfY3B1X3ZhcihzY3NpX2RvbmVfcSkpOworCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihTQ1NJX1NPRlRJUlEpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fZGV2aW5pdGRhdGEgc2NzaV9jcHVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBzY3NpX2NwdV9ub3RpZnksCit9OworCisjZGVmaW5lIHJlZ2lzdGVyX3Njc2lfY3B1KCkgcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZzY3NpX2NwdV9uYikKKyNkZWZpbmUgdW5yZWdpc3Rlcl9zY3NpX2NwdSgpIHVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZzY3NpX2NwdV9uYikKKyNlbHNlCisjZGVmaW5lIHJlZ2lzdGVyX3Njc2lfY3B1KCkKKyNkZWZpbmUgdW5yZWdpc3Rlcl9zY3NpX2NwdSgpCisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBjb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShzY3NpX2xvZ2dpbmdfbGV2ZWwsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Moc2NzaV9sb2dnaW5nX2xldmVsLCAiYSBiaXQgbWFzayBvZiBsb2dnaW5nIGxldmVscyIpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Njc2kodm9pZCkKK3sKKwlpbnQgZXJyb3IsIGk7CisKKwllcnJvciA9IHNjc2lfaW5pdF9xdWV1ZSgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gc2NzaV9pbml0X3Byb2NmcygpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwX3F1ZXVlOworCWVycm9yID0gc2NzaV9pbml0X2RldmluZm8oKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9wcm9jZnM7CisJZXJyb3IgPSBzY3NpX2luaXRfaG9zdHMoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9kZXZsaXN0OworCWVycm9yID0gc2NzaV9pbml0X3N5c2N0bCgpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwX2hvc3RzOworCWVycm9yID0gc2NzaV9zeXNmc19yZWdpc3RlcigpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwX3N5c2N0bDsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KHNjc2lfZG9uZV9xLCBpKSk7CisKKwlkZXZmc19ta19kaXIoInNjc2kiKTsKKwlvcGVuX3NvZnRpcnEoU0NTSV9TT0ZUSVJRLCBzY3NpX3NvZnRpcnEsIE5VTEwpOworCXJlZ2lzdGVyX3Njc2lfY3B1KCk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJTQ1NJIHN1YnN5c3RlbSBpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7CisKK2NsZWFudXBfc3lzY3RsOgorCXNjc2lfZXhpdF9zeXNjdGwoKTsKK2NsZWFudXBfaG9zdHM6CisJc2NzaV9leGl0X2hvc3RzKCk7CitjbGVhbnVwX2Rldmxpc3Q6CisJc2NzaV9leGl0X2RldmluZm8oKTsKK2NsZWFudXBfcHJvY2ZzOgorCXNjc2lfZXhpdF9wcm9jZnMoKTsKK2NsZWFudXBfcXVldWU6CisJc2NzaV9leGl0X3F1ZXVlKCk7CisJcHJpbnRrKEtFUk5fRVJSICJTQ1NJIHN1YnN5c3RlbSBmYWlsZWQgdG8gaW5pdGlhbGl6ZSwgZXJyb3IgPSAlZFxuIiwKKwkgICAgICAgLWVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3Njc2kodm9pZCkKK3sKKwlzY3NpX3N5c2ZzX3VucmVnaXN0ZXIoKTsKKwlzY3NpX2V4aXRfc3lzY3RsKCk7CisJc2NzaV9leGl0X2hvc3RzKCk7CisJc2NzaV9leGl0X2RldmluZm8oKTsKKwlkZXZmc19yZW1vdmUoInNjc2kiKTsKKwlzY3NpX2V4aXRfcHJvY2ZzKCk7CisJc2NzaV9leGl0X3F1ZXVlKCk7CisJdW5yZWdpc3Rlcl9zY3NpX2NwdSgpOworfQorCitzdWJzeXNfaW5pdGNhbGwoaW5pdF9zY3NpKTsKK21vZHVsZV9leGl0KGV4aXRfc2NzaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5oIGIvZHJpdmVycy9zY3NpL3Njc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjZiNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqICBzY3NpLmggQ29weXJpZ2h0IChDKSAxOTkyIERyZXcgRWNraGFyZHQgCisgKiAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5OCwgMTk5OSBFcmljIFlvdW5nZGFsZQorICogIGdlbmVyaWMgU0NTSSBwYWNrYWdlIGhlYWRlciBmaWxlIGJ5CisgKiAgICAgIEluaXRpYWwgdmVyc2lvbnM6IERyZXcgRWNraGFyZHQKKyAqICAgICAgU3Vic2VxdWVudCByZXZpc2lvbnM6IEVyaWMgWW91bmdkYWxlCisgKgorICogIDxkcmV3QGNvbG9yYWRvLmVkdT4KKyAqCisgKiAgICAgICBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZSBlcmljQGFuZGFudGUub3JnIHRvCisgKiAgICAgICBhZGQgc2NhdHRlci1nYXRoZXIsIG11bHRpcGxlIG91dHN0YW5kaW5nIHJlcXVlc3QsIGFuZCBvdGhlcgorICogICAgICAgZW5oYW5jZW1lbnRzLgorICovCisvKgorICogTk9URTogIHRoaXMgZmlsZSBvbmx5IGNvbnRhaW5zIGNvbXBhdGliaWxpdHkgZ2x1ZSBmb3Igb2xkIGRyaXZlcnMuICBBbGwKKyAqIHRoZXNlIHdyYXBwZXJzIHdpbGwgYmUgcmVtb3ZlZCBzb29uZXIgb3IgbGF0ZXIuICBGb3IgbmV3IGNvZGUgcGxlYXNlIHVzZQorICogdGhlIGludGVyZmFjZXMgZGVjbGFyZWQgaW4gdGhlIGhlYWRlcnMgaW4gaW5jbHVkZS9zY3NpLworICovCisKKyNpZm5kZWYgX1NDU0lfSAorI2RlZmluZSBfU0NTSV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JICAgIC8qIGZvciBDT05GSUdfU0NTSV9MT0dHSU5HICovCisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3JlcXVlc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisKKy8qCisgKiBTb21lIGRlZnMsIGluIGNhc2UgdGhlc2UgYXJlIG5vdCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAqLworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCitzdHJ1Y3QgU2NzaV9Ib3N0Oworc3RydWN0IHNjc2lfY21uZDsKK3N0cnVjdCBzY3NpX2RldmljZTsKK3N0cnVjdCBzY3NpX3RhcmdldDsKK3N0cnVjdCBzY2F0dGVybGlzdDsKKworLyoKKyAqIExlZ2FjeSBkbWEgZGlyZWN0aW9uIGludGVyZmFjZXMuCisgKgorICogVGhpcyBhc3N1bWVzIHRoZSBwY2kvc2J1cyBkbWEgbWFwcGluZyBmbGFncyBoYXZlIHRoZSBzYW1lIG51bWVyY2lhbAorICogdmFsdWVzIGFzIHRoZSBnZW5lcmljIGRtYS1tYXBwaW5nIG9uZXMuICBDdXJyZW50bHkgdGhleSBoYXZlIGJ1dCB0aGVyZSdzCisgKiBubyB3YXkgdG8gY2hlY2suICBCZXR0ZXIgZG9uJ3QgdXNlIHRoZXNlIGludGVyZmFjZXMhCisgKi8KKyNkZWZpbmUgU0NTSV9EQVRBX1VOS05PV04JKERNQV9CSURJUkVDVElPTkFMKQorI2RlZmluZSBTQ1NJX0RBVEFfV1JJVEUJCShETUFfVE9fREVWSUNFKQorI2RlZmluZSBTQ1NJX0RBVEFfUkVBRAkJKERNQV9GUk9NX0RFVklDRSkKKyNkZWZpbmUgU0NTSV9EQVRBX05PTkUJCShETUFfTk9ORSkKKworI2RlZmluZSBzY3NpX3RvX3BjaV9kbWFfZGlyKHNjc2lfZGlyKQkoKGludCkoc2NzaV9kaXIpKQorI2RlZmluZSBzY3NpX3RvX3NidXNfZG1hX2RpcihzY3NpX2RpcikJKChpbnQpKHNjc2lfZGlyKSkKKworLyoKKyAqIE9sZCBuYW1lcyBmb3IgZGVidWcgcHJldHR5cHJpbnRpbmcgZnVuY3Rpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfU2NzaV9DbW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gc2NzaV9wcmludF9jb21tYW5kKGNtZCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfY29tbWFuZCh1bnNpZ25lZCBjaGFyICpjZGIpCit7CisJcmV0dXJuIF9fc2NzaV9wcmludF9jb21tYW5kKGNkYik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc2Vuc2UoY29uc3QgY2hhciAqZGV2Y2xhc3MsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gc2NzaV9wcmludF9zZW5zZShkZXZjbGFzcywgY21kKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9yZXFfc2Vuc2UoY29uc3QgY2hhciAqZGV2Y2xhc3MsIHN0cnVjdCBzY3NpX3JlcXVlc3QgKnJlcSkKK3sKKwlyZXR1cm4gc2NzaV9wcmludF9yZXFfc2Vuc2UoZGV2Y2xhc3MsIHJlcSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfZHJpdmVyYnl0ZShpbnQgc2NzaXJlc3VsdCkKK3sKKwlyZXR1cm4gc2NzaV9wcmludF9kcml2ZXJieXRlKHNjc2lyZXN1bHQpOworfQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X2hvc3RieXRlKGludCBzY3NpcmVzdWx0KQoreworCXJldHVybiBzY3NpX3ByaW50X2hvc3RieXRlKHNjc2lyZXN1bHQpOworfQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X3N0YXR1cyh1bnNpZ25lZCBjaGFyIHN0YXR1cykKK3sKKwlyZXR1cm4gc2NzaV9wcmludF9zdGF0dXMoc3RhdHVzKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHByaW50X21zZyhjb25zdCB1bnNpZ25lZCBjaGFyICptc2cpCit7CisJcmV0dXJuIHNjc2lfcHJpbnRfbXNnKG1zZyk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjcmFwIGZyb20gdGhlIG9sZCBlcnJvciBoYW5kbGluZyBjb2RlLiAgV2UgaGF2ZSBpdCBpbiBhIHNwZWNpYWwKKyAqIHBsYWNlIHNvIHRoYXQgd2UgY2FuIG1vcmUgZWFzaWx5IGRlbGV0ZSBpdCBsYXRlciBvbi4KKyAqLworI2luY2x1ZGUgInNjc2lfb2Jzb2xldGUuaCIKKworLyogb2Jzb2xldGUgdHlwZWRlZiBqdW5rLiAqLworI2luY2x1ZGUgInNjc2lfdHlwZWRlZnMuaCIKKworI2VuZGlmIC8qIF9TQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjA4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTk3NiBAQAorLyoKKyAqICBsaW51eC9rZXJuZWwvc2NzaV9kZWJ1Zy5jCisgKiB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diBPcmlnaW5hbCB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2CisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBFcmljIFlvdW5nZGFsZQorICogIFNpbXVsYXRlIGEgaG9zdCBhZGFwdGVyIHdpdGggMiBkaXNrcyBhdHRhY2hlZC4gIERvIGEgbG90IG9mIGNoZWNraW5nCisgKiAgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBnZXR0aW5nIGJsb2NrcyBtaXhlZCB1cCwgYW5kIFBBTklDIGlmCisgKiAgYW55dGhpbmcgb3V0IG9mIHRoZSBvcmRpbmFyeSBpcyBzZWVuLgorICogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gT3JpZ2luYWwgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICoKKyAqICBUaGlzIHZlcnNpb24gaXMgbW9yZSBnZW5lcmljLCBzaW11bGF0aW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIGRpc2sKKyAqICAob3IgZGlzayBsaWtlIGRldmljZXMpIHNoYXJpbmcgYSBjb21tb24gYW1vdW50IG9mIFJBTQorICoKKyAqCisgKiAgRm9yIGRvY3VtZW50YXRpb24gc2VlIGh0dHA6Ly93d3cudG9ycXVlLm5ldC9zZy9zZGVidWcyNi5odG1sCisgKgorICogICBELiBHaWxiZXJ0IChkcGcpIHdvcmsgZm9yIE1hZ25ldG8tT3B0aWNhbCBkZXZpY2UgdGVzdCBbMjAwMTA0MjFdCisgKiAgIGRwZzogd29yayBmb3IgZGV2ZnMgbGFyZ2UgbnVtYmVyIG9mIGRpc2tzIFsyMDAxMDgwOV0KKyAqICAgICAgICBmb3JrZWQgZm9yIGxrIDIuNSBzZXJpZXMgWzIwMDExMjE2LCAyMDAyMDEwMV0KKyAqICAgICAgICB1c2Ugdm1hbGxvYygpIG1vcmUgaW5xdWlyeSttb2RlX3NlbnNlIFsyMDAyMDMwMl0KKyAqICAgICAgICBhZGQgdGltZXJzIGZvciBkZWxheWVkIHJlc3BvbnNlcyBbMjAwMjA3MjFdCisgKiAgIFBhdHJpY2sgTWFuc2ZpZWxkIDxwYXRtYW5zQHVzLmlibS5jb20+IG1heF9sdW5zK3Njc2lfbGV2ZWwgWzIwMDIxMDMxXQorICogICBNaWtlIEFuZGVyc29uIDxhbmRtaWtlQHVzLmlibS5jb20+IHN5c2ZzIHdvcmsgWzIwMDIxMTE4XQorICogICBkcGc6IGNoYW5nZSBzdHlsZSBvZiBib290IG9wdGlvbnMgdG8gInNjc2lfZGVidWcubnVtX3RndHM9MiIgYW5kCisgKiAgICAgICAgbW9kdWxlIG9wdGlvbnMgdG8gIm1vZHByb2JlIHNjc2lfZGVidWcgbnVtX3RndHM9MiIgWzIwMDIxMjIxXQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaWZuZGVmIExJTlVYX1ZFUlNJT05fQ09ERQorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisjaW5jbHVkZSAic2NzaV9kZWJ1Zy5oIgorCisjZGVmaW5lIFNDU0lfREVCVUdfVkVSU0lPTiAiMS43NSIKK3N0YXRpYyBjb25zdCBjaGFyICogc2NzaV9kZWJ1Z192ZXJzaW9uX2RhdGUgPSAiMjAwNTAxMTMiOworCisvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgKEFTQykgdXNlZCAqLworI2RlZmluZSBOT19BRERFRF9TRU5TRSAweDAKKyNkZWZpbmUgVU5SRUNPVkVSRURfUkVBRF9FUlIgMHgxMQorI2RlZmluZSBJTlZBTElEX09QQ09ERSAweDIwCisjZGVmaW5lIEFERFJfT1VUX09GX1JBTkdFIDB4MjEKKyNkZWZpbmUgSU5WQUxJRF9GSUVMRF9JTl9DREIgMHgyNAorI2RlZmluZSBQT1dFUk9OX1JFU0VUIDB4MjkKKyNkZWZpbmUgU0FWSU5HX1BBUkFNU19VTlNVUCAweDM5CisjZGVmaW5lIFRIUkVTSEhPTERfRVhDRUVERUQgMHg1ZAorCisjZGVmaW5lIFNERUJVR19UQUdHRURfUVVFVUlORyAwIC8qIDAgfCBNU0dfU0lNUExFX1RBRyB8IE1TR19PUkRFUkVEX1RBRyAqLworCisvKiBEZWZhdWx0IHZhbHVlcyBmb3IgZHJpdmVyIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREVGX05VTV9IT1NUICAgMQorI2RlZmluZSBERUZfTlVNX1RHVFMgICAxCisjZGVmaW5lIERFRl9NQVhfTFVOUyAgIDEKKy8qIFdpdGggdGhlc2UgZGVmYXVsdHMsIHRoaXMgZHJpdmVyIHdpbGwgbWFrZSAxIGhvc3Qgd2l0aCAxIHRhcmdldAorICogKGlkIDApIGNvbnRhaW5pbmcgMSBsb2dpY2FsIHVuaXQgKGx1biAwKS4gVGhhdCBpcyAxIGRldmljZS4KKyAqLworI2RlZmluZSBERUZfREVMQVkgICAxCisjZGVmaW5lIERFRl9ERVZfU0laRV9NQiAgIDgKKyNkZWZpbmUgREVGX0VWRVJZX05USCAgIDAKKyNkZWZpbmUgREVGX05VTV9QQVJUUyAgIDAKKyNkZWZpbmUgREVGX09QVFMgICAwCisjZGVmaW5lIERFRl9TQ1NJX0xFVkVMICAgNSAgICAvKiBJTlFVSVJZLCBieXRlMiBbNS0+U1BDLTNdICovCisjZGVmaW5lIERFRl9QVFlQRSAgIDAKKyNkZWZpbmUgREVGX0RfU0VOU0UgICAwCisKKy8qIGJpdCBtYXNrIHZhbHVlcyBmb3Igc2NzaV9kZWJ1Z19vcHRzICovCisjZGVmaW5lIFNDU0lfREVCVUdfT1BUX05PSVNFICAgMQorI2RlZmluZSBTQ1NJX0RFQlVHX09QVF9NRURJVU1fRVJSICAgMgorI2RlZmluZSBTQ1NJX0RFQlVHX09QVF9USU1FT1VUICAgNAorI2RlZmluZSBTQ1NJX0RFQlVHX09QVF9SRUNPVkVSRURfRVJSICAgOAorLyogV2hlbiAiZXZlcnlfbnRoIiA+IDAgdGhlbiBtb2R1bG8gImV2ZXJ5X250aCIgY29tbWFuZHM6CisgKiAgIC0gYSBubyByZXNwb25zZSBpcyBzaW11bGF0ZWQgaWYgU0NTSV9ERUJVR19PUFRfVElNRU9VVCBpcyBzZXQKKyAqICAgLSBhIFJFQ09WRVJFRF9FUlJPUiBpcyBzaW11bGF0ZWQgb24gc3VjY2Vzc2Z1bCByZWFkIGFuZCB3cml0ZQorICogICAgIGNvbW1hbmRzIGlmIFNDU0lfREVCVUdfT1BUX1JFQ09WRVJFRF9FUlIgaXMgc2V0LgorICoKKyAqIFdoZW4gImV2ZXJ5X250aCIgPCAwIHRoZW4gYWZ0ZXIgIi0gZXZlcnlfbnRoIiBjb21tYW5kczoKKyAqICAgLSBhIG5vIHJlc3BvbnNlIGlzIHNpbXVsYXRlZCBpZiBTQ1NJX0RFQlVHX09QVF9USU1FT1VUIGlzIHNldAorICogICAtIGEgUkVDT1ZFUkVEX0VSUk9SIGlzIHNpbXVsYXRlZCBvbiBzdWNjZXNzZnVsIHJlYWQgYW5kIHdyaXRlCisgKiAgICAgY29tbWFuZHMgaWYgU0NTSV9ERUJVR19PUFRfUkVDT1ZFUkVEX0VSUiBpcyBzZXQuCisgKiBUaGlzIHdpbGwgY29udGludWUgdW50aWwgc29tZSBvdGhlciBhY3Rpb24gb2NjdXJzIChlLmcuIHRoZSB1c2VyCisgKiB3cml0aW5nIGEgbmV3IHZhbHVlIChvdGhlciB0aGFuIC0xIG9yIDEpIHRvIGV2ZXJ5X250aCB2aWEgc3lzZnMpLgorICovCisKKy8qIHdoZW4gMT09U0NTSV9ERUJVR19PUFRfTUVESVVNX0VSUiwgYSBtZWRpdW0gZXJyb3IgaXMgc2ltdWxhdGVkIGF0IHRoaXMKKyAqIHNlY3RvciBvbiByZWFkIGNvbW1hbmRzOiAqLworI2RlZmluZSBPUFRfTUVESVVNX0VSUl9BRERSICAgMHgxMjM0IC8qIHRoYXQncyBzZWN0b3IgNDY2MCBpbiBkZWNpbWFsICovCisKKy8qIElmIFJFUE9SVCBMVU5TIGhhcyBsdW5zID49IDI1NiBpdCBjYW4gY2hvb3NlICJmbGF0IHNwYWNlIiAodmFsdWUgMSkKKyAqIG9yICJwZXJpcGhlcmFsIGRldmljZSIgYWRkcmVzc2luZyAodmFsdWUgMCkgKi8KKyNkZWZpbmUgU0FNMl9MVU5fQUREUkVTU19NRVRIT0QgMAorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfYWRkX2hvc3QgPSBERUZfTlVNX0hPU1Q7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfZGVsYXkgPSBERUZfREVMQVk7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfZGV2X3NpemVfbWIgPSBERUZfREVWX1NJWkVfTUI7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfZXZlcnlfbnRoID0gREVGX0VWRVJZX05USDsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19tYXhfbHVucyA9IERFRl9NQVhfTFVOUzsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19udW1fcGFydHMgPSBERUZfTlVNX1BBUlRTOworc3RhdGljIGludCBzY3NpX2RlYnVnX251bV90Z3RzID0gREVGX05VTV9UR1RTOyAvKiB0YXJnZXRzIHBlciBob3N0ICovCitzdGF0aWMgaW50IHNjc2lfZGVidWdfb3B0cyA9IERFRl9PUFRTOworc3RhdGljIGludCBzY3NpX2RlYnVnX3Njc2lfbGV2ZWwgPSBERUZfU0NTSV9MRVZFTDsKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19wdHlwZSA9IERFRl9QVFlQRTsgLyogU0NTSSBwZXJpcGhlcmFsIHR5cGUgKDA9PWRpc2spICovCitzdGF0aWMgaW50IHNjc2lfZGVidWdfZHNlbnNlID0gREVGX0RfU0VOU0U7CisKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19jbW5kX2NvdW50ID0gMDsKKworI2RlZmluZSBERVZfUkVBRE9OTFkoVEdUKSAgICAgICgwKQorI2RlZmluZSBERVZfUkVNT1ZFQUJMRShUR1QpICAgICgwKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZGVidWdfc3RvcmVfc2l6ZTsJLyogaW4gYnl0ZXMgKi8KK3N0YXRpYyBzZWN0b3JfdCBzZGVidWdfY2FwYWNpdHk7CS8qIGluIHNlY3RvcnMgKi8KKworLyogb2xkIEJJT1Mgc3R1ZmYsIGtlcm5lbCBtYXkgZ2V0IHJpZCBvZiB0aGVtIGJ1dCBzb21lIG1vZGUgc2Vuc2UgcGFnZXMKKyAgIG1heSBzdGlsbCBuZWVkIHRoZW0gKi8KK3N0YXRpYyBpbnQgc2RlYnVnX2hlYWRzOwkJLyogaGVhZHMgcGVyIGRpc2sgKi8KK3N0YXRpYyBpbnQgc2RlYnVnX2N5bGluZGVyc19wZXI7CS8qIGN5bGluZGVycyBwZXIgc3VyZmFjZSAqLworc3RhdGljIGludCBzZGVidWdfc2VjdG9yc19wZXI7CQkvKiBzZWN0b3JzIHBlciBjeWxpbmRlciAqLworCisvKiBkZWZhdWx0IHNlY3RvciBzaXplIGlzIDUxMiBieXRlcywgMioqOSBieXRlcyAqLworI2RlZmluZSBQT1cyX1NFQ1RfU0laRSA5CisjZGVmaW5lIFNFQ1RfU0laRSAoMSA8PCBQT1cyX1NFQ1RfU0laRSkKKyNkZWZpbmUgU0VDVF9TSVpFX1BFUihUR1QpIFNFQ1RfU0laRQorCisjZGVmaW5lIFNERUJVR19NQVhfUEFSVFMgNAorCisjZGVmaW5lIFNERUJVR19TRU5TRV9MRU4gMzIKKworc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZfbGlzdDsKKwl1bnNpZ25lZCBjaGFyIHNlbnNlX2J1ZmZbU0RFQlVHX1NFTlNFX0xFTl07CS8qIHdlYWsgbmV4dXMgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0OworCXVuc2lnbmVkIGludCBsdW47CisJc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKnNkYmdfaG9zdDsKKwljaGFyIHJlc2V0OworCWNoYXIgdXNlZDsKK307CisKK3N0cnVjdCBzZGVidWdfaG9zdF9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhvc3RfbGlzdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9pbmZvX2xpc3Q7Cit9OworCisjZGVmaW5lIHRvX3NkZWJ1Z19ob3N0KGQpCVwKKwljb250YWluZXJfb2YoZCwgc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8sIGRldikKKworc3RhdGljIExJU1RfSEVBRChzZGVidWdfaG9zdF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKwordHlwZWRlZiB2b2lkICgqIGRvbmVfZnVuY3RfdCkgKHN0cnVjdCBzY3NpX2NtbmQgKik7CisKK3N0cnVjdCBzZGVidWdfcXVldWVkX2NtZCB7CisJaW50IGluX3VzZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjbW5kX3RpbWVyOworCWRvbmVfZnVuY3RfdCBkb25lX2Z1bmN0OworCXN0cnVjdCBzY3NpX2NtbmQgKiBhX2NtbmQ7CisJaW50IHNjc2lfcmVzdWx0OworfTsKK3N0YXRpYyBzdHJ1Y3Qgc2RlYnVnX3F1ZXVlZF9jbWQgcXVldWVkX2FycltTQ1NJX0RFQlVHX0NBTlFVRVVFXTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBzZGVidWdfZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX2luZm8gPQkJc2NzaV9kZWJ1Z19wcm9jX2luZm8sCisJLm5hbWUgPQkJCSJTQ1NJIERFQlVHIiwKKwkuaW5mbyA9CQkJc2NzaV9kZWJ1Z19pbmZvLAorCS5zbGF2ZV9hbGxvYyA9CQlzY3NpX2RlYnVnX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUgPQlzY3NpX2RlYnVnX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveSA9CXNjc2lfZGVidWdfc2xhdmVfZGVzdHJveSwKKwkuaW9jdGwgPQkJc2NzaV9kZWJ1Z19pb2N0bCwKKwkucXVldWVjb21tYW5kID0JCXNjc2lfZGVidWdfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0Jc2NzaV9kZWJ1Z19hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSBzY3NpX2RlYnVnX2J1c19yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBzY3NpX2RlYnVnX2RldmljZV9yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyID0gc2NzaV9kZWJ1Z19ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtID0JCXNjc2lfZGVidWdfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUgPQkJU0NTSV9ERUJVR19DQU5RVUVVRSwKKwkudGhpc19pZCA9CQk3LAorCS5zZ190YWJsZXNpemUgPQkJNjQsCisJLmNtZF9wZXJfbHVuID0JCTMsCisJLm1heF9zZWN0b3JzID0JCTQwOTYsCisJLnVuY2hlY2tlZF9pc2FfZG1hID0gCTAsCisJLnVzZV9jbHVzdGVyaW5nID0gCURJU0FCTEVfQ0xVU1RFUklORywKKwkubW9kdWxlID0JCVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBmYWtlX3N0b3JlcDsJLyogcmFtZGlzayBzdG9yYWdlICovCisKK3N0YXRpYyBpbnQgbnVtX2Fib3J0cyA9IDA7CitzdGF0aWMgaW50IG51bV9kZXZfcmVzZXRzID0gMDsKK3N0YXRpYyBpbnQgbnVtX2J1c19yZXNldHMgPSAwOworc3RhdGljIGludCBudW1faG9zdF9yZXNldHMgPSAwOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHF1ZXVlZF9hcnJfbG9jayk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhhdG9taWNfcncpOworCitzdGF0aWMgY2hhciBzZGVidWdfcHJvY19uYW1lW10gPSAic2NzaV9kZWJ1ZyI7CisKK3N0YXRpYyBpbnQgc2RlYnVnX2RyaXZlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBzZGVidWdfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBwc2V1ZG9fbGxkX2J1czsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHNkZWJ1Z19kcml2ZXJmc19kcml2ZXIgPSB7CisJLm5hbWUgCQk9IHNkZWJ1Z19wcm9jX25hbWUsCisJLmJ1cwkJPSAmcHNldWRvX2xsZF9idXMsCisJLnByb2JlICAgICAgICAgID0gc2RlYnVnX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBzZGVidWdfZHJpdmVyX3JlbW92ZSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgY2hlY2tfY29uZGl0aW9uX3Jlc3VsdCA9CisJCShEUklWRVJfU0VOU0UgPDwgMjQpIHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgcmVzcF9pbnF1aXJ5KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwgaW50IHRhcmdldCwKKwkJCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IHJlc3BfcmVxdWVzdHMoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LAorCQkJIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IHJlc3BfcmVhZGNhcChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsCisJCQlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCByZXNwX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LCBpbnQgdGFyZ2V0LAorCQkJICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKTsKK3N0YXRpYyBpbnQgcmVzcF9yZWFkKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwgaW50IHVwcGVyX2JsaywgaW50IGJsb2NrLAorCQkgICAgIGludCBudW0sIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IHJlc3Bfd3JpdGUoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LCBpbnQgdXBwZXJfYmxrLCBpbnQgYmxvY2ssCisJCSAgICAgIGludCBudW0sIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IHJlc3BfcmVwb3J0X2x1bnMoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LAorCQkJICAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CitzdGF0aWMgaW50IGZpbGxfZnJvbV9kZXZfYnVmZmVyKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsIHVuc2lnbmVkIGNoYXIgKiBhcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJfbGVuKTsKK3N0YXRpYyBpbnQgZmV0Y2hfdG9fZGV2X2J1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLCB1bnNpZ25lZCBjaGFyICogYXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYXJyX2xlbik7CitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyX2hhbmRsZXIodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldkluZm9SZWcoc3RydWN0IHNjc2lfZGV2aWNlICogc2Rldik7CitzdGF0aWMgdm9pZCBta19zZW5zZV9idWZmZXIoc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwLCBpbnQga2V5LAorCQkJICAgIGludCBhc2MsIGludCBhc3EpOworc3RhdGljIGludCBjaGVja19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsCisJCSAgICAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCBzY2hlZHVsZV9yZXNwKHN0cnVjdCBzY3NpX2NtbmQgKiBjbW5kLAorCQkJIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCwKKwkJCSBkb25lX2Z1bmN0X3QgZG9uZSwgaW50IHNjc2lfcmVzdWx0LCBpbnQgZGVsdGFfamlmZik7CitzdGF0aWMgdm9pZCBfX2luaXQgc2RlYnVnX2J1aWxkX3BhcnRzKHVuc2lnbmVkIGNoYXIgKiByYW1wKTsKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2FsbF9xdWV1ZWQodm9pZCk7CitzdGF0aWMgdm9pZCBzdG9wX2FsbF9xdWV1ZWQodm9pZCk7CitzdGF0aWMgaW50IHN0b3BfcXVldWVkX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqIGNtbmQpOworc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODModW5zaWduZWQgY2hhciAqIGFyciwgaW50IGRldl9pZF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGV2X2lkX3N0ciwgaW50IGRldl9pZF9zdHJfbGVuKTsKK3N0YXRpYyB2b2lkIGRvX2NyZWF0ZV9kcml2ZXJmc19maWxlcyh2b2lkKTsKK3N0YXRpYyB2b2lkIGRvX3JlbW92ZV9kcml2ZXJmc19maWxlcyh2b2lkKTsKKworc3RhdGljIGludCBzZGVidWdfYWRkX2FkYXB0ZXIodm9pZCk7CitzdGF0aWMgdm9pZCBzZGVidWdfcmVtb3ZlX2FkYXB0ZXIodm9pZCk7CitzdGF0aWMgdm9pZCBzZGVidWdfbWF4X3RndHNfbHVucyh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgcHNldWRvX3ByaW1hcnk7CitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHBzZXVkb19sbGRfYnVzOworCisKK3N0YXRpYworaW50IHNjc2lfZGVidWdfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCwgZG9uZV9mdW5jdF90IGRvbmUpCit7CisJdW5zaWduZWQgY2hhciAqY21kID0gKHVuc2lnbmVkIGNoYXIgKikgU0NwbnQtPmNtbmQ7CisJaW50IGJsb2NrLCB1cHBlcl9ibGssIG51bSwgazsKKwlpbnQgZXJyc3RzID0gMDsKKwlpbnQgdGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwID0gTlVMTDsKKwlpbnQgaW5qX3JlY292ZXJlZCA9IDA7CisKKwlpZiAoZG9uZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsJLyogYXNzdW1lIG1pZCBsZXZlbCByZXByb2Nlc3NpbmcgY29tbWFuZCAqLworCisJaWYgKChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykgJiYgY21kKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGNtZCAiKTsKKwkJZm9yIChrID0gMCwgbnVtID0gU0NwbnQtPmNtZF9sZW47IGsgPCBudW07ICsraykKKwkJCXByaW50aygiJTAyeCAiLCAoaW50KWNtZFtrXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisgICAgICAgIGlmKHRhcmdldCA9PSBzZGVidWdfZHJpdmVyX3RlbXBsYXRlLnRoaXNfaWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogaW5pdGlhdG9yJ3MgaWQgdXNlZCBhcyAiCisJCSAgICAgICAidGFyZ2V0IVxuIik7CisJCXJldHVybiBzY2hlZHVsZV9yZXNwKFNDcG50LCBOVUxMLCBkb25lLAorCQkJCSAgICAgRElEX05PX0NPTk5FQ1QgPDwgMTYsIDApOworICAgICAgICB9CisKKwlpZiAoU0NwbnQtPmRldmljZS0+bHVuID49IHNjc2lfZGVidWdfbWF4X2x1bnMpCisJCXJldHVybiBzY2hlZHVsZV9yZXNwKFNDcG50LCBOVUxMLCBkb25lLAorCQkJCSAgICAgRElEX05PX0NPTk5FQ1QgPDwgMTYsIDApOworCWRldmlwID0gZGV2SW5mb1JlZyhTQ3BudC0+ZGV2aWNlKTsKKwlpZiAoTlVMTCA9PSBkZXZpcCkKKwkJcmV0dXJuIHNjaGVkdWxlX3Jlc3AoU0NwbnQsIE5VTEwsIGRvbmUsCisJCQkJICAgICBESURfTk9fQ09OTkVDVCA8PCAxNiwgMCk7CisKKyAgICAgICAgaWYgKChzY3NpX2RlYnVnX2V2ZXJ5X250aCAhPSAwKSAmJgorICAgICAgICAgICAgKCsrc2NzaV9kZWJ1Z19jbW5kX2NvdW50ID49IGFicyhzY3NpX2RlYnVnX2V2ZXJ5X250aCkpKSB7CisgICAgICAgICAgICAgICAgc2NzaV9kZWJ1Z19jbW5kX2NvdW50ID0gMDsKKwkJaWYgKHNjc2lfZGVidWdfZXZlcnlfbnRoIDwgLTEpCisJCQlzY3NpX2RlYnVnX2V2ZXJ5X250aCA9IC0xOworCQlpZiAoU0NTSV9ERUJVR19PUFRfVElNRU9VVCAmIHNjc2lfZGVidWdfb3B0cykKKwkJCXJldHVybiAwOyAvKiBpZ25vcmUgY29tbWFuZCBjYXVzaW5nIHRpbWVvdXQgKi8KKwkJZWxzZSBpZiAoU0NTSV9ERUJVR19PUFRfUkVDT1ZFUkVEX0VSUiAmIHNjc2lfZGVidWdfb3B0cykKKwkJCWlual9yZWNvdmVyZWQgPSAxOyAvKiB0byByZWFkcyBhbmQgd3JpdGVzIGJlbG93ICovCisgICAgICAgIH0KKworCXN3aXRjaCAoKmNtZCkgeworCWNhc2UgSU5RVUlSWTogICAgIC8qIG1hbmRhdG9yeSwgaWdub3JlIHVuaXQgYXR0ZW50aW9uICovCisJCWVycnN0cyA9IHJlc3BfaW5xdWlyeShTQ3BudCwgdGFyZ2V0LCBkZXZpcCk7CisJCWJyZWFrOworCWNhc2UgUkVRVUVTVF9TRU5TRToJLyogbWFuZGF0b3J5LCBpZ25vcmUgdW5pdCBhdHRlbnRpb24gKi8KKwkJZXJyc3RzID0gcmVzcF9yZXF1ZXN0cyhTQ3BudCwgZGV2aXApOworCQlicmVhazsKKwljYXNlIFJFWkVST19VTklUOgkvKiBhY3R1YWxseSB0aGlzIGlzIFJFV0lORCBmb3IgU1NDICovCisJY2FzZSBTVEFSVF9TVE9QOgorCQllcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApOworCQlicmVhazsKKwljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgorCQlpZiAoKGVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCkpKQorCQkJYnJlYWs7CisJCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IE1lZGl1bSByZW1vdmFsICVzXG4iLAorCQkJICAgICAgICBjbWRbNF0gPyAiaW5oaWJpdGVkIiA6ICJlbmFibGVkIik7CisJCWJyZWFrOworCWNhc2UgU0VORF9ESUFHTk9TVElDOiAgICAgLyogbWFuZGF0b3J5ICovCisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOworCWNhc2UgVEVTVF9VTklUX1JFQURZOiAgICAgLyogbWFuZGF0b3J5ICovCisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFJFU0VSVkU6CisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVTRVJWRV8xMDoKKwkJZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNFOgorCQllcnJzdHMgPSBjaGVja19yZXNldChTQ3BudCwgZGV2aXApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFTEVBU0VfMTA6CisJCWVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQllcnJzdHMgPSByZXNwX3JlYWRjYXAoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CisJY2FzZSBSRUFEXzE2OgorCWNhc2UgUkVBRF8xMjoKKwljYXNlIFJFQURfMTA6CisJY2FzZSBSRUFEXzY6CisJCWlmICgoZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKSkpCisJCQlicmVhazsKKwkJdXBwZXJfYmxrID0gMDsKKwkJaWYgKCgqY21kKSA9PSBSRUFEXzE2KSB7CisJCQl1cHBlcl9ibGsgPSBjbWRbNV0gKyAoY21kWzRdIDw8IDgpICsKKwkJCQkgICAgKGNtZFszXSA8PCAxNikgKyAoY21kWzJdIDw8IDI0KTsKKwkJCWJsb2NrID0gY21kWzldICsgKGNtZFs4XSA8PCA4KSArCisJCQkJKGNtZFs3XSA8PCAxNikgKyAoY21kWzZdIDw8IDI0KTsKKwkJCW51bSA9IGNtZFsxM10gKyAoY21kWzEyXSA8PCA4KSArCisJCQkJKGNtZFsxMV0gPDwgMTYpICsgKGNtZFsxMF0gPDwgMjQpOworCQl9IGVsc2UgaWYgKCgqY21kKSA9PSBSRUFEXzEyKSB7CisJCQlibG9jayA9IGNtZFs1XSArIChjbWRbNF0gPDwgOCkgKworCQkJCShjbWRbM10gPDwgMTYpICsgKGNtZFsyXSA8PCAyNCk7CisJCQludW0gPSBjbWRbOV0gKyAoY21kWzhdIDw8IDgpICsKKwkJCQkoY21kWzddIDw8IDE2KSArIChjbWRbNl0gPDwgMjQpOworCQl9IGVsc2UgaWYgKCgqY21kKSA9PSBSRUFEXzEwKSB7CisJCQlibG9jayA9IGNtZFs1XSArIChjbWRbNF0gPDwgOCkgKworCQkJCShjbWRbM10gPDwgMTYpICsgKGNtZFsyXSA8PCAyNCk7CisJCQludW0gPSBjbWRbOF0gKyAoY21kWzddIDw8IDgpOworCQl9IGVsc2UgeworCQkJYmxvY2sgPSBjbWRbM10gKyAoY21kWzJdIDw8IDgpICsKKwkJCQkoKGNtZFsxXSAmIDB4MWYpIDw8IDE2KTsKKwkJCW51bSA9IGNtZFs0XTsKKwkJfQorCQllcnJzdHMgPSByZXNwX3JlYWQoU0NwbnQsIHVwcGVyX2JsaywgYmxvY2ssIG51bSwgZGV2aXApOworCQlpZiAoaW5qX3JlY292ZXJlZCAmJiAoMCA9PSBlcnJzdHMpKSB7CisJCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIFJFQ09WRVJFRF9FUlJPUiwKKwkJCQkJVEhSRVNISE9MRF9FWENFRURFRCwgMCk7CisJCQllcnJzdHMgPSBjaGVja19jb25kaXRpb25fcmVzdWx0OworCQl9CisJCWJyZWFrOworCWNhc2UgUkVQT1JUX0xVTlM6CS8qIG1hbmRhdG9yeSwgaWdub3JlIHVuaXQgYXR0ZW50aW9uICovCisJCWVycnN0cyA9IHJlc3BfcmVwb3J0X2x1bnMoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CisJY2FzZSBWRVJJRlk6CQkvKiAxMCBieXRlIFNCQy0yIGNvbW1hbmQgKi8KKwkJZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CisJY2FzZSBXUklURV8xNjoKKwljYXNlIFdSSVRFXzEyOgorCWNhc2UgV1JJVEVfMTA6CisJY2FzZSBXUklURV82OgorCQlpZiAoKGVycnN0cyA9IGNoZWNrX3Jlc2V0KFNDcG50LCBkZXZpcCkpKQorCQkJYnJlYWs7CisJCXVwcGVyX2JsayA9IDA7CisJCWlmICgoKmNtZCkgPT0gV1JJVEVfMTYpIHsKKwkJCXVwcGVyX2JsayA9IGNtZFs1XSArIChjbWRbNF0gPDwgOCkgKworCQkJCSAgICAoY21kWzNdIDw8IDE2KSArIChjbWRbMl0gPDwgMjQpOworCQkJYmxvY2sgPSBjbWRbOV0gKyAoY21kWzhdIDw8IDgpICsKKwkJCQkoY21kWzddIDw8IDE2KSArIChjbWRbNl0gPDwgMjQpOworCQkJbnVtID0gY21kWzEzXSArIChjbWRbMTJdIDw8IDgpICsKKwkJCQkoY21kWzExXSA8PCAxNikgKyAoY21kWzEwXSA8PCAyNCk7CisJCX0gZWxzZSBpZiAoKCpjbWQpID09IFdSSVRFXzEyKSB7CisJCQlibG9jayA9IGNtZFs1XSArIChjbWRbNF0gPDwgOCkgKworCQkJCShjbWRbM10gPDwgMTYpICsgKGNtZFsyXSA8PCAyNCk7CisJCQludW0gPSBjbWRbOV0gKyAoY21kWzhdIDw8IDgpICsKKwkJCQkoY21kWzddIDw8IDE2KSArIChjbWRbNl0gPDwgMjQpOworCQl9IGVsc2UgaWYgKCgqY21kKSA9PSBXUklURV8xMCkgeworCQkJYmxvY2sgPSBjbWRbNV0gKyAoY21kWzRdIDw8IDgpICsKKwkJCQkoY21kWzNdIDw8IDE2KSArIChjbWRbMl0gPDwgMjQpOworCQkJbnVtID0gY21kWzhdICsgKGNtZFs3XSA8PCA4KTsKKwkJfSBlbHNlIHsKKwkJCWJsb2NrID0gY21kWzNdICsgKGNtZFsyXSA8PCA4KSArCisJCQkJKChjbWRbMV0gJiAweDFmKSA8PCAxNik7CisJCQludW0gPSBjbWRbNF07CisJCX0KKwkJZXJyc3RzID0gcmVzcF93cml0ZShTQ3BudCwgdXBwZXJfYmxrLCBibG9jaywgbnVtLCBkZXZpcCk7CisJCWlmIChpbmpfcmVjb3ZlcmVkICYmICgwID09IGVycnN0cykpIHsKKwkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgUkVDT1ZFUkVEX0VSUk9SLAorCQkJCQlUSFJFU0hIT0xEX0VYQ0VFREVELCAwKTsKKwkJCWVycnN0cyA9IGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNT0RFX1NFTlNFOgorCWNhc2UgTU9ERV9TRU5TRV8xMDoKKwkJZXJyc3RzID0gcmVzcF9tb2RlX3NlbnNlKFNDcG50LCB0YXJnZXQsIGRldmlwKTsKKwkJYnJlYWs7CisJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogT3Bjb2RlOiAweCV4IG5vdCAiCisJCQkgICAgICAgInN1cHBvcnRlZFxuIiwgKmNtZCk7CisJCWlmICgoZXJyc3RzID0gY2hlY2tfcmVzZXQoU0NwbnQsIGRldmlwKSkpCisJCQlicmVhazsJLyogVW5pdCBhdHRlbnRpb24gdGFrZXMgcHJlY2VkZW5jZSAqLworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgSU5WQUxJRF9PUENPREUsIDApOworCQllcnJzdHMgPSBjaGVja19jb25kaXRpb25fcmVzdWx0OworCQlicmVhazsKKwl9CisJcmV0dXJuIHNjaGVkdWxlX3Jlc3AoU0NwbnQsIGRldmlwLCBkb25lLCBlcnJzdHMsIHNjc2lfZGVidWdfZGVsYXkpOworfQorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaWYgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGlvY3RsOiBjbWQ9MHgleFxuIiwgY21kKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7CisJLyogcmV0dXJuIC1FTk9UVFk7IC8vIGNvcnJlY3QgcmV0dXJuIGJ1dCB1cHNldHMgZmRpc2sgKi8KK30KKworc3RhdGljIGludCBjaGVja19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwlpZiAoZGV2aXAtPnJlc2V0KSB7CisJCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IFJlcG9ydGluZyBVbml0ICIKKwkJCSAgICAgICAiYXR0ZW50aW9uOiBwb3dlciBvbiByZXNldFxuIik7CisJCWRldmlwLT5yZXNldCA9IDA7CisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgVU5JVF9BVFRFTlRJT04sIFBPV0VST05fUkVTRVQsIDApOworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgMCBpZiBvayBlbHNlIChESURfRVJST1IgPDwgMTYpLiBTZXRzIHNjcC0+cmVzaWQgLiAqLworc3RhdGljIGludCBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLCB1bnNpZ25lZCBjaGFyICogYXJyLAorCQkJCWludCBhcnJfbGVuKQoreworCWludCBrLCByZXFfbGVuLCBhY3RfbGVuLCBsZW4sIGFjdGl2ZTsKKwl2b2lkICoga2FkZHI7CisJdm9pZCAqIGthZGRyX29mZjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiBzZ3BudDsKKworCWlmICgwID09IHNjcC0+cmVxdWVzdF9idWZmbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoTlVMTCA9PSBzY3AtPnJlcXVlc3RfYnVmZmVyKQorCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CisJaWYgKCEgKChzY3AtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9CSURJUkVDVElPTkFMKSB8fAorCSAgICAgIChzY3AtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkpKQorCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CisJaWYgKDAgPT0gc2NwLT51c2Vfc2cpIHsKKwkJcmVxX2xlbiA9IHNjcC0+cmVxdWVzdF9idWZmbGVuOworCQlhY3RfbGVuID0gKHJlcV9sZW4gPCBhcnJfbGVuKSA/IHJlcV9sZW4gOiBhcnJfbGVuOworCQltZW1jcHkoc2NwLT5yZXF1ZXN0X2J1ZmZlciwgYXJyLCBhY3RfbGVuKTsKKwkJc2NwLT5yZXNpZCA9IHJlcV9sZW4gLSBhY3RfbGVuOworCQlyZXR1cm4gMDsKKwl9CisJc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKwlhY3RpdmUgPSAxOworCWZvciAoayA9IDAsIHJlcV9sZW4gPSAwLCBhY3RfbGVuID0gMDsgayA8IHNjcC0+dXNlX3NnOyArK2ssICsrc2dwbnQpIHsKKwkJaWYgKGFjdGl2ZSkgeworCQkJa2FkZHIgPSAodW5zaWduZWQgY2hhciAqKQorCQkJCWttYXBfYXRvbWljKHNncG50LT5wYWdlLCBLTV9VU0VSMCk7CisJCQlpZiAoTlVMTCA9PSBrYWRkcikKKwkJCQlyZXR1cm4gKERJRF9FUlJPUiA8PCAxNik7CisJCQlrYWRkcl9vZmYgPSAodW5zaWduZWQgY2hhciAqKWthZGRyICsgc2dwbnQtPm9mZnNldDsKKwkJCWxlbiA9IHNncG50LT5sZW5ndGg7CisJCQlpZiAoKHJlcV9sZW4gKyBsZW4pID4gYXJyX2xlbikgeworCQkJCWFjdGl2ZSA9IDA7CisJCQkJbGVuID0gYXJyX2xlbiAtIHJlcV9sZW47CisJCQl9CisJCQltZW1jcHkoa2FkZHJfb2ZmLCBhcnIgKyByZXFfbGVuLCBsZW4pOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJYWN0X2xlbiArPSBsZW47CisJCX0KKwkJcmVxX2xlbiArPSBzZ3BudC0+bGVuZ3RoOworCX0KKwlzY3AtPnJlc2lkID0gcmVxX2xlbiAtIGFjdF9sZW47CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGZldGNoZWQgaW50byAnYXJyJyBvciAtMSBpZiBlcnJvci4gKi8KK3N0YXRpYyBpbnQgZmV0Y2hfdG9fZGV2X2J1ZmZlcihzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLCB1bnNpZ25lZCBjaGFyICogYXJyLAorCQkJICAgICAgIGludCBtYXhfYXJyX2xlbikKK3sKKwlpbnQgaywgcmVxX2xlbiwgbGVuLCBmaW47CisJdm9pZCAqIGthZGRyOworCXZvaWQgKiBrYWRkcl9vZmY7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICogc2dwbnQ7CisKKwlpZiAoMCA9PSBzY3AtPnJlcXVlc3RfYnVmZmxlbikKKwkJcmV0dXJuIDA7CisJaWYgKE5VTEwgPT0gc2NwLT5yZXF1ZXN0X2J1ZmZlcikKKwkJcmV0dXJuIC0xOworCWlmICghICgoc2NwLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkgfHwKKwkgICAgICAoc2NwLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSkpCisJCXJldHVybiAtMTsKKwlpZiAoMCA9PSBzY3AtPnVzZV9zZykgeworCQlyZXFfbGVuID0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWxlbiA9IChyZXFfbGVuIDwgbWF4X2Fycl9sZW4pID8gcmVxX2xlbiA6IG1heF9hcnJfbGVuOworCQltZW1jcHkoYXJyLCBzY3AtPnJlcXVlc3RfYnVmZmVyLCBsZW4pOworCQlyZXR1cm4gbGVuOworCX0KKwlzZ3BudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworCWZvciAoayA9IDAsIHJlcV9sZW4gPSAwLCBmaW4gPSAwOyBrIDwgc2NwLT51c2Vfc2c7ICsraywgKytzZ3BudCkgeworCQlrYWRkciA9ICh1bnNpZ25lZCBjaGFyICopa21hcF9hdG9taWMoc2dwbnQtPnBhZ2UsIEtNX1VTRVIwKTsKKwkJaWYgKE5VTEwgPT0ga2FkZHIpCisJCQlyZXR1cm4gLTE7CisJCWthZGRyX29mZiA9ICh1bnNpZ25lZCBjaGFyICopa2FkZHIgKyBzZ3BudC0+b2Zmc2V0OworCQlsZW4gPSBzZ3BudC0+bGVuZ3RoOworCQlpZiAoKHJlcV9sZW4gKyBsZW4pID4gbWF4X2Fycl9sZW4pIHsKKwkJCWxlbiA9IG1heF9hcnJfbGVuIC0gcmVxX2xlbjsKKwkJCWZpbiA9IDE7CisJCX0KKwkJbWVtY3B5KGFyciArIHJlcV9sZW4sIGthZGRyX29mZiwgbGVuKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlpZiAoZmluKQorCQkJcmV0dXJuIHJlcV9sZW4gKyBsZW47CisJCXJlcV9sZW4gKz0gc2dwbnQtPmxlbmd0aDsKKwl9CisJcmV0dXJuIHJlcV9sZW47Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBpbnFfdmVuZG9yX2lkID0gIkxpbnV4ICAgIjsKK3N0YXRpYyBjb25zdCBjaGFyICogaW5xX3Byb2R1Y3RfaWQgPSAic2NzaV9kZWJ1ZyAgICAgICI7CitzdGF0aWMgY29uc3QgY2hhciAqIGlucV9wcm9kdWN0X3JldiA9ICIwMDA0IjsKKworc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODModW5zaWduZWQgY2hhciAqIGFyciwgaW50IGRldl9pZF9udW0sCisJCQkgICBjb25zdCBjaGFyICogZGV2X2lkX3N0ciwgaW50IGRldl9pZF9zdHJfbGVuKQoreworCWludCBudW07CisKKwkvKiBUd28gaWRlbnRpZmljYXRpb24gZGVzY3JpcHRvcnM6ICovCisJLyogVDEwIHZlbmRvciBpZGVudGlmaWVyIGZpZWxkIGZvcm1hdCAoZmFrZWQpICovCisJYXJyWzBdID0gMHgyOwkvKiBBU0NJSSAqLworCWFyclsxXSA9IDB4MTsKKwlhcnJbMl0gPSAweDA7CisJbWVtY3B5KCZhcnJbNF0sIGlucV92ZW5kb3JfaWQsIDgpOworCW1lbWNweSgmYXJyWzEyXSwgaW5xX3Byb2R1Y3RfaWQsIDE2KTsKKwltZW1jcHkoJmFyclsyOF0sIGRldl9pZF9zdHIsIGRldl9pZF9zdHJfbGVuKTsKKwludW0gPSA4ICsgMTYgKyBkZXZfaWRfc3RyX2xlbjsKKwlhcnJbM10gPSBudW07CisJbnVtICs9IDQ7CisJLyogTkFBIElFRUUgcmVnaXN0ZXJlZCBpZGVudGlmaWVyIChmYWtlZCkgKi8KKwlhcnJbbnVtXSA9IDB4MTsJLyogYmluYXJ5ICovCisJYXJyW251bSArIDFdID0gMHgzOworCWFycltudW0gKyAyXSA9IDB4MDsKKwlhcnJbbnVtICsgM10gPSAweDg7CisJYXJyW251bSArIDRdID0gMHg1MTsJLyogaWVlZSBjb21wYW55IGlkPTB4MTIzNDU2IChmYWtlZCkgKi8KKwlhcnJbbnVtICsgNV0gPSAweDIzOworCWFycltudW0gKyA2XSA9IDB4NDU7CisJYXJyW251bSArIDddID0gMHg2MDsKKwlhcnJbbnVtICsgOF0gPSAoZGV2X2lkX251bSA+PiAyNCk7CisJYXJyW251bSArIDldID0gKGRldl9pZF9udW0gPj4gMTYpICYgMHhmZjsKKwlhcnJbbnVtICsgMTBdID0gKGRldl9pZF9udW0gPj4gOCkgJiAweGZmOworCWFycltudW0gKyAxMV0gPSBkZXZfaWRfbnVtICYgMHhmZjsKKwlyZXR1cm4gbnVtICsgMTI7Cit9CisKKworI2RlZmluZSBTREVCVUdfTE9OR19JTlFfU1ogOTYKKyNkZWZpbmUgU0RFQlVHX01BWF9JTlFfQVJSX1NaIDEyOAorCitzdGF0aWMgaW50IHJlc3BfaW5xdWlyeShzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLCBpbnQgdGFyZ2V0LAorCQkJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGNoYXIgcHFfcGR0OworCXVuc2lnbmVkIGNoYXIgYXJyW1NERUJVR19NQVhfSU5RX0FSUl9TWl07CisJdW5zaWduZWQgY2hhciAqY21kID0gKHVuc2lnbmVkIGNoYXIgKilzY3AtPmNtbmQ7CisJaW50IGFsbG9jX2xlbjsKKworCWFsbG9jX2xlbiA9IChjbWRbM10gPDwgOCkgKyBjbWRbNF07CisJbWVtc2V0KGFyciwgMCwgU0RFQlVHX01BWF9JTlFfQVJSX1NaKTsKKwlwcV9wZHQgPSAoc2NzaV9kZWJ1Z19wdHlwZSAmIDB4MWYpOworCWFyclswXSA9IHBxX3BkdDsKKwlpZiAoMHgyICYgY21kWzFdKSB7ICAvKiBDTUREVCBiaXQgc2V0ICovCisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCBJTlZBTElEX0ZJRUxEX0lOX0NEQiwKKwkJCSAgICAgICAJMCk7CisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCX0gZWxzZSBpZiAoMHgxICYgY21kWzFdKSB7ICAvKiBFVlBEIGJpdCBzZXQgKi8KKwkJaW50IGRldl9pZF9udW0sIGxlbjsKKwkJY2hhciBkZXZfaWRfc3RyWzZdOworCQkKKwkJZGV2X2lkX251bSA9ICgoZGV2aXAtPnNkYmdfaG9zdC0+c2hvc3QtPmhvc3Rfbm8gKyAxKSAqIDIwMDApICsKKwkJCSAgICAgKGRldmlwLT50YXJnZXQgKiAxMDAwKSArIGRldmlwLT5sdW47CisJCWxlbiA9IHNjbnByaW50ZihkZXZfaWRfc3RyLCA2LCAiJWQiLCBkZXZfaWRfbnVtKTsKKwkJaWYgKDAgPT0gY21kWzJdKSB7IC8qIHN1cHBvcnRlZCB2aXRhbCBwcm9kdWN0IGRhdGEgcGFnZXMgKi8KKwkJCWFyclszXSA9IDM7CisJCQlhcnJbNF0gPSAweDA7IC8qIHRoaXMgcGFnZSAqLworCQkJYXJyWzVdID0gMHg4MDsgLyogdW5pdCBzZXJpYWwgbnVtYmVyICovCisJCQlhcnJbNl0gPSAweDgzOyAvKiBkZXZpY2UgaWRlbnRpZmljYXRpb24gKi8KKwkJfSBlbHNlIGlmICgweDgwID09IGNtZFsyXSkgeyAvKiB1bml0IHNlcmlhbCBudW1iZXIgKi8KKwkJCWFyclsxXSA9IDB4ODA7CisJCQlhcnJbM10gPSBsZW47CisJCQltZW1jcHkoJmFycls0XSwgZGV2X2lkX3N0ciwgbGVuKTsKKwkJfSBlbHNlIGlmICgweDgzID09IGNtZFsyXSkgeyAvKiBkZXZpY2UgaWRlbnRpZmljYXRpb24gKi8KKwkJCWFyclsxXSA9IDB4ODM7CisJCQlhcnJbM10gPSBpbnF1aXJ5X2V2cGRfODMoJmFycls0XSwgZGV2X2lkX251bSwKKwkJCQkJCSBkZXZfaWRfc3RyLCBsZW4pOworCQl9IGVsc2UgeworCQkJLyogSWxsZWdhbCByZXF1ZXN0LCBpbnZhbGlkIGZpZWxkIGluIGNkYiAqLworCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsCisJCQkJCUlOVkFMSURfRklFTERfSU5fQ0RCLCAwKTsKKwkJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCQl9CisJCXJldHVybiBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwKKwkJCSAgICBtaW4oYWxsb2NfbGVuLCBTREVCVUdfTUFYX0lOUV9BUlJfU1opKTsKKwl9CisJLyogZHJvcHMgdGhyb3VnaCBoZXJlIGZvciBhIHN0YW5kYXJkIGlucXVpcnkgKi8KKwlhcnJbMV0gPSBERVZfUkVNT1ZFQUJMRSh0YXJnZXQpID8gMHg4MCA6IDA7CS8qIFJlbW92YWJsZSBkaXNrICovCisJYXJyWzJdID0gc2NzaV9kZWJ1Z19zY3NpX2xldmVsOworCWFyclszXSA9IDI7ICAgIC8qIHJlc3BvbnNlX2RhdGFfZm9ybWF0PT0yICovCisJYXJyWzRdID0gU0RFQlVHX0xPTkdfSU5RX1NaIC0gNTsKKwlhcnJbNl0gPSAweDE7IC8qIGNsYWltOiBBRERSMTYgKi8KKwkvKiBhcnJbNl0gfD0gMHg0MDsgLi4uIGNsYWltOiBFbmNTZXJ2IChlbmNsb3N1cmUgc2VydmljZXMpICovCisJYXJyWzddID0gMHgzYTsgLyogY2xhaW06IFdCVVMxNiwgU1lOQywgTElOS0VEICsgQ01EUVVFICovCisJbWVtY3B5KCZhcnJbOF0sIGlucV92ZW5kb3JfaWQsIDgpOworCW1lbWNweSgmYXJyWzE2XSwgaW5xX3Byb2R1Y3RfaWQsIDE2KTsKKwltZW1jcHkoJmFyclszMl0sIGlucV9wcm9kdWN0X3JldiwgNCk7CisJLyogdmVyc2lvbiBkZXNjcmlwdG9ycyAoMiBieXRlcyBlYWNoKSBmb2xsb3cgKi8KKwlhcnJbNThdID0gMHgwOyBhcnJbNTldID0gMHg0MDsgLyogU0FNLTIgKi8KKwlhcnJbNjBdID0gMHgzOyBhcnJbNjFdID0gMHgwOyAgLyogU1BDLTMgKi8KKwlpZiAoc2NzaV9kZWJ1Z19wdHlwZSA9PSAwKSB7CisJCWFycls2Ml0gPSAweDE7IGFycls2M10gPSAweDgwOyAvKiBTQkMgKi8KKwl9IGVsc2UgaWYgKHNjc2lfZGVidWdfcHR5cGUgPT0gMSkgeworCQlhcnJbNjJdID0gMHgyOyBhcnJbNjNdID0gMHgwMDsgLyogU1NDICovCisJfQorCXJldHVybiBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwKKwkJCSAgICBtaW4oYWxsb2NfbGVuLCBTREVCVUdfTE9OR19JTlFfU1opKTsKK30KKworc3RhdGljIGludCByZXNwX3JlcXVlc3RzKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsCisJCQkgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGNoYXIgKiBzYnVmZjsKKwl1bnNpZ25lZCBjaGFyICpjbWQgPSAodW5zaWduZWQgY2hhciAqKXNjcC0+Y21uZDsKKwl1bnNpZ25lZCBjaGFyIGFycltTREVCVUdfU0VOU0VfTEVOXTsKKwlpbnQgbGVuID0gMTg7CisKKwltZW1zZXQoYXJyLCAwLCBTREVCVUdfU0VOU0VfTEVOKTsKKwlpZiAoZGV2aXAtPnJlc2V0ID09IDEpCisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgMCwgTk9fQURERURfU0VOU0UsIDApOworCXNidWZmID0gZGV2aXAtPnNlbnNlX2J1ZmY7CisJaWYgKChjbWRbMV0gJiAxKSAmJiAoISBzY3NpX2RlYnVnX2RzZW5zZSkpIHsKKwkJLyogREVTQyBiaXQgc2V0IGFuZCBzZW5zZV9idWZmIGluIGZpeGVkIGZvcm1hdCAqLworCQlhcnJbMF0gPSAweDcyOworCQlhcnJbMV0gPSBzYnVmZlsyXTsgICAgIC8qIHNlbnNlIGtleSAqLworCQlhcnJbMl0gPSBzYnVmZlsxMl07ICAgIC8qIGFzYyAqLworCQlhcnJbM10gPSBzYnVmZlsxM107ICAgIC8qIGFzY3EgKi8KKwkJbGVuID0gODsKKwl9IGVsc2UKKwkJbWVtY3B5KGFyciwgc2J1ZmYsIFNERUJVR19TRU5TRV9MRU4pOworCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgMCwgTk9fQURERURfU0VOU0UsIDApOworCXJldHVybiBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwgbGVuKTsKK30KKworI2RlZmluZSBTREVCVUdfUkVBRENBUF9BUlJfU1ogOAorc3RhdGljIGludCByZXNwX3JlYWRjYXAoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwKKwkJCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGFycltTREVCVUdfUkVBRENBUF9BUlJfU1pdOworCXVuc2lnbmVkIGxvbmcgY2FwYWM7CisJaW50IGVycnN0czsKKworCWlmICgoZXJyc3RzID0gY2hlY2tfcmVzZXQoc2NwLCBkZXZpcCkpKQorCQlyZXR1cm4gZXJyc3RzOworCW1lbXNldChhcnIsIDAsIFNERUJVR19SRUFEQ0FQX0FSUl9TWik7CisJY2FwYWMgPSAodW5zaWduZWQgbG9uZylzZGVidWdfY2FwYWNpdHkgLSAxOworCWFyclswXSA9IChjYXBhYyA+PiAyNCk7CisJYXJyWzFdID0gKGNhcGFjID4+IDE2KSAmIDB4ZmY7CisJYXJyWzJdID0gKGNhcGFjID4+IDgpICYgMHhmZjsKKwlhcnJbM10gPSBjYXBhYyAmIDB4ZmY7CisJYXJyWzZdID0gKFNFQ1RfU0laRV9QRVIodGFyZ2V0KSA+PiA4KSAmIDB4ZmY7CisJYXJyWzddID0gU0VDVF9TSVpFX1BFUih0YXJnZXQpICYgMHhmZjsKKwlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsIFNERUJVR19SRUFEQ0FQX0FSUl9TWik7Cit9CisKKy8qIDw8Rm9sbG93aW5nIG1vZGUgcGFnZSBpbmZvIGNvcGllZCBmcm9tIFNUMzE4NDUxTFc+PiAqLworCitzdGF0aWMgaW50IHJlc3BfZXJyX3JlY292X3BnKHVuc2lnbmVkIGNoYXIgKiBwLCBpbnQgcGNvbnRyb2wsIGludCB0YXJnZXQpCit7CS8qIFJlYWQtV3JpdGUgRXJyb3IgUmVjb3ZlcnkgcGFnZSBmb3IgbW9kZV9zZW5zZSAqLworCXVuc2lnbmVkIGNoYXIgZXJyX3JlY292X3BnW10gPSB7MHgxLCAweGEsIDB4YzAsIDExLCAyNDAsIDAsIDAsIDAsCisJCQkJCTUsIDAsIDB4ZmYsIDB4ZmZ9OworCisJbWVtY3B5KHAsIGVycl9yZWNvdl9wZywgc2l6ZW9mKGVycl9yZWNvdl9wZykpOworCWlmICgxID09IHBjb250cm9sKQorCQltZW1zZXQocCArIDIsIDAsIHNpemVvZihlcnJfcmVjb3ZfcGcpIC0gMik7CisJcmV0dXJuIHNpemVvZihlcnJfcmVjb3ZfcGcpOworfQorCitzdGF0aWMgaW50IHJlc3BfZGlzY29ubmVjdF9wZyh1bnNpZ25lZCBjaGFyICogcCwgaW50IHBjb250cm9sLCBpbnQgdGFyZ2V0KQoreyAJLyogRGlzY29ubmVjdC1SZWNvbm5lY3QgcGFnZSBmb3IgbW9kZV9zZW5zZSAqLworCXVuc2lnbmVkIGNoYXIgZGlzY29ubmVjdF9wZ1tdID0gezB4MiwgMHhlLCAxMjgsIDEyOCwgMCwgMTAsIDAsIDAsCisJCQkJCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKworCW1lbWNweShwLCBkaXNjb25uZWN0X3BnLCBzaXplb2YoZGlzY29ubmVjdF9wZykpOworCWlmICgxID09IHBjb250cm9sKQorCQltZW1zZXQocCArIDIsIDAsIHNpemVvZihkaXNjb25uZWN0X3BnKSAtIDIpOworCXJldHVybiBzaXplb2YoZGlzY29ubmVjdF9wZyk7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF9mb3JtYXRfcGcodW5zaWduZWQgY2hhciAqIHAsIGludCBwY29udHJvbCwgaW50IHRhcmdldCkKK3sgICAgICAgLyogRm9ybWF0IGRldmljZSBwYWdlIGZvciBtb2RlX3NlbnNlICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgZm9ybWF0X3BnW10gPSB7MHgzLCAweDE2LCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMHg0MCwgMCwgMCwgMH07CisKKyAgICAgICAgbWVtY3B5KHAsIGZvcm1hdF9wZywgc2l6ZW9mKGZvcm1hdF9wZykpOworICAgICAgICBwWzEwXSA9IChzZGVidWdfc2VjdG9yc19wZXIgPj4gOCkgJiAweGZmOworICAgICAgICBwWzExXSA9IHNkZWJ1Z19zZWN0b3JzX3BlciAmIDB4ZmY7CisgICAgICAgIHBbMTJdID0gKFNFQ1RfU0laRSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIHBbMTNdID0gU0VDVF9TSVpFICYgMHhmZjsKKyAgICAgICAgaWYgKERFVl9SRU1PVkVBQkxFKHRhcmdldCkpCisgICAgICAgICAgICAgICAgcFsyMF0gfD0gMHgyMDsgLyogc2hvdWxkIGFncmVlIHdpdGggSU5RVUlSWSAqLworICAgICAgICBpZiAoMSA9PSBwY29udHJvbCkKKyAgICAgICAgICAgICAgICBtZW1zZXQocCArIDIsIDAsIHNpemVvZihmb3JtYXRfcGcpIC0gMik7CisgICAgICAgIHJldHVybiBzaXplb2YoZm9ybWF0X3BnKTsKK30KKworc3RhdGljIGludCByZXNwX2NhY2hpbmdfcGcodW5zaWduZWQgY2hhciAqIHAsIGludCBwY29udHJvbCwgaW50IHRhcmdldCkKK3sgCS8qIENhY2hpbmcgcGFnZSBmb3IgbW9kZV9zZW5zZSAqLworCXVuc2lnbmVkIGNoYXIgY2FjaGluZ19wZ1tdID0gezB4OCwgMTgsIDB4MTQsIDAsIDB4ZmYsIDB4ZmYsIDAsIDAsCisJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ODAsIDB4MTQsIDAsIDAsICAgICAwLCAwLCAwLCAwfTsKKworCW1lbWNweShwLCBjYWNoaW5nX3BnLCBzaXplb2YoY2FjaGluZ19wZykpOworCWlmICgxID09IHBjb250cm9sKQorCQltZW1zZXQocCArIDIsIDAsIHNpemVvZihjYWNoaW5nX3BnKSAtIDIpOworCXJldHVybiBzaXplb2YoY2FjaGluZ19wZyk7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF9jdHJsX21fcGcodW5zaWduZWQgY2hhciAqIHAsIGludCBwY29udHJvbCwgaW50IHRhcmdldCkKK3sgCS8qIENvbnRyb2wgbW9kZSBwYWdlIGZvciBtb2RlX3NlbnNlICovCisJdW5zaWduZWQgY2hhciBjdHJsX21fcGdbXSA9IHsweGEsIDEwLCAyLCAwLCAwLCAwLCAwLCAwLAorCQkJCSAgICAgMCwgMCwgMHgyLCAweDRifTsKKworCWlmIChzY3NpX2RlYnVnX2RzZW5zZSkKKwkJY3RybF9tX3BnWzJdIHw9IDB4NDsKKwltZW1jcHkocCwgY3RybF9tX3BnLCBzaXplb2YoY3RybF9tX3BnKSk7CisJaWYgKDEgPT0gcGNvbnRyb2wpCisJCW1lbXNldChwICsgMiwgMCwgc2l6ZW9mKGN0cmxfbV9wZykgLSAyKTsKKwlyZXR1cm4gc2l6ZW9mKGN0cmxfbV9wZyk7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF9pZWNfbV9wZyh1bnNpZ25lZCBjaGFyICogcCwgaW50IHBjb250cm9sLCBpbnQgdGFyZ2V0KQorewkvKiBJbmZvcm1hdGlvbmFsIEV4Y2VwdGlvbnMgY29udHJvbCBtb2RlIHBhZ2UgZm9yIG1vZGVfc2Vuc2UgKi8KKwl1bnNpZ25lZCBjaGFyIGllY19tX3BnW10gPSB7MHgxYywgMHhhLCAweDA4LCAwLCAwLCAwLCAwLCAwLAorCQkJCSAgICAwLCAwLCAweDAsIDB4MH07CisJbWVtY3B5KHAsIGllY19tX3BnLCBzaXplb2YoaWVjX21fcGcpKTsKKwlpZiAoMSA9PSBwY29udHJvbCkKKwkJbWVtc2V0KHAgKyAyLCAwLCBzaXplb2YoaWVjX21fcGcpIC0gMik7CisJcmV0dXJuIHNpemVvZihpZWNfbV9wZyk7Cit9CisKKyNkZWZpbmUgU0RFQlVHX01BWF9NU0VOU0VfU1ogMjU2CisKK3N0YXRpYyBpbnQgcmVzcF9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsIGludCB0YXJnZXQsCisJCQkgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApCit7CisJdW5zaWduZWQgY2hhciBkYmQ7CisJaW50IHBjb250cm9sLCBwY29kZSwgc3VicGNvZGU7CisJdW5zaWduZWQgY2hhciBkZXZfc3BlYzsKKwlpbnQgYWxsb2NfbGVuLCBtc2Vuc2VfNiwgb2Zmc2V0LCBsZW4sIGVycnN0czsKKwl1bnNpZ25lZCBjaGFyICogYXA7CisJdW5zaWduZWQgY2hhciBhcnJbU0RFQlVHX01BWF9NU0VOU0VfU1pdOworCXVuc2lnbmVkIGNoYXIgKmNtZCA9ICh1bnNpZ25lZCBjaGFyICopc2NwLT5jbW5kOworCisJaWYgKChlcnJzdHMgPSBjaGVja19yZXNldChzY3AsIGRldmlwKSkpCisJCXJldHVybiBlcnJzdHM7CisJZGJkID0gY21kWzFdICYgMHg4OworCXBjb250cm9sID0gKGNtZFsyXSAmIDB4YzApID4+IDY7CisJcGNvZGUgPSBjbWRbMl0gJiAweDNmOworCXN1YnBjb2RlID0gY21kWzNdOworCW1zZW5zZV82ID0gKE1PREVfU0VOU0UgPT0gY21kWzBdKTsKKwlhbGxvY19sZW4gPSBtc2Vuc2VfNiA/IGNtZFs0XSA6ICgoY21kWzddIDw8IDgpIHwgY21kWzhdKTsKKwltZW1zZXQoYXJyLCAwLCBTREVCVUdfTUFYX01TRU5TRV9TWik7CisJaWYgKDB4MyA9PSBwY29udHJvbCkgeyAgLyogU2F2aW5nIHZhbHVlcyBub3Qgc3VwcG9ydGVkICovCisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCBTQVZJTkdfUEFSQU1TX1VOU1VQLAorCQkJICAgICAgIAkwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCWRldl9zcGVjID0gREVWX1JFQURPTkxZKHRhcmdldCkgPyAweDgwIDogMHgwOworCWlmIChtc2Vuc2VfNikgeworCQlhcnJbMl0gPSBkZXZfc3BlYzsKKwkJb2Zmc2V0ID0gNDsKKwl9IGVsc2UgeworCQlhcnJbM10gPSBkZXZfc3BlYzsKKwkJb2Zmc2V0ID0gODsKKwl9CisJYXAgPSBhcnIgKyBvZmZzZXQ7CisKKwlpZiAoMCAhPSBzdWJwY29kZSkgeyAvKiBUT0RPOiBDb250cm9sIEV4dGVuc2lvbiBwYWdlICovCisJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULCBJTlZBTElEX0ZJRUxEX0lOX0NEQiwKKwkJCSAgICAgICAJMCk7CisJCXJldHVybiBjaGVja19jb25kaXRpb25fcmVzdWx0OworCX0KKwlzd2l0Y2ggKHBjb2RlKSB7CisJY2FzZSAweDE6CS8qIFJlYWQtV3JpdGUgZXJyb3IgcmVjb3ZlcnkgcGFnZSwgZGlyZWN0IGFjY2VzcyAqLworCQlsZW4gPSByZXNwX2Vycl9yZWNvdl9wZyhhcCwgcGNvbnRyb2wsIHRhcmdldCk7CisJCW9mZnNldCArPSBsZW47CisJCWJyZWFrOworCWNhc2UgMHgyOgkvKiBEaXNjb25uZWN0LVJlY29ubmVjdCBwYWdlLCBhbGwgZGV2aWNlcyAqLworCQlsZW4gPSByZXNwX2Rpc2Nvbm5lY3RfcGcoYXAsIHBjb250cm9sLCB0YXJnZXQpOworCQlvZmZzZXQgKz0gbGVuOworCQlicmVhazsKKyAgICAgICAgY2FzZSAweDM6ICAgICAgIC8qIEZvcm1hdCBkZXZpY2UgcGFnZSwgZGlyZWN0IGFjY2VzcyAqLworICAgICAgICAgICAgICAgIGxlbiA9IHJlc3BfZm9ybWF0X3BnKGFwLCBwY29udHJvbCwgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuOworICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgMHg4OgkvKiBDYWNoaW5nIHBhZ2UsIGRpcmVjdCBhY2Nlc3MgKi8KKwkJbGVuID0gcmVzcF9jYWNoaW5nX3BnKGFwLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJYnJlYWs7CisJY2FzZSAweGE6CS8qIENvbnRyb2wgTW9kZSBwYWdlLCBhbGwgZGV2aWNlcyAqLworCQlsZW4gPSByZXNwX2N0cmxfbV9wZyhhcCwgcGNvbnRyb2wsIHRhcmdldCk7CisJCW9mZnNldCArPSBsZW47CisJCWJyZWFrOworCWNhc2UgMHgxYzoJLyogSW5mb3JtYXRpb25hbCBFeGNlcHRpb25zIE1vZGUgcGFnZSwgYWxsIGRldmljZXMgKi8KKwkJbGVuID0gcmVzcF9pZWNfbV9wZyhhcCwgcGNvbnRyb2wsIHRhcmdldCk7CisJCW9mZnNldCArPSBsZW47CisJCWJyZWFrOworCWNhc2UgMHgzZjoJLyogUmVhZCBhbGwgTW9kZSBwYWdlcyAqLworCQlsZW4gPSByZXNwX2Vycl9yZWNvdl9wZyhhcCwgcGNvbnRyb2wsIHRhcmdldCk7CisJCWxlbiArPSByZXNwX2Rpc2Nvbm5lY3RfcGcoYXAgKyBsZW4sIHBjb250cm9sLCB0YXJnZXQpOworCQlsZW4gKz0gcmVzcF9mb3JtYXRfcGcoYXAgKyBsZW4sIHBjb250cm9sLCB0YXJnZXQpOworCQlsZW4gKz0gcmVzcF9jYWNoaW5nX3BnKGFwICsgbGVuLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJbGVuICs9IHJlc3BfY3RybF9tX3BnKGFwICsgbGVuLCBwY29udHJvbCwgdGFyZ2V0KTsKKwkJbGVuICs9IHJlc3BfaWVjX21fcGcoYXAgKyBsZW4sIHBjb250cm9sLCB0YXJnZXQpOworCQlvZmZzZXQgKz0gbGVuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIElMTEVHQUxfUkVRVUVTVCwgSU5WQUxJRF9GSUVMRF9JTl9DREIsCisJCQkgICAgICAgCTApOworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9CisJaWYgKG1zZW5zZV82KQorCQlhcnJbMF0gPSBvZmZzZXQgLSAxOworCWVsc2UgeworCQlhcnJbMF0gPSAoKG9mZnNldCAtIDIpID4+IDgpICYgMHhmZjsKKwkJYXJyWzFdID0gKG9mZnNldCAtIDIpICYgMHhmZjsKKwl9CisJcmV0dXJuIGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLCBtaW4oYWxsb2NfbGVuLCBvZmZzZXQpKTsKK30KKworc3RhdGljIGludCByZXNwX3JlYWQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50LCBpbnQgdXBwZXJfYmxrLCBpbnQgYmxvY2ssCisJCSAgICAgaW50IG51bSwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCByZXQ7CisKKwlpZiAodXBwZXJfYmxrIHx8IChibG9jayArIG51bSA+IHNkZWJ1Z19jYXBhY2l0eSkpIHsKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIEFERFJfT1VUX09GX1JBTkdFLAorCQkJCTApOworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9CisJaWYgKChTQ1NJX0RFQlVHX09QVF9NRURJVU1fRVJSICYgc2NzaV9kZWJ1Z19vcHRzKSAmJgorCSAgICAoYmxvY2sgPD0gT1BUX01FRElVTV9FUlJfQUREUikgJiYKKwkgICAgKChibG9jayArIG51bSkgPiBPUFRfTUVESVVNX0VSUl9BRERSKSkgeworCQlta19zZW5zZV9idWZmZXIoZGV2aXAsIE1FRElVTV9FUlJPUiwgVU5SRUNPVkVSRURfUkVBRF9FUlIsCisJCQkJMCk7CisJCS8qIGNsYWltIHVucmVjb3ZlcmFibGUgcmVhZCBlcnJvciAqLworCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKKwl9CisJcmVhZF9sb2NrX2lycXNhdmUoJmF0b21pY19ydywgaWZsYWdzKTsKKwlyZXQgPSBmaWxsX2Zyb21fZGV2X2J1ZmZlcihTQ3BudCwgZmFrZV9zdG9yZXAgKyAoYmxvY2sgKiBTRUNUX1NJWkUpLAorCQkJICAgCSAgIG51bSAqIFNFQ1RfU0laRSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVzcF93cml0ZShzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsIGludCB1cHBlcl9ibGssIGludCBibG9jaywKKwkJICAgICAgaW50IG51bSwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKQoreworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCByZXM7CisKKwlpZiAodXBwZXJfYmxrIHx8IChibG9jayArIG51bSA+IHNkZWJ1Z19jYXBhY2l0eSkpIHsKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIEFERFJfT1VUX09GX1JBTkdFLAorCQkJICAgICAgIAkwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCisJd3JpdGVfbG9ja19pcnFzYXZlKCZhdG9taWNfcncsIGlmbGFncyk7CisJcmVzID0gZmV0Y2hfdG9fZGV2X2J1ZmZlcihTQ3BudCwgZmFrZV9zdG9yZXAgKyAoYmxvY2sgKiBTRUNUX1NJWkUpLAorCQkJICAgCSAgbnVtICogU0VDVF9TSVpFKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYXRvbWljX3J3LCBpZmxhZ3MpOworCWlmICgtMSA9PSByZXMpCisJCXJldHVybiAoRElEX0VSUk9SIDw8IDE2KTsKKwllbHNlIGlmICgocmVzIDwgKG51bSAqIFNFQ1RfU0laRSkpICYmCisJCSAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpKQorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiB3cml0ZTogY2RiIGluZGljYXRlZD0lZCwgIgorCQkgICAgICAgIiBJTyBzZW50PSVkIGJ5dGVzXG4iLCBudW0gKiBTRUNUX1NJWkUsIHJlcyk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0RFQlVHX1JMVU5fQVJSX1NaIDEyOAorCitzdGF0aWMgaW50IHJlc3BfcmVwb3J0X2x1bnMoc3RydWN0IHNjc2lfY21uZCAqIHNjcCwKKwkJCSAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApCit7CisJdW5zaWduZWQgaW50IGFsbG9jX2xlbjsKKwlpbnQgbHVuX2NudCwgaSwgdXBwZXI7CisJdW5zaWduZWQgY2hhciAqY21kID0gKHVuc2lnbmVkIGNoYXIgKilzY3AtPmNtbmQ7CisJaW50IHNlbGVjdF9yZXBvcnQgPSAoaW50KWNtZFsyXTsKKwlzdHJ1Y3Qgc2NzaV9sdW4gKm9uZV9sdW47CisJdW5zaWduZWQgY2hhciBhcnJbU0RFQlVHX1JMVU5fQVJSX1NaXTsKKworCWFsbG9jX2xlbiA9IGNtZFs5XSArIChjbWRbOF0gPDwgOCkgKyAoY21kWzddIDw8IDE2KSArIChjbWRbNl0gPDwgMjQpOworCWlmICgoYWxsb2NfbGVuIDwgMTYpIHx8IChzZWxlY3RfcmVwb3J0ID4gMikpIHsKKwkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIElOVkFMSURfRklFTERfSU5fQ0RCLAorCQkJICAgICAgIAkwKTsKKwkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CisJfQorCS8qIGNhbiBwcm9kdWNlIHJlc3BvbnNlIHdpdGggdXAgdG8gMTZrIGx1bnMgKGx1biAwIHRvIGx1biAxNjM4MykgKi8KKwltZW1zZXQoYXJyLCAwLCBTREVCVUdfUkxVTl9BUlJfU1opOworCWx1bl9jbnQgPSBzY3NpX2RlYnVnX21heF9sdW5zOworCWFyclsyXSA9ICgoc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikgKiBsdW5fY250KSA+PiA4KSAmIDB4ZmY7CisJYXJyWzNdID0gKHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pICogbHVuX2NudCkgJiAweGZmOworCWx1bl9jbnQgPSBtaW4oKGludCkoKFNERUJVR19STFVOX0FSUl9TWiAtIDgpIC8KKwkJCSAgICBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSksIGx1bl9jbnQpOworCW9uZV9sdW4gPSAoc3RydWN0IHNjc2lfbHVuICopICZhcnJbOF07CisJZm9yIChpID0gMDsgaSA8IGx1bl9jbnQ7IGkrKykgeworCQl1cHBlciA9IChpID4+IDgpICYgMHgzZjsKKwkJaWYgKHVwcGVyKQorCQkJb25lX2x1bltpXS5zY3NpX2x1blswXSA9CisJCQkgICAgKHVwcGVyIHwgKFNBTTJfTFVOX0FERFJFU1NfTUVUSE9EIDw8IDYpKTsKKwkJb25lX2x1bltpXS5zY3NpX2x1blsxXSA9IGkgJiAweGZmOworCX0KKwlyZXR1cm4gZmlsbF9mcm9tX2Rldl9idWZmZXIoc2NwLCBhcnIsCisJCQkJICAgIG1pbigoaW50KWFsbG9jX2xlbiwgU0RFQlVHX1JMVU5fQVJSX1NaKSk7Cit9CisKKy8qIFdoZW4gdGltZXIgZ29lcyBvZmYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICovCitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBpbmR4KQoreworCXN0cnVjdCBzZGVidWdfcXVldWVkX2NtZCAqIHNxY3A7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlpZiAoaW5keCA+PSBTQ1NJX0RFQlVHX0NBTlFVRVVFKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaV9kZWJ1Zzp0aW1lcl9pbnRyX2hhbmRsZXI6IGluZHggdG9vICIKKwkJICAgICAgICJsYXJnZVxuIik7CisJCXJldHVybjsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKKwlzcWNwID0gJnF1ZXVlZF9hcnJbKGludClpbmR4XTsKKwlpZiAoISBzcWNwLT5pbl91c2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpX2RlYnVnOnRpbWVyX2ludHJfaGFuZGxlcjogVW5leHBlY3RlZCAiCisJCSAgICAgICAiaW50ZXJydXB0XG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXNxY3AtPmluX3VzZSA9IDA7CisJaWYgKHNxY3AtPmRvbmVfZnVuY3QpIHsKKwkJc3FjcC0+YV9jbW5kLT5yZXN1bHQgPSBzcWNwLT5zY3NpX3Jlc3VsdDsKKwkJc3FjcC0+ZG9uZV9mdW5jdChzcWNwLT5hX2NtbmQpOyAvKiBjYWxsYmFjayB0byBtaWQgbGV2ZWwgKi8KKwl9CisJc3FjcC0+ZG9uZV9mdW5jdCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICogc2RwKQoreworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1Zzogc2xhdmVfYWxsb2MgPCV1ICV1ICV1ICV1PlxuIiwKKwkJICAgICAgIHNkcC0+aG9zdC0+aG9zdF9ubywgc2RwLT5jaGFubmVsLCBzZHAtPmlkLCBzZHAtPmx1bik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICogc2RwKQoreworCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcDsKKworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1Zzogc2xhdmVfY29uZmlndXJlIDwldSAldSAldSAldT5cbiIsCisJCSAgICAgICBzZHAtPmhvc3QtPmhvc3Rfbm8sIHNkcC0+Y2hhbm5lbCwgc2RwLT5pZCwgc2RwLT5sdW4pOworCWlmIChzZHAtPmhvc3QtPm1heF9jbWRfbGVuICE9IFNDU0lfREVCVUdfTUFYX0NNRF9MRU4pCisJCXNkcC0+aG9zdC0+bWF4X2NtZF9sZW4gPSBTQ1NJX0RFQlVHX01BWF9DTURfTEVOOworCWRldmlwID0gZGV2SW5mb1JlZyhzZHApOworCXNkcC0+aG9zdGRhdGEgPSBkZXZpcDsKKwlpZiAoc2RwLT5ob3N0LT5jbWRfcGVyX2x1bikKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RwLCBTREVCVUdfVEFHR0VEX1FVRVVJTkcsCisJCQkJCXNkcC0+aG9zdC0+Y21kX3Blcl9sdW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY3NpX2RlYnVnX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICogc2RwKQoreworCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCA9CisJCQkJKHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKilzZHAtPmhvc3RkYXRhOworCisJaWYgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKQorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBzbGF2ZV9kZXN0cm95IDwldSAldSAldSAldT5cbiIsCisJCSAgICAgICBzZHAtPmhvc3QtPmhvc3Rfbm8sIHNkcC0+Y2hhbm5lbCwgc2RwLT5pZCwgc2RwLT5sdW4pOworCWlmIChkZXZpcCkgeworCQkvKiBtYWtlIHRoaXMgc2xvdCBhdmFsaWFibGUgZm9yIHJlLXVzZSAqLworCQlkZXZpcC0+dXNlZCA9IDA7CisJCXNkcC0+aG9zdGRhdGEgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZJbmZvUmVnKHN0cnVjdCBzY3NpX2RldmljZSAqIHNkZXYpCit7CisJc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKiBzZGJnX2hvc3Q7CisJc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIG9wZW5fZGV2aXAgPSBOVUxMOworCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCA9CisJCQkoc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqKXNkZXYtPmhvc3RkYXRhOworCisJaWYgKGRldmlwKQorCQlyZXR1cm4gZGV2aXA7CisJc2RiZ19ob3N0ID0gKihzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqKikgc2Rldi0+aG9zdC0+aG9zdGRhdGE7CisgICAgICAgIGlmKCEgc2RiZ19ob3N0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJIb3N0IGluZm8gTlVMTFxuIik7CisJCXJldHVybiBOVUxMOworICAgICAgICB9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpcCwgJnNkYmdfaG9zdC0+ZGV2X2luZm9fbGlzdCwgZGV2X2xpc3QpIHsKKwkJaWYgKChkZXZpcC0+dXNlZCkgJiYgKGRldmlwLT5jaGFubmVsID09IHNkZXYtPmNoYW5uZWwpICYmCisgICAgICAgICAgICAgICAgICAgIChkZXZpcC0+dGFyZ2V0ID09IHNkZXYtPmlkKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGV2aXAtPmx1biA9PSBzZGV2LT5sdW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmlwOworCQllbHNlIHsKKwkJCWlmICgoIWRldmlwLT51c2VkKSAmJiAoIW9wZW5fZGV2aXApKQorCQkJCW9wZW5fZGV2aXAgPSBkZXZpcDsKKwkJfQorCX0KKwlpZiAoTlVMTCA9PSBvcGVuX2RldmlwKSB7IC8qIHRyeSBhbmQgbWFrZSBhIG5ldyBvbmUgKi8KKwkJb3Blbl9kZXZpcCA9IGttYWxsb2Moc2l6ZW9mKCpvcGVuX2RldmlwKSxHRlBfS0VSTkVMKTsKKwkJaWYgKE5VTEwgPT0gb3Blbl9kZXZpcCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeSBhdCBsaW5lICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtc2V0KG9wZW5fZGV2aXAsIDAsIHNpemVvZigqb3Blbl9kZXZpcCkpOworCQlvcGVuX2RldmlwLT5zZGJnX2hvc3QgPSBzZGJnX2hvc3Q7CisJCWxpc3RfYWRkX3RhaWwoJm9wZW5fZGV2aXAtPmRldl9saXN0LAorCQkmc2RiZ19ob3N0LT5kZXZfaW5mb19saXN0KTsKKwl9CisgICAgICAgIGlmIChvcGVuX2RldmlwKSB7CisJCW9wZW5fZGV2aXAtPmNoYW5uZWwgPSBzZGV2LT5jaGFubmVsOworCQlvcGVuX2RldmlwLT50YXJnZXQgPSBzZGV2LT5pZDsKKwkJb3Blbl9kZXZpcC0+bHVuID0gc2Rldi0+bHVuOworCQlvcGVuX2RldmlwLT5zZGJnX2hvc3QgPSBzZGJnX2hvc3Q7CisJCW9wZW5fZGV2aXAtPnJlc2V0ID0gMTsKKwkJb3Blbl9kZXZpcC0+dXNlZCA9IDE7CisJCW1lbXNldChvcGVuX2RldmlwLT5zZW5zZV9idWZmLCAwLCBTREVCVUdfU0VOU0VfTEVOKTsKKwkJaWYgKHNjc2lfZGVidWdfZHNlbnNlKQorCQkJb3Blbl9kZXZpcC0+c2Vuc2VfYnVmZlswXSA9IDB4NzI7CisJCWVsc2UgeworCQkJb3Blbl9kZXZpcC0+c2Vuc2VfYnVmZlswXSA9IDB4NzA7CisJCQlvcGVuX2RldmlwLT5zZW5zZV9idWZmWzddID0gMHhhOworCQl9CisJCXJldHVybiBvcGVuX2RldmlwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBta19zZW5zZV9idWZmZXIoc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwLCBpbnQga2V5LAorCQkJICAgIGludCBhc2MsIGludCBhc3EpCit7CisJdW5zaWduZWQgY2hhciAqIHNidWZmOworCisJc2J1ZmYgPSBkZXZpcC0+c2Vuc2VfYnVmZjsKKwltZW1zZXQoc2J1ZmYsIDAsIFNERUJVR19TRU5TRV9MRU4pOworCWlmIChzY3NpX2RlYnVnX2RzZW5zZSkgeworCQlzYnVmZlswXSA9IDB4NzI7ICAvKiBkZXNjcmlwdG9yLCBjdXJyZW50ICovCisJCXNidWZmWzFdID0ga2V5OworCQlzYnVmZlsyXSA9IGFzYzsKKwkJc2J1ZmZbM10gPSBhc3E7CisJfSBlbHNlIHsKKwkJc2J1ZmZbMF0gPSAweDcwOyAgLyogZml4ZWQsIGN1cnJlbnQgKi8KKwkJc2J1ZmZbMl0gPSBrZXk7CisJCXNidWZmWzddID0gMHhhOwkgIC8qIGltcGxpZXMgMTggYnl0ZSBzZW5zZSBidWZmZXIgKi8KKwkJc2J1ZmZbMTJdID0gYXNjOworCQlzYnVmZlsxM10gPSBhc3E7CisJfQorCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogICAgW3NlbnNlX2tleSxhc2MsYXNjcV06ICIKKwkJICAgICAgIlsweCV4LDB4JXgsMHgleF1cbiIsIGtleSwgYXNjLCBhc3EpOworfQorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogYWJvcnRcbiIpOworCSsrbnVtX2Fib3J0czsKKwlzdG9wX3F1ZXVlZF9jbW5kKFNDcG50KTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCXN0cnVjdCBibG9ja19kZXZpY2UgKiBiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppbmZvKQoreworCWludCByZXM7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJaWYgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKQorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBiaW9zcGFyYW1cbiIpOworCWJ1ZiA9IHNjc2lfYmlvc19wdGFibGUoYmRldik7CisJaWYgKGJ1ZikgeworCQlyZXMgPSBzY3NpX3BhcnRzaXplKGJ1ZiwgY2FwYWNpdHksCisJCQkJICAgICZpbmZvWzJdLCAmaW5mb1swXSwgJmluZm9bMV0pOworCQlrZnJlZShidWYpOworCQlpZiAoISByZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKwlpbmZvWzBdID0gc2RlYnVnX2hlYWRzOworCWluZm9bMV0gPSBzZGVidWdfc2VjdG9yc19wZXI7CisJaW5mb1syXSA9IHNkZWJ1Z19jeWxpbmRlcnNfcGVyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXA7CisKKwlpZiAoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpCisJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6IGRldmljZV9yZXNldFxuIik7CisJKytudW1fZGV2X3Jlc2V0czsKKwlpZiAoU0NwbnQpIHsKKwkJZGV2aXAgPSBkZXZJbmZvUmVnKFNDcG50LT5kZXZpY2UpOworCQlpZiAoZGV2aXApCisJCQlkZXZpcC0+cmVzZXQgPSAxOworCX0KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY3NpX2RlYnVnX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKnNkYmdfaG9zdDsKKyAgICAgICAgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldl9pbmZvOworICAgICAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBzZHA7CisgICAgICAgIHN0cnVjdCBTY3NpX0hvc3QgKiBocDsKKworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogYnVzX3Jlc2V0XG4iKTsKKwkrK251bV9idXNfcmVzZXRzOworCWlmIChTQ3BudCAmJiAoKHNkcCA9IFNDcG50LT5kZXZpY2UpKSAmJiAoKGhwID0gc2RwLT5ob3N0KSkpIHsKKwkJc2RiZ19ob3N0ID0gKihzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqKikgaHAtPmhvc3RkYXRhOworCQlpZiAoc2RiZ19ob3N0KSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2RiZ19ob3N0LT5kZXZfaW5mb19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbGlzdCkKKwkJCQlkZXZfaW5mby0+cmVzZXQgPSAxOworCQl9CisJfQorCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNjc2lfZGVidWdfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKiBzZGJnX2hvc3Q7CisgICAgICAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZfaW5mbzsKKworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogaG9zdF9yZXNldFxuIik7CisJKytudW1faG9zdF9yZXNldHM7CisgICAgICAgIHNwaW5fbG9jaygmc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShzZGJnX2hvc3QsICZzZGVidWdfaG9zdF9saXN0LCBob3N0X2xpc3QpIHsKKyAgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9pbmZvLCAmc2RiZ19ob3N0LT5kZXZfaW5mb19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2xpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cmVzZXQgPSAxOworICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrKCZzZGVidWdfaG9zdF9saXN0X2xvY2spOworCXN0b3BfYWxsX3F1ZXVlZCgpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKiBSZXR1cm5zIDEgaWYgZm91bmQgJ2NtbmQnIGFuZCBkZWxldGVkIGl0cyB0aW1lci4gZWxzZSByZXR1cm5zIDAgKi8KK3N0YXRpYyBpbnQgc3RvcF9xdWV1ZWRfY21uZChzdHJ1Y3Qgc2NzaV9jbW5kICogY21uZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgazsKKwlzdHJ1Y3Qgc2RlYnVnX3F1ZXVlZF9jbWQgKiBzcWNwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKKwlmb3IgKGsgPSAwOyBrIDwgU0NTSV9ERUJVR19DQU5RVUVVRTsgKytrKSB7CisJCXNxY3AgPSAmcXVldWVkX2FycltrXTsKKwkJaWYgKHNxY3AtPmluX3VzZSAmJiAoY21uZCA9PSBzcWNwLT5hX2NtbmQpKSB7CisJCQlkZWxfdGltZXJfc3luYygmc3FjcC0+Y21uZF90aW1lcik7CisJCQlzcWNwLT5pbl91c2UgPSAwOworCQkJc3FjcC0+YV9jbW5kID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlZF9hcnJfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gKGsgPCBTQ1NJX0RFQlVHX0NBTlFVRVVFKSA/IDEgOiAwOworfQorCisvKiBEZWxldGVzIChzdG9wcykgdGltZXJzIG9mIGFsbCBxdWV1ZWQgY29tbWFuZHMgKi8KK3N0YXRpYyB2b2lkIHN0b3BfYWxsX3F1ZXVlZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCBrOworCXN0cnVjdCBzZGVidWdfcXVldWVkX2NtZCAqIHNxY3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworCWZvciAoayA9IDA7IGsgPCBTQ1NJX0RFQlVHX0NBTlFVRVVFOyArK2spIHsKKwkJc3FjcCA9ICZxdWV1ZWRfYXJyW2tdOworCQlpZiAoc3FjcC0+aW5fdXNlICYmIHNxY3AtPmFfY21uZCkgeworCQkJZGVsX3RpbWVyX3N5bmMoJnNxY3AtPmNtbmRfdGltZXIpOworCQkJc3FjcC0+aW5fdXNlID0gMDsKKwkJCXNxY3AtPmFfY21uZCA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworfQorCisvKiBJbml0aWFsaXplcyB0aW1lcnMgaW4gcXVldWVkIGFycmF5ICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9hbGxfcXVldWVkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJaW50IGs7CisJc3RydWN0IHNkZWJ1Z19xdWV1ZWRfY21kICogc3FjcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7CisJZm9yIChrID0gMDsgayA8IFNDU0lfREVCVUdfQ0FOUVVFVUU7ICsraykgeworCQlzcWNwID0gJnF1ZXVlZF9hcnJba107CisJCWluaXRfdGltZXIoJnNxY3AtPmNtbmRfdGltZXIpOworCQlzcWNwLT5pbl91c2UgPSAwOworCQlzcWNwLT5hX2NtbmQgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZGVidWdfYnVpbGRfcGFydHModW5zaWduZWQgY2hhciAqIHJhbXApCit7CisJc3RydWN0IHBhcnRpdGlvbiAqIHBwOworCWludCBzdGFydHNbU0RFQlVHX01BWF9QQVJUUyArIDJdOworCWludCBzZWN0b3JzX3Blcl9wYXJ0LCBudW1fc2VjdG9ycywgazsKKwlpbnQgaGVhZHNfYnlfc2VjdHMsIHN0YXJ0X3NlYywgZW5kX3NlYzsKKworCS8qIGFzc3VtZSBwYXJ0aXRpb24gdGFibGUgYWxyZWFkeSB6ZXJvZWQgKi8KKwlpZiAoKHNjc2lfZGVidWdfbnVtX3BhcnRzIDwgMSkgfHwgKHNkZWJ1Z19zdG9yZV9zaXplIDwgMTA0ODU3NikpCisJCXJldHVybjsKKwlpZiAoc2NzaV9kZWJ1Z19udW1fcGFydHMgPiBTREVCVUdfTUFYX1BBUlRTKSB7CisJCXNjc2lfZGVidWdfbnVtX3BhcnRzID0gU0RFQlVHX01BWF9QQVJUUzsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaV9kZWJ1ZzpidWlsZF9wYXJ0czogcmVkdWNpbmcgIgorCQkJCSAgICAicGFydGl0aW9ucyB0byAlZFxuIiwgU0RFQlVHX01BWF9QQVJUUyk7CisJfQorCW51bV9zZWN0b3JzID0gKGludCkoc2RlYnVnX3N0b3JlX3NpemUgLyBTRUNUX1NJWkUpOworCXNlY3RvcnNfcGVyX3BhcnQgPSAobnVtX3NlY3RvcnMgLSBzZGVidWdfc2VjdG9yc19wZXIpCisJCQkgICAvIHNjc2lfZGVidWdfbnVtX3BhcnRzOworCWhlYWRzX2J5X3NlY3RzID0gc2RlYnVnX2hlYWRzICogc2RlYnVnX3NlY3RvcnNfcGVyOworICAgICAgICBzdGFydHNbMF0gPSBzZGVidWdfc2VjdG9yc19wZXI7CisJZm9yIChrID0gMTsgayA8IHNjc2lfZGVidWdfbnVtX3BhcnRzOyArK2spCisJCXN0YXJ0c1trXSA9ICgoayAqIHNlY3RvcnNfcGVyX3BhcnQpIC8gaGVhZHNfYnlfc2VjdHMpCisJCQkgICAgKiBoZWFkc19ieV9zZWN0czsKKwlzdGFydHNbc2NzaV9kZWJ1Z19udW1fcGFydHNdID0gbnVtX3NlY3RvcnM7CisJc3RhcnRzW3Njc2lfZGVidWdfbnVtX3BhcnRzICsgMV0gPSAwOworCisJcmFtcFs1MTBdID0gMHg1NTsJLyogbWFnaWMgcGFydGl0aW9uIG1hcmtpbmdzICovCisJcmFtcFs1MTFdID0gMHhBQTsKKwlwcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopKHJhbXAgKyAweDFiZSk7CisJZm9yIChrID0gMDsgc3RhcnRzW2sgKyAxXTsgKytrLCArK3BwKSB7CisJCXN0YXJ0X3NlYyA9IHN0YXJ0c1trXTsKKwkJZW5kX3NlYyA9IHN0YXJ0c1trICsgMV0gLSAxOworCQlwcC0+Ym9vdF9pbmQgPSAwOworCisJCXBwLT5jeWwgPSBzdGFydF9zZWMgLyBoZWFkc19ieV9zZWN0czsKKwkJcHAtPmhlYWQgPSAoc3RhcnRfc2VjIC0gKHBwLT5jeWwgKiBoZWFkc19ieV9zZWN0cykpCisJCQkgICAvIHNkZWJ1Z19zZWN0b3JzX3BlcjsKKwkJcHAtPnNlY3RvciA9IChzdGFydF9zZWMgJSBzZGVidWdfc2VjdG9yc19wZXIpICsgMTsKKworCQlwcC0+ZW5kX2N5bCA9IGVuZF9zZWMgLyBoZWFkc19ieV9zZWN0czsKKwkJcHAtPmVuZF9oZWFkID0gKGVuZF9zZWMgLSAocHAtPmVuZF9jeWwgKiBoZWFkc19ieV9zZWN0cykpCisJCQkgICAgICAgLyBzZGVidWdfc2VjdG9yc19wZXI7CisJCXBwLT5lbmRfc2VjdG9yID0gKGVuZF9zZWMgJSBzZGVidWdfc2VjdG9yc19wZXIpICsgMTsKKworCQlwcC0+c3RhcnRfc2VjdCA9IHN0YXJ0X3NlYzsKKwkJcHAtPm5yX3NlY3RzID0gZW5kX3NlYyAtIHN0YXJ0X3NlYyArIDE7CisJCXBwLT5zeXNfaW5kID0gMHg4MzsJLyogcGxhaW4gTGludXggcGFydGl0aW9uICovCisJfQorfQorCitzdGF0aWMgaW50IHNjaGVkdWxlX3Jlc3Aoc3RydWN0IHNjc2lfY21uZCAqIGNtbmQsCisJCQkgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwLAorCQkJIGRvbmVfZnVuY3RfdCBkb25lLCBpbnQgc2NzaV9yZXN1bHQsIGludCBkZWx0YV9qaWZmKQoreworCWlmICgoU0NTSV9ERUJVR19PUFRfTk9JU0UgJiBzY3NpX2RlYnVnX29wdHMpICYmIGNtbmQpIHsKKwkJaWYgKHNjc2lfcmVzdWx0KSB7CisJCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBzZHAgPSBjbW5kLT5kZXZpY2U7CisKKwkJCXByaW50ayhLRVJOX0lORk8gInNjc2lfZGVidWc6ICAgIDwldSAldSAldSAldT4gIgorCQkJICAgICAgICJub24temVybyByZXN1bHQ9MHgleFxuIiwgc2RwLT5ob3N0LT5ob3N0X25vLAorCQkJICAgICAgIHNkcC0+Y2hhbm5lbCwgc2RwLT5pZCwgc2RwLT5sdW4sIHNjc2lfcmVzdWx0KTsKKwkJfQorCX0KKwlpZiAoY21uZCAmJiBkZXZpcCkgeworCQkvKiBzaW11bGF0ZSBhdXRvc2Vuc2UgYnkgdGhpcyBkcml2ZXIgKi8KKwkJaWYgKFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTiA9PSAoc2NzaV9yZXN1bHQgJiAweGZmKSkKKwkJCW1lbWNweShjbW5kLT5zZW5zZV9idWZmZXIsIGRldmlwLT5zZW5zZV9idWZmLAorCQkJICAgICAgIChTQ1NJX1NFTlNFX0JVRkZFUlNJWkUgPiBTREVCVUdfU0VOU0VfTEVOKSA/CisJCQkgICAgICAgU0RFQlVHX1NFTlNFX0xFTiA6IFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisJfQorCWlmIChkZWx0YV9qaWZmIDw9IDApIHsKKwkJaWYgKGNtbmQpCisJCQljbW5kLT5yZXN1bHQgPSBzY3NpX3Jlc3VsdDsKKwkJaWYgKGRvbmUpCisJCQlkb25lKGNtbmQpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwkJaW50IGs7CisJCXN0cnVjdCBzZGVidWdfcXVldWVkX2NtZCAqIHNxY3AgPSBOVUxMOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7CisJCWZvciAoayA9IDA7IGsgPCBTQ1NJX0RFQlVHX0NBTlFVRVVFOyArK2spIHsKKwkJCXNxY3AgPSAmcXVldWVkX2FycltrXTsKKwkJCWlmICghIHNxY3AtPmluX3VzZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoayA+PSBTQ1NJX0RFQlVHX0NBTlFVRVVFKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZWRfYXJyX2xvY2ssIGlmbGFncyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpX2RlYnVnOiBjYW5fcXVldWUgZXhjZWVkZWRcbiIpOworCQkJcmV0dXJuIDE7CS8qIHJlcG9ydCBidXN5IHRvIG1pZCBsZXZlbCAqLworCQl9CisJCXNxY3AtPmluX3VzZSA9IDE7CisJCXNxY3AtPmFfY21uZCA9IGNtbmQ7CisJCXNxY3AtPnNjc2lfcmVzdWx0ID0gc2NzaV9yZXN1bHQ7CisJCXNxY3AtPmRvbmVfZnVuY3QgPSBkb25lOworCQlzcWNwLT5jbW5kX3RpbWVyLmZ1bmN0aW9uID0gdGltZXJfaW50cl9oYW5kbGVyOworCQlzcWNwLT5jbW5kX3RpbWVyLmRhdGEgPSBrOworCQlzcWNwLT5jbW5kX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgZGVsdGFfamlmZjsKKwkJYWRkX3RpbWVyKCZzcWNwLT5jbW5kX3RpbWVyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWVkX2Fycl9sb2NrLCBpZmxhZ3MpOworCQlpZiAoY21uZCkKKwkJCWNtbmQtPnJlc3VsdCA9IDA7CisJCXJldHVybiAwOworCX0KK30KKworLyogU2V0ICdwZXJtJyAoNHRoIGFyZ3VtZW50KSB0byAwIHRvIGRpc2FibGUgbW9kdWxlX3BhcmFtJ3MgZGVmaW5pdGlvbgorICogb2Ygc3lzZnMgcGFyYW1ldGVycyAod2hpY2ggbW9kdWxlX3BhcmFtIGRvZXNuJ3QgeWV0IHN1cHBvcnQpLgorICogU3lzZnMgcGFyYW1ldGVycyBkZWZpbmVkIGV4cGxpY2l0bHkgYmVsb3cuCisgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChhZGRfaG9zdCwgc2NzaV9kZWJ1Z19hZGRfaG9zdCwgaW50LCAwKTsgLyogcGVybT0wNjQ0ICovCittb2R1bGVfcGFyYW1fbmFtZWQoZGVsYXksIHNjc2lfZGVidWdfZGVsYXksIGludCwgMCk7IC8qIHBlcm09MDY0NCAqLworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9zaXplX21iLCBzY3NpX2RlYnVnX2Rldl9zaXplX21iLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGRzZW5zZSwgc2NzaV9kZWJ1Z19kc2Vuc2UsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZXZlcnlfbnRoLCBzY3NpX2RlYnVnX2V2ZXJ5X250aCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfbHVucywgc2NzaV9kZWJ1Z19tYXhfbHVucywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChudW1fcGFydHMsIHNjc2lfZGVidWdfbnVtX3BhcnRzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKG51bV90Z3RzLCBzY3NpX2RlYnVnX251bV90Z3RzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKG9wdHMsIHNjc2lfZGVidWdfb3B0cywgaW50LCAwKTsgLyogcGVybT0wNjQ0ICovCittb2R1bGVfcGFyYW1fbmFtZWQocHR5cGUsIHNjc2lfZGVidWdfcHR5cGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2NzaV9sZXZlbCwgc2NzaV9kZWJ1Z19zY3NpX2xldmVsLCBpbnQsIDApOworCitNT0RVTEVfQVVUSE9SKCJFcmljIFlvdW5nZGFsZSArIERvdWdsYXMgR2lsYmVydCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIGRlYnVnIGFkYXB0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihTQ1NJX0RFQlVHX1ZFUlNJT04pOworCitNT0RVTEVfUEFSTV9ERVNDKGFkZF9ob3N0LCAiMC4uMTI3IGhvc3RzIGFsbG93ZWQoZGVmPTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5LCAiIyBvZiBqaWZmaWVzIHRvIGRlbGF5IHJlc3BvbnNlKGRlZj0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfc2l6ZV9tYiwgInNpemUgaW4gTUIgb2YgcmFtIHNoYXJlZCBieSBkZXZzIik7CitNT0RVTEVfUEFSTV9ERVNDKGRzZW5zZSwgInVzZSBkZXNjcmlwdG9yIHNlbnNlIGZvcm1hdChkZWY6IGZpeGVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhldmVyeV9udGgsICJ0aW1lb3V0IGV2ZXJ5IG50aCBjb21tYW5kKGRlZj0xMDApIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9sdW5zLCAibnVtYmVyIG9mIFNDU0kgTFVOcyBwZXIgdGFyZ2V0IHRvIHNpbXVsYXRlIik7CitNT0RVTEVfUEFSTV9ERVNDKG51bV9wYXJ0cywgIm51bWJlciBvZiBwYXJ0aXRpb25zKGRlZj0wKSIpOworTU9EVUxFX1BBUk1fREVTQyhudW1fdGd0cywgIm51bWJlciBvZiBTQ1NJIHRhcmdldHMgcGVyIGhvc3QgdG8gc2ltdWxhdGUiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0cywgIjEtPm5vaXNlLCAyLT5tZWRpdW1fZXJyb3IsIDQtPi4uLiIpOworTU9EVUxFX1BBUk1fREVTQyhwdHlwZSwgIlNDU0kgcGVyaXBoZXJhbCB0eXBlKGRlZj0wW2Rpc2tdKSIpOworTU9EVUxFX1BBUk1fREVTQyhzY3NpX2xldmVsLCAiU0NTSSBsZXZlbCB0byBzaW11bGF0ZShkZWY9NVtTUEMtM10pIik7CisKKworc3RhdGljIGNoYXIgc2RlYnVnX2luZm9bMjU2XTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBzY3NpX2RlYnVnX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIHNocCkKK3sKKwlzcHJpbnRmKHNkZWJ1Z19pbmZvLCAic2NzaV9kZWJ1ZywgdmVyc2lvbiAlcyBbJXNdLCAiCisJCSJkZXZfc2l6ZV9tYj0lZCwgb3B0cz0weCV4IiwgU0NTSV9ERUJVR19WRVJTSU9OLAorCQlzY3NpX2RlYnVnX3ZlcnNpb25fZGF0ZSwgc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiwKKwkJc2NzaV9kZWJ1Z19vcHRzKTsKKwlyZXR1cm4gc2RlYnVnX2luZm87Cit9CisKKy8qIHNjc2lfZGVidWdfcHJvY19pbmZvCisgKiBVc2VkIGlmIHRoZSBkcml2ZXIgY3VycmVudGx5IGhhcyBubyBvd24gc3VwcG9ydCBmb3IgL3Byb2Mvc2NzaQorICovCitzdGF0aWMgaW50IHNjc2lfZGVidWdfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworCWludCBsZW4sIHBvcywgYmVnaW47CisJaW50IG9yaWdfbGVuZ3RoOworCisJb3JpZ19sZW5ndGggPSBsZW5ndGg7CisKKwlpZiAoaW5vdXQgPT0gMSkgeworCQljaGFyIGFyclsxNl07CisJCWludCBtaW5MZW4gPSBsZW5ndGggPiAxNSA/IDE1IDogbGVuZ3RoOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQltZW1jcHkoYXJyLCBidWZmZXIsIG1pbkxlbik7CisJCWFyclttaW5MZW5dID0gJ1wwJzsKKwkJaWYgKDEgIT0gc3NjYW5mKGFyciwgIiVkIiwgJnBvcykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc2NzaV9kZWJ1Z19vcHRzID0gcG9zOworCQlpZiAoc2NzaV9kZWJ1Z19ldmVyeV9udGggIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lfZGVidWdfY21uZF9jb3VudCA9IDA7CisJCXJldHVybiBsZW5ndGg7CisJfQorCWJlZ2luID0gMDsKKwlwb3MgPSBsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgInNjc2lfZGVidWcgYWRhcHRlciBkcml2ZXIsIHZlcnNpb24gIgorCSAgICAiJXMgWyVzXVxuIgorCSAgICAibnVtX3RndHM9JWQsIHNoYXJlZCAocmFtKSBzaXplPSVkIE1CLCBvcHRzPTB4JXgsICIKKwkgICAgImV2ZXJ5X250aD0lZChjdXJyOiVkKVxuIgorCSAgICAiZGVsYXk9JWQsIG1heF9sdW5zPSVkLCBzY3NpX2xldmVsPSVkXG4iCisJICAgICJzZWN0b3Jfc2l6ZT0lZCBieXRlcywgY3lsaW5kZXJzPSVkLCBoZWFkcz0lZCwgc2VjdG9ycz0lZFxuIgorCSAgICAibnVtYmVyIG9mIGFib3J0cz0lZCwgZGV2aWNlX3Jlc2V0PSVkLCBidXNfcmVzZXRzPSVkLCAiCisJICAgICJob3N0X3Jlc2V0cz0lZFxuIiwKKwkgICAgU0NTSV9ERUJVR19WRVJTSU9OLCBzY3NpX2RlYnVnX3ZlcnNpb25fZGF0ZSwgc2NzaV9kZWJ1Z19udW1fdGd0cywKKwkgICAgc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiwgc2NzaV9kZWJ1Z19vcHRzLCBzY3NpX2RlYnVnX2V2ZXJ5X250aCwKKwkgICAgc2NzaV9kZWJ1Z19jbW5kX2NvdW50LCBzY3NpX2RlYnVnX2RlbGF5LAorCSAgICBzY3NpX2RlYnVnX21heF9sdW5zLCBzY3NpX2RlYnVnX3Njc2lfbGV2ZWwsCisJICAgIFNFQ1RfU0laRSwgc2RlYnVnX2N5bGluZGVyc19wZXIsIHNkZWJ1Z19oZWFkcywgc2RlYnVnX3NlY3RvcnNfcGVyLAorCSAgICBudW1fYWJvcnRzLCBudW1fZGV2X3Jlc2V0cywgbnVtX2J1c19yZXNldHMsIG51bV9ob3N0X3Jlc2V0cyk7CisJaWYgKHBvcyA8IG9mZnNldCkgeworCQlsZW4gPSAwOworCQliZWdpbiA9IHBvczsKKwl9CisJKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsJLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKwlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX2RlbGF5X3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19kZWxheSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19kZWxheV9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwKKwkJCQkgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgaW50IGRlbGF5OworCWNoYXIgd29ya1syMF07CisKKyAgICAgICAgaWYgKDEgPT0gc3NjYW5mKGJ1ZiwgIiUxMHMiLCB3b3JrKSkgeworCQlpZiAoKDEgPT0gc3NjYW5mKHdvcmssICIlZCIsICZkZWxheSkpICYmIChkZWxheSA+PSAwKSkgeworCQkJc2NzaV9kZWJ1Z19kZWxheSA9IGRlbGF5OworCQkJcmV0dXJuIGNvdW50OworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorRFJJVkVSX0FUVFIoZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSLCBzZGVidWdfZGVsYXlfc2hvdywKKwkgICAgc2RlYnVnX2RlbGF5X3N0b3JlKTsKKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX29wdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JXhcbiIsIHNjc2lfZGVidWdfb3B0cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19vcHRzX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLAorCQkJCSBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIGludCBvcHRzOworCWNoYXIgd29ya1syMF07CisKKyAgICAgICAgaWYgKDEgPT0gc3NjYW5mKGJ1ZiwgIiUxMHMiLCB3b3JrKSkgeworCQlpZiAoMCA9PSBzdHJuaWNtcCh3b3JrLCIweCIsIDIpKSB7CisJCQlpZiAoMSA9PSBzc2NhbmYoJndvcmtbMl0sICIleCIsICZvcHRzKSkKKwkJCQlnb3RvIG9wdHNfZG9uZTsKKwkJfSBlbHNlIHsKKwkJCWlmICgxID09IHNzY2FuZih3b3JrLCAiJWQiLCAmb3B0cykpCisJCQkJZ290byBvcHRzX2RvbmU7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7CitvcHRzX2RvbmU6CisJc2NzaV9kZWJ1Z19vcHRzID0gb3B0czsKKwlzY3NpX2RlYnVnX2NtbmRfY291bnQgPSAwOworCXJldHVybiBjb3VudDsKK30KK0RSSVZFUl9BVFRSKG9wdHMsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGVidWdfb3B0c19zaG93LAorCSAgICBzZGVidWdfb3B0c19zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19wdHlwZV9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLCBjaGFyICogYnVmKQoreworICAgICAgICByZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNjc2lfZGVidWdfcHR5cGUpOworfQorc3RhdGljIHNzaXplX3Qgc2RlYnVnX3B0eXBlX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLAorCQkJCSAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgICAgICBpbnQgbjsKKworCWlmICgoY291bnQgPiAwKSAmJiAoMSA9PSBzc2NhbmYoYnVmLCAiJWQiLCAmbikpICYmIChuID49IDApKSB7CisJCXNjc2lfZGVidWdfcHR5cGUgPSBuOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorRFJJVkVSX0FUVFIocHR5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGVidWdfcHR5cGVfc2hvdywgc2RlYnVnX3B0eXBlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX2RzZW5zZV9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLCBjaGFyICogYnVmKQoreworICAgICAgICByZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNjc2lfZGVidWdfZHNlbnNlKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19kc2Vuc2Vfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsCisJCQkJICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIGludCBuOworCisJaWYgKChjb3VudCA+IDApICYmICgxID09IHNzY2FuZihidWYsICIlZCIsICZuKSkgJiYgKG4gPj0gMCkpIHsKKwkJc2NzaV9kZWJ1Z19kc2Vuc2UgPSBuOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorRFJJVkVSX0FUVFIoZHNlbnNlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2RlYnVnX2RzZW5zZV9zaG93LAorCSAgICBzZGVidWdfZHNlbnNlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX251bV90Z3RzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19udW1fdGd0cyk7Cit9CitzdGF0aWMgc3NpemVfdCBzZGVidWdfbnVtX3RndHNfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsCisJCQkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIGludCBuOworCisJaWYgKChjb3VudCA+IDApICYmICgxID09IHNzY2FuZihidWYsICIlZCIsICZuKSkgJiYgKG4gPj0gMCkpIHsKKwkJc2NzaV9kZWJ1Z19udW1fdGd0cyA9IG47CisJCXNkZWJ1Z19tYXhfdGd0c19sdW5zKCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitEUklWRVJfQVRUUihudW1fdGd0cywgU19JUlVHTyB8IFNfSVdVU1IsIHNkZWJ1Z19udW1fdGd0c19zaG93LAorCSAgICBzZGVidWdfbnVtX3RndHNfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfZGV2X3NpemVfbWJfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX2Rldl9zaXplX21iKTsKK30KK0RSSVZFUl9BVFRSKGRldl9zaXplX21iLCBTX0lSVUdPLCBzZGVidWdfZGV2X3NpemVfbWJfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19udW1fcGFydHNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX251bV9wYXJ0cyk7Cit9CitEUklWRVJfQVRUUihudW1fcGFydHMsIFNfSVJVR08sIHNkZWJ1Z19udW1fcGFydHNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19ldmVyeV9udGhfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX2V2ZXJ5X250aCk7Cit9CitzdGF0aWMgc3NpemVfdCBzZGVidWdfZXZlcnlfbnRoX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgaW50IG50aDsKKworCWlmICgoY291bnQgPiAwKSAmJiAoMSA9PSBzc2NhbmYoYnVmLCAiJWQiLCAmbnRoKSkpIHsKKwkJc2NzaV9kZWJ1Z19ldmVyeV9udGggPSBudGg7CisJCXNjc2lfZGVidWdfY21uZF9jb3VudCA9IDA7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitEUklWRVJfQVRUUihldmVyeV9udGgsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGVidWdfZXZlcnlfbnRoX3Nob3csCisJICAgIHNkZWJ1Z19ldmVyeV9udGhfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfbWF4X2x1bnNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX21heF9sdW5zKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19tYXhfbHVuc19zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgaW50IG47CisKKwlpZiAoKGNvdW50ID4gMCkgJiYgKDEgPT0gc3NjYW5mKGJ1ZiwgIiVkIiwgJm4pKSAmJiAobiA+PSAwKSkgeworCQlzY3NpX2RlYnVnX21heF9sdW5zID0gbjsKKwkJc2RlYnVnX21heF90Z3RzX2x1bnMoKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0RSSVZFUl9BVFRSKG1heF9sdW5zLCBTX0lSVUdPIHwgU19JV1VTUiwgc2RlYnVnX21heF9sdW5zX3Nob3csCisJICAgIHNkZWJ1Z19tYXhfbHVuc19zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHNkZWJ1Z19zY3NpX2xldmVsX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKiBkZHAsIGNoYXIgKiBidWYpCit7CisgICAgICAgIHJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc2NzaV9kZWJ1Z19zY3NpX2xldmVsKTsKK30KK0RSSVZFUl9BVFRSKHNjc2lfbGV2ZWwsIFNfSVJVR08sIHNkZWJ1Z19zY3NpX2xldmVsX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzZGVidWdfYWRkX2hvc3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRkcCwgY2hhciAqIGJ1ZikKK3sKKyAgICAgICAgcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzY3NpX2RlYnVnX2FkZF9ob3N0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2RlYnVnX2FkZF9ob3N0X3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZGRwLAorCQkJCSAgICAgY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgICAgICBpbnQgZGVsdGFfaG9zdHM7CisJY2hhciB3b3JrWzIwXTsKKworICAgICAgICBpZiAoMSAhPSBzc2NhbmYoYnVmLCAiJTEwcyIsIHdvcmspKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl7CS8qIHRlbXBvcmFyeSBoYWNrIGFyb3VuZCBzc2NhbmYoKSBwcm9ibGVtIHdpdGggLXZlIG51bXMgKi8KKwkJaW50IG5lZyA9IDA7CisKKwkJaWYgKCctJyA9PSAqd29yaykKKwkJCW5lZyA9IDE7CisJCWlmICgxICE9IHNzY2FuZih3b3JrICsgbmVnLCAiJWQiLCAmZGVsdGFfaG9zdHMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChuZWcpCisJCQlkZWx0YV9ob3N0cyA9IC1kZWx0YV9ob3N0czsKKwl9CisJaWYgKGRlbHRhX2hvc3RzID4gMCkgeworCQlkbyB7CisJCQlzZGVidWdfYWRkX2FkYXB0ZXIoKTsKKwkJfSB3aGlsZSAoLS1kZWx0YV9ob3N0cyk7CisJfSBlbHNlIGlmIChkZWx0YV9ob3N0cyA8IDApIHsKKwkJZG8geworCQkJc2RlYnVnX3JlbW92ZV9hZGFwdGVyKCk7CisJCX0gd2hpbGUgKCsrZGVsdGFfaG9zdHMpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CitEUklWRVJfQVRUUihhZGRfaG9zdCwgU19JUlVHTyB8IFNfSVdVU1IsIHNkZWJ1Z19hZGRfaG9zdF9zaG93LCAKKwkgICAgc2RlYnVnX2FkZF9ob3N0X3N0b3JlKTsKKworc3RhdGljIHZvaWQgZG9fY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpCit7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfYWRkX2hvc3QpOworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2RlbGF5KTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kZXZfc2l6ZV9tYik7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfZHNlbnNlKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9ldmVyeV9udGgpOworCWRyaXZlcl9jcmVhdGVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX21heF9sdW5zKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9udW1fdGd0cyk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfbnVtX3BhcnRzKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9wdHlwZSk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfb3B0cyk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfc2NzaV9sZXZlbCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JlbW92ZV9kcml2ZXJmc19maWxlcyh2b2lkKQoreworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX3Njc2lfbGV2ZWwpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX29wdHMpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX3B0eXBlKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9udW1fcGFydHMpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX251bV90Z3RzKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9tYXhfbHVucyk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfZXZlcnlfbnRoKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kc2Vuc2UpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmc2RlYnVnX2RyaXZlcmZzX2RyaXZlciwgJmRyaXZlcl9hdHRyX2Rldl9zaXplX21iKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnNkZWJ1Z19kcml2ZXJmc19kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWxheSk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZzZGVidWdfZHJpdmVyZnNfZHJpdmVyLCAmZHJpdmVyX2F0dHJfYWRkX2hvc3QpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzY3NpX2RlYnVnX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6OworCWludCBob3N0X3RvX2FkZDsKKwlpbnQgazsKKworCWlmIChzY3NpX2RlYnVnX2Rldl9zaXplX21iIDwgMSkKKwkJc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiA9IDE7ICAvKiBmb3JjZSBtaW5pbXVtIDEgTUIgcmFtZGlzayAqLworCXNkZWJ1Z19zdG9yZV9zaXplID0gKHVuc2lnbmVkIGxvbmcpc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiAqIDEwNDg1NzY7CisJc2RlYnVnX2NhcGFjaXR5ID0gc2RlYnVnX3N0b3JlX3NpemUgLyBTRUNUX1NJWkU7CisKKwkvKiBwbGF5IGFyb3VuZCB3aXRoIGdlb21ldHJ5LCBkb24ndCB3YXN0ZSB0b28gbXVjaCBvbiB0cmFjayAwICovCisJc2RlYnVnX2hlYWRzID0gODsKKwlzZGVidWdfc2VjdG9yc19wZXIgPSAzMjsKKwlpZiAoc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiA+PSAxNikKKwkJc2RlYnVnX2hlYWRzID0gMzI7CisJZWxzZSBpZiAoc2NzaV9kZWJ1Z19kZXZfc2l6ZV9tYiA+PSAyNTYpCisJCXNkZWJ1Z19oZWFkcyA9IDY0OworCXNkZWJ1Z19jeWxpbmRlcnNfcGVyID0gKHVuc2lnbmVkIGxvbmcpc2RlYnVnX2NhcGFjaXR5IC8KKwkJCSAgICAgICAoc2RlYnVnX3NlY3RvcnNfcGVyICogc2RlYnVnX2hlYWRzKTsKKwlpZiAoc2RlYnVnX2N5bGluZGVyc19wZXIgPj0gMTAyNCkgeworCQkvKiBvdGhlciBMTERzIGRvIHRoaXM7IGltcGxpZXMgPj0gMUdCIHJhbSBkaXNrIC4uLiAqLworCQlzZGVidWdfaGVhZHMgPSAyNTU7CisJCXNkZWJ1Z19zZWN0b3JzX3BlciA9IDYzOworCQlzZGVidWdfY3lsaW5kZXJzX3BlciA9ICh1bnNpZ25lZCBsb25nKXNkZWJ1Z19jYXBhY2l0eSAvCisJCQkgICAgICAgKHNkZWJ1Z19zZWN0b3JzX3BlciAqIHNkZWJ1Z19oZWFkcyk7CisJfQorCisJc3ogPSBzZGVidWdfc3RvcmVfc2l6ZTsKKwlmYWtlX3N0b3JlcCA9IHZtYWxsb2Moc3opOworCWlmIChOVUxMID09IGZha2Vfc3RvcmVwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2NzaV9kZWJ1Z19pbml0OiBvdXQgb2YgbWVtb3J5LCAxXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChmYWtlX3N0b3JlcCwgMCwgc3opOworCWlmIChzY3NpX2RlYnVnX251bV9wYXJ0cyA+IDApCisJCXNkZWJ1Z19idWlsZF9wYXJ0cyhmYWtlX3N0b3JlcCk7CisKKwlpbml0X2FsbF9xdWV1ZWQoKTsKKworCWRldmljZV9yZWdpc3RlcigmcHNldWRvX3ByaW1hcnkpOworCWJ1c19yZWdpc3RlcigmcHNldWRvX2xsZF9idXMpOworCWRyaXZlcl9yZWdpc3Rlcigmc2RlYnVnX2RyaXZlcmZzX2RyaXZlcik7CisJZG9fY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKCk7CisKKwlzZGVidWdfZHJpdmVyX3RlbXBsYXRlLnByb2NfbmFtZSA9IChjaGFyICopc2RlYnVnX3Byb2NfbmFtZTsKKworCWhvc3RfdG9fYWRkID0gc2NzaV9kZWJ1Z19hZGRfaG9zdDsKKyAgICAgICAgc2NzaV9kZWJ1Z19hZGRfaG9zdCA9IDA7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGhvc3RfdG9fYWRkOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2RlYnVnX2FkZF9hZGFwdGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAic2NzaV9kZWJ1Z19pbml0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNkZWJ1Z19hZGRfYWRhcHRlciBmYWlsZWQgaz0lZFxuIiwgayk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykgeworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnX2luaXQ6IGJ1aWx0ICVkIGhvc3QocylcbiIsCisJCSAgICAgICBzY3NpX2RlYnVnX2FkZF9ob3N0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY3NpX2RlYnVnX2V4aXQodm9pZCkKK3sKKwlpbnQgayA9IHNjc2lfZGVidWdfYWRkX2hvc3Q7CisKKwlzdG9wX2FsbF9xdWV1ZWQoKTsKKwlmb3IgKDsgazsgay0tKQorCQlzZGVidWdfcmVtb3ZlX2FkYXB0ZXIoKTsKKwlkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXMoKTsKKwlkcml2ZXJfdW5yZWdpc3Rlcigmc2RlYnVnX2RyaXZlcmZzX2RyaXZlcik7CisJYnVzX3VucmVnaXN0ZXIoJnBzZXVkb19sbGRfYnVzKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmcHNldWRvX3ByaW1hcnkpOworCisJdmZyZWUoZmFrZV9zdG9yZXApOworfQorCitkZXZpY2VfaW5pdGNhbGwoc2NzaV9kZWJ1Z19pbml0KTsKK21vZHVsZV9leGl0KHNjc2lfZGVidWdfZXhpdCk7CisKK3ZvaWQgcHNldWRvXzBfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworCWlmIChTQ1NJX0RFQlVHX09QVF9OT0lTRSAmIHNjc2lfZGVidWdfb3B0cykKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaV9kZWJ1ZzogcHNldWRvXzBfcmVsZWFzZSgpIGNhbGxlZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIHBzZXVkb19wcmltYXJ5ID0geworCS5idXNfaWQJCT0gInBzZXVkb18wIiwKKwkucmVsZWFzZQk9IHBzZXVkb18wX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHBzZXVkb19sbGRfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9kcml2ZXIgKmRldl9kcml2ZXIpCit7CisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHBzZXVkb19sbGRfYnVzID0geworICAgICAgICAubmFtZSA9ICJwc2V1ZG8iLAorICAgICAgICAubWF0Y2ggPSBwc2V1ZG9fbGxkX2J1c19tYXRjaCwKK307CisKK3N0YXRpYyB2b2lkIHNkZWJ1Z19yZWxlYXNlX2FkYXB0ZXIoc3RydWN0IGRldmljZSAqIGRldikKK3sKKyAgICAgICAgc3RydWN0IHNkZWJ1Z19ob3N0X2luZm8gKnNkYmdfaG9zdDsKKworCXNkYmdfaG9zdCA9IHRvX3NkZWJ1Z19ob3N0KGRldik7CisgICAgICAgIGtmcmVlKHNkYmdfaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgc2RlYnVnX2FkZF9hZGFwdGVyKHZvaWQpCit7CisJaW50IGssIGRldnNfcGVyX2hvc3Q7CisgICAgICAgIGludCBlcnJvciA9IDA7CisgICAgICAgIHN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICpzZGJnX2hvc3Q7CisgICAgICAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKnNkYmdfZGV2aW5mbzsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKworICAgICAgICBzZGJnX2hvc3QgPSBrbWFsbG9jKHNpemVvZigqc2RiZ19ob3N0KSxHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAoTlVMTCA9PSBzZGJnX2hvc3QpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5IGF0IGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHNkYmdfaG9zdCwgMCwgc2l6ZW9mKCpzZGJnX2hvc3QpKTsKKyAgICAgICAgSU5JVF9MSVNUX0hFQUQoJnNkYmdfaG9zdC0+ZGV2X2luZm9fbGlzdCk7CisKKwlkZXZzX3Blcl9ob3N0ID0gc2NzaV9kZWJ1Z19udW1fdGd0cyAqIHNjc2lfZGVidWdfbWF4X2x1bnM7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBkZXZzX3Blcl9ob3N0OyBrKyspIHsKKyAgICAgICAgICAgICAgICBzZGJnX2RldmluZm8gPSBrbWFsbG9jKHNpemVvZigqc2RiZ19kZXZpbmZvKSxHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBzZGJnX2RldmluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBtZW1vcnkgYXQgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbXNldChzZGJnX2RldmluZm8sIDAsIHNpemVvZigqc2RiZ19kZXZpbmZvKSk7CisgICAgICAgICAgICAgICAgc2RiZ19kZXZpbmZvLT5zZGJnX2hvc3QgPSBzZGJnX2hvc3Q7CisgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmc2RiZ19kZXZpbmZvLT5kZXZfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZGJnX2hvc3QtPmRldl9pbmZvX2xpc3QpOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrKCZzZGVidWdfaG9zdF9saXN0X2xvY2spOworICAgICAgICBsaXN0X2FkZF90YWlsKCZzZGJnX2hvc3QtPmhvc3RfbGlzdCwgJnNkZWJ1Z19ob3N0X2xpc3QpOworICAgICAgICBzcGluX3VubG9jaygmc2RlYnVnX2hvc3RfbGlzdF9sb2NrKTsKKworICAgICAgICBzZGJnX2hvc3QtPmRldi5idXMgPSAmcHNldWRvX2xsZF9idXM7CisgICAgICAgIHNkYmdfaG9zdC0+ZGV2LnBhcmVudCA9ICZwc2V1ZG9fcHJpbWFyeTsKKyAgICAgICAgc2RiZ19ob3N0LT5kZXYucmVsZWFzZSA9ICZzZGVidWdfcmVsZWFzZV9hZGFwdGVyOworICAgICAgICBzcHJpbnRmKHNkYmdfaG9zdC0+ZGV2LmJ1c19pZCwgImFkYXB0ZXIlZCIsIHNjc2lfZGVidWdfYWRkX2hvc3QpOworCisgICAgICAgIGVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKCZzZGJnX2hvc3QtPmRldik7CisKKyAgICAgICAgaWYgKGVycm9yKQorCQlnb3RvIGNsZWFuOworCisJKytzY3NpX2RlYnVnX2FkZF9ob3N0OworICAgICAgICByZXR1cm4gZXJyb3I7CisKK2NsZWFuOgorCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsICZzZGJnX2hvc3QtPmRldl9pbmZvX2xpc3QpIHsKKwkJc2RiZ19kZXZpbmZvID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbywKKwkJCQkJICBkZXZfbGlzdCk7CisJCWxpc3RfZGVsKCZzZGJnX2RldmluZm8tPmRldl9saXN0KTsKKwkJa2ZyZWUoc2RiZ19kZXZpbmZvKTsKKwl9CisKKwlrZnJlZShzZGJnX2hvc3QpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHNkZWJ1Z19yZW1vdmVfYWRhcHRlcih2b2lkKQoreworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqIHNkYmdfaG9zdCA9IE5VTEw7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZzZGVidWdfaG9zdF9saXN0X2xvY2spOworICAgICAgICBpZiAoIWxpc3RfZW1wdHkoJnNkZWJ1Z19ob3N0X2xpc3QpKSB7CisgICAgICAgICAgICAgICAgc2RiZ19ob3N0ID0gbGlzdF9lbnRyeShzZGVidWdfaG9zdF9saXN0LnByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbywgaG9zdF9saXN0KTsKKwkJbGlzdF9kZWwoJnNkYmdfaG9zdC0+aG9zdF9saXN0KTsKKwl9CisgICAgICAgIHNwaW5fdW5sb2NrKCZzZGVidWdfaG9zdF9saXN0X2xvY2spOworCisJaWYgKCFzZGJnX2hvc3QpCisJCXJldHVybjsKKworICAgICAgICBkZXZpY2VfdW5yZWdpc3Rlcigmc2RiZ19ob3N0LT5kZXYpOworICAgICAgICAtLXNjc2lfZGVidWdfYWRkX2hvc3Q7Cit9CisKK3N0YXRpYyBpbnQgc2RlYnVnX2RyaXZlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworICAgICAgICBpbnQgZXJyb3IgPSAwOworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqc2RiZ19ob3N0OworICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpocG50OworCisJc2RiZ19ob3N0ID0gdG9fc2RlYnVnX2hvc3QoZGV2KTsKKworICAgICAgICBocG50ID0gc2NzaV9ob3N0X2FsbG9jKCZzZGVidWdfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2Yoc2RiZ19ob3N0KSk7CisgICAgICAgIGlmIChOVUxMID09IGhwbnQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBzY3NpX3JlZ2lzdGVyIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBlcnJvciA9IC1FTk9ERVY7CisJCXJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHNkYmdfaG9zdC0+c2hvc3QgPSBocG50OworCSooKHN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICoqKWhwbnQtPmhvc3RkYXRhKSA9IHNkYmdfaG9zdDsKKwlpZiAoKGhwbnQtPnRoaXNfaWQgPj0gMCkgJiYgKHNjc2lfZGVidWdfbnVtX3RndHMgPiBocG50LT50aGlzX2lkKSkKKwkJaHBudC0+bWF4X2lkID0gc2NzaV9kZWJ1Z19udW1fdGd0cyArIDE7CisJZWxzZQorCQlocG50LT5tYXhfaWQgPSBzY3NpX2RlYnVnX251bV90Z3RzOworCWhwbnQtPm1heF9sdW4gPSBzY3NpX2RlYnVnX21heF9sdW5zOworCisgICAgICAgIGVycm9yID0gc2NzaV9hZGRfaG9zdChocG50LCAmc2RiZ19ob3N0LT5kZXYpOworICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBzY3NpX2FkZF9ob3N0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBlcnJvciA9IC1FTk9ERVY7CisJCXNjc2lfaG9zdF9wdXQoaHBudCk7CisgICAgICAgIH0gZWxzZQorCQlzY3NpX3NjYW5faG9zdChocG50KTsKKworCisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBzZGVidWdfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKmxoX3NmOworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2hvc3RfaW5mbyAqc2RiZ19ob3N0OworICAgICAgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICpzZGJnX2RldmluZm87CisKKwlzZGJnX2hvc3QgPSB0b19zZGVidWdfaG9zdChkZXYpOworCisJaWYgKCFzZGJnX2hvc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGxvY2F0ZSBob3N0IGluZm9cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyAgICAgICAgc2NzaV9yZW1vdmVfaG9zdChzZGJnX2hvc3QtPnNob3N0KTsKKworICAgICAgICBsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLCAmc2RiZ19ob3N0LT5kZXZfaW5mb19saXN0KSB7CisgICAgICAgICAgICAgICAgc2RiZ19kZXZpbmZvID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9saXN0KTsKKyAgICAgICAgICAgICAgICBsaXN0X2RlbCgmc2RiZ19kZXZpbmZvLT5kZXZfbGlzdCk7CisgICAgICAgICAgICAgICAga2ZyZWUoc2RiZ19kZXZpbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIHNjc2lfaG9zdF9wdXQoc2RiZ19ob3N0LT5zaG9zdCk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZGVidWdfbWF4X3RndHNfbHVucyh2b2lkKQoreworCXN0cnVjdCBzZGVidWdfaG9zdF9pbmZvICogc2RiZ19ob3N0OworCXN0cnVjdCBTY3NpX0hvc3QgKmhwbnQ7CisKKwlzcGluX2xvY2soJnNkZWJ1Z19ob3N0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGJnX2hvc3QsICZzZGVidWdfaG9zdF9saXN0LCBob3N0X2xpc3QpIHsKKwkJaHBudCA9IHNkYmdfaG9zdC0+c2hvc3Q7CisJCWlmICgoaHBudC0+dGhpc19pZCA+PSAwKSAmJgorCQkgICAgKHNjc2lfZGVidWdfbnVtX3RndHMgPiBocG50LT50aGlzX2lkKSkKKwkJCWhwbnQtPm1heF9pZCA9IHNjc2lfZGVidWdfbnVtX3RndHMgKyAxOworCQllbHNlCisJCQlocG50LT5tYXhfaWQgPSBzY3NpX2RlYnVnX251bV90Z3RzOworCQlocG50LT5tYXhfbHVuID0gc2NzaV9kZWJ1Z19tYXhfbHVuczsKKwl9CisJc3Bpbl91bmxvY2soJnNkZWJ1Z19ob3N0X2xpc3RfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5oIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVkZDVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9TQ1NJX0RFQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0YXRpYyBpbnQgc2NzaV9kZWJ1Z19zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHNjc2lfZGVidWdfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCQkgICB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpOworc3RhdGljIGludCBzY3NpX2RlYnVnX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqLCBpbnQsIHZvaWQgX191c2VyICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQlzZWN0b3JfdCwgaW50W10pOworc3RhdGljIGludCBzY3NpX2RlYnVnX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHNjc2lfZGVidWdfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBzY3NpX2RlYnVnX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICogc2NzaV9kZWJ1Z19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKyNkZWZpbmUgU0NTSV9ERUJVR19DQU5RVUVVRSAgMjU1IAkvKiBuZWVkcyB0byBiZSA+PSAxICovCisKKyNkZWZpbmUgU0NTSV9ERUJVR19NQVhfQ01EX0xFTiAxNgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTIxZGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCkBAIC0wLDAgKzEsNTY0IEBACisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aW5mby5oPgorCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisKKworLyoKKyAqIHNjc2lfZGV2X2luZm9fbGlzdDogc3RydWN0dXJlIHRvIGhvbGQgYmxhY2svd2hpdGUgbGlzdGVkIGRldmljZXMuCisgKi8KK3N0cnVjdCBzY3NpX2Rldl9pbmZvX2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2luZm9fbGlzdDsKKwljaGFyIHZlbmRvcls4XTsKKwljaGFyIG1vZGVsWzE2XTsKKwl1bnNpZ25lZCBmbGFnczsKKwl1bnNpZ25lZCBjb21wYXRpYmxlOyAvKiBmb3IgdXNlIHdpdGggc2NzaV9zdGF0aWNfZGV2aWNlX2xpc3QgZW50cmllcyAqLworfTsKKworCitzdGF0aWMgY29uc3QgY2hhciBzcGFjZXNbXSA9ICIgICAgICAgICAgICAgICAgIjsgLyogMTYgb2YgdGhlbSAqLworc3RhdGljIHVuc2lnbmVkIHNjc2lfZGVmYXVsdF9kZXZfZmxhZ3M7CitzdGF0aWMgTElTVF9IRUFEKHNjc2lfZGV2X2luZm9fbGlzdCk7CitzdGF0aWMgY2hhciBzY3NpX2Rldl9mbGFnc1syNTZdOworCisvKgorICogc2NzaV9zdGF0aWNfZGV2aWNlX2xpc3Q6IGRlcHJlY2F0ZWQgbGlzdCBvZiBkZXZpY2VzIHRoYXQgcmVxdWlyZQorICogc2V0dGluZ3MgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCwgaW5jbHVkZXMgYmxhY2stbGlzdGVkIChicm9rZW4pCisgKiBkZXZpY2VzLiBUaGUgZW50cmllcyBoZXJlIGFyZSBhZGRlZCB0byB0aGUgdGFpbCBvZiBzY3NpX2Rldl9pbmZvX2xpc3QKKyAqIHZpYSBzY3NpX2Rldl9pbmZvX2xpc3RfaW5pdC4KKyAqCisgKiBEbyBub3QgYWRkIHRvIHRoaXMgbGlzdCwgdXNlIHRoZSBjb21tYW5kIGxpbmUgb3IgcHJvYyBpbnRlcmZhY2UgdG8gYWRkCisgKiB0byB0aGUgc2NzaV9kZXZfaW5mb19saXN0LiBUaGlzIHRhYmxlIHdpbGwgZXZlbnR1YWxseSBnbyBhd2F5LgorICovCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICp2ZW5kb3I7CisJY2hhciAqbW9kZWw7CisJY2hhciAqcmV2aXNpb247CS8qIHJldmlzaW9uIGtub3duIHRvIGJlIGJhZCwgdW51c2VkICovCisJdW5zaWduZWQgZmxhZ3M7Cit9IHNjc2lfc3RhdGljX2RldmljZV9saXN0W10gX19pbml0ZGF0YSA9IHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhcmUga25vd24gbm90IHRvIHRvbGVyYXRlIGEgbHVuICE9IDAgc2NhbgorCSAqIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuIFNvbWUgd2lsbCByZXNwb25kIHRvIGFsbCBsdW5zLAorCSAqIG90aGVycyB3aWxsIGxvY2sgdXAuCisJICovCisJeyJBYXNoaW1hIiwgIklNQUdFUlkgMjQwMFNQIiwgIjEuMDMiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJDSElOT04iLCAiQ0QtUk9NIENEUy00MzEiLCAiSDQyIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiQ0hJTk9OIiwgIkNELVJPTSBDRFMtNTM1IiwgIlExNCIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IkRFTk9OIiwgIkRSRC0yNVgiLCAiViIsIEJMSVNUX05PTFVOfSwJCQkvKiBsb2NrcyB1cCAqLworCXsiSElUQUNISSIsICJESzMxMkMiLCAiQ004MSIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCXsiSElUQUNISSIsICJESzMxNEMiLCAiQ1IyMSIsIEJMSVNUX05PTFVOfSwJLyogcmVzcG9uZHMgdG8gYWxsIGx1biAqLworCXsiSU1TIiwgIkNERDUyMS8xMCIsICIyLjA2IiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiTUFYVE9SIiwgIlhULTMyODAiLCAiUFIwMiIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7Ik1BWFRPUiIsICJYVC00MzgwUyIsICJCM0MiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJNQVhUT1IiLCAiTVhULTEyNDBTIiwgIkkxLjIiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJNQVhUT1IiLCAiWFQtNDE3MFMiLCAiQjVBIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiTUFYVE9SIiwgIlhULTg3NjBTIiwgIkI3QiIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7Ik1FRElBVklTIiwgIlJFTk8gQ0QtUk9NWDJBIiwgIjIuMDMiLCBCTElTVF9OT0xVTn0sCS8qIHJlc3BvbmRzIHRvIGFsbCBsdW4gKi8KKwl7Ik1JQ1JPVEVLIiwgIlNjYW5NYWtlcklJSSIsICIyLjMwIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJORUMiLCAiQ0QtUk9NIERSSVZFOjg0MSIsICIxLjAiLCBCTElTVF9OT0xVTn0sLyogbG9ja3MgdXAgKi8KKwl7IlBISUxJUFMiLCAiUENBODBTQyIsICJWNC0yIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJST0RJTUUiLCAiUk8zMDAwUyIsICIyLjMzIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiU1VOIiwgIlNFTkEiLCBOVUxMLCBCTElTVF9OT0xVTn0sCQkvKiByZXNwb25kcyB0byBhbGwgbHVucyAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyBjYXVzZXMgYSBmYWlsZWQgUkVRVUVTVCBTRU5TRSBvbiBsdW4gMSBmb3IKKwkgKiBhaGExNTJ4IGNvbnRyb2xsZXIsIHdoaWNoIGNhdXNlcyBTQ1NJIGNvZGUgdG8gcmVzZXQgYnVzLgorCSAqLworCXsiU0FOWU8iLCAiQ1JELTI1MFMiLCAiMS4yMCIsIEJMSVNUX05PTFVOfSwKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgY2F1c2VzIGEgZmFpbGVkIFJFUVVFU1QgU0VOU0Ugb24gbHVuIDEgZm9yCisJICogYWhhMTUyeCBjb250cm9sbGVyLCB3aGljaCBjYXVzZXMgU0NTSSBjb2RlIHRvIHJlc2V0IGJ1cy4KKwkgKi8KKwl7IlNFQUdBVEUiLCAiU1QxNTdOIiwgIlwwMDR8aiIsIEJMSVNUX05PTFVOfSwKKwl7IlNFQUdBVEUiLCAiU1QyOTYiLCAiOTIxIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJTRUFHQVRFIiwgIlNUMTU4MSIsICI2NTM4IiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJeyJTT05ZIiwgIkNELVJPTSBDRFUtNTQxIiwgIjQuM2QiLCBCTElTVF9OT0xVTn0sCisJeyJTT05ZIiwgIkNELVJPTSBDRFUtNTVTIiwgIjEuMGkiLCBCTElTVF9OT0xVTn0sCisJeyJTT05ZIiwgIkNELVJPTSBDRFUtNTYxIiwgIjEuN3giLCBCTElTVF9OT0xVTn0sCisJeyJTT05ZIiwgIkNELVJPTSBDRFUtODAxMiIsIE5VTEwsIEJMSVNUX05PTFVOfSwKKwl7IlNPTlkiLCAiU0RULTUwMDAiLCAiMy4xNyIsIEJMSVNUX1NFTEVDVF9OT19BVE59LAorCXsiVEFOREJFUkciLCAiVERDIDM2MDAiLCAiVTA3IiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiVEVBQyIsICJDRC1SNTVTIiwgIjEuMEgiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhdXNlcyBhIGZhaWxlZCBSRVFVRVNUIFNFTlNFIG9uIGx1biAxIGZvcgorCSAqIHNlYWdhdGUgY29udHJvbGxlciwgd2hpY2ggY2F1c2VzIFNDU0kgY29kZSB0byByZXNldCBidXMuCisJICovCisJeyJURUFDIiwgIkNELVJPTSIsICIxLjA2IiwgQkxJU1RfTk9MVU59LAorCXsiVEVBQyIsICJNVC0yU1QvNDVTMi0yNyIsICJSViBNIiwgQkxJU1RfTk9MVU59LAkvKiByZXNwb25kcyB0byBhbGwgbHVuICovCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhdXNlcyBhIGZhaWxlZCBSRVFVRVNUIFNFTlNFIG9uIGx1biAxIGZvcgorCSAqIHNlYWdhdGUgY29udHJvbGxlciwgd2hpY2ggY2F1c2VzIFNDU0kgY29kZSB0byByZXNldCBidXMuCisJICovCisJeyJIUCIsICJDMTc1MEEiLCAiMzIyNiIsIEJMSVNUX05PTFVOfSwJCS8qIHNjYW5qZXQgaWljICovCisJeyJIUCIsICJDMTc5MEEiLCAiIiwgQkxJU1RfTk9MVU59LAkJLyogc2NhbmpldCBpaXAgKi8KKwl7IkhQIiwgIkMyNTAwQSIsICIiLCBCTElTVF9OT0xVTn0sCQkvKiBzY2FuamV0IGlpY3ggKi8KKwl7Ik1FRElBVklTIiwgIkNEUi1IOTNNViIsICIxLjMxIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiTUlDUk9URUsiLCAiU2Nhbk1ha2VyIElJIiwgIjUuNjEiLCBCTElTVF9OT0xVTn0sCS8qIHJlc3BvbmRzIHRvIGFsbCBsdW4gKi8KKwl7Ik1JVFNVTUkiLCAiQ0QtUiBDUi0yMjAxQ1MiLCAiNjExOSIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7Ik5FQyIsICJEMzg1NiIsICIwMDA5IiwgQkxJU1RfTk9MVU59LAorCXsiUVVBTlRVTSIsICJMUFM1MjVTIiwgIjMxMTAiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJRVUFOVFVNIiwgIlBEMTIyNVMiLCAiMzExMCIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IlFVQU5UVU0iLCAiRklSRUJBTEwgU1Q0LjNTIiwgIjBGMEMiLCBCTElTVF9OT0xVTn0sCS8qIGxvY2tzIHVwICovCisJeyJSRUxJU1lTIiwgIlNjb3JwaW8iLCBOVUxMLCBCTElTVF9OT0xVTn0sCS8qIHJlc3BvbmRzIHRvIGFsbCBsdW4gKi8KKwl7IlNBTktZTyIsICJDUDUyNSIsICI2LjY0IiwgQkxJU1RfTk9MVU59LAkvKiBjYXVzZXMgZmFpbGVkIFJFUSBTRU5TRSwgZXh0cmEgcmVzZXQgKi8KKwl7IlRFWEVMIiwgIkNELVJPTSIsICIxLjA2IiwgQkxJU1RfTk9MVU59LAorCXsiWUFNQUhBIiwgIkNEUjEwMCIsICIxLjAwIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiWUFNQUhBIiwgIkNEUjEwMiIsICIxLjAwIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCXsiWUFNQUhBIiwgIkNSVzg0MjRTIiwgIjEuMCIsIEJMSVNUX05PTFVOfSwJLyogbG9ja3MgdXAgKi8KKwl7IllBTUFIQSIsICJDUlc2NDE2UyIsICIxLjBjIiwgQkxJU1RfTk9MVU59LAkvKiBsb2NrcyB1cCAqLworCisJLyoKKwkgKiBPdGhlciB0eXBlcyBvZiBkZXZpY2VzIHRoYXQgaGF2ZSBzcGVjaWFsIGZsYWdzLgorCSAqIE5vdGUgdGhhdCBhbGwgVVNCIGRldmljZXMgc2hvdWxkIGhhdmUgdGhlIEJMSVNUX0lOUVVJUllfMzYgZmxhZy4KKwkgKi8KKwl7IjNQQVJkYXRhIiwgIlZWIiwgTlVMTCwgQkxJU1RfUkVQT1JUTFVOMn0sCisJeyJBREFQVEVDIiwgIkFBQ1JBSUQiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJBREFQVEVDIiwgIkFkYXB0ZWMgNTQwMFMiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJBRlQgUFJPIiwgIi1JWCBDRiIsICIwLjA+IiwgQkxJU1RfRk9SQ0VMVU59LAorCXsiQkVMS0lOIiwgIlVTQiAyIEhTLUNGIiwgIjEuOTUiLCAgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKKwl7IkNBTk9OIiwgIklQVUJKRCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJDQk9YMyIsICJVU0IgU3RvcmFnZS1TTUMiLCAiMzAwQSIsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJDTUQiLCAiQ1JBLTcyODAiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAkvKiBDTUQgUkFJRCBDb250cm9sbGVyICovCisJeyJDTlNJIiwgIkc3MzI0IiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwJLyogQ2hhcGFycmFsIEc3MzI0IFJBSUQgKi8KKwl7IkNOU2kiLCAiRzgzMjQiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAkvKiBDaGFwYXJyYWwgRzgzMjQgUkFJRCAqLworCXsiQ09NUEFRIiwgIkxPR0lDQUwgVk9MVU1FIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiQ09NUEFRIiwgIkNSMzUwMCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkNPTVBBUSIsICJNU0ExMDAwIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTk9TVEFSVE9OQUREfSwKKwl7IkNPTVBBUSIsICJNU0ExMDAwIFZPTFVNRSIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCisJeyJDT01QQVEiLCAiSFNWMTEwIiwgTlVMTCwgQkxJU1RfUkVQT1JUTFVOMiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCisJeyJERE4iLCAiU0FOIERhdGFEaXJlY3RvciIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IkRFQyIsICJIU0c4MCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX05PU1RBUlRPTkFERH0sCisJeyJERUxMIiwgIlBWNjYwRiIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJERUxMIiwgIlBWNjYwRiAgIFBTRVVETyIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJERUxMIiwgIlBTRVVETyBERVZJQ0UgLiIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCS8qIERlbGwgUFYgNTMwRiAqLworCXsiREVMTCIsICJQVjUzMEYiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAorCXsiREVMTCIsICJQRVJDUkFJRCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkRHQyIsICJSQUlEIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOfSwJLyogRGVsbCBQViA2NTBGLCBzdG9yYWdlIG9uIExVTiAwICovCisJeyJER0MiLCAiRElTSyIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCS8qIERlbGwgUFYgNjUwRiwgbm8gc3RvcmFnZSBvbiBMVU4gMCAqLworCXsiRU1DIiwgIlNZTU1FVFJJWCIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0xBUkdFTFVOIHwgQkxJU1RfRk9SQ0VMVU59LAorCXsiRU1VTEVYIiwgIk1EMjEvUzIgICAgIEVTREkiLCBOVUxMLCBCTElTVF9TSU5HTEVMVU59LAorCXsiRlNDIiwgIkNlbnRyaWNTdG9yIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sCisJeyJHZW5lcmljIiwgIlVTQiBTRCBSZWFkZXIiLCAiMS4wMCIsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJHZW5lcmljIiwgIlVTQiBTdG9yYWdlLVNNQyIsICIwMTgwIiwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKKwl7IkdlbmVyaWMiLCAiVVNCIFN0b3JhZ2UtU01DIiwgIjAyMDciLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAorCXsiSElUQUNISSIsICJERjQwMCIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IkhJVEFDSEkiLCAiREY1MDAiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJISVRBQ0hJIiwgIkRGNjAwIiwgIioiLCBCTElTVF9TUEFSU0VMVU59LAorCXsiSFAiLCAiQTYxODlBIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU59LAkvKiBIUCBWQTc0MDAgKi8KKwl7IkhQIiwgIk9QRU4tIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sIC8qIEhQIFhQIEFycmF5cyAqLworCXsiSFAiLCAiTmV0UkFJRC00TSIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IkhQIiwgIkhTVjEwMCIsIE5VTEwsIEJMSVNUX1JFUE9SVExVTjIgfCBCTElTVF9OT1NUQVJUT05BRER9LAorCXsiSFAiLCAiQzE1NTdBIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiSFAiLCAiQzMzMjMtMzAwIiwgIjQyNjkiLCBCTElTVF9OT1RRfSwKKwl7IklCTSIsICJBdVNhVjFTMiIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwKKwl7IklCTSIsICJQcm9GaWJyZSA0MDAwUiIsICIqIiwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU59LAorCXsiSUJNIiwgIjIxMDUiLCBOVUxMLCBCTElTVF9SRVRSWV9IV0VSUk9SfSwKKwl7ImlvbWVnYSIsICJqYXogMUdCIiwgIkouODYiLCBCTElTVF9OT1RRIHwgQkxJU1RfTk9MVU59LAorCXsiSU9NRUdBIiwgIklvMjBTICAgICAgICAgKkYiLCBOVUxMLCBCTElTVF9LRVl9LAorCXsiSU5TSVRFIiwgIkZsb3B0aWNhbCAgIEYqOEkiLCBOVUxMLCBCTElTVF9LRVl9LAorCXsiSU5TSVRFIiwgIkkzMjVWTSIsIE5VTEwsIEJMSVNUX0tFWX0sCisJeyJpUml2ZXIiLCAiaUZQIE1hc3MgRHJpdmVyIiwgTlVMTCwgQkxJU1RfTk9UX0xPQ0tBQkxFIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJMQVNPVU5EIiwgIkNEWDc0MDUiLCAiMy4xMCIsIEJMSVNUX01BWDVMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiTUFUU0hJVEEiLCAiUEQtMSIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7Ik1BVFNISVRBIiwgIkRNQy1MQzUiLCBOVUxMLCBCTElTVF9OT1RfTE9DS0FCTEUgfCBCTElTVF9JTlFVSVJZXzM2fSwKKwl7Ik1BVFNISVRBIiwgIkRNQy1MQzQwIiwgTlVMTCwgQkxJU1RfTk9UX0xPQ0tBQkxFIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJNZWRpb24iLCAiRmxhc2ggWEwgIE1NQy9TRCIsICIyLjZEIiwgQkxJU1RfRk9SQ0VMVU59LAorCXsiTWVnYVJBSUQiLCAiTEQiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJNSUNST1AiLCAiNDExMCIsIE5VTEwsIEJMSVNUX05PVFF9LAorCXsiTVlMRVgiLCAiREFDQVJNUkIiLCAiKiIsIEJMSVNUX1JFUE9SVExVTjJ9LAorCXsibkNpcGhlciIsICJGYXN0bmVzcyBDcnlwdG8iLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCisJeyJOQUtBTUlDSCIsICJNSi00LjhTIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiTkFLQU1JQ0giLCAiTUotNS4xNlMiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX1NJTkdMRUxVTn0sCisJeyJORUMiLCAiUEQtMSBPRFg2NTRQIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiTlJDIiwgIk1CUi03IiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiTlJDIiwgIk1CUi03LjQiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX1NJTkdMRUxVTn0sCisJeyJQSU9ORUVSIiwgIkNELVJPTSBEUk0tNjAwIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiUElPTkVFUiIsICJDRC1ST00gRFJNLTYwMlgiLCBOVUxMLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX1NJTkdMRUxVTn0sCisJeyJQSU9ORUVSIiwgIkNELVJPTSBEUk0tNjA0WCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfU0lOR0xFTFVOfSwKKwl7IlJFR0FMIiwgIkNEQy00WCIsIE5VTEwsIEJMSVNUX01BWDVMVU4gfCBCTElTVF9TSU5HTEVMVU59LAorCXsiU2FuRGlzayIsICJJbWFnZU1hdGUgQ0YtU0QxIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAorCXsiU0VBR0FURSIsICJTVDM0NTU1TiIsICIwOTMwIiwgQkxJU1RfTk9UUX0sCS8qIENob2tlcyBvbiB0YWdnZWQgSU5RVUlSWSAqLworCXsiU0VBR0FURSIsICJTVDMzOTBOIiwgIjk1NDYiLCBCTElTVF9OT1RRfSwKKwl7IlNHSSIsICJSQUlEMyIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IlNHSSIsICJSQUlENSIsICIqIiwgQkxJU1RfU1BBUlNFTFVOfSwKKwl7IlNHSSIsICJUUDkxMDAiLCAiKiIsIEJMSVNUX1JFUE9SVExVTjJ9LAorCXsiU0dJIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJTTVNDIiwgIlVTQiAyIEhTLUNGIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJTT05ZIiwgIkNELVJPTSBDRFUtODAwMSIsIE5VTEwsIEJMSVNUX0JPUktFTn0sCisJeyJTT05ZIiwgIlRTTCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwJCS8qIEREUzMgJiBERFM0IGF1dG9sb2FkZXJzICovCisJeyJTVDY1MDIxMSIsICJDRiIsIE5VTEwsIEJMSVNUX1JFVFJZX0hXRVJST1J9LAorCXsiU1VOIiwgIlQzMDAiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJTVU4iLCAiVDQiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJURVhFTCIsICJDRC1ST00iLCAiMS4wNiIsIEJMSVNUX0JPUktFTn0sCisJeyJUT1NISUJBIiwgIkNEUk9NIiwgTlVMTCwgQkxJU1RfSVNST019LAorCXsiVE9TSElCQSIsICJDRC1ST00iLCBOVUxMLCBCTElTVF9JU1JPTX0sCisJeyJVU0IyLjAiLCAiU01BUlRNRURJQS9YRCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCisJeyJXYW5nREFUIiwgIk1vZGVsIDI2MDAiLCAiMDEuNyIsIEJMSVNUX1NFTEVDVF9OT19BVE59LAorCXsiV2FuZ0RBVCIsICJNb2RlbCAzMjAwIiwgIjAyLjIiLCBCTElTVF9TRUxFQ1RfTk9fQVROfSwKKwl7IldhbmdEQVQiLCAiTW9kZWwgMTMwMCIsICIwMi40IiwgQkxJU1RfU0VMRUNUX05PX0FUTn0sCisJeyJXREMgV0QyNSIsICIwMEpCLTAwRlVBMCIsIE5VTEwsIEJMSVNUX05PUkVQT1JUTFVOfSwKKwl7IlhZUkFURVgiLCAiUlMiLCAiKiIsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0xBUkdFTFVOfSwKKwl7Ilp6eXp4IiwgIlJvY2tldFN0b3IgNTAwUyIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTn0sCisJeyJaenl6eCIsICJSb2NrZXRTdG9yIDIwMDAiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU59LAorCXsgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LAorfTsKKworLyoKKyAqIHNjc2lfc3RyY3B5X2RldmluZm86IGNhbGxlZCBmcm9tIHNjc2lfZGV2X2luZm9fbGlzdF9hZGQgdG8gY29weSBpbnRvCisgKiBkZXZpbmZvIHZlbmRvciBhbmQgbW9kZWwgc3RyaW5ncy4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9zdHJjcHlfZGV2aW5mbyhjaGFyICpuYW1lLCBjaGFyICp0bywgc2l6ZV90IHRvX2xlbmd0aCwKKwkJCQljaGFyICpmcm9tLCBpbnQgY29tcGF0aWJsZSkKK3sKKwlzaXplX3QgZnJvbV9sZW5ndGg7CisKKwlmcm9tX2xlbmd0aCA9IHN0cmxlbihmcm9tKTsKKwlzdHJuY3B5KHRvLCBmcm9tLCBtaW4odG9fbGVuZ3RoLCBmcm9tX2xlbmd0aCkpOworCWlmIChmcm9tX2xlbmd0aCA8IHRvX2xlbmd0aCkgeworCQlpZiAoY29tcGF0aWJsZSkgeworCQkJLyoKKwkJCSAqIE5VTCB0ZXJtaW5hdGUgdGhlIHN0cmluZyBpZiBpdCBpcyBzaG9ydC4KKwkJCSAqLworCQkJdG9bZnJvbV9sZW5ndGhdID0gJ1wwJzsKKwkJfSBlbHNlIHsKKwkJCS8qIAorCQkJICogc3BhY2UgcGFkIHRoZSBzdHJpbmcgaWYgaXQgaXMgc2hvcnQuIAorCQkJICovCisJCQlzdHJuY3B5KCZ0b1tmcm9tX2xlbmd0aF0sIHNwYWNlcywKKwkJCQl0b19sZW5ndGggLSBmcm9tX2xlbmd0aCk7CisJCX0KKwl9CisJaWYgKGZyb21fbGVuZ3RoID4gdG9fbGVuZ3RoKQorCQkgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzIHN0cmluZyAnJXMnIGlzIHRvbyBsb25nXG4iLAorCQkJX19GVU5DVElPTl9fLCBuYW1lLCBmcm9tKTsKK30KKworLyoqCisgKiBzY3NpX2Rldl9pbmZvX2xpc3RfYWRkOiBhZGQgb25lIGRldl9pbmZvIGxpc3QgZW50cnkuCisgKiBAdmVuZG9yOgl2ZW5kb3Igc3RyaW5nCisgKiBAbW9kZWw6CW1vZGVsIChwcm9kdWN0KSBzdHJpbmcKKyAqIEBzdHJmbGFnczoJaW50ZWdlciBzdHJpbmcKKyAqIEBmbGFnOglpZiBzdHJmbGFncyBOVUxMLCB1c2UgdGhpcyBmbGFnIHZhbHVlCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQ3JlYXRlIGFuZCBhZGQgb25lIGRldl9pbmZvIGVudHJ5IGZvciBAdmVuZG9yLCBAbW9kZWwsIEBzdHJmbGFncyBvcgorICogCUBmbGFnLiBJZiBAY29tcGF0aWJsZSwgYWRkIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCBkbyBub3Qgc3BhY2UKKyAqIAlwYWQsIGFuZCBzZXQgZGV2aW5mby0+Y29tcGF0aWJsZS4gVGhlIHNjc2lfc3RhdGljX2RldmljZV9saXN0IGVudHJpZXMKKyAqIAlhcmUgYWRkZWQgd2l0aCBAY29tcGF0aWJsZSAxIGFuZCBAY2xmYWdzIE5VTEwuCisgKgorICogUmV0dXJuczogMCBPSywgLWVycm9yIG9uIGZhaWx1cmUuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZGV2X2luZm9fbGlzdF9hZGQoaW50IGNvbXBhdGlibGUsIGNoYXIgKnZlbmRvciwgY2hhciAqbW9kZWwsCisJCQkgICAgY2hhciAqc3RyZmxhZ3MsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZfaW5mb19saXN0ICpkZXZpbmZvOworCisJZGV2aW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpkZXZpbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2NzaV9zdHJjcHlfZGV2aW5mbygidmVuZG9yIiwgZGV2aW5mby0+dmVuZG9yLCBzaXplb2YoZGV2aW5mby0+dmVuZG9yKSwKKwkJCSAgICB2ZW5kb3IsIGNvbXBhdGlibGUpOworCXNjc2lfc3RyY3B5X2RldmluZm8oIm1vZGVsIiwgZGV2aW5mby0+bW9kZWwsIHNpemVvZihkZXZpbmZvLT5tb2RlbCksCisJCQkgICAgbW9kZWwsIGNvbXBhdGlibGUpOworCisJaWYgKHN0cmZsYWdzKQorCQlkZXZpbmZvLT5mbGFncyA9IHNpbXBsZV9zdHJ0b3VsKHN0cmZsYWdzLCBOVUxMLCAwKTsKKwllbHNlCisJCWRldmluZm8tPmZsYWdzID0gZmxhZ3M7CisKKwlkZXZpbmZvLT5jb21wYXRpYmxlID0gY29tcGF0aWJsZTsKKworCWlmIChjb21wYXRpYmxlKQorCQlsaXN0X2FkZF90YWlsKCZkZXZpbmZvLT5kZXZfaW5mb19saXN0LCAmc2NzaV9kZXZfaW5mb19saXN0KTsKKwllbHNlCisJCWxpc3RfYWRkKCZkZXZpbmZvLT5kZXZfaW5mb19saXN0LCAmc2NzaV9kZXZfaW5mb19saXN0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNjc2lfZGV2X2luZm9fbGlzdF9hZGRfc3RyOiBwYXJzZSBkZXZfbGlzdCBhbmQgYWRkIHRvIHRoZQorICogc2NzaV9kZXZfaW5mb19saXN0LgorICogQGRldl9saXN0OglzdHJpbmcgb2YgZGV2aWNlIGZsYWdzIHRvIGFkZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCVBhcnNlIGRldl9saXN0LCBhbmQgYWRkIGVudHJpZXMgdG8gdGhlIHNjc2lfZGV2X2luZm9fbGlzdC4KKyAqIAlkZXZfbGlzdCBpcyBvZiB0aGUgZm9ybSAidmVuZG9yOnByb2R1Y3Q6ZmxhZyx2ZW5kb3I6cHJvZHVjdDpmbGFnIi4KKyAqIAlkZXZfbGlzdCBpcyBtb2RpZmllZCB2aWEgc3Ryc2VwLiBDYW4gYmUgY2FsbGVkIGZvciBjb21tYW5kIGxpbmUKKyAqIAlhZGRpdGlvbiwgZm9yIHByb2Mgb3IgbWFieWUgYSBzeXNmcyBpbnRlcmZhY2UuCisgKgorICogUmV0dXJuczogMCBpZiBPSywgLWVycm9yIG9uIGZhaWx1cmUuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZGV2X2luZm9fbGlzdF9hZGRfc3RyKGNoYXIgKmRldl9saXN0KQoreworCWNoYXIgKnZlbmRvciwgKm1vZGVsLCAqc3RyZmxhZ3MsICpuZXh0OworCWNoYXIgKm5leHRfY2hlY2s7CisJaW50IHJlcyA9IDA7CisKKwluZXh0ID0gZGV2X2xpc3Q7CisJaWYgKG5leHQgJiYgbmV4dFswXSA9PSAnIicpIHsKKwkJLyoKKwkJICogSWdub3JlIGJvdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHF1b3RlLgorCQkgKi8KKwkJbmV4dCsrOworCQluZXh0X2NoZWNrID0gIixcIiI7CisJfSBlbHNlIHsKKwkJbmV4dF9jaGVjayA9ICIsIjsKKwl9CisKKwkvKgorCSAqIEZvciB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgJyInIGNhc2UsIHRoZSBmb3IgbG9vcCBjb21lcworCSAqIHRocm91Z2ggdGhlIGxhc3QgdGltZSB3aXRoIHZlbmRvclswXSA9PSAnXDAnLgorCSAqLworCWZvciAodmVuZG9yID0gc3Ryc2VwKCZuZXh0LCAiOiIpOyB2ZW5kb3IgJiYgKHZlbmRvclswXSAhPSAnXDAnKQorCSAgICAgJiYgKHJlcyA9PSAwKTsgdmVuZG9yID0gc3Ryc2VwKCZuZXh0LCAiOiIpKSB7CisJCXN0cmZsYWdzID0gTlVMTDsKKwkJbW9kZWwgPSBzdHJzZXAoJm5leHQsICI6Iik7CisJCWlmIChtb2RlbCkKKwkJCXN0cmZsYWdzID0gc3Ryc2VwKCZuZXh0LCBuZXh0X2NoZWNrKTsKKwkJaWYgKCFtb2RlbCB8fCAhc3RyZmxhZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBkZXYgaW5mbyBzdHJpbmcgJyVzJyAnJXMnIgorCQkJICAgICAgICIgJyVzJ1xuIiwgX19GVU5DVElPTl9fLCB2ZW5kb3IsIG1vZGVsLAorCQkJICAgICAgIHN0cmZsYWdzKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCX0gZWxzZQorCQkJcmVzID0gc2NzaV9kZXZfaW5mb19saXN0X2FkZCgwIC8qIGNvbXBhdGlibGUgKi8sIHZlbmRvciwKKwkJCQkJCSAgICAgbW9kZWwsIHN0cmZsYWdzLCAwKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBnZXRfZGV2aWNlX2ZsYWdzIC0gZ2V0IGRldmljZSBzcGVjaWZpYyBmbGFncyBmcm9tIHRoZSBkeW5hbWljIGRldmljZQorICogbGlzdC4gQ2FsbGVkIGR1cmluZyBzY2FuIHRpbWUuCisgKiBAdmVuZG9yOgl2ZW5kb3IgbmFtZQorICogQG1vZGVsOgltb2RlbCBuYW1lCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgU2VhcmNoIHRoZSBzY3NpX2Rldl9pbmZvX2xpc3QgZm9yIGFuIGVudHJ5IG1hdGNoaW5nIEB2ZW5kb3IgYW5kCisgKiAgICAgQG1vZGVsLCBpZiBmb3VuZCwgcmV0dXJuIHRoZSBtYXRjaGluZyBmbGFncyB2YWx1ZSwgZWxzZSByZXR1cm4KKyAqICAgICB0aGUgaG9zdCBvciBnbG9iYWwgZGVmYXVsdCBzZXR0aW5ncy4KKyAqKi8KK2ludCBzY3NpX2dldF9kZXZpY2VfZmxhZ3Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB1bnNpZ25lZCBjaGFyICp2ZW5kb3IsCisJCQkgIHVuc2lnbmVkIGNoYXIgKm1vZGVsKQoreworCXN0cnVjdCBzY3NpX2Rldl9pbmZvX2xpc3QgKmRldmluZm87CisJdW5zaWduZWQgaW50IGJmbGFnczsKKworCWJmbGFncyA9IHNkZXYtPnNkZXZfYmZsYWdzOworCWlmICghYmZsYWdzKQorCQliZmxhZ3MgPSBzY3NpX2RlZmF1bHRfZGV2X2ZsYWdzOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpbmZvLCAmc2NzaV9kZXZfaW5mb19saXN0LCBkZXZfaW5mb19saXN0KSB7CisJCWlmIChkZXZpbmZvLT5jb21wYXRpYmxlKSB7CisJCQkvKgorCQkJICogQmVoYXZlIGxpa2UgdGhlIG9sZGVyIHZlcnNpb24gb2YgZ2V0X2RldmljZV9mbGFncy4KKwkJCSAqLworCQkJc2l6ZV90IG1heDsKKwkJCS8qCisJCQkgKiBYWFggd2h5IHNraXAgbGVhZGluZyBzcGFjZXM/IElmIGFuIG9kZCBJTlFVSVJZCisJCQkgKiB2YWx1ZSwgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlCisJCQkgKiBzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtdIGVudHJ5LCBzdWNoIGFzICIgIEZPTyIKKwkJCSAqIHJhdGhlciB0aGFuICJGT08iLiBTaW5jZSB0aGlzIGNvZGUgaXMgYWxyZWFkeQorCQkJICogaGVyZSwgYW5kIHdlIGRvbid0IGtub3cgd2hhdCBkZXZpY2UgaXQgaXMKKwkJCSAqIHRyeWluZyB0byB3b3JrIHdpdGgsIGxlYXZlIGl0IGFzLWlzLgorCQkJICovCisJCQltYXggPSA4OwkvKiBtYXggbGVuZ3RoIG9mIHZlbmRvciAqLworCQkJd2hpbGUgKChtYXggPiAwKSAmJiAqdmVuZG9yID09ICcgJykgeworCQkJCW1heC0tOworCQkJCXZlbmRvcisrOworCQkJfQorCQkJLyoKKwkJCSAqIFhYWCByZW1vdmluZyB0aGUgZm9sbG93aW5nIHN0cmxlbigpIHdvdWxkIGJlCisJCQkgKiBnb29kLCB1c2luZyBpdCBtZWFucyB0aGF0IGZvciBhIGFuIGVudHJ5IG5vdCBpbgorCQkJICogdGhlIGxpc3QsIHdlIHNjYW4gZXZlcnkgYnl0ZSBvZiBldmVyeSB2ZW5kb3IKKwkJCSAqIGxpc3RlZCBpbiBzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtdLCBhbmQgbmV2ZXIgbWF0Y2gKKwkJCSAqIGEgc2luZ2xlIG9uZSAoYW5kIHN0aWxsIGhhdmUgdG8gY29tcGFyZSBhdAorCQkJICogbGVhc3QgdGhlIGZpcnN0IGJ5dGUgb2YgZWFjaCB2ZW5kb3IpLgorCQkJICovCisJCQlpZiAobWVtY21wKGRldmluZm8tPnZlbmRvciwgdmVuZG9yLAorCQkJCSAgICBtaW4obWF4LCBzdHJsZW4oZGV2aW5mby0+dmVuZG9yKSkpKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIFNraXAgc3BhY2VzIGFnYWluLgorCQkJICovCisJCQltYXggPSAxNjsJLyogbWF4IGxlbmd0aCBvZiBtb2RlbCAqLworCQkJd2hpbGUgKChtYXggPiAwKSAmJiAqbW9kZWwgPT0gJyAnKSB7CisJCQkJbWF4LS07CisJCQkJbW9kZWwrKzsKKwkJCX0KKwkJCWlmIChtZW1jbXAoZGV2aW5mby0+bW9kZWwsIG1vZGVsLAorCQkJCSAgIG1pbihtYXgsIHN0cmxlbihkZXZpbmZvLT5tb2RlbCkpKSkKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiBkZXZpbmZvLT5mbGFnczsKKwkJfSBlbHNlIHsKKwkJCWlmICghbWVtY21wKGRldmluZm8tPnZlbmRvciwgdmVuZG9yLAorCQkJCSAgICAgc2l6ZW9mKGRldmluZm8tPnZlbmRvcikpICYmCisJCQkgICAgICFtZW1jbXAoZGV2aW5mby0+bW9kZWwsIG1vZGVsLAorCQkJCSAgICAgIHNpemVvZihkZXZpbmZvLT5tb2RlbCkpKQorCQkJCXJldHVybiBkZXZpbmZvLT5mbGFnczsKKwkJfQorCX0KKwlyZXR1cm4gYmZsYWdzOworfQorCisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworLyogCisgKiBwcm9jX3Njc2lfZGV2X2luZm9fcmVhZDogZHVtcCB0aGUgc2NzaV9kZXZfaW5mb19saXN0IHZpYQorICogL3Byb2Mvc2NzaS9kZXZpY2VfaW5mbworICovCitzdGF0aWMgaW50IHByb2Nfc2NzaV9kZXZpbmZvX3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsCisJCQkJICBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNjc2lfZGV2X2luZm9fbGlzdCAqZGV2aW5mbzsKKwlpbnQgc2l6ZSwgbGVuID0gMDsKKwlvZmZfdCBiZWdpbiA9IDA7CisJb2ZmX3QgcG9zID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aW5mbywgJnNjc2lfZGV2X2luZm9fbGlzdCwgZGV2X2luZm9fbGlzdCkgeworCQlzaXplID0gc3ByaW50ZihidWZmZXIgKyBsZW4sICInJS44cycgJyUuMTZzJyAweCV4XG4iLAorCQkJZGV2aW5mby0+dmVuZG9yLCBkZXZpbmZvLT5tb2RlbCwgZGV2aW5mby0+ZmxhZ3MpOworCQlsZW4gKz0gc2l6ZTsKKwkJcG9zID0gYmVnaW4gKyBsZW47CisJCWlmIChwb3MgPCBvZmZzZXQpIHsKKwkJCWxlbiA9IDA7CisJCQliZWdpbiA9IHBvczsKKwkJfQorCQlpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorCQkJZ290byBzdG9wX291dHB1dDsKKwl9CisKK3N0b3Bfb3V0cHV0OgorCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCisJbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IHNsb3AgKi8KKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CS8qIEVuZGluZyBzbG9wICovCisJcmV0dXJuIChsZW4pOworfQorCisvKiAKKyAqIHByb2Nfc2NzaV9kZXZfaW5mb193cml0ZTogYWxsb3cgYWRkaXRpb25zIHRvIHRoZSBzY3NpX2Rldl9pbmZvX2xpc3QgdmlhCisgKiAvcHJvYy4KKyAqCisgKiBVc2U6IGVjaG8gInZlbmRvcjptb2RlbDpmbGFnIiA+IC9wcm9jL3Njc2kvZGV2aWNlX2luZm8KKyAqCisgKiBUbyBhZGQgYSBibGFjay93aGl0ZSBsaXN0IGVudHJ5IGZvciB2ZW5kb3IgYW5kIG1vZGVsIHdpdGggYW4gaW50ZWdlcgorICogdmFsdWUgb2YgZmxhZyB0byB0aGUgc2NzaSBkZXZpY2UgaW5mbyBsaXN0LgorICovCitzdGF0aWMgaW50IHByb2Nfc2NzaV9kZXZpbmZvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB2b2lkICpkYXRhKQoreworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgZXJyID0gbGVuZ3RoOworCisJaWYgKCFidWYgfHwgbGVuZ3RoPlBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEoYnVmZmVyID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgYnVmLCBsZW5ndGgpKSB7CisJCWVyciA9LUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxlbmd0aCA8IFBBR0VfU0laRSkKKwkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOworCWVsc2UgaWYgKGJ1ZmZlcltQQUdFX1NJWkUtMV0pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2NzaV9kZXZfaW5mb19saXN0X2FkZF9zdHIoYnVmZmVyKTsKKworb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXIpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogQ09ORklHX1NDU0lfUFJPQ19GUyAqLworCittb2R1bGVfcGFyYW1fc3RyaW5nKGRldl9mbGFncywgc2NzaV9kZXZfZmxhZ3MsIHNpemVvZihzY3NpX2Rldl9mbGFncyksIDApOworTU9EVUxFX1BBUk1fREVTQyhkZXZfZmxhZ3MsCisJICJHaXZlbiBzY3NpX2Rldl9mbGFncz12ZW5kb3I6bW9kZWw6ZmxhZ3NbLHY6bTpmXSBhZGQgYmxhY2svd2hpdGUiCisJICIgbGlzdCBlbnRyaWVzIGZvciB2ZW5kb3IgYW5kIG1vZGVsIHdpdGggYW4gaW50ZWdlciB2YWx1ZSBvZiBmbGFncyIKKwkgIiB0byB0aGUgc2NzaSBkZXZpY2UgaW5mbyBsaXN0Iik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChkZWZhdWx0X2Rldl9mbGFncywgc2NzaV9kZWZhdWx0X2Rldl9mbGFncywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X2Rldl9mbGFncywKKwkJICJzY3NpIGRlZmF1bHQgZGV2aWNlIGZsYWcgaW50ZWdlciB2YWx1ZSIpOworCisvKioKKyAqIHNjc2lfZGV2X2luZm9fbGlzdF9kZWxldGU6IGNhbGxlZCBmcm9tIHNjc2kuYzpleGl0X3Njc2kgdG8gcmVtb3ZlCisgKiAJdGhlIHNjc2lfZGV2X2luZm9fbGlzdC4KKyAqKi8KK3ZvaWQgc2NzaV9leGl0X2RldmluZm8odm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKmxoX25leHQ7CisJc3RydWN0IHNjc2lfZGV2X2luZm9fbGlzdCAqZGV2aW5mbzsKKworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKwlyZW1vdmVfcHJvY19lbnRyeSgic2NzaS9kZXZpY2VfaW5mbyIsIE5VTEwpOworI2VuZGlmCisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX25leHQsICZzY3NpX2Rldl9pbmZvX2xpc3QpIHsKKwkJZGV2aW5mbyA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzY3NpX2Rldl9pbmZvX2xpc3QsCisJCQkJICAgICBkZXZfaW5mb19saXN0KTsKKwkJa2ZyZWUoZGV2aW5mbyk7CisJfQorfQorCisvKioKKyAqIHNjc2lfZGV2X2xpc3RfaW5pdDogc2V0IHVwIHRoZSBkeW5hbWljIGRldmljZSBsaXN0LgorICogQGRldl9saXN0OglzdHJpbmcgb2YgZGV2aWNlIGZsYWdzIHRvIGFkZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUFkZCBjb21tYW5kIGxpbmUgQGRldl9saXN0IGVudHJpZXMsIHRoZW4gYWRkCisgKiAJc2NzaV9zdGF0aWNfZGV2aWNlX2xpc3QgZW50cmllcyB0byB0aGUgc2NzaSBkZXZpY2UgaW5mbyBsaXN0LgorICoqLworaW50IF9faW5pdCBzY3NpX2luaXRfZGV2aW5mbyh2b2lkKQoreworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisjZW5kaWYKKwlpbnQgZXJyb3IsIGk7CisKKwllcnJvciA9IHNjc2lfZGV2X2luZm9fbGlzdF9hZGRfc3RyKHNjc2lfZGV2X2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWZvciAoaSA9IDA7IHNjc2lfc3RhdGljX2RldmljZV9saXN0W2ldLnZlbmRvcjsgaSsrKSB7CisJCWVycm9yID0gc2NzaV9kZXZfaW5mb19saXN0X2FkZCgxIC8qIGNvbXBhdGliaWxlICovLAorCQkJCXNjc2lfc3RhdGljX2RldmljZV9saXN0W2ldLnZlbmRvciwKKwkJCQlzY3NpX3N0YXRpY19kZXZpY2VfbGlzdFtpXS5tb2RlbCwKKwkJCQlOVUxMLAorCQkJCXNjc2lfc3RhdGljX2RldmljZV9saXN0W2ldLmZsYWdzKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgic2NzaS9kZXZpY2VfaW5mbyIsIDAsIE5VTEwpOworCWlmICghcCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJcC0+Z2V0X2luZm8gPSBwcm9jX3Njc2lfZGV2aW5mb19yZWFkOworCXAtPndyaXRlX3Byb2MgPSBwcm9jX3Njc2lfZGV2aW5mb193cml0ZTsKKyNlbmRpZiAvKiBDT05GSUdfU0NTSV9QUk9DX0ZTICovCisKKyBvdXQ6CisJaWYgKGVycm9yKQorCQlzY3NpX2V4aXRfZGV2aW5mbygpOworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzU5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC0wLDAgKzEsMjA1MCBAQAorLyoKKyAqICBzY3NpX2Vycm9yLmMgQ29weXJpZ2h0IChDKSAxOTk3IEVyaWMgWW91bmdkYWxlCisgKgorICogIFNDU0kgZXJyb3IvdGltZW91dCBoYW5kbGluZworICogICAgICBJbml0aWFsIHZlcnNpb25zOiBFcmljIFlvdW5nZGFsZS4gIEJhc2VkIHVwb24gY29udmVyc2F0aW9ucyB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICAgIExlb25hcmQgWnVia29mZiBhbmQgRGF2aWQgTWlsbGVyIGF0IExpbnV4IEV4cG8sIAorICogICAgICAgICAgICAgICAgICAgICAgICBpZGVhcyBvcmlnaW5hdGluZyBmcm9tIGFsbCBvdmVyIHRoZSBwbGFjZS4KKyAqCisgKglSZXN0cnVjdHVyZWQgc2NzaV91bmphbV9ob3N0IGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9ucy4KKyAqCVNlcHRlbWJlciAwNCwgMjAwMiBNaWtlIEFuZGVyc29uIChhbmRtaWtlQHVzLmlibS5jb20pCisgKgorICoJRm9yd2FyZCBwb3J0IG9mIFJ1c3NlbGwgS2luZydzIChybWtAYXJtLmxpbnV4Lm9yZy51aykgY2hhbmdlcyBhbmQKKyAqCW1pbm9yICBjbGVhbnVwcy4KKyAqCVNlcHRlbWJlciAzMCwgMjAwMiBNaWtlIEFuZGVyc29uIChhbmRtaWtlQHVzLmlibS5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorCisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKyNkZWZpbmUgU0VOU0VfVElNRU9VVAkJKDEwKkhaKQorI2RlZmluZSBTVEFSVF9VTklUX1RJTUVPVVQJKDMwKkhaKQorCisvKgorICogVGhlc2Ugc2hvdWxkICpwcm9iYWJseSogYmUgaGFuZGxlZCBieSB0aGUgaG9zdCBpdHNlbGYuCisgKiBTaW5jZSBpdCBpcyBhbGxvd2VkIHRvIHNsZWVwLCBpdCBwcm9iYWJseSBzaG91bGQuCisgKi8KKyNkZWZpbmUgQlVTX1JFU0VUX1NFVFRMRV9USU1FICAgKDEwKQorI2RlZmluZSBIT1NUX1JFU0VUX1NFVFRMRV9USU1FICAoMTApCisKKy8qIGNhbGxlZCB3aXRoIHNob3N0LT5ob3N0X2xvY2sgaGVsZCAqLwordm9pZCBzY3NpX2VoX3dha2V1cChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmhvc3RfYnVzeSA9PSBzaG9zdC0+aG9zdF9mYWlsZWQpIHsKKwkJdXAoc2hvc3QtPmVoX3dhaXQpOworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSg1LAorCQkJCXByaW50aygiV2FraW5nIGVycm9yIGhhbmRsZXIgdGhyZWFkXG4iKSk7CisJfQorfQorCisvKioKKyAqIHNjc2lfZWhfc2NtZF9hZGQgLSBhZGQgc2NzaSBjbWQgdG8gZXJyb3IgaGFuZGxpbmcuCisgKiBAc2NtZDoJc2NtZCB0byBydW4gZWggb24uCisgKiBAZWhfZmxhZzoJb3B0aW9uYWwgU0NTSV9FSCBmbGFnLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTAgb24gZmFpbHVyZS4KKyAqKi8KK2ludCBzY3NpX2VoX3NjbWRfYWRkKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIGludCBlaF9mbGFnKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2NtZC0+ZGV2aWNlLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2hvc3QtPmVoX3dhaXQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlzY3NpX2VoX2VmbGFnc19zZXQoc2NtZCwgZWhfZmxhZyk7CisJLyoKKwkgKiBGSVhNRTogQ2FuIHdlIHN0b3Agc2V0dGluZyBvd25lciBhbmQgc3RhdGUuCisJICovCisJc2NtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0VSUk9SX0hBTkRMRVI7CisJc2NtZC0+c3RhdGUgPSBTQ1NJX1NUQVRFX0ZBSUxFRDsKKwkvKgorCSAqIFNldCB0aGUgc2VyaWFsX251bWJlcl9hdF90aW1lb3V0IHRvIHRoZSBjdXJyZW50CisJICogc2VyaWFsX251bWJlcgorCSAqLworCXNjbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCA9IHNjbWQtPnNlcmlhbF9udW1iZXI7CisJbGlzdF9hZGRfdGFpbCgmc2NtZC0+ZWhfZW50cnksICZzaG9zdC0+ZWhfY21kX3EpOworCXNldF9iaXQoU0hPU1RfUkVDT1ZFUlksICZzaG9zdC0+c2hvc3Rfc3RhdGUpOworCXNob3N0LT5ob3N0X2ZhaWxlZCsrOworCXNjc2lfZWhfd2FrZXVwKHNob3N0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBzY3NpX2FkZF90aW1lciAtIFN0YXJ0IHRpbWVvdXQgdGltZXIgZm9yIGEgc2luZ2xlIHNjc2kgY29tbWFuZC4KKyAqIEBzY21kOglzY3NpIGNvbW1hbmQgdGhhdCBpcyBhYm91dCB0byBzdGFydCBydW5uaW5nLgorICogQHRpbWVvdXQ6CWFtb3VudCBvZiB0aW1lIHRvIGFsbG93IHRoaXMgY29tbWFuZCB0byBydW4uCisgKiBAY29tcGxldGU6CXRpbWVvdXQgZnVuY3Rpb24gdG8gY2FsbCBpZiB0aW1lciBpc24ndCBjYW5jZWxlZC4KKyAqCisgKiBOb3RlczoKKyAqICAgIFRoaXMgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGFuIGlubGluZSBmdW5jdGlvbi4gIEVhY2ggc2NzaSBjb21tYW5kCisgKiAgICBoYXMgaXRzIG93biB0aW1lciwgYW5kIGFzIGl0IGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgd2Ugc2V0IHVwIHRoZQorICogICAgdGltZXIuICBXaGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcywgd2UgY2FuY2VsIHRoZSB0aW1lci4KKyAqKi8KK3ZvaWQgc2NzaV9hZGRfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqc2NtZCwgaW50IHRpbWVvdXQsCisJCSAgICB2b2lkICgqY29tcGxldGUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisKKwkvKgorCSAqIElmIHRoZSBjbG9jayB3YXMgYWxyZWFkeSBydW5uaW5nIGZvciB0aGlzIGNvbW1hbmQsIHRoZW4KKwkgKiBmaXJzdCBkZWxldGUgdGhlIHRpbWVyLiAgVGhlIHRpbWVyIGhhbmRsaW5nIGNvZGUgZ2V0cyByYXRoZXIKKwkgKiBjb25mdXNlZCBpZiB3ZSBkb24ndCBkbyB0aGlzLgorCSAqLworCWlmIChzY21kLT5laF90aW1lb3V0LmZ1bmN0aW9uKQorCQlkZWxfdGltZXIoJnNjbWQtPmVoX3RpbWVvdXQpOworCisJc2NtZC0+ZWhfdGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NtZDsKKwlzY21kLT5laF90aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlzY21kLT5laF90aW1lb3V0LmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKSBjb21wbGV0ZTsKKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDUsIHByaW50aygiJXM6IHNjbWQ6ICVwLCB0aW1lOiIKKwkJCQkJICAiICVkLCAoJXApXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgc2NtZCwgdGltZW91dCwgY29tcGxldGUpKTsKKworCWFkZF90aW1lcigmc2NtZC0+ZWhfdGltZW91dCk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfYWRkX3RpbWVyKTsKKworLyoqCisgKiBzY3NpX2RlbGV0ZV90aW1lciAtIERlbGV0ZS9jYW5jZWwgdGltZXIgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgKiBAc2NtZDoJQ21kIHRoYXQgd2UgYXJlIGNhbmNlbGluZyB0aW1lciBmb3IKKyAqCisgKiBOb3RlczoKKyAqICAgICBUaGlzIHNob3VsZCBiZSB0dXJuZWQgaW50byBhbiBpbmxpbmUgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogICAgIDEgaWYgd2Ugd2VyZSBhYmxlIHRvIGRldGFjaCB0aGUgdGltZXIuICAwIGlmIHdlIGJsZXcgaXQsIGFuZCB0aGUKKyAqICAgICB0aW1lciBmdW5jdGlvbiBoYXMgYWxyZWFkeSBzdGFydGVkIHRvIHJ1bi4KKyAqKi8KK2ludCBzY3NpX2RlbGV0ZV90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCWludCBydG47CisKKwlydG4gPSBkZWxfdGltZXIoJnNjbWQtPmVoX3RpbWVvdXQpOworCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoNSwgcHJpbnRrKCIlczogc2NtZDogJXAsIgorCQkJCQkgIiBydG46ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCSBzY21kLCBydG4pKTsKKworCXNjbWQtPmVoX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKU5VTEw7CisJc2NtZC0+ZWhfdGltZW91dC5mdW5jdGlvbiA9IE5VTEw7CisKKwlyZXR1cm4gcnRuOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2RlbGV0ZV90aW1lcik7CisKKy8qKgorICogc2NzaV90aW1lc19vdXQgLSBUaW1lb3V0IGZ1bmN0aW9uIGZvciBub3JtYWwgc2NzaSBjb21tYW5kcy4KKyAqIEBzY21kOglDbWQgdGhhdCBpcyB0aW1pbmcgb3V0LgorICoKKyAqIE5vdGVzOgorICogICAgIFdlIGRvIG5vdCBuZWVkIHRvIGxvY2sgdGhpcy4gIFRoZXJlIGlzIHRoZSBwb3RlbnRpYWwgZm9yIGEgcmFjZQorICogICAgIG9ubHkgaW4gdGhhdCB0aGUgbm9ybWFsIGNvbXBsZXRpb24gaGFuZGxpbmcgbWlnaHQgcnVuLCBidXQgaWYgdGhlCisgKiAgICAgbm9ybWFsIGNvbXBsZXRpb24gZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGF0IHRoZSB0aW1lciBoYXMgYWxyZWFkeQorICogICAgIGZpcmVkLCB0aGVuIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcuCisgKiovCit2b2lkIHNjc2lfdGltZXNfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc2NzaV9sb2dfY29tcGxldGlvbihzY21kLCBUSU1FT1VUX0VSUk9SKTsKKworCWlmIChzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF90aW1lZF9vdXQpCisJCXN3aXRjaCAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfdGltZWRfb3V0KHNjbWQpKSB7CisJCWNhc2UgRUhfSEFORExFRDoKKwkJCV9fc2NzaV9kb25lKHNjbWQpOworCQkJcmV0dXJuOworCQljYXNlIEVIX1JFU0VUX1RJTUVSOgorCQkJLyogVGhpcyBhbGxvd3MgYSBzaW5nbGUgcmV0cnkgZXZlbiBvZiBhIGNvbW1hbmQKKwkJCSAqIHdpdGggYWxsb3dlZCA9PSAwICovCisJCQlpZiAoc2NtZC0+cmV0cmllcysrID4gc2NtZC0+YWxsb3dlZCkKKwkJCQlicmVhazsKKwkJCXNjc2lfYWRkX3RpbWVyKHNjbWQsIHNjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQsCisJCQkJICAgICAgIHNjc2lfdGltZXNfb3V0KTsKKwkJCXJldHVybjsKKwkJY2FzZSBFSF9OT1RfSEFORExFRDoKKwkJCWJyZWFrOworCQl9CisKKwlpZiAodW5saWtlbHkoIXNjc2lfZWhfc2NtZF9hZGQoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkpIHsKKwkJcGFuaWMoIkVycm9yIGhhbmRsZXIgdGhyZWFkIG5vdCBwcmVzZW50IGF0ICVwICVwICVzICVkIiwKKwkJICAgICAgc2NtZCwgc2NtZC0+ZGV2aWNlLT5ob3N0LCBfX0ZJTEVfXywgX19MSU5FX18pOworCX0KK30KKworLyoqCisgKiBzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMgLSBQcmV2ZW50IGNtZHMgZnJvbSBiZWluZyBxdWV1ZWQuCisgKiBAc2RldjoJRGV2aWNlIG9uIHdoaWNoIHdlIGFyZSBwZXJmb3JtaW5nIHJlY292ZXJ5LgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIFdlIGJsb2NrIHVudGlsIHRoZSBob3N0IGlzIG91dCBvZiBlcnJvciByZWNvdmVyeSwgYW5kIHRoZW4gY2hlY2sgdG8KKyAqICAgICBzZWUgd2hldGhlciB0aGUgaG9zdCBvciB0aGUgZGV2aWNlIGlzIG9mZmxpbmUuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogICAgIDAgd2hlbiBkZXYgd2FzIHRha2VuIG9mZmxpbmUgYnkgZXJyb3IgcmVjb3ZlcnkuIDEgT0sgdG8gcHJvY2VlZC4KKyAqKi8KK2ludCBzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWludCBvbmxpbmU7CisKKwl3YWl0X2V2ZW50KHNkZXYtPmhvc3QtPmhvc3Rfd2FpdCwgKCF0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwgJnNkZXYtPmhvc3QtPnNob3N0X3N0YXRlKSkpOworCisJb25saW5lID0gc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpOworCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoNSwgcHJpbnRrKCIlczogcnRuOiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkgIG9ubGluZSkpOworCisJcmV0dXJuIG9ubGluZTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKTsKKworI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKKy8qKgorICogc2NzaV9laF9wcnRfZmFpbF9zdGF0cyAtIExvZyBpbmZvIG9uIGZhaWx1cmVzLgorICogQHNob3N0OglzY3NpIGhvc3QgYmVpbmcgcmVjb3ZlcmVkLgorICogQHdvcmtfcToJUXVldWUgb2Ygc2NzaSBjbWRzIHRvIHByb2Nlc3MuCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9laF9wcnRfZmFpbF9zdGF0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX3EpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJaW50IHRvdGFsX2ZhaWx1cmVzID0gMDsKKwlpbnQgY21kX2ZhaWxlZCA9IDA7CisJaW50IGNtZF9jYW5jZWwgPSAwOworCWludCBkZXZpY2VzX2ZhaWxlZCA9IDA7CisKKwlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2Rldiwgc2hvc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzY21kLCB3b3JrX3EsIGVoX2VudHJ5KSB7CisJCQlpZiAoc2NtZC0+ZGV2aWNlID09IHNkZXYpIHsKKwkJCQkrK3RvdGFsX2ZhaWx1cmVzOworCQkJCWlmIChzY3NpX2VoX2VmbGFnc19jaGsoc2NtZCwKKwkJCQkJCSAgICAgICBTQ1NJX0VIX0NBTkNFTF9DTUQpKQorCQkJCQkrK2NtZF9jYW5jZWw7CisJCQkJZWxzZSAKKwkJCQkJKytjbWRfZmFpbGVkOworCQkJfQorCQl9CisKKwkJaWYgKGNtZF9jYW5jZWwgfHwgY21kX2ZhaWxlZCkgeworCQkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywKKwkJCQlwcmludGsoIiVzOiAlZDolZDolZDolZCBjbWRzIGZhaWxlZDogJWQsIgorCQkJCSAgICAgICAiIGNhbmNlbDogJWRcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgc2hvc3QtPmhvc3Rfbm8sCisJCQkJICAgICAgIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sCisJCQkJICAgICAgIGNtZF9mYWlsZWQsIGNtZF9jYW5jZWwpKTsKKwkJCWNtZF9jYW5jZWwgPSAwOworCQkJY21kX2ZhaWxlZCA9IDA7CisJCQkrK2RldmljZXNfZmFpbGVkOworCQl9CisJfQorCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMiwgcHJpbnRrKCJUb3RhbCBvZiAlZCBjb21tYW5kcyBvbiAlZCIKKwkJCQkJICAiIGRldmljZXMgcmVxdWlyZSBlaCB3b3JrXG4iLAorCQkJCSAgdG90YWxfZmFpbHVyZXMsIGRldmljZXNfZmFpbGVkKSk7Cit9CisjZW5kaWYKKworLyoqCisgKiBzY3NpX2NoZWNrX3NlbnNlIC0gRXhhbWluZSBzY3NpIGNtZCBzZW5zZQorICogQHNjbWQ6CUNtZCB0byBoYXZlIHNlbnNlIGNoZWNrZWQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCVNVQ0NFU1Mgb3IgRkFJTEVEIG9yIE5FRURTX1JFVFJZCisgKgorICogTm90ZXM6CisgKglXaGVuIGEgZGVmZXJyZWQgZXJyb3IgaXMgZGV0ZWN0ZWQgdGhlIGN1cnJlbnQgY29tbWFuZCBoYXMKKyAqCW5vdCBiZWVuIGV4ZWN1dGVkIGFuZCBuZWVkcyByZXRyeWluZy4KKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9jaGVja19zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCWlmICghIHNjc2lfY29tbWFuZF9ub3JtYWxpemVfc2Vuc2Uoc2NtZCwgJnNzaGRyKSkKKwkJcmV0dXJuIEZBSUxFRDsJLyogbm8gdmFsaWQgc2Vuc2UgZGF0YSAqLworCisJaWYgKHNjc2lfc2Vuc2VfaXNfZGVmZXJyZWQoJnNzaGRyKSkKKwkJcmV0dXJuIE5FRURTX1JFVFJZOworCisJLyoKKwkgKiBQcmV2aW91cyBsb2dpYyBsb29rZWQgZm9yIEZJTEVNQVJLLCBFT00gb3IgSUxJIHdoaWNoIGFyZQorCSAqIG1haW5seSBhc3NvY2lhdGVkIHdpdGggdGFwZXMgYW5kIHJldHVybmVkIFNVQ0NFU1MuCisJICovCisJaWYgKHNzaGRyLnJlc3BvbnNlX2NvZGUgPT0gMHg3MCkgeworCQkvKiBmaXhlZCBmb3JtYXQgKi8KKwkJaWYgKHNjbWQtPnNlbnNlX2J1ZmZlclsyXSAmIDB4ZTApCisJCQlyZXR1cm4gU1VDQ0VTUzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBkZXNjcmlwdG9yIGZvcm1hdDogbG9vayBmb3IgInN0cmVhbSBjb21tYW5kcyBzZW5zZSBkYXRhCisJCSAqIGRlc2NyaXB0b3IiIChzZWUgU1NDLTMpLiBBc3N1bWUgc2luZ2xlIHNlbnNlIGRhdGEKKwkJICogZGVzY3JpcHRvci4gSWdub3JlIElMSSBmcm9tIFNCQy0yIFJFQUQgTE9ORyBhbmQgV1JJVEUgTE9ORy4KKwkJICovCisJCWlmICgoc3NoZHIuYWRkaXRpb25hbF9sZW5ndGggPiAzKSAmJgorCQkgICAgKHNjbWQtPnNlbnNlX2J1ZmZlcls4XSA9PSAweDQpICYmCisJCSAgICAoc2NtZC0+c2Vuc2VfYnVmZmVyWzExXSAmIDB4ZTApKQorCQkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJc3dpdGNoIChzc2hkci5zZW5zZV9rZXkpIHsKKwljYXNlIE5PX1NFTlNFOgorCQlyZXR1cm4gU1VDQ0VTUzsKKwljYXNlIFJFQ09WRVJFRF9FUlJPUjoKKwkJcmV0dXJuIC8qIHNvZnRfZXJyb3IgKi8gU1VDQ0VTUzsKKworCWNhc2UgQUJPUlRFRF9DT01NQU5EOgorCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJY2FzZSBOT1RfUkVBRFk6CisJY2FzZSBVTklUX0FUVEVOVElPTjoKKwkJLyoKKwkJICogaWYgd2UgYXJlIGV4cGVjdGluZyBhIGNjL3VhIGJlY2F1c2Ugb2YgYSBidXMgcmVzZXQgdGhhdCB3ZQorCQkgKiBwZXJmb3JtZWQsIHRyZWF0IHRoaXMganVzdCBhcyBhIHJldHJ5LiAgb3RoZXJ3aXNlIHRoaXMgaXMKKwkJICogaW5mb3JtYXRpb24gdGhhdCB3ZSBzaG91bGQgcGFzcyB1cCB0byB0aGUgdXBwZXItbGV2ZWwgZHJpdmVyCisJCSAqIHNvIHRoYXQgd2UgY2FuIGRlYWwgd2l0aCBpdCB0aGVyZS4KKwkJICovCisJCWlmIChzY21kLT5kZXZpY2UtPmV4cGVjdGluZ19jY191YSkgeworCQkJc2NtZC0+ZGV2aWNlLT5leHBlY3RpbmdfY2NfdWEgPSAwOworCQkJcmV0dXJuIE5FRURTX1JFVFJZOworCQl9CisJCS8qCisJCSAqIGlmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVjb21pbmcgcmVhZHksIHdlIAorCQkgKiBzaG91bGQgcmV0cnkuCisJCSAqLworCQlpZiAoKHNzaGRyLmFzYyA9PSAweDA0KSAmJiAoc3NoZHIuYXNjcSA9PSAweDAxKSkKKwkJCXJldHVybiBORUVEU19SRVRSWTsKKwkJLyoKKwkJICogaWYgdGhlIGRldmljZSBpcyBub3Qgc3RhcnRlZCwgd2UgbmVlZCB0byB3YWtlCisJCSAqIHRoZSBlcnJvciBoYW5kbGVyIHRvIHN0YXJ0IHRoZSBtb3RvcgorCQkgKi8KKwkJaWYgKHNjbWQtPmRldmljZS0+YWxsb3dfcmVzdGFydCAmJgorCQkgICAgKHNzaGRyLmFzYyA9PSAweDA0KSAmJiAoc3NoZHIuYXNjcSA9PSAweDAyKSkKKwkJCXJldHVybiBGQUlMRUQ7CisJCXJldHVybiBTVUNDRVNTOworCisJCS8qIHRoZXNlIHRocmVlIGFyZSBub3Qgc3VwcG9ydGVkICovCisJY2FzZSBDT1BZX0FCT1JURUQ6CisJY2FzZSBWT0xVTUVfT1ZFUkZMT1c6CisJY2FzZSBNSVNDT01QQVJFOgorCQlyZXR1cm4gU1VDQ0VTUzsKKworCWNhc2UgTUVESVVNX0VSUk9SOgorCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisKKwljYXNlIEhBUkRXQVJFX0VSUk9SOgorCQlpZiAoc2NtZC0+ZGV2aWNlLT5yZXRyeV9od2Vycm9yKQorCQkJcmV0dXJuIE5FRURTX1JFVFJZOworCQllbHNlCisJCQlyZXR1cm4gU1VDQ0VTUzsKKworCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgorCWNhc2UgQkxBTktfQ0hFQ0s6CisJY2FzZSBEQVRBX1BST1RFQ1Q6CisJZGVmYXVsdDoKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorfQorCisvKioKKyAqIHNjc2lfZWhfY29tcGxldGVkX25vcm1hbGx5IC0gRGlzcG9zaXRpb24gYSBlaCBjbWQgb24gcmV0dXJuIGZyb20gTExELgorICogQHNjbWQ6CVNDU0kgY21kIHRvIGV4YW1pbmUuCisgKgorICogTm90ZXM6CisgKiAgICBUaGlzIGlzICpvbmx5KiBjYWxsZWQgd2hlbiB3ZSBhcmUgZXhhbWluaW5nIHRoZSBzdGF0dXMgb2YgY29tbWFuZHMKKyAqICAgIHF1ZXVlZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuICB0aGUgbWFpbiBkaWZmZXJlbmNlIGhlcmUgaXMgdGhhdCB3ZQorICogICAgZG9uJ3QgYWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSBvZiByZXRyaWVzIGhlcmUsIGFuZCB3ZSBhcmUgYSBsb3QKKyAqICAgIG1vcmUgcmVzdHJpY3RpdmUgYWJvdXQgd2hhdCB3ZSBjb25zaWRlciBhY2NlcHRhYmxlLgorICoqLworc3RhdGljIGludCBzY3NpX2VoX2NvbXBsZXRlZF9ub3JtYWxseShzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCS8qCisJICogZmlyc3QgY2hlY2sgdGhlIGhvc3QgYnl0ZSwgdG8gc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZXJlCisJICogdGhhdCB3b3VsZCBpbmRpY2F0ZSB3aGF0IHdlIG5lZWQgdG8gZG8uCisJICovCisJaWYgKGhvc3RfYnl0ZShzY21kLT5yZXN1bHQpID09IERJRF9SRVNFVCkgeworCQkvKgorCQkgKiByYXRzLiAgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGVycm9yIGhhbmRsZXIsIHNvIHdlIG5vdworCQkgKiBnZXQgdG8gdHJ5IGFuZCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gbmV4dC4gIGlmIHRoZSBzZW5zZQorCQkgKiBpcyB2YWxpZCwgd2UgaGF2ZSBhIHByZXR0eSBnb29kIGlkZWEgb2Ygd2hhdCB0byBkby4KKwkJICogaWYgbm90LCB3ZSBtYXJrIGl0IGFzIEZBSUxFRC4KKwkJICovCisJCXJldHVybiBzY3NpX2NoZWNrX3NlbnNlKHNjbWQpOworCX0KKwlpZiAoaG9zdF9ieXRlKHNjbWQtPnJlc3VsdCkgIT0gRElEX09LKQorCQlyZXR1cm4gRkFJTEVEOworCisJLyoKKwkgKiBuZXh0LCBjaGVjayB0aGUgbWVzc2FnZSBieXRlLgorCSAqLworCWlmIChtc2dfYnl0ZShzY21kLT5yZXN1bHQpICE9IENPTU1BTkRfQ09NUExFVEUpCisJCXJldHVybiBGQUlMRUQ7CisKKwkvKgorCSAqIG5vdywgY2hlY2sgdGhlIHN0YXR1cyBieXRlIHRvIHNlZSBpZiB0aGlzIGluZGljYXRlcworCSAqIGFueXRoaW5nIHNwZWNpYWwuCisJICovCisJc3dpdGNoIChzdGF0dXNfYnl0ZShzY21kLT5yZXN1bHQpKSB7CisJY2FzZSBHT09EOgorCWNhc2UgQ09NTUFORF9URVJNSU5BVEVEOgorCQlyZXR1cm4gU1VDQ0VTUzsKKwljYXNlIENIRUNLX0NPTkRJVElPTjoKKwkJcmV0dXJuIHNjc2lfY2hlY2tfc2Vuc2Uoc2NtZCk7CisJY2FzZSBDT05ESVRJT05fR09PRDoKKwljYXNlIElOVEVSTUVESUFURV9HT09EOgorCWNhc2UgSU5URVJNRURJQVRFX0NfR09PRDoKKwkJLyoKKwkJICogd2hvIGtub3dzPyAgRklYTUUoZXJpYykKKwkJICovCisJCXJldHVybiBTVUNDRVNTOworCWNhc2UgQlVTWToKKwljYXNlIFFVRVVFX0ZVTEw6CisJY2FzZSBSRVNFUlZBVElPTl9DT05GTElDVDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gRkFJTEVEOworCX0KKwlyZXR1cm4gRkFJTEVEOworfQorCisvKioKKyAqIHNjc2lfZWhfdGltZXNfb3V0IC0gdGltZW91dCBmdW5jdGlvbiBmb3IgZXJyb3IgaGFuZGxpbmcuCisgKiBAc2NtZDoJQ21kIHRoYXQgaXMgdGltaW5nIG91dC4KKyAqCisgKiBOb3RlczoKKyAqICAgIER1cmluZyBlcnJvciBoYW5kbGluZywgdGhlIGtlcm5lbCB0aHJlYWQgd2lsbCBiZSBzbGVlcGluZyB3YWl0aW5nCisgKiAgICBmb3Igc29tZSBhY3Rpb24gdG8gY29tcGxldGUgb24gdGhlIGRldmljZS4gIG91ciBvbmx5IGpvYiBpcyB0bworICogICAgcmVjb3JkIHRoYXQgaXQgdGltZWQgb3V0LCBhbmQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9laF90aW1lc19vdXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzY3NpX2VoX2VmbGFnc19zZXQoc2NtZCwgU0NTSV9FSF9SRUNfVElNRU9VVCk7CisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogc2NtZDolcFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkgIHNjbWQpKTsKKworCWlmIChzY21kLT5kZXZpY2UtPmhvc3QtPmVoX2FjdGlvbikKKwkJdXAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3Rpb24pOworfQorCisvKioKKyAqIHNjc2lfZWhfZG9uZSAtIENvbXBsZXRpb24gZnVuY3Rpb24gZm9yIGVycm9yIGhhbmRsaW5nLgorICogQHNjbWQ6CUNtZCB0aGF0IGlzIGRvbmUuCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2VoX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwkvKgorCSAqIGlmIHRoZSB0aW1lb3V0IGhhbmRsZXIgaXMgYWxyZWFkeSBydW5uaW5nLCB0aGVuIGp1c3Qgc2V0IHRoZQorCSAqIGZsYWcgd2hpY2ggc2F5cyB3ZSBmaW5pc2hlZCBsYXRlLCBhbmQgcmV0dXJuLiAgd2UgaGF2ZSBubworCSAqIHdheSBvZiBzdG9wcGluZyB0aGUgdGltZW91dCBoYW5kbGVyIGZyb20gcnVubmluZywgc28gd2UgbXVzdAorCSAqIGFsd2F5cyBkZWZlciB0byBpdC4KKwkgKi8KKwlpZiAoZGVsX3RpbWVyKCZzY21kLT5laF90aW1lb3V0KSkgeworCQlzY21kLT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CisJCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9FUlJPUl9IQU5ETEVSOworCisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXMgc2NtZDogJXAgcmVzdWx0OiAleFxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCBzY21kLCBzY21kLT5yZXN1bHQpKTsKKworCQlpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3Rpb24pCisJCQl1cChzY21kLT5kZXZpY2UtPmhvc3QtPmVoX2FjdGlvbik7CisJfQorfQorCisvKioKKyAqIHNjc2lfc2VuZF9laF9jbW5kICAtIHNlbmQgYSBjbWQgdG8gYSBkZXZpY2UgYXMgcGFydCBvZiBlcnJvciByZWNvdmVyeS4KKyAqIEBzY21kOglTQ1NJIENtZCB0byBzZW5kLgorICogQHRpbWVvdXQ6CVRpbWVvdXQgZm9yIGNtZC4KKyAqCisgKiBOb3RlczoKKyAqICAgIFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgc3RydWN0dXJlcyBpcyBxdWl0ZSBhIGJpdCBkaWZmZXJlbnQgaW4KKyAqICAgIHRoaXMgY2FzZSwgYW5kIGZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBhIGRpZmZlcmVudCBjb21wbGV0aW9uIGhhbmRsZXIKKyAqICAgIHZzIHNjc2lfZGlzcGF0Y2hfY21kLgorICogUmV0dXJuIHZhbHVlOgorICogICAgU1VDQ0VTUyBvciBGQUlMRUQgb3IgTkVFRFNfUkVUUlkKKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9zZW5kX2VoX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHNjbWQtPmRldmljZS0+aG9zdDsKKwlERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJ0biA9IFNVQ0NFU1M7CisKKwkvKgorCSAqIHdlIHdpbGwgdXNlIGEgcXVldWVkIGNvbW1hbmQgaWYgcG9zc2libGUsIG90aGVyd2lzZSB3ZSB3aWxsCisJICogZW11bGF0ZSB0aGUgcXVldWluZyBhbmQgY2FsbGluZyBvZiBjb21wbGV0aW9uIGZ1bmN0aW9uIG91cnNlbHZlcy4KKwkgKi8KKwlzY21kLT5vd25lciA9IFNDU0lfT1dORVJfTE9XTEVWRUw7CisKKwlpZiAoc2NtZC0+ZGV2aWNlLT5zY3NpX2xldmVsIDw9IFNDU0lfMikKKwkJc2NtZC0+Y21uZFsxXSA9IChzY21kLT5jbW5kWzFdICYgMHgxZikgfAorCQkJKHNjbWQtPmRldmljZS0+bHVuIDw8IDUgJiAweGUwKTsKKworCXNjc2lfYWRkX3RpbWVyKHNjbWQsIHRpbWVvdXQsIHNjc2lfZWhfdGltZXNfb3V0KTsKKworCS8qCisJICogc2V0IHVwIHRoZSBzZW1hcGhvcmUgc28gd2Ugd2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUuCisJICovCisJc2NtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3Rpb24gPSAmc2VtOworCXNjbWQtPnJlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV9sb2dfc2VuZChzY21kKTsKKwlob3N0LT5ob3N0dC0+cXVldWVjb21tYW5kKHNjbWQsIHNjc2lfZWhfZG9uZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZG93bigmc2VtKTsKKwlzY3NpX2xvZ19jb21wbGV0aW9uKHNjbWQsIFNVQ0NFU1MpOworCisJc2NtZC0+ZGV2aWNlLT5ob3N0LT5laF9hY3Rpb24gPSBOVUxMOworCisJLyoKKwkgKiBzZWUgaWYgdGltZW91dC4gIGlmIHNvLCB0ZWxsIHRoZSBob3N0IHRvIGZvcmdldCBhYm91dCBpdC4KKwkgKiBpbiBvdGhlciB3b3Jkcywgd2UgZG9uJ3Qgd2FudCBhIGNhbGxiYWNrIGFueSBtb3JlLgorCSAqLworCWlmIChzY3NpX2VoX2VmbGFnc19jaGsoc2NtZCwgU0NTSV9FSF9SRUNfVElNRU9VVCkpIHsKKwkJc2NzaV9laF9lZmxhZ3NfY2xyKHNjbWQsICBTQ1NJX0VIX1JFQ19USU1FT1VUKTsKKwkJc2NtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0xPV0xFVkVMOworCisJCS8qCisJCSAqIGFzIGZhciBhcyB0aGUgbG93IGxldmVsIGRyaXZlciBpcworCQkgKiBjb25jZXJuZWQsIHRoaXMgY29tbWFuZCBpcyBzdGlsbCBhY3RpdmUsIHNvCisJCSAqIHdlIG11c3QgZ2l2ZSB0aGUgbG93IGxldmVsIGRyaXZlciBhIGNoYW5jZQorCQkgKiB0byBhYm9ydCBpdC4gKGRiKSAKKwkJICoKKwkJICogRklYTUUoZXJpYykgLSB3ZSBhcmUgbm90IHRyYWNraW5nIHdoZXRoZXIgd2UgY291bGQKKwkJICogYWJvcnQgYSB0aW1lZCBvdXQgY29tbWFuZCBvciBub3QuICBub3Qgc3VyZSBob3cKKwkJICogd2Ugc2hvdWxkIHRyZWF0IHRoZW0gZGlmZmVyZW50bHkgYW55d2F5cy4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmIChzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9hYm9ydF9oYW5kbGVyKQorCQkJc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfYWJvcnRfaGFuZGxlcihzY21kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQkJCisJCXNjbWQtPnJlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfRE9ORTsKKwkJc2NtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0VSUk9SX0hBTkRMRVI7CisJCQkKKwkJcnRuID0gRkFJTEVEOworCX0KKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IHNjbWQ6ICVwLCBydG46JXhcbiIsCisJCQkJCSAgX19GVU5DVElPTl9fLCBzY21kLCBydG4pKTsKKworCS8qCisJICogbm93IGV4YW1pbmUgdGhlIGFjdHVhbCBzdGF0dXMgY29kZXMgdG8gc2VlIHdoZXRoZXIgdGhlIGNvbW1hbmQKKwkgKiBhY3R1YWxseSBkaWQgY29tcGxldGUgbm9ybWFsbHkuCisJICovCisJaWYgKHJ0biA9PSBTVUNDRVNTKSB7CisJCXJ0biA9IHNjc2lfZWhfY29tcGxldGVkX25vcm1hbGx5KHNjbWQpOworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLAorCQkJcHJpbnRrKCIlczogc2NzaV9laF9jb21wbGV0ZWRfbm9ybWFsbHkgJXhcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBydG4pKTsKKwkJc3dpdGNoIChydG4pIHsKKwkJY2FzZSBTVUNDRVNTOgorCQljYXNlIE5FRURTX1JFVFJZOgorCQljYXNlIEZBSUxFRDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcnRuID0gRkFJTEVEOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcnRuOworfQorCisvKioKKyAqIHNjc2lfcmVxdWVzdF9zZW5zZSAtIFJlcXVlc3Qgc2Vuc2UgZGF0YSBmcm9tIGEgcGFydGljdWxhciB0YXJnZXQuCisgKiBAc2NtZDoJU0NTSSBjbWQgZm9yIHJlcXVlc3Qgc2Vuc2UuCisgKgorICogTm90ZXM6CisgKiAgICBTb21lIGhvc3RzIGF1dG9tYXRpY2FsbHkgb2J0YWluIHRoaXMgaW5mb3JtYXRpb24sIG90aGVycyByZXF1aXJlCisgKiAgICB0aGF0IHdlIG9idGFpbiBpdCBvbiBvdXIgb3duLiBUaGlzIGZ1bmN0aW9uIHdpbGwgKm5vdCogcmV0dXJuIHVudGlsCisgKiAgICB0aGUgY29tbWFuZCBlaXRoZXIgdGltZXMgb3V0LCBvciBpdCBjb21wbGV0ZXMuCisgKiovCitzdGF0aWMgaW50IHNjc2lfcmVxdWVzdF9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGdlbmVyaWNfc2Vuc2VbNl0gPQorCXtSRVFVRVNUX1NFTlNFLCAwLCAwLCAwLCAyNTIsIDB9OworCXVuc2lnbmVkIGNoYXIgKnNjc2lfcmVzdWx0OworCWludCBzYXZlZF9yZXN1bHQ7CisJaW50IHJ0bjsKKworCW1lbWNweShzY21kLT5jbW5kLCBnZW5lcmljX3NlbnNlLCBzaXplb2YoZ2VuZXJpY19zZW5zZSkpOworCisJc2NzaV9yZXN1bHQgPSBrbWFsbG9jKDI1MiwgR0ZQX0FUT01JQyB8IChzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT51bmNoZWNrZWRfaXNhX2RtYSkgPyBfX0dGUF9ETUEgOiAwKTsKKworCisJaWYgKHVubGlrZWx5KCFzY3NpX3Jlc3VsdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGFsbG9jYXRlIHNjc2lfcmVzdWx0LlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJLyoKKwkgKiB6ZXJvIHRoZSBzZW5zZSBidWZmZXIuICBzb21lIGhvc3QgYWRhcHRlcnMgYXV0b21hdGljYWxseSBhbHdheXMKKwkgKiByZXF1ZXN0IHNlbnNlLCBzbyBpdCBpcyBub3QgYSBnb29kIGlkZWEgdGhhdAorCSAqIHNjbWQtPnJlcXVlc3RfYnVmZmVyIGFuZCBzY21kLT5zZW5zZV9idWZmZXIgcG9pbnQgdG8gdGhlIHNhbWUKKwkgKiBhZGRyZXNzIChkYikuICAwIGlzIG5vdCBhIHZhbGlkIHNlbnNlIGNvZGUuIAorCSAqLworCW1lbXNldChzY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihzY21kLT5zZW5zZV9idWZmZXIpKTsKKwltZW1zZXQoc2NzaV9yZXN1bHQsIDAsIDI1Mik7CisKKwlzYXZlZF9yZXN1bHQgPSBzY21kLT5yZXN1bHQ7CisJc2NtZC0+cmVxdWVzdF9idWZmZXIgPSBzY3NpX3Jlc3VsdDsKKwlzY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSAyNTI7CisJc2NtZC0+dXNlX3NnID0gMDsKKwlzY21kLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKHNjbWQtPmNtbmRbMF0pOworCXNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCXNjbWQtPnVuZGVyZmxvdyA9IDA7CisKKwlydG4gPSBzY3NpX3NlbmRfZWhfY21uZChzY21kLCBTRU5TRV9USU1FT1VUKTsKKworCS8qIGxhc3QgY2hhbmNlIHRvIGhhdmUgdmFsaWQgc2Vuc2UgZGF0YSAqLworCWlmKCFTQ1NJX1NFTlNFX1ZBTElEKHNjbWQpKSB7CisJCW1lbWNweShzY21kLT5zZW5zZV9idWZmZXIsIHNjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkgICAgICAgc2l6ZW9mKHNjbWQtPnNlbnNlX2J1ZmZlcikpOworCX0KKworCWtmcmVlKHNjc2lfcmVzdWx0KTsKKworCS8qCisJICogd2hlbiB3ZSBldmVudHVhbGx5IGNhbGwgc2NzaV9maW5pc2gsIHdlIHJlYWxseSB3aXNoIHRvIGNvbXBsZXRlCisJICogdGhlIG9yaWdpbmFsIHJlcXVlc3QsIHNvIGxldCdzIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGRhdGEuIChkYikKKwkgKi8KKwlzY3NpX3NldHVwX2NtZF9yZXRyeShzY21kKTsKKwlzY21kLT5yZXN1bHQgPSBzYXZlZF9yZXN1bHQ7CisJcmV0dXJuIHJ0bjsKK30KKworLyoqCisgKiBzY3NpX2VoX2ZpbmlzaF9jbWQgLSBIYW5kbGUgYSBjbWQgdGhhdCBlaCBpcyBmaW5pc2hlZCB3aXRoLgorICogQHNjbWQ6CU9yaWdpbmFsIFNDU0kgY21kIHRoYXQgZWggaGFzIGZpbmlzaGVkLgorICogQGRvbmVfcToJUXVldWUgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiBOb3RlczoKKyAqICAgIFdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBub3JtYWwgY29tbWFuZCBjb21wbGV0aW9uIHdoaWxlIHdlIGFyZSBhcmUKKyAqICAgIHN0aWxsIGhhbmRsaW5nIGVycm9ycyAtIGl0IG1heSBjYXVzZSBvdGhlciBjb21tYW5kcyB0byBiZSBxdWV1ZWQsCisgKiAgICBhbmQgdGhhdCB3b3VsZCBkaXN0dXJiIHdoYXQgd2UgYXJlIGRvaW5nLiAgdGh1cyB3ZSByZWFsbHkgd2FudCB0bworICogICAga2VlcCBhIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcyBmb3IgZmluYWwgY29tcGxldGlvbiwgYW5kIG9uY2Ugd2UKKyAqICAgIGFyZSByZWFkeSB0byBsZWF2ZSBlcnJvciBoYW5kbGluZyB3ZSBoYW5kbGUgY29tcGxldGlvbiBmb3IgcmVhbC4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfZWhfZmluaXNoX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLAorCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfZmFpbGVkLS07CisJc2NtZC0+c3RhdGUgPSBTQ1NJX1NUQVRFX0JIUVVFVUU7CisKKwlzY3NpX2VoX2VmbGFnc19jbHJfYWxsKHNjbWQpOworCisJLyoKKwkgKiBzZXQgdGhpcyBiYWNrIHNvIHRoYXQgdGhlIHVwcGVyIGxldmVsIGNhbiBjb3JyZWN0bHkgZnJlZSB1cAorCSAqIHRoaW5ncy4KKwkgKi8KKwlzY3NpX3NldHVwX2NtZF9yZXRyeShzY21kKTsKKwlsaXN0X21vdmVfdGFpbCgmc2NtZC0+ZWhfZW50cnksIGRvbmVfcSk7Cit9CisKKy8qKgorICogc2NzaV9laF9nZXRfc2Vuc2UgLSBHZXQgZGV2aWNlIHNlbnNlIGRhdGEuCisgKiBAd29ya19xOglRdWV1ZSBvZiBjb21tYW5kcyB0byBwcm9jZXNzLgorICogQGRvbmVfcToJUXVldWUgb2YgcHJvY2Nlc3NlZCBjb21tYW5kcy4uCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBTZWUgaWYgd2UgbmVlZCB0byByZXF1ZXN0IHNlbnNlIGluZm9ybWF0aW9uLiAgaWYgc28sIHRoZW4gZ2V0IGl0CisgKiAgICBub3csIHNvIHdlIGhhdmUgYSBiZXR0ZXIgaWRlYSBvZiB3aGF0IHRvIGRvLiAgCisgKgorICogTm90ZXM6CisgKiAgICBUaGlzIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3QgdGhhdCBpZiBhIHNob3N0IGFkYXB0ZXIgZG9lcworICogICAgbm90IGF1dG9tYXRpY2FsbHkgcmVxdWVzdCBzZW5zZSBpbmZvcm1hdGlvbiwgdGhhdCB3ZSBlbmQgdXAgc2h1dHRpbmcKKyAqICAgIGl0IGRvd24gYmVmb3JlIHdlIHJlcXVlc3QgaXQuCisgKgorICogICAgQWxsIGRyaXZlcnMgc2hvdWxkIHJlcXVlc3Qgc2Vuc2UgaW5mb3JtYXRpb24gaW50ZXJuYWxseSB0aGVzZSBkYXlzLAorICogICAgc28gZm9yIG5vdyBhbGwgSSBoYXZlIHRvIHNheSBpcyB0b3VnaCBub29naWVzIGlmIHlvdSBlbmQgdXAgaW4gaGVyZS4KKyAqCisgKiAgICBYWFg6IExvbmcgdGVybSB0aGlzIGNvZGUgc2hvdWxkIGdvIGF3YXksIGJ1dCB0aGF0IG5lZWRzIGFuIGF1ZGl0IG9mCisgKiAgICAgICAgIGFsbCBMTEREcyBmaXJzdC4KKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9laF9nZXRfc2Vuc2Uoc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCWludCBydG47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLCB3b3JrX3EpIHsKKwkJc2NtZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzY3NpX2NtbmQsIGVoX2VudHJ5KTsKKwkJaWYgKHNjc2lfZWhfZWZsYWdzX2NoayhzY21kLCBTQ1NJX0VIX0NBTkNFTF9DTUQpIHx8CisJCSAgICBTQ1NJX1NFTlNFX1ZBTElEKHNjbWQpKQorCQkJY29udGludWU7CisKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMiwgcHJpbnRrKCIlczogcmVxdWVzdGluZyBzZW5zZSIKKwkJCQkJCSAgIiBmb3IgaWQ6ICVkXG4iLAorCQkJCQkJICBjdXJyZW50LT5jb21tLAorCQkJCQkJICBzY21kLT5kZXZpY2UtPmlkKSk7CisJCXJ0biA9IHNjc2lfcmVxdWVzdF9zZW5zZShzY21kKTsKKwkJaWYgKHJ0biAhPSBTVUNDRVNTKQorCQkJY29udGludWU7CisKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCJzZW5zZSByZXF1ZXN0ZWQgZm9yICVwIgorCQkJCQkJICAiIHJlc3VsdCAleFxuIiwgc2NtZCwKKwkJCQkJCSAgc2NtZC0+cmVzdWx0KSk7CisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHNjc2lfcHJpbnRfc2Vuc2UoImJoIiwgc2NtZCkpOworCisJCXJ0biA9IHNjc2lfZGVjaWRlX2Rpc3Bvc2l0aW9uKHNjbWQpOworCisJCS8qCisJCSAqIGlmIHRoZSByZXN1bHQgd2FzIG5vcm1hbCwgdGhlbiBqdXN0IHBhc3MgaXQgYWxvbmcgdG8gdGhlCisJCSAqIHVwcGVyIGxldmVsLgorCQkgKi8KKwkJaWYgKHJ0biA9PSBTVUNDRVNTKQorCQkJLyogd2UgZG9uJ3Qgd2FudCB0aGlzIGNvbW1hbmQgcmVpc3N1ZWQsIGp1c3QKKwkJCSAqIGZpbmlzaGVkIHdpdGggdGhlIHNlbnNlIGRhdGEsIHNvIHNldAorCQkJICogcmV0cmllcyB0byB0aGUgbWF4IGFsbG93ZWQgdG8gZW5zdXJlIGl0CisJCQkgKiB3b24ndCBnZXQgcmVpc3N1ZWQgKi8KKwkJCXNjbWQtPnJldHJpZXMgPSBzY21kLT5hbGxvd2VkOworCQllbHNlIGlmIChydG4gIT0gTkVFRFNfUkVUUlkpCisJCQljb250aW51ZTsKKworCQlzY3NpX2VoX2ZpbmlzaF9jbWQoc2NtZCwgZG9uZV9xKTsKKwl9CisKKwlyZXR1cm4gbGlzdF9lbXB0eSh3b3JrX3EpOworfQorCisvKioKKyAqIHNjc2lfdHJ5X3RvX2Fib3J0X2NtZCAtIEFzayBob3N0IHRvIGFib3J0IGEgcnVubmluZyBjb21tYW5kLgorICogQHNjbWQ6CVNDU0kgY21kIHRvIGFib3J0IGZyb20gTG93ZXIgTGV2ZWwuCisgKgorICogTm90ZXM6CisgKiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiB1bnRpbCB0aGUgdXNlcidzIGNvbXBsZXRpb24gZnVuY3Rpb24KKyAqICAgIGhhcyBiZWVuIGNhbGxlZC4gIHRoZXJlIGlzIG5vIHRpbWVvdXQgb24gdGhpcyBvcGVyYXRpb24uICBpZiB0aGUKKyAqICAgIGF1dGhvciBvZiB0aGUgbG93LWxldmVsIGRyaXZlciB3aXNoZXMgdGhpcyBvcGVyYXRpb24gdG8gYmUgdGltZWQsCisgKiAgICB0aGV5IGNhbiBwcm92aWRlIHRoaXMgZmFjaWxpdHkgdGhlbXNlbHZlcy4gIGhlbHBlciBmdW5jdGlvbnMgaW4KKyAqICAgIHNjc2lfZXJyb3IuYyBjYW4gYmUgc3VwcGxpZWQgdG8gbWFrZSB0aGlzIGVhc2llciB0byBkby4KKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV90cnlfdG9fYWJvcnRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnRuID0gRkFJTEVEOworCisJaWYgKCFzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9hYm9ydF9oYW5kbGVyKQorCQlyZXR1cm4gcnRuOworCisJLyoKKwkgKiBzY3NpX2RvbmUgd2FzIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBjb21tYW5kIHRpbWVkIG91dCBhbmQgYmVmb3JlCisJICogd2UgaGFkIGEgY2hhbmNlIHRvIHByb2Nlc3MgaXQuIChkYikKKwkgKi8KKwlpZiAoc2NtZC0+c2VyaWFsX251bWJlciA9PSAwKQorCQlyZXR1cm4gU1VDQ0VTUzsKKworCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9MT1dMRVZFTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcnRuID0gc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfYWJvcnRfaGFuZGxlcihzY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcnRuOworfQorCisvKioKKyAqIHNjc2lfZWhfdHVyIC0gU2VuZCBUVVIgdG8gZGV2aWNlLgorICogQHNjbWQ6CVNjc2kgY21kIHRvIHNlbmQgVFVSCisgKgorICogUmV0dXJuIHZhbHVlOgorICogICAgMCAtIERldmljZSBpcyByZWFkeS4gMSAtIERldmljZSBOT1QgcmVhZHkuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfdHVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgdHVyX2NvbW1hbmRbNl0gPSB7VEVTVF9VTklUX1JFQURZLCAwLCAwLCAwLCAwLCAwfTsKKwlpbnQgcmV0cnlfY250ID0gMSwgcnRuOworCityZXRyeV90dXI6CisJbWVtY3B5KHNjbWQtPmNtbmQsIHR1cl9jb21tYW5kLCBzaXplb2YodHVyX2NvbW1hbmQpKTsKKworCS8qCisJICogemVybyB0aGUgc2Vuc2UgYnVmZmVyLiAgdGhlIHNjc2kgc3BlYyBtYW5kYXRlcyB0aGF0IGFueQorCSAqIHVudHJhbnNmZXJyZWQgc2Vuc2UgZGF0YSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgemVyby4KKwkgKi8KKwltZW1zZXQoc2NtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2Yoc2NtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwlzY21kLT5yZXF1ZXN0X2J1ZmZlciA9IE5VTEw7CisJc2NtZC0+cmVxdWVzdF9idWZmbGVuID0gMDsKKwlzY21kLT51c2Vfc2cgPSAwOworCXNjbWQtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoc2NtZC0+Y21uZFswXSk7CisJc2NtZC0+dW5kZXJmbG93ID0gMDsKKwlzY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJcnRuID0gc2NzaV9zZW5kX2VoX2NtbmQoc2NtZCwgU0VOU0VfVElNRU9VVCk7CisKKwkvKgorCSAqIHdoZW4gd2UgZXZlbnR1YWxseSBjYWxsIHNjc2lfZmluaXNoLCB3ZSByZWFsbHkgd2lzaCB0byBjb21wbGV0ZQorCSAqIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBzbyBsZXQncyByZXN0b3JlIHRoZSBvcmlnaW5hbCBkYXRhLiAoZGIpCisJICovCisJc2NzaV9zZXR1cF9jbWRfcmV0cnkoc2NtZCk7CisKKwkvKgorCSAqIGhleSwgd2UgYXJlIGRvbmUuICBsZXQncyBsb29rIHRvIHNlZSB3aGF0IGhhcHBlbmVkLgorCSAqLworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IHNjbWQgJXAgcnRuICV4XG4iLAorCQlfX0ZVTkNUSU9OX18sIHNjbWQsIHJ0bikpOworCWlmIChydG4gPT0gU1VDQ0VTUykKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocnRuID09IE5FRURTX1JFVFJZKQorCQlpZiAocmV0cnlfY250LS0pCisJCQlnb3RvIHJldHJ5X3R1cjsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBzY3NpX2VoX2Fib3J0X2NtZHMgLSBhYm9ydCBjYW5jZWxlZCBjb21tYW5kcy4KKyAqIEBzaG9zdDoJc2NzaSBob3N0IGJlaW5nIHJlY292ZXJlZC4KKyAqIEBlaF9kb25lX3E6CWxpc3RfaGVhZCBmb3IgcHJvY2Vzc2VkIGNvbW1hbmRzLgorICoKKyAqIERlY3JpcHRpb246CisgKiAgICBUcnkgYW5kIHNlZSB3aGV0aGVyIG9yIG5vdCBpdCBtYWtlcyBzZW5zZSB0byB0cnkgYW5kIGFib3J0IHRoZQorICogICAgcnVubmluZyBjb21tYW5kLiAgdGhpcyBvbmx5IHdvcmtzIG91dCB0byBiZSB0aGUgY2FzZSBpZiB3ZSBoYXZlIG9uZQorICogICAgY29tbWFuZCB0aGF0IGhhcyB0aW1lZCBvdXQuICBpZiB0aGUgY29tbWFuZCBzaW1wbHkgZmFpbGVkLCBpdCBtYWtlcworICogICAgbm8gc2Vuc2UgdG8gdHJ5IGFuZCBhYm9ydCB0aGUgY29tbWFuZCwgc2luY2UgYXMgZmFyIGFzIHRoZSBzaG9zdAorICogICAgYWRhcHRlciBpcyBjb25jZXJuZWQsIGl0IGlzbid0IHJ1bm5pbmcuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfYWJvcnRfY21kcyhzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX3EsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCWludCBydG47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLCB3b3JrX3EpIHsKKwkJc2NtZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzY3NpX2NtbmQsIGVoX2VudHJ5KTsKKwkJaWYgKCFzY3NpX2VoX2VmbGFnc19jaGsoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkKKwkJCWNvbnRpbnVlOworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBhYm9ydGluZyBjbWQ6IgorCQkJCQkJICAiMHglcFxuIiwgY3VycmVudC0+Y29tbSwKKwkJCQkJCSAgc2NtZCkpOworCQlydG4gPSBzY3NpX3RyeV90b19hYm9ydF9jbWQoc2NtZCk7CisJCWlmIChydG4gPT0gU1VDQ0VTUykgeworCQkJc2NzaV9laF9lZmxhZ3NfY2xyKHNjbWQsICBTQ1NJX0VIX0NBTkNFTF9DTUQpOworCQkJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2NtZC0+ZGV2aWNlKSB8fAorCQkJICAgICFzY3NpX2VoX3R1cihzY21kKSkgeworCQkJCXNjc2lfZWhfZmluaXNoX2NtZChzY21kLCBkb25lX3EpOworCQkJfQorCQkJCQorCQl9IGVsc2UKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IGFib3J0aW5nIgorCQkJCQkJCSAgIiBjbWQgZmFpbGVkOiIKKwkJCQkJCQkgICIweCVwXG4iLAorCQkJCQkJCSAgY3VycmVudC0+Y29tbSwKKwkJCQkJCQkgIHNjbWQpKTsKKwl9CisKKwlyZXR1cm4gbGlzdF9lbXB0eSh3b3JrX3EpOworfQorCisvKioKKyAqIHNjc2lfdHJ5X2J1c19kZXZpY2VfcmVzZXQgLSBBc2sgaG9zdCB0byBwZXJmb3JtIGEgQkRSIG9uIGEgZGV2CisgKiBAc2NtZDoJU0NTSSBjbWQgdXNlZCB0byBzZW5kIEJEUgkKKyAqCisgKiBOb3RlczoKKyAqICAgIFRoZXJlIGlzIG5vIHRpbWVvdXQgZm9yIHRoaXMgb3BlcmF0aW9uLiAgaWYgdGhpcyBvcGVyYXRpb24gaXMKKyAqICAgIHVucmVsaWFibGUgZm9yIGEgZ2l2ZW4gaG9zdCwgdGhlbiB0aGUgaG9zdCBpdHNlbGYgbmVlZHMgdG8gcHV0IGEKKyAqICAgIHRpbWVyIG9uIGl0LCBhbmQgc2V0IHRoZSBob3N0IGJhY2sgdG8gYSBjb25zaXN0ZW50IHN0YXRlIHByaW9yIHRvCisgKiAgICByZXR1cm5pbmcuCisgKiovCitzdGF0aWMgaW50IHNjc2lfdHJ5X2J1c19kZXZpY2VfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBydG4gPSBGQUlMRUQ7CisKKwlpZiAoIXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX2RldmljZV9yZXNldF9oYW5kbGVyKQorCQlyZXR1cm4gcnRuOworCisJc2NtZC0+b3duZXIgPSBTQ1NJX09XTkVSX0xPV0xFVkVMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlydG4gPSBzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcihzY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocnRuID09IFNVQ0NFU1MpIHsKKwkJc2NtZC0+ZGV2aWNlLT53YXNfcmVzZXQgPSAxOworCQlzY21kLT5kZXZpY2UtPmV4cGVjdGluZ19jY191YSA9IDE7CisJfQorCisJcmV0dXJuIHJ0bjsKK30KKworLyoqCisgKiBzY3NpX2VoX3RyeV9zdHUgLSBTZW5kIFNUQVJUX1VOSVQgdG8gZGV2aWNlLgorICogQHNjbWQ6CVNjc2kgY21kIHRvIHNlbmQgU1RBUlRfVU5JVAorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgIDAgLSBEZXZpY2UgaXMgcmVhZHkuIDEgLSBEZXZpY2UgTk9UIHJlYWR5LgorICoqLworc3RhdGljIGludCBzY3NpX2VoX3RyeV9zdHUoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBzdHVfY29tbWFuZFs2XSA9IHtTVEFSVF9TVE9QLCAwLCAwLCAwLCAxLCAwfTsKKwlpbnQgcnRuOworCisJaWYgKCFzY21kLT5kZXZpY2UtPmFsbG93X3Jlc3RhcnQpCisJCXJldHVybiAxOworCisJbWVtY3B5KHNjbWQtPmNtbmQsIHN0dV9jb21tYW5kLCBzaXplb2Yoc3R1X2NvbW1hbmQpKTsKKworCS8qCisJICogemVybyB0aGUgc2Vuc2UgYnVmZmVyLiAgdGhlIHNjc2kgc3BlYyBtYW5kYXRlcyB0aGF0IGFueQorCSAqIHVudHJhbnNmZXJyZWQgc2Vuc2UgZGF0YSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgemVyby4KKwkgKi8KKwltZW1zZXQoc2NtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2Yoc2NtZC0+c2Vuc2VfYnVmZmVyKSk7CisKKwlzY21kLT5yZXF1ZXN0X2J1ZmZlciA9IE5VTEw7CisJc2NtZC0+cmVxdWVzdF9idWZmbGVuID0gMDsKKwlzY21kLT51c2Vfc2cgPSAwOworCXNjbWQtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoc2NtZC0+Y21uZFswXSk7CisJc2NtZC0+dW5kZXJmbG93ID0gMDsKKwlzY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJcnRuID0gc2NzaV9zZW5kX2VoX2NtbmQoc2NtZCwgU1RBUlRfVU5JVF9USU1FT1VUKTsKKworCS8qCisJICogd2hlbiB3ZSBldmVudHVhbGx5IGNhbGwgc2NzaV9maW5pc2gsIHdlIHJlYWxseSB3aXNoIHRvIGNvbXBsZXRlCisJICogdGhlIG9yaWdpbmFsIHJlcXVlc3QsIHNvIGxldCdzIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGRhdGEuIChkYikKKwkgKi8KKwlzY3NpX3NldHVwX2NtZF9yZXRyeShzY21kKTsKKworCS8qCisJICogaGV5LCB3ZSBhcmUgZG9uZS4gIGxldCdzIGxvb2sgdG8gc2VlIHdoYXQgaGFwcGVuZWQuCisJICovCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogc2NtZCAlcCBydG4gJXhcbiIsCisJCV9fRlVOQ1RJT05fXywgc2NtZCwgcnRuKSk7CisJaWYgKHJ0biA9PSBTVUNDRVNTKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworIC8qKgorICogc2NzaV9laF9zdHUgLSBzZW5kIFNUQVJUX1VOSVQgaWYgbmVlZGVkCisgKiBAc2hvc3Q6CXNjc2kgaG9zdCBiZWluZyByZWNvdmVyZWQuCisgKiBAZWhfZG9uZV9xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiBOb3RlczoKKyAqICAgIElmIGNvbW1hbmRzIGFyZSBmYWlsaW5nIGR1ZSB0byBub3QgcmVhZHksIGluaXRpYWxpemluZyBjb21tYW5kIHJlcXVpcmVkLAorICoJdHJ5IHJldmFsaWRhdGluZyB0aGUgZGV2aWNlLCB3aGljaCB3aWxsIGVuZCB1cCBzZW5kaW5nIGEgc3RhcnQgdW5pdC4gCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfc3R1KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZG9uZV9xKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbGhfc2Y7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZCwgKnN0dV9zY21kOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQlzdHVfc2NtZCA9IE5VTEw7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NtZCwgd29ya19xLCBlaF9lbnRyeSkKKwkJCWlmIChzY21kLT5kZXZpY2UgPT0gc2RldiAmJiBTQ1NJX1NFTlNFX1ZBTElEKHNjbWQpICYmCisJCQkgICAgc2NzaV9jaGVja19zZW5zZShzY21kKSA9PSBGQUlMRUQgKSB7CisJCQkJc3R1X3NjbWQgPSBzY21kOworCQkJCWJyZWFrOworCQkJfQorCisJCWlmICghc3R1X3NjbWQpCisJCQljb250aW51ZTsKKworCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBTZW5kaW5nIFNUQVJUX1VOSVQgdG8gc2RldjoiCisJCQkJCQkgICIgMHglcFxuIiwgY3VycmVudC0+Y29tbSwgc2RldikpOworCisJCWlmICghc2NzaV9laF90cnlfc3R1KHN0dV9zY21kKSkgeworCQkJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2RldikgfHwKKwkJCSAgICAhc2NzaV9laF90dXIoc3R1X3NjbWQpKSB7CisJCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgd29ya19xKSB7CisJCQkJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCQkJCWlmIChzY21kLT5kZXZpY2UgPT0gc2RldikKKwkJCQkJCXNjc2lfZWhfZmluaXNoX2NtZChzY21kLCBkb25lX3EpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsCisJCQkJCQlwcmludGsoIiVzOiBTVEFSVF9VTklUIGZhaWxlZCB0byBzZGV2OiIKKwkJCQkJCSAgICAgICAiIDB4JXBcbiIsIGN1cnJlbnQtPmNvbW0sIHNkZXYpKTsKKwkJfQorCX0KKworCXJldHVybiBsaXN0X2VtcHR5KHdvcmtfcSk7Cit9CisKKworLyoqCisgKiBzY3NpX2VoX2J1c19kZXZpY2VfcmVzZXQgLSBzZW5kIGJkciBpZiBuZWVkZWQKKyAqIEBzaG9zdDoJc2NzaSBob3N0IGJlaW5nIHJlY292ZXJlZC4KKyAqIEBlaF9kb25lX3E6CWxpc3RfaGVhZCBmb3IgcHJvY2Vzc2VkIGNvbW1hbmRzLgorICoKKyAqIE5vdGVzOgorICogICAgVHJ5IGEgYnVzIGRldmljZSByZXNldC4gIHN0aWxsLCBsb29rIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgbXVsdGlwbGUKKyAqICAgIGRldmljZXMgdGhhdCBhcmUgamFtbWVkIG9yIG5vdCAtIGlmIHdlIGhhdmUgbXVsdGlwbGUgZGV2aWNlcywgaXQKKyAqICAgIG1ha2VzIG5vIHNlbnNlIHRvIHRyeSBidXNfZGV2aWNlX3Jlc2V0IC0gd2UgcmVhbGx5IHdvdWxkIG5lZWQgdG8gdHJ5CisgKiAgICBhIGJ1c19yZXNldCBpbnN0ZWFkLiAKKyAqKi8KK3N0YXRpYyBpbnQgc2NzaV9laF9idXNfZGV2aWNlX3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX3EsCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKmxoX3NmOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsICpiZHJfc2NtZDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJaW50IHJ0bjsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkgeworCQliZHJfc2NtZCA9IE5VTEw7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NtZCwgd29ya19xLCBlaF9lbnRyeSkKKwkJCWlmIChzY21kLT5kZXZpY2UgPT0gc2RldikgeworCQkJCWJkcl9zY21kID0gc2NtZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZiAoIWJkcl9zY21kKQorCQkJY29udGludWU7CisKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogU2VuZGluZyBCRFIgc2RldjoiCisJCQkJCQkgICIgMHglcFxuIiwgY3VycmVudC0+Y29tbSwKKwkJCQkJCSAgc2RldikpOworCQlydG4gPSBzY3NpX3RyeV9idXNfZGV2aWNlX3Jlc2V0KGJkcl9zY21kKTsKKwkJaWYgKHJ0biA9PSBTVUNDRVNTKSB7CisJCQlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSB8fAorCQkJICAgICFzY3NpX2VoX3R1cihiZHJfc2NtZCkpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIGxoX3NmLAorCQkJCQkJICAgd29ya19xKSB7CisJCQkJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QKKwkJCQkJCQkgIHNjc2lfY21uZCwKKwkJCQkJCQkgIGVoX2VudHJ5KTsKKwkJCQkJaWYgKHNjbWQtPmRldmljZSA9PSBzZGV2KQorCQkJCQkJc2NzaV9laF9maW5pc2hfY21kKHNjbWQsCisJCQkJCQkJCSAgIGRvbmVfcSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogQkRSIgorCQkJCQkJCSAgIiBmYWlsZWQgc2RldjoiCisJCQkJCQkJICAiMHglcFxuIiwKKwkJCQkJCQkgIGN1cnJlbnQtPmNvbW0sCisJCQkJCQkJICAgc2RldikpOworCQl9CisJfQorCisJcmV0dXJuIGxpc3RfZW1wdHkod29ya19xKTsKK30KKworLyoqCisgKiBzY3NpX3RyeV9idXNfcmVzZXQgLSBhc2sgaG9zdCB0byBwZXJmb3JtIGEgYnVzIHJlc2V0CisgKiBAc2NtZDoJU0NTSSBjbWQgdG8gc2VuZCBidXMgcmVzZXQuCisgKiovCitzdGF0aWMgaW50IHNjc2lfdHJ5X2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJ0bjsKKworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IFNuZCBCdXMgUlNUXG4iLAorCQkJCQkgIF9fRlVOQ1RJT05fXykpOworCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9MT1dMRVZFTDsKKwlzY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgPSBzY21kLT5zZXJpYWxfbnVtYmVyOworCisJaWYgKCFzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9idXNfcmVzZXRfaGFuZGxlcikKKwkJcmV0dXJuIEZBSUxFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcnRuID0gc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfYnVzX3Jlc2V0X2hhbmRsZXIoc2NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ0biA9PSBTVUNDRVNTKSB7CisJCWlmICghc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+c2tpcF9zZXR0bGVfZGVsYXkpCisJCQlzc2xlZXAoQlVTX1JFU0VUX1NFVFRMRV9USU1FKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHNjbWQtPmRldmljZS0+aG9zdCwgc2NtZC0+ZGV2aWNlLT5jaGFubmVsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBydG47Cit9CisKKy8qKgorICogc2NzaV90cnlfaG9zdF9yZXNldCAtIGFzayBob3N0IGFkYXB0ZXIgdG8gcmVzZXQgaXRzZWxmCisgKiBAc2NtZDoJU0NTSSBjbWQgdG8gc2VuZCBoc290IHJlc2V0LgorICoqLworc3RhdGljIGludCBzY3NpX3RyeV9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnRuOworCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogU25kIEhvc3QgUlNUXG4iLAorCQkJCQkgIF9fRlVOQ1RJT05fXykpOworCXNjbWQtPm93bmVyID0gU0NTSV9PV05FUl9MT1dMRVZFTDsKKwlzY21kLT5zZXJpYWxfbnVtYmVyX2F0X3RpbWVvdXQgPSBzY21kLT5zZXJpYWxfbnVtYmVyOworCisJaWYgKCFzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF9ob3N0X3Jlc2V0X2hhbmRsZXIpCisJCXJldHVybiBGQUlMRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJ0biA9IHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX2hvc3RfcmVzZXRfaGFuZGxlcihzY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocnRuID09IFNVQ0NFU1MpIHsKKwkJaWYgKCFzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5za2lwX3NldHRsZV9kZWxheSkKKwkJCXNzbGVlcChIT1NUX1JFU0VUX1NFVFRMRV9USU1FKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHNjbWQtPmRldmljZS0+aG9zdCwgc2NtZC0+ZGV2aWNlLT5jaGFubmVsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBydG47Cit9CisKKy8qKgorICogc2NzaV9laF9idXNfcmVzZXQgLSBzZW5kIGEgYnVzIHJlc2V0IAorICogQHNob3N0OglzY3NpIGhvc3QgYmVpbmcgcmVjb3ZlcmVkLgorICogQGVoX2RvbmVfcToJbGlzdF9oZWFkIGZvciBwcm9jZXNzZWQgY29tbWFuZHMuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfYnVzX3Jlc2V0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX3EsCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKmxoX3NmOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqY2hhbl9zY21kOworCXVuc2lnbmVkIGludCBjaGFubmVsOworCWludCBydG47CisKKwkvKgorCSAqIHdlIHJlYWxseSB3YW50IHRvIGxvb3Agb3ZlciB0aGUgdmFyaW91cyBjaGFubmVscywgYW5kIGRvIHRoaXMgb24KKwkgKiBhIGNoYW5uZWwgYnkgY2hhbm5lbCBiYXNpcy4gIHdlIHNob3VsZCBhbHNvIGNoZWNrIHRvIHNlZSBpZiBhbnkKKwkgKiBvZiB0aGUgZmFpbGVkIGNvbW1hbmRzIGFyZSBvbiBzb2Z0X3Jlc2V0IGRldmljZXMsIGFuZCBpZiBzbywgc2tpcAorCSAqIHRoZSByZXNldC4gIAorCSAqLworCisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7IGNoYW5uZWwrKykgeworCQljaGFuX3NjbWQgPSBOVUxMOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjbWQsIHdvcmtfcSwgZWhfZW50cnkpIHsKKwkJCWlmIChjaGFubmVsID09IHNjbWQtPmRldmljZS0+Y2hhbm5lbCkgeworCQkJCWNoYW5fc2NtZCA9IHNjbWQ7CisJCQkJYnJlYWs7CisJCQkJLyoKKwkJCQkgKiBGSVhNRSBhZGQgYmFjayBpbiBzb21lIHN1cHBvcnQgZm9yCisJCQkJICogc29mdF9yZXNldCBkZXZpY2VzLgorCQkJCSAqLworCQkJfQorCQl9CisKKwkJaWYgKCFjaGFuX3NjbWQpCisJCQljb250aW51ZTsKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogU2VuZGluZyBCUlNUIGNoYW46IgorCQkJCQkJICAiICVkXG4iLCBjdXJyZW50LT5jb21tLAorCQkJCQkJICBjaGFubmVsKSk7CisJCXJ0biA9IHNjc2lfdHJ5X2J1c19yZXNldChjaGFuX3NjbWQpOworCQlpZiAocnRuID09IFNVQ0NFU1MpIHsKKwkJCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGhfc2YsIHdvcmtfcSkgeworCQkJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLAorCQkJCQkJICBlaF9lbnRyeSk7CisJCQkJaWYgKGNoYW5uZWwgPT0gc2NtZC0+ZGV2aWNlLT5jaGFubmVsKQorCQkJCQlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzY21kLT5kZXZpY2UpIHx8CisJCQkJCSAgICAhc2NzaV9laF90dXIoc2NtZCkpCisJCQkJCQlzY3NpX2VoX2ZpbmlzaF9jbWQoc2NtZCwKKwkJCQkJCQkJICAgZG9uZV9xKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IEJSU1QiCisJCQkJCQkJICAiIGZhaWxlZCBjaGFuOiAlZFxuIiwKKwkJCQkJCQkgIGN1cnJlbnQtPmNvbW0sCisJCQkJCQkJICBjaGFubmVsKSk7CisJCX0KKwl9CisJcmV0dXJuIGxpc3RfZW1wdHkod29ya19xKTsKK30KKworLyoqCisgKiBzY3NpX2VoX2hvc3RfcmVzZXQgLSBzZW5kIGEgaG9zdCByZXNldCAKKyAqIEB3b3JrX3E6CWxpc3RfaGVhZCBmb3IgcHJvY2Vzc2VkIGNvbW1hbmRzLgorICogQGRvbmVfcToJbGlzdF9oZWFkIGZvciBwcm9jZXNzZWQgY29tbWFuZHMuCisgKiovCitzdGF0aWMgaW50IHNjc2lfZWhfaG9zdF9yZXNldChzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX3EsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJaW50IHJ0bjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKmxoX3NmOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisKKwlpZiAoIWxpc3RfZW1wdHkod29ya19xKSkgeworCQlzY21kID0gbGlzdF9lbnRyeSh3b3JrX3EtPm5leHQsCisJCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCIlczogU2VuZGluZyBIUlNUXG4iCisJCQkJCQkgICwgY3VycmVudC0+Y29tbSkpOworCisJCXJ0biA9IHNjc2lfdHJ5X2hvc3RfcmVzZXQoc2NtZCk7CisJCWlmIChydG4gPT0gU1VDQ0VTUykgeworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgd29ya19xKSB7CisJCQkJc2NtZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzY3NpX2NtbmQsIGVoX2VudHJ5KTsKKwkJCQlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzY21kLT5kZXZpY2UpIHx8CisJCQkJICAgICghc2NzaV9laF90cnlfc3R1KHNjbWQpICYmICFzY3NpX2VoX3R1cihzY21kKSkgfHwKKwkJCQkgICAgIXNjc2lfZWhfdHVyKHNjbWQpKQorCQkJCQlzY3NpX2VoX2ZpbmlzaF9jbWQoc2NtZCwgZG9uZV9xKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IEhSU1QiCisJCQkJCQkJICAiIGZhaWxlZFxuIiwKKwkJCQkJCQkgIGN1cnJlbnQtPmNvbW0pKTsKKwkJfQorCX0KKwlyZXR1cm4gbGlzdF9lbXB0eSh3b3JrX3EpOworfQorCisvKioKKyAqIHNjc2lfZWhfb2ZmbGluZV9zZGV2cyAtIG9mZmxpbmUgc2NzaSBkZXZpY2VzIHRoYXQgZmFpbCB0byByZWNvdmVyCisgKiBAd29ya19xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqIEBkb25lX3E6CWxpc3RfaGVhZCBmb3IgcHJvY2Vzc2VkIGNvbW1hbmRzLgorICoKKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfZWhfb2ZmbGluZV9zZGV2cyhzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX3EsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgd29ya19xKSB7CisJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2k6IERldmljZSBvZmZsaW5lZCAtIG5vdCIKKwkJICAgICAgIAkJIiByZWFkeSBhZnRlciBlcnJvciByZWNvdmVyeTogaG9zdCIKKwkJCQkiICVkIGNoYW5uZWwgJWQgaWQgJWQgbHVuICVkXG4iLAorCQkJCXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywKKwkJCQlzY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJc2NtZC0+ZGV2aWNlLT5pZCwKKwkJCQlzY21kLT5kZXZpY2UtPmx1bik7CisJCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzY21kLT5kZXZpY2UsIFNERVZfT0ZGTElORSk7CisJCWlmIChzY3NpX2VoX2VmbGFnc19jaGsoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkgeworCQkJLyoKKwkJCSAqIEZJWE1FOiBIYW5kbGUgbG9zdCBjbWRzLgorCQkJICovCisJCX0KKwkJc2NzaV9laF9maW5pc2hfY21kKHNjbWQsIGRvbmVfcSk7CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbiAtIERpc3Bvc2l0aW9uIGEgY21kIG9uIHJldHVybiBmcm9tIExMRC4KKyAqIEBzY21kOglTQ1NJIGNtZCB0byBleGFtaW5lLgorICoKKyAqIE5vdGVzOgorICogICAgVGhpcyBpcyAqb25seSogY2FsbGVkIHdoZW4gd2UgYXJlIGV4YW1pbmluZyB0aGUgc3RhdHVzIGFmdGVyIHNlbmRpbmcKKyAqICAgIG91dCB0aGUgYWN0dWFsIGRhdGEgY29tbWFuZC4gIGFueSBjb21tYW5kcyB0aGF0IGFyZSBxdWV1ZWQgZm9yIGVycm9yCisgKiAgICByZWNvdmVyeSAoZS5nLiB0ZXN0X3VuaXRfcmVhZHkpIGRvICpub3QqIGNvbWUgdGhyb3VnaCBoZXJlLgorICoKKyAqICAgIFdoZW4gdGhpcyByb3V0aW5lIHJldHVybnMgZmFpbGVkLCBpdCBtZWFucyB0aGUgZXJyb3IgaGFuZGxlciB0aHJlYWQKKyAqICAgIGlzIHdva2VuLiAgSW4gY2FzZXMgd2hlcmUgdGhlIGVycm9yIGNvZGUgaW5kaWNhdGVzIGFuIGVycm9yIHRoYXQKKyAqICAgIGRvZXNuJ3QgcmVxdWlyZSB0aGUgZXJyb3IgaGFuZGxlciByZWFkIChpLmUuIHdlIGRvbid0IG5lZWQgdG8KKyAqICAgIGFib3J0L3Jlc2V0KSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIFNVQ0NFU1MuCisgKiovCitpbnQgc2NzaV9kZWNpZGVfZGlzcG9zaXRpb24oc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlpbnQgcnRuOworCisJLyoKKwkgKiBpZiB0aGUgZGV2aWNlIGlzIG9mZmxpbmUsIHRoZW4gd2UgY2xlYXJseSBqdXN0IHBhc3MgdGhlIHJlc3VsdCBiYWNrCisJICogdXAgdG8gdGhlIHRvcCBsZXZlbC4KKwkgKi8KKwlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzY21kLT5kZXZpY2UpKSB7CisJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDUsIHByaW50aygiJXM6IGRldmljZSBvZmZsaW5lIC0gcmVwb3J0IgorCQkJCQkJICAiIGFzIFNVQ0NFU1NcbiIsCisJCQkJCQkgIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwkvKgorCSAqIGZpcnN0IGNoZWNrIHRoZSBob3N0IGJ5dGUsIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyBpbiB0aGVyZQorCSAqIHRoYXQgd291bGQgaW5kaWNhdGUgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCSAqLworCXN3aXRjaCAoaG9zdF9ieXRlKHNjbWQtPnJlc3VsdCkpIHsKKwljYXNlIERJRF9QQVNTVEhST1VHSDoKKwkJLyoKKwkJICogbm8gbWF0dGVyIHdoYXQsIHBhc3MgdGhpcyB0aHJvdWdoIHRvIHRoZSB1cHBlciBsYXllci4KKwkJICogbnVrZSB0aGlzIHNwZWNpYWwgY29kZSBzbyB0aGF0IGl0IGxvb2tzIGxpa2Ugd2UgYXJlIHNheWluZworCQkgKiBkaWRfb2suCisJCSAqLworCQlzY21kLT5yZXN1bHQgJj0gMHhmZjAwZmZmZjsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJY2FzZSBESURfT0s6CisJCS8qCisJCSAqIGxvb2tzIGdvb2QuICBkcm9wIHRocm91Z2gsIGFuZCBjaGVjayB0aGUgbmV4dCBieXRlLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBESURfTk9fQ09OTkVDVDoKKwljYXNlIERJRF9CQURfVEFSR0VUOgorCWNhc2UgRElEX0FCT1JUOgorCQkvKgorCQkgKiBub3RlIC0gdGhpcyBtZWFucyB0aGF0IHdlIGp1c3QgcmVwb3J0IHRoZSBzdGF0dXMgYmFjaworCQkgKiB0byB0aGUgdG9wIGxldmVsIGRyaXZlciwgbm90IHRoYXQgd2UgYWN0dWFsbHkgdGhpbmsKKwkJICogdGhhdCBpdCBpbmRpY2F0ZXMgU1VDQ0VTUy4KKwkJICovCisJCXJldHVybiBTVUNDRVNTOworCQkvKgorCQkgKiB3aGVuIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIHJldHVybnMgZGlkX3NvZnRfZXJyb3IsCisJCSAqIGl0IGlzIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIGFuIGludGVybmFsIHJldHJ5IGNvdW50ZXIgCisJCSAqIGluIG9yZGVyIHRvIGF2b2lkIGVuZGxlc3MgbG9vcHMgKGRiKQorCQkgKgorCQkgKiBhY3R1YWxseSB0aGlzIGlzIGEgYnVnIGluIHRoaXMgZnVuY3Rpb24gaGVyZS4gIHdlIHNob3VsZAorCQkgKiBiZSBtaW5kZnVsIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHNwZWNpZmllZAorCQkgKiBhbmQgbm90IGdldCBzdHVjayBpbiBhIGxvb3AuCisJCSAqLworCWNhc2UgRElEX1NPRlRfRVJST1I6CisJCWdvdG8gbWF5YmVfcmV0cnk7CisJY2FzZSBESURfSU1NX1JFVFJZOgorCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisKKwljYXNlIERJRF9FUlJPUjoKKwkJaWYgKG1zZ19ieXRlKHNjbWQtPnJlc3VsdCkgPT0gQ09NTUFORF9DT01QTEVURSAmJgorCQkgICAgc3RhdHVzX2J5dGUoc2NtZC0+cmVzdWx0KSA9PSBSRVNFUlZBVElPTl9DT05GTElDVCkKKwkJCS8qCisJCQkgKiBleGVjdXRlIHJlc2VydmF0aW9uIGNvbmZsaWN0IHByb2Nlc3NpbmcgY29kZQorCQkJICogbG93ZXIgZG93bgorCQkJICovCisJCQlicmVhazsKKwkJLyogZmFsbHRocm91Z2ggKi8KKworCWNhc2UgRElEX0JVU19CVVNZOgorCWNhc2UgRElEX1BBUklUWToKKwkJZ290byBtYXliZV9yZXRyeTsKKwljYXNlIERJRF9USU1FX09VVDoKKwkJLyoKKwkJICogd2hlbiB3ZSBzY2FuIHRoZSBidXMsIHdlIGdldCB0aW1lb3V0IG1lc3NhZ2VzIGZvcgorCQkgKiB0aGVzZSBjb21tYW5kcyBpZiB0aGVyZSBpcyBubyBkZXZpY2UgYXZhaWxhYmxlLgorCQkgKiBvdGhlciBob3N0cyByZXBvcnQgZGlkX25vX2Nvbm5lY3QgZm9yIHRoZSBzYW1lIHRoaW5nLgorCQkgKi8KKwkJaWYgKChzY21kLT5jbW5kWzBdID09IFRFU1RfVU5JVF9SRUFEWSB8fAorCQkgICAgIHNjbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSkpIHsKKwkJCXJldHVybiBTVUNDRVNTOworCQl9IGVsc2UgeworCQkJcmV0dXJuIEZBSUxFRDsKKwkJfQorCWNhc2UgRElEX1JFU0VUOgorCQlyZXR1cm4gU1VDQ0VTUzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRkFJTEVEOworCX0KKworCS8qCisJICogbmV4dCwgY2hlY2sgdGhlIG1lc3NhZ2UgYnl0ZS4KKwkgKi8KKwlpZiAobXNnX2J5dGUoc2NtZC0+cmVzdWx0KSAhPSBDT01NQU5EX0NPTVBMRVRFKQorCQlyZXR1cm4gRkFJTEVEOworCisJLyoKKwkgKiBjaGVjayB0aGUgc3RhdHVzIGJ5dGUgdG8gc2VlIGlmIHRoaXMgaW5kaWNhdGVzIGFueXRoaW5nIHNwZWNpYWwuCisJICovCisJc3dpdGNoIChzdGF0dXNfYnl0ZShzY21kLT5yZXN1bHQpKSB7CisJY2FzZSBRVUVVRV9GVUxMOgorCQkvKgorCQkgKiB0aGUgY2FzZSBvZiB0cnlpbmcgdG8gc2VuZCB0b28gbWFueSBjb21tYW5kcyB0byBhCisJCSAqIHRhZ2dlZCBxdWV1ZWluZyBkZXZpY2UuCisJCSAqLworCWNhc2UgQlVTWToKKwkJLyoKKwkJICogZGV2aWNlIGNhbid0IHRhbGsgdG8gdXMgYXQgdGhlIG1vbWVudC4gIFNob3VsZCBvbmx5CisJCSAqIG9jY3VyIChTQU0tMykgd2hlbiB0aGUgdGFzayBxdWV1ZSBpcyBlbXB0eSwgc28gd2lsbCBjYXVzZQorCQkgKiB0aGUgZW1wdHkgcXVldWUgaGFuZGxpbmcgdG8gdHJpZ2dlciBhIHN0YWxsIGluIHRoZQorCQkgKiBkZXZpY2UuCisJCSAqLworCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7CisJY2FzZSBHT09EOgorCWNhc2UgQ09NTUFORF9URVJNSU5BVEVEOgorCWNhc2UgVEFTS19BQk9SVEVEOgorCQlyZXR1cm4gU1VDQ0VTUzsKKwljYXNlIENIRUNLX0NPTkRJVElPTjoKKwkJcnRuID0gc2NzaV9jaGVja19zZW5zZShzY21kKTsKKwkJaWYgKHJ0biA9PSBORUVEU19SRVRSWSkKKwkJCWdvdG8gbWF5YmVfcmV0cnk7CisJCS8qIGlmIHJ0biA9PSBGQUlMRUQsIHdlIGhhdmUgbm8gc2Vuc2UgaW5mb3JtYXRpb247CisJCSAqIHJldHVybmluZyBGQUlMRUQgd2lsbCB3YWtlIHRoZSBlcnJvciBoYW5kbGVyIHRocmVhZAorCQkgKiB0byBjb2xsZWN0IHRoZSBzZW5zZSBhbmQgcmVkbyB0aGUgZGVjaWRlCisJCSAqIGRpc3Bvc2l0aW9uICovCisJCXJldHVybiBydG47CisJY2FzZSBDT05ESVRJT05fR09PRDoKKwljYXNlIElOVEVSTUVESUFURV9HT09EOgorCWNhc2UgSU5URVJNRURJQVRFX0NfR09PRDoKKwljYXNlIEFDQV9BQ1RJVkU6CisJCS8qCisJCSAqIHdobyBrbm93cz8gIEZJWE1FKGVyaWMpCisJCSAqLworCQlyZXR1cm4gU1VDQ0VTUzsKKworCWNhc2UgUkVTRVJWQVRJT05fQ09ORkxJQ1Q6CisJCXByaW50ayhLRVJOX0lORk8gInNjc2k6IHJlc2VydmF0aW9uIGNvbmZsaWN0OiBob3N0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVkIGNoYW5uZWwgJWQgaWQgJWQgbHVuICVkXG4iLAorCQkgICAgICAgc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLCBzY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAgICBzY21kLT5kZXZpY2UtPmlkLCBzY21kLT5kZXZpY2UtPmx1bik7CisJCXJldHVybiBTVUNDRVNTOyAvKiBjYXVzZXMgaW1tZWRpYXRlIGkvbyBlcnJvciAqLworCWRlZmF1bHQ6CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXJldHVybiBGQUlMRUQ7CisKKyAgICAgIG1heWJlX3JldHJ5OgorCisJLyogd2UgcmVxdWV1ZSBmb3IgcmV0cnkgYmVjYXVzZSB0aGUgZXJyb3Igd2FzIHJldHJ5YWJsZSwgYW5kCisJICogdGhlIHJlcXVlc3Qgd2FzIG5vdCBtYXJrZWQgZmFzdCBmYWlsLiAgTm90ZSB0aGF0IGFib3ZlLAorCSAqIGV2ZW4gaWYgdGhlIHJlcXVlc3QgaXMgbWFya2VkIGZhc3QgZmFpbCwgd2Ugc3RpbGwgcmVxdWV1ZQorCSAqIGZvciBxdWV1ZSBjb25nZXN0aW9uIGNvbmRpdGlvbnMgKFFVRVVFX0ZVTEwgb3IgQlVTWSkgKi8KKwlpZiAoKCsrc2NtZC0+cmV0cmllcykgPCBzY21kLT5hbGxvd2VkIAorCSAgICAmJiAhYmxrX25vcmV0cnlfcmVxdWVzdChzY21kLT5yZXF1ZXN0KSkgeworCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogbm8gbW9yZSByZXRyaWVzIC0gcmVwb3J0IHRoaXMgb25lIGJhY2sgdG8gdXBwZXIgbGV2ZWwuCisJCSAqLworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9Cit9CisKKy8qKgorICogc2NzaV9laF9sb2NrX2RvbmUgLSBkb25lIGZ1bmN0aW9uIGZvciBlaCBkb29yIGxvY2sgcmVxdWVzdAorICogQHNjbWQ6CVNDU0kgY29tbWFuZCBibG9jayBmb3IgdGhlIGRvb3IgbG9jayByZXF1ZXN0CisgKgorICogTm90ZXM6CisgKiAJV2UgY29tcGxldGVkIHRoZSBhc3luY2hyb25vdXMgZG9vciBsb2NrIHJlcXVlc3QsIGFuZCBpdCBoYXMgZWl0aGVyCisgKiAJbG9ja2VkIHRoZSBkb29yIG9yIGZhaWxlZC4gIFdlIG11c3QgZnJlZSB0aGUgY29tbWFuZCBzdHJ1Y3R1cmVzCisgKiAJYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfZWhfbG9ja19kb25lKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSA9IHNjbWQtPnNjX3JlcXVlc3Q7CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKK30KKworCisvKioKKyAqIHNjc2lfZWhfbG9ja19kb29yIC0gUHJldmVudCBtZWRpdW0gcmVtb3ZhbCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAqIEBzZGV2OglTQ1NJIGRldmljZSB0byBwcmV2ZW50IG1lZGl1bSByZW1vdmFsCisgKgorICogTG9ja2luZzoKKyAqIAlXZSBtdXN0IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dDsgc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KCkKKyAqIAltYXkgc2xlZXAuCisgKgorICogTm90ZXM6CisgKiAJV2UgcXVldWUgdXAgYW4gYXN5bmNocm9ub3VzICJBTExPVyBNRURJVU0gUkVNT1ZBTCIgcmVxdWVzdCBvbiB0aGUKKyAqIAloZWFkIG9mIHRoZSBkZXZpY2VzIHJlcXVlc3QgcXVldWUsIGFuZCBjb250aW51ZS4KKyAqCisgKiBCdWdzOgorICogCXNjc2lfYWxsb2NhdGVfcmVxdWVzdCgpIG1heSBzbGVlcCB3YWl0aW5nIGZvciBleGlzdGluZyByZXF1ZXN0cyB0bworICogCWJlIHByb2Nlc3NlZC4gIEhvd2V2ZXIsIHNpbmNlIHdlIGhhdmVuJ3Qga2lja2VkIG9mZiBhbnkgcmVxdWVzdAorICogCXByb2Nlc3NpbmcgZm9yIHRoaXMgaG9zdCwgdGhpcyBtYXkgZGVhZGxvY2suCisgKgorICoJSWYgc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KCkgZmFpbHMgZm9yIHdoYXQgZXZlciByZWFzb24sIHdlCisgKgljb21wbGV0ZWx5IGZvcmdldCB0byBsb2NrIHRoZSBkb29yLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9laF9sb2NrX2Rvb3Ioc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAodW5saWtlbHkoIXNyZXEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3QgYWxsb2NhdGUgZmFpbGVkLCIKKwkJICAgICAgICJwcmV2ZW50IG1lZGlhIHJlbW92YWwgY21kIG5vdCBzZW50XG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJc3JlcS0+c3JfY21uZFswXSA9IEFMTE9XX01FRElVTV9SRU1PVkFMOworCXNyZXEtPnNyX2NtbmRbMV0gPSAwOworCXNyZXEtPnNyX2NtbmRbMl0gPSAwOworCXNyZXEtPnNyX2NtbmRbM10gPSAwOworCXNyZXEtPnNyX2NtbmRbNF0gPSBTQ1NJX1JFTU9WQUxfUFJFVkVOVDsKKwlzcmVxLT5zcl9jbW5kWzVdID0gMDsKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCXNyZXEtPnNyX2J1ZmZsZW4gPSAwOworCXNyZXEtPnNyX2J1ZmZlciA9IE5VTEw7CisJc3JlcS0+c3JfYWxsb3dlZCA9IDU7CisJc3JlcS0+c3JfZG9uZSA9IHNjc2lfZWhfbG9ja19kb25lOworCXNyZXEtPnNyX3RpbWVvdXRfcGVyX2NvbW1hbmQgPSAxMCAqIEhaOworCXNyZXEtPnNyX2NtZF9sZW4gPSBDT01NQU5EX1NJWkUoc3JlcS0+c3JfY21uZFswXSk7CisKKwlzY3NpX2luc2VydF9zcGVjaWFsX3JlcShzcmVxLCAxKTsKK30KKworCisvKioKKyAqIHNjc2lfcmVzdGFydF9vcGVyYXRpb25zIC0gcmVzdGFydCBpbyBvcGVyYXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgaG9zdC4KKyAqIEBzaG9zdDoJSG9zdCB3ZSBhcmUgcmVzdGFydGluZy4KKyAqCisgKiBOb3RlczoKKyAqICAgIFdoZW4gd2UgZW50ZXJlZCB0aGUgZXJyb3IgaGFuZGxlciwgd2UgYmxvY2tlZCBhbGwgZnVydGhlciBpL28gdG8KKyAqICAgIHRoaXMgZGV2aWNlLiAgd2UgbmVlZCB0byAncmV2ZXJzZScgdGhpcyBwcm9jZXNzLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9yZXN0YXJ0X29wZXJhdGlvbnMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJLyoKKwkgKiBJZiB0aGUgZG9vciB3YXMgbG9ja2VkLCB3ZSBuZWVkIHRvIGluc2VydCBhIGRvb3IgbG9jayByZXF1ZXN0CisJICogb250byB0aGUgaGVhZCBvZiB0aGUgU0NTSSByZXF1ZXN0IHF1ZXVlIGZvciB0aGUgZGV2aWNlLiAgVGhlcmUKKwkgKiBpcyBubyBwb2ludCB0cnlpbmcgdG8gbG9jayB0aGUgZG9vciBvZiBhbiBvZmYtbGluZSBkZXZpY2UuCisJICovCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7CisJCWlmIChzY3NpX2RldmljZV9vbmxpbmUoc2RldikgJiYgc2Rldi0+bG9ja2VkKQorCQkJc2NzaV9laF9sb2NrX2Rvb3Ioc2Rldik7CisJfQorCisJLyoKKwkgKiBuZXh0IGZyZWUgdXAgYW55dGhpbmcgZGlyZWN0bHkgd2FpdGluZyB1cG9uIHRoZSBob3N0LiAgdGhpcworCSAqIHdpbGwgYmUgcmVxdWVzdHMgZm9yIGNoYXJhY3RlciBkZXZpY2Ugb3BlcmF0aW9ucywgYW5kIGFsc28gZm9yCisJICogaW9jdGxzIHRvIHF1ZXVlZCBibG9jayBkZXZpY2VzLgorCSAqLworCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IHdha2luZyB1cCBob3N0IHRvIHJlc3RhcnRcbiIsCisJCQkJCSAgX19GVU5DVElPTl9fKSk7CisKKwljbGVhcl9iaXQoU0hPU1RfUkVDT1ZFUlksICZzaG9zdC0+c2hvc3Rfc3RhdGUpOworCisJd2FrZV91cCgmc2hvc3QtPmhvc3Rfd2FpdCk7CisKKwkvKgorCSAqIGZpbmFsbHkgd2UgbmVlZCB0byByZS1pbml0aWF0ZSByZXF1ZXN0cyB0aGF0IG1heSBiZSBwZW5kaW5nLiAgd2Ugd2lsbAorCSAqIGhhdmUgaGFkIGV2ZXJ5dGhpbmcgYmxvY2tlZCB3aGlsZSBlcnJvciBoYW5kbGluZyBpcyB0YWtpbmcgcGxhY2UsIGFuZAorCSAqIG5vdyB0aGF0IGVycm9yIHJlY292ZXJ5IGlzIGRvbmUsIHdlIHdpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGVzZQorCSAqIHJlcXVlc3RzIGFyZSBzdGFydGVkLgorCSAqLworCXNjc2lfcnVuX2hvc3RfcXVldWVzKHNob3N0KTsKK30KKworLyoqCisgKiBzY3NpX2VoX3JlYWR5X2RldnMgLSBjaGVjayBkZXZpY2UgcmVhZHkgc3RhdGUgYW5kIHJlY292ZXIgaWYgbm90LgorICogQHNob3N0OiAJaG9zdCB0byBiZSByZWNvdmVyZWQuCisgKiBAZWhfZG9uZV9xOglsaXN0X2hlYWQgZm9yIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2VoX3JlYWR5X2RldnMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19xLAorCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRvbmVfcSkKK3sKKwlpZiAoIXNjc2lfZWhfc3R1KHNob3N0LCB3b3JrX3EsIGRvbmVfcSkpCisJCWlmICghc2NzaV9laF9idXNfZGV2aWNlX3Jlc2V0KHNob3N0LCB3b3JrX3EsIGRvbmVfcSkpCisJCQlpZiAoIXNjc2lfZWhfYnVzX3Jlc2V0KHNob3N0LCB3b3JrX3EsIGRvbmVfcSkpCisJCQkJaWYgKCFzY3NpX2VoX2hvc3RfcmVzZXQod29ya19xLCBkb25lX3EpKQorCQkJCQlzY3NpX2VoX29mZmxpbmVfc2RldnMod29ya19xLCBkb25lX3EpOworfQorCisvKioKKyAqIHNjc2lfZWhfZmx1c2hfZG9uZV9xIC0gZmluaXNoIHByb2Nlc3NlZCBjb21tYW5kcyBvciByZXRyeSB0aGVtLgorICogQGRvbmVfcToJbGlzdF9oZWFkIG9mIHByb2Nlc3NlZCBjb21tYW5kcy4KKyAqCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2VoX2ZsdXNoX2RvbmVfcShzdHJ1Y3QgbGlzdF9oZWFkICpkb25lX3EpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpsaF9zZjsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaF9zZiwgZG9uZV9xKSB7CisJCXNjbWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2NzaV9jbW5kLCBlaF9lbnRyeSk7CisJCWxpc3RfZGVsX2luaXQobGgpOworCQlpZiAoc2NzaV9kZXZpY2Vfb25saW5lKHNjbWQtPmRldmljZSkgJiYKKwkJICAgICFibGtfbm9yZXRyeV9yZXF1ZXN0KHNjbWQtPnJlcXVlc3QpICYmCisJCSAgICAoKytzY21kLT5yZXRyaWVzIDwgc2NtZC0+YWxsb3dlZCkpIHsKKwkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDMsIHByaW50aygiJXM6IGZsdXNoIgorCQkJCQkJCSAgIiByZXRyeSBjbWQ6ICVwXG4iLAorCQkJCQkJCSAgY3VycmVudC0+Y29tbSwKKwkJCQkJCQkgIHNjbWQpKTsKKwkJCQlzY3NpX3F1ZXVlX2luc2VydChzY21kLCBTQ1NJX01MUVVFVUVfRUhfUkVUUlkpOworCQl9IGVsc2UgeworCQkJaWYgKCFzY21kLT5yZXN1bHQpCisJCQkJc2NtZC0+cmVzdWx0IHw9IChEUklWRVJfVElNRU9VVCA8PCAyNCk7CisJCQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgzLCBwcmludGsoIiVzOiBmbHVzaCBmaW5pc2giCisJCQkJCQkJIiBjbWQ6ICVwXG4iLAorCQkJCQkJCWN1cnJlbnQtPmNvbW0sIHNjbWQpKTsKKwkJCXNjc2lfZmluaXNoX2NvbW1hbmQoc2NtZCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogc2NzaV91bmphbV9ob3N0IC0gQXR0ZW1wdCB0byBmaXggYSBob3N0IHdoaWNoIGhhcyBhIGNtZCB0aGF0IGZhaWxlZC4KKyAqIEBzaG9zdDoJSG9zdCB0byB1bmphbS4KKyAqCisgKiBOb3RlczoKKyAqICAgIFdoZW4gd2UgY29tZSBpbiBoZXJlLCB3ZSAqa25vdyogdGhhdCBhbGwgY29tbWFuZHMgb24gdGhlIGJ1cyBoYXZlCisgKiAgICBlaXRoZXIgY29tcGxldGVkLCBmYWlsZWQgb3IgdGltZWQgb3V0LiAgd2UgYWxzbyBrbm93IHRoYXQgbm8gZnVydGhlcgorICogICAgY29tbWFuZHMgYXJlIGJlaW5nIHNlbnQgdG8gdGhlIGhvc3QsIHNvIHRoaW5ncyBhcmUgcmVsYXRpdmVseSBxdWlldAorICogICAgYW5kIHdlIGhhdmUgZnJlZWRvbSB0byBmaWRkbGUgd2l0aCB0aGluZ3MgYXMgd2Ugd2lzaC4KKyAqCisgKiAgICBUaGlzIGlzIG9ubHkgdGhlICpkZWZhdWx0KiBpbXBsZW1lbnRhdGlvbi4gIGl0IGlzIHBvc3NpYmxlIGZvcgorICogICAgaW5kaXZpZHVhbCBkcml2ZXJzIHRvIHN1cHBseSB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLCBhbmQKKyAqICAgIGlmIHRoZSBtYWludGFpbmVyIHdpc2hlcyB0byBkbyB0aGlzLCBpdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdGhhdAorICogICAgdGhpcyBmdW5jdGlvbiBiZSB0YWtlbiBhcyBhIHRlbXBsYXRlIGFuZCBtb2RpZmllZC4gIHRoaXMgZnVuY3Rpb24KKyAqICAgIHdhcyBkZXNpZ25lZCB0byBjb3JyZWN0bHkgaGFuZGxlIHByb2JsZW1zIGZvciBhYm91dCA5NSUgb2YgdGhlCisgKiAgICBkaWZmZXJlbnQgY2FzZXMgb3V0IHRoZXJlLCBhbmQgaXQgc2hvdWxkIGFsd2F5cyBwcm92aWRlIGF0IGxlYXN0IGEKKyAqICAgIHJlYXNvbmFibGUgYW1vdW50IG9mIGVycm9yIHJlY292ZXJ5LgorICoKKyAqICAgIEFueSBjb21tYW5kIG1hcmtlZCAnZmFpbGVkJyBvciAndGltZW91dCcgbXVzdCBldmVudHVhbGx5IGhhdmUKKyAqICAgIHNjc2lfZmluaXNoX2NtZCgpIGNhbGxlZCBmb3IgaXQuICB3ZSBkbyBhbGwgb2YgdGhlIHJldHJ5IHN0dWZmCisgKiAgICBoZXJlLCBzbyB3aGVuIHdlIHJlc3RhcnQgdGhlIGhvc3QgYWZ0ZXIgd2UgcmV0dXJuIGl0IHNob3VsZCBoYXZlIGFuCisgKiAgICBlbXB0eSBxdWV1ZS4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfdW5qYW1faG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRChlaF93b3JrX3EpOworCUxJU1RfSEVBRChlaF9kb25lX3EpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxpc3Rfc3BsaWNlX2luaXQoJnNob3N0LT5laF9jbWRfcSwgJmVoX3dvcmtfcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSgxLCBzY3NpX2VoX3BydF9mYWlsX3N0YXRzKHNob3N0LCAmZWhfd29ya19xKSk7CisKKwlpZiAoIXNjc2lfZWhfZ2V0X3NlbnNlKCZlaF93b3JrX3EsICZlaF9kb25lX3EpKQorCQlpZiAoIXNjc2lfZWhfYWJvcnRfY21kcygmZWhfd29ya19xLCAmZWhfZG9uZV9xKSkKKwkJCXNjc2lfZWhfcmVhZHlfZGV2cyhzaG9zdCwgJmVoX3dvcmtfcSwgJmVoX2RvbmVfcSk7CisKKwlzY3NpX2VoX2ZsdXNoX2RvbmVfcSgmZWhfZG9uZV9xKTsKK30KKworLyoqCisgKiBzY3NpX2Vycm9yX2hhbmRsZXIgLSBIYW5kbGUgZXJyb3JzL3RpbWVvdXRzIG9mIFNDU0kgY21kcy4KKyAqIEBkYXRhOglIb3N0IGZvciB3aGljaCB3ZSBhcmUgcnVubmluZy4KKyAqCisgKiBOb3RlczoKKyAqICAgIFRoaXMgaXMgYWx3YXlzIHJ1biBpbiB0aGUgY29udGV4dCBvZiBhIGtlcm5lbCB0aHJlYWQuICBUaGUgaWRlYSBpcworICogICAgdGhhdCB3ZSBzdGFydCB0aGlzIHRoaW5nIHVwIHdoZW4gdGhlIGtlcm5lbCBzdGFydHMgdXAgKG9uZSBwZXIgaG9zdAorICogICAgdGhhdCB3ZSBkZXRlY3QpLCBhbmQgaXQgaW1tZWRpYXRlbHkgZ29lcyB0byBzbGVlcCBhbmQgd2FpdHMgZm9yIHNvbWUKKyAqICAgIGV2ZW50IChpLmUuIGZhaWx1cmUpLiAgV2hlbiB0aGlzIHRha2VzIHBsYWNlLCB3ZSBoYXZlIHRoZSBqb2Igb2YKKyAqICAgIHRyeWluZyB0byB1bmphbSB0aGUgYnVzIGFuZCByZXN0YXJ0aW5nIHRoaW5ncy4KKyAqKi8KK2ludCBzY3NpX2Vycm9yX2hhbmRsZXIodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopIGRhdGE7CisJaW50IHJ0bjsKKwlERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOworCisJLyoKKwkgKiAgICBGbHVzaCByZXNvdXJjZXMKKwkgKi8KKworCWRhZW1vbml6ZSgic2NzaV9laF8lZCIsIHNob3N0LT5ob3N0X25vKTsKKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJc2hvc3QtPmVoX3dhaXQgPSAmc2VtOworCXNob3N0LT5laGFuZGxlciA9IGN1cnJlbnQ7CisKKwkvKgorCSAqIFdha2UgdXAgdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdXMuCisJICovCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMywgcHJpbnRrKCJXYWtlIHVwIHBhcmVudCBvZiIKKwkJCQkJICAiIHNjc2lfZWhfJWRcbiIsc2hvc3QtPmhvc3Rfbm8pKTsKKworCWNvbXBsZXRlKHNob3N0LT5laF9ub3RpZnkpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGEgc2lnbmFsLCBpdCBtZWFucyB3ZSBhcmUgc3VwcG9zZWQgdG8gZ28KKwkJICogYXdheSBhbmQgZGllLiAgVGhpcyB0eXBpY2FsbHkgaGFwcGVucyBpZiB0aGUgdXNlciBpcworCQkgKiB0cnlpbmcgdG8gdW5sb2FkIGEgbW9kdWxlLgorCQkgKi8KKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMSwgcHJpbnRrKCJFcnJvciBoYW5kbGVyIgorCQkJCQkJICAiIHNjc2lfZWhfJWQiCisJCQkJCQkgICIgc2xlZXBpbmdcbiIsc2hvc3QtPmhvc3Rfbm8pKTsKKworCQkvKgorCQkgKiBOb3RlIC0gd2UgYWx3YXlzIHVzZSBkb3duX2ludGVycnVwdGlibGUgd2l0aCB0aGUgc2VtYXBob3JlCisJCSAqIGV2ZW4gaWYgdGhlIG1vZHVsZSB3YXMgbG9hZGVkIGFzIHBhcnQgb2YgdGhlIGtlcm5lbC4gIFRoZQorCQkgKiByZWFzb24gaXMgdGhhdCBkb3duKCkgd2lsbCBjYXVzZSB0aGlzIHRocmVhZCB0byBiZSBjb3VudGVkCisJCSAqIGluIHRoZSBsb2FkIGF2ZXJhZ2UgYXMgYSBydW5uaW5nIHByb2Nlc3MsIGFuZCBkb3duCisJCSAqIGludGVycnVwdGlibGUgZG9lc24ndC4gIEdpdmVuIHRoYXQgd2UgbmVlZCB0byBhbGxvdyB0aGlzCisJCSAqIHRocmVhZCB0byBkaWUgaWYgdGhlIGRyaXZlciB3YXMgbG9hZGVkIGFzIGEgbW9kdWxlLCB1c2luZworCQkgKiBzZW1hcGhvcmVzIGlzbid0IHVucmVhc29uYWJsZS4KKwkJICovCisJCWRvd25faW50ZXJydXB0aWJsZSgmc2VtKTsKKwkJaWYgKHNob3N0LT5laF9raWxsKQorCQkJYnJlYWs7CisKKwkJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMSwgcHJpbnRrKCJFcnJvciBoYW5kbGVyIgorCQkJCQkJICAiIHNjc2lfZWhfJWQgd2FraW5nIgorCQkJCQkJICAiIHVwXG4iLHNob3N0LT5ob3N0X25vKSk7CisKKwkJc2hvc3QtPmVoX2FjdGl2ZSA9IDE7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhIGhvc3QgdGhhdCBpcyBmYWlsaW5nIGZvciBzb21lIHJlYXNvbi4gIEZpZ3VyZSBvdXQKKwkJICogd2hhdCB3ZSBuZWVkIHRvIGRvIHRvIGdldCBpdCB1cCBhbmQgb25saW5lIGFnYWluIChpZiB3ZSBjYW4pLgorCQkgKiBJZiB3ZSBmYWlsLCB3ZSBlbmQgdXAgdGFraW5nIHRoZSB0aGluZyBvZmZsaW5lLgorCQkgKi8KKwkJaWYgKHNob3N0LT5ob3N0dC0+ZWhfc3RyYXRlZ3lfaGFuZGxlcikgCisJCQlydG4gPSBzaG9zdC0+aG9zdHQtPmVoX3N0cmF0ZWd5X2hhbmRsZXIoc2hvc3QpOworCQllbHNlCisJCQlzY3NpX3VuamFtX2hvc3Qoc2hvc3QpOworCisJCXNob3N0LT5laF9hY3RpdmUgPSAwOworCisJCS8qCisJCSAqIE5vdGUgLSBpZiB0aGUgYWJvdmUgZmFpbHMgY29tcGxldGVseSwgdGhlIGFjdGlvbiBpcyB0byB0YWtlCisJCSAqIGluZGl2aWR1YWwgZGV2aWNlcyBvZmZsaW5lIGFuZCBmbHVzaCB0aGUgcXVldWUgb2YgYW55CisJCSAqIG91dHN0YW5kaW5nIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgYmVlbiBwZW5kaW5nLiAgV2hlbiB3ZQorCQkgKiByZXN0YXJ0LCB3ZSByZXN0YXJ0IGFueSBJL08gdG8gYW55IG90aGVyIGRldmljZXMgb24gdGhlIGJ1cworCQkgKiB3aGljaCBhcmUgc3RpbGwgb25saW5lLgorCQkgKi8KKwkJc2NzaV9yZXN0YXJ0X29wZXJhdGlvbnMoc2hvc3QpOworCisJfQorCisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMSwgcHJpbnRrKCJFcnJvciBoYW5kbGVyIHNjc2lfZWhfJWQiCisJCQkJCSAgIiBleGl0aW5nXG4iLHNob3N0LT5ob3N0X25vKSk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IG5vYm9keSB0cmllcyB0byB3YWtlIHVzIHVwIGFnYWluLgorCSAqLworCXNob3N0LT5laF93YWl0ID0gTlVMTDsKKworCS8qCisJICogS25vY2sgdGhpcyBkb3duIHRvby4gIEZyb20gdGhpcyBwb2ludCBvbiwgdGhlIGhvc3QgaXMgZmx5aW5nCisJICogd2l0aG91dCBhIHBpbG90LiAgSWYgdGhpcyBpcyBiZWNhdXNlIHRoZSBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQsCisJICogdGhhdCdzIGZpbmUuICBJZiB0aGUgdXNlciBzZW50IGEgc2lnbmFsIHRvIHRoaXMgdGhpbmcsIHdlIGFyZQorCSAqIHBvdGVudGlhbGx5IGluIHJlYWwgZGFuZ2VyLgorCSAqLworCXNob3N0LT5laF9hY3RpdmUgPSAwOworCXNob3N0LT5laGFuZGxlciA9IE5VTEw7CisKKwkvKgorCSAqIElmIGFueW9uZSBpcyB3YWl0aW5nIGZvciB1cyB0byBleGl0IChpLmUuIHNvbWVvbmUgdHJ5aW5nIHRvIHVubG9hZAorCSAqIGEgZHJpdmVyKSwgdGhlbiB3YWtlIHVwIHRoYXQgcHJvY2VzcyB0byBsZXQgdGhlbSBrbm93IHdlIGFyZSBvbgorCSAqIHRoZSB3YXkgb3V0IHRoZSBkb29yLgorCSAqLworCWNvbXBsZXRlX2FuZF9leGl0KHNob3N0LT5laF9ub3RpZnksIDApOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfcmVwb3J0X2J1c19yZXNldCgpCisgKgorICogUHVycG9zZTogICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBsb3ctbGV2ZWwgZHJpdmVycyB0byByZXBvcnQgdGhhdAorICoJCXRoZXkgaGF2ZSBvYnNlcnZlZCBhIGJ1cyByZXNldCBvbiB0aGUgYnVzIGJlaW5nIGhhbmRsZWQuCisgKgorICogQXJndW1lbnRzOiAgIHNob3N0ICAgICAgIC0gSG9zdCBpbiBxdWVzdGlvbgorICoJCWNoYW5uZWwgICAgIC0gY2hhbm5lbCBvbiB3aGljaCByZXNldCB3YXMgb2JzZXJ2ZWQuCisgKgorICogUmV0dXJuczogICAgIE5vdGhpbmcKKyAqCisgKiBMb2NrIHN0YXR1czogSG9zdCBsb2NrIG11c3QgYmUgaGVsZC4KKyAqCisgKiBOb3RlczogICAgICAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiB0aGUgcmVzZXQgaXMgb25lIHdoaWNoCisgKgkJb3JpZ2luYXRlcyBmcm9tIGFuIHVua25vd24gbG9jYXRpb24uICBSZXNldHMgb3JpZ2luYXRlZAorICoJCWJ5IHRoZSBtaWQtbGV2ZWwgaXRzZWxmIGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzLCBidXQgdGhlcmUKKyAqCQlzaG91bGQgYmUgbm8gaGFybS4KKyAqCisgKgkJVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGEgQ0hFQ0tfQ09ORElUSU9OCisgKgkJaXMgcHJvcGVybHkgdHJlYXRlZC4KKyAqLwordm9pZCBzY3NpX3JlcG9ydF9idXNfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCV9fc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7CisJCWlmIChjaGFubmVsID09IHNkZXYtPmNoYW5uZWwpIHsKKwkJCXNkZXYtPndhc19yZXNldCA9IDE7CisJCQlzZGV2LT5leHBlY3RpbmdfY2NfdWEgPSAxOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlcG9ydF9idXNfcmVzZXQpOworCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfcmVwb3J0X2RldmljZV9yZXNldCgpCisgKgorICogUHVycG9zZTogICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBsb3ctbGV2ZWwgZHJpdmVycyB0byByZXBvcnQgdGhhdAorICoJCXRoZXkgaGF2ZSBvYnNlcnZlZCBhIGRldmljZSByZXNldCBvbiB0aGUgZGV2aWNlIGJlaW5nIGhhbmRsZWQuCisgKgorICogQXJndW1lbnRzOiAgIHNob3N0ICAgICAgIC0gSG9zdCBpbiBxdWVzdGlvbgorICoJCWNoYW5uZWwgICAgIC0gY2hhbm5lbCBvbiB3aGljaCByZXNldCB3YXMgb2JzZXJ2ZWQKKyAqCQl0YXJnZXQJICAgIC0gdGFyZ2V0IG9uIHdoaWNoIHJlc2V0IHdhcyBvYnNlcnZlZAorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTG9jayBzdGF0dXM6IEhvc3QgbG9jayBtdXN0IGJlIGhlbGQKKyAqCisgKiBOb3RlczogICAgICAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiB0aGUgcmVzZXQgaXMgb25lIHdoaWNoCisgKgkJb3JpZ2luYXRlcyBmcm9tIGFuIHVua25vd24gbG9jYXRpb24uICBSZXNldHMgb3JpZ2luYXRlZAorICoJCWJ5IHRoZSBtaWQtbGV2ZWwgaXRzZWxmIGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzLCBidXQgdGhlcmUKKyAqCQlzaG91bGQgYmUgbm8gaGFybS4KKyAqCisgKgkJVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGEgQ0hFQ0tfQ09ORElUSU9OCisgKgkJaXMgcHJvcGVybHkgdHJlYXRlZC4KKyAqLwordm9pZCBzY3NpX3JlcG9ydF9kZXZpY2VfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCV9fc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7CisJCWlmIChjaGFubmVsID09IHNkZXYtPmNoYW5uZWwgJiYKKwkJICAgIHRhcmdldCA9PSBzZGV2LT5pZCkgeworCQkJc2Rldi0+d2FzX3Jlc2V0ID0gMTsKKwkJCXNkZXYtPmV4cGVjdGluZ19jY191YSA9IDE7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVwb3J0X2RldmljZV9yZXNldCk7CisKK3N0YXRpYyB2b2lkCitzY3NpX3Jlc2V0X3Byb3ZpZGVyX2RvbmVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworfQorCisvKgorICogRnVuY3Rpb246CXNjc2lfcmVzZXRfcHJvdmlkZXIKKyAqCisgKiBQdXJwb3NlOglTZW5kIHJlcXVlc3RlZCByZXNldCB0byBhIGJ1cyBvciBkZXZpY2UgYXQgYW55IHBoYXNlLgorICoKKyAqIEFyZ3VtZW50czoJZGV2aWNlCS0gZGV2aWNlIHRvIHNlbmQgcmVzZXQgdG8KKyAqCQlmbGFnIC0gcmVzZXQgdHlwZSAoc2VlIHNjc2kuaCkKKyAqCisgKiBSZXR1cm5zOglTVUNDRVNTL0ZBSUxVUkUuCisgKgorICogTm90ZXM6CVRoaXMgaXMgdXNlZCBieSB0aGUgU0NTSSBHZW5lcmljIGRyaXZlciB0byBwcm92aWRlCisgKgkJQnVzL0RldmljZSByZXNldCBjYXBhYmlsaXR5LgorICovCitpbnQKK3Njc2lfcmVzZXRfcHJvdmlkZXIoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBmbGFnKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQgPSBzY3NpX2dldF9jb21tYW5kKGRldiwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHJlcXVlc3QgcmVxOworCWludCBydG47CisKKwlzY21kLT5yZXF1ZXN0ID0gJnJlcTsKKwltZW1zZXQoJnNjbWQtPmVoX3RpbWVvdXQsIDAsIHNpemVvZihzY21kLT5laF90aW1lb3V0KSk7CisJc2NtZC0+cmVxdWVzdC0+cnFfc3RhdHVzICAgICAgCT0gUlFfU0NTSV9CVVNZOworCXNjbWQtPnN0YXRlICAgICAgICAgICAgICAgICAgIAk9IFNDU0lfU1RBVEVfSU5JVElBTElaSU5HOworCXNjbWQtPm93bmVyCSAgICAgCQk9IFNDU0lfT1dORVJfTUlETEVWRUw7CisgICAgCisJbWVtc2V0KCZzY21kLT5jbW5kLCAnXDAnLCBzaXplb2Yoc2NtZC0+Y21uZCkpOworICAgIAorCXNjbWQtPnNjc2lfZG9uZQkJPSBzY3NpX3Jlc2V0X3Byb3ZpZGVyX2RvbmVfY29tbWFuZDsKKwlzY21kLT5kb25lCQkJPSBOVUxMOworCXNjbWQtPmJ1ZmZlcgkJCT0gTlVMTDsKKwlzY21kLT5idWZmbGVuCQkJPSAwOworCXNjbWQtPnJlcXVlc3RfYnVmZmVyCQk9IE5VTEw7CisJc2NtZC0+cmVxdWVzdF9idWZmbGVuCQk9IDA7CisJc2NtZC0+aW50ZXJuYWxfdGltZW91dAkJPSBOT1JNQUxfVElNRU9VVDsKKwlzY21kLT5hYm9ydF9yZWFzb24JCT0gRElEX0FCT1JUOworCisJc2NtZC0+Y21kX2xlbgkJCT0gMDsKKworCXNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uCQk9IERNQV9CSURJUkVDVElPTkFMOworCXNjbWQtPnNjX3JlcXVlc3QJCT0gTlVMTDsKKwlzY21kLT5zY19tYWdpYwkJCT0gU0NTSV9DTU5EX01BR0lDOworCisJaW5pdF90aW1lcigmc2NtZC0+ZWhfdGltZW91dCk7CisKKwkvKgorCSAqIFNvbWV0aW1lcyB0aGUgY29tbWFuZCBjYW4gZ2V0IGJhY2sgaW50byB0aGUgdGltZXIgY2hhaW4sCisJICogc28gdXNlIHRoZSBwaWQgYXMgYW4gaWRlbnRpZmllci4KKwkgKi8KKwlzY21kLT5waWQJCQk9IDA7CisKKwlzd2l0Y2ggKGZsYWcpIHsKKwljYXNlIFNDU0lfVFJZX1JFU0VUX0RFVklDRToKKwkJcnRuID0gc2NzaV90cnlfYnVzX2RldmljZV9yZXNldChzY21kKTsKKwkJaWYgKHJ0biA9PSBTVUNDRVNTKQorCQkJYnJlYWs7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBTQ1NJX1RSWV9SRVNFVF9CVVM6CisJCXJ0biA9IHNjc2lfdHJ5X2J1c19yZXNldChzY21kKTsKKwkJaWYgKHJ0biA9PSBTVUNDRVNTKQorCQkJYnJlYWs7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBTQ1NJX1RSWV9SRVNFVF9IT1NUOgorCQlydG4gPSBzY3NpX3RyeV9ob3N0X3Jlc2V0KHNjbWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydG4gPSBGQUlMRUQ7CisJfQorCisJc2NzaV9kZWxldGVfdGltZXIoc2NtZCk7CisJc2NzaV9uZXh0X2NvbW1hbmQoc2NtZCk7CisJcmV0dXJuIHJ0bjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9yZXNldF9wcm92aWRlcik7CisKKy8qKgorICogc2NzaV9ub3JtYWxpemVfc2Vuc2UgLSBub3JtYWxpemUgbWFpbiBlbGVtZW50cyBmcm9tIGVpdGhlciBmaXhlZCBvcgorICoJCQlkZXNjcmlwdG9yIHNlbnNlIGRhdGEgZm9ybWF0IGludG8gYSBjb21tb24gZm9ybWF0LgorICoKKyAqIEBzZW5zZV9idWZmZXI6CWJ5dGUgYXJyYXkgY29udGFpbmluZyBzZW5zZSBkYXRhIHJldHVybmVkIGJ5IGRldmljZQorICogQHNiX2xlbjoJCW51bWJlciBvZiB2YWxpZCBieXRlcyBpbiBzZW5zZV9idWZmZXIKKyAqIEBzc2hkcjoJCXBvaW50ZXIgdG8gaW5zdGFuY2Ugb2Ygc3RydWN0dXJlIHRoYXQgY29tbW9uCisgKgkJCWVsZW1lbnRzIGFyZSB3cml0dGVuIHRvLgorICoKKyAqIE5vdGVzOgorICoJVGhlICJtYWluIGVsZW1lbnRzIiBmcm9tIHNlbnNlIGRhdGEgYXJlOiByZXNwb25zZV9jb2RlLCBzZW5zZV9rZXksCisgKglhc2MsIGFzY3EgYW5kIGFkZGl0aW9uYWxfbGVuZ3RoIChvbmx5IGZvciBkZXNjcmlwdG9yIGZvcm1hdCkuCisgKgorICoJVHlwaWNhbGx5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhZnRlciBhIGRldmljZSBoYXMKKyAqCXJlc3BvbmRlZCB0byBhIFNDU0kgY29tbWFuZCB3aXRoIHRoZSBDSEVDS19DT05ESVRJT04gc3RhdHVzLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqCTEgaWYgdmFsaWQgc2Vuc2UgZGF0YSBpbmZvcm1hdGlvbiBmb3VuZCwgZWxzZSAwOworICoqLworaW50IHNjc2lfbm9ybWFsaXplX3NlbnNlKGNvbnN0IHU4ICpzZW5zZV9idWZmZXIsIGludCBzYl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKK3sKKwlpZiAoIXNlbnNlX2J1ZmZlciB8fCAhc2JfbGVuIHx8IChzZW5zZV9idWZmZXJbMF0gJiAweDcwKSAhPSAweDcwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldChzc2hkciwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2hkcikpOworCisJc3NoZHItPnJlc3BvbnNlX2NvZGUgPSAoc2Vuc2VfYnVmZmVyWzBdICYgMHg3Zik7CisJaWYgKHNzaGRyLT5yZXNwb25zZV9jb2RlID49IDB4NzIpIHsKKwkJLyoKKwkJICogZGVzY3JpcHRvciBmb3JtYXQKKwkJICovCisJCWlmIChzYl9sZW4gPiAxKQorCQkJc3NoZHItPnNlbnNlX2tleSA9IChzZW5zZV9idWZmZXJbMV0gJiAweGYpOworCQlpZiAoc2JfbGVuID4gMikKKwkJCXNzaGRyLT5hc2MgPSBzZW5zZV9idWZmZXJbMl07CisJCWlmIChzYl9sZW4gPiAzKQorCQkJc3NoZHItPmFzY3EgPSBzZW5zZV9idWZmZXJbM107CisJCWlmIChzYl9sZW4gPiA3KQorCQkJc3NoZHItPmFkZGl0aW9uYWxfbGVuZ3RoID0gc2Vuc2VfYnVmZmVyWzddOworCX0gZWxzZSB7CisJCS8qIAorCQkgKiBmaXhlZCBmb3JtYXQKKwkJICovCisJCWlmIChzYl9sZW4gPiAyKQorCQkJc3NoZHItPnNlbnNlX2tleSA9IChzZW5zZV9idWZmZXJbMl0gJiAweGYpOworCQlpZiAoc2JfbGVuID4gNykgeworCQkJc2JfbGVuID0gKHNiX2xlbiA8IChzZW5zZV9idWZmZXJbN10gKyA4KSkgPworCQkJCQkgc2JfbGVuIDogKHNlbnNlX2J1ZmZlcls3XSArIDgpOworCQkJaWYgKHNiX2xlbiA+IDEyKQorCQkJCXNzaGRyLT5hc2MgPSBzZW5zZV9idWZmZXJbMTJdOworCQkJaWYgKHNiX2xlbiA+IDEzKQorCQkJCXNzaGRyLT5hc2NxID0gc2Vuc2VfYnVmZmVyWzEzXTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChzY3NpX25vcm1hbGl6ZV9zZW5zZSk7CisKK2ludCBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsCisJCQkJIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpCit7CisJcmV0dXJuIHNjc2lfbm9ybWFsaXplX3NlbnNlKHNyZXEtPnNyX3NlbnNlX2J1ZmZlciwKKwkJCXNpemVvZihzcmVxLT5zcl9zZW5zZV9idWZmZXIpLCBzc2hkcik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2UpOworCitpbnQgc2NzaV9jb21tYW5kX25vcm1hbGl6ZV9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpCit7CisJcmV0dXJuIHNjc2lfbm9ybWFsaXplX3NlbnNlKGNtZC0+c2Vuc2VfYnVmZmVyLAorCQkJc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSwgc3NoZHIpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2NvbW1hbmRfbm9ybWFsaXplX3NlbnNlKTsKKworLyoqCisgKiBzY3NpX3NlbnNlX2Rlc2NfZmluZCAtIHNlYXJjaCBmb3IgYSBnaXZlbiBkZXNjcmlwdG9yIHR5cGUgaW4KKyAqCQkJZGVzY3JpcHRvciBzZW5zZSBkYXRhIGZvcm1hdC4KKyAqCisgKiBAc2Vuc2VfYnVmZmVyOglieXRlIGFycmF5IG9mIGRlc2NyaXB0b3IgZm9ybWF0IHNlbnNlIGRhdGEKKyAqIEBzYl9sZW46CQludW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gc2Vuc2VfYnVmZmVyCisgKiBAZGVzY190eXBlOgkJdmFsdWUgb2YgZGVzY3JpcHRvciB0eXBlIHRvIGZpbmQKKyAqCQkJKGUuZy4gMCAtPiBpbmZvcm1hdGlvbikKKyAqCisgKiBOb3RlczoKKyAqCW9ubHkgdmFsaWQgd2hlbiBzZW5zZSBkYXRhIGlzIGluIGRlc2NyaXB0b3IgZm9ybWF0CisgKgorICogUmV0dXJuIHZhbHVlOgorICoJcG9pbnRlciB0byBzdGFydCBvZiAoZmlyc3QpIGRlc2NyaXB0b3IgaWYgZm91bmQgZWxzZSBOVUxMCisgKiovCitjb25zdCB1OCAqIHNjc2lfc2Vuc2VfZGVzY19maW5kKGNvbnN0IHU4ICogc2Vuc2VfYnVmZmVyLCBpbnQgc2JfbGVuLAorCQkJCWludCBkZXNjX3R5cGUpCit7CisJaW50IGFkZF9zZW5fbGVuLCBhZGRfbGVuLCBkZXNjX2xlbiwgazsKKwljb25zdCB1OCAqIGRlc2NwOworCisJaWYgKChzYl9sZW4gPCA4KSB8fCAoMCA9PSAoYWRkX3Nlbl9sZW4gPSBzZW5zZV9idWZmZXJbN10pKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKChzZW5zZV9idWZmZXJbMF0gPCAweDcyKSB8fCAoc2Vuc2VfYnVmZmVyWzBdID4gMHg3MykpCisJCXJldHVybiBOVUxMOworCWFkZF9zZW5fbGVuID0gKGFkZF9zZW5fbGVuIDwgKHNiX2xlbiAtIDgpKSA/CisJCQlhZGRfc2VuX2xlbiA6IChzYl9sZW4gLSA4KTsKKwlkZXNjcCA9ICZzZW5zZV9idWZmZXJbOF07CisJZm9yIChkZXNjX2xlbiA9IDAsIGsgPSAwOyBrIDwgYWRkX3Nlbl9sZW47IGsgKz0gZGVzY19sZW4pIHsKKwkJZGVzY3AgKz0gZGVzY19sZW47CisJCWFkZF9sZW4gPSAoayA8IChhZGRfc2VuX2xlbiAtIDEpKSA/IGRlc2NwWzFdOiAtMTsKKwkJZGVzY19sZW4gPSBhZGRfbGVuICsgMjsKKwkJaWYgKGRlc2NwWzBdID09IGRlc2NfdHlwZSkKKwkJCXJldHVybiBkZXNjcDsKKwkJaWYgKGFkZF9sZW4gPCAwKSAvLyBzaG9ydCBkZXNjcmlwdG9yID8/CisJCQlicmVhazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfc2Vuc2VfZGVzY19maW5kKTsKKworLyoqCisgKiBzY3NpX2dldF9zZW5zZV9pbmZvX2ZsZCAtIGF0dGVtcHRzIHRvIGdldCBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tCisgKgkJCXNlbnNlIGRhdGEgKGVpdGhlciBmaXhlZCBvciBkZXNjcmlwdG9yIGZvcm1hdCkKKyAqCisgKiBAc2Vuc2VfYnVmZmVyOglieXRlIGFycmF5IG9mIHNlbnNlIGRhdGEKKyAqIEBzYl9sZW46CQludW1iZXIgb2YgdmFsaWQgYnl0ZXMgaW4gc2Vuc2VfYnVmZmVyCisgKiBAaW5mb19vdXQ6CQlwb2ludGVyIHRvIDY0IGludGVnZXIgd2hlcmUgOCBvciA0IGJ5dGUgaW5mb3JtYXRpb24KKyAqCQkJZmllbGQgd2lsbCBiZSBwbGFjZWQgaWYgZm91bmQuCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJMSBpZiBpbmZvcm1hdGlvbiBmaWVsZCBmb3VuZCwgMCBpZiBub3QgZm91bmQuCisgKiovCitpbnQgc2NzaV9nZXRfc2Vuc2VfaW5mb19mbGQoY29uc3QgdTggKiBzZW5zZV9idWZmZXIsIGludCBzYl9sZW4sCisJCQkgICAgdTY0ICogaW5mb19vdXQpCit7CisJaW50IGo7CisJY29uc3QgdTggKiB1Y3A7CisJdTY0IHVsbDsKKworCWlmIChzYl9sZW4gPCA3KQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKHNlbnNlX2J1ZmZlclswXSAmIDB4N2YpIHsKKwljYXNlIDB4NzA6CisJY2FzZSAweDcxOgorCQlpZiAoc2Vuc2VfYnVmZmVyWzBdICYgMHg4MCkgeworCQkJKmluZm9fb3V0ID0gKHNlbnNlX2J1ZmZlclszXSA8PCAyNCkgKworCQkJCSAgICAoc2Vuc2VfYnVmZmVyWzRdIDw8IDE2KSArCisJCQkJICAgIChzZW5zZV9idWZmZXJbNV0gPDwgOCkgKyBzZW5zZV9idWZmZXJbNl07CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMDsKKwljYXNlIDB4NzI6CisJY2FzZSAweDczOgorCQl1Y3AgPSBzY3NpX3NlbnNlX2Rlc2NfZmluZChzZW5zZV9idWZmZXIsIHNiX2xlbiwKKwkJCQkJICAgMCAvKiBpbmZvIGRlc2MgKi8pOworCQlpZiAodWNwICYmICgweGEgPT0gdWNwWzFdKSkgeworCQkJdWxsID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKwkJCQlpZiAoaiA+IDApCisJCQkJCXVsbCA8PD0gODsKKwkJCQl1bGwgfD0gdWNwWzQgKyBqXTsKKwkJCX0KKwkJCSppbmZvX291dCA9IHVsbDsKKwkJCXJldHVybiAxOworCQl9IGVsc2UKKwkJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KK0VYUE9SVF9TWU1CT0woc2NzaV9nZXRfc2Vuc2VfaW5mb19mbGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjOTcyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKQEAgLTAsMCArMSw1MTYgQEAKKy8qCisgKiBDaGFuZ2VzOgorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IDA4LzIzLzIwMDAKKyAqIC0gZ2V0IHJpZCBvZiBzb21lIHZlcmlmeV9hcmVhcyBhbmQgdXNlIF9fY29weSp1c2VyIGFuZCBfX2dldC9wdXRfdXNlcgorICogICBmb3IgdGhlIG9uZXMgdGhhdCByZW1haW4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2cuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworI2RlZmluZSBOT1JNQUxfUkVUUklFUwkJCTUKKyNkZWZpbmUgSU9DVExfTk9STUFMX1RJTUVPVVQJCQkoMTAgKiBIWikKKyNkZWZpbmUgRk9STUFUX1VOSVRfVElNRU9VVAkJKDIgKiA2MCAqIDYwICogSFopCisjZGVmaW5lIFNUQVJUX1NUT1BfVElNRU9VVAkJKDYwICogSFopCisjZGVmaW5lIE1PVkVfTUVESVVNX1RJTUVPVVQJCSg1ICogNjAgKiBIWikKKyNkZWZpbmUgUkVBRF9FTEVNRU5UX1NUQVRVU19USU1FT1VUCSg1ICogNjAgKiBIWikKKyNkZWZpbmUgUkVBRF9ERUZFQ1RfREFUQV9USU1FT1VUCSg2MCAqIEhaICkgIC8qIFpJUC0yNTAgb24gcGFyYWxsZWwgcG9ydCB0YWtlcyBhcyBsb25nISAqLworCisjZGVmaW5lIE1BWF9CVUYgUEFHRV9TSVpFCisKKy8qCisgKiBJZiB3ZSBhcmUgdG9sZCB0byBwcm9iZSBhIGhvc3QsIHdlIHdpbGwgcmV0dXJuIDAgaWYgIHRoZSBob3N0IGlzIG5vdAorICogcHJlc2VudCwgMSBpZiB0aGUgaG9zdCBpcyBwcmVzZW50LCBhbmQgd2lsbCByZXR1cm4gYW4gaWRlbnRpZnlpbmcKKyAqIHN0cmluZyBhdCAqYXJnLCBpZiBhcmcgaXMgbm9uIG51bGwsIGZpbGxpbmcgdG8gdGhlIGxlbmd0aCBzdG9yZWQgYXQKKyAqIChpbnQgKikgYXJnCisgKi8KKworc3RhdGljIGludCBpb2N0bF9wcm9iZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCB2b2lkIF9fdXNlciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGludCBsZW4sIHNsZW47CisJY29uc3QgY2hhciAqc3RyaW5nOworCWludCB0ZW1wID0gaG9zdC0+aG9zdHQtPnByZXNlbnQ7CisKKwlpZiAodGVtcCAmJiBidWZmZXIpIHsKKwkJaWYgKGdldF91c2VyKGxlbiwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYnVmZmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChob3N0LT5ob3N0dC0+aW5mbykKKwkJCXN0cmluZyA9IGhvc3QtPmhvc3R0LT5pbmZvKGhvc3QpOworCQllbHNlCisJCQlzdHJpbmcgPSBob3N0LT5ob3N0dC0+bmFtZTsKKwkJaWYgKHN0cmluZykgeworCQkJc2xlbiA9IHN0cmxlbihzdHJpbmcpOworCQkJaWYgKGxlbiA+IHNsZW4pCisJCQkJbGVuID0gc2xlbiArIDE7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgc3RyaW5nLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJldHVybiB0ZW1wOworfQorCisvKgorCisgKiBUaGUgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQgaW9jdGwgc2VuZHMgYSBjb21tYW5kIG91dCB0byB0aGUgU0NTSSBob3N0LgorICogVGhlIElPQ1RMX05PUk1BTF9USU1FT1VUIGFuZCBOT1JNQUxfUkVUUklFUyAgdmFyaWFibGVzIGFyZSB1c2VkLiAgCisgKiAKKyAqIGRldiBpcyB0aGUgU0NTSSBkZXZpY2Ugc3RydWN0IHB0ciwgKihpbnQgKikgYXJnIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgKiBpbnB1dCBkYXRhLCBpZiBhbnksIG5vdCBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgc3RyaW5nICYgY291bnRzLCAKKyAqICooKGludCAqKWFyZyArIDEpIGlzIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMuCisgKiAKKyAqICooY2hhciAqKSAoKGludCAqKSBhcmcpWzJdIHRoZSBhY3R1YWwgY29tbWFuZCBieXRlLiAgIAorICogCisgKiBOb3RlIHRoYXQgaWYgbW9yZSB0aGFuIE1BWF9CVUYgYnl0ZXMgYXJlIHJlcXVlc3RlZCB0byBiZSB0cmFuc2ZlcnJlZCwKKyAqIHRoZSBpb2N0bCB3aWxsIGZhaWwgd2l0aCBlcnJvciBFSU5WQUwuCisgKiAKKyAqIFRoaXMgc2l6ZSAqZG9lcyBub3QqIGluY2x1ZGUgdGhlIGluaXRpYWwgbGVuZ3RocyB0aGF0IHdlcmUgcGFzc2VkLgorICogCisgKiBUaGUgU0NTSSBjb21tYW5kIGlzIHJlYWQgZnJvbSB0aGUgbWVtb3J5IGxvY2F0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICogbGVuZ3RoIHdvcmRzLCBhbmQgdGhlIGlucHV0IGRhdGEgaXMgcmlnaHQgYWZ0ZXIgdGhlIGNvbW1hbmQuICBUaGUgU0NTSQorICogcm91dGluZXMga25vdyB0aGUgY29tbWFuZCBzaXplIGJhc2VkIG9uIHRoZSBvcGNvZGUgZGVjb2RlLiAgCisgKiAKKyAqIFRoZSBvdXRwdXQgYXJlYSBpcyB0aGVuIGZpbGxlZCBpbiBzdGFydGluZyBmcm9tIHRoZSBjb21tYW5kIGJ5dGUuIAorICovCisKK3N0YXRpYyBpbnQgaW9jdGxfaW50ZXJuYWxfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNoYXIgKmNtZCwKKwkJCQkgIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCWludCByZXN1bHQ7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCisJU0NTSV9MT0dfSU9DVEwoMSwgcHJpbnRrKCJUcnlpbmcgaW9jdGwgd2l0aCBzY3NpIGNvbW1hbmQgJWRcbiIsICpjbWQpKTsKKworCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcmVxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNDU0kgaW50ZXJuYWwgaW9jdGwgZmFpbGVkLCBubyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworICAgICAgICBzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgTlVMTCwgMCwgdGltZW91dCwgcmV0cmllcyk7CisKKwlTQ1NJX0xPR19JT0NUTCgyLCBwcmludGsoIklvY3RsIHJldHVybmVkICAweCV4XG4iLCBzcmVxLT5zcl9yZXN1bHQpKTsKKworCWlmICgoZHJpdmVyX2J5dGUoc3JlcS0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKKwkgICAgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkpIHsKKwkJc3dpdGNoIChzc2hkci5zZW5zZV9rZXkpIHsKKwkJY2FzZSBJTExFR0FMX1JFUVVFU1Q6CisJCQlpZiAoY21kWzBdID09IEFMTE9XX01FRElVTV9SRU1PVkFMKQorCQkJCXNkZXYtPmxvY2thYmxlID0gMDsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9JTkZPICJpb2N0bF9pbnRlcm5hbF9jb21tYW5kOiAiCisJCQkJICAgICAgICJJTExFR0FMIFJFUVVFU1QgYXNjPTB4JXggYXNjcT0weCV4XG4iLAorCQkJCSAgICAgICBzc2hkci5hc2MsIHNzaGRyLmFzY3EpOworCQkJYnJlYWs7CisJCWNhc2UgTk9UX1JFQURZOgkvKiBUaGlzIGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gZGlzYyBpbiBkcml2ZSAqLworCQkJaWYgKHNkZXYtPnJlbW92YWJsZSAmJiAoY21kWzBdICE9IFRFU1RfVU5JVF9SRUFEWSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2Ugbm90IHJlYWR5LiBNYWtlIHN1cmUiCisJCQkJICAgICAgICIgdGhlcmUgaXMgYSBkaXNjIGluIHRoZSBkcml2ZS5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFVOSVRfQVRURU5USU9OOgorCQkJaWYgKHNkZXYtPnJlbW92YWJsZSkgeworCQkJCXNkZXYtPmNoYW5nZWQgPSAxOworCQkJCXNyZXEtPnNyX3Jlc3VsdCA9IDA7CS8qIFRoaXMgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYW4gZXJyb3IgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoJLyogRmFsbCB0aHJvdWdoIGZvciBub24tcmVtb3ZhYmxlIG1lZGlhICovCisJCQlwcmludGsoS0VSTl9JTkZPICJpb2N0bF9pbnRlcm5hbF9jb21tYW5kOiA8JWQgJWQgJWQgIgorCQkJICAgICAgICIlZD4gcmV0dXJuIGNvZGUgPSAleFxuIiwKKwkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLAorCQkJICAgICAgIHNkZXYtPmNoYW5uZWwsCisJCQkgICAgICAgc2Rldi0+aWQsCisJCQkgICAgICAgc2Rldi0+bHVuLAorCQkJICAgICAgIHNyZXEtPnNyX3Jlc3VsdCk7CisJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgiICAgIiwgc3JlcSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlc3VsdCA9IHNyZXEtPnNyX3Jlc3VsdDsKKwlTQ1NJX0xPR19JT0NUTCgyLCBwcmludGsoIklPQ1RMIFJlbGVhc2luZyBjb21tYW5kXG4iKSk7CisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHNjc2lfc2V0X21lZGl1bV9yZW1vdmFsKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgY2hhciBzdGF0ZSkKK3sKKwljaGFyIHNjc2lfY21kW01BWF9DT01NQU5EX1NJWkVdOworCWludCByZXQ7CisKKwlpZiAoIXNkZXYtPnJlbW92YWJsZSB8fCAhc2Rldi0+bG9ja2FibGUpCisJICAgICAgIHJldHVybiAwOworCisJc2NzaV9jbWRbMF0gPSBBTExPV19NRURJVU1fUkVNT1ZBTDsKKwlzY3NpX2NtZFsxXSA9IDA7CisJc2NzaV9jbWRbMl0gPSAwOworCXNjc2lfY21kWzNdID0gMDsKKwlzY3NpX2NtZFs0XSA9IHN0YXRlOworCXNjc2lfY21kWzVdID0gMDsKKworCXJldCA9IGlvY3RsX2ludGVybmFsX2NvbW1hbmQoc2Rldiwgc2NzaV9jbWQsCisJCQlJT0NUTF9OT1JNQUxfVElNRU9VVCwgTk9STUFMX1JFVFJJRVMpOworCWlmIChyZXQgPT0gMCkKKwkJc2Rldi0+bG9ja2VkID0gKHN0YXRlID09IFNDU0lfUkVNT1ZBTF9QUkVWRU5UKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX3NldF9tZWRpdW1fcmVtb3ZhbCk7CisKKy8qCisgKiBUaGlzIGludGVyZmFjZSBpcyBkZXByZWNhdGVkIC0gdXNlcnMgc2hvdWxkIHVzZSB0aGUgc2NzaSBnZW5lcmljIChzZykKKyAqIGludGVyZmFjZSBpbnN0ZWFkLCBhcyB0aGlzIGlzIGEgbW9yZSBmbGV4aWJsZSBhcHByb2FjaCB0byBwZXJmb3JtaW5nCisgKiBnZW5lcmljIFNDU0kgY29tbWFuZHMgb24gYSBkZXZpY2UuCisgKgorICogVGhlIHN0cnVjdHVyZSB0aGF0IHdlIGFyZSBwYXNzZWQgc2hvdWxkIGxvb2sgbGlrZToKKyAqCisgKiBzdHJ1Y3Qgc2RhdGEgeworICogIHVuc2lnbmVkIGludCBpbmxlbjsgICAgICBbaV0gTGVuZ3RoIG9mIGRhdGEgdG8gYmUgd3JpdHRlbiB0byBkZXZpY2UgCisgKiAgdW5zaWduZWQgaW50IG91dGxlbjsgICAgIFtpXSBMZW5ndGggb2YgZGF0YSB0byBiZSByZWFkIGZyb20gZGV2aWNlIAorICogIHVuc2lnbmVkIGNoYXIgY21kW3hdOyAgICBbaV0gU0NTSSBjb21tYW5kICg2IDw9IHggPD0gMTIpLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBbb10gRGF0YSByZWFkIGZyb20gZGV2aWNlIHN0YXJ0cyBoZXJlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBbb10gT24gZXJyb3IsIHNlbnNlIGJ1ZmZlciBzdGFydHMgaGVyZS4KKyAqICB1bnNpZ25lZCBjaGFyIHdkYXRhW3ldOyAgW2ldIERhdGEgd3JpdHRlbiB0byBkZXZpY2Ugc3RhcnRzIGhlcmUuCisgKiB9OworICogTm90ZXM6CisgKiAgIC0gIFRoZSBTQ1NJIGNvbW1hbmQgbGVuZ3RoIGlzIGRldGVybWluZWQgYnkgZXhhbWluaW5nIHRoZSAxc3QgYnl0ZQorICogICAgICBvZiB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlcmUgaXMgbm8gd2F5IHRvIG92ZXJyaWRlIHRoaXMuCisgKiAgIC0gIERhdGEgdHJhbnNmZXJzIGFyZSBsaW1pdGVkIHRvIFBBR0VfU0laRSAoNEsgb24gaTM4NiwgOEsgb24gYWxwaGEpLgorICogICAtICBUaGUgbGVuZ3RoICh4ICsgeSkgbXVzdCBiZSBhdCBsZWFzdCBPTUFYX1NCX0xFTiBieXRlcyBsb25nIHRvCisgKiAgICAgIGFjY29tbW9kYXRlIHRoZSBzZW5zZSBidWZmZXIgd2hlbiBhbiBlcnJvciBvY2N1cnMuCisgKiAgICAgIFRoZSBzZW5zZSBidWZmZXIgaXMgdHJ1bmNhdGVkIHRvIE9NQVhfU0JfTEVOICgxNikgYnl0ZXMgc28gdGhhdAorICogICAgICBvbGQgY29kZSB3aWxsIG5vdCBiZSBzdXJwcmlzZWQuCisgKiAgIC0gIElmIGEgVW5peCBlcnJvciBvY2N1cnMgKGUuZy4gRU5PTUVNKSB0aGVuIHRoZSB1c2VyIHdpbGwgcmVjZWl2ZQorICogICAgICBhIG5lZ2F0aXZlIHJldHVybiBhbmQgdGhlIFVuaXggZXJyb3IgY29kZSBpbiAnZXJybm8nLiAKKyAqICAgICAgSWYgdGhlIFNDU0kgY29tbWFuZCBzdWNjZWVkcyB0aGVuIDAgaXMgcmV0dXJuZWQuCisgKiAgICAgIFBvc2l0aXZlIG51bWJlcnMgcmV0dXJuZWQgYXJlIHRoZSBjb21wYWN0ZWQgU0NTSSBlcnJvciBjb2RlcyAoNCAKKyAqICAgICAgYnl0ZXMgaW4gb25lIGludCkgd2hlcmUgdGhlIGxvd2VzdCBieXRlIGlzIHRoZSBTQ1NJIHN0YXR1cy4KKyAqICAgICAgU2VlIHRoZSBkcml2ZXJzL3Njc2kvc2NzaS5oIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcy4KKyAqCisgKi8KKyNkZWZpbmUgT01BWF9TQl9MRU4gMTYJCS8qIE9sZCBzZW5zZSBidWZmZXIgbGVuZ3RoICovCisKK2ludCBzY3NpX2lvY3RsX3NlbmRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkgICAgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKnNpYykKK3sKKwljaGFyICpidWY7CisJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJY2hhciBfX3VzZXIgKmNtZF9pbjsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOworCXVuc2lnbmVkIGludCBpbmxlbiwgb3V0bGVuLCBjbWRsZW47CisJdW5zaWduZWQgaW50IG5lZWRlZCwgYnVmX25lZWRlZDsKKwlpbnQgdGltZW91dCwgcmV0cmllcywgcmVzdWx0OworCWludCBkYXRhX2RpcmVjdGlvbiwgZ2ZwX21hc2sgPSBHRlBfS0VSTkVMOworCisJaWYgKCFzaWMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNkZXYtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKQorCQlnZnBfbWFzayB8PSBHRlBfRE1BOworCisJLyoKKwkgKiBWZXJpZnkgdGhhdCB3ZSBjYW4gcmVhZCBhdCBsZWFzdCB0aGlzIG11Y2guCisJICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNpYywgc2l6ZW9mKFNjc2lfSW9jdGxfQ29tbWFuZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmKF9fZ2V0X3VzZXIoaW5sZW4sICZzaWMtPmlubGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCWlmKF9fZ2V0X3VzZXIob3V0bGVuLCAmc2ljLT5vdXRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qCisJICogV2UgZG8gbm90IHRyYW5zZmVyIG1vcmUgdGhhbiBNQVhfQlVGIHdpdGggdGhpcyBpbnRlcmZhY2UuCisJICogSWYgdGhlIHVzZXIgbmVlZHMgdG8gdHJhbnNmZXIgbW9yZSBkYXRhIHRoYW4gdGhpcywgdGhleQorCSAqIHNob3VsZCB1c2Ugc2NzaV9nZW5lcmljcyAoc2cpIGluc3RlYWQuCisJICovCisJaWYgKGlubGVuID4gTUFYX0JVRikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG91dGxlbiA+IE1BWF9CVUYpCisJCXJldHVybiAtRUlOVkFMOworCisJY21kX2luID0gc2ljLT5kYXRhOworCWlmKGdldF91c2VyKG9wY29kZSwgY21kX2luKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwluZWVkZWQgPSBidWZfbmVlZGVkID0gKGlubGVuID4gb3V0bGVuID8gaW5sZW4gOiBvdXRsZW4pOworCWlmIChidWZfbmVlZGVkKSB7CisJCWJ1Zl9uZWVkZWQgPSAoYnVmX25lZWRlZCArIDUxMSkgJiB+NTExOworCQlpZiAoYnVmX25lZWRlZCA+IE1BWF9CVUYpCisJCQlidWZfbmVlZGVkID0gTUFYX0JVRjsKKwkJYnVmID0ga21hbGxvYyhidWZfbmVlZGVkLCBnZnBfbWFzayk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChidWYsIDAsIGJ1Zl9uZWVkZWQpOworCQlpZiAoaW5sZW4gPT0gMCkgeworCQkJZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCX0gZWxzZSBpZiAob3V0bGVuID09IDAgKSB7CisJCQlkYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQ2FuIHRoaXMgZXZlciBoYXBwZW4/CisJCQkgKi8KKwkJCWRhdGFfZGlyZWN0aW9uID0gRE1BX0JJRElSRUNUSU9OQUw7CisJCX0KKworCX0gZWxzZSB7CisJCWJ1ZiA9IE5VTEw7CisJCWRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJfQorCisJLyoKKwkgKiBPYnRhaW4gdGhlIGNvbW1hbmQgZnJvbSB0aGUgdXNlcidzIGFkZHJlc3Mgc3BhY2UuCisJICovCisJY21kbGVuID0gQ09NTUFORF9TSVpFKG9wY29kZSk7CisJCisJcmVzdWx0ID0gLUVGQVVMVDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBjbWRfaW4sIGNtZGxlbiArIGlubGVuKSkKKwkJZ290byBlcnJvcjsKKworCWlmKF9fY29weV9mcm9tX3VzZXIoY21kLCBjbWRfaW4sIGNtZGxlbikpCisJCWdvdG8gZXJyb3I7CisKKwkvKgorCSAqIE9idGFpbiB0aGUgZGF0YSB0byBiZSBzZW50IHRvIHRoZSBkZXZpY2UgKGlmIGFueSkuCisJICovCisKKwlpZihjb3B5X2Zyb21fdXNlcihidWYsIGNtZF9pbiArIGNtZGxlbiwgaW5sZW4pKQorCQlnb3RvIGVycm9yOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIFNFTkRfRElBR05PU1RJQzoKKwljYXNlIEZPUk1BVF9VTklUOgorCQl0aW1lb3V0ID0gRk9STUFUX1VOSVRfVElNRU9VVDsKKwkJcmV0cmllcyA9IDE7CisJCWJyZWFrOworCWNhc2UgU1RBUlRfU1RPUDoKKwkJdGltZW91dCA9IFNUQVJUX1NUT1BfVElNRU9VVDsKKwkJcmV0cmllcyA9IE5PUk1BTF9SRVRSSUVTOworCQlicmVhazsKKwljYXNlIE1PVkVfTUVESVVNOgorCQl0aW1lb3V0ID0gTU9WRV9NRURJVU1fVElNRU9VVDsKKwkJcmV0cmllcyA9IE5PUk1BTF9SRVRSSUVTOworCQlicmVhazsKKwljYXNlIFJFQURfRUxFTUVOVF9TVEFUVVM6CisJCXRpbWVvdXQgPSBSRUFEX0VMRU1FTlRfU1RBVFVTX1RJTUVPVVQ7CisJCXJldHJpZXMgPSBOT1JNQUxfUkVUUklFUzsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX0RFRkVDVF9EQVRBOgorCQl0aW1lb3V0ID0gUkVBRF9ERUZFQ1RfREFUQV9USU1FT1VUOworCQlyZXRyaWVzID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGltZW91dCA9IElPQ1RMX05PUk1BTF9USU1FT1VUOworCQlyZXRyaWVzID0gTk9STUFMX1JFVFJJRVM7CisJCWJyZWFrOworCX0KKworCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICghc3JlcSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5UUjsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IGRhdGFfZGlyZWN0aW9uOworICAgICAgICBzY3NpX3dhaXRfcmVxKHNyZXEsIGNtZCwgYnVmLCBuZWVkZWQsIHRpbWVvdXQsIHJldHJpZXMpOworCisJLyogCisJICogSWYgdGhlcmUgd2FzIGFuIGVycm9yIGNvbmRpdGlvbiwgcGFzcyB0aGUgaW5mbyBiYWNrIHRvIHRoZSB1c2VyLiAKKwkgKi8KKwlyZXN1bHQgPSBzcmVxLT5zcl9yZXN1bHQ7CisJaWYgKHJlc3VsdCkgeworCQlpbnQgc2JfbGVuID0gc2l6ZW9mKHNyZXEtPnNyX3NlbnNlX2J1ZmZlcik7CisKKwkJc2JfbGVuID0gKHNiX2xlbiA+IE9NQVhfU0JfTEVOKSA/IE9NQVhfU0JfTEVOIDogc2JfbGVuOworCQlpZiAoY29weV90b191c2VyKGNtZF9pbiwgc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyLCBzYl9sZW4pKQorCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlpZiAoY29weV90b191c2VyKGNtZF9pbiwgYnVmLCBvdXRsZW4pKQorCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwl9CQorCisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CitlcnJvcjoKKwlrZnJlZShidWYpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaW9jdGxfc2VuZF9jb21tYW5kKTsKKworLyoKKyAqIFRoZSBzY3NpX2lvY3RsX2dldF9wY2koKSBmdW5jdGlvbiBwbGFjZXMgaW50byBhcmcgdGhlIHZhbHVlCisgKiBwY2lfZGV2OjpzbG90X25hbWUgKDggY2hhcmFjdGVycykgZm9yIHRoZSBQQ0kgZGV2aWNlIChpZiBhbnkpLgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzCisgKiAgICAgICAgICAtRU5YSU8gaWYgdGhlcmUgaXNuJ3QgYSBQQ0kgZGV2aWNlIHBvaW50ZXIKKyAqICAgICAgICAgICAgICAgICAoY291bGQgYmUgYmVjYXVzZSB0aGUgU0NTSSBkcml2ZXIgaGFzbid0IGJlZW4KKyAqICAgICAgICAgICAgICAgICAgdXBkYXRlZCB5ZXQsIG9yIGJlY2F1c2UgaXQgaXNuJ3QgYSBTQ1NJCisgKiAgICAgICAgICAgICAgICAgIGRldmljZSkKKyAqICAgICAgICAgIGFueSBjb3B5X3RvX3VzZXIoKSBlcnJvciBvbiBmYWlsdXJlIHRoZXJlCisgKi8KK3N0YXRpYyBpbnQgc2NzaV9pb2N0bF9nZXRfcGNpKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzY3NpX2dldF9kZXZpY2Uoc2Rldi0+aG9zdCk7CisKKyAgICAgICAgaWYgKCFkZXYpCisJCXJldHVybiAtRU5YSU87CisgICAgICAgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCBkZXYtPmJ1c19pZCwgc2l6ZW9mKGRldi0+YnVzX2lkKSk/IC1FRkFVTFQ6IDA7Cit9CisKKworLyoKKyAqIHRoZSBzY3NpX2lvY3RsKCkgZnVuY3Rpb24gZGlmZmVycyBmcm9tIG1vc3QgaW9jdGxzIGluIHRoYXQgaXQgZG9lcworICogbm90IHRha2UgYSBtYWpvci9taW5vciBudW1iZXIgYXMgdGhlIGRldiBmaWVsZC4gIFJhdGhlciwgaXQgdGFrZXMKKyAqIGEgcG9pbnRlciB0byBhIHNjc2lfZGV2aWNlc1tdIGVsZW1lbnQsIGEgc3RydWN0dXJlLiAKKyAqLworaW50IHNjc2lfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWNoYXIgc2NzaV9jbWRbTUFYX0NPTU1BTkRfU0laRV07CisKKwkvKiBObyBpZGVhIGhvdyB0aGlzIGhhcHBlbnMuLi4uICovCisJaWYgKCFzZGV2KQorCQlyZXR1cm4gLUVOWElPOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBlcnJvciByZWNvdmVyeSwgZG9uJ3QgbGV0IGFueW9uZQorCSAqIGVsc2UgdHJ5IGFuZCB1c2UgdGhpcyBkZXZpY2UuICBBbHNvLCBpZiBlcnJvciByZWNvdmVyeSBmYWlscywgaXQKKwkgKiBtYXkgdHJ5IGFuZCB0YWtlIHRoZSBkZXZpY2Ugb2ZmbGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgZnVydGhlcgorCSAqIGFjY2VzcyB0byB0aGUgZGV2aWNlIGlzIHByb2hpYml0ZWQuCisJICovCisJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RldikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgZm9yIGRlcHJlY2F0ZWQgaW9jdGxzIC4uLiBhbGwgdGhlIGlvY3RscyB3aGljaCBkb24ndAorCSAqIGZvbGxvdyB0aGUgbmV3IHVuaXF1ZSBudW1iZXJpbmcgc2NoZW1lIGFyZSBkZXByZWNhdGVkICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EOgorCWNhc2UgU0NTSV9JT0NUTF9URVNUX1VOSVRfUkVBRFk6CisJY2FzZSBTQ1NJX0lPQ1RMX0JFTkNITUFSS19DT01NQU5EOgorCWNhc2UgU0NTSV9JT0NUTF9TWU5DOgorCWNhc2UgU0NTSV9JT0NUTF9TVEFSVF9VTklUOgorCWNhc2UgU0NTSV9JT0NUTF9TVE9QX1VOSVQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2dyYW0gJXMgaXMgdXNpbmcgYSBkZXByZWNhdGVkIFNDU0kgIgorCQkgICAgICAgImlvY3RsLCBwbGVhc2UgY29udmVydCBpdCB0byBTR19JT1xuIiwgY3VycmVudC0+Y29tbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9JRExVTjoKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmcsIHNpemVvZihzdHJ1Y3Qgc2NzaV9pZGx1bikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJX19wdXRfdXNlcigoc2Rldi0+aWQgJiAweGZmKQorCQkJICsgKChzZGV2LT5sdW4gJiAweGZmKSA8PCA4KQorCQkJICsgKChzZGV2LT5jaGFubmVsICYgMHhmZikgPDwgMTYpCisJCQkgKyAoKHNkZXYtPmhvc3QtPmhvc3Rfbm8gJiAweGZmKSA8PCAyNCksCisJCQkgJigoc3RydWN0IHNjc2lfaWRsdW4gX191c2VyICopYXJnKS0+ZGV2X2lkKTsKKwkJX19wdXRfdXNlcihzZGV2LT5ob3N0LT51bmlxdWVfaWQsCisJCQkgJigoc3RydWN0IHNjc2lfaWRsdW4gX191c2VyICopYXJnKS0+aG9zdF91bmlxdWVfaWQpOworCQlyZXR1cm4gMDsKKwljYXNlIFNDU0lfSU9DVExfR0VUX0JVU19OVU1CRVI6CisJCXJldHVybiBwdXRfdXNlcihzZGV2LT5ob3N0LT5ob3N0X25vLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBTQ1NJX0lPQ1RMX1BST0JFX0hPU1Q6CisJCXJldHVybiBpb2N0bF9wcm9iZShzZGV2LT5ob3N0LCBhcmcpOworCWNhc2UgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQ6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gc2NzaV9pb2N0bF9zZW5kX2NvbW1hbmQoc2RldiwgYXJnKTsKKwljYXNlIFNDU0lfSU9DVExfRE9PUkxPQ0s6CisJCXJldHVybiBzY3NpX3NldF9tZWRpdW1fcmVtb3ZhbChzZGV2LCBTQ1NJX1JFTU9WQUxfUFJFVkVOVCk7CisJY2FzZSBTQ1NJX0lPQ1RMX0RPT1JVTkxPQ0s6CisJCXJldHVybiBzY3NpX3NldF9tZWRpdW1fcmVtb3ZhbChzZGV2LCBTQ1NJX1JFTU9WQUxfQUxMT1cpOworCWNhc2UgU0NTSV9JT0NUTF9URVNUX1VOSVRfUkVBRFk6CisJCXJldHVybiBzY3NpX3Rlc3RfdW5pdF9yZWFkeShzZGV2LCBJT0NUTF9OT1JNQUxfVElNRU9VVCwKKwkJCQkJICAgIE5PUk1BTF9SRVRSSUVTKTsKKwljYXNlIFNDU0lfSU9DVExfU1RBUlRfVU5JVDoKKwkJc2NzaV9jbWRbMF0gPSBTVEFSVF9TVE9QOworCQlzY3NpX2NtZFsxXSA9IDA7CisJCXNjc2lfY21kWzJdID0gc2NzaV9jbWRbM10gPSBzY3NpX2NtZFs1XSA9IDA7CisJCXNjc2lfY21kWzRdID0gMTsKKwkJcmV0dXJuIGlvY3RsX2ludGVybmFsX2NvbW1hbmQoc2Rldiwgc2NzaV9jbWQsCisJCQkJICAgICBTVEFSVF9TVE9QX1RJTUVPVVQsIE5PUk1BTF9SRVRSSUVTKTsKKwljYXNlIFNDU0lfSU9DVExfU1RPUF9VTklUOgorCQlzY3NpX2NtZFswXSA9IFNUQVJUX1NUT1A7CisJCXNjc2lfY21kWzFdID0gMDsKKwkJc2NzaV9jbWRbMl0gPSBzY3NpX2NtZFszXSA9IHNjc2lfY21kWzVdID0gMDsKKwkJc2NzaV9jbWRbNF0gPSAwOworCQlyZXR1cm4gaW9jdGxfaW50ZXJuYWxfY29tbWFuZChzZGV2LCBzY3NpX2NtZCwKKwkJCQkgICAgIFNUQVJUX1NUT1BfVElNRU9VVCwgTk9STUFMX1JFVFJJRVMpOworICAgICAgICBjYXNlIFNDU0lfSU9DVExfR0VUX1BDSToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NzaV9pb2N0bF9nZXRfcGNpKHNkZXYsIGFyZyk7CisJZGVmYXVsdDoKKwkJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5pb2N0bCkKKwkJCXJldHVybiBzZGV2LT5ob3N0LT5ob3N0dC0+aW9jdGwoc2RldiwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9pb2N0bCk7CisKKy8qCisgKiB0aGUgc2NzaV9ub25ibG9ja19pb2N0bCgpIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIGZvciBpb2N0bHMgd2hpY2ggbWF5CisgKiBiZSBleGVjdXRlZCBldmVuIGlmIHRoZSBkZXZpY2UgaXMgaW4gcmVjb3ZlcnkuCisgKi8KK2ludCBzY3NpX25vbmJsb2NrYWJsZV9pb2N0bChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBjbWQsCisJCQkgICAgdm9pZCBfX3VzZXIgKmFyZywgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHZhbCwgcmVzdWx0OworCisJLyogVGhlIGZpcnN0IHNldCBvZiBpb2N0cyBtYXkgYmUgZXhlY3V0ZWQgZXZlbiBpZiB3ZSdyZSBkb2luZworCSAqIGVycm9yIHByb2Nlc3NpbmcsIGFzIGxvbmcgYXMgdGhlIGRldmljZSB3YXMgb3BlbmVkCisJICogbm9uLWJsb2NraW5nICovCisJaWYgKGZpbHAgJiYgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJaWYgKHRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLAorCQkJICAgICAmc2Rldi0+aG9zdC0+c2hvc3Rfc3RhdGUpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTR19TQ1NJX1JFU0VUOgorCQlyZXN1bHQgPSBnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmICh2YWwgPT0gU0dfU0NTSV9SRVNFVF9OT1RISU5HKQorCQkJcmV0dXJuIDA7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgU0dfU0NTSV9SRVNFVF9ERVZJQ0U6CisJCQl2YWwgPSBTQ1NJX1RSWV9SRVNFVF9ERVZJQ0U7CisJCQlicmVhazsKKwkJY2FzZSBTR19TQ1NJX1JFU0VUX0JVUzoKKwkJCXZhbCA9IFNDU0lfVFJZX1JFU0VUX0JVUzsKKwkJCWJyZWFrOworCQljYXNlIFNHX1NDU0lfUkVTRVRfSE9TVDoKKwkJCXZhbCA9IFNDU0lfVFJZX1JFU0VUX0hPU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gKHNjc2lfcmVzZXRfcHJvdmlkZXIoc2RldiwgdmFsKSA9PQorCQkJU1VDQ0VTUykgPyAwIDogLUVJTzsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfbm9uYmxvY2thYmxlX2lvY3RsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiYzQxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0wLDAgKzEsMjAyMyBAQAorLyoKKyAqICBzY3NpX2xpYi5jIENvcHlyaWdodCAoQykgMTk5OSBFcmljIFlvdW5nZGFsZQorICoKKyAqICBTQ1NJIHF1ZXVlaW5nIGxpYnJhcnkuCisgKiAgICAgIEluaXRpYWwgdmVyc2lvbnM6IEVyaWMgWW91bmdkYWxlIChlcmljQGFuZGFudGUub3JnKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWQgdXBvbiBjb252ZXJzYXRpb25zIHdpdGggbGFyZ2UgbnVtYmVycworICogICAgICAgICAgICAgICAgICAgICAgICBvZiBwZW9wbGUgYXQgTGludXggRXhwby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisKKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworCisjZGVmaW5lIFNHX01FTVBPT0xfTlIJCShzaXplb2Yoc2NzaV9zZ19wb29scykvc2l6ZW9mKHN0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCkpCisjZGVmaW5lIFNHX01FTVBPT0xfU0laRQkJMzIKKworc3RydWN0IHNjc2lfaG9zdF9zZ19wb29sIHsKKwlzaXplX3QJCXNpemU7CisJY2hhcgkJKm5hbWU7IAorCWttZW1fY2FjaGVfdAkqc2xhYjsKKwltZW1wb29sX3QJKnBvb2w7Cit9OworCisjaWYgKFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgPCAzMikKKyNlcnJvciBTQ1NJX01BWF9QSFlTX1NFR01FTlRTIGlzIHRvbyBzbWFsbAorI2VuZGlmCisKKyNkZWZpbmUgU1AoeCkgeyB4LCAic2dwb29sLSIgI3ggfSAKK3N0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCBzY3NpX3NnX3Bvb2xzW10gPSB7IAorCVNQKDgpLAorCVNQKDE2KSwKKwlTUCgzMiksCisjaWYgKFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgPiAzMikKKwlTUCg2NCksCisjaWYgKFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgPiA2NCkKKwlTUCgxMjgpLAorI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTID4gMTI4KQorCVNQKDI1NiksCisjaWYgKFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgPiAyNTYpCisjZXJyb3IgU0NTSV9NQVhfUEhZU19TRUdNRU5UUyBpcyB0b28gbGFyZ2UKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorfTsgCQorI3VuZGVmIFNQCisKKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX2luc2VydF9zcGVjaWFsX3JlcSgpCisgKgorICogUHVycG9zZTogICAgIEluc2VydCBwcmUtZm9ybWVkIHJlcXVlc3QgaW50byByZXF1ZXN0IHF1ZXVlLgorICoKKyAqIEFyZ3VtZW50czogICBzcmVxCS0gcmVxdWVzdCB0aGF0IGlzIHJlYWR5IHRvIGJlIHF1ZXVlZC4KKyAqICAgICAgICAgICAgICBhdF9oZWFkCS0gYm9vbGVhbi4gIFRydWUgaWYgd2Ugc2hvdWxkIGluc2VydCBhdCBoZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIHF1ZXVlLCBmYWxzZSBpZiB3ZSBzaG91bGQgaW5zZXJ0IGF0IHRhaWwuCisgKgorICogTG9jayBzdGF0dXM6IEFzc3VtZWQgdGhhdCBsb2NrIGlzIG5vdCBoZWxkIHVwb24gZW50cnkuCisgKgorICogUmV0dXJuczogICAgIE5vdGhpbmcKKyAqCisgKiBOb3RlczogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBjaGFyYWN0ZXIgZGV2aWNlIGFuZCBmcm9tCisgKiAgICAgICAgICAgICAgaW9jdGwgdHlwZXMgb2YgZnVuY3Rpb25zIHdoZXJlIHRoZSBjYWxsZXIga25vd3MgZXhhY3RseQorICogICAgICAgICAgICAgIHdoYXQgU0NTSSBjb21tYW5kIG5lZWRzIHRvIGJlIGlzc3VlZC4gICBUaGUgaWRlYSBpcyB0aGF0CisgKiAgICAgICAgICAgICAgd2UgbWVyZWx5IGluamVjdCB0aGUgY29tbWFuZCBpbnRvIHRoZSBxdWV1ZSAoYXQgdGhlIGhlYWQKKyAqICAgICAgICAgICAgICBmb3Igbm93KSwgYW5kIHRoZW4gY2FsbCB0aGUgcXVldWUgcmVxdWVzdCBmdW5jdGlvbiB0byBhY3R1YWxseQorICogICAgICAgICAgICAgIHByb2Nlc3MgaXQuCisgKi8KK2ludCBzY3NpX2luc2VydF9zcGVjaWFsX3JlcShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCBpbnQgYXRfaGVhZCkKK3sKKwkvKgorCSAqIEJlY2F1c2UgdXNlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgYXB0IHRvIHJldXNlIHJlcXVlc3RzIHdpdGggbm8KKwkgKiBtb2RpZmljYXRpb24sIHdlIGhhdmUgdG8gc2FuaXRpc2UgdGhlIHJlcXVlc3QgZmxhZ3MgaGVyZQorCSAqLworCXNyZXEtPnNyX3JlcXVlc3QtPmZsYWdzICY9IH5SRVFfRE9OVFBSRVA7CisJYmxrX2luc2VydF9yZXF1ZXN0KHNyZXEtPnNyX2RldmljZS0+cmVxdWVzdF9xdWV1ZSwgc3JlcS0+c3JfcmVxdWVzdCwKKwkJICAgICAgIAkgICBhdF9oZWFkLCBzcmVxLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3F1ZXVlX2luc2VydCgpCisgKgorICogUHVycG9zZTogICAgIEluc2VydCBhIGNvbW1hbmQgaW4gdGhlIG1pZGxldmVsIHF1ZXVlLgorICoKKyAqIEFyZ3VtZW50czogICBjbWQgICAgLSBjb21tYW5kIHRoYXQgd2UgYXJlIGFkZGluZyB0byBxdWV1ZS4KKyAqICAgICAgICAgICAgICByZWFzb24gLSB3aHkgd2UgYXJlIGluc2VydGluZyBjb21tYW5kIHRvIHF1ZXVlLgorICoKKyAqIExvY2sgc3RhdHVzOiBBc3N1bWVkIHRoYXQgbG9jayBpcyBub3QgaGVsZCB1cG9uIGVudHJ5LgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nLgorICoKKyAqIE5vdGVzOiAgICAgICBXZSBkbyB0aGlzIGZvciBvbmUgb2YgdHdvIGNhc2VzLiAgRWl0aGVyIHRoZSBob3N0IGlzIGJ1c3kKKyAqICAgICAgICAgICAgICBhbmQgaXQgY2Fubm90IGFjY2VwdCBhbnkgbW9yZSBjb21tYW5kcyBmb3IgdGhlIHRpbWUgYmVpbmcsCisgKiAgICAgICAgICAgICAgb3IgdGhlIGRldmljZSByZXR1cm5lZCBRVUVVRV9GVUxMIGFuZCBjYW4gYWNjZXB0IG5vIG1vcmUKKyAqICAgICAgICAgICAgICBjb21tYW5kcy4KKyAqIE5vdGVzOiAgICAgICBUaGlzIGNvdWxkIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dCBvciBhCisgKiAgICAgICAgICAgICAgbm9ybWFsIHByb2Nlc3MgY29udGV4dC4KKyAqLworaW50IHNjc2lfcXVldWVfaW5zZXJ0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UgPSBjbWQtPmRldmljZTsKKworCVNDU0lfTE9HX01MUVVFVUUoMSwKKwkJIHByaW50aygiSW5zZXJ0aW5nIGNvbW1hbmQgJXAgaW50byBtbHF1ZXVlXG4iLCBjbWQpKTsKKworCS8qCisJICogV2UgYXJlIGluc2VydGluZyB0aGUgY29tbWFuZCBpbnRvIHRoZSBtbCBxdWV1ZS4gIEZpcnN0LCB3ZQorCSAqIGNhbmNlbCB0aGUgdGltZXIsIHNvIGl0IGRvZXNuJ3QgdGltZSBvdXQuCisJICovCisJc2NzaV9kZWxldGVfdGltZXIoY21kKTsKKworCS8qCisJICogTmV4dCwgc2V0IHRoZSBhcHByb3ByaWF0ZSBidXN5IGJpdCBmb3IgdGhlIGRldmljZS9ob3N0LgorCSAqCisJICogSWYgdGhlIGhvc3QvZGV2aWNlIGlzbid0IGJ1c3ksIGFzc3VtZSB0aGF0IHNvbWV0aGluZyBhY3R1YWxseQorCSAqIGNvbXBsZXRlZCwgYW5kIHRoYXQgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcXVldWUgYSBjb21tYW5kIG5vdy4KKwkgKgorCSAqIE5vdGUgdGhhdCB0aGUgcHJpb3IgbWlkLWxheWVyIGFzc3VtcHRpb24gdGhhdCBhbnkgaG9zdCBjb3VsZAorCSAqIGFsd2F5cyBxdWV1ZSBhdCBsZWFzdCBvbmUgY29tbWFuZCBpcyBub3cgYnJva2VuLiAgVGhlIG1pZC1sYXllcgorCSAqIHdpbGwgaW1wbGVtZW50IGEgdXNlciBzcGVjaWZpYWJsZSBzdGFsbCAoc2VlCisJICogc2NzaV9ob3N0Lm1heF9ob3N0X2Jsb2NrZWQgYW5kIHNjc2lfZGV2aWNlLm1heF9kZXZpY2VfYmxvY2tlZCkKKwkgKiBpZiBhIGNvbW1hbmQgaXMgcmVxdWV1ZWQgd2l0aCBubyBvdGhlciBjb21tYW5kcyBvdXRzdGFuZGluZworCSAqIGVpdGhlciBmb3IgdGhlIGRldmljZSBvciBmb3IgdGhlIGhvc3QuCisJICovCisJaWYgKHJlYXNvbiA9PSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZKQorCQlob3N0LT5ob3N0X2Jsb2NrZWQgPSBob3N0LT5tYXhfaG9zdF9ibG9ja2VkOworCWVsc2UgaWYgKHJlYXNvbiA9PSBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpCisJCWRldmljZS0+ZGV2aWNlX2Jsb2NrZWQgPSBkZXZpY2UtPm1heF9kZXZpY2VfYmxvY2tlZDsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB3ZSBvd24gdGhlIHRoaW5nIGZvciBub3cuCisJICovCisJY21kLT5zdGF0ZSA9IFNDU0lfU1RBVEVfTUxRVUVVRTsKKwljbWQtPm93bmVyID0gU0NTSV9PV05FUl9NSURMRVZFTDsKKworCS8qCisJICogRGVjcmVtZW50IHRoZSBjb3VudGVycywgc2luY2UgdGhlc2UgY29tbWFuZHMgYXJlIG5vIGxvbmdlcgorCSAqIGFjdGl2ZSBvbiB0aGUgaG9zdC9kZXZpY2UuCisJICovCisJc2NzaV9kZXZpY2VfdW5idXN5KGRldmljZSk7CisKKwkvKgorCSAqIEluc2VydCB0aGlzIGNvbW1hbmQgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGZvciBpdCdzIGRldmljZS4KKwkgKiBJdCB3aWxsIGdvIGJlZm9yZSBhbGwgb3RoZXIgY29tbWFuZHMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgcXVldWUuCisJICoKKwkgKiBOT1RFOiB0aGVyZSBpcyBtYWdpYyBoZXJlIGFib3V0IHRoZSB3YXkgdGhlIHF1ZXVlIGlzIHBsdWdnZWQgaWYKKwkgKiB3ZSBoYXZlIG5vIG91dHN0YW5kaW5nIGNvbW1hbmRzLgorCSAqIAorCSAqIEFsdGhvdWdoIHRoaXMgKmRvZXNuJ3QqIHBsdWcgdGhlIHF1ZXVlLCBpdCBkb2VzIGNhbGwgdGhlIHJlcXVlc3QKKwkgKiBmdW5jdGlvbi4gIFRoZSBTQ1NJIHJlcXVlc3QgZnVuY3Rpb24gZGV0ZWN0cyB0aGUgYmxvY2tlZCBjb25kaXRpb24KKwkgKiBhbmQgcGx1Z3MgdGhlIHF1ZXVlIGFwcHJvcHJpYXRlbHkuCisJICovCisJYmxrX2luc2VydF9yZXF1ZXN0KGRldmljZS0+cmVxdWVzdF9xdWV1ZSwgY21kLT5yZXF1ZXN0LCAxLCBjbWQsIDEpOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfZG9fcmVxCisgKgorICogUHVycG9zZTogICAgIFF1ZXVlIGEgU0NTSSByZXF1ZXN0CisgKgorICogQXJndW1lbnRzOiAgIHNyZXEJICAtIGNvbW1hbmQgZGVzY3JpcHRvci4KKyAqICAgICAgICAgICAgICBjbW5kICAgICAgLSBhY3R1YWwgU0NTSSBjb21tYW5kIHRvIGJlIHBlcmZvcm1lZC4KKyAqICAgICAgICAgICAgICBidWZmZXIgICAgLSBkYXRhIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICBidWZmbGVuICAgLSBzaXplIG9mIGRhdGEgYnVmZmVyLgorICogICAgICAgICAgICAgIGRvbmUgICAgICAtIGNvbXBsZXRpb24gZnVuY3Rpb24gdG8gYmUgcnVuLgorICogICAgICAgICAgICAgIHRpbWVvdXQgICAtIGhvdyBsb25nIHRvIGxldCBpdCBydW4gYmVmb3JlIHRpbWVvdXQuCisgKiAgICAgICAgICAgICAgcmV0cmllcyAgIC0gbnVtYmVyIG9mIHJldHJpZXMgd2UgYWxsb3cuCisgKgorICogTG9jayBzdGF0dXM6IE5vIGxvY2tzIGhlbGQgdXBvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZy4KKyAqCisgKiBOb3RlczoJVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIHF1ZXVlaW5nIHJlcXVlc3RzIGZvciB0aGluZ3MKKyAqCQlsaWtlIGlvY3RscyBhbmQgY2hhcmFjdGVyIGRldmljZSByZXF1ZXN0cyAtIHRoaXMgaXMgYmVjYXVzZQorICoJCXdlIGVzc2VudGlhbGx5IGp1c3QgaW5qZWN0IGEgcmVxdWVzdCBpbnRvIHRoZSBxdWV1ZSBmb3IgdGhlCisgKgkJZGV2aWNlLgorICoKKyAqCQlJbiBvcmRlciB0byBzdXBwb3J0IHRoZSBzY3NpX2RldmljZV9xdWllc2NlIGZ1bmN0aW9uLCB3ZQorICoJCW5vdyBpbmplY3QgcmVxdWVzdHMgb24gdGhlICpoZWFkKiBvZiB0aGUgZGV2aWNlIHF1ZXVlCisgKgkJcmF0aGVyIHRoYW4gdGhlIHRhaWwuCisgKi8KK3ZvaWQgc2NzaV9kb19yZXEoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgY29uc3Qgdm9pZCAqY21uZCwKKwkJIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwKKwkJIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAorCQkgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQoreworCS8qCisJICogSWYgdGhlIHVwcGVyIGxldmVsIGRyaXZlciBpcyByZXVzaW5nIHRoZXNlIHRoaW5ncywgdGhlbgorCSAqIHdlIHNob3VsZCByZWxlYXNlIHRoZSBsb3ctbGV2ZWwgYmxvY2sgbm93LiAgQW5vdGhlciBvbmUgd2lsbAorCSAqIGJlIGFsbG9jYXRlZCBsYXRlciB3aGVuIHRoaXMgcmVxdWVzdCBpcyBnZXR0aW5nIHF1ZXVlZC4KKwkgKi8KKwlfX3Njc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCisJLyoKKwkgKiBPdXIgb3duIGZ1bmN0aW9uIHNjc2lfZG9uZSAod2hpY2ggbWFya3MgdGhlIGhvc3QgYXMgbm90IGJ1c3ksCisJICogZGlzYWJsZXMgdGhlIHRpbWVvdXQgY291bnRlciwgZXRjKSB3aWxsIGJlIGNhbGxlZCBieSB1cyBvciBieSB0aGUKKwkgKiBzY3NpX2hvc3RzW2hvc3RdLnF1ZXVlY29tbWFuZCgpIGZ1bmN0aW9uIG5lZWRzIHRvIGFsc28gY2FsbAorCSAqIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uIGZvciB0aGUgaGlnaCBsZXZlbCBkcml2ZXIuCisJICovCisJbWVtY3B5KHNyZXEtPnNyX2NtbmQsIGNtbmQsIHNpemVvZihzcmVxLT5zcl9jbW5kKSk7CisJc3JlcS0+c3JfYnVmZmxlbiA9IGJ1ZmZsZW47CisJc3JlcS0+c3JfYnVmZmVyID0gYnVmZmVyOworCXNyZXEtPnNyX2FsbG93ZWQgPSByZXRyaWVzOworCXNyZXEtPnNyX2RvbmUgPSBkb25lOworCXNyZXEtPnNyX3RpbWVvdXRfcGVyX2NvbW1hbmQgPSB0aW1lb3V0OworCisJaWYgKHNyZXEtPnNyX2NtZF9sZW4gPT0gMCkKKwkJc3JlcS0+c3JfY21kX2xlbiA9IENPTU1BTkRfU0laRShzcmVxLT5zcl9jbW5kWzBdKTsKKworCS8qCisJICogaGVhZCBpbmplY3Rpb24gKnJlcXVpcmVkKiBoZXJlIG90aGVyd2lzZSBxdWllc2NlIHdvbid0IHdvcmsKKwkgKi8KKwlzY3NpX2luc2VydF9zcGVjaWFsX3JlcShzcmVxLCAxKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9kb19yZXEpOworCitzdGF0aWMgdm9pZCBzY3NpX3dhaXRfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNtZC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZXEtPnJxX3N0YXR1cyA9IFJRX1NDU0lfRE9ORTsJLyogQnVzeSwgYnV0IGluZGljYXRlIHJlcXVlc3QgZG9uZSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWlmIChibGtfcnFfdGFnZ2VkKHJlcSkpCisJCWJsa19xdWV1ZV9lbmRfdGFnKHEsIHJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocmVxLT53YWl0aW5nKQorCQljb21wbGV0ZShyZXEtPndhaXRpbmcpOworfQorCisvKiBUaGlzIGlzIHRoZSBlbmQgcm91dGluZSB3ZSBnZXQgdG8gaWYgYSBjb21tYW5kIHdhcyBuZXZlciBhdHRhY2hlZAorICogdG8gdGhlIHJlcXVlc3QuICBTaW1wbHkgY29tcGxldGUgdGhlIHJlcXVlc3Qgd2l0aG91dCBjaGFuZ2luZworICogcnFfc3RhdHVzOyB0aGlzIHdpbGwgY2F1c2UgYSBEUklWRVJfRVJST1IuICovCitzdGF0aWMgdm9pZCBzY3NpX3dhaXRfcmVxX2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCUJVR19PTighcmVxLT53YWl0aW5nKTsKKworCWNvbXBsZXRlKHJlcS0+d2FpdGluZyk7Cit9CisKK3ZvaWQgc2NzaV93YWl0X3JlcShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCBjb25zdCB2b2lkICpjbW5kLCB2b2lkICpidWZmZXIsCisJCSAgIHVuc2lnbmVkIGJ1ZmZsZW4sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykKK3sKKwlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJCisJc3JlcS0+c3JfcmVxdWVzdC0+d2FpdGluZyA9ICZ3YWl0OworCXNyZXEtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyA9IFJRX1NDU0lfQlVTWTsKKwlzcmVxLT5zcl9yZXF1ZXN0LT5lbmRfaW8gPSBzY3NpX3dhaXRfcmVxX2VuZF9pbzsKKwlzY3NpX2RvX3JlcShzcmVxLCBjbW5kLCBidWZmZXIsIGJ1ZmZsZW4sIHNjc2lfd2FpdF9kb25lLAorCQkJdGltZW91dCwgcmV0cmllcyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisJc3JlcS0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7CisJaWYgKHNyZXEtPnNyX3JlcXVlc3QtPnJxX3N0YXR1cyAhPSBSUV9TQ1NJX0RPTkUpCisJCXNyZXEtPnNyX3Jlc3VsdCB8PSAoRFJJVkVSX0VSUk9SIDw8IDI0KTsKKworCV9fc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfd2FpdF9yZXEpOworCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfaW5pdF9jbWRfZXJyaCgpCisgKgorICogUHVycG9zZTogICAgIEluaXRpYWxpemUgY21kIGZpZWxkcyByZWxhdGVkIHRvIGVycm9yIGhhbmRsaW5nLgorICoKKyAqIEFyZ3VtZW50czogICBjbWQJLSBjb21tYW5kIHRoYXQgaXMgcmVhZHkgdG8gYmUgcXVldWVkLgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSBqb2Igb2YgaW5pdGlhbGl6aW5nIGEgbnVtYmVyIG9mCisgKiAgICAgICAgICAgICAgZmllbGRzIHJlbGF0ZWQgdG8gZXJyb3IgaGFuZGxpbmcuICAgVHlwaWNhbGx5IHRoaXMgd2lsbAorICogICAgICAgICAgICAgIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNvbW1hbmQsIGFzIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW50IHNjc2lfaW5pdF9jbWRfZXJyaChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJY21kLT5vd25lciA9IFNDU0lfT1dORVJfTUlETEVWRUw7CisJY21kLT5zZXJpYWxfbnVtYmVyID0gMDsKKwljbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCA9IDA7CisJY21kLT5hYm9ydF9yZWFzb24gPSAwOworCisJbWVtc2V0KGNtZC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YgY21kLT5zZW5zZV9idWZmZXIpOworCisJaWYgKGNtZC0+Y21kX2xlbiA9PSAwKQorCQljbWQtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoY21kLT5jbW5kWzBdKTsKKworCS8qCisJICogV2UgbmVlZCBzYXZlZCBjb3BpZXMgb2YgYSBudW1iZXIgb2YgZmllbGRzIC0gdGhpcyBpcyBiZWNhdXNlCisJICogZXJyb3IgaGFuZGxpbmcgbWF5IG5lZWQgdG8gb3ZlcndyaXRlIHRoZXNlIHdpdGggZGlmZmVyZW50IHZhbHVlcworCSAqIHRvIHJ1biBkaWZmZXJlbnQgY29tbWFuZHMsIGFuZCBvbmNlIGVycm9yIGhhbmRsaW5nIGlzIGNvbXBsZXRlLAorCSAqIHdlIHdpbGwgbmVlZCB0byByZXN0b3JlIHRoZXNlIHZhbHVlcyBwcmlvciB0byBydW5uaW5nIHRoZSBhY3R1YWwKKwkgKiBjb21tYW5kLgorCSAqLworCWNtZC0+b2xkX3VzZV9zZyA9IGNtZC0+dXNlX3NnOworCWNtZC0+b2xkX2NtZF9sZW4gPSBjbWQtPmNtZF9sZW47CisJY21kLT5zY19vbGRfZGF0YV9kaXJlY3Rpb24gPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCWNtZC0+b2xkX3VuZGVyZmxvdyA9IGNtZC0+dW5kZXJmbG93OworCW1lbWNweShjbWQtPmRhdGFfY21uZCwgY21kLT5jbW5kLCBzaXplb2YoY21kLT5jbW5kKSk7CisJY21kLT5idWZmZXIgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCWNtZC0+YnVmZmxlbiA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCWNtZC0+aW50ZXJuYWxfdGltZW91dCA9IE5PUk1BTF9USU1FT1VUOworCWNtZC0+YWJvcnRfcmVhc29uID0gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogRnVuY3Rpb246ICAgc2NzaV9zZXR1cF9jbWRfcmV0cnkoKQorICoKKyAqIFB1cnBvc2U6ICAgIFJlc3RvcmUgdGhlIGNvbW1hbmQgc3RhdGUgZm9yIGEgcmV0cnkKKyAqCisgKiBBcmd1bWVudHM6ICBjbWQJLSBjb21tYW5kIHRvIGJlIHJlc3RvcmVkCisgKgorICogUmV0dXJuczogICAgTm90aGluZworICoKKyAqIE5vdGVzOiAgICAgIEltbWVkaWF0ZWx5IHByaW9yIHRvIHJldHJ5aW5nIGEgY29tbWFuZCwgd2UgbmVlZAorICogICAgICAgICAgICAgdG8gcmVzdG9yZSBjZXJ0YWluIGZpZWxkcyB0aGF0IHdlIHNhdmVkIGFib3ZlLgorICovCit2b2lkIHNjc2lfc2V0dXBfY21kX3JldHJ5KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwltZW1jcHkoY21kLT5jbW5kLCBjbWQtPmRhdGFfY21uZCwgc2l6ZW9mKGNtZC0+ZGF0YV9jbW5kKSk7CisJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IGNtZC0+YnVmZmVyOworCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gY21kLT5idWZmbGVuOworCWNtZC0+dXNlX3NnID0gY21kLT5vbGRfdXNlX3NnOworCWNtZC0+Y21kX2xlbiA9IGNtZC0+b2xkX2NtZF9sZW47CisJY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IGNtZC0+c2Nfb2xkX2RhdGFfZGlyZWN0aW9uOworCWNtZC0+dW5kZXJmbG93ID0gY21kLT5vbGRfdW5kZXJmbG93OworfQorCit2b2lkIHNjc2lfZGV2aWNlX3VuYnVzeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2hvc3QtPmhvc3RfYnVzeS0tOworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChTSE9TVF9SRUNPVkVSWSwgJnNob3N0LT5zaG9zdF9zdGF0ZSkgJiYKKwkJICAgICBzaG9zdC0+aG9zdF9mYWlsZWQpKQorCQlzY3NpX2VoX3dha2V1cChzaG9zdCk7CisJc3Bpbl91bmxvY2soc2hvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZzZGV2LT5zZGV2X2xvY2spOworCXNkZXYtPmRldmljZV9idXN5LS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Rldi0+c2Rldl9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBDYWxsZWQgZm9yIHNpbmdsZV9sdW4gZGV2aWNlcyBvbiBJTyBjb21wbGV0aW9uLiBDbGVhciBzdGFyZ2V0X3NkZXZfdXNlciwKKyAqIGFuZCBjYWxsIGJsa19ydW5fcXVldWUgZm9yIGFsbCB0aGUgc2NzaV9kZXZpY2VzIG9uIHRoZSB0YXJnZXQgLQorICogaW5jbHVkaW5nIGN1cnJlbnRfc2RldiBmaXJzdC4KKyAqCisgKiBDYWxsZWQgd2l0aCAqbm8qIHNjc2kgbG9ja3MgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9zaW5nbGVfbHVuX3J1bihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmN1cnJlbnRfc2RldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGN1cnJlbnRfc2Rldi0+aG9zdDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsICp0bXA7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2NzaV90YXJnZXQoY3VycmVudF9zZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXN0YXJnZXQtPnN0YXJnZXRfc2Rldl91c2VyID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogQ2FsbCBibGtfcnVuX3F1ZXVlIGZvciBhbGwgTFVOcyBvbiB0aGUgdGFyZ2V0LCBzdGFydGluZyB3aXRoCisJICogY3VycmVudF9zZGV2LiBXZSByYWNlIHdpdGggb3RoZXJzICh0byBzZXQgc3RhcmdldF9zZGV2X3VzZXIpLAorCSAqIGJ1dCBpbiBtb3N0IGNhc2VzLCB3ZSB3aWxsIGJlIGZpcnN0LiBJZGVhbGx5LCBlYWNoIExVIG9uIHRoZQorCSAqIHRhcmdldCB3b3VsZCBnZXQgc29tZSBsaW1pdGVkIHRpbWUgb3IgcmVxdWVzdHMgb24gdGhlIHRhcmdldC4KKwkgKi8KKwlibGtfcnVuX3F1ZXVlKGN1cnJlbnRfc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHN0YXJnZXQtPnN0YXJnZXRfc2Rldl91c2VyKQorCQlnb3RvIG91dDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2RldiwgdG1wLCAmc3RhcmdldC0+ZGV2aWNlcywKKwkJCXNhbWVfdGFyZ2V0X3NpYmxpbmdzKSB7CisJCWlmIChzZGV2ID09IGN1cnJlbnRfc2RldikKKwkJCWNvbnRpbnVlOworCQlpZiAoc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKQorCQkJY29udGludWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWJsa19ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkKKwkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCX0KKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjoJc2NzaV9ydW5fcXVldWUoKQorICoKKyAqIFB1cnBvc2U6CVNlbGVjdCBhIHByb3BlciByZXF1ZXN0IHF1ZXVlIHRvIHNlcnZlIG5leHQKKyAqCisgKiBBcmd1bWVudHM6CXEJLSBsYXN0IHJlcXVlc3QncyBxdWV1ZQorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6CVRoZSBwcmV2aW91cyBjb21tYW5kIHdhcyBjb21wbGV0ZWx5IGZpbmlzaGVkLCBzdGFydAorICoJCWEgbmV3IG9uZSBpZiBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNkZXYtPnNpbmdsZV9sdW4pCisJCXNjc2lfc2luZ2xlX2x1bl9ydW4oc2Rldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzaG9zdC0+c3RhcnZlZF9saXN0KSAmJgorCSAgICAgICAhc2hvc3QtPmhvc3RfYmxvY2tlZCAmJiAhc2hvc3QtPmhvc3Rfc2VsZl9ibG9ja2VkICYmCisJCSEoKHNob3N0LT5jYW5fcXVldWUgPiAwKSAmJgorCQkgIChzaG9zdC0+aG9zdF9idXN5ID49IHNob3N0LT5jYW5fcXVldWUpKSkgeworCQkvKgorCQkgKiBBcyBsb25nIGFzIHNob3N0IGlzIGFjY2VwdGluZyBjb21tYW5kcyBhbmQgd2UgaGF2ZQorCQkgKiBzdGFydmVkIHF1ZXVlcywgY2FsbCBibGtfcnVuX3F1ZXVlLiBzY3NpX3JlcXVlc3RfZm4KKwkJICogZHJvcHMgdGhlIHF1ZXVlX2xvY2sgYW5kIGNhbiBhZGQgdXMgYmFjayB0byB0aGUKKwkJICogc3RhcnZlZF9saXN0LgorCQkgKgorCQkgKiBob3N0X2xvY2sgcHJvdGVjdHMgdGhlIHN0YXJ2ZWRfbGlzdCBhbmQgc3RhcnZlZF9lbnRyeS4KKwkJICogc2NzaV9yZXF1ZXN0X2ZuIG11c3QgZ2V0IHRoZSBob3N0X2xvY2sgYmVmb3JlIGNoZWNraW5nCisJCSAqIG9yIG1vZGlmeWluZyBzdGFydmVkX2xpc3Qgb3Igc3RhcnZlZF9lbnRyeS4KKwkJICovCisJCXNkZXYgPSBsaXN0X2VudHJ5KHNob3N0LT5zdGFydmVkX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3Qgc2NzaV9kZXZpY2UsIHN0YXJ2ZWRfZW50cnkpOworCQlsaXN0X2RlbF9pbml0KCZzZGV2LT5zdGFydmVkX2VudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJYmxrX3J1bl9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmc2Rldi0+c3RhcnZlZF9lbnRyeSkpKQorCQkJLyoKKwkJCSAqIHNkZXYgbG9zdCBhIHJhY2UsIGFuZCB3YXMgcHV0IGJhY2sgb24gdGhlCisJCQkgKiBzdGFydmVkIGxpc3QuIFRoaXMgaXMgdW5saWtlbHkgYnV0IHdpdGhvdXQgdGhpcworCQkJICogaW4gdGhlb3J5IHdlIGNvdWxkIGxvb3AgZm9yZXZlci4KKwkJCSAqLworCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJYmxrX3J1bl9xdWV1ZShxKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOglzY3NpX3JlcXVldWVfY29tbWFuZCgpCisgKgorICogUHVycG9zZToJSGFuZGxlIHBvc3QtcHJvY2Vzc2luZyBvZiBjb21wbGV0ZWQgY29tbWFuZHMuCisgKgorICogQXJndW1lbnRzOglxCS0gcXVldWUgdG8gb3BlcmF0ZSBvbgorICoJCWNtZAktIGNvbW1hbmQgdGhhdCBtYXkgbmVlZCB0byBiZSByZXF1ZXVlZC4KKyAqCisgKiBSZXR1cm5zOglOb3RoaW5nCisgKgorICogTm90ZXM6CUFmdGVyIGNvbW1hbmQgY29tcGxldGlvbiwgdGhlcmUgbWF5IGJlIGJsb2NrcyBsZWZ0CisgKgkJb3ZlciB3aGljaCB3ZXJlbid0IGZpbmlzaGVkIGJ5IHRoZSBwcmV2aW91cyBjb21tYW5kCisgKgkJdGhpcyBjYW4gYmUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMgLSB0aGUgbWFpbiBvbmUgaXMKKyAqCQlJL08gZXJyb3JzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJlcXVlc3QsIGluIHdoaWNoIGNhc2UKKyAqCQl3ZSBuZWVkIHRvIHJlcXVlc3QgdGhlIGJsb2NrcyB0aGF0IGNvbWUgYWZ0ZXIgdGhlIGJhZAorICoJCXNlY3Rvci4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9yZXF1ZXVlX2NvbW1hbmQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwljbWQtPnJlcXVlc3QtPmZsYWdzICY9IH5SRVFfRE9OVFBSRVA7CisJYmxrX2luc2VydF9yZXF1ZXN0KHEsIGNtZC0+cmVxdWVzdCwgMSwgY21kLCAxKTsKKworCXNjc2lfcnVuX3F1ZXVlKHEpOworfQorCit2b2lkIHNjc2lfbmV4dF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNtZC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOworCisJc2NzaV9wdXRfY29tbWFuZChjbWQpOworCXNjc2lfcnVuX3F1ZXVlKHEpOworfQorCit2b2lkIHNjc2lfcnVuX2hvc3RfcXVldWVzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzZGV2LCBzaG9zdCkKKwkJc2NzaV9ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9lbmRfcmVxdWVzdCgpCisgKgorICogUHVycG9zZTogICAgIFBvc3QtcHJvY2Vzc2luZyBvZiBjb21wbGV0ZWQgY29tbWFuZHMgKHVzdWFsbHkgaW52b2tlZCBhdCBlbmQKKyAqCQlvZiB1cHBlciBsZXZlbCBwb3N0LXByb2Nlc3NpbmcgYW5kIHNjc2lfaW9fY29tcGxldGlvbikuCisgKgorICogQXJndW1lbnRzOiAgIGNtZAkgLSBjb21tYW5kIHRoYXQgaXMgY29tcGxldGUuCisgKiAgICAgICAgICAgICAgdXB0b2RhdGUgLSAxIGlmIEkvTyBpbmRpY2F0ZXMgc3VjY2VzcywgPD0gMCBmb3IgSS9PIGVycm9yLgorICogICAgICAgICAgICAgIGJ5dGVzICAgIC0gbnVtYmVyIG9mIGJ5dGVzIG9mIGNvbXBsZXRlZCBJL08KKyAqCQlyZXF1ZXVlICAtIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZCByZXF1ZXVlIGxlZnRvdmVycy4KKyAqCisgKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IGxvY2sgaXMgbm90IGhlbGQgdXBvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm5zOiAgICAgY21kIGlmIHJlcXVldWUgZG9uZSBvciByZXF1aXJlZCwgTlVMTCBvdGhlcndpc2UKKyAqCisgKiBOb3RlczogICAgICAgVGhpcyBpcyBjYWxsZWQgZm9yIGJsb2NrIGRldmljZSByZXF1ZXN0cyBpbiBvcmRlciB0bworICogICAgICAgICAgICAgIG1hcmsgc29tZSBudW1iZXIgb2Ygc2VjdG9ycyBhcyBjb21wbGV0ZS4KKyAqIAorICoJCVdlIGFyZSBndWFyYW50ZWVpbmcgdGhhdCB0aGUgcmVxdWVzdCBxdWV1ZSB3aWxsIGJlIGdvb3NlZAorICoJCWF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoaXMgY2FsbC4KKyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfZW5kX3JlcXVlc3Qoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgdXB0b2RhdGUsCisJCQkJCSAgaW50IGJ5dGVzLCBpbnQgcmVxdWV1ZSkKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjbWQtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gY21kLT5yZXF1ZXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBibG9ja3MgbGVmdCBvdmVyIGF0IHRoZSBlbmQsIHNldCB1cCB0aGUgY29tbWFuZAorCSAqIHRvIHF1ZXVlIHRoZSByZW1haW5kZXIgb2YgdGhlbS4KKwkgKi8KKwlpZiAoZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhyZXEsIHVwdG9kYXRlLCBieXRlcykpIHsKKwkJaW50IGxlZnRvdmVyID0gKHJlcS0+aGFyZF9ucl9zZWN0b3JzIDw8IDkpOworCisJCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKQorCQkJbGVmdG92ZXIgPSByZXEtPmRhdGFfbGVuOworCisJCS8qIGtpbGwgcmVtYWluZGVyIGlmIG5vIHJldHJ5cyAqLworCQlpZiAoIXVwdG9kYXRlICYmIGJsa19ub3JldHJ5X3JlcXVlc3QocmVxKSkKKwkJCWVuZF90aGF0X3JlcXVlc3RfY2h1bmsocmVxLCAwLCBsZWZ0b3Zlcik7CisJCWVsc2UgeworCQkJaWYgKHJlcXVldWUpCisJCQkJLyoKKwkJCQkgKiBCbGVhaC4gIExlZnRvdmVycyBhZ2Fpbi4gIFN0aWNrIHRoZQorCQkJCSAqIGxlZnRvdmVycyBpbiB0aGUgZnJvbnQgb2YgdGhlCisJCQkJICogcXVldWUsIGFuZCBnb29zZSB0aGUgcXVldWUgYWdhaW4uCisJCQkJICovCisJCQkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKKworCQkJcmV0dXJuIGNtZDsKKwkJfQorCX0KKworCWFkZF9kaXNrX3JhbmRvbW5lc3MocmVxLT5ycV9kaXNrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlpZiAoYmxrX3JxX3RhZ2dlZChyZXEpKQorCQlibGtfcXVldWVfZW5kX3RhZyhxLCByZXEpOworCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGlzIHdpbGwgZ29vc2UgdGhlIHF1ZXVlIHJlcXVlc3QgZnVuY3Rpb24gYXQgdGhlIGVuZCwgc28gd2UgZG9uJ3QKKwkgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IGxhdW5jaGluZyBhbm90aGVyIGNvbW1hbmQuCisJICovCisJc2NzaV9uZXh0X2NvbW1hbmQoY21kKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqc2NzaV9hbGxvY19zZ3RhYmxlKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCAqc2dwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsOworCisJQlVHX09OKCFjbWQtPnVzZV9zZyk7CisKKwlzd2l0Y2ggKGNtZC0+dXNlX3NnKSB7CisJY2FzZSAxIC4uLiA4OgorCQljbWQtPnNnbGlzdF9sZW4gPSAwOworCQlicmVhazsKKwljYXNlIDkgLi4uIDE2OgorCQljbWQtPnNnbGlzdF9sZW4gPSAxOworCQlicmVhazsKKwljYXNlIDE3IC4uLiAzMjoKKwkJY21kLT5zZ2xpc3RfbGVuID0gMjsKKwkJYnJlYWs7CisjaWYgKFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgPiAzMikKKwljYXNlIDMzIC4uLiA2NDoKKwkJY21kLT5zZ2xpc3RfbGVuID0gMzsKKwkJYnJlYWs7CisjaWYgKFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMgPiA2NCkKKwljYXNlIDY1IC4uLiAxMjg6CisJCWNtZC0+c2dsaXN0X2xlbiA9IDQ7CisJCWJyZWFrOworI2lmIChTQ1NJX01BWF9QSFlTX1NFR01FTlRTICA+IDEyOCkKKwljYXNlIDEyOSAuLi4gMjU2OgorCQljbWQtPnNnbGlzdF9sZW4gPSA1OworCQlicmVhazsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzZ3AgPSBzY3NpX3NnX3Bvb2xzICsgY21kLT5zZ2xpc3RfbGVuOworCXNnbCA9IG1lbXBvb2xfYWxsb2Moc2dwLT5wb29sLCBnZnBfbWFzayk7CisJaWYgKHNnbCkKKwkJbWVtc2V0KHNnbCwgMCwgc2dwLT5zaXplKTsKKwlyZXR1cm4gc2dsOworfQorCitzdGF0aWMgdm9pZCBzY3NpX2ZyZWVfc2d0YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IGluZGV4KQoreworCXN0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCAqc2dwOworCisJQlVHX09OKGluZGV4ID4gU0dfTUVNUE9PTF9OUik7CisKKwlzZ3AgPSBzY3NpX3NnX3Bvb2xzICsgaW5kZXg7CisJbWVtcG9vbF9mcmVlKHNnbCwgc2dwLT5wb29sKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlbGVhc2VfYnVmZmVycygpCisgKgorICogUHVycG9zZTogICAgIENvbXBsZXRpb24gcHJvY2Vzc2luZyBmb3IgYmxvY2sgZGV2aWNlIEkvTyByZXF1ZXN0cy4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kCS0gY29tbWFuZCB0aGF0IHdlIGFyZSBiYWlsaW5nLgorICoKKyAqIExvY2sgc3RhdHVzOiBBc3N1bWVkIHRoYXQgbm8gbG9jayBpcyBoZWxkIHVwb24gZW50cnkuCisgKgorICogUmV0dXJuczogICAgIE5vdGhpbmcKKyAqCisgKiBOb3RlczogICAgICAgSW4gdGhlIGV2ZW50IHRoYXQgYW4gdXBwZXIgbGV2ZWwgZHJpdmVyIHJlamVjdHMgYQorICoJCWNvbW1hbmQsIHdlIG11c3QgcmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGR1cmluZworICoJCXRoZSBfX2luaXRfaW8oKSBmdW5jdGlvbi4gIFByaW1hcmlseSB0aGlzIHdvdWxkIGludm9sdmUKKyAqCQl0aGUgc2NhdHRlci1nYXRoZXIgdGFibGUsIGFuZCBwb3RlbnRpYWxseSBhbnkgYm91bmNlCisgKgkJYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQgc2NzaV9yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CisKKwkvKgorCSAqIEZyZWUgdXAgYW55IGluZGlyZWN0aW9uIGJ1ZmZlcnMgd2UgYWxsb2NhdGVkIGZvciBETUEgcHVycG9zZXMuIAorCSAqLworCWlmIChjbWQtPnVzZV9zZykKKwkJc2NzaV9mcmVlX3NndGFibGUoY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5zZ2xpc3RfbGVuKTsKKwllbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmVyICE9IHJlcS0+YnVmZmVyKQorCQlrZnJlZShjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKworCS8qCisJICogWmVybyB0aGVzZSBvdXQuICBUaGV5IG5vdyBwb2ludCB0byBmcmVlZCBtZW1vcnksIGFuZCBpdCBpcworCSAqIGRhbmdlcm91cyB0byBoYW5nIG9udG8gdGhlIHBvaW50ZXJzLgorCSAqLworCWNtZC0+YnVmZmVyICA9IE5VTEw7CisJY21kLT5idWZmbGVuID0gMDsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gTlVMTDsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9pb19jb21wbGV0aW9uKCkKKyAqCisgKiBQdXJwb3NlOiAgICAgQ29tcGxldGlvbiBwcm9jZXNzaW5nIGZvciBibG9jayBkZXZpY2UgSS9PIHJlcXVlc3RzLgorICoKKyAqIEFyZ3VtZW50czogICBjbWQgICAtIGNvbW1hbmQgdGhhdCBpcyBmaW5pc2hlZC4KKyAqCisgKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IG5vIGxvY2sgaXMgaGVsZCB1cG9uIGVudHJ5LgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6ICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbWF0Y2hlZCBpbiB0ZXJtcyBvZiBjYXBhYmlsaXRpZXMgdG8KKyAqICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gdGhhdCBjcmVhdGVkIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0LgorICogICAgICAgICAgICAgIEluIG90aGVyIHdvcmRzLCBpZiB0aGVyZSBhcmUgbm8gYm91bmNlIGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICAodGhlIG5vcm1hbCBjYXNlIGZvciBtb3N0IGRyaXZlcnMpLCB3ZSBkb24ndCBuZWVkCisgKiAgICAgICAgICAgICAgdGhlIGxvZ2ljIHRvIGRlYWwgd2l0aCBjbGVhbmluZyB1cCBhZnRlcndhcmRzLgorICoKKyAqCQlXZSBtdXN0IGRvIG9uZSBvZiBzZXZlcmFsIHRoaW5ncyBoZXJlOgorICoKKyAqCQlhKSBDYWxsIHNjc2lfZW5kX3JlcXVlc3QuICBUaGlzIHdpbGwgZmluaXNoIG9mZiB0aGUKKyAqCQkgICBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY3RvcnMuICBJZiB3ZSBhcmUgZG9uZSwgdGhlCisgKgkJICAgY29tbWFuZCBibG9jayB3aWxsIGJlIHJlbGVhc2VkLCBhbmQgdGhlIHF1ZXVlCisgKgkJICAgZnVuY3Rpb24gd2lsbCBiZSBnb29zZWQuICBJZiB3ZSBhcmUgbm90IGRvbmUsIHRoZW4KKyAqCQkgICBzY3NpX2VuZF9yZXF1ZXN0IHdpbGwgZGlyZWN0bHkgZ29vc2UgdGhlIHF1ZXVlLgorICoKKyAqCQliKSBXZSBjYW4ganVzdCB1c2Ugc2NzaV9yZXF1ZXVlX2NvbW1hbmQoKSBoZXJlLiAgVGhpcyB3b3VsZAorICoJCSAgIGJlIHVzZWQgaWYgd2UganVzdCB3YW50ZWQgdG8gcmV0cnksIGZvciBleGFtcGxlLgorICovCit2b2lkIHNjc2lfaW9fY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHVuc2lnbmVkIGludCBnb29kX2J5dGVzLAorCQkJdW5zaWduZWQgaW50IGJsb2NrX2J5dGVzKQoreworCWludCByZXN1bHQgPSBjbWQtPnJlc3VsdDsKKwlpbnQgdGhpc19jb3VudCA9IGNtZC0+YnVmZmxlbjsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjbWQtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gY21kLT5yZXF1ZXN0OworCWludCBjbGVhcl9lcnJvcnMgPSAxOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKwlpbnQgc2Vuc2VfdmFsaWQgPSAwOworCWludCBzZW5zZV9kZWZlcnJlZCA9IDA7CisKKwlpZiAoYmxrX2NvbXBsZXRlX2JhcnJpZXJfcnEocSwgcmVxLCBnb29kX2J5dGVzID4+IDkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEZyZWUgdXAgYW55IGluZGlyZWN0aW9uIGJ1ZmZlcnMgd2UgYWxsb2NhdGVkIGZvciBETUEgcHVycG9zZXMuIAorCSAqIEZvciB0aGUgY2FzZSBvZiBhIFJFQUQsIHdlIG5lZWQgdG8gY29weSB0aGUgZGF0YSBvdXQgb2YgdGhlCisJICogYm91bmNlIGJ1ZmZlciBhbmQgaW50byB0aGUgcmVhbCBidWZmZXIuCisJICovCisJaWYgKGNtZC0+dXNlX3NnKQorCQlzY3NpX2ZyZWVfc2d0YWJsZShjbWQtPmJ1ZmZlciwgY21kLT5zZ2xpc3RfbGVuKTsKKwllbHNlIGlmIChjbWQtPmJ1ZmZlciAhPSByZXEtPmJ1ZmZlcikgeworCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJY2hhciAqdG8gPSBiaW9fa21hcF9pcnEocmVxLT5iaW8sICZmbGFncyk7CisJCQltZW1jcHkodG8sIGNtZC0+YnVmZmVyLCBjbWQtPmJ1ZmZsZW4pOworCQkJYmlvX2t1bm1hcF9pcnEodG8sICZmbGFncyk7CisJCX0KKwkJa2ZyZWUoY21kLT5idWZmZXIpOworCX0KKworCWlmIChyZXN1bHQpIHsKKwkJc2Vuc2VfdmFsaWQgPSBzY3NpX2NvbW1hbmRfbm9ybWFsaXplX3NlbnNlKGNtZCwgJnNzaGRyKTsKKwkJaWYgKHNlbnNlX3ZhbGlkKQorCQkJc2Vuc2VfZGVmZXJyZWQgPSBzY3NpX3NlbnNlX2lzX2RlZmVycmVkKCZzc2hkcik7CisJfQorCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKSB7IC8qIFNHX0lPIGlvY3RsIGZyb20gYmxvY2sgbGV2ZWwgKi8KKwkJcmVxLT5lcnJvcnMgPSByZXN1bHQ7CisJCWlmIChyZXN1bHQpIHsKKwkJCWNsZWFyX2Vycm9ycyA9IDA7CisJCQlpZiAoc2Vuc2VfdmFsaWQgJiYgcmVxLT5zZW5zZSkgeworCQkJCS8qCisJCQkJICogU0dfSU8gd2FudHMgY3VycmVudCBhbmQgZGVmZXJyZWQgZXJyb3JzCisJCQkJICovCisJCQkJaW50IGxlbiA9IDggKyBjbWQtPnNlbnNlX2J1ZmZlcls3XTsKKworCQkJCWlmIChsZW4gPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQkJCWxlbiA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwkJCQltZW1jcHkocmVxLT5zZW5zZSwgY21kLT5zZW5zZV9idWZmZXIsICBsZW4pOworCQkJCXJlcS0+c2Vuc2VfbGVuID0gbGVuOworCQkJfQorCQl9IGVsc2UKKwkJCXJlcS0+ZGF0YV9sZW4gPSBjbWQtPnJlc2lkOworCX0KKworCS8qCisJICogWmVybyB0aGVzZSBvdXQuICBUaGV5IG5vdyBwb2ludCB0byBmcmVlZCBtZW1vcnksIGFuZCBpdCBpcworCSAqIGRhbmdlcm91cyB0byBoYW5nIG9udG8gdGhlIHBvaW50ZXJzLgorCSAqLworCWNtZC0+YnVmZmVyICA9IE5VTEw7CisJY21kLT5idWZmbGVuID0gMDsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gTlVMTDsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IDA7CisKKwkvKgorCSAqIE5leHQgZGVhbCB3aXRoIGFueSBzZWN0b3JzIHdoaWNoIHdlIHdlcmUgYWJsZSB0byBjb3JyZWN0bHkKKwkgKiBoYW5kbGUuCisJICovCisJaWYgKGdvb2RfYnl0ZXMgPj0gMCkgeworCQlTQ1NJX0xPR19ITENPTVBMRVRFKDEsIHByaW50aygiJWxkIHNlY3RvcnMgdG90YWwsICVkIGJ5dGVzIGRvbmUuXG4iLAorCQkJCQkgICAgICByZXEtPm5yX3NlY3RvcnMsIGdvb2RfYnl0ZXMpKTsKKwkJU0NTSV9MT0dfSExDT01QTEVURSgxLCBwcmludGsoInVzZV9zZyBpcyAlZFxuIiwgY21kLT51c2Vfc2cpKTsKKworCQlpZiAoY2xlYXJfZXJyb3JzKQorCQkJcmVxLT5lcnJvcnMgPSAwOworCQkvKgorCQkgKiBJZiBtdWx0aXBsZSBzZWN0b3JzIGFyZSByZXF1ZXN0ZWQgaW4gb25lIGJ1ZmZlciwgdGhlbgorCQkgKiB0aGV5IHdpbGwgaGF2ZSBiZWVuIGZpbmlzaGVkIG9mZiBieSB0aGUgZmlyc3QgY29tbWFuZC4KKwkJICogSWYgbm90LCB0aGVuIHdlIGhhdmUgYSBtdWx0aS1idWZmZXIgY29tbWFuZC4KKwkJICoKKwkJICogSWYgYmxvY2tfYnl0ZXMgIT0gMCwgaXQgbWVhbnMgd2UgaGFkIGEgbWVkaXVtIGVycm9yCisJCSAqIG9mIHNvbWUgc29ydCwgYW5kIHRoYXQgd2Ugd2FudCB0byBtYXJrIHNvbWUgbnVtYmVyIG9mCisJCSAqIHNlY3RvcnMgYXMgbm90IHVwdG9kYXRlLiAgVGh1cyB3ZSB3YW50IHRvIGluaGliaXQKKwkJICogcmVxdWV1ZWluZyByaWdodCBoZXJlIC0gd2Ugd2lsbCByZXF1ZXVlIGRvd24gYmVsb3cKKwkJICogd2hlbiB3ZSBoYW5kbGUgdGhlIGJhZCBzZWN0b3JzLgorCQkgKi8KKwkJY21kID0gc2NzaV9lbmRfcmVxdWVzdChjbWQsIDEsIGdvb2RfYnl0ZXMsIHJlc3VsdCA9PSAwKTsKKworCQkvKgorCQkgKiBJZiB0aGUgY29tbWFuZCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciwgdGhlbiBlaXRoZXIgZmluaXNoIG9mZiB0aGUKKwkJICogcmVzdCBvZiB0aGUgY29tbWFuZCwgb3Igc3RhcnQgYSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKHJlc3VsdCA9PSAwIHx8IGNtZCA9PSBOVUxMICkgeworCQkJcmV0dXJuOworCQl9CisJfQorCS8qCisJICogTm93LCBpZiB3ZSB3ZXJlIGdvb2QgbGl0dGxlIGJveXMgYW5kIGdpcmxzLCBTYW50YSBsZWZ0IHVzIGEgcmVxdWVzdAorCSAqIHNlbnNlIGJ1ZmZlci4gIFdlIGNhbiBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhpcywgc28gd2UKKwkgKiBjYW4gY2hvb3NlIGEgYmxvY2sgdG8gcmVtYXAsIGV0Yy4KKwkgKi8KKwlpZiAoc2Vuc2VfdmFsaWQgJiYgIXNlbnNlX2RlZmVycmVkKSB7CisJCXN3aXRjaCAoc3NoZHIuc2Vuc2Vfa2V5KSB7CisJCWNhc2UgVU5JVF9BVFRFTlRJT046CisJCQlpZiAoY21kLT5kZXZpY2UtPnJlbW92YWJsZSkgeworCQkJCS8qIGRldGVjdGVkIGRpc2MgY2hhbmdlLiAgc2V0IGEgYml0IAorCQkJCSAqIGFuZCBxdWlldGx5IHJlZnVzZSBmdXJ0aGVyIGFjY2Vzcy4KKwkJCQkgKi8KKwkJCQljbWQtPmRldmljZS0+Y2hhbmdlZCA9IDE7CisJCQkJY21kID0gc2NzaV9lbmRfcmVxdWVzdChjbWQsIDAsCisJCQkJCQl0aGlzX2NvdW50LCAxKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJKiBNdXN0IGhhdmUgYmVlbiBhIHBvd2VyIGdsaXRjaCwgb3IgYQorCQkJCSogYnVzIHJlc2V0LiAgQ291bGQgbm90IGhhdmUgYmVlbiBhCisJCQkJKiBtZWRpYSBjaGFuZ2UsIHNvIHdlIGp1c3QgcmV0cnkgdGhlCisJCQkJKiByZXF1ZXN0IGFuZCBzZWUgd2hhdCBoYXBwZW5zLiAgCisJCQkJKi8KKwkJCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkJCS8qCisJCSAJKiBJZiB3ZSBoYWQgYW4gSUxMRUdBTCBSRVFVRVNUIHJldHVybmVkLCB0aGVuIHdlIG1heQorCQkgCSogaGF2ZSBwZXJmb3JtZWQgYW4gdW5zdXBwb3J0ZWQgY29tbWFuZC4gIFRoZSBvbmx5CisJCSAJKiB0aGluZyB0aGlzIHNob3VsZCBiZSB3b3VsZCBiZSBhIHRlbiBieXRlIHJlYWQgd2hlcmUKKwkJCSogb25seSBhIHNpeCBieXRlIHJlYWQgd2FzIHN1cHBvcnRlZC4gIEFsc28sIG9uIGEKKwkJCSogc3lzdGVtIHdoZXJlIFJFQUQgQ0FQQUNJVFkgZmFpbGVkLCB3ZSBtYXkgaGF2ZSByZWFkCisJCQkqIHBhc3QgdGhlIGVuZCBvZiB0aGUgZGlzay4KKwkJIAkqLworCQkJaWYgKGNtZC0+ZGV2aWNlLT51c2VfMTBfZm9yX3J3ICYmCisJCQkgICAgKGNtZC0+Y21uZFswXSA9PSBSRUFEXzEwIHx8CisJCQkgICAgIGNtZC0+Y21uZFswXSA9PSBXUklURV8xMCkpIHsKKwkJCQljbWQtPmRldmljZS0+dXNlXzEwX2Zvcl9ydyA9IDA7CisJCQkJLyoKKwkJCQkgKiBUaGlzIHdpbGwgY2F1c2UgYSByZXRyeSB3aXRoIGEgNi1ieXRlCisJCQkJICogY29tbWFuZC4KKwkJCQkgKi8KKwkJCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOworCQkJCXJlc3VsdCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAwLCB0aGlzX2NvdW50LCAxKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOT1RfUkVBRFk6CisJCQkvKgorCQkJICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWNvbWluZyByZWFkeSwKKwkJCSAqIHJldHJ5LgorCQkJICovCisJCQlpZiAoc3NoZHIuYXNjID09IDB4MDQgJiYgc3NoZHIuYXNjcSA9PSAweDAxKSB7CisJCQkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2UgJXMgbm90IHJlYWR5LlxuIiwKKwkJCSAgICAgICByZXEtPnJxX2Rpc2sgPyByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSA6ICIiKTsKKwkJCWNtZCA9IHNjc2lfZW5kX3JlcXVlc3QoY21kLCAwLCB0aGlzX2NvdW50LCAxKTsKKwkJCXJldHVybjsKKwkJY2FzZSBWT0xVTUVfT1ZFUkZMT1c6CisJCQlwcmludGsoS0VSTl9JTkZPICJWb2x1bWUgb3ZlcmZsb3cgPCVkICVkICVkICVkPiBDREI6ICIsCisJCQkgICAgICAgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8sCisJCQkgICAgICAgKGludCljbWQtPmRldmljZS0+Y2hhbm5lbCwKKwkJCSAgICAgICAoaW50KWNtZC0+ZGV2aWNlLT5pZCwgKGludCljbWQtPmRldmljZS0+bHVuKTsKKwkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNtZC0+ZGF0YV9jbW5kKTsKKwkJCXNjc2lfcHJpbnRfc2Vuc2UoIiIsIGNtZCk7CisJCQljbWQgPSBzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgMCwgYmxvY2tfYnl0ZXMsIDEpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CQkJLyogZHJpdmVyIGJ5dGUgIT0gMCAqLworCWlmIChob3N0X2J5dGUocmVzdWx0KSA9PSBESURfUkVTRVQpIHsKKwkJLyoKKwkJICogVGhpcmQgcGFydHkgYnVzIHJlc2V0IG9yIHJlc2V0IGZvciBlcnJvcgorCQkgKiByZWNvdmVyeSByZWFzb25zLiAgSnVzdCByZXRyeSB0aGUgcmVxdWVzdAorCQkgKiBhbmQgc2VlIHdoYXQgaGFwcGVucy4gIAorCQkgKi8KKwkJc2NzaV9yZXF1ZXVlX2NvbW1hbmQocSwgY21kKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNDU0kgZXJyb3IgOiA8JWQgJWQgJWQgJWQ+IHJldHVybiBjb2RlICIKKwkJICAgICAgICI9IDB4JXhcbiIsIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAorCQkgICAgICAgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCSAgICAgICBjbWQtPmRldmljZS0+aWQsCisJCSAgICAgICBjbWQtPmRldmljZS0+bHVuLCByZXN1bHQpOworCisJCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKQorCQkJc2NzaV9wcmludF9zZW5zZSgiIiwgY21kKTsKKwkJLyoKKwkJICogTWFyayBhIHNpbmdsZSBidWZmZXIgYXMgbm90IHVwdG9kYXRlLiAgUXVldWUgdGhlIHJlbWFpbmRlci4KKwkJICogV2Ugc29tZXRpbWVzIGdldCB0aGlzIGNydWZ0IGluIHRoZSBldmVudCB0aGF0IGEgbWVkaXVtIGVycm9yCisJCSAqIGlzbid0IHByb3Blcmx5IHJlcG9ydGVkLgorCQkgKi8KKwkJYmxvY2tfYnl0ZXMgPSByZXEtPmhhcmRfY3VyX3NlY3RvcnMgPDwgOTsKKwkJaWYgKCFibG9ja19ieXRlcykKKwkJCWJsb2NrX2J5dGVzID0gcmVxLT5kYXRhX2xlbjsKKwkJY21kID0gc2NzaV9lbmRfcmVxdWVzdChjbWQsIDAsIGJsb2NrX2J5dGVzLCAxKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaW9fY29tcGxldGlvbik7CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9pbml0X2lvKCkKKyAqCisgKiBQdXJwb3NlOiAgICAgU0NTSSBJL08gaW5pdGlhbGl6ZSBmdW5jdGlvbi4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kICAgLSBDb21tYW5kIGRlc2NyaXB0b3Igd2Ugd2lzaCB0byBpbml0aWFsaXplCisgKgorICogUmV0dXJuczogICAgIDAgb24gc3VjY2VzcworICoJCUJMS1BSRVBfREVGRVIgaWYgdGhlIGZhaWx1cmUgaXMgcmV0cnlhYmxlCisgKgkJQkxLUFJFUF9LSUxMIGlmIHRoZSBmYWlsdXJlIGlzIGZhdGFsCisgKi8KK3N0YXRpYyBpbnQgc2NzaV9pbml0X2lvKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAgICAgKnJlcSA9IGNtZC0+cmVxdWVzdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50OworCWludAkJICAgY291bnQ7CisKKwkvKgorCSAqIGlmIHRoaXMgaXMgYSBycS0+ZGF0YSBiYXNlZCBSRVFfQkxPQ0tfUEMsIHNldHVwIGZvciBhIG5vbi1zZyB4ZmVyCisJICovCisJaWYgKChyZXEtPmZsYWdzICYgUkVRX0JMT0NLX1BDKSAmJiAhcmVxLT5iaW8pIHsKKwkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSByZXEtPmRhdGFfbGVuOworCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gcmVxLT5kYXRhOworCQlyZXEtPmJ1ZmZlciA9IHJlcS0+ZGF0YTsKKwkJY21kLT51c2Vfc2cgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIHdlIHVzZWQgdG8gbm90IHVzZSBzY2F0dGVyLWdhdGhlciBmb3Igc2luZ2xlIHNlZ21lbnQgcmVxdWVzdCwKKwkgKiBidXQgbm93IHdlIGRvIChpdCBtYWtlcyBoaWdobWVtIEkvTyBlYXNpZXIgdG8gc3VwcG9ydCB3aXRob3V0CisJICoga21hcHBpbmcgcGFnZXMpCisJICovCisJY21kLT51c2Vfc2cgPSByZXEtPm5yX3BoeXNfc2VnbWVudHM7CisKKwkvKgorCSAqIGlmIHNnIHRhYmxlIGFsbG9jYXRpb24gZmFpbHMsIHJlcXVldWUgcmVxdWVzdCBsYXRlci4KKwkgKi8KKwlzZ3BudCA9IHNjc2lfYWxsb2Nfc2d0YWJsZShjbWQsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseSghc2dwbnQpKSB7CisJCXJlcS0+ZmxhZ3MgfD0gUkVRX1NQRUNJQUw7CisJCXJldHVybiBCTEtQUkVQX0RFRkVSOworCX0KKworCWNtZC0+cmVxdWVzdF9idWZmZXIgPSAoY2hhciAqKSBzZ3BudDsKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHJlcS0+bnJfc2VjdG9ycyA8PCA5OworCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKQorCQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHJlcS0+ZGF0YV9sZW47CisJcmVxLT5idWZmZXIgPSBOVUxMOworCisJLyogCisJICogTmV4dCwgd2FsayB0aGUgbGlzdCwgYW5kIGZpbGwgaW4gdGhlIGFkZHJlc3NlcyBhbmQgc2l6ZXMgb2YKKwkgKiBlYWNoIHNlZ21lbnQuCisJICovCisJY291bnQgPSBibGtfcnFfbWFwX3NnKHJlcS0+cSwgcmVxLCBjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKworCS8qCisJICogbWFwcGVkIHdlbGwsIHNlbmQgaXQgb2ZmCisJICovCisJaWYgKGxpa2VseShjb3VudCA8PSBjbWQtPnVzZV9zZykpIHsKKwkJY21kLT51c2Vfc2cgPSBjb3VudDsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbnVtYmVyIG9mIHNlZ21lbnRzIGFmdGVyIGJ1aWxkaW5nIGxpc3RcbiIpOworCXByaW50ayhLRVJOX0VSUiAiY291bnRlZCAlZCwgcmVjZWl2ZWQgJWRcbiIsIGNvdW50LCBjbWQtPnVzZV9zZyk7CisJcHJpbnRrKEtFUk5fRVJSICJyZXEgbnJfc2VjICVsdSwgY3VyX25yX3NlYyAldVxuIiwgcmVxLT5ucl9zZWN0b3JzLAorCQkJcmVxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCisJLyogcmVsZWFzZSB0aGUgY29tbWFuZCBhbmQga2lsbCBpdCAqLworCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CisJc2NzaV9wdXRfY29tbWFuZChjbWQpOworCXJldHVybiBCTEtQUkVQX0tJTEw7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9wcmVwYXJlX2ZsdXNoX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKKworCWlmIChzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfUlVOTklORykgeworCQlkcnYgPSAqKHN0cnVjdCBzY3NpX2RyaXZlciAqKikgcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKworCQlpZiAoZHJ2LT5wcmVwYXJlX2ZsdXNoKQorCQkJcmV0dXJuIGRydi0+cHJlcGFyZV9mbHVzaChxLCBycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjc2lfZW5kX2ZsdXNoX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqZmx1c2hfcnEgPSBycS0+ZW5kX2lvX2RhdGE7CisJc3RydWN0IHNjc2lfZHJpdmVyICpkcnY7CisKKwlpZiAoZmx1c2hfcnEtPmVycm9ycykgeworCQlwcmludGsoInNjc2k6IGJhcnJpZXIgZXJyb3IsIGRpc2FibGluZyBmbHVzaCBzdXBwb3J0XG4iKTsKKwkJYmxrX3F1ZXVlX29yZGVyZWQocSwgUVVFVUVfT1JERVJFRF9OT05FKTsKKwl9CisKKwlpZiAoc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX1JVTk5JTkcpIHsKKwkJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopIHJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCWRydi0+ZW5kX2ZsdXNoKHEsIHJxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9pc3N1ZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorCQkJICAgICAgIHNlY3Rvcl90ICplcnJvcl9zZWN0b3IpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBzY3NpX2RyaXZlciAqZHJ2OworCisJaWYgKHNkZXYtPnNkZXZfc3RhdGUgIT0gU0RFVl9SVU5OSU5HKQorCQlyZXR1cm4gLUVOWElPOworCisJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopIGRpc2stPnByaXZhdGVfZGF0YTsKKwlpZiAoZHJ2LT5pc3N1ZV9mbHVzaCkKKwkJcmV0dXJuIGRydi0+aXNzdWVfZmx1c2goJnNkZXYtPnNkZXZfZ2VuZGV2LCBlcnJvcl9zZWN0b3IpOworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IHNjc2lfcHJlcF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCWludCBzcGVjaWFsc19vbmx5ID0gMDsKKworCS8qCisJICogSnVzdCBjaGVjayB0byBzZWUgaWYgdGhlIGRldmljZSBpcyBvbmxpbmUuICBJZiBpdCBpc24ndCwgd2UKKwkgKiByZWZ1c2UgdG8gcHJvY2VzcyBhbnkgY29tbWFuZHMuICBUaGUgZGV2aWNlIG11c3QgYmUgYnJvdWdodAorCSAqIG9ubGluZSBiZWZvcmUgdHJ5aW5nIGFueSByZWNvdmVyeSBjb21tYW5kcworCSAqLworCWlmICh1bmxpa2VseSghc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNjc2klZCAoJWQ6JWQpOiByZWplY3RpbmcgSS9PIHRvIG9mZmxpbmUgZGV2aWNlXG4iLAorCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJCXJldHVybiBCTEtQUkVQX0tJTEw7CisJfQorCWlmICh1bmxpa2VseShzZGV2LT5zZGV2X3N0YXRlICE9IFNERVZfUlVOTklORykpIHsKKwkJLyogT0ssIHdlJ3JlIG5vdCBpbiBhIHJ1bm5pbmcgc3RhdGUgZG9uJ3QgcHJlcAorCQkgKiB1c2VyIGNvbW1hbmRzICovCisJCWlmIChzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfREVMKSB7CisJCQkvKiBEZXZpY2UgaXMgZnVsbHkgZGVsZXRlZCwgbm8gY29tbWFuZHMKKwkJCSAqIGF0IGFsbCBhbGxvd2VkIGRvd24gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkICglZDolZCk6IHJlamVjdGluZyBJL08gdG8gZGVhZCBkZXZpY2VcbiIsCisJCQkgICAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJCQlyZXR1cm4gQkxLUFJFUF9LSUxMOworCQl9CisJCS8qIE9LLCB3ZSBvbmx5IGFsbG93IHNwZWNpYWwgY29tbWFuZHMgKGkuZS4gbm90CisJCSAqIHVzZXIgaW5pdGlhdGVkIG9uZXMgKi8KKwkJc3BlY2lhbHNfb25seSA9IHNkZXYtPnNkZXZfc3RhdGU7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBhY3R1YWwgZGV2aWNlIGRyaXZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kLgorCSAqIFRoZSBTUEVDSUFMIHJlcXVlc3RzIGFyZSB0aGluZ3MgbGlrZSBjaGFyYWN0ZXIgZGV2aWNlIG9yCisJICogaW9jdGxzLCB3aGljaCBkaWQgbm90IG9yaWdpbmF0ZSBmcm9tIGxsX3J3X2Jsay4gIE5vdGUgdGhhdAorCSAqIHRoZSBzcGVjaWFsIGZpZWxkIGlzIGFsc28gdXNlZCB0byBpbmRpY2F0ZSB0aGUgY21kIGZvcgorCSAqIHRoZSByZW1haW5kZXIgb2YgYSBwYXJ0aWFsbHkgZnVsZmlsbGVkIHJlcXVlc3QgdGhhdCBjYW4gCisJICogY29tZSB1cCB3aGVuIHRoZXJlIGlzIGEgbWVkaXVtIGVycm9yLiAgV2UgaGF2ZSB0byB0cmVhdAorCSAqIHRoZXNlIHR3byBjYXNlcyBkaWZmZXJlbnRseS4gIFdlIGRpZmZlcmVudGlhdGUgYnkgbG9va2luZworCSAqIGF0IHJlcXVlc3QtPmNtZCwgYXMgdGhpcyB0ZWxscyB1cyB0aGUgcmVhbCBzdG9yeS4KKwkgKi8KKwlpZiAocmVxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSB7CisJCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSByZXEtPnNwZWNpYWw7CisKKwkJaWYgKHNyZXEtPnNyX21hZ2ljID09IFNDU0lfUkVRX01BR0lDKSB7CisJCQljbWQgPSBzY3NpX2dldF9jb21tYW5kKHNyZXEtPnNyX2RldmljZSwgR0ZQX0FUT01JQyk7CisJCQlpZiAodW5saWtlbHkoIWNtZCkpCisJCQkJZ290byBkZWZlcjsKKwkJCXNjc2lfaW5pdF9jbWRfZnJvbV9yZXEoY21kLCBzcmVxKTsKKwkJfSBlbHNlCisJCQljbWQgPSByZXEtPnNwZWNpYWw7CisJfSBlbHNlIGlmIChyZXEtPmZsYWdzICYgKFJFUV9DTUQgfCBSRVFfQkxPQ0tfUEMpKSB7CisKKwkJaWYodW5saWtlbHkoc3BlY2lhbHNfb25seSkpIHsKKwkJCWlmKHNwZWNpYWxzX29ubHkgPT0gU0RFVl9RVUlFU0NFIHx8CisJCQkJCXNwZWNpYWxzX29ubHkgPT0gU0RFVl9CTE9DSykKKwkJCQlyZXR1cm4gQkxLUFJFUF9ERUZFUjsKKwkJCQorCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKTogcmVqZWN0aW5nIEkvTyB0byBkZXZpY2UgYmVpbmcgcmVtb3ZlZFxuIiwKKwkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKKwkJCXJldHVybiBCTEtQUkVQX0tJTEw7CisJCX0KKwkJCQorCQkJCisJCS8qCisJCSAqIE5vdyB0cnkgYW5kIGZpbmQgYSBjb21tYW5kIGJsb2NrIHRoYXQgd2UgY2FuIHVzZS4KKwkJICovCisJCWlmICghcmVxLT5zcGVjaWFsKSB7CisJCQljbWQgPSBzY3NpX2dldF9jb21tYW5kKHNkZXYsIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KCFjbWQpKQorCQkJCWdvdG8gZGVmZXI7CisJCX0gZWxzZQorCQkJY21kID0gcmVxLT5zcGVjaWFsOworCQkKKwkJLyogcHVsbCBhIHRhZyBvdXQgb2YgdGhlIHJlcXVlc3QgaWYgd2UgaGF2ZSBvbmUgKi8KKwkJY21kLT50YWcgPSByZXEtPnRhZzsKKwl9IGVsc2UgeworCQlibGtfZHVtcF9ycV9mbGFncyhyZXEsICJTQ1NJIGJhZCByZXEiKTsKKwkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwl9CisJCisJLyogbm90ZSB0aGUgb3ZlcmxvYWRpbmcgb2YgcmVxLT5zcGVjaWFsLiAgV2hlbiB0aGUgdGFnCisJICogaXMgYWN0aXZlIGl0IGFsd2F5cyBtZWFucyBjbWQuICBJZiB0aGUgdGFnIGdvZXMKKwkgKiBiYWNrIGZvciByZS1xdWV1ZWluZywgaXQgbWF5IGJlIHJlc2V0ICovCisJcmVxLT5zcGVjaWFsID0gY21kOworCWNtZC0+cmVxdWVzdCA9IHJlcTsKKwkKKwkvKgorCSAqIEZJWE1FOiBkcm9wIHRoZSBsb2NrIGhlcmUgYmVjYXVzZSB0aGUgZnVuY3Rpb25zIGJlbG93CisJICogZXhwZWN0IHRvIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBxdWV1ZSBsb2NrIGhlbGQuICBBbHNvLAorCSAqIHByZXZpb3VzbHksIHdlIGRlcXVldWVkIHRoZSByZXF1ZXN0IGJlZm9yZSBkcm9wcGluZyB0aGUKKwkgKiBsb2NrLiAgV2UgaG9wZSBSRVFfU1RBUlRFRCBwcmV2ZW50cyBhbnl0aGluZyB1bnRvd2FyZCBmcm9tCisJICogaGFwcGVuaW5nIG5vdy4KKwkgKi8KKwlpZiAocmVxLT5mbGFncyAmIChSRVFfQ01EIHwgUkVRX0JMT0NLX1BDKSkgeworCQlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRydjsKKwkJaW50IHJldDsKKworCQkvKgorCQkgKiBUaGlzIHdpbGwgZG8gYSBjb3VwbGUgb2YgdGhpbmdzOgorCQkgKiAgMSkgRmlsbCBpbiB0aGUgYWN0dWFsIFNDU0kgY29tbWFuZC4KKwkJICogIDIpIEZpbGwgaW4gYW55IG90aGVyIHVwcGVyLWxldmVsIHNwZWNpZmljIGZpZWxkcworCQkgKiAodGltZW91dCkuCisJCSAqCisJCSAqIElmIHRoaXMgcmV0dXJucyAwLCBpdCBtZWFucyB0aGF0IHRoZSByZXF1ZXN0IGZhaWxlZAorCQkgKiAocmVhZGluZyBwYXN0IGVuZCBvZiBkaXNrLCByZWFkaW5nIG9mZmxpbmUgZGV2aWNlLAorCQkgKiBldGMpLiAgIFRoaXMgd29uJ3QgYWN0dWFsbHkgdGFsayB0byB0aGUgZGV2aWNlLCBidXQKKwkJICogc29tZSBraW5kcyBvZiBjb25zaXN0ZW5jeSBjaGVja2luZyBtYXkgY2F1c2UgdGhlCQorCQkgKiByZXF1ZXN0IHRvIGJlIHJlamVjdGVkIGltbWVkaWF0ZWx5LgorCQkgKi8KKworCQkvKiAKKwkJICogVGhpcyBzZXRzIHVwIHRoZSBzY2F0dGVyLWdhdGhlciB0YWJsZSAoYWxsb2NhdGluZyBpZgorCQkgKiByZXF1aXJlZCkuCisJCSAqLworCQlyZXQgPSBzY3NpX2luaXRfaW8oY21kKTsKKwkJaWYgKHJldCkJLyogQkxLUFJFUF9LSUxMIHJldHVybiBhbHNvIHJlbGVhc2VzIHRoZSBjb21tYW5kICovCisJCQlyZXR1cm4gcmV0OworCQkKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgYWN0dWFsIFNDU0kgY29tbWFuZCBmb3IgdGhpcyByZXF1ZXN0LgorCQkgKi8KKwkJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCWlmICh1bmxpa2VseSghZHJ2LT5pbml0X2NvbW1hbmQoY21kKSkpIHsKKwkJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CisJCQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CisJCQlyZXR1cm4gQkxLUFJFUF9LSUxMOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgcmVxdWVzdCBpcyBub3cgcHJlcHBlZCwgbm8gbmVlZCB0byBjb21lIGJhY2sgaGVyZQorCSAqLworCXJlcS0+ZmxhZ3MgfD0gUkVRX0RPTlRQUkVQOworCXJldHVybiBCTEtQUkVQX09LOworCisgZGVmZXI6CisJLyogSWYgd2UgZGVmZXIsIHRoZSBlbHZfbmV4dF9yZXF1ZXN0KCkgcmV0dXJucyBOVUxMLCBidXQgdGhlCisJICogcXVldWUgbXVzdCBiZSByZXN0YXJ0ZWQsIHNvIHdlIHBsdWcgaGVyZSBpZiBubyByZXR1cm5pbmcKKwkgKiBjb21tYW5kIHdpbGwgYXV0b21hdGljYWxseSBkbyB0aGF0LiAqLworCWlmIChzZGV2LT5kZXZpY2VfYnVzeSA9PSAwKQorCQlibGtfcGx1Z19kZXZpY2UocSk7CisJcmV0dXJuIEJMS1BSRVBfREVGRVI7Cit9CisKKy8qCisgKiBzY3NpX2Rldl9xdWV1ZV9yZWFkeTogaWYgd2UgY2FuIHNlbmQgcmVxdWVzdHMgdG8gc2RldiwgcmV0dXJuIDEgZWxzZQorICogcmV0dXJuIDAuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIHF1ZXVlX2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2NzaV9kZXZfcXVldWVfcmVhZHkoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYgKHNkZXYtPmRldmljZV9idXN5ID49IHNkZXYtPnF1ZXVlX2RlcHRoKQorCQlyZXR1cm4gMDsKKwlpZiAoc2Rldi0+ZGV2aWNlX2J1c3kgPT0gMCAmJiBzZGV2LT5kZXZpY2VfYmxvY2tlZCkgeworCQkvKgorCQkgKiB1bmJsb2NrIGFmdGVyIGRldmljZV9ibG9ja2VkIGl0ZXJhdGVzIHRvIHplcm8KKwkJICovCisJCWlmICgtLXNkZXYtPmRldmljZV9ibG9ja2VkID09IDApIHsKKwkJCVNDU0lfTE9HX01MUVVFVUUoMywKKwkJCQlwcmludGsoInNjc2klZCAoJWQ6JWQpIHVuYmxvY2tpbmcgZGV2aWNlIGF0IgorCQkJCSAgICAgICAiIHplcm8gZGVwdGhcbiIsIHNkZXYtPmhvc3QtPmhvc3Rfbm8sCisJCQkJICAgICAgIHNkZXYtPmlkLCBzZGV2LT5sdW4pKTsKKwkJfSBlbHNlIHsKKwkJCWJsa19wbHVnX2RldmljZShxKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChzZGV2LT5kZXZpY2VfYmxvY2tlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHNjc2lfaG9zdF9xdWV1ZV9yZWFkeTogaWYgd2UgY2FuIHNlbmQgcmVxdWVzdHMgdG8gc2hvc3QsIHJldHVybiAxIGVsc2UKKyAqIHJldHVybiAwLiBXZSBtdXN0IGVuZCB1cCBydW5uaW5nIHRoZSBxdWV1ZSBhZ2FpbiB3aGVuZXZlciAwIGlzCisgKiByZXR1cm5lZCwgZWxzZSBJTyBjYW4gaGFuZy4KKyAqCisgKiBDYWxsZWQgd2l0aCBob3N0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2NzaV9ob3N0X3F1ZXVlX3JlYWR5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSAgIHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCSAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlpZiAodGVzdF9iaXQoU0hPU1RfUkVDT1ZFUlksICZzaG9zdC0+c2hvc3Rfc3RhdGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoc2hvc3QtPmhvc3RfYnVzeSA9PSAwICYmIHNob3N0LT5ob3N0X2Jsb2NrZWQpIHsKKwkJLyoKKwkJICogdW5ibG9jayBhZnRlciBob3N0X2Jsb2NrZWQgaXRlcmF0ZXMgdG8gemVybworCQkgKi8KKwkJaWYgKC0tc2hvc3QtPmhvc3RfYmxvY2tlZCA9PSAwKSB7CisJCQlTQ1NJX0xPR19NTFFVRVVFKDMsCisJCQkJcHJpbnRrKCJzY3NpJWQgdW5ibG9ja2luZyBob3N0IGF0IHplcm8gZGVwdGhcbiIsCisJCQkJCXNob3N0LT5ob3N0X25vKSk7CisJCX0gZWxzZSB7CisJCQlibGtfcGx1Z19kZXZpY2UocSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoKHNob3N0LT5jYW5fcXVldWUgPiAwICYmIHNob3N0LT5ob3N0X2J1c3kgPj0gc2hvc3QtPmNhbl9xdWV1ZSkgfHwKKwkgICAgc2hvc3QtPmhvc3RfYmxvY2tlZCB8fCBzaG9zdC0+aG9zdF9zZWxmX2Jsb2NrZWQpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJnNkZXYtPnN0YXJ2ZWRfZW50cnkpKQorCQkJbGlzdF9hZGRfdGFpbCgmc2Rldi0+c3RhcnZlZF9lbnRyeSwgJnNob3N0LT5zdGFydmVkX2xpc3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSdyZSBPSyB0byBwcm9jZXNzIHRoZSBjb21tYW5kLCBzbyB3ZSBjYW4ndCBiZSBzdGFydmVkICovCisJaWYgKCFsaXN0X2VtcHR5KCZzZGV2LT5zdGFydmVkX2VudHJ5KSkKKwkJbGlzdF9kZWxfaW5pdCgmc2Rldi0+c3RhcnZlZF9lbnRyeSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEtpbGwgcmVxdWVzdHMgZm9yIGEgZGVhZCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgc2NzaV9raWxsX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7CisJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKKwkJcmVxLT5mbGFncyB8PSBSRVFfUVVJRVQ7CisJCXdoaWxlIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJlcSwgMCwgcmVxLT5ucl9zZWN0b3JzKSkKKwkJCTsKKwkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJlcSk7CisJfQorfQorCisvKgorICogRnVuY3Rpb246ICAgIHNjc2lfcmVxdWVzdF9mbigpCisgKgorICogUHVycG9zZTogICAgIE1haW4gc3RyYXRlZ3kgcm91dGluZSBmb3IgU0NTSS4KKyAqCisgKiBBcmd1bWVudHM6ICAgcSAgICAgICAtIFBvaW50ZXIgdG8gYWN0dWFsIHF1ZXVlLgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTG9jayBzdGF0dXM6IElPIHJlcXVlc3QgbG9jayBhc3N1bWVkIHRvIGJlIGhlbGQgd2hlbiBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfcmVxdWVzdF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwlpZiAoIXNkZXYpIHsKKwkJcHJpbnRrKCJzY3NpOiBraWxsaW5nIHJlcXVlc3RzIGZvciBkZWFkIHF1ZXVlXG4iKTsKKwkJc2NzaV9raWxsX3JlcXVlc3RzKHEpOworCQlyZXR1cm47CisJfQorCisJaWYoIWdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KSkKKwkJLyogV2UgbXVzdCBiZSB0ZWFyaW5nIHRoZSBibG9jayBxdWV1ZSBkb3duIGFscmVhZHkgKi8KKwkJcmV0dXJuOworCisJLyoKKwkgKiBUbyBzdGFydCB3aXRoLCB3ZSBrZWVwIGxvb3BpbmcgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LCBvciB1bnRpbAorCSAqIHRoZSBob3N0IGlzIG5vIGxvbmdlciBhYmxlIHRvIGFjY2VwdCBhbnkgbW9yZSByZXF1ZXN0cy4KKwkgKi8KKwlzaG9zdCA9IHNkZXYtPmhvc3Q7CisJd2hpbGUgKCFibGtfcXVldWVfcGx1Z2dlZChxKSkgeworCQlpbnQgcnRuOworCQkvKgorCQkgKiBnZXQgbmV4dCBxdWV1ZWFibGUgcmVxdWVzdC4gIFdlIGRvIHRoaXMgZWFybHkgdG8gbWFrZSBzdXJlCisJCSAqIHRoYXQgdGhlIHJlcXVlc3QgaXMgZnVsbHkgcHJlcGFyZWQgZXZlbiBpZiB3ZSBjYW5ub3QgCisJCSAqIGFjY2VwdCBpdC4KKwkJICovCisJCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJCWlmICghcmVxIHx8ICFzY3NpX2Rldl9xdWV1ZV9yZWFkeShxLCBzZGV2KSkKKwkJCWJyZWFrOworCisJCWlmICh1bmxpa2VseSghc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgKCVkOiVkKTogcmVqZWN0aW5nIEkvTyB0byBvZmZsaW5lIGRldmljZVxuIiwKKwkJCSAgICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKKwkJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKKwkJCXJlcS0+ZmxhZ3MgfD0gUkVRX1FVSUVUOworCQkJd2hpbGUgKGVuZF90aGF0X3JlcXVlc3RfZmlyc3QocmVxLCAwLCByZXEtPm5yX3NlY3RvcnMpKQorCQkJCTsKKwkJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCQkJY29udGludWU7CisJCX0KKworCisJCS8qCisJCSAqIFJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0IGxpc3QuCisJCSAqLworCQlpZiAoIShibGtfcXVldWVfdGFnZ2VkKHEpICYmICFibGtfcXVldWVfc3RhcnRfdGFnKHEsIHJlcSkpKQorCQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQlzZGV2LT5kZXZpY2VfYnVzeSsrOworCisJCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOworCQlzcGluX2xvY2soc2hvc3QtPmhvc3RfbG9jayk7CisKKwkJaWYgKCFzY3NpX2hvc3RfcXVldWVfcmVhZHkocSwgc2hvc3QsIHNkZXYpKQorCQkJZ290byBub3RfcmVhZHk7CisJCWlmIChzZGV2LT5zaW5nbGVfbHVuKSB7CisJCQlpZiAoc2NzaV90YXJnZXQoc2RldiktPnN0YXJnZXRfc2Rldl91c2VyICYmCisJCQkgICAgc2NzaV90YXJnZXQoc2RldiktPnN0YXJnZXRfc2Rldl91c2VyICE9IHNkZXYpCisJCQkJZ290byBub3RfcmVhZHk7CisJCQlzY3NpX3RhcmdldChzZGV2KS0+c3RhcmdldF9zZGV2X3VzZXIgPSBzZGV2OworCQl9CisJCXNob3N0LT5ob3N0X2J1c3krKzsKKworCQkvKgorCQkgKiBYWFgoaGNoKTogVGhpcyBpcyByYXRoZXIgc3Vib3B0aW1hbCwgc2NzaV9kaXNwYXRjaF9jbWQgd2lsbAorCQkgKgkJdGFrZSB0aGUgbG9jayBhZ2Fpbi4KKwkJICovCisJCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKKworCQljbWQgPSByZXEtPnNwZWNpYWw7CisJCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgImltcG9zc2libGUgcmVxdWVzdCBpbiAlcy5cbiIKKwkJCQkJICJwbGVhc2UgbWFpbCBhIHN0YWNrIHRyYWNlIHRvICIKKwkJCQkJICJsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZyIsCisJCQkJCSBfX0ZVTkNUSU9OX18pOworCQkJQlVHKCk7CisJCX0KKworCQkvKgorCQkgKiBGaW5hbGx5LCBpbml0aWFsaXplIGFueSBlcnJvciBoYW5kbGluZyBwYXJhbWV0ZXJzLCBhbmQgc2V0IHVwCisJCSAqIHRoZSB0aW1lcnMgZm9yIHRpbWVvdXRzLgorCQkgKi8KKwkJc2NzaV9pbml0X2NtZF9lcnJoKGNtZCk7CisKKwkJLyoKKwkJICogRGlzcGF0Y2ggdGhlIGNvbW1hbmQgdG8gdGhlIGxvdy1sZXZlbCBkcml2ZXIuCisJCSAqLworCQlydG4gPSBzY3NpX2Rpc3BhdGNoX2NtZChjbWQpOworCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCQlpZihydG4pIHsKKwkJCS8qIHdlJ3JlIHJlZnVzaW5nIHRoZSBjb21tYW5kOyBiZWNhdXNlIG9mCisJCQkgKiB0aGUgd2F5IGxvY2tzIGdldCBkcm9wcGVkLCB3ZSBuZWVkIHRvIAorCQkJICogY2hlY2sgaGVyZSBpZiBwbHVnZ2luZyBpcyByZXF1aXJlZCAqLworCQkJaWYoc2Rldi0+ZGV2aWNlX2J1c3kgPT0gMCkKKwkJCQlibGtfcGx1Z19kZXZpY2UocSk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJZ290byBvdXQ7CisKKyBub3RfcmVhZHk6CisJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCisJLyoKKwkgKiBsb2NrIHEsIGhhbmRsZSB0YWcsIHJlcXVldWUgcmVxLCBhbmQgZGVjcmVtZW50IGRldmljZV9idXN5LiBXZQorCSAqIG11c3QgcmV0dXJuIHdpdGggcXVldWVfbG9jayBoZWxkLgorCSAqCisJICogRGVjcmVtZW50aW5nIGRldmljZV9idXN5IHdpdGhvdXQgY2hlY2tpbmcgaXQgaXMgT0ssIGFzIGFsbCBzdWNoCisJICogY2FzZXMgKGhvc3QgbGltaXRzIG9yIHNldHRpbmdzKSBzaG91bGQgcnVuIHRoZSBxdWV1ZSBhdCBzb21lCisJICogbGF0ZXIgdGltZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCWJsa19yZXF1ZXVlX3JlcXVlc3QocSwgcmVxKTsKKwlzZGV2LT5kZXZpY2VfYnVzeS0tOworCWlmKHNkZXYtPmRldmljZV9idXN5ID09IDApCisJCWJsa19wbHVnX2RldmljZShxKTsKKyBvdXQ6CisJLyogbXVzdCBiZSBjYXJlZnVsIGhlcmUuLi5pZiB3ZSB0cmlnZ2VyIHRoZSAtPnJlbW92ZSgpIGZ1bmN0aW9uCisJICogd2UgY2Fubm90IGJlIGhvbGRpbmcgdGhlIHEgbG9jayAqLworCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKK30KKwordTY0IHNjc2lfY2FsY3VsYXRlX2JvdW5jZV9saW1pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpob3N0X2RldjsKKwl1NjQgYm91bmNlX2xpbWl0ID0gMHhmZmZmZmZmZjsKKworCWlmIChzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpCisJCXJldHVybiBCTEtfQk9VTkNFX0lTQTsKKwkvKgorCSAqIFBsYXRmb3JtcyB3aXRoIHZpcnR1YWwtRE1BIHRyYW5zbGF0aW9uCisJICogaGFyZHdhcmUgaGF2ZSBubyBwcmFjdGljYWwgbGltaXQuCisJICovCisJaWYgKCFQQ0lfRE1BX0JVU19JU19QSFlTKQorCQlyZXR1cm4gQkxLX0JPVU5DRV9BTlk7CisKKwlob3N0X2RldiA9IHNjc2lfZ2V0X2RldmljZShzaG9zdCk7CisJaWYgKGhvc3RfZGV2ICYmIGhvc3RfZGV2LT5kbWFfbWFzaykKKwkJYm91bmNlX2xpbWl0ID0gKmhvc3RfZGV2LT5kbWFfbWFzazsKKworCXJldHVybiBib3VuY2VfbGltaXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfY2FsY3VsYXRlX2JvdW5jZV9saW1pdCk7CisKK3N0cnVjdCByZXF1ZXN0X3F1ZXVlICpzY3NpX2FsbG9jX3F1ZXVlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CisKKwlxID0gYmxrX2luaXRfcXVldWUoc2NzaV9yZXF1ZXN0X2ZuLCAmc2Rldi0+c2Rldl9sb2NrKTsKKwlpZiAoIXEpCisJCXJldHVybiBOVUxMOworCisJYmxrX3F1ZXVlX3ByZXBfcnEocSwgc2NzaV9wcmVwX2ZuKTsKKworCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgc2hvc3QtPnNnX3RhYmxlc2l6ZSk7CisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMpOworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBzaG9zdC0+bWF4X3NlY3RvcnMpOworCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KHNob3N0KSk7CisJYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkocSwgc2hvc3QtPmRtYV9ib3VuZGFyeSk7CisJYmxrX3F1ZXVlX2lzc3VlX2ZsdXNoX2ZuKHEsIHNjc2lfaXNzdWVfZmx1c2hfZm4pOworCisJLyoKKwkgKiBvcmRlcmVkIHRhZ3MgYXJlIHN1cGVyaW9yIHRvIGZsdXNoIG9yZGVyaW5nCisJICovCisJaWYgKHNob3N0LT5vcmRlcmVkX3RhZykKKwkJYmxrX3F1ZXVlX29yZGVyZWQocSwgUVVFVUVfT1JERVJFRF9UQUcpOworCWVsc2UgaWYgKHNob3N0LT5vcmRlcmVkX2ZsdXNoKSB7CisJCWJsa19xdWV1ZV9vcmRlcmVkKHEsIFFVRVVFX09SREVSRURfRkxVU0gpOworCQlxLT5wcmVwYXJlX2ZsdXNoX2ZuID0gc2NzaV9wcmVwYXJlX2ZsdXNoX2ZuOworCQlxLT5lbmRfZmx1c2hfZm4gPSBzY3NpX2VuZF9mbHVzaF9mbjsKKwl9CisKKwlpZiAoIXNob3N0LT51c2VfY2x1c3RlcmluZykKKwkJY2xlYXJfYml0KFFVRVVFX0ZMQUdfQ0xVU1RFUiwgJnEtPnF1ZXVlX2ZsYWdzKTsKKwlyZXR1cm4gcTsKK30KKwordm9pZCBzY3NpX2ZyZWVfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJYmxrX2NsZWFudXBfcXVldWUocSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9ibG9ja19yZXF1ZXN0cygpCisgKgorICogUHVycG9zZTogICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBsb3ctbGV2ZWwgZHJpdmVycyB0byBwcmV2ZW50IGZ1cnRoZXIKKyAqCQljb21tYW5kcyBmcm9tIGJlaW5nIHF1ZXVlZCB0byB0aGUgZGV2aWNlLgorICoKKyAqIEFyZ3VtZW50czogICBzaG9zdCAgICAgICAtIEhvc3QgaW4gcXVlc3Rpb24KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZworICoKKyAqIExvY2sgc3RhdHVzOiBObyBsb2NrcyBhcmUgYXNzdW1lZCBoZWxkLgorICoKKyAqIE5vdGVzOiAgICAgICBUaGVyZSBpcyBubyB0aW1lciBub3IgYW55IG90aGVyIG1lYW5zIGJ5IHdoaWNoIHRoZSByZXF1ZXN0cworICoJCWdldCB1bmJsb2NrZWQgb3RoZXIgdGhhbiB0aGUgbG93LWxldmVsIGRyaXZlciBjYWxsaW5nCisgKgkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKCkuCisgKi8KK3ZvaWQgc2NzaV9ibG9ja19yZXF1ZXN0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzaG9zdC0+aG9zdF9zZWxmX2Jsb2NrZWQgPSAxOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2Jsb2NrX3JlcXVlc3RzKTsKKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3VuYmxvY2tfcmVxdWVzdHMoKQorICoKKyAqIFB1cnBvc2U6ICAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgbG93LWxldmVsIGRyaXZlcnMgdG8gYWxsb3cgZnVydGhlcgorICoJCWNvbW1hbmRzIGZyb20gYmVpbmcgcXVldWVkIHRvIHRoZSBkZXZpY2UuCisgKgorICogQXJndW1lbnRzOiAgIHNob3N0ICAgICAgIC0gSG9zdCBpbiBxdWVzdGlvbgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTG9jayBzdGF0dXM6IE5vIGxvY2tzIGFyZSBhc3N1bWVkIGhlbGQuCisgKgorICogTm90ZXM6ICAgICAgIFRoZXJlIGlzIG5vIHRpbWVyIG5vciBhbnkgb3RoZXIgbWVhbnMgYnkgd2hpY2ggdGhlIHJlcXVlc3RzCisgKgkJZ2V0IHVuYmxvY2tlZCBvdGhlciB0aGFuIHRoZSBsb3ctbGV2ZWwgZHJpdmVyIGNhbGxpbmcKKyAqCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoKS4KKyAqCisgKgkJVGhpcyBpcyBkb25lIGFzIGFuIEFQSSBmdW5jdGlvbiBzbyB0aGF0IGNoYW5nZXMgdG8gdGhlCisgKgkJaW50ZXJuYWxzIG9mIHRoZSBzY3NpIG1pZC1sYXllciB3b24ndCByZXF1aXJlIHdob2xlc2FsZQorICoJCWNoYW5nZXMgdG8gZHJpdmVycyB0aGF0IHVzZSB0aGlzIGZlYXR1cmUuCisgKi8KK3ZvaWQgc2NzaV91bmJsb2NrX3JlcXVlc3RzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXNob3N0LT5ob3N0X3NlbGZfYmxvY2tlZCA9IDA7CisJc2NzaV9ydW5faG9zdF9xdWV1ZXMoc2hvc3QpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3VuYmxvY2tfcmVxdWVzdHMpOworCitpbnQgX19pbml0IHNjc2lfaW5pdF9xdWV1ZSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNHX01FTVBPT0xfTlI7IGkrKykgeworCQlzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgKnNncCA9IHNjc2lfc2dfcG9vbHMgKyBpOworCQlpbnQgc2l6ZSA9IHNncC0+c2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpOworCisJCXNncC0+c2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKHNncC0+bmFtZSwgc2l6ZSwgMCwKKwkJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCQlpZiAoIXNncC0+c2xhYikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTQ1NJOiBjYW4ndCBpbml0IHNnIHNsYWIgJXNcbiIsCisJCQkJCXNncC0+bmFtZSk7CisJCX0KKworCQlzZ3AtPnBvb2wgPSBtZW1wb29sX2NyZWF0ZShTR19NRU1QT09MX1NJWkUsCisJCQkJbWVtcG9vbF9hbGxvY19zbGFiLCBtZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQlzZ3AtPnNsYWIpOworCQlpZiAoIXNncC0+cG9vbCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTQ1NJOiBjYW4ndCBpbml0IHNnIG1lbXBvb2wgJXNcbiIsCisJCQkJCXNncC0+bmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY3NpX2V4aXRfcXVldWUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTR19NRU1QT09MX05SOyBpKyspIHsKKwkJc3RydWN0IHNjc2lfaG9zdF9zZ19wb29sICpzZ3AgPSBzY3NpX3NnX3Bvb2xzICsgaTsKKwkJbWVtcG9vbF9kZXN0cm95KHNncC0+cG9vbCk7CisJCWttZW1fY2FjaGVfZGVzdHJveShzZ3AtPnNsYWIpOworCX0KK30KKy8qKgorICoJX19zY3NpX21vZGVfc2Vuc2UgLSBpc3N1ZSBhIG1vZGUgc2Vuc2UsIGZhbGxpbmcgYmFjayBmcm9tIDEwIHRvIAorICoJCXNpeCBieXRlcyBpZiBuZWNlc3NhcnkuCisgKglAc3JlcToJU0NTSSByZXF1ZXN0IHRvIGZpbGwgaW4gd2l0aCB0aGUgTU9ERV9TRU5TRQorICoJQGRiZDoJc2V0IGlmIG1vZGUgc2Vuc2Ugd2lsbCBhbGxvdyBibG9jayBkZXNjcmlwdG9ycyB0byBiZSByZXR1cm5lZAorICoJQG1vZGVwYWdlOiBtb2RlIHBhZ2UgYmVpbmcgcmVxdWVzdGVkCisgKglAYnVmZmVyOiByZXF1ZXN0IGJ1ZmZlciAobWF5IG5vdCBiZSBzbWFsbGVyIHRoYW4gZWlnaHQgYnl0ZXMpCisgKglAbGVuOglsZW5ndGggb2YgcmVxdWVzdCBidWZmZXIuCisgKglAdGltZW91dDogY29tbWFuZCB0aW1lb3V0CisgKglAcmV0cmllczogbnVtYmVyIG9mIHJldHJpZXMgYmVmb3JlIGZhaWxpbmcKKyAqCUBkYXRhOiByZXR1cm5zIGEgc3RydWN0dXJlIGFic3RyYWN0aW5nIHRoZSBtb2RlIGhlYWRlciBkYXRhCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCwgb3IgdGhlIGhlYWRlciBvZmZzZXQgKGVpdGhlciA0CisgKglvciA4IGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgc2l4IG9yIHRlbiBieXRlIGNvbW1hbmQgd2FzCisgKglpc3N1ZWQpIGlmIHN1Y2Nlc3NmdWwuCisgKiovCitpbnQKK19fc2NzaV9tb2RlX3NlbnNlKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGludCBkYmQsIGludCBtb2RlcGFnZSwKKwkJICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKKwkJICBzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgKmRhdGEpIHsKKwl1bnNpZ25lZCBjaGFyIGNtZFsxMl07CisJaW50IHVzZV8xMF9mb3JfbXM7CisJaW50IGhlYWRlcl9sZW5ndGg7CisKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisJbWVtc2V0KCZjbWRbMF0sIDAsIDEyKTsKKwljbWRbMV0gPSBkYmQgJiAweDE4OwkvKiBhbGxvd3MgREJEIGFuZCBMTEJBIGJpdHMgKi8KKwljbWRbMl0gPSBtb2RlcGFnZTsKKworIHJldHJ5OgorCXVzZV8xMF9mb3JfbXMgPSBzcmVxLT5zcl9kZXZpY2UtPnVzZV8xMF9mb3JfbXM7CisKKwlpZiAodXNlXzEwX2Zvcl9tcykgeworCQlpZiAobGVuIDwgOCkKKwkJCWxlbiA9IDg7CisKKwkJY21kWzBdID0gTU9ERV9TRU5TRV8xMDsKKwkJY21kWzhdID0gbGVuOworCQloZWFkZXJfbGVuZ3RoID0gODsKKwl9IGVsc2UgeworCQlpZiAobGVuIDwgNCkKKwkJCWxlbiA9IDQ7CisKKwkJY21kWzBdID0gTU9ERV9TRU5TRTsKKwkJY21kWzRdID0gbGVuOworCQloZWFkZXJfbGVuZ3RoID0gNDsKKwl9CisKKwlzcmVxLT5zcl9jbWRfbGVuID0gMDsKKwltZW1zZXQoc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyLCAwLCBzaXplb2Yoc3JlcS0+c3Jfc2Vuc2VfYnVmZmVyKSk7CisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwltZW1zZXQoYnVmZmVyLCAwLCBsZW4pOworCisJc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIGJ1ZmZlciwgbGVuLCB0aW1lb3V0LCByZXRyaWVzKTsKKworCS8qIFRoaXMgY29kZSBsb29rcyBhd2Z1bDogd2hhdCBpdCdzIGRvaW5nIGlzIG1ha2luZyBzdXJlIGFuCisJICogSUxMRUdBTCBSRVFVRVNUIHNlbnNlIHJldHVybiBpZGVudGlmaWVzIHRoZSBhY3R1YWwgY29tbWFuZAorCSAqIGJ5dGUgYXMgdGhlIHByb2JsZW0uICBNT0RFX1NFTlNFIGNvbW1hbmRzIGNhbiByZXR1cm4KKwkgKiBJTExFR0FMIFJFUVVFU1QgaWYgdGhlIGNvZGUgcGFnZSBpc24ndCBzdXBwb3J0ZWQgKi8KKworCWlmICh1c2VfMTBfZm9yX21zICYmICFzY3NpX3N0YXR1c19pc19nb29kKHNyZXEtPnNyX3Jlc3VsdCkgJiYKKwkgICAgKGRyaXZlcl9ieXRlKHNyZXEtPnNyX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpKSB7CisJCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCQlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcmVxLCAmc3NoZHIpKSB7CisJCQlpZiAoKHNzaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QpICYmCisJCQkgICAgKHNzaGRyLmFzYyA9PSAweDIwKSAmJiAoc3NoZHIuYXNjcSA9PSAwKSkgeworCQkJCS8qIAorCQkJCSAqIEludmFsaWQgY29tbWFuZCBvcGVyYXRpb24gY29kZQorCQkJCSAqLworCQkJCXNyZXEtPnNyX2RldmljZS0+dXNlXzEwX2Zvcl9tcyA9IDA7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCX0KKworCWlmKHNjc2lfc3RhdHVzX2lzX2dvb2Qoc3JlcS0+c3JfcmVzdWx0KSkgeworCQlkYXRhLT5oZWFkZXJfbGVuZ3RoID0gaGVhZGVyX2xlbmd0aDsKKwkJaWYodXNlXzEwX2Zvcl9tcykgeworCQkJZGF0YS0+bGVuZ3RoID0gYnVmZmVyWzBdKjI1NiArIGJ1ZmZlclsxXSArIDI7CisJCQlkYXRhLT5tZWRpdW1fdHlwZSA9IGJ1ZmZlclsyXTsKKwkJCWRhdGEtPmRldmljZV9zcGVjaWZpYyA9IGJ1ZmZlclszXTsKKwkJCWRhdGEtPmxvbmdsYmEgPSBidWZmZXJbNF0gJiAweDAxOworCQkJZGF0YS0+YmxvY2tfZGVzY3JpcHRvcl9sZW5ndGggPSBidWZmZXJbNl0qMjU2CisJCQkJKyBidWZmZXJbN107CisJCX0gZWxzZSB7CisJCQlkYXRhLT5sZW5ndGggPSBidWZmZXJbMF0gKyAxOworCQkJZGF0YS0+bWVkaXVtX3R5cGUgPSBidWZmZXJbMV07CisJCQlkYXRhLT5kZXZpY2Vfc3BlY2lmaWMgPSBidWZmZXJbMl07CisJCQlkYXRhLT5ibG9ja19kZXNjcmlwdG9yX2xlbmd0aCA9IGJ1ZmZlclszXTsKKwkJfQorCX0KKworCXJldHVybiBzcmVxLT5zcl9yZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9tb2RlX3NlbnNlKTsKKworLyoqCisgKglzY3NpX21vZGVfc2Vuc2UgLSBpc3N1ZSBhIG1vZGUgc2Vuc2UsIGZhbGxpbmcgYmFjayBmcm9tIDEwIHRvIAorICoJCXNpeCBieXRlcyBpZiBuZWNlc3NhcnkuCisgKglAc2RldjoJc2NzaSBkZXZpY2UgdG8gc2VuZCBjb21tYW5kIHRvLgorICoJQGRiZDoJc2V0IGlmIG1vZGUgc2Vuc2Ugd2lsbCBkaXNhYmxlIGJsb2NrIGRlc2NyaXB0b3JzIGluIHRoZSByZXR1cm4KKyAqCUBtb2RlcGFnZTogbW9kZSBwYWdlIGJlaW5nIHJlcXVlc3RlZAorICoJQGJ1ZmZlcjogcmVxdWVzdCBidWZmZXIgKG1heSBub3QgYmUgc21hbGxlciB0aGFuIGVpZ2h0IGJ5dGVzKQorICoJQGxlbjoJbGVuZ3RoIG9mIHJlcXVlc3QgYnVmZmVyLgorICoJQHRpbWVvdXQ6IGNvbW1hbmQgdGltZW91dAorICoJQHJldHJpZXM6IG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBmYWlsaW5nCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCwgb3IgdGhlIGhlYWRlciBvZmZzZXQgKGVpdGhlciA0CisgKglvciA4IGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgc2l4IG9yIHRlbiBieXRlIGNvbW1hbmQgd2FzCisgKglpc3N1ZWQpIGlmIHN1Y2Nlc3NmdWwuCisgKiovCitpbnQKK3Njc2lfbW9kZV9zZW5zZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBkYmQsIGludCBtb2RlcGFnZSwKKwkJdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsCisJCXN0cnVjdCBzY3NpX21vZGVfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworCWludCByZXQ7CisKKwlpZiAoIXNyZXEpCisJCXJldHVybiAtMTsKKworCXJldCA9IF9fc2NzaV9tb2RlX3NlbnNlKHNyZXEsIGRiZCwgbW9kZXBhZ2UsIGJ1ZmZlciwgbGVuLAorCQkJCXRpbWVvdXQsIHJldHJpZXMsIGRhdGEpOworCisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX21vZGVfc2Vuc2UpOworCitpbnQKK3Njc2lfdGVzdF91bml0X3JlYWR5KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CisJY2hhciBjbWRbXSA9IHsKKwkJVEVTVF9VTklUX1JFQURZLCAwLCAwLCAwLCAwLCAwLAorCX07CisJaW50IHJlc3VsdDsKKwkKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9LRVJORUwpOworCWlmICghc3JlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCXNjc2lfd2FpdF9yZXEoc3JlcSwgY21kLCBOVUxMLCAwLCB0aW1lb3V0LCByZXRyaWVzKTsKKworCWlmICgoZHJpdmVyX2J5dGUoc3JlcS0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYgc2Rldi0+cmVtb3ZhYmxlKSB7CisJCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCQlpZiAoKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkgJiYKKwkJICAgICgoc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKSB8fAorCQkgICAgIChzc2hkci5zZW5zZV9rZXkgPT0gTk9UX1JFQURZKSkpIHsKKwkJCXNkZXYtPmNoYW5nZWQgPSAxOworCQkJc3JlcS0+c3JfcmVzdWx0ID0gMDsKKwkJfQorCX0KKwlyZXN1bHQgPSBzcmVxLT5zcl9yZXN1bHQ7CisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV90ZXN0X3VuaXRfcmVhZHkpOworCisvKioKKyAqCXNjc2lfZGV2aWNlX3NldF9zdGF0ZSAtIFRha2UgdGhlIGdpdmVuIGRldmljZSB0aHJvdWdoIHRoZSBkZXZpY2UKKyAqCQlzdGF0ZSBtb2RlbC4KKyAqCUBzZGV2OglzY3NpIGRldmljZSB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mLgorICoJQHN0YXRlOglzdGF0ZSB0byBjaGFuZ2UgdG8uCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCBvciBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdGVkIAorICoJdHJhbnNpdGlvbiBpcyBpbGxlZ2FsLgorICoqLworaW50CitzY3NpX2RldmljZV9zZXRfc3RhdGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBlbnVtIHNjc2lfZGV2aWNlX3N0YXRlIHN0YXRlKQoreworCWVudW0gc2NzaV9kZXZpY2Vfc3RhdGUgb2xkc3RhdGUgPSBzZGV2LT5zZGV2X3N0YXRlOworCisJaWYgKHN0YXRlID09IG9sZHN0YXRlKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNERVZfQ1JFQVRFRDoKKwkJLyogVGhlcmUgYXJlIG5vIGxlZ2FsIHN0YXRlcyB0aGF0IGNvbWUgYmFjayB0bworCQkgKiBjcmVhdGVkLiAgVGhpcyBpcyB0aGUgbWFudWFsbHkgaW5pdGlhbGlzZWQgc3RhcnQKKwkJICogc3RhdGUgKi8KKwkJZ290byBpbGxlZ2FsOworCQkJCisJY2FzZSBTREVWX1JVTk5JTkc6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTREVWX0NSRUFURUQ6CisJCWNhc2UgU0RFVl9PRkZMSU5FOgorCQljYXNlIFNERVZfUVVJRVNDRToKKwkJY2FzZSBTREVWX0JMT0NLOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNERVZfUVVJRVNDRToKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNERVZfUlVOTklORzoKKwkJY2FzZSBTREVWX09GRkxJTkU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0RFVl9PRkZMSU5FOgorCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CisJCWNhc2UgU0RFVl9DUkVBVEVEOgorCQljYXNlIFNERVZfUlVOTklORzoKKwkJY2FzZSBTREVWX1FVSUVTQ0U6CisJCWNhc2UgU0RFVl9CTE9DSzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbGxlZ2FsOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTREVWX0JMT0NLOgorCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CisJCWNhc2UgU0RFVl9DUkVBVEVEOgorCQljYXNlIFNERVZfUlVOTklORzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbGxlZ2FsOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTREVWX0NBTkNFTDoKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNERVZfQ1JFQVRFRDoKKwkJY2FzZSBTREVWX1JVTk5JTkc6CisJCWNhc2UgU0RFVl9PRkZMSU5FOgorCQljYXNlIFNERVZfQkxPQ0s6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0RFVl9ERUw6CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTREVWX0NBTkNFTDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBpbGxlZ2FsOworCQl9CisJCWJyZWFrOworCisJfQorCXNkZXYtPnNkZXZfc3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gMDsKKworIGlsbGVnYWw6CisJU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoMSwgCisJCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnNkZXYtPnNkZXZfZ2VuZGV2LAorCQkJCQkgICAiSWxsZWdhbCBzdGF0ZSB0cmFuc2l0aW9uICVzLT4lc1xuIiwKKwkJCQkJICAgc2NzaV9kZXZpY2Vfc3RhdGVfbmFtZShvbGRzdGF0ZSksCisJCQkJCSAgIHNjc2lfZGV2aWNlX3N0YXRlX25hbWUoc3RhdGUpKQorCQkJCSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZGV2aWNlX3NldF9zdGF0ZSk7CisKKy8qKgorICoJc2NzaV9kZXZpY2VfcXVpZXNjZSAtIEJsb2NrIHVzZXIgaXNzdWVkIGNvbW1hbmRzLgorICoJQHNkZXY6CXNjc2kgZGV2aWNlIHRvIHF1aWVzY2UuCisgKgorICoJVGhpcyB3b3JrcyBieSB0cnlpbmcgdG8gdHJhbnNpdGlvbiB0byB0aGUgU0RFVl9RVUlFU0NFIHN0YXRlCisgKgkod2hpY2ggbXVzdCBiZSBhIGxlZ2FsIHRyYW5zaXRpb24pLiAgV2hlbiB0aGUgZGV2aWNlIGlzIGluIHRoaXMKKyAqCXN0YXRlLCBvbmx5IHNwZWNpYWwgcmVxdWVzdHMgd2lsbCBiZSBhY2NlcHRlZCwgYWxsIG90aGVycyB3aWxsCisgKgliZSBkZWZlcnJlZC4gIFNpbmNlIHNwZWNpYWwgcmVxdWVzdHMgbWF5IGFsc28gYmUgcmVxdWV1ZWQgcmVxdWVzdHMsCisgKglhIHN1Y2Nlc3NmdWwgcmV0dXJuIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBkZXZpY2Ugd2lsbCBiZSAKKyAqCXRvdGFsbHkgcXVpZXNjZW50LgorICoKKyAqCU11c3QgYmUgY2FsbGVkIHdpdGggdXNlciBjb250ZXh0LCBtYXkgc2xlZXAuCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCBvciBhbiBlcnJvciBpZiBub3QuCisgKiovCitpbnQKK3Njc2lfZGV2aWNlX3F1aWVzY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWludCBlcnIgPSBzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9RVUlFU0NFKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2NzaV9ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CisJd2hpbGUgKHNkZXYtPmRldmljZV9idXN5KSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMCk7CisJCXNjc2lfcnVuX3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9kZXZpY2VfcXVpZXNjZSk7CisKKy8qKgorICoJc2NzaV9kZXZpY2VfcmVzdW1lIC0gUmVzdGFydCB1c2VyIGlzc3VlZCBjb21tYW5kcyB0byBhIHF1aWVzY2VkIGRldmljZS4KKyAqCUBzZGV2OglzY3NpIGRldmljZSB0byByZXN1bWUuCisgKgorICoJTW92ZXMgdGhlIGRldmljZSBmcm9tIHF1aWVzY2VkIGJhY2sgdG8gcnVubmluZyBhbmQgcmVzdGFydHMgdGhlCisgKglxdWV1ZXMuCisgKgorICoJTXVzdCBiZSBjYWxsZWQgd2l0aCB1c2VyIGNvbnRleHQsIG1heSBzbGVlcC4KKyAqKi8KK3ZvaWQKK3Njc2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaWYoc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUlVOTklORykpCisJCXJldHVybjsKKwlzY3NpX3J1bl9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9kZXZpY2VfcmVzdW1lKTsKKworc3RhdGljIHZvaWQKK2RldmljZV9xdWllc2NlX2ZuKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCAqZGF0YSkKK3sKKwlzY3NpX2RldmljZV9xdWllc2NlKHNkZXYpOworfQorCit2b2lkCitzY3NpX3RhcmdldF9xdWllc2NlKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZShzdGFyZ2V0LCBOVUxMLCBkZXZpY2VfcXVpZXNjZV9mbik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfdGFyZ2V0X3F1aWVzY2UpOworCitzdGF0aWMgdm9pZAorZGV2aWNlX3Jlc3VtZV9mbihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJc2NzaV9kZXZpY2VfcmVzdW1lKHNkZXYpOworfQorCit2b2lkCitzY3NpX3RhcmdldF9yZXN1bWUoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHN0YXJnZXQsIE5VTEwsIGRldmljZV9yZXN1bWVfZm4pOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3RhcmdldF9yZXN1bWUpOworCisvKioKKyAqIHNjc2lfaW50ZXJuYWxfZGV2aWNlX2Jsb2NrIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8gcHV0IGEgZGV2aWNlCisgKgkJCQl0ZW1wb3JhcmlseSBpbnRvIHRoZSBTREVWX0JMT0NLIHN0YXRlCisgKiBAc2RldjoJZGV2aWNlIHRvIGJsb2NrCisgKgorICogQmxvY2sgcmVxdWVzdCBtYWRlIGJ5IHNjc2kgbGxkJ3MgdG8gdGVtcG9yYXJpbHkgc3RvcCBhbGwKKyAqIHNjc2kgY29tbWFuZHMgb24gdGhlIHNwZWNpZmllZCBkZXZpY2UuICBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQKKyAqIG9yIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgZXJyb3IgaWYgbm90CisgKgorICogTm90ZXM6ICAgICAgIAorICoJVGhpcyByb3V0aW5lIHRyYW5zaXRpb25zIHRoZSBkZXZpY2UgdG8gdGhlIFNERVZfQkxPQ0sgc3RhdGUKKyAqCSh3aGljaCBtdXN0IGJlIGEgbGVnYWwgdHJhbnNpdGlvbikuICBXaGVuIHRoZSBkZXZpY2UgaXMgaW4gdGhpcworICoJc3RhdGUsIGFsbCBjb21tYW5kcyBhcmUgZGVmZXJyZWQgdW50aWwgdGhlIHNjc2kgbGxkIHJlZW5hYmxlcworICoJdGhlIGRldmljZSB3aXRoIHNjc2lfZGV2aWNlX3VuYmxvY2sgb3IgZGV2aWNlX2Jsb2NrX3RtbyBmaXJlcy4KKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIHRoZSBob3N0X2xvY2sgaXMgaGVsZCBvbiBlbnRyeS4KKyAqKi8KK2ludAorc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXJlcXVlc3RfcXVldWVfdCAqcSA9IHNkZXYtPnJlcXVlc3RfcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX0JMT0NLKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogCisJICogVGhlIGRldmljZSBoYXMgdHJhbnNpdGlvbmVkIHRvIFNERVZfQkxPQ0suICBTdG9wIHRoZQorCSAqIGJsb2NrIGxheWVyIGZyb20gY2FsbGluZyB0aGUgbWlkbGF5ZXIgd2l0aCB0aGlzIGRldmljZSdzCisJICogcmVxdWVzdCBxdWV1ZS4gCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWJsa19zdG9wX3F1ZXVlKHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2ludGVybmFsX2RldmljZV9ibG9jayk7CisgCisvKioKKyAqIHNjc2lfaW50ZXJuYWxfZGV2aWNlX3VuYmxvY2sgLSByZXN1bWUgYSBkZXZpY2UgYWZ0ZXIgYSBibG9jayByZXF1ZXN0CisgKiBAc2RldjoJZGV2aWNlIHRvIHJlc3VtZQorICoKKyAqIENhbGxlZCBieSBzY3NpIGxsZCdzIG9yIHRoZSBtaWRsYXllciB0byByZXN0YXJ0IHRoZSBkZXZpY2UgcXVldWUKKyAqIGZvciB0aGUgcHJldmlvdXNseSBzdXNwZW5kZWQgc2NzaSBkZXZpY2UuICBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgb3IKKyAqIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgZXJyb3IgaWYgbm90LgorICoKKyAqIE5vdGVzOiAgICAgICAKKyAqCVRoaXMgcm91dGluZSB0cmFuc2l0aW9ucyB0aGUgZGV2aWNlIHRvIHRoZSBTREVWX1JVTk5JTkcgc3RhdGUKKyAqCSh3aGljaCBtdXN0IGJlIGEgbGVnYWwgdHJhbnNpdGlvbikgYWxsb3dpbmcgdGhlIG1pZGxheWVyIHRvCisgKglnb29zZSB0aGUgcXVldWUgZm9yIHRoaXMgZGV2aWNlLiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhlIAorICoJaG9zdF9sb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS4KKyAqKi8KK2ludAorc2NzaV9pbnRlcm5hbF9kZXZpY2VfdW5ibG9jayhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsgCisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIAorCSAqIFRyeSB0byB0cmFuc2l0aW9uIHRoZSBzY3NpIGRldmljZSB0byBTREVWX1JVTk5JTkcKKwkgKiBhbmQgZ29vc2UgdGhlIGRldmljZSBxdWV1ZSBpZiBzdWNjZXNzZnVsLiAgCisJICovCisJZXJyID0gc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfUlVOTklORyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlibGtfc3RhcnRfcXVldWUocSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNjc2lfaW50ZXJuYWxfZGV2aWNlX3VuYmxvY2spOworCitzdGF0aWMgdm9pZAorZGV2aWNlX2Jsb2NrKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCAqZGF0YSkKK3sKKwlzY3NpX2ludGVybmFsX2RldmljZV9ibG9jayhzZGV2KTsKK30KKworc3RhdGljIGludAordGFyZ2V0X2Jsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpCisJCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHRvX3Njc2lfdGFyZ2V0KGRldiksIE5VTEwsCisJCQkJCWRldmljZV9ibG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3Njc2lfdGFyZ2V0X2Jsb2NrKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpCisJCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHRvX3Njc2lfdGFyZ2V0KGRldiksIE5VTEwsCisJCQkJCWRldmljZV9ibG9jayk7CisJZWxzZQorCQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoZGV2LCBOVUxMLCB0YXJnZXRfYmxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV90YXJnZXRfYmxvY2spOworCitzdGF0aWMgdm9pZAorZGV2aWNlX3VuYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB2b2lkICpkYXRhKQoreworCXNjc2lfaW50ZXJuYWxfZGV2aWNlX3VuYmxvY2soc2Rldik7Cit9CisKK3N0YXRpYyBpbnQKK3RhcmdldF91bmJsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpCisJCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHRvX3Njc2lfdGFyZ2V0KGRldiksIE5VTEwsCisJCQkJCWRldmljZV91bmJsb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorc2NzaV90YXJnZXRfdW5ibG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKHNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSh0b19zY3NpX3RhcmdldChkZXYpLCBOVUxMLAorCQkJCQlkZXZpY2VfdW5ibG9jayk7CisJZWxzZQorCQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoZGV2LCBOVUxMLCB0YXJnZXRfdW5ibG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX3RhcmdldF91bmJsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xvZ2dpbmcuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTcyMmJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbG9nZ2luZy5oCkBAIC0wLDAgKzEsODIgQEAKKyNpZm5kZWYgX1NDU0lfTE9HR0lOR19ICisjZGVmaW5lIF9TQ1NJX0xPR0dJTkdfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIHNjc2kgbG9nZ2luZyBmZWF0dXJlLiAgSXQgaXMgYSBtZWFucyBieSB3aGljaCB0aGUgdXNlcgorICogY2FuIHNlbGVjdCBob3cgbXVjaCBpbmZvcm1hdGlvbiB0aGV5IGdldCBhYm91dCB2YXJpb3VzIGdvaW5ncyBvbiwgYW5kIGl0CisgKiBjYW4gYmUgcmVhbGx5IHVzZWZ1bCBmb3IgZmF1bHQgdHJhY2luZy4gIFRoZSBsb2dnaW5nIHdvcmQgaXMgZGl2aWRlZCBpbnRvCisgKiA4IG5pYmJsZXMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgbG9nbGV2ZWwuICBUaGUgZGl2aXNpb24gb2YgdGhpbmdzIGlzCisgKiBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCB0aGUgZGl2aXNpb24gb2YgdGhlIHdvcmQgY291bGQgYmUgY2hhbmdlZCBpZiBpdAorICogd2VyZSByZWFsbHkgbmVlZGVkIGZvciBhbnkgcmVhc29uLiAgVGhlIG51bWJlcnMgYmVsb3cgYXJlIHRoZSBvbmx5IHBsYWNlCisgKiB3aGVyZSB0aGVzZSBhcmUgc3BlY2lmaWVkLiAgRm9yIGEgZmlyc3QgZ28tYXJvdW5kLCAzIGJpdHMgaXMgbW9yZSB0aGFuCisgKiBlbm91Z2gsIHNpbmNlIHRoaXMgZ2l2ZXMgOCBsZXZlbHMgb2YgbG9nZ2luZyAocmVhbGx5IDcsIHNpbmNlIDAgaXMgYWx3YXlzCisgKiBvZmYpLiAgQ3V0dGluZyB0byAyIGJpdHMgbWlnaHQgYmUgd2lzZSBhdCBzb21lIHBvaW50LgorICovCisKKyNkZWZpbmUgU0NTSV9MT0dfRVJST1JfU0hJRlQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0NTSV9MT0dfVElNRU9VVF9TSElGVCAgICAgICAgICAgIDMKKyNkZWZpbmUgU0NTSV9MT0dfU0NBTl9TSElGVCAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0NTSV9MT0dfTUxRVUVVRV9TSElGVCAgICAgICAgICAgIDkKKyNkZWZpbmUgU0NTSV9MT0dfTUxDT01QTEVURV9TSElGVCAgICAgICAgIDEyCisjZGVmaW5lIFNDU0lfTE9HX0xMUVVFVUVfU0hJRlQgICAgICAgICAgICAxNQorI2RlZmluZSBTQ1NJX0xPR19MTENPTVBMRVRFX1NISUZUICAgICAgICAgMTgKKyNkZWZpbmUgU0NTSV9MT0dfSExRVUVVRV9TSElGVCAgICAgICAgICAgIDIxCisjZGVmaW5lIFNDU0lfTE9HX0hMQ09NUExFVEVfU0hJRlQgICAgICAgICAyNAorI2RlZmluZSBTQ1NJX0xPR19JT0NUTF9TSElGVCAgICAgICAgICAgICAgMjcKKworI2RlZmluZSBTQ1NJX0xPR19FUlJPUl9CSVRTICAgICAgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19USU1FT1VUX0JJVFMgICAgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19TQ0FOX0JJVFMgICAgICAgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19NTFFVRVVFX0JJVFMgICAgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19NTENPTVBMRVRFX0JJVFMgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19MTFFVRVVFX0JJVFMgICAgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19MTENPTVBMRVRFX0JJVFMgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19ITFFVRVVFX0JJVFMgICAgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19ITENPTVBMRVRFX0JJVFMgICAgICAgICAgMworI2RlZmluZSBTQ1NJX0xPR19JT0NUTF9CSVRTICAgICAgICAgICAgICAgMworCitleHRlcm4gdW5zaWduZWQgaW50IHNjc2lfbG9nZ2luZ19sZXZlbDsKKworI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKKworI2RlZmluZSBTQ1NJX0xPR19MRVZFTChTSElGVCwgQklUUykJCQkJXAorICAgICAgICAoKHNjc2lfbG9nZ2luZ19sZXZlbCA+PiAoU0hJRlQpKSAmICgoMSA8PCAoQklUUykpIC0gMSkpCisKKyNkZWZpbmUgU0NTSV9DSEVDS19MT0dHSU5HKFNISUZULCBCSVRTLCBMRVZFTCwgQ01EKQkJXAorewkJCQkJCQkJXAorICAgICAgICBpZiAodW5saWtlbHkoKFNDU0lfTE9HX0xFVkVMKFNISUZULCBCSVRTKSkgPiAoTEVWRUwpKSkJXAorCQkoQ01EKTsJCQkJCQlcCit9CisjZWxzZQorI2RlZmluZSBTQ1NJX0NIRUNLX0xPR0dJTkcoU0hJRlQsIEJJVFMsIExFVkVMLCBDTUQpCisjZW5kaWYgLyogQ09ORklHX1NDU0lfTE9HR0lORyAqLworCisvKgorICogVGhlc2UgYXJlIHRoZSBtYWNyb3MgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZCB0aHJvdWdob3V0IHRoZSBjb2RlIHRvCisgKiBsb2cgZXZlbnRzLiAgSWYgbG9nZ2luZyBpc24ndCBlbmFibGVkLCB0aGV5IGFyZSBuby1vcHMgYW5kIHdpbGwgYmUKKyAqIGNvbXBsZXRlbHkgYWJzZW50IGZyb20gdGhlIHVzZXIncyBjb2RlLgorICovCisjZGVmaW5lIFNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX0VSUk9SX1NISUZULCBTQ1NJX0xPR19FUlJPUl9CSVRTLCBMRVZFTCxDTUQpOworI2RlZmluZSBTQ1NJX0xPR19USU1FT1VUKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX1RJTUVPVVRfU0hJRlQsIFNDU0lfTE9HX1RJTUVPVVRfQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfU0NBTl9CVVMoTEVWRUwsQ01EKSAgXAorICAgICAgICBTQ1NJX0NIRUNLX0xPR0dJTkcoU0NTSV9MT0dfU0NBTl9TSElGVCwgU0NTSV9MT0dfU0NBTl9CSVRTLCBMRVZFTCxDTUQpOworI2RlZmluZSBTQ1NJX0xPR19NTFFVRVVFKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX01MUVVFVUVfU0hJRlQsIFNDU0lfTE9HX01MUVVFVUVfQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfTUxDT01QTEVURShMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19NTENPTVBMRVRFX1NISUZULCBTQ1NJX0xPR19NTENPTVBMRVRFX0JJVFMsIExFVkVMLENNRCk7CisjZGVmaW5lIFNDU0lfTE9HX0xMUVVFVUUoTEVWRUwsQ01EKSAgXAorICAgICAgICBTQ1NJX0NIRUNLX0xPR0dJTkcoU0NTSV9MT0dfTExRVUVVRV9TSElGVCwgU0NTSV9MT0dfTExRVUVVRV9CSVRTLCBMRVZFTCxDTUQpOworI2RlZmluZSBTQ1NJX0xPR19MTENPTVBMRVRFKExFVkVMLENNRCkgIFwKKyAgICAgICAgU0NTSV9DSEVDS19MT0dHSU5HKFNDU0lfTE9HX0xMQ09NUExFVEVfU0hJRlQsIFNDU0lfTE9HX0xMQ09NUExFVEVfQklUUywgTEVWRUwsQ01EKTsKKyNkZWZpbmUgU0NTSV9MT0dfSExRVUVVRShMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19ITFFVRVVFX1NISUZULCBTQ1NJX0xPR19ITFFVRVVFX0JJVFMsIExFVkVMLENNRCk7CisjZGVmaW5lIFNDU0lfTE9HX0hMQ09NUExFVEUoTEVWRUwsQ01EKSAgXAorICAgICAgICBTQ1NJX0NIRUNLX0xPR0dJTkcoU0NTSV9MT0dfSExDT01QTEVURV9TSElGVCwgU0NTSV9MT0dfSExDT01QTEVURV9CSVRTLCBMRVZFTCxDTUQpOworI2RlZmluZSBTQ1NJX0xPR19JT0NUTChMRVZFTCxDTUQpICBcCisgICAgICAgIFNDU0lfQ0hFQ0tfTE9HR0lORyhTQ1NJX0xPR19JT0NUTF9TSElGVCwgU0NTSV9MT0dfSU9DVExfQklUUywgTEVWRUwsQ01EKTsKKworI2VuZGlmIC8qIF9TQ1NJX0xPR0dJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbW9kdWxlLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODkxNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbW9kdWxlLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RvcGggSGVsbHdpZy4KKyAqCVJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqCisgKiBTdXBwb3J0IGZvciBvbGQtc3R5bGUgaG9zdCB0ZW1wbGF0ZXMuCisgKgorICogTk9URTogIERvIG5vdCB1c2UgdGhpcyBmb3IgbmV3IGRyaXZlcnMgZXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RoaXNfc2NzaV9kcml2ZXIodm9pZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQgPSAmZHJpdmVyX3RlbXBsYXRlOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGVycm9yOworCisJaWYgKCFzaHQtPnJlbGVhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAic2NzaSBIQkEgZHJpdmVyICVzIGRpZG4ndCBzZXQgYSByZWxlYXNlIG1ldGhvZC5cbiIsCisJCSAgICBzaHQtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzaHQtPm1vZHVsZSA9IFRISVNfTU9EVUxFOworCUlOSVRfTElTVF9IRUFEKCZzaHQtPmxlZ2FjeV9ob3N0cyk7CisKKwlzaHQtPmRldGVjdChzaHQpOworCWlmIChsaXN0X2VtcHR5KCZzaHQtPmxlZ2FjeV9ob3N0cykpCisJCXJldHVybiAtRU5PREVWOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzaG9zdCwgJnNodC0+bGVnYWN5X2hvc3RzLCBzaHRfbGVnYWN5X2xpc3QpIHsKKwkJZXJyb3IgPSBzY3NpX2FkZF9ob3N0KHNob3N0LCBOVUxMKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBmYWlsOworCQlzY3NpX3NjYW5faG9zdChzaG9zdCk7CisJfQorCXJldHVybiAwOworIGZhaWw6CisJbCA9ICZzaG9zdC0+c2h0X2xlZ2FjeV9saXN0OworCXdoaWxlICgobCA9IGwtPnByZXYpICE9ICZzaHQtPmxlZ2FjeV9ob3N0cykKKwkJc2NzaV9yZW1vdmVfaG9zdChsaXN0X2VudHJ5KGwsIHN0cnVjdCBTY3NpX0hvc3QsIHNodF9sZWdhY3lfbGlzdCkpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdGhpc19zY3NpX2RyaXZlcih2b2lkKQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9ICZkcml2ZXJfdGVtcGxhdGU7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsICpzOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzaG9zdCwgJnNodC0+bGVnYWN5X2hvc3RzLCBzaHRfbGVnYWN5X2xpc3QpCisJCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaG9zdCwgcywgJnNodC0+bGVnYWN5X2hvc3RzLCBzaHRfbGVnYWN5X2xpc3QpCisJCXNodC0+cmVsZWFzZShzaG9zdCk7CisKKwlpZiAobGlzdF9lbXB0eSgmc2h0LT5sZWdhY3lfaG9zdHMpKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBkaWQgbm90IGNhbGwgc2NzaV91bnJlZ2lzdGVyXG4iLCBzaHQtPm5hbWUpOworCWR1bXBfc3RhY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaG9zdCwgcywgJnNodC0+bGVnYWN5X2hvc3RzLCBzaHRfbGVnYWN5X2xpc3QpCisJCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdGhpc19zY3NpX2RyaXZlcik7Cittb2R1bGVfZXhpdChleGl0X3RoaXNfc2NzaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfb2Jzb2xldGUuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX29ic29sZXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX29ic29sZXRlLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiAgc2NzaV9vYnNvbGV0ZS5oIENvcHlyaWdodCAoQykgMTk5NyBFcmljIFlvdW5nZGFsZQorICoKKyAqLworCisjaWZuZGVmIF9TQ1NJX09CU09MRVRFX0gKKyNkZWZpbmUgX1NDU0lfT0JTT0xFVEVfSAorCisvKgorICogVGhlc2UgYXJlIHRoZSByZXR1cm4gY29kZXMgZm9yIHRoZSBhYm9ydCBhbmQgcmVzZXQgZnVuY3Rpb25zLiAgVGhlIG1pZC1sZXZlbAorICogY29kZSB1c2VzIHRoZXNlIHRvIGRlY2lkZSB3aGF0IHRvIGRvIG5leHQuICBFYWNoIG9mIHRoZSBsb3cgbGV2ZWwgYWJvcnQKKyAqIGFuZCByZXNldCBmdW5jdGlvbnMgbXVzdCBjb3JyZWN0bHkgaW5kaWNhdGUgd2hhdCBpdCBoYXMgZG9uZS4KKyAqIFRoZSBkZXNjcmlwdGlvbnMgYXJlIHdyaXR0ZW4gZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgbWlkLWxldmVsIGNvZGUsCisgKiBzbyB0aGF0IHRoZSByZXR1cm4gY29kZSBpcyB0ZWxsaW5nIHRoZSBtaWQtbGV2ZWwgZHJpdmVycyBleGFjdGx5IHdoYXQKKyAqIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIGhhcyBhbHJlYWR5IGRvbmUsIGFuZCB3aGF0IHJlbWFpbnMgdG8gYmUgZG9uZS4KKyAqLworCisvKiBXZSBkaWQgbm90IGRvIGFueXRoaW5nLiAgCisgKiBXYWl0IHNvbWUgbW9yZSBmb3IgdGhpcyBjb21tYW5kIHRvIGNvbXBsZXRlLCBhbmQgaWYgdGhpcyBkb2VzIG5vdCB3b3JrLCAKKyAqIHRyeSBzb21ldGhpbmcgbW9yZSBzZXJpb3VzLiAqLworI2RlZmluZSBTQ1NJX0FCT1JUX1NOT09aRSAwCisKKy8qIFRoaXMgbWVhbnMgdGhhdCB3ZSB3ZXJlIGFibGUgdG8gYWJvcnQgdGhlIGNvbW1hbmQuICBXZSBoYXZlIGFscmVhZHkKKyAqIGNhbGxlZCB0aGUgbWlkLWxldmVsIGRvbmUgZnVuY3Rpb24sIGFuZCBkbyBub3QgZXhwZWN0IGFuIGludGVycnVwdCB0aGF0IAorICogd2lsbCBsZWFkIHRvIGFub3RoZXIgY2FsbCB0byB0aGUgbWlkLWxldmVsIGRvbmUgZnVuY3Rpb24gZm9yIHRoaXMgY29tbWFuZCAqLworI2RlZmluZSBTQ1NJX0FCT1JUX1NVQ0NFU1MgMQorCisvKiBXZSBjYWxsZWQgZm9yIGFuIGFib3J0IG9mIHRoaXMgY29tbWFuZCwgYW5kIHdlIHNob3VsZCBnZXQgYW4gaW50ZXJydXB0IAorICogd2hlbiB0aGlzIHN1Y2NlZWRzLiAgVGh1cyB3ZSBzaG91bGQgbm90IHJlc3RvcmUgdGhlIHRpbWVyIGZvciB0aGlzCisgKiBjb21tYW5kIGluIHRoZSBtaWQtbGV2ZWwgYWJvcnQgZnVuY3Rpb24uICovCisjZGVmaW5lIFNDU0lfQUJPUlRfUEVORElORyAyCisKKy8qIFVuYWJsZSB0byBhYm9ydCAtIGNvbW1hbmQgaXMgY3VycmVudGx5IG9uIHRoZSBidXMuICBHcmluIGFuZCBiZWFyIGl0LiAqLworI2RlZmluZSBTQ1NJX0FCT1JUX0JVU1kgMworCisvKiBUaGUgY29tbWFuZCBpcyBub3QgYWN0aXZlIGluIHRoZSBsb3cgbGV2ZWwgY29kZS4gQ29tbWFuZCBwcm9iYWJseQorICogZmluaXNoZWQuICovCisjZGVmaW5lIFNDU0lfQUJPUlRfTk9UX1JVTk5JTkcgNAorCisvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIHdpbGwgaW5kaWNhdGUgdGhlIGNvcnJlY3QKKyAqIGVycm9yIGNvbmRpdGlvbiB3aGVuIGl0IGNhbGxzIHNjc2lfZG9uZSwgc28gdGhlIG1pZC1sZXZlbCBhYm9ydCBmdW5jdGlvbgorICogY2FuIHNpbXBseSB3YWl0IHVudGlsIHRoaXMgY29tZXMgdGhyb3VnaCAqLworI2RlZmluZSBTQ1NJX0FCT1JUX0VSUk9SIDUKKworLyogV2UgZG8gbm90IGtub3cgaG93IHRvIHJlc2V0IHRoZSBidXMsIG9yIHdlIGRvIG5vdCB3YW50IHRvLiAgQnVtbWVyLgorICogQW55d2F5LCBqdXN0IHdhaXQgYSBsaXR0bGUgbW9yZSBmb3IgdGhlIGNvbW1hbmQgaW4gcXVlc3Rpb24sIGFuZCBob3BlIHRoYXQKKyAqIGl0IGV2ZW50dWFsbHkgZmluaXNoZXMuICBJZiBpdCBuZXZlciBmaW5pc2hlcywgdGhlIFNDU0kgZGV2aWNlIGNvdWxkCisgKiBoYW5nLCBzbyB1c2UgdGhpcyB3aXRoIGNhdXRpb24uICovCisjZGVmaW5lIFNDU0lfUkVTRVRfU05PT1pFIDAKKworLyogV2UgZG8gbm90IGtub3cgaG93IHRvIHJlc2V0IHRoZSBidXMsIG9yIHdlIGRvIG5vdCB3YW50IHRvLiAgQnVtbWVyLgorICogV2UgaGF2ZSBnaXZlbiB1cCBvbiB0aGlzIGV2ZXIgY29tcGxldGluZy4gIFRoZSBtaWQtbGV2ZWwgY29kZSB3aWxsCisgKiByZXF1ZXN0IHNlbnNlIGluZm9ybWF0aW9uIHRvIGRlY2lkZSBob3cgdG8gcHJvY2VlZCBmcm9tIGhlcmUuICovCisjZGVmaW5lIFNDU0lfUkVTRVRfUFVOVCAxCisKKy8qIFRoaXMgbWVhbnMgdGhhdCB3ZSB3ZXJlIGFibGUgdG8gcmVzZXQgdGhlIGJ1cy4gIFdlIGhhdmUgcmVzdGFydGVkIGFsbCBvZgorICogdGhlIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGJlIHJlc3RhcnRlZCwgYW5kIHdlIHNob3VsZCBiZSBhYmxlIHRvIGNvbnRpbnVlCisgKiBvbiBub3JtYWxseSBmcm9tIGhlcmUuICBXZSBkbyBub3QgZXhwZWN0IGFueSBpbnRlcnJ1cHRzIHRoYXQgd2lsbCByZXR1cm4KKyAqIERJRF9SRVNFVCB0byBhbnkgb2YgdGhlIG90aGVyIGNvbW1hbmRzIGluIHRoZSBob3N0X3F1ZXVlLCBhbmQgdGhlIG1pZC1sZXZlbAorICogY29kZSBkb2VzIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgdG8ga2VlcCB0aGUgY29tbWFuZHMgYWxpdmUuIAorICogSWYgYSBoYXJkIHJlc2V0IHdhcyBwZXJmb3JtZWQgdGhlbiBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMgb24gdGhlCisgKiBidXMgaGF2ZSBiZWVuIHJlc3RhcnRlZC4gKi8KKyNkZWZpbmUgU0NTSV9SRVNFVF9TVUNDRVNTIDIKKworLyogV2UgY2FsbGVkIGZvciBhIHJlc2V0IG9mIHRoaXMgYnVzLCBhbmQgd2Ugc2hvdWxkIGdldCBhbiBpbnRlcnJ1cHQgCisgKiB3aGVuIHRoaXMgc3VjY2VlZHMuICBFYWNoIGNvbW1hbmQgc2hvdWxkIGdldCBpdHMgb3duIHN0YXR1cworICogcGFzc2VkIHVwIHRvIHNjc2lfZG9uZSwgYnV0IHRoaXMgaGFzIG5vdCBoYXBwZW5lZCB5ZXQuIAorICogSWYgYSBoYXJkIHJlc2V0IHdhcyBwZXJmb3JtZWQsIHRoZW4gd2UgZXhwZWN0IGFuIGludGVycnVwdAorICogZm9yICplYWNoKiBvZiB0aGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgdGhhdCB3aWxsIGhhdmUgdGhlCisgKiBlZmZlY3Qgb2YgcmVzdGFydGluZyB0aGUgY29tbWFuZHMuCisgKi8KKyNkZWZpbmUgU0NTSV9SRVNFVF9QRU5ESU5HIDMKKworLyogV2UgZGlkIGEgcmVzZXQsIGJ1dCBkbyBub3QgZXhwZWN0IGFuIGludGVycnVwdCB0byBzaWduYWwgRElEX1JFU0VULgorICogVGhpcyB0ZWxscyB0aGUgdXBwZXIgbGV2ZWwgY29kZSB0byByZXF1ZXN0IHRoZSBzZW5zZSBpbmZvLCBhbmQgdGhpcworICogc2hvdWxkIGtlZXAgdGhlIGNvbW1hbmQgYWxpdmUuICovCisjZGVmaW5lIFNDU0lfUkVTRVRfV0FLRVVQIDQKKworLyogVGhlIGNvbW1hbmQgaXMgbm90IGFjdGl2ZSBpbiB0aGUgbG93IGxldmVsIGNvZGUuIENvbW1hbmQgcHJvYmFibHkKKyAgIGZpbmlzaGVkLiAqLworI2RlZmluZSBTQ1NJX1JFU0VUX05PVF9SVU5OSU5HIDUKKworLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIGFuZCB3ZSBkbyBub3Qga25vdyBob3cgdG8gZml4IGl0LiAqLworI2RlZmluZSBTQ1NJX1JFU0VUX0VSUk9SIDYKKworI2RlZmluZSBTQ1NJX1JFU0VUX1NZTkNIUk9OT1VTCQkweDAxCisjZGVmaW5lIFNDU0lfUkVTRVRfQVNZTkNIUk9OT1VTCQkweDAyCisjZGVmaW5lIFNDU0lfUkVTRVRfU1VHR0VTVF9CVVNfUkVTRVQJMHgwNAorI2RlZmluZSBTQ1NJX1JFU0VUX1NVR0dFU1RfSE9TVF9SRVNFVAkweDA4CisvKgorICogVGhpcyBpcyBhIGJpdG1hc2sgdGhhdCBpcyBvcmVkIHdpdGggb25lIG9mIHRoZSBhYm92ZSBjb2Rlcy4KKyAqIEl0IHRlbGxzIHRoZSBtaWQtbGV2ZWwgY29kZSB0aGF0IHdlIGRpZCBhIGhhcmQgcmVzZXQuCisgKi8KKyNkZWZpbmUgU0NTSV9SRVNFVF9CVVNfUkVTRVQgMHgxMDAKKy8qCisgKiBUaGlzIGlzIGEgYml0bWFzayB0aGF0IGlzIG9yZWQgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIGNvZGVzLgorICogSXQgdGVsbHMgdGhlIG1pZC1sZXZlbCBjb2RlIHRoYXQgd2UgZGlkIGEgaG9zdCBhZGFwdGVyIHJlc2V0LgorICovCisjZGVmaW5lIFNDU0lfUkVTRVRfSE9TVF9SRVNFVCAweDIwMAorLyoKKyAqIFVzZWQgdG8gbWFzayBvZmYgYml0cyBhbmQgdG8gb2J0YWluIHRoZSBiYXNpYyBhY3Rpb24gdGhhdCB3YXMKKyAqIHBlcmZvcm1lZC4gIAorICovCisjZGVmaW5lIFNDU0lfUkVTRVRfQUNUSU9OICAgMHhmZgorCisjZW5kaWYJCQkJLyogU0NTSV9PQlNPTEVURV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmggYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhM2IzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaApAQCAtMCwwICsxLDE2NSBAQAorI2lmbmRlZiBfU0NTSV9QUklWX0gKKyNkZWZpbmUgX1NDU0lfUFJJVl9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworc3RydWN0IHJlcXVlc3RfcXVldWU7CitzdHJ1Y3Qgc2NzaV9jbW5kOworc3RydWN0IHNjc2lfZGV2aWNlOworc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZTsKK3N0cnVjdCBzY3NpX3JlcXVlc3Q7CitzdHJ1Y3QgU2NzaV9Ib3N0OworCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHRoZSBvd25lciBmaWVsZCBjYW4gdGFrZS4KKyAqIFRoZXkgYXJlIHVzZWQgYXMgYW4gaW5kaWNhdGlvbiBvZiB3aG8gdGhlIGNvbW1hbmQgYmVsb25ncyB0by4KKyAqLworI2RlZmluZSBTQ1NJX09XTkVSX0hJR0hMRVZFTCAgICAgIDB4MTAwCisjZGVmaW5lIFNDU0lfT1dORVJfTUlETEVWRUwgICAgICAgMHgxMDEKKyNkZWZpbmUgU0NTSV9PV05FUl9MT1dMRVZFTCAgICAgICAweDEwMgorI2RlZmluZSBTQ1NJX09XTkVSX0VSUk9SX0hBTkRMRVIgIDB4MTAzCisjZGVmaW5lIFNDU0lfT1dORVJfQkhfSEFORExFUiAgICAgMHgxMDQKKyNkZWZpbmUgU0NTSV9PV05FUl9OT0JPRFkgICAgICAgICAweDEwNQorCisvKgorICogTWFnaWMgdmFsdWVzIGZvciBjZXJ0YWluIHNjc2kgc3RydWN0cy4gU2hvdWxkbid0IGV2ZXIgYmUgdXNlZC4KKyAqLworI2RlZmluZSBTQ1NJX0NNTkRfTUFHSUMJCTB4RTI1QzIzQTUKKyNkZWZpbmUgU0NTSV9SRVFfTUFHSUMJCTB4NzVGNkQzNTQKKworLyoKKyAqICBGbGFnIGJpdCBmb3IgdGhlIGludGVybmFsX3RpbWVvdXQgYXJyYXkKKyAqLworI2RlZmluZSBOT1JNQUxfVElNRU9VVAkJMAorCisvKgorICogU2NzaSBFcnJvciBIYW5kbGVyIEZsYWdzCisgKi8KKyNkZWZpbmUgc2NzaV9laF9lZmxhZ3NfY2hrKHNjcCwgZmxhZ3MpIFwKKwkoKHNjcCktPmVoX2VmbGFncyAmIChmbGFncykpCisjZGVmaW5lIHNjc2lfZWhfZWZsYWdzX3NldChzY3AsIGZsYWdzKSBcCisJZG8geyAoc2NwKS0+ZWhfZWZsYWdzIHw9IChmbGFncyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgc2NzaV9laF9lZmxhZ3NfY2xyKHNjcCwgZmxhZ3MpIFwKKwlkbyB7IChzY3ApLT5laF9lZmxhZ3MgJj0gfihmbGFncyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgc2NzaV9laF9lZmxhZ3NfY2xyX2FsbChzY3ApIFwKKwkoc2NwLT5laF9lZmxhZ3MgPSAwKQorCisjZGVmaW5lIFNDU0lfRUhfQ0FOQ0VMX0NNRAkweDAwMDEJLyogQ2FuY2VsIHRoaXMgY21kICovCisjZGVmaW5lIFNDU0lfRUhfUkVDX1RJTUVPVVQJMHgwMDAyCS8qIEVIIHJldHJ5IHRpbWVkIG91dCAqLworCisjZGVmaW5lIFNDU0lfU0VOU0VfVkFMSUQoc2NtZCkgXAorCSgoKHNjbWQpLT5zZW5zZV9idWZmZXJbMF0gJiAweDcwKSA9PSAweDcwKQorCisvKgorICogU3BlY2lhbCB2YWx1ZSBmb3Igc2Nhbm5pbmcgdG8gc3BlY2lmeSBzY2FubmluZyBvciByZXNjYW5uaW5nIG9mIGFsbAorICogcG9zc2libGUgY2hhbm5lbHMsICh0YXJnZXQpIGlkcywgb3IgbHVucyBvbiBhIGdpdmVuIHNob3N0LgorICovCisjZGVmaW5lIFNDQU5fV0lMRF9DQVJECX4wCisKKy8qIGhvc3RzLmMgKi8KK2V4dGVybiBpbnQgc2NzaV9pbml0X2hvc3RzKHZvaWQpOworZXh0ZXJuIHZvaWQgc2NzaV9leGl0X2hvc3RzKHZvaWQpOworCisvKiBzY3NpLmMgKi8KK2V4dGVybiBpbnQgc2NzaV9kaXNwYXRjaF9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBpbnQgc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2V4dGVybiB2b2lkIHNjc2lfZGVzdHJveV9jb21tYW5kX2ZyZWVsaXN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2V4dGVybiB2b2lkIHNjc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworZXh0ZXJuIGludCBzY3NpX3JldHJ5X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBpbnQgc2NzaV9pbnNlcnRfc3BlY2lhbF9yZXEoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgaW50KTsKK2V4dGVybiB2b2lkIHNjc2lfaW5pdF9jbWRfZnJvbV9yZXEoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxKTsKK2V4dGVybiB2b2lkIF9fc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSk7CitleHRlcm4gdm9pZCBfX3Njc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKK3ZvaWQgc2NzaV9sb2dfc2VuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwordm9pZCBzY3NpX2xvZ19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IGRpc3Bvc2l0aW9uKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9sb2dfc2VuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpIAorCXsgfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3NpX2xvZ19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IGRpc3Bvc2l0aW9uKQorCXsgfTsKKyNlbmRpZgorCisvKiBzY3NpX2RldmluZm8uYyAqLworZXh0ZXJuIGludCBzY3NpX2dldF9kZXZpY2VfZmxhZ3Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSB1bnNpZ25lZCBjaGFyICp2ZW5kb3IsIHVuc2lnbmVkIGNoYXIgKm1vZGVsKTsKK2V4dGVybiBpbnQgX19pbml0IHNjc2lfaW5pdF9kZXZpbmZvKHZvaWQpOworZXh0ZXJuIHZvaWQgc2NzaV9leGl0X2RldmluZm8odm9pZCk7CisKKy8qIHNjc2lfZXJyb3IuYyAqLworZXh0ZXJuIHZvaWQgc2NzaV90aW1lc19vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBpbnQgc2NzaV9lcnJvcl9oYW5kbGVyKHZvaWQgKmhvc3QpOworZXh0ZXJuIGludCBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworZXh0ZXJuIHZvaWQgc2NzaV9laF93YWtldXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOworZXh0ZXJuIGludCBzY3NpX2VoX3NjbWRfYWRkKHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50KTsKKworLyogc2NzaV9saWIuYyAqLworZXh0ZXJuIGludCBzY3NpX21heWJlX3VuYmxvY2tfaG9zdChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIHZvaWQgc2NzaV9zZXR1cF9jbWRfcmV0cnkoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiB2b2lkIHNjc2lfZGV2aWNlX3VuYnVzeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIGludCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pOworZXh0ZXJuIHZvaWQgc2NzaV9uZXh0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiB2b2lkIHNjc2lfcnVuX2hvc3RfcXVldWVzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqc2NzaV9hbGxvY19xdWV1ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIHZvaWQgc2NzaV9mcmVlX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK2V4dGVybiBpbnQgc2NzaV9pbml0X3F1ZXVlKHZvaWQpOworZXh0ZXJuIHZvaWQgc2NzaV9leGl0X3F1ZXVlKHZvaWQpOworCisvKiBzY3NpX3Byb2MuYyAqLworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKK2V4dGVybiB2b2lkIHNjc2lfcHJvY19ob3N0ZGlyX2FkZChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICopOworZXh0ZXJuIHZvaWQgc2NzaV9wcm9jX2hvc3RkaXJfcm0oc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKK2V4dGVybiB2b2lkIHNjc2lfcHJvY19ob3N0X2FkZChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworZXh0ZXJuIHZvaWQgc2NzaV9wcm9jX2hvc3Rfcm0oc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBpbnQgc2NzaV9pbml0X3Byb2Nmcyh2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfZXhpdF9wcm9jZnModm9pZCk7CisjZWxzZQorIyBkZWZpbmUgc2NzaV9wcm9jX2hvc3RkaXJfYWRkKHNodCkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgc2NzaV9wcm9jX2hvc3RkaXJfcm0oc2h0KQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzY3NpX3Byb2NfaG9zdF9hZGQoc2hvc3QpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHNjc2lfcHJvY19ob3N0X3JtKHNob3N0KQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzY3NpX2luaXRfcHJvY2ZzKCkJCSgwKQorIyBkZWZpbmUgc2NzaV9leGl0X3Byb2NmcygpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyogc2NzaV9zY2FuLmMgKi8KK2V4dGVybiBpbnQgc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc3RydWN0IFNjc2lfSG9zdCAqLCB1bnNpZ25lZCBpbnQsCisJCQkJICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBzY3NpX2ZvcmdldF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKik7CitleHRlcm4gdm9pZCBzY3NpX3Jlc2Nhbl9kZXZpY2Uoc3RydWN0IGRldmljZSAqKTsKKworLyogc2NzaV9zeXNjdGwuYyAqLworI2lmZGVmIENPTkZJR19TWVNDVEwKK2V4dGVybiBpbnQgc2NzaV9pbml0X3N5c2N0bCh2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfZXhpdF9zeXNjdGwodm9pZCk7CisjZWxzZQorIyBkZWZpbmUgc2NzaV9pbml0X3N5c2N0bCgpCQkoMCkKKyMgZGVmaW5lIHNjc2lfZXhpdF9zeXNjdGwoKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworLyogc2NzaV9zeXNmcy5jICovCitleHRlcm4gdm9pZCBzY3NpX2RldmljZV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICopOworZXh0ZXJuIGludCBzY3NpX3N5c2ZzX2FkZF9zZGV2KHN0cnVjdCBzY3NpX2RldmljZSAqKTsKK2V4dGVybiBpbnQgc2NzaV9zeXNmc19hZGRfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICopOworZXh0ZXJuIGludCBzY3NpX3N5c2ZzX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgc2NzaV9zeXNmc191bnJlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgc2NzaV9zeXNmc19kZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitleHRlcm4gaW50IHNjc2lfc3lzZnNfdGFyZ2V0X2luaXRpYWxpemUoc3RydWN0IHNjc2lfZGV2aWNlICopOworZXh0ZXJuIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSBibGFua190cmFuc3BvcnRfdGVtcGxhdGU7CisKK2V4dGVybiBzdHJ1Y3QgY2xhc3Mgc2Rldl9jbGFzczsKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgc2NzaV9idXNfdHlwZTsKKworLyogCisgKiBpbnRlcm5hbCBzY3NpIHRpbWVvdXQgZnVuY3Rpb25zOiBmb3IgdXNlIGJ5IG1pZC1sYXllciBhbmQgdHJhbnNwb3J0CisgKiBjbGFzc2VzLgorICovCisKKyNkZWZpbmUgU0NTSV9ERVZJQ0VfQkxPQ0tfTUFYX1RJTUVPVVQJKEhaKjYwKQorZXh0ZXJuIGludCBzY3NpX2ludGVybmFsX2RldmljZV9ibG9jayhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIGludCBzY3NpX2ludGVybmFsX2RldmljZV91bmJsb2NrKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CisKKyNlbmRpZiAvKiBfU0NTSV9QUklWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTA5NThiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJvYy5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogbGludXgvZHJpdmVycy9zY3NpL3Njc2lfcHJvYy5jCisgKgorICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgcHJvdmlkZSBhbiBpbnRlcmZhY2UgYmV0d2VlbgorICogdGhlIFBST0MgZmlsZSBzeXN0ZW0gYW5kIHRoZSBTQ1NJIGRldmljZSBkcml2ZXJzCisgKiBJdCBpcyBtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzdGF0aXN0aWNzIGFuZCB0byBwYXNzIAorICogaW5mb3JtYXRpb24gZGlyZWN0bHkgdG8gdGhlIGxvd2xldmVsIGRyaXZlci4KKyAqCisgKiAoYykgMTk5NSBNaWNoYWVsIE5ldWZmZXIgbmV1ZmZlckBnb29meS56ZHYudW5pLW1haW56LmRlIAorICogVmVyc2lvbjogMC45OS44ICAgbGFzdCBjaGFuZ2U6IDk1LzA5LzEzCisgKiAKKyAqIGdlbmVyaWMgY29tbWFuZCBwYXJzZXIgcHJvdmlkZWQgYnk6IAorICogQW5kcmVhcyBIZWlsd2FnZW4gPGNyYXNoY2FyQGluZm9ybWF0aWsudW5pLWtvYmxlbnouZGU+CisgKgorICogZ2VuZXJpY19wcm9jX2luZm8oKSBzdXBwb3J0IG9mIHh4eHhfaW5mbygpIGJ5OgorICogTWljaGFlbCBBLiBHcmlmZml0aCA8Z3JpZkBhY20ub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworCisvKiA0SyBwYWdlIHNpemUsIGJ1dCBvdXIgb3V0cHV0IHJvdXRpbmVzLCB1c2Ugc29tZSBzbGFjayBmb3Igb3ZlcnJ1bnMgKi8KKyNkZWZpbmUgUFJPQ19CTE9DS19TSVpFICgzKjEwMjQpCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfc2NzaTsKKworLyogUHJvdGVjdCBzaHQtPnByZXNlbnQgYW5kIHNodC0+cHJvY19kaXIgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7CisKK3N0YXRpYyBpbnQgcHJvY19zY3NpX3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkYXRhOworCWludCBuOworCisJbiA9IHNob3N0LT5ob3N0dC0+cHJvY19pbmZvKHNob3N0LCBidWZmZXIsIHN0YXJ0LCBvZmZzZXQsIGxlbmd0aCwgMCk7CisJKmVvZiA9IChuIDwgbGVuZ3RoKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHByb2Nfc2NzaV93cml0ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRhdGE7CisJc3NpemVfdCByZXQgPSAtRU5PTUVNOworCWNoYXIgKnBhZ2U7CisJY2hhciAqc3RhcnQ7CisgICAgCisJaWYgKGNvdW50ID4gUFJPQ19CTE9DS19TSVpFKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCXBhZ2UgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAocGFnZSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gc2hvc3QtPmhvc3R0LT5wcm9jX2luZm8oc2hvc3QsIHBhZ2UsICZzdGFydCwgMCwgY291bnQsIDEpOworCX0KK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzY3NpX3Byb2NfaG9zdGRpcl9hZGQoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KQoreworCWlmICghc2h0LT5wcm9jX2luZm8pCisJCXJldHVybjsKKworCWRvd24oJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7CisJaWYgKCFzaHQtPnByZXNlbnQrKykgeworCQlzaHQtPnByb2NfZGlyID0gcHJvY19ta2RpcihzaHQtPnByb2NfbmFtZSwgcHJvY19zY3NpKTsKKyAgICAgICAgCWlmICghc2h0LT5wcm9jX2RpcikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHByb2NfbWtkaXIgZmFpbGVkIGZvciAlc1xuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHNodC0+cHJvY19uYW1lKTsKKwkJZWxzZQorCQkJc2h0LT5wcm9jX2Rpci0+b3duZXIgPSBzaHQtPm1vZHVsZTsKKwl9CisJdXAoJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7Cit9CisKK3ZvaWQgc2NzaV9wcm9jX2hvc3RkaXJfcm0oc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KQoreworCWlmICghc2h0LT5wcm9jX2luZm8pCisJCXJldHVybjsKKworCWRvd24oJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7CisJaWYgKCEtLXNodC0+cHJlc2VudCAmJiBzaHQtPnByb2NfZGlyKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHNodC0+cHJvY19uYW1lLCBwcm9jX3Njc2kpOworCQlzaHQtPnByb2NfZGlyID0gTlVMTDsKKwl9CisJdXAoJmdsb2JhbF9ob3N0X3RlbXBsYXRlX3NlbSk7Cit9CisKK3ZvaWQgc2NzaV9wcm9jX2hvc3RfYWRkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNob3N0LT5ob3N0dDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisJY2hhciBuYW1lWzEwXTsKKworCWlmICghc2h0LT5wcm9jX2RpcikKKwkJcmV0dXJuOworCisJc3ByaW50ZihuYW1lLCIlZCIsIHNob3N0LT5ob3N0X25vKTsKKwlwID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaHQtPnByb2NfZGlyLCBwcm9jX3Njc2lfcmVhZCwgc2hvc3QpOworCWlmICghcCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgaG9zdCAlZCBpbiIKKwkJICAgICAgICIlc1xuIiwgX19GVU5DVElPTl9fLCBzaG9zdC0+aG9zdF9ubywKKwkJICAgICAgIHNodC0+cHJvY19uYW1lKTsKKwkJcmV0dXJuOworCX0gCisKKwlwLT53cml0ZV9wcm9jID0gcHJvY19zY3NpX3dyaXRlX3Byb2M7CisJcC0+b3duZXIgPSBzaHQtPm1vZHVsZTsKK30KKwordm9pZCBzY3NpX3Byb2NfaG9zdF9ybShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwljaGFyIG5hbWVbMTBdOworCisJaWYgKCFzaG9zdC0+aG9zdHQtPnByb2NfZGlyKQorCQlyZXR1cm47CisKKwlzcHJpbnRmKG5hbWUsIiVkIiwgc2hvc3QtPmhvc3Rfbm8pOworCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIHNob3N0LT5ob3N0dC0+cHJvY19kaXIpOworfQorCitzdGF0aWMgaW50IHByb2NfcHJpbnRfc2NzaWRldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnMgPSBkYXRhOworCWludCBpOworCisJc2VxX3ByaW50ZihzLAorCQkiSG9zdDogc2NzaSVkIENoYW5uZWw6ICUwMmQgSWQ6ICUwMmQgTHVuOiAlMDJkXG4gIFZlbmRvcjogIiwKKwkJc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoc2Rldi0+dmVuZG9yW2ldID49IDB4MjApCisJCQlzZXFfcHJpbnRmKHMsICIlYyIsIHNkZXYtPnZlbmRvcltpXSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYocywgIiAiKTsKKwl9CisKKwlzZXFfcHJpbnRmKHMsICIgTW9kZWw6ICIpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChzZGV2LT5tb2RlbFtpXSA+PSAweDIwKQorCQkJc2VxX3ByaW50ZihzLCAiJWMiLCBzZGV2LT5tb2RlbFtpXSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYocywgIiAiKTsKKwl9CisKKwlzZXFfcHJpbnRmKHMsICIgUmV2OiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChzZGV2LT5yZXZbaV0gPj0gMHgyMCkKKwkJCXNlcV9wcmludGYocywgIiVjIiwgc2Rldi0+cmV2W2ldKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzLCAiICIpOworCX0KKworCXNlcV9wcmludGYocywgIlxuIik7CisKKwlzZXFfcHJpbnRmKHMsICIgIFR5cGU6ICAgJXMgIiwKKwkJICAgICBzZGV2LT50eXBlIDwgTUFYX1NDU0lfREVWSUNFX0NPREUgPworCSAgICAgICBzY3NpX2RldmljZV90eXBlc1soaW50KSBzZGV2LT50eXBlXSA6ICJVbmtub3duICAgICAgICAgICIpOworCXNlcV9wcmludGYocywgIiAgICAgICAgICAgICAgIEFOU0kiCisJCSAgICAgIiBTQ1NJIHJldmlzaW9uOiAlMDJ4IiwgKHNkZXYtPnNjc2lfbGV2ZWwgLSAxKSA/CisJCSAgICAgc2Rldi0+c2NzaV9sZXZlbCAtIDEgOiAxKTsKKwlpZiAoc2Rldi0+c2NzaV9sZXZlbCA9PSAyKQorCQlzZXFfcHJpbnRmKHMsICIgQ0NTXG4iKTsKKwllbHNlCisJCXNlcV9wcmludGYocywgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY3NpX2FkZF9zaW5nbGVfZGV2aWNlKHVpbnQgaG9zdCwgdWludCBjaGFubmVsLCB1aW50IGlkLCB1aW50IGx1bikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlpbnQgZXJyb3IgPSAtRU5YSU87CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoaG9zdCk7CisJaWYgKElTX0VSUihzaG9zdCkpCisJCXJldHVybiBQVFJfRVJSKHNob3N0KTsKKworCWVycm9yID0gc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIDEpOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBzY3NpX3JlbW92ZV9zaW5nbGVfZGV2aWNlKHVpbnQgaG9zdCwgdWludCBjaGFubmVsLCB1aW50IGlkLCB1aW50IGx1bikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGVycm9yID0gLUVOWElPOworCisJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGhvc3QpOworCWlmIChJU19FUlIoc2hvc3QpKQorCQlyZXR1cm4gUFRSX0VSUihzaG9zdCk7CisJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1bik7CisJaWYgKHNkZXYpIHsKKwkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOworCQlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJCWVycm9yID0gMDsKKwl9CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfc2NzaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGhvc3QsIGNoYW5uZWwsIGlkLCBsdW47CisJY2hhciAqYnVmZmVyLCAqcDsKKwlpbnQgZXJyOworCisJaWYgKCFidWYgfHwgbGVuZ3RoID4gUEFHRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZmZlciA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgYnVmLCBsZW5ndGgpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGxlbmd0aCA8IFBBR0VfU0laRSkKKwkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOworCWVsc2UgaWYgKGJ1ZmZlcltQQUdFX1NJWkUtMV0pCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBVc2FnZTogZWNobyAic2NzaSBhZGQtc2luZ2xlLWRldmljZSAwIDEgMiAzIiA+L3Byb2Mvc2NzaS9zY3NpCisJICogd2l0aCAgIjAgMSAyIDMiIHJlcGxhY2VkIGJ5IHlvdXIgIkhvc3QgQ2hhbm5lbCBJZCBMdW4iLgorCSAqLworCWlmICghc3RybmNtcCgic2NzaSBhZGQtc2luZ2xlLWRldmljZSIsIGJ1ZmZlciwgMjIpKSB7CisJCXAgPSBidWZmZXIgKyAyMzsKKworCQlob3N0ID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDApOworCQljaGFubmVsID0gc2ltcGxlX3N0cnRvdWwocCArIDEsICZwLCAwKTsKKwkJaWQgPSBzaW1wbGVfc3RydG91bChwICsgMSwgJnAsIDApOworCQlsdW4gPSBzaW1wbGVfc3RydG91bChwICsgMSwgJnAsIDApOworCisJCWVyciA9IHNjc2lfYWRkX3NpbmdsZV9kZXZpY2UoaG9zdCwgY2hhbm5lbCwgaWQsIGx1bik7CisJCWlmIChlcnIgPj0gMCkKKwkJCWVyciA9IGxlbmd0aDsKKworCS8qCisJICogVXNhZ2U6IGVjaG8gInNjc2kgcmVtb3ZlLXNpbmdsZS1kZXZpY2UgMCAxIDIgMyIgPi9wcm9jL3Njc2kvc2NzaQorCSAqIHdpdGggICIwIDEgMiAzIiByZXBsYWNlZCBieSB5b3VyICJIb3N0IENoYW5uZWwgSWQgTHVuIi4KKwkgKi8KKwl9IGVsc2UgaWYgKCFzdHJuY21wKCJzY3NpIHJlbW92ZS1zaW5nbGUtZGV2aWNlIiwgYnVmZmVyLCAyNSkpIHsKKwkJcCA9IGJ1ZmZlciArIDI2OworCisJCWhvc3QgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMCk7CisJCWNoYW5uZWwgPSBzaW1wbGVfc3RydG91bChwICsgMSwgJnAsIDApOworCQlpZCA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCAmcCwgMCk7CisJCWx1biA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCAmcCwgMCk7CisKKwkJZXJyID0gc2NzaV9yZW1vdmVfc2luZ2xlX2RldmljZShob3N0LCBjaGFubmVsLCBpZCwgbHVuKTsKKwl9CisKKyBvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcm9jX3Njc2lfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJc2VxX3ByaW50ZihzLCAiQXR0YWNoZWQgZGV2aWNlczpcbiIpOworCWJ1c19mb3JfZWFjaF9kZXYoJnNjc2lfYnVzX3R5cGUsIE5VTEwsIHMsIHByb2NfcHJpbnRfc2NzaWRldmljZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zY3NpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiBXZSBkb24ndCByZWFsbHkgbmVlZHMgdGhpcyBmb3IgdGhlIHdyaXRlIGNhc2UgYnV0IGl0IGRvZXNuJ3QKKwkgKiBoYXJtIGVpdGhlci4KKwkgKi8KKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19zY3NpX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Njc2lfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBwcm9jX3Njc2lfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19zY3NpX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitpbnQgX19pbml0IHNjc2lfaW5pdF9wcm9jZnModm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXByb2Nfc2NzaSA9IHByb2NfbWtkaXIoInNjc2kiLCBOVUxMKTsKKwlpZiAoIXByb2Nfc2NzaSkKKwkJZ290byBlcnIxOworCisJcGRlID0gY3JlYXRlX3Byb2NfZW50cnkoInNjc2kvc2NzaSIsIDAsIE5VTEwpOworCWlmICghcGRlKQorCQlnb3RvIGVycjI7CisJcGRlLT5wcm9jX2ZvcHMgPSAmcHJvY19zY3NpX29wZXJhdGlvbnM7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwlyZW1vdmVfcHJvY19lbnRyeSgic2NzaSIsIE5VTEwpOworZXJyMToKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBzY3NpX2V4aXRfcHJvY2ZzKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoInNjc2kvc2NzaSIsIE5VTEwpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJzY3NpIiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhMzdhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMCwwICsxLDE0NzMgQEAKKy8qCisgKiBzY3NpX3NjYW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBFcmljIFlvdW5nZGFsZSwKKyAqIENvcHlyaWdodCAoQykgMjAwMiBQYXRyaWNrIE1hbnNmaWVsZAorICoKKyAqIFRoZSBnZW5lcmFsIHNjYW5uaW5nL3Byb2JpbmcgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3MsIGV4Y2VwdGlvbnMgYXJlCisgKiBtYWRlIHRvIGl0IGRlcGVuZGluZyBvbiBkZXZpY2Ugc3BlY2lmaWMgZmxhZ3MsIGNvbXBpbGF0aW9uIG9wdGlvbnMsIGFuZAorICogZ2xvYmFsIHZhcmlhYmxlIChib290IG9yIG1vZHVsZSBsb2FkIHRpbWUpIHNldHRpbmdzLgorICoKKyAqIEEgc3BlY2lmaWMgTFVOIGlzIHNjYW5uZWQgdmlhIGFuIElOUVVJUlkgY29tbWFuZDsgaWYgdGhlIExVTiBoYXMgYQorICogZGV2aWNlIGF0dGFjaGVkLCBhIFNjc2lfRGV2aWNlIGlzIGFsbG9jYXRlZCBhbmQgc2V0dXAgZm9yIGl0LgorICoKKyAqIEZvciBldmVyeSBpZCBvZiBldmVyeSBjaGFubmVsIG9uIHRoZSBnaXZlbiBob3N0OgorICoKKyAqIAlTY2FuIExVTiAwOyBpZiB0aGUgdGFyZ2V0IHJlc3BvbmRzIHRvIExVTiAwIChldmVuIGlmIHRoZXJlIGlzIG5vCisgKiAJZGV2aWNlIG9yIHN0b3JhZ2UgYXR0YWNoZWQgdG8gTFVOIDApOgorICoKKyAqIAkJSWYgTFVOIDAgaGFzIGEgZGV2aWNlIGF0dGFjaGVkLCBhbGxvY2F0ZSBhbmQgc2V0dXAgYQorICogCQlTY3NpX0RldmljZSBmb3IgaXQuCisgKgorICogCQlJZiB0YXJnZXQgaXMgU0NTSS0zIG9yIHVwLCBpc3N1ZSBhIFJFUE9SVCBMVU4sIGFuZCBzY2FuCisgKiAJCWFsbCBvZiB0aGUgTFVOcyByZXR1cm5lZCBieSB0aGUgUkVQT1JUIExVTjsgZWxzZSwKKyAqIAkJc2VxdWVudGlhbGx5IHNjYW4gTFVOcyB1cCB1bnRpbCBzb21lIG1heGltdW0gaXMgcmVhY2hlZCwKKyAqIAkJb3IgYSBMVU4gaXMgc2VlbiB0aGF0IGNhbm5vdCBoYXZlIGEgZGV2aWNlIGF0dGFjaGVkIHRvIGl0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpbmZvLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKworI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCisjZGVmaW5lIEFMTE9DX0ZBSUxVUkVfTVNHCUtFUk5fRVJSICIlczogQWxsb2NhdGlvbiBmYWlsdXJlIGR1cmluZyIgXAorCSIgU0NTSSBzY2FubmluZywgc29tZSBTQ1NJIGRldmljZXMgbWlnaHQgbm90IGJlIGNvbmZpZ3VyZWRcbiIKKworLyoKKyAqIERlZmF1bHQgdGltZW91dAorICovCisjZGVmaW5lIFNDU0lfVElNRU9VVCAoMipIWikKKworLyoKKyAqIFByZWZpeCB2YWx1ZXMgZm9yIHRoZSBTQ1NJIGlkJ3MgKHN0b3JlZCBpbiBkcml2ZXJmcyBuYW1lIGZpZWxkKQorICovCisjZGVmaW5lIFNDU0lfVUlEX1NFUl9OVU0gJ1MnCisjZGVmaW5lIFNDU0lfVUlEX1VOS05PV04gJ1onCisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIG9mIHNvbWUgb2YgdGhlIHNjYW5uaW5nIGZ1bmN0aW9ucy4KKyAqCisgKiBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U6IG5vIHZhbGlkIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIHRhcmdldCwgdGhpcworICogaW5jbHVkZXMgYWxsb2NhdGlvbiBvciBnZW5lcmFsIGZhaWx1cmVzIHByZXZlbnRpbmcgSU8gZnJvbSBiZWluZyBzZW50LgorICoKKyAqIFNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVDogdGFyZ2V0IHJlc3BvbmRlZCwgYnV0IG5vIGRldmljZSBpcyBhdmFpbGFibGUKKyAqIG9uIHRoZSBnaXZlbiBMVU4uCisgKgorICogU0NTSV9TQ0FOX0xVTl9QUkVTRU5UOiB0YXJnZXQgcmVzcG9uZGVkLCBhbmQgYSBkZXZpY2UgaXMgYXZhaWxhYmxlIG9uIGEKKyAqIGdpdmVuIExVTi4KKyAqLworI2RlZmluZSBTQ1NJX1NDQU5fTk9fUkVTUE9OU0UJCTAKKyNkZWZpbmUgU0NTSV9TQ0FOX1RBUkdFVF9QUkVTRU5UCTEKKyNkZWZpbmUgU0NTSV9TQ0FOX0xVTl9QUkVTRU5UCQkyCisKK3N0YXRpYyBjaGFyICpzY3NpX251bGxfZGV2aWNlX3N0cnMgPSAibnVsbG51bGxudWxsbnVsbCI7CisKKyNkZWZpbmUgTUFYX1NDU0lfTFVOUwk1MTIKKworI2lmZGVmIENPTkZJR19TQ1NJX01VTFRJX0xVTgorc3RhdGljIHVuc2lnbmVkIGludCBtYXhfc2NzaV9sdW5zID0gTUFYX1NDU0lfTFVOUzsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9zY3NpX2x1bnMgPSAxOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfbHVucywgbWF4X3Njc2lfbHVucywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfbHVucywKKwkJICJsYXN0IHNjc2kgTFVOIChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyXjMyLTEpIik7CisKKy8qCisgKiBtYXhfc2NzaV9yZXBvcnRfbHVuczogdGhlIG1heGltdW0gbnVtYmVyIG9mIExVTlMgdGhhdCB3aWxsIGJlCisgKiByZXR1cm5lZCBmcm9tIHRoZSBSRVBPUlQgTFVOUyBjb21tYW5kLiA4IHRpbWVzIHRoaXMgdmFsdWUgbXVzdAorICogYmUgYWxsb2NhdGVkLiBJbiB0aGVvcnkgdGhpcyBjb3VsZCBiZSB1cCB0byBhbiA4IGJ5dGUgdmFsdWUsIGJ1dAorICogaW4gcHJhY3RpY2UsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBMVU5zIHN1cHBvcmVkIGJ5IGFueSBkZXZpY2UKKyAqIGlzIGFib3V0IDE2ay4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfc2NzaV9yZXBvcnRfbHVucyA9IDUxMTsKKworbW9kdWxlX3BhcmFtX25hbWVkKG1heF9yZXBvcnRfbHVucywgbWF4X3Njc2lfcmVwb3J0X2x1bnMsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3JlcG9ydF9sdW5zLAorCQkgIlJFUE9SVCBMVU5TIG1heGltdW0gbnVtYmVyIG9mIExVTlMgcmVjZWl2ZWQgKHNob3VsZCBiZSIKKwkJICIgYmV0d2VlbiAxIGFuZCAxNjM4NCkiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzY3NpX2lucV90aW1lb3V0ID0gU0NTSV9USU1FT1VUL0haKzM7CisKK21vZHVsZV9wYXJhbV9uYW1lZChpbnFfdGltZW91dCwgc2NzaV9pbnFfdGltZW91dCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhpbnFfdGltZW91dCwgCisJCSAiVGltZW91dCAoaW4gc2Vjb25kcykgd2FpdGluZyBmb3IgZGV2aWNlcyB0byBhbnN3ZXIgSU5RVUlSWS4iCisJCSAiIERlZmF1bHQgaXMgNS4gU29tZSBub24tY29tcGxpYW50IGRldmljZXMgbmVlZCBtb3JlLiIpOworCisvKioKKyAqIHNjc2lfdW5sb2NrX2Zsb3B0aWNhbCAtIHVubG9jayBkZXZpY2UgdmlhIGEgc3BlY2lhbCBNT0RFIFNFTlNFIGNvbW1hbmQKKyAqIEBzcmVxOgl1c2VkIHRvIHNlbmQgdGhlIGNvbW1hbmQKKyAqIEByZXN1bHQ6CWFyZWEgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgTU9ERSBTRU5TRQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIFNlbmQgYSB2ZW5kb3Igc3BlY2lmaWMgTU9ERSBTRU5TRSAobm90IGEgTU9ERSBTRUxFQ1QpIGNvbW1hbmQgdXNpbmcKKyAqICAgICBAc3JlcSB0byB1bmxvY2sgYSBkZXZpY2UsIHN0b3JpbmcgdGhlICh1bnVzZWQpIHJlc3VsdHMgaW50byByZXN1bHQuCisgKiAgICAgQ2FsbGVkIGZvciBCTElTVF9LRVkgZGV2aWNlcy4KKyAqKi8KK3N0YXRpYyB2b2lkIHNjc2lfdW5sb2NrX2Zsb3B0aWNhbChzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLAorCQkJCSAgdW5zaWduZWQgY2hhciAqcmVzdWx0KQoreworCXVuc2lnbmVkIGNoYXIgc2NzaV9jbWRbTUFYX0NPTU1BTkRfU0laRV07CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2k6IHVubG9ja2luZyBmbG9wdGljYWwgZHJpdmVcbiIpOworCXNjc2lfY21kWzBdID0gTU9ERV9TRU5TRTsKKwlzY3NpX2NtZFsxXSA9IDA7CisJc2NzaV9jbWRbMl0gPSAweDJlOworCXNjc2lfY21kWzNdID0gMDsKKwlzY3NpX2NtZFs0XSA9IDB4MmE7CS8qIHNpemUgKi8KKwlzY3NpX2NtZFs1XSA9IDA7CisJc3JlcS0+c3JfY21kX2xlbiA9IDA7CisJc3JlcS0+c3JfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJc2NzaV93YWl0X3JlcShzcmVxLCBzY3NpX2NtZCwgcmVzdWx0LCAweDJhIC8qIHNpemUgKi8sIFNDU0lfVElNRU9VVCwgMyk7Cit9CisKKy8qKgorICogcHJpbnRfaW5xdWlyeSAtIHByaW50ayB0aGUgaW5xdWlyeSBpbmZvcm1hdGlvbgorICogQGlucV9yZXN1bHQ6CXByaW50ayB0aGlzIFNDU0kgSU5RVUlSWQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIHByaW50ayB0aGUgdmVuZG9yLCBtb2RlbCwgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZQorICogICAgIElOUVVJUlkgZGF0YSBpbiBAaW5xX3Jlc3VsdC4KKyAqCisgKiBOb3RlczoKKyAqICAgICBSZW1vdmUgdGhpcywgYW5kIHJlcGxhY2Ugd2l0aCBhIGhvdHBsdWcgZXZlbnQgdGhhdCBsb2dzIGFueQorICogICAgIHJlbGV2YW50IGluZm9ybWF0aW9uLgorICoqLworc3RhdGljIHZvaWQgcHJpbnRfaW5xdWlyeSh1bnNpZ25lZCBjaGFyICppbnFfcmVzdWx0KQoreworCWludCBpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIgIFZlbmRvcjogIik7CisJZm9yIChpID0gODsgaSA8IDE2OyBpKyspCisJCWlmIChpbnFfcmVzdWx0W2ldID49IDB4MjAgJiYgaSA8IGlucV9yZXN1bHRbNF0gKyA1KQorCQkJcHJpbnRrKCIlYyIsIGlucV9yZXN1bHRbaV0pOworCQllbHNlCisJCQlwcmludGsoIiAiKTsKKworCXByaW50aygiICBNb2RlbDogIik7CisJZm9yIChpID0gMTY7IGkgPCAzMjsgaSsrKQorCQlpZiAoaW5xX3Jlc3VsdFtpXSA+PSAweDIwICYmIGkgPCBpbnFfcmVzdWx0WzRdICsgNSkKKwkJCXByaW50aygiJWMiLCBpbnFfcmVzdWx0W2ldKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgIik7CisKKwlwcmludGsoIiAgUmV2OiAiKTsKKwlmb3IgKGkgPSAzMjsgaSA8IDM2OyBpKyspCisJCWlmIChpbnFfcmVzdWx0W2ldID49IDB4MjAgJiYgaSA8IGlucV9yZXN1bHRbNF0gKyA1KQorCQkJcHJpbnRrKCIlYyIsIGlucV9yZXN1bHRbaV0pOworCQllbHNlCisJCQlwcmludGsoIiAiKTsKKworCXByaW50aygiXG4iKTsKKworCWkgPSBpbnFfcmVzdWx0WzBdICYgMHgxZjsKKworCXByaW50ayhLRVJOX05PVElDRSAiICBUeXBlOiAgICVzICIsCisJICAgICAgIGkgPAorCSAgICAgICBNQVhfU0NTSV9ERVZJQ0VfQ09ERSA/IHNjc2lfZGV2aWNlX3R5cGVzW2ldIDoKKwkgICAgICAgIlVua25vd24gICAgICAgICAgIik7CisJcHJpbnRrKCIgICAgICAgICAgICAgICAgIEFOU0kgU0NTSSByZXZpc2lvbjogJTAyeCIsCisJICAgICAgIGlucV9yZXN1bHRbMl0gJiAweDA3KTsKKwlpZiAoKGlucV9yZXN1bHRbMl0gJiAweDA3KSA9PSAxICYmIChpbnFfcmVzdWx0WzNdICYgMHgwZikgPT0gMSkKKwkJcHJpbnRrKCIgQ0NTXG4iKTsKKwllbHNlCisJCXByaW50aygiXG4iKTsKK30KKworLyoqCisgKiBzY3NpX2FsbG9jX3NkZXYgLSBhbGxvY2F0ZSBhbmQgc2V0dXAgYSBzY3NpX0RldmljZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIEFsbG9jYXRlLCBpbml0aWFsaXplIGZvciBpbywgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gYSBzY3NpX0RldmljZS4KKyAqICAgICBTdG9yZXMgdGhlIEBzaG9zdCwgQGNoYW5uZWwsIEBpZCwgYW5kIEBsdW4gaW4gdGhlIHNjc2lfRGV2aWNlLCBhbmQKKyAqICAgICBhZGRzIHNjc2lfRGV2aWNlIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0LgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgICBzY3NpX0RldmljZSBwb2ludGVyLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgKiovCitzdGF0aWMgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2FsbG9jX3NkZXYoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgbHVuLCB2b2lkICpob3N0ZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJaW50IGRpc3BsYXlfZmFpbHVyZV9tc2cgPSAxLCByZXQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisKKwlzZGV2ID0ga21hbGxvYyhzaXplb2YoKnNkZXYpICsgc2hvc3QtPnRyYW5zcG9ydHQtPmRldmljZV9zaXplLAorCQkgICAgICAgR0ZQX0FUT01JQyk7CisJaWYgKCFzZGV2KQorCQlnb3RvIG91dDsKKworCW1lbXNldChzZGV2LCAwLCBzaXplb2YoKnNkZXYpKTsKKwlzZGV2LT52ZW5kb3IgPSBzY3NpX251bGxfZGV2aWNlX3N0cnM7CisJc2Rldi0+bW9kZWwgPSBzY3NpX251bGxfZGV2aWNlX3N0cnM7CisJc2Rldi0+cmV2ID0gc2NzaV9udWxsX2RldmljZV9zdHJzOworCXNkZXYtPmhvc3QgPSBzaG9zdDsKKwlzZGV2LT5pZCA9IHN0YXJnZXQtPmlkOworCXNkZXYtPmx1biA9IGx1bjsKKwlzZGV2LT5jaGFubmVsID0gc3RhcmdldC0+Y2hhbm5lbDsKKwlzZGV2LT5zZGV2X3N0YXRlID0gU0RFVl9DUkVBVEVEOworCUlOSVRfTElTVF9IRUFEKCZzZGV2LT5zaWJsaW5ncyk7CisJSU5JVF9MSVNUX0hFQUQoJnNkZXYtPnNhbWVfdGFyZ2V0X3NpYmxpbmdzKTsKKwlJTklUX0xJU1RfSEVBRCgmc2Rldi0+Y21kX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzZGV2LT5zdGFydmVkX2VudHJ5KTsKKwlzcGluX2xvY2tfaW5pdCgmc2Rldi0+bGlzdF9sb2NrKTsKKworCXNkZXYtPnNkZXZfZ2VuZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJc2Rldi0+c2Rldl90YXJnZXQgPSBzdGFyZ2V0OworCisJLyogdXN1YWxseSBOVUxMIGFuZCBzZXQgYnkgLT5zbGF2ZV9hbGxvYyBpbnN0ZWFkICovCisJc2Rldi0+aG9zdGRhdGEgPSBob3N0ZGF0YTsKKworCS8qIGlmIHRoZSBkZXZpY2UgbmVlZHMgdGhpcyBjaGFuZ2luZywgaXQgbWF5IGRvIHNvIGluIHRoZQorCSAqIHNsYXZlX2NvbmZpZ3VyZSBmdW5jdGlvbiAqLworCXNkZXYtPm1heF9kZXZpY2VfYmxvY2tlZCA9IFNDU0lfREVGQVVMVF9ERVZJQ0VfQkxPQ0tFRDsKKworCS8qCisJICogU29tZSBsb3cgbGV2ZWwgZHJpdmVyIGNvdWxkIHVzZSBkZXZpY2UtPnR5cGUKKwkgKi8KKwlzZGV2LT50eXBlID0gLTE7CisKKwkvKgorCSAqIEFzc3VtZSB0aGF0IHRoZSBkZXZpY2Ugd2lsbCBoYXZlIGhhbmRzaGFraW5nIHByb2JsZW1zLAorCSAqIGFuZCB0aGVuIGZpeCB0aGlzIGZpZWxkIGxhdGVyIGlmIGl0IHR1cm5zIG91dCBpdAorCSAqIGRvZXNuJ3QKKwkgKi8KKwlzZGV2LT5ib3JrZW4gPSAxOworCisJc3Bpbl9sb2NrX2luaXQoJnNkZXYtPnNkZXZfbG9jayk7CisJc2Rldi0+cmVxdWVzdF9xdWV1ZSA9IHNjc2lfYWxsb2NfcXVldWUoc2Rldik7CisJaWYgKCFzZGV2LT5yZXF1ZXN0X3F1ZXVlKSB7CisJCS8qIHJlbGVhc2UgZm4gaXMgc2V0IHVwIGluIHNjc2lfc3lzZnNfZGV2aWNlX2luaXRpYWxpc2UsIHNvCisJCSAqIGhhdmUgdG8gZnJlZSBhbmQgcHV0IG1hbnVhbGx5IGhlcmUgKi8KKwkJcHV0X2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJc2Rldi0+cmVxdWVzdF9xdWV1ZS0+cXVldWVkYXRhID0gc2RldjsKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCAwLCBzZGV2LT5ob3N0LT5jbWRfcGVyX2x1bik7CisKKwlzY3NpX3N5c2ZzX2RldmljZV9pbml0aWFsaXplKHNkZXYpOworCisJaWYgKHNob3N0LT5ob3N0dC0+c2xhdmVfYWxsb2MpIHsKKwkJcmV0ID0gc2hvc3QtPmhvc3R0LT5zbGF2ZV9hbGxvYyhzZGV2KTsKKwkJaWYgKHJldCkgeworCQkJLyoKKwkJCSAqIGlmIExMREQgcmVwb3J0cyBzbGF2ZSBub3QgcHJlc2VudCwgZG9uJ3QgY2x1dHRlcgorCQkJICogY29uc29sZSB3aXRoIGFsbG9jIGZhaWx1cmUgbWVzc2FnZXMKKworCisJCQkgKi8KKwkJCWlmIChyZXQgPT0gLUVOWElPKQorCQkJCWRpc3BsYXlfZmFpbHVyZV9tc2cgPSAwOworCQkJZ290byBvdXRfZGV2aWNlX2Rlc3Ryb3k7CisJCX0KKwl9CisKKwlyZXR1cm4gc2RldjsKKworb3V0X2RldmljZV9kZXN0cm95OgorCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXNjc2lfZnJlZV9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKKwlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CitvdXQ6CisJaWYgKGRpc3BsYXlfZmFpbHVyZV9tc2cpCisJCXByaW50ayhBTExPQ19GQUlMVVJFX01TRywgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2NzaV90YXJnZXRfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRldi0+cGFyZW50OworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRvX3Njc2lfdGFyZ2V0KGRldik7CisJa2ZyZWUoc3RhcmdldCk7CisJcHV0X2RldmljZShwYXJlbnQpOworfQorCitpbnQgc2NzaV9pc190YXJnZXRfZGV2aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5yZWxlYXNlID09IHNjc2lfdGFyZ2V0X2Rldl9yZWxlYXNlOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2lzX3RhcmdldF9kZXZpY2UpOworCitzdGF0aWMgc3RydWN0IHNjc2lfdGFyZ2V0ICpfX3Njc2lfZmluZF90YXJnZXQoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgICBpbnQgY2hhbm5lbCwgdWludCBpZCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsICpmb3VuZF9zdGFyZ2V0ID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChwYXJlbnQpOworCS8qCisJICogU2VhcmNoIGZvciBhbiBleGlzdGluZyB0YXJnZXQgZm9yIHRoaXMgc2Rldi4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YXJnZXQsICZzaG9zdC0+X190YXJnZXRzLCBzaWJsaW5ncykgeworCQlpZiAoc3RhcmdldC0+aWQgPT0gaWQgJiYKKwkJICAgIHN0YXJnZXQtPmNoYW5uZWwgPT0gY2hhbm5lbCkgeworCQkJZm91bmRfc3RhcmdldCA9IHN0YXJnZXQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZm91bmRfc3RhcmdldCkKKwkJZ2V0X2RldmljZSgmZm91bmRfc3RhcmdldC0+ZGV2KTsKKworCXJldHVybiBmb3VuZF9zdGFyZ2V0OworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfdGFyZ2V0ICpzY3NpX2FsbG9jX3RhcmdldChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCSAgICAgaW50IGNoYW5uZWwsIHVpbnQgaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QocGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29uc3QgaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IHNjc2lfdGFyZ2V0KQorCQkrIHNob3N0LT50cmFuc3BvcnR0LT50YXJnZXRfc2l6ZTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCXN0cnVjdCBzY3NpX3RhcmdldCAqZm91bmRfdGFyZ2V0OworCisJaWYgKCFzdGFyZ2V0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChzdGFyZ2V0LCAwLCBzaXplKTsKKwlkZXYgPSAmc3RhcmdldC0+ZGV2OworCWRldmljZV9pbml0aWFsaXplKGRldik7CisJc3RhcmdldC0+cmVhcF9yZWYgPSAxOworCWRldi0+cGFyZW50ID0gZ2V0X2RldmljZShwYXJlbnQpOworCWRldi0+cmVsZWFzZSA9IHNjc2lfdGFyZ2V0X2Rldl9yZWxlYXNlOworCXNwcmludGYoZGV2LT5idXNfaWQsICJ0YXJnZXQlZDolZDolZCIsCisJCXNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBpZCk7CisJc3RhcmdldC0+aWQgPSBpZDsKKwlzdGFyZ2V0LT5jaGFubmVsID0gY2hhbm5lbDsKKwlJTklUX0xJU1RfSEVBRCgmc3RhcmdldC0+c2libGluZ3MpOworCUlOSVRfTElTVF9IRUFEKCZzdGFyZ2V0LT5kZXZpY2VzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlmb3VuZF90YXJnZXQgPSBfX3Njc2lfZmluZF90YXJnZXQocGFyZW50LCBjaGFubmVsLCBpZCk7CisJaWYgKGZvdW5kX3RhcmdldCkKKwkJZ290byBmb3VuZDsKKworCWxpc3RfYWRkX3RhaWwoJnN0YXJnZXQtPnNpYmxpbmdzLCAmc2hvc3QtPl9fdGFyZ2V0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJLyogYWxsb2NhdGUgYW5kIGFkZCAqLworCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJZGV2aWNlX2FkZCgmc3RhcmdldC0+ZGV2KTsKKwl0cmFuc3BvcnRfYWRkX2RldmljZSgmc3RhcmdldC0+ZGV2KTsKKwlyZXR1cm4gc3RhcmdldDsKKworIGZvdW5kOgorCWZvdW5kX3RhcmdldC0+cmVhcF9yZWYrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlwdXRfZGV2aWNlKHBhcmVudCk7CisJa2ZyZWUoc3RhcmdldCk7CisJcmV0dXJuIGZvdW5kX3RhcmdldDsKK30KKworLyoqCisgKiBzY3NpX3RhcmdldF9yZWFwIC0gY2hlY2sgdG8gc2VlIGlmIHRhcmdldCBpcyBpbiB1c2UgYW5kIGRlc3Ryb3kgaWYgbm90CisgKgorICogQHN0YXJnZXQ6IHRhcmdldCB0byBiZSBjaGVja2VkCisgKgorICogVGhpcyBpcyB1c2VkIGFmdGVyIHJlbW92aW5nIGEgTFVOIG9yIGRvaW5nIGEgbGFzdCBwdXQgb2YgdGhlIHRhcmdldAorICogaXQgY2hlY2tzIGF0b21pY2FsbHkgdGhhdCBub3RoaW5nIGlzIHVzaW5nIHRoZSB0YXJnZXQgYW5kIHJlbW92ZXMKKyAqIGl0IGlmIHNvLgorICovCit2b2lkIHNjc2lfdGFyZ2V0X3JlYXAoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKC0tc3RhcmdldC0+cmVhcF9yZWYgPT0gMCAmJiBsaXN0X2VtcHR5KCZzdGFyZ2V0LT5kZXZpY2VzKSkgeworCQlsaXN0X2RlbF9pbml0KCZzdGFyZ2V0LT5zaWJsaW5ncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlkZXZpY2VfZGVsKCZzdGFyZ2V0LT5kZXYpOworCQl0cmFuc3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJCXB1dF9kZXZpY2UoJnN0YXJnZXQtPmRldik7CisJCXJldHVybjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogc2NzaV9wcm9iZV9sdW4gLSBwcm9iZSBhIHNpbmdsZSBMVU4gdXNpbmcgYSBTQ1NJIElOUVVJUlkKKyAqIEBzcmVxOgl1c2VkIHRvIHNlbmQgdGhlIElOUVVJUlkKKyAqIEBpbnFfcmVzdWx0OglhcmVhIHRvIHN0b3JlIHRoZSBJTlFVSVJZIHJlc3VsdAorICogQGJmbGFnczoJc3RvcmUgYW55IGJmbGFncyBmb3VuZCBoZXJlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgUHJvYmUgdGhlIGx1biBhc3NvY2lhdGVkIHdpdGggQHNyZXEgdXNpbmcgYSBzdGFuZGFyZCBTQ1NJIElOUVVJUlk7CisgKgorICogICAgIElmIHRoZSBJTlFVSVJZIGlzIHN1Y2Nlc3NmdWwsIHNyZXEtPnNyX3Jlc3VsdCBpcyB6ZXJvIGFuZDogdGhlCisgKiAgICAgSU5RVUlSWSBkYXRhIGlzIGluIEBpbnFfcmVzdWx0OyB0aGUgc2NzaV9sZXZlbCBhbmQgSU5RVUlSWSBsZW5ndGgKKyAqICAgICBhcmUgY29waWVkIHRvIHRoZSBTY3NpX0RldmljZSBhdCBAc3JlcS0+c3JfZGV2aWNlIChzZGV2KTsKKyAqICAgICBhbnkgZmxhZ3MgdmFsdWUgaXMgc3RvcmVkIGluICpAYmZsYWdzLgorICoqLworc3RhdGljIHZvaWQgc2NzaV9wcm9iZV9sdW4oc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgY2hhciAqaW5xX3Jlc3VsdCwKKwkJCSAgIGludCAqYmZsYWdzKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsJLyogYSBiaXQgdWdseSAqLworCXVuc2lnbmVkIGNoYXIgc2NzaV9jbWRbTUFYX0NPTU1BTkRfU0laRV07CisJaW50IGZpcnN0X2lucXVpcnlfbGVuLCB0cnlfaW5xdWlyeV9sZW4sIG5leHRfaW5xdWlyeV9sZW47CisJaW50IHJlc3BvbnNlX2xlbiA9IDA7CisJaW50IHBhc3MsIGNvdW50OworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCSpiZmxhZ3MgPSAwOworCisJLyogUGVyZm9ybSB1cCB0byAzIHBhc3Nlcy4gIFRoZSBmaXJzdCBwYXNzIHVzZXMgYSBjb25zZXJ2YXRpdmUKKwkgKiB0cmFuc2ZlciBsZW5ndGggb2YgMzYgdW5sZXNzIHNkZXYtPmlucXVpcnlfbGVuIHNwZWNpZmllcyBhCisJICogZGlmZmVyZW50IHZhbHVlLiAqLworCWZpcnN0X2lucXVpcnlfbGVuID0gc2Rldi0+aW5xdWlyeV9sZW4gPyBzZGV2LT5pbnF1aXJ5X2xlbiA6IDM2OworCXRyeV9pbnF1aXJ5X2xlbiA9IGZpcnN0X2lucXVpcnlfbGVuOworCXBhc3MgPSAxOworCisgbmV4dF9wYXNzOgorCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayhLRVJOX0lORk8gInNjc2kgc2NhbjogSU5RVUlSWSBwYXNzICVkICIKKwkJCSJ0byBob3N0ICVkIGNoYW5uZWwgJWQgaWQgJWQgbHVuICVkLCBsZW5ndGggJWRcbiIsCisJCQlwYXNzLCBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLAorCQkJc2Rldi0+aWQsIHNkZXYtPmx1biwgdHJ5X2lucXVpcnlfbGVuKSk7CisKKwkvKiBFYWNoIHBhc3MgZ2V0cyB1cCB0byB0aHJlZSBjaGFuY2VzIHRvIGlnbm9yZSBVbml0IEF0dGVudGlvbiAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7ICsrY291bnQpIHsKKwkJbWVtc2V0KHNjc2lfY21kLCAwLCA2KTsKKwkJc2NzaV9jbWRbMF0gPSBJTlFVSVJZOworCQlzY3NpX2NtZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSB0cnlfaW5xdWlyeV9sZW47CisJCXNyZXEtPnNyX2NtZF9sZW4gPSAwOworCQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCQltZW1zZXQoaW5xX3Jlc3VsdCwgMCwgdHJ5X2lucXVpcnlfbGVuKTsKKwkJc2NzaV93YWl0X3JlcShzcmVxLCAodm9pZCAqKSBzY3NpX2NtZCwgKHZvaWQgKikgaW5xX3Jlc3VsdCwKKwkJCQl0cnlfaW5xdWlyeV9sZW4sCisJCQkJSFovMiArIEhaKnNjc2lfaW5xX3RpbWVvdXQsIDMpOworCisJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayhLRVJOX0lORk8gInNjc2kgc2NhbjogSU5RVUlSWSAlcyAiCisJCQkJIndpdGggY29kZSAweCV4XG4iLAorCQkJCXNyZXEtPnNyX3Jlc3VsdCA/ICJmYWlsZWQiIDogInN1Y2Nlc3NmdWwiLAorCQkJCXNyZXEtPnNyX3Jlc3VsdCkpOworCisJCWlmIChzcmVxLT5zcl9yZXN1bHQpIHsKKwkJCS8qCisJCQkgKiBub3QtcmVhZHkgdG8gcmVhZHkgdHJhbnNpdGlvbiBbYXNjL2FzY3E9MHgyOC8weDBdCisJCQkgKiBvciBwb3dlci1vbiwgcmVzZXQgW2FzYy9hc2NxPTB4MjkvMHgwXSwgY29udGludWUuCisJCQkgKiBJTlFVSVJZIHNob3VsZCBub3QgeWllbGQgVU5JVF9BVFRFTlRJT04KKwkJCSAqIGJ1dCBtYW55IGJ1Z2d5IGRldmljZXMgZG8gc28gYW55d2F5LiAKKwkJCSAqLworCQkJaWYgKChkcml2ZXJfYnl0ZShzcmVxLT5zcl9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSAmJgorCQkJICAgIHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2Uoc3JlcSwgJnNzaGRyKSkgeworCQkJCWlmICgoc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKSAmJgorCQkJCSAgICAoKHNzaGRyLmFzYyA9PSAweDI4KSB8fAorCQkJCSAgICAgKHNzaGRyLmFzYyA9PSAweDI5KSkgJiYKKwkJCQkgICAgKHNzaGRyLmFzY3EgPT0gMCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWlmIChzcmVxLT5zcl9yZXN1bHQgPT0gMCkgeworCQlyZXNwb25zZV9sZW4gPSAodW5zaWduZWQgY2hhcikgaW5xX3Jlc3VsdFs0XSArIDU7CisJCWlmIChyZXNwb25zZV9sZW4gPiAyNTUpCisJCQlyZXNwb25zZV9sZW4gPSBmaXJzdF9pbnF1aXJ5X2xlbjsJLyogc2FuaXR5ICovCisKKwkJLyoKKwkJICogR2V0IGFueSBmbGFncyBmb3IgdGhpcyBkZXZpY2UuCisJCSAqCisJCSAqIFhYWCBhZGQgYSBiZmxhZ3MgdG8gU2NzaV9EZXZpY2UsIGFuZCByZXBsYWNlIHRoZQorCQkgKiBjb3JyZXNwb25kaW5nIGJpdCBmaWVsZHMgaW4gU2NzaV9EZXZpY2UsIHNvIGJmbGFncworCQkgKiBuZWVkIG5vdCBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQuCisJCSAqLworCQkqYmZsYWdzID0gc2NzaV9nZXRfZGV2aWNlX2ZsYWdzKHNkZXYsICZpbnFfcmVzdWx0WzhdLAorCQkJCSZpbnFfcmVzdWx0WzE2XSk7CisKKwkJLyogV2hlbiB0aGUgZmlyc3QgcGFzcyBzdWNjZWVkcyB3ZSBnYWluIGluZm9ybWF0aW9uIGFib3V0CisJCSAqIHdoYXQgbGFyZ2VyIHRyYW5zZmVyIGxlbmd0aHMgbWlnaHQgd29yay4gKi8KKwkJaWYgKHBhc3MgPT0gMSkgeworCQkJaWYgKEJMSVNUX0lOUVVJUllfMzYgJiAqYmZsYWdzKQorCQkJCW5leHRfaW5xdWlyeV9sZW4gPSAzNjsKKwkJCWVsc2UgaWYgKEJMSVNUX0lOUVVJUllfNTggJiAqYmZsYWdzKQorCQkJCW5leHRfaW5xdWlyeV9sZW4gPSA1ODsKKwkJCWVsc2UgaWYgKHNkZXYtPmlucXVpcnlfbGVuKQorCQkJCW5leHRfaW5xdWlyeV9sZW4gPSBzZGV2LT5pbnF1aXJ5X2xlbjsKKwkJCWVsc2UKKwkJCQluZXh0X2lucXVpcnlfbGVuID0gcmVzcG9uc2VfbGVuOworCisJCQkvKiBJZiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIHBlcmZvcm0gdGhlIHNlY29uZCBwYXNzICovCisJCQlpZiAobmV4dF9pbnF1aXJ5X2xlbiA+IHRyeV9pbnF1aXJ5X2xlbikgeworCQkJCXRyeV9pbnF1aXJ5X2xlbiA9IG5leHRfaW5xdWlyeV9sZW47CisJCQkJcGFzcyA9IDI7CisJCQkJZ290byBuZXh0X3Bhc3M7CisJCQl9CisJCX0KKworCX0gZWxzZSBpZiAocGFzcyA9PSAyKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2kgc2NhbjogJWQgYnl0ZSBpbnF1aXJ5IGZhaWxlZC4gICIKKwkJCQkiQ29uc2lkZXIgQkxJU1RfSU5RVUlSWV8zNiBmb3IgdGhpcyBkZXZpY2VcbiIsCisJCQkJdHJ5X2lucXVpcnlfbGVuKTsKKworCQkvKiBJZiB0aGlzIHBhc3MgZmFpbGVkLCB0aGUgdGhpcmQgcGFzcyBnb2VzIGJhY2sgYW5kIHRyYW5zZmVycworCQkgKiB0aGUgc2FtZSBhbW91bnQgYXMgd2Ugc3VjY2Vzc2Z1bGx5IGdvdCBpbiB0aGUgZmlyc3QgcGFzcy4gKi8KKwkJdHJ5X2lucXVpcnlfbGVuID0gZmlyc3RfaW5xdWlyeV9sZW47CisJCXBhc3MgPSAzOworCQlnb3RvIG5leHRfcGFzczsKKwl9CisKKwkvKiBJZiB0aGUgbGFzdCB0cmFuc2ZlciBhdHRlbXB0IGdvdCBhbiBlcnJvciwgYXNzdW1lIHRoZQorCSAqIHBlcmlwaGVyYWwgZG9lc24ndCBleGlzdCBvciBpcyBkZWFkLiAqLworCWlmIChzcmVxLT5zcl9yZXN1bHQpCisJCXJldHVybjsKKworCS8qIERvbid0IHJlcG9ydCBhbnkgbW9yZSBkYXRhIHRoYW4gdGhlIGRldmljZSBzYXlzIGlzIHZhbGlkICovCisJc2Rldi0+aW5xdWlyeV9sZW4gPSBtaW4odHJ5X2lucXVpcnlfbGVuLCByZXNwb25zZV9sZW4pOworCisJLyoKKwkgKiBYWFggQWJvcnQgaWYgdGhlIHJlc3BvbnNlIGxlbmd0aCBpcyBsZXNzIHRoYW4gMzY/IElmIGxlc3MgdGhhbgorCSAqIDMyLCB0aGUgbG9va3VwIG9mIHRoZSBkZXZpY2UgZmxhZ3MgKGFib3ZlKSBjb3VsZCBiZSBpbnZhbGlkLAorCSAqIGFuZCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB0YWtlIGFuIGluY29ycmVjdCBhY3Rpb24gLSB3ZSBkbworCSAqIG5vdCB3YW50IHRvIGhhbmcgYmVjYXVzZSBvZiBhIHNob3J0IElOUVVJUlkuIE9uIHRoZSBmbGlwIHNpZGUsCisJICogaWYgdGhlIGRldmljZSBpcyBzcHVuIGRvd24gb3IgYmVjb21pbmcgcmVhZHkgKGFuZCBzbyBpdCBnaXZlcyBhCisJICogc2hvcnQgSU5RVUlSWSksIGFuIGFib3J0IGhlcmUgcHJldmVudHMgYW55IGZ1cnRoZXIgdXNlIG9mIHRoZQorCSAqIGRldmljZSwgaW5jbHVkaW5nIHNwaW4gdXAuCisJICoKKwkgKiBSZWxhdGVkIHRvIHRoZSBhYm92ZSBpc3N1ZToKKwkgKgorCSAqIFhYWCBEZXZpY2VzIChkaXNrIG9yIGFsbD8pIHNob3VsZCBiZSBzZW50IGEgVEVTVCBVTklUIFJFQURZLAorCSAqIGFuZCBpZiBub3QgcmVhZHksIHNlbnQgYSBTVEFSVF9TVE9QIHRvIHN0YXJ0IChtYXliZSBzcGluIHVwKSBhbmQKKwkgKiB0aGVuIHNlbmQgdGhlIElOUVVJUlkgYWdhaW4sIHNpbmNlIHRoZSBJTlFVSVJZIGNhbiBjaGFuZ2UgYWZ0ZXIKKwkgKiBhIGRldmljZSBpcyBpbml0aWFsaXplZC4KKwkgKgorCSAqIElkZWFsbHksIHN0YXJ0IGEgZGV2aWNlIGlmIGV4cGxpY2l0bHkgYXNrZWQgdG8gZG8gc28uICBUaGlzCisJICogYXNzdW1lcyB0aGF0IGEgZGV2aWNlIGlzIHNwdW4gdXAgb24gcG93ZXIgb24sIHNwdW4gZG93biBvbgorCSAqIHJlcXVlc3QsIGFuZCB0aGVuIHNwdW4gdXAgb24gcmVxdWVzdC4KKwkgKi8KKworCS8qCisJICogVGhlIHNjYW5uaW5nIGNvZGUgbmVlZHMgdG8ga25vdyB0aGUgc2NzaV9sZXZlbCwgZXZlbiBpZiBubworCSAqIGRldmljZSBpcyBhdHRhY2hlZCBhdCBMVU4gMCAoU0NTSV9TQ0FOX1RBUkdFVF9QUkVTRU5UKSBzbworCSAqIG5vbi16ZXJvIExVTnMgY2FuIGJlIHNjYW5uZWQuCisJICovCisJc2Rldi0+c2NzaV9sZXZlbCA9IGlucV9yZXN1bHRbMl0gJiAweDA3OworCWlmIChzZGV2LT5zY3NpX2xldmVsID49IDIgfHwKKwkgICAgKHNkZXYtPnNjc2lfbGV2ZWwgPT0gMSAmJiAoaW5xX3Jlc3VsdFszXSAmIDB4MGYpID09IDEpKQorCQlzZGV2LT5zY3NpX2xldmVsKys7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogc2NzaV9hZGRfbHVuIC0gYWxsb2NhdGUgYW5kIGZ1bGx5IGluaXRpYWx6ZSBhIFNjc2lfRGV2aWNlCisgKiBAc2RldnNjYW46CWhvbGRzIGluZm9ybWF0aW9uIHRvIGJlIHN0b3JlZCBpbiB0aGUgbmV3IFNjc2lfRGV2aWNlCisgKiBAc2Rldm5ldzoJc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBTY3NpX0RldmljZQorICogQGlucV9yZXN1bHQ6CWhvbGRzIHRoZSByZXN1bHQgb2YgYSBwcmV2aW91cyBJTlFVSVJZIHRvIHRoZSBMVU4KKyAqIEBiZmxhZ3M6CWJsYWNrL3doaXRlIGxpc3QgZmxhZworICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgU2NzaV9EZXZpY2UgbWF0Y2hpbmcgc2RldnNjYW4uIE9wdGlvbmFsbHkKKyAqICAgICBzZXQgZmllbGRzIGJhc2VkIG9uIHZhbHVlcyBpbiAqQGJmbGFncy4gSWYgQHNkZXZuZXcgaXMgbm90CisgKiAgICAgTlVMTCwgc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyBTY3NpX0RldmljZSBpbiAqQHNkZXZuZXcgKG5lZWRlZAorICogICAgIHdoZW4gc2Nhbm5pbmcgYSBwYXJ0aWN1bGFyIExVTikuCisgKgorICogUmV0dXJuOgorICogICAgIFNDU0lfU0NBTl9OT19SRVNQT05TRTogY291bGQgbm90IGFsbG9jYXRlIG9yIHNldHVwIGEgU2NzaV9EZXZpY2UKKyAqICAgICBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQ6IGEgbmV3IFNjc2lfRGV2aWNlIHdhcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkCisgKiovCitzdGF0aWMgaW50IHNjc2lfYWRkX2x1bihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGNoYXIgKmlucV9yZXN1bHQsIGludCAqYmZsYWdzKQoreworCS8qCisJICogWFhYIGRvIG5vdCBzYXZlIHRoZSBpbnF1aXJ5LCBzaW5jZSBpdCBjYW4gY2hhbmdlIHVuZGVybmVhdGggdXMsCisJICogc2F2ZSBqdXN0IHZlbmRvci9tb2RlbC9yZXYuCisJICoKKwkgKiBSYXRoZXIgdGhhbiBzYXZlIGl0IGFuZCBoYXZlIGFuIGlvY3RsIHRoYXQgcmV0cmlldmVzIHRoZSBzYXZlZAorCSAqIHZhbHVlLCBoYXZlIGFuIGlvY3RsIHRoYXQgZXhlY3V0ZXMgdGhlIHNhbWUgSU5RVUlSWSBjb2RlIHVzZWQKKwkgKiBpbiBzY3NpX3Byb2JlX2x1biwgbGV0IHVzZXIgbGV2ZWwgcHJvZ3JhbXMgZG9pbmcgSU5RVUlSWQorCSAqIHNjYW5uaW5nIHJ1biBhdCB0aGVpciBvd24gcmlzaywgb3Igc3VwcGx5IGEgdXNlciBsZXZlbCBwcm9ncmFtCisJICogdGhhdCBjYW4gY29ycmVjdGx5IHNjYW4uCisJICovCisJc2Rldi0+aW5xdWlyeSA9IGttYWxsb2Moc2Rldi0+aW5xdWlyeV9sZW4sIEdGUF9BVE9NSUMpOworCWlmIChzZGV2LT5pbnF1aXJ5ID09IE5VTEwpIHsKKwkJcmV0dXJuIFNDU0lfU0NBTl9OT19SRVNQT05TRTsKKwl9CisKKwltZW1jcHkoc2Rldi0+aW5xdWlyeSwgaW5xX3Jlc3VsdCwgc2Rldi0+aW5xdWlyeV9sZW4pOworCXNkZXYtPnZlbmRvciA9IChjaGFyICopIChzZGV2LT5pbnF1aXJ5ICsgOCk7CisJc2Rldi0+bW9kZWwgPSAoY2hhciAqKSAoc2Rldi0+aW5xdWlyeSArIDE2KTsKKwlzZGV2LT5yZXYgPSAoY2hhciAqKSAoc2Rldi0+aW5xdWlyeSArIDMyKTsKKworCWlmICgqYmZsYWdzICYgQkxJU1RfSVNST00pIHsKKwkJLyoKKwkJICogSXQgd291bGQgYmUgYmV0dGVyIHRvIG1vZGlmeSBzZGV2LT50eXBlLCBhbmQgc2V0CisJCSAqIHNkZXYtPnJlbW92YWJsZSwgYnV0IHRoZW4gdGhlIHByaW50X2lucXVpcnkoKSBvdXRwdXQKKwkJICogd291bGQgbm90IHNob3cgVFlQRV9ST007IGlmIHByaW50X2lucXVpcnkoKSBpcyByZW1vdmVkCisJCSAqIHRoZSBpc3N1ZSBnb2VzIGF3YXkuCisJCSAqLworCQlpbnFfcmVzdWx0WzBdID0gVFlQRV9ST007CisJCWlucV9yZXN1bHRbMV0gfD0gMHg4MDsJLyogcmVtb3ZhYmxlICovCisJfSBlbHNlIGlmICgqYmZsYWdzICYgQkxJU1RfTk9fVUxEX0FUVEFDSCkKKwkJc2Rldi0+bm9fdWxkX2F0dGFjaCA9IDE7CisKKwlzd2l0Y2ggKHNkZXYtPnR5cGUgPSAoaW5xX3Jlc3VsdFswXSAmIDB4MWYpKSB7CisJY2FzZSBUWVBFX1RBUEU6CisJY2FzZSBUWVBFX0RJU0s6CisJY2FzZSBUWVBFX1BSSU5URVI6CisJY2FzZSBUWVBFX01PRDoKKwljYXNlIFRZUEVfUFJPQ0VTU09SOgorCWNhc2UgVFlQRV9TQ0FOTkVSOgorCWNhc2UgVFlQRV9NRURJVU1fQ0hBTkdFUjoKKwljYXNlIFRZUEVfRU5DTE9TVVJFOgorCWNhc2UgVFlQRV9DT01NOgorCQlzZGV2LT53cml0ZWFibGUgPSAxOworCQlicmVhazsKKwljYXNlIFRZUEVfV09STToKKwljYXNlIFRZUEVfUk9NOgorCQlzZGV2LT53cml0ZWFibGUgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJzY3NpOiB1bmtub3duIGRldmljZSB0eXBlICVkXG4iLCBzZGV2LT50eXBlKTsKKwl9CisKKwlwcmludF9pbnF1aXJ5KGlucV9yZXN1bHQpOworCisJLyoKKwkgKiBGb3IgYSBwZXJpcGhlcmFsIHF1YWxpZmllciAoUFEpIHZhbHVlIG9mIDEgKDAwMWIpLCB0aGUgU0NTSQorCSAqIHNwZWMgc2F5czogVGhlIGRldmljZSBzZXJ2ZXIgaXMgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZQorCSAqIHNwZWNpZmllZCBwZXJpcGhlcmFsIGRldmljZSB0eXBlIG9uIHRoaXMgbG9naWNhbCB1bml0LiBIb3dldmVyLAorCSAqIHRoZSBwaHlzaWNhbCBkZXZpY2UgaXMgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhpcyBsb2dpY2FsCisJICogdW5pdC4KKwkgKgorCSAqIFRoZSBhYm92ZSBpcyB2YWd1ZSwgYXMgaXQgaW1wbGllcyB0aGF0IHdlIGNvdWxkIHRyZWF0IDAwMSBhbmQKKwkgKiAwMTEgdGhlIHNhbWUuIFN0YXkgY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIGNvZGUsIGFuZCBjcmVhdGUgYQorCSAqIFNjc2lfRGV2aWNlIGZvciBhIFBRIG9mIDEKKwkgKgorCSAqIERvbid0IHNldCB0aGUgZGV2aWNlIG9mZmxpbmUgaGVyZTsgcmF0aGVyIGxldCB0aGUgdXBwZXIKKwkgKiBsZXZlbCBkcml2ZXJzIGV2YWwgdGhlIFBRIHRvIGRlY2lkZSB3aGV0aGVyIHRoZXkgc2hvdWxkCisJICogYXR0YWNoLiBTbyByZW1vdmUgKChpbnFfcmVzdWx0WzBdID4+IDUpICYgNykgPT0gMSBjaGVjay4KKwkgKi8gCisKKwlzZGV2LT5pbnFfcGVyaXBoX3F1YWwgPSAoaW5xX3Jlc3VsdFswXSA+PiA1KSAmIDc7CisJc2Rldi0+cmVtb3ZhYmxlID0gKDB4ODAgJiBpbnFfcmVzdWx0WzFdKSA+PiA3OworCXNkZXYtPmxvY2thYmxlID0gc2Rldi0+cmVtb3ZhYmxlOworCXNkZXYtPnNvZnRfcmVzZXQgPSAoaW5xX3Jlc3VsdFs3XSAmIDEpICYmICgoaW5xX3Jlc3VsdFszXSAmIDcpID09IDIpOworCisJaWYgKHNkZXYtPnNjc2lfbGV2ZWwgPj0gU0NTSV8zIHx8IChzZGV2LT5pbnF1aXJ5X2xlbiA+IDU2ICYmCisJCWlucV9yZXN1bHRbNTZdICYgMHgwNCkpCisJCXNkZXYtPnBwciA9IDE7CisJaWYgKGlucV9yZXN1bHRbN10gJiAweDYwKQorCQlzZGV2LT53ZHRyID0gMTsKKwlpZiAoaW5xX3Jlc3VsdFs3XSAmIDB4MTApCisJCXNkZXYtPnNkdHIgPSAxOworCisJc3ByaW50ZihzZGV2LT5kZXZmc19uYW1lLCAic2NzaS9ob3N0JWQvYnVzJWQvdGFyZ2V0JWQvbHVuJWQiLAorCQkJCXNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsCisJCQkJc2Rldi0+aWQsIHNkZXYtPmx1bik7CisKKwkvKgorCSAqIEVuZCBkcml2ZXJmcy9kZXZmcyBjb2RlLgorCSAqLworCisJaWYgKChzZGV2LT5zY3NpX2xldmVsID49IFNDU0lfMikgJiYgKGlucV9yZXN1bHRbN10gJiAyKSAmJgorCSAgICAhKCpiZmxhZ3MgJiBCTElTVF9OT1RRKSkKKwkJc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCA9IDE7CisJLyoKKwkgKiBTb21lIGRldmljZXMgKFRleGVsIENEIFJPTSBkcml2ZXMpIGhhdmUgaGFuZHNoYWtpbmcgcHJvYmxlbXMKKwkgKiB3aGVuIHVzZWQgd2l0aCB0aGUgU2VhZ2F0ZSBjb250cm9sbGVycy4gYm9ya2VuIGlzIGluaXRpYWxpemVkCisJICogdG8gMSwgYW5kIHRoZW4gc2V0IGl0IHRvIDAgaGVyZS4KKwkgKi8KKwlpZiAoKCpiZmxhZ3MgJiBCTElTVF9CT1JLRU4pID09IDApCisJCXNkZXYtPmJvcmtlbiA9IDA7CisKKwkvKgorCSAqIEFwcGFyZW50bHkgc29tZSByZWFsbHkgYnJva2VuIGRldmljZXMgKGNvbnRyYXJ5IHRvIHRoZSBTQ1NJCisJICogc3RhbmRhcmRzKSBuZWVkIHRvIGJlIHNlbGVjdGVkIHdpdGhvdXQgYXNzZXJ0aW5nIEFUTgorCSAqLworCWlmICgqYmZsYWdzICYgQkxJU1RfU0VMRUNUX05PX0FUTikKKwkJc2Rldi0+c2VsZWN0X25vX2F0biA9IDE7CisKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyBtYXkgbm90IHdhbnQgdG8gaGF2ZSBhIHN0YXJ0IGNvbW1hbmQgYXV0b21hdGljYWxseQorCSAqIGlzc3VlZCB3aGVuIGEgZGV2aWNlIGlzIGFkZGVkLgorCSAqLworCWlmICgqYmZsYWdzICYgQkxJU1RfTk9TVEFSVE9OQUREKQorCQlzZGV2LT5ub19zdGFydF9vbl9hZGQgPSAxOworCisJaWYgKCpiZmxhZ3MgJiBCTElTVF9TSU5HTEVMVU4pCisJCXNkZXYtPnNpbmdsZV9sdW4gPSAxOworCisKKwlzZGV2LT51c2VfMTBfZm9yX3J3ID0gMTsKKworCWlmICgqYmZsYWdzICYgQkxJU1RfTVNfU0tJUF9QQUdFXzA4KQorCQlzZGV2LT5za2lwX21zX3BhZ2VfOCA9IDE7CisKKwlpZiAoKmJmbGFncyAmIEJMSVNUX01TX1NLSVBfUEFHRV8zRikKKwkJc2Rldi0+c2tpcF9tc19wYWdlXzNmID0gMTsKKworCWlmICgqYmZsYWdzICYgQkxJU1RfVVNFXzEwX0JZVEVfTVMpCisJCXNkZXYtPnVzZV8xMF9mb3JfbXMgPSAxOworCisJLyogc2V0IHRoZSBkZXZpY2UgcnVubmluZyBoZXJlIHNvIHRoYXQgc2xhdmUgY29uZmlndXJlCisJICogbWF5IGRvIEkvTyAqLworCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX1JVTk5JTkcpOworCisJaWYgKCpiZmxhZ3MgJiBCTElTVF9NU18xOTJfQllURVNfRk9SXzNGKQorCQlzZGV2LT51c2VfMTkyX2J5dGVzX2Zvcl8zZiA9IDE7CisKKwlpZiAoKmJmbGFncyAmIEJMSVNUX05PVF9MT0NLQUJMRSkKKwkJc2Rldi0+bG9ja2FibGUgPSAwOworCisJaWYgKCpiZmxhZ3MgJiBCTElTVF9SRVRSWV9IV0VSUk9SKQorCQlzZGV2LT5yZXRyeV9od2Vycm9yID0gMTsKKworCXRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisKKwlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2NvbmZpZ3VyZSkKKwkJc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2NvbmZpZ3VyZShzZGV2KTsKKworCS8qCisJICogT2ssIHRoZSBkZXZpY2UgaXMgbm93IGFsbCBzZXQgdXAsIHdlIGNhbgorCSAqIHJlZ2lzdGVyIGl0IGFuZCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwKKwkgKiBhYm91dCBpdC4KKwkgKi8KKwlzY3NpX3N5c2ZzX2FkZF9zZGV2KHNkZXYpOworCisJcmV0dXJuIFNDU0lfU0NBTl9MVU5fUFJFU0VOVDsKK30KKworLyoqCisgKiBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuIC0gcHJvYmUgYSBMVU4sIGlmIGEgTFVOIGlzIGZvdW5kIGFkZCBpdAorICogQHN0YXJnZXQ6CXBvaW50ZXIgdG8gdGFyZ2V0IGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBsdW46CUxVTiBvZiB0YXJnZXQgZGV2aWNlCisgKiBAc2RldnNjYW46CXByb2JlIHRoZSBMVU4gY29ycmVzcG9uZGluZyB0byB0aGlzIFNjc2lfRGV2aWNlCisgKiBAc2Rldm5ldzoJc3RvcmUgdGhlIHZhbHVlIG9mIGFueSBuZXcgU2NzaV9EZXZpY2UgYWxsb2NhdGVkCisgKiBAYmZsYWdzcDoJc3RvcmUgYmZsYWdzIGhlcmUgaWYgbm90IE5VTEwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBDYWxsIHNjc2lfcHJvYmVfbHVuLCBpZiBhIExVTiB3aXRoIGFuIGF0dGFjaGVkIGRldmljZSBpcyBmb3VuZCwKKyAqICAgICBhbGxvY2F0ZSBhbmQgc2V0IGl0IHVwIGJ5IGNhbGxpbmcgc2NzaV9hZGRfbHVuLgorICoKKyAqIFJldHVybjoKKyAqICAgICBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U6IGNvdWxkIG5vdCBhbGxvY2F0ZSBvciBzZXR1cCBhIFNjc2lfRGV2aWNlCisgKiAgICAgU0NTSV9TQ0FOX1RBUkdFVF9QUkVTRU5UOiB0YXJnZXQgcmVzcG9uZGVkLCBidXQgbm8gZGV2aWNlIGlzCisgKiAgICAgICAgIGF0dGFjaGVkIGF0IHRoZSBMVU4KKyAqICAgICBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQ6IGEgbmV3IFNjc2lfRGV2aWNlIHdhcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkCisgKiovCitzdGF0aWMgaW50IHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LAorCQkJCSAgdWludCBsdW4sIGludCAqYmZsYWdzcCwKKwkJCQkgIHN0cnVjdCBzY3NpX2RldmljZSAqKnNkZXZwLCBpbnQgcmVzY2FuLAorCQkJCSAgdm9pZCAqaG9zdGRhdGEpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CisJdW5zaWduZWQgY2hhciAqcmVzdWx0OworCWludCBiZmxhZ3MsIHJlcyA9IFNDU0lfU0NBTl9OT19SRVNQT05TRTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKworCS8qCisJICogVGhlIHJlc2NhbiBmbGFnIGlzIHVzZWQgYXMgYW4gb3B0aW1pemF0aW9uLCB0aGUgZmlyc3Qgc2NhbiBvZiBhCisJICogaG9zdCBhZGFwdGVyIGNhbGxzIGludG8gaGVyZSB3aXRoIHJlc2NhbiA9PSAwLgorCSAqLworCWlmIChyZXNjYW4pIHsKKwkJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQoc3RhcmdldCwgbHVuKTsKKwkJaWYgKHNkZXYpIHsKKwkJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayhLRVJOX0lORk8KKwkJCQkic2NzaSBzY2FuOiBkZXZpY2UgZXhpc3RzIG9uICVzXG4iLAorCQkJCXNkZXYtPnNkZXZfZ2VuZGV2LmJ1c19pZCkpOworCQkJaWYgKHNkZXZwKQorCQkJCSpzZGV2cCA9IHNkZXY7CisJCQllbHNlCisJCQkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCisJCQlpZiAoYmZsYWdzcCkKKwkJCQkqYmZsYWdzcCA9IHNjc2lfZ2V0X2RldmljZV9mbGFncyhzZGV2LAorCQkJCQkJCQkgc2Rldi0+dmVuZG9yLAorCQkJCQkJCQkgc2Rldi0+bW9kZWwpOworCQkJcmV0dXJuIFNDU0lfU0NBTl9MVU5fUFJFU0VOVDsKKwkJfQorCX0KKworCXNkZXYgPSBzY3NpX2FsbG9jX3NkZXYoc3RhcmdldCwgbHVuLCBob3N0ZGF0YSk7CisJaWYgKCFzZGV2KQorCQlnb3RvIG91dDsKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9BVE9NSUMpOworCWlmICghc3JlcSkKKwkJZ290byBvdXRfZnJlZV9zZGV2OworCXJlc3VsdCA9IGttYWxsb2MoMjU2LCBHRlBfQVRPTUlDIHwKKwkJCShzaG9zdC0+dW5jaGVja2VkX2lzYV9kbWEpID8gX19HRlBfRE1BIDogMCk7CisJaWYgKCFyZXN1bHQpCisJCWdvdG8gb3V0X2ZyZWVfc3JlcTsKKworCXNjc2lfcHJvYmVfbHVuKHNyZXEsIHJlc3VsdCwgJmJmbGFncyk7CisJaWYgKHNyZXEtPnNyX3Jlc3VsdCkKKwkJZ290byBvdXRfZnJlZV9yZXN1bHQ7CisKKwkvKgorCSAqIHJlc3VsdCBjb250YWlucyB2YWxpZCBTQ1NJIElOUVVJUlkgZGF0YS4KKwkgKi8KKwlpZiAoKHJlc3VsdFswXSA+PiA1KSA9PSAzKSB7CisJCS8qCisJCSAqIEZvciBhIFBlcmlwaGVyYWwgcXVhbGlmaWVyIDMgKDAxMWIpLCB0aGUgU0NTSQorCQkgKiBzcGVjIHNheXM6IFRoZSBkZXZpY2Ugc2VydmVyIGlzIG5vdCBjYXBhYmxlIG9mCisJCSAqIHN1cHBvcnRpbmcgYSBwaHlzaWNhbCBkZXZpY2Ugb24gdGhpcyBsb2dpY2FsCisJCSAqIHVuaXQuCisJCSAqCisJCSAqIEZvciBkaXNrcywgdGhpcyBpbXBsaWVzIHRoYXQgdGhlcmUgaXMgbm8KKwkJICogbG9naWNhbCBkaXNrIGNvbmZpZ3VyZWQgYXQgc2Rldi0+bHVuLCBidXQgdGhlcmUKKwkJICogaXMgYSB0YXJnZXQgaWQgcmVzcG9uZGluZy4KKwkJICovCisJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJInNjc2kgc2NhbjogcGVyaXBoZXJhbCBxdWFsaWZpZXIgb2YgMywiCisJCQkJCSIgbm8gZGV2aWNlIGFkZGVkXG4iKSk7CisJCXJlcyA9IFNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVDsKKwkJZ290byBvdXRfZnJlZV9yZXN1bHQ7CisJfQorCisJcmVzID0gc2NzaV9hZGRfbHVuKHNkZXYsIHJlc3VsdCwgJmJmbGFncyk7CisJaWYgKHJlcyA9PSBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQpIHsKKwkJaWYgKGJmbGFncyAmIEJMSVNUX0tFWSkgeworCQkJc2Rldi0+bG9ja2FibGUgPSAwOworCQkJc2NzaV91bmxvY2tfZmxvcHRpY2FsKHNyZXEsIHJlc3VsdCk7CisJCX0KKwkJaWYgKGJmbGFnc3ApCisJCQkqYmZsYWdzcCA9IGJmbGFnczsKKwl9CisKKyBvdXRfZnJlZV9yZXN1bHQ6CisJa2ZyZWUocmVzdWx0KTsKKyBvdXRfZnJlZV9zcmVxOgorCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworIG91dF9mcmVlX3NkZXY6CisJaWYgKHJlcyA9PSBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQpIHsKKwkJaWYgKHNkZXZwKSB7CisJCQlzY3NpX2RldmljZV9nZXQoc2Rldik7CisJCQkqc2RldnAgPSBzZGV2OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KQorCQkJc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2Rlc3Ryb3koc2Rldik7CisJCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCQlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJfQorIG91dDoKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNjc2lfc2VxdWVudGlhbF9sdW5fc2NhbiAtIHNlcXVlbnRpYWxseSBzY2FuIGEgU0NTSSB0YXJnZXQKKyAqIEBzdGFyZ2V0Oglwb2ludGVyIHRvIHRhcmdldCBzdHJ1Y3R1cmUgdG8gc2NhbgorICogQGJmbGFnczoJYmxhY2svd2hpdGUgbGlzdCBmbGFnIGZvciBMVU4gMAorICogQGx1bjBfcmVzOglyZXN1bHQgb2Ygc2Nhbm5pbmcgTFVOIDAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBHZW5lcmFsbHksIHNjYW4gZnJvbSBMVU4gMSAoTFVOIDAgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGhhdmUgYmVlbgorICogICAgIHNjYW5uZWQpIHRvIHNvbWUgbWF4aW11bSBsdW4gdW50aWwgYSBMVU4gaXMgZm91bmQgd2l0aCBubyBkZXZpY2UKKyAqICAgICBhdHRhY2hlZC4gVXNlIHRoZSBiZmxhZ3MgdG8gZmlndXJlIG91dCBhbnkgb2RkaXRpZXMuCisgKgorICogICAgIE1vZGlmaWVzIHNkZXZzY2FuLT5sdW4uCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX3NlcXVlbnRpYWxfbHVuX3NjYW4oc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LAorCQkJCSAgICAgaW50IGJmbGFncywgaW50IGx1bjBfcmVzLCBpbnQgc2NzaV9sZXZlbCwKKwkJCQkgICAgIGludCByZXNjYW4pCit7CisJdW5zaWduZWQgaW50IHNwYXJzZV9sdW4sIGx1biwgbWF4X2Rldl9sdW47CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisKKwlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPICJzY3NpIHNjYW46IFNlcXVlbnRpYWwgc2NhbiBvZiIKKwkJCQkgICAgIiVzXG4iLCBzdGFyZ2V0LT5kZXYuYnVzX2lkKSk7CisKKwltYXhfZGV2X2x1biA9IG1pbihtYXhfc2NzaV9sdW5zLCBzaG9zdC0+bWF4X2x1bik7CisJLyoKKwkgKiBJZiB0aGlzIGRldmljZSBpcyBrbm93biB0byBzdXBwb3J0IHNwYXJzZSBtdWx0aXBsZSB1bml0cywKKwkgKiBvdmVycmlkZSB0aGUgb3RoZXIgc2V0dGluZ3MsIGFuZCBzY2FuIGFsbCBvZiB0aGVtLiBOb3JtYWxseSwKKwkgKiBTQ1NJLTMgZGV2aWNlcyBzaG91bGQgYmUgc2Nhbm5lZCB2aWEgdGhlIFJFUE9SVCBMVU5TLgorCSAqLworCWlmIChiZmxhZ3MgJiBCTElTVF9TUEFSU0VMVU4pIHsKKwkJbWF4X2Rldl9sdW4gPSBzaG9zdC0+bWF4X2x1bjsKKwkJc3BhcnNlX2x1biA9IDE7CisJfSBlbHNlCisJCXNwYXJzZV9sdW4gPSAwOworCisJLyoKKwkgKiBJZiBub3Qgc3BhcnNlIGx1biBhbmQgbm8gZGV2aWNlIGF0dGFjaGVkIGF0IExVTiAwIGRvIG5vdCBzY2FuCisJICogYW55IGZ1cnRoZXIuCisJICovCisJaWYgKCFzcGFyc2VfbHVuICYmIChsdW4wX3JlcyAhPSBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGxlc3MgdGhhbiBTQ1NJXzFfQ1NTLCBhbmQgbm8gc3BlY2lhbCBsdW4gc2NhbmluZywgc3RvcAorCSAqIHNjYW5uaW5nOyB0aGlzIG1hdGNoZXMgMi40IGJlaGF2aW91ciwgYnV0IGNvdWxkIGp1c3QgYmUgYSBidWcKKwkgKiAodG8gY29udGludWUgc2Nhbm5pbmcgYSBTQ1NJXzFfQ1NTIGRldmljZSkuCisJICoKKwkgKiBUaGlzIHRlc3QgaXMgYnJva2VuLiAgV2UgbWlnaHQgbm90IGhhdmUgYW55IGRldmljZSBvbiBsdW4wIGZvcgorCSAqIGEgc3BhcnNlbHVuIGRldmljZSwgYW5kIGlmIHRoYXQncyB0aGUgY2FzZSB0aGVuIGhvdyB3b3VsZCB3ZQorCSAqIGtub3cgdGhlIHJlYWwgc2NzaV9sZXZlbCwgZWg/ICBJdCBtaWdodCBtYWtlIHNlbnNlIHRvIGp1c3Qgbm90CisJICogc2NhbiBhbnkgU0NTSV8xIGRldmljZSBmb3Igbm9uLTAgbHVucywgYnV0IHRoYXQgY2hlY2sgd291bGQgYmVzdAorCSAqIGdvIGludG8gc2NzaV9hbGxvY19zZGV2KCkgYW5kIGp1c3QgaGF2ZSBpdCByZXR1cm4gbnVsbCB3aGVuIGFza2VkCisJICogdG8gYWxsb2MgYW4gc2RldiBmb3IgbHVuID4gMCBvbiBhbiBhbHJlYWR5IGZvdW5kIFNDU0lfMSBkZXZpY2UuCisJICoKKwlpZiAoKHNkZXZzY2FuLT5zY3NpX2xldmVsIDwgU0NTSV8xX0NDUykgJiYKKwkgICAgKChiZmxhZ3MgJiAoQkxJU1RfRk9SQ0VMVU4gfCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9NQVg1TFVOKSkKKwkgICAgID09IDApKQorCQlyZXR1cm47CisJICovCisJLyoKKwkgKiBJZiB0aGlzIGRldmljZSBpcyBrbm93biB0byBzdXBwb3J0IG11bHRpcGxlIHVuaXRzLCBvdmVycmlkZQorCSAqIHRoZSBvdGhlciBzZXR0aW5ncywgYW5kIHNjYW4gYWxsIG9mIHRoZW0uCisJICovCisJaWYgKGJmbGFncyAmIEJMSVNUX0ZPUkNFTFVOKQorCQltYXhfZGV2X2x1biA9IHNob3N0LT5tYXhfbHVuOworCS8qCisJICogUkVHQUwgQ0RDLTRYOiBhdm9pZCBoYW5nIGFmdGVyIExVTiA0CisJICovCisJaWYgKGJmbGFncyAmIEJMSVNUX01BWDVMVU4pCisJCW1heF9kZXZfbHVuID0gbWluKDVVLCBtYXhfZGV2X2x1bik7CisJLyoKKwkgKiBEbyBub3Qgc2NhbiBTQ1NJLTIgb3IgbG93ZXIgZGV2aWNlIHBhc3QgTFVOIDcsIHVubGVzcworCSAqIEJMSVNUX0xBUkdFTFVOLgorCSAqLworCWlmIChzY3NpX2xldmVsIDwgU0NTSV8zICYmICEoYmZsYWdzICYgQkxJU1RfTEFSR0VMVU4pKQorCQltYXhfZGV2X2x1biA9IG1pbig4VSwgbWF4X2Rldl9sdW4pOworCisJLyoKKwkgKiBXZSBoYXZlIGFscmVhZHkgc2Nhbm5lZCBMVU4gMCwgc28gc3RhcnQgYXQgTFVOIDEuIEtlZXAgc2Nhbm5pbmcKKwkgKiB1bnRpbCB3ZSByZWFjaCB0aGUgbWF4LCBvciBubyBMVU4gaXMgZm91bmQgYW5kIHdlIGFyZSBub3QKKwkgKiBzcGFyc2VfbHVuLgorCSAqLworCWZvciAobHVuID0gMTsgbHVuIDwgbWF4X2Rldl9sdW47ICsrbHVuKQorCQlpZiAoKHNjc2lfcHJvYmVfYW5kX2FkZF9sdW4oc3RhcmdldCwgbHVuLCBOVUxMLCBOVUxMLCByZXNjYW4sCisJCQkJCSAgICBOVUxMKSAhPSBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQpICYmCisJCSAgICAhc3BhcnNlX2x1bikKKwkJCXJldHVybjsKK30KKworLyoqCisgKiBzY3NpbHVuX3RvX2ludDogY29udmVydCBhIHNjc2lfbHVuIHRvIGFuIGludAorICogQHNjc2lsdW46CXN0cnVjdCBzY3NpX2x1biB0byBiZSBjb252ZXJ0ZWQuCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgQ29udmVydCBAc2NzaWx1biBmcm9tIGEgc3RydWN0IHNjc2lfbHVuIHRvIGEgZm91ciBieXRlIGhvc3QgYnl0ZS1vcmRlcmVkCisgKiAgICAgaW50ZWdlciwgYW5kIHJldHVybiB0aGUgcmVzdWx0LiBUaGUgY2FsbGVyIG11c3QgY2hlY2sgZm9yCisgKiAgICAgdHJ1bmNhdGlvbiBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBOb3RlczoKKyAqICAgICBUaGUgc3RydWN0IHNjc2lfbHVuIGlzIGFzc3VtZWQgdG8gYmUgZm91ciBsZXZlbHMsIHdpdGggZWFjaCBsZXZlbAorICogICAgIGVmZmVjdGl2ZWx5IGNvbnRhaW5pbmcgYSBTQ1NJIGJ5dGUtb3JkZXJlZCAoYmlnIGVuZGlhbikgc2hvcnQ7IHRoZQorICogICAgIGFkZHJlc3NpbmcgYml0cyBvZiBlYWNoIGxldmVsIGFyZSBpZ25vcmVkICh0aGUgaGlnaGVzdCB0d28gYml0cykuCisgKiAgICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIExVTiBmb3JtYXQsIHBvc3QgU0NTSS0zIHNlZSB0aGUgU0NTSQorICogICAgIEFyY2hpdGVjdHVyZSBNb2RlbCwgZm9yIFNDU0ktMyBzZWUgdGhlIFNDU0kgQ29udHJvbGxlciBDb21tYW5kcy4KKyAqCisgKiAgICAgR2l2ZW4gYSBzdHJ1Y3Qgc2NzaV9sdW4gb2Y6IDBhIDA0IDBiIDAzIDAwIDAwIDAwIDAwLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgICB0aGUgaW50ZWdlcjogMHgwYjAzMGEwNAorICoqLworc3RhdGljIGludCBzY3NpbHVuX3RvX2ludChzdHJ1Y3Qgc2NzaV9sdW4gKnNjc2lsdW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGx1bjsKKworCWx1biA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihsdW4pOyBpICs9IDIpCisJCWx1biA9IGx1biB8ICgoKHNjc2lsdW4tPnNjc2lfbHVuW2ldIDw8IDgpIHwKKwkJCSAgICAgIHNjc2lsdW4tPnNjc2lfbHVuW2kgKyAxXSkgPDwgKGkgKiA4KSk7CisJcmV0dXJuIGx1bjsKK30KKworLyoqCisgKiBzY3NpX3JlcG9ydF9sdW5fc2NhbiAtIFNjYW4gdXNpbmcgU0NTSSBSRVBPUlQgTFVOIHJlc3VsdHMKKyAqIEBzZGV2c2NhbjoJc2NhbiB0aGUgaG9zdCwgY2hhbm5lbCwgYW5kIGlkIG9mIHRoaXMgU2NzaV9EZXZpY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBJZiBAc2RldnNjYW4gaXMgZm9yIGEgU0NTSS0zIG9yIHVwIGRldmljZSwgc2VuZCBhIFJFUE9SVCBMVU4KKyAqICAgICBjb21tYW5kLCBhbmQgc2NhbiB0aGUgcmVzdWx0aW5nIGxpc3Qgb2YgTFVOcyBieSBjYWxsaW5nCisgKiAgICAgc2NzaV9wcm9iZV9hbmRfYWRkX2x1bi4KKyAqCisgKiAgICAgTW9kaWZpZXMgc2RldnNjYW4tPmx1bi4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgMDogc2NhbiBjb21wbGV0ZWQgKG9yIG5vIG1lbW9yeSwgc28gZnVydGhlciBzY2FubmluZyBpcyBmdXRpbGUpCisgKiAgICAgMTogbm8gcmVwb3J0IGx1biBzY2FuLCBvciBub3QgY29uZmlndXJlZAorICoqLworc3RhdGljIGludCBzY3NpX3JlcG9ydF9sdW5fc2NhbihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBiZmxhZ3MsCisJCQkJaW50IHJlc2NhbikKK3sKKwljaGFyIGRldm5hbWVbNjRdOworCXVuc2lnbmVkIGNoYXIgc2NzaV9jbWRbTUFYX0NPTU1BTkRfU0laRV07CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgbHVuOworCXVuc2lnbmVkIGludCBudW1fbHVuczsKKwl1bnNpZ25lZCBpbnQgcmV0cmllczsKKwlzdHJ1Y3Qgc2NzaV9sdW4gKmx1bnAsICpsdW5fZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxOworCXU4ICpkYXRhOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKKworCS8qCisJICogT25seSBzdXBwb3J0IFNDU0ktMyBhbmQgdXAgZGV2aWNlcyBpZiBCTElTVF9OT1JFUE9SVExVTiBpcyBub3Qgc2V0LgorCSAqIEFsc28gYWxsb3cgU0NTSS0yIGlmIEJMSVNUX1JFUE9SVExVTjIgaXMgc2V0IGFuZCBob3N0IGFkYXB0ZXIgZG9lcworCSAqIHN1cHBvcnQgbW9yZSB0aGFuIDggTFVOcy4KKwkgKi8KKwlpZiAoKGJmbGFncyAmIEJMSVNUX05PUkVQT1JUTFVOKSB8fCAKKwkgICAgIHNkZXYtPnNjc2lfbGV2ZWwgPCBTQ1NJXzIgfHwKKwkgICAgKHNkZXYtPnNjc2lfbGV2ZWwgPCBTQ1NJXzMgJiYgCisJICAgICAoIShiZmxhZ3MgJiBCTElTVF9SRVBPUlRMVU4yKSB8fCBzZGV2LT5ob3N0LT5tYXhfbHVuIDw9IDgpKSApCisJCXJldHVybiAxOworCWlmIChiZmxhZ3MgJiBCTElTVF9OT0xVTikKKwkJcmV0dXJuIDA7CisKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkZXYsIEdGUF9BVE9NSUMpOworCWlmICghc3JlcSkKKwkJZ290byBvdXQ7CisKKwlzcHJpbnRmKGRldm5hbWUsICJob3N0ICVkIGNoYW5uZWwgJWQgaWQgJWQiLAorCQlzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGVub3VnaCB0byBob2xkIHRoZSBoZWFkZXIgKHRoZSBzYW1lIHNpemUgYXMgb25lIHNjc2lfbHVuKQorCSAqIHBsdXMgdGhlIG1heCBudW1iZXIgb2YgbHVucyB3ZSBhcmUgcmVxdWVzdGluZy4KKwkgKgorCSAqIFJlYWxsb2NhdGluZyBhbmQgdHJ5aW5nIGFnYWluICh3aXRoIHRoZSBleGFjdCBhbW91bnQgd2UgbmVlZCkKKwkgKiB3b3VsZCBiZSBuaWNlLCBidXQgdGhlbiB3ZSBuZWVkIHRvIHNvbWVob3cgbGltaXQgdGhlIHNpemUKKwkgKiBhbGxvY2F0ZWQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBtZW1vcnkgYW5kIHRoZSBsaW1pdHMgb2YKKwkgKiBrbWFsbG9jIC0gd2UgZG9uJ3Qgd2FudCBhIGttYWxsb2MoKSBmYWlsdXJlIG9mIGEgaHVnZSB2YWx1ZSB0bworCSAqIHByZXZlbnQgdXMgZnJvbSBmaW5kaW5nIGFueSBMVU5zIG9uIHRoaXMgdGFyZ2V0LgorCSAqLworCWxlbmd0aCA9IChtYXhfc2NzaV9yZXBvcnRfbHVucyArIDEpICogc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7CisJbHVuX2RhdGEgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0FUT01JQyB8CisJCQkgICAoc2Rldi0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgPyBfX0dGUF9ETUEgOiAwKSk7CisJaWYgKCFsdW5fZGF0YSkKKwkJZ290byBvdXRfcmVsZWFzZV9yZXF1ZXN0OworCisJc2NzaV9jbWRbMF0gPSBSRVBPUlRfTFVOUzsKKworCS8qCisJICogYnl0ZXMgMSAtIDU6IHJlc2VydmVkLCBzZXQgdG8gemVyby4KKwkgKi8KKwltZW1zZXQoJnNjc2lfY21kWzFdLCAwLCA1KTsKKworCS8qCisJICogYnl0ZXMgNiAtIDk6IGxlbmd0aCBvZiB0aGUgY29tbWFuZC4KKwkgKi8KKwlzY3NpX2NtZFs2XSA9ICh1bnNpZ25lZCBjaGFyKSAobGVuZ3RoID4+IDI0KSAmIDB4ZmY7CisJc2NzaV9jbWRbN10gPSAodW5zaWduZWQgY2hhcikgKGxlbmd0aCA+PiAxNikgJiAweGZmOworCXNjc2lfY21kWzhdID0gKHVuc2lnbmVkIGNoYXIpIChsZW5ndGggPj4gOCkgJiAweGZmOworCXNjc2lfY21kWzldID0gKHVuc2lnbmVkIGNoYXIpIGxlbmd0aCAmIDB4ZmY7CisKKwlzY3NpX2NtZFsxMF0gPSAwOwkvKiByZXNlcnZlZCAqLworCXNjc2lfY21kWzExXSA9IDA7CS8qIGNvbnRyb2wgKi8KKwlzcmVxLT5zcl9jbWRfbGVuID0gMDsKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCS8qCisJICogV2UgY2FuIGdldCBhIFVOSVQgQVRURU5USU9OLCBmb3IgZXhhbXBsZSBhIHBvd2VyIG9uL3Jlc2V0LCBzbworCSAqIHJldHJ5IGEgZmV3IHRpbWVzIChsaWtlIHNkLmMgZG9lcyBmb3IgVEVTVCBVTklUIFJFQURZKS4KKwkgKiBFeHBlcmllbmNlIHNob3dzIHNvbWUgY29tYmluYXRpb25zIG9mIGFkYXB0ZXIvZGV2aWNlcyBnZXQgYXQKKwkgKiBsZWFzdCB0d28gcG93ZXIgb24vcmVzZXRzLgorCSAqCisJICogSWxsZWdhbCByZXF1ZXN0cyAoZm9yIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBSRVBPUlQgTFVOUykKKwkgKiBzaG91bGQgY29tZSB0aHJvdWdoIGFzIGEgY2hlY2sgY29uZGl0aW9uLCBhbmQgd2lsbCBub3QgZ2VuZXJhdGUKKwkgKiBhIHJldHJ5LgorCSAqLworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAzOyByZXRyaWVzKyspIHsKKwkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrIChLRVJOX0lORk8gInNjc2kgc2NhbjogU2VuZGluZyIKKwkJCQkiIFJFUE9SVCBMVU5TIHRvICVzICh0cnkgJWQpXG4iLCBkZXZuYW1lLAorCQkJCXJldHJpZXMpKTsKKwkJc2NzaV93YWl0X3JlcShzcmVxLCBzY3NpX2NtZCwgbHVuX2RhdGEsIGxlbmd0aCwKKwkJCQlTQ1NJX1RJTUVPVVQgKyA0KkhaLCAzKTsKKwkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrIChLRVJOX0lORk8gInNjc2kgc2NhbjogUkVQT1JUIExVTlMiCisJCQkJIiAlcyAodHJ5ICVkKSByZXN1bHQgMHgleFxuIiwgc3JlcS0+c3JfcmVzdWx0CisJCQkJPyAgImZhaWxlZCIgOiAic3VjY2Vzc2Z1bCIsIHJldHJpZXMsCisJCQkJc3JlcS0+c3JfcmVzdWx0KSk7CisJCWlmIChzcmVxLT5zcl9yZXN1bHQgPT0gMCkKKwkJCWJyZWFrOworCQllbHNlIGlmIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikpIHsKKwkJCWlmIChzc2hkci5zZW5zZV9rZXkgIT0gVU5JVF9BVFRFTlRJT04pCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3JlcS0+c3JfcmVzdWx0KSB7CisJCS8qCisJCSAqIFRoZSBkZXZpY2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBhIFJFUE9SVCBMVU4gY29tbWFuZAorCQkgKi8KKwkJa2ZyZWUobHVuX2RhdGEpOworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKwkJcmV0dXJuIDE7CisJfQorCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCisJLyoKKwkgKiBHZXQgdGhlIGxlbmd0aCBmcm9tIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIGx1bl9kYXRhLgorCSAqLworCWRhdGEgPSAodTggKikgbHVuX2RhdGEtPnNjc2lfbHVuOworCWxlbmd0aCA9ICgoZGF0YVswXSA8PCAyNCkgfCAoZGF0YVsxXSA8PCAxNikgfAorCQkgIChkYXRhWzJdIDw8IDgpIHwgKGRhdGFbM10gPDwgMCkpOworCisJbnVtX2x1bnMgPSAobGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpOworCWlmIChudW1fbHVucyA+IG1heF9zY3NpX3JlcG9ydF9sdW5zKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2k6IE9uICVzIG9ubHkgJWQgKG1heF9zY3NpX3JlcG9ydF9sdW5zKSIKKwkJICAgICAgICIgb2YgJWQgbHVucyByZXBvcnRlZCwgdHJ5IGluY3JlYXNpbmciCisJCSAgICAgICAiIG1heF9zY3NpX3JlcG9ydF9sdW5zLlxuIiwgZGV2bmFtZSwKKwkJICAgICAgIG1heF9zY3NpX3JlcG9ydF9sdW5zLCBudW1fbHVucyk7CisJCW51bV9sdW5zID0gbWF4X3Njc2lfcmVwb3J0X2x1bnM7CisJfQorCisJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrIChLRVJOX0lORk8gInNjc2kgc2NhbjogUkVQT1JUIExVTiBzY2FuIG9mIgorCQkJIiBob3N0ICVkIGNoYW5uZWwgJWQgaWQgJWRcbiIsIHNkZXYtPmhvc3QtPmhvc3Rfbm8sCisJCQlzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCkpOworCisJLyoKKwkgKiBTY2FuIHRoZSBsdW5zIGluIGx1bl9kYXRhLiBUaGUgZW50cnkgYXQgb2Zmc2V0IDAgaXMgcmVhbGx5CisJICogdGhlIGhlYWRlciwgc28gc3RhcnQgYXQgMSBhbmQgZ28gdXAgdG8gYW5kIGluY2x1ZGluZyBudW1fbHVucy4KKwkgKi8KKwlmb3IgKGx1bnAgPSAmbHVuX2RhdGFbMV07IGx1bnAgPD0gJmx1bl9kYXRhW251bV9sdW5zXTsgbHVucCsrKSB7CisJCWx1biA9IHNjc2lsdW5fdG9faW50KGx1bnApOworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSB1bnVzZWQgcGFydCBvZiBsdW5wIGlzIG5vbi16ZXJvLCBhbmQgc28KKwkJICogZG9lcyBub3QgZml0IGluIGx1bi4KKwkJICovCisJCWlmIChtZW1jbXAoJmx1bnAtPnNjc2lfbHVuW3NpemVvZihsdW4pXSwgIlwwXDBcMFwwIiwgNCkpIHsKKwkJCWludCBpOworCisJCQkvKgorCQkJICogT3V0cHV0IGFuIGVycm9yIGRpc3BsYXlpbmcgdGhlIExVTiBpbiBieXRlIG9yZGVyLAorCQkJICogdGhpcyBkaWZmZXJzIGZyb20gd2hhdCBsaW51eCB3b3VsZCBwcmludCBmb3IgdGhlCisJCQkgKiBpbnRlZ2VyIExVTiB2YWx1ZS4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaTogJXMgbHVuIDB4IiwgZGV2bmFtZSk7CisJCQlkYXRhID0gKGNoYXIgKilsdW5wLT5zY3NpX2x1bjsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKTsgaSsrKQorCQkJCXByaW50aygiJTAyeCIsIGRhdGFbaV0pOworCQkJcHJpbnRrKCIgaGFzIGEgTFVOIGxhcmdlciB0aGFuIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKTsKKwkJfSBlbHNlIGlmIChsdW4gPT0gMCkgeworCQkJLyoKKwkJCSAqIExVTiAwIGhhcyBhbHJlYWR5IGJlZW4gc2Nhbm5lZC4KKwkJCSAqLworCQl9IGVsc2UgaWYgKGx1biA+IHNkZXYtPmhvc3QtPm1heF9sdW4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2k6ICVzIGx1biVkIGhhcyBhIExVTiBsYXJnZXIiCisJCQkgICAgICAgIiB0aGFuIGFsbG93ZWQgYnkgdGhlIGhvc3QgYWRhcHRlclxuIiwKKwkJCSAgICAgICBkZXZuYW1lLCBsdW4pOworCQl9IGVsc2UgeworCQkJaW50IHJlczsKKworCQkJcmVzID0gc2NzaV9wcm9iZV9hbmRfYWRkX2x1bihzdGFyZ2V0LAorCQkJCWx1biwgTlVMTCwgTlVMTCwgcmVzY2FuLCBOVUxMKTsKKwkJCWlmIChyZXMgPT0gU0NTSV9TQ0FOX05PX1JFU1BPTlNFKSB7CisJCQkJLyoKKwkJCQkgKiBHb3Qgc29tZSByZXN1bHRzLCBidXQgbm93IG5vbmUsIGFib3J0LgorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaTogVW5leHBlY3RlZCByZXNwb25zZSIKKwkJCQkgICAgICAgIiBmcm9tICVzIGx1biAlZCB3aGlsZSBzY2FubmluZywgc2NhbiIKKwkJCQkgICAgICAgIiBhYm9ydGVkXG4iLCBkZXZuYW1lLCBsdW4pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJa2ZyZWUobHVuX2RhdGEpOworCXJldHVybiAwOworCisgb3V0X3JlbGVhc2VfcmVxdWVzdDoKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKyBvdXQ6CisJLyoKKwkgKiBXZSBhcmUgb3V0IG9mIG1lbW9yeSwgZG9uJ3QgdHJ5IHNjYW5uaW5nIGFueSBmdXJ0aGVyLgorCSAqLworCXByaW50ayhBTExPQ19GQUlMVVJFX01TRywgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNjc2lfZGV2aWNlICpfX3Njc2lfYWRkX2RldmljZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdWludCBjaGFubmVsLAorCQkJCSAgICAgIHVpbnQgaWQsIHVpbnQgbHVuLCB2b2lkICpob3N0ZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CisJaW50IHJlczsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzY3NpX2FsbG9jX3RhcmdldChwYXJlbnQsIGNoYW5uZWwsIGlkKTsKKworCWlmICghc3RhcmdldCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlkb3duKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJcmVzID0gc2NzaV9wcm9iZV9hbmRfYWRkX2x1bihzdGFyZ2V0LCBsdW4sIE5VTEwsICZzZGV2LCAxLCBob3N0ZGF0YSk7CisJaWYgKHJlcyAhPSBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQpCisJCXNkZXYgPSBFUlJfUFRSKC1FTk9ERVYpOworCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7CisJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKKwlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCisJcmV0dXJuIHNkZXY7Cit9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9hZGRfZGV2aWNlKTsKKwordm9pZCBzY3NpX3Jlc2Nhbl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RyaXZlciAqZHJ2OworCQorCWlmICghZGV2LT5kcml2ZXIpCisJCXJldHVybjsKKworCWRydiA9IHRvX3Njc2lfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAodHJ5X21vZHVsZV9nZXQoZHJ2LT5vd25lcikpIHsKKwkJaWYgKGRydi0+cmVzY2FuKQorCQkJZHJ2LT5yZXNjYW4oZGV2KTsKKwkJbW9kdWxlX3B1dChkcnYtPm93bmVyKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVzY2FuX2RldmljZSk7CisKKy8qKgorICogc2NzaV9zY2FuX3RhcmdldCAtIHNjYW4gYSB0YXJnZXQgaWQsIHBvc3NpYmx5IGluY2x1ZGluZyBhbGwgTFVOcyBvbiB0aGUKKyAqICAgICB0YXJnZXQuCisgKiBAc2RldnNjYToJU2NzaV9EZXZpY2UgaGFuZGxlIGZvciBzY2FubmluZworICogQHNob3N0Oglob3N0IHRvIHNjYW4KKyAqIEBjaGFubmVsOgljaGFubmVsIHRvIHNjYW4KKyAqIEBpZDoJCXRhcmdldCBpZCB0byBzY2FuCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgU2NhbiB0aGUgdGFyZ2V0IGlkIG9uIEBzaG9zdCwgQGNoYW5uZWwsIGFuZCBAaWQuIFNjYW4gYXQgbGVhc3QgTFVOCisgKiAgICAgMCwgYW5kIHBvc3NpYmx5IGFsbCBMVU5zIG9uIHRoZSB0YXJnZXQgaWQuCisgKgorICogICAgIFVzZSB0aGUgcHJlLWFsbG9jYXRlZCBAc2RldnNjYW4gYXMgYSBoYW5kbGUgZm9yIHRoZSBzY2FubmluZy4gVGhpcworICogICAgIGZ1bmN0aW9uIHNldHMgc2RldnNjYW4tPmhvc3QsIHNkZXZzY2FuLT5pZCBhbmQgc2RldnNjYW4tPmx1bjsgdGhlCisgKiAgICAgc2Nhbm5pbmcgZnVuY3Rpb25zIG1vZGlmeSBzZGV2c2Nhbi0+bHVuLgorICoKKyAqICAgICBGaXJzdCB0cnkgYSBSRVBPUlQgTFVOIHNjYW4sIGlmIHRoYXQgZG9lcyBub3Qgc2NhbiB0aGUgdGFyZ2V0LCBkbyBhCisgKiAgICAgc2VxdWVudGlhbCBzY2FuIG9mIExVTnMgb24gdGhlIHRhcmdldCBpZC4KKyAqKi8KK3ZvaWQgc2NzaV9zY2FuX3RhcmdldChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBsdW4sIGludCByZXNjYW4pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QocGFyZW50KTsKKwlpbnQgYmZsYWdzID0gMDsKKwlpbnQgcmVzOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IE5VTEw7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCisJaWYgKHNob3N0LT50aGlzX2lkID09IGlkKQorCQkvKgorCQkgKiBEb24ndCBzY2FuIHRoZSBob3N0IGFkYXB0ZXIKKwkJICovCisJCXJldHVybjsKKworCisJc3RhcmdldCA9IHNjc2lfYWxsb2NfdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQpOworCisJaWYgKCFzdGFyZ2V0KQorCQlyZXR1cm47CisKKwlnZXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCWlmIChsdW4gIT0gU0NBTl9XSUxEX0NBUkQpIHsKKwkJLyoKKwkJICogU2NhbiBmb3IgYSBzcGVjaWZpYyBob3N0L2NoYW4vaWQvbHVuLgorCQkgKi8KKwkJc2NzaV9wcm9iZV9hbmRfYWRkX2x1bihzdGFyZ2V0LCBsdW4sIE5VTEwsIE5VTEwsIHJlc2NhbiwgTlVMTCk7CisJCWdvdG8gb3V0X3JlYXA7CisJfQorCisJLyoKKwkgKiBTY2FuIExVTiAwLCBpZiB0aGVyZSBpcyBzb21lIHJlc3BvbnNlLCBzY2FuIGZ1cnRoZXIuIElkZWFsbHksIHdlCisJICogd291bGQgbm90IGNvbmZpZ3VyZSBMVU4gMCB1bnRpbCBhbGwgTFVOcyBhcmUgc2Nhbm5lZC4KKwkgKi8KKwlyZXMgPSBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKHN0YXJnZXQsIDAsICZiZmxhZ3MsICZzZGV2LCByZXNjYW4sIE5VTEwpOworCWlmIChyZXMgPT0gU0NTSV9TQ0FOX0xVTl9QUkVTRU5UKSB7CisJCWlmIChzY3NpX3JlcG9ydF9sdW5fc2NhbihzZGV2LCBiZmxhZ3MsIHJlc2NhbikgIT0gMCkKKwkJCS8qCisJCQkgKiBUaGUgUkVQT1JUIExVTiBkaWQgbm90IHNjYW4gdGhlIHRhcmdldCwKKwkJCSAqIGRvIGEgc2VxdWVudGlhbCBzY2FuLgorCQkJICovCisJCQlzY3NpX3NlcXVlbnRpYWxfbHVuX3NjYW4oc3RhcmdldCwgYmZsYWdzLAorCQkJCSAgICAgICAJcmVzLCBzZGV2LT5zY3NpX2xldmVsLCByZXNjYW4pOworCX0gZWxzZSBpZiAocmVzID09IFNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVCkgeworCQkvKgorCQkgKiBUaGVyZSdzIGEgdGFyZ2V0IGhlcmUsIGJ1dCBsdW4gMCBpcyBvZmZsaW5lIHNvIHdlCisJCSAqIGNhbid0IHVzZSB0aGUgcmVwb3J0X2x1biBzY2FuLiAgRmFsbCBiYWNrIHRvIGEKKwkJICogc2VxdWVudGlhbCBsdW4gc2NhbiB3aXRoIGEgYmZsYWdzIG9mIFNQQVJTRUxVTiBhbmQKKwkJICogYSBkZWZhdWx0IHNjc2kgbGV2ZWwgb2YgU0NTSV8yCisJCSAqLworCQlzY3NpX3NlcXVlbnRpYWxfbHVuX3NjYW4oc3RhcmdldCwgQkxJU1RfU1BBUlNFTFVOLAorCQkJCVNDU0lfU0NBTl9UQVJHRVRfUFJFU0VOVCwgU0NTSV8yLCByZXNjYW4pOworCX0KKwlpZiAoc2RldikKKwkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCisgb3V0X3JlYXA6CisJLyogbm93IGRldGVybWluZSBpZiB0aGUgdGFyZ2V0IGhhcyBhbnkgY2hpbGRyZW4gYXQgYWxsCisJICogYW5kIGlmIG5vdCwgbnVrZSBpdCAqLworCXNjc2lfdGFyZ2V0X3JlYXAoc3RhcmdldCk7CisKKwlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3NjYW5fdGFyZ2V0KTsKKworc3RhdGljIHZvaWQgc2NzaV9zY2FuX2NoYW5uZWwoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJICAgICAgdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgbHVuLCBpbnQgcmVzY2FuKQoreworCXVpbnQgb3JkZXJfaWQ7CisKKwlpZiAoaWQgPT0gU0NBTl9XSUxEX0NBUkQpCisJCWZvciAoaWQgPSAwOyBpZCA8IHNob3N0LT5tYXhfaWQ7ICsraWQpIHsKKwkJCS8qCisJCQkgKiBYWFggYWRhcHRlciBkcml2ZXJzIHdoZW4gcG9zc2libGUgKEZDUCwgaVNDU0kpCisJCQkgKiBjb3VsZCBtb2RpZnkgbWF4X2lkIHRvIG1hdGNoIHRoZSBjdXJyZW50IG1heCwKKwkJCSAqIG5vdCB0aGUgYWJzb2x1dGUgbWF4LgorCQkJICoKKwkJCSAqIFhYWCBhZGQgYSBzaG9zdCBpZCBpdGVyYXRvciwgc28gZm9yIGV4YW1wbGUsCisJCQkgKiB0aGUgRkMgSUQgY2FuIGJlIHRoZSBzYW1lIGFzIGEgdGFyZ2V0IGlkCisJCQkgKiB3aXRob3V0IGEgaHVnZSBvdmVyaGVhZCBvZiBzcGFyc2UgaWQncy4KKwkJCSAqLworCQkJaWYgKHNob3N0LT5yZXZlcnNlX29yZGVyaW5nKQorCQkJCS8qCisJCQkJICogU2NhbiBmcm9tIGhpZ2ggdG8gbG93IGlkLgorCQkJCSAqLworCQkJCW9yZGVyX2lkID0gc2hvc3QtPm1heF9pZCAtIGlkIC0gMTsKKwkJCWVsc2UKKwkJCQlvcmRlcl9pZCA9IGlkOworCQkJc2NzaV9zY2FuX3RhcmdldCgmc2hvc3QtPnNob3N0X2dlbmRldiwgY2hhbm5lbCwgb3JkZXJfaWQsIGx1biwgcmVzY2FuKTsKKwkJfQorCWVsc2UKKwkJc2NzaV9zY2FuX3RhcmdldCgmc2hvc3QtPnNob3N0X2dlbmRldiwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKK30KKworaW50IHNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBsdW4sIGludCByZXNjYW4pCit7CisJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrIChLRVJOX0lORk8gIiVzOiA8JXU6JXU6JXU6JXU+XG4iLAorCQlfX0ZVTkNUSU9OX18sIHNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBpZCwgbHVuKSk7CisKKwlpZiAoKChjaGFubmVsICE9IFNDQU5fV0lMRF9DQVJEKSAmJiAoY2hhbm5lbCA+IHNob3N0LT5tYXhfY2hhbm5lbCkpIHx8CisJICAgICgoaWQgIT0gU0NBTl9XSUxEX0NBUkQpICYmIChpZCA+IHNob3N0LT5tYXhfaWQpKSB8fAorCSAgICAoKGx1biAhPSBTQ0FOX1dJTERfQ0FSRCkgJiYgKGx1biA+IHNob3N0LT5tYXhfbHVuKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCWlmIChjaGFubmVsID09IFNDQU5fV0lMRF9DQVJEKSAKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8PSBzaG9zdC0+bWF4X2NoYW5uZWw7IGNoYW5uZWwrKykKKwkJCXNjc2lfc2Nhbl9jaGFubmVsKHNob3N0LCBjaGFubmVsLCBpZCwgbHVuLCByZXNjYW4pOworCWVsc2UKKwkJc2NzaV9zY2FuX2NoYW5uZWwoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIHJlc2Nhbik7CisJdXAoJnNob3N0LT5zY2FuX211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNjc2lfc2Nhbl9ob3N0IC0gc2NhbiB0aGUgZ2l2ZW4gYWRhcHRlcgorICogQHNob3N0OglhZGFwdGVyIHRvIHNjYW4KKyAqKi8KK3ZvaWQgc2NzaV9zY2FuX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIFNDQU5fV0lMRF9DQVJELCBTQ0FOX1dJTERfQ0FSRCwKKwkJCQlTQ0FOX1dJTERfQ0FSRCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfc2Nhbl9ob3N0KTsKKworLyoqCisgKiBzY3NpX3NjYW5fc2luZ2xlX3RhcmdldCAtIHNjYW4gdGhlIGdpdmVuIFNDU0kgdGFyZ2V0CisgKiBAc2hvc3Q6ICAgICAgICAgYWRhcHRlciB0byBzY2FuCisgKiBAY2hhbjogICAgICAgICAgY2hhbm5lbCB0byBzY2FuCisgKiBAaWQ6ICAgICAgICAgICAgdGFyZ2V0IGlkIHRvIHNjYW4KKyAqKi8KK3ZvaWQgc2NzaV9zY2FuX3NpbmdsZV90YXJnZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIAorCXVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQoc2hvc3QsIGNoYW4sIGlkLCBTQ0FOX1dJTERfQ0FSRCwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfc2Nhbl9zaW5nbGVfdGFyZ2V0KTsKKwordm9pZCBzY3NpX2ZvcmdldF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBPaywgdGhpcyBsb29rIGEgYml0IHN0cmFuZ2UuICBXZSBhbHdheXMgbG9vayBmb3IgdGhlIGZpcnN0IGRldmljZQorCSAqIG9uIHRoZSBsaXN0IGFzIHNjc2lfcmVtb3ZlX2RldmljZSByZW1vdmVzIHRoZW0gZnJvbSBpdCAtIHRodXMgd2UKKwkgKiBhbHNvIGhhdmUgdG8gcmVsZWFzZSB0aGUgbG9jay4KKwkgKiBXZSBkb24ndCBuZWVkIHRvIGdldCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlIGJlZm9yZQorCSAqIHJlbGVhc2luZyB0aGUgbG9jayBhcyB3ZSBhbHJlYWR5IG93biB0aGUgcmVmZXJlbmNlIGZyb20KKwkgKiBzY3NpX3JlZ2lzdGVyX2RldmljZSB0aGF0J3MgcmVsZWFzZSBpbiBzY3NpX3JlbW92ZV9kZXZpY2UuICBBbmQKKwkgKiBhZnRlciB0aGF0IHdlIGRvbid0IGxvb2sgYXQgc2RldiBhbnltb3JlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3RhcmdldCwgdG1wLCAmc2hvc3QtPl9fdGFyZ2V0cywgc2libGluZ3MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXNjc2lfcmVtb3ZlX3RhcmdldCgmc3RhcmdldC0+ZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX2dldF9ob3N0X2RldigpCisgKgorICogUHVycG9zZTogICAgIENyZWF0ZSBhIFNjc2lfRGV2aWNlIHRoYXQgcG9pbnRzIHRvIHRoZSBob3N0IGFkYXB0ZXIgaXRzZWxmLgorICoKKyAqIEFyZ3VtZW50czogICBTSHBudCAgIC0gSG9zdCB0aGF0IG5lZWRzIGEgU2NzaV9EZXZpY2UKKyAqCisgKiBMb2NrIHN0YXR1czogTm9uZSBhc3N1bWVkLgorICoKKyAqIFJldHVybnM6ICAgICBUaGUgU2NzaV9EZXZpY2Ugb3IgTlVMTAorICoKKyAqIE5vdGVzOgorICoJQXR0YWNoIGEgc2luZ2xlIFNjc2lfRGV2aWNlIHRvIHRoZSBTY3NpX0hvc3QgLSB0aGlzIHNob3VsZAorICoJYmUgbWFkZSB0byBsb29rIGxpa2UgYSAicHNldWRvLWRldmljZSIgdGhhdCBwb2ludHMgdG8gdGhlCisgKglIQSBpdHNlbGYuCisgKgorICoJTm90ZSAtIHRoaXMgZGV2aWNlIGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gYW55IGhpZ2gtbGV2ZWwKKyAqCWRyaXZlcnMgKGluY2x1ZGluZyBnZW5lcmljcyksIHdoaWNoIGlzIHByb2JhYmx5IG5vdAorICoJb3B0aW1hbC4gIFdlIGNhbiBhZGQgaG9va3MgbGF0ZXIgdG8gYXR0YWNoIAorICovCitzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZ2V0X2hvc3RfZGV2KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CisKKwlzdGFyZ2V0ID0gc2NzaV9hbGxvY190YXJnZXQoJnNob3N0LT5zaG9zdF9nZW5kZXYsIDAsIHNob3N0LT50aGlzX2lkKTsKKwlpZiAoIXN0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJc2RldiA9IHNjc2lfYWxsb2Nfc2RldihzdGFyZ2V0LCAwLCBOVUxMKTsKKwlpZiAoc2RldikgeworCQlzZGV2LT5zZGV2X2dlbmRldi5wYXJlbnQgPSBnZXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCQlzZGV2LT5ib3JrZW4gPSAwOworCX0KKwlwdXRfZGV2aWNlKCZzdGFyZ2V0LT5kZXYpOworCXJldHVybiBzZGV2OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2dldF9ob3N0X2Rldik7CisKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9mcmVlX2hvc3RfZGV2KCkKKyAqCisgKiBQdXJwb3NlOiAgICAgRnJlZSBhIHNjc2lfZGV2aWNlIHRoYXQgcG9pbnRzIHRvIHRoZSBob3N0IGFkYXB0ZXIgaXRzZWxmLgorICoKKyAqIEFyZ3VtZW50czogICBTSHBudCAgIC0gSG9zdCB0aGF0IG5lZWRzIGEgU2NzaV9EZXZpY2UKKyAqCisgKiBMb2NrIHN0YXR1czogTm9uZSBhc3N1bWVkLgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nCisgKgorICogTm90ZXM6CisgKi8KK3ZvaWQgc2NzaV9mcmVlX2hvc3RfZGV2KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlCVUdfT04oc2Rldi0+aWQgIT0gc2Rldi0+aG9zdC0+dGhpc19pZCk7CisKKwlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2Rlc3Ryb3kpCisJCXNkZXYtPmhvc3QtPmhvc3R0LT5zbGF2ZV9kZXN0cm95KHNkZXYpOworCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9mcmVlX2hvc3RfZGV2KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzY3RsLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQwNmMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzY3RsLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpc3RvcGggSGVsbHdpZy4KKyAqCVJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKworCitzdGF0aWMgY3RsX3RhYmxlIHNjc2lfdGFibGVbXSA9IHsKKwl7IC5jdGxfbmFtZQk9IERFVl9TQ1NJX0xPR0dJTkdfTEVWRUwsCisJICAucHJvY25hbWUJPSAibG9nZ2luZ19sZXZlbCIsCisJICAuZGF0YQkJPSAmc2NzaV9sb2dnaW5nX2xldmVsLAorCSAgLm1heGxlbgk9IHNpemVvZihzY3NpX2xvZ2dpbmdfbGV2ZWwpLAorCSAgLm1vZGUJCT0gMDY0NCwKKwkgIC5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYyB9LAorCXsgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBzY3NpX2Rpcl90YWJsZVtdID0geworCXsgLmN0bF9uYW1lCT0gREVWX1NDU0ksCisJICAucHJvY25hbWUJPSAic2NzaSIsCisJICAubW9kZQkJPSAwNTU1LAorCSAgLmNoaWxkCT0gc2NzaV90YWJsZSB9LAorCXsgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBzY3NpX3Jvb3RfdGFibGVbXSA9IHsKKwl7IC5jdGxfbmFtZQk9IENUTF9ERVYsCisJICAucHJvY25hbWUJPSAiZGV2IiwKKwkgIC5tb2RlCQk9IDA1NTUsCisJICAuY2hpbGQJPSBzY3NpX2Rpcl90YWJsZSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzY3NpX3RhYmxlX2hlYWRlcjsKKworaW50IF9faW5pdCBzY3NpX2luaXRfc3lzY3RsKHZvaWQpCit7CisJc2NzaV90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoc2NzaV9yb290X3RhYmxlLCAxKTsKKwlpZiAoIXNjc2lfdGFibGVfaGVhZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzY3NpX2V4aXRfc3lzY3RsKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc2NzaV90YWJsZV9oZWFkZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0ZDNhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKQEAgLTAsMCArMSw4MTYgQEAKKy8qCisgKiBzY3NpX3N5c2ZzLmMKKyAqCisgKiBTQ1NJIHN5c2ZzIGludGVyZmFjZSByb3V0aW5lcy4KKyAqCisgKiBDcmVhdGVkIHRvIHB1bGwgU0NTSSBtaWQgbGF5ZXIgc3lzZnMgcm91dGluZXMgaW50byBvbmUgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKworI2luY2x1ZGUgInNjc2lfcHJpdi5oIgorI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIHNjc2lfZGV2aWNlX3N0YXRlCXZhbHVlOworCWNoYXIJCQkqbmFtZTsKK30gc2Rldl9zdGF0ZXNbXSA9IHsKKwl7IFNERVZfQ1JFQVRFRCwgImNyZWF0ZWQiIH0sCisJeyBTREVWX1JVTk5JTkcsICJydW5uaW5nIiB9LAorCXsgU0RFVl9DQU5DRUwsICJjYW5jZWwiIH0sCisJeyBTREVWX0RFTCwgImRlbGV0ZWQiIH0sCisJeyBTREVWX1FVSUVTQ0UsICJxdWllc2NlIiB9LAorCXsgU0RFVl9PRkZMSU5FLAkib2ZmbGluZSIgfSwKKwl7IFNERVZfQkxPQ0ssCSJibG9ja2VkIiB9LAorfTsKKworY29uc3QgY2hhciAqc2NzaV9kZXZpY2Vfc3RhdGVfbmFtZShlbnVtIHNjc2lfZGV2aWNlX3N0YXRlIHN0YXRlKQoreworCWludCBpOworCWNoYXIgKm5hbWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZGV2X3N0YXRlcykvc2l6ZW9mKHNkZXZfc3RhdGVzWzBdKTsgaSsrKSB7CisJCWlmIChzZGV2X3N0YXRlc1tpXS52YWx1ZSA9PSBzdGF0ZSkgeworCQkJbmFtZSA9IHNkZXZfc3RhdGVzW2ldLm5hbWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGludCBjaGVja19zZXQodW5zaWduZWQgaW50ICp2YWwsIGNoYXIgKnNyYykKK3sKKwljaGFyICpsYXN0OworCisJaWYgKHN0cm5jbXAoc3JjLCAiLSIsIDIwKSA9PSAwKSB7CisJCSp2YWwgPSBTQ0FOX1dJTERfQ0FSRDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBEb2Vzbid0IGNoZWNrIGZvciBpbnQgb3ZlcmZsb3cKKwkJICovCisJCSp2YWwgPSBzaW1wbGVfc3RydG91bChzcmMsICZsYXN0LCAwKTsKKwkJaWYgKCpsYXN0ICE9ICdcMCcpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NzaV9zY2FuKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciBzMVsxNV0sIHMyWzE1XSwgczNbMTVdLCBqdW5rOworCXVuc2lnbmVkIGludCBjaGFubmVsLCBpZCwgbHVuOworCWludCByZXM7CisKKwlyZXMgPSBzc2NhbmYoc3RyLCAiJTEwcyAlMTBzICUxMHMgJWMiLCBzMSwgczIsIHMzLCAmanVuayk7CisJaWYgKHJlcyAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2hlY2tfc2V0KCZjaGFubmVsLCBzMSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaGVja19zZXQoJmlkLCBzMikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaGVja19zZXQoJmx1biwgczMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXMgPSBzY3NpX3NjYW5faG9zdF9zZWxlY3RlZChzaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgMSk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIHNob3N0X3Nob3dfZnVuY3Rpb246IG1hY3JvIHRvIGNyZWF0ZSBhbiBhdHRyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAqIHNob3cgYSBub24tYml0IGZpZWxkLgorICovCisjZGVmaW5lIHNob3N0X3Nob3dfZnVuY3Rpb24obmFtZSwgZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfIyNuYW1lIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2xhc3NfZGV2KTsJCVwKKwlyZXR1cm4gc25wcmludGYgKGJ1ZiwgMjAsIGZvcm1hdF9zdHJpbmcsIHNob3N0LT5maWVsZCk7CQlcCit9CisKKy8qCisgKiBzaG9zdF9yZF9hdHRyOiBtYWNybyB0byBjcmVhdGUgYSBmdW5jdGlvbiBhbmQgYXR0cmlidXRlIHZhcmlhYmxlIGZvciBhCisgKiByZWFkIG9ubHkgZmllbGQuCisgKi8KKyNkZWZpbmUgc2hvc3RfcmRfYXR0cjIobmFtZSwgZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorCXNob3N0X3Nob3dfZnVuY3Rpb24obmFtZSwgZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKTsKKworI2RlZmluZSBzaG9zdF9yZF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKSBcCitzaG9zdF9yZF9hdHRyMihmaWVsZCwgZmllbGQsIGZvcm1hdF9zdHJpbmcpCisKKy8qCisgKiBDcmVhdGUgdGhlIGFjdHVhbCBzaG93L3N0b3JlIGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3NjYW4oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNsYXNzX2Rldik7CisJaW50IHJlczsKKworCXJlcyA9IHNjc2lfc2NhbihzaG9zdCwgYnVmKTsKKwlpZiAocmVzID09IDApCisJCXJlcyA9IGNvdW50OworCXJldHVybiByZXM7Cit9Oworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHNjYW4sIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3NjYW4pOworCitzaG9zdF9yZF9hdHRyKHVuaXF1ZV9pZCwgIiV1XG4iKTsKK3Nob3N0X3JkX2F0dHIoaG9zdF9idXN5LCAiJWh1XG4iKTsKK3Nob3N0X3JkX2F0dHIoY21kX3Blcl9sdW4sICIlaGRcbiIpOworc2hvc3RfcmRfYXR0cihzZ190YWJsZXNpemUsICIlaHVcbiIpOworc2hvc3RfcmRfYXR0cih1bmNoZWNrZWRfaXNhX2RtYSwgIiVkXG4iKTsKK3Nob3N0X3JkX2F0dHIyKHByb2NfbmFtZSwgaG9zdHQtPnByb2NfbmFtZSwgIiVzXG4iKTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpzY3NpX3N5c2ZzX3Nob3N0X2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX3VuaXF1ZV9pZCwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9idXN5LAorCSZjbGFzc19kZXZpY2VfYXR0cl9jbWRfcGVyX2x1biwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfc2dfdGFibGVzaXplLAorCSZjbGFzc19kZXZpY2VfYXR0cl91bmNoZWNrZWRfaXNhX2RtYSwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcHJvY19uYW1lLAorCSZjbGFzc19kZXZpY2VfYXR0cl9zY2FuLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIHNjc2lfZGV2aWNlX2Nsc19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlzZGV2ID0gY2xhc3NfdG9fc2RldihjbGFzc19kZXYpOworCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKK30KKwordm9pZCBzY3NpX2RldmljZV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBhcmVudCA9IGRldi0+cGFyZW50OworCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChwYXJlbnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc3RhcmdldC0+cmVhcF9yZWYrKzsKKwlsaXN0X2RlbCgmc2Rldi0+c2libGluZ3MpOworCWxpc3RfZGVsKCZzZGV2LT5zYW1lX3RhcmdldF9zaWJsaW5ncyk7CisJbGlzdF9kZWwoJnNkZXYtPnN0YXJ2ZWRfZW50cnkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2Rldi0+cmVxdWVzdF9xdWV1ZSkgeworCQlzZGV2LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZWRhdGEgPSBOVUxMOworCQlzY3NpX2ZyZWVfcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CisJfQorCisJc2NzaV90YXJnZXRfcmVhcChzY3NpX3RhcmdldChzZGV2KSk7CisKKwlrZnJlZShzZGV2LT5pbnF1aXJ5KTsKKwlrZnJlZShzZGV2KTsKKworCWlmIChwYXJlbnQpCisJCXB1dF9kZXZpY2UocGFyZW50KTsKK30KKworc3RydWN0IGNsYXNzIHNkZXZfY2xhc3MgPSB7CisJLm5hbWUJCT0gInNjc2lfZGV2aWNlIiwKKwkucmVsZWFzZQk9IHNjc2lfZGV2aWNlX2Nsc19yZWxlYXNlLAorfTsKKworLyogYWxsIHByb2JpbmcgaXMgZG9uZSBpbiB0aGUgaW5kaXZpZHVhbCAtPnByb2JlIHJvdXRpbmVzICovCitzdGF0aWMgaW50IHNjc2lfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmdlbmRydikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJaWYgKHNkcC0+bm9fdWxkX2F0dGFjaCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChzZHAtPmlucV9wZXJpcGhfcXVhbCA9PSBTQ1NJX0lOUV9QUV9DT04pPyAxOiAwOworfQorCitzdHJ1Y3QgYnVzX3R5cGUgc2NzaV9idXNfdHlwZSA9IHsKKyAgICAgICAgLm5hbWUJCT0gInNjc2kiLAorICAgICAgICAubWF0Y2gJCT0gc2NzaV9idXNfbWF0Y2gsCit9OworCitpbnQgc2NzaV9zeXNmc19yZWdpc3Rlcih2b2lkKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYnVzX3JlZ2lzdGVyKCZzY3NpX2J1c190eXBlKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gY2xhc3NfcmVnaXN0ZXIoJnNkZXZfY2xhc3MpOworCQlpZiAoZXJyb3IpCisJCQlidXNfdW5yZWdpc3Rlcigmc2NzaV9idXNfdHlwZSk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIHNjc2lfc3lzZnNfdW5yZWdpc3Rlcih2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJnNkZXZfY2xhc3MpOworCWJ1c191bnJlZ2lzdGVyKCZzY3NpX2J1c190eXBlKTsKK30KKworLyoKKyAqIHNkZXZfc2hvd19mdW5jdGlvbjogbWFjcm8gdG8gY3JlYXRlIGFuIGF0dHIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0bworICogc2hvdyBhIG5vbi1iaXQgZmllbGQuCisgKi8KKyNkZWZpbmUgc2Rldl9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2Rldl9zaG93XyMjZmllbGQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsJCQkJCVwKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsJCQkJCVwKKwlyZXR1cm4gc25wcmludGYgKGJ1ZiwgMjAsIGZvcm1hdF9zdHJpbmcsIHNkZXYtPmZpZWxkKTsJCVwKK30JCQkJCQkJCQlcCisKKy8qCisgKiBzZGV2X3JkX2F0dHI6IG1hY3JvIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIGFuZCBhdHRyaWJ1dGUgdmFyaWFibGUgZm9yIGEKKyAqIHJlYWQgb25seSBmaWVsZC4KKyAqLworI2RlZmluZSBzZGV2X3JkX2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJCVwKKwlzZGV2X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPLCBzZGV2X3Nob3dfIyNmaWVsZCwgTlVMTCk7CisKKworLyoKKyAqIHNkZXZfcmRfYXR0cjogY3JlYXRlIGEgZnVuY3Rpb24gYW5kIGF0dHJpYnV0ZSB2YXJpYWJsZSBmb3IgYQorICogcmVhZC93cml0ZSBmaWVsZC4KKyAqLworI2RlZmluZSBzZGV2X3J3X2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJCVwKKwlzZGV2X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzZGV2X3N0b3JlXyMjZmllbGQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwkJCQkJXAorCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwkJCQkJXAorCXNuc2NhbmYgKGJ1ZiwgMjAsIGZvcm1hdF9zdHJpbmcsICZzZGV2LT5maWVsZCk7CQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTyB8IFNfSVdVU1IsIHNkZXZfc2hvd18jI2ZpZWxkLCBzZGV2X3N0b3JlXyMjZmllbGQpOworCisvKiBDdXJyZW50bHkgd2UgZG9uJ3QgZXhwb3J0IGJpdCBmaWVsZHMsIGJ1dCB3ZSBtaWdodCBpbiBmdXR1cmUsCisgKiBzbyBsZWF2ZSB0aGlzIGNvZGUgaW4gKi8KKyNpZiAwCisvKgorICogc2Rldl9yZF9hdHRyOiBjcmVhdGUgYSBmdW5jdGlvbiBhbmQgYXR0cmlidXRlIHZhcmlhYmxlIGZvciBhCisgKiByZWFkL3dyaXRlIGJpdCBmaWVsZC4KKyAqLworI2RlZmluZSBzZGV2X3J3X2F0dHJfYml0KGZpZWxkKQkJCQkJCVwKKwlzZGV2X3Nob3dfZnVuY3Rpb24oZmllbGQsICIlZFxuIikJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzZGV2X3N0b3JlXyMjZmllbGQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJaW50IHJldDsJCQkJCQkJXAorCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsJCQkJCVwKKwlyZXQgPSBzY3NpX3NkZXZfY2hlY2tfYnVmX2JpdChidWYpOwkJCQlcCisJaWYgKHJldCA+PSAwKQl7CQkJCQkJXAorCQlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsJCQkJXAorCQlzZGV2LT5maWVsZCA9IHJldDsJCQkJCVwKKwkJcmV0ID0gY291bnQ7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPIHwgU19JV1VTUiwgc2Rldl9zaG93XyMjZmllbGQsIHNkZXZfc3RvcmVfIyNmaWVsZCk7CisKKy8qCisgKiBzY3NpX3NkZXZfY2hlY2tfYnVmX2JpdDogcmV0dXJuIDAgaWYgYnVmIGlzICIwIiwgcmV0dXJuIDEgaWYgYnVmIGlzICIxIiwKKyAqIGVsc2UgcmV0dXJuIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgc2NzaV9zZGV2X2NoZWNrX2J1Zl9iaXQoY29uc3QgY2hhciAqYnVmKQoreworCWlmICgoYnVmWzFdID09ICdcMCcpIHx8ICgoYnVmWzFdID09ICdcbicpICYmIChidWZbMl0gPT0gJ1wwJykpKSB7CisJCWlmIChidWZbMF0gPT0gJzEnKQorCQkJcmV0dXJuIDE7CisJCWVsc2UgaWYgKGJ1ZlswXSA9PSAnMCcpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSAKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorLyoKKyAqIENyZWF0ZSB0aGUgYWN0dWFsIHNob3cvc3RvcmUgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKi8KK3NkZXZfcmRfYXR0ciAoZGV2aWNlX2Jsb2NrZWQsICIlZFxuIik7CitzZGV2X3JkX2F0dHIgKHF1ZXVlX2RlcHRoLCAiJWRcbiIpOworc2Rldl9yZF9hdHRyICh0eXBlLCAiJWRcbiIpOworc2Rldl9yZF9hdHRyIChzY3NpX2xldmVsLCAiJWRcbiIpOworc2Rldl9yZF9hdHRyICh2ZW5kb3IsICIlLjhzXG4iKTsKK3NkZXZfcmRfYXR0ciAobW9kZWwsICIlLjE2c1xuIik7CitzZGV2X3JkX2F0dHIgKHJldiwgIiUuNHNcbiIpOworCitzdGF0aWMgc3NpemVfdAorc2Rldl9zaG93X3RpbWVvdXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc25wcmludGYgKGJ1ZiwgMjAsICIlZFxuIiwgc2Rldi0+dGltZW91dCAvIEhaKTsKK30KKworc3RhdGljIHNzaXplX3QKK3NkZXZfc3RvcmVfdGltZW91dCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJaW50IHRpbWVvdXQ7CisJc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3NjYW5mIChidWYsICIlZFxuIiwgJnRpbWVvdXQpOworCXNkZXYtPnRpbWVvdXQgPSB0aW1lb3V0ICogSFo7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHRpbWVvdXQsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGV2X3Nob3dfdGltZW91dCwgc2Rldl9zdG9yZV90aW1lb3V0KTsKKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3Jlc2Nhbl9maWVsZCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCit7CisJc2NzaV9yZXNjYW5fZGV2aWNlKGRldik7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHJlc2NhbiwgU19JV1VTUiwgTlVMTCwgc3RvcmVfcmVzY2FuX2ZpZWxkKTsKKworc3RhdGljIHNzaXplX3Qgc2Rldl9zdG9yZV9kZWxldGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlzY3NpX3JlbW92ZV9kZXZpY2UodG9fc2NzaV9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIGNvdW50OworfTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxldGUsIFNfSVdVU1IsIE5VTEwsIHNkZXZfc3RvcmVfZGVsZXRlKTsKKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3N0YXRlX2ZpZWxkKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwllbnVtIHNjc2lfZGV2aWNlX3N0YXRlIHN0YXRlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2Rldl9zdGF0ZXMpL3NpemVvZihzZGV2X3N0YXRlc1swXSk7IGkrKykgeworCQljb25zdCBpbnQgbGVuID0gc3RybGVuKHNkZXZfc3RhdGVzW2ldLm5hbWUpOworCQlpZiAoc3RybmNtcChzZGV2X3N0YXRlc1tpXS5uYW1lLCBidWYsIGxlbikgPT0gMCAmJgorCQkgICBidWZbbGVuXSA9PSAnXG4nKSB7CisJCQlzdGF0ZSA9IHNkZXZfc3RhdGVzW2ldLnZhbHVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIHN0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc2hvd19zdGF0ZV9maWVsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBzY3NpX2RldmljZV9zdGF0ZV9uYW1lKHNkZXYtPnNkZXZfc3RhdGUpOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJXNcbiIsIG5hbWUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3N0YXRlX2ZpZWxkLCBzdG9yZV9zdGF0ZV9maWVsZCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3F1ZXVlX3R5cGVfZmllbGQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwljb25zdCBjaGFyICpuYW1lID0gIm5vbmUiOworCisJaWYgKHNkZXYtPm9yZGVyZWRfdGFncykKKwkJbmFtZSA9ICJvcmRlcmVkIjsKKwllbHNlIGlmIChzZGV2LT5zaW1wbGVfdGFncykKKwkJbmFtZSA9ICJzaW1wbGUiOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlc1xuIiwgbmFtZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihxdWV1ZV90eXBlLCBTX0lSVUdPLCBzaG93X3F1ZXVlX3R5cGVfZmllbGQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19pb3N0YXRfY291bnRlcmJpdHMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlZFxuIiwgKGludClzaXplb2YoYXRvbWljX3QpICogOCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpb2NvdW50ZXJiaXRzLCBTX0lSVUdPLCBzaG93X2lvc3RhdF9jb3VudGVyYml0cywgTlVMTCk7CisKKyNkZWZpbmUgc2hvd19zZGV2X2lvc3RhdChmaWVsZCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19pb3N0YXRfIyNmaWVsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBjb3VudCA9IGF0b21pY19yZWFkKCZzZGV2LT5maWVsZCk7CQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIweCVsbHhcbiIsIGNvdW50KTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPLCBzaG93X2lvc3RhdF8jI2ZpZWxkLCBOVUxMKQorCitzaG93X3NkZXZfaW9zdGF0KGlvcmVxdWVzdF9jbnQpOworc2hvd19zZGV2X2lvc3RhdChpb2RvbmVfY250KTsKK3Nob3dfc2Rldl9pb3N0YXQoaW9lcnJfY250KTsKKworCisvKiBEZWZhdWx0IHRlbXBsYXRlIGZvciBkZXZpY2UgYXR0cmlidXRlcy4gIE1heSBOT1QgYmUgbW9kaWZpZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqc2NzaV9zeXNmc19zZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2RldmljZV9ibG9ja2VkLAorCSZkZXZfYXR0cl9xdWV1ZV9kZXB0aCwKKwkmZGV2X2F0dHJfcXVldWVfdHlwZSwKKwkmZGV2X2F0dHJfdHlwZSwKKwkmZGV2X2F0dHJfc2NzaV9sZXZlbCwKKwkmZGV2X2F0dHJfdmVuZG9yLAorCSZkZXZfYXR0cl9tb2RlbCwKKwkmZGV2X2F0dHJfcmV2LAorCSZkZXZfYXR0cl9yZXNjYW4sCisJJmRldl9hdHRyX2RlbGV0ZSwKKwkmZGV2X2F0dHJfc3RhdGUsCisJJmRldl9hdHRyX3RpbWVvdXQsCisJJmRldl9hdHRyX2lvY291bnRlcmJpdHMsCisJJmRldl9hdHRyX2lvcmVxdWVzdF9jbnQsCisJJmRldl9hdHRyX2lvZG9uZV9jbnQsCisJJmRldl9hdHRyX2lvZXJyX2NudCwKKwlOVUxMCit9OworCitzdGF0aWMgc3NpemVfdCBzZGV2X3N0b3JlX3F1ZXVlX2RlcHRoX3J3KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgc2l6ZV90IGNvdW50KQoreworCWludCBkZXB0aCwgcmV0dmFsOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0ID0gc2Rldi0+aG9zdC0+aG9zdHQ7CisKKwlpZiAoIXNodC0+Y2hhbmdlX3F1ZXVlX2RlcHRoKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlcHRoID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKworCWlmIChkZXB0aCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dmFsID0gc2h0LT5jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwgZGVwdGgpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2Rldl9hdHRyX3F1ZXVlX2RlcHRoX3J3ID0KKwlfX0FUVFIocXVldWVfZGVwdGgsIFNfSVJVR08gfCBTX0lXVVNSLCBzZGV2X3Nob3dfcXVldWVfZGVwdGgsCisJICAgICAgIHNkZXZfc3RvcmVfcXVldWVfZGVwdGhfcncpOworCitzdGF0aWMgc3NpemVfdCBzZGV2X3N0b3JlX3F1ZXVlX3R5cGVfcncoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCA9IHNkZXYtPmhvc3QtPmhvc3R0OworCWludCB0YWdfdHlwZSA9IDAsIHJldHZhbDsKKwlpbnQgcHJldl90YWdfdHlwZSA9IHNjc2lfZ2V0X3RhZ190eXBlKHNkZXYpOworCisJaWYgKCFzZGV2LT50YWdnZWRfc3VwcG9ydGVkIHx8ICFzaHQtPmNoYW5nZV9xdWV1ZV90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJuY21wKGJ1ZiwgIm9yZGVyZWQiLCA3KSA9PSAwKQorCQl0YWdfdHlwZSA9IE1TR19PUkRFUkVEX1RBRzsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgInNpbXBsZSIsIDYpID09IDApCisJCXRhZ190eXBlID0gTVNHX1NJTVBMRV9UQUc7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJub25lIiwgNCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGFnX3R5cGUgPT0gcHJldl90YWdfdHlwZSkKKwkJcmV0dXJuIGNvdW50OworCisJcmV0dmFsID0gc2h0LT5jaGFuZ2VfcXVldWVfdHlwZShzZGV2LCB0YWdfdHlwZSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzZGV2X2F0dHJfcXVldWVfdHlwZV9ydyA9CisJX19BVFRSKHF1ZXVlX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3F1ZXVlX3R5cGVfZmllbGQsCisJICAgICAgIHNkZXZfc3RvcmVfcXVldWVfdHlwZV9ydyk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cl9jaGFuZ2VkX2ludGVybmFsbHkoCisJCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqIGF0dHIpCit7CisJaWYgKCFzdHJjbXAoInF1ZXVlX2RlcHRoIiwgYXR0ci0+YXR0ci5uYW1lKQorCSAgICAmJiBzaG9zdC0+aG9zdHQtPmNoYW5nZV9xdWV1ZV9kZXB0aCkKKwkJcmV0dXJuICZzZGV2X2F0dHJfcXVldWVfZGVwdGhfcnc7CisJZWxzZSBpZiAoIXN0cmNtcCgicXVldWVfdHlwZSIsIGF0dHItPmF0dHIubmFtZSkKKwkgICAgJiYgc2hvc3QtPmhvc3R0LT5jaGFuZ2VfcXVldWVfdHlwZSkKKwkJcmV0dXJuICZzZGV2X2F0dHJfcXVldWVfdHlwZV9ydzsKKwlyZXR1cm4gYXR0cjsKK30KKworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHJfb3ZlcnJpZGRlbigKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiphdHRycywKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaW50IGk7CisKKwlpZiAoIWF0dHJzKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwOyBhdHRyc1tpXTsgaSsrKQorCQlpZiAoIXN0cmNtcChhdHRyc1tpXS0+YXR0ci5uYW1lLCBhdHRyLT5hdHRyLm5hbWUpKQorCQkJcmV0dXJuIGF0dHJzW2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGF0dHJfYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmJhc2VfYXR0cjsKKworCS8qCisJICogU3BhcmUgdGhlIGNhbGxlciBmcm9tIGhhdmluZyB0byBjb3B5IHRoaW5ncyBpdCdzIG5vdCBpbnRlcmVzdGVkIGluLgorCSAqLworCWJhc2VfYXR0ciA9IGF0dHJfb3ZlcnJpZGRlbihzY3NpX3N5c2ZzX3NkZXZfYXR0cnMsIGF0dHIpOworCWlmIChiYXNlX2F0dHIpIHsKKwkJLyogZXh0ZW5kIHBlcm1pc3Npb25zICovCisJCWF0dHItPmF0dHIubW9kZSB8PSBiYXNlX2F0dHItPmF0dHIubW9kZTsKKworCQkvKiBvdmVycmlkZSBudWxsIHNob3cvc3RvcmUgd2l0aCBkZWZhdWx0ICovCisJCWlmICghYXR0ci0+c2hvdykKKwkJCWF0dHItPnNob3cgPSBiYXNlX2F0dHItPnNob3c7CisJCWlmICghYXR0ci0+c3RvcmUpCisJCQlhdHRyLT5zdG9yZSA9IGJhc2VfYXR0ci0+c3RvcmU7CisJfQorCisJcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZShkZXYsIGF0dHIpOworfQorCisvKioKKyAqIHNjc2lfc3lzZnNfYWRkX3NkZXYgLSBhZGQgc2NzaSBkZXZpY2UgdG8gc3lzZnMKKyAqIEBzZGV2OglzY3NpX2RldmljZSB0byBhZGQKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCBvbiBTdWNjZXNzIC8gbm9uLXplcm8gb24gRmFpbHVyZQorICoqLworaW50IHNjc2lfc3lzZnNfYWRkX3NkZXYoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCWludCBlcnJvciwgaTsKKworCWlmICgoZXJyb3IgPSBzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9SVU5OSU5HKSkgIT0gMCkKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBkZXZpY2VfYWRkKCZzZGV2LT5zZGV2X2dlbmRldik7CisJaWYgKGVycm9yKSB7CisJCXB1dF9kZXZpY2Uoc2Rldi0+c2Rldl9nZW5kZXYucGFyZW50KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXJyb3IgMVxuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZXJyb3IgPSBjbGFzc19kZXZpY2VfYWRkKCZzZGV2LT5zZGV2X2NsYXNzZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXJyb3IgMlxuIik7CisJCWdvdG8gY2xlYW5fZGV2aWNlOworCX0KKworCS8qIHRha2UgYSByZWZlcmVuY2UgZm9yIHRoZSBzZGV2X2NsYXNzZGV2OyB0aGlzIGlzCisJICogcmVsZWFzZWQgYnkgdGhlIHNkZXZfY2xhc3MgLnJlbGVhc2UgKi8KKwlnZXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5zZGV2X2F0dHJzKSB7CisJCWZvciAoaSA9IDA7IHNkZXYtPmhvc3QtPmhvc3R0LT5zZGV2X2F0dHJzW2ldOyBpKyspIHsKKwkJCWVycm9yID0gYXR0cl9hZGQoJnNkZXYtPnNkZXZfZ2VuZGV2LAorCQkJCQlzZGV2LT5ob3N0LT5ob3N0dC0+c2Rldl9hdHRyc1tpXSk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJCisJZm9yIChpID0gMDsgc2NzaV9zeXNmc19zZGV2X2F0dHJzW2ldOyBpKyspIHsKKwkJaWYgKCFhdHRyX292ZXJyaWRkZW4oc2Rldi0+aG9zdC0+aG9zdHQtPnNkZXZfYXR0cnMsCisJCQkJCXNjc2lfc3lzZnNfc2Rldl9hdHRyc1tpXSkpIHsKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogYXR0ciA9IAorCQkJCWF0dHJfY2hhbmdlZF9pbnRlcm5hbGx5KHNkZXYtPmhvc3QsIAorCQkJCQkJCXNjc2lfc3lzZnNfc2Rldl9hdHRyc1tpXSk7CisJCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2Rldi0+c2Rldl9nZW5kZXYsIGF0dHIpOworCQkJaWYgKGVycm9yKSB7CisJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJdHJhbnNwb3J0X2FkZF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworCisgY2xlYW5fZGV2aWNlOgorCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX0NBTkNFTCk7CisKKwlkZXZpY2VfZGVsKCZzZGV2LT5zZGV2X2dlbmRldik7CisJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIHNjc2lfcmVtb3ZlX2RldmljZSAtIHVucmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB0aGUgc2NzaSBidXMKKyAqIEBzZGV2OglzY3NpX2RldmljZSB0byB1bnJlZ2lzdGVyCisgKiovCit2b2lkIHNjc2lfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OworCisJZG93bigmc2hvc3QtPnNjYW5fbXV0ZXgpOworCWlmIChzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9DQU5DRUwpICE9IDApCisJCWdvdG8gb3V0OworCisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnNkZXYtPnNkZXZfY2xhc3NkZXYpOworCWRldmljZV9kZWwoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKKwlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9ERUwpOworCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfZGVzdHJveSkKKwkJc2Rldi0+aG9zdC0+aG9zdHQtPnNsYXZlX2Rlc3Ryb3koc2Rldik7CisJdHJhbnNwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworb3V0OgorCXVwKCZzaG9zdC0+c2Nhbl9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVtb3ZlX2RldmljZSk7CisKK3ZvaWQgX19zY3NpX3JlbW92ZV90YXJnZXQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCAqdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXN0YXJnZXQtPnJlYXBfcmVmKys7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNkZXYsIHRtcCwgJnNob3N0LT5fX2RldmljZXMsIHNpYmxpbmdzKSB7CisJCWlmIChzZGV2LT5jaGFubmVsICE9IHN0YXJnZXQtPmNoYW5uZWwgfHwKKwkJICAgIHNkZXYtPmlkICE9IHN0YXJnZXQtPmlkKQorCQkJY29udGludWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc2NzaV90YXJnZXRfcmVhcChzdGFyZ2V0KTsKK30KKworLyoqCisgKiBzY3NpX3JlbW92ZV90YXJnZXQgLSB0cnkgdG8gcmVtb3ZlIGEgdGFyZ2V0IGFuZCBhbGwgaXRzIGRldmljZXMKKyAqIEBkZXY6IGdlbmVyaWMgc3RhcmdldCBvciBwYXJlbnQgb2YgZ2VuZXJpYyBzdGFyZ2V0cyB0byBiZSByZW1vdmVkCisgKgorICogTm90ZTogVGhpcyBpcyBzbGlnaHRseSByYWN5LiAgSXQgaXMgcG9zc2libGUgdGhhdCBpZiB0aGUgdXNlcgorICogcmVxdWVzdHMgdGhlIGFkZGl0aW9uIG9mIGFub3RoZXIgZGV2aWNlIHRoZW4gdGhlIHRhcmdldCB3b24ndCBiZQorICogcmVtb3ZlZC4KKyAqLwordm9pZCBzY3NpX3JlbW92ZV90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKnJkZXYsICppZGV2LCAqbmV4dDsKKworCWlmIChzY3NpX2lzX3RhcmdldF9kZXZpY2UoZGV2KSkgeworCQlfX3Njc2lfcmVtb3ZlX3RhcmdldCh0b19zY3NpX3RhcmdldChkZXYpKTsKKwkJcmV0dXJuOworCX0KKworCXJkZXYgPSBnZXRfZGV2aWNlKGRldik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlkZXYsIG5leHQsICZkZXYtPmNoaWxkcmVuLCBub2RlKSB7CisJCWlmIChzY3NpX2lzX3RhcmdldF9kZXZpY2UoaWRldikpCisJCQlfX3Njc2lfcmVtb3ZlX3RhcmdldCh0b19zY3NpX3RhcmdldChpZGV2KSk7CisJfQorCXB1dF9kZXZpY2UocmRldik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVtb3ZlX3RhcmdldCk7CisKK2ludCBzY3NpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCWRydi0+YnVzID0gJnNjc2lfYnVzX3R5cGU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKGRydik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVnaXN0ZXJfZHJpdmVyKTsKKworaW50IHNjc2lfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmludGYpCit7CisJaW50Zi0+Y2xhc3MgPSAmc2Rldl9jbGFzczsKKworCXJldHVybiBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoaW50Zik7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcmVnaXN0ZXJfaW50ZXJmYWNlKTsKKworCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmNsYXNzX2F0dHJfb3ZlcnJpZGRlbigKKwkJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKiphdHRycywKKwkJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaW50IGk7CisKKwlpZiAoIWF0dHJzKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwOyBhdHRyc1tpXTsgaSsrKQorCQlpZiAoIXN0cmNtcChhdHRyc1tpXS0+YXR0ci5uYW1lLCBhdHRyLT5hdHRyLm5hbWUpKQorCQkJcmV0dXJuIGF0dHJzW2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGNsYXNzX2F0dHJfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzZGV2LAorCQlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqYmFzZV9hdHRyOworCisJLyoKKwkgKiBTcGFyZSB0aGUgY2FsbGVyIGZyb20gaGF2aW5nIHRvIGNvcHkgdGhpbmdzIGl0J3Mgbm90IGludGVyZXN0ZWQgaW4uCisJICovCisJYmFzZV9hdHRyID0gY2xhc3NfYXR0cl9vdmVycmlkZGVuKHNjc2lfc3lzZnNfc2hvc3RfYXR0cnMsIGF0dHIpOworCWlmIChiYXNlX2F0dHIpIHsKKwkJLyogZXh0ZW5kIHBlcm1pc3Npb25zICovCisJCWF0dHItPmF0dHIubW9kZSB8PSBiYXNlX2F0dHItPmF0dHIubW9kZTsKKworCQkvKiBvdmVycmlkZSBudWxsIHNob3cvc3RvcmUgd2l0aCBkZWZhdWx0ICovCisJCWlmICghYXR0ci0+c2hvdykKKwkJCWF0dHItPnNob3cgPSBiYXNlX2F0dHItPnNob3c7CisJCWlmICghYXR0ci0+c3RvcmUpCisJCQlhdHRyLT5zdG9yZSA9IGJhc2VfYXR0ci0+c3RvcmU7CisJfQorCisJcmV0dXJuIGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc2RldiwgYXR0cik7Cit9CisKKy8qKgorICogc2NzaV9zeXNmc19hZGRfaG9zdCAtIGFkZCBzY3NpIGhvc3QgdG8gc3Vic3lzdGVtCisgKiBAc2hvc3Q6ICAgICBzY3NpIGhvc3Qgc3RydWN0IHRvIGFkZCB0byBzdWJzeXN0ZW0KKyAqIEBkZXY6ICAgICAgIHBhcmVudCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIKKyAqKi8KK2ludCBzY3NpX3N5c2ZzX2FkZF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWludCBlcnJvciwgaTsKKworCWlmIChzaG9zdC0+aG9zdHQtPnNob3N0X2F0dHJzKSB7CisJCWZvciAoaSA9IDA7IHNob3N0LT5ob3N0dC0+c2hvc3RfYXR0cnNbaV07IGkrKykgeworCQkJZXJyb3IgPSBjbGFzc19hdHRyX2FkZCgmc2hvc3QtPnNob3N0X2NsYXNzZGV2LAorCQkJCQlzaG9zdC0+aG9zdHQtPnNob3N0X2F0dHJzW2ldKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBzY3NpX3N5c2ZzX3Nob3N0X2F0dHJzW2ldOyBpKyspIHsKKwkJaWYgKCFjbGFzc19hdHRyX292ZXJyaWRkZW4oc2hvc3QtPmhvc3R0LT5zaG9zdF9hdHRycywKKwkJCQkJc2NzaV9zeXNmc19zaG9zdF9hdHRyc1tpXSkpIHsKKwkJCWVycm9yID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZzaG9zdC0+c2hvc3RfY2xhc3NkZXYsCisJCQkJCXNjc2lfc3lzZnNfc2hvc3RfYXR0cnNbaV0pOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKworCXRyYW5zcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCXJldHVybiAwOworfQorCit2b2lkIHNjc2lfc3lzZnNfZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OworCXN0cnVjdCBzY3NpX3RhcmdldCAgKnN0YXJnZXQgPSBzZGV2LT5zZGV2X3RhcmdldDsKKworCWRldmljZV9pbml0aWFsaXplKCZzZGV2LT5zZGV2X2dlbmRldik7CisJc2Rldi0+c2Rldl9nZW5kZXYuYnVzID0gJnNjc2lfYnVzX3R5cGU7CisJc2Rldi0+c2Rldl9nZW5kZXYucmVsZWFzZSA9IHNjc2lfZGV2aWNlX2Rldl9yZWxlYXNlOworCXNwcmludGYoc2Rldi0+c2Rldl9nZW5kZXYuYnVzX2lkLCIlZDolZDolZDolZCIsCisJCXNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLAorCQlzZGV2LT5sdW4pOworCQorCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZzZGV2LT5zZGV2X2NsYXNzZGV2KTsKKwlzZGV2LT5zZGV2X2NsYXNzZGV2LmRldiA9ICZzZGV2LT5zZGV2X2dlbmRldjsKKwlzZGV2LT5zZGV2X2NsYXNzZGV2LmNsYXNzID0gJnNkZXZfY2xhc3M7CisJc25wcmludGYoc2Rldi0+c2Rldl9jbGFzc2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsCisJCSAiJWQ6JWQ6JWQ6JWQiLCBzZGV2LT5ob3N0LT5ob3N0X25vLAorCQkgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJc2Rldi0+c2NzaV9sZXZlbCA9IFNDU0lfMjsKKwl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnNkZXYtPnNhbWVfdGFyZ2V0X3NpYmxpbmdzLCAmc3RhcmdldC0+ZGV2aWNlcyk7CisJbGlzdF9hZGRfdGFpbCgmc2Rldi0+c2libGluZ3MsICZzaG9zdC0+X19kZXZpY2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KKworaW50IHNjc2lfaXNfc2Rldl9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2U7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfaXNfc2Rldl9kZXZpY2UpOworCisvKiBBIGJsYW5rIHRyYW5zcG9ydCB0ZW1wbGF0ZSB0aGF0IGlzIHVzZWQgaW4gZHJpdmVycyB0aGF0IGRvbid0CisgKiB5ZXQgaW1wbGVtZW50IFRyYW5zcG9ydCBBdHRyaWJ1dGVzICovCitzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgYmxhbmtfdHJhbnNwb3J0X3RlbXBsYXRlID0geyB7IHsge05VTEwsIH0sIH0sIH0sIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDFjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtMCwwICsxLDE2NjUgQEAKKy8qIAorICogIEZpYmVyQ2hhbm5lbCB0cmFuc3BvcnQgc3BlY2lmaWMgYXR0cmlidXRlcyBleHBvcnRlZCB0byBzeXNmcy4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogID09PT09PT09CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICAgSmFtZXMgU21hcnQsIEVtdWxleCBDb3Jwb3JhdGlvbgorICogICAgUmV3cml0ZSBmb3IgaG9zdCwgdGFyZ2V0LCBkZXZpY2UsIGFuZCByZW1vdGUgcG9ydCBhdHRyaWJ1dGVzLAorICogICAgc3RhdGlzdGljcywgYW5kIHNlcnZpY2UgZnVuY3Rpb25zLi4uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmg+CisjaW5jbHVkZSAic2NzaV9wcml2LmgiCisKKyNkZWZpbmUgRkNfUFJJTlRLKHgsIGwsIGYsIGEuLi4pCXByaW50ayhsICJzY3NpKCVkOiVkOiVkOiVkKTogIiBmLCAoeCktPmhvc3QtPmhvc3Rfbm8sICh4KS0+Y2hhbm5lbCwgKHgpLT5pZCwgKHgpLT5sdW4gLCAjI2EpCisKKy8qCisgKiBSZWRlZmluZSBzbyB0aGF0IHdlIGNhbiBoYXZlIHNhbWUgbmFtZWQgYXR0cmlidXRlcyBpbiB0aGUKKyAqIHNkZXYvc3RhcmdldC9ob3N0IG9iamVjdHMuCisgKi8KKyNkZWZpbmUgRkNfQ0xBU1NfREVWSUNFX0FUVFIoX3ByZWZpeCxfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCQlcCitzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cl8jI19wcmVmaXgjI18jI19uYW1lID0gCVwKKwlfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQorCisjZGVmaW5lIGZjX2VudW1fbmFtZV9zZWFyY2godGl0bGUsIHRhYmxlX3R5cGUsIHRhYmxlKQkJCVwKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfZmNfIyN0aXRsZSMjX25hbWUoZW51bSB0YWJsZV90eXBlIHRhYmxlX2tleSkJXAorewkJCQkJCQkJCVwKKwlpbnQgaTsJCQkJCQkJCVwKKwljaGFyICpuYW1lID0gTlVMTDsJCQkJCQlcCisJCQkJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0YWJsZSkvc2l6ZW9mKHRhYmxlWzBdKTsgaSsrKSB7CQlcCisJCWlmICh0YWJsZVtpXS52YWx1ZSA9PSB0YWJsZV9rZXkpIHsJCQlcCisJCQluYW1lID0gdGFibGVbaV0ubmFtZTsJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIG5hbWU7CQkJCQkJCVwKK30KKworI2RlZmluZSBmY19lbnVtX25hbWVfbWF0Y2godGl0bGUsIHRhYmxlX3R5cGUsIHRhYmxlKQkJCVwKK3N0YXRpYyBpbnQgZ2V0X2ZjXyMjdGl0bGUjI19tYXRjaChjb25zdCBjaGFyICp0YWJsZV9rZXksCQlcCisJCWVudW0gdGFibGVfdHlwZSAqdmFsdWUpCQkJCQlcCit7CQkJCQkJCQkJXAorCWludCBpOwkJCQkJCQkJXAorCQkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7IGkrKykgewkJXAorCQlpZiAoc3RybmNtcCh0YWJsZV9rZXksIHRhYmxlW2ldLm5hbWUsCQkJXAorCQkJCXRhYmxlW2ldLm1hdGNobGVuKSA9PSAwKSB7CQlcCisJCQkqdmFsdWUgPSB0YWJsZVtpXS52YWx1ZTsJCQlcCisJCQlyZXR1cm4gMDsgLyogc3VjY2VzcyAqLwkJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gMTsgLyogZmFpbHVyZSAqLwkJCQkJCVwKK30KKworCisvKiBDb252ZXJ0IGZjX3BvcnRfdHlwZSB2YWx1ZXMgdG8gYXNjaWkgc3RyaW5nIG5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gZmNfcG9ydF90eXBlCXZhbHVlOworCWNoYXIJCQkqbmFtZTsKK30gZmNfcG9ydF90eXBlX25hbWVzW10gPSB7CisJeyBGQ19QT1JUVFlQRV9VTktOT1dOLAkJIlVua25vd24iIH0sCisJeyBGQ19QT1JUVFlQRV9PVEhFUiwJCSJPdGhlciIgfSwKKwl7IEZDX1BPUlRUWVBFX05PVFBSRVNFTlQsCSJOb3QgUHJlc2VudCIgfSwKKwl7IEZDX1BPUlRUWVBFX05QT1JULAkiTlBvcnQgKGZhYnJpYyB2aWEgcG9pbnQtdG8tcG9pbnQpIiB9LAorCXsgRkNfUE9SVFRZUEVfTkxQT1JULAkiTkxQb3J0IChmYWJyaWMgdmlhIGxvb3ApIiB9LAorCXsgRkNfUE9SVFRZUEVfTFBPUlQsCSJMUG9ydCAocHJpdmF0ZSBsb29wKSIgfSwKKwl7IEZDX1BPUlRUWVBFX1BUUCwJIlBvaW50LVRvLVBvaW50IChkaXJlY3QgbnBvcnQgY29ubmVjdGlvbiIgfSwKK307CitmY19lbnVtX25hbWVfc2VhcmNoKHBvcnRfdHlwZSwgZmNfcG9ydF90eXBlLCBmY19wb3J0X3R5cGVfbmFtZXMpCisjZGVmaW5lIEZDX1BPUlRUWVBFX01BWF9OQU1FTEVOCQk1MAorCisKKy8qIENvbnZlcnQgZmNfcG9ydF9zdGF0ZSB2YWx1ZXMgdG8gYXNjaWkgc3RyaW5nIG5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gZmNfcG9ydF9zdGF0ZQl2YWx1ZTsKKwljaGFyCQkJKm5hbWU7Cit9IGZjX3BvcnRfc3RhdGVfbmFtZXNbXSA9IHsKKwl7IEZDX1BPUlRTVEFURV9VTktOT1dOLAkJIlVua25vd24iIH0sCisJeyBGQ19QT1JUU1RBVEVfTk9UUFJFU0VOVCwJIk5vdCBQcmVzZW50IiB9LAorCXsgRkNfUE9SVFNUQVRFX09OTElORSwJCSJPbmxpbmUiIH0sCisJeyBGQ19QT1JUU1RBVEVfT0ZGTElORSwJCSJPZmZsaW5lIiB9LAorCXsgRkNfUE9SVFNUQVRFX0JMT0NLRUQsCQkiQmxvY2tlZCIgfSwKKwl7IEZDX1BPUlRTVEFURV9CWVBBU1NFRCwJIkJ5cGFzc2VkIiB9LAorCXsgRkNfUE9SVFNUQVRFX0RJQUdOT1NUSUNTLAkiRGlhZ25vc3RpY3MiIH0sCisJeyBGQ19QT1JUU1RBVEVfTElOS0RPV04sCSJMaW5rZG93biIgfSwKKwl7IEZDX1BPUlRTVEFURV9FUlJPUiwJCSJFcnJvciIgfSwKKwl7IEZDX1BPUlRTVEFURV9MT09QQkFDSywJIkxvb3BiYWNrIiB9LAorfTsKK2ZjX2VudW1fbmFtZV9zZWFyY2gocG9ydF9zdGF0ZSwgZmNfcG9ydF9zdGF0ZSwgZmNfcG9ydF9zdGF0ZV9uYW1lcykKKyNkZWZpbmUgRkNfUE9SVFNUQVRFX01BWF9OQU1FTEVOCTIwCisKKworLyogQ29udmVydCBmY190Z3RpZF9iaW5kaW5nX3R5cGUgdmFsdWVzIHRvIGFzY2lpIHN0cmluZyBuYW1lICovCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIGZjX3RndGlkX2JpbmRpbmdfdHlwZQl2YWx1ZTsKKwljaGFyCQkJCSpuYW1lOworCWludAkJCQltYXRjaGxlbjsKK30gZmNfdGd0aWRfYmluZGluZ190eXBlX25hbWVzW10gPSB7CisJeyBGQ19UR1RJRF9CSU5EX05PTkUsICJub25lIiwgNCB9LAorCXsgRkNfVEdUSURfQklORF9CWV9XV1BOLCAid3dwbiAoV29ybGQgV2lkZSBQb3J0IE5hbWUpIiwgNCB9LAorCXsgRkNfVEdUSURfQklORF9CWV9XV05OLCAid3dubiAoV29ybGQgV2lkZSBOb2RlIE5hbWUpIiwgNCB9LAorCXsgRkNfVEdUSURfQklORF9CWV9JRCwgInBvcnRfaWQgKEZDIEFkZHJlc3MpIiwgNyB9LAorfTsKK2ZjX2VudW1fbmFtZV9zZWFyY2godGd0aWRfYmluZF90eXBlLCBmY190Z3RpZF9iaW5kaW5nX3R5cGUsCisJCWZjX3RndGlkX2JpbmRpbmdfdHlwZV9uYW1lcykKK2ZjX2VudW1fbmFtZV9tYXRjaCh0Z3RpZF9iaW5kX3R5cGUsIGZjX3RndGlkX2JpbmRpbmdfdHlwZSwKKwkJZmNfdGd0aWRfYmluZGluZ190eXBlX25hbWVzKQorI2RlZmluZSBGQ19CSU5EVFlQRV9NQVhfTkFNRUxFTgkzMAorCisKKyNkZWZpbmUgZmNfYml0ZmllbGRfbmFtZV9zZWFyY2godGl0bGUsIHRhYmxlKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCVwKK2dldF9mY18jI3RpdGxlIyNfbmFtZXModTMyIHRhYmxlX2tleSwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJXAorCWNoYXIgKnByZWZpeCA9ICIiOwkJCQkJXAorCXNzaXplX3QgbGVuID0gMDsJCQkJCVwKKwlpbnQgaTsJCQkJCQkJXAorCQkJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0YWJsZSkvc2l6ZW9mKHRhYmxlWzBdKTsgaSsrKSB7CVwKKwkJaWYgKHRhYmxlW2ldLnZhbHVlICYgdGFibGVfa2V5KSB7CQlcCisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlcyVzIiwJXAorCQkJCXByZWZpeCwgdGFibGVbaV0ubmFtZSk7CQlcCisJCQlwcmVmaXggPSAiLCAiOwkJCQlcCisJCX0JCQkJCQlcCisJfQkJCQkJCQlcCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsJCQlcCisJcmV0dXJuIGxlbjsJCQkJCQlcCit9CisKKworLyogQ29udmVydCBGQ19DT1MgYml0IHZhbHVlcyB0byBhc2NpaSBzdHJpbmcgbmFtZSAqLworc3RhdGljIHN0cnVjdCB7CisJdTMyIAkJCXZhbHVlOworCWNoYXIJCQkqbmFtZTsKK30gZmNfY29zX25hbWVzW10gPSB7CisJeyBGQ19DT1NfQ0xBU1MxLAkiQ2xhc3MgMSIgfSwKKwl7IEZDX0NPU19DTEFTUzIsCSJDbGFzcyAyIiB9LAorCXsgRkNfQ09TX0NMQVNTMywJIkNsYXNzIDMiIH0sCisJeyBGQ19DT1NfQ0xBU1M0LAkiQ2xhc3MgNCIgfSwKKwl7IEZDX0NPU19DTEFTUzYsCSJDbGFzcyA2IiB9LAorfTsKK2ZjX2JpdGZpZWxkX25hbWVfc2VhcmNoKGNvcywgZmNfY29zX25hbWVzKQorCisKKy8qIENvbnZlcnQgRkNfUE9SVFNQRUVEIGJpdCB2YWx1ZXMgdG8gYXNjaWkgc3RyaW5nIG5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXUzMiAJCQl2YWx1ZTsKKwljaGFyCQkJKm5hbWU7Cit9IGZjX3BvcnRfc3BlZWRfbmFtZXNbXSA9IHsKKwl7IEZDX1BPUlRTUEVFRF8xR0JJVCwJCSIxIEdiaXQiIH0sCisJeyBGQ19QT1JUU1BFRURfMkdCSVQsCQkiMiBHYml0IiB9LAorCXsgRkNfUE9SVFNQRUVEXzRHQklULAkJIjQgR2JpdCIgfSwKKwl7IEZDX1BPUlRTUEVFRF8xMEdCSVQsCQkiMTAgR2JpdCIgfSwKKwl7IEZDX1BPUlRTUEVFRF9OT1RfTkVHT1RJQVRFRCwJIk5vdCBOZWdvdGlhdGVkIiB9LAorfTsKK2ZjX2JpdGZpZWxkX25hbWVfc2VhcmNoKHBvcnRfc3BlZWQsIGZjX3BvcnRfc3BlZWRfbmFtZXMpCisKKworc3RhdGljIGludAorc2hvd19mY19mYzRzIChjaGFyICpidWYsIHU4ICpmYzRfbGlzdCkKK3sKKwlpbnQgaSwgbGVuPTA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkNfRkM0X0xJU1RfU0laRTsgaSsrLCBmYzRfbGlzdCsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4gLCAiMHglMDJ4ICIsICpmYzRfbGlzdCk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKwlyZXR1cm4gbGVuOworfQorCisKKy8qIENvbnZlcnQgRkNfUlBPUlRfUk9MRSBiaXQgdmFsdWVzIHRvIGFzY2lpIHN0cmluZyBuYW1lICovCitzdGF0aWMgc3RydWN0IHsKKwl1MzIgCQkJdmFsdWU7CisJY2hhcgkJCSpuYW1lOworfSBmY19yZW1vdGVfcG9ydF9yb2xlX25hbWVzW10gPSB7CisJeyBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQsCSJGQ1AgVGFyZ2V0IiB9LAorCXsgRkNfUlBPUlRfUk9MRV9GQ1BfSU5JVElBVE9SLAkiRkNQIEluaXRpYXRvciIgfSwKKwl7IEZDX1JQT1JUX1JPTEVfSVBfUE9SVCwJIklQIFBvcnQiIH0sCit9OworZmNfYml0ZmllbGRfbmFtZV9zZWFyY2gocmVtb3RlX3BvcnRfcm9sZXMsIGZjX3JlbW90ZV9wb3J0X3JvbGVfbmFtZXMpCisKKy8qCisgKiBEZWZpbmUgcm9sZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gcG9ydF9pZC4gVmFsdWVzIGFyZSByZWxhdGl2ZSB0byBST0xFX01BU0suCisgKi8KKyNkZWZpbmUgRkNfV0VMTEtOT1dOX1BPUlRJRF9NQVNLCTB4ZmZmZmYwCisjZGVmaW5lIEZDX1dFTExLTk9XTl9ST0xFX01BU0sgIAkweDAwMDAwZgorI2RlZmluZSBGQ19GUE9SVF9QT1JUSUQJCQkweDAwMDAwZQorI2RlZmluZSBGQ19GQUJDVExSX1BPUlRJRAkJMHgwMDAwMGQKKyNkZWZpbmUgRkNfRElSU1JWUl9QT1JUSUQJCTB4MDAwMDBjCisjZGVmaW5lIEZDX1RJTUVTUlZSX1BPUlRJRAkJMHgwMDAwMGIKKyNkZWZpbmUgRkNfTUdNVFNSVlJfUE9SVElECQkweDAwMDAwYQorCisKK3N0YXRpYyB2b2lkIGZjX3RpbWVvdXRfYmxvY2tlZF9ycG9ydCh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGZjX3Njc2lfc2Nhbl9ycG9ydCh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X3Rlcm1pbmF0ZShzdHJ1Y3QgZmNfcnBvcnQgICpycG9ydCk7CisKKy8qCisgKiBBdHRyaWJ1dGUgY291bnRzIHByZSBvYmplY3QgdHlwZS4uLgorICogSW5jcmVhc2UgdGhlc2UgdmFsdWVzIGlmIHlvdSBhZGQgYXR0cmlidXRlcworICovCisjZGVmaW5lIEZDX1NUQVJHRVRfTlVNX0FUVFJTIAkzCisjZGVmaW5lIEZDX1JQT1JUX05VTV9BVFRSUwk5CisjZGVmaW5lIEZDX0hPU1RfTlVNX0FUVFJTCTE1CisKK3N0cnVjdCBmY19pbnRlcm5hbCB7CisJc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIHQ7CisJc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlICpmOworCisJLyoKKwkgKiBGb3IgYXR0cmlidXRlcyA6IGVhY2ggb2JqZWN0IGhhcyA6CisJICogICBBbiBhcnJheSBvZiB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgc3RydWN0dXJlcworCSAqICAgQW4gYXJyYXkgb2YgbnVsbC10ZXJtaW5hdGVkIHBvaW50ZXJzIHRvIHRoZSBhdHRyaWJ1dGUKKwkgKiAgICAgc3RydWN0dXJlcyAtIHVzZWQgZm9yIG1pZC1sYXllciBpbnRlcmFjdGlvbi4KKwkgKgorCSAqIFRoZSBhdHRyaWJ1dGUgY29udGFpbmVycyBmb3IgdGhlIHN0YXJnZXQgYW5kIGhvc3QgYXJlIGFyZQorCSAqIHBhcnQgb2YgdGhlIG1pZGxheWVyLiBBcyB0aGUgcmVtb3RlIHBvcnQgaXMgc3BlY2lmaWMgdG8gdGhlCisJICogZmMgdHJhbnNwb3J0LCB3ZSBtdXN0IHByb3ZpZGUgdGhlIGF0dHJpYnV0ZSBjb250YWluZXIuCisJICovCisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgcHJpdmF0ZV9zdGFyZ2V0X2F0dHJzWworCQkJCQkJCUZDX1NUQVJHRVRfTlVNX0FUVFJTXTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqc3RhcmdldF9hdHRyc1tGQ19TVEFSR0VUX05VTV9BVFRSUyArIDFdOworCisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgcHJpdmF0ZV9ob3N0X2F0dHJzW0ZDX0hPU1RfTlVNX0FUVFJTXTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqaG9zdF9hdHRyc1tGQ19IT1NUX05VTV9BVFRSUyArIDFdOworCisJc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgcnBvcnRfYXR0cl9jb250OworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIHByaXZhdGVfcnBvcnRfYXR0cnNbRkNfUlBPUlRfTlVNX0FUVFJTXTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqcnBvcnRfYXR0cnNbRkNfUlBPUlRfTlVNX0FUVFJTICsgMV07Cit9OworCisjZGVmaW5lIHRvX2ZjX2ludGVybmFsKHRtcGwpCWNvbnRhaW5lcl9vZih0bXBsLCBzdHJ1Y3QgZmNfaW50ZXJuYWwsIHQpCisKK3N0YXRpYyBpbnQgZmNfdGFyZ2V0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChkZXYpOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHN0YXJnZXQpOworCisJLyoKKwkgKiBpZiBwYXJlbnQgaXMgcmVtb3RlIHBvcnQsIHVzZSB2YWx1ZXMgZnJvbSByZW1vdGUgcG9ydC4KKwkgKiBPdGhlcndpc2UsIHRoaXMgaG9zdCB1c2VzIHRoZSBmY190cmFuc3BvcnQsIGJ1dCBub3QgdGhlCisJICogcmVtb3RlIHBvcnQgaW50ZXJmYWNlLiBBcyBzdWNoLCBpbml0aWFsaXplIHRvIGtub3duIG5vbi12YWx1ZXMuCisJICovCisJaWYgKHJwb3J0KSB7CisJCWZjX3N0YXJnZXRfbm9kZV9uYW1lKHN0YXJnZXQpID0gcnBvcnQtPm5vZGVfbmFtZTsKKwkJZmNfc3RhcmdldF9wb3J0X25hbWUoc3RhcmdldCkgPSBycG9ydC0+cG9ydF9uYW1lOworCQlmY19zdGFyZ2V0X3BvcnRfaWQoc3RhcmdldCkgPSBycG9ydC0+cG9ydF9pZDsKKwl9IGVsc2UgeworCQlmY19zdGFyZ2V0X25vZGVfbmFtZShzdGFyZ2V0KSA9IC0xOworCQlmY19zdGFyZ2V0X3BvcnRfbmFtZShzdGFyZ2V0KSA9IC0xOworCQlmY19zdGFyZ2V0X3BvcnRfaWQoc3RhcmdldCkgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFQ0xBUkVfVFJBTlNQT1JUX0NMQVNTKGZjX3RyYW5zcG9ydF9jbGFzcywKKwkJCSAgICAgICAiZmNfdHJhbnNwb3J0IiwKKwkJCSAgICAgICBmY190YXJnZXRfc2V0dXAsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMKTsKKworc3RhdGljIGludCBmY19ob3N0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChkZXYpOworCisJLyogCisJICogU2V0IGRlZmF1bHQgdmFsdWVzIGVhc2lseSBkZXRlY3RlZCBieSB0aGUgbWlkbGF5ZXIgYXMKKwkgKiBmYWlsdXJlIGNhc2VzLiAgVGhlIHNjc2kgbGxkZCBpcyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nCisJICogYWxsIHRyYW5zcG9ydCBhdHRyaWJ1dGVzIHRvIHZhbGlkIHZhbHVlcyBwZXIgaG9zdC4KKwkgKi8KKwlmY19ob3N0X25vZGVfbmFtZShzaG9zdCkgPSAtMTsKKwlmY19ob3N0X3BvcnRfbmFtZShzaG9zdCkgPSAtMTsKKwlmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKHNob3N0KSA9IEZDX0NPU19VTlNQRUNJRklFRDsKKwltZW1zZXQoZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyhzaG9zdCksIDAsCisJCXNpemVvZihmY19ob3N0X3N1cHBvcnRlZF9mYzRzKHNob3N0KSkpOworCW1lbXNldChmY19ob3N0X3N5bWJvbGljX25hbWUoc2hvc3QpLCAwLAorCQlzaXplb2YoZmNfaG9zdF9zeW1ib2xpY19uYW1lKHNob3N0KSkpOworCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhzaG9zdCkgPSBGQ19QT1JUU1BFRURfVU5LTk9XTjsKKwlmY19ob3N0X21heGZyYW1lX3NpemUoc2hvc3QpID0gLTE7CisJbWVtc2V0KGZjX2hvc3Rfc2VyaWFsX251bWJlcihzaG9zdCksIDAsCisJCXNpemVvZihmY19ob3N0X3NlcmlhbF9udW1iZXIoc2hvc3QpKSk7CisKKwlmY19ob3N0X3BvcnRfaWQoc2hvc3QpID0gLTE7CisJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKKwlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX1VOS05PV047CisJbWVtc2V0KGZjX2hvc3RfYWN0aXZlX2ZjNHMoc2hvc3QpLCAwLAorCQlzaXplb2YoZmNfaG9zdF9hY3RpdmVfZmM0cyhzaG9zdCkpKTsKKwlmY19ob3N0X3NwZWVkKHNob3N0KSA9IEZDX1BPUlRTUEVFRF9VTktOT1dOOworCWZjX2hvc3RfZmFicmljX25hbWUoc2hvc3QpID0gLTE7CisKKwlmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkgPSBGQ19UR1RJRF9CSU5EX0JZX1dXUE47CisKKwlJTklUX0xJU1RfSEVBRCgmZmNfaG9zdF9ycG9ydHMoc2hvc3QpKTsKKwlJTklUX0xJU1RfSEVBRCgmZmNfaG9zdF9ycG9ydF9iaW5kaW5ncyhzaG9zdCkpOworCWZjX2hvc3RfbmV4dF9ycG9ydF9udW1iZXIoc2hvc3QpID0gMDsKKwlmY19ob3N0X25leHRfdGFyZ2V0X2lkKHNob3N0KSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFQ0xBUkVfVFJBTlNQT1JUX0NMQVNTKGZjX2hvc3RfY2xhc3MsCisJCQkgICAgICAgImZjX2hvc3QiLAorCQkJICAgICAgIGZjX2hvc3Rfc2V0dXAsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMKTsKKworLyoKKyAqIFNldHVwIGFuZCBSZW1vdmUgYWN0aW9ucyBmb3IgcmVtb3RlIHBvcnRzIGFyZSBoYW5kbGVkCisgKiBpbiB0aGUgc2VydmljZSBmdW5jdGlvbnMgYmVsb3cuCisgKi8KK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhmY19ycG9ydF9jbGFzcywKKwkJCSAgICAgICAiZmNfcmVtb3RlX3BvcnRzIiwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisKKy8qCisgKiBNb2R1bGUgUGFyYW1ldGVycworICovCisKKy8qCisgKiBkZXZfbG9zc190bW86IHRoZSBkZWZhdWx0IG51bWJlciBvZiBzZWNvbmRzIHRoYXQgdGhlIEZDIHRyYW5zcG9ydAorICogICBzaG91bGQgaW5zdWxhdGUgdGhlIGxvc3Mgb2YgYSByZW1vdGUgcG9ydC4KKyAqICAgVGhlIG1heGltdW0gd2lsbCBiZSBjYXBwZWQgYnkgdGhlIHZhbHVlIG9mIFNDU0lfREVWSUNFX0JMT0NLX01BWF9USU1FT1VULgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZjX2Rldl9sb3NzX3RtbyA9IFNDU0lfREVWSUNFX0JMT0NLX01BWF9USU1FT1VUOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X2xvc3NfdG1vLCBmY19kZXZfbG9zc190bW8sIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X2xvc3NfdG1vLAorCQkgIk1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgdGhhdCB0aGUgRkMgdHJhbnNwb3J0IHNob3VsZCIKKwkJICIgaW5zdWxhdGUgdGhlIGxvc3Mgb2YgYSByZW1vdGUgcG9ydC4gT25jZSB0aGlzIHZhbHVlIGlzIgorCQkgIiBleGNlZWRlZCwgdGhlIHNjc2kgdGFyZ2V0IGlzIHJlbW92ZWQuIFZhbHVlIHNob3VsZCBiZSIKKwkJICIgYmV0d2VlbiAxIGFuZCBTQ1NJX0RFVklDRV9CTE9DS19NQVhfVElNRU9VVC4iKTsKKworCitzdGF0aWMgX19pbml0IGludCBmY190cmFuc3BvcnRfaW5pdCh2b2lkKQoreworCWludCBlcnJvciA9IHRyYW5zcG9ydF9jbGFzc19yZWdpc3RlcigmZmNfaG9zdF9jbGFzcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJmZjX3Jwb3J0X2NsYXNzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZmY190cmFuc3BvcnRfY2xhc3MpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmNfdHJhbnNwb3J0X2V4aXQodm9pZCkKK3sKKwl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmZmNfdHJhbnNwb3J0X2NsYXNzKTsKKwl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmZmNfcnBvcnRfY2xhc3MpOworCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZmY19ob3N0X2NsYXNzKTsKK30KKworLyoKKyAqIEZDIFJlbW90ZSBQb3J0IEF0dHJpYnV0ZSBNYW5hZ2VtZW50CisgKi8KKworI2RlZmluZSBmY19ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X2ZjX3Jwb3J0XyMjZmllbGQgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRyYW5zcG9ydF9jbGFzc190b19ycG9ydChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOwkJXAorCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsJXAorCWlmIChpLT5mLT5nZXRfcnBvcnRfIyNmaWVsZCkJCQkJCVwKKwkJaS0+Zi0+Z2V0X3Jwb3J0XyMjZmllbGQocnBvcnQpOwkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc3osIGZvcm1hdF9zdHJpbmcsIGNhc3QgcnBvcnQtPmZpZWxkKTsgCVwKK30KKworI2RlZmluZSBmY19ycG9ydF9zdG9yZV9mdW5jdGlvbihmaWVsZCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzdG9yZV9mY19ycG9ydF8jI2ZpZWxkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwJXAorCQkJICAgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCWludCB2YWw7CQkJCQkJCVwKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Jwb3J0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CQlcCisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwlcCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsJCQkJXAorCWktPmYtPnNldF9ycG9ydF8jI2ZpZWxkKHJwb3J0LCB2YWwpOwkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CisKKyNkZWZpbmUgZmNfcnBvcnRfcmRfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3opCQkJXAorCWZjX3Jwb3J0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCApCQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIocnBvcnQsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSBzaG93X2ZjX3Jwb3J0XyMjZmllbGQsIE5VTEwpCisKKyNkZWZpbmUgZmNfcnBvcnRfcmRfYXR0cl9jYXN0KGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJCVwKKwlmY19ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKGNhc3QpKQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIocnBvcnQsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSAgc2hvd19mY19ycG9ydF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIGZjX3Jwb3J0X3J3X2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6KQkJCVwKKwlmY19ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQkJXAorCWZjX3Jwb3J0X3N0b3JlX2Z1bmN0aW9uKGZpZWxkKQkJCQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCBmaWVsZCwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCQlzaG93X2ZjX3Jwb3J0XyMjZmllbGQsCQkJCVwKKwkJCXN0b3JlX2ZjX3Jwb3J0XyMjZmllbGQpCisKKworI2RlZmluZSBmY19wcml2YXRlX3Jwb3J0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19ycG9ydF8jI2ZpZWxkIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fcnBvcnQoY2Rldik7CVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBzeiwgZm9ybWF0X3N0cmluZywgY2FzdCBycG9ydC0+ZmllbGQpOyAJXAorfQorCisjZGVmaW5lIGZjX3ByaXZhdGVfcnBvcnRfcmRfYXR0cihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3opCQlcCisJZmNfcHJpdmF0ZV9ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIocnBvcnQsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSBzaG93X2ZjX3Jwb3J0XyMjZmllbGQsIE5VTEwpCisKKyNkZWZpbmUgZmNfcHJpdmF0ZV9ycG9ydF9yZF9hdHRyX2Nhc3QoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQlcCisJZmNfcHJpdmF0ZV9ycG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKGNhc3QpKSBcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIocnBvcnQsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSAgc2hvd19mY19ycG9ydF8jI2ZpZWxkLCBOVUxMKQorCisKKyNkZWZpbmUgZmNfcHJpdmF0ZV9ycG9ydF9yZF9lbnVtX2F0dHIodGl0bGUsIG1heGxlbikJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19ycG9ydF8jI3RpdGxlIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fcnBvcnQoY2Rldik7CVwKKwljb25zdCBjaGFyICpuYW1lOwkJCQkJCVwKKwluYW1lID0gZ2V0X2ZjXyMjdGl0bGUjI19uYW1lKHJwb3J0LT50aXRsZSk7CQkJXAorCWlmICghbmFtZSkJCQkJCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgbWF4bGVuLCAiJXNcbiIsIG5hbWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIocnBvcnQsIHRpdGxlLCBTX0lSVUdPLAkJCVwKKwkJCXNob3dfZmNfcnBvcnRfIyN0aXRsZSwgTlVMTCkKKworCisjZGVmaW5lIFNFVFVQX1JQT1JUX0FUVFJJQlVURV9SRChmaWVsZCkJCQkJCVwKKwlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyX3Jwb3J0XyMjZmllbGQ7IFwKKwlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwkJXAorCWktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdLnN0b3JlID0gTlVMTDsJCQlcCisJaS0+cnBvcnRfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdOwkJXAorCWlmIChpLT5mLT5zaG93X3Jwb3J0XyMjZmllbGQpCQkJCQlcCisJCWNvdW50KysKKworI2RlZmluZSBTRVRVUF9QUklWQVRFX1JQT1JUX0FUVFJJQlVURV9SRChmaWVsZCkJCQkJXAorCWktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdID0gY2xhc3NfZGV2aWNlX2F0dHJfcnBvcnRfIyNmaWVsZDsgXAorCWktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CQlcCisJaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF0uc3RvcmUgPSBOVUxMOwkJCVwKKwlpLT5ycG9ydF9hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF07CQlcCisJY291bnQrKworCisjZGVmaW5lIFNFVFVQX1JQT1JUX0FUVFJJQlVURV9SVyhmaWVsZCkJCQkJCVwKKwlpLT5wcml2YXRlX3Jwb3J0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyX3Jwb3J0XyMjZmllbGQ7IFwKKwlpZiAoIWktPmYtPnNldF9ycG9ydF8jI2ZpZWxkKSB7CQkJCQlcCisJCWktPnByaXZhdGVfcnBvcnRfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CVwKKwkJaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF0uc3RvcmUgPSBOVUxMOwkJXAorCX0JCQkJCQkJCVwKKwlpLT5ycG9ydF9hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9ycG9ydF9hdHRyc1tjb3VudF07CQlcCisJaWYgKGktPmYtPnNob3dfcnBvcnRfIyNmaWVsZCkJCQkJCVwKKwkJY291bnQrKworCisKKy8qIFRoZSBGQyBUcmFuc3BvcnQgUmVtb3RlIFBvcnQgQXR0cmlidXRlczogKi8KKworLyogRml4ZWQgUmVtb3RlIFBvcnQgQXR0cmlidXRlcyAqLworCitmY19wcml2YXRlX3Jwb3J0X3JkX2F0dHIobWF4ZnJhbWVfc2l6ZSwgIiV1IGJ5dGVzXG4iLCAyMCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX3Jwb3J0X3N1cHBvcnRlZF9jbGFzc2VzIChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRyYW5zcG9ydF9jbGFzc190b19ycG9ydChjZGV2KTsKKwlpZiAocnBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzID09IEZDX0NPU19VTlNQRUNJRklFRCkKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICJ1bnNwZWNpZmllZFxuIik7CisJcmV0dXJuIGdldF9mY19jb3NfbmFtZXMocnBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzLCBidWYpOworfQorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKHJwb3J0LCBzdXBwb3J0ZWRfY2xhc3NlcywgU19JUlVHTywKKwkJc2hvd19mY19ycG9ydF9zdXBwb3J0ZWRfY2xhc3NlcywgTlVMTCk7CisKKy8qIER5bmFtaWMgUmVtb3RlIFBvcnQgQXR0cmlidXRlcyAqLworCitmY19ycG9ydF9yd19hdHRyKGRldl9sb3NzX3RtbywgIiVkXG4iLCAyMCk7CisKKworLyogUHJpdmF0ZSBSZW1vdGUgUG9ydCBBdHRyaWJ1dGVzICovCisKK2ZjX3ByaXZhdGVfcnBvcnRfcmRfYXR0cl9jYXN0KG5vZGVfbmFtZSwgIjB4JWxseFxuIiwgMjAsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CitmY19wcml2YXRlX3Jwb3J0X3JkX2F0dHJfY2FzdChwb3J0X25hbWUsICIweCVsbHhcbiIsIDIwLCB1bnNpZ25lZCBsb25nIGxvbmcpOworZmNfcHJpdmF0ZV9ycG9ydF9yZF9hdHRyKHBvcnRfaWQsICIweCUwNnhcbiIsIDIwKTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfZmNfcnBvcnRfcm9sZXMgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Jwb3J0KGNkZXYpOworCisJLyogaWRlbnRpZnkgYW55IHJvbGVzIHRoYXQgYXJlIHBvcnRfaWQgc3BlY2lmaWMgKi8KKwlpZiAoKHJwb3J0LT5wb3J0X2lkICE9IC0xKSAmJgorCSAgICAocnBvcnQtPnBvcnRfaWQgJiBGQ19XRUxMS05PV05fUE9SVElEX01BU0spID09CisJCQkJCUZDX1dFTExLTk9XTl9QT1JUSURfTUFTSykgeworCQlzd2l0Y2ggKHJwb3J0LT5wb3J0X2lkICYgRkNfV0VMTEtOT1dOX1JPTEVfTUFTSykgeworCQljYXNlIEZDX0ZQT1JUX1BPUlRJRDoKKwkJCXJldHVybiBzbnByaW50ZihidWYsIDMwLCAiRmFicmljIFBvcnRcbiIpOworCQljYXNlIEZDX0ZBQkNUTFJfUE9SVElEOgorCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMzAsICJGYWJyaWMgQ29udHJvbGxlclxuIik7CisJCWNhc2UgRkNfRElSU1JWUl9QT1JUSUQ6CisJCQlyZXR1cm4gc25wcmludGYoYnVmLCAzMCwgIkRpcmVjdG9yeSBTZXJ2ZXJcbiIpOworCQljYXNlIEZDX1RJTUVTUlZSX1BPUlRJRDoKKwkJCXJldHVybiBzbnByaW50ZihidWYsIDMwLCAiVGltZSBTZXJ2ZXJcbiIpOworCQljYXNlIEZDX01HTVRTUlZSX1BPUlRJRDoKKwkJCXJldHVybiBzbnByaW50ZihidWYsIDMwLCAiTWFuYWdlbWVudCBTZXJ2ZXJcbiIpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMzAsICJVbmtub3duIEZhYnJpYyBFbnRpdHlcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJwb3J0LT5yb2xlcyA9PSBGQ19SUE9SVF9ST0xFX1VOS05PV04pCisJCQlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgInVua25vd25cbiIpOworCQlyZXR1cm4gZ2V0X2ZjX3JlbW90ZV9wb3J0X3JvbGVzX25hbWVzKHJwb3J0LT5yb2xlcywgYnVmKTsKKwl9Cit9CitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIocnBvcnQsIHJvbGVzLCBTX0lSVUdPLAorCQlzaG93X2ZjX3Jwb3J0X3JvbGVzLCBOVUxMKTsKKworZmNfcHJpdmF0ZV9ycG9ydF9yZF9lbnVtX2F0dHIocG9ydF9zdGF0ZSwgRkNfUE9SVFNUQVRFX01BWF9OQU1FTEVOKTsKK2ZjX3ByaXZhdGVfcnBvcnRfcmRfYXR0cihzY3NpX3RhcmdldF9pZCwgIiVkXG4iLCAyMCk7CisKKworCisvKgorICogRkMgU0NTSSBUYXJnZXQgQXR0cmlidXRlIE1hbmFnZW1lbnQKKyAqLworCisvKgorICogTm90ZTogaW4gdGhlIHRhcmdldCBzaG93IGZ1bmN0aW9uIHdlIHJlY29nbml6ZSB3aGVuIHRoZSByZW1vdGUKKyAqICBwb3J0IGlzIGluIHRoZSBoZWlyYXJjaHkgYW5kIGRvIG5vdCBhbGxvdyB0aGUgZHJpdmVyIHRvIGdldAorICogIGludm9sdmVkIGluIHN5c2ZzIGZ1bmN0aW9ucy4gVGhlIGRyaXZlciBvbmx5IGdldHMgaW52b2x2ZWQgaWYKKyAqICBpdCdzIHRoZSAib2xkIiBzdHlsZSB0aGF0IGRvZXNuJ3QgdXNlIHJwb3J0cy4KKyAqLworI2RlZmluZSBmY19zdGFyZ2V0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19zdGFyZ2V0XyMjZmllbGQgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsJXAorCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsJXAorCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHN0YXJnZXQpOwkJXAorCWlmIChycG9ydCkJCQkJCQkJXAorCQlmY19zdGFyZ2V0XyMjZmllbGQoc3RhcmdldCkgPSBycG9ydC0+ZmllbGQ7CQlcCisJZWxzZSBpZiAoaS0+Zi0+Z2V0X3N0YXJnZXRfIyNmaWVsZCkJCQkJXAorCQlpLT5mLT5nZXRfc3RhcmdldF8jI2ZpZWxkKHN0YXJnZXQpOwkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBzeiwgZm9ybWF0X3N0cmluZywgCQkJXAorCQljYXN0IGZjX3N0YXJnZXRfIyNmaWVsZChzdGFyZ2V0KSk7IAkJCVwKK30KKworI2RlZmluZSBmY19zdGFyZ2V0X3JkX2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6KQkJCVwKKwlmY19zdGFyZ2V0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCApCQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoc3RhcmdldCwgZmllbGQsIFNfSVJVR08sCQkJXAorCQkJIHNob3dfZmNfc3RhcmdldF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIGZjX3N0YXJnZXRfcmRfYXR0cl9jYXN0KGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgY2FzdCkJCVwKKwlmY19zdGFyZ2V0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCAoY2FzdCkpCVwKK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihzdGFyZ2V0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgIHNob3dfZmNfc3RhcmdldF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIFNFVFVQX1NUQVJHRVRfQVRUUklCVVRFX1JEKGZpZWxkKQkJCQlcCisJaS0+cHJpdmF0ZV9zdGFyZ2V0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyX3N0YXJnZXRfIyNmaWVsZDsgXAorCWktPnByaXZhdGVfc3RhcmdldF9hdHRyc1tjb3VudF0uYXR0ci5tb2RlID0gU19JUlVHTzsJCVwKKwlpLT5wcml2YXRlX3N0YXJnZXRfYXR0cnNbY291bnRdLnN0b3JlID0gTlVMTDsJCQlcCisJaS0+c3RhcmdldF9hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9zdGFyZ2V0X2F0dHJzW2NvdW50XTsJXAorCWlmIChpLT5mLT5zaG93X3N0YXJnZXRfIyNmaWVsZCkJCQkJCVwKKwkJY291bnQrKworCisjZGVmaW5lIFNFVFVQX1NUQVJHRVRfQVRUUklCVVRFX1JXKGZpZWxkKQkJCQlcCisJaS0+cHJpdmF0ZV9zdGFyZ2V0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyX3N0YXJnZXRfIyNmaWVsZDsgXAorCWlmICghaS0+Zi0+c2V0X3N0YXJnZXRfIyNmaWVsZCkgewkJCQlcCisJCWktPnByaXZhdGVfc3RhcmdldF9hdHRyc1tjb3VudF0uYXR0ci5tb2RlID0gU19JUlVHTzsJXAorCQlpLT5wcml2YXRlX3N0YXJnZXRfYXR0cnNbY291bnRdLnN0b3JlID0gTlVMTDsJCVwKKwl9CQkJCQkJCQlcCisJaS0+c3RhcmdldF9hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9zdGFyZ2V0X2F0dHJzW2NvdW50XTsJXAorCWlmIChpLT5mLT5zaG93X3N0YXJnZXRfIyNmaWVsZCkJCQkJCVwKKwkJY291bnQrKworCisvKiBUaGUgRkMgVHJhbnNwb3J0IFNDU0kgVGFyZ2V0IEF0dHJpYnV0ZXM6ICovCitmY19zdGFyZ2V0X3JkX2F0dHJfY2FzdChub2RlX25hbWUsICIweCVsbHhcbiIsIDIwLCB1bnNpZ25lZCBsb25nIGxvbmcpOworZmNfc3RhcmdldF9yZF9hdHRyX2Nhc3QocG9ydF9uYW1lLCAiMHglbGx4XG4iLCAyMCwgdW5zaWduZWQgbG9uZyBsb25nKTsKK2ZjX3N0YXJnZXRfcmRfYXR0cihwb3J0X2lkLCAiMHglMDZ4XG4iLCAyMCk7CisKKworLyoKKyAqIEhvc3QgQXR0cmlidXRlIE1hbmFnZW1lbnQKKyAqLworCisjZGVmaW5lIGZjX2hvc3Rfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIGNhc3QpCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19ob3N0XyMjZmllbGQgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CVwKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwlpZiAoaS0+Zi0+Z2V0X2hvc3RfIyNmaWVsZCkJCQkJCVwKKwkJaS0+Zi0+Z2V0X2hvc3RfIyNmaWVsZChzaG9zdCk7CQkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBzeiwgZm9ybWF0X3N0cmluZywgY2FzdCBmY19ob3N0XyMjZmllbGQoc2hvc3QpKTsgXAorfQorCisjZGVmaW5lIGZjX2hvc3Rfc3RvcmVfZnVuY3Rpb24oZmllbGQpCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc3RvcmVfZmNfaG9zdF8jI2ZpZWxkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwJXAorCQkJICAgc2l6ZV90IGNvdW50KQkJCQlcCit7CQkJCQkJCQkJXAorCWludCB2YWw7CQkJCQkJCVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsJXAorCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsJXAorCQkJCQkJCQkJXAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CQkJCVwKKwlpLT5mLT5zZXRfaG9zdF8jI2ZpZWxkKHNob3N0LCB2YWwpOwkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CisKKyNkZWZpbmUgZmNfaG9zdF9yZF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeikJCQlcCisJZmNfaG9zdF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSBzaG93X2ZjX2hvc3RfIyNmaWVsZCwgTlVMTCkKKworI2RlZmluZSBmY19ob3N0X3JkX2F0dHJfY2FzdChmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIGNhc3QpCQlcCisJZmNfaG9zdF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKGNhc3QpKQkJXAorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIGZpZWxkLCBTX0lSVUdPLAkJCVwKKwkJCSAgc2hvd19mY19ob3N0XyMjZmllbGQsIE5VTEwpCisKKyNkZWZpbmUgZmNfaG9zdF9yd19hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeikJCQlcCisJZmNfaG9zdF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQkJXAorCWZjX2hvc3Rfc3RvcmVfZnVuY3Rpb24oZmllbGQpCQkJCQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgZmllbGQsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQkJc2hvd19mY19ob3N0XyMjZmllbGQsCQkJCVwKKwkJCXN0b3JlX2ZjX2hvc3RfIyNmaWVsZCkKKworI2RlZmluZSBmY19ob3N0X3JkX2VudW1fYXR0cih0aXRsZSwgbWF4bGVuKQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19mY19ob3N0XyMjdGl0bGUgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CVwKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CVwKKwljb25zdCBjaGFyICpuYW1lOwkJCQkJCVwKKwlpZiAoaS0+Zi0+Z2V0X2hvc3RfIyN0aXRsZSkJCQkJCVwKKwkJaS0+Zi0+Z2V0X2hvc3RfIyN0aXRsZShzaG9zdCk7CQkJCVwKKwluYW1lID0gZ2V0X2ZjXyMjdGl0bGUjI19uYW1lKGZjX2hvc3RfIyN0aXRsZShzaG9zdCkpOwkJXAorCWlmICghbmFtZSkJCQkJCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgbWF4bGVuLCAiJXNcbiIsIG5hbWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgdGl0bGUsIFNfSVJVR08sIHNob3dfZmNfaG9zdF8jI3RpdGxlLCBOVUxMKQorCisjZGVmaW5lIFNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKGZpZWxkKQkJCQkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9ob3N0XyMjZmllbGQ7CVwKKwlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CQlcCisJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQkJXAorCWktPmhvc3RfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF07CQlcCisJaWYgKGktPmYtPnNob3dfaG9zdF8jI2ZpZWxkKQkJCQkJXAorCQljb3VudCsrCisKKyNkZWZpbmUgU0VUVVBfSE9TVF9BVFRSSUJVVEVfUlcoZmllbGQpCQkJCQlcCisJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyX2hvc3RfIyNmaWVsZDsJXAorCWlmICghaS0+Zi0+c2V0X2hvc3RfIyNmaWVsZCkgewkJCQkJXAorCQlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CVwKKwkJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQlcCisJfQkJCQkJCQkJXAorCWktPmhvc3RfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF07CQlcCisJaWYgKGktPmYtPnNob3dfaG9zdF8jI2ZpZWxkKQkJCQkJXAorCQljb3VudCsrCisKKworI2RlZmluZSBmY19wcml2YXRlX2hvc3Rfc2hvd19mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZywgc3osIGNhc3QpCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X2ZjX2hvc3RfIyNmaWVsZCAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsJXAorCXJldHVybiBzbnByaW50ZihidWYsIHN6LCBmb3JtYXRfc3RyaW5nLCBjYXN0IGZjX2hvc3RfIyNmaWVsZChzaG9zdCkpOyBcCit9CisKKyNkZWZpbmUgZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6KQkJXAorCWZjX3ByaXZhdGVfaG9zdF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nLCBzeiwgKQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgZmllbGQsIFNfSVJVR08sCQkJXAorCQkJIHNob3dfZmNfaG9zdF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIGZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyX2Nhc3QoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCBjYXN0KQlcCisJZmNfcHJpdmF0ZV9ob3N0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcsIHN6LCAoY2FzdCkpIFwKK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCBmaWVsZCwgU19JUlVHTywJCQlcCisJCQkgIHNob3dfZmNfaG9zdF8jI2ZpZWxkLCBOVUxMKQorCisjZGVmaW5lIFNFVFVQX1BSSVZBVEVfSE9TVF9BVFRSSUJVVEVfUkQoZmllbGQpCQkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9ob3N0XyMjZmllbGQ7CVwKKwlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdLmF0dHIubW9kZSA9IFNfSVJVR087CQlcCisJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQkJXAorCWktPmhvc3RfYXR0cnNbY291bnRdID0gJmktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF07CQlcCisJY291bnQrKworCisjZGVmaW5lIFNFVFVQX1BSSVZBVEVfSE9TVF9BVFRSSUJVVEVfUlcoZmllbGQpCQkJXAorCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0gPSBjbGFzc19kZXZpY2VfYXR0cl9ob3N0XyMjZmllbGQ7CVwKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9ICZpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdOwkJXAorCWNvdW50KysKKworCisvKiBGaXhlZCBIb3N0IEF0dHJpYnV0ZXMgKi8KKworc3RhdGljIHNzaXplX3QKK3Nob3dfZmNfaG9zdF9zdXBwb3J0ZWRfY2xhc3NlcyAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCisJaWYgKGZjX2hvc3Rfc3VwcG9ydGVkX2NsYXNzZXMoc2hvc3QpID09IEZDX0NPU19VTlNQRUNJRklFRCkKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICJ1bnNwZWNpZmllZFxuIik7CisKKwlyZXR1cm4gZ2V0X2ZjX2Nvc19uYW1lcyhmY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzKHNob3N0KSwgYnVmKTsKK30KK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCBzdXBwb3J0ZWRfY2xhc3NlcywgU19JUlVHTywKKwkJc2hvd19mY19ob3N0X3N1cHBvcnRlZF9jbGFzc2VzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cyAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCXJldHVybiAoc3NpemVfdClzaG93X2ZjX2ZjNHMoYnVmLCBmY19ob3N0X3N1cHBvcnRlZF9mYzRzKHNob3N0KSk7Cit9CitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgc3VwcG9ydGVkX2ZjNHMsIFNfSVJVR08sCisJCXNob3dfZmNfaG9zdF9zdXBwb3J0ZWRfZmM0cywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyAoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCisJaWYgKGZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhzaG9zdCkgPT0gRkNfUE9SVFNQRUVEX1VOS05PV04pCisJCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAidW5rbm93blxuIik7CisKKwlyZXR1cm4gZ2V0X2ZjX3BvcnRfc3BlZWRfbmFtZXMoZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKHNob3N0KSwgYnVmKTsKK30KK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCBzdXBwb3J0ZWRfc3BlZWRzLCBTX0lSVUdPLAorCQlzaG93X2ZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcywgTlVMTCk7CisKKworZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHJfY2FzdChub2RlX25hbWUsICIweCVsbHhcbiIsIDIwLCB1bnNpZ25lZCBsb25nIGxvbmcpOworZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHJfY2FzdChwb3J0X25hbWUsICIweCVsbHhcbiIsIDIwLCB1bnNpZ25lZCBsb25nIGxvbmcpOworZmNfcHJpdmF0ZV9ob3N0X3JkX2F0dHIoc3ltYm9saWNfbmFtZSwgIiVzXG4iLCAoRkNfU1lNQk9MSUNfTkFNRV9TSVpFICsxKSk7CitmY19wcml2YXRlX2hvc3RfcmRfYXR0cihtYXhmcmFtZV9zaXplLCAiJXUgYnl0ZXNcbiIsIDIwKTsKK2ZjX3ByaXZhdGVfaG9zdF9yZF9hdHRyKHNlcmlhbF9udW1iZXIsICIlc1xuIiwgKEZDX1NFUklBTF9OVU1CRVJfU0laRSArMSkpOworCisKKy8qIER5bmFtaWMgSG9zdCBBdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX2hvc3RfYWN0aXZlX2ZjNHMgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisKKwlpZiAoaS0+Zi0+Z2V0X2hvc3RfYWN0aXZlX2ZjNHMpCisJCWktPmYtPmdldF9ob3N0X2FjdGl2ZV9mYzRzKHNob3N0KTsKKworCXJldHVybiAoc3NpemVfdClzaG93X2ZjX2ZjNHMoYnVmLCBmY19ob3N0X2FjdGl2ZV9mYzRzKHNob3N0KSk7Cit9CitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgYWN0aXZlX2ZjNHMsIFNfSVJVR08sCisJCXNob3dfZmNfaG9zdF9hY3RpdmVfZmM0cywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX2hvc3Rfc3BlZWQgKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisKKwlpZiAoaS0+Zi0+Z2V0X2hvc3Rfc3BlZWQpCisJCWktPmYtPmdldF9ob3N0X3NwZWVkKHNob3N0KTsKKworCWlmIChmY19ob3N0X3NwZWVkKHNob3N0KSA9PSBGQ19QT1JUU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICJ1bmtub3duXG4iKTsKKworCXJldHVybiBnZXRfZmNfcG9ydF9zcGVlZF9uYW1lcyhmY19ob3N0X3NwZWVkKHNob3N0KSwgYnVmKTsKK30KK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCBzcGVlZCwgU19JUlVHTywKKwkJc2hvd19mY19ob3N0X3NwZWVkLCBOVUxMKTsKKworCitmY19ob3N0X3JkX2F0dHIocG9ydF9pZCwgIjB4JTA2eFxuIiwgMjApOworZmNfaG9zdF9yZF9lbnVtX2F0dHIocG9ydF90eXBlLCBGQ19QT1JUVFlQRV9NQVhfTkFNRUxFTik7CitmY19ob3N0X3JkX2VudW1fYXR0cihwb3J0X3N0YXRlLCBGQ19QT1JUU1RBVEVfTUFYX05BTUVMRU4pOworZmNfaG9zdF9yZF9hdHRyX2Nhc3QoZmFicmljX25hbWUsICIweCVsbHhcbiIsIDIwLCB1bnNpZ25lZCBsb25nIGxvbmcpOworCisKKy8qIFByaXZhdGUgSG9zdCBBdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2ZjX3ByaXZhdGVfaG9zdF90Z3RpZF9iaW5kX3R5cGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwluYW1lID0gZ2V0X2ZjX3RndGlkX2JpbmRfdHlwZV9uYW1lKGZjX2hvc3RfdGd0aWRfYmluZF90eXBlKHNob3N0KSk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBGQ19CSU5EVFlQRV9NQVhfTkFNRUxFTiwgIiVzXG4iLCBuYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX2ZjX3ByaXZhdGVfaG9zdF90Z3RpZF9iaW5kX3R5cGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0LCAqbmV4dF9ycG9ydDsKKyAJZW51bSBmY190Z3RpZF9iaW5kaW5nX3R5cGUgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZ2V0X2ZjX3RndGlkX2JpbmRfdHlwZV9tYXRjaChidWYsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGlmIGNoYW5naW5nIGJpbmQgdHlwZSwgcHVyZ2UgYWxsIHVudXNlZCBjb25zaXN0ZW50IGJpbmRpbmdzICovCisJaWYgKHZhbCAhPSBmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnBvcnQsIG5leHRfcnBvcnQsCisJCQkJJmZjX2hvc3RfcnBvcnRfYmluZGluZ3Moc2hvc3QpLCBwZWVycykKKwkJCWZjX3Jwb3J0X3Rlcm1pbmF0ZShycG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKworCWZjX2hvc3RfdGd0aWRfYmluZF90eXBlKHNob3N0KSA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBGQ19DTEFTU19ERVZJQ0VfQVRUUihob3N0LCB0Z3RpZF9iaW5kX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19mY19wcml2YXRlX2hvc3RfdGd0aWRfYmluZF90eXBlLAorCQkJc3RvcmVfZmNfcHJpdmF0ZV9ob3N0X3RndGlkX2JpbmRfdHlwZSk7CisKKy8qCisgKiBIb3N0IFN0YXRpc3RpY3MgTWFuYWdlbWVudAorICovCisKKy8qIFNob3cgYSBnaXZlbiBhbiBhdHRyaWJ1dGUgaW4gdGhlIHN0YXRpc3RpY3MgZ3JvdXAgKi8KK3N0YXRpYyBzc2l6ZV90CitmY19zdGF0X3Nob3coY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqc3RhdHM7CisJc3NpemVfdCByZXQgPSAtRU5PRU5UOworCisJaWYgKG9mZnNldCA+IHNpemVvZihzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzKSB8fAorCSAgICBvZmZzZXQgJSBzaXplb2YodTY0KSAhPSAwKQorCQlXQVJOX09OKDEpOworCisJaWYgKGktPmYtPmdldF9mY19ob3N0X3N0YXRzKSB7CisJCXN0YXRzID0gKGktPmYtPmdldF9mY19ob3N0X3N0YXRzKShzaG9zdCk7CisJCWlmIChzdGF0cykKKwkJCXJldCA9IHNucHJpbnRmKGJ1ZiwgMjAsICIweCVsbHhcbiIsCisJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSoodTY0ICopKCgodTggKikgc3RhdHMpICsgb2Zmc2V0KSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworLyogZ2VuZXJhdGUgYSByZWFkLW9ubHkgc3RhdGlzdGljcyBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgZmNfaG9zdF9zdGF0aXN0aWMobmFtZSkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2Zjc3RhdF8jI25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikgCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGZjX3N0YXRfc2hvdyhjZCwgYnVmLCAJCQkJCVwKKwkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzLCBuYW1lKSk7CVwKK30JCQkJCQkJCQlcCitzdGF0aWMgRkNfQ0xBU1NfREVWSUNFX0FUVFIoaG9zdCwgbmFtZSwgU19JUlVHTywgc2hvd19mY3N0YXRfIyNuYW1lLCBOVUxMKQorCitmY19ob3N0X3N0YXRpc3RpYyhzZWNvbmRzX3NpbmNlX2xhc3RfcmVzZXQpOworZmNfaG9zdF9zdGF0aXN0aWModHhfZnJhbWVzKTsKK2ZjX2hvc3Rfc3RhdGlzdGljKHR4X3dvcmRzKTsKK2ZjX2hvc3Rfc3RhdGlzdGljKHJ4X2ZyYW1lcyk7CitmY19ob3N0X3N0YXRpc3RpYyhyeF93b3Jkcyk7CitmY19ob3N0X3N0YXRpc3RpYyhsaXBfY291bnQpOworZmNfaG9zdF9zdGF0aXN0aWMobm9zX2NvdW50KTsKK2ZjX2hvc3Rfc3RhdGlzdGljKGVycm9yX2ZyYW1lcyk7CitmY19ob3N0X3N0YXRpc3RpYyhkdW1wZWRfZnJhbWVzKTsKK2ZjX2hvc3Rfc3RhdGlzdGljKGxpbmtfZmFpbHVyZV9jb3VudCk7CitmY19ob3N0X3N0YXRpc3RpYyhsb3NzX29mX3N5bmNfY291bnQpOworZmNfaG9zdF9zdGF0aXN0aWMobG9zc19vZl9zaWduYWxfY291bnQpOworZmNfaG9zdF9zdGF0aXN0aWMocHJpbV9zZXFfcHJvdG9jb2xfZXJyX2NvdW50KTsKK2ZjX2hvc3Rfc3RhdGlzdGljKGludmFsaWRfdHhfd29yZF9jb3VudCk7CitmY19ob3N0X3N0YXRpc3RpYyhpbnZhbGlkX2NyY19jb3VudCk7CitmY19ob3N0X3N0YXRpc3RpYyhmY3BfaW5wdXRfcmVxdWVzdHMpOworZmNfaG9zdF9zdGF0aXN0aWMoZmNwX291dHB1dF9yZXF1ZXN0cyk7CitmY19ob3N0X3N0YXRpc3RpYyhmY3BfY29udHJvbF9yZXF1ZXN0cyk7CitmY19ob3N0X3N0YXRpc3RpYyhmY3BfaW5wdXRfbWVnYWJ5dGVzKTsKK2ZjX2hvc3Rfc3RhdGlzdGljKGZjcF9vdXRwdXRfbWVnYWJ5dGVzKTsKKworc3RhdGljIHNzaXplX3QKK2ZjX3Jlc2V0X3N0YXRpc3RpY3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCS8qIGlnbm9yZSBhbnkgZGF0YSB2YWx1ZSB3cml0dGVuIHRvIHRoZSBhdHRyaWJ1dGUgKi8KKwlpZiAoaS0+Zi0+cmVzZXRfZmNfaG9zdF9zdGF0cykgeworCQlpLT5mLT5yZXNldF9mY19ob3N0X3N0YXRzKHNob3N0KTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorc3RhdGljIEZDX0NMQVNTX0RFVklDRV9BVFRSKGhvc3QsIHJlc2V0X3N0YXRpc3RpY3MsIFNfSVdVU1IsIE5VTEwsCisJCQkJZmNfcmVzZXRfc3RhdGlzdGljcyk7CisKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZjX3N0YXRpc3RpY3NfYXR0cnNbXSA9IHsKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9zZWNvbmRzX3NpbmNlX2xhc3RfcmVzZXQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF90eF9mcmFtZXMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF90eF93b3Jkcy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X3J4X2ZyYW1lcy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X3J4X3dvcmRzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfbGlwX2NvdW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3Rfbm9zX2NvdW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZXJyb3JfZnJhbWVzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZHVtcGVkX2ZyYW1lcy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2xpbmtfZmFpbHVyZV9jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2xvc3Nfb2Zfc3luY19jb3VudC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ob3N0X2xvc3Nfb2Zfc2lnbmFsX2NvdW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfcHJpbV9zZXFfcHJvdG9jb2xfZXJyX2NvdW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfaW52YWxpZF90eF93b3JkX2NvdW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfaW52YWxpZF9jcmNfY291bnQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9mY3BfaW5wdXRfcmVxdWVzdHMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9mY3Bfb3V0cHV0X3JlcXVlc3RzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZmNwX2NvbnRyb2xfcmVxdWVzdHMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9mY3BfaW5wdXRfbWVnYWJ5dGVzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfZmNwX291dHB1dF9tZWdhYnl0ZXMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaG9zdF9yZXNldF9zdGF0aXN0aWNzLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZmNfc3RhdGlzdGljc19ncm91cCA9IHsKKwkubmFtZSA9ICJzdGF0aXN0aWNzIiwKKwkuYXR0cnMgPSBmY19zdGF0aXN0aWNzX2F0dHJzLAorfTsKKworc3RhdGljIGludCBmY19ob3N0X21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGZjX2ludGVybmFsICppOworCisJaWYgKCFzY3NpX2lzX2hvc3RfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmZmNfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJcmV0dXJuICZpLT50Lmhvc3RfYXR0cnMuYWMgPT0gY29udDsKK30KKworc3RhdGljIGludCBmY190YXJnZXRfbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBmY19pbnRlcm5hbCAqaTsKKworCWlmICghc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2LT5wYXJlbnQpOworCWlmICghc2hvc3QtPnRyYW5zcG9ydHQgIHx8IHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X2F0dHJzLmFjLmNsYXNzCisJICAgICE9ICZmY19ob3N0X2NsYXNzLmNsYXNzKQorCQlyZXR1cm4gMDsKKworCWkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisKKwlyZXR1cm4gJmktPnQudGFyZ2V0X2F0dHJzLmFjID09IGNvbnQ7Cit9CisKK3N0YXRpYyB2b2lkIGZjX3Jwb3J0X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gZGV2X3RvX3Jwb3J0KGRldik7CisJcHV0X2RldmljZShkZXYtPnBhcmVudCk7CisJa2ZyZWUocnBvcnQpOworfQorCitpbnQgc2NzaV9pc19mY19ycG9ydChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+cmVsZWFzZSA9PSBmY19ycG9ydF9kZXZfcmVsZWFzZTsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9pc19mY19ycG9ydCk7CisKK3N0YXRpYyBpbnQgZmNfcnBvcnRfbWF0Y2goc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQsCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBmY19pbnRlcm5hbCAqaTsKKworCWlmICghc2NzaV9pc19mY19ycG9ydChkZXYpKQorCQlyZXR1cm4gMDsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KGRldi0+cGFyZW50KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmZmNfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJcmV0dXJuICZpLT5ycG9ydF9hdHRyX2NvbnQuYWMgPT0gY29udDsKK30KKworc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICoKK2ZjX2F0dGFjaF90cmFuc3BvcnQoc3RydWN0IGZjX2Z1bmN0aW9uX3RlbXBsYXRlICpmdCkKK3sKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmNfaW50ZXJuYWwpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpbnQgY291bnQ7CisKKwlpZiAodW5saWtlbHkoIWkpKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChpLCAwLCBzaXplb2Yoc3RydWN0IGZjX2ludGVybmFsKSk7CisKKwlpLT50LnRhcmdldF9hdHRycy5hYy5hdHRycyA9ICZpLT5zdGFyZ2V0X2F0dHJzWzBdOworCWktPnQudGFyZ2V0X2F0dHJzLmFjLmNsYXNzID0gJmZjX3RyYW5zcG9ydF9jbGFzcy5jbGFzczsKKwlpLT50LnRhcmdldF9hdHRycy5hYy5tYXRjaCA9IGZjX3RhcmdldF9tYXRjaDsKKwlpLT50LnRhcmdldF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmY19zdGFyZ2V0X2F0dHJzKTsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZpLT50LnRhcmdldF9hdHRycyk7CisKKwlpLT50Lmhvc3RfYXR0cnMuYWMuYXR0cnMgPSAmaS0+aG9zdF9hdHRyc1swXTsKKwlpLT50Lmhvc3RfYXR0cnMuYWMuY2xhc3MgPSAmZmNfaG9zdF9jbGFzcy5jbGFzczsKKwlpLT50Lmhvc3RfYXR0cnMuYWMubWF0Y2ggPSBmY19ob3N0X21hdGNoOworCWktPnQuaG9zdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmY19ob3N0X2F0dHJzKTsKKwlpZiAoZnQtPmdldF9mY19ob3N0X3N0YXRzKQorCQlpLT50Lmhvc3RfYXR0cnMuc3RhdGlzdGljcyA9ICZmY19zdGF0aXN0aWNzX2dyb3VwOworCXRyYW5zcG9ydF9jb250YWluZXJfcmVnaXN0ZXIoJmktPnQuaG9zdF9hdHRycyk7CisKKwlpLT5ycG9ydF9hdHRyX2NvbnQuYWMuYXR0cnMgPSAmaS0+cnBvcnRfYXR0cnNbMF07CisJaS0+cnBvcnRfYXR0cl9jb250LmFjLmNsYXNzID0gJmZjX3Jwb3J0X2NsYXNzLmNsYXNzOworCWktPnJwb3J0X2F0dHJfY29udC5hYy5tYXRjaCA9IGZjX3Jwb3J0X21hdGNoOworCXRyYW5zcG9ydF9jb250YWluZXJfcmVnaXN0ZXIoJmktPnJwb3J0X2F0dHJfY29udCk7CisKKwlpLT5mID0gZnQ7CisKKwkvKiBUcmFuc3BvcnQgdXNlcyB0aGUgc2hvc3Qgd29ya3EgZm9yIHNjc2kgc2Nhbm5pbmcgKi8KKwlpLT50LmNyZWF0ZV93b3JrX3F1ZXVlID0gMTsKKwkKKwkvKgorCSAqIFNldHVwIFNDU0kgVGFyZ2V0IEF0dHJpYnV0ZXMuCisJICovCisJY291bnQgPSAwOworCVNFVFVQX1NUQVJHRVRfQVRUUklCVVRFX1JEKG5vZGVfbmFtZSk7CisJU0VUVVBfU1RBUkdFVF9BVFRSSUJVVEVfUkQocG9ydF9uYW1lKTsKKwlTRVRVUF9TVEFSR0VUX0FUVFJJQlVURV9SRChwb3J0X2lkKTsKKworCUJVR19PTihjb3VudCA+IEZDX1NUQVJHRVRfTlVNX0FUVFJTKTsKKworCWktPnN0YXJnZXRfYXR0cnNbY291bnRdID0gTlVMTDsKKworCisJLyoKKwkgKiBTZXR1cCBTQ1NJIEhvc3QgQXR0cmlidXRlcy4KKwkgKi8KKwljb3VudD0wOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKG5vZGVfbmFtZSk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQocG9ydF9uYW1lKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChzdXBwb3J0ZWRfY2xhc3Nlcyk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQoc3VwcG9ydGVkX2ZjNHMpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHN5bWJvbGljX25hbWUpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHN1cHBvcnRlZF9zcGVlZHMpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKG1heGZyYW1lX3NpemUpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKHNlcmlhbF9udW1iZXIpOworCisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQocG9ydF9pZCk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQocG9ydF90eXBlKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChwb3J0X3N0YXRlKTsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURV9SRChhY3RpdmVfZmM0cyk7CisJU0VUVVBfSE9TVF9BVFRSSUJVVEVfUkQoc3BlZWQpOworCVNFVFVQX0hPU1RfQVRUUklCVVRFX1JEKGZhYnJpY19uYW1lKTsKKworCS8qIFRyYW5zcG9ydC1tYW5hZ2VkIGF0dHJpYnV0ZXMgKi8KKwlTRVRVUF9QUklWQVRFX0hPU1RfQVRUUklCVVRFX1JXKHRndGlkX2JpbmRfdHlwZSk7CisKKwlCVUdfT04oY291bnQgPiBGQ19IT1NUX05VTV9BVFRSUyk7CisKKwlpLT5ob3N0X2F0dHJzW2NvdW50XSA9IE5VTEw7CisKKwkvKgorCSAqIFNldHVwIFJlbW90ZSBQb3J0IEF0dHJpYnV0ZXMuCisJICovCisJY291bnQ9MDsKKwlTRVRVUF9SUE9SVF9BVFRSSUJVVEVfUkQobWF4ZnJhbWVfc2l6ZSk7CisJU0VUVVBfUlBPUlRfQVRUUklCVVRFX1JEKHN1cHBvcnRlZF9jbGFzc2VzKTsKKwlTRVRVUF9SUE9SVF9BVFRSSUJVVEVfUlcoZGV2X2xvc3NfdG1vKTsKKwlTRVRVUF9QUklWQVRFX1JQT1JUX0FUVFJJQlVURV9SRChub2RlX25hbWUpOworCVNFVFVQX1BSSVZBVEVfUlBPUlRfQVRUUklCVVRFX1JEKHBvcnRfbmFtZSk7CisJU0VUVVBfUFJJVkFURV9SUE9SVF9BVFRSSUJVVEVfUkQocG9ydF9pZCk7CisJU0VUVVBfUFJJVkFURV9SUE9SVF9BVFRSSUJVVEVfUkQocm9sZXMpOworCVNFVFVQX1BSSVZBVEVfUlBPUlRfQVRUUklCVVRFX1JEKHBvcnRfc3RhdGUpOworCVNFVFVQX1BSSVZBVEVfUlBPUlRfQVRUUklCVVRFX1JEKHNjc2lfdGFyZ2V0X2lkKTsKKworCUJVR19PTihjb3VudCA+IEZDX1JQT1JUX05VTV9BVFRSUyk7CisKKwlpLT5ycG9ydF9hdHRyc1tjb3VudF0gPSBOVUxMOworCisJcmV0dXJuICZpLT50OworfQorRVhQT1JUX1NZTUJPTChmY19hdHRhY2hfdHJhbnNwb3J0KTsKKwordm9pZCBmY19yZWxlYXNlX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnQpCit7CisJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwodCk7CisKKwl0cmFuc3BvcnRfY29udGFpbmVyX3VucmVnaXN0ZXIoJmktPnQudGFyZ2V0X2F0dHJzKTsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3VucmVnaXN0ZXIoJmktPnQuaG9zdF9hdHRycyk7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl91bnJlZ2lzdGVyKCZpLT5ycG9ydF9hdHRyX2NvbnQpOworCisJa2ZyZWUoaSk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbGVhc2VfdHJhbnNwb3J0KTsKKworCisvKioKKyAqIGZjX3JlbW92ZV9ob3N0IC0gY2FsbGVkIHRvIHRlcm1pbmF0ZSBhbnkgZmNfdHJhbnNwb3J0LXJlbGF0ZWQgZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgICAgZm9yIGEgc2NzaSBob3N0LgorICogQHJwb3J0OglyZW1vdGUgcG9ydCB0byBiZSB1bmJsb2NrZWQuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBwcmVjZWVkaW5nIHRoZQorICogYSBkcml2ZXIncyBjYWxsIHRvIHNjc2lfcmVtb3ZlX2hvc3QoKS4KKyAqCisgKiBXQVJOSU5HOiBBIGRyaXZlciB1dGlsaXppbmcgdGhlIGZjX3RyYW5zcG9ydCwgd2hpY2ggZmFpbHMgdG8gY2FsbAorICogICB0aGlzIHJvdXRpbmUgcHJpb3IgdG8gc2NzaV9yZW1vdGVfaG9zdCgpLCB3aWxsIGxlYXZlIGRhbmdsaW5nCisgKiAgIG9iamVjdHMgaW4gL3N5cy9jbGFzcy9mY19yZW1vdGVfcG9ydHMuIEFjY2VzcyB0byBhbnkgb2YgdGhlc2UKKyAqICAgb2JqZWN0cyBjYW4gcmVzdWx0IGluIGEgc3lzdGVtIGNyYXNoICEhIQorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKiovCit2b2lkCitmY19yZW1vdmVfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0LCAqbmV4dF9ycG9ydDsKKworCS8qIFJlbW92ZSBhbnkgcmVtb3RlIHBvcnRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwb3J0LCBuZXh0X3Jwb3J0LAorCQkJJmZjX2hvc3RfcnBvcnRzKHNob3N0KSwgcGVlcnMpCisJCWZjX3Jwb3J0X3Rlcm1pbmF0ZShycG9ydCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJwb3J0LCBuZXh0X3Jwb3J0LAorCQkJJmZjX2hvc3RfcnBvcnRfYmluZGluZ3Moc2hvc3QpLCBwZWVycykKKwkJZmNfcnBvcnRfdGVybWluYXRlKHJwb3J0KTsKK30KK0VYUE9SVF9TWU1CT0woZmNfcmVtb3ZlX2hvc3QpOworCisvKioKKyAqIGZjX3Jwb3J0X2NyZWF0ZSAtIGFsbG9jYXRlcyBhbmQgY3JlYXRlcyBhIHJlbW90ZSBGQyBwb3J0LgorICogQHNob3N0OglzY3NpIGhvc3QgdGhlIHJlbW90ZSBwb3J0IGlzIGNvbm5lY3RlZCB0by4KKyAqIEBjaGFubmVsOglDaGFubmVsIG9uIHNob3N0IHBvcnQgY29ubmVjdGVkIHRvLgorICogQGlkczoJVGhlIHdvcmxkIHdpZGUgbmFtZXMsIGZjIGFkZHJlc3MsIGFuZCBGQzQgcG9ydAorICoJCXJvbGVzIGZvciB0aGUgcmVtb3RlIHBvcnQuCisgKgorICogQWxsb2NhdGVzIGFuZCBjcmVhdGVzIHRoZSByZW1vdGVyIHBvcnQgc3RydWN0dXJlLCBpbmNsdWRpbmcgdGhlCisgKiBjbGFzcyBhbmQgc3lzZnMgY3JlYXRpb24uCisgKgorICogTm90ZXM6CisgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KKyAqKi8KK3N0cnVjdCBmY19ycG9ydCAqCitmY19ycG9ydF9jcmVhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsLAorCXN0cnVjdCBmY19ycG9ydF9pZGVudGlmaWVycyAgKmlkcykKK3sKKwlzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqZmNfaG9zdCA9CisJCQkoc3RydWN0IGZjX2hvc3RfYXR0cnMgKilzaG9zdC0+c2hvc3RfZGF0YTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmZjaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnJvcjsKKwlzaXplX3Qgc2l6ZTsKKworCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBmY19ycG9ydCkgKyBmY2ktPmYtPmRkX2ZjcnBvcnRfc2l6ZSk7CisJcnBvcnQgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghcnBvcnQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChycG9ydCwgMCwgc2l6ZSk7CisKKwlycG9ydC0+bWF4ZnJhbWVfc2l6ZSA9IC0xOworCXJwb3J0LT5zdXBwb3J0ZWRfY2xhc3NlcyA9IEZDX0NPU19VTlNQRUNJRklFRDsKKwlycG9ydC0+ZGV2X2xvc3NfdG1vID0gZmNfZGV2X2xvc3NfdG1vOworCW1lbWNweSgmcnBvcnQtPm5vZGVfbmFtZSwgJmlkcy0+bm9kZV9uYW1lLCBzaXplb2YocnBvcnQtPm5vZGVfbmFtZSkpOworCW1lbWNweSgmcnBvcnQtPnBvcnRfbmFtZSwgJmlkcy0+cG9ydF9uYW1lLCBzaXplb2YocnBvcnQtPnBvcnRfbmFtZSkpOworCXJwb3J0LT5wb3J0X2lkID0gaWRzLT5wb3J0X2lkOworCXJwb3J0LT5yb2xlcyA9IGlkcy0+cm9sZXM7CisJcnBvcnQtPnBvcnRfc3RhdGUgPSBGQ19QT1JUU1RBVEVfT05MSU5FOworCWlmIChmY2ktPmYtPmRkX2ZjcnBvcnRfc2l6ZSkKKwkJcnBvcnQtPmRkX2RhdGEgPSAmcnBvcnRbMV07CisJcnBvcnQtPmNoYW5uZWwgPSBjaGFubmVsOworCisJSU5JVF9XT1JLKCZycG9ydC0+ZGV2X2xvc3Nfd29yaywgZmNfdGltZW91dF9ibG9ja2VkX3Jwb3J0LCBycG9ydCk7CisJSU5JVF9XT1JLKCZycG9ydC0+c2Nhbl93b3JrLCBmY19zY3NpX3NjYW5fcnBvcnQsIHJwb3J0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJwb3J0LT5udW1iZXIgPSBmY19ob3N0LT5uZXh0X3Jwb3J0X251bWJlcisrOworCWlmIChycG9ydC0+cm9sZXMgJiBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQpCisJCXJwb3J0LT5zY3NpX3RhcmdldF9pZCA9IGZjX2hvc3QtPm5leHRfdGFyZ2V0X2lkKys7CisJZWxzZQorCQlycG9ydC0+c2NzaV90YXJnZXRfaWQgPSAtMTsKKwlsaXN0X2FkZF90YWlsKCZycG9ydC0+cGVlcnMsICZmY19ob3N0X3Jwb3J0cyhzaG9zdCkpOworCWdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlkZXYgPSAmcnBvcnQtPmRldjsKKwlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOworCWRldi0+cGFyZW50ID0gZ2V0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CisJZGV2LT5yZWxlYXNlID0gZmNfcnBvcnRfZGV2X3JlbGVhc2U7CisJc3ByaW50ZihkZXYtPmJ1c19pZCwgInJwb3J0LSVkOiVkLSVkIiwKKwkJc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHJwb3J0LT5udW1iZXIpOworCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoZGV2KTsKKworCWVycm9yID0gZGV2aWNlX2FkZChkZXYpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIgIkZDIFJlbW90ZSBQb3J0IGRldmljZV9hZGQgZmFpbGVkXG4iKTsKKwkJZ290byBkZWxldGVfcnBvcnQ7CisJfQorCXRyYW5zcG9ydF9hZGRfZGV2aWNlKGRldik7CisJdHJhbnNwb3J0X2NvbmZpZ3VyZV9kZXZpY2UoZGV2KTsKKworCWlmIChycG9ydC0+cm9sZXMgJiBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQpCisJCS8qIGluaXRpYXRlIGEgc2NhbiBvZiB0aGUgdGFyZ2V0ICovCisJCXNjc2lfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zY2FuX3dvcmspOworCisJcmV0dXJuIHJwb3J0OworCitkZWxldGVfcnBvcnQ6CisJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKGRldik7CisJcHV0X2RldmljZShkZXYtPnBhcmVudCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZycG9ydC0+cGVlcnMpOworCXB1dF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXB1dF9kZXZpY2UoZGV2LT5wYXJlbnQpOworCWtmcmVlKHJwb3J0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBmY19yZW1vdGVfcG9ydF9hZGQgLSBub3RpZmllcyB0aGUgZmMgdHJhbnNwb3J0IG9mIHRoZSBleGlzdGVuY2UKKyAqCQlvZiBhIHJlbW90ZSBGQyBwb3J0LgorICogQHNob3N0OglzY3NpIGhvc3QgdGhlIHJlbW90ZSBwb3J0IGlzIGNvbm5lY3RlZCB0by4KKyAqIEBjaGFubmVsOglDaGFubmVsIG9uIHNob3N0IHBvcnQgY29ubmVjdGVkIHRvLgorICogQGlkczoJVGhlIHdvcmxkIHdpZGUgbmFtZXMsIGZjIGFkZHJlc3MsIGFuZCBGQzQgcG9ydAorICoJCXJvbGVzIGZvciB0aGUgcmVtb3RlIHBvcnQuCisgKgorICogVGhlIExMREQgY2FsbHMgdGhpcyByb3V0aW5lIHRvIG5vdGlmeSB0aGUgdHJhbnNwb3J0IG9mIHRoZSBleGlzdGVuY2UKKyAqIG9mIGEgcmVtb3RlIHBvcnQuIFRoZSBMTEREIHByb3ZpZGVzIHRoZSB1bmlxdWUgaWRlbnRpZmllcnMgKHd3cG4sd3duKQorICogb2YgdGhlIHBvcnQsIGl0J3MgRkMgYWRkcmVzcyAocG9ydF9pZCksIGFuZCB0aGUgRkM0IHJvbGVzIHRoYXQgYXJlCisgKiBhY3RpdmUgZm9yIHRoZSBwb3J0LgorICoKKyAqIEZvciBwb3J0cyB0aGF0IGFyZSBGQ1AgdGFyZ2V0cyAoYWthIHNjc2kgdGFyZ2V0cyksIHRoZSBGQyB0cmFuc3BvcnQKKyAqIG1haW50YWlucyBjb25zaXN0ZW50IHRhcmdldCBpZCBiaW5kaW5ncyBvbiBiZWhhbGYgb2YgdGhlIExMREQuCisgKiBBIGNvbnNpc3RlbnQgdGFyZ2V0IGlkIGJpbmRpbmcgaXMgYW4gYXNzaWdubWVudCBvZiBhIHRhcmdldCBpZCB0bworICogYSByZW1vdGUgcG9ydCBpZGVudGlmaWVyLCB3aGljaCBwZXJzaXN0cyB3aGlsZSB0aGUgc2NzaSBob3N0IGlzCisgKiBhdHRhY2hlZC4gVGhlIHJlbW90ZSBwb3J0IGNhbiBkaXNhcHBlYXIsIHRoZW4gbGF0ZXIgcmVhcHBlYXIsIGFuZAorICogaXQncyB0YXJnZXQgaWQgYXNzaWdubWVudCByZW1haW5zIHRoZSBzYW1lLiBUaGlzIGFsbG93cyBmb3Igc2hpZnRzCisgKiBpbiBGQyBhZGRyZXNzaW5nIChpZiBiaW5kaW5nIGJ5IHd3cG4gb3Igd3dubikgd2l0aCBubyBhcHBhcmVudAorICogY2hhbmdlcyB0byB0aGUgc2NzaSBzdWJzeXN0ZW0gd2hpY2ggaXMgYmFzZWQgb24gc2NzaSBob3N0IG51bWJlciBhbmQKKyAqIHRhcmdldCBpZCB2YWx1ZXMuICBCaW5kaW5ncyBhcmUgb25seSB2YWxpZCBkdXJpbmcgdGhlIGF0dGFjaG1lbnQgb2YKKyAqIHRoZSBzY3NpIGhvc3QuIElmIHRoZSBob3N0IGRldGFjaGVzLCB0aGVuIGxhdGVyIHJlLWF0dGFjaGVzLCB0YXJnZXQKKyAqIGlkIGJpbmRpbmdzIG1heSBjaGFuZ2UuCisgKgorICogVGhpcyByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgYSByZW1vdGUgcG9ydCBzdHJ1Y3R1cmUuCisgKiBUaGUgcm91dGluZSB3aWxsIHNlYXJjaCB0aGUgbGlzdCBvZiByZW1vdGUgcG9ydHMgaXQgbWFpbnRhaW5zCisgKiBpbnRlcm5hbGx5IG9uIGJlaGFsZiBvZiBjb25zaXN0ZW50IHRhcmdldCBpZCBtYXBwaW5ncy4gSWYgZm91bmQsIHRoZQorICogcmVtb3RlIHBvcnQgc3RydWN0dXJlIHdpbGwgYmUgcmV1c2VkLiBPdGhlcndpc2UsIGEgbmV3IHJlbW90ZSBwb3J0CisgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBhbGxvY2F0ZWQuCisgKgorICogV2hlbmV2ZXIgYSByZW1vdGUgcG9ydCBpcyBhbGxvY2F0ZWQsIGEgbmV3IGZjX3JlbW90ZV9wb3J0IGNsYXNzCisgKiBkZXZpY2UgaXMgY3JlYXRlZC4KKyAqCisgKiBTaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKiovCitzdHJ1Y3QgZmNfcnBvcnQgKgorZmNfcmVtb3RlX3BvcnRfYWRkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCwKKwlzdHJ1Y3QgZmNfcnBvcnRfaWRlbnRpZmllcnMgICppZHMpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtYXRjaCA9IDA7CisKKwlpZiAobGlrZWx5KChpZHMtPnJvbGVzICYgRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUKSAmJgorCQkoZmNfaG9zdF90Z3RpZF9iaW5kX3R5cGUoc2hvc3QpICE9IEZDX1RHVElEX0JJTkRfTk9ORSkpKSB7CisKKwkJLyogc2VhcmNoIGZvciBhIG1hdGNoaW5nIGNvbnNpc3RlbnQgYmluZGluZyAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwb3J0LCAmZmNfaG9zdF9ycG9ydF9iaW5kaW5ncyhzaG9zdCksCisJCQkJCXBlZXJzKSB7CisJCQlpZiAocnBvcnQtPmNoYW5uZWwgIT0gY2hhbm5lbCkKKwkJCQljb250aW51ZTsKKworCQkJc3dpdGNoIChmY19ob3N0X3RndGlkX2JpbmRfdHlwZShzaG9zdCkpIHsKKwkJCWNhc2UgRkNfVEdUSURfQklORF9CWV9XV1BOOgorCQkJCWlmIChycG9ydC0+cG9ydF9uYW1lID09IGlkcy0+cG9ydF9uYW1lKQorCQkJCQltYXRjaCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEZDX1RHVElEX0JJTkRfQllfV1dOTjoKKwkJCQlpZiAocnBvcnQtPm5vZGVfbmFtZSA9PSBpZHMtPm5vZGVfbmFtZSkKKwkJCQkJbWF0Y2ggPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBGQ19UR1RJRF9CSU5EX0JZX0lEOgorCQkJCWlmIChycG9ydC0+cG9ydF9pZCA9PSBpZHMtPnBvcnRfaWQpCisJCQkJCW1hdGNoID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkNfVEdUSURfQklORF9OT05FOiAvKiB0byBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChtYXRjaCkgeworCQkJCWxpc3RfbW92ZV90YWlsKCZycG9ydC0+cGVlcnMsCisJCQkJCSZmY19ob3N0X3Jwb3J0cyhzaG9zdCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJaWYgKG1hdGNoKSB7CisJCQltZW1jcHkoJnJwb3J0LT5ub2RlX25hbWUsICZpZHMtPm5vZGVfbmFtZSwKKwkJCQlzaXplb2YocnBvcnQtPm5vZGVfbmFtZSkpOworCQkJbWVtY3B5KCZycG9ydC0+cG9ydF9uYW1lLCAmaWRzLT5wb3J0X25hbWUsCisJCQkJc2l6ZW9mKHJwb3J0LT5wb3J0X25hbWUpKTsKKwkJCXJwb3J0LT5wb3J0X2lkID0gaWRzLT5wb3J0X2lkOworCQkJcnBvcnQtPnJvbGVzID0gaWRzLT5yb2xlczsKKwkJCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX09OTElORTsKKworCQkJaWYgKHJwb3J0LT5yb2xlcyAmIEZDX1JQT1JUX1JPTEVfRkNQX1RBUkdFVCkKKwkJCQkvKiBpbml0aWF0ZSBhIHNjYW4gb2YgdGhlIHRhcmdldCAqLworCQkJCXNjc2lfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zY2FuX3dvcmspOworCisJCQlyZXR1cm4gcnBvcnQ7CisJCX0KKwl9CisKKwkvKiBObyBjb25zaXN0ZW50IGJpbmRpbmcgZm91bmQgLSBjcmVhdGUgbmV3IHJlbW90ZSBwb3J0IGVudHJ5ICovCisJcnBvcnQgPSBmY19ycG9ydF9jcmVhdGUoc2hvc3QsIGNoYW5uZWwsIGlkcyk7CisKKwlyZXR1cm4gcnBvcnQ7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbW90ZV9wb3J0X2FkZCk7CisKKy8qCisgKiBmY19ycG9ydF90Z3RfcmVtb3ZlIC0gUmVtb3ZlcyB0aGUgc2NzaSB0YXJnZXQgb24gdGhlIHJlbW90ZSBwb3J0CisgKiBAcnBvcnQ6CVRoZSByZW1vdGUgcG9ydCB0byBiZSBvcGVyYXRlZCBvbgorICovCitzdGF0aWMgdm9pZAorZmNfcnBvcnRfdGd0X3JlbW92ZShzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOworCisJc2NzaV90YXJnZXRfdW5ibG9jaygmcnBvcnQtPmRldik7CisKKwkvKiBTdG9wIGFueXRoaW5nIG9uIHRoZSB3b3JrcSAqLworCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmcnBvcnQtPmRldl9sb3NzX3dvcmspKQorCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXNjc2lfZmx1c2hfd29yayhzaG9zdCk7CisKKwlzY3NpX3JlbW92ZV90YXJnZXQoJnJwb3J0LT5kZXYpOworfQorCisvKgorICogZmNfcnBvcnRfdGVybWluYXRlIC0gdGhpcyByb3V0aW5lIHRlYXJzIGRvd24gYW5kIGRlYWxsb2NhdGVzIGEgcmVtb3RlIHBvcnQuCisgKiBAcnBvcnQ6CVRoZSByZW1vdGUgcG9ydCB0byBiZSB0ZXJtaW5hdGVkCisgKgorICogTm90ZXM6CisgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQKK2ZjX3Jwb3J0X3Rlcm1pbmF0ZShzdHJ1Y3QgZmNfcnBvcnQgICpycG9ydCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnBvcnQtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmNfcnBvcnRfdGd0X3JlbW92ZShycG9ydCk7CisKKwl0cmFuc3BvcnRfcmVtb3ZlX2RldmljZShkZXYpOworCWRldmljZV9kZWwoZGV2KTsKKwl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnJwb3J0LT5wZWVycyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcHV0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7Cit9CisKKy8qKgorICogZmNfcmVtb3RlX3BvcnRfZGVsZXRlIC0gbm90aWZpZXMgdGhlIGZjIHRyYW5zcG9ydCB0aGF0IGEgcmVtb3RlCisgKgkJcG9ydCBpcyBubyBsb25nZXIgaW4gZXhpc3RlbmNlLgorICogQHJwb3J0OglUaGUgcmVtb3RlIHBvcnQgdGhhdCBubyBsb25nZXIgZXhpc3RzCisgKgorICogVGhlIExMREQgY2FsbHMgdGhpcyByb3V0aW5lIHRvIG5vdGlmeSB0aGUgdHJhbnNwb3J0IHRoYXQgYSByZW1vdGUKKyAqIHBvcnQgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHRvcG9sb2d5LiBOb3RlOiBBbHRob3VnaCBhIHBvcnQKKyAqIG1heSBubyBsb25nZXIgYmUgcGFydCBvZiB0aGUgdG9wb2xvZ3ksIGl0IG1heSBwZXJzaXN0IGluIHRoZSByZW1vdGUKKyAqIHBvcnRzIGRpc3BsYXllZCBieSB0aGUgZmNfaG9zdC4gVGhpcyBpcyBkb25lIHNvIHRoYXQgdGFyZ2V0IGlkCisgKiBtYXBwaW5ncyAobWFuYWdlZCB2aWEgdGhlIHJlbW90ZSBwb3J0IHN0cnVjdHVyZXMpLCBhcmUgYWx3YXlzIHZpc2libGUKKyAqIGFzIGxvbmcgYXMgdGhlIG1hcHBpbmcgaXMgdmFsaWQsIHJlZ2FyZGxlc3Mgb2YgcG9ydCBzdGF0ZSwKKyAqCisgKiBJZiB0aGUgcmVtb3RlIHBvcnQgaXMgbm90IGFuIEZDUCBUYXJnZXQsIGl0IHdpbGwgYmUgZnVsbHkgdG9ybiBkb3duCisgKiBhbmQgZGVhbGxvY2F0ZWQsIGluY2x1ZGluZyB0aGUgZmNfcmVtb3RlX3BvcnQgY2xhc3MgZGV2aWNlLgorICoKKyAqIElmIHRoZSByZW1vdGUgcG9ydCBpcyBhbiBGQ1AgVGFyZ2V0LCB0aGUgcG9ydCBzdHJ1Y3R1cmUgd2lsbCBiZQorICogbWFya2VkIGFzIE5vdCBQcmVzZW50LCBidXQgd2lsbCByZW1haW4gYXMgbG9uZyBhcyB0aGVyZSBpcyBhIHZhbGlkCisgKiBTQ1NJIHRhcmdldCBpZCBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9ydCBzdHJ1Y3R1cmUuIFZhbGlkaXR5CisgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBiaW5kaW5nIHR5cGUuIElmIGJpbmRpbmcgYnkgd3dwbiwgdGhlbiB0aGUgcG9ydAorICogc3RydWN0dXJlIGlzIGFsd2F5cyB2YWxpZCBhbmQgd2lsbCBub3QgYmUgZGVhbGxvY2F0ZWQgdW50aWwgdGhlIGhvc3QKKyAqIGlzIHJlbW92ZWQuICBJZiBiaW5kaW5nIGJ5IHd3bm4sIHRoZW4gdGhlIHBvcnQgc3RydWN0dXJlIGlzIHZhbGlkCisgKiB1bnRpbCBhbm90aGVyIHBvcnQgd2l0aCB0aGUgc2FtZSBub2RlIG5hbWUgaXMgZm91bmQgaW4gdGhlIHRvcG9sb2d5LgorICogSWYgYmluZGluZyBieSBwb3J0IGlkIChmYyBhZGRyZXNzKSwgdGhlbiB0aGUgcG9ydCBzdHJ1Y3R1cmUgaXMgdmFsaWQKKyAqIHZhbGlkIHVudGlsIGFub3RoZXIgcG9ydCB3aXRoIHRoZSBzYW1lIGFkZHJlc3MgaXMgaWRlbnRpZmllZC4KKyAqCisgKiBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgb3Igbm9ybWFsIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKiBOb3RlczoKKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIG5vIGxvY2tzIGFyZSBoZWxkIG9uIGVudHJ5LgorICoqLwordm9pZAorZmNfcmVtb3RlX3BvcnRfZGVsZXRlKHN0cnVjdCBmY19ycG9ydCAgKnJwb3J0KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJZiBubyBzY3NpIHRhcmdldCBpZCBtYXBwaW5nIG9yIGNvbnNpc3RlbnQgYmluZGluZyB0eXBlLCBkZWxldGUgaXQgKi8KKwlpZiAoKHJwb3J0LT5zY3NpX3RhcmdldF9pZCA9PSAtMSkgfHwKKwkgICAgKGZjX2hvc3RfdGd0aWRfYmluZF90eXBlKHNob3N0KSA9PSBGQ19UR1RJRF9CSU5EX05PTkUpKSB7CisJCWZjX3Jwb3J0X3Rlcm1pbmF0ZShycG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlmY19ycG9ydF90Z3RfcmVtb3ZlKHJwb3J0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X21vdmVfdGFpbCgmcnBvcnQtPnBlZXJzLCAmZmNfaG9zdF9ycG9ydF9iaW5kaW5ncyhzaG9zdCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBOb3RlOiBXZSBkbyBub3QgcmVtb3ZlIG9yIGNsZWFyIHRoZSBob3N0ZGF0YSBhcmVhLiBUaGlzIGFsbG93cworCSAqICAgaG9zdC1zcGVjaWZpYyB0YXJnZXQgZGF0YSB0byBwZXJzaXN0IGFsb25nIHdpdGggdGhlCisJICogICBzY3NpX3RhcmdldF9pZC4gSXQncyB1cCB0byB0aGUgaG9zdCB0byBtYW5hZ2UgaXQncyBob3N0ZGF0YSBhcmVhLgorCSAqLworCisJLyoKKwkgKiBSZWluaXRpYWxpemUgcG9ydCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGNoYW5nZSBpZiB0aGUgcG9ydCBjb21lcyBiYWNrLgorCSAqLworCXJwb3J0LT5tYXhmcmFtZV9zaXplID0gLTE7CisJcnBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzID0gRkNfQ09TX1VOU1BFQ0lGSUVEOworCXJwb3J0LT5yb2xlcyA9IEZDX1JQT1JUX1JPTEVfVU5LTk9XTjsKKwlycG9ydC0+cG9ydF9zdGF0ZSA9IEZDX1BPUlRTVEFURV9OT1RQUkVTRU5UOworCisJLyogcmVtb3ZlIHRoZSBpZGVudGlmaWVycyB0aGF0IGFyZW4ndCB1c2VkIGluIHRoZSBjb25zaXN0aW5nIGJpbmRpbmcgKi8KKwlzd2l0Y2ggKGZjX2hvc3RfdGd0aWRfYmluZF90eXBlKHNob3N0KSkgeworCWNhc2UgRkNfVEdUSURfQklORF9CWV9XV1BOOgorCQlycG9ydC0+bm9kZV9uYW1lID0gLTE7CisJCXJwb3J0LT5wb3J0X2lkID0gLTE7CisJCWJyZWFrOworCWNhc2UgRkNfVEdUSURfQklORF9CWV9XV05OOgorCQlycG9ydC0+cG9ydF9uYW1lID0gLTE7CisJCXJwb3J0LT5wb3J0X2lkID0gLTE7CisJCWJyZWFrOworCWNhc2UgRkNfVEdUSURfQklORF9CWV9JRDoKKwkJcnBvcnQtPm5vZGVfbmFtZSA9IC0xOworCQlycG9ydC0+cG9ydF9uYW1lID0gLTE7CisJCWJyZWFrOworCWNhc2UgRkNfVEdUSURfQklORF9OT05FOgkvKiB0byBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCisJCWJyZWFrOworCX0KK30KK0VYUE9SVF9TWU1CT0woZmNfcmVtb3RlX3BvcnRfZGVsZXRlKTsKKworLyoqCisgKiBmY19yZW1vdGVfcG9ydF9yb2xlY2hnIC0gbm90aWZpZXMgdGhlIGZjIHRyYW5zcG9ydCB0aGF0IHRoZSByb2xlcworICoJCW9uIGEgcmVtb3RlIG1heSBoYXZlIGNoYW5nZWQuCisgKiBAcnBvcnQ6CVRoZSByZW1vdGUgcG9ydCB0aGF0IGNoYW5nZWQuCisgKgorICogVGhlIExMREQgY2FsbHMgdGhpcyByb3V0aW5lIHRvIG5vdGlmeSB0aGUgdHJhbnNwb3J0IHRoYXQgdGhlIHJvbGVzCisgKiBvbiBhIHJlbW90ZSBwb3J0IG1heSBoYXZlIGNoYW5nZWQuIFRoZSBsYXJnZXN0IGVmZmVjdCBvZiB0aGlzIGlzCisgKiBpZiBhIHBvcnQgbm93IGJlY29tZXMgYSBGQ1AgVGFyZ2V0LCBpdCBtdXN0IGJlIGFsbG9jYXRlZCBhCisgKiBzY3NpIHRhcmdldCBpZC4gIElmIHRoZSBwb3J0IGlzIG5vIGxvbmdlciBhIEZDUCB0YXJnZXQsIGFueQorICogc2NzaSB0YXJnZXQgaWQgdmFsdWUgYXNzaWduZWQgdG8gaXQgd2lsbCBwZXJzaXN0IGluIGNhc2UgdGhlCisgKiByb2xlIGNoYW5nZXMgYmFjayB0byBpbmNsdWRlIEZDUCBUYXJnZXQuIE5vIGNoYW5nZXMgaW4gdGhlIHNjc2kKKyAqIG1pZGxheWVyIHdpbGwgYmUgaW52b2tlZCBpZiB0aGUgcm9sZSBjaGFuZ2VzIChpbiB0aGUgZXhwZWN0YXRpb24KKyAqIHRoYXQgdGhlIHJvbGUgd2lsbCBiZSByZXN1bWVkLiBJZiBpdCBkb2Vzbid0IG5vcm1hbCBlcnJvciBwcm9jZXNzaW5nCisgKiB3aWxsIHRha2UgcGxhY2UpLgorICoKKyAqIFNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogTm90ZXM6CisgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KKyAqKi8KK3ZvaWQKK2ZjX3JlbW90ZV9wb3J0X3JvbGVjaGcoc3RydWN0IGZjX3Jwb3J0ICAqcnBvcnQsIHUzMiByb2xlcykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKwlzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqZmNfaG9zdCA9CisJCQkoc3RydWN0IGZjX2hvc3RfYXR0cnMgKilzaG9zdC0+c2hvc3RfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcmVhdGUgPSAwOworCisJcnBvcnQtPnJvbGVzID0gcm9sZXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKChycG9ydC0+c2NzaV90YXJnZXRfaWQgPT0gLTEpICYmCisJICAgIChycG9ydC0+cm9sZXMgJiBGQ19SUE9SVF9ST0xFX0ZDUF9UQVJHRVQpKSB7CisJCXJwb3J0LT5zY3NpX3RhcmdldF9pZCA9IGZjX2hvc3QtPm5leHRfdGFyZ2V0X2lkKys7CisJCWNyZWF0ZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKGNyZWF0ZSkKKwkJLyogaW5pdGlhdGUgYSBzY2FuIG9mIHRoZSB0YXJnZXQgKi8KKwkJc2NzaV9xdWV1ZV93b3JrKHNob3N0LCAmcnBvcnQtPnNjYW5fd29yayk7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbW90ZV9wb3J0X3JvbGVjaGcpOworCisvKioKKyAqIGZjX3RpbWVvdXRfYmxvY2tlZF9ycG9ydCAtIFRpbWVvdXQgaGFuZGxlciBmb3IgYmxvY2tlZCByZW1vdGUgcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZmFpbHMgdG8gcmV0dXJuIGluIHRoZSBhbGxvdGVkIHRpbWUuCisgKiBAZGF0YToJc2NzaSB0YXJnZXQgdGhhdCBmYWlsZWQgdG8gcmVhcHBlYXIgaW4gdGhlIGFsbG90ZWQgdGltZS4KKyAqKi8KK3N0YXRpYyB2b2lkCitmY190aW1lb3V0X2Jsb2NrZWRfcnBvcnQodm9pZCAgKmRhdGEpCit7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IChzdHJ1Y3QgZmNfcnBvcnQgKilkYXRhOworCisJcnBvcnQtPnBvcnRfc3RhdGUgPSBGQ19QT1JUU1RBVEVfT0ZGTElORTsKKworCWRldl9wcmludGsoS0VSTl9FUlIsICZycG9ydC0+ZGV2LAorCQkiYmxvY2tlZCBGQyByZW1vdGUgcG9ydCB0aW1lIG91dDogcmVtb3ZpbmcgdGFyZ2V0XG4iKTsKKworCS8qCisJICogQXMgdGhpcyBvbmx5IG9jY3VycyBpZiB0aGUgcmVtb3RlIHBvcnQgKHNjc2kgdGFyZ2V0KQorCSAqIHdlbnQgYXdheSBhbmQgZGlkbid0IGNvbWUgYmFjayAtIHdlJ2xsIHJlbW92ZQorCSAqIGFsbCBhdHRhY2hlZCBzY3NpIGRldmljZXMuCisJICovCisJc2NzaV90YXJnZXRfdW5ibG9jaygmcnBvcnQtPmRldik7CisJc2NzaV9yZW1vdmVfdGFyZ2V0KCZycG9ydC0+ZGV2KTsKK30KKworLyoqCisgKiBmY19yZW1vdGVfcG9ydF9ibG9jayAtIHRlbXBvcmFyaWx5IGJsb2NrIGFueSBzY3NpIHRyYWZmaWMgdG8gYSByZW1vdGUgcG9ydC4KKyAqIEBycG9ydDoJcmVtb3RlIHBvcnQgdG8gYmUgYmxvY2tlZC4KKyAqCisgKiBzY3NpIGxsZGQncyB3aXRoIGEgRkMgdHJhbnNwb3J0IGNhbGwgdGhpcyByb3V0aW5lIHRvIHRlbXBvcmFyaWx5IHN0b3AKKyAqIGFsbCBzY3NpIHRyYWZmaWMgdG8gYSByZW1vdGUgcG9ydC4gSWYgdGhlIHBvcnQgaXMgbm90IGEgU0NTSSB0YXJnZXQsCisgKiBubyBhY3Rpb24gaXMgdGFrZW4uIElmIHRoZSBwb3J0IGlzIGEgU0NTSSB0YXJnZXQsIGFsbCBhdHRhY2hlZCBkZXZpY2VzCisgKiBhcmUgcGxhY2VkIGludG8gYSBTREVWX0JMT0NLIHN0YXRlIGFuZCBhIHRpbWVyIGlzIHN0YXJ0ZWQuIFRoZSB0aW1lciBpcworICogcmVwcmVzZW50cyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0aGUgcG9ydCBtYXkgYmUgYmxvY2tlZC4gSWYgdGhlCisgKiB0aW1lciBleHBpcmVzLCB0aGUgcG9ydCBpcyBjb25zaWRlcmVkIG5vbi1leGlzdGVudCBhbmQgdGhlIGF0dGFjaGVkCisgKiBzY3NpIGRldmljZXMgd2lsbCBiZSByZW1vdmVkLgorICoKKyAqIENhbGxlZCBmcm9tIGludGVycnVwdCBvciBub3JtYWwgcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGVycm9yIGlmIG5vdAorICoKKyAqIE5vdGVzOgorICogICAgICBUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KKyAqCisgKglUaGUgdGltZW91dCBhbmQgdGltZXIgdHlwZXMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBmYyB0cmFuc3BvcnQgCisgKglhdHRyaWJ1dGVzIGZyb20gdGhlIGNhbGxlcidzIHJwb3J0IHBvaW50ZXIuCisgKiovCitpbnQKK2ZjX3JlbW90ZV9wb3J0X2Jsb2NrKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQpCit7CisJaW50IHRpbWVvdXQgPSBycG9ydC0+ZGV2X2xvc3NfdG1vOworCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9ICZycG9ydC0+ZGV2X2xvc3Nfd29yazsKKworCWlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gU0NTSV9ERVZJQ0VfQkxPQ0tfTUFYX1RJTUVPVVQpCisJCXJldHVybiAtRUlOVkFMOworCisJc2NzaV90YXJnZXRfYmxvY2soJnJwb3J0LT5kZXYpOworCisJLyogY2FwIHRoZSBsZW5ndGggdGhlIGRldmljZXMgY2FuIGJlIGJsb2NrZWQgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsod29yaywgdGltZW91dCAqIEhaKTsKKworCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX0JMT0NLRUQ7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZjX3JlbW90ZV9wb3J0X2Jsb2NrKTsKKworLyoqCisgKiBmY19yZW1vdGVfcG9ydF91bmJsb2NrIC0gcmVzdGFydCBhbnkgYmxvY2tlZCBzY3NpIHRyYWZmaWMgdG8gYSByZW1vdGUgcG9ydC4KKyAqIEBycG9ydDoJcmVtb3RlIHBvcnQgdG8gYmUgdW5ibG9ja2VkLgorICoKKyAqIHNjc2kgbGxkJ3Mgd2l0aCBhIEZDIHRyYW5zcG9ydCBjYWxsIHRoaXMgcm91dGluZSB0byByZXN0YXJ0IElPIHRvIGFsbAorICogZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxlcidzIHNjc2kgdGFyZ2V0IGZvbGxvd2luZyBhIGZjX3RhcmdldF9ibG9jaworICogcmVxdWVzdC4gIENhbGxlZCBmcm9tIGludGVycnVwdCBvciBub3JtYWwgcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKiovCisgdm9pZAorZmNfcmVtb3RlX3BvcnRfdW5ibG9jayhzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0KQoreworCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9ICZycG9ydC0+ZGV2X2xvc3Nfd29yazsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKworCS8qCisJICogU3RvcCB0aGUgdGFyZ2V0IHRpbWVyIGZpcnN0LiBUYWtlIG5vIGFjdGlvbiBvbiB0aGUgZGVsX3RpbWVyCisJICogZmFpbHVyZSBhcyB0aGUgc3RhdGUgbWFjaGluZSBzdGF0ZSBjaGFuZ2Ugd2lsbCB2YWxpZGF0ZSB0aGUKKwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsod29yaykpCisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlpZiAocnBvcnQtPnBvcnRfc3RhdGUgPT0gRkNfUE9SVFNUQVRFX09GRkxJTkUpCisJCS8qCisJCSAqIGluaXRpYXRlIGEgc2NhbiBvZiB0aGUgdGFyZ2V0IGFzIHRoZSB0YXJnZXQgaGFzCisJCSAqIGJlZW4gdG9ybiBkb3duLgorCQkgKi8KKwkJc2NzaV9xdWV1ZV93b3JrKHNob3N0LCAmcnBvcnQtPnNjYW5fd29yayk7CisJZWxzZQorCQlzY3NpX3RhcmdldF91bmJsb2NrKCZycG9ydC0+ZGV2KTsKKworCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX09OTElORTsKK30KK0VYUE9SVF9TWU1CT0woZmNfcmVtb3RlX3BvcnRfdW5ibG9jayk7CisKKy8qKgorICogZmNfc2NzaV9zY2FuX3Jwb3J0IC0gY2FsbGVkIHRvIHBlcmZvcm0gYSBzY3NpIHNjYW4gb24gYSByZW1vdGUgcG9ydC4KKyAqIEBkYXRhOglyZW1vdGUgcG9ydCB0byBiZSBzY2FubmVkLgorICoqLworc3RhdGljIHZvaWQKK2ZjX3Njc2lfc2Nhbl9ycG9ydCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSAoc3RydWN0IGZjX3Jwb3J0ICopZGF0YTsKKworCXNjc2lfc2Nhbl90YXJnZXQoJnJwb3J0LT5kZXYsIHJwb3J0LT5jaGFubmVsLCBycG9ydC0+c2NzaV90YXJnZXRfaWQsCisJCQlTQ0FOX1dJTERfQ0FSRCwgMSk7Cit9CisKKworTU9EVUxFX0FVVEhPUigiTWFydGluIEhpY2tzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZDIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGZjX3RyYW5zcG9ydF9pbml0KTsKK21vZHVsZV9leGl0KGZjX3RyYW5zcG9ydF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiODIyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jCkBAIC0wLDAgKzEsMzg4IEBACisvKiAKKyAqIGlTQ1NJIHRyYW5zcG9ydCBjbGFzcyBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CisgKiBDb3B5cmlnaHQgKEMpIE1pa2UgQ2hyaXN0aWUsIDIwMDQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KKworI2RlZmluZSBJU0NTSV9TRVNTSU9OX0FUVFJTIDIwCisjZGVmaW5lIElTQ1NJX0hPU1RfQVRUUlMgMgorCitzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgeworCXN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSB0OworCXN0cnVjdCBpc2NzaV9mdW5jdGlvbl90ZW1wbGF0ZSAqZm50OworCS8qCisJICogV2UgZG8gbm90IGhhdmUgYW55IHByaXZhdGUgb3Igb3RoZXIgYXR0cnMuCisJICovCisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnNlc3Npb25fYXR0cnNbSVNDU0lfU0VTU0lPTl9BVFRSUyArIDFdOworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpob3N0X2F0dHJzW0lTQ1NJX0hPU1RfQVRUUlMgKyAxXTsKK307CisKKyNkZWZpbmUgdG9faXNjc2lfaW50ZXJuYWwodG1wbCkgY29udGFpbmVyX29mKHRtcGwsIHN0cnVjdCBpc2NzaV9pbnRlcm5hbCwgdCkKKworc3RhdGljIERFQ0xBUkVfVFJBTlNQT1JUX0NMQVNTKGlzY3NpX3RyYW5zcG9ydF9jbGFzcywKKwkJCSAgICAgICAiaXNjc2lfdHJhbnNwb3J0IiwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhpc2NzaV9ob3N0X2NsYXNzLAorCQkJICAgICAgICJpc2NzaV9ob3N0IiwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisvKgorICogaVNDU0kgdGFyZ2V0IGFuZCBzZXNzaW9uIGF0dHJzCisgKi8KKyNkZWZpbmUgaXNjc2lfc2Vzc2lvbl9zaG93X2ZuKGZpZWxkLCBmb3JtYXQpCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X3Nlc3Npb25fIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CVwKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7IFwKKwkJCQkJCQkJCVwKKwlpZiAoaS0+Zm50LT5nZXRfIyNmaWVsZCkJCQkJCVwKKwkJaS0+Zm50LT5nZXRfIyNmaWVsZChzdGFyZ2V0KTsJCQkJXAorCXJldHVybiBzbnByaW50ZihidWYsIDIwLCBmb3JtYXQiXG4iLCBpc2NzaV8jI2ZpZWxkKHN0YXJnZXQpKTsJXAorfQorCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fcmRfYXR0cihmaWVsZCwgZm9ybWF0KQkJCQlcCisJaXNjc2lfc2Vzc2lvbl9zaG93X2ZuKGZpZWxkLCBmb3JtYXQpCQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTywgc2hvd19zZXNzaW9uXyMjZmllbGQsIE5VTEwpOworCitpc2NzaV9zZXNzaW9uX3JkX2F0dHIodHBndCwgIiVodSIpOworaXNjc2lfc2Vzc2lvbl9yZF9hdHRyKHRzaWgsICIlMngiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cihtYXhfcmVjdl9kYXRhX3NlZ21lbnRfbGVuLCAiJXUiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cihtYXhfYnVyc3RfbGVuLCAiJXUiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cihmaXJzdF9idXJzdF9sZW4sICIldSIpOworaXNjc2lfc2Vzc2lvbl9yZF9hdHRyKGRlZl90aW1lMndhaXQsICIlaHUiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cihkZWZfdGltZTJyZXRhaW4sICIlaHUiKTsKK2lzY3NpX3Nlc3Npb25fcmRfYXR0cihtYXhfb3V0c3RhbmRpbmdfcjJ0LCAiJWh1Iik7Citpc2NzaV9zZXNzaW9uX3JkX2F0dHIoZXJsLCAiJWQiKTsKKworCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fc2hvd19ib29sX2ZuKGZpZWxkKQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorc2hvd19zZXNzaW9uX2Jvb2xfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CVwKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7IFwKKwkJCQkJCQkJCVwKKwlpZiAoaS0+Zm50LT5nZXRfIyNmaWVsZCkJCQkJCVwKKwkJaS0+Zm50LT5nZXRfIyNmaWVsZChzdGFyZ2V0KTsJCQkJXAorCQkJCQkJCQkJXAorCWlmIChpc2NzaV8jI2ZpZWxkKHN0YXJnZXQpKQkJCQkJXAorCQlyZXR1cm4gc3ByaW50ZihidWYsICJZZXNcbiIpOwkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiTm9cbiIpOwkJCQkJXAorfQorCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fcmRfYm9vbF9hdHRyKGZpZWxkKQkJCQlcCisJaXNjc2lfc2Vzc2lvbl9zaG93X2Jvb2xfZm4oZmllbGQpCQkJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTywgc2hvd19zZXNzaW9uX2Jvb2xfIyNmaWVsZCwgTlVMTCk7CisKK2lzY3NpX3Nlc3Npb25fcmRfYm9vbF9hdHRyKGluaXRpYWxfcjJ0KTsKK2lzY3NpX3Nlc3Npb25fcmRfYm9vbF9hdHRyKGltbWVkaWF0ZV9kYXRhKTsKK2lzY3NpX3Nlc3Npb25fcmRfYm9vbF9hdHRyKGRhdGFfcGR1X2luX29yZGVyKTsKK2lzY3NpX3Nlc3Npb25fcmRfYm9vbF9hdHRyKGRhdGFfc2VxdWVuY2VfaW5fb3JkZXIpOworCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fc2hvd19kaWdlc3RfZm4oZmllbGQpCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93XyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsJXAorCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsgXAorCQkJCQkJCQkJXAorCWlmIChpLT5mbnQtPmdldF8jI2ZpZWxkKQkJCQkJXAorCQlpLT5mbnQtPmdldF8jI2ZpZWxkKHN0YXJnZXQpOwkJCQlcCisJCQkJCQkJCQlcCisJaWYgKGlzY3NpXyMjZmllbGQoc3RhcmdldCkpCQkJCQlcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkNSQzMyQ1xuIik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk5vbmVcbiIpOwkJCQkJXAorfQorCisjZGVmaW5lIGlzY3NpX3Nlc3Npb25fcmRfZGlnZXN0X2F0dHIoZmllbGQpCQkJCVwKKwlpc2NzaV9zZXNzaW9uX3Nob3dfZGlnZXN0X2ZuKGZpZWxkKQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08sIHNob3dfIyNmaWVsZCwgTlVMTCk7CisKK2lzY3NpX3Nlc3Npb25fcmRfZGlnZXN0X2F0dHIoaGVhZGVyX2RpZ2VzdCk7Citpc2NzaV9zZXNzaW9uX3JkX2RpZ2VzdF9hdHRyKGRhdGFfZGlnZXN0KTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfcG9ydChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJaWYgKGktPmZudC0+Z2V0X3BvcnQpCisJCWktPmZudC0+Z2V0X3BvcnQoc3RhcmdldCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiVodVxuIiwgbnRvaHMoaXNjc2lfcG9ydChzdGFyZ2V0KSkpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHBvcnQsIFNfSVJVR08sIHNob3dfcG9ydCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2lwX2FkZHJlc3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCWlmIChpLT5mbnQtPmdldF9pcF9hZGRyZXNzKQorCQlpLT5mbnQtPmdldF9pcF9hZGRyZXNzKHN0YXJnZXQpOworCisJaWYgKGlzY3NpX2FkZHJfdHlwZShzdGFyZ2V0KSA9PSBBRl9JTkVUKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldS4ldS4ldS4ldVxuIiwKKwkJCSAgICAgICBOSVBRVUFEKGlzY3NpX3Npbl9hZGRyKHN0YXJnZXQpKSk7CisJZWxzZSBpZihpc2NzaV9hZGRyX3R5cGUoc3RhcmdldCkgPT0gQUZfSU5FVDYpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCSAgICAgICBOSVA2KGlzY3NpX3NpbjZfYWRkcihzdGFyZ2V0KSkpOworCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGlwX2FkZHJlc3MsIFNfSVJVR08sIHNob3dfaXBfYWRkcmVzcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2lzaWQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKworCWlmIChpLT5mbnQtPmdldF9pc2lkKQorCQlpLT5mbnQtPmdldF9pc2lkKHN0YXJnZXQpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkgICAgICAgaXNjc2lfaXNpZChzdGFyZ2V0KVswXSwgaXNjc2lfaXNpZChzdGFyZ2V0KVsxXSwKKwkJICAgICAgIGlzY3NpX2lzaWQoc3RhcmdldClbMl0sIGlzY3NpX2lzaWQoc3RhcmdldClbM10sCisJCSAgICAgICBpc2NzaV9pc2lkKHN0YXJnZXQpWzRdLCBpc2NzaV9pc2lkKHN0YXJnZXQpWzVdKTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpc2lkLCBTX0lSVUdPLCBzaG93X2lzaWQsIE5VTEwpOworCisvKgorICogVGhpcyBpcyB1c2VkIGZvciBpU0NTSSBuYW1lcy4gTm9ybWFsbHksIHdlIGZvbGxvdworICogdGhlIHRyYW5zcG9ydCBjbGFzcyBjb252ZW50aW9uIG9mIGhhdmluZyB0aGUgbGxkCisgKiBzZXQgdGhlIGZpZWxkLCBidXQgaW4gdGhlc2UgY2FzZXMgdGhlIHZhbHVlIGlzCisgKiB0b28gbGFyZ2UuCisgKi8KKyNkZWZpbmUgaXNjc2lfc2Vzc2lvbl9zaG93X3N0cl9mbihmaWVsZCkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfc2Vzc2lvbl9zdHJfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXNzaXplX3QgcmV0ID0gMDsJCQkJCQlcCisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CVwKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsJXAorCXN0cnVjdCBpc2NzaV9pbnRlcm5hbCAqaSA9IHRvX2lzY3NpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsgXAorCQkJCQkJCQkJXAorCWlmIChpLT5mbnQtPmdldF8jI2ZpZWxkKQkJCQkJXAorCQlyZXQgPSBpLT5mbnQtPmdldF8jI2ZpZWxkKHN0YXJnZXQsIGJ1ZiwgUEFHRV9TSVpFKTsJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30KKworI2RlZmluZSBpc2NzaV9zZXNzaW9uX3JkX3N0cl9hdHRyKGZpZWxkKQkJCQlcCisJaXNjc2lfc2Vzc2lvbl9zaG93X3N0cl9mbihmaWVsZCkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPLCBzaG93X3Nlc3Npb25fc3RyXyMjZmllbGQsIE5VTEwpOworCitpc2NzaV9zZXNzaW9uX3JkX3N0cl9hdHRyKHRhcmdldF9uYW1lKTsKK2lzY3NpX3Nlc3Npb25fcmRfc3RyX2F0dHIodGFyZ2V0X2FsaWFzKTsKKworLyoKKyAqIGlTQ1NJIGhvc3QgYXR0cnMKKyAqLworCisvKgorICogQWdhaW4sIHRoaXMgaXMgdXNlZCBmb3IgaVNDU0kgbmFtZXMuIE5vcm1hbGx5LCB3ZSBmb2xsb3cKKyAqIHRoZSB0cmFuc3BvcnQgY2xhc3MgY29udmVudGlvbiBvZiBoYXZpbmcgdGhlIGxsZCBzZXQKKyAqIHRoZSBmaWVsZCwgYnV0IGluIHRoZXNlIGNhc2VzIHRoZSB2YWx1ZSBpcyB0b28gbGFyZ2UuCisgKi8KKyNkZWZpbmUgaXNjc2lfaG9zdF9zaG93X3N0cl9mbihmaWVsZCkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X2hvc3Rfc3RyXyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlpbnQgcmV0ID0gMDsJCQkJCQkJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOwlcCisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOyBcCisJCQkJCQkJCQlcCisJaWYgKGktPmZudC0+Z2V0XyMjZmllbGQpCQkJCQlcCisJCXJldCA9IGktPmZudC0+Z2V0XyMjZmllbGQoc2hvc3QsIGJ1ZiwgUEFHRV9TSVpFKTsJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30KKworI2RlZmluZSBpc2NzaV9ob3N0X3JkX3N0cl9hdHRyKGZpZWxkKQkJCQkJXAorCWlzY3NpX2hvc3Rfc2hvd19zdHJfZm4oZmllbGQpCQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmllbGQsIFNfSVJVR08sIHNob3dfaG9zdF9zdHJfIyNmaWVsZCwgTlVMTCk7CisKK2lzY3NpX2hvc3RfcmRfc3RyX2F0dHIoaW5pdGlhdG9yX25hbWUpOworaXNjc2lfaG9zdF9yZF9zdHJfYXR0cihpbml0aWF0b3JfYWxpYXMpOworCisjZGVmaW5lIFNFVFVQX1NFU1NJT05fUkRfQVRUUihmaWVsZCkJCQkJCVwKKwlpZiAoaS0+Zm50LT5zaG93XyMjZmllbGQpIHsJCQkJCVwKKwkJaS0+c2Vzc2lvbl9hdHRyc1tjb3VudF0gPSAmY2xhc3NfZGV2aWNlX2F0dHJfIyNmaWVsZDsJXAorCQljb3VudCsrOwkJCQkJCVwKKwl9CisKKyNkZWZpbmUgU0VUVVBfSE9TVF9SRF9BVFRSKGZpZWxkKQkJCQkJXAorCWlmIChpLT5mbnQtPnNob3dfIyNmaWVsZCkgewkJCQkJXAorCQlpLT5ob3N0X2F0dHJzW2NvdW50XSA9ICZjbGFzc19kZXZpY2VfYXR0cl8jI2ZpZWxkOwlcCisJCWNvdW50Kys7CQkJCQkJXAorCX0KKworc3RhdGljIGludCBpc2NzaV9ob3N0X21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICppOworCisJaWYgKCFzY3NpX2lzX2hvc3RfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmaXNjc2lfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCQorCXJldHVybiAmaS0+dC5ob3N0X2F0dHJzLmFjID09IGNvbnQ7Cit9CisKK3N0YXRpYyBpbnQgaXNjc2lfdGFyZ2V0X21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAorCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmk7CisKKwlpZiAoIXNjc2lfaXNfdGFyZ2V0X2RldmljZShkZXYpKQorCQlyZXR1cm4gMDsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KGRldi0+cGFyZW50KTsKKwlpZiAoIXNob3N0LT50cmFuc3BvcnR0ICB8fCBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcworCSAgICAhPSAmaXNjc2lfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCQorCXJldHVybiAmaS0+dC50YXJnZXRfYXR0cnMuYWMgPT0gY29udDsKK30KKworc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICoKK2lzY3NpX2F0dGFjaF90cmFuc3BvcnQoc3RydWN0IGlzY3NpX2Z1bmN0aW9uX3RlbXBsYXRlICpmbnQpCit7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlzY3NpX2ludGVybmFsKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaW50IGNvdW50ID0gMDsKKworCWlmICh1bmxpa2VseSghaSkpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGksIDAsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwpKTsKKwlpLT5mbnQgPSBmbnQ7CisKKwlpLT50LnRhcmdldF9hdHRycy5hYy5hdHRycyA9ICZpLT5zZXNzaW9uX2F0dHJzWzBdOworCWktPnQudGFyZ2V0X2F0dHJzLmFjLmNsYXNzID0gJmlzY3NpX3RyYW5zcG9ydF9jbGFzcy5jbGFzczsKKwlpLT50LnRhcmdldF9hdHRycy5hYy5tYXRjaCA9IGlzY3NpX3RhcmdldF9tYXRjaDsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZpLT50LnRhcmdldF9hdHRycyk7CisJaS0+dC50YXJnZXRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNjc2lfY2xhc3Nfc2Vzc2lvbik7CisKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodHNpaCk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGlzaWQpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihoZWFkZXJfZGlnZXN0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZGF0YV9kaWdlc3QpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUih0YXJnZXRfbmFtZSk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHRhcmdldF9hbGlhcyk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHBvcnQpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUih0cGd0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoaXBfYWRkcmVzcyk7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGluaXRpYWxfcjJ0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoaW1tZWRpYXRlX2RhdGEpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihtYXhfcmVjdl9kYXRhX3NlZ21lbnRfbGVuKTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIobWF4X2J1cnN0X2xlbik7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGZpcnN0X2J1cnN0X2xlbik7CisJU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGRlZl90aW1lMndhaXQpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihkZWZfdGltZTJyZXRhaW4pOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihtYXhfb3V0c3RhbmRpbmdfcjJ0KTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZGF0YV9wZHVfaW5fb3JkZXIpOworCVNFVFVQX1NFU1NJT05fUkRfQVRUUihkYXRhX3NlcXVlbmNlX2luX29yZGVyKTsKKwlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZXJsKTsKKworCUJVR19PTihjb3VudCA+IElTQ1NJX1NFU1NJT05fQVRUUlMpOworCWktPnNlc3Npb25fYXR0cnNbY291bnRdID0gTlVMTDsKKworCWktPnQuaG9zdF9hdHRycy5hYy5hdHRycyA9ICZpLT5ob3N0X2F0dHJzWzBdOworCWktPnQuaG9zdF9hdHRycy5hYy5jbGFzcyA9ICZpc2NzaV9ob3N0X2NsYXNzLmNsYXNzOworCWktPnQuaG9zdF9hdHRycy5hYy5tYXRjaCA9IGlzY3NpX2hvc3RfbWF0Y2g7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmaS0+dC5ob3N0X2F0dHJzKTsKKwlpLT50Lmhvc3Rfc2l6ZSA9IDA7CisKKwljb3VudCA9IDA7CisJU0VUVVBfSE9TVF9SRF9BVFRSKGluaXRpYXRvcl9uYW1lKTsKKwlTRVRVUF9IT1NUX1JEX0FUVFIoaW5pdGlhdG9yX2FsaWFzKTsKKworCUJVR19PTihjb3VudCA+IElTQ1NJX0hPU1RfQVRUUlMpOworCWktPmhvc3RfYXR0cnNbY291bnRdID0gTlVMTDsKKworCXJldHVybiAmaS0+dDsKK30KKworRVhQT1JUX1NZTUJPTChpc2NzaV9hdHRhY2hfdHJhbnNwb3J0KTsKKwordm9pZCBpc2NzaV9yZWxlYXNlX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnQpCit7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0gdG9faXNjc2lfaW50ZXJuYWwodCk7CisKKwl0cmFuc3BvcnRfY29udGFpbmVyX3VucmVnaXN0ZXIoJmktPnQudGFyZ2V0X2F0dHJzKTsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3VucmVnaXN0ZXIoJmktPnQuaG9zdF9hdHRycyk7CisgIAorCWtmcmVlKGkpOworfQorCitFWFBPUlRfU1lNQk9MKGlzY3NpX3JlbGVhc2VfdHJhbnNwb3J0KTsKKworc3RhdGljIF9faW5pdCBpbnQgaXNjc2lfdHJhbnNwb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZpc2NzaV90cmFuc3BvcnRfY2xhc3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZpc2NzaV9ob3N0X2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlzY3NpX3RyYW5zcG9ydF9leGl0KHZvaWQpCit7CisJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2hvc3RfY2xhc3MpOworCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV90cmFuc3BvcnRfY2xhc3MpOworfQorCittb2R1bGVfaW5pdChpc2NzaV90cmFuc3BvcnRfaW5pdCk7Cittb2R1bGVfZXhpdChpc2NzaV90cmFuc3BvcnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pa2UgQ2hyaXN0aWUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaVNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNkNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCkBAIC0wLDAgKzEsMTAyMCBAQAorLyogCisgKiAgUGFyYWxsZWwgU0NTSSAoU1BJKSB0cmFuc3BvcnQgc3BlY2lmaWMgYXR0cmlidXRlcyBleHBvcnRlZCB0byBzeXNmcy4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IEphbWVzIEJvdHRvbWxleSA8SmFtZXMuQm90dG9tbGV5QFN0ZWVsRXllLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjZGVmaW5lIFNQSV9QUklOVEsoeCwgbCwgZiwgYS4uLikJZGV2X3ByaW50ayhsLCAmKHgpLT5kZXYsIGYgLCAjI2EpCisKKyNkZWZpbmUgU1BJX05VTV9BVFRSUyAxMAkvKiBpbmNyZWFzZSB0aGlzIGlmIHlvdSBhZGQgYXR0cmlidXRlcyAqLworI2RlZmluZSBTUElfT1RIRVJfQVRUUlMgMQkvKiBJbmNyZWFzZSB0aGlzIGlmIHlvdSBhZGQgImFsd2F5cworCQkJCSAqIG9uIiBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNQSV9IT1NUX0FUVFJTCTEKKworI2RlZmluZSBTUElfTUFYX0VDSE9fQlVGRkVSX1NJWkUJNDA5NgorCisvKiBQcml2YXRlIGRhdGEgYWNjZXNzb3JzIChrZWVwIHRoZXNlIG91dCBvZiB0aGUgaGVhZGVyIGZpbGUpICovCisjZGVmaW5lIHNwaV9kdl9wZW5kaW5nKHgpICgoKHN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICopJih4KS0+c3RhcmdldF9kYXRhKS0+ZHZfcGVuZGluZykKKyNkZWZpbmUgc3BpX2R2X3NlbSh4KSAoKChzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqKSYoeCktPnN0YXJnZXRfZGF0YSktPmR2X3NlbSkKKworc3RydWN0IHNwaV9pbnRlcm5hbCB7CisJc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIHQ7CisJc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSAqZjsKKwkvKiBUaGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBwcml2YXRlX2F0dHJzW1NQSV9OVU1fQVRUUlNdOworCS8qIFRoZSBhcnJheSBvZiBudWxsIHRlcm1pbmF0ZWQgcG9pbnRlcnMgdG8gYXR0cmlidXRlcyAKKwkgKiBuZWVkZWQgYnkgc2NzaV9zeXNmcy5jICovCisJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHJzW1NQSV9OVU1fQVRUUlMgKyBTUElfT1RIRVJfQVRUUlMgKyAxXTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBwcml2YXRlX2hvc3RfYXR0cnNbU1BJX0hPU1RfQVRUUlNdOworCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpob3N0X2F0dHJzW1NQSV9IT1NUX0FUVFJTICsgMV07Cit9OworCisjZGVmaW5lIHRvX3NwaV9pbnRlcm5hbCh0bXBsKQljb250YWluZXJfb2YodG1wbCwgc3RydWN0IHNwaV9pbnRlcm5hbCwgdCkKKworc3RhdGljIGNvbnN0IGludCBwcHJfdG9fcHNbXSA9IHsKKwkvKiBUaGUgUFBSIHZhbHVlcyAwLTYgYXJlIHJlc2VydmVkLCBmaWxsIHRoZW0gaW4gd2hlbgorCSAqIHRoZSBjb21taXR0ZWUgZGVmaW5lcyB0aGVtICovCisJLTEsCQkJLyogMHgwMCAqLworCS0xLAkJCS8qIDB4MDEgKi8KKwktMSwJCQkvKiAweDAyICovCisJLTEsCQkJLyogMHgwMyAqLworCS0xLAkJCS8qIDB4MDQgKi8KKwktMSwJCQkvKiAweDA1ICovCisJLTEsCQkJLyogMHgwNiAqLworCSAzMTI1LAkJCS8qIDB4MDcgKi8KKwkgNjI1MCwJCQkvKiAweDA4ICovCisJMTI1MDAsCQkJLyogMHgwOSAqLworCTI1MDAwLAkJCS8qIDB4MGEgKi8KKwkzMDMwMCwJCQkvKiAweDBiICovCisJNTAwMDAsCQkJLyogMHgwYyAqLworfTsKKy8qIFRoZSBQUFIgdmFsdWVzIGF0IHdoaWNoIHlvdSBjYWxjdWxhdGUgdGhlIHBlcmlvZCBpbiBucyBieSBtdWx0aXBseWluZworICogYnkgNCAqLworI2RlZmluZSBTUElfU1RBVElDX1BQUgkweDBjCisKK3N0YXRpYyBpbnQgc3ByaW50X2ZyYWMoY2hhciAqZGVzdCwgaW50IHZhbHVlLCBpbnQgZGVub20pCit7CisJaW50IGZyYWMgPSB2YWx1ZSAlIGRlbm9tOworCWludCByZXN1bHQgPSBzcHJpbnRmKGRlc3QsICIlZCIsIHZhbHVlIC8gZGVub20pOworCisJaWYgKGZyYWMgPT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKwlkZXN0W3Jlc3VsdCsrXSA9ICcuJzsKKworCWRvIHsKKwkJZGVub20gLz0gMTA7CisJCXNwcmludGYoZGVzdCArIHJlc3VsdCwgIiVkIiwgZnJhYyAvIGRlbm9tKTsKKwkJcmVzdWx0Kys7CisJCWZyYWMgJT0gZGVub207CisJfSB3aGlsZSAoZnJhYyk7CisKKwlkZXN0W3Jlc3VsdCsrXSA9ICdcMCc7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJZW51bSBzcGlfc2lnbmFsX3R5cGUJdmFsdWU7CisJY2hhcgkJCSpuYW1lOworfSBzaWduYWxfdHlwZXNbXSA9IHsKKwl7IFNQSV9TSUdOQUxfVU5LTk9XTiwgInVua25vd24iIH0sCisJeyBTUElfU0lHTkFMX1NFLCAiU0UiIH0sCisJeyBTUElfU0lHTkFMX0xWRCwgIkxWRCIgfSwKKwl7IFNQSV9TSUdOQUxfSFZELCAiSFZEIiB9LAorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpzcGlfc2lnbmFsX3RvX3N0cmluZyhlbnVtIHNwaV9zaWduYWxfdHlwZSB0eXBlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzaWduYWxfdHlwZXMpL3NpemVvZihzaWduYWxfdHlwZXNbMF0pOyBpKyspIHsKKwkJaWYgKHR5cGUgPT0gc2lnbmFsX3R5cGVzW2ldLnZhbHVlKQorCQkJcmV0dXJuIHNpZ25hbF90eXBlc1tpXS5uYW1lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgZW51bSBzcGlfc2lnbmFsX3R5cGUgc3BpX3NpZ25hbF90b192YWx1ZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpLCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbF90eXBlcykvc2l6ZW9mKHNpZ25hbF90eXBlc1swXSk7IGkrKykgeworCQlsZW4gPSAgc3RybGVuKHNpZ25hbF90eXBlc1tpXS5uYW1lKTsKKwkJaWYgKHN0cm5jbXAobmFtZSwgc2lnbmFsX3R5cGVzW2ldLm5hbWUsIGxlbikgPT0gMCAmJgorCQkgICAgKG5hbWVbbGVuXSA9PSAnXG4nIHx8IG5hbWVbbGVuXSA9PSAnXDAnKSkKKwkJCXJldHVybiBzaWduYWxfdHlwZXNbaV0udmFsdWU7CisJfQorCXJldHVybiBTUElfU0lHTkFMX1VOS05PV047Cit9CisKK3N0YXRpYyBpbnQgc3BpX2hvc3Rfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CisKKwlzcGlfc2lnbmFsbGluZyhzaG9zdCkgPSBTUElfU0lHTkFMX1VOS05PV047CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFQ0xBUkVfVFJBTlNQT1JUX0NMQVNTKHNwaV9ob3N0X2NsYXNzLAorCQkJICAgICAgICJzcGlfaG9zdCIsCisJCQkgICAgICAgc3BpX2hvc3Rfc2V0dXAsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMKTsKKworc3RhdGljIGludCBzcGlfaG9zdF9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmk7CisKKwlpZiAoIXNjc2lfaXNfaG9zdF9kZXZpY2UoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlzaG9zdCA9IGRldl90b19zaG9zdChkZXYpOworCWlmICghc2hvc3QtPnRyYW5zcG9ydHQgIHx8IHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X2F0dHJzLmFjLmNsYXNzCisJICAgICE9ICZzcGlfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwkKKwlyZXR1cm4gJmktPnQuaG9zdF9hdHRycy5hYyA9PSBjb250OworfQorCitzdGF0aWMgaW50IHNwaV9kZXZpY2VfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHNkZXYtPnNkZXZfdGFyZ2V0OworCisJLyogUG9wdWxhdGUgdGhlIHRhcmdldCBjYXBhYmlsaXR5IGZpZWxkcyB3aXRoIHRoZSB2YWx1ZXMKKwkgKiBnbGVhbmVkIGZyb20gdGhlIGRldmljZSBpbnF1aXJ5ICovCisKKwlzcGlfc3VwcG9ydF9zeW5jKHN0YXJnZXQpID0gc2NzaV9kZXZpY2Vfc3luYyhzZGV2KTsKKwlzcGlfc3VwcG9ydF93aWRlKHN0YXJnZXQpID0gc2NzaV9kZXZpY2Vfd2lkZShzZGV2KTsKKwlzcGlfc3VwcG9ydF9kdChzdGFyZ2V0KSA9IHNjc2lfZGV2aWNlX2R0KHNkZXYpOworCXNwaV9zdXBwb3J0X2R0X29ubHkoc3RhcmdldCkgPSBzY3NpX2RldmljZV9kdF9vbmx5KHNkZXYpOworCXNwaV9zdXBwb3J0X2l1cyhzdGFyZ2V0KSA9IHNjc2lfZGV2aWNlX2l1cyhzZGV2KTsKKwlzcGlfc3VwcG9ydF9xYXMoc3RhcmdldCkgPSBzY3NpX2RldmljZV9xYXMoc2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGlfc2V0dXBfdHJhbnNwb3J0X2F0dHJzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChkZXYpOworCisJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IC0xOwkvKiBpbGxlZ2FsIHZhbHVlICovCisJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CS8qIGFzeW5jICovCisJc3BpX3dpZHRoKHN0YXJnZXQpID0gMDsJLyogbmFycm93ICovCisJc3BpX2l1KHN0YXJnZXQpID0gMDsJLyogbm8gSVUgKi8KKwlzcGlfZHQoc3RhcmdldCkgPSAwOwkvKiBTVCAqLworCXNwaV9xYXMoc3RhcmdldCkgPSAwOworCXNwaV93cl9mbG93KHN0YXJnZXQpID0gMDsKKwlzcGlfcmRfc3RybShzdGFyZ2V0KSA9IDA7CisJc3BpX3J0aShzdGFyZ2V0KSA9IDA7CisJc3BpX3Bjb21wX2VuKHN0YXJnZXQpID0gMDsKKwlzcGlfZHZfcGVuZGluZyhzdGFyZ2V0KSA9IDA7CisJc3BpX2luaXRpYWxfZHYoc3RhcmdldCkgPSAwOworCWluaXRfTVVURVgoJnNwaV9kdl9zZW0oc3RhcmdldCkpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgc3BpX3RyYW5zcG9ydF9zaG93X2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfc3BpX3RyYW5zcG9ydF8jI2ZpZWxkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc3RhcmdldChjZGV2KTsJXAorCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwlcCisJc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKnRwOwkJCQkJXAorCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwlcCisJdHAgPSAoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmc3RhcmdldC0+c3RhcmdldF9kYXRhOwlcCisJaWYgKGktPmYtPmdldF8jI2ZpZWxkKQkJCQkJCVwKKwkJaS0+Zi0+Z2V0XyMjZmllbGQoc3RhcmdldCk7CQkJCVwKKwlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgZm9ybWF0X3N0cmluZywgdHAtPmZpZWxkKTsJCVwKK30KKworI2RlZmluZSBzcGlfdHJhbnNwb3J0X3N0b3JlX2Z1bmN0aW9uKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3N0b3JlX3NwaV90cmFuc3BvcnRfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsIFwKKwkJCSAgICBzaXplX3QgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IHZhbDsJCQkJCQkJXAorCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOwlcCisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CVwKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsJXAorCQkJCQkJCQkJXAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CQkJCVwKKwlpLT5mLT5zZXRfIyNmaWVsZChzdGFyZ2V0LCB2YWwpOwkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CisKKyNkZWZpbmUgc3BpX3RyYW5zcG9ydF9yZF9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKKwlzcGlfdHJhbnNwb3J0X3Nob3dfZnVuY3Rpb24oZmllbGQsIGZvcm1hdF9zdHJpbmcpCQlcCisJc3BpX3RyYW5zcG9ydF9zdG9yZV9mdW5jdGlvbihmaWVsZCwgZm9ybWF0X3N0cmluZykJCVwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmaWVsZCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAorCQkJIHNob3dfc3BpX3RyYW5zcG9ydF8jI2ZpZWxkLAkJCVwKKwkJCSBzdG9yZV9zcGlfdHJhbnNwb3J0XyMjZmllbGQpOworCisvKiBUaGUgUGFyYWxsZWwgU0NTSSBUcmFucG9ydCBBdHRyaWJ1dGVzOiAqLworc3BpX3RyYW5zcG9ydF9yZF9hdHRyKG9mZnNldCwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cih3aWR0aCwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cihpdSwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cihkdCwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cihxYXMsICIlZFxuIik7CitzcGlfdHJhbnNwb3J0X3JkX2F0dHIod3JfZmxvdywgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cihyZF9zdHJtLCAiJWRcbiIpOworc3BpX3RyYW5zcG9ydF9yZF9hdHRyKHJ0aSwgIiVkXG4iKTsKK3NwaV90cmFuc3BvcnRfcmRfYXR0cihwY29tcF9lbiwgIiVkXG4iKTsKKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3NwaV9yZXZhbGlkYXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCisJLyogRklYTUU6IHdlJ3JlIHJlbHlpbmcgb24gYW4gYXdmdWwgbG90IG9mIGRldmljZSBpbnRlcm5hbHMKKwkgKiBoZXJlLiAgV2UgcmVhbGx5IG5lZWQgYSBmdW5jdGlvbiB0byBnZXQgdGhlIGZpcnN0IGF2YWlsYWJsZQorCSAqIGNoaWxkICovCisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKHN0YXJnZXQtPmRldi5jaGlsZHJlbi5uZXh0LCBzdHJ1Y3QgZGV2aWNlLCBub2RlKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCXNwaV9kdl9kZXZpY2Uoc2Rldik7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHJldmFsaWRhdGUsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3NwaV9yZXZhbGlkYXRlKTsKKworLyogVHJhbnNsYXRlIHRoZSBwZXJpb2QgaW50byBucyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3BlYworICogZm9yIFNEVFIvUFBSIG1lc3NhZ2VzICovCitzdGF0aWMgc3NpemVfdCBzaG93X3NwaV90cmFuc3BvcnRfcGVyaW9kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKKworeworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRyYW5zcG9ydF9jbGFzc190b19zdGFyZ2V0KGNkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzcGlfdHJhbnNwb3J0X2F0dHJzICp0cDsKKwlpbnQgbGVuLCBwaWNvc2VjOworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJdHAgPSAoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmc3RhcmdldC0+c3RhcmdldF9kYXRhOworCisJaWYgKGktPmYtPmdldF9wZXJpb2QpCisJCWktPmYtPmdldF9wZXJpb2Qoc3RhcmdldCk7CisKKwlpZiAodHAtPnBlcmlvZCA8IDAgfHwgdHAtPnBlcmlvZCA+IDB4ZmYpIHsKKwkJcGljb3NlYyA9IC0xOworCX0gZWxzZSBpZiAodHAtPnBlcmlvZCA8PSBTUElfU1RBVElDX1BQUikgeworCQlwaWNvc2VjID0gcHByX3RvX3BzW3RwLT5wZXJpb2RdOworCX0gZWxzZSB7CisJCXBpY29zZWMgPSB0cC0+cGVyaW9kICogNDAwMDsKKwl9CisKKwlpZiAocGljb3NlYyA9PSAtMSkgeworCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgInJlc2VydmVkIik7CisJfSBlbHNlIHsKKwkJbGVuID0gc3ByaW50X2ZyYWMoYnVmLCBwaWNvc2VjLCAxMDAwKTsKKwl9CisKKwlidWZbbGVuKytdID0gJ1xuJzsKKwlidWZbbGVuXSA9ICdcMCc7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3NwaV90cmFuc3BvcnRfcGVyaW9kKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3N0YXJnZXQoY2Rldik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJaW50IGosIHBpY29zZWMsIHBlcmlvZCA9IC0xOworCWNoYXIgKmVuZHA7CisKKwlwaWNvc2VjID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMTApICogMTAwMDsKKwlpZiAoKmVuZHAgPT0gJy4nKSB7CisJCWludCBtdWx0ID0gMTAwOworCQlkbyB7CisJCQllbmRwKys7CisJCQlpZiAoIWlzZGlnaXQoKmVuZHApKQorCQkJCWJyZWFrOworCQkJcGljb3NlYyArPSAoKmVuZHAgLSAnMCcpICogbXVsdDsKKwkJCW11bHQgLz0gMTA7CisJCX0gd2hpbGUgKG11bHQgPiAwKTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDw9IFNQSV9TVEFUSUNfUFBSOyBqKyspIHsKKwkJaWYgKHBwcl90b19wc1tqXSA8IHBpY29zZWMpCisJCQljb250aW51ZTsKKwkJcGVyaW9kID0gajsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBlcmlvZCA9PSAtMSkKKwkJcGVyaW9kID0gcGljb3NlYyAvIDQwMDA7CisKKwlpZiAocGVyaW9kID4gMHhmZikKKwkJcGVyaW9kID0gMHhmZjsKKworCWktPmYtPnNldF9wZXJpb2Qoc3RhcmdldCwgcGVyaW9kKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHBlcmlvZCwgU19JUlVHTyB8IFNfSVdVU1IsIAorCQkJIHNob3dfc3BpX3RyYW5zcG9ydF9wZXJpb2QsCisJCQkgc3RvcmVfc3BpX3RyYW5zcG9ydF9wZXJpb2QpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3NwaV9ob3N0X3NpZ25hbGxpbmcoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSB0b19zcGlfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCisJaWYgKGktPmYtPmdldF9zaWduYWxsaW5nKQorCQlpLT5mLT5nZXRfc2lnbmFsbGluZyhzaG9zdCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3BpX3NpZ25hbF90b19zdHJpbmcoc3BpX3NpZ25hbGxpbmcoc2hvc3QpKSk7Cit9CitzdGF0aWMgc3NpemVfdCBzdG9yZV9zcGlfaG9zdF9zaWduYWxsaW5nKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwllbnVtIHNwaV9zaWduYWxfdHlwZSB0eXBlID0gc3BpX3NpZ25hbF90b192YWx1ZShidWYpOworCisJaWYgKHR5cGUgIT0gU1BJX1NJR05BTF9VTktOT1dOKQorCQlpLT5mLT5zZXRfc2lnbmFsbGluZyhzaG9zdCwgdHlwZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2lnbmFsbGluZywgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgc2hvd19zcGlfaG9zdF9zaWduYWxsaW5nLAorCQkJIHN0b3JlX3NwaV9ob3N0X3NpZ25hbGxpbmcpOworCisjZGVmaW5lIERWX1NFVCh4LCB5KQkJCVwKKwlpZihpLT5mLT5zZXRfIyN4KQkJXAorCQlpLT5mLT5zZXRfIyN4KHNkZXYtPnNkZXZfdGFyZ2V0LCB5KQorCisjZGVmaW5lIERWX0xPT1BTCTMKKyNkZWZpbmUgRFZfVElNRU9VVAkoMTAqSFopCisjZGVmaW5lIERWX1JFVFJJRVMJMwkvKiBzaG91bGQgb25seSBuZWVkIGF0IG1vc3QgCisJCQkJICogdHdvIGNjL3VhIGNsZWFycyAqLworCitlbnVtIHNwaV9jb21wYXJlX3JldHVybnMgeworCVNQSV9DT01QQVJFX1NVQ0NFU1MsCisJU1BJX0NPTVBBUkVfRkFJTFVSRSwKKwlTUElfQ09NUEFSRV9TS0lQX1RFU1QsCit9OworCisKKy8qIFRoaXMgaXMgZm9yIHJlYWQvd3JpdGUgRG9tYWluIFZhbGlkYXRpb246ICBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzCisgKiBhbiBlY2hvIGJ1ZmZlciwgd2UgZG8gcmVhZC93cml0ZSB0ZXN0cyB0byBpdCAqLworc3RhdGljIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucworc3BpX2R2X2RldmljZV9lY2hvX2J1ZmZlcihzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpzcmVxLCB1OCAqYnVmZmVyLAorCQkJICB1OCAqcHRyLCBjb25zdCBpbnQgcmV0cmllcykKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJaW50IGxlbiA9IHB0ciAtIGJ1ZmZlcjsKKwlpbnQgaiwgaywgcjsKKwl1bnNpZ25lZCBpbnQgcGF0dGVybiA9IDB4MDAwMGZmZmY7CisKKwljb25zdCBjaGFyIHNwaV93cml0ZV9idWZmZXJbXSA9IHsKKwkJV1JJVEVfQlVGRkVSLCAweDBhLCAwLCAwLCAwLCAwLCAwLCBsZW4gPj4gOCwgbGVuICYgMHhmZiwgMAorCX07CisJY29uc3QgY2hhciBzcGlfcmVhZF9idWZmZXJbXSA9IHsKKwkJUkVBRF9CVUZGRVIsIDB4MGEsIDAsIDAsIDAsIDAsIDAsIGxlbiA+PiA4LCBsZW4gJiAweGZmLCAwCisJfTsKKworCS8qIHNldCB1cCB0aGUgcGF0dGVybiBidWZmZXIuICBEb2Vzbid0IG1hdHRlciBpZiB3ZSBzcGlsbAorCSAqIHNsaWdodGx5IGJleW9uZCBzaW5jZSB0aGF0J3Mgd2hlcmUgdGhlIHJlYWQgYnVmZmVyIGlzICovCisJZm9yIChqID0gMDsgaiA8IGxlbjsgKSB7CisKKwkJLyogZmlsbCB0aGUgYnVmZmVyIHdpdGggY291bnRpbmcgKHRlc3QgYSkgKi8KKwkJZm9yICggOyBqIDwgbWluKGxlbiwgMzIpOyBqKyspCisJCQlidWZmZXJbal0gPSBqOworCQlrID0gajsKKwkJLyogZmlsbCB0aGUgYnVmZmVyIHdpdGggYWx0ZXJuYXRpbmcgd29yZHMgb2YgMHgwIGFuZAorCQkgKiAweGZmZmYgKHRlc3QgYikgKi8KKwkJZm9yICggOyBqIDwgbWluKGxlbiwgayArIDMyKTsgaiArPSAyKSB7CisJCQl1MTYgKndvcmQgPSAodTE2ICopJmJ1ZmZlcltqXTsKKwkJCQorCQkJKndvcmQgPSAoaiAmIDB4MDIpID8gMHgwMDAwIDogMHhmZmZmOworCQl9CisJCWsgPSBqOworCQkvKiBmaWxsIHdpdGggY3Jvc3N0YWxrIChhbHRlcm5hdGluZyAweDU1NTUgMHhhYWEpCisgICAgICAgICAgICAgICAgICogKHRlc3QgYykgKi8KKwkJZm9yICggOyBqIDwgbWluKGxlbiwgayArIDMyKTsgaiArPSAyKSB7CisJCQl1MTYgKndvcmQgPSAodTE2ICopJmJ1ZmZlcltqXTsKKworCQkJKndvcmQgPSAoaiAmIDB4MDIpID8gMHg1NTU1IDogMHhhYWFhOworCQl9CisJCWsgPSBqOworCQkvKiBmaWxsIHdpdGggc2hpZnRpbmcgYml0cyAodGVzdCBkKSAqLworCQlmb3IgKCA7IGogPCBtaW4obGVuLCBrICsgMzIpOyBqICs9IDQpIHsKKwkJCXUzMiAqd29yZCA9ICh1bnNpZ25lZCBpbnQgKikmYnVmZmVyW2pdOworCQkJdTMyIHJvbGwgPSAocGF0dGVybiAmIDB4ODAwMDAwMDApID8gMSA6IDA7CisJCQkKKwkJCSp3b3JkID0gcGF0dGVybjsKKwkJCXBhdHRlcm4gPSAocGF0dGVybiA8PCAxKSB8IHJvbGw7CisJCX0KKwkJLyogZG9uJ3QgYm90aGVyIHdpdGggcmFuZG9tIGRhdGEgKHRlc3QgZSkgKi8KKwl9CisKKwlmb3IgKHIgPSAwOyByIDwgcmV0cmllczsgcisrKSB7CisJCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwkvKiB3YWl0X3JlcSB0byBmaWxsIGluICovCisJCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwkJc2NzaV93YWl0X3JlcShzcmVxLCBzcGlfd3JpdGVfYnVmZmVyLCBidWZmZXIsIGxlbiwKKwkJCSAgICAgIERWX1RJTUVPVVQsIERWX1JFVFJJRVMpOworCQlpZihzcmVxLT5zcl9yZXN1bHQgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgeworCQkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCisJCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9RVUlFU0NFKTsKKwkJCWlmIChzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKHNyZXEsICZzc2hkcikKKwkJCSAgICAmJiBzc2hkci5zZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUCisJCQkgICAgLyogSU5WQUxJRCBGSUVMRCBJTiBDREIgKi8KKwkJCSAgICAmJiBzc2hkci5hc2MgPT0gMHgyNCAmJiBzc2hkci5hc2NxID09IDB4MDApCisJCQkJLyogVGhpcyB3b3VsZCBtZWFuIHRoYXQgdGhlIGRyaXZlIGxpZWQKKwkJCQkgKiB0byB1cyBhYm91dCBzdXBwb3J0aW5nIGFuIGVjaG8KKwkJCQkgKiBidWZmZXIgKHVuZm9ydHVuYXRlbHkgc29tZSBXZXN0ZXJuCisJCQkJICogRGlnaXRhbCBkcml2ZXMgZG8gcHJlY2lzZWx5IHRoaXMpCisJCQkJICovCisJCQkJcmV0dXJuIFNQSV9DT01QQVJFX1NLSVBfVEVTVDsKKworCisJCQlTUElfUFJJTlRLKHNkZXYtPnNkZXZfdGFyZ2V0LCBLRVJOX0VSUiwgIldyaXRlIEJ1ZmZlciBmYWlsdXJlICV4XG4iLCBzcmVxLT5zcl9yZXN1bHQpOworCQkJcmV0dXJuIFNQSV9DT01QQVJFX0ZBSUxVUkU7CisJCX0KKworCQltZW1zZXQocHRyLCAwLCBsZW4pOworCQlzcmVxLT5zcl9jbWRfbGVuID0gMDsJLyogd2FpdF9yZXEgdG8gZmlsbCBpbiAqLworCQlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJc2NzaV93YWl0X3JlcShzcmVxLCBzcGlfcmVhZF9idWZmZXIsIHB0ciwgbGVuLAorCQkJICAgICAgRFZfVElNRU9VVCwgRFZfUkVUUklFUyk7CisJCXNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX1FVSUVTQ0UpOworCisJCWlmIChtZW1jbXAoYnVmZmVyLCBwdHIsIGxlbikgIT0gMCkKKwkJCXJldHVybiBTUElfQ09NUEFSRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gU1BJX0NPTVBBUkVfU1VDQ0VTUzsKK30KKworLyogVGhpcyBpcyBmb3IgdGhlIHNpbXBsZXN0IGZvcm0gb2YgRG9tYWluIFZhbGlkYXRpb246IGEgcmVhZCB0ZXN0CisgKiBvbiB0aGUgaW5xdWlyeSBkYXRhIGZyb20gdGhlIGRldmljZSAqLworc3RhdGljIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucworc3BpX2R2X2RldmljZV9jb21wYXJlX2lucXVpcnkoc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlciwKKwkJCSAgICAgIHU4ICpwdHIsIGNvbnN0IGludCByZXRyaWVzKQoreworCWludCByOworCWNvbnN0IGludCBsZW4gPSBzcmVxLT5zcl9kZXZpY2UtPmlucXVpcnlfbGVuOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsKKwljb25zdCBjaGFyIHNwaV9pbnF1aXJ5W10gPSB7CisJCUlOUVVJUlksIDAsIDAsIDAsIGxlbiwgMAorCX07CisKKwlmb3IgKHIgPSAwOyByIDwgcmV0cmllczsgcisrKSB7CisJCXNyZXEtPnNyX2NtZF9sZW4gPSAwOwkvKiB3YWl0X3JlcSB0byBmaWxsIGluICovCisJCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCisJCW1lbXNldChwdHIsIDAsIGxlbik7CisKKwkJc2NzaV93YWl0X3JlcShzcmVxLCBzcGlfaW5xdWlyeSwgcHRyLCBsZW4sCisJCQkgICAgICBEVl9USU1FT1VULCBEVl9SRVRSSUVTKTsKKwkJCisJCWlmKHNyZXEtPnNyX3Jlc3VsdCB8fCAhc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpKSB7CisJCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9RVUlFU0NFKTsKKwkJCXJldHVybiBTUElfQ09NUEFSRV9GQUlMVVJFOworCQl9CisKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgaW5xdWlyeSBkYXRhIGFscmVhZHksIHRoZQorCQkgKiBmaXJzdCByZWFkIGdldHMgaXQgKi8KKwkJaWYgKHB0ciA9PSBidWZmZXIpIHsKKwkJCXB0ciArPSBsZW47CisJCQktLXI7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtZW1jbXAoYnVmZmVyLCBwdHIsIGxlbikgIT0gMCkKKwkJCS8qIGZhaWx1cmUgKi8KKwkJCXJldHVybiBTUElfQ09NUEFSRV9GQUlMVVJFOworCX0KKwlyZXR1cm4gU1BJX0NPTVBBUkVfU1VDQ0VTUzsKK30KKworc3RhdGljIGVudW0gc3BpX2NvbXBhcmVfcmV0dXJucworc3BpX2R2X3JldHJhaW4oc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSwgdTggKmJ1ZmZlciwgdTggKnB0ciwKKwkgICAgICAgZW51bSBzcGlfY29tcGFyZV9yZXR1cm5zIAorCSAgICAgICAoKmNvbXBhcmVfZm4pKHN0cnVjdCBzY3NpX3JlcXVlc3QgKiwgdTggKiwgdTggKiwgaW50KSkKK3sKKwlzdHJ1Y3Qgc3BpX2ludGVybmFsICppID0gdG9fc3BpX2ludGVybmFsKHNyZXEtPnNyX2hvc3QtPnRyYW5zcG9ydHQpOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNyZXEtPnNyX2RldmljZTsKKwlpbnQgcGVyaW9kID0gMCwgcHJldnBlcmlvZCA9IDA7IAorCWVudW0gc3BpX2NvbXBhcmVfcmV0dXJucyByZXR2YWw7CisKKworCWZvciAoOzspIHsKKwkJaW50IG5ld3BlcmlvZDsKKwkJcmV0dmFsID0gY29tcGFyZV9mbihzcmVxLCBidWZmZXIsIHB0ciwgRFZfTE9PUFMpOworCisJCWlmIChyZXR2YWwgPT0gU1BJX0NPTVBBUkVfU1VDQ0VTUworCQkgICAgfHwgcmV0dmFsID09IFNQSV9DT01QQVJFX1NLSVBfVEVTVCkKKwkJCWJyZWFrOworCisJCS8qIE9LLCByZXRyYWluLCBmYWxsYmFjayAqLworCQlpZiAoaS0+Zi0+Z2V0X3BlcmlvZCkKKwkJCWktPmYtPmdldF9wZXJpb2Qoc2Rldi0+c2Rldl90YXJnZXQpOworCQluZXdwZXJpb2QgPSBzcGlfcGVyaW9kKHNkZXYtPnNkZXZfdGFyZ2V0KTsKKwkJcGVyaW9kID0gbmV3cGVyaW9kID4gcGVyaW9kID8gbmV3cGVyaW9kIDogcGVyaW9kOworCQlpZiAocGVyaW9kIDwgMHgwZCkKKwkJCXBlcmlvZCsrOworCQllbHNlCisJCQlwZXJpb2QgKz0gcGVyaW9kID4+IDE7CisKKwkJaWYgKHVubGlrZWx5KHBlcmlvZCA+IDB4ZmYgfHwgcGVyaW9kID09IHByZXZwZXJpb2QpKSB7CisJCQkvKiBUb3RhbCBmYWlsdXJlOyBzZXQgdG8gYXN5bmMgYW5kIHJldHVybiAqLworCQkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9FUlIsICJEb21haW4gVmFsaWRhdGlvbiBGYWlsdXJlLCBkcm9wcGluZyBiYWNrIHRvIEFzeW5jaHJvbm91c1xuIik7CisJCQlEVl9TRVQob2Zmc2V0LCAwKTsKKwkJCXJldHVybiBTUElfQ09NUEFSRV9GQUlMVVJFOworCQl9CisJCVNQSV9QUklOVEsoc2Rldi0+c2Rldl90YXJnZXQsIEtFUk5fRVJSLCAiRG9tYWluIFZhbGlkYXRpb24gZGV0ZWN0ZWQgZmFpbHVyZSwgZHJvcHBpbmcgYmFja1xuIik7CisJCURWX1NFVChwZXJpb2QsIHBlcmlvZCk7CisJCXByZXZwZXJpb2QgPSBwZXJpb2Q7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3NwaV9kdl9kZXZpY2VfZ2V0X2VjaG9fYnVmZmVyKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIpCit7CisJaW50IGw7CisKKwkvKiBmaXJzdCBvZmYgZG8gYSB0ZXN0IHVuaXQgcmVhZHkuICBUaGlzIGNhbiBlcnJvciBvdXQgCisJICogYmVjYXVzZSBvZiByZXNlcnZhdGlvbnMgb3Igc29tZSBvdGhlciByZWFzb24uICBJZiBpdAorCSAqIGZhaWxzLCB0aGUgZGV2aWNlIHdvbid0IGxldCB1cyB3cml0ZSB0byB0aGUgZWNobyBidWZmZXIKKwkgKiBzbyBqdXN0IHJldHVybiBmYWlsdXJlICovCisJCisJY29uc3QgY2hhciBzcGlfdGVzdF91bml0X3JlYWR5W10gPSB7CisJCVRFU1RfVU5JVF9SRUFEWSwgMCwgMCwgMCwgMCwgMAorCX07CisKKwljb25zdCBjaGFyIHNwaV9yZWFkX2J1ZmZlcl9kZXNjcmlwdG9yW10gPSB7CisJCVJFQURfQlVGRkVSLCAweDBiLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCAwCisJfTsKKworCQorCXNyZXEtPnNyX2NtZF9sZW4gPSAwOworCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisKKwkvKiBXZSBzZW5kIGEgc2V0IG9mIHRocmVlIFRVUnMgdG8gY2xlYXIgYW55IG91dHN0YW5kaW5nIAorCSAqIHVuaXQgYXR0ZW50aW9uIGNvbmRpdGlvbnMgaWYgdGhleSBleGlzdCAoT3RoZXJ3aXNlIHRoZQorCSAqIGJ1ZmZlciB0ZXN0cyB3b24ndCBiZSBoYXBweSkuICBJZiB0aGUgVFVSIHN0aWxsIGZhaWxzCisJICogKHJlc2VydmF0aW9uIGNvbmZsaWN0LCBkZXZpY2Ugbm90IHJlYWR5LCBldGMpIGp1c3QKKwkgKiBza2lwIHRoZSB3cml0ZSB0ZXN0cyAqLworCWZvciAobCA9IDA7IDsgbCsrKSB7CisJCXNjc2lfd2FpdF9yZXEoc3JlcSwgc3BpX3Rlc3RfdW5pdF9yZWFkeSwgTlVMTCwgMCwKKwkJCSAgICAgIERWX1RJTUVPVVQsIERWX1JFVFJJRVMpOworCisJCWlmKHNyZXEtPnNyX3Jlc3VsdCkgeworCQkJaWYobCA+PSAzKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyogVFVSIHN1Y2NlZWRlZCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcmVxLT5zcl9jbWRfbGVuID0gMDsKKwlzcmVxLT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCXNjc2lfd2FpdF9yZXEoc3JlcSwgc3BpX3JlYWRfYnVmZmVyX2Rlc2NyaXB0b3IsIGJ1ZmZlciwgNCwKKwkJICAgICAgRFZfVElNRU9VVCwgRFZfUkVUUklFUyk7CisKKwlpZiAoc3JlcS0+c3JfcmVzdWx0KQorCQkvKiBEZXZpY2UgaGFzIG5vIGVjaG8gYnVmZmVyICovCisJCXJldHVybiAwOworCisJcmV0dXJuIGJ1ZmZlclszXSArICgoYnVmZmVyWzJdICYgMHgxZikgPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkCitzcGlfZHZfZGV2aWNlX2ludGVybmFsKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIHU4ICpidWZmZXIpCit7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbChzcmVxLT5zcl9ob3N0LT50cmFuc3BvcnR0KTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBzcmVxLT5zcl9kZXZpY2U7CisJaW50IGxlbiA9IHNkZXYtPmlucXVpcnlfbGVuOworCS8qIGZpcnN0IHNldCB1cyB1cCBmb3IgbmFycm93IGFzeW5jICovCisJRFZfU0VUKG9mZnNldCwgMCk7CisJRFZfU0VUKHdpZHRoLCAwKTsKKwkKKwlpZiAoc3BpX2R2X2RldmljZV9jb21wYXJlX2lucXVpcnkoc3JlcSwgYnVmZmVyLCBidWZmZXIsIERWX0xPT1BTKQorCSAgICAhPSBTUElfQ09NUEFSRV9TVUNDRVNTKSB7CisJCVNQSV9QUklOVEsoc2Rldi0+c2Rldl90YXJnZXQsIEtFUk5fRVJSLCAiRG9tYWluIFZhbGlkYXRpb24gSW5pdGlhbCBJbnF1aXJ5IEZhaWxlZFxuIik7CisJCS8qIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgb2ZmbGluZSB0aGUgZGV2aWNlIGhlcmU/ICovCisJCXJldHVybjsKKwl9CisKKwkvKiB0ZXN0IHdpZHRoICovCisJaWYgKGktPmYtPnNldF93aWR0aCAmJiBzZGV2LT53ZHRyKSB7CisJCWktPmYtPnNldF93aWR0aChzZGV2LT5zZGV2X3RhcmdldCwgMSk7CisKKwkJaWYgKHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KHNyZXEsIGJ1ZmZlciwKKwkJCQkJCSAgIGJ1ZmZlciArIGxlbiwKKwkJCQkJCSAgIERWX0xPT1BTKQorCQkgICAgIT0gU1BJX0NPTVBBUkVfU1VDQ0VTUykgeworCQkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9FUlIsICJXaWRlIFRyYW5zZmVycyBGYWlsXG4iKTsKKwkJCWktPmYtPnNldF93aWR0aChzZGV2LT5zZGV2X3RhcmdldCwgMCk7CisJCX0KKwl9CisKKwlpZiAoIWktPmYtPnNldF9wZXJpb2QpCisJCXJldHVybjsKKworCS8qIGRldmljZSBjYW4ndCBoYW5kbGUgc3luY2hyb25vdXMgKi8KKwlpZighc2Rldi0+cHByICYmICFzZGV2LT5zZHRyKQorCQlyZXR1cm47CisKKwkvKiBzZWUgaWYgdGhlIGRldmljZSBoYXMgYW4gZWNobyBidWZmZXIuICBJZiBpdCBkb2VzIHdlIGNhbgorCSAqIGRvIHRoZSBTUEkgcGF0dGVybiB3cml0ZSB0ZXN0cyAqLworCisJbGVuID0gMDsKKwlpZiAoc2Rldi0+cHByKQorCQlsZW4gPSBzcGlfZHZfZGV2aWNlX2dldF9lY2hvX2J1ZmZlcihzcmVxLCBidWZmZXIpOworCisgcmV0cnk6CisKKwkvKiBub3cgc2V0IHVwIHRvIHRoZSBtYXhpbXVtICovCisJRFZfU0VUKG9mZnNldCwgMjU1KTsKKwlEVl9TRVQocGVyaW9kLCAxKTsKKworCWlmIChsZW4gPT0gMCkgeworCQlTUElfUFJJTlRLKHNkZXYtPnNkZXZfdGFyZ2V0LCBLRVJOX0lORk8sICJEb21haW4gVmFsaWRhdGlvbiBza2lwcGluZyB3cml0ZSB0ZXN0c1xuIik7CisJCXNwaV9kdl9yZXRyYWluKHNyZXEsIGJ1ZmZlciwgYnVmZmVyICsgbGVuLAorCQkJICAgICAgIHNwaV9kdl9kZXZpY2VfY29tcGFyZV9pbnF1aXJ5KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsZW4gPiBTUElfTUFYX0VDSE9fQlVGRkVSX1NJWkUpIHsKKwkJU1BJX1BSSU5USyhzZGV2LT5zZGV2X3RhcmdldCwgS0VSTl9XQVJOSU5HLCAiRWNobyBidWZmZXIgc2l6ZSAlZCBpcyB0b28gYmlnLCB0cmltbWluZyB0byAlZFxuIiwgbGVuLCBTUElfTUFYX0VDSE9fQlVGRkVSX1NJWkUpOworCQlsZW4gPSBTUElfTUFYX0VDSE9fQlVGRkVSX1NJWkU7CisJfQorCisJaWYgKHNwaV9kdl9yZXRyYWluKHNyZXEsIGJ1ZmZlciwgYnVmZmVyICsgbGVuLAorCQkJICAgc3BpX2R2X2RldmljZV9lY2hvX2J1ZmZlcikKKwkgICAgPT0gU1BJX0NPTVBBUkVfU0tJUF9URVNUKSB7CisJCS8qIE9LLCB0aGUgc3R1cGlkIGRyaXZlIGNhbid0IGRvIGEgd3JpdGUgZWNobyBidWZmZXIKKwkJICogdGVzdCBhZnRlciBhbGwsIGZhbGwgYmFjayB0byB0aGUgcmVhZCB0ZXN0cyAqLworCQlsZW4gPSAwOworCQlnb3RvIHJldHJ5OworCX0KK30KKworCisvKioJc3BpX2R2X2RldmljZSAtIERvIERvbWFpbiBWYWxpZGF0aW9uIG9uIHRoZSBkZXZpY2UKKyAqCUBzZGV2OgkJc2NzaSBkZXZpY2UgdG8gdmFsaWRhdGUKKyAqCisgKglQZXJmb3JtcyB0aGUgZG9tYWluIHZhbGlkYXRpb24gb24gdGhlIGdpdmVuIGRldmljZSBpbiB0aGUKKyAqCWN1cnJlbnQgZXhlY3V0aW9uIHRocmVhZC4gIFNpbmNlIERWIG9wZXJhdGlvbnMgbWF5IHNsZWVwLAorICoJdGhlIGN1cnJlbnQgdGhyZWFkIG11c3QgaGF2ZSB1c2VyIGNvbnRleHQuICBBbHNvIG5vIFNDU0kKKyAqCXJlbGF0ZWQgbG9ja3MgdGhhdCB3b3VsZCBkZWFkbG9jayBJL08gaXNzdWVkIGJ5IHRoZSBEViBtYXkKKyAqCWJlIGhlbGQuCisgKi8KK3ZvaWQKK3NwaV9kdl9kZXZpY2Uoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RldiwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7CisJdTggKmJ1ZmZlcjsKKwljb25zdCBpbnQgbGVuID0gU1BJX01BWF9FQ0hPX0JVRkZFUl9TSVpFKjI7CisKKwlpZiAodW5saWtlbHkoIXNyZXEpKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoc2NzaV9kZXZpY2VfZ2V0KHNkZXYpKSkKKwkJZ290byBvdXRfZnJlZV9yZXE7CisKKwlidWZmZXIgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAodW5saWtlbHkoIWJ1ZmZlcikpCisJCWdvdG8gb3V0X3B1dDsKKworCW1lbXNldChidWZmZXIsIDAsIGxlbik7CisKKwkvKiBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0IHRoZSBhY3R1YWwgZGV2aWNlIHdpbGwgcXVpZXNjZTsgdGhlCisJICogbGF0ZXIgdGFyZ2V0IHF1aWVzY2UgaXMganVzdCBhIG5pY2UgdG8gaGF2ZSAqLworCWlmICh1bmxpa2VseShzY3NpX2RldmljZV9xdWllc2NlKHNkZXYpKSkKKwkJZ290byBvdXRfZnJlZTsKKworCXNjc2lfdGFyZ2V0X3F1aWVzY2Uoc3RhcmdldCk7CisKKwlzcGlfZHZfcGVuZGluZyhzdGFyZ2V0KSA9IDE7CisJZG93bigmc3BpX2R2X3NlbShzdGFyZ2V0KSk7CisKKwlTUElfUFJJTlRLKHN0YXJnZXQsIEtFUk5fSU5GTywgIkJlZ2lubmluZyBEb21haW4gVmFsaWRhdGlvblxuIik7CisKKwlzcGlfZHZfZGV2aWNlX2ludGVybmFsKHNyZXEsIGJ1ZmZlcik7CisKKwlTUElfUFJJTlRLKHN0YXJnZXQsIEtFUk5fSU5GTywgIkVuZGluZyBEb21haW4gVmFsaWRhdGlvblxuIik7CisKKwl1cCgmc3BpX2R2X3NlbShzdGFyZ2V0KSk7CisJc3BpX2R2X3BlbmRpbmcoc3RhcmdldCkgPSAwOworCisJc2NzaV90YXJnZXRfcmVzdW1lKHN0YXJnZXQpOworCisJc3BpX2luaXRpYWxfZHYoc3RhcmdldCkgPSAxOworCisgb3V0X2ZyZWU6CisJa2ZyZWUoYnVmZmVyKTsKKyBvdXRfcHV0OgorCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKyBvdXRfZnJlZV9yZXE6CisJc2NzaV9yZWxlYXNlX3JlcXVlc3Qoc3JlcSk7Cit9CitFWFBPUlRfU1lNQk9MKHNwaV9kdl9kZXZpY2UpOworCitzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKnNkZXY7Cit9OworCitzdGF0aWMgdm9pZAorc3BpX2R2X2RldmljZV93b3JrX3dyYXBwZXIodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyICp3cXcgPSAoc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciAqKWRhdGE7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gd3F3LT5zZGV2OworCisJa2ZyZWUod3F3KTsKKwlzcGlfZHZfZGV2aWNlKHNkZXYpOworCXNwaV9kdl9wZW5kaW5nKHNkZXYtPnNkZXZfdGFyZ2V0KSA9IDA7CisJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworfQorCisKKy8qKgorICoJc3BpX3NjaGVkdWxlX2R2X2RldmljZSAtIHNjaGVkdWxlIGRvbWFpbiB2YWxpZGF0aW9uIHRvIG9jY3VyIG9uIHRoZSBkZXZpY2UKKyAqCUBzZGV2OglUaGUgZGV2aWNlIHRvIHZhbGlkYXRlCisgKgorICoJSWRlbnRpY2FsIHRvIHNwaV9kdl9kZXZpY2UoKSBhYm92ZSwgZXhjZXB0IHRoYXQgdGhlIERWIHdpbGwgYmUKKyAqCXNjaGVkdWxlZCB0byBvY2N1ciBpbiBhIHdvcmtxdWV1ZSBsYXRlci4gIEFsbCBtZW1vcnkgYWxsb2NhdGlvbnMKKyAqCWFyZSBhdG9taWMsIHNvIG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dCBpbmNsdWRpbmcgdGhvc2UgaG9sZGluZworICoJU0NTSSBsb2Nrcy4KKyAqLwordm9pZAorc3BpX3NjaGVkdWxlX2R2X2RldmljZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciAqd3F3ID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciksIEdGUF9BVE9NSUMpOworCisJaWYgKHVubGlrZWx5KCF3cXcpKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoc3BpX2R2X3BlbmRpbmcoc2Rldi0+c2Rldl90YXJnZXQpKSkgeworCQlrZnJlZSh3cXcpOworCQlyZXR1cm47CisJfQorCS8qIFNldCBwZW5kaW5nIGVhcmx5IChkdl9kZXZpY2UgZG9lc24ndCBjaGVjayBpdCwgb25seSBzZXRzIGl0KSAqLworCXNwaV9kdl9wZW5kaW5nKHNkZXYtPnNkZXZfdGFyZ2V0KSA9IDE7CisJaWYgKHVubGlrZWx5KHNjc2lfZGV2aWNlX2dldChzZGV2KSkpIHsKKwkJa2ZyZWUod3F3KTsKKwkJc3BpX2R2X3BlbmRpbmcoc2Rldi0+c2Rldl90YXJnZXQpID0gMDsKKwkJcmV0dXJuOworCX0KKworCUlOSVRfV09SSygmd3F3LT53b3JrLCBzcGlfZHZfZGV2aWNlX3dvcmtfd3JhcHBlciwgd3F3KTsKKwl3cXctPnNkZXYgPSBzZGV2OworCisJc2NoZWR1bGVfd29yaygmd3F3LT53b3JrKTsKK30KK0VYUE9SVF9TWU1CT0woc3BpX3NjaGVkdWxlX2R2X2RldmljZSk7CisKKy8qKgorICogc3BpX2Rpc3BsYXlfeGZlcl9hZ3JlZW1lbnQgLSBQcmludCB0aGUgY3VycmVudCB0YXJnZXQgdHJhbnNmZXIgYWdyZWVtZW50CisgKiBAc3RhcmdldDogVGhlIHRhcmdldCBmb3Igd2hpY2ggdG8gZGlzcGxheSB0aGUgYWdyZWVtZW50CisgKgorICogRWFjaCBTUEkgcG9ydCBpcyByZXF1aXJlZCB0byBtYWludGFpbiBhIHRyYW5zZmVyIGFncmVlbWVudCBmb3IgZWFjaAorICogb3RoZXIgcG9ydCBvbiB0aGUgYnVzLiAgVGhpcyBmdW5jdGlvbiBwcmludHMgYSBvbmUtbGluZSBzdW1tYXJ5IG9mCisgKiB0aGUgY3VycmVudCBhZ3JlZW1lbnQ7IG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHN5c2ZzLgorICovCit2b2lkIHNwaV9kaXNwbGF5X3hmZXJfYWdyZWVtZW50KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zcG9ydF9hdHRycyAqdHA7CisJdHAgPSAoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMgKikmc3RhcmdldC0+c3RhcmdldF9kYXRhOworCisJaWYgKHRwLT5vZmZzZXQgPiAwICYmIHRwLT5wZXJpb2QgPiAwKSB7CisJCXVuc2lnbmVkIGludCBwaWNvc2VjLCBrYjEwMDsKKwkJY2hhciAqc2NzaSA9ICJGQVNULT8iOworCQljaGFyIHRtcFs4XTsKKworCQlpZiAodHAtPnBlcmlvZCA8PSBTUElfU1RBVElDX1BQUikgeworCQkJcGljb3NlYyA9IHBwcl90b19wc1t0cC0+cGVyaW9kXTsKKwkJCXN3aXRjaCAodHAtPnBlcmlvZCkgeworCQkJCWNhc2UgIDc6IHNjc2kgPSAiRkFTVC0zMjAiOyBicmVhazsKKwkJCQljYXNlICA4OiBzY3NpID0gIkZBU1QtMTYwIjsgYnJlYWs7CisJCQkJY2FzZSAgOTogc2NzaSA9ICJGQVNULTgwIjsgYnJlYWs7CisJCQkJY2FzZSAxMDoKKwkJCQljYXNlIDExOiBzY3NpID0gIkZBU1QtNDAiOyBicmVhazsKKwkJCQljYXNlIDEyOiBzY3NpID0gIkZBU1QtMjAiOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBpY29zZWMgPSB0cC0+cGVyaW9kICogNDAwMDsKKwkJCWlmICh0cC0+cGVyaW9kIDwgMjUpCisJCQkJc2NzaSA9ICJGQVNULTIwIjsKKwkJCWVsc2UgaWYgKHRwLT5wZXJpb2QgPCA1MCkKKwkJCQlzY3NpID0gIkZBU1QtMTAiOworCQkJZWxzZQorCQkJCXNjc2kgPSAiRkFTVC01IjsKKwkJfQorCisJCWtiMTAwID0gKDEwMDAwMDAwICsgcGljb3NlYyAvIDIpIC8gcGljb3NlYzsKKwkJaWYgKHRwLT53aWR0aCkKKwkJCWtiMTAwICo9IDI7CisJCXNwcmludF9mcmFjKHRtcCwgcGljb3NlYywgMTAwMCk7CisKKwkJZGV2X2luZm8oJnN0YXJnZXQtPmRldiwKKwkJCSIlcyAlc1NDU0kgJWQuJWQgTUIvcyAlcyVzJXMgKCVzIG5zLCBvZmZzZXQgJWQpXG4iLAorCQkJc2NzaSwgdHAtPndpZHRoID8gIldJREUgIiA6ICIiLCBrYjEwMC8xMCwga2IxMDAgJSAxMCwKKwkJCXRwLT5kdCA/ICJEVCIgOiAiU1QiLCB0cC0+aXUgPyAiIElVIiA6ICIiLAorCQkJdHAtPnFhcyAgPyAiIFFBUyIgOiAiIiwgdG1wLCB0cC0+b2Zmc2V0KTsKKwl9IGVsc2UgeworCQlkZXZfaW5mbygmc3RhcmdldC0+ZGV2LCAiJXNhc3luY2hyb25vdXMuXG4iLAorCQkJCXRwLT53aWR0aCA/ICJ3aWRlICIgOiAiIik7CisJfQorfQorRVhQT1JUX1NZTUJPTChzcGlfZGlzcGxheV94ZmVyX2FncmVlbWVudCk7CisKKyNkZWZpbmUgU0VUVVBfQVRUUklCVVRFKGZpZWxkKQkJCQkJCVwKKwlpLT5wcml2YXRlX2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyXyMjZmllbGQ7CQlcCisJaWYgKCFpLT5mLT5zZXRfIyNmaWVsZCkgewkJCQkJXAorCQlpLT5wcml2YXRlX2F0dHJzW2NvdW50XS5hdHRyLm1vZGUgPSBTX0lSVUdPOwkJXAorCQlpLT5wcml2YXRlX2F0dHJzW2NvdW50XS5zdG9yZSA9IE5VTEw7CQkJXAorCX0JCQkJCQkJCVwKKwlpLT5hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9hdHRyc1tjb3VudF07CQkJXAorCWlmIChpLT5mLT5zaG93XyMjZmllbGQpCQkJCQkJXAorCQljb3VudCsrCisKKyNkZWZpbmUgU0VUVVBfSE9TVF9BVFRSSUJVVEUoZmllbGQpCQkJCQlcCisJaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XSA9IGNsYXNzX2RldmljZV9hdHRyXyMjZmllbGQ7CVwKKwlpZiAoIWktPmYtPnNldF8jI2ZpZWxkKSB7CQkJCQlcCisJCWktPnByaXZhdGVfaG9zdF9hdHRyc1tjb3VudF0uYXR0ci5tb2RlID0gU19JUlVHTzsJXAorCQlpLT5wcml2YXRlX2hvc3RfYXR0cnNbY291bnRdLnN0b3JlID0gTlVMTDsJCVwKKwl9CQkJCQkJCQlcCisJaS0+aG9zdF9hdHRyc1tjb3VudF0gPSAmaS0+cHJpdmF0ZV9ob3N0X2F0dHJzW2NvdW50XTsJCVwKKwljb3VudCsrCisKK3N0YXRpYyBpbnQgc3BpX2RldmljZV9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCisJaWYgKCFzY3NpX2lzX3NkZXZfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc2hvc3QgPSBzZGV2LT5ob3N0OworCWlmICghc2hvc3QtPnRyYW5zcG9ydHQgIHx8IHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X2F0dHJzLmFjLmNsYXNzCisJICAgICE9ICZzcGlfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisJLyogTm90ZTogdGhpcyBjbGFzcyBoYXMgbm8gZGV2aWNlIGF0dHJpYnV0ZXMsIHNvIGl0IGhhcworCSAqIG5vIHBlci1IQkEgYWxsb2NhdGlvbiBhbmQgdGh1cyB3ZSBkb24ndCBuZWVkIHRvIGRpc3Rpbmd1aXNoCisJICogdGhlIGF0dHJpYnV0ZSBjb250YWluZXJzIGZvciB0aGUgZGV2aWNlICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3RhcmdldF9tYXRjaChzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udCwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaTsKKworCWlmICghc2NzaV9pc190YXJnZXRfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2LT5wYXJlbnQpOworCWlmICghc2hvc3QtPnRyYW5zcG9ydHQgIHx8IHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X2F0dHJzLmFjLmNsYXNzCisJICAgICE9ICZzcGlfaG9zdF9jbGFzcy5jbGFzcykKKwkJcmV0dXJuIDA7CisKKwlpID0gdG9fc3BpX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKKwkKKwlyZXR1cm4gJmktPnQudGFyZ2V0X2F0dHJzLmFjID09IGNvbnQ7Cit9CisKK3N0YXRpYyBERUNMQVJFX1RSQU5TUE9SVF9DTEFTUyhzcGlfdHJhbnNwb3J0X2NsYXNzLAorCQkJICAgICAgICJzcGlfdHJhbnNwb3J0IiwKKwkJCSAgICAgICBzcGlfc2V0dXBfdHJhbnNwb3J0X2F0dHJzLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgTlVMTCk7CisKK3N0YXRpYyBERUNMQVJFX0FOT05fVFJBTlNQT1JUX0NMQVNTKHNwaV9kZXZpY2VfY2xhc3MsCisJCQkJICAgIHNwaV9kZXZpY2VfbWF0Y2gsCisJCQkJICAgIHNwaV9kZXZpY2VfY29uZmlndXJlKTsKKworc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICoKK3NwaV9hdHRhY2hfdHJhbnNwb3J0KHN0cnVjdCBzcGlfZnVuY3Rpb25fdGVtcGxhdGUgKmZ0KQoreworCXN0cnVjdCBzcGlfaW50ZXJuYWwgKmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3BpX2ludGVybmFsKSwKKwkJCQkJIEdGUF9LRVJORUwpOworCWludCBjb3VudCA9IDA7CisJaWYgKHVubGlrZWx5KCFpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKHN0cnVjdCBzcGlfaW50ZXJuYWwpKTsKKworCisJaS0+dC50YXJnZXRfYXR0cnMuYWMuY2xhc3MgPSAmc3BpX3RyYW5zcG9ydF9jbGFzcy5jbGFzczsKKwlpLT50LnRhcmdldF9hdHRycy5hYy5hdHRycyA9ICZpLT5hdHRyc1swXTsKKwlpLT50LnRhcmdldF9hdHRycy5hYy5tYXRjaCA9IHNwaV90YXJnZXRfbWF0Y2g7CisJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmaS0+dC50YXJnZXRfYXR0cnMpOworCWktPnQudGFyZ2V0X3NpemUgPSBzaXplb2Yoc3RydWN0IHNwaV90cmFuc3BvcnRfYXR0cnMpOworCWktPnQuaG9zdF9hdHRycy5hYy5jbGFzcyA9ICZzcGlfaG9zdF9jbGFzcy5jbGFzczsKKwlpLT50Lmhvc3RfYXR0cnMuYWMuYXR0cnMgPSAmaS0+aG9zdF9hdHRyc1swXTsKKwlpLT50Lmhvc3RfYXR0cnMuYWMubWF0Y2ggPSBzcGlfaG9zdF9tYXRjaDsKKwl0cmFuc3BvcnRfY29udGFpbmVyX3JlZ2lzdGVyKCZpLT50Lmhvc3RfYXR0cnMpOworCWktPnQuaG9zdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzcGlfaG9zdF9hdHRycyk7CisJaS0+ZiA9IGZ0OworCisJU0VUVVBfQVRUUklCVVRFKHBlcmlvZCk7CisJU0VUVVBfQVRUUklCVVRFKG9mZnNldCk7CisJU0VUVVBfQVRUUklCVVRFKHdpZHRoKTsKKwlTRVRVUF9BVFRSSUJVVEUoaXUpOworCVNFVFVQX0FUVFJJQlVURShkdCk7CisJU0VUVVBfQVRUUklCVVRFKHFhcyk7CisJU0VUVVBfQVRUUklCVVRFKHdyX2Zsb3cpOworCVNFVFVQX0FUVFJJQlVURShyZF9zdHJtKTsKKwlTRVRVUF9BVFRSSUJVVEUocnRpKTsKKwlTRVRVUF9BVFRSSUJVVEUocGNvbXBfZW4pOworCisJLyogaWYgeW91IGFkZCBhbiBhdHRyaWJ1dGUgYnV0IGZvcmdldCB0byBpbmNyZWFzZSBTUElfTlVNX0FUVFJTCisJICogdGhpcyBidWcgd2lsbCB0cmlnZ2VyICovCisJQlVHX09OKGNvdW50ID4gU1BJX05VTV9BVFRSUyk7CisKKwlpLT5hdHRyc1tjb3VudCsrXSA9ICZjbGFzc19kZXZpY2VfYXR0cl9yZXZhbGlkYXRlOworCisJaS0+YXR0cnNbY291bnRdID0gTlVMTDsKKworCWNvdW50ID0gMDsKKwlTRVRVUF9IT1NUX0FUVFJJQlVURShzaWduYWxsaW5nKTsKKworCUJVR19PTihjb3VudCA+IFNQSV9IT1NUX0FUVFJTKTsKKworCWktPmhvc3RfYXR0cnNbY291bnRdID0gTlVMTDsKKworCXJldHVybiAmaS0+dDsKK30KK0VYUE9SVF9TWU1CT0woc3BpX2F0dGFjaF90cmFuc3BvcnQpOworCit2b2lkIHNwaV9yZWxlYXNlX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnQpCit7CisJc3RydWN0IHNwaV9pbnRlcm5hbCAqaSA9IHRvX3NwaV9pbnRlcm5hbCh0KTsKKworCXRyYW5zcG9ydF9jb250YWluZXJfdW5yZWdpc3RlcigmaS0+dC50YXJnZXRfYXR0cnMpOworCXRyYW5zcG9ydF9jb250YWluZXJfdW5yZWdpc3RlcigmaS0+dC5ob3N0X2F0dHJzKTsKKworCWtmcmVlKGkpOworfQorRVhQT1JUX1NZTUJPTChzcGlfcmVsZWFzZV90cmFuc3BvcnQpOworCitzdGF0aWMgX19pbml0IGludCBzcGlfdHJhbnNwb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJnNwaV90cmFuc3BvcnRfY2xhc3MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gYW5vbl90cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJnNwaV9kZXZpY2VfY2xhc3MpOworCXJldHVybiB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJnNwaV9ob3N0X2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNwaV90cmFuc3BvcnRfZXhpdCh2b2lkKQoreworCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZzcGlfdHJhbnNwb3J0X2NsYXNzKTsKKwlhbm9uX3RyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZzcGlfZGV2aWNlX2NsYXNzKTsKKwl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3Rlcigmc3BpX2hvc3RfY2xhc3MpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJ0aW4gSGlja3MiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNwaV90cmFuc3BvcnRfaW5pdCk7Cittb2R1bGVfZXhpdChzcGlfdHJhbnNwb3J0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHlwZWRlZnMuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX3R5cGVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0MzEzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3R5cGVkZWZzLmgKQEAgLTAsMCArMSw2IEBACisKK3R5cGVkZWYgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBTY3NpX0hvc3RfVGVtcGxhdGU7Cit0eXBlZGVmIHN0cnVjdCBzY3NpX2RldmljZSBTY3NpX0RldmljZTsKK3R5cGVkZWYgc3RydWN0IHNjc2lfY21uZCBTY3NpX0NtbmQ7Cit0eXBlZGVmIHN0cnVjdCBzY3NpX3JlcXVlc3QgU2NzaV9SZXF1ZXN0OwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9wb2ludGVyIFNjc2lfUG9pbnRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpY2FtLmMgYi9kcml2ZXJzL3Njc2kvc2NzaWNhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODM1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaWNhbS5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogc2NzaWNhbS5jIC0gU0NTSSBDQU0gc3VwcG9ydCBmdW5jdGlvbnMsIHVzZSBmb3IgSERJT19HRVRHRU8sIGV0Yy4KKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCBEcmV3IEVja2hhcmR0CisgKiAgICAgIFZpc2lvbmFyeSBDb21wdXRpbmcgCisgKiAgICAgIChVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCisgKiAgICAgIGRyZXdAQ29sb3JhZG8uRURVCisgKiAgICAgICsxICgzMDMpIDc4Ni03OTc1CisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSBTQ1NJLUNBTSBkcmFmdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKworc3RhdGljIGludCBzZXRzaXplKHVuc2lnbmVkIGxvbmcgY2FwYWNpdHksIHVuc2lnbmVkIGludCAqY3lscywgdW5zaWduZWQgaW50ICpoZHMsCisJCSAgIHVuc2lnbmVkIGludCAqc2Vjcyk7CisKK3Vuc2lnbmVkIGNoYXIgKnNjc2lfYmlvc19wdGFibGUoc3RydWN0IGJsb2NrX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgKnJlcyA9IGttYWxsb2MoNjYsIEdGUF9LRVJORUwpOworCWlmIChyZXMpIHsKKwkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGRldi0+YmRfY29udGFpbnM7CisJCVNlY3RvciBzZWN0OworCQl2b2lkICpkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwkJaWYgKGRhdGEpIHsKKwkJCW1lbWNweShyZXMsIGRhdGEgKyAweDFiZSwgNjYpOworCQkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCX0gZWxzZSB7CisJCQlrZnJlZShyZXMpOworCQkJcmVzID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2Jpb3NfcHRhYmxlKTsKKworLyoKKyAqIEZ1bmN0aW9uIDogaW50IHNjc2ljYW1fYmlvc19wYXJhbSAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKKyAqCisgKiBQdXJwb3NlIDogdG8gZGV0ZXJtaW5lIHRoZSBCSU9TIG1hcHBpbmcgdXNlZCBmb3IgYSBkcml2ZSBpbiBhIAorICogICAgICBTQ1NJLUNBTSBzeXN0ZW0sIHN0b3JpbmcgdGhlIHJlc3VsdHMgaW4gaXAgYXMgcmVxdWlyZWQKKyAqICAgICAgYnkgdGhlIEhESU9fR0VUR0VPIGlvY3RsKCkuCisgKgorICogUmV0dXJucyA6IC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2Vzcy4KKyAqCisgKi8KKworaW50IHNjc2ljYW1fYmlvc19wYXJhbShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCByZXQ7CisKKwlwID0gc2NzaV9iaW9zX3B0YWJsZShiZGV2KTsKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCS8qIHRyeSB0byBpbmZlciBtYXBwaW5nIGZyb20gcGFydGl0aW9uIHRhYmxlICovCisJcmV0ID0gc2NzaV9wYXJ0c2l6ZShwLCAodW5zaWduZWQgbG9uZyljYXBhY2l0eSwgKHVuc2lnbmVkIGludCAqKWlwICsgMiwKKwkJCSAgICAgICAodW5zaWduZWQgaW50ICopaXAgKyAwLCAodW5zaWduZWQgaW50ICopaXAgKyAxKTsKKwlrZnJlZShwKTsKKworCWlmIChyZXQgPT0gLTEpIHsKKwkJLyogcGljayBzb21lIHN0YW5kYXJkIG1hcHBpbmcgd2l0aCBhdCBtb3N0IDEwMjQgY3lsaW5kZXJzLAorCQkgICBhbmQgYXQgbW9zdCA2MiBzZWN0b3JzIHBlciB0cmFjayAtIHRoaXMgd29ya3MgdXAgdG8KKwkJICAgNzkwNSBNQiAqLworCQlyZXQgPSBzZXRzaXplKCh1bnNpZ25lZCBsb25nKWNhcGFjaXR5LCAodW5zaWduZWQgaW50ICopaXAgKyAyLAorCQkgICAgICAgKHVuc2lnbmVkIGludCAqKWlwICsgMCwgKHVuc2lnbmVkIGludCAqKWlwICsgMSk7CisJfQorCisJLyogaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHRoZW4gYXBwYXJlbnRseSB3ZSBoYXZlIHRvIHJldHVybgorCSAgIGEgZ2VvbWV0cnkgd2l0aCBtb3JlIHRoYW4gMTAyNCBjeWxpbmRlcnMgKi8KKwlpZiAocmV0IHx8IGlwWzBdID4gMjU1IHx8IGlwWzFdID4gNjMpIHsKKwkJaWYgKChjYXBhY2l0eSA+PiAxMSkgPiA2NTUzNCkgeworCQkJaXBbMF0gPSAyNTU7CisJCQlpcFsxXSA9IDYzOworCQl9IGVsc2UgeworCQkJaXBbMF0gPSA2NDsKKwkJCWlwWzFdID0gMzI7CisJCX0KKworCQlpZiAoY2FwYWNpdHkgPiA2NTUzNSo2MyoyNTUpCisJCQlpcFsyXSA9IDY1NTM1OworCQllbHNlCisJCQlpcFsyXSA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gKGlwWzBdICogaXBbMV0pOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzY3NpY2FtX2Jpb3NfcGFyYW0pOworCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IHNjc2lfcGFydHNpemUodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIAorICogICAgIGNhcGFjaXR5LHVuc2lnbmVkIGludCAqY3lscywgdW5zaWduZWQgaW50ICpoZHMsIHVuc2lnbmVkIGludCAqc2Vjcyk7CisgKgorICogUHVycG9zZSA6IHRvIGRldGVybWluZSB0aGUgQklPUyBtYXBwaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBwYXJ0aXRpb24KKyAqICAgICAgdGFibGUsIHN0b3JpbmcgdGhlIHJlc3VsdHMgaW4gKmN5bHMsICpoZHMsIGFuZCAqc2VjcyAKKyAqCisgKiBSZXR1cm5zIDogLTEgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorICoKKyAqLworCitpbnQgc2NzaV9wYXJ0c2l6ZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgY2FwYWNpdHksCisJICAgICAgIHVuc2lnbmVkIGludCAqY3lscywgdW5zaWduZWQgaW50ICpoZHMsIHVuc2lnbmVkIGludCAqc2VjcykKK3sKKwlzdHJ1Y3QgcGFydGl0aW9uICpwID0gKHN0cnVjdCBwYXJ0aXRpb24gKilidWYsICpsYXJnZXN0ID0gTlVMTDsKKwlpbnQgaSwgbGFyZ2VzdF9jeWw7CisJaW50IGN5bCwgZXh0X2N5bCwgZW5kX2hlYWQsIGVuZF9jeWwsIGVuZF9zZWN0b3I7CisJdW5zaWduZWQgaW50IGxvZ2ljYWxfZW5kLCBwaHlzaWNhbF9lbmQsIGV4dF9waHlzaWNhbF9lbmQ7CisKKworCWlmICgqKHVuc2lnbmVkIHNob3J0ICopIChidWYgKyA2NCkgPT0gMHhBQTU1KSB7CisJCWZvciAobGFyZ2VzdF9jeWwgPSAtMSwgaSA9IDA7IGkgPCA0OyArK2ksICsrcCkgeworCQkJaWYgKCFwLT5zeXNfaW5kKQorCQkJCWNvbnRpbnVlOworI2lmZGVmIERFQlVHCisJCQlwcmludGsoInNjc2ljYW1fYmlvc19wYXJhbSA6IHBhcnRpdGlvbiAlZCBoYXMgc3lzdGVtIFxuIiwKKwkJCSAgICAgICBpKTsKKyNlbmRpZgorCQkJY3lsID0gcC0+Y3lsICsgKChwLT5zZWN0b3IgJiAweGMwKSA8PCAyKTsKKwkJCWlmIChjeWwgPiBsYXJnZXN0X2N5bCkgeworCQkJCWxhcmdlc3RfY3lsID0gY3lsOworCQkJCWxhcmdlc3QgPSBwOworCQkJfQorCQl9CisJfQorCWlmIChsYXJnZXN0KSB7CisJCWVuZF9jeWwgPSBsYXJnZXN0LT5lbmRfY3lsICsgKChsYXJnZXN0LT5lbmRfc2VjdG9yICYgMHhjMCkgPDwgMik7CisJCWVuZF9oZWFkID0gbGFyZ2VzdC0+ZW5kX2hlYWQ7CisJCWVuZF9zZWN0b3IgPSBsYXJnZXN0LT5lbmRfc2VjdG9yICYgMHgzZjsKKworCQlpZiAoZW5kX2hlYWQgKyAxID09IDAgfHwgZW5kX3NlY3RvciA9PSAwKQorCQkJcmV0dXJuIC0xOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJzY3NpY2FtX2Jpb3NfcGFyYW0gOiBlbmQgYXQgaCA9ICVkLCBjID0gJWQsIHMgPSAlZFxuIiwKKwkJICAgICAgIGVuZF9oZWFkLCBlbmRfY3lsLCBlbmRfc2VjdG9yKTsKKyNlbmRpZgorCisJCXBoeXNpY2FsX2VuZCA9IGVuZF9jeWwgKiAoZW5kX2hlYWQgKyAxKSAqIGVuZF9zZWN0b3IgKworCQkgICAgZW5kX2hlYWQgKiBlbmRfc2VjdG9yICsgZW5kX3NlY3RvcjsKKworCQkvKiBUaGlzIGlzIHRoZSBhY3R1YWwgX3NlY3Rvcl8gbnVtYmVyIGF0IHRoZSBlbmQgKi8KKwkJbG9naWNhbF9lbmQgPSBnZXRfdW5hbGlnbmVkKCZsYXJnZXN0LT5zdGFydF9zZWN0KQorCQkgICAgKyBnZXRfdW5hbGlnbmVkKCZsYXJnZXN0LT5ucl9zZWN0cyk7CisKKwkJLyogVGhpcyBpcyBmb3IgPjEwMjMgY3lsaW5kZXJzICovCisJCWV4dF9jeWwgPSAobG9naWNhbF9lbmQgLSAoZW5kX2hlYWQgKiBlbmRfc2VjdG9yICsgZW5kX3NlY3RvcikpCisJCSAgICAvIChlbmRfaGVhZCArIDEpIC8gZW5kX3NlY3RvcjsKKwkJZXh0X3BoeXNpY2FsX2VuZCA9IGV4dF9jeWwgKiAoZW5kX2hlYWQgKyAxKSAqIGVuZF9zZWN0b3IgKworCQkgICAgZW5kX2hlYWQgKiBlbmRfc2VjdG9yICsgZW5kX3NlY3RvcjsKKworI2lmZGVmIERFQlVHCisJCXByaW50aygic2NzaWNhbV9iaW9zX3BhcmFtIDogbG9naWNhbF9lbmQ9JWQgcGh5c2ljYWxfZW5kPSVkIGV4dF9waHlzaWNhbF9lbmQ9JWQgZXh0X2N5bD0lZFxuIgorCQkgICxsb2dpY2FsX2VuZCwgcGh5c2ljYWxfZW5kLCBleHRfcGh5c2ljYWxfZW5kLCBleHRfY3lsKTsKKyNlbmRpZgorCisJCWlmICgobG9naWNhbF9lbmQgPT0gcGh5c2ljYWxfZW5kKSB8fAorCQkgIChlbmRfY3lsID09IDEwMjMgJiYgZXh0X3BoeXNpY2FsX2VuZCA9PSBsb2dpY2FsX2VuZCkpIHsKKwkJCSpzZWNzID0gZW5kX3NlY3RvcjsKKwkJCSpoZHMgPSBlbmRfaGVhZCArIDE7CisJCQkqY3lscyA9IGNhcGFjaXR5IC8gKChlbmRfaGVhZCArIDEpICogZW5kX3NlY3Rvcik7CisJCQlyZXR1cm4gMDsKKwkJfQorI2lmZGVmIERFQlVHCisJCXByaW50aygic2NzaWNhbV9iaW9zX3BhcmFtIDogbG9naWNhbCAoJXUpICE9IHBoeXNpY2FsICgldSlcbiIsCisJCSAgICAgICBsb2dpY2FsX2VuZCwgcGh5c2ljYWxfZW5kKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfcGFydHNpemUpOworCisvKgorICogRnVuY3Rpb24gOiBzdGF0aWMgaW50IHNldHNpemUodW5zaWduZWQgbG9uZyBjYXBhY2l0eSx1bnNpZ25lZCBpbnQgKmN5bHMsCisgKiAgICAgIHVuc2lnbmVkIGludCAqaGRzLCB1bnNpZ25lZCBpbnQgKnNlY3MpOworICoKKyAqIFB1cnBvc2UgOiB0byBkZXRlcm1pbmUgYSBuZWFyLW9wdGltYWwgaW50IDB4MTMgbWFwcGluZyBmb3IgYQorICogICAgICBTQ1NJIGRpc2sgaW4gdGVybXMgb2YgbG9zdCBzcGFjZSBvZiBzaXplIGNhcGFjaXR5LCBzdG9yaW5nCisgKiAgICAgIHRoZSByZXN1bHRzIGluICpjeWxzLCAqaGRzLCBhbmQgKnNlY3MuCisgKgorICogUmV0dXJucyA6IC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBFeHRyYWN0ZWQgZnJvbQorICoKKyAqIFdPUktJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDNUOS4yCisgKiBEUkFGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzkyRAorICoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb24gNgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMC1NQVItOTQKKyAqIEluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLQorICogU0NTSS0yIENvbW1vbiBhY2Nlc3MgbWV0aG9kCisgKiB0cmFuc3BvcnQgYW5kIFNDU0kgaW50ZXJmYWNlIG1vZHVsZQorICogCisgKiBBTk5FWCBBIDoKKyAqCisgKiBzZXRzaXplKCkgY29udmVydHMgYSByZWFkIGNhcGFjaXR5IHZhbHVlIHRvIGludCAxM2gKKyAqIGhlYWQtY3lsaW5kZXItc2VjdG9yIHJlcXVpcmVtZW50cy4gSXQgbWluaW1pemVzIHRoZSB2YWx1ZSBmb3IKKyAqIG51bWJlciBvZiBoZWFkcyBhbmQgbWF4aW1pemVzIHRoZSBudW1iZXIgb2YgY3lsaW5kZXJzLiBUaGlzCisgKiB3aWxsIHN1cHBvcnQgcmF0aGVyIGxhcmdlIGRpc2tzIGJlZm9yZSB0aGUgbnVtYmVyIG9mIGhlYWRzCisgKiB3aWxsIG5vdCBmaXQgaW4gNCBiaXRzIChvciA2IGJpdHMpLiBUaGlzIGFsZ29yaXRobSBhbHNvCisgKiBtaW5pbWl6ZXMgdGhlIG51bWJlciBvZiBzZWN0b3JzIHRoYXQgd2lsbCBiZSB1bnVzZWQgYXQgdGhlIGVuZAorICogb2YgdGhlIGRpc2sgd2hpbGUgYWxsb3dpbmcgZm9yIHZlcnkgbGFyZ2UgZGlza3MgdG8gYmUKKyAqIGFjY29tbW9kYXRlZC4gVGhpcyBhbGdvcml0aG0gZG9lcyBub3QgdXNlIHBoeXNpY2FsIGdlb21ldHJ5LiAKKyAqLworCitzdGF0aWMgaW50IHNldHNpemUodW5zaWduZWQgbG9uZyBjYXBhY2l0eSwgdW5zaWduZWQgaW50ICpjeWxzLCB1bnNpZ25lZCBpbnQgKmhkcywKKwkJICAgdW5zaWduZWQgaW50ICpzZWNzKQoreworCXVuc2lnbmVkIGludCBydiA9IDA7CisJdW5zaWduZWQgbG9uZyBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzLCB0ZW1wOworCisJY3lsaW5kZXJzID0gMTAyNEw7CS8qIFNldCBudW1iZXIgb2YgY3lsaW5kZXJzIHRvIG1heCAqLworCXNlY3RvcnMgPSA2Mkw7CQkvKiBNYXhpbWl6ZSBzZWN0b3JzIHBlciB0cmFjayAqLworCisJdGVtcCA9IGN5bGluZGVycyAqIHNlY3RvcnM7CS8qIENvbXB1dGUgZGl2aXNvciBmb3IgaGVhZHMgKi8KKwloZWFkcyA9IGNhcGFjaXR5IC8gdGVtcDsJLyogQ29tcHV0ZSB2YWx1ZSBmb3IgbnVtYmVyIG9mIGhlYWRzICovCisJaWYgKGNhcGFjaXR5ICUgdGVtcCkgewkvKiBJZiBubyByZW1haW5kZXIsIGRvbmUhICovCisJCWhlYWRzKys7CS8qIEVsc2UsIGluY3JlbWVudCBudW1iZXIgb2YgaGVhZHMgKi8KKwkJdGVtcCA9IGN5bGluZGVycyAqIGhlYWRzOwkvKiBDb21wdXRlIGRpdmlzb3IgZm9yIHNlY3RvcnMgKi8KKwkJc2VjdG9ycyA9IGNhcGFjaXR5IC8gdGVtcDsJLyogQ29tcHV0ZSB2YWx1ZSBmb3Igc2VjdG9ycyBwZXIKKwkJCQkJCSAgIHRyYWNrICovCisJCWlmIChjYXBhY2l0eSAlIHRlbXApIHsJLyogSWYgbm8gcmVtYWluZGVyLCBkb25lISAqLworCQkJc2VjdG9ycysrOwkvKiBFbHNlLCBpbmNyZW1lbnQgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwkJCXRlbXAgPSBoZWFkcyAqIHNlY3RvcnM7CQkvKiBDb21wdXRlIGRpdmlzb3IgZm9yIGN5bGluZGVycyAqLworCQkJY3lsaW5kZXJzID0gY2FwYWNpdHkgLyB0ZW1wOwkvKiBDb21wdXRlIG51bWJlciBvZiBjeWxpbmRlcnMgKi8KKwkJfQorCX0KKwlpZiAoY3lsaW5kZXJzID09IDApCisJCXJ2ID0gKHVuc2lnbmVkKSAtMTsJLyogR2l2ZSBlcnJvciBpZiAwIGN5bGluZGVycyAqLworCisJKmN5bHMgPSAodW5zaWduZWQgaW50KSBjeWxpbmRlcnM7CS8qIFN0dWZmIHJldHVybiB2YWx1ZXMgKi8KKwkqc2VjcyA9ICh1bnNpZ25lZCBpbnQpIHNlY3RvcnM7CisJKmhkcyA9ICh1bnNpZ25lZCBpbnQpIGhlYWRzOworCXJldHVybiAocnYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFmYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTAsMCArMSwxNzQwIEBACisvKgorICogICAgICBzZC5jIENvcHlyaWdodCAoQykgMTk5MiBEcmV3IEVja2hhcmR0CisgKiAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEVyaWMgWW91bmdkYWxlCisgKgorICogICAgICBMaW51eCBzY3NpIGRpc2sgZHJpdmVyCisgKiAgICAgICAgICAgICAgSW5pdGlhbCB2ZXJzaW9uczogRHJldyBFY2toYXJkdAorICogICAgICAgICAgICAgIFN1YnNlcXVlbnQgcmV2aXNpb25zOiBFcmljIFlvdW5nZGFsZQorICoJTW9kaWZpY2F0aW9uIGhpc3Rvcnk6CisgKiAgICAgICAtIERyZXcgRWNraGFyZHQgPGRyZXdAY29sb3JhZG8uZWR1PiBvcmlnaW5hbAorICogICAgICAgLSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLm9yZz4gYWRkIHNjYXR0ZXItZ2F0aGVyLCBtdWx0aXBsZSAKKyAqICAgICAgICAgb3V0c3RhbmRpbmcgcmVxdWVzdCwgYW5kIG90aGVyIGVuaGFuY2VtZW50cy4KKyAqICAgICAgICAgU3VwcG9ydCBsb2FkYWJsZSBsb3ctbGV2ZWwgc2NzaSBkcml2ZXJzLgorICogICAgICAgLSBKaXJrYSBIYW5pa2EgPGdlb0BmZi5jdW5pLmN6PiBzdXBwb3J0IG1vcmUgc2NzaSBkaXNrcyB1c2luZyAKKyAqICAgICAgICAgZWlnaHQgbWFqb3IgbnVtYmVycy4KKyAqICAgICAgIC0gUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IHN1cHBvcnQgZGV2ZnMuCisgKgkgLSBUb3JiZW4gTWF0aGlhc2VuIDx0bW1AaW1hZ2UuZGs+IFJlc291cmNlIGFsbG9jYXRpb24gZml4ZXMgaW4gCisgKgkgICBzZF9pbml0IGFuZCBjbGVhbnVwcy4KKyAqCSAtIEFsZXggRGF2aXMgPGxldG1laW5AZXJvbHMuY29tPiBGaXggcHJvYmxlbSB3aGVyZSBwYXJ0aXRpb24gaW5mbworICoJICAgbm90IGJlaW5nIHJlYWQgaW4gc2Rfb3Blbi4gRml4IHByb2JsZW0gd2hlcmUgcmVtb3ZhYmxlIG1lZGlhIAorICoJICAgY291bGQgYmUgZWplY3RlZCBhZnRlciBzZF9vcGVuLgorICoJIC0gRG91Z2xhcyBHaWxiZXJ0IDxkZ2lsYmVydEBpbnRlcmxvZy5jb20+IGNsZWFudXAgZm9yIGxrIDIuNS54CisgKgkgLSBCYWRhcmkgUHVsYXZhcnR5IDxwYmFkYXJpQHVzLmlibS5jb20+LCBNYXR0aGV3IFdpbGNveCAKKyAqCSAgIDx3aWxseUBkZWJpYW4ub3JnPiwgS3VydCBHYXJsb2ZmIDxnYXJsb2ZmQHN1c2UuZGU+OiAKKyAqCSAgIFN1cHBvcnQgMzJrLzFNIGRpc2tzLgorICoKKyAqCUxvZ2dpbmcgcG9saWN5IChuZWVkcyBDT05GSUdfU0NTSV9MT0dHSU5HIGRlZmluZWQpOgorICoJIC0gc2V0dGluZyB1cCB0cmFuc2ZlcjogU0NTSV9MT0dfSExRVUVVRSBsZXZlbHMgMSBhbmQgMgorICoJIC0gZW5kIG9mIHRyYW5zZmVyIChiaCArIHNjc2lfbGliKTogU0NTSV9MT0dfSExDT01QTEVURSBsZXZlbCAxCisgKgkgLSBlbnRlcmluZyBzZF9pb2N0bDogU0NTSV9MT0dfSU9DVEwgbGV2ZWwgMQorICoJIC0gZW50ZXJpbmcgb3RoZXIgY29tbWFuZHM6IFNDU0lfTE9HX0hMUVVFVUUgbGV2ZWwgMworICoJTm90ZTogd2hlbiB0aGUgbG9nZ2luZyBsZXZlbCBpcyBzZXQgYnkgdGhlIHVzZXIsIGl0IG11c3QgYmUgZ3JlYXRlcgorICoJdGhhbiB0aGUgbGV2ZWwgaW5kaWNhdGVkIGFib3ZlIHRvIHRyaWdnZXIgb3V0cHV0LgkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCisKKy8qCisgKiBNb3JlIHRoYW4gZW5vdWdoIGZvciBldmVyeWJvZHkgOykgIFRoZSBodWdlIG51bWJlciBvZiBtYWpvcnMKKyAqIGlzIGEgbGVmdG92ZXIgZnJvbSAxNmJpdCBkZXZfdCBkYXlzLCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGF0CisgKiBtdWNoIG51bWJlcnNwYWNlLgorICovCisjZGVmaW5lIFNEX01BSk9SUwkxNgorCisvKgorICogVGhpcyBpcyBsaW1pdGVkIGJ5IHRoZSBuYW1pbmcgc2NoZW1lIGVuZm9yY2VkIGluIHNkX3Byb2JlLAorICogYWRkIGFub3RoZXIgY2hhcmFjdGVyIHRvIGl0IGlmIHlvdSByZWFsbHkgbmVlZCBtb3JlIGRpc2tzLgorICovCisjZGVmaW5lIFNEX01BWF9ESVNLUwkoKCgyNiAqIDI2KSArIDI2ICsgMSkgKiAyNikKKworLyoKKyAqIFRpbWUgb3V0IGluIHNlY29uZHMgZm9yIGRpc2tzIGFuZCBNYWduZXRvLW9wdGljYWxzICh3aGljaCBhcmUgc2xvd2VyKS4KKyAqLworI2RlZmluZSBTRF9USU1FT1VUCQkoMzAgKiBIWikKKyNkZWZpbmUgU0RfTU9EX1RJTUVPVVQJCSg3NSAqIEhaKQorCisvKgorICogTnVtYmVyIG9mIGFsbG93ZWQgcmV0cmllcworICovCisjZGVmaW5lIFNEX01BWF9SRVRSSUVTCQk1CisjZGVmaW5lIFNEX1BBU1NUSFJPVUdIX1JFVFJJRVMJMQorCitzdGF0aWMgdm9pZCBzY3NpX2Rpc2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK3N0cnVjdCBzY3NpX2Rpc2sgeworCXN0cnVjdCBzY3NpX2RyaXZlciAqZHJpdmVyOwkvKiBhbHdheXMgJnNkX3RlbXBsYXRlICovCisJc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGtyZWYJa3JlZjsKKwlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKKwl1bnNpZ25lZCBpbnQJb3BlbmVyczsJLyogcHJvdGVjdGVkIGJ5IEJLTCBmb3Igbm93LCB5dWNrICovCisJc2VjdG9yX3QJY2FwYWNpdHk7CS8qIHNpemUgaW4gNTEyLWJ5dGUgc2VjdG9ycyAqLworCXUzMgkJaW5kZXg7CisJdTgJCW1lZGlhX3ByZXNlbnQ7CisJdTgJCXdyaXRlX3Byb3Q7CisJdW5zaWduZWQJV0NFIDogMTsJLyogc3RhdGUgb2YgZGlzayBXQ0UgYml0ICovCisJdW5zaWduZWQJUkNEIDogMTsJLyogc3RhdGUgb2YgZGlzayBSQ0QgYml0LCB1bnVzZWQgKi8KK307CisKK3N0YXRpYyBERUZJTkVfSURSKHNkX2luZGV4X2lkcik7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNkX2luZGV4X2xvY2spOworCisvKiBUaGlzIHNlbWFwaG9yZSBpcyB1c2VkIHRvIG1lZGlhdGUgdGhlIDAtPjEgcmVmZXJlbmNlIGdldCBpbiB0aGUKKyAqIGZhY2Ugb2Ygb2JqZWN0IGRlc3RydWN0aW9uIChpLmUuIHdlIGNhbid0IGFsbG93IGEgZ2V0IG9uIGFuCisgKiBvYmplY3QgYWZ0ZXIgbGFzdCBwdXQpICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChzZF9yZWZfc2VtKTsKKworc3RhdGljIGludCBzZF9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spOworc3RhdGljIHZvaWQgc2RfcndfaW50cihzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpOworCitzdGF0aWMgaW50IHNkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHNkX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIHZvaWQgc2Rfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNkX3Jlc2NhbihzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBzZF9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgc2RfaXNzdWVfZmx1c2goc3RydWN0IGRldmljZSAqLCBzZWN0b3JfdCAqKTsKK3N0YXRpYyB2b2lkIHNkX2VuZF9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CitzdGF0aWMgaW50IHNkX3ByZXBhcmVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOworc3RhdGljIHZvaWQgc2RfcmVhZF9jYXBhY2l0eShzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKKwkJIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOworCitzdGF0aWMgc3RydWN0IHNjc2lfZHJpdmVyIHNkX3RlbXBsYXRlID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdlbmRydiA9IHsKKwkJLm5hbWUJCT0gInNkIiwKKwkJLnByb2JlCQk9IHNkX3Byb2JlLAorCQkucmVtb3ZlCQk9IHNkX3JlbW92ZSwKKwkJLnNodXRkb3duCT0gc2Rfc2h1dGRvd24sCisJfSwKKwkucmVzY2FuCQkJPSBzZF9yZXNjYW4sCisJLmluaXRfY29tbWFuZAkJPSBzZF9pbml0X2NvbW1hbmQsCisJLmlzc3VlX2ZsdXNoCQk9IHNkX2lzc3VlX2ZsdXNoLAorCS5wcmVwYXJlX2ZsdXNoCQk9IHNkX3ByZXBhcmVfZmx1c2gsCisJLmVuZF9mbHVzaAkJPSBzZF9lbmRfZmx1c2gsCit9OworCisvKgorICogRGV2aWNlIG5vIHRvIGRpc2sgbWFwcGluZzoKKyAqIAorICogICAgICAgbWFqb3IgICAgICAgICBkaXNjMiAgICAgZGlzYyAgcDEKKyAqICAgfC4uLi4uLi4uLi4uLnwuLi4uLi4uLi4uLi4ufC4uLi58Li4uLnwgPC0gZGV2X3QKKyAqICAgIDMxICAgICAgICAyMCAxOSAgICAgICAgICA4IDcgIDQgMyAgMAorICogCisgKiBJbnNpZGUgYSBtYWpvciwgd2UgaGF2ZSAxNmsgZGlza3MsIGhvd2V2ZXIgbWFwcGVkIG5vbi0KKyAqIGNvbnRpZ3VvdXNseS4gVGhlIGZpcnN0IDE2IGRpc2tzIGFyZSBmb3IgbWFqb3IwLCB0aGUgbmV4dAorICogb25lcyB3aXRoIG1ham9yMSwgLi4uIERpc2sgMjU2IGlzIGZvciBtYWpvcjAgYWdhaW4sIGRpc2sgMjcyIAorICogZm9yIG1ham9yMSwgLi4uIAorICogQXMgd2Ugc3RheSBjb21wYXRpYmxlIHdpdGggb3VyIG51bWJlcmluZyBzY2hlbWUsIHdlIGNhbiByZXVzZSAKKyAqIHRoZSB3ZWxsLWtub3cgU0NTSSBtYWpvcnMgOCwgNjUtLTcxLCAxMzYtLTE0My4KKyAqLworc3RhdGljIGludCBzZF9tYWpvcihpbnQgbWFqb3JfaWR4KQoreworCXN3aXRjaCAobWFqb3JfaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gU0NTSV9ESVNLMF9NQUpPUjsKKwljYXNlIDEgLi4uIDc6CisJCXJldHVybiBTQ1NJX0RJU0sxX01BSk9SICsgbWFqb3JfaWR4IC0gMTsKKwljYXNlIDggLi4uIDE1OgorCQlyZXR1cm4gU0NTSV9ESVNLOF9NQUpPUiArIG1ham9yX2lkeCAtIDg7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOwkvKiBzaHV0IHVwIGdjYyAqLworCX0KK30KKworI2RlZmluZSB0b19zY3NpX2Rpc2sob2JqKSBjb250YWluZXJfb2Yob2JqLHN0cnVjdCBzY3NpX2Rpc2ssa3JlZikKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV9kaXNrICpzY3NpX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkaXNrLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBzY3NpX2Rpc2ssIGRyaXZlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9kaXNrICpzY3NpX2Rpc2tfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBOVUxMOworCisJZG93bigmc2RfcmVmX3NlbSk7CisJaWYgKGRpc2stPnByaXZhdGVfZGF0YSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlzZGtwID0gc2NzaV9kaXNrKGRpc2spOworCWtyZWZfZ2V0KCZzZGtwLT5rcmVmKTsKKwlpZiAoc2NzaV9kZXZpY2VfZ2V0KHNka3AtPmRldmljZSkpCisJCWdvdG8gb3V0X3B1dDsKKwl1cCgmc2RfcmVmX3NlbSk7CisJcmV0dXJuIHNka3A7CisKKyBvdXRfcHV0OgorCWtyZWZfcHV0KCZzZGtwLT5rcmVmLCBzY3NpX2Rpc2tfcmVsZWFzZSk7CisJc2RrcCA9IE5VTEw7Cisgb3V0OgorCXVwKCZzZF9yZWZfc2VtKTsKKwlyZXR1cm4gc2RrcDsKK30KKworc3RhdGljIHZvaWQgc2NzaV9kaXNrX3B1dChzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNka3AtPmRldmljZTsKKworCWRvd24oJnNkX3JlZl9zZW0pOworCWtyZWZfcHV0KCZzZGtwLT5rcmVmLCBzY3NpX2Rpc2tfcmVsZWFzZSk7CisJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCXVwKCZzZF9yZWZfc2VtKTsKK30KKworLyoqCisgKglzZF9pbml0X2NvbW1hbmQgLSBidWlsZCBhIHNjc2kgKHJlYWQgb3Igd3JpdGUpIGNvbW1hbmQgZnJvbQorICoJaW5mb3JtYXRpb24gaW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlLgorICoJQFNDcG50OiBwb2ludGVyIHRvIG1pZC1sZXZlbCdzIHBlciBzY3NpIGNvbW1hbmQgc3RydWN0dXJlIHRoYXQKKyAqCWNvbnRhaW5zIHJlcXVlc3QgYW5kIGludG8gd2hpY2ggdGhlIHNjc2kgY29tbWFuZCBpcyB3cml0dGVuCisgKgorICoJUmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwgYW5kIDAgaWYgZXJyb3IgKG9yIGNhbm5vdCBiZSBkb25lIG5vdykuCisgKiovCitzdGF0aWMgaW50IHNkX2luaXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJdW5zaWduZWQgaW50IHRoaXNfY291bnQsIHRpbWVvdXQ7CisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJc2VjdG9yX3QgYmxvY2s7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBTQ3BudC0+ZGV2aWNlOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IFNDcG50LT5yZXF1ZXN0OworCisJdGltZW91dCA9IHNkcC0+dGltZW91dDsKKworCS8qCisJICogU0dfSU8gZnJvbSBibG9jayBsYXllciBhbHJlYWR5IHNldHVwLCBqdXN0IGNvcHkgY2RiIGJhc2ljYWxseQorCSAqLworCWlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKKwkJaWYgKHNpemVvZihycS0+Y21kKSA+IHNpemVvZihTQ3BudC0+Y21uZCkpCisJCQlyZXR1cm4gMDsKKworCQltZW1jcHkoU0NwbnQtPmNtbmQsIHJxLT5jbWQsIHNpemVvZihTQ3BudC0+Y21uZCkpOworCQlpZiAocnFfZGF0YV9kaXIocnEpID09IFdSSVRFKQorCQkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwkJZWxzZSBpZiAocnEtPmRhdGFfbGVuKQorCQkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQllbHNlCisJCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKworCQl0aGlzX2NvdW50ID0gcnEtPmRhdGFfbGVuOworCQlpZiAocnEtPnRpbWVvdXQpCisJCQl0aW1lb3V0ID0gcnEtPnRpbWVvdXQ7CisKKwkJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IHJxLT5kYXRhX2xlbjsKKwkJU0NwbnQtPmFsbG93ZWQgPSBTRF9QQVNTVEhST1VHSF9SRVRSSUVTOworCQlnb3RvIHF1ZXVlOworCX0KKworCS8qCisJICogd2Ugb25seSBkbyBSRVFfQ01EIGFuZCBSRVFfQkxPQ0tfUEMKKwkgKi8KKwlpZiAoIWJsa19mc19yZXF1ZXN0KHJxKSkKKwkJcmV0dXJuIDA7CisKKwlkaXNrID0gcnEtPnJxX2Rpc2s7CisJYmxvY2sgPSBycS0+c2VjdG9yOworCXRoaXNfY291bnQgPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuID4+IDk7CisKKwlTQ1NJX0xPR19ITFFVRVVFKDEsIHByaW50aygic2RfaW5pdF9jb21tYW5kOiBkaXNrPSVzLCBibG9jaz0lbGx1LCAiCisJCQkgICAgImNvdW50PSVkXG4iLCBkaXNrLT5kaXNrX25hbWUsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jaywgdGhpc19jb3VudCkpOworCisJaWYgKCFzZHAgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZHApIHx8CisgCSAgICBibG9jayArIHJxLT5ucl9zZWN0b3JzID4gZ2V0X2NhcGFjaXR5KGRpc2spKSB7CisJCVNDU0lfTE9HX0hMUVVFVUUoMiwgcHJpbnRrKCJGaW5pc2hpbmcgJWxkIHNlY3RvcnNcbiIsIAorCQkJCSBycS0+bnJfc2VjdG9ycykpOworCQlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiUmV0cnkgd2l0aCAweCVwXG4iLCBTQ3BudCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2RwLT5jaGFuZ2VkKSB7CisJCS8qCisJCSAqIHF1aWV0bHkgcmVmdXNlIHRvIGRvIGFueXRoaW5nIHRvIGEgY2hhbmdlZCBkaXNjIHVudGlsIAorCQkgKiB0aGUgY2hhbmdlZCBiaXQgaGFzIGJlZW4gcmVzZXQKKwkJICovCisJCS8qIHByaW50aygiU0NTSSBkaXNrIGhhcyBiZWVuIGNoYW5nZWQuIFByb2hpYml0aW5nIGZ1cnRoZXIgSS9PLlxuIik7ICovCisJCXJldHVybiAwOworCX0KKwlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiJXMgOiBibG9jaz0lbGx1XG4iLAorCQkJCSAgIGRpc2stPmRpc2tfbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jaykpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgMUsgaGFyZHdhcmUgc2VjdG9yc2l6ZSwgcHJldmVudCBhY2Nlc3MgdG8gc2luZ2xlCisJICogNTEyIGJ5dGUgc2VjdG9ycy4gIEluIHRoZW9yeSB3ZSBjb3VsZCBoYW5kbGUgdGhpcyAtIGluIGZhY3QKKwkgKiB0aGUgc2NzaSBjZHJvbSBkcml2ZXIgbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSB0aGlzIGJlY2F1c2UKKwkgKiB3ZSB0eXBpY2FsbHkgdXNlIDFLIGJsb2Nrc2l6ZXMsIGFuZCBjZHJvbXMgdHlwaWNhbGx5IGhhdmUKKwkgKiAySyBoYXJkd2FyZSBzZWN0b3JzaXplcy4gIE9mIGNvdXJzZSwgdGhpbmdzIGFyZSBzaW1wbGVyCisJICogd2l0aCB0aGUgY2Ryb20sIHNpbmNlIGl0IGlzIHJlYWQtb25seS4gIEZvciBwZXJmb3JtYW5jZQorCSAqIHJlYXNvbnMsIHRoZSBmaWxlc3lzdGVtcyBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgdGhpcworCSAqIGFuZCBub3QgZm9yY2UgdGhlIHNjc2kgZGlzayBkcml2ZXIgdG8gdXNlIGJvdW5jZSBidWZmZXJzCisJICogZm9yIHRoaXMuCisJICovCisJaWYgKHNkcC0+c2VjdG9yX3NpemUgPT0gMTAyNCkgeworCQlpZiAoKGJsb2NrICYgMSkgfHwgKHJxLT5ucl9zZWN0b3JzICYgMSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2Q6IEJhZCBibG9jayBudW1iZXIgcmVxdWVzdGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWJsb2NrID0gYmxvY2sgPj4gMTsKKwkJCXRoaXNfY291bnQgPSB0aGlzX2NvdW50ID4+IDE7CisJCX0KKwl9CisJaWYgKHNkcC0+c2VjdG9yX3NpemUgPT0gMjA0OCkgeworCQlpZiAoKGJsb2NrICYgMykgfHwgKHJxLT5ucl9zZWN0b3JzICYgMykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2Q6IEJhZCBibG9jayBudW1iZXIgcmVxdWVzdGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWJsb2NrID0gYmxvY2sgPj4gMjsKKwkJCXRoaXNfY291bnQgPSB0aGlzX2NvdW50ID4+IDI7CisJCX0KKwl9CisJaWYgKHNkcC0+c2VjdG9yX3NpemUgPT0gNDA5NikgeworCQlpZiAoKGJsb2NrICYgNykgfHwgKHJxLT5ucl9zZWN0b3JzICYgNykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2Q6IEJhZCBibG9jayBudW1iZXIgcmVxdWVzdGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWJsb2NrID0gYmxvY2sgPj4gMzsKKwkJCXRoaXNfY291bnQgPSB0aGlzX2NvdW50ID4+IDM7CisJCX0KKwl9CisJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkgeworCQlpZiAoIXNkcC0+d3JpdGVhYmxlKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlTQ3BudC0+Y21uZFswXSA9IFdSSVRFXzY7CisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJfSBlbHNlIGlmIChycV9kYXRhX2RpcihycSkgPT0gUkVBRCkgeworCQlTQ3BudC0+Y21uZFswXSA9IFJFQURfNjsKKwkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAic2Q6IFVua25vd24gY29tbWFuZCAlbHhcbiIsIHJxLT5mbGFncyk7CisvKiBvdmVya2lsbCAJcGFuaWMoIlVua25vd24gc2QgY29tbWFuZCAlbHhcbiIsIHJxLT5mbGFncyk7ICovCisJCXJldHVybiAwOworCX0KKworCVNDU0lfTE9HX0hMUVVFVUUoMiwgcHJpbnRrKCIlcyA6ICVzICVkLyVsZCA1MTIgYnl0ZSBibG9ja3MuXG4iLCAKKwkJZGlzay0+ZGlza19uYW1lLCAocnFfZGF0YV9kaXIocnEpID09IFdSSVRFKSA/IAorCQkid3JpdGluZyIgOiAicmVhZGluZyIsIHRoaXNfY291bnQsIHJxLT5ucl9zZWN0b3JzKSk7CisKKwlTQ3BudC0+Y21uZFsxXSA9IDA7CisJCisJaWYgKGJsb2NrID4gMHhmZmZmZmZmZikgeworCQlTQ3BudC0+Y21uZFswXSArPSBSRUFEXzE2IC0gUkVBRF82OworCQlTQ3BudC0+Y21uZFsyXSA9IHNpemVvZihibG9jaykgPiA0ID8gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiA1NikgJiAweGZmIDogMDsKKwkJU0NwbnQtPmNtbmRbM10gPSBzaXplb2YoYmxvY2spID4gNCA/ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gNDgpICYgMHhmZiA6IDA7CisJCVNDcG50LT5jbW5kWzRdID0gc2l6ZW9mKGJsb2NrKSA+IDQgPyAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDQwKSAmIDB4ZmYgOiAwOworCQlTQ3BudC0+Y21uZFs1XSA9IHNpemVvZihibG9jaykgPiA0ID8gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAzMikgJiAweGZmIDogMDsKKwkJU0NwbnQtPmNtbmRbNl0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDI0KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzddID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAxNikgJiAweGZmOworCQlTQ3BudC0+Y21uZFs4XSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gOCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFs5XSA9ICh1bnNpZ25lZCBjaGFyKSBibG9jayAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzEwXSA9ICh1bnNpZ25lZCBjaGFyKSAodGhpc19jb3VudCA+PiAyNCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFsxMV0gPSAodW5zaWduZWQgY2hhcikgKHRoaXNfY291bnQgPj4gMTYpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMTJdID0gKHVuc2lnbmVkIGNoYXIpICh0aGlzX2NvdW50ID4+IDgpICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbMTNdID0gKHVuc2lnbmVkIGNoYXIpIHRoaXNfY291bnQgJiAweGZmOworCQlTQ3BudC0+Y21uZFsxNF0gPSBTQ3BudC0+Y21uZFsxNV0gPSAwOworCX0gZWxzZSBpZiAoKHRoaXNfY291bnQgPiAweGZmKSB8fCAoYmxvY2sgPiAweDFmZmZmZikgfHwKKwkJICAgU0NwbnQtPmRldmljZS0+dXNlXzEwX2Zvcl9ydykgeworCQlpZiAodGhpc19jb3VudCA+IDB4ZmZmZikKKwkJCXRoaXNfY291bnQgPSAweGZmZmY7CisKKwkJU0NwbnQtPmNtbmRbMF0gKz0gUkVBRF8xMCAtIFJFQURfNjsKKwkJU0NwbnQtPmNtbmRbMl0gPSAodW5zaWduZWQgY2hhcikgKGJsb2NrID4+IDI0KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzNdID0gKHVuc2lnbmVkIGNoYXIpIChibG9jayA+PiAxNikgJiAweGZmOworCQlTQ3BudC0+Y21uZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gOCkgJiAweGZmOworCQlTQ3BudC0+Y21uZFs1XSA9ICh1bnNpZ25lZCBjaGFyKSBibG9jayAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzZdID0gU0NwbnQtPmNtbmRbOV0gPSAwOworCQlTQ3BudC0+Y21uZFs3XSA9ICh1bnNpZ25lZCBjaGFyKSAodGhpc19jb3VudCA+PiA4KSAmIDB4ZmY7CisJCVNDcG50LT5jbW5kWzhdID0gKHVuc2lnbmVkIGNoYXIpIHRoaXNfY291bnQgJiAweGZmOworCX0gZWxzZSB7CisJCWlmICh0aGlzX2NvdW50ID4gMHhmZikKKwkJCXRoaXNfY291bnQgPSAweGZmOworCisJCVNDcG50LT5jbW5kWzFdIHw9ICh1bnNpZ25lZCBjaGFyKSAoKGJsb2NrID4+IDE2KSAmIDB4MWYpOworCQlTQ3BudC0+Y21uZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAoKGJsb2NrID4+IDgpICYgMHhmZik7CisJCVNDcG50LT5jbW5kWzNdID0gKHVuc2lnbmVkIGNoYXIpIGJsb2NrICYgMHhmZjsKKwkJU0NwbnQtPmNtbmRbNF0gPSAodW5zaWduZWQgY2hhcikgdGhpc19jb3VudDsKKwkJU0NwbnQtPmNtbmRbNV0gPSAwOworCX0KKwlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gU0NwbnQtPmJ1ZmZsZW4gPQorCQkJdGhpc19jb3VudCAqIHNkcC0+c2VjdG9yX3NpemU7CisKKwkvKgorCSAqIFdlIHNob3VsZG4ndCBkaXNjb25uZWN0IGluIHRoZSBtaWRkbGUgb2YgYSBzZWN0b3IsIHNvIHdpdGggYSBkdW1iCisJICogaG9zdCBhZGFwdGVyLCBpdCdzIHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UgY2FuIGF0IGxlYXN0IHRyYW5zZmVyCisJICogdGhpcyBtYW55IGJ5dGVzIGJldHdlZW4gZWFjaCBjb25uZWN0IC8gZGlzY29ubmVjdC4KKwkgKi8KKwlTQ3BudC0+dHJhbnNmZXJzaXplID0gc2RwLT5zZWN0b3Jfc2l6ZTsKKwlTQ3BudC0+dW5kZXJmbG93ID0gdGhpc19jb3VudCA8PCA5OworCVNDcG50LT5hbGxvd2VkID0gU0RfTUFYX1JFVFJJRVM7CisKK3F1ZXVlOgorCVNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dDsKKworCS8qCisJICogVGhpcyBpcyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdlIHVzZS4gIFRoaXMgaXMgbWF0Y2hlZCBpbiB0ZXJtcworCSAqIG9mIGNhcGFiaWxpdHkgdG8gdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlTQ3BudC0+ZG9uZSA9IHNkX3J3X2ludHI7CisKKwkvKgorCSAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgaXMgcmVhZHkgZnJvbSBvdXIgZW5kIHRvIGJlCisJICogcXVldWVkLgorCSAqLworCXJldHVybiAxOworfQorCisvKioKKyAqCXNkX29wZW4gLSBvcGVuIGEgc2NzaSBkaXNrIGRldmljZQorICoJQGlub2RlOiBvbmx5IGlfcmRldiBtZW1iZXIgbWF5IGJlIHVzZWQKKyAqCUBmaWxwOiBvbmx5IGZfbW9kZSBhbmQgZl9mbGFncyBtYXkgYmUgdXNlZAorICoKKyAqCVJldHVybnMgMCBpZiBzdWNjZXNzZnVsLiBSZXR1cm5zIGEgbmVnYXRlZCBlcnJubyB2YWx1ZSBpbiBjYXNlIAorICoJb2YgZXJyb3IuCisgKgorICoJTm90ZTogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYSB1c2VyIGNvbnRleHQgKGUuZy4gZnNjaygxKSApCisgKglvciBmcm9tIHdpdGhpbiB0aGUga2VybmVsIChlLmcuIGFzIGEgcmVzdWx0IG9mIGEgbW91bnQoMSkgKS4KKyAqCUluIHRoZSBsYXR0ZXIgY2FzZSBAaW5vZGUgYW5kIEBmaWxwIGNhcnJ5IGFuIGFicmlkZ2VkIGFtb3VudAorICoJb2YgaW5mb3JtYXRpb24gYXMgbm90ZWQgYWJvdmUuCisgKiovCitzdGF0aWMgaW50IHNkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3A7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCWludCByZXR2YWw7CisKKwlpZiAoIShzZGtwID0gc2NzaV9kaXNrX2dldChkaXNrKSkpCisJCXJldHVybiAtRU5YSU87CisKKworCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJzZF9vcGVuOiBkaXNrPSVzXG4iLCBkaXNrLT5kaXNrX25hbWUpKTsKKworCXNkZXYgPSBzZGtwLT5kZXZpY2U7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gZXJyb3IgcmVjb3ZlcnksIHdhaXQgdW50aWwgaXQgaXMgZG9uZS4KKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG9mZmxpbmUsIHRoZW4gZGlzYWxsb3cgYW55IGFjY2VzcyB0byBpdC4KKwkgKi8KKwlyZXR2YWwgPSAtRU5YSU87CisJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RldikpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJaWYgKHNkZXYtPnJlbW92YWJsZSB8fCBzZGtwLT53cml0ZV9wcm90KQorCQljaGVja19kaXNrX2NoYW5nZShpbm9kZS0+aV9iZGV2KTsKKworCS8qCisJICogSWYgdGhlIGRyaXZlIGlzIGVtcHR5LCBqdXN0IGxldCB0aGUgb3BlbiBmYWlsLgorCSAqLworCXJldHZhbCA9IC1FTk9NRURJVU07CisJaWYgKHNkZXYtPnJlbW92YWJsZSAmJiAhc2RrcC0+bWVkaWFfcHJlc2VudCAmJgorCSAgICAhKGZpbHAtPmZfZmxhZ3MgJiBPX05ERUxBWSkpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGhhcyB0aGUgd3JpdGUgcHJvdGVjdCB0YWIgc2V0LCBoYXZlIHRoZSBvcGVuIGZhaWwKKwkgKiBpZiB0aGUgdXNlciBleHBlY3RzIHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHRoaW5nLgorCSAqLworCXJldHZhbCA9IC1FUk9GUzsKKwlpZiAoc2RrcC0+d3JpdGVfcHJvdCAmJiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlnb3RvIGVycm9yX291dDsKKworCS8qCisJICogSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZGlzayBjaGFuZ2luZyBzdHVmZiByZXN1bHRlZCBpbgorCSAqIHRoZSBkZXZpY2UgYmVpbmcgdGFrZW4gb2ZmbGluZS4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCisJICogcmVwb3J0IHRoaXMgdG8gdGhlIHVzZXIsIGFuZCBkb24ndCBwcmV0ZW5kIHRoYXQgdGhlCisJICogb3BlbiBhY3R1YWxseSBzdWNjZWVkZWQuCisJICovCisJcmV0dmFsID0gLUVOWElPOworCWlmICghc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpKQorCQlnb3RvIGVycm9yX291dDsKKworCWlmICghc2RrcC0+b3BlbmVycysrICYmIHNkZXYtPnJlbW92YWJsZSkgeworCQlpZiAoc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQkJc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwoc2RldiwgU0NTSV9SRU1PVkFMX1BSRVZFTlQpOworCX0KKworCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJc2NzaV9kaXNrX3B1dChzZGtwKTsKKwlyZXR1cm4gcmV0dmFsOwkKK30KKworLyoqCisgKglzZF9yZWxlYXNlIC0gaW52b2tlZCB3aGVuIHRoZSAobGFzdCkgY2xvc2UoMikgaXMgY2FsbGVkIG9uIHRoaXMKKyAqCXNjc2kgZGlzay4KKyAqCUBpbm9kZTogb25seSBpX3JkZXYgbWVtYmVyIG1heSBiZSB1c2VkCisgKglAZmlscDogb25seSBmX21vZGUgYW5kIGZfZmxhZ3MgbWF5IGJlIHVzZWQKKyAqCisgKglSZXR1cm5zIDAuIAorICoKKyAqCU5vdGU6IG1heSBibG9jayAodW5pbnRlcnJ1cHRpYmxlKSBpZiBlcnJvciByZWNvdmVyeSBpcyB1bmRlcndheQorICoJb24gdGhpcyBkaXNrLgorICoqLworc3RhdGljIGludCBzZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gc2NzaV9kaXNrKGRpc2spOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNka3AtPmRldmljZTsKKworCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJzZF9yZWxlYXNlOiBkaXNrPSVzXG4iLCBkaXNrLT5kaXNrX25hbWUpKTsKKworCWlmICghLS1zZGtwLT5vcGVuZXJzICYmIHNkZXYtPnJlbW92YWJsZSkgeworCQlpZiAoc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkZXYpKQorCQkJc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwoc2RldiwgU0NTSV9SRU1PVkFMX0FMTE9XKTsKKwl9CisKKwkvKgorCSAqIFhYWCBhbmQgd2hhdCBpZiB0aGVyZSBhcmUgcGFja2V0cyBpbiBmbGlnaHQgYW5kIHRoaXMgY2xvc2UoKQorCSAqIFhYWCBpcyBmb2xsb3dlZCBieSBhICJybW1vZCBzZF9tb2QiPworCSAqLworCXNjc2lfZGlza19wdXQoc2RrcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfaGRpb19nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5IF9fdXNlciAqbG9jKQoreworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBzY3NpX2Rpc2soYmRldi0+YmRfZGlzayk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBzZGtwLT5kZXZpY2U7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHNkcC0+aG9zdDsKKwlpbnQgZGlza2luZm9bNF07CisKKwkvKiBkZWZhdWx0IHRvIG1vc3QgY29tbW9ubHkgdXNlZCB2YWx1ZXMgKi8KKyAgICAgICAgZGlza2luZm9bMF0gPSAweDQwOwkvKiAxIDw8IDYgKi8KKyAgICAgICAJZGlza2luZm9bMV0gPSAweDIwOwkvKiAxIDw8IDUgKi8KKyAgICAgICAJZGlza2luZm9bMl0gPSBzZGtwLT5jYXBhY2l0eSA+PiAxMTsKKwkKKwkvKiBvdmVycmlkZSB3aXRoIGNhbGN1bGF0ZWQsIGV4dGVuZGVkIGRlZmF1bHQsIG9yIGRyaXZlciB2YWx1ZXMgKi8KKwlpZiAoaG9zdC0+aG9zdHQtPmJpb3NfcGFyYW0pCisJCWhvc3QtPmhvc3R0LT5iaW9zX3BhcmFtKHNkcCwgYmRldiwgc2RrcC0+Y2FwYWNpdHksIGRpc2tpbmZvKTsKKwllbHNlCisJCXNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBzZGtwLT5jYXBhY2l0eSwgZGlza2luZm8pOworCisJaWYgKHB1dF91c2VyKGRpc2tpbmZvWzBdLCAmbG9jLT5oZWFkcykpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwdXRfdXNlcihkaXNraW5mb1sxXSwgJmxvYy0+c2VjdG9ycykpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwdXRfdXNlcihkaXNraW5mb1syXSwgJmxvYy0+Y3lsaW5kZXJzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHB1dF91c2VyKCh1bnNpZ25lZClnZXRfc3RhcnRfc2VjdChiZGV2KSwKKwkgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgX191c2VyICopJmxvYy0+c3RhcnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZF9pb2N0bCAtIHByb2Nlc3MgYW4gaW9jdGwKKyAqCUBpbm9kZTogb25seSBpX3JkZXYvaV9iZGV2IG1lbWJlcnMgbWF5IGJlIHVzZWQKKyAqCUBmaWxwOiBvbmx5IGZfbW9kZSBhbmQgZl9mbGFncyBtYXkgYmUgdXNlZAorICoJQGNtZDogaW9jdGwgY29tbWFuZCBudW1iZXIKKyAqCUBhcmc6IHRoaXMgaXMgdGhpcmQgYXJndW1lbnQgZ2l2ZW4gdG8gaW9jdGwoMikgc3lzdGVtIGNhbGwuCisgKglPZnRlbiBjb250YWlucyBhIHBvaW50ZXIuCisgKgorICoJUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwgKHNvbWUgaW9jdGxzIHJldHVybiBwb3N0aXZlIG51bWJlcnMgb24KKyAqCXN1Y2Nlc3MgYXMgd2VsbCkuIFJldHVybnMgYSBuZWdhdGVkIGVycm5vIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKgorICoJTm90ZTogbW9zdCBpb2N0bHMgYXJlIGZvcndhcmQgb250byB0aGUgYmxvY2sgc3Vic3lzdGVtIG9yIGZ1cnRoZXIKKyAqCWRvd24gaW4gdGhlIHNjc2kgc3Vic3l0ZW0uCisgKiovCitzdGF0aWMgaW50IHNkX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGlub2RlLT5pX2JkZXY7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2NzaV9kaXNrKGRpc2spLT5kZXZpY2U7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGVycm9yOworICAgIAorCVNDU0lfTE9HX0lPQ1RMKDEsIHByaW50aygic2RfaW9jdGw6IGRpc2s9JXMsIGNtZD0weCV4XG4iLAorCQkJCQkJZGlzay0+ZGlza19uYW1lLCBjbWQpKTsKKworCS8qCisJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKKwkgKiBlbHNlIHRyeSBhbmQgdXNlIHRoaXMgZGV2aWNlLiAgQWxzbywgaWYgZXJyb3IgcmVjb3ZlcnkgZmFpbHMsIGl0CisJICogbWF5IHRyeSBhbmQgdGFrZSB0aGUgZGV2aWNlIG9mZmxpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIKKwkgKiBhY2Nlc3MgdG8gdGhlIGRldmljZSBpcyBwcm9oaWJpdGVkLgorCSAqLworCWVycm9yID0gc2NzaV9ub25ibG9ja2FibGVfaW9jdGwoc2RwLCBjbWQsIHAsIGZpbHApOworCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkcCkgfHwgIWVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoY21kID09IEhESU9fR0VUR0VPKSB7CisJCWlmICghYXJnKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBzZF9oZGlvX2dldGdlbyhiZGV2LCBwKTsKKwl9CisKKwkvKgorCSAqIFNlbmQgU0NTSSBhZGRyZXNzaW5nIGlvY3RscyBkaXJlY3RseSB0byBtaWQgbGV2ZWwsIHNlbmQgb3RoZXIKKwkgKiBpb2N0bHMgdG8gYmxvY2sgbGV2ZWwgYW5kIHRoZW4gb250byBtaWQgbGV2ZWwgaWYgdGhleSBjYW4ndCBiZQorCSAqIHJlc29sdmVkLgorCSAqLworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJCWNhc2UgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUjoKKwkJCXJldHVybiBzY3NpX2lvY3RsKHNkcCwgY21kLCBwKTsKKwkJZGVmYXVsdDoKKwkJCWVycm9yID0gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzaywgY21kLCBwKTsKKwkJCWlmIChlcnJvciAhPSAtRU5PVFRZKQorCQkJCXJldHVybiBlcnJvcjsKKwl9CisJcmV0dXJuIHNjc2lfaW9jdGwoc2RwLCBjbWQsIHApOworfQorCitzdGF0aWMgdm9pZCBzZXRfbWVkaWFfbm90X3ByZXNlbnQoc3RydWN0IHNjc2lfZGlzayAqc2RrcCkKK3sKKwlzZGtwLT5tZWRpYV9wcmVzZW50ID0gMDsKKwlzZGtwLT5jYXBhY2l0eSA9IDA7CisJc2RrcC0+ZGV2aWNlLT5jaGFuZ2VkID0gMTsKK30KKworLyoqCisgKglzZF9tZWRpYV9jaGFuZ2VkIC0gY2hlY2sgaWYgb3VyIG1lZGl1bSBjaGFuZ2VkCisgKglAZGlzazoga2VybmVsIGRldmljZSBkZXNjcmlwdG9yIAorICoKKyAqCVJldHVybnMgMCBpZiBub3QgYXBwbGljYWJsZSBvciBubyBjaGFuZ2U7IDEgaWYgY2hhbmdlCisgKgorICoJTm90ZTogdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gdGhlIGJsb2NrIHN1YnN5c3RlbS4KKyAqKi8KK3N0YXRpYyBpbnQgc2RfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gc2NzaV9kaXNrKGRpc2spOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOworCWludCByZXR2YWw7CisKKwlTQ1NJX0xPR19ITFFVRVVFKDMsIHByaW50aygic2RfbWVkaWFfY2hhbmdlZDogZGlzaz0lc1xuIiwKKwkJCQkJCWRpc2stPmRpc2tfbmFtZSkpOworCisJaWYgKCFzZHAtPnJlbW92YWJsZSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgb2ZmbGluZSwgZG9uJ3Qgc2VuZCBhbnkgY29tbWFuZHMgLSBqdXN0IHByZXRlbmQgYXMKKwkgKiBpZiB0aGUgY29tbWFuZCBmYWlsZWQuICBJZiB0aGUgZGV2aWNlIGV2ZXIgY29tZXMgYmFjayBvbmxpbmUsIHdlCisJICogY2FuIGRlYWwgd2l0aCBpdCB0aGVuLiAgSXQgaXMgb25seSBiZWNhdXNlIG9mIHVucmVjb3ZlcmFibGUgZXJyb3JzCisJICogdGhhdCB3ZSB3b3VsZCBldmVyIHRha2UgYSBkZXZpY2Ugb2ZmbGluZSBpbiB0aGUgZmlyc3QgcGxhY2UuCisJICovCisJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2RwKSkKKwkJZ290byBub3RfcHJlc2VudDsKKworCS8qCisJICogVXNpbmcgVEVTVF9VTklUX1JFQURZIGVuYWJsZXMgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gZHJpdmUgd2l0aAorCSAqIG5vIGNhcnRyaWRnZSBsb2FkZWQgLSBOT1QgUkVBRFksIGRyaXZlIHdpdGggY2hhbmdlZCBjYXJ0cmlkZ2UgLQorCSAqIFVOSVQgQVRURU5USU9OLCBvciB3aXRoIHNhbWUgY2FydHJpZGdlIC0gR09PRCBTVEFUVVMuCisJICoKKwkgKiBEcml2ZXMgdGhhdCBhdXRvIHNwaW4gZG93bi4gZWcgaW9tZWdhIGpheiAxRywgd2lsbCBiZSBzdGFydGVkCisJICogYnkgc2Rfc3BpbnVwX2Rpc2soKSBmcm9tIHNkX3JldmFsaWRhdGVfZGlzaygpLCB3aGljaCBoYXBwZW5zIHdoZW5ldmVyCisJICogc2RfcmV2YWxpZGF0ZSgpIGlzIGNhbGxlZC4KKwkgKi8KKwlyZXR2YWwgPSAtRU5PREVWOworCWlmIChzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RwKSkKKwkJcmV0dmFsID0gc2NzaV90ZXN0X3VuaXRfcmVhZHkoc2RwLCBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisKKwkvKgorCSAqIFVuYWJsZSB0byB0ZXN0LCB1bml0IHByb2JhYmx5IG5vdCByZWFkeS4gICBUaGlzIHVzdWFsbHkKKwkgKiBtZWFucyB0aGVyZSBpcyBubyBkaXNjIGluIHRoZSBkcml2ZS4gIE1hcmsgYXMgY2hhbmdlZCwKKwkgKiBhbmQgd2Ugd2lsbCBmaWd1cmUgaXQgb3V0IGxhdGVyIG9uY2UgdGhlIGRyaXZlIGlzCisJICogYXZhaWxhYmxlIGFnYWluLgorCSAqLworCWlmIChyZXR2YWwpCisJCSBnb3RvIG5vdF9wcmVzZW50OworCisJLyoKKwkgKiBGb3IgcmVtb3ZhYmxlIHNjc2kgZGlzayB3ZSBoYXZlIHRvIHJlY29nbmlzZSB0aGUgcHJlc2VuY2UKKwkgKiBvZiBhIGRpc2sgaW4gdGhlIGRyaXZlLiBUaGlzIGlzIGtlcHQgaW4gdGhlIHN0cnVjdCBzY3NpX2Rpc2sKKwkgKiBzdHJ1Y3QgYW5kIHRlc3RlZCBhdCBvcGVuICEgIERhbmllbCBSb2NoZSAoZGFuQGxlY3RyYS5mcikKKwkgKi8KKwlzZGtwLT5tZWRpYV9wcmVzZW50ID0gMTsKKworCXJldHZhbCA9IHNkcC0+Y2hhbmdlZDsKKwlzZHAtPmNoYW5nZWQgPSAwOworCisJcmV0dXJuIHJldHZhbDsKKworbm90X3ByZXNlbnQ6CisJc2V0X21lZGlhX25vdF9wcmVzZW50KHNka3ApOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNkX3N5bmNfY2FjaGUoc3RydWN0IHNjc2lfZGV2aWNlICpzZHApCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcTsKKwlpbnQgcmV0cmllcywgcmVzOworCisJaWYgKCFzY3NpX2RldmljZV9vbmxpbmUoc2RwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcmVxID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KHNkcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcmVxKSB7CisJCXByaW50aygiRkFJTEVEXG4gIE5vIG1lbW9yeSBmb3IgcmVxdWVzdFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNyZXEtPnNyX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJZm9yIChyZXRyaWVzID0gMzsgcmV0cmllcyA+IDA7IC0tcmV0cmllcykgeworCQl1bnNpZ25lZCBjaGFyIGNtZFsxMF0gPSB7IDAgfTsKKworCQljbWRbMF0gPSBTWU5DSFJPTklaRV9DQUNIRTsKKwkJLyoKKwkJICogTGVhdmUgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgemVybyB0byBpbmRpY2F0ZQorCQkgKiBmbHVzaCBldmVyeXRoaW5nLgorCQkgKi8KKwkJc2NzaV93YWl0X3JlcShzcmVxLCBjbWQsIE5VTEwsIDAsIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKKwkJaWYgKHNyZXEtPnNyX3Jlc3VsdCA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJcmVzID0gc3JlcS0+c3JfcmVzdWx0OworCWlmIChyZXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkFJTEVEXG4gIHN0YXR1cyA9ICV4LCBtZXNzYWdlID0gJTAyeCwgIgorCQkJCSAgICAiaG9zdCA9ICVkLCBkcml2ZXIgPSAlMDJ4XG4gICIsCisJCQkJICAgIHN0YXR1c19ieXRlKHJlcyksIG1zZ19ieXRlKHJlcyksCisJCQkJICAgIGhvc3RfYnl0ZShyZXMpLCBkcml2ZXJfYnl0ZShyZXMpKTsKKwkJCWlmIChkcml2ZXJfYnl0ZShyZXMpICYgRFJJVkVSX1NFTlNFKQorCQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzZCIsIHNyZXEpOworCX0KKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KHNyZXEpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgc2RfaXNzdWVfZmx1c2goc3RydWN0IGRldmljZSAqZGV2LCBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXNka3ApCisgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworCWlmICghc2RrcC0+V0NFKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzZF9zeW5jX2NhY2hlKHNkcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkX2VuZF9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpmbHVzaF9ycSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBmbHVzaF9ycS0+ZW5kX2lvX2RhdGE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcnEtPnNwZWNpYWw7CisJdW5zaWduZWQgaW50IGJ5dGVzID0gcnEtPmhhcmRfbnJfc2VjdG9ycyA8PCA5OworCisJaWYgKCFmbHVzaF9ycS0+ZXJyb3JzKSB7CisJCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOworCQlzY3NpX2lvX2NvbXBsZXRpb24oY21kLCBieXRlcywgMCk7CisJCXNwaW5fbG9jayhxLT5xdWV1ZV9sb2NrKTsKKwl9IGVsc2UgaWYgKGJsa19iYXJyaWVyX3Bvc3RmbHVzaChycSkpIHsKKwkJc3Bpbl91bmxvY2socS0+cXVldWVfbG9jayk7CisJCXNjc2lfaW9fY29tcGxldGlvbihjbWQsIDAsIGJ5dGVzKTsKKwkJc3Bpbl9sb2NrKHEtPnF1ZXVlX2xvY2spOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGZvcmNlIGpvdXJuYWwgYWJvcnQgb2YgYmFycmllcnMKKwkJICovCisJCWVuZF90aGF0X3JlcXVlc3RfZmlyc3QocnEsIC1FT1BOT1RTVVBQLCBycS0+aGFyZF9ucl9zZWN0b3JzKTsKKwkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2RfcHJlcGFyZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IGRldl9nZXRfZHJ2ZGF0YSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCisJaWYgKHNka3AtPldDRSkgeworCQltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKKwkJcnEtPmZsYWdzIHw9IFJFUV9CTE9DS19QQyB8IFJFUV9TT0ZUQkFSUklFUjsKKwkJcnEtPnRpbWVvdXQgPSBTRF9USU1FT1VUOworCQlycS0+Y21kWzBdID0gU1lOQ0hST05JWkVfQ0FDSEU7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZF9yZXNjYW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzZF9yZXZhbGlkYXRlX2Rpc2soc2RrcC0+ZGlzayk7Cit9CisKKworI2lmZGVmIENPTkZJR19DT01QQVQKKy8qIAorICogVGhpcyBnZXRzIGRpcmVjdGx5IGNhbGxlZCBmcm9tIFZGUy4gV2hlbiB0aGUgaW9jdGwgCisgKiBpcyBub3QgcmVjb2duaXplZCB3ZSBnbyBiYWNrIHRvIHRoZSBvdGhlciB0cmFuc2xhdGlvbiBwYXRocy4gCisgKi8KK3N0YXRpYyBsb25nIHNkX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2JkZXY7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNjc2lfZGlzayhkaXNrKS0+ZGV2aWNlOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBlcnJvciByZWNvdmVyeSwgZG9uJ3QgbGV0IGFueW9uZQorCSAqIGVsc2UgdHJ5IGFuZCB1c2UgdGhpcyBkZXZpY2UuICBBbHNvLCBpZiBlcnJvciByZWNvdmVyeSBmYWlscywgaXQKKwkgKiBtYXkgdHJ5IGFuZCB0YWtlIHRoZSBkZXZpY2Ugb2ZmbGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgZnVydGhlcgorCSAqIGFjY2VzcyB0byB0aGUgZGV2aWNlIGlzIHByb2hpYml0ZWQuCisJICovCisJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RldikpCisJCXJldHVybiAtRU5PREVWOworCSAgICAgICAKKwlpZiAoc2Rldi0+aG9zdC0+aG9zdHQtPmNvbXBhdF9pb2N0bCkgeworCQlpbnQgcmV0OworCisJCXJldCA9IHNkZXYtPmhvc3QtPmhvc3R0LT5jb21wYXRfaW9jdGwoc2RldiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCisJCXJldHVybiByZXQ7CisJfQorCisJLyogCisJICogTGV0IHRoZSBzdGF0aWMgaW9jdGwgdHJhbnNsYXRpb24gdGFibGUgdGFrZSBjYXJlIG9mIGl0LgorCSAqLworCXJldHVybiAtRU5PSU9DVExDTUQ7IAorfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgc2RfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzZF9vcGVuLAorCS5yZWxlYXNlCQk9IHNkX3JlbGVhc2UsCisJLmlvY3RsCQkJPSBzZF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAkJPSBzZF9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubWVkaWFfY2hhbmdlZAkJPSBzZF9tZWRpYV9jaGFuZ2VkLAorCS5yZXZhbGlkYXRlX2Rpc2sJPSBzZF9yZXZhbGlkYXRlX2Rpc2ssCit9OworCisvKioKKyAqCXNkX3J3X2ludHIgLSBib3R0b20gaGFsZiBoYW5kbGVyOiBjYWxsZWQgd2hlbiB0aGUgbG93ZXIgbGV2ZWwKKyAqCWRyaXZlciBoYXMgY29tcGxldGVkIChzdWNjZXNzZnVsbHkgb3Igb3RoZXJ3aXNlKSBhIHNjc2kgY29tbWFuZC4KKyAqCUBTQ3BudDogbWlkLWxldmVsJ3MgcGVyIGNvbW1hbmQgc3RydWN0dXJlLgorICoKKyAqCU5vdGU6IHBvdGVudGlhbGx5IHJ1biBmcm9tIHdpdGhpbiBhbiBJU1IuIE11c3Qgbm90IGJsb2NrLgorICoqLworc3RhdGljIHZvaWQgc2RfcndfaW50cihzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJaW50IHJlc3VsdCA9IFNDcG50LT5yZXN1bHQ7CisJaW50IHRoaXNfY291bnQgPSBTQ3BudC0+YnVmZmxlbjsKKwlpbnQgZ29vZF9ieXRlcyA9IChyZXN1bHQgPT0gMCA/IHRoaXNfY291bnQgOiAwKTsKKwlzZWN0b3JfdCBibG9ja19zZWN0b3JzID0gMTsKKwl1NjQgZmlyc3RfZXJyX2Jsb2NrOworCXNlY3Rvcl90IGVycm9yX3NlY3RvcjsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisJaW50IHNlbnNlX3ZhbGlkID0gMDsKKwlpbnQgc2Vuc2VfZGVmZXJyZWQgPSAwOworCWludCBpbmZvX3ZhbGlkOworCisJaWYgKHJlc3VsdCkgeworCQlzZW5zZV92YWxpZCA9IHNjc2lfY29tbWFuZF9ub3JtYWxpemVfc2Vuc2UoU0NwbnQsICZzc2hkcik7CisJCWlmIChzZW5zZV92YWxpZCkKKwkJCXNlbnNlX2RlZmVycmVkID0gc2NzaV9zZW5zZV9pc19kZWZlcnJlZCgmc3NoZHIpOworCX0KKworI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKKwlTQ1NJX0xPR19ITENPTVBMRVRFKDEsIHByaW50aygic2RfcndfaW50cjogJXM6IHJlcz0weCV4XG4iLCAKKwkJCQlTQ3BudC0+cmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lLCByZXN1bHQpKTsKKwlpZiAoc2Vuc2VfdmFsaWQpIHsKKwkJU0NTSV9MT0dfSExDT01QTEVURSgxLCBwcmludGsoInNkX3J3X2ludHI6IHNiW3Jlc3BjLHNrLGFzYywiCisJCQkJImFzY3FdPSV4LCV4LCV4LCV4XG4iLCBzc2hkci5yZXNwb25zZV9jb2RlLAorCQkJCXNzaGRyLnNlbnNlX2tleSwgc3NoZHIuYXNjLCBzc2hkci5hc2NxKSk7CisJfQorI2VuZGlmCisJLyoKKwkgICBIYW5kbGUgTUVESVVNIEVSUk9ScyB0aGF0IGluZGljYXRlIHBhcnRpYWwgc3VjY2Vzcy4gIFNpbmNlIHRoaXMgaXMgYQorCSAgIHJlbGF0aXZlbHkgcmFyZSBlcnJvciBjb25kaXRpb24sIG5vIGNhcmUgaXMgdGFrZW4gdG8gYXZvaWQKKwkgICB1bm5lY2Vzc2FyeSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyBtZW1jcHkncyB0aGF0IGNvdWxkIGJlIGF2b2lkZWQuCisJICovCisKKwkvKiAKKwkgKiBJZiBTR19JTyBmcm9tIGJsb2NrIGxheWVyIHRoZW4gc2V0IGdvb2RfYnl0ZXMgdG8gc3RvcCByZXRyaWVzOworCSAqIGVsc2UgaWYgZXJyb3JzLCBjaGVjayB0aGVtLCBhbmQgaWYgbmVjZXNzYXJ5IHByZXBhcmUgZm9yCisJICogKHBhcnRpYWwpIHJldHJpZXMuCisJICovCisJaWYgKGJsa19wY19yZXF1ZXN0KFNDcG50LT5yZXF1ZXN0KSkKKwkJZ29vZF9ieXRlcyA9IHRoaXNfY291bnQ7CisJZWxzZSBpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAhPSAwICYmCisJCSBzZW5zZV92YWxpZCAmJiAhc2Vuc2VfZGVmZXJyZWQpIHsKKwkJc3dpdGNoIChzc2hkci5zZW5zZV9rZXkpIHsKKwkJY2FzZSBNRURJVU1fRVJST1I6CisJCQlpZiAoIWJsa19mc19yZXF1ZXN0KFNDcG50LT5yZXF1ZXN0KSkKKwkJCQlicmVhazsKKwkJCWluZm9fdmFsaWQgPSBzY3NpX2dldF9zZW5zZV9pbmZvX2ZsZCgKKwkJCQlTQ3BudC0+c2Vuc2VfYnVmZmVyLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsCisJCQkJJmZpcnN0X2Vycl9ibG9jayk7CisJCQkvKgorCQkJICogTWF5IHdhbnQgdG8gd2FybiBhbmQgc2tpcCBpZiBmb2xsb3dpbmcgY2FzdCByZXN1bHRzCisJCQkgKiBpbiBhY3R1YWwgdHJ1bmNhdGlvbiAoaWYgc2VjdG9yX3QgPCA2NCBiaXRzKQorCQkJICovCisJCQllcnJvcl9zZWN0b3IgPSAoc2VjdG9yX3QpZmlyc3RfZXJyX2Jsb2NrOworCQkJaWYgKFNDcG50LT5yZXF1ZXN0LT5iaW8gIT0gTlVMTCkKKwkJCQlibG9ja19zZWN0b3JzID0gYmlvX3NlY3RvcnMoU0NwbnQtPnJlcXVlc3QtPmJpbyk7CisJCQlzd2l0Y2ggKFNDcG50LT5kZXZpY2UtPnNlY3Rvcl9zaXplKSB7CisJCQljYXNlIDEwMjQ6CisJCQkJZXJyb3Jfc2VjdG9yIDw8PSAxOworCQkJCWlmIChibG9ja19zZWN0b3JzIDwgMikKKwkJCQkJYmxvY2tfc2VjdG9ycyA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDIwNDg6CisJCQkJZXJyb3Jfc2VjdG9yIDw8PSAyOworCQkJCWlmIChibG9ja19zZWN0b3JzIDwgNCkKKwkJCQkJYmxvY2tfc2VjdG9ycyA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDQwOTY6CisJCQkJZXJyb3Jfc2VjdG9yIDw8PTM7CisJCQkJaWYgKGJsb2NrX3NlY3RvcnMgPCA4KQorCQkJCQlibG9ja19zZWN0b3JzID0gODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjU2OgorCQkJCWVycm9yX3NlY3RvciA+Pj0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWVycm9yX3NlY3RvciAmPSB+KGJsb2NrX3NlY3RvcnMgLSAxKTsKKwkJCWdvb2RfYnl0ZXMgPSAoZXJyb3Jfc2VjdG9yIC0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcikgPDwgOTsKKwkJCWlmIChnb29kX2J5dGVzIDwgMCB8fCBnb29kX2J5dGVzID49IHRoaXNfY291bnQpCisJCQkJZ29vZF9ieXRlcyA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJFQ09WRVJFRF9FUlJPUjogLyogYW4gZXJyb3Igb2NjdXJyZWQsIGJ1dCBpdCByZWNvdmVyZWQgKi8KKwkJY2FzZSBOT19TRU5TRTogLyogTExERCBnb3Qgc2Vuc2UgZGF0YSAqLworCQkJLyoKKwkJCSAqIEluZm9ybSB0aGUgdXNlciwgYnV0IG1ha2Ugc3VyZSB0aGF0IGl0J3Mgbm90IHRyZWF0ZWQKKwkJCSAqIGFzIGEgaGFyZCBlcnJvci4KKwkJCSAqLworCQkJc2NzaV9wcmludF9zZW5zZSgic2QiLCBTQ3BudCk7CisJCQlTQ3BudC0+cmVzdWx0ID0gMDsKKwkJCW1lbXNldChTQ3BudC0+c2Vuc2VfYnVmZmVyLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCQkJZ29vZF9ieXRlcyA9IHRoaXNfY291bnQ7CisJCQlicmVhazsKKworCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkJCWlmIChTQ3BudC0+ZGV2aWNlLT51c2VfMTBfZm9yX3J3ICYmCisJCQkgICAgKFNDcG50LT5jbW5kWzBdID09IFJFQURfMTAgfHwKKwkJCSAgICAgU0NwbnQtPmNtbmRbMF0gPT0gV1JJVEVfMTApKQorCQkJCVNDcG50LT5kZXZpY2UtPnVzZV8xMF9mb3JfcncgPSAwOworCQkJaWYgKFNDcG50LT5kZXZpY2UtPnVzZV8xMF9mb3JfbXMgJiYKKwkJCSAgICAoU0NwbnQtPmNtbmRbMF0gPT0gTU9ERV9TRU5TRV8xMCB8fAorCQkJICAgICBTQ3BudC0+Y21uZFswXSA9PSBNT0RFX1NFTEVDVF8xMCkpCisJCQkJU0NwbnQtPmRldmljZS0+dXNlXzEwX2Zvcl9tcyA9IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBUaGlzIGNhbGxzIHRoZSBnZW5lcmljIGNvbXBsZXRpb24gZnVuY3Rpb24sIG5vdyB0aGF0IHdlIGtub3cKKwkgKiBob3cgbWFueSBhY3R1YWwgc2VjdG9ycyBmaW5pc2hlZCwgYW5kIGhvdyBtYW55IHNlY3RvcnMgd2UgbmVlZAorCSAqIHRvIHNheSBoYXZlIGZhaWxlZC4KKwkgKi8KKwlzY3NpX2lvX2NvbXBsZXRpb24oU0NwbnQsIGdvb2RfYnl0ZXMsIGJsb2NrX3NlY3RvcnMgPDwgOSk7Cit9CisKK3N0YXRpYyBpbnQgbWVkaWFfbm90X3ByZXNlbnQoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JwKQoreworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCWlmICghc3JwLT5zcl9yZXN1bHQpCisJCXJldHVybiAwOworCWlmICghKGRyaXZlcl9ieXRlKHNycC0+c3JfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkpCisJCXJldHVybiAwOworCS8qIG5vdCBpbnZva2VkIGZvciBjb21tYW5kcyB0aGF0IGNvdWxkIHJldHVybiBkZWZlcnJlZCBlcnJvcnMgKi8KKwlpZiAoc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShzcnAsICZzc2hkcikpIHsKKwkJaWYgKHNzaGRyLnNlbnNlX2tleSAhPSBOT1RfUkVBRFkgJiYKKwkJICAgIHNzaGRyLnNlbnNlX2tleSAhPSBVTklUX0FUVEVOVElPTikKKwkJCXJldHVybiAwOworCQlpZiAoc3NoZHIuYXNjICE9IDB4M0EpIC8qIG1lZGl1bSBub3QgcHJlc2VudCAqLworCQkJcmV0dXJuIDA7CisJfQorCXNldF9tZWRpYV9ub3RfcHJlc2VudChzZGtwKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHNwaW51cCBkaXNrIC0gY2FsbGVkIG9ubHkgaW4gc2RfcmV2YWxpZGF0ZV9kaXNrKCkKKyAqLworc3RhdGljIHZvaWQKK3NkX3NwaW51cF9kaXNrKHN0cnVjdCBzY3NpX2Rpc2sgKnNka3AsIGNoYXIgKmRpc2tuYW1lLAorCSAgICAgICBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKSB7CisJdW5zaWduZWQgY2hhciBjbWRbMTBdOworCXVuc2lnbmVkIGxvbmcgc3BpbnRpbWVfdmFsdWUgPSAwOworCWludCByZXRyaWVzLCBzcGludGltZTsKKwl1bnNpZ25lZCBpbnQgdGhlX3Jlc3VsdDsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisJaW50IHNlbnNlX3ZhbGlkID0gMDsKKworCXNwaW50aW1lID0gMDsKKworCS8qIFNwaW4gdXAgZHJpdmVzLCBhcyByZXF1aXJlZC4gIE9ubHkgZG8gdGhpcyBhdCBib290IHRpbWUgKi8KKwkvKiBTcGludXAgbmVlZHMgdG8gYmUgZG9uZSBmb3IgbW9kdWxlIGxvYWRzIHRvby4gKi8KKwlkbyB7CisJCXJldHJpZXMgPSAwOworCisJCWRvIHsKKwkJCWNtZFswXSA9IFRFU1RfVU5JVF9SRUFEWTsKKwkJCW1lbXNldCgodm9pZCAqKSAmY21kWzFdLCAwLCA5KTsKKworCQkJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOworCQkJbWVtc2V0KFNScG50LT5zcl9zZW5zZV9idWZmZXIsIDAsCisJCQkgICAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKwkJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJCQlzY3NpX3dhaXRfcmVxIChTUnBudCwgKHZvaWQgKikgY21kLCAodm9pZCAqKSBidWZmZXIsCisJCQkJICAgICAgIDAvKjUxMiovLCBTRF9USU1FT1VULCBTRF9NQVhfUkVUUklFUyk7CisKKwkJCXRoZV9yZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCQkJaWYgKHRoZV9yZXN1bHQpCisJCQkJc2Vuc2VfdmFsaWQgPSBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKAorCQkJCQkJCVNScG50LCAmc3NoZHIpOworCQkJcmV0cmllcysrOworCQl9IHdoaWxlIChyZXRyaWVzIDwgMyAmJiAKKwkJCSAoIXNjc2lfc3RhdHVzX2lzX2dvb2QodGhlX3Jlc3VsdCkgfHwKKwkJCSAgKChkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgJiYKKwkJCSAgc2Vuc2VfdmFsaWQgJiYgc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OKSkpOworCisJCS8qCisJCSAqIElmIHRoZSBkcml2ZSBoYXMgaW5kaWNhdGVkIHRvIHVzIHRoYXQgaXQgZG9lc24ndCBoYXZlCisJCSAqIGFueSBtZWRpYSBpbiBpdCwgZG9uJ3QgYm90aGVyIHdpdGggYW55IG9mIHRoZSByZXN0IG9mCisJCSAqIHRoaXMgY3JhcC4KKwkJICovCisJCWlmIChtZWRpYV9ub3RfcHJlc2VudChzZGtwLCBTUnBudCkpCisJCQlyZXR1cm47CisKKwkJaWYgKChkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSAmIERSSVZFUl9TRU5TRSkgPT0gMCkgeworCQkJLyogbm8gc2Vuc2UsIFRVUiBlaXRoZXIgc3VjY2VlZGVkIG9yIGZhaWxlZAorCQkJICogd2l0aCBhIHN0YXR1cyBlcnJvciAqLworCQkJaWYoIXNwaW50aW1lICYmICFzY3NpX3N0YXR1c19pc19nb29kKHRoZV9yZXN1bHQpKQorCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVuaXQgTm90IFJlYWR5LCAiCisJCQkJICAgICAgICJlcnJvciA9IDB4JXhcbiIsIGRpc2tuYW1lLCB0aGVfcmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCQkJCQorCQkvKgorCQkgKiBUaGUgZGV2aWNlIGRvZXMgbm90IHdhbnQgdGhlIGF1dG9tYXRpYyBzdGFydCB0byBiZSBpc3N1ZWQuCisJCSAqLworCQlpZiAoc2RrcC0+ZGV2aWNlLT5ub19zdGFydF9vbl9hZGQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWYgbWFudWFsIGludGVydmVudGlvbiBpcyByZXF1aXJlZCwgb3IgdGhpcyBpcyBhbgorCQkgKiBhYnNlbnQgVVNCIHN0b3JhZ2UgZGV2aWNlLCBhIHNwaW51cCBpcyBtZWFuaW5nbGVzcy4KKwkJICovCisJCWlmIChzZW5zZV92YWxpZCAmJgorCQkgICAgc3NoZHIuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSAmJgorCQkgICAgc3NoZHIuYXNjID09IDQgJiYgc3NoZHIuYXNjcSA9PSAzKSB7CisJCQlicmVhazsJCS8qIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQgKi8KKworCQkvKgorCQkgKiBJc3N1ZSBjb21tYW5kIHRvIHNwaW4gdXAgZHJpdmUgd2hlbiBub3QgcmVhZHkKKwkJICovCisJCX0gZWxzZSBpZiAoc2Vuc2VfdmFsaWQgJiYgc3NoZHIuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkgeworCQkJaWYgKCFzcGludGltZSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFNwaW5uaW5nIHVwIGRpc2suLi4iLAorCQkJCSAgICAgICBkaXNrbmFtZSk7CisJCQkJY21kWzBdID0gU1RBUlRfU1RPUDsKKwkJCQljbWRbMV0gPSAxOwkvKiBSZXR1cm4gaW1tZWRpYXRlbHkgKi8KKwkJCQltZW1zZXQoKHZvaWQgKikgJmNtZFsyXSwgMCwgOCk7CisJCQkJY21kWzRdID0gMTsJLyogU3RhcnQgc3BpbiBjeWNsZSAqLworCQkJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKKwkJCQltZW1zZXQoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlciwgMCwKKwkJCQkJU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKKworCQkJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCQkJCXNjc2lfd2FpdF9yZXEoU1JwbnQsICh2b2lkICopY21kLCAKKwkJCQkJICAgICAgKHZvaWQgKikgYnVmZmVyLCAwLyo1MTIqLywgCisJCQkJCSAgICAgIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTKTsKKwkJCQlzcGludGltZV92YWx1ZSA9IGppZmZpZXM7CisJCQl9CisJCQlzcGludGltZSA9IDE7CisJCQkvKiBXYWl0IDEgc2Vjb25kIGZvciBuZXh0IHRyeSAqLworCQkJbXNsZWVwKDEwMDApOworCQkJcHJpbnRrKCIuIik7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoZSBzZW5zZSBjb2RlLCBzbyBpdCdzCisJCQkgKiBwcm9iYWJseSBwb2ludGxlc3MgdG8gbG9vcCAqLworCQkJaWYoIXNwaW50aW1lKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5pdCBOb3QgUmVhZHksICIKKwkJCQkJInNlbnNlOlxuIiwgZGlza25hbWUpOworCQkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCIiLCBTUnBudCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkJCQorCX0gd2hpbGUgKHNwaW50aW1lICYmCisJCSB0aW1lX2FmdGVyKHNwaW50aW1lX3ZhbHVlICsgMTAwICogSFosIGppZmZpZXMpKTsKKworCWlmIChzcGludGltZSkgeworCQlpZiAoc2NzaV9zdGF0dXNfaXNfZ29vZCh0aGVfcmVzdWx0KSkKKwkJCXByaW50aygicmVhZHlcbiIpOworCQllbHNlCisJCQlwcmludGsoIm5vdCByZXNwb25kaW5nLi4uXG4iKTsKKwl9Cit9CisKKy8qCisgKiByZWFkIGRpc2sgY2FwYWNpdHkKKyAqLworc3RhdGljIHZvaWQKK3NkX3JlYWRfY2FwYWNpdHkoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCisJCSBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKSB7CisJdW5zaWduZWQgY2hhciBjbWRbMTZdOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOworCWludCB0aGVfcmVzdWx0LCByZXRyaWVzOworCWludCBzZWN0b3Jfc2l6ZSA9IDA7CisJaW50IGxvbmdyYyA9IDA7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCWludCBzZW5zZV92YWxpZCA9IDA7CisKK3JlcGVhdDoKKwlyZXRyaWVzID0gMzsKKwlkbyB7CisJCWlmIChsb25ncmMpIHsKKwkJCW1lbXNldCgodm9pZCAqKSBjbWQsIDAsIDE2KTsKKwkJCWNtZFswXSA9IFNFUlZJQ0VfQUNUSU9OX0lOOworCQkJY21kWzFdID0gU0FJX1JFQURfQ0FQQUNJVFlfMTY7CisJCQljbWRbMTNdID0gMTI7CisJCQltZW1zZXQoKHZvaWQgKikgYnVmZmVyLCAwLCAxMik7CisJCX0gZWxzZSB7CisJCQljbWRbMF0gPSBSRUFEX0NBUEFDSVRZOworCQkJbWVtc2V0KCh2b2lkICopICZjbWRbMV0sIDAsIDkpOworCQkJbWVtc2V0KCh2b2lkICopIGJ1ZmZlciwgMCwgOCk7CisJCX0KKwkJCisJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKKwkJbWVtc2V0KFNScG50LT5zcl9zZW5zZV9idWZmZXIsIDAsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCQlzY3NpX3dhaXRfcmVxKFNScG50LCAodm9pZCAqKSBjbWQsICh2b2lkICopIGJ1ZmZlciwKKwkJCSAgICAgIGxvbmdyYyA/IDEyIDogOCwgU0RfVElNRU9VVCwgU0RfTUFYX1JFVFJJRVMpOworCisJCWlmIChtZWRpYV9ub3RfcHJlc2VudChzZGtwLCBTUnBudCkpCisJCQlyZXR1cm47CisKKwkJdGhlX3Jlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CisJCWlmICh0aGVfcmVzdWx0KQorCQkJc2Vuc2VfdmFsaWQgPSBzY3NpX3JlcXVlc3Rfbm9ybWFsaXplX3NlbnNlKFNScG50LAorCQkJCQkJCQkgICAmc3NoZHIpOworCQlyZXRyaWVzLS07CisKKwl9IHdoaWxlICh0aGVfcmVzdWx0ICYmIHJldHJpZXMpOworCisJaWYgKHRoZV9yZXN1bHQgJiYgIWxvbmdyYykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIDogUkVBRCBDQVBBQ0lUWSBmYWlsZWQuXG4iCisJCSAgICAgICAiJXMgOiBzdGF0dXM9JXgsIG1lc3NhZ2U9JTAyeCwgaG9zdD0lZCwgZHJpdmVyPSUwMnggXG4iLAorCQkgICAgICAgZGlza25hbWUsIGRpc2tuYW1lLAorCQkgICAgICAgc3RhdHVzX2J5dGUodGhlX3Jlc3VsdCksCisJCSAgICAgICBtc2dfYnl0ZSh0aGVfcmVzdWx0KSwKKwkJICAgICAgIGhvc3RfYnl0ZSh0aGVfcmVzdWx0KSwKKwkJICAgICAgIGRyaXZlcl9ieXRlKHRoZV9yZXN1bHQpKTsKKworCQlpZiAoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpCisJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic2QiLCBTUnBudCk7CisJCWVsc2UKKwkJCXByaW50aygiJXMgOiBzZW5zZSBub3QgYXZhaWxhYmxlLiBcbiIsIGRpc2tuYW1lKTsKKworCQkvKiBTZXQgZGlydHkgYml0IGZvciByZW1vdmFibGUgZGV2aWNlcyBpZiBub3QgcmVhZHkgLQorCQkgKiBzb21ldGltZXMgZHJpdmVzIHdpbGwgbm90IHJlcG9ydCB0aGlzIHByb3Blcmx5LiAqLworCQlpZiAoc2RwLT5yZW1vdmFibGUgJiYKKwkJICAgIHNlbnNlX3ZhbGlkICYmIHNzaGRyLnNlbnNlX2tleSA9PSBOT1RfUkVBRFkpCisJCQlzZHAtPmNoYW5nZWQgPSAxOworCisJCS8qIEVpdGhlciBubyBtZWRpYSBhcmUgcHJlc2VudCBidXQgdGhlIGRyaXZlIGRpZG4ndCB0ZWxsIHVzLAorCQkgICBvciB0aGV5IGFyZSBwcmVzZW50IGJ1dCB0aGUgcmVhZCBjYXBhY2l0eSBjb21tYW5kIGZhaWxzICovCisJCS8qIHNka3AtPm1lZGlhX3ByZXNlbnQgPSAwOyAtLSBub3QgYWx3YXlzIGNvcnJlY3QgKi8KKwkJc2RrcC0+Y2FwYWNpdHkgPSAweDIwMDAwMDsgLyogMSBHQiAtIHJhbmRvbSAqLworCisJCXJldHVybjsKKwl9IGVsc2UgaWYgKHRoZV9yZXN1bHQgJiYgbG9uZ3JjKSB7CisJCS8qIFJFQUQgQ0FQQUNJVFkoMTYpIGhhcyBiZWVuIGZhaWxlZCAqLworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIDogUkVBRCBDQVBBQ0lUWSgxNikgZmFpbGVkLlxuIgorCQkgICAgICAgIiVzIDogc3RhdHVzPSV4LCBtZXNzYWdlPSUwMngsIGhvc3Q9JWQsIGRyaXZlcj0lMDJ4IFxuIiwKKwkJICAgICAgIGRpc2tuYW1lLCBkaXNrbmFtZSwKKwkJICAgICAgIHN0YXR1c19ieXRlKHRoZV9yZXN1bHQpLAorCQkgICAgICAgbXNnX2J5dGUodGhlX3Jlc3VsdCksCisJCSAgICAgICBob3N0X2J5dGUodGhlX3Jlc3VsdCksCisJCSAgICAgICBkcml2ZXJfYnl0ZSh0aGVfcmVzdWx0KSk7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgOiB1c2UgMHhmZmZmZmZmZiBhcyBkZXZpY2Ugc2l6ZVxuIiwKKwkJICAgICAgIGRpc2tuYW1lKTsKKwkJCisJCXNka3AtPmNhcGFjaXR5ID0gMSArIChzZWN0b3JfdCkgMHhmZmZmZmZmZjsJCQorCQlnb3RvIGdvdF9kYXRhOworCX0JCisJCisJaWYgKCFsb25ncmMpIHsKKwkJc2VjdG9yX3NpemUgPSAoYnVmZmVyWzRdIDw8IDI0KSB8CisJCQkoYnVmZmVyWzVdIDw8IDE2KSB8IChidWZmZXJbNl0gPDwgOCkgfCBidWZmZXJbN107CisJCWlmIChidWZmZXJbMF0gPT0gMHhmZiAmJiBidWZmZXJbMV0gPT0gMHhmZiAmJgorCQkgICAgYnVmZmVyWzJdID09IDB4ZmYgJiYgYnVmZmVyWzNdID09IDB4ZmYpIHsKKwkJCWlmKHNpemVvZihzZGtwLT5jYXBhY2l0eSkgPiA0KSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyA6IHZlcnkgYmlnIGRldmljZS4gdHJ5IHRvIHVzZSIKKwkJCQkgICAgICAgIiBSRUFEIENBUEFDSVRZKDE2KS5cbiIsIGRpc2tuYW1lKTsKKwkJCQlsb25ncmMgPSAxOworCQkJCWdvdG8gcmVwZWF0OworCQkJfQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdG9vIGJpZyBmb3IgdGhpcyBrZXJuZWwuICBVc2UgYSAiCisJCQkgICAgICAgImtlcm5lbCBjb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIGxhcmdlIGJsb2NrICIKKwkJCSAgICAgICAiZGV2aWNlcy5cbiIsIGRpc2tuYW1lKTsKKwkJCXNka3AtPmNhcGFjaXR5ID0gMDsKKwkJCWdvdG8gZ290X2RhdGE7CisJCX0KKwkJc2RrcC0+Y2FwYWNpdHkgPSAxICsgKCgoc2VjdG9yX3QpYnVmZmVyWzBdIDw8IDI0KSB8CisJCQkoYnVmZmVyWzFdIDw8IDE2KSB8CisJCQkoYnVmZmVyWzJdIDw8IDgpIHwKKwkJCWJ1ZmZlclszXSk7CQkJCisJfSBlbHNlIHsKKwkJc2RrcC0+Y2FwYWNpdHkgPSAxICsgKCgodTY0KWJ1ZmZlclswXSA8PCA1NikgfAorCQkJKCh1NjQpYnVmZmVyWzFdIDw8IDQ4KSB8CisJCQkoKHU2NClidWZmZXJbMl0gPDwgNDApIHwKKwkJCSgodTY0KWJ1ZmZlclszXSA8PCAzMikgfAorCQkJKChzZWN0b3JfdClidWZmZXJbNF0gPDwgMjQpIHwKKwkJCSgoc2VjdG9yX3QpYnVmZmVyWzVdIDw8IDE2KSB8CisJCQkoKHNlY3Rvcl90KWJ1ZmZlcls2XSA8PCA4KSAgfAorCQkJKHNlY3Rvcl90KWJ1ZmZlcls3XSk7CisJCQkKKwkJc2VjdG9yX3NpemUgPSAoYnVmZmVyWzhdIDw8IDI0KSB8CisJCQkoYnVmZmVyWzldIDw8IDE2KSB8IChidWZmZXJbMTBdIDw8IDgpIHwgYnVmZmVyWzExXTsKKwl9CQorCisJLyogU29tZSBkZXZpY2VzIHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMsIG5vdCB0aGUKKwkgKiBoaWdoZXN0IHNlY3RvciBudW1iZXIuICBNYWtlIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudC4gKi8KKwlpZiAoc2RwLT5maXhfY2FwYWNpdHkpCisJCS0tc2RrcC0+Y2FwYWNpdHk7CisKK2dvdF9kYXRhOgorCWlmIChzZWN0b3Jfc2l6ZSA9PSAwKSB7CisJCXNlY3Rvcl9zaXplID0gNTEyOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIDogc2VjdG9yIHNpemUgMCByZXBvcnRlZCwgIgorCQkgICAgICAgImFzc3VtaW5nIDUxMi5cbiIsIGRpc2tuYW1lKTsKKwl9CisKKwlpZiAoc2VjdG9yX3NpemUgIT0gNTEyICYmCisJICAgIHNlY3Rvcl9zaXplICE9IDEwMjQgJiYKKwkgICAgc2VjdG9yX3NpemUgIT0gMjA0OCAmJgorCSAgICBzZWN0b3Jfc2l6ZSAhPSA0MDk2ICYmCisJICAgIHNlY3Rvcl9zaXplICE9IDI1NikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIDogdW5zdXBwb3J0ZWQgc2VjdG9yIHNpemUgIgorCQkgICAgICAgIiVkLlxuIiwgZGlza25hbWUsIHNlY3Rvcl9zaXplKTsKKwkJLyoKKwkJICogVGhlIHVzZXIgbWlnaHQgd2FudCB0byByZS1mb3JtYXQgdGhlIGRyaXZlIHdpdGgKKwkJICogYSBzdXBwb3J0ZWQgc2VjdG9yc2l6ZS4gIE9uY2UgdGhpcyBoYXBwZW5zLCBpdAorCQkgKiB3b3VsZCBiZSByZWxhdGl2ZWx5IHRyaXZpYWwgdG8gc2V0IHRoZSB0aGluZyB1cC4KKwkJICogRm9yIHRoaXMgcmVhc29uLCB3ZSBsZWF2ZSB0aGUgdGhpbmcgaW4gdGhlIHRhYmxlLgorCQkgKi8KKwkJc2RrcC0+Y2FwYWNpdHkgPSAwOworCQkvKgorCQkgKiBzZXQgYSBib2d1cyBzZWN0b3Igc2l6ZSBzbyB0aGUgbm9ybWFsIHJlYWQvd3JpdGUKKwkJICogbG9naWMgaW4gdGhlIGJsb2NrIGxheWVyIHdpbGwgZXZlbnR1YWxseSByZWZ1c2UgYW55CisJCSAqIHJlcXVlc3Qgb24gdGhpcyBkZXZpY2Ugd2l0aG91dCB0cmlwcGluZyBvdmVyIHBvd2VyCisJCSAqIG9mIHR3byBzZWN0b3Igc2l6ZSBhc3N1bXB0aW9ucworCQkgKi8KKwkJc2VjdG9yX3NpemUgPSA1MTI7CisJfQorCXsKKwkJLyoKKwkJICogVGhlIG1zZG9zIGZzIG5lZWRzIHRvIGtub3cgdGhlIGhhcmR3YXJlIHNlY3RvciBzaXplCisJCSAqIFNvIEkgaGF2ZSBjcmVhdGVkIHRoaXMgdGFibGUuIFNlZSBsbF9yd19ibGsuYworCQkgKiBKYWNxdWVzIEdlbGluYXMgKEphY3F1ZXNAc29sdWNvcnAucWMuY2EpCisJCSAqLworCQlpbnQgaGFyZF9zZWN0b3IgPSBzZWN0b3Jfc2l6ZTsKKwkJc2VjdG9yX3Qgc3ogPSBzZGtwLT5jYXBhY2l0eSAqIChoYXJkX3NlY3Rvci8yNTYpOworCQlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlID0gc2RwLT5yZXF1ZXN0X3F1ZXVlOworCQlzZWN0b3JfdCBtYjsKKworCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxdWV1ZSwgaGFyZF9zZWN0b3IpOworCQkvKiBhdm9pZCA2NC1iaXQgZGl2aXNpb24gb24gMzItYml0IHBsYXRmb3JtcyAqLworCQltYiA9IHN6ID4+IDE7CisJCXNlY3Rvcl9kaXYoc3osIDEyNTApOworCQltYiAtPSBzeiAtIDk3NDsKKwkJc2VjdG9yX2RpdihtYiwgMTk1MCk7CisKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJTQ1NJIGRldmljZSAlczogIgorCQkgICAgICAgIiVsbHUgJWQtYnl0ZSBoZHdyIHNlY3RvcnMgKCVsbHUgTUIpXG4iLAorCQkgICAgICAgZGlza25hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpc2RrcC0+Y2FwYWNpdHksCisJCSAgICAgICBoYXJkX3NlY3RvciwgKHVuc2lnbmVkIGxvbmcgbG9uZyltYik7CisJfQorCisJLyogUmVzY2FsZSBjYXBhY2l0eSB0byA1MTItYnl0ZSB1bml0cyAqLworCWlmIChzZWN0b3Jfc2l6ZSA9PSA0MDk2KQorCQlzZGtwLT5jYXBhY2l0eSA8PD0gMzsKKwllbHNlIGlmIChzZWN0b3Jfc2l6ZSA9PSAyMDQ4KQorCQlzZGtwLT5jYXBhY2l0eSA8PD0gMjsKKwllbHNlIGlmIChzZWN0b3Jfc2l6ZSA9PSAxMDI0KQorCQlzZGtwLT5jYXBhY2l0eSA8PD0gMTsKKwllbHNlIGlmIChzZWN0b3Jfc2l6ZSA9PSAyNTYpCisJCXNka3AtPmNhcGFjaXR5ID4+PSAxOworCisJc2RrcC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSA9IHNlY3Rvcl9zaXplOworfQorCisvKiBjYWxsZWQgd2l0aCBidWZmZXIgb2YgbGVuZ3RoIDUxMiAqLworc3RhdGljIGlubGluZSBpbnQKK3NkX2RvX21vZGVfc2Vuc2Uoc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIGludCBkYmQsIGludCBtb2RlcGFnZSwKKwkJIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgc3RydWN0IHNjc2lfbW9kZV9kYXRhICpkYXRhKQoreworCXJldHVybiBfX3Njc2lfbW9kZV9zZW5zZShTUnBudCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCBsZW4sCisJCQkJIFNEX1RJTUVPVVQsIFNEX01BWF9SRVRSSUVTLCBkYXRhKTsKK30KKworLyoKKyAqIHJlYWQgd3JpdGUgcHJvdGVjdCBzZXR0aW5nLCBpZiBwb3NzaWJsZSAtIGNhbGxlZCBvbmx5IGluIHNkX3JldmFsaWRhdGVfZGlzaygpCisgKiBjYWxsZWQgd2l0aCBidWZmZXIgb2YgbGVuZ3RoIDUxMgorICovCitzdGF0aWMgdm9pZAorc2RfcmVhZF93cml0ZV9wcm90ZWN0X2ZsYWcoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgY2hhciAqZGlza25hbWUsCisJCSAgIHN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpIHsKKwlpbnQgcmVzOworCXN0cnVjdCBzY3NpX21vZGVfZGF0YSBkYXRhOworCisJc2V0X2Rpc2tfcm8oc2RrcC0+ZGlzaywgMCk7CisJaWYgKHNka3AtPmRldmljZS0+c2tpcF9tc19wYWdlXzNmKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGFzc3VtaW5nIFdyaXRlIEVuYWJsZWRcbiIsIGRpc2tuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZGtwLT5kZXZpY2UtPnVzZV8xOTJfYnl0ZXNfZm9yXzNmKSB7CisJCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2UoU1JwbnQsIDAsIDB4M0YsIGJ1ZmZlciwgMTkyLCAmZGF0YSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRmlyc3QgYXR0ZW1wdDogYXNrIGZvciBhbGwgcGFnZXMgKDB4M0YpLCBidXQgb25seSA0IGJ5dGVzLgorCQkgKiBXZSBoYXZlIHRvIHN0YXJ0IGNhcmVmdWxseTogc29tZSBkZXZpY2VzIGhhbmcgaWYgd2UgYXNrCisJCSAqIGZvciBtb3JlIHRoYW4gaXMgYXZhaWxhYmxlLgorCQkgKi8KKwkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgMCwgMHgzRiwgYnVmZmVyLCA0LCAmZGF0YSk7CisKKwkJLyoKKwkJICogU2Vjb25kIGF0dGVtcHQ6IGFzayBmb3IgcGFnZSAwIFdoZW4gb25seSBwYWdlIDAgaXMKKwkJICogaW1wbGVtZW50ZWQsIGEgcmVxdWVzdCBmb3IgcGFnZSAzRiBtYXkgcmV0dXJuIFNlbnNlIEtleQorCQkgKiA1OiBJbGxlZ2FsIFJlcXVlc3QsIFNlbnNlIENvZGUgMjQ6IEludmFsaWQgZmllbGQgaW4KKwkJICogQ0RCLgorCQkgKi8KKwkJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpCisJCQlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKFNScG50LCAwLCAwLCBidWZmZXIsIDQsICZkYXRhKTsKKworCQkvKgorCQkgKiBUaGlyZCBhdHRlbXB0OiBhc2sgMjU1IGJ5dGVzLCBhcyB3ZSBkaWQgZWFybGllci4KKwkJICovCisJCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpKQorCQkJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgMCwgMHgzRiwgYnVmZmVyLCAyNTUsCisJCQkJCSAgICAgICAmZGF0YSk7CisJfQorCisJaWYgKCFzY3NpX3N0YXR1c19pc19nb29kKHJlcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiB0ZXN0IFdQIGZhaWxlZCwgYXNzdW1lIFdyaXRlIEVuYWJsZWRcbiIsIGRpc2tuYW1lKTsKKwl9IGVsc2UgeworCQlzZGtwLT53cml0ZV9wcm90ID0gKChkYXRhLmRldmljZV9zcGVjaWZpYyAmIDB4ODApICE9IDApOworCQlzZXRfZGlza19ybyhzZGtwLT5kaXNrLCBzZGtwLT53cml0ZV9wcm90KTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV3JpdGUgUHJvdGVjdCBpcyAlc1xuIiwgZGlza25hbWUsCisJCSAgICAgICBzZGtwLT53cml0ZV9wcm90ID8gIm9uIiA6ICJvZmYiKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNb2RlIFNlbnNlOiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgZGlza25hbWUsIGJ1ZmZlclswXSwgYnVmZmVyWzFdLCBidWZmZXJbMl0sIGJ1ZmZlclszXSk7CisJfQorfQorCisvKgorICogc2RfcmVhZF9jYWNoZV90eXBlIC0gY2FsbGVkIG9ubHkgZnJvbSBzZF9yZXZhbGlkYXRlX2Rpc2soKQorICogY2FsbGVkIHdpdGggYnVmZmVyIG9mIGxlbmd0aCA1MTIKKyAqLworc3RhdGljIHZvaWQKK3NkX3JlYWRfY2FjaGVfdHlwZShzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwLCBjaGFyICpkaXNrbmFtZSwKKwkJICAgc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikgeworCWludCBsZW4gPSAwLCByZXM7CisKKwljb25zdCBpbnQgZGJkID0gMDsJICAgLyogREJEICovCisJY29uc3QgaW50IG1vZGVwYWdlID0gMHgwODsgLyogY3VycmVudCB2YWx1ZXMsIGNhY2hlIHBhZ2UgKi8KKwlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisKKwlpZiAoc2RrcC0+ZGV2aWNlLT5za2lwX21zX3BhZ2VfOCkKKwkJZ290byBkZWZhdWx0czsKKworCS8qIGNhdXRpb3VzbHkgYXNrICovCisJcmVzID0gc2RfZG9fbW9kZV9zZW5zZShTUnBudCwgZGJkLCBtb2RlcGFnZSwgYnVmZmVyLCA0LCAmZGF0YSk7CisKKwlpZiAoIXNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkKKwkJZ290byBiYWRfc2Vuc2U7CisKKwkvKiB0aGF0IHdlbnQgT0ssIG5vdyBhc2sgZm9yIHRoZSBwcm9wZXIgbGVuZ3RoICovCisJbGVuID0gZGF0YS5sZW5ndGg7CisKKwkvKgorCSAqIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMsIGFjdHVhbGx5LgorCSAqIEJ1dCB0aGUgZGF0YSBjYWNoZSBwYWdlIGlzIGRlZmluZWQgZm9yIHRoZSBmaXJzdCAyMC4KKwkgKi8KKwlpZiAobGVuIDwgMykKKwkJZ290byBiYWRfc2Vuc2U7CisJaWYgKGxlbiA+IDIwKQorCQlsZW4gPSAyMDsKKworCS8qIFRha2UgaGVhZGVycyBhbmQgYmxvY2sgZGVzY3JpcHRvcnMgaW50byBhY2NvdW50ICovCisJbGVuICs9IGRhdGEuaGVhZGVyX2xlbmd0aCArIGRhdGEuYmxvY2tfZGVzY3JpcHRvcl9sZW5ndGg7CisKKwkvKiBHZXQgdGhlIGRhdGEgKi8KKwlyZXMgPSBzZF9kb19tb2RlX3NlbnNlKFNScG50LCBkYmQsIG1vZGVwYWdlLCBidWZmZXIsIGxlbiwgJmRhdGEpOworCisJaWYgKHNjc2lfc3RhdHVzX2lzX2dvb2QocmVzKSkgeworCQljb25zdCBjaGFyICp0eXBlc1tdID0geworCQkJIndyaXRlIHRocm91Z2giLCAibm9uZSIsICJ3cml0ZSBiYWNrIiwKKwkJCSJ3cml0ZSBiYWNrLCBubyByZWFkIChkYWZ0KSIKKwkJfTsKKwkJaW50IGN0ID0gMDsKKwkJaW50IG9mZnNldCA9IGRhdGEuaGVhZGVyX2xlbmd0aCArCisJCQlkYXRhLmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoICsgMjsKKworCQlzZGtwLT5XQ0UgPSAoKGJ1ZmZlcltvZmZzZXRdICYgMHgwNCkgIT0gMCk7CisJCXNka3AtPlJDRCA9ICgoYnVmZmVyW29mZnNldF0gJiAweDAxKSAhPSAwKTsKKworCQljdCA9ICBzZGtwLT5SQ0QgKyAyKnNka3AtPldDRTsKKworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNDU0kgZGV2aWNlICVzOiBkcml2ZSBjYWNoZTogJXNcbiIsCisJCSAgICAgICBkaXNrbmFtZSwgdHlwZXNbY3RdKTsKKworCQlyZXR1cm47CisJfQorCitiYWRfc2Vuc2U6CisJaWYgKHNjc2lfcmVxdWVzdF9ub3JtYWxpemVfc2Vuc2UoU1JwbnQsICZzc2hkcikgJiYKKwkgICAgc3NoZHIuc2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCAmJgorCSAgICBzc2hkci5hc2MgPT0gMHgyNCAmJiBzc2hkci5hc2NxID09IDB4MCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY2FjaGUgZGF0YSB1bmF2YWlsYWJsZVxuIiwKKwkJICAgICAgIGRpc2tuYW1lKTsJLyogSW52YWxpZCBmaWVsZCBpbiBDREIgKi8KKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFza2luZyBmb3IgY2FjaGUgZGF0YSBmYWlsZWRcbiIsCisJCSAgICAgICBkaXNrbmFtZSk7CisKK2RlZmF1bHRzOgorCXByaW50ayhLRVJOX0VSUiAiJXM6IGFzc3VtaW5nIGRyaXZlIGNhY2hlOiB3cml0ZSB0aHJvdWdoXG4iLAorCSAgICAgICBkaXNrbmFtZSk7CisJc2RrcC0+V0NFID0gMDsKKwlzZGtwLT5SQ0QgPSAwOworfQorCisvKioKKyAqCXNkX3JldmFsaWRhdGVfZGlzayAtIGNhbGxlZCB0aGUgZmlyc3QgdGltZSBhIG5ldyBkaXNrIGlzIHNlZW4sCisgKglwZXJmb3JtcyBkaXNrIHNwaW4gdXAsIHJlYWRfY2FwYWNpdHksIGV0Yy4KKyAqCUBkaXNrOiBzdHJ1Y3QgZ2VuZGlzayB3ZSBjYXJlIGFib3V0CisgKiovCitzdGF0aWMgaW50IHNkX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gc2NzaV9kaXNrKGRpc2spOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2RrcC0+ZGV2aWNlOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXE7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisJU0NTSV9MT0dfSExRVUVVRSgzLCBwcmludGsoInNkX3JldmFsaWRhdGVfZGlzazogZGlzaz0lc1xuIiwgZGlzay0+ZGlza19uYW1lKSk7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgb2ZmbGluZSwgZG9uJ3QgdHJ5IGFuZCByZWFkIGNhcGFjaXR5IG9yIGFueQorCSAqIG9mIHRoZSBvdGhlciBuaWNldGllcy4KKwkgKi8KKwlpZiAoIXNjc2lfZGV2aWNlX29ubGluZShzZHApKQorCQlnb3RvIG91dDsKKworCXNyZXEgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3Qoc2RwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNyZXEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiKHNkX3JldmFsaWRhdGVfZGlzazopIFJlcXVlc3QgYWxsb2NhdGlvbiAiCisJCSAgICAgICAiZmFpbHVyZS5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlidWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0RNQSk7CisJaWYgKCFidWZmZXIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiKHNkX3JldmFsaWRhdGVfZGlzazopIE1lbW9yeSBhbGxvY2F0aW9uICIKKwkJICAgICAgICJmYWlsdXJlLlxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVxdWVzdDsKKwl9CisKKwkvKiBkZWZhdWx0cywgdW50aWwgdGhlIGRldmljZSB0ZWxscyB1cyBvdGhlcndpc2UgKi8KKwlzZHAtPnNlY3Rvcl9zaXplID0gNTEyOworCXNka3AtPmNhcGFjaXR5ID0gMDsKKwlzZGtwLT5tZWRpYV9wcmVzZW50ID0gMTsKKwlzZGtwLT53cml0ZV9wcm90ID0gMDsKKwlzZGtwLT5XQ0UgPSAwOworCXNka3AtPlJDRCA9IDA7CisKKwlzZF9zcGludXBfZGlzayhzZGtwLCBkaXNrLT5kaXNrX25hbWUsIHNyZXEsIGJ1ZmZlcik7CisKKwkvKgorCSAqIFdpdGhvdXQgbWVkaWEgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGFzazsgbW9yZW92ZXIsIHNvbWUgZGV2aWNlcworCSAqIHJlYWN0IGJhZGx5IGlmIHdlIGRvLgorCSAqLworCWlmIChzZGtwLT5tZWRpYV9wcmVzZW50KSB7CisJCXNkX3JlYWRfY2FwYWNpdHkoc2RrcCwgZGlzay0+ZGlza19uYW1lLCBzcmVxLCBidWZmZXIpOworCQlpZiAoc2RwLT5yZW1vdmFibGUpCisJCQlzZF9yZWFkX3dyaXRlX3Byb3RlY3RfZmxhZyhzZGtwLCBkaXNrLT5kaXNrX25hbWUsCisJCQkJCXNyZXEsIGJ1ZmZlcik7CisJCXNkX3JlYWRfY2FjaGVfdHlwZShzZGtwLCBkaXNrLT5kaXNrX25hbWUsIHNyZXEsIGJ1ZmZlcik7CisJfQorCQkKKwlzZXRfY2FwYWNpdHkoZGlzaywgc2RrcC0+Y2FwYWNpdHkpOworCWtmcmVlKGJ1ZmZlcik7CisKKyBvdXRfcmVsZWFzZV9yZXF1ZXN0OiAKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChzcmVxKTsKKyBvdXQ6CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2RfcHJvYmUgLSBjYWxsZWQgZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbiBhbmQgd2hlbmV2ZXIgYQorICoJbmV3IHNjc2kgZGV2aWNlIGlzIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0uIEl0IGlzIGNhbGxlZCBvbmNlCisgKglmb3IgZWFjaCBzY3NpIGRldmljZSAobm90IGp1c3QgZGlza3MpIHByZXNlbnQuCisgKglAZGV2OiBwb2ludGVyIHRvIGRldmljZSBvYmplY3QKKyAqCisgKglSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCAob3Igbm90IGludGVyZXN0ZWQgaW4gdGhpcyBzY3NpIGRldmljZSAKKyAqCShlLmcuIHNjYW5uZXIpKTsgMSB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgorICoKKyAqCU5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIHRoZSBzY3NpIG1pZC1sZXZlbC4KKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgZ2l2ZW4gCisgKgk8aG9zdCxjaGFubmVsLGlkLGx1bj4gKGZvdW5kIGluIHNkcCkgYW5kIG5ldyBkZXZpY2UgbmFtZSAKKyAqCShlLmcuIC9kZXYvc2RhKS4gTW9yZSBwcmVjaXNlbHkgaXQgaXMgdGhlIGJsb2NrIGRldmljZSBtYWpvciAKKyAqCWFuZCBtaW5vciBudW1iZXIgdGhhdCBpcyBjaG9zZW4gaGVyZS4KKyAqCisgKglBc3N1bWUgc2RfYXR0YWNoIGlzIG5vdCByZS1lbnRyYW50IChmb3IgdGltZSBiZWluZykKKyAqCUFsc28gdGhpbmsgYWJvdXQgc2RfYXR0YWNoKCkgYW5kIHNkX3JlbW92ZSgpIHJ1bm5pbmcgY29pbmNpZGVudGFsbHkuCisgKiovCitzdGF0aWMgaW50IHNkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcDsKKwlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CisJdTMyIGluZGV4OworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVOT0RFVjsKKwlpZiAoKHNkcC0+dHlwZSAhPSBUWVBFX0RJU0spICYmIChzZHAtPnR5cGUgIT0gVFlQRV9NT0QpKQorCQlnb3RvIG91dDsKKworCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJzZF9hdHRhY2g6IHNjc2kgZGV2aWNlOiA8JWQsJWQsJWQsJWQ+XG4iLCAKKwkJCSBzZHAtPmhvc3QtPmhvc3Rfbm8sIHNkcC0+Y2hhbm5lbCwgc2RwLT5pZCwgc2RwLT5sdW4pKTsKKworCWVycm9yID0gLUVOT01FTTsKKwlzZGtwID0ga21hbGxvYyhzaXplb2YoKnNka3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNka3ApCisJCWdvdG8gb3V0OworCisJbWVtc2V0IChzZGtwLCAwLCBzaXplb2YoKnNka3ApKTsKKwlrcmVmX2luaXQoJnNka3AtPmtyZWYpOworCisJZ2QgPSBhbGxvY19kaXNrKDE2KTsKKwlpZiAoIWdkKQorCQlnb3RvIG91dF9mcmVlOworCisJaWYgKCFpZHJfcHJlX2dldCgmc2RfaW5kZXhfaWRyLCBHRlBfS0VSTkVMKSkKKwkJZ290byBvdXRfcHV0OworCisJc3Bpbl9sb2NrKCZzZF9pbmRleF9sb2NrKTsKKwllcnJvciA9IGlkcl9nZXRfbmV3KCZzZF9pbmRleF9pZHIsIE5VTEwsICZpbmRleCk7CisJc3Bpbl91bmxvY2soJnNkX2luZGV4X2xvY2spOworCisJaWYgKGluZGV4ID49IFNEX01BWF9ESVNLUykKKwkJZXJyb3IgPSAtRUJVU1k7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wdXQ7CisKKwlzZGtwLT5kZXZpY2UgPSBzZHA7CisJc2RrcC0+ZHJpdmVyID0gJnNkX3RlbXBsYXRlOworCXNka3AtPmRpc2sgPSBnZDsKKwlzZGtwLT5pbmRleCA9IGluZGV4OworCXNka3AtPm9wZW5lcnMgPSAwOworCisJaWYgKCFzZHAtPnRpbWVvdXQpIHsKKwkJaWYgKHNkcC0+dHlwZSA9PSBUWVBFX0RJU0spCisJCQlzZHAtPnRpbWVvdXQgPSBTRF9USU1FT1VUOworCQllbHNlCisJCQlzZHAtPnRpbWVvdXQgPSBTRF9NT0RfVElNRU9VVDsKKwl9CisKKwlnZC0+bWFqb3IgPSBzZF9tYWpvcigoaW5kZXggJiAweGYwKSA+PiA0KTsKKwlnZC0+Zmlyc3RfbWlub3IgPSAoKGluZGV4ICYgMHhmKSA8PCA0KSB8IChpbmRleCAmIDB4ZmZmMDApOworCWdkLT5taW5vcnMgPSAxNjsKKwlnZC0+Zm9wcyA9ICZzZF9mb3BzOworCisJaWYgKGluZGV4IDwgMjYpIHsKKwkJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAic2QlYyIsICdhJyArIGluZGV4ICUgMjYpOworCX0gZWxzZSBpZiAoaW5kZXggPCAoMjYgKyAxKSAqIDI2KSB7CisJCXNwcmludGYoZ2QtPmRpc2tfbmFtZSwgInNkJWMlYyIsCisJCQknYScgKyBpbmRleCAvIDI2IC0gMSwnYScgKyBpbmRleCAlIDI2KTsKKwl9IGVsc2UgeworCQljb25zdCB1bnNpZ25lZCBpbnQgbTEgPSAoaW5kZXggLyAyNiAtIDEpIC8gMjYgLSAxOworCQljb25zdCB1bnNpZ25lZCBpbnQgbTIgPSAoaW5kZXggLyAyNiAtIDEpICUgMjY7CisJCWNvbnN0IHVuc2lnbmVkIGludCBtMyA9ICBpbmRleCAlIDI2OworCQlzcHJpbnRmKGdkLT5kaXNrX25hbWUsICJzZCVjJWMlYyIsCisJCQknYScgKyBtMSwgJ2EnICsgbTIsICdhJyArIG0zKTsKKwl9CisKKwlzdHJjcHkoZ2QtPmRldmZzX25hbWUsIHNkcC0+ZGV2ZnNfbmFtZSk7CisKKwlnZC0+cHJpdmF0ZV9kYXRhID0gJnNka3AtPmRyaXZlcjsKKworCXNkX3JldmFsaWRhdGVfZGlzayhnZCk7CisKKwlnZC0+ZHJpdmVyZnNfZGV2ID0gJnNkcC0+c2Rldl9nZW5kZXY7CisJZ2QtPmZsYWdzID0gR0VOSERfRkxfRFJJVkVSRlM7CisJaWYgKHNkcC0+cmVtb3ZhYmxlKQorCQlnZC0+ZmxhZ3MgfD0gR0VOSERfRkxfUkVNT1ZBQkxFOworCWdkLT5xdWV1ZSA9IHNka3AtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNka3ApOworCWFkZF9kaXNrKGdkKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiQXR0YWNoZWQgc2NzaSAlc2Rpc2sgJXMgYXQgc2NzaSVkLCBjaGFubmVsICVkLCAiCisJICAgICAgICJpZCAlZCwgbHVuICVkXG4iLCBzZHAtPnJlbW92YWJsZSA/ICJyZW1vdmFibGUgIiA6ICIiLAorCSAgICAgICBnZC0+ZGlza19uYW1lLCBzZHAtPmhvc3QtPmhvc3Rfbm8sIHNkcC0+Y2hhbm5lbCwKKwkgICAgICAgc2RwLT5pZCwgc2RwLT5sdW4pOworCisJcmV0dXJuIDA7CisKK291dF9wdXQ6CisJcHV0X2Rpc2soZ2QpOworb3V0X2ZyZWU6CisJa2ZyZWUoc2RrcCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNkX3JlbW92ZSAtIGNhbGxlZCB3aGVuZXZlciBhIHNjc2kgZGlzayAocHJldmlvdXNseSByZWNvZ25pemVkIGJ5CisgKglzZF9wcm9iZSkgaXMgZGV0YWNoZWQgZnJvbSB0aGUgc3lzdGVtLiBJdCBpcyBjYWxsZWQgKHBvdGVudGlhbGx5CisgKgltdWx0aXBsZSB0aW1lcykgZHVyaW5nIHNkIG1vZHVsZSB1bmxvYWQuCisgKglAc2RwOiBwb2ludGVyIHRvIG1pZCBsZXZlbCBzY3NpIGRldmljZSBvYmplY3QKKyAqCisgKglOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSB0aGUgc2NzaSBtaWQtbGV2ZWwuCisgKglUaGlzIGZ1bmN0aW9uIHBvdGVudGlhbGx5IGZyZWVzIHVwIGEgZGV2aWNlIG5hbWUgKGUuZy4gL2Rldi9zZGMpCisgKgl0aGF0IGNvdWxkIGJlIHJlLXVzZWQgYnkgYSBzdWJzZXF1ZW50IHNkX3Byb2JlKCkuCisgKglUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgd2hlbiB0aGUgYnVpbHQtaW4gc2QgZHJpdmVyIGlzICJleGl0LWVkIi4KKyAqKi8KK3N0YXRpYyBpbnQgc2RfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkZWxfZ2VuZGlzayhzZGtwLT5kaXNrKTsKKwlzZF9zaHV0ZG93bihkZXYpOworCWRvd24oJnNkX3JlZl9zZW0pOworCWtyZWZfcHV0KCZzZGtwLT5rcmVmLCBzY3NpX2Rpc2tfcmVsZWFzZSk7CisJdXAoJnNkX3JlZl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2NzaV9kaXNrX3JlbGVhc2UgLSBDYWxsZWQgdG8gZnJlZSB0aGUgc2NzaV9kaXNrIHN0cnVjdHVyZQorICoJQGtyZWY6IHBvaW50ZXIgdG8gZW1iZWRkZWQga3JlZgorICoKKyAqCXNkX3JlZl9zZW0gbXVzdCBiZSBoZWxkIGVudGVyaW5nIHRoaXMgcm91dGluZS4gIEJlY2F1c2UgaXQgaXMKKyAqCWNhbGxlZCBvbiBsYXN0IHB1dCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBzY3NpX2Rpc2tfZ2V0KCkKKyAqCXNjc2lfZGlza19wdXQoKSBoZWxwZXJzIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHNlbWFwaG9yZSBkaXJlY3RseQorICoJYW5kIG5ldmVyIGRvIGEgZGlyZWN0IGtyZWZfcHV0KCkuCisgKiovCitzdGF0aWMgdm9pZCBzY3NpX2Rpc2tfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gdG9fc2NzaV9kaXNrKGtyZWYpOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gc2RrcC0+ZGlzazsKKwkKKwlzcGluX2xvY2soJnNkX2luZGV4X2xvY2spOworCWlkcl9yZW1vdmUoJnNkX2luZGV4X2lkciwgc2RrcC0+aW5kZXgpOworCXNwaW5fdW5sb2NrKCZzZF9pbmRleF9sb2NrKTsKKworCWRpc2stPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlwdXRfZGlzayhkaXNrKTsKKworCWtmcmVlKHNka3ApOworfQorCisvKgorICogU2VuZCBhIFNZTkNIUk9OSVpFIENBQ0hFIGluc3RydWN0aW9uIGRvd24gdG8gdGhlIGRldmljZSB0aHJvdWdoCisgKiB0aGUgbm9ybWFsIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuICBXYWl0IGZvciB0aGUgY29tbWFuZCB0bworICogY29tcGxldGUuCisgKi8KK3N0YXRpYyB2b2lkIHNkX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzZGtwKQorCQlyZXR1cm47ICAgICAgICAgLyogdGhpcyBjYW4gaGFwcGVuICovCisKKwlpZiAoIXNka3AtPldDRSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJTeW5jaHJvbml6aW5nIFNDU0kgY2FjaGUgZm9yIGRpc2sgJXM6IFxuIiwKKwkJCXNka3AtPmRpc2stPmRpc2tfbmFtZSk7CisJc2Rfc3luY19jYWNoZShzZHApOworfQkKKworLyoqCisgKglpbml0X3NkIC0gZW50cnkgcG9pbnQgZm9yIHRoaXMgZHJpdmVyIChib3RoIHdoZW4gYnVpbHQgaW4gb3Igd2hlbgorICoJYSBtb2R1bGUpLgorICoKKyAqCU5vdGU6IHRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoaXMgZHJpdmVyIHdpdGggdGhlIHNjc2kgbWlkLWxldmVsLgorICoqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9zZCh2b2lkKQoreworCWludCBtYWpvcnMgPSAwLCBpOworCisJU0NTSV9MT0dfSExRVUVVRSgzLCBwcmludGsoImluaXRfc2Q6IHNkIGRyaXZlciBlbnRyeSBwb2ludFxuIikpOworCisJZm9yIChpID0gMDsgaSA8IFNEX01BSk9SUzsgaSsrKQorCQlpZiAocmVnaXN0ZXJfYmxrZGV2KHNkX21ham9yKGkpLCAic2QiKSA9PSAwKQorCQkJbWFqb3JzKys7CisKKwlpZiAoIW1ham9ycykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gc2NzaV9yZWdpc3Rlcl9kcml2ZXIoJnNkX3RlbXBsYXRlLmdlbmRydik7Cit9CisKKy8qKgorICoJZXhpdF9zZCAtIGV4aXQgcG9pbnQgZm9yIHRoaXMgZHJpdmVyICh3aGVuIGl0IGlzIGEgbW9kdWxlKS4KKyAqCisgKglOb3RlOiB0aGlzIGZ1bmN0aW9uIHVucmVnaXN0ZXJzIHRoaXMgZHJpdmVyIGZyb20gdGhlIHNjc2kgbWlkLWxldmVsLgorICoqLworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfc2Qodm9pZCkKK3sKKwlpbnQgaTsKKworCVNDU0lfTE9HX0hMUVVFVUUoMywgcHJpbnRrKCJleGl0X3NkOiBleGl0aW5nIHNkIGRyaXZlclxuIikpOworCisJc2NzaV91bnJlZ2lzdGVyX2RyaXZlcigmc2RfdGVtcGxhdGUuZ2VuZHJ2KTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RfTUFKT1JTOyBpKyspCisJCXVucmVnaXN0ZXJfYmxrZGV2KHNkX21ham9yKGkpLCAic2QiKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBZb3VuZ2RhbGUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NTSSBkaXNrIChzZCkgZHJpdmVyIik7CisKK21vZHVsZV9pbml0KGluaXRfc2QpOworbW9kdWxlX2V4aXQoZXhpdF9zZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VhZ2F0ZS5jIGIvZHJpdmVycy9zY3NpL3NlYWdhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzYyZmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NlYWdhdGUuYwpAQCAtMCwwICsxLDE2NzUgQEAKKy8qCisgKiAgICBzZWFnYXRlLmMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzIERyZXcgRWNraGFyZHQKKyAqICAgICAgbG93IGxldmVsIHNjc2kgZHJpdmVyIGZvciBTVDAxL1NUMDIsIEZ1dHVyZSBEb21haW4gVE1DLTg4NSwKKyAqICAgICAgVE1DLTk1MCBieSBEcmV3IEVja2hhcmR0IDxkcmV3QGNvbG9yYWRvLmVkdT4KKyAqCisgKiAgICAgIE5vdGUgOiBUTUMtODgwIGJvYXJkcyBkb24ndCB3b3JrIGJlY2F1c2UgdGhleSBoYXZlIHR3byBiaXRzIGluCisgKiAgICAgICAgICAgICAgdGhlIHN0YXR1cyByZWdpc3RlciBmbGlwcGVkLCBJJ2xsIGZpeCB0aGlzICJSU04iCisgKglbd2h5IGRvIEkgaGF2ZSBzdHJvbmcgZmVlbGluZyB0aGF0IGFib3ZlIG1lc3NhZ2UgaXMgZnJvbSAxOTkzPyA6LSkKKyAqCSAgICAgICAgcGF2ZWxAdWN3LmN6XQorICoKKyAqICAgICAgVGhpcyBjYXJkIGRvZXMgYWxsIHRoZSBJL08gdmlhIG1lbW9yeSBtYXBwZWQgSS9PLCBzbyB0aGVyZSBpcyBubyBuZWVkCisgKiAgICAgIHRvIGNoZWNrIG9yIGFsbG9jYXRlIGEgcmVnaW9uIG9mIHRoZSBJL08gYWRkcmVzcyBzcGFjZS4KKyAqLworCisvKiAxOTk2IC0gdG8gdXNlIG5ldyByZWFke2IsdyxsfSwgd3JpdGV7Yix3LGx9LCBhbmQgcGh5c190b192aXJ0CisgKiBtYWNyb3MsIHJlcGxhY2VkIGFzc2VtYmxlciByb3V0aW5lcyB3aXRoIEMuIFRoZXJlJ3MgcHJvYmFibHkgYQorICogcGVyZm9ybWFuY2UgaGl0LCBidXQgSSBvbmx5IGhhdmUgYSBjZHJvbSBhbmQgY2FuJ3QgdGVsbC4gRGVmaW5lCisgKiBTRUFHQVRFX1VTRV9BU00gaWYgeW91IHdhbnQgdGhlIG9sZCBhc3NlbWJsZXIgY29kZSAtLSBTSlQKKyAqCisgKiAxOTk4LWp1bC0yOSAtIGNyZWF0ZWQgRFBSSU5USyBtYWNyb3MgYW5kIG1hZGUgaXQgd29yayB1bmRlciAKKyAqIGxpbnV4IDIuMS4xMTIsIHNpbXBsaWZpZWQgc29tZSAjZGVmaW5lcyBldGMuIDxwYXZlbEB1Y3cuY3o+CisgKgorICogQXVnIDIwMDAgLSBhZWIgLSBkZWxldGVkIHNlYWdhdGVfc3QweF9iaW9zcGFyYW0oKS4gSXQgd291bGQgdHJ5IHRvCisgKiByZWFkIHRoZSBwaHlzaWNhbCBkaXNrIGdlb21ldHJ5LCBhIGJhZCBtaXN0YWtlLiBPZiBjb3Vyc2UgaXQgZG9lc24ndAorICogbWF0dGVyIG11Y2ggd2hhdCBnZW9tZXRyeSBvbmUgaW52ZW50cywgYnV0IG9uIGxhcmdlIGRpc2tzIGl0CisgKiByZXR1cm5lZCAyNTYgKG9yIG1vcmUpIGhlYWRzLCBjYXVzaW5nIGFsbCBraW5kIG9mIGZhaWx1cmVzLgorICogT2YgY291cnNlIHRoaXMgbWVhbnMgdGhhdCBwZW9wbGUgbWlnaHQgc2VlIGEgZGlmZmVyZW50IGdlb21ldHJ5IG5vdywKKyAqIHNvIGJvb3QgcGFyYW1ldGVycyBtYXkgYmUgbmVjZXNzYXJ5IGluIHNvbWUgY2FzZXMuCisgKi8KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gOgorICogVG8gdXNlIHdpdGhvdXQgQklPUyAtRE9WRVJSSURFPWJhc2VfYWRkcmVzcyAtRENPTlRST0xMRVI9RkQgb3IgU0VBR0FURQorICogLURJUlEgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBvZiA1LgorICogTm90ZTogWW91IGNhbiBub3cgc2V0IHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUga2VybmVsJ3MgImNvbW1hbmQgbGluZSIuCisgKiBUaGUgc3ludGF4IGlzOgorICoKKyAqICAgICBzdDB4PUFERFJFU1MsSVJRICAgICAgICAgICAgICAgIChmb3IgYSBTZWFnYXRlIGNvbnRyb2xsZXIpCisgKiBvcjoKKyAqICAgICB0bWM4eHg9QUREUkVTUyxJUlEgICAgICAgICAgICAgIChmb3IgYSBUTUMtOHh4IG9yIFRNQy05NTAgY29udHJvbGxlcikKKyAqIGVnOgorICogICAgIHRtYzh4eD0weEM4MDAwLDE1CisgKgorICogd2lsbCBjb25maWd1cmUgdGhlIGRyaXZlciBmb3IgYSBUTUMtOHh4IHN0eWxlIGNvbnRyb2xsZXIgdXNpbmcgSVJRIDE1CisgKiB3aXRoIGEgYmFzZSBhZGRyZXNzIG9mIDB4QzgwMDAuCisgKgorICogLURBUkJJVFJBVEUgCisgKiAgICAgIFdpbGwgY2F1c2UgdGhlIGhvc3QgYWRhcHRlciB0byBhcmJpdHJhdGUgZm9yIHRoZQorICogICAgICBidXMgZm9yIGJldHRlciBTQ1NJLUlJIGNvbXBhdGliaWxpdHksIHJhdGhlciB0aGFuIGp1c3QKKyAqICAgICAgd2FpdGluZyBmb3IgQlVTIEZSRUUgYW5kIHRoZW4gZG9pbmcgaXRzIHRoaW5nLiAgU2hvdWxkCisgKiAgICAgIGxldCB1cyBkbyBvbmUgY29tbWFuZCBwZXIgTHVuIHdoZW4gSSBpbnRlZ3JhdGUgbXkKKyAqICAgICAgcmVvcmdhbml6YXRpb24gY2hhbmdlcyBpbnRvIHRoZSBkaXN0cmlidXRpb24gc291cmNlcy4KKyAqCisgKiAtRERFQlVHPTY1NTM1CisgKiAgICAgIFdpbGwgYWN0aXZhdGUgZGVidWcgY29kZS4KKyAqCisgKiAtREZBU1Qgb3IgLURGQVNUMzIgCisgKiAgICAgIFdpbGwgdXNlIGJsaW5kIHRyYW5zZmVycyB3aGVyZSBwb3NzaWJsZQorICoKKyAqIC1EUEFSSVRZICAKKyAqICAgICAgVGhpcyB3aWxsIGVuYWJsZSBwYXJpdHkuCisgKgorICogLURTRUFHQVRFX1VTRV9BU00KKyAqICAgICAgV2lsbCB1c2Ugb2xkZXIgc2VhZ2F0ZSBhc3NlbWJseSBjb2RlLiBzaG91bGQgYmUgKHZlcnkgc21hbGwgYW1vdW50KQorICogICAgICBGYXN0ZXIuCisgKgorICogLURTTE9XX1JBVEU9NTAKKyAqICAgICAgV2lsbCBhbGxvdyBjb21wYXRpYmlsaXR5IHdpdGggYnJva2VuIGRldmljZXMgdGhhdCBkb24ndAorICogICAgICBoYW5kc2hha2UgZmFzdCBlbm91Z2ggKGllLCBzb21lIENEIFJPTSdzKSBmb3IgdGhlIFNlYWdhdGUKKyAqICAgICAgY29kZS4KKyAqCisgKiAgICAgIDUwIGlzIHNvbWUgbnVtYmVyLCBJdCB3aWxsIGxldCB5b3Ugc3BlY2lmeSBhIGRlZmF1bHQKKyAqICAgICAgdHJhbnNmZXIgcmF0ZSBpZiBoYW5kc2hha2luZyBpc24ndCB3b3JraW5nIGNvcnJlY3RseS4KKyAqCisgKiAtRE9MRENOVERBVEFTQ0VNRSAgVGhlcmUgaXMgYSBuZXcgc2NlbWUgdG8gc2V0IHRoZSBDT05UUk9MCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIERBVEEgcmVpZ3N0ZXJzIHdoaWNoIGNvbXBsaWVzIG1vcmUgY2xvc2VseQorICogICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIFNDU0kyIHN0YW5kYXJkLiBUaGlzIGhvcGVmdWxseSBlbGltaW5hdGVzCisgKiAgICAgICAgICAgICAgICAgICAgdGhlIG5lZWQgdG8gc3dhcCB0aGUgb3JkZXIgdGhlc2UgcmVnaXN0ZXJzIGFyZQorICogICAgICAgICAgICAgICAgICAgICdtZXNzZWQnIHdpdGguIEl0IG1ha2VzIHRoZSBmb2xsb3dpbmcgdHdvIG9wdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICBvYnNvbGV0ZS4gVG8gcmVlbmFibGUgdGhlIG9sZCBzY2VtZSBkZWZpbmUgdGhpcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHRvIG9wdGlvbnMgYXJlIHBhdGNoZXMgZnJvbSB0aGUgU0NTSS5IT1dUTworICoKKyAqIC1EU1dBUFNUQVQgIFRoaXMgd2lsbCBzd2FwIHRoZSBkZWZpbml0aW9ucyBmb3IgU1RBVF9NU0cgYW5kIFNUQVRfQ0QuCisgKgorICogLURTV0FQQ05UREFUQSAgVGhpcyB3aWxsIHN3YXAgdGhlIG9yZGVyIHRoYXQgc2VhZ2F0ZS5jIG1lc3NlcyB3aXRoCisgKiAgICAgICAgICAgICAgICB0aGUgQ09OVFJPTCBhbiBEQVRBIHJlZ2lzdGVycy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJzZWFnYXRlLmgiCisKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQUklOVEsoIHdoZW4sIG1zZy4uLiApIGRvIHsgaWYgKCAoREVCVUcgJiAod2hlbikpID09ICh3aGVuKSApIHByaW50ayggbXNnICk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKCB3aGVuLCBtc2cuLi4gKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgREFOWSggbXNnLi4uICkgRFBSSU5USyggMHhmZmZmLCBtc2cgKTsKKworI2lmbmRlZiBJUlEKKyNkZWZpbmUgSVJRIDUKKyNlbmRpZgorCisjaWZkZWYgRkFTVDMyCisjZGVmaW5lIEZBU1QKKyNlbmRpZgorCisjdW5kZWYgTElOS0VECQkJLyogTGlua2VkIGNvbW1hbmRzIGFyZSBjdXJyZW50bHkgYnJva2VuISAqLworCisjaWYgZGVmaW5lZChPVkVSUklERSkgJiYgIWRlZmluZWQoQ09OVFJPTExFUikKKyNlcnJvciBQbGVhc2UgdXNlIC1EQ09OVFJPTExFUj1TRUFHQVRFIG9yIC1EQ09OVFJPTExFUj1GRCB0byBvdmVycmlkZSBjb250cm9sbGVyIHR5cGUKKyNlbmRpZgorCisjaWZuZGVmIF9faTM4Nl9fCisjdW5kZWYgU0VBR0FURV9VU0VfQVNNCisjZW5kaWYKKworLyoKKwlUaGFua3MgdG8gQnJpYW4gQW50b2luZSBmb3IgdGhlIGV4YW1wbGUgY29kZSBpbiBoaXMgTWVzc3ktTG9zcyBTVC0wMQorCQlkcml2ZXIsIGFuZCBNaXRzdWd1IFN1enVraSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIFNULTAxCisJCVNDU0kgaG9zdC4KKyovCisKKy8qCisJQ09OVFJPTCBkZWZpbmVzCisqLworCisjZGVmaW5lIENNRF9SU1QgCQkweDAxCisjZGVmaW5lIENNRF9TRUwgCQkweDAyCisjZGVmaW5lIENNRF9CU1kgCQkweDA0CisjZGVmaW5lIENNRF9BVFROICAgIAkJMHgwOAorI2RlZmluZSBDTURfU1RBUlRfQVJCCQkweDEwCisjZGVmaW5lIENNRF9FTl9QQVJJVFkJCTB4MjAKKyNkZWZpbmUgQ01EX0lOVFIJCTB4NDAKKyNkZWZpbmUgQ01EX0RSVlJfRU5BQkxFCQkweDgwCisKKy8qCisJU1RBVFVTCisqLworI2lmZGVmIFNXQVBTVEFUCisjZGVmaW5lIFNUQVRfTVNHCQkweDA4CisjZGVmaW5lIFNUQVRfQ0QJCQkweDAyCisjZWxzZQorI2RlZmluZSBTVEFUX01TRwkJMHgwMgorI2RlZmluZSBTVEFUX0NECQkJMHgwOAorI2VuZGlmCisKKyNkZWZpbmUgU1RBVF9CU1kJCTB4MDEKKyNkZWZpbmUgU1RBVF9JTwkJCTB4MDQKKyNkZWZpbmUgU1RBVF9SRVEJCTB4MTAKKyNkZWZpbmUgU1RBVF9TRUwJCTB4MjAKKyNkZWZpbmUgU1RBVF9QQVJJVFkJCTB4NDAKKyNkZWZpbmUgU1RBVF9BUkJfQ01QTAkJMHg4MAorCisvKiAKKwlSRVFVRVNUUworKi8KKworI2RlZmluZSBSRVFfTUFTSyAoU1RBVF9DRCB8ICBTVEFUX0lPIHwgU1RBVF9NU0cpCisjZGVmaW5lIFJFUV9EQVRBT1VUIDAKKyNkZWZpbmUgUkVRX0RBVEFJTiBTVEFUX0lPCisjZGVmaW5lIFJFUV9DTURPVVQgU1RBVF9DRAorI2RlZmluZSBSRVFfU1RBVElOIChTVEFUX0NEIHwgU1RBVF9JTykKKyNkZWZpbmUgUkVRX01TR09VVCAoU1RBVF9NU0cgfCBTVEFUX0NEKQorI2RlZmluZSBSRVFfTVNHSU4gKFNUQVRfTVNHIHwgU1RBVF9DRCB8IFNUQVRfSU8pCisKK2V4dGVybiB2b2xhdGlsZSBpbnQgc2VhZ2F0ZV9zdDB4X3RpbWVvdXQ7CisKKyNpZmRlZiBQQVJJVFkKKyNkZWZpbmUgQkFTRV9DTUQgQ01EX0VOX1BBUklUWQorI2Vsc2UKKyNkZWZpbmUgQkFTRV9DTUQgIDAKKyNlbmRpZgorCisvKgorCURlYnVnZ2luZyBjb2RlCisqLworCisjZGVmaW5lIFBIQVNFX0JVU19GUkVFIDEKKyNkZWZpbmUgUEhBU0VfQVJCSVRSQVRJT04gMgorI2RlZmluZSBQSEFTRV9TRUxFQ1RJT04gNAorI2RlZmluZSBQSEFTRV9EQVRBSU4gOAorI2RlZmluZSBQSEFTRV9EQVRBT1VUIDB4MTAKKyNkZWZpbmUgUEhBU0VfQ01ET1VUIDB4MjAKKyNkZWZpbmUgUEhBU0VfTVNHSU4gMHg0MAorI2RlZmluZSBQSEFTRV9NU0dPVVQgMHg4MAorI2RlZmluZSBQSEFTRV9TVEFUVVNJTiAweDEwMAorI2RlZmluZSBQSEFTRV9FVEMgKFBIQVNFX0RBVEFJTiB8IFBIQVNFX0RBVEFPVVQgfCBQSEFTRV9DTURPVVQgfCBQSEFTRV9NU0dJTiB8IFBIQVNFX01TR09VVCB8IFBIQVNFX1NUQVRVU0lOKQorI2RlZmluZSBQUklOVF9DT01NQU5EIDB4MjAwCisjZGVmaW5lIFBIQVNFX0VYSVQgMHg0MDAKKyNkZWZpbmUgUEhBU0VfUkVTRUxFQ1QgMHg4MDAKKyNkZWZpbmUgREVCVUdfRkFTVCAweDEwMDAKKyNkZWZpbmUgREVCVUdfU0cgICAweDIwMDAKKyNkZWZpbmUgREVCVUdfTElOS0VECTB4NDAwMAorI2RlZmluZSBERUJVR19CT1JLRU4JMHg4MDAwCisKKy8qIAorICoJQ29udHJvbCBvcHRpb25zIC0gdGhlc2UgYXJlIHRpbWVvdXRzIHNwZWNpZmllZCBpbiAuMDEgc2Vjb25kcy4KKyAqLworCisvKiAzMCwgMjAgd29yayAqLworI2RlZmluZSBTVDBYX0JVU19GUkVFX0RFTEFZIDI1CisjZGVmaW5lIFNUMFhfU0VMRUNUSU9OX0RFTEFZIDI1CisKKyNkZWZpbmUgU0VBR0FURSAxCQkvKiB0aGVzZSBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRkQJMgorCisjZGVmaW5lIFNUMFhfSURfU1RSCSJTZWFnYXRlIFNULTAxL1NULTAyIgorI2RlZmluZSBGRF9JRF9TVFIJIlRNQy04WFgvVE1DLTk1MCIKKworc3RhdGljIGludCBpbnRlcm5hbF9jb21tYW5kICh1bnNpZ25lZCBjaGFyIHRhcmdldCwgdW5zaWduZWQgY2hhciBsdW4sCisJCQkgICAgIGNvbnN0IHZvaWQgKmNtbmQsCisJCQkgICAgIHZvaWQgKmJ1ZmYsIGludCBidWZmbGVuLCBpbnQgcmVzZWxlY3QpOworCitzdGF0aWMgaW50IGluY29tbWFuZDsJCS8qIHNldCBpZiBhcmJpdHJhdGlvbiBoYXMgZmluaXNoZWQKKwkJCQkgICBhbmQgd2UgYXJlIGluIHNvbWUgY29tbWFuZCBwaGFzZS4gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBiYXNlX2FkZHJlc3MgPSAwOwkvKiBXaGVyZSB0aGUgY2FyZCBST00gc3RhcnRzLCB1c2VkIHRvIAorCQkJCQkgICBjYWxjdWxhdGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcgorCQkJCQkgICBsb2NhdGlvbi4gICovCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0MHhfY3Jfc3I7CS8qIGNvbnRyb2wgcmVnaXN0ZXIgd3JpdGUsIHN0YXR1cworCQkJCQkgICByZWdpc3RlciByZWFkLiAgMjU2IGJ5dGVzIGluCisJCQkJCSAgIGxlbmd0aC4KKwkJCQkJICAgUmVhZCBpcyBzdGF0dXMgb2YgU0NTSSBCVVMsIGFzIHBlciAKKwkJCQkJICAgU1RBVCBtYXNrcy4gICovCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0MHhfZHI7CS8qIGRhdGEgcmVnaXN0ZXIsIHJlYWQgd3JpdGUgMjU2CisJCQkJICAgYnl0ZXMgaW4gbGVuZ3RoLiAgKi8KKworc3RhdGljIHZvbGF0aWxlIGludCBzdDB4X2Fib3J0ZWQgPSAwOwkvKiBzZXQgd2hlbiB3ZSBhcmUgYWJvcnRlZCwgaWUgYnkgYQorCQkJCQkgICB0aW1lIG91dCwgZXRjLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY29udHJvbGxlcl90eXBlID0gMDsJLyogc2V0IHRvIFNFQUdBVEUgZm9yIFNUMHgKKwkJCQkJCSAgIGJvYXJkcyBvciBGRCBmb3IgVE1DLTh4eAorCQkJCQkJICAgYm9hcmRzICovCitzdGF0aWMgaW50IGlycSA9IElSUTsKKworbW9kdWxlX3BhcmFtKGJhc2VfYWRkcmVzcywgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oY29udHJvbGxlcl90eXBlLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworI2RlZmluZSByZXRjb2RlKHJlc3VsdCkgKCgocmVzdWx0KSA8PCAxNikgfCAobWVzc2FnZSA8PCA4KSB8IHN0YXR1cykKKyNkZWZpbmUgU1RBVFVTICgodTgpIHJlYWRiKHN0MHhfY3Jfc3IpKQorI2RlZmluZSBEQVRBICgodTgpIHJlYWRiKHN0MHhfZHIpKQorI2RlZmluZSBXUklURV9DT05UUk9MKGQpIHsgd3JpdGViKChkKSwgc3QweF9jcl9zcik7IH0KKyNkZWZpbmUgV1JJVEVfREFUQShkKSB7IHdyaXRlYigoZCksIHN0MHhfZHIpOyB9CisKKyNpZm5kZWYgT1ZFUlJJREUKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VhZ2F0ZV9iYXNlc1tdID0geworCTB4YzgwMDAsIDB4Y2EwMDAsIDB4Y2MwMDAsCisJMHhjZTAwMCwgMHhkYzAwMCwgMHhkZTAwMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZTsKKwl1bnNpZ25lZCBvZmZzZXQ7CisJdW5zaWduZWQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKK30gU2lnbmF0dXJlOworCitzdGF0aWMgU2lnbmF0dXJlIF9faW5pdGRhdGEgc2lnbmF0dXJlc1tdID0geworCXsiU1QwMSB2MS43ICAoQykgQ29weXJpZ2h0IDE5ODcgU2VhZ2F0ZSIsIDE1LCAzNywgU0VBR0FURX0sCisJeyJTQ1NJIEJJT1MgMi4wMCAgKEMpIENvcHlyaWdodCAxOTg3IFNlYWdhdGUiLCAxNSwgNDAsIFNFQUdBVEV9LAorCisvKgorICogVGhlIGZvbGxvd2luZyB0d28gbGluZXMgYXJlIE5PVCBtaXN0YWtlcy4gIE9uZSBkZXRlY3RzIFJPTSByZXZpc2lvbgorICogMy4wLjAsIHRoZSBvdGhlciAzLjIuICBTaW5jZSBzZWFnYXRlIGhhcyBvbmx5IG9uZSB0eXBlIG9mIFNDU0kgYWRhcHRlciwKKyAqIGFuZCB0aGlzIGlzIG5vdCBnb2luZyB0byBjaGFuZ2UsIHRoZSAiU0VBR0FURSIgYW5kICJTQ1NJIiB0b2dldGhlcgorICogYXJlIHByb2JhYmx5ICJnb29kIGVub3VnaCIKKyAqLworCisJeyJTRUFHQVRFIFNDU0kgQklPUyAiLCAxNiwgMTcsIFNFQUdBVEV9LAorCXsiU0VBR0FURSBTQ1NJIEJJT1MgIiwgMTcsIDE3LCBTRUFHQVRFfSwKKworLyoKKyAqIEhvd2V2ZXIsIGZ1dHVyZSBkb21haW4gbWFrZXMgc2V2ZXJhbCBpbmNvbXBhdGlibGUgU0NTSSBib2FyZHMsIHNvIHNwZWNpZmljCisgKiBzaWduYXR1cmVzIG11c3QgYmUgdXNlZC4KKyAqLworCisJeyJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTg2LTE5ODkgVjUuMEMyLzE0Lzg5IiwgNSwgNDYsIEZEfSwKKwl7IkZVVFVSRSBET01BSU4gQ09SUC4gKEMpIDE5ODYtMTk4OSBWNi4wQTcvMjgvODkiLCA1LCA0NiwgRkR9LAorCXsiRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTkwIFY2LjAxMDUvMzEvOTAiLCA1LCA0NywgRkR9LAorCXsiRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTkwIFY2LjAyMDkvMTgvOTAiLCA1LCA0NywgRkR9LAorCXsiRlVUVVJFIERPTUFJTiBDT1JQLiAoQykgMTk4Ni0xOTkwIFY3LjAwOS8xOC85MCIsIDUsIDQ2LCBGRH0sCisJeyJGVVRVUkUgRE9NQUlOIENPUlAuIChDKSAxOTkyIFY4LjAwLjAwNC8wMi85MiIsIDUsIDQ0LCBGRH0sCisJeyJJQk0gRjEgQklPUyBWMS4xMDA0LzMwLzkyIiwgNSwgMjUsIEZEfSwKKwl7IkZVVFVSRSBET01BSU4gVE1DLTk1MCIsIDUsIDIxLCBGRH0sCisJLyogQWRkZWQgZm9yIDIuMi4xNiBieSBNYXR0aGlhc19IZWlkYnJpbmtAYi5tYXVzLmRlICovCisJeyJJQk0gRjEgVjEuMjAwOS8yMi85MyIsIDUsIDI1LCBGRH0sCit9OworCisjZGVmaW5lIE5VTV9TSUdOQVRVUkVTIChzaXplb2Yoc2lnbmF0dXJlcykgLyBzaXplb2YoU2lnbmF0dXJlKSkKKyNlbmRpZgkJCQkvKiBuIE9WRVJSSURFICovCisKKy8qCisgKiBob3N0bm8gc3RvcmVzIHRoZSBob3N0bnVtYmVyLCBhcyB0b2xkIHRvIHVzIGJ5IHRoZSBpbml0IHJvdXRpbmUuCisgKi8KKworc3RhdGljIGludCBob3N0bm8gPSAtMTsKK3N0YXRpYyB2b2lkIHNlYWdhdGVfcmVjb25uZWN0X2ludHIgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb19zZWFnYXRlX3JlY29ubmVjdF9pbnRyIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKyNpZmRlZiBGQVNUCitzdGF0aWMgaW50IGZhc3QgPSAxOworI2Vsc2UKKyNkZWZpbmUgZmFzdCAwCisjZW5kaWYKKworI2lmZGVmIFNMT1dfUkFURQorLyoKKyAqIFN1cHBvcnQgZm9yIGJyb2tlbiBkZXZpY2VzIDoKKyAqIFRoZSBTZWFnYXRlIGJvYXJkIGhhcyBhIGhhbmRzaGFraW5nIHByb2JsZW0uICBOYW1lbHksIGEgbGFjaworICogdGhlcmVvZiBmb3Igc2xvdyBkZXZpY2VzLiAgWW91IGNhbiBibGFzdCA2MDBLL3NlY29uZCB0aHJvdWdoCisgKiBpdCBpZiB5b3UgYXJlIHBvbGxpbmcgZm9yIGVhY2ggYnl0ZSwgbW9yZSBpZiB5b3UgZG8gYSBibGluZAorICogdHJhbnNmZXIuICBJbiB0aGUgZmlyc3QgY2FzZSwgd2l0aCBhIGZhc3QgZGV2aWNlLCBSRVEgd2lsbAorICogdHJhbnNpdGlvbiBoaWdoLWxvdyBvciBoaWdoLWxvdy1oaWdoIGJlZm9yZSB5b3VyIGxvb3AgcmVzdGFydHMKKyAqIGFuZCB5b3UnbGwgaGF2ZSBubyBwcm9ibGVtcy4gIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIGJvYXJkCisgKiB3aWxsIGluc2VydCB3YWl0IHN0YXRlcyBmb3IgdXAgdG8gMTMuMiB1c2VjcyBmb3IgUkVRIHRvCisgKiB0cmFuc2l0aW9uIGxvdy0+aGlnaCwgYW5kIGV2ZXJ5dGhpbmcgd2lsbCB3b3JrLgorICoKKyAqIEhvd2V2ZXIsIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgc3RhdGUgbWFjaGluZSB0aGF0IHNheXMKKyAqIHlvdSAqSEFWRSogdG8gc2VlIGEgaGlnaC1sb3ctaGlnaCBzZXQgb2YgdHJhbnNpdGlvbnMgYmVmb3JlCisgKiBzZW5kaW5nIHRoZSBuZXh0IGJ5dGUsIGFuZCBzbG93IHRoaW5ncyBsaWtlIHRoZSBUcmFudG9yIENEIFJPTVMKKyAqIHdpbGwgYnJlYWsgYmVjYXVzZSBvZiB0aGlzLgorICoKKyAqIFNvLCB3ZSBuZWVkIHRvIHNsb3cgdGhpbmdzIGRvd24sIHdoaWNoIGlzbid0IGFzIHNpbXBsZSBhcyBpdAorICogc2VlbXMuICBXZSBjYW4ndCBzbG93IHRoaW5ncyBkb3duIHBlcmlvZCwgYmVjYXVzZSB0aGVuIHBlb3BsZQorICogd2hvIGRvbid0IHJlY29tcGlsZSB0aGVpciBrZXJuZWxzIHdpbGwgc2hvb3QgbWUgZm9yIHJ1aW5pbmcKKyAqIHRoZWlyIHBlcmZvcm1hbmNlLiAgV2UgbmVlZCB0byBkbyBpdCBvbiBhIGNhc2UgcGVyIGNhc2UgYmFzaXMuCisgKgorICogVGhlIGJlc3QgZm9yIHBlcmZvcm1hbmNlIHdpbGwgYmUgdG8sIG9ubHkgZm9yIGJvcmtlbiBkZXZpY2VzCisgKiAodGhpcyBpcyBzdG9yZWQgb24gYSBwZXItdGFyZ2V0IGJhc2lzIGluIHRoZSBzY3NpX2RldmljZXMgYXJyYXkpCisgKgorICogV2FpdCBmb3IgYSBsb3ctPmhpZ2ggdHJhbnNpdGlvbiBiZWZvcmUgY29udGludWluZyB3aXRoIHRoYXQKKyAqIHRyYW5zZmVyLiAgSWYgd2UgdGltZW91dCwgY29udGludWUgYW55d2F5cy4gIFdlIGRvbid0IG5lZWQKKyAqIGEgbG9uZyB0aW1lb3V0LCBiZWNhdXNlIFJFUSBzaG91bGQgb25seSBiZSBhc3NlcnRlZCB1bnRpbCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgQUNLIGlzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQuCisgKgorICogTm90ZSB0aGF0IHdlIGNhbid0IHVzZSB0aGUgc3lzdGVtIHRpbWVyIGZvciB0aGlzLCBiZWNhdXNlIG9mCisgKiByZXNvbHV0aW9uLCBhbmQgd2UgKnJlYWxseSogY2FuJ3QgdXNlIHRoZSB0aW1lciBjaGlwIHNpbmNlCisgKiBnZXR0aW1lb2ZkYXkoKSBhbmQgdGhlIGJlZXBlciByb3V0aW5lcyB1c2UgdGhhdC4gIFNvLAorICogdGhlIGJlc3QgdGhpbmcgZm9yIHVzIHRvIGRvIHdpbGwgYmUgdG8gY2FsaWJyYXRlIGEgdGltaW5nCisgKiBsb29wIGluIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHVzaW5nIHRoZSB0aW1lciBjaGlwIGJlZm9yZQorICogZ2V0dGltZW9mZGF5KCkgY2FuIHNjcmV3IHdpdGggaXQuCisgKgorICogRklYTUU6IHRoaXMgaXMgYnJva2VuIChub3QgYm9ya2VuIDotKS4gRW1wdHkgbG9vcCBjb3N0cyBsZXNzIHRoYW4KKyAqIGxvb3Agd2l0aCBJU0EgYWNjZXNzIGluIGl0ISAtLSBwYXZlbEB1Y3cuY3oKKyAqLworCitzdGF0aWMgaW50IGJvcmtlbl9jYWxpYnJhdGlvbiA9IDA7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib3JrZW5faW5pdCAodm9pZCkKK3sKKwlyZWdpc3RlciBpbnQgY291bnQgPSAwLCBzdGFydCA9IGppZmZpZXMgKyAxLCBzdG9wID0gc3RhcnQgKyAyNTsKKworCS8qIEZJWE1FOiBUaGVyZSBtYXkgYmUgYSBiZXR0ZXIgYXBwcm9hY2gsIHRoaXMgaXMgYSBzdHJhaWdodCBwb3J0IGZvcgorCSAgIG5vdyAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCXdoaWxlICh0aW1lX2JlZm9yZSAoamlmZmllcywgc3RhcnQpKQorCQljcHVfcmVsYXgoKTsKKwlmb3IgKDsgdGltZV9iZWZvcmUgKGppZmZpZXMsIHN0b3ApOyArK2NvdW50KQorCQljcHVfcmVsYXgoKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisvKgorICogT2ssIHdlIG5vdyBoYXZlIGEgY291bnQgZm9yIC4yNSBzZWNvbmRzLiAgQ29udmVydCB0byBhCisgKiBjb3VudCBwZXIgc2Vjb25kIGFuZCBkaXZpZGUgYnkgdHJhbnNmZXIgcmF0ZSBpbiBLLiAgKi8KKworCWJvcmtlbl9jYWxpYnJhdGlvbiA9IChjb3VudCAqIDQpIC8gKFNMT1dfUkFURSAqIDEwMjQpOworCisJaWYgKGJvcmtlbl9jYWxpYnJhdGlvbiA8IDEpCisJCWJvcmtlbl9jYWxpYnJhdGlvbiA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBib3JrZW5fd2FpdCAodm9pZCkKK3sKKwlyZWdpc3RlciBpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gYm9ya2VuX2NhbGlicmF0aW9uOyBjb3VudCAmJiAoU1RBVFVTICYgU1RBVF9SRVEpOyAtLWNvdW50KQorCQljcHVfcmVsYXgoKTsKKwkgICAgIAkKKyNpZiAoREVCVUcgJiBERUJVR19CT1JLRU4pCisJaWYgKGNvdW50KQorCQlwcmludGsgKCJzY3NpJWQgOiBib3JrZW4gdGltZW91dFxuIiwgaG9zdG5vKTsKKyNlbmRpZgorfQorCisjZW5kaWYJCQkJLyogZGVmIFNMT1dfUkFURSAqLworCisvKiBUaGVzZSBiZWFzdHMgb25seSBsaXZlIG9uIElTQSwgYW5kIElTQSBtZWFucyA4TUh6LiBFYWNoIFVMT09QKCkKKyAqIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBJU0EgYWNjZXNzLCB3aGljaCB0YWtlcyBtb3JlIHRoYW4gMC4xMjUKKyAqIHVzZWMuIFNvIGlmIHdlIGxvb3AgOCB0aW1lcyB0aW1lIGluIHVzZWMsIHdlIGFyZSBzYWZlLgorICovCisKKyNkZWZpbmUgVUxPT1AoIGkgKSBmb3IgKGNsb2NrID0gaSo4OzspCisjZGVmaW5lIFRJTUVPVVQgKCEoY2xvY2stLSkpCisKK2ludCBfX2luaXQgc2VhZ2F0ZV9zdDB4X2RldGVjdCAoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBsb25nIGNyLCBkcjsKKworCXRwbnQtPnByb2NfbmFtZSA9ICJzZWFnYXRlIjsKKy8qCisgKglGaXJzdCwgd2UgdHJ5IGZvciB0aGUgbWFudWFsIG92ZXJyaWRlLgorICovCisJREFOWSAoIkF1dG9kZXRlY3RpbmcgU1QweCAvIFRNQy04eHhcbiIpOworCisJaWYgKGhvc3RubyAhPSAtMSkgeworCQlwcmludGsgKEtFUk5fRVJSICJzZWFnYXRlX3N0MHhfZGV0ZWN0KCkgY2FsbGVkIHR3aWNlPyFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKy8qIElmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgY29udHJvbGxlciB0eXBlIGZyb20gdGhlIGNvbW1hbmQgbGluZSwKKyAgIGNvbnRyb2xsZXJfdHlwZSB3aWxsIGJlIG5vbi16ZXJvLCBzbyBkb24ndCB0cnkgdG8gZGV0ZWN0IG9uZSAqLworCisJaWYgKCFjb250cm9sbGVyX3R5cGUpIHsKKyNpZmRlZiBPVkVSUklERQorCQliYXNlX2FkZHJlc3MgPSBPVkVSUklERTsKKwkJY29udHJvbGxlcl90eXBlID0gQ09OVFJPTExFUjsKKworCQlEQU5ZICgiQmFzZSBhZGRyZXNzIG92ZXJyaWRkZW4gdG8gJXgsIGNvbnRyb2xsZXIgdHlwZSBpcyAlc1xuIiwKKwkJICAgICAgYmFzZV9hZGRyZXNzLAorCQkgICAgICBjb250cm9sbGVyX3R5cGUgPT0gU0VBR0FURSA/ICJTRUFHQVRFIiA6ICJGRCIpOworI2Vsc2UJCQkJLyogT1ZFUlJJREUgKi8KKy8qCisgKiAJVG8gZGV0ZWN0IHRoaXMgY2FyZCwgd2Ugc2ltcGx5IGxvb2sgZm9yIHRoZSBzaWduYXR1cmUKKyAqICAgICAgZnJvbSB0aGUgQklPUyB2ZXJzaW9uIG5vdGljZSBpbiBhbGwgdGhlIHBvc3NpYmxlIGxvY2F0aW9ucworICogICAgICBvZiB0aGUgUk9NJ3MuICBUaGlzIGhhcyBhIG5pY2Ugc2lkZSBlZmZlY3Qgb2Ygbm90IHRyYXNoaW5nCisgKiAgICAgIGFueSByZWdpc3RlciBsb2NhdGlvbnMgdGhhdCBtaWdodCBiZSB1c2VkIGJ5IHNvbWV0aGluZyBlbHNlLgorICoKKyAqIFhYWCAtIG5vdGUgdGhhdCB3ZSBwcm9iYWJseSBzaG91bGQgYmUgcHJvYmluZyB0aGUgYWRkcmVzcworICogc3BhY2UgZm9yIHRoZSBvbi1ib2FyZCBSQU0gaW5zdGVhZC4KKyAqLworCisJCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mIChzZWFnYXRlX2Jhc2VzKSAvIHNpemVvZiAodW5zaWduZWQgaW50KSk7ICsraSkgeworCQkJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcChzZWFnYXRlX2Jhc2VzW2ldLCAweDIwMDApOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChqID0gMDsgaiA8IE5VTV9TSUdOQVRVUkVTOyArK2opCisJCQkJaWYgKGNoZWNrX3NpZ25hdHVyZShwICsgc2lnbmF0dXJlc1tqXS5vZmZzZXQsIHNpZ25hdHVyZXNbal0uc2lnbmF0dXJlLCBzaWduYXR1cmVzW2pdLmxlbmd0aCkpIHsKKwkJCQkJYmFzZV9hZGRyZXNzID0gc2VhZ2F0ZV9iYXNlc1tpXTsKKwkJCQkJY29udHJvbGxlcl90eXBlID0gc2lnbmF0dXJlc1tqXS50eXBlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQlpb3VubWFwKHApOworCQl9CisjZW5kaWYJCQkJLyogT1ZFUlJJREUgKi8KKwl9CisJLyogKCEgY29udHJvbGxlcl90eXBlKSAqLworCXRwbnQtPnRoaXNfaWQgPSAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUpID8gNyA6IDY7CisJdHBudC0+bmFtZSA9IChjb250cm9sbGVyX3R5cGUgPT0gU0VBR0FURSkgPyBTVDBYX0lEX1NUUiA6IEZEX0lEX1NUUjsKKworCWlmICghYmFzZV9hZGRyZXNzKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNlYWdhdGU6IFNUMHgvVE1DLTh4eCBub3QgZGV0ZWN0ZWQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY3IgPSBiYXNlX2FkZHJlc3MgKyAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUgPyAweDFhMDAgOiAweDFjMDApOworCWRyID0gY3IgKyAweDIwMDsKKwlzdDB4X2NyX3NyID0gaW9yZW1hcChjciwgMHgxMDApOworCXN0MHhfZHIgPSBpb3JlbWFwKGRyLCAweDEwMCk7CisKKwlEQU5ZKCIlcyBkZXRlY3RlZC4gQmFzZSBhZGRyZXNzID0gJXgsIGNyID0gJXgsIGRyID0gJXhcbiIsCisJICAgICAgdHBudC0+bmFtZSwgYmFzZV9hZGRyZXNzLCBjciwgZHIpOworCisJLyoKKwkgKglBdCBhbGwgdGltZXMsIHdlIHdpbGwgdXNlIElSUSA1LiAgU2hvdWxkIGFsc28gY2hlY2sgZm9yIElSUTMKKwkgKglpZiB3ZSBsb3NlIG91ciBmaXJzdCBpbnRlcnJ1cHQuCisJICovCisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCAwKTsKKwlpZiAoaW5zdGFuY2UgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlob3N0bm8gPSBpbnN0YW5jZS0+aG9zdF9ubzsKKwlpZiAocmVxdWVzdF9pcnEgKGlycSwgZG9fc2VhZ2F0ZV9yZWNvbm5lY3RfaW50ciwgU0FfSU5URVJSVVBULCAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUpID8gInNlYWdhdGUiIDogInRtYy04eHgiLCBpbnN0YW5jZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRJWRcbiIsIGhvc3RubywgaXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCWluc3RhbmNlLT5pcnEgPSBpcnE7CisJaW5zdGFuY2UtPmlvX3BvcnQgPSBiYXNlX2FkZHJlc3M7CisjaWZkZWYgU0xPV19SQVRFCisJcHJpbnRrKEtFUk5fSU5GTyAiQ2FsaWJyYXRpbmcgYm9ya2VuIHRpbWVyLi4uICIpOworCWJvcmtlbl9pbml0KCk7CisJcHJpbnRrKCIgJWQgY3ljbGVzIHBlciB0cmFuc2ZlclxuIiwgYm9ya2VuX2NhbGlicmF0aW9uKTsKKyNlbmRpZgorCXByaW50ayAoS0VSTl9JTkZPICJUaGlzIGlzIG9uZSBzZWNvbmQuLi4gIik7CisJeworCQlpbnQgY2xvY2s7CisJCVVMT09QICgxICogMTAwMCAqIDEwMDApIHsKKwkJCVNUQVRVUzsKKwkJCWlmIChUSU1FT1VUKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcHJpbnRrICgiZG9uZSwgJXMgb3B0aW9uczoiCisjaWZkZWYgQVJCSVRSQVRFCisJCSIgQVJCSVRSQVRFIgorI2VuZGlmCisjaWZkZWYgREVCVUcKKwkJIiBERUJVRyIKKyNlbmRpZgorI2lmZGVmIEZBU1QKKwkJIiBGQVNUIgorI2lmZGVmIEZBU1QzMgorCQkiMzIiCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIExJTktFRAorCQkiIExJTktFRCIKKyNlbmRpZgorI2lmZGVmIFBBUklUWQorCQkiIFBBUklUWSIKKyNlbmRpZgorI2lmZGVmIFNFQUdBVEVfVVNFX0FTTQorCQkiIFNFQUdBVEVfVVNFX0FTTSIKKyNlbmRpZgorI2lmZGVmIFNMT1dfUkFURQorCQkiIFNMT1dfUkFURSIKKyNlbmRpZgorI2lmZGVmIFNXQVBTVEFUCisJCSIgU1dBUFNUQVQiCisjZW5kaWYKKyNpZmRlZiBTV0FQQ05UREFUQQorCQkiIFNXQVBDTlREQVRBIgorI2VuZGlmCisJCSJcbiIsIHRwbnQtPm5hbWUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2VhZ2F0ZV9zdDB4X2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCXN0YXRpYyBjaGFyIGJ1ZmZlcls2NF07CisKKwlzbnByaW50ZihidWZmZXIsIDY0LCAiJXMgYXQgaXJxICVkLCBhZGRyZXNzIDB4JTA1WCIsCisJCSAoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUpID8gU1QwWF9JRF9TVFIgOiBGRF9JRF9TVFIsCisJCSBpcnEsIGJhc2VfYWRkcmVzcyk7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworLyoKKyAqIFRoZXNlIGFyZSBvdXIgc2F2ZWQgcG9pbnRlcnMgZm9yIHRoZSBvdXRzdGFuZGluZyBjb21tYW5kIHRoYXQgaXMKKyAqIHdhaXRpbmcgZm9yIGEgcmVjb25uZWN0CisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3VycmVudF90YXJnZXQsIGN1cnJlbnRfbHVuOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfY21uZCwgKmN1cnJlbnRfZGF0YTsKK3N0YXRpYyBpbnQgY3VycmVudF9ub2J1ZmZzOworc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqY3VycmVudF9idWZmZXI7CitzdGF0aWMgaW50IGN1cnJlbnRfYnVmZmxlbjsKKworI2lmZGVmIExJTktFRAorLyoKKyAqIGxpbmtlZF9jb25uZWN0ZWQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgY29ubmVjdGVkIHRvCisgKiBsaW5rZWRfdGFyZ2V0LCBsaW5rZWRfbHVuIGFuZCBpbiBhbiBJTkZPUk1BVElPTiBUUkFOU0ZFUiBwaGFzZSwKKyAqIHVzaW5nIGxpbmtlZCBjb21tYW5kcy4KKyAqLworCitzdGF0aWMgaW50IGxpbmtlZF9jb25uZWN0ZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGlua2VkX3RhcmdldCwgbGlua2VkX2x1bjsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCAoKmRvbmVfZm4pIChTY3NpX0NtbmQgKikgPSBOVUxMOworc3RhdGljIFNjc2lfQ21uZCAqU0NpbnQgPSBOVUxMOworCisvKgorICogVGhlc2UgY29udHJvbCB3aGV0aGVyIG9yIG5vdCBkaXNjb25uZWN0IC8gcmVjb25uZWN0IHdpbGwgYmUgYXR0ZW1wdGVkLAorICogb3IgYXJlIGJlaW5nIGF0dGVtcHRlZC4KKyAqLworCisjZGVmaW5lIE5PX1JFQ09OTkVDVCAgICAwCisjZGVmaW5lIFJFQ09OTkVDVF9OT1cgICAxCisjZGVmaW5lIENBTl9SRUNPTk5FQ1QgICAyCisKKy8qCisgKiBMSU5LRURfUklHSFQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIGNvcnJlY3QgdGFyZ2V0CisgKiBmb3IgdGhpcyBjb21tYW5kLCBMSU5LRURfV1JPTkcgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIGNvbm5lY3RlZCB0byB0aGUgd3JvbmcKKyAqIHRhcmdldC4gTm90ZSB0aGF0IHRoZXNlIGltcGx5IENBTl9SRUNPTk5FQ1QgYW5kIHJlcXVpcmUgZGVmaW5lZChMSU5LRUQpLgorICovCisKKyNkZWZpbmUgTElOS0VEX1JJR0hUICAgIDMKKyNkZWZpbmUgTElOS0VEX1dST05HICAgIDQKKworLyoKKyAqIFRoaXMgZGV0ZXJtaW5lcyBpZiB3ZSBhcmUgZXhwZWN0aW5nIHRvIHJlY29ubmVjdCBvciBub3QuCisgKi8KKworc3RhdGljIGludCBzaG91bGRfcmVjb25uZWN0ID0gMDsKKworLyoKKyAqIFRoZSBzZWFnYXRlX3JlY29ubmVjdF9pbnRyIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSB0YXJnZXQgcmVzZWxlY3RzIHRoZQorICogaG9zdCBhZGFwdGVyLiAgVGhpcyBvY2N1cnMgb24gdGhlIGludGVycnVwdCB0cmlnZ2VyZWQgYnkgdGhlIHRhcmdldAorICogYXNzZXJ0aW5nIFNFTC4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fc2VhZ2F0ZV9yZWNvbm5lY3RfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSAoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzZWFnYXRlX3JlY29ubmVjdF9pbnRyIChpcnEsIGRldl9pZCwgcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlYWdhdGVfcmVjb25uZWN0X2ludHIgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHRlbXA7CisJU2NzaV9DbW5kICpTQ3RtcDsKKworCURQUklOVEsgKFBIQVNFX1JFU0VMRUNULCAic2NzaSVkIDogc2VhZ2F0ZV9yZWNvbm5lY3RfaW50cigpIGNhbGxlZFxuIiwgaG9zdG5vKTsKKworCWlmICghc2hvdWxkX3JlY29ubmVjdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiB1bmV4cGVjdGVkIGludGVycnVwdC5cbiIsIGhvc3Rubyk7CisJZWxzZSB7CisJCXNob3VsZF9yZWNvbm5lY3QgPSAwOworCisJCURQUklOVEsgKFBIQVNFX1JFU0VMRUNULCAic2NzaSVkIDogaW50ZXJuYWxfY29tbWFuZCglZCwgJTA4eCwgJTA4eCwgUkVDT05ORUNUX05PV1xuIiwgCisJCQlob3N0bm8sIGN1cnJlbnRfdGFyZ2V0LCBjdXJyZW50X2RhdGEsIGN1cnJlbnRfYnVmZmxlbik7CisKKwkJdGVtcCA9IGludGVybmFsX2NvbW1hbmQgKGN1cnJlbnRfdGFyZ2V0LCBjdXJyZW50X2x1biwgY3VycmVudF9jbW5kLCBjdXJyZW50X2RhdGEsIGN1cnJlbnRfYnVmZmxlbiwgUkVDT05ORUNUX05PVyk7CisKKwkJaWYgKG1zZ19ieXRlKHRlbXApICE9IERJU0NPTk5FQ1QpIHsKKwkJCWlmIChkb25lX2ZuKSB7CisJCQkJRFBSSU5USyhQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IGRvbmVfZm4oJWQsJTA4eCkiLCBob3N0bm8sIGhvc3RubywgdGVtcCk7CisJCQkJaWYgKCFTQ2ludCkKKwkJCQkJcGFuaWMgKCJTQ2ludCA9PSBOVUxMIGluIHNlYWdhdGUiKTsKKwkJCQlTQ3RtcCA9IFNDaW50OworCQkJCVNDaW50ID0gTlVMTDsKKwkJCQlTQ3RtcC0+cmVzdWx0ID0gdGVtcDsKKwkJCQlkb25lX2ZuKFNDdG1wKTsKKwkJCX0gZWxzZQorCQkJCXByaW50ayhLRVJOX0VSUiAiZG9uZV9mbigpIG5vdCBkZWZpbmVkLlxuIik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgc2VhZ2F0ZV9zdDB4X3F1ZXVlX2NvbW1hbmQoKSBmdW5jdGlvbiBwcm92aWRlcyBhIHF1ZXVlZCBpbnRlcmZhY2UKKyAqIHRvIHRoZSBzZWFnYXRlIFNDU0kgZHJpdmVyLiAgQmFzaWNhbGx5LCBpdCBqdXN0IHBhc3NlcyBjb250cm9sIG9udG8gdGhlCisgKiBzZWFnYXRlX2NvbW1hbmQoKSBmdW5jdGlvbiwgYWZ0ZXIgZml4aW5nIGl0IHNvIHRoYXQgdGhlIGRvbmVfZm4oKQorICogaXMgc2V0IHRvIHRoZSBvbmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gIFdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsLAorICogYmVjYXVzZSB0aGVyZSBhcmUgc29tZSBjb21tYW5kcyBvbiBzb21lIGRldmljZXMgdGhhdCBkbyBub3QgZGlzY29ubmVjdCwKKyAqIGFuZCBpZiB3ZSBzaW1wbHkgY2FsbCB0aGUgZG9uZV9mbiB3aGVuIHRoZSBjb21tYW5kIGlzIGRvbmUgdGhlbiBhbm90aGVyCisgKiBjb21tYW5kIGlzIHN0YXJ0ZWQgYW5kIHF1ZXVlX2NvbW1hbmQgaXMgY2FsbGVkIGFnYWluLi4uICBXZSBlbmQgdXAKKyAqIG92ZXJmbG93aW5nIHRoZSBrZXJuZWwgc3RhY2ssIGFuZCB0aGlzIHRlbmRzIG5vdCB0byBiZSBzdWNoIGEgZ29vZCBpZGVhLgorICovCisKK3N0YXRpYyBpbnQgcmVjdXJzaW9uX2RlcHRoID0gMDsKKworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfcXVldWVfY29tbWFuZCAoU2NzaV9DbW5kICogU0NwbnQsIHZvaWQgKCpkb25lKSAoU2NzaV9DbW5kICopKQoreworCWludCByZXN1bHQsIHJlY29ubmVjdDsKKwlTY3NpX0NtbmQgKlNDdG1wOworCisJREFOWSAoInNlYWdhdGU6IHF1ZV9jb21tYW5kIik7CisJZG9uZV9mbiA9IGRvbmU7CisJY3VycmVudF90YXJnZXQgPSBTQ3BudC0+ZGV2aWNlLT5pZDsKKwljdXJyZW50X2x1biA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKwljdXJyZW50X2NtbmQgPSBTQ3BudC0+Y21uZDsKKwljdXJyZW50X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJY3VycmVudF9idWZmbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwlTQ2ludCA9IFNDcG50OworCWlmIChyZWN1cnNpb25fZGVwdGgpCisJCXJldHVybiAxOworCXJlY3Vyc2lvbl9kZXB0aCsrOworCWRvIHsKKyNpZmRlZiBMSU5LRUQKKwkJLyoKKwkJICogU2V0IGxpbmtlZCBjb21tYW5kIGJpdCBpbiBjb250cm9sIGZpZWxkIG9mIFNDU0kgY29tbWFuZC4KKwkJICovCisKKwkJY3VycmVudF9jbW5kW1NDcG50LT5jbWRfbGVuXSB8PSAweDAxOworCQlpZiAobGlua2VkX2Nvbm5lY3RlZCkgeworCQkJRFBSSU5USyAoREVCVUdfTElOS0VELCAic2NzaSVkIDogdXNpbmcgbGlua2VkIGNvbW1hbmRzLCBjdXJyZW50IElfVF9MIG5leHVzIGlzICIsIGhvc3Rubyk7CisJCQlpZiAobGlua2VkX3RhcmdldCA9PSBjdXJyZW50X3RhcmdldCAmJiBsaW5rZWRfbHVuID09IGN1cnJlbnRfbHVuKSAKKwkJCXsKKwkJCQlEUFJJTlRLKERFQlVHX0xJTktFRCwgImNvcnJlY3RcbiIpOworCQkJCXJlY29ubmVjdCA9IExJTktFRF9SSUdIVDsKKwkJCX0gZWxzZSB7CisJCQkJRFBSSU5USyhERUJVR19MSU5LRUQsICJpbmNvcnJlY3RcbiIpOworCQkJCXJlY29ubmVjdCA9IExJTktFRF9XUk9ORzsKKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYJCQkJLyogTElOS0VEICovCisJCQlyZWNvbm5lY3QgPSBDQU5fUkVDT05ORUNUOworCisJCXJlc3VsdCA9IGludGVybmFsX2NvbW1hbmQoU0NpbnQtPmRldmljZS0+aWQsIFNDaW50LT5kZXZpY2UtPmx1biwgU0NpbnQtPmNtbmQsCisJCQkJICAgICAgU0NpbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ2ludC0+cmVxdWVzdF9idWZmbGVuLCByZWNvbm5lY3QpOworCQlpZiAobXNnX2J5dGUocmVzdWx0KSA9PSBESVNDT05ORUNUKQorCQkJYnJlYWs7CisJCVNDdG1wID0gU0NpbnQ7CisJCVNDaW50ID0gTlVMTDsKKwkJU0N0bXAtPnJlc3VsdCA9IHJlc3VsdDsKKwkJZG9uZV9mbihTQ3RtcCk7CisJfQorCXdoaWxlIChTQ2ludCk7CisJcmVjdXJzaW9uX2RlcHRoLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJuYWxfY29tbWFuZCAodW5zaWduZWQgY2hhciB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgbHVuLAorCQkgIGNvbnN0IHZvaWQgKmNtbmQsIHZvaWQgKmJ1ZmYsIGludCBidWZmbGVuLCBpbnQgcmVzZWxlY3QpCit7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpidWZmZXIgPSBOVUxMOworCWludCBjbG9jaywgdGVtcCwgbm9idWZmcyA9IDAsIGRvbmUgPSAwLCBsZW4gPSAwOworI2lmZGVmIERFQlVHCisJaW50IHRyYW5zZmVyZWQgPSAwLCBwaGFzZSA9IDAsIG5ld3BoYXNlOworI2VuZGlmCisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBzdGF0dXNfcmVhZDsKKwl1bnNpZ25lZCBjaGFyIHRtcF9kYXRhLCB0bXBfY29udHJvbCwgc3RhdHVzID0gMCwgbWVzc2FnZSA9IDA7CisJdW5zaWduZWQgdHJhbnNmZXJzaXplID0gMCwgdW5kZXJmbG93ID0gMDsKKyNpZmRlZiBTTE9XX1JBVEUKKwlpbnQgYm9ya2VuID0gKGludCkgU0NpbnQtPmRldmljZS0+Ym9ya2VuOwkvKiBEb2VzIHRoZSBjdXJyZW50IHRhcmdldCByZXF1aXJlCisJCQkJCQkJICAgVmVyeSBTbG93IEkvTyA/ICAqLworI2VuZGlmCisKKwlpbmNvbW1hbmQgPSAwOworCXN0MHhfYWJvcnRlZCA9IDA7CisKKyNpZiAoREVCVUcgJiBQUklOVF9DT01NQU5EKQorCXByaW50aygic2NzaSVkIDogdGFyZ2V0ID0gJWQsIGNvbW1hbmQgPSAiLCBob3N0bm8sIHRhcmdldCk7CisJcHJpbnRfY29tbWFuZCgodW5zaWduZWQgY2hhciAqKSBjbW5kKTsKKyNlbmRpZgorCisjaWYgKERFQlVHICYgUEhBU0VfUkVTRUxFQ1QpCisJc3dpdGNoIChyZXNlbGVjdCkgeworCWNhc2UgUkVDT05ORUNUX05PVzoKKwkJcHJpbnRrKCJzY3NpJWQgOiByZWNvbm5lY3RpbmdcbiIsIGhvc3Rubyk7CisJCWJyZWFrOworI2lmZGVmIExJTktFRAorCWNhc2UgTElOS0VEX1JJR0hUOgorCQlwcmludGsoInNjc2klZCA6IGNvbm5lY3RlZCwgY2FuIHJlY29ubmVjdFxuIiwgaG9zdG5vKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5LRURfV1JPTkc6CisJCXByaW50aygic2NzaSVkIDogY29ubmVjdGVkIHRvIHdyb25nIHRhcmdldCwgY2FuIHJlY29ubmVjdFxuIiwKKwkJCWhvc3Rubyk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBDQU5fUkVDT05ORUNUOgorCQlwcmludGsoInNjc2klZCA6IGFsbG93ZWQgdG8gcmVjb25uZWN0XG4iLCBob3N0bm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoInNjc2klZCA6IG5vdCBhbGxvd2VkIHRvIHJlY29ubmVjdFxuIiwgaG9zdG5vKTsKKwl9CisjZW5kaWYKKworCWlmICh0YXJnZXQgPT0gKGNvbnRyb2xsZXJfdHlwZSA9PSBTRUFHQVRFID8gNyA6IDYpKQorCQlyZXR1cm4gRElEX0JBRF9UQVJHRVQ7CisKKwkvKgorCSAqCVdlIHdvcmsgaXQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIGlmIHRoaXMgaXMgaXMgInRoZSBmaXJzdCB0aW1lLCIKKwkgKiAgICAgIG9yIGEgcmVjb25uZWN0LiAgSWYgdGhpcyBpcyBhIHJlc2VsZWN0IHBoYXNlLCB0aGVuIFNFTCB3aWxsCisJICogICAgICBiZSBhc3NlcnRlZCwgYW5kIHdlIG11c3Qgc2tpcCBzZWxlY3Rpb24gLyBhcmJpdHJhdGlvbiBwaGFzZXMuCisJICovCisKKwlzd2l0Y2ggKHJlc2VsZWN0KSB7CisJY2FzZSBSRUNPTk5FQ1RfTk9XOgorCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IHBoYXNlIFJFU0VMRUNUIFxuIiwgaG9zdG5vKTsKKwkJLyoKKwkJICoJQXQgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIGZpbmQgdGhlIGxvZ2ljYWwgb3Igb2Ygb3VyIElECisJCSAqCWFuZCB0aGUgb3JpZ2luYWwgdGFyZ2V0J3MgSUQgb24gdGhlIEJVUywgd2l0aCBCU1ksIFNFTCwKKwkJICoJYW5kIEkvTyBzaWduYWxzIGFzc2VydGVkLgorCQkgKgorCQkgKiAgICAgIEFmdGVyIEFSQklUUkFUSU9OIHBoYXNlIGlzIGNvbXBsZXRlZCwgb25seSBTRUwsIEJTWSwKKwkJICoJYW5kIHRoZSB0YXJnZXQgSUQgYXJlIGFzc2VydGVkLiAgQSB2YWxpZCBpbml0aWF0b3IgSUQKKwkJICoJaXMgbm90IG9uIHRoZSBidXMgdW50aWwgSU8gaXMgYXNzZXJ0ZWQsIHNvIHdlIG11c3Qgd2FpdAorCQkgKglmb3IgdGhhdC4KKwkJICovCisJCVVMT09QICgxMDAgKiAxMDAwKSB7CisJCQl0ZW1wID0gU1RBVFVTOworCQkJaWYgKCh0ZW1wICYgU1RBVF9JTykgJiYgISh0ZW1wICYgU1RBVF9CU1kpKQorCQkJCWJyZWFrOworCQkJaWYgKFRJTUVPVVQpIHsKKwkJCQlEUFJJTlRLIChQSEFTRV9SRVNFTEVDVCwgInNjc2klZCA6IFJFU0VMRUNUIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciBJTyAuXG4iLCBob3N0bm8pOworCQkJCXJldHVybiAoRElEX0JBRF9JTlRSIDw8IDE2KTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqCUFmdGVyIEkvTyBpcyBhc3NlcnRlZCBieSB0aGUgdGFyZ2V0LCB3ZSBjYW4gcmVhZCBvdXIgSUQKKwkJICoJYW5kIGl0cyBJRCBvZmYgb2YgdGhlIEJVUy4KKwkJICovCisKKwkJaWYgKCEoKHRlbXAgPSBEQVRBKSAmIChjb250cm9sbGVyX3R5cGUgPT0gU0VBR0FURSA/IDB4ODAgOiAweDQwKSkpIHsKKwkJCURQUklOVEsgKFBIQVNFX1JFU0VMRUNULCAic2NzaSVkIDogZGV0ZWN0ZWQgcmVjb25uZWN0IHJlcXVlc3QgdG8gZGlmZmVyZW50IHRhcmdldC5cblx0RGF0YSBidXMgPSAlZFxuIiwgaG9zdG5vLCB0ZW1wKTsKKwkJCXJldHVybiAoRElEX0JBRF9JTlRSIDw8IDE2KTsKKwkJfQorCisJCWlmICghKHRlbXAgJiAoMSA8PCBjdXJyZW50X3RhcmdldCkpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBVbmV4cGVjdGVkIHJlc2VsZWN0IGludGVycnVwdC4gIERhdGEgYnVzID0gJWRcbiIsIGhvc3RubywgdGVtcCk7CisJCQlyZXR1cm4gKERJRF9CQURfSU5UUiA8PCAxNik7CisJCX0KKworCQlidWZmZXIgPSBjdXJyZW50X2J1ZmZlcjsKKwkJY21uZCA9IGN1cnJlbnRfY21uZDsJLyogV0RFIGFkZCAqLworCQlkYXRhID0gY3VycmVudF9kYXRhOwkvKiBXREUgYWRkICovCisJCWxlbiA9IGN1cnJlbnRfYnVmZmxlbjsJLyogV0RFIGFkZCAqLworCQlub2J1ZmZzID0gY3VycmVudF9ub2J1ZmZzOworCisJCS8qCisJCSAqCVdlIGhhdmUgZGV0ZXJtaW5lZCB0aGF0IHdlIGhhdmUgYmVlbiBzZWxlY3RlZC4gIEF0IHRoaXMKKwkJICoJcG9pbnQsIHdlIG11c3QgcmVzcG9uZCB0byB0aGUgcmVzZWxlY3Rpb24gYnkgYXNzZXJ0aW5nCisJCSAqCUJTWSBvdXJzZWx2ZXMKKwkJICovCisKKyNpZiAxCisJCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EIHwgQ01EX0RSVlJfRU5BQkxFIHwgQ01EX0JTWSk7CisjZWxzZQorCQlXUklURV9DT05UUk9MIChCQVNFX0NNRCB8IENNRF9CU1kpOworI2VuZGlmCisKKwkJLyoKKwkJICoJVGhlIHRhcmdldCB3aWxsIGRyb3AgU0VMLCBhbmQgcmFpc2UgQlNZLCBhdCB3aGljaCB0aW1lCisJCSAqCXdlIG11c3QgZHJvcCBCU1kuCisJCSAqLworCisJCVVMT09QICgxMDAgKiAxMDAwKSB7CisJCQlpZiAoIShTVEFUVVMgJiBTVEFUX1NFTCkpCisJCQkJYnJlYWs7CisJCQlpZiAoVElNRU9VVCkgeworCQkJCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EIHwgQ01EX0lOVFIpOworCQkJCURQUklOVEsgKFBIQVNFX1JFU0VMRUNULCAic2NzaSVkIDogUkVTRUxFQ1QgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFNFTC5cbiIsIGhvc3Rubyk7CisJCQkJcmV0dXJuIChESURfQkFEX0lOVFIgPDwgMTYpOworCQkJfQorCQl9CisJCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EKTsKKwkJLyoKKwkJICoJQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBjb25uZWN0ZWQgd2l0aCB0aGUgdGFyZ2V0CisJCSAqCWFuZCBjYW4gZ2V0IG9uIHdpdGggb3VyIGxpdmVzLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBDQU5fUkVDT05ORUNUOgorI2lmZGVmIExJTktFRAorCQkvKgorCQkgKiBUaGlzIGlzIGEgYmxldGNoZXJvdXMgaGFjaywganVzdCBhcyBiYWQgYXMgdGhlIFVuaXggIyEKKwkJICogaW50ZXJwcmV0ZXIgc3R1ZmYuIElmIGl0IHR1cm5zIG91dCB3ZSBhcmUgdXNpbmcgdGhlIHdyb25nCisJCSAqIElfVF9MIG5leHVzLCB0aGUgZWFzaWVzdCB3YXkgdG8gZGVhbCB3aXRoIGl0IGlzIHRvIGdvIGludG8KKwkJICogIG91ciBJTkZPUk1BVElPTiBUUkFOU0ZFUiBQSEFTRSBjb2RlLCBzZW5kIGEgQUJPUlQKKwkJICogbWVzc2FnZSBvbiBNRVNTQUdFIE9VVCBwaGFzZSwgYW5kIHRoZW4gbG9vcCBiYWNrIHRvIGhlcmUuCisJCSAqLworY29ubmVjdF9sb29wOgorI2VuZGlmCisJCURQUklOVEsgKFBIQVNFX0JVU19GUkVFLCAic2NzaSVkIDogcGhhc2UgPSBCVVMgRlJFRSBcbiIsIGhvc3Rubyk7CisKKwkJLyoKKwkJICogICAgQlVTIEZSRUUgUEhBU0UKKwkJICoKKwkJICogICAgICBPbiBlbnRyeSwgd2UgbWFrZSBzdXJlIHRoYXQgdGhlIEJVUyBpcyBpbiBhIEJVUyBGUkVFCisJCSAqICAgICAgcGhhc2UsIGJ5IGluc3VyaW5nIHRoYXQgYm90aCBCU1kgYW5kIFNFTCBhcmUgbG93IGZvcgorCQkgKiAgICAgIGF0IGxlYXN0IG9uZSBidXMgc2V0dGxlIGRlbGF5LiAgU2V2ZXJhbCByZWFkcyBoZWxwCisJCSAqICAgICAgZWxpbWluYXRlIHdpcmUgZ2xpdGNoLgorCQkgKi8KKworI2lmbmRlZiBBUkJJVFJBVEUKKyNlcnJvciBGSVhNRTogdGhpcyBpcyBicm9rZW46IHdlIG1heSBub3QgdXNlIGppZmZpZXMgaGVyZSAtIHdlIGFyZSB1bmRlciBjbGkoKS4gSXQgd2lsbCBoYXJkbG9jay4KKwkJY2xvY2sgPSBqaWZmaWVzICsgU1QwWF9CVVNfRlJFRV9ERUxBWTsKKworCQl3aGlsZSAoKChTVEFUVVMgfCBTVEFUVVMgfCBTVEFUVVMpICYgKFNUQVRfQlNZIHwgU1RBVF9TRUwpKSAmJiAoIXN0MHhfYWJvcnRlZCkgJiYgdGltZV9iZWZvcmUgKGppZmZpZXMsIGNsb2NrKSkKKwkJCWNwdV9yZWxheCgpOworCisJCWlmICh0aW1lX2FmdGVyIChqaWZmaWVzLCBjbG9jaykpCisJCQlyZXR1cm4gcmV0Y29kZSAoRElEX0JVU19CVVNZKTsKKwkJZWxzZSBpZiAoc3QweF9hYm9ydGVkKQorCQkJcmV0dXJuIHJldGNvZGUgKHN0MHhfYWJvcnRlZCk7CisjZW5kaWYKKwkJRFBSSU5USyAoUEhBU0VfU0VMRUNUSU9OLCAic2NzaSVkIDogcGhhc2UgPSBTRUxFQ1RJT05cbiIsIGhvc3Rubyk7CisKKwkJY2xvY2sgPSBqaWZmaWVzICsgU1QwWF9TRUxFQ1RJT05fREVMQVk7CisKKwkJLyoKKwkJICogQXJiaXRyYXRpb24vc2VsZWN0aW9uIHByb2NlZHVyZSA6CisJCSAqIDEuICBEaXNhYmxlIGRyaXZlcnMKKwkJICogMi4gIFdyaXRlIEhPU1QgYWRhcHRlciBhZGRyZXNzIGJpdAorCQkgKiAzLiAgU2V0IHN0YXJ0IGFyYml0cmF0aW9uLgorCQkgKiA0LiAgV2UgZ2V0IGVpdGhlciBBUkJJVFJBVElPTiBDT01QTEVURSBvciBTRUxFQ1QgYXQgdGhpcworCQkgKiAgICAgcG9pbnQuCisJCSAqIDUuICBPUiBvdXIgSUQgYW5kIHRhcmdldHMgb24gYnVzLgorCQkgKiA2LiAgRW5hYmxlIFNDU0kgZHJpdmVycyBhbmQgYXNzZXJ0ZWQgU0VMIGFuZCBBVFROCisJCSAqLworCisjaWZkZWYgQVJCSVRSQVRFCisJCS8qIEZJWE1FOiB2ZXJpZnkgaG9zdCBsb2NrIGlzIGFsd2F5cyBoZWxkIGhlcmUgKi8KKwkJV1JJVEVfQ09OVFJPTCgwKTsKKwkJV1JJVEVfREFUQSgoY29udHJvbGxlcl90eXBlID09IFNFQUdBVEUpID8gMHg4MCA6IDB4NDApOworCQlXUklURV9DT05UUk9MKENNRF9TVEFSVF9BUkIpOworCisJCVVMT09QIChTVDBYX1NFTEVDVElPTl9ERUxBWSAqIDEwMDAwKSB7CisJCQlzdGF0dXNfcmVhZCA9IFNUQVRVUzsKKwkJCWlmIChzdGF0dXNfcmVhZCAmIFNUQVRfQVJCX0NNUEwpCisJCQkJYnJlYWs7CisJCQlpZiAoc3QweF9hYm9ydGVkKQkvKiBGSVhNRTogV2hhdD8gV2UgYXJlIGdvaW5nIHRvIGRvIHNvbWV0aGluZyBldmVuIGFmdGVyIGFib3J0PyAqLworCQkJCWJyZWFrOworCQkJaWYgKFRJTUVPVVQgfHwgKHN0YXR1c19yZWFkICYgU1RBVF9TRUwpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogYXJiaXRyYXRpb24gbG9zdCBvciB0aW1lb3V0LlxuIiwgaG9zdG5vKTsKKwkJCQlXUklURV9DT05UUk9MIChCQVNFX0NNRCk7CisJCQkJcmV0dXJuIHJldGNvZGUgKERJRF9OT19DT05ORUNUKTsKKwkJCX0KKwkJfQorCQlEUFJJTlRLIChQSEFTRV9TRUxFQ1RJT04sICJzY3NpJWQgOiBhcmJpdHJhdGlvbiBjb21wbGV0ZVxuIiwgaG9zdG5vKTsKKyNlbmRpZgorCisJCS8qCisJCSAqICAgIFdoZW4gdGhlIFNDU0kgZGV2aWNlIGRlY2lkZXMgdGhhdCB3ZSdyZSBnYXdraW5nIGF0IGl0LCAKKwkJICogICAgaXQgd2lsbCByZXNwb25kIGJ5IGFzc2VydGluZyBCVVNZIG9uIHRoZSBidXMuCisJCSAqCisJCSAqICAgIE5vdGUgOiB0aGUgU2VhZ2F0ZSBTVC0wMS8wMiBwcm9kdWN0IG1hbnVhbCBzYXlzIHRoYXQgd2UKKwkJICogICAgc2hvdWxkIHR3aWRkbGUgdGhlIERBVEEgcmVnaXN0ZXIgYmVmb3JlIHRoZSBjb250cm9sCisJCSAqICAgIHJlZ2lzdGVyLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IHdvcmsgcmVsaWFibHkgc28gd2UgZG8KKwkJICogICAgaXQgdGhlIG90aGVyIHdheSBhcm91bmQuCisJCSAqCisJCSAqICAgIFByb2JhYmx5IGNvdWxkIGJlIGEgcHJvYmxlbSB3aXRoIGFyYml0cmF0aW9uIHRvbywgd2UKKwkJICogICAgcmVhbGx5IHNob3VsZCB0cnkgdGhpcyB3aXRoIGEgU0NTSSBwcm90b2NvbCBvciBsb2dpYyAKKwkJICogICAgYW5hbHl6ZXIgdG8gc2VlIHdoYXQgaXMgZ29pbmcgb24uCisJCSAqLworCQl0bXBfZGF0YSA9ICh1bnNpZ25lZCBjaGFyKSAoKDEgPDwgdGFyZ2V0KSB8IChjb250cm9sbGVyX3R5cGUgPT0gU0VBR0FURSA/IDB4ODAgOiAweDQwKSk7CisJCXRtcF9jb250cm9sID0gQkFTRV9DTUQgfCBDTURfRFJWUl9FTkFCTEUgfCBDTURfU0VMIHwgKHJlc2VsZWN0ID8gQ01EX0FUVE4gOiAwKTsKKworCQkvKiBGSVhNRTogdmVyaWZ5IGhvc3QgbG9jayBpcyBhbHdheXMgaGVsZCBoZXJlICovCisjaWZkZWYgT0xEQ05UREFUQVNDRU1FCisjaWZkZWYgU1dBUENOVERBVEEKKwkJV1JJVEVfQ09OVFJPTCAodG1wX2NvbnRyb2wpOworCQlXUklURV9EQVRBICh0bXBfZGF0YSk7CisjZWxzZQorCQlXUklURV9EQVRBICh0bXBfZGF0YSk7CisJCVdSSVRFX0NPTlRST0wgKHRtcF9jb250cm9sKTsKKyNlbmRpZgorI2Vsc2UKKwkJdG1wX2NvbnRyb2wgXj0gQ01EX0JTWTsJLyogVGhpcyBpcyBndWVzc3dvcmsuIFdoYXQgdXNlZCB0byBiZSBpbiBkcml2ZXIgICAgKi8KKwkJV1JJVEVfQ09OVFJPTCAodG1wX2NvbnRyb2wpOwkvKiBjb3VsZCBuZXZlciB3b3JrOiBpdCBzZW50IGRhdGEgaW50byBjb250cm9sICAgICAqLworCQlXUklURV9EQVRBICh0bXBfZGF0YSk7CS8qIHJlZ2lzdGVyIGFuZCBjb250cm9sIGluZm8gaW50byBkYXRhLiBIb3BlZnVsbHkgICovCisJCXRtcF9jb250cm9sIF49IENNRF9CU1k7CS8qIGZpeGVkLCBidXQgb3JkZXIgb2YgZmlyc3QgdHdvIG1heSBiZSB3cm9uZy4gICAgICovCisJCVdSSVRFX0NPTlRST0wgKHRtcF9jb250cm9sKTsJLyogLS0gcGF2ZWxAdWN3LmN6ICAgKi8KKyNlbmRpZgorCisJCVVMT09QICgyNTAgKiAxMDAwKSB7CisJCQlpZiAoc3QweF9hYm9ydGVkKSB7CisJCQkJLyoKKwkJCQkgKglJZiB3ZSBoYXZlIGJlZW4gYWJvcnRlZCwgYW5kIHdlIGhhdmUgYQorCQkJCSAqCWNvbW1hbmQgaW4gcHJvZ3Jlc3MsIElFIHRoZSB0YXJnZXQgCisJCQkJICoJc3RpbGwgaGFzIEJTWSBhc3NlcnRlZCwgdGhlbiB3ZSB3aWxsCisJCQkJICoJcmVzZXQgdGhlIGJ1cywgYW5kIG5vdGlmeSB0aGUgbWlkbGV2ZWwKKwkJCQkgKglkcml2ZXIgdG8gZXhwZWN0IHNlbnNlLgorCQkJCSAqLworCisJCQkJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQpOworCQkJCWlmIChTVEFUVVMgJiBTVEFUX0JTWSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQgOiBCU1QgYXNzZXJ0ZWQgYWZ0ZXIgd2UndmUgYmVlbiBhYm9ydGVkLlxuIiwgaG9zdG5vKTsKKwkJCQkJc2VhZ2F0ZV9zdDB4X2J1c19yZXNldChOVUxMKTsKKwkJCQkJcmV0dXJuIHJldGNvZGUgKERJRF9SRVNFVCk7CisJCQkJfQorCQkJCXJldHVybiByZXRjb2RlIChzdDB4X2Fib3J0ZWQpOworCQkJfQorCQkJaWYgKFNUQVRVUyAmIFNUQVRfQlNZKQorCQkJCWJyZWFrOworCQkJaWYgKFRJTUVPVVQpIHsKKwkJCQlEUFJJTlRLIChQSEFTRV9TRUxFQ1RJT04sICJzY3NpJWQgOiBOTyBDT05ORUNUIHdpdGggdGFyZ2V0ICVkLCBzdGF0ID0gJXggXG4iLCBob3N0bm8sIHRhcmdldCwgU1RBVFVTKTsKKwkJCQlyZXR1cm4gcmV0Y29kZSAoRElEX05PX0NPTk5FQ1QpOworCQkJfQorCQl9CisKKwkJLyogRXN0YWJsaXNoIGN1cnJlbnQgcG9pbnRlcnMuICBUYWtlIGludG8gYWNjb3VudCBzY2F0dGVyIC8gZ2F0aGVyICovCisKKwkJaWYgKChub2J1ZmZzID0gU0NpbnQtPnVzZV9zZykpIHsKKyNpZiAoREVCVUcgJiBERUJVR19TRykKKwkJCXsKKwkJCQlpbnQgaTsKKwkJCQlwcmludGsoInNjc2klZCA6IHNjYXR0ZXIgZ2F0aGVyIHJlcXVlc3RlZCwgdXNpbmcgJWQgYnVmZmVycy5cbiIsIGhvc3Rubywgbm9idWZmcyk7CisJCQkJZm9yIChpID0gMDsgaSA8IG5vYnVmZnM7ICsraSkKKwkJCQkJcHJpbnRrKCJzY3NpJWQgOiBidWZmZXIgJWQgYWRkcmVzcyA9ICVwIGxlbmd0aCA9ICVkXG4iLAorCQkJCQkgICAgIGhvc3RubywgaSwKKwkJCQkJICAgICBwYWdlX2FkZHJlc3MoYnVmZmVyW2ldLnBhZ2UpICsgYnVmZmVyW2ldLm9mZnNldCwKKwkJCQkJICAgICBidWZmZXJbaV0ubGVuZ3RoKTsKKwkJCX0KKyNlbmRpZgorCisJCQlidWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDaW50LT5idWZmZXI7CisJCQlsZW4gPSBidWZmZXItPmxlbmd0aDsKKwkJCWRhdGEgPSBwYWdlX2FkZHJlc3MoYnVmZmVyLT5wYWdlKSArIGJ1ZmZlci0+b2Zmc2V0OworCQl9IGVsc2UgeworCQkJRFBSSU5USyAoREVCVUdfU0csICJzY3NpJWQgOiBzY2F0dGVyIGdhdGhlciBub3QgcmVxdWVzdGVkLlxuIiwgaG9zdG5vKTsKKwkJCWJ1ZmZlciA9IE5VTEw7CisJCQlsZW4gPSBTQ2ludC0+cmVxdWVzdF9idWZmbGVuOworCQkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIFNDaW50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJfQorCisJCURQUklOVEsgKFBIQVNFX0RBVEFJTiB8IFBIQVNFX0RBVEFPVVQsICJzY3NpJWQgOiBsZW4gPSAlZFxuIiwKKwkJCSBob3N0bm8sIGxlbik7CisKKwkJYnJlYWs7CisjaWZkZWYgTElOS0VECisJY2FzZSBMSU5LRURfUklHSFQ6CisJCWJyZWFrOworCWNhc2UgTElOS0VEX1dST05HOgorCQlicmVhazsKKyNlbmRpZgorCX0JCQkvKiBlbmQgb2Ygc3dpdGNoKHJlc2VsZWN0KSAqLworCisJLyoKKwkgKiAgICBUaGVyZSBhcmUgc2V2ZXJhbCBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHdlIHdpc2ggdG8gc2VuZCBhIG1lc3NhZ2UgOgorCSAqICAgICAgMS4gIFdoZW4gd2UgYXJlIGFsbG93aW5nIGRpc2Nvbm5lY3QgLyByZWNvbm5lY3QsIGFuZCBuZWVkIHRvCisJICoJZXN0YWJsaXNoIHRoZSBJX1RfTCBuZXh1cyB2aWEgYW4gSURFTlRJRlkgd2l0aCB0aGUgRGlzY1ByaXYgYml0CisJICoJc2V0LgorCSAqCisJICogICAgICAyLiAgV2hlbiB3ZSBhcmUgZG9pbmcgbGlua2VkIGNvbW1hbmRzLCBhcmUgaGF2ZSB0aGUgd3JvbmcgSV9UX0wKKwkgKgluZXh1cyBlc3RhYmxpc2hlZCBhbmQgd2FudCB0byBzZW5kIGFuIEFCT1JUIG1lc3NhZ2UuCisJICovCisKKwkvKiBHQ0MgZG9lcyBub3QgbGlrZSBhbiBpZmRlZiBpbnNpZGUgYSBtYWNybywgc28gZG8gaXQgdGhlIGhhcmQgd2F5LiAqLworI2lmZGVmIExJTktFRAorCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EIHwgQ01EX0RSVlJfRU5BQkxFIHwgKCgocmVzZWxlY3QgPT0gQ0FOX1JFQ09OTkVDVCl8fCAocmVzZWxlY3QgPT0gTElOS0VEX1dST05HKSk/IENNRF9BVFROIDogMCkpOworI2Vsc2UKKwlXUklURV9DT05UUk9MIChCQVNFX0NNRCB8IENNRF9EUlZSX0VOQUJMRSB8ICgoKHJlc2VsZWN0ID09IENBTl9SRUNPTk5FQ1QpKT8gQ01EX0FUVE4gOiAwKSk7CisjZW5kaWYKKworCS8qCisJICogICAgSU5GT1JNQVRJT04gVFJBTlNGRVIgUEhBU0UKKwkgKgorCSAqICAgICAgVGhlIG5hc3R5IGxvb2tpbmcgcmVhZCAvIHdyaXRlIGlubGluZSBhc3NlbWJsZXIgbG9vcHMgd2UgdXNlIGZvcgorCSAqICAgICAgREFUQUlOIGFuZCBEQVRBT1VUIHBoYXNlcyBhcmUgYXBwcm94aW1hdGVseSA0LTUgdGltZXMgYXMgZmFzdCBhcworCSAqICAgICAgdGhlICdDJyB2ZXJzaW9ucyAtIHNpbmNlIHdlJ3JlIG1vdmluZyAxMDI0IGJ5dGVzIG9mIGRhdGEsIHRoaXMKKwkgKiAgICAgIHJlYWxseSBhZGRzIHVwLgorCSAqCisJICogICAgICBTSlQ6IFRoZSBuYXN0eS1sb29raW5nIGFzc2VtYmxlciBpcyBnb25lLCBzbyBpdCdzIHNsb3dlci4KKwkgKgorCSAqLworCisJRFBSSU5USyAoUEhBU0VfRVRDLCAic2NzaSVkIDogcGhhc2UgPSBJTkZPUk1BVElPTiBUUkFOU0ZFUlxuIiwgaG9zdG5vKTsKKworCWluY29tbWFuZCA9IDE7CisJdHJhbnNmZXJzaXplID0gU0NpbnQtPnRyYW5zZmVyc2l6ZTsKKwl1bmRlcmZsb3cgPSBTQ2ludC0+dW5kZXJmbG93OworCisJLyoKKwkgKglOb3csIHdlIHBvbGwgdGhlIGRldmljZSBmb3Igc3RhdHVzIGluZm9ybWF0aW9uLAorCSAqICAgICAgYW5kIGhhbmRsZSBhbnkgcmVxdWVzdHMgaXQgbWFrZXMuICBOb3RlIHRoYXQgc2luY2Ugd2UgYXJlIHVuc3VyZQorCSAqCW9mIGhvdyBtdWNoIGRhdGEgd2lsbCBiZSBmbG93aW5nIGFjcm9zcyB0aGUgc3lzdGVtLCBldGMgYW5kCisJICoJY2Fubm90IG1ha2UgcmVhc29uYWJsZSB0aW1lb3V0cywgdGhhdCB3ZSB3aWxsIGluc3RlYWQgaGF2ZSB0aGUKKwkgKgltaWRsZXZlbCBkcml2ZXIgaGFuZGxlIGFueSB0aW1lb3V0cyB0aGF0IG9jY3VyIGluIHRoaXMgcGhhc2UuCisJICovCisKKwl3aGlsZSAoKChzdGF0dXNfcmVhZCA9IFNUQVRVUykgJiBTVEFUX0JTWSkgJiYgIXN0MHhfYWJvcnRlZCAmJiAhZG9uZSkgeworI2lmZGVmIFBBUklUWQorCQlpZiAoc3RhdHVzX3JlYWQgJiBTVEFUX1BBUklUWSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgOiBnb3QgcGFyaXR5IGVycm9yXG4iLCBob3N0bm8pOworCQkJc3QweF9hYm9ydGVkID0gRElEX1BBUklUWTsKKwkJfQorI2VuZGlmCisJCWlmIChzdGF0dXNfcmVhZCAmIFNUQVRfUkVRKSB7CisjaWYgKChERUJVRyAmIFBIQVNFX0VUQykgPT0gUEhBU0VfRVRDKQorCQkJaWYgKChuZXdwaGFzZSA9IChzdGF0dXNfcmVhZCAmIFJFUV9NQVNLKSkgIT0gcGhhc2UpIHsKKwkJCQlwaGFzZSA9IG5ld3BoYXNlOworCQkJCXN3aXRjaCAocGhhc2UpIHsKKwkJCQljYXNlIFJFUV9EQVRBT1VUOgorCQkJCQlwcmludGsgKCJzY3NpJWQgOiBwaGFzZSA9IERBVEEgT1VUXG4iLCBob3N0bm8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFUV9EQVRBSU46CisJCQkJCXByaW50ayAoInNjc2klZCA6IHBoYXNlID0gREFUQSBJTlxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVFfQ01ET1VUOgorCQkJCQlwcmludGsKKwkJCQkJICAgICgic2NzaSVkIDogcGhhc2UgPSBDT01NQU5EIE9VVFxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVFfU1RBVElOOgorCQkJCQlwcmludGsgKCJzY3NpJWQgOiBwaGFzZSA9IFNUQVRVUyBJTlxuIiwJaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVFfTVNHT1VUOgorCQkJCQlwcmludGsKKwkJCQkJICAgICgic2NzaSVkIDogcGhhc2UgPSBNRVNTQUdFIE9VVFxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVFfTVNHSU46CisJCQkJCXByaW50ayAoInNjc2klZCA6IHBoYXNlID0gTUVTU0FHRSBJTlxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrICgic2NzaSVkIDogcGhhc2UgPSBVTktOT1dOXG4iLCBob3N0bm8pOworCQkJCQlzdDB4X2Fib3J0ZWQgPSBESURfRVJST1I7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlzd2l0Y2ggKHN0YXR1c19yZWFkICYgUkVRX01BU0spIHsKKwkJCWNhc2UgUkVRX0RBVEFPVVQ6CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBhcmUgaW4gZmFzdCBtb2RlLCB0aGVuIHdlIHNpbXBseSBzcGxhdAorCQkJCSAqIHRoZSBkYXRhIG91dCBpbiB3b3JkLXNpemVkIGNodW5rcyBhcyBmYXN0IGFzCisJCQkJICogd2UgY2FuLgorCQkJCSAqLworCisJCQkJaWYgKCFsZW4pIHsKKyNpZiAwCisJCQkJCXByaW50aygic2NzaSVkOiB1bmRlcmZsb3cgdG8gdGFyZ2V0ICVkIGx1biAlZCBcbiIsIGhvc3RubywgdGFyZ2V0LCBsdW4pOworCQkJCQlzdDB4X2Fib3J0ZWQgPSBESURfRVJST1I7CisJCQkJCWZhc3QgPSAwOworI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChmYXN0ICYmIHRyYW5zZmVyc2l6ZQorCQkJCSAgICAmJiAhKGxlbiAlIHRyYW5zZmVyc2l6ZSkKKwkJCQkgICAgJiYgKGxlbiA+PSB0cmFuc2ZlcnNpemUpCisjaWZkZWYgRkFTVDMyCisJCQkJICAgICYmICEodHJhbnNmZXJzaXplICUgNCkKKyNlbmRpZgorCQkJCSAgICApIHsKKwkJCQkJRFBSSU5USyAoREVCVUdfRkFTVCwKKwkJCQkJCSAic2NzaSVkIDogRkFTVCB0cmFuc2ZlciwgdW5kZXJmbG93ID0gJWQsIHRyYW5zZmVyc2l6ZSA9ICVkXG4iCisJCQkJCQkgIiAgICAgICAgIGxlbiA9ICVkLCBkYXRhID0gJTA4eFxuIiwKKwkJCQkJCSBob3N0bm8sIFNDaW50LT51bmRlcmZsb3csCisJCQkJCQkgU0NpbnQtPnRyYW5zZmVyc2l6ZSwgbGVuLAorCQkJCQkJIGRhdGEpOworCisJCQkvKiBTSlQ6IFN0YXJ0LiBGYXN0IFdyaXRlICovCisjaWZkZWYgU0VBR0FURV9VU0VfQVNNCisJCQkJCV9fYXNtX18gKCJjbGRcblx0IgorI2lmZGVmIEZBU1QzMgorCQkJCQkJICJzaHIgJDIsICUlZWN4XG5cdCIKKwkJCQkJCSAiMTpcdCIKKwkJCQkJCSAibG9kc2xcblx0IgorCQkJCQkJICJtb3ZsICUlZWF4LCAoJSVlZGkpXG5cdCIKKyNlbHNlCisJCQkJCQkgIjE6XHQiCisJCQkJCQkgImxvZHNiXG5cdCIKKwkJCQkJCSAibW92YiAlJWFsLCAoJSVlZGkpXG5cdCIKKyNlbmRpZgorCQkJCQkJICJsb29wIDFiOyIKKwkJCQkgICAgICAvKiBvdXRwdXQgKi8gOgorCQkJCSAgICAgIC8qIGlucHV0ICovIDoiRCIgKHN0MHhfZHIpLAorCQkJCQkJICJTIgorCQkJCQkJIChkYXRhKSwKKwkJCQkJCSAiYyIgKFNDaW50LT50cmFuc2ZlcnNpemUpCisvKiBjbG9iYmVyZWQgKi8KKwkJCQkgICAgICA6CSAiZWF4IiwgImVjeCIsCisJCQkJCQkgImVzaSIpOworI2Vsc2UJCQkJLyogU0VBR0FURV9VU0VfQVNNICovCisJCQkJCW1lbWNweV90b2lvKHN0MHhfZHIsIGRhdGEsIHRyYW5zZmVyc2l6ZSk7CisjZW5kaWYJCQkJLyogU0VBR0FURV9VU0VfQVNNICovCisvKiBTSlQ6IEVuZCAqLworCQkJCQlsZW4gLT0gdHJhbnNmZXJzaXplOworCQkJCQlkYXRhICs9IHRyYW5zZmVyc2l6ZTsKKwkJCQkJRFBSSU5USyAoREVCVUdfRkFTVCwgInNjc2klZCA6IEZBU1QgdHJhbnNmZXIgY29tcGxldGUgbGVuID0gJWQgZGF0YSA9ICUwOHhcbiIsIGhvc3RubywgbGVuLCBkYXRhKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiAgICBXZSBsb29wIGFzIGxvbmcgYXMgd2UgYXJlIGluIGEgCisJCQkJCSAqICAgIGRhdGEgb3V0IHBoYXNlLCB0aGVyZSBpcyBkYXRhIHRvCisJCQkJCSAqICAgIHNlbmQsIGFuZCBCU1kgaXMgc3RpbGwgYWN0aXZlLgorCQkJCQkgKi8KKworLyogU0pUOiBTdGFydC4gU2xvdyBXcml0ZS4gKi8KKyNpZmRlZiBTRUFHQVRFX1VTRV9BU00KKworCQkJCQlpbnQgX19kdW1teV8xLCBfX2R1bW15XzI7CisKKy8qCisgKiAgICAgIFdlIGxvb3AgYXMgbG9uZyBhcyB3ZSBhcmUgaW4gYSBkYXRhIG91dCBwaGFzZSwgdGhlcmUgaXMgZGF0YSB0byBzZW5kLCAKKyAqICAgICAgYW5kIEJTWSBpcyBzdGlsbCBhY3RpdmUuCisgKi8KKy8qIExvY2FsIHZhcmlhYmxlcyA6IGxlbiA9IGVjeCAsIGRhdGEgPSBlc2ksIAorICAgICAgICAgICAgICAgICAgICAgc3QweF9jcl9zciA9IGVieCwgc3QweF9kciA9ICBlZGkKKyovCisJCQkJCV9fYXNtX18gKAorCQkJCQkJCS8qIFRlc3QgZm9yIGFueSBkYXRhIGhlcmUgYXQgYWxsLiAqLworCQkJCQkJCSJvcmwgJSVlY3gsICUlZWN4XG5cdCIKKwkJCQkJCQkianogMmZcblx0IiAiY2xkXG5cdCIKKy8qICAgICAgICAgICAgICAgICAgICAibW92bCBzdDB4X2NyX3NyLCAlJWVieFxuXHQiICAqLworLyogICAgICAgICAgICAgICAgICAgICJtb3ZsIHN0MHhfZHIsICUlZWRpXG5cdCIgICovCisJCQkJCQkJIjE6XHQiCisJCQkJCQkJIm1vdmIgKCUlZWJ4KSwgJSVhbFxuXHQiCisJCQkJCQkJLyogVGVzdCBmb3IgQlNZICovCisJCQkJCQkJInRlc3QgJDEsICUlYWxcblx0IgorCQkJCQkJCSJqeiAyZlxuXHQiCisJCQkJCQkJLyogVGVzdCBmb3IgZGF0YSBvdXQgcGhhc2UgLSBTVEFUVVMgJiBSRVFfTUFTSyBzaG91bGQgYmUgCisJCQkJCQkJICAgUkVRX0RBVEFPVVQsIHdoaWNoIGlzIDAuICovCisJCQkJCQkJInRlc3QgJDB4ZSwgJSVhbFxuXHQiCisJCQkJCQkJImpueiAyZlxuXHQiCisJCQkJCQkJLyogVGVzdCBmb3IgUkVRICovCisJCQkJCQkJInRlc3QgJDB4MTAsICUlYWxcblx0IgorCQkJCQkJCSJqeiAxYlxuXHQiCisJCQkJCQkJImxvZHNiXG5cdCIKKwkJCQkJCQkibW92YiAlJWFsLCAoJSVlZGkpXG5cdCIKKwkJCQkJCQkibG9vcCAxYlxuXHQiICIyOlxuIgorCQkJCSAgICAgIC8qIG91dHB1dCAqLyA6Ij1TIiAoZGF0YSksICI9YyIgKGxlbiksCisJCQkJCQkJIj1iIgorCQkJCQkJCShfX2R1bW15XzEpLAorCQkJCQkJCSI9RCIgKF9fZHVtbXlfMikKKy8qIGlucHV0ICovCisJCQkJICAgICAgOgkJIjAiIChkYXRhKSwgIjEiIChsZW4pLAorCQkJCQkJCSIyIiAoc3QweF9jcl9zciksCisJCQkJCQkJIjMiIChzdDB4X2RyKQorLyogY2xvYmJlcmVkICovCisJCQkJICAgICAgOgkJImVheCIpOworI2Vsc2UJCQkJLyogU0VBR0FURV9VU0VfQVNNICovCisJCQkJCXdoaWxlIChsZW4pIHsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgc3RhdDsKKworCQkJCQkJc3RhdCA9IFNUQVRVUzsKKwkJCQkJCWlmICghKHN0YXQgJiBTVEFUX0JTWSkKKwkJCQkJCSAgICB8fCAoKHN0YXQgJiBSRVFfTUFTSykgIT0KKwkJCQkJCQlSRVFfREFUQU9VVCkpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlpZiAoc3RhdCAmIFNUQVRfUkVRKSB7CisJCQkJCQkJV1JJVEVfREFUQSAoKmRhdGErKyk7CisJCQkJCQkJLS1sZW47CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZgkJCQkvKiBTRUFHQVRFX1VTRV9BU00gKi8KKy8qIFNKVDogRW5kLiAqLworCQkJCX0KKworCQkJCWlmICghbGVuICYmIG5vYnVmZnMpIHsKKwkJCQkJLS1ub2J1ZmZzOworCQkJCQkrK2J1ZmZlcjsKKwkJCQkJbGVuID0gYnVmZmVyLT5sZW5ndGg7CisJCQkJCWRhdGEgPSBwYWdlX2FkZHJlc3MoYnVmZmVyLT5wYWdlKSArIGJ1ZmZlci0+b2Zmc2V0OworCQkJCQlEUFJJTlRLIChERUJVR19TRywKKwkJCQkJCSAic2NzaSVkIDogbmV4dCBzY2F0dGVyLWdhdGhlciBidWZmZXIgbGVuID0gJWQgYWRkcmVzcyA9ICUwOHhcbiIsCisJCQkJCQkgaG9zdG5vLCBsZW4sIGRhdGEpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBSRVFfREFUQUlOOgorI2lmZGVmIFNMT1dfUkFURQorCQkJCWlmIChib3JrZW4pIHsKKyNpZiAoREVCVUcgJiAoUEhBU0VfREFUQUlOKSkKKwkJCQkJdHJhbnNmZXJlZCArPSBsZW47CisjZW5kaWYKKwkJCQkJZm9yICg7IGxlbiAmJiAoU1RBVFVTICYgKFJFUV9NQVNLIHwgU1RBVF9SRVEpKSA9PSAoUkVRX0RBVEFJTiB8IFNUQVRfUkVRKTsgLS1sZW4pIHsKKwkJCQkJCSpkYXRhKysgPSBEQVRBOworCQkJCQkJYm9ya2VuX3dhaXQoKTsKKwkJCQkJfQorI2lmIChERUJVRyAmIChQSEFTRV9EQVRBSU4pKQorCQkJCQl0cmFuc2ZlcmVkIC09IGxlbjsKKyNlbmRpZgorCQkJCX0gZWxzZQorI2VuZGlmCisKKwkJCQkJaWYgKGZhc3QgJiYgdHJhbnNmZXJzaXplCisJCQkJCSAgICAmJiAhKGxlbiAlIHRyYW5zZmVyc2l6ZSkKKwkJCQkJICAgICYmIChsZW4gPj0gdHJhbnNmZXJzaXplKQorI2lmZGVmIEZBU1QzMgorCQkJCQkgICAgJiYgISh0cmFuc2ZlcnNpemUgJSA0KQorI2VuZGlmCisJCQkJICAgICkgeworCQkJCQlEUFJJTlRLIChERUJVR19GQVNULAorCQkJCQkJICJzY3NpJWQgOiBGQVNUIHRyYW5zZmVyLCB1bmRlcmZsb3cgPSAlZCwgdHJhbnNmZXJzaXplID0gJWRcbiIKKwkJCQkJCSAiICAgICAgICAgbGVuID0gJWQsIGRhdGEgPSAlMDh4XG4iLAorCQkJCQkJIGhvc3RubywgU0NpbnQtPnVuZGVyZmxvdywKKwkJCQkJCSBTQ2ludC0+dHJhbnNmZXJzaXplLCBsZW4sCisJCQkJCQkgZGF0YSk7CisKKy8qIFNKVDogU3RhcnQuIEZhc3QgUmVhZCAqLworI2lmZGVmIFNFQUdBVEVfVVNFX0FTTQorCQkJCQlfX2FzbV9fICgiY2xkXG5cdCIKKyNpZmRlZiBGQVNUMzIKKwkJCQkJCSAic2hyICQyLCAlJWVjeFxuXHQiCisJCQkJCQkgIjE6XHQiCisJCQkJCQkgIm1vdmwgKCUlZXNpKSwgJSVlYXhcblx0IgorCQkJCQkJICJzdG9zbFxuXHQiCisjZWxzZQorCQkJCQkJICIxOlx0IgorCQkJCQkJICJtb3ZiICglJWVzaSksICUlYWxcblx0IgorCQkJCQkJICJzdG9zYlxuXHQiCisjZW5kaWYKKwkJCQkJCSAibG9vcCAxYlxuXHQiCisJCQkJICAgICAgLyogb3V0cHV0ICovIDoKKwkJCQkgICAgICAvKiBpbnB1dCAqLyA6IlMiIChzdDB4X2RyKSwKKwkJCQkJCSAiRCIKKwkJCQkJCSAoZGF0YSksCisJCQkJCQkgImMiIChTQ2ludC0+dHJhbnNmZXJzaXplKQorLyogY2xvYmJlcmVkICovCisJCQkJICAgICAgOgkgImVheCIsICJlY3giLAorCQkJCQkJICJlZGkiKTsKKyNlbHNlCQkJCS8qIFNFQUdBVEVfVVNFX0FTTSAqLworCQkJCQltZW1jcHlfZnJvbWlvKGRhdGEsIHN0MHhfZHIsIGxlbik7CisjZW5kaWYJCQkJLyogU0VBR0FURV9VU0VfQVNNICovCisvKiBTSlQ6IEVuZCAqLworCQkJCQlsZW4gLT0gdHJhbnNmZXJzaXplOworCQkJCQlkYXRhICs9IHRyYW5zZmVyc2l6ZTsKKyNpZiAoREVCVUcgJiBQSEFTRV9EQVRBSU4pCisJCQkJCXByaW50ayAoInNjc2klZDogdHJhbnNmZXJlZCArPSAlZFxuIiwgaG9zdG5vLCB0cmFuc2ZlcnNpemUpOworCQkJCQl0cmFuc2ZlcmVkICs9IHRyYW5zZmVyc2l6ZTsKKyNlbmRpZgorCisJCQkJCURQUklOVEsgKERFQlVHX0ZBU1QsICJzY3NpJWQgOiBGQVNUIHRyYW5zZmVyIGNvbXBsZXRlIGxlbiA9ICVkIGRhdGEgPSAlMDh4XG4iLCBob3N0bm8sIGxlbiwgZGF0YSk7CisJCQkJfSBlbHNlIHsKKworI2lmIChERUJVRyAmIFBIQVNFX0RBVEFJTikKKwkJCQkJcHJpbnRrICgic2NzaSVkOiB0cmFuc2ZlcmVkICs9ICVkXG4iLCBob3N0bm8sIGxlbik7CisJCQkJCXRyYW5zZmVyZWQgKz0gbGVuOwkvKiBBc3N1bWUgd2UnbGwgdHJhbnNmZXIgaXQgYWxsLCB0aGVuCisJCQkJCQkJCSAgIHN1YnRyYWN0IHdoYXQgd2UgKmRpZG4ndCogdHJhbnNmZXIgKi8KKyNlbmRpZgorCisvKgorICoJV2UgbG9vcCBhcyBsb25nIGFzIHdlIGFyZSBpbiBhIGRhdGEgaW4gcGhhc2UsIHRoZXJlIGlzIHJvb20gdG8gcmVhZCwKKyAqICAgICAgYW5kIEJTWSBpcyBzdGlsbCBhY3RpdmUKKyAqLworCisvKiBTSlQ6IFN0YXJ0LiAqLworI2lmZGVmIFNFQUdBVEVfVVNFX0FTTQorCisJCQkJCWludCBfX2R1bW15XzMsIF9fZHVtbXlfNDsKKworLyogRHVtbXkgY2xvYmJlcmluZyB2YXJpYWJsZXMgZm9yIHRoZSBuZXcgZ2NjLTIuOTUgKi8KKworLyoKKyAqICAgICAgV2UgbG9vcCBhcyBsb25nIGFzIHdlIGFyZSBpbiBhIGRhdGEgaW4gcGhhc2UsIHRoZXJlIGlzIHJvb20gdG8gcmVhZCwgCisgKiAgICAgIGFuZCBCU1kgaXMgc3RpbGwgYWN0aXZlCisgKi8KKwkJCQkJLyogTG9jYWwgdmFyaWFibGVzIDogZWN4ID0gbGVuLCBlZGkgPSBkYXRhCisJCQkJCSAgIGVzaSA9IHN0MHhfY3Jfc3IsIGVieCA9IHN0MHhfZHIgKi8KKwkJCQkJX19hc21fXyAoCisJCQkJCQkJLyogVGVzdCBmb3Igcm9vbSB0byByZWFkICovCisJCQkJCQkJIm9ybCAlJWVjeCwgJSVlY3hcblx0IgorCQkJCQkJCSJqeiAyZlxuXHQiICJjbGRcblx0IgorLyogICAgICAgICAgICAgICAgIm1vdmwgc3QweF9jcl9zciwgJSVlc2lcblx0IiAgKi8KKy8qICAgICAgICAgICAgICAgICJtb3ZsIHN0MHhfZHIsICUlZWJ4XG5cdCIgICovCisJCQkJCQkJIjE6XHQiCisJCQkJCQkJIm1vdmIgKCUlZXNpKSwgJSVhbFxuXHQiCisJCQkJCQkJLyogVGVzdCBmb3IgQlNZICovCisJCQkJCQkJInRlc3QgJDEsICUlYWxcblx0IgorCQkJCQkJCSJqeiAyZlxuXHQiCisJCQkJCQkJLyogVGVzdCBmb3IgZGF0YSBpbiBwaGFzZSAtIFNUQVRVUyAmIFJFUV9NQVNLIHNob3VsZCBiZSBSRVFfREFUQUlOLCAKKwkJCQkJCQkgICA9IFNUQVRfSU8sIHdoaWNoIGlzIDQuICovCisJCQkJCQkJIm1vdmIgJDB4ZSwgJSVhaFxuXHQiCisJCQkJCQkJImFuZGIgJSVhbCwgJSVhaFxuXHQiCisJCQkJCQkJImNtcGIgJDB4MDQsICUlYWhcblx0IgorCQkJCQkJCSJqbmUgMmZcblx0IgorCQkJCQkJCS8qIFRlc3QgZm9yIFJFUSAqLworCQkJCQkJCSJ0ZXN0ICQweDEwLCAlJWFsXG5cdCIKKwkJCQkJCQkianogMWJcblx0IgorCQkJCQkJCSJtb3ZiICglJWVieCksICUlYWxcblx0IgorCQkJCQkJCSJzdG9zYlxuXHQiCisJCQkJCQkJImxvb3AgMWJcblx0IiAiMjpcbiIKKwkJCQkgICAgICAvKiBvdXRwdXQgKi8gOiI9RCIgKGRhdGEpLCAiPWMiIChsZW4pLAorCQkJCQkJCSI9UyIKKwkJCQkJCQkoX19kdW1teV8zKSwKKwkJCQkJCQkiPWIiIChfX2R1bW15XzQpCisvKiBpbnB1dCAqLworCQkJCSAgICAgIDoJCSIwIiAoZGF0YSksICIxIiAobGVuKSwKKwkJCQkJCQkiMiIgKHN0MHhfY3Jfc3IpLAorCQkJCQkJCSIzIiAoc3QweF9kcikKKy8qIGNsb2JiZXJlZCAqLworCQkJCSAgICAgIDoJCSJlYXgiKTsKKyNlbHNlCQkJCS8qIFNFQUdBVEVfVVNFX0FTTSAqLworCQkJCQl3aGlsZSAobGVuKSB7CisJCQkJCQl1bnNpZ25lZCBjaGFyIHN0YXQ7CisKKwkJCQkJCXN0YXQgPSBTVEFUVVM7CisJCQkJCQlpZiAoIShzdGF0ICYgU1RBVF9CU1kpCisJCQkJCQkgICAgfHwgKChzdGF0ICYgUkVRX01BU0spICE9CisJCQkJCQkJUkVRX0RBVEFJTikpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlpZiAoc3RhdCAmIFNUQVRfUkVRKSB7CisJCQkJCQkJKmRhdGErKyA9IERBVEE7CisJCQkJCQkJLS1sZW47CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZgkJCQkvKiBTRUFHQVRFX1VTRV9BU00gKi8KKy8qIFNKVDogRW5kLiAqLworI2lmIChERUJVRyAmIFBIQVNFX0RBVEFJTikKKwkJCQkJcHJpbnRrICgic2NzaSVkOiB0cmFuc2ZlcmVkIC09ICVkXG4iLCBob3N0bm8sIGxlbik7CisJCQkJCXRyYW5zZmVyZWQgLT0gbGVuOwkvKiBTaW5jZSB3ZSBhc3N1bWVkIGFsbCBvZiBMZW4gZ290ICAqCisJCQkJCQkJCSAgIHRyYW5zZmVyZWQsIGNvcnJlY3Qgb3VyIG1pc3Rha2UgKi8KKyNlbmRpZgorCQkJCX0KKworCQkJCWlmICghbGVuICYmIG5vYnVmZnMpIHsKKwkJCQkJLS1ub2J1ZmZzOworCQkJCQkrK2J1ZmZlcjsKKwkJCQkJbGVuID0gYnVmZmVyLT5sZW5ndGg7CisJCQkJCWRhdGEgPSBwYWdlX2FkZHJlc3MoYnVmZmVyLT5wYWdlKSArIGJ1ZmZlci0+b2Zmc2V0OworCQkJCQlEUFJJTlRLIChERUJVR19TRywgInNjc2klZCA6IG5leHQgc2NhdHRlci1nYXRoZXIgYnVmZmVyIGxlbiA9ICVkIGFkZHJlc3MgPSAlMDh4XG4iLCBob3N0bm8sIGxlbiwgZGF0YSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJFUV9DTURPVVQ6CisJCQkJd2hpbGUgKCgoc3RhdHVzX3JlYWQgPSBTVEFUVVMpICYgU1RBVF9CU1kpICYmCisJCQkJICAgICAgICgoc3RhdHVzX3JlYWQgJiBSRVFfTUFTSykgPT0gUkVRX0NNRE9VVCkpCisJCQkJCWlmIChzdGF0dXNfcmVhZCAmIFNUQVRfUkVRKSB7CisJCQkJCQlXUklURV9EQVRBICgqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgY21uZCk7CisJCQkJCQljbW5kID0gMSArIChjb25zdCB1bnNpZ25lZCBjaGFyICopY21uZDsKKyNpZmRlZiBTTE9XX1JBVEUKKwkJCQkJCWlmIChib3JrZW4pCisJCQkJCQkJYm9ya2VuX3dhaXQgKCk7CisjZW5kaWYKKwkJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJFUV9TVEFUSU46CisJCQkJc3RhdHVzID0gREFUQTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRVFfTVNHT1VUOgorCQkJCS8qCisJCQkJICoJV2UgY2FuIG9ubHkgaGF2ZSBzZW50IGEgTVNHIE9VVCBpZiB3ZQorCQkJCSAqCXJlcXVlc3RlZCB0byBkbyB0aGlzIGJ5IHJhaXNpbmcgQVRUTi4KKwkJCQkgKglTbywgd2UgbXVzdCBkcm9wIEFUVE4uCisJCQkJICovCisJCQkJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQgfCBDTURfRFJWUl9FTkFCTEUpOworCQkJCS8qCisJCQkJICoJSWYgd2UgYXJlIHJlY29ubmVjdGluZywgdGhlbiB3ZSBtdXN0IAorCQkJCSAqCXNlbmQgYW4gSURFTlRJRlkgbWVzc2FnZSBpbiByZXNwb25zZQorCQkJCSAqCXRvIE1TR09VVC4KKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKHJlc2VsZWN0KSB7CisJCQkJY2FzZSBDQU5fUkVDT05ORUNUOgorCQkJCQlXUklURV9EQVRBIChJREVOVElGWSAoMSwgbHVuKSk7CisJCQkJCURQUklOVEsgKFBIQVNFX1JFU0VMRUNUIHwgUEhBU0VfTVNHT1VULCAic2NzaSVkIDogc2VudCBJREVOVElGWSBtZXNzYWdlLlxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgTElOS0VECisJCQkJY2FzZSBMSU5LRURfV1JPTkc6CisJCQkJCVdSSVRFX0RBVEEgKEFCT1JUKTsKKwkJCQkJbGlua2VkX2Nvbm5lY3RlZCA9IDA7CisJCQkJCXJlc2VsZWN0ID0gQ0FOX1JFQ09OTkVDVDsKKwkJCQkJZ290byBjb25uZWN0X2xvb3A7CisJCQkJCURQUklOVEsgKFBIQVNFX01TR09VVCB8IERFQlVHX0xJTktFRCwgInNjc2klZCA6IHNlbnQgQUJPUlQgbWVzc2FnZSB0byBjYW5jZWwgaW5jb3JyZWN0IElfVF9MIG5leHVzLlxuIiwgaG9zdG5vKTsKKyNlbmRpZgkJCQkJLyogTElOS0VEICovCisJCQkJCURQUklOVEsgKERFQlVHX0xJTktFRCwgImNvcnJlY3RcbiIpOworCQkJCWRlZmF1bHQ6CisJCQkJCVdSSVRFX0RBVEEgKE5PUCk7CisJCQkJCXByaW50aygic2NzaSVkIDogdGFyZ2V0ICVkIHJlcXVlc3RlZCBNU0dPVVQsIHNlbnQgTk9QIG1lc3NhZ2UuXG4iLCBob3N0bm8sIHRhcmdldCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJFUV9NU0dJTjoKKwkJCQlzd2l0Y2ggKG1lc3NhZ2UgPSBEQVRBKSB7CisJCQkJY2FzZSBESVNDT05ORUNUOgorCQkJCQlEQU5ZKCJzZWFnYXRlOiBkZWNpZGluZyB0byBkaXNjb25uZWN0XG4iKTsKKwkJCQkJc2hvdWxkX3JlY29ubmVjdCA9IDE7CisJCQkJCWN1cnJlbnRfZGF0YSA9IGRhdGE7CS8qIFdERSBhZGQgKi8KKwkJCQkJY3VycmVudF9idWZmZXIgPSBidWZmZXI7CisJCQkJCWN1cnJlbnRfYnVmZmxlbiA9IGxlbjsJLyogV0RFIGFkZCAqLworCQkJCQljdXJyZW50X25vYnVmZnMgPSBub2J1ZmZzOworI2lmZGVmIExJTktFRAorCQkJCQlsaW5rZWRfY29ubmVjdGVkID0gMDsKKyNlbmRpZgorCQkJCQlkb25lID0gMTsKKwkJCQkJRFBSSU5USyAoKFBIQVNFX1JFU0VMRUNUIHwgUEhBU0VfTVNHSU4pLCAic2NzaSVkIDogZGlzY29ubmVjdGVkLlxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisKKyNpZmRlZiBMSU5LRUQKKwkJCQljYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisJCQkJY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKyNlbmRpZgorCQkJCWNhc2UgQ09NTUFORF9DT01QTEVURToKKwkJCQkJLyoKKwkJCQkJICogTm90ZSA6IHdlIHNob3VsZCBjaGVjayBmb3IgdW5kZXJmbG93IGhlcmUuCisJCQkJCSAqLworCQkJCQlEUFJJTlRLKFBIQVNFX01TR0lOLCAic2NzaSVkIDogY29tbWFuZCBjb21wbGV0ZS5cbiIsIGhvc3Rubyk7CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFCT1JUOgorCQkJCQlEUFJJTlRLKFBIQVNFX01TR0lOLCAic2NzaSVkIDogYWJvcnQgbWVzc2FnZS5cbiIsIGhvc3Rubyk7CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNBVkVfUE9JTlRFUlM6CisJCQkJCWN1cnJlbnRfYnVmZmVyID0gYnVmZmVyOworCQkJCQljdXJyZW50X2J1ZmZsZW4gPSBsZW47CS8qIFdERSBhZGQgKi8KKwkJCQkJY3VycmVudF9kYXRhID0gZGF0YTsJLyogV0RFIG1vZCAqLworCQkJCQljdXJyZW50X25vYnVmZnMgPSBub2J1ZmZzOworCQkJCQlEUFJJTlRLIChQSEFTRV9NU0dJTiwgInNjc2klZCA6IHBvaW50ZXJzIHNhdmVkLlxuIiwgaG9zdG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgorCQkJCQlidWZmZXIgPSBjdXJyZW50X2J1ZmZlcjsKKwkJCQkJY21uZCA9IGN1cnJlbnRfY21uZDsKKwkJCQkJZGF0YSA9IGN1cnJlbnRfZGF0YTsJLyogV0RFIG1vZCAqLworCQkJCQlsZW4gPSBjdXJyZW50X2J1ZmZsZW47CisJCQkJCW5vYnVmZnMgPSBjdXJyZW50X25vYnVmZnM7CisJCQkJCURQUklOVEsoUEhBU0VfTVNHSU4sICJzY3NpJWQgOiBwb2ludGVycyByZXN0b3JlZC5cbiIsIGhvc3Rubyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisKKwkJCQkJLyoKKwkJCQkJICoJSURFTlRJRlkgZGlzdGluZ3Vpc2hlcyBpdHNlbGYKKwkJCQkJICoJZnJvbSB0aGUgb3RoZXIgbWVzc2FnZXMgYnkgCisJCQkJCSAqCXNldHRpbmcgdGhlIGhpZ2ggYml0LgorCQkJCQkgKgorCQkJCQkgKiAgICAgIE5vdGUgOiB3ZSBuZWVkIHRvIGhhbmRsZSBhdCAKKwkJCQkJICoJbGVhc3Qgb25lIG91dHN0YW5kaW5nIGNvbW1hbmQKKwkJCQkJICoJcGVyIExVTiwgYW5kIG5lZWQgdG8gaGFzaCB0aGUgCisJCQkJCSAqCVNDU0kgY29tbWFuZCBmb3IgdGhhdCBJX1RfTAorCQkJCQkgKgluZXh1cyBiYXNlZCBvbiB0aGUga25vd24gSUQgCisJCQkJCSAqCShhdCB0aGlzIHBvaW50KSBhbmQgTFVOLgorCQkJCQkgKi8KKworCQkJCQlpZiAobWVzc2FnZSAmIDB4ODApIHsKKwkJCQkJCURQUklOVEsgKFBIQVNFX01TR0lOLCAic2NzaSVkIDogSURFTlRJRlkgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGlkICVkLCBsdW4gJWQuXG4iLCBob3N0bm8sIHRhcmdldCwgbWVzc2FnZSAmIDcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoKKwkJCQkJCSAqICAgICAgV2Ugc2hvdWxkIGdvIGludG8gYQorCQkJCQkJICoJTUVTU0FHRSBPVVQgcGhhc2UsIGFuZAorCQkJCQkJICoJc2VuZCAgYSBNRVNTQUdFX1JFSkVDVAorCQkJCQkJICogICAgICBpZiB3ZSBydW4gaW50byBhIG1lc3NhZ2UgCisJCQkJCQkgKgl0aGF0IHdlIGRvbid0IGxpa2UuICBUaGUKKwkJCQkJCSAqCXNlYWdhdGUgZHJpdmVyIG5lZWRzIAorCQkJCQkJICoJc29tZSBzZXJpb3VzIAorCQkJCQkJICoJcmVzdHJ1Y3R1cmluZyBmaXJzdAorCQkJCQkJICoJdGhvdWdoLgorCQkJCQkJICovCisJCQkJCQlEUFJJTlRLIChQSEFTRV9NU0dJTiwgInNjc2klZCA6IHVua25vd24gbWVzc2FnZSAlZCBmcm9tIHRhcmdldCAlZC5cbiIsIGhvc3RubywgbWVzc2FnZSwgdGFyZ2V0KTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzY3NpJWQgOiB1bmtub3duIHBoYXNlLlxuIiwgaG9zdG5vKTsKKwkJCQlzdDB4X2Fib3J0ZWQgPSBESURfRVJST1I7CisJCQl9CS8qIGVuZCBvZiBzd2l0Y2ggKHN0YXR1c19yZWFkICYgIFJFUV9NQVNLKSAqLworI2lmZGVmIFNMT1dfUkFURQorCQkJLyoKKwkJCSAqIEkgcmVhbGx5IGRvbid0IGNhcmUgdG8gZGVhbCB3aXRoIGJvcmtlbiBkZXZpY2VzIGluCisJCQkgKiBlYWNoIHNpbmdsZSBieXRlIHRyYW5zZmVyIGNhc2UgKGllLCBtZXNzYWdlIGluLAorCQkJICogbWVzc2FnZSBvdXQsIHN0YXR1cyksIHNvIEknbGwgZG8gdGhlIHdhaXQgaGVyZSBpZiAKKwkJCSAqIG5lY2Vzc2FyeS4KKwkJCSAqLworCQkJaWYoYm9ya2VuKQorCQkJCWJvcmtlbl93YWl0KCk7CisjZW5kaWYKKworCQl9CQkvKiBpZihzdGF0dXNfcmVhZCAmIFNUQVRfUkVRKSBlbmRzICovCisJfQkJCS8qIHdoaWxlKCgoc3RhdHVzX3JlYWQgPSBTVEFUVVMpLi4uKSBlbmRzICovCisKKwlEUFJJTlRLKFBIQVNFX0RBVEFJTiB8IFBIQVNFX0RBVEFPVVQgfCBQSEFTRV9FWElULCAic2NzaSVkIDogVHJhbnNmZXJlZCAlZCBieXRlc1xuIiwgaG9zdG5vLCB0cmFuc2ZlcmVkKTsKKworI2lmIChERUJVRyAmIFBIQVNFX0VYSVQpCisjaWYgMAkJCQkvKiBEb2Vzbid0IHdvcmsgZm9yIHNjYXR0ZXIvZ2F0aGVyICovCisJcHJpbnRrKCJCdWZmZXIgOiBcbiIpOworCWZvcihpID0gMDsgaSA8IDIwOyArK2kpCisJCXByaW50aygiJTAyeCAgIiwgKCh1bnNpZ25lZCBjaGFyICopIGRhdGEpW2ldKTsJLyogV0RFIG1vZCAqLworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXByaW50aygic2NzaSVkIDogc3RhdHVzID0gIiwgaG9zdG5vKTsKKwlwcmludF9zdGF0dXMoc3RhdHVzKTsKKwlwcmludGsoIiBtZXNzYWdlID0gJTAyeFxuIiwgbWVzc2FnZSk7CisjZW5kaWYKKworCS8qIFdlIHNob3VsZG4ndCByZWFjaCB0aGlzIHVudGlsICphZnRlciogQlNZIGhhcyBiZWVuIGRlYXNzZXJ0ZWQgKi8KKworI2lmZGVmIExJTktFRAorCWVsc2UKKwl7CisJCS8qCisJCSAqIEZpeCB0aGUgbWVzc2FnZSBieXRlIHNvIHRoYXQgdW5zdXNwZWN0aW5nIGhpZ2ggbGV2ZWwgZHJpdmVycworCQkgKiBkb24ndCBwdWtlIHdoZW4gdGhleSBzZWUgYSBMSU5LRUQgQ09NTUFORCBtZXNzYWdlIGluIHBsYWNlIG9mCisJCSAqIHRoZSBDT01NQU5EIENPTVBMRVRFIHRoZXkgbWF5IGJlIGV4cGVjdGluZy4gIFNob3VsZG4ndCBiZQorCQkgKiBuZWNlc3NhcnksIGJ1dCBpdCdzIGJldHRlciB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLgorCQkgKgorCQkgKiBBIG5vbiBMSU5LRUQqIG1lc3NhZ2UgYnl0ZSB3aWxsIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQKKwkJICogY29tcGxldGVkLCBhbmQgd2UgYXJlIG5vdyBkaXNjb25uZWN0ZWQuCisJCSAqLworCisJCXN3aXRjaCAobWVzc2FnZSkgeworCQljYXNlIExJTktFRF9DTURfQ09NUExFVEU6CisJCWNhc2UgTElOS0VEX0ZMR19DTURfQ09NUExFVEU6CisJCQltZXNzYWdlID0gQ09NTUFORF9DT01QTEVURTsKKwkJCWxpbmtlZF90YXJnZXQgPSBjdXJyZW50X3RhcmdldDsKKwkJCWxpbmtlZF9sdW4gPSBjdXJyZW50X2x1bjsKKwkJCWxpbmtlZF9jb25uZWN0ZWQgPSAxOworCQkJRFBSSU5USyAoREVCVUdfTElOS0VELCAic2NzaSVkIDoga2VlcGluZyBJX1RfTCBuZXh1cyBlc3RhYmxpc2hlZCBmb3IgbGlua2VkIGNvbW1hbmQuXG4iLCBob3N0bm8pOworCQkJLyogV2UgYWxzbyB3aWxsIG5lZWQgdG8gYWRqdXN0IHN0YXR1cyB0byBhY2NvbW1vZGF0ZSBpbnRlcm1lZGlhdGUKKwkJCSAgIGNvbmRpdGlvbnMuICovCisJCQlpZiAoKHN0YXR1cyA9PSBJTlRFUk1FRElBVEVfR09PRCkgfHwgKHN0YXR1cyA9PSBJTlRFUk1FRElBVEVfQ19HT09EKSkKKwkJCQlzdGF0dXMgPSBHT09EOworCQkJYnJlYWs7CisJCQkvKgorCQkJICogV2Ugc2hvdWxkIGFsc28gaGFuZGxlIHdoYXQgYXJlICJub3JtYWwiIHRlcm1pbmF0aW9uCisJCQkgKiBtZXNzYWdlcyBoZXJlIChBQk9SVCwgQlVTX0RFVklDRV9SRVNFVD8sIGFuZAorCQkJICogQ09NTUFORF9DT01QTEVURSBpbmRpdmlkdWFsbHksIGFuZCBmbGFrZSBpZiB0aGluZ3MKKwkJCSAqIGFyZW4ndCByaWdodC4KKwkJCSAqLworCQlkZWZhdWx0OgorCQkJRFBSSU5USyAoREVCVUdfTElOS0VELCAic2NzaSVkIDogY2xvc2luZyBJX1RfTCBuZXh1cy5cbiIsIGhvc3Rubyk7CisJCQlsaW5rZWRfY29ubmVjdGVkID0gMDsKKwkJfQorCX0KKyNlbmRpZgkvKiBMSU5LRUQgKi8KKworCWlmIChzaG91bGRfcmVjb25uZWN0KSB7CisJCURQUklOVEsgKFBIQVNFX1JFU0VMRUNULCAic2NzaSVkIDogZXhpdGluZyBzZWFnYXRlX3N0MHhfcXVldWVfY29tbWFuZCgpIHdpdGggcmVjb25uZWN0IGVuYWJsZWQuXG4iLCBob3N0bm8pOworCQlXUklURV9DT05UUk9MIChCQVNFX0NNRCB8IENNRF9JTlRSKTsKKwl9IGVsc2UKKwkJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQpOworCisJcmV0dXJuIHJldGNvZGUgKHN0MHhfYWJvcnRlZCk7Cit9CQkJCS8qIGVuZCBvZiBpbnRlcm5hbF9jb21tYW5kICovCisKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X2Fib3J0IChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlzdDB4X2Fib3J0ZWQgPSBESURfQUJPUlQ7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKyN1bmRlZiBVTE9PUAorI3VuZGVmIFRJTUVPVVQKKworLyoKKyAqIHRoZSBzZWFnYXRlX3N0MHhfcmVzZXQgZnVuY3Rpb24gcmVzZXRzIHRoZSBTQ1NJIGJ1cyAKKyAqCisgKiBNYXkgYmUgY2FsbGVkIHdpdGggU0NwbnQgPSBOVUxMCisgKi8KKworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCS8qIE5vIHRpbWVvdXRzIC0gdGhpcyBjb21tYW5kIGlzIGdvaW5nIHRvIGZhaWwgYmVjYXVzZSBpdCB3YXMgcmVzZXQuICovCisJREFOWSAoInNjc2klZDogUmVzZXRpbmcgYnVzLi4uICIsIGhvc3Rubyk7CisKKwkvKiBhc3NlcnQgIFJFU0VUIHNpZ25hbCBvbiBTQ1NJIGJ1cy4gICovCisJV1JJVEVfQ09OVFJPTCAoQkFTRV9DTUQgfCBDTURfUlNUKTsKKworCXVkZWxheSAoMjAgKiAxMDAwKTsKKworCVdSSVRFX0NPTlRST0wgKEJBU0VfQ01EKTsKKwlzdDB4X2Fib3J0ZWQgPSBESURfUkVTRVQ7CisKKwlEQU5ZICgiZG9uZS5cbiIpOworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNlYWdhdGVfc3QweF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpZiAoc2hvc3QtPmlycSkKKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOworCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLmRldGVjdCAgICAgICAgIAk9IHNlYWdhdGVfc3QweF9kZXRlY3QsCisJLnJlbGVhc2UgICAgICAgIAk9IHNlYWdhdGVfc3QweF9yZWxlYXNlLAorCS5pbmZvICAgICAgICAgICAJPSBzZWFnYXRlX3N0MHhfaW5mbywKKwkucXVldWVjb21tYW5kICAgCT0gc2VhZ2F0ZV9zdDB4X3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJPSBzZWFnYXRlX3N0MHhfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gc2VhZ2F0ZV9zdDB4X2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gc2VhZ2F0ZV9zdDB4X2hvc3RfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gc2VhZ2F0ZV9zdDB4X2RldmljZV9yZXNldCwKKwkuY2FuX3F1ZXVlICAgICAgCT0gMSwKKwkudGhpc19pZCAgICAgICAgCT0gNywKKwkuc2dfdGFibGVzaXplICAgCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1biAgICAJPSAxLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VhZ2F0ZS5oIGIvZHJpdmVycy9zY3NpL3NlYWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDllOGVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NlYWdhdGUuaApAQCAtMCwwICsxLDIxIEBACisvKgorICoJc2VhZ2F0ZS5oIENvcHlyaWdodCAoQykgMTk5MiBEcmV3IEVja2hhcmR0IAorICoJbG93IGxldmVsIHNjc2kgZHJpdmVyIGhlYWRlciBmb3IgU1QwMS9TVDAyIGJ5CisgKgkJRHJldyBFY2toYXJkdCAKKyAqCisgKgk8ZHJld0Bjb2xvcmFkby5lZHU+CisgKi8KKworI2lmbmRlZiBfU0VBR0FURV9ICisjZGVmaW5lIFNFQUdBVEVfSAorCitzdGF0aWMgaW50IHNlYWdhdGVfc3QweF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CisKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzZWFnYXRlX3N0MHhfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBzZWFnYXRlX3N0MHhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgc2VhZ2F0ZV9zdDB4X2RldmljZV9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHNlYWdhdGVfc3QweF9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqKTsKKworI2VuZGlmIC8qIF9TRUFHQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zZy5jCkBAIC0wLDAgKzEsMzA5MiBAQAorLyoKKyAqICBIaXN0b3J5OgorICogIFN0YXJ0ZWQ6IEF1ZyA5IGJ5IExhd3JlbmNlIEZvYXJkIChlbnRyb3B5QHdvcmxkLnN0ZC5jb20pLAorICogICAgICAgICAgIHRvIGFsbG93IHVzZXIgcHJvY2VzcyBjb250cm9sIG9mIFNDU0kgZGV2aWNlcy4KKyAqICBEZXZlbG9wbWVudCBTcG9uc29yZWQgYnkgS2lsbHkgQ29ycC4gTlkgTlkKKyAqCisgKiBPcmlnaW5hbCBkcml2ZXIgKHNnLmMpOgorICogICAgICAgIENvcHlyaWdodCAoQykgMTk5MiBMYXdyZW5jZSBGb2FyZAorICogVmVyc2lvbiAyIGFuZCAzIGV4dGVuc2lvbnMgdG8gZHJpdmVyOgorICogICAgICAgIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDUgRG91Z2xhcyBHaWxiZXJ0CisgKgorICogIE1vZGlmaWVkICAxOS1KQU4tMTk5OCAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+ICBEZXZmcyBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworc3RhdGljIGludCBzZ192ZXJzaW9uX251bSA9IDMwNTMyOwkvKiAyIGRpZ2l0cyBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyNkZWZpbmUgU0dfVkVSU0lPTl9TVFIgIjMuNS4zMiIKKworLyoKKyAqICBELiBQLiBHaWxiZXJ0IChkZ2lsYmVydEBpbnRlcmxvZy5jb20sIGRvdWdnQHRyaW9kZS5uZXQuYXUpLCBub3RlczoKKyAqICAgICAgLSBzY3NpIGxvZ2dpbmcgaXMgYXZhaWxhYmxlIHZpYSBTQ1NJX0xPR19USU1FT1VUIG1hY3Jvcy4gRmlyc3QKKyAqICAgICAgICB0aGUga2VybmVsL21vZHVsZSBuZWVkcyB0byBiZSBidWlsdCB3aXRoIENPTkZJR19TQ1NJX0xPR0dJTkcKKyAqICAgICAgICAob3RoZXJ3aXNlIHRoZSBtYWNyb3MgY29tcGlsZSB0byBlbXB0eSBzdGF0ZW1lbnRzKS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbXRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2luY2x1ZGUgPHNjc2kvc2cuaD4KKworI2luY2x1ZGUgInNjc2lfbG9nZ2luZy5oIgorCisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KK3N0YXRpYyBjaGFyICpzZ192ZXJzaW9uX2RhdGUgPSAiMjAwNTAxMTciOworCitzdGF0aWMgaW50IHNnX3Byb2NfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNnX3Byb2NfY2xlYW51cCh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIExJTlVYX1ZFUlNJT05fQ09ERQorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNlbmRpZgkJCQkvKiBMSU5VWF9WRVJTSU9OX0NPREUgKi8KKworI2RlZmluZSBTR19BTExPV19ESU9fREVGIDAKKyNkZWZpbmUgU0dfQUxMT1dfRElPX0NPREUgLyogY29tcGlsZSBvdXQgYnkgY29tbWVudGluZyB0aGlzIGRlZmluZSAqLworCisjZGVmaW5lIFNHX01BWF9ERVZTIDMyNzY4CisKKy8qCisgKiBTdXBwb3NlIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSB0aGUgZm9ybXVsYSBtdWxkaXYoeCxtLGQpPWludCh4ICogbSAvIGQpCisgKiBUaGVuIHdoZW4gdXNpbmcgMzIgYml0IGludGVnZXJzIHggKiBtIG1heSBvdmVyZmxvdyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uLgorICogUmVwbGFjaW5nIG11bGRpdih4KSBieSBtdWxkaXYoeCk9KCh4ICUgZCkgKiBtKSAvIGQgKyBpbnQoeCAvIGQpICogbQorICogY2FsY3VsYXRlcyB0aGUgc2FtZSwgYnV0IHByZXZlbnRzIHRoZSBvdmVyZmxvdyB3aGVuIGJvdGggbSBhbmQgZAorICogYXJlICJzbWFsbCIgbnVtYmVycyAobGlrZSBIWiBhbmQgVVNFUl9IWikuCisgKiBPZiBjb3Vyc2UgYW4gb3ZlcmZsb3cgaXMgaW5hdm9pZGFibGUgaWYgdGhlIHJlc3VsdCBvZiBtdWxkaXYgZG9lc24ndCBmaXQKKyAqIGluIDMyIGJpdHMuCisgKi8KKyNkZWZpbmUgTVVMRElWKFgsTVVMLERJVikgKCgoKFggJSBESVYpICogTVVMKSAvIERJVikgKyAoKFggLyBESVYpICogTVVMKSkKKworI2RlZmluZSBTR19ERUZBVUxUX1RJTUVPVVQgTVVMRElWKFNHX0RFRkFVTFRfVElNRU9VVF9VU0VSLCBIWiwgVVNFUl9IWikKKworaW50IHNnX2JpZ19idWZmID0gU0dfREVGX1JFU0VSVkVEX1NJWkU7CisvKiBOLkIuIFRoaXMgdmFyaWFibGUgaXMgcmVhZGFibGUgYW5kIHdyaXRlYWJsZSB2aWEKKyAgIC9wcm9jL3Njc2kvc2cvZGVmX3Jlc2VydmVkX3NpemUgLiBFYWNoIHRpbWUgc2dfb3BlbigpIGlzIGNhbGxlZCBhIGJ1ZmZlcgorICAgb2YgdGhpcyBzaXplIChvciBsZXNzIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5KSB3aWxsIGJlIHJlc2VydmVkCisgICBmb3IgdXNlIGJ5IHRoaXMgZmlsZSBkZXNjcmlwdG9yLiBbRGVwcmVjYXRlZCB1c2FnZTogdGhpcyB2YXJpYWJsZSBpcyBhbHNvCisgICByZWFkYWJsZSB2aWEgL3Byb2Mvc3lzL2tlcm5lbC9zZy1iaWctYnVmZiBpZiB0aGUgc2cgZHJpdmVyIGlzIGJ1aWx0IGludG8KKyAgIHRoZSBrZXJuZWwgKGkuZS4gaXQgaXMgbm90IGEgbW9kdWxlKS5dICovCitzdGF0aWMgaW50IGRlZl9yZXNlcnZlZF9zaXplID0gLTE7CS8qIHBpY2tzIHVwIGluaXQgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IHNnX2FsbG93X2RpbyA9IFNHX0FMTE9XX0RJT19ERUY7CisKKyNkZWZpbmUgU0dfU0VDVE9SX1NaIDUxMgorI2RlZmluZSBTR19TRUNUT1JfTVNLIChTR19TRUNUT1JfU1ogLSAxKQorCisjZGVmaW5lIFNHX0RFVl9BUlJfTFVNUCAzMgkvKiBhbW91bnQgdG8gb3ZlciBhbGxvY2F0ZSBzZ19kZXZfYXJyIGJ5ICovCisKK3N0YXRpYyBpbnQgc2dfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBzZ19yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKKworc3RhdGljIFNjc2lfUmVxdWVzdCAqZHVtbXlfY21kcDsJLyogb25seSB1c2VkIGZvciBzaXplb2YgKi8KKworc3RhdGljIERFRklORV9SV0xPQ0soc2dfZGV2X2Fycl9sb2NrKTsJLyogQWxzbyB1c2VkIHRvIGxvY2sKKwkJCQkJCQkgICBmaWxlIGRlc2NyaXB0b3IgbGlzdCBmb3IgZGV2aWNlICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlIHNnX2ludGVyZmFjZSA9IHsKKwkuYWRkCQk9IHNnX2FkZCwKKwkucmVtb3ZlCQk9IHNnX3JlbW92ZSwKK307CisKK3R5cGVkZWYgc3RydWN0IHNnX3NjYXR0ZXJfaG9sZCB7IC8qIGhvbGRpbmcgYXJlYSBmb3Igc2NzaSBzY2F0dGVyIGdhdGhlciBpbmZvICovCisJdW5zaWduZWQgc2hvcnQga191c2Vfc2c7IC8qIENvdW50IG9mIGtlcm5lbCBzY2F0dGVyLWdhdGhlciBwaWVjZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZ2xpc3RfbGVuOyAvKiBzaXplIG9mIG1hbGxvYydkIHNjYXR0ZXItZ2F0aGVyIGxpc3QgKysgKi8KKwl1bnNpZ25lZCBidWZmbGVuOwkvKiBTaXplIG9mIChhZ2dyZWdhdGUpIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgYl9tYWxsb2NfbGVuOwkvKiBhY3R1YWwgbGVuIG1hbGxvYydlZCBpbiBidWZmZXIgKi8KKwl2b2lkICpidWZmZXI7CQkvKiBEYXRhIGJ1ZmZlciBvciBzY2F0dGVyIGxpc3QgKGtfdXNlX3NnPjApICovCisJY2hhciBkaW9faW5fdXNlOwkvKiAwLT5pbmRpcmVjdCBJTyAob3IgbW1hcCksIDEtPmRpbyAqLworCXVuc2lnbmVkIGNoYXIgY21kX29wY29kZTsgLyogZmlyc3QgYnl0ZSBvZiBjb21tYW5kICovCit9IFNnX3NjYXR0ZXJfaG9sZDsKKworc3RydWN0IHNnX2RldmljZTsJCS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJ1Y3Qgc2dfZmQ7CisKK3R5cGVkZWYgc3RydWN0IHNnX3JlcXVlc3QgewkvKiBTR19NQVhfUVVFVUUgcmVxdWVzdHMgb3V0c3RhbmRpbmcgcGVyIGZpbGUgKi8KKwlTY3NpX1JlcXVlc3QgKm15X2NtZHA7CS8qICE9IDAgIHdoZW4gcmVxdWVzdCB3aXRoIGxvd2VyIGxldmVscyAqLworCXN0cnVjdCBzZ19yZXF1ZXN0ICpuZXh0cnA7CS8qIE5VTEwgLT4gdGFpbCByZXF1ZXN0IChzbGlzdCkgKi8KKwlzdHJ1Y3Qgc2dfZmQgKnBhcmVudGZwOwkvKiBOVUxMIC0+IG5vdCBpbiB1c2UgKi8KKwlTZ19zY2F0dGVyX2hvbGQgZGF0YTsJLyogaG9sZCBidWZmZXIsIHBlcmhhcHMgc2NhdHRlciBsaXN0ICovCisJc2dfaW9faGRyX3QgaGVhZGVyOwkvKiBzY3NpIGNvbW1hbmQraW5mbywgc2VlIDxzY3NpL3NnLmg+ICovCisJdW5zaWduZWQgY2hhciBzZW5zZV9iW3NpemVvZiAoZHVtbXlfY21kcC0+c3Jfc2Vuc2VfYnVmZmVyKV07CisJY2hhciByZXNfdXNlZDsJCS8qIDEgLT4gdXNpbmcgcmVzZXJ2ZSBidWZmZXIsIDAgLT4gbm90IC4uLiAqLworCWNoYXIgb3JwaGFuOwkJLyogMSAtPiBkcm9wIG9uIHNpZ2h0LCAwIC0+IG5vcm1hbCAqLworCWNoYXIgc2dfaW9fb3duZWQ7CS8qIDEgLT4gcGFja2V0IGJlbG9uZ3MgdG8gU0dfSU8gKi8KKwl2b2xhdGlsZSBjaGFyIGRvbmU7CS8qIDAtPmJlZm9yZSBiaCwgMS0+YmVmb3JlIHJlYWQsIDItPnJlYWQgKi8KK30gU2dfcmVxdWVzdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2dfZmQgewkJLyogaG9sZHMgdGhlIHN0YXRlIG9mIGEgZmlsZSBkZXNjcmlwdG9yICovCisJc3RydWN0IHNnX2ZkICpuZXh0ZnA7CS8qIE5VTEwgd2hlbiBsYXN0IG9wZW5lZCBmZCBvbiB0aGlzIGRldmljZSAqLworCXN0cnVjdCBzZ19kZXZpY2UgKnBhcmVudGRwOwkvKiBvd25pbmcgZGV2aWNlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBxdWV1ZSByZWFkIHVudGlsIGNvbW1hbmQgZG9uZSAqLworCXJ3bG9ja190IHJxX2xpc3RfbG9jazsJLyogcHJvdGVjdCBhY2Nlc3MgdG8gbGlzdCBpbiByZXFfYXJyICovCisJaW50IHRpbWVvdXQ7CQkvKiBkZWZhdWx0cyB0byBTR19ERUZBVUxUX1RJTUVPVVQgICAgICAqLworCWludCB0aW1lb3V0X3VzZXI7CS8qIGRlZmF1bHRzIHRvIFNHX0RFRkFVTFRfVElNRU9VVF9VU0VSICovCisJU2dfc2NhdHRlcl9ob2xkIHJlc2VydmU7CS8qIGJ1ZmZlciBoZWxkIGZvciB0aGlzIGZpbGUgZGVzY3JpcHRvciAqLworCXVuc2lnbmVkIHNhdmVfc2NhdF9sZW47CS8qIG9yaWdpbmFsIGxlbmd0aCBvZiB0cnVuYy4gc2NhdC4gZWxlbWVudCAqLworCVNnX3JlcXVlc3QgKmhlYWRycDsJLyogaGVhZCBvZiByZXF1ZXN0IHNsaXN0LCBOVUxMLT5lbXB0eSAqLworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xcDsJLyogdXNlZCBieSBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uICovCisJU2dfcmVxdWVzdCByZXFfYXJyW1NHX01BWF9RVUVVRV07CS8qIHVzZWQgYXMgc2luZ2x5LWxpbmtlZCBsaXN0ICovCisJY2hhciBsb3dfZG1hOwkJLyogYXMgaW4gcGFyZW50IGJ1dCBwb3NzaWJseSBvdmVycmlkZGVuIHRvIDEgKi8KKwljaGFyIGZvcmNlX3BhY2tpZDsJLyogMSAtPiBwYWNrX2lkIGlucHV0IHRvIHJlYWQoKSwgMCAtPiBpZ25vcmVkICovCisJdm9sYXRpbGUgY2hhciBjbG9zZWQ7CS8qIDEgLT4gZmQgY2xvc2VkIGJ1dCByZXF1ZXN0KHMpIG91dHN0YW5kaW5nICovCisJY2hhciBjbWRfcTsJCS8qIDEgLT4gYWxsb3cgY29tbWFuZCBxdWV1aW5nLCAwIC0+IGRvbid0ICovCisJY2hhciBuZXh0X2NtZF9sZW47CS8qIDAgLT4gYXV0b21hdGljIChkZWYpLCA+MCAtPiB1c2Ugb24gbmV4dCB3cml0ZSgpICovCisJY2hhciBrZWVwX29ycGhhbjsJLyogMCAtPiBkcm9wIG9ycGhhbiAoZGVmKSwgMSAtPiBrZWVwIGZvciByZWFkKCkgKi8KKwljaGFyIG1tYXBfY2FsbGVkOwkvKiAwIC0+IG1tYXAoKSBuZXZlciBjYWxsZWQgb24gdGhpcyBmZCAqLworfSBTZ19mZDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2dfZGV2aWNlIHsgLyogaG9sZHMgdGhlIHN0YXRlIG9mIGVhY2ggc2NzaSBnZW5lcmljIGRldmljZSAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOworCXdhaXRfcXVldWVfaGVhZF90IG9fZXhjbF93YWl0OwkvKiBxdWV1ZSBvcGVuKCkgd2hlbiBPX0VYQ0wgaW4gdXNlICovCisJaW50IHNnX3RhYmxlc2l6ZTsJLyogYWRhcHRlcidzIG1heCBzY2F0dGVyLWdhdGhlciB0YWJsZSBzaXplICovCisJU2dfZmQgKmhlYWRmcDsJCS8qIGZpcnN0IG9wZW4gZmQgYmVsb25naW5nIHRvIHRoaXMgZGV2aWNlICovCisJdm9sYXRpbGUgY2hhciBkZXRhY2hlZDsJLyogMC0+YXR0YWNoZWQsIDEtPmRldGFjaGVkIHBlbmRpbmcgcmVtb3ZhbCAqLworCXZvbGF0aWxlIGNoYXIgZXhjbHVkZTsJLyogb3BlbmVkIGZvciBleGNsdXNpdmUgYWNjZXNzICovCisJY2hhciBzZ2RlYnVnOwkJLyogMC0+b2ZmLCAxLT5zZW5zZSwgOS0+ZHVtcCBkZXYsIDEwLT4gYWxsIGRldnMgKi8KKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgY2RldiAqIGNkZXY7CS8qIGNoYXJfZGV2IFtzeXNmczogL3N5cy9jZGV2L21ham9yL3NnPG4+XSAqLworfSBTZ19kZXZpY2U7CisKK3N0YXRpYyBpbnQgc2dfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIHNnX2NtZF9kb25lKFNjc2lfQ21uZCAqIFNDcG50KTsJLyogdGFza2xldCBvciBzb2Z0IGlycSBjYWxsYmFjayAqLworc3RhdGljIGludCBzZ19zdGFydF9yZXEoU2dfcmVxdWVzdCAqIHNycCk7CitzdGF0aWMgdm9pZCBzZ19maW5pc2hfcmVtX3JlcShTZ19yZXF1ZXN0ICogc3JwKTsKK3N0YXRpYyBpbnQgc2dfYnVpbGRfaW5kaXJlY3QoU2dfc2NhdHRlcl9ob2xkICogc2NocCwgU2dfZmQgKiBzZnAsIGludCBidWZmX3NpemUpOworc3RhdGljIGludCBzZ19idWlsZF9zZ2F0KFNnX3NjYXR0ZXJfaG9sZCAqIHNjaHAsIGNvbnN0IFNnX2ZkICogc2ZwLAorCQkJIGludCB0YWJsZXNpemUpOworc3RhdGljIHNzaXplX3Qgc2dfbmV3X3JlYWQoU2dfZmQgKiBzZnAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgIFNnX3JlcXVlc3QgKiBzcnApOworc3RhdGljIHNzaXplX3Qgc2dfbmV3X3dyaXRlKFNnX2ZkICogc2ZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgaW50IGJsb2NraW5nLCBpbnQgcmVhZF9vbmx5LCBTZ19yZXF1ZXN0ICoqIG9fc3JwKTsKK3N0YXRpYyBpbnQgc2dfY29tbW9uX3dyaXRlKFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwLAorCQkJICAgdW5zaWduZWQgY2hhciAqY21uZCwgaW50IHRpbWVvdXQsIGludCBibG9ja2luZyk7CitzdGF0aWMgaW50IHNnX3VfaW92ZWMoc2dfaW9faGRyX3QgKiBocCwgaW50IHNnX251bSwgaW50IGluZCwKKwkJICAgICAgaW50IHdyX3hmLCBpbnQgKmNvdW50cCwgdW5zaWduZWQgY2hhciBfX3VzZXIgKip1cCk7CitzdGF0aWMgaW50IHNnX3dyaXRlX3hmZXIoU2dfcmVxdWVzdCAqIHNycCk7CitzdGF0aWMgaW50IHNnX3JlYWRfeGZlcihTZ19yZXF1ZXN0ICogc3JwKTsKK3N0YXRpYyBpbnQgc2dfcmVhZF9veGZlcihTZ19yZXF1ZXN0ICogc3JwLCBjaGFyIF9fdXNlciAqb3V0cCwgaW50IG51bV9yZWFkX3hmZXIpOworc3RhdGljIHZvaWQgc2dfcmVtb3ZlX3NjYXQoU2dfc2NhdHRlcl9ob2xkICogc2NocCk7CitzdGF0aWMgdm9pZCBzZ19idWlsZF9yZXNlcnZlKFNnX2ZkICogc2ZwLCBpbnQgcmVxX3NpemUpOworc3RhdGljIHZvaWQgc2dfbGlua19yZXNlcnZlKFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBzZ191bmxpbmtfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCk7CitzdGF0aWMgY2hhciAqc2dfcGFnZV9tYWxsb2MoaW50IHJxU3osIGludCBsb3dEbWEsIGludCAqcmV0U3pwKTsKK3N0YXRpYyB2b2lkIHNnX3BhZ2VfZnJlZShjaGFyICpidWZmLCBpbnQgc2l6ZSk7CitzdGF0aWMgU2dfZmQgKnNnX2FkZF9zZnAoU2dfZGV2aWNlICogc2RwLCBpbnQgZGV2KTsKK3N0YXRpYyBpbnQgc2dfcmVtb3ZlX3NmcChTZ19kZXZpY2UgKiBzZHAsIFNnX2ZkICogc2ZwKTsKK3N0YXRpYyB2b2lkIF9fc2dfcmVtb3ZlX3NmcChTZ19kZXZpY2UgKiBzZHAsIFNnX2ZkICogc2ZwKTsKK3N0YXRpYyBTZ19yZXF1ZXN0ICpzZ19nZXRfcnFfbWFyayhTZ19mZCAqIHNmcCwgaW50IHBhY2tfaWQpOworc3RhdGljIFNnX3JlcXVlc3QgKnNnX2FkZF9yZXF1ZXN0KFNnX2ZkICogc2ZwKTsKK3N0YXRpYyBpbnQgc2dfcmVtb3ZlX3JlcXVlc3QoU2dfZmQgKiBzZnAsIFNnX3JlcXVlc3QgKiBzcnApOworc3RhdGljIGludCBzZ19yZXNfaW5fdXNlKFNnX2ZkICogc2ZwKTsKK3N0YXRpYyBpbnQgc2dfYWxsb3dfYWNjZXNzKHVuc2lnbmVkIGNoYXIgb3Bjb2RlLCBjaGFyIGRldl90eXBlKTsKK3N0YXRpYyBpbnQgc2dfYnVpbGRfZGlyZWN0KFNnX3JlcXVlc3QgKiBzcnAsIFNnX2ZkICogc2ZwLCBpbnQgZHhmZXJfbGVuKTsKK3N0YXRpYyBTZ19kZXZpY2UgKnNnX2dldF9kZXYoaW50IGRldik7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNnX3NjYXRnMnZpcnQoY29uc3Qgc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwKTsKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCitzdGF0aWMgaW50IHNnX2xhc3RfZGV2KHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBTZ19kZXZpY2UgKipzZ19kZXZfYXJyID0gTlVMTDsKK3N0YXRpYyBpbnQgc2dfZGV2X21heDsKK3N0YXRpYyBpbnQgc2dfbnJfZGV2OworCisjZGVmaW5lIFNaX1NHX0hFQURFUiBzaXplb2Yoc3RydWN0IHNnX2hlYWRlcikKKyNkZWZpbmUgU1pfU0dfSU9fSERSIHNpemVvZihzZ19pb19oZHJfdCkKKyNkZWZpbmUgU1pfU0dfSU9WRUMgc2l6ZW9mKHNnX2lvdmVjX3QpCisjZGVmaW5lIFNaX1NHX1JFUV9JTkZPIHNpemVvZihzZ19yZXFfaW5mb190KQorCitzdGF0aWMgaW50CitzZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCWludCBmbGFncyA9IGZpbHAtPmZfZmxhZ3M7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKwlpbnQgcmVzOworCWludCByZXR2YWw7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfb3BlbjogZGV2PSVkLCBmbGFncz0weCV4XG4iLCBkZXYsIGZsYWdzKSk7CisJc2RwID0gc2dfZ2V0X2RldihkZXYpOworCWlmICgoIXNkcCkgfHwgKCFzZHAtPmRldmljZSkpCisJCXJldHVybiAtRU5YSU87CisJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVGhpcyBkcml2ZXIncyBtb2R1bGUgY291bnQgYnVtcGVkIGJ5IGZvcHNfZ2V0IGluIDxsaW51eC9mcy5oPiAqLworCS8qIFByZXZlbnQgdGhlIGRldmljZSBkcml2ZXIgZnJvbSB2YW5pc2hpbmcgd2hpbGUgd2Ugc2xlZXAgKi8KKwlyZXR2YWwgPSBzY3NpX2RldmljZV9nZXQoc2RwLT5kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoISgoZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCSAgICAgIHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZHAtPmRldmljZSkpKSB7CisJCXJldHZhbCA9IC1FTlhJTzsKKwkJLyogd2UgYXJlIGluIGVycm9yIHJlY292ZXJ5IGZvciB0aGlzIGRldmljZSAqLworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBPX0VYQ0wpIHsKKwkJaWYgKE9fUkRPTkxZID09IChmbGFncyAmIE9fQUNDTU9ERSkpIHsKKwkJCXJldHZhbCA9IC1FUEVSTTsgLyogQ2FuJ3QgbG9jayBpdCB3aXRoIHJlYWQgb25seSBhY2Nlc3MgKi8KKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWlmIChzZHAtPmhlYWRmcCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQkJcmV0dmFsID0gLUVCVVNZOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJcmVzID0gMDsKKwkJX193YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2RwLT5vX2V4Y2xfd2FpdCwKKwkJCSgoc2RwLT5oZWFkZnAgfHwgc2RwLT5leGNsdWRlKSA/IDAgOiAoc2RwLT5leGNsdWRlID0gMSkpLCByZXMpOworCQlpZiAocmVzKSB7CisJCQlyZXR2YWwgPSByZXM7CS8qIC1FUkVTVEFSVFNZUyBiZWNhdXNlIHNpZ25hbCBoaXQgcHJvY2VzcyAqLworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwl9IGVsc2UgaWYgKHNkcC0+ZXhjbHVkZSkgewkvKiBzb21lIG90aGVyIGZkIGhhcyBhbiBleGNsdXNpdmUgbG9jayBvbiBkZXYgKi8KKwkJaWYgKGZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVCVVNZOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJcmVzID0gMDsKKwkJX193YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2RwLT5vX2V4Y2xfd2FpdCwgKCFzZHAtPmV4Y2x1ZGUpLAorCQkJCQkgICByZXMpOworCQlpZiAocmVzKSB7CisJCQlyZXR2YWwgPSByZXM7CS8qIC1FUkVTVEFSVFNZUyBiZWNhdXNlIHNpZ25hbCBoaXQgcHJvY2VzcyAqLworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwl9CisJaWYgKHNkcC0+ZGV0YWNoZWQpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCWlmICghc2RwLT5oZWFkZnApIHsJLyogbm8gZXhpc3Rpbmcgb3BlbnMgb24gdGhpcyBkZXZpY2UgKi8KKwkJc2RwLT5zZ2RlYnVnID0gMDsKKwkJc2RwLT5zZ190YWJsZXNpemUgPSBzZHAtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplOworCX0KKwlpZiAoKHNmcCA9IHNnX2FkZF9zZnAoc2RwLCBkZXYpKSkKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0gc2ZwOworCWVsc2UgeworCQlpZiAoZmxhZ3MgJiBPX0VYQ0wpCisJCQlzZHAtPmV4Y2x1ZGUgPSAwOwkvKiB1bmRvIGlmIGVycm9yICovCisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlyZXR1cm4gMDsKKworICAgICAgZXJyb3Jfb3V0OgorCXNjc2lfZGV2aWNlX3B1dChzZHAtPmRldmljZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogRm9sbG93aW5nIGZ1bmN0aW9uIHdhcyBmb3JtZXJseSBjYWxsZWQgJ3NnX2Nsb3NlJyAqLworc3RhdGljIGludAorc2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlTZ19kZXZpY2UgKnNkcDsKKwlTZ19mZCAqc2ZwOworCisJaWYgKCghKHNmcCA9IChTZ19mZCAqKSBmaWxwLT5wcml2YXRlX2RhdGEpKSB8fCAoIShzZHAgPSBzZnAtPnBhcmVudGRwKSkpCisJCXJldHVybiAtRU5YSU87CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3JlbGVhc2U6ICVzXG4iLCBzZHAtPmRpc2stPmRpc2tfbmFtZSkpOworCXNnX2Zhc3luYygtMSwgZmlscCwgMCk7CS8qIHJlbW92ZSBmaWxwIGZyb20gYXN5bmMgbm90aWZpY2F0aW9uIGxpc3QgKi8KKwlpZiAoMCA9PSBzZ19yZW1vdmVfc2ZwKHNkcCwgc2ZwKSkgewkvKiBSZXR1cm5zIDEgd2hlbiBzZHAgZ29uZSAqLworCQlpZiAoIXNkcC0+ZGV0YWNoZWQpIHsKKwkJCXNjc2lfZGV2aWNlX3B1dChzZHAtPmRldmljZSk7CisJCX0KKwkJc2RwLT5leGNsdWRlID0gMDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZHAtPm9fZXhjbF93YWl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IHJlczsKKwlTZ19kZXZpY2UgKnNkcDsKKwlTZ19mZCAqc2ZwOworCVNnX3JlcXVlc3QgKnNycDsKKwlpbnQgcmVxX3BhY2tfaWQgPSAtMTsKKwlzdHJ1Y3Qgc2dfaGVhZGVyIG9sZF9oZHI7CisJc2dfaW9faGRyX3QgbmV3X2hkcjsKKwlzZ19pb19oZHJfdCAqaHA7CisKKwlpZiAoKCEoc2ZwID0gKFNnX2ZkICopIGZpbHAtPnByaXZhdGVfZGF0YSkpIHx8ICghKHNkcCA9IHNmcC0+cGFyZW50ZHApKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfcmVhZDogJXMsIGNvdW50PSVkXG4iLAorCQkJCSAgIHNkcC0+ZGlzay0+ZGlza19uYW1lLCAoaW50KSBjb3VudCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzZnAtPmZvcmNlX3BhY2tpZCAmJiAoY291bnQgPj0gU1pfU0dfSEVBREVSKSkgeworCQlpZiAoX19jb3B5X2Zyb21fdXNlcigmb2xkX2hkciwgYnVmLCBTWl9TR19IRUFERVIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChvbGRfaGRyLnJlcGx5X2xlbiA8IDApIHsKKwkJCWlmIChjb3VudCA+PSBTWl9TR19JT19IRFIpIHsKKwkJCQlpZiAoX19jb3B5X2Zyb21fdXNlcgorCQkJCSAgICAoJm5ld19oZHIsIGJ1ZiwgU1pfU0dfSU9fSERSKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmVxX3BhY2tfaWQgPSBuZXdfaGRyLnBhY2tfaWQ7CisJCQl9CisJCX0gZWxzZQorCQkJcmVxX3BhY2tfaWQgPSBvbGRfaGRyLnBhY2tfaWQ7CisJfQorCXNycCA9IHNnX2dldF9ycV9tYXJrKHNmcCwgcmVxX3BhY2tfaWQpOworCWlmICghc3JwKSB7CQkvKiBub3cgd2FpdCBvbiBwYWNrZXQgdG8gYXJyaXZlICovCisJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCQl3aGlsZSAoMSkgeworCQkJcmVzID0gMDsJLyogZm9sbG93aW5nIGlzIGEgbWFjcm8gdGhhdCBiZWF0cyByYWNlIGNvbmRpdGlvbiAqLworCQkJX193YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2ZwLT5yZWFkX3dhaXQsCisJCQkJKHNkcC0+ZGV0YWNoZWQgfHwgKHNycCA9IHNnX2dldF9ycV9tYXJrKHNmcCwgcmVxX3BhY2tfaWQpKSksIAorCQkJCQkJICAgcmVzKTsKKwkJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJaWYgKDAgPT0gcmVzKQorCQkJCWJyZWFrOworCQkJcmV0dXJuIHJlczsJLyogLUVSRVNUQVJUU1lTIGJlY2F1c2Ugc2lnbmFsIGhpdCBwcm9jZXNzICovCisJCX0KKwl9CisJaWYgKHNycC0+aGVhZGVyLmludGVyZmFjZV9pZCAhPSAnXDAnKQorCQlyZXR1cm4gc2dfbmV3X3JlYWQoc2ZwLCBidWYsIGNvdW50LCBzcnApOworCisJaHAgPSAmc3JwLT5oZWFkZXI7CisJbWVtc2V0KCZvbGRfaGRyLCAwLCBTWl9TR19IRUFERVIpOworCW9sZF9oZHIucmVwbHlfbGVuID0gKGludCkgaHAtPnRpbWVvdXQ7CisJb2xkX2hkci5wYWNrX2xlbiA9IG9sZF9oZHIucmVwbHlfbGVuOyAvKiB2ZXJ5IG9sZCwgc3RyYW5nZSBiZWhhdmlvdXIgKi8KKwlvbGRfaGRyLnBhY2tfaWQgPSBocC0+cGFja19pZDsKKwlvbGRfaGRyLnR3ZWx2ZV9ieXRlID0KKwkgICAgKChzcnAtPmRhdGEuY21kX29wY29kZSA+PSAweGMwKSAmJiAoMTIgPT0gaHAtPmNtZF9sZW4pKSA/IDEgOiAwOworCW9sZF9oZHIudGFyZ2V0X3N0YXR1cyA9IGhwLT5tYXNrZWRfc3RhdHVzOworCW9sZF9oZHIuaG9zdF9zdGF0dXMgPSBocC0+aG9zdF9zdGF0dXM7CisJb2xkX2hkci5kcml2ZXJfc3RhdHVzID0gaHAtPmRyaXZlcl9zdGF0dXM7CisJaWYgKChDSEVDS19DT05ESVRJT04gJiBocC0+bWFza2VkX3N0YXR1cykgfHwKKwkgICAgKERSSVZFUl9TRU5TRSAmIGhwLT5kcml2ZXJfc3RhdHVzKSkKKwkJbWVtY3B5KG9sZF9oZHIuc2Vuc2VfYnVmZmVyLCBzcnAtPnNlbnNlX2IsCisJCSAgICAgICBzaXplb2YgKG9sZF9oZHIuc2Vuc2VfYnVmZmVyKSk7CisJc3dpdGNoIChocC0+aG9zdF9zdGF0dXMpIHsKKwkvKiBUaGlzIHNldHVwIG9mICdyZXN1bHQnIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBpcyBiZXN0CisJICAgaWdub3JlZCBieSB0aGUgdXNlciB3aG8gc2hvdWxkIHVzZSB0YXJnZXQsIGhvc3QgKyBkcml2ZXIgc3RhdHVzICovCisJY2FzZSBESURfT0s6CisJY2FzZSBESURfUEFTU1RIUk9VR0g6CisJY2FzZSBESURfU09GVF9FUlJPUjoKKwkJb2xkX2hkci5yZXN1bHQgPSAwOworCQlicmVhazsKKwljYXNlIERJRF9OT19DT05ORUNUOgorCWNhc2UgRElEX0JVU19CVVNZOgorCWNhc2UgRElEX1RJTUVfT1VUOgorCQlvbGRfaGRyLnJlc3VsdCA9IEVCVVNZOworCQlicmVhazsKKwljYXNlIERJRF9CQURfVEFSR0VUOgorCWNhc2UgRElEX0FCT1JUOgorCWNhc2UgRElEX1BBUklUWToKKwljYXNlIERJRF9SRVNFVDoKKwljYXNlIERJRF9CQURfSU5UUjoKKwkJb2xkX2hkci5yZXN1bHQgPSBFSU87CisJCWJyZWFrOworCWNhc2UgRElEX0VSUk9SOgorCQlvbGRfaGRyLnJlc3VsdCA9IChzcnAtPnNlbnNlX2JbMF0gPT0gMCAmJiAKKwkJCQkgIGhwLT5tYXNrZWRfc3RhdHVzID09IEdPT0QpID8gMCA6IEVJTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb2xkX2hkci5yZXN1bHQgPSBFSU87CisJCWJyZWFrOworCX0KKworCS8qIE5vdyBjb3B5IHRoZSByZXN1bHQgYmFjayB0byB0aGUgdXNlciBidWZmZXIuICAqLworCWlmIChjb3VudCA+PSBTWl9TR19IRUFERVIpIHsKKwkJaWYgKF9fY29weV90b191c2VyKGJ1ZiwgJm9sZF9oZHIsIFNaX1NHX0hFQURFUikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnVmICs9IFNaX1NHX0hFQURFUjsKKwkJaWYgKGNvdW50ID4gb2xkX2hkci5yZXBseV9sZW4pCisJCQljb3VudCA9IG9sZF9oZHIucmVwbHlfbGVuOworCQlpZiAoY291bnQgPiBTWl9TR19IRUFERVIpIHsKKwkJCWlmICgocmVzID0KKwkJCSAgICAgc2dfcmVhZF9veGZlcihzcnAsIGJ1ZiwgY291bnQgLSBTWl9TR19IRUFERVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZQorCQljb3VudCA9IChvbGRfaGRyLnJlc3VsdCA9PSAwKSA/IDAgOiAtRUlPOworCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc2dfbmV3X3JlYWQoU2dfZmQgKiBzZnAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgU2dfcmVxdWVzdCAqIHNycCkKK3sKKwlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7CisJaW50IGVyciA9IDA7CisJaW50IGxlbjsKKworCWlmIChjb3VudCA8IFNaX1NHX0lPX0hEUikgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWhwLT5zYl9sZW5fd3IgPSAwOworCWlmICgoaHAtPm14X3NiX2xlbiA+IDApICYmIGhwLT5zYnApIHsKKwkJaWYgKChDSEVDS19DT05ESVRJT04gJiBocC0+bWFza2VkX3N0YXR1cykgfHwKKwkJICAgIChEUklWRVJfU0VOU0UgJiBocC0+ZHJpdmVyX3N0YXR1cykpIHsKKwkJCWludCBzYl9sZW4gPSBzaXplb2YgKGR1bW15X2NtZHAtPnNyX3NlbnNlX2J1ZmZlcik7CisJCQlzYl9sZW4gPSAoaHAtPm14X3NiX2xlbiA+IHNiX2xlbikgPyBzYl9sZW4gOiBocC0+bXhfc2JfbGVuOworCQkJbGVuID0gOCArIChpbnQpIHNycC0+c2Vuc2VfYls3XTsJLyogQWRkaXRpb25hbCBzZW5zZSBsZW5ndGggZmllbGQgKi8KKwkJCWxlbiA9IChsZW4gPiBzYl9sZW4pID8gc2JfbGVuIDogbGVuOworCQkJaWYgKGNvcHlfdG9fdXNlcihocC0+c2JwLCBzcnAtPnNlbnNlX2IsIGxlbikpIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCWhwLT5zYl9sZW5fd3IgPSBsZW47CisJCX0KKwl9CisJaWYgKGhwLT5tYXNrZWRfc3RhdHVzIHx8IGhwLT5ob3N0X3N0YXR1cyB8fCBocC0+ZHJpdmVyX3N0YXR1cykKKwkJaHAtPmluZm8gfD0gU0dfSU5GT19DSEVDSzsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgaHAsIFNaX1NHX0lPX0hEUikpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBlcnJfb3V0OworCX0KKwllcnIgPSBzZ19yZWFkX3hmZXIoc3JwKTsKKyAgICAgIGVycl9vdXQ6CisJc2dfZmluaXNoX3JlbV9yZXEoc3JwKTsKKwlyZXR1cm4gKDAgPT0gZXJyKSA/IGNvdW50IDogZXJyOworfQorCitzdGF0aWMgc3NpemVfdAorc2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlpbnQgbXhzaXplLCBjbWRfc2l6ZSwgazsKKwlpbnQgaW5wdXRfc2l6ZSwgYmxvY2tpbmc7CisJdW5zaWduZWQgY2hhciBvcGNvZGU7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJc3RydWN0IHNnX2hlYWRlciBvbGRfaGRyOworCXNnX2lvX2hkcl90ICpocDsKKwl1bnNpZ25lZCBjaGFyIGNtbmRbc2l6ZW9mIChkdW1teV9jbWRwLT5zcl9jbW5kKV07CisKKwlpZiAoKCEoc2ZwID0gKFNnX2ZkICopIGZpbHAtPnByaXZhdGVfZGF0YSkpIHx8ICghKHNkcCA9IHNmcC0+cGFyZW50ZHApKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfd3JpdGU6ICVzLCBjb3VudD0lZFxuIiwKKwkJCQkgICBzZHAtPmRpc2stPmRpc2tfbmFtZSwgKGludCkgY291bnQpKTsKKwlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCEoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCSAgICAgIHNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZHAtPmRldmljZSkpKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsJLyogcHJvdGVjdHMgZm9sbG93aW5nIGNvcHlfZnJvbV91c2VyKClzICsgZ2V0X3VzZXIoKXMgKi8KKwlpZiAoY291bnQgPCBTWl9TR19IRUFERVIpCisJCXJldHVybiAtRUlPOworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZvbGRfaGRyLCBidWYsIFNaX1NHX0hFQURFUikpCisJCXJldHVybiAtRUZBVUxUOworCWJsb2NraW5nID0gIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaWYgKG9sZF9oZHIucmVwbHlfbGVuIDwgMCkKKwkJcmV0dXJuIHNnX25ld193cml0ZShzZnAsIGJ1ZiwgY291bnQsIGJsb2NraW5nLCAwLCBOVUxMKTsKKwlpZiAoY291bnQgPCAoU1pfU0dfSEVBREVSICsgNikpCisJCXJldHVybiAtRUlPOwkvKiBUaGUgbWluaW11bSBzY3NpIGNvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuICovCisKKwlpZiAoIShzcnAgPSBzZ19hZGRfcmVxdWVzdChzZnApKSkgeworCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfd3JpdGU6IHF1ZXVlIGZ1bGxcbiIpKTsKKwkJcmV0dXJuIC1FRE9NOworCX0KKwlidWYgKz0gU1pfU0dfSEVBREVSOworCV9fZ2V0X3VzZXIob3Bjb2RlLCBidWYpOworCWlmIChzZnAtPm5leHRfY21kX2xlbiA+IDApIHsKKwkJaWYgKHNmcC0+bmV4dF9jbWRfbGVuID4gTUFYX0NPTU1BTkRfU0laRSkgeworCQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX3dyaXRlOiBjb21tYW5kIGxlbmd0aCB0b28gbG9uZ1xuIikpOworCQkJc2ZwLT5uZXh0X2NtZF9sZW4gPSAwOworCQkJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJY21kX3NpemUgPSBzZnAtPm5leHRfY21kX2xlbjsKKwkJc2ZwLT5uZXh0X2NtZF9sZW4gPSAwOwkvKiByZXNldCBzbyBvbmx5IHRoaXMgd3JpdGUoKSBlZmZlY3RlZCAqLworCX0gZWxzZSB7CisJCWNtZF9zaXplID0gQ09NTUFORF9TSVpFKG9wY29kZSk7CS8qIGJhc2VkIG9uIFNDU0kgY29tbWFuZCBncm91cCAqLworCQlpZiAoKG9wY29kZSA+PSAweGMwKSAmJiBvbGRfaGRyLnR3ZWx2ZV9ieXRlKQorCQkJY21kX3NpemUgPSAxMjsKKwl9CisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoCisJCSJzZ193cml0ZTogICBzY3NpIG9wY29kZT0weCUwMngsIGNtZF9zaXplPSVkXG4iLCAoaW50KSBvcGNvZGUsIGNtZF9zaXplKSk7CisvKiBEZXRlcm1pbmUgYnVmZmVyIHNpemUuICAqLworCWlucHV0X3NpemUgPSBjb3VudCAtIGNtZF9zaXplOworCW14c2l6ZSA9IChpbnB1dF9zaXplID4gb2xkX2hkci5yZXBseV9sZW4pID8gaW5wdXRfc2l6ZSA6IG9sZF9oZHIucmVwbHlfbGVuOworCW14c2l6ZSAtPSBTWl9TR19IRUFERVI7CisJaW5wdXRfc2l6ZSAtPSBTWl9TR19IRUFERVI7CisJaWYgKGlucHV0X3NpemUgPCAwKSB7CisJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJcmV0dXJuIC1FSU87CS8qIFVzZXIgZGlkIG5vdCBwYXNzIGVub3VnaCBieXRlcyBmb3IgdGhpcyBjb21tYW5kLiAqLworCX0KKwlocCA9ICZzcnAtPmhlYWRlcjsKKwlocC0+aW50ZXJmYWNlX2lkID0gJ1wwJzsJLyogaW5kaWNhdG9yIG9mIG9sZCBpbnRlcmZhY2UgdHVubmVsbGVkICovCisJaHAtPmNtZF9sZW4gPSAodW5zaWduZWQgY2hhcikgY21kX3NpemU7CisJaHAtPmlvdmVjX2NvdW50ID0gMDsKKwlocC0+bXhfc2JfbGVuID0gMDsKKwlpZiAoaW5wdXRfc2l6ZSA+IDApCisJCWhwLT5keGZlcl9kaXJlY3Rpb24gPSAob2xkX2hkci5yZXBseV9sZW4gPiBTWl9TR19IRUFERVIpID8KKwkJICAgIFNHX0RYRkVSX1RPX0ZST01fREVWIDogU0dfRFhGRVJfVE9fREVWOworCWVsc2UKKwkJaHAtPmR4ZmVyX2RpcmVjdGlvbiA9IChteHNpemUgPiAwKSA/IFNHX0RYRkVSX0ZST01fREVWIDogU0dfRFhGRVJfTk9ORTsKKwlocC0+ZHhmZXJfbGVuID0gbXhzaXplOworCWhwLT5keGZlcnAgPSAoY2hhciBfX3VzZXIgKilidWYgKyBjbWRfc2l6ZTsKKwlocC0+c2JwID0gTlVMTDsKKwlocC0+dGltZW91dCA9IG9sZF9oZHIucmVwbHlfbGVuOwkvKiBzdHJ1Y3R1cmUgYWJ1c2UgLi4uICovCisJaHAtPmZsYWdzID0gaW5wdXRfc2l6ZTsJLyogc3RydWN0dXJlIGFidXNlIC4uLiAqLworCWhwLT5wYWNrX2lkID0gb2xkX2hkci5wYWNrX2lkOworCWhwLT51c3JfcHRyID0gTlVMTDsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcihjbW5kLCBidWYsIGNtZF9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLyoKKwkgKiBTR19EWEZFUl9UT19GUk9NX0RFViBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBTR19EWEZFUl9GUk9NX0RFViwKKwkgKiBidXQgaXMgaXMgcG9zc2libGUgdGhhdCB0aGUgYXBwIGludGVuZGVkIFNHX0RYRkVSX1RPX0RFViwgYmVjYXVzZSB0aGVyZQorCSAqIGlzIGEgbm9uLXplcm8gaW5wdXRfc2l6ZSwgc28gZW1pdCBhIHdhcm5pbmcuCisJICovCisJaWYgKGhwLT5keGZlcl9kaXJlY3Rpb24gPT0gU0dfRFhGRVJfVE9fRlJPTV9ERVYpCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgInNnX3dyaXRlOiBkYXRhIGluL291dCAlZC8lZCBieXRlcyBmb3IgU0NTSSBjb21tYW5kIDB4JXgtLSIKKwkJCSAgICAgICAiZ3Vlc3NpbmcgZGF0YSBpbjtcbiIgS0VSTl9XQVJOSU5HICIgICAiCisJCQkgICAgICAgInByb2dyYW0gJXMgbm90IHNldHRpbmcgY291bnQgYW5kL29yIHJlcGx5X2xlbiBwcm9wZXJseVxuIiwKKwkJCSAgICAgICBvbGRfaGRyLnJlcGx5X2xlbiAtIChpbnQpU1pfU0dfSEVBREVSLAorCQkJICAgICAgIGlucHV0X3NpemUsICh1bnNpZ25lZCBpbnQpIGNtbmRbMF0sCisJCQkgICAgICAgY3VycmVudC0+Y29tbSk7CisJayA9IHNnX2NvbW1vbl93cml0ZShzZnAsIHNycCwgY21uZCwgc2ZwLT50aW1lb3V0LCBibG9ja2luZyk7CisJcmV0dXJuIChrIDwgMCkgPyBrIDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzZ19uZXdfd3JpdGUoU2dfZmQgKiBzZnAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkgICAgIGludCBibG9ja2luZywgaW50IHJlYWRfb25seSwgU2dfcmVxdWVzdCAqKiBvX3NycCkKK3sKKwlpbnQgazsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJc2dfaW9faGRyX3QgKmhwOworCXVuc2lnbmVkIGNoYXIgY21uZFtzaXplb2YgKGR1bW15X2NtZHAtPnNyX2NtbmQpXTsKKwlpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIHVsX3RpbWVvdXQ7CisKKwlpZiAoY291bnQgPCBTWl9TR19JT19IRFIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7IC8qIHByb3RlY3RzIGZvbGxvd2luZyBjb3B5X2Zyb21fdXNlcigpcyArIGdldF91c2VyKClzICovCisKKwlzZnAtPmNtZF9xID0gMTsJLyogd2hlbiBzZ19pb19oZHIgc2Vlbiwgc2V0IGNvbW1hbmQgcXVldWluZyBvbiAqLworCWlmICghKHNycCA9IHNnX2FkZF9yZXF1ZXN0KHNmcCkpKSB7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19uZXdfd3JpdGU6IHF1ZXVlIGZ1bGxcbiIpKTsKKwkJcmV0dXJuIC1FRE9NOworCX0KKwlocCA9ICZzcnAtPmhlYWRlcjsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcihocCwgYnVmLCBTWl9TR19JT19IRFIpKSB7CisJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChocC0+aW50ZXJmYWNlX2lkICE9ICdTJykgeworCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCXJldHVybiAtRU5PU1lTOworCX0KKwlpZiAoaHAtPmZsYWdzICYgU0dfRkxBR19NTUFQX0lPKSB7CisJCWlmIChocC0+ZHhmZXJfbGVuID4gc2ZwLT5yZXNlcnZlLmJ1ZmZsZW4pIHsKKwkJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJCXJldHVybiAtRU5PTUVNOwkvKiBNTUFQX0lPIHNpemUgbXVzdCBmaXQgaW4gcmVzZXJ2ZSBidWZmZXIgKi8KKwkJfQorCQlpZiAoaHAtPmZsYWdzICYgU0dfRkxBR19ESVJFQ1RfSU8pIHsKKwkJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJCXJldHVybiAtRUlOVkFMOwkvKiBlaXRoZXIgTU1BUF9JTyBvciBESVJFQ1RfSU8gKG5vdCBib3RoKSAqLworCQl9CisJCWlmIChzZ19yZXNfaW5fdXNlKHNmcCkpIHsKKwkJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJCXJldHVybiAtRUJVU1k7CS8qIHJlc2VydmUgYnVmZmVyIGFscmVhZHkgYmVpbmcgdXNlZCAqLworCQl9CisJfQorCXVsX3RpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHNycC0+aGVhZGVyLnRpbWVvdXQpOworCXRpbWVvdXQgPSAodWxfdGltZW91dCA8IElOVF9NQVgpID8gdWxfdGltZW91dCA6IElOVF9NQVg7CisJaWYgKCghaHAtPmNtZHApIHx8IChocC0+Y21kX2xlbiA8IDYpIHx8IChocC0+Y21kX2xlbiA+IHNpemVvZiAoY21uZCkpKSB7CisJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGhwLT5jbWRwLCBocC0+Y21kX2xlbikpIHsKKwkJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOworCQlyZXR1cm4gLUVGQVVMVDsJLyogcHJvdGVjdHMgZm9sbG93aW5nIGNvcHlfZnJvbV91c2VyKClzICsgZ2V0X3VzZXIoKXMgKi8KKwl9CisJaWYgKF9fY29weV9mcm9tX3VzZXIoY21uZCwgaHAtPmNtZHAsIGhwLT5jbWRfbGVuKSkgeworCQlzZ19yZW1vdmVfcmVxdWVzdChzZnAsIHNycCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAocmVhZF9vbmx5ICYmCisJICAgICghc2dfYWxsb3dfYWNjZXNzKGNtbmRbMF0sIHNmcC0+cGFyZW50ZHAtPmRldmljZS0+dHlwZSkpKSB7CisJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJayA9IHNnX2NvbW1vbl93cml0ZShzZnAsIHNycCwgY21uZCwgdGltZW91dCwgYmxvY2tpbmcpOworCWlmIChrIDwgMCkKKwkJcmV0dXJuIGs7CisJaWYgKG9fc3JwKQorCQkqb19zcnAgPSBzcnA7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitzZ19jb21tb25fd3JpdGUoU2dfZmQgKiBzZnAsIFNnX3JlcXVlc3QgKiBzcnAsCisJCXVuc2lnbmVkIGNoYXIgKmNtbmQsIGludCB0aW1lb3V0LCBpbnQgYmxvY2tpbmcpCit7CisJaW50IGs7CisJU2NzaV9SZXF1ZXN0ICpTUnBudDsKKwlTZ19kZXZpY2UgKnNkcCA9IHNmcC0+cGFyZW50ZHA7CisJc2dfaW9faGRyX3QgKmhwID0gJnNycC0+aGVhZGVyOworCXJlcXVlc3RfcXVldWVfdCAqcTsKKworCXNycC0+ZGF0YS5jbWRfb3Bjb2RlID0gY21uZFswXTsJLyogaG9sZCBvcGNvZGUgb2YgY29tbWFuZCAqLworCWhwLT5zdGF0dXMgPSAwOworCWhwLT5tYXNrZWRfc3RhdHVzID0gMDsKKwlocC0+bXNnX3N0YXR1cyA9IDA7CisJaHAtPmluZm8gPSAwOworCWhwLT5ob3N0X3N0YXR1cyA9IDA7CisJaHAtPmRyaXZlcl9zdGF0dXMgPSAwOworCWhwLT5yZXNpZCA9IDA7CisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX2NvbW1vbl93cml0ZTogIHNjc2kgb3Bjb2RlPTB4JTAyeCwgY21kX3NpemU9JWRcbiIsCisJCQkgIChpbnQpIGNtbmRbMF0sIChpbnQpIGhwLT5jbWRfbGVuKSk7CisKKwlpZiAoKGsgPSBzZ19zdGFydF9yZXEoc3JwKSkpIHsKKwkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX3dyaXRlOiBzdGFydF9yZXEgZXJyPSVkXG4iLCBrKSk7CisJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCXJldHVybiBrOwkvKiBwcm9iYWJseSBvdXQgb2Ygc3BhY2UgLS0+IEVOT01FTSAqLworCX0KKwlpZiAoKGsgPSBzZ193cml0ZV94ZmVyKHNycCkpKSB7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ193cml0ZTogd3JpdGVfeGZlciwgYmFkIGFkZHJlc3NcbiIpKTsKKwkJc2dfZmluaXNoX3JlbV9yZXEoc3JwKTsKKwkJcmV0dXJuIGs7CisJfQorCWlmIChzZHAtPmRldGFjaGVkKSB7CisJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChzZHAtPmRldmljZSwgR0ZQX0FUT01JQyk7CisJaWYgKFNScG50ID09IE5VTEwpIHsKKwkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX3dyaXRlOiBubyBtZW1cbiIpKTsKKwkJc2dfZmluaXNoX3JlbV9yZXEoc3JwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3JwLT5teV9jbWRwID0gU1JwbnQ7CisJcSA9IFNScG50LT5zcl9kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX2Rpc2sgPSBzZHAtPmRpc2s7CisJU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclswXSA9IDA7CisJU1JwbnQtPnNyX2NtZF9sZW4gPSBocC0+Y21kX2xlbjsKKwlTUnBudC0+c3JfdXNlX3NnID0gc3JwLT5kYXRhLmtfdXNlX3NnOworCVNScG50LT5zcl9zZ2xpc3RfbGVuID0gc3JwLT5kYXRhLnNnbGlzdF9sZW47CisJU1JwbnQtPnNyX2J1ZmZsZW4gPSBzcnAtPmRhdGEuYnVmZmxlbjsKKwlTUnBudC0+c3JfdW5kZXJmbG93ID0gMDsKKwlTUnBudC0+c3JfYnVmZmVyID0gc3JwLT5kYXRhLmJ1ZmZlcjsKKwlzd2l0Y2ggKGhwLT5keGZlcl9kaXJlY3Rpb24pIHsKKwljYXNlIFNHX0RYRkVSX1RPX0ZST01fREVWOgorCWNhc2UgU0dfRFhGRVJfRlJPTV9ERVY6CisJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9SRUFEOworCQlicmVhazsKKwljYXNlIFNHX0RYRkVSX1RPX0RFVjoKKwkJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gU0NTSV9EQVRBX1dSSVRFOworCQlicmVhazsKKwljYXNlIFNHX0RYRkVSX1VOS05PV046CisJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IFNDU0lfREFUQV9VTktOT1dOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBTQ1NJX0RBVEFfTk9ORTsKKwkJYnJlYWs7CisJfQorCVNScG50LT51cHBlcl9wcml2YXRlX2RhdGEgPSBzcnA7CisJc3JwLT5kYXRhLmtfdXNlX3NnID0gMDsKKwlzcnAtPmRhdGEuc2dsaXN0X2xlbiA9IDA7CisJc3JwLT5kYXRhLmJ1ZmZsZW4gPSAwOworCXNycC0+ZGF0YS5idWZmZXIgPSBOVUxMOworCWhwLT5kdXJhdGlvbiA9IGppZmZpZXM7CS8qIHVuaXQgamlmZmllcyBub3csIG1pbGxpc2VjcyBhZnRlciBkb25lICovCisvKiBOb3cgc2VuZCBldmVyeXRoaW5nIG9mIHRvIG1pZC1sZXZlbC4gVGhlIG5leHQgdGltZSB3ZSBoZWFyIGFib3V0IHRoaXMKKyAgIHBhY2tldCBpcyB3aGVuIHNnX2NtZF9kb25lKCkgaXMgY2FsbGVkIChpLmUuIGEgY2FsbGJhY2spLiAqLworCXNjc2lfZG9fcmVxKFNScG50LCAodm9pZCAqKSBjbW5kLAorCQkgICAgKHZvaWQgKikgU1JwbnQtPnNyX2J1ZmZlciwgaHAtPmR4ZmVyX2xlbiwKKwkJICAgIHNnX2NtZF9kb25lLCB0aW1lb3V0LCBTR19ERUZBVUxUX1JFVFJJRVMpOworCS8qIGR4ZmVyX2xlbiBvdmVyd3JpdGVzIFNScG50LT5zcl9idWZmbGVuLCBoZW5jZSBuZWVkIGZvciBiX21hbGxvY19sZW4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2dfc3JwX2RvbmUoU2dfcmVxdWVzdCAqc3JwLCBTZ19mZCAqc2ZwKQoreworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCBkb25lOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCWRvbmUgPSBzcnAtPmRvbmU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJcmV0dXJuIGRvbmU7Cit9CisKK3N0YXRpYyBpbnQKK3NnX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCSB1bnNpZ25lZCBpbnQgY21kX2luLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICppcCA9IHA7CisJaW50IHJlc3VsdCwgdmFsLCByZWFkX29ubHk7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlpZiAoKCEoc2ZwID0gKFNnX2ZkICopIGZpbHAtPnByaXZhdGVfZGF0YSkpIHx8ICghKHNkcCA9IHNmcC0+cGFyZW50ZHApKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfaW9jdGw6ICVzLCBjbWQ9MHgleFxuIiwKKwkJCQkgICBzZHAtPmRpc2stPmRpc2tfbmFtZSwgKGludCkgY21kX2luKSk7CisJcmVhZF9vbmx5ID0gKE9fUkRXUiAhPSAoZmlscC0+Zl9mbGFncyAmIE9fQUNDTU9ERSkpOworCisJc3dpdGNoIChjbWRfaW4pIHsKKwljYXNlIFNHX0lPOgorCQl7CisJCQlpbnQgYmxvY2tpbmcgPSAxOwkvKiBpZ25vcmUgT19OT05CTE9DSyBmbGFnICovCisKKwkJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJaWYgKCFzY3NpX2Jsb2NrX3doZW5fcHJvY2Vzc2luZ19lcnJvcnMoc2RwLT5kZXZpY2UpKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHAsIFNaX1NHX0lPX0hEUikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXN1bHQgPQorCQkJICAgIHNnX25ld193cml0ZShzZnAsIHAsIFNaX1NHX0lPX0hEUiwKKwkJCQkJIGJsb2NraW5nLCByZWFkX29ubHksICZzcnApOworCQkJaWYgKHJlc3VsdCA8IDApCisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCXNycC0+c2dfaW9fb3duZWQgPSAxOworCQkJd2hpbGUgKDEpIHsKKwkJCQlyZXN1bHQgPSAwOwkvKiBmb2xsb3dpbmcgbWFjcm8gdG8gYmVhdCByYWNlIGNvbmRpdGlvbiAqLworCQkJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNmcC0+cmVhZF93YWl0LAorCQkJCQkoc2RwLT5kZXRhY2hlZCB8fCBzZnAtPmNsb3NlZCB8fCBzZ19zcnBfZG9uZShzcnAsIHNmcCkpLAorCQkJCQkJCSAgIHJlc3VsdCk7CisJCQkJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCQkJCXJldHVybiAtRU5PREVWOworCQkJCWlmIChzZnAtPmNsb3NlZCkKKwkJCQkJcmV0dXJuIDA7CS8qIHJlcXVlc3QgcGFja2V0IGRyb3BwZWQgYWxyZWFkeSAqLworCQkJCWlmICgwID09IHJlc3VsdCkKKwkJCQkJYnJlYWs7CisJCQkJc3JwLT5vcnBoYW4gPSAxOworCQkJCXJldHVybiByZXN1bHQ7CS8qIC1FUkVTVEFSVFNZUyBiZWNhdXNlIHNpZ25hbCBoaXQgcHJvY2VzcyAqLworCQkJfQorCQkJd3JpdGVfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwkJCXNycC0+ZG9uZSA9IDI7CisJCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJCQlyZXN1bHQgPSBzZ19uZXdfcmVhZChzZnAsIHAsIFNaX1NHX0lPX0hEUiwgc3JwKTsKKwkJCXJldHVybiAocmVzdWx0IDwgMCkgPyByZXN1bHQgOiAwOworCQl9CisJY2FzZSBTR19TRVRfVElNRU9VVDoKKwkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsLCBpcCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAodmFsIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlpZiAodmFsID49IE1VTERJViAoSU5UX01BWCwgVVNFUl9IWiwgSFopKQorCQkgICAgdmFsID0gTVVMRElWIChJTlRfTUFYLCBVU0VSX0haLCBIWik7CisJCXNmcC0+dGltZW91dF91c2VyID0gdmFsOworCQlzZnAtPnRpbWVvdXQgPSBNVUxESVYgKHZhbCwgSFosIFVTRVJfSFopOworCisJCXJldHVybiAwOworCWNhc2UgU0dfR0VUX1RJTUVPVVQ6CS8qIE4uQi4gVXNlciByZWNlaXZlcyB0aW1lb3V0IGFzIHJldHVybiB2YWx1ZSAqLworCQkJCS8qIHN0cmFuZ2UgLi4uLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCQlyZXR1cm4gc2ZwLT50aW1lb3V0X3VzZXI7CisJY2FzZSBTR19TRVRfRk9SQ0VfTE9XX0RNQToKKwkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsLCBpcCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAodmFsKSB7CisJCQlzZnAtPmxvd19kbWEgPSAxOworCQkJaWYgKCgwID09IHNmcC0+bG93X2RtYSkgJiYgKDAgPT0gc2dfcmVzX2luX3VzZShzZnApKSkgeworCQkJCXZhbCA9IChpbnQpIHNmcC0+cmVzZXJ2ZS5idWZmbGVuOworCQkJCXNnX3JlbW92ZV9zY2F0KCZzZnAtPnJlc2VydmUpOworCQkJCXNnX2J1aWxkX3Jlc2VydmUoc2ZwLCB2YWwpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlzZnAtPmxvd19kbWEgPSBzZHAtPmRldmljZS0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWE7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBTR19HRVRfTE9XX0RNQToKKwkJcmV0dXJuIHB1dF91c2VyKChpbnQpIHNmcC0+bG93X2RtYSwgaXApOworCWNhc2UgU0dfR0VUX1NDU0lfSUQ6CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcCwgc2l6ZW9mIChzZ19zY3NpX2lkX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllbHNlIHsKKwkJCXNnX3Njc2lfaWRfdCBfX3VzZXIgKnNnX2lkcCA9IHA7CisKKwkJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJX19wdXRfdXNlcigoaW50KSBzZHAtPmRldmljZS0+aG9zdC0+aG9zdF9ubywKKwkJCQkgICAmc2dfaWRwLT5ob3N0X25vKTsKKwkJCV9fcHV0X3VzZXIoKGludCkgc2RwLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJICAgJnNnX2lkcC0+Y2hhbm5lbCk7CisJCQlfX3B1dF91c2VyKChpbnQpIHNkcC0+ZGV2aWNlLT5pZCwgJnNnX2lkcC0+c2NzaV9pZCk7CisJCQlfX3B1dF91c2VyKChpbnQpIHNkcC0+ZGV2aWNlLT5sdW4sICZzZ19pZHAtPmx1bik7CisJCQlfX3B1dF91c2VyKChpbnQpIHNkcC0+ZGV2aWNlLT50eXBlLCAmc2dfaWRwLT5zY3NpX3R5cGUpOworCQkJX19wdXRfdXNlcigoc2hvcnQpIHNkcC0+ZGV2aWNlLT5ob3N0LT5jbWRfcGVyX2x1biwKKwkJCQkgICAmc2dfaWRwLT5oX2NtZF9wZXJfbHVuKTsKKwkJCV9fcHV0X3VzZXIoKHNob3J0KSBzZHAtPmRldmljZS0+cXVldWVfZGVwdGgsCisJCQkJICAgJnNnX2lkcC0+ZF9xdWV1ZV9kZXB0aCk7CisJCQlfX3B1dF91c2VyKDAsICZzZ19pZHAtPnVudXNlZFswXSk7CisJCQlfX3B1dF91c2VyKDAsICZzZ19pZHAtPnVudXNlZFsxXSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgU0dfU0VUX0ZPUkNFX1BBQ0tfSUQ6CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJc2ZwLT5mb3JjZV9wYWNraWQgPSB2YWwgPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTR19HRVRfUEFDS19JRDoKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBpcCwgc2l6ZW9mIChpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZWFkX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJCWZvciAoc3JwID0gc2ZwLT5oZWFkcnA7IHNycDsgc3JwID0gc3JwLT5uZXh0cnApIHsKKwkJCWlmICgoMSA9PSBzcnAtPmRvbmUpICYmICghc3JwLT5zZ19pb19vd25lZCkpIHsKKwkJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywKKwkJCQkJCSAgICAgICBpZmxhZ3MpOworCQkJCV9fcHV0X3VzZXIoc3JwLT5oZWFkZXIucGFja19pZCwgaXApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQlfX3B1dF91c2VyKC0xLCBpcCk7CisJCXJldHVybiAwOworCWNhc2UgU0dfR0VUX05VTV9XQUlUSU5HOgorCQlyZWFkX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJCWZvciAodmFsID0gMCwgc3JwID0gc2ZwLT5oZWFkcnA7IHNycDsgc3JwID0gc3JwLT5uZXh0cnApIHsKKwkJCWlmICgoMSA9PSBzcnAtPmRvbmUpICYmICghc3JwLT5zZ19pb19vd25lZCkpCisJCQkJKyt2YWw7CisJCX0KKwkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIGlwKTsKKwljYXNlIFNHX0dFVF9TR19UQUJMRVNJWkU6CisJCXJldHVybiBwdXRfdXNlcihzZHAtPnNnX3RhYmxlc2l6ZSwgaXApOworCWNhc2UgU0dfU0VUX1JFU0VSVkVEX1NJWkU6CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQlpZiAodmFsICE9IHNmcC0+cmVzZXJ2ZS5idWZmbGVuKSB7CisJCQlpZiAoc2dfcmVzX2luX3VzZShzZnApIHx8IHNmcC0+bW1hcF9jYWxsZWQpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXNnX3JlbW92ZV9zY2F0KCZzZnAtPnJlc2VydmUpOworCQkJc2dfYnVpbGRfcmVzZXJ2ZShzZnAsIHZhbCk7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBTR19HRVRfUkVTRVJWRURfU0laRToKKwkJdmFsID0gKGludCkgc2ZwLT5yZXNlcnZlLmJ1ZmZsZW47CisJCXJldHVybiBwdXRfdXNlcih2YWwsIGlwKTsKKwljYXNlIFNHX1NFVF9DT01NQU5EX1E6CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJc2ZwLT5jbWRfcSA9IHZhbCA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwljYXNlIFNHX0dFVF9DT01NQU5EX1E6CisJCXJldHVybiBwdXRfdXNlcigoaW50KSBzZnAtPmNtZF9xLCBpcCk7CisJY2FzZSBTR19TRVRfS0VFUF9PUlBIQU46CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJc2ZwLT5rZWVwX29ycGhhbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTR19HRVRfS0VFUF9PUlBIQU46CisJCXJldHVybiBwdXRfdXNlcigoaW50KSBzZnAtPmtlZXBfb3JwaGFuLCBpcCk7CisJY2FzZSBTR19ORVhUX0NNRF9MRU46CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJc2ZwLT5uZXh0X2NtZF9sZW4gPSAodmFsID4gMCkgPyB2YWwgOiAwOworCQlyZXR1cm4gMDsKKwljYXNlIFNHX0dFVF9WRVJTSU9OX05VTToKKwkJcmV0dXJuIHB1dF91c2VyKHNnX3ZlcnNpb25fbnVtLCBpcCk7CisJY2FzZSBTR19HRVRfQUNDRVNTX0NPVU5UOgorCQkvKiBmYWtlZCAtIHdlIGRvbid0IGhhdmUgYSByZWFsIGFjY2VzcyBjb3VudCBhbnltb3JlICovCisJCXZhbCA9IChzZHAtPmRldmljZSA/IDEgOiAwKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgaXApOworCWNhc2UgU0dfR0VUX1JFUVVFU1RfVEFCTEU6CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcCwgU1pfU0dfUkVRX0lORk8gKiBTR19NQVhfUVVFVUUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVsc2UgeworCQkJc2dfcmVxX2luZm9fdCByaW5mb1tTR19NQVhfUVVFVUVdOworCQkJU2dfcmVxdWVzdCAqc3JwOworCQkJcmVhZF9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQkJZm9yIChzcnAgPSBzZnAtPmhlYWRycCwgdmFsID0gMDsgdmFsIDwgU0dfTUFYX1FVRVVFOworCQkJICAgICArK3ZhbCwgc3JwID0gc3JwID8gc3JwLT5uZXh0cnAgOiBzcnApIHsKKwkJCQltZW1zZXQoJnJpbmZvW3ZhbF0sIDAsIFNaX1NHX1JFUV9JTkZPKTsKKwkJCQlpZiAoc3JwKSB7CisJCQkJCXJpbmZvW3ZhbF0ucmVxX3N0YXRlID0gc3JwLT5kb25lICsgMTsKKwkJCQkJcmluZm9bdmFsXS5wcm9ibGVtID0KKwkJCQkJICAgIHNycC0+aGVhZGVyLm1hc2tlZF9zdGF0dXMgJiAKKwkJCQkJICAgIHNycC0+aGVhZGVyLmhvc3Rfc3RhdHVzICYgCisJCQkJCSAgICBzcnAtPmhlYWRlci5kcml2ZXJfc3RhdHVzOworCQkJCQlyaW5mb1t2YWxdLmR1cmF0aW9uID0KKwkJCQkJICAgIHNycC0+ZG9uZSA/IHNycC0+aGVhZGVyLmR1cmF0aW9uIDoKKwkJCQkJICAgIGppZmZpZXNfdG9fbXNlY3MoCisJCQkJCQlqaWZmaWVzIC0gc3JwLT5oZWFkZXIuZHVyYXRpb24pOworCQkJCQlyaW5mb1t2YWxdLm9ycGhhbiA9IHNycC0+b3JwaGFuOworCQkJCQlyaW5mb1t2YWxdLnNnX2lvX293bmVkID0gc3JwLT5zZ19pb19vd25lZDsKKwkJCQkJcmluZm9bdmFsXS5wYWNrX2lkID0gc3JwLT5oZWFkZXIucGFja19pZDsKKwkJCQkJcmluZm9bdmFsXS51c3JfcHRyID0gc3JwLT5oZWFkZXIudXNyX3B0cjsKKwkJCQl9CisJCQl9CisJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwkJCXJldHVybiAoX19jb3B5X3RvX3VzZXIocCwgcmluZm8sCisJCQkgICAgICAgIFNaX1NHX1JFUV9JTkZPICogU0dfTUFYX1FVRVVFKSA/IC1FRkFVTFQgOiAwKTsKKwkJfQorCWNhc2UgU0dfRU1VTEFURURfSE9TVDoKKwkJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIHB1dF91c2VyKHNkcC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZW11bGF0ZWQsIGlwKTsKKwljYXNlIFNHX1NDU0lfUkVTRVQ6CisJCWlmIChzZHAtPmRldGFjaGVkKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJaWYgKHRlc3RfYml0KFNIT1NUX1JFQ09WRVJZLAorCQkJCSAgICAgJnNkcC0+ZGV2aWNlLT5ob3N0LT5zaG9zdF9zdGF0ZSkpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJfSBlbHNlIGlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKHNkcC0+ZGV2aWNlKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKFNHX1NDU0lfUkVTRVRfTk9USElORyA9PSB2YWwpCisJCQlyZXR1cm4gMDsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBTR19TQ1NJX1JFU0VUX0RFVklDRToKKwkJCXZhbCA9IFNDU0lfVFJZX1JFU0VUX0RFVklDRTsKKwkJCWJyZWFrOworCQljYXNlIFNHX1NDU0lfUkVTRVRfQlVTOgorCQkJdmFsID0gU0NTSV9UUllfUkVTRVRfQlVTOworCQkJYnJlYWs7CisJCWNhc2UgU0dfU0NTSV9SRVNFVF9IT1NUOgorCQkJdmFsID0gU0NTSV9UUllfUkVTRVRfSE9TVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiAoc2NzaV9yZXNldF9wcm92aWRlcihzZHAtPmRldmljZSwgdmFsKSA9PQorCQkJU1VDQ0VTUykgPyAwIDogLUVJTzsKKwljYXNlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EOgorCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAocmVhZF9vbmx5KSB7CisJCQl1bnNpZ25lZCBjaGFyIG9wY29kZSA9IFdSSVRFXzY7CisJCQlTY3NpX0lvY3RsX0NvbW1hbmQgX191c2VyICpzaW9jcCA9IHA7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmb3Bjb2RlLCBzaW9jcC0+ZGF0YSwgMSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoIXNnX2FsbG93X2FjY2VzcyhvcGNvZGUsIHNkcC0+ZGV2aWNlLT50eXBlKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCXJldHVybiBzY3NpX2lvY3RsX3NlbmRfY29tbWFuZChzZHAtPmRldmljZSwgcCk7CisJY2FzZSBTR19TRVRfREVCVUc6CisJCXJlc3VsdCA9IGdldF91c2VyKHZhbCwgaXApOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJc2RwLT5zZ2RlYnVnID0gKGNoYXIpIHZhbDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9JRExVTjoKKwljYXNlIFNDU0lfSU9DVExfR0VUX0JVU19OVU1CRVI6CisJY2FzZSBTQ1NJX0lPQ1RMX1BST0JFX0hPU1Q6CisJY2FzZSBTR19HRVRfVFJBTlNGT1JNOgorCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gc2NzaV9pb2N0bChzZHAtPmRldmljZSwgY21kX2luLCBwKTsKKwlkZWZhdWx0OgorCQlpZiAocmVhZF9vbmx5KQorCQkJcmV0dXJuIC1FUEVSTTsJLyogZG9uJ3Qga25vdyBzbyB0YWtlIHNhZmUgYXBwcm9hY2ggKi8KKwkJcmV0dXJuIHNjc2lfaW9jdGwoc2RwLT5kZXZpY2UsIGNtZF9pbiwgcCk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgc2dfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kX2luLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlTZ19kZXZpY2UgKnNkcDsKKwlTZ19mZCAqc2ZwOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCWlmICgoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkgfHwgKCEoc2RwID0gc2ZwLT5wYXJlbnRkcCkpKQorCQlyZXR1cm4gLUVOWElPOworCisJc2RldiA9IHNkcC0+ZGV2aWNlOworCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKSB7IAorCQlpbnQgcmV0OworCisJCXJldCA9IHNkZXYtPmhvc3QtPmhvc3R0LT5jb21wYXRfaW9jdGwoc2RldiwgY21kX2luLCAodm9pZCBfX3VzZXIgKilhcmcpOworCisJCXJldHVybiByZXQ7CisJfQorCQorCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGludAorc2dfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJdW5zaWduZWQgaW50IHJlcyA9IDA7CisJU2dfZGV2aWNlICpzZHA7CisJU2dfZmQgKnNmcDsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCWlmICgoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkgfHwgKCEoc2RwID0gc2ZwLT5wYXJlbnRkcCkpCisJICAgIHx8IHNmcC0+Y2xvc2VkKQorCQlyZXR1cm4gUE9MTEVSUjsKKwlwb2xsX3dhaXQoZmlscCwgJnNmcC0+cmVhZF93YWl0LCB3YWl0KTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJZm9yIChzcnAgPSBzZnAtPmhlYWRycDsgc3JwOyBzcnAgPSBzcnAtPm5leHRycCkgeworCQkvKiBpZiBhbnkgcmVhZCB3YWl0aW5nLCBmbGFnIGl0ICovCisJCWlmICgoMCA9PSByZXMpICYmICgxID09IHNycC0+ZG9uZSkgJiYgKCFzcnAtPnNnX2lvX293bmVkKSkKKwkJCXJlcyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCSsrY291bnQ7CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCisJaWYgKHNkcC0+ZGV0YWNoZWQpCisJCXJlcyB8PSBQT0xMSFVQOworCWVsc2UgaWYgKCFzZnAtPmNtZF9xKSB7CisJCWlmICgwID09IGNvdW50KQorCQkJcmVzIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0gZWxzZSBpZiAoY291bnQgPCBTR19NQVhfUVVFVUUpCisJCXJlcyB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfcG9sbDogJXMsIHJlcz0weCV4XG4iLAorCQkJCSAgIHNkcC0+ZGlzay0+ZGlza19uYW1lLCAoaW50KSByZXMpKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitzZ19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG1vZGUpCit7CisJaW50IHJldHZhbDsKKwlTZ19kZXZpY2UgKnNkcDsKKwlTZ19mZCAqc2ZwOworCisJaWYgKCghKHNmcCA9IChTZ19mZCAqKSBmaWxwLT5wcml2YXRlX2RhdGEpKSB8fCAoIShzZHAgPSBzZnAtPnBhcmVudGRwKSkpCisJCXJldHVybiAtRU5YSU87CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX2Zhc3luYzogJXMsIG1vZGU9JWRcbiIsCisJCQkJICAgc2RwLT5kaXNrLT5kaXNrX25hbWUsIG1vZGUpKTsKKworCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG1vZGUsICZzZnAtPmFzeW5jX3FwKTsKKwlyZXR1cm4gKHJldHZhbCA8IDApID8gcmV0dmFsIDogMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICoKK3NnX3NjYXRnMnZpcnQoY29uc3Qgc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwKQoreworCXJldHVybiAoc2NscCAmJiBzY2xwLT5wYWdlKSA/CisJICAgICh1bnNpZ25lZCBjaGFyICopIHBhZ2VfYWRkcmVzcyhzY2xwLT5wYWdlKSArIHNjbHAtPm9mZnNldCA6IE5VTEw7Cit9CisKKy8qIFdoZW4gc3RhcnRGaW5pc2g9PTEgaW5jcmVtZW50cyBwYWdlIGNvdW50cyBmb3IgcGFnZXMgb3RoZXIgdGhhbiB0aGUgCisgICBmaXJzdCBvZiBzY2F0dGVyIGdhdGhlciBlbGVtZW50cyBvYnRhaW5lZCBmcm9tIF9fZ2V0X2ZyZWVfcGFnZXMoKS4KKyAgIFdoZW4gc3RhcnRGaW5pc2g9PTAgZGVjcmVtZW50cyAuLi4gKi8KK3N0YXRpYyB2b2lkCitzZ19yYl9jb3JyZWN0NG1tYXAoU2dfc2NhdHRlcl9ob2xkICogcnN2X3NjaHAsIGludCBzdGFydEZpbmlzaCkKK3sKKwl2b2lkICpwYWdlX3B0cjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaywgbTsKKworCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19yYl9jb3JyZWN0NG1tYXA6IHN0YXJ0RmluaXNoPSVkLCBzY2F0Zz0lZFxuIiwgCisJCQkJICAgc3RhcnRGaW5pc2gsIHJzdl9zY2hwLT5rX3VzZV9zZykpOworCS8qIE4uQi4gY29ycmVjdGlvbiBfbm90XyBhcHBsaWVkIHRvIGJhc2UgcGFnZSBvZiBlYWNoIGFsbG9jYXRpb24gKi8KKwlpZiAocnN2X3NjaHAtPmtfdXNlX3NnKSB7CS8qIHJlc2VydmUgYnVmZmVyIGlzIGEgc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbHAgPSByc3Zfc2NocC0+YnVmZmVyOworCisJCWZvciAoayA9IDA7IGsgPCByc3Zfc2NocC0+a191c2Vfc2c7ICsraywgKytzY2xwKSB7CisJCQlmb3IgKG0gPSBQQUdFX1NJWkU7IG0gPCBzY2xwLT5sZW5ndGg7IG0gKz0gUEFHRV9TSVpFKSB7CisJCQkJcGFnZV9wdHIgPSBzZ19zY2F0ZzJ2aXJ0KHNjbHApICsgbTsKKwkJCQlwYWdlID0gdmlydF90b19wYWdlKHBhZ2VfcHRyKTsKKwkJCQlpZiAoc3RhcnRGaW5pc2gpCisJCQkJCWdldF9wYWdlKHBhZ2UpOworCQkJCWVsc2UgeworCQkJCQlpZiAocGFnZV9jb3VudChwYWdlKSA+IDApCisJCQkJCQlfX3B1dF9wYWdlKHBhZ2UpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CQkvKiByZXNlcnZlIGJ1ZmZlciBpcyBqdXN0IGEgc2luZ2xlIGFsbG9jYXRpb24gKi8KKwkJZm9yIChtID0gUEFHRV9TSVpFOyBtIDwgcnN2X3NjaHAtPmJ1ZmZsZW47IG0gKz0gUEFHRV9TSVpFKSB7CisJCQlwYWdlX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopIHJzdl9zY2hwLT5idWZmZXIgKyBtOworCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShwYWdlX3B0cik7CisJCQlpZiAoc3RhcnRGaW5pc2gpCisJCQkJZ2V0X3BhZ2UocGFnZSk7CisJCQllbHNlIHsKKwkJCQlpZiAocGFnZV9jb3VudChwYWdlKSA+IDApCisJCQkJCV9fcHV0X3BhZ2UocGFnZSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqCitzZ192bWFfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCAqdHlwZSkKK3sKKwlTZ19mZCAqc2ZwOworCXN0cnVjdCBwYWdlICpwYWdlID0gTk9QQUdFX1NJR0JVUzsKKwl2b2lkICpwYWdlX3B0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJU2dfc2NhdHRlcl9ob2xkICpyc3Zfc2NocDsKKworCWlmICgoTlVMTCA9PSB2bWEpIHx8ICghKHNmcCA9IChTZ19mZCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YSkpKQorCQlyZXR1cm4gcGFnZTsKKwlyc3Zfc2NocCA9ICZzZnAtPnJlc2VydmU7CisJb2Zmc2V0ID0gYWRkciAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKG9mZnNldCA+PSByc3Zfc2NocC0+YnVmZmxlbikKKwkJcmV0dXJuIHBhZ2U7CisJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3ZtYV9ub3BhZ2U6IG9mZnNldD0lbHUsIHNjYXRnPSVkXG4iLAorCQkJCSAgIG9mZnNldCwgcnN2X3NjaHAtPmtfdXNlX3NnKSk7CisJaWYgKHJzdl9zY2hwLT5rX3VzZV9zZykgewkvKiByZXNlcnZlIGJ1ZmZlciBpcyBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKwkJaW50IGs7CisJCXVuc2lnbmVkIGxvbmcgc2EgPSB2bWEtPnZtX3N0YXJ0OworCQl1bnNpZ25lZCBsb25nIGxlbjsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwID0gcnN2X3NjaHAtPmJ1ZmZlcjsKKworCQlmb3IgKGsgPSAwOyAoayA8IHJzdl9zY2hwLT5rX3VzZV9zZykgJiYgKHNhIDwgdm1hLT52bV9lbmQpOworCQkgICAgICsraywgKytzY2xwKSB7CisJCQlsZW4gPSB2bWEtPnZtX2VuZCAtIHNhOworCQkJbGVuID0gKGxlbiA8IHNjbHAtPmxlbmd0aCkgPyBsZW4gOiBzY2xwLT5sZW5ndGg7CisJCQlpZiAob2Zmc2V0IDwgbGVuKSB7CisJCQkJcGFnZV9wdHIgPSBzZ19zY2F0ZzJ2aXJ0KHNjbHApICsgb2Zmc2V0OworCQkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGFnZV9wdHIpOworCQkJCWdldF9wYWdlKHBhZ2UpOwkvKiBpbmNyZW1lbnQgcGFnZSBjb3VudCAqLworCQkJCWJyZWFrOworCQkJfQorCQkJc2EgKz0gbGVuOworCQkJb2Zmc2V0IC09IGxlbjsKKwkJfQorCX0gZWxzZSB7CQkvKiByZXNlcnZlIGJ1ZmZlciBpcyBqdXN0IGEgc2luZ2xlIGFsbG9jYXRpb24gKi8KKwkJcGFnZV9wdHIgPSAodW5zaWduZWQgY2hhciAqKSByc3Zfc2NocC0+YnVmZmVyICsgb2Zmc2V0OworCQlwYWdlID0gdmlydF90b19wYWdlKHBhZ2VfcHRyKTsKKwkJZ2V0X3BhZ2UocGFnZSk7CS8qIGluY3JlbWVudCBwYWdlIGNvdW50ICovCisJfQorCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBwYWdlOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNnX21tYXBfdm1fb3BzID0geworCS5ub3BhZ2UgPSBzZ192bWFfbm9wYWdlLAorfTsKKworc3RhdGljIGludAorc2dfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJU2dfZmQgKnNmcDsKKwl1bnNpZ25lZCBsb25nIHJlcV9zeiA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlTZ19zY2F0dGVyX2hvbGQgKnJzdl9zY2hwOworCisJaWYgKCghZmlscCkgfHwgKCF2bWEpIHx8ICghKHNmcCA9IChTZ19mZCAqKSBmaWxwLT5wcml2YXRlX2RhdGEpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfbW1hcCBzdGFydGluZywgdm1fc3RhcnQ9JXAsIGxlbj0lZFxuIiwKKwkJCQkgICAodm9pZCAqKSB2bWEtPnZtX3N0YXJ0LCAoaW50KSByZXFfc3opKTsKKwlpZiAodm1hLT52bV9wZ29mZikKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIHdhbnQgbm8gb2Zmc2V0ICovCisJcnN2X3NjaHAgPSAmc2ZwLT5yZXNlcnZlOworCWlmIChyZXFfc3ogPiByc3Zfc2NocC0+YnVmZmxlbikKKwkJcmV0dXJuIC1FTk9NRU07CS8qIGNhbm5vdCBtYXAgbW9yZSB0aGFuIHJlc2VydmVkIGJ1ZmZlciAqLworCisJaWYgKHJzdl9zY2hwLT5rX3VzZV9zZykgeyAvKiByZXNlcnZlIGJ1ZmZlciBpcyBhIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKwkJaW50IGs7CisJCXVuc2lnbmVkIGxvbmcgc2EgPSB2bWEtPnZtX3N0YXJ0OworCQl1bnNpZ25lZCBsb25nIGxlbjsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwID0gcnN2X3NjaHAtPmJ1ZmZlcjsKKworCQlmb3IgKGsgPSAwOyAoayA8IHJzdl9zY2hwLT5rX3VzZV9zZykgJiYgKHNhIDwgdm1hLT52bV9lbmQpOworCQkgICAgICsraywgKytzY2xwKSB7CisJCQlpZiAoMCAhPSBzY2xwLT5vZmZzZXQpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CS8qIG5vbiBwYWdlIGFsaWduZWQgbWVtb3J5ID8/ICovCisJCQlsZW4gPSB2bWEtPnZtX2VuZCAtIHNhOworCQkJbGVuID0gKGxlbiA8IHNjbHAtPmxlbmd0aCkgPyBsZW4gOiBzY2xwLT5sZW5ndGg7CisJCQlzYSArPSBsZW47CisJCX0KKwl9IGVsc2UgewkvKiByZXNlcnZlIGJ1ZmZlciBpcyBqdXN0IGEgc2luZ2xlIGFsbG9jYXRpb24gKi8KKwkJaWYgKCh1bnNpZ25lZCBsb25nKSByc3Zfc2NocC0+YnVmZmVyICYgKFBBR0VfU0laRSAtIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CS8qIG5vbiBwYWdlIGFsaWduZWQgbWVtb3J5ID8/ICovCisJfQorCWlmICgwID09IHNmcC0+bW1hcF9jYWxsZWQpIHsKKwkJc2dfcmJfY29ycmVjdDRtbWFwKHJzdl9zY2hwLCAxKTsJLyogZG8gb25seSBvbmNlIHBlciBmZCBsaWZldGltZSAqLworCQlzZnAtPm1tYXBfY2FsbGVkID0gMTsKKwl9CisJdm1hLT52bV9mbGFncyB8PSAoVk1fUkVTRVJWRUQgfCBWTV9JTyk7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBzZnA7CisJdm1hLT52bV9vcHMgPSAmc2dfbW1hcF92bV9vcHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgYSAiYm90dG9tIGhhbGYiIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgYnkgdGhlCisgKiBtaWQgbGV2ZWwgd2hlbiBhIGNvbW1hbmQgaXMgY29tcGxldGVkIChvciBoYXMgZmFpbGVkKS4gKi8KK3N0YXRpYyB2b2lkCitzZ19jbWRfZG9uZShTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlTY3NpX1JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlTZ19kZXZpY2UgKnNkcCA9IE5VTEw7CisJU2dfZmQgKnNmcDsKKwlTZ19yZXF1ZXN0ICpzcnAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJaWYgKFNDcG50ICYmIChTUnBudCA9IFNDcG50LT5zY19yZXF1ZXN0KSkKKwkJc3JwID0gKFNnX3JlcXVlc3QgKikgU1JwbnQtPnVwcGVyX3ByaXZhdGVfZGF0YTsKKwlpZiAoTlVMTCA9PSBzcnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZ19jbWRfZG9uZTogTlVMTCByZXF1ZXN0XG4iKTsKKwkJaWYgKFNScG50KQorCQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlyZXR1cm47CisJfQorCXNmcCA9IHNycC0+cGFyZW50ZnA7CisJaWYgKHNmcCkKKwkJc2RwID0gc2ZwLT5wYXJlbnRkcDsKKwlpZiAoKE5VTEwgPT0gc2RwKSB8fCBzZHAtPmRldGFjaGVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNnX2NtZF9kb25lOiBkZXZpY2UgZGV0YWNoZWRcbiIpOworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJzdCB0cmFuc2ZlciBvd25lcnNoaXAgb2YgZGF0YSBidWZmZXJzIHRvIHNnX2RldmljZSBvYmplY3QuICovCisJc3JwLT5kYXRhLmtfdXNlX3NnID0gU1JwbnQtPnNyX3VzZV9zZzsKKwlzcnAtPmRhdGEuc2dsaXN0X2xlbiA9IFNScG50LT5zcl9zZ2xpc3RfbGVuOworCXNycC0+ZGF0YS5idWZmbGVuID0gU1JwbnQtPnNyX2J1ZmZsZW47CisJc3JwLT5kYXRhLmJ1ZmZlciA9IFNScG50LT5zcl9idWZmZXI7CisJLyogbm93IGNsZWFyIG91dCByZXF1ZXN0IHN0cnVjdHVyZSAqLworCVNScG50LT5zcl91c2Vfc2cgPSAwOworCVNScG50LT5zcl9zZ2xpc3RfbGVuID0gMDsKKwlTUnBudC0+c3JfYnVmZmxlbiA9IDA7CisJU1JwbnQtPnNyX2J1ZmZlciA9IE5VTEw7CisJU1JwbnQtPnNyX3VuZGVyZmxvdyA9IDA7CisJU1JwbnQtPnNyX3JlcXVlc3QtPnJxX2Rpc2sgPSBOVUxMOyAvKiAic2ciIF9kaXNvd25zXyByZXF1ZXN0IGJsayAqLworCisJc3JwLT5teV9jbWRwID0gTlVMTDsKKworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19jbWRfZG9uZTogJXMsIHBhY2tfaWQ9JWQsIHJlcz0weCV4XG4iLAorCQlzZHAtPmRpc2stPmRpc2tfbmFtZSwgc3JwLT5oZWFkZXIucGFja19pZCwgKGludCkgU1JwbnQtPnNyX3Jlc3VsdCkpOworCXNycC0+aGVhZGVyLnJlc2lkID0gU0NwbnQtPnJlc2lkOworCS8qIE4uQi4gdW5pdCBvZiBkdXJhdGlvbiBjaGFuZ2VzIGhlcmUgZnJvbSBqaWZmaWVzIHRvIG1pbGxpc2VjcyAqLworCXNycC0+aGVhZGVyLmR1cmF0aW9uID0KKwkgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3JwLT5oZWFkZXIuZHVyYXRpb24pOworCWlmICgwICE9IFNScG50LT5zcl9yZXN1bHQpIHsKKwkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCisJCW1lbWNweShzcnAtPnNlbnNlX2IsIFNScG50LT5zcl9zZW5zZV9idWZmZXIsCisJCSAgICAgICBzaXplb2YgKHNycC0+c2Vuc2VfYikpOworCQlzcnAtPmhlYWRlci5zdGF0dXMgPSAweGZmICYgU1JwbnQtPnNyX3Jlc3VsdDsKKwkJc3JwLT5oZWFkZXIubWFza2VkX3N0YXR1cyA9IHN0YXR1c19ieXRlKFNScG50LT5zcl9yZXN1bHQpOworCQlzcnAtPmhlYWRlci5tc2dfc3RhdHVzID0gbXNnX2J5dGUoU1JwbnQtPnNyX3Jlc3VsdCk7CisJCXNycC0+aGVhZGVyLmhvc3Rfc3RhdHVzID0gaG9zdF9ieXRlKFNScG50LT5zcl9yZXN1bHQpOworCQlzcnAtPmhlYWRlci5kcml2ZXJfc3RhdHVzID0gZHJpdmVyX2J5dGUoU1JwbnQtPnNyX3Jlc3VsdCk7CisJCWlmICgoc2RwLT5zZ2RlYnVnID4gMCkgJiYKKwkJICAgICgoQ0hFQ0tfQ09ORElUSU9OID09IHNycC0+aGVhZGVyLm1hc2tlZF9zdGF0dXMpIHx8CisJCSAgICAgKENPTU1BTkRfVEVSTUlOQVRFRCA9PSBzcnAtPmhlYWRlci5tYXNrZWRfc3RhdHVzKSkpCisJCQlwcmludF9yZXFfc2Vuc2UoInNnX2NtZF9kb25lIiwgU1JwbnQpOworCisJCS8qIEZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgaXMgYSBwYXRjaCBzdXBwbGllZCBieSBFcmljIFlvdW5nZGFsZSAqLworCQlpZiAoZHJpdmVyX2J5dGUoU1JwbnQtPnNyX3Jlc3VsdCkgIT0gMAorCQkgICAgJiYgc2NzaV9jb21tYW5kX25vcm1hbGl6ZV9zZW5zZShTQ3BudCwgJnNzaGRyKQorCQkgICAgJiYgIXNjc2lfc2Vuc2VfaXNfZGVmZXJyZWQoJnNzaGRyKQorCQkgICAgJiYgc3NoZHIuc2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OCisJCSAgICAmJiBzZHAtPmRldmljZS0+cmVtb3ZhYmxlKSB7CisJCQkvKiBEZXRlY3RlZCBwb3NzaWJsZSBkaXNjIGNoYW5nZS4gU2V0IHRoZSBiaXQgLSB0aGlzICovCisJCQkvKiBtYXkgYmUgdXNlZCBpZiB0aGVyZSBhcmUgZmlsZXN5c3RlbXMgdXNpbmcgdGhpcyBkZXZpY2UgKi8KKwkJCXNkcC0+ZGV2aWNlLT5jaGFuZ2VkID0gMTsKKwkJfQorCX0KKwkvKiBSZWx5IG9uIHdyaXRlIHBoYXNlIHRvIGNsZWFuIG91dCBzcnAgc3RhdHVzIHZhbHVlcywgc28gbm8gImVsc2UiICovCisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJU1JwbnQgPSBOVUxMOworCWlmIChzZnAtPmNsb3NlZCkgewkvKiB3aG9vcHMgdGhpcyBmZCBhbHJlYWR5IHJlbGVhc2VkLCBjbGVhbnVwICovCisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19jbWRfZG9uZTogYWxyZWFkeSBjbG9zZWQsIGZyZWVpbmcgLi4uXG4iKSk7CisJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCXNycCA9IE5VTEw7CisJCWlmIChOVUxMID09IHNmcC0+aGVhZHJwKSB7CisJCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2cuLi5iaDogYWxyZWFkeSBjbG9zZWQsIGZpbmFsIGNsZWFudXBcbiIpKTsKKwkJCWlmICgwID09IHNnX3JlbW92ZV9zZnAoc2RwLCBzZnApKSB7CS8qIGRldmljZSBzdGlsbCBwcmVzZW50ICovCisJCQkJc2NzaV9kZXZpY2VfcHV0KHNkcC0+ZGV2aWNlKTsKKwkJCX0KKwkJCXNmcCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKHNycCAmJiBzcnAtPm9ycGhhbikgeworCQlpZiAoc2ZwLT5rZWVwX29ycGhhbikKKwkJCXNycC0+c2dfaW9fb3duZWQgPSAwOworCQllbHNlIHsKKwkJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCQlzcnAgPSBOVUxMOworCQl9CisJfQorCWlmIChzZnAgJiYgc3JwKSB7CisJCS8qIE5vdyB3YWtlIHVwIGFueSBzZ19yZWFkKCkgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGlzIHBhY2tldC4gKi8KKwkJa2lsbF9mYXN5bmMoJnNmcC0+YXN5bmNfcXAsIFNJR1BPTEwsIFBPTExfSU4pOworCQl3cml0ZV9sb2NrX2lycXNhdmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCQlzcnAtPmRvbmUgPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNmcC0+cmVhZF93YWl0KTsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2dfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHNnX3JlYWQsCisJLndyaXRlID0gc2dfd3JpdGUsCisJLnBvbGwgPSBzZ19wb2xsLAorCS5pb2N0bCA9IHNnX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gc2dfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLm9wZW4gPSBzZ19vcGVuLAorCS5tbWFwID0gc2dfbW1hcCwKKwkucmVsZWFzZSA9IHNnX3JlbGVhc2UsCisJLmZhc3luYyA9IHNnX2Zhc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICogc2dfc3lzZnNfY2xhc3M7CisKK3N0YXRpYyBpbnQgc2dfc3lzZnNfdmFsaWQgPSAwOworCitzdGF0aWMgaW50IHNnX2FsbG9jKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkcCkKK3sKKwlTZ19kZXZpY2UgKnNkcDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwl2b2lkICpvbGRfc2dfZGV2X2FyciA9IE5VTEw7CisJaW50IGssIGVycm9yOworCisJc2RwID0ga21hbGxvYyhzaXplb2YoU2dfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZHApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAia21hbGxvYyBTZ19kZXZpY2UgZmFpbHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCWlmICh1bmxpa2VseShzZ19ucl9kZXYgPj0gc2dfZGV2X21heCkpIHsJLyogdHJ5IHRvIHJlc2l6ZSAqLworCQlTZ19kZXZpY2UgKip0bXBfZGE7CisJCWludCB0bXBfZGV2X21heCA9IHNnX25yX2RldiArIFNHX0RFVl9BUlJfTFVNUDsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKworCQl0bXBfZGEgPSBrbWFsbG9jKHRtcF9kZXZfbWF4ICogc2l6ZW9mKFNnX2RldmljZSAqKSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseSghdG1wX2RhKSkKKwkJCWdvdG8gZXhwYW5kX2ZhaWxlZDsKKworCQl3cml0ZV9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwkJbWVtc2V0KHRtcF9kYSwgMCwgdG1wX2Rldl9tYXggKiBzaXplb2YoU2dfZGV2aWNlICopKTsKKwkJbWVtY3B5KHRtcF9kYSwgc2dfZGV2X2Fyciwgc2dfZGV2X21heCAqIHNpemVvZihTZ19kZXZpY2UgKikpOworCQlvbGRfc2dfZGV2X2FyciA9IHNnX2Rldl9hcnI7CisJCXNnX2Rldl9hcnIgPSB0bXBfZGE7CisJCXNnX2Rldl9tYXggPSB0bXBfZGV2X21heDsKKwl9CisKKwlmb3IgKGsgPSAwOyBrIDwgc2dfZGV2X21heDsgaysrKQorCQlpZiAoIXNnX2Rldl9hcnJba10pCisJCQlicmVhazsKKwlpZiAodW5saWtlbHkoayA+PSBTR19NQVhfREVWUykpCisJCWdvdG8gb3ZlcmZsb3c7CisKKwltZW1zZXQoc2RwLCAwLCBzaXplb2YoKnNkcCkpOworCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19hbGxvYzogZGV2PSVkIFxuIiwgaykpOworCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAic2clZCIsIGspOworCWRpc2stPmZpcnN0X21pbm9yID0gazsKKwlzZHAtPmRpc2sgPSBkaXNrOworCXNkcC0+ZGV2aWNlID0gc2NzaWRwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkcC0+b19leGNsX3dhaXQpOworCXNkcC0+c2dfdGFibGVzaXplID0gc2NzaWRwLT5ob3N0ID8gc2NzaWRwLT5ob3N0LT5zZ190YWJsZXNpemUgOiAwOworCisJc2dfbnJfZGV2Kys7CisJc2dfZGV2X2FycltrXSA9IHNkcDsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCWVycm9yID0gazsKKworIG91dDoKKwlpZiAoZXJyb3IgPCAwKQorCQlrZnJlZShzZHApOworCWtmcmVlKG9sZF9zZ19kZXZfYXJyKTsKKwlyZXR1cm4gZXJyb3I7CisKKyBleHBhbmRfZmFpbGVkOgorCXByaW50ayhLRVJOX1dBUk5JTkcgInNnX2FsbG9jOiBkZXZpY2UgYXJyYXkgY2Fubm90IGJlIHJlc2l6ZWRcbiIpOworCWVycm9yID0gLUVOT01FTTsKKwlnb3RvIG91dDsKKworIG92ZXJmbG93OgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiVW5hYmxlIHRvIGF0dGFjaCBzZyBkZXZpY2UgPCVkLCAlZCwgJWQsICVkPiB0eXBlPSVkLCBtaW5vciAiCisJICAgICAgICJudW1iZXIgZXhjZWVkcyAlZFxuIiwgc2NzaWRwLT5ob3N0LT5ob3N0X25vLCBzY3NpZHAtPmNoYW5uZWwsCisJICAgICAgIHNjc2lkcC0+aWQsIHNjc2lkcC0+bHVuLCBzY3NpZHAtPnR5cGUsIFNHX01BWF9ERVZTIC0gMSk7CisJZXJyb3IgPSAtRU5PREVWOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50CitzZ19hZGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2xfZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRwID0gdG9fc2NzaV9kZXZpY2UoY2xfZGV2LT5kZXYpOworCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCVNnX2RldmljZSAqc2RwID0gTlVMTDsKKwlzdHJ1Y3QgY2RldiAqIGNkZXYgPSBOVUxMOworCWludCBlcnJvciwgazsKKworCWRpc2sgPSBhbGxvY19kaXNrKDEpOworCWlmICghZGlzaykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGxvY19kaXNrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkaXNrLT5tYWpvciA9IFNDU0lfR0VORVJJQ19NQUpPUjsKKworCWVycm9yID0gLUVOT01FTTsKKwljZGV2ID0gY2Rldl9hbGxvYygpOworCWlmICghY2RldikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjZGV2X2FsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwljZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworCWNkZXYtPm9wcyA9ICZzZ19mb3BzOworCisJZXJyb3IgPSBzZ19hbGxvYyhkaXNrLCBzY3NpZHApOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2dfYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWsgPSBlcnJvcjsKKwlzZHAgPSBzZ19kZXZfYXJyW2tdOworCisJZGV2ZnNfbWtfY2RldihNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIGspLAorCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCwKKwkJCSIlcy9nZW5lcmljIiwgc2NzaWRwLT5kZXZmc19uYW1lKTsKKwllcnJvciA9IGNkZXZfYWRkKGNkZXYsIE1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwgayksIDEpOworCWlmIChlcnJvcikgeworCQlkZXZmc19yZW1vdmUoIiVzL2dlbmVyaWMiLCBzY3NpZHAtPmRldmZzX25hbWUpOworCQlnb3RvIG91dDsKKwl9CisJc2RwLT5jZGV2ID0gY2RldjsKKwlpZiAoc2dfc3lzZnNfdmFsaWQpIHsKKwkJc3RydWN0IGNsYXNzX2RldmljZSAqIHNnX2NsYXNzX21lbWJlcjsKKworCQlzZ19jbGFzc19tZW1iZXIgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChzZ19zeXNmc19jbGFzcywgCisJCQkJTUtERVYoU0NTSV9HRU5FUklDX01BSk9SLCBrKSwgCisJCQkJY2xfZGV2LT5kZXYsICIlcyIsIAorCQkJCWRpc2stPmRpc2tfbmFtZSk7CisJCWlmIChJU19FUlIoc2dfY2xhc3NfbWVtYmVyKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNnX2FkZDogIgorCQkJCSJjbGFzc19zaW1wbGVfZGV2aWNlX2FkZCBmYWlsZWRcbiIpOworCQljbGFzc19zZXRfZGV2ZGF0YShzZ19jbGFzc19tZW1iZXIsIHNkcCk7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJnNjc2lkcC0+c2Rldl9nZW5kZXYua29iaiwgCisJCQkJCSAgJnNnX2NsYXNzX21lbWJlci0+a29iaiwgImdlbmVyaWMiKTsKKwkJaWYgKGVycm9yKQorCQkJcHJpbnRrKEtFUk5fRVJSICJzZ19hZGQ6IHVuYWJsZSB0byBtYWtlIHN5bWxpbmsgIgorCQkJCQkiJ2dlbmVyaWMnIGJhY2sgdG8gc2clZFxuIiwgayk7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNnX2FkZDogc2dfc3lzIElOdmFsaWRcbiIpOworCisJcHJpbnRrKEtFUk5fTk9USUNFCisJICAgICAgICJBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2clZCBhdCBzY3NpJWQsIGNoYW5uZWwiCisJICAgICAgICIgJWQsIGlkICVkLCBsdW4gJWQsICB0eXBlICVkXG4iLCBrLAorCSAgICAgICBzY3NpZHAtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkcC0+Y2hhbm5lbCwgc2NzaWRwLT5pZCwKKwkgICAgICAgc2NzaWRwLT5sdW4sIHNjc2lkcC0+dHlwZSk7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCXB1dF9kaXNrKGRpc2spOworCWlmIChjZGV2KQorCQljZGV2X2RlbChjZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCitzZ19yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xfZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRwID0gdG9fc2NzaV9kZXZpY2UoY2xfZGV2LT5kZXYpOworCVNnX2RldmljZSAqc2RwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlTZ19mZCAqc2ZwOworCVNnX2ZkICp0c2ZwOworCVNnX3JlcXVlc3QgKnNycDsKKwlTZ19yZXF1ZXN0ICp0c3JwOworCWludCBrLCBkZWxheTsKKworCWlmIChOVUxMID09IHNnX2Rldl9hcnIpCisJCXJldHVybjsKKwlkZWxheSA9IDA7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZzZ19kZXZfYXJyX2xvY2ssIGlmbGFncyk7CisJZm9yIChrID0gMDsgayA8IHNnX2Rldl9tYXg7IGsrKykgeworCQlzZHAgPSBzZ19kZXZfYXJyW2tdOworCQlpZiAoKE5VTEwgPT0gc2RwKSB8fCAoc2RwLT5kZXZpY2UgIT0gc2NzaWRwKSkKKwkJCWNvbnRpbnVlOwkvKiBkaXJ0eSBidXQgbG93ZXJzIG5lc3RpbmcgKi8KKwkJaWYgKHNkcC0+aGVhZGZwKSB7CisJCQlzZHAtPmRldGFjaGVkID0gMTsKKwkJCWZvciAoc2ZwID0gc2RwLT5oZWFkZnA7IHNmcDsgc2ZwID0gdHNmcCkgeworCQkJCXRzZnAgPSBzZnAtPm5leHRmcDsKKwkJCQlmb3IgKHNycCA9IHNmcC0+aGVhZHJwOyBzcnA7IHNycCA9IHRzcnApIHsKKwkJCQkJdHNycCA9IHNycC0+bmV4dHJwOworCQkJCQlpZiAoc2ZwLT5jbG9zZWQgfHwgKDAgPT0gc2dfc3JwX2RvbmUoc3JwLCBzZnApKSkKKwkJCQkJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCQkJfQorCQkJCWlmIChzZnAtPmNsb3NlZCkgeworCQkJCQlzY3NpX2RldmljZV9wdXQoc2RwLT5kZXZpY2UpOworCQkJCQlfX3NnX3JlbW92ZV9zZnAoc2RwLCBzZnApOworCQkJCX0gZWxzZSB7CisJCQkJCWRlbGF5ID0gMTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZnAtPnJlYWRfd2FpdCk7CisJCQkJCWtpbGxfZmFzeW5jKCZzZnAtPmFzeW5jX3FwLCBTSUdQT0xMLAorCQkJCQkJICAgIFBPTExfSFVQKTsKKwkJCQl9CisJCQl9CisJCQlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfZGV0YWNoOiBkZXY9JWQsIGRpcnR5XG4iLCBrKSk7CisJCQlpZiAoTlVMTCA9PSBzZHAtPmhlYWRmcCkgeworCQkJCXNnX2Rldl9hcnJba10gPSBOVUxMOworCQkJfQorCQl9IGVsc2UgewkvKiBub3RoaW5nIGFjdGl2ZSwgc2ltcGxlIGNhc2UgKi8KKwkJCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19kZXRhY2g6IGRldj0lZFxuIiwgaykpOworCQkJc2dfZGV2X2FycltrXSA9IE5VTEw7CisJCX0KKwkJc2dfbnJfZGV2LS07CisJCWJyZWFrOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCisJaWYgKHNkcCkgeworCQlzeXNmc19yZW1vdmVfbGluaygmc2NzaWRwLT5zZGV2X2dlbmRldi5rb2JqLCAiZ2VuZXJpYyIpOworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIGspKTsKKwkJY2Rldl9kZWwoc2RwLT5jZGV2KTsKKwkJc2RwLT5jZGV2ID0gTlVMTDsKKwkJZGV2ZnNfcmVtb3ZlKCIlcy9nZW5lcmljIiwgc2NzaWRwLT5kZXZmc19uYW1lKTsKKwkJcHV0X2Rpc2soc2RwLT5kaXNrKTsKKwkJc2RwLT5kaXNrID0gTlVMTDsKKwkJaWYgKE5VTEwgPT0gc2RwLT5oZWFkZnApCisJCQlrZnJlZSgoY2hhciAqKSBzZHApOworCX0KKworCWlmIChkZWxheSkKKwkJbXNsZWVwKDEwKTsJLyogZGlydHkgZGV0YWNoIHNvIGRlbGF5IGRldmljZSBkZXN0cnVjdGlvbiAqLworfQorCisvKiBTZXQgJ3Blcm0nICg0dGggYXJndW1lbnQpIHRvIDAgdG8gZGlzYWJsZSBtb2R1bGVfcGFyYW0ncyBkZWZpbml0aW9uCisgKiBvZiBzeXNmcyBwYXJhbWV0ZXJzICh3aGljaCBtb2R1bGVfcGFyYW0gZG9lc24ndCB5ZXQgc3VwcG9ydCkuCisgKiBTeXNmcyBwYXJhbWV0ZXJzIGRlZmluZWQgZXhwbGljaXRseSBiZWxvdy4KKyAqLworbW9kdWxlX3BhcmFtX25hbWVkKGRlZl9yZXNlcnZlZF9zaXplLCBkZWZfcmVzZXJ2ZWRfc2l6ZSwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9uYW1lZChhbGxvd19kaW8sIHNnX2FsbG93X2RpbywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKK01PRFVMRV9BVVRIT1IoIkRvdWdsYXMgR2lsYmVydCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIGdlbmVyaWMgKHNnKSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFNHX1ZFUlNJT05fU1RSKTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWZfcmVzZXJ2ZWRfc2l6ZSwgInNpemUgb2YgYnVmZmVyIHJlc2VydmVkIGZvciBlYWNoIGZkIik7CitNT0RVTEVfUEFSTV9ERVNDKGFsbG93X2RpbywgImFsbG93IGRpcmVjdCBJL08gKGRlZmF1bHQ6IDAgKGRpc2FsbG93KSkiKTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfc2codm9pZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoZGVmX3Jlc2VydmVkX3NpemUgPj0gMCkKKwkJc2dfYmlnX2J1ZmYgPSBkZWZfcmVzZXJ2ZWRfc2l6ZTsKKworCXJjID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIDApLCAKKwkJCQkgICAgU0dfTUFYX0RFVlMsICJzZyIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworICAgICAgICBzZ19zeXNmc19jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJzY3NpX2dlbmVyaWMiKTsKKyAgICAgICAgaWYgKCBJU19FUlIoc2dfc3lzZnNfY2xhc3MpICkgeworCQlyYyA9IFBUUl9FUlIoc2dfc3lzZnNfY2xhc3MpOworCQlnb3RvIGVycl9vdXQ7CisgICAgICAgIH0KKwlzZ19zeXNmc192YWxpZCA9IDE7CisJcmMgPSBzY3NpX3JlZ2lzdGVyX2ludGVyZmFjZSgmc2dfaW50ZXJmYWNlKTsKKwlpZiAoMCA9PSByYykgeworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKwkJc2dfcHJvY19pbml0KCk7CisjZW5kaWYJCQkJLyogQ09ORklHX1NDU0lfUFJPQ19GUyAqLworCQlyZXR1cm4gMDsKKwl9CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koc2dfc3lzZnNfY2xhc3MpOworZXJyX291dDoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoU0NTSV9HRU5FUklDX01BSk9SLCAwKSwgU0dfTUFYX0RFVlMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X3NnKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworCXNnX3Byb2NfY2xlYW51cCgpOworI2VuZGlmCQkJCS8qIENPTkZJR19TQ1NJX1BST0NfRlMgKi8KKwlzY3NpX3VucmVnaXN0ZXJfaW50ZXJmYWNlKCZzZ19pbnRlcmZhY2UpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KHNnX3N5c2ZzX2NsYXNzKTsKKwlzZ19zeXNmc192YWxpZCA9IDA7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwgMCksCisJCQkJIFNHX01BWF9ERVZTKTsKKwlpZiAoc2dfZGV2X2FyciAhPSBOVUxMKSB7CisJCWtmcmVlKChjaGFyICopIHNnX2Rldl9hcnIpOworCQlzZ19kZXZfYXJyID0gTlVMTDsKKwl9CisJc2dfZGV2X21heCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3N0YXJ0X3JlcShTZ19yZXF1ZXN0ICogc3JwKQoreworCWludCByZXM7CisJU2dfZmQgKnNmcCA9IHNycC0+cGFyZW50ZnA7CisJc2dfaW9faGRyX3QgKmhwID0gJnNycC0+aGVhZGVyOworCWludCBkeGZlcl9sZW4gPSAoaW50KSBocC0+ZHhmZXJfbGVuOworCWludCBkeGZlcl9kaXIgPSBocC0+ZHhmZXJfZGlyZWN0aW9uOworCVNnX3NjYXR0ZXJfaG9sZCAqcmVxX3NjaHAgPSAmc3JwLT5kYXRhOworCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHAgPSAmc2ZwLT5yZXNlcnZlOworCisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX3N0YXJ0X3JlcTogZHhmZXJfbGVuPSVkXG4iLCBkeGZlcl9sZW4pKTsKKwlpZiAoKGR4ZmVyX2xlbiA8PSAwKSB8fCAoZHhmZXJfZGlyID09IFNHX0RYRkVSX05PTkUpKQorCQlyZXR1cm4gMDsKKwlpZiAoc2dfYWxsb3dfZGlvICYmIChocC0+ZmxhZ3MgJiBTR19GTEFHX0RJUkVDVF9JTykgJiYKKwkgICAgKGR4ZmVyX2RpciAhPSBTR19EWEZFUl9VTktOT1dOKSAmJiAoMCA9PSBocC0+aW92ZWNfY291bnQpICYmCisJICAgICghc2ZwLT5wYXJlbnRkcC0+ZGV2aWNlLT5ob3N0LT51bmNoZWNrZWRfaXNhX2RtYSkpIHsKKwkJcmVzID0gc2dfYnVpbGRfZGlyZWN0KHNycCwgc2ZwLCBkeGZlcl9sZW4pOworCQlpZiAocmVzIDw9IDApCS8qIC12ZSAtPiBlcnJvciwgMCAtPiBkb25lLCAxIC0+IHRyeSBpbmRpcmVjdCAqLworCQkJcmV0dXJuIHJlczsKKwl9CisJaWYgKCghc2dfcmVzX2luX3VzZShzZnApKSAmJiAoZHhmZXJfbGVuIDw9IHJzdl9zY2hwLT5idWZmbGVuKSkKKwkJc2dfbGlua19yZXNlcnZlKHNmcCwgc3JwLCBkeGZlcl9sZW4pOworCWVsc2UgeworCQlyZXMgPSBzZ19idWlsZF9pbmRpcmVjdChyZXFfc2NocCwgc2ZwLCBkeGZlcl9sZW4pOworCQlpZiAocmVzKSB7CisJCQlzZ19yZW1vdmVfc2NhdChyZXFfc2NocCk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2dfZmluaXNoX3JlbV9yZXEoU2dfcmVxdWVzdCAqIHNycCkKK3sKKwlTZ19mZCAqc2ZwID0gc3JwLT5wYXJlbnRmcDsKKwlTZ19zY2F0dGVyX2hvbGQgKnJlcV9zY2hwID0gJnNycC0+ZGF0YTsKKworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19maW5pc2hfcmVtX3JlcTogcmVzX3VzZWQ9JWRcbiIsIChpbnQpIHNycC0+cmVzX3VzZWQpKTsKKwlpZiAoc3JwLT5yZXNfdXNlZCkKKwkJc2dfdW5saW5rX3Jlc2VydmUoc2ZwLCBzcnApOworCWVsc2UKKwkJc2dfcmVtb3ZlX3NjYXQocmVxX3NjaHApOworCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKK30KKworc3RhdGljIGludAorc2dfYnVpbGRfc2dhdChTZ19zY2F0dGVyX2hvbGQgKiBzY2hwLCBjb25zdCBTZ19mZCAqIHNmcCwgaW50IHRhYmxlc2l6ZSkKK3sKKwlpbnQgcmV0X3N6OworCWludCBlbGVtX3N6ID0gc2l6ZW9mIChzdHJ1Y3Qgc2NhdHRlcmxpc3QpOworCWludCBzZ19idWZmbGVuID0gdGFibGVzaXplICogZWxlbV9zejsKKwlpbnQgbXhfc2NfZWxlbXMgPSB0YWJsZXNpemU7CisKKwlzY2hwLT5idWZmZXIgPSBzZ19wYWdlX21hbGxvYyhzZ19idWZmbGVuLCBzZnAtPmxvd19kbWEsICZyZXRfc3opOworCWlmICghc2NocC0+YnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwllbHNlIGlmIChyZXRfc3ogIT0gc2dfYnVmZmxlbikgeworCQlzZ19idWZmbGVuID0gcmV0X3N6OworCQlteF9zY19lbGVtcyA9IHNnX2J1ZmZsZW4gLyBlbGVtX3N6OworCX0KKwlzY2hwLT5zZ2xpc3RfbGVuID0gc2dfYnVmZmxlbjsKKwltZW1zZXQoc2NocC0+YnVmZmVyLCAwLCBzZ19idWZmbGVuKTsKKwlyZXR1cm4gbXhfc2NfZWxlbXM7CS8qIG51bWJlciBvZiBzY2F0X2dhdGggZWxlbWVudHMgYWxsb2NhdGVkICovCit9CisKKyNpZmRlZiBTR19BTExPV19ESU9fQ09ERQorLyogdnZ2dnZ2dnYgIGZvbGxvd2luZyBjb2RlIGJvcnJvd2VkIGZyb20gc3QgZHJpdmVyJ3MgZGlyZWN0IElPIHZ2dnZ2dnZ2diAqLworCS8qIGhvcGVmdWxseSB0aGlzIGdlbmVyaWMgY29kZSB3aWxsIG1vdmVkIHRvIGEgbGlicmFyeSAqLworCisvKiBQaW4gZG93biB1c2VyIHBhZ2VzIGFuZCBwdXQgdGhlbSBpbnRvIGEgc2NhdHRlciBnYXRoZXIgbGlzdC4gUmV0dXJucyA8PSAwIGlmCisgICAtIG1hcHBpbmcgb2YgYWxsIHBhZ2VzIG5vdCBzdWNjZXNzZnVsCisgICAtIGFueSBwYWdlIGlzIGFib3ZlIG1heF9wZm4KKyAgIChpLmUuLCBlaXRoZXIgY29tcGxldGVseSBzdWNjZXNzZnVsIG9yIGZhaWxzKQorKi8KK3N0YXRpYyBpbnQgCitzdF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG1heF9wYWdlcywgCisJICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHNpemVfdCBjb3VudCwgaW50IHJ3LAorCSAgICAgICAgICB1bnNpZ25lZCBsb25nIG1heF9wZm4pCit7CisJaW50IHJlcywgaSwgajsKKwl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKworCW5yX3BhZ2VzID0gKCh1YWRkciAmIH5QQUdFX01BU0spICsgY291bnQgKyB+UEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOworCisJLyogVXNlciBhdHRlbXB0ZWQgT3ZlcmZsb3chICovCisJaWYgKCh1YWRkciArIGNvdW50KSA8IHVhZGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRvbyBiaWcgKi8KKyAgICAgICAgaWYgKG5yX3BhZ2VzID4gbWF4X3BhZ2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEhtbT8gKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHBhZ2VzID0ga21hbGxvYyhtYXhfcGFnZXMgKiBzaXplb2YoKnBhZ2VzKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisgICAgICAgIC8qIFRyeSB0byBmYXVsdCBpbiBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBwYWdlcyAqLworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKyAgICAgICAgLyogcnc9PVJFQUQgbWVhbnMgcmVhZCBmcm9tIGRyaXZlLCB3cml0ZSBpbnRvIG1lbW9yeSBhcmVhICovCisJcmVzID0gZ2V0X3VzZXJfcGFnZXMoCisJCWN1cnJlbnQsCisJCWN1cnJlbnQtPm1tLAorCQl1YWRkciwKKwkJbnJfcGFnZXMsCisJCXJ3ID09IFJFQUQsCisJCTAsIC8qIGRvbid0IGZvcmNlICovCisJCXBhZ2VzLAorCQlOVUxMKTsKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJLyogRXJyb3JzIGFuZCBubyBwYWdlIG1hcHBlZCBzaG91bGQgcmV0dXJuIGhlcmUgKi8KKwlpZiAocmVzIDwgbnJfcGFnZXMpCisJCWdvdG8gb3V0X3VubWFwOworCisgICAgICAgIGZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBmbHVzaCBzdXBlcmZsb3VzIGZvciBydz09UkVBRCwKKyAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSB3cm9uZyBmdW5jdGlvbiBmb3Igcnc9PVdSSVRFCisgICAgICAgICAgICAgICAgICovCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2ldKTsKKwkJaWYgKHBhZ2VfdG9fcGZuKHBhZ2VzW2ldKSA+IG1heF9wZm4pCisJCQlnb3RvIG91dF91bmxvY2s7CisJCS8qID8/IElzIGxvY2tpbmcgbmVlZGVkPyBJIGRvbid0IHRoaW5rIHNvICovCisJCS8qIGlmIChUZXN0U2V0UGFnZUxvY2tlZChwYWdlc1tpXSkpCisJCSAgIGdvdG8gb3V0X3VubG9jazsgKi8KKyAgICAgICAgfQorCisJLyogUG9wdWxhdGUgdGhlIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgKi8KKwlzZ2xbMF0ucGFnZSA9IHBhZ2VzWzBdOyAKKwlzZ2xbMF0ub2Zmc2V0ID0gdWFkZHIgJiB+UEFHRV9NQVNLOworCWlmIChucl9wYWdlcyA+IDEpIHsKKwkJc2dsWzBdLmxlbmd0aCA9IFBBR0VfU0laRSAtIHNnbFswXS5vZmZzZXQ7CisJCWNvdW50IC09IHNnbFswXS5sZW5ndGg7CisJCWZvciAoaT0xOyBpIDwgbnJfcGFnZXMgOyBpKyspIHsKKwkJCXNnbFtpXS5vZmZzZXQgPSAwOworCQkJc2dsW2ldLnBhZ2UgPSBwYWdlc1tpXTsgCisJCQlzZ2xbaV0ubGVuZ3RoID0gY291bnQgPCBQQUdFX1NJWkUgPyBjb3VudCA6IFBBR0VfU0laRTsKKwkJCWNvdW50IC09IFBBR0VfU0laRTsKKwkJfQorCX0KKwllbHNlIHsKKwkJc2dsWzBdLmxlbmd0aCA9IGNvdW50OworCX0KKworCWtmcmVlKHBhZ2VzKTsKKwlyZXR1cm4gbnJfcGFnZXM7CisKKyBvdXRfdW5sb2NrOgorCS8qIGZvciAoaj0wOyBqIDwgaTsgaisrKQorCSAgIHVubG9ja19wYWdlKHBhZ2VzW2pdKTsgKi8KKwlyZXMgPSAwOworIG91dF91bm1hcDoKKwlpZiAocmVzID4gMCkKKwkJZm9yIChqPTA7IGogPCByZXM7IGorKykKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tqXSk7CisJa2ZyZWUocGFnZXMpOworCXJldHVybiByZXM7Cit9CisKKworLyogQW5kIHVubWFwIHRoZW0uLi4gKi8KK3N0YXRpYyBpbnQgCitzdF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCisJCSAgICBpbnQgZGlydGllZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlpZiAoZGlydGllZCAmJiAhUGFnZVJlc2VydmVkKHNnbFtpXS5wYWdlKSkKKwkJCVNldFBhZ2VEaXJ0eShzZ2xbaV0ucGFnZSk7CisJCS8qIHVubG9ja19wYWdlKHNnbFtpXS5wYWdlKTsgKi8KKwkJLyogRklYTUU6IGNhY2hlIGZsdXNoIG1pc3NpbmcgZm9yIHJ3PT1SRUFECisJCSAqIEZJWE1FOiBjYWxsIHRoZSBjb3JyZWN0IHJlZmVyZW5jZSBjb3VudGluZyBmdW5jdGlvbgorCQkgKi8KKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHNnbFtpXS5wYWdlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogXl5eXl5eXl4gIGFib3ZlIGNvZGUgYm9ycm93ZWQgZnJvbSBzdCBkcml2ZXIncyBkaXJlY3QgSU8gXl5eXl5eXl5eICovCisjZW5kaWYKKworCisvKiBSZXR1cm5zOiAtdmUgLT4gZXJyb3IsIDAgLT4gZG9uZSwgMSAtPiB0cnkgaW5kaXJlY3QgKi8KK3N0YXRpYyBpbnQKK3NnX2J1aWxkX2RpcmVjdChTZ19yZXF1ZXN0ICogc3JwLCBTZ19mZCAqIHNmcCwgaW50IGR4ZmVyX2xlbikKK3sKKyNpZmRlZiBTR19BTExPV19ESU9fQ09ERQorCXNnX2lvX2hkcl90ICpocCA9ICZzcnAtPmhlYWRlcjsKKwlTZ19zY2F0dGVyX2hvbGQgKnNjaHAgPSAmc3JwLT5kYXRhOworCWludCBzZ190YWJsZXNpemUgPSBzZnAtPnBhcmVudGRwLT5zZ190YWJsZXNpemU7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2w7CisJaW50IG14X3NjX2VsZW1zLCByZXM7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc2ZwLT5wYXJlbnRkcC0+ZGV2aWNlOworCisJaWYgKCgodW5zaWduZWQgbG9uZylocC0+ZHhmZXJwICYKKwkJCXF1ZXVlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSkpICE9IDApCisJCXJldHVybiAxOworCW14X3NjX2VsZW1zID0gc2dfYnVpbGRfc2dhdChzY2hwLCBzZnAsIHNnX3RhYmxlc2l6ZSk7CisgICAgICAgIGlmIChteF9zY19lbGVtcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKwlzZ2wgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NocC0+YnVmZmVyOworCXJlcyA9IHN0X21hcF91c2VyX3BhZ2VzKHNnbCwgbXhfc2NfZWxlbXMsICh1bnNpZ25lZCBsb25nKWhwLT5keGZlcnAsIGR4ZmVyX2xlbiwgCisJCQkJKFNHX0RYRkVSX1RPX0RFViA9PSBocC0+ZHhmZXJfZGlyZWN0aW9uKSA/IDEgOiAwLCBVTE9OR19NQVgpOworCWlmIChyZXMgPD0gMCkKKwkJcmV0dXJuIDE7CisJc2NocC0+a191c2Vfc2cgPSByZXM7CisJc2NocC0+ZGlvX2luX3VzZSA9IDE7CisJaHAtPmluZm8gfD0gU0dfSU5GT19ESVJFQ1RfSU87CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAxOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK3NnX2J1aWxkX2luZGlyZWN0KFNnX3NjYXR0ZXJfaG9sZCAqIHNjaHAsIFNnX2ZkICogc2ZwLCBpbnQgYnVmZl9zaXplKQoreworCWludCByZXRfc3o7CisJaW50IGJsa19zaXplID0gYnVmZl9zaXplOworCXVuc2lnbmVkIGNoYXIgKnAgPSBOVUxMOworCisJaWYgKChibGtfc2l6ZSA8IDApIHx8ICghc2ZwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKDAgPT0gYmxrX3NpemUpCisJCSsrYmxrX3NpemU7CS8qIGRvbid0IGtub3cgd2h5ICovCisvKiByb3VuZCByZXF1ZXN0IHVwIHRvIG5leHQgaGlnaGVzdCBTR19TRUNUT1JfU1ogYnl0ZSBib3VuZGFyeSAqLworCWJsa19zaXplID0gKGJsa19zaXplICsgU0dfU0VDVE9SX01TSykgJiAoflNHX1NFQ1RPUl9NU0spOworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19idWlsZF9pbmRpcmVjdDogYnVmZl9zaXplPSVkLCBibGtfc2l6ZT0lZFxuIiwKKwkJCQkgICBidWZmX3NpemUsIGJsa19zaXplKSk7CisJaWYgKGJsa19zaXplIDw9IFNHX1NDQVRURVJfU1opIHsKKwkJcCA9IHNnX3BhZ2VfbWFsbG9jKGJsa19zaXplLCBzZnAtPmxvd19kbWEsICZyZXRfc3opOworCQlpZiAoIXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGJsa19zaXplID09IHJldF9zeikgewkvKiBnb3QgaXQgb24gdGhlIGZpcnN0IGF0dGVtcHQgKi8KKwkJCXNjaHAtPmtfdXNlX3NnID0gMDsKKwkJCXNjaHAtPmJ1ZmZlciA9IHA7CisJCQlzY2hwLT5idWZmbGVuID0gYmxrX3NpemU7CisJCQlzY2hwLT5iX21hbGxvY19sZW4gPSBibGtfc2l6ZTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJcCA9IHNnX3BhZ2VfbWFsbG9jKFNHX1NDQVRURVJfU1osIHNmcC0+bG93X2RtYSwgJnJldF9zeik7CisJCWlmICghcCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKy8qIFdhbnQgc29tZSBsb2NhbCBkZWNsYXJhdGlvbnMsIHNvIHN0YXJ0IG5ldyBibG9jayAuLi4gKi8KKwl7CQkJLyogbGV0cyB0cnkgYW5kIGJ1aWxkIGEgc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbHA7CisJCWludCBrLCByZW1fc3osIG51bTsKKwkJaW50IG14X3NjX2VsZW1zOworCQlpbnQgc2dfdGFibGVzaXplID0gc2ZwLT5wYXJlbnRkcC0+c2dfdGFibGVzaXplOworCQlpbnQgZmlyc3QgPSAxOworCisJCS8qIE4uQi4gcmV0X3N6IGNhcnJpZWQgaW50byB0aGlzIGJsb2NrIC4uLiAqLworCQlteF9zY19lbGVtcyA9IHNnX2J1aWxkX3NnYXQoc2NocCwgc2ZwLCBzZ190YWJsZXNpemUpOworCQlpZiAobXhfc2NfZWxlbXMgPCAwKQorCQkJcmV0dXJuIG14X3NjX2VsZW1zOwkvKiBtb3N0IGxpa2VseSAtRU5PTUVNICovCisKKwkJZm9yIChrID0gMCwgc2NscCA9IHNjaHAtPmJ1ZmZlciwgcmVtX3N6ID0gYmxrX3NpemU7CisJCSAgICAgKHJlbV9zeiA+IDApICYmIChrIDwgbXhfc2NfZWxlbXMpOworCQkgICAgICsraywgcmVtX3N6IC09IHJldF9zeiwgKytzY2xwKSB7CisJCQlpZiAoZmlyc3QpCisJCQkJZmlyc3QgPSAwOworCQkJZWxzZSB7CisJCQkJbnVtID0KKwkJCQkgICAgKHJlbV9zeiA+CisJCQkJICAgICBTR19TQ0FUVEVSX1NaKSA/IFNHX1NDQVRURVJfU1ogOiByZW1fc3o7CisJCQkJcCA9IHNnX3BhZ2VfbWFsbG9jKG51bSwgc2ZwLT5sb3dfZG1hLCAmcmV0X3N6KTsKKwkJCQlpZiAoIXApCisJCQkJCWJyZWFrOworCQkJfQorCQkJc2NscC0+cGFnZSA9IHZpcnRfdG9fcGFnZShwKTsKKwkJCXNjbHAtPm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHApOworCQkJc2NscC0+bGVuZ3RoID0gcmV0X3N6OworCisJCQlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygic2dfYnVpbGRfYnVpbGQ6IGs9JWQsIGE9MHglcCwgbGVuPSVkXG4iLAorCQkJCQkgIGssIHNnX3NjYXRnMnZpcnQoc2NscCksIHJldF9zeikpOworCQl9CQkvKiBlbmQgb2YgZm9yIGxvb3AgKi8KKwkJc2NocC0+a191c2Vfc2cgPSBrOworCQlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygic2dfYnVpbGRfaW5kaXJlY3Q6IGtfdXNlX3NnPSVkLCByZW1fc3o9JWRcbiIsIGssIHJlbV9zeikpOworCQlzY2hwLT5idWZmbGVuID0gYmxrX3NpemU7CisJCWlmIChyZW1fc3ogPiAwKQkvKiBtdXN0IGhhdmUgZmFpbGVkICovCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3dyaXRlX3hmZXIoU2dfcmVxdWVzdCAqIHNycCkKK3sKKwlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7CisJU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNycC0+ZGF0YTsKKwlpbnQgbnVtX3hmZXIgPSAwOworCWludCBqLCBrLCBvbnVtLCB1c2dsZW4sIGtzZ2xlbiwgcmVzOworCWludCBpb3ZlY19jb3VudCA9IChpbnQpIGhwLT5pb3ZlY19jb3VudDsKKwlpbnQgZHhmZXJfZGlyID0gaHAtPmR4ZmVyX2RpcmVjdGlvbjsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgX191c2VyICp1cDsKKwlpbnQgbmV3X2ludGVyZmFjZSA9ICgnXDAnID09IGhwLT5pbnRlcmZhY2VfaWQpID8gMCA6IDE7CisKKwlpZiAoKFNHX0RYRkVSX1VOS05PV04gPT0gZHhmZXJfZGlyKSB8fCAoU0dfRFhGRVJfVE9fREVWID09IGR4ZmVyX2RpcikgfHwKKwkgICAgKFNHX0RYRkVSX1RPX0ZST01fREVWID09IGR4ZmVyX2RpcikpIHsKKwkJbnVtX3hmZXIgPSAoaW50KSAobmV3X2ludGVyZmFjZSA/IGhwLT5keGZlcl9sZW4gOiBocC0+ZmxhZ3MpOworCQlpZiAoc2NocC0+YnVmZmxlbiA8IG51bV94ZmVyKQorCQkJbnVtX3hmZXIgPSBzY2hwLT5idWZmbGVuOworCX0KKwlpZiAoKG51bV94ZmVyIDw9IDApIHx8IChzY2hwLT5kaW9faW5fdXNlKSB8fAorCSAgICAobmV3X2ludGVyZmFjZQorCSAgICAgJiYgKChTR19GTEFHX05PX0RYRkVSIHwgU0dfRkxBR19NTUFQX0lPKSAmIGhwLT5mbGFncykpKQorCQlyZXR1cm4gMDsKKworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ193cml0ZV94ZmVyOiBudW1feGZlcj0lZCwgaW92ZWNfY291bnQ9JWQsIGtfdXNlX3NnPSVkXG4iLAorCQkJICBudW1feGZlciwgaW92ZWNfY291bnQsIHNjaHAtPmtfdXNlX3NnKSk7CisJaWYgKGlvdmVjX2NvdW50KSB7CisJCW9udW0gPSBpb3ZlY19jb3VudDsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGhwLT5keGZlcnAsIFNaX1NHX0lPVkVDICogb251bSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UKKwkJb251bSA9IDE7CisKKwlpZiAoMCA9PSBzY2hwLT5rX3VzZV9zZykgewkvKiBrZXJuZWwgaGFzIHNpbmdsZSBidWZmZXIgKi8KKwkJZm9yIChqID0gMCwgcCA9IHNjaHAtPmJ1ZmZlcjsgaiA8IG9udW07ICsraikgeworCQkJcmVzID0gc2dfdV9pb3ZlYyhocCwgaW92ZWNfY291bnQsIGosIDEsICZ1c2dsZW4sICZ1cCk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisJCQl1c2dsZW4gPSAobnVtX3hmZXIgPiB1c2dsZW4pID8gdXNnbGVuIDogbnVtX3hmZXI7CisJCQlpZiAoX19jb3B5X2Zyb21fdXNlcihwLCB1cCwgdXNnbGVuKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXAgKz0gdXNnbGVuOworCQkJbnVtX3hmZXIgLT0gdXNnbGVuOworCQkJaWYgKG51bV94ZmVyIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgewkJLyoga2VybmVsIHVzaW5nIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzY2hwLT5idWZmZXI7CisKKwkJa3NnbGVuID0gKGludCkgc2NscC0+bGVuZ3RoOworCQlwID0gc2dfc2NhdGcydmlydChzY2xwKTsKKwkJZm9yIChqID0gMCwgayA9IDA7IGogPCBvbnVtOyArK2opIHsKKwkJCXJlcyA9IHNnX3VfaW92ZWMoaHAsIGlvdmVjX2NvdW50LCBqLCAxLCAmdXNnbGVuLCAmdXApOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCisJCQlmb3IgKDsgcDsgKytzY2xwLCBrc2dsZW4gPSAoaW50KSBzY2xwLT5sZW5ndGgsCisJCQkJICBwID0gc2dfc2NhdGcydmlydChzY2xwKSkgeworCQkJCWlmICh1c2dsZW4gPD0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGtzZ2xlbiA+IHVzZ2xlbikgeworCQkJCQlpZiAodXNnbGVuID49IG51bV94ZmVyKSB7CisJCQkJCQlpZiAoX19jb3B5X2Zyb21fdXNlcgorCQkJCQkJICAgIChwLCB1cCwgbnVtX3hmZXIpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIHVzZ2xlbikpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcCArPSB1c2dsZW47CisJCQkJCWtzZ2xlbiAtPSB1c2dsZW47CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChrc2dsZW4gPj0gbnVtX3hmZXIpIHsKKwkJCQkJCWlmIChfX2NvcHlfZnJvbV91c2VyCisJCQkJCQkgICAgKHAsIHVwLCBudW1feGZlcikpCisJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQlpZiAoX19jb3B5X2Zyb21fdXNlcihwLCB1cCwga3NnbGVuKSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl1cCArPSBrc2dsZW47CisJCQkJCXVzZ2xlbiAtPSBrc2dsZW47CisJCQkJfQorCQkJCSsrazsKKwkJCQlpZiAoayA+PSBzY2hwLT5rX3VzZV9zZykKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3VfaW92ZWMoc2dfaW9faGRyX3QgKiBocCwgaW50IHNnX251bSwgaW50IGluZCwKKwkgICBpbnQgd3JfeGYsIGludCAqY291bnRwLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqKnVwKQoreworCWludCBudW1feGZlciA9IChpbnQpIGhwLT5keGZlcl9sZW47CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKnAgPSBocC0+ZHhmZXJwOworCWludCBjb3VudDsKKworCWlmICgwID09IHNnX251bSkgeworCQlpZiAod3JfeGYgJiYgKCdcMCcgPT0gaHAtPmludGVyZmFjZV9pZCkpCisJCQljb3VudCA9IChpbnQpIGhwLT5mbGFnczsJLyogaG9sZHMgIm9sZCIgaW5wdXRfc2l6ZSAqLworCQllbHNlCisJCQljb3VudCA9IG51bV94ZmVyOworCX0gZWxzZSB7CisJCXNnX2lvdmVjX3QgaW92ZWM7CisJCWlmIChfX2NvcHlfZnJvbV91c2VyKCZpb3ZlYywgcCArIGluZCpTWl9TR19JT1ZFQywgU1pfU0dfSU9WRUMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXAgPSBpb3ZlYy5pb3ZfYmFzZTsKKwkJY291bnQgPSAoaW50KSBpb3ZlYy5pb3ZfbGVuOworCX0KKwlpZiAoIWFjY2Vzc19vayh3cl94ZiA/IFZFUklGWV9SRUFEIDogVkVSSUZZX1dSSVRFLCBwLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh1cCkKKwkJKnVwID0gcDsKKwlpZiAoY291bnRwKQorCQkqY291bnRwID0gY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZ19yZW1vdmVfc2NhdChTZ19zY2F0dGVyX2hvbGQgKiBzY2hwKQoreworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19yZW1vdmVfc2NhdDoga191c2Vfc2c9JWRcbiIsIHNjaHAtPmtfdXNlX3NnKSk7CisJaWYgKHNjaHAtPmJ1ZmZlciAmJiAoc2NocC0+c2dsaXN0X2xlbiA+IDApKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NocC0+YnVmZmVyOworCisJCWlmIChzY2hwLT5kaW9faW5fdXNlKSB7CisjaWZkZWYgU0dfQUxMT1dfRElPX0NPREUKKwkJCXN0X3VubWFwX3VzZXJfcGFnZXMoc2NscCwgc2NocC0+a191c2Vfc2csIFRSVUUpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpbnQgazsKKworCQkJZm9yIChrID0gMDsgKGsgPCBzY2hwLT5rX3VzZV9zZykgJiYgc2dfc2NhdGcydmlydChzY2xwKTsKKwkJCSAgICAgKytrLCArK3NjbHApIHsKKwkJCQlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygKKwkJCQkgICAgInNnX3JlbW92ZV9zY2F0OiBrPSVkLCBhPTB4JXAsIGxlbj0lZFxuIiwKKwkJCQkgICAgaywgc2dfc2NhdGcydmlydChzY2xwKSwgc2NscC0+bGVuZ3RoKSk7CisJCQkJc2dfcGFnZV9mcmVlKHNnX3NjYXRnMnZpcnQoc2NscCksIHNjbHAtPmxlbmd0aCk7CisJCQkJc2NscC0+cGFnZSA9IE5VTEw7CisJCQkJc2NscC0+b2Zmc2V0ID0gMDsKKwkJCQlzY2xwLT5sZW5ndGggPSAwOworCQkJfQorCQl9CisJCXNnX3BhZ2VfZnJlZShzY2hwLT5idWZmZXIsIHNjaHAtPnNnbGlzdF9sZW4pOworCX0gZWxzZSBpZiAoc2NocC0+YnVmZmVyKQorCQlzZ19wYWdlX2ZyZWUoc2NocC0+YnVmZmVyLCBzY2hwLT5iX21hbGxvY19sZW4pOworCW1lbXNldChzY2hwLCAwLCBzaXplb2YgKCpzY2hwKSk7Cit9CisKK3N0YXRpYyBpbnQKK3NnX3JlYWRfeGZlcihTZ19yZXF1ZXN0ICogc3JwKQoreworCXNnX2lvX2hkcl90ICpocCA9ICZzcnAtPmhlYWRlcjsKKwlTZ19zY2F0dGVyX2hvbGQgKnNjaHAgPSAmc3JwLT5kYXRhOworCWludCBudW1feGZlciA9IDA7CisJaW50IGosIGssIG9udW0sIHVzZ2xlbiwga3NnbGVuLCByZXM7CisJaW50IGlvdmVjX2NvdW50ID0gKGludCkgaHAtPmlvdmVjX2NvdW50OworCWludCBkeGZlcl9kaXIgPSBocC0+ZHhmZXJfZGlyZWN0aW9uOworCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKnVwOworCWludCBuZXdfaW50ZXJmYWNlID0gKCdcMCcgPT0gaHAtPmludGVyZmFjZV9pZCkgPyAwIDogMTsKKworCWlmICgoU0dfRFhGRVJfVU5LTk9XTiA9PSBkeGZlcl9kaXIpIHx8IChTR19EWEZFUl9GUk9NX0RFViA9PSBkeGZlcl9kaXIpCisJICAgIHx8IChTR19EWEZFUl9UT19GUk9NX0RFViA9PSBkeGZlcl9kaXIpKSB7CisJCW51bV94ZmVyID0gaHAtPmR4ZmVyX2xlbjsKKwkJaWYgKHNjaHAtPmJ1ZmZsZW4gPCBudW1feGZlcikKKwkJCW51bV94ZmVyID0gc2NocC0+YnVmZmxlbjsKKwl9CisJaWYgKChudW1feGZlciA8PSAwKSB8fCAoc2NocC0+ZGlvX2luX3VzZSkgfHwKKwkgICAgKG5ld19pbnRlcmZhY2UKKwkgICAgICYmICgoU0dfRkxBR19OT19EWEZFUiB8IFNHX0ZMQUdfTU1BUF9JTykgJiBocC0+ZmxhZ3MpKSkKKwkJcmV0dXJuIDA7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfcmVhZF94ZmVyOiBudW1feGZlcj0lZCwgaW92ZWNfY291bnQ9JWQsIGtfdXNlX3NnPSVkXG4iLAorCQkJICBudW1feGZlciwgaW92ZWNfY291bnQsIHNjaHAtPmtfdXNlX3NnKSk7CisJaWYgKGlvdmVjX2NvdW50KSB7CisJCW9udW0gPSBpb3ZlY19jb3VudDsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGhwLT5keGZlcnAsIFNaX1NHX0lPVkVDICogb251bSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UKKwkJb251bSA9IDE7CisKKwlpZiAoMCA9PSBzY2hwLT5rX3VzZV9zZykgewkvKiBrZXJuZWwgaGFzIHNpbmdsZSBidWZmZXIgKi8KKwkJZm9yIChqID0gMCwgcCA9IHNjaHAtPmJ1ZmZlcjsgaiA8IG9udW07ICsraikgeworCQkJcmVzID0gc2dfdV9pb3ZlYyhocCwgaW92ZWNfY291bnQsIGosIDAsICZ1c2dsZW4sICZ1cCk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisJCQl1c2dsZW4gPSAobnVtX3hmZXIgPiB1c2dsZW4pID8gdXNnbGVuIDogbnVtX3hmZXI7CisJCQlpZiAoX19jb3B5X3RvX3VzZXIodXAsIHAsIHVzZ2xlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwICs9IHVzZ2xlbjsKKwkJCW51bV94ZmVyIC09IHVzZ2xlbjsKKwkJCWlmIChudW1feGZlciA8PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsJCS8qIGtlcm5lbCB1c2luZyBzY2F0dGVyIGdhdGhlciBsaXN0ICovCisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NocC0+YnVmZmVyOworCisJCWtzZ2xlbiA9IChpbnQpIHNjbHAtPmxlbmd0aDsKKwkJcCA9IHNnX3NjYXRnMnZpcnQoc2NscCk7CisJCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgb251bTsgKytqKSB7CisJCQlyZXMgPSBzZ191X2lvdmVjKGhwLCBpb3ZlY19jb3VudCwgaiwgMCwgJnVzZ2xlbiwgJnVwKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKworCQkJZm9yICg7IHA7ICsrc2NscCwga3NnbGVuID0gKGludCkgc2NscC0+bGVuZ3RoLAorCQkJCSAgcCA9IHNnX3NjYXRnMnZpcnQoc2NscCkpIHsKKwkJCQlpZiAodXNnbGVuIDw9IDApCisJCQkJCWJyZWFrOworCQkJCWlmIChrc2dsZW4gPiB1c2dsZW4pIHsKKwkJCQkJaWYgKHVzZ2xlbiA+PSBudW1feGZlcikgeworCQkJCQkJaWYgKF9fY29weV90b191c2VyCisJCQkJCQkgICAgKHVwLCBwLCBudW1feGZlcikpCisJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQlpZiAoX19jb3B5X3RvX3VzZXIodXAsIHAsIHVzZ2xlbikpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcCArPSB1c2dsZW47CisJCQkJCWtzZ2xlbiAtPSB1c2dsZW47CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChrc2dsZW4gPj0gbnVtX3hmZXIpIHsKKwkJCQkJCWlmIChfX2NvcHlfdG9fdXNlcgorCQkJCQkJICAgICh1cCwgcCwgbnVtX3hmZXIpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJaWYgKF9fY29weV90b191c2VyKHVwLCBwLCBrc2dsZW4pKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXVwICs9IGtzZ2xlbjsKKwkJCQkJdXNnbGVuIC09IGtzZ2xlbjsKKwkJCQl9CisJCQkJKytrOworCQkJCWlmIChrID49IHNjaHAtPmtfdXNlX3NnKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2dfcmVhZF9veGZlcihTZ19yZXF1ZXN0ICogc3JwLCBjaGFyIF9fdXNlciAqb3V0cCwgaW50IG51bV9yZWFkX3hmZXIpCit7CisJU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNycC0+ZGF0YTsKKworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19yZWFkX294ZmVyOiBudW1fcmVhZF94ZmVyPSVkXG4iLAorCQkJCSAgIG51bV9yZWFkX3hmZXIpKTsKKwlpZiAoKCFvdXRwKSB8fCAobnVtX3JlYWRfeGZlciA8PSAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKHNjaHAtPmtfdXNlX3NnID4gMCkgeworCQlpbnQgaywgbnVtOworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjbHAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjaHAtPmJ1ZmZlcjsKKworCQlmb3IgKGsgPSAwOyAoayA8IHNjaHAtPmtfdXNlX3NnKSAmJiBzZ19zY2F0ZzJ2aXJ0KHNjbHApOworCQkgICAgICsraywgKytzY2xwKSB7CisJCQludW0gPSAoaW50KSBzY2xwLT5sZW5ndGg7CisJCQlpZiAobnVtID4gbnVtX3JlYWRfeGZlcikgeworCQkJCWlmIChfX2NvcHlfdG9fdXNlcgorCQkJCSAgICAob3V0cCwgc2dfc2NhdGcydmlydChzY2xwKSwgbnVtX3JlYWRfeGZlcikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoX19jb3B5X3RvX3VzZXIKKwkJCQkgICAgKG91dHAsIHNnX3NjYXRnMnZpcnQoc2NscCksIG51bSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCW51bV9yZWFkX3hmZXIgLT0gbnVtOworCQkJCWlmIChudW1fcmVhZF94ZmVyIDw9IDApCisJCQkJCWJyZWFrOworCQkJCW91dHAgKz0gbnVtOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKF9fY29weV90b191c2VyKG91dHAsIHNjaHAtPmJ1ZmZlciwgbnVtX3JlYWRfeGZlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZ19idWlsZF9yZXNlcnZlKFNnX2ZkICogc2ZwLCBpbnQgcmVxX3NpemUpCit7CisJU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNmcC0+cmVzZXJ2ZTsKKworCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19idWlsZF9yZXNlcnZlOiByZXFfc2l6ZT0lZFxuIiwgcmVxX3NpemUpKTsKKwlkbyB7CisJCWlmIChyZXFfc2l6ZSA8IFBBR0VfU0laRSkKKwkJCXJlcV9zaXplID0gUEFHRV9TSVpFOworCQlpZiAoMCA9PSBzZ19idWlsZF9pbmRpcmVjdChzY2hwLCBzZnAsIHJlcV9zaXplKSkKKwkJCXJldHVybjsKKwkJZWxzZQorCQkJc2dfcmVtb3ZlX3NjYXQoc2NocCk7CisJCXJlcV9zaXplID4+PSAxOwkvKiBkaXZpZGUgYnkgMiAqLworCX0gd2hpbGUgKHJlcV9zaXplID4gKFBBR0VfU0laRSAvIDIpKTsKK30KKworc3RhdGljIHZvaWQKK3NnX2xpbmtfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCwgaW50IHNpemUpCit7CisJU2dfc2NhdHRlcl9ob2xkICpyZXFfc2NocCA9ICZzcnAtPmRhdGE7CisJU2dfc2NhdHRlcl9ob2xkICpyc3Zfc2NocCA9ICZzZnAtPnJlc2VydmU7CisKKwlzcnAtPnJlc191c2VkID0gMTsKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfbGlua19yZXNlcnZlOiBzaXplPSVkXG4iLCBzaXplKSk7CisJc2l6ZSA9IChzaXplICsgMSkgJiAofjEpOwkvKiByb3VuZCB0byBldmVuIGZvciBhaGExNTQyICovCisJaWYgKHJzdl9zY2hwLT5rX3VzZV9zZyA+IDApIHsKKwkJaW50IGssIG51bTsKKwkJaW50IHJlbSA9IHNpemU7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2NscCA9CisJCSAgICAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHJzdl9zY2hwLT5idWZmZXI7CisKKwkJZm9yIChrID0gMDsgayA8IHJzdl9zY2hwLT5rX3VzZV9zZzsgKytrLCArK3NjbHApIHsKKwkJCW51bSA9IChpbnQpIHNjbHAtPmxlbmd0aDsKKwkJCWlmIChyZW0gPD0gbnVtKSB7CisJCQkJaWYgKDAgPT0gaykgeworCQkJCQlyZXFfc2NocC0+a191c2Vfc2cgPSAwOworCQkJCQlyZXFfc2NocC0+YnVmZmVyID0gc2dfc2NhdGcydmlydChzY2xwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZnAtPnNhdmVfc2NhdF9sZW4gPSBudW07CisJCQkJCXNjbHAtPmxlbmd0aCA9ICh1bnNpZ25lZCkgcmVtOworCQkJCQlyZXFfc2NocC0+a191c2Vfc2cgPSBrICsgMTsKKwkJCQkJcmVxX3NjaHAtPnNnbGlzdF9sZW4gPQorCQkJCQkgICAgcnN2X3NjaHAtPnNnbGlzdF9sZW47CisJCQkJCXJlcV9zY2hwLT5idWZmZXIgPSByc3Zfc2NocC0+YnVmZmVyOworCQkJCX0KKwkJCQlyZXFfc2NocC0+YnVmZmxlbiA9IHNpemU7CisJCQkJcmVxX3NjaHAtPmJfbWFsbG9jX2xlbiA9IHJzdl9zY2hwLT5iX21hbGxvY19sZW47CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlyZW0gLT0gbnVtOworCQl9CisJCWlmIChrID49IHJzdl9zY2hwLT5rX3VzZV9zZykKKwkJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19saW5rX3Jlc2VydmU6IEJBRCBzaXplXG4iKSk7CisJfSBlbHNlIHsKKwkJcmVxX3NjaHAtPmtfdXNlX3NnID0gMDsKKwkJcmVxX3NjaHAtPmJ1ZmZsZW4gPSBzaXplOworCQlyZXFfc2NocC0+YnVmZmVyID0gcnN2X3NjaHAtPmJ1ZmZlcjsKKwkJcmVxX3NjaHAtPmJfbWFsbG9jX2xlbiA9IHJzdl9zY2hwLT5iX21hbGxvY19sZW47CisJfQorfQorCitzdGF0aWMgdm9pZAorc2dfdW5saW5rX3Jlc2VydmUoU2dfZmQgKiBzZnAsIFNnX3JlcXVlc3QgKiBzcnApCit7CisJU2dfc2NhdHRlcl9ob2xkICpyZXFfc2NocCA9ICZzcnAtPmRhdGE7CisJU2dfc2NhdHRlcl9ob2xkICpyc3Zfc2NocCA9ICZzZnAtPnJlc2VydmU7CisKKwlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfdW5saW5rX3Jlc2VydmU6IHJlcS0+a191c2Vfc2c9JWRcbiIsCisJCQkJICAgKGludCkgcmVxX3NjaHAtPmtfdXNlX3NnKSk7CisJaWYgKChyc3Zfc2NocC0+a191c2Vfc2cgPiAwKSAmJiAocmVxX3NjaHAtPmtfdXNlX3NnID4gMCkpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2xwID0KKwkJICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgcnN2X3NjaHAtPmJ1ZmZlcjsKKworCQlpZiAoc2ZwLT5zYXZlX3NjYXRfbGVuID4gMCkKKwkJCShzY2xwICsgKHJlcV9zY2hwLT5rX3VzZV9zZyAtIDEpKS0+bGVuZ3RoID0KKwkJCSAgICAodW5zaWduZWQpIHNmcC0+c2F2ZV9zY2F0X2xlbjsKKwkJZWxzZQorCQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsgKCJzZ191bmxpbmtfcmVzZXJ2ZTogQkFEIHNhdmVfc2NhdF9sZW5cbiIpKTsKKwl9CisJcmVxX3NjaHAtPmtfdXNlX3NnID0gMDsKKwlyZXFfc2NocC0+YnVmZmxlbiA9IDA7CisJcmVxX3NjaHAtPmJ1ZmZlciA9IE5VTEw7CisJcmVxX3NjaHAtPnNnbGlzdF9sZW4gPSAwOworCXNmcC0+c2F2ZV9zY2F0X2xlbiA9IDA7CisJc3JwLT5yZXNfdXNlZCA9IDA7Cit9CisKK3N0YXRpYyBTZ19yZXF1ZXN0ICoKK3NnX2dldF9ycV9tYXJrKFNnX2ZkICogc2ZwLCBpbnQgcGFja19pZCkKK3sKKwlTZ19yZXF1ZXN0ICpyZXNwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlmb3IgKHJlc3AgPSBzZnAtPmhlYWRycDsgcmVzcDsgcmVzcCA9IHJlc3AtPm5leHRycCkgeworCQkvKiBsb29rIGZvciByZXF1ZXN0cyB0aGF0IGFyZSByZWFkeSArIG5vdCBTR19JTyBvd25lZCAqLworCQlpZiAoKDEgPT0gcmVzcC0+ZG9uZSkgJiYgKCFyZXNwLT5zZ19pb19vd25lZCkgJiYKKwkJICAgICgoLTEgPT0gcGFja19pZCkgfHwgKHJlc3AtPmhlYWRlci5wYWNrX2lkID09IHBhY2tfaWQpKSkgeworCQkJcmVzcC0+ZG9uZSA9IDI7CS8qIGd1YXJkIGFnYWluc3Qgb3RoZXIgcmVhZGVycyAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCXJldHVybiByZXNwOworfQorCisjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUworc3RhdGljIFNnX3JlcXVlc3QgKgorc2dfZ2V0X250aF9yZXF1ZXN0KFNnX2ZkICogc2ZwLCBpbnQgbnRoKQoreworCVNnX3JlcXVlc3QgKnJlc3A7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisJaW50IGs7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJZm9yIChrID0gMCwgcmVzcCA9IHNmcC0+aGVhZHJwOyByZXNwICYmIChrIDwgbnRoKTsKKwkgICAgICsraywgcmVzcCA9IHJlc3AtPm5leHRycCkgOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCXJldHVybiByZXNwOworfQorI2VuZGlmCisKKy8qIGFsd2F5cyBhZGRzIHRvIGVuZCBvZiBsaXN0ICovCitzdGF0aWMgU2dfcmVxdWVzdCAqCitzZ19hZGRfcmVxdWVzdChTZ19mZCAqIHNmcCkKK3sKKwlpbnQgazsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlTZ19yZXF1ZXN0ICpyZXNwOworCVNnX3JlcXVlc3QgKnJwID0gc2ZwLT5yZXFfYXJyOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlyZXNwID0gc2ZwLT5oZWFkcnA7CisJaWYgKCFyZXNwKSB7CisJCW1lbXNldChycCwgMCwgc2l6ZW9mIChTZ19yZXF1ZXN0KSk7CisJCXJwLT5wYXJlbnRmcCA9IHNmcDsKKwkJcmVzcCA9IHJwOworCQlzZnAtPmhlYWRycCA9IHJlc3A7CisJfSBlbHNlIHsKKwkJaWYgKDAgPT0gc2ZwLT5jbWRfcSkKKwkJCXJlc3AgPSBOVUxMOwkvKiBjb21tYW5kIHF1ZXVpbmcgZGlzYWxsb3dlZCAqLworCQllbHNlIHsKKwkJCWZvciAoayA9IDA7IGsgPCBTR19NQVhfUVVFVUU7ICsraywgKytycCkgeworCQkJCWlmICghcnAtPnBhcmVudGZwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChrIDwgU0dfTUFYX1FVRVVFKSB7CisJCQkJbWVtc2V0KHJwLCAwLCBzaXplb2YgKFNnX3JlcXVlc3QpKTsKKwkJCQlycC0+cGFyZW50ZnAgPSBzZnA7CisJCQkJd2hpbGUgKHJlc3AtPm5leHRycCkKKwkJCQkJcmVzcCA9IHJlc3AtPm5leHRycDsKKwkJCQlyZXNwLT5uZXh0cnAgPSBycDsKKwkJCQlyZXNwID0gcnA7CisJCQl9IGVsc2UKKwkJCQlyZXNwID0gTlVMTDsKKwkJfQorCX0KKwlpZiAocmVzcCkgeworCQlyZXNwLT5uZXh0cnAgPSBOVUxMOworCQlyZXNwLT5oZWFkZXIuZHVyYXRpb24gPSBqaWZmaWVzOworCQlyZXNwLT5teV9jbWRwID0gTlVMTDsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCXJldHVybiByZXNwOworfQorCisvKiBSZXR1cm4gb2YgMSBmb3IgZm91bmQ7IDAgZm9yIG5vdCBmb3VuZCAqLworc3RhdGljIGludAorc2dfcmVtb3ZlX3JlcXVlc3QoU2dfZmQgKiBzZnAsIFNnX3JlcXVlc3QgKiBzcnApCit7CisJU2dfcmVxdWVzdCAqcHJldl9ycDsKKwlTZ19yZXF1ZXN0ICpycDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKwlpbnQgcmVzID0gMDsKKworCWlmICgoIXNmcCkgfHwgKCFzcnApIHx8ICghc2ZwLT5oZWFkcnApKQorCQlyZXR1cm4gcmVzOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJcHJldl9ycCA9IHNmcC0+aGVhZHJwOworCWlmIChzcnAgPT0gcHJldl9ycCkgeworCQlzZnAtPmhlYWRycCA9IHByZXZfcnAtPm5leHRycDsKKwkJcHJldl9ycC0+cGFyZW50ZnAgPSBOVUxMOworCQlyZXMgPSAxOworCX0gZWxzZSB7CisJCXdoaWxlICgocnAgPSBwcmV2X3JwLT5uZXh0cnApKSB7CisJCQlpZiAoc3JwID09IHJwKSB7CisJCQkJcHJldl9ycC0+bmV4dHJwID0gcnAtPm5leHRycDsKKwkJCQlycC0+cGFyZW50ZnAgPSBOVUxMOworCQkJCXJlcyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmV2X3JwID0gcnA7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOworCXJldHVybiByZXM7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCitzdGF0aWMgU2dfZmQgKgorc2dfZ2V0X250aF9zZnAoU2dfZGV2aWNlICogc2RwLCBpbnQgbnRoKQoreworCVNnX2ZkICpyZXNwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCWludCBrOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlmb3IgKGsgPSAwLCByZXNwID0gc2RwLT5oZWFkZnA7IHJlc3AgJiYgKGsgPCBudGgpOworCSAgICAgKytrLCByZXNwID0gcmVzcC0+bmV4dGZwKSA7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCXJldHVybiByZXNwOworfQorI2VuZGlmCisKK3N0YXRpYyBTZ19mZCAqCitzZ19hZGRfc2ZwKFNnX2RldmljZSAqIHNkcCwgaW50IGRldikKK3sKKwlTZ19mZCAqc2ZwOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJc2ZwID0gKFNnX2ZkICopIHNnX3BhZ2VfbWFsbG9jKHNpemVvZiAoU2dfZmQpLCAwLCBOVUxMKTsKKwlpZiAoIXNmcCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHNmcCwgMCwgc2l6ZW9mIChTZ19mZCkpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNmcC0+cmVhZF93YWl0KTsKKwlyd2xvY2tfaW5pdCgmc2ZwLT5ycV9saXN0X2xvY2spOworCisJc2ZwLT50aW1lb3V0ID0gU0dfREVGQVVMVF9USU1FT1VUOworCXNmcC0+dGltZW91dF91c2VyID0gU0dfREVGQVVMVF9USU1FT1VUX1VTRVI7CisJc2ZwLT5mb3JjZV9wYWNraWQgPSBTR19ERUZfRk9SQ0VfUEFDS19JRDsKKwlzZnAtPmxvd19kbWEgPSAoU0dfREVGX0ZPUkNFX0xPV19ETUEgPT0gMCkgPworCSAgICBzZHAtPmRldmljZS0+aG9zdC0+dW5jaGVja2VkX2lzYV9kbWEgOiAxOworCXNmcC0+Y21kX3EgPSBTR19ERUZfQ09NTUFORF9ROworCXNmcC0+a2VlcF9vcnBoYW4gPSBTR19ERUZfS0VFUF9PUlBIQU47CisJc2ZwLT5wYXJlbnRkcCA9IHNkcDsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlpZiAoIXNkcC0+aGVhZGZwKQorCQlzZHAtPmhlYWRmcCA9IHNmcDsKKwllbHNlIHsJCQkvKiBhZGQgdG8gdGFpbCBvZiBleGlzdGluZyBsaXN0ICovCisJCVNnX2ZkICpwZnAgPSBzZHAtPmhlYWRmcDsKKwkJd2hpbGUgKHBmcC0+bmV4dGZwKQorCQkJcGZwID0gcGZwLT5uZXh0ZnA7CisJCXBmcC0+bmV4dGZwID0gc2ZwOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19hZGRfc2ZwOiBzZnA9MHglcFxuIiwgc2ZwKSk7CisJc2dfYnVpbGRfcmVzZXJ2ZShzZnAsIHNnX2JpZ19idWZmKTsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfYWRkX3NmcDogICBidWZmbGVuPSVkLCBrX3VzZV9zZz0lZFxuIiwKKwkJCSAgIHNmcC0+cmVzZXJ2ZS5idWZmbGVuLCBzZnAtPnJlc2VydmUua191c2Vfc2cpKTsKKwlyZXR1cm4gc2ZwOworfQorCitzdGF0aWMgdm9pZAorX19zZ19yZW1vdmVfc2ZwKFNnX2RldmljZSAqIHNkcCwgU2dfZmQgKiBzZnApCit7CisJU2dfZmQgKmZwOworCVNnX2ZkICpwcmV2X2ZwOworCisJcHJldl9mcCA9IHNkcC0+aGVhZGZwOworCWlmIChzZnAgPT0gcHJldl9mcCkKKwkJc2RwLT5oZWFkZnAgPSBwcmV2X2ZwLT5uZXh0ZnA7CisJZWxzZSB7CisJCXdoaWxlICgoZnAgPSBwcmV2X2ZwLT5uZXh0ZnApKSB7CisJCQlpZiAoc2ZwID09IGZwKSB7CisJCQkJcHJldl9mcC0+bmV4dGZwID0gZnAtPm5leHRmcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByZXZfZnAgPSBmcDsKKwkJfQorCX0KKwlpZiAoc2ZwLT5yZXNlcnZlLmJ1ZmZsZW4gPiAwKSB7CisJCVNDU0lfTE9HX1RJTUVPVVQoNiwgCisJCQlwcmludGsoIl9fc2dfcmVtb3ZlX3NmcDogICAgYnVmZmxlbj0lZCwga191c2Vfc2c9JWRcbiIsCisJCQkoaW50KSBzZnAtPnJlc2VydmUuYnVmZmxlbiwgKGludCkgc2ZwLT5yZXNlcnZlLmtfdXNlX3NnKSk7CisJCWlmIChzZnAtPm1tYXBfY2FsbGVkKQorCQkJc2dfcmJfY29ycmVjdDRtbWFwKCZzZnAtPnJlc2VydmUsIDApOwkvKiB1bmRvIGNvcnJlY3Rpb24gKi8KKwkJc2dfcmVtb3ZlX3NjYXQoJnNmcC0+cmVzZXJ2ZSk7CisJfQorCXNmcC0+cGFyZW50ZHAgPSBOVUxMOworCVNDU0lfTE9HX1RJTUVPVVQoNiwgcHJpbnRrKCJfX3NnX3JlbW92ZV9zZnA6ICAgIHNmcD0weCVwXG4iLCBzZnApKTsKKwlzZ19wYWdlX2ZyZWUoKGNoYXIgKikgc2ZwLCBzaXplb2YgKFNnX2ZkKSk7Cit9CisKKy8qIFJldHVybnMgMCBpbiBub3JtYWwgY2FzZSwgMSB3aGVuIGRldGFjaGVkIGFuZCBzZHAgb2JqZWN0IHJlbW92ZWQgKi8KK3N0YXRpYyBpbnQKK3NnX3JlbW92ZV9zZnAoU2dfZGV2aWNlICogc2RwLCBTZ19mZCAqIHNmcCkKK3sKKwlTZ19yZXF1ZXN0ICpzcnA7CisJU2dfcmVxdWVzdCAqdHNycDsKKwlpbnQgZGlydHkgPSAwOworCWludCByZXMgPSAwOworCisJZm9yIChzcnAgPSBzZnAtPmhlYWRycDsgc3JwOyBzcnAgPSB0c3JwKSB7CisJCXRzcnAgPSBzcnAtPm5leHRycDsKKwkJaWYgKHNnX3NycF9kb25lKHNycCwgc2ZwKSkKKwkJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CisJCWVsc2UKKwkJCSsrZGlydHk7CisJfQorCWlmICgwID09IGRpcnR5KSB7CisJCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmc2dfZGV2X2Fycl9sb2NrLCBpZmxhZ3MpOworCQlfX3NnX3JlbW92ZV9zZnAoc2RwLCBzZnApOworCQlpZiAoc2RwLT5kZXRhY2hlZCAmJiAoTlVMTCA9PSBzZHAtPmhlYWRmcCkpIHsKKwkJCWludCBrLCBtYXhkOworCisJCQltYXhkID0gc2dfZGV2X21heDsKKwkJCWZvciAoayA9IDA7IGsgPCBtYXhkOyArK2spIHsKKwkJCQlpZiAoc2RwID09IHNnX2Rldl9hcnJba10pCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGsgPCBtYXhkKQorCQkJCXNnX2Rldl9hcnJba10gPSBOVUxMOworCQkJa2ZyZWUoKGNoYXIgKikgc2RwKTsKKwkJCXJlcyA9IDE7CisJCX0KKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwl9IGVsc2UgeworCQkvKiBNT0RfSU5DJ3MgdG8gaW5oaWJpdCB1bmxvYWRpbmcgc2cgYW5kIGFzc29jaWF0ZWQgYWRhcHRlciBkcml2ZXIgKi8KKwkJLyogb25seSBidW1wIHRoZSBhY2Nlc3NfY291bnQgaWYgd2UgYWN0dWFsbHkgc3VjY2VlZGVkIGluCisJCSAqIHRocm93aW5nIGFub3RoZXIgY291bnRlciBvbiB0aGUgaG9zdCBtb2R1bGUgKi8KKwkJc2NzaV9kZXZpY2VfZ2V0KHNkcC0+ZGV2aWNlKTsJLyogWFhYOiByZXR2YWwgaWdub3JlZD8gKi8JCisJCXNmcC0+Y2xvc2VkID0gMTsJLyogZmxhZyBkaXJ0eSBzdGF0ZSBvbiB0aGlzIGZkICovCisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19yZW1vdmVfc2ZwOiB3b3JyaXNvbWUsICVkIHdyaXRlcyBwZW5kaW5nXG4iLAorCQkJCSAgZGlydHkpKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorc2dfcmVzX2luX3VzZShTZ19mZCAqIHNmcCkKK3sKKwljb25zdCBTZ19yZXF1ZXN0ICpzcnA7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7CisJZm9yIChzcnAgPSBzZnAtPmhlYWRycDsgc3JwOyBzcnAgPSBzcnAtPm5leHRycCkKKwkJaWYgKHNycC0+cmVzX3VzZWQpCisJCQlicmVhazsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gc3JwID8gMSA6IDA7Cit9CisKKy8qIElmIHJldFN6cD09TlVMTCB3YW50IGV4YWN0IHNpemUgb3IgZmFpbCAqLworc3RhdGljIGNoYXIgKgorc2dfcGFnZV9tYWxsb2MoaW50IHJxU3osIGludCBsb3dEbWEsIGludCAqcmV0U3pwKQoreworCWNoYXIgKnJlc3AgPSBOVUxMOworCWludCBwYWdlX21hc2s7CisJaW50IG9yZGVyLCBhX3NpemU7CisJaW50IHJlc1N6ID0gcnFTejsKKworCWlmIChycVN6IDw9IDApCisJCXJldHVybiByZXNwOworCisJaWYgKGxvd0RtYSkKKwkJcGFnZV9tYXNrID0gR0ZQX0FUT01JQyB8IEdGUF9ETUEgfCBfX0dGUF9OT1dBUk47CisJZWxzZQorCQlwYWdlX21hc2sgPSBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOOworCisJZm9yIChvcmRlciA9IDAsIGFfc2l6ZSA9IFBBR0VfU0laRTsgYV9zaXplIDwgcnFTejsKKwkgICAgIG9yZGVyKyssIGFfc2l6ZSA8PD0gMSkgOworCXJlc3AgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKHBhZ2VfbWFzaywgb3JkZXIpOworCXdoaWxlICgoIXJlc3ApICYmIG9yZGVyICYmIHJldFN6cCkgeworCQktLW9yZGVyOworCQlhX3NpemUgPj49IDE7CS8qIGRpdmlkZSBieSAyLCB1bnRpbCBQQUdFX1NJWkUgKi8KKwkJcmVzcCA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZXMocGFnZV9tYXNrLCBvcmRlcik7CS8qIHRyeSBoYWxmICovCisJCXJlc1N6ID0gYV9zaXplOworCX0KKwlpZiAocmVzcCkgeworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQltZW1zZXQocmVzcCwgMCwgcmVzU3opOworCQlpZiAocmV0U3pwKQorCQkJKnJldFN6cCA9IHJlc1N6OworCX0KKwlyZXR1cm4gcmVzcDsKK30KKworc3RhdGljIHZvaWQKK3NnX3BhZ2VfZnJlZShjaGFyICpidWZmLCBpbnQgc2l6ZSkKK3sKKwlpbnQgb3JkZXIsIGFfc2l6ZTsKKworCWlmICghYnVmZikKKwkJcmV0dXJuOworCWZvciAob3JkZXIgPSAwLCBhX3NpemUgPSBQQUdFX1NJWkU7IGFfc2l6ZSA8IHNpemU7CisJICAgICBvcmRlcisrLCBhX3NpemUgPDw9IDEpIDsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBidWZmLCBvcmRlcik7Cit9CisKKyNpZm5kZWYgTUFJTlRFTkFOQ0VfSU5fQ01ECisjZGVmaW5lIE1BSU5URU5BTkNFX0lOX0NNRCAweGEzCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWxsb3dfb3BzW10gPSB7IFRFU1RfVU5JVF9SRUFEWSwgUkVRVUVTVF9TRU5TRSwKKwlJTlFVSVJZLCBSRUFEX0NBUEFDSVRZLCBSRUFEX0JVRkZFUiwgUkVBRF82LCBSRUFEXzEwLCBSRUFEXzEyLAorCVJFQURfMTYsIE1PREVfU0VOU0UsIE1PREVfU0VOU0VfMTAsIExPR19TRU5TRSwgUkVQT1JUX0xVTlMsCisJU0VSVklDRV9BQ1RJT05fSU4sIFJFQ0VJVkVfRElBR05PU1RJQywgUkVBRF9MT05HLCBNQUlOVEVOQU5DRV9JTl9DTUQKK307CisKK3N0YXRpYyBpbnQKK3NnX2FsbG93X2FjY2Vzcyh1bnNpZ25lZCBjaGFyIG9wY29kZSwgY2hhciBkZXZfdHlwZSkKK3sKKwlpbnQgazsKKworCWlmIChUWVBFX1NDQU5ORVIgPT0gZGV2X3R5cGUpCS8qIFRZUEVfUk9NIG1heWJlIGJ1cm5lciAqLworCQlyZXR1cm4gMTsKKwlmb3IgKGsgPSAwOyBrIDwgc2l6ZW9mIChhbGxvd19vcHMpOyArK2spIHsKKwkJaWYgKG9wY29kZSA9PSBhbGxvd19vcHNba10pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCitzdGF0aWMgaW50CitzZ19sYXN0X2Rldih2b2lkKQoreworCWludCBrOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlmb3IgKGsgPSBzZ19kZXZfbWF4IC0gMTsgayA+PSAwOyAtLWspCisJCWlmIChzZ19kZXZfYXJyW2tdICYmIHNnX2Rldl9hcnJba10tPmRldmljZSkKKwkJCWJyZWFrOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwlyZXR1cm4gayArIDE7CQkvKiBvcmlnaW4gMSAqLworfQorI2VuZGlmCisKK3N0YXRpYyBTZ19kZXZpY2UgKgorc2dfZ2V0X2RldihpbnQgZGV2KQoreworCVNnX2RldmljZSAqc2RwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCWlmIChzZ19kZXZfYXJyICYmIChkZXYgPj0gMCkpIHsKKwkJcmVhZF9sb2NrX2lycXNhdmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwkJaWYgKGRldiA8IHNnX2Rldl9tYXgpCisJCQlzZHAgPSBzZ19kZXZfYXJyW2Rldl07CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNnX2Rldl9hcnJfbG9jaywgaWZsYWdzKTsKKwl9CisJcmV0dXJuIHNkcDsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc2dfcHJvY19zZ3AgPSBOVUxMOworCitzdGF0aWMgY2hhciBzZ19wcm9jX3NnX2Rpcm5hbWVbXSA9ICJzY3NpL3NnIjsKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2ludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpOworCitzdGF0aWMgaW50IHNnX3Byb2Nfc2luZ2xlX29wZW5fYWRpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3NpemVfdCBzZ19wcm9jX3dyaXRlX2FkaW8oc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZik7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGlvX2ZvcHMgPSB7CisJLyogLm93bmVyLCAucmVhZCBhbmQgLmxsc2VlayBhZGRlZCBpbiBzZ19wcm9jX2luaXQoKSAqLworCS5vcGVuID0gc2dfcHJvY19zaW5nbGVfb3Blbl9hZGlvLAorCS53cml0ZSA9IHNnX3Byb2Nfd3JpdGVfYWRpbywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2RyZXNzeihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3NpemVfdCBzZ19wcm9jX3dyaXRlX2RyZXNzeihzdHJ1Y3QgZmlsZSAqZmlscCwgCisJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHJlc3N6X2ZvcHMgPSB7CisJLm9wZW4gPSBzZ19wcm9jX3NpbmdsZV9vcGVuX2RyZXNzeiwKKwkud3JpdGUgPSBzZ19wcm9jX3dyaXRlX2RyZXNzeiwKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X3ZlcnNpb24oc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZlcnNpb25fZm9wcyA9IHsKKwkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fdmVyc2lvbiwKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RldmhkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpOworc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2RldmhkcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZoZHJfZm9wcyA9IHsKKwkub3BlbiA9IHNnX3Byb2Nfc2luZ2xlX29wZW5fZGV2aGRyLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHNnX3Byb2Nfc2VxX3Nob3dfZGV2KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdik7CitzdGF0aWMgaW50IHNnX3Byb2Nfb3Blbl9kZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHZvaWQgKiBkZXZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgKiBkZXZfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCBkZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldl9mb3BzID0geworCS5vcGVuID0gc2dfcHJvY19vcGVuX2RldiwKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGV2X3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKKwkubmV4dCAgPSBkZXZfc2VxX25leHQsCisJLnN0b3AgID0gZGV2X3NlcV9zdG9wLAorCS5zaG93ICA9IHNnX3Byb2Nfc2VxX3Nob3dfZGV2LAorfTsKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RldnN0cnMoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgc2dfcHJvY19vcGVuX2RldnN0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2c3Ryc19mb3BzID0geworCS5vcGVuID0gc2dfcHJvY19vcGVuX2RldnN0cnMsCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldnN0cnNfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBkZXZfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGRldl9zZXFfbmV4dCwKKwkuc3RvcCAgPSBkZXZfc2VxX3N0b3AsCisJLnNob3cgID0gc2dfcHJvY19zZXFfc2hvd19kZXZzdHJzLAorfTsKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RlYnVnKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdik7CitzdGF0aWMgaW50IHNnX3Byb2Nfb3Blbl9kZWJ1ZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19mb3BzID0geworCS5vcGVuID0gc2dfcHJvY19vcGVuX2RlYnVnLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9Oworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZWJ1Z19zZXFfb3BzID0geworCS5zdGFydCA9IGRldl9zZXFfc3RhcnQsCisJLm5leHQgID0gZGV2X3NlcV9uZXh0LAorCS5zdG9wICA9IGRldl9zZXFfc3RvcCwKKwkuc2hvdyAgPSBzZ19wcm9jX3NlcV9zaG93X2RlYnVnLAorfTsKKworCitzdHJ1Y3Qgc2dfcHJvY19sZWFmIHsKKwljb25zdCBjaGFyICogbmFtZTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICogZm9wczsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2dfcHJvY19sZWFmIHNnX3Byb2NfbGVhZl9hcnJbXSA9IHsKKwl7ImFsbG93X2RpbyIsICZhZGlvX2ZvcHN9LAorCXsiZGVidWciLCAmZGVidWdfZm9wc30sCisJeyJkZWZfcmVzZXJ2ZWRfc2l6ZSIsICZkcmVzc3pfZm9wc30sCisJeyJkZXZpY2VfaGRyIiwgJmRldmhkcl9mb3BzfSwKKwl7ImRldmljZXMiLCAmZGV2X2ZvcHN9LAorCXsiZGV2aWNlX3N0cnMiLCAmZGV2c3Ryc19mb3BzfSwKKwl7InZlcnNpb24iLCAmdmVyc2lvbl9mb3BzfQorfTsKKworc3RhdGljIGludAorc2dfcHJvY19pbml0KHZvaWQpCit7CisJaW50IGssIG1hc2s7CisJaW50IG51bV9sZWF2ZXMgPQorCSAgICBzaXplb2YgKHNnX3Byb2NfbGVhZl9hcnIpIC8gc2l6ZW9mIChzZ19wcm9jX2xlYWZfYXJyWzBdKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZXA7CisJc3RydWN0IHNnX3Byb2NfbGVhZiAqIGxlYWY7CisKKwlzZ19wcm9jX3NncCA9IGNyZWF0ZV9wcm9jX2VudHJ5KHNnX3Byb2Nfc2dfZGlybmFtZSwKKwkJCQkJU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLCBOVUxMKTsKKwlpZiAoIXNnX3Byb2Nfc2dwKQorCQlyZXR1cm4gMTsKKwlmb3IgKGsgPSAwOyBrIDwgbnVtX2xlYXZlczsgKytrKSB7CisJCWxlYWYgPSAmc2dfcHJvY19sZWFmX2FycltrXTsKKwkJbWFzayA9IGxlYWYtPmZvcHMtPndyaXRlID8gU19JUlVHTyB8IFNfSVdVU1IgOiBTX0lSVUdPOworCQlwZGVwID0gY3JlYXRlX3Byb2NfZW50cnkobGVhZi0+bmFtZSwgbWFzaywgc2dfcHJvY19zZ3ApOworCQlpZiAocGRlcCkgeworCQkJbGVhZi0+Zm9wcy0+b3duZXIgPSBUSElTX01PRFVMRSwKKwkJCWxlYWYtPmZvcHMtPnJlYWQgPSBzZXFfcmVhZCwKKwkJCWxlYWYtPmZvcHMtPmxsc2VlayA9IHNlcV9sc2VlaywKKwkJCXBkZXAtPnByb2NfZm9wcyA9IGxlYWYtPmZvcHM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZ19wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgazsKKwlpbnQgbnVtX2xlYXZlcyA9CisJICAgIHNpemVvZiAoc2dfcHJvY19sZWFmX2FycikgLyBzaXplb2YgKHNnX3Byb2NfbGVhZl9hcnJbMF0pOworCisJaWYgKCFzZ19wcm9jX3NncCkKKwkJcmV0dXJuOworCWZvciAoayA9IDA7IGsgPCBudW1fbGVhdmVzOyArK2spCisJCXJlbW92ZV9wcm9jX2VudHJ5KHNnX3Byb2NfbGVhZl9hcnJba10ubmFtZSwgc2dfcHJvY19zZ3ApOworCXJlbW92ZV9wcm9jX2VudHJ5KHNnX3Byb2Nfc2dfZGlybmFtZSwgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2ludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihzLCAiJWRcbiIsICooKGludCAqKXMtPnByaXZhdGUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NpbmdsZV9vcGVuX2FkaW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNnX3Byb2Nfc2VxX3Nob3dfaW50LCAmc2dfYWxsb3dfZGlvKTsKK30KKworc3RhdGljIHNzaXplX3QgCitzZ19wcm9jX3dyaXRlX2FkaW8oc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisJaW50IG51bTsKKwljaGFyIGJ1ZmZbMTFdOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwludW0gPSAoY291bnQgPCAxMCkgPyBjb3VudCA6IDEwOworCWlmIChjb3B5X2Zyb21fdXNlcihidWZmLCBidWZmZXIsIG51bSkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZmZbbnVtXSA9ICdcMCc7CisJc2dfYWxsb3dfZGlvID0gc2ltcGxlX3N0cnRvdWwoYnVmZiwgTlVMTCwgMTApID8gMSA6IDA7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfc2luZ2xlX29wZW5fZHJlc3N6KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZ19wcm9jX3NlcV9zaG93X2ludCwgJnNnX2JpZ19idWZmKTsKK30KKworc3RhdGljIHNzaXplX3QgCitzZ19wcm9jX3dyaXRlX2RyZXNzeihzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCWludCBudW07CisJdW5zaWduZWQgbG9uZyBrID0gVUxPTkdfTUFYOworCWNoYXIgYnVmZlsxMV07CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRUFDQ0VTOworCW51bSA9IChjb3VudCA8IDEwKSA/IGNvdW50IDogMTA7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmYsIGJ1ZmZlciwgbnVtKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmZltudW1dID0gJ1wwJzsKKwlrID0gc2ltcGxlX3N0cnRvdWwoYnVmZiwgTlVMTCwgMTApOworCWlmIChrIDw9IDEwNDg1NzYpIHsJLyogbGltaXQgImJpZyBidWZmIiB0byAxIE1CICovCisJCXNnX2JpZ19idWZmID0gazsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gLUVSQU5HRTsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X3ZlcnNpb24oc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXNlcV9wcmludGYocywgIiVkXHQlcyBbJXNdXG4iLCBzZ192ZXJzaW9uX251bSwgU0dfVkVSU0lPTl9TVFIsCisJCSAgIHNnX3ZlcnNpb25fZGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZ19wcm9jX3NlcV9zaG93X3ZlcnNpb24sIE5VTEwpOworfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfc2VxX3Nob3dfZGV2aGRyKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzZXFfcHJpbnRmKHMsICJob3N0XHRjaGFuXHRpZFx0bHVuXHR0eXBlXHRvcGVuc1x0cWRlcHRoXHRidXN5XHQiCisJCSAgICJvbmxpbmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfc2luZ2xlX29wZW5fZGV2aGRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZ19wcm9jX3NlcV9zaG93X2RldmhkciwgTlVMTCk7Cit9CisKK3N0cnVjdCBzZ19wcm9jX2Rldml0ZXIgeworCWxvZmZfdAlpbmRleDsKKwlzaXplX3QJbWF4OworfTsKKworc3RhdGljIHZvaWQgKiBkZXZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqIGl0ID0ga21hbGxvYyhzaXplb2YoKml0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoISBpdCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKE5VTEwgPT0gc2dfZGV2X2FycikKKwkJZ290byBlcnIxOworCWl0LT5pbmRleCA9ICpwb3M7CisJaXQtPm1heCA9IHNnX2xhc3RfZGV2KCk7CisJaWYgKGl0LT5pbmRleCA+PSBpdC0+bWF4KQorCQlnb3RvIGVycjE7CisJcmV0dXJuIGl0OworZXJyMToKKwlrZnJlZShpdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICogZGV2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqIGl0ID0gKHN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKikgdjsKKworCSpwb3MgPSArK2l0LT5pbmRleDsKKwlyZXR1cm4gKGl0LT5pbmRleCA8IGl0LT5tYXgpID8gaXQgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCWtmcmVlICh2KTsKK30KKworc3RhdGljIGludCBzZ19wcm9jX29wZW5fZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgICAgICByZXR1cm4gc2VxX29wZW4oZmlsZSwgJmRldl9zZXFfb3BzKTsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RldihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqIGl0ID0gKHN0cnVjdCBzZ19wcm9jX2Rldml0ZXIgKikgdjsKKwlTZ19kZXZpY2UgKnNkcDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkcDsKKworCXNkcCA9IGl0ID8gc2dfZ2V0X2RldihpdC0+aW5kZXgpIDogTlVMTDsKKwlpZiAoc2RwICYmIChzY3NpZHAgPSBzZHAtPmRldmljZSkgJiYgKCFzZHAtPmRldGFjaGVkKSkKKwkJc2VxX3ByaW50ZihzLCAiJWRcdCVkXHQlZFx0JWRcdCVkXHQlZFx0JWRcdCVkXHQlZFxuIiwKKwkJCSAgICAgIHNjc2lkcC0+aG9zdC0+aG9zdF9ubywgc2NzaWRwLT5jaGFubmVsLAorCQkJICAgICAgc2NzaWRwLT5pZCwgc2NzaWRwLT5sdW4sIChpbnQpIHNjc2lkcC0+dHlwZSwKKwkJCSAgICAgIDEsCisJCQkgICAgICAoaW50KSBzY3NpZHAtPnF1ZXVlX2RlcHRoLAorCQkJICAgICAgKGludCkgc2NzaWRwLT5kZXZpY2VfYnVzeSwKKwkJCSAgICAgIChpbnQpIHNjc2lfZGV2aWNlX29ubGluZShzY3NpZHApKTsKKwllbHNlCisJCXNlcV9wcmludGYocywgIi0xXHQtMVx0LTFcdC0xXHQtMVx0LTFcdC0xXHQtMVx0LTFcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfb3Blbl9kZXZzdHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgICAgICByZXR1cm4gc2VxX29wZW4oZmlsZSwgJmRldnN0cnNfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgc2dfcHJvY19zZXFfc2hvd19kZXZzdHJzKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc2dfcHJvY19kZXZpdGVyICogaXQgPSAoc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqKSB2OworCVNnX2RldmljZSAqc2RwOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRwOworCisJc2RwID0gaXQgPyBzZ19nZXRfZGV2KGl0LT5pbmRleCkgOiBOVUxMOworCWlmIChzZHAgJiYgKHNjc2lkcCA9IHNkcC0+ZGV2aWNlKSAmJiAoIXNkcC0+ZGV0YWNoZWQpKQorCQlzZXFfcHJpbnRmKHMsICIlOC44c1x0JTE2LjE2c1x0JTQuNHNcbiIsCisJCQkgICBzY3NpZHAtPnZlbmRvciwgc2NzaWRwLT5tb2RlbCwgc2NzaWRwLT5yZXYpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzLCAiPG5vIGFjdGl2ZSBkZXZpY2U+XG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2dfcHJvY19kZWJ1Z19oZWxwZXIoc3RydWN0IHNlcV9maWxlICpzLCBTZ19kZXZpY2UgKiBzZHApCit7CisJaW50IGssIG0sIG5ld19pbnRlcmZhY2UsIGJsZW4sIHVzZzsKKwlTZ19yZXF1ZXN0ICpzcnA7CisJU2dfZmQgKmZwOworCWNvbnN0IHNnX2lvX2hkcl90ICpocDsKKwljb25zdCBjaGFyICogY3A7CisKKwlmb3IgKGsgPSAwOyAoZnAgPSBzZ19nZXRfbnRoX3NmcChzZHAsIGspKTsgKytrKSB7CisJCXNlcV9wcmludGYocywgIiAgIEZEKCVkKTogdGltZW91dD0lZG1zIGJ1ZmZsZW49JWQgIgorCQkJICAgIihyZXMpc2dhdD0lZCBsb3dfZG1hPSVkXG4iLCBrICsgMSwKKwkJCSAgIGppZmZpZXNfdG9fbXNlY3MoZnAtPnRpbWVvdXQpLAorCQkJICAgZnAtPnJlc2VydmUuYnVmZmxlbiwKKwkJCSAgIChpbnQpIGZwLT5yZXNlcnZlLmtfdXNlX3NnLAorCQkJICAgKGludCkgZnAtPmxvd19kbWEpOworCQlzZXFfcHJpbnRmKHMsICIgICBjbWRfcT0lZCBmX3BhY2tpZD0lZCBrX29ycGhhbj0lZCBjbG9zZWQ9JWRcbiIsCisJCQkgICAoaW50KSBmcC0+Y21kX3EsIChpbnQpIGZwLT5mb3JjZV9wYWNraWQsCisJCQkgICAoaW50KSBmcC0+a2VlcF9vcnBoYW4sIChpbnQpIGZwLT5jbG9zZWQpOworCQlmb3IgKG0gPSAwOyAoc3JwID0gc2dfZ2V0X250aF9yZXF1ZXN0KGZwLCBtKSk7ICsrbSkgeworCQkJaHAgPSAmc3JwLT5oZWFkZXI7CisJCQluZXdfaW50ZXJmYWNlID0gKGhwLT5pbnRlcmZhY2VfaWQgPT0gJ1wwJykgPyAwIDogMTsKKwkJCWlmIChzcnAtPnJlc191c2VkKSB7CisJCQkJaWYgKG5ld19pbnRlcmZhY2UgJiYgCisJCQkJICAgIChTR19GTEFHX01NQVBfSU8gJiBocC0+ZmxhZ3MpKQorCQkJCQljcCA9ICIgICAgIG1tYXA+PiAiOworCQkJCWVsc2UKKwkJCQkJY3AgPSAiICAgICByYj4+ICI7CisJCQl9IGVsc2UgeworCQkJCWlmIChTR19JTkZPX0RJUkVDVF9JT19NQVNLICYgaHAtPmluZm8pCisJCQkJCWNwID0gIiAgICAgZGlvPj4gIjsKKwkJCQllbHNlCisJCQkJCWNwID0gIiAgICAgIjsKKwkJCX0KKwkJCXNlcV9wcmludGYocywgY3ApOworCQkJYmxlbiA9IHNycC0+bXlfY21kcCA/IAorCQkJCXNycC0+bXlfY21kcC0+c3JfYnVmZmxlbiA6IHNycC0+ZGF0YS5idWZmbGVuOworCQkJdXNnID0gc3JwLT5teV9jbWRwID8gCisJCQkJc3JwLT5teV9jbWRwLT5zcl91c2Vfc2cgOiBzcnAtPmRhdGEua191c2Vfc2c7CisJCQlzZXFfcHJpbnRmKHMsIHNycC0+ZG9uZSA/IAorCQkJCSAgICgoMSA9PSBzcnAtPmRvbmUpID8gICJyY3Y6IiA6ICJmaW46IikKKwkJCQkgICA6IChzcnAtPm15X2NtZHAgPyAiYWN0OiIgOiAicHJpb3I6IikpOworCQkJc2VxX3ByaW50ZihzLCAiIGlkPSVkIGJsZW49JWQiLAorCQkJCSAgIHNycC0+aGVhZGVyLnBhY2tfaWQsIGJsZW4pOworCQkJaWYgKHNycC0+ZG9uZSkKKwkJCQlzZXFfcHJpbnRmKHMsICIgZHVyPSVkIiwgaHAtPmR1cmF0aW9uKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKHMsICIgdF9vL2VsYXA9JWQvJWQiLAorCQkJCSAgbmV3X2ludGVyZmFjZSA/IGhwLT50aW1lb3V0IDogamlmZmllc190b19tc2VjcyhmcC0+dGltZW91dCksCisJCQkJICBqaWZmaWVzX3RvX21zZWNzKGhwLT5kdXJhdGlvbiA/IChqaWZmaWVzIC0gaHAtPmR1cmF0aW9uKSA6IDApKTsKKwkJCXNlcV9wcmludGYocywgIm1zIHNnYXQ9JWQgb3A9MHglMDJ4XG4iLCB1c2csCisJCQkJICAgKGludCkgc3JwLT5kYXRhLmNtZF9vcGNvZGUpOworCQl9CisJCWlmICgwID09IG0pCisJCQlzZXFfcHJpbnRmKHMsICIgICAgIE5vIHJlcXVlc3RzIGFjdGl2ZVxuIik7CisJfQorfQorCitzdGF0aWMgaW50IHNnX3Byb2Nfb3Blbl9kZWJ1ZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICAgcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkZWJ1Z19zZXFfb3BzKTsKK30KKworc3RhdGljIGludCBzZ19wcm9jX3NlcV9zaG93X2RlYnVnKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc2dfcHJvY19kZXZpdGVyICogaXQgPSAoc3RydWN0IHNnX3Byb2NfZGV2aXRlciAqKSB2OworCVNnX2RldmljZSAqc2RwOworCisJaWYgKGl0ICYmICgwID09IGl0LT5pbmRleCkpIHsKKwkJc2VxX3ByaW50ZihzLCAiZGV2X21heChjdXJyZW50bHkpPSVkIG1heF9hY3RpdmVfZGV2aWNlPSVkICIKKwkJCSAgICIob3JpZ2luIDEpXG4iLCBzZ19kZXZfbWF4LCAoaW50KWl0LT5tYXgpOworCQlzZXFfcHJpbnRmKHMsICIgZGVmX3Jlc2VydmVkX3NpemU9JWRcbiIsIHNnX2JpZ19idWZmKTsKKwl9CisJc2RwID0gaXQgPyBzZ19nZXRfZGV2KGl0LT5pbmRleCkgOiBOVUxMOworCWlmIChzZHApIHsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZHAgPSBzZHAtPmRldmljZTsKKworCQlpZiAoTlVMTCA9PSBzY3NpZHApIHsKKwkJCXNlcV9wcmludGYocywgImRldmljZSAlZCBkZXRhY2hlZCA/P1xuIiwgCisJCQkJICAgKGludClpdC0+aW5kZXgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoc2dfZ2V0X250aF9zZnAoc2RwLCAwKSkgeworCQkJc2VxX3ByaW50ZihzLCAiID4+PiBkZXZpY2U9JXMgIiwKKwkJCQlzZHAtPmRpc2stPmRpc2tfbmFtZSk7CisJCQlpZiAoc2RwLT5kZXRhY2hlZCkKKwkJCQlzZXFfcHJpbnRmKHMsICJkZXRhY2hlZCBwZW5kaW5nIGNsb3NlICIpOworCQkJZWxzZQorCQkJCXNlcV9wcmludGYKKwkJCQkgICAgKHMsICJzY3NpJWQgY2hhbj0lZCBpZD0lZCBsdW49JWQgICBlbT0lZCIsCisJCQkJICAgICBzY3NpZHAtPmhvc3QtPmhvc3Rfbm8sCisJCQkJICAgICBzY3NpZHAtPmNoYW5uZWwsIHNjc2lkcC0+aWQsCisJCQkJICAgICBzY3NpZHAtPmx1biwKKwkJCQkgICAgIHNjc2lkcC0+aG9zdC0+aG9zdHQtPmVtdWxhdGVkKTsKKwkJCXNlcV9wcmludGYocywgIiBzZ190YWJsZXNpemU9JWQgZXhjbD0lZFxuIiwKKwkJCQkgICBzZHAtPnNnX3RhYmxlc2l6ZSwgc2RwLT5leGNsdWRlKTsKKwkJfQorCQlzZ19wcm9jX2RlYnVnX2hlbHBlcihzLCBzZHApOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCQkJCS8qIENPTkZJR19TQ1NJX1BST0NfRlMgKi8KKworbW9kdWxlX2luaXQoaW5pdF9zZyk7Cittb2R1bGVfZXhpdChleGl0X3NnKTsKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKFNDU0lfR0VORVJJQ19NQUpPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2dpd2Q5My5jIGIvZHJpdmVycy9zY3NpL3NnaXdkOTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBmMmFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NnaXdkOTMuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRtQGVuZ3Iuc2dpLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5OSBBbmRyZXcgUi4gQmFrZXIgKGFuZHJld2JAdWFiLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGbG9yaWFuIExvaG9mZiAoZmxvQHJmYzgyMi5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQorICogCisgKiAoSW4gYWxsIHRydXRoLCBKZWQgU2NoaW1tZWwgd3JvdGUgYWxsIHRoaXMgY29kZS4pCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2dpYWxpYi5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvc2dpLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9tYy5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaXAyMi5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgIndkMzNjOTMuaCIKKyNpbmNsdWRlICJzZ2l3ZDkzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpZiAwCisjZGVmaW5lIERQUklOVEsoYXJncy4uLikJcHJpbnRrKGFyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBIREFUQShwdHIpICgoc3RydWN0IGlwMjJfaG9zdGRhdGEgKikoKHB0ciktPmhvc3RkYXRhKSkKKworc3RydWN0IGlwMjJfaG9zdGRhdGEgeworCXN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhIHdoOworCXN0cnVjdCBocGNfZGF0YSB7CisJCWRtYV9hZGRyX3QgICAgICBkbWE7CisJCXZvaWQgICAgICAgICAgICAqIGNwdTsKKwl9IGhkOworfTsKKworc3RydWN0IGhwY19jaHVuayB7CisJc3RydWN0IGhwY19kbWFfZGVzYyBkZXNjOworCXUzMiBfcGFkZGluZzsJLyogYWxpZ24gdG8gcXVhZHdvcmQgYm91bmRhcnkgKi8KK307CisKK3N0cnVjdCBTY3NpX0hvc3QgKnNnaXdkOTNfaG9zdDsKK3N0cnVjdCBTY3NpX0hvc3QgKnNnaXdkOTNfaG9zdDE7CisKKy8qIFd1ZmYgd3VmZiwgd3VmZiwgd2QzM2M5My5jLCB3dWZmIHd1ZmYsIG9iamVjdCBvcmllbnRlZCwgYm93IHdvdy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93ZDMzYzkzX2NvdW50KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCSpyZWdzLlNBU1IgPSBXRF9UUkFOU0ZFUl9DT1VOVF9NU0I7CisJbWIoKTsKKwkqcmVncy5TQ01EID0gKCh2YWx1ZSA+PiAxNikgJiAweGZmKTsKKwkqcmVncy5TQ01EID0gKCh2YWx1ZSA+PiAgOCkgJiAweGZmKTsKKwkqcmVncy5TQ01EID0gKCh2YWx1ZSA+PiAgMCkgJiAweGZmKTsKKwltYigpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF93ZDMzYzkzX2NvdW50KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkqcmVncy5TQVNSID0gV0RfVFJBTlNGRVJfQ09VTlRfTVNCOworCW1iKCk7CisJdmFsdWUgPSAgKCgqcmVncy5TQ01EICYgMHhmZikgPDwgMTYpOworCXZhbHVlIHw9ICgoKnJlZ3MuU0NNRCAmIDB4ZmYpIDw8ICA4KTsKKwl2YWx1ZSB8PSAoKCpyZWdzLlNDTUQgJiAweGZmKSA8PCAgMCk7CisJbWIoKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZ2l3ZDkzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICogaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopIGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJd2QzM2M5M19pbnRyKGhvc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZmlsbF9ocGNfZW50cmllcyhzdHJ1Y3QgaHBjX2NodW5rICpoY3AsIFNjc2lfQ21uZCAqY21kLCBpbnQgZGF0YWlucCkKK3sKKwl1bnNpZ25lZCBsb25nIGxlbiA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJdm9pZCAqYWRkciA9IGNtZC0+U0NwLnB0cjsKKwlkbWFfYWRkcl90IHBoeXNhZGRyOworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisKKwlwaHlzYWRkciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIGFkZHIsIGxlbiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJY21kLT5TQ3AuZG1hX2hhbmRsZSA9IHBoeXNhZGRyOworCisJd2hpbGUgKGxlbikgeworCQkvKgorCQkgKiBldmVuIGNudGluZm8gY291bGQgYmUgdXAgdG8gMTYzODMsIHdpdGhvdXQKKwkJICogbWFnaWMgb25seSA4MTkyIHdvcmtzIGNvcnJlY3RseQorCQkgKi8KKwkJY291bnQgPSBsZW4gPiA4MTkyID8gODE5MiA6IGxlbjsKKwkJaGNwLT5kZXNjLnBidWYgPSBwaHlzYWRkcjsKKwkJaGNwLT5kZXNjLmNudGluZm8gPSBjb3VudDsKKwkJaGNwKys7CisJCWxlbiAtPSBjb3VudDsKKwkJcGh5c2FkZHIgKz0gY291bnQ7CisJfQorCisJLyoKKwkgKiBUbyBtYWtlIHN1cmUsIGlmIHdlIHRyaXAgYW4gSFBDIGJ1ZywgdGhhdCB3ZSB0cmFuc2ZlciBldmVyeSBzaW5nbGUKKwkgKiBieXRlLCB3ZSB0YWcgb24gYW4gZXh0cmEgemVybyBsZW5ndGggZG1hIGRlc2NyaXB0b3IgYXQgdGhlIGVuZCBvZgorCSAqIHRoZSBjaGFpbi4KKwkgKi8KKwloY3AtPmRlc2MucGJ1ZiA9IDA7CisJaGNwLT5kZXNjLmNudGluZm8gPSBIUENETUFfRU9YOworfQorCitzdGF0aWMgaW50IGRtYV9zZXR1cChTY3NpX0NtbmQgKmNtZCwgaW50IGRhdGFpbnApCit7CisJc3RydWN0IGlwMjJfaG9zdGRhdGEgKmhkYXRhID0gSERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOworCXN0cnVjdCBocGMzX3Njc2lyZWdzICpocmVncyA9CisJCShzdHJ1Y3QgaHBjM19zY3NpcmVncyAqKSBjbWQtPmRldmljZS0+aG9zdC0+YmFzZTsKKwlzdHJ1Y3QgaHBjX2NodW5rICpoY3AgPSAoc3RydWN0IGhwY19jaHVuayAqKSBoZGF0YS0+aGQuY3B1OworCisJRFBSSU5USygiZG1hX3NldHVwOiBkYXRhaW5wPCVkPiBoY3A8JXA+ICIsIGRhdGFpbnAsIGhjcCk7CisKKwloZGF0YS0+d2guZG1hX2RpciA9IGRhdGFpbnA7CisKKwkvKgorCSAqIHdkMzNjOTMgc2hvdWxkbid0IHBhc3MgdXMgYm9ndXMgZG1hX3NldHVwcywgYnV0IGl0IGRvZXM6LSggIFRoZQorCSAqIG90aGVyIHdkMzNjOTMgZHJpdmVycyBkZWFsIHdpdGggaXQgdGhlIHNhbWUgd2F5ICh3aGljaCBpc24ndCB0aGF0CisJICogb2J2aW91cykuICBJTUhPIGEgYmV0dGVyIGZpeCB3b3VsZCBiZSwgbm90IHRvIGRvIHRoZXNlIGRtYSBzZXR1cHMKKwkgKiBpbiB0aGUgZmlyc3QgcGxhY2UuCisJICovCisJaWYgKGNtZC0+U0NwLnB0ciA9PSBOVUxMIHx8IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlmaWxsX2hwY19lbnRyaWVzKGhjcCwgY21kLCBkYXRhaW5wKTsKKworCURQUklOVEsoIiBIUENHT1xuIik7CisKKwkvKiBTdGFydCB1cCB0aGUgSFBDLiAqLworCWhyZWdzLT5uZHB0ciA9IGhkYXRhLT5oZC5kbWE7CisJaWYgKGRhdGFpbnApCisJCWhyZWdzLT5jdHJsID0gSFBDM19TQ1RSTF9BQ1RJVkU7CisJZWxzZQorCQlocmVncy0+Y3RybCA9IEhQQzNfU0NUUkxfQUNUSVZFIHwgSFBDM19TQ1RSTF9ESVI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX3N0b3Aoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIFNjc2lfQ21uZCAqU0NwbnQsCisJCSAgICAgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSBIREFUQShpbnN0YW5jZSk7CisJc3RydWN0IGhwYzNfc2NzaXJlZ3MgKmhyZWdzOworCisJaWYgKCFTQ3BudCkKKwkJcmV0dXJuOworCisJaHJlZ3MgPSAoc3RydWN0IGhwYzNfc2NzaXJlZ3MgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+YmFzZTsKKworCURQUklOVEsoImRtYV9zdG9wOiBzdGF0dXM8JWQ+ICIsIHN0YXR1cyk7CisKKwkvKiBGaXJzdCBzdG9wIHRoZSBIUEMgYW5kIGZsdXNoIGl0J3MgRklGTy4gKi8KKwlpZiAoaGRhdGEtPndoLmRtYV9kaXIpIHsKKwkJaHJlZ3MtPmN0cmwgfD0gSFBDM19TQ1RSTF9GTFVTSDsKKwkJd2hpbGUgKGhyZWdzLT5jdHJsICYgSFBDM19TQ1RSTF9BQ1RJVkUpCisJCQliYXJyaWVyKCk7CisJfQorCWhyZWdzLT5jdHJsID0gMDsKKwlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIFNDcG50LT5TQ3AuZG1hX2hhbmRsZSwgU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsLAorCSAgICAgICAgICAgICAgICAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCURQUklOVEsoIlxuIik7Cit9CisKK3ZvaWQgc2dpd2Q5M19yZXNldCh1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJc3RydWN0IGhwYzNfc2NzaXJlZ3MgKmhyZWdzID0gKHN0cnVjdCBocGMzX3Njc2lyZWdzICopIGJhc2U7CisKKwlocmVncy0+Y3RybCA9IEhQQzNfU0NUUkxfQ1JFU0VUOworCXVkZWxheSg1MCk7CisJaHJlZ3MtPmN0cmwgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9ocGNfY2hhaW4oc3RydWN0IGhwY19kYXRhICpoZCkKK3sKKwlzdHJ1Y3QgaHBjX2NodW5rICpoY3AgPSAoc3RydWN0IGhwY19jaHVuayAqKSBoZC0+Y3B1OworCXN0cnVjdCBocGNfY2h1bmsgKmRtYSA9IChzdHJ1Y3QgaHBjX2NodW5rICopIGhkLT5kbWE7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCisJc3RhcnQgPSAodW5zaWduZWQgbG9uZykgaGNwOworCWVuZCA9IHN0YXJ0ICsgUEFHRV9TSVpFOworCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQloY3AtPmRlc2MucG5leHQgPSAodTMyKSAoZG1hICsgMSk7CisJCWhjcC0+ZGVzYy5jbnRpbmZvID0gSFBDRE1BX0VPWDsKKwkJaGNwKys7IGRtYSsrOworCQlzdGFydCArPSBzaXplb2Yoc3RydWN0IGhwY19jaHVuayk7CisJfTsKKwloY3AtLTsKKwloY3AtPmRlc2MucG5leHQgPSBoZC0+ZG1hOworfQorCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqIF9faW5pdCBzZ2l3ZDkzX3NldHVwX3Njc2koCisJU2NzaV9Ib3N0X1RlbXBsYXRlICpTR0libG93cywgaW50IHVuaXQsIGludCBpcnEsCisJc3RydWN0IGhwYzNfc2NzaXJlZ3MgKmhyZWdzLCB1bnNpZ25lZCBjaGFyICp3ZHJlZ3MpCit7CisJc3RydWN0IGlwMjJfaG9zdGRhdGEgKmhkYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJd2QzM2M5M19yZWdzIHJlZ3M7CisKKwlob3N0ID0gc2NzaV9yZWdpc3RlcihTR0libG93cywgc2l6ZW9mKHN0cnVjdCBpcDIyX2hvc3RkYXRhKSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCWhvc3QtPmJhc2UgPSAodW5zaWduZWQgbG9uZykgaHJlZ3M7CisJaG9zdC0+aXJxID0gaXJxOworCisJaGRhdGEgPSBIREFUQShob3N0KTsKKwloZGF0YS0+aGQuY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIFBBR0VfU0laRSwgJmhkYXRhLT5oZC5kbWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWhkYXRhLT5oZC5jcHUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2dpd2Q5MzogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkgICAgICAgImhvc3QgJWQgYnVmZmVyLlxuIiwgdW5pdCk7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJfQorCWluaXRfaHBjX2NoYWluKCZoZGF0YS0+aGQpOworCisJcmVncy5TQVNSID0gd2RyZWdzICsgMzsKKwlyZWdzLlNDTUQgPSB3ZHJlZ3MgKyA3OworCisJd2QzM2M5M19pbml0KGhvc3QsIHJlZ3MsIGRtYV9zZXR1cCwgZG1hX3N0b3AsIFdEMzNDOTNfRlNfMTZfMjApOworCisJaGRhdGEtPndoLm5vX3N5bmMgPSAwOworCisJaWYgKHJlcXVlc3RfaXJxKGlycSwgc2dpd2Q5M19pbnRyLCAwLCAiU0dJIFdEOTMiLCAodm9pZCAqKSBob3N0KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZ2l3ZDkzOiBDb3VsZCBub3QgcmVnaXN0ZXIgaXJxICVkICIKKwkJICAgICAgICJmb3IgaG9zdCAlZC5cbiIsIGlycSwgdW5pdCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXJldHVybiBob3N0OworCitvdXRfZnJlZToKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBQQUdFX1NJWkUsIGhkYXRhLT5oZC5jcHUsIGhkYXRhLT5oZC5kbWEpOworCXdkMzNjOTNfcmVsZWFzZSgpOworCitvdXRfdW5yZWdpc3RlcjoKKwlzY3NpX3VucmVnaXN0ZXIoaG9zdCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IF9faW5pdCBzZ2l3ZDkzX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKlNHSWJsb3dzKQoreworCWludCBmb3VuZCA9IDA7CisKKwlTR0libG93cy0+cHJvY19uYW1lID0gIlNHSVdEOTMiOworCXNnaXdkOTNfaG9zdCA9IHNnaXdkOTNfc2V0dXBfc2NzaShTR0libG93cywgMCwgU0dJX1dEOTNfMF9JUlEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZocGMzYzAtPnNjc2lfY2hhbjAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaHBjM2MwLT5zY3NpMF9leHQpOworCWlmIChzZ2l3ZDkzX2hvc3QpCisJCWZvdW5kKys7CisKKwkvKiBTZXQgdXAgc2Vjb25kIGNvbnRyb2xsZXIgb24gdGhlIEluZGlnbzIgKi8KKwlpZiAoaXAyMl9pc19mdWxsaG91c2UoKSkgeworCQlzZ2l3ZDkzX2hvc3QxID0gc2dpd2Q5M19zZXR1cF9zY3NpKFNHSWJsb3dzLCAxLCBTR0lfV0Q5M18xX0lSUSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAmaHBjM2MwLT5zY3NpX2NoYW4xLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaHBjM2MwLT5zY3NpMV9leHQpOworCQlpZiAoc2dpd2Q5M19ob3N0MSkKKwkJCWZvdW5kKys7CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCitpbnQgc2dpd2Q5M19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCXN0cnVjdCBpcDIyX2hvc3RkYXRhICpoZGF0YSA9IEhEQVRBKGluc3RhbmNlKTsKKwlpbnQgaXJxID0gMDsKKworCWlmIChzZ2l3ZDkzX2hvc3QgJiYgc2dpd2Q5M19ob3N0ID09IGluc3RhbmNlKQorCQlpcnEgPSBTR0lfV0Q5M18wX0lSUTsKKwllbHNlIGlmIChzZ2l3ZDkzX2hvc3QxICYmIHNnaXdkOTNfaG9zdDEgPT0gaW5zdGFuY2UpCisJCWlycSA9IFNHSV9XRDkzXzFfSVJROworCisJZnJlZV9pcnEoaXJxLCBzZ2l3ZDkzX2ludHIpOworCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIFBBR0VfU0laRSwgaGRhdGEtPmhkLmNwdSwgaGRhdGEtPmhkLmRtYSk7CisJd2QzM2M5M19yZWxlYXNlKCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZ2l3ZDkzX2J1c19yZXNldChTY3NpX0NtbmQgKmNtZCkKK3sKKwkvKiBGSVhNRSBwZXJmb3JtIGJ1cy1zcGVjaWZpYyByZXNldCAqLworCXdkMzNjOTNfaG9zdF9yZXNldChjbWQpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKgorICogS2x1ZGdlIGFsZXJ0IC0gdGhlIFNDU0kgY29kZSBjYWxscyB0aGUgYWJvcnQgYW5kIHJlc2V0IG1ldGhvZCB3aXRoIGludAorICogYXJndW1lbnRzIG5vdCB3aXRoIHBvaW50ZXJzLiAgU28gdGhpcyBpcyBnb2luZyB0byBibG93IHVwIGJlYXV0eWZ1bGx5CisgKiBvbiA2NC1iaXQgc3lzdGVtcyB3aXRoIG1lbW9yeSBvdXRzaWRlIHRoZSBjb21wYXQgYWRkcmVzcyBzcGFjZXMuCisgKi8KK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCT0gIlNHSVdEOTMiLAorCS5uYW1lCQkJPSAiU0dJIFdEOTMiLAorCS5kZXRlY3QJCQk9IHNnaXdkOTNfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IHNnaXdkOTNfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kCQk9IHdkMzNjOTNfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gd2QzM2M5M19hYm9ydCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBzZ2l3ZDkzX2J1c19yZXNldCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gd2QzM2M5M19ob3N0X3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gQ0FOX1FVRVVFLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCisJLmNtZF9wZXJfbHVuCQk9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2dpd2Q5My5oIGIvZHJpdmVycy9zY3NpL3NnaXdkOTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODFkMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NnaXdkOTMuaApAQCAtMCwwICsxLDI0IEBACisvKiAkSWQ6IHNnaXdkOTMuaCx2IDEuNSAxOTk4LzA4LzI1IDA5OjE4OjUwIHJhbGYgRXhwICQKKyAqIHNnaXdkOTMuaDogU0dJIFdEOTMgc2NzaSBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCisgKi8KKyNpZm5kZWYgX1NHSVdEOTNfSAorI2RlZmluZSBfU0dJV0Q5M19ICisKKyNpZm5kZWYgQ01EX1BFUl9MVU4KKyNkZWZpbmUgQ01EX1BFUl9MVU4gOAorI2VuZGlmCisKKyNpZm5kZWYgQ0FOX1FVRVVFCisjZGVmaW5lIENBTl9RVUVVRSAgIDE2CisjZW5kaWYKKworaW50IHNnaXdkOTNfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK2ludCBzZ2l3ZDkzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOworY29uc3QgY2hhciAqd2QzM2M5M19pbmZvKHZvaWQpOworaW50IHdkMzNjOTNfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK2ludCB3ZDMzYzkzX2Fib3J0KFNjc2lfQ21uZCAqKTsKK2ludCB3ZDMzYzkzX2hvc3RfcmVzZXQoU2NzaV9DbW5kICogU0NwbnQpOworCisjZW5kaWYgLyogIShfU0dJV0Q5M19IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NpbTcxMC5jIGIvZHJpdmVycy9zY3NpL3NpbTcxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYmYyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2ltNzEwLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBzaW03MTAuYyAtIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIEhpcnN0IDxyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIE1DQSBjYXJkIGRldGVjdGlvbiBjb2RlIGJ5IFRyZW50IE1jTmFpci4KKyAqIEZpeGVzIHRvIG5vdCBleHBsaWNpdGx5IG51bCBic3MgZGF0YSBmcm9tIFhhdmllciBCZXN0ZWwuCisgKiBTb21lIG11bHRpYm9hcmQgZml4ZXMgZnJvbSBSb2xmIEVpa2UgQmVlci4KKyAqIEF1dG8gcHJvYmluZyBvZiBFSVNBIGNvbmZpZyBzcGFjZSBmcm9tIFRyZXZvciBIZW1zbGV5LgorICoKKyAqIFJld3JpdHRlbiB0byB1c2UgNTNjNzAwLmMgYnkgSmFtZXMuQm90dG9tbGV5QFN0ZWVsRXllLmNvbQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjaW5jbHVkZSAiNTNjNzAwLmgiCisKKworLyogTXVzdCBiZSBlbm91Z2ggZm9yIGJvdGggRUlTQSBhbmQgTUNBICovCisjZGVmaW5lIE1BWF9TTE9UUyA4CitzdGF0aWMgX191OCBfX2luaXRkYXRhIGlkX2FycmF5W01BWF9TTE9UU10gPSB7IFswIC4uLiBNQVhfU0xPVFMtMV0gPSA3IH07CisKK3N0YXRpYyBjaGFyICpzaW03MTA7CQkvKiBjb21tYW5kIGxpbmUgcGFzc2VkIGJ5IGluc21vZCAqLworCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIEhpcnN0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbXBsZSBOQ1I1M0M3MTAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShzaW03MTAsIGNoYXJwLCAwKTsKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBBUkdfU0VQICcgJworI2Vsc2UKKyNkZWZpbmUgQVJHX1NFUCAnLCcKKyNlbmRpZgorCitzdGF0aWMgX19pbml0IGludAorcGFyYW1fc2V0dXAoY2hhciAqc3RyKQoreworCWNoYXIgKnBvcyA9IHN0ciwgKm5leHQ7CisJaW50IHNsb3QgPSAtMTsKKworCXdoaWxlKHBvcyAhPSBOVUxMICYmIChuZXh0ID0gc3RyY2hyKHBvcywgJzonKSkgIT0gTlVMTCkgeworCQlpbnQgdmFsID0gKGludClzaW1wbGVfc3RydG91bCgrK25leHQsIE5VTEwsIDApOworCisJCWlmKCFzdHJuY21wKHBvcywgInNsb3Q6IiwgNSkpCisJCQlzbG90ID0gdmFsOworCQllbHNlIGlmKCFzdHJuY21wKHBvcywgImlkOiIsIDMpKSB7CisJCQlpZihzbG90ID09IC0xKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2ltNzEwOiBNdXN0IHNwZWNpZnkgc2xvdCBmb3IgaWQgcGFyYW1ldGVyXG4iKTsKKwkJCX0gZWxzZSBpZihzbG90ID4gTUFYX1NMT1RTKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2ltNzEwOiBJbGxlZ2FsIHNsb3QgJWQgZm9yIGlkICVkXG4iLCBzbG90LCB2YWwpOworCQkJfSBlbHNlIHsKKwkJCQlpZF9hcnJheVtzbG90XSA9IHZhbDsKKwkJCX0KKwkJfQorCQlpZigocG9zID0gc3RyY2hyKHBvcywgQVJHX1NFUCkpICE9IE5VTEwpCisJCQlwb3MrKzsKKwl9CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJzaW03MTA9IiwgcGFyYW1fc2V0dXApOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzaW03MTBfZHJpdmVyX3RlbXBsYXRlID0geworCS5uYW1lCQkJPSAiTFNJIChTeW1iaW9zKSA3MTAgTUNBL0VJU0EiLAorCS5wcm9jX25hbWUJCT0gInNpbTcxMCIsCisJLnRoaXNfaWQJCT0gNywKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBfX2RldmluaXQgaW50CitzaW03MTBfcHJvYmVfY29tbW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsCisJCSAgICBpbnQgaXJxLCBpbnQgY2xvY2ssIGludCBkaWZmZXJlbnRpYWwsIGludCBzY3NpX2lkKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKiBob3N0ID0gTlVMTDsKKwlzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMgKmhvc3RkYXRhID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzKSwJR0ZQX0tFUk5FTCk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNpbTcxMDogJXNcbiIsIGRldi0+YnVzX2lkKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNpbTcxMDogaXJxID0gJWQsIGNsb2NrID0gJWQsIGJhc2UgPSAweCVseCwgc2NzaV9pZCA9ICVkXG4iLAorCSAgICAgICBpcnEsIGNsb2NrLCBiYXNlX2FkZHIsIHNjc2lfaWQpOworCisJaWYoaG9zdGRhdGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNpbTcxMDogRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoaG9zdGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMpKTsKKworCWlmKHJlcXVlc3RfcmVnaW9uKGJhc2VfYWRkciwgNjQsICJzaW03MTAiKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2ltNzEwOiBGYWlsZWQgdG8gcmVzZXJ2ZSBJTyByZWdpb24gMHglbHhcbiIsCisJCSAgICAgICBiYXNlX2FkZHIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qIEZpbGwgaW4gdGhlIHRocmVlIHJlcXVpcmVkIHBpZWNlcyBvZiBob3N0ZGF0YSAqLworCWhvc3RkYXRhLT5iYXNlID0gYmFzZV9hZGRyOworCWhvc3RkYXRhLT5kaWZmZXJlbnRpYWwgPSBkaWZmZXJlbnRpYWw7CisJaG9zdGRhdGEtPmNsb2NrID0gY2xvY2s7CisJaG9zdGRhdGEtPmNoaXA3MTAgPSAxOworCU5DUl83MDBfc2V0X2lvX21hcHBlZChob3N0ZGF0YSk7CisKKwkvKiBhbmQgcmVnaXN0ZXIgdGhlIGNoaXAgKi8KKwlpZigoaG9zdCA9IE5DUl83MDBfZGV0ZWN0KCZzaW03MTBfZHJpdmVyX3RlbXBsYXRlLCBob3N0ZGF0YSwgZGV2KSkKKwkgICA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2ltNzEwOiBObyBob3N0IGRldGVjdGVkOyBjYXJkIGNvbmZpZ3VyYXRpb24gcHJvYmxlbT9cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwlob3N0LT50aGlzX2lkID0gc2NzaV9pZDsKKwlob3N0LT5pcnEgPSBpcnE7CisJaWYgKHJlcXVlc3RfaXJxKGlycSwgTkNSXzcwMF9pbnRyLCBTQV9TSElSUSwgInNpbTcxMCIsIGhvc3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2ltNzEwOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9wdXRfaG9zdDsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKworCXJldHVybiAwOworCisgb3V0X3B1dF9ob3N0OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7Cisgb3V0X3JlbGVhc2U6CisJcmVsZWFzZV9yZWdpb24oaG9zdC0+YmFzZSwgNjQpOworIG91dF9mcmVlOgorCWtmcmVlKGhvc3RkYXRhKTsKKyBvdXQ6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBfX2RldmV4aXQgaW50CitzaW03MTBfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl90b19zaG9zdChkZXYpOworCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPQorCQkoc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICopaG9zdC0+aG9zdGRhdGFbMF07CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCU5DUl83MDBfcmVsZWFzZShob3N0KTsKKwlrZnJlZShob3N0ZGF0YSk7CisJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19NQ0EKKworLyogQ0FSRCBJRCAwMUJCIGFuZCAwMUJBIHVzZSB0aGUgc2FtZSBwb3MgdmFsdWVzICovCisjZGVmaW5lIE1DQV8wMUJCX0lPX1BPUlRTIHsgMHgwMDAwLCAweDAwMDAsIDB4MDgwMCwgMHgwQzAwLCAweDEwMDAsIDB4MTQwMCwgXAorCQkJICAgIDB4MTgwMCwgMHgxQzAwLCAweDIwMDAsIDB4MjQwMCwgMHgyODAwLCBcCisJCQkgICAgMHgyQzAwLCAweDMwMDAsIDB4MzQwMCwgMHgzODAwLCAweDNDMDAsIFwKKwkJCSAgICAweDQwMDAsIDB4NDQwMCwgMHg0ODAwLCAweDRDMDAsIDB4NTAwMCAgfQorCisjZGVmaW5lIE1DQV8wMUJCX0lSUVMgeyAzLCA1LCAxMSwgMTQgfQorCisvKiBDQVJEIElEIDAwNGYgKi8KKyNkZWZpbmUgTUNBXzAwNEZfSU9fUE9SVFMgeyAweDAwMDAsIDB4MDIwMCwgMHgwMzAwLCAweDA0MDAsIDB4MDUwMCwgIDB4MDYwMCB9CisjZGVmaW5lIE1DQV8wMDRGX0lSUVMgeyA1LCA5LCAxNCB9CisKK3N0YXRpYyBzaG9ydCBzaW03MTBfbWNhX2lkX3RhYmxlW10gPSB7IDB4MDFiYiwgMHgwMWJhLCAweDAwNGYsIDB9OworCitzdGF0aWMgX19pbml0IGludAorc2ltNzEwX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYgPSB0b19tY2FfZGV2aWNlKGRldik7CisJaW50IHNsb3QgPSBtY2FfZGV2LT5zbG90OworCWludCBwb3NbM107CisJdW5zaWduZWQgaW50IGJhc2U7CisJaW50IGlycV92ZWN0b3I7CisJc2hvcnQgaWQgPSBzaW03MTBfbWNhX2lkX3RhYmxlW21jYV9kZXYtPmluZGV4XTsKKwlzdGF0aWMgaW50IGlvXzAwNGZfYnlfcG9zW10gPSBNQ0FfMDA0Rl9JT19QT1JUUzsKKwlzdGF0aWMgaW50IGlycV8wMDRmX2J5X3Bvc1tdID0gTUNBXzAwNEZfSVJRUzsKKwlzdGF0aWMgaW50IGlvXzAxYmJfYnlfcG9zW10gPSBNQ0FfMDFCQl9JT19QT1JUUzsKKwlzdGF0aWMgaW50IGlycV8wMWJiX2J5X3Bvc1tdID0gTUNBXzAxQkJfSVJRUzsKKwljaGFyICpuYW1lOworCWludCBjbG9jazsKKworCXBvc1swXSA9IG1jYV9kZXZpY2VfcmVhZF9zdG9yZWRfcG9zKG1jYV9kZXYsIDIpOworCXBvc1sxXSA9IG1jYV9kZXZpY2VfcmVhZF9zdG9yZWRfcG9zKG1jYV9kZXYsIDMpOworCXBvc1syXSA9IG1jYV9kZXZpY2VfcmVhZF9zdG9yZWRfcG9zKG1jYV9kZXYsIDQpOworCisJLyoKKwkgKiAwMUJCICYgMDFCQSBwb3J0IGJhc2UgYnkgYml0cyA3LDYsNSw0LDMsMiBpbiBwb3NbMl0KKwkgKgorCSAqICAgIDAwMDAwMCAgPGRpc2FibGVkPiAgIDAwMTAxMCAgMHgyODAwCisJICogICAgMDAwMDAxICA8aW52YWxpZD4gICAgMDAxMDExICAweDJDMDAKKwkgKiAgICAwMDAwMTAgIDB4MDgwMCAgICAgICAwMDExMDAgIDB4MzAwMAorCSAqICAgIDAwMDAxMSAgMHgwQzAwICAgICAgIDAwMTEwMSAgMHgzNDAwCisJICogICAgMDAwMTAwICAweDEwMDAgICAgICAgMDAxMTEwICAweDM4MDAKKwkgKiAgICAwMDAxMDEgIDB4MTQwMCAgICAgICAwMDExMTEgIDB4M0MwMAorCSAqICAgIDAwMDExMCAgMHgxODAwICAgICAgIDAxMDAwMCAgMHg0MDAwCisJICogICAgMDAwMTExICAweDFDMDAgICAgICAgMDEwMDAxICAweDQ0MDAKKwkgKiAgICAwMDEwMDAgIDB4MjAwMCAgICAgICAwMTAwMTAgIDB4NDgwMAorCSAqICAgIDAwMTAwMSAgMHgyNDAwICAgICAgIDAxMDAxMSAgMHg0QzAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgMDEwMTAwICAweDUwMDAKKwkgKgorCSAqIDAwRjQgcG9ydCBiYXNlIGJ5IGJpdHMgMywyLDEgaW4gcG9zWzBdCisJICoKKwkgKiAgICAwMDAgIDxkaXNhYmxlZD4gICAgICAwMDEgICAgMHgyMDAKKwkgKiAgICAwMTAgIDB4MzAwICAgICAgICAgICAwMTEgICAgMHg0MDAKKwkgKiAgICAxMDAgIDB4NTAwICAgICAgICAgICAxMDEgICAgMHg2MDAKKwkgKgorCSAqIDAxQkIgJiAwMUJBIElSUSBpcyBzcGVjaWZpZWQgaW4gcG9zWzBdIGJpdHMgNyBhbmQgNjoKKwkgKgorCSAqICAgIDAwICAgMyAgICAgICAgICAgICAgIDEwICAgMTEKKwkgKiAgICAwMSAgIDUgICAgICAgICAgICAgICAxMSAgIDE0CisJICoKKwkgKiAwMEY0IElSUSBzcGVjaWZpZWQgYnkgYml0cyA2LDUsNCBpbiBwb3NbMF0KKwkgKgorCSAqICAgIDEwMCAgIDUgICAgICAgICAgICAgIDEwMSAgICA5CisJICogICAgMTEwICAgMTQKKwkgKi8KKworCWlmIChpZCA9PSAweDAxYmIgfHwgaWQgPT0gMHgwMWJhKSB7CisJCWJhc2UgPSBpb18wMWJiX2J5X3Bvc1socG9zWzJdICYgMHhGQykgPj4gMl07CisJCWlycV92ZWN0b3IgPQorCQkJaXJxXzAxYmJfYnlfcG9zWygocG9zWzBdICYgMHhDMCkgPj4gNildOworCisJCWNsb2NrID0gNTA7CisJCWlmIChpZCA9PSAweDAxYmIpCisJCQluYW1lID0gIk5DUiAzMzYwLzM0MzAgU0NTSSBTdWJTeXN0ZW0iOworCQllbHNlCisJCQluYW1lID0gIk5DUiBEdWFsIFNJT1AgU0NTSSBIb3N0IEFkYXB0ZXIgQm9hcmQiOworCX0gZWxzZSBpZiAoIGlkID09IDB4MDA0ZiApIHsKKwkJYmFzZSA9IGlvXzAwNGZfYnlfcG9zWygocG9zWzBdICYgMHgwRSkgPj4gMSldOworCQlpcnFfdmVjdG9yID0KKwkJCWlycV8wMDRmX2J5X3Bvc1soKHBvc1swXSAmIDB4NzApID4+IDQpIC0gNF07CisJCWNsb2NrID0gNTA7CisJCW5hbWUgPSAiTkNSIDUzYzcxMCBTQ1NJIEhvc3QgQWRhcHRlciBCb2FyZCI7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1jYV9kZXZpY2Vfc2V0X25hbWUobWNhX2RldiwgbmFtZSk7CisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMSk7CisJYmFzZSA9IG1jYV9kZXZpY2VfdHJhbnNmb3JtX2lvcG9ydChtY2FfZGV2LCBiYXNlKTsKKwlpcnFfdmVjdG9yID0gbWNhX2RldmljZV90cmFuc2Zvcm1faXJxKG1jYV9kZXYsIGlycV92ZWN0b3IpOworCisJcmV0dXJuIHNpbTcxMF9wcm9iZV9jb21tb24oZGV2LCBiYXNlLCBpcnFfdmVjdG9yLCBjbG9jaywKKwkJCQkgICAwLCBpZF9hcnJheVtzbG90XSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWNhX2RyaXZlciBzaW03MTBfbWNhX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJCT0gc2ltNzEwX21jYV9pZF90YWJsZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAic2ltNzEwIiwKKwkJLmJ1cwkJPSAmbWNhX2J1c190eXBlLAorCQkucHJvYmUJCT0gc2ltNzEwX21jYV9wcm9iZSwKKwkJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaW03MTBfZGV2aWNlX3JlbW92ZSksCisJfSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfTUNBICovCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBzaW03MTBfZWlzYV9pZHNbXSA9IHsKKwl7ICJDUFE0NDEwIiB9LAorCXsgIkNQUTQ0MTEiIH0sCisJeyAiSFdQMEM4MCIgfSwKKwl7ICIiIH0KK307CisKK3N0YXRpYyBfX2luaXQgaW50CitzaW03MTBfZWlzYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2ID0gdG9fZWlzYV9kZXZpY2UoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSBlZGV2LT5iYXNlX2FkZHI7CisJY2hhciBlaXNhX2NwcV9pcnFzW10gPSB7IDExLCAxNCwgMTUsIDEwLCA5LCAwIH07CisJY2hhciBlaXNhX2h3cF9pcnFzW10gPSB7IDMsIDQsIDUsIDcsIDEyLCAxMCwgMTEsIDB9OworCWNoYXIgKmVpc2FfaXJxczsKKwl1bnNpZ25lZCBjaGFyIGlycV9pbmRleDsKKwl1bnNpZ25lZCBjaGFyIGlycSwgZGlmZmVyZW50aWFsID0gMCwgc2NzaV9pZCA9IDc7CisKKwlpZihzdHJjbXAoZWRldi0+aWQuc2lnLCAiSFdQMEM4MCIpID09IDApIHsKKwkJX191OCB2YWw7CisJCWVpc2FfaXJxcyA9ICBlaXNhX2h3cF9pcnFzOworCQlpcnFfaW5kZXggPSAoaW5iKGlvX2FkZHIgKyAweGM4NSkgJiAweDcpIC0gMTsKKworCQl2YWwgPSBpbmIoaW9fYWRkciArIDB4NCk7CisJCXNjc2lfaWQgPSBmZnModmFsKSAtIDE7CisKKwkJaWYoc2NzaV9pZCA+IDcgfHwgKHZhbCAmIH4oMTw8c2NzaV9pZCkpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2ltNzEwLmMsIEVJU0EgY2FyZCAlcyBoYXMgaW5jb3JyZWN0IHNjc2lfaWQsIHNldHRpbmcgdG8gN1xuIiwgZGV2LT5idXNfaWQpOworCQkJc2NzaV9pZCA9IDc7CisJCX0KKwl9IGVsc2UgeworCQllaXNhX2lycXMgPSBlaXNhX2NwcV9pcnFzOworCQlpcnFfaW5kZXggPSBpbmIoaW9fYWRkciArIDB4Yzg4KSAmIDB4MDc7CisJfQorCisJaWYoaXJxX2luZGV4ID49IHN0cmxlbihlaXNhX2lycXMpKSB7CisJCXByaW50aygic2ltNzEwLmM6IGlycSBuYXN0eVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlycSA9IGVpc2FfaXJxc1tpcnFfaW5kZXhdOworCQkKKwlyZXR1cm4gc2ltNzEwX3Byb2JlX2NvbW1vbihkZXYsIGlvX2FkZHIsIGlycSwgNTAsCisJCQkJICAgZGlmZmVyZW50aWFsLCBzY3NpX2lkKTsKK30KKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBzaW03MTBfZWlzYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCQk9IHNpbTcxMF9laXNhX2lkcywKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAic2ltNzEwIiwKKwkJLnByb2JlCQk9IHNpbTcxMF9laXNhX3Byb2JlLAorCQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNpbTcxMF9kZXZpY2VfcmVtb3ZlKSwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfRUlTQSAqLworCitzdGF0aWMgaW50IF9faW5pdCBzaW03MTBfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSAtRU5PREVWOworCisjaWZkZWYgTU9EVUxFCisJaWYgKHNpbTcxMCkKKwkJcGFyYW1fc2V0dXAoc2ltNzEwKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQQorCWVyciA9IG1jYV9yZWdpc3Rlcl9kcml2ZXIoJnNpbTcxMF9tY2FfZHJpdmVyKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VJU0EKKwllcnIgPSBlaXNhX2RyaXZlcl9yZWdpc3Rlcigmc2ltNzEwX2Vpc2FfZHJpdmVyKTsKKyNlbmRpZgorCS8qIEZJWE1FOiB3aGF0IHdlJ2QgcmVhbGx5IGxpa2UgdG8gcmV0dXJuIGhlcmUgaXMgLUVOT0RFViBpZgorCSAqIG5vIGRldmljZXMgaGF2ZSBhY3R1YWxseSBiZWVuIGZvdW5kLiAgSW5zdGVhZCwgdGhlIGVycgorCSAqIGFib3ZlIGFjdHVhbGx5IG9ubHkgcmVwb3J0cyBwcm9ibGVtcyB3aXRoIGtvYmplY3RfcmVnaXN0ZXIsCisJICogc28gZm9yIHRoZSBtb21lbnQgcmV0dXJuIHN1Y2Nlc3MgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2ltNzEwX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTUNBCisJaWYgKE1DQV9idXMpCisJCW1jYV91bnJlZ2lzdGVyX2RyaXZlcigmc2ltNzEwX21jYV9kcml2ZXIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIoJnNpbTcxMF9laXNhX2RyaXZlcik7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQoc2ltNzEwX2luaXQpOworbW9kdWxlX2V4aXQoc2ltNzEwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjI1OWYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NyLmMKQEAgLTAsMCArMSw5NjUgQEAKKy8qCisgKiAgc3IuYyBDb3B5cmlnaHQgKEMpIDE5OTIgRGF2aWQgR2lsbGVyCisgKiAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk5IEVyaWMgWW91bmdkYWxlCisgKgorICogIGFkYXB0ZWQgZnJvbToKKyAqICAgICAgc2QuYyBDb3B5cmlnaHQgKEMpIDE5OTIgRHJldyBFY2toYXJkdAorICogICAgICBMaW51eCBzY3NpIGRpc2sgZHJpdmVyIGJ5CisgKiAgICAgICAgICAgICAgRHJldyBFY2toYXJkdCA8ZHJld0Bjb2xvcmFkby5lZHU+CisgKgorICoJTW9kaWZpZWQgYnkgRXJpYyBZb3VuZ2RhbGUgZXJpY3lAYW5kYW50ZS5vcmcgdG8KKyAqCWFkZCBzY2F0dGVyLWdhdGhlciwgbXVsdGlwbGUgb3V0c3RhbmRpbmcgcmVxdWVzdCwgYW5kIG90aGVyCisgKgllbmhhbmNlbWVudHMuCisgKgorICogICAgICBNb2RpZmllZCBieSBFcmljIFlvdW5nZGFsZSBlcmljQGFuZGFudGUub3JnIHRvIHN1cHBvcnQgbG9hZGFibGUKKyAqICAgICAgbG93LWxldmVsIHNjc2kgZHJpdmVycy4KKyAqCisgKiAgICAgIE1vZGlmaWVkIGJ5IFRob21hcyBRdWlub3QgdGhvbWFzQG1lbGNoaW9yLmN1aXZyZS5mZG4uZnIgdG8KKyAqICAgICAgcHJvdmlkZSBhdXRvLWVqZWN0LgorICoKKyAqICAgICAgTW9kaWZpZWQgYnkgR2VyZCBLbm9yciA8a3JheGVsQGNzLnR1LWJlcmxpbi5kZT4gdG8gc3VwcG9ydCB0aGUKKyAqICAgICAgZ2VuZXJpYyBjZHJvbSBpbnRlcmZhY2UKKyAqCisgKiAgICAgIE1vZGlmaWVkIGJ5IEplbnMgQXhib2UgPGF4Ym9lQHN1c2UuZGU+IC0gVW5pZm9ybSBzcl9wYWNrZXQoKQorICogICAgICBpbnRlcmZhY2UsIGNhcGFiaWxpdGllcyBwcm9iZSBhZGRpdGlvbnMsIGlvY3RsIGNsZWFudXBzLCBldGMuCisgKgorICoJTW9kaWZpZWQgYnkgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IHRvIHN1cHBvcnQgZGV2ZnMKKyAqCisgKglNb2RpZmllZCBieSBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiAtIHN1cHBvcnQgRFZELVJBTQorICoJdHJhbnNwYXJlbnRseSBhbmQgbG9zZSB0aGUgR0hPU1QgaGFjaworICoKKyAqCU1vZGlmaWVkIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoJY2hlY2sgcmVzb3VyY2UgYWxsb2NhdGlvbiBpbiBzcl9pbml0IGFuZCBzb21lIGNsZWFudXBzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CS8qIEZvciB0aGUgZG9vciBsb2NrL3VubG9jayBjb21tYW5kcyAqLworI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisKKyNpbmNsdWRlICJzY3NpX2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJzci5oIgorCisKKyNkZWZpbmUgU1JfRElTS1MJMjU2CisKKyNkZWZpbmUgTUFYX1JFVFJJRVMJMworI2RlZmluZSBTUl9USU1FT1VUCSgzMCAqIEhaKQorI2RlZmluZSBTUl9DQVBBQklMSVRJRVMgXAorCShDRENfQ0xPU0VfVFJBWXxDRENfT1BFTl9UUkFZfENEQ19MT0NLfENEQ19TRUxFQ1RfU1BFRUR8IFwKKwkgQ0RDX1NFTEVDVF9ESVNDfENEQ19NVUxUSV9TRVNTSU9OfENEQ19NQ058Q0RDX01FRElBX0NIQU5HRUR8IFwKKwkgQ0RDX1BMQVlfQVVESU98Q0RDX1JFU0VUfENEQ19JT0NUTFN8Q0RDX0RSSVZFX1NUQVRVU3wgXAorCSBDRENfQ0RfUnxDRENfQ0RfUld8Q0RDX0RWRHxDRENfRFZEX1J8Q0RDX0RWRF9SQU18Q0RDX0dFTkVSSUNfUEFDS0VUfCBcCisJIENEQ19NUld8Q0RDX01SV19XfENEQ19SQU0pCisKK3N0YXRpYyBpbnQgc3JfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgc3JfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHNyX2luaXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICopOworCitzdGF0aWMgc3RydWN0IHNjc2lfZHJpdmVyIHNyX3RlbXBsYXRlID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdlbmRydiA9IHsKKwkJLm5hbWUgICAJPSAic3IiLAorCQkucHJvYmUJCT0gc3JfcHJvYmUsCisJCS5yZW1vdmUJCT0gc3JfcmVtb3ZlLAorCX0sCisJLmluaXRfY29tbWFuZAkJPSBzcl9pbml0X2NvbW1hbmQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzcl9pbmRleF9iaXRzW1NSX0RJU0tTIC8gQklUU19QRVJfTE9OR107CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNyX2luZGV4X2xvY2spOworCisvKiBUaGlzIHNlbWFwaG9yZSBpcyB1c2VkIHRvIG1lZGlhdGUgdGhlIDAtPjEgcmVmZXJlbmNlIGdldCBpbiB0aGUKKyAqIGZhY2Ugb2Ygb2JqZWN0IGRlc3RydWN0aW9uIChpLmUuIHdlIGNhbid0IGFsbG93IGEgZ2V0IG9uIGFuCisgKiBvYmplY3QgYWZ0ZXIgbGFzdCBwdXQpICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChzcl9yZWZfc2VtKTsKKworc3RhdGljIGludCBzcl9vcGVuKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBpbnQpOworc3RhdGljIHZvaWQgc3JfcmVsZWFzZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKik7CisKK3N0YXRpYyB2b2lkIGdldF9zZWN0b3JzaXplKHN0cnVjdCBzY3NpX2NkICopOworc3RhdGljIHZvaWQgZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgc2NzaV9jZCAqKTsKKworc3RhdGljIGludCBzcl9tZWRpYV9jaGFuZ2Uoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIGludCk7CitzdGF0aWMgaW50IHNyX3BhY2tldChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgc3RydWN0IHBhY2tldF9jb21tYW5kICopOworCitzdGF0aWMgc3RydWN0IGNkcm9tX2RldmljZV9vcHMgc3JfZG9wcyA9IHsKKwkub3BlbgkJCT0gc3Jfb3BlbiwKKwkucmVsZWFzZQkgCT0gc3JfcmVsZWFzZSwKKwkuZHJpdmVfc3RhdHVzCSAJPSBzcl9kcml2ZV9zdGF0dXMsCisJLm1lZGlhX2NoYW5nZWQJCT0gc3JfbWVkaWFfY2hhbmdlLAorCS50cmF5X21vdmUJCT0gc3JfdHJheV9tb3ZlLAorCS5sb2NrX2Rvb3IJCT0gc3JfbG9ja19kb29yLAorCS5zZWxlY3Rfc3BlZWQJCT0gc3Jfc2VsZWN0X3NwZWVkLAorCS5nZXRfbGFzdF9zZXNzaW9uCT0gc3JfZ2V0X2xhc3Rfc2Vzc2lvbiwKKwkuZ2V0X21jbgkJPSBzcl9nZXRfbWNuLAorCS5yZXNldAkJCT0gc3JfcmVzZXQsCisJLmF1ZGlvX2lvY3RsCQk9IHNyX2F1ZGlvX2lvY3RsLAorCS5kZXZfaW9jdGwJCT0gc3JfZGV2X2lvY3RsLAorCS5jYXBhYmlsaXR5CQk9IFNSX0NBUEFCSUxJVElFUywKKwkuZ2VuZXJpY19wYWNrZXQJCT0gc3JfcGFja2V0LAorfTsKKworc3RhdGljIHZvaWQgc3Jfa3JlZl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV9jZCAqc2NzaV9jZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRpc2stPnByaXZhdGVfZGF0YSwgc3RydWN0IHNjc2lfY2QsIGRyaXZlcik7Cit9CisKKy8qCisgKiBUaGUgZ2V0IGFuZCBwdXQgcm91dGluZXMgZm9yIHRoZSBzdHJ1Y3Qgc2NzaV9jZC4gIE5vdGUgdGhpcyBlbnRpdHkKKyAqIGhhcyBhIHNjc2lfZGV2aWNlIHBvaW50ZXIgYW5kIG93bnMgYSByZWZlcmVuY2UgdG8gdGhpcy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV9jZCAqc2NzaV9jZF9nZXQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gTlVMTDsKKworCWRvd24oJnNyX3JlZl9zZW0pOworCWlmIChkaXNrLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJY2QgPSBzY3NpX2NkKGRpc2spOworCWtyZWZfZ2V0KCZjZC0+a3JlZik7CisJaWYgKHNjc2lfZGV2aWNlX2dldChjZC0+ZGV2aWNlKSkKKwkJZ290byBvdXRfcHV0OworCWdvdG8gb3V0OworCisgb3V0X3B1dDoKKwlrcmVmX3B1dCgmY2QtPmtyZWYsIHNyX2tyZWZfcmVsZWFzZSk7CisJY2QgPSBOVUxMOworIG91dDoKKwl1cCgmc3JfcmVmX3NlbSk7CisJcmV0dXJuIGNkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NzaV9jZF9wdXQoc3RydWN0IHNjc2lfY2QgKmNkKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNkLT5kZXZpY2U7CisKKwlkb3duKCZzcl9yZWZfc2VtKTsKKwlrcmVmX3B1dCgmY2QtPmtyZWYsIHNyX2tyZWZfcmVsZWFzZSk7CisJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCXVwKCZzcl9yZWZfc2VtKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gY2hhbmdlZCBpbiB0aGUKKyAqIENEUk9NIGRyaXZlLiAgSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgc2Vuc2VkIGEgY2hhbmdlLAorICogb3IgdGhlIGRyaXZlIG1heSBoYXZlIHNlbnNlZCBvbmUgYW5kIG5vdCB5ZXQgcmVwb3J0ZWQgaXQuICBXZSBtdXN0CisgKiBiZSByZWFkeSBmb3IgZWl0aGVyIGNhc2UuIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJlcG9ydHMgdGhlIGN1cnJlbnQKKyAqIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIGJpdC4gIElmIGZsYWcgaXMgMCwgdGhlbiB0aGUgY2hhbmdlZCBiaXQgaXMgcmVzZXQuCisgKiBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGRvbmUgYXMgYW4gaW9jdGwsIGJ1dCB3ZSB3b3VsZCBuZWVkIHRvIGhhdmUKKyAqIGFuIGlub2RlIGZvciB0aGF0IHRvIHdvcmssIGFuZCB3ZSBkbyBub3QgYWx3YXlzIGhhdmUgb25lLgorICovCisKK2ludCBzcl9tZWRpYV9jaGFuZ2Uoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzbG90KQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IGNkaS0+aGFuZGxlOworCWludCByZXR2YWw7CisKKwlpZiAoQ0RTTF9DVVJSRU5UICE9IHNsb3QpIHsKKwkJLyogbm8gY2hhbmdlciBzdXBwb3J0ICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHZhbCA9IHNjc2lfdGVzdF91bml0X3JlYWR5KGNkLT5kZXZpY2UsIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTKTsKKwlpZiAocmV0dmFsKSB7CisJCS8qIFVuYWJsZSB0byB0ZXN0LCB1bml0IHByb2JhYmx5IG5vdCByZWFkeS4gIFRoaXMgdXN1YWxseQorCQkgKiBtZWFucyB0aGVyZSBpcyBubyBkaXNjIGluIHRoZSBkcml2ZS4gIE1hcmsgYXMgY2hhbmdlZCwKKwkJICogYW5kIHdlIHdpbGwgZmlndXJlIGl0IG91dCBsYXRlciBvbmNlIHRoZSBkcml2ZSBpcworCQkgKiBhdmFpbGFibGUgYWdhaW4uICAqLworCQljZC0+ZGV2aWNlLT5jaGFuZ2VkID0gMTsKKwkJcmV0dXJuIDE7CS8qIFRoaXMgd2lsbCBmb3JjZSBhIGZsdXNoLCBpZiBjYWxsZWQgZnJvbQorCQkJCSAqIGNoZWNrX2Rpc2tfY2hhbmdlICovCisJfTsKKworCXJldHZhbCA9IGNkLT5kZXZpY2UtPmNoYW5nZWQ7CisJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDA7CisJLyogSWYgdGhlIGRpc2sgY2hhbmdlZCwgdGhlIGNhcGFjaXR5IHdpbGwgbm93IGJlIGRpZmZlcmVudCwKKwkgKiBzbyB3ZSBmb3JjZSBhIHJlLXJlYWQgb2YgdGhpcyBpbmZvcm1hdGlvbiAqLworCWlmIChyZXR2YWwpIHsKKwkJLyogY2hlY2sgbXVsdGlzZXNzaW9uIG9mZnNldCBldGMgKi8KKwkJc3JfY2RfY2hlY2soY2RpKTsKKworCQkvKiAKKwkJICogSWYgdGhlIGRpc2sgY2hhbmdlZCwgdGhlIGNhcGFjaXR5IHdpbGwgbm93IGJlIGRpZmZlcmVudCwKKwkJICogc28gd2UgZm9yY2UgYSByZS1yZWFkIG9mIHRoaXMgaW5mb3JtYXRpb24gCisJCSAqIEZvcmNlIDIwNDggZm9yIHRoZSBzZWN0b3Igc2l6ZSBzbyB0aGF0IGZpbGVzeXN0ZW1zIHdvbid0CisJCSAqIGJlIHRyeWluZyB0byB1c2Ugc29tZXRoaW5nIHRoYXQgaXMgdG9vIHNtYWxsIGlmIHRoZSBkaXNjCisJCSAqIGhhcyBjaGFuZ2VkLgorCQkgKi8KKwkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKKwkJY2QtPmRldmljZS0+c2VjdG9yX3NpemUgPSAyMDQ4OworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorIAorLyoKKyAqIHJ3X2ludHIgaXMgdGhlIGludGVycnVwdCByb3V0aW5lIGZvciB0aGUgZGV2aWNlIGRyaXZlci4KKyAqCisgKiBJdCB3aWxsIGJlIG5vdGlmaWVkIG9uIHRoZSBlbmQgb2YgYSBTQ1NJIHJlYWQgLyB3cml0ZSwgYW5kIHdpbGwgdGFrZSBvbgorICogb2Ygc2V2ZXJhbCBhY3Rpb25zIGJhc2VkIG9uIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQgcndfaW50cihzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJaW50IHJlc3VsdCA9IFNDcG50LT5yZXN1bHQ7CisJaW50IHRoaXNfY291bnQgPSBTQ3BudC0+YnVmZmxlbjsKKwlpbnQgZ29vZF9ieXRlcyA9IChyZXN1bHQgPT0gMCA/IHRoaXNfY291bnQgOiAwKTsKKwlpbnQgYmxvY2tfc2VjdG9ycyA9IDA7CisJbG9uZyBlcnJvcl9zZWN0b3I7CisJc3RydWN0IHNjc2lfY2QgKmNkID0gc2NzaV9jZChTQ3BudC0+cmVxdWVzdC0+cnFfZGlzayk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygic3IuYyBkb25lOiAleFxuIiwgcmVzdWx0KTsKKyNlbmRpZgorCisJLyoKKwkgKiBIYW5kbGUgTUVESVVNIEVSUk9ScyBvciBWT0xVTUUgT1ZFUkZMT1dzIHRoYXQgaW5kaWNhdGUgcGFydGlhbAorCSAqIHN1Y2Nlc3MuICBTaW5jZSB0aGlzIGlzIGEgcmVsYXRpdmVseSByYXJlIGVycm9yIGNvbmRpdGlvbiwgbm8KKwkgKiBjYXJlIGlzIHRha2VuIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFkZGl0aW9uYWwgd29yayBzdWNoIGFzCisJICogbWVtY3B5J3MgdGhhdCBjb3VsZCBiZSBhdm9pZGVkLgorCSAqLworCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICE9IDAgJiYJCS8qIEFuIGVycm9yIG9jY3VycmVkICovCisJICAgIChTQ3BudC0+c2Vuc2VfYnVmZmVyWzBdICYgMHg3ZikgPT0gMHg3MCkgeyAvKiBTZW5zZSBjdXJyZW50ICovCisJCXN3aXRjaCAoU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSkgeworCQljYXNlIE1FRElVTV9FUlJPUjoKKwkJY2FzZSBWT0xVTUVfT1ZFUkZMT1c6CisJCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgorCQkJaWYgKCEoU0NwbnQtPnNlbnNlX2J1ZmZlclswXSAmIDB4OTApKQorCQkJCWJyZWFrOworCQkJaWYgKCFibGtfZnNfcmVxdWVzdChTQ3BudC0+cmVxdWVzdCkpCisJCQkJYnJlYWs7CisJCQllcnJvcl9zZWN0b3IgPSAoU0NwbnQtPnNlbnNlX2J1ZmZlclszXSA8PCAyNCkgfAorCQkJCShTQ3BudC0+c2Vuc2VfYnVmZmVyWzRdIDw8IDE2KSB8CisJCQkJKFNDcG50LT5zZW5zZV9idWZmZXJbNV0gPDwgOCkgfAorCQkJCVNDcG50LT5zZW5zZV9idWZmZXJbNl07CisJCQlpZiAoU0NwbnQtPnJlcXVlc3QtPmJpbyAhPSBOVUxMKQorCQkJCWJsb2NrX3NlY3RvcnMgPQorCQkJCQliaW9fc2VjdG9ycyhTQ3BudC0+cmVxdWVzdC0+YmlvKTsKKwkJCWlmIChibG9ja19zZWN0b3JzIDwgNCkKKwkJCQlibG9ja19zZWN0b3JzID0gNDsKKwkJCWlmIChjZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSA9PSAyMDQ4KQorCQkJCWVycm9yX3NlY3RvciA8PD0gMjsKKwkJCWVycm9yX3NlY3RvciAmPSB+KGJsb2NrX3NlY3RvcnMgLSAxKTsKKwkJCWdvb2RfYnl0ZXMgPSAoZXJyb3Jfc2VjdG9yIC0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcikgPDwgOTsKKwkJCWlmIChnb29kX2J5dGVzIDwgMCB8fCBnb29kX2J5dGVzID49IHRoaXNfY291bnQpCisJCQkJZ29vZF9ieXRlcyA9IDA7CisJCQkvKgorCQkJICogVGhlIFNDU0kgc3BlY2lmaWNhdGlvbiBhbGxvd3MgZm9yIHRoZSB2YWx1ZQorCQkJICogcmV0dXJuZWQgYnkgUkVBRCBDQVBBQ0lUWSB0byBiZSB1cCB0byA3NSAySworCQkJICogc2VjdG9ycyBwYXN0IHRoZSBsYXN0IHJlYWRhYmxlIGJsb2NrLgorCQkJICogVGhlcmVmb3JlLCBpZiB3ZSBoaXQgYSBtZWRpdW0gZXJyb3Igd2l0aGluIHRoZQorCQkJICogbGFzdCA3NSAySyBzZWN0b3JzLCB3ZSBkZWNyZWFzZSB0aGUgc2F2ZWQgc2l6ZQorCQkJICogdmFsdWUuCisJCQkgKi8KKwkJCWlmIChlcnJvcl9zZWN0b3IgPCBnZXRfY2FwYWNpdHkoY2QtPmRpc2spICYmCisJCQkgICAgY2QtPmNhcGFjaXR5IC0gZXJyb3Jfc2VjdG9yIDwgNCAqIDc1KQorCQkJCXNldF9jYXBhY2l0eShjZC0+ZGlzaywgZXJyb3Jfc2VjdG9yKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVDT1ZFUkVEX0VSUk9SOgorCisJCQkvKgorCQkJICogQW4gZXJyb3Igb2NjdXJlZCwgYnV0IGl0IHJlY292ZXJlZC4gIEluZm9ybSB0aGUKKwkJCSAqIHVzZXIsIGJ1dCBtYWtlIHN1cmUgdGhhdCBpdCdzIG5vdCB0cmVhdGVkIGFzIGEKKwkJCSAqIGhhcmQgZXJyb3IuCisJCQkgKi8KKwkJCXNjc2lfcHJpbnRfc2Vuc2UoInNyIiwgU0NwbnQpOworCQkJU0NwbnQtPnJlc3VsdCA9IDA7CisJCQlTQ3BudC0+c2Vuc2VfYnVmZmVyWzBdID0gMHgwOworCQkJZ29vZF9ieXRlcyA9IHRoaXNfY291bnQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoaXMgY2FsbHMgdGhlIGdlbmVyaWMgY29tcGxldGlvbiBmdW5jdGlvbiwgbm93IHRoYXQgd2Uga25vdworCSAqIGhvdyBtYW55IGFjdHVhbCBzZWN0b3JzIGZpbmlzaGVkLCBhbmQgaG93IG1hbnkgc2VjdG9ycyB3ZSBuZWVkCisJICogdG8gc2F5IGhhdmUgZmFpbGVkLgorCSAqLworCXNjc2lfaW9fY29tcGxldGlvbihTQ3BudCwgZ29vZF9ieXRlcywgYmxvY2tfc2VjdG9ycyA8PCA5KTsKK30KKworc3RhdGljIGludCBzcl9pbml0X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCWludCBibG9jaz0wLCB0aGlzX2NvdW50LCBzX3NpemUsIHRpbWVvdXQgPSBTUl9USU1FT1VUOworCXN0cnVjdCBzY3NpX2NkICpjZCA9IHNjc2lfY2QoU0NwbnQtPnJlcXVlc3QtPnJxX2Rpc2spOworCisJU0NTSV9MT0dfSExRVUVVRSgxLCBwcmludGsoIkRvaW5nIHNyIHJlcXVlc3QsIGRldiA9ICVzLCBibG9jayA9ICVkXG4iLAorCQkJCWNkLT5kaXNrLT5kaXNrX25hbWUsIGJsb2NrKSk7CisKKwlpZiAoIWNkLT5kZXZpY2UgfHwgIXNjc2lfZGV2aWNlX29ubGluZShjZC0+ZGV2aWNlKSkgeworCQlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiRmluaXNoaW5nICVsZCBzZWN0b3JzXG4iLAorCQkJCQlTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9ycykpOworCQlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiUmV0cnkgd2l0aCAweCVwXG4iLCBTQ3BudCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2QtPmRldmljZS0+Y2hhbmdlZCkgeworCQkvKgorCQkgKiBxdWlldGx5IHJlZnVzZSB0byBkbyBhbnl0aGluZyB0byBhIGNoYW5nZWQgZGlzYyB1bnRpbCB0aGUKKwkJICogY2hhbmdlZCBiaXQgaGFzIGJlZW4gcmVzZXQKKwkJICovCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogdGhlc2UgYXJlIGFscmVhZHkgc2V0dXAsIGp1c3QgY29weSBjZGIgYmFzaWNhbGx5CisJICovCisJaWYgKFNDcG50LT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9CTE9DS19QQykgeworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBTQ3BudC0+cmVxdWVzdDsKKworCQlpZiAoc2l6ZW9mKHJxLT5jbWQpID4gc2l6ZW9mKFNDcG50LT5jbW5kKSkKKwkJCXJldHVybiAwOworCisJCW1lbWNweShTQ3BudC0+Y21uZCwgcnEtPmNtZCwgc2l6ZW9mKFNDcG50LT5jbW5kKSk7CisJCWlmICghcnEtPmRhdGFfbGVuKQorCQkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJCWVsc2UgaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKKwkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJCWVsc2UKKwkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKworCQl0aGlzX2NvdW50ID0gcnEtPmRhdGFfbGVuOworCQlpZiAocnEtPnRpbWVvdXQpCisJCQl0aW1lb3V0ID0gcnEtPnRpbWVvdXQ7CisKKwkJU0NwbnQtPnRyYW5zZmVyc2l6ZSA9IHJxLT5kYXRhX2xlbjsKKwkJZ290byBxdWV1ZTsKKwl9CisKKwlpZiAoIShTQ3BudC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfQ01EKSkgeworCQlibGtfZHVtcF9ycV9mbGFncyhTQ3BudC0+cmVxdWVzdCwgInNyIHVuc3VwIGNvbW1hbmQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiB3ZSBkbyBsYXp5IGJsb2Nrc2l6ZSBzd2l0Y2hpbmcgKHdoZW4gcmVhZGluZyBYQSBzZWN0b3JzLAorCSAqIHNlZSBDRFJPTVJFQURNT0RFMiBpb2N0bCkgCisJICovCisJc19zaXplID0gY2QtPmRldmljZS0+c2VjdG9yX3NpemU7CisJaWYgKHNfc2l6ZSA+IDIwNDgpIHsKKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJCXNyX3NldF9ibG9ja2xlbmd0aChjZCwgMjA0OCk7CisJCWVsc2UKKwkJCXByaW50aygic3I6IGNhbid0IHN3aXRjaCBibG9ja3NpemU6IGluIGludGVycnVwdFxuIik7CisJfQorCisJaWYgKHNfc2l6ZSAhPSA1MTIgJiYgc19zaXplICE9IDEwMjQgJiYgc19zaXplICE9IDIwNDgpIHsKKwkJcHJpbnRrKCJzcjogYmFkIHNlY3RvciBzaXplICVkXG4iLCBzX3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocnFfZGF0YV9kaXIoU0NwbnQtPnJlcXVlc3QpID09IFdSSVRFKSB7CisJCWlmICghY2QtPmRldmljZS0+d3JpdGVhYmxlKQorCQkJcmV0dXJuIDA7CisJCVNDcG50LT5jbW5kWzBdID0gV1JJVEVfMTA7CisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisgCSAJY2QtPmNkaS5tZWRpYV93cml0dGVuID0gMTsKKwl9IGVsc2UgaWYgKHJxX2RhdGFfZGlyKFNDcG50LT5yZXF1ZXN0KSA9PSBSRUFEKSB7CisJCVNDcG50LT5jbW5kWzBdID0gUkVBRF8xMDsKKwkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCX0gZWxzZSB7CisJCWJsa19kdW1wX3JxX2ZsYWdzKFNDcG50LT5yZXF1ZXN0LCAiVW5rbm93biBzciBjb21tYW5kIik7CisJCXJldHVybiAwOworCX0KKworCXsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJaW50IGksIHNpemUgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPnVzZV9zZzsgaSsrKQorCQkJc2l6ZSArPSBzZ1tpXS5sZW5ndGg7CisKKwkJaWYgKHNpemUgIT0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAmJiBTQ3BudC0+dXNlX3NnKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNyOiBtaXNtYXRjaCBjb3VudCAlZCwgYnl0ZXMgJWRcbiIsCisJCQkJCXNpemUsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPiBzaXplKQorCQkJCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPSBTQ3BudC0+YnVmZmxlbiA9IHNpemU7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlcXVlc3QgZG9lc24ndCBzdGFydCBvbiBodyBibG9jayBib3VuZGFyeSwgYWRkIHNjYXR0ZXIgcGFkcworCSAqLworCWlmICgoKHVuc2lnbmVkIGludClTQ3BudC0+cmVxdWVzdC0+c2VjdG9yICUgKHNfc2l6ZSA+PiA5KSkgfHwKKwkgICAgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gJSBzX3NpemUpKSB7CisJCXByaW50aygic3I6IHVuYWxpZ25lZCB0cmFuc2ZlclxuIik7CisJCXJldHVybiAwOworCX0KKworCXRoaXNfY291bnQgPSAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA+PiA5KSAvIChzX3NpemUgPj4gOSk7CisKKworCVNDU0lfTE9HX0hMUVVFVUUoMiwgcHJpbnRrKCIlcyA6ICVzICVkLyVsZCA1MTIgYnl0ZSBibG9ja3MuXG4iLAorCQkJCWNkLT5jZGkubmFtZSwKKwkJCQkocnFfZGF0YV9kaXIoU0NwbnQtPnJlcXVlc3QpID09IFdSSVRFKSA/CisJCQkJCSJ3cml0aW5nIiA6ICJyZWFkaW5nIiwKKwkJCQl0aGlzX2NvdW50LCBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9ycykpOworCisJU0NwbnQtPmNtbmRbMV0gPSAwOworCWJsb2NrID0gKHVuc2lnbmVkIGludClTQ3BudC0+cmVxdWVzdC0+c2VjdG9yIC8gKHNfc2l6ZSA+PiA5KTsKKworCWlmICh0aGlzX2NvdW50ID4gMHhmZmZmKSB7CisJCXRoaXNfY291bnQgPSAweGZmZmY7CisJCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPSBTQ3BudC0+YnVmZmxlbiA9CisJCQkJdGhpc19jb3VudCAqIHNfc2l6ZTsKKwl9CisKKwlTQ3BudC0+Y21uZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMjQpICYgMHhmZjsKKwlTQ3BudC0+Y21uZFszXSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gMTYpICYgMHhmZjsKKwlTQ3BudC0+Y21uZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSAoYmxvY2sgPj4gOCkgJiAweGZmOworCVNDcG50LT5jbW5kWzVdID0gKHVuc2lnbmVkIGNoYXIpIGJsb2NrICYgMHhmZjsKKwlTQ3BudC0+Y21uZFs2XSA9IFNDcG50LT5jbW5kWzldID0gMDsKKwlTQ3BudC0+Y21uZFs3XSA9ICh1bnNpZ25lZCBjaGFyKSAodGhpc19jb3VudCA+PiA4KSAmIDB4ZmY7CisJU0NwbnQtPmNtbmRbOF0gPSAodW5zaWduZWQgY2hhcikgdGhpc19jb3VudCAmIDB4ZmY7CisKKwkvKgorCSAqIFdlIHNob3VsZG4ndCBkaXNjb25uZWN0IGluIHRoZSBtaWRkbGUgb2YgYSBzZWN0b3IsIHNvIHdpdGggYSBkdW1iCisJICogaG9zdCBhZGFwdGVyLCBpdCdzIHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UgY2FuIGF0IGxlYXN0IHRyYW5zZmVyCisJICogdGhpcyBtYW55IGJ5dGVzIGJldHdlZW4gZWFjaCBjb25uZWN0IC8gZGlzY29ubmVjdC4KKwkgKi8KKwlTQ3BudC0+dHJhbnNmZXJzaXplID0gY2QtPmRldmljZS0+c2VjdG9yX3NpemU7CisJU0NwbnQtPnVuZGVyZmxvdyA9IHRoaXNfY291bnQgPDwgOTsKKworcXVldWU6CisJU0NwbnQtPmFsbG93ZWQgPSBNQVhfUkVUUklFUzsKKwlTQ3BudC0+dGltZW91dF9wZXJfY29tbWFuZCA9IHRpbWVvdXQ7CisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3ZSB1c2UuICBUaGlzIGlzIG1hdGNoZWQgaW4gdGVybXMKKwkgKiBvZiBjYXBhYmlsaXR5IHRvIHRoaXMgZnVuY3Rpb24uCisJICovCisJU0NwbnQtPmRvbmUgPSByd19pbnRyOworCisJLyoKKwkgKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIGlzIHJlYWR5IGZyb20gb3VyIGVuZCB0byBiZQorCSAqIHF1ZXVlZC4KKwkgKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzcl9ibG9ja19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBzY3NpX2NkKGlub2RlLT5pX2JkZXYtPmJkX2Rpc2spOworCWludCByZXQgPSAwOworCisJaWYoIShjZCA9IHNjc2lfY2RfZ2V0KGRpc2spKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmKChyZXQgPSBjZHJvbV9vcGVuKCZjZC0+Y2RpLCBpbm9kZSwgZmlsZSkpICE9IDApCisJCXNjc2lfY2RfcHV0KGNkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3JfYmxvY2tfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzY3NpX2NkICpjZCA9IHNjc2lfY2QoaW5vZGUtPmlfYmRldi0+YmRfZGlzayk7CisJcmV0ID0gY2Ryb21fcmVsZWFzZSgmY2QtPmNkaSwgZmlsZSk7CisJaWYocmV0KQorCQlyZXR1cm4gcmV0OworCQorCXNjc2lfY2RfcHV0KGNkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNyX2Jsb2NrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IHNjc2lfY2QoaW5vZGUtPmlfYmRldi0+YmRfZGlzayk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gY2QtPmRldmljZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZW5kIFNDU0kgYWRkcmVzc2luZyBpb2N0bHMgZGlyZWN0bHkgdG8gbWlkIGxldmVsLCBzZW5kIG90aGVyCisgICAgICAgICAqIGlvY3RscyB0byBjZHJvbS9ibG9jayBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTQ1NJX0lPQ1RMX0dFVF9JRExVTjoKKyAgICAgICAgICAgICAgICBjYXNlIFNDU0lfSU9DVExfR0VUX0JVU19OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NzaV9pb2N0bChzZGV2LCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJfQorCXJldHVybiBjZHJvbV9pb2N0bChmaWxlLCAmY2QtPmNkaSwgaW5vZGUsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBzcl9ibG9ja19tZWRpYV9jaGFuZ2VkKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IHNjc2lfY2QoZGlzayk7CisJcmV0dXJuIGNkcm9tX21lZGlhX2NoYW5nZWQoJmNkLT5jZGkpOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHNyX2Jkb3BzID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gc3JfYmxvY2tfb3BlbiwKKwkucmVsZWFzZQk9IHNyX2Jsb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IHNyX2Jsb2NrX2lvY3RsLAorCS5tZWRpYV9jaGFuZ2VkCT0gc3JfYmxvY2tfbWVkaWFfY2hhbmdlZCwKKwkvKiAKKwkgKiBObyBjb21wYXRfaW9jdGwgZm9yIG5vdyBiZWNhdXNlIHNyX2Jsb2NrX2lvY3RsIG5ldmVyCisJICogc2VlbXMgdG8gcGFzcyBhcmJpdGFyeSBpb2N0bHMgZG93biB0byBob3N0IGRyaXZlcnMuCisJICovCit9OworCitzdGF0aWMgaW50IHNyX29wZW4oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBwdXJwb3NlKQoreworCXN0cnVjdCBzY3NpX2NkICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNkLT5kZXZpY2U7CisJaW50IHJldHZhbDsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBpbiBlcnJvciByZWNvdmVyeSwgd2FpdCB1bnRpbCBpdCBpcyBkb25lLgorCSAqIElmIHRoZSBkZXZpY2UgaXMgb2ZmbGluZSwgdGhlbiBkaXNhbGxvdyBhbnkgYWNjZXNzIHRvIGl0LgorCSAqLworCXJldHZhbCA9IC1FTlhJTzsKKwlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhzZGV2KSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwkvKgorCSAqIElmIHRoaXMgZGV2aWNlIGRpZCBub3QgaGF2ZSBtZWRpYSBpbiB0aGUgZHJpdmUgYXQgYm9vdCB0aW1lLCB0aGVuCisJICogd2Ugd291bGQgaGF2ZSBiZWVuIHVuYWJsZSB0byBnZXQgdGhlIHNlY3RvciBzaXplLiAgQ2hlY2sgdG8gc2VlIGlmCisJICogdGhpcyBpcyB0aGUgY2FzZSwgYW5kIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAoY2QtPm5lZWRzX3NlY3Rvcl9zaXplKQorCQlnZXRfc2VjdG9yc2l6ZShjZCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX291dDoKKwlyZXR1cm4gcmV0dmFsOwkKK30KKworc3RhdGljIHZvaWQgc3JfcmVsZWFzZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBjZGktPmhhbmRsZTsKKworCWlmIChjZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSA+IDIwNDgpCisJCXNyX3NldF9ibG9ja2xlbmd0aChjZCwgMjA0OCk7CisKK30KKworc3RhdGljIGludCBzcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2Q7CisJaW50IG1pbm9yLCBlcnJvcjsKKworCWVycm9yID0gLUVOT0RFVjsKKwlpZiAoc2Rldi0+dHlwZSAhPSBUWVBFX1JPTSAmJiBzZGV2LT50eXBlICE9IFRZUEVfV09STSkKKwkJZ290byBmYWlsOworCisJZXJyb3IgPSAtRU5PTUVNOworCWNkID0ga21hbGxvYyhzaXplb2YoKmNkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZCkKKwkJZ290byBmYWlsOworCW1lbXNldChjZCwgMCwgc2l6ZW9mKCpjZCkpOworCisJa3JlZl9pbml0KCZjZC0+a3JlZik7CisKKwlkaXNrID0gYWxsb2NfZGlzaygxKTsKKwlpZiAoIWRpc2spCisJCWdvdG8gZmFpbF9mcmVlOworCisJc3Bpbl9sb2NrKCZzcl9pbmRleF9sb2NrKTsKKwltaW5vciA9IGZpbmRfZmlyc3RfemVyb19iaXQoc3JfaW5kZXhfYml0cywgU1JfRElTS1MpOworCWlmIChtaW5vciA9PSBTUl9ESVNLUykgeworCQlzcGluX3VubG9jaygmc3JfaW5kZXhfbG9jayk7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGZhaWxfcHV0OworCX0KKwlfX3NldF9iaXQobWlub3IsIHNyX2luZGV4X2JpdHMpOworCXNwaW5fdW5sb2NrKCZzcl9pbmRleF9sb2NrKTsKKworCWRpc2stPm1ham9yID0gU0NTSV9DRFJPTV9NQUpPUjsKKwlkaXNrLT5maXJzdF9taW5vciA9IG1pbm9yOworCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAic3IlZCIsIG1pbm9yKTsKKwlkaXNrLT5mb3BzID0gJnNyX2Jkb3BzOworCWRpc2stPmZsYWdzID0gR0VOSERfRkxfQ0Q7CisKKwljZC0+ZGV2aWNlID0gc2RldjsKKwljZC0+ZGlzayA9IGRpc2s7CisJY2QtPmRyaXZlciA9ICZzcl90ZW1wbGF0ZTsKKwljZC0+ZGlzayA9IGRpc2s7CisJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CisJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKKwljZC0+ZGV2aWNlLT5jaGFuZ2VkID0gMTsJLyogZm9yY2UgcmVjaGVjayBDRCB0eXBlICovCisJY2QtPnVzZSA9IDE7CisJY2QtPnJlYWRjZF9rbm93biA9IDA7CisJY2QtPnJlYWRjZF9jZGRhID0gMDsKKworCWNkLT5jZGkub3BzID0gJnNyX2RvcHM7CisJY2QtPmNkaS5oYW5kbGUgPSBjZDsKKwljZC0+Y2RpLm1hc2sgPSAwOworCWNkLT5jZGkuY2FwYWNpdHkgPSAxOworCXNwcmludGYoY2QtPmNkaS5uYW1lLCAic3IlZCIsIG1pbm9yKTsKKworCXNkZXYtPnNlY3Rvcl9zaXplID0gMjA0ODsJLyogQSBndWVzcywganVzdCBpbiBjYXNlICovCisKKwkvKiBGSVhNRTogbmVlZCB0byBoYW5kbGUgYSBnZXRfY2FwYWJpbGl0aWVzIGZhaWx1cmUgcHJvcGVybHkgPz8gKi8KKwlnZXRfY2FwYWJpbGl0aWVzKGNkKTsKKwlzcl92ZW5kb3JfaW5pdChjZCk7CisKKwlzbnByaW50ZihkaXNrLT5kZXZmc19uYW1lLCBzaXplb2YoZGlzay0+ZGV2ZnNfbmFtZSksCisJCQkiJXMvY2QiLCBzZGV2LT5kZXZmc19uYW1lKTsKKwlkaXNrLT5kcml2ZXJmc19kZXYgPSAmc2Rldi0+c2Rldl9nZW5kZXY7CisJc2V0X2NhcGFjaXR5KGRpc2ssIGNkLT5jYXBhY2l0eSk7CisJZGlzay0+cHJpdmF0ZV9kYXRhID0gJmNkLT5kcml2ZXI7CisJZGlzay0+cXVldWUgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOworCWNkLT5jZGkuZGlzayA9IGRpc2s7CisKKwlpZiAocmVnaXN0ZXJfY2Ryb20oJmNkLT5jZGkpKQorCQlnb3RvIGZhaWxfcHV0OworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2QpOworCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKKwlhZGRfZGlzayhkaXNrKTsKKworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICJBdHRhY2hlZCBzY3NpIENELVJPTSAlcyBhdCBzY3NpJWQsIGNoYW5uZWwgJWQsIGlkICVkLCBsdW4gJWRcbiIsCisJICAgIGNkLT5jZGkubmFtZSwgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwKKwkgICAgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJcmV0dXJuIDA7CisKK2ZhaWxfcHV0OgorCXB1dF9kaXNrKGRpc2spOworZmFpbF9mcmVlOgorCWtmcmVlKGNkKTsKK2ZhaWw6CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyB2b2lkIGdldF9zZWN0b3JzaXplKHN0cnVjdCBzY3NpX2NkICpjZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFsxMF07CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCWludCB0aGVfcmVzdWx0LCByZXRyaWVzID0gMzsKKwlpbnQgc2VjdG9yX3NpemU7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOworCXJlcXVlc3RfcXVldWVfdCAqcXVldWU7CisKKwlidWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghYnVmZmVyKQorCQlnb3RvIEVub21lbTsKKwlTUnBudCA9IHNjc2lfYWxsb2NhdGVfcmVxdWVzdChjZC0+ZGV2aWNlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIVNScG50KQorCQlnb3RvIEVub21lbTsKKworCWRvIHsKKwkJY21kWzBdID0gUkVBRF9DQVBBQ0lUWTsKKwkJbWVtc2V0KCh2b2lkICopICZjbWRbMV0sIDAsIDkpOworCQkvKiBNYXJrIGFzIHJlYWxseSBidXN5ICovCisJCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0JVU1k7CisJCVNScG50LT5zcl9jbWRfbGVuID0gMDsKKworCQltZW1zZXQoYnVmZmVyLCAwLCA4KTsKKworCQkvKiBEbyB0aGUgY29tbWFuZCBhbmQgd2FpdC4uICovCisJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJc2NzaV93YWl0X3JlcShTUnBudCwgKHZvaWQgKikgY21kLCAodm9pZCAqKSBidWZmZXIsCisJCQkgICAgICA4LCBTUl9USU1FT1VULCBNQVhfUkVUUklFUyk7CisKKwkJdGhlX3Jlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CisJCXJldHJpZXMtLTsKKworCX0gd2hpbGUgKHRoZV9yZXN1bHQgJiYgcmV0cmllcyk7CisKKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CisKKwlpZiAodGhlX3Jlc3VsdCkgeworCQljZC0+Y2FwYWNpdHkgPSAweDFmZmZmZjsKKwkJc2VjdG9yX3NpemUgPSAyMDQ4OwkvKiBBIGd1ZXNzLCBqdXN0IGluIGNhc2UgKi8KKwkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMTsKKwl9IGVsc2UgeworI2lmIDAKKwkJaWYgKGNkcm9tX2dldF9sYXN0X3dyaXR0ZW4oJmNkLT5jZGksCisJCQkJCSAgICZjZC0+Y2FwYWNpdHkpKQorI2VuZGlmCisJCQljZC0+Y2FwYWNpdHkgPSAxICsgKChidWZmZXJbMF0gPDwgMjQpIHwKKwkJCQkJCSAgICAoYnVmZmVyWzFdIDw8IDE2KSB8CisJCQkJCQkgICAgKGJ1ZmZlclsyXSA8PCA4KSB8CisJCQkJCQkgICAgYnVmZmVyWzNdKTsKKwkJc2VjdG9yX3NpemUgPSAoYnVmZmVyWzRdIDw8IDI0KSB8CisJCSAgICAoYnVmZmVyWzVdIDw8IDE2KSB8IChidWZmZXJbNl0gPDwgOCkgfCBidWZmZXJbN107CisJCXN3aXRjaCAoc2VjdG9yX3NpemUpIHsKKwkJCS8qCisJCQkgKiBIUCA0MDIwaSBDRC1SZWNvcmRlciByZXBvcnRzIDIzNDAgYnl0ZSBzZWN0b3JzCisJCQkgKiBQaGlsaXBzIENELVdyaXRlcnMgcmVwb3J0IDIzNTIgYnl0ZSBzZWN0b3JzCisJCQkgKgorCQkJICogVXNlIDJrIHNlY3RvcnMgZm9yIHRoZW0uLgorCQkJICovCisJCWNhc2UgMDoKKwkJY2FzZSAyMzQwOgorCQljYXNlIDIzNTI6CisJCQlzZWN0b3Jfc2l6ZSA9IDIwNDg7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAyMDQ4OgorCQkJY2QtPmNhcGFjaXR5ICo9IDQ7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSA1MTI6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiJXM6IHVuc3VwcG9ydGVkIHNlY3RvciBzaXplICVkLlxuIiwKKwkJCSAgICAgICBjZC0+Y2RpLm5hbWUsIHNlY3Rvcl9zaXplKTsKKwkJCWNkLT5jYXBhY2l0eSA9IDA7CisJCQljZC0+bmVlZHNfc2VjdG9yX3NpemUgPSAxOworCQl9CisKKwkJY2QtPmRldmljZS0+c2VjdG9yX3NpemUgPSBzZWN0b3Jfc2l6ZTsKKworCQkvKgorCQkgKiBBZGQgdGhpcyBzbyB0aGF0IHdlIGhhdmUgdGhlIGFiaWxpdHkgdG8gY29ycmVjdGx5IGdhdWdlCisJCSAqIHdoYXQgdGhlIGRldmljZSBpcyBjYXBhYmxlIG9mLgorCQkgKi8KKwkJY2QtPm5lZWRzX3NlY3Rvcl9zaXplID0gMDsKKwkJc2V0X2NhcGFjaXR5KGNkLT5kaXNrLCBjZC0+Y2FwYWNpdHkpOworCX0KKworCXF1ZXVlID0gY2QtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxdWV1ZSwgc2VjdG9yX3NpemUpOworb3V0OgorCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuOworCitFbm9tZW06CisJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CisJc2VjdG9yX3NpemUgPSAyMDQ4OwkvKiBBIGd1ZXNzLCBqdXN0IGluIGNhc2UgKi8KKwljZC0+bmVlZHNfc2VjdG9yX3NpemUgPSAxOworCWlmIChTUnBudCkKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBnZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBzY3NpX2NkICpjZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJc3RydWN0IHNjc2lfbW9kZV9kYXRhIGRhdGE7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQ7CisJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJdW5zaWduZWQgaW50IHRoZV9yZXN1bHQ7CisJaW50IHJldHJpZXMsIHJjLCBuOworCisJc3RhdGljIGNoYXIgKmxvYWRtZWNoW10gPQorCXsKKwkJImNhZGR5IiwKKwkJInRyYXkiLAorCQkicG9wLXVwIiwKKwkJIiIsCisJCSJjaGFuZ2VyIiwKKwkJImNhcnRyaWRnZSBjaGFuZ2VyIiwKKwkJIiIsCisJCSIiCisJfTsKKworCS8qIGFsbG9jYXRlIGEgcmVxdWVzdCBmb3IgdGhlIFRFU1RfVU5JVF9SRUFEWSAqLworCVNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KGNkLT5kZXZpY2UsIEdGUF9LRVJORUwpOworCWlmICghU1JwbnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiKGdldF9jYXBhYmlsaXRpZXM6KSBSZXF1ZXN0IGFsbG9jYXRpb24gIgorCQkgICAgICAgImZhaWx1cmUuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGFsbG9jYXRlIHRyYW5zZmVyIGJ1ZmZlciAqLworCWJ1ZmZlciA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFidWZmZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzcjogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpc3N1ZSBURVNUX1VOSVRfUkVBRFkgdW50aWwgdGhlIGluaXRpYWwgc3RhcnR1cCBVTklUX0FUVEVOVElPTgorCSAqIGNvbmRpdGlvbnMgYXJlIGdvbmUsIG9yIGEgdGltZW91dCBoYXBwZW5zCisJICovCisJcmV0cmllcyA9IDA7CisJZG8geworCQltZW1zZXQoKHZvaWQgKiljbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisKKwkJU1JwbnQtPnNyX2NtZF9sZW4gPSAwOworCQlTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdID0gMDsKKwkJU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsyXSA9IDA7CisJCVNScG50LT5zcl9kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJCXNjc2lfd2FpdF9yZXEgKFNScG50LCAodm9pZCAqKSBjbWQsIGJ1ZmZlciwKKwkJCSAgICAgICAwLCBTUl9USU1FT1VULCBNQVhfUkVUUklFUyk7CisKKwkJdGhlX3Jlc3VsdCA9IFNScG50LT5zcl9yZXN1bHQ7CisJCXJldHJpZXMrKzsKKwl9IHdoaWxlIChyZXRyaWVzIDwgNSAmJiAKKwkJICghc2NzaV9zdGF0dXNfaXNfZ29vZCh0aGVfcmVzdWx0KSB8fAorCQkgICgoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCisJCSAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0gPT0gVU5JVF9BVFRFTlRJT04pKSk7CisKKwkvKiBhc2sgZm9yIG1vZGUgcGFnZSAweDJhICovCisJcmMgPSBzY3NpX21vZGVfc2Vuc2UoY2QtPmRldmljZSwgMCwgMHgyYSwgYnVmZmVyLCAxMjgsCisJCQkgICAgIFNSX1RJTUVPVVQsIDMsICZkYXRhKTsKKworCWlmICghc2NzaV9zdGF0dXNfaXNfZ29vZChyYykpIHsKKwkJLyogZmFpbGVkLCBkcml2ZSBkb2Vzbid0IGhhdmUgY2FwYWJpbGl0aWVzIG1vZGUgcGFnZSAqLworCQljZC0+Y2RpLnNwZWVkID0gMTsKKwkJY2QtPmNkaS5tYXNrIHw9IChDRENfQ0RfUiB8IENEQ19DRF9SVyB8IENEQ19EVkRfUiB8CisJCQkJCSBDRENfRFZEIHwgQ0RDX0RWRF9SQU0gfAorCQkJCQkgQ0RDX1NFTEVDVF9ESVNDIHwgQ0RDX1NFTEVDVF9TUEVFRCk7CisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJa2ZyZWUoYnVmZmVyKTsKKwkJcHJpbnRrKCIlczogc2NzaS0xIGRyaXZlXG4iLCBjZC0+Y2RpLm5hbWUpOworCQlyZXR1cm47CisJfQorCisJbiA9IGRhdGEuaGVhZGVyX2xlbmd0aCArIGRhdGEuYmxvY2tfZGVzY3JpcHRvcl9sZW5ndGg7CisJY2QtPmNkaS5zcGVlZCA9ICgoYnVmZmVyW24gKyA4XSA8PCA4KSArIGJ1ZmZlcltuICsgOV0pIC8gMTc2OworCWNkLT5yZWFkY2Rfa25vd24gPSAxOworCWNkLT5yZWFkY2RfY2RkYSA9IGJ1ZmZlcltuICsgNV0gJiAweDAxOworCS8qIHByaW50IHNvbWUgY2FwYWJpbGl0eSBiaXRzICovCisJcHJpbnRrKCIlczogc2NzaTMtbW1jIGRyaXZlOiAlZHgvJWR4ICVzJXMlcyVzJXMlc1xuIiwgY2QtPmNkaS5uYW1lLAorCSAgICAgICAoKGJ1ZmZlcltuICsgMTRdIDw8IDgpICsgYnVmZmVyW24gKyAxNV0pIC8gMTc2LAorCSAgICAgICBjZC0+Y2RpLnNwZWVkLAorCSAgICAgICBidWZmZXJbbiArIDNdICYgMHgwMSA/ICJ3cml0ZXIgIiA6ICIiLCAvKiBDRCBXcml0ZXIgKi8KKwkgICAgICAgYnVmZmVyW24gKyAzXSAmIDB4MjAgPyAiZHZkLXJhbSAiIDogIiIsCisJICAgICAgIGJ1ZmZlcltuICsgMl0gJiAweDAyID8gImNkL3J3ICIgOiAiIiwgLyogY2FuIHJlYWQgcmV3cml0ZWFibGUgKi8KKwkgICAgICAgYnVmZmVyW24gKyA0XSAmIDB4MjAgPyAieGEvZm9ybTIgIiA6ICIiLAkvKiBjYW4gcmVhZCB4YS9mcm9tMiAqLworCSAgICAgICBidWZmZXJbbiArIDVdICYgMHgwMSA/ICJjZGRhICIgOiAiIiwgLyogY2FuIHJlYWQgYXVkaW8gZGF0YSAqLworCSAgICAgICBsb2FkbWVjaFtidWZmZXJbbiArIDZdID4+IDVdKTsKKwlpZiAoKGJ1ZmZlcltuICsgNl0gPj4gNSkgPT0gMCkKKwkJLyogY2FkZHkgZHJpdmVzIGNhbid0IGNsb3NlIHRyYXkuLi4gKi8KKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19DTE9TRV9UUkFZOworCWlmICgoYnVmZmVyW24gKyAyXSAmIDB4OCkgPT0gMCkKKwkJLyogbm90IGEgRFZEIGRyaXZlICovCisJCWNkLT5jZGkubWFzayB8PSBDRENfRFZEOworCWlmICgoYnVmZmVyW24gKyAzXSAmIDB4MjApID09IDApIAorCQkvKiBjYW4ndCB3cml0ZSBEVkQtUkFNIG1lZGlhICovCisJCWNkLT5jZGkubWFzayB8PSBDRENfRFZEX1JBTTsKKwlpZiAoKGJ1ZmZlcltuICsgM10gJiAweDEwKSA9PSAwKQorCQkvKiBjYW4ndCB3cml0ZSBEVkQtUiBtZWRpYSAqLworCQljZC0+Y2RpLm1hc2sgfD0gQ0RDX0RWRF9SOworCWlmICgoYnVmZmVyW24gKyAzXSAmIDB4MikgPT0gMCkKKwkJLyogY2FuJ3Qgd3JpdGUgQ0QtUlcgbWVkaWEgKi8KKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19DRF9SVzsKKwlpZiAoKGJ1ZmZlcltuICsgM10gJiAweDEpID09IDApCisJCS8qIGNhbid0IHdyaXRlIENELVIgbWVkaWEgKi8KKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19DRF9SOworCWlmICgoYnVmZmVyW24gKyA2XSAmIDB4OCkgPT0gMCkKKwkJLyogY2FuJ3QgZWplY3QgKi8KKwkJY2QtPmNkaS5tYXNrIHw9IENEQ19PUEVOX1RSQVk7CisKKwlpZiAoKGJ1ZmZlcltuICsgNl0gPj4gNSkgPT0gbWVjaHR5cGVfaW5kaXZpZHVhbF9jaGFuZ2VyIHx8CisJICAgIChidWZmZXJbbiArIDZdID4+IDUpID09IG1lY2h0eXBlX2NhcnRyaWRnZV9jaGFuZ2VyKQorCQljZC0+Y2RpLmNhcGFjaXR5ID0KKwkJICAgIGNkcm9tX251bWJlcl9vZl9zbG90cygmY2QtPmNkaSk7CisJaWYgKGNkLT5jZGkuY2FwYWNpdHkgPD0gMSkKKwkJLyogbm90IGEgY2hhbmdlciAqLworCQljZC0+Y2RpLm1hc2sgfD0gQ0RDX1NFTEVDVF9ESVNDOworCS8qZWxzZSAgICBJIGRvbid0IHRoaW5rIGl0IGNhbiBjbG9zZSBpdHMgdHJheQorCQljZC0+Y2RpLm1hc2sgfD0gQ0RDX0NMT1NFX1RSQVk7ICovCisKKwkvKgorCSAqIGlmIERWRC1SQU0sIE1SVy1XIG9yIENELVJXLCB3ZSBhcmUgcmFuZG9tbHkgd3JpdGFibGUKKwkgKi8KKwlpZiAoKGNkLT5jZGkubWFzayAmIChDRENfRFZEX1JBTSB8IENEQ19NUldfVyB8IENEQ19SQU0gfCBDRENfQ0RfUlcpKSAhPQorCQkJKENEQ19EVkRfUkFNIHwgQ0RDX01SV19XIHwgQ0RDX1JBTSB8IENEQ19DRF9SVykpIHsKKwkJY2QtPmRldmljZS0+d3JpdGVhYmxlID0gMTsKKwl9CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJa2ZyZWUoYnVmZmVyKTsKK30KKworLyoKKyAqIHNyX3BhY2tldCgpIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGdlbmVyaWMgY29tbWFuZHMgZ2VuZXJhdGVkCisgKiBieSB0aGUgVW5pZm9ybSBDRC1ST00gbGF5ZXIuIAorICovCitzdGF0aWMgaW50IHNyX3BhY2tldChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJc3RydWN0IHBhY2tldF9jb21tYW5kICpjZ2MpCit7CisJaWYgKGNnYy0+dGltZW91dCA8PSAwKQorCQljZ2MtPnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCisJc3JfZG9faW9jdGwoY2RpLT5oYW5kbGUsIGNnYyk7CisKKwlyZXR1cm4gY2djLT5zdGF0OworfQorCisvKioKKyAqCXNyX2tyZWZfcmVsZWFzZSAtIENhbGxlZCB0byBmcmVlIHRoZSBzY3NpX2NkIHN0cnVjdHVyZQorICoJQGtyZWY6IHBvaW50ZXIgdG8gZW1iZWRkZWQga3JlZgorICoKKyAqCXNyX3JlZl9zZW0gbXVzdCBiZSBoZWxkIGVudGVyaW5nIHRoaXMgcm91dGluZS4gIEJlY2F1c2UgaXQgaXMKKyAqCWNhbGxlZCBvbiBsYXN0IHB1dCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBzY3NpX2NkX2dldCgpCisgKglzY3NpX2NkX3B1dCgpIGhlbHBlcnMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgc2VtYXBob3JlIGRpcmVjdGx5CisgKglhbmQgbmV2ZXIgZG8gYSBkaXJlY3Qga3JlZl9wdXQoKS4KKyAqKi8KK3N0YXRpYyB2b2lkIHNyX2tyZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHNjc2lfY2QsIGtyZWYpOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gY2QtPmRpc2s7CisKKwlzcGluX2xvY2soJnNyX2luZGV4X2xvY2spOworCWNsZWFyX2JpdChkaXNrLT5maXJzdF9taW5vciwgc3JfaW5kZXhfYml0cyk7CisJc3Bpbl91bmxvY2soJnNyX2luZGV4X2xvY2spOworCisJdW5yZWdpc3Rlcl9jZHJvbSgmY2QtPmNkaSk7CisKKwlkaXNrLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJcHV0X2Rpc2soZGlzayk7CisKKwlrZnJlZShjZCk7Cit9CisKK3N0YXRpYyBpbnQgc3JfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRlbF9nZW5kaXNrKGNkLT5kaXNrKTsKKworCWRvd24oJnNyX3JlZl9zZW0pOworCWtyZWZfcHV0KCZjZC0+a3JlZiwgc3Jfa3JlZl9yZWxlYXNlKTsKKwl1cCgmc3JfcmVmX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zcih2b2lkKQoreworCWludCByYzsKKworCXJjID0gcmVnaXN0ZXJfYmxrZGV2KFNDU0lfQ0RST01fTUFKT1IsICJzciIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJldHVybiBzY3NpX3JlZ2lzdGVyX2RyaXZlcigmc3JfdGVtcGxhdGUuZ2VuZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfc3Iodm9pZCkKK3sKKwlzY3NpX3VucmVnaXN0ZXJfZHJpdmVyKCZzcl90ZW1wbGF0ZS5nZW5kcnYpOworCXVucmVnaXN0ZXJfYmxrZGV2KFNDU0lfQ0RST01fTUFKT1IsICJzciIpOworfQorCittb2R1bGVfaW5pdChpbml0X3NyKTsKK21vZHVsZV9leGl0KGV4aXRfc3IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmggYi9kcml2ZXJzL3Njc2kvc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMxNzgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NyLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICAgICAgc3IuaCBieSBEYXZpZCBHaWxsZXIKKyAqICAgICAgQ0QtUk9NIGRpc2sgZHJpdmVyIGhlYWRlciBmaWxlCisgKiAgICAgIAorICogICAgICBhZGFwdGVkIGZyb206CisgKiAgICAgIHNkLmggQ29weXJpZ2h0IChDKSAxOTkyIERyZXcgRWNraGFyZHQgCisgKiAgICAgIFNDU0kgZGlzayBkcml2ZXIgaGVhZGVyIGZpbGUgYnkKKyAqICAgICAgICAgICAgICBEcmV3IEVja2hhcmR0IAorICoKKyAqICAgICAgPGRyZXdAY29sb3JhZG8uZWR1PgorICoKKyAqICAgICAgIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlIGVyaWNAYW5kYW50ZS5vcmcgdG8KKyAqICAgICAgIGFkZCBzY2F0dGVyLWdhdGhlciwgbXVsdGlwbGUgb3V0c3RhbmRpbmcgcmVxdWVzdCwgYW5kIG90aGVyCisgKiAgICAgICBlbmhhbmNlbWVudHMuCisgKi8KKworI2lmbmRlZiBfU1JfSAorI2RlZmluZSBfU1JfSAorCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisKK3N0cnVjdCBzY3NpX2RldmljZTsKKworLyogVGhlIENEUk9NIGlzIGZhaXJseSBzbG93LCBzbyB3ZSBuZWVkIGEgbGl0dGxlIGV4dHJhIHRpbWUgKi8KKy8qIEluIGZhY3QsIGl0IGlzIHZlcnkgc2xvdyBpZiBpdCBoYXMgdG8gc3BpbiB1cCBmaXJzdCAqLworI2RlZmluZSBJT0NUTF9USU1FT1VUIDMwKkhaCisKKwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9jZCB7CisJc3RydWN0IHNjc2lfZHJpdmVyICpkcml2ZXI7CisJdW5zaWduZWQgY2FwYWNpdHk7CS8qIHNpemUgaW4gYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZW5kb3I7CS8qIHZlbmRvciBjb2RlLCBzZWUgc3JfdmVuZG9yLmMgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgbXNfb2Zmc2V0OwkvKiBmb3IgcmVhZGluZyBtdWx0aXNlc3Npb24tQ0QncyAgICAgICAgKi8KKwl1bnNpZ25lZCBuZWVkc19zZWN0b3Jfc2l6ZToxOwkvKiBuZWVkcyB0byBnZXQgc2VjdG9yIHNpemUgKi8KKwl1bnNpZ25lZCB1c2U6MTsJCS8qIGlzIHRoaXMgZGV2aWNlIHN0aWxsIHN1cHBvcnRhYmxlICAgICAqLworCXVuc2lnbmVkIHhhX2ZsYWc6MTsJLyogQ0QgaGFzIFhBIHNlY3RvcnMgPyAqLworCXVuc2lnbmVkIHJlYWRjZF9rbm93bjoxOwkvKiBkcml2ZSBzdXBwb3J0cyBSRUFEX0NEICgweGJlKSAqLworCXVuc2lnbmVkIHJlYWRjZF9jZGRhOjE7CS8qIHJlYWRpbmcgYXVkaW8gZGF0YSB1c2luZyBSRUFEX0NEICovCisJc3RydWN0IGNkcm9tX2RldmljZV9pbmZvIGNkaTsKKwkvKiBXZSBob2xkIGdlbmRpc2sgYW5kIHNjc2lfZGV2aWNlIHJlZmVyZW5jZXMgb24gcHJvYmUgYW5kIHVzZQorCSAqIHRoZSByZWZzIG9uIHRoaXMga3JlZiB0byBkZWNpZGUgd2hlbiB0byByZWxlYXNlIHRoZW0gKi8KKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBnZW5kaXNrICpkaXNrOworfSBTY3NpX0NEOworCitpbnQgc3JfZG9faW9jdGwoU2NzaV9DRCAqLCBzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKik7CisKK2ludCBzcl9sb2NrX2Rvb3Ioc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIGludCk7CitpbnQgc3JfdHJheV9tb3ZlKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBpbnQpOworaW50IHNyX2RyaXZlX3N0YXR1cyhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKK2ludCBzcl9kaXNrX3N0YXR1cyhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKik7CitpbnQgc3JfZ2V0X2xhc3Rfc2Vzc2lvbihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiAqKTsKK2ludCBzcl9nZXRfbWNuKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBzdHJ1Y3QgY2Ryb21fbWNuICopOworaW50IHNyX3Jlc2V0KHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqKTsKK2ludCBzcl9zZWxlY3Rfc3BlZWQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzcGVlZCk7CitpbnQgc3JfYXVkaW9faW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIHVuc2lnbmVkIGludCwgdm9pZCAqKTsKK2ludCBzcl9kZXZfaW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKK2ludCBzcl9pc194YShTY3NpX0NEICopOworCisvKiBzcl92ZW5kb3IuYyAqLwordm9pZCBzcl92ZW5kb3JfaW5pdChTY3NpX0NEICopOworaW50IHNyX2NkX2NoZWNrKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqKTsKK2ludCBzcl9zZXRfYmxvY2tsZW5ndGgoU2NzaV9DRCAqLCBpbnQgYmxvY2tsZW5ndGgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MWJlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCkBAIC0wLDAgKzEsNTY4IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisKKyNpbmNsdWRlICJzci5oIgorCisjaWYgMAorI2RlZmluZSBERUJVRworI2VuZGlmCisKKy8qIFRoZSBzcl9pc194YSgpIHNlZW1zIHRvIHRyaWdnZXIgZmlybXdhcmUgYnVncyB3aXRoIHNvbWUgZHJpdmVzIDotKAorICogSXQgaXMgb2ZmIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSB0dXJuZWQgb24gd2l0aCB0aGlzIG1vZHVsZSBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgeGFfdGVzdCA9IDA7CisKK21vZHVsZV9wYXJhbSh4YV90ZXN0LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworCisjZGVmaW5lIElPQ1RMX1JFVFJJRVMgMworCisvKiBBVEFQSSBkcml2ZXMgZG9uJ3QgaGF2ZSBhIFNDTURfUExBWUFVRElPX1RJIGNvbW1hbmQuICBXaGVuIHRoZXNlIGRyaXZlcworICAgYXJlIGVtdWxhdGluZyBhIFNDU0kgZGV2aWNlIHZpYSB0aGUgaWRlc2NzaSBtb2R1bGUsIHRoZXkgbmVlZCB0byBoYXZlCisgICBDRFJPTVBMQVlUUktJTkQgY29tbWFuZHMgdHJhbnNsYXRlZCBpbnRvIENEUk9NUExBWU1TRiBjb21tYW5kcyBmb3IgdGhlbSAqLworCitzdGF0aWMgaW50IHNyX2Zha2VfcGxheXRya2luZChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgc3RydWN0IGNkcm9tX3RpICp0aSkKK3sKKwlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgdHJrMF90ZSwgdHJrMV90ZTsKKwlzdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvY2hkcjsKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCWludCBudHJhY2tzLCByZXQ7CisKKwlpZiAoKHJldCA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DSERSLCAmdG9jaGRyKSkpCisJCXJldHVybiByZXQ7CisKKwludHJhY2tzID0gdG9jaGRyLmNkdGhfdHJrMSAtIHRvY2hkci5jZHRoX3RyazAgKyAxOworCQorCWlmICh0aS0+Y2R0aV90cmsxID09IG50cmFja3MpIAorCQl0aS0+Y2R0aV90cmsxID0gQ0RST01fTEVBRE9VVDsKKwllbHNlIGlmICh0aS0+Y2R0aV90cmsxICE9IENEUk9NX0xFQURPVVQpCisJCXRpLT5jZHRpX3RyazEgKys7CisKKwl0cmswX3RlLmNkdGVfdHJhY2sgPSB0aS0+Y2R0aV90cmswOworCXRyazBfdGUuY2R0ZV9mb3JtYXQgPSBDRFJPTV9NU0Y7CisJdHJrMV90ZS5jZHRlX3RyYWNrID0gdGktPmNkdGlfdHJrMTsKKwl0cmsxX3RlLmNkdGVfZm9ybWF0ID0gQ0RST01fTVNGOworCQorCWlmICgocmV0ID0gc3JfYXVkaW9faW9jdGwoY2RpLCBDRFJPTVJFQURUT0NFTlRSWSwgJnRyazBfdGUpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKHJldCA9IHNyX2F1ZGlvX2lvY3RsKGNkaSwgQ0RST01SRUFEVE9DRU5UUlksICZ0cmsxX3RlKSkpCisJCXJldHVybiByZXQ7CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBHUENNRF9QTEFZX0FVRElPX01TRjsKKwljZ2MuY21kWzNdID0gdHJrMF90ZS5jZHRlX2FkZHIubXNmLm1pbnV0ZTsKKwljZ2MuY21kWzRdID0gdHJrMF90ZS5jZHRlX2FkZHIubXNmLnNlY29uZDsKKwljZ2MuY21kWzVdID0gdHJrMF90ZS5jZHRlX2FkZHIubXNmLmZyYW1lOworCWNnYy5jbWRbNl0gPSB0cmsxX3RlLmNkdGVfYWRkci5tc2YubWludXRlOworCWNnYy5jbWRbN10gPSB0cmsxX3RlLmNkdGVfYWRkci5tc2Yuc2Vjb25kOworCWNnYy5jbWRbOF0gPSB0cmsxX3RlLmNkdGVfYWRkci5tc2YuZnJhbWU7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCXJldHVybiBzcl9kb19pb2N0bChjZGktPmhhbmRsZSwgJmNnYyk7Cit9CisKKy8qIFdlIGRvIG91ciBvd24gcmV0cmllcyBiZWNhdXNlIHdlIHdhbnQgdG8ga25vdyB3aGF0IHRoZSBzcGVjaWZpYworICAgZXJyb3IgY29kZSBpcy4gIE5vcm1hbGx5IHRoZSBVTklUX0FUVEVOVElPTiBjb2RlIHdpbGwgYXV0b21hdGljYWxseQorICAgY2xlYXIgYWZ0ZXIgb25lIGVycm9yICovCisKK2ludCBzcl9kb19pb2N0bChTY3NpX0NEICpjZCwgc3RydWN0IHBhY2tldF9jb21tYW5kICpjZ2MpCit7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICpTRGV2OworICAgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCWludCByZXN1bHQsIGVyciA9IDAsIHJldHJpZXMgPSAwOworCisJU0RldiA9IGNkLT5kZXZpY2U7CisJU1JwbnQgPSBzY3NpX2FsbG9jYXRlX3JlcXVlc3QoU0RldiwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICghU1JwbnQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBTQ1NJIHJlcXVlc3QgaW4gc3JfZG9faW9jdGwiKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisgICAgICAgIH0KKwlTUnBudC0+c3JfZGF0YV9kaXJlY3Rpb24gPSBjZ2MtPmRhdGFfZGlyZWN0aW9uOworCisgICAgICByZXRyeToKKwlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTRGV2KSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXNjc2lfd2FpdF9yZXEoU1JwbnQsIGNnYy0+Y21kLCBjZ2MtPmJ1ZmZlciwgY2djLT5idWZsZW4sCisJCSAgICAgIGNnYy0+dGltZW91dCwgSU9DVExfUkVUUklFUyk7CisKKwlyZXEgPSBTUnBudC0+c3JfcmVxdWVzdDsKKwlpZiAoU1JwbnQtPnNyX2J1ZmZlciAmJiByZXEtPmJ1ZmZlciAmJiBTUnBudC0+c3JfYnVmZmVyICE9IHJlcS0+YnVmZmVyKSB7CisJCW1lbWNweShyZXEtPmJ1ZmZlciwgU1JwbnQtPnNyX2J1ZmZlciwgU1JwbnQtPnNyX2J1ZmZsZW4pOworCQlrZnJlZShTUnBudC0+c3JfYnVmZmVyKTsKKwkJU1JwbnQtPnNyX2J1ZmZlciA9IHJlcS0+YnVmZmVyOworICAgICAgICB9CisKKwlyZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCisJLyogTWluaW1hbCBlcnJvciBjaGVja2luZy4gIElnbm9yZSBjYXNlcyB3ZSBrbm93IGFib3V0LCBhbmQgcmVwb3J0IHRoZSByZXN0LiAqLworCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICE9IDApIHsKKwkJc3dpdGNoIChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzJdICYgMHhmKSB7CisJCWNhc2UgVU5JVF9BVFRFTlRJT046CisJCQlTRGV2LT5jaGFuZ2VkID0gMTsKKwkJCWlmICghY2djLT5xdWlldCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogZGlzYyBjaGFuZ2UgZGV0ZWN0ZWQuXG4iLCBjZC0+Y2RpLm5hbWUpOworCQkJaWYgKHJldHJpZXMrKyA8IDEwKQorCQkJCWdvdG8gcmV0cnk7CisJCQllcnIgPSAtRU5PTUVESVVNOworCQkJYnJlYWs7CisJCWNhc2UgTk9UX1JFQURZOgkvKiBUaGlzIGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gZGlzYyBpbiBkcml2ZSAqLworCQkJaWYgKFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTJdID09IDB4MDQgJiYKKwkJCSAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzEzXSA9PSAweDAxKSB7CisJCQkJLyogc2Vuc2U6IExvZ2ljYWwgdW5pdCBpcyBpbiBwcm9jZXNzIG9mIGJlY29taW5nIHJlYWR5ICovCisJCQkJaWYgKCFjZ2MtPnF1aWV0KQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0RST00gbm90IHJlYWR5IHlldC5cbiIsIGNkLT5jZGkubmFtZSk7CisJCQkJaWYgKHJldHJpZXMrKyA8IDEwKSB7CisJCQkJCS8qIHNsZWVwIDIgc2VjIGFuZCB0cnkgYWdhaW4gKi8KKwkJCQkJc3NsZWVwKDIpOworCQkJCQlnb3RvIHJldHJ5OworCQkJCX0gZWxzZSB7CisJCQkJCS8qIDIwIHNlY3MgYXJlIGVub3VnaD8gKi8KKwkJCQkJZXJyID0gLUVOT01FRElVTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCFjZ2MtPnF1aWV0KQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDRFJPTSBub3QgcmVhZHkuICBNYWtlIHN1cmUgdGhlcmUgaXMgYSBkaXNjIGluIHRoZSBkcml2ZS5cbiIsIGNkLT5jZGkubmFtZSk7CisjaWZkZWYgREVCVUcKKwkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzciIsIFNScG50KTsKKyNlbmRpZgorCQkJZXJyID0gLUVOT01FRElVTTsKKwkJCWJyZWFrOworCQljYXNlIElMTEVHQUxfUkVRVUVTVDoKKwkJCWVyciA9IC1FSU87CisJCQlpZiAoU1JwbnQtPnNyX3NlbnNlX2J1ZmZlclsxMl0gPT0gMHgyMCAmJgorCQkJICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMTNdID09IDB4MDApCisJCQkJLyogc2Vuc2U6IEludmFsaWQgY29tbWFuZCBvcGVyYXRpb24gY29kZSAqLworCQkJCWVyciA9IC1FRFJJVkVfQ0FOVF9ET19USElTOworI2lmZGVmIERFQlVHCisJCQlfX3Njc2lfcHJpbnRfY29tbWFuZChjZ2MtPmNtZCk7CisJCQlzY3NpX3ByaW50X3JlcV9zZW5zZSgic3IiLCBTUnBudCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ0RST00gKGlvY3RsKSBlcnJvciwgY29tbWFuZDogIiwgY2QtPmNkaS5uYW1lKTsKKwkJCV9fc2NzaV9wcmludF9jb21tYW5kKGNnYy0+Y21kKTsKKwkJCXNjc2lfcHJpbnRfcmVxX3NlbnNlKCJzciIsIFNScG50KTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwl9CisKKwlpZiAoY2djLT5zZW5zZSkKKwkJbWVtY3B5KGNnYy0+c2Vuc2UsIFNScG50LT5zcl9zZW5zZV9idWZmZXIsIHNpemVvZigqY2djLT5zZW5zZSkpOworCisJLyogV2FrZSB1cCBhIHByb2Nlc3Mgd2FpdGluZyBmb3IgZGV2aWNlICovCisgICAgICBvdXRfZnJlZToKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJU1JwbnQgPSBOVUxMOworICAgICAgb3V0OgorCWNnYy0+c3RhdCA9IGVycjsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBpbnRlcmZhY2UgdG8gY2Ryb20uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgdGVzdF91bml0X3JlYWR5KFNjc2lfQ0QgKmNkKQoreworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBHUENNRF9URVNUX1VOSVRfUkVBRFk7CisJY2djLnF1aWV0ID0gMTsKKwljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisJcmV0dXJuIHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKK30KKworaW50IHNyX3RyYXlfbW92ZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgaW50IHBvcykKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBHUENNRF9TVEFSVF9TVE9QX1VOSVQ7CisJY2djLmNtZFs0XSA9IChwb3MgPT0gMCkgPyAweDAzIC8qIGNsb3NlICovIDogMHgwMiAvKiBlamVjdCAqLyA7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisJY2djLnRpbWVvdXQgPSBJT0NUTF9USU1FT1VUOworCXJldHVybiBzcl9kb19pb2N0bChjZCwgJmNnYyk7Cit9CisKK2ludCBzcl9sb2NrX2Rvb3Ioc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBsb2NrKQoreworCVNjc2lfQ0QgKmNkID0gY2RpLT5oYW5kbGU7CisKKwlyZXR1cm4gc2NzaV9zZXRfbWVkaXVtX3JlbW92YWwoY2QtPmRldmljZSwgbG9jayA/CisJCSAgICAgICBTQ1NJX1JFTU9WQUxfUFJFVkVOVCA6IFNDU0lfUkVNT1ZBTF9BTExPVyk7Cit9CisKK2ludCBzcl9kcml2ZV9zdGF0dXMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzbG90KQoreworCWlmIChDRFNMX0NVUlJFTlQgIT0gc2xvdCkgeworCQkvKiB3ZSBoYXZlIG5vIGNoYW5nZXIgc3VwcG9ydCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKDAgPT0gdGVzdF91bml0X3JlYWR5KGNkaS0+aGFuZGxlKSkKKwkJcmV0dXJuIENEU19ESVNDX09LOworCisJcmV0dXJuIENEU19UUkFZX09QRU47Cit9CisKK2ludCBzcl9kaXNrX3N0YXR1cyhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSkKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBjZHJvbV90b2NoZHIgdG9jX2g7CisJc3RydWN0IGNkcm9tX3RvY2VudHJ5IHRvY19lOworCWludCBpLCByYywgaGF2ZV9kYXRhdHJhY2tzID0gMDsKKworCS8qIGxvb2sgZm9yIGRhdGEgdHJhY2tzICovCisJaWYgKDAgIT0gKHJjID0gc3JfYXVkaW9faW9jdGwoY2RpLCBDRFJPTVJFQURUT0NIRFIsICZ0b2NfaCkpKQorCQlyZXR1cm4gKHJjID09IC1FTk9NRURJVU0pID8gQ0RTX05PX0RJU0MgOiBDRFNfTk9fSU5GTzsKKworCWZvciAoaSA9IHRvY19oLmNkdGhfdHJrMDsgaSA8PSB0b2NfaC5jZHRoX3RyazE7IGkrKykgeworCQl0b2NfZS5jZHRlX3RyYWNrID0gaTsKKwkJdG9jX2UuY2R0ZV9mb3JtYXQgPSBDRFJPTV9MQkE7CisJCWlmIChzcl9hdWRpb19pb2N0bChjZGksIENEUk9NUkVBRFRPQ0VOVFJZLCAmdG9jX2UpKQorCQkJcmV0dXJuIENEU19OT19JTkZPOworCQlpZiAodG9jX2UuY2R0ZV9jdHJsICYgQ0RST01fREFUQV9UUkFDSykgeworCQkJaGF2ZV9kYXRhdHJhY2tzID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghaGF2ZV9kYXRhdHJhY2tzKQorCQlyZXR1cm4gQ0RTX0FVRElPOworCisJaWYgKGNkLT54YV9mbGFnKQorCQlyZXR1cm4gQ0RTX1hBXzJfMTsKKwllbHNlCisJCXJldHVybiBDRFNfREFUQV8xOworfQorCitpbnQgc3JfZ2V0X2xhc3Rfc2Vzc2lvbihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gKm1zX2luZm8pCit7CisJU2NzaV9DRCAqY2QgPSBjZGktPmhhbmRsZTsKKworCW1zX2luZm8tPmFkZHIubGJhID0gY2QtPm1zX29mZnNldDsKKwltc19pbmZvLT54YV9mbGFnID0gY2QtPnhhX2ZsYWcgfHwgY2QtPm1zX29mZnNldCA+IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogcHJpbWl0aXZlIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gaGF2ZSBHRlBfRE1BIHNldCBiYXNlZCBvbgorICogdGhlIHN0YXR1cyBvZiB0aGUgdW5jaGVja2VkX2lzYV9kbWEgZmxhZyBpbiB0aGUgaG9zdCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgU1JfR0ZQX0RNQShjZCkgKCgoY2QpLT5kZXZpY2UtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKSA/IEdGUF9ETUEgOiAwKQorCitpbnQgc3JfZ2V0X21jbihzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgc3RydWN0IGNkcm9tX21jbiAqbWNuKQoreworCVNjc2lfQ0QgKmNkID0gY2RpLT5oYW5kbGU7CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwljaGFyICpidWZmZXIgPSBrbWFsbG9jKDMyLCBHRlBfS0VSTkVMIHwgU1JfR0ZQX0RNQShjZCkpOworCWludCByZXN1bHQ7CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBHUENNRF9SRUFEX1NVQkNIQU5ORUw7CisJY2djLmNtZFsyXSA9IDB4NDA7CS8qIEkgZG8gd2FudCB0aGUgc3ViY2hhbm5lbCBpbmZvICovCisJY2djLmNtZFszXSA9IDB4MDI7CS8qIEdpdmUgbWUgbWVkaXVtIGNhdGFsb2cgbnVtYmVyIGluZm8gKi8KKwljZ2MuY21kWzhdID0gMjQ7CisJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwljZ2MuYnVmbGVuID0gMjQ7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKwlyZXN1bHQgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisKKwltZW1jcHkobWNuLT5tZWRpdW1fY2F0YWxvZ19udW1iZXIsIGJ1ZmZlciArIDksIDEzKTsKKwltY24tPm1lZGl1bV9jYXRhbG9nX251bWJlclsxM10gPSAwOworCisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgc3JfcmVzZXQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzcl9zZWxlY3Rfc3BlZWQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzcGVlZCkKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCXN0cnVjdCBwYWNrZXRfY29tbWFuZCBjZ2M7CisKKwlpZiAoc3BlZWQgPT0gMCkKKwkJc3BlZWQgPSAweGZmZmY7CS8qIHNldCB0byBtYXggKi8KKwllbHNlCisJCXNwZWVkICo9IDE3NzsJLyogTnggdG8ga2J5dGUvcyAqLworCisJbWVtc2V0KCZjZ2MsIDAsIHNpemVvZihzdHJ1Y3QgcGFja2V0X2NvbW1hbmQpKTsKKwljZ2MuY21kWzBdID0gR1BDTURfU0VUX1NQRUVEOwkvKiBTRVQgQ0QgU1BFRUQgKi8KKwljZ2MuY21kWzJdID0gKHNwZWVkID4+IDgpICYgMHhmZjsJLyogTVNCIGZvciBzcGVlZCAoaW4ga2J5dGVzL3NlYykgKi8KKwljZ2MuY21kWzNdID0gc3BlZWQgJiAweGZmOwkvKiBMU0IgKi8KKwljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisKKwlpZiAoc3JfZG9faW9jdGwoY2QsICZjZ2MpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIGNkcm9tIGRyaXZlci4gYXJnIGlzIGEgX2tlcm5lbF8gcG9pbnRlciwgICovCisvKiBiZWNhdXNlIHRoZSBnZW5lcmljIGNkcm9tIGRyaXZlciBkb2VzIHRoZSB1c2VyIGFjY2VzcyBzdHVmZiBmb3IgdXMuICAgICAqLworLyogb25seSBjZHJvbXJlYWR0b2NoZHIgYW5kIGNkcm9tcmVhZHRvY2VudHJ5IGFyZSBsZWZ0IC0gZm9yIHVzZSB3aXRoIHRoZSAgKi8KKy8qIHNyX2Rpc2tfc3RhdHVzIGludGVyZmFjZSBmb3IgdGhlIGdlbmVyaWMgY2Ryb20gZHJpdmVyLiAgICAgICAgICAgICAgICAgICovCisKK2ludCBzcl9hdWRpb19pb2N0bChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCVNjc2lfQ0QgKmNkID0gY2RpLT5oYW5kbGU7CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IGttYWxsb2MoMzIsIEdGUF9LRVJORUwgfCBTUl9HRlBfRE1BKGNkKSk7CisKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDRFJPTVJFQURUT0NIRFI6CisJCXsKKwkJCXN0cnVjdCBjZHJvbV90b2NoZHIgKnRvY2hkciA9IChzdHJ1Y3QgY2Ryb21fdG9jaGRyICopIGFyZzsKKworCQkJY2djLmNtZFswXSA9IEdQQ01EX1JFQURfVE9DX1BNQV9BVElQOworCQkJY2djLmNtZFs4XSA9IDEyOwkJLyogTFNCIG9mIGxlbmd0aCAqLworCQkJY2djLmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJCWNnYy5idWZsZW4gPSAxMjsKKwkJCWNnYy5xdWlldCA9IDE7CisJCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwkJCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKworCQkJdG9jaGRyLT5jZHRoX3RyazAgPSBidWZmZXJbMl07CisJCQl0b2NoZHItPmNkdGhfdHJrMSA9IGJ1ZmZlclszXTsKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgQ0RST01SRUFEVE9DRU5UUlk6CisJCXsKKwkJCXN0cnVjdCBjZHJvbV90b2NlbnRyeSAqdG9jZW50cnkgPSAoc3RydWN0IGNkcm9tX3RvY2VudHJ5ICopIGFyZzsKKworCQkJY2djLmNtZFswXSA9IEdQQ01EX1JFQURfVE9DX1BNQV9BVElQOworCQkJY2djLmNtZFsxXSB8PSAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgPyAweDAyIDogMDsKKwkJCWNnYy5jbWRbNl0gPSB0b2NlbnRyeS0+Y2R0ZV90cmFjazsKKwkJCWNnYy5jbWRbOF0gPSAxMjsJCS8qIExTQiBvZiBsZW5ndGggKi8KKwkJCWNnYy5idWZmZXIgPSBidWZmZXI7CisJCQljZ2MuYnVmbGVuID0gMTI7CisJCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisKKwkJCXJlc3VsdCA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKworCQkJdG9jZW50cnktPmNkdGVfY3RybCA9IGJ1ZmZlcls1XSAmIDB4ZjsKKwkJCXRvY2VudHJ5LT5jZHRlX2FkciA9IGJ1ZmZlcls1XSA+PiA0OworCQkJdG9jZW50cnktPmNkdGVfZGF0YW1vZGUgPSAodG9jZW50cnktPmNkdGVfY3RybCAmIDB4MDQpID8gMSA6IDA7CisJCQlpZiAodG9jZW50cnktPmNkdGVfZm9ybWF0ID09IENEUk9NX01TRikgeworCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLm1pbnV0ZSA9IGJ1ZmZlcls5XTsKKwkJCQl0b2NlbnRyeS0+Y2R0ZV9hZGRyLm1zZi5zZWNvbmQgPSBidWZmZXJbMTBdOworCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubXNmLmZyYW1lID0gYnVmZmVyWzExXTsKKwkJCX0gZWxzZQorCQkJCXRvY2VudHJ5LT5jZHRlX2FkZHIubGJhID0gKCgoKChidWZmZXJbOF0gPDwgOCkgKyBidWZmZXJbOV0pIDw8IDgpCisJCQkJCSsgYnVmZmVyWzEwXSkgPDwgOCkgKyBidWZmZXJbMTFdOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBDRFJPTVBMQVlUUktJTkQ6IHsKKwkJc3RydWN0IGNkcm9tX3RpKiB0aSA9IChzdHJ1Y3QgY2Ryb21fdGkqKWFyZzsKKworCQljZ2MuY21kWzBdID0gR1BDTURfUExBWUFVRElPX1RJOworCQljZ2MuY21kWzRdID0gdGktPmNkdGlfdHJrMDsKKwkJY2djLmNtZFs1XSA9IHRpLT5jZHRpX2luZDA7CisJCWNnYy5jbWRbN10gPSB0aS0+Y2R0aV90cmsxOworCQljZ2MuY21kWzhdID0gdGktPmNkdGlfaW5kMTsKKwkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX05PTkU7CisKKwkJcmVzdWx0ID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCQlpZiAocmVzdWx0ID09IC1FRFJJVkVfQ0FOVF9ET19USElTKQorCQkJcmVzdWx0ID0gc3JfZmFrZV9wbGF5dHJraW5kKGNkaSwgdGkpOworCisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJfQorCisjaWYgMAorCWlmIChyZXN1bHQpCisJCXByaW50aygiREVCVUc6IHNyX2F1ZGlvOiByZXN1bHQgZm9yIGlvY3RsICV4OiAleFxuIiwgY21kLCByZXN1bHQpOworI2VuZGlmCisKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHNvcnRzIG9mIGZ1bm55IGNkcm9tIHNlY3RvcnMgdXNpbmcgdGhlIFJFQURfQ0QKKyAqIHNjc2ktMyBtbWMgY29tbWFuZAorICoKKyAqIGxiYTogICAgIGxpbmVhciBibG9jayBhZGRyZXNzCisgKiBmb3JtYXQ6ICAwID0gZGF0YSAoYW55dGhpbmcpCisgKiAgICAgICAgICAxID0gYXVkaW8KKyAqICAgICAgICAgIDIgPSBkYXRhIChtb2RlIDEpCisgKiAgICAgICAgICAzID0gZGF0YSAobW9kZSAyKQorICogICAgICAgICAgNCA9IGRhdGEgKG1vZGUgMiBmb3JtMSkKKyAqICAgICAgICAgIDUgPSBkYXRhIChtb2RlIDIgZm9ybTIpCisgKiBibGtzaXplOiAyMDQ4IHwgMjMzNiB8IDIzNDAgfCAyMzUyCisgKi8KKworc3RhdGljIGludCBzcl9yZWFkX2NkKFNjc2lfQ0QgKmNkLCB1bnNpZ25lZCBjaGFyICpkZXN0LCBpbnQgbGJhLCBpbnQgZm9ybWF0LCBpbnQgYmxrc2l6ZSkKK3sKKwlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIiVzOiBzcl9yZWFkX2NkIGxiYT0lZCBmb3JtYXQ9JWQgYmxrc2l6ZT0lZFxuIiwKKwkgICAgICAgY2QtPmNkaS5uYW1lLCBsYmEsIGZvcm1hdCwgYmxrc2l6ZSk7CisjZW5kaWYKKworCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CisJY2djLmNtZFswXSA9IEdQQ01EX1JFQURfQ0Q7CS8qIFJFQURfQ0QgKi8KKwljZ2MuY21kWzFdID0gKChmb3JtYXQgJiA3KSA8PCAyKTsKKwljZ2MuY21kWzJdID0gKHVuc2lnbmVkIGNoYXIpIChsYmEgPj4gMjQpICYgMHhmZjsKKwljZ2MuY21kWzNdID0gKHVuc2lnbmVkIGNoYXIpIChsYmEgPj4gMTYpICYgMHhmZjsKKwljZ2MuY21kWzRdID0gKHVuc2lnbmVkIGNoYXIpIChsYmEgPj4gOCkgJiAweGZmOworCWNnYy5jbWRbNV0gPSAodW5zaWduZWQgY2hhcikgbGJhICYgMHhmZjsKKwljZ2MuY21kWzhdID0gMTsKKwlzd2l0Y2ggKGJsa3NpemUpIHsKKwljYXNlIDIzMzY6CisJCWNnYy5jbWRbOV0gPSAweDU4OworCQlicmVhazsKKwljYXNlIDIzNDA6CisJCWNnYy5jbWRbOV0gPSAweDc4OworCQlicmVhazsKKwljYXNlIDIzNTI6CisJCWNnYy5jbWRbOV0gPSAweGY4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljZ2MuY21kWzldID0gMHgxMDsKKwkJYnJlYWs7CisJfQorCWNnYy5idWZmZXIgPSBkZXN0OworCWNnYy5idWZsZW4gPSBibGtzaXplOworCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwljZ2MudGltZW91dCA9IElPQ1RMX1RJTUVPVVQ7CisJcmV0dXJuIHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKK30KKworLyoKKyAqIHJlYWQgc2VjdG9ycyB3aXRoIGJsb2Nrc2l6ZXMgb3RoZXIgdGhhbiAyMDQ4CisgKi8KKworc3RhdGljIGludCBzcl9yZWFkX3NlY3RvcihTY3NpX0NEICpjZCwgaW50IGxiYSwgaW50IGJsa3NpemUsIHVuc2lnbmVkIGNoYXIgKmRlc3QpCit7CisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlpbnQgcmM7CisKKwkvKiB3ZSB0cnkgdGhlIFJFQUQgQ0QgY29tbWFuZCBmaXJzdC4uLiAqLworCWlmIChjZC0+cmVhZGNkX2tub3duKSB7CisJCXJjID0gc3JfcmVhZF9jZChjZCwgZGVzdCwgbGJhLCAwLCBibGtzaXplKTsKKwkJaWYgKC1FRFJJVkVfQ0FOVF9ET19USElTICE9IHJjKQorCQkJcmV0dXJuIHJjOworCQljZC0+cmVhZGNkX2tub3duID0gMDsKKwkJcHJpbnRrKCJDRFJPTSBkb2VzJ250IHN1cHBvcnQgUkVBRCBDRCAoMHhiZSkgY29tbWFuZFxuIik7CisJCS8qIGZhbGwgJiByZXRyeSB0aGUgb3RoZXIgd2F5ICovCisJfQorCS8qIC4uLiBpZiB0aGlzIGZhaWxzLCB3ZSBzd2l0Y2ggdGhlIGJsb2Nrc2l6ZSB1c2luZyBNT0RFIFNFTEVDVCAqLworCWlmIChibGtzaXplICE9IGNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplKSB7CisJCWlmICgwICE9IChyYyA9IHNyX3NldF9ibG9ja2xlbmd0aChjZCwgYmxrc2l6ZSkpKQorCQkJcmV0dXJuIHJjOworCX0KKyNpZmRlZiBERUJVRworCXByaW50aygiJXM6IHNyX3JlYWRfc2VjdG9yIGxiYT0lZCBibGtzaXplPSVkXG4iLCBjZC0+Y2RpLm5hbWUsIGxiYSwgYmxrc2l6ZSk7CisjZW5kaWYKKworCW1lbXNldCgmY2djLCAwLCBzaXplb2Yoc3RydWN0IHBhY2tldF9jb21tYW5kKSk7CisJY2djLmNtZFswXSA9IEdQQ01EX1JFQURfMTA7CisJY2djLmNtZFsyXSA9ICh1bnNpZ25lZCBjaGFyKSAobGJhID4+IDI0KSAmIDB4ZmY7CisJY2djLmNtZFszXSA9ICh1bnNpZ25lZCBjaGFyKSAobGJhID4+IDE2KSAmIDB4ZmY7CisJY2djLmNtZFs0XSA9ICh1bnNpZ25lZCBjaGFyKSAobGJhID4+IDgpICYgMHhmZjsKKwljZ2MuY21kWzVdID0gKHVuc2lnbmVkIGNoYXIpIGxiYSAmIDB4ZmY7CisJY2djLmNtZFs4XSA9IDE7CisJY2djLmJ1ZmZlciA9IGRlc3Q7CisJY2djLmJ1ZmxlbiA9IGJsa3NpemU7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCWNnYy50aW1lb3V0ID0gSU9DVExfVElNRU9VVDsKKwlyYyA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIHJlYWQgYSBzZWN0b3IgaW4gcmF3IG1vZGUgdG8gY2hlY2sgdGhlIHNlY3RvciBmb3JtYXQKKyAqIHJldDogMSA9PSBtb2RlMiAoWEEpLCAwID09IG1vZGUxLCA8MCA9PSBlcnJvciAKKyAqLworCitpbnQgc3JfaXNfeGEoU2NzaV9DRCAqY2QpCit7CisJdW5zaWduZWQgY2hhciAqcmF3X3NlY3RvcjsKKwlpbnQgaXNfeGE7CisKKwlpZiAoIXhhX3Rlc3QpCisJCXJldHVybiAwOworCisJcmF3X3NlY3RvciA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoMjA0OCwgR0ZQX0tFUk5FTCB8IFNSX0dGUF9ETUEoY2QpKTsKKwlpZiAoIXJhd19zZWN0b3IpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgwID09IHNyX3JlYWRfc2VjdG9yKGNkLCBjZC0+bXNfb2Zmc2V0ICsgMTYsCisJCQkJQ0RfRlJBTUVTSVpFX1JBVzEsIHJhd19zZWN0b3IpKSB7CisJCWlzX3hhID0gKHJhd19zZWN0b3JbM10gPT0gMHgwMikgPyAxIDogMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIGEgcmF3IHNlY3RvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiAqLworCQlpc194YSA9IC0xOworCX0KKwlrZnJlZShyYXdfc2VjdG9yKTsKKyNpZmRlZiBERUJVRworCXByaW50aygiJXM6IHNyX2lzX3hhOiAlZFxuIiwgY2QtPmNkaS5uYW1lLCBpc194YSk7CisjZW5kaWYKKwlyZXR1cm4gaXNfeGE7Cit9CisKK2ludCBzcl9kZXZfaW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCisJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCWludCByZXQ7CisJCisJcmV0ID0gc2NzaV9ub25ibG9ja2FibGVfaW9jdGwoY2QtPmRldmljZSwgY21kLAorCQkJCSAgICAgICh2b2lkIF9fdXNlciAqKWFyZywgTlVMTCk7CisJLyoKKwkgKiBFTk9ERVYgbWVhbnMgdGhhdCB3ZSBkaWRuJ3QgcmVjb2duaXNlIHRoZSBpb2N0bCwgb3IgdGhhdCB3ZQorCSAqIGNhbm5vdCBleGVjdXRlIGl0IGluIHRoZSBjdXJyZW50IGRldmljZSBzdGF0ZS4gIEluIGVpdGhlcgorCSAqIGNhc2UgZmFsbCB0aHJvdWdoIHRvIHNjc2lfaW9jdGwsIHdoaWNoIHdpbGwgcmV0dXJuIEVORE9FViBhZ2FpbgorCSAqIGlmIGl0IGRvZXNuJ3QgcmVjb2duaXNlIHRoZSBpb2N0bAorCSAqLworCWlmIChyZXQgIT0gLUVOT0RFVikKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc2NzaV9pb2N0bChjZC0+ZGV2aWNlLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3JfdmVuZG9yLmMgYi9kcml2ZXJzL3Njc2kvc3JfdmVuZG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyNzRkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zcl92ZW5kb3IuYwpAQCAtMCwwICsxLDMyOSBAQAorLyogLSotbGludXgtYy0qLQorCisgKiB2ZW5kb3Itc3BlY2lmaWMgY29kZSBmb3IgU0NTSSBDRC1ST00ncyBnb2VzIGhlcmUuCisgKgorICogVGhpcyBpcyBuZWVkZWQgYmVjYXVjZSBtb3N0IG9mIHRoZSBuZXcgZmVhdHVyZXMgKG11bHRpc2Vzc2lvbiBhbmQKKyAqIHRoZSBsaWtlKSBhcmUgdG9vIG5ldyB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBTQ1NJLUlJIHN0YW5kYXJkICh0bworICogYmUgZXhhY3Q6IHRoZXJlIGlzJ250IGFueXRoaW5nIGluIG15IGRyYWZ0IGNvcHkpLgorICoKKyAqIEF1ZyAxOTk3OiBIYSEgR290IGEgU0NTSS0zIGNkcm9tIHNwZWMgYWNyb3NzIG15IGZpbmdlcnMuIFNDU0ktMyBkb2VzCisgKiAgICAgICAgICAgbXVsdGlzZXNzaW9uIHVzaW5nIHRoZSBSRUFEIFRPQyBjb21tYW5kIChsaWtlIFNPTlkpLgorICoKKyAqICAgICAgICAgICBSZWFycmFuZ2VkIHN0dWZmIGhlcmU6IFNDU0ktMyBpcyBpbmNsdWRlZCBhbGx3YXlzLCBzdXBwb3J0CisgKiAgICAgICAgICAgZm9yIE5FQy9UT1NISUJBL0hQIGNvbW1hbmRzIGlzIG9wdGlvbmFsLgorICoKKyAqICAgR2VyZCBLbm9yciA8a3JheGVsQGNzLnR1LWJlcmxpbi5kZT4gCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBzdXBwb3J0IGZvciBYQS9tdWx0aXNlc3Npb24tQ0QncworICogCisgKiAgIC0gTkVDOiAgICAgRGV0ZWN0aW9uIGFuZCBzdXBwb3J0IG9mIG11bHRpc2Vzc2lvbiBDRCdzLgorICogICAgIAorICogICAtIFRPU0hJQkE6IERldGVjdGlvbiBhbmQgc3VwcG9ydCBvZiBtdWx0aXNlc3Npb24gQ0Qncy4KKyAqICAgICAgICAgICAgICBTb21lIFhBLVNlY3RvciB0d2Vha2luZywgcmVxdWlyZWQgZm9yIG9sZGVyIGRyaXZlcy4KKyAqCisgKiAgIC0gU09OWTogICAgRGV0ZWN0aW9uIGFuZCBzdXBwb3J0IG9mIG11bHRpc2Vzc2lvbiBDRCdzLgorICogICAgICAgICAgICAgIGFkZGVkIGJ5IFRob21hcyBRdWlub3QgPHRob21hc0BjdWl2cmUuZnJlZW5peC5mcj4KKyAqCisgKiAgIC0gUElPTkVFUiwgSElUQUNISSwgUExFWFRPUiwgTUFUU0hJVEEsIFRFQUMsIFBISUxJUFM6IGtub3duIHRvCisgKiAgICAgICAgICAgICAgd29yayB3aXRoIFNPTlkgKFNDU0kzIG5vdykgIGNvZGUuCisgKgorICogICAtIEhQOiAgICAgIE11Y2ggbGlrZSBTT05ZLCBidXQgYSBsaXR0bGUgZGlmZmVyZW50Li4uIChUaG9tYXMpCisgKiAgICAgICAgICAgICAgSFAtV3JpdGVycyBvbmx5ID8/PyBNYXliZSBvdGhlciBDRC1Xcml0ZXJzIHdvcmsgd2l0aCB0aGlzIHRvbyA/CisgKiAgICAgICAgICAgICAgSFAgNjAyMCB3cml0ZXJzIG5vdyBzdXBwb3J0ZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisKKyNpbmNsdWRlICJzci5oIgorCisjaWYgMAorI2RlZmluZSBERUJVRworI2VuZGlmCisKKy8qIGhlcmUgYXJlIHNvbWUgY29uc3RhbnRzIHRvIHNvcnQgdGhlIHZlbmRvcnMgaW50byBncm91cHMgKi8KKworI2RlZmluZSBWRU5ET1JfU0NTSTMgICAgICAgICAgIDEJLyogZGVmYXVsdDogc2NzaS0zIG1tYyAqLworCisjZGVmaW5lIFZFTkRPUl9ORUMgICAgICAgICAgICAgMgorI2RlZmluZSBWRU5ET1JfVE9TSElCQSAgICAgICAgIDMKKyNkZWZpbmUgVkVORE9SX1dSSVRFUiAgICAgICAgICA0CS8qIHByZS1zY3NpMyB3cml0ZXJzICovCisKKyNkZWZpbmUgVkVORE9SX1RJTUVPVVQJMzAqSFoKKwordm9pZCBzcl92ZW5kb3JfaW5pdChTY3NpX0NEICpjZCkKK3sKKyNpZm5kZWYgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SCisJY2QtPnZlbmRvciA9IFZFTkRPUl9TQ1NJMzsKKyNlbHNlCisJY2hhciAqdmVuZG9yID0gY2QtPmRldmljZS0+dmVuZG9yOworCWNoYXIgKm1vZGVsID0gY2QtPmRldmljZS0+bW9kZWw7CisJCisJLyogZGVmYXVsdCAqLworCWNkLT52ZW5kb3IgPSBWRU5ET1JfU0NTSTM7CisJaWYgKGNkLT5yZWFkY2Rfa25vd24pCisJCS8qIHRoaXMgaXMgdHJ1ZSBmb3Igc2NzaTMvbW1jIGRyaXZlcyAtIG5vIG1vcmUgY2hlY2tzICovCisJCXJldHVybjsKKworCWlmIChjZC0+ZGV2aWNlLT50eXBlID09IFRZUEVfV09STSkgeworCQljZC0+dmVuZG9yID0gVkVORE9SX1dSSVRFUjsKKworCX0gZWxzZSBpZiAoIXN0cm5jbXAodmVuZG9yLCAiTkVDIiwgMykpIHsKKwkJY2QtPnZlbmRvciA9IFZFTkRPUl9ORUM7CisJCWlmICghc3RybmNtcChtb2RlbCwgIkNELVJPTSBEUklWRToyNSIsIDE1KSB8fAorCQkgICAgIXN0cm5jbXAobW9kZWwsICJDRC1ST00gRFJJVkU6MzYiLCAxNSkgfHwKKwkJICAgICFzdHJuY21wKG1vZGVsLCAiQ0QtUk9NIERSSVZFOjgzIiwgMTUpIHx8CisJCSAgICAhc3RybmNtcChtb2RlbCwgIkNELVJPTSBEUklWRTo4NCAiLCAxNikKKyNpZiAwCisJCS8qIG15IE5FQyAzeCByZXR1cm5zIHRoZSByZWFkLXJhdyBkYXRhIGlmIGEgcmVhZC1yYXcKKwkJICAgaXMgZm9sbG93ZWQgYnkgYSByZWFkIGZvciB0aGUgc2FtZSBzZWN0b3IgLSBhZWIgKi8KKwkJICAgIHx8ICFzdHJuY21wKG1vZGVsLCAiQ0QtUk9NIERSSVZFOjUwMCIsIDE2KQorI2VuZGlmCisJCSAgICApCisJCQkvKiB0aGVzZSBjYW4ndCBoYW5kbGUgbXVsdGlzZXNzaW9uLCBtYXkgaGFuZyAqLworCQkJY2QtPmNkaS5tYXNrIHw9IENEQ19NVUxUSV9TRVNTSU9OOworCisJfSBlbHNlIGlmICghc3RybmNtcCh2ZW5kb3IsICJUT1NISUJBIiwgNykpIHsKKwkJY2QtPnZlbmRvciA9IFZFTkRPUl9UT1NISUJBOworCisJfQorI2VuZGlmCit9CisKKworLyogc21hbGwgaGFuZHkgZnVuY3Rpb24gZm9yIHN3aXRjaGluZyBibG9jayBsZW5ndGggdXNpbmcgTU9ERSBTRUxFQ1QsCisgKiB1c2VkIGJ5IHNyX3JlYWRfc2VjdG9yKCkgKi8KKworaW50IHNyX3NldF9ibG9ja2xlbmd0aChTY3NpX0NEICpjZCwgaW50IGJsb2NrbGVuZ3RoKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsJLyogdGhlIGJ1ZmZlciBmb3IgdGhlIGlvY3RsICovCisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlzdHJ1Y3QgY2NzX21vZGVzZWxfaGVhZCAqbW9kZXNlbDsKKwlpbnQgcmMsIGRlbnNpdHkgPSAwOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SCisJaWYgKGNkLT52ZW5kb3IgPT0gVkVORE9SX1RPU0hJQkEpCisJCWRlbnNpdHkgPSAoYmxvY2tsZW5ndGggPiAyMDQ4KSA/IDB4ODEgOiAweDgzOworI2VuZGlmCisKKwlidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCIlczogTU9ERSBTRUxFQ1QgMHgleC8lZFxuIiwgY2QtPmNkaS5uYW1lLCBkZW5zaXR5LCBibG9ja2xlbmd0aCk7CisjZW5kaWYKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCWNnYy5jbWRbMF0gPSBNT0RFX1NFTEVDVDsKKwljZ2MuY21kWzFdID0gKDEgPDwgNCk7CisJY2djLmNtZFs0XSA9IDEyOworCW1vZGVzZWwgPSAoc3RydWN0IGNjc19tb2Rlc2VsX2hlYWQgKikgYnVmZmVyOworCW1lbXNldChtb2Rlc2VsLCAwLCBzaXplb2YoKm1vZGVzZWwpKTsKKwltb2Rlc2VsLT5ibG9ja19kZXNjX2xlbmd0aCA9IDB4MDg7CisJbW9kZXNlbC0+ZGVuc2l0eSA9IGRlbnNpdHk7CisJbW9kZXNlbC0+YmxvY2tfbGVuZ3RoX21lZCA9IChibG9ja2xlbmd0aCA+PiA4KSAmIDB4ZmY7CisJbW9kZXNlbC0+YmxvY2tfbGVuZ3RoX2xvID0gYmxvY2tsZW5ndGggJiAweGZmOworCWNnYy5idWZmZXIgPSBidWZmZXI7CisJY2djLmJ1ZmxlbiA9IHNpemVvZigqbW9kZXNlbCk7CisJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwljZ2MudGltZW91dCA9IFZFTkRPUl9USU1FT1VUOworCWlmICgwID09IChyYyA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKSkpIHsKKwkJY2QtPmRldmljZS0+c2VjdG9yX3NpemUgPSBibG9ja2xlbmd0aDsKKwl9CisjaWZkZWYgREVCVUcKKwllbHNlCisJCXByaW50aygiJXM6IHN3aXRjaGluZyBibG9ja2xlbmd0aCB0byAlZCBieXRlcyBmYWlsZWRcbiIsCisJCSAgICAgICBjZC0+Y2RpLm5hbWUsIGJsb2NrbGVuZ3RoKTsKKyNlbmRpZgorCWtmcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJjOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGFmdGVyIGEgbWVkaWEgY2hhbmdlLiBDaGVja3MgaWYgdGhlIENEIGlzCisgICBtdWx0aXNlc3Npb24sIGFza3MgZm9yIG9mZnNldCBldGMuICovCisKK2ludCBzcl9jZF9jaGVjayhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSkKK3sKKwlTY3NpX0NEICpjZCA9IGNkaS0+aGFuZGxlOworCXVuc2lnbmVkIGxvbmcgc2VjdG9yOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsJLyogdGhlIGJ1ZmZlciBmb3IgdGhlIGlvY3RsICovCisJc3RydWN0IHBhY2tldF9jb21tYW5kIGNnYzsKKwlpbnQgcmMsIG5vX211bHRpOworCisJaWYgKGNkLT5jZGkubWFzayAmIENEQ19NVUxUSV9TRVNTSU9OKQorCQlyZXR1cm4gMDsKKworCWJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJc2VjdG9yID0gMDsJCS8qIHRoZSBtdWx0aXNlc3Npb24gc2VjdG9yIG9mZnNldCBnb2VzIGhlcmUgICovCisJbm9fbXVsdGkgPSAwOwkJLyogZmxhZzogdGhlIGRyaXZlIGNhbid0IGhhbmRsZSBtdWx0aXNlc3Npb24gKi8KKwlyYyA9IDA7CisKKwltZW1zZXQoJmNnYywgMCwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfY29tbWFuZCkpOworCisJc3dpdGNoIChjZC0+dmVuZG9yKSB7CisKKwljYXNlIFZFTkRPUl9TQ1NJMzoKKwkJY2djLmNtZFswXSA9IFJFQURfVE9DOworCQljZ2MuY21kWzhdID0gMTI7CisJCWNnYy5jbWRbOV0gPSAweDQwOworCQljZ2MuYnVmZmVyID0gYnVmZmVyOworCQljZ2MuYnVmbGVuID0gMTI7CisJCWNnYy5xdWlldCA9IDE7CisJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJY2djLnRpbWVvdXQgPSBWRU5ET1JfVElNRU9VVDsKKwkJcmMgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisJCWlmIChyYyAhPSAwKQorCQkJYnJlYWs7CisJCWlmICgoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdIDwgMHgwYSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhtbSwgc2VlbXMgdGhlIGRyaXZlICIKKwkJCSAgICJkb2Vzbid0IHN1cHBvcnQgbXVsdGlzZXNzaW9uIENEJ3NcbiIsIGNkLT5jZGkubmFtZSk7CisJCQlub19tdWx0aSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlzZWN0b3IgPSBidWZmZXJbMTFdICsgKGJ1ZmZlclsxMF0gPDwgOCkgKworCQkgICAgKGJ1ZmZlcls5XSA8PCAxNikgKyAoYnVmZmVyWzhdIDw8IDI0KTsKKwkJaWYgKGJ1ZmZlcls2XSA8PSAxKSB7CisJCQkvKiBpZ25vcmUgc2VjdG9yIG9mZnNldHMgZnJvbSBmaXJzdCB0cmFjayAqLworCQkJc2VjdG9yID0gMDsKKwkJfQorCQlicmVhazsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUgorCWNhc2UgVkVORE9SX05FQzp7CisJCQl1bnNpZ25lZCBsb25nIG1pbiwgc2VjLCBmcmFtZTsKKwkJCWNnYy5jbWRbMF0gPSAweGRlOworCQkJY2djLmNtZFsxXSA9IDB4MDM7CisJCQljZ2MuY21kWzJdID0gMHhiMDsKKwkJCWNnYy5idWZmZXIgPSBidWZmZXI7CisJCQljZ2MuYnVmbGVuID0gMHgxNjsKKwkJCWNnYy5xdWlldCA9IDE7CisJCQljZ2MuZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJCQljZ2MudGltZW91dCA9IFZFTkRPUl9USU1FT1VUOworCQkJcmMgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisJCQlpZiAocmMgIT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChidWZmZXJbMTRdICE9IDAgJiYgYnVmZmVyWzE0XSAhPSAweGIwKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhtbSwgc2VlbXMgdGhlIGNkcm9tICIKKwkJCQkgICAgICAgImRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXNlc3Npb24gQ0Qnc1xuIiwKKwkJCQkgICAgICAgY2QtPmNkaS5uYW1lKTsKKwkJCQlub19tdWx0aSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQltaW4gPSBCQ0QyQklOKGJ1ZmZlclsxNV0pOworCQkJc2VjID0gQkNEMkJJTihidWZmZXJbMTZdKTsKKwkJCWZyYW1lID0gQkNEMkJJTihidWZmZXJbMTddKTsKKwkJCXNlY3RvciA9IG1pbiAqIENEX1NFQ1MgKiBDRF9GUkFNRVMgKyBzZWMgKiBDRF9GUkFNRVMgKyBmcmFtZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIFZFTkRPUl9UT1NISUJBOnsKKwkJCXVuc2lnbmVkIGxvbmcgbWluLCBzZWMsIGZyYW1lOworCisJCQkvKiB3ZSByZXF1ZXN0IHNvbWUgZGlzYyBpbmZvcm1hdGlvbiAoaXMgaXQgYSBYQS1DRCA/LAorCQkJICogd2hlcmUgc3RhcnRzIHRoZSBsYXN0IHNlc3Npb24gPykgKi8KKwkJCWNnYy5jbWRbMF0gPSAweGM3OworCQkJY2djLmNtZFsxXSA9IDB4MDM7CisJCQljZ2MuYnVmZmVyID0gYnVmZmVyOworCQkJY2djLmJ1ZmxlbiA9IDQ7CisJCQljZ2MucXVpZXQgPSAxOworCQkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQkJY2djLnRpbWVvdXQgPSBWRU5ET1JfVElNRU9VVDsKKwkJCXJjID0gc3JfZG9faW9jdGwoY2QsICZjZ2MpOworCQkJaWYgKHJjID09IC1FSU5WQUwpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSG1tLCBzZWVtcyB0aGUgZHJpdmUgIgorCQkJCSAgICAgICAiZG9lc24ndCBzdXBwb3J0IG11bHRpc2Vzc2lvbiBDRCdzXG4iLAorCQkJCSAgICAgICBjZC0+Y2RpLm5hbWUpOworCQkJCW5vX211bHRpID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChyYyAhPSAwKQorCQkJCWJyZWFrOworCQkJbWluID0gQkNEMkJJTihidWZmZXJbMV0pOworCQkJc2VjID0gQkNEMkJJTihidWZmZXJbMl0pOworCQkJZnJhbWUgPSBCQ0QyQklOKGJ1ZmZlclszXSk7CisJCQlzZWN0b3IgPSBtaW4gKiBDRF9TRUNTICogQ0RfRlJBTUVTICsgc2VjICogQ0RfRlJBTUVTICsgZnJhbWU7CisJCQlpZiAoc2VjdG9yKQorCQkJCXNlY3RvciAtPSBDRF9NU0ZfT0ZGU0VUOworCQkJc3Jfc2V0X2Jsb2NrbGVuZ3RoKGNkLCAyMDQ4KTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIFZFTkRPUl9XUklURVI6CisJCWNnYy5jbWRbMF0gPSBSRUFEX1RPQzsKKwkJY2djLmNtZFs4XSA9IDB4MDQ7CisJCWNnYy5jbWRbOV0gPSAweDQwOworCQljZ2MuYnVmZmVyID0gYnVmZmVyOworCQljZ2MuYnVmbGVuID0gMHgwNDsKKwkJY2djLnF1aWV0ID0gMTsKKwkJY2djLmRhdGFfZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQljZ2MudGltZW91dCA9IFZFTkRPUl9USU1FT1VUOworCQlyYyA9IHNyX2RvX2lvY3RsKGNkLCAmY2djKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICgocmMgPSBidWZmZXJbMl0pID09IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IE5vIGZpbmlzaGVkIHNlc3Npb25cbiIsIGNkLT5jZGkubmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljZ2MuY21kWzBdID0gUkVBRF9UT0M7CS8qIFJlYWQgVE9DICovCisJCWNnYy5jbWRbNl0gPSByYyAmIDB4N2Y7CS8qIG51bWJlciBvZiBsYXN0IHNlc3Npb24gKi8KKwkJY2djLmNtZFs4XSA9IDB4MGM7CisJCWNnYy5jbWRbOV0gPSAweDQwOworCQljZ2MuYnVmZmVyID0gYnVmZmVyOworCQljZ2MuYnVmbGVuID0gMTI7CisJCWNnYy5xdWlldCA9IDE7CisJCWNnYy5kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJY2djLnRpbWVvdXQgPSBWRU5ET1JfVElNRU9VVDsKKwkJcmMgPSBzcl9kb19pb2N0bChjZCwgJmNnYyk7CisJCWlmIChyYyAhPSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlzZWN0b3IgPSBidWZmZXJbMTFdICsgKGJ1ZmZlclsxMF0gPDwgOCkgKworCQkgICAgKGJ1ZmZlcls5XSA8PCAxNikgKyAoYnVmZmVyWzhdIDw8IDI0KTsKKwkJYnJlYWs7CisjZW5kaWYJCQkJLyogQ09ORklHX0JMS19ERVZfU1JfVkVORE9SICovCisKKwlkZWZhdWx0OgorCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICIlczogdW5rbm93biB2ZW5kb3IgY29kZSAoJWkpLCBub3QgaW5pdGlhbGl6ZWQgP1xuIiwKKwkJICAgICAgIGNkLT5jZGkubmFtZSwgY2QtPnZlbmRvcik7CisJCXNlY3RvciA9IDA7CisJCW5vX211bHRpID0gMTsKKwkJYnJlYWs7CisJfQorCWNkLT5tc19vZmZzZXQgPSBzZWN0b3I7CisJY2QtPnhhX2ZsYWcgPSAwOworCWlmIChDRFNfQVVESU8gIT0gc3JfZGlza19zdGF0dXMoY2RpKSAmJiAxID09IHNyX2lzX3hhKGNkKSkKKwkJY2QtPnhhX2ZsYWcgPSAxOworCisJaWYgKDIwNDggIT0gY2QtPmRldmljZS0+c2VjdG9yX3NpemUpIHsKKwkJc3Jfc2V0X2Jsb2NrbGVuZ3RoKGNkLCAyMDQ4KTsKKwl9CisJaWYgKG5vX211bHRpKQorCQljZGktPm1hc2sgfD0gQ0RDX01VTFRJX1NFU1NJT047CisKKyNpZmRlZiBERUJVRworCWlmIChzZWN0b3IpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbXVsdGlzZXNzaW9uIG9mZnNldD0lbHVcbiIsCisJCSAgICAgICBjZC0+Y2RpLm5hbWUsIHNlY3Rvcik7CisjZW5kaWYKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1ZDFlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0wLDAgKzEsNDQzOCBAQAorLyoKKyAgIFNDU0kgVGFwZSBEcml2ZXIgZm9yIExpbnV4IHZlcnNpb24gMS4xIGFuZCBuZXdlci4gU2VlIHRoZSBhY2NvbXBhbnlpbmcKKyAgIGZpbGUgRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgSGlzdG9yeToKKyAgIFJld3JpdHRlbiBmcm9tIER3YXluZSBGb3JzeXRoJ3MgU0NTSSB0YXBlIGRyaXZlciBieSBLYWkgTWFraXNhcmEuCisgICBDb250cmlidXRpb24gYW5kIGlkZWFzIGZyb20gc2V2ZXJhbCBwZW9wbGUgaW5jbHVkaW5nIChpbiBhbHBoYWJldGljYWwKKyAgIG9yZGVyKSBLbGF1cyBFaHJlbmZyaWVkLCBFdWdlbmUgRXhhcmV2c2t5LCBFcmljIExlZSBHcmVlbiwgV29sZmdhbmcgRGVuaywKKyAgIFN0ZXZlIEhpcnNjaCwgQW5kcmVhcyBLb3BwZW5oIm9mZXIsIE1pY2hhZWwgTGVvZG9sdGVyLCBFeWFsIExlYmVkaW5za3ksCisgICBNaWNoYWVsIFNjaGFlZmVyLCBKIm9yZyBXZXVsZSwgYW5kIEVyaWMgWW91bmdkYWxlLgorCisgICBDb3B5cmlnaHQgMTk5MiAtIDIwMDUgS2FpIE1ha2lzYXJhCisgICBlbWFpbCBLYWkuTWFraXNhcmFAa29sdW1idXMuZmkKKworICAgU29tZSBzbWFsbCBmb3JtYWwgY2hhbmdlcyAtIGFlYiwgOTUwODA5CisKKyAgIExhc3QgbW9kaWZpZWQ6IDE4LUpBTi0xOTk4IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiBEZXZmcyBzdXBwb3J0CisgKi8KKworc3RhdGljIGNoYXIgKnZlcnN0ciA9ICIyMDA1MDMxMiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfcmVxdWVzdC5oPgorCisKKy8qIFRoZSBkcml2ZXIgcHJpbnRzIHNvbWUgZGVidWdnaW5nIGluZm9ybWF0aW9uIG9uIHRoZSBjb25zb2xlIGlmIERFQlVHCisgICBpcyBkZWZpbmVkIGFuZCBub24temVyby4gKi8KKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKy8qIFRoZSBtZXNzYWdlIGxldmVsIGZvciB0aGUgZGVidWcgbWVzc2FnZXMgaXMgY3VycmVudGx5IHNldCB0byBLRVJOX05PVElDRQorICAgc28gdGhhdCBwZW9wbGUgY2FuIGVhc2lseSBzZWUgdGhlIG1lc3NhZ2VzLiBMYXRlciB3aGVuIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgIGluIHRoZSBkcml2ZXJzIGFyZSBtb3JlIHdpZGVseSBjbGFzc2lmaWVkLCB0aGlzIG1heSBiZSBjaGFuZ2VkIHRvIEtFUk5fREVCVUcuICovCisjZGVmaW5lIFNUX0RFQl9NU0cgIEtFUk5fTk9USUNFCisjZGVmaW5lIERFQihhKSBhCisjZGVmaW5lIERFQkMoYSkgaWYgKGRlYnVnZ2luZykgeyBhIDsgfQorI2Vsc2UKKyNkZWZpbmUgREVCKGEpCisjZGVmaW5lIERFQkMoYSkKKyNlbmRpZgorCisjZGVmaW5lIFNUX0tJTE9CWVRFIDEwMjQKKworI2luY2x1ZGUgInN0X29wdGlvbnMuaCIKKyNpbmNsdWRlICJzdC5oIgorCitzdGF0aWMgaW50IGJ1ZmZlcl9rYnM7CitzdGF0aWMgaW50IG1heF9zZ19zZWdzOworc3RhdGljIGludCB0cnlfZGlyZWN0X2lvID0gVFJZX0RJUkVDVF9JTzsKK3N0YXRpYyBpbnQgdHJ5X3JkaW8gPSAxOworc3RhdGljIGludCB0cnlfd2RpbyA9IDE7CisKK3N0YXRpYyBpbnQgc3RfZGV2X21heDsKK3N0YXRpYyBpbnQgc3RfbnJfZGV2OworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqc3Rfc3lzZnNfY2xhc3M7CisKK01PRFVMRV9BVVRIT1IoIkthaSBNYWtpc2FyYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIFRhcGUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFNldCAncGVybScgKDR0aCBhcmd1bWVudCkgdG8gMCB0byBkaXNhYmxlIG1vZHVsZV9wYXJhbSdzIGRlZmluaXRpb24KKyAqIG9mIHN5c2ZzIHBhcmFtZXRlcnMgKHdoaWNoIG1vZHVsZV9wYXJhbSBkb2Vzbid0IHlldCBzdXBwb3J0KS4KKyAqIFN5c2ZzIHBhcmFtZXRlcnMgZGVmaW5lZCBleHBsaWNpdGx5IGxhdGVyLgorICovCittb2R1bGVfcGFyYW1fbmFtZWQoYnVmZmVyX2ticywgYnVmZmVyX2ticywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX2ticywgIkRlZmF1bHQgZHJpdmVyIGJ1ZmZlciBzaXplIGZvciBmaXhlZCBibG9jayBtb2RlIChLQjsgMzIpIik7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X3NnX3NlZ3MsIG1heF9zZ19zZWdzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2dfc2VncywgIk1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzIHRvIHVzZSAoMjU2KSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHRyeV9kaXJlY3RfaW8sIHRyeV9kaXJlY3RfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRyeV9kaXJlY3RfaW8sICJUcnkgZGlyZWN0IEkvTyBiZXR3ZWVuIHVzZXIgYnVmZmVyIGFuZCB0YXBlIGRyaXZlICgxKSIpOworCisvKiBFeHRyYSBwYXJhbWV0ZXJzIGZvciB0ZXN0aW5nICovCittb2R1bGVfcGFyYW1fbmFtZWQodHJ5X3JkaW8sIHRyeV9yZGlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0cnlfcmRpbywgIlRyeSBkaXJlY3QgcmVhZCBpL28gd2hlbiBwb3NzaWJsZSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHRyeV93ZGlvLCB0cnlfd2RpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHJ5X3dkaW8sICJUcnkgZGlyZWN0IHdyaXRlIGkvbyB3aGVuIHBvc3NpYmxlIik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IHdyaXRlX3RocmVzaG9sZF9rYnM7ICAvKiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSAqLworc3RhdGljIHN0cnVjdCBzdF9kZXZfcGFybSB7CisJY2hhciAqbmFtZTsKKwlpbnQgKnZhbDsKK30gcGFybXNbXSBfX2luaXRkYXRhID0geworCXsKKwkJImJ1ZmZlcl9rYnMiLCAmYnVmZmVyX2ticworCX0sCisJeyAgICAgICAvKiBSZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDIuNCAqLworCQkid3JpdGVfdGhyZXNob2xkX2ticyIsICZ3cml0ZV90aHJlc2hvbGRfa2JzCisJfSwKKwl7CisJCSJtYXhfc2dfc2VncyIsIE5VTEwKKwl9LAorCXsKKwkJInRyeV9kaXJlY3RfaW8iLCAmdHJ5X2RpcmVjdF9pbworCX0KK307CisjZW5kaWYKKworLyogUmVzdHJpY3QgdGhlIG51bWJlciBvZiBtb2RlcyBzbyB0aGF0IG5hbWVzIGZvciBhbGwgYXJlIGFzc2lnbmVkICovCisjaWYgU1RfTkJSX01PREVTID4gMTYKKyNlcnJvciAiTWF4aW11bSBudW1iZXIgb2YgbW9kZXMgaXMgMTYiCisjZW5kaWYKKy8qIEJpdCByZXZlcnNlZCBvcmRlciB0byBnZXQgc2FtZSBuYW1lcyBmb3Igc2FtZSBtaW5vcnMgd2l0aCBhbGwKKyAgIG1vZGUgY291bnRzICovCitzdGF0aWMgY2hhciAqc3RfZm9ybWF0c1tdID0geworCSIiLCAgInIiLCAiayIsICJzIiwgImwiLCAidCIsICJvIiwgInUiLAorCSJtIiwgInYiLCAicCIsICJ4IiwgImEiLCAieSIsICJxIiwgInoifTsgCisKKy8qIFRoZSBkZWZhdWx0IGRlZmluaXRpb25zIGhhdmUgYmVlbiBtb3ZlZCB0byBzdF9vcHRpb25zLmggKi8KKworI2RlZmluZSBTVF9GSVhFRF9CVUZGRVJfU0laRSAoU1RfRklYRURfQlVGRkVSX0JMT0NLUyAqIFNUX0tJTE9CWVRFKQorCisvKiBUaGUgYnVmZmVyIHNpemUgc2hvdWxkIGZpdCBpbnRvIHRoZSAyNCBiaXRzIGZvciBsZW5ndGggaW4gdGhlCisgICA2LWJ5dGUgU0NTSSByZWFkIGFuZCB3cml0ZSBjb21tYW5kcy4gKi8KKyNpZiBTVF9GSVhFRF9CVUZGRVJfU0laRSA+PSAoMiA8PCAyNCAtIDEpCisjZXJyb3IgIkJ1ZmZlciBzaXplIHNob3VsZCBub3QgZXhjZWVkICgyIDw8IDI0IC0gMSkgYnl0ZXMhIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgZGVidWdnaW5nID0gREVCVUc7CisKKyNkZWZpbmUgTUFYX1JFVFJJRVMgMAorI2RlZmluZSBNQVhfV1JJVEVfUkVUUklFUyAwCisjZGVmaW5lIE1BWF9SRUFEWV9SRVRSSUVTIDAKKyNkZWZpbmUgTk9fVEFQRSAgTk9UX1JFQURZCisKKyNkZWZpbmUgU1RfVElNRU9VVCAoOTAwICogSFopCisjZGVmaW5lIFNUX0xPTkdfVElNRU9VVCAoMTQwMDAgKiBIWikKKworLyogUmVtb3ZlIG1vZGUgYml0cyBhbmQgYXV0by1yZXdpbmQgYml0ICg3KSAqLworI2RlZmluZSBUQVBFX05SKHgpICggKChpbWlub3IoeCkgJiB+MjU1KSA+PiAoU1RfTkJSX01PREVfQklUUyArIDEpKSB8IFwKKyAgICAoaW1pbm9yKHgpICYgfigtMSA8PCBTVF9NT0RFX1NISUZUKSkgKQorI2RlZmluZSBUQVBFX01PREUoeCkgKChpbWlub3IoeCkgJiBTVF9NT0RFX01BU0spID4+IFNUX01PREVfU0hJRlQpCisKKy8qIENvbnN0cnVjdCB0aGUgbWlub3IgbnVtYmVyIGZyb20gdGhlIGRldmljZSAoZCksIG1vZGUgKG0pLCBhbmQgbm9uLXJld2luZCAobikgZGF0YSAqLworI2RlZmluZSBUQVBFX01JTk9SKGQsIG0sIG4pICgoKGQgJiB+KDI1NSA+PiAoU1RfTkJSX01PREVfQklUUyArIDEpKSkgPDwgKFNUX05CUl9NT0RFX0JJVFMgKyAxKSkgfCBcCisgIChkICYgKDI1NSA+PiAoU1RfTkJSX01PREVfQklUUyArIDEpKSkgfCAobSA8PCBTVF9NT0RFX1NISUZUKSB8ICgobiAhPSAwKSA8PCA3KSApCisKKy8qIEludGVybmFsIGlvY3RsIHRvIHNldCBib3RoIGRlbnNpdHkgKHVwcGVybW9zdCA4IGJpdHMpIGFuZCBibG9ja3NpemUgKGxvd2VyCisgICAyNCBiaXRzKSAqLworI2RlZmluZSBTRVRfREVOU19BTkRfQkxLIDB4MTAwMDEKKworc3RhdGljIERFRklORV9SV0xPQ0soc3RfZGV2X2Fycl9sb2NrKTsKKworc3RhdGljIGludCBzdF9maXhlZF9idWZmZXJfc2l6ZSA9IFNUX0ZJWEVEX0JVRkZFUl9TSVpFOworc3RhdGljIGludCBzdF9tYXhfc2dfc2VncyA9IFNUX01BWF9TRzsKKworc3RhdGljIHN0cnVjdCBzY3NpX3RhcGUgKipzY3NpX3RhcGVzID0gTlVMTDsKKworc3RhdGljIGludCBtb2Rlc19kZWZpbmVkOworCitzdGF0aWMgc3RydWN0IHN0X2J1ZmZlciAqbmV3X3RhcGVfYnVmZmVyKGludCwgaW50LCBpbnQpOworc3RhdGljIGludCBlbmxhcmdlX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqKTsKK3N0YXRpYyBpbnQgYXBwZW5kX3RvX2J1ZmZlcihjb25zdCBjaGFyIF9fdXNlciAqLCBzdHJ1Y3Qgc3RfYnVmZmVyICosIGludCk7CitzdGF0aWMgaW50IGZyb21fYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKiwgY2hhciBfX3VzZXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG1vdmVfYnVmZmVyX2RhdGEoc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQpOworc3RhdGljIHZvaWQgYnVmX3RvX3NnKHN0cnVjdCBzdF9idWZmZXIgKiwgdW5zaWduZWQgaW50KTsKKworc3RhdGljIGludCBzdF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgY29uc3QgdW5zaWduZWQgaW50LCAKKwkJCSAgICAgdW5zaWduZWQgbG9uZywgc2l6ZV90LCBpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCBzZ2xfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGNvbnN0IHVuc2lnbmVkIGludCwgCisJCQkgICAgICB1bnNpZ25lZCBsb25nLCBzaXplX3QsIGludCk7CitzdGF0aWMgaW50IHNnbF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqLCBjb25zdCB1bnNpZ25lZCBpbnQsIGludCk7CisKK3N0YXRpYyBpbnQgc3RfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgc3RfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHN0X2luaXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICopOworCitzdGF0aWMgdm9pZCBkb19jcmVhdGVfZHJpdmVyZnNfZmlsZXModm9pZCk7CitzdGF0aWMgdm9pZCBkb19yZW1vdmVfZHJpdmVyZnNfZmlsZXModm9pZCk7CitzdGF0aWMgdm9pZCBkb19jcmVhdGVfY2xhc3NfZmlsZXMoc3RydWN0IHNjc2lfdGFwZSAqLCBpbnQsIGludCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9kcml2ZXIgc3RfdGVtcGxhdGUgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZ2VuZHJ2ID0geworCQkubmFtZQkJPSAic3QiLAorCQkucHJvYmUJCT0gc3RfcHJvYmUsCisJCS5yZW1vdmUJCT0gc3RfcmVtb3ZlLAorCX0sCisJLmluaXRfY29tbWFuZAkJPSBzdF9pbml0X2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IHN0X2NvbXByZXNzaW9uKHN0cnVjdCBzY3NpX3RhcGUgKiwgaW50KTsKKworc3RhdGljIGludCBmaW5kX3BhcnRpdGlvbihzdHJ1Y3Qgc2NzaV90YXBlICopOworc3RhdGljIGludCBzd2l0Y2hfcGFydGl0aW9uKHN0cnVjdCBzY3NpX3RhcGUgKik7CisKK3N0YXRpYyBpbnQgc3RfaW50X2lvY3RsKHN0cnVjdCBzY3NpX3RhcGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworDAorI2luY2x1ZGUgIm9zc3RfZGV0ZWN0LmgiCisjaWZuZGVmIFNJR1NfRlJPTV9PU1NUCisjZGVmaW5lIFNJR1NfRlJPTV9PU1NUIFwKKwl7Ik9uU3RyZWFtIiwgIlNDLSIsICIiLCAib3NzdCJ9LCBcCisJeyJPblN0cmVhbSIsICJESS0iLCAiIiwgIm9zc3QifSwgXAorCXsiT25TdHJlYW0iLCAiRFAtIiwgIiIsICJvc3N0In0sIFwKKwl7Ik9uU3RyZWFtIiwgIlVTQiIsICIiLCAib3NzdCJ9LCBcCisJeyJPblN0cmVhbSIsICJGVy0iLCAiIiwgIm9zc3QifQorI2VuZGlmCisKK3N0cnVjdCBzdF9yZWplY3RfZGF0YSB7CisJY2hhciAqdmVuZG9yOworCWNoYXIgKm1vZGVsOworCWNoYXIgKnJldjsKKwljaGFyICpkcml2ZXJfaGludDsgLyogTmFtZSBvZiB0aGUgY29ycmVjdCBkcml2ZXIsIE5VTEwgaWYgdW5rbm93biAqLworfTsKKworc3RhdGljIHN0cnVjdCBzdF9yZWplY3RfZGF0YSByZWplY3RfbGlzdFtdID0geworCS8qIHsiWFhYIiwgIll5LSIsICIiLCBOVUxMfSwgIGV4YW1wbGUgKi8KKwlTSUdTX0ZST01fT1NTVCwKKwl7TlVMTCwgfX07CisKKy8qIElmIHRoZSBkZXZpY2Ugc2lnbmF0dXJlIGlzIG9uIHRoZSBsaXN0IG9mIGluY29tcGF0aWJsZSBkcml2ZXMsIHRoZQorICAgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgb2YgdGhlIGNvcnJlY3QgZHJpdmVyIChpZiBrbm93bikgKi8KK3N0YXRpYyBjaGFyICogc3RfaW5jb21wYXRpYmxlKHN0cnVjdCBzY3NpX2RldmljZSogU0RwKQoreworCXN0cnVjdCBzdF9yZWplY3RfZGF0YSAqcnA7CisKKwlmb3IgKHJwPSYocmVqZWN0X2xpc3RbMF0pOyBycC0+dmVuZG9yICE9IE5VTEw7IHJwKyspCisJCWlmICghc3RybmNtcChycC0+dmVuZG9yLCBTRHAtPnZlbmRvciwgc3RybGVuKHJwLT52ZW5kb3IpKSAmJgorCQkgICAgIXN0cm5jbXAocnAtPm1vZGVsLCBTRHAtPm1vZGVsLCBzdHJsZW4ocnAtPm1vZGVsKSkgJiYKKwkJICAgICFzdHJuY21wKHJwLT5yZXYsIFNEcC0+cmV2LCBzdHJsZW4ocnAtPnJldikpKSB7CisJCQlpZiAocnAtPmRyaXZlcl9oaW50KQorCQkJCXJldHVybiBycC0+ZHJpdmVyX2hpbnQ7CisJCQllbHNlCisJCQkJcmV0dXJuICJ1bmtub3duIjsKKwkJfQorCXJldHVybiBOVUxMOworfQorDAorCitzdGF0aWMgaW5saW5lIGNoYXIgKnRhcGVfbmFtZShzdHJ1Y3Qgc2NzaV90YXBlICp0YXBlKQoreworCXJldHVybiB0YXBlLT5kaXNrLT5kaXNrX25hbWU7Cit9CisKKworc3RhdGljIHZvaWQgc3RfYW5hbHl6ZV9zZW5zZShzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCwgc3RydWN0IHN0X2NtZHN0YXR1cyAqcykKK3sKKwljb25zdCB1OCAqdWNwOworCWNvbnN0IHU4ICpzZW5zZSA9IFNScG50LT5zcl9zZW5zZV9idWZmZXI7CisKKwlzLT5oYXZlX3NlbnNlID0gc2NzaV9yZXF1ZXN0X25vcm1hbGl6ZV9zZW5zZShTUnBudCwgJnMtPnNlbnNlX2hkcik7CisJcy0+ZmxhZ3MgPSAwOworCisJaWYgKHMtPmhhdmVfc2Vuc2UpIHsKKwkJcy0+ZGVmZXJyZWQgPSAwOworCQlzLT5yZW1haW5kZXJfdmFsaWQgPQorCQkJc2NzaV9nZXRfc2Vuc2VfaW5mb19mbGQoc2Vuc2UsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgJnMtPnVyZW1haW5kZXI2NCk7CisJCXN3aXRjaCAoc2Vuc2VbMF0gJiAweDdmKSB7CisJCWNhc2UgMHg3MToKKwkJCXMtPmRlZmVycmVkID0gMTsKKwkJY2FzZSAweDcwOgorCQkJcy0+Zml4ZWRfZm9ybWF0ID0gMTsKKwkJCXMtPmZsYWdzID0gc2Vuc2VbMl0gJiAweGUwOworCQkJYnJlYWs7CisJCWNhc2UgMHg3MzoKKwkJCXMtPmRlZmVycmVkID0gMTsKKwkJY2FzZSAweDcyOgorCQkJcy0+Zml4ZWRfZm9ybWF0ID0gMDsKKwkJCXVjcCA9IHNjc2lfc2Vuc2VfZGVzY19maW5kKHNlbnNlLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIDQpOworCQkJcy0+ZmxhZ3MgPSB1Y3AgPyAodWNwWzNdICYgMHhlMCkgOiAwOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyogQ29udmVydCB0aGUgcmVzdWx0IHRvIHN1Y2Nlc3MgY29kZSAqLworc3RhdGljIGludCBzdF9jaGtfcmVzdWx0KHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgc3RydWN0IHNjc2lfcmVxdWVzdCAqIFNScG50KQoreworCWludCByZXN1bHQgPSBTUnBudC0+c3JfcmVzdWx0OworCXU4IHNjb2RlOworCURFQihjb25zdCBjaGFyICpzdHA7KQorCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlzdHJ1Y3Qgc3RfY21kc3RhdHVzICpjbWRzdGF0cDsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gMDsKKworCWNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OworCXN0X2FuYWx5emVfc2Vuc2UoU1RwLT5idWZmZXItPmxhc3RfU1JwbnQsIGNtZHN0YXRwKTsKKworCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSkKKwkJc2NvZGUgPSBTVHAtPmJ1ZmZlci0+Y21kc3RhdC5zZW5zZV9oZHIuc2Vuc2Vfa2V5OworCWVsc2UKKwkJc2NvZGUgPSAwOworCisgICAgICAgIERFQigKKyAgICAgICAgaWYgKGRlYnVnZ2luZykgeworICAgICAgICAgICAgICAgIHByaW50ayhTVF9ERUJfTVNHICIlczogRXJyb3I6ICV4LCBjbWQ6ICV4ICV4ICV4ICV4ICV4ICV4IExlbjogJWRcbiIsCisJCSAgICAgICBuYW1lLCByZXN1bHQsCisJCSAgICAgICBTUnBudC0+c3JfY21uZFswXSwgU1JwbnQtPnNyX2NtbmRbMV0sIFNScG50LT5zcl9jbW5kWzJdLAorCQkgICAgICAgU1JwbnQtPnNyX2NtbmRbM10sIFNScG50LT5zcl9jbW5kWzRdLCBTUnBudC0+c3JfY21uZFs1XSwKKwkJICAgICAgIFNScG50LT5zcl9idWZmbGVuKTsKKwkJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlKQorCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoInN0IiwgU1JwbnQpOworCX0gKSAvKiBlbmQgREVCICovCisJaWYgKCFkZWJ1Z2dpbmcpIHsgLyogQWJub3JtYWwgY29uZGl0aW9ucyBmb3IgdGFwZSAqLworCQlpZiAoIWNtZHN0YXRwLT5oYXZlX3NlbnNlKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogRXJyb3IgJXggKHN1Z2cuIGJ0IDB4JXgsIGRyaXZlciBidCAweCV4LCBob3N0IGJ0IDB4JXgpLlxuIiwKKwkJCSAgICAgICBuYW1lLCByZXN1bHQsIHN1Z2dlc3Rpb24ocmVzdWx0KSwKKwkJCSAgICAgICBkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX01BU0ssIGhvc3RfYnl0ZShyZXN1bHQpKTsKKwkJZWxzZSBpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UgJiYKKwkJCSBzY29kZSAhPSBOT19TRU5TRSAmJgorCQkJIHNjb2RlICE9IFJFQ09WRVJFRF9FUlJPUiAmJgorCQkJIC8qIHNjb2RlICE9IFVOSVRfQVRURU5USU9OICYmICovCisJCQkgc2NvZGUgIT0gQkxBTktfQ0hFQ0sgJiYKKwkJCSBzY29kZSAhPSBWT0xVTUVfT1ZFUkZMT1cgJiYKKwkJCSBTUnBudC0+c3JfY21uZFswXSAhPSBNT0RFX1NFTlNFICYmCisJCQkgU1JwbnQtPnNyX2NtbmRbMF0gIT0gVEVTVF9VTklUX1JFQURZKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIHdpdGggc2Vuc2UgZGF0YTogIiwgbmFtZSk7CisJCQkJc2NzaV9wcmludF9yZXFfc2Vuc2UoInN0IiwgU1JwbnQpOworCQl9CisJfQorCisJaWYgKGNtZHN0YXRwLT5maXhlZF9mb3JtYXQgJiYKKwkgICAgU1RwLT5jbG5fbW9kZSA+PSBFWFRFTkRFRF9TRU5TRV9TVEFSVCkgeyAgLyogT25seSBmaXhlZCBmb3JtYXQgc2Vuc2UgKi8KKwkJaWYgKFNUcC0+Y2xuX3NlbnNlX3ZhbHVlKQorCQkJU1RwLT5jbGVhbmluZ19yZXEgfD0gKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyW1NUcC0+Y2xuX21vZGVdICYKKwkJCQkJICAgICAgIFNUcC0+Y2xuX3NlbnNlX21hc2spID09IFNUcC0+Y2xuX3NlbnNlX3ZhbHVlKTsKKwkJZWxzZQorCQkJU1RwLT5jbGVhbmluZ19yZXEgfD0gKChTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyW1NUcC0+Y2xuX21vZGVdICYKKwkJCQkJICAgICAgIFNUcC0+Y2xuX3NlbnNlX21hc2spICE9IDApOworCX0KKwlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UgJiYKKwkgICAgY21kc3RhdHAtPnNlbnNlX2hkci5hc2MgPT0gMCAmJiBjbWRzdGF0cC0+c2Vuc2VfaGRyLmFzY3EgPT0gMHgxNykKKwkJU1RwLT5jbGVhbmluZ19yZXEgPSAxOyAvKiBBU0MgYW5kIEFTQ1EgPT4gY2xlYW5pbmcgcmVxdWVzdGVkICovCisKKwlTVHAtPnBvc191bmtub3duIHw9IFNUcC0+ZGV2aWNlLT53YXNfcmVzZXQ7CisKKwlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UgJiYKKwkgICAgc2NvZGUgPT0gUkVDT1ZFUkVEX0VSUk9SCisjaWYgU1RfUkVDT1ZFUkVEX1dSSVRFX0ZBVEFMCisJICAgICYmIFNScG50LT5zcl9jbW5kWzBdICE9IFdSSVRFXzYKKwkgICAgJiYgU1JwbnQtPnNyX2NtbmRbMF0gIT0gV1JJVEVfRklMRU1BUktTCisjZW5kaWYKKwkgICAgKSB7CisJCVNUcC0+cmVjb3Zlcl9jb3VudCsrOworCQlTVHAtPnJlY292ZXJfcmVnKys7CisKKyAgICAgICAgICAgICAgICBERUIoCisJCWlmIChkZWJ1Z2dpbmcpIHsKKwkJCWlmIChTUnBudC0+c3JfY21uZFswXSA9PSBSRUFEXzYpCisJCQkJc3RwID0gInJlYWQiOworCQkJZWxzZSBpZiAoU1JwbnQtPnNyX2NtbmRbMF0gPT0gV1JJVEVfNikKKwkJCQlzdHAgPSAid3JpdGUiOworCQkJZWxzZQorCQkJCXN0cCA9ICJpb2N0bCI7CisJCQlwcmludGsoU1RfREVCX01TRyAiJXM6IFJlY292ZXJlZCAlcyBlcnJvciAoJWQpLlxuIiwgbmFtZSwgc3RwLAorCQkJICAgICAgIFNUcC0+cmVjb3Zlcl9jb3VudCk7CisJCX0gKSAvKiBlbmQgREVCICovCisKKwkJaWYgKGNtZHN0YXRwLT5mbGFncyA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAoLUVJTyk7Cit9CisKKworLyogV2FrZXVwIGZyb20gaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBzdF9zbGVlcF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBjb250YWluZXJfb2YoU0NwbnQtPnJlcXVlc3QtPnJxX2Rpc2stPnByaXZhdGVfZGF0YSwKKwkJCQkJICAgICBzdHJ1Y3Qgc2NzaV90YXBlLCBkcml2ZXIpOworCisJKFNUcC0+YnVmZmVyKS0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBTQ3BudC0+cmVzdWx0OworCVNDcG50LT5yZXF1ZXN0LT5ycV9zdGF0dXMgPSBSUV9TQ1NJX0RPTkU7CisJKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCA9IFNDcG50LT5zY19yZXF1ZXN0OworCURFQiggU1RwLT53cml0ZV9wZW5kaW5nID0gMDsgKQorCisJY29tcGxldGUoU0NwbnQtPnJlcXVlc3QtPndhaXRpbmcpOworfQorCisvKiBEbyB0aGUgc2NzaSBjb21tYW5kLiBXYWl0cyB1bnRpbCBjb21tYW5kIHBlcmZvcm1lZCBpZiBkb193YWl0IGlzIHRydWUuCisgICBPdGhlcndpc2Ugd3JpdGVfYmVoaW5kX2NoZWNrKCkgaXMgdXNlZCB0byBjaGVjayB0aGF0IHRoZSBjb21tYW5kCisgICBoYXMgZmluaXNoZWQuICovCitzdGF0aWMgc3RydWN0IHNjc2lfcmVxdWVzdCAqCitzdF9kb19zY3NpKHN0cnVjdCBzY3NpX3JlcXVlc3QgKiBTUnBudCwgc3RydWN0IHNjc2lfdGFwZSAqIFNUcCwgdW5zaWduZWQgY2hhciAqY21kLAorCSAgIGludCBieXRlcywgaW50IGRpcmVjdGlvbiwgaW50IHRpbWVvdXQsIGludCByZXRyaWVzLCBpbnQgZG9fd2FpdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpicDsKKworCWlmIChTUnBudCA9PSBOVUxMKSB7CisJCVNScG50ID0gc2NzaV9hbGxvY2F0ZV9yZXF1ZXN0KFNUcC0+ZGV2aWNlLCBHRlBfQVRPTUlDKTsKKwkJaWYgKFNScG50ID09IE5VTEwpIHsKKwkJCURFQkMoIHByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBTQ1NJIHJlcXVlc3QuXG4iLAorCQkJCSAgICAgdGFwZV9uYW1lKFNUcCkpOyApOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gKC1FSU5UUik7CisJCQllbHNlCisJCQkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAoLUVCVVNZKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZTVHAtPndhaXQpOworCVNScG50LT5zcl91c2Vfc2cgPSBTVHAtPmJ1ZmZlci0+ZG9fZGlvIHx8IChieXRlcyA+IChTVHAtPmJ1ZmZlciktPmZycFswXS5sZW5ndGgpOworCWlmIChTUnBudC0+c3JfdXNlX3NnKSB7CisJCWlmICghU1RwLT5idWZmZXItPmRvX2RpbykKKwkJCWJ1Zl90b19zZyhTVHAtPmJ1ZmZlciwgYnl0ZXMpOworCQlTUnBudC0+c3JfdXNlX3NnID0gKFNUcC0+YnVmZmVyKS0+c2dfc2VnczsKKwkJYnAgPSAoY2hhciAqKSAmKChTVHAtPmJ1ZmZlciktPnNnWzBdKTsKKwl9IGVsc2UKKwkJYnAgPSAoU1RwLT5idWZmZXIpLT5iX2RhdGE7CisJU1JwbnQtPnNyX2RhdGFfZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCVNScG50LT5zcl9jbWRfbGVuID0gMDsKKwlTUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9ICYoU1RwLT53YWl0KTsKKwlTUnBudC0+c3JfcmVxdWVzdC0+cnFfc3RhdHVzID0gUlFfU0NTSV9CVVNZOworCVNScG50LT5zcl9yZXF1ZXN0LT5ycV9kaXNrID0gU1RwLT5kaXNrOworCVNUcC0+YnVmZmVyLT5jbWRzdGF0LmhhdmVfc2Vuc2UgPSAwOworCisJc2NzaV9kb19yZXEoU1JwbnQsICh2b2lkICopIGNtZCwgYnAsIGJ5dGVzLAorCQkgICAgc3Rfc2xlZXBfZG9uZSwgdGltZW91dCwgcmV0cmllcyk7CisKKwlpZiAoZG9fd2FpdCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKFNScG50LT5zcl9yZXF1ZXN0LT53YWl0aW5nKTsKKwkJU1JwbnQtPnNyX3JlcXVlc3QtPndhaXRpbmcgPSBOVUxMOworCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9IHN0X2Noa19yZXN1bHQoU1RwLCBTUnBudCk7CisJfQorCXJldHVybiBTUnBudDsKK30KKworCisvKiBIYW5kbGUgdGhlIHdyaXRlLWJlaGluZCBjaGVja2luZyAod2FpdHMgZm9yIGNvbXBsZXRpb24pLiBSZXR1cm5zIC1FTk9TUEMgaWYKKyAgIHdyaXRlIGhhcyBiZWVuIGNvcnJlY3QgYnV0IEVPTSBlYXJseSB3YXJuaW5nIHJlYWNoZWQsIC1FSU8gaWYgd3JpdGUgZW5kZWQgaW4KKyAgIGVycm9yIG9yIHplcm8gaWYgd3JpdGUgc3VjY2Vzc2Z1bC4gQXN5bmNocm9ub3VzIHdyaXRlcyBhcmUgdXNlZCBvbmx5IGluCisgICB2YXJpYWJsZSBibG9jayBtb2RlLiAqLworc3RhdGljIGludCB3cml0ZV9iZWhpbmRfY2hlY2soc3RydWN0IHNjc2lfdGFwZSAqIFNUcCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJ1ZmZlcjsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHA7CisKKwlTVGJ1ZmZlciA9IFNUcC0+YnVmZmVyOworCWlmICghU1RidWZmZXItPndyaXRpbmcpCisJCXJldHVybiAwOworCisgICAgICAgIERFQigKKwlpZiAoU1RwLT53cml0ZV9wZW5kaW5nKQorCQlTVHAtPm5icl93YWl0cysrOworCWVsc2UKKwkJU1RwLT5uYnJfZmluaXNoZWQrKzsKKyAgICAgICAgKSAvKiBlbmQgREVCICovCisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCYoU1RwLT53YWl0KSk7CisJKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudC0+c3JfcmVxdWVzdC0+d2FpdGluZyA9IE5VTEw7CisKKwkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9IHN0X2Noa19yZXN1bHQoU1RwLCAoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50KTsKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdCgoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50KTsKKworCVNUYnVmZmVyLT5idWZmZXJfYnl0ZXMgLT0gU1RidWZmZXItPndyaXRpbmc7CisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkgeworCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCQlTVHBzLT5kcnZfYmxvY2srKzsKKwkJZWxzZQorCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IFNUYnVmZmVyLT53cml0aW5nIC8gU1RwLT5ibG9ja19zaXplOworCX0KKworCWNtZHN0YXRwID0gJlNUYnVmZmVyLT5jbWRzdGF0OworCWlmIChTVGJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlICYmICFjbWRzdGF0cC0+ZGVmZXJyZWQgJiYKKwkJICAgIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9FT00pICYmCisJCSAgICAoY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gTk9fU0VOU0UgfHwKKwkJICAgICBjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBSRUNPVkVSRURfRVJST1IpKSB7CisJCQkvKiBFT00gYXQgd3JpdGUtYmVoaW5kLCBoYXMgYWxsIGRhdGEgYmVlbiB3cml0dGVuPyAqLworCQkJaWYgKCFjbWRzdGF0cC0+cmVtYWluZGVyX3ZhbGlkIHx8CisJCQkgICAgY21kc3RhdHAtPnVyZW1haW5kZXI2NCA9PSAwKQorCQkJCXJldHZhbCA9IC1FTk9TUEM7CisJCX0KKwkJaWYgKHJldHZhbCA9PSAtRUlPKQorCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gLTE7CisJfQorCVNUYnVmZmVyLT53cml0aW5nID0gMDsKKworCURFQihpZiAoZGVidWdnaW5nICYmIHJldHZhbCkKKwkgICAgcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBBc3luYyB3cml0ZSBlcnJvciAleCwgcmV0dXJuIHZhbHVlICVkLlxuIiwKKwkJICAgdGFwZV9uYW1lKFNUcCksIFNUYnVmZmVyLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCwgcmV0dmFsKTspIC8qIGVuZCBERUIgKi8KKworCXJldHVybiByZXR2YWw7Cit9CisKKworLyogU3RlcCBvdmVyIEVPRiBpZiBpdCBoYXMgYmVlbiBpbmFkdmVydGVudGx5IGNyb3NzZWQgKGlvY3RsIG5vdCB1c2VkIGJlY2F1c2UKKyAgIGl0IG1lc3NlcyB1cCB0aGUgYmxvY2sgbnVtYmVyKS4gKi8KK3N0YXRpYyBpbnQgY3Jvc3NfZW9mKHN0cnVjdCBzY3NpX3RhcGUgKiBTVHAsIGludCBmb3J3YXJkKQoreworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCisJY21kWzBdID0gU1BBQ0U7CisJY21kWzFdID0gMHgwMTsJCS8qIFNwYWNlIEZpbGVNYXJrcyAqLworCWlmIChmb3J3YXJkKSB7CisJCWNtZFsyXSA9IGNtZFszXSA9IDA7CisJCWNtZFs0XSA9IDE7CisJfSBlbHNlCisJCWNtZFsyXSA9IGNtZFszXSA9IGNtZFs0XSA9IDB4ZmY7CS8qIC0xIGZpbGVtYXJrcyAqLworCWNtZFs1XSA9IDA7CisKKyAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFN0ZXBwaW5nIG92ZXIgZmlsZW1hcmsgJXMuXG4iLAorCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpKTsKKworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkgICBTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCWlmICghU1JwbnQpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CisKKwlpZiAoKFNUcC0+YnVmZmVyKS0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU3RlcHBpbmcgb3ZlciBmaWxlbWFyayAlcyBmYWlsZWQuXG4iLAorCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpOworCisJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworfQorCisKKy8qIEZsdXNoIHRoZSB3cml0ZSBidWZmZXIgKG5ldmVyIG5lZWQgdG8gd3JpdGUgaWYgdmFyaWFibGUgYmxvY2tzaXplKS4gKi8KK3N0YXRpYyBpbnQgZmx1c2hfd3JpdGVfYnVmZmVyKHN0cnVjdCBzY3NpX3RhcGUgKiBTVHApCit7CisJaW50IG9mZnNldCwgdHJhbnNmZXIsIGJsa3M7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudDsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisKKwlyZXN1bHQgPSB3cml0ZV9iZWhpbmRfY2hlY2soU1RwKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJcmVzdWx0ID0gMDsKKwlpZiAoU1RwLT5kaXJ0eSA9PSAxKSB7CisKKwkJb2Zmc2V0ID0gKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzOworCQl0cmFuc2ZlciA9ICgob2Zmc2V0ICsgU1RwLT5ibG9ja19zaXplIC0gMSkgLworCQkJICAgIFNUcC0+YmxvY2tfc2l6ZSkgKiBTVHAtPmJsb2NrX3NpemU7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IEZsdXNoaW5nICVkIGJ5dGVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBlX25hbWUoU1RwKSwgdHJhbnNmZXIpKTsKKworCQltZW1zZXQoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhICsgb2Zmc2V0LCAwLCB0cmFuc2ZlciAtIG9mZnNldCk7CisKKwkJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJCWNtZFswXSA9IFdSSVRFXzY7CisJCWNtZFsxXSA9IDE7CisJCWJsa3MgPSB0cmFuc2ZlciAvIFNUcC0+YmxvY2tfc2l6ZTsKKwkJY21kWzJdID0gYmxrcyA+PiAxNjsKKwkJY21kWzNdID0gYmxrcyA+PiA4OworCQljbWRbNF0gPSBibGtzOworCisJCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgdHJhbnNmZXIsIERNQV9UT19ERVZJQ0UsCisJCQkJICAgU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9XUklURV9SRVRSSUVTLCAxKTsKKwkJaWYgKCFTUnBudCkKKwkJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCQlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwKSB7CisJCQlzdHJ1Y3Qgc3RfY21kc3RhdHVzICpjbWRzdGF0cCA9ICZTVHAtPmJ1ZmZlci0+Y21kc3RhdDsKKworCQkJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlICYmICFjbWRzdGF0cC0+ZGVmZXJyZWQgJiYKKwkJCSAgICAoY21kc3RhdHAtPmZsYWdzICYgU0VOU0VfRU9NKSAmJgorCQkJICAgIChjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBOT19TRU5TRSB8fAorCQkJICAgICBjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBSRUNPVkVSRURfRVJST1IpICYmCisJCQkgICAgKCFjbWRzdGF0cC0+cmVtYWluZGVyX3ZhbGlkIHx8CisJCQkgICAgIGNtZHN0YXRwLT51cmVtYWluZGVyNjQgPT0gMCkpIHsgLyogQWxsIHdyaXR0ZW4gYXQgRU9NIGVhcmx5IHdhcm5pbmcgKi8KKwkJCQlTVHAtPmRpcnR5ID0gMDsKKwkJCQkoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgPSAwOworCQkJCWlmIChTVHBzLT5kcnZfYmxvY2sgPj0gMCkKKwkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IGJsa3M7CisJCQkJcmVzdWx0ID0gKC1FTk9TUEMpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBvbiBmbHVzaC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBlX25hbWUoU1RwKSk7CisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsKKwkJCQlyZXN1bHQgPSAoLUVJTyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID49IDApCisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IGJsa3M7CisJCQlTVHAtPmRpcnR5ID0gMDsKKwkJCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCX0KKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlTUnBudCA9IE5VTEw7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogRmx1c2ggdGhlIHRhcGUgYnVmZmVyLiBUaGUgdGFwZSB3aWxsIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IHVubGVzcworICAgc2Vla19uZXh0IGlzIHRydWUuICovCitzdGF0aWMgaW50IGZsdXNoX2J1ZmZlcihzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBzZWVrX25leHQpCit7CisJaW50IGJhY2tzcGFjZSwgcmVzdWx0OworCXN0cnVjdCBzdF9idWZmZXIgKlNUYnVmZmVyOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKworCVNUYnVmZmVyID0gU1RwLT5idWZmZXI7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIGJ1cyByZXNldCwgYmxvY2sgZnVydGhlciBhY2Nlc3MKKwkgKiB0byB0aGlzIGRldmljZS4KKwkgKi8KKwlpZiAoU1RwLT5wb3NfdW5rbm93bikKKwkJcmV0dXJuICgtRUlPKTsKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKQorCQlyZXR1cm4gMDsKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJaWYgKFNUcHMtPnJ3ID09IFNUX1dSSVRJTkcpCS8qIFdyaXRpbmcgKi8KKwkJcmV0dXJuIGZsdXNoX3dyaXRlX2J1ZmZlcihTVHApOworCisJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWJhY2tzcGFjZSA9ICgoU1RwLT5idWZmZXIpLT5idWZmZXJfYnl0ZXMgKworCQkgICAgIChTVHAtPmJ1ZmZlciktPnJlYWRfcG9pbnRlcikgLyBTVHAtPmJsb2NrX3NpemUgLQorCSAgICAoKFNUcC0+YnVmZmVyKS0+cmVhZF9wb2ludGVyICsgU1RwLT5ibG9ja19zaXplIC0gMSkgLworCSAgICBTVHAtPmJsb2NrX3NpemU7CisJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID0gMDsKKwkoU1RwLT5idWZmZXIpLT5yZWFkX3BvaW50ZXIgPSAwOworCXJlc3VsdCA9IDA7CisJaWYgKCFzZWVrX25leHQpIHsKKwkJaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJCXJlc3VsdCA9IGNyb3NzX2VvZihTVHAsIDApOwkvKiBCYWNrIG92ZXIgdGhlIEVPRiBoaXQgKi8KKwkJCWlmICghcmVzdWx0KQorCQkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQkJZWxzZSB7CisJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoIXJlc3VsdCAmJiBiYWNrc3BhY2UgPiAwKQorCQkJcmVzdWx0ID0gc3RfaW50X2lvY3RsKFNUcCwgTVRCU1IsIGJhY2tzcGFjZSk7CisJfSBlbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJU1Rwcy0+ZHJ2X2ZpbGUrKzsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJfQorCXJldHVybiByZXN1bHQ7CisKK30KKwwKKy8qIFNldCB0aGUgbW9kZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IHNldF9tb2RlX2RlbnNibGsoc3RydWN0IHNjc2lfdGFwZSAqIFNUcCwgc3RydWN0IHN0X21vZGVkZWYgKiBTVG0pCit7CisJaW50IHNldF9pdCA9IDA7CisJdW5zaWduZWQgbG9uZyBhcmc7CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKCFTVHAtPmRlbnNpdHlfY2hhbmdlZCAmJgorCSAgICBTVG0tPmRlZmF1bHRfZGVuc2l0eSA+PSAwICYmCisJICAgIFNUbS0+ZGVmYXVsdF9kZW5zaXR5ICE9IFNUcC0+ZGVuc2l0eSkgeworCQlhcmcgPSBTVG0tPmRlZmF1bHRfZGVuc2l0eTsKKwkJc2V0X2l0ID0gMTsKKwl9IGVsc2UKKwkJYXJnID0gU1RwLT5kZW5zaXR5OworCWFyZyA8PD0gTVRfU1RfREVOU0lUWV9TSElGVDsKKwlpZiAoIVNUcC0+Ymxrc2l6ZV9jaGFuZ2VkICYmCisJICAgIFNUbS0+ZGVmYXVsdF9ibGtzaXplID49IDAgJiYKKwkgICAgU1RtLT5kZWZhdWx0X2Jsa3NpemUgIT0gU1RwLT5ibG9ja19zaXplKSB7CisJCWFyZyB8PSBTVG0tPmRlZmF1bHRfYmxrc2l6ZTsKKwkJc2V0X2l0ID0gMTsKKwl9IGVsc2UKKwkJYXJnIHw9IFNUcC0+YmxvY2tfc2l6ZTsKKwlpZiAoc2V0X2l0ICYmCisJICAgIHN0X2ludF9pb2N0bChTVHAsIFNFVF9ERU5TX0FORF9CTEssIGFyZykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBDYW4ndCBzZXQgZGVmYXVsdCBibG9jayBzaXplIHRvICVkIGJ5dGVzIGFuZCBkZW5zaXR5ICV4LlxuIiwKKwkJICAgICAgIG5hbWUsIFNUbS0+ZGVmYXVsdF9ibGtzaXplLCBTVG0tPmRlZmF1bHRfZGVuc2l0eSk7CisJCWlmIChtb2Rlc19kZWZpbmVkKQorCQkJcmV0dXJuICgtRUlOVkFMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogTG9jayBvciB1bmxvY2sgdGhlIGRyaXZlIGRvb3IuIERvbid0IHVzZSB3aGVuIHNjc2lfcmVxdWVzdCBhbGxvY2F0ZWQuICovCitzdGF0aWMgaW50IGRvX2Rvb3JfbG9jayhzdHJ1Y3Qgc2NzaV90YXBlICogU1RwLCBpbnQgZG9fbG9jaykKK3sKKwlpbnQgcmV0dmFsLCBjbWQ7CisJREVCKGNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTspCisKKworCWNtZCA9IGRvX2xvY2sgPyBTQ1NJX0lPQ1RMX0RPT1JMT0NLIDogU0NTSV9JT0NUTF9ET09SVU5MT0NLOworCURFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiAlc29ja2luZyBkcml2ZSBkb29yLlxuIiwgbmFtZSwKKwkJICAgIGRvX2xvY2sgPyAiTCIgOiAiVW5sIikpOworCXJldHZhbCA9IHNjc2lfaW9jdGwoU1RwLT5kZXZpY2UsIGNtZCwgTlVMTCk7CisJaWYgKCFyZXR2YWwpIHsKKwkJU1RwLT5kb29yX2xvY2tlZCA9IGRvX2xvY2sgPyBTVF9MT0NLRURfRVhQTElDSVQgOiBTVF9VTkxPQ0tFRDsKKwl9CisJZWxzZSB7CisJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9MT0NLX0ZBSUxTOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIFNldCB0aGUgaW50ZXJuYWwgc3RhdGUgYWZ0ZXIgcmVzZXQgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3N0YXRlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisKKwlTVHAtPnBvc191bmtub3duID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJU1Rwcy0+YXRfc20gPSAwOworCQlTVHBzLT5sYXN0X2Jsb2NrX3ZhbGlkID0gMDsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gLTE7CisJCVNUcHMtPmRydl9maWxlID0gLTE7CisJfQorCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zKSB7CisJCVNUcC0+cGFydGl0aW9uID0gZmluZF9wYXJ0aXRpb24oU1RwKTsKKwkJaWYgKFNUcC0+cGFydGl0aW9uIDwgMCkKKwkJCVNUcC0+cGFydGl0aW9uID0gMDsKKwkJU1RwLT5uZXdfcGFydGl0aW9uID0gU1RwLT5wYXJ0aXRpb247CisJfQorfQorDAorLyogVGVzdCBpZiB0aGUgZHJpdmUgaXMgcmVhZHkuIFJldHVybnMgZWl0aGVyIG9uZSBvZiB0aGUgY29kZXMgYmVsb3cgb3IgYSBuZWdhdGl2ZSBzeXN0ZW0KKyAgIGVycm9yIGNvZGUuICovCisjZGVmaW5lIENIS1JFU19SRUFEWSAgICAgICAwCisjZGVmaW5lIENIS1JFU19ORVdfU0VTU0lPTiAxCisjZGVmaW5lIENIS1JFU19OT1RfUkVBRFkgICAyCisjZGVmaW5lIENIS1JFU19OT19UQVBFICAgICAzCisKKyNkZWZpbmUgTUFYX0FUVEVOVElPTlMgICAgMTAKKworc3RhdGljIGludCB0ZXN0X3JlYWR5KHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IGRvX3dhaXQpCit7CisJaW50IGF0dGVudGlvbnMsIHdhaXRzLCBtYXhfd2FpdCwgc2NvZGU7CisJaW50IHJldHZhbCA9IENIS1JFU19SRUFEWSwgbmV3X3Nlc3Npb24gPSAwOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RfY21kc3RhdHVzICpjbWRzdGF0cCA9ICZTVHAtPmJ1ZmZlci0+Y21kc3RhdDsKKworCW1heF93YWl0ID0gZG9fd2FpdCA/IFNUX0JMT0NLX1NFQ09ORFMgOiAwOworCisJZm9yIChhdHRlbnRpb25zPXdhaXRzPTA7IDsgKSB7CisJCW1lbXNldCgodm9pZCAqKSAmY21kWzBdLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkgICBTVHAtPmxvbmdfdGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOworCisJCWlmICghU1JwbnQpIHsKKwkJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UpIHsKKworCQkJc2NvZGUgPSBjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleTsKKworCQkJaWYgKHNjb2RlID09IFVOSVRfQVRURU5USU9OKSB7IC8qIE5ldyBtZWRpYT8gKi8KKwkJCQluZXdfc2Vzc2lvbiA9IDE7CisJCQkJaWYgKGF0dGVudGlvbnMgPCBNQVhfQVRURU5USU9OUykgeworCQkJCQlhdHRlbnRpb25zKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcmV0dmFsID0gKC1FSU8pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChzY29kZSA9PSBOT1RfUkVBRFkpIHsKKwkJCQlpZiAod2FpdHMgPCBtYXhfd2FpdCkgeworCQkJCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpIHsKKwkJCQkJCXJldHZhbCA9ICgtRUlOVFIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJd2FpdHMrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoKFNUcC0+ZGV2aWNlKS0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIgJiYKKwkJCQkJICAgIGNtZHN0YXRwLT5zZW5zZV9oZHIuYXNjID09IDB4M2EpCS8qIENoZWNrIEFTQyAqLworCQkJCQkJcmV0dmFsID0gQ0hLUkVTX05PX1RBUEU7CisJCQkJCWVsc2UKKwkJCQkJCXJldHZhbCA9IENIS1JFU19OT1RfUkVBRFk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IG5ld19zZXNzaW9uID8gQ0hLUkVTX05FV19TRVNTSU9OIDogQ0hLUkVTX1JFQURZOworCQlicmVhazsKKwl9CisKKwlpZiAoU1JwbnQgIT0gTlVMTCkKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyogU2VlIGlmIHRoZSBkcml2ZSBpcyByZWFkeSBhbmQgZ2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXBlLiBSZXR1cm4gdmFsdWVzOgorICAgPCAwICAgbmVnYXRpdmUgZXJyb3IgY29kZSBmcm9tIGVycm5vLmgKKyAgIDAgICAgIGRyaXZlIHJlYWR5CisgICAxICAgICBkcml2ZSBub3QgcmVhZHkgKHBvc3NpYmx5IG5vIHRhcGUpCisqLworc3RhdGljIGludCBjaGVja190YXBlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IGksIHJldHZhbCwgbmV3X3Nlc3Npb24gPSAwLCBkb193YWl0OworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdLCBzYXZlZF9jbGVhbmluZzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9mbGFncyA9IGZpbHAtPmZfZmxhZ3M7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IG1vZGUgPSBUQVBFX01PREUoaW5vZGUpOworCisJU1RwLT5yZWFkeSA9IFNUX1JFQURZOworCisJaWYgKG1vZGUgIT0gU1RwLT5jdXJyZW50X21vZGUpIHsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogTW9kZSBjaGFuZ2UgZnJvbSAlZCB0byAlZC5cbiIsCisJCQkgICAgICAgbmFtZSwgU1RwLT5jdXJyZW50X21vZGUsIG1vZGUpKTsKKwkJbmV3X3Nlc3Npb24gPSAxOworCQlTVHAtPmN1cnJlbnRfbW9kZSA9IG1vZGU7CisJfQorCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCisJc2F2ZWRfY2xlYW5pbmcgPSBTVHAtPmNsZWFuaW5nX3JlcTsKKwlTVHAtPmNsZWFuaW5nX3JlcSA9IDA7CisKKwlkb193YWl0ID0gKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPT0gMCk7CisJcmV0dmFsID0gdGVzdF9yZWFkeShTVHAsIGRvX3dhaXQpOworCisJaWYgKHJldHZhbCA8IDApCisJICAgIGdvdG8gZXJyX291dDsKKworCWlmIChyZXR2YWwgPT0gQ0hLUkVTX05FV19TRVNTSU9OKSB7CisJCVNUcC0+cG9zX3Vua25vd24gPSAwOworCQlTVHAtPnBhcnRpdGlvbiA9IFNUcC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zKQorCQkJU1RwLT5uYnJfcGFydGl0aW9ucyA9IDE7IC8qIFRoaXMgZ3Vlc3Mgd2lsbCBiZSB1cGRhdGVkIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmVjZXNzYXJ5ICovCisJCWZvciAoaSA9IDA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCQlTVHBzID0gJihTVHAtPnBzW2ldKTsKKwkJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQkJU1Rwcy0+YXRfc20gPSAwOworCQkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSAwOworCQl9CisJCW5ld19zZXNzaW9uID0gMTsKKwl9CisJZWxzZSB7CisJCVNUcC0+Y2xlYW5pbmdfcmVxIHw9IHNhdmVkX2NsZWFuaW5nOworCisJCWlmIChyZXR2YWwgPT0gQ0hLUkVTX05PVF9SRUFEWSB8fCByZXR2YWwgPT0gQ0hLUkVTX05PX1RBUEUpIHsKKwkJCWlmIChyZXR2YWwgPT0gQ0hLUkVTX05PX1RBUEUpCisJCQkJU1RwLT5yZWFkeSA9IFNUX05PX1RBUEU7CisJCQllbHNlCisJCQkJU1RwLT5yZWFkeSA9IFNUX05PVF9SRUFEWTsKKworCQkJU1RwLT5kZW5zaXR5ID0gMDsJLyogQ2xlYXIgdGhlIGVycm9uZW91cyAicmVzaWR1ZSIgKi8KKwkJCVNUcC0+d3JpdGVfcHJvdCA9IDA7CisJCQlTVHAtPmJsb2NrX3NpemUgPSAwOworCQkJU1RwLT5wc1swXS5kcnZfZmlsZSA9IFNUcC0+cHNbMF0uZHJ2X2Jsb2NrID0gKC0xKTsKKwkJCVNUcC0+cGFydGl0aW9uID0gU1RwLT5uZXdfcGFydGl0aW9uID0gMDsKKwkJCVNUcC0+ZG9vcl9sb2NrZWQgPSBTVF9VTkxPQ0tFRDsKKwkJCXJldHVybiBDSEtSRVNfTk9UX1JFQURZOworCQl9CisJfQorCisJaWYgKFNUcC0+b21pdF9ibGtsaW1zKQorCQlTVHAtPm1pbl9ibG9jayA9IFNUcC0+bWF4X2Jsb2NrID0gKC0xKTsKKwllbHNlIHsKKwkJbWVtc2V0KCh2b2lkICopICZjbWRbMF0sIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBSRUFEX0JMT0NLX0xJTUlUUzsKKworCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCA2LCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJICAgU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwkJaWYgKCFTUnBudCkgeworCQkJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQlpZiAoIVNScG50LT5zcl9yZXN1bHQgJiYgIVNUcC0+YnVmZmVyLT5jbWRzdGF0LmhhdmVfc2Vuc2UpIHsKKwkJCVNUcC0+bWF4X2Jsb2NrID0gKChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxXSA8PCAxNikgfAorCQkJICAgICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0gPDwgOCkgfCAoU1RwLT5idWZmZXIpLT5iX2RhdGFbM107CisJCQlTVHAtPm1pbl9ibG9jayA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF0gPDwgOCkgfAorCQkJICAgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVs1XTsKKwkJCWlmICggREVCKCBkZWJ1Z2dpbmcgfHwgKSAhU1RwLT5pbml0ZWQpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBCbG9jayBsaW1pdHMgJWQgLSAlZCBieXRlcy5cbiIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVHAtPm1pbl9ibG9jaywgU1RwLT5tYXhfYmxvY2spOworCQl9IGVsc2UgeworCQkJU1RwLT5taW5fYmxvY2sgPSBTVHAtPm1heF9ibG9jayA9ICgtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogQ2FuJ3QgcmVhZCBibG9jayBsaW1pdHMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOworCQl9CisJfQorCisJbWVtc2V0KCh2b2lkICopICZjbWRbMF0sIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IE1PREVfU0VOU0U7CisJY21kWzRdID0gMTI7CisKKwlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAxMiwgRE1BX0ZST01fREVWSUNFLAorCQkJU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KSB7CisJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogTm8gTW9kZSBTZW5zZS5cbiIsIG5hbWUpKTsKKwkJU1RwLT5ibG9ja19zaXplID0gU1RfREVGQVVMVF9CTE9DSzsJLyogRWR1Y2F0ZWQgZ3Vlc3MgKD8pICovCisJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gMDsJLyogUHJldmVudCBlcnJvciBwcm9wYWdhdGlvbiAqLworCQlTVHAtPmRydl93cml0ZV9wcm90ID0gMDsKKwl9IGVsc2UgeworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IE1vZGUgc2Vuc2UuIExlbmd0aCAlZCwgbWVkaXVtICV4LCBXQlMgJXgsIEJMTCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVswXSwgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVsyXSwgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzNdKSk7CisKKwkJaWYgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVszXSA+PSA4KSB7CisJCQlTVHAtPmRydl9idWZmZXIgPSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdID4+IDQpICYgNzsKKwkJCVNUcC0+ZGVuc2l0eSA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YVs0XTsKKwkJCVNUcC0+YmxvY2tfc2l6ZSA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YVs5XSAqIDY1NTM2ICsKKwkJCSAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTBdICogMjU2ICsgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzExXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRGVuc2l0eSAleCwgdGFwZSBsZW5ndGg6ICV4LCBkcnYgYnVmZmVyOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIFNUcC0+ZGVuc2l0eSwgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzVdICogNjU1MzYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzZdICogMjU2ICsgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RwLT5kcnZfYnVmZmVyKSk7CisJCX0KKwkJU1RwLT5kcnZfd3JpdGVfcHJvdCA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0gJiAweDgwKSAhPSAwOworCX0KKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJU1JwbnQgPSBOVUxMOworICAgICAgICBTVHAtPmluaXRlZCA9IDE7CisKKwlpZiAoU1RwLT5ibG9ja19zaXplID4gMCkKKwkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2Jsb2NrcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoU1RwLT5idWZmZXIpLT5idWZmZXJfc2l6ZSAvIFNUcC0+YmxvY2tfc2l6ZTsKKwllbHNlCisJCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MgPSAxOworCShTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyA9IChTVHAtPmJ1ZmZlciktPnJlYWRfcG9pbnRlciA9IDA7CisKKyAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJsb2NrIHNpemU6ICVkLCBidWZmZXIgc2l6ZTogJWQgKCVkIGJsb2NrcykuXG4iLCBuYW1lLAorCQkgICAgICAgU1RwLT5ibG9ja19zaXplLCAoU1RwLT5idWZmZXIpLT5idWZmZXJfc2l6ZSwKKwkJICAgICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3MpKTsKKworCWlmIChTVHAtPmRydl93cml0ZV9wcm90KSB7CisJCVNUcC0+d3JpdGVfcHJvdCA9IDE7CisKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogV3JpdGUgcHJvdGVjdGVkXG4iLCBuYW1lKSk7CisKKwkJaWYgKGRvX3dhaXQgJiYKKwkJICAgICgoc3RfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZIHx8CisJCSAgICAgKHN0X2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JEV1IpKSB7CisJCQlyZXR2YWwgPSAoLUVST0ZTKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKworCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zICYmIFNUcC0+bmJyX3BhcnRpdGlvbnMgPCAxKSB7CisJCS8qIFRoaXMgY29kZSBpcyByZWFjaGVkIHdoZW4gdGhlIGRldmljZSBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisJCSAgIGFmdGVyIHRoZSBkcml2ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0YXBlIGluIHRoZSBkcml2ZSBhbmQgdGhlCisJCSAgIHBhcnRpdGlvbiBzdXBwb3J0IGhhcyBiZWVuIGVuYWJsZWQuICovCisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVXBkYXRpbmcgcGFydGl0aW9uIG51bWJlciBpbiBzdGF0dXMuXG4iLCBuYW1lKSk7CisJCWlmICgoU1RwLT5wYXJ0aXRpb24gPSBmaW5kX3BhcnRpdGlvbihTVHApKSA8IDApIHsKKwkJCXJldHZhbCA9IFNUcC0+cGFydGl0aW9uOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCVNUcC0+bmV3X3BhcnRpdGlvbiA9IFNUcC0+cGFydGl0aW9uOworCQlTVHAtPm5icl9wYXJ0aXRpb25zID0gMTsgLyogVGhpcyBndWVzcyB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBuZWNlc3NhcnkgKi8KKwl9CisKKwlpZiAobmV3X3Nlc3Npb24pIHsJLyogQ2hhbmdlIHRoZSBkcml2ZSBwYXJhbWV0ZXJzIGZvciB0aGUgbmV3IG1vZGUgKi8KKwkJU1RwLT5kZW5zaXR5X2NoYW5nZWQgPSBTVHAtPmJsa3NpemVfY2hhbmdlZCA9IDA7CisJCVNUcC0+Y29tcHJlc3Npb25fY2hhbmdlZCA9IDA7CisJCWlmICghKFNUbS0+ZGVmYXVsdHNfZm9yX3dyaXRlcykgJiYKKwkJICAgIChyZXR2YWwgPSBzZXRfbW9kZV9kZW5zYmxrKFNUcCwgU1RtKSkgPCAwKQorCQkgICAgZ290byBlcnJfb3V0OworCisJCWlmIChTVHAtPmRlZmF1bHRfZHJ2YnVmZmVyICE9IDB4ZmYpIHsKKwkJCWlmIChzdF9pbnRfaW9jdGwoU1RwLCBNVFNFVERSVkJVRkZFUiwgU1RwLT5kZWZhdWx0X2RydmJ1ZmZlcikpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDYW4ndCBzZXQgZGVmYXVsdCBkcml2ZSBidWZmZXJpbmcgdG8gJWQuXG4iLAorCQkJCSAgICAgICBuYW1lLCBTVHAtPmRlZmF1bHRfZHJ2YnVmZmVyKTsKKwkJfQorCX0KKworCXJldHVybiBDSEtSRVNfUkVBRFk7CisKKyBlcnJfb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKworDC8qIE9wZW4gdGhlIGRldmljZS4gTmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggQktMIG9ubHkgYmVjYXVzZSBvZiBpbmNyZW1lbnRpbmcgdGhlIFNDU0kgaG9zdAorICAgbW9kdWxlIGNvdW50LiAqLworc3RhdGljIGludCBzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBpLCByZXR2YWwgPSAoLUVJTyk7CisJc3RydWN0IHNjc2lfdGFwZSAqU1RwOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlpbnQgZGV2ID0gVEFQRV9OUihpbm9kZSk7CisJY2hhciAqbmFtZTsKKworCS8qCisJICogV2UgcmVhbGx5IHdhbnQgdG8gZG8gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7IGhlcmUsIGJ1dCBzb21lCisJICogdmVyc2lvbnMgb2YgdGFyIGluY29ycmVjdGx5IGNhbGwgbHNlZWsgb24gdGFwZXMgYW5kIGJhaWwgb3V0IGlmIHRoYXQKKwkgKiBmYWlscy4gIFNvIHdlIGRpc2FsbG93IHByZWFkKCkgYW5kIHB3cml0ZSgpLCBidXQgcGVybWl0IGxzZWVrcy4KKwkgKi8KKwlmaWxwLT5mX21vZGUgJj0gfihGTU9ERV9QUkVBRCB8IEZNT0RFX1BXUklURSk7CisKKwl3cml0ZV9sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCWlmIChkZXYgPj0gc3RfZGV2X21heCB8fCBzY3NpX3RhcGVzID09IE5VTEwgfHwKKwkgICAgKChTVHAgPSBzY3NpX3RhcGVzW2Rldl0pID09IE5VTEwpKSB7CisJCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwkJcmV0dXJuICgtRU5YSU8pOworCX0KKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBTVHA7CisJbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKFNUcC0+aW5fdXNlKSB7CisJCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwkJREVCKCBwcmludGsoU1RfREVCX01TRyAiJXM6IERldmljZSBhbHJlYWR5IGluIHVzZS5cbiIsIG5hbWUpOyApCisJCXJldHVybiAoLUVCVVNZKTsKKwl9CisKKwlpZihzY3NpX2RldmljZV9nZXQoU1RwLT5kZXZpY2UpKSB7CisJCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwkJcmV0dXJuICgtRU5YSU8pOworCX0KKwlTVHAtPmluX3VzZSA9IDE7CisJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCVNUcC0+cmV3X2F0X2Nsb3NlID0gU1RwLT5hdXRvcmV3X2RldiA9IChpbWlub3IoaW5vZGUpICYgMHg4MCkgPT0gMDsKKworCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKFNUcC0+ZGV2aWNlKSkgeworCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIFNlZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgYSBvbmUgcGFnZSBidWZmZXIgYXZhaWxhYmxlICovCisJaWYgKCFlbmxhcmdlX2J1ZmZlcihTVHAtPmJ1ZmZlciwgUEFHRV9TSVpFLCBTVHAtPnJlc3RyX2RtYSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbid0IGFsbG9jYXRlIG9uZSBwYWdlIHRhcGUgYnVmZmVyLlxuIiwKKwkJICAgICAgIG5hbWUpOworCQlyZXR2YWwgPSAoLUVPVkVSRkxPVyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkoU1RwLT5idWZmZXIpLT53cml0aW5nID0gMDsKKwkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9IDA7CisKKwlTVHAtPndyaXRlX3Byb3QgPSAoKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKTsKKworCVNUcC0+ZGlydHkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCVNUcHMgPSAmKFNUcC0+cHNbaV0pOworCQlTVHBzLT5ydyA9IFNUX0lETEU7CisJfQorCVNUcC0+cmVjb3Zlcl9jb3VudCA9IDA7CisJREVCKCBTVHAtPm5icl93YWl0cyA9IFNUcC0+bmJyX2ZpbmlzaGVkID0gMDsKKwkgICAgIFNUcC0+bmJyX3JlcXVlc3RzID0gU1RwLT5uYnJfZGlvID0gU1RwLT5uYnJfcGFnZXMgPSBTVHAtPm5icl9jb21iaW5hYmxlID0gMDsgKQorCisJcmV0dmFsID0gY2hlY2tfdGFwZShTVHAsIGZpbHApOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9vdXQ7CisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPT0gMCAmJgorCSAgICByZXR2YWwgIT0gQ0hLUkVTX1JFQURZKSB7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlyZXR1cm4gMDsKKworIGVycl9vdXQ6CisJbm9ybWFsaXplX2J1ZmZlcihTVHAtPmJ1ZmZlcik7CisJU1RwLT5pbl91c2UgPSAwOworCXNjc2lfZGV2aWNlX3B1dChTVHAtPmRldmljZSk7CisJcmV0dXJuIHJldHZhbDsKKworfQorDAorCisvKiBGbHVzaCB0aGUgdGFwZSBidWZmZXIgYmVmb3JlIGNsb3NlICovCitzdGF0aWMgaW50IHN0X2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCByZXN1bHQgPSAwLCByZXN1bHQyOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKGZpbGVfY291bnQoZmlscCkgPiAxKQorCQlyZXR1cm4gMDsKKworCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HICYmICFTVHAtPnBvc191bmtub3duKSB7CisJCXJlc3VsdCA9IGZsdXNoX3dyaXRlX2J1ZmZlcihTVHApOworCQlpZiAocmVzdWx0ICE9IDAgJiYgcmVzdWx0ICE9ICgtRU5PU1BDKSkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zICYmCisJICAgIChyZXN1bHQyID0gc3dpdGNoX3BhcnRpdGlvbihTVHApKSA8IDApIHsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzd2l0Y2hfcGFydGl0aW9uIGF0IGNsb3NlIGZhaWxlZC5cbiIsIG5hbWUpKTsKKwkJaWYgKHJlc3VsdCA9PSAwKQorCQkJcmVzdWx0ID0gcmVzdWx0MjsKKwkJZ290byBvdXQ7CisJfQorCisJREVCQyggaWYgKFNUcC0+bmJyX3JlcXVlc3RzKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTnVtYmVyIG9mIHIvdyByZXF1ZXN0cyAlZCwgZGlvIHVzZWQgaW4gJWQsIHBhZ2VzICVkICglZCkuXG4iLAorCQkgICAgICAgbmFtZSwgU1RwLT5uYnJfcmVxdWVzdHMsIFNUcC0+bmJyX2RpbywgU1RwLT5uYnJfcGFnZXMsIFNUcC0+bmJyX2NvbWJpbmFibGUpKTsKKworCWlmIChTVHBzLT5ydyA9PSBTVF9XUklUSU5HICYmICFTVHAtPnBvc191bmtub3duKSB7CisJCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OworCisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IEFzeW5jIHdyaXRlIHdhaXRzICVkLCBmaW5pc2hlZCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgU1RwLT5uYnJfd2FpdHMsIFNUcC0+bmJyX2ZpbmlzaGVkKTsKKwkJKQorCisJCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCQljbWRbMF0gPSBXUklURV9GSUxFTUFSS1M7CisJCWNtZFs0XSA9IDEgKyBTVHAtPnR3b19mbTsKKworCQlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCBNQVhfV1JJVEVfUkVUUklFUywgMSk7CisJCWlmICghU1JwbnQpIHsKKwkJCXJlc3VsdCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ID09IDAgfHwKKwkJICAgIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSAmJiAhY21kc3RhdHAtPmRlZmVycmVkICYmCisJCSAgICAgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0VPTSkgJiYKKwkJICAgICAoY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gTk9fU0VOU0UgfHwKKwkJICAgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gUkVDT1ZFUkVEX0VSUk9SKSAmJgorCQkgICAgICghY21kc3RhdHAtPnJlbWFpbmRlcl92YWxpZCB8fCBjbWRzdGF0cC0+dXJlbWFpbmRlcjY0ID09IDApKSkgeworCQkJLyogV3JpdGUgc3VjY2Vzc2Z1bCBhdCBFT00gKi8KKwkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJCVNScG50ID0gTlVMTDsKKwkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQkJaWYgKFNUcC0+dHdvX2ZtKQorCQkJCWNyb3NzX2VvZihTVHAsIDApOworCQkJU1Rwcy0+ZW9mID0gU1RfRk07CisJCX0KKwkJZWxzZSB7IC8qIFdyaXRlIGVycm9yICovCisJCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCQlTUnBudCA9IE5VTEw7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBvbiB3cml0ZSBmaWxlbWFyay5cbiIsIG5hbWUpOworCQkJaWYgKHJlc3VsdCA9PSAwKQorCQkJCXJlc3VsdCA9ICgtRUlPKTsKKwkJfQorCisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IEJ1ZmZlciBmbHVzaGVkLCAlZCBFT0Yocykgd3JpdHRlblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBjbWRbNF0pKTsKKwl9IGVsc2UgaWYgKCFTVHAtPnJld19hdF9jbG9zZSkgeworCQlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJCWlmICghU1RtLT5zeXN2IHx8IFNUcHMtPnJ3ICE9IFNUX1JFQURJTkcpIHsKKwkJCWlmIChTVHAtPmNhbl9ic3IpCisJCQkJcmVzdWx0ID0gZmx1c2hfYnVmZmVyKFNUcCwgMCk7CisJCQllbHNlIGlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQkJcmVzdWx0ID0gY3Jvc3NfZW9mKFNUcCwgMCk7CisJCQkJaWYgKHJlc3VsdCkgeworCQkJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQkJCVNUcHMtPmVvZiA9IFNUX0ZNOworCQkJCX0gZWxzZQorCQkJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoU1Rwcy0+ZW9mID09IFNUX05PRU9GICYmCisJCQkgICAgIShyZXN1bHQgPSBjcm9zc19lb2YoU1RwLCAxKSkpIHx8CisJCQkgICBTVHBzLT5lb2YgPT0gU1RfRk1fSElUKSB7CisJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCVNUcHMtPmVvZiA9IFNUX0ZNOworCQl9CisJfQorCisgICAgICBvdXQ6CisJaWYgKFNUcC0+cmV3X2F0X2Nsb3NlKSB7CisJCXJlc3VsdDIgPSBzdF9pbnRfaW9jdGwoU1RwLCBNVFJFVywgMSk7CisJCWlmIChyZXN1bHQgPT0gMCkKKwkJCXJlc3VsdCA9IHJlc3VsdDI7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogQ2xvc2UgdGhlIGRldmljZSBhbmQgcmVsZWFzZSBpdC4gQktMIGlzIG5vdCBuZWVkZWQ6IHRoaXMgaXMgdGhlIG9ubHkgdGhyZWFkCisgICBhY2Nlc3NpbmcgdGhpcyB0YXBlLiAqLworc3RhdGljIGludCBzdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChTVHAtPmRvb3JfbG9ja2VkID09IFNUX0xPQ0tFRF9BVVRPKQorCQlkb19kb29yX2xvY2soU1RwLCAwKTsKKworCW5vcm1hbGl6ZV9idWZmZXIoU1RwLT5idWZmZXIpOworCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJU1RwLT5pbl91c2UgPSAwOworCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwlzY3NpX2RldmljZV9wdXQoU1RwLT5kZXZpY2UpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwwKKy8qIFRoZSBjaGVja3MgY29tbW9uIHRvIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyAqLworc3RhdGljIHNzaXplX3QgcndfY2hlY2tzKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgc3RydWN0IGZpbGUgKmZpbHAsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCisJICogZWxzZSB0cnkgYW5kIHVzZSB0aGlzIGRldmljZS4gIEFsc28sIGlmIGVycm9yIHJlY292ZXJ5IGZhaWxzLCBpdAorCSAqIG1heSB0cnkgYW5kIHRha2UgdGhlIGRldmljZSBvZmZsaW5lLCBpbiB3aGljaCBjYXNlIGFsbCBmdXJ0aGVyCisJICogYWNjZXNzIHRvIHRoZSBkZXZpY2UgaXMgcHJvaGliaXRlZC4KKwkgKi8KKwlpZiAoIXNjc2lfYmxvY2tfd2hlbl9wcm9jZXNzaW5nX2Vycm9ycyhTVHAtPmRldmljZSkpIHsKKwkJcmV0dmFsID0gKC1FTlhJTyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKSB7CisJCWlmIChTVHAtPnJlYWR5ID09IFNUX05PX1RBUEUpCisJCQlyZXR2YWwgPSAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEgU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0uZGVmaW5lZCkgeworCQlyZXR2YWwgPSAoLUVOWElPKTsKKwkJZ290byBvdXQ7CisJfQorCisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhIGJ1cyByZXNldCwgYmxvY2sgZnVydGhlciBhY2Nlc3MKKwkgKiB0byB0aGlzIGRldmljZS4KKwkgKi8KKwlpZiAoU1RwLT5wb3NfdW5rbm93bikgeworCQlyZXR2YWwgPSAoLUVJTyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKKworICAgICAgICBERUIoCisJaWYgKCFTVHAtPmluX3VzZSkgeworCQlwcmludGsoU1RfREVCX01TRyAiJXM6IEluY29ycmVjdCBkZXZpY2UuXG4iLCB0YXBlX25hbWUoU1RwKSk7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfSApIC8qIGVuZCBERUIgKi8KKworCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zICYmCisJICAgIChyZXR2YWwgPSBzd2l0Y2hfcGFydGl0aW9uKFNUcCkpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoU1RwLT5ibG9ja19zaXplID09IDAgJiYgU1RwLT5tYXhfYmxvY2sgPiAwICYmCisJICAgIChjb3VudCA8IFNUcC0+bWluX2Jsb2NrIHx8IGNvdW50ID4gU1RwLT5tYXhfYmxvY2spKSB7CisJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFNUcC0+ZG9fYXV0b19sb2NrICYmIFNUcC0+ZG9vcl9sb2NrZWQgPT0gU1RfVU5MT0NLRUQgJiYKKwkgICAgIWRvX2Rvb3JfbG9jayhTVHAsIDEpKQorCQlTVHAtPmRvb3JfbG9ja2VkID0gU1RfTE9DS0VEX0FVVE87CisKKyBvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgaW50IHNldHVwX2J1ZmZlcmluZyhzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIGludCBpc19yZWFkKQoreworCWludCBpLCBidWZzaXplLCByZXR2YWwgPSAwOworCXN0cnVjdCBzdF9idWZmZXIgKlNUYnAgPSBTVHAtPmJ1ZmZlcjsKKworCWlmIChpc19yZWFkKQorCQlpID0gU1RwLT50cnlfZGlvICYmIHRyeV9yZGlvOworCWVsc2UKKwkJaSA9IFNUcC0+dHJ5X2RpbyAmJiB0cnlfd2RpbzsKKwlpZiAoaSAmJiAoKHVuc2lnbmVkIGxvbmcpYnVmICYgcXVldWVfZG1hX2FsaWdubWVudCgKKwkJCQkJU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUpKSA9PSAwKSB7CisJCWkgPSBzdF9tYXBfdXNlcl9wYWdlcygmKFNUYnAtPnNnWzBdKSwgU1RicC0+dXNlX3NnLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKWJ1ZiwgY291bnQsIChpc19yZWFkID8gUkVBRCA6IFdSSVRFKSwKKwkJCQkgICAgICBTVHAtPm1heF9wZm4pOworCQlpZiAoaSA+IDApIHsKKwkJCVNUYnAtPmRvX2RpbyA9IGk7CisJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSAwOyAgIC8qIGNhbiBiZSB1c2VkIGFzIHRyYW5zZmVyIGNvdW50ZXIgKi8KKwkJfQorCQllbHNlCisJCQlTVGJwLT5kb19kaW8gPSAwOyAgLyogZmFsbCBiYWNrIHRvIGJ1ZmZlcmluZyB3aXRoIGFueSBlcnJvciAqLworCQlTVGJwLT5zZ19zZWdzID0gU1RicC0+ZG9fZGlvOworCQlTVGJwLT5mcnBfc2dfY3VycmVudCA9IDA7CisJCURFQigKKwkJICAgICBpZiAoU1RicC0+ZG9fZGlvKSB7CisJCQlTVHAtPm5icl9kaW8rKzsKKwkJCVNUcC0+bmJyX3BhZ2VzICs9IFNUYnAtPmRvX2RpbzsKKwkJCWZvciAoaT0xOyBpIDwgU1RicC0+ZG9fZGlvOyBpKyspCisJCQkJaWYgKHBhZ2VfdG9fcGZuKFNUYnAtPnNnW2ldLnBhZ2UpID09IHBhZ2VfdG9fcGZuKFNUYnAtPnNnW2ktMV0ucGFnZSkgKyAxKQorCQkJCQlTVHAtPm5icl9jb21iaW5hYmxlKys7CisJCSAgICAgfQorCQkpCisJfSBlbHNlCisJCVNUYnAtPmRvX2RpbyA9IDA7CisJREVCKCBTVHAtPm5icl9yZXF1ZXN0cysrOyApCisKKwlpZiAoIVNUYnAtPmRvX2RpbykgeworCQlpZiAoU1RwLT5ibG9ja19zaXplKQorCQkJYnVmc2l6ZSA9IFNUcC0+YmxvY2tfc2l6ZSA+IHN0X2ZpeGVkX2J1ZmZlcl9zaXplID8KKwkJCQlTVHAtPmJsb2NrX3NpemUgOiBzdF9maXhlZF9idWZmZXJfc2l6ZTsKKwkJZWxzZQorCQkJYnVmc2l6ZSA9IGNvdW50OworCQlpZiAoYnVmc2l6ZSA+IFNUYnAtPmJ1ZmZlcl9zaXplICYmCisJCSAgICAhZW5sYXJnZV9idWZmZXIoU1RicCwgYnVmc2l6ZSwgU1RwLT5yZXN0cl9kbWEpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZSB0YXBlIGJ1ZmZlci5cbiIsCisJCQkgICAgICAgdGFwZV9uYW1lKFNUcCksIGJ1ZnNpemUpOworCQkJcmV0dmFsID0gKC1FT1ZFUkZMT1cpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKFNUcC0+YmxvY2tfc2l6ZSkKKwkJCVNUYnAtPmJ1ZmZlcl9ibG9ja3MgPSBidWZzaXplIC8gU1RwLT5ibG9ja19zaXplOworCX0KKworIG91dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qIENhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgYWZ0ZXIgZWFjaCBzZXR1cF9idWZmZXIoKSAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9idWZmZXJpbmcoc3RydWN0IHNjc2lfdGFwZSAqU1RwKQoreworCXN0cnVjdCBzdF9idWZmZXIgKlNUYnA7CisKKwlTVGJwID0gU1RwLT5idWZmZXI7CisJaWYgKFNUYnAtPmRvX2RpbykgeworCQlzZ2xfdW5tYXBfdXNlcl9wYWdlcygmKFNUYnAtPnNnWzBdKSwgU1RicC0+ZG9fZGlvLCAwKTsKKwkJU1RicC0+ZG9fZGlvID0gMDsKKwl9Cit9CisKKworLyogV3JpdGUgY29tbWFuZCAqLworc3RhdGljIHNzaXplX3QKK3N0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3NpemVfdCB0b3RhbDsKKwlzc2l6ZV90IGksIGRvX2NvdW50LCBibGtzLCB0cmFuc2ZlcjsKKwlzc2l6ZV90IHJldHZhbDsKKwlpbnQgdW5kb25lLCByZXRyeV9lb3QgPSAwLCBzY29kZTsKKwlpbnQgYXN5bmNfd3JpdGU7CisJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJY29uc3QgY2hhciBfX3VzZXIgKmJfcG9pbnQ7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtOworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJlNUcC0+bG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyZXR2YWwgPSByd19jaGVja3MoU1RwLCBmaWxwLCBjb3VudCk7CisJaWYgKHJldHZhbCB8fCBjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIFdyaXRlIG11c3QgYmUgaW50ZWdyYWwgbnVtYmVyIG9mIGJsb2NrcyAqLworCWlmIChTVHAtPmJsb2NrX3NpemUgIT0gMCAmJiAoY291bnQgJSBTVHAtPmJsb2NrX3NpemUpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFdyaXRlIG5vdCBtdWx0aXBsZSBvZiB0YXBlIGJsb2NrIHNpemUuXG4iLAorCQkgICAgICAgbmFtZSk7CisJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJZ290byBvdXQ7CisJfQorCisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCisJaWYgKFNUcC0+d3JpdGVfcHJvdCkgeworCQlyZXR2YWwgPSAoLUVBQ0NFUyk7CisJCWdvdG8gb3V0OworCX0KKworCisJaWYgKFNUcHMtPnJ3ID09IFNUX1JFQURJTkcpIHsKKwkJcmV0dmFsID0gZmx1c2hfYnVmZmVyKFNUcCwgMCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwkJU1Rwcy0+cncgPSBTVF9XUklUSU5HOworCX0gZWxzZSBpZiAoU1Rwcy0+cncgIT0gU1RfV1JJVElORyAmJgorCQkgICBTVHBzLT5kcnZfZmlsZSA9PSAwICYmIFNUcHMtPmRydl9ibG9jayA9PSAwKSB7CisJCWlmICgocmV0dmFsID0gc2V0X21vZGVfZGVuc2JsayhTVHAsIFNUbSkpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlpZiAoU1RtLT5kZWZhdWx0X2NvbXByZXNzaW9uICE9IFNUX0RPTlRfVE9VQ0ggJiYKKwkJICAgICEoU1RwLT5jb21wcmVzc2lvbl9jaGFuZ2VkKSkgeworCQkJaWYgKHN0X2NvbXByZXNzaW9uKFNUcCwgKFNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiA9PSBTVF9ZRVMpKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBzZXQgZGVmYXVsdCBjb21wcmVzc2lvbi5cbiIsCisJCQkJICAgICAgIG5hbWUpOworCQkJCWlmIChtb2Rlc19kZWZpbmVkKSB7CisJCQkJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJU1RicCA9IFNUcC0+YnVmZmVyOworCWkgPSB3cml0ZV9iZWhpbmRfY2hlY2soU1RwKTsKKwlpZiAoaSkgeworCQlpZiAoaSA9PSAtRU5PU1BDKQorCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQllbHNlCisJCQlTVHBzLT5lb2YgPSBTVF9FT01fRVJST1I7CisJfQorCisJaWYgKFNUcHMtPmVvZiA9PSBTVF9FT01fT0spIHsKKwkJU1Rwcy0+ZW9mID0gU1RfRU9EXzE7ICAvKiBhbGxvdyBuZXh0IHdyaXRlICovCisJCXJldHZhbCA9ICgtRU5PU1BDKTsKKwkJZ290byBvdXQ7CisJfQorCWVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9FT01fRVJST1IpIHsKKwkJcmV0dmFsID0gKC1FSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayB0aGUgYnVmZmVyIHJlYWRhYmlsaXR5IGluIGNhc2VzIHdoZXJlIGNvcHlfdXNlciBtaWdodCBjYXRjaAorCSAgIHRoZSBwcm9ibGVtcyBhZnRlciBzb21lIHRhcGUgbW92ZW1lbnQuICovCisJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwICYmCisJICAgICFTVGJwLT5kb19kaW8gJiYKKwkgICAgKGNvcHlfZnJvbV91c2VyKCZpLCBidWYsIDEpICE9IDAgfHwKKwkgICAgIGNvcHlfZnJvbV91c2VyKCZpLCBidWYgKyBjb3VudCAtIDEsIDEpICE9IDApKSB7CisJCXJldHZhbCA9ICgtRUZBVUxUKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dmFsID0gc2V0dXBfYnVmZmVyaW5nKFNUcCwgYnVmLCBjb3VudCwgMCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwl0b3RhbCA9IGNvdW50OworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gV1JJVEVfNjsKKwljbWRbMV0gPSAoU1RwLT5ibG9ja19zaXplICE9IDApOworCisJU1Rwcy0+cncgPSBTVF9XUklUSU5HOworCisJYl9wb2ludCA9IGJ1ZjsKKwl3aGlsZSAoY291bnQgPiAwICYmICFyZXRyeV9lb3QpIHsKKworCQlpZiAoU1RicC0+ZG9fZGlvKSB7CisJCQlkb19jb3VudCA9IGNvdW50OworCQl9CisJCWVsc2UgeworCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQkJCWRvX2NvdW50ID0gY291bnQ7CisJCQllbHNlIHsKKwkJCQlkb19jb3VudCA9IFNUYnAtPmJ1ZmZlcl9ibG9ja3MgKiBTVHAtPmJsb2NrX3NpemUgLQorCQkJCQlTVGJwLT5idWZmZXJfYnl0ZXM7CisJCQkJaWYgKGRvX2NvdW50ID4gY291bnQpCisJCQkJCWRvX2NvdW50ID0gY291bnQ7CisJCQl9CisKKwkJCWkgPSBhcHBlbmRfdG9fYnVmZmVyKGJfcG9pbnQsIFNUYnAsIGRvX2NvdW50KTsKKwkJCWlmIChpKSB7CisJCQkJcmV0dmFsID0gaTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQljb3VudCAtPSBkb19jb3VudDsKKwkJYl9wb2ludCArPSBkb19jb3VudDsKKworCQlhc3luY193cml0ZSA9IFNUcC0+YmxvY2tfc2l6ZSA9PSAwICYmICFTVGJwLT5kb19kaW8gJiYKKwkJCVNUbS0+ZG9fYXN5bmNfd3JpdGVzICYmIFNUcHMtPmVvZiA8IFNUX0VPTV9PSzsKKworCQlpZiAoU1RwLT5ibG9ja19zaXplICE9IDAgJiYgU1RtLT5kb19idWZmZXJfd3JpdGVzICYmCisJCSAgICAhKFNUcC0+dHJ5X2RpbyAmJiB0cnlfd2RpbykgJiYgU1Rwcy0+ZW9mIDwgU1RfRU9NX09LICYmCisJCSAgICBTVGJwLT5idWZmZXJfYnl0ZXMgPCBTVGJwLT5idWZmZXJfc2l6ZSkgeworCQkJU1RwLT5kaXJ0eSA9IDE7CisJCQkvKiBEb24ndCB3cml0ZSBhIGJ1ZmZlciB0aGF0IGlzIG5vdCBmdWxsIGVub3VnaC4gKi8KKwkJCWlmICghYXN5bmNfd3JpdGUgJiYgY291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJcmV0cnlfd3JpdGU6CisJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkKKwkJCWJsa3MgPSB0cmFuc2ZlciA9IGRvX2NvdW50OworCQllbHNlIHsKKwkJCWlmICghU1RicC0+ZG9fZGlvKQorCQkJCWJsa3MgPSBTVGJwLT5idWZmZXJfYnl0ZXM7CisJCQllbHNlCisJCQkJYmxrcyA9IGRvX2NvdW50OworCQkJYmxrcyAvPSBTVHAtPmJsb2NrX3NpemU7CisJCQl0cmFuc2ZlciA9IGJsa3MgKiBTVHAtPmJsb2NrX3NpemU7CisJCX0KKwkJY21kWzJdID0gYmxrcyA+PiAxNjsKKwkJY21kWzNdID0gYmxrcyA+PiA4OworCQljbWRbNF0gPSBibGtzOworCisJCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIHRyYW5zZmVyLCBETUFfVE9fREVWSUNFLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCBNQVhfV1JJVEVfUkVUUklFUywgIWFzeW5jX3dyaXRlKTsKKwkJaWYgKCFTUnBudCkgeworCQkJcmV0dmFsID0gU1RicC0+c3lzY2FsbF9yZXN1bHQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoYXN5bmNfd3JpdGUpIHsKKwkJCVNUYnAtPndyaXRpbmcgPSB0cmFuc2ZlcjsKKwkJCVNUcC0+ZGlydHkgPSAhKFNUYnAtPndyaXRpbmcgPT0KKwkJCQkgICAgICAgU1RicC0+YnVmZmVyX2J5dGVzKTsKKwkJCVNScG50ID0gTlVMTDsgIC8qIFByZXZlbnQgcmVsZWFzaW5nIHRoaXMgcmVxdWVzdCEgKi8KKwkJCURFQiggU1RwLT53cml0ZV9wZW5kaW5nID0gMTsgKQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoU1RicC0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCQkJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBFcnJvciBvbiB3cml0ZTpcbiIsIG5hbWUpKTsKKwkJCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSAmJiAoY21kc3RhdHAtPmZsYWdzICYgU0VOU0VfRU9NKSkgeworCQkJCXNjb2RlID0gY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXk7CisJCQkJaWYgKGNtZHN0YXRwLT5yZW1haW5kZXJfdmFsaWQpCisJCQkJCXVuZG9uZSA9IChpbnQpY21kc3RhdHAtPnVyZW1haW5kZXI2NDsKKwkJCQllbHNlIGlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCAmJgorCQkJCQkgc2NvZGUgPT0gVk9MVU1FX09WRVJGTE9XKQorCQkJCQl1bmRvbmUgPSB0cmFuc2ZlcjsKKwkJCQllbHNlCisJCQkJCXVuZG9uZSA9IDA7CisJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwKQorCQkJCQl1bmRvbmUgKj0gU1RwLT5ibG9ja19zaXplOworCQkJCWlmICh1bmRvbmUgPD0gZG9fY291bnQpIHsKKwkJCQkJLyogT25seSBkYXRhIGZyb20gdGhpcyB3cml0ZSBpcyBub3Qgd3JpdHRlbiAqLworCQkJCQljb3VudCArPSB1bmRvbmU7CisJCQkJCWRvX2NvdW50IC09IHVuZG9uZTsKKwkJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSkKKwkJCQkJCWJsa3MgPSAodHJhbnNmZXIgLSB1bmRvbmUpIC8gU1RwLT5ibG9ja19zaXplOworCQkJCQlTVHBzLT5lb2YgPSBTVF9FT01fT0s7CisJCQkJCS8qIENvbnRpbnVlIGluIGZpeGVkIGJsb2NrIG1vZGUgaWYgYWxsIHdyaXR0ZW4KKwkJCQkJICAgaW4gdGhpcyByZXF1ZXN0IGJ1dCBzdGlsbCBzb21ldGhpbmcgbGVmdCB0byB3cml0ZQorCQkJCQkgICAocmV0dmFsIGxlZnQgdG8gemVybykKKwkJCQkJKi8KKwkJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwIHx8CisJCQkJCSAgICB1bmRvbmUgPiAwIHx8IGNvdW50ID09IDApCisJCQkJCQlyZXR2YWwgPSAoLUVOT1NQQyk7IC8qIEVPTSB3aXRoaW4gY3VycmVudCByZXF1ZXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRU9NIHdpdGggJWQgYnl0ZXMgdW53cml0dGVuLlxuIiwKKwkJCQkJCSAgICAgICBuYW1lLCAoaW50KWNvdW50KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogRU9UIHdpdGhpbiBkYXRhIGJ1ZmZlcmVkIGVhcmxpZXIgKHBvc3NpYmxlIG9ubHkKKwkJCQkJICAgaW4gZml4ZWQgYmxvY2sgbW9kZSB3aXRob3V0IGRpcmVjdCBpL28pICovCisJCQkJCWlmICghcmV0cnlfZW90ICYmICFjbWRzdGF0cC0+ZGVmZXJyZWQgJiYKKwkJCQkJICAgIChzY29kZSA9PSBOT19TRU5TRSB8fCBzY29kZSA9PSBSRUNPVkVSRURfRVJST1IpKSB7CisJCQkJCQltb3ZlX2J1ZmZlcl9kYXRhKFNUcC0+YnVmZmVyLCB0cmFuc2ZlciAtIHVuZG9uZSk7CisJCQkJCQlyZXRyeV9lb3QgPSAxOworCQkJCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKSB7CisJCQkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9ICh0cmFuc2ZlciAtIHVuZG9uZSkgLworCQkJCQkJCQlTVHAtPmJsb2NrX3NpemU7CisJCQkJCQl9CisJCQkJCQlTVHBzLT5lb2YgPSBTVF9FT01fT0s7CisJCQkJCQlERUJDKHByaW50ayhTVF9ERUJfTVNHCisJCQkJCQkJICAgICIlczogUmV0cnkgd3JpdGUgb2YgJWQgYnl0ZXMgYXQgRU9NLlxuIiwKKwkJCQkJCQkgICAgbmFtZSwgU1RwLT5idWZmZXItPmJ1ZmZlcl9ieXRlcykpOworCQkJCQkJZ290byByZXRyeV93cml0ZTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEVpdGhlciBlcnJvciB3aXRoaW4gZGF0YSBidWZmZXJlZCBieSBkcml2ZXIgb3IKKwkJCQkJCSAgIGZhaWxlZCByZXRyeSAqLworCQkJCQkJY291bnQgLT0gZG9fY291bnQ7CisJCQkJCQlibGtzID0gZG9fY291bnQgPSAwOworCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX0VSUk9SOworCQkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsgLyogVG9vIGNhdXRpb3VzPyAqLworCQkJCQkJcmV0dmFsID0gKC1FSU8pOwkvKiBFT00gZm9yIG9sZCBkYXRhICovCisJCQkJCQlERUJDKHByaW50ayhTVF9ERUJfTVNHCisJCQkJCQkJICAgICIlczogRU9NIHdpdGggbG9zdCBkYXRhLlxuIiwKKwkJCQkJCQkgICAgbmFtZSkpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljb3VudCArPSBkb19jb3VudDsKKwkJCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOwkJLyogVG9vIGNhdXRpb3VzPyAqLworCQkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCX0KKworCQl9CisKKwkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKSB7CisJCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IChkb19jb3VudCA+IDApOworCQkJZWxzZQorCQkJCVNUcHMtPmRydl9ibG9jayArPSBibGtzOworCQl9CisKKwkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsKKwkJU1RwLT5kaXJ0eSA9IDA7CisKKwkJaWYgKHJldHZhbCB8fCByZXRyeV9lb3QpIHsKKwkJCWlmIChjb3VudCA8IHRvdGFsKQorCQkJCXJldHZhbCA9IHRvdGFsIC0gY291bnQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChTVHBzLT5lb2YgPT0gU1RfRU9EXzEpCisJCVNUcHMtPmVvZiA9IFNUX0VPTV9PSzsKKwllbHNlIGlmIChTVHBzLT5lb2YgIT0gU1RfRU9NX09LKQorCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwlyZXR2YWwgPSB0b3RhbCAtIGNvdW50OworCisgb3V0OgorCWlmIChTUnBudCAhPSBOVUxMKQorCQlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJcmVsZWFzZV9idWZmZXJpbmcoU1RwKTsKKwl1cCgmU1RwLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisMCisvKiBSZWFkIGRhdGEgZnJvbSB0aGUgdGFwZS4gUmV0dXJucyB6ZXJvIGluIHRoZSBub3JtYWwgY2FzZSwgb25lIGlmIHRoZQorICAgZW9mIHN0YXR1cyBoYXMgY2hhbmdlZCwgYW5kIHRoZSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgYQorICAgZmF0YWwgZXJyb3IuIE90aGVyd2lzZSB1cGRhdGVzIHRoZSBidWZmZXIgYW5kIHRoZSBlb2Ygc3RhdGUuCisKKyAgIERvZXMgcmVsZWFzZSB1c2VyIGJ1ZmZlciBtYXBwaW5nIGlmIGl0IGlzIHNldC4KKyovCitzdGF0aWMgbG9uZyByZWFkX3RhcGUoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBsb25nIGNvdW50LAorCQkgICAgICBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICoqIGFTUnBudCkKK3sKKwlpbnQgdHJhbnNmZXIsIGJsa3MsIGJ5dGVzOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCXN0cnVjdCBzdF9idWZmZXIgKlNUYnA7CisJaW50IHJldHZhbCA9IDA7CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCWlmIChTVHBzLT5lb2YgPT0gU1RfRk1fSElUKQorCQlyZXR1cm4gMTsKKwlTVGJwID0gU1RwLT5idWZmZXI7CisKKwlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCWJsa3MgPSBieXRlcyA9IGNvdW50OworCWVsc2UgeworCQlpZiAoIShTVHAtPnRyeV9kaW8gJiYgdHJ5X3JkaW8pICYmIFNUbS0+ZG9fcmVhZF9haGVhZCkgeworCQkJYmxrcyA9IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ibG9ja3M7CisJCQlieXRlcyA9IGJsa3MgKiBTVHAtPmJsb2NrX3NpemU7CisJCX0gZWxzZSB7CisJCQlieXRlcyA9IGNvdW50OworCQkJaWYgKCFTVGJwLT5kb19kaW8gJiYgYnl0ZXMgPiAoU1RwLT5idWZmZXIpLT5idWZmZXJfc2l6ZSkKKwkJCQlieXRlcyA9IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9zaXplOworCQkJYmxrcyA9IGJ5dGVzIC8gU1RwLT5ibG9ja19zaXplOworCQkJYnl0ZXMgPSBibGtzICogU1RwLT5ibG9ja19zaXplOworCQl9CisJfQorCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gUkVBRF82OworCWNtZFsxXSA9IChTVHAtPmJsb2NrX3NpemUgIT0gMCk7CisJY21kWzJdID0gYmxrcyA+PiAxNjsKKwljbWRbM10gPSBibGtzID4+IDg7CisJY21kWzRdID0gYmxrczsKKworCVNScG50ID0gKmFTUnBudDsKKwlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBieXRlcywgRE1BX0ZST01fREVWSUNFLAorCQkJICAgU1RwLT5kZXZpY2UtPnRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKKwlyZWxlYXNlX2J1ZmZlcmluZyhTVHApOworCSphU1JwbnQgPSBTUnBudDsKKwlpZiAoIVNScG50KQorCQlyZXR1cm4gU1RicC0+c3lzY2FsbF9yZXN1bHQ7CisKKwlTVGJwLT5yZWFkX3BvaW50ZXIgPSAwOworCVNUcHMtPmF0X3NtID0gMDsKKworCS8qIFNvbWV0aGluZyB0byBjaGVjayAqLworCWlmIChTVGJwLT5zeXNjYWxsX3Jlc3VsdCkgeworCQlzdHJ1Y3Qgc3RfY21kc3RhdHVzICpjbWRzdGF0cCA9ICZTVHAtPmJ1ZmZlci0+Y21kc3RhdDsKKworCQlyZXR2YWwgPSAxOworCQlERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogU2Vuc2U6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzBdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNScG50LT5zcl9zZW5zZV9idWZmZXJbMl0sIFNScG50LT5zcl9zZW5zZV9idWZmZXJbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls0XSwgU1JwbnQtPnNyX3NlbnNlX2J1ZmZlcls1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzZdLCBTUnBudC0+c3Jfc2Vuc2VfYnVmZmVyWzddKSk7CisJCWlmIChjbWRzdGF0cC0+aGF2ZV9zZW5zZSkgeworCisJCQlpZiAoY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gQkxBTktfQ0hFQ0spCisJCQkJY21kc3RhdHAtPmZsYWdzICY9IDB4Y2Y7CS8qIE5vIG5lZWQgZm9yIEVPTSBpbiB0aGlzIGNhc2UgKi8KKworCQkJaWYgKGNtZHN0YXRwLT5mbGFncyAhPSAwKSB7IC8qIEVPRiwgRU9NLCBvciBJTEkgKi8KKwkJCQkvKiBDb21wdXRlIHRoZSByZXNpZHVhbCBjb3VudCAqLworCQkJCWlmIChjbWRzdGF0cC0+cmVtYWluZGVyX3ZhbGlkKQorCQkJCQl0cmFuc2ZlciA9IChpbnQpY21kc3RhdHAtPnVyZW1haW5kZXI2NDsKKwkJCQllbHNlCisJCQkJCXRyYW5zZmVyID0gMDsKKwkJCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDAgJiYKKwkJCQkgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gTUVESVVNX0VSUk9SKQorCQkJCQl0cmFuc2ZlciA9IGJ5dGVzOworCisJCQkJaWYgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0lMSSkgewkvKiBJTEkgKi8KKwkJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKSB7CisJCQkJCQlpZiAodHJhbnNmZXIgPD0gMCkgeworCQkJCQkJCWlmICh0cmFuc2ZlciA8IDApCisJCQkJCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCQkJCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gcmVhZCAlZCBieXRlIGJsb2NrIHdpdGggJWQgYnl0ZSB0cmFuc2Zlci5cbiIsCisJCQkJCQkJCSAgICAgICBuYW1lLCBieXRlcyAtIHRyYW5zZmVyLCBieXRlcyk7CisJCQkJCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKQorCQkJCQkJCQlTVHBzLT5kcnZfYmxvY2sgKz0gMTsKKwkJCQkJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSAwOworCQkJCQkJCXJldHVybiAoLUVOT01FTSk7CisJCQkJCQl9CisJCQkJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSBieXRlcyAtIHRyYW5zZmVyOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQkJCQkJU1JwbnQgPSAqYVNScG50ID0gTlVMTDsKKwkJCQkJCWlmICh0cmFuc2ZlciA9PSBibGtzKSB7CS8qIFdlIGRpZCBub3QgZ2V0IGFueXRoaW5nLCBlcnJvciAqLworCQkJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEluY29ycmVjdCBibG9jayBzaXplLlxuIiwgbmFtZSk7CisJCQkJCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKQorCQkJCQkJCQlTVHBzLT5kcnZfYmxvY2sgKz0gYmxrcyAtIHRyYW5zZmVyICsgMTsKKwkJCQkJCQlzdF9pbnRfaW9jdGwoU1RwLCBNVEJTUiwgMSk7CisJCQkJCQkJcmV0dXJuICgtRUlPKTsKKwkJCQkJCX0KKwkJCQkJCS8qIFdlIGhhdmUgc29tZSBkYXRhLCBkZWxpdmVyIGl0ICovCisJCQkJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSAoYmxrcyAtIHRyYW5zZmVyKSAqCisJCQkJCQkgICAgU1RwLT5ibG9ja19zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBJTEkgYnV0IGVub3VnaCBkYXRhIHJlY2VpdmVkICVsZCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBjb3VudCwgU1RicC0+YnVmZmVyX2J5dGVzKSk7CisJCQkJCQlpZiAoU1Rwcy0+ZHJ2X2Jsb2NrID49IDApCisJCQkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrICs9IDE7CisJCQkJCQlpZiAoc3RfaW50X2lvY3RsKFNUcCwgTVRCU1IsIDEpKQorCQkJCQkJCXJldHVybiAoLUVJTyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0ZNSykgewkvKiBGTSBvdmVycmlkZXMgRU9NICovCisJCQkJCWlmIChTVHBzLT5lb2YgIT0gU1RfRk1fSElUKQorCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRk1fSElUOworCQkJCQllbHNlCisJCQkJCQlTVHBzLT5lb2YgPSBTVF9FT0RfMjsKKwkJCQkJaWYgKFNUcC0+YmxvY2tfc2l6ZSA9PSAwKQorCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsKKwkJCQkJZWxzZQorCQkJCQkJU1RicC0+YnVmZmVyX2J5dGVzID0KKwkJCQkJCSAgICBieXRlcyAtIHRyYW5zZmVyICogU1RwLT5ibG9ja19zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEVPRiBkZXRlY3RlZCAoJWQgYnl0ZXMgcmVhZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIFNUYnAtPmJ1ZmZlcl9ieXRlcykpOworCQkJCX0gZWxzZSBpZiAoY21kc3RhdHAtPmZsYWdzICYgU0VOU0VfRU9NKSB7CisJCQkJCWlmIChTVHBzLT5lb2YgPT0gU1RfRk0pCisJCQkJCQlTVHBzLT5lb2YgPSBTVF9FT0RfMTsKKwkJCQkJZWxzZQorCQkJCQkJU1Rwcy0+ZW9mID0gU1RfRU9NX09LOworCQkJCQlpZiAoU1RwLT5ibG9ja19zaXplID09IDApCisJCQkJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSBieXRlcyAtIHRyYW5zZmVyOworCQkJCQllbHNlCisJCQkJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPQorCQkJCQkJICAgIGJ5dGVzIC0gdHJhbnNmZXIgKiBTVHAtPmJsb2NrX3NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogRU9NIGRldGVjdGVkICglZCBieXRlcyByZWFkKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgU1RicC0+YnVmZmVyX2J5dGVzKSk7CisJCQkJfQorCQkJfQorCQkJLyogZW5kIG9mIEVPRiwgRU9NLCBJTEkgdGVzdCAqLyAKKwkJCWVsc2UgewkvKiBub256ZXJvIHNlbnNlIGtleSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogVGFwZSBlcnJvciB3aGlsZSByZWFkaW5nLlxuIiwgbmFtZSkpOworCQkJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCQkJaWYgKFNUcHMtPmVvZiA9PSBTVF9GTSAmJgorCQkJCSAgICBjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBCTEFOS19DSEVDSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFplcm8gcmV0dXJuZWQgZm9yIGZpcnN0IEJMQU5LIENIRUNLIGFmdGVyIEVPRi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOworCQkJCQlTVHBzLT5lb2YgPSBTVF9FT0RfMjsJLyogRmlyc3QgQkxBTktfQ0hFQ0sgYWZ0ZXIgRk0gKi8KKwkJCQl9IGVsc2UJLyogU29tZSBvdGhlciBleHRlbmRlZCBzZW5zZSBjb2RlICovCisJCQkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCX0KKworCQkJaWYgKFNUYnAtPmJ1ZmZlcl9ieXRlcyA8IDApICAvKiBDYXVzZWQgYnkgYm9ndXMgc2Vuc2UgZGF0YSAqLworCQkJCVNUYnAtPmJ1ZmZlcl9ieXRlcyA9IDA7CisJCX0KKwkJLyogRW5kIG9mIGV4dGVuZGVkIHNlbnNlIHRlc3QgKi8gCisJCWVsc2UgewkJLyogTm9uLWV4dGVuZGVkIHNlbnNlICovCisJCQlyZXR2YWwgPSBTVGJwLT5zeXNjYWxsX3Jlc3VsdDsKKwkJfQorCisJfQorCS8qIEVuZCBvZiBlcnJvciBoYW5kbGluZyAqLyAKKwllbHNlCQkJLyogUmVhZCBzdWNjZXNzZnVsICovCisJCVNUYnAtPmJ1ZmZlcl9ieXRlcyA9IGJ5dGVzOworCisJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKSB7CisJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkKKwkJCVNUcHMtPmRydl9ibG9jaysrOworCQllbHNlCisJCQlTVHBzLT5kcnZfYmxvY2sgKz0gU1RicC0+YnVmZmVyX2J5dGVzIC8gU1RwLT5ibG9ja19zaXplOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorDAorCisvKiBSZWFkIGNvbW1hbmQgKi8KK3N0YXRpYyBzc2l6ZV90CitzdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3NpemVfdCB0b3RhbDsKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisJc3NpemVfdCBpLCB0cmFuc2ZlcjsKKwlpbnQgc3BlY2lhbCwgZG9fZGlvID0gMDsKKwlzdHJ1Y3Qgc2NzaV9yZXF1ZXN0ICpTUnBudCA9IE5VTEw7CisJc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCXN0cnVjdCBzdF9idWZmZXIgKlNUYnAgPSBTVHAtPmJ1ZmZlcjsKKwlERUIoIGNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsgKQorCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmU1RwLT5sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXJldHZhbCA9IHJ3X2NoZWNrcyhTVHAsIGZpbHAsIGNvdW50KTsKKwlpZiAocmV0dmFsIHx8IGNvdW50ID09IDApCisJCWdvdG8gb3V0OworCisJU1RtID0gJihTVHAtPm1vZGVzW1NUcC0+Y3VycmVudF9tb2RlXSk7CisJaWYgKCEoU1RtLT5kb19yZWFkX2FoZWFkKSAmJiBTVHAtPmJsb2NrX3NpemUgIT0gMCAmJgorCSAgICAoY291bnQgJSBTVHAtPmJsb2NrX3NpemUpICE9IDApIHsKKwkJcmV0dmFsID0gKC1FSU5WQUwpOwkvKiBSZWFkIG11c3QgYmUgaW50ZWdyYWwgbnVtYmVyIG9mIGJsb2NrcyAqLworCQlnb3RvIG91dDsKKwl9CisKKwlTVHBzID0gJihTVHAtPnBzW1NUcC0+cGFydGl0aW9uXSk7CisJaWYgKFNUcHMtPnJ3ID09IFNUX1dSSVRJTkcpIHsKKwkJcmV0dmFsID0gZmx1c2hfYnVmZmVyKFNUcCwgMCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwkJU1Rwcy0+cncgPSBTVF9SRUFESU5HOworCX0KKyAgICAgICAgREVCKAorCWlmIChkZWJ1Z2dpbmcgJiYgU1Rwcy0+ZW9mICE9IFNUX05PRU9GKQorCQlwcmludGsoU1RfREVCX01TRyAiJXM6IEVPRi9FT00gZmxhZyB1cCAoJWQpLiBCeXRlcyAlZFxuIiwgbmFtZSwKKwkJICAgICAgIFNUcHMtPmVvZiwgU1RicC0+YnVmZmVyX2J5dGVzKTsKKyAgICAgICAgKSAvKiBlbmQgREVCICovCisKKwlyZXR2YWwgPSBzZXR1cF9idWZmZXJpbmcoU1RwLCBidWYsIGNvdW50LCAxKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKwlkb19kaW8gPSBTVGJwLT5kb19kaW87CisKKwlpZiAoU1RicC0+YnVmZmVyX2J5dGVzID09IDAgJiYKKwkgICAgU1Rwcy0+ZW9mID49IFNUX0VPRF8xKSB7CisJCWlmIChTVHBzLT5lb2YgPCBTVF9FT0QpIHsKKwkJCVNUcHMtPmVvZiArPSAxOworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldHZhbCA9ICgtRUlPKTsJLyogRU9NIG9yIEJsYW5rIENoZWNrICovCisJCWdvdG8gb3V0OworCX0KKworCWlmIChkb19kaW8pIHsKKwkJLyogQ2hlY2sgdGhlIGJ1ZmZlciB3cml0YWJpbGl0eSBiZWZvcmUgYW55IHRhcGUgbW92ZW1lbnQuIERvbid0IGFsdGVyCisJCSAgIGJ1ZmZlciBkYXRhLiAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJmksIGJ1ZiwgMSkgIT0gMCB8fAorCQkgICAgY29weV90b191c2VyKGJ1ZiwgJmksIDEpICE9IDAgfHwKKwkJICAgIGNvcHlfZnJvbV91c2VyKCZpLCBidWYgKyBjb3VudCAtIDEsIDEpICE9IDAgfHwKKwkJICAgIGNvcHlfdG9fdXNlcihidWYgKyBjb3VudCAtIDEsICZpLCAxKSAhPSAwKSB7CisJCQlyZXR2YWwgPSAoLUVGQVVMVCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCVNUcHMtPnJ3ID0gU1RfUkVBRElORzsKKworCisJLyogTG9vcCB1bnRpbCBlbm91Z2ggZGF0YSBpbiBidWZmZXIgb3IgYSBzcGVjaWFsIGNvbmRpdGlvbiBmb3VuZCAqLworCWZvciAodG90YWwgPSAwLCBzcGVjaWFsID0gMDsgdG90YWwgPCBjb3VudCAmJiAhc3BlY2lhbDspIHsKKworCQkvKiBHZXQgbmV3IGRhdGEgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSAqLworCQlpZiAoU1RicC0+YnVmZmVyX2J5dGVzID09IDApIHsKKwkJCXNwZWNpYWwgPSByZWFkX3RhcGUoU1RwLCBjb3VudCAtIHRvdGFsLCAmU1JwbnQpOworCQkJaWYgKHNwZWNpYWwgPCAwKSB7CS8qIE5vIG5lZWQgdG8gY29udGludWUgcmVhZCAqLworCQkJCXJldHZhbCA9IHNwZWNpYWw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKiBNb3ZlIHRoZSBkYXRhIGZyb20gZHJpdmVyIGJ1ZmZlciB0byB1c2VyIGJ1ZmZlciAqLworCQlpZiAoU1RicC0+YnVmZmVyX2J5dGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgREVCKAorCQkJaWYgKGRlYnVnZ2luZyAmJiBTVHBzLT5lb2YgIT0gU1RfTk9FT0YpCisJCQkJcHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRU9GIHVwICglZCkuIExlZnQgJWQsIG5lZWRlZCAlZC5cbiIsIG5hbWUsCisJCQkJICAgICAgIFNUcHMtPmVvZiwgU1RicC0+YnVmZmVyX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoY291bnQgLSB0b3RhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKSAvKiBlbmQgREVCICovCisJCQl0cmFuc2ZlciA9IFNUYnAtPmJ1ZmZlcl9ieXRlcyA8IGNvdW50IC0gdG90YWwgPworCQkJICAgIFNUYnAtPmJ1ZmZlcl9ieXRlcyA6IGNvdW50IC0gdG90YWw7CisJCQlpZiAoIWRvX2RpbykgeworCQkJCWkgPSBmcm9tX2J1ZmZlcihTVGJwLCBidWYsIHRyYW5zZmVyKTsKKwkJCQlpZiAoaSkgeworCQkJCQlyZXR2YWwgPSBpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlidWYgKz0gdHJhbnNmZXI7CisJCQl0b3RhbCArPSB0cmFuc2ZlcjsKKwkJfQorCisJCWlmIChTVHAtPmJsb2NrX3NpemUgPT0gMCkKKwkJCWJyZWFrOwkvKiBSZWFkIG9ubHkgb25lIHZhcmlhYmxlIGxlbmd0aCBibG9jayAqLworCisJfQkJCS8qIGZvciAodG90YWwgPSAwLCBzcGVjaWFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgPCBjb3VudCAmJiAhc3BlY2lhbDsgKSAqLworCisJLyogQ2hhbmdlIHRoZSBlb2Ygc3RhdGUgaWYgbm8gZGF0YSBmcm9tIHRhcGUgb3IgYnVmZmVyICovCisJaWYgKHRvdGFsID09IDApIHsKKwkJaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJCVNUcHMtPmVvZiA9IFNUX0ZNOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCVNUcHMtPmRydl9maWxlKys7CisJCX0gZWxzZSBpZiAoU1Rwcy0+ZW9mID09IFNUX0VPRF8xKSB7CisJCQlTVHBzLT5lb2YgPSBTVF9FT0RfMjsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSsrOworCQl9IGVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9FT0RfMikKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKwl9IGVsc2UgaWYgKFNUcHMtPmVvZiA9PSBTVF9GTSkKKwkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJcmV0dmFsID0gdG90YWw7CisKKyBvdXQ6CisJaWYgKFNScG50ICE9IE5VTEwpIHsKKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlTUnBudCA9IE5VTEw7CisJfQorCWlmIChkb19kaW8pIHsKKwkJcmVsZWFzZV9idWZmZXJpbmcoU1RwKTsKKwkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsKKwl9CisJdXAoJlNUcC0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorDAorCisKK0RFQigKKy8qIFNldCB0aGUgZHJpdmVyIG9wdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHN0X2xvZ19vcHRpb25zKHN0cnVjdCBzY3NpX3RhcGUgKiBTVHAsIHN0cnVjdCBzdF9tb2RlZGVmICogU1RtLCBjaGFyICpuYW1lKQoreworCWlmIChkZWJ1Z2dpbmcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiBNb2RlICVkIG9wdGlvbnM6IGJ1ZmZlciB3cml0ZXM6ICVkLCBhc3luYyB3cml0ZXM6ICVkLCByZWFkIGFoZWFkOiAlZFxuIiwKKwkJICAgICAgIG5hbWUsIFNUcC0+Y3VycmVudF9tb2RlLCBTVG0tPmRvX2J1ZmZlcl93cml0ZXMsIFNUbS0+ZG9fYXN5bmNfd3JpdGVzLAorCQkgICAgICAgU1RtLT5kb19yZWFkX2FoZWFkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiAgICBjYW4gYnNyOiAlZCwgdHdvIEZNczogJWQsIGZhc3QgbXRlb206ICVkLCBhdXRvIGxvY2s6ICVkLFxuIiwKKwkJICAgICAgIG5hbWUsIFNUcC0+Y2FuX2JzciwgU1RwLT50d29fZm0sIFNUcC0+ZmFzdF9tdGVvbSwgU1RwLT5kb19hdXRvX2xvY2spOworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6ICAgIGRlZnMgZm9yIHdyOiAlZCwgbm8gYmxvY2sgbGltaXRzOiAlZCwgcGFydGl0aW9uczogJWQsIHMyIGxvZzogJWRcbiIsCisJCSAgICAgICBuYW1lLCBTVG0tPmRlZmF1bHRzX2Zvcl93cml0ZXMsIFNUcC0+b21pdF9ibGtsaW1zLCBTVHAtPmNhbl9wYXJ0aXRpb25zLAorCQkgICAgICAgU1RwLT5zY3NpMl9sb2dpY2FsKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiAgICBzeXN2OiAlZCBub3dhaXQ6ICVkXG4iLCBuYW1lLCBTVG0tPnN5c3YsIFNUcC0+aW1tZWRpYXRlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAgIGRlYnVnZ2luZzogJWRcbiIsCisJCSAgICAgICBuYW1lLCBkZWJ1Z2dpbmcpOworCX0KK30KKwkpCisKKworc3RhdGljIGludCBzdF9zZXRfb3B0aW9ucyhzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGxvbmcgb3B0aW9ucykKK3sKKwlpbnQgdmFsdWU7CisJbG9uZyBjb2RlOworCXN0cnVjdCBzdF9tb2RlZGVmICpTVG07CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCXN0cnVjdCBjZGV2ICpjZDAsICpjZDE7CisKKwlTVG0gPSAmKFNUcC0+bW9kZXNbU1RwLT5jdXJyZW50X21vZGVdKTsKKwlpZiAoIVNUbS0+ZGVmaW5lZCkgeworCQljZDAgPSBTVG0tPmNkZXZzWzBdOyBjZDEgPSBTVG0tPmNkZXZzWzFdOworCQltZW1jcHkoU1RtLCAmKFNUcC0+bW9kZXNbMF0pLCBzaXplb2Yoc3RydWN0IHN0X21vZGVkZWYpKTsKKwkJU1RtLT5jZGV2c1swXSA9IGNkMDsgU1RtLT5jZGV2c1sxXSA9IGNkMTsKKwkJbW9kZXNfZGVmaW5lZCA9IDE7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogSW5pdGlhbGl6ZWQgbW9kZSAlZCBkZWZpbml0aW9uIGZyb20gbW9kZSAwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIFNUcC0+Y3VycmVudF9tb2RlKSk7CisJfQorCisJY29kZSA9IG9wdGlvbnMgJiBNVF9TVF9PUFRJT05TOworCWlmIChjb2RlID09IE1UX1NUX0JPT0xFQU5TKSB7CisJCVNUbS0+ZG9fYnVmZmVyX3dyaXRlcyA9IChvcHRpb25zICYgTVRfU1RfQlVGRkVSX1dSSVRFUykgIT0gMDsKKwkJU1RtLT5kb19hc3luY193cml0ZXMgPSAob3B0aW9ucyAmIE1UX1NUX0FTWU5DX1dSSVRFUykgIT0gMDsKKwkJU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzID0gKG9wdGlvbnMgJiBNVF9TVF9ERUZfV1JJVEVTKSAhPSAwOworCQlTVG0tPmRvX3JlYWRfYWhlYWQgPSAob3B0aW9ucyAmIE1UX1NUX1JFQURfQUhFQUQpICE9IDA7CisJCVNUcC0+dHdvX2ZtID0gKG9wdGlvbnMgJiBNVF9TVF9UV09fRk0pICE9IDA7CisJCVNUcC0+ZmFzdF9tdGVvbSA9IChvcHRpb25zICYgTVRfU1RfRkFTVF9NVEVPTSkgIT0gMDsKKwkJU1RwLT5kb19hdXRvX2xvY2sgPSAob3B0aW9ucyAmIE1UX1NUX0FVVE9fTE9DSykgIT0gMDsKKwkJU1RwLT5jYW5fYnNyID0gKG9wdGlvbnMgJiBNVF9TVF9DQU5fQlNSKSAhPSAwOworCQlTVHAtPm9taXRfYmxrbGltcyA9IChvcHRpb25zICYgTVRfU1RfTk9fQkxLTElNUykgIT0gMDsKKwkJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPj0gU0NTSV8yKQorCQkJU1RwLT5jYW5fcGFydGl0aW9ucyA9IChvcHRpb25zICYgTVRfU1RfQ0FOX1BBUlRJVElPTlMpICE9IDA7CisJCVNUcC0+c2NzaTJfbG9naWNhbCA9IChvcHRpb25zICYgTVRfU1RfU0NTSTJMT0dJQ0FMKSAhPSAwOworCQlTVHAtPmltbWVkaWF0ZSA9IChvcHRpb25zICYgTVRfU1RfTk9XQUlUKSAhPSAwOworCQlTVG0tPnN5c3YgPSAob3B0aW9ucyAmIE1UX1NUX1NZU1YpICE9IDA7CisJCURFQiggZGVidWdnaW5nID0gKG9wdGlvbnMgJiBNVF9TVF9ERUJVR0dJTkcpICE9IDA7CisJCSAgICAgc3RfbG9nX29wdGlvbnMoU1RwLCBTVG0sIG5hbWUpOyApCisJfSBlbHNlIGlmIChjb2RlID09IE1UX1NUX1NFVEJPT0xFQU5TIHx8IGNvZGUgPT0gTVRfU1RfQ0xFQVJCT09MRUFOUykgeworCQl2YWx1ZSA9IChjb2RlID09IE1UX1NUX1NFVEJPT0xFQU5TKTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfQlVGRkVSX1dSSVRFUykgIT0gMCkKKwkJCVNUbS0+ZG9fYnVmZmVyX3dyaXRlcyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9BU1lOQ19XUklURVMpICE9IDApCisJCQlTVG0tPmRvX2FzeW5jX3dyaXRlcyA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9ERUZfV1JJVEVTKSAhPSAwKQorCQkJU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX1JFQURfQUhFQUQpICE9IDApCisJCQlTVG0tPmRvX3JlYWRfYWhlYWQgPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfVFdPX0ZNKSAhPSAwKQorCQkJU1RwLT50d29fZm0gPSB2YWx1ZTsKKwkJaWYgKChvcHRpb25zICYgTVRfU1RfRkFTVF9NVEVPTSkgIT0gMCkKKwkJCVNUcC0+ZmFzdF9tdGVvbSA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9BVVRPX0xPQ0spICE9IDApCisJCQlTVHAtPmRvX2F1dG9fbG9jayA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9DQU5fQlNSKSAhPSAwKQorCQkJU1RwLT5jYW5fYnNyID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX05PX0JMS0xJTVMpICE9IDApCisJCQlTVHAtPm9taXRfYmxrbGltcyA9IHZhbHVlOworCQlpZiAoKFNUcC0+ZGV2aWNlKS0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIgJiYKKwkJICAgIChvcHRpb25zICYgTVRfU1RfQ0FOX1BBUlRJVElPTlMpICE9IDApCisJCQlTVHAtPmNhbl9wYXJ0aXRpb25zID0gdmFsdWU7CisJCWlmICgob3B0aW9ucyAmIE1UX1NUX1NDU0kyTE9HSUNBTCkgIT0gMCkKKwkJCVNUcC0+c2NzaTJfbG9naWNhbCA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9OT1dBSVQpICE9IDApCisJCQlTVHAtPmltbWVkaWF0ZSA9IHZhbHVlOworCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9TWVNWKSAhPSAwKQorCQkJU1RtLT5zeXN2ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgREVCKAorCQlpZiAoKG9wdGlvbnMgJiBNVF9TVF9ERUJVR0dJTkcpICE9IDApCisJCQlkZWJ1Z2dpbmcgPSB2YWx1ZTsKKwkJCXN0X2xvZ19vcHRpb25zKFNUcCwgU1RtLCBuYW1lKTsgKQorCX0gZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9XUklURV9USFJFU0hPTEQpIHsKKwkJLyogUmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KKwl9IGVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfREVGX0JMS1NJWkUpIHsKKwkJdmFsdWUgPSAob3B0aW9ucyAmIH5NVF9TVF9PUFRJT05TKTsKKwkJaWYgKHZhbHVlID09IH5NVF9TVF9PUFRJT05TKSB7CisJCQlTVG0tPmRlZmF1bHRfYmxrc2l6ZSA9ICgtMSk7CisJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogRGVmYXVsdCBibG9jayBzaXplIGRpc2FibGVkLlxuIiwgbmFtZSkpOworCQl9IGVsc2UgeworCQkJU1RtLT5kZWZhdWx0X2Jsa3NpemUgPSB2YWx1ZTsKKwkJCURFQkMoIHByaW50ayhLRVJOX0lORk8gIiVzOiBEZWZhdWx0IGJsb2NrIHNpemUgc2V0IHRvICVkIGJ5dGVzLlxuIiwKKwkJCSAgICAgICBuYW1lLCBTVG0tPmRlZmF1bHRfYmxrc2l6ZSkpOworCQkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfUkVBRFkpIHsKKwkJCQlTVHAtPmJsa3NpemVfY2hhbmdlZCA9IDA7CisJCQkJc2V0X21vZGVfZGVuc2JsayhTVHAsIFNUbSk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfVElNRU9VVFMpIHsKKwkJdmFsdWUgPSAob3B0aW9ucyAmIH5NVF9TVF9PUFRJT05TKTsKKwkJaWYgKCh2YWx1ZSAmIE1UX1NUX1NFVF9MT05HX1RJTUVPVVQpICE9IDApIHsKKwkJCVNUcC0+bG9uZ190aW1lb3V0ID0gKHZhbHVlICYgfk1UX1NUX1NFVF9MT05HX1RJTUVPVVQpICogSFo7CisJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogTG9uZyB0aW1lb3V0IHNldCB0byAlZCBzZWNvbmRzLlxuIiwgbmFtZSwKKwkJCSAgICAgICAodmFsdWUgJiB+TVRfU1RfU0VUX0xPTkdfVElNRU9VVCkpKTsKKwkJfSBlbHNlIHsKKwkJCVNUcC0+ZGV2aWNlLT50aW1lb3V0ID0gdmFsdWUgKiBIWjsKKwkJCURFQkMoIHByaW50ayhLRVJOX0lORk8gIiVzOiBOb3JtYWwgdGltZW91dCBzZXQgdG8gJWQgc2Vjb25kcy5cbiIsCisJCQkJbmFtZSwgdmFsdWUpICk7CisJCX0KKwl9IGVsc2UgaWYgKGNvZGUgPT0gTVRfU1RfU0VUX0NMTikgeworCQl2YWx1ZSA9IChvcHRpb25zICYgfk1UX1NUX09QVElPTlMpICYgMHhmZjsKKwkJaWYgKHZhbHVlICE9IDAgJiYKKwkJICAgIHZhbHVlIDwgRVhURU5ERURfU0VOU0VfU1RBUlQgJiYgdmFsdWUgPj0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFKQorCQkJcmV0dXJuICgtRUlOVkFMKTsKKwkJU1RwLT5jbG5fbW9kZSA9IHZhbHVlOworCQlTVHAtPmNsbl9zZW5zZV9tYXNrID0gKG9wdGlvbnMgPj4gOCkgJiAweGZmOworCQlTVHAtPmNsbl9zZW5zZV92YWx1ZSA9IChvcHRpb25zID4+IDE2KSAmIDB4ZmY7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogQ2xlYW5pbmcgcmVxdWVzdCBtb2RlICVkLCBtYXNrICUwMngsIHZhbHVlICUwMnhcbiIsCisJCSAgICAgICBuYW1lLCB2YWx1ZSwgU1RwLT5jbG5fc2Vuc2VfbWFzaywgU1RwLT5jbG5fc2Vuc2VfdmFsdWUpOworCX0gZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9ERUZfT1BUSU9OUykgeworCQljb2RlID0gKG9wdGlvbnMgJiB+TVRfU1RfQ0xFQVJfREVGQVVMVCk7CisJCXZhbHVlID0gKG9wdGlvbnMgJiBNVF9TVF9DTEVBUl9ERUZBVUxUKTsKKwkJaWYgKGNvZGUgPT0gTVRfU1RfREVGX0RFTlNJVFkpIHsKKwkJCWlmICh2YWx1ZSA9PSBNVF9TVF9DTEVBUl9ERUZBVUxUKSB7CisJCQkJU1RtLT5kZWZhdWx0X2RlbnNpdHkgPSAoLTEpOworCQkJCURFQkMoIHByaW50ayhLRVJOX0lORk8gIiVzOiBEZW5zaXR5IGRlZmF1bHQgZGlzYWJsZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOworCQkJfSBlbHNlIHsKKwkJCQlTVG0tPmRlZmF1bHRfZGVuc2l0eSA9IHZhbHVlICYgMHhmZjsKKwkJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPICIlczogRGVuc2l0eSBkZWZhdWx0IHNldCB0byAleFxuIiwKKwkJCQkgICAgICAgbmFtZSwgU1RtLT5kZWZhdWx0X2RlbnNpdHkpKTsKKwkJCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9SRUFEWSkgeworCQkJCQlTVHAtPmRlbnNpdHlfY2hhbmdlZCA9IDA7CisJCQkJCXNldF9tb2RlX2RlbnNibGsoU1RwLCBTVG0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChjb2RlID09IE1UX1NUX0RFRl9EUlZCVUZGRVIpIHsKKwkJCWlmICh2YWx1ZSA9PSBNVF9TVF9DTEVBUl9ERUZBVUxUKSB7CisJCQkJU1RwLT5kZWZhdWx0X2RydmJ1ZmZlciA9IDB4ZmY7CisJCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBEcml2ZSBidWZmZXIgZGVmYXVsdCBkaXNhYmxlZC5cbiIsIG5hbWUpKTsKKwkJCX0gZWxzZSB7CisJCQkJU1RwLT5kZWZhdWx0X2RydmJ1ZmZlciA9IHZhbHVlICYgNzsKKwkJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IERyaXZlIGJ1ZmZlciBkZWZhdWx0IHNldCB0byAleFxuIiwKKwkJCQkgICAgICAgbmFtZSwgU1RwLT5kZWZhdWx0X2RydmJ1ZmZlcikpOworCQkJCWlmIChTVHAtPnJlYWR5ID09IFNUX1JFQURZKQorCQkJCQlzdF9pbnRfaW9jdGwoU1RwLCBNVFNFVERSVkJVRkZFUiwgU1RwLT5kZWZhdWx0X2RydmJ1ZmZlcik7CisJCQl9CisJCX0gZWxzZSBpZiAoY29kZSA9PSBNVF9TVF9ERUZfQ09NUFJFU1NJT04pIHsKKwkJCWlmICh2YWx1ZSA9PSBNVF9TVF9DTEVBUl9ERUZBVUxUKSB7CisJCQkJU1RtLT5kZWZhdWx0X2NvbXByZXNzaW9uID0gU1RfRE9OVF9UT1VDSDsKKwkJCQlERUJDKCBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENvbXByZXNzaW9uIGRlZmF1bHQgZGlzYWJsZWQuXG4iLCBuYW1lKSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgodmFsdWUgJiAweGZmMDApICE9IDApIHsKKwkJCQkJU1RwLT5jX2FsZ28gPSAodmFsdWUgJiAweGZmMDApID4+IDg7CisJCQkJCURFQkMoIHByaW50ayhLRVJOX0lORk8gIiVzOiBDb21wcmVzc2lvbiBhbGdvcml0aG0gc2V0IHRvIDB4JXguXG4iLAorCQkJCQkgICAgICAgbmFtZSwgU1RwLT5jX2FsZ28pKTsKKwkJCQl9CisJCQkJaWYgKCh2YWx1ZSAmIDB4ZmYpICE9IDB4ZmYpIHsKKwkJCQkJU1RtLT5kZWZhdWx0X2NvbXByZXNzaW9uID0gKHZhbHVlICYgMSA/IFNUX1lFUyA6IFNUX05PKTsKKwkJCQkJREVCQyggcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbXByZXNzaW9uIGRlZmF1bHQgc2V0IHRvICV4XG4iLAorCQkJCQkgICAgICAgbmFtZSwgKHZhbHVlICYgMSkpKTsKKwkJCQkJaWYgKFNUcC0+cmVhZHkgPT0gU1RfUkVBRFkpIHsKKwkJCQkJCVNUcC0+Y29tcHJlc3Npb25fY2hhbmdlZCA9IDA7CisJCQkJCQlzdF9jb21wcmVzc2lvbihTVHAsIChTVG0tPmRlZmF1bHRfY29tcHJlc3Npb24gPT0gU1RfWUVTKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuICgtRUlPKTsKKworCXJldHVybiAwOworfQorDAorI2RlZmluZSBNT0RFX0hFQURFUl9MRU5HVEggIDQKKworLyogTW9kZSBoZWFkZXIgYW5kIHBhZ2UgYnl0ZSBvZmZzZXRzICovCisjZGVmaW5lIE1IX09GRl9EQVRBX0xFTkdUSCAgICAgMAorI2RlZmluZSBNSF9PRkZfTUVESVVNX1RZUEUgICAgIDEKKyNkZWZpbmUgTUhfT0ZGX0RFVl9TUEVDSUZJQyAgICAyCisjZGVmaW5lIE1IX09GRl9CREVTQ1NfTEVOR1RIICAgMworI2RlZmluZSBNUF9PRkZfUEFHRV9OQlIgICAgICAgIDAKKyNkZWZpbmUgTVBfT0ZGX1BBR0VfTEVOR1RIICAgICAxCisKKy8qIE1vZGUgaGVhZGVyIGFuZCBwYWdlIGJpdCBtYXNrcyAqLworI2RlZmluZSBNSF9CSVRfV1AgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgTVBfTVNLX1BBR0VfTkJSICAgICAgICAweDNmCisKKy8qIERvbid0IHJldHVybiBibG9jayBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBNT0RFX1NFTlNFX09NSVRfQkRFU0NTIDB4MDgKKworI2RlZmluZSBNT0RFX1NFTEVDVF9QQUdFX0ZPUk1BVCAweDEwCisKKy8qIFJlYWQgYSBtb2RlIHBhZ2UgaW50byB0aGUgdGFwZSBidWZmZXIuIFRoZSBibG9jayBkZXNjcmlwdG9ycyBhcmUgaW5jbHVkZWQKKyAgIGlmIGluY2xfYmxvY2tfZGVzY3MgaXMgdHJ1ZS4gVGhlIHBhZ2UgY29udHJvbCBpcyBvcmVkIHRvIHRoZSBwYWdlIG51bWJlcgorICAgcGFyYW1ldGVyLCBpZiBuZWNlc3NhcnkuICovCitzdGF0aWMgaW50IHJlYWRfbW9kZV9wYWdlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IHBhZ2UsIGludCBvbWl0X2Jsb2NrX2Rlc2NzKQoreworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50ID0gTlVMTDsKKworCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWNtZFswXSA9IE1PREVfU0VOU0U7CisJaWYgKG9taXRfYmxvY2tfZGVzY3MpCisJCWNtZFsxXSA9IE1PREVfU0VOU0VfT01JVF9CREVTQ1M7CisJY21kWzJdID0gcGFnZTsKKwljbWRbNF0gPSAyNTU7CisKKwlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwKKwkJCSAgIFNUcC0+ZGV2aWNlLT50aW1lb3V0LCAwLCAxKTsKKwlpZiAoU1JwbnQgPT0gTlVMTCkKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCisJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworfQorCisKKy8qIFNlbmQgdGhlIG1vZGUgcGFnZSBpbiB0aGUgdGFwZSBidWZmZXIgdG8gdGhlIGRyaXZlLiBBc3N1bWVzIHRoYXQgdGhlIG1vZGUgZGF0YQorICAgaW4gdGhlIGJ1ZmZlciBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkLiBUaGUgbG9uZyB0aW1lb3V0IGlzIHVzZWQgaWYgc2xvdyBpcyBub24temVyby4gKi8KK3N0YXRpYyBpbnQgd3JpdGVfbW9kZV9wYWdlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IHBhZ2UsIGludCBzbG93KQoreworCWludCBwZ287CisJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CisJY21kWzFdID0gTU9ERV9TRUxFQ1RfUEFHRV9GT1JNQVQ7CisJcGdvID0gTU9ERV9IRUFERVJfTEVOR1RIICsgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01IX09GRl9CREVTQ1NfTEVOR1RIXTsKKwljbWRbNF0gPSBwZ28gKyAoU1RwLT5idWZmZXIpLT5iX2RhdGFbcGdvICsgTVBfT0ZGX1BBR0VfTEVOR1RIXSArIDI7CisKKwkvKiBDbGVhciByZXNlcnZlZCBmaWVsZHMgKi8KKwkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTUhfT0ZGX0RBVEFfTEVOR1RIXSA9IDA7CisJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01IX09GRl9NRURJVU1fVFlQRV0gPSAwOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtNSF9PRkZfREVWX1NQRUNJRklDXSAmPSB+TUhfQklUX1dQOworCShTVHAtPmJ1ZmZlciktPmJfZGF0YVtwZ28gKyBNUF9PRkZfUEFHRV9OQlJdICY9IE1QX01TS19QQUdFX05CUjsKKworCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwKKwkJCSAgIChzbG93ID8gU1RwLT5sb25nX3RpbWVvdXQgOiBTVHAtPmRldmljZS0+dGltZW91dCksIDAsIDEpOworCWlmIChTUnBudCA9PSBOVUxMKQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisKKwlzY3NpX3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisKKwlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7Cit9CisKKworI2RlZmluZSBDT01QUkVTU0lPTl9QQUdFICAgICAgICAweDBmCisjZGVmaW5lIENPTVBSRVNTSU9OX1BBR0VfTEVOR1RIIDE2CisKKyNkZWZpbmUgQ1BfT0ZGX0RDRV9EQ0MgICAgICAgICAgMgorI2RlZmluZSBDUF9PRkZfQ19BTEdPICAgICAgICAgICA3CisKKyNkZWZpbmUgRENFX01BU0sgIDB4ODAKKyNkZWZpbmUgRENDX01BU0sgIDB4NDAKKyNkZWZpbmUgUkVEX01BU0sgIDB4NjAKKworCisvKiBDb250cm9sIHRoZSBjb21wcmVzc2lvbiB3aXRoIG1vZGUgcGFnZSAxNS4gQWxnb3JpdGhtIG5vdCBjaGFuZ2VkIGlmIHplcm8uCisKKyAgIFRoZSBibG9jayBkZXNjcmlwdG9ycyBhcmUgcmVhZCBhbmQgd3JpdHRlbiBiZWNhdXNlIFNvbnkgU0RULTcwMDAgZG9lcyBub3QKKyAgIHdvcmsgd2l0aG91dCB0aGlzIChzdWdnZXN0aW9uIGZyb20gTWljaGFlbCBTY2hhZWZlciA8TWljaGFlbC5TY2hhZWZlckBkbHIuZGU+KS4KKyAgIEluY2x1ZGluZyBibG9jayBkZXNjcmlwdG9ycyBzaG91bGQgbm90IGNhdXNlIGFueSBoYXJtIHRvIG90aGVyIGRyaXZlcy4gKi8KKworc3RhdGljIGludCBzdF9jb21wcmVzc2lvbihzdHJ1Y3Qgc2NzaV90YXBlICogU1RwLCBpbnQgc3RhdGUpCit7CisJaW50IHJldHZhbDsKKwlpbnQgbXBvZmZzOyAgLyogT2Zmc2V0IHRvIG1vZGUgcGFnZSBzdGFydCAqLworCXVuc2lnbmVkIGNoYXIgKmJfZGF0YSA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YTsKKwlERUIoIGNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsgKQorCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpCisJCXJldHVybiAoLUVJTyk7CisKKwkvKiBSZWFkIHRoZSBjdXJyZW50IHBhZ2UgY29udGVudHMgKi8KKwlyZXR2YWwgPSByZWFkX21vZGVfcGFnZShTVHAsIENPTVBSRVNTSU9OX1BBR0UsIDApOworCWlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogQ29tcHJlc3Npb24gbW9kZSBwYWdlIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisKKwltcG9mZnMgPSBNT0RFX0hFQURFUl9MRU5HVEggKyBiX2RhdGFbTUhfT0ZGX0JERVNDU19MRU5HVEhdOworICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogQ29tcHJlc3Npb24gc3RhdGUgaXMgJWQuXG4iLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAoYl9kYXRhW21wb2ZmcyArIENQX09GRl9EQ0VfRENDXSAmIERDRV9NQVNLID8gMSA6IDApKSk7CisKKwkvKiBDaGVjayBpZiBjb21wcmVzc2lvbiBjYW4gYmUgY2hhbmdlZCAqLworCWlmICgoYl9kYXRhW21wb2ZmcyArIENQX09GRl9EQ0VfRENDXSAmIERDQ19NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQuXG4iLCBuYW1lKSk7CisJCXJldHVybiAoLUVJTyk7CisJfQorCisJLyogRG8gdGhlIGNoYW5nZSAqLworCWlmIChzdGF0ZSkgeworCQliX2RhdGFbbXBvZmZzICsgQ1BfT0ZGX0RDRV9EQ0NdIHw9IERDRV9NQVNLOworCQlpZiAoU1RwLT5jX2FsZ28gIT0gMCkKKwkJCWJfZGF0YVttcG9mZnMgKyBDUF9PRkZfQ19BTEdPXSA9IFNUcC0+Y19hbGdvOworCX0KKwllbHNlIHsKKwkJYl9kYXRhW21wb2ZmcyArIENQX09GRl9EQ0VfRENDXSAmPSB+RENFX01BU0s7CisJCWlmIChTVHAtPmNfYWxnbyAhPSAwKQorCQkJYl9kYXRhW21wb2ZmcyArIENQX09GRl9DX0FMR09dID0gMDsgLyogbm8gY29tcHJlc3Npb24gKi8KKwl9CisKKwlyZXR2YWwgPSB3cml0ZV9tb2RlX3BhZ2UoU1RwLCBDT01QUkVTU0lPTl9QQUdFLCAwKTsKKwlpZiAocmV0dmFsKSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENvbXByZXNzaW9uIGNoYW5nZSBmYWlsZWQuXG4iLCBuYW1lKSk7CisJCXJldHVybiAoLUVJTyk7CisJfQorICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogQ29tcHJlc3Npb24gc3RhdGUgY2hhbmdlZCB0byAlZC5cbiIsCisJCSAgICAgICBuYW1lLCBzdGF0ZSkpOworCisJU1RwLT5jb21wcmVzc2lvbl9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBQcm9jZXNzIHRoZSBsb2FkIGFuZCB1bmxvYWQgY29tbWFuZHMgKGRvZXMgdW5sb2FkIGlmIHRoZSBsb2FkIGNvZGUgaXMgemVybykgKi8KK3N0YXRpYyBpbnQgZG9fbG9hZF91bmxvYWQoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGxvYWRfY29kZSkKK3sKKwlpbnQgcmV0dmFsID0gKC1FSU8pLCB0aW1lb3V0OworCURFQiggY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOyApCisJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkgJiYgIWxvYWRfY29kZSkgeworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9OT19UQVBFKQorCQkJcmV0dXJuICgtRU5PTUVESVVNKTsKKwkJZWxzZQorCQkJcmV0dXJuICgtRUlPKTsKKwl9CisKKwltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwljbWRbMF0gPSBTVEFSVF9TVE9QOworCWlmIChsb2FkX2NvZGUpCisJCWNtZFs0XSB8PSAxOworCS8qCisJICogSWYgYXJnID49IDEgJiYgYXJnIDw9IDYgRW5oYW5jZWQgbG9hZC91bmxvYWQgaW4gSFAgQzE1NTNBCisJICovCisJaWYgKGxvYWRfY29kZSA+PSAxICsgTVRfU1RfSFBMT0FERVJfT0ZGU0VUCisJICAgICYmIGxvYWRfY29kZSA8PSA2ICsgTVRfU1RfSFBMT0FERVJfT0ZGU0VUKSB7CisJCURFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBFbmhhbmNlZCAlc2xvYWQgc2xvdCAlMmQuXG4iLAorCQkJICAgIG5hbWUsIChjbWRbNF0pID8gIiIgOiAidW4iLAorCQkJICAgIGxvYWRfY29kZSAtIE1UX1NUX0hQTE9BREVSX09GRlNFVCkpOworCQljbWRbM10gPSBsb2FkX2NvZGUgLSBNVF9TVF9IUExPQURFUl9PRkZTRVQ7IC8qIE1lZGlhSUQgZmllbGQgb2YgQzE1NTNBICovCisJfQorCWlmIChTVHAtPmltbWVkaWF0ZSkgeworCQljbWRbMV0gPSAxOwkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwl9CisJZWxzZQorCQl0aW1lb3V0ID0gU1RwLT5sb25nX3RpbWVvdXQ7CisKKwlERUJDKAorCQlpZiAoIWxvYWRfY29kZSkKKwkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBVbmxvYWRpbmcgdGFwZS5cbiIsIG5hbWUpOworCQllbHNlCisJCXByaW50ayhTVF9ERUJfTVNHICIlczogTG9hZGluZyB0YXBlLlxuIiwgbmFtZSk7CisJCSk7CisKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJICAgdGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCWlmICghU1JwbnQpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKworCWlmICghcmV0dmFsKSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCisKKwkJaWYgKCFsb2FkX2NvZGUpIHsKKwkJCVNUcC0+cmV3X2F0X2Nsb3NlID0gMDsKKwkJCVNUcC0+cmVhZHkgPSBTVF9OT19UQVBFOworCQl9CisJCWVsc2UgeworCQkJU1RwLT5yZXdfYXRfY2xvc2UgPSBTVHAtPmF1dG9yZXdfZGV2OworCQkJcmV0dmFsID0gY2hlY2tfdGFwZShTVHAsIGZpbHApOworCQkJaWYgKHJldHZhbCA+IDApCisJCQkJcmV0dmFsID0gMDsKKwkJfQorCX0KKwllbHNlIHsKKwkJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCQlTVHBzLT5kcnZfZmlsZSA9IFNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKwwKKyNpZiBERUJVRworI2RlZmluZSBTVF9ERUJfRk9SV0FSRCAgMAorI2RlZmluZSBTVF9ERUJfQkFDS1dBUkQgMQorc3RhdGljIHZvaWQgZGViX3NwYWNlX3ByaW50KGNoYXIgKm5hbWUsIGludCBkaXJlY3Rpb24sIGNoYXIgKnVuaXRzLCB1bnNpZ25lZCBjaGFyICpjbWQpCit7CisJczMyIHNjOworCisJc2MgPSBjbWRbMl0gJiAweDgwID8gMHhmZjAwMDAwMCA6IDA7CisJc2MgfD0gKGNtZFsyXSA8PCAxNikgfCAoY21kWzNdIDw8IDgpIHwgY21kWzRdOworCWlmIChkaXJlY3Rpb24pCisJCXNjID0gLXNjOworCXByaW50ayhTVF9ERUJfTVNHICIlczogU3BhY2luZyB0YXBlICVzIG92ZXIgJWQgJXMuXG4iLCBuYW1lLAorCSAgICAgICBkaXJlY3Rpb24gPyAiYmFja3dhcmQiIDogImZvcndhcmQiLCBzYywgdW5pdHMpOworfQorI2VuZGlmCisKKworLyogSW50ZXJuYWwgaW9jdGwgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgc3RfaW50X2lvY3RsKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgdW5zaWduZWQgaW50IGNtZF9pbiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHRpbWVvdXQ7CisJbG9uZyBsdG1wOworCWludCBpb2N0bF9yZXN1bHQ7CisJaW50IGNoZ19lb2YgPSAxOworCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlpbnQgZmlsZW5vLCBibGtubywgYXRfc20sIHVuZG9uZTsKKwlpbnQgZGF0YWxlbiA9IDAsIGRpcmVjdGlvbiA9IERNQV9OT05FOworCWNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsKKworCVdBUk5fT04oU1RwLT5idWZmZXItPmRvX2RpbyAhPSAwKTsKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkgeworCQlpZiAoU1RwLT5yZWFkeSA9PSBTVF9OT19UQVBFKQorCQkJcmV0dXJuICgtRU5PTUVESVVNKTsKKwkJZWxzZQorCQkJcmV0dXJuICgtRUlPKTsKKwl9CisJdGltZW91dCA9IFNUcC0+bG9uZ190aW1lb3V0OworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKwlmaWxlbm8gPSBTVHBzLT5kcnZfZmlsZTsKKwlibGtubyA9IFNUcHMtPmRydl9ibG9jazsKKwlhdF9zbSA9IFNUcHMtPmF0X3NtOworCisJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJc3dpdGNoIChjbWRfaW4pIHsKKwljYXNlIE1URlNGTToKKwkJY2hnX2VvZiA9IDA7CS8qIENoYW5nZWQgZnJvbSB0aGUgRlNGIGFmdGVyIHRoaXMgKi8KKwljYXNlIE1URlNGOgorCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMHgwMTsJLyogU3BhY2UgRmlsZU1hcmtzICovCisJCWNtZFsyXSA9IChhcmcgPj4gMTYpOworCQljbWRbM10gPSAoYXJnID4+IDgpOworCQljbWRbNF0gPSBhcmc7CisgICAgICAgICAgICAgICAgREVCQyhkZWJfc3BhY2VfcHJpbnQobmFtZSwgU1RfREVCX0ZPUldBUkQsICJmaWxlbWFya3MiLCBjbWQpOykKKwkJaWYgKGZpbGVubyA+PSAwKQorCQkJZmlsZW5vICs9IGFyZzsKKwkJYmxrbm8gPSAwOworCQlhdF9zbSAmPSAoYXJnID09IDApOworCQlicmVhazsKKwljYXNlIE1UQlNGTToKKwkJY2hnX2VvZiA9IDA7CS8qIENoYW5nZWQgZnJvbSB0aGUgRlNGIGFmdGVyIHRoaXMgKi8KKwljYXNlIE1UQlNGOgorCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMHgwMTsJLyogU3BhY2UgRmlsZU1hcmtzICovCisJCWx0bXAgPSAoLWFyZyk7CisJCWNtZFsyXSA9IChsdG1wID4+IDE2KTsKKwkJY21kWzNdID0gKGx0bXAgPj4gOCk7CisJCWNtZFs0XSA9IGx0bXA7CisgICAgICAgICAgICAgICAgREVCQyhkZWJfc3BhY2VfcHJpbnQobmFtZSwgU1RfREVCX0JBQ0tXQVJELCAiZmlsZW1hcmtzIiwgY21kKTspCisJCWlmIChmaWxlbm8gPj0gMCkKKwkJCWZpbGVubyAtPSBhcmc7CisJCWJsa25vID0gKC0xKTsJLyogV2UgY2FuJ3Qga25vdyB0aGUgYmxvY2sgbnVtYmVyICovCisJCWF0X3NtICY9IChhcmcgPT0gMCk7CisJCWJyZWFrOworCWNhc2UgTVRGU1I6CisJCWNtZFswXSA9IFNQQUNFOworCQljbWRbMV0gPSAweDAwOwkvKiBTcGFjZSBCbG9ja3MgKi8KKwkJY21kWzJdID0gKGFyZyA+PiAxNik7CisJCWNtZFszXSA9IChhcmcgPj4gOCk7CisJCWNtZFs0XSA9IGFyZzsKKyAgICAgICAgICAgICAgICBERUJDKGRlYl9zcGFjZV9wcmludChuYW1lLCBTVF9ERUJfRk9SV0FSRCwgImJsb2NrcyIsIGNtZCk7KQorCQlpZiAoYmxrbm8gPj0gMCkKKwkJCWJsa25vICs9IGFyZzsKKwkJYXRfc20gJj0gKGFyZyA9PSAwKTsKKwkJYnJlYWs7CisJY2FzZSBNVEJTUjoKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDB4MDA7CS8qIFNwYWNlIEJsb2NrcyAqLworCQlsdG1wID0gKC1hcmcpOworCQljbWRbMl0gPSAobHRtcCA+PiAxNik7CisJCWNtZFszXSA9IChsdG1wID4+IDgpOworCQljbWRbNF0gPSBsdG1wOworICAgICAgICAgICAgICAgIERFQkMoZGViX3NwYWNlX3ByaW50KG5hbWUsIFNUX0RFQl9CQUNLV0FSRCwgImJsb2NrcyIsIGNtZCk7KQorCQlpZiAoYmxrbm8gPj0gMCkKKwkJCWJsa25vIC09IGFyZzsKKwkJYXRfc20gJj0gKGFyZyA9PSAwKTsKKwkJYnJlYWs7CisJY2FzZSBNVEZTUzoKKwkJY21kWzBdID0gU1BBQ0U7CisJCWNtZFsxXSA9IDB4MDQ7CS8qIFNwYWNlIFNldG1hcmtzICovCisJCWNtZFsyXSA9IChhcmcgPj4gMTYpOworCQljbWRbM10gPSAoYXJnID4+IDgpOworCQljbWRbNF0gPSBhcmc7CisgICAgICAgICAgICAgICAgREVCQyhkZWJfc3BhY2VfcHJpbnQobmFtZSwgU1RfREVCX0ZPUldBUkQsICJzZXRtYXJrcyIsIGNtZCk7KQorCQlpZiAoYXJnICE9IDApIHsKKwkJCWJsa25vID0gZmlsZW5vID0gKC0xKTsKKwkJCWF0X3NtID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1UQlNTOgorCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMHgwNDsJLyogU3BhY2UgU2V0bWFya3MgKi8KKwkJbHRtcCA9ICgtYXJnKTsKKwkJY21kWzJdID0gKGx0bXAgPj4gMTYpOworCQljbWRbM10gPSAobHRtcCA+PiA4KTsKKwkJY21kWzRdID0gbHRtcDsKKyAgICAgICAgICAgICAgICBERUJDKGRlYl9zcGFjZV9wcmludChuYW1lLCBTVF9ERUJfQkFDS1dBUkQsICJzZXRtYXJrcyIsIGNtZCk7KQorCQlpZiAoYXJnICE9IDApIHsKKwkJCWJsa25vID0gZmlsZW5vID0gKC0xKTsKKwkJCWF0X3NtID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1UV0VPRjoKKwljYXNlIE1UV1NNOgorCQlpZiAoU1RwLT53cml0ZV9wcm90KQorCQkJcmV0dXJuICgtRUFDQ0VTKTsKKwkJY21kWzBdID0gV1JJVEVfRklMRU1BUktTOworCQlpZiAoY21kX2luID09IE1UV1NNKQorCQkJY21kWzFdID0gMjsKKwkJY21kWzJdID0gKGFyZyA+PiAxNik7CisJCWNtZFszXSA9IChhcmcgPj4gOCk7CisJCWNtZFs0XSA9IGFyZzsKKwkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT50aW1lb3V0OworICAgICAgICAgICAgICAgIERFQkMoCisgICAgICAgICAgICAgICAgICAgICBpZiAoY21kX2luID09IE1UV0VPRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoU1RfREVCX01TRyAiJXM6IFdyaXRpbmcgJWQgZmlsZW1hcmtzLlxuIiwgbmFtZSwKKwkJCQkgY21kWzJdICogNjU1MzYgKyBjbWRbM10gKiAyNTYgKyBjbWRbNF0pOworICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCXByaW50ayhTVF9ERUJfTVNHICIlczogV3JpdGluZyAlZCBzZXRtYXJrcy5cbiIsIG5hbWUsCisJCQkJIGNtZFsyXSAqIDY1NTM2ICsgY21kWzNdICogMjU2ICsgY21kWzRdKTsKKwkJKQorCQlpZiAoZmlsZW5vID49IDApCisJCQlmaWxlbm8gKz0gYXJnOworCQlibGtubyA9IDA7CisJCWF0X3NtID0gKGNtZF9pbiA9PSBNVFdTTSk7CisJCWJyZWFrOworCWNhc2UgTVRSRVc6CisJCWNtZFswXSA9IFJFWkVST19VTklUOworCQlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKKwkJCWNtZFsxXSA9IDE7CS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwkJfQorICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBSZXdpbmRpbmcgdGFwZS5cbiIsIG5hbWUpKTsKKwkJZmlsZW5vID0gYmxrbm8gPSBhdF9zbSA9IDA7CisJCWJyZWFrOworCWNhc2UgTVROT1A6CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IE5vIG9wIG9uIHRhcGUuXG4iLCBuYW1lKSk7CisJCXJldHVybiAwOwkvKiBTaG91bGQgZG8gc29tZXRoaW5nID8gKi8KKwkJYnJlYWs7CisJY2FzZSBNVFJFVEVOOgorCQljbWRbMF0gPSBTVEFSVF9TVE9QOworCQlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKKwkJCWNtZFsxXSA9IDE7CS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKwkJfQorCQljbWRbNF0gPSAzOworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBSZXRlbnNpb25pbmcgdGFwZS5cbiIsIG5hbWUpKTsKKwkJZmlsZW5vID0gYmxrbm8gPSBhdF9zbSA9IDA7CisJCWJyZWFrOworCWNhc2UgTVRFT006CisJCWlmICghU1RwLT5mYXN0X210ZW9tKSB7CisJCQkvKiBzcGFjZSB0byB0aGUgZW5kIG9mIHRhcGUgKi8KKwkJCWlvY3RsX3Jlc3VsdCA9IHN0X2ludF9pb2N0bChTVHAsIE1URlNGLCAweDdmZmZmZik7CisJCQlmaWxlbm8gPSBTVHBzLT5kcnZfZmlsZTsKKwkJCWlmIChTVHBzLT5lb2YgPj0gU1RfRU9EXzEpCisJCQkJcmV0dXJuIDA7CisJCQkvKiBUaGUgbmV4dCBsaW5lcyB3b3VsZCBoaWRlIHRoZSBudW1iZXIgb2Ygc3BhY2VkIEZpbGVNYXJrcworCQkJICAgVGhhdCdzIHdoeSBJIGluc2VydGVkIHRoZSBwcmV2aW91cyBsaW5lcy4gSSBoYWQgbm8gbHVjaworCQkJICAgd2l0aCBkZXRlY3RpbmcgRU9NIHdpdGggRlNGLCBzbyB3ZSBnbyBub3cgdG8gRU9NLgorCQkJICAgSm9lcmcgV2V1bGUgKi8KKwkJfSBlbHNlCisJCQlmaWxlbm8gPSAoLTEpOworCQljbWRbMF0gPSBTUEFDRTsKKwkJY21kWzFdID0gMzsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogU3BhY2luZyB0byBlbmQgb2YgcmVjb3JkZWQgbWVkaXVtLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CisJCWJsa25vID0gLTE7CisJCWF0X3NtID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNVEVSQVNFOgorCQlpZiAoU1RwLT53cml0ZV9wcm90KQorCQkJcmV0dXJuICgtRUFDQ0VTKTsKKwkJY21kWzBdID0gRVJBU0U7CisJCWNtZFsxXSA9IChhcmcgPyAxIDogMCk7CS8qIExvbmcgZXJhc2Ugd2l0aCBub24temVybyBhcmd1bWVudCAqLworCQlpZiAoU1RwLT5pbW1lZGlhdGUpIHsKKwkJCWNtZFsxXSB8PSAyOwkvKiBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCQl0aW1lb3V0ID0gU1RwLT5kZXZpY2UtPnRpbWVvdXQ7CisJCX0KKwkJZWxzZQorCQkJdGltZW91dCA9IFNUcC0+bG9uZ190aW1lb3V0ICogODsKKworICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBFcmFzaW5nIHRhcGUuXG4iLCBuYW1lKSk7CisJCWZpbGVubyA9IGJsa25vID0gYXRfc20gPSAwOworCQlicmVhazsKKwljYXNlIE1UU0VUQkxLOgkJLyogU2V0IGJsb2NrIGxlbmd0aCAqLworCWNhc2UgTVRTRVRERU5TSVRZOgkvKiBTZXQgdGFwZSBkZW5zaXR5ICovCisJY2FzZSBNVFNFVERSVkJVRkZFUjoJLyogU2V0IGRyaXZlIGJ1ZmZlcmluZyAqLworCWNhc2UgU0VUX0RFTlNfQU5EX0JMSzoJLyogU2V0IGRlbnNpdHkgYW5kIGJsb2NrIHNpemUgKi8KKwkJY2hnX2VvZiA9IDA7CisJCWlmIChTVHAtPmRpcnR5IHx8IChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9ieXRlcyAhPSAwKQorCQkJcmV0dXJuICgtRUlPKTsJLyogTm90IGFsbG93ZWQgaWYgZGF0YSBpbiBidWZmZXIgKi8KKwkJaWYgKChjbWRfaW4gPT0gTVRTRVRCTEsgfHwgY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspICYmCisJCSAgICAoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSAhPSAwICYmCisJCSAgICBTVHAtPm1heF9ibG9jayA+IDAgJiYKKwkJICAgICgoYXJnICYgTVRfU1RfQkxLU0laRV9NQVNLKSA8IFNUcC0+bWluX2Jsb2NrIHx8CisJCSAgICAgKGFyZyAmIE1UX1NUX0JMS1NJWkVfTUFTSykgPiBTVHAtPm1heF9ibG9jaykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbGxlZ2FsIGJsb2NrIHNpemUuXG4iLCBuYW1lKTsKKwkJCXJldHVybiAoLUVJTlZBTCk7CisJCX0KKwkJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CisJCWlmICgoU1RwLT51c2VfcGYgJiBVU0VfUEYpKQorCQkJY21kWzFdID0gTU9ERV9TRUxFQ1RfUEFHRV9GT1JNQVQ7CisJCWNtZFs0XSA9IGRhdGFsZW4gPSAxMjsKKwkJZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKworCQltZW1zZXQoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhLCAwLCAxMik7CisJCWlmIChjbWRfaW4gPT0gTVRTRVREUlZCVUZGRVIpCisJCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0gPSAoYXJnICYgNykgPDwgNDsKKwkJZWxzZQorCQkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzJdID0KKwkJCSAgICBTVHAtPmRydl9idWZmZXIgPDwgNDsKKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzNdID0gODsJLyogYmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKi8KKwkJaWYgKGNtZF9pbiA9PSBNVFNFVERFTlNJVFkpIHsKKwkJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVs0XSA9IGFyZzsKKwkJCVNUcC0+ZGVuc2l0eV9jaGFuZ2VkID0gMTsJLyogQXQgbGVhc3Qgd2UgdHJpZWQgOy0pICovCisJCX0gZWxzZSBpZiAoY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspCisJCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF0gPSBhcmcgPj4gMjQ7CisJCWVsc2UKKwkJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVs0XSA9IFNUcC0+ZGVuc2l0eTsKKwkJaWYgKGNtZF9pbiA9PSBNVFNFVEJMSyB8fCBjbWRfaW4gPT0gU0VUX0RFTlNfQU5EX0JMSykgeworCQkJbHRtcCA9IGFyZyAmIE1UX1NUX0JMS1NJWkVfTUFTSzsKKwkJCWlmIChjbWRfaW4gPT0gTVRTRVRCTEspCisJCQkJU1RwLT5ibGtzaXplX2NoYW5nZWQgPSAxOyAvKiBBdCBsZWFzdCB3ZSB0cmllZCA7LSkgKi8KKwkJfSBlbHNlCisJCQlsdG1wID0gU1RwLT5ibG9ja19zaXplOworCQkoU1RwLT5idWZmZXIpLT5iX2RhdGFbOV0gPSAobHRtcCA+PiAxNik7CisJCShTVHAtPmJ1ZmZlciktPmJfZGF0YVsxMF0gPSAobHRtcCA+PiA4KTsKKwkJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzExXSA9IGx0bXA7CisJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+dGltZW91dDsKKyAgICAgICAgICAgICAgICBERUJDKAorCQkJaWYgKGNtZF9pbiA9PSBNVFNFVEJMSyB8fCBjbWRfaW4gPT0gU0VUX0RFTlNfQU5EX0JMSykKKwkJCQlwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZXR0aW5nIGJsb2NrIHNpemUgdG8gJWQgYnl0ZXMuXG4iLCBuYW1lLAorCQkJCSAgICAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbOV0gKiA2NTUzNiArCisJCQkJICAgICAgIChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxMF0gKiAyNTYgKworCQkJCSAgICAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMTFdKTsKKwkJCWlmIChjbWRfaW4gPT0gTVRTRVRERU5TSVRZIHx8IGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKQorCQkJCXByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFNldHRpbmcgZGVuc2l0eSBjb2RlIHRvICV4LlxuIiwgbmFtZSwKKwkJCQkgICAgICAgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzRdKTsKKwkJCWlmIChjbWRfaW4gPT0gTVRTRVREUlZCVUZGRVIpCisJCQkJcHJpbnRrKFNUX0RFQl9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogU2V0dGluZyBkcml2ZSBidWZmZXIgY29kZSB0byAlZC5cbiIsIG5hbWUsCisJCQkJICAgICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl0gPj4gNCkgJiA3KTsKKwkJKQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKC1FTk9TWVMpOworCX0KKworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgZGF0YWxlbiwgZGlyZWN0aW9uLAorCQkJICAgdGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOworCWlmICghU1JwbnQpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCWlvY3RsX3Jlc3VsdCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCisJaWYgKCFpb2N0bF9yZXN1bHQpIHsJLyogU0NTSSBjb21tYW5kIHN1Y2Nlc3NmdWwgKi8KKwkJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlTUnBudCA9IE5VTEw7CisJCVNUcHMtPmRydl9ibG9jayA9IGJsa25vOworCQlTVHBzLT5kcnZfZmlsZSA9IGZpbGVubzsKKwkJU1Rwcy0+YXRfc20gPSBhdF9zbTsKKworCQlpZiAoY21kX2luID09IE1UQlNGTSkKKwkJCWlvY3RsX3Jlc3VsdCA9IHN0X2ludF9pb2N0bChTVHAsIE1URlNGLCAxKTsKKwkJZWxzZSBpZiAoY21kX2luID09IE1URlNGTSkKKwkJCWlvY3RsX3Jlc3VsdCA9IHN0X2ludF9pb2N0bChTVHAsIE1UQlNGLCAxKTsKKworCQlpZiAoY21kX2luID09IE1UU0VUQkxLIHx8IGNtZF9pbiA9PSBTRVRfREVOU19BTkRfQkxLKSB7CisJCQlpbnQgb2xkX2Jsb2NrX3NpemUgPSBTVHAtPmJsb2NrX3NpemU7CisJCQlTVHAtPmJsb2NrX3NpemUgPSBhcmcgJiBNVF9TVF9CTEtTSVpFX01BU0s7CisJCQlpZiAoU1RwLT5ibG9ja19zaXplICE9IDApIHsKKwkJCQlpZiAob2xkX2Jsb2NrX3NpemUgPT0gMCkKKwkJCQkJbm9ybWFsaXplX2J1ZmZlcihTVHAtPmJ1ZmZlcik7CisJCQkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2Jsb2NrcyA9CisJCQkJICAgIChTVHAtPmJ1ZmZlciktPmJ1ZmZlcl9zaXplIC8gU1RwLT5ibG9ja19zaXplOworCQkJfQorCQkJKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzID0gKFNUcC0+YnVmZmVyKS0+cmVhZF9wb2ludGVyID0gMDsKKwkJCWlmIChjbWRfaW4gPT0gU0VUX0RFTlNfQU5EX0JMSykKKwkJCQlTVHAtPmRlbnNpdHkgPSBhcmcgPj4gTVRfU1RfREVOU0lUWV9TSElGVDsKKwkJfSBlbHNlIGlmIChjbWRfaW4gPT0gTVRTRVREUlZCVUZGRVIpCisJCQlTVHAtPmRydl9idWZmZXIgPSAoYXJnICYgNyk7CisJCWVsc2UgaWYgKGNtZF9pbiA9PSBNVFNFVERFTlNJVFkpCisJCQlTVHAtPmRlbnNpdHkgPSBhcmc7CisKKwkJaWYgKGNtZF9pbiA9PSBNVEVPTSkKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKwkJZWxzZSBpZiAoY21kX2luID09IE1URlNGKQorCQkJU1Rwcy0+ZW9mID0gU1RfRk07CisJCWVsc2UgaWYgKGNoZ19lb2YpCisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKworCQlpZiAoY21kX2luID09IE1UV0VPRikKKwkJCVNUcHMtPnJ3ID0gU1RfSURMRTsKKwl9IGVsc2UgeyAvKiBTQ1NJIGNvbW1hbmQgd2FzIG5vdCBjb21wbGV0ZWx5IHN1Y2Nlc3NmdWwuIERvbid0IHJldHVybgorICAgICAgICAgICAgICAgICAgICBmcm9tIHRoaXMgYmxvY2sgd2l0aG91dCByZWxlYXNpbmcgdGhlIFNDU0kgY29tbWFuZCBibG9jayEgKi8KKwkJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CisKKwkJaWYgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0VPTSkgeworCQkJaWYgKGNtZF9pbiAhPSBNVEJTRiAmJiBjbWRfaW4gIT0gTVRCU0ZNICYmCisJCQkgICAgY21kX2luICE9IE1UQlNSICYmIGNtZF9pbiAhPSBNVEJTUykKKwkJCQlTVHBzLT5lb2YgPSBTVF9FT01fT0s7CisJCQlTVHBzLT5kcnZfYmxvY2sgPSAwOworCQl9CisKKwkJaWYgKGNtZHN0YXRwLT5yZW1haW5kZXJfdmFsaWQpCisJCQl1bmRvbmUgPSAoaW50KWNtZHN0YXRwLT51cmVtYWluZGVyNjQ7CisJCWVsc2UKKwkJCXVuZG9uZSA9IDA7CisKKwkJaWYgKGNtZF9pbiA9PSBNVFdFT0YgJiYKKwkJICAgIGNtZHN0YXRwLT5oYXZlX3NlbnNlICYmCisJCSAgICAoY21kc3RhdHAtPmZsYWdzICYgU0VOU0VfRU9NKSAmJgorCQkgICAgKGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IE5PX1NFTlNFIHx8CisJCSAgICAgY21kc3RhdHAtPnNlbnNlX2hkci5zZW5zZV9rZXkgPT0gUkVDT1ZFUkVEX0VSUk9SKSAmJgorCQkgICAgdW5kb25lID09IDApIHsKKwkJCWlvY3RsX3Jlc3VsdCA9IDA7CS8qIEVPRiB3cml0dGVuIHN1Y2Nlc2Z1bGx5IGF0IEVPTSAqLworCQkJaWYgKGZpbGVubyA+PSAwKQorCQkJCWZpbGVubysrOworCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSBmaWxlbm87CisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJfSBlbHNlIGlmICgoY21kX2luID09IE1URlNGKSB8fCAoY21kX2luID09IE1URlNGTSkpIHsKKwkJCWlmIChmaWxlbm8gPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSA9IGZpbGVubyAtIHVuZG9uZTsKKwkJCWVsc2UKKwkJCQlTVHBzLT5kcnZfZmlsZSA9IGZpbGVubzsKKwkJCVNUcHMtPmRydl9ibG9jayA9IC0xOworCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisJCX0gZWxzZSBpZiAoKGNtZF9pbiA9PSBNVEJTRikgfHwgKGNtZF9pbiA9PSBNVEJTRk0pKSB7CisJCQlpZiAoYXJnID4gMCAmJiB1bmRvbmUgPCAwKSAgLyogU29tZSBkcml2ZXMgZ2V0IHRoaXMgd3JvbmcgKi8KKwkJCQl1bmRvbmUgPSAoLXVuZG9uZSk7CisJCQlpZiAoU1Rwcy0+ZHJ2X2ZpbGUgPj0gMCkKKwkJCQlTVHBzLT5kcnZfZmlsZSA9IGZpbGVubyArIHVuZG9uZTsKKwkJCVNUcHMtPmRydl9ibG9jayA9IDA7CisJCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJfSBlbHNlIGlmIChjbWRfaW4gPT0gTVRGU1IpIHsKKwkJCWlmIChjbWRzdGF0cC0+ZmxhZ3MgJiBTRU5TRV9GTUspIHsJLyogSGl0IGZpbGVtYXJrICovCisJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCVNUcHMtPmRydl9maWxlKys7CisJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gMDsKKwkJCQlTVHBzLT5lb2YgPSBTVF9GTTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJsa25vID49IHVuZG9uZSkKKwkJCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gYmxrbm8gLSB1bmRvbmU7CisJCQkJZWxzZQorCQkJCQlTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOworCQkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZF9pbiA9PSBNVEJTUikgeworCQkJaWYgKGNtZHN0YXRwLT5mbGFncyAmIFNFTlNFX0ZNSykgewkvKiBIaXQgZmlsZW1hcmsgKi8KKwkJCQlTVHBzLT5kcnZfZmlsZS0tOworCQkJCVNUcHMtPmRydl9ibG9jayA9ICgtMSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhcmcgPiAwICYmIHVuZG9uZSA8IDApICAvKiBTb21lIGRyaXZlcyBnZXQgdGhpcyB3cm9uZyAqLworCQkJCQl1bmRvbmUgPSAoLXVuZG9uZSk7CisJCQkJaWYgKFNUcHMtPmRydl9ibG9jayA+PSAwKQorCQkJCQlTVHBzLT5kcnZfYmxvY2sgPSBibGtubyArIHVuZG9uZTsKKwkJCX0KKwkJCVNUcHMtPmVvZiA9IFNUX05PRU9GOworCQl9IGVsc2UgaWYgKGNtZF9pbiA9PSBNVEVPTSkgeworCQkJU1Rwcy0+ZHJ2X2ZpbGUgPSAoLTEpOworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsKKwkJCVNUcHMtPmVvZiA9IFNUX0VPRDsKKwkJfSBlbHNlIGlmIChjbWRfaW4gPT0gTVRTRVRCTEsgfHwKKwkJCSAgIGNtZF9pbiA9PSBNVFNFVERFTlNJVFkgfHwKKwkJCSAgIGNtZF9pbiA9PSBNVFNFVERSVkJVRkZFUiB8fAorCQkJICAgY21kX2luID09IFNFVF9ERU5TX0FORF9CTEspIHsKKwkJCWlmIChjbWRzdGF0cC0+c2Vuc2VfaGRyLnNlbnNlX2tleSA9PSBJTExFR0FMX1JFUVVFU1QgJiYKKwkJCSAgICAhKFNUcC0+dXNlX3BmICYgUEZfVEVTVEVEKSkgeworCQkJCS8qIFRyeSB0aGUgb3RoZXIgcG9zc2libGUgc3RhdGUgb2YgUGFnZSBGb3JtYXQgaWYgbm90CisJCQkJICAgYWxyZWFkeSB0cmllZCAqLworCQkJCVNUcC0+dXNlX3BmID0gIVNUcC0+dXNlX3BmIHwgUEZfVEVTVEVEOworCQkJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJCQlTUnBudCA9IE5VTEw7CisJCQkJcmV0dXJuIHN0X2ludF9pb2N0bChTVHAsIGNtZF9pbiwgYXJnKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjaGdfZW9mKQorCQkJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CisKKwkJaWYgKGNtZHN0YXRwLT5zZW5zZV9oZHIuc2Vuc2Vfa2V5ID09IEJMQU5LX0NIRUNLKQorCQkJU1Rwcy0+ZW9mID0gU1RfRU9EOworCisJCXNjc2lfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBOVUxMOworCX0KKworCXJldHVybiBpb2N0bF9yZXN1bHQ7Cit9CisMCisKKy8qIEdldCB0aGUgdGFwZSBwb3NpdGlvbi4gSWYgYnQgPT0gMiwgYXJnIHBvaW50cyBpbnRvIGEga2VybmVsIHNwYWNlIG10X2xvYworICAgc3RydWN0dXJlLiAqLworCitzdGF0aWMgaW50IGdldF9sb2NhdGlvbihzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIHVuc2lnbmVkIGludCAqYmxvY2ssIGludCAqcGFydGl0aW9uLAorCQkJaW50IGxvZ2ljYWwpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIHNjbWRbTUFYX0NPTU1BTkRfU0laRV07CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqU1JwbnQ7CisJREVCKCBjaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7ICkKKworCWlmIChTVHAtPnJlYWR5ICE9IFNUX1JFQURZKQorCQlyZXR1cm4gKC1FSU8pOworCisJbWVtc2V0KHNjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOworCWlmICgoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsIDwgU0NTSV8yKSB7CisJCXNjbWRbMF0gPSBRRkFfUkVRVUVTVF9CTE9DSzsKKwkJc2NtZFs0XSA9IDM7CisJfSBlbHNlIHsKKwkJc2NtZFswXSA9IFJFQURfUE9TSVRJT047CisJCWlmICghbG9naWNhbCAmJiAhU1RwLT5zY3NpMl9sb2dpY2FsKQorCQkJc2NtZFsxXSA9IDE7CisJfQorCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIHNjbWQsIDIwLCBETUFfRlJPTV9ERVZJQ0UsCisJCQlTVHAtPmRldmljZS0+dGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOworCWlmICghU1JwbnQpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCWlmICgoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCAhPSAwIHx8CisJICAgIChTVHAtPmRldmljZS0+c2NzaV9sZXZlbCA+PSBTQ1NJXzIgJiYKKwkgICAgICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMF0gJiA0KSAhPSAwKSkgeworCQkqYmxvY2sgPSAqcGFydGl0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogQ2FuJ3QgcmVhZCB0YXBlIHBvc2l0aW9uLlxuIiwgbmFtZSkpOworCQlyZXN1bHQgPSAoLUVJTyk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gMDsKKwkJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPCBTQ1NJXzIpIHsKKwkJCSpibG9jayA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbMF0gPDwgMTYpCisJCQkgICAgKyAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzFdIDw8IDgpCisJCQkgICAgKyAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMl07CisJCQkqcGFydGl0aW9uID0gMDsKKwkJfSBlbHNlIHsKKwkJCSpibG9jayA9ICgoU1RwLT5idWZmZXIpLT5iX2RhdGFbNF0gPDwgMjQpCisJCQkgICAgKyAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzVdIDw8IDE2KQorCQkJICAgICsgKChTVHAtPmJ1ZmZlciktPmJfZGF0YVs2XSA8PCA4KQorCQkJICAgICsgKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzddOworCQkJKnBhcnRpdGlvbiA9IChTVHAtPmJ1ZmZlciktPmJfZGF0YVsxXTsKKwkJCWlmICgoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzBdICYgMHg4MCkgJiYKKwkJCSAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbMV0gPT0gMCkJLyogQk9QIG9mIHBhcnRpdGlvbiAwICovCisJCQkJU1RwLT5wc1swXS5kcnZfYmxvY2sgPSBTVHAtPnBzWzBdLmRydl9maWxlID0gMDsKKwkJfQorICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBHb3QgdGFwZSBwb3MuIGJsayAlZCBwYXJ0ICVkLlxuIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYmxvY2ssICpwYXJ0aXRpb24pKTsKKwl9CisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gTlVMTDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogU2V0IHRoZSB0YXBlIGJsb2NrIGFuZCBwYXJ0aXRpb24uIE5lZ2F0aXZlIHBhcnRpdGlvbiBtZWFucyB0aGF0IG9ubHkgdGhlCisgICBibG9jayBzaG91bGQgYmUgc2V0IGluIHZlbmRvciBzcGVjaWZpYyB3YXkuICovCitzdGF0aWMgaW50IHNldF9sb2NhdGlvbihzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIHVuc2lnbmVkIGludCBibG9jaywgaW50IHBhcnRpdGlvbiwKKwkJCWludCBsb2dpY2FsKQoreworCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKKwlpbnQgcmVzdWx0LCBwOworCXVuc2lnbmVkIGludCBibGs7CisJaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgY2hhciBzY21kW01BWF9DT01NQU5EX1NJWkVdOworCXN0cnVjdCBzY3NpX3JlcXVlc3QgKlNScG50OworCURFQiggY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOyApCisKKwlpZiAoU1RwLT5yZWFkeSAhPSBTVF9SRUFEWSkKKwkJcmV0dXJuICgtRUlPKTsKKwl0aW1lb3V0ID0gU1RwLT5sb25nX3RpbWVvdXQ7CisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOworCisgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBTZXR0aW5nIGJsb2NrIHRvICVkIGFuZCBwYXJ0aXRpb24gdG8gJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBibG9jaywgcGFydGl0aW9uKSk7CisJREVCKGlmIChwYXJ0aXRpb24gPCAwKQorCQlyZXR1cm4gKC1FSU8pOyApCisKKwkvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGF0IHRoZSBwYXJ0aXRpb24gd2UgYXJlIGxlYXZpbmcgKi8KKwlpZiAoKCFTVHAtPmNhbl9wYXJ0aXRpb25zICYmIHBhcnRpdGlvbiAhPSAwKSB8fAorCSAgICBwYXJ0aXRpb24gPj0gU1RfTkJSX1BBUlRJVElPTlMpCisJCXJldHVybiAoLUVJTlZBTCk7CisJaWYgKHBhcnRpdGlvbiAhPSBTVHAtPnBhcnRpdGlvbikgeworCQlpZiAoZ2V0X2xvY2F0aW9uKFNUcCwgJmJsaywgJnAsIDEpKQorCQkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDA7CisJCWVsc2UgeworCQkJU1Rwcy0+bGFzdF9ibG9ja192YWxpZCA9IDE7CisJCQlTVHBzLT5sYXN0X2Jsb2NrX3Zpc2l0ZWQgPSBibGs7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFZpc2l0ZWQgYmxvY2sgJWQgZm9yIHBhcnRpdGlvbiAlZCBzYXZlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBibGssIFNUcC0+cGFydGl0aW9uKSk7CisJCX0KKwl9CisKKwltZW1zZXQoc2NtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJaWYgKChTVHAtPmRldmljZSktPnNjc2lfbGV2ZWwgPCBTQ1NJXzIpIHsKKwkJc2NtZFswXSA9IFFGQV9TRUVLX0JMT0NLOworCQlzY21kWzJdID0gKGJsb2NrID4+IDE2KTsKKwkJc2NtZFszXSA9IChibG9jayA+PiA4KTsKKwkJc2NtZFs0XSA9IGJsb2NrOworCQlzY21kWzVdID0gMDsKKwl9IGVsc2UgeworCQlzY21kWzBdID0gU0VFS18xMDsKKwkJc2NtZFszXSA9IChibG9jayA+PiAyNCk7CisJCXNjbWRbNF0gPSAoYmxvY2sgPj4gMTYpOworCQlzY21kWzVdID0gKGJsb2NrID4+IDgpOworCQlzY21kWzZdID0gYmxvY2s7CisJCWlmICghbG9naWNhbCAmJiAhU1RwLT5zY3NpMl9sb2dpY2FsKQorCQkJc2NtZFsxXSA9IDQ7CisJCWlmIChTVHAtPnBhcnRpdGlvbiAhPSBwYXJ0aXRpb24pIHsKKwkJCXNjbWRbMV0gfD0gMjsKKwkJCXNjbWRbOF0gPSBwYXJ0aXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IFRyeWluZyB0byBjaGFuZ2UgcGFydGl0aW9uIGZyb20gJWQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBTVHAtPnBhcnRpdGlvbiwgcGFydGl0aW9uKSk7CisJCX0KKwl9CisJaWYgKFNUcC0+aW1tZWRpYXRlKSB7CisJCXNjbWRbMV0gfD0gMTsJCS8qIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT50aW1lb3V0OworCX0KKworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIHNjbWQsIDAsIERNQV9OT05FLAorCQkJICAgdGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOworCWlmICghU1JwbnQpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKworCVNUcHMtPmRydl9ibG9jayA9IFNUcHMtPmRydl9maWxlID0gKC0xKTsKKwlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCkgeworCQlyZXN1bHQgPSAoLUVJTyk7CisJCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zICYmCisJCSAgICAoU1RwLT5kZXZpY2UpLT5zY3NpX2xldmVsID49IFNDU0lfMiAmJgorCQkgICAgKHAgPSBmaW5kX3BhcnRpdGlvbihTVHApKSA+PSAwKQorCQkJU1RwLT5wYXJ0aXRpb24gPSBwOworCX0gZWxzZSB7CisJCWlmIChTVHAtPmNhbl9wYXJ0aXRpb25zKSB7CisJCQlTVHAtPnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKKwkJCVNUcHMgPSAmKFNUcC0+cHNbcGFydGl0aW9uXSk7CisJCQlpZiAoIVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQgfHwKKwkJCSAgICBTVHBzLT5sYXN0X2Jsb2NrX3Zpc2l0ZWQgIT0gYmxvY2spIHsKKwkJCQlTVHBzLT5hdF9zbSA9IDA7CisJCQkJU1Rwcy0+cncgPSBTVF9JRExFOworCQkJfQorCQl9IGVsc2UKKwkJCVNUcHMtPmF0X3NtID0gMDsKKwkJaWYgKGJsb2NrID09IDApCisJCQlTVHBzLT5kcnZfYmxvY2sgPSBTVHBzLT5kcnZfZmlsZSA9IDA7CisJCXJlc3VsdCA9IDA7CisJfQorCisJc2NzaV9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gTlVMTDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogRmluZCB0aGUgY3VycmVudCBwYXJ0aXRpb24gbnVtYmVyIGZvciB0aGUgZHJpdmUgc3RhdHVzLiBDYWxsZWQgZnJvbSBvcGVuIGFuZAorICAgcmV0dXJucyBlaXRoZXIgcGFydGl0aW9uIG51bWJlciBvZiBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLworc3RhdGljIGludCBmaW5kX3BhcnRpdGlvbihzdHJ1Y3Qgc2NzaV90YXBlICpTVHApCit7CisJaW50IGksIHBhcnRpdGlvbjsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CisKKwlpZiAoKGkgPSBnZXRfbG9jYXRpb24oU1RwLCAmYmxvY2ssICZwYXJ0aXRpb24sIDEpKSA8IDApCisJCXJldHVybiBpOworCWlmIChwYXJ0aXRpb24gPj0gU1RfTkJSX1BBUlRJVElPTlMpCisJCXJldHVybiAoLUVJTyk7CisJcmV0dXJuIHBhcnRpdGlvbjsKK30KKworCisvKiBDaGFuZ2UgdGhlIHBhcnRpdGlvbiBpZiBuZWNlc3NhcnkgKi8KK3N0YXRpYyBpbnQgc3dpdGNoX3BhcnRpdGlvbihzdHJ1Y3Qgc2NzaV90YXBlICpTVHApCit7CisJc3RydWN0IHN0X3BhcnRzdGF0ICpTVHBzOworCisJaWYgKFNUcC0+cGFydGl0aW9uID09IFNUcC0+bmV3X3BhcnRpdGlvbikKKwkJcmV0dXJuIDA7CisJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPm5ld19wYXJ0aXRpb25dKTsKKwlpZiAoIVNUcHMtPmxhc3RfYmxvY2tfdmFsaWQpCisJCVNUcHMtPmxhc3RfYmxvY2tfdmlzaXRlZCA9IDA7CisJcmV0dXJuIHNldF9sb2NhdGlvbihTVHAsIFNUcHMtPmxhc3RfYmxvY2tfdmlzaXRlZCwgU1RwLT5uZXdfcGFydGl0aW9uLCAxKTsKK30KKwwKKy8qIEZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgbWVkaXVtIHBhcnRpdGlvbiBtb2RlIHBhZ2UuICovCisKKyNkZWZpbmUgUEFSVF9QQUdFICAgMHgxMQorI2RlZmluZSBQQVJUX1BBR0VfRklYRURfTEVOR1RIIDgKKworI2RlZmluZSBQUF9PRkZfTUFYX0FERF9QQVJUUyAgIDIKKyNkZWZpbmUgUFBfT0ZGX05CUl9BRERfUEFSVFMgICAzCisjZGVmaW5lIFBQX09GRl9GTEFHUyAgICAgICAgICAgNAorI2RlZmluZSBQUF9PRkZfUEFSVF9VTklUUyAgICAgIDYKKyNkZWZpbmUgUFBfT0ZGX1JFU0VSVkVEICAgICAgICA3CisKKyNkZWZpbmUgUFBfQklUX0lEUCAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFBQX01TS19QU1VNX01CICAgICAgICAgMHgxMAorCisvKiBHZXQgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIG9uIHRoZSB0YXBlLiBBcyBhIHNpZGUgZWZmZWN0IHJlYWRzIHRoZQorICAgbW9kZSBwYWdlIGludG8gdGhlIHRhcGUgYnVmZmVyLiAqLworc3RhdGljIGludCBuYnJfcGFydGl0aW9ucyhzdHJ1Y3Qgc2NzaV90YXBlICpTVHApCit7CisJaW50IHJlc3VsdDsKKwlERUIoIGNoYXIgKm5hbWUgPSB0YXBlX25hbWUoU1RwKTsgKQorCisJaWYgKFNUcC0+cmVhZHkgIT0gU1RfUkVBRFkpCisJCXJldHVybiAoLUVJTyk7CisKKwlyZXN1bHQgPSByZWFkX21vZGVfcGFnZShTVHAsIFBBUlRfUEFHRSwgMSk7CisKKwlpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENhbid0IHJlYWQgbWVkaXVtIHBhcnRpdGlvbiBwYWdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CisJCXJlc3VsdCA9ICgtRUlPKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5iX2RhdGFbTU9ERV9IRUFERVJfTEVOR1RIICsKKwkJCQkJICAgICAgUFBfT0ZGX05CUl9BRERfUEFSVFNdICsgMTsKKyAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogTnVtYmVyIG9mIHBhcnRpdGlvbnMgJWQuXG4iLCBuYW1lLCByZXN1bHQpKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFBhcnRpdGlvbiB0aGUgdGFwZSBpbnRvIHR3byBwYXJ0aXRpb25zIGlmIHNpemUgPiAwIG9yIG9uZSBwYXJ0aXRpb24gaWYKKyAgIHNpemUgPT0gMC4KKworICAgVGhlIGJsb2NrIGRlc2NyaXB0b3JzIGFyZSByZWFkIGFuZCB3cml0dGVuIGJlY2F1c2UgU29ueSBTRFQtNzAwMCBkb2VzIG5vdAorICAgd29yayB3aXRob3V0IHRoaXMgKHN1Z2dlc3Rpb24gZnJvbSBNaWNoYWVsIFNjaGFlZmVyIDxNaWNoYWVsLlNjaGFlZmVyQGRsci5kZT4pLgorCisgICBNeSBIUCBDMTUzM0EgZHJpdmUgcmV0dXJucyBvbmx5IG9uZSBwYXJ0aXRpb24gc2l6ZSBmaWVsZC4gVGhpcyBpcyB1c2VkIHRvCisgICBzZXQgdGhlIHNpemUgb2YgcGFydGl0aW9uIDEuIFRoZXJlIGlzIG5vIHNpemUgZmllbGQgZm9yIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KKyAgIE1pY2hhZWwgU2NoYWVmZXIncyBTb255IFNEVC03MDAwIHJldHVybnMgdHdvIGRlc2NyaXB0b3JzIGFuZCB0aGUgc2Vjb25kIGlzCisgICB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiBwYXJ0aXRpb24gMSAodGhpcyBpcyB3aGF0IHRoZSBTQ1NJLTMgc3RhbmRhcmQgc3BlY2lmaWVzKS4KKyAgIFRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIGlzIHVzZWQgdG8gYWNjb21tb2RhdGUgYm90aCBkcml2ZXM6IGlmIHRoZSBudW1iZXIgb2YKKyAgIHBhcnRpdGlvbiBzaXplIGZpZWxkcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFydGl0aW9ucworICAgaW4gdGhlIG1vZGUgcGFnZSwgdGhlIHNlY29uZCBmaWVsZCBpcyB1c2VkLiBPdGhlcndpc2UgdGhlIGZpcnN0IGZpZWxkIGlzIHVzZWQuCisKKyAgIEZvciBTZWFnYXRlIEREUyBkcml2ZXMgdGhlIHBhZ2UgbGVuZ3RoIG11c3QgYmUgOCB3aGVuIG5vIHBhcnRpdGlvbnMgaXMgZGVmaW5lZAorICAgYW5kIDEwIHdoZW4gMSBwYXJ0aXRpb24gaXMgZGVmaW5lZCAoaW5mb3JtYXRpb24gZnJvbSBFcmljIExlZSBHcmVlbikuIFRoaXMgaXMKKyAgIGlzIGFjY2VwdGFibGUgYWxzbyB0byBzb21lIG90aGVyIG9sZCBkcml2ZXMgYW5kIGVuZm9yY2VkIGlmIHRoZSBmaXJzdCBwYXJ0aXRpb24KKyAgIHNpemUgZmllbGQgaXMgdXNlZCBmb3IgdGhlIGZpcnN0IGFkZGl0aW9uYWwgcGFydGl0aW9uIHNpemUuCisgKi8KK3N0YXRpYyBpbnQgcGFydGl0aW9uX3RhcGUoc3RydWN0IHNjc2lfdGFwZSAqU1RwLCBpbnQgc2l6ZSkKK3sKKwljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7CisJaW50IHJlc3VsdDsKKwlpbnQgcGdvLCBwc2RfY250LCBwc2RvOworCXVuc2lnbmVkIGNoYXIgKmJwOworCisJcmVzdWx0ID0gcmVhZF9tb2RlX3BhZ2UoU1RwLCBQQVJUX1BBR0UsIDApOworCWlmIChyZXN1bHQpIHsKKwkJREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IENhbid0IHJlYWQgcGFydGl0aW9uIG1vZGUgcGFnZS5cbiIsIG5hbWUpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogVGhlIG1vZGUgcGFnZSBpcyBpbiB0aGUgYnVmZmVyLiBMZXQncyBtb2RpZnkgaXQgYW5kIHdyaXRlIGl0LiAqLworCWJwID0gKFNUcC0+YnVmZmVyKS0+Yl9kYXRhOworCXBnbyA9IE1PREVfSEVBREVSX0xFTkdUSCArIGJwW01IX09GRl9CREVTQ1NfTEVOR1RIXTsKKwlERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogUGFydGl0aW9uIHBhZ2UgbGVuZ3RoIGlzICVkIGJ5dGVzLlxuIiwKKwkJICAgIG5hbWUsIGJwW3BnbyArIE1QX09GRl9QQUdFX0xFTkdUSF0gKyAyKSk7CisKKwlwc2RfY250ID0gKGJwW3BnbyArIE1QX09GRl9QQUdFX0xFTkdUSF0gKyAyIC0gUEFSVF9QQUdFX0ZJWEVEX0xFTkdUSCkgLyAyOworCXBzZG8gPSBwZ28gKyBQQVJUX1BBR0VfRklYRURfTEVOR1RIOworCWlmIChwc2RfY250ID4gYnBbcGdvICsgUFBfT0ZGX01BWF9BRERfUEFSVFNdKSB7CisJCWJwW3BzZG9dID0gYnBbcHNkbyArIDFdID0gMHhmZjsgIC8qIFJlc3Qgb2YgdGhlIHRhcGUgKi8KKwkJcHNkbyArPSAyOworCX0KKwltZW1zZXQoYnAgKyBwc2RvLCAwLCBicFtwZ28gKyBQUF9PRkZfTkJSX0FERF9QQVJUU10gKiAyKTsKKworCURFQkMocHJpbnRrKCIlczogcHNkX2NudCAlZCwgbWF4LnBhcnRzICVkLCBuYnJfcGFydHMgJWRcbiIsIG5hbWUsCisJCSAgICBwc2RfY250LCBicFtwZ28gKyBQUF9PRkZfTUFYX0FERF9QQVJUU10sCisJCSAgICBicFtwZ28gKyBQUF9PRkZfTkJSX0FERF9QQVJUU10pKTsKKworCWlmIChzaXplIDw9IDApIHsKKwkJYnBbcGdvICsgUFBfT0ZGX05CUl9BRERfUEFSVFNdID0gMDsKKwkJaWYgKHBzZF9jbnQgPD0gYnBbcGdvICsgUFBfT0ZGX01BWF9BRERfUEFSVFNdKQorCQkgICAgYnBbcGdvICsgTVBfT0ZGX1BBR0VfTEVOR1RIXSA9IDY7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IEZvcm1hdHRpbmcgdGFwZSB3aXRoIG9uZSBwYXJ0aXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKKwl9IGVsc2UgeworCQlicFtwc2RvXSA9IChzaXplID4+IDgpICYgMHhmZjsKKwkJYnBbcHNkbyArIDFdID0gc2l6ZSAmIDB4ZmY7CisJCWJwW3BnbyArIDNdID0gMTsKKwkJaWYgKGJwW3BnbyArIE1QX09GRl9QQUdFX0xFTkdUSF0gPCA4KQorCQkgICAgYnBbcGdvICsgTVBfT0ZGX1BBR0VfTEVOR1RIXSA9IDg7CisgICAgICAgICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogRm9ybWF0dGluZyB0YXBlIHdpdGggdHdvIHBhcnRpdGlvbnMgKDEgPSAlZCBNQikuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNpemUpKTsKKwl9CisJYnBbcGdvICsgUFBfT0ZGX1BBUlRfVU5JVFNdID0gMDsKKwlicFtwZ28gKyBQUF9PRkZfUkVTRVJWRURdID0gMDsKKwlicFtwZ28gKyBQUF9PRkZfRkxBR1NdID0gUFBfQklUX0lEUCB8IFBQX01TS19QU1VNX01COworCisJcmVzdWx0ID0gd3JpdGVfbW9kZV9wYWdlKFNUcCwgUEFSVF9QQUdFLCAxKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQYXJ0aXRpb25pbmcgb2YgdGFwZSBmYWlsZWQuXG4iLCBuYW1lKTsKKwkJcmVzdWx0ID0gKC1FSU8pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisMCisKKworLyogVGhlIGlvY3RsIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgc3RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICB1bnNpZ25lZCBpbnQgY21kX2luLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaSwgY21kX25yLCBjbWRfdHlwZSwgYnQ7CisJaW50IHJldHZhbCA9IDA7CisJdW5zaWduZWQgaW50IGJsazsKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJY2hhciAqbmFtZSA9IHRhcGVfbmFtZShTVHApOworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmU1RwLT5sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworICAgICAgICBERUIoCisJaWYgKGRlYnVnZ2luZyAmJiAhU1RwLT5pbl91c2UpIHsKKwkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBJbmNvcnJlY3QgZGV2aWNlLlxuIiwgbmFtZSk7CisJCXJldHZhbCA9ICgtRUlPKTsKKwkJZ290byBvdXQ7CisJfSApIC8qIGVuZCBERUIgKi8KKworCVNUbSA9ICYoU1RwLT5tb2Rlc1tTVHAtPmN1cnJlbnRfbW9kZV0pOworCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKKworCS8qCisJICogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZXJyb3IgcmVjb3ZlcnksIGRvbid0IGxldCBhbnlvbmUKKwkgKiBlbHNlIHRyeSBhbmQgdXNlIHRoaXMgZGV2aWNlLiAgQWxzbywgaWYgZXJyb3IgcmVjb3ZlcnkgZmFpbHMsIGl0CisJICogbWF5IHRyeSBhbmQgdGFrZSB0aGUgZGV2aWNlIG9mZmxpbmUsIGluIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIKKwkgKiBhY2Nlc3MgdG8gdGhlIGRldmljZSBpcyBwcm9oaWJpdGVkLgorCSAqLworCXJldHZhbCA9IHNjc2lfbm9uYmxvY2thYmxlX2lvY3RsKFNUcC0+ZGV2aWNlLCBjbWRfaW4sIHAsIGZpbGUpOworCWlmICghc2NzaV9ibG9ja193aGVuX3Byb2Nlc3NpbmdfZXJyb3JzKFNUcC0+ZGV2aWNlKSB8fCByZXR2YWwgIT0gLUVOT0RFVikKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gMDsKKworCWNtZF90eXBlID0gX0lPQ19UWVBFKGNtZF9pbik7CisJY21kX25yID0gX0lPQ19OUihjbWRfaW4pOworCisJaWYgKGNtZF90eXBlID09IF9JT0NfVFlQRShNVElPQ1RPUCkgJiYgY21kX25yID09IF9JT0NfTlIoTVRJT0NUT1ApKSB7CisJCXN0cnVjdCBtdG9wIG10YzsKKworCQlpZiAoX0lPQ19TSVpFKGNtZF9pbikgIT0gc2l6ZW9mKG10YykpIHsKKwkJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaSA9IGNvcHlfZnJvbV91c2VyKCZtdGMsIHAsIHNpemVvZihzdHJ1Y3QgbXRvcCkpOworCQlpZiAoaSkgeworCQkJcmV0dmFsID0gKC1FRkFVTFQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UU0VURFJWQlVGRkVSICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBNVFNFVERSVkJVRkZFUiBvbmx5IGFsbG93ZWQgZm9yIHJvb3QuXG4iLCBuYW1lKTsKKwkJCXJldHZhbCA9ICgtRVBFUk0pOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCFTVG0tPmRlZmluZWQgJiYKKwkJICAgIChtdGMubXRfb3AgIT0gTVRTRVREUlZCVUZGRVIgJiYKKwkJICAgICAobXRjLm10X2NvdW50ICYgTVRfU1RfT1BUSU9OUykgPT0gMCkpIHsKKwkJCXJldHZhbCA9ICgtRU5YSU8pOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIVNUcC0+cG9zX3Vua25vd24pIHsKKworCQkJaWYgKFNUcHMtPmVvZiA9PSBTVF9GTV9ISVQpIHsKKwkJCQlpZiAobXRjLm10X29wID09IE1URlNGIHx8IG10Yy5tdF9vcCA9PSBNVEZTRk0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10Yy5tdF9vcCA9PSBNVEVPTSkgeworCQkJCQltdGMubXRfY291bnQgLT0gMTsKKwkJCQkJaWYgKFNUcHMtPmRydl9maWxlID49IDApCisJCQkJCQlTVHBzLT5kcnZfZmlsZSArPSAxOworCQkJCX0gZWxzZSBpZiAobXRjLm10X29wID09IE1UQlNGIHx8IG10Yy5tdF9vcCA9PSBNVEJTRk0pIHsKKwkJCQkJbXRjLm10X2NvdW50ICs9IDE7CisJCQkJCWlmIChTVHBzLT5kcnZfZmlsZSA+PSAwKQorCQkJCQkJU1Rwcy0+ZHJ2X2ZpbGUgKz0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtdGMubXRfb3AgPT0gTVRTRUVLKSB7CisJCQkJLyogT2xkIHBvc2l0aW9uIG11c3QgYmUgcmVzdG9yZWQgaWYgcGFydGl0aW9uIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCAqLworCQkJCWkgPSAhU1RwLT5jYW5fcGFydGl0aW9ucyB8fAorCQkJCSAgICAoU1RwLT5uZXdfcGFydGl0aW9uICE9IFNUcC0+cGFydGl0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJaSA9IG10Yy5tdF9vcCA9PSBNVFJFVyB8fCBtdGMubXRfb3AgPT0gTVRPRkZMIHx8CisJCQkJICAgIG10Yy5tdF9vcCA9PSBNVFJFVEVOIHx8IG10Yy5tdF9vcCA9PSBNVEVPTSB8fAorCQkJCSAgICBtdGMubXRfb3AgPT0gTVRMT0NLIHx8IG10Yy5tdF9vcCA9PSBNVExPQUQgfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1URlNGIHx8IG10Yy5tdF9vcCA9PSBNVEZTRk0gfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1UQlNGIHx8IG10Yy5tdF9vcCA9PSBNVEJTRk0gfHwKKwkJCQkgICAgbXRjLm10X29wID09IE1UQ09NUFJFU1NJT047CisJCQl9CisJCQlpID0gZmx1c2hfYnVmZmVyKFNUcCwgaSk7CisJCQlpZiAoaSA8IDApIHsKKwkJCQlyZXR2YWwgPSBpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKFNUcHMtPnJ3ID09IFNUX1dSSVRJTkcgJiYKKwkJCSAgICAobXRjLm10X29wID09IE1UUkVXIHx8IG10Yy5tdF9vcCA9PSBNVE9GRkwgfHwKKwkJCSAgICAgbXRjLm10X29wID09IE1UU0VFSyB8fAorCQkJICAgICBtdGMubXRfb3AgPT0gTVRCU0YgfHwgbXRjLm10X29wID09IE1UQlNGTSkpIHsKKwkJCQlpID0gc3RfaW50X2lvY3RsKFNUcCwgTVRXRU9GLCAxKTsKKwkJCQlpZiAoaSA8IDApIHsKKwkJCQkJcmV0dmFsID0gaTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmIChtdGMubXRfb3AgPT0gTVRCU0YgfHwgbXRjLm10X29wID09IE1UQlNGTSkKKwkJCQkJbXRjLm10X2NvdW50Kys7CisJCQkJU1Rwcy0+cncgPSBTVF9JRExFOworCQkJICAgICB9CisKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSB3YXMgYSBidXMgcmVzZXQsIGJsb2NrIGZ1cnRoZXIgYWNjZXNzCisJCQkgKiB0byB0aGlzIGRldmljZS4gIElmIHRoZSB1c2VyIHdhbnRzIHRvIHJld2luZCB0aGUgdGFwZSwKKwkJCSAqIHRoZW4gcmVzZXQgdGhlIGZsYWcgYW5kIGFsbG93IGFjY2VzcyBhZ2Fpbi4KKwkJCSAqLworCQkJaWYgKG10Yy5tdF9vcCAhPSBNVFJFVyAmJgorCQkJICAgIG10Yy5tdF9vcCAhPSBNVE9GRkwgJiYKKwkJCSAgICBtdGMubXRfb3AgIT0gTVRSRVRFTiAmJgorCQkJICAgIG10Yy5tdF9vcCAhPSBNVEVSQVNFICYmCisJCQkgICAgbXRjLm10X29wICE9IE1UU0VFSyAmJgorCQkJICAgIG10Yy5tdF9vcCAhPSBNVEVPTSkgeworCQkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJlc2V0X3N0YXRlKFNUcCk7CisJCQkvKiByZW1vdmUgdGhpcyB3aGVuIHRoZSBtaWRsZXZlbCBwcm9wZXJseSBjbGVhcnMgd2FzX3Jlc2V0ICovCisJCQlTVHAtPmRldmljZS0+d2FzX3Jlc2V0ID0gMDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgIT0gTVROT1AgJiYgbXRjLm10X29wICE9IE1UU0VUQkxLICYmCisJCSAgICBtdGMubXRfb3AgIT0gTVRTRVRERU5TSVRZICYmIG10Yy5tdF9vcCAhPSBNVFdTTSAmJgorCQkgICAgbXRjLm10X29wICE9IE1UU0VURFJWQlVGRkVSICYmIG10Yy5tdF9vcCAhPSBNVFNFVFBBUlQpCisJCQlTVHBzLT5ydyA9IFNUX0lETEU7CS8qIFByZXZlbnQgYXV0b21hdGljIFdFT0YgYW5kIGZzZiAqLworCisJCWlmIChtdGMubXRfb3AgPT0gTVRPRkZMICYmIFNUcC0+ZG9vcl9sb2NrZWQgIT0gU1RfVU5MT0NLRUQpCisJCQlkb19kb29yX2xvY2soU1RwLCAwKTsJLyogSWdub3JlIHJlc3VsdCEgKi8KKworCQlpZiAobXRjLm10X29wID09IE1UU0VURFJWQlVGRkVSICYmCisJCSAgICAobXRjLm10X2NvdW50ICYgTVRfU1RfT1BUSU9OUykgIT0gMCkgeworCQkJcmV0dmFsID0gc3Rfc2V0X29wdGlvbnMoU1RwLCBtdGMubXRfY291bnQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UU0VUUEFSVCkgeworCQkJaWYgKCFTVHAtPmNhbl9wYXJ0aXRpb25zIHx8CisJCQkgICAgbXRjLm10X2NvdW50IDwgMCB8fCBtdGMubXRfY291bnQgPj0gU1RfTkJSX1BBUlRJVElPTlMpIHsKKwkJCQlyZXR2YWwgPSAoLUVJTlZBTCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAobXRjLm10X2NvdW50ID49IFNUcC0+bmJyX3BhcnRpdGlvbnMgJiYKKwkJCSAgICAoU1RwLT5uYnJfcGFydGl0aW9ucyA9IG5icl9wYXJ0aXRpb25zKFNUcCkpIDwgMCkgeworCQkJCXJldHZhbCA9ICgtRUlPKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChtdGMubXRfY291bnQgPj0gU1RwLT5uYnJfcGFydGl0aW9ucykgeworCQkJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCVNUcC0+bmV3X3BhcnRpdGlvbiA9IG10Yy5tdF9jb3VudDsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRNS1BBUlQpIHsKKwkJCWlmICghU1RwLT5jYW5fcGFydGl0aW9ucykgeworCQkJCXJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmICgoaSA9IHN0X2ludF9pb2N0bChTVHAsIE1UUkVXLCAwKSkgPCAwIHx8CisJCQkgICAgKGkgPSBwYXJ0aXRpb25fdGFwZShTVHAsIG10Yy5tdF9jb3VudCkpIDwgMCkgeworCQkJCXJldHZhbCA9IGk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgU1RfTkJSX1BBUlRJVElPTlM7IGkrKykgeworCQkJCVNUcC0+cHNbaV0ucncgPSBTVF9JRExFOworCQkJCVNUcC0+cHNbaV0uYXRfc20gPSAwOworCQkJCVNUcC0+cHNbaV0ubGFzdF9ibG9ja192YWxpZCA9IDA7CisJCQl9CisJCQlTVHAtPnBhcnRpdGlvbiA9IFNUcC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJCQlTVHAtPm5icl9wYXJ0aXRpb25zID0gMTsJLyogQmFkIGd1ZXNzID8tKSAqLworCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gU1Rwcy0+ZHJ2X2ZpbGUgPSAwOworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVFNFRUspIHsKKwkJCWkgPSBzZXRfbG9jYXRpb24oU1RwLCBtdGMubXRfY291bnQsIFNUcC0+bmV3X3BhcnRpdGlvbiwgMCk7CisJCQlpZiAoIVNUcC0+Y2FuX3BhcnRpdGlvbnMpCisJCQkJU1RwLT5wc1swXS5ydyA9IFNUX0lETEU7CisJCQlyZXR2YWwgPSBpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UVU5MT0FEIHx8IG10Yy5tdF9vcCA9PSBNVE9GRkwpIHsKKwkJCXJldHZhbCA9IGRvX2xvYWRfdW5sb2FkKFNUcCwgZmlsZSwgMCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtdGMubXRfb3AgPT0gTVRMT0FEKSB7CisJCQlyZXR2YWwgPSBkb19sb2FkX3VubG9hZChTVHAsIGZpbGUsIG1heCgxLCBtdGMubXRfY291bnQpKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKG10Yy5tdF9vcCA9PSBNVExPQ0sgfHwgbXRjLm10X29wID09IE1UVU5MT0NLKSB7CisJCQlyZXR2YWwgPSBkb19kb29yX2xvY2soU1RwLCAobXRjLm10X29wID09IE1UTE9DSykpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucyAmJiBTVHAtPnJlYWR5ID09IFNUX1JFQURZICYmCisJCSAgICAoaSA9IHN3aXRjaF9wYXJ0aXRpb24oU1RwKSkgPCAwKSB7CisJCQlyZXR2YWwgPSBpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobXRjLm10X29wID09IE1UQ09NUFJFU1NJT04pCisJCQlyZXR2YWwgPSBzdF9jb21wcmVzc2lvbihTVHAsIChtdGMubXRfY291bnQgJiAxKSk7CisJCWVsc2UKKwkJCXJldHZhbCA9IHN0X2ludF9pb2N0bChTVHAsIG10Yy5tdF9vcCwgbXRjLm10X2NvdW50KTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghU1RtLT5kZWZpbmVkKSB7CisJCXJldHZhbCA9ICgtRU5YSU8pOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGkgPSBmbHVzaF9idWZmZXIoU1RwLCAwKSkgPCAwKSB7CisJCXJldHZhbCA9IGk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoU1RwLT5jYW5fcGFydGl0aW9ucyAmJgorCSAgICAoaSA9IHN3aXRjaF9wYXJ0aXRpb24oU1RwKSkgPCAwKSB7CisJCXJldHZhbCA9IGk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjbWRfdHlwZSA9PSBfSU9DX1RZUEUoTVRJT0NHRVQpICYmIGNtZF9uciA9PSBfSU9DX05SKE1USU9DR0VUKSkgeworCQlzdHJ1Y3QgbXRnZXQgbXRfc3RhdHVzOworCisJCWlmIChfSU9DX1NJWkUoY21kX2luKSAhPSBzaXplb2Yoc3RydWN0IG10Z2V0KSkgeworCQkJIHJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCSBnb3RvIG91dDsKKwkJfQorCisJCW10X3N0YXR1cy5tdF90eXBlID0gU1RwLT50YXBlX3R5cGU7CisJCW10X3N0YXR1cy5tdF9kc3JlZyA9CisJCSAgICAoKFNUcC0+YmxvY2tfc2l6ZSA8PCBNVF9TVF9CTEtTSVpFX1NISUZUKSAmIE1UX1NUX0JMS1NJWkVfTUFTSykgfAorCQkgICAgKChTVHAtPmRlbnNpdHkgPDwgTVRfU1RfREVOU0lUWV9TSElGVCkgJiBNVF9TVF9ERU5TSVRZX01BU0spOworCQltdF9zdGF0dXMubXRfYmxrbm8gPSBTVHBzLT5kcnZfYmxvY2s7CisJCW10X3N0YXR1cy5tdF9maWxlbm8gPSBTVHBzLT5kcnZfZmlsZTsKKwkJaWYgKFNUcC0+YmxvY2tfc2l6ZSAhPSAwKSB7CisJCQlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORykKKwkJCQltdF9zdGF0dXMubXRfYmxrbm8gKz0KKwkJCQkgICAgKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzIC8gU1RwLT5ibG9ja19zaXplOworCQkJZWxzZSBpZiAoU1Rwcy0+cncgPT0gU1RfUkVBRElORykKKwkJCQltdF9zdGF0dXMubXRfYmxrbm8gLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNUcC0+YnVmZmVyKS0+YnVmZmVyX2J5dGVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RwLT5ibG9ja19zaXplIC0gMSkgLyBTVHAtPmJsb2NrX3NpemU7CisJCX0KKworCQltdF9zdGF0dXMubXRfZ3N0YXQgPSAwOworCQlpZiAoU1RwLT5kcnZfd3JpdGVfcHJvdCkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfV1JfUFJPVCgweGZmZmZmZmZmKTsKKwkJaWYgKG10X3N0YXR1cy5tdF9ibGtubyA9PSAwKSB7CisJCQlpZiAobXRfc3RhdHVzLm10X2ZpbGVubyA9PSAwKQorCQkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfQk9UKDB4ZmZmZmZmZmYpOworCQkJZWxzZQorCQkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRU9GKDB4ZmZmZmZmZmYpOworCQl9CisJCW10X3N0YXR1cy5tdF9lcnJlZyA9IChTVHAtPnJlY292ZXJfcmVnIDw8IE1UX1NUX1NPRlRFUlJfU0hJRlQpOworCQltdF9zdGF0dXMubXRfcmVzaWQgPSBTVHAtPnBhcnRpdGlvbjsKKwkJaWYgKFNUcHMtPmVvZiA9PSBTVF9FT01fT0sgfHwgU1Rwcy0+ZW9mID09IFNUX0VPTV9FUlJPUikKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRU9UKDB4ZmZmZmZmZmYpOworCQllbHNlIGlmIChTVHBzLT5lb2YgPj0gU1RfRU9NX09LKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9FT0QoMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPmRlbnNpdHkgPT0gMSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfRF84MDAoMHhmZmZmZmZmZik7CisJCWVsc2UgaWYgKFNUcC0+ZGVuc2l0eSA9PSAyKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9EXzE2MDAoMHhmZmZmZmZmZik7CisJCWVsc2UgaWYgKFNUcC0+ZGVuc2l0eSA9PSAzKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9EXzYyNTAoMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPnJlYWR5ID09IFNUX1JFQURZKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9PTkxJTkUoMHhmZmZmZmZmZik7CisJCWlmIChTVHAtPnJlYWR5ID09IFNUX05PX1RBUEUpCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0RSX09QRU4oMHhmZmZmZmZmZik7CisJCWlmIChTVHBzLT5hdF9zbSkKKwkJCW10X3N0YXR1cy5tdF9nc3RhdCB8PSBHTVRfU00oMHhmZmZmZmZmZik7CisJCWlmIChTVG0tPmRvX2FzeW5jX3dyaXRlcyB8fAorICAgICAgICAgICAgICAgICAgICAoU1RtLT5kb19idWZmZXJfd3JpdGVzICYmIFNUcC0+YmxvY2tfc2l6ZSAhPSAwKSB8fAorCQkgICAgU1RwLT5kcnZfYnVmZmVyICE9IDApCisJCQltdF9zdGF0dXMubXRfZ3N0YXQgfD0gR01UX0lNX1JFUF9FTigweGZmZmZmZmZmKTsKKwkJaWYgKFNUcC0+Y2xlYW5pbmdfcmVxKQorCQkJbXRfc3RhdHVzLm10X2dzdGF0IHw9IEdNVF9DTE4oMHhmZmZmZmZmZik7CisKKwkJaSA9IGNvcHlfdG9fdXNlcihwLCAmbXRfc3RhdHVzLCBzaXplb2Yoc3RydWN0IG10Z2V0KSk7CisJCWlmIChpKSB7CisJCQlyZXR2YWwgPSAoLUVGQVVMVCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCVNUcC0+cmVjb3Zlcl9yZWcgPSAwOwkJLyogQ2xlYXIgYWZ0ZXIgcmVhZCAqLworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CQkJLyogRW5kIG9mIE1USU9DR0VUICovCisJaWYgKGNtZF90eXBlID09IF9JT0NfVFlQRShNVElPQ1BPUykgJiYgY21kX25yID09IF9JT0NfTlIoTVRJT0NQT1MpKSB7CisJCXN0cnVjdCBtdHBvcyBtdF9wb3M7CisJCWlmIChfSU9DX1NJWkUoY21kX2luKSAhPSBzaXplb2Yoc3RydWN0IG10cG9zKSkgeworCQkJIHJldHZhbCA9ICgtRUlOVkFMKTsKKwkJCSBnb3RvIG91dDsKKwkJfQorCQlpZiAoKGkgPSBnZXRfbG9jYXRpb24oU1RwLCAmYmxrLCAmYnQsIDApKSA8IDApIHsKKwkJCXJldHZhbCA9IGk7CisJCQlnb3RvIG91dDsKKwkJfQorCQltdF9wb3MubXRfYmxrbm8gPSBibGs7CisJCWkgPSBjb3B5X3RvX3VzZXIocCwgJm10X3Bvcywgc2l6ZW9mKHN0cnVjdCBtdHBvcykpOworCQlpZiAoaSkKKwkJCXJldHZhbCA9ICgtRUZBVUxUKTsKKwkJZ290byBvdXQ7CisJfQorCXVwKCZTVHAtPmxvY2spOworCXN3aXRjaCAoY21kX2luKSB7CisJCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJCWNhc2UgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCWkgPSAtRVBFUk07CisJCQllbHNlCisJCQkJaSA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIFNUcC0+ZGlzaywgY21kX2luLCBwKTsKKwkJCWlmIChpICE9IC1FTk9UVFkpCisJCQkJcmV0dXJuIGk7CisJCQlicmVhazsKKwl9CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmCisJICAgIChjbWRfaW4gPT0gU0NTSV9JT0NUTF9TVEFSVF9VTklUIHx8IGNtZF9pbiA9PSBTQ1NJX0lPQ1RMX1NUT1BfVU5JVCkpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIHNjc2lfaW9jdGwoU1RwLT5kZXZpY2UsIGNtZF9pbiwgcCk7CisKKyBvdXQ6CisJdXAoJlNUcC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIHN0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IFNUcC0+ZGV2aWNlOworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CisJaWYgKHNkZXYtPmhvc3QtPmhvc3R0LT5jb21wYXRfaW9jdGwpIHsgCisKKwkJcmV0ID0gc2Rldi0+aG9zdC0+aG9zdHQtPmNvbXBhdF9pb2N0bChzZGV2LCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisMCisKKy8qIFRyeSB0byBhbGxvY2F0ZSBhIG5ldyB0YXBlIGJ1ZmZlci4gQ2FsbGluZyBmdW5jdGlvbiBtdXN0IG5vdCBob2xkCisgICBkZXZfYXJyX2xvY2suICovCitzdGF0aWMgc3RydWN0IHN0X2J1ZmZlciAqCisgbmV3X3RhcGVfYnVmZmVyKGludCBmcm9tX2luaXRpYWxpemF0aW9uLCBpbnQgbmVlZF9kbWEsIGludCBtYXhfc2cpCit7CisJaW50IGksIHByaW9yaXR5LCBnb3QgPSAwLCBzZWdzID0gMDsKKwlzdHJ1Y3Qgc3RfYnVmZmVyICp0YjsKKworCWlmIChmcm9tX2luaXRpYWxpemF0aW9uKQorCQlwcmlvcml0eSA9IEdGUF9BVE9NSUM7CisJZWxzZQorCQlwcmlvcml0eSA9IEdGUF9LRVJORUw7CisKKwlpID0gc2l6ZW9mKHN0cnVjdCBzdF9idWZmZXIpICsgKG1heF9zZyAtIDEpICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKworCQltYXhfc2cgKiBzaXplb2Yoc3RydWN0IHN0X2J1Zl9mcmFnbWVudCk7CisJdGIgPSBrbWFsbG9jKGksIHByaW9yaXR5KTsKKwlpZiAoIXRiKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAic3Q6IENhbid0IGFsbG9jYXRlIG5ldyB0YXBlIGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHRiLCAwLCBpKTsKKwl0Yi0+ZnJwX3NlZ3MgPSB0Yi0+b3JpZ19mcnBfc2VncyA9IHNlZ3M7CisJdGItPnVzZV9zZyA9IG1heF9zZzsKKwlpZiAoc2VncyA+IDApCisJCXRiLT5iX2RhdGEgPSBwYWdlX2FkZHJlc3ModGItPnNnWzBdLnBhZ2UpOworCXRiLT5mcnAgPSAoc3RydWN0IHN0X2J1Zl9mcmFnbWVudCAqKSgmKHRiLT5zZ1swXSkgKyBtYXhfc2cpOworCisJdGItPmluX3VzZSA9IDE7CisJdGItPmRtYSA9IG5lZWRfZG1hOworCXRiLT5idWZmZXJfc2l6ZSA9IGdvdDsKKworCXJldHVybiB0YjsKK30KKworCisvKiBUcnkgdG8gYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIHRoZSB0YXBlIGJ1ZmZlciAqLworc3RhdGljIGludCBlbmxhcmdlX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogU1RidWZmZXIsIGludCBuZXdfc2l6ZSwgaW50IG5lZWRfZG1hKQoreworCWludCBzZWdzLCBuYnIsIG1heF9zZWdzLCBiX3NpemUsIHByaW9yaXR5LCBvcmRlciwgZ290OworCisJaWYgKG5ld19zaXplIDw9IFNUYnVmZmVyLT5idWZmZXJfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoU1RidWZmZXItPmJ1ZmZlcl9zaXplIDw9IFBBR0VfU0laRSkKKwkJbm9ybWFsaXplX2J1ZmZlcihTVGJ1ZmZlcik7ICAvKiBBdm9pZCBleHRyYSBzZWdtZW50ICovCisKKwltYXhfc2VncyA9IFNUYnVmZmVyLT51c2Vfc2c7CisJbmJyID0gbWF4X3NlZ3MgLSBTVGJ1ZmZlci0+ZnJwX3NlZ3M7CisJaWYgKG5iciA8PSAwKQorCQlyZXR1cm4gMDsKKworCXByaW9yaXR5ID0gR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTjsKKwlpZiAobmVlZF9kbWEpCisJCXByaW9yaXR5IHw9IEdGUF9ETUE7CisJZm9yIChiX3NpemUgPSBQQUdFX1NJWkUsIG9yZGVyPTA7CisJICAgICBiX3NpemUgPCBuZXdfc2l6ZSAtIFNUYnVmZmVyLT5idWZmZXJfc2l6ZTsKKwkgICAgIG9yZGVyKyssIGJfc2l6ZSAqPSAyKQorCQk7ICAvKiBlbXB0eSAqLworCisJZm9yIChzZWdzID0gU1RidWZmZXItPmZycF9zZWdzLCBnb3QgPSBTVGJ1ZmZlci0+YnVmZmVyX3NpemU7CisJICAgICBzZWdzIDwgbWF4X3NlZ3MgJiYgZ290IDwgbmV3X3NpemU7KSB7CisJCVNUYnVmZmVyLT5mcnBbc2Vnc10ucGFnZSA9IGFsbG9jX3BhZ2VzKHByaW9yaXR5LCBvcmRlcik7CisJCWlmIChTVGJ1ZmZlci0+ZnJwW3NlZ3NdLnBhZ2UgPT0gTlVMTCkgeworCQkJaWYgKG5ld19zaXplIC0gZ290IDw9IChtYXhfc2VncyAtIHNlZ3MpICogYl9zaXplIC8gMikgeworCQkJCWJfc2l6ZSAvPSAyOyAvKiBMYXJnZSBlbm91Z2ggZm9yIHRoZSByZXN0IG9mIHRoZSBidWZmZXJzICovCisJCQkJb3JkZXItLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCURFQihTVGJ1ZmZlci0+YnVmZmVyX3NpemUgPSBnb3QpOworCQkJbm9ybWFsaXplX2J1ZmZlcihTVGJ1ZmZlcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlTVGJ1ZmZlci0+ZnJwW3NlZ3NdLmxlbmd0aCA9IGJfc2l6ZTsKKwkJU1RidWZmZXItPmZycF9zZWdzICs9IDE7CisJCWdvdCArPSBiX3NpemU7CisJCVNUYnVmZmVyLT5idWZmZXJfc2l6ZSA9IGdvdDsKKwkJc2VncysrOworCX0KKwlTVGJ1ZmZlci0+Yl9kYXRhID0gcGFnZV9hZGRyZXNzKFNUYnVmZmVyLT5mcnBbMF0ucGFnZSk7CisKKwlyZXR1cm4gMTsKK30KKworCisvKiBSZWxlYXNlIHRoZSBleHRyYSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqIFNUYnVmZmVyKQoreworCWludCBpLCBvcmRlcjsKKworCWZvciAoaSA9IFNUYnVmZmVyLT5vcmlnX2ZycF9zZWdzOyBpIDwgU1RidWZmZXItPmZycF9zZWdzOyBpKyspIHsKKwkJb3JkZXIgPSBnZXRfb3JkZXIoU1RidWZmZXItPmZycFtpXS5sZW5ndGgpOworCQlfX2ZyZWVfcGFnZXMoU1RidWZmZXItPmZycFtpXS5wYWdlLCBvcmRlcik7CisJCVNUYnVmZmVyLT5idWZmZXJfc2l6ZSAtPSBTVGJ1ZmZlci0+ZnJwW2ldLmxlbmd0aDsKKwl9CisJU1RidWZmZXItPmZycF9zZWdzID0gU1RidWZmZXItPm9yaWdfZnJwX3NlZ3M7CisJU1RidWZmZXItPmZycF9zZ19jdXJyZW50ID0gMDsKK30KKworCisvKiBNb3ZlIGRhdGEgZnJvbSB0aGUgdXNlciBidWZmZXIgdG8gdGhlIHRhcGUgYnVmZmVyLiBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yCisgICBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLworc3RhdGljIGludCBhcHBlbmRfdG9fYnVmZmVyKGNvbnN0IGNoYXIgX191c2VyICp1YnAsIHN0cnVjdCBzdF9idWZmZXIgKiBzdF9icCwgaW50IGRvX2NvdW50KQoreworCWludCBpLCBjbnQsIHJlcywgb2Zmc2V0OworCisJZm9yIChpID0gMCwgb2Zmc2V0ID0gc3RfYnAtPmJ1ZmZlcl9ieXRlczsKKwkgICAgIGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgb2Zmc2V0ID49IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOyBpKyspCisJCW9mZnNldCAtPSBzdF9icC0+ZnJwW2ldLmxlbmd0aDsKKwlpZiAoaSA9PSBzdF9icC0+ZnJwX3NlZ3MpIHsJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzdDogYXBwZW5kX3RvX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKKwkJcmV0dXJuICgtRUlPKTsKKwl9CisJZm9yICg7IGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKKwkJY250ID0gc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/CisJCSAgICBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50OworCQlyZXMgPSBjb3B5X2Zyb21fdXNlcihwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtpXS5wYWdlKSArIG9mZnNldCwgdWJwLCBjbnQpOworCQlpZiAocmVzKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJZG9fY291bnQgLT0gY250OworCQlzdF9icC0+YnVmZmVyX2J5dGVzICs9IGNudDsKKwkJdWJwICs9IGNudDsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJaWYgKGRvX2NvdW50KSAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXJldHVybiAoLUVJTyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBNb3ZlIGRhdGEgZnJvbSB0aGUgdGFwZSBidWZmZXIgdG8gdGhlIHVzZXIgYnVmZmVyLiBSZXR1cm5zIHplcm8gKHN1Y2Nlc3MpIG9yCisgICBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLworc3RhdGljIGludCBmcm9tX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogc3RfYnAsIGNoYXIgX191c2VyICp1YnAsIGludCBkb19jb3VudCkKK3sKKwlpbnQgaSwgY250LCByZXMsIG9mZnNldDsKKworCWZvciAoaSA9IDAsIG9mZnNldCA9IHN0X2JwLT5yZWFkX3BvaW50ZXI7CisJICAgICBpIDwgc3RfYnAtPmZycF9zZWdzICYmIG9mZnNldCA+PSBzdF9icC0+ZnJwW2ldLmxlbmd0aDsgaSsrKQorCQlvZmZzZXQgLT0gc3RfYnAtPmZycFtpXS5sZW5ndGg7CisJaWYgKGkgPT0gc3RfYnAtPmZycF9zZWdzKSB7CS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Q6IGZyb21fYnVmZmVyIG9mZnNldCBvdmVyZmxvdy5cbiIpOworCQlyZXR1cm4gKC1FSU8pOworCX0KKwlmb3IgKDsgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBkb19jb3VudCA+IDA7IGkrKykgeworCQljbnQgPSBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8KKwkJICAgIHN0X2JwLT5mcnBbaV0ubGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7CisJCXJlcyA9IGNvcHlfdG9fdXNlcih1YnAsIHBhZ2VfYWRkcmVzcyhzdF9icC0+ZnJwW2ldLnBhZ2UpICsgb2Zmc2V0LCBjbnQpOworCQlpZiAocmVzKQorCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJZG9fY291bnQgLT0gY250OworCQlzdF9icC0+YnVmZmVyX2J5dGVzIC09IGNudDsKKwkJc3RfYnAtPnJlYWRfcG9pbnRlciArPSBjbnQ7CisJCXVicCArPSBjbnQ7CisJCW9mZnNldCA9IDA7CisJfQorCWlmIChkb19jb3VudCkgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlyZXR1cm4gKC1FSU8pOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTW92ZSBkYXRhIHRvd2FyZHMgc3RhcnQgb2YgYnVmZmVyICovCitzdGF0aWMgdm9pZCBtb3ZlX2J1ZmZlcl9kYXRhKHN0cnVjdCBzdF9idWZmZXIgKiBzdF9icCwgaW50IG9mZnNldCkKK3sKKwlpbnQgc3JjX3NlZywgZHN0X3NlZywgc3JjX29mZnNldCA9IDAsIGRzdF9vZmZzZXQ7CisJaW50IGNvdW50LCB0b3RhbDsKKworCWlmIChvZmZzZXQgPT0gMCkKKwkJcmV0dXJuOworCisJdG90YWw9c3RfYnAtPmJ1ZmZlcl9ieXRlcyAtIG9mZnNldDsKKwlmb3IgKHNyY19zZWc9MDsgc3JjX3NlZyA8IHN0X2JwLT5mcnBfc2Vnczsgc3JjX3NlZysrKSB7CisJCXNyY19vZmZzZXQgPSBvZmZzZXQ7CisJCWlmIChzcmNfb2Zmc2V0IDwgc3RfYnAtPmZycFtzcmNfc2VnXS5sZW5ndGgpCisJCQlicmVhazsKKwkJb2Zmc2V0IC09IHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoOworCX0KKworCXN0X2JwLT5idWZmZXJfYnl0ZXMgPSBzdF9icC0+cmVhZF9wb2ludGVyID0gdG90YWw7CisJZm9yIChkc3Rfc2VnPWRzdF9vZmZzZXQ9MDsgdG90YWwgPiAwOyApIHsKKwkJY291bnQgPSBtaW4oc3RfYnAtPmZycFtkc3Rfc2VnXS5sZW5ndGggLSBkc3Rfb2Zmc2V0LAorCQkJICAgIHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoIC0gc3JjX29mZnNldCk7CisJCW1lbW1vdmUocGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbZHN0X3NlZ10ucGFnZSkgKyBkc3Rfb2Zmc2V0LAorCQkJcGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbc3JjX3NlZ10ucGFnZSkgKyBzcmNfb2Zmc2V0LCBjb3VudCk7CisJCXNyY19vZmZzZXQgKz0gY291bnQ7CisJCWlmIChzcmNfb2Zmc2V0ID49IHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoKSB7CisJCQlzcmNfc2VnKys7CisJCQlzcmNfb2Zmc2V0ID0gMDsKKwkJfQorCQlkc3Rfb2Zmc2V0ICs9IGNvdW50OworCQlpZiAoZHN0X29mZnNldCA+PSBzdF9icC0+ZnJwW2RzdF9zZWddLmxlbmd0aCkgeworCQkJZHN0X3NlZysrOworCQkJZHN0X29mZnNldCA9IDA7CisJCX0KKwkJdG90YWwgLT0gY291bnQ7CisJfQorfQorCisKKy8qIEZpbGwgdGhlIHMvZyBsaXN0IHVwIHRvIHRoZSBsZW5ndGggcmVxdWlyZWQgZm9yIHRoaXMgdHJhbnNmZXIgKi8KK3N0YXRpYyB2b2lkIGJ1Zl90b19zZyhzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBjb3VudDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBzdF9idWZfZnJhZ21lbnQgKmZycDsKKworCWlmIChsZW5ndGggPT0gU1RicC0+ZnJwX3NnX2N1cnJlbnQpCisJCXJldHVybjsgICAvKiB3b3JrIGFscmVhZHkgZG9uZSAqLworCisJc2cgPSAmKFNUYnAtPnNnWzBdKTsKKwlmcnAgPSBTVGJwLT5mcnA7CisJZm9yIChpPWNvdW50PTA7IGNvdW50IDwgbGVuZ3RoOyBpKyspIHsKKwkJc2dbaV0ucGFnZSA9IGZycFtpXS5wYWdlOworCQlpZiAobGVuZ3RoIC0gY291bnQgPiBmcnBbaV0ubGVuZ3RoKQorCQkJc2dbaV0ubGVuZ3RoID0gZnJwW2ldLmxlbmd0aDsKKwkJZWxzZQorCQkJc2dbaV0ubGVuZ3RoID0gbGVuZ3RoIC0gY291bnQ7CisJCWNvdW50ICs9IHNnW2ldLmxlbmd0aDsKKwkJc2dbaV0ub2Zmc2V0ID0gMDsKKwl9CisJU1RicC0+c2dfc2VncyA9IGk7CisJU1RicC0+ZnJwX3NnX2N1cnJlbnQgPSBsZW5ndGg7Cit9CisKKworLyogVmFsaWRhdGUgdGhlIG9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUgb3IgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB2b2lkIHZhbGlkYXRlX29wdGlvbnModm9pZCkKK3sKKwlpZiAoYnVmZmVyX2ticyA+IDApCisJCXN0X2ZpeGVkX2J1ZmZlcl9zaXplID0gYnVmZmVyX2ticyAqIFNUX0tJTE9CWVRFOworCWlmIChtYXhfc2dfc2VncyA+PSBTVF9GSVJTVF9TRykKKwkJc3RfbWF4X3NnX3NlZ3MgPSBtYXhfc2dfc2VnczsKK30KKworI2lmbmRlZiBNT0RVTEUKKy8qIFNldCB0aGUgYm9vdCBvcHRpb25zLiBTeW50YXggaXMgZGVmaW5lZCBpbiBEb2N1bWVuYXRpb24vc2NzaS9zdC50eHQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaSwgbGVuLCBpbnRzWzVdOworCWNoYXIgKnN0cDsKKworCXN0cCA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpZiAoaW50c1swXSA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGludHNbMF0gJiYgaSA8IEFSUkFZX1NJWkUocGFybXMpOyBpKyspCisJCQlpZiAocGFybXNbaV0udmFsKQorCQkJCSpwYXJtc1tpXS52YWwgPSBpbnRzW2kgKyAxXTsKKwl9IGVsc2UgeworCQl3aGlsZSAoc3RwICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhcm1zKTsgaSsrKSB7CisJCQkJbGVuID0gc3RybGVuKHBhcm1zW2ldLm5hbWUpOworCQkJCWlmICghc3RybmNtcChzdHAsIHBhcm1zW2ldLm5hbWUsIGxlbikgJiYKKwkJCQkgICAgKCooc3RwICsgbGVuKSA9PSAnOicgfHwgKihzdHAgKyBsZW4pID09ICc9JykpIHsKKwkJCQkJaWYgKHBhcm1zW2ldLnZhbCkKKwkJCQkJCSpwYXJtc1tpXS52YWwgPQorCQkJCQkJCXNpbXBsZV9zdHJ0b3VsKHN0cCArIGxlbiArIDEsIE5VTEwsIDApOworCQkJCQllbHNlCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzdDogT2Jzb2xldGUgcGFyYW1ldGVyICVzXG4iLAorCQkJCQkJICAgICAgIHBhcm1zW2ldLm5hbWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA+PSBzaXplb2YocGFybXMpIC8gc2l6ZW9mKHN0cnVjdCBzdF9kZXZfcGFybSkpCisJCQkJIHByaW50ayhLRVJOX1dBUk5JTkcgInN0OiBpbnZhbGlkIHBhcmFtZXRlciBpbiAnJXMnXG4iLAorCQkJCQlzdHApOworCQkJc3RwID0gc3RyY2hyKHN0cCwgJywnKTsKKwkJCWlmIChzdHApCisJCQkJc3RwKys7CisJCX0KKwl9CisKKwl2YWxpZGF0ZV9vcHRpb25zKCk7CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgic3Q9Iiwgc3Rfc2V0dXApOworCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RfZm9wcyA9Cit7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlYWQgPQkJc3RfcmVhZCwKKwkud3JpdGUgPQlzdF93cml0ZSwKKwkuaW9jdGwgPQlzdF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IHN0X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5vcGVuID0JCXN0X29wZW4sCisJLmZsdXNoID0Jc3RfZmx1c2gsCisJLnJlbGVhc2UgPQlzdF9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzdF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpTRHAgPSB0b19zY3NpX2RldmljZShkZXYpOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gTlVMTDsKKwlzdHJ1Y3QgY2RldiAqY2RldiA9IE5VTEw7CisJc3RydWN0IHNjc2lfdGFwZSAqdHBudCA9IE5VTEw7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbTsKKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgKlNUcHM7CisJc3RydWN0IHN0X2J1ZmZlciAqYnVmZmVyOworCWludCBpLCBqLCBtb2RlLCBkZXZfbnVtLCBlcnJvcjsKKwljaGFyICpzdHA7CisJdTY0IGJvdW5jZV9saW1pdDsKKworCWlmIChTRHAtPnR5cGUgIT0gVFlQRV9UQVBFKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoKHN0cCA9IHN0X2luY29tcGF0aWJsZShTRHApKSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAic3Q6IEZvdW5kIGluY29tcGF0aWJsZSB0YXBlIGF0IHNjc2klZCwgY2hhbm5lbCAlZCwgaWQgJWQsIGx1biAlZFxuIiwKKwkJICAgICAgIFNEcC0+aG9zdC0+aG9zdF9ubywgU0RwLT5jaGFubmVsLCBTRHAtPmlkLCBTRHAtPmx1bik7CisJCXByaW50ayhLRVJOX0lORk8gInN0OiBUaGUgc3VnZ2VzdGVkIGRyaXZlciBpcyAlcy5cbiIsIHN0cCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWkgPSBTRHAtPmhvc3QtPnNnX3RhYmxlc2l6ZTsKKwlpZiAoc3RfbWF4X3NnX3NlZ3MgPCBpKQorCQlpID0gc3RfbWF4X3NnX3NlZ3M7CisJYnVmZmVyID0gbmV3X3RhcGVfYnVmZmVyKDEsIChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYSwgaSk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInN0OiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuIERldmljZSBub3QgYXR0YWNoZWQuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGlzayA9IGFsbG9jX2Rpc2soMSk7CisJaWYgKCFkaXNrKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Q6IG91dCBvZiBtZW1vcnkuIERldmljZSBub3QgYXR0YWNoZWQuXG4iKTsKKwkJZ290byBvdXRfYnVmZmVyX2ZyZWU7CisJfQorCisJd3JpdGVfbG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwlpZiAoc3RfbnJfZGV2ID49IHN0X2Rldl9tYXgpIHsKKwkJc3RydWN0IHNjc2lfdGFwZSAqKnRtcF9kYTsKKwkJaW50IHRtcF9kZXZfbWF4OworCisJCXRtcF9kZXZfbWF4ID0gbWF4KHN0X25yX2RldiAqIDIsIDgpOworCQlpZiAodG1wX2Rldl9tYXggPiBTVF9NQVhfVEFQRVMpCisJCQl0bXBfZGV2X21heCA9IFNUX01BWF9UQVBFUzsKKwkJaWYgKHRtcF9kZXZfbWF4IDw9IHN0X25yX2RldikgeworCQkJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCQkJcHJpbnRrKEtFUk5fRVJSICJzdDogVG9vIG1hbnkgdGFwZSBkZXZpY2VzIChtYXguICVkKS5cbiIsCisJCQkgICAgICAgU1RfTUFYX1RBUEVTKTsKKwkJCWdvdG8gb3V0X3B1dF9kaXNrOworCQl9CisKKwkJdG1wX2RhID0ga21hbGxvYyh0bXBfZGV2X21heCAqIHNpemVvZihzdHJ1Y3Qgc2NzaV90YXBlICopLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHRtcF9kYSA9PSBOVUxMKSB7CisJCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJCQlwcmludGsoS0VSTl9FUlIgInN0OiBDYW4ndCBleHRlbmQgZGV2aWNlIGFycmF5LlxuIik7CisJCQlnb3RvIG91dF9wdXRfZGlzazsKKwkJfQorCisJCW1lbXNldCh0bXBfZGEsIDAsIHRtcF9kZXZfbWF4ICogc2l6ZW9mKHN0cnVjdCBzY3NpX3RhcGUgKikpOworCQlpZiAoc2NzaV90YXBlcyAhPSBOVUxMKSB7CisJCQltZW1jcHkodG1wX2RhLCBzY3NpX3RhcGVzLAorCQkJICAgICAgIHN0X2Rldl9tYXggKiBzaXplb2Yoc3RydWN0IHNjc2lfdGFwZSAqKSk7CisJCQlrZnJlZShzY3NpX3RhcGVzKTsKKwkJfQorCQlzY3NpX3RhcGVzID0gdG1wX2RhOworCisJCXN0X2Rldl9tYXggPSB0bXBfZGV2X21heDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RfZGV2X21heDsgaSsrKQorCQlpZiAoc2NzaV90YXBlc1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gc3RfZGV2X21heCkKKwkJcGFuaWMoInNjc2lfZGV2aWNlcyBjb3JydXB0IChzdCkiKTsKKworCXRwbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NzaV90YXBlKSwgR0ZQX0FUT01JQyk7CisJaWYgKHRwbnQgPT0gTlVMTCkgeworCQl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAic3Q6IENhbid0IGFsbG9jYXRlIGRldmljZSBkZXNjcmlwdG9yLlxuIik7CisJCWdvdG8gb3V0X3B1dF9kaXNrOworCX0KKwltZW1zZXQodHBudCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3NpX3RhcGUpKTsKKwl0cG50LT5kaXNrID0gZGlzazsKKwlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgInN0JWQiLCBpKTsKKwlkaXNrLT5wcml2YXRlX2RhdGEgPSAmdHBudC0+ZHJpdmVyOworCWRpc2stPnF1ZXVlID0gU0RwLT5yZXF1ZXN0X3F1ZXVlOworCXRwbnQtPmRyaXZlciA9ICZzdF90ZW1wbGF0ZTsKKwlzY3NpX3RhcGVzW2ldID0gdHBudDsKKwlkZXZfbnVtID0gaTsKKworCXRwbnQtPmRldmljZSA9IFNEcDsKKwlpZiAoU0RwLT5zY3NpX2xldmVsIDw9IDIpCisJCXRwbnQtPnRhcGVfdHlwZSA9IE1UX0lTU0NTSTE7CisJZWxzZQorCQl0cG50LT50YXBlX3R5cGUgPSBNVF9JU1NDU0kyOworCisJdHBudC0+YnVmZmVyID0gYnVmZmVyOworCisJdHBudC0+aW5pdGVkID0gMDsKKwl0cG50LT5kaXJ0eSA9IDA7CisJdHBudC0+aW5fdXNlID0gMDsKKwl0cG50LT5kcnZfYnVmZmVyID0gMTsJLyogVHJ5IGJ1ZmZlcmluZyBpZiBubyBtb2RlIHNlbnNlICovCisJdHBudC0+cmVzdHJfZG1hID0gKFNEcC0+aG9zdCktPnVuY2hlY2tlZF9pc2FfZG1hOworCXRwbnQtPnVzZV9wZiA9IChTRHAtPnNjc2lfbGV2ZWwgPj0gU0NTSV8yKTsKKwl0cG50LT5kZW5zaXR5ID0gMDsKKwl0cG50LT5kb19hdXRvX2xvY2sgPSBTVF9BVVRPX0xPQ0s7CisJdHBudC0+Y2FuX2JzciA9IChTRHAtPnNjc2lfbGV2ZWwgPiAyID8gMSA6IFNUX0lOX0ZJTEVfUE9TKTsgLyogQlNSIG1hbmRhdG9yeSBpbiBTQ1NJMyAqLworCXRwbnQtPmNhbl9wYXJ0aXRpb25zID0gMDsKKwl0cG50LT50d29fZm0gPSBTVF9UV09fRk07CisJdHBudC0+ZmFzdF9tdGVvbSA9IFNUX0ZBU1RfTVRFT007CisJdHBudC0+c2NzaTJfbG9naWNhbCA9IFNUX1NDU0kyTE9HSUNBTDsKKwl0cG50LT5pbW1lZGlhdGUgPSBTVF9OT1dBSVQ7CisJdHBudC0+ZGVmYXVsdF9kcnZidWZmZXIgPSAweGZmOwkJLyogTm8gZm9yY2VkIGJ1ZmZlcmluZyAqLworCXRwbnQtPnBhcnRpdGlvbiA9IDA7CisJdHBudC0+bmV3X3BhcnRpdGlvbiA9IDA7CisJdHBudC0+bmJyX3BhcnRpdGlvbnMgPSAwOworCXRwbnQtPmRldmljZS0+dGltZW91dCA9IFNUX1RJTUVPVVQ7CisJdHBudC0+bG9uZ190aW1lb3V0ID0gU1RfTE9OR19USU1FT1VUOworCXRwbnQtPnRyeV9kaW8gPSB0cnlfZGlyZWN0X2lvICYmICFTRHAtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hOworCisJYm91bmNlX2xpbWl0ID0gc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KFNEcC0+aG9zdCkgPj4gUEFHRV9TSElGVDsKKwlpZiAoYm91bmNlX2xpbWl0ID4gVUxPTkdfTUFYKQorCQlib3VuY2VfbGltaXQgPSBVTE9OR19NQVg7CisJdHBudC0+bWF4X3BmbiA9IGJvdW5jZV9saW1pdDsKKworCWZvciAoaSA9IDA7IGkgPCBTVF9OQlJfTU9ERVM7IGkrKykgeworCQlTVG0gPSAmKHRwbnQtPm1vZGVzW2ldKTsKKwkJU1RtLT5kZWZpbmVkID0gMDsKKwkJU1RtLT5zeXN2ID0gU1RfU1lTVjsKKwkJU1RtLT5kZWZhdWx0c19mb3Jfd3JpdGVzID0gMDsKKwkJU1RtLT5kb19hc3luY193cml0ZXMgPSBTVF9BU1lOQ19XUklURVM7CisJCVNUbS0+ZG9fYnVmZmVyX3dyaXRlcyA9IFNUX0JVRkZFUl9XUklURVM7CisJCVNUbS0+ZG9fcmVhZF9haGVhZCA9IFNUX1JFQURfQUhFQUQ7CisJCVNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiA9IFNUX0RPTlRfVE9VQ0g7CisJCVNUbS0+ZGVmYXVsdF9ibGtzaXplID0gKC0xKTsJLyogTm8gZm9yY2VkIHNpemUgKi8KKwkJU1RtLT5kZWZhdWx0X2RlbnNpdHkgPSAoLTEpOwkvKiBObyBmb3JjZWQgZGVuc2l0eSAqLworCX0KKworCWZvciAoaSA9IDA7IGkgPCBTVF9OQlJfUEFSVElUSU9OUzsgaSsrKSB7CisJCVNUcHMgPSAmKHRwbnQtPnBzW2ldKTsKKwkJU1Rwcy0+cncgPSBTVF9JRExFOworCQlTVHBzLT5lb2YgPSBTVF9OT0VPRjsKKwkJU1Rwcy0+YXRfc20gPSAwOworCQlTVHBzLT5sYXN0X2Jsb2NrX3ZhbGlkID0gMDsKKwkJU1Rwcy0+ZHJ2X2Jsb2NrID0gKC0xKTsKKwkJU1Rwcy0+ZHJ2X2ZpbGUgPSAoLTEpOworCX0KKworCXRwbnQtPmN1cnJlbnRfbW9kZSA9IDA7CisJdHBudC0+bW9kZXNbMF0uZGVmaW5lZCA9IDE7CisKKwl0cG50LT5kZW5zaXR5X2NoYW5nZWQgPSB0cG50LT5jb21wcmVzc2lvbl9jaGFuZ2VkID0KKwkgICAgdHBudC0+Ymxrc2l6ZV9jaGFuZ2VkID0gMDsKKwlpbml0X01VVEVYKCZ0cG50LT5sb2NrKTsKKworCXN0X25yX2RldisrOworCXdyaXRlX3VubG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKworCWZvciAobW9kZSA9IDA7IG1vZGUgPCBTVF9OQlJfTU9ERVM7ICsrbW9kZSkgeworCQlTVG0gPSAmKHRwbnQtPm1vZGVzW21vZGVdKTsKKwkJZm9yIChqPTA7IGogPCAyOyBqKyspIHsKKwkJCWNkZXYgPSBjZGV2X2FsbG9jKCk7CisJCQlpZiAoIWNkZXYpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInN0JWQ6IG91dCBvZiBtZW1vcnkuIERldmljZSBub3QgYXR0YWNoZWQuXG4iLAorCQkJCSAgICAgICBkZXZfbnVtKTsKKwkJCQlnb3RvIG91dF9mcmVlX3RhcGU7CisJCQl9CisJCQljZGV2LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJY2Rldi0+b3BzID0gJnN0X2ZvcHM7CisKKwkJCWVycm9yID0gY2Rldl9hZGQoY2RldiwKKwkJCQkJIE1LREVWKFNDU0lfVEFQRV9NQUpPUiwgVEFQRV9NSU5PUihkZXZfbnVtLCBtb2RlLCBqKSksCisJCQkJCSAxKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXByaW50ayhLRVJOX0VSUiAic3QlZDogQ2FuJ3QgYWRkICVzLXJld2luZCBtb2RlICVkXG4iLAorCQkJCSAgICAgICBkZXZfbnVtLCBqID8gIm5vbiIgOiAiYXV0byIsIG1vZGUpOworCQkJCXByaW50ayhLRVJOX0VSUiAic3QlZDogRGV2aWNlIG5vdCBhdHRhY2hlZC5cbiIsIGRldl9udW0pOworCQkJCWdvdG8gb3V0X2ZyZWVfdGFwZTsKKwkJCX0KKwkJCVNUbS0+Y2RldnNbal0gPSBjZGV2OworCisJCX0KKwkJZG9fY3JlYXRlX2NsYXNzX2ZpbGVzKHRwbnQsIGRldl9udW0sIG1vZGUpOworCX0KKworCWZvciAobW9kZSA9IDA7IG1vZGUgPCBTVF9OQlJfTU9ERVM7ICsrbW9kZSkgeworCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbWlub3IgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3VyCisJCSAgIGZpcnN0IG1vZGVzIGFsd2F5cyBnZXQgdGhlIHNhbWUgbmFtZXMgKi8KKwkJaSA9IG1vZGUgPDwgKDQgLSBTVF9OQlJfTU9ERV9CSVRTKTsKKwkJLyogIFJld2luZCBlbnRyeSAgKi8KKwkJZGV2ZnNfbWtfY2RldihNS0RFVihTQ1NJX1RBUEVfTUFKT1IsIFRBUEVfTUlOT1IoZGV2X251bSwgbW9kZSwgMCkpLAorCQkJICAgICAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkJICAgICAgIiVzL210JXMiLCBTRHAtPmRldmZzX25hbWUsIHN0X2Zvcm1hdHNbaV0pOworCQkvKiAgTm8tcmV3aW5kIGVudHJ5ICAqLworCQlkZXZmc19ta19jZGV2KE1LREVWKFNDU0lfVEFQRV9NQUpPUiwgVEFQRV9NSU5PUihkZXZfbnVtLCBtb2RlLCAxKSksCisJCQkgICAgICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCQkgICAgICAiJXMvbXQlc24iLCBTRHAtPmRldmZzX25hbWUsIHN0X2Zvcm1hdHNbaV0pOworCX0KKwlkaXNrLT5udW1iZXIgPSBkZXZmc19yZWdpc3Rlcl90YXBlKFNEcC0+ZGV2ZnNfbmFtZSk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJIkF0dGFjaGVkIHNjc2kgdGFwZSAlcyBhdCBzY3NpJWQsIGNoYW5uZWwgJWQsIGlkICVkLCBsdW4gJWRcbiIsCisJICAgICAgIHRhcGVfbmFtZSh0cG50KSwgU0RwLT5ob3N0LT5ob3N0X25vLCBTRHAtPmNoYW5uZWwsIFNEcC0+aWQsIFNEcC0+bHVuKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJ5IGRpcmVjdCBpL286ICVzIChhbGlnbm1lbnQgJWQgQiksIG1heCBwYWdlIHJlYWNoYWJsZSBieSBIQkEgJWx1XG4iLAorCSAgICAgICB0YXBlX25hbWUodHBudCksIHRwbnQtPnRyeV9kaW8gPyAieWVzIiA6ICJubyIsCisJICAgICAgIHF1ZXVlX2RtYV9hbGlnbm1lbnQoU0RwLT5yZXF1ZXN0X3F1ZXVlKSArIDEsIHRwbnQtPm1heF9wZm4pOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3RhcGU6CisJZm9yIChtb2RlPTA7IG1vZGUgPCBTVF9OQlJfTU9ERVM7IG1vZGUrKykgeworCQlTVG0gPSAmKHRwbnQtPm1vZGVzW21vZGVdKTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnRwbnQtPmRldmljZS0+c2Rldl9nZW5kZXYua29iaiwKKwkJCQkgICJ0YXBlIik7CisJCWZvciAoaj0wOyBqIDwgMjsgaisrKSB7CisJCQlpZiAoU1RtLT5jZGV2c1tqXSkgeworCQkJCWlmIChjZGV2ID09IFNUbS0+Y2RldnNbal0pCisJCQkJCWNkZXYgPSBOVUxMOworCQkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNDU0lfVEFQRV9NQUpPUiwKKwkJCQkJCQkJIFRBUEVfTUlOT1IoaSwgbW9kZSwgaikpKTsKKwkJCQljZGV2X2RlbChTVG0tPmNkZXZzW2pdKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY2RldikKKwkJY2Rldl9kZWwoY2Rldik7CisJd3JpdGVfbG9jaygmc3RfZGV2X2Fycl9sb2NrKTsKKwlzY3NpX3RhcGVzW2Rldl9udW1dID0gTlVMTDsKKwlzdF9ucl9kZXYtLTsKKwl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CitvdXRfcHV0X2Rpc2s6CisJcHV0X2Rpc2soZGlzayk7CisJaWYgKHRwbnQpCisJCWtmcmVlKHRwbnQpOworb3V0X2J1ZmZlcl9mcmVlOgorCWtmcmVlKGJ1ZmZlcik7CitvdXQ6CisJcmV0dXJuIC1FTk9ERVY7Cit9OworCisKK3N0YXRpYyBpbnQgc3RfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc3RydWN0IHNjc2lfdGFwZSAqdHBudDsKKwlpbnQgaSwgaiwgbW9kZTsKKworCXdyaXRlX2xvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IHN0X2Rldl9tYXg7IGkrKykgeworCQl0cG50ID0gc2NzaV90YXBlc1tpXTsKKwkJaWYgKHRwbnQgIT0gTlVMTCAmJiB0cG50LT5kZXZpY2UgPT0gU0RwKSB7CisJCQlzY3NpX3RhcGVzW2ldID0gTlVMTDsKKwkJCXN0X25yX2Rldi0tOworCQkJd3JpdGVfdW5sb2NrKCZzdF9kZXZfYXJyX2xvY2spOworCQkJZGV2ZnNfdW5yZWdpc3Rlcl90YXBlKHRwbnQtPmRpc2stPm51bWJlcik7CisJCQlzeXNmc19yZW1vdmVfbGluaygmdHBudC0+ZGV2aWNlLT5zZGV2X2dlbmRldi5rb2JqLAorCQkJCQkgICJ0YXBlIik7CisJCQlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgU1RfTkJSX01PREVTOyArK21vZGUpIHsKKwkJCQlqID0gbW9kZSA8PCAoNCAtIFNUX05CUl9NT0RFX0JJVFMpOworCQkJCWRldmZzX3JlbW92ZSgiJXMvbXQlcyIsIFNEcC0+ZGV2ZnNfbmFtZSwgc3RfZm9ybWF0c1tqXSk7CisJCQkJZGV2ZnNfcmVtb3ZlKCIlcy9tdCVzbiIsIFNEcC0+ZGV2ZnNfbmFtZSwgc3RfZm9ybWF0c1tqXSk7CisJCQkJZm9yIChqPTA7IGogPCAyOyBqKyspIHsKKwkJCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoU0NTSV9UQVBFX01BSk9SLAorCQkJCQkJCQkJIFRBUEVfTUlOT1IoaSwgbW9kZSwgaikpKTsKKwkJCQkJY2Rldl9kZWwodHBudC0+bW9kZXNbbW9kZV0uY2RldnNbal0pOworCQkJCQl0cG50LT5tb2Rlc1ttb2RlXS5jZGV2c1tqXSA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJdHBudC0+ZGV2aWNlID0gTlVMTDsKKworCQkJaWYgKHRwbnQtPmJ1ZmZlcikgeworCQkJCXRwbnQtPmJ1ZmZlci0+b3JpZ19mcnBfc2VncyA9IDA7CisJCQkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOworCQkJCWtmcmVlKHRwbnQtPmJ1ZmZlcik7CisJCQl9CisJCQlwdXRfZGlzayh0cG50LT5kaXNrKTsKKwkJCWtmcmVlKHRwbnQpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwl3cml0ZV91bmxvY2soJnN0X2Rldl9hcnJfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0X2ludHIoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJc2NzaV9pb19jb21wbGV0aW9uKFNDcG50LCAoU0NwbnQtPnJlc3VsdCA/IDA6IFNDcG50LT5idWZmbGVuKSwgMSk7Cit9CisKKy8qCisgKiBzdF9pbml0X2NvbW1hbmQ6IG9ubHkgY2FsbGVkIHZpYSB0aGUgc2NzaV9jbWRfaW9jdGwgKGJsb2NrIFNHX0lPKQorICogaW50ZXJmYWNlIGZvciBSRVFfQkxPQ0tfUEMgY29tbWFuZHMuCisgKi8KK3N0YXRpYyBpbnQgc3RfaW5pdF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXN0cnVjdCByZXF1ZXN0ICpycTsKKworCWlmICghKFNDcG50LT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9CTE9DS19QQykpCisJCXJldHVybiAwOworCisJcnEgPSBTQ3BudC0+cmVxdWVzdDsKKwlpZiAoc2l6ZW9mKHJxLT5jbWQpID4gc2l6ZW9mKFNDcG50LT5jbW5kKSkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoU0NwbnQtPmNtbmQsIHJxLT5jbWQsIHNpemVvZihTQ3BudC0+Y21uZCkpOworCisJaWYgKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKKwkJU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwllbHNlIGlmIChycS0+ZGF0YV9sZW4pCisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwllbHNlCisJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9OT05FOworCisJU0NwbnQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSBycS0+dGltZW91dDsKKwlTQ3BudC0+dHJhbnNmZXJzaXplID0gcnEtPmRhdGFfbGVuOworCVNDcG50LT5kb25lID0gc3RfaW50cjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zdCh2b2lkKQoreworCXZhbGlkYXRlX29wdGlvbnMoKTsKKworCXByaW50ayhLRVJOX0lORk8KKwkJInN0OiBWZXJzaW9uICVzLCBmaXhlZCBidWZzaXplICVkLCBzL2cgc2VncyAlZFxuIiwKKwkJdmVyc3RyLCBzdF9maXhlZF9idWZmZXJfc2l6ZSwgc3RfbWF4X3NnX3NlZ3MpOworCisJc3Rfc3lzZnNfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAic2NzaV90YXBlIik7CisJaWYgKElTX0VSUihzdF9zeXNmc19jbGFzcykpIHsKKwkJc3Rfc3lzZnNfY2xhc3MgPSBOVUxMOworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSBjcmVhdGUgc3lzZnMgY2xhc3MgZm9yIFNDU0kgdGFwZXNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIXJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoU0NTSV9UQVBFX01BSk9SLCAwKSwKKwkJCQkgICAgU1RfTUFYX1RBUEVfRU5UUklFUywgInN0IikpIHsKKwkJaWYgKHNjc2lfcmVnaXN0ZXJfZHJpdmVyKCZzdF90ZW1wbGF0ZS5nZW5kcnYpID09IDApIHsKKwkJCWRvX2NyZWF0ZV9kcml2ZXJmc19maWxlcygpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHN0X3N5c2ZzX2NsYXNzKQorCQkJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koc3Rfc3lzZnNfY2xhc3MpOwkJCisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihTQ1NJX1RBUEVfTUFKT1IsIDApLAorCisJCQkJCSBTVF9NQVhfVEFQRV9FTlRSSUVTKTsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIFNDU0kgdGFwZXNcbiIsIFNDU0lfVEFQRV9NQUpPUik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3N0KHZvaWQpCit7CisJaWYgKHN0X3N5c2ZzX2NsYXNzKQorCQljbGFzc19zaW1wbGVfZGVzdHJveShzdF9zeXNmc19jbGFzcyk7CisJc3Rfc3lzZnNfY2xhc3MgPSBOVUxMOworCWRvX3JlbW92ZV9kcml2ZXJmc19maWxlcygpOworCXNjc2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0X3RlbXBsYXRlLmdlbmRydik7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfVEFQRV9NQUpPUiwgMCksCisJCQkJIFNUX01BWF9UQVBFX0VOVFJJRVMpOworCWtmcmVlKHNjc2lfdGFwZXMpOworCXByaW50ayhLRVJOX0lORk8gInN0OiBVbmxvYWRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChpbml0X3N0KTsKK21vZHVsZV9leGl0KGV4aXRfc3QpOworCisKKy8qIFRoZSBzeXNmcyBkcml2ZXIgaW50ZXJmYWNlLiBSZWFkLW9ubHkgYXQgdGhlIG1vbWVudCAqLworc3RhdGljIHNzaXplX3Qgc3RfdHJ5X2RpcmVjdF9pb19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdHJ5X2RpcmVjdF9pbyk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIodHJ5X2RpcmVjdF9pbywgU19JUlVHTywgc3RfdHJ5X2RpcmVjdF9pb19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc3RfZml4ZWRfYnVmZmVyX3NpemVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHN0X2ZpeGVkX2J1ZmZlcl9zaXplKTsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihmaXhlZF9idWZmZXJfc2l6ZSwgU19JUlVHTywgc3RfZml4ZWRfYnVmZmVyX3NpemVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHN0X21heF9zZ19zZWdzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzdF9tYXhfc2dfc2Vncyk7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIobWF4X3NnX3NlZ3MsIFNfSVJVR08sIHN0X21heF9zZ19zZWdzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzdF92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIlslc11cbiIsIHZlcnN0cik7Cit9CitzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywgc3RfdmVyc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIHZvaWQgZG9fY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcmZzID0gJnN0X3RlbXBsYXRlLmdlbmRydjsKKworCWRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3RyeV9kaXJlY3RfaW8pOworCWRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX2ZpeGVkX2J1ZmZlcl9zaXplKTsKKwlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhfc2dfc2Vncyk7CisJZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3JlbW92ZV9kcml2ZXJmc19maWxlcyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICZzdF90ZW1wbGF0ZS5nZW5kcnY7CisKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhfc2dfc2Vncyk7CisJZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfZml4ZWRfYnVmZmVyX3NpemUpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3RyeV9kaXJlY3RfaW8pOworfQorCisKKy8qIFRoZSBzeXNmcyBzaW1wbGUgY2xhc3MgaW50ZXJmYWNlICovCitzdGF0aWMgc3NpemVfdCBzdF9kZWZpbmVkX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHN0X21vZGVkZWYgKlNUbSA9IChzdHJ1Y3Qgc3RfbW9kZWRlZiAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3NpemVfdCBsID0gMDsKKworCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBTVG0tPmRlZmluZWQpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihkZWZpbmVkLCBTX0lSVUdPLCBzdF9kZWZpbmVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzdF9kZWZibGtfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtID0gKHN0cnVjdCBzdF9tb2RlZGVmICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCisJbCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIFNUbS0+ZGVmYXVsdF9ibGtzaXplKTsKKwlyZXR1cm4gbDsKK30KKworQ0xBU1NfREVWSUNFX0FUVFIoZGVmYXVsdF9ibGtzaXplLCBTX0lSVUdPLCBzdF9kZWZibGtfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHN0X2RlZmRlbnNpdHlfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtID0gKHN0cnVjdCBzdF9tb2RlZGVmICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCWNoYXIgKmZtdDsKKworCWZtdCA9IFNUbS0+ZGVmYXVsdF9kZW5zaXR5ID49IDAgPyAiMHglMDJ4XG4iIDogIiVkXG4iOworCWwgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgZm10LCBTVG0tPmRlZmF1bHRfZGVuc2l0eSk7CisJcmV0dXJuIGw7Cit9CisKK0NMQVNTX0RFVklDRV9BVFRSKGRlZmF1bHRfZGVuc2l0eSwgU19JUlVHTywgc3RfZGVmZGVuc2l0eV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc3RfZGVmY29tcHJlc3Npb25fc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtID0gKHN0cnVjdCBzdF9tb2RlZGVmICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzc2l6ZV90IGwgPSAwOworCisJbCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIFNUbS0+ZGVmYXVsdF9jb21wcmVzc2lvbiAtIDEpOworCXJldHVybiBsOworfQorCitDTEFTU19ERVZJQ0VfQVRUUihkZWZhdWx0X2NvbXByZXNzaW9uLCBTX0lSVUdPLCBzdF9kZWZjb21wcmVzc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIHZvaWQgZG9fY3JlYXRlX2NsYXNzX2ZpbGVzKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IGRldl9udW0sIGludCBtb2RlKQoreworCWludCBpLCByZXcsIGVycm9yOworCWNoYXIgbmFtZVsxMF07CisJc3RydWN0IGNsYXNzX2RldmljZSAqc3RfY2xhc3NfbWVtYmVyOworCisJaWYgKCFzdF9zeXNmc19jbGFzcykKKwkJcmV0dXJuOworCisJZm9yIChyZXc9MDsgcmV3IDwgMjsgcmV3KyspIHsKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1pbm9yIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgZm91cgorCQkgICBmaXJzdCBtb2RlcyBhbHdheXMgZ2V0IHRoZSBzYW1lIG5hbWVzICovCisJCWkgPSBtb2RlIDw8ICg0IC0gU1RfTkJSX01PREVfQklUUyk7CisJCXNucHJpbnRmKG5hbWUsIDEwLCAiJXMlcyVzIiwgcmV3ID8gIm4iIDogIiIsCisJCQkgU1RwLT5kaXNrLT5kaXNrX25hbWUsIHN0X2Zvcm1hdHNbaV0pOworCQlzdF9jbGFzc19tZW1iZXIgPQorCQkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoc3Rfc3lzZnNfY2xhc3MsCisJCQkJCQlNS0RFVihTQ1NJX1RBUEVfTUFKT1IsCisJCQkJCQkgICAgICBUQVBFX01JTk9SKGRldl9udW0sIG1vZGUsIHJldykpLAorCQkJCQkJJlNUcC0+ZGV2aWNlLT5zZGV2X2dlbmRldiwgIiVzIiwgbmFtZSk7CisJCWlmIChJU19FUlIoc3RfY2xhc3NfbWVtYmVyKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3QlZDogY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQgZmFpbGVkXG4iLAorCQkJICAgICAgIGRldl9udW0pOworCQkJZ290byBvdXQ7CisJCX0KKwkJY2xhc3Nfc2V0X2RldmRhdGEoc3RfY2xhc3NfbWVtYmVyLCAmU1RwLT5tb2Rlc1ttb2RlXSk7CisKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHN0X2NsYXNzX21lbWJlciwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cl9kZWZpbmVkKTsKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHN0X2NsYXNzX21lbWJlciwKKwkJCQkJICZjbGFzc19kZXZpY2VfYXR0cl9kZWZhdWx0X2Jsa3NpemUpOworCQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoc3RfY2xhc3NfbWVtYmVyLAorCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyX2RlZmF1bHRfZGVuc2l0eSk7CisJCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShzdF9jbGFzc19tZW1iZXIsCisJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJfZGVmYXVsdF9jb21wcmVzc2lvbik7CisJCWlmIChtb2RlID09IDAgJiYgcmV3ID09IDApIHsKKwkJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJlNUcC0+ZGV2aWNlLT5zZGV2X2dlbmRldi5rb2JqLAorCQkJCQkJICAmc3RfY2xhc3NfbWVtYmVyLT5rb2JqLAorCQkJCQkJICAidGFwZSIpOworCQkJaWYgKGVycm9yKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJzdCVkOiBDYW4ndCBjcmVhdGUgc3lzZnMgbGluayBmcm9tIFNDU0kgZGV2aWNlLlxuIiwKKwkJCQkgICAgICAgZGV2X251bSk7CisJCQl9CisJCX0KKwl9Cisgb3V0OgorCXJldHVybjsKK30KKworCisvKiBQaW4gZG93biB1c2VyIHBhZ2VzIGFuZCBwdXQgdGhlbSBpbnRvIGEgc2NhdHRlciBnYXRoZXIgbGlzdC4gUmV0dXJucyA8PSAwIGlmCisgICAtIG1hcHBpbmcgb2YgYWxsIHBhZ2VzIG5vdCBzdWNjZXNzZnVsCisgICAtIGFueSBwYWdlIGlzIGFib3ZlIG1heF9wZm4KKyAgIChpLmUuLCBlaXRoZXIgY29tcGxldGVseSBzdWNjZXNzZnVsIG9yIGZhaWxzKQorKi8KK3N0YXRpYyBpbnQgc3RfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcGFnZXMsIAorCQkJICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBtYXhfcGZuKQoreworCWludCBpLCBucl9wYWdlczsKKworCW5yX3BhZ2VzID0gc2dsX21hcF91c2VyX3BhZ2VzKHNnbCwgbWF4X3BhZ2VzLCB1YWRkciwgY291bnQsIHJ3KTsKKwlpZiAobnJfcGFnZXMgPD0gMCkKKwkJcmV0dXJuIG5yX3BhZ2VzOworCisJZm9yIChpPTA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCWlmIChwYWdlX3RvX3BmbihzZ2xbaV0ucGFnZSkgPiBtYXhfcGZuKQorCQkJZ290byBvdXRfdW5tYXA7CisJfQorCXJldHVybiBucl9wYWdlczsKKworIG91dF91bm1hcDoKKwlzZ2xfdW5tYXBfdXNlcl9wYWdlcyhzZ2wsIG5yX3BhZ2VzLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZnVsIGZvciBhIGxhcmdlciBhdWRpZW5jZS4gKi8KK3N0YXRpYyBpbnQgc2dsX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzLCAKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHNpemVfdCBjb3VudCwgaW50IHJ3KQoreworCWludCByZXMsIGksIGo7CisJdW5zaWduZWQgaW50IG5yX3BhZ2VzOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlucl9wYWdlcyA9ICgodWFkZHIgJiB+UEFHRV9NQVNLKSArIGNvdW50ICsgflBBR0VfTUFTSykgPj4gUEFHRV9TSElGVDsKKworCS8qIFVzZXIgYXR0ZW1wdGVkIE92ZXJmbG93ISAqLworCWlmICgodWFkZHIgKyBjb3VudCkgPCB1YWRkcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUb28gYmlnICovCisgICAgICAgIGlmIChucl9wYWdlcyA+IG1heF9wYWdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBIbW0/ICovCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJaWYgKChwYWdlcyA9IGttYWxsb2MobWF4X3BhZ2VzICogc2l6ZW9mKCpwYWdlcyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgICAgICAvKiBUcnkgdG8gZmF1bHQgaW4gYWxsIG9mIHRoZSBuZWNlc3NhcnkgcGFnZXMgKi8KKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisgICAgICAgIC8qIHJ3PT1SRUFEIG1lYW5zIHJlYWQgZnJvbSBkcml2ZSwgd3JpdGUgaW50byBtZW1vcnkgYXJlYSAqLworCXJlcyA9IGdldF91c2VyX3BhZ2VzKAorCQljdXJyZW50LAorCQljdXJyZW50LT5tbSwKKwkJdWFkZHIsCisJCW5yX3BhZ2VzLAorCQlydyA9PSBSRUFELAorCQkwLCAvKiBkb24ndCBmb3JjZSAqLworCQlwYWdlcywKKwkJTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCS8qIEVycm9ycyBhbmQgbm8gcGFnZSBtYXBwZWQgc2hvdWxkIHJldHVybiBoZXJlICovCisJaWYgKHJlcyA8IG5yX3BhZ2VzKQorCQlnb3RvIG91dF91bm1hcDsKKworICAgICAgICBmb3IgKGk9MDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRTogZmx1c2ggc3VwZXJmbG91cyBmb3Igcnc9PVJFQUQsCisgICAgICAgICAgICAgICAgICogcHJvYmFibHkgd3JvbmcgZnVuY3Rpb24gZm9yIHJ3PT1XUklURQorICAgICAgICAgICAgICAgICAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7CisgICAgICAgIH0KKworCS8qIFBvcHVsYXRlIHRoZSBzY2F0dGVyL2dhdGhlciBsaXN0ICovCisJc2dsWzBdLnBhZ2UgPSBwYWdlc1swXTsgCisJc2dsWzBdLm9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKwlpZiAobnJfcGFnZXMgPiAxKSB7CisJCXNnbFswXS5sZW5ndGggPSBQQUdFX1NJWkUgLSBzZ2xbMF0ub2Zmc2V0OworCQljb3VudCAtPSBzZ2xbMF0ubGVuZ3RoOworCQlmb3IgKGk9MTsgaSA8IG5yX3BhZ2VzIDsgaSsrKSB7CisJCQlzZ2xbaV0ub2Zmc2V0ID0gMDsKKwkJCXNnbFtpXS5wYWdlID0gcGFnZXNbaV07IAorCQkJc2dsW2ldLmxlbmd0aCA9IGNvdW50IDwgUEFHRV9TSVpFID8gY291bnQgOiBQQUdFX1NJWkU7CisJCQljb3VudCAtPSBQQUdFX1NJWkU7CisJCX0KKwl9CisJZWxzZSB7CisJCXNnbFswXS5sZW5ndGggPSBjb3VudDsKKwl9CisKKwlrZnJlZShwYWdlcyk7CisJcmV0dXJuIG5yX3BhZ2VzOworCisgb3V0X3VubWFwOgorCWlmIChyZXMgPiAwKSB7CisJCWZvciAoaj0wOyBqIDwgcmVzOyBqKyspCisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbal0pOworCX0KKwlrZnJlZShwYWdlcyk7CisJcmV0dXJuIHJlczsKK30KKworCisvKiBBbmQgdW5tYXAgdGhlbS4uLiAqLworc3RhdGljIGludCBzZ2xfdW5tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG5yX3BhZ2VzLAorCQkJCWludCBkaXJ0aWVkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCWlmIChkaXJ0aWVkICYmICFQYWdlUmVzZXJ2ZWQoc2dsW2ldLnBhZ2UpKQorCQkJU2V0UGFnZURpcnR5KHNnbFtpXS5wYWdlKTsKKwkJLyogRklYTUU6IGNhY2hlIGZsdXNoIG1pc3NpbmcgZm9yIHJ3PT1SRUFECisJCSAqIEZJWE1FOiBjYWxsIHRoZSBjb3JyZWN0IHJlZmVyZW5jZSBjb3VudGluZyBmdW5jdGlvbgorCQkgKi8KKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHNnbFtpXS5wYWdlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5oIGIvZHJpdmVycy9zY3NpL3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZGExMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5oCkBAIC0wLDAgKzEsMjEyIEBACisKKyNpZm5kZWYgX1NUX0gKKyNkZWZpbmUgX1NUX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworCisvKiBEZXNjcmlwdG9yIGZvciBhbmFseXplZCBzZW5zZSBkYXRhICovCitzdHJ1Y3Qgc3RfY21kc3RhdHVzIHsKKwlpbnQgbWlkbGV2ZWxfcmVzdWx0OworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7CisJaW50IGhhdmVfc2Vuc2U7CisJdTY0IHVyZW1haW5kZXI2NDsKKwl1OCBmbGFnczsKKwl1OCByZW1haW5kZXJfdmFsaWQ7CisJdTggZml4ZWRfZm9ybWF0OworCXU4IGRlZmVycmVkOworfTsKKworLyogVGhlIHRhcGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCitzdHJ1Y3Qgc3RfYnVmZmVyIHsKKwl1bnNpZ25lZCBjaGFyIGluX3VzZTsKKwl1bnNpZ25lZCBjaGFyIGRtYTsJLyogRE1BLWFibGUgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciBkb19kaW87ICAgLyogZGlyZWN0IGkvbyBzZXQgdXA/ICovCisJaW50IGJ1ZmZlcl9zaXplOworCWludCBidWZmZXJfYmxvY2tzOworCWludCBidWZmZXJfYnl0ZXM7CisJaW50IHJlYWRfcG9pbnRlcjsKKwlpbnQgd3JpdGluZzsKKwlpbnQgc3lzY2FsbF9yZXN1bHQ7CisJc3RydWN0IHNjc2lfcmVxdWVzdCAqbGFzdF9TUnBudDsKKwlzdHJ1Y3Qgc3RfY21kc3RhdHVzIGNtZHN0YXQ7CisJdW5zaWduZWQgY2hhciAqYl9kYXRhOworCXVuc2lnbmVkIHNob3J0IHVzZV9zZzsJLyogemVybyBvciBtYXggbnVtYmVyIG9mIHMvZyBzZWdtZW50cyBmb3IgdGhpcyBhZGFwdGVyICovCisJdW5zaWduZWQgc2hvcnQgc2dfc2VnczsJCS8qIG51bWJlciBvZiBzZWdtZW50cyBpbiBzL2cgbGlzdCAqLworCXVuc2lnbmVkIHNob3J0IG9yaWdfZnJwX3NlZ3M7CS8qIG51bWJlciBvZiBzZWdtZW50cyBhbGxvY2F0ZWQgYXQgZmlyc3QgdHJ5ICovCisJdW5zaWduZWQgc2hvcnQgZnJwX3NlZ3M7CS8qIG51bWJlciBvZiBidWZmZXIgc2VnbWVudHMgKi8KKwl1bnNpZ25lZCBpbnQgZnJwX3NnX2N1cnJlbnQ7CS8qIGRyaXZlciBidWZmZXIgbGVuZ3RoIGN1cnJlbnRseSBpbiBzL2cgbGlzdCAqLworCXN0cnVjdCBzdF9idWZfZnJhZ21lbnQgKmZycDsJLyogdGhlIGFsbG9jYXRlZCBidWZmZXIgZnJhZ21lbnQgbGlzdCAqLworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsJLyogTVVTVCBCRSBsYXN0IGl0ZW0gKi8KK307CisKKy8qIFRoZSB0YXBlIGJ1ZmZlciBmcmFnbWVudCBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50IHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworfTsKKworLyogVGhlIHRhcGUgbW9kZSBkZWZpbml0aW9uICovCitzdHJ1Y3Qgc3RfbW9kZWRlZiB7CisJdW5zaWduZWQgY2hhciBkZWZpbmVkOworCXVuc2lnbmVkIGNoYXIgc3lzdjsJLyogU1lTIFYgc2VtYW50aWNzPyAqLworCXVuc2lnbmVkIGNoYXIgZG9fYXN5bmNfd3JpdGVzOworCXVuc2lnbmVkIGNoYXIgZG9fYnVmZmVyX3dyaXRlczsKKwl1bnNpZ25lZCBjaGFyIGRvX3JlYWRfYWhlYWQ7CisJdW5zaWduZWQgY2hhciBkZWZhdWx0c19mb3Jfd3JpdGVzOworCXVuc2lnbmVkIGNoYXIgZGVmYXVsdF9jb21wcmVzc2lvbjsJLyogMCA9IGRvbid0IHRvdWNoLCBldGMgKi8KKwlzaG9ydCBkZWZhdWx0X2RlbnNpdHk7CS8qIEZvcmNlZCBkZW5zaXR5LCAtMSA9IG5vIHZhbHVlICovCisJaW50IGRlZmF1bHRfYmxrc2l6ZTsJLyogRm9yY2VkIGJsb2Nrc2l6ZSwgLTEgPSBubyB2YWx1ZSAqLworCXN0cnVjdCBjZGV2ICpjZGV2c1syXTsgIC8qIEF1dG8tcmV3aW5kIGFuZCBub24tcmV3aW5kIGRldmljZXMgKi8KK307CisKKy8qIE51bWJlciBvZiBtb2RlcyBjYW4gYmUgY2hhbmdlZCBieSBjaGFuZ2luZyBTVF9OQlJfTU9ERV9CSVRTLiBUaGUgbWF4aW11bQorICAgbnVtYmVyIG9mIG1vZGVzIGlzIDE2IChTVF9OQlJfTU9ERV9CSVRTIDQpICovCisjZGVmaW5lIFNUX05CUl9NT0RFX0JJVFMgMgorI2RlZmluZSBTVF9OQlJfTU9ERVMgKDEgPDwgU1RfTkJSX01PREVfQklUUykKKyNkZWZpbmUgU1RfTU9ERV9TSElGVCAoNyAtIFNUX05CUl9NT0RFX0JJVFMpCisjZGVmaW5lIFNUX01PREVfTUFTSyAoKFNUX05CUl9NT0RFUyAtIDEpIDw8IFNUX01PREVfU0hJRlQpCisKKyNkZWZpbmUgU1RfTUFYX1RBUEVTIDEyOAorI2RlZmluZSBTVF9NQVhfVEFQRV9FTlRSSUVTICAoU1RfTUFYX1RBUEVTIDw8IChTVF9OQlJfTU9ERV9CSVRTICsgMSkpCisKKy8qIFRoZSBzdGF0dXMgcmVsYXRlZCB0byBlYWNoIHBhcnRpdGlvbiAqLworc3RydWN0IHN0X3BhcnRzdGF0IHsKKwl1bnNpZ25lZCBjaGFyIHJ3OworCXVuc2lnbmVkIGNoYXIgZW9mOworCXVuc2lnbmVkIGNoYXIgYXRfc207CisJdW5zaWduZWQgY2hhciBsYXN0X2Jsb2NrX3ZhbGlkOworCXUzMiBsYXN0X2Jsb2NrX3Zpc2l0ZWQ7CisJaW50IGRydl9ibG9jazsJCS8qIFRoZSBibG9jayB3aGVyZSB0aGUgZHJpdmUgaGVhZCBpcyAqLworCWludCBkcnZfZmlsZTsKK307CisKKyNkZWZpbmUgU1RfTkJSX1BBUlRJVElPTlMgNAorCisvKiBUaGUgdGFwZSBkcml2ZSBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgc2NzaV90YXBlIHsKKwlzdHJ1Y3Qgc2NzaV9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CS8qIEZvciBzZXJpYWxpemF0aW9uICovCisJc3RydWN0IGNvbXBsZXRpb24gd2FpdDsJLyogRm9yIFNDU0kgY29tbWFuZHMgKi8KKwlzdHJ1Y3Qgc3RfYnVmZmVyICpidWZmZXI7CisKKwkvKiBEcml2ZSBjaGFyYWN0ZXJpc3RpY3MgKi8KKwl1bnNpZ25lZCBjaGFyIG9taXRfYmxrbGltczsKKwl1bnNpZ25lZCBjaGFyIGRvX2F1dG9fbG9jazsKKwl1bnNpZ25lZCBjaGFyIGNhbl9ic3I7CisJdW5zaWduZWQgY2hhciBjYW5fcGFydGl0aW9uczsKKwl1bnNpZ25lZCBjaGFyIHR3b19mbTsKKwl1bnNpZ25lZCBjaGFyIGZhc3RfbXRlb207CisJdW5zaWduZWQgY2hhciBpbW1lZGlhdGU7CisJdW5zaWduZWQgY2hhciByZXN0cl9kbWE7CisJdW5zaWduZWQgY2hhciBzY3NpMl9sb2dpY2FsOworCXVuc2lnbmVkIGNoYXIgZGVmYXVsdF9kcnZidWZmZXI7CS8qIDB4ZmYgPSBkb24ndCB0b3VjaCwgdmFsdWUgMyBiaXRzICovCisJdW5zaWduZWQgY2hhciBjbG5fbW9kZTsJCQkvKiAwID0gbm9uZSwgb3RoZXJ3aXNlIHNlbnNlIGJ5dGUgbmJyICovCisJdW5zaWduZWQgY2hhciBjbG5fc2Vuc2VfdmFsdWU7CisJdW5zaWduZWQgY2hhciBjbG5fc2Vuc2VfbWFzazsKKwl1bnNpZ25lZCBjaGFyIHVzZV9wZjsJCQkvKiBTZXQgUGFnZSBGb3JtYXQgYml0IGluIGFsbCBtb2RlIHNlbGVjdHM/ICovCisJdW5zaWduZWQgY2hhciB0cnlfZGlvOwkJCS8qIHRyeSBkaXJlY3QgaS9vPyAqLworCXVuc2lnbmVkIGNoYXIgY19hbGdvOwkJCS8qIGNvbXByZXNzaW9uIGFsZ29yaXRobSAqLworCXVuc2lnbmVkIGNoYXIgcG9zX3Vua25vd247CQkJLyogYWZ0ZXIgcmVzZXQgcG9zaXRpb24gdW5rbm93biAqLworCWludCB0YXBlX3R5cGU7CisJaW50IGxvbmdfdGltZW91dDsJLyogdGltZW91dCBmb3IgY29tbWFuZHMga25vd24gdG8gdGFrZSBsb25nIHRpbWUgKi8KKworCXVuc2lnbmVkIGxvbmcgbWF4X3BmbjsJLyogdGhlIG1heGltdW0gcGFnZSBudW1iZXIgcmVhY2hhYmxlIGJ5IHRoZSBIQkEgKi8KKworCS8qIE1vZGUgY2hhcmFjdGVyaXN0aWNzICovCisJc3RydWN0IHN0X21vZGVkZWYgbW9kZXNbU1RfTkJSX01PREVTXTsKKwlpbnQgY3VycmVudF9tb2RlOworCisJLyogU3RhdHVzIHZhcmlhYmxlcyAqLworCWludCBwYXJ0aXRpb247CisJaW50IG5ld19wYXJ0aXRpb247CisJaW50IG5icl9wYXJ0aXRpb25zOwkvKiB6ZXJvIHVudGlsIHBhcnRpdGlvbiBzdXBwb3J0IGVuYWJsZWQgKi8KKwlzdHJ1Y3Qgc3RfcGFydHN0YXQgcHNbU1RfTkJSX1BBUlRJVElPTlNdOworCXVuc2lnbmVkIGNoYXIgZGlydHk7CisJdW5zaWduZWQgY2hhciByZWFkeTsKKwl1bnNpZ25lZCBjaGFyIHdyaXRlX3Byb3Q7CisJdW5zaWduZWQgY2hhciBkcnZfd3JpdGVfcHJvdDsKKwl1bnNpZ25lZCBjaGFyIGluX3VzZTsKKwl1bnNpZ25lZCBjaGFyIGJsa3NpemVfY2hhbmdlZDsKKwl1bnNpZ25lZCBjaGFyIGRlbnNpdHlfY2hhbmdlZDsKKwl1bnNpZ25lZCBjaGFyIGNvbXByZXNzaW9uX2NoYW5nZWQ7CisJdW5zaWduZWQgY2hhciBkcnZfYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgZGVuc2l0eTsKKwl1bnNpZ25lZCBjaGFyIGRvb3JfbG9ja2VkOworCXVuc2lnbmVkIGNoYXIgYXV0b3Jld19kZXY7ICAgLyogYXV0by1yZXdpbmQgZGV2aWNlICovCisJdW5zaWduZWQgY2hhciByZXdfYXRfY2xvc2U7ICAvKiByZXdpbmQgbmVjZXNzYXJ5IGF0IGNsb3NlICovCisJdW5zaWduZWQgY2hhciBpbml0ZWQ7CisJdW5zaWduZWQgY2hhciBjbGVhbmluZ19yZXE7ICAvKiBjbGVhbmluZyByZXF1ZXN0ZWQ/ICovCisJaW50IGJsb2NrX3NpemU7CisJaW50IG1pbl9ibG9jazsKKwlpbnQgbWF4X2Jsb2NrOworCWludCByZWNvdmVyX2NvdW50OyAgICAgLyogRnJvbSB0YXBlIG9wZW5pbmcgKi8KKwlpbnQgcmVjb3Zlcl9yZWc7ICAgICAgIC8qIEZyb20gbGFzdCBzdGF0dXMgY2FsbCAqLworCisjaWYgREVCVUcKKwl1bnNpZ25lZCBjaGFyIHdyaXRlX3BlbmRpbmc7CisJaW50IG5icl9maW5pc2hlZDsKKwlpbnQgbmJyX3dhaXRzOworCWludCBuYnJfcmVxdWVzdHM7CisJaW50IG5icl9kaW87CisJaW50IG5icl9wYWdlczsKKwlpbnQgbmJyX2NvbWJpbmFibGU7CisJdW5zaWduZWQgY2hhciBsYXN0X2NtbmRbNl07CisJdW5zaWduZWQgY2hhciBsYXN0X3NlbnNlWzE2XTsKKyNlbmRpZgorCXN0cnVjdCBnZW5kaXNrICpkaXNrOworfTsKKworLyogQml0IG1hc2tzIGZvciB1c2VfcGYgKi8KKyNkZWZpbmUgVVNFX1BGICAgICAgMQorI2RlZmluZSBQRl9URVNURUQgICAyCisKKy8qIFZhbHVlcyBvZiBlb2YgKi8KKyNkZWZpbmUJU1RfTk9FT0YJMAorI2RlZmluZSBTVF9GTV9ISVQgICAgICAgMQorI2RlZmluZSBTVF9GTSAgICAgICAgICAgMgorI2RlZmluZSBTVF9FT01fT0sgICAgICAgMworI2RlZmluZSBTVF9FT01fRVJST1IJNAorI2RlZmluZQlTVF9FT0RfMSAgICAgICAgNQorI2RlZmluZSBTVF9FT0RfMiAgICAgICAgNgorI2RlZmluZSBTVF9FT0QJCTcKKy8qIEVPRCBoaXQgd2hpbGUgcmVhZGluZyA9PiBTVF9FT0RfMSA9PiByZXR1cm4gemVybyA9PiBTVF9FT0RfMiA9PgorICAgcmV0dXJuIHplcm8gPT4gU1RfRU9ELCByZXR1cm4gRU5PU1BDICovCisvKiBXaGVuIHdyaXRpbmc6IFNUX0VPTV9PSyA9PSBlYXJseSB3YXJuaW5nIGZvdW5kLCB3cml0ZSBPSworCQkgU1RfRU9EXzEgID09IGFsbG93IHRyeWluZyBuZXcgd3JpdGUgYWZ0ZXIgZWFybHkgd2FybmluZworCQkgU1RfRU9NX0VSUk9SID09IGVhcmx5IHdhcm5pbmcgZm91bmQsIG5vdCBhYmxlIHRvIHdyaXRlIGFsbCAqLworCisvKiBWYWx1ZXMgb2YgcncgKi8KKyNkZWZpbmUJU1RfSURMRQkJMAorI2RlZmluZQlTVF9SRUFESU5HCTEKKyNkZWZpbmUJU1RfV1JJVElORwkyCisKKy8qIFZhbHVlcyBvZiByZWFkeSBzdGF0ZSAqLworI2RlZmluZSBTVF9SRUFEWQkwCisjZGVmaW5lIFNUX05PVF9SRUFEWQkxCisjZGVmaW5lIFNUX05PX1RBUEUJMgorCisvKiBWYWx1ZXMgZm9yIGRvb3IgbG9jayBzdGF0ZSAqLworI2RlZmluZSBTVF9VTkxPQ0tFRAkwCisjZGVmaW5lIFNUX0xPQ0tFRF9FWFBMSUNJVCAxCisjZGVmaW5lIFNUX0xPQ0tFRF9BVVRPICAyCisjZGVmaW5lIFNUX0xPQ0tfRkFJTFMgICAzCisKKy8qIFBvc2l0aW9uaW5nIFNDU0ktY29tbWFuZHMgZm9yIFRhbmRiZXJnLCBldGMuIGRyaXZlcyAqLworI2RlZmluZQlRRkFfUkVRVUVTVF9CTE9DSwkweDAyCisjZGVmaW5lCVFGQV9TRUVLX0JMT0NLCQkweDBjCisKKy8qIFNldHRpbmcgdGhlIGJpbmFyeSBvcHRpb25zICovCisjZGVmaW5lIFNUX0RPTlRfVE9VQ0ggIDAKKyNkZWZpbmUgU1RfTk8gICAgICAgICAgMQorI2RlZmluZSBTVF9ZRVMgICAgICAgICAyCisKKyNkZWZpbmUgRVhURU5ERURfU0VOU0VfU1RBUlQgIDE4CisKKy8qIE1hc2tzIGZvciBzb21lIGNvbmRpdGlvbnMgaW4gdGhlIHNlbnNlIGRhdGEgKi8KKyNkZWZpbmUgU0VOU0VfRk1LICAgMHg4MAorI2RlZmluZSBTRU5TRV9FT00gICAweDQwCisjZGVmaW5lIFNFTlNFX0lMSSAgIDB4MjAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3Rfb3B0aW9ucy5oIGIvZHJpdmVycy9zY3NpL3N0X29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI1YzljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N0X29wdGlvbnMuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAgIFRoZSBjb21waWxlLXRpbWUgY29uZmlndXJhYmxlIGRlZmF1bHRzIGZvciB0aGUgTGludXggU0NTSSB0YXBlIGRyaXZlci4KKworICAgQ29weXJpZ2h0IDE5OTUtMjAwMyBLYWkgTWFraXNhcmEuCisKKyAgIExhc3QgbW9kaWZpZWQ6IE1vbiBBcHIgIDcgMjI6NDk6MTggMjAwMyBieSBtYWtpc2FyYQorKi8KKworI2lmbmRlZiBfU1RfT1BUSU9OU19ICisjZGVmaW5lIF9TVF9PUFRJT05TX0gKKworLyogSWYgVFJZX0RJUkVDVF9JTyBpcyBub24temVybywgdGhlIGRyaXZlciB0cmllcyB0byB0cmFuc2ZlciBkYXRhIGRpcmVjdGx5CisgICBiZXR3ZWVuIHRoZSB1c2VyIGJ1ZmZlciBhbmQgdGFwZSBkcml2ZS4gSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGRyaXZlcgorICAgYnVmZmVyIGlzIHVzZWQuIElmIFRSWV9ESVJFQ1RfSU8gaXMgemVybywgZHJpdmVyIGJ1ZmZlciBpcyBhbHdheXMgdXNlZC4gKi8KKyNkZWZpbmUgVFJZX0RJUkVDVF9JTyAxCisKKy8qIFRoZSBkcml2ZXIgZG9lcyBub3Qgd2FpdCBmb3Igc29tZSBvcGVyYXRpb25zIHRvIGZpbmlzaCBiZWZvcmUgcmV0dXJuaW5nCisgICB0byB0aGUgdXNlciBwcm9ncmFtIGlmIFNUX05PV0FJVCBpcyBub24temVyby4gVGhpcyBoZWxwcyBpZiB0aGUgU0NTSQorICAgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzLiBIb3dldmVyLCB0aGUgdXNlcgorICAgc2hvdWxkIG5vdCBnaXZlIGEgbmV3IHRhcGUgY29tbWFuZCBiZWZvcmUgdGhlIHByZXZpb3VzIG9uZSBoYXMgZmluaXNoZWQuICovCisjZGVmaW5lIFNUX05PV0FJVCAwCisKKy8qIElmIFNUX0lOX0ZJTEVfUE9TIGlzIG5vbnplcm8sIHRoZSBkcml2ZXIgcG9zaXRpb25zIHRoZSB0YXBlIGFmdGVyIHRoZQorICAgcmVjb3JkIGJlZW4gcmVhZCBieSB0aGUgdXNlciBwcm9ncmFtIGV2ZW4gaWYgdGhlIHRhcGUgaGFzIG1vdmVkIGZ1cnRoZXIKKyAgIGJlY2F1c2Ugb2YgYnVmZmVyZWQgcmVhZHMuIFNob3VsZCBiZSBzZXQgdG8gemVybyB0byBzdXBwb3J0IGFsc28gZHJpdmVzCisgICB0aGF0IGNhbid0IHNwYWNlIGJhY2t3YXJkcyBvdmVyIHJlY29yZHMuIE5PVEU6IFRoZSB0YXBlIHdpbGwgYmUKKyAgIHNwYWNlZCBiYWNrd2FyZHMgb3ZlciBhbiAiYWNjaWRlbnRhbGx5IiBjcm9zc2VkIGZpbGVtYXJrIGluIGFueSBjYXNlLiAqLworI2RlZmluZSBTVF9JTl9GSUxFX1BPUyAwCisKKy8qIElmIFNUX1JFQ09WRVJFRF9XUklURV9GQVRBTCBpcyBub24temVybywgcmVjb3ZlcmVkIGVycm9ycyB3aGlsZSB3cml0aW5nCisgICBhcmUgY29uc2lkZXJlZCAiaGFyZCBlcnJvcnMiLiAqLworI2RlZmluZSBTVF9SRUNPVkVSRURfV1JJVEVfRkFUQUwgMAorCisvKiBUaGUgImd1ZXNzIiBmb3IgdGhlIGJsb2NrIHNpemUgZm9yIGRldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IE1PREUKKyAgIFNFTlNFLiAqLworI2RlZmluZSBTVF9ERUZBVUxUX0JMT0NLIDAKKworLyogVGhlIG1pbmltdW0gdGFwZSBkcml2ZXIgYnVmZmVyIHNpemUgaW4ga2lsb2J5dGVzIGluIGZpeGVkIGJsb2NrIG1vZGUuCisgICBNdXN0IGJlIG5vbi16ZXJvLiAqLworI2RlZmluZSBTVF9GSVhFRF9CVUZGRVJfQkxPQ0tTIDMyCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzICovCisjZGVmaW5lIFNUX01BWF9TRyAgICAgIDI1NgorCisvKiBUaGUgbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzIHRvIGFsbG9jYXRlIGF0IGZpcnN0IHRyeSAobXVzdCBiZQorICAgc21hbGxlciBvciBlcXVhbCB0byB0aGUgbWF4aW11bSkuICovCisjZGVmaW5lIFNUX0ZJUlNUX1NHICAgIDgKKworLyogVGhlIHNpemUgb2YgdGhlIGZpcnN0IHNjYXR0ZXIvZ2F0aGVyIHNlZ21lbnRzIChkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGJsb2NrCisgICBzaXplIGZvciBTQ1NJIGFkYXB0ZXJzIG5vdCBzdXBwb3J0aW5nIHNjYXR0ZXIvZ2F0aGVyKS4gVGhlIGRlZmF1bHQgaXMgc2V0CisgICB0byB0cnkgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBhcyBvbmUgY2h1bmsuICovCisjZGVmaW5lIFNUX0ZJUlNUX09SREVSICA1CisKKworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBkZWZpbmUgZGVmYXVsdHMgZm9yIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0CisgICBzZXBhcmF0ZWx5IGZvciBlYWNoIGRyaXZlIHVzaW5nIHRoZSBNVFNUT1BUSU9OUyBpb2N0bC4gKi8KKworLyogSWYgU1RfVFdPX0ZNIGlzIG5vbi16ZXJvLCB0aGUgZHJpdmVyIHdyaXRlcyB0d28gZmlsZW1hcmtzIGFmdGVyIGEKKyAgIGZpbGUgYmVpbmcgd3JpdHRlbi4gU29tZSBkcml2ZXMgY2FuJ3QgaGFuZGxlIHR3byBmaWxlbWFya3MgYXQgdGhlCisgICBlbmQgb2YgZGF0YS4gKi8KKyNkZWZpbmUgU1RfVFdPX0ZNIDAKKworLyogSWYgU1RfQlVGRkVSX1dSSVRFUyBpcyBub24temVybywgd3JpdGVzIGluIGZpeGVkIGJsb2NrIG1vZGUgYXJlCisgICBidWZmZXJlZCB1bnRpbCB0aGUgZHJpdmVyIGJ1ZmZlciBpcyBmdWxsIG9yIGFzeW5jaHJvbm91cyB3cml0ZSBpcworICAgdHJpZ2dlcmVkLiBNYXkgbWFrZSBkZXRlY3Rpb24gb2YgRW5kLU9mLU1lZGl1bSBlYXJseSBlbm91Z2ggZmFpbC4gKi8KKyNkZWZpbmUgU1RfQlVGRkVSX1dSSVRFUyAxCisKKy8qIElmIFNUX0FTWU5DX1dSSVRFUyBpcyBub24temVybywgdGhlIFNDU0kgd3JpdGUgY29tbWFuZCBtYXkgYmUgc3RhcnRlZAorICAgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guIE1heSBjYXVzZSBwcm9ibGVtcyBpbiBtdWx0aXBsZQorICAgdGFwZSBiYWNrdXBzLiAqLworI2RlZmluZSBTVF9BU1lOQ19XUklURVMgMQorCisvKiBJZiBTVF9SRUFEX0FIRUFEIGlzIG5vbi16ZXJvLCBibG9ja3MgYXJlIHJlYWQgYWhlYWQgaW4gZml4ZWQgYmxvY2sKKyAgIG1vZGUuICovCisjZGVmaW5lIFNUX1JFQURfQUhFQUQgMQorCisvKiBJZiBTVF9BVVRPX0xPQ0sgaXMgbm9uLXplcm8sIHRoZSBkcml2ZSBkb29yIGlzIGxvY2tlZCBhdCB0aGUgZmlyc3QKKyAgIHJlYWQgb3Igd3JpdGUgY29tbWFuZCBhZnRlciB0aGUgZGV2aWNlIGlzIG9wZW5lZC4gVGhlIGRvb3IgaXMgb3BlbmVkCisgICB3aGVuIHRoZSBkZXZpY2UgaXMgY2xvc2VkLiAqLworI2RlZmluZSBTVF9BVVRPX0xPQ0sgMAorCisvKiBJZiBTVF9GQVNUX01URU9NIGlzIG5vbi16ZXJvLCB0aGUgTVRFT00gaW9jdGwgaXMgZG9uZSB1c2luZyB0aGUKKyAgIGRpcmVjdCBTQ1NJIGNvbW1hbmQuIFRoZSBmaWxlIG51bWJlciBzdGF0dXMgaXMgbG9zdCBidXQgdGhpcyBtZXRob2QKKyAgIGlzIGZhc3Qgd2l0aCBzb21lIGRyaXZlcy4gT3RoZXJ3aXNlIE1URU9NIGlzIGRvbmUgYnkgc3BhY2luZyBvdmVyCisgICBmaWxlcyBhbmQgdGhlIGZpbGUgbnVtYmVyIHN0YXR1cyBpcyByZXRhaW5lZC4gKi8KKyNkZWZpbmUgU1RfRkFTVF9NVEVPTSAwCisKKy8qIElmIFNUX1NDU0kyTE9HSUNBTCBpcyBub256ZXJvLCB0aGUgbG9naWNhbCBibG9jayBhZGRyZXNzZXMgYXJlIHVzZWQgZm9yCisgICBNVElPQ1BPUyBhbmQgTVRTRUVLIGJ5IGRlZmF1bHQuIFZlbmRvciBhZGRyZXNzZXMgYXJlIHVzZWQgaWYgU1RfU0NTSTJMT0dJQ0FMCisgICBpcyB6ZXJvLiAqLworI2RlZmluZSBTVF9TQ1NJMkxPR0lDQUwgMAorCisvKiBJZiBTVF9TWVNWIGlzIG5vbi16ZXJvLCB0aGUgdGFwZSBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgU1lTIFYgc2VtYW50aWNzLgorICAgVGhlIGRlZmF1bHQgaXMgQlNEIHNlbWFudGljcy4gKi8KKyNkZWZpbmUgU1RfU1lTViAwCisKKy8qIFRpbWUgdG8gd2FpdCBmb3IgdGhlIGRyaXZlIHRvIGJlY29tZSByZWFkeSBpZiBibG9ja2luZyBvcGVuICovCisjZGVmaW5lIFNUX0JMT0NLX1NFQ09ORFMgICAgIDEyMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDgxMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfTkNSNTM4MC5jCkBAIC0wLDAgKzEsMzAwOSBAQAorLyogc3VuM19OQ1I1MzgwLmMgLS0gYWRhcHRlZCBmcm9tIGF0YXJpX05DUjUzODAuYyBmb3IgdGhlIHN1bjMgYnkgCisgICBTYW0gQ3JlYXNleS4gKi8gCisvKiAKKyAqIE5DUiA1MzgwIGdlbmVyaWMgZHJpdmVyIHJvdXRpbmVzLiAgVGhlc2Ugc2hvdWxkIG1ha2UgaXQgKnRyaXZpYWwqCisgKiAJdG8gaW1wbGVtZW50IDUzODAgU0NTSSBkcml2ZXJzIHVuZGVyIExpbnV4IHdpdGggYSBub24tdHJhbnRvcgorICoJYXJjaGl0ZWN0dXJlLgorICoKKyAqCU5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyBhbHNvIHdvcmsgd2l0aCBOUjUzYzQwMCBmYW1pbHkgY2hpcHMuCisgKgorICogQ29weXJpZ2h0IDE5OTMsIERyZXcgRWNraGFyZHQKKyAqCVZpc2lvbmFyeSBDb21wdXRpbmcgCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICogCWRyZXdAY29sb3JhZG8uZWR1CisgKgkrMSAoMzAzKSA2NjYtNTgzNgorICoKKyAqIERJU1RSSUJVVElPTiBSRUxFQVNFIDYuIAorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCAKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisvKgorICogKytyb21hbjogVG8gcG9ydCB0aGUgNTM4MCBkcml2ZXIgdG8gdGhlIEF0YXJpLCBJIGhhZCB0byBkbyBzb21lIGNoYW5nZXMgaW4KKyAqIHRoaXMgZmlsZSwgdG9vOgorICoKKyAqICAtIFNvbWUgb2YgdGhlIGRlYnVnIHN0YXRlbWVudHMgd2VyZSBpbmNvcnJlY3QgKHVuZGVmaW5lZCB2YXJpYWJsZXMgYW5kIHRoZQorICogICAgbGlrZSkuIEkgZml4ZWQgdGhhdC4KKyAqCisgKiAgLSBJbiBpbmZvcm1hdGlvbl90cmFuc2ZlcigpLCBJIHRoaW5rIGEgI2lmZGVmIHdhcyB3cm9uZy4gTG9va2luZyBhdCB0aGUKKyAqICAgIHBvc3NpYmxlIERNQSB0cmFuc2ZlciBzaXplIHNob3VsZCBhbHNvIGhhcHBlbiBmb3IgUkVBTF9ETUEuIEkgYWRkZWQgdGhpcworICogICAgaW4gdGhlICNpZiBzdGF0ZW1lbnQuCisgKgorICogIC0gV2hlbiB1c2luZyByZWFsIERNQSwgaW5mb3JtYXRpb25fdHJhbnNmZXIoKSBzaG91bGQgcmV0dXJuIGluIGEgREFUQU9VVAorICogICAgcGhhc2UgYWZ0ZXIgc3RhcnRpbmcgdGhlIERNQS4gSXQgaGFzIG5vdGhpbmcgbW9yZSB0byBkby4KKyAqCisgKiAgLSBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBzaG91bGQgcnVuIG1haW4gYWZ0ZXIgZW5kIG9mIERNQSwgdG9vIChub3QKKyAqICAgIG9ubHkgYWZ0ZXIgUkVTRUxFQ1RJT04gaW50ZXJydXB0cykuIEFkZGl0aW9uYWxseSwgaXQgc2hvdWxkIF9ub3RfIHRlc3QKKyAqICAgIGZvciBtb3JlIGludGVycnVwdHMgYWZ0ZXIgcnVubmluZyBtYWluLCBzaW5jZSBhIERNQSBwcm9jZXNzIG1heSBoYXZlCisgKiAgICBiZWVuIHN0YXJ0ZWQgYW5kIGludGVycnVwdHMgYXJlIHR1cm5lZCBvbiBub3cuIFRoZSBuZXcgaW50IGNvdWxkIGhhcHBlbgorICogICAgaW5zaWRlIHRoZSBleGVjdXRpb24gb2YgTkNSNTM4MF9pbnRyKCksIGxlYWRpbmcgdG8gcmVjdXJzaXZlCisgKiAgICBjYWxscy4KKyAqCisgKiAgLSBJJ3ZlIGFkZGVkIGEgZnVuY3Rpb24gbWVyZ2VfY29udGlndW91c19idWZmZXJzKCkgdGhhdCB0cmllcyB0bworICogICAgbWVyZ2Ugc2NhdHRlci1nYXRoZXIgYnVmZmVycyB0aGF0IGFyZSBsb2NhdGVkIGF0IGNvbnRpZ3VvdXMKKyAqICAgIHBoeXNpY2FsIGFkZHJlc3NlcyBhbmQgY2FuIGJlIHByb2Nlc3NlZCB3aXRoIHRoZSBzYW1lIERNQSBzZXR1cC4KKyAqICAgIFNpbmNlIG1vc3Qgc2NhdHRlci1nYXRoZXIgb3BlcmF0aW9ucyB3b3JrIG9uIGEgcGFnZSAoNEspIG9mCisgKiAgICA0IGJ1ZmZlcnMgKDFLKSwgaW4gbW9yZSB0aGFuIDkwJSBvZiBhbGwgY2FzZXMgdGhyZWUgaW50ZXJydXB0cyBhbmQKKyAqICAgIERNQSBzZXR1cCBhY3Rpb25zIGFyZSBzYXZlZC4KKyAqCisgKiAtIEkndmUgZGVsZXRlZCBhbGwgdGhlIHN0dWZmIGZvciBBVVRPUFJPQkVfSVJRLCBSRUFMX0RNQV9QT0xMLCBQU0VVRE9fRE1BCisgKiAgICBhbmQgVVNMRUVQLCBiZWNhdXNlIHRoZXNlIHdlcmUgbWVzc2luZyB1cCByZWFkYWJpbGl0eSBhbmQgd2lsbCBuZXZlciBiZQorICogICAgbmVlZGVkIGZvciBBdGFyaSBTQ1NJLgorICogCisgKiAtIEkndmUgcmV2aXNlZCB0aGUgTkNSNTM4MF9tYWluKCkgY2FsbGluZyBzY2hlbWUgKHJlbGF4IHRoZSAnbWFpbl9ydW5uaW5nJworICogICBzdHVmZiksIGFuZCAnbWFpbicgaXMgZXhlY3V0ZWQgaW4gYSBib3R0b20gaGFsZiBpZiBhd29rZW4gYnkgYW4KKyAqICAgaW50ZXJydXB0LgorICoKKyAqIC0gVGhlIGNvZGUgd2FzIHF1aXRlIGNsdXR0ZXJlZCB1cCBieSAiI2lmIChOREVCVUcgJiBOREVCVUdfKikgcHJpbnRrLi4uIgorICogICBjb25zdHJ1Y3RzLiBJbiBteSBleWVzLCB0aGlzIG1hZGUgdGhlIHNvdXJjZSByYXRoZXIgdW5yZWFkYWJsZSwgc28gSQorICogICBmaW5hbGx5IHJlcGxhY2VkIHRoYXQgYnkgdGhlICpfUFJJTlRLKCkgbWFjcm9zLgorICoKKyAqLworCisvKgorICogRnVydGhlciBkZXZlbG9wbWVudCAvIHRlc3RpbmcgdGhhdCBzaG91bGQgYmUgZG9uZSA6IAorICogMS4gIFRlc3QgbGlua2VkIGNvbW1hbmQgaGFuZGxpbmcgY29kZSBhZnRlciBFcmljIGlzIHJlYWR5IHdpdGggCisgKiAgICAgdGhlIGhpZ2ggbGV2ZWwgY29kZS4KKyAqLworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKKyNkZWZpbmUgTElTVCh4LHkpIFwKKyAgeyBwcmludGsoIkxJTkU6JWQgICBBZGRpbmcgJXAgdG8gJXBcbiIsIF9fTElORV9fLCAodm9pZCopKHgpLCAodm9pZCopKHkpKTsgXAorICAgIGlmICgoeCk9PSh5KSkgdWRlbGF5KDUpOyB9CisjZGVmaW5lIFJFTU9WRSh3LHgseSx6KSBcCisgIHsgcHJpbnRrKCJMSU5FOiVkICAgUmVtb3Zpbmc6ICVwLT4lcCAgJXAtPiVwIFxuIiwgX19MSU5FX18sIFwKKwkgICAodm9pZCopKHcpLCAodm9pZCopKHgpLCAodm9pZCopKHkpLCAodm9pZCopKHopKTsgXAorICAgIGlmICgoeCk9PSh5KSkgdWRlbGF5KDUpOyB9CisjZWxzZQorI2RlZmluZSBMSVNUKHgseSkKKyNkZWZpbmUgUkVNT1ZFKHcseCx5LHopCisjZW5kaWYKKworI2lmbmRlZiBub3R5ZXQKKyN1bmRlZiBMSU5LRUQKKyNlbmRpZgorCisvKgorICogRGVzaWduCisgKiBJc3N1ZXMgOgorICoKKyAqIFRoZSBvdGhlciBMaW51eCBTQ1NJIGRyaXZlcnMgd2VyZSB3cml0dGVuIHdoZW4gTGludXggd2FzIEludGVsIFBDLW9ubHksCisgKiBhbmQgc3BlY2lmaWNhbGx5IGZvciBlYWNoIGJvYXJkIHJhdGhlciB0aGFuIGVhY2ggY2hpcC4gIFRoaXMgbWFrZXMgdGhlaXIKKyAqIGFkYXB0YXRpb24gdG8gcGxhdGZvcm1zIGxpa2UgdGhlIE1hYyAoU29tZSBvZiB3aGljaCB1c2UgTkNSNTM4MCdzKQorICogbW9yZSBkaWZmaWN1bHQgdGhhbiBpdCBoYXMgdG8gYmUuCisgKgorICogQWxzbywgbWFueSBvZiB0aGUgU0NTSSBkcml2ZXJzIHdlcmUgd3JpdHRlbiBiZWZvcmUgdGhlIGNvbW1hbmQgcXVldWluZworICogcm91dGluZXMgd2VyZSBpbXBsZW1lbnRlZCwgbWVhbmluZyB0aGVpciBpbXBsZW1lbnRhdGlvbnMgb2YgcXVldWVkIAorICogY29tbWFuZHMgd2VyZSBoYWNrZWQgb24gcmF0aGVyIHRoYW4gZGVzaWduZWQgaW4gZnJvbSB0aGUgc3RhcnQuCisgKgorICogV2hlbiBJIGRlc2lnbmVkIHRoZSBMaW51eCBTQ1NJIGRyaXZlcnMgSSBmaWd1cmVkIHRoYXQgCisgKiB3aGlsZSBoYXZpbmcgdHdvIGRpZmZlcmVudCBTQ1NJIGJvYXJkcyBpbiBhIHN5c3RlbSBtaWdodCBiZSB1c2VmdWwKKyAqIGZvciBkZWJ1Z2dpbmcgdGhpbmdzLCB0d28gb2YgdGhlIHNhbWUgdHlwZSB3b3VsZG4ndCBiZSB1c2VkLgorICogV2VsbCwgSSB3YXMgd3JvbmcgYW5kIGEgbnVtYmVyIG9mIHVzZXJzIGhhdmUgbWFpbGVkIG1lIGFib3V0IHJ1bm5pbmcKKyAqIG11bHRpcGxlIGhpZ2gtcGVyZm9ybWFuY2UgU0NTSSBib2FyZHMgaW4gYSBzZXJ2ZXIuCisgKgorICogRmluYWxseSwgd2hlbiBJIGdldCBxdWVzdGlvbnMgZnJvbSB1c2VycywgSSBoYXZlIG5vIGlkZWEgd2hhdCAKKyAqIHJldmlzaW9uIG9mIG15IGRyaXZlciB0aGV5IGFyZSBydW5uaW5nLgorICoKKyAqIFRoaXMgZHJpdmVyIGF0dGVtcHRzIHRvIGFkZHJlc3MgdGhlc2UgcHJvYmxlbXMgOgorICogVGhpcyBpcyBhIGdlbmVyaWMgNTM4MCBkcml2ZXIuICBUbyB1c2UgaXQgb24gYSBkaWZmZXJlbnQgcGxhdGZvcm0sIAorICogb25lIHNpbXBseSB3cml0ZXMgYXBwcm9wcmlhdGUgc3lzdGVtIHNwZWNpZmljIG1hY3JvcyAoaWUsIGRhdGEKKyAqIHRyYW5zZmVyIC0gc29tZSBQQydzIHdpbGwgdXNlIHRoZSBJL08gYnVzLCA2OEsncyBtdXN0IHVzZSAKKyAqIG1lbW9yeSBtYXBwZWQpIGFuZCBkcm9wcyB0aGlzIGZpbGUgaW4gdGhlaXIgJ0MnIHdyYXBwZXIuCisgKgorICogQXMgZmFyIGFzIGNvbW1hbmQgcXVldWVpbmcsIHR3byBxdWV1ZXMgYXJlIG1haW50YWluZWQgZm9yIAorICogZWFjaCA1MzgwIGluIHRoZSBzeXN0ZW0gLSBjb21tYW5kcyB0aGF0IGhhdmVuJ3QgYmVlbiBpc3N1ZWQgeWV0LAorICogYW5kIGNvbW1hbmRzIHRoYXQgYXJlIGN1cnJlbnRseSBleGVjdXRpbmcuICBUaGlzIG1lYW5zIHRoYXQgYW4gCisgKiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGNvbW1hbmRzIG1heSBiZSBxdWV1ZWQsIGxldHRpbmcgCisgKiBtb3JlIGNvbW1hbmRzIHByb3BhZ2F0ZSBmcm9tIHRoZSBoaWdoZXIgZHJpdmVyIGxldmVscyBnaXZpbmcgaGlnaGVyIAorICogdGhyb3VnaHB1dC4gIE5vdGUgdGhhdCBib3RoIElfVF9MIGFuZCBJX1RfTF9RIG5leHVzZXMgYXJlIHN1cHBvcnRlZCwgCisgKiBhbGxvd2luZyBtdWx0aXBsZSBjb21tYW5kcyB0byBwcm9wYWdhdGUgYWxsIHRoZSB3YXkgdG8gYSBTQ1NJLUlJIGRldmljZSAKKyAqIHdoaWxlIGEgY29tbWFuZCBpcyBhbHJlYWR5IGV4ZWN1dGluZy4KKyAqCisgKiBUbyBzb2x2ZSB0aGUgbXVsdGlwbGUtYm9hcmRzLWluLXRoZS1zYW1lLXN5c3RlbSBwcm9ibGVtLCAKKyAqIHRoZXJlIGlzIGEgc2VwYXJhdGUgaW5zdGFuY2Ugc3RydWN0dXJlIGZvciBlYWNoIGluc3RhbmNlCisgKiBvZiBhIDUzODAgaW4gdGhlIHN5c3RlbS4gIFNvLCBtdWx0aXBsZSBOQ1I1MzgwIGRyaXZlcnMgd2lsbAorICogYmUgYWJsZSB0byBjb2V4aXN0IHdpdGggYXBwcm9wcmlhdGUgY2hhbmdlcyB0byB0aGUgaGlnaCBsZXZlbAorICogU0NTSSBjb2RlLiAgCisgKgorICogQSBOQ1I1MzgwX1BVQkxJQ19SRVZJU0lPTiBtYWNybyBpcyBwcm92aWRlZCwgd2l0aCB0aGUgcmVsZWFzZQorICogbnVtYmVyICh1cGRhdGVkIGZvciBlYWNoIHB1YmxpYyByZWxlYXNlKSBwcmludGVkIGJ5IHRoZSAKKyAqIE5DUjUzODBfcHJpbnRfb3B0aW9ucyBjb21tYW5kLCB3aGljaCBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIAorICogd3JhcHBlciBkZXRlY3QgZnVuY3Rpb24sIHNvIHRoYXQgSSBrbm93IHdoYXQgcmVsZWFzZSBvZiB0aGUgZHJpdmVyCisgKiB1c2VycyBhcmUgdXNpbmcuCisgKgorICogSXNzdWVzIHNwZWNpZmljIHRvIHRoZSBOQ1I1MzgwIDogCisgKgorICogV2hlbiB1c2VkIGluIGEgUElPIG9yIHBzZXVkby1kbWEgbW9kZSwgdGhlIE5DUjUzODAgaXMgYSBicmFpbmRlYWQgCisgKiBwaWVjZSBvZiBoYXJkd2FyZSB0aGF0IHJlcXVpcmVzIHlvdSB0byBzaXQgaW4gYSBsb29wIHBvbGxpbmcgZm9yIAorICogdGhlIFJFUSBzaWduYWwgYXMgbG9uZyBhcyB5b3UgYXJlIGNvbm5lY3RlZC4gIFNvbWUgZGV2aWNlcyBhcmUgCisgKiBicmFpbiBkZWFkIChpZSwgbWFueSBURVhFTCBDRCBST00gZHJpdmVzKSBhbmQgd29uJ3QgZGlzY29ubmVjdCAKKyAqIHdoaWxlIGRvaW5nIGxvbmcgc2VlayBvcGVyYXRpb25zLgorICogCisgKiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBpcyB0byBrZWVwIHRyYWNrIG9mIGRldmljZXMgdGhhdCBoYXZlCisgKiBkaXNjb25uZWN0ZWQuICBJZiB0aGUgZGV2aWNlIGhhc24ndCBkaXNjb25uZWN0ZWQsIGZvciBjb21tYW5kcyB0aGF0CisgKiBzaG91bGQgZGlzY29ubmVjdCwgd2UgZG8gc29tZXRoaW5nIGxpa2UgCisgKgorICogd2hpbGUgKCFSRVEgaXMgYXNzZXJ0ZWQpIHsgc2xlZXAgZm9yIE4gdXNlY3M7IHBvbGwgZm9yIE0gdXNlY3MgfQorICogCisgKiBTb21lIHR3ZWFraW5nIG9mIE4gYW5kIE0gbmVlZHMgdG8gYmUgZG9uZS4gIEFuIGFsZ29yaXRobSBiYXNlZCAKKyAqIG9uICJ0aW1lIHRvIGRhdGEiIHdvdWxkIGdpdmUgdGhlIGJlc3QgcmVzdWx0cyBhcyBsb25nIGFzIHNob3J0IHRpbWUKKyAqIHRvIGRhdGFzIChpZSwgb24gdGhlIHNhbWUgdHJhY2spIHdlcmUgY29uc2lkZXJlZCwgaG93ZXZlciB0aGVzZSAKKyAqIGJyb2tlbiBkZXZpY2VzIGFyZSB0aGUgZXhjZXB0aW9uIHJhdGhlciB0aGFuIHRoZSBydWxlIGFuZCBJJ2QgcmF0aGVyCisgKiBzcGVuZCBteSB0aW1lIG9wdGltaXppbmcgZm9yIHRoZSBub3JtYWwgY2FzZS4KKyAqCisgKiBBcmNoaXRlY3R1cmUgOgorICoKKyAqIEF0IHRoZSBoZWFydCBvZiB0aGUgZGVzaWduIGlzIGEgY29yb3V0aW5lLCBOQ1I1MzgwX21haW4sCisgKiB3aGljaCBpcyBzdGFydGVkIHdoZW4gbm90IHJ1bm5pbmcgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyLAorICogdGltZXIsIGFuZCBxdWV1ZSBjb21tYW5kIGZ1bmN0aW9uLiAgSXQgYXR0ZW1wdHMgdG8gZXN0YWJsaXNoCisgKiBJX1RfTCBvciBJX1RfTF9RIG5leHVzZXMgYnkgcmVtb3ZpbmcgdGhlIGNvbW1hbmRzIGZyb20gdGhlIAorICogaXNzdWUgcXVldWUgYW5kIGNhbGxpbmcgTkNSNTM4MF9zZWxlY3QoKSBpZiBhIG5leHVzIAorICogaXMgbm90IGVzdGFibGlzaGVkLiAKKyAqCisgKiBPbmNlIGEgbmV4dXMgaXMgZXN0YWJsaXNoZWQsIHRoZSBOQ1I1MzgwX2luZm9ybWF0aW9uX3RyYW5zZmVyKCkKKyAqIHBoYXNlIGdvZXMgdGhyb3VnaCB0aGUgdmFyaW91cyBwaGFzZXMgYXMgaW5zdHJ1Y3RlZCBieSB0aGUgdGFyZ2V0LgorICogaWYgdGhlIHRhcmdldCBnb2VzIGludG8gTVNHIElOIGFuZCBzZW5kcyBhIERJU0NPTk5FQ1QgbWVzc2FnZSwKKyAqIHRoZSBjb21tYW5kIHN0cnVjdHVyZSBpcyBwbGFjZWQgaW50byB0aGUgcGVyIGluc3RhbmNlIGRpc2Nvbm5lY3RlZAorICogcXVldWUsIGFuZCBOQ1I1MzgwX21haW4gdHJpZXMgdG8gZmluZCBtb3JlIHdvcmsuICBJZiBVU0xFRVAKKyAqIHdhcyBkZWZpbmVkLCBhbmQgdGhlIHRhcmdldCBpcyBpZGxlIGZvciB0b28gbG9uZywgdGhlIHN5c3RlbQorICogd2lsbCB0cnkgdG8gc2xlZXAuCisgKgorICogSWYgYSBjb21tYW5kIGhhcyBkaXNjb25uZWN0ZWQsIGV2ZW50dWFsbHkgYW4gaW50ZXJydXB0IHdpbGwgdHJpZ2dlciwKKyAqIGNhbGxpbmcgTkNSNTM4MF9pbnRyKCkgIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIE5DUjUzODBfcmVzZWxlY3QKKyAqIHRvIHJlZXN0YWJsaXNoIGEgbmV4dXMuICBUaGlzIHdpbGwgcnVuIG1haW4gaWYgbmVjZXNzYXJ5LgorICoKKyAqIE9uIGNvbW1hbmQgdGVybWluYXRpb24sIHRoZSBkb25lIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIAorICogYXBwcm9wcmlhdGUuCisgKgorICogU0NTSSBwb2ludGVycyBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgU0NwIGZpZWxkIG9mIFNDU0kgY29tbWFuZCAKKyAqIHN0cnVjdHVyZXMsIGJlaW5nIGluaXRpYWxpemVkIGFmdGVyIHRoZSBjb21tYW5kIGlzIGNvbm5lY3RlZAorICogaW4gTkNSNTM4MF9zZWxlY3QsIGFuZCBzZXQgYXMgYXBwcm9wcmlhdGUgaW4gTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2Zlci4KKyAqIE5vdGUgdGhhdCBpbiB2aW9sYXRpb24gb2YgdGhlIHN0YW5kYXJkLCBhbiBpbXBsaWNpdCBTQVZFIFBPSU5URVJTIG9wZXJhdGlvbgorICogaXMgZG9uZSwgc2luY2Ugc29tZSBCUk9LRU4gZGlza3MgZmFpbCB0byBpc3N1ZSBhbiBleHBsaWNpdCBTQVZFIFBPSU5URVJTLgorICovCisKKy8qCisgKiBVc2luZyB0aGlzIGZpbGUgOgorICogVGhpcyBmaWxlIGEgc2tlbGV0b24gTGludXggU0NTSSBkcml2ZXIgZm9yIHRoZSBOQ1IgNTM4MCBzZXJpZXMKKyAqIG9mIGNoaXBzLiAgVG8gdXNlIGl0LCB5b3Ugd3JpdGUgYW4gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucyAKKyAqIGFuZCBtYWNyb3MgYW5kIGluY2x1ZGUgdGhpcyBmaWxlIGluIHlvdXIgZHJpdmVyLgorICoKKyAqIFRoZXNlIG1hY3JvcyBjb250cm9sIG9wdGlvbnMgOiAKKyAqIEFVVE9TRU5TRSAtIGlmIGRlZmluZWQsIFJFUVVFU1QgU0VOU0Ugd2lsbCBiZSBwZXJmb3JtZWQgYXV0b21hdGljYWxseQorICoJZm9yIGNvbW1hbmRzIHRoYXQgcmV0dXJuIHdpdGggYSBDSEVDSyBDT05ESVRJT04gc3RhdHVzLiAKKyAqCisgKiBMSU5LRUQgLSBpZiBkZWZpbmVkLCBsaW5rZWQgY29tbWFuZHMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBSRUFMX0RNQSAtIGlmIGRlZmluZWQsIFJFQUwgRE1BIGlzIHVzZWQgZHVyaW5nIHRoZSBkYXRhIHRyYW5zZmVyIHBoYXNlcy4KKyAqCisgKiBTVVBQT1JUX1RBR1MgLSBpZiBkZWZpbmVkLCBTQ1NJLTIgdGFnZ2VkIHF1ZXVpbmcgaXMgdXNlZCB3aGVyZSBwb3NzaWJsZQorICoKKyAqIFRoZXNlIG1hY3JvcyBNVVNUIGJlIGRlZmluZWQgOgorICogCisgKiBOQ1I1MzgwX3JlYWQocmVnaXN0ZXIpICAtIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisgKgorICogTkNSNTM4MF93cml0ZShyZWdpc3RlciwgdmFsdWUpIC0gd3JpdGUgdG8gdGhlIHNwZWNpZmljIHJlZ2lzdGVyIAorICoKKyAqIEVpdGhlciByZWFsIERNQSAqb3IqIHBzZXVkbyBETUEgbWF5IGJlIGltcGxlbWVudGVkCisgKiBSRUFMIGZ1bmN0aW9ucyA6IAorICogTkNSNTM4MF9SRUFMX0RNQSBzaG91bGQgYmUgZGVmaW5lZCBpZiByZWFsIERNQSBpcyB0byBiZSB1c2VkLgorICogTm90ZSB0aGF0IHRoZSBETUEgc2V0dXAgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyAKKyAqCXRoYXQgdGhleSB3ZXJlIGFibGUgdG8gcHJvZ3JhbSB0aGUgY29udHJvbGxlciBmb3IuCisgKgorICogQWxzbyBub3RlIHRoYXQgZ2VuZXJpYyBpMzg2L1BDIHZlcnNpb25zIG9mIHRoZXNlIG1hY3JvcyBhcmUgCisgKglhdmFpbGFibGUgYXMgTkNSNTM4MF9pMzg2X2RtYV93cml0ZV9zZXR1cCwKKyAqCU5DUjUzODBfaTM4Nl9kbWFfcmVhZF9zZXR1cCwgYW5kIE5DUjUzODBfaTM4Nl9kbWFfcmVzaWR1YWwuCisgKgorICogTkNSNTM4MF9kbWFfd3JpdGVfc2V0dXAoaW5zdGFuY2UsIHNyYywgY291bnQpIC0gaW5pdGlhbGl6ZQorICogTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZHN0LCBjb3VudCkgLSBpbml0aWFsaXplCisgKiBOQ1I1MzgwX2RtYV9yZXNpZHVhbChpbnN0YW5jZSk7IC0gcmVzaWR1YWwgY291bnQKKyAqCisgKiBQU0VVRE8gZnVuY3Rpb25zIDoKKyAqIE5DUjUzODBfcHdyaXRlKGluc3RhbmNlLCBzcmMsIGNvdW50KQorICogTkNSNTM4MF9wcmVhZChpbnN0YW5jZSwgZHN0LCBjb3VudCk7CisgKgorICogSWYgbm90aGluZyBzcGVjaWZpYyB0byB0aGlzIGltcGxlbWVudGF0aW9uIG5lZWRzIGRvaW5nIChpZSwgd2l0aCBleHRlcm5hbAorICogaGFyZHdhcmUpLCB5b3UgbXVzdCBhbHNvIGRlZmluZSAKKyAqICAKKyAqIE5DUjUzODBfcXVldWVfY29tbWFuZAorICogTkNSNTM4MF9yZXNldAorICogTkNSNTM4MF9hYm9ydAorICogTkNSNTM4MF9wcm9jX2luZm8KKyAqCisgKiB0byBiZSB0aGUgZ2xvYmFsIGVudHJ5IHBvaW50cyBpbnRvIHRoZSBzcGVjaWZpYyBkcml2ZXIsIGllIAorICogI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgdDEyOF9xdWV1ZV9jb21tYW5kLgorICoKKyAqIElmIHRoaXMgaXMgbm90IGRvbmUsIHRoZSByb3V0aW5lcyB3aWxsIGJlIGRlZmluZWQgYXMgc3RhdGljIGZ1bmN0aW9ucworICogd2l0aCB0aGUgTkNSNTM4MCogbmFtZXMgYW5kIHRoZSB1c2VyIG11c3QgcHJvdmlkZSBhIGdsb2JhbGx5CisgKiBhY2Nlc3NpYmxlIHdyYXBwZXIgZnVuY3Rpb24uCisgKgorICogVGhlIGdlbmVyaWMgZHJpdmVyIGlzIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTkNSNTM4MF9pbml0KGluc3RhbmNlKSwKKyAqIGFmdGVyIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIGhvc3Qgc3BlY2lmaWMgZmllbGRzIGFuZCBJRC4gIElmIHRoZSAKKyAqIGRyaXZlciB3aXNoZXMgdG8gYXV0b3Byb2JlIGZvciBhbiBJUlEgbGluZSwgdGhlIE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLAorICogcG9zc2libGUpIGZ1bmN0aW9uIG1heSBiZSB1c2VkLiAgQmVmb3JlIHRoZSBzcGVjaWZpYyBkcml2ZXIgaW5pdGlhbGl6YXRpb24KKyAqIGNvZGUgZmluaXNoZXMsIE5DUjUzODBfcHJpbnRfb3B0aW9ucyBzaG91bGQgYmUgY2FsbGVkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpmaXJzdF9pbnN0YW5jZSA9IE5VTEw7CitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlICp0aGVfdGVtcGxhdGUgPSBOVUxMOworCisvKiBNYWNyb3MgZWFzZSBsaWZlLi4uIDotKSAqLworI2RlZmluZQlTRVRVUF9IT1NUREFUQShpbikJCQkJXAorICAgIHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9CQkJXAorCShzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbiktPmhvc3RkYXRhCisjZGVmaW5lCUhPU1REQVRBKGluKSAoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopKGluKS0+aG9zdGRhdGEpCisKKyNkZWZpbmUJTkVYVChjbWQpCSgoU2NzaV9DbW5kICopKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKKyNkZWZpbmUJTkVYVEFERFIoY21kKQkoKFNjc2lfQ21uZCAqKikmKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKKworI2RlZmluZQlIT1NUTk8JCWluc3RhbmNlLT5ob3N0X25vCisjZGVmaW5lCUhfTk8oY21kKQkoY21kKS0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vCisKKyNkZWZpbmUgU0dBRERSKGJ1ZmZlcikgKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcygoYnVmZmVyKS0+cGFnZSkpICsgXAorCQkJKGJ1ZmZlciktPm9mZnNldCkKKworI2lmZGVmIFNVUFBPUlRfVEFHUworCisvKgorICogRnVuY3Rpb25zIGZvciBoYW5kbGluZyB0YWdnZWQgcXVldWluZworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICsrcm9tYW4gKDAxLzk2KTogTm93IEkndmUgaW1wbGVtZW50ZWQgU0NTSS0yIHRhZ2dlZCBxdWV1aW5nLiBTb21lIG5vdGVzOgorICoKKyAqIFVzaW5nIGNvbnNlY3V0aXZlIG51bWJlcnMgZm9yIHRoZSB0YWdzIGlzIG5vIGdvb2QgaWRlYSBpbiBteSBleWVzLiBUaGVyZQorICogY291bGQgYmUgd3JvbmcgcmUtdXNpbmdzIGlmIHRoZSBjb3VudGVyICg4IGJpdCEpIHdyYXBzIGFuZCBzb21lIGVhcmx5CisgKiBjb21tYW5kIGhhcyBiZWVuIHByZWVtcHRlZCBmb3IgYSBsb25nIHRpbWUuIE15IHNvbHV0aW9uOiBhIGJpdGZpZWxkIGZvcgorICogcmVtZW1iZXJpbmcgdXNlZCB0YWdzLgorICoKKyAqIFRoZXJlJ3MgYWxzbyB0aGUgcHJvYmxlbSB0aGF0IGVhY2ggdGFyZ2V0IGhhcyBhIGNlcnRhaW4gcXVldWUgc2l6ZSwgYnV0IHdlCisgKiBjYW5ub3Qga25vdyBpdCBpbiBhZHZhbmNlIDotKCBXZSBqdXN0IHNlZSBhIFFVRVVFX0ZVTEwgc3RhdHVzIGJlaW5nCisgKiByZXR1cm5lZC4gU28sIGluIHRoaXMgY2FzZSwgdGhlIGRyaXZlciBpbnRlcm5hbCBxdWV1ZSBzaXplIGFzc3VtcHRpb24gaXMKKyAqIHJlZHVjZWQgdG8gdGhlIG51bWJlciBvZiBhY3RpdmUgdGFncyBpZiBRVUVVRV9GVUxMIGlzIHJldHVybmVkIGJ5IHRoZQorICogdGFyZ2V0LiBUaGUgY29tbWFuZCBpcyByZXR1cm5lZCB0byB0aGUgbWlkLWxldmVsLCBidXQgd2l0aCBzdGF0dXMgY2hhbmdlZAorICogdG8gQlVTWSwgc2luY2UgLS1hcyBJJ3ZlIHNlZW4tLSB0aGUgbWlkLWxldmVsIGNhbid0IGhhbmRsZSBRVUVVRV9GVUxMCisgKiBjb3JyZWN0bHkuCisgKgorICogV2UncmUgYWxzbyBub3QgYWxsb3dlZCBydW5uaW5nIHRhZ2dlZCBjb21tYW5kcyBhcyBsb25nIGFzIGFuIHVudGFnZ2VkCisgKiBjb21tYW5kIGlzIGFjdGl2ZS4gQW5kIFJFUVVFU1QgU0VOU0UgY29tbWFuZHMgYWZ0ZXIgYSBjb250aW5nZW50IGFsbGVnaWFuY2UKKyAqIGNvbmRpdGlvbiBfbXVzdF8gYmUgdW50YWdnZWQuIFRvIGtlZXAgdHJhY2sgd2hldGhlciBhbiB1bnRhZ2dlZCBjb21tYW5kIGhhcworICogYmVlbiBpc3N1ZWQsIHRoZSBob3N0LT5idXN5IGFycmF5IGlzIHN0aWxsIGVtcGxveWVkLCBhcyBpdCBpcyB3aXRob3V0CisgKiBzdXBwb3J0IGZvciB0YWdnZWQgcXVldWluZy4KKyAqCisgKiBPbmUgY291bGQgc3VzcGVjdCB0aGF0IHRoZXJlIGFyZSBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMgYmV0d2VlbgorICogaXNfbHVuX2J1c3koKSwgY21kX2dldF90YWcoKSBhbmQgY21kX2ZyZWVfdGFnKCkuIEJ1dCBJIHRoaW5rIHRoaXMgaXNuJ3QgdGhlCisgKiBjYXNlOiBpc19sdW5fYnVzeSgpIGFuZCBjbWRfZ2V0X3RhZygpIGFyZSBib3RoIGNhbGxlZCBmcm9tIE5DUjUzODBfbWFpbigpLAorICogd2hpY2ggYWxyZWFkeSBndWFyYW50ZWVkIHRvIGJlIHJ1bm5pbmcgYXQgbW9zdCBvbmNlLiBJdCBpcyBhbHNvIHRoZSBvbmx5CisgKiBwbGFjZSB3aGVyZSB0YWdzL0xVTnMgYXJlIGFsbG9jYXRlZC4gU28gbm8gb3RoZXIgYWxsb2NhdGlvbiBjYW4gc2xpcAorICogYmV0d2VlbiB0aGF0IHBhaXIsIHRoZXJlIGNvdWxkIG9ubHkgaGFwcGVuIGEgcmVzZWxlY3Rpb24sIHdoaWNoIGNhbiBmcmVlIGEKKyAqIHRhZywgYnV0IHRoYXQgZG9lc24ndCBodXJ0LiBPbmx5IHRoZSBzZXF1ZW5jZSBpbiBjbWRfZnJlZV90YWcoKSBiZWNvbWVzCisgKiBpbXBvcnRhbnQ6IHRoZSB0YWcgYml0IG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgJ25yX2FsbG9jYXRlZCcgaXMgZGVjcmVhc2VkLgorICovCisKKy8qIC0xIGZvciBUQUdfTk9ORSBpcyBub3QgcG9zc2libGUgd2l0aCB1bnNpZ25lZCBjaGFyIGNtZC0+dGFnICovCisjdW5kZWYgVEFHX05PTkUKKyNkZWZpbmUgVEFHX05PTkUgMHhmZgorCisvKiBGb3IgdGhlIG02OGssIHRoZSBudW1iZXIgb2YgYml0cyBpbiAnYWxsb2NhdGVkJyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIhICovCisjaWYgKE1BWF9UQUdTICUgMzIpICE9IDAKKyNlcnJvciAiTUFYX1RBR1MgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyISIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhcglhbGxvY2F0ZWRbTUFYX1RBR1MvOF07CisgICAgaW50CQlucl9hbGxvY2F0ZWQ7CisgICAgaW50CQlxdWV1ZV9zaXplOworfSBUQUdfQUxMT0M7CisKK3N0YXRpYyBUQUdfQUxMT0MgVGFnQWxsb2NbOF1bOF07IC8qIDggdGFyZ2V0cyBhbmQgOCBMVU5zICovCisKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfdGFncyggdm9pZCApCit7CisgICAgaW50IHRhcmdldCwgbHVuOworICAgIFRBR19BTExPQyAqdGE7CisgICAgCisgICAgaWYgKCFzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcpCisJcmV0dXJuOworICAgIAorICAgIGZvciggdGFyZ2V0ID0gMDsgdGFyZ2V0IDwgODsgKyt0YXJnZXQgKSB7CisJZm9yKCBsdW4gPSAwOyBsdW4gPCA4OyArK2x1biApIHsKKwkgICAgdGEgPSAmVGFnQWxsb2NbdGFyZ2V0XVtsdW5dOworCSAgICBtZW1zZXQoICZ0YS0+YWxsb2NhdGVkLCAwLCBNQVhfVEFHUy84ICk7CisJICAgIHRhLT5ucl9hbGxvY2F0ZWQgPSAwOworCSAgICAvKiBBdCB0aGUgYmVnaW5uaW5nLCBhc3N1bWUgdGhlIG1heGltdW0gcXVldWUgc2l6ZSB3ZSBjb3VsZAorCSAgICAgKiBzdXBwb3J0IChNQVhfVEFHUykuIFRoaXMgdmFsdWUgd2lsbCBiZSBkZWNyZWFzZWQgaWYgdGhlIHRhcmdldAorCSAgICAgKiByZXR1cm5zIFFVRVVFX0ZVTEwgc3RhdHVzLgorCSAgICAgKi8KKwkgICAgdGEtPnF1ZXVlX3NpemUgPSBNQVhfVEFHUzsKKwl9CisgICAgfQorfQorCisKKy8qIENoZWNrIGlmIHdlIGNhbiBpc3N1ZSBhIGNvbW1hbmQgdG8gdGhpcyBMVU46IEZpcnN0IHNlZSBpZiB0aGUgTFVOIGlzIG1hcmtlZAorICogYnVzeSBieSBhbiB1bnRhZ2dlZCBjb21tYW5kLiBJZiB0aGUgY29tbWFuZCBzaG91bGQgdXNlIHRhZ2dlZCBxdWV1aW5nLCBhbHNvCisgKiBjaGVjayB0aGF0IHRoZXJlIGlzIGEgZnJlZSB0YWcgYW5kIHRoZSB0YXJnZXQncyBxdWV1ZSB3b24ndCBvdmVyZmxvdy4gVGhpcworICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdG8gYXZvaWQgcmFjZQorICogY29uZGl0aW9ucy4KKyAqLyAKKworc3RhdGljIGludCBpc19sdW5fYnVzeSggU2NzaV9DbW5kICpjbWQsIGludCBzaG91bGRfYmVfdGFnZ2VkICkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CisKKyAgICBpZiAoaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pKQorCXJldHVybiggMSApOworICAgIGlmICghc2hvdWxkX2JlX3RhZ2dlZCB8fAorCSFzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcgfHwgIWNtZC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKQorCXJldHVybiggMCApOworICAgIGlmIChUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dLm5yX2FsbG9jYXRlZCA+PQorCVRhZ0FsbG9jW2NtZC0+ZGV2aWNlLT5pZF1bY21kLT5kZXZpY2UtPmx1bl0ucXVldWVfc2l6ZSApIHsKKwlUQUdfUFJJTlRLKCAic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkOiBubyBmcmVlIHRhZ3NcbiIsCisJCSAgICBIX05PKGNtZCksIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biApOworCXJldHVybiggMSApOworICAgIH0KKyAgICByZXR1cm4oIDAgKTsKK30KKworCisvKiBBbGxvY2F0ZSBhIHRhZyBmb3IgYSBjb21tYW5kICh0aGVyZSBhcmUgbm8gY2hlY2tzIGFueW1vcmUsIGNoZWNrX2x1bl9idXN5KCkKKyAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSEpLCBvciByZXNlcnZlIHRoZSBMVU4gaW4gJ2J1c3knIGlmIHRoZSBjb21tYW5kIGlzCisgKiB1bnRhZ2dlZC4KKyAqLworCitzdGF0aWMgdm9pZCBjbWRfZ2V0X3RhZyggU2NzaV9DbW5kICpjbWQsIGludCBzaG91bGRfYmVfdGFnZ2VkICkKK3sKKyAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CisKKyAgICAvKiBJZiB3ZSBvciB0aGUgdGFyZ2V0IGRvbid0IHN1cHBvcnQgdGFnZ2VkIHF1ZXVpbmcsIGFsbG9jYXRlIHRoZSBMVU4gZm9yCisgICAgICogYW4gdW50YWdnZWQgY29tbWFuZC4KKyAgICAgKi8KKyAgICBpZiAoIXNob3VsZF9iZV90YWdnZWQgfHwKKwkhc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nIHx8ICFjbWQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCWNtZC0+dGFnID0gVEFHX05PTkU7CisJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwlUQUdfUFJJTlRLKCAic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkIG5vdyBhbGxvY2F0ZWQgYnkgdW50YWdnZWQgIgorCQkgICAgImNvbW1hbmRcbiIsIEhfTk8oY21kKSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuICk7CisgICAgfQorICAgIGVsc2UgeworCVRBR19BTExPQyAqdGEgPSAmVGFnQWxsb2NbY21kLT5kZXZpY2UtPmlkXVtjbWQtPmRldmljZS0+bHVuXTsKKworCWNtZC0+dGFnID0gZmluZF9maXJzdF96ZXJvX2JpdCggJnRhLT5hbGxvY2F0ZWQsIE1BWF9UQUdTICk7CisJc2V0X2JpdCggY21kLT50YWcsICZ0YS0+YWxsb2NhdGVkICk7CisJdGEtPm5yX2FsbG9jYXRlZCsrOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHVzaW5nIHRhZyAlZCBmb3IgdGFyZ2V0ICVkIGx1biAlZCAiCisJCSAgICAiKG5vdyAlZCB0YWdzIGluIHVzZSlcbiIsCisJCSAgICBIX05PKGNtZCksIGNtZC0+dGFnLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sCisJCSAgICB0YS0+bnJfYWxsb2NhdGVkICk7CisgICAgfQorfQorCisKKy8qIE1hcmsgdGhlIHRhZyBvZiBjb21tYW5kICdjbWQnIGFzIGZyZWUsIG9yIGluIGNhc2Ugb2YgYW4gdW50YWdnZWQgY29tbWFuZCwKKyAqIHVubG9jayB0aGUgTFVOLgorICovCisKK3N0YXRpYyB2b2lkIGNtZF9mcmVlX3RhZyggU2NzaV9DbW5kICpjbWQgKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIGlmIChjbWQtPnRhZyA9PSBUQUdfTk9ORSkgeworCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCVRBR19QUklOVEsoICJzY3NpJWQ6IHRhcmdldCAlZCBsdW4gJWQgdW50YWdnZWQgY21kIGZpbmlzaGVkXG4iLAorCQkgICAgSF9OTyhjbWQpLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY21kLT50YWcgPj0gTUFYX1RBR1MpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogdHJ5aW5nIHRvIGZyZWUgYmFkIHRhZyAlZCFcbiIsCisJCUhfTk8oY21kKSwgY21kLT50YWcgKTsKKyAgICB9CisgICAgZWxzZSB7CisJVEFHX0FMTE9DICp0YSA9ICZUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCWNsZWFyX2JpdCggY21kLT50YWcsICZ0YS0+YWxsb2NhdGVkICk7CisJdGEtPm5yX2FsbG9jYXRlZC0tOworCVRBR19QUklOVEsoICJzY3NpJWQ6IGZyZWVkIHRhZyAlZCBmb3IgdGFyZ2V0ICVkIGx1biAlZFxuIiwKKwkJICAgIEhfTk8oY21kKSwgY21kLT50YWcsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2FsbF90YWdzKCB2b2lkICkKK3sKKyAgICBpbnQgdGFyZ2V0LCBsdW47CisgICAgVEFHX0FMTE9DICp0YTsKKworICAgIGlmICghc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nKQorCXJldHVybjsKKyAgICAKKyAgICBmb3IoIHRhcmdldCA9IDA7IHRhcmdldCA8IDg7ICsrdGFyZ2V0ICkgeworCWZvciggbHVuID0gMDsgbHVuIDwgODsgKytsdW4gKSB7CisJICAgIHRhID0gJlRhZ0FsbG9jW3RhcmdldF1bbHVuXTsKKwkgICAgbWVtc2V0KCAmdGEtPmFsbG9jYXRlZCwgMCwgTUFYX1RBR1MvOCApOworCSAgICB0YS0+bnJfYWxsb2NhdGVkID0gMDsKKwl9CisgICAgfQorfQorCisjZW5kaWYgLyogU1VQUE9SVF9UQUdTICovCisKKworLyoKKyAqIEZ1bmN0aW9uOiB2b2lkIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyggU2NzaV9DbW5kICpjbWQgKQorICoKKyAqIFB1cnBvc2U6IFRyeSB0byBtZXJnZSBzZXZlcmFsIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3RzIGludG8gb25lIERNQQorICogICAgdHJhbnNmZXIuIFRoaXMgaXMgcG9zc2libGUgaWYgdGhlIHNjYXR0ZXIgYnVmZmVycyBsaWUgb24KKyAqICAgIHBoeXNpY2FsIGNvbnRpZ3VvdXMgYWRkcmVzc2VzLgorICoKKyAqIFBhcmFtZXRlcnM6IFNjc2lfQ21uZCAqY21kCisgKiAgICBUaGUgY29tbWFuZCB0byB3b3JrIG9uLiBUaGUgZmlyc3Qgc2NhdHRlciBidWZmZXIncyBkYXRhIGFyZQorICogICAgYXNzdW1lZCB0byBiZSBhbHJlYWR5IHRyYW5zZmVyZWQgaW50byBwdHIvdGhpc19yZXNpZHVhbC4KKyAqLworCitzdGF0aWMgdm9pZCBtZXJnZV9jb250aWd1b3VzX2J1ZmZlcnMoIFNjc2lfQ21uZCAqY21kICkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGVuZGFkZHI7CisjaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQorICAgIHVuc2lnbmVkIGxvbmcgb2xkbGVuID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKKyAgICBpbnQJCSAgY250ID0gMTsKKyNlbmRpZgorCisgICAgZm9yIChlbmRhZGRyID0gdmlydF90b19waHlzKGNtZC0+U0NwLnB0ciArIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgLSAxKSArIDE7CisJIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgJiYKKwkgdmlydF90b19waHlzKFNHQUREUigmKGNtZC0+U0NwLmJ1ZmZlclsxXSkpKSA9PSBlbmRhZGRyOyApIHsKKwkKKwlNRVJfUFJJTlRLKCJWVE9QKCVwKSA9PSAlMDhseCAtPiBtZXJnaW5nXG4iLAorCQkgICBTR0FERFIoJihjbWQtPlNDcC5idWZmZXJbMV0pKSwgZW5kYWRkcik7CisjaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQorCSsrY250OworI2VuZGlmCisJKytjbWQtPlNDcC5idWZmZXI7CisJLS1jbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgKz0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJZW5kYWRkciArPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKKyAgICB9CisjaWYgKE5ERUJVRyAmIE5ERUJVR19NRVJHSU5HKQorICAgIGlmIChvbGRsZW4gIT0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCkKKwlNRVJfUFJJTlRLKCJtZXJnZWQgJWQgYnVmZmVycyBmcm9tICVwLCBuZXcgbGVuZ3RoICUwOHhcbiIsCisJCSAgIGNudCwgY21kLT5TQ3AucHRyLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIGluaXRpYWxpemVfU0NwKFNjc2lfQ21uZCAqY21kKQorICoKKyAqIFB1cnBvc2UgOiBpbml0aWFsaXplIHRoZSBzYXZlZCBkYXRhIHBvaW50ZXJzIGZvciBjbWQgdG8gcG9pbnQgdG8gdGhlIAorICoJc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBJbnB1dHMgOiBjbWQgLSBTY3NpX0NtbmQgc3RydWN0dXJlIHRvIGhhdmUgcG9pbnRlcnMgcmVzZXQuCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBpbml0aWFsaXplX1NDcChTY3NpX0NtbmQgKmNtZCkKK3sKKyAgICAvKiAKKyAgICAgKiBJbml0aWFsaXplIHRoZSBTY3NpIFBvaW50ZXIgZmllbGQgc28gdGhhdCBhbGwgb2YgdGhlIGNvbW1hbmRzIGluIHRoZSAKKyAgICAgKiB2YXJpb3VzIHF1ZXVlcyBhcmUgdmFsaWQuCisgICAgICovCisKKyAgICBpZiAoY21kLT51c2Vfc2cpIHsKKwljbWQtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+YnVmZmVyOworCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBjbWQtPnVzZV9zZyAtIDE7CisJY21kLT5TQ3AucHRyID0gKGNoYXIgKikgU0dBRERSKGNtZC0+U0NwLmJ1ZmZlcik7CisJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCisJLyogKytyb21hbjogVHJ5IHRvIG1lcmdlIHNvbWUgc2NhdHRlci1idWZmZXJzIGlmIHRoZXkgYXJlIGF0CisJICogY29udGlndW91cyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJICovCisvLwltZXJnZV9jb250aWd1b3VzX2J1ZmZlcnMoIGNtZCApOworICAgIH0gZWxzZSB7CisJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKKwljbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKyAgICB9CisgICAgCit9CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaWYgMQorc3RhdGljIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBtYXNrOworICAgIGNvbnN0IGNoYXIgKiBuYW1lO30gCitzaWduYWxzW10gPSB7eyBTUl9EQlAsICJQQVJJVFkifSwgeyBTUl9SU1QsICJSU1QiIH0sIHsgU1JfQlNZLCAiQlNZIiB9LCAKKyAgICB7IFNSX1JFUSwgIlJFUSIgfSwgeyBTUl9NU0csICJNU0ciIH0sIHsgU1JfQ0QsICAiQ0QiIH0sIHsgU1JfSU8sICJJTyIgfSwgCisgICAgeyBTUl9TRUwsICJTRUwiIH0sIHswLCBOVUxMfX0sIAorYmFzcnNbXSA9IHt7QkFTUl9BVE4sICJBVE4ifSwge0JBU1JfQUNLLCAiQUNLIn0sIHswLCBOVUxMfX0sCitpY3JzW10gPSB7e0lDUl9BU1NFUlRfUlNULCAiQVNTRVJUIFJTVCJ9LHtJQ1JfQVNTRVJUX0FDSywgIkFTU0VSVCBBQ0sifSwKKyAgICB7SUNSX0FTU0VSVF9CU1ksICJBU1NFUlQgQlNZIn0sIHtJQ1JfQVNTRVJUX1NFTCwgIkFTU0VSVCBTRUwifSwgCisgICAge0lDUl9BU1NFUlRfQVROLCAiQVNTRVJUIEFUTiJ9LCB7SUNSX0FTU0VSVF9EQVRBLCAiQVNTRVJUIERBVEEifSwgCisgICAgezAsIE5VTEx9fSwKK21yc1tdID0ge3tNUl9CTE9DS19ETUFfTU9ERSwgIk1PREUgQkxPQ0sgRE1BIn0sIHtNUl9UQVJHRVQsICJNT0RFIFRBUkdFVCJ9LCAKKyAgICB7TVJfRU5BQkxFX1BBUl9DSEVDSywgIk1PREUgUEFSSVRZIENIRUNLIn0sIHtNUl9FTkFCTEVfUEFSX0lOVFIsIAorICAgICJNT0RFIFBBUklUWSBJTlRSIn0sIHtNUl9FTkFCTEVfRU9QX0lOVFIsIk1PREUgRU9QIElOVFIifSwKKyAgICB7TVJfTU9OSVRPUl9CU1ksICJNT0RFIE1PTklUT1IgQlNZIn0sCisgICAge01SX0RNQV9NT0RFLCAiTU9ERSBETUEifSwge01SX0FSQklUUkFURSwgIk1PREUgQVJCSVRSQVRJT04ifSwgCisgICAgezAsIE5VTEx9fTsKKworLyoKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBwcmludCB0aGUgU0NTSSBidXMgc2lnbmFscyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisgKgorICogSW5wdXQgOiBpbnN0YW5jZSAtIHdoaWNoIE5DUjUzODAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKSB7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXMsIGRhdGEsIGJhc3IsIG1yLCBpY3IsIGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBkYXRhID0gTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRyk7CisgICAgc3RhdHVzID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworICAgIG1yID0gTkNSNTM4MF9yZWFkKE1PREVfUkVHKTsKKyAgICBpY3IgPSBOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKTsKKyAgICBiYXNyID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyk7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIHByaW50aygiU1RBVFVTX1JFRzogJTAyeCAiLCBzdGF0dXMpOworICAgIGZvciAoaSA9IDA7IHNpZ25hbHNbaV0ubWFzayA7ICsraSkgCisJaWYgKHN0YXR1cyAmIHNpZ25hbHNbaV0ubWFzaykKKwkgICAgcHJpbnRrKCIsJXMiLCBzaWduYWxzW2ldLm5hbWUpOworICAgIHByaW50aygiXG5CQVNSOiAlMDJ4ICIsIGJhc3IpOworICAgIGZvciAoaSA9IDA7IGJhc3JzW2ldLm1hc2sgOyArK2kpIAorCWlmIChiYXNyICYgYmFzcnNbaV0ubWFzaykKKwkgICAgcHJpbnRrKCIsJXMiLCBiYXNyc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuSUNSOiAlMDJ4ICIsIGljcik7CisgICAgZm9yIChpID0gMDsgaWNyc1tpXS5tYXNrOyArK2kpIAorCWlmIChpY3IgJiBpY3JzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgaWNyc1tpXS5uYW1lKTsKKyAgICBwcmludGsoIlxuTU9ERTogJTAyeCAiLCBtcik7CisgICAgZm9yIChpID0gMDsgbXJzW2ldLm1hc2s7ICsraSkgCisJaWYgKG1yICYgbXJzW2ldLm1hc2spCisJICAgIHByaW50aygiLCVzIiwgbXJzW2ldLm5hbWUpOworICAgIHByaW50aygiXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworfSBwaGFzZXNbXSA9IHsKKyAgICB7UEhBU0VfREFUQU9VVCwgIkRBVEFPVVQifSwge1BIQVNFX0RBVEFJTiwgIkRBVEFJTiJ9LCB7UEhBU0VfQ01ET1VULCAiQ01ET1VUIn0sCisgICAge1BIQVNFX1NUQVRJTiwgIlNUQVRJTiJ9LCB7UEhBU0VfTVNHT1VULCAiTVNHT1VUIn0sIHtQSEFTRV9NU0dJTiwgIk1TR0lOIn0sCisgICAge1BIQVNFX1VOS05PV04sICJVTktOT1dOIn19OworCisvKiAKKyAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3ByaW50X3BoYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBwcmludCB0aGUgY3VycmVudCBTQ1NJIHBoYXNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqCisgKiBJbnB1dCA6IGluc3RhbmNlIC0gd2hpY2ggTkNSNTM4MAorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcHJpbnRfcGhhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgdW5zaWduZWQgY2hhciBzdGF0dXM7CisgICAgaW50IGk7CisKKyAgICBzdGF0dXMgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRyk7CisgICAgaWYgKCEoc3RhdHVzICYgU1JfUkVRKSkgCisJcHJpbnRrKEtFUk5fREVCVUcgInNjc2klZDogUkVRIG5vdCBhc3NlcnRlZCwgcGhhc2UgdW5rbm93bi5cbiIsIEhPU1ROTyk7CisgICAgZWxzZSB7CisJZm9yIChpID0gMDsgKHBoYXNlc1tpXS52YWx1ZSAhPSBQSEFTRV9VTktOT1dOKSAmJiAKKwkgICAgKHBoYXNlc1tpXS52YWx1ZSAhPSAoc3RhdHVzICYgUEhBU0VfTUFTSykpOyArK2kpOyAKKwlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiBwaGFzZSAlc1xuIiwgSE9TVE5PLCBwaGFzZXNbaV0ubmFtZSk7CisgICAgfQorfQorCisjZWxzZSAvKiAhTkRFQlVHICovCisKKy8qIGR1bW1pZXMuLi4gKi8KK19faW5saW5lX18gdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKSB7IH07CitfX2lubGluZV9fIHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkgeyB9OworCisjZW5kaWYKKworLyoKKyAqICsrcm9tYW46IE5ldyBzY2hlbWUgb2YgY2FsbGluZyBOQ1I1MzgwX21haW4oKQorICogCisgKiBJZiB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0LCB3ZSBjYW4gY2FsbCBvdXIgbWFpbiBkaXJlY3RseSwgaXQgY2Fubm90IGJlCisgKiBhbHJlYWR5IHJ1bm5pbmcuIEVsc2UsIHdlIHF1ZXVlIGl0IG9uIGEgdGFzayBxdWV1ZSwgaWYgbm90ICdtYWluX3J1bm5pbmcnCisgKiB0ZWxscyB1cyB0aGF0IGEgbG93ZXIgbGV2ZWwgaXMgYWxyZWFkeSBleGVjdXRpbmcgaXQuIFRoaXMgd2F5LAorICogJ21haW5fcnVubmluZycgbmVlZHMgbm90IGJlIHByb3RlY3RlZCBpbiBhIHNwZWNpYWwgd2F5LgorICoKKyAqIHF1ZXVlX21haW4oKSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gZm9yIHB1dHRpbmcgb3VyIG1haW4gb250byB0aGUgdGFzaworICogcXVldWUsIGlmIG1haW5fcnVubmluZyBpcyBmYWxzZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZyb20gYQorICogaW50ZXJydXB0IG9yIGJvdHRvbSBoYWxmLgorICovCisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworc3RhdGljIHZvbGF0aWxlIGludCBtYWluX3J1bm5pbmcgPSAwOworc3RhdGljIERFQ0xBUkVfV09SSyhOQ1I1MzgwX3RxdWV1ZSwgKHZvaWQgKCopKHZvaWQqKSlOQ1I1MzgwX21haW4sIE5VTEwpOworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHF1ZXVlX21haW4odm9pZCkKK3sKKyAgICBpZiAoIW1haW5fcnVubmluZykgeworCS8qIElmIGluIGludGVycnVwdCBhbmQgTkNSNTM4MF9tYWluKCkgbm90IGFscmVhZHkgcnVubmluZywKKwkgICBxdWV1ZSBpdCBvbiB0aGUgJ2ltbWVkaWF0ZScgdGFzayBxdWV1ZSwgdG8gYmUgcHJvY2Vzc2VkCisJICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHByb2Nlc3NpbmcgaGFzCisJICAgZmluaXNoZWQuICovCisJc2NoZWR1bGVfd29yaygmTkNSNTM4MF90cXVldWUpOworICAgIH0KKyAgICAvKiBlbHNlOiBub3RoaW5nIHRvIGRvOiB0aGUgcnVubmluZyBOQ1I1MzgwX21haW4oKSB3aWxsIHBpY2sgdXAKKyAgICAgICBhbnkgbmV3bHkgcXVldWVkIGNvbW1hbmQuICovCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIE5DUjUzODBfYWxsX2luaXQgKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKyAgICBpZiAoIWRvbmUpIHsKKwlJTklfUFJJTlRLKCJzY3NpIDogTkNSNTM4MF9hbGxfaW5pdCgpXG4iKTsKKwlkb25lID0gMTsKKyAgICB9Cit9CisKKyAKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTgzODBfcHJpbnRfb3B0aW9ucyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IGNhbGxlZCBieSBwcm9iZSBjb2RlIGluZGljYXRpbmcgdGhlIE5DUjUzODAgZHJpdmVyCisgKgkgICAgIG9wdGlvbnMgdGhhdCB3ZXJlIHNlbGVjdGVkLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBwb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UuICBVbnVzZWQuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IE5DUjUzODBfcHJpbnRfb3B0aW9ucyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgcHJpbnRrKCIgZ2VuZXJpYyBvcHRpb25zIgorI2lmZGVmIEFVVE9TRU5TRSAKKyAgICAiIEFVVE9TRU5TRSIKKyNlbmRpZgorI2lmZGVmIFJFQUxfRE1BCisgICAgIiBSRUFMIERNQSIKKyNlbmRpZgorI2lmZGVmIFBBUklUWQorICAgICIgUEFSSVRZIgorI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgIiBTQ1NJLTIgVEFHR0VEIFFVRVVJTkciCisjZW5kaWYKKyAgICApOworICAgIHByaW50aygiIGdlbmVyaWMgcmVsZWFzZT0lZCIsIE5DUjUzODBfUFVCTElDX1JFTEVBU0UpOworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfcHJpbnRfc3RhdHVzIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogcHJpbnQgY29tbWFuZHMgaW4gdGhlIHZhcmlvdXMgcXVldWVzLCBjYWxsZWQgZnJvbQorICoJTkNSNTM4MF9hYm9ydCBhbmQgTkNSNTM4MF9kZWJ1ZyB0byBhaWQgZGVidWdnaW5nLgorICoKKyAqIElucHV0cyA6IGluc3RhbmNlLCBwb2ludGVyIHRvIHRoaXMgaW5zdGFuY2UuICAKKyAqLworCitzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X3N0YXR1cyAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisgICAgY2hhciAqcHJfYmZyOworICAgIGNoYXIgKnN0YXJ0OworICAgIGludCBsZW47CisKKyAgICBOQ1JfUFJJTlQoTkRFQlVHX0FOWSk7CisgICAgTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19BTlkpOworCisgICAgcHJfYmZyID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworICAgIGlmICghcHJfYmZyKSB7CisJcHJpbnRrKCJOQ1I1MzgwX3ByaW50X3N0YXR1czogbm8gbWVtb3J5IGZvciBwcmludCBidWZmZXJcbiIpOworCXJldHVybjsKKyAgICB9CisgICAgbGVuID0gTkNSNTM4MF9wcm9jX2luZm8oaW5zdGFuY2UsIHByX2JmciwgJnN0YXJ0LCAwLCBQQUdFX1NJWkUsIDApOworICAgIHByX2JmcltsZW5dID0gMDsKKyAgICBwcmludGsoIlxuJXNcbiIsIHByX2Jmcik7CisgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwcl9iZnIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogL3Byb2Mvc2NzaS9bZHRjIHBhczE2IHQxMjggZ2VuZXJpY10vWzAtQVNDX05VTV9CT0FSRF9TVVBQT1JURURdCisgKgorICogKmJ1ZmZlcjogSS9PIGJ1ZmZlcgorICogKipzdGFydDogaWYgaW5vdXQgPT0gRkFMU0UgcG9pbnRlciBpbnRvIGJ1ZmZlciB3aGVyZSB1c2VyIHJlYWQgc2hvdWxkIHN0YXJ0CisgKiBvZmZzZXQ6IGN1cnJlbnQgb2Zmc2V0CisgKiBsZW5ndGg6IGxlbmd0aCBvZiBidWZmZXIKKyAqIGhvc3RubzogU2NzaV9Ib3N0IGhvc3Rfbm8KKyAqIGlub3V0OiBUUlVFIC0gdXNlciBpcyB3cml0aW5nOyBGQUxTRSAtIHVzZXIgaXMgcmVhZGluZworICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBvciB3cml0dGVuCisqLworCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGZtdCxhcmdzLi4uKSBcCisgIGRvIHsgaWYgKHBvcyArIHN0cmxlbihmbXQpICsgMjAgLyogc2xvcCAqLyA8IGJ1ZmZlciArIGxlbmd0aCkgXAorCSBwb3MgKz0gc3ByaW50Zihwb3MsIGZtdCAsICMjIGFyZ3MpOyB9IHdoaWxlKDApCitzdGF0aWMKK2NoYXIgKmxwcmludF9TY3NpX0NtbmQgKFNjc2lfQ21uZCAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCk7CisKK3N0YXRpYyBpbnQgTkNSNTM4MF9wcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJICAgICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQoreworICAgIGNoYXIgKnBvcyA9IGJ1ZmZlcjsKKyAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7CisgICAgU2NzaV9DbW5kICpwdHI7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBvZmZfdCBiZWdpbiA9IDA7CisjZGVmaW5lIGNoZWNrX29mZnNldCgpCQkJCVwKKyAgICBkbyB7CQkJCQlcCisJaWYgKHBvcyAtIGJ1ZmZlciA8IG9mZnNldCAtIGJlZ2luKSB7CVwKKwkgICAgYmVnaW4gKz0gcG9zIC0gYnVmZmVyOwkJXAorCSAgICBwb3MgPSBidWZmZXI7CQkJXAorCX0JCQkJCVwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaG9zdGRhdGEgPSAoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGE7CisKKyAgICBpZiAoaW5vdXQpIHsgLyogSGFzIGRhdGEgYmVlbiB3cml0dGVuIHRvIHRoZSBmaWxlID8gKi8KKwlyZXR1cm4oLUVOT1NZUyk7ICAvKiBDdXJyZW50bHkgdGhpcyBpcyBhIG5vLW9wICovCisgICAgfQorICAgIFNQUklOVEYoIk5DUjUzODAgY29yZSByZWxlYXNlPSVkLlxuIiwgTkNSNTM4MF9QVUJMSUNfUkVMRUFTRSk7CisgICAgY2hlY2tfb2Zmc2V0KCk7CisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIFNQUklOVEYoIk5DUjUzODA6IGNvcm91dGluZSBpcyVzIHJ1bm5pbmcuXG4iLCBtYWluX3J1bm5pbmcgPyAiIiA6ICJuJ3QiKTsKKyAgICBjaGVja19vZmZzZXQoKTsKKyAgICBpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpCisJU1BSSU5URigic2NzaSVkOiBubyBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhPU1ROTyk7CisgICAgZWxzZQorCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZCwKKwkJCQlwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICBTUFJJTlRGKCJzY3NpJWQ6IGlzc3VlX3F1ZXVlXG4iLCBIT1NUTk8pOworICAgIGNoZWNrX29mZnNldCgpOworICAgIGZvciAocHRyID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7IHB0cjsgcHRyID0gTkVYVChwdHIpKSB7CisJcG9zID0gbHByaW50X1Njc2lfQ21uZCAocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKKwljaGVja19vZmZzZXQoKTsKKyAgICB9CisKKyAgICBTUFJJTlRGKCJzY3NpJWQ6IGRpc2Nvbm5lY3RlZF9xdWV1ZVxuIiwgSE9TVE5PKTsKKyAgICBjaGVja19vZmZzZXQoKTsKKyAgICBmb3IgKHB0ciA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgcHRyOworCSBwdHIgPSBORVhUKHB0cikpIHsKKwlwb3MgPSBscHJpbnRfU2NzaV9DbW5kIChwdHIsIHBvcywgYnVmZmVyLCBsZW5ndGgpOworCWNoZWNrX29mZnNldCgpOworICAgIH0KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICAqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOworICAgIGlmIChwb3MgLSBidWZmZXIgPCBvZmZzZXQgLSBiZWdpbikKKwlyZXR1cm4gMDsKKyAgICBlbHNlIGlmIChwb3MgLSBidWZmZXIgLSAob2Zmc2V0IC0gYmVnaW4pIDwgbGVuZ3RoKQorCXJldHVybiBwb3MgLSBidWZmZXIgLSAob2Zmc2V0IC0gYmVnaW4pOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBjaGFyICoKK2xwcmludF9TY3NpX0NtbmQgKFNjc2lfQ21uZCAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaSwgczsKKyAgICB1bnNpZ25lZCBjaGFyICpjb21tYW5kOworICAgIFNQUklOVEYoInNjc2klZDogZGVzdGluYXRpb24gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsCisJICAgIEhfTk8oY21kKSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyAgICBTUFJJTlRGKCIgICAgICAgIGNvbW1hbmQgPSAiKTsKKyAgICBjb21tYW5kID0gY21kLT5jbW5kOworICAgIFNQUklOVEYoIiUyZCAoMHglMDJ4KSIsIGNvbW1hbmRbMF0sIGNvbW1hbmRbMF0pOworICAgIGZvciAoaSA9IDEsIHMgPSBDT01NQU5EX1NJWkUoY29tbWFuZFswXSk7IGkgPCBzOyArK2kpCisJU1BSSU5URigiICUwMngiLCBjb21tYW5kW2ldKTsKKyAgICBTUFJJTlRGKCJcbiIpOworICAgIHJldHVybiBwb3M7Cit9CisKKworLyogCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9pbml0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZXMgKmluc3RhbmNlIGFuZCBjb3JyZXNwb25kaW5nIDUzODAgY2hpcC4KKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIGluc3RhbnRpYXRpb24gb2YgdGhlIDUzODAgZHJpdmVyLiAgCisgKgorICogTm90ZXMgOiBJIGFzc3VtZSB0aGF0IHRoZSBob3N0LCBob3N0bm8sIGFuZCBpZCBiaXRzIGhhdmUgYmVlbgorICogCXNldCBjb3JyZWN0bHkuICBJIGRvbid0IGNhcmUgYWJvdXQgdGhlIGlycSBhbmQgb3RoZXIgZmllbGRzLiAKKyAqIAorICovCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9pbml0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IGZsYWdzKQoreworICAgIGludCBpOworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKworICAgIE5DUjUzODBfYWxsX2luaXQoKTsKKworICAgIGhvc3RkYXRhLT5hYm9ydGVkID0gMDsKKyAgICBob3N0ZGF0YS0+aWRfbWFzayA9IDEgPDwgaW5zdGFuY2UtPnRoaXNfaWQ7CisgICAgaG9zdGRhdGEtPmlkX2hpZ2hlcl9tYXNrID0gMDsKKyAgICBmb3IgKGkgPSBob3N0ZGF0YS0+aWRfbWFzazsgaSA8PSAweDgwOyBpIDw8PSAxKQorCWlmIChpID4gaG9zdGRhdGEtPmlkX21hc2spCisJICAgIGhvc3RkYXRhLT5pZF9oaWdoZXJfbWFzayB8PSBpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIGluaXRfdGFncygpOworI2VuZGlmCisjaWYgZGVmaW5lZCAoUkVBTF9ETUEpCisgICAgaG9zdGRhdGEtPmRtYV9sZW4gPSAwOworI2VuZGlmCisgICAgaG9zdGRhdGEtPnRhcmdldHNfcHJlc2VudCA9IDA7CisgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gTlVMTDsKKyAgICBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gTlVMTDsKKyAgICBob3N0ZGF0YS0+ZmxhZ3MgPSBGTEFHX0NIRUNLX0xBU1RfQllURV9TRU5UOworCisgICAgaWYgKCF0aGVfdGVtcGxhdGUpIHsKKwl0aGVfdGVtcGxhdGUgPSBpbnN0YW5jZS0+aG9zdHQ7CisJZmlyc3RfaW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisJCisKKyNpZm5kZWYgQVVUT1NFTlNFCisgICAgaWYgKChpbnN0YW5jZS0+Y21kX3Blcl9sdW4gPiAxKSB8fCAoaW5zdGFuY2UtPmNhbl9xdWV1ZSA+IDEpKQorCSBwcmludGsoInNjc2klZDogV0FSTklORyA6IHN1cHBvcnQgZm9yIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzIGVuYWJsZWRcbiIKKwkgICAgICAgICIgICAgICAgIHdpdGhvdXQgQVVUT1NFTlNFIG9wdGlvbiwgY29udGluZ2VudCBhbGxlZ2lhbmNlIGNvbmRpdGlvbnMgbWF5XG4iCisJICAgICAgICAiICAgICAgICBiZSBpbmNvcnJlY3RseSBjbGVhcmVkLlxuIiwgSE9TVE5PKTsKKyNlbmRpZiAvKiBkZWYgQVVUT1NFTlNFICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworICAgIE5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAwKTsKKyAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCAwKTsKKworICAgIHJldHVybiAwOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcXVldWVfY29tbWFuZCAoU2NzaV9DbW5kICpjbWQsIAorICoJdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkgCisgKgorICogUHVycG9zZSA6ICBlbnF1ZXVlcyBhIFNDU0kgY29tbWFuZAorICoKKyAqIElucHV0cyA6IGNtZCAtIFNDU0kgY29tbWFuZCwgZG9uZSAtIGZ1bmN0aW9uIGNhbGxlZCBvbiBjb21wbGV0aW9uLCB3aXRoCisgKglhIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgZGVzY3JpcHRvci4KKyAqIAorICogUmV0dXJucyA6IDAKKyAqCisgKiBTaWRlIGVmZmVjdHMgOiAKKyAqICAgICAgY21kIGlzIGFkZGVkIHRvIHRoZSBwZXIgaW5zdGFuY2UgaXNzdWVfcXVldWUsIHdpdGggbWlub3IgCisgKgl0d2lkZGxpbmcgZG9uZSB0byB0aGUgaG9zdCBzcGVjaWZpYyBmaWVsZHMgb2YgY21kLiAgSWYgdGhlIAorICoJbWFpbiBjb3JvdXRpbmUgaXMgbm90IHJ1bm5pbmcsIGl0IGlzIHJlc3RhcnRlZC4KKyAqCisgKi8KKworLyogT25seSBtYWtlIHN0YXRpYyBpZiBhIHdyYXBwZXIgZnVuY3Rpb24gaXMgdXNlZCAqLworc3RhdGljIGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqY21kLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKyAgICBTY3NpX0NtbmQgKnRtcDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWYgKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkKKyAgICBzd2l0Y2ggKGNtZC0+Y21uZFswXSkgeworICAgIGNhc2UgV1JJVEVfNjoKKyAgICBjYXNlIFdSSVRFXzEwOgorCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiBXUklURSBhdHRlbXB0ZWQgd2l0aCBOT19XUklURSBkZWJ1Z2dpbmcgZmxhZyBzZXRcbiIsCisJICAgICAgIEhfTk8oY21kKSk7CisJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwlkb25lKGNtZCk7CisJcmV0dXJuIDA7CisgICAgfQorI2VuZGlmIC8qIChOREVCVUcgJiBOREVCVUdfTk9fV1JJVEUpICovCisKKworI2lmZGVmIE5DUjUzODBfU1RBVFMKKyMgaWYgMAorICAgIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCAmJiAhaG9zdGRhdGEtPmlzc3VlX3F1ZXVlICYmCisJIWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpIHsKKwlob3N0ZGF0YS0+dGltZWJhc2UgPSBqaWZmaWVzOworICAgIH0KKyMgZW5kaWYKKyMgaWZkZWYgTkNSNTM4MF9TVEFUX0xJTUlUCisgICAgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuID4gTkNSNTM4MF9TVEFUX0xJTUlUKQorIyBlbmRpZgorCXN3aXRjaCAoY21kLT5jbW5kWzBdKQorCXsKKwkgICAgY2FzZSBXUklURToKKwkgICAgY2FzZSBXUklURV82OgorCSAgICBjYXNlIFdSSVRFXzEwOgorCQlob3N0ZGF0YS0+dGltZV93cml0ZVtjbWQtPmRldmljZS0+aWRdIC09IChqaWZmaWVzIC0gaG9zdGRhdGEtPnRpbWViYXNlKTsKKwkJaG9zdGRhdGEtPmJ5dGVzX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJCWhvc3RkYXRhLT5wZW5kaW5ndysrOworCQlicmVhazsKKwkgICAgY2FzZSBSRUFEOgorCSAgICBjYXNlIFJFQURfNjoKKwkgICAgY2FzZSBSRUFEXzEwOgorCQlob3N0ZGF0YS0+dGltZV9yZWFkW2NtZC0+ZGV2aWNlLT5pZF0gLT0gKGppZmZpZXMgLSBob3N0ZGF0YS0+dGltZWJhc2UpOworCQlob3N0ZGF0YS0+Ynl0ZXNfcmVhZFtjbWQtPmRldmljZS0+aWRdICs9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlob3N0ZGF0YS0+cGVuZGluZ3IrKzsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKyAgICAvKiAKKyAgICAgKiBXZSB1c2UgdGhlIGhvc3Rfc2NyaWJibGUgZmllbGQgYXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNvbW1hbmQgIAorICAgICAqIGluIGEgcXVldWUgCisgICAgICovCisKKyAgICBORVhUKGNtZCkgPSBOVUxMOworICAgIGNtZC0+c2NzaV9kb25lID0gZG9uZTsKKworICAgIGNtZC0+cmVzdWx0ID0gMDsKKworCisgICAgLyogCisgICAgICogSW5zZXJ0IHRoZSBjbWQgaW50byB0aGUgaXNzdWUgcXVldWUuIE5vdGUgdGhhdCBSRVFVRVNUIFNFTlNFIAorICAgICAqIGNvbW1hbmRzIGFyZSBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUgc2luY2UgYW55IGNvbW1hbmQgd2lsbAorICAgICAqIGNsZWFyIHRoZSBjb250aW5nZW50IGFsbGVnaWFuY2UgY29uZGl0aW9uIHRoYXQgZXhpc3RzIGFuZCB0aGUgCisgICAgICogc2Vuc2UgZGF0YSBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgd2hpbGUgdGhlIGNvbmRpdGlvbiBleGlzdHMuCisgICAgICovCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgLyogKytndWVudGhlcjogbm93IHRoYXQgdGhlIGlzc3VlIHF1ZXVlIGlzIGJlaW5nIHNldCB1cCwgd2UgY2FuIGxvY2sgU1QtRE1BLgorICAgICAqIE90aGVyd2lzZSBhIHJ1bm5pbmcgTkNSNTM4MF9tYWluIG1heSBzdGVhbCB0aGUgbG9jay4KKyAgICAgKiBMb2NrIGJlZm9yZSBhY3R1YWxseSBpbnNlcnRpbmcgZHVlIHRvIGZhaXJuZXNzIHJlYXNvbnMgZXhwbGFpbmVkIGluCisgICAgICogYXRhcmlfc2NzaS5jLiBJZiB3ZSBpbnNlcnQgZmlyc3QsIHRoZW4gaXQncyBpbXBvc3NpYmxlIGZvciB0aGlzIGRyaXZlcgorICAgICAqIHRvIHJlbGVhc2UgdGhlIGxvY2suCisgICAgICogU3RvcCB0aW1lciBmb3IgdGhpcyBjb21tYW5kIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrLCBvciB0aW1lb3V0cworICAgICAqIG1heSBoYXBwZW4gKGFuZCB0aGV5IHJlYWxseSBkbyksIGFuZCBpdCdzIG5vIGdvb2QgaWYgdGhlIGNvbW1hbmQgZG9lc24ndAorICAgICAqIGFwcGVhciBpbiBhbnkgb2YgdGhlIHF1ZXVlcy4KKyAgICAgKiArK3JvbWFuOiBKdXN0IGRpc2FibGluZyB0aGUgTkNSIGludGVycnVwdCBpc24ndCBzdWZmaWNpZW50IGhlcmUsCisgICAgICogYmVjYXVzZSBhbHNvIGEgdGltZXIgaW50IGNhbiB0cmlnZ2VyIGFuIGFib3J0IG9yIHJlc2V0LCB3aGljaCB3b3VsZAorICAgICAqIGFsdGVyIHF1ZXVlcyBhbmQgdG91Y2ggdGhlIGxvY2suCisgICAgICovCisgICAgaWYgKCEoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSB8fCAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpKSB7CisJTElTVChjbWQsIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CisJTkVYVChjbWQpID0gaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IGNtZDsKKyAgICB9IGVsc2UgeworCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkgICAgIE5FWFQodG1wKTsgdG1wID0gTkVYVCh0bXApKQorCSAgICA7CisJTElTVChjbWQsIHRtcCk7CisJTkVYVCh0bXApID0gY21kOworICAgIH0KKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIFFVX1BSSU5USygic2NzaSVkOiBjb21tYW5kIGFkZGVkIHRvICVzIG9mIHF1ZXVlXG4iLCBIX05PKGNtZCksCisJICAgICAgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSA/ICJoZWFkIiA6ICJ0YWlsIik7CisKKyAgICAvKiBJZiBxdWV1ZV9jb21tYW5kKCkgaXMgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IChyZWFsIG9uZSBvciBib3R0b20KKyAgICAgKiBoYWxmKSwgd2UgbGV0IHF1ZXVlX21haW4oKSBkbyB0aGUgam9iIG9mIHRha2luZyBjYXJlIGFib3V0IG1haW4uIElmIGl0CisgICAgICogaXMgYWxyZWFkeSBydW5uaW5nLCB0aGlzIGlzIGEgbm8tb3AsIGVsc2UgbWFpbiB3aWxsIGJlIHF1ZXVlZC4KKyAgICAgKgorICAgICAqIElmIHdlJ3JlIG5vdCBpbiBhbiBpbnRlcnJ1cHQsIHdlIGNhbiBjYWxsIE5DUjUzODBfbWFpbigpCisgICAgICogdW5jb25kaXRpb25hbGx5LCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBhbHJlYWR5IHJ1bm5pbmcuCisgICAgICovCisgICAgaWYgKGluX2ludGVycnVwdCgpIHx8ICgoZmxhZ3MgPj4gOCkgJiA3KSA+PSA2KQorCXF1ZXVlX21haW4oKTsKKyAgICBlbHNlCisJTkNSNTM4MF9tYWluKE5VTEwpOworICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBOQ1I1MzgwX21haW4gKHZvaWQpIAorICoKKyAqIFB1cnBvc2UgOiBOQ1I1MzgwX21haW4gaXMgYSBjb3JvdXRpbmUgdGhhdCBydW5zIGFzIGxvbmcgYXMgbW9yZSB3b3JrIGNhbiAKKyAqCWJlIGRvbmUgb24gdGhlIE5DUjUzODAgaG9zdCBhZGFwdGVycyBpbiBhIHN5c3RlbS4gIEJvdGggCisgKglOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQoKSBhbmQgTkNSNTM4MF9pbnRyKCkgd2lsbCB0cnkgdG8gc3RhcnQgaXQgCisgKglpbiBjYXNlIGl0IGlzIG5vdCBydW5uaW5nLgorICogCisgKiBOT1RFIDogTkNSNTM4MF9tYWluIGV4aXRzIHdpdGggaW50ZXJydXB0cyAqZGlzYWJsZWQqLCB0aGUgY2FsbGVyIHNob3VsZCAKKyAqICByZWVuYWJsZSB0aGVtLiAgVGhpcyBwcmV2ZW50cyByZWVudHJhbmN5IGFuZCBrZXJuZWwgc3RhY2sgb3ZlcmZsb3cuCisgKi8gCQorICAgIAorc3RhdGljIHZvaWQgTkNSNTM4MF9tYWluICh2b2lkICpibCkKK3sKKyAgICBTY3NpX0NtbmQgKnRtcCwgKnByZXY7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBmaXJzdF9pbnN0YW5jZTsKKyAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBIT1NUREFUQShpbnN0YW5jZSk7CisgICAgaW50IGRvbmU7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKyAgICAvKgorICAgICAqIFdlIHJ1biAod2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkKSB1bnRpbCB3ZSdyZSBzdXJlIHRoYXQgbm9uZSBvZiAKKyAgICAgKiB0aGUgaG9zdCBhZGFwdGVycyBoYXZlIGFueXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUsIGF0IHdoaWNoIHBvaW50IAorICAgICAqIHdlIHNldCBtYWluX3J1bm5pbmcgdG8gMCBhbmQgZXhpdC4KKyAgICAgKgorICAgICAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgYmVmb3JlIGRvaW5nIHZhcmlvdXMgb3RoZXIgaW50ZXJuYWwgCisgICAgICogaW5zdHJ1Y3Rpb25zLCBhZnRlciB3ZSd2ZSBkZWNpZGVkIHRoYXQgd2UgbmVlZCB0byBydW4gdGhyb3VnaAorICAgICAqIHRoZSBsb29wIGFnYWluLgorICAgICAqCisgICAgICogdGhpcyBzaG91bGQgcHJldmVudCBhbnkgcmFjZSBjb25kaXRpb25zLgorICAgICAqIAorICAgICAqICsrcm9tYW46IEp1c3QgZGlzYWJsaW5nIHRoZSBOQ1IgaW50ZXJydXB0IGlzbid0IHN1ZmZpY2llbnQgaGVyZSwKKyAgICAgKiBiZWNhdXNlIGFsc28gYSB0aW1lciBpbnQgY2FuIHRyaWdnZXIgYW4gYWJvcnQgb3IgcmVzZXQsIHdoaWNoIGNhbgorICAgICAqIGFsdGVyIHF1ZXVlcyBhbmQgdG91Y2ggdGhlIEZhbGNvbiBsb2NrLgorICAgICAqLworCisgICAgLyogVGVsbCBpbnQgaGFuZGxlcnMgbWFpbigpIGlzIG5vdyBhbHJlYWR5IGV4ZWN1dGluZy4gIE5vdGUgdGhhdAorICAgICAgIG5vIHJhY2VzIGFyZSBwb3NzaWJsZSBoZXJlLiBJZiBhbiBpbnQgY29tZXMgaW4gYmVmb3JlCisgICAgICAgJ21haW5fcnVubmluZycgaXMgc2V0IGhlcmUsIGFuZCBxdWV1ZXMvZXhlY3V0ZXMgbWFpbiB2aWEgdGhlCisgICAgICAgdGFzayBxdWV1ZSwgaXQgZG9lc24ndCBkbyBhbnkgaGFybSwganVzdCB0aGlzIGluc3RhbmNlIG9mIG1haW4KKyAgICAgICB3b24ndCBmaW5kIGFueSB3b3JrIGxlZnQgdG8gZG8uICovCisgICAgaWYgKG1haW5fcnVubmluZykKKyAgICAJcmV0dXJuOworICAgIG1haW5fcnVubmluZyA9IDE7CisKKyAgICBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKyAgICBkbyB7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsgLyogRnJlZXplIHJlcXVlc3QgcXVldWVzICovCisJZG9uZSA9IDE7CisJCisJaWYgKCFob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJICAgIE1BSU5fUFJJTlRLKCAic2NzaSVkOiBub3QgY29ubmVjdGVkXG4iLCBIT1NUTk8gKTsKKwkgICAgLyoKKwkgICAgICogU2VhcmNoIHRocm91Z2ggdGhlIGlzc3VlX3F1ZXVlIGZvciBhIGNvbW1hbmQgZGVzdGluZWQKKwkgICAgICogZm9yIGEgdGFyZ2V0IHRoYXQncyBub3QgYnVzeS4KKwkgICAgICovCisjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKKwkgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgcHJldiA9IE5VTEw7CisJCSB0bXAgJiYgKHRtcCAhPSBwcmV2KTsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApKQorCQk7CisJICAgIGlmICgodG1wID09IHByZXYpICYmIHRtcCkgcHJpbnRrKCIgTE9PUFxuIik7LyogZWxzZSBwcmludGsoIlxuIik7Ki8KKyNlbmRpZgorCSAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlLCAKKwkJIHByZXYgPSBOVUxMOyB0bXA7IHByZXYgPSB0bXAsIHRtcCA9IE5FWFQodG1wKSApIHsKKworI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCisJCWlmIChwcmV2ICE9IHRtcCkKKwkJICAgIHByaW50aygiTUFJTiB0bXA9JXAgICB0YXJnZXQ9JWQgICBidXN5PSVkIGx1bj0lZFxuIiwKKwkJCSAgIHRtcCwgdG1wLT50YXJnZXQsIGhvc3RkYXRhLT5idXN5W3RtcC0+dGFyZ2V0XSwKKwkJCSAgIHRtcC0+bHVuKTsKKyNlbmRpZgorCQkvKiAgV2hlbiB3ZSBmaW5kIG9uZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGlzc3VlIHF1ZXVlLiAqLworCQkvKiArK2d1ZW50aGVyOiBwb3NzaWJsZSByYWNlIHdpdGggRmFsY29uIGxvY2tpbmcgKi8KKwkJaWYgKAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgIWlzX2x1bl9idXN5KCB0bXAsIHRtcC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKQorI2Vsc2UKKwkJICAgICEoaG9zdGRhdGEtPmJ1c3lbdG1wLT5kZXZpY2UtPmlkXSAmICgxIDw8IHRtcC0+ZGV2aWNlLT5sdW4pKQorI2VuZGlmCisJCSAgICApIHsKKwkJICAgIC8qICsrZ3VlbnRoZXI6IGp1c3QgdG8gYmUgc3VyZSwgdGhpcyBtdXN0IGJlIGF0b21pYyAqLworCQkgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJICAgIGlmIChwcmV2KSB7CisJCSAgICAgICAgUkVNT1ZFKHByZXYsIE5FWFQocHJldiksIHRtcCwgTkVYVCh0bXApKTsKKwkJCU5FWFQocHJldikgPSBORVhUKHRtcCk7CisJCSAgICB9IGVsc2UgeworCQkgICAgICAgIFJFTU9WRSgtMSwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlLCB0bXAsIE5FWFQodG1wKSk7CisJCQlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBORVhUKHRtcCk7CisJCSAgICB9CisJCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgCisJCSAgICAvKiByZWVuYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGZpbmRpbmcgb25lICovCisJCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICAKKwkJICAgIC8qIAorCQkgICAgICogQXR0ZW1wdCB0byBlc3RhYmxpc2ggYW4gSV9UX0wgbmV4dXMgaGVyZS4gCisJCSAgICAgKiBPbiBzdWNjZXNzLCBpbnN0YW5jZS0+aG9zdGRhdGEtPmNvbm5lY3RlZCBpcyBzZXQuCisJCSAgICAgKiBPbiBmYWlsdXJlLCB3ZSBtdXN0IGFkZCB0aGUgY29tbWFuZCBiYWNrIHRvIHRoZQorCQkgICAgICogICBpc3N1ZSBxdWV1ZSBzbyB3ZSBjYW4ga2VlcCB0cnlpbmcuCQorCQkgICAgICovCisJCSAgICBNQUlOX1BSSU5USygic2NzaSVkOiBtYWluKCk6IGNvbW1hbmQgZm9yIHRhcmdldCAlZCAiCisJCQkJImx1biAlZCByZW1vdmVkIGZyb20gaXNzdWVfcXVldWVcbiIsCisJCQkJSE9TVE5PLCB0bXAtPnRhcmdldCwgdG1wLT5sdW4pOworCQkgICAgLyogCisJCSAgICAgKiBSRVFVRVNUIFNFTlNFIGNvbW1hbmRzIGFyZSBpc3N1ZWQgd2l0aG91dCB0YWdnZWQKKwkJICAgICAqIHF1ZXVlaW5nLCBldmVuIG9uIFNDU0ktSUkgZGV2aWNlcyBiZWNhdXNlIHRoZSAKKwkJICAgICAqIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24gZXhpc3RzIGZvciB0aGUgCisJCSAgICAgKiBlbnRpcmUgdW5pdC4KKwkJICAgICAqLworCQkgICAgLyogKytyb21hbjogLi4uYW5kIHRoZSBzdGFuZGFyZCBhbHNvIHJlcXVpcmVzIHRoYXQKKwkJICAgICAqIFJFUVVFU1QgU0VOU0UgY29tbWFuZCBhcmUgdW50YWdnZWQuCisJCSAgICAgKi8KKwkJICAgIAorI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2dldF90YWcoIHRtcCwgdG1wLT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UgKTsKKyNlbmRpZgorCQkgICAgaWYgKCFOQ1I1MzgwX3NlbGVjdChpbnN0YW5jZSwgdG1wLCAKKwkJCSAgICAodG1wLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpID8gVEFHX05PTkUgOiAKKwkJCSAgICBUQUdfTkVYVCkpIHsKKwkJCWJyZWFrOworCQkgICAgfSBlbHNlIHsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCQlMSVNUKHRtcCwgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKKwkJCU5FWFQodG1wKSA9IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkJCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IHRtcDsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwkJCWNtZF9mcmVlX3RhZyggdG1wICk7CisjZW5kaWYKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCU1BSU5fUFJJTlRLKCJzY3NpJWQ6IG1haW4oKTogc2VsZWN0KCkgZmFpbGVkLCAiCisJCQkJICAgICJyZXR1cm5lZCB0byBpc3N1ZV9xdWV1ZVxuIiwgSE9TVE5PKTsKKwkJCWlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKQorCQkJICAgIGJyZWFrOworCQkgICAgfQorCQl9IC8qIGlmIHRhcmdldC9sdW4vdGFyZ2V0IHF1ZXVlIGlzIG5vdCBidXN5ICovCisJICAgIH0gLyogZm9yIGlzc3VlX3F1ZXVlICovCisJfSAvKiBpZiAoIWhvc3RkYXRhLT5jb25uZWN0ZWQpICovCisJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgCisjaWZkZWYgUkVBTF9ETUEKKwkgICAgJiYgIWhvc3RkYXRhLT5kbWFfbGVuCisjZW5kaWYKKwkgICAgKSB7CisJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkgICAgTUFJTl9QUklOVEsoInNjc2klZDogbWFpbjogcGVyZm9ybWluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlclxuIiwKKwkJCUhPU1ROTyk7CisJICAgIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIoaW5zdGFuY2UpOworCSAgICBNQUlOX1BSSU5USygic2NzaSVkOiBtYWluOiBkb25lIHNldCBmYWxzZVxuIiwgSE9TVE5PKTsKKwkgICAgZG9uZSA9IDA7CisJfQorICAgIH0gd2hpbGUgKCFkb25lKTsKKworICAgIC8qIEJldHRlciBhbGxvdyBpbnRzIF9hZnRlcl8gJ21haW5fcnVubmluZycgaGFzIGJlZW4gY2xlYXJlZCwgZWxzZQorICAgICAgIGFuIGludGVycnVwdCBjb3VsZCBiZWxpZXZlIHdlJ2xsIHBpY2sgdXAgdGhlIHdvcmsgaXQgbGVmdCBmb3IKKyAgICAgICB1cywgYnV0IHdlIHdvbid0IHNlZSBpdCBhbnltb3JlIGhlcmUuLi4gKi8KKyAgICBtYWluX3J1bm5pbmcgPSAwOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisjaWZkZWYgUkVBTF9ETUEKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9kbWFfY29tcGxldGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBDYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBETUEgZmluaXNoZXMgb3IgYSBwaGFzZQorICoJbWlzbWF0Y2ggb2NjdXJzICh3aGljaCB3b3VsZCBmaW5pc2ggdGhlIERNQSB0cmFuc2ZlcikuICAKKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5DUjUzODAuCisgKgorICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfZG1hX2NvbXBsZXRlKCBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSApCit7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworICAgIGludCAgICAgICAgICAgdHJhbnNmZXJlZDsKKyAgICB1bnNpZ25lZCBjaGFyICoqZGF0YTsKKyAgICB2b2xhdGlsZSBpbnQgICpjb3VudDsKKworICAgIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZDogcmVjZWl2ZWQgZW5kIG9mIERNQSBpbnRlcnJ1cHQgd2l0aCAiCisJICAgICAgICJubyBjb25uZWN0ZWQgY21kXG4iLCBIT1NUTk8pOworCXJldHVybjsKKyAgICB9CisKKyAgICBETUFfUFJJTlRLKCJzY3NpJWQ6IHJlYWwgRE1BIHRyYW5zZmVyIGNvbXBsZXRlLCBiYXNyIDB4JVgsIHNyIDB4JVhcbiIsCisJICAgICAgIEhPU1ROTywgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyksCisJICAgICAgIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisKKyAgICBpZigoc3VuM3Njc2lfZG1hX2ZpbmlzaChycV9kYXRhX2Rpcihob3N0ZGF0YS0+Y29ubmVjdGVkLT5yZXF1ZXN0KSkpKSB7CisJICAgIHByaW50aygic2NzaSVkOiBvdmVycnVuIGluIFVEQyBjb3VudGVyIC0tIG5vdCBwcmVwYXJlZCB0byBkZWFsIHdpdGggdGhpcyFcbiIsIEhPU1ROTyk7CisJICAgIHByaW50aygicGxlYXNlIGUtbWFpbCBzYW1teUBzYW1teS5uZXQgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGlzXG4iKTsKKwkgICAgcHJpbnRrKCJlcnJvciB3YXMgcHJvZHVjZWQuXG4iKTsKKwkgICAgQlVHKCk7CisgICAgfQorCisgICAgLyogbWFrZSBzdXJlIHdlJ3JlIG5vdCBzdHVjayBpbiBhIGRhdGEgcGhhc2UgKi8KKyAgICBpZigoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJiAoQkFTUl9QSEFTRV9NQVRDSCB8CisJCQkJCSAgICBCQVNSX0FDSykpID09CisgICAgICAgKEJBU1JfUEhBU0VfTUFUQ0ggfCBCQVNSX0FDSykpIHsKKwkgICAgcHJpbnRrKCJzY3NpJWQ6IEJBU1IgJTAyeFxuIiwgSE9TVE5PLCBOQ1I1MzgwX3JlYWQoQlVTX0FORF9TVEFUVVNfUkVHKSk7CisJICAgIHByaW50aygic2NzaSVkOiBidXMgc3R1Y2sgaW4gZGF0YSBwaGFzZSAtLSBwcm9iYWJseSBhIHNpbmdsZSBieXRlICIKKwkJICAgIm92ZXJydW4hXG4iLCBIT1NUTk8pOworCSAgICBwcmludGsoIm5vdCBwcmVwYXJlZCBmb3IgdGhpcyBlcnJvciFcbiIpOworCSAgICBwcmludGsoInBsZWFzZSBlLW1haWwgc2FtbXlAc2FtbXkubmV0IHdpdGggYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpc1xuIik7CisJICAgIHByaW50aygiZXJyb3Igd2FzIHByb2R1Y2VkLlxuIik7CisJICAgIEJVRygpOworICAgIH0KKworCisKKyAgICAodm9pZCkgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisgICAgdHJhbnNmZXJlZCA9IGhvc3RkYXRhLT5kbWFfbGVuIC0gTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpOworICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gMDsKKworICAgIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKikgJihob3N0ZGF0YS0+Y29ubmVjdGVkLT5TQ3AucHRyKTsKKyAgICBjb3VudCA9ICYoaG9zdGRhdGEtPmNvbm5lY3RlZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgICpkYXRhICs9IHRyYW5zZmVyZWQ7CisgICAgKmNvdW50IC09IHRyYW5zZmVyZWQ7CisKK30KKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCisKKy8qCisgKiBGdW5jdGlvbiA6IHZvaWQgTkNSNTM4MF9pbnRyIChpbnQgaXJxKQorICogCisgKiBQdXJwb3NlIDogaGFuZGxlIGludGVycnVwdHMsIHJlZXN0YWJsaXNoaW5nIElfVF9MIG9yIElfVF9MX1EgbmV4dXNlcworICoJZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLCBhbmQgcmVzdGFydGluZyBOQ1I1MzgwX21haW4oKSAKKyAqCWFzIHJlcXVpcmVkLgorICoKKyAqIElucHV0cyA6IGludCBpcnEsIGlycSB0aGF0IGNhdXNlZCB0aGlzIGludGVycnVwdC4KKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IE5DUjUzODBfaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGZpcnN0X2luc3RhbmNlOworICAgIGludCBkb25lID0gMSwgaGFuZGxlZCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBiYXNyOworCisgICAgSU5UX1BSSU5USygic2NzaSVkOiBOQ1I1MzgwIGlycSB0cmlnZ2VyZWRcbiIsIEhPU1ROTyk7CisKKyAgICAvKiBMb29rIGZvciBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgICBiYXNyID0gTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyk7CisgICAgSU5UX1BSSU5USygic2NzaSVkOiBCQVNSPSUwMnhcbiIsIEhPU1ROTywgYmFzcik7CisgICAgLyogZGlzcGF0Y2ggdG8gYXBwcm9wcmlhdGUgcm91dGluZSBpZiBmb3VuZCBhbmQgZG9uZT0wICovCisgICAgaWYgKGJhc3IgJiBCQVNSX0lSUSkgeworCU5DUl9QUklOVChOREVCVUdfSU5UUik7CisJaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMfFNSX0lPKSkgPT0gKFNSX1NFTHxTUl9JTykpIHsKKwkgICAgZG9uZSA9IDA7CisJICAgIEVOQUJMRV9JUlEoKTsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBTRUwgaW50ZXJydXB0XG4iLCBIT1NUTk8pOworCSAgICBOQ1I1MzgwX3Jlc2VsZWN0KGluc3RhbmNlKTsKKwkgICAgKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJfQorCWVsc2UgaWYgKGJhc3IgJiBCQVNSX1BBUklUWV9FUlJPUikgeworCSAgICBJTlRfUFJJTlRLKCJzY3NpJWQ6IFBBUklUWSBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJICAgICh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCX0KKwllbHNlIGlmICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUlNUKSA9PSBTUl9SU1QpIHsKKwkgICAgSU5UX1BSSU5USygic2NzaSVkOiBSRVNFVCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJICAgICh2b2lkKU5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisJfQorCWVsc2UgeworCSAgICAvKiAgCisJICAgICAqIFRoZSByZXN0IG9mIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9ucyBjYW4gb2NjdXIgb25seSBkdXJpbmcgYQorCSAgICAgKiBETUEgdHJhbnNmZXIKKwkgICAgICovCisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorCSAgICAvKgorCSAgICAgKiBXZSBzaG91bGQgb25seSBnZXQgUEhBU0UgTUlTTUFUQ0ggYW5kIEVPUCBpbnRlcnJ1cHRzIGlmIHdlIGhhdmUKKwkgICAgICogRE1BIGVuYWJsZWQsIHNvIGRvIGEgc2FuaXR5IGNoZWNrIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNldHRpbmcKKwkgICAgICogb2YgdGhlIE1PREUgcmVnaXN0ZXIuCisJICAgICAqLworCisJICAgIGlmICgoTkNSNTM4MF9yZWFkKE1PREVfUkVHKSAmIE1SX0RNQV9NT0RFKSAmJgorCQkoKGJhc3IgJiBCQVNSX0VORF9ETUFfVFJBTlNGRVIpIHx8IAorCQkgIShiYXNyICYgQkFTUl9QSEFTRV9NQVRDSCkpKSB7CisJCSAgICAKKwkJSU5UX1BSSU5USygic2NzaSVkOiBQSEFTRSBNSVNNIG9yIEVPUCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CisJCU5DUjUzODBfZG1hX2NvbXBsZXRlKCBpbnN0YW5jZSApOworCQlkb25lID0gMDsKKwkJRU5BQkxFX0lSUSgpOworCSAgICB9IGVsc2UKKyNlbmRpZiAvKiBSRUFMX0RNQSAqLworCSAgICB7CisvKiBNUzogSWdub3JlIHVua25vd24gcGhhc2UgbWlzbWF0Y2ggaW50ZXJydXB0cyAoY2F1c2VkIGJ5IEVPUCBpbnRlcnJ1cHQpICovCisJCWlmIChiYXNyICYgQkFTUl9QSEFTRV9NQVRDSCkKKwkJICAgSU5UX1BSSU5USygic2NzaSVkOiB1bmtub3duIGludGVycnVwdCwgIgorCQkJICAgIkJBU1IgMHgleCwgTVIgMHgleCwgU1IgMHgleFxuIiwKKwkJCSAgIEhPU1ROTywgYmFzciwgTkNSNTM4MF9yZWFkKE1PREVfUkVHKSwKKwkJCSAgIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisJCSh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworI2lmZGVmIFNVTjNfU0NTSV9WTUUKKwkJZHJlZ3MtPmNzciB8PSBDU1JfRE1BX0VOQUJMRTsKKyNlbmRpZgorCSAgICB9CisJfSAvKiBpZiAhKFNFTEVDVElPTiB8fCBQQVJJVFkpICovCisJaGFuZGxlZCA9IDE7CisgICAgfSAvKiBCQVNSICYgSVJRICovCisgICAgZWxzZSB7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogaW50ZXJydXB0IHdpdGhvdXQgSVJRIGJpdCBzZXQgaW4gQkFTUiwgIgorCSAgICAgICAiQkFTUiAweCVYLCBNUiAweCVYLCBTUiAweCV4XG4iLCBIT1NUTk8sIGJhc3IsCisJICAgICAgIE5DUjUzODBfcmVhZChNT0RFX1JFRyksIE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisJKHZvaWQpIE5DUjUzODBfcmVhZChSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyk7CisjaWZkZWYgU1VOM19TQ1NJX1ZNRQorCQlkcmVncy0+Y3NyIHw9IENTUl9ETUFfRU5BQkxFOworI2VuZGlmCisgICAgfQorICAgIAorICAgIGlmICghZG9uZSkgeworCUlOVF9QUklOVEsoInNjc2klZDogaW4gaW50IHJvdXRpbmUsIGNhbGxpbmcgbWFpblxuIiwgSE9TVE5PKTsKKwkvKiBQdXQgYSBjYWxsIHRvIE5DUjUzODBfbWFpbigpIG9uIHRoZSBxdWV1ZS4uLiAqLworCXF1ZXVlX21haW4oKTsKKyAgICB9CisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCitzdGF0aWMgdm9pZCBjb2xsZWN0X3N0YXRzKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhKiBob3N0ZGF0YSwgU2NzaV9DbW5kKiBjbWQpCit7CisjIGlmZGVmIE5DUjUzODBfU1RBVF9MSU1JVAorICAgIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA+IE5DUjUzODBfU1RBVF9MSU1JVCkKKyMgZW5kaWYKKwlzd2l0Y2ggKGNtZC0+Y21uZFswXSkKKwl7CisJICAgIGNhc2UgV1JJVEU6CisJICAgIGNhc2UgV1JJVEVfNjoKKwkgICAgY2FzZSBXUklURV8xMDoKKwkJaG9zdGRhdGEtPnRpbWVfd3JpdGVbY21kLT5kZXZpY2UtPmlkXSArPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCS8qaG9zdGRhdGEtPmJ5dGVzX3dyaXRlW2NtZC0+ZGV2aWNlLT5pZF0gKz0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47Ki8KKwkJaG9zdGRhdGEtPnBlbmRpbmd3LS07CisJCWJyZWFrOworCSAgICBjYXNlIFJFQUQ6CisJICAgIGNhc2UgUkVBRF82OgorCSAgICBjYXNlIFJFQURfMTA6CisJCWhvc3RkYXRhLT50aW1lX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSAoamlmZmllcyAtIGhvc3RkYXRhLT50aW1lYmFzZSk7CisJCS8qaG9zdGRhdGEtPmJ5dGVzX3JlYWRbY21kLT5kZXZpY2UtPmlkXSArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsqLworCQlob3N0ZGF0YS0+cGVuZGluZ3ItLTsKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKKy8qIAorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9zZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBTY3NpX0NtbmQgKmNtZCwgCisgKglpbnQgdGFnKTsKKyAqCisgKiBQdXJwb3NlIDogZXN0YWJsaXNoZXMgSV9UX0wgb3IgSV9UX0xfUSBuZXh1cyBmb3IgbmV3IG9yIGV4aXN0aW5nIGNvbW1hbmQsCisgKglpbmNsdWRpbmcgQVJCSVRSQVRJT04sIFNFTEVDVElPTiwgYW5kIGluaXRpYWwgbWVzc2FnZSBvdXQgZm9yIAorICoJSURFTlRJRlkgYW5kIHF1ZXVlIG1lc3NhZ2VzLiAKKyAqCisgKiBJbnB1dHMgOiBpbnN0YW5jZSAtIGluc3RhbnRpYXRpb24gb2YgdGhlIDUzODAgZHJpdmVyIG9uIHdoaWNoIHRoaXMgCisgKiAJdGFyZ2V0IGxpdmVzLCBjbWQgLSBTQ1NJIGNvbW1hbmQgdG8gZXhlY3V0ZSwgdGFnIC0gc2V0IHRvIFRBR19ORVhUIGZvciAKKyAqCW5ldyB0YWcsIFRBR19OT05FIGZvciB1bnRhZ2dlZCBxdWV1ZWluZywgb3RoZXJ3aXNlIHNldCB0byB0aGUgdGFnIGZvciAKKyAqCXRoZSBjb21tYW5kIHRoYXQgaXMgcHJlc2VudGx5IGNvbm5lY3RlZC4KKyAqIAorICogUmV0dXJucyA6IC0xIGlmIHNlbGVjdGlvbiBjb3VsZCBub3QgZXhlY3V0ZSBmb3Igc29tZSByZWFzb24sCisgKgkwIGlmIHNlbGVjdGlvbiBzdWNjZWVkZWQgb3IgZmFpbGVkIGJlY2F1c2UgdGhlIHRhcmdldCAKKyAqIAlkaWQgbm90IHJlc3BvbmQuCisgKgorICogU2lkZSBlZmZlY3RzIDogCisgKiAJSWYgYnVzIGJ1c3ksIGFyYml0cmF0aW9uIGZhaWxlZCwgZXRjLCBOQ1I1MzgwX3NlbGVjdCgpIHdpbGwgZXhpdCAKKyAqCQl3aXRoIHJlZ2lzdGVycyBhcyB0aGV5IHNob3VsZCBoYXZlIGJlZW4gb24gZW50cnkgLSBpZQorICoJCVNFTEVDVF9FTkFCTEUgd2lsbCBiZSBzZXQgYXBwcm9wcmlhdGVseSwgdGhlIE5DUjUzODAKKyAqCQl3aWxsIGNlYXNlIHRvIGRyaXZlIGFueSBTQ1NJIGJ1cyBzaWduYWxzLgorICoKKyAqCUlmIHN1Y2Nlc3NmdWwgOiBJX1RfTCBvciBJX1RfTF9RIG5leHVzIHdpbGwgYmUgZXN0YWJsaXNoZWQsIAorICoJCWluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbCBiZSBzZXQgdG8gY21kLiAgCisgKiAJCVNFTEVDVCBpbnRlcnJ1cHQgd2lsbCBiZSBkaXNhYmxlZC4KKyAqCisgKglJZiBmYWlsZWQgKG5vIHRhcmdldCkgOiBjbWQtPnNjc2lfZG9uZSgpIHdpbGwgYmUgY2FsbGVkLCBhbmQgdGhlIAorICoJCWNtZC0+cmVzdWx0IGhvc3QgYnl0ZSBzZXQgdG8gRElEX0JBRF9UQVJHRVQuCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX3NlbGVjdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIFNjc2lfQ21uZCAqY21kLCBpbnQgdGFnKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICB1bnNpZ25lZCBjaGFyIHRtcFszXSwgcGhhc2U7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICBpbnQgbGVuOworICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgaG9zdGRhdGEtPnJlc3RhcnRfc2VsZWN0ID0gMDsKKyAgICBOQ1JfUFJJTlQoTkRFQlVHX0FSQklUUkFUSU9OKTsKKyAgICBBUkJfUFJJTlRLKCJzY3NpJWQ6IHN0YXJ0aW5nIGFyYml0cmF0aW9uLCBpZCA9ICVkXG4iLCBIT1NUTk8sCisJICAgICAgIGluc3RhbmNlLT50aGlzX2lkKTsKKworICAgIC8qIAorICAgICAqIFNldCB0aGUgcGhhc2UgYml0cyB0byAwLCBvdGhlcndpc2UgdGhlIE5DUjUzODAgd29uJ3QgZHJpdmUgdGhlIAorICAgICAqIGRhdGEgYnVzIGR1cmluZyBTRUxFQ1RJT04uCisgICAgICovCisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgMCk7CisKKworICAgIC8qIAorICAgICAqIFN0YXJ0IGFyYml0cmF0aW9uLgorICAgICAqLworICAgIAorICAgIE5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQVJCSVRSQVRFKTsKKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIC8qIFdhaXQgZm9yIGFyYml0cmF0aW9uIGxvZ2ljIHRvIGNvbXBsZXRlICovCisjaWYgTkNSX1RJTUVPVVQKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgMipOQ1JfVElNRU9VVDsKKworICAgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRykgJiBJQ1JfQVJCSVRSQVRJT05fUFJPR1JFU1MpCisJICAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIWhvc3RkYXRhLT5jb25uZWN0ZWQpCisJOworICAgICAgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpCisgICAgICB7CisJcHJpbnRrKCJzY3NpIDogYXJiaXRyYXRpb24gdGltZW91dCBhdCAlZFxuIiwgX19MSU5FX18pOworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOworCU5DUjUzODBfd3JpdGUoU0VMRUNUX0VOQUJMRV9SRUcsIGhvc3RkYXRhLT5pZF9tYXNrKTsKKwlyZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorI2Vsc2UgLyogTkNSX1RJTUVPVVQgKi8KKyAgICB3aGlsZSAoIShOQ1I1MzgwX3JlYWQoSU5JVElBVE9SX0NPTU1BTkRfUkVHKSAmIElDUl9BUkJJVFJBVElPTl9QUk9HUkVTUykKKwkgJiYgIWhvc3RkYXRhLT5jb25uZWN0ZWQpOworI2VuZGlmCisKKyAgICBBUkJfUFJJTlRLKCJzY3NpJWQ6IGFyYml0cmF0aW9uIGNvbXBsZXRlXG4iLCBIT1NUTk8pOworCisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsgCisJcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiAKKyAgICAgKiBUaGUgYXJiaXRyYXRpb24gZGVsYXkgaXMgMi4ydXMsIGJ1dCB0aGlzIGlzIGEgbWluaW11bSBhbmQgdGhlcmUgaXMgCisgICAgICogbm8gbWF4aW11bSBzbyB3ZSBjYW4gc2FmZWx5IHNsZWVwIGZvciBjZWlsKDIuMikgdXNlY3MgdG8gYWNjb21tb2RhdGUKKyAgICAgKiB0aGUgaW50ZWdyYWwgbmF0dXJlIG9mIHVkZWxheSgpLgorICAgICAqCisgICAgICovCisKKyAgICB1ZGVsYXkoMyk7CisKKyAgICAvKiBDaGVjayBmb3IgbG9zdCBhcmJpdHJhdGlvbiAqLworICAgIGlmICgoTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRykgJiBJQ1JfQVJCSVRSQVRJT05fTE9TVCkgfHwKKwkoTkNSNTM4MF9yZWFkKENVUlJFTlRfU0NTSV9EQVRBX1JFRykgJiBob3N0ZGF0YS0+aWRfaGlnaGVyX21hc2spIHx8CisJKE5DUjUzODBfcmVhZChJTklUSUFUT1JfQ09NTUFORF9SRUcpICYgSUNSX0FSQklUUkFUSU9OX0xPU1QpIHx8CisJaG9zdGRhdGEtPmNvbm5lY3RlZCkgeworCU5DUjUzODBfd3JpdGUoTU9ERV9SRUcsIE1SX0JBU0UpOyAKKwlBUkJfUFJJTlRLKCJzY3NpJWQ6IGxvc3QgYXJiaXRyYXRpb24sIGRlYXNzZXJ0aW5nIE1SX0FSQklUUkFURVxuIiwKKwkJICAgSE9TVE5PKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgIC8qIGFmdGVyL2R1cmluZyBhcmJpdHJhdGlvbiwgQlNZIHNob3VsZCBiZSBhc3NlcnRlZC4KKwlJQk0gRFBFUy0zMTA4MCBWZXJzaW9uIFMzMVEgd29ya3Mgbm93ICovCisgICAgIC8qIFRueCB0byBUaG9tYXNfUm9lc2NoQG0yLm1hdXMuZGUgZm9yIGZpbmRpbmcgdGhpcyEgKFJvbWFuKSAqLworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfU0VMIHwKKwkJCQkJIElDUl9BU1NFUlRfQlNZICkgOworICAgIAorICAgIGlmICgoTkNSNTM4MF9yZWFkKElOSVRJQVRPUl9DT01NQU5EX1JFRykgJiBJQ1JfQVJCSVRSQVRJT05fTE9TVCkgfHwKKwlob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlBUkJfUFJJTlRLKCJzY3NpJWQ6IGxvc3QgYXJiaXRyYXRpb24sIGRlYXNzZXJ0aW5nIElDUl9BU1NFUlRfU0VMXG4iLAorCQkgICBIT1NUTk8pOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBBZ2FpbiwgYnVzIGNsZWFyICsgYnVzIHNldHRsZSB0aW1lIGlzIDEuMnVzLCBob3dldmVyLCB0aGlzIGlzIAorICAgICAqIGEgbWluaW11bSBzbyB3ZSdsbCB1ZGVsYXkgY2VpbCgxLjIpCisgICAgICovCisKKyNpZmRlZiBDT05GSUdfQVRBUklfU0NTSV9UT1NISUJBX0RFTEFZCisgICAgLyogKytyb21hbjogQnV0IHNvbWUgdGFyZ2V0cyAoc2VlIGFib3ZlIDotKSBzZWVtIHRvIG5lZWQgYSBiaXQgbW9yZS4uLiAqLworICAgIHVkZWxheSgxNSk7CisjZWxzZQorICAgIHVkZWxheSgyKTsKKyNlbmRpZgorICAgIAorICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgQVJCX1BSSU5USygic2NzaSVkOiB3b24gYXJiaXRyYXRpb25cbiIsIEhPU1ROTyk7CisKKyAgICAvKiAKKyAgICAgKiBOb3cgdGhhdCB3ZSBoYXZlIHdvbiBhcmJpdHJhdGlvbiwgc3RhcnQgU2VsZWN0aW9uIHByb2Nlc3MsIGFzc2VydGluZyAKKyAgICAgKiB0aGUgaG9zdCBhbmQgdGFyZ2V0IElEJ3Mgb24gdGhlIFNDU0kgYnVzLgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShPVVRQVVRfREFUQV9SRUcsIChob3N0ZGF0YS0+aWRfbWFzayB8ICgxIDw8IGNtZC0+ZGV2aWNlLT5pZCkpKTsKKworICAgIC8qIAorICAgICAqIFJhaXNlIEFUTiB3aGlsZSBTRUwgaXMgdHJ1ZSBiZWZvcmUgQlNZIGdvZXMgZmFsc2UgZnJvbSBhcmJpdHJhdGlvbiwKKyAgICAgKiBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBndWFyYW50ZWUgdGhhdCB3ZSdsbCBnZXQgYSBNRVNTQUdFIE9VVAorICAgICAqIHBoYXNlIGltbWVkaWF0ZWx5IGFmdGVyIHNlbGVjdGlvbi4KKyAgICAgKi8KKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCAoSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0JTWSB8IAorCUlDUl9BU1NFUlRfREFUQSB8IElDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9TRUwgKSk7CisgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgTVJfQkFTRSk7CisKKyAgICAvKiAKKyAgICAgKiBSZXNlbGVjdCBpbnRlcnJ1cHRzIG11c3QgYmUgdHVybmVkIG9mZiBwcmlvciB0byB0aGUgZHJvcHBpbmcgb2YgQlNZLAorICAgICAqIG90aGVyd2lzZSB3ZSB3aWxsIHRyaWdnZXIgYW4gaW50ZXJydXB0LgorICAgICAqLworCisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCAwKTsKKworICAgIC8qCisgICAgICogVGhlIGluaXRpYXRvciBzaGFsbCB0aGVuIHdhaXQgYXQgbGVhc3QgdHdvIGRlc2tldyBkZWxheXMgYW5kIHJlbGVhc2UgCisgICAgICogdGhlIEJTWSBzaWduYWwuCisgICAgICovCisgICAgdWRlbGF5KDEpOyAgICAgICAgLyogd2luZ2VsIC0tIHdhaXQgdHdvIGJ1cyBkZXNrZXcgZGVsYXkgPjIqNDVucyAqLworCisgICAgLyogUmVzZXQgQlNZICovCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIChJQ1JfQkFTRSB8IElDUl9BU1NFUlRfREFUQSB8IAorCUlDUl9BU1NFUlRfQVROIHwgSUNSX0FTU0VSVF9TRUwpKTsKKworICAgIC8qIAorICAgICAqIFNvbWV0aGluZyB3ZWlyZCBoYXBwZW5zIHdoZW4gd2UgY2Vhc2UgdG8gZHJpdmUgQlNZIC0gbG9va3MKKyAgICAgKiBsaWtlIHRoZSBib2FyZC9jaGlwIGlzIGxldHRpbmcgdXMgZG8gYW5vdGhlciByZWFkIGJlZm9yZSB0aGUgCisgICAgICogYXBwcm9wcmlhdGUgcHJvcGFnYXRpb24gZGVsYXkgaGFzIGV4cGlyZWQsIGFuZCB3ZSdyZSBjb25mdXNpbmcKKyAgICAgKiBhIEJTWSBzaWduYWwgZnJvbSBvdXJzZWx2ZXMgYXMgdGhlIHRhcmdldCdzIHJlc3BvbnNlIHRvIFNFTEVDVElPTi4KKyAgICAgKgorICAgICAqIEEgc21hbGwgZGVsYXkgKHRoZSAnQysrJyBmcm9udGVuZCBicmVha3MgdGhlIHBpcGVsaW5lIHdpdGggYW4KKyAgICAgKiB1bm5lY2Vzc2FyeSBqdW1wLCBtYWtpbmcgaXQgd29yayBvbiBteSAzODYtMzMvVHJhbnRvciBUMTI4LCB0aGUKKyAgICAgKiB0aWdodGVyICdDJyBjb2RlIGJyZWFrcyBhbmQgcmVxdWlyZXMgdGhpcykgc29sdmVzIHRoZSBwcm9ibGVtIC0gCisgICAgICogdGhlIDEgdXMgZGVsYXkgaXMgYXJiaXRyYXJ5LCBhbmQgb25seSB1c2VkIGJlY2F1c2UgdGhpcyBkZWxheSB3aWxsIAorICAgICAqIGJlIHRoZSBzYW1lIG9uIG90aGVyIHBsYXRmb3JtcyBhbmQgc2luY2UgaXQgd29ya3MgaGVyZSwgaXQgc2hvdWxkIAorICAgICAqIHdvcmsgdGhlcmUuCisgICAgICoKKyAgICAgKiB3aW5nZWwgc3VnZ2VzdHMgdGhhdCB0aGlzIGNvdWxkIGJlIGR1ZSB0byBmYWlsaW5nIHRvIHdhaXQKKyAgICAgKiBvbmUgZGVza2V3IGRlbGF5LgorICAgICAqLworCisgICAgdWRlbGF5KDEpOworCisgICAgU0VMX1BSSU5USygic2NzaSVkOiBzZWxlY3RpbmcgdGFyZ2V0ICVkXG4iLCBIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCk7CisKKyAgICAvKiAKKyAgICAgKiBUaGUgU0NTSSBzcGVjaWZpY2F0aW9uIGNhbGxzIGZvciBhIDI1MCBtcyB0aW1lb3V0IGZvciB0aGUgYWN0dWFsIAorICAgICAqIHNlbGVjdGlvbi4KKyAgICAgKi8KKworICAgIHRpbWVvdXQgPSBqaWZmaWVzICsgMjU7IAorCisgICAgLyogCisgICAgICogWFhYIHZlcnkgaW50ZXJlc3RpbmcgLSB3ZSdyZSBzZWVpbmcgYSBib3VuY2Ugd2hlcmUgdGhlIEJTWSB3ZSAKKyAgICAgKiBhc3NlcnRlZCBpcyBiZWluZyByZWZsZWN0ZWQgLyBzdGlsbCBhc3NlcnRlZCAocHJvcGFnYXRpb24gZGVsYXk/KQorICAgICAqIGFuZCBpdCdzIGRldGVjdGluZyBhcyB0cnVlLiAgU2lnaC4KKyAgICAgKi8KKworI2lmIDAKKyAgICAvKiArK3JvbWFuOiBJZiBhIHRhcmdldCBjb25mb3JtZWQgdG8gdGhlIFNDU0kgc3RhbmRhcmQsIGl0IHdvdWxkbid0IGFzc2VydAorICAgICAqIElPIHdoaWxlIFNFTCBpcyB0cnVlLiBCdXQgYWdhaW4sIHRoZXJlIGFyZSBzb21lIGRpc2tzIG91dCB0aGUgaW4gdGhlCisgICAgICogd29ybGQgdGhhdCBkbyB0aGF0IG5ldmVydGhlbGVzcy4gKFNvbWVib2R5IGNsYWltZWQgdGhhdCB0aGlzIGFubm91bmNlcworICAgICAqIHJlc2VsZWN0aW9uIGNhcGFiaWxpdHkgb2YgdGhlIHRhcmdldC4pIFNvIHdlIGJldHRlciBza2lwIHRoYXQgdGVzdCBhbmQKKyAgICAgKiBvbmx5IHdhaXQgZm9yIEJTWS4uLiAoRmFtb3VzIGdlcm1hbiB3b3JkczogRGVyIEts/GdlcmUgZ2lidCBuYWNoIDotKQorICAgICAqLworCisgICAgd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgCisJKFNSX0JTWSB8IFNSX0lPKSkpOworCisgICAgaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMIHwgU1JfSU8pKSA9PSAKKwkgICAgKFNSX1NFTCB8IFNSX0lPKSkgeworCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCSAgICBOQ1I1MzgwX3Jlc2VsZWN0KGluc3RhbmNlKTsKKwkgICAgcHJpbnRrIChLRVJOX0VSUiAic2NzaSVkOiByZXNlbGVjdGlvbiBhZnRlciB3b24gYXJiaXRyYXRpb24/XG4iLAorCQkgICAgSE9TVE5PKTsKKwkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCSAgICByZXR1cm4gLTE7CisgICAgfQorI2Vsc2UKKyAgICB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIShOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9CU1kpKTsKKyNlbmRpZgorCisgICAgLyogCisgICAgICogTm8gbGVzcyB0aGFuIHR3byBkZXNrZXcgZGVsYXlzIGFmdGVyIHRoZSBpbml0aWF0b3IgZGV0ZWN0cyB0aGUgCisgICAgICogQlNZIHNpZ25hbCBpcyB0cnVlLCBpdCBzaGFsbCByZWxlYXNlIHRoZSBTRUwgc2lnbmFsIGFuZCBtYXkgCisgICAgICogY2hhbmdlIHRoZSBEQVRBIEJVUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdpbmdlbAorICAgICAqLworCisgICAgdWRlbGF5KDEpOworCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4pOworCisgICAgaWYgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSkgeworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJaWYgKGhvc3RkYXRhLT50YXJnZXRzX3ByZXNlbnQgJiAoMSA8PCBjbWQtPmRldmljZS0+aWQpKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAic2NzaSVkOiB3ZWlyZG5lc3NcbiIsIEhPU1ROTyk7CisJICAgIGlmIChob3N0ZGF0YS0+cmVzdGFydF9zZWxlY3QpCisJCXByaW50ayhLRVJOX05PVElDRSAiXHRyZXN0YXJ0IHNlbGVjdFxuIik7CisJICAgIE5DUl9QUklOVChOREVCVUdfQU5ZKTsKKwkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCSAgICByZXR1cm4gLTE7CisJfQorCWNtZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisjaWZkZWYgTkNSNTM4MF9TVEFUUworCWNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX1RBR1MKKwljbWRfZnJlZV90YWcoIGNtZCApOworI2VuZGlmCisJY21kLT5zY3NpX2RvbmUoY21kKTsKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJU0VMX1BSSU5USygic2NzaSVkOiB0YXJnZXQgZGlkIG5vdCByZXNwb25kIHdpdGhpbiAyNTBtc1xuIiwgSE9TVE5PKTsKKwlOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJcmV0dXJuIDA7CisgICAgfSAKKworICAgIGhvc3RkYXRhLT50YXJnZXRzX3ByZXNlbnQgfD0gKDEgPDwgY21kLT5kZXZpY2UtPmlkKTsKKworICAgIC8qCisgICAgICogU2luY2Ugd2UgZm9sbG93ZWQgdGhlIFNDU0kgc3BlYywgYW5kIHJhaXNlZCBBVE4gd2hpbGUgU0VMIAorICAgICAqIHdhcyB0cnVlIGJ1dCBiZWZvcmUgQlNZIHdhcyBmYWxzZSBkdXJpbmcgc2VsZWN0aW9uLCB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiB0cmFuc2ZlciBwaGFzZSBzaG91bGQgYmUgYSBNRVNTQUdFIE9VVCBwaGFzZSBzbyB0aGF0IHdlIGNhbiBzZW5kIHRoZQorICAgICAqIElERU5USUZZIG1lc3NhZ2UuCisgICAgICogCisgICAgICogSWYgU0NTSS1JSSB0YWdnZWQgcXVldWluZyBpcyBlbmFibGVkLCB3ZSBhbHNvIHNlbmQgYSBTSU1QTEVfUVVFVUVfVEFHCisgICAgICogbWVzc2FnZSAoMiBieXRlcykgd2l0aCBhIHRhZyBJRCB0aGF0IHdlIGluY3JlbWVudCB3aXRoIGV2ZXJ5IGNvbW1hbmQKKyAgICAgKiB1bnRpbCBpdCB3cmFwcyBiYWNrIHRvIDAuCisgICAgICoKKyAgICAgKiBYWFggLSBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBhcmUgc29tZSBicm9rZW4gU0NTSS1JSSBkZXZpY2VzLAorICAgICAqCSAgICAgd2hpY2ggY2xhaW0gdG8gc3VwcG9ydCB0YWdnZWQgcXVldWluZyBidXQgZmFpbCB3aGVuIG1vcmUgdGhhbgorICAgICAqCSAgICAgc29tZSBudW1iZXIgb2YgY29tbWFuZHMgYXJlIGlzc3VlZCBhdCBvbmNlLgorICAgICAqLworCisgICAgLyogV2FpdCBmb3Igc3RhcnQgb2YgUkVRL0FDSyBoYW5kc2hha2UgKi8KKyAgICB3aGlsZSAoIShOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpKTsKKworICAgIFNFTF9QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIHNlbGVjdGVkLCBnb2luZyBpbnRvIE1FU1NBR0UgT1VUIHBoYXNlLlxuIiwKKwkgICAgICAgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQpOworICAgIHRtcFswXSA9IElERU5USUZZKDEsIGNtZC0+ZGV2aWNlLT5sdW4pOworCisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgaWYgKGNtZC0+dGFnICE9IFRBR19OT05FKSB7CisJdG1wWzFdID0gaG9zdGRhdGEtPmxhc3RfbWVzc2FnZSA9IFNJTVBMRV9RVUVVRV9UQUc7CisJdG1wWzJdID0gY21kLT50YWc7CisJbGVuID0gMzsKKyAgICB9IGVsc2UgCisJbGVuID0gMTsKKyNlbHNlCisgICAgbGVuID0gMTsKKyAgICBjbWQtPnRhZz0wOworI2VuZGlmIC8qIFNVUFBPUlRfVEFHUyAqLworCisgICAgLyogU2VuZCBtZXNzYWdlKHMpICovCisgICAgZGF0YSA9IHRtcDsKKyAgICBwaGFzZSA9IFBIQVNFX01TR09VVDsKKyAgICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisgICAgU0VMX1BSSU5USygic2NzaSVkOiBuZXh1cyBlc3RhYmxpc2hlZC5cbiIsIEhPU1ROTyk7CisgICAgLyogWFhYIG5lZWQgdG8gaGFuZGxlIGVycm9ycyBoZXJlICovCisgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IGNtZDsKKyNpZm5kZWYgU1VQUE9SVF9UQUdTCisgICAgaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSB8PSAoMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZiAgICAKKyNpZmRlZiBTVU4zX1NDU0lfVk1FCisgICAgZHJlZ3MtPmNzciB8PSBDU1JfSU5UUjsKKyNlbmRpZgorICAgIGluaXRpYWxpemVfU0NwKGNtZCk7CisKKworICAgIHJldHVybiAwOworfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfdHJhbnNmZXJfcGlvIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKiAgICAgIHVuc2lnbmVkIGNoYXIgKnBoYXNlLCBpbnQgKmNvdW50LCB1bnNpZ25lZCBjaGFyICoqZGF0YSkKKyAqCisgKiBQdXJwb3NlIDogdHJhbnNmZXJzIGRhdGEgaW4gZ2l2ZW4gcGhhc2UgdXNpbmcgcG9sbGVkIEkvTworICoKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgZHJpdmVyLCAqcGhhc2UgLSBwb2ludGVyIHRvIAorICoJd2hhdCBwaGFzZSBpcyBleHBlY3RlZCwgKmNvdW50IC0gcG9pbnRlciB0byBudW1iZXIgb2YgCisgKglieXRlcyB0byB0cmFuc2ZlciwgKipkYXRhIC0gcG9pbnRlciB0byBkYXRhIHBvaW50ZXIuCisgKiAKKyAqIFJldHVybnMgOiAtMSB3aGVuIGRpZmZlcmVudCBwaGFzZSBpcyBlbnRlcmVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nCisgKgltYXhpbXVtIG51bWJlciBvZiBieXRlcywgMCBpZiBhbGwgYnl0ZXMgYXJlIHRyYW5zZmVyZWQgb3IgZXhpdAorICoJaXMgaW4gc2FtZSBwaGFzZS4KKyAqCisgKiAJQWxzbywgKnBoYXNlLCAqY291bnQsICpkYXRhIGFyZSBtb2RpZmllZCBpbiBwbGFjZS4KKyAqCisgKiBYWFggTm90ZSA6IGhhbmRsaW5nIGZvciBidXMgZnJlZSBtYXkgYmUgdXNlZnVsLgorICovCisKKy8qCisgKiBOb3RlIDogdGhpcyBjb2RlIGlzIG5vdCBhcyBxdWljayBhcyBpdCBjb3VsZCBiZSwgaG93ZXZlciBpdCAKKyAqIElTIDEwMCUgcmVsaWFibGUsIGFuZCBmb3IgdGhlIGFjdHVhbCBkYXRhIHRyYW5zZmVyIHdoZXJlIHNwZWVkCisgKiBjb3VudHMsIHdlIHdpbGwgYWx3YXlzIGRvIGEgcHNldWRvIERNQSBvciBETUEgdHJhbnNmZXIuCisgKi8KKworc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX3Bpbyggc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorCQkJCSB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwKKwkJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEpCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBwID0gKnBoYXNlLCB0bXA7CisgICAgcmVnaXN0ZXIgaW50IGMgPSAqY291bnQ7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZCA9ICpkYXRhOworCisgICAgLyogCisgICAgICogVGhlIE5DUjUzODAgY2hpcCB3aWxsIG9ubHkgZHJpdmUgdGhlIFNDU0kgYnVzIHdoZW4gdGhlIAorICAgICAqIHBoYXNlIHNwZWNpZmllZCBpbiB0aGUgYXBwcm9wcmlhdGUgYml0cyBvZiB0aGUgVEFSR0VUIENPTU1BTkQKKyAgICAgKiBSRUdJU1RFUiBtYXRjaCB0aGUgU1RBVFVTIFJFR0lTVEVSCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKFRBUkdFVF9DT01NQU5EX1JFRywgUEhBU0VfU1JfVE9fVENSKHApKTsKKworICAgIGRvIHsKKwkvKiAKKwkgKiBXYWl0IGZvciBhc3NlcnRpb24gb2YgUkVRLCBhZnRlciB3aGljaCB0aGUgcGhhc2UgYml0cyB3aWxsIGJlIAorCSAqIHZhbGlkIAorCSAqLworCXdoaWxlICghKCh0bXAgPSBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykpICYgU1JfUkVRKSk7CisKKwlIU0hfUFJJTlRLKCJzY3NpJWQ6IFJFUSBkZXRlY3RlZFxuIiwgSE9TVE5PKTsKKworCS8qIENoZWNrIGZvciBwaGFzZSBtaXNtYXRjaCAqLwkKKwlpZiAoKHRtcCAmIFBIQVNFX01BU0spICE9IHApIHsKKwkgICAgUElPX1BSSU5USygic2NzaSVkOiBwaGFzZSBtaXNtYXRjaFxuIiwgSE9TVE5PKTsKKwkgICAgTkNSX1BSSU5UX1BIQVNFKE5ERUJVR19QSU8pOworCSAgICBicmVhazsKKwl9CisKKwkvKiBEbyBhY3R1YWwgdHJhbnNmZXIgZnJvbSBTQ1NJIGJ1cyB0byAvIGZyb20gbWVtb3J5ICovCisJaWYgKCEocCAmIFNSX0lPKSkgCisJICAgIE5DUjUzODBfd3JpdGUoT1VUUFVUX0RBVEFfUkVHLCAqZCk7CisJZWxzZSAKKwkgICAgKmQgPSBOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKTsKKworCSsrZDsKKworCS8qIAorCSAqIFRoZSBTQ1NJIHN0YW5kYXJkIHN1Z2dlc3RzIHRoYXQgaW4gTVNHT1VUIHBoYXNlLCB0aGUgaW5pdGlhdG9yCisJICogc2hvdWxkIGRyb3AgQVROIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UgcGhhc2UKKwkgKiBhZnRlciBSRVEgaGFzIGJlZW4gYXNzZXJ0ZWQgZm9yIHRoZSBoYW5kc2hha2UgYnV0IGJlZm9yZQorCSAqIHRoZSBpbml0aWF0b3IgcmFpc2VzIEFDSy4KKwkgKi8KKworCWlmICghKHAgJiBTUl9JTykpIHsKKwkgICAgaWYgKCEoKHAgJiBTUl9NU0cpICYmIGMgPiAxKSkgeworCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCAKKwkJICAgIElDUl9BU1NFUlRfREFUQSk7CisJCU5DUl9QUklOVChOREVCVUdfUElPKTsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCQlJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FDSyk7CisJICAgIH0gZWxzZSB7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8CisJCSAgICBJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTik7CisJCU5DUl9QUklOVChOREVCVUdfUElPKTsKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCSAgICBJQ1JfQVNTRVJUX0RBVEEgfCBJQ1JfQVNTRVJUX0FUTiB8IElDUl9BU1NFUlRfQUNLKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIE5DUl9QUklOVChOREVCVUdfUElPKTsKKwkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BQ0spOworCX0KKworCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCisJSFNIX1BSSU5USygic2NzaSVkOiByZXEgZmFsc2UsIGhhbmRzaGFrZSBjb21wbGV0ZVxuIiwgSE9TVE5PKTsKKworLyoKKyAqIFdlIGhhdmUgc2V2ZXJhbCBzcGVjaWFsIGNhc2VzIHRvIGNvbnNpZGVyIGR1cmluZyBSRVEvQUNLIGhhbmRzaGFraW5nIDogCisgKiAxLiAgV2Ugd2VyZSBpbiBNU0dPVVQgcGhhc2UsIGFuZCB3ZSBhcmUgb24gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgCisgKgltZXNzYWdlLiAgQVROIG11c3QgYmUgZHJvcHBlZCBhcyBBQ0sgaXMgZHJvcHBlZC4KKyAqCisgKiAyLiAgV2UgYXJlIGluIGEgTVNHSU4gcGhhc2UsIGFuZCB3ZSBhcmUgb24gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgIAorICoJbWVzc2FnZS4gIFdlIG11c3QgZXhpdCB3aXRoIEFDSyBhc3NlcnRlZCwgc28gdGhhdCB0aGUgY2FsbGluZworICoJY29kZSBtYXkgcmFpc2UgQVROIGJlZm9yZSBkcm9wcGluZyBBQ0sgdG8gcmVqZWN0IHRoZSBtZXNzYWdlLgorICoKKyAqIDMuICBBQ0sgYW5kIEFUTiBhcmUgY2xlYXIgYW5kIHRoZSB0YXJnZXQgbWF5IHByb2NlZWQgYXMgbm9ybWFsLgorICovCisJaWYgKCEocCA9PSBQSEFTRV9NU0dJTiAmJiBjID09IDEpKSB7ICAKKwkgICAgaWYgKHAgPT0gUEhBU0VfTVNHT1VUICYmIGMgPiAxKQorCQlOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX0FUTik7CisJICAgIGVsc2UKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwl9IAorICAgIH0gd2hpbGUgKC0tYyk7CisKKyAgICBQSU9fUFJJTlRLKCJzY3NpJWQ6IHJlc2lkdWFsICVkXG4iLCBIT1NUTk8sIGMpOworCisgICAgKmNvdW50ID0gYzsKKyAgICAqZGF0YSA9IGQ7CisgICAgdG1wID0gTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpOworICAgIC8qIFRoZSBwaGFzZSByZWFkIGZyb20gdGhlIGJ1cyBpcyB2YWxpZCBpZiBlaXRoZXIgUkVRIGlzIChhbHJlYWR5KQorICAgICAqIGFzc2VydGVkIG9yIGlmIEFDSyBoYXNuJ3QgYmVlbiByZWxlYXNlZCB5ZXQuIFRoZSBsYXR0ZXIgaXMgdGhlIGNhc2UgaWYKKyAgICAgKiB3ZSdyZSBpbiBNU0dJTiBhbmQgYWxsIHdhbnRlZCBieXRlcyBoYXZlIGJlZW4gcmVjZWl2ZWQuICovCisgICAgaWYgKCh0bXAgJiBTUl9SRVEpIHx8IChwID09IFBIQVNFX01TR0lOICYmIGMgPT0gMCkpCisJKnBoYXNlID0gdG1wICYgUEhBU0VfTUFTSzsKKyAgICBlbHNlIAorCSpwaGFzZSA9IFBIQVNFX1VOS05PV047CisKKyAgICBpZiAoIWMgfHwgKCpwaGFzZSA9PSBwKSkKKwlyZXR1cm4gMDsKKyAgICBlbHNlIAorCXJldHVybiAtMTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIDogZG9fYWJvcnQgKFNjc2lfSG9zdCAqaG9zdCkKKyAqIAorICogUHVycG9zZSA6IGFib3J0IHRoZSBjdXJyZW50bHkgZXN0YWJsaXNoZWQgbmV4dXMuICBTaG91bGQgb25seSBiZSAKKyAqIAljYWxsZWQgZnJvbSBhIHJvdXRpbmUgd2hpY2ggY2FuIGRyb3AgaW50byBhIAorICogCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgZG9fYWJvcnQgKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpIAoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wLCAqbXNncHRyLCBwaGFzZTsKKyAgICBpbnQgbGVuOworCisgICAgLyogUmVxdWVzdCBtZXNzYWdlIG91dCBwaGFzZSAqLworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKworICAgIC8qIAorICAgICAqIFdhaXQgZm9yIHRoZSB0YXJnZXQgdG8gaW5kaWNhdGUgYSB2YWxpZCBwaGFzZSBieSBhc3NlcnRpbmcgCisgICAgICogUkVRLiAgT25jZSB0aGlzIGhhcHBlbnMsIHdlJ2xsIGhhdmUgZWl0aGVyIGEgTVNHT1VUIHBoYXNlIAorICAgICAqIGFuZCBjYW4gaW1tZWRpYXRlbHkgc2VuZCB0aGUgQUJPUlQgbWVzc2FnZSwgb3Igd2UnbGwgaGF2ZSBzb21lIAorICAgICAqIG90aGVyIHBoYXNlIGFuZCB3aWxsIGhhdmUgdG8gc291cmNlL3NpbmsgZGF0YS4KKyAgICAgKiAKKyAgICAgKiBXZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGF0IHZhbHVlIHdhcyBvbiB0aGUgYnVzIG9yIHdoYXQgdmFsdWUKKyAgICAgKiB0aGUgdGFyZ2V0IHNlZXMsIHNvIHdlIGp1c3QgaGFuZHNoYWtlLgorICAgICAqLworICAgIAorICAgIHdoaWxlICghKHRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSkgJiBTUl9SRVEpOworCisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUih0bXApKTsKKworICAgIGlmICgodG1wICYgUEhBU0VfTUFTSykgIT0gUEhBU0VfTVNHT1VUKSB7CisJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4gfCAKKwkJICAgICAgSUNSX0FTU0VSVF9BQ0spOworCXdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9SRVEpOworCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQVROKTsKKyAgICB9CisgICAKKyAgICB0bXAgPSBBQk9SVDsKKyAgICBtc2dwdHIgPSAmdG1wOworICAgIGxlbiA9IDE7CisgICAgcGhhc2UgPSBQSEFTRV9NU0dPVVQ7CisgICAgTkNSNTM4MF90cmFuc2Zlcl9waW8gKGhvc3QsICZwaGFzZSwgJmxlbiwgJm1zZ3B0cik7CisKKyAgICAvKgorICAgICAqIElmIHdlIGdvdCBoZXJlLCBhbmQgdGhlIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwKKyAgICAgKiB3ZSdyZSBhYm91dCB0byBnbyBpbnRvIGJ1cyBmcmVlIHN0YXRlLgorICAgICAqLworCisgICAgcmV0dXJuIGxlbiA/IC0xIDogMDsKK30KKworI2lmIGRlZmluZWQoUkVBTF9ETUEpCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfdHJhbnNmZXJfZG1hIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgCisgKiAgICAgIHVuc2lnbmVkIGNoYXIgKnBoYXNlLCBpbnQgKmNvdW50LCB1bnNpZ25lZCBjaGFyICoqZGF0YSkKKyAqCisgKiBQdXJwb3NlIDogdHJhbnNmZXJzIGRhdGEgaW4gZ2l2ZW4gcGhhc2UgdXNpbmcgZWl0aGVyIHJlYWwKKyAqCW9yIHBzZXVkbyBETUEuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UgLSBpbnN0YW5jZSBvZiBkcml2ZXIsICpwaGFzZSAtIHBvaW50ZXIgdG8gCisgKgl3aGF0IHBoYXNlIGlzIGV4cGVjdGVkLCAqY291bnQgLSBwb2ludGVyIHRvIG51bWJlciBvZiAKKyAqCWJ5dGVzIHRvIHRyYW5zZmVyLCAqKmRhdGEgLSBwb2ludGVyIHRvIGRhdGEgcG9pbnRlci4KKyAqIAorICogUmV0dXJucyA6IC0xIHdoZW4gZGlmZmVyZW50IHBoYXNlIGlzIGVudGVyZWQgd2l0aG91dCB0cmFuc2ZlcnJpbmcKKyAqCW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzLCAwIGlmIGFsbCBieXRlcyBvciB0cmFuc2ZlcmVkIG9yIGV4aXQKKyAqCWlzIGluIHNhbWUgcGhhc2UuCisgKgorICogCUFsc28sICpwaGFzZSwgKmNvdW50LCAqZGF0YSBhcmUgbW9kaWZpZWQgaW4gcGxhY2UuCisgKgorICovCisKKworc3RhdGljIGludCBOQ1I1MzgwX3RyYW5zZmVyX2RtYSggc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorCQkJCSB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwKKwkJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEpCit7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworICAgIHJlZ2lzdGVyIGludCBjID0gKmNvdW50OworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgcCA9ICpwaGFzZTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgLyogc2FuaXR5IGNoZWNrICovCisgICAgaWYoIXN1bjNfZG1hX3NldHVwX2RvbmUpIHsKKwkgcHJpbnRrKCJzY3NpJWQ6IHRyYW5zZmVyX2RtYSB3aXRob3V0IHNldHVwIVxuIiwgSE9TVE5PKTsKKwkgQlVHKCk7CisgICAgfQorICAgIGhvc3RkYXRhLT5kbWFfbGVuID0gYzsKKworICAgIERNQV9QUklOVEsoInNjc2klZDogaW5pdGlhbGl6aW5nIERNQSBmb3IgJXMsICVkIGJ5dGVzICVzICVwXG4iLAorCSAgICAgICBIT1NUTk8sIChwICYgU1JfSU8pID8gInJlYWRpbmciIDogIndyaXRpbmciLAorCSAgICAgICBjLCAocCAmIFNSX0lPKSA/ICJ0byIgOiAiZnJvbSIsICpkYXRhKTsKKworICAgIC8qIG5ldGJzZCB0dXJucyBvZmYgaW50cyBoZXJlLCB3aHkgbm90IGJlIHNhZmUgYW5kIGRvIGl0IHRvbyAqLworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICAvKiBzZW5kIHN0YXJ0IGNoYWluICovCisgICAgc3VuM3Njc2lfZG1hX3N0YXJ0KGMsICpkYXRhKTsKKyAgICAKKyAgICBpZiAocCAmIFNSX0lPKSB7CisJICAgIE5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCAxKTsKKwkgICAgTkNSNTM4MF9yZWFkKFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHKTsKKwkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIDApOworCSAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCAoTkNSNTM4MF9yZWFkKE1PREVfUkVHKSB8IE1SX0RNQV9NT0RFIHwgTVJfRU5BQkxFX0VPUF9JTlRSKSk7CisJICAgIE5DUjUzODBfd3JpdGUoU1RBUlRfRE1BX0lOSVRJQVRPUl9SRUNFSVZFX1JFRywgMCk7CisgICAgfSBlbHNlIHsKKwkgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCSAgICBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOworCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0FTU0VSVF9EQVRBKTsKKwkgICAgTkNSNTM4MF93cml0ZShNT0RFX1JFRywgKE5DUjUzODBfcmVhZChNT0RFX1JFRykgfCBNUl9ETUFfTU9ERSB8IE1SX0VOQUJMRV9FT1BfSU5UUikpOworCSAgICBOQ1I1MzgwX3dyaXRlKFNUQVJUX0RNQV9TRU5EX1JFRywgMCk7CisgICAgfQorCisjaWZkZWYgU1VOM19TQ1NJX1ZNRQorICAgIGRyZWdzLT5jc3IgfD0gQ1NSX0RNQV9FTkFCTEU7CisjZW5kaWYKKworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHN1bjNfZG1hX2FjdGl2ZSA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZChSRUFMX0RNQSkgKi8KKworLyoKKyAqIEZ1bmN0aW9uIDogTkNSNTM4MF9pbmZvcm1hdGlvbl90cmFuc2ZlciAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCisgKgorICogUHVycG9zZSA6IHJ1biB0aHJvdWdoIHRoZSB2YXJpb3VzIFNDU0kgcGhhc2VzIGFuZCBkbyBhcyB0aGUgdGFyZ2V0IAorICogCWRpcmVjdHMgdXMgdG8uICBPcGVyYXRlcyBvbiB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBjb21tYW5kLCAKKyAqCWluc3RhbmNlLT5jb25uZWN0ZWQuCisgKgorICogSW5wdXRzIDogaW5zdGFuY2UsIGluc3RhbmNlIGZvciB3aGljaCB3ZSBhcmUgZG9pbmcgY29tbWFuZHMKKyAqCisgKiBTaWRlIGVmZmVjdHMgOiBTQ1NJIHRoaW5ncyBoYXBwZW4sIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUgd2lsbCBiZSAKKyAqCW1vZGlmaWVkIGlmIGEgY29tbWFuZCBkaXNjb25uZWN0cywgKmluc3RhbmNlLT5jb25uZWN0ZWQgd2lsbAorICoJY2hhbmdlLgorICoKKyAqIFhYWCBOb3RlIDogd2UgbmVlZCB0byB3YXRjaCBmb3IgYnVzIGZyZWUgb3IgYSByZXNldCBjb25kaXRpb24gaGVyZSAKKyAqIAl0byByZWNvdmVyIGZyb20gYW4gdW5leHBlY3RlZCBidXMgZnJlZSBjb25kaXRpb24uCisgKi8KKyAKK3N0YXRpYyB2b2lkIE5DUjUzODBfaW5mb3JtYXRpb25fdHJhbnNmZXIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGNoYXIgbXNnb3V0ID0gTk9QOworICAgIGludCBzaW5rID0gMDsKKyAgICBpbnQgbGVuOworI2lmIGRlZmluZWQoUkVBTF9ETUEpCisgICAgaW50IHRyYW5zZmVyc2l6ZTsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgdW5zaWduZWQgY2hhciBwaGFzZSwgdG1wLCBleHRlbmRlZF9tc2dbMTBdLCBvbGRfcGhhc2U9MHhmZjsKKyAgICBTY3NpX0NtbmQgKmNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsKKworI2lmZGVmIFNVTjNfU0NTSV9WTUUKKyAgICBkcmVncy0+Y3NyIHw9IENTUl9JTlRSOworI2VuZGlmCisKKyAgICB3aGlsZSAoMSkgeworCXRtcCA9IE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKTsKKwkvKiBXZSBvbmx5IGhhdmUgYSB2YWxpZCBTQ1NJIHBoYXNlIHdoZW4gUkVRIGlzIGFzc2VydGVkICovCisJaWYgKHRtcCAmIFNSX1JFUSkgeworCSAgICBwaGFzZSA9ICh0bXAgJiBQSEFTRV9NQVNLKTsgCisgCSAgICBpZiAocGhhc2UgIT0gb2xkX3BoYXNlKSB7CisJCW9sZF9waGFzZSA9IHBoYXNlOworCQlOQ1JfUFJJTlRfUEhBU0UoTkRFQlVHX0lORk9STUFUSU9OKTsKKwkgICAgfQorCisJICAgIGlmKHBoYXNlID09IFBIQVNFX0NNRE9VVCkgeworCQkgICAgdm9pZCAqZDsKKwkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CisKKwkJaWYgKCFjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICYmIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkJCWNvdW50ID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQlkID0gU0dBRERSKGNtZC0+U0NwLmJ1ZmZlcik7CisJCX0gZWxzZSB7CisJCQljb3VudCA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCQlkID0gY21kLT5TQ3AucHRyOworCQl9CisjaWZkZWYgUkVBTF9ETUEKKwkJLyogdGhpcyBjb21tYW5kIHNldHVwIGZvciBkbWEgeWV0PyAqLworCQlpZigoY291bnQgPiBTVU4zX0RNQV9NSU5TSVpFKSAmJiAoc3VuM19kbWFfc2V0dXBfZG9uZQorCQkJCQkJICAhPSBjbWQpKQorCQl7CisJCQlpZihjbWQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0NNRCkgeworCQkJCXN1bjNzY3NpX2RtYV9zZXR1cChkLCBjb3VudCwKKwkJCQkJCSAgIHJxX2RhdGFfZGlyKGNtZC0+cmVxdWVzdCkpOworCQkJCXN1bjNfZG1hX3NldHVwX2RvbmUgPSBjbWQ7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmZGVmIFNVTjNfU0NTSV9WTUUKKwkJZHJlZ3MtPmNzciB8PSBDU1JfSU5UUjsKKyNlbmRpZgorCSAgICB9CisKKwkgICAgCisJICAgIGlmIChzaW5rICYmIChwaGFzZSAhPSBQSEFTRV9NU0dPVVQpKSB7CisJCU5DUjUzODBfd3JpdGUoVEFSR0VUX0NPTU1BTkRfUkVHLCBQSEFTRV9TUl9UT19UQ1IodG1wKSk7CisKKwkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9BVE4gfCAKKwkJICAgIElDUl9BU1NFUlRfQUNLKTsKKwkJd2hpbGUgKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX1JFUSk7CisJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkgICAgSUNSX0FTU0VSVF9BVE4pOworCQlzaW5rID0gMDsKKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBzd2l0Y2ggKHBoYXNlKSB7CisJICAgIGNhc2UgUEhBU0VfREFUQU9VVDoKKyNpZiAoTkRFQlVHICYgTkRFQlVHX05PX0RBVEFPVVQpCisJCXByaW50aygic2NzaSVkOiBOREVCVUdfTk9fREFUQU9VVCBzZXQsIGF0dGVtcHRlZCBEQVRBT1VUICIKKwkJICAgICAgICJhYm9ydGVkXG4iLCBIT1NUTk8pOworCQlzaW5rID0gMTsKKwkJZG9fYWJvcnQoaW5zdGFuY2UpOworCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiAgPDwgMTY7CisJCWNtZC0+ZG9uZShjbWQpOworCQlyZXR1cm47CisjZW5kaWYKKwkgICAgY2FzZSBQSEFTRV9EQVRBSU46CisJCS8qIAorCQkgKiBJZiB0aGVyZSBpcyBubyByb29tIGxlZnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZQorCQkgKiBzY2F0dGVyLWdhdGhlciBsaXN0LCBtb3ZlIG9udG8gdGhlIG5leHQgb25lLgorCQkgKi8KKwkJaWYgKCFjbWQtPlNDcC50aGlzX3Jlc2lkdWFsICYmIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpIHsKKwkJICAgICsrY21kLT5TQ3AuYnVmZmVyOworCQkgICAgLS1jbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCQkgICAgY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkgICAgY21kLT5TQ3AucHRyID0gU0dBRERSKGNtZC0+U0NwLmJ1ZmZlcik7CisKKwkJICAgIC8qICsrcm9tYW46IFRyeSB0byBtZXJnZSBzb21lIHNjYXR0ZXItYnVmZmVycyBpZgorCQkgICAgICogdGhleSBhcmUgYXQgY29udGlndW91cyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJCSAgICAgKi8KKy8vCQkgICAgbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBjbWQgKTsKKwkJICAgIElORl9QUklOVEsoInNjc2klZDogJWQgYnl0ZXMgYW5kICVkIGJ1ZmZlcnMgbGVmdFxuIiwKKwkJCSAgICAgICBIT1NUTk8sIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsCisJCQkgICAgICAgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCk7CisJCX0KKworCQkvKgorCQkgKiBUaGUgcHJlZmVycmVkIHRyYW5zZmVyIG1ldGhvZCBpcyBnb2luZyB0byBiZSAKKwkJICogUFNFVURPLURNQSBmb3Igc3lzdGVtcyB0aGF0IGFyZSBzdHJpY3RseSBQSU8sCisJCSAqIHNpbmNlIHdlIGNhbiBsZXQgdGhlIGhhcmR3YXJlIGRvIHRoZSBoYW5kc2hha2luZy4KKwkJICoKKwkJICogRm9yIHRoaXMgdG8gd29yaywgd2UgbmVlZCB0byBrbm93IHRoZSB0cmFuc2ZlcnNpemUKKwkJICogYWhlYWQgb2YgdGltZSwgc2luY2UgdGhlIHBzZXVkby1ETUEgY29kZSB3aWxsIHNpdAorCQkgKiBpbiBhbiB1bmNvbmRpdGlvbmFsIGxvb3AuCisJCSAqLworCisvKiArK3JvbWFuOiBJIHN1Z2dlc3QsIHRoaXMgc2hvdWxkIGJlCisgKiAgICNpZiBkZWYoUkVBTF9ETUEpCisgKiBpbnN0ZWFkIG9mIGxlYXZpbmcgUkVBTF9ETUEgb3V0LgorICovCisKKyNpZiBkZWZpbmVkKFJFQUxfRE1BKQorLy8JCWlmICghY21kLT5kZXZpY2UtPmJvcmtlbiAmJgorCQlpZigodHJhbnNmZXJzaXplID0KKwkJICAgIE5DUjUzODBfZG1hX3hmZXJfbGVuKGluc3RhbmNlLGNtZCxwaGFzZSkpID4gU1VOM19ETUFfTUlOU0laRSkgeworCQkgICAgbGVuID0gdHJhbnNmZXJzaXplOworCQkgICAgY21kLT5TQ3AucGhhc2UgPSBwaGFzZTsKKworCQkgICAgaWYgKE5DUjUzODBfdHJhbnNmZXJfZG1hKGluc3RhbmNlLCAmcGhhc2UsCisJCQkmbGVuLCAodW5zaWduZWQgY2hhciAqKikgJmNtZC0+U0NwLnB0cikpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgd2F0Y2hkb2cgdGltZXIgZmlyZXMsIGFsbCBmdXR1cmUKKwkJCSAqIGFjY2Vzc2VzIHRvIHRoaXMgZGV2aWNlIHdpbGwgdXNlIHRoZQorCQkJICogcG9sbGVkLUlPLiAqLyAKKwkJCXByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiBzd2l0Y2hpbmcgdGFyZ2V0ICVkICIKKwkJCSAgICAgICAibHVuICVkIHRvIHNsb3cgaGFuZHNoYWtlXG4iLCBIT1NUTk8sCisJCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCWNtZC0+ZGV2aWNlLT5ib3JrZW4gPSAxOworCQkJTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgCisJCQkgICAgSUNSX0FTU0VSVF9BVE4pOworCQkJc2luayA9IDE7CisJCQlkb19hYm9ydChpbnN0YW5jZSk7CisJCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiAgPDwgMTY7CisJCQljbWQtPmRvbmUoY21kKTsKKwkJCS8qIFhYWCAtIG5lZWQgdG8gc291cmNlIG9yIHNpbmsgZGF0YSBoZXJlLCBhcyBhcHByb3ByaWF0ZSAqLworCQkgICAgfSBlbHNlIHsKKyNpZmRlZiBSRUFMX0RNQQorCQkJLyogKytyb21hbjogV2hlbiB1c2luZyByZWFsIERNQSwKKwkJCSAqIGluZm9ybWF0aW9uX3RyYW5zZmVyKCkgc2hvdWxkIHJldHVybiBhZnRlcgorCQkJICogc3RhcnRpbmcgRE1BIHNpbmNlIGl0IGhhcyBub3RoaW5nIG1vcmUgdG8KKwkJCSAqIGRvLgorCQkJICovCisJCQkJICAgIHJldHVybjsKKyNlbHNlCQkJCisJCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC09IHRyYW5zZmVyc2l6ZSAtIGxlbjsKKyNlbmRpZgorCQkgICAgfQorCQl9IGVsc2UgCisjZW5kaWYgLyogZGVmaW5lZChSRUFMX0RNQSkgKi8KKwkJICBOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAKKwkJICAgIChpbnQgKikgJmNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsICh1bnNpZ25lZCBjaGFyICoqKQorCQkgICAgJmNtZC0+U0NwLnB0cik7CisjaWZkZWYgUkVBTF9ETUEKKwkJLyogaWYgd2UgaGFkIGludGVuZGVkIHRvIGRtYSB0aGF0IGNvbW1hbmQgY2xlYXIgaXQgKi8KKwkJaWYoc3VuM19kbWFfc2V0dXBfZG9uZSA9PSBjbWQpCisJCQlzdW4zX2RtYV9zZXR1cF9kb25lID0gTlVMTDsKKyNlbmRpZgorCisJCWJyZWFrOworCSAgICBjYXNlIFBIQVNFX01TR0lOOgorCQlsZW4gPSAxOworCQlkYXRhID0gJnRtcDsKKwkJTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgMCk7IAkvKiBkaXNhYmxlIHJlc2VsZWN0cyAqLworCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCWNtZC0+U0NwLk1lc3NhZ2UgPSB0bXA7CisJCQorCQlzd2l0Y2ggKHRtcCkgeworCQkvKgorCQkgKiBMaW5raW5nIGxldHMgdXMgcmVkdWNlIHRoZSB0aW1lIHJlcXVpcmVkIHRvIGdldCB0aGUgCisJCSAqIG5leHQgY29tbWFuZCBvdXQgdG8gdGhlIGRldmljZSwgaG9wZWZ1bGx5IHRoaXMgd2lsbAorCQkgKiBtZWFuIHdlIGRvbid0IHdhc3RlIGFub3RoZXIgcmV2b2x1dGlvbiBkdWUgdG8gdGhlIGRlbGF5cworCQkgKiByZXF1aXJlZCBieSBBUkJJVFJBVElPTiBhbmQgYW5vdGhlciBTRUxFQ1RJT04uCisJCSAqCisJCSAqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHByb3Bvc2FsLCBsb3cgbGV2ZWwgZHJpdmVycworCQkgKiBtZXJlbHkgaGF2ZSB0byBzdGFydCB0aGUgbmV4dCBjb21tYW5kLCBwb2ludGVkIHRvIGJ5IAorCQkgKiBuZXh0X2xpbmssIGRvbmUoKSBpcyBjYWxsZWQgYXMgd2l0aCB1bmxpbmtlZCBjb21tYW5kcy4KKwkJICovCisjaWZkZWYgTElOS0VECisJCWNhc2UgTElOS0VEX0NNRF9DT01QTEVURToKKwkJY2FzZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURToKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIAorCQkgICAgTE5LX1BSSU5USygic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkIGxpbmtlZCBjb21tYW5kICIKKwkJCSAgICAgICAiY29tcGxldGUuXG4iLCBIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisKKwkJICAgIC8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICAvKgorCQkgICAgICogU2FuaXR5IGNoZWNrIDogQSBsaW5rZWQgY29tbWFuZCBzaG91bGQgb25seSB0ZXJtaW5hdGUKKwkJICAgICAqIHdpdGggb25lIG9mIHRoZXNlIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBtb3JlIGxpbmtlZAorCQkgICAgICogY29tbWFuZHMgYXZhaWxhYmxlLgorCQkgICAgICovCisKKwkJICAgIGlmICghY21kLT5uZXh0X2xpbmspIHsKKwkJCSBwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCAiCisJCQkJImxpbmtlZCBjb21tYW5kIGNvbXBsZXRlLCBubyBuZXh0X2xpbmtcbiIsCisJCQkJSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJICAgIHNpbmsgPSAxOworCQkJICAgIGRvX2Fib3J0IChpbnN0YW5jZSk7CisJCQkgICAgcmV0dXJuOworCQkgICAgfQorCisJCSAgICBpbml0aWFsaXplX1NDcChjbWQtPm5leHRfbGluayk7CisJCSAgICAvKiBUaGUgbmV4dCBjb21tYW5kIGlzIHN0aWxsIHBhcnQgb2YgdGhpcyBwcm9jZXNzOyBjb3B5IGl0CisJCSAgICAgKiBhbmQgZG9uJ3QgZnJlZSBpdCEgKi8KKwkJICAgIGNtZC0+bmV4dF9saW5rLT50YWcgPSBjbWQtPnRhZzsKKwkJICAgIGNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7IAorCQkgICAgTE5LX1BSSU5USygic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkIGxpbmtlZCByZXF1ZXN0ICIKKwkJCSAgICAgICAiZG9uZSwgY2FsbGluZyBzY3NpX2RvbmUoKS5cbiIsCisJCQkgICAgICAgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworI2lmZGVmIE5DUjUzODBfU1RBVFMKKwkJICAgIGNvbGxlY3Rfc3RhdHMoaG9zdGRhdGEsIGNtZCk7CisjZW5kaWYKKwkJICAgIGNtZC0+c2NzaV9kb25lKGNtZCk7CisJCSAgICBjbWQgPSBob3N0ZGF0YS0+Y29ubmVjdGVkOworCQkgICAgYnJlYWs7CisjZW5kaWYgLyogZGVmIExJTktFRCAqLworCQljYXNlIEFCT1JUOgorCQljYXNlIENPTU1BTkRfQ09NUExFVEU6IAorCQkgICAgLyogQWNjZXB0IG1lc3NhZ2UgYnkgY2xlYXJpbmcgQUNLICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCQkgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCSAgICBRVV9QUklOVEsoInNjc2klZDogY29tbWFuZCBmb3IgdGFyZ2V0ICVkLCBsdW4gJWQgIgorCQkJICAgICAgImNvbXBsZXRlZFxuIiwgSE9TVE5PLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2ZyZWVfdGFnKCBjbWQgKTsKKwkJICAgIGlmIChzdGF0dXNfYnl0ZShjbWQtPlNDcC5TdGF0dXMpID09IFFVRVVFX0ZVTEwpIHsKKwkJCS8qIFR1cm4gYSBRVUVVRSBGVUxMIHN0YXR1cyBpbnRvIEJVU1ksIEkgdGhpbmsgdGhlCisJCQkgKiBtaWQgbGV2ZWwgY2Fubm90IGhhbmRsZSBRVUVVRSBGVUxMIDotKCAoVGhlCisJCQkgKiBjb21tYW5kIGlzIHJldHJpZWQgYWZ0ZXIgQlVTWSkuIEFsc28gdXBkYXRlIG91cgorCQkJICogcXVldWUgc2l6ZSB0byB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBpc3N1ZWQKKwkJCSAqIGNvbW1hbmRzIG5vdy4KKwkJCSAqLworCQkJLyogKytBbmRyZWFzOiB0aGUgbWlkIGxldmVsIGNvZGUga25vd3MgYWJvdXQKKwkJCSAgIFFVRVVFX0ZVTEwgbm93LiAqLworCQkJVEFHX0FMTE9DICp0YSA9ICZUYWdBbGxvY1tjbWQtPmRldmljZS0+aWRdW2NtZC0+ZGV2aWNlLT5sdW5dOworCQkJVEFHX1BSSU5USygic2NzaSVkOiB0YXJnZXQgJWQgbHVuICVkIHJldHVybmVkICIKKwkJCQkgICAiUVVFVUVfRlVMTCBhZnRlciAlZCBjb21tYW5kc1xuIiwKKwkJCQkgICBIT1NUTk8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkgICB0YS0+bnJfYWxsb2NhdGVkKTsKKwkJCWlmICh0YS0+cXVldWVfc2l6ZSA+IHRhLT5ucl9hbGxvY2F0ZWQpCisJCQkgICAgdGEtPm5yX2FsbG9jYXRlZCA9IHRhLT5xdWV1ZV9zaXplOworCQkgICAgfQorI2Vsc2UKKwkJICAgIGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworI2VuZGlmCisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCisJCSAgICAvKiAKKwkJICAgICAqIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGhlcmUgaXMgOiAKKwkJICAgICAqIAorCQkgICAgICogSWYgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGV4ZWN1dGVkIGlzIE5PVCBhIHJlcXVlc3QgCisJCSAgICAgKiBzZW5zZSwgdGhlIG9idmlvdXMgdGhpbmcgdG8gZG8gaXMgdG8gc2V0IHRoZSByZXN1bHQKKwkJICAgICAqIGNvZGUgdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3RvcmVkIHBhcmFtZXRlcnMuCisJCSAgICAgKiAKKwkJICAgICAqIElmIGl0IHdhcyBhIFJFUVVFU1QgU0VOU0UgY29tbWFuZCwgd2UgbmVlZCBzb21lIHdheSB0bworCQkgICAgICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBmYWlsdXJlIGNvZGUgb2YgdGhlIG9yaWdpbmFsCisJCSAgICAgKiBhbmQgdGhlIGZhaWx1cmUgY29kZSBvZiB0aGUgUkVRVUVTVCBzZW5zZSAtIHRoZSBvYnZpb3VzCisJCSAgICAgKiBjYXNlIGlzIHN1Y2Nlc3MsIHdoZXJlIHdlIGZhbGwgdGhyb3VnaCBhbmQgbGVhdmUgdGhlCisJCSAgICAgKiByZXN1bHQgY29kZSB1bmNoYW5nZWQuCisJCSAgICAgKiAKKwkJICAgICAqIFRoZSBub24tb2J2aW91cyBwbGFjZSBpcyB3aGVyZSB0aGUgUkVRVUVTVCBTRU5TRSBmYWlsZWQKKwkJICAgICAqLworCisJCSAgICBpZiAoY21kLT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UpIAorCQkJY21kLT5yZXN1bHQgPSBjbWQtPlNDcC5TdGF0dXMgfCAoY21kLT5TQ3AuTWVzc2FnZSA8PCA4KTsgCisJCSAgICBlbHNlIGlmIChzdGF0dXNfYnl0ZShjbWQtPlNDcC5TdGF0dXMpICE9IEdPT0QpCisJCQljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOworCQkgICAgCisjaWZkZWYgQVVUT1NFTlNFCisJCSAgICBpZiAoKGNtZC0+Y21uZFswXSAhPSBSRVFVRVNUX1NFTlNFKSAmJiAKKwkJCShzdGF0dXNfYnl0ZShjbWQtPlNDcC5TdGF0dXMpID09IENIRUNLX0NPTkRJVElPTikpIHsKKwkJCUFTRU5fUFJJTlRLKCJzY3NpJWQ6IHBlcmZvcm1pbmcgcmVxdWVzdCBzZW5zZVxuIiwKKwkJCQkgICAgSE9TVE5PKTsKKwkJCWNtZC0+Y21uZFswXSA9IFJFUVVFU1RfU0VOU0U7CisJCQljbWQtPmNtbmRbMV0gJj0gMHhlMDsKKwkJCWNtZC0+Y21uZFsyXSA9IDA7CisJCQljbWQtPmNtbmRbM10gPSAwOworCQkJY21kLT5jbW5kWzRdID0gc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKTsKKwkJCWNtZC0+Y21uZFs1XSA9IDA7CisJCQljbWQtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoY21kLT5jbW5kWzBdKTsKKworCQkJY21kLT51c2Vfc2cgPSAwOworCQkJLyogdGhpcyBpcyBpbml0aWFsaXplZCBmcm9tIGluaXRpYWxpemVfU0NwIAorCQkJY21kLT5TQ3AuYnVmZmVyID0gTlVMTDsKKwkJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQkJKi8KKwkJCWNtZC0+cmVxdWVzdF9idWZmZXIgPSAoY2hhciAqKSBjbWQtPnNlbnNlX2J1ZmZlcjsKKwkJCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKTsKKworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJTElTVChjbWQsaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKTsKKwkJCU5FWFQoY21kKSA9IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwkJICAgICAgICBob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSAoU2NzaV9DbW5kICopIGNtZDsKKwkJICAgICAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlRVV9QUklOVEsoInNjc2klZDogUkVRVUVTVCBTRU5TRSBhZGRlZCB0byBoZWFkIG9mICIKKwkJCQkgICJpc3N1ZSBxdWV1ZVxuIiwgSF9OTyhjbWQpKTsKKwkJICAgfSBlbHNlCisjZW5kaWYgLyogZGVmIEFVVE9TRU5TRSAqLworCQkgICB7CisjaWZkZWYgTkNSNTM4MF9TVEFUUworCQkgICAgICAgY29sbGVjdF9zdGF0cyhob3N0ZGF0YSwgY21kKTsKKyNlbmRpZgorCQkgICAgICAgY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJICAgIH0KKworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgLyogCisJCSAgICAgKiBSZXN0b3JlIHBoYXNlIGJpdHMgdG8gMCBzbyBhbiBpbnRlcnJ1cHRlZCBzZWxlY3Rpb24sIAorCQkgICAgICogYXJiaXRyYXRpb24gY2FuIHJlc3VtZS4KKwkJICAgICAqLworCQkgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCQkgICAgCisJCSAgICB3aGlsZSAoKE5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSAmIFNSX0JTWSkgJiYgIWhvc3RkYXRhLT5jb25uZWN0ZWQpCisJCQliYXJyaWVyKCk7CisKKwkJICAgIHJldHVybjsKKwkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIC8qIEVuYWJsZSByZXNlbGVjdCBpbnRlcnJ1cHRzICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKFNFTEVDVF9FTkFCTEVfUkVHLCBob3N0ZGF0YS0+aWRfbWFzayk7CisJCSAgICBzd2l0Y2ggKGhvc3RkYXRhLT5sYXN0X21lc3NhZ2UpIHsKKwkJICAgIGNhc2UgSEVBRF9PRl9RVUVVRV9UQUc6CisJCSAgICBjYXNlIE9SREVSRURfUVVFVUVfVEFHOgorCQkgICAgY2FzZSBTSU1QTEVfUVVFVUVfVEFHOgorCQkJLyogVGhlIHRhcmdldCBvYnZpb3VzbHkgZG9lc24ndCBzdXBwb3J0IHRhZ2dlZAorCQkJICogcXVldWluZywgZXZlbiB0aG91Z2ggaXQgYW5ub3VuY2VkIHRoaXMgYWJpbGl0eSBpbgorCQkJICogaXRzIElOUVVJUlkgZGF0YSA/IT8gKG1heWJlIG9ubHkgdGhpcyBMVU4/KSBPaywKKwkJCSAqIGNsZWFyICd0YWdnZWRfc3VwcG9ydGVkJyBhbmQgbG9jayB0aGUgTFVOLCBzaW5jZQorCQkJICogdGhlIGNvbW1hbmQgaXMgdHJlYXRlZCBhcyB1bnRhZ2dlZCBmdXJ0aGVyIG9uLgorCQkJICovCisJCQljbWQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA9IDA7CisJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJY21kLT50YWcgPSBUQUdfTk9ORTsKKwkJCVRBR19QUklOVEsoInNjc2klZDogdGFyZ2V0ICVkIGx1biAlZCByZWplY3RlZCAiCisJCQkJICAgIlFVRVVFX1RBRyBtZXNzYWdlOyB0YWdnZWQgcXVldWluZyAiCisJCQkJICAgImRpc2FibGVkXG4iLAorCQkJCSAgIEhPU1ROTywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgRElTQ09OTkVDVDoKKwkJICAgIC8qIEFjY2VwdCBtZXNzYWdlIGJ5IGNsZWFyaW5nIEFDSyAqLworCQkgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFKTsKKwkJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJICAgIGNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ID0gMTsKKwkJICAgIExJU1QoY21kLGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpOworCQkgICAgTkVYVChjbWQpID0gaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IGNtZDsKKwkJICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJICAgIFFVX1BSSU5USygic2NzaSVkOiBjb21tYW5kIGZvciB0YXJnZXQgJWQgbHVuICVkIHdhcyAiCisJCQkgICAgICAibW92ZWQgZnJvbSBjb25uZWN0ZWQgdG8gdGhlICIKKwkJCSAgICAgICJkaXNjb25uZWN0ZWRfcXVldWVcbiIsIEhPU1ROTywgCisJCQkgICAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4pOworCQkgICAgLyogCisJCSAgICAgKiBSZXN0b3JlIHBoYXNlIGJpdHMgdG8gMCBzbyBhbiBpbnRlcnJ1cHRlZCBzZWxlY3Rpb24sIAorCQkgICAgICogYXJiaXRyYXRpb24gY2FuIHJlc3VtZS4KKwkJICAgICAqLworCQkgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIDApOworCisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgLyogV2FpdCBmb3IgYnVzIGZyZWUgdG8gYXZvaWQgbmFzdHkgdGltZW91dHMgKi8KKwkJICAgIHdoaWxlICgoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfQlNZKSAmJiAhaG9zdGRhdGEtPmNvbm5lY3RlZCkKKwkJICAgIAliYXJyaWVyKCk7CisjaWZkZWYgU1VOM19TQ1NJX1ZNRQorCQkgICAgZHJlZ3MtPmNzciB8PSBDU1JfRE1BX0VOQUJMRTsKKyNlbmRpZgorCQkgICAgcmV0dXJuOworCQkvKiAKKwkJICogVGhlIFNDU0kgZGF0YSBwb2ludGVyIGlzICpJTVBMSUNJVExZKiBzYXZlZCBvbiBhIGRpc2Nvbm5lY3QKKwkJICogb3BlcmF0aW9uLCBpbiB2aW9sYXRpb24gb2YgdGhlIFNDU0kgc3BlYyBzbyB3ZSBjYW4gc2FmZWx5IAorCQkgKiBpZ25vcmUgU0FWRS9SRVNUT1JFIHBvaW50ZXJzIGNhbGxzLgorCQkgKgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBzb21lIGRpc2tzIHZpb2xhdGUgdGhlIFNDU0kgc3BlYyBhbmQgCisJCSAqIGRvbid0IGlzc3VlIHRoZSByZXF1aXJlZCBTQVZFX1BPSU5URVJTIG1lc3NhZ2UgYmVmb3JlCisJCSAqIGRpc2Nvbm5lY3RpbmcsIGFuZCB3ZSBoYXZlIHRvIGJyZWFrIHNwZWMgdG8gcmVtYWluIAorCQkgKiBjb21wYXRpYmxlLgorCQkgKi8KKwkJY2FzZSBTQVZFX1BPSU5URVJTOgorCQljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCSAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCSAgICAvKiBFbmFibGUgcmVzZWxlY3QgaW50ZXJydXB0cyAqLworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgYnJlYWs7CisJCWNhc2UgRVhURU5ERURfTUVTU0FHRToKKy8qIAorICogRXh0ZW5kZWQgbWVzc2FnZXMgYXJlIHNlbnQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQgOgorICogQnl0ZSAJCisgKiAwCQlFWFRFTkRFRF9NRVNTQUdFID09IDEKKyAqIDEJCWxlbmd0aCAoaW5jbHVkZXMgb25lIGJ5dGUgZm9yIGNvZGUsIGRvZXNuJ3QgCisgKgkJaW5jbHVkZSBmaXJzdCB0d28gYnl0ZXMpCisgKiAyIAkJY29kZQorICogMy4ubGVuZ3RoKzEJYXJndW1lbnRzCisgKgorICogU3RhcnQgdGhlIGV4dGVuZGVkIG1lc3NhZ2UgYnVmZmVyIHdpdGggdGhlIEVYVEVOREVEX01FU1NBR0UKKyAqIGJ5dGUsIHNpbmNlIHByaW50X21zZygpIHdhbnRzIHRoZSB3aG9sZSB0aGluZy4gIAorICovCisJCSAgICBleHRlbmRlZF9tc2dbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCQkgICAgLyogQWNjZXB0IGZpcnN0IGJ5dGUgYnkgY2xlYXJpbmcgQUNLICovCisJCSAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisJCSAgICBFWFRfUFJJTlRLKCJzY3NpJWQ6IHJlY2VpdmluZyBleHRlbmRlZCBtZXNzYWdlXG4iLCBIT1NUTk8pOworCisJCSAgICBsZW4gPSAyOworCQkgICAgZGF0YSA9IGV4dGVuZGVkX21zZyArIDE7CisJCSAgICBwaGFzZSA9IFBIQVNFX01TR0lOOworCQkgICAgTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgJmRhdGEpOworCQkgICAgRVhUX1BSSU5USygic2NzaSVkOiBsZW5ndGg9JWQsIGNvZGU9MHglMDJ4XG4iLCBIT1NUTk8sCisJCQkgICAgICAgKGludClleHRlbmRlZF9tc2dbMV0sIChpbnQpZXh0ZW5kZWRfbXNnWzJdKTsKKworCQkgICAgaWYgKCFsZW4gJiYgZXh0ZW5kZWRfbXNnWzFdIDw9IAorCQkJKHNpemVvZiAoZXh0ZW5kZWRfbXNnKSAtIDEpKSB7CisJCQkvKiBBY2NlcHQgdGhpcmQgYnl0ZSBieSBjbGVhcmluZyBBQ0sgKi8KKwkJCU5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisJCQlsZW4gPSBleHRlbmRlZF9tc2dbMV0gLSAxOworCQkJZGF0YSA9IGV4dGVuZGVkX21zZyArIDM7CisJCQlwaGFzZSA9IFBIQVNFX01TR0lOOworCisJCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSk7CisJCQlFWFRfUFJJTlRLKCJzY3NpJWQ6IG1lc3NhZ2UgcmVjZWl2ZWQsIHJlc2lkdWFsICVkXG4iLAorCQkJCSAgIEhPU1ROTywgbGVuKTsKKworCQkJc3dpdGNoIChleHRlbmRlZF9tc2dbMl0pIHsKKwkJCWNhc2UgRVhURU5ERURfU0RUUjoKKwkJCWNhc2UgRVhURU5ERURfV0RUUjoKKwkJCWNhc2UgRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUjoKKwkJCWNhc2UgRVhURU5ERURfRVhURU5ERURfSURFTlRJRlk6CisJCQkgICAgdG1wID0gMDsKKwkJCX0KKwkJICAgIH0gZWxzZSBpZiAobGVuKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogZXJyb3IgcmVjZWl2aW5nICIKKwkJCSAgICAgICAiZXh0ZW5kZWQgbWVzc2FnZVxuIiwgSE9TVE5PKTsKKwkJCXRtcCA9IDA7CisJCSAgICB9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJzY3NpJWQ6IGV4dGVuZGVkIG1lc3NhZ2UgIgorCQkJICAgICAgICJjb2RlICUwMnggbGVuZ3RoICVkIGlzIHRvbyBsb25nXG4iLAorCQkJICAgICAgIEhPU1ROTywgZXh0ZW5kZWRfbXNnWzJdLCBleHRlbmRlZF9tc2dbMV0pOworCQkJdG1wID0gMDsKKwkJICAgIH0KKwkJLyogRmFsbCB0aHJvdWdoIHRvIHJlamVjdCBtZXNzYWdlICovCisKKwkJLyogCisgIAkJICogSWYgd2UgZ2V0IHNvbWV0aGluZyB3ZWlyZCB0aGF0IHdlIGFyZW4ndCBleHBlY3RpbmcsIAorIAkJICogcmVqZWN0IGl0LgorCQkgKi8KKwkJZGVmYXVsdDoKKwkJICAgIGlmICghdG1wKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiByZWplY3RpbmcgbWVzc2FnZSAiLCBIT1NUTk8pOworCQkJcHJpbnRfbXNnIChleHRlbmRlZF9tc2cpOworCQkJcHJpbnRrKCJcbiIpOworCQkgICAgfSBlbHNlIGlmICh0bXAgIT0gRVhURU5ERURfTUVTU0FHRSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IHJlamVjdGluZyB1bmtub3duICIKKwkJCSAgICAgICAibWVzc2FnZSAlMDJ4IGZyb20gdGFyZ2V0ICVkLCBsdW4gJWRcbiIsCisJCQkgICAgICAgSE9TVE5PLCB0bXAsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisJCSAgICBlbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiByZWplY3RpbmcgdW5rbm93biAiCisJCQkgICAgICAgImV4dGVuZGVkIG1lc3NhZ2UgIgorCQkJICAgICAgICJjb2RlICUwMngsIGxlbmd0aCAlZCBmcm9tIHRhcmdldCAlZCwgbHVuICVkXG4iLAorCQkJICAgICAgIEhPU1ROTywgZXh0ZW5kZWRfbXNnWzFdLCBleHRlbmRlZF9tc2dbMF0sCisJCQkgICAgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKKyAgIAorCisJCSAgICBtc2dvdXQgPSBNRVNTQUdFX1JFSkVDVDsKKwkJICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IAorCQkJSUNSX0FTU0VSVF9BVE4pOworCQkgICAgYnJlYWs7CisJCX0gLyogc3dpdGNoICh0bXApICovCisJCWJyZWFrOworCSAgICBjYXNlIFBIQVNFX01TR09VVDoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZtc2dvdXQ7CisJCWhvc3RkYXRhLT5sYXN0X21lc3NhZ2UgPSBtc2dvdXQ7CisJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJaWYgKG1zZ291dCA9PSBBQk9SVCkgeworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2ZyZWVfdGFnKCBjbWQgKTsKKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCSAgICBjbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKyNpZmRlZiBOQ1I1MzgwX1NUQVRTCisJCSAgICBjb2xsZWN0X3N0YXRzKGhvc3RkYXRhLCBjbWQpOworI2VuZGlmCisJCSAgICBjbWQtPnNjc2lfZG9uZShjbWQpOworCQkgICAgTkNSNTM4MF93cml0ZShTRUxFQ1RfRU5BQkxFX1JFRywgaG9zdGRhdGEtPmlkX21hc2spOworCQkgICAgcmV0dXJuOworCQl9CisJCW1zZ291dCA9IE5PUDsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEhBU0VfQ01ET1VUOgorCQlsZW4gPSBjbWQtPmNtZF9sZW47CisJCWRhdGEgPSBjbWQtPmNtbmQ7CisJCS8qIAorCQkgKiBYWFggZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIG9uIG1hY2hpbmVzIHdpdGggYSAKKwkJICogUFNFVURPLURNQSBhcmNoaXRlY3R1cmUgd2Ugc2hvdWxkIHByb2JhYmx5IAorCQkgKiB1c2UgdGhlIGRtYSB0cmFuc2ZlciBmdW5jdGlvbi4gIAorCQkgKi8KKwkJTkNSNTM4MF90cmFuc2Zlcl9waW8oaW5zdGFuY2UsICZwaGFzZSwgJmxlbiwgCisJCSAgICAmZGF0YSk7CisJCWJyZWFrOworCSAgICBjYXNlIFBIQVNFX1NUQVRJTjoKKwkJbGVuID0gMTsKKwkJZGF0YSA9ICZ0bXA7CisJCU5DUjUzODBfdHJhbnNmZXJfcGlvKGluc3RhbmNlLCAmcGhhc2UsICZsZW4sICZkYXRhKTsKKwkJY21kLT5TQ3AuU3RhdHVzID0gdG1wOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcHJpbnRrKCJzY3NpJWQ6IHVua25vd24gcGhhc2VcbiIsIEhPU1ROTyk7CisJCU5DUl9QUklOVChOREVCVUdfQU5ZKTsKKwkgICAgfSAvKiBzd2l0Y2gocGhhc2UpICovCisJfSAvKiBpZiAodG1wICogU1JfUkVRKSAqLyAKKyAgICB9IC8qIHdoaWxlICgxKSAqLworfQorCisvKgorICogRnVuY3Rpb24gOiB2b2lkIE5DUjUzODBfcmVzZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQorICoKKyAqIFB1cnBvc2UgOiBkb2VzIHJlc2VsZWN0aW9uLCBpbml0aWFsaXppbmcgdGhlIGluc3RhbmNlLT5jb25uZWN0ZWQgCisgKglmaWVsZCB0byBwb2ludCB0byB0aGUgU2NzaV9DbW5kIGZvciB3aGljaCB0aGUgSV9UX0wgb3IgSV9UX0xfUSAKKyAqCW5leHVzIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQsCisgKgkKKyAqIElucHV0cyA6IGluc3RhbmNlIC0gdGhpcyBpbnN0YW5jZSBvZiB0aGUgTkNSNTM4MC4KKyAqCisgKi8KKworLyogaXQgbWlnaHQgZXZlbnR1YWxseSBwcm92ZSBuZWNlc3NhcnkgdG8gZG8gYSBkbWEgc2V0dXAgb24KKyAgIHJlc2VsZWN0aW9uLCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIG5lZWRlZCBub3cgLS0gc2FtICovCisKK3N0YXRpYyB2b2lkIE5DUjUzODBfcmVzZWxlY3QgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKKyAgICB1bnNpZ25lZCBjaGFyIHRhcmdldF9tYXNrOworICAgIHVuc2lnbmVkIGNoYXIgbHVuOworI2lmZGVmIFNVUFBPUlRfVEFHUworICAgIHVuc2lnbmVkIGNoYXIgdGFnOworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhciBtc2dbM107CisgICAgU2NzaV9DbW5kICp0bXAgPSBOVUxMLCAqcHJldjsKKy8qICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCisKKyAgICAvKgorICAgICAqIERpc2FibGUgYXJiaXRyYXRpb24sIGV0Yy4gc2luY2UgdGhlIGhvc3QgYWRhcHRlciBvYnZpb3VzbHkKKyAgICAgKiBsb3N0LCBhbmQgdGVsbCBhbiBpbnRlcnJ1cHRlZCBOQ1I1MzgwX3NlbGVjdCgpIHRvIHJlc3RhcnQuCisgICAgICovCisKKyAgICBOQ1I1MzgwX3dyaXRlKE1PREVfUkVHLCBNUl9CQVNFKTsKKyAgICBob3N0ZGF0YS0+cmVzdGFydF9zZWxlY3QgPSAxOworCisgICAgdGFyZ2V0X21hc2sgPSBOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKSAmIH4oaG9zdGRhdGEtPmlkX21hc2spOworCisgICAgUlNMX1BSSU5USygic2NzaSVkOiByZXNlbGVjdFxuIiwgSE9TVE5PKTsKKworICAgIC8qIAorICAgICAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCBvdXIgU0NTSSBJRCBpcyBvbiB0aGUgYnVzLAorICAgICAqIFNFTCBpcyB0cnVlIGFuZCBCU1kgd2FzIGZhbHNlIGZvciBhdCBsZWFzdCBvbmUgYnVzIHNldHRsZSBkZWxheQorICAgICAqICg0MDAgbnMpLgorICAgICAqCisgICAgICogV2UgbXVzdCBhc3NlcnQgQlNZIG91cnNlbHZlcywgdW50aWwgdGhlIHRhcmdldCBkcm9wcyB0aGUgU0VMCisgICAgICogc2lnbmFsLgorICAgICAqLworCisgICAgTkNSNTM4MF93cml0ZShJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFIHwgSUNSX0FTU0VSVF9CU1kpOworICAgIAorICAgIHdoaWxlIChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiBTUl9TRUwpOworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSk7CisKKyAgICAvKgorICAgICAqIFdhaXQgZm9yIHRhcmdldCB0byBnbyBpbnRvIE1TR0lOLgorICAgICAqLworCisgICAgd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFNUQVRVU19SRUcpICYgU1JfUkVRKSk7CisKKyNpZiAxCisgICAgLy8gYWNrbm93bGVkZ2UgdG9nZ2xlIHRvIE1TR0lOCisgICAgTkNSNTM4MF93cml0ZShUQVJHRVRfQ09NTUFORF9SRUcsIFBIQVNFX1NSX1RPX1RDUihQSEFTRV9NU0dJTikpOworCisgICAgLy8gcGVlayBhdCB0aGUgYnl0ZSB3aXRob3V0IHJlYWxseSBoaXR0aW5nIHRoZSBidXMKKyAgICBtc2dbMF0gPSBOQ1I1MzgwX3JlYWQoQ1VSUkVOVF9TQ1NJX0RBVEFfUkVHKTsKKyNlbmRpZgorCisgICAgaWYgKCEobXNnWzBdICYgMHg4MCkpIHsKKwlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiBleHBlY3RpbmcgSURFTlRJRlkgbWVzc2FnZSwgZ290ICIsIEhPU1ROTyk7CisJcHJpbnRfbXNnKG1zZyk7CisJZG9fYWJvcnQoaW5zdGFuY2UpOworCXJldHVybjsKKyAgICB9CisgICAgbHVuID0gKG1zZ1swXSAmIDB4MDcpOworCisgICAgLyogCisgICAgICogRmluZCB0aGUgY29tbWFuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBJX1RfTCBvciBJX1RfTF9RICBuZXh1cyB3ZSAKKyAgICAgKiBqdXN0IHJlZXN0YWJsaXNoZWQsIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgorICAgICAqLworCisgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUsIHByZXYgPSBOVUxMOyAKKwkgdG1wOyBwcmV2ID0gdG1wLCB0bXAgPSBORVhUKHRtcCkgKSB7CisJaWYgKCh0YXJnZXRfbWFzayA9PSAoMSA8PCB0bXAtPmRldmljZS0+aWQpKSAmJiAobHVuID09IHRtcC0+ZGV2aWNlLT5sdW4pCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJICAgICYmICh0YWcgPT0gdG1wLT50YWcpIAorI2VuZGlmCisJICAgICkgeworCSAgICBpZiAocHJldikgeworCQlSRU1PVkUocHJldiwgTkVYVChwcmV2KSwgdG1wLCBORVhUKHRtcCkpOworCQlORVhUKHByZXYpID0gTkVYVCh0bXApOworCSAgICB9IGVsc2UgeworCQlSRU1PVkUoLTEsIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUsIHRtcCwgTkVYVCh0bXApKTsKKwkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5FWFQodG1wKTsKKwkgICAgfQorCSAgICBORVhUKHRtcCkgPSBOVUxMOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIAorICAgIGlmICghdG1wKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkOiB3YXJuaW5nOiB0YXJnZXQgYml0bWFzayAlMDJ4IGx1biAlZCAiCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJCSJ0YWcgJWQgIgorI2VuZGlmCisJCSJub3QgaW4gZGlzY29ubmVjdGVkX3F1ZXVlLlxuIiwKKwkJSE9TVE5PLCB0YXJnZXRfbWFzaywgbHVuCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJCSwgdGFnCisjZW5kaWYKKwkJKTsKKwkvKiAKKwkgKiBTaW5jZSB3ZSBoYXZlIGFuIGVzdGFibGlzaGVkIG5leHVzIHRoYXQgd2UgY2FuJ3QgZG8gYW55dGhpbmcKKwkgKiB3aXRoLCB3ZSBtdXN0IGFib3J0IGl0LiAgCisJICovCisJZG9fYWJvcnQoaW5zdGFuY2UpOworCXJldHVybjsKKyAgICB9CisjaWYgMQorICAgIC8qIGVuZ2FnZSBkbWEgc2V0dXAgZm9yIHRoZSBjb21tYW5kIHdlIGp1c3Qgc2F3ICovCisgICAgeworCSAgICB2b2lkICpkOworCSAgICB1bnNpZ25lZCBsb25nIGNvdW50OworCisJICAgIGlmICghdG1wLT5TQ3AudGhpc19yZXNpZHVhbCAmJiB0bXAtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7CisJCSAgICBjb3VudCA9IHRtcC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkgICAgZCA9IFNHQUREUih0bXAtPlNDcC5idWZmZXIpOworCSAgICB9IGVsc2UgeworCQkgICAgY291bnQgPSB0bXAtPlNDcC50aGlzX3Jlc2lkdWFsOworCQkgICAgZCA9IHRtcC0+U0NwLnB0cjsKKwkgICAgfQorI2lmZGVmIFJFQUxfRE1BCisJICAgIC8qIHNldHVwIHRoaXMgY29tbWFuZCBmb3IgZG1hIGlmIG5vdCBhbHJlYWR5ICovCisJICAgIGlmKChjb3VudCA+IFNVTjNfRE1BX01JTlNJWkUpICYmIChzdW4zX2RtYV9zZXR1cF9kb25lICE9IHRtcCkpCisJICAgIHsKKwkJICAgIHN1bjNzY3NpX2RtYV9zZXR1cChkLCBjb3VudCwgcnFfZGF0YV9kaXIodG1wLT5yZXF1ZXN0KSk7CisJCSAgICBzdW4zX2RtYV9zZXR1cF9kb25lID0gdG1wOworCSAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIE5DUjUzODBfd3JpdGUoSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfQUNLKTsKKyAgICAvKiBBY2NlcHQgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UpOworCisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgLyogSWYgdGhlIHBoYXNlIGlzIHN0aWxsIE1TR0lOLCB0aGUgdGFyZ2V0IHdhbnRzIHRvIHNlbmQgc29tZSBtb3JlCisgICAgICogbWVzc2FnZXMuIEluIGNhc2UgaXQgc3VwcG9ydHMgdGFnZ2VkIHF1ZXVpbmcsIHRoaXMgaXMgcHJvYmFibHkgYQorICAgICAqIFNJTVBMRV9RVUVVRV9UQUcgZm9yIHRoZSBJX1RfTF9RIG5leHVzLgorICAgICAqLworICAgIHRhZyA9IFRBR19OT05FOworICAgIGlmIChwaGFzZSA9PSBQSEFTRV9NU0dJTiAmJiBzZXR1cF91c2VfdGFnZ2VkX3F1ZXVpbmcpIHsKKwkvKiBBY2NlcHQgcHJldmlvdXMgSURFTlRJRlkgbWVzc2FnZSBieSBjbGVhcmluZyBBQ0sgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisJbGVuID0gMjsKKwlkYXRhID0gbXNnKzE7CisJaWYgKCFOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLCAmZGF0YSkgJiYKKwkgICAgbXNnWzFdID09IFNJTVBMRV9RVUVVRV9UQUcpCisJICAgIHRhZyA9IG1zZ1syXTsKKwlUQUdfUFJJTlRLKCJzY3NpJWQ6IHRhcmdldCBtYXNrICUwMngsIGx1biAlZCBzZW50IHRhZyAlZCBhdCAiCisJCSAgICJyZXNlbGVjdGlvblxuIiwgSE9TVE5PLCB0YXJnZXRfbWFzaywgbHVuLCB0YWcpOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSB0bXA7CisgICAgUlNMX1BSSU5USygic2NzaSVkOiBuZXh1cyBlc3RhYmxpc2hlZCwgdGFyZ2V0ID0gJWQsIGx1biA9ICVkLCB0YWcgPSAlZFxuIiwKKwkgICAgICAgSE9TVE5PLCB0bXAtPnRhcmdldCwgdG1wLT5sdW4sIHRtcC0+dGFnKTsKK30KKworCisvKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9hYm9ydCAoU2NzaV9DbW5kICpjbWQpCisgKgorICogUHVycG9zZSA6IGFib3J0IGEgY29tbWFuZAorICoKKyAqIElucHV0cyA6IGNtZCAtIHRoZSBTY3NpX0NtbmQgdG8gYWJvcnQsIGNvZGUgLSBjb2RlIHRvIHNldCB0aGUgCisgKiAJaG9zdCBieXRlIG9mIHRoZSByZXN1bHQgZmllbGQgdG8sIGlmIHplcm8gRElEX0FCT1JURUQgaXMgCisgKgl1c2VkLgorICoKKyAqIFJldHVybnMgOiAwIC0gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqCisgKiBYWFggLSB0aGVyZSBpcyBubyB3YXkgdG8gYWJvcnQgdGhlIGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkgCisgKiAJIGNvbm5lY3RlZCwgeW91IGhhdmUgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBJZiB0aGlzIGlzIAorICoJIGEgcHJvYmxlbSwgd2UgY291bGQgaW1wbGVtZW50IGxvbmdqbXAoKSAvIHNldGptcCgpLCBzZXRqbXAoKQorICogCSBjYWxsZWQgd2hlcmUgdGhlIGxvb3Agc3RhcnRlZCBpbiBOQ1I1MzgwX21haW4oKS4KKyAqLworCitzdGF0aWMgaW50IE5DUjUzODBfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQoreworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7CisgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOworICAgIFNjc2lfQ21uZCAqdG1wLCAqKnByZXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHByaW50ayhLRVJOX05PVElDRSAic2NzaSVkOiBhYm9ydGluZyBjb21tYW5kXG4iLCBIT1NUTk8pOworICAgIHByaW50X1Njc2lfQ21uZCAoY21kKTsKKworICAgIE5DUjUzODBfcHJpbnRfc3RhdHVzIChpbnN0YW5jZSk7CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgQUJSVF9QUklOVEsoInNjc2klZDogYWJvcnQgY2FsbGVkIGJhc3IgMHglMDJ4LCBzciAweCUwMnhcbiIsIEhPU1ROTywKKwkJTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRyksCisJCU5DUjUzODBfcmVhZChTVEFUVVNfUkVHKSk7CisKKyNpZiAxCisvKiAKKyAqIENhc2UgMSA6IElmIHRoZSBjb21tYW5kIGlzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQsIAorICogd2UnbGwgc2V0IHRoZSBhYm9ydGVkIGZsYWcgYW5kIHJldHVybiBjb250cm9sIHNvIHRoYXQgCisgKiBpbmZvcm1hdGlvbiB0cmFuc2ZlciByb3V0aW5lIGNhbiBleGl0IGNsZWFubHkuCisgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkID09IGNtZCkgeworCisJQUJSVF9QUklOVEsoInNjc2klZDogYWJvcnRpbmcgY29ubmVjdGVkIGNvbW1hbmRcbiIsIEhPU1ROTyk7CisvKgorICogV2Ugc2hvdWxkIHBlcmZvcm0gQlNZIGNoZWNraW5nLCBhbmQgbWFrZSBzdXJlIHdlIGhhdmVuJ3Qgc2xpcHBlZAorICogaW50byBCVVMgRlJFRS4KKyAqLworCisvKglOQ1I1MzgwX3dyaXRlKElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0FTU0VSVF9BVE4pOyAqLworLyogCisgKiBTaW5jZSB3ZSBjYW4ndCBjaGFuZ2UgcGhhc2VzIHVudGlsIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCAKKyAqIGhhbmRzaGFrZSwgd2UgaGF2ZSB0byBzb3VyY2Ugb3Igc2luayBhIGJ5dGUgb2YgZGF0YSBpZiB0aGUgY3VycmVudAorICogcGhhc2UgaXMgbm90IE1TR09VVC4KKyAqLworCisvKiAKKyAqIFJldHVybiBjb250cm9sIHRvIHRoZSBleGVjdXRpbmcgTkNSIGRyaXZlIHNvIHdlIGNhbiBjbGVhciB0aGUKKyAqIGFib3J0ZWQgZmxhZyBhbmQgZ2V0IGJhY2sgaW50byBvdXIgbWFpbiBsb29wLgorICovIAorCisJaWYgKGRvX2Fib3J0KGluc3RhbmNlKSA9PSAwKSB7CisJICBob3N0ZGF0YS0+YWJvcnRlZCA9IDE7CisJICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwkgIGNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworI2lmZGVmIFNVUFBPUlRfVEFHUworCSAgY21kX2ZyZWVfdGFnKCBjbWQgKTsKKyNlbHNlCisJICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCSAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgY21kLT5zY3NpX2RvbmUoY21kKTsKKwkgIHJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJfSBlbHNlIHsKKy8qCSAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAqLworCSAgcHJpbnRrKCJzY3NpJWQ6IGFib3J0IG9mIGNvbm5lY3RlZCBjb21tYW5kIGZhaWxlZCFcbiIsIEhPU1ROTyk7CisJICByZXR1cm4gU0NTSV9BQk9SVF9FUlJPUjsKKwl9IAorICAgfQorI2VuZGlmCisKKy8qIAorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaGFzbid0IGJlZW4gaXNzdWVkIHlldCwgd2Ugc2ltcGx5IHJlbW92ZSBpdCAKKyAqIAkgICAgZnJvbSB0aGUgaXNzdWUgcXVldWUuCisgKi8KKyAgICBmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSksIAorCXRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOworCXRtcDsgcHJldiA9IE5FWFRBRERSKHRtcCksIHRtcCA9IE5FWFQodG1wKSApCisJaWYgKGNtZCA9PSB0bXApIHsKKwkgICAgUkVNT1ZFKDUsICpwcmV2LCB0bXAsIE5FWFQodG1wKSk7CisJICAgICgqcHJldikgPSBORVhUKHRtcCk7CisJICAgIE5FWFQodG1wKSA9IE5VTEw7CisJICAgIHRtcC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IHJlbW92ZWQgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlLlxuIiwKKwkJCUhPU1ROTyk7CisJICAgIC8qIFRhZ2dlZCBxdWV1aW5nIG5vdGU6IG5vIHRhZyB0byBmcmVlIGhlcmUsIGhhc24ndCBiZWVuIGFzc2lnbmVkCisJICAgICAqIHlldC4uLiAqLworCSAgICB0bXAtPnNjc2lfZG9uZSh0bXApOworCSAgICByZXR1cm4gU0NTSV9BQk9SVF9TVUNDRVNTOworCX0KKworLyogCisgKiBDYXNlIDMgOiBJZiBhbnkgY29tbWFuZHMgYXJlIGNvbm5lY3RlZCwgd2UncmUgZ29pbmcgdG8gZmFpbCB0aGUgYWJvcnQKKyAqCSAgICBhbmQgbGV0IHRoZSBoaWdoIGxldmVsIFNDU0kgZHJpdmVyIHJldHJ5IGF0IGEgbGF0ZXIgdGltZSBvciAKKyAqCSAgICBpc3N1ZSBhIHJlc2V0LgorICoKKyAqCSAgICBUaW1lb3V0cywgYW5kIHRoZXJlZm9yZSBhYm9ydGVkIGNvbW1hbmRzLCB3aWxsIGJlIGhpZ2hseSB1bmxpa2VseQorICogICAgICAgICAgYW5kIGhhbmRsaW5nIHRoZW0gY2xlYW5seSBpbiB0aGlzIHNpdHVhdGlvbiB3b3VsZCBtYWtlIHRoZSBjb21tb24KKyAqCSAgICBjYXNlIG9mIG5vcmVzZXRzIGxlc3MgZWZmaWNpZW50LCBhbmQgd291bGQgcG9sbHV0ZSBvdXIgY29kZS4gIFNvLAorICoJICAgIHdlIGZhaWwuCisgKi8KKworICAgIGlmIChob3N0ZGF0YS0+Y29ubmVjdGVkKSB7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IGFib3J0IGZhaWxlZCwgY29tbWFuZCBjb25uZWN0ZWQuXG4iLCBIT1NUTk8pOworICAgICAgICByZXR1cm4gU0NTSV9BQk9SVF9TTk9PWkU7CisgICAgfQorCisvKgorICogQ2FzZSA0OiBJZiB0aGUgY29tbWFuZCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGVkIGZyb20gdGhlIGJ1cywgYW5kIAorICogCXRoZXJlIGFyZSBubyBjb25uZWN0ZWQgY29tbWFuZHMsIHdlIHJlY29ubmVjdCB0aGUgSV9UX0wgb3IgCisgKglJX1RfTF9RIG5leHVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgZ28gaW50byBtZXNzYWdlIG91dCwgYW5kIHNlbmQgCisgKiAgICAgIGFuIGFib3J0IG1lc3NhZ2UuCisgKgorICogVGhpcyBjYXNlIGlzIGVzcGVjaWFsbHkgdWdseS4gSW4gb3JkZXIgdG8gcmVlc3RhYmxpc2ggdGhlIG5leHVzLCB3ZQorICogbmVlZCB0byBjYWxsIE5DUjUzODBfc2VsZWN0KCkuICBUaGUgZWFzaWVzdCB3YXkgdG8gaW1wbGVtZW50IHRoaXMgCisgKiBmdW5jdGlvbiB3YXMgdG8gYWJvcnQgaWYgdGhlIGJ1cyB3YXMgYnVzeSwgYW5kIGxldCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIHRyaWdnZXJlZCBvbiB0aGUgU0VMIGZvciByZXNlbGVjdCB0YWtlIGNhcmUgb2YgbG9zdCBhcmJpdHJhdGlvbnMKKyAqIHdoZXJlIG5lY2Vzc2FyeSwgbWVhbmluZyBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgZW5hYmxlZC4KKyAqCisgKiBXaGVuIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIHRoZSBxdWV1ZXMgbWF5IGNoYW5nZSAtIHNvIHdlIAorICogY2FuJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2Nvbm5lY3RlZCBxdWV1ZSBiZWZvcmUgc2VsZWN0aW5nIGl0CisgKiBiZWNhdXNlIHRoYXQgY291bGQgY2F1c2UgYSBmYWlsdXJlIGluIGhhc2hpbmcgdGhlIG5leHVzIGlmIHRoYXQgCisgKiBkZXZpY2UgcmVzZWxlY3RlZC4KKyAqIAorICogU2luY2UgdGhlIHF1ZXVlcyBtYXkgY2hhbmdlLCB3ZSBjYW4ndCB1c2UgdGhlIHBvaW50ZXJzIGZyb20gd2hlbiB3ZQorICogZmlyc3QgbG9jYXRlIGl0LgorICoKKyAqIFNvLCB3ZSBtdXN0IGZpcnN0IGxvY2F0ZSB0aGUgY29tbWFuZCwgYW5kIGlmIE5DUjUzODBfc2VsZWN0KCkKKyAqIHN1Y2NlZWRzLCB0aGVuIGlzc3VlIHRoZSBhYm9ydCwgcmVsb2NhdGUgdGhlIGNvbW1hbmQgYW5kIHJlbW92ZQorICogaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgorICovCisKKyAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOworCSB0bXAgPSBORVhUKHRtcCkpIAorICAgICAgICBpZiAoY21kID09IHRtcCkgeworICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCSAgICBBQlJUX1BSSU5USygic2NzaSVkOiBhYm9ydGluZyBkaXNjb25uZWN0ZWQgY29tbWFuZC5cbiIsIEhPU1ROTyk7CisgIAorICAgICAgICAgICAgaWYgKE5DUjUzODBfc2VsZWN0IChpbnN0YW5jZSwgY21kLCAoaW50KSBjbWQtPnRhZykpIAorCQlyZXR1cm4gU0NTSV9BQk9SVF9CVVNZOworCisJICAgIEFCUlRfUFJJTlRLKCJzY3NpJWQ6IG5leHVzIHJlZXN0YWJsaXNoZWQuXG4iLCBIT1NUTk8pOworCisJICAgIGRvX2Fib3J0IChpbnN0YW5jZSk7CisKKwkgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSAgICBmb3IgKHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpLCAKKwkJdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworCQl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkgKQorCQkgICAgaWYgKGNtZCA9PSB0bXApIHsKKwkJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOworCQkgICAgKnByZXYgPSBORVhUKHRtcCk7CisJCSAgICBORVhUKHRtcCkgPSBOVUxMOworCQkgICAgdG1wLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCSAgICAvKiBXZSBtdXN0IHVubG9jayB0aGUgdGFnL0xVTiBpbW1lZGlhdGVseSBoZXJlLCBzaW5jZSB0aGUKKwkJICAgICAqIHRhcmdldCBnb2VzIHRvIEJVUyBGUkVFIGFuZCBkb2Vzbid0IHNlbmQgdXMgYW5vdGhlcgorCQkgICAgICogbWVzc2FnZSAoQ09NTUFORF9DT01QTEVURSBvciB0aGUgbGlrZSkKKwkJICAgICAqLworI2lmZGVmIFNVUFBPUlRfVEFHUworCQkgICAgY21kX2ZyZWVfdGFnKCB0bXAgKTsKKyNlbHNlCisJCSAgICBob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKyNlbmRpZgorCQkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkgICAgdG1wLT5zY3NpX2RvbmUodG1wKTsKKwkJICAgIHJldHVybiBTQ1NJX0FCT1JUX1NVQ0NFU1M7CisJCX0KKwl9CisKKy8qCisgKiBDYXNlIDUgOiBJZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQgaW4gYW55IG9mIAorICoJICAgIHRoZSBxdWV1ZXMuCisgKgorICogV2UgcHJvYmFibHkgcmVhY2hlZCB0aGlzIHBvaW50IGJlY2F1c2Ugb2YgYW4gdW5saWtlbHkgcmFjZSBjb25kaXRpb24KKyAqIGJldHdlZW4gdGhlIGNvbW1hbmQgY29tcGxldGluZyBzdWNjZXNzZnVsbHkgYW5kIHRoZSBhYm9ydGlvbiBjb2RlLAorICogc28gd2Ugd29uJ3QgcGFuaWMsIGJ1dCB3ZSB3aWxsIG5vdGlmeSB0aGUgdXNlciBpbiBjYXNlIHNvbWV0aGluZyByZWFsbHkKKyAqIGJyb2tlLgorICovCisKKyAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiB3YXJuaW5nIDogU0NTSSBjb21tYW5kIHByb2JhYmx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIKKyAgICAgICAgICAgS0VSTl9JTkZPICIgICAgICAgIGJlZm9yZSBhYm9ydGlvblxuIiwgSE9TVE5PKTsgCisKKyAgICByZXR1cm4gU0NTSV9BQk9SVF9OT1RfUlVOTklORzsKK30KKworCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYnVzX3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkKKyAqIAorICogUHVycG9zZSA6IHJlc2V0IHRoZSBTQ1NJIGJ1cy4KKyAqCisgKiBSZXR1cm5zIDogU0NTSV9SRVNFVF9XQUtFVVAKKyAqCisgKi8gCisKK3N0YXRpYyBpbnQgTkNSNTM4MF9idXNfcmVzZXQoIFNjc2lfQ21uZCAqY21kKQoreworICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKyAgICBpbnQgICAgICAgICAgIGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZiAxCisgICAgU2NzaV9DbW5kICpjb25uZWN0ZWQsICpkaXNjb25uZWN0ZWRfcXVldWU7CisjZW5kaWYKKworCisgICAgTkNSNTM4MF9wcmludF9zdGF0dXMgKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKworICAgIC8qIGdldCBpbiBwaGFzZSAqLworICAgIE5DUjUzODBfd3JpdGUoIFRBUkdFVF9DT01NQU5EX1JFRywKKwkJICAgUEhBU0VfU1JfVE9fVENSKCBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgKSk7CisgICAgLyogYXNzZXJ0IFJTVCAqLworICAgIE5DUjUzODBfd3JpdGUoIElOSVRJQVRPUl9DT01NQU5EX1JFRywgSUNSX0JBU0UgfCBJQ1JfQVNTRVJUX1JTVCApOworICAgIHVkZWxheSAoNDApOworICAgIC8qIHJlc2V0IE5DUiByZWdpc3RlcnMgKi8KKyAgICBOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisgICAgTkNSNTM4MF93cml0ZSggTU9ERV9SRUcsIE1SX0JBU0UgKTsKKyAgICBOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsIDAgKTsKKyAgICBOQ1I1MzgwX3dyaXRlKCBTRUxFQ1RfRU5BQkxFX1JFRywgMCApOworICAgIC8qICsrcm9tYW46IHJlc2V0IGludGVycnVwdCBjb25kaXRpb24hIG90aGVyd2lzZSBubyBpbnRlcnJ1cHRzIGRvbid0IGdldAorICAgICAqIHRocm91Z2ggYW55bW9yZSAuLi4gKi8KKyAgICAodm9pZClOQ1I1MzgwX3JlYWQoIFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHICk7CisKKyNpZiAxIC8qIFhYWCBTaG91bGQgbm93IGJlIGRvbmUgYnkgbWlkbGV2ZWwgY29kZSwgYnV0IGl0J3MgYnJva2VuIFhYWCAqLworICAgICAgLyogWFhYIHNlZSBiZWxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFhYICovCisKKyAgICAvKiBNU2NoOiBvbGQtc3R5bGUgcmVzZXQ6IGFjdHVhbGx5IGFib3J0IGFsbCBjb21tYW5kIHByb2Nlc3NpbmcgaGVyZSAqLworCisgICAgLyogQWZ0ZXIgdGhlIHJlc2V0LCB0aGVyZSBhcmUgbm8gbW9yZSBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkIGNvbW1hbmRzCisgICAgICogYW5kIG5vIGJ1c3kgdW5pdHM7IHRvIGF2b2lkIHByb2JsZW1zIHdpdGggcmUtaW5zZXJ0aW5nIHRoZSBjb21tYW5kcworICAgICAqIGludG8gdGhlIGlzc3VlX3F1ZXVlICh2aWEgc2NzaV9kb25lKCkpLCB0aGUgYWJvcnRlZCBjb21tYW5kcyBhcmUKKyAgICAgKiByZW1lbWJlcmVkIGluIGxvY2FsIHZhcmlhYmxlcyBmaXJzdC4KKyAgICAgKi8KKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgY29ubmVjdGVkID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5jb25uZWN0ZWQ7CisgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisgICAgZGlzY29ubmVjdGVkX3F1ZXVlID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7CisgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5VTEw7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgZnJlZV9hbGxfdGFncygpOworI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFJFQUxfRE1BCisgICAgaG9zdGRhdGEtPmRtYV9sZW4gPSAwOworI2VuZGlmCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgLyogSW4gb3JkZXIgdG8gdGVsbCB0aGUgbWlkLWxldmVsIGNvZGUgd2hpY2ggY29tbWFuZHMgd2VyZSBhYm9ydGVkLCAKKyAgICAgKiBzZXQgdGhlIGNvbW1hbmQgc3RhdHVzIHRvIERJRF9SRVNFVCBhbmQgY2FsbCBzY3NpX2RvbmUoKSAhISEKKyAgICAgKiBUaGlzIHVsdGltYXRlbHkgYWJvcnRzIHByb2Nlc3Npbmcgb2YgdGhlc2UgY29tbWFuZHMgaW4gdGhlIG1pZC1sZXZlbC4KKyAgICAgKi8KKworICAgIGlmICgoY21kID0gY29ubmVjdGVkKSkgeworCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgYSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSF9OTyhjbWQpKTsKKwljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4ZmZmZikgfCAoRElEX1JFU0VUIDw8IDE2KTsKKwljbWQtPnNjc2lfZG9uZSggY21kICk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgKGNtZCA9IGRpc2Nvbm5lY3RlZF9xdWV1ZSk7ICsraSkgeworCWRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5FWFQoY21kKTsKKwlORVhUKGNtZCkgPSBOVUxMOworCWNtZC0+cmVzdWx0ID0gKGNtZC0+cmVzdWx0ICYgMHhmZmZmKSB8IChESURfUkVTRVQgPDwgMTYpOworCWNtZC0+c2NzaV9kb25lKCBjbWQgKTsKKyAgICB9CisgICAgaWYgKGkgPiAwKQorCUFCUlRfUFJJTlRLKCJzY3NpOiByZXNldCBhYm9ydGVkICVkIGRpc2Nvbm5lY3RlZCBjb21tYW5kKHMpXG4iLCBpKTsKKworCisgICAgLyogc2luY2UgYWxsIGNvbW1hbmRzIGhhdmUgYmVlbiBleHBsaWNpdGx5IHRlcm1pbmF0ZWQsIHdlIG5lZWQgdG8gdGVsbAorICAgICAqIHRoZSBtaWRsZXZlbCBjb2RlIHRoYXQgdGhlIHJlc2V0IHdhcyBTVUNDRVNTRlVMLCBhbmQgdGhlcmUgaXMgbm8gCisgICAgICogbmVlZCB0byAnd2FrZSB1cCcgdGhlIGNvbW1hbmRzIGJ5IGEgcmVxdWVzdF9zZW5zZQorICAgICAqLworICAgIHJldHVybiBTQ1NJX1JFU0VUX1NVQ0NFU1MgfCBTQ1NJX1JFU0VUX0JVU19SRVNFVDsKKyNlbHNlIC8qIDEgKi8KKworICAgIC8qIE1TY2g6IG5ldy1zdHlsZSByZXNldCBoYW5kbGluZzogbGV0IHRoZSBtaWQtbGV2ZWwgZG8gd2hhdCBpdCBjYW4gKi8KKworICAgIC8qICsrZ3VlbnRoZXI6IE1JRC1MRVZFTCBJUyBTVElMTCBCUk9LRU4uCisgICAgICogTWlkLWxldmVsIGlzIHN1cHBvc2VkIHRvIHJlcXVldWUgYWxsIGNvbW1hbmRzIHRoYXQgd2VyZSBhY3RpdmUgb24gdGhlCisgICAgICogdmFyaW91cyBsb3ctbGV2ZWwgcXVldWVzLiBJbiBmYWN0IGl0IGRvZXMgdGhpcywgYnV0IHRoYXQncyBub3QgZW5vdWdoCisgICAgICogYmVjYXVzZSBhbGwgdGhlc2UgY29tbWFuZHMgYXJlIHN1YmplY3QgdG8gdGltZW91dC4gQW5kIGlmIGEgdGltZW91dAorICAgICAqIGhhcHBlbnMgZm9yIGFueSByZW1vdmVkIGNvbW1hbmQsICpfYWJvcnQoKSBpcyBjYWxsZWQgYnV0IGFsbCBxdWV1ZXMKKyAgICAgKiBhcmUgbm93IGVtcHR5LiBBYm9ydCB0aGVuIGdpdmVzIHVwIHRoZSBmYWxjb24gbG9jaywgd2hpY2ggaXMgZmF0YWwsCisgICAgICogc2luY2UgdGhlIG1pZC1sZXZlbCB3aWxsIHF1ZXVlIG1vcmUgY29tbWFuZHMgYW5kIG11c3QgaGF2ZSB0aGUgbG9jaworICAgICAqIChpdCdzIGFsbCBoYXBwZW5pbmcgaW5zaWRlIHRpbWVyIGludGVycnVwdCBoYW5kbGVyISEpLgorICAgICAqIEV2ZW4gd29yc2UsIGFib3J0IHdpbGwgcmV0dXJuIE5PVF9SVU5OSU5HIGZvciBhbGwgdGhvc2UgY29tbWFuZHMgbm90CisgICAgICogb24gYW55IHF1ZXVlLCBzbyB0aGV5IHdvbid0IGJlIHJldHJpZWQgLi4uCisgICAgICoKKyAgICAgKiBDb25jbHVzaW9uOiBlaXRoZXIgc2NzaS5jIGRpc2FibGVzIHRpbWVvdXQgZm9yIGFsbCByZXNldHRlZCBjb21tYW5kcworICAgICAqIGltbWVkaWF0ZWx5LCBvciB3ZSBsb3NlISAgQXMgb2YgbGludXgtMi4wLjIwIGl0IGRvZXNuJ3QuCisgICAgICovCisKKyAgICAvKiBBZnRlciB0aGUgcmVzZXQsIHRoZXJlIGFyZSBubyBtb3JlIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQgY29tbWFuZHMKKyAgICAgKiBhbmQgbm8gYnVzeSB1bml0czsgc28gY2xlYXIgdGhlIGxvdy1sZXZlbCBzdGF0dXMgaGVyZSB0byBhdm9pZCAKKyAgICAgKiBjb25mbGljdHMgd2hlbiB0aGUgbWlkLWxldmVsIGNvZGUgdHJpZXMgdG8gd2FrZSB1cCB0aGUgYWZmZWN0ZWQgCisgICAgICogY29tbWFuZHMhCisgICAgICovCisKKyAgICBpZiAoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKQorCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgaXNzdWVkIGNvbW1hbmQocylcbiIsIEhfTk8oY21kKSk7CisgICAgaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQpIAorCUFCUlRfUFJJTlRLKCJzY3NpJWQ6IHJlc2V0IGFib3J0ZWQgYSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSF9OTyhjbWQpKTsKKyAgICBpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSkKKwlBQlJUX1BSSU5USygic2NzaSVkOiByZXNldCBhYm9ydGVkIGRpc2Nvbm5lY3RlZCBjb21tYW5kKHMpXG4iLCBIX05PKGNtZCkpOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisgICAgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5VTEw7CisjaWZkZWYgU1VQUE9SVF9UQUdTCisgICAgZnJlZV9hbGxfdGFncygpOworI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisJaG9zdGRhdGEtPmJ1c3lbaV0gPSAwOworI2lmZGVmIFJFQUxfRE1BCisgICAgaG9zdGRhdGEtPmRtYV9sZW4gPSAwOworI2VuZGlmCisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgLyogd2UgZGlkIG5vIGNvbXBsZXRlIHJlc2V0IG9mIGFsbCBjb21tYW5kcywgc28gYSB3YWtldXAgaXMgcmVxdWlyZWQgKi8KKyAgICByZXR1cm4gU0NTSV9SRVNFVF9XQUtFVVAgfCBTQ1NJX1JFU0VUX0JVU19SRVNFVDsKKyNlbmRpZiAvKiAxICovCit9CisKKy8qIExvY2FsIFZhcmlhYmxlczogKi8KKy8qIHRhYi13aWR0aDogOCAgICAgKi8KKy8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2VhOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5jCkBAIC0wLDAgKzEsNjQyIEBACisvKgorICogU3VuMyBTQ1NJIHN0dWZmIGJ5IEVyaWsgVmVyYnJ1Z2dlbiAoZXJpa0BiaWdtYW1hLnh0ZG5ldC5ubCkKKyAqCisgKiBTdW4zIERNQSByb3V0aW5lcyBhZGRlZCBieSBTYW0gQ3JlYXNleSAoc2FtbXlAc2FtbXkubmV0KQorICoKKyAqIEFkYXB0ZWQgZnJvbSBtYWNfc2NzaW5ldy5jOgorICovCisvKgorICogR2VuZXJpYyBNYWNpbnRvc2ggTkNSNTM4MCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCwgTWljaGFlbCBTY2htaXR6IDxtc2NobWl0ekBsYmwuZ292PgorICoKKyAqIGRlcml2ZWQgaW4gcGFydCBmcm9tOgorICovCisvKgorICogR2VuZXJpYyBHZW5lcmljIE5DUjUzODAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTUsIFJ1c3NlbGwgS2luZworICoKKyAqIEFMUEhBIFJFTEVBU0UgMS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQKKyAqCisgKiBOQ1IgNTM4MCBGYW1pbHkKKyAqIFNDU0kgUHJvdG9jb2wgQ29udHJvbGxlcgorICogRGF0YWJvb2sKKyAqCisgKiBOQ1IgTWljcm9lbGVjdHJvbmljcworICogMTYzNSBBZXJvcGxhemEgRHJpdmUKKyAqIENvbG9yYWRvIFNwcmluZ3MsIENPIDgwOTE2CisgKiAxKyAoNzE5KSA1NzgtMzQwMAorICogMSsgKDgwMCkgMzM0LTU0NTQKKyAqLworCisKKy8qCisgKiBUaGlzIGlzIGZyb20gbWFjX3Njc2kuaCwgYnV0IGhleSwgbWF5YmUgdGhpcyBpcyB1c2VmdWwgZm9yIFN1bjMgdG9vISA6KQorICoKKyAqIE9wdGlvbnMgOgorICoKKyAqIFBBUklUWSAtIGVuYWJsZSBwYXJpdHkgY2hlY2tpbmcuICBOb3Qgc3VwcG9ydGVkLgorICoKKyAqIFNDU0kyIC0gZW5hYmxlIHN1cHBvcnQgZm9yIFNDU0ktSUkgdGFnZ2VkIHF1ZXVlaW5nLiAgVW50ZXN0ZWQuCisgKgorICogVVNMRUVQIC0gZW5hYmxlIHN1cHBvcnQgZm9yIGRldmljZXMgdGhhdCBkb24ndCBkaXNjb25uZWN0LiAgVW50ZXN0ZWQuCisgKi8KKworLyoKKyAqICRMb2c6IHN1bjNfTkNSNTM4MC5jLHYgJAorICovCisKKyNkZWZpbmUgQVVUT1NFTlNFCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL3N1bjNpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2R2bWEuaD4KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+CisKKy8qIGRtYSBvbiEgKi8KKyNkZWZpbmUgUkVBTF9ETUEKKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInN1bjNfc2NzaS5oIgorI2luY2x1ZGUgIk5DUjUzODAuaCIKKworc3RhdGljIHZvaWQgTkNSNTM4MF9wcmludChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisKKy8qICNkZWZpbmUgT0xERE1BICovCisKKyNkZWZpbmUgVVNFX1dSQVBQRVIKKy8qI2RlZmluZSBSRVNFVF9CT09UICovCisjZGVmaW5lIERSSVZFUl9TRVRVUAorCisjZGVmaW5lIE5ERUJVRyAwCisKKy8qCisgKiBCVUcgY2FuIGJlIHVzZWQgdG8gdHJpZ2dlciBhIHN0cmFuZ2UgY29kZS1zaXplIHJlbGF0ZWQgaGFuZyBvbiAyLjEga2VybmVscworICovCisjaWZkZWYgQlVHCisjdW5kZWYgUkVTRVRfQk9PVAorI3VuZGVmIERSSVZFUl9TRVRVUAorI2VuZGlmCisKKy8qICNkZWZpbmUgU1VQUE9SVF9UQUdTICovCisKKyNkZWZpbmUJRU5BQkxFX0lSUSgpCWVuYWJsZV9pcnEoIElSUV9TVU4zX1NDU0kgKTsgCisKKworc3RhdGljIGlycXJldHVybl90IHNjc2lfc3VuM19pbnRyKGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN1bjNzY3NpX3JlYWQoaW50IHJlZyk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3VuM3Njc2lfd3JpdGUoaW50IHJlZywgaW50IHZhbHVlKTsKKworc3RhdGljIGludCBzZXR1cF9jYW5fcXVldWUgPSAtMTsKK21vZHVsZV9wYXJhbShzZXR1cF9jYW5fcXVldWUsIGludCwgMCk7CitzdGF0aWMgaW50IHNldHVwX2NtZF9wZXJfbHVuID0gLTE7Cittb2R1bGVfcGFyYW0oc2V0dXBfY21kX3Blcl9sdW4sIGludCwgMCk7CitzdGF0aWMgaW50IHNldHVwX3NnX3RhYmxlc2l6ZSA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX3NnX3RhYmxlc2l6ZSwgaW50LCAwKTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKK3N0YXRpYyBpbnQgc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gLTE7Cittb2R1bGVfcGFyYW0oc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nLCBpbnQsIDApOworI2VuZGlmCitzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX2hvc3RpZCwgaW50LCAwKTsKKworc3RhdGljIFNjc2lfQ21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CisKKyNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCisKKy8qIG1zIHRvIHdhaXQgYWZ0ZXIgaGl0dGluZyBkbWEgcmVncyAqLworI2RlZmluZSBTVU4zX0RNQV9ERUxBWSAxMAorCisvKiBkdm1hIGJ1ZmZlciB0byBhbGxvY2F0ZSAtLSAzMmsgc2hvdWxkIGhvcGVmdWxseSBiZSBtb3JlIHRoYW4gc3VmZmljaWVudCAqLworI2RlZmluZSBTVU4zX0RWTUFfQlVGU0laRSAweGUwMDAKKworLyogbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gZG8gZG1hIG9uICovCisjZGVmaW5lIFNVTjNfRE1BX01JTlNJWkUgMTI4CisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpzdW4zX3Njc2lfcmVncDsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3Qgc3VuM19kbWFfcmVncyAqZHJlZ3M7CisjaWZkZWYgT0xERE1BCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZG1hYnVmID0gTlVMTDsgLyogZG1hIG1lbW9yeSBidWZmZXIgKi8KKyNlbmRpZgorc3RhdGljIHN0cnVjdCBzdW4zX3VkY19yZWdzICp1ZGNfcmVncyA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3VuM19kbWFfb3JpZ19hZGRyID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1bjNfZG1hX29yaWdfY291bnQgPSAwOworc3RhdGljIGludCBzdW4zX2RtYV9hY3RpdmUgPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9yZXNpZHVhbCA9IDA7CisKKy8qCisgKiBOQ1IgNTM4MCByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN1bjNzY3NpX3JlYWQoaW50IHJlZykKK3sKKwlyZXR1cm4oIHN1bjNfc2NzaV9yZWdwW3JlZ10gKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1bjNzY3NpX3dyaXRlKGludCByZWcsIGludCB2YWx1ZSkKK3sKKwlzdW4zX3Njc2lfcmVncFtyZWddID0gdmFsdWU7Cit9CisKKy8qIGRtYSBjb250cm9sbGVyIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzdW4zX3VkY19yZWFkKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHJldDsKKworCWRyZWdzLT51ZGNfYWRkciA9IFVEQ19DU1I7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwlyZXQgPSBkcmVncy0+dWRjX2RhdGE7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VuM191ZGNfd3JpdGUodW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlkcmVncy0+dWRjX2FkZHIgPSByZWc7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwlkcmVncy0+dWRjX2RhdGEgPSB2YWw7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKK30KKworLyoKKyAqIFhYWDogc3RhdHVzIGRlYnVnCisgKi8KK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpkZWZhdWx0X2luc3RhbmNlOworCisvKgorICogRnVuY3Rpb24gOiBpbnQgc3VuM3Njc2lfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCisgKgorICogUHVycG9zZSA6IGluaXRpYWxpemVzIG1hYyBOQ1I1MzgwIGRyaXZlciBiYXNlZCBvbiB0aGUKKyAqCWNvbW1hbmQgbGluZSAvIGNvbXBpbGUgdGltZSBwb3J0IGFuZCBpcnEgZGVmaW5pdGlvbnMuCisgKgorICogSW5wdXRzIDogdHBudCAtIHRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgorICoKKyAqLworIAoraW50IHN1bjNzY3NpX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXN0YXRpYyBpbnQgY2FsbGVkID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKworCS8qIGNoZWNrIHRoYXQgdGhpcyBtYWNoaW5lIGhhcyBhbiBvbmJvYXJkIDUzODAgKi8KKwlzd2l0Y2goaWRwcm9tLT5pZF9tYWNodHlwZSkgeworCWNhc2UgU01fU1VOM3xTTV8zXzUwOgorCWNhc2UgU01fU1VOM3xTTV8zXzYwOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmKGNhbGxlZCkKKwkJcmV0dXJuIDA7CisKKwl0cG50LT5wcm9jX25hbWUgPSAiU3VuMyA1MzgwIFNDU0kiOworCisJLyogc2V0dXAgdmFyaWFibGVzICovCisJdHBudC0+Y2FuX3F1ZXVlID0KKwkJKHNldHVwX2Nhbl9xdWV1ZSA+IDApID8gc2V0dXBfY2FuX3F1ZXVlIDogQ0FOX1FVRVVFOworCXRwbnQtPmNtZF9wZXJfbHVuID0KKwkJKHNldHVwX2NtZF9wZXJfbHVuID4gMCkgPyBzZXR1cF9jbWRfcGVyX2x1biA6IENNRF9QRVJfTFVOOworCXRwbnQtPnNnX3RhYmxlc2l6ZSA9IAorCQkoc2V0dXBfc2dfdGFibGVzaXplID49IDApID8gc2V0dXBfc2dfdGFibGVzaXplIDogU0dfVEFCTEVTSVpFOworCisJaWYgKHNldHVwX2hvc3RpZCA+PSAwKQorCQl0cG50LT50aGlzX2lkID0gc2V0dXBfaG9zdGlkOworCWVsc2UgeworCQkvKiB1c2UgNyBhcyBkZWZhdWx0ICovCisJCXRwbnQtPnRoaXNfaWQgPSA3OworCX0KKworCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoSU9CQVNFX1NVTjNfU0NTSSwgUEFHRV9TSVpFKTsKKwlzdW4zX3Njc2lfcmVncCA9ICh1bnNpZ25lZCBjaGFyICopaW9hZGRyOworCisJZHJlZ3MgPSAoc3RydWN0IHN1bjNfZG1hX3JlZ3MgKikoKCh1bnNpZ25lZCBjaGFyICopaW9hZGRyKSArIDgpOworCisJaWYoKHVkY19yZWdzID0gZHZtYV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdW4zX3VkY19yZWdzKSkpCisJICAgPT0gTlVMTCkgeworCSAgICAgcHJpbnRrKCJTVU4zIFNjc2kgY291bGRuJ3QgYWxsb2NhdGUgRFZNQSBtZW1vcnkhXG4iKTsKKwkgICAgIHJldHVybiAwOworCX0KKyNpZmRlZiBPTERETUEKKwlpZigoZG1hYnVmID0gZHZtYV9tYWxsb2NfYWxpZ24oU1VOM19EVk1BX0JVRlNJWkUsIDB4MTAwMDApKSA9PSBOVUxMKSB7CisJICAgICBwcmludGsoIlNVTjMgU2NzaSBjb3VsZG4ndCBhbGxvY2F0ZSBEVk1BIG1lbW9yeSFcbiIpOworCSAgICAgcmV0dXJuIDA7CisJfQorI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJaWYgKHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA8IDApCisJCXNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IFVTRV9UQUdHRURfUVVFVUlORzsKKyNlbmRpZgorCisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwlpZihpbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkJCisJZGVmYXVsdF9pbnN0YW5jZSA9IGluc3RhbmNlOworCisgICAgICAgIGluc3RhbmNlLT5pb19wb3J0ID0gKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKKwlpbnN0YW5jZS0+aXJxID0gSVJRX1NVTjNfU0NTSTsKKworCU5DUjUzODBfaW5pdChpbnN0YW5jZSwgMCk7CisKKwlpbnN0YW5jZS0+bl9pb19wb3J0ID0gMzI7CisKKyAgICAgICAgKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmN0cmwgPSAwOworCisJaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHNjc2lfc3VuM19pbnRyLAorCQkJICAgICAwLCAiU3VuM1NDU0ktNTM4MCIsIE5VTEwpKSB7CisjaWZuZGVmIFJFQUxfRE1BCisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZSwgaW50ZXJydXB0cyBkaXNhYmxlZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKwkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisjZWxzZQorCQlwcmludGsoInNjc2klZDogSVJRJWQgbm90IGZyZWUsIGJhaWxpbmcgb3V0XG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0KKwkKKwlwcmludGsoInNjc2klZDogU3VuMyA1MzgwIGF0IHBvcnQgJWxYIGlycSIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aW9fcG9ydCk7CisJaWYgKGluc3RhbmNlLT5pcnEgPT0gU0NTSV9JUlFfTk9ORSkKKwkJcHJpbnRrICgicyBkaXNhYmxlZCIpOworCWVsc2UKKwkJcHJpbnRrICgiICVkIiwgaW5zdGFuY2UtPmlycSk7CisJcHJpbnRrKCIgb3B0aW9ucyBDQU5fUVVFVUU9JWQgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJICAgICAgIGluc3RhbmNlLT5jYW5fcXVldWUsIGluc3RhbmNlLT5jbWRfcGVyX2x1biwKKwkgICAgICAgU1VOM1NDU0lfUFVCTElDX1JFTEVBU0UpOworCXByaW50aygiXG5zY3NpJWQ6IiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisJcHJpbnRrKCJcbiIpOworCisJZHJlZ3MtPmNzciA9IDA7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwlkcmVncy0+Y3NyID0gQ1NSX1NDU0kgfCBDU1JfRklGTyB8IENTUl9JTlRSOworCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJZHJlZ3MtPmZpZm9fY291bnQgPSAwOworCisJY2FsbGVkID0gMTsKKworI2lmZGVmIFJFU0VUX0JPT1QKKwlzdW4zX3Njc2lfcmVzZXRfYm9vdChpbnN0YW5jZSk7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitpbnQgc3VuM3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYgKHNocG50LT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJZnJlZV9pcnEgKHNocG50LT5pcnEsIE5VTEwpOworCisJaW91bm1hcCgodm9pZCAqKXN1bjNfc2NzaV9yZWdwKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgUkVTRVRfQk9PVAorLyoKKyAqIE91ciAnYnVzIHJlc2V0IG9uIGJvb3QnIGZ1bmN0aW9uCisgKi8KKworc3RhdGljIHZvaWQgc3VuM19zY3NpX3Jlc2V0X2Jvb3Qoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKwkKKwkvKgorCSAqIERvIGEgU0NTSSByZXNldCB0byBjbGVhbiB1cCB0aGUgYnVzIGR1cmluZyBpbml0aWFsaXphdGlvbi4gTm8KKwkgKiBtZXNzaW5nIHdpdGggdGhlIHF1ZXVlcywgaW50ZXJydXB0cywgb3IgbG9ja3MgbmVjZXNzYXJ5IGhlcmUuCisJICovCisKKwlwcmludGsoICJTdW4zIFNDU0k6IHJlc2V0dGluZyB0aGUgU0NTSSBidXMuLi4iICk7CisKKwkvKiBzd2l0Y2ggb2ZmIFNDU0kgSVJRIC0gY2F0Y2ggYW4gaW50ZXJydXB0IHdpdGhvdXQgSVJRIGJpdCBzZXQgZWxzZSAqLworLy8gICAgICAgCXN1bjNfZGlzYWJsZV9pcnEoIElSUV9TVU4zX1NDU0kgKTsKKworCS8qIGdldCBpbiBwaGFzZSAqLworCU5DUjUzODBfd3JpdGUoIFRBUkdFVF9DT01NQU5EX1JFRywKKwkJICAgICAgUEhBU0VfU1JfVE9fVENSKCBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgKSk7CisKKwkvKiBhc3NlcnQgUlNUICovCisJTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfUlNUICk7CisKKwkvKiBUaGUgbWluLiByZXNldCBob2xkIHRpbWUgaXMgMjV1cywgc28gNDB1cyBzaG91bGQgYmUgZW5vdWdoICovCisJdWRlbGF5KCA1MCApOworCisJLyogcmVzZXQgUlNUIGFuZCBpbnRlcnJ1cHQgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisJTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisJZm9yKCBlbmQgPSBqaWZmaWVzICsgQUZURVJfUkVTRVRfREVMQVk7IHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZCk7ICkKKwkJYmFycmllcigpOworCisJLyogc3dpdGNoIG9uIFNDU0kgSVJRIGFnYWluICovCisvLyAgICAgICAJc3VuM19lbmFibGVfaXJxKCBJUlFfU1VOM19TQ1NJICk7CisKKwlwcmludGsoICIgZG9uZVxuIiApOworfQorI2VuZGlmCisKK2NvbnN0IGNoYXIgKiBzdW4zc2NzaV9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICpzcG50KSB7CisgICAgcmV0dXJuICIiOworfQorCisvLyBzYWZlIGJpdHMgZm9yIHRoZSBDU1IKKyNkZWZpbmUgQ1NSX0dPT0QgMHgwNjBmCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX3N1bjNfaW50cihpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXVuc2lnbmVkIHNob3J0IGNzciA9IGRyZWdzLT5jc3I7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYoY3NyICYgfkNTUl9HT09EKSB7CisJCWlmKGNzciAmIENTUl9ETUFfQlVTRVJSKSB7CisJCQlwcmludGsoInNjc2klZDogYnVzIGVycm9yIGluIGRtYVxuIiwgZGVmYXVsdF9pbnN0YW5jZS0+aG9zdF9ubyk7CisJCX0KKworCQlpZihjc3IgJiBDU1JfRE1BX0NPTkZMSUNUKSB7CisJCQlwcmludGsoInNjc2klZDogZG1hIGNvbmZsaWN0XG4iLCBkZWZhdWx0X2luc3RhbmNlLT5ob3N0X25vKTsKKwkJfQorCQloYW5kbGVkID0gMTsKKwl9CisKKwlpZihjc3IgJiAoQ1NSX1NEQl9JTlQgfCBDU1JfRE1BX0lOVCkpIHsKKwkJTkNSNTM4MF9pbnRyKGlycSwgZHVtbXksIGZwKTsKKwkJaGFuZGxlZCA9IDE7CisJfQorCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgKiBEZWJ1ZyBzdHVmZiAtIHRvIGJlIGNhbGxlZCBvbiBOTUksIG9yIHN5c3JxIGtleS4gVXNlIGF0IHlvdXIgb3duIHJpc2s7IAorICogcmVlbnRlcmluZyBOQ1I1MzgwX3ByaW50X3N0YXR1cyBzZWVtcyB0byBoYXZlIHVnbHkgc2lkZSBlZmZlY3RzCisgKi8KKworLyogdGhpcyBkb2Vzbid0IHNlZW0gdG8gZ2V0IHVzZWQgYXQgYWxsIC0tIHNhbSAqLworI2lmIDAKK3ZvaWQgc3VuM19zdW4zX2RlYnVnICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisKKwlpZiAoZGVmYXVsdF9pbnN0YW5jZSkgeworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJTkNSNTM4MF9wcmludF9zdGF0dXMoZGVmYXVsdF9pbnN0YW5jZSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorfQorI2VuZGlmCisKKworLyogc3VuM3Njc2lfZG1hX3NldHVwKCkgLS0gaW5pdGlhbGl6ZSB0aGUgZG1hIGNvbnRyb2xsZXIgZm9yIGEgcmVhZC93cml0ZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3NldHVwKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCB3cml0ZV9mbGFnKQoreworI2lmZGVmIE9MRERNQQorCWlmKHdyaXRlX2ZsYWcpIAorCQltZW1jcHkoZG1hYnVmLCBkYXRhLCBjb3VudCk7CisJZWxzZSB7CisJCXN1bjNfZG1hX29yaWdfYWRkciA9IGRhdGE7CisJCXN1bjNfZG1hX29yaWdfY291bnQgPSBjb3VudDsKKwl9CisjZWxzZQorCXZvaWQgKmFkZHI7CisKKwlpZihzdW4zX2RtYV9vcmlnX2FkZHIgIT0gTlVMTCkKKwkJZHZtYV91bm1hcChzdW4zX2RtYV9vcmlnX2FkZHIpOworCisvLwlhZGRyID0gc3VuM19kdm1hX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YSwgKHVuc2lnbmVkIGxvbmcpZG1hYnVmKTsKKwlhZGRyID0gKHZvaWQgKilkdm1hX21hcCgodW5zaWduZWQgbG9uZykgZGF0YSwgY291bnQpOworCQkKKwlzdW4zX2RtYV9vcmlnX2FkZHIgPSBhZGRyOworCXN1bjNfZG1hX29yaWdfY291bnQgPSBjb3VudDsKKyNlbmRpZgorCWRyZWdzLT5maWZvX2NvdW50ID0gMDsKKwlzdW4zX3VkY193cml0ZShVRENfUkVTRVQsIFVEQ19DU1IpOworCQorCS8qIHJlc2V0IGZpZm8gKi8KKwlkcmVncy0+Y3NyICY9IH5DU1JfRklGTzsKKwlkcmVncy0+Y3NyIHw9IENTUl9GSUZPOworCQorCS8qIHNldCBkaXJlY3Rpb24gKi8KKwlpZih3cml0ZV9mbGFnKQorCQlkcmVncy0+Y3NyIHw9IENTUl9TRU5EOworCWVsc2UKKwkJZHJlZ3MtPmNzciAmPSB+Q1NSX1NFTkQ7CisJCisJLyogYnl0ZSBjb3VudCBmb3IgZmlmbyAqLworCWRyZWdzLT5maWZvX2NvdW50ID0gY291bnQ7CisKKwlzdW4zX3VkY193cml0ZShVRENfUkVTRVQsIFVEQ19DU1IpOworCQorCS8qIHJlc2V0IGZpZm8gKi8KKwlkcmVncy0+Y3NyICY9IH5DU1JfRklGTzsKKwlkcmVncy0+Y3NyIHw9IENTUl9GSUZPOworCQorCWlmKGRyZWdzLT5maWZvX2NvdW50ICE9IGNvdW50KSB7IAorCQlwcmludGsoInNjc2klZDogZmlmb19taXNtYXRjaCAlMDR4IG5vdCAlMDR4XG4iLAorCQkgICAgICAgZGVmYXVsdF9pbnN0YW5jZS0+aG9zdF9ubywgZHJlZ3MtPmZpZm9fY291bnQsCisJCSAgICAgICAodW5zaWduZWQgaW50KSBjb3VudCk7CisJCU5DUjUzODBfcHJpbnQoZGVmYXVsdF9pbnN0YW5jZSk7CisJfQorCisJLyogc2V0dXAgdWRjICovCisjaWZkZWYgT0xERE1BCisJdWRjX3JlZ3MtPmFkZHJfaGkgPSAoKGR2bWFfdnRvYihkbWFidWYpICYgMHhmZjAwMDApID4+IDgpOworCXVkY19yZWdzLT5hZGRyX2xvID0gKGR2bWFfdnRvYihkbWFidWYpICYgMHhmZmZmKTsKKyNlbHNlCisJdWRjX3JlZ3MtPmFkZHJfaGkgPSAoKCh1bnNpZ25lZCBsb25nKShhZGRyKSAmIDB4ZmYwMDAwKSA+PiA4KTsKKwl1ZGNfcmVncy0+YWRkcl9sbyA9ICgodW5zaWduZWQgbG9uZykoYWRkcikgJiAweGZmZmYpOworI2VuZGlmCisJdWRjX3JlZ3MtPmNvdW50ID0gY291bnQvMjsgLyogY291bnQgaW4gd29yZHMgKi8KKwl1ZGNfcmVncy0+bW9kZV9oaSA9IFVEQ19NT0RFX0hJV09SRDsKKwlpZih3cml0ZV9mbGFnKSB7CisJCWlmKGNvdW50ICYgMSkKKwkJCXVkY19yZWdzLT5jb3VudCsrOworCQl1ZGNfcmVncy0+bW9kZV9sbyA9IFVEQ19NT0RFX0xTRU5EOworCQl1ZGNfcmVncy0+cnNlbCA9IFVEQ19SU0VMX1NFTkQ7CisJfSBlbHNlIHsKKwkJdWRjX3JlZ3MtPm1vZGVfbG8gPSBVRENfTU9ERV9MUkVDVjsKKwkJdWRjX3JlZ3MtPnJzZWwgPSBVRENfUlNFTF9SRUNWOworCX0KKwkKKwkvKiBhbm5vdW5jZSBsb2NhdGlvbiBvZiByZWdzIGJsb2NrICovCisJc3VuM191ZGNfd3JpdGUoKChkdm1hX3Z0b2IodWRjX3JlZ3MpICYgMHhmZjAwMDApID4+IDgpLAorCQkgICAgICAgVURDX0NITl9ISSk7IAorCisJc3VuM191ZGNfd3JpdGUoKGR2bWFfdnRvYih1ZGNfcmVncykgJiAweGZmZmYpLCBVRENfQ0hOX0xPKTsKKworCS8qIHNldCBkbWEgbWFzdGVyIG9uICovCisJc3VuM191ZGNfd3JpdGUoMHhkLCBVRENfTU9ERSk7CisKKwkvKiBpbnRlcnJ1cHQgZW5hYmxlICovCisJc3VuM191ZGNfd3JpdGUoVURDX0lOVF9FTkFCTEUsIFVEQ19DU1IpOworCQorICAgICAgIAlyZXR1cm4gY291bnQ7CisKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV9jb3VudChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXNpZDsKKworCWRyZWdzLT51ZGNfYWRkciA9IDB4MzI7IAorCXVkZWxheShTVU4zX0RNQV9ERUxBWSk7CisJcmVzaWQgPSBkcmVncy0+dWRjX2RhdGE7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwlyZXNpZCAqPSAyOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSByZXNpZDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV9yZXNpZHVhbChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlyZXR1cm4gbGFzdF9yZXNpZHVhbDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV94ZmVyX2xlbih1bnNpZ25lZCBsb25nIHdhbnRlZCwgU2NzaV9DbW5kICpjbWQsCisJCQkJICAgIGludCB3cml0ZV9mbGFnKQoreworCWlmKGNtZC0+cmVxdWVzdC0+ZmxhZ3MgJiBSRVFfQ01EKQorIAkJcmV0dXJuIHdhbnRlZDsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdW4zc2NzaV9kbWFfc3RhcnQodW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKworICAgIHN1bjNfdWRjX3dyaXRlKFVEQ19DSE5fU1RBUlQsIFVEQ19DU1IpOworICAgIAorICAgIHJldHVybiAwOworfQorCisvKiBjbGVhbiB1cCBhZnRlciBvdXIgZG1hIGlzIGRvbmUgKi8KK3N0YXRpYyBpbnQgc3VuM3Njc2lfZG1hX2ZpbmlzaChpbnQgd3JpdGVfZmxhZykKK3sKKwl1bnNpZ25lZCBzaG9ydCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBmaWZvOworCWludCByZXQgPSAwOworCQorCXN1bjNfZG1hX2FjdGl2ZSA9IDA7CisjaWYgMQorCS8vIGNoZWNrIHRvIGVtcHR5IHRoZSBmaWZvIG9uIGEgcmVhZAorCWlmKCF3cml0ZV9mbGFnKSB7CisJCWludCB0bW8gPSAyMDAwMDsgLyogLjIgc2VjICovCisJCQorCQl3aGlsZSgxKSB7CisJCQlpZihkcmVncy0+Y3NyICYgQ1NSX0ZJRk9fRU1QVFkpCisJCQkJYnJlYWs7CisKKwkJCWlmKC0tdG1vIDw9IDApIHsKKwkJCQlwcmludGsoInN1bjNzY3NpOiBmaWZvIGZhaWxlZCB0byBlbXB0eSFcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJdWRlbGF5KDEwKTsKKwkJfQorCX0KKwkJCisjZW5kaWYKKworCWNvdW50ID0gc3VuM3Njc2lfZG1hX2NvdW50KGRlZmF1bHRfaW5zdGFuY2UpOworI2lmZGVmIE9MRERNQQorCisJLyogaWYgd2UndmUgZmluaXNoZWQgYSByZWFkLCBjb3B5IG91dCB0aGUgZGF0YSB3ZSByZWFkICovCisgCWlmKHN1bjNfZG1hX29yaWdfYWRkcikgeworCQkvKiBjaGVjayBmb3IgcmVzaWR1YWwgYnl0ZXMgYWZ0ZXIgZG1hIGVuZCAqLworCQlpZihjb3VudCAmJiAoTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykgJgorCQkJICAgICAoQkFTUl9QSEFTRV9NQVRDSCB8IEJBU1JfQUNLKSkpIHsKKwkJCXByaW50aygic2NzaSVkOiBzdW4zX3Njc2lfZmluaXNoOiByZWFkIG92ZXJydW4gYmFieS4uLiAiLCBkZWZhdWx0X2luc3RhbmNlLT5ob3N0X25vKTsKKwkJCXByaW50aygiYmFzciBub3cgJTAyeFxuIiwgTkNSNTM4MF9yZWFkKEJVU19BTkRfU1RBVFVTX1JFRykpOworCQkJcmV0ID0gY291bnQ7CisJCX0KKwkJCisJCS8qIGNvcHkgaW4gd2hhdCB3ZSBkbWEnZCBubyBtYXR0ZXIgd2hhdCAqLworCQltZW1jcHkoc3VuM19kbWFfb3JpZ19hZGRyLCBkbWFidWYsIHN1bjNfZG1hX29yaWdfY291bnQpOworCQlzdW4zX2RtYV9vcmlnX2FkZHIgPSBOVUxMOworCisJfQorI2Vsc2UKKworCWZpZm8gPSBkcmVncy0+Zmlmb19jb3VudDsKKwlsYXN0X3Jlc2lkdWFsID0gZmlmbzsKKworCS8qIGVtcHR5IGJ5dGVzIGZyb20gdGhlIGZpZm8gd2hpY2ggZGlkbid0IG1ha2UgaXQgKi8KKwlpZigoIXdyaXRlX2ZsYWcpICYmIChjb3VudCAtIGZpZm8pID09IDIpIHsKKwkJdW5zaWduZWQgc2hvcnQgZGF0YTsKKwkJdW5zaWduZWQgY2hhciAqdmFkZHI7CisKKwkJZGF0YSA9IGRyZWdzLT5maWZvX2RhdGE7CisJCXZhZGRyID0gKHVuc2lnbmVkIGNoYXIgKilkdm1hX2J0b3Yoc3VuM19kbWFfb3JpZ19hZGRyKTsKKwkJCisJCXZhZGRyICs9IChzdW4zX2RtYV9vcmlnX2NvdW50IC0gZmlmbyk7CisKKwkJdmFkZHJbLTJdID0gKGRhdGEgJiAweGZmMDApID4+IDg7CisJCXZhZGRyWy0xXSA9IChkYXRhICYgMHhmZik7CisJfQorCisJZHZtYV91bm1hcChzdW4zX2RtYV9vcmlnX2FkZHIpOworCXN1bjNfZG1hX29yaWdfYWRkciA9IE5VTEw7CisjZW5kaWYKKwlzdW4zX3VkY193cml0ZShVRENfUkVTRVQsIFVEQ19DU1IpOworCWRyZWdzLT5maWZvX2NvdW50ID0gMDsKKwlkcmVncy0+Y3NyICY9IH5DU1JfU0VORDsKKworCS8qIHJlc2V0IGZpZm8gKi8KKwlkcmVncy0+Y3NyICY9IH5DU1JfRklGTzsKKwlkcmVncy0+Y3NyIHw9IENTUl9GSUZPOworCQorCXN1bjNfZG1hX3NldHVwX2RvbmUgPSBOVUxMOworCisJcmV0dXJuIHJldDsKKworfQorCQorI2luY2x1ZGUgInN1bjNfTkNSNTM4MC5jIgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCT0gU1VOM19TQ1NJX05BTUUsCisJLmRldGVjdAkJCT0gc3VuM3Njc2lfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IHN1bjNzY3NpX3JlbGVhc2UsCisJLmluZm8JCQk9IHN1bjNzY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZAkJPSBzdW4zc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyICAgICAgCT0gc3VuM3Njc2lfYWJvcnQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyICAJPSBzdW4zc2NzaV9idXNfcmVzZXQsCisJLmNhbl9xdWV1ZQkJPSBDQU5fUVVFVUUsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX1RBQkxFU0laRSwKKwkuY21kX3Blcl9sdW4JCT0gQ01EX1BFUl9MVU4sCisJLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORworfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTI4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmgKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBTdW4zIFNDU0kgc3R1ZmYgYnkgRXJpayBWZXJicnVnZ2VuIChlcmlrQGJpZ21hbWEueHRkbmV0Lm5sKQorICoKKyAqIFN1bjMgRE1BIGFkZGl0aW9ucyBieSBTYW0gQ3JlYXNleSAoc2FtbXlAc2FtbXkubmV0KQorICoKKyAqIEFkYXB0ZWQgZnJvbSBtYWNfc2NzaW5ldy5oOgorICovCisvKgorICogQ3VtYW5hIEdlbmVyaWMgTkNSNTM4MCBkcml2ZXIgZGVmaW5lcworICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBBTFBIQSBSRUxFQVNFIDEuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0CisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqICRMb2c6IGN1bWFuYV9OQ1I1MzgwLmgsdiAkCisgKi8KKworI2lmbmRlZiBTVU4zX05DUjUzODBfSAorI2RlZmluZSBTVU4zX05DUjUzODBfSAorCisjZGVmaW5lIFNVTjNTQ1NJX1BVQkxJQ19SRUxFQVNFIDEKKworLyoKKyAqIEludDogbGV2ZWwgMiBhdXRvdmVjdG9yCisgKiBJTzogdHlwZSAxLCBiYXNlIDB4MDAxNDAwMDAsIDUgYml0cyBwaHlzIHNwYWNlOiBBPDQuLjA+CisgKi8KKyNkZWZpbmUgSVJRX1NVTjNfU0NTSSAyCisjZGVmaW5lIElPQkFTRV9TVU4zX1NDU0kgMHgwMDE0MDAwMAorCisjZGVmaW5lIElPQkFTRV9TVU4zX1ZNRVNDU0kgMHhmZjIwMDAwMAorCitzdGF0aWMgaW50IHN1bjNzY3NpX2Fib3J0IChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN1bjNzY3NpX2RldGVjdCAoU2NzaV9Ib3N0X1RlbXBsYXRlICopOworc3RhdGljIGNvbnN0IGNoYXIgKnN1bjNzY3NpX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKik7CitzdGF0aWMgaW50IHN1bjNzY3NpX2J1c19yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN1bjNzY3NpX3F1ZXVlX2NvbW1hbmQgKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBpbnQgc3VuM3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqKTsKKworI2lmbmRlZiBDTURfUEVSX0xVTgorI2RlZmluZSBDTURfUEVSX0xVTiAyCisjZW5kaWYKKworI2lmbmRlZiBDQU5fUVVFVUUKKyNkZWZpbmUgQ0FOX1FVRVVFIDE2CisjZW5kaWYKKworI2lmbmRlZiBTR19UQUJMRVNJWkUKKyNkZWZpbmUgU0dfVEFCTEVTSVpFIFNHX05PTkUKKyNlbmRpZgorCisjaWZuZGVmIE1BWF9UQUdTCisjZGVmaW5lIE1BWF9UQUdTIDMyCisjZW5kaWYKKworI2lmbmRlZiBVU0VfVEFHR0VEX1FVRVVJTkcKKyNkZWZpbmUJVVNFX1RBR0dFRF9RVUVVSU5HIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNpZmRlZiBTVU4zX1NDU0lfVk1FCisjZGVmaW5lIFNVTjNfU0NTSV9OQU1FICJTdW4zIE5DUjUzODAgVk1FIFNDU0kiCisjZWxzZQorI2RlZmluZSBTVU4zX1NDU0lfTkFNRSAiU3VuMyBOQ1I1MzgwIFNDU0kiCisjZW5kaWYKKworI2lmbmRlZiBIT1NUU19DCisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgXAorICAgIGludCBwb3J0LCBjdHJsCisKKyNkZWZpbmUgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCkgXAorICAgICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpfaW5zdGFuY2UKKworI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKSBcCisgICAgICAgIF9pbnN0YW5jZSA9IGluc3RhbmNlCisKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgc3VuM3Njc2lfcmVhZChyZWcpCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgc3VuM3Njc2lfd3JpdGUocmVnLCB2YWx1ZSkKKworI2RlZmluZSBOQ1I1MzgwX2ludHIgc3VuM3Njc2lfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgc3VuM3Njc2lfcXVldWVfY29tbWFuZAorI2RlZmluZSBOQ1I1MzgwX2J1c19yZXNldCBzdW4zc2NzaV9idXNfcmVzZXQKKyNkZWZpbmUgTkNSNTM4MF9hYm9ydCBzdW4zc2NzaV9hYm9ydAorI2RlZmluZSBOQ1I1MzgwX3Byb2NfaW5mbyBzdW4zc2NzaV9wcm9jX2luZm8KKyNkZWZpbmUgTkNSNTM4MF9kbWFfeGZlcl9sZW4oaSwgY21kLCBwaGFzZSkgXAorICAgICAgICBzdW4zc2NzaV9kbWFfeGZlcl9sZW4oY21kLT5TQ3AudGhpc19yZXNpZHVhbCxjbWQsKChwaGFzZSkgJiBTUl9JTykgPyAwIDogMSkKKworI2RlZmluZSBOQ1I1MzgwX2RtYV93cml0ZV9zZXR1cChpbnN0YW5jZSwgZGF0YSwgY291bnQpIHN1bjNzY3NpX2RtYV9zZXR1cChkYXRhLCBjb3VudCwgMSkKKyNkZWZpbmUgTkNSNTM4MF9kbWFfcmVhZF9zZXR1cChpbnN0YW5jZSwgZGF0YSwgY291bnQpIHN1bjNzY3NpX2RtYV9zZXR1cChkYXRhLCBjb3VudCwgMCkKKyNkZWZpbmUgTkNSNTM4MF9kbWFfcmVzaWR1YWwgc3VuM3Njc2lfZG1hX3Jlc2lkdWFsCisKKyNkZWZpbmUgQk9BUkRfTk9STUFMCTAKKyNkZWZpbmUgQk9BUkRfTkNSNTNDNDAwCTEKKworLyogYWRkaXRpb25hbCByZWdpc3RlcnMgLSBtYWlubHkgRE1BIGNvbnRyb2wgcmVncyAqLworLyogdGhlc2Ugc3RhcnQgYXQgcmVnYmFzZSArIDggLS0gZGlyZWN0bHkgYWZ0ZXIgdGhlIE5DUiByZWdzICovCitzdHJ1Y3Qgc3VuM19kbWFfcmVncyB7CisJdW5zaWduZWQgc2hvcnQgZG1hX2FkZHJfaGk7IC8qIHZtZSBvbmx5ICovCisJdW5zaWduZWQgc2hvcnQgZG1hX2FkZHJfbG87IC8qIHZtZSBvbmx5ICovCisJdW5zaWduZWQgc2hvcnQgZG1hX2NvdW50X2hpOyAvKiB2bWUgb25seSAqLworCXVuc2lnbmVkIHNob3J0IGRtYV9jb3VudF9sbzsgLyogdm1lIG9ubHkgKi8KKwl1bnNpZ25lZCBzaG9ydCB1ZGNfZGF0YTsgLyogdWRjIGRtYSBkYXRhIHJlZyAob2JpbyBvbmx5KSAqLworCXVuc2lnbmVkIHNob3J0IHVkY19hZGRyOyAvKiB1ZGEgZG1hIGFkZHIgcmVnIChvYmlvIG9ubHkpICovCisJdW5zaWduZWQgc2hvcnQgZmlmb19kYXRhOyAvKiBmaWZvIGRhdGEgcmVnLCBob2xkcyBleHRyYSBieXRlIG9uCisJCQkJICAgICBvZGQgZG1hIHJlYWRzICovCisJdW5zaWduZWQgc2hvcnQgZmlmb19jb3VudDsgCisJdW5zaWduZWQgc2hvcnQgY3NyOyAvKiBjb250cm9sL3N0YXR1cyByZWcgKi8KKwl1bnNpZ25lZCBzaG9ydCBicGFja19oaTsgLyogdm1lIG9ubHkgKi8KKwl1bnNpZ25lZCBzaG9ydCBicGFja19sbzsgLyogdm1lIG9ubHkgKi8KKwl1bnNpZ25lZCBzaG9ydCBpdmVjdDsgLyogdm1lIG9ubHkgKi8KKwl1bnNpZ25lZCBzaG9ydCBmaWZvX2NvdW50X2hpOyAvKiB2bWUgb25seSAqLworfTsKKworLyogdWNkIGNoaXAgc3BlY2lmaWMgcmVncyAtIGxpdmUgaW4gZHZtYSBzcGFjZSAqLworc3RydWN0IHN1bjNfdWRjX3JlZ3MgeworICAgICB1bnNpZ25lZCBzaG9ydCByc2VsOyAvKiBzZWxlY3QgcmVncyB0byBsb2FkICovCisgICAgIHVuc2lnbmVkIHNob3J0IGFkZHJfaGk7IC8qIGhpZ2ggd29yZCBvZiBhZGRyICovCisgICAgIHVuc2lnbmVkIHNob3J0IGFkZHJfbG87IC8qIGxvdyB3b3JkICovCisgICAgIHVuc2lnbmVkIHNob3J0IGNvdW50OyAvKiB3b3JkcyB0byBiZSB4ZmVyJ2QgKi8KKyAgICAgdW5zaWduZWQgc2hvcnQgbW9kZV9oaTsgLyogaGlnaCB3b3JkIG9mIGNoYW5uZWwgbW9kZSAqLworICAgICB1bnNpZ25lZCBzaG9ydCBtb2RlX2xvOyAvKiBsb3cgd29yZCBvZiBjaGFubmVsIG1vZGUgKi8KK307CisKKy8qIGFkZHJlc3NlcyBvZiB0aGUgdWRjIHJlZ2lzdGVycyAqLworI2RlZmluZSBVRENfTU9ERSAweDM4IAorI2RlZmluZSBVRENfQ1NSIDB4MmUgLyogY29tbWFuZC9zdGF0dXMgKi8KKyNkZWZpbmUgVURDX0NITl9ISSAweDI2IC8qIGNoYWluIGhpZ2ggd29yZCAqLworI2RlZmluZSBVRENfQ0hOX0xPIDB4MjIgLyogY2hhaW4gbG8gd29yZCAqLworI2RlZmluZSBVRENfQ1VSQV9ISSAweDFhIC8qIGN1ciByZWcgQSBoaWdoICovCisjZGVmaW5lIFVEQ19DVVJBX0xPIDB4MGEgLyogY3VyIHJlZyBBIGxvdyAqLworI2RlZmluZSBVRENfQ1VSQl9ISSAweDEyIC8qIGN1ciByZWcgQiBoaWdoICovCisjZGVmaW5lIFVEQ19DVVJCX0xPIDB4MDIgLyogY3VyIHJlZyBCIGxvdyAqLworI2RlZmluZSBVRENfTU9ERV9ISSAweDU2IC8qIG1vZGUgcmVnIGhpZ2ggKi8KKyNkZWZpbmUgVURDX01PREVfTE8gMHg1MiAvKiBtb2RlIHJlZyBsb3cgKi8KKyNkZWZpbmUgVURDX0NPVU5UIDB4MzIgLyogd29yZHMgdG8geGZlciAqLworCisvKiBzb21lIHVkYyBjb21tYW5kcyAqLworI2RlZmluZSBVRENfUkVTRVQgMAorI2RlZmluZSBVRENfQ0hOX1NUQVJUIDB4YTAgLyogc3RhcnQgY2hhaW4gKi8KKyNkZWZpbmUgVURDX0lOVF9FTkFCTEUgMHgzMiAvKiBjaGFubmVsIDEgaW50IG9uICovCisKKy8qIHVkYyBtb2RlIHdvcmRzICovCisjZGVmaW5lIFVEQ19NT0RFX0hJV09SRCAweDQwCisjZGVmaW5lIFVEQ19NT0RFX0xTRU5EIDB4YzIKKyNkZWZpbmUgVURDX01PREVfTFJFQ1YgMHhkMgorCisvKiB1ZGMgcmVnIHNlbGVjdGlvbnMgKi8KKyNkZWZpbmUgVURDX1JTRUxfU0VORCAweDI4MgorI2RlZmluZSBVRENfUlNFTF9SRUNWIDB4MTgyCisKKy8qIGJpdHMgaW4gY3NyIHJlZyAqLworI2RlZmluZSBDU1JfRE1BX0FDVElWRSAweDgwMDAKKyNkZWZpbmUgQ1NSX0RNQV9DT05GTElDVCAweDQwMDAKKyNkZWZpbmUgQ1NSX0RNQV9CVVNFUlIgMHgyMDAwCisKKyNkZWZpbmUgQ1NSX0ZJRk9fRU1QVFkgMHg0MDAgLyogZmlmbyBmbHVzaGVkPyAqLworI2RlZmluZSBDU1JfU0RCX0lOVCAweDIwMCAvKiBzYmMgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgQ1NSX0RNQV9JTlQgMHgxMDAgLyogZG1hIGludGVycnVwdCBwZW5kaW5nICovCisKKyNkZWZpbmUgQ1NSX0xFRlQgMHhjMAorI2RlZmluZSBDU1JfTEVGVF8zIDB4YzAKKyNkZWZpbmUgQ1NSX0xFRlRfMiAweDgwCisjZGVmaW5lIENTUl9MRUZUXzEgMHg0MAorI2RlZmluZSBDU1JfUEFDS19FTkFCTEUgMHgyMAorCisjZGVmaW5lIENTUl9ETUFfRU5BQkxFIDB4MTAKKworI2RlZmluZSBDU1JfU0VORCAweDggLyogMSA9IHNlbmQgIDAgPSByZWN2ICovCisjZGVmaW5lIENTUl9GSUZPIDB4MiAvKiByZXNldCBmaWZvICovCisjZGVmaW5lIENTUl9JTlRSIDB4NCAvKiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIENTUl9TQ1NJIDB4MSAKKworI2RlZmluZSBWTUVfREFUQTI0IDB4M2QwMAorCisvLyBkZWJ1Z2dpbmcgcHJpbnRrJ3MsIHRha2VuIGZyb20gYXRhcmlfc2NzaS5oIAorLyogRGVidWdnaW5nIHByaW50ayBkZWZpbml0aW9uczoKKyAqCisgKiAgQVJCICAtPiBhcmJpdHJhdGlvbgorICogIEFTRU4gLT4gYXV0by1zZW5zZQorICogIERNQSAgLT4gRE1BCisgKiAgSFNIICAtPiBQSU8gaGFuZHNoYWtlCisgKiAgSU5GICAtPiBpbmZvcm1hdGlvbiB0cmFuc2ZlcgorICogIElOSSAgLT4gaW5pdGlhbGl6YXRpb24KKyAqICBJTlQgIC0+IGludGVycnVwdAorICogIExOSyAgLT4gbGlua2VkIGNvbW1hbmRzCisgKiAgTUFJTiAtPiBOQ1I1MzgwX21haW4oKSBjb250cm9sIGZsb3cKKyAqICBOREFUIC0+IG5vIGRhdGEtb3V0IHBoYXNlCisgKiAgTldSICAtPiBubyB3cml0ZSBjb21tYW5kcworICogIFBJTyAgLT4gUElPIHRyYW5zZmVycworICogIFBETUEgLT4gcHNldWRvIERNQSAodW51c2VkIG9uIEF0YXJpKQorICogIFFVICAgLT4gcXVldWVzCisgKiAgUlNMICAtPiByZXNlbGVjdGlvbnMKKyAqICBTRUwgIC0+IHNlbGVjdGlvbnMKKyAqICBVU0wgIC0+IHVzbGVlcCBjcGRlICh1bnVzZWQgb24gQXRhcmkpCisgKiAgTEJTICAtPiBsYXN0IGJ5dGUgc2VudCAodW51c2VkIG9uIEF0YXJpKQorICogIFJTUyAgLT4gcmVzdGFydGluZyBvZiBzZWxlY3Rpb25zCisgKiAgRVhUICAtPiBleHRlbmRlZCBtZXNzYWdlcworICogIEFCUlQgLT4gYWJvcnRpbmcgYW5kIHJlc2V0dGluZworICogIFRBRyAgLT4gcXVldWUgdGFnIGhhbmRsaW5nCisgKiAgTUVSICAtPiBtZXJnaW5nIG9mIGNvbnNlYy4gYnVmZmVycworICoKKyAqLworCisKKworI2lmIE5ERUJVRyAmIE5ERUJVR19BUkJJVFJBVElPTgorI2RlZmluZSBBUkJfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBBUkJfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19BVVRPU0VOU0UKKyNkZWZpbmUgQVNFTl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEFTRU5fUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19ETUEKKyNkZWZpbmUgRE1BX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRE1BX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfSEFORFNIQUtFCisjZGVmaW5lIEhTSF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIEhTSF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0lORk9STUFUSU9OCisjZGVmaW5lIElORl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIElORl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX0lOSVQKKyNkZWZpbmUgSU5JX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSU5JX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfSU5UUgorI2RlZmluZSBJTlRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBJTlRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19MSU5LRUQKKyNkZWZpbmUgTE5LX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTE5LX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTUFJTgorI2RlZmluZSBNQUlOX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTUFJTl9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX05PX0RBVEFPVVQKKyNkZWZpbmUgTkRBVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIE5EQVRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19OT19XUklURQorI2RlZmluZSBOV1JfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBOV1JfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19QSU8KKyNkZWZpbmUgUElPX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUElPX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfUFNFVURPX0RNQQorI2RlZmluZSBQRE1BX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUERNQV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1FVRVVFUworI2RlZmluZSBRVV9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFFVX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfUkVTRUxFQ1RJT04KKyNkZWZpbmUgUlNMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUlNMX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfU0VMRUNUSU9OCisjZGVmaW5lIFNFTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFNFTF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1VTTEVFUAorI2RlZmluZSBVU0xfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBVU0xfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19MQVNUX0JZVEVfU0VOVAorI2RlZmluZSBMQlNfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBMQlNfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19SRVNUQVJUX1NFTEVDVAorI2RlZmluZSBSU1NfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBSU1NfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19FWFRFTkRFRAorI2RlZmluZSBFWFRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBFWFRfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorI2lmIE5ERUJVRyAmIE5ERUJVR19BQk9SVAorI2RlZmluZSBBQlJUX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgQUJSVF9QUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgTkRFQlVHICYgTkRFQlVHX1RBR1MKKyNkZWZpbmUgVEFHX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgVEFHX1BSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKyNpZiBOREVCVUcgJiBOREVCVUdfTUVSR0lORworI2RlZmluZSBNRVJfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBNRVJfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBjb25kaXRpb25hbCBtYWNyb3MgZm9yIE5DUjUzODBfcHJpbnRfeyxwaGFzZSxzdGF0dXN9ICovCisKKyNkZWZpbmUgTkNSX1BSSU5UKG1hc2spCVwKKwkoKE5ERUJVRyAmIChtYXNrKSkgPyBOQ1I1MzgwX3ByaW50KGluc3RhbmNlKSA6ICh2b2lkKTApCisKKyNkZWZpbmUgTkNSX1BSSU5UX1BIQVNFKG1hc2spIFwKKwkoKE5ERUJVRyAmIChtYXNrKSkgPyBOQ1I1MzgwX3ByaW50X3BoYXNlKGluc3RhbmNlKSA6ICh2b2lkKTApCisKKyNkZWZpbmUgTkNSX1BSSU5UX1NUQVRVUyhtYXNrKSBcCisJKChOREVCVUcgJiAobWFzaykpID8gTkNSNTM4MF9wcmludF9zdGF0dXMoaW5zdGFuY2UpIDogKHZvaWQpMCkKKworCisKKyNlbmRpZiAvKiBuZGVmIEhPU1RTX0MgKi8KKyNlbmRpZiAvKiBTVU4zX05DUjUzODBfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM19zY3NpX3ZtZS5jIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNiNWRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYwpAQCAtMCwwICsxLDU4NCBAQAorIC8qCisgKiBTdW4zIFNDU0kgc3R1ZmYgYnkgRXJpayBWZXJicnVnZ2VuIChlcmlrQGJpZ21hbWEueHRkbmV0Lm5sKQorICoKKyAqIFN1bjMgRE1BIHJvdXRpbmVzIGFkZGVkIGJ5IFNhbSBDcmVhc2V5IChzYW1teUBzYW1teS5uZXQpCisgKgorICogVk1FIHN1cHBvcnQgYWRkZWQgYnkgU2FtIENyZWFzZXkKKyAqCisgKiBBZGFwdGVkIGZyb20gc3VuM19zY3NpLmMgLS0gc2VlIHRoZXJlIGZvciBvdGhlciBoZWFkZXJzCisgKgorICogVE9ETzogbW9kaWZ5IHRoaXMgZHJpdmVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgU3VuMyBTQ1NJIFZNRSBib2FyZHMKKyAqCisgKi8KKworI2RlZmluZSBBVVRPU0VOU0UKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vc3VuM2ludHMuaD4KKyNpbmNsdWRlIDxhc20vZHZtYS5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KKworI2RlZmluZSBTVU4zX1NDU0lfVk1FCisKKyN1bmRlZiBTVU4zX1NDU0lfREVCVUcKKworLyogZG1hIG9uISAqLworI2RlZmluZSBSRUFMX0RNQQorCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAic3VuM19zY3NpLmgiCisjaW5jbHVkZSAiTkNSNTM4MC5oIgorCitleHRlcm4gaW50IHN1bjNfbWFwX3Rlc3QodW5zaWduZWQgbG9uZywgY2hhciAqKTsKKworI2RlZmluZSBVU0VfV1JBUFBFUgorLyojZGVmaW5lIFJFU0VUX0JPT1QgKi8KKyNkZWZpbmUgRFJJVkVSX1NFVFVQCisKKyNkZWZpbmUgTkRFQlVHIDAKKworLyoKKyAqIEJVRyBjYW4gYmUgdXNlZCB0byB0cmlnZ2VyIGEgc3RyYW5nZSBjb2RlLXNpemUgcmVsYXRlZCBoYW5nIG9uIDIuMSBrZXJuZWxzCisgKi8KKyNpZmRlZiBCVUcKKyN1bmRlZiBSRVNFVF9CT09UCisjdW5kZWYgRFJJVkVSX1NFVFVQCisjZW5kaWYKKworLyogI2RlZmluZSBTVVBQT1JUX1RBR1MgKi8KKworLy8jZGVmaW5lCUVOQUJMRV9JUlEoKQllbmFibGVfaXJxKCBTVU4zX1ZFQ19WTUVTQ1NJMCApOyAKKyNkZWZpbmUgRU5BQkxFX0lSUSgpCisKKworc3RhdGljIGlycXJldHVybl90IHNjc2lfc3VuM19pbnRyKGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN1bjNzY3NpX3JlYWQoaW50IHJlZyk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3VuM3Njc2lfd3JpdGUoaW50IHJlZywgaW50IHZhbHVlKTsKKworc3RhdGljIGludCBzZXR1cF9jYW5fcXVldWUgPSAtMTsKK21vZHVsZV9wYXJhbShzZXR1cF9jYW5fcXVldWUsIGludCwgMCk7CitzdGF0aWMgaW50IHNldHVwX2NtZF9wZXJfbHVuID0gLTE7Cittb2R1bGVfcGFyYW0oc2V0dXBfY21kX3Blcl9sdW4sIGludCwgMCk7CitzdGF0aWMgaW50IHNldHVwX3NnX3RhYmxlc2l6ZSA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX3NnX3RhYmxlc2l6ZSwgaW50LCAwKTsKKyNpZmRlZiBTVVBQT1JUX1RBR1MKK3N0YXRpYyBpbnQgc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gLTE7Cittb2R1bGVfcGFyYW0oc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nLCBpbnQsIDApOworI2VuZGlmCitzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOworbW9kdWxlX3BhcmFtKHNldHVwX2hvc3RpZCwgaW50LCAwKTsKKworc3RhdGljIFNjc2lfQ21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CisKKyNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCisKKy8qIG1zIHRvIHdhaXQgYWZ0ZXIgaGl0dGluZyBkbWEgcmVncyAqLworI2RlZmluZSBTVU4zX0RNQV9ERUxBWSAxMAorCisvKiBkdm1hIGJ1ZmZlciB0byBhbGxvY2F0ZSAtLSAzMmsgc2hvdWxkIGhvcGVmdWxseSBiZSBtb3JlIHRoYW4gc3VmZmljaWVudCAqLworI2RlZmluZSBTVU4zX0RWTUFfQlVGU0laRSAweGUwMDAKKworLyogbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gZG8gZG1hIG9uICovCisjZGVmaW5lIFNVTjNfRE1BX01JTlNJWkUgMTI4CisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpzdW4zX3Njc2lfcmVncDsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3Qgc3VuM19kbWFfcmVncyAqZHJlZ3M7CisjaWZkZWYgT0xERE1BCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZG1hYnVmID0gTlVMTDsgLyogZG1hIG1lbW9yeSBidWZmZXIgKi8KKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGNoYXIgKnN1bjNfZG1hX29yaWdfYWRkciA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdW4zX2RtYV9vcmlnX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgc3VuM19kbWFfYWN0aXZlID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfcmVzaWR1YWwgPSAwOworCisvKgorICogTkNSIDUzODAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzdW4zc2NzaV9yZWFkKGludCByZWcpCit7CisJcmV0dXJuKCBzdW4zX3Njc2lfcmVncFtyZWddICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdW4zc2NzaV93cml0ZShpbnQgcmVnLCBpbnQgdmFsdWUpCit7CisJc3VuM19zY3NpX3JlZ3BbcmVnXSA9IHZhbHVlOworfQorCisvKgorICogWFhYOiBzdGF0dXMgZGVidWcKKyAqLworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKmRlZmF1bHRfaW5zdGFuY2U7CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCBzdW4zc2NzaV9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKKyAqCisgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZXMgbWFjIE5DUjUzODAgZHJpdmVyIGJhc2VkIG9uIHRoZQorICoJY29tbWFuZCBsaW5lIC8gY29tcGlsZSB0aW1lIHBvcnQgYW5kIGlycSBkZWZpbml0aW9ucy4KKyAqCisgKiBJbnB1dHMgOiB0cG50IC0gdGVtcGxhdGUgZm9yIHRoaXMgU0NTSSBhZGFwdGVyLgorICoKKyAqIFJldHVybnMgOiAxIGlmIGEgaG9zdCBhZGFwdGVyIHdhcyBmb3VuZCwgMCBpZiBub3QuCisgKgorICovCisgCitzdGF0aWMgaW50IHN1bjNzY3NpX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKiB0cG50KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpcnEgPSAwOworCXN0YXRpYyBpbnQgY2FsbGVkID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGFkZHJzWzNdID0geyBJT0JBU0VfU1VOM19WTUVTQ1NJLCAKKwkJCQkgICBJT0JBU0VfU1VOM19WTUVTQ1NJICsgMHg0MDAwLAorCQkJCSAgIDAgfTsKKwl1bnNpZ25lZCBsb25nIHZlY3NbM10gPSB7IFNVTjNfVkVDX1ZNRVNDU0kwLAorCQkJCSAgU1VOM19WRUNfVk1FU0NTSTEsCisJCQkJICAwIH07CisJLyogY2hlY2sgdGhhdCB0aGlzIG1hY2hpbmUgaGFzIGFuIG9uYm9hcmQgNTM4MCAqLworCXN3aXRjaChpZHByb20tPmlkX21hY2h0eXBlKSB7CisJY2FzZSBTTV9TVU4zfFNNXzNfMTYwOgorCWNhc2UgU01fU1VOM3xTTV8zXzI2MDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZihjYWxsZWQpCisJCXJldHVybiAwOworCisJdHBudC0+cHJvY19uYW1lID0gIlN1bjMgNTM4MCBWTUUgU0NTSSI7CisKKwkvKiBzZXR1cCB2YXJpYWJsZXMgKi8KKwl0cG50LT5jYW5fcXVldWUgPQorCQkoc2V0dXBfY2FuX3F1ZXVlID4gMCkgPyBzZXR1cF9jYW5fcXVldWUgOiBDQU5fUVVFVUU7CisJdHBudC0+Y21kX3Blcl9sdW4gPQorCQkoc2V0dXBfY21kX3Blcl9sdW4gPiAwKSA/IHNldHVwX2NtZF9wZXJfbHVuIDogQ01EX1BFUl9MVU47CisJdHBudC0+c2dfdGFibGVzaXplID0gCisJCShzZXR1cF9zZ190YWJsZXNpemUgPj0gMCkgPyBzZXR1cF9zZ190YWJsZXNpemUgOiBTR19UQUJMRVNJWkU7CisJCisJaWYgKHNldHVwX2hvc3RpZCA+PSAwKQorCQl0cG50LT50aGlzX2lkID0gc2V0dXBfaG9zdGlkOworCWVsc2UgeworCQkvKiB1c2UgNyBhcyBkZWZhdWx0ICovCisJCXRwbnQtPnRoaXNfaWQgPSA3OworCX0KKwkKKwlpb2FkZHIgPSAwOworCWZvcihpID0gMDsgYWRkcnNbaV0gIT0gMDsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgeDsKKwkJCisJCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKXN1bjNfaW9yZW1hcChhZGRyc1tpXSwgUEFHRV9TSVpFLAorCQkJCQkJICAgICBTVU4zX1BBR0VfVFlQRV9WTUUxNik7CisJCWlycSA9IHZlY3NbaV07CisJCXN1bjNfc2NzaV9yZWdwID0gKHVuc2lnbmVkIGNoYXIgKilpb2FkZHI7CisJCQorCQlkcmVncyA9IChzdHJ1Y3Qgc3VuM19kbWFfcmVncyAqKSgoKHVuc2lnbmVkIGNoYXIgKilpb2FkZHIpICsgOCk7CisJCQorCQlpZihzdW4zX21hcF90ZXN0KCh1bnNpZ25lZCBsb25nKWRyZWdzLCAmeCkpIHsKKwkJCXVuc2lnbmVkIHNob3J0IG9sZGNzcjsKKworCQkJb2xkY3NyID0gZHJlZ3MtPmNzcjsKKwkJCWRyZWdzLT5jc3IgPSAwOworCQkJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwkJCWlmKGRyZWdzLT5jc3IgPT0gMHgxNDAwKQorCQkJCWJyZWFrOworCQkJCisJCQlkcmVncy0+Y3NyID0gb2xkY3NyOworCQl9CisKKwkJaW91bm1hcCgodm9pZCAqKWlvYWRkcik7CisJCWlvYWRkciA9IDA7CisJfQorCisJaWYoIWlvYWRkcikKKwkJcmV0dXJuIDA7CisJCisjaWZkZWYgU1VQUE9SVF9UQUdTCisJaWYgKHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA8IDApCisJCXNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IFVTRV9UQUdHRURfUVVFVUlORzsKKyNlbmRpZgorCisJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKKwlpZihpbnN0YW5jZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkJCisJZGVmYXVsdF9pbnN0YW5jZSA9IGluc3RhbmNlOworCisgICAgICAgIGluc3RhbmNlLT5pb19wb3J0ID0gKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKKwlpbnN0YW5jZS0+aXJxID0gaXJxOworCisJTkNSNTM4MF9pbml0KGluc3RhbmNlLCAwKTsKKworCWluc3RhbmNlLT5uX2lvX3BvcnQgPSAzMjsKKworICAgICAgICAoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+Y3RybCA9IDA7CisKKwlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPmlycSwgc2NzaV9zdW4zX2ludHIsCisJCQkgICAgIDAsICJTdW4zU0NTSS01MzgwVk1FIiwgTlVMTCkpIHsKKyNpZm5kZWYgUkVBTF9ETUEKKwkJcHJpbnRrKCJzY3NpJWQ6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOworCQlpbnN0YW5jZS0+aXJxID0gU0NTSV9JUlFfTk9ORTsKKyNlbHNlCisJCXByaW50aygic2NzaSVkOiBJUlElZCBub3QgZnJlZSwgYmFpbGluZyBvdXRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7CisJCXJldHVybiAwOworI2VuZGlmCisJfQorCisJcHJpbnRrKCJzY3NpJWQ6IFN1bjMgNTM4MCBWTUUgYXQgcG9ydCAlbFggaXJxIiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pb19wb3J0KTsKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCQlwcmludGsgKCJzIGRpc2FibGVkIik7CisJZWxzZQorCQlwcmludGsgKCIgJWQiLCBpbnN0YW5jZS0+aXJxKTsKKwlwcmludGsoIiBvcHRpb25zIENBTl9RVUVVRT0lZCBDTURfUEVSX0xVTj0lZCByZWxlYXNlPSVkIiwKKwkgICAgICAgaW5zdGFuY2UtPmNhbl9xdWV1ZSwgaW5zdGFuY2UtPmNtZF9wZXJfbHVuLAorCSAgICAgICBTVU4zU0NTSV9QVUJMSUNfUkVMRUFTRSk7CisJcHJpbnRrKCJcbnNjc2klZDoiLCBpbnN0YW5jZS0+aG9zdF9ubyk7CisJTkNSNTM4MF9wcmludF9vcHRpb25zKGluc3RhbmNlKTsKKwlwcmludGsoIlxuIik7CisKKwlkcmVncy0+Y3NyID0gMDsKKwl1ZGVsYXkoU1VOM19ETUFfREVMQVkpOworCWRyZWdzLT5jc3IgPSBDU1JfU0NTSSB8IENTUl9GSUZPIHwgQ1NSX0lOVFI7CisJdWRlbGF5KFNVTjNfRE1BX0RFTEFZKTsKKwlkcmVncy0+Zmlmb19jb3VudCA9IDA7CisJZHJlZ3MtPmZpZm9fY291bnRfaGkgPSAwOworCWRyZWdzLT5kbWFfYWRkcl9oaSA9IDA7CisJZHJlZ3MtPmRtYV9hZGRyX2xvID0gMDsKKwlkcmVncy0+ZG1hX2NvdW50X2hpID0gMDsKKwlkcmVncy0+ZG1hX2NvdW50X2xvID0gMDsKKworCWRyZWdzLT5pdmVjdCA9IFZNRV9EQVRBMjQgfCAoaW5zdGFuY2UtPmlycSAmIDB4ZmYpOworCisJY2FsbGVkID0gMTsKKworI2lmZGVmIFJFU0VUX0JPT1QKKwlzdW4zX3Njc2lfcmVzZXRfYm9vdChpbnN0YW5jZSk7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitpbnQgc3VuM3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYgKHNocG50LT5pcnEgIT0gU0NTSV9JUlFfTk9ORSkKKwkJZnJlZV9pcnEgKHNocG50LT5pcnEsIE5VTEwpOworCisJaW91bm1hcCgodm9pZCAqKXN1bjNfc2NzaV9yZWdwKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgUkVTRVRfQk9PVAorLyoKKyAqIE91ciAnYnVzIHJlc2V0IG9uIGJvb3QnIGZ1bmN0aW9uCisgKi8KKworc3RhdGljIHZvaWQgc3VuM19zY3NpX3Jlc2V0X2Jvb3Qoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKwlOQ1I1MzgwX3NldHVwKGluc3RhbmNlKTsKKwkKKwkvKgorCSAqIERvIGEgU0NTSSByZXNldCB0byBjbGVhbiB1cCB0aGUgYnVzIGR1cmluZyBpbml0aWFsaXphdGlvbi4gTm8KKwkgKiBtZXNzaW5nIHdpdGggdGhlIHF1ZXVlcywgaW50ZXJydXB0cywgb3IgbG9ja3MgbmVjZXNzYXJ5IGhlcmUuCisJICovCisKKwlwcmludGsoICJTdW4zIFNDU0k6IHJlc2V0dGluZyB0aGUgU0NTSSBidXMuLi4iICk7CisKKwkvKiBzd2l0Y2ggb2ZmIFNDU0kgSVJRIC0gY2F0Y2ggYW4gaW50ZXJydXB0IHdpdGhvdXQgSVJRIGJpdCBzZXQgZWxzZSAqLworLy8gICAgICAgCXN1bjNfZGlzYWJsZV9pcnEoIElSUV9TVU4zX1NDU0kgKTsKKworCS8qIGdldCBpbiBwaGFzZSAqLworCU5DUjUzODBfd3JpdGUoIFRBUkdFVF9DT01NQU5EX1JFRywKKwkJICAgICAgUEhBU0VfU1JfVE9fVENSKCBOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgKSk7CisKKwkvKiBhc3NlcnQgUlNUICovCisJTkNSNTM4MF93cml0ZSggSU5JVElBVE9SX0NPTU1BTkRfUkVHLCBJQ1JfQkFTRSB8IElDUl9BU1NFUlRfUlNUICk7CisKKwkvKiBUaGUgbWluLiByZXNldCBob2xkIHRpbWUgaXMgMjV1cywgc28gNDB1cyBzaG91bGQgYmUgZW5vdWdoICovCisJdWRlbGF5KCA1MCApOworCisJLyogcmVzZXQgUlNUIGFuZCBpbnRlcnJ1cHQgKi8KKwlOQ1I1MzgwX3dyaXRlKCBJTklUSUFUT1JfQ09NTUFORF9SRUcsIElDUl9CQVNFICk7CisJTkNSNTM4MF9yZWFkKCBSRVNFVF9QQVJJVFlfSU5URVJSVVBUX1JFRyApOworCisJZm9yKCBlbmQgPSBqaWZmaWVzICsgQUZURVJfUkVTRVRfREVMQVk7IHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZCk7ICkKKwkJYmFycmllcigpOworCisJLyogc3dpdGNoIG9uIFNDU0kgSVJRIGFnYWluICovCisvLyAgICAgICAJc3VuM19lbmFibGVfaXJxKCBJUlFfU1VOM19TQ1NJICk7CisKKwlwcmludGsoICIgZG9uZVxuIiApOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICogc3VuM3Njc2lfaW5mbyAoc3RydWN0IFNjc2lfSG9zdCAqc3BudCkgeworICAgIHJldHVybiAiIjsKK30KKworLy8gc2FmZSBiaXRzIGZvciB0aGUgQ1NSCisjZGVmaW5lIENTUl9HT09EIDB4MDYwZgorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9zdW4zX2ludHIoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBjc3IgPSBkcmVncy0+Y3NyOworCWludCBoYW5kbGVkID0gMDsKKworCWRyZWdzLT5jc3IgJj0gfkNTUl9ETUFfRU5BQkxFOworCisKKyNpZmRlZiBTVU4zX1NDU0lfREVCVUcKKwlwcmludGsoInNjc2lfaW50ciBjc3IgJXhcbiIsIGNzcik7CisjZW5kaWYKKworCWlmKGNzciAmIH5DU1JfR09PRCkgeworCQlpZihjc3IgJiBDU1JfRE1BX0JVU0VSUikgeworCQkJcHJpbnRrKCJzY3NpJWQ6IGJ1cyBlcnJvciBpbiBkbWFcbiIsIGRlZmF1bHRfaW5zdGFuY2UtPmhvc3Rfbm8pOworI2lmZGVmIFNVTjNfU0NTSV9ERUJVRworCQkJcHJpbnRrKCJzY3NpOiByZXNpZHVhbCAleCBjb3VudCAleCBhZGRyICVwIGRtYWFkZHIgJXhcbiIsIAorCQkJICAgICAgIGRyZWdzLT5maWZvX2NvdW50LAorCQkJICAgICAgIGRyZWdzLT5kbWFfY291bnRfbG8gfCAoZHJlZ3MtPmRtYV9jb3VudF9oaSA8PCAxNiksCisJCQkgICAgICAgc3VuM19kbWFfb3JpZ19hZGRyLAorCQkJICAgICAgIGRyZWdzLT5kbWFfYWRkcl9sbyB8IChkcmVncy0+ZG1hX2FkZHJfaGkgPDwgMTYpKTsKKyNlbmRpZgorCQl9CisKKwkJaWYoY3NyICYgQ1NSX0RNQV9DT05GTElDVCkgeworCQkJcHJpbnRrKCJzY3NpJWQ6IGRtYSBjb25mbGljdFxuIiwgZGVmYXVsdF9pbnN0YW5jZS0+aG9zdF9ubyk7CisJCX0KKwkJaGFuZGxlZCA9IDE7CisJfQorCisJaWYoY3NyICYgKENTUl9TREJfSU5UIHwgQ1NSX0RNQV9JTlQpKSB7CisJCU5DUjUzODBfaW50cihpcnEsIGR1bW15LCBmcCk7CisJCWhhbmRsZWQgPSAxOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogRGVidWcgc3R1ZmYgLSB0byBiZSBjYWxsZWQgb24gTk1JLCBvciBzeXNycSBrZXkuIFVzZSBhdCB5b3VyIG93biByaXNrOyAKKyAqIHJlZW50ZXJpbmcgTkNSNTM4MF9wcmludF9zdGF0dXMgc2VlbXMgdG8gaGF2ZSB1Z2x5IHNpZGUgZWZmZWN0cworICovCisKKy8qIHRoaXMgZG9lc24ndCBzZWVtIHRvIGdldCB1c2VkIGF0IGFsbCAtLSBzYW0gKi8KKyNpZiAwCit2b2lkIHN1bjNfc3VuM19kZWJ1ZyAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCU5DUjUzODBfbG9jYWxfZGVjbGFyZSgpOworCisJaWYgKGRlZmF1bHRfaW5zdGFuY2UpIHsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCU5DUjUzODBfcHJpbnRfc3RhdHVzKGRlZmF1bHRfaW5zdGFuY2UpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KK30KKyNlbmRpZgorCisKKy8qIHN1bjNzY3NpX2RtYV9zZXR1cCgpIC0tIGluaXRpYWxpemUgdGhlIGRtYSBjb250cm9sbGVyIGZvciBhIHJlYWQvd3JpdGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV9zZXR1cCh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgd3JpdGVfZmxhZykKK3sKKwl2b2lkICphZGRyOworCisJaWYoc3VuM19kbWFfb3JpZ19hZGRyICE9IE5VTEwpCisJCWR2bWFfdW5tYXAoc3VuM19kbWFfb3JpZ19hZGRyKTsKKworLy8JYWRkciA9IHN1bjNfZHZtYV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEsICh1bnNpZ25lZCBsb25nKWRtYWJ1Zik7CisJYWRkciA9ICh2b2lkICopZHZtYV9tYXBfdm1lKCh1bnNpZ25lZCBsb25nKSBkYXRhLCBjb3VudCk7CisJCQorCXN1bjNfZG1hX29yaWdfYWRkciA9IGFkZHI7CisJc3VuM19kbWFfb3JpZ19jb3VudCA9IGNvdW50OworCQorI2lmZGVmIFNVTjNfU0NTSV9ERUJVRworCXByaW50aygic2NzaTogZG1hX3NldHVwIGFkZHIgJXAgY291bnQgJXhcbiIsIGFkZHIsIGNvdW50KTsKKyNlbmRpZgorCisvLwlkcmVncy0+Zmlmb19jb3VudCA9IDA7CisjaWYgMAkKKwkvKiByZXNldCBmaWZvICovCisJZHJlZ3MtPmNzciAmPSB+Q1NSX0ZJRk87CisJZHJlZ3MtPmNzciB8PSBDU1JfRklGTzsKKyNlbmRpZgkKKwkvKiBzZXQgZGlyZWN0aW9uICovCisJaWYod3JpdGVfZmxhZykKKwkJZHJlZ3MtPmNzciB8PSBDU1JfU0VORDsKKwllbHNlCisJCWRyZWdzLT5jc3IgJj0gfkNTUl9TRU5EOworCQorCS8qIHJlc2V0IGZpZm8gKi8KKy8vCWRyZWdzLT5jc3IgJj0gfkNTUl9GSUZPOworLy8JZHJlZ3MtPmNzciB8PSBDU1JfRklGTzsKKworCWRyZWdzLT5jc3IgfD0gQ1NSX1BBQ0tfRU5BQkxFOworCisJZHJlZ3MtPmRtYV9hZGRyX2hpID0gKCh1bnNpZ25lZCBsb25nKWFkZHIgPj4gMTYpOworCWRyZWdzLT5kbWFfYWRkcl9sbyA9ICgodW5zaWduZWQgbG9uZylhZGRyICYgMHhmZmZmKTsKKwkKKwlkcmVncy0+ZG1hX2NvdW50X2hpID0gMDsKKwlkcmVncy0+ZG1hX2NvdW50X2xvID0gMDsKKwlkcmVncy0+Zmlmb19jb3VudF9oaSA9IDA7CisJZHJlZ3MtPmZpZm9fY291bnQgPSAwOworCQkKKyNpZmRlZiBTVU4zX1NDU0lfREVCVUcKKwlwcmludGsoInNjc2k6IGRtYV9zZXR1cCBkb25lIGNzciAleFxuIiwgZHJlZ3MtPmNzcik7CisjZW5kaWYKKyAgICAgICAJcmV0dXJuIGNvdW50OworCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdW4zc2NzaV9kbWFfcmVzaWR1YWwoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJcmV0dXJuIGxhc3RfcmVzaWR1YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdW4zc2NzaV9kbWFfeGZlcl9sZW4odW5zaWduZWQgbG9uZyB3YW50ZWQsIFNjc2lfQ21uZCAqY21kLAorCQkJCSAgICBpbnQgd3JpdGVfZmxhZykKK3sKKwlpZihjbWQtPnJlcXVlc3QtPmZsYWdzICYgUkVRX0NNRCkKKyAJCXJldHVybiB3YW50ZWQ7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW4zc2NzaV9kbWFfc3RhcnQodW5zaWduZWQgbG9uZyBjb3VudCwgY2hhciAqZGF0YSkKK3sKKwkKKwl1bnNpZ25lZCBzaG9ydCBjc3I7CisKKwljc3IgPSBkcmVncy0+Y3NyOworI2lmZGVmIFNVTjNfU0NTSV9ERUJVRworCXByaW50aygic2NzaTogZG1hX3N0YXJ0IGRhdGEgJXAgY291bnQgJXggY3NyICV4IGZpZm8gJXhcbiIsIGRhdGEsIGNvdW50LCBjc3IsIGRyZWdzLT5maWZvX2NvdW50KTsKKyNlbmRpZgorCQorCWRyZWdzLT5kbWFfY291bnRfaGkgPSAoc3VuM19kbWFfb3JpZ19jb3VudCA+PiAxNik7CisJZHJlZ3MtPmRtYV9jb3VudF9sbyA9IChzdW4zX2RtYV9vcmlnX2NvdW50ICYgMHhmZmZmKTsKKworCWRyZWdzLT5maWZvX2NvdW50X2hpID0gKHN1bjNfZG1hX29yaWdfY291bnQgPj4gMTYpOworCWRyZWdzLT5maWZvX2NvdW50ID0gKHN1bjNfZG1hX29yaWdfY291bnQgJiAweGZmZmYpOworCisvLwlpZighKGNzciAmIENTUl9ETUFfRU5BQkxFKSkKKy8vCQlkcmVncy0+Y3NyIHw9IENTUl9ETUFfRU5BQkxFOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNsZWFuIHVwIGFmdGVyIG91ciBkbWEgaXMgZG9uZSAqLworc3RhdGljIGludCBzdW4zc2NzaV9kbWFfZmluaXNoKGludCB3cml0ZV9mbGFnKQoreworCXVuc2lnbmVkIHNob3J0IGZpZm87CisJaW50IHJldCA9IDA7CisJCisJc3VuM19kbWFfYWN0aXZlID0gMDsKKworCWRyZWdzLT5jc3IgJj0gfkNTUl9ETUFfRU5BQkxFOworCQorCWZpZm8gPSBkcmVncy0+Zmlmb19jb3VudDsKKwlpZih3cml0ZV9mbGFnKSB7CisJCWlmKChmaWZvID4gMCkgJiYgKGZpZm8gPCBzdW4zX2RtYV9vcmlnX2NvdW50KSkKKwkJCWZpZm8rKzsKKwl9CisKKwlsYXN0X3Jlc2lkdWFsID0gZmlmbzsKKyNpZmRlZiBTVU4zX1NDU0lfREVCVUcKKwlwcmludGsoInNjc2k6IHJlc2lkdWFsICV4IHRvdGFsICV4XG4iLCBmaWZvLCBzdW4zX2RtYV9vcmlnX2NvdW50KTsKKyNlbmRpZgorCS8qIGVtcHR5IGJ5dGVzIGZyb20gdGhlIGZpZm8gd2hpY2ggZGlkbid0IG1ha2UgaXQgKi8KKwlpZigoIXdyaXRlX2ZsYWcpICYmIChkcmVncy0+Y3NyICYgQ1NSX0xFRlQpKSB7CisJCXVuc2lnbmVkIGNoYXIgKnZhZGRyOworCisjaWZkZWYgU1VOM19TQ1NJX0RFQlVHCisJCXByaW50aygic2NzaTogZ290IGxlZnQgb3ZlciBieXRlc1xuIik7CisjZW5kaWYKKworCQl2YWRkciA9ICh1bnNpZ25lZCBjaGFyICopZHZtYV92bWV0b3Yoc3VuM19kbWFfb3JpZ19hZGRyKTsKKwkJCisJCXZhZGRyICs9IChzdW4zX2RtYV9vcmlnX2NvdW50IC0gZmlmbyk7CisJCXZhZGRyLS07CisJCQorCQlzd2l0Y2goZHJlZ3MtPmNzciAmIENTUl9MRUZUKSB7CisJCWNhc2UgQ1NSX0xFRlRfMzoKKwkJCSp2YWRkciA9IChkcmVncy0+YnBhY2tfbG8gJiAweGZmMDApID4+IDg7CisJCQl2YWRkci0tOworCQkJCisJCWNhc2UgQ1NSX0xFRlRfMjoKKwkJCSp2YWRkciA9IChkcmVncy0+YnBhY2tfaGkgJiAweDAwZmYpOworCQkJdmFkZHItLTsKKwkJCQorCQljYXNlIENTUl9MRUZUXzE6CisJCQkqdmFkZHIgPSAoZHJlZ3MtPmJwYWNrX2hpICYgMHhmZjAwKSA+PiA4OworCQkJYnJlYWs7CisJCX0KKwkJCisJCQorCX0KKworCWR2bWFfdW5tYXAoc3VuM19kbWFfb3JpZ19hZGRyKTsKKwlzdW4zX2RtYV9vcmlnX2FkZHIgPSBOVUxMOworCisJZHJlZ3MtPmRtYV9hZGRyX2hpID0gMDsKKwlkcmVncy0+ZG1hX2FkZHJfbG8gPSAwOworCWRyZWdzLT5kbWFfY291bnRfaGkgPSAwOworCWRyZWdzLT5kbWFfY291bnRfbG8gPSAwOworCisJZHJlZ3MtPmZpZm9fY291bnQgPSAwOworCWRyZWdzLT5maWZvX2NvdW50X2hpID0gMDsKKworCWRyZWdzLT5jc3IgJj0gfkNTUl9TRU5EOworCQorLy8JZHJlZ3MtPmNzciB8PSBDU1JfRE1BX0VOQUJMRTsKKwkKKyNpZiAwCisJLyogcmVzZXQgZmlmbyAqLworCWRyZWdzLT5jc3IgJj0gfkNTUl9GSUZPOworCWRyZWdzLT5jc3IgfD0gQ1NSX0ZJRk87CisjZW5kaWYJCisJc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OworCit9CisKKyNpbmNsdWRlICJzdW4zX05DUjUzODAuYyIKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUJCQk9IFNVTjNfU0NTSV9OQU1FLAorCS5kZXRlY3QJCQk9IHN1bjNzY3NpX2RldGVjdCwKKwkucmVsZWFzZQkJPSBzdW4zc2NzaV9yZWxlYXNlLAorCS5pbmZvCQkJPSBzdW4zc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gc3VuM3Njc2lfcXVldWVfY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciAgICAgIAk9IHN1bjNzY3NpX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciAgCT0gc3VuM3Njc2lfYnVzX3Jlc2V0LAorCS5jYW5fcXVldWUJCT0gQ0FOX1FVRVVFLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBTR19UQUJMRVNJWkUsCisJLmNtZF9wZXJfbHVuCQk9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcKK307CisKKworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYyBiL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFkYzBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N1bjN4X2VzcC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKiBzdW4zeF9lc3AuYzogIEVuaGFuY2VkU2NzaVByb2Nlc3NvciBTdW4zeCBTQ1NJIGRyaXZlciBjb2RlLgorICoKKyAqIChDKSAxOTk5IFRob21hcyBCb2dlbmRvZXJmZXIgKHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGUpCisgKgorICogQmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MgZXNwIGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJOQ1I1M0M5eC5oIgorCisjaW5jbHVkZSA8YXNtL3N1bjN4Lmg+CisjaW5jbHVkZSA8YXNtL2R2bWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKK2V4dGVybiBzdHJ1Y3QgTkNSX0VTUCAqZXNwY2hhaW47CisKK3N0YXRpYyB2b2lkIGRtYV9iYXJyaWVyKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpOworc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9kcmFpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnZhbGlkYXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOworc3RhdGljIHZvaWQgZG1hX3BvbGwoc3RydWN0IE5DUl9FU1AgKmVzcCwgdW5zaWduZWQgY2hhciAqdmFkZHIpOworc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCk7CitzdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9vbmUgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOworc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7CitzdGF0aWMgdm9pZCBkbWFfYWR2YW5jZV9zZyAoU2NzaV9DbW5kICpzcCk7CisKKy8qIERldGVjdGluZyBFU1AgY2hpcHMgb24gdGhlIG1hY2hpbmUuICBUaGlzIGlzIHRoZSBzaW1wbGUgYW5kIGVhc3kKKyAqIHZlcnNpb24uCisgKi8KK2ludCBzdW4zeF9lc3BfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqdHBudCkKK3sKKwlzdHJ1Y3QgTkNSX0VTUCAqZXNwOworCXN0cnVjdCBDb25maWdEZXYgKmVzcF9kZXY7CisKKwllc3BfZGV2ID0gMDsKKwllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKikgZXNwX2Rldik7CisKKwkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggRE1BICovCisJZXNwLT5kb19waW9fY21kcyA9IDA7CisKKwkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KKwllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OworCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOworCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7CisJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7CisJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKKwllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7CisJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKKwllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7CisJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKKwllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7CisKKwkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KKwllc3AtPmRtYV9iYXJyaWVyID0gJmRtYV9iYXJyaWVyOworCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAmZG1hX2ludmFsaWRhdGU7CisJZXNwLT5kbWFfZHJhaW4gPSAmZG1hX2RyYWluOworCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7CisJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOworCWVzcC0+ZG1hX2xlZF9vbiA9IDA7CisJZXNwLT5kbWFfbGVkX29mZiA9IDA7CisJZXNwLT5kbWFfcG9sbCA9ICZkbWFfcG9sbDsKKwllc3AtPmRtYV9yZXNldCA9ICZkbWFfcmVzZXQ7CisKKyAgICAgICAgLyogdmlydHVhbCBETUEgZnVuY3Rpb25zICovCisgICAgICAgIGVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSAmZG1hX21tdV9nZXRfc2NzaV9vbmU7CisgICAgICAgIGVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAmZG1hX21tdV9nZXRfc2NzaV9zZ2w7CisgICAgICAgIGVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZTsKKyAgICAgICAgZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAmZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsOworICAgICAgICBlc3AtPmRtYV9hZHZhbmNlX3NnID0gJmRtYV9hZHZhbmNlX3NnOworCSAgICAKKwkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KKwllc3AtPmNmcmVxID0gMjAwMDAwMDA7CisJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoU1VOM1hfRVNQX0JBU0UpOworCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKVNVTjNYX0VTUF9ETUE7CisKKwllc3AtPmVzcF9jb21tYW5kID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilkdm1hX21hbGxvYyhEVk1BX1BBR0VfU0laRSk7CisJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gZHZtYV92dG9iKCh1bnNpZ25lZCBsb25nKWVzcC0+ZXNwX2NvbW1hbmQpOworCisJZXNwLT5pcnEgPSAyOworCWlmIChyZXF1ZXN0X2lycShlc3AtPmlycSwgZXNwX2ludHIsIFNBX0lOVEVSUlVQVCwgCisJCQkiU1VOM1ggU0NTSSIsIGVzcC0+ZWhvc3QpKSB7CisJCWVzcF9kZWFsbG9jYXRlKGVzcCk7CisJCXJldHVybiAwOworCX0KKworCWVzcC0+c2NzaV9pZCA9IDc7CisJZXNwLT5kaWZmID0gMDsKKworCWVzcF9pbml0aWFsaXplKGVzcCk7CisKKyAJLyogZm9yIHJlYXNvbnMgYmV5b25kIG15IGtub3dsZWRnZSAoYW5kIHdoaWNoIHNob3VsZCBsaWtlbHkgYmUgZml4ZWQpCisgCSAgIHN5bmMgbW9kZSBkb2Vzbid0IHdvcmsgb24gYSAzLzgwIGF0IDVtaHouICBidXQgaXQgZG9lcyBhdCA0LiAqLworIAllc3AtPnN5bmNfZGVmcCA9IDB4M2Y7CisKKwlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywKKwkgICAgICAgZXNwc19pbl91c2UpOworCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOworCXJldHVybiBlc3BzX2luX3VzZTsKK30KKworc3RhdGljIHZvaWQgZG1hX2RvX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisgCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9CisgCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKyAJCisgCWludCBjb3VudCA9IDUwMDAwMDsKKyAKKyAJd2hpbGUoKGRyZWdzLT5jb25kX3JlZyAmIERNQV9QRU5EX1JFQUQpICYmICgtLWNvdW50ID4gMCkpIAorIAkJdWRlbGF5KDEpOworIAorIAlpZighY291bnQpIHsKKyAJCXByaW50aygiJXM6JWQgdGltZW91dCBDU1IgJTA4bHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgZHJlZ3MtPmNvbmRfcmVnKTsKKyAJfQorIAorIAlkcmVncy0+Y29uZF9yZWcgfD0gRE1BX0ZJRk9fU1REUkFJTjsKKyAJCisgCWNvdW50ID0gNTAwMDAwOworIAorIAl3aGlsZSgoZHJlZ3MtPmNvbmRfcmVnICYgRE1BX0ZJRk9fSVNEUkFJTikgJiYgKC0tY291bnQgPiAwKSkgCisgCQl1ZGVsYXkoMSk7CisgCisgCWlmKCFjb3VudCkgeworIAkJcHJpbnRrKCIlczolZCB0aW1lb3V0IENTUiAlMDhseFxuIiwgX19GSUxFX18sIF9fTElORV9fLCBkcmVncy0+Y29uZF9yZWcpOworIAl9CisgCit9CisgCitzdGF0aWMgdm9pZCBkbWFfYmFycmllcihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworICAJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KKyAgCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKyAJaW50IGNvdW50ID0gNTAwMDAwOworICAKKyAJd2hpbGUoKGRyZWdzLT5jb25kX3JlZyAmIERNQV9QRU5EX1JFQUQpICYmICgtLWNvdW50ID4gMCkpCisgIAkJdWRlbGF5KDEpOworIAorIAlpZighY291bnQpIHsKKyAJCXByaW50aygiJXM6JWQgdGltZW91dCBDU1IgJTA4bHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgZHJlZ3MtPmNvbmRfcmVnKTsKKyAJfQorIAorICAJZHJlZ3MtPmNvbmRfcmVnICY9IH4oRE1BX0VOQUJMRSk7Cit9CisKKy8qIFRoaXMgdXNlcyB2YXJpb3VzIERNQSBjc3IgZmllbGRzIGFuZCB0aGUgZmlmbyBmbGFncyBjb3VudCB2YWx1ZSB0bworICogZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlcmUgc3VjY2Vzc2Z1bGx5IHNlbnQvcmVjZWl2ZWQgYnkgdGhlIEVTUC4KKyAqLworc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKK3sKKwlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7CisKKwlpbnQgcnZhbCA9IGRyZWdzLT5zdF9hZGRyIC0gZXNwLT5lc3BfY29tbWFuZF9kdm1hOworCisJcmV0dXJuIHJ2YWwgLSBmaWZvX2NvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKwlyZXR1cm4gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOworfQorCitzdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQorCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKwlpbnQgY291bnQgPSA1MDAwMDA7CisKKwlpZihkcmVncy0+Y29uZF9yZWcgJiBETUFfRklGT19JU0RSQUlOKSB7CisJCWRyZWdzLT5jb25kX3JlZyB8PSBETUFfRklGT19TVERSQUlOOworCQl3aGlsZSgoZHJlZ3MtPmNvbmRfcmVnICYgRE1BX0ZJRk9fSVNEUkFJTikgJiYgKC0tY291bnQgPiAwKSkKKwkJCXVkZWxheSgxKTsKKwkJaWYoIWNvdW50KSB7CisJCQlwcmludGsoIiVzOiVkIHRpbWVvdXQgQ1NSICUwOGx4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGRyZWdzLT5jb25kX3JlZyk7CisJCX0KKworCX0KK30KKworc3RhdGljIHZvaWQgZG1hX2ludmFsaWRhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQorCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCV9fdTMyIHRtcDsKKwlpbnQgY291bnQgPSA1MDAwMDA7CisKKwl3aGlsZSgoKHRtcCA9IGRyZWdzLT5jb25kX3JlZykgJiBETUFfUEVORF9SRUFEKSAmJiAoLS1jb3VudCA+IDApKSAKKwkJdWRlbGF5KDEpOworCisJaWYoIWNvdW50KSB7CisJCXByaW50aygiJXM6JWQgdGltZW91dCBDU1IgJTA4bHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgZHJlZ3MtPmNvbmRfcmVnKTsKKwl9CisKKwlkcmVncy0+Y29uZF9yZWcgPSB0bXAgfCBETUFfRklGT19JTlY7CisJZHJlZ3MtPmNvbmRfcmVnICY9IH5ETUFfRklGT19JTlY7CisKK30KKworc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQorCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCUVTUExPRygoImVzcCVkOiBkbWEgLS0gY29uZF9yZWc8JTA4bHg+IGFkZHI8JTA4bHg+XG4iLAorCQllc3AtPmVzcF9pZCwgZHJlZ3MtPmNvbmRfcmVnLCBkcmVncy0+c3RfYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKworCWRyZWdzLT5zdF9hZGRyID0gdmFkZHJlc3M7CisJZHJlZ3MtPmNvbmRfcmVnIHw9IChETUFfU1RfV1JJVEUgfCBETUFfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCisJCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOworCisJLyogU2V0IHVwIHRoZSBETUEgY291bnRlcnMgKi8KKworCWRyZWdzLT5zdF9hZGRyID0gdmFkZHJlc3M7CisJZHJlZ3MtPmNvbmRfcmVnID0gKChkcmVncy0+Y29uZF9yZWcgJiB+KERNQV9TVF9XUklURSkpIHwgRE1BX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQoreworCURNQV9JTlRTT0ZGKChzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlETUFfSU5UU09OKChzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzKTsKK30KKworc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gRE1BX0lSUV9QKChzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3BvbGwoc3RydWN0IE5DUl9FU1AgKmVzcCwgdW5zaWduZWQgY2hhciAqdmFkZHIpCit7CisJaW50IGNvdW50ID0gNTA7CisJZG1hX2RvX2RyYWluKGVzcCk7CisKKwkvKiBXYWl0IHRpbGwgdGhlIGZpcnN0IGJpdHMgc2V0dGxlLiAqLworCXdoaWxlKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKil2YWRkciA9PSAweGZmKSAmJiAoLS1jb3VudCA+IDApKQorCQl1ZGVsYXkoMSk7CisKKwlpZighY291bnQpIHsKKy8vCQlwcmludGsoIiVzOiVkIHRpbWVvdXQgZXhwaXJlIChkYXRhICUwMngpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sCisvLwkJICAgICAgIGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9mZGF0YSkpOworCQkvL21hY2hfaGFsdCgpOworCQl2YWRkclswXSA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9mZGF0YSk7CisJCXZhZGRyWzFdID0gZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX2ZkYXRhKTsKKwl9CisKK30JCisKK3N0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3sKKwlyZXR1cm4gKCgoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyktPmNvbmRfcmVnIAorCQkJJiBETUFfSU5UX0VOQUIpOworfQorCisvKiBSZXNldHRpbmcgdmFyaW91cyBwaWVjZXMgb2YgdGhlIEVTUCBzY3NpIGRyaXZlciBjaGlwc2V0L2J1c2VzLiAqLworc3RhdGljIHZvaWQgZG1hX3Jlc2V0KHN0cnVjdCBOQ1JfRVNQICplc3ApCit7CisJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KKwkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopZXNwLT5kcmVnczsKKworCS8qIFB1bnQgdGhlIERWTUEgaW50byBhIGtub3duIHN0YXRlLiAqLworCWRyZWdzLT5jb25kX3JlZyB8PSBETUFfUlNUX1NDU0k7CisJZHJlZ3MtPmNvbmRfcmVnICY9IH4oRE1BX1JTVF9TQ1NJKTsKKwlETUFfSU5UU09OKGRyZWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQoreworCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAorCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKwl1bnNpZ25lZCBsb25nIG5yZWcgPSBkcmVncy0+Y29uZF9yZWc7CisKKy8vCXByaW50aygiZG1hX3NldHVwICVjIGFkZHIgJTA4eCBjbnQgJTA4eFxuIiwKKy8vCSAgICAgICB3cml0ZSA/ICdXJyA6ICdSJywgYWRkciwgY291bnQpOworCisJZG1hX2RvX2RyYWluKGVzcCk7CisKKwlpZih3cml0ZSkKKwkJbnJlZyB8PSBETUFfU1RfV1JJVEU7CisJZWxzZSB7CisJCW5yZWcgJj0gfihETUFfU1RfV1JJVEUpOworCX0KKwkJCisJbnJlZyB8PSBETUFfRU5BQkxFOworCWRyZWdzLT5jb25kX3JlZyA9IG5yZWc7CisJZHJlZ3MtPnN0X2FkZHIgPSBhZGRyOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZSAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKyAgICBzcC0+U0NwLmhhdmVfZGF0YV9pbiA9IGR2bWFfbWFwKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLAorCQkJCSAgICAgICBzcC0+U0NwLnRoaXNfcmVzaWR1YWwpOworICAgIHNwLT5TQ3AucHRyID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5oYXZlX2RhdGFfaW4pOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKyAgICBpbnQgc3ogPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNwLT5TQ3AuYnVmZmVyOworCisgICAgd2hpbGUgKHN6ID49IDApIHsKKwkgICAgc2dbc3pdLmR2bWFfYWRkcmVzcyA9IGR2bWFfbWFwKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhzZ1tzel0ucGFnZSkgKworCQkJCQkgICBzZ1tzel0ub2Zmc2V0LCBzZ1tzel0ubGVuZ3RoKTsKKwkgICAgc3otLTsKKyAgICB9CisgICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmR2bWFfYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKK3sKKyAgICBkdm1hX3VubWFwKChjaGFyICopc3AtPlNDcC5oYXZlX2RhdGFfaW4pOworfQorCitzdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCit7CisgICAgaW50IHN6ID0gc3AtPnVzZV9zZyAtIDE7CisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzcC0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgd2hpbGUoc3ogPj0gMCkgeworICAgICAgICBkdm1hX3VubWFwKChjaGFyICopc2dbc3pdLmR2bWFfYWRkcmVzcyk7CisgICAgICAgIHN6LS07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkbWFfYWR2YW5jZV9zZyAoU2NzaV9DbW5kICpzcCkKK3sKKyAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLT5kdm1hX2FkZHJlc3MpOworfQorCitzdGF0aWMgaW50IHN1bjN4X2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQoreworCS8qIHRoaXMgY29kZSBkb2VzIG5vdCBzdXBwb3J0IGJlaW5nIGNvbXBpbGVkIGFzIGEgbW9kdWxlICovCSAKKwlyZXR1cm4gMTsKKworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJzdW4zeF9lc3AiLAorCS5wcm9jX2luZm8JCT0gJmVzcF9wcm9jX2luZm8sCisJLm5hbWUJCQk9ICJTdW4gRVNQIDEwMC8xMDBhLzIwMCIsCisJLmRldGVjdAkJCT0gc3VuM3hfZXNwX2RldGVjdCwKKwkucmVsZWFzZSAgICAgICAgICAgICAgICA9IHN1bjN4X2VzcF9yZWxlYXNlLAorCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCisJLmluZm8JCQk9IGVzcF9pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAorCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNmMzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjNDE2LmMKQEAgLTAsMCArMSw4ODEgQEAKKy8qCisgKiAgc3ltNTNjNDE2LmMKKyAqICBMb3ctbGV2ZWwgU0NTSSBkcml2ZXIgZm9yIHN5bTUzYzQxNiBjaGlwLgorICogIENvcHlyaWdodCAoQykgMTk5OCBMaWV2ZW4gV2lsbGVtcyAobHdfbGludXhAaG90bWFpbC5jb20pCisgKiAKKyAqICBDaGFuZ2VzIDogCisgKiAKKyAqICBNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4gOiBBZGRlZCBpb19yZXF1ZXN0X2xvY2sgbG9ja2luZworICogIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IDogQ2xlYW5lZCB1cCBjb2RlIGZvcm1hdHRpbmcKKyAqCQkJCSBGaXhlZCBhbiBpcnEgbG9ja2luZyBidWcKKyAqCQkJCSBBZGRlZCBJU0FQblAgc3VwcG9ydAorICogIEJqb2VybiBBLiBaZWViIDxiemVlYkB6YWJiYWRvei5uZXQ+IDogSW5pdGlhbCBpcnEgbG9ja2luZyB1cGRhdGVzCisgKgkJCQkJICBBZGRlZCBhbm90aGVyIGNhcmQgd2l0aCBJU0FQblAgc3VwcG9ydAorICogCisgKiAgTElMTyBjb21tYW5kIGxpbmUgdXNhZ2U6IHN5bTUzYzQxNj08UE9SVEJBU0U+Wyw8SVJRPl0KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiAgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInN5bTUzYzQxNi5oIgorCisjZGVmaW5lIFZFUlNJT05fU1RSSU5HICAgICAgICAiVmVyc2lvbiAxLjAuMC1hYyIKKworI2RlZmluZSBUQ19MT1cgICAgICAgMHgwMCAgICAgLyogVHJhbnNmZXIgY291bnRlciBsb3cgICAgICAgICovCisjZGVmaW5lIFRDX01JRCAgICAgICAweDAxICAgICAvKiBUcmFuc2ZlciBjb3VudGVyIG1pZCAgICAgICAgKi8KKyNkZWZpbmUgU0NTSV9GSUZPICAgIDB4MDIgICAgIC8qIFNDU0kgRklGTyByZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EX1JFRyAgMHgwMyAgICAgLyogQ29tbWFuZCBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIFNUQVRVU19SRUcgICAweDA0ICAgICAvKiBTdGF0dXMgUmVnaXN0ZXIgKFJFQUQpICAgICAgKi8KKyNkZWZpbmUgREVTVF9CVVNfSUQgIDB4MDQgICAgIC8qIERlc3RpbmF0aW9uIEJ1cyBJRCAoV1JJVEUpICAqLworI2RlZmluZSBJTlRfUkVHICAgICAgMHgwNSAgICAgLyogSW50ZXJydXB0IFJlZ2lzdGVyIChSRUFEKSAgICovCisjZGVmaW5lIFRPTSAgICAgICAgICAweDA1ICAgICAvKiBUaW1lIG91dCBtdWx0aXBsaWVyIChXUklURSkgKi8KKyNkZWZpbmUgU1RQICAgICAgICAgIDB4MDYgICAgIC8qIFN5bmNocm9ub3VzIFRyYW5zZmVyIHBlcmlvZCAqLworI2RlZmluZSBTWU5DX09GRlNFVCAgMHgwNyAgICAgLyogU3luY2hyb25vdXMgT2Zmc2V0ICAgICAgICAgICovCisjZGVmaW5lIENPTkZfUkVHXzEgICAweDA4ICAgICAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgICAgKi8KKyNkZWZpbmUgQ09ORl9SRUdfMiAgIDB4MEIgICAgIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMiAgICAqLworI2RlZmluZSBDT05GX1JFR18zICAgMHgwQyAgICAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAzICAgICovCisjZGVmaW5lIENPTkZfUkVHXzQgICAweDBEICAgICAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDQgICAgKi8KKyNkZWZpbmUgVENfSElHSCAgICAgIDB4MEUgICAgIC8qIFRyYW5zZmVyIGNvdW50ZXIgaGlnaCAgICAgICAqLworI2RlZmluZSBQSU9fRklGT18xICAgMHgxMCAgICAgLyogUElPIEZJRk8gcmVnaXN0ZXIgMSAgICAgICAgICovCisjZGVmaW5lIFBJT19GSUZPXzIgICAweDExICAgICAvKiBQSU8gRklGTyByZWdpc3RlciAyICAgICAgICAgKi8KKyNkZWZpbmUgUElPX0ZJRk9fMyAgIDB4MTIgICAgIC8qIFBJTyBGSUZPIHJlZ2lzdGVyIDMgICAgICAgICAqLworI2RlZmluZSBQSU9fRklGT180ICAgMHgxMyAgICAgLyogUElPIEZJRk8gcmVnaXN0ZXIgNCAgICAgICAgICovCisjZGVmaW5lIFBJT19GSUZPX0NOVCAweDE0ICAgICAvKiBQSU8gRklGTyBjb3VudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUElPX0lOVF9SRUcgIDB4MTUgICAgIC8qIFBJTyBpbnRlcnJ1cHQgcmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBDT05GX1JFR181ICAgMHgxNiAgICAgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciA1ICAgICovCisjZGVmaW5lIEZFQVRVUkVfRU4gICAweDFEICAgICAvKiBGZWF0dXJlIEVuYWJsZSByZWdpc3RlciAgICAgKi8KKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAxIGVudHJpZXM6ICovCisvKiBCaXRzIDItMDogU0NTSSBJRCBvZiBob3N0IGFkYXB0ZXIgKi8KKyNkZWZpbmUgU0NNICAgIDB4ODAgICAgICAgICAgICAgICAgICAgICAvKiBTbG93IENhYmxlIE1vZGUgICAgICAgICAgICAgICovCisjZGVmaW5lIFNSSUQgICAweDQwICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBSZXNldCBJbnRlcnJ1cHQgRGlzYWJsZSAqLworI2RlZmluZSBQVE0gICAgMHgyMCAgICAgICAgICAgICAgICAgICAgIC8qIFBhcml0eSBUZXN0IE1vZGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVBDICAgIDB4MTAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUGFyaXR5IENoZWNraW5nICAgICAgICovCisjZGVmaW5lIENUTUUgICAweDA4ICAgICAgICAgICAgICAgICAgICAgLyogU3BlY2lhbCBUZXN0IE1vZGUgICAgICAgICAgICAqLworCisvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgZW50cmllczogKi8KKyNkZWZpbmUgRkUgICAgIDB4NDAgICAgICAgICAgICAgICAgICAgICAvKiBGZWF0dXJlcyBFbmFibGUgICAgICAgICAgICAgICovCisjZGVmaW5lIFNDU0kyICAweDA4ICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSAyIEVuYWJsZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQlBBICAgMHgwNCAgICAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCBCYWQgUGFyaXR5IEFib3J0ICAgICAgKi8KKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAzIGVudHJpZXM6ICovCisjZGVmaW5lIElETVJDICAweDgwICAgICAgICAgICAgICAgICAgICAgLyogSUQgTWVzc2FnZSBSZXNlcnZlZCBDaGVjayAgICAqLworI2RlZmluZSBRVEUgICAgMHg0MCAgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIFRhZyBFbmFibGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0RCMTAgIDB4MjAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sgMTAgICovCisjZGVmaW5lIEZTQ1NJICAweDEwICAgICAgICAgICAgICAgICAgICAgLyogRmFzdFNDU0kgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQ0xLICAgMHgwOCAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3RDbG9jayAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciA0IGVudHJpZXM6ICovCisjZGVmaW5lIFJCUyAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgYmFuayBzZWxlY3QgICAgICAgICAqLworI2RlZmluZSBFQU4gICAgMHgwNCAgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBBY3RpdmUgTmVnb3RpYXRpb24gICAgKi8KKworLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciA1IGVudHJpZXM6ICovCisjZGVmaW5lIExQU1IgICAweDgwICAgICAgICAgICAgICAgICAgICAgLyogTG93ZXIgUG93ZXIgU0NTSSBSZXNldCAgICAgICAqLworI2RlZmluZSBJRSAgICAgMHgyMCAgICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBFbmFibGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBNICAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgUG93ZXIgTW9kZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFdTRTAgICAweDAxICAgICAgICAgICAgICAgICAgICAgLyogMFdTIEVuYWJsZSAgICAgICAgICAgICAgICAgICAqLworCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgZW50cmllczogKi8KKyNkZWZpbmUgU1JTVCAgIDB4ODAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIFJlc2V0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElMQ01EICAweDQwICAgICAgICAgICAgICAgICAgICAgLyogSWxsZWdhbCBDb21tYW5kICAgICAgICAgICAgICAqLworI2RlZmluZSBESVMgICAgMHgyMCAgICAgICAgICAgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQlMgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgICAvKiBCdXMgU2VydmljZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZDICAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gQ29tcGxldGUgICAgICAgICAgICAqLworI2RlZmluZSBSRVNFTCAgMHgwNCAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2VsZWN0ZWQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0kgICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAvKiBTZWxlY3Rpb24gSW50ZXJydXB0ICAgICAgICAgICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciBFbnRyaWVzOiAqLworI2RlZmluZSBTQ0kgICAgMHg4MCAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgQ29yZSBJbnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0UgICAgIDB4NDAgICAgICAgICAgICAgICAgICAgICAvKiBHcm9zcyBFcnJvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBFICAgICAweDIwICAgICAgICAgICAgICAgICAgICAgLyogUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQyAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgIC8qIFRlcm1pbmFsIENvdW50ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkdDICAgIDB4MDggICAgICAgICAgICAgICAgICAgICAvKiBWYWxpZCBHcm91cCBDb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIFBIQklUUyAweDA3ICAgICAgICAgICAgICAgICAgICAgLyogUGhhc2UgYml0cyAgICAgICAgICAgICAgICAgICAqLworCisvKiBQSU8gSW50ZXJydXB0IFJlZ2lzdGVyIEVudHJpZXM6ICovCisjZGVmaW5lIFNDSSAgICAweDgwICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBDb3JlIEludCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQRkkgICAgMHg0MCAgICAgICAgICAgICAgICAgICAgIC8qIFBJTyBGSUZPIEludGVycnVwdCAgICAgICAgICAgKi8KKyNkZWZpbmUgRlVMTCAgIDB4MjAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gRklGTyBGdWxsICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNUFRZICAweDEwICAgICAgICAgICAgICAgICAgICAgLyogUElPIEZJRk8gRW1wdHkgICAgICAgICAgICAgICAqLworI2RlZmluZSBDRSAgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgIC8qIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1VFICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAvKiBPdmVyZmxvdyAvIFVuZGVyZmxvdyBlcnJvciAgICovCisjZGVmaW5lIEZJRSAgICAweDAyICAgICAgICAgICAgICAgICAgICAgLyogRnVsbCBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAqLworI2RlZmluZSBFSUUgICAgMHgwMSAgICAgICAgICAgICAgICAgICAgIC8qIEVtcHR5IEludGVycnVwdCBFbmFibGUgICAgICAgKi8KKworLyogU1lNNTNDNDE2IFNDU0kgcGhhc2VzIChsb3dlciAzIGJpdHMgb2YgU1lNNTNDNDE2X1NUQVRVU19SRUcpICovCisjZGVmaW5lIFBIQVNFX0RBVEFfT1VUICAgIDB4MDAKKyNkZWZpbmUgUEhBU0VfREFUQV9JTiAgICAgMHgwMQorI2RlZmluZSBQSEFTRV9DT01NQU5EICAgICAweDAyCisjZGVmaW5lIFBIQVNFX1NUQVRVUyAgICAgIDB4MDMKKyNkZWZpbmUgUEhBU0VfUkVTRVJWRURfMSAgMHgwNAorI2RlZmluZSBQSEFTRV9SRVNFUlZFRF8yICAweDA1CisjZGVmaW5lIFBIQVNFX01FU1NBR0VfT1VUIDB4MDYKKyNkZWZpbmUgUEhBU0VfTUVTU0FHRV9JTiAgMHgwNworCisvKiBTWU01M0M0MTYgY29yZSBjb21tYW5kcyAqLworI2RlZmluZSBOT09QICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRkxVU0hfRklGTyAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJFU0VUX0NISVAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBSRVNFVF9TQ1NJX0JVUyAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRElTQUJMRV9TRUxfUkVTRUwgICAgICAgICAweDQ1CisjZGVmaW5lIFJFU0VMX1NFUSAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTRUxfV0lUSE9VVF9BVE5fU0VRICAgICAgIDB4NDEKKyNkZWZpbmUgU0VMX1dJVEhfQVROX1NFUSAgICAgICAgICAweDQyCisjZGVmaW5lIFNFTF9XSVRIX0FUTl9BTkRfU1RPUF9TRVEgMHg0MworI2RlZmluZSBFTkFCTEVfU0VMX1JFU0VMICAgICAgICAgIDB4NDQKKyNkZWZpbmUgU0VMX1dJVEhfQVROM19TRVEgICAgICAgICAweDQ2CisjZGVmaW5lIFJFU0VMM19TRVEgICAgICAgICAgICAgICAgMHg0NworI2RlZmluZSBTTkRfTVNHICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU05EX1NUQVQgICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIFNORF9EQVRBICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBESVNDT05ORUNUX1NFUSAgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgVEVSTUlOQVRFX1NFUSAgICAgICAgICAgICAweDI0CisjZGVmaW5lIFRBUkdFVF9DT01NX0NPTVBMRVRFX1NFUSAgMHgyNQorI2RlZmluZSBESVNDT05OICAgICAgICAgICAgICAgICAgIDB4MjcKKyNkZWZpbmUgUkVDVl9NU0dfU0VRICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIFJFQ1ZfQ01EICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBSRUNWX0RBVEEgICAgICAgICAgICAgICAgIDB4MkEKKyNkZWZpbmUgUkVDVl9DTURfU0VRICAgICAgICAgICAgICAweDJCCisjZGVmaW5lIFRBUkdFVF9BQk9SVF9QSU8gICAgICAgICAgMHgwNAorI2RlZmluZSBUUkFOU0ZFUl9JTkZPUk1BVElPTiAgICAgIDB4MTAKKyNkZWZpbmUgSU5JVF9DT01NX0NPTVBMRVRFX1NFUSAgICAweDExCisjZGVmaW5lIE1TR19BQ0NFUFRFRCAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBUUkFOU0ZFUl9QQUQgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgU0VUX0FUTiAgICAgICAgICAgICAgICAgICAweDFBCisjZGVmaW5lIFJFU0VUX0FUTiAgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBJTExFR0FMICAgICAgICAgICAgICAgICAgIDB4RkYKKworI2RlZmluZSBQSU9fTU9ERSAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBJT19SQU5HRSAweDIwICAgICAgICAgLyogMHgwMCAtIDB4MUYgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUQgICAgICAgInN5bTUzYzQxNiIJLyogQXR0ZW50aW9uOiBjb3BpZWQgdG8gdGhlIHN5bTUzYzQxNi5oICovCisjZGVmaW5lIFBJT19TSVpFIDEyOCAgICAgICAgICAvKiBTaXplIG9mIFBJTyBmaWZvIGlzIDEyOCBieXRlcyAqLworCisjZGVmaW5lIFJFQURfVElNRU9VVCAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFdSSVRFX1RJTUVPVVQgICAgICAgICAgICAgMTUwCisKKyNpZmRlZiBNT0RVTEUKKworI2RlZmluZSBzeW01M2M0MTZfYmFzZSBzeW01M2M0MTYKKyNkZWZpbmUgc3ltNTNjNDE2X2Jhc2VfMSBzeW01M2M0MTZfMQorI2RlZmluZSBzeW01M2M0MTZfYmFzZV8yIHN5bTUzYzQxNl8yCisjZGVmaW5lIHN5bTUzYzQxNl9iYXNlXzMgc3ltNTNjNDE2XzMKKworc3RhdGljIHVuc2lnbmVkIGludCBzeW01M2M0MTZfYmFzZVsyXSA9IHswLDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBzeW01M2M0MTZfYmFzZV8xWzJdID0gezAsMH07CitzdGF0aWMgdW5zaWduZWQgaW50IHN5bTUzYzQxNl9iYXNlXzJbMl0gPSB7MCwwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3ltNTNjNDE2X2Jhc2VfM1syXSA9IHswLDB9OworCisjZW5kaWYKKworI2RlZmluZSBNQVhIT1NUUyA0CisKKyNkZWZpbmUgU0dfQUREUkVTUyhidWZmZXIpICAgICAoKGNoYXIgKikgKHBhZ2VfYWRkcmVzcygoYnVmZmVyKS0+cGFnZSkrKGJ1ZmZlciktPm9mZnNldCkpCisKK2VudW0gcGhhc2VzCit7CisJaWRsZSwKKwlkYXRhX291dCwKKwlkYXRhX2luLAorCWNvbW1hbmRfcGgsCisJc3RhdHVzX3BoLAorCW1lc3NhZ2Vfb3V0LAorCW1lc3NhZ2VfaW4KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisJaW50IGJhc2U7CisJaW50IGlycTsKKwlpbnQgc2NzaV9pZDsKK30gaG9zdDsKKworc3RhdGljIGhvc3QgaG9zdHNbTUFYSE9TVFNdID0geworICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgU1lNNTNDNDE2X1NDU0lfSUR9LAorICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgU1lNNTNDNDE2X1NDU0lfSUR9LAorICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgU1lNNTNDNDE2X1NDU0lfSUR9LAorICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgU1lNNTNDNDE2X1NDU0lfSUR9CisgICAgICAgICAgICAgICAgICAgICAgIH07CisKK3N0YXRpYyBpbnQgaG9zdF9pbmRleCA9IDA7CitzdGF0aWMgY2hhciBpbmZvWzEyMF07CitzdGF0aWMgU2NzaV9DbW5kICpjdXJyZW50X2NvbW1hbmQgPSBOVUxMOworc3RhdGljIGludCBmYXN0cGlvID0gMTsKKworc3RhdGljIGludCBwcm9iZWFkZHJzW10gPSB7MHgyMDAsIDB4MjIwLCAweDI0MCwgMH07CisKK3N0YXRpYyB2b2lkIHN5bTUzYzQxNl9zZXRfdHJhbnNmZXJfY291bnRlcihpbnQgYmFzZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwkvKiBQcm9ncmFtIFRyYW5zZmVyIENvdW50ZXIgKi8KKwlvdXRiKGxlbiAmIDB4MDAwMEZGLCBiYXNlICsgVENfTE9XKTsKKwlvdXRiKChsZW4gJiAweDAwRkYwMCkgPj4gOCwgYmFzZSArIFRDX01JRCk7CisJb3V0YigobGVuICYgMHhGRjAwMDApID4+IDE2LCBiYXNlICsgVENfSElHSCk7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3ltNTNjNDE2X2xvY2spOworCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHN5bTUzYzQxNl9yZWFkKGludCBiYXNlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IG9yaWdfbGVuID0gbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBieXRlc19sZWZ0OworCXVuc2lnbmVkIGxvbmcgaTsKKwlpbnQgdGltZW91dCA9IFJFQURfVElNRU9VVDsKKworCS8qIERvIHRyYW5zZmVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bTUzYzQxNl9sb2NrLCBmbGFncyk7CisJd2hpbGUobGVuICYmIHRpbWVvdXQpCisJeworCQlieXRlc19sZWZ0ID0gaW5iKGJhc2UgKyBQSU9fRklGT19DTlQpOyAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIFBJTyBGSUZPICovCisJCWlmKGZhc3RwaW8gJiYgYnl0ZXNfbGVmdCA+IDMpCisJCXsKKwkJCWluc2woYmFzZSArIFBJT19GSUZPXzEsIGJ1ZmZlciwgYnl0ZXNfbGVmdCA+PiAyKTsKKwkJCWJ1ZmZlciArPSBieXRlc19sZWZ0ICYgMHhGQzsKKwkJCWxlbiAtPSBieXRlc19sZWZ0ICYgMHhGQzsKKwkJfQorCQllbHNlIGlmKGJ5dGVzX2xlZnQgPiAwKQorCQl7CisJCQlsZW4gLT0gYnl0ZXNfbGVmdDsKKwkJCWZvcig7IGJ5dGVzX2xlZnQgPiAwOyBieXRlc19sZWZ0LS0pCisJCQkJKihidWZmZXIrKykgPSBpbmIoYmFzZSArIFBJT19GSUZPXzEpOworCQl9CisJCWVsc2UKKwkJeworCQkJaSA9IGppZmZpZXMgKyB0aW1lb3V0OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwkJCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIGkpICYmIChpbmIoYmFzZSArIFBJT19JTlRfUkVHKSAmIEVNUFRZKSAmJiB0aW1lb3V0KQorCQkJCWlmKGluYihiYXNlICsgUElPX0lOVF9SRUcpICYgU0NJKQorCQkJCQl0aW1lb3V0ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCQkJaWYoaW5iKGJhc2UgKyBQSU9fSU5UX1JFRykgJiBFTVBUWSkKKwkJCQl0aW1lb3V0ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCXJldHVybiBvcmlnX2xlbiAtIGxlbjsKK30KKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBzeW01M2M0MTZfd3JpdGUoaW50IGJhc2UsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgb3JpZ19sZW4gPSBsZW47CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdW5zaWduZWQgaW50IGJ1ZmZlcmZyZWU7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gV1JJVEVfVElNRU9VVDsKKworCS8qIERvIHRyYW5zZmVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bTUzYzQxNl9sb2NrLCBmbGFncyk7CisJd2hpbGUobGVuICYmIHRpbWVvdXQpCisJeworCQlidWZmZXJmcmVlID0gUElPX1NJWkUgLSBpbmIoYmFzZSArIFBJT19GSUZPX0NOVCk7CisJCWlmKGJ1ZmZlcmZyZWUgPiBsZW4pCisJCQlidWZmZXJmcmVlID0gbGVuOworCQlpZihmYXN0cGlvICYmIGJ1ZmZlcmZyZWUgPiAzKQorCQl7CisJCQlvdXRzbChiYXNlICsgUElPX0ZJRk9fMSwgYnVmZmVyLCBidWZmZXJmcmVlID4+IDIpOworCQkJYnVmZmVyICs9IGJ1ZmZlcmZyZWUgJiAweEZDOworCQkJbGVuIC09IGJ1ZmZlcmZyZWUgJiAweEZDOworCQl9CisJCWVsc2UgaWYoYnVmZmVyZnJlZSA+IDApCisJCXsKKwkJCWxlbiAtPSBidWZmZXJmcmVlOworCQkJZm9yKDsgYnVmZmVyZnJlZSA+IDA7IGJ1ZmZlcmZyZWUtLSkKKwkJCQlvdXRiKCooYnVmZmVyKyspLCBiYXNlICsgUElPX0ZJRk9fMSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpID0gamlmZmllcyArIHRpbWVvdXQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCQkJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgaSkgJiYgKGluYihiYXNlICsgUElPX0lOVF9SRUcpICYgRlVMTCkgJiYgdGltZW91dCkKKwkJCQk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3ltNTNjNDE2X2xvY2ssIGZsYWdzKTsKKwkJCWlmKGluYihiYXNlICsgUElPX0lOVF9SRUcpICYgRlVMTCkKKwkJCQl0aW1lb3V0ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCXJldHVybiBvcmlnX2xlbiAtIGxlbjsKK30KKworc3RhdGljIGlycXJldHVybl90IHN5bTUzYzQxNl9pbnRyX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKwlpbnQgYmFzZSA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdW5zaWduZWQgY2hhciBzdGF0dXNfcmVnLCBwaW9faW50X3JlZywgaW50X3JlZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdDsKKwl1bnNpZ25lZCBpbnQgc2djb3VudDsKKwl1bnNpZ25lZCBpbnQgdG90X3RyYW5zID0gMDsKKworCS8qIFdlIHNlYXJjaCB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBob3N0IGFkYXB0ZXIgd2hpY2ggY2F1c2VkIHRoZSBpbnRlcnJ1cHQgKi8KKwkvKiBGSVhNRTogc2hvdWxkIHBhc3MgZGV2X2lkIHNlbnNpYmx5IGFzIGhvc3RzW2ldICovCisJZm9yKGkgPSAwOyBpIDwgaG9zdF9pbmRleCAmJiAhYmFzZTsgaSsrKQorCQlpZihpcnEgPT0gaG9zdHNbaV0uaXJxKQorCQkJYmFzZSA9IGhvc3RzW2ldLmJhc2U7CisJLyogSWYgbm8gYWRhcHRlciBmb3VuZCwgd2UgY2Fubm90IGhhbmRsZSB0aGUgaW50ZXJydXB0LiBMZWF2ZSBhIG1lc3NhZ2UgKi8KKwkvKiBhbmQgY29udGludWUuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmKCFiYXNlKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeW01M2M0MTY6IE5vIGhvc3QgYWRhcHRlciBkZWZpbmVkIGZvciBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJLyogTm93IHdlIGhhdmUgdGhlIGJhc2UgYWRkcmVzcyBhbmQgd2UgY2FuIHN0YXJ0IGhhbmRsaW5nIHRoZSBpbnRlcnJ1cHQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLGZsYWdzKTsKKwlzdGF0dXNfcmVnID0gaW5iKGJhc2UgKyBTVEFUVVNfUkVHKTsKKwlwaW9faW50X3JlZyA9IGluYihiYXNlICsgUElPX0lOVF9SRUcpOworCWludF9yZWcgPSBpbmIoYmFzZSArIElOVF9SRUcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCS8qIEZpcnN0LCB3ZSBoYW5kbGUgZXJyb3IgY29uZGl0aW9ucyAqLworCWlmKGludF9yZWcgJiBTQ0kpICAgICAgICAgLyogU0NTSSBSZXNldCAqLworCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInN5bTUzYzQxNjogUmVzZXQgcmVjZWl2ZWRcbiIpOworCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGlkbGU7CisJCWN1cnJlbnRfY29tbWFuZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQljdXJyZW50X2NvbW1hbmQtPnNjc2lfZG9uZShjdXJyZW50X2NvbW1hbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlpZihpbnRfcmVnICYgSUxDTUQpICAgICAgIC8qIElsbGVnYWwgQ29tbWFuZCAqLworCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OiBJbGxlZ2FsIENvbW1hbmQ6IDB4JTAyeC5cbiIsIGluYihiYXNlICsgQ09NTUFORF9SRUcpKTsKKwkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJY3VycmVudF9jb21tYW5kLT5zY3NpX2RvbmUoY3VycmVudF9jb21tYW5kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlnb3RvIG91dDsKKwl9CisJaWYoc3RhdHVzX3JlZyAmIEdFKSAgICAgICAgIC8qIEdyb3NzIEVycm9yICovCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW01M2M0MTY6IENvbnRyb2xsZXIgcmVwb3J0cyBncm9zcyBlcnJvci5cbiIpOworCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGlkbGU7CisJCWN1cnJlbnRfY29tbWFuZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQljdXJyZW50X2NvbW1hbmQtPnNjc2lfZG9uZShjdXJyZW50X2NvbW1hbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlpZihzdGF0dXNfcmVnICYgUEUpICAgICAgICAgLyogUGFyaXR5IEVycm9yICovCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW01M2M0MTY6U0NTSSBwYXJpdHkgZXJyb3IuXG4iKTsKKwkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBpZGxlOworCQljdXJyZW50X2NvbW1hbmQtPnJlc3VsdCA9IERJRF9QQVJJVFkgPDwgMTY7CisJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWN1cnJlbnRfY29tbWFuZC0+c2NzaV9kb25lKGN1cnJlbnRfY29tbWFuZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCWlmKHBpb19pbnRfcmVnICYgKENFIHwgT1VFKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN5bTUzYzQxNjogUElPIGludGVycnVwdCBlcnJvci5cbiIpOworCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGlkbGU7CisJCWN1cnJlbnRfY29tbWFuZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQljdXJyZW50X2NvbW1hbmQtPnNjc2lfZG9uZShjdXJyZW50X2NvbW1hbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlpZihpbnRfcmVnICYgRElTKSAgICAgICAgICAgLyogRGlzY29ubmVjdCAqLworCXsKKwkJaWYoY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgIT0gbWVzc2FnZV9pbikKKwkJCWN1cnJlbnRfY29tbWFuZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWVsc2UKKwkJCWN1cnJlbnRfY29tbWFuZC0+cmVzdWx0ID0gKGN1cnJlbnRfY29tbWFuZC0+U0NwLlN0YXR1cyAmIDB4RkYpIHwgKChjdXJyZW50X2NvbW1hbmQtPlNDcC5NZXNzYWdlICYgMHhGRikgPDwgOCkgfCAoRElEX09LIDw8IDE2KTsKKwkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBpZGxlOworCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworCQljdXJyZW50X2NvbW1hbmQtPnNjc2lfZG9uZShjdXJyZW50X2NvbW1hbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwkvKiBOb3cgd2UgaGFuZGxlIFNDU0kgcGhhc2VzICAgICAgICAgKi8KKworCXN3aXRjaChzdGF0dXNfcmVnICYgUEhCSVRTKSAgICAgICAvKiBGaWx0ZXIgU0NTSSBwaGFzZSBvdXQgb2Ygc3RhdHVzIHJlZyAqLworCXsKKwkJY2FzZSBQSEFTRV9EQVRBX09VVDoKKwkJeworCQkJaWYoaW50X3JlZyAmIEJTKQorCQkJeworCQkJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gZGF0YV9vdXQ7CisJCQkJb3V0YihGTFVTSF9GSUZPLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJCXN5bTUzYzQxNl9zZXRfdHJhbnNmZXJfY291bnRlcihiYXNlLCBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQkJb3V0YihUUkFOU0ZFUl9JTkZPUk1BVElPTiB8IFBJT19NT0RFLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJCWlmKCFjdXJyZW50X2NvbW1hbmQtPnVzZV9zZykKKwkJCQkJdG90X3RyYW5zID0gc3ltNTNjNDE2X3dyaXRlKGJhc2UsIGN1cnJlbnRfY29tbWFuZC0+cmVxdWVzdF9idWZmZXIsIGN1cnJlbnRfY29tbWFuZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlzZ2NvdW50ID0gY3VycmVudF9jb21tYW5kLT51c2Vfc2c7CisJCQkJCXNnbGlzdCA9IGN1cnJlbnRfY29tbWFuZC0+cmVxdWVzdF9idWZmZXI7CisJCQkJCXdoaWxlKHNnY291bnQtLSkKKwkJCQkJeworCQkJCQkJdG90X3RyYW5zICs9IHN5bTUzYzQxNl93cml0ZShiYXNlLCBTR19BRERSRVNTKHNnbGlzdCksIHNnbGlzdC0+bGVuZ3RoKTsKKwkJCQkJCXNnbGlzdCsrOworCQkJCQl9CisJCQkJfQorCQkJCWlmKHRvdF90cmFucyA8IGN1cnJlbnRfY29tbWFuZC0+dW5kZXJmbG93KQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW01M2M0MTY6IFVuZGVyZmxvdywgd3JvdGUgJWQgYnl0ZXMsIHJlcXVlc3QgZm9yICVkIGJ5dGVzLlxuIiwgdG90X3RyYW5zLCBjdXJyZW50X2NvbW1hbmQtPnVuZGVyZmxvdyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgUEhBU0VfREFUQV9JTjoKKwkJeworCQkJaWYoaW50X3JlZyAmIEJTKQorCQkJeworCQkJCWN1cnJlbnRfY29tbWFuZC0+U0NwLnBoYXNlID0gZGF0YV9pbjsKKwkJCQlvdXRiKEZMVVNIX0ZJRk8sIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJCQkJc3ltNTNjNDE2X3NldF90cmFuc2Zlcl9jb3VudGVyKGJhc2UsIGN1cnJlbnRfY29tbWFuZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCQlvdXRiKFRSQU5TRkVSX0lORk9STUFUSU9OIHwgUElPX01PREUsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJCQkJaWYoIWN1cnJlbnRfY29tbWFuZC0+dXNlX3NnKQorCQkJCQl0b3RfdHJhbnMgPSBzeW01M2M0MTZfcmVhZChiYXNlLCBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmVyLCBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmxlbik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc2djb3VudCA9IGN1cnJlbnRfY29tbWFuZC0+dXNlX3NnOworCQkJCQlzZ2xpc3QgPSBjdXJyZW50X2NvbW1hbmQtPnJlcXVlc3RfYnVmZmVyOworCQkJCQl3aGlsZShzZ2NvdW50LS0pCisJCQkJCXsKKwkJCQkJCXRvdF90cmFucyArPSBzeW01M2M0MTZfcmVhZChiYXNlLCBTR19BRERSRVNTKHNnbGlzdCksIHNnbGlzdC0+bGVuZ3RoKTsKKwkJCQkJCXNnbGlzdCsrOworCQkJCQl9CisJCQkJfQorCQkJCWlmKHRvdF90cmFucyA8IGN1cnJlbnRfY29tbWFuZC0+dW5kZXJmbG93KQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW01M2M0MTY6IFVuZGVyZmxvdywgcmVhZCAlZCBieXRlcywgcmVxdWVzdCBmb3IgJWQgYnl0ZXMuXG4iLCB0b3RfdHJhbnMsIGN1cnJlbnRfY29tbWFuZC0+dW5kZXJmbG93KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBQSEFTRV9DT01NQU5EOgorCQl7CisJCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGNvbW1hbmRfcGg7CisJCQlwcmludGsoS0VSTl9FUlIgInN5bTUzYzQxNjogVW5rbm93biBpbnRlcnJ1cHQgaW4gY29tbWFuZCBwaGFzZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFBIQVNFX1NUQVRVUzoKKwkJeworCQkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBzdGF0dXNfcGg7CisJCQlvdXRiKEZMVVNIX0ZJRk8sIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJCQlvdXRiKElOSVRfQ09NTV9DT01QTEVURV9TRVEsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FzZSBQSEFTRV9SRVNFUlZFRF8xOgorCQljYXNlIFBIQVNFX1JFU0VSVkVEXzI6CisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAic3ltNTNjNDE2OiBSZXNlcnZlZCBwaGFzZSBvY2N1cnJlZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFBIQVNFX01FU1NBR0VfT1VUOgorCQl7CisJCQljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IG1lc3NhZ2Vfb3V0OworCQkJb3V0YihTRVRfQVROLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJb3V0YihNU0dfQUNDRVBURUQsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgUEhBU0VfTUVTU0FHRV9JTjoKKwkJeworCQkJY3VycmVudF9jb21tYW5kLT5TQ3AucGhhc2UgPSBtZXNzYWdlX2luOworCQkJY3VycmVudF9jb21tYW5kLT5TQ3AuU3RhdHVzID0gaW5iKGJhc2UgKyBTQ1NJX0ZJRk8pOworCQkJY3VycmVudF9jb21tYW5kLT5TQ3AuTWVzc2FnZSA9IGluYihiYXNlICsgU0NTSV9GSUZPKTsKKwkJCWlmKGN1cnJlbnRfY29tbWFuZC0+U0NwLk1lc3NhZ2UgPT0gU0FWRV9QT0lOVEVSUyB8fCBjdXJyZW50X2NvbW1hbmQtPlNDcC5NZXNzYWdlID09IERJU0NPTk5FQ1QpCisJCQkJb3V0YihTRVRfQVROLCBiYXNlICsgQ09NTUFORF9SRUcpOworCQkJb3V0YihNU0dfQUNDRVBURUQsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJCQlicmVhazsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHN5bTUzYzQxNl9pbml0KGludCBiYXNlLCBpbnQgc2NzaV9pZCkKK3sKKwlvdXRiKFJFU0VUX0NISVAsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJb3V0YihOT09QLCBiYXNlICsgQ09NTUFORF9SRUcpOworCW91dGIoMHg5OSwgYmFzZSArIFRPTSk7IC8qIFRpbWUgb3V0IG9mIDI1MCBtcyAqLworCW91dGIoMHgwNSwgYmFzZSArIFNUUCk7CisJb3V0YigweDAwLCBiYXNlICsgU1lOQ19PRkZTRVQpOworCW91dGIoRVBDIHwgc2NzaV9pZCwgYmFzZSArIENPTkZfUkVHXzEpOworCW91dGIoRkUgfCBTQ1NJMiB8IFRCUEEsIGJhc2UgKyBDT05GX1JFR18yKTsKKwlvdXRiKElETVJDIHwgUVRFIHwgQ0RCMTAgfCBGU0NTSSB8IEZDTEssIGJhc2UgKyBDT05GX1JFR18zKTsKKwlvdXRiKDB4ODMgfCBFQU4sIGJhc2UgKyBDT05GX1JFR180KTsKKwlvdXRiKElFIHwgV1NFMCwgYmFzZSArIENPTkZfUkVHXzUpOworCW91dGIoMCwgYmFzZSArIEZFQVRVUkVfRU4pOworfQorCitzdGF0aWMgaW50IHN5bTUzYzQxNl9wcm9iZWlycShpbnQgYmFzZSwgaW50IHNjc2lfaWQpCit7CisJaW50IGlycSwgaXJxczsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwlpbmIoYmFzZSArIElOVF9SRUcpOworCS8qIFN0YXJ0IHByb2JpbmcgZm9yIGlycSdzICovCisJaXJxcyA9IHByb2JlX2lycV9vbigpOworCS8qIFJlaW5pdCBjaGlwICovCisJc3ltNTNjNDE2X2luaXQoYmFzZSwgc2NzaV9pZCk7CisJLyogQ2F1c2UgaW50ZXJydXB0ICovCisJb3V0YihOT09QLCBiYXNlICsgQ09NTUFORF9SRUcpOworCW91dGIoSUxMRUdBTCwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlvdXRiKDB4MDcsIGJhc2UgKyBERVNUX0JVU19JRCk7CisJb3V0YigweDAwLCBiYXNlICsgREVTVF9CVVNfSUQpOworCS8qIFdhaXQgZm9yIGludGVycnVwdCB0byBvY2N1ciAqLworCWkgPSBqaWZmaWVzICsgMjA7CisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgaSkgJiYgIShpbmIoYmFzZSArIFNUQVRVU19SRUcpICYgU0NJKSkKKwkJYmFycmllcigpOworCWlmKHRpbWVfYmVmb3JlX2VxKGksIGppZmZpZXMpKQkvKiB0aW1lZCBvdXQgKi8KKwkJcmV0dXJuIDA7CisJLyogR2V0IG9jY3VycmVkIGlycSAqLworCWlycSA9IHByb2JlX2lycV9vZmYoaXJxcyk7CisJc3ltNTNjNDE2X2luaXQoYmFzZSwgc2NzaV9pZCk7CisJcmV0dXJuIGlycTsKK30KKworLyogU2V0dXA6IHN5bTUzYzQxNj1iYXNlLGlycSAqLwordm9pZCBzeW01M2M0MTZfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCit7CisJaW50IGk7CisKKwlpZihob3N0X2luZGV4ID49IE1BWEhPU1RTKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OiBUb28gbWFueSBob3N0cyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZihpbnRzWzBdIDwgMSB8fCBpbnRzWzBdID4gMikKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic3ltNTNjNDE2OiBXcm9uZyBudW1iZXIgb2YgcGFyYW1ldGVyczpcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInN5bTUzYzQxNjogdXNhZ2U6IHN5bTUzYzQxNj08YmFzZT5bLDxpcnE+XVxuIik7CisJCXJldHVybjsKKwl9CisJZm9yKGkgPSAwOyBpIDwgaG9zdF9pbmRleCAmJiBpID49IDA7IGkrKykKKwkgICAgICAgIGlmKGhvc3RzW2ldLmJhc2UgPT0gaW50c1sxXSkKKyAgICAgICAgCQlpID0gLTI7CisJaWYoaSA+PSAwKQorCXsKKyAgICAgICAgCWhvc3RzW2hvc3RfaW5kZXhdLmJhc2UgPSBpbnRzWzFdOworICAgICAgICAJaG9zdHNbaG9zdF9pbmRleF0uaXJxID0gKGludHNbMF0gPT0gMik/IGludHNbMl0gOiAwOworICAgICAgICAJaG9zdF9pbmRleCsrOworCX0KK30KKworc3RhdGljIGludCBzeW01M2M0MTZfdGVzdChpbnQgYmFzZSkKK3sKKwlvdXRiKFJFU0VUX0NISVAsIGJhc2UgKyBDT01NQU5EX1JFRyk7CisJb3V0YihOT09QLCBiYXNlICsgQ09NTUFORF9SRUcpOworCWlmKGluYihiYXNlICsgQ09NTUFORF9SRUcpICE9IE5PT1ApCisJCXJldHVybiAwOworCWlmKCFpbmIoYmFzZSArIFRDX0hJR0gpIHx8IGluYihiYXNlICsgVENfSElHSCkgPT0gMHhGRikKKwkJcmV0dXJuIDA7CisJaWYoKGluYihiYXNlICsgUElPX0lOVF9SRUcpICYgKEZVTEwgfCBFTVBUWSB8IENFIHwgT1VFIHwgRklFIHwgRUlFKSkgIT0gRU1QVFkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCBpZF90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdTJywnTCcsJ0knKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NDE2MSksIDAgfSwKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1MnLCdMJywnSScpLCBJU0FQTlBfRlVOQ1RJT04oMHg0MTYzKSwgMCB9LAorCXsJSVNBUE5QX0RFVklDRV9TSU5HTEVfRU5EIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpZF90YWJsZSk7CisKK3N0YXRpYyB2b2lkIHN5bTUzYzQxNl9wcm9iZSh2b2lkKQoreworCWludCAqYmFzZSA9IHByb2JlYWRkcnM7CisJaW50IGludHNbMl07CisKKwlpbnRzWzBdID0gMTsKKwlmb3IoOyAqYmFzZTsgYmFzZSsrKSB7CisJCWlmIChyZXF1ZXN0X3JlZ2lvbigqYmFzZSwgSU9fUkFOR0UsIElEKSkgeworCQkJaWYgKHN5bTUzYzQxNl90ZXN0KCpiYXNlKSkgeworCQkJCWludHNbMV0gPSAqYmFzZTsKKwkJCQlzeW01M2M0MTZfc2V0dXAoTlVMTCwgaW50cyk7CisJCQl9CisJCQlyZWxlYXNlX3JlZ2lvbigqYmFzZSwgSU9fUkFOR0UpOworCQl9CisJfQorfQorCitpbnQgX19pbml0IHN5bTUzYzQxNl9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICp0cG50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IFNjc2lfSG9zdCAqIHNocG50ID0gTlVMTDsKKwlpbnQgaTsKKwlpbnQgY291bnQ7CisJc3RydWN0IHBucF9kZXYgKmlkZXYgPSBOVUxMOworCQorI2lmZGVmIE1PRFVMRQorCWludCBpbnRzWzNdOworCisJaW50c1swXSA9IDI7CisJaWYoc3ltNTNjNDE2X2Jhc2UpCisJeworCQlpbnRzWzFdID0gc3ltNTNjNDE2X2Jhc2VbMF07CisJCWludHNbMl0gPSBzeW01M2M0MTZfYmFzZVsxXTsKKwkJc3ltNTNjNDE2X3NldHVwKE5VTEwsIGludHMpOworCX0KKwlpZihzeW01M2M0MTZfYmFzZV8xKQorCXsKKwkJaW50c1sxXSA9IHN5bTUzYzQxNl9iYXNlXzFbMF07CisJCWludHNbMl0gPSBzeW01M2M0MTZfYmFzZV8xWzFdOworCQlzeW01M2M0MTZfc2V0dXAoTlVMTCwgaW50cyk7CisJfQorCWlmKHN5bTUzYzQxNl9iYXNlXzIpCisJeworCQlpbnRzWzFdID0gc3ltNTNjNDE2X2Jhc2VfMlswXTsKKwkJaW50c1syXSA9IHN5bTUzYzQxNl9iYXNlXzJbMV07CisJCXN5bTUzYzQxNl9zZXR1cChOVUxMLCBpbnRzKTsKKwl9CisJaWYoc3ltNTNjNDE2X2Jhc2VfMykKKwl7CisJCWludHNbMV0gPSBzeW01M2M0MTZfYmFzZV8zWzBdOworCQlpbnRzWzJdID0gc3ltNTNjNDE2X2Jhc2VfM1sxXTsKKwkJc3ltNTNjNDE2X3NldHVwKE5VTEwsIGludHMpOworCX0KKyNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gInN5bTUzYzQxNi5jOiAlc1xuIiwgVkVSU0lPTl9TVFJJTkcpOworCisJZm9yIChpPTA7IGlkX3RhYmxlW2ldLnZlbmRvciAhPSAwOyBpKyspIHsKKwkJd2hpbGUoKGlkZXY9cG5wX2ZpbmRfZGV2KE5VTEwsIGlkX3RhYmxlW2ldLnZlbmRvciwKKwkJCQkJaWRfdGFibGVbaV0uZnVuY3Rpb24sIGlkZXYpKSE9TlVMTCkKKwkJeworCQkJaW50IGlbM107CisKKwkJCWlmKHBucF9kZXZpY2VfYXR0YWNoKGlkZXYpPDApCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ltNTNjNDE2OiB1bmFibGUgdG8gYXR0YWNoIFBuUCBkZXZpY2UuXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmKHBucF9hY3RpdmF0ZV9kZXYoaWRldikgPCAwKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInN5bTUzYzQxNjogdW5hYmxlIHRvIGFjdGl2YXRlIFBuUCBkZXZpY2UuXG4iKTsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCQorCQkJfQorCisJCQlpWzBdID0gMjsKKwkJCWlbMV0gPSBwbnBfcG9ydF9zdGFydChpZGV2LCAwKTsKKyAJCQlpWzJdID0gcG5wX2lycShpZGV2LCAwKTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAic3ltNTNjNDE2OiBJU0FQblAgY2FyZCBmb3VuZCBhbmQgY29uZmlndXJlZCBhdCAweCVYLCBJUlEgJWQuXG4iLAorCQkJCWlbMV0sIGlbMl0pOworIAkJCXN5bTUzYzQxNl9zZXR1cChOVUxMLCBpKTsKKyAJCX0KKwl9CisJc3ltNTNjNDE2X3Byb2JlKCk7CisKKwkvKiBOb3cgd2UgcmVnaXN0ZXIgYW5kIHNldCB1cCBlYWNoIGhvc3QgYWRhcHRlciBmb3VuZC4uLiAqLworCWZvcihjb3VudCA9IDAsIGkgPSAwOyBpIDwgaG9zdF9pbmRleDsgaSsrKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oaG9zdHNbaV0uYmFzZSwgSU9fUkFOR0UsIElEKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN5bTUzYzQxNl90ZXN0KGhvc3RzW2ldLmJhc2UpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBzeW01M2M0MTYgZm91bmQgYXQgYWRkcmVzcyAweCUwM3hcbiIsIGhvc3RzW2ldLmJhc2UpOworCQkJZ290byBmYWlsX3JlbGVhc2VfcmVnaW9uOworCQl9CisKKwkJLyogV2UgZG9uJ3QgaGF2ZSBhbiBpcnEgeWV0LCBzbyB3ZSBzaG91bGQgcHJvYmUgZm9yIG9uZSAqLworCQlpZiAoIWhvc3RzW2ldLmlycSkKKwkJCWhvc3RzW2ldLmlycSA9IHN5bTUzYzQxNl9wcm9iZWlycShob3N0c1tpXS5iYXNlLCBob3N0c1tpXS5zY3NpX2lkKTsKKwkJaWYgKCFob3N0c1tpXS5pcnEpCisJCQlnb3RvIGZhaWxfcmVsZWFzZV9yZWdpb247CisJCisJCXNocG50ID0gc2NzaV9yZWdpc3Rlcih0cG50LCAwKTsKKwkJaWYgKCFzaHBudCkKKwkJCWdvdG8gZmFpbF9yZWxlYXNlX3JlZ2lvbjsKKwkJLyogUmVxdWVzdCBmb3Igc3BlY2lmaWVkIElSUSAqLworCQlpZiAocmVxdWVzdF9pcnEoaG9zdHNbaV0uaXJxLCBzeW01M2M0MTZfaW50cl9oYW5kbGUsIDAsIElELCBzaHBudCkpCisJCQlnb3RvIGZhaWxfZnJlZV9ob3N0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCQlzaHBudC0+dW5pcXVlX2lkID0gaG9zdHNbaV0uYmFzZTsKKwkJc2hwbnQtPmlvX3BvcnQgPSBob3N0c1tpXS5iYXNlOworCQlzaHBudC0+bl9pb19wb3J0ID0gSU9fUkFOR0U7CisJCXNocG50LT5pcnEgPSBob3N0c1tpXS5pcnE7CisJCXNocG50LT50aGlzX2lkID0gaG9zdHNbaV0uc2NzaV9pZDsKKwkJc3ltNTNjNDE2X2luaXQoaG9zdHNbaV0uYmFzZSwgaG9zdHNbaV0uc2NzaV9pZCk7CisJCWNvdW50Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bTUzYzQxNl9sb2NrLCBmbGFncyk7CisJCWNvbnRpbnVlOworCisgZmFpbF9mcmVlX2hvc3Q6CisJCXNjc2lfdW5yZWdpc3RlcihzaHBudCk7CisgZmFpbF9yZWxlYXNlX3JlZ2lvbjoKKwkJcmVsZWFzZV9yZWdpb24oaG9zdHNbaV0uYmFzZSwgSU9fUkFOR0UpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK2NvbnN0IGNoYXIgKnN5bTUzYzQxNl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKlNDaG9zdCkKK3sKKwlpbnQgaTsKKwlpbnQgYmFzZSA9IFNDaG9zdC0+aW9fcG9ydDsKKwlpbnQgaXJxID0gU0Nob3N0LT5pcnE7CisJaW50IHNjc2lfaWQgPSAwOworCWludCByZXYgPSBpbmIoYmFzZSArIFRDX0hJR0gpOworCisJZm9yKGkgPSAwOyBpIDwgaG9zdF9pbmRleDsgaSsrKQorCQlpZihob3N0c1tpXS5iYXNlID09IGJhc2UpCisJCQlzY3NpX2lkID0gaG9zdHNbaV0uc2NzaV9pZDsKKwlzcHJpbnRmKGluZm8sICJTeW1iaW9zIExvZ2ljIDUzYzQxNiAocmV2LiAlZCkgYXQgMHglMDN4LCBpcnEgJWQsIFNDU0ktSUQgJWQsICVzIHBpbyIsIHJldiwgYmFzZSwgaXJxLCBzY3NpX2lkLCAoZmFzdHBpbyk/ICJmYXN0IiA6ICJzbG93Iik7CisJcmV0dXJuIGluZm87Cit9CisKK2ludCBzeW01M2M0MTZfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpCit7CisJaW50IGJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IGk7CisKKwkvKiBTdG9yZSBiYXNlIHJlZ2lzdGVyIGFzIHdlIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgY29udHJvbGxlciBpbiB0aGUgc3lzdGVtICovCisJYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CisJY3VycmVudF9jb21tYW5kID0gU0NwbnQ7ICAgICAgICAgICAgICAgICAgLyogc2V0IGN1cnJlbnQgY29tbWFuZCAgICAgICAgICAgICAgICAqLworCWN1cnJlbnRfY29tbWFuZC0+c2NzaV9kb25lID0gZG9uZTsgICAgICAgIC8qIHNldCBwdHIgdG8gZG9uZSBmdW5jdGlvbiAgICAgICAgICAgKi8KKwljdXJyZW50X2NvbW1hbmQtPlNDcC5waGFzZSA9IGNvbW1hbmRfcGg7ICAvKiBjdXJyZWN0IHBoYXNlIGlzIHRoZSBjb21tYW5kIHBoYXNlICovCisJY3VycmVudF9jb21tYW5kLT5TQ3AuU3RhdHVzID0gMDsKKwljdXJyZW50X2NvbW1hbmQtPlNDcC5NZXNzYWdlID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCW91dGIoU0NwbnQtPmRldmljZS0+aWQsIGJhc2UgKyBERVNUX0JVU19JRCk7IC8qIFNldCBzY3NpIGlkIHRhcmdldCAgICAgICAgKi8KKwlvdXRiKEZMVVNIX0ZJRk8sIGJhc2UgKyBDT01NQU5EX1JFRyk7ICAgIC8qIEZsdXNoIFNDU0kgYW5kIFBJTyBGSUZPJ3MgKi8KKwkvKiBXcml0ZSBTQ1NJIGNvbW1hbmQgaW50byB0aGUgU0NTSSBmaWZvICovCisJZm9yKGkgPSAwOyBpIDwgU0NwbnQtPmNtZF9sZW47IGkrKykKKwkJb3V0YihTQ3BudC0+Y21uZFtpXSwgYmFzZSArIFNDU0lfRklGTyk7CisJLyogU3RhcnQgc2VsZWN0aW9uIHNlcXVlbmNlICovCisJb3V0YihTRUxfV0lUSE9VVF9BVE5fU0VRLCBiYXNlICsgQ09NTUFORF9SRUcpOworCS8qIE5vdyBhbiBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgd2hpY2ggd2Ugd2lsbCBjYXRjaCBpbiBvdXQgaW50ZXJydXB0IHJvdXRpbmUgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M0MTZfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bTUzYzQxNl9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2J1c19yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCXJldHVybiBGQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKwlpbnQgYmFzZTsKKwlpbnQgc2NzaV9pZCA9IC0xOwkKKwlpbnQgaTsKKworCS8qIHByaW50aygic3ltNTNjNDE2X3Jlc2V0XG4iKTsgKi8KKwliYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKKwkvKiBzZWFyY2ggc2NzaV9pZCAtIGZpeG1lLCB3ZSBzaG91bGRudCBuZWVkIHRvIGl0ZXJhdGUgZm9yIHRoaXMhICovCisJZm9yKGkgPSAwOyBpIDwgaG9zdF9pbmRleCAmJiBzY3NpX2lkICE9IC0xOyBpKyspCisJCWlmKGhvc3RzW2ldLmJhc2UgPT0gYmFzZSkKKwkJCXNjc2lfaWQgPSBob3N0c1tpXS5zY3NpX2lkOworCW91dGIoUkVTRVRfQ0hJUCwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlvdXRiKE5PT1AgfCBQSU9fTU9ERSwgYmFzZSArIENPTU1BTkRfUkVHKTsKKwlvdXRiKFJFU0VUX1NDU0lfQlVTLCBiYXNlICsgQ09NTUFORF9SRUcpOworCXN5bTUzYzQxNl9pbml0KGJhc2UsIHNjc2lfaWQpOworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IHN5bTUzYzQxNl9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBzaG9zdCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW01M2M0MTZfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCXN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaXApCit7CisJaW50IHNpemU7CisKKwlzaXplID0gY2FwYWNpdHk7CisJaXBbMF0gPSA2NDsJCQkJLyogaGVhZHMgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlwWzFdID0gMzI7CQkJCS8qIHNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZigoaXBbMl0gPSBzaXplID4+IDExKSA+IDEwMjQpCQkvKiBjeWxpbmRlcnMsIHRlc3QgZm9yIGJpZyBkaXNrICovCisJeworCQlpcFswXSA9IDI1NTsJCQkvKiBoZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICovCisJCWlwWzFdID0gNjM7CQkJLyogc2VjdG9ycyAgICAgICAgICAgICAgICAgICAgICAqLworCQlpcFsyXSA9IHNpemUgLyAoMjU1ICogNjMpOwkvKiBjeWxpbmRlcnMgICAgICAgICAgICAgICAgICAgICovCisJfQorCXJldHVybiAwOworfQorCisvKiBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydCAqLworI2lmZGVmIE1PRFVMRQorCitNT0RVTEVfQVVUSE9SKCJMaWV2ZW4gV2lsbGVtcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoc3ltNTNjNDE2LCB1aW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShzeW01M2M0MTZfMSwgdWludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoc3ltNTNjNDE2XzIsIHVpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHN5bTUzYzQxNl8zLCB1aW50LCBOVUxMLCAwKTsKKworI2VuZGlmCisKK3N0YXRpYyBTY3NpX0hvc3RfVGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUgPQkJInN5bTUzYzQxNiIsCisJLm5hbWUgPQkJCSJTeW1iaW9zIExvZ2ljIDUzYzQxNiIsCisJLmRldGVjdCA9CQlzeW01M2M0MTZfZGV0ZWN0LAorCS5pbmZvID0JCQlzeW01M2M0MTZfaW5mbywJCisJLnF1ZXVlY29tbWFuZCA9CQlzeW01M2M0MTZfcXVldWVjb21tYW5kLAorCS5laF9hYm9ydF9oYW5kbGVyID0Jc3ltNTNjNDE2X2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPXN5bTUzYzQxNl9ob3N0X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciA9IHN5bTUzYzQxNl9idXNfcmVzZXQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID1zeW01M2M0MTZfZGV2aWNlX3Jlc2V0LAorCS5yZWxlYXNlID0gCQlzeW01M2M0MTZfcmVsZWFzZSwKKwkuYmlvc19wYXJhbSA9CQlzeW01M2M0MTZfYmlvc19wYXJhbSwKKwkuY2FuX3F1ZXVlID0JCTEsCisJLnRoaXNfaWQgPQkJU1lNNTNDNDE2X1NDU0lfSUQsCisJLnNnX3RhYmxlc2l6ZSA9CQkzMiwKKwkuY21kX3Blcl9sdW4gPQkJMSwKKwkudW5jaGVja2VkX2lzYV9kbWEgPQkxLAorCS51c2VfY2x1c3RlcmluZyA9CUVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKyNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzQxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGUzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjNDE2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqICBzeW01M2M0MTYuaAorICogCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IExpZXZlbiBXaWxsZW1zIChsd19saW51eEBob3RtYWlsLmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiAgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfU1lNNTNDNDE2X0gKKyNkZWZpbmUgX1NZTTUzQzQxNl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFNZTTUzQzQxNl9TQ1NJX0lEIDcKKworc3RhdGljIGludCBzeW01M2M0MTZfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpzeW01M2M0MTZfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBzeW01M2M0MTZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICopOworc3RhdGljIGludCBzeW01M2M0MTZfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKTsKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2hvc3RfcmVzZXQoU2NzaV9DbW5kICopOworc3RhdGljIGludCBzeW01M2M0MTZfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgc3ltNTNjNDE2X2RldmljZV9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN5bTUzYzQxNl9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCXNlY3Rvcl90LCBpbnQgKik7CitzdGF0aWMgdm9pZCBzeW01M2M0MTZfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczZThjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKKyMgTWFrZWZpbGUgZm9yIHRoZSBOQ1IvU1lNQklPUy9MU0kgNTNDOFhYIFBDSSBTQ1NJIGNvbnRyb2xsZXJzIGRyaXZlci4KKworc3ltNTNjOHh4LW9ianMgOj0gc3ltX2Z3Lm8gc3ltX2dsdWUubyBzeW1faGlwZC5vIHN5bV9tYWxsb2MubyBzeW1fbnZyYW0ubworb2JqLSQoQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIpIDo9IHN5bTUzYzh4eC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltNTNjOHh4LmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltNTNjOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxMTAzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW01M2M4eHguaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIFNZTTUzQzhYWF9ICisjZGVmaW5lIFNZTTUzQzhYWF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqICBETUEgYWRkcmVzc2luZyBtb2RlLgorICoKKyAqICAwIDogMzIgYml0IGFkZHJlc3NpbmcgZm9yIGFsbCBjaGlwcy4KKyAqICAxIDogNDAgYml0IGFkZHJlc3Npbmcgd2hlbiBzdXBwb3J0ZWQgYnkgY2hpcC4KKyAqICAyIDogNjQgYml0IGFkZHJlc3Npbmcgd2hlbiBzdXBwb3J0ZWQgYnkgY2hpcCwKKyAqICAgICAgbGltaXRlZCB0byAxNiBzZWdtZW50cyBvZiA0IEdCIC0+IDY0IEdCIG1heC4KKyAqLworI2RlZmluZQlTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9ETUFfQUREUkVTU0lOR19NT0RFCisKKy8qCisgKiAgTlZSQU0gc3VwcG9ydC4KKyAqLworI2lmIDEKKyNkZWZpbmUgU1lNX0NPTkZfTlZSQU1fU1VQUE9SVAkJKDEpCisjZW5kaWYKKworLyoKKyAqICBUaGVzZSBvcHRpb25zIGFyZSBub3QgdHVuYWJsZSBmcm9tICdtYWtlIGNvbmZpZycKKyAqLworI2lmIDEKKyNkZWZpbmUJU1lNX0xJTlVYX1BST0NfSU5GT19TVVBQT1JUCisjZGVmaW5lIFNZTV9MSU5VWF9VU0VSX0NPTU1BTkRfU1VQUE9SVAorI2RlZmluZSBTWU1fTElOVVhfVVNFUl9JTkZPX1NVUFBPUlQKKyNkZWZpbmUgU1lNX0xJTlVYX0RFQlVHX0NPTlRST0xfU1VQUE9SVAorI2VuZGlmCisKKy8qCisgKiAgQWxzbyBoYW5kbGUgb2xkIE5DUiBjaGlwcyBpZiBub3QgKDApLgorICovCisjZGVmaW5lIFNZTV9DT05GX0dFTkVSSUNfU1VQUE9SVAkoMSkKKworLyoKKyAqICBBbGxvdyB0YWdzIGZyb20gMiB0byAyNTYsIGRlZmF1bHQgOAorICovCisjaWZuZGVmIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9NQVhfVEFHUworI2RlZmluZSBDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1MJKDgpCisjZW5kaWYKKworI2lmCUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9NQVhfVEFHUyA8IDIKKyNkZWZpbmUgU1lNX0NPTkZfTUFYX1RBRwkoMikKKyNlbGlmCUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9NQVhfVEFHUyA+IDI1NgorI2RlZmluZSBTWU1fQ09ORl9NQVhfVEFHCSgyNTYpCisjZWxzZQorI2RlZmluZQlTWU1fQ09ORl9NQVhfVEFHCUNPTkZJR19TQ1NJX1NZTTUzQzhYWF9NQVhfVEFHUworI2VuZGlmCisKKyNpZm5kZWYJQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUworI2RlZmluZQlDT05GSUdfU0NTSV9TWU01M0M4WFhfREVGQVVMVF9UQUdTCVNZTV9DT05GX01BWF9UQUcKKyNlbmRpZgorCisvKgorICogIEFueXdheSwgd2UgY29uZmlndXJlIHRoZSBkcml2ZXIgZm9yIGF0IGxlYXN0IDY0IHRhZ3MgcGVyIExVTi4gOikKKyAqLworI2lmCVNZTV9DT05GX01BWF9UQUcgPD0gNjQKKyNkZWZpbmUgU1lNX0NPTkZfTUFYX1RBR19PUkRFUgkoNikKKyNlbGlmCVNZTV9DT05GX01BWF9UQUcgPD0gMTI4CisjZGVmaW5lIFNZTV9DT05GX01BWF9UQUdfT1JERVIJKDcpCisjZWxzZQorI2RlZmluZSBTWU1fQ09ORl9NQVhfVEFHX09SREVSCSg4KQorI2VuZGlmCisKKy8qCisgKiAgTWF4IG51bWJlciBvZiBTRyBlbnRyaWVzLgorICovCisjZGVmaW5lIFNZTV9DT05GX01BWF9TRwkJKDk2KQorCisvKgorICogIERyaXZlciBzZXR1cCBzdHJ1Y3R1cmUuCisgKgorICogIFRoaXMgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIGZyb20gbGludXggY29uZmlnIG9wdGlvbnMuCisgKiAgSXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgYm9vdC11cCBieSB0aGUgYm9vdCBjb21tYW5kIGxpbmUuCisgKi8KK3N0cnVjdCBzeW1fZHJpdmVyX3NldHVwIHsKKwl1X3Nob3J0CW1heF90YWc7CisJdV9jaGFyCWJ1cnN0X29yZGVyOworCXVfY2hhcglzY3NpX2xlZDsKKwl1X2NoYXIJc2NzaV9kaWZmOworCXVfY2hhcglpcnFfbW9kZTsKKwl1X2NoYXIJc2NzaV9idXNfY2hlY2s7CisJdV9jaGFyCWhvc3RfaWQ7CisKKwl1X2NoYXIJdmVyYm9zZTsKKwl1X2NoYXIJc2V0dGxlX2RlbGF5OworCXVfY2hhcgl1c2VfbnZyYW07CisJdV9sb25nCWV4Y2x1ZGVzWzhdOworCWNoYXIJdGFnX2N0cmxbMTAwXTsKK307CisKKyNkZWZpbmUgU1lNX1NFVFVQX01BWF9UQUcJCXN5bV9kcml2ZXJfc2V0dXAubWF4X3RhZworI2RlZmluZSBTWU1fU0VUVVBfQlVSU1RfT1JERVIJCXN5bV9kcml2ZXJfc2V0dXAuYnVyc3Rfb3JkZXIKKyNkZWZpbmUgU1lNX1NFVFVQX1NDU0lfTEVECQlzeW1fZHJpdmVyX3NldHVwLnNjc2lfbGVkCisjZGVmaW5lIFNZTV9TRVRVUF9TQ1NJX0RJRkYJCXN5bV9kcml2ZXJfc2V0dXAuc2NzaV9kaWZmCisjZGVmaW5lIFNZTV9TRVRVUF9JUlFfTU9ERQkJc3ltX2RyaXZlcl9zZXR1cC5pcnFfbW9kZQorI2RlZmluZSBTWU1fU0VUVVBfU0NTSV9CVVNfQ0hFQ0sJc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2J1c19jaGVjaworI2RlZmluZSBTWU1fU0VUVVBfSE9TVF9JRAkJc3ltX2RyaXZlcl9zZXR1cC5ob3N0X2lkCisjZGVmaW5lIGJvb3RfdmVyYm9zZQkJCXN5bV9kcml2ZXJfc2V0dXAudmVyYm9zZQorCisvKgorICogIEluaXRpYWwgc2V0dXAuCisgKgorICogIENhbiBiZSBvdmVycmlkZW4gYXQgc3RhcnR1cCBieSBhIGNvbW1hbmQgbGluZS4KKyAqLworI2RlZmluZSBTWU1fTElOVVhfRFJJVkVSX1NFVFVQCXsJCQkJXAorCS5tYXhfdGFnCT0gQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUywJXAorCS5idXJzdF9vcmRlcgk9IDcsCQkJCQlcCisJLnNjc2lfbGVkCT0gMSwJCQkJCVwKKwkuc2NzaV9kaWZmCT0gMSwJCQkJCVwKKwkuaXJxX21vZGUJPSAwLAkJCQkJXAorCS5zY3NpX2J1c19jaGVjawk9IDEsCQkJCQlcCisJLmhvc3RfaWQJPSA3LAkJCQkJXAorCS52ZXJib3NlCT0gMCwJCQkJCVwKKwkuc2V0dGxlX2RlbGF5CT0gMywJCQkJCVwKKwkudXNlX252cmFtCT0gMSwJCQkJCVwKK30KKworZXh0ZXJuIHN0cnVjdCBzeW1fZHJpdmVyX3NldHVwIHN5bV9kcml2ZXJfc2V0dXA7CitleHRlcm4gdW5zaWduZWQgaW50IHN5bV9kZWJ1Z19mbGFnczsKKyNkZWZpbmUgREVCVUdfRkxBR1MJc3ltX2RlYnVnX2ZsYWdzCisKKy8qCisgKiAgTWF4IG51bWJlciBvZiB0YXJnZXRzLgorICogIE1heGltdW0gaXMgMTYgYW5kIHlvdSBhcmUgYWR2aXNlZCBub3QgdG8gY2hhbmdlIHRoaXMgdmFsdWUuCisgKi8KKyNpZm5kZWYgU1lNX0NPTkZfTUFYX1RBUkdFVAorI2RlZmluZSBTWU1fQ09ORl9NQVhfVEFSR0VUCSgxNikKKyNlbmRpZgorCisvKgorICogIE1heCBudW1iZXIgb2YgbG9naWNhbCB1bml0cy4KKyAqICBTUEktMiBhbGxvd3MgdXAgdG8gNjQgbG9naWNhbCB1bml0cywgYnV0IGluIHJlYWwgbGlmZSwgdGFyZ2V0CisgKiAgdGhhdCBpbXBsZW1lbnRzIG1vcmUgdGhhdCA3IGxvZ2ljYWwgdW5pdHMgYXJlIHByZXR0eSByYXJlLgorICogIEFueXdheSwgdGhlIGNvc3Qgb2YgYWNjZXB0aW5nIHVwIHRvIDY0IGxvZ2ljYWwgdW5pdCBpcyBsb3cgaW4gCisgKiAgdGhpcyBkcml2ZXIsIHRodXMgZ29pbmcgd2l0aCB0aGUgbWF4aW11bSBpcyBhY2NlcHRhYmxlLgorICovCisjaWZuZGVmIFNZTV9DT05GX01BWF9MVU4KKyNkZWZpbmUgU1lNX0NPTkZfTUFYX0xVTgkoNjQpCisjZW5kaWYKKworLyoKKyAqICBNYXggbnVtYmVyIG9mIElPIGNvbnRyb2wgYmxvY2tzIHF1ZXVlZCB0byB0aGUgY29udHJvbGxlci4KKyAqICBFYWNoIGVudHJ5IG5lZWRzIDggYnl0ZXMgYW5kIHRoZSBxdWV1ZXMgYXJlIGFsbG9jYXRlZCBjb250aWd1b3VzbHkuCisgKiAgU2luY2Ugd2UgZG9ubm90IHdhbnQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIGEgcGFnZSwgdGhlIHRoZW9yaWNhbCAKKyAqICBtYXhpbXVtIGlzIFBBR0VfU0laRS84LiBGb3Igc2FmZXR5LCB3ZSBhbm5vdW5jZSBhIGJpdCBsZXNzIHRvIHRoZSAKKyAqICBhY2Nlc3MgbWV0aG9kLiA6KQorICogIFdoZW4gbm90IHN1cHBsaWVkLCBhcyBpdCBpcyBzdWdnZXN0ZWQsIHRoZSBkcml2ZXIgY29tcHV0ZSBzb21lIAorICogIGdvb2QgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorICovCisvKiAjZGVmaW5lIFNZTV9DT05GX01BWF9TVEFSVAkoUEFHRV9TSVpFLzggLSAxNikgKi8KKworLyoKKyAqICBTdXBwb3J0IGZvciBJbW1lZGlhdGUgQXJiaXRyYXRpb24uCisgKiAgTm90IGFkdmlzZWQuCisgKi8KKy8qICNkZWZpbmUgU1lNX0NPTkZfSUFSQl9TVVBQT1JUICovCisKKy8qCisgKiAgT25seSByZWxldmFudCBpZiBJQVJCIHN1cHBvcnQgY29uZmlndXJlZC4KKyAqICAtIE1heCBudW1iZXIgb2Ygc3VjY2Vzc2l2ZSBzZXR0aW5ncyBvZiBJQVJCIGhpbnRzLgorICogIC0gU2V0IElBUkIgb24gYXJiaXRyYXRpb24gbG9zdC4KKyAqLworI2RlZmluZSBTWU1fQ09ORl9JQVJCX01BWCAzCisjZGVmaW5lIFNZTV9DT05GX1NFVF9JQVJCX09OX0FSQl9MT1NUIDEKKworLyoKKyAqICBSZXR1cm5pbmcgd3JvbmcgcmVzaWR1YWxzIG1heSBtYWtlIHByb2JsZW1zLgorICogIFdoZW4gemVybywgdGhpcyBkZWZpbmUgdGVsbHMgdGhlIGRyaXZlciB0byAKKyAqICBhbHdheXMgcmV0dXJuIDAgYXMgdHJhbnNmZXIgcmVzaWR1YWwuCisgKiAgQnR3LCBhbGwgbXkgdGVzdGluZ3Mgb2YgcmVzaWR1YWxzIGhhdmUgc3VjY2VlZGVkLgorICovCisjZGVmaW5lIFNZTV9TRVRVUF9SRVNJRFVBTF9TVVBQT1JUIDEKKworI2VuZGlmIC8qIFNZTTUzQzhYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2RlZnMuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmI4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2RlZnMuaApAQCAtMCwwICsxLDc5MiBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIFNZTV9ERUZTX0gKKyNkZWZpbmUgU1lNX0RFRlNfSAorCisjZGVmaW5lIFNZTV9WRVJTSU9OICIyLjIuMCIKKyNkZWZpbmUgU1lNX0RSSVZFUl9OQU1FCSJzeW0tIiBTWU1fVkVSU0lPTgorCisvKgorICoJU1lNNTNDOFhYIGRldmljZSBmZWF0dXJlcyBkZXNjcmlwdG9yLgorICovCitzdHJ1Y3Qgc3ltX2NoaXAgeworCXVfc2hvcnQJZGV2aWNlX2lkOworCXVfc2hvcnQJcmV2aXNpb25faWQ7CisJY2hhcgkqbmFtZTsKKwl1X2NoYXIJYnVyc3RfbWF4OwkvKiBsb2ctYmFzZS0yIG9mIG1heCBidXJzdCAqLworCXVfY2hhcglvZmZzZXRfbWF4OworCXVfY2hhcglucl9kaXZpc29yOworCXVfY2hhcglscF9wcm9iZV9iaXQ7CisJdV9pbnQJZmVhdHVyZXM7CisjZGVmaW5lIEZFX0xFRDAJCSgxPDwwKQorI2RlZmluZSBGRV9XSURFCQkoMTw8MSkgICAgLyogV2lkZSBkYXRhIHRyYW5zZmVycyAqLworI2RlZmluZSBGRV9VTFRSQQkoMTw8MikJICAvKiBVbHRyYSBzcGVlZCAyME10cmFucy9zZWMgKi8KKyNkZWZpbmUgRkVfVUxUUkEyCSgxPDwzKQkgIC8qIFVsdHJhIDIgLSA0MCBNdHJhbnMvc2VjICovCisjZGVmaW5lIEZFX0RCTFIJCSgxPDw0KQkgIC8qIENsb2NrIGRvdWJsZXIgcHJlc2VudCAqLworI2RlZmluZSBGRV9RVUFECQkoMTw8NSkJICAvKiBDbG9jayBxdWFkcnVwbGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgRkVfRVJMCQkoMTw8NikgICAgLyogRW5hYmxlIHJlYWQgbGluZSAqLworI2RlZmluZSBGRV9DTFNFCQkoMTw8NykgICAgLyogQ2FjaGUgbGluZSBzaXplIGVuYWJsZSAqLworI2RlZmluZSBGRV9XUklFCQkoMTw8OCkgICAgLyogV3JpdGUgJiBJbnZhbGlkYXRlIGVuYWJsZSAqLworI2RlZmluZSBGRV9FUk1QCQkoMTw8OSkgICAgLyogRW5hYmxlIHJlYWQgbXVsdGlwbGUgKi8KKyNkZWZpbmUgRkVfQk9GCQkoMTw8MTApICAgLyogQnVyc3Qgb3Bjb2RlIGZldGNoICovCisjZGVmaW5lIEZFX0RGUwkJKDE8PDExKSAgIC8qIERNQSBmaWZvIHNpemUgKi8KKyNkZWZpbmUgRkVfUEZFTgkJKDE8PDEyKSAgIC8qIFByZWZldGNoIGVuYWJsZSAqLworI2RlZmluZSBGRV9MRFNUUgkoMTw8MTMpICAgLyogTG9hZC9TdG9yZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRkVfUkFNCQkoMTw8MTQpICAgLyogT24gY2hpcCBSQU0gcHJlc2VudCAqLworI2RlZmluZSBGRV9WQVJDTEsJKDE8PDE1KSAgIC8qIENsb2NrIGZyZXF1ZW5jeSBtYXkgdmFyeSAqLworI2RlZmluZSBGRV9SQU04SwkoMTw8MTYpICAgLyogT24gY2hpcCBSQU0gc2l6ZWQgOEtiICovCisjZGVmaW5lIEZFXzY0QklUCSgxPDwxNykgICAvKiA2NC1iaXQgUENJIEJVUyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRkVfSU8yNTYJKDE8PDE4KSAgIC8qIFJlcXVpcmVzIGZ1bGwgMjU2IGJ5dGVzIGluIFBDSSBzcGFjZSAqLworI2RlZmluZSBGRV9OT1BNCQkoMTw8MTkpICAgLyogU2NyaXB0cyBoYW5kbGVzIHBoYXNlIG1pc21hdGNoICovCisjZGVmaW5lIEZFX0xFREMJCSgxPDwyMCkgICAvKiBIYXJkd2FyZSBjb250cm9sIG9mIExFRCAqLworI2RlZmluZSBGRV9VTFRSQTMJKDE8PDIxKQkgIC8qIFVsdHJhIDMgLSA4MCBNdHJhbnMvc2VjIERUICovCisjZGVmaW5lIEZFXzY2TUhaCSgxPDwyMikJICAvKiA2Nk1IeiBQQ0kgc3VwcG9ydCAqLworI2RlZmluZSBGRV9DUkMJCSgxPDwyMykJICAvKiBDUkMgc3VwcG9ydCAqLworI2RlZmluZSBGRV9ESUZGCQkoMTw8MjQpCSAgLyogU0NTSSBIVkQgc3VwcG9ydCAqLworI2RlZmluZSBGRV9ERkJDCQkoMTw8MjUpCSAgLyogSGF2ZSBERkJDIHJlZ2lzdGVyICovCisjZGVmaW5lIEZFX0xDS0ZSUQkoMTw8MjYpCSAgLyogSGF2ZSBMQ0tGUlEgKi8KKyNkZWZpbmUgRkVfQzEwCQkoMTw8MjcpCSAgLyogVmFyaW91cyBDMTAgY29yZSAobWlzKWZlYXR1cmVzICovCisjZGVmaW5lIEZFX1UzRU4JCSgxPDwyOCkJICAvKiBVM0VOIGJpdCB1c2FibGUgKi8KKyNkZWZpbmUgRkVfREFDCQkoMTw8MjkpCSAgLyogU3VwcG9ydCBQQ0kgREFDICg2NCBiaXQgYWRkcmVzc2luZykgKi8KKyNkZWZpbmUgRkVfSVNUQVQxIAkoMTw8MzApICAgLyogSGF2ZSBJU1RBVDEsIE1CT1gwLCBNQk9YMSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBGRV9DQUNIRV9TRVQJKEZFX0VSTHxGRV9DTFNFfEZFX1dSSUV8RkVfRVJNUCkKKyNkZWZpbmUgRkVfQ0FDSEUwX1NFVAkoRkVfQ0FDSEVfU0VUICYgfkZFX0VSTCkKK307CisKKy8qCisgKglTWU01M0M4WFggSU8gcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBzeW1fcmVnIHsKKy8qMDAqLyAgdTgJbmNfc2NudGwwOwkvKiBmdWxsIGFyYi4sIGVuYSBwYXJpdHksIHBhci0+QVROICAqLworCisvKjAxKi8gIHU4CW5jX3NjbnRsMTsJLyogbm8gcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIElTQ09OICAgMHgxMCAgLyogY29ubmVjdGVkIHRvIHNjc2kJCSAgICAqLworICAgICAgICAjZGVmaW5lICAgQ1JTVCAgICAweDA4ICAvKiBmb3JjZSByZXNldCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSUFSQiAgICAweDAyICAvKiBpbW1lZGlhdGUgYXJiaXRyYXRpb24gICAgICAgICAgICAqLworCisvKjAyKi8gIHU4CW5jX3NjbnRsMjsJLyogbm8gZGlzY29ubmVjdCBleHBlY3RlZCAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgU0RVICAgICAweDgwICAvKiBjbWQ6IGRpc2Nvbm5lY3Qgd2lsbCByYWlzZSBlcnJvciAqLworCSNkZWZpbmUgICBDSE0gICAgIDB4NDAgIC8qIHN0YTogY2hhaW5lZCBtb2RlICAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFdTUyAgICAgMHgwOCAgLyogc3RhOiB3aWRlIHNjc2kgc2VuZCAgICAgICAgICAgW1ddKi8KKwkjZGVmaW5lICAgV1NSICAgICAweDAxICAvKiBzdGE6IHdpZGUgc2NzaSByZWNlaXZlZCAgICAgICBbV10qLworCisvKjAzKi8gIHU4CW5jX3NjbnRsMzsJLyogY25mIHN5c3RlbSBjbG9jayBkZXBlbmRlbnQgICAgICAgKi8KKwkjZGVmaW5lICAgRVdTICAgICAweDA4ICAvKiBjbWQ6IGVuYWJsZSB3aWRlIHNjc2kgICAgICAgICBbV10qLworCSNkZWZpbmUgICBVTFRSQSAgIDB4ODAgIC8qIGNtZDogVUxUUkEgZW5hYmxlICAgICAgICAgICAgICAgICovCisJCQkJLyogYml0cyAwLTIsIDcgcnN2ZCBmb3IgQzEwMTAgICAgICAgKi8KKworLyowNCovICB1OAluY19zY2lkOwkvKiBjbmYgaG9zdCBhZGFwdGVyIHNjc2kgYWRkcmVzcyAgICAqLworCSNkZWZpbmUgICBSUkUgICAgIDB4NDAgIC8qIHIvdzplIGVuYWJsZSByZXNwb25zZSB0byByZXNlbC4gICovCisJI2RlZmluZSAgIFNSRSAgICAgMHgyMCAgLyogci93OmUgZW5hYmxlIHJlc3BvbnNlIHRvIHNlbGVjdCAgKi8KKworLyowNSovICB1OAluY19zeGZlcjsJLyogIyMjIFN5bmMgc3BlZWQgYW5kIGNvdW50ICAgICAgICAgKi8KKwkJCQkvKiBiaXRzIDYtNyByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworCisvKjA2Ki8gIHU4CW5jX3NkaWQ7CS8qICMjIyBEZXN0aW5hdGlvbi1JRCAgICAgICAgICAgICAgICovCisKKy8qMDcqLyAgdTgJbmNfZ3ByZWc7CS8qID8/PyBJTy1QaW5zICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qMDgqLyAgdTgJbmNfc2ZicjsJLyogIyMjIEZpcnN0IGJ5dGUgcmVjZWl2ZWQgICAgICAgICAgKi8KKworLyowOSovICB1OAluY19zb2NsOworCSNkZWZpbmUgICBDUkVRCSAgMHg4MAkvKiByL3c6IFNDU0ktUkVRICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQUNLCSAgMHg0MAkvKiByL3c6IFNDU0ktQUNLICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQlNZCSAgMHgyMAkvKiByL3c6IFNDU0ktQlNZICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDU0VMCSAgMHgxMAkvKiByL3c6IFNDU0ktU0VMICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQVROCSAgMHgwOAkvKiByL3c6IFNDU0ktQVROICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDTVNHCSAgMHgwNAkvKiByL3c6IFNDU0ktTVNHICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQ19ECSAgMHgwMgkvKiByL3c6IFNDU0ktQ19EICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDSV9PCSAgMHgwMQkvKiByL3c6IFNDU0ktSV9PICAgICAgICAgICAgICAgICAgICAqLworCisvKjBhKi8gIHU4CW5jX3NzaWQ7CisKKy8qMGIqLyAgdTgJbmNfc2JjbDsKKworLyowYyovICB1OAluY19kc3RhdDsKKyAgICAgICAgI2RlZmluZSAgIERGRSAgICAgMHg4MCAgLyogc3RhOiBkbWEgZmlmbyBlbXB0eSAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIE1EUEUgICAgMHg0MCAgLyogaW50OiBtYXN0ZXIgZGF0YSBwYXJpdHkgZXJyb3IgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIEJGICAgICAgMHgyMCAgLyogaW50OiBzY3JpcHQ6IGJ1cyBmYXVsdCAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIEFCUlQgICAgMHgxMCAgLyogaW50OiBzY3JpcHQ6IGNvbW1hbmQgYWJvcnRlZCAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNTSSAgICAgMHgwOCAgLyogaW50OiBzY3JpcHQ6IHNpbmdsZSBzdGVwICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNJUiAgICAgMHgwNCAgLyogaW50OiBzY3JpcHQ6IGludGVycnVwdCBpbnN0cnVjdC4gKi8KKyAgICAgICAgI2RlZmluZSAgIElJRCAgICAgMHgwMSAgLyogaW50OiBzY3JpcHQ6IGlsbGVnYWwgaW5zdHJ1Y3QuICAgKi8KKworLyowZCovICB1OAluY19zc3RhdDA7CisgICAgICAgICNkZWZpbmUgICBJTEYgICAgIDB4ODAgIC8qIHN0YTogZGF0YSBpbiBTSURMIHJlZ2lzdGVyIGxzYiAgICovCisgICAgICAgICNkZWZpbmUgICBPUkYgICAgIDB4NDAgIC8qIHN0YTogZGF0YSBpbiBTT0RSIHJlZ2lzdGVyIGxzYiAgICovCisgICAgICAgICNkZWZpbmUgICBPTEYgICAgIDB4MjAgIC8qIHN0YTogZGF0YSBpbiBTT0RMIHJlZ2lzdGVyIGxzYiAgICovCisgICAgICAgICNkZWZpbmUgICBBSVAgICAgIDB4MTAgIC8qIHN0YTogYXJiaXRyYXRpb24gaW4gcHJvZ3Jlc3MgICAgICovCisgICAgICAgICNkZWZpbmUgICBMT0EgICAgIDB4MDggIC8qIHN0YTogYXJiaXRyYXRpb24gbG9zdCAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBXT0EgICAgIDB4MDQgIC8qIHN0YTogYXJiaXRyYXRpb24gd29uICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBJUlNUICAgIDB4MDIgIC8qIHN0YTogc2NzaSByZXNldCBzaWduYWwgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTRFAgICAgIDB4MDEgIC8qIHN0YTogc2NzaSBwYXJpdHkgc2lnbmFsICAgICAgICAgICovCisKKy8qMGUqLyAgdTgJbmNfc3N0YXQxOworCSNkZWZpbmUgICBGRjMyMTAgIDB4ZjAJLyogc3RhOiBieXRlcyBpbiB0aGUgc2NzaSBmaWZvICAgICAgKi8KKworLyowZiovICB1OAluY19zc3RhdDI7CisgICAgICAgICNkZWZpbmUgICBJTEYxICAgIDB4ODAgIC8qIHN0YTogZGF0YSBpbiBTSURMIHJlZ2lzdGVyIG1zYltXXSovCisgICAgICAgICNkZWZpbmUgICBPUkYxICAgIDB4NDAgIC8qIHN0YTogZGF0YSBpbiBTT0RSIHJlZ2lzdGVyIG1zYltXXSovCisgICAgICAgICNkZWZpbmUgICBPTEYxICAgIDB4MjAgIC8qIHN0YTogZGF0YSBpbiBTT0RMIHJlZ2lzdGVyIG1zYltXXSovCisgICAgICAgICNkZWZpbmUgICBETSAgICAgIDB4MDQgIC8qIHN0YTogRElGRlNFTlMgbWlzbWF0Y2ggKDg5NS82IG9ubHkpICovCisgICAgICAgICNkZWZpbmUgICBMRFNDICAgIDB4MDIgIC8qIHN0YTogZGlzY29ubmVjdCAmIHJlY29ubmVjdCAgICAgICovCisKKy8qMTAqLyAgdTgJbmNfZHNhOwkJLyogLS0+IEJhc2UgcGFnZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qMTEqLyAgdTgJbmNfZHNhMTsKKy8qMTIqLyAgdTgJbmNfZHNhMjsKKy8qMTMqLyAgdTgJbmNfZHNhMzsKKworLyoxNCovICB1OAluY19pc3RhdDsJLyogLS0+IE1haW4gQ29tbWFuZCBhbmQgc3RhdHVzICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIENBQlJUICAgMHg4MCAgLyogY21kOiBhYm9ydCBjdXJyZW50IG9wZXJhdGlvbiAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNSU1QgICAgMHg0MCAgLyogbW9kOiByZXNldCBjaGlwICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNJR1AgICAgMHgyMCAgLyogci93OiBtZXNzYWdlIGZyb20gaG9zdCB0byBzY3JpcHQgKi8KKyAgICAgICAgI2RlZmluZSAgIFNFTSAgICAgMHgxMCAgLyogci93OiBtZXNzYWdlIGJldHdlZW4gaG9zdCArIHNjcmlwdCAgKi8KKyAgICAgICAgI2RlZmluZSAgIENPTiAgICAgMHgwOCAgLyogc3RhOiBjb25uZWN0ZWQgdG8gc2NzaSAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIElOVEYgICAgMHgwNCAgLyogc3RhOiBpbnQgb24gdGhlIGZseSAocmVzZXQgYnkgd3IpKi8KKyAgICAgICAgI2RlZmluZSAgIFNJUCAgICAgMHgwMiAgLyogc3RhOiBzY3NpLWludGVycnVwdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIERJUCAgICAgMHgwMSAgLyogc3RhOiBob3N0L3NjcmlwdCBpbnRlcnJ1cHQgICAgICAgKi8KKworLyoxNSovICB1OAluY19pc3RhdDE7CS8qIDg5NiBvbmx5ICovCisgICAgICAgICNkZWZpbmUgICBGTFNIICAgIDB4MDQgIC8qIHN0YTogY2hpcCBpcyBmbHVzaGluZyAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTQ1JVTiAgIDB4MDIgIC8qIHN0YTogc2NyaXB0cyBhcmUgcnVubmluZyAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTSVJRRCAgIDB4MDEgIC8qIHIvdzogZGlzYWJsZSBJTlQgcGluICAgICAgICAgICAgICovCisKKy8qMTYqLyAgdTgJbmNfbWJveDA7CS8qIDg5NiBvbmx5ICovCisvKjE3Ki8gIHU4CW5jX21ib3gxOwkvKiA4OTYgb25seSAqLworCisvKjE4Ki8JdTgJbmNfY3Rlc3QwOworLyoxOSovICB1OAluY19jdGVzdDE7CisKKy8qMWEqLyAgdTgJbmNfY3Rlc3QyOworCSNkZWZpbmUgICBDU0lHUCAgIDB4NDAKKwkJCQkvKiBiaXRzIDAtMiw3IHJzdmQgZm9yIEMxMDEwICAgICAgICAqLworCisvKjFiKi8gIHU4CW5jX2N0ZXN0MzsKKwkjZGVmaW5lICAgRkxGICAgICAweDA4ICAvKiBjbWQ6IGZsdXNoIGRtYSBmaWZvICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDTEYJICAweDA0CS8qIGNtZDogY2xlYXIgZG1hIGZpZm8JCSAgICAqLworCSNkZWZpbmUgICBGTSAgICAgIDB4MDIgIC8qIG1vZDogZmV0Y2ggcGluIG1vZGUgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFdSSUUgICAgMHgwMSAgLyogbW9kOiB3cml0ZSBhbmQgaW52YWxpZGF0ZSBlbmFibGUgKi8KKwkJCQkvKiBiaXRzIDQtNyByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworCisvKjFjKi8gIHUzMgluY190ZW1wOwkvKiAjIyMgVGVtcG9yYXJ5IHN0YWNrICAgICAgICAgICAgICAqLworCisvKjIwKi8JdTgJbmNfZGZpZm87CisvKjIxKi8gIHU4CW5jX2N0ZXN0NDsKKwkjZGVmaW5lICAgQkRJUyAgICAweDgwICAvKiBtb2Q6IGJ1cnN0IGRpc2FibGUgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBNUEVFICAgIDB4MDggIC8qIG1vZDogbWFzdGVyIHBhcml0eSBlcnJvciBlbmFibGUgICovCisKKy8qMjIqLyAgdTgJbmNfY3Rlc3Q1OworCSNkZWZpbmUgICBERlMgICAgIDB4MjAgIC8qIG1vZDogZG1hIGZpZm8gc2l6ZSAgICAgICAgICAgICAgICovCisJCQkJLyogYml0cyAwLTEsIDMtNyByc3ZkIGZvciBDMTAxMCAgICAgKi8KKworLyoyMyovICB1OAluY19jdGVzdDY7CisKKy8qMjQqLyAgdTMyCW5jX2RiYzsJCS8qICMjIyBCeXRlIGNvdW50IGFuZCBjb21tYW5kICAgICAgICovCisvKjI4Ki8gIHUzMgluY19kbmFkOwkvKiAjIyMgTmV4dCBjb21tYW5kIHJlZ2lzdGVyICAgICAgICAqLworLyoyYyovICB1MzIJbmNfZHNwOwkJLyogLS0+IFNjcmlwdCBQb2ludGVyICAgICAgICAgICAgICAgKi8KKy8qMzAqLyAgdTMyCW5jX2RzcHM7CS8qIC0tPiBTY3JpcHQgcG9pbnRlciBzYXZlL29wY29kZSMyICovCisKKy8qMzQqLyAgdTgJbmNfc2NyYXRjaGE7CS8qIFRlbXBvcmFyeSByZWdpc3RlciBhICAgICAgICAgICAgKi8KKy8qMzUqLyAgdTgJbmNfc2NyYXRjaGExOworLyozNiovICB1OAluY19zY3JhdGNoYTI7CisvKjM3Ki8gIHU4CW5jX3NjcmF0Y2hhMzsKKworLyozOCovICB1OAluY19kbW9kZTsKKwkjZGVmaW5lICAgQkxfMiAgICAweDgwICAvKiBtb2Q6IGJ1cnN0IGxlbmd0aCBzaGlmdCB2YWx1ZSArMiAqLworCSNkZWZpbmUgICBCTF8xICAgIDB4NDAgIC8qIG1vZDogYnVyc3QgbGVuZ3RoIHNoaWZ0IHZhbHVlICsxICovCisJI2RlZmluZSAgIEVSTCAgICAgMHgwOCAgLyogbW9kOiBlbmFibGUgcmVhZCBsaW5lICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRVJNUCAgICAweDA0ICAvKiBtb2Q6IGVuYWJsZSByZWFkIG11bHRpcGxlICAgICAgICAqLworCSNkZWZpbmUgICBCT0YgICAgIDB4MDIgIC8qIG1vZDogYnVyc3Qgb3AgY29kZSBmZXRjaCAgICAgICAgICovCisKKy8qMzkqLyAgdTgJbmNfZGllbjsKKy8qM2EqLyAgdTgJbmNfc2JyOworCisvKjNiKi8gIHU4CW5jX2RjbnRsOwkvKiAtLT4gU2NyaXB0IGV4ZWN1dGlvbiBjb250cm9sICAgICAqLworCSNkZWZpbmUgICBDTFNFICAgIDB4ODAgIC8qIG1vZDogY2FjaGUgbGluZSBzaXplIGVuYWJsZSAgICAgICovCisJI2RlZmluZSAgIFBGRiAgICAgMHg0MCAgLyogY21kOiBwcmUtZmV0Y2ggZmx1c2ggICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgUEZFTiAgICAweDIwICAvKiBtb2Q6IHByZS1mZXRjaCBlbmFibGUgICAgICAgICAgICAqLworCSNkZWZpbmUgICBTU00gICAgIDB4MTAgIC8qIG1vZDogc2luZ2xlIHN0ZXAgbW9kZSAgICAgICAgICAgICovCisJI2RlZmluZSAgIElSUU0gICAgMHgwOCAgLyogbW9kOiBpcnEgbW9kZSAoMSA9IHRvdGVtIHBvbGUgISkgKi8KKwkjZGVmaW5lICAgU1REICAgICAweDA0ICAvKiBjbWQ6IHN0YXJ0IGRtYSBtb2RlICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBJUlFEICAgIDB4MDIgIC8qIG1vZDogaXJxIGRpc2FibGUgICAgICAgICAgICAgICAgICovCisgCSNkZWZpbmUJICBOT0NPTSAgIDB4MDEJLyogY21kOiBwcm90ZWN0IHNmYnIgd2hpbGUgcmVzZWxlY3QgKi8KKwkJCQkvKiBiaXRzIDAtMSByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworCisvKjNjKi8gIHUzMgluY19hZGRlcjsKKworLyo0MCovICB1MTYJbmNfc2llbjsJLyogLS0+OiBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgKi8KKy8qNDIqLyAgdTE2CW5jX3Npc3Q7CS8qIDwtLTogaW50ZXJydXB0IHN0YXR1cyAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTQk1DICAgIDB4MTAwMC8qIHN0YTogU0NTSSBCdXMgTW9kZSBDaGFuZ2UgKDg5NS82IG9ubHkpICovCisgICAgICAgICNkZWZpbmUgICBTVE8gICAgIDB4MDQwMC8qIHN0YTogdGltZW91dCAoc2VsZWN0KSAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBHRU4gICAgIDB4MDIwMC8qIHN0YTogdGltZW91dCAoZ2VuZXJhbCkgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBIVEggICAgIDB4MDEwMC8qIHN0YTogdGltZW91dCAoaGFuZHNoYWtlKSAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBNQSAgICAgIDB4ODAgIC8qIHN0YTogcGhhc2UgbWlzbWF0Y2ggICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBDTVAgICAgIDB4NDAgIC8qIHN0YTogYXJiaXRyYXRpb24gY29tcGxldGUgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTRUwgICAgIDB4MjAgIC8qIHN0YTogc2VsZWN0ZWQgYnkgYW5vdGhlciBkZXZpY2UgICovCisgICAgICAgICNkZWZpbmUgICBSU0wgICAgIDB4MTAgIC8qIHN0YTogcmVzZWxlY3RlZCBieSBhbm90aGVyIGRldmljZSovCisgICAgICAgICNkZWZpbmUgICBTR0UgICAgIDB4MDggIC8qIHN0YTogZ3Jvc3MgZXJyb3IgKG92ZXIvdW5kZXJmbG93KSovCisgICAgICAgICNkZWZpbmUgICBVREMgICAgIDB4MDQgIC8qIHN0YTogdW5leHBlY3RlZCBkaXNjb25uZWN0ICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBSU1QgICAgIDB4MDIgIC8qIHN0YTogc2NzaSBidXMgcmVzZXQgZGV0ZWN0ZWQgICAgICovCisgICAgICAgICNkZWZpbmUgICBQQVIgICAgIDB4MDEgIC8qIHN0YTogc2NzaSBwYXJpdHkgZXJyb3IgICAgICAgICAgICovCisKKy8qNDQqLyAgdTgJbmNfc2xwYXI7CisvKjQ1Ki8gIHU4CW5jX3N3aWRlOworLyo0NiovICB1OAluY19tYWNudGw7CisvKjQ3Ki8gIHU4CW5jX2dwY250bDsKKy8qNDgqLyAgdTgJbmNfc3RpbWUwOwkvKiBjbWQ6IHRpbWVvdXQgZm9yIHNlbGVjdCZoYW5kc2hha2UqLworLyo0OSovICB1OAluY19zdGltZTE7CS8qIGNtZDogdGltZW91dCB1c2VyIGRlZmluZWQgICAgICAgICovCisvKjRhKi8gIHUxNgluY19yZXNwaWQ7CS8qIHN0YTogUmVzZWxlY3QtSURzICAgICAgICAgICAgICAgICovCisKKy8qNGMqLyAgdTgJbmNfc3Rlc3QwOworCisvKjRkKi8gIHU4CW5jX3N0ZXN0MTsKKwkjZGVmaW5lICAgU0NMSyAgICAweDgwCS8qIFVzZSB0aGUgUENJIGNsb2NrIGFzIFNDU0kgY2xvY2sJKi8KKwkjZGVmaW5lICAgREJMRU4gICAweDA4CS8qIGNsb2NrIGRvdWJsZXIgcnVubmluZwkJKi8KKwkjZGVmaW5lICAgREJMU0VMICAweDA0CS8qIGNsb2NrIGRvdWJsZXIgc2VsZWN0ZWQJCSovCisgIAorCisvKjRlKi8gIHU4CW5jX3N0ZXN0MjsKKwkjZGVmaW5lICAgUk9GICAgICAweDQwCS8qIHJlc2V0IHNjc2kgb2Zmc2V0IChhZnRlciBncm9zcyBlcnJvciEpICovCisJI2RlZmluZSAgIEVYVCAgICAgMHgwMiAgLyogZXh0ZW5kZWQgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKworLyo0ZiovICB1OAluY19zdGVzdDM7CisJI2RlZmluZSAgIFRFICAgICAweDgwCS8qIGM6IHRvbGVyQW50IGVuYWJsZSAqLworCSNkZWZpbmUgICBIU0MgICAgMHgyMAkvKiBjOiBIYWx0IFNDU0kgQ2xvY2sgKi8KKwkjZGVmaW5lICAgQ1NGICAgIDB4MDIJLyogYzogY2xlYXIgc2NzaSBmaWZvICovCisKKy8qNTAqLyAgdTE2CW5jX3NpZGw7CS8qIExvd2xldmVsOiBsYXRjaGVkIGZyb20gc2NzaSBkYXRhICovCisvKjUyKi8gIHU4CW5jX3N0ZXN0NDsKKwkjZGVmaW5lICAgU01PREUgIDB4YzAJLyogU0NTSSBidXMgbW9kZSAgICAgICg4OTUvNiBvbmx5KSAqLworCSNkZWZpbmUgICAgU01PREVfSFZEIDB4NDAJLyogSGlnaCBWb2x0YWdlIERpZmZlcmVudGlhbCAgICAgICAqLworCSNkZWZpbmUgICAgU01PREVfU0UgIDB4ODAJLyogU2luZ2xlIEVuZGVkICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICAgU01PREVfTFZEIDB4YzAJLyogTG93IFZvbHRhZ2UgRGlmZmVyZW50aWFsICAgICAgICAqLworCSNkZWZpbmUgICBMQ0tGUlEgMHgyMAkvKiBGcmVxdWVuY3kgTG9jayAoODk1LzYgb25seSkgICAgICovCisJCQkJLyogYml0cyAwLTUgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAqLworCisvKjUzKi8gIHU4CW5jXzUzXzsKKy8qNTQqLyAgdTE2CW5jX3NvZGw7CS8qIExvd2xldmVsOiBkYXRhIG91dCB0byBzY3NpIGRhdGEgICovCisvKjU2Ki8JdTgJbmNfY2NudGwwOwkvKiBDaGlwIENvbnRyb2wgMCAoODk2KSAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBFTlBNSiAgMHg4MAkvKiBFbmFibGUgUGhhc2UgTWlzbWF0Y2ggSnVtcCAgICAgICAqLworCSNkZWZpbmUgICBQTUpDVEwgMHg0MAkvKiBQaGFzZSBNaXNtYXRjaCBKdW1wIENvbnRyb2wgICAgICAqLworCSNkZWZpbmUgICBFTk5ESiAgMHgyMAkvKiBFbmFibGUgTm9uIERhdGEgUE0gSnVtcCAgICAgICAgICAqLworCSNkZWZpbmUgICBESVNGQyAgMHgxMAkvKiBEaXNhYmxlIEF1dG8gRklGTyBDbGVhciAgICAgICAgICAqLworCSNkZWZpbmUgICBESUxTICAgMHgwMgkvKiBEaXNhYmxlIEludGVybmFsIExvYWQvU3RvcmUgICAgICAqLworCSNkZWZpbmUgICBEUFIgICAgMHgwMQkvKiBEaXNhYmxlIFBpcGUgUmVxICAgICAgICAgICAgICAgICAqLworCisvKjU3Ki8JdTgJbmNfY2NudGwxOwkvKiBDaGlwIENvbnRyb2wgMSAoODk2KSAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBaTU9EICAgMHg4MAkvKiBIaWdoIEltcGVkYW5jZSBNb2RlICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBEREFDICAgMHgwOAkvKiBEaXNhYmxlIER1YWwgQWRkcmVzcyBDeWNsZSAgICAgICAqLworCSNkZWZpbmUgICBYVElNT0QgMHgwNAkvKiA2NC1iaXQgVGFibGUgSW5kLiBJbmRleGluZyBNb2RlICAqLworCSNkZWZpbmUgICBFWFRJQk1WIDB4MDIJLyogRW5hYmxlIDY0LWJpdCBUYWJsZSBJbmQuIEJNT1YgICAgKi8KKwkjZGVmaW5lICAgRVhEQk1WIDB4MDEJLyogRW5hYmxlIDY0LWJpdCBEaXJlY3QgQk1PViAgICAgICAgKi8KKworLyo1OCovICB1MTYJbmNfc2JkbDsJLyogTG93bGV2ZWw6IGRhdGEgZnJvbSBzY3NpIGRhdGEgICAgKi8KKy8qNWEqLyAgdTE2CW5jXzVhXzsKKworLyo1YyovICB1OAluY19zY3IwOwkvKiBXb3JraW5nIHJlZ2lzdGVyIEIgICAgICAgICAgICAgICAqLworLyo1ZCovICB1OAluY19zY3IxOworLyo1ZSovICB1OAluY19zY3IyOworLyo1ZiovICB1OAluY19zY3IzOworCisvKjYwKi8gIHU4CW5jX3NjcnhbNjRdOwkvKiBXb3JraW5nIHJlZ2lzdGVyIEMtUiAgICAgICAgICAgICAqLworLyphMCovCXUzMgluY19tbXJzOwkvKiBNZW1vcnkgTW92ZSBSZWFkIFNlbGVjdG9yICAgICAgICAqLworLyphNCovCXUzMgluY19tbXdzOwkvKiBNZW1vcnkgTW92ZSBXcml0ZSBTZWxlY3RvciAgICAgICAqLworLyphOCovCXUzMgluY19zZnM7CQkvKiBTY3JpcHQgRmV0Y2ggU2VsZWN0b3IgICAgICAgICAgICAqLworLyphYyovCXUzMgluY19kcnM7CQkvKiBEU0EgUmVsYXRpdmUgU2VsZWN0b3IgICAgICAgICAgICAqLworLypiMCovCXUzMgluY19zYm1zOwkvKiBTdGF0aWMgQmxvY2sgTW92ZSBTZWxlY3RvciAgICAgICAqLworLypiNCovCXUzMgluY19kYm1zOwkvKiBEeW5hbWljIEJsb2NrIE1vdmUgU2VsZWN0b3IgICAgICAqLworLypiOCovCXUzMgluY19kbmFkNjQ7CS8qIERNQSBOZXh0IEFkZHJlc3MgNjQgICAgICAgICAgICAgICovCisvKmJjKi8JdTE2CW5jX3NjbnRsNDsJLyogQzEwMTAgb25seSAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgVTNFTiAgICAweDgwCS8qIEVuYWJsZSBVbHRyYSAzICAgICAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIEFJUENLRU4gMHg0MCAgLyogQUlQIGNoZWNraW5nIGVuYWJsZSAgICAgICAgICAgICAgKi8KKwkJCQkvKiBBbHNvIGVuYWJsZSBBSVAgZ2VuZXJhdGlvbiBvbiBDMTAtMzMqLworCSNkZWZpbmUgICBYQ0xLSF9EVCAweDA4IC8qIEV4dHJhIGNsb2NrIG9mIGRhdGEgaG9sZCBvbiBEVCBlZGdlICovCisJI2RlZmluZSAgIFhDTEtIX1NUIDB4MDQgLyogRXh0cmEgY2xvY2sgb2YgZGF0YSBob2xkIG9uIFNUIGVkZ2UgKi8KKwkjZGVmaW5lICAgWENMS1NfRFQgMHgwMiAvKiBFeHRyYSBjbG9jayBvZiBkYXRhIHNldCAgb24gRFQgZWRnZSAqLworCSNkZWZpbmUgICBYQ0xLU19TVCAweDAxIC8qIEV4dHJhIGNsb2NrIG9mIGRhdGEgc2V0ICBvbiBTVCBlZGdlICovCisvKmJlKi8JdTgJbmNfYWlwY250bDA7CS8qIEFJUCBDb250cm9sIDAgQzEwMTAgb25seSAgICAgICAgICovCisvKmJmKi8JdTgJbmNfYWlwY250bDE7CS8qIEFJUCBDb250cm9sIDEgQzEwMTAgb25seSAgICAgICAgICovCisJI2RlZmluZSBESVNBSVAgIDB4MDgJLyogRGlzYWJsZSBBSVAgZ2VuZXJhdGlvbiBDMTAtNjYgb25seSAgKi8KKy8qYzAqLwl1MzIJbmNfcG1qYWQxOwkvKiBQaGFzZSBNaXNtYXRjaCBKdW1wIEFkZHJlc3MgMSAgICAqLworLypjNCovCXUzMgluY19wbWphZDI7CS8qIFBoYXNlIE1pc21hdGNoIEp1bXAgQWRkcmVzcyAyICAgICovCisvKmM4Ki8JdTgJbmNfcmJjOwkJLyogUmVtYWluaW5nIEJ5dGUgQ291bnQgICAgICAgICAgICAgKi8KKy8qYzkqLwl1OAluY19yYmMxOworLypjYSovCXU4CW5jX3JiYzI7CisvKmNiKi8JdTgJbmNfcmJjMzsKKworLypjYyovCXU4CW5jX3VhOwkJLyogVXBkYXRlZCBBZGRyZXNzICAgICAgICAgICAgICAgICAgKi8KKy8qY2QqLwl1OAluY191YTE7CisvKmNlKi8JdTgJbmNfdWEyOworLypjZiovCXU4CW5jX3VhMzsKKy8qZDAqLwl1MzIJbmNfZXNhOwkJLyogRW50cnkgU3RvcmFnZSBBZGRyZXNzICAgICAgICAgICAgKi8KKy8qZDQqLwl1OAluY19pYTsJCS8qIEluc3RydWN0aW9uIEFkZHJlc3MgICAgICAgICAgICAgICovCisvKmQ1Ki8JdTgJbmNfaWExOworLypkNiovCXU4CW5jX2lhMjsKKy8qZDcqLwl1OAluY19pYTM7CisvKmQ4Ki8JdTMyCW5jX3NiYzsJCS8qIFNDU0kgQnl0ZSBDb3VudCAoMyBieXRlcyBvbmx5KSAgICovCisvKmRjKi8JdTMyCW5jX2NzYmM7CS8qIEN1bXVsYXRpdmUgU0NTSSBCeXRlIENvdW50ICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvbGxvd2luZyBmb3IgQzEwMTAgb25seSAgICAgICAgICovCisvKmUwKi8JdTE2ICAgIG5jX2NyY3BhZDsJLyogQ1JDIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qZTIqLwl1OCAgICAgbmNfY3JjY250bDA7CS8qIENSQyBjb250cm9sIHJlZ2lzdGVyICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFNORENSQyAgMHgxMAkvKiBTZW5kIENSQyBSZXF1ZXN0ICAgICAgICAgICAgICAgICAqLworLyplMyovCXU4ICAgICBuY19jcmNjbnRsMTsJLyogQ1JDIGNvbnRyb2wgcmVnaXN0ZXIgICAgICAgICAgICAgKi8KKy8qZTQqLwl1MzIgICAgbmNfY3JjZGF0YTsJLyogQ1JDIGRhdGEgcmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKy8qZTgqLwl1MzIgICAgbmNfZThfOworLyplYyovCXUzMiAgICBuY19lY187CisvKmYwKi8JdTE2ICAgIG5jX2RmYmM7CQkvKiBETUEgRklGTyBieXRlIGNvdW50ICAgICAgICAgICAgICAqLyAKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglVdGlsaXR5IG1hY3JvcyBmb3IgdGhlIHNjcmlwdC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBSRUdKKHAscikgKG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCBwICMjIHIpKQorI2RlZmluZSBSRUcocikgUkVHSiAobmNfLCByKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJU0NTSSBwaGFzZXMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZQlTQ1JfREFUQV9PVVQJMHgwMDAwMDAwMAorI2RlZmluZQlTQ1JfREFUQV9JTgkweDAxMDAwMDAwCisjZGVmaW5lCVNDUl9DT01NQU5ECTB4MDIwMDAwMDAKKyNkZWZpbmUJU0NSX1NUQVRVUwkweDAzMDAwMDAwCisjZGVmaW5lCVNDUl9EVF9EQVRBX09VVAkweDA0MDAwMDAwCisjZGVmaW5lCVNDUl9EVF9EQVRBX0lOCTB4MDUwMDAwMDAKKyNkZWZpbmUgU0NSX01TR19PVVQJMHgwNjAwMDAwMAorI2RlZmluZSBTQ1JfTVNHX0lOICAgICAgMHgwNzAwMDAwMAorLyogRFQgcGhhc2VzIGFyZSBpbGxlZ2FsIGZvciBub24gVWx0cmEzIG1vZGUgKi8KKyNkZWZpbmUgU0NSX0lMR19PVVQJMHgwNDAwMDAwMAorI2RlZmluZSBTQ1JfSUxHX0lOCTB4MDUwMDAwMDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCURhdGEgdHJhbnNmZXIgdmlhIFNDU0kuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCU1PVkVfQUJTIChMRU4pCisgKgk8PHN0YXJ0IGFkZHJlc3M+PgorICoKKyAqCU1PVkVfSU5EIChMRU4pCisgKgk8PGRuYWRfb2Zmc2V0Pj4KKyAqCisgKglNT1ZFX1RCTAorICoJPDxkbmFkX29mZnNldD4+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgT1BDX01PVkUgICAgICAgICAgMHgwODAwMDAwMAorCisjZGVmaW5lIFNDUl9NT1ZFX0FCUyhsKSAoKDB4MDAwMDAwMDAgfCBPUENfTU9WRSkgfCAobCkpCisvKiAjZGVmaW5lIFNDUl9NT1ZFX0lORChsKSAoKDB4MjAwMDAwMDAgfCBPUENfTU9WRSkgfCAobCkpICovCisjZGVmaW5lIFNDUl9NT1ZFX1RCTCAgICAgKDB4MTAwMDAwMDAgfCBPUENfTU9WRSkKKworI2RlZmluZSBTQ1JfQ0hNT1ZfQUJTKGwpICgoMHgwMDAwMDAwMCkgfCAobCkpCisvKiAjZGVmaW5lIFNDUl9DSE1PVl9JTkQobCkgKCgweDIwMDAwMDAwKSB8IChsKSkgKi8KKyNkZWZpbmUgU0NSX0NITU9WX1RCTCAgICAgKDB4MTAwMDAwMDApCisKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisvKiBXZSBzdGVhbCB0aGUgYGluZGlyZWN0IGFkZHJlc3NpbmcnIGZsYWcgZm9yIHRhcmdldCBtb2RlIE1PVkUgaW4gc2NyaXB0cyAqLworCisjZGVmaW5lIE9QQ19UQ0hNT1ZFICAgICAgICAweDA4MDAwMDAwCisKKyNkZWZpbmUgU0NSX1RDSE1PVkVfQUJTKGwpICgoMHgyMDAwMDAwMCB8IE9QQ19UQ0hNT1ZFKSB8IChsKSkKKyNkZWZpbmUgU0NSX1RDSE1PVkVfVEJMICAgICAoMHgzMDAwMDAwMCB8IE9QQ19UQ0hNT1ZFKQorCisjZGVmaW5lIFNDUl9UTU9WX0FCUyhsKSAgICAoKDB4MjAwMDAwMDApIHwgKGwpKQorI2RlZmluZSBTQ1JfVE1PVl9UQkwgICAgICAgICgweDMwMDAwMDAwKQorI2VuZGlmCisKK3N0cnVjdCBzeW1fdGJsbW92ZSB7CisgICAgICAgIHUzMiAgc2l6ZTsKKyAgICAgICAgdTMyICBhZGRyOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVNlbGVjdGlvbgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglTRUxfQUJTIHwgU0NSX0lEICgwLi4xNSkgICAgWyB8IFJFTF9KTVBdCisgKgk8PGFsdGVybmF0ZV9hZGRyZXNzPj4KKyAqCisgKglTRUxfVEJMIHwgPDwgZG5hZF9vZmZzZXQ+PiAgWyB8IFJFTF9KTVBdCisgKgk8PGFsdGVybmF0ZV9hZGRyZXNzPj4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZQlTQ1JfU0VMX0FCUwkweDQwMDAwMDAwCisjZGVmaW5lCVNDUl9TRUxfQUJTX0FUTgkweDQxMDAwMDAwCisjZGVmaW5lCVNDUl9TRUxfVEJMCTB4NDIwMDAwMDAKKyNkZWZpbmUJU0NSX1NFTF9UQkxfQVROCTB4NDMwMDAwMDAKKworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKyNkZWZpbmUJU0NSX1JFU0VMX0FCUyAgICAgMHg0MDAwMDAwMAorI2RlZmluZQlTQ1JfUkVTRUxfQUJTX0FUTiAweDQxMDAwMDAwCisjZGVmaW5lCVNDUl9SRVNFTF9UQkwgICAgIDB4NDIwMDAwMDAKKyNkZWZpbmUJU0NSX1JFU0VMX1RCTF9BVE4gMHg0MzAwMDAwMAorI2VuZGlmCisKK3N0cnVjdCBzeW1fdGJsc2VsIHsKKyAgICAgICAgdV9jaGFyICBzZWxfc2NudGw0OwkvKiBDMTAxMCBvbmx5ICovCisgICAgICAgIHVfY2hhciAgc2VsX3N4ZmVyOworICAgICAgICB1X2NoYXIgIHNlbF9pZDsKKyAgICAgICAgdV9jaGFyICBzZWxfc2NudGwzOworfTsKKworI2RlZmluZSBTQ1JfSk1QX1JFTCAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBTQ1JfSUQoaWQpCSgoKHUzMikoaWQpKSA8PCAxNikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVdhaXRpbmcgZm9yIERpc2Nvbm5lY3Qgb3IgUmVzZWxlY3QKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJV0FJVF9ESVNDCisgKglkdW1teTogPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisgKgorICoJV0FJVF9SRVNFTAorICoJPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUJU0NSX1dBSVRfRElTQwkweDQ4MDAwMDAwCisjZGVmaW5lIFNDUl9XQUlUX1JFU0VMICAweDUwMDAwMDAwCisKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisjZGVmaW5lCVNDUl9ESVNDT05ORUNUCTB4NDgwMDAwMDAKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJQml0IFNldCAvIFJlc2V0CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVNFVCAoZmxhZ3Mge3wuLiB9KQorICoKKyAqCUNMUiAoZmxhZ3Mge3wuLiB9KQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIFNDUl9TRVQoZikgICAgICgweDU4MDAwMDAwIHwgKGYpKQorI2RlZmluZSBTQ1JfQ0xSKGYpICAgICAoMHg2MDAwMDAwMCB8IChmKSkKKworI2RlZmluZQlTQ1JfQ0FSUlkJMHgwMDAwMDQwMAorI2RlZmluZQlTQ1JfVFJHCQkweDAwMDAwMjAwCisjZGVmaW5lCVNDUl9BQ0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUJU0NSX0FUTgkJMHgwMDAwMDAwOAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglNZW1vcnkgdG8gbWVtb3J5IG1vdmUKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJQ09QWSAoYnl0ZWNvdW50KQorICoJPDwgc291cmNlX2FkZHJlc3MgPj4KKyAqCTw8IGRlc3RpbmF0aW9uX2FkZHJlc3MgPj4KKyAqCisgKglTQ1JfQ09QWSAgIHNldHMgdGhlIE5PIEZMVVNIIG9wdGlvbiBieSBkZWZhdWx0LgorICoJU0NSX0NPUFlfRiBkb2VzIG5vdCBzZXQgdGhpcyBvcHRpb24uCisgKgorICoJRm9yIGNoaXBzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoaXMgb3B0aW9uLAorICoJc3ltX2Z3X2JpbmRfc2NyaXB0KCkgd2lsbCByZW1vdmUgdGhpcyBiaXQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgU0NSX05PX0ZMVVNIIDB4MDEwMDAwMDAKKworI2RlZmluZSBTQ1JfQ09QWShuKSAoMHhjMDAwMDAwMCB8IFNDUl9OT19GTFVTSCB8IChuKSkKKyNkZWZpbmUgU0NSX0NPUFlfRihuKSAoMHhjMDAwMDAwMCB8IChuKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVJlZ2lzdGVyIG1vdmUgYW5kIGJpbmFyeSBvcGVyYXRpb25zCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVNGQlJfUkVHIChyZWcsIG9wLCBkYXRhKSAgICAgICAgcmVnICA9IFNGQlIgb3AgZGF0YQorICoJPDwgMCA+PgorICoKKyAqCVJFR19TRkJSIChyZWcsIG9wLCBkYXRhKSAgICAgICAgU0ZCUiA9IHJlZyBvcCBkYXRhCisgKgk8PCAwID4+CisgKgorICoJUkVHX1JFRyAgKHJlZywgb3AsIGRhdGEpICAgICAgICByZWcgID0gcmVnIG9wIGRhdGEKKyAqCTw8IDAgPj4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJT24gODI1QSwgODc1LCA4OTUgYW5kIDg5NiBjaGlwcyB0aGUgY29udGVudCAKKyAqCW9mIFNGQlIgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgYXMgZGF0YSAoU0NSX1NGQlJfREFUQSkuCisgKglUaGUgODk2IGhhcyBhZGRpdGlvbm5hbCBJTyByZWdpc3RlcnMgc3RhcnRpbmcgYXQgCisgKglvZmZzZXQgMHg4MC4gQml0IDcgb2YgcmVnaXN0ZXIgb2Zmc2V0IGlzIHN0b3JlZCBpbiAKKyAqCWJpdCA3IG9mIHRoZSBTQ1JJUFRTIGluc3RydWN0aW9uIGZpcnN0IERXT1JELgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIFNDUl9SRUdfT0ZTKG9mcykgKCgoKG9mcykgJiAweDdmKSA8PCAxNnVsKSArICgob2ZzKSAmIDB4ODApKSAKKworI2RlZmluZSBTQ1JfU0ZCUl9SRUcocmVnLG9wLGRhdGEpIFwKKyAgICAgICAgKDB4NjgwMDAwMDAgfCAoU0NSX1JFR19PRlMoUkVHKHJlZykpKSB8IChvcCkgfCAoKChkYXRhKSYweGZmKTw8OHVsKSkKKworI2RlZmluZSBTQ1JfUkVHX1NGQlIocmVnLG9wLGRhdGEpIFwKKyAgICAgICAgKDB4NzAwMDAwMDAgfCAoU0NSX1JFR19PRlMoUkVHKHJlZykpKSB8IChvcCkgfCAoKChkYXRhKSYweGZmKTw8OHVsKSkKKworI2RlZmluZSBTQ1JfUkVHX1JFRyhyZWcsb3AsZGF0YSkgXAorICAgICAgICAoMHg3ODAwMDAwMCB8IChTQ1JfUkVHX09GUyhSRUcocmVnKSkpIHwgKG9wKSB8ICgoKGRhdGEpJjB4ZmYpPDw4dWwpKQorCisKKyNkZWZpbmUgICAgICBTQ1JfTE9BRCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfU0hMICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfT1IgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfWE9SICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfQU5EICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfU0hSICAgIDB4MDUwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfQUREICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgICAgICBTQ1JfQUREQyAgIDB4MDcwMDAwMDAKKworI2RlZmluZSAgICAgIFNDUl9TRkJSX0RBVEEgICAoMHgwMDgwMDAwMD4+OHVsKQkvKiBVc2UgU0ZCUiBhcyBkYXRhICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglGUk9NX1JFRyAocmVnKQkJICBTRkJSID0gcmVnCisgKgk8PCAwID4+CisgKgorICoJVE9fUkVHCSAocmVnKQkJICByZWcgID0gU0ZCUgorICoJPDwgMCA+PgorICoKKyAqCUxPQURfUkVHIChyZWcsIGRhdGEpCSAgcmVnICA9IDxkYXRhPgorICoJPDwgMCA+PgorICoKKyAqCUxPQURfU0ZCUihkYXRhKSAJICBTRkJSID0gPGRhdGE+CisgKgk8PCAwID4+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUJU0NSX0ZST01fUkVHKHJlZykgXAorCVNDUl9SRUdfU0ZCUihyZWcsU0NSX09SLDApCisKKyNkZWZpbmUJU0NSX1RPX1JFRyhyZWcpIFwKKwlTQ1JfU0ZCUl9SRUcocmVnLFNDUl9PUiwwKQorCisjZGVmaW5lCVNDUl9MT0FEX1JFRyhyZWcsZGF0YSkgXAorCVNDUl9SRUdfUkVHKHJlZyxTQ1JfTE9BRCxkYXRhKQorCisjZGVmaW5lIFNDUl9MT0FEX1NGQlIoZGF0YSkgXAorICAgICAgICAoU0NSX1JFR19TRkJSIChncHJlZywgU0NSX0xPQUQsIGRhdGEpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJTE9BRCAgZnJvbSBtZW1vcnkgICB0byByZWdpc3Rlci4KKyAqCVNUT1JFIGZyb20gcmVnaXN0ZXIgdG8gbWVtb3J5LgorICoKKyAqCU9ubHkgc3VwcG9ydGVkIGJ5IDgxMEEsIDg2MCwgODI1QSwgODc1LCA4OTUgYW5kIDg5Ni4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICoJTE9BRF9BQlMgKExFTikKKyAqCTw8c3RhcnQgYWRkcmVzcz4+CisgKgorICoJTE9BRF9SRUwgKExFTikgICAgICAgIChEU0EgcmVsYXRpdmUpCisgKgk8PGRzYV9vZmZzZXQ+PgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIFNDUl9SRUdfT0ZTMihvZnMpICgoKG9mcykgJiAweGZmKSA8PCAxNnVsKQorI2RlZmluZSBTQ1JfTk9fRkxVU0gyCTB4MDIwMDAwMDAKKyNkZWZpbmUgU0NSX0RTQV9SRUwyCTB4MTAwMDAwMDAKKworI2RlZmluZSBTQ1JfTE9BRF9SKHJlZywgaG93LCBuKSBcCisgICAgICAgICgweGUxMDAwMDAwIHwgaG93IHwgKFNDUl9SRUdfT0ZTMihSRUcocmVnKSkpIHwgKG4pKQorCisjZGVmaW5lIFNDUl9TVE9SRV9SKHJlZywgaG93LCBuKSBcCisgICAgICAgICgweGUwMDAwMDAwIHwgaG93IHwgKFNDUl9SRUdfT0ZTMihSRUcocmVnKSkpIHwgKG4pKQorCisjZGVmaW5lIFNDUl9MT0FEX0FCUyhyZWcsIG4pCVNDUl9MT0FEX1IocmVnLCBTQ1JfTk9fRkxVU0gyLCBuKQorI2RlZmluZSBTQ1JfTE9BRF9SRUwocmVnLCBuKQlTQ1JfTE9BRF9SKHJlZywgU0NSX05PX0ZMVVNIMnxTQ1JfRFNBX1JFTDIsIG4pCisjZGVmaW5lIFNDUl9MT0FEX0FCU19GKHJlZywgbikJU0NSX0xPQURfUihyZWcsIDAsIG4pCisjZGVmaW5lIFNDUl9MT0FEX1JFTF9GKHJlZywgbikJU0NSX0xPQURfUihyZWcsIFNDUl9EU0FfUkVMMiwgbikKKworI2RlZmluZSBTQ1JfU1RPUkVfQUJTKHJlZywgbikJU0NSX1NUT1JFX1IocmVnLCBTQ1JfTk9fRkxVU0gyLCBuKQorI2RlZmluZSBTQ1JfU1RPUkVfUkVMKHJlZywgbikJU0NSX1NUT1JFX1IocmVnLCBTQ1JfTk9fRkxVU0gyfFNDUl9EU0FfUkVMMixuKQorI2RlZmluZSBTQ1JfU1RPUkVfQUJTX0YocmVnLCBuKQlTQ1JfU1RPUkVfUihyZWcsIDAsIG4pCisjZGVmaW5lIFNDUl9TVE9SRV9SRUxfRihyZWcsIG4pCVNDUl9TVE9SRV9SKHJlZywgU0NSX0RTQV9SRUwyLCBuKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKglXYWl0aW5nIGZvciBEaXNjb25uZWN0IG9yIFJlc2VsZWN0CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCUpVTVAgICAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisgKgk8PGFkZHJlc3M+PgorICoKKyAqCUpVTVBSICAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisgKgk8PGRpc3RhbmNlPj4KKyAqCisgKglDQUxMICAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorICoJPDxhZGRyZXNzPj4KKyAqCisgKglDQUxMUiAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorICoJPDxkaXN0YW5jZT4+CisgKgorICoJUkVUVVJOICAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyAqCTw8ZHVtbXk+PgorICoKKyAqCUlOVCAgICAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisgKgk8PGlkZW50Pj4KKyAqCisgKglJTlRfRkxZICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorICoJPDxpZGVudD4+CisgKgorICoJQ29uZGl0aW9uczoKKyAqCSAgICAgV0hFTiAocGhhc2UpCisgKgkgICAgIElGICAgKHBoYXNlKQorICoJICAgICBDQVJSWVNFVAorICoJICAgICBEQVRBIChkYXRhLCBtYXNrKQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIFNDUl9OT19PUCAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIFNDUl9KVU1QICAgICAgICAweDgwMDgwMDAwCisjZGVmaW5lIFNDUl9KVU1QNjQgICAgICAweDgwNDgwMDAwCisjZGVmaW5lIFNDUl9KVU1QUiAgICAgICAweDgwODgwMDAwCisjZGVmaW5lIFNDUl9DQUxMICAgICAgICAweDg4MDgwMDAwCisjZGVmaW5lIFNDUl9DQUxMUiAgICAgICAweDg4ODgwMDAwCisjZGVmaW5lIFNDUl9SRVRVUk4gICAgICAweDkwMDgwMDAwCisjZGVmaW5lIFNDUl9JTlQgICAgICAgICAweDk4MDgwMDAwCisjZGVmaW5lIFNDUl9JTlRfRkxZICAgICAweDk4MTgwMDAwCisKKyNkZWZpbmUgSUZGQUxTRShhcmcpICAgKDB4MDAwODAwMDAgfCAoYXJnKSkKKyNkZWZpbmUgSUZUUlVFKGFyZykgICAgKDB4MDAwMDAwMDAgfCAoYXJnKSkKKworI2RlZmluZSBXSEVOKHBoYXNlKSAgICAoMHgwMDAzMDAwMCB8IChwaGFzZSkpCisjZGVmaW5lIElGKHBoYXNlKSAgICAgICgweDAwMDIwMDAwIHwgKHBoYXNlKSkKKworI2RlZmluZSBEQVRBKEQpICAgICAgICAoMHgwMDA0MDAwMCB8ICgoRCkgJiAweGZmKSkKKyNkZWZpbmUgTUFTSyhELE0pICAgICAgKDB4MDAwNDAwMDAgfCAoKChNIF4gMHhmZikgJiAweGZmKSA8PCA4dWwpfCgoRCkgJiAweGZmKSkKKworI2RlZmluZSBDQVJSWVNFVCAgICAgICAoMHgwMDIwMDAwMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCVNDU0kgIGNvbnN0YW50cy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqCU1lc3NhZ2VzCisgKi8KKworI2RlZmluZQlNX0NPTVBMRVRFCUNPTU1BTkRfQ09NUExFVEUKKyNkZWZpbmUJTV9FWFRFTkRFRAlFWFRFTkRFRF9NRVNTQUdFCisjZGVmaW5lCU1fU0FWRV9EUAlTQVZFX1BPSU5URVJTCisjZGVmaW5lCU1fUkVTVE9SRV9EUAlSRVNUT1JFX1BPSU5URVJTCisjZGVmaW5lCU1fRElTQ09OTkVDVAlESVNDT05ORUNUCisjZGVmaW5lCU1fSURfRVJST1IJSU5JVElBVE9SX0VSUk9SCisjZGVmaW5lCU1fQUJPUlQJCUFCT1JUX1RBU0tfU0VUCisjZGVmaW5lCU1fUkVKRUNUCU1FU1NBR0VfUkVKRUNUCisjZGVmaW5lCU1fTk9PUAkJTk9QCisjZGVmaW5lCU1fUEFSSVRZCU1TR19QQVJJVFlfRVJST1IKKyNkZWZpbmUJTV9MQ09NUExFVEUJTElOS0VEX0NNRF9DT01QTEVURQorI2RlZmluZQlNX0ZDT01QTEVURQlMSU5LRURfRkxHX0NNRF9DT01QTEVURQorI2RlZmluZQlNX1JFU0VUCQlUQVJHRVRfUkVTRVQKKyNkZWZpbmUJTV9BQk9SVF9UQUcJQUJPUlRfVEFTSworI2RlZmluZQlNX0NMRUFSX1FVRVVFCUNMRUFSX1RBU0tfU0VUCisjZGVmaW5lCU1fSU5JVF9SRUMJSU5JVElBVEVfUkVDT1ZFUlkKKyNkZWZpbmUJTV9SRUxfUkVDCVJFTEVBU0VfUkVDT1ZFUlkKKyNkZWZpbmUJTV9URVJNSU5BVEUJKDB4MTEpCisjZGVmaW5lCU1fU0lNUExFX1RBRwlTSU1QTEVfUVVFVUVfVEFHCisjZGVmaW5lCU1fSEVBRF9UQUcJSEVBRF9PRl9RVUVVRV9UQUcKKyNkZWZpbmUJTV9PUkRFUkVEX1RBRwlPUkRFUkVEX1FVRVVFX1RBRworI2RlZmluZQlNX0lHTl9SRVNJRFVFCUlHTk9SRV9XSURFX1JFU0lEVUUKKworI2RlZmluZQlNX1hfTU9ESUZZX0RQCUVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVIKKyNkZWZpbmUJTV9YX1NZTkNfUkVRCUVYVEVOREVEX1NEVFIKKyNkZWZpbmUJTV9YX1dJREVfUkVRCUVYVEVOREVEX1dEVFIKKyNkZWZpbmUJTV9YX1BQUl9SRVEJRVhURU5ERURfUFBSCisKKy8qCisgKglQUFIgcHJvdG9jb2wgb3B0aW9ucworICovCisjZGVmaW5lCVBQUl9PUFRfSVUJKDB4MDEpCisjZGVmaW5lCVBQUl9PUFRfRFQJKDB4MDIpCisjZGVmaW5lCVBQUl9PUFRfUUFTCSgweDA0KQorI2RlZmluZSBQUFJfT1BUX01BU0sJKDB4MDcpCisKKy8qCisgKglTdGF0dXMKKyAqLworCisjZGVmaW5lCVNfR09PRAkJU0FNX1NUQVRfR09PRAorI2RlZmluZQlTX0NIRUNLX0NPTkQJU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OCisjZGVmaW5lCVNfQ09ORF9NRVQJU0FNX1NUQVRfQ09ORElUSU9OX01FVAorI2RlZmluZQlTX0JVU1kJCVNBTV9TVEFUX0JVU1kKKyNkZWZpbmUJU19JTlQJCVNBTV9TVEFUX0lOVEVSTUVESUFURQorI2RlZmluZQlTX0lOVF9DT05EX01FVAlTQU1fU1RBVF9JTlRFUk1FRElBVEVfQ09ORElUSU9OX01FVAorI2RlZmluZQlTX0NPTkZMSUNUCVNBTV9TVEFUX1JFU0VSVkFUSU9OX0NPTkZMSUNUCisjZGVmaW5lCVNfVEVSTUlOQVRFRAlTQU1fU1RBVF9DT01NQU5EX1RFUk1JTkFURUQKKyNkZWZpbmUJU19RVUVVRV9GVUxMCVNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwKKyNkZWZpbmUJU19JTExFR0FMCSgweGZmKQorCisjZW5kaWYgLyogZGVmaW5lZCBTWU1fREVGU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3LmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzNmNmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgX19GcmVlQlNEX18KKyNpbmNsdWRlIDxkZXYvc3ltL3N5bV9nbHVlLmg+CisjZWxzZQorI2luY2x1ZGUgInN5bV9nbHVlLmgiCisjZW5kaWYKKworLyoKKyAqICBNYWNyb3MgdXNlZCBmb3IgYWxsIGZpcm13YXJlcy4KKyAqLworI2RlZmluZQlTWU1fR0VOX0EocywgbGFiZWwpCSgoc2hvcnQpIG9mZnNldG9mKHMsIGxhYmVsKSksCisjZGVmaW5lCVNZTV9HRU5fQihzLCBsYWJlbCkJKChzaG9ydCkgb2Zmc2V0b2YocywgbGFiZWwpKSwKKyNkZWZpbmUJU1lNX0dFTl9aKHMsIGxhYmVsKQkoKHNob3J0KSBvZmZzZXRvZihzLCBsYWJlbCkpLAorI2RlZmluZQlQQUREUl9BKGxhYmVsKQkJU1lNX0dFTl9QQUREUl9BKHN0cnVjdCBTWU1fRldBX1NDUiwgbGFiZWwpCisjZGVmaW5lCVBBRERSX0IobGFiZWwpCQlTWU1fR0VOX1BBRERSX0Ioc3RydWN0IFNZTV9GV0JfU0NSLCBsYWJlbCkKKworCisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCisvKgorICogIEFsbG9jYXRlIGZpcm13YXJlICMxIHNjcmlwdCBhcmVhLgorICovCisjZGVmaW5lCVNZTV9GV0FfU0NSCQlzeW1fZncxYV9zY3IKKyNkZWZpbmUJU1lNX0ZXQl9TQ1IJCXN5bV9mdzFiX3NjcgorI2RlZmluZQlTWU1fRldaX1NDUgkJc3ltX2Z3MXpfc2NyCisjaWZkZWYgX19GcmVlQlNEX18KKyNpbmNsdWRlIDxkZXYvc3ltL3N5bV9mdzEuaD4KKyNlbHNlCisjaW5jbHVkZSAic3ltX2Z3MS5oIgorI2VuZGlmCitzdGF0aWMgc3RydWN0IHN5bV9md2Ffb2ZzIHN5bV9mdzFhX29mcyA9IHsKKwlTWU1fR0VOX0ZXX0Eoc3RydWN0IFNZTV9GV0FfU0NSKQorfTsKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2Z3Yl9vZnMgc3ltX2Z3MWJfb2ZzID0geworCVNZTV9HRU5fRldfQihzdHJ1Y3QgU1lNX0ZXQl9TQ1IpCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwlTWU1fR0VOX0Ioc3RydWN0IFNZTV9GV0JfU0NSLCBkYXRhX2lvKQorI2VuZGlmCit9Oworc3RhdGljIHN0cnVjdCBzeW1fZnd6X29mcyBzeW1fZncxel9vZnMgPSB7CisJU1lNX0dFTl9GV19aKHN0cnVjdCBTWU1fRldaX1NDUikKK307CisjdW5kZWYJU1lNX0ZXQV9TQ1IKKyN1bmRlZglTWU1fRldCX1NDUgorI3VuZGVmCVNZTV9GV1pfU0NSCisjZW5kaWYJLyogU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUICovCisKKy8qCisgKiAgQWxsb2NhdGUgZmlybXdhcmUgIzIgc2NyaXB0IGFyZWEuCisgKi8KKyNkZWZpbmUJU1lNX0ZXQV9TQ1IJCXN5bV9mdzJhX3NjcgorI2RlZmluZQlTWU1fRldCX1NDUgkJc3ltX2Z3MmJfc2NyCisjZGVmaW5lCVNZTV9GV1pfU0NSCQlzeW1fZncyel9zY3IKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2luY2x1ZGUgPGRldi9zeW0vc3ltX2Z3Mi5oPgorI2Vsc2UKKyNpbmNsdWRlICJzeW1fZncyLmgiCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2Z3YV9vZnMgc3ltX2Z3MmFfb2ZzID0geworCVNZTV9HRU5fRldfQShzdHJ1Y3QgU1lNX0ZXQV9TQ1IpCit9Oworc3RhdGljIHN0cnVjdCBzeW1fZndiX29mcyBzeW1fZncyYl9vZnMgPSB7CisJU1lNX0dFTl9GV19CKHN0cnVjdCBTWU1fRldCX1NDUikKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCVNZTV9HRU5fQihzdHJ1Y3QgU1lNX0ZXQl9TQ1IsIGRhdGFfaW8pCisjZW5kaWYKKwlTWU1fR0VOX0Ioc3RydWN0IFNZTV9GV0JfU0NSLCBzdGFydDY0KQorCVNZTV9HRU5fQihzdHJ1Y3QgU1lNX0ZXQl9TQ1IsIHBtX2hhbmRsZSkKK307CitzdGF0aWMgc3RydWN0IHN5bV9md3pfb2ZzIHN5bV9mdzJ6X29mcyA9IHsKKwlTWU1fR0VOX0ZXX1ooc3RydWN0IFNZTV9GV1pfU0NSKQorfTsKKyN1bmRlZglTWU1fRldBX1NDUgorI3VuZGVmCVNZTV9GV0JfU0NSCisjdW5kZWYJU1lNX0ZXWl9TQ1IKKworI3VuZGVmCVNZTV9HRU5fQQorI3VuZGVmCVNZTV9HRU5fQgorI3VuZGVmCVNZTV9HRU5fWgorI3VuZGVmCVBBRERSX0EKKyN1bmRlZglQQUREUl9CCisKKyNpZglTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQKKy8qCisgKiAgUGF0Y2ggcm91dGluZSBmb3IgZmlybXdhcmUgIzEuCisgKi8KK3N0YXRpYyB2b2lkCitzeW1fZncxX3BhdGNoKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlzdHJ1Y3Qgc3ltX2Z3MWFfc2NyICpzY3JpcHRhMDsKKwlzdHJ1Y3Qgc3ltX2Z3MWJfc2NyICpzY3JpcHRiMDsKKworCXNjcmlwdGEwID0gKHN0cnVjdCBzeW1fZncxYV9zY3IgKikgbnAtPnNjcmlwdGEwOworCXNjcmlwdGIwID0gKHN0cnVjdCBzeW1fZncxYl9zY3IgKikgbnAtPnNjcmlwdGIwOworCisJLyoKKwkgKiAgUmVtb3ZlIExFRCBzdXBwb3J0IGlmIG5vdCBuZWVkZWQuCisJICovCisJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfTEVEMCkpIHsKKwkJc2NyaXB0YTAtPmlkbGVbMF0JPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5yZXNlbGVjdGVkWzBdCT0gY3B1X3RvX3NjcihTQ1JfTk9fT1ApOworCQlzY3JpcHRhMC0+c3RhcnRbMF0JPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJfQorCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgICBJZiB1c2VyIGRvZXMgbm90IHdhbnQgdG8gdXNlIElNTUVESUFURSBBUkJJVFJBVElPTgorCSAqICAgIHdoZW4gd2UgYXJlIHJlc2VsZWN0ZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBhcmJpdHJhdGUsCisJICogICAgcGF0Y2ggdGhlIFNDUklQVFMgYWNjb3JkaW5nbHkgd2l0aCBhIFNDUklQVCBOT19PUC4KKwkgKi8KKwlpZiAoIVNZTV9DT05GX1NFVF9JQVJCX09OX0FSQl9MT1NUKQorCQlzY3JpcHRhMC0+dW5nZXRqb2JbMF0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisjZW5kaWYKKwkvKgorCSAqICBQYXRjaCBzb21lIGRhdGEgaW4gU0NSSVBUUy4KKwkgKiAgLSBzdGFydCBhbmQgZG9uZSBxdWV1ZSBpbml0aWFsIGJ1cyBhZGRyZXNzLgorCSAqICAtIHRhcmdldCBidXMgYWRkcmVzcyB0YWJsZSBidXMgYWRkcmVzcy4KKwkgKi8KKwlzY3JpcHRiMC0+c3RhcnRwb3NbMF0JPSBjcHVfdG9fc2NyKG5wLT5zcXVldWVfYmEpOworCXNjcmlwdGIwLT5kb25lX3Bvc1swXQk9IGNwdV90b19zY3IobnAtPmRxdWV1ZV9iYSk7CisJc2NyaXB0YjAtPnRhcmd0YmxbMF0JPSBjcHVfdG9fc2NyKG5wLT50YXJndGJsX2JhKTsKK30KKyNlbmRpZgkvKiBTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQgKi8KKworLyoKKyAqICBQYXRjaCByb3V0aW5lIGZvciBmaXJtd2FyZSAjMi4KKyAqLworc3RhdGljIHZvaWQKK3N5bV9mdzJfcGF0Y2goc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXN0cnVjdCBzeW1fZncyYV9zY3IgKnNjcmlwdGEwOworCXN0cnVjdCBzeW1fZncyYl9zY3IgKnNjcmlwdGIwOworCisJc2NyaXB0YTAgPSAoc3RydWN0IHN5bV9mdzJhX3NjciAqKSBucC0+c2NyaXB0YTA7CisJc2NyaXB0YjAgPSAoc3RydWN0IHN5bV9mdzJiX3NjciAqKSBucC0+c2NyaXB0YjA7CisKKwkvKgorCSAqICBSZW1vdmUgTEVEIHN1cHBvcnQgaWYgbm90IG5lZWRlZC4KKwkgKi8KKwlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9MRUQwKSkgeworCQlzY3JpcHRhMC0+aWRsZVswXQk9IGNwdV90b19zY3IoU0NSX05PX09QKTsKKwkJc2NyaXB0YTAtPnJlc2VsZWN0ZWRbMF0JPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5zdGFydFswXQk9IGNwdV90b19zY3IoU0NSX05PX09QKTsKKwl9CisKKyNpZiAgIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorCS8qCisJICogIFJlbW92ZSB1c2VsZXNzIDY0IGJpdCBETUEgc3BlY2lmaWMgU0NSSVBUUywgCisJICogIHdoZW4gdGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUuCisJICovCisJaWYgKCFucC0+dXNlX2RhYykgeworCQlzY3JpcHRhMC0+aXNfZG1hcF9kaXJ0eVswXSA9IGNwdV90b19zY3IoU0NSX05PX09QKTsKKwkJc2NyaXB0YTAtPmlzX2RtYXBfZGlydHlbMV0gPSAwOworCQlzY3JpcHRhMC0+aXNfZG1hcF9kaXJ0eVsyXSA9IGNwdV90b19zY3IoU0NSX05PX09QKTsKKwkJc2NyaXB0YTAtPmlzX2RtYXBfZGlydHlbM10gPSAwOworCX0KKyNlbmRpZgorCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgICBJZiB1c2VyIGRvZXMgbm90IHdhbnQgdG8gdXNlIElNTUVESUFURSBBUkJJVFJBVElPTgorCSAqICAgIHdoZW4gd2UgYXJlIHJlc2VsZWN0ZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBhcmJpdHJhdGUsCisJICogICAgcGF0Y2ggdGhlIFNDUklQVFMgYWNjb3JkaW5nbHkgd2l0aCBhIFNDUklQVCBOT19PUC4KKwkgKi8KKwlpZiAoIVNZTV9DT05GX1NFVF9JQVJCX09OX0FSQl9MT1NUKQorCQlzY3JpcHRhMC0+dW5nZXRqb2JbMF0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisjZW5kaWYKKwkvKgorCSAqICBQYXRjaCBzb21lIHZhcmlhYmxlIGluIFNDUklQVFMuCisJICogIC0gc3RhcnQgYW5kIGRvbmUgcXVldWUgaW5pdGlhbCBidXMgYWRkcmVzcy4KKwkgKiAgLSB0YXJnZXQgYnVzIGFkZHJlc3MgdGFibGUgYnVzIGFkZHJlc3MuCisJICovCisJc2NyaXB0YjAtPnN0YXJ0cG9zWzBdCT0gY3B1X3RvX3NjcihucC0+c3F1ZXVlX2JhKTsKKwlzY3JpcHRiMC0+ZG9uZV9wb3NbMF0JPSBjcHVfdG9fc2NyKG5wLT5kcXVldWVfYmEpOworCXNjcmlwdGIwLT50YXJndGJsWzBdCT0gY3B1X3RvX3NjcihucC0+dGFyZ3RibF9iYSk7CisKKwkvKgorCSAqICBSZW1vdmUgdGhlIGxvYWQgb2YgU0NOVEw0IG9uIHJlc2VsZWN0aW9uIGlmIG5vdCBhIEMxMC4KKwkgKi8KKwlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9DMTApKSB7CisJCXNjcmlwdGEwLT5yZXNlbF9zY250bDRbMF0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5yZXNlbF9zY250bDRbMV0gPSBjcHVfdG9fc2NyKDApOworCX0KKworCS8qCisJICogIFJlbW92ZSBhIGNvdXBsZSBvZiB3b3JrLWFyb3VuZHMgc3BlY2lmaWMgdG8gQzEwMTAgaWYgCisJICogIHRoZXkgYXJlIG5vdCBkZXNpcmFibGUuIFNlZSBgc3ltX2Z3Mi5oJyBmb3IgbW9yZSBkZXRhaWxzLgorCSAqLworCWlmICghKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF82NiAmJgorCSAgICAgIG5wLT5yZXZpc2lvbl9pZCA8IDB4MSAmJgorCSAgICAgIG5wLT5wY2ljbGtfa2h6IDwgNjAwMDApKSB7CisJCXNjcmlwdGEwLT5kYXRhb19waGFzZVswXSA9IGNwdV90b19zY3IoU0NSX05PX09QKTsKKwkJc2NyaXB0YTAtPmRhdGFvX3BoYXNlWzFdID0gY3B1X3RvX3NjcigwKTsKKwl9CisJaWYgKCEobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzMzICYmCisJICAgICAgLyogbnAtPnJldmlzaW9uX2lkIDwgMHhmZiAqLyAxKSkgeworCQlzY3JpcHRhMC0+c2VsX2RvbmVbMF0gPSBjcHVfdG9fc2NyKFNDUl9OT19PUCk7CisJCXNjcmlwdGEwLT5zZWxfZG9uZVsxXSA9IGNwdV90b19zY3IoMCk7CisJfQorCisJLyoKKwkgKiAgUGF0Y2ggc29tZSBvdGhlciB2YXJpYWJsZXMgaW4gU0NSSVBUUy4KKwkgKiAgVGhlc2Ugb25lcyBhcmUgbG9hZGVkIGJ5IHRoZSBTQ1JJUFRTIHByb2Nlc3Nvci4KKwkgKi8KKwlzY3JpcHRiMC0+cG0wX2RhdGFfYWRkclswXSA9CisJCWNwdV90b19zY3IobnAtPnNjcmlwdGFfYmEgKyAKKwkJCSAgIG9mZnNldG9mKHN0cnVjdCBzeW1fZncyYV9zY3IsIHBtMF9kYXRhKSk7CisJc2NyaXB0YjAtPnBtMV9kYXRhX2FkZHJbMF0gPQorCQljcHVfdG9fc2NyKG5wLT5zY3JpcHRhX2JhICsgCisJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc3ltX2Z3MmFfc2NyLCBwbTFfZGF0YSkpOworfQorCisvKgorICogIEZpbGwgdGhlIGRhdGEgYXJlYSBpbiBzY3JpcHRzLgorICogIFRvIGJlIGRvbmUgZm9yIGFsbCBmaXJtd2FyZXMuCisgKi8KK3N0YXRpYyB2b2lkCitzeW1fZndfZmlsbF9kYXRhICh1MzIgKmluLCB1MzIgKm91dCkKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBTWU1fQ09ORl9NQVhfU0c7IGkrKykgeworCQkqaW4rKyAgPSBTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU47CisJCSppbisrICA9IG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgZGF0YVtpXSk7CisJCSpvdXQrKyA9IFNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9PVVQ7CisJCSpvdXQrKyA9IG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgZGF0YVtpXSk7CisJfQorfQorCisvKgorICogIFNldHVwIHVzZWZ1bCBzY3JpcHQgYnVzIGFkZHJlc3Nlcy4KKyAqICBUbyBiZSBkb25lIGZvciBhbGwgZmlybXdhcmVzLgorICovCitzdGF0aWMgdm9pZCAKK3N5bV9md19zZXR1cF9idXNfYWRkcmVzc2VzKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9mdyAqZncpCit7CisJdTMyICpwYTsKKwl1X3Nob3J0ICpwbzsKKwlpbnQgaTsKKworCS8qCisJICogIEJ1aWxkIHRoZSBidXMgYWRkcmVzcyB0YWJsZSBmb3Igc2NyaXB0IEEgCisJICogIGZyb20gdGhlIHNjcmlwdCBBIG9mZnNldCB0YWJsZS4KKwkgKi8KKwlwbyA9ICh1X3Nob3J0ICopIGZ3LT5hX29mczsKKwlwYSA9ICh1MzIgKikgJm5wLT5md2FfYmFzOworCWZvciAoaSA9IDAgOyBpIDwgc2l6ZW9mKG5wLT5md2FfYmFzKS9zaXplb2YodTMyKSA7IGkrKykKKwkJcGFbaV0gPSBucC0+c2NyaXB0YV9iYSArIHBvW2ldOworCisJLyoKKwkgKiAgU2FtZSBmb3Igc2NyaXB0IEIuCisJICovCisJcG8gPSAodV9zaG9ydCAqKSBmdy0+Yl9vZnM7CisJcGEgPSAodTMyICopICZucC0+ZndiX2JhczsKKwlmb3IgKGkgPSAwIDsgaSA8IHNpemVvZihucC0+ZndiX2Jhcykvc2l6ZW9mKHUzMikgOyBpKyspCisJCXBhW2ldID0gbnAtPnNjcmlwdGJfYmEgKyBwb1tpXTsKKworCS8qCisJICogIFNhbWUgZm9yIHNjcmlwdCBaLgorCSAqLworCXBvID0gKHVfc2hvcnQgKikgZnctPnpfb2ZzOworCXBhID0gKHUzMiAqKSAmbnAtPmZ3el9iYXM7CisJZm9yIChpID0gMCA7IGkgPCBzaXplb2YobnAtPmZ3el9iYXMpL3NpemVvZih1MzIpIDsgaSsrKQorCQlwYVtpXSA9IG5wLT5zY3JpcHR6X2JhICsgcG9baV07Cit9CisKKyNpZglTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQKKy8qCisgKiAgU2V0dXAgcm91dGluZSBmb3IgZmlybXdhcmUgIzEuCisgKi8KK3N0YXRpYyB2b2lkIAorc3ltX2Z3MV9zZXR1cChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fZncgKmZ3KQoreworCXN0cnVjdCBzeW1fZncxYV9zY3IgKnNjcmlwdGEwOworCXN0cnVjdCBzeW1fZncxYl9zY3IgKnNjcmlwdGIwOworCisJc2NyaXB0YTAgPSAoc3RydWN0IHN5bV9mdzFhX3NjciAqKSBucC0+c2NyaXB0YTA7CisJc2NyaXB0YjAgPSAoc3RydWN0IHN5bV9mdzFiX3NjciAqKSBucC0+c2NyaXB0YjA7CisKKwkvKgorCSAqICBGaWxsIHZhcmlhYmxlIHBhcnRzIGluIHNjcmlwdHMuCisJICovCisJc3ltX2Z3X2ZpbGxfZGF0YShzY3JpcHRhMC0+ZGF0YV9pbiwgc2NyaXB0YTAtPmRhdGFfb3V0KTsKKworCS8qCisJICogIFNldHVwIGJ1cyBhZGRyZXNzZXMgdXNlZCBmcm9tIHRoZSBDIGNvZGUuLgorCSAqLworCXN5bV9md19zZXR1cF9idXNfYWRkcmVzc2VzKG5wLCBmdyk7Cit9CisjZW5kaWYJLyogU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUICovCisKKy8qCisgKiAgU2V0dXAgcm91dGluZSBmb3IgZmlybXdhcmUgIzIuCisgKi8KK3N0YXRpYyB2b2lkIAorc3ltX2Z3Ml9zZXR1cChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fZncgKmZ3KQoreworCXN0cnVjdCBzeW1fZncyYV9zY3IgKnNjcmlwdGEwOworCXN0cnVjdCBzeW1fZncyYl9zY3IgKnNjcmlwdGIwOworCisJc2NyaXB0YTAgPSAoc3RydWN0IHN5bV9mdzJhX3NjciAqKSBucC0+c2NyaXB0YTA7CisJc2NyaXB0YjAgPSAoc3RydWN0IHN5bV9mdzJiX3NjciAqKSBucC0+c2NyaXB0YjA7CisKKwkvKgorCSAqICBGaWxsIHZhcmlhYmxlIHBhcnRzIGluIHNjcmlwdHMuCisJICovCisJc3ltX2Z3X2ZpbGxfZGF0YShzY3JpcHRhMC0+ZGF0YV9pbiwgc2NyaXB0YTAtPmRhdGFfb3V0KTsKKworCS8qCisJICogIFNldHVwIGJ1cyBhZGRyZXNzZXMgdXNlZCBmcm9tIHRoZSBDIGNvZGUuLgorCSAqLworCXN5bV9md19zZXR1cF9idXNfYWRkcmVzc2VzKG5wLCBmdyk7Cit9CisKKy8qCisgKiAgQWxsb2NhdGUgZmlybXdhcmUgZGVzY3JpcHRvcnMuCisgKi8KKyNpZglTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2Z3IHN5bV9mdzEgPSBTWU1fRldfRU5UUlkoc3ltX2Z3MSwgIk5DUi1nZW5lcmljIik7CisjZW5kaWYJLyogU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUICovCitzdGF0aWMgc3RydWN0IHN5bV9mdyBzeW1fZncyID0gU1lNX0ZXX0VOVFJZKHN5bV9mdzIsICJMT0FEL1NUT1JFLWJhc2VkIik7CisKKy8qCisgKiAgRmluZCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBmaXJtd2FyZSBmb3IgYSBjaGlwLgorICovCitzdHJ1Y3Qgc3ltX2Z3ICogCitzeW1fZmluZF9maXJtd2FyZShzdHJ1Y3Qgc3ltX2NoaXAgKmNoaXApCit7CisJaWYgKGNoaXAtPmZlYXR1cmVzICYgRkVfTERTVFIpCisJCXJldHVybiAmc3ltX2Z3MjsKKyNpZglTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQKKwllbHNlIGlmICghKGNoaXAtPmZlYXR1cmVzICYgKEZFX1BGRU58RkVfTk9QTXxGRV9EQUMpKSkKKwkJcmV0dXJuICZzeW1fZncxOworI2VuZGlmCisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqICBCaW5kIGEgc2NyaXB0IHRvIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqLwordm9pZCBzeW1fZndfYmluZF9zY3JpcHQoc3RydWN0IHN5bV9oY2IgKm5wLCB1MzIgKnN0YXJ0LCBpbnQgbGVuKQoreworCXUzMiBvcGNvZGUsIG5ldywgb2xkLCB0bXAxLCB0bXAyOworCXUzMiAqZW5kLCAqY3VyOworCWludCByZWxvY3M7CisKKwljdXIgPSBzdGFydDsKKwllbmQgPSBzdGFydCArIGxlbi80OworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCisJCW9wY29kZSA9ICpjdXI7CisKKwkJLyoKKwkJICogIElmIHdlIGZvcmdldCB0byBjaGFuZ2UgdGhlIGxlbmd0aAorCQkgKiAgaW4gc2NyaXB0cywgYSBmaWVsZCB3aWxsIGJlCisJCSAqICBwYWRkZWQgd2l0aCAwLiBUaGlzIGlzIGFuIGlsbGVnYWwKKwkJICogIGNvbW1hbmQuCisJCSAqLworCQlpZiAob3Bjb2RlID09IDApIHsKKwkJCXByaW50ZiAoIiVzOiBFUlJPUjAgSU4gU0NSSVBUIGF0ICVkLlxuIiwKKwkJCQlzeW1fbmFtZShucCksIChpbnQpIChjdXItc3RhcnQpKTsKKwkJCSsrY3VyOworCQkJY29udGludWU7CisJCX07CisKKwkJLyoKKwkJICogIFdlIHVzZSB0aGUgYm9ndXMgdmFsdWUgMHhmMDBmZjAwZiA7LSkKKwkJICogIHRvIHJlc2VydmUgZGF0YSBhcmVhIGluIFNDUklQVFMuCisJCSAqLworCQlpZiAob3Bjb2RlID09IFNDUl9EQVRBX1pFUk8pIHsKKwkJCSpjdXIrKyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1NDUklQVCkKKwkJCXByaW50ZiAoIiVkOiAgPCV4PlxuIiwgKGludCkgKGN1ci1zdGFydCksCisJCQkJKHVuc2lnbmVkKW9wY29kZSk7CisKKwkJLyoKKwkJICogIFdlIGRvbid0IGhhdmUgdG8gZGVjb2RlIEFMTCBjb21tYW5kcworCQkgKi8KKwkJc3dpdGNoIChvcGNvZGUgPj4gMjgpIHsKKwkJY2FzZSAweGY6CisJCQkvKgorCQkJICogIExPQUQgLyBTVE9SRSBEU0EgcmVsYXRpdmUsIGRvbid0IHJlbG9jYXRlLgorCQkJICovCisJCQlyZWxvY3MgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHhlOgorCQkJLyoKKwkJCSAqICBMT0FEIC8gU1RPUkUgYWJzb2x1dGUuCisJCQkgKi8KKwkJCXJlbG9jcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweGM6CisJCQkvKgorCQkJICogIENPUFkgaGFzIFRXTyBhcmd1bWVudHMuCisJCQkgKi8KKwkJCXJlbG9jcyA9IDI7CisJCQl0bXAxID0gY3VyWzFdOworCQkJdG1wMiA9IGN1clsyXTsKKwkJCWlmICgodG1wMSBeIHRtcDIpICYgMykgeworCQkJCXByaW50ZiAoIiVzOiBFUlJPUjEgSU4gU0NSSVBUIGF0ICVkLlxuIiwKKwkJCQkJc3ltX25hbWUobnApLCAoaW50KSAoY3VyLXN0YXJ0KSk7CisJCQl9CisJCQkvKgorCQkJICogIElmIFBSRUZFVENIIGZlYXR1cmUgbm90IGVuYWJsZWQsIHJlbW92ZSAKKwkJCSAqICB0aGUgTk8gRkxVU0ggYml0IGlmIHByZXNlbnQuCisJCQkgKi8KKwkJCWlmICgob3Bjb2RlICYgU0NSX05PX0ZMVVNIKSAmJgorCQkJICAgICEobnAtPmZlYXR1cmVzICYgRkVfUEZFTikpIHsKKwkJCQlvcGNvZGUgPSAob3Bjb2RlICYgflNDUl9OT19GTFVTSCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDA6CisJCQkvKgorCQkJICogIE1PVkUvQ0hNT1YgKGFic29sdXRlIGFkZHJlc3MpCisJCQkgKi8KKwkJCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpKQorCQkJCW9wY29kZSA9IChvcGNvZGUgfCBPUENfTU9WRSk7CisJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHgxOgorCQkJLyoKKwkJCSAqICBNT1ZFL0NITU9WICh0YWJsZSBpbmRpcmVjdCkKKwkJCSAqLworCQkJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfV0lERSkpCisJCQkJb3Bjb2RlID0gKG9wY29kZSB8IE9QQ19NT1ZFKTsKKwkJCXJlbG9jcyA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJCWNhc2UgMHgyOgorCQkJLyoKKwkJCSAqICBNT1ZFL0NITU9WIGluIHRhcmdldCByb2xlIChhYnNvbHV0ZSBhZGRyZXNzKQorCQkJICovCisJCQlvcGNvZGUgJj0gfjB4MjAwMDAwMDA7CisJCQlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9XSURFKSkKKwkJCQlvcGNvZGUgPSAob3Bjb2RlICYgfk9QQ19UQ0hNT1ZFKTsKKwkJCXJlbG9jcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDM6CisJCQkvKgorCQkJICogIE1PVkUvQ0hNT1YgaW4gdGFyZ2V0IHJvbGUgKHRhYmxlIGluZGlyZWN0KQorCQkJICovCisJCQlvcGNvZGUgJj0gfjB4MjAwMDAwMDA7CisJCQlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9XSURFKSkKKwkJCQlvcGNvZGUgPSAob3Bjb2RlICYgfk9QQ19UQ0hNT1ZFKTsKKwkJCXJlbG9jcyA9IDA7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIDB4ODoKKwkJCS8qCisJCQkgKiAgSlVNUCAvIENBTEwKKwkJCSAqICBkb24ndCByZWxvY2F0ZSBpZiByZWxhdGl2ZSA6LSkKKwkJCSAqLworCQkJaWYgKG9wY29kZSAmIDB4MDA4MDAwMDApCisJCQkJcmVsb2NzID0gMDsKKwkJCWVsc2UgaWYgKChvcGNvZGUgJiAweGY4NDAwMDAwKSA9PSAweDgwNDAwMDAwKS8qSlVNUDY0Ki8KKwkJCQlyZWxvY3MgPSAyOworCQkJZWxzZQorCQkJCXJlbG9jcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDQ6CisJCWNhc2UgMHg1OgorCQljYXNlIDB4NjoKKwkJY2FzZSAweDc6CisJCQlyZWxvY3MgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZWxvY3MgPSAwOworCQkJYnJlYWs7CisJCX07CisKKwkJLyoKKwkJICogIFNjcmlwdGlmeTopIHRoZSBvcGNvZGUuCisJCSAqLworCQkqY3VyKysgPSBjcHVfdG9fc2NyKG9wY29kZSk7CisKKwkJLyoKKwkJICogIElmIG5vIHJlbG9jYXRpb24sIGFzc3VtZSAxIGFyZ3VtZW50IAorCQkgKiAgYW5kIGp1c3Qgc2NyaXB0aXplOikgaXQuCisJCSAqLworCQlpZiAoIXJlbG9jcykgeworCQkJKmN1ciA9IGNwdV90b19zY3IoKmN1cik7CisJCQkrK2N1cjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogIE90aGVyd2lzZSBwZXJmb3JtcyBhbGwgbmVlZGVkIHJlbG9jYXRpb25zLgorCQkgKi8KKwkJd2hpbGUgKHJlbG9jcy0tKSB7CisJCQlvbGQgPSAqY3VyOworCisJCQlzd2l0Y2ggKG9sZCAmIFJFTE9DX01BU0spIHsKKwkJCWNhc2UgUkVMT0NfUkVHSVNURVI6CisJCQkJbmV3ID0gKG9sZCAmIH5SRUxPQ19NQVNLKSArIG5wLT5tbWlvX2JhOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUxPQ19MQUJFTF9BOgorCQkJCW5ldyA9IChvbGQgJiB+UkVMT0NfTUFTSykgKyBucC0+c2NyaXB0YV9iYTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVMT0NfTEFCRUxfQjoKKwkJCQluZXcgPSAob2xkICYgflJFTE9DX01BU0spICsgbnAtPnNjcmlwdGJfYmE7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFTE9DX1NPRlRDOgorCQkJCW5ldyA9IChvbGQgJiB+UkVMT0NfTUFTSykgKyBucC0+aGNiX2JhOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCS8qCisJCQkJICogIERvbid0IHJlbG9jYXRlIGEgMCBhZGRyZXNzLgorCQkJCSAqICBUaGV5IGFyZSBtb3N0bHkgdXNlZCBmb3IgcGF0Y2hlZCBvciAKKwkJCQkgKiAgc2NyaXB0IHNlbGYtbW9kaWZpZWQgYXJlYXMuCisJCQkJICovCisJCQkJaWYgKG9sZCA9PSAwKSB7CisJCQkJCW5ldyA9IG9sZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJZGVmYXVsdDoKKwkJCQluZXcgPSAwOworCQkJCXBhbmljKCJzeW1fZndfYmluZF9zY3JpcHQ6ICIKKwkJCQkgICAgICAid2VpcmQgcmVsb2NhdGlvbiAleFxuIiwgb2xkKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJKmN1cisrID0gY3B1X3RvX3NjcihuZXcpOworCQl9CisJfTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Y2ODEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdy5oCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYJU1lNX0ZXX0gKKyNkZWZpbmUJU1lNX0ZXX0gKKy8qCisgKiAgTWFjcm8gdXNlZCB0byBnZW5lcmF0ZSBpbnRlcmZhY2VzIGZvciBzY3JpcHQgQS4KKyAqLworI2RlZmluZSBTWU1fR0VOX0ZXX0EocykJCQkJCQkJXAorCVNZTV9HRU5fQShzLCBzdGFydCkJCVNZTV9HRU5fQShzLCBnZXRqb2JfYmVnaW4pCVwKKwlTWU1fR0VOX0EocywgZ2V0am9iX2VuZCkJCQkJCVwKKwlTWU1fR0VOX0Eocywgc2VsZWN0KQkJU1lNX0dFTl9BKHMsIHdmX3NlbF9kb25lKQlcCisJU1lNX0dFTl9BKHMsIHNlbmRfaWRlbnQpCQkJCQlcCisJU1lNX0dFTl9BKHMsIGRpc3BhdGNoKQkJU1lNX0dFTl9BKHMsIGluaXQpCQlcCisJU1lNX0dFTl9BKHMsIGNscmFjaykJCVNZTV9HRU5fQShzLCBjb21wbGV0ZV9lcnJvcikJXAorCVNZTV9HRU5fQShzLCBkb25lKQkJU1lNX0dFTl9BKHMsIGRvbmVfZW5kKQkJXAorCVNZTV9HRU5fQShzLCBpZGxlKQkJU1lNX0dFTl9BKHMsIHVuZ2V0am9iKQkJXAorCVNZTV9HRU5fQShzLCByZXNlbGVjdCkJCQkJCQlcCisJU1lNX0dFTl9BKHMsIHJlc2VsX3RhZykJCVNZTV9HRU5fQShzLCByZXNlbF9kc2EpCQlcCisJU1lNX0dFTl9BKHMsIHJlc2VsX25vX3RhZykJCQkJCVwKKwlTWU1fR0VOX0EocywgZGF0YV9pbikJCVNZTV9HRU5fQShzLCBkYXRhX2luMikJCVwKKwlTWU1fR0VOX0EocywgZGF0YV9vdXQpCQlTWU1fR0VOX0EocywgZGF0YV9vdXQyKQkJXAorCVNZTV9HRU5fQShzLCBwbTBfZGF0YSkJCVNZTV9HRU5fQShzLCBwbTFfZGF0YSkKKworLyoKKyAqICBNYWNybyB1c2VkIHRvIGdlbmVyYXRlIGludGVyZmFjZXMgZm9yIHNjcmlwdCBCLgorICovCisjZGVmaW5lIFNZTV9HRU5fRldfQihzKQkJCQkJCQlcCisJU1lNX0dFTl9CKHMsIG5vX2RhdGEpCQkJCQkJXAorCVNZTV9HRU5fQihzLCBzZWxfZm9yX2Fib3J0KQlTWU1fR0VOX0Iocywgc2VsX2Zvcl9hYm9ydF8xKQlcCisJU1lNX0dFTl9CKHMsIG1zZ19iYWQpCQlTWU1fR0VOX0IocywgbXNnX3dlaXJkKQkJXAorCVNZTV9HRU5fQihzLCB3ZHRyX3Jlc3ApCQlTWU1fR0VOX0Iocywgc2VuZF93ZHRyKQkJXAorCVNZTV9HRU5fQihzLCBzZHRyX3Jlc3ApCQlTWU1fR0VOX0Iocywgc2VuZF9zZHRyKQkJXAorCVNZTV9HRU5fQihzLCBwcHJfcmVzcCkJCVNZTV9HRU5fQihzLCBzZW5kX3BwcikJCVwKKwlTWU1fR0VOX0IocywgbmVnb19iYWRfcGhhc2UpCQkJCQlcCisJU1lNX0dFTl9CKHMsIGlkZW50X2JyZWFrKSAJU1lNX0dFTl9CKHMsIGlkZW50X2JyZWFrX2F0bikJXAorCVNZTV9HRU5fQihzLCBzZGF0YV9pbikJCVNZTV9HRU5fQihzLCByZXNlbF9iYWRfbHVuKQlcCisJU1lNX0dFTl9CKHMsIGJhZF9pX3RfbCkJCVNZTV9HRU5fQihzLCBiYWRfaV90X2xfcSkJXAorCVNZTV9HRU5fQihzLCB3c3JfbWFfaGVscGVyKQorCisvKgorICogIE1hY3JvIHVzZWQgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcyBmb3Igc2NyaXB0IFouCisgKi8KKyNkZWZpbmUgU1lNX0dFTl9GV19aKHMpCQkJCQkJCVwKKwlTWU1fR0VOX1oocywgc25vb3B0ZXN0KQkJU1lNX0dFTl9aKHMsIHNub29wZW5kKQorCisvKgorICogIEdlbmVyYXRlcyBzdHJ1Y3R1cmUgaW50ZXJmYWNlIHRoYXQgY29udGFpbnMgCisgKiAgb2Zmc2V0cyB3aXRoaW4gc2NyaXB0IEEsIEIgYW5kIFouCisgKi8KKyNkZWZpbmUJU1lNX0dFTl9BKHMsIGxhYmVsKQlzIGxhYmVsOworI2RlZmluZQlTWU1fR0VOX0IocywgbGFiZWwpCXMgbGFiZWw7CisjZGVmaW5lCVNZTV9HRU5fWihzLCBsYWJlbCkJcyBsYWJlbDsKK3N0cnVjdCBzeW1fZndhX29mcyB7CisJU1lNX0dFTl9GV19BKHVfc2hvcnQpCit9Oworc3RydWN0IHN5bV9md2Jfb2ZzIHsKKwlTWU1fR0VOX0ZXX0IodV9zaG9ydCkKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCVNZTV9HRU5fQih1X3Nob3J0LCBkYXRhX2lvKQorI2VuZGlmCisJU1lNX0dFTl9CKHVfc2hvcnQsIHN0YXJ0NjQpCisJU1lNX0dFTl9CKHVfc2hvcnQsIHBtX2hhbmRsZSkKK307CitzdHJ1Y3Qgc3ltX2Z3el9vZnMgeworCVNZTV9HRU5fRldfWih1X3Nob3J0KQorfTsKKworLyoKKyAqICBHZW5lcmF0ZXMgc3RydWN0dXJlIGludGVyZmFjZSB0aGF0IGNvbnRhaW5zIAorICogIGJ1cyBhZGRyZXNzZXMgd2l0aGluIHNjcmlwdCBBLCBCIGFuZCBaLgorICovCitzdHJ1Y3Qgc3ltX2Z3YV9iYSB7CisJU1lNX0dFTl9GV19BKHUzMikKK307CitzdHJ1Y3Qgc3ltX2Z3Yl9iYSB7CisJU1lNX0dFTl9GV19CKHUzMikKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCVNZTV9HRU5fQih1MzIsIGRhdGFfaW8pCisjZW5kaWYKKwlTWU1fR0VOX0IodTMyLCBzdGFydDY0KTsKKwlTWU1fR0VOX0IodTMyLCBwbV9oYW5kbGUpOworfTsKK3N0cnVjdCBzeW1fZnd6X2JhIHsKKwlTWU1fR0VOX0ZXX1oodTMyKQorfTsKKyN1bmRlZglTWU1fR0VOX0EKKyN1bmRlZglTWU1fR0VOX0IKKyN1bmRlZglTWU1fR0VOX1oKKworLyoKKyAqICBMZXQgY2Mga25vdyBhYm91dCB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxlciBkYXRhIHN0cnVjdHVyZS4KKyAqICBXZSBuZWVkIHRoaXMgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMganVzdCBiZWxvdy4KKyAqLworc3RydWN0IHN5bV9oY2I7CisKKy8qCisgKiAgR2VuZXJpYyBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIGEgZmlybXdhcmUuCisgKi8gCitzdHJ1Y3Qgc3ltX2Z3IHsKKwljaGFyCSpuYW1lOwkJLyogTmFtZSB3ZSB3YW50IHRvIHByaW50IG91dAkqLworCXUzMgkqYV9iYXNlOwkvKiBQb2ludGVyIHRvIHNjcmlwdCBBIHRlbXBsYXRlCSovCisJaW50CWFfc2l6ZTsJCS8qIFNpemUgb2Ygc2NyaXB0IEEJCSovCisJc3RydWN0CXN5bV9md2Ffb2ZzCisJCSphX29mczsJCS8qIFVzZWZ1bCBvZmZzZXRzIGluIHNjcmlwdCBBCSovCisJdTMyCSpiX2Jhc2U7CS8qIFBvaW50ZXIgdG8gc2NyaXB0IEIgdGVtcGxhdGUJKi8KKwlpbnQJYl9zaXplOwkJLyogU2l6ZSBvZiBzY3JpcHQgQgkJKi8KKwlzdHJ1Y3QJc3ltX2Z3Yl9vZnMKKwkJKmJfb2ZzOwkJLyogVXNlZnVsIG9mZnNldHMgaW4gc2NyaXB0IEIJKi8KKwl1MzIJKnpfYmFzZTsJLyogUG9pbnRlciB0byBzY3JpcHQgWiB0ZW1wbGF0ZQkqLworCWludAl6X3NpemU7CQkvKiBTaXplIG9mIHNjcmlwdCBaCQkqLworCXN0cnVjdAlzeW1fZnd6X29mcworCQkqel9vZnM7CQkvKiBVc2VmdWwgb2Zmc2V0cyBpbiBzY3JpcHQgWgkqLworCS8qIFNldHVwIGFuZCBwYXRjaCBtZXRob2RzIGZvciB0aGlzIGZpcm13YXJlICovCisJdm9pZAkoKnNldHVwKShzdHJ1Y3Qgc3ltX2hjYiAqLCBzdHJ1Y3Qgc3ltX2Z3ICopOworCXZvaWQJKCpwYXRjaCkoc3RydWN0IHN5bV9oY2IgKik7Cit9OworCisvKgorICogIE1hY3JvIHVzZWQgdG8gZGVjbGFyZSBhIGZpcm13YXJlLgorICovCisjZGVmaW5lIFNZTV9GV19FTlRSWShmdywgbmFtZSkJCQkJCVwKK3sJCQkJCQkJCVwKKwluYW1lLAkJCQkJCQlcCisJKHUzMiAqKSAmZncjI2Ffc2NyLCBzaXplb2YoZncjI2Ffc2NyKSwgJmZ3IyNhX29mcywJXAorCSh1MzIgKikgJmZ3IyNiX3Njciwgc2l6ZW9mKGZ3IyNiX3NjciksICZmdyMjYl9vZnMsCVwKKwkodTMyICopICZmdyMjel9zY3IsIHNpemVvZihmdyMjel9zY3IpLCAmZncjI3pfb2ZzLAlcCisJZncjI19zZXR1cCwgZncjI19wYXRjaAkJCQkJXAorfQorCisvKgorICogIE1hY3JvcyB1c2VkIGZyb20gdGhlIEMgY29kZSB0byBnZXQgdXNlZnVsCisgKiAgU0NSSVBUUyBidXMgYWRkcmVzc2VzLgorICovCisjZGVmaW5lIFNDUklQVEFfQkEobnAsIGxhYmVsKQkobnAtPmZ3YV9iYXMubGFiZWwpCisjZGVmaW5lIFNDUklQVEJfQkEobnAsIGxhYmVsKQkobnAtPmZ3Yl9iYXMubGFiZWwpCisjZGVmaW5lIFNDUklQVFpfQkEobnAsIGxhYmVsKQkobnAtPmZ3el9iYXMubGFiZWwpCisKKy8qCisgKiAgTWFjcm9zIHVzZWQgYnkgc2NyaXB0cyBkZWZpbml0aW9ucy4KKyAqCisgKiAgSEFERFJfMSBnZW5lcmF0ZXMgYSByZWZlcmVuY2UgdG8gYSBmaWVsZCBvZiB0aGUgY29udHJvbGxlciBkYXRhLgorICogIEhBRERSXzIgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGEgZmllbGQgb2YgdGhlIGNvbnRyb2xsZXIgZGF0YQorICogICAgICAgICAgd2l0aCBvZmZzZXQuCisgKiAgUkFERFJfMSBnZW5lcmF0ZXMgYSByZWZlcmVuY2UgdG8gYSBzY3JpcHQgcHJvY2Vzc29yIHJlZ2lzdGVyLgorICogIFJBRERSXzIgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGEgc2NyaXB0IHByb2Nlc3NvciByZWdpc3RlcgorICogICAgICAgICAgd2l0aCBvZmZzZXQuCisgKiAgUEFERFJfQSBnZW5lcmF0ZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBwYXJ0IG9mIHNjcmlwdCBBLgorICogIFBBRERSX0IgZ2VuZXJhdGVzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgcGFydCBvZiBzY3JpcHQgQi4KKyAqCisgKiAgU1lNX0dFTl9QQUREUl9BIGFuZCBTWU1fR0VOX1BBRERSX0IgYXJlIHVzZWQgdG8gZGVmaW5lIHJlc3BlY3RpdmVseSAKKyAqICB0aGUgUEFERFJfQSBhbmQgUEFERFJfQiBtYWNyb3MgZm9yIGVhY2ggZmlybXdhcmUgYnkgc2V0dGluZyBhcmd1bWVudCAKKyAqICBgcycgdG8gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0dXJlLgorICoKKyAqICBTQ1JfREFUQV9aRVJPIGlzIHVzZWQgdG8gYWxsb2NhdGUgYSBEV09SRCBvZiBkYXRhIGluIHNjcmlwdHMgYXJlYXMuCisgKi8KKworI2RlZmluZQlSRUxPQ19TT0ZUQwkweDQwMDAwMDAwCisjZGVmaW5lCVJFTE9DX0xBQkVMX0EJMHg1MDAwMDAwMAorI2RlZmluZQlSRUxPQ19SRUdJU1RFUgkweDYwMDAwMDAwCisjZGVmaW5lCVJFTE9DX0xBQkVMX0IJMHg4MDAwMDAwMAorI2RlZmluZQlSRUxPQ19NQVNLCTB4ZjAwMDAwMDAKKworI2RlZmluZQlIQUREUl8xKGxhYmVsKQkgICAoUkVMT0NfU09GVEMgICAgfCBvZmZzZXRvZihzdHJ1Y3Qgc3ltX2hjYiwgbGFiZWwpKQorI2RlZmluZQlIQUREUl8yKGxhYmVsLG9mcykgKFJFTE9DX1NPRlRDICAgIHwgXAorCQkJCShvZmZzZXRvZihzdHJ1Y3Qgc3ltX2hjYiwgbGFiZWwpKyhvZnMpKSkKKyNkZWZpbmUJUkFERFJfMShsYWJlbCkJICAgKFJFTE9DX1JFR0lTVEVSIHwgUkVHKGxhYmVsKSkKKyNkZWZpbmUJUkFERFJfMihsYWJlbCxvZnMpIChSRUxPQ19SRUdJU1RFUiB8ICgoUkVHKGxhYmVsKSkrKG9mcykpKQorCisjZGVmaW5lIFNZTV9HRU5fUEFERFJfQShzLCBsYWJlbCkgKFJFTE9DX0xBQkVMX0EgIHwgb2Zmc2V0b2YocywgbGFiZWwpKQorI2RlZmluZSBTWU1fR0VOX1BBRERSX0IocywgbGFiZWwpIChSRUxPQ19MQUJFTF9CICB8IG9mZnNldG9mKHMsIGxhYmVsKSkKKworI2RlZmluZSBTQ1JfREFUQV9aRVJPCTB4ZjAwZmYwMGYKKworI2VuZGlmCS8qIFNZTV9GV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3MS5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ5MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdzEuaApAQCAtMCwwICsxLDE4MzggQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyoKKyAqICBTY3JpcHRzIGZvciBTWU1CSU9TLVByb2Nlc3NvcgorICoKKyAqICBXZSBoYXZlIHRvIGtub3cgdGhlIG9mZnNldHMgb2YgYWxsIGxhYmVscyBiZWZvcmUgd2UgcmVhY2ggCisgKiAgdGhlbSAoZm9yIGZvcndhcmQganVtcHMpLiBUaGVyZWZvcmUgd2UgZGVjbGFyZSBhIHN0cnVjdCAKKyAqICBoZXJlLiBJZiB5b3UgbWFrZSBjaGFuZ2VzIGluc2lkZSB0aGUgc2NyaXB0LAorICoKKyAqICBET05UIEZPUkdFVCBUTyBDSEFOR0UgVEhFIExFTkdUSFMgSEVSRSEKKyAqLworCisvKgorICogIFNjcmlwdCBmcmFnbWVudHMgd2hpY2ggYXJlIGxvYWRlZCBpbnRvIHRoZSBvbi1jaGlwIFJBTSAKKyAqICBvZiA4MjVBLCA4NzUsIDg3NiwgODk1LCA4OTVBLCA4OTYgYW5kIDEwMTAgY2hpcHMuCisgKiAgTXVzdCBub3QgZXhjZWVkIDRLIGJ5dGVzLgorICovCitzdHJ1Y3QgU1lNX0ZXQV9TQ1IgeworCXUzMiBzdGFydAkJWyAxMV07CisJdTMyIGdldGpvYl9iZWdpbglbICA0XTsKKwl1MzIgX3Ntc19hMTAJCVsgIDVdOworCXUzMiBnZXRqb2JfZW5kCQlbICA0XTsKKwl1MzIgX3Ntc19hMjAJCVsgIDRdOworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwl1MzIgc2VsZWN0CQlbICA4XTsKKyNlbHNlCisJdTMyIHNlbGVjdAkJWyAgNl07CisjZW5kaWYKKwl1MzIgX3Ntc19hMzAJCVsgIDVdOworCXUzMiB3Zl9zZWxfZG9uZQkJWyAgMl07CisJdTMyIHNlbmRfaWRlbnQJCVsgIDJdOworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCXUzMiBzZWxlY3QyCQlbICA4XTsKKyNlbHNlCisJdTMyIHNlbGVjdDIJCVsgIDJdOworI2VuZGlmCisJdTMyIGNvbW1hbmQJCVsgIDJdOworCXUzMiBkaXNwYXRjaAkJWyAyOF07CisJdTMyIHNlbF9ub19jbWQJCVsgMTBdOworCXUzMiBpbml0CQlbICA2XTsKKwl1MzIgY2xyYWNrCQlbICA0XTsKKwl1MzIgZGF0YWlfZG9uZQkJWyAxMV07CisJdTMyIGRhdGFpX2RvbmVfd3NyCVsgMjBdOworCXUzMiBkYXRhb19kb25lCQlbIDExXTsKKwl1MzIgZGF0YW9fZG9uZV93c3MJWyAgNl07CisJdTMyIGRhdGFpX3BoYXNlCQlbICA1XTsKKwl1MzIgZGF0YW9fcGhhc2UJCVsgIDVdOworCXUzMiBtc2dfaW4JCVsgIDJdOworCXUzMiBtc2dfaW4yCQlbIDEwXTsKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwl1MzIgc3RhdHVzCQlbIDE0XTsKKyNlbHNlCisJdTMyIHN0YXR1cwkJWyAxMF07CisjZW5kaWYKKwl1MzIgY29tcGxldGUJCVsgIDZdOworCXUzMiBjb21wbGV0ZTIJCVsgIDhdOworCXUzMiBfc21zX2E0MAkJWyAxMl07CisJdTMyIGRvbmUJCVsgIDVdOworCXUzMiBfc21zX2E1MAkJWyAgNV07CisJdTMyIF9zbXNfYTYwCQlbICAyXTsKKwl1MzIgZG9uZV9lbmQJCVsgIDRdOworCXUzMiBjb21wbGV0ZV9lcnJvcglbICA1XTsKKwl1MzIgc2F2ZV9kcAkJWyAxMV07CisJdTMyIHJlc3RvcmVfZHAJCVsgIDddOworCXUzMiBkaXNjb25uZWN0CQlbIDExXTsKKwl1MzIgZGlzY29ubmVjdDIJCVsgIDVdOworCXUzMiBfc21zX2E2NQkJWyAgM107CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIGlkbGUJCVsgIDRdOworI2Vsc2UKKwl1MzIgaWRsZQkJWyAgMl07CisjZW5kaWYKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwl1MzIgdW5nZXRqb2IJCVsgIDddOworI2Vsc2UKKwl1MzIgdW5nZXRqb2IJCVsgIDVdOworI2VuZGlmCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCXUzMiByZXNlbGVjdAkJWyAgNF07CisjZWxzZQorCXUzMiByZXNlbGVjdAkJWyAgMl07CisjZW5kaWYKKwl1MzIgcmVzZWxlY3RlZAkJWyAxOV07CisJdTMyIF9zbXNfYTcwCQlbICA2XTsKKwl1MzIgX3Ntc19hODAJCVsgIDRdOworCXUzMiByZXNlbGVjdGVkMQkJWyAyNV07CisJdTMyIF9zbXNfYTkwCQlbICA0XTsKKwl1MzIgcmVzZWxfbHVuMAkJWyAgN107CisJdTMyIF9zbXNfYTEwMAkJWyAgNF07CisJdTMyIHJlc2VsX3RhZwkJWyAgOF07CisjaWYgICBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gNTEyCisJdTMyIF9zbXNfYTExMAkJWyAyM107CisjZWxpZiBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gMjU2CisJdTMyIF9zbXNfYTExMAkJWyAxN107CisjZWxzZQorCXUzMiBfc21zX2ExMTAJCVsgMTNdOworI2VuZGlmCisJdTMyIF9zbXNfYTEyMAkJWyAgMl07CisJdTMyIHJlc2VsX2dvCQlbICA0XTsKKwl1MzIgX3Ntc19hMTMwCQlbICA3XTsKKwl1MzIgcmVzZWxfZHNhCQlbICAyXTsKKwl1MzIgcmVzZWxfZHNhMQkJWyAgNF07CisJdTMyIF9zbXNfYTE0MAkJWyAgN107CisJdTMyIHJlc2VsX25vX3RhZwlbICA0XTsKKwl1MzIgX3Ntc19hMTQ1CQlbICA3XTsKKwl1MzIgZGF0YV9pbgkJW1NZTV9DT05GX01BWF9TRyAqIDJdOworCXUzMiBkYXRhX2luMgkJWyAgNF07CisJdTMyIGRhdGFfb3V0CQlbU1lNX0NPTkZfTUFYX1NHICogMl07CisJdTMyIGRhdGFfb3V0MgkJWyAgNF07CisJdTMyIHBtMF9kYXRhCQlbIDEyXTsKKwl1MzIgcG0wX2RhdGFfb3V0CVsgIDZdOworCXUzMiBwbTBfZGF0YV9lbmQJWyAgN107CisJdTMyIHBtX2RhdGFfZW5kCQlbICA0XTsKKwl1MzIgX3Ntc19hMTUwCQlbICA0XTsKKwl1MzIgcG0xX2RhdGEJCVsgMTJdOworCXUzMiBwbTFfZGF0YV9vdXQJWyAgNl07CisJdTMyIHBtMV9kYXRhX2VuZAlbICA5XTsKK307CisKKy8qCisgKiAgU2NyaXB0IGZyYWdtZW50cyB3aGljaCBzdGF5IGluIG1haW4gbWVtb3J5IGZvciBhbGwgY2hpcHMgCisgKiAgZXhjZXB0IGZvciBjaGlwcyB0aGF0IHN1cHBvcnQgOEsgb24tY2hpcCBSQU0uCisgKi8KK3N0cnVjdCBTWU1fRldCX1NDUiB7CisJdTMyIG5vX2RhdGEJCVsgIDJdOworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwl1MzIgc2VsX2Zvcl9hYm9ydAlbIDE4XTsKKyNlbHNlCisJdTMyIHNlbF9mb3JfYWJvcnQJWyAxNl07CisjZW5kaWYKKwl1MzIgc2VsX2Zvcl9hYm9ydF8xCVsgIDJdOworCXUzMiBtc2dfaW5fZXRjCQlbIDEyXTsKKwl1MzIgbXNnX3JlY2VpdmVkCVsgIDVdOworCXUzMiBtc2dfd2VpcmRfc2VlbglbICA1XTsKKwl1MzIgbXNnX2V4dGVuZGVkCVsgMTddOworCXUzMiBfc21zX2IxMAkJWyAgNF07CisJdTMyIG1zZ19iYWQJCVsgIDZdOworCXUzMiBtc2dfd2VpcmQJCVsgIDRdOworCXUzMiBtc2dfd2VpcmQxCQlbICA4XTsKKwl1MzIgd2R0cl9yZXNwCQlbICA2XTsKKwl1MzIgc2VuZF93ZHRyCQlbICA0XTsKKwl1MzIgc2R0cl9yZXNwCQlbICA2XTsKKwl1MzIgc2VuZF9zZHRyCQlbICA0XTsKKwl1MzIgcHByX3Jlc3AJCVsgIDZdOworCXUzMiBzZW5kX3BwcgkJWyAgNF07CisJdTMyIG5lZ29fYmFkX3BoYXNlCVsgIDRdOworCXUzMiBtc2dfb3V0CQlbICA0XTsKKwl1MzIgbXNnX291dF9kb25lCVsgIDRdOworCXUzMiBkYXRhX292cnVuCQlbICAzXTsKKwl1MzIgZGF0YV9vdnJ1bjEJCVsgMjJdOworCXUzMiBkYXRhX292cnVuMgkJWyAgOF07CisJdTMyIGFib3J0X3Jlc2VsCQlbIDE2XTsKKwl1MzIgcmVzZW5kX2lkZW50CVsgIDRdOworCXUzMiBpZGVudF9icmVhawkJWyAgNF07CisJdTMyIGlkZW50X2JyZWFrX2F0bglbICA0XTsKKwl1MzIgc2RhdGFfaW4JCVsgIDZdOworCXUzMiByZXNlbF9iYWRfbHVuCVsgIDRdOworCXUzMiBiYWRfaV90X2wJCVsgIDRdOworCXUzMiBiYWRfaV90X2xfcQkJWyAgNF07CisJdTMyIGJhZF9zdGF0dXMJCVsgIDddOworCXUzMiB3c3JfbWFfaGVscGVyCVsgIDRdOworCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwkvKiBVbmtub3duIGRpcmVjdGlvbiBoYW5kbGluZyAqLworCXUzMiBkYXRhX2lvCQlbICAyXTsKKwl1MzIgZGF0YV9pb19jb20JCVsgIDhdOworCXUzMiBkYXRhX2lvX291dAkJWyAgN107CisjZW5kaWYKKwkvKiBEYXRhIGFyZWEgKi8KKwl1MzIgemVybwkJWyAgMV07CisJdTMyIHNjcmF0Y2gJCVsgIDFdOworCXUzMiBzY3JhdGNoMQkJWyAgMV07CisJdTMyIHByZXZfZG9uZQkJWyAgMV07CisJdTMyIGRvbmVfcG9zCQlbICAxXTsKKwl1MzIgbmV4dGpvYgkJWyAgMV07CisJdTMyIHN0YXJ0cG9zCQlbICAxXTsKKwl1MzIgdGFyZ3RibAkJWyAgMV07Cit9OworCisvKgorICogIFNjcmlwdCBmcmFnbWVudHMgdXNlZCBhdCBpbml0aWFsaXNhdGlvbnMuCisgKiAgT25seSBydW5zIG91dCBvZiBtYWluIG1lbW9yeS4KKyAqLworc3RydWN0IFNZTV9GV1pfU0NSIHsKKwl1MzIgc25vb3B0ZXN0CQlbICA5XTsKKwl1MzIgc25vb3BlbmQJCVsgIDJdOworfTsKKworc3RhdGljIHN0cnVjdCBTWU1fRldBX1NDUiBTWU1fRldBX1NDUiA9IHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNUQVJUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8geworCS8qCisJICogIFN3aXRjaCB0aGUgTEVEIG9uLgorCSAqICBXaWxsIGJlIHBhdGNoZWQgd2l0aCBhIE5PX09QIGlmIExFRAorCSAqICBub3QgbmVlZGVkIG9yIG5vdCBkZXNpcmVkLgorCSAqLworCVNDUl9SRUdfUkVHIChncHJlZywgU0NSX0FORCwgMHhmZSksCisJCTAsCisJLyoKKwkgKiAgICAgIENsZWFyIFNJR1AuCisJICovCisJU0NSX0ZST01fUkVHIChjdGVzdDIpLAorCQkwLAorCS8qCisJICogIFN0b3AgaGVyZSBpZiB0aGUgQyBjb2RlIHdhbnRzIHRvIHBlcmZvcm0gCisJICogIHNvbWUgZXJyb3IgcmVjb3ZlcnkgcHJvY2VkdXJlIG1hbnVhbGx5LgorCSAqICAoSW5kaWNhdGUgdGhpcyBieSBzZXR0aW5nIFNFTSBpbiBJU1RBVCkKKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKGlzdGF0KSwKKwkJMCwKKwkvKgorCSAqICBSZXBvcnQgdG8gdGhlIEMgY29kZSB0aGUgbmV4dCBwb3NpdGlvbiBpbiAKKwkgKiAgdGhlIHN0YXJ0IHF1ZXVlIHRoZSBTQ1JJUFRTIHdpbGwgc2NoZWR1bGUuCisJICogIFRoZSBDIGNvZGUgbXVzdCBub3QgY2hhbmdlIFNDUkFUQ0hBLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJU0NSX0lOVCBeIElGVFJVRSAoTUFTSyAoU0VNLCBTRU0pKSwKKwkJU0lSX1NDUklQVF9TVE9QUEVELAorCS8qCisJICogIFN0YXJ0IHRoZSBuZXh0IGpvYi4KKwkgKgorCSAqICBARFNBICAgICA9IHN0YXJ0IHBvaW50IGZvciB0aGlzIGpvYi4KKwkgKiAgU0NSQVRDSEEgPSBhZGRyZXNzIG9mIHRoaXMgam9iIGluIHRoZSBzdGFydCBxdWV1ZS4KKwkgKgorCSAqICBXZSB3aWxsIHJlc3RvcmUgc3RhcnRwb3Mgd2l0aCBTQ1JBVENIQSBpZiB3ZSBmYWlscyB0aGUgCisJICogIGFyYml0cmF0aW9uIG9yIGlmIGl0IGlzIHRoZSBpZGxlIGpvYi4KKwkgKgorCSAqICBUaGUgYmVsb3cgR0VUSk9CX0JFR0lOIHRvIEdFVEpPQl9FTkQgc2VjdGlvbiBvZiBTQ1JJUFRTIAorCSAqICBpcyBhIGNyaXRpY2FsIHBhdGguIElmIGl0IGlzIHBhcnRpYWxseSBleGVjdXRlZCwgaXQgdGhlbiAKKwkgKiAgbWF5IGhhcHBlbiB0aGF0IHRoZSBqb2IgYWRkcmVzcyBpcyBub3QgeWV0IGluIHRoZSBEU0EgCisJICogIGFuZCB0aGUgbmV4dCBxdWV1ZSBwb3NpdGlvbiBwb2ludHMgdG8gdGhlIG5leHQgSk9CLgorCSAqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgR0VUSk9CX0JFR0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ29weSB0byBhIGZpeGVkIGxvY2F0aW9uIGJvdGggdGhlIG5leHQgU1RBUlRQT1MgCisJICogIGFuZCB0aGUgY3VycmVudCBKT0IgYWRkcmVzcywgdXNpbmcgc2VsZiBtb2RpZnlpbmcgCisJICogIFNDUklQVFMuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJCVBBRERSX0EgKF9zbXNfYTEwKSwKKwlTQ1JfQ09QWSAoOCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0ExMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUEFERFJfQiAobmV4dGpvYiksCisJLyoKKwkgKiAgTW92ZSB0aGUgc3RhcnQgYWRkcmVzcyB0byBURU1QIHVzaW5nIHNlbGYtCisJICogIG1vZGlmeWluZyBTQ1JJUFRTIGFuZCBqdW1wIGluZGlyZWN0bHkgdG8gCisJICogIHRoYXQgYWRkcmVzcy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVBBRERSX0IgKG5leHRqb2IpLAorCQlSQUREUl8xIChkc2EpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgR0VUSk9CX0VORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2EyMCksCisJU0NSX0NPUFkgKDQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMjAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVJBRERSXzEgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxFQ1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBEU0EJY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYSBzY2hlZHVsZWQKKwkgKiAgCWRhdGEgc3RydWN0dXJlLgorCSAqCisJICogIFNDUkFUQ0hBIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBxdWV1ZSAgCisJICogIAllbnRyeSB3aGljaCBwb2ludHMgdG8gdGhlIG5leHQgam9iLgorCSAqCisJICogIFNldCBJbml0aWF0b3IgbW9kZS4KKwkgKgorCSAqICAoVGFyZ2V0IG1vZGUgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlcikKKwkgKi8KKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJU0NSX0NMUiAoU0NSX1RSRyksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICAgICAgQW5kIHRyeSB0byBzZWxlY3QgdGhpcyB0YXJnZXQuCisJICovCisJU0NSX1NFTF9UQkxfQVROIF4gb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBzZWxlY3QpLAorCQlQQUREUl9BICh1bmdldGpvYiksCisJLyoKKwkgKiAgTm93IHRoZXJlIGFyZSA0IHBvc3NpYmlsaXRpZXM6CisJICoKKwkgKiAgKDEpIFRoZSBjaGlwIGxvc2VzIGFyYml0cmF0aW9uLgorCSAqICBUaGlzIGlzIG9rLCBiZWNhdXNlIGl0IHdpbGwgdHJ5IGFnYWluLAorCSAqICB3aGVuIHRoZSBidXMgYmVjb21lcyBpZGxlLgorCSAqICAoQnV0IGJld2FyZSBvZiB0aGUgdGltZW91dCBmdW5jdGlvbiEpCisJICoKKwkgKiAgKDIpIFRoZSBjaGlwIGlzIHJlc2VsZWN0ZWQuCisJICogIFRoZW4gdGhlIHNjcmlwdCBwcm9jZXNzb3IgdGFrZXMgdGhlIGp1bXAKKwkgKiAgdG8gdGhlIFJFU0VMRUNUIGxhYmVsLgorCSAqCisJICogICgzKSBUaGUgY2hpcCB3aW5zIGFyYml0cmF0aW9uLgorCSAqICBUaGVuIGl0IHdpbGwgZXhlY3V0ZSBTQ1JJUFRTIGluc3RydWN0aW9uIHVudGlsIAorCSAqICB0aGUgbmV4dCBpbnN0cnVjdGlvbiB0aGF0IGNoZWNrcyBTQ1NJIHBoYXNlLgorCSAqICBUaGVuIHdpbGwgc3RvcCBhbmQgd2FpdCBmb3Igc2VsZWN0aW9uIHRvIGJlIAorCSAqICBjb21wbGV0ZSBvciBzZWxlY3Rpb24gdGltZS1vdXQgdG8gb2NjdXIuCisJICoKKwkgKiAgQWZ0ZXIgaGF2aW5nIHdvbiBhcmJpdHJhdGlvbiwgdGhlIFNDUklQVFMgIAorCSAqICBwcm9jZXNzb3IgaXMgYWJsZSB0byBleGVjdXRlIGluc3RydWN0aW9ucyB3aGlsZSAKKwkgKiAgdGhlIFNDU0kgY29yZSBpcyBwZXJmb3JtaW5nIFNDU0kgc2VsZWN0aW9uLgorCSAqLworCisJLyoKKwkgKiAgQ29weSB0aGUgQ0NCIGhlYWRlciB0byBhIGZpeGVkIGxvY2F0aW9uIAorCSAqICBpbiB0aGUgSENCIHVzaW5nIHNlbGYtbW9kaWZ5aW5nIFNDUklQVFMuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2EzMCksCisJU0NSX0NPUFkgKHNpemVvZihzdHJ1Y3Qgc3ltX2NjYmgpKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTMwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlIQUREUl8xIChjY2JfaGVhZCksCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVyCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChjY2JfaGVhZC5zdGF0dXMpLAorCQlSQUREUl8xIChzY3IwKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFdGX1NFTF9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlTSVJfU0VMX0FUTl9OT19NU0dfT1VULAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VORF9JREVOVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2VsZWN0aW9uIGNvbXBsZXRlLgorCSAqICBTZW5kIHRoZSBJREVOVElGWSBhbmQgcG9zc2libHkgdGhlIFRBRyBtZXNzYWdlIAorCSAqICBhbmQgbmVnb3RpYXRpb24gbWVzc2FnZSBpZiBwcmVzZW50LgorCSAqLworCVNDUl9NT1ZFX1RCTCBeIFNDUl9NU0dfT1VULAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIHNtc2cpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMRUNUMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgU2V0IElNTUVESUFURSBBUkJJVFJBVElPTiBpZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gCisJICogIGEgaGludCB0byBkbyBzby4gKFNvbWUgam9iIHRvIGRvIGFmdGVyIHRoaXMgb25lKS4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKEhGX1JFRyksCisJCTAsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoTUFTSyAoSEZfSElOVF9JQVJCLCBIRl9ISU5UX0lBUkIpKSwKKwkJOCwKKwlTQ1JfUkVHX1JFRyAoc2NudGwxLCBTQ1JfT1IsIElBUkIpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgQW50aWNpcGF0ZSB0aGUgQ09NTUFORCBwaGFzZS4KKwkgKiAgVGhpcyBpcyB0aGUgUEhBU0Ugd2UgZXhwZWN0IGF0IHRoaXMgcG9pbnQuCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfQ09NTUFORCkpLAorCQlQQUREUl9BIChzZWxfbm9fY21kKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENPTU1BTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIC4uLiBhbmQgc2VuZCB0aGUgY29tbWFuZAorCSAqLworCVNDUl9NT1ZFX1RCTCBeIFNDUl9DT01NQU5ELAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIGNtZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBESVNQQVRDSCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBNU0dfSU4gaXMgdGhlIG9ubHkgcGhhc2UgdGhhdCBzaGFsbCBiZSAKKwkgKiAgZW50ZXJlZCBhdCBsZWFzdCBvbmNlIGZvciBlYWNoIChyZSlzZWxlY3Rpb24uCisJICogIFNvIHdlIHRlc3QgaXQgZmlyc3QuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAobXNnX2luKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9EQVRBX09VVCkpLAorCQlQQUREUl9BIChkYXRhb19waGFzZSksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfREFUQV9JTikpLAorCQlQQUREUl9BIChkYXRhaV9waGFzZSksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfU1RBVFVTKSksCisJCVBBRERSX0EgKHN0YXR1cyksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfQ09NTUFORCkpLAorCQlQQUREUl9BIChjb21tYW5kKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoSUYgKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG1zZ19vdXQpLAorCS8qCisJICogIERpc2NhcmQgYXMgbWFueSBpbGxlZ2FsIHBoYXNlcyBhcyAKKwkgKiAgcmVxdWlyZWQgYW5kIHRlbGwgdGhlIEMgY29kZSBhYm91dC4KKwkgKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfSUxHX09VVCkpLAorCQkxNiwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX0lMR19PVVQsCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCVNDUl9KVU1QUiBeIElGVFJVRSAoV0hFTiAoU0NSX0lMR19PVVQpKSwKKwkJLTE2LAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9JTEdfSU4pKSwKKwkJMTYsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9JTEdfSU4sCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCVNDUl9KVU1QUiBeIElGVFJVRSAoV0hFTiAoU0NSX0lMR19JTikpLAorCQktMTYsCisJU0NSX0lOVCwKKwkJU0lSX0JBRF9QSEFTRSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMX05PX0NNRCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGhlIHRhcmdldCBkb2VzIG5vdCBzd2l0Y2ggdG8gY29tbWFuZCAKKwkgKiAgcGhhc2UgYWZ0ZXIgSURFTlRJRlkgaGFzIGJlZW4gc2VudC4KKwkgKgorCSAqICBJZiBpdCBzdGF5cyBpbiBNU0cgT1VUIHBoYXNlIHNlbmQgaXQgCisJICogIHRoZSBJREVOVElGWSBhZ2Fpbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJfQiAocmVzZW5kX2lkZW50KSwKKwkvKgorCSAqICBJZiB0YXJnZXQgZG9lcyBub3Qgc3dpdGNoIHRvIE1TRyBJTiBwaGFzZSAKKwkgKiAgYW5kIHdlIHNlbnQgYSBuZWdvdGlhdGlvbiwgYXNzZXJ0IHRoZSAKKwkgKiAgZmFpbHVyZSBpbW1lZGlhdGVseS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUl9BIChkaXNwYXRjaCksCisJU0NSX0ZST01fUkVHIChIU19SRUcpLAorCQkwLAorCVNDUl9JTlQgXiBJRlRSVUUgKERBVEEgKEhTX05FR09USUFURSkpLAorCQlTSVJfTkVHT19GQUlMRUQsCisJLyoKKwkgKiAgSnVtcCB0byBkaXNwYXRjaGVyLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBJTklUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgU0NTSSBSRVNFVCBzaWduYWwgdG8gYmUgCisJICogIGluYWN0aXZlIGJlZm9yZSByZXN0YXJ0aW5nIG9wZXJhdGlvbnMsIAorCSAqICBzaW5jZSB0aGUgY2hpcCBtYXkgaGFuZyBvbiBTRUxfQVROIAorCSAqICBpZiBTQ1NJIFJFU0VUIGlzIGFjdGl2ZS4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNzdGF0MCksCisJCTAsCisJU0NSX0pVTVBSIF4gSUZUUlVFIChNQVNLIChJUlNULCBJUlNUKSksCisJCS0xNiwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ0xSQUNLID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGVybWluYXRlIHBvc3NpYmxlIHBlbmRpbmcgbWVzc2FnZSBwaGFzZS4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQUlfRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2F2ZSBjdXJyZW50IHBvaW50ZXIgdG8gTEFTVFAuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xICh0ZW1wKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCS8qCisJICogIElmIHRoZSBTV0lERSBpcyBub3QgZnVsbCwganVtcCB0byBkaXNwYXRjaGVyLgorCSAqICBXZSBhbnRpY2lwYXRlIGEgU1RBVFVTIHBoYXNlLgorCSAqLworCVNDUl9GUk9NX1JFRyAoc2NudGwyKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoV1NSLCBXU1IpKSwKKwkJUEFERFJfQSAoZGF0YWlfZG9uZV93c3IpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfU1RBVFVTKSksCisJCVBBRERSX0EgKHN0YXR1cyksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFJX0RPTkVfV1NSID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSBTV0lERSBpcyBmdWxsLgorCSAqICBDbGVhciB0aGlzIGNvbmRpdGlvbi4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfT1IsIFdTUiksCisJCTAsCisJLyoKKwkgKiAgV2UgYXJlIGV4cGVjdGluZyBhbiBJR05PUkUgUkVTSURVRSBtZXNzYWdlIAorCSAqICBmcm9tIHRoZSBkZXZpY2UsIG90aGVyd2lzZSB3ZSBhcmUgaW4gZGF0YSAKKwkgKiAgb3ZlcnJ1biBjb25kaXRpb24uIENoZWNrIGFnYWluc3QgTVNHX0lOIHBoYXNlLgorCSAqLworCVNDUl9JTlQgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVNJUl9TV0lERV9PVkVSUlVOLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUl9BIChkaXNwYXRjaCksCisJLyoKKwkgKiAgV2UgYXJlIGluIE1TR19JTiBwaGFzZSwKKwkgKiAgUmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZS4KKwkgKiAgSWYgaXQgaXMgbm90IGFuIElHTk9SRSBSRVNJRFVFIG1lc3NhZ2UsCisJICogIHNpZ25hbCBvdmVycnVuIGFuZCBqdW1wIHRvIG1lc3NhZ2UgCisJICogIHByb2Nlc3NpbmcuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzBdKSwKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoREFUQSAoTV9JR05fUkVTSURVRSkpLAorCQlTSVJfU1dJREVfT1ZFUlJVTiwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKERBVEEgKE1fSUdOX1JFU0lEVUUpKSwKKwkJUEFERFJfQSAobXNnX2luMiksCisJLyoKKwkgKiAgV2UgZ290IHRoZSBtZXNzYWdlIHdlIGV4cGVjdGVkLgorCSAqICBSZWFkIHRoZSAybmQgYnl0ZSwgYW5kIGp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMV0pLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBT19ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTYXZlIGN1cnJlbnQgcG9pbnRlciB0byBMQVNUUC4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKHRlbXApLAorCQlIQUREUl8xIChjY2JfaGVhZC5sYXN0cCksCisJLyoKKwkgKiAgSWYgdGhlIFNPREwgaXMgbm90IGZ1bGwganVtcCB0byBkaXNwYXRjaGVyLgorCSAqICBXZSBhbnRpY2lwYXRlIGEgU1RBVFVTIHBoYXNlLgorCSAqLworCVNDUl9GUk9NX1JFRyAoc2NudGwyKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoV1NTLCBXU1MpKSwKKwkJUEFERFJfQSAoZGF0YW9fZG9uZV93c3MpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfU1RBVFVTKSksCisJCVBBRERSX0EgKHN0YXR1cyksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFPX0RPTkVfV1NTID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSBTT0RMIGlzIGZ1bGwsIGNsZWFyIHRoaXMgY29uZGl0aW9uLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9PUiwgV1NTKSwKKwkJMCwKKwkvKgorCSAqICBBbmQgc2lnbmFsIGEgREFUQSBVTkRFUlJVTiBjb25kaXRpb24gCisJICogIHRvIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1NPRExfVU5ERVJSVU4sCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFJX1BIQVNFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEp1bXAgdG8gY3VycmVudCBwb2ludGVyLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQU9fUEhBU0UgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgSnVtcCB0byBjdXJyZW50IHBvaW50ZXIuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChjY2JfaGVhZC5sYXN0cCksCisJCVJBRERSXzEgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBHZXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG1lc3NhZ2UuCisJICoKKwkgKiAgVGhlIHNjcmlwdCBwcm9jZXNzb3IgZG9lc24ndCBuZWdhdGUgdGhlCisJICogIEFDSyBzaWduYWwgYWZ0ZXIgdGhpcyB0cmFuc2Zlci4KKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMF0pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lOMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2hlY2sgZmlyc3QgYWdhaW5zdCAxIGJ5dGUgbWVzc2FnZXMgCisJICogIHRoYXQgd2UgaGFuZGxlIGZyb20gU0NSSVBUUy4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9DT01QTEVURSkpLAorCQlQQUREUl9BIChjb21wbGV0ZSksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fRElTQ09OTkVDVCkpLAorCQlQQUREUl9BIChkaXNjb25uZWN0KSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9TQVZFX0RQKSksCisJCVBBRERSX0EgKHNhdmVfZHApLAorCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX1JFU1RPUkVfRFApKSwKKwkJUEFERFJfQSAocmVzdG9yZV9kcCksCisJLyoKKwkgKiAgV2UgaGFuZGxlIGFsbCBvdGhlciBtZXNzYWdlcyBmcm9tIHRoZSAKKwkgKiAgQyBjb2RlLCBzbyBubyBuZWVkIHRvIHdhc3RlIG9uLWNoaXAgUkFNIAorCSAqICBmb3IgdGhvc2Ugb25lcy4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX2luX2V0YyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFUVVMgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBnZXQgdGhlIHN0YXR1cworCSAqLworCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfU1RBVFVTLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwkvKgorCSAqICBJZiBTVEFUVVMgaXMgbm90IEdPT0QsIGNsZWFyIElNTUVESUFURSBBUkJJVFJBVElPTiwgCisJICogIHNpbmNlIHdlIG1heSBoYXZlIHRvIHRhbXBlciB0aGUgc3RhcnQgcXVldWUgZnJvbSAKKwkgKiAgdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKERBVEEgKFNfR09PRCkpLAorCQk4LAorCVNDUl9SRUdfUkVHIChzY250bDEsIFNDUl9BTkQsIH5JQVJCKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIHNhdmUgc3RhdHVzIHRvIHNjc2lfc3RhdHVzLgorCSAqICBtYXJrIGFzIGNvbXBsZXRlLgorCSAqLworCVNDUl9UT19SRUcgKFNTX1JFRyksCisJCTAsCisJU0NSX0xPQURfUkVHIChIU19SRUcsIEhTX0NPTVBMRVRFKSwKKwkJMCwKKwkvKgorCSAqICBBbnRpY2lwYXRlIHRoZSBNRVNTQUdFIFBIQVNFIGZvciAKKwkgKiAgdGhlIFRBU0sgQ09NUExFVEUgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlQQUREUl9BIChtc2dfaW4pLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01QTEVURSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDb21wbGV0ZSBtZXNzYWdlLgorCSAqCisJICogIFdoZW4gd2UgdGVybWluYXRlIHRoZSBjeWNsZSBieSBjbGVhcmluZyBBQ0ssCisJICogIHRoZSB0YXJnZXQgbWF5IGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHkuCisJICoKKwkgKiAgV2UgZG9uJ3Qgd2FudCB0byBiZSB0b2xkIG9mIGFuICJ1bmV4cGVjdGVkIGRpc2Nvbm5lY3QiLAorCSAqICBzbyB3ZSBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwyLCBTQ1JfQU5ELCAweDdmKSwKKwkJMCwKKwkvKgorCSAqICBUZXJtaW5hdGUgY3ljbGUgLi4uCisJICovCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwkvKgorCSAqICAuLi4gYW5kIHdhaXQgZm9yIHRoZSBkaXNjb25uZWN0LgorCSAqLworCVNDUl9XQUlUX0RJU0MsCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01QTEVURTIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTYXZlIGhvc3Qgc3RhdHVzLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoc2NyMCksCisJCUhBRERSXzEgKGNjYl9oZWFkLnN0YXR1cyksCisJLyoKKwkgKiAgTW92ZSBiYWNrIHRoZSBDQ0IgaGVhZGVyIHVzaW5nIHNlbGYtbW9kaWZ5aW5nIAorCSAqICBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hNDApLAorCVNDUl9DT1BZIChzaXplb2Yoc3RydWN0IHN5bV9jY2JoKSksCisJCUhBRERSXzEgKGNjYl9oZWFkKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTQwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCS8qCisJICogIFNvbWUgYnJpZGdlcyBtYXkgcmVvcmRlciBETUEgd3JpdGVzIHRvIG1lbW9yeS4KKwkgKiAgV2UgZG9ubm90IHdhbnQgdGhlIENQVSB0byBkZWFsIHdpdGggY29tcGxldGlvbnMgIAorCSAqICB3aXRob3V0IGFsbCB0aGUgcG9zdGVkIHdyaXRlIGhhdmluZyBiZWVuIGZsdXNoZWQgCisJICogIHRvIG1lbW9yeS4gVGhpcyBEVU1NWSBSRUFEIHNob3VsZCBmbHVzaCBwb3N0ZWQgCisJICogIGJ1ZmZlcnMgcHJpb3IgdG8gdGhlIENQVSBoYXZpbmcgdG8gZGVhbCB3aXRoIAorCSAqICBjb21wbGV0aW9ucy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCQkJLyogRFVNTVkgUkVBRCAqLworCQlIQUREUl8xIChjY2JfaGVhZC5zdGF0dXMpLAorCQlSQUREUl8xIChzY3IwKSwKKwkvKgorCSAqICBJZiBjb21tYW5kIHJlc3VsdGVkIGluIG5vdCBHT09EIHN0YXR1cywKKwkgKiAgY2FsbCB0aGUgQyBjb2RlIGlmIG5lZWRlZC4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKFNTX1JFRyksCisJCTAsCisJU0NSX0NBTEwgXiBJRkZBTFNFIChEQVRBIChTX0dPT0QpKSwKKwkJUEFERFJfQiAoYmFkX3N0YXR1cyksCisJLyoKKwkgKiAgSWYgd2UgcGVyZm9ybWVkIGFuIGF1dG8tc2Vuc2UsIGNhbGwgCisJICogIHRoZSBDIGNvZGUgdG8gc3luY2hyb255emUgdGFzayBhYm9ydHMgCisJICogIHdpdGggVU5JVCBBVFRFTlRJT04gY29uZGl0aW9ucy4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKEhGX1JFRyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLICgwICwoSEZfU0VOU0V8SEZfRVhUX0VSUikpKSwKKwkJUEFERFJfQSAoY29tcGxldGVfZXJyb3IpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRE9ORSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ29weSB0aGUgRFNBIHRvIHRoZSBET05FIFFVRVVFIGFuZCAKKwkgKiAgc2lnbmFsIGNvbXBsZXRpb24gdG8gdGhlIGhvc3QuCisJICogIElmIHdlIGFyZSBpbnRlcnJ1cHRlZCBiZXR3ZWVuIERPTkUgCisJICogIGFuZCBET05FX0VORCwgd2UgbXVzdCByZXNldCwgb3RoZXJ3aXNlIAorCSAqICB0aGUgY29tcGxldGVkIENDQiBtYXkgYmUgbG9zdC4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVBBRERSX0IgKGRvbmVfcG9zKSwKKwkJUEFERFJfQSAoX3Ntc19hNTApLAorCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTUwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCVNDUl9DT1BZICg0KSwKKwkJUEFERFJfQiAoZG9uZV9wb3MpLAorCQlQQUREUl9BIChfc21zX2E2MCksCisJLyoKKwkgKiAgVGhlIGluc3RydWN0aW9uIGJlbG93IHJlYWRzIHRoZSBET05FIFFVRVVFIG5leHQgCisJICogIGZyZWUgcG9zaXRpb24gZnJvbSBtZW1vcnkuCisJICogIEluIGFkZGl0aW9uIGl0IGVuc3VyZXMgdGhhdCBhbGwgUENJIHBvc3RlZCB3cml0ZXMgIAorCSAqICBhcmUgZmx1c2hlZCBhbmQgc28gdGhlIERTQSB2YWx1ZSBvZiB0aGUgZG9uZSAKKwkgKiAgQ0NCIGlzIHZpc2libGUgYnkgdGhlIENQVSBiZWZvcmUgSU5URkxZIGlzIHJhaXNlZC4KKwkgKi8KKwlTQ1JfQ09QWSAoOCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0E2MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUEFERFJfQiAocHJldl9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlRfRkxZLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01QTEVURV9FUlJPUiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ09QWSAoNCksCisJCVBBRERSX0IgKHN0YXJ0cG9zKSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCVNDUl9JTlQsCisJCVNJUl9DT01QTEVURV9FUlJPUiwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNBVkVfRFAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIEFDSyBpbW1lZGlhdGVseS4KKwkgKiAgTm8gbmVlZCB0byBkZWxheSBpdC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIHJlY2VpdmVkIGEgU0FWRSBEUCwgc28gCisJICogIHdlIHdpbGwgc3dpdGNoIHRvIHRoZSBvdGhlciBQTSBjb250ZXh0IAorCSAqICBvbiB0aGUgbmV4dCBQTSBzaW5jZSB0aGUgRFAgbWF5IHBvaW50IAorCSAqICB0byB0aGUgY3VycmVudCBQTSBjb250ZXh0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfRFBfU0FWRUQpLAorCQkwLAorCS8qCisJICogIFNBVkVfRFAgbWVzc2FnZToKKwkgKiAgQ29weSBMQVNUUCB0byBTQVZFUC4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKGNjYl9oZWFkLmxhc3RwKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQuc2F2ZXApLAorCS8qCisJICogIEFudGljaXBhdGUgdGhlIE1FU1NBR0UgUEhBU0UgZm9yIAorCSAqICB0aGUgRElTQ09OTkVDVCBtZXNzYWdlLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKG1zZ19pbiksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU1RPUkVfRFAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIEFDSyBpbW1lZGlhdGVseS4KKwkgKiAgTm8gbmVlZCB0byBkZWxheSBpdC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBDb3B5IFNBVkVQIHRvIExBU1RQLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQuc2F2ZXApLAorCQlIQUREUl8xIChjY2JfaGVhZC5sYXN0cCksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERJU0NPTk5FQ1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIERJU0NPTk5FQ1RpbmcgIC4uLgorCSAqCisJICogIGRpc2FibGUgdGhlICJ1bmV4cGVjdGVkIGRpc2Nvbm5lY3QiIGZlYXR1cmUsCisJICogIGFuZCByZW1vdmUgdGhlIEFDSyBzaWduYWwuCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgZGlzY29ubmVjdC4KKwkgKi8KKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorCS8qCisJICogIFN0YXR1cyBpczogRElTQ09OTkVDVEVELgorCSAqLworCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19ESVNDT05ORUNUKSwKKwkJMCwKKwkvKgorCSAqICBTYXZlIGhvc3Qgc3RhdHVzLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoc2NyMCksCisJCUhBRERSXzEgKGNjYl9oZWFkLnN0YXR1cyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBESVNDT05ORUNUMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBNb3ZlIGJhY2sgdGhlIENDQiBoZWFkZXIgdXNpbmcgc2VsZi1tb2RpZnlpbmcgCisJICogIFNDUklQVFMuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2E2NSksCisJU0NSX0NPUFkgKHNpemVvZihzdHJ1Y3Qgc3ltX2NjYmgpKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BNjUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IElETEUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIE5vdGhpbmcgdG8gZG8/CisJICogIFN3aXRjaCB0aGUgTEVEIG9mZiBhbmQgd2FpdCBmb3IgcmVzZWxlY3QuCisJICogIFdpbGwgYmUgcGF0Y2hlZCB3aXRoIGEgTk9fT1AgaWYgTEVECisJICogIG5vdCBuZWVkZWQgb3Igbm90IGRlc2lyZWQuCisJICovCisJU0NSX1JFR19SRUcgKGdwcmVnLCBTQ1JfT1IsIDB4MDEpLAorCQkwLAorI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCVNDUl9KVU1QUiwKKwkJOCwKKyNlbmRpZgorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgVU5HRVRKT0IgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgU2V0IElNTUVESUFURSBBUkJJVFJBVElPTiwgZm9yIHRoZSBuZXh0IHRpbWUuCisJICogIFRoaXMgd2lsbCBnaXZlIHVzIGJldHRlciBjaGFuY2UgdG8gd2luIGFyYml0cmF0aW9uIAorCSAqICBmb3IgdGhlIGpvYiB3ZSBqdXN0IHdhbnRlZCB0byBkby4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGwxLCBTQ1JfT1IsIElBUkIpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgV2UgYXJlIG5vdCBhYmxlIHRvIHJlc3RhcnQgdGhlIFNDUklQVFMgaWYgd2UgYXJlIAorCSAqICBpbnRlcnJ1cHRlZCBhbmQgdGhlc2UgaW5zdHJ1Y3Rpb24gaGF2ZW4ndCBiZWVuIAorCSAqICBhbGwgZXhlY3V0ZWQuIEJUVywgdGhpcyBpcyB2ZXJ5IHVubGlrZWx5IHRvIAorCSAqICBoYXBwZW4sIGJ1dCB3ZSBjaGVjayB0aGF0IGZyb20gdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfTE9BRF9SRUcgKGRzYSwgMHhmZiksCisJCTAsCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJCVBBRERSX0IgKHN0YXJ0cG9zKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMRUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwkvKgorCSAqICBNYWtlIHN1cmUgd2UgYXJlIGluIGluaXRpYXRvciBtb2RlLgorCSAqLworCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgU2xlZXAgd2FpdGluZyBmb3IgYSByZXNlbGVjdGlvbi4KKwkgKi8KKwlTQ1JfV0FJVF9SRVNFTCwKKwkJUEFERFJfQShzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTEVDVEVEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTd2l0Y2ggdGhlIExFRCBvbi4KKwkgKiAgV2lsbCBiZSBwYXRjaGVkIHdpdGggYSBOT19PUCBpZiBMRUQKKwkgKiAgbm90IG5lZWRlZCBvciBub3QgZGVzaXJlZC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoZ3ByZWcsIFNDUl9BTkQsIDB4ZmUpLAorCQkwLAorCS8qCisJICogIGxvYWQgdGhlIHRhcmdldCBpZCBpbnRvIHRoZSBzZGlkCisJICovCisJU0NSX1JFR19TRkJSIChzc2lkLCBTQ1JfQU5ELCAweDhGKSwKKwkJMCwKKwlTQ1JfVE9fUkVHIChzZGlkKSwKKwkJMCwKKwkvKgorCSAqICBMb2FkIHRoZSB0YXJnZXQgY29udHJvbCBibG9jayBhZGRyZXNzCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlQQUREUl9CICh0YXJndGJsKSwKKwkJUkFERFJfMSAoZHNhKSwKKwlTQ1JfU0ZCUl9SRUcgKGRzYSwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKGRzYSwgU0NSX1NITCwgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKGRzYSwgU0NSX0FORCwgMHgzYyksCisJCTAsCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2E3MCksCisJU0NSX0NPUFkgKDQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BNzAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVJBRERSXzEgKGRzYSksCisJLyoKKwkgKiAgQ29weSB0aGUgVENCIGhlYWRlciB0byBhIGZpeGVkIHBsYWNlIGluIAorCSAqICB0aGUgSENCLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hODApLAorCVNDUl9DT1BZIChzaXplb2Yoc3RydWN0IHN5bV90Y2JoKSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0E4MCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJSEFERFJfMSAodGNiX2hlYWQpLAorCS8qCisJICogIFdlIGV4cGVjdCBNRVNTQUdFIElOIHBoYXNlLgorCSAqICBJZiBub3QsIGdldCBoZWxwIGZyb20gdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfSU5UIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19JTikpLAorCQlTSVJfUkVTRUxfTk9fTVNHX0lOLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxFQ1RFRDEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTG9hZCB0aGUgc3luY2hyb25vdXMgdHJhbnNmZXIgcmVnaXN0ZXJzLgorCSAqLworCVNDUl9DT1BZICgxKSwKKwkJSEFERFJfMSAodGNiX2hlYWQud3ZhbCksCisJCVJBRERSXzEgKHNjbnRsMyksCisJU0NSX0NPUFkgKDEpLAorCQlIQUREUl8xICh0Y2JfaGVhZC5zdmFsKSwKKwkJUkFERFJfMSAoc3hmZXIpLAorCS8qCisJICogIEdldCB0aGUgSURFTlRJRlkgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW4pLAorCS8qCisJICogIElmIElERU5USUZZIExVTiAjMCwgdXNlIGEgZmFzdGVyIHBhdGggCisJICogIHRvIGZpbmQgdGhlIExDQiBzdHJ1Y3R1cmUuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDB4ODAsIDB4YmYpKSwKKwkJUEFERFJfQSAocmVzZWxfbHVuMCksCisJLyoKKwkgKiAgSWYgbWVzc2FnZSBpc24ndCBhbiBJREVOVElGWSwgCisJICogIHRlbGwgdGhlIEMgY29kZSBhYm91dC4KKwkgKi8KKwlTQ1JfSU5UIF4gSUZGQUxTRSAoTUFTSyAoMHg4MCwgMHg4MCkpLAorCQlTSVJfUkVTRUxfTk9fSURFTlRJRlksCisJLyoKKwkgKiAgSXQgaXMgYW4gSURFTlRJRlkgbWVzc2FnZSwKKwkgKiAgTG9hZCB0aGUgTFVOIGNvbnRyb2wgYmxvY2sgYWRkcmVzcy4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKHRjYl9oZWFkLmx1bnRibF9zYSksCisJCVJBRERSXzEgKGRzYSksCisJU0NSX1NGQlJfUkVHIChkc2EsIFNDUl9TSEwsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHIChkc2EsIFNDUl9TSEwsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHIChkc2EsIFNDUl9BTkQsIDB4ZmMpLAorCQkwLAorCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hOTApLAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTkwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUl8xIChkc2EpLAorCVNDUl9KVU1QUiwKKwkJMTIsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9MVU4wID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBMVU4gMCBzcGVjaWFsIGNhc2UgKGJ1dCB1c3VhbCBvbmUgOikpCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xICh0Y2JfaGVhZC5sdW4wX3NhKSwKKwkJUkFERFJfMSAoZHNhKSwKKwkvKgorCSAqICBKdW1wIGluZGlyZWN0bHkgdG8gdGhlIHJlc2VsZWN0IGFjdGlvbiBmb3IgdGhpcyBMVU4uCisJICogIChsY2IuaGVhZC5yZXNlbF9zYSBhc3N1bWVkIGF0IG9mZnNldCB6ZXJvIG9mIGxjYikuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2ExMDApLAorCVNDUl9DT1BZICg0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQTEwMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCQkwLAorCQlSQUREUl8xICh0ZW1wKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorCS8qIEluIG5vcm1hbCBzaXR1YXRpb25zLCB3ZSBqdW1wIHRvIFJFU0VMX1RBRyBvciBSRVNFTF9OT19UQUcgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX1RBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFDSyB0aGUgSURFTlRJRlkgcHJldmlvdXNseSByZWNlaXZlZC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBJdCBzaGFsbCBiZSBhIHRhZ2dlZCBjb21tYW5kLgorCSAqICBSZWFkIFNJTVBMRStUQUcuCisJICogIFRoZSBDIGNvZGUgd2lsbCBkZWFsIHdpdGggZXJyb3JzLgorCSAqICBBZ3Jlc3NpdmUgb3B0aW1pemF0aW9uLCBpcydudCBpdD8gOikKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDIpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW4pLAorCS8qCisJICogIENvcHkgdGhlIExDQiBoZWFkZXIgdG8gYSBmaXhlZCBwbGFjZSBpbiAKKwkgKiAgdGhlIEhDQiB1c2luZyBzZWxmLW1vZGlmeWluZyBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hMTEwKSwKKwlTQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBzeW1fbGNiaCkpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTEwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCUhBRERSXzEgKGxjYl9oZWFkKSwKKwkvKgorCSAqICBMb2FkIHRoZSBwb2ludGVyIHRvIHRoZSB0YWdnZWQgdGFzayAKKwkgKiAgdGFibGUgZm9yIHRoaXMgTFVOLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJSEFERFJfMSAobGNiX2hlYWQuaXRscV90Ymxfc2EpLAorCQlSQUREUl8xIChkc2EpLAorCS8qCisJICogIFRoZSBTSURMIHN0aWxsIGNvbnRhaW5zIHRoZSBUQUcgdmFsdWUuCisJICogIEFncmVzc2l2ZSBvcHRpbWl6YXRpb24sIGlzbid0IGl0PyA6KTopCisJICovCisJU0NSX1JFR19TRkJSIChzaWRsLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKyNpZiBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gNTEyCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoQ0FSUllTRVQpLAorCQk4LAorCVNDUl9SRUdfUkVHIChkc2ExLCBTQ1JfT1IsIDIpLAorCQkwLAorCVNDUl9SRUdfUkVHIChzZmJyLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChDQVJSWVNFVCksCisJCTgsCisJU0NSX1JFR19SRUcgKGRzYTEsIFNDUl9PUiwgMSksCisJCTAsCisjZWxpZiBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gMjU2CisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoQ0FSUllTRVQpLAorCQk4LAorCVNDUl9SRUdfUkVHIChkc2ExLCBTQ1JfT1IsIDEpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgUmV0cmlldmUgdGhlIERTQSBvZiB0aGlzIHRhc2suCisJICogIEpVTVAgaW5kaXJlY3RseSB0byB0aGUgcmVzdGFydCBwb2ludCBvZiB0aGUgQ0NCLgorCSAqLworCVNDUl9TRkJSX1JFRyAoZHNhLCBTQ1JfQU5ELCAweGZjKSwKKwkJMCwKKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTEyMCksCisJU0NSX0NPUFkgKDQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTIwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVJBRERSXzEgKGRzYSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9HTyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVBBRERSX0EgKF9zbXNfYTEzMCksCisJLyoKKwkgKiAgTW92ZSAnY2NiLnBoeXMuaGVhZC5nbycgYWN0aW9uIHRvIAorCSAqICBzY3JhdGNoL3NjcmF0Y2gxLiBTbyBzY3JhdGNoMSB3aWxsIAorCSAqICBjb250YWluIHRoZSAncmVzdGFydCcgZmllbGQgb2YgdGhlIAorCSAqICAnZ28nIHN0cnVjdHVyZS4KKwkgKi8KKwlTQ1JfQ09QWSAoOCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0ExMzAgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJUEFERFJfQiAoc2NyYXRjaCksCisJU0NSX0NPUFkgKDQpLAorCQlQQUREUl9CIChzY3JhdGNoMSksIC8qIHBoeXMuaGVhZC5nby5yZXN0YXJ0ICovCisJCVJBRERSXzEgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCisJLyogSW4gbm9ybWFsIHNpdHVhdGlvbnMgd2UgYnJhbmNoIHRvIFJFU0VMX0RTQSAqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfRFNBID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQUNLIHRoZSBJREVOVElGWSBvciBUQUcgcHJldmlvdXNseSByZWNlaXZlZC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0RTQTEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvcHkgdGhlIENDQiBoZWFkZXIgdG8gYSBmaXhlZCBsb2NhdGlvbiAKKwkgKiAgaW4gdGhlIEhDQiB1c2luZyBzZWxmLW1vZGlmeWluZyBTQ1JJUFRTLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUEFERFJfQSAoX3Ntc19hMTQwKSwKKwlTQ1JfQ09QWSAoc2l6ZW9mKHN0cnVjdCBzeW1fY2NiaCkpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTQwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCUhBRERSXzEgKGNjYl9oZWFkKSwKKwkvKgorCSAqICBJbml0aWFsaXplIHRoZSBzdGF0dXMgcmVnaXN0ZXIKKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKGNjYl9oZWFkLnN0YXR1cyksCisJCVJBRERSXzEgKHNjcjApLAorCS8qCisJICogIEp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfTk9fVEFHID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ29weSB0aGUgTENCIGhlYWRlciB0byBhIGZpeGVkIHBsYWNlIGluIAorCSAqICB0aGUgSENCIHVzaW5nIHNlbGYtbW9kaWZ5aW5nIFNDUklQVFMuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChkc2EpLAorCQlQQUREUl9BIChfc21zX2ExNDUpLAorCVNDUl9DT1BZIChzaXplb2Yoc3RydWN0IHN5bV9sY2JoKSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBfU01TX0ExNDUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkJMCwKKwkJSEFERFJfMSAobGNiX2hlYWQpLAorCS8qCisJICogIExvYWQgdGhlIERTQSB3aXRoIHRoZSB1bmlxdWUgSVRMIHRhc2suCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChsY2JfaGVhZC5pdGxfdGFza19zYSksCisJCVJBRERSXzEgKGRzYSksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHJlc2VsX2dvKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworLyoKKyAqICBCZWNhdXNlIHRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisgKiAgI2RlZmluZSBTWU1fQ09ORl9NQVhfU0cgcGFyYW1ldGVyLAorICogIGl0IGlzIGZpbGxlZCBpbiBhdCBydW50aW1lLgorICoKKyAqICAjIz09PT09PT09PT09PCBpPTA7IGk8U1lNX0NPTkZfTUFYX1NHID49PT09PT09PT0KKyAqICB8fAlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisgKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgZGF0YVsgaV0pLAorICogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU4yID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DQUxMLAorCQlQQUREUl9BIChkYXRhaV9kb25lKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisgKiAgQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorICogICNkZWZpbmUgU1lNX0NPTkZfTUFYX1NHIHBhcmFtZXRlciwKKyAqICBpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyAqCisgKiAgIyM9PT09PT09PT09PTwgaT0wOyBpPFNZTV9DT05GX01BWF9TRyA+PT09PT09PT09CisgKiAgfHwJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX09VVCwKKyAqICB8fAkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBkYXRhWyBpXSksCisgKiAgIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworMAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVVQyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NBTEwsCisJCVBBRERSX0EgKGRhdGFvX2RvbmUpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMF9EQVRBID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFJlYWQgb3VyIGhvc3QgZmxhZ3MgdG8gU0ZCUiwgc28gd2Ugd2lsbCBiZSBhYmxlIAorCSAqICB0byBjaGVjayBhZ2FpbnN0IHRoZSBkYXRhIGRpcmVjdGlvbiB3ZSBleHBlY3QuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCS8qCisJICogIENoZWNrIGFnYWluc3QgYWN0dWFsIERBVEEgUEhBU0UuCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQlQQUREUl9BIChwbTBfZGF0YV9vdXQpLAorCS8qCisJICogIEFjdHVhbCBwaGFzZSBpcyBEQVRBIElOLgorCSAqICBDaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKE1BU0sgKEhGX0RBVEFfSU4sIEhGX0RBVEFfSU4pKSwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSBhcmUgbW92aW5nIGRhdGEgZnJvbSB0aGUgCisJICogIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfSU5fUE0wKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoZSBkYXRhIHRvIG1lbW9yeS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAuc2cpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChwbTBfZGF0YV9lbmQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0wX0RBVEFfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQWN0dWFsIHBoYXNlIGlzIERBVEEgT1VULgorCSAqICBDaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoSEZfREFUQV9JTiwgSEZfREFUQV9JTikpLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIGFyZSBtb3ZpbmcgZGF0YSBmcm9tIHRoZSAKKwkgKiAgUE0wIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX09SLCBIRl9JTl9QTTApLAorCQkwLAorCS8qCisJICogIE1vdmUgdGhlIGRhdGEgZnJvbSBtZW1vcnkuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX09VVCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMC5zZyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTBfREFUQV9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciB0aGUgZmxhZyB0aGF0IHRvbGQgd2Ugd2VyZSBtb3ZpbmcgIAorCSAqICBkYXRhIGZyb20gdGhlIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9BTkQsICh+SEZfSU5fUE0wKSksCisJCTAsCisJLyoKKwkgKiAgUmV0dXJuIHRvIHRoZSBwcmV2aW91cyBEQVRBIHNjcmlwdCB3aGljaCAKKwkgKiAgaXMgZ3VhcmFudGVlZCBieSBkZXNpZ24gKGlmIG5vIGJ1ZykgdG8gYmUgCisJICogIHRoZSBtYWluIERBVEEgc2NyaXB0IGZvciB0aGlzIHRyYW5zZmVyLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAoZHNhKSwKKwkJUkFERFJfMSAoc2NyYXRjaGEpLAorCVNDUl9SRUdfUkVHIChzY3JhdGNoYSwgU0NSX0FERCwgb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLHBoeXMucG0wLnJldCkpLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE1fREFUQV9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDQpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJCVBBRERSX0EgKF9zbXNfYTE1MCksCisJU0NSX0NPUFkgKDQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgX1NNU19BMTUwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJCTAsCisJCVJBRERSXzEgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTFfREFUQSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBSZWFkIG91ciBob3N0IGZsYWdzIHRvIFNGQlIsIHNvIHdlIHdpbGwgYmUgYWJsZSAKKwkgKiAgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZGF0YSBkaXJlY3Rpb24gd2UgZXhwZWN0LgorCSAqLworCVNDUl9GUk9NX1JFRyAoSEZfUkVHKSwKKwkJMCwKKwkvKgorCSAqICBDaGVjayBhZ2FpbnN0IGFjdHVhbCBEQVRBIFBIQVNFLgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFJfQSAocG0xX2RhdGFfb3V0KSwKKwkvKgorCSAqICBBY3R1YWwgcGhhc2UgaXMgREFUQSBJTi4KKwkgKiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkaXJlY3Rpb24uCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLIChIRl9EQVRBX0lOLCBIRl9EQVRBX0lOKSksCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorCS8qCisJICogIEtlZXAgdHJhY2sgd2UgYXJlIG1vdmluZyBkYXRhIGZyb20gdGhlIAorCSAqICBQTTEgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfT1IsIEhGX0lOX1BNMSksCisJCTAsCisJLyoKKwkgKiAgTW92ZSB0aGUgZGF0YSB0byBtZW1vcnkuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0xLnNnKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAocG0xX2RhdGFfZW5kKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMV9EQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFjdHVhbCBwaGFzZSBpcyBEQVRBIE9VVC4KKwkgKiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkaXJlY3Rpb24uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKEhGX0RBVEFfSU4sIEhGX0RBVEFfSU4pKSwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSBhcmUgbW92aW5nIGRhdGEgZnJvbSB0aGUgCisJICogIFBNMSBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfSU5fUE0xKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoZSBkYXRhIGZyb20gbWVtb3J5LgorCSAqLworCVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9PVVQsCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTEuc2cpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0xX0RBVEFfRU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgdGhlIGZsYWcgdGhhdCB0b2xkIHdlIHdlcmUgbW92aW5nICAKKwkgKiAgZGF0YSBmcm9tIHRoZSBQTTEgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfQU5ELCAofkhGX0lOX1BNMSkpLAorCQkwLAorCS8qCisJICogIFJldHVybiB0byB0aGUgcHJldmlvdXMgREFUQSBzY3JpcHQgd2hpY2ggCisJICogIGlzIGd1YXJhbnRlZWQgYnkgZGVzaWduIChpZiBubyBidWcpIHRvIGJlIAorCSAqICB0aGUgbWFpbiBEQVRBIHNjcmlwdCBmb3IgdGhpcyB0cmFuc2Zlci4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCVJBRERSXzEgKGRzYSksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGEsIFNDUl9BREQsIG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYixwaHlzLnBtMS5yZXQpKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAocG1fZGF0YV9lbmQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08Pi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworfTsKKworc3RhdGljIHN0cnVjdCBTWU1fRldCX1NDUiBTWU1fRldCX1NDUiA9IHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTk9fREFUQSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyB7CisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMX0ZPUl9BQk9SVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2UgYXJlIGp1bXBlZCBoZXJlIGJ5IHRoZSBDIGNvZGUsIGlmIHdlIGhhdmUgCisJICogIHNvbWUgdGFyZ2V0IHRvIHJlc2V0IG9yIHNvbWUgZGlzY29ubmVjdGVkIAorCSAqICBqb2IgdG8gYWJvcnQuIFNpbmNlIGVycm9yIHJlY292ZXJ5IGlzIGEgc2VyaW91cyAKKwkgKiAgYnVzeW5lc3MsIHdlIHdpbGwgcmVhbGx5IHJlc2V0IHRoZSBTQ1NJIEJVUywgaWYgCisJICogIGNhc2Ugb2YgYSBTQ1NJIGludGVycnVwdCBvY2N1cnJpbmcgaW4gdGhpcyBwYXRoLgorCSAqLworCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCS8qCisJICogIFNldCBpbml0aWF0b3IgbW9kZS4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfVFJHKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogICAgICBBbmQgdHJ5IHRvIHNlbGVjdCB0aGlzIHRhcmdldC4KKwkgKi8KKwlTQ1JfU0VMX1RCTF9BVE4gXiBvZmZzZXRvZiAoc3RydWN0IHN5bV9oY2IsIGFicnRfc2VsKSwKKwkJUEFERFJfQSAocmVzZWxlY3QpLAorCS8qCisJICogIFdhaXQgZm9yIHRoZSBzZWxlY3Rpb24gdG8gY29tcGxldGUgb3IgCisJICogIHRoZSBzZWxlY3Rpb24gdG8gdGltZSBvdXQuCisJICovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJLTgsCisJLyoKKwkgKiAgQ2FsbCB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9UQVJHRVRfU0VMRUNURUQsCisJLyoKKwkgKiAgVGhlIEMgY29kZSBzaG91bGQgbGV0IHVzIGNvbnRpbnVlIGhlcmUuIAorCSAqICBTZW5kIHRoZSAna2lzcyBvZiBkZWF0aCcgbWVzc2FnZS4KKwkgKiAgV2UgZXhwZWN0IGFuIGltbWVkaWF0ZSBkaXNjb25uZWN0IG9uY2UgCisJICogIHRoZSB0YXJnZXQgaGFzIGVhdGVuIHRoZSBtZXNzYWdlLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9NT1ZFX1RCTCBeIFNDUl9NU0dfT1VULAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9oY2IsIGFicnRfdGJsKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJLyoKKwkgKiAgVGVsbCB0aGUgQyBjb2RlIHRoYXQgd2UgYXJlIGRvbmUuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX0FCT1JUX1NFTlQsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRUxfRk9SX0FCT1JUXzEgPi0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBKdW1wIGF0IHNjaGVkdWxlci4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lOX0VUQyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgSWYgaXQgaXMgYW4gRVhURU5ERUQgKHZhcmlhYmxlIHNpemUgbWVzc2FnZSkKKwkgKiAgSGFuZGxlIGl0LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX0VYVEVOREVEKSksCisJCVBBRERSX0IgKG1zZ19leHRlbmRlZCksCisJLyoKKwkgKiAgTGV0IHRoZSBDIGNvZGUgaGFuZGxlIGFueSBvdGhlciAKKwkgKiAgMSBieXRlIG1lc3NhZ2UuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDB4MDAsIDB4ZjApKSwKKwkJUEFERFJfQiAobXNnX3JlY2VpdmVkKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoMHgxMCwgMHhmMCkpLAorCQlQQUREUl9CIChtc2dfcmVjZWl2ZWQpLAorCS8qCisJICogIFdlIGRvbm5vdCBoYW5kbGUgMiBieXRlcyBtZXNzYWdlcyBmcm9tIFNDUklQVFMuCisJICogIFNvLCBsZXQgdGhlIEMgY29kZSBkZWFsIHdpdGggdGhlc2Ugb25lcyB0b28uCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChNQVNLICgweDIwLCAweGYwKSksCisJCVBBRERSX0IgKG1zZ193ZWlyZF9zZWVuKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMV0pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1JFQ0VJVkVEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDQpLAkJCS8qIERVTU1ZIFJFQUQgKi8KKwkJSEFERFJfMSAoc2NyYXRjaCksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKKwlTQ1JfSU5ULAorCQlTSVJfTVNHX1JFQ0VJVkVELAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dFSVJEX1NFRU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NPUFkgKDQpLAkJCS8qIERVTU1ZIFJFQUQgKi8KKwkJSEFERFJfMSAoc2NyYXRjaCksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKKwlTQ1JfSU5ULAorCQlTSVJfTVNHX1dFSVJELAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0VYVEVOREVEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgQUNLIGFuZCBnZXQgdGhlIG5leHQgYnl0ZSAKKwkgKiAgYXNzdW1lZCB0byBiZSB0aGUgbWVzc2FnZSBsZW5ndGguCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzFdKSwKKwkvKgorCSAqICBUcnkgdG8gY2F0Y2ggc29tZSB1bmxpa2VseSBzaXR1YXRpb25zIGFzIDAgbGVuZ3RoIAorCSAqICBvciB0b28gbGFyZ2UgdGhlIGxlbmd0aC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoMCkpLAorCQlQQUREUl9CIChtc2dfd2VpcmRfc2VlbiksCisJU0NSX1RPX1JFRyAoc2NyYXRjaGEpLAorCQkwLAorCVNDUl9SRUdfUkVHIChzZmJyLCBTQ1JfQURELCAoMjU2LTgpKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoQ0FSUllTRVQpLAorCQlQQUREUl9CIChtc2dfd2VpcmRfc2VlbiksCisJLyoKKwkgKiAgV2UgZG9ubm90IGhhbmRsZSBleHRlbmRlZCBtZXNzYWdlcyBmcm9tIFNDUklQVFMuCisJICogIFJlYWQgdGhlIGFtb3VudCBvZiBkYXRhIGNvcnJlcG9uZGluZyB0byB0aGUgCisJICogIG1lc3NhZ2UgbGVuZ3RoIGFuZCBjYWxsIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0NPUFkgKDEpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJCVBBRERSX0IgKF9zbXNfYjEwKSwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IF9TTVNfQjEwID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9NT1ZFX0FCUyAoMCkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpblsyXSksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19yZWNlaXZlZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfQkFEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICB1bmltcGxlbWVudGVkIG1lc3NhZ2UgLSByZWplY3QgaXQuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFSkVDVF9UT19TRU5ELAorCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChjbHJhY2spLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dFSVJEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgd2VpcmQgbWVzc2FnZSByZWNlaXZlZAorCSAqICBpZ25vcmUgYWxsIE1TRyBJTiBwaGFzZXMgYW5kIHJlamVjdCBpdC4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVKRUNUX1RPX1NFTkQsCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfV0VJUkQxID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX3dlaXJkMSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBXRFRSX1JFU1AgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBsZXQgdGhlIHRhcmdldCBmZXRjaCBvdXIgYW5zd2VyLgorCSAqLworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJfQiAobmVnb19iYWRfcGhhc2UpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VORF9XRFRSID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2VuZCB0aGUgTV9YX1dJREVfUkVRCisJICovCisJU0NSX01PVkVfQUJTICg0KSBeIFNDUl9NU0dfT1VULAorCQlIQUREUl8xIChtc2dvdXQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChtc2dfb3V0X2RvbmUpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0RUUl9SRVNQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgbGV0IHRoZSB0YXJnZXQgZmV0Y2ggb3VyIGFuc3dlci4KKwkgKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG5lZ29fYmFkX3BoYXNlKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfU0RUUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNlbmQgdGhlIE1fWF9TWU5DX1JFUQorCSAqLworCVNDUl9NT1ZFX0FCUyAoNSkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX291dF9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBQUl9SRVNQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIGxldCB0aGUgdGFyZ2V0IGZldGNoIG91ciBhbnN3ZXIuCisJICovCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChuZWdvX2JhZF9waGFzZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX1BQUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTZW5kIHRoZSBNX1hfUFBSX1JFUQorCSAqLworCVNDUl9NT1ZFX0FCUyAoOCkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX291dF9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5FR09fQkFEX1BIQVNFID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQsCisJCVNJUl9ORUdPX1BST1RPLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgdGFyZ2V0IHJlcXVlc3RzIGEgbWVzc2FnZS4KKwkgKiAgV2UgZG9ubm90IHNlbmQgbWVzc2FnZXMgdGhhdCBtYXkgCisJICogIHJlcXVpcmUgdGhlIGRldmljZSB0byBnbyB0byBidXMgZnJlZS4KKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJLyoKKwkgKiAgLi4uIHdhaXQgZm9yIHRoZSBuZXh0IHBoYXNlCisJICogIGlmIGl0J3MgYSBtZXNzYWdlIG91dCwgc2VuZCBpdCBhZ2FpbiwgLi4uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG1zZ19vdXQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX09VVF9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTGV0IHRoZSBDIGNvZGUgYmUgYXdhcmUgb2YgdGhlIAorCSAqICBzZW50IG1lc3NhZ2UgYW5kIGNsZWFyIHRoZSBtZXNzYWdlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9NU0dfT1VUX0RPTkUsCisJLyoKKwkgKiAgLi4uIGFuZCBwcm9jZXNzIHRoZSBuZXh0IHBoYXNlCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1ZSVU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFplcm8gc2NyYXRjaGEgdGhhdCB3aWxsIGNvdW50IHRoZSAKKwkgKiAgZXh0cmFzIGJ5dGVzLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUEFERFJfQiAoemVybyksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1ZSVU4xID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSB0YXJnZXQgbWF5IHdhbnQgdG8gdHJhbnNmZXIgdG9vIG11Y2ggZGF0YS4KKwkgKgorCSAqICBJZiBwaGFzZSBpcyBEQVRBIE9VVCB3cml0ZSAxIGJ5dGUgYW5kIGNvdW50IGl0LgorCSAqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX09VVCkpLAorCQkxNiwKKwlTQ1JfQ0hNT1ZfQUJTICgxKSBeIFNDUl9EQVRBX09VVCwKKwkJSEFERFJfMSAoc2NyYXRjaCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4yKSwKKwkvKgorCSAqICBJZiBXU1IgaXMgc2V0LCBjbGVhciB0aGlzIGNvbmRpdGlvbiwgYW5kIAorCSAqICBjb3VudCB0aGlzIGJ5dGUuCisJICovCisJU0NSX0ZST01fUkVHIChzY250bDIpLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKFdTUiwgV1NSKSksCisJCTE2LAorCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9PUiwgV1NSKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1bjIpLAorCS8qCisJICogIEZpbmFsbHkgY2hlY2sgYWdhaW5zdCBEQVRBIElOIHBoYXNlLgorCSAqICBTaWduYWwgZGF0YSBvdmVycnVuIHRvIHRoZSBDIGNvZGUgCisJICogIGFuZCBqdW1wIHRvIGRpc3BhdGNoZXIgaWYgbm90IHNvLgorCSAqICBSZWFkIDEgYnl0ZSBvdGhlcndpc2UgYW5kIGNvdW50IGl0LgorCSAqLworCVNDUl9KVU1QUiBeIElGVFJVRSAoV0hFTiAoU0NSX0RBVEFfSU4pKSwKKwkJMTYsCisJU0NSX0lOVCwKKwkJU0lSX0RBVEFfT1ZFUlJVTiwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCVNDUl9DSE1PVl9BQlMgKDEpIF4gU0NSX0RBVEFfSU4sCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVlJVTjIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ291bnQgdGhpcyBieXRlLgorCSAqICBUaGlzIHdpbGwgYWxsb3cgdG8gcmV0dXJuIGEgbmVnYXRpdmUgCisJICogIHJlc2lkdWFsIHRvIHVzZXIuCisJICovCisJU0NSX1JFR19SRUcgKHNjcmF0Y2hhLCAgU0NSX0FERCwgIDB4MDEpLAorCQkwLAorCVNDUl9SRUdfUkVHIChzY3JhdGNoYTEsIFNDUl9BRERDLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGEyLCBTQ1JfQUREQywgMCksCisJCTAsCisJLyoKKwkgKiAgLi4gYW5kIHJlcGVhdCBhcyByZXF1aXJlZC4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1bjEpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQUJPUlRfUkVTRUwgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJLyoKKwkgKiAgc2VuZCB0aGUgYWJvcnQvYWJvcnRhZy9yZXNldCBtZXNzYWdlCisJICogIHdlIGV4cGVjdCBhbiBpbW1lZGlhdGUgZGlzY29ubmVjdAorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9BTkQsIDB4N2YpLAorCQkwLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfQ0xSIChTQ1JfQUNLfFNDUl9BVE4pLAorCQkwLAorCVNDUl9XQUlUX0RJU0MsCisJCTAsCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0FCT1JURUQsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VORF9JREVOVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSB0YXJnZXQgc3RheXMgaW4gTVNHIE9VVCBwaGFzZSBhZnRlciBoYXZpbmcgYWNrZWQgCisJICogIElkZW50aWZ5IFsrIFRhZyBbKyBFeHRlbmRlZCBtZXNzYWdlIF1dLiBUYXJnZXRzIHNoYWxsCisJICogIGJlaGF2ZSB0aGlzIHdheSBvbiBwYXJpdHkgZXJyb3IuCisJICogIFdlIG11c3Qgc2VuZCBpdCBhZ2FpbiBhbGwgdGhlIG1lc3NhZ2VzLgorCSAqLworCVNDUl9TRVQgKFNDUl9BVE4pLCAvKiBTaGFsbCBiZSBhc3NlcnRlZCAyIGRlc2tldyBkZWxheXMgYmVmb3JlIHRoZSAgKi8KKwkJMCwgICAgICAgICAvKiAxcnN0IEFDSyA9IDkwIG5zLiBIb3BlIHRoZSBjaGlwIGlzbid0IHRvbyBmYXN0ICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHNlbmRfaWRlbnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSURFTlRfQlJFQUsgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NMUiAoU0NSX0FUTiksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHNlbGVjdDIpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSURFTlRfQlJFQUtfQVROID4tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHNlbGVjdDIpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0RBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX0lOLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9kc2IsIHNlbnNlKSwKKwlTQ1JfQ0FMTCwKKwkJUEFERFJfQSAoZGF0YWlfZG9uZSksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfQkFEX0xVTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTWVzc2FnZSBpcyBhbiBJREVOVElGWSwgYnV0IGx1biBpcyB1bmtub3duLgorCSAqICBTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSAqICBTZW5kIGEgTV9BQk9SVCB0byBjbGVhciBhbGwgcGVuZGluZyB0YXNrcy4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQkFEX0xVTiwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoYWJvcnRfcmVzZWwpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX0lfVF9MID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2UgZG9ubm90IGhhdmUgYSB0YXNrIGZvciB0aGF0IElfVF9MLgorCSAqICBTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSAqICBTZW5kIGEgTV9BQk9SVCBtZXNzYWdlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfSV9UX0wsCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGFib3J0X3Jlc2VsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9JX1RfTF9RID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGRvbm5vdCBoYXZlIGEgdGFzayB0aGF0IG1hdGNoZXMgdGhlIHRhZy4KKwkgKiAgU2lnbmFsIHByb2JsZW0gdG8gQyBjb2RlIGZvciBsb2dnaW5nIHRoZSBldmVudC4KKwkgKiAgU2VuZCBhIE1fQUJPUlRUQUcgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQkFEX0lfVF9MX1EsCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKGFib3J0X3Jlc2VsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEJBRF9TVEFUVVMgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFueXRoaW5nIGRpZmZlcmVudCBmcm9tIElOVEVSTUVESUFURSAKKwkgKiAgQ09ORElUSU9OIE1FVCBzaG91bGQgYmUgYSBiYWQgU0NTSSBzdGF0dXMsIAorCSAqICBnaXZlbiB0aGF0IEdPT0Qgc3RhdHVzIGhhcyBhbHJlYWR5IGJlZW4gdGVzdGVkLgorCSAqICBDYWxsIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlQQUREUl9CIChzdGFydHBvcyksCisJCVJBRERSXzEgKHNjcmF0Y2hhKSwKKwlTQ1JfSU5UIF4gSUZGQUxTRSAoREFUQSAoU19DT05EX01FVCkpLAorCQlTSVJfQkFEX1NDU0lfU1RBVFVTLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBXU1JfTUFfSEVMUEVSID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBIZWxwZXIgZm9yIHRoZSBDIGNvZGUgd2hlbiBXU1IgYml0IGlzIHNldC4KKwkgKiAgUGVyZm9ybSB0aGUgbW92ZSBvZiB0aGUgcmVzaWR1YWwgYnl0ZS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy53cmVzaWQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JTyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2UganVtcCBoZXJlIGlmIHRoZSBkYXRhIGRpcmVjdGlvbiB3YXMgdW5rbm93biBhdCB0aGUgCisJICogIHRpbWUgd2UgaGFkIHRvIHF1ZXVlIHRoZSBjb21tYW5kIHRvIHRoZSBzY3JpcHRzIHByb2Nlc3Nvci4KKwkgKiAgUG9pbnRlcnMgaGFkIGJlZW4gc2V0IGFzIGZvbGxvdyBpbiB0aGlzIHNpdHVhdGlvbjoKKwkgKiAgICBzYXZlcCAgIC0tPiAgIERBVEFfSU8KKwkgKiAgICBsYXN0cCAgIC0tPiAgIHN0YXJ0IHBvaW50ZXIgd2hlbiBEQVRBX0lOCisJICogICAgd2xhc3RwICAtLT4gICBzdGFydCBwb2ludGVyIHdoZW4gREFUQV9PVVQKKwkgKiAgVGhpcyBzY3JpcHQgc2V0cyBzYXZlcCBhbmQgbGFzdHAgYWNjb3JkaW5nIHRvIHRoZSAKKwkgKiAgZGlyZWN0aW9uIGNob3NlbiBieSB0aGUgdGFyZ2V0LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfREFUQV9PVVQpKSwKKwkJUEFERFJfQiAoZGF0YV9pb19vdXQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JT19DT00gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgRGlyZWN0aW9uIGlzIERBVEEgSU4uCisJICovCisJU0NSX0NPUFkgICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCQlIQUREUl8xIChjY2JfaGVhZC5zYXZlcCksCisJLyoKKwkgKiAgSnVtcCB0byB0aGUgU0NSSVBUUyBhY2NvcmRpbmcgdG8gYWN0dWFsIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfQ09QWSAgKDQpLAorCQlIQUREUl8xIChjY2JfaGVhZC5zYXZlcCksCisJCVJBRERSXzEgKHRlbXApLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lPX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBEaXJlY3Rpb24gaXMgREFUQSBPVVQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX0FORCwgKH5IRl9EQVRBX0lOKSksCisJCTAsCisJU0NSX0NPUFkgICg0KSwKKwkJSEFERFJfMSAoY2NiX2hlYWQud2xhc3RwKSwKKwkJSEFERFJfMSAoY2NiX2hlYWQubGFzdHApLAorCVNDUl9KVU1QLAorCQlQQUREUl9CKGRhdGFfaW9fY29tKSwKKyNlbmRpZiAvKiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTiAqLworCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBaRVJPID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0NSQVRDSCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywgLyogTVVTVCBCRSBCRUZPUkUgU0NSQVRDSDEgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNDUkFUQ0gxID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQUkVWX0RPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLCAvKiBNVVNUIEJFIEJFRk9SRSBET05FX1BPUyAhICovCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBET05FX1BPUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTkVYVEpPQiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywgLyogTVVTVCBCRSBCRUZPUkUgU1RBUlRQT1MgISAqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlRQT1MgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFRBUkdUQkwgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTw+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9OworCitzdGF0aWMgc3RydWN0IFNZTV9GV1pfU0NSIFNZTV9GV1pfU0NSID0geworIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU05PT1BURVNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL3sKKwkvKgorCSAqICBSZWFkIHRoZSB2YXJpYWJsZS4KKwkgKi8KKwlTQ1JfQ09QWSAoNCksCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCQlSQUREUl8xIChzY3JhdGNoYSksCisJLyoKKwkgKiAgV3JpdGUgdGhlIHZhcmlhYmxlLgorCSAqLworCVNDUl9DT1BZICg0KSwKKwkJUkFERFJfMSAodGVtcCksCisJCUhBRERSXzEgKHNjcmF0Y2gpLAorCS8qCisJICogIFJlYWQgYmFjayB0aGUgdmFyaWFibGUuCisJICovCisJU0NSX0NPUFkgKDQpLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwkJUkFERFJfMSAodGVtcCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTTk9PUEVORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBBbmQgc3RvcC4KKwkgKi8KKwlTQ1JfSU5ULAorCQk5OSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2Z3Mi5oIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE3MTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9mdzIuaApAQCAtMCwwICsxLDE5MjcgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyoKKyAqICBTY3JpcHRzIGZvciBTWU1CSU9TLVByb2Nlc3NvcgorICoKKyAqICBXZSBoYXZlIHRvIGtub3cgdGhlIG9mZnNldHMgb2YgYWxsIGxhYmVscyBiZWZvcmUgd2UgcmVhY2ggCisgKiAgdGhlbSAoZm9yIGZvcndhcmQganVtcHMpLiBUaGVyZWZvcmUgd2UgZGVjbGFyZSBhIHN0cnVjdCAKKyAqICBoZXJlLiBJZiB5b3UgbWFrZSBjaGFuZ2VzIGluc2lkZSB0aGUgc2NyaXB0LAorICoKKyAqICBET05UIEZPUkdFVCBUTyBDSEFOR0UgVEhFIExFTkdUSFMgSEVSRSEKKyAqLworCisvKgorICogIFNjcmlwdCBmcmFnbWVudHMgd2hpY2ggYXJlIGxvYWRlZCBpbnRvIHRoZSBvbi1jaGlwIFJBTSAKKyAqICBvZiA4MjVBLCA4NzUsIDg3NiwgODk1LCA4OTVBLCA4OTYgYW5kIDEwMTAgY2hpcHMuCisgKiAgTXVzdCBub3QgZXhjZWVkIDRLIGJ5dGVzLgorICovCitzdHJ1Y3QgU1lNX0ZXQV9TQ1IgeworCXUzMiBzdGFydAkJWyAxNF07CisJdTMyIGdldGpvYl9iZWdpbglbICA0XTsKKwl1MzIgZ2V0am9iX2VuZAkJWyAgNF07CisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCXUzMiBzZWxlY3QJCVsgIDZdOworI2Vsc2UKKwl1MzIgc2VsZWN0CQlbICA0XTsKKyNlbmRpZgorI2lmCVNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorCXUzMiBpc19kbWFwX2RpcnR5CVsgIDRdOworI2VuZGlmCisJdTMyIHdmX3NlbF9kb25lCQlbICAyXTsKKwl1MzIgc2VsX2RvbmUJCVsgIDJdOworCXUzMiBzZW5kX2lkZW50CQlbICAyXTsKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwl1MzIgc2VsZWN0MgkJWyAgOF07CisjZWxzZQorCXUzMiBzZWxlY3QyCQlbICAyXTsKKyNlbmRpZgorCXUzMiBjb21tYW5kCQlbICAyXTsKKwl1MzIgZGlzcGF0Y2gJCVsgMjhdOworCXUzMiBzZWxfbm9fY21kCQlbIDEwXTsKKwl1MzIgaW5pdAkJWyAgNl07CisJdTMyIGNscmFjawkJWyAgNF07CisJdTMyIGRhdGFpX2RvbmUJCVsgMTBdOworCXUzMiBkYXRhaV9kb25lX3dzcglbIDIwXTsKKwl1MzIgZGF0YW9fZG9uZQkJWyAxMF07CisJdTMyIGRhdGFvX2RvbmVfd3NzCVsgIDZdOworCXUzMiBkYXRhaV9waGFzZQkJWyAgNF07CisJdTMyIGRhdGFvX3BoYXNlCQlbICA2XTsKKwl1MzIgbXNnX2luCQlbICAyXTsKKwl1MzIgbXNnX2luMgkJWyAxMF07CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIHN0YXR1cwkJWyAxNF07CisjZWxzZQorCXUzMiBzdGF0dXMJCVsgMTBdOworI2VuZGlmCisJdTMyIGNvbXBsZXRlCQlbICA2XTsKKwl1MzIgY29tcGxldGUyCQlbIDEyXTsKKwl1MzIgZG9uZQkJWyAxNF07CisJdTMyIGRvbmVfZW5kCQlbICAyXTsKKwl1MzIgY29tcGxldGVfZXJyb3IJWyAgNF07CisJdTMyIHNhdmVfZHAJCVsgMTJdOworCXUzMiByZXN0b3JlX2RwCQlbICA4XTsKKwl1MzIgZGlzY29ubmVjdAkJWyAxMl07CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJdTMyIGlkbGUJCVsgIDRdOworI2Vsc2UKKwl1MzIgaWRsZQkJWyAgMl07CisjZW5kaWYKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwl1MzIgdW5nZXRqb2IJCVsgIDZdOworI2Vsc2UKKwl1MzIgdW5nZXRqb2IJCVsgIDRdOworI2VuZGlmCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCXUzMiByZXNlbGVjdAkJWyAgNF07CisjZWxzZQorCXUzMiByZXNlbGVjdAkJWyAgMl07CisjZW5kaWYKKwl1MzIgcmVzZWxlY3RlZAkJWyAyMl07CisJdTMyIHJlc2VsX3NjbnRsNAlbIDIwXTsKKwl1MzIgcmVzZWxfbHVuMAkJWyAgNl07CisjaWYgICBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gNTEyCisJdTMyIHJlc2VsX3RhZwkJWyAyNl07CisjZWxpZiBTWU1fQ09ORl9NQVhfVEFTSyo0ID4gMjU2CisJdTMyIHJlc2VsX3RhZwkJWyAyMF07CisjZWxzZQorCXUzMiByZXNlbF90YWcJCVsgMTZdOworI2VuZGlmCisJdTMyIHJlc2VsX2RzYQkJWyAgMl07CisJdTMyIHJlc2VsX2RzYTEJCVsgIDRdOworCXUzMiByZXNlbF9ub190YWcJWyAgNl07CisJdTMyIGRhdGFfaW4JCVtTWU1fQ09ORl9NQVhfU0cgKiAyXTsKKwl1MzIgZGF0YV9pbjIJCVsgIDRdOworCXUzMiBkYXRhX291dAkJW1NZTV9DT05GX01BWF9TRyAqIDJdOworCXUzMiBkYXRhX291dDIJCVsgIDRdOworCXUzMiBwbTBfZGF0YQkJWyAxMl07CisJdTMyIHBtMF9kYXRhX291dAlbICA2XTsKKwl1MzIgcG0wX2RhdGFfZW5kCVsgIDZdOworCXUzMiBwbTFfZGF0YQkJWyAxMl07CisJdTMyIHBtMV9kYXRhX291dAlbICA2XTsKKwl1MzIgcG0xX2RhdGFfZW5kCVsgIDZdOworfTsKKworLyoKKyAqICBTY3JpcHQgZnJhZ21lbnRzIHdoaWNoIHN0YXkgaW4gbWFpbiBtZW1vcnkgZm9yIGFsbCBjaGlwcyAKKyAqICBleGNlcHQgZm9yIGNoaXBzIHRoYXQgc3VwcG9ydCA4SyBvbi1jaGlwIFJBTS4KKyAqLworc3RydWN0IFNZTV9GV0JfU0NSIHsKKwl1MzIgc3RhcnQ2NAkJWyAgMl07CisJdTMyIG5vX2RhdGEJCVsgIDJdOworI2lmZGVmIFNZTV9DT05GX1RBUkdFVF9ST0xFX1NVUFBPUlQKKwl1MzIgc2VsX2Zvcl9hYm9ydAlbIDE4XTsKKyNlbHNlCisJdTMyIHNlbF9mb3JfYWJvcnQJWyAxNl07CisjZW5kaWYKKwl1MzIgc2VsX2Zvcl9hYm9ydF8xCVsgIDJdOworCXUzMiBtc2dfaW5fZXRjCQlbIDEyXTsKKwl1MzIgbXNnX3JlY2VpdmVkCVsgIDRdOworCXUzMiBtc2dfd2VpcmRfc2VlbglbICA0XTsKKwl1MzIgbXNnX2V4dGVuZGVkCVsgMjBdOworCXUzMiBtc2dfYmFkCQlbICA2XTsKKwl1MzIgbXNnX3dlaXJkCQlbICA0XTsKKwl1MzIgbXNnX3dlaXJkMQkJWyAgOF07CisKKwl1MzIgd2R0cl9yZXNwCQlbICA2XTsKKwl1MzIgc2VuZF93ZHRyCQlbICA0XTsKKwl1MzIgc2R0cl9yZXNwCQlbICA2XTsKKwl1MzIgc2VuZF9zZHRyCQlbICA0XTsKKwl1MzIgcHByX3Jlc3AJCVsgIDZdOworCXUzMiBzZW5kX3BwcgkJWyAgNF07CisJdTMyIG5lZ29fYmFkX3BoYXNlCVsgIDRdOworCXUzMiBtc2dfb3V0CQlbICA0XTsKKwl1MzIgbXNnX291dF9kb25lCVsgIDRdOworCXUzMiBkYXRhX292cnVuCQlbICAyXTsKKwl1MzIgZGF0YV9vdnJ1bjEJCVsgMjJdOworCXUzMiBkYXRhX292cnVuMgkJWyAgOF07CisJdTMyIGFib3J0X3Jlc2VsCQlbIDE2XTsKKwl1MzIgcmVzZW5kX2lkZW50CVsgIDRdOworCXUzMiBpZGVudF9icmVhawkJWyAgNF07CisJdTMyIGlkZW50X2JyZWFrX2F0bglbICA0XTsKKwl1MzIgc2RhdGFfaW4JCVsgIDZdOworCXUzMiByZXNlbF9iYWRfbHVuCVsgIDRdOworCXUzMiBiYWRfaV90X2wJCVsgIDRdOworCXUzMiBiYWRfaV90X2xfcQkJWyAgNF07CisJdTMyIGJhZF9zdGF0dXMJCVsgIDZdOworCXUzMiBwbV9oYW5kbGUJCVsgMjBdOworCXUzMiBwbV9oYW5kbGUxCQlbICA0XTsKKwl1MzIgcG1fc2F2ZQkJWyAgNF07CisJdTMyIHBtMF9zYXZlCQlbIDEyXTsKKwl1MzIgcG1fc2F2ZV9lbmQJCVsgIDRdOworCXUzMiBwbTFfc2F2ZQkJWyAxNF07CisKKwkvKiBXU1IgaGFuZGxpbmcgKi8KKwl1MzIgcG1fd3NyX2hhbmRsZQlbIDM4XTsKKwl1MzIgd3NyX21hX2hlbHBlcglbICA0XTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJLyogVW5rbm93biBkaXJlY3Rpb24gaGFuZGxpbmcgKi8KKwl1MzIgZGF0YV9pbwkJWyAgMl07CisJdTMyIGRhdGFfaW9faW4JCVsgIDJdOworCXUzMiBkYXRhX2lvX2NvbQkJWyAgNl07CisJdTMyIGRhdGFfaW9fb3V0CQlbICA4XTsKKyNlbmRpZgorCS8qIERhdGEgYXJlYSAqLworCXUzMiB6ZXJvCQlbICAxXTsKKwl1MzIgc2NyYXRjaAkJWyAgMV07CisJdTMyIHBtMF9kYXRhX2FkZHIJWyAgMV07CisJdTMyIHBtMV9kYXRhX2FkZHIJWyAgMV07CisJdTMyIGRvbmVfcG9zCQlbICAxXTsKKwl1MzIgc3RhcnRwb3MJCVsgIDFdOworCXUzMiB0YXJndGJsCQlbICAxXTsKK307CisKKy8qCisgKiAgU2NyaXB0IGZyYWdtZW50cyB1c2VkIGF0IGluaXRpYWxpc2F0aW9ucy4KKyAqICBPbmx5IHJ1bnMgb3V0IG9mIG1haW4gbWVtb3J5LgorICovCitzdHJ1Y3QgU1lNX0ZXWl9TQ1IgeworCXUzMiBzbm9vcHRlc3QJCVsgIDZdOworCXUzMiBzbm9vcGVuZAkJWyAgMl07Cit9OworCitzdGF0aWMgc3RydWN0IFNZTV9GV0FfU0NSIFNZTV9GV0FfU0NSID0geworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyB7CisJLyoKKwkgKiAgU3dpdGNoIHRoZSBMRUQgb24uCisJICogIFdpbGwgYmUgcGF0Y2hlZCB3aXRoIGEgTk9fT1AgaWYgTEVECisJICogIG5vdCBuZWVkZWQgb3Igbm90IGRlc2lyZWQuCisJICovCisJU0NSX1JFR19SRUcgKGdwcmVnLCBTQ1JfQU5ELCAweGZlKSwKKwkJMCwKKwkvKgorCSAqICAgICAgQ2xlYXIgU0lHUC4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKGN0ZXN0MiksCisJCTAsCisJLyoKKwkgKiAgU3RvcCBoZXJlIGlmIHRoZSBDIGNvZGUgd2FudHMgdG8gcGVyZm9ybSAKKwkgKiAgc29tZSBlcnJvciByZWNvdmVyeSBwcm9jZWR1cmUgbWFudWFsbHkuCisJICogIChJbmRpY2F0ZSB0aGlzIGJ5IHNldHRpbmcgU0VNIGluIElTVEFUKQorCSAqLworCVNDUl9GUk9NX1JFRyAoaXN0YXQpLAorCQkwLAorCS8qCisJICogIFJlcG9ydCB0byB0aGUgQyBjb2RlIHRoZSBuZXh0IHBvc2l0aW9uIGluIAorCSAqICB0aGUgc3RhcnQgcXVldWUgdGhlIFNDUklQVFMgd2lsbCBzY2hlZHVsZS4KKwkgKiAgVGhlIEMgY29kZSBtdXN0IG5vdCBjaGFuZ2UgU0NSQVRDSEEuCisJICovCisJU0NSX0xPQURfQUJTIChzY3JhdGNoYSwgNCksCisJCVBBRERSX0IgKHN0YXJ0cG9zKSwKKwlTQ1JfSU5UIF4gSUZUUlVFIChNQVNLIChTRU0sIFNFTSkpLAorCQlTSVJfU0NSSVBUX1NUT1BQRUQsCisJLyoKKwkgKiAgU3RhcnQgdGhlIG5leHQgam9iLgorCSAqCisJICogIEBEU0EgICAgID0gc3RhcnQgcG9pbnQgZm9yIHRoaXMgam9iLgorCSAqICBTQ1JBVENIQSA9IGFkZHJlc3Mgb2YgdGhpcyBqb2IgaW4gdGhlIHN0YXJ0IHF1ZXVlLgorCSAqCisJICogIFdlIHdpbGwgcmVzdG9yZSBzdGFydHBvcyB3aXRoIFNDUkFUQ0hBIGlmIHdlIGZhaWxzIHRoZSAKKwkgKiAgYXJiaXRyYXRpb24gb3IgaWYgaXQgaXMgdGhlIGlkbGUgam9iLgorCSAqCisJICogIFRoZSBiZWxvdyBHRVRKT0JfQkVHSU4gdG8gR0VUSk9CX0VORCBzZWN0aW9uIG9mIFNDUklQVFMgCisJICogIGlzIGEgY3JpdGljYWwgcGF0aC4gSWYgaXQgaXMgcGFydGlhbGx5IGV4ZWN1dGVkLCBpdCB0aGVuIAorCSAqICBtYXkgaGFwcGVuIHRoYXQgdGhlIGpvYiBhZGRyZXNzIGlzIG5vdCB5ZXQgaW4gdGhlIERTQSAKKwkgKiAgYW5kIHRoZSBuZXh0IHF1ZXVlIHBvc2l0aW9uIHBvaW50cyB0byB0aGUgbmV4dCBKT0IuCisJICovCisJU0NSX0xPQURfQUJTIChkc2EsIDQpLAorCQlQQUREUl9CIChzdGFydHBvcyksCisJU0NSX0xPQURfUkVMICh0ZW1wLCA0KSwKKwkJNCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IEdFVEpPQl9CRUdJTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9TVE9SRV9BQlMgKHRlbXAsIDQpLAorCQlQQUREUl9CIChzdGFydHBvcyksCisJU0NSX0xPQURfUkVMIChkc2EsIDQpLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgR0VUSk9CX0VORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0xPQURfUkVMICh0ZW1wLCA0KSwKKwkJMCwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMRUNUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgRFNBCWNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIGEgc2NoZWR1bGVkCisJICogIAlkYXRhIHN0cnVjdHVyZS4KKwkgKgorCSAqICBTQ1JBVENIQSBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgcXVldWUgIAorCSAqICAJZW50cnkgd2hpY2ggcG9pbnRzIHRvIHRoZSBuZXh0IGpvYi4KKwkgKgorCSAqICBTZXQgSW5pdGlhdG9yIG1vZGUuCisJICoKKwkgKiAgKFRhcmdldCBtb2RlIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIpCisJICovCisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgICAgIEFuZCB0cnkgdG8gc2VsZWN0IHRoaXMgdGFyZ2V0LgorCSAqLworCVNDUl9TRUxfVEJMX0FUTiBeIG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgc2VsZWN0KSwKKwkJUEFERFJfQSAodW5nZXRqb2IpLAorCS8qCisJICogIE5vdyB0aGVyZSBhcmUgNCBwb3NzaWJpbGl0aWVzOgorCSAqCisJICogICgxKSBUaGUgY2hpcCBsb3NlcyBhcmJpdHJhdGlvbi4KKwkgKiAgVGhpcyBpcyBvaywgYmVjYXVzZSBpdCB3aWxsIHRyeSBhZ2FpbiwKKwkgKiAgd2hlbiB0aGUgYnVzIGJlY29tZXMgaWRsZS4KKwkgKiAgKEJ1dCBiZXdhcmUgb2YgdGhlIHRpbWVvdXQgZnVuY3Rpb24hKQorCSAqCisJICogICgyKSBUaGUgY2hpcCBpcyByZXNlbGVjdGVkLgorCSAqICBUaGVuIHRoZSBzY3JpcHQgcHJvY2Vzc29yIHRha2VzIHRoZSBqdW1wCisJICogIHRvIHRoZSBSRVNFTEVDVCBsYWJlbC4KKwkgKgorCSAqICAoMykgVGhlIGNoaXAgd2lucyBhcmJpdHJhdGlvbi4KKwkgKiAgVGhlbiBpdCB3aWxsIGV4ZWN1dGUgU0NSSVBUUyBpbnN0cnVjdGlvbiB1bnRpbCAKKwkgKiAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdGhhdCBjaGVja3MgU0NTSSBwaGFzZS4KKwkgKiAgVGhlbiB3aWxsIHN0b3AgYW5kIHdhaXQgZm9yIHNlbGVjdGlvbiB0byBiZSAKKwkgKiAgY29tcGxldGUgb3Igc2VsZWN0aW9uIHRpbWUtb3V0IHRvIG9jY3VyLgorCSAqCisJICogIEFmdGVyIGhhdmluZyB3b24gYXJiaXRyYXRpb24sIHRoZSBTQ1JJUFRTICAKKwkgKiAgcHJvY2Vzc29yIGlzIGFibGUgdG8gZXhlY3V0ZSBpbnN0cnVjdGlvbnMgd2hpbGUgCisJICogIHRoZSBTQ1NJIGNvcmUgaXMgcGVyZm9ybWluZyBTQ1NJIHNlbGVjdGlvbi4KKwkgKi8KKwkvKgorCSAqICAgICAgSW5pdGlhbGl6ZSB0aGUgc3RhdHVzIHJlZ2lzdGVycworCSAqLworCVNDUl9MT0FEX1JFTCAoc2NyMCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLnN0YXR1cyksCisJLyoKKwkgKiAgV2UgbWF5IG5lZWQgaGVscCBmcm9tIENQVSBpZiB0aGUgRE1BIHNlZ21lbnQgCisJICogIHJlZ2lzdGVycyBhcmVuJ3QgdXAtdG8tZGF0ZSBmb3IgdGhpcyBJTy4KKwkgKiAgUGF0Y2hlZCB3aXRoIE5PT1AgZm9yIGNoaXBzIHRoYXQgZG9ubm90IAorCSAqICBzdXBwb3J0IERBQyBhZGRyZXNzaW5nLgorCSAqLworI2lmCVNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSVNfRE1BUF9ESVJUWSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0ZST01fUkVHIChIWF9SRUcpLAorCQkwLAorCVNDUl9JTlQgXiBJRlRSVUUgKE1BU0sgKEhYX0RNQVBfRElSVFksIEhYX0RNQVBfRElSVFkpKSwKKwkJU0lSX0RNQVBfRElSVFksCisjZW5kaWYKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFdGX1NFTF9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlTSVJfU0VMX0FUTl9OT19NU0dfT1VULAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VMX0RPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQzEwMTAtMzMgZXJyYXRhIHdvcmstYXJvdW5kLgorCSAqICBEdWUgdG8gYSByYWNlLCB0aGUgU0NTSSBjb3JlIG1heSBub3QgaGF2ZSAKKwkgKiAgbG9hZGVkIFNDTlRMMyBvbiBTRUxfVEJMIGluc3RydWN0aW9uLgorCSAqICBXZSByZWxvYWQgaXQgb25jZSBwaGFzZSBpcyBzdGFibGUuCisJICogIFBhdGNoZWQgd2l0aCBhIE5PT1AgZm9yIG90aGVyIGNoaXBzLgorCSAqLworCVNDUl9MT0FEX1JFTCAoc2NudGwzLCAxKSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9kc2IsIHNlbGVjdC5zZWxfc2NudGwzKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfSURFTlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNlbGVjdGlvbiBjb21wbGV0ZS4KKwkgKiAgU2VuZCB0aGUgSURFTlRJRlkgYW5kIHBvc3NpYmx5IHRoZSBUQUcgbWVzc2FnZSAKKwkgKiAgYW5kIG5lZ290aWF0aW9uIG1lc3NhZ2UgaWYgcHJlc2VudC4KKwkgKi8KKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfTVNHX09VVCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBzbXNnKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTEVDVDIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogIFNldCBJTU1FRElBVEUgQVJCSVRSQVRJT04gaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIAorCSAqICBhIGhpbnQgdG8gZG8gc28uIChTb21lIGpvYiB0byBkbyBhZnRlciB0aGlzIG9uZSkuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKE1BU0sgKEhGX0hJTlRfSUFSQiwgSEZfSElOVF9JQVJCKSksCisJCTgsCisJU0NSX1JFR19SRUcgKHNjbnRsMSwgU0NSX09SLCBJQVJCKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIEFudGljaXBhdGUgdGhlIENPTU1BTkQgcGhhc2UuCisJICogIFRoaXMgaXMgdGhlIFBIQVNFIHdlIGV4cGVjdCBhdCB0aGlzIHBvaW50LgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0NPTU1BTkQpKSwKKwkJUEFERFJfQSAoc2VsX25vX2NtZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBDT01NQU5EID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICAuLi4gYW5kIHNlbmQgdGhlIGNvbW1hbmQKKwkgKi8KKwlTQ1JfTU9WRV9UQkwgXiBTQ1JfQ09NTUFORCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBjbWQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRElTUEFUQ0ggPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTVNHX0lOIGlzIHRoZSBvbmx5IHBoYXNlIHRoYXQgc2hhbGwgYmUgCisJICogIGVudGVyZWQgYXQgbGVhc3Qgb25jZSBmb3IgZWFjaCAocmUpc2VsZWN0aW9uLgorCSAqICBTbyB3ZSB0ZXN0IGl0IGZpcnN0LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKG1zZ19pbiksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfREFUQV9PVVQpKSwKKwkJUEFERFJfQSAoZGF0YW9fcGhhc2UpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX0RBVEFfSU4pKSwKKwkJUEFERFJfQSAoZGF0YWlfcGhhc2UpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX1NUQVRVUykpLAorCQlQQUREUl9BIChzdGF0dXMpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChJRiAoU0NSX0NPTU1BTkQpKSwKKwkJUEFERFJfQSAoY29tbWFuZCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKElGIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChtc2dfb3V0KSwKKwkvKgorCSAqICBEaXNjYXJkIGFzIG1hbnkgaWxsZWdhbCBwaGFzZXMgYXMgCisJICogIHJlcXVpcmVkIGFuZCB0ZWxsIHRoZSBDIGNvZGUgYWJvdXQuCisJICovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0lMR19PVVQpKSwKKwkJMTYsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9JTEdfT1VULAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKFdIRU4gKFNDUl9JTEdfT1VUKSksCisJCS0xNiwKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfSUxHX0lOKSksCisJCTE2LAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfSUxHX0lOLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUFIgXiBJRlRSVUUgKFdIRU4gKFNDUl9JTEdfSU4pKSwKKwkJLTE2LAorCVNDUl9JTlQsCisJCVNJUl9CQURfUEhBU0UsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTF9OT19DTUQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSB0YXJnZXQgZG9lcyBub3Qgc3dpdGNoIHRvIGNvbW1hbmQgCisJICogIHBoYXNlIGFmdGVyIElERU5USUZZIGhhcyBiZWVuIHNlbnQuCisJICoKKwkgKiAgSWYgaXQgc3RheXMgaW4gTVNHIE9VVCBwaGFzZSBzZW5kIGl0IAorCSAqICB0aGUgSURFTlRJRlkgYWdhaW4uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKHJlc2VuZF9pZGVudCksCisJLyoKKwkgKiAgSWYgdGFyZ2V0IGRvZXMgbm90IHN3aXRjaCB0byBNU0cgSU4gcGhhc2UgCisJICogIGFuZCB3ZSBzZW50IGEgbmVnb3RpYXRpb24sIGFzc2VydCB0aGUgCisJICogIGZhaWx1cmUgaW1tZWRpYXRlbHkuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCVNDUl9GUk9NX1JFRyAoSFNfUkVHKSwKKwkJMCwKKwlTQ1JfSU5UIF4gSUZUUlVFIChEQVRBIChIU19ORUdPVElBVEUpKSwKKwkJU0lSX05FR09fRkFJTEVELAorCS8qCisJICogIEp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgSU5JVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIFNDU0kgUkVTRVQgc2lnbmFsIHRvIGJlIAorCSAqICBpbmFjdGl2ZSBiZWZvcmUgcmVzdGFydGluZyBvcGVyYXRpb25zLCAKKwkgKiAgc2luY2UgdGhlIGNoaXAgbWF5IGhhbmcgb24gU0VMX0FUTiAKKwkgKiAgaWYgU0NTSSBSRVNFVCBpcyBhY3RpdmUuCisJICovCisJU0NSX0ZST01fUkVHIChzc3RhdDApLAorCQkwLAorCVNDUl9KVU1QUiBeIElGVFJVRSAoTUFTSyAoSVJTVCwgSVJTVCkpLAorCQktMTYsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENMUkFDSyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRlcm1pbmF0ZSBwb3NzaWJsZSBwZW5kaW5nIG1lc3NhZ2UgcGhhc2UuCisJICovCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFJX0RPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNhdmUgY3VycmVudCBwb2ludGVyIHRvIExBU1RQLgorCSAqLworCVNDUl9TVE9SRV9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJLyoKKwkgKiAgSWYgdGhlIFNXSURFIGlzIG5vdCBmdWxsLCBqdW1wIHRvIGRpc3BhdGNoZXIuCisJICogIFdlIGFudGljaXBhdGUgYSBTVEFUVVMgcGhhc2UuCisJICovCisJU0NSX0ZST01fUkVHIChzY250bDIpLAorCQkwLAorCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLIChXU1IsIFdTUikpLAorCQlQQUREUl9BIChkYXRhaV9kb25lX3dzciksCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9TVEFUVVMpKSwKKwkJUEFERFJfQSAoc3RhdHVzKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQUlfRE9ORV9XU1IgPi0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGhlIFNXSURFIGlzIGZ1bGwuCisJICogIENsZWFyIHRoaXMgY29uZGl0aW9uLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9PUiwgV1NSKSwKKwkJMCwKKwkvKgorCSAqICBXZSBhcmUgZXhwZWN0aW5nIGFuIElHTk9SRSBSRVNJRFVFIG1lc3NhZ2UgCisJICogIGZyb20gdGhlIGRldmljZSwgb3RoZXJ3aXNlIHdlIGFyZSBpbiBkYXRhIAorCSAqICBvdmVycnVuIGNvbmRpdGlvbi4gQ2hlY2sgYWdhaW5zdCBNU0dfSU4gcGhhc2UuCisJICovCisJU0NSX0lOVCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJU0lSX1NXSURFX09WRVJSVU4sCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKKwkvKgorCSAqICBXZSBhcmUgaW4gTVNHX0lOIHBoYXNlLAorCSAqICBSZWFkIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLgorCSAqICBJZiBpdCBpcyBub3QgYW4gSUdOT1JFIFJFU0lEVUUgbWVzc2FnZSwKKwkgKiAgc2lnbmFsIG92ZXJydW4gYW5kIGp1bXAgdG8gbWVzc2FnZSAKKwkgKiAgcHJvY2Vzc2luZy4KKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMF0pLAorCVNDUl9JTlQgXiBJRkZBTFNFIChEQVRBIChNX0lHTl9SRVNJRFVFKSksCisJCVNJUl9TV0lERV9PVkVSUlVOLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoREFUQSAoTV9JR05fUkVTSURVRSkpLAorCQlQQUREUl9BIChtc2dfaW4yKSwKKwkvKgorCSAqICBXZSBnb3QgdGhlIG1lc3NhZ2Ugd2UgZXhwZWN0ZWQuCisJICogIFJlYWQgdGhlIDJuZCBieXRlLCBhbmQganVtcCB0byBkaXNwYXRjaGVyLgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpblsxXSksCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFPX0RPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNhdmUgY3VycmVudCBwb2ludGVyIHRvIExBU1RQLgorCSAqLworCVNDUl9TVE9SRV9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJLyoKKwkgKiAgSWYgdGhlIFNPREwgaXMgbm90IGZ1bGwganVtcCB0byBkaXNwYXRjaGVyLgorCSAqICBXZSBhbnRpY2lwYXRlIGEgU1RBVFVTIHBoYXNlLgorCSAqLworCVNDUl9GUk9NX1JFRyAoc2NudGwyKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoV1NTLCBXU1MpKSwKKwkJUEFERFJfQSAoZGF0YW9fZG9uZV93c3MpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfU1RBVFVTKSksCisJCVBBRERSX0EgKHN0YXR1cyksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFPX0RPTkVfV1NTID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSBTT0RMIGlzIGZ1bGwsIGNsZWFyIHRoaXMgY29uZGl0aW9uLgorCSAqLworCVNDUl9SRUdfUkVHIChzY250bDIsIFNDUl9PUiwgV1NTKSwKKwkJMCwKKwkvKgorCSAqICBBbmQgc2lnbmFsIGEgREFUQSBVTkRFUlJVTiBjb25kaXRpb24gCisJICogIHRvIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1NPRExfVU5ERVJSVU4sCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFJX1BIQVNFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEp1bXAgdG8gY3VycmVudCBwb2ludGVyLgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLmxhc3RwKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQU9fUEhBU0UgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQzEwMTAtNjYgZXJyYXRhIHdvcmstYXJvdW5kLgorCSAqICBFeHRyYSBjbG9ja3Mgb2YgZGF0YSBob2xkIG11c3QgYmUgaW5zZXJ0ZWQgCisJICogIGluIERBVEEgT1VUIHBoYXNlIG9uIDMzIE1IeiBQQ0kgQlVTLgorCSAqICBQYXRjaGVkIHdpdGggYSBOT09QIGZvciBvdGhlciBjaGlwcy4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NudGw0LCBTQ1JfT1IsIChYQ0xLSF9EVHxYQ0xLSF9TVCkpLAorCQkwLAorCS8qCisJICogIEp1bXAgdG8gY3VycmVudCBwb2ludGVyLgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLmxhc3RwKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX0lOID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgR2V0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlLgorCSAqCisJICogIFRoZSBzY3JpcHQgcHJvY2Vzc29yIGRvZXNuJ3QgbmVnYXRlIHRoZQorCSAqICBBQ0sgc2lnbmFsIGFmdGVyIHRoaXMgdHJhbnNmZXIuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luWzBdKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE1TR19JTjIgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENoZWNrIGZpcnN0IGFnYWluc3QgMSBieXRlIG1lc3NhZ2VzIAorCSAqICB0aGF0IHdlIGhhbmRsZSBmcm9tIFNDUklQVFMuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fQ09NUExFVEUpKSwKKwkJUEFERFJfQSAoY29tcGxldGUpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBIChNX0RJU0NPTk5FQ1QpKSwKKwkJUEFERFJfQSAoZGlzY29ubmVjdCksCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fU0FWRV9EUCkpLAorCQlQQUREUl9BIChzYXZlX2RwKSwKKwlTQ1JfSlVNUCBeIElGVFJVRSAoREFUQSAoTV9SRVNUT1JFX0RQKSksCisJCVBBRERSX0EgKHJlc3RvcmVfZHApLAorCS8qCisJICogIFdlIGhhbmRsZSBhbGwgb3RoZXIgbWVzc2FnZXMgZnJvbSB0aGUgCisJICogIEMgY29kZSwgc28gbm8gbmVlZCB0byB3YXN0ZSBvbi1jaGlwIFJBTSAKKwkgKiAgZm9yIHRob3NlIG9uZXMuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19pbl9ldGMpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBVFVTID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgZ2V0IHRoZSBzdGF0dXMKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX1NUQVRVUywKKwkJSEFERFJfMSAoc2NyYXRjaCksCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgSWYgU1RBVFVTIGlzIG5vdCBHT09ELCBjbGVhciBJTU1FRElBVEUgQVJCSVRSQVRJT04sIAorCSAqICBzaW5jZSB3ZSBtYXkgaGF2ZSB0byB0YW1wZXIgdGhlIHN0YXJ0IHF1ZXVlIGZyb20gCisJICogIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0pVTVBSIF4gSUZUUlVFIChEQVRBIChTX0dPT0QpKSwKKwkJOCwKKwlTQ1JfUkVHX1JFRyAoc2NudGwxLCBTQ1JfQU5ELCB+SUFSQiksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICBzYXZlIHN0YXR1cyB0byBzY3NpX3N0YXR1cy4KKwkgKiAgbWFyayBhcyBjb21wbGV0ZS4KKwkgKi8KKwlTQ1JfVE9fUkVHIChTU19SRUcpLAorCQkwLAorCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19DT01QTEVURSksCisJCTAsCisJLyoKKwkgKiAgQW50aWNpcGF0ZSB0aGUgTUVTU0FHRSBQSEFTRSBmb3IgCisJICogIHRoZSBUQVNLIENPTVBMRVRFIG1lc3NhZ2UuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAobXNnX2luKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NUExFVEUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ29tcGxldGUgbWVzc2FnZS4KKwkgKgorCSAqICBXaGVuIHdlIHRlcm1pbmF0ZSB0aGUgY3ljbGUgYnkgY2xlYXJpbmcgQUNLLAorCSAqICB0aGUgdGFyZ2V0IG1heSBkaXNjb25uZWN0IGltbWVkaWF0ZWx5LgorCSAqCisJICogIFdlIGRvbid0IHdhbnQgdG8gYmUgdG9sZCBvZiBhbiAidW5leHBlY3RlZCBkaXNjb25uZWN0IiwKKwkgKiAgc28gd2UgZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJLyoKKwkgKiAgVGVybWluYXRlIGN5Y2xlIC4uLgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJLyoKKwkgKiAgLi4uIGFuZCB3YWl0IGZvciB0aGUgZGlzY29ubmVjdC4KKwkgKi8KKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQ09NUExFVEUyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2F2ZSBob3N0IHN0YXR1cy4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMIChzY3IwLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuc3RhdHVzKSwKKwkvKgorCSAqICBTb21lIGJyaWRnZXMgbWF5IHJlb3JkZXIgRE1BIHdyaXRlcyB0byBtZW1vcnkuCisJICogIFdlIGRvbm5vdCB3YW50IHRoZSBDUFUgdG8gZGVhbCB3aXRoIGNvbXBsZXRpb25zICAKKwkgKiAgd2l0aG91dCBhbGwgdGhlIHBvc3RlZCB3cml0ZSBoYXZpbmcgYmVlbiBmbHVzaGVkIAorCSAqICB0byBtZW1vcnkuIFRoaXMgRFVNTVkgUkVBRCBzaG91bGQgZmx1c2ggcG9zdGVkIAorCSAqICBidWZmZXJzIHByaW9yIHRvIHRoZSBDUFUgaGF2aW5nIHRvIGRlYWwgd2l0aCAKKwkgKiAgY29tcGxldGlvbnMuCisJICovCisJU0NSX0xPQURfUkVMIChzY3IwLCA0KSwJLyogRFVNTVkgUkVBRCAqLworCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zdGF0dXMpLAorCisJLyoKKwkgKiAgSWYgY29tbWFuZCByZXN1bHRlZCBpbiBub3QgR09PRCBzdGF0dXMsCisJICogIGNhbGwgdGhlIEMgY29kZSBpZiBuZWVkZWQuCisJICovCisJU0NSX0ZST01fUkVHIChTU19SRUcpLAorCQkwLAorCVNDUl9DQUxMIF4gSUZGQUxTRSAoREFUQSAoU19HT09EKSksCisJCVBBRERSX0IgKGJhZF9zdGF0dXMpLAorCS8qCisJICogIElmIHdlIHBlcmZvcm1lZCBhbiBhdXRvLXNlbnNlLCBjYWxsIAorCSAqICB0aGUgQyBjb2RlIHRvIHN5bmNocm9ueXplIHRhc2sgYWJvcnRzIAorCSAqICB3aXRoIFVOSVQgQVRURU5USU9OIGNvbmRpdGlvbnMuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoTUFTSyAoMCAsKEhGX1NFTlNFfEhGX0VYVF9FUlIpKSksCisJCVBBRERSX0EgKGNvbXBsZXRlX2Vycm9yKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENvcHkgdGhlIERTQSB0byB0aGUgRE9ORSBRVUVVRSBhbmQgCisJICogIHNpZ25hbCBjb21wbGV0aW9uIHRvIHRoZSBob3N0LgorCSAqICBJZiB3ZSBhcmUgaW50ZXJydXB0ZWQgYmV0d2VlbiBET05FIAorCSAqICBhbmQgRE9ORV9FTkQsIHdlIG11c3QgcmVzZXQsIG90aGVyd2lzZSAKKwkgKiAgdGhlIGNvbXBsZXRlZCBDQ0IgbWF5IGJlIGxvc3QuCisJICovCisJU0NSX1NUT1JFX0FCUyAoZHNhLCA0KSwKKwkJUEFERFJfQiAoc2NyYXRjaCksCisJU0NSX0xPQURfQUJTIChkc2EsIDQpLAorCQlQQUREUl9CIChkb25lX3BvcyksCisJU0NSX0xPQURfQUJTIChzY3JhdGNoYSwgNCksCisJCVBBRERSX0IgKHNjcmF0Y2gpLAorCVNDUl9TVE9SRV9SRUwgKHNjcmF0Y2hhLCA0KSwKKwkJMCwKKwkvKgorCSAqICBUaGUgaW5zdHJ1Y3Rpb24gYmVsb3cgcmVhZHMgdGhlIERPTkUgUVVFVUUgbmV4dCAKKwkgKiAgZnJlZSBwb3NpdGlvbiBmcm9tIG1lbW9yeS4KKwkgKiAgSW4gYWRkaXRpb24gaXQgZW5zdXJlcyB0aGF0IGFsbCBQQ0kgcG9zdGVkIHdyaXRlcyAgCisJICogIGFyZSBmbHVzaGVkIGFuZCBzbyB0aGUgRFNBIHZhbHVlIG9mIHRoZSBkb25lIAorCSAqICBDQ0IgaXMgdmlzaWJsZSBieSB0aGUgQ1BVIGJlZm9yZSBJTlRGTFkgaXMgcmFpc2VkLgorCSAqLworCVNDUl9MT0FEX1JFTCAoc2NyYXRjaGEsIDQpLAorCQk0LAorCVNDUl9JTlRfRkxZLAorCQkwLAorCVNDUl9TVE9SRV9BQlMgKHNjcmF0Y2hhLCA0KSwKKwkJUEFERFJfQiAoZG9uZV9wb3MpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgRE9ORV9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IENPTVBMRVRFX0VSUk9SID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9MT0FEX0FCUyAoc2NyYXRjaGEsIDQpLAorCQlQQUREUl9CIChzdGFydHBvcyksCisJU0NSX0lOVCwKKwkJU0lSX0NPTVBMRVRFX0VSUk9SLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0FWRV9EUCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgQUNLIGltbWVkaWF0ZWx5LgorCSAqICBObyBuZWVkIHRvIGRlbGF5IGl0LgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCS8qCisJICogIEtlZXAgdHJhY2sgd2UgcmVjZWl2ZWQgYSBTQVZFIERQLCBzbyAKKwkgKiAgd2Ugd2lsbCBzd2l0Y2ggdG8gdGhlIG90aGVyIFBNIGNvbnRleHQgCisJICogIG9uIHRoZSBuZXh0IFBNIHNpbmNlIHRoZSBEUCBtYXkgcG9pbnQgCisJICogIHRvIHRoZSBjdXJyZW50IFBNIGNvbnRleHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX09SLCBIRl9EUF9TQVZFRCksCisJCTAsCisJLyoKKwkgKiAgU0FWRV9EUCBtZXNzYWdlOgorCSAqICBDb3B5IExBU1RQIHRvIFNBVkVQLgorCSAqLworCVNDUl9MT0FEX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJU0NSX1NUT1JFX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zYXZlcCksCisJLyoKKwkgKiAgQW50aWNpcGF0ZSB0aGUgTUVTU0FHRSBQSEFTRSBmb3IgCisJICogIHRoZSBESVNDT05ORUNUIG1lc3NhZ2UuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAobXNnX2luKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTVE9SRV9EUCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQ2xlYXIgQUNLIGltbWVkaWF0ZWx5LgorCSAqICBObyBuZWVkIHRvIGRlbGF5IGl0LgorCSAqLworCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCS8qCisJICogIENvcHkgU0FWRVAgdG8gTEFTVFAuCisJICovCisJU0NSX0xPQURfUkVMICAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zYXZlcCksCisJU0NSX1NUT1JFX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERJU0NPTk5FQ1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIERJU0NPTk5FQ1RpbmcgIC4uLgorCSAqCisJICogIGRpc2FibGUgdGhlICJ1bmV4cGVjdGVkIGRpc2Nvbm5lY3QiIGZlYXR1cmUsCisJICogIGFuZCByZW1vdmUgdGhlIEFDSyBzaWduYWwuCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDS3xTQ1JfQVROKSwKKwkJMCwKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgZGlzY29ubmVjdC4KKwkgKi8KKwlTQ1JfV0FJVF9ESVNDLAorCQkwLAorCS8qCisJICogIFN0YXR1cyBpczogRElTQ09OTkVDVEVELgorCSAqLworCVNDUl9MT0FEX1JFRyAoSFNfUkVHLCBIU19ESVNDT05ORUNUKSwKKwkJMCwKKwkvKgorCSAqICBTYXZlIGhvc3Qgc3RhdHVzLgorCSAqLworCVNDUl9TVE9SRV9SRUwgKHNjcjAsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5zdGF0dXMpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBJRExFID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBOb3RoaW5nIHRvIGRvPworCSAqICBTd2l0Y2ggdGhlIExFRCBvZmYgYW5kIHdhaXQgZm9yIHJlc2VsZWN0LgorCSAqICBXaWxsIGJlIHBhdGNoZWQgd2l0aCBhIE5PX09QIGlmIExFRAorCSAqICBub3QgbmVlZGVkIG9yIG5vdCBkZXNpcmVkLgorCSAqLworCVNDUl9SRUdfUkVHIChncHJlZywgU0NSX09SLCAweDAxKSwKKwkJMCwKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwlTQ1JfSlVNUFIsCisJCTgsCisjZW5kaWYKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFVOR0VUSk9CID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogIFNldCBJTU1FRElBVEUgQVJCSVRSQVRJT04sIGZvciB0aGUgbmV4dCB0aW1lLgorCSAqICBUaGlzIHdpbGwgZ2l2ZSB1cyBiZXR0ZXIgY2hhbmNlIHRvIHdpbiBhcmJpdHJhdGlvbiAKKwkgKiAgZm9yIHRoZSBqb2Igd2UganVzdCB3YW50ZWQgdG8gZG8uCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMSwgU0NSX09SLCBJQVJCKSwKKwkJMCwKKyNlbmRpZgorCS8qCisJICogIFdlIGFyZSBub3QgYWJsZSB0byByZXN0YXJ0IHRoZSBTQ1JJUFRTIGlmIHdlIGFyZSAKKwkgKiAgaW50ZXJydXB0ZWQgYW5kIHRoZXNlIGluc3RydWN0aW9uIGhhdmVuJ3QgYmVlbiAKKwkgKiAgYWxsIGV4ZWN1dGVkLiBCVFcsIHRoaXMgaXMgdmVyeSB1bmxpa2VseSB0byAKKwkgKiAgaGFwcGVuLCBidXQgd2UgY2hlY2sgdGhhdCBmcm9tIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0xPQURfUkVHIChkc2EsIDB4ZmYpLAorCQkwLAorCVNDUl9TVE9SRV9BQlMgKHNjcmF0Y2hhLCA0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxFQ1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisjaWZkZWYgU1lNX0NPTkZfVEFSR0VUX1JPTEVfU1VQUE9SVAorCS8qCisJICogIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gaW5pdGlhdG9yIG1vZGUuCisJICovCisJU0NSX0NMUiAoU0NSX1RSRyksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICBTbGVlcCB3YWl0aW5nIGZvciBhIHJlc2VsZWN0aW9uLgorCSAqLworCVNDUl9XQUlUX1JFU0VMLAorCQlQQUREUl9BKHN0YXJ0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMRUNURUQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFN3aXRjaCB0aGUgTEVEIG9uLgorCSAqICBXaWxsIGJlIHBhdGNoZWQgd2l0aCBhIE5PX09QIGlmIExFRAorCSAqICBub3QgbmVlZGVkIG9yIG5vdCBkZXNpcmVkLgorCSAqLworCVNDUl9SRUdfUkVHIChncHJlZywgU0NSX0FORCwgMHhmZSksCisJCTAsCisJLyoKKwkgKiAgbG9hZCB0aGUgdGFyZ2V0IGlkIGludG8gdGhlIHNkaWQKKwkgKi8KKwlTQ1JfUkVHX1NGQlIgKHNzaWQsIFNDUl9BTkQsIDB4OEYpLAorCQkwLAorCVNDUl9UT19SRUcgKHNkaWQpLAorCQkwLAorCS8qCisJICogIExvYWQgdGhlIHRhcmdldCBjb250cm9sIGJsb2NrIGFkZHJlc3MKKwkgKi8KKwlTQ1JfTE9BRF9BQlMgKGRzYSwgNCksCisJCVBBRERSX0IgKHRhcmd0YmwpLAorCVNDUl9TRkJSX1JFRyAoZHNhLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoZHNhLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoZHNhLCBTQ1JfQU5ELCAweDNjKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUwgKGRzYSwgNCksCisJCTAsCisJLyoKKwkgKiAgV2UgZXhwZWN0IE1FU1NBR0UgSU4gcGhhc2UuCisJICogIElmIG5vdCwgZ2V0IGhlbHAgZnJvbSB0aGUgQyBjb2RlLgorCSAqLworCVNDUl9JTlQgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX0lOKSksCisJCVNJUl9SRVNFTF9OT19NU0dfSU4sCisJLyoKKwkgKiAgTG9hZCB0aGUgbGVnYWN5IHN5bmNocm9ub3VzIHRyYW5zZmVyIHJlZ2lzdGVycy4KKwkgKi8KKwlTQ1JfTE9BRF9SRUwgKHNjbnRsMywgMSksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fdGNiLCBoZWFkLnd2YWwpLAorCVNDUl9MT0FEX1JFTCAoc3hmZXIsIDEpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX3RjYiwgaGVhZC5zdmFsKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX1NDTlRMNCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFRoZSBDMTAxMCB1c2VzIGEgbmV3IHN5bmNocm9ub3VzIHRpbWluZyBzY2hlbWUuCisJICogIFdpbGwgYmUgcGF0Y2hlZCB3aXRoIGEgTk9fT1AgaWYgbm90IGEgQzEwMTAuCisJICovCisJU0NSX0xPQURfUkVMIChzY250bDQsIDEpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX3RjYiwgaGVhZC51dmFsKSwKKwkvKgorCSAqICBHZXQgdGhlIElERU5USUZZIG1lc3NhZ2UuCisJICovCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfSU4sCisJCUhBRERSXzEgKG1zZ2luKSwKKwkvKgorCSAqICBJZiBJREVOVElGWSBMVU4gIzAsIHVzZSBhIGZhc3RlciBwYXRoIAorCSAqICB0byBmaW5kIHRoZSBMQ0Igc3RydWN0dXJlLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLICgweDgwLCAweGJmKSksCisJCVBBRERSX0EgKHJlc2VsX2x1bjApLAorCS8qCisJICogIElmIG1lc3NhZ2UgaXNuJ3QgYW4gSURFTlRJRlksIAorCSAqICB0ZWxsIHRoZSBDIGNvZGUgYWJvdXQuCisJICovCisJU0NSX0lOVCBeIElGRkFMU0UgKE1BU0sgKDB4ODAsIDB4ODApKSwKKwkJU0lSX1JFU0VMX05PX0lERU5USUZZLAorCS8qCisJICogIEl0IGlzIGFuIElERU5USUZZIG1lc3NhZ2UsCisJICogIExvYWQgdGhlIExVTiBjb250cm9sIGJsb2NrIGFkZHJlc3MuCisJICovCisJU0NSX0xPQURfUkVMIChkc2EsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX3RjYiwgaGVhZC5sdW50Ymxfc2EpLAorCVNDUl9TRkJSX1JFRyAoZHNhLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoZHNhLCBTQ1JfU0hMLCAwKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAoZHNhLCBTQ1JfQU5ELCAweGZjKSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUwgKGRzYSwgNCksCisJCTAsCisJU0NSX0pVTVBSLAorCQk4LAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfTFVOMCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTFVOIDAgc3BlY2lhbCBjYXNlIChidXQgdXN1YWwgb25lIDopKQorCSAqLworCVNDUl9MT0FEX1JFTCAoZHNhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV90Y2IsIGhlYWQubHVuMF9zYSksCisJLyoKKwkgKiAgSnVtcCBpbmRpcmVjdGx5IHRvIHRoZSByZXNlbGVjdCBhY3Rpb24gZm9yIHRoaXMgTFVOLgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fbGNiLCBoZWFkLnJlc2VsX3NhKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorCS8qIEluIG5vcm1hbCBzaXR1YXRpb25zLCB3ZSBqdW1wIHRvIFJFU0VMX1RBRyBvciBSRVNFTF9OT19UQUcgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX1RBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEFDSyB0aGUgSURFTlRJRlkgcHJldmlvdXNseSByZWNlaXZlZC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBJdCBzaGFsbCBiZSBhIHRhZ2dlZCBjb21tYW5kLgorCSAqICBSZWFkIFNJTVBMRStUQUcuCisJICogIFRoZSBDIGNvZGUgd2lsbCBkZWFsIHdpdGggZXJyb3JzLgorCSAqICBBZ3Jlc3NpdmUgb3B0aW1pemF0aW9uLCBpcydudCBpdD8gOikKKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDIpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW4pLAorCS8qCisJICogIExvYWQgdGhlIHBvaW50ZXIgdG8gdGhlIHRhZ2dlZCB0YXNrIAorCSAqICB0YWJsZSBmb3IgdGhpcyBMVU4uCisJICovCisJU0NSX0xPQURfUkVMIChkc2EsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2xjYiwgaGVhZC5pdGxxX3RibF9zYSksCisJLyoKKwkgKiAgVGhlIFNJREwgc3RpbGwgY29udGFpbnMgdGhlIFRBRyB2YWx1ZS4KKwkgKiAgQWdyZXNzaXZlIG9wdGltaXphdGlvbiwgaXNuJ3QgaXQ/IDopOikKKwkgKi8KKwlTQ1JfUkVHX1NGQlIgKHNpZGwsIFNDUl9TSEwsIDApLAorCQkwLAorI2lmIFNZTV9DT05GX01BWF9UQVNLKjQgPiA1MTIKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChDQVJSWVNFVCksCisJCTgsCisJU0NSX1JFR19SRUcgKGRzYTEsIFNDUl9PUiwgMiksCisJCTAsCisJU0NSX1JFR19SRUcgKHNmYnIsIFNDUl9TSEwsIDApLAorCQkwLAorCVNDUl9KVU1QUiBeIElGRkFMU0UgKENBUlJZU0VUKSwKKwkJOCwKKwlTQ1JfUkVHX1JFRyAoZHNhMSwgU0NSX09SLCAxKSwKKwkJMCwKKyNlbGlmIFNZTV9DT05GX01BWF9UQVNLKjQgPiAyNTYKKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChDQVJSWVNFVCksCisJCTgsCisJU0NSX1JFR19SRUcgKGRzYTEsIFNDUl9PUiwgMSksCisJCTAsCisjZW5kaWYKKwkvKgorCSAqICBSZXRyaWV2ZSB0aGUgRFNBIG9mIHRoaXMgdGFzay4KKwkgKiAgSlVNUCBpbmRpcmVjdGx5IHRvIHRoZSByZXN0YXJ0IHBvaW50IG9mIHRoZSBDQ0IuCisJICovCisJU0NSX1NGQlJfUkVHIChkc2EsIFNDUl9BTkQsIDB4ZmMpLAorCQkwLAorCVNDUl9MT0FEX1JFTCAoZHNhLCA0KSwKKwkJMCwKKwlTQ1JfTE9BRF9SRUwgKHRlbXAsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLmdvLnJlc3RhcnQpLAorCVNDUl9SRVRVUk4sCisJCTAsCisJLyogSW4gbm9ybWFsIHNpdHVhdGlvbnMgd2UgYnJhbmNoIHRvIFJFU0VMX0RTQSAqLworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRUxfRFNBID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQUNLIHRoZSBJREVOVElGWSBvciBUQUcgcHJldmlvdXNseSByZWNlaXZlZC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX0RTQTEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogICAgICBJbml0aWFsaXplIHRoZSBzdGF0dXMgcmVnaXN0ZXJzCisJICovCisJU0NSX0xPQURfUkVMIChzY3IwLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQuc3RhdHVzKSwKKwkvKgorCSAqICBKdW1wIHRvIGRpc3BhdGNoZXIuCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFJFU0VMX05PX1RBRyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIExvYWQgdGhlIERTQSB3aXRoIHRoZSB1bmlxdWUgSVRMIHRhc2suCisJICovCisJU0NSX0xPQURfUkVMIChkc2EsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2xjYiwgaGVhZC5pdGxfdGFza19zYSksCisJLyoKKwkgKiAgSlVNUCBpbmRpcmVjdGx5IHRvIHRoZSByZXN0YXJ0IHBvaW50IG9mIHRoZSBDQ0IuCisJICovCisJU0NSX0xPQURfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5nby5yZXN0YXJ0KSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorCS8qIEluIG5vcm1hbCBzaXR1YXRpb25zIHdlIGJyYW5jaCB0byBSRVNFTF9EU0EgKi8KK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworLyoKKyAqICBCZWNhdXNlIHRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisgKiAgI2RlZmluZSBTWU1fQ09ORl9NQVhfU0cgcGFyYW1ldGVyLAorICogIGl0IGlzIGZpbGxlZCBpbiBhdCBydW50aW1lLgorICoKKyAqICAjIz09PT09PT09PT09PCBpPTA7IGk8U1lNX0NPTkZfTUFYX1NHID49PT09PT09PT0KKyAqICB8fAlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisgKiAgfHwJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgZGF0YVsgaV0pLAorICogICMjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKzAKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfSU4yID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9DQUxMLAorCQlQQUREUl9BIChkYXRhaV9kb25lKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09VVCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKy8qCisgKiAgQmVjYXVzZSB0aGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorICogICNkZWZpbmUgU1lNX0NPTkZfTUFYX1NHIHBhcmFtZXRlciwKKyAqICBpdCBpcyBmaWxsZWQgaW4gYXQgcnVudGltZS4KKyAqCisgKiAgIyM9PT09PT09PT09PTwgaT0wOyBpPFNZTV9DT05GX01BWF9TRyA+PT09PT09PT09CisgKiAgfHwJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX09VVCwKKyAqICB8fAkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBkYXRhWyBpXSksCisgKiAgIyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworMAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVVQyID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0NBTEwsCisJCVBBRERSX0EgKGRhdGFvX2RvbmUpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMF9EQVRBID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFJlYWQgb3VyIGhvc3QgZmxhZ3MgdG8gU0ZCUiwgc28gd2Ugd2lsbCBiZSBhYmxlIAorCSAqICB0byBjaGVjayBhZ2FpbnN0IHRoZSBkYXRhIGRpcmVjdGlvbiB3ZSBleHBlY3QuCisJICovCisJU0NSX0ZST01fUkVHIChIRl9SRUcpLAorCQkwLAorCS8qCisJICogIENoZWNrIGFnYWluc3QgYWN0dWFsIERBVEEgUEhBU0UuCisJICovCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQlQQUREUl9BIChwbTBfZGF0YV9vdXQpLAorCS8qCisJICogIEFjdHVhbCBwaGFzZSBpcyBEQVRBIElOLgorCSAqICBDaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKE1BU0sgKEhGX0RBVEFfSU4sIEhGX0RBVEFfSU4pKSwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCisJLyoKKwkgKiAgS2VlcCB0cmFjayB3ZSBhcmUgbW92aW5nIGRhdGEgZnJvbSB0aGUgCisJICogIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9PUiwgSEZfSU5fUE0wKSwKKwkJMCwKKwkvKgorCSAqICBNb3ZlIHRoZSBkYXRhIHRvIG1lbW9yeS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAuc2cpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChwbTBfZGF0YV9lbmQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0wX0RBVEFfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQWN0dWFsIHBoYXNlIGlzIERBVEEgT1VULgorCSAqICBDaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRpcmVjdGlvbi4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoSEZfREFUQV9JTiwgSEZfREFUQV9JTikpLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIGFyZSBtb3ZpbmcgZGF0YSBmcm9tIHRoZSAKKwkgKiAgUE0wIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX09SLCBIRl9JTl9QTTApLAorCQkwLAorCS8qCisJICogIE1vdmUgdGhlIGRhdGEgZnJvbSBtZW1vcnkuCisJICovCisJU0NSX0NITU9WX1RCTCBeIFNDUl9EQVRBX09VVCwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMC5zZyksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTBfREFUQV9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciB0aGUgZmxhZyB0aGF0IHRvbGQgd2Ugd2VyZSBtb3ZpbmcgIAorCSAqICBkYXRhIGZyb20gdGhlIFBNMCBEQVRBIG1pbmktc2NyaXB0LgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9BTkQsICh+SEZfSU5fUE0wKSksCisJCTAsCisJLyoKKwkgKiAgUmV0dXJuIHRvIHRoZSBwcmV2aW91cyBEQVRBIHNjcmlwdCB3aGljaCAKKwkgKiAgaXMgZ3VhcmFudGVlZCBieSBkZXNpZ24gKGlmIG5vIGJ1ZykgdG8gYmUgCisJICogIHRoZSBtYWluIERBVEEgc2NyaXB0IGZvciB0aGlzIHRyYW5zZmVyLgorCSAqLworCVNDUl9MT0FEX1JFTCAodGVtcCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAucmV0KSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0xX0RBVEEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgUmVhZCBvdXIgaG9zdCBmbGFncyB0byBTRkJSLCBzbyB3ZSB3aWxsIGJlIGFibGUgCisJICogIHRvIGNoZWNrIGFnYWluc3QgdGhlIGRhdGEgZGlyZWN0aW9uIHdlIGV4cGVjdC4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKEhGX1JFRyksCisJCTAsCisJLyoKKwkgKiAgQ2hlY2sgYWdhaW5zdCBhY3R1YWwgREFUQSBQSEFTRS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX0lOKSksCisJCVBBRERSX0EgKHBtMV9kYXRhX291dCksCisJLyoKKwkgKiAgQWN0dWFsIHBoYXNlIGlzIERBVEEgSU4uCisJICogIENoZWNrIGFnYWluc3QgZXhwZWN0ZWQgZGlyZWN0aW9uLgorCSAqLworCVNDUl9KVU1QIF4gSUZGQUxTRSAoTUFTSyAoSEZfREFUQV9JTiwgSEZfREFUQV9JTikpLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKKwkvKgorCSAqICBLZWVwIHRyYWNrIHdlIGFyZSBtb3ZpbmcgZGF0YSBmcm9tIHRoZSAKKwkgKiAgUE0xIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX09SLCBIRl9JTl9QTTEpLAorCQkwLAorCS8qCisJICogIE1vdmUgdGhlIGRhdGEgdG8gbWVtb3J5LgorCSAqLworCVNDUl9DSE1PVl9UQkwgXiBTQ1JfREFUQV9JTiwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5zZyksCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKHBtMV9kYXRhX2VuZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTFfREFUQV9PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBBY3R1YWwgcGhhc2UgaXMgREFUQSBPVVQuCisJICogIENoZWNrIGFnYWluc3QgZXhwZWN0ZWQgZGlyZWN0aW9uLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLIChIRl9EQVRBX0lOLCBIRl9EQVRBX0lOKSksCisJCVBBRERSX0IgKGRhdGFfb3ZydW4pLAorCS8qCisJICogIEtlZXAgdHJhY2sgd2UgYXJlIG1vdmluZyBkYXRhIGZyb20gdGhlIAorCSAqICBQTTEgREFUQSBtaW5pLXNjcmlwdC4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoSEZfUkVHLCBTQ1JfT1IsIEhGX0lOX1BNMSksCisJCTAsCisJLyoKKwkgKiAgTW92ZSB0aGUgZGF0YSBmcm9tIG1lbW9yeS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfT1VULAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0xLnNnKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNMV9EQVRBX0VORCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIHRoZSBmbGFnIHRoYXQgdG9sZCB3ZSB3ZXJlIG1vdmluZyAgCisJICogIGRhdGEgZnJvbSB0aGUgUE0xIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX1JFR19SRUcgKEhGX1JFRywgU0NSX0FORCwgKH5IRl9JTl9QTTEpKSwKKwkJMCwKKwkvKgorCSAqICBSZXR1cm4gdG8gdGhlIHByZXZpb3VzIERBVEEgc2NyaXB0IHdoaWNoIAorCSAqICBpcyBndWFyYW50ZWVkIGJ5IGRlc2lnbiAoaWYgbm8gYnVnKSB0byBiZSAKKwkgKiAgdGhlIG1haW4gREFUQSBzY3JpcHQgZm9yIHRoaXMgdHJhbnNmZXIuCisJICovCisJU0NSX0xPQURfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5yZXQpLAorCVNDUl9SRVRVUk4sCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9OworCitzdGF0aWMgc3RydWN0IFNZTV9GV0JfU0NSIFNZTV9GV0JfU0NSID0geworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU1RBUlQ2NCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyB7CisJLyoKKwkgKiAgU0NSSVBUIGVudHJ5IHBvaW50IGZvciB0aGUgODk1QSwgODk2IGFuZCAxMDEwLgorCSAqICBGb3Igbm93LCB0aGVyZSBpcyBubyBzcGVjaWZpYyBzdHVmZiBmb3IgdGhvc2UgCisJICogIGNoaXBzIGF0IHRoaXMgcG9pbnQsIGJ1dCB0aGlzIG1heSBjb21lLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChpbml0KSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5PX0RBVEEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTF9GT1JfQUJPUlQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFdlIGFyZSBqdW1wZWQgaGVyZSBieSB0aGUgQyBjb2RlLCBpZiB3ZSBoYXZlIAorCSAqICBzb21lIHRhcmdldCB0byByZXNldCBvciBzb21lIGRpc2Nvbm5lY3RlZCAKKwkgKiAgam9iIHRvIGFib3J0LiBTaW5jZSBlcnJvciByZWNvdmVyeSBpcyBhIHNlcmlvdXMgCisJICogIGJ1c3luZXNzLCB3ZSB3aWxsIHJlYWxseSByZXNldCB0aGUgU0NTSSBCVVMsIGlmIAorCSAqICBjYXNlIG9mIGEgU0NTSSBpbnRlcnJ1cHQgb2NjdXJyaW5nIGluIHRoaXMgcGF0aC4KKwkgKi8KKyNpZmRlZiBTWU1fQ09ORl9UQVJHRVRfUk9MRV9TVVBQT1JUCisJLyoKKwkgKiAgU2V0IGluaXRpYXRvciBtb2RlLgorCSAqLworCVNDUl9DTFIgKFNDUl9UUkcpLAorCQkwLAorI2VuZGlmCisJLyoKKwkgKiAgICAgIEFuZCB0cnkgdG8gc2VsZWN0IHRoaXMgdGFyZ2V0LgorCSAqLworCVNDUl9TRUxfVEJMX0FUTiBeIG9mZnNldG9mIChzdHJ1Y3Qgc3ltX2hjYiwgYWJydF9zZWwpLAorCQlQQUREUl9BIChyZXNlbGVjdCksCisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIHNlbGVjdGlvbiB0byBjb21wbGV0ZSBvciAKKwkgKiAgdGhlIHNlbGVjdGlvbiB0byB0aW1lIG91dC4KKwkgKi8KKwlTQ1JfSlVNUFIgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQktOCwKKwkvKgorCSAqICBDYWxsIHRoZSBDIGNvZGUuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1RBUkdFVF9TRUxFQ1RFRCwKKwkvKgorCSAqICBUaGUgQyBjb2RlIHNob3VsZCBsZXQgdXMgY29udGludWUgaGVyZS4gCisJICogIFNlbmQgdGhlICdraXNzIG9mIGRlYXRoJyBtZXNzYWdlLgorCSAqICBXZSBleHBlY3QgYW4gaW1tZWRpYXRlIGRpc2Nvbm5lY3Qgb25jZSAKKwkgKiAgdGhlIHRhcmdldCBoYXMgZWF0ZW4gdGhlIG1lc3NhZ2UuCisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX01PVkVfVEJMIF4gU0NSX01TR19PVVQsCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2hjYiwgYWJydF90YmwpLAorCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJU0NSX1dBSVRfRElTQywKKwkJMCwKKwkvKgorCSAqICBUZWxsIHRoZSBDIGNvZGUgdGhhdCB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfQUJPUlRfU0VOVCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTF9GT1JfQUJPUlRfMSA+LS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIEp1bXAgYXQgc2NoZWR1bGVyLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9BIChzdGFydCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfSU5fRVRDID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBJZiBpdCBpcyBhbiBFWFRFTkRFRCAodmFyaWFibGUgc2l6ZSBtZXNzYWdlKQorCSAqICBIYW5kbGUgaXQuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKERBVEEgKE1fRVhURU5ERUQpKSwKKwkJUEFERFJfQiAobXNnX2V4dGVuZGVkKSwKKwkvKgorCSAqICBMZXQgdGhlIEMgY29kZSBoYW5kbGUgYW55IG90aGVyIAorCSAqICAxIGJ5dGUgbWVzc2FnZS4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoMHgwMCwgMHhmMCkpLAorCQlQQUREUl9CIChtc2dfcmVjZWl2ZWQpLAorCVNDUl9KVU1QIF4gSUZUUlVFIChNQVNLICgweDEwLCAweGYwKSksCisJCVBBRERSX0IgKG1zZ19yZWNlaXZlZCksCisJLyoKKwkgKiAgV2UgZG9ubm90IGhhbmRsZSAyIGJ5dGVzIG1lc3NhZ2VzIGZyb20gU0NSSVBUUy4KKwkgKiAgU28sIGxldCB0aGUgQyBjb2RlIGRlYWwgd2l0aCB0aGVzZSBvbmVzIHRvby4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGRkFMU0UgKE1BU0sgKDB4MjAsIDB4ZjApKSwKKwkJUEFERFJfQiAobXNnX3dlaXJkX3NlZW4pLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChtc2dpblsxXSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfUkVDRUlWRUQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfTE9BRF9SRUwgKHNjcmF0Y2hhLCA0KSwJLyogRFVNTVkgUkVBRCAqLworCQkwLAorCVNDUl9JTlQsCisJCVNJUl9NU0dfUkVDRUlWRUQsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfV0VJUkRfU0VFTiA+LS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfTE9BRF9SRUwgKHNjcmF0Y2hhLCA0KSwJLyogRFVNTVkgUkVBRCAqLworCQkwLAorCVNDUl9JTlQsCisJCVNJUl9NU0dfV0VJUkQsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfRVhURU5ERUQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDbGVhciBBQ0sgYW5kIGdldCB0aGUgbmV4dCBieXRlIAorCSAqICBhc3N1bWVkIHRvIGJlIHRoZSBtZXNzYWdlIGxlbmd0aC4KKwkgKi8KKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19JTiwKKwkJSEFERFJfMSAobXNnaW5bMV0pLAorCS8qCisJICogIFRyeSB0byBjYXRjaCBzb21lIHVubGlrZWx5IHNpdHVhdGlvbnMgYXMgMCBsZW5ndGggCisJICogIG9yIHRvbyBsYXJnZSB0aGUgbGVuZ3RoLgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChEQVRBICgwKSksCisJCVBBRERSX0IgKG1zZ193ZWlyZF9zZWVuKSwKKwlTQ1JfVE9fUkVHIChzY3JhdGNoYSksCisJCTAsCisJU0NSX1JFR19SRUcgKHNmYnIsIFNDUl9BREQsICgyNTYtOCkpLAorCQkwLAorCVNDUl9KVU1QIF4gSUZUUlVFIChDQVJSWVNFVCksCisJCVBBRERSX0IgKG1zZ193ZWlyZF9zZWVuKSwKKwkvKgorCSAqICBXZSBkb25ub3QgaGFuZGxlIGV4dGVuZGVkIG1lc3NhZ2VzIGZyb20gU0NSSVBUUy4KKwkgKiAgUmVhZCB0aGUgYW1vdW50IG9mIGRhdGEgY29ycmVwb25kaW5nIHRvIHRoZSAKKwkgKiAgbWVzc2FnZSBsZW5ndGggYW5kIGNhbGwgdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMIChzY3JhdGNoYSwgMSksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgc21zZ19leHQuc2l6ZSksCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX01PVkVfVEJMIF4gU0NSX01TR19JTiwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fZHNiLCBzbXNnX2V4dCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKG1zZ19yZWNlaXZlZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfQkFEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICB1bmltcGxlbWVudGVkIG1lc3NhZ2UgLSByZWplY3QgaXQuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFSkVDVF9UT19TRU5ELAorCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChjbHJhY2spLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX1dFSVJEID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgd2VpcmQgbWVzc2FnZSByZWNlaXZlZAorCSAqICBpZ25vcmUgYWxsIE1TRyBJTiBwaGFzZXMgYW5kIHJlamVjdCBpdC4KKwkgKi8KKwlTQ1JfSU5ULAorCQlTSVJfUkVKRUNUX1RPX1NFTkQsCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfV0VJUkQxID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfSU4pKSwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorCVNDUl9NT1ZFX0FCUyAoMSkgXiBTQ1JfTVNHX0lOLAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX3dlaXJkMSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBXRFRSX1JFU1AgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBsZXQgdGhlIHRhcmdldCBmZXRjaCBvdXIgYW5zd2VyLgorCSAqLworCVNDUl9TRVQgKFNDUl9BVE4pLAorCQkwLAorCVNDUl9DTFIgKFNDUl9BQ0spLAorCQkwLAorCVNDUl9KVU1QIF4gSUZGQUxTRSAoV0hFTiAoU0NSX01TR19PVVQpKSwKKwkJUEFERFJfQiAobmVnb19iYWRfcGhhc2UpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0VORF9XRFRSID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgU2VuZCB0aGUgTV9YX1dJREVfUkVRCisJICovCisJU0NSX01PVkVfQUJTICg0KSBeIFNDUl9NU0dfT1VULAorCQlIQUREUl8xIChtc2dvdXQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChtc2dfb3V0X2RvbmUpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU0RUUl9SRVNQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgbGV0IHRoZSB0YXJnZXQgZmV0Y2ggb3VyIGFuc3dlci4KKwkgKi8KKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwlTQ1JfSlVNUCBeIElGRkFMU0UgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG5lZ29fYmFkX3BoYXNlKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNFTkRfU0RUUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFNlbmQgdGhlIE1fWF9TWU5DX1JFUQorCSAqLworCVNDUl9NT1ZFX0FCUyAoNSkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX291dF9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBQUl9SRVNQID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIGxldCB0aGUgdGFyZ2V0IGZldGNoIG91ciBhbnN3ZXIuCisJICovCisJU0NSX1NFVCAoU0NSX0FUTiksCisJCTAsCisJU0NSX0NMUiAoU0NSX0FDSyksCisJCTAsCisJU0NSX0pVTVAgXiBJRkZBTFNFIChXSEVOIChTQ1JfTVNHX09VVCkpLAorCQlQQUREUl9CIChuZWdvX2JhZF9waGFzZSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTRU5EX1BQUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBTZW5kIHRoZSBNX1hfUFBSX1JFUQorCSAqLworCVNDUl9NT1ZFX0FCUyAoOCkgXiBTQ1JfTVNHX09VVCwKKwkJSEFERFJfMSAobXNnb3V0KSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAobXNnX291dF9kb25lKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IE5FR09fQkFEX1BIQVNFID4tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9JTlQsCisJCVNJUl9ORUdPX1BST1RPLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBNU0dfT1VUID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBUaGUgdGFyZ2V0IHJlcXVlc3RzIGEgbWVzc2FnZS4KKwkgKiAgV2UgZG9ubm90IHNlbmQgbWVzc2FnZXMgdGhhdCBtYXkgCisJICogIHJlcXVpcmUgdGhlIGRldmljZSB0byBnbyB0byBidXMgZnJlZS4KKwkgKi8KKwlTQ1JfTU9WRV9BQlMgKDEpIF4gU0NSX01TR19PVVQsCisJCUhBRERSXzEgKG1zZ291dCksCisJLyoKKwkgKiAgLi4uIHdhaXQgZm9yIHRoZSBuZXh0IHBoYXNlCisJICogIGlmIGl0J3MgYSBtZXNzYWdlIG91dCwgc2VuZCBpdCBhZ2FpbiwgLi4uCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKFdIRU4gKFNDUl9NU0dfT1VUKSksCisJCVBBRERSX0IgKG1zZ19vdXQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgTVNHX09VVF9ET05FID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTGV0IHRoZSBDIGNvZGUgYmUgYXdhcmUgb2YgdGhlIAorCSAqICBzZW50IG1lc3NhZ2UgYW5kIGNsZWFyIHRoZSBtZXNzYWdlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9NU0dfT1VUX0RPTkUsCisJLyoKKwkgKiAgLi4uIGFuZCBwcm9jZXNzIHRoZSBuZXh0IHBoYXNlCisJICovCisJU0NSX0pVTVAsCisJCVBBRERSX0EgKGRpc3BhdGNoKSwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERBVEFfT1ZSVU4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFVzZSBzY3JhdGNoYSB0byBjb3VudCB0aGUgZXh0cmEgYnl0ZXMuCisJICovCisJU0NSX0xPQURfQUJTIChzY3JhdGNoYSwgNCksCisJCVBBRERSX0IgKHplcm8pLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9PVlJVTjEgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGhlIHRhcmdldCBtYXkgd2FudCB0byB0cmFuc2ZlciB0b28gbXVjaCBkYXRhLgorCSAqCisJICogIElmIHBoYXNlIGlzIERBVEEgT1VUIHdyaXRlIDEgYnl0ZSBhbmQgY291bnQgaXQuCisJICovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoV0hFTiAoU0NSX0RBVEFfT1VUKSksCisJCTE2LAorCVNDUl9DSE1PVl9BQlMgKDEpIF4gU0NSX0RBVEFfT1VULAorCQlIQUREUl8xIChzY3JhdGNoKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1bjIpLAorCS8qCisJICogIElmIFdTUiBpcyBzZXQsIGNsZWFyIHRoaXMgY29uZGl0aW9uLCBhbmQgCisJICogIGNvdW50IHRoaXMgYnl0ZS4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoTUFTSyAoV1NSLCBXU1IpKSwKKwkJMTYsCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX09SLCBXU1IpLAorCQkwLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuMiksCisJLyoKKwkgKiAgRmluYWxseSBjaGVjayBhZ2FpbnN0IERBVEEgSU4gcGhhc2UuCisJICogIFNpZ25hbCBkYXRhIG92ZXJydW4gdG8gdGhlIEMgY29kZSAKKwkgKiAgYW5kIGp1bXAgdG8gZGlzcGF0Y2hlciBpZiBub3Qgc28uCisJICogIFJlYWQgMSBieXRlIG90aGVyd2lzZSBhbmQgY291bnQgaXQuCisJICovCisJU0NSX0pVTVBSIF4gSUZUUlVFIChXSEVOIChTQ1JfREFUQV9JTikpLAorCQkxNiwKKwlTQ1JfSU5ULAorCQlTSVJfREFUQV9PVkVSUlVOLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCisJU0NSX0NITU9WX0FCUyAoMSkgXiBTQ1JfREFUQV9JTiwKKwkJSEFERFJfMSAoc2NyYXRjaCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX09WUlVOMiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBDb3VudCB0aGlzIGJ5dGUuCisJICogIFRoaXMgd2lsbCBhbGxvdyB0byByZXR1cm4gYSBuZWdhdGl2ZSAKKwkgKiAgcmVzaWR1YWwgdG8gdXNlci4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGEsICBTQ1JfQURELCAgMHgwMSksCisJCTAsCisJU0NSX1JFR19SRUcgKHNjcmF0Y2hhMSwgU0NSX0FEREMsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHIChzY3JhdGNoYTIsIFNDUl9BRERDLCAwKSwKKwkJMCwKKwkvKgorCSAqICAuLiBhbmQgcmVwZWF0IGFzIHJlcXVpcmVkLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9CIChkYXRhX292cnVuMSksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBBQk9SVF9SRVNFTCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfQ0xSIChTQ1JfQUNLKSwKKwkJMCwKKwkvKgorCSAqICBzZW5kIHRoZSBhYm9ydC9hYm9ydGFnL3Jlc2V0IG1lc3NhZ2UKKwkgKiAgd2UgZXhwZWN0IGFuIGltbWVkaWF0ZSBkaXNjb25uZWN0CisJICovCisJU0NSX1JFR19SRUcgKHNjbnRsMiwgU0NSX0FORCwgMHg3ZiksCisJCTAsCisJU0NSX01PVkVfQUJTICgxKSBeIFNDUl9NU0dfT1VULAorCQlIQUREUl8xIChtc2dvdXQpLAorCVNDUl9DTFIgKFNDUl9BQ0t8U0NSX0FUTiksCisJCTAsCisJU0NSX1dBSVRfRElTQywKKwkJMCwKKwlTQ1JfSU5ULAorCQlTSVJfUkVTRUxfQUJPUlRFRCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc3RhcnQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUkVTRU5EX0lERU5UID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgVGhlIHRhcmdldCBzdGF5cyBpbiBNU0cgT1VUIHBoYXNlIGFmdGVyIGhhdmluZyBhY2tlZCAKKwkgKiAgSWRlbnRpZnkgWysgVGFnIFsrIEV4dGVuZGVkIG1lc3NhZ2UgXV0uIFRhcmdldHMgc2hhbGwKKwkgKiAgYmVoYXZlIHRoaXMgd2F5IG9uIHBhcml0eSBlcnJvci4KKwkgKiAgV2UgbXVzdCBzZW5kIGl0IGFnYWluIGFsbCB0aGUgbWVzc2FnZXMuCisJICovCisJU0NSX1NFVCAoU0NSX0FUTiksIC8qIFNoYWxsIGJlIGFzc2VydGVkIDIgZGVza2V3IGRlbGF5cyBiZWZvcmUgdGhlICAqLworCQkwLCAgICAgICAgIC8qIDFyc3QgQUNLID0gOTAgbnMuIEhvcGUgdGhlIGNoaXAgaXNuJ3QgdG9vIGZhc3QgKi8KKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc2VuZF9pZGVudCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBJREVOVF9CUkVBSyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0xSIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc2VsZWN0MiksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBJREVOVF9CUkVBS19BVE4gPi0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfU0VUIChTQ1JfQVROKSwKKwkJMCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoc2VsZWN0MiksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTREFUQV9JTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2RzYiwgc2Vuc2UpLAorCVNDUl9DQUxMLAorCQlQQUREUl9BIChkYXRhaV9kb25lKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoZGF0YV9vdnJ1biksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBSRVNFTF9CQURfTFVOID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBNZXNzYWdlIGlzIGFuIElERU5USUZZLCBidXQgbHVuIGlzIHVua25vd24uCisJICogIFNpZ25hbCBwcm9ibGVtIHRvIEMgY29kZSBmb3IgbG9nZ2luZyB0aGUgZXZlbnQuCisJICogIFNlbmQgYSBNX0FCT1JUIHRvIGNsZWFyIGFsbCBwZW5kaW5nIHRhc2tzLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfTFVOLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChhYm9ydF9yZXNlbCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBCQURfSV9UX0wgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBXZSBkb25ub3QgaGF2ZSBhIHRhc2sgZm9yIHRoYXQgSV9UX0wuCisJICogIFNpZ25hbCBwcm9ibGVtIHRvIEMgY29kZSBmb3IgbG9nZ2luZyB0aGUgZXZlbnQuCisJICogIFNlbmQgYSBNX0FCT1JUIG1lc3NhZ2UuCisJICovCisJU0NSX0lOVCwKKwkJU0lSX1JFU0VMX0JBRF9JX1RfTCwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoYWJvcnRfcmVzZWwpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX0lfVF9MX1EgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2UgZG9ubm90IGhhdmUgYSB0YXNrIHRoYXQgbWF0Y2hlcyB0aGUgdGFnLgorCSAqICBTaWduYWwgcHJvYmxlbSB0byBDIGNvZGUgZm9yIGxvZ2dpbmcgdGhlIGV2ZW50LgorCSAqICBTZW5kIGEgTV9BQk9SVFRBRyBtZXNzYWdlLgorCSAqLworCVNDUl9JTlQsCisJCVNJUl9SRVNFTF9CQURfSV9UX0xfUSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQiAoYWJvcnRfcmVzZWwpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgQkFEX1NUQVRVUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQW55dGhpbmcgZGlmZmVyZW50IGZyb20gSU5URVJNRURJQVRFIAorCSAqICBDT05ESVRJT04gTUVUIHNob3VsZCBiZSBhIGJhZCBTQ1NJIHN0YXR1cywgCisJICogIGdpdmVuIHRoYXQgR09PRCBzdGF0dXMgaGFzIGFscmVhZHkgYmVlbiB0ZXN0ZWQuCisJICogIENhbGwgdGhlIEMgY29kZS4KKwkgKi8KKwlTQ1JfTE9BRF9BQlMgKHNjcmF0Y2hhLCA0KSwKKwkJUEFERFJfQiAoc3RhcnRwb3MpLAorCVNDUl9JTlQgXiBJRkZBTFNFIChEQVRBIChTX0NPTkRfTUVUKSksCisJCVNJUl9CQURfU0NTSV9TVEFUVVMsCisJU0NSX1JFVFVSTiwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNX0hBTkRMRSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIFBoYXNlIG1pc21hdGNoIGhhbmRsaW5nLgorCSAqCisJICogIFNpbmNlIHdlIGhhdmUgdG8gZGVhbCB3aXRoIDIgU0NTSSBkYXRhIHBvaW50ZXJzICAKKwkgKiAgKGN1cnJlbnQgYW5kIHNhdmVkKSwgd2UgbmVlZCBhdCBsZWFzdCAyIGNvbnRleHRzLgorCSAqICBFYWNoIGNvbnRleHQgKHBtMCBhbmQgcG0xKSBoYXMgYSBzYXZlZCBhcmVhLCBhIAorCSAqICBTQVZFIG1pbmktc2NyaXB0IGFuZCBhIERBVEEgcGhhc2UgbWluaS1zY3JpcHQuCisJICovCisJLyoKKwkgKiAgR2V0IHRoZSBQTSBoYW5kbGluZyBmbGFncy4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKEhGX1JFRyksCisJCTAsCisJLyoKKwkgKiAgSWYgbm8gZmxhZ3MgKDFyc3QgUE0gZm9yIGV4YW1wbGUpLCBhdm9pZCAKKwkgKiAgYWxsIHRoZSBiZWxvdyBoZWF2eSBmbGFncyB0ZXN0aW5nLgorCSAqICBUaGlzIG1ha2VzIHRoZSBub3JtYWwgY2FzZSBhIGJpdCBmYXN0ZXIuCisJICovCisJU0NSX0pVTVAgXiBJRlRSVUUgKE1BU0sgKDAsIChIRl9JTl9QTTAgfCBIRl9JTl9QTTEgfCBIRl9EUF9TQVZFRCkpKSwKKwkJUEFERFJfQiAocG1faGFuZGxlMSksCisJLyoKKwkgKiAgSWYgd2UgcmVjZWl2ZWQgYSBTQVZFIERQLCBzd2l0Y2ggdG8gdGhlIAorCSAqICBvdGhlciBQTSBjb250ZXh0IHNpbmNlIHRoZSBzYXZlcCBtYXkgcG9pbnQgCisJICogIHRvIHRoZSBjdXJyZW50IFBNIGNvbnRleHQuCisJICovCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoTUFTSyAoSEZfRFBfU0FWRUQsIEhGX0RQX1NBVkVEKSksCisJCTgsCisJU0NSX1JFR19SRUcgKHNmYnIsIFNDUl9YT1IsIEhGX0FDVF9QTSksCisJCTAsCisJLyoKKwkgKiAgSWYgd2UgaGF2ZSBiZWVuIGludGVycnVwdCBpbiBhIFBNIERBVEEgbWluaS1zY3JpcHQsCisJICogIHdlIHRha2UgdGhlIHJldHVybiBhZGRyZXNzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgCisJICogIHNhdmVkIGFyZWEuCisJICogIFRoaXMgZW5zdXJlIHRoZSByZXR1cm4gYWRkcmVzcyBhbHdheXMgcG9pbnRzIHRvIHRoZSAKKwkgKiAgbWFpbiBEQVRBIHNjcmlwdCBmb3IgdGhpcyB0cmFuc2Zlci4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoMCwgKEhGX0lOX1BNMCB8IEhGX0lOX1BNMSkpKSwKKwkJUEFERFJfQiAocG1faGFuZGxlMSksCisJU0NSX0pVTVBSIF4gSUZGQUxTRSAoTUFTSyAoSEZfSU5fUE0wLCBIRl9JTl9QTTApKSwKKwkJMTYsCisJU0NSX0xPQURfUkVMIChpYSwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMC5yZXQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChwbV9zYXZlKSwKKwlTQ1JfTE9BRF9SRUwgKGlhLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9jY2IsIHBoeXMucG0xLnJldCksCisJU0NSX0pVTVAsCisJCVBBRERSX0IgKHBtX3NhdmUpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE1fSEFORExFMSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgTm9ybWFsIGNhc2UuCisJICogIFVwZGF0ZSB0aGUgcmV0dXJuIGFkZHJlc3Mgc28gdGhhdCBpdCAKKwkgKiAgd2lsbCBwb2ludCBhZnRlciB0aGUgaW50ZXJydXB0ZWQgTU9WRS4KKwkgKi8KKwlTQ1JfUkVHX1JFRyAoaWEsIFNDUl9BREQsIDgpLAorCQkwLAorCVNDUl9SRUdfUkVHIChpYTEsIFNDUl9BRERDLCAwKSwKKwkJMCwKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFBNX1NBVkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCS8qCisJICogIENsZWFyIGFsbCB0aGUgZmxhZ3MgdGhhdCB0b2xkIHVzIGlmIHdlIHdlcmUgCisJICogIGludGVycnVwdGVkIGluIGEgUE0gREFUQSBtaW5pLXNjcmlwdCBhbmQvb3IgCisJICogIHdlIHJlY2VpdmVkIGEgU0FWRSBEUC4KKwkgKi8KKwlTQ1JfU0ZCUl9SRUcgKEhGX1JFRywgU0NSX0FORCwgKH4oSEZfSU5fUE0wfEhGX0lOX1BNMXxIRl9EUF9TQVZFRCkpKSwKKwkJMCwKKwkvKgorCSAqICBDaG9vc2UgdGhlIGN1cnJlbnQgUE0gY29udGV4dC4KKwkgKi8KKwlTQ1JfSlVNUCBeIElGVFJVRSAoTUFTSyAoSEZfQUNUX1BNLCBIRl9BQ1RfUE0pKSwKKwkJUEFERFJfQiAocG0xX3NhdmUpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0wX1NBVkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NUT1JFX1JFTCAoaWEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTAucmV0KSwKKwkvKgorCSAqICBJZiBXU1IgYml0IGlzIHNldCwgZWl0aGVyIFVBIGFuZCBSQkMgbWF5IAorCSAqICBoYXZlIHRvIGJlIGNoYW5nZWQgd2hldGhlciB0aGUgZGV2aWNlIHdhbnRzIAorCSAqICB0byBpZ25vcmUgdGhpcyByZXNpZHVlIG9yIG5vdC4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0NBTEwgXiBJRlRSVUUgKE1BU0sgKFdTUiwgV1NSKSksCisJCVBBRERSX0IgKHBtX3dzcl9oYW5kbGUpLAorCS8qCisJICogIFNhdmUgdGhlIHJlbWFpbmluZyBieXRlIGNvdW50LCB0aGUgdXBkYXRlZCAKKwkgKiAgYWRkcmVzcyBhbmQgdGhlIHJldHVybiBhZGRyZXNzLgorCSAqLworCVNDUl9TVE9SRV9SRUwgKHJiYywgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMC5zZy5zaXplKSwKKwlTQ1JfU1RPUkVfUkVMICh1YSwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMC5zZy5hZGRyKSwKKwkvKgorCSAqICBTZXQgdGhlIGN1cnJlbnQgcG9pbnRlciBhdCB0aGUgUE0wIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX0xPQURfQUJTIChpYSwgNCksCisJCVBBRERSX0IgKHBtMF9kYXRhX2FkZHIpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE1fU0FWRV9FTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NUT1JFX1JFTCAoaWEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLmxhc3RwKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQSAoZGlzcGF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0xX1NBVkUgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX1NUT1JFX1JFTCAoaWEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5wbTEucmV0KSwKKwkvKgorCSAqICBJZiBXU1IgYml0IGlzIHNldCwgZWl0aGVyIFVBIGFuZCBSQkMgbWF5IAorCSAqICBoYXZlIHRvIGJlIGNoYW5nZWQgd2hldGhlciB0aGUgZGV2aWNlIHdhbnRzIAorCSAqICB0byBpZ25vcmUgdGhpcyByZXNpZHVlIG9yIG5vdC4KKwkgKi8KKwlTQ1JfRlJPTV9SRUcgKHNjbnRsMiksCisJCTAsCisJU0NSX0NBTEwgXiBJRlRSVUUgKE1BU0sgKFdTUiwgV1NSKSksCisJCVBBRERSX0IgKHBtX3dzcl9oYW5kbGUpLAorCS8qCisJICogIFNhdmUgdGhlIHJlbWFpbmluZyBieXRlIGNvdW50LCB0aGUgdXBkYXRlZCAKKwkgKiAgYWRkcmVzcyBhbmQgdGhlIHJldHVybiBhZGRyZXNzLgorCSAqLworCVNDUl9TVE9SRV9SRUwgKHJiYywgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5zZy5zaXplKSwKKwlTQ1JfU1RPUkVfUkVMICh1YSwgNCksCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBwaHlzLnBtMS5zZy5hZGRyKSwKKwkvKgorCSAqICBTZXQgdGhlIGN1cnJlbnQgcG9pbnRlciBhdCB0aGUgUE0xIERBVEEgbWluaS1zY3JpcHQuCisJICovCisJU0NSX0xPQURfQUJTIChpYSwgNCksCisJCVBBRERSX0IgKHBtMV9kYXRhX2FkZHIpLAorCVNDUl9KVU1QLAorCQlQQUREUl9CIChwbV9zYXZlX2VuZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTV9XU1JfSEFORExFID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBQaGFzZSBtaXNtYXRjaCBoYW5kbGluZyBmcm9tIFNDUklQVCB3aXRoIFdTUiBzZXQuCisJICogIFN1Y2ggYSBjb25kaXRpb24gY2FuIG9jY3VyIGlmIHRoZSBjaGlwIHdhbnRzIHRvIAorCSAqICBleGVjdXRlIGEgQ0hNT1Yoc2l6ZSA+IDEpIHdoZW4gdGhlIFdTUiBiaXQgaXMgCisJICogIHNldCBhbmQgdGhlIHRhcmdldCBjaGFuZ2VzIFBIQVNFLgorCSAqCisJICogIFdlIG11c3QgbW92ZSB0aGUgcmVzaWR1YWwgYnl0ZSB0byBtZW1vcnkuCisJICoKKwkgKiAgVUEgY29udGFpbnMgYml0IDAuLjMxIG9mIHRoZSBhZGRyZXNzIHRvIAorCSAqICBtb3ZlIHRoZSByZXNpZHVhbCBieXRlLgorCSAqICBNb3ZlIGl0IHRvIHRoZSB0YWJsZSBpbmRpcmVjdC4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMICh1YSwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy53cmVzaWQuYWRkciksCisJLyoKKwkgKiAgSW5jcmVtZW50IFVBIChtb3ZlIGFkZHJlc3MgdG8gbmV4dCBwb3NpdGlvbikuCisJICovCisJU0NSX1JFR19SRUcgKHVhLCBTQ1JfQURELCAxKSwKKwkJMCwKKwlTQ1JfUkVHX1JFRyAodWExLCBTQ1JfQUREQywgMCksCisJCTAsCisJU0NSX1JFR19SRUcgKHVhMiwgU0NSX0FEREMsIDApLAorCQkwLAorCVNDUl9SRUdfUkVHICh1YTMsIFNDUl9BRERDLCAwKSwKKwkJMCwKKwkvKgorCSAqICBDb21wdXRlIFNDUkFUQ0hBIGFzOgorCSAqICAtIHNpemUgdG8gdHJhbnNmZXIgPSAxIGJ5dGUuCisJICogIC0gYml0IDI0Li4zMSA9IGhpZ2ggYWRkcmVzcyBiaXQgWzMyLi4uMzldLgorCSAqLworCVNDUl9MT0FEX0FCUyAoc2NyYXRjaGEsIDQpLAorCQlQQUREUl9CICh6ZXJvKSwKKwlTQ1JfUkVHX1JFRyAoc2NyYXRjaGEsIFNDUl9PUiwgMSksCisJCTAsCisJU0NSX0ZST01fUkVHIChyYmMzKSwKKwkJMCwKKwlTQ1JfVE9fUkVHIChzY3JhdGNoYTMpLAorCQkwLAorCS8qCisJICogIE1vdmUgdGhpcyB2YWx1ZSB0byB0aGUgdGFibGUgaW5kaXJlY3QuCisJICovCisJU0NSX1NUT1JFX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMud3Jlc2lkLnNpemUpLAorCS8qCisJICogIFdhaXQgZm9yIGEgdmFsaWQgcGhhc2UuCisJICogIFdoaWxlIHRlc3Rpbmcgd2l0aCBib2d1cyBRVUFOVFVNIGRyaXZlcywgdGhlIEMxMDEwIAorCSAqICBzb21ldGltZXMgcmFpc2VkIGEgc3B1cmlvdXMgcGhhc2UgbWlzbWF0Y2ggd2l0aCAKKwkgKiAgV1NSIGFuZCB0aGUgQ0hNT1YoMSkgdHJpZ2dlcmVkIGFub3RoZXIgUE0uCisJICogIFdhaXRpbmcgZXhwbGljaXRlbHkgZm9yIHRoZSBQSEFTRSBzZWVtZWQgdG8gYXZvaWQgCisJICogIHRoZSBuZXN0ZWQgcGhhc2UgbWlzbWF0Y2guIEJ0dywgdGhpcyBkaWRuJ3QgaGFwcGVuIAorCSAqICB1c2luZyBteSBJQk0gZHJpdmVzLgorCSAqLworCVNDUl9KVU1QUiBeIElGRkFMU0UgKFdIRU4gKFNDUl9EQVRBX0lOKSksCisJCTAsCisJLyoKKwkgKiAgUGVyZm9ybSB0aGUgbW92ZSBvZiB0aGUgcmVzaWR1YWwgYnl0ZS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy53cmVzaWQpLAorCS8qCisJICogIFdlIGNhbiBub3cgaGFuZGxlIHRoZSBwaGFzZSBtaXNtYXRjaCB3aXRoIFVBIGZpeGVkLgorCSAqICBSQkNbMC4uMjNdPTAgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBkb2VzIG5vdCByZXF1aXJlIAorCSAqICBhIFBNIGNvbnRleHQuIFRoZSBDIGNvZGUgYWxzbyBjaGVja3MgYWdhaW5zdCB0aGlzLgorCSAqLworCVNDUl9GUk9NX1JFRyAocmJjKSwKKwkJMCwKKwlTQ1JfUkVUVVJOIF4gSUZGQUxTRSAoREFUQSAoMCkpLAorCQkwLAorCVNDUl9GUk9NX1JFRyAocmJjMSksCisJCTAsCisJU0NSX1JFVFVSTiBeIElGRkFMU0UgKERBVEEgKDApKSwKKwkJMCwKKwlTQ1JfRlJPTV9SRUcgKHJiYzIpLAorCQkwLAorCVNDUl9SRVRVUk4gXiBJRkZBTFNFIChEQVRBICgwKSksCisJCTAsCisJLyoKKwkgKiAgUkJDWzAuLjIzXT0wLgorCSAqICBOb3Qgb25seSB3ZSBkb25ub3QgbmVlZCBhIFBNIGNvbnRleHQsIGJ1dCB0aGlzIHdvdWxkIAorCSAqICBsZWFkIHRvIGEgYm9ndXMgQ0hNT1YoMCkuIFRoaXMgY29uZGl0aW9uIG1lYW5zIHRoYXQgCisJICogIHRoZSByZXNpZHVhbCB3YXMgdGhlIGxhc3QgYnl0ZSB0byBtb3ZlIGZyb20gdGhpcyBDSE1PVi4KKwkgKiAgU28sIHdlIGp1c3QgaGF2ZSB0byBtb3ZlIHRoZSBjdXJyZW50IGRhdGEgc2NyaXB0IHBvaW50ZXIgCisJICogIChpLmUuIFRFTVApIHRvIHRoZSBTQ1JJUFRTIGFkZHJlc3MgZm9sbG93aW5nIHRoZSAKKwkgKiAgaW50ZXJydXB0ZWQgQ0hNT1YgYW5kIGp1bXAgdG8gZGlzcGF0Y2hlci4KKwkgKiAgSUEgY29udGFpbnMgdGhlIGRhdGEgcG9pbnRlciB0byBzYXZlLgorCSAqLworCVNDUl9KVU1QLAorCQlQQUREUl9CIChwbV9zYXZlX2VuZCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBXU1JfTUFfSEVMUEVSID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwkvKgorCSAqICBIZWxwZXIgZm9yIHRoZSBDIGNvZGUgd2hlbiBXU1IgYml0IGlzIHNldC4KKwkgKiAgUGVyZm9ybSB0aGUgbW92ZSBvZiB0aGUgcmVzaWR1YWwgYnl0ZS4KKwkgKi8KKwlTQ1JfQ0hNT1ZfVEJMIF4gU0NSX0RBVEFfSU4sCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy53cmVzaWQpLAorCVNDUl9KVU1QLAorCQlQQUREUl9BIChkaXNwYXRjaCksCisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JTyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgV2UganVtcCBoZXJlIGlmIHRoZSBkYXRhIGRpcmVjdGlvbiB3YXMgdW5rbm93biBhdCB0aGUgCisJICogIHRpbWUgd2UgaGFkIHRvIHF1ZXVlIHRoZSBjb21tYW5kIHRvIHRoZSBzY3JpcHRzIHByb2Nlc3Nvci4KKwkgKiAgUG9pbnRlcnMgaGFkIGJlZW4gc2V0IGFzIGZvbGxvdyBpbiB0aGlzIHNpdHVhdGlvbjoKKwkgKiAgICBzYXZlcCAgIC0tPiAgIERBVEFfSU8KKwkgKiAgICBsYXN0cCAgIC0tPiAgIHN0YXJ0IHBvaW50ZXIgd2hlbiBEQVRBX0lOCisJICogICAgd2xhc3RwICAtLT4gICBzdGFydCBwb2ludGVyIHdoZW4gREFUQV9PVVQKKwkgKiAgVGhpcyBzY3JpcHQgc2V0cyBzYXZlcCBhbmQgbGFzdHAgYWNjb3JkaW5nIHRvIHRoZSAKKwkgKiAgZGlyZWN0aW9uIGNob3NlbiBieSB0aGUgdGFyZ2V0LgorCSAqLworCVNDUl9KVU1QIF4gSUZUUlVFIChXSEVOIChTQ1JfREFUQV9PVVQpKSwKKwkJUEFERFJfQiAoZGF0YV9pb19vdXQpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JT19JTiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgRGlyZWN0aW9uIGlzIERBVEEgSU4uCisJICovCisJU0NSX0xPQURfUkVMICAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZiAoc3RydWN0IHN5bV9jY2IsIHBoeXMuaGVhZC5sYXN0cCksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBEQVRBX0lPX0NPTSA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfU1RPUkVfUkVMIChzY3JhdGNoYSwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLnNhdmVwKSwKKworCS8qCisJICogIEp1bXAgdG8gdGhlIFNDUklQVFMgYWNjb3JkaW5nIHRvIGFjdHVhbCBkaXJlY3Rpb24uCisJICovCisJU0NSX0xPQURfUkVMICAodGVtcCwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLnNhdmVwKSwKKwlTQ1JfUkVUVVJOLAorCQkwLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgREFUQV9JT19PVVQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgRGlyZWN0aW9uIGlzIERBVEEgT1VULgorCSAqLworCVNDUl9SRUdfUkVHIChIRl9SRUcsIFNDUl9BTkQsICh+SEZfREFUQV9JTikpLAorCQkwLAorCVNDUl9MT0FEX1JFTCAgKHNjcmF0Y2hhLCA0KSwKKwkJb2Zmc2V0b2YgKHN0cnVjdCBzeW1fY2NiLCBwaHlzLmhlYWQud2xhc3RwKSwKKwlTQ1JfU1RPUkVfUkVMIChzY3JhdGNoYSwgNCksCisJCW9mZnNldG9mIChzdHJ1Y3Qgc3ltX2NjYiwgcGh5cy5oZWFkLmxhc3RwKSwKKwlTQ1JfSlVNUCwKKwkJUEFERFJfQihkYXRhX2lvX2NvbSksCisjZW5kaWYgLyogU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04gKi8KKworfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgWkVSTyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IFNDUkFUQ0ggPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQTTBfREFUQV9BRERSID4tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgUE0xX0RBVEFfQUREUiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IERPTkVfUE9TID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8seworCVNDUl9EQVRBX1pFUk8sCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTVEFSVFBPUyA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLHsKKwlTQ1JfREFUQV9aRVJPLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgVEFSR1RCTCA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJU0NSX0RBVEFfWkVSTywKK30vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08Pi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU1lNX0ZXWl9TQ1IgU1lNX0ZXWl9TQ1IgPSB7CisgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBTTk9PUFRFU1QgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoveworCS8qCisJICogIFJlYWQgdGhlIHZhcmlhYmxlIGZyb20gbWVtb3J5LgorCSAqLworCVNDUl9MT0FEX1JFTCAoc2NyYXRjaGEsIDQpLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3ltX2hjYiwgc2NyYXRjaCksCisJLyoKKwkgKiAgV3JpdGUgdGhlIHZhcmlhYmxlIHRvIG1lbW9yeS4KKwkgKi8KKwlTQ1JfU1RPUkVfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9oY2IsIHNjcmF0Y2gpLAorCS8qCisJICogIFJlYWQgYmFjayB0aGUgdmFyaWFibGUgZnJvbSBtZW1vcnkuCisJICovCisJU0NSX0xPQURfUkVMICh0ZW1wLCA0KSwKKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV9oY2IsIHNjcmF0Y2gpLAorfS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgU05PT1BFTkQgPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyx7CisJLyoKKwkgKiAgQW5kIHN0b3AuCisJICovCisJU0NSX0lOVCwKKwkJOTksCit9LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmZjZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMKQEAgLTAsMCArMSwyMTk2IEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgIE1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnQuaD4KKworI2luY2x1ZGUgInN5bV9nbHVlLmgiCisjaW5jbHVkZSAic3ltX252cmFtLmgiCisKKyNkZWZpbmUgTkFNRTUzQwkJInN5bTUzYyIKKyNkZWZpbmUgTkFNRTUzQzhYWAkic3ltNTNjOHh4IgorCisvKiBTUEFSQyBqdXN0IGhhcyB0byBiZSBkaWZmZXJlbnQgLi4uICovCisjaWZkZWYgX19zcGFyY19fCisjZGVmaW5lIElSUV9GTVQgIiVzIgorI2RlZmluZSBJUlFfUFJNKHgpIF9faXJxX2l0b2EoeCkKKyNlbHNlCisjZGVmaW5lIElSUV9GTVQgIiVkIgorI2RlZmluZSBJUlFfUFJNKHgpICh4KQorI2VuZGlmCisKK3N0cnVjdCBzeW1fZHJpdmVyX3NldHVwIHN5bV9kcml2ZXJfc2V0dXAgPSBTWU1fTElOVVhfRFJJVkVSX1NFVFVQOwordW5zaWduZWQgaW50IHN5bV9kZWJ1Z19mbGFncyA9IDA7CisKK3N0YXRpYyBjaGFyICpleGNsX3N0cmluZzsKK3N0YXRpYyBjaGFyICpzYWZlX3N0cmluZzsKK21vZHVsZV9wYXJhbV9uYW1lZChjbWRfcGVyX2x1biwgc3ltX2RyaXZlcl9zZXR1cC5tYXhfdGFnLCB1c2hvcnQsIDApOworbW9kdWxlX3BhcmFtX3N0cmluZyh0YWdfY3RybCwgc3ltX2RyaXZlcl9zZXR1cC50YWdfY3RybCwgMTAwLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChidXJzdCwgc3ltX2RyaXZlcl9zZXR1cC5idXJzdF9vcmRlciwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobGVkLCBzeW1fZHJpdmVyX3NldHVwLnNjc2lfbGVkLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkaWZmLCBzeW1fZHJpdmVyX3NldHVwLnNjc2lfZGlmZiwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoaXJxbSwgc3ltX2RyaXZlcl9zZXR1cC5pcnFfbW9kZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYnVzY2hrLCBzeW1fZHJpdmVyX3NldHVwLnNjc2lfYnVzX2NoZWNrLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChob3N0aWQsIHN5bV9kcml2ZXJfc2V0dXAuaG9zdF9pZCwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQodmVyYiwgc3ltX2RyaXZlcl9zZXR1cC52ZXJib3NlLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Zywgc3ltX2RlYnVnX2ZsYWdzLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChzZXR0bGUsIHN5bV9kcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5LCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChudnJhbSwgc3ltX2RyaXZlcl9zZXR1cC51c2VfbnZyYW0sIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGV4Y2wsIGV4Y2xfc3RyaW5nLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2FmZSwgc2FmZV9zdHJpbmcsIGNoYXJwLCAwKTsKKworTU9EVUxFX1BBUk1fREVTQyhjbWRfcGVyX2x1biwgIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0YWdzIHRvIHVzZSBieSBkZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHRhZ19jdHJsLCAiTW9yZSBkZXRhaWxlZCBjb250cm9sIG92ZXIgdGFncyBwZXIgTFVOIik7CitNT0RVTEVfUEFSTV9ERVNDKGJ1cnN0LCAiTWF4aW11bSBidXJzdC4gIDAgdG8gZGlzYWJsZSwgMjU1IHRvIHJlYWQgZnJvbSByZWdpc3RlcnMiKTsKK01PRFVMRV9QQVJNX0RFU0MobGVkLCAiU2V0IHRvIDEgdG8gZW5hYmxlIExFRCBzdXBwb3J0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGRpZmYsICIwIGZvciBubyBkaWZmZXJlbnRpYWwgbW9kZSwgMSBmb3IgQklPUywgMiBmb3IgYWx3YXlzLCAzIGZvciBub3QgR1BJTzMiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxbSwgIjAgZm9yIG9wZW4gZHJhaW4sIDEgdG8gbGVhdmUgYWxvbmUsIDIgZm9yIHRvdGVtIHBvbGUiKTsKK01PRFVMRV9QQVJNX0RFU0MoYnVzY2hrLCAiMCB0byBub3QgY2hlY2ssIDEgZm9yIGRldGFjaCBvbiBlcnJvciwgMiBmb3Igd2FybiBvbiBlcnJvciIpOworTU9EVUxFX1BBUk1fREVTQyhob3N0aWQsICJUaGUgU0NTSSBJRCB0byB1c2UgZm9yIHRoZSBob3N0IGFkYXB0ZXJzIik7CitNT0RVTEVfUEFSTV9ERVNDKHZlcmIsICIwIGZvciBtaW5pbWFsIHZlcmJvc2l0eSwgMSBmb3Igbm9ybWFsLCAyIGZvciBleGNlc3NpdmUiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJTZXQgYml0cyB0byBlbmFibGUgZGVidWdnaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKHNldHRsZSwgIlNldHRsZSBkZWxheSBpbiBzZWNvbmRzLiAgRGVmYXVsdCAzIik7CitNT0RVTEVfUEFSTV9ERVNDKG52cmFtLCAiT3B0aW9uIGN1cnJlbnRseSBub3QgdXNlZCIpOworTU9EVUxFX1BBUk1fREVTQyhleGNsLCAiTGlzdCBpb3BvcnQgYWRkcmVzc2VzIGhlcmUgdG8gcHJldmVudCBjb250cm9sbGVycyBmcm9tIGJlaW5nIGF0dGFjaGVkIik7CitNT0RVTEVfUEFSTV9ERVNDKHNhZmUsICJTZXQgb3RoZXIgc2V0dGluZ3MgdG8gYSBcInNhZmUgbW9kZVwiIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFNZTV9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIk1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkNSLCBTeW1iaW9zIGFuZCBMU0kgOHh4IGFuZCAxMDEwIFBDSSBTQ1NJIGFkYXB0ZXJzIik7CisKK3N0YXRpYyB2b2lkIHN5bTJfc2V0dXBfcGFyYW1zKHZvaWQpCit7CisJY2hhciAqcCA9IGV4Y2xfc3RyaW5nOworCWludCB4aSA9IDA7CisKKwl3aGlsZSAocCAmJiAoeGkgPCA4KSkgeworCQljaGFyICpuZXh0X3A7CisJCWludCB2YWwgPSAoaW50KSBzaW1wbGVfc3RydG91bChwLCAmbmV4dF9wLCAwKTsKKwkJc3ltX2RyaXZlcl9zZXR1cC5leGNsdWRlc1t4aSsrXSA9IHZhbDsKKwkJcCA9IG5leHRfcDsKKwl9CisKKwlpZiAoc2FmZV9zdHJpbmcpIHsKKwkJaWYgKCpzYWZlX3N0cmluZyA9PSAneScpIHsKKwkJCXN5bV9kcml2ZXJfc2V0dXAubWF4X3RhZyA9IDA7CisJCQlzeW1fZHJpdmVyX3NldHVwLmJ1cnN0X29yZGVyID0gMDsKKwkJCXN5bV9kcml2ZXJfc2V0dXAuc2NzaV9sZWQgPSAwOworCQkJc3ltX2RyaXZlcl9zZXR1cC5zY3NpX2RpZmYgPSAxOworCQkJc3ltX2RyaXZlcl9zZXR1cC5pcnFfbW9kZSA9IDA7CisJCQlzeW1fZHJpdmVyX3NldHVwLnNjc2lfYnVzX2NoZWNrID0gMjsKKwkJCXN5bV9kcml2ZXJfc2V0dXAuaG9zdF9pZCA9IDc7CisJCQlzeW1fZHJpdmVyX3NldHVwLnZlcmJvc2UgPSAyOworCQkJc3ltX2RyaXZlcl9zZXR1cC5zZXR0bGVfZGVsYXkgPSAxMDsKKwkJCXN5bV9kcml2ZXJfc2V0dXAudXNlX252cmFtID0gMTsKKwkJfSBlbHNlIGlmICgqc2FmZV9zdHJpbmcgIT0gJ24nKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIE5BTUU1M0M4WFggIklnbm9yaW5nIHBhcmFtZXRlciAlcyIKKwkJCQkJIiBwYXNzZWQgdG8gc2FmZSBvcHRpb24iLCBzYWZlX3N0cmluZyk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBXZSB1c2VkIHRvIHRyeSB0byBkZWFsIHdpdGggNjQtYml0IEJBUnMgaGVyZSwgYnV0IGRvbid0IGFueSBtb3JlLgorICogVGhlcmUgYXJlIG1hbnkgcGFydHMgb2YgdGhpcyBkcml2ZXIgd2hpY2ggd291bGQgbmVlZCB0byBiZSBtb2RpZmllZAorICogdG8gaGFuZGxlIGEgNjQtYml0IGJhc2UgYWRkcmVzcywgaW5jbHVkaW5nIHNjcmlwdHMuICBJJ20gdW5jb21mb3J0YWJsZQorICogd2l0aCBtYWtpbmcgdGhvc2UgY2hhbmdlcyB3aGVuIEkgaGF2ZSBubyB3YXkgb2YgdGVzdGluZyBpdCwgc28gSSdtCisgKiBqdXN0IGdvaW5nIHRvIGRpc2FibGUgaXQuCisgKgorICogTm90ZSB0aGF0IHNvbWUgbWFjaGluZXMgKGVnIEhQIHJ4ODYyMCBhbmQgU3VwZXJkb21lKSBoYXZlIGJ1cyBhZGRyZXNzZXMKKyAqIGJlbG93IDRHQiBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIGFib3ZlIDRHQi4gIFRoZXNlIHdpbGwgY29udGludWUgdG8gd29yay4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK3BjaV9nZXRfYmFzZV9hZGRyZXNzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKmJhc2VwKQoreworCXUzMiB0bXA7CisJdW5zaWduZWQgbG9uZyBiYXNlOworI2RlZmluZSBQQ0lfQkFSX09GRlNFVChpbmRleCkgKFBDSV9CQVNFX0FERFJFU1NfMCArIChpbmRleDw8MikpCisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBUl9PRkZTRVQoaW5kZXgrKyksICZ0bXApOworCWJhc2UgPSB0bXA7CisJaWYgKCh0bXAgJiAweDcpID09IFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVJfT0ZGU0VUKGluZGV4KyspLCAmdG1wKTsKKwkJaWYgKHRtcCA+IDApCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkJBUiAlZCBpcyA2NC1iaXQsIGRpc2FibGluZ1xuIiwgaW5kZXggLSAxKTsKKwkJYmFzZSA9IDA7CisJfQorCisJaWYgKChiYXNlICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgeworCQliYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwl9IGVsc2UgeworCQliYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJfQorCisJKmJhc2VwID0gYmFzZTsKKwlyZXR1cm4gaW5kZXg7CisjdW5kZWYgUENJX0JBUl9PRkZTRVQKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqc3ltMl90cmFuc3BvcnRfdGVtcGxhdGUgPSBOVUxMOworCisvKgorICogIFVzZWQgYnkgdGhlIGVoIHRocmVhZCB0byB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24uCisgKiAgSXQgaXMgYWxsb2NhdGVkIG9uIHRoZSBlaCB0aHJlYWQgc3RhY2suCisgKi8KK3N0cnVjdCBzeW1fZWhfd2FpdCB7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl2b2lkICgqb2xkX2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKik7CisJaW50IHRvX2RvOworCWludCB0aW1lZF9vdXQ7Cit9OworCisvKgorICogIERyaXZlciBwcml2YXRlIGFyZWEgaW4gdGhlIFNDU0kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBzeW1fdWNtZCB7CQkvKiBPdmVycmlkZSB0aGUgU0NTSSBwb2ludGVyIHN0cnVjdHVyZSAqLworCWRtYV9hZGRyX3QgZGF0YV9tYXBwaW5nOworCXVfY2hhcglkYXRhX21hcHBlZDsKKwlzdHJ1Y3Qgc3ltX2VoX3dhaXQgKmVoX3dhaXQ7Cit9OworCisjZGVmaW5lIFNZTV9VQ01EX1BUUihjbWQpICAoKHN0cnVjdCBzeW1fdWNtZCAqKSgmKGNtZCktPlNDcCkpCisjZGVmaW5lIFNZTV9TT0ZUQ19QVFIoY21kKSBzeW1fZ2V0X2hjYihjbWQtPmRldmljZS0+aG9zdCkKKworc3RhdGljIHZvaWQgX191bm1hcF9zY3NpX2RhdGEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQgZG1hX2RpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwlzd2l0Y2goU1lNX1VDTURfUFRSKGNtZCktPmRhdGFfbWFwcGVkKSB7CisJY2FzZSAyOgorCQlwY2lfdW5tYXBfc2cocGRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLCBkbWFfZGlyKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIFNZTV9VQ01EX1BUUihjbWQpLT5kYXRhX21hcHBpbmcsCisJCQkJIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBkbWFfZGlyKTsKKwkJYnJlYWs7CisJfQorCVNZTV9VQ01EX1BUUihjbWQpLT5kYXRhX21hcHBlZCA9IDA7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IF9fbWFwX3Njc2lfc2luZ2xlX2RhdGEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJaW50IGRtYV9kaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJIGNtZC0+cmVxdWVzdF9idWZmbGVuLCBkbWFfZGlyKTsKKwlpZiAobWFwcGluZykgeworCQlTWU1fVUNNRF9QVFIoY21kKS0+ZGF0YV9tYXBwZWQgID0gMTsKKwkJU1lNX1VDTURfUFRSKGNtZCktPmRhdGFfbWFwcGluZyA9IG1hcHBpbmc7CisJfQorCisJcmV0dXJuIG1hcHBpbmc7Cit9CisKK3N0YXRpYyBpbnQgX19tYXBfc2NzaV9zZ19kYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IHVzZV9zZzsKKwlpbnQgZG1hX2RpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwl1c2Vfc2cgPSBwY2lfbWFwX3NnKHBkZXYsIGNtZC0+YnVmZmVyLCBjbWQtPnVzZV9zZywgZG1hX2Rpcik7CisJaWYgKHVzZV9zZyA+IDApIHsKKwkJU1lNX1VDTURfUFRSKGNtZCktPmRhdGFfbWFwcGVkICA9IDI7CisJCVNZTV9VQ01EX1BUUihjbWQpLT5kYXRhX21hcHBpbmcgPSB1c2Vfc2c7CisJfQorCisJcmV0dXJuIHVzZV9zZzsKK30KKworI2RlZmluZSB1bm1hcF9zY3NpX2RhdGEobnAsIGNtZCkJXAorCQlfX3VubWFwX3Njc2lfZGF0YShucC0+cy5kZXZpY2UsIGNtZCkKKyNkZWZpbmUgbWFwX3Njc2lfc2luZ2xlX2RhdGEobnAsIGNtZCkJXAorCQlfX21hcF9zY3NpX3NpbmdsZV9kYXRhKG5wLT5zLmRldmljZSwgY21kKQorI2RlZmluZSBtYXBfc2NzaV9zZ19kYXRhKG5wLCBjbWQpCVwKKwkJX19tYXBfc2NzaV9zZ19kYXRhKG5wLT5zLmRldmljZSwgY21kKQorLyoKKyAqICBDb21wbGV0ZSBhIHBlbmRpbmcgQ0FNIENDQi4KKyAqLwordm9pZCBzeW1feHB0X2RvbmUoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJdW5tYXBfc2NzaV9kYXRhKG5wLCBjbWQpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV94cHRfZG9uZTIoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBjYW1fc3RhdHVzKQoreworCXN5bV9zZXRfY2FtX3N0YXR1cyhjbWQsIGNhbV9zdGF0dXMpOworCXN5bV94cHRfZG9uZShucCwgY21kKTsKK30KKworCisvKgorICogIFRlbGwgdGhlIFNDU0kgbGF5ZXIgYWJvdXQgYSBCVVMgUkVTRVQuCisgKi8KK3ZvaWQgc3ltX3hwdF9hc3luY19idXNfcmVzZXQoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXByaW50Zl9ub3RpY2UoIiVzOiBTQ1NJIEJVUyBoYXMgYmVlbiByZXNldC5cbiIsIHN5bV9uYW1lKG5wKSk7CisJbnAtPnMuc2V0dGxlX3RpbWUgPSBqaWZmaWVzICsgc3ltX2RyaXZlcl9zZXR1cC5zZXR0bGVfZGVsYXkgKiBIWjsKKwlucC0+cy5zZXR0bGVfdGltZV92YWxpZCA9IDE7CisJaWYgKHN5bV92ZXJib3NlID49IDIpCisJCXByaW50Zl9pbmZvKCIlczogY29tbWFuZCBwcm9jZXNzaW5nIHN1c3BlbmRlZCBmb3IgJWQgc2Vjb25kc1xuIiwKKwkJCSAgICBzeW1fbmFtZShucCksIHN5bV9kcml2ZXJfc2V0dXAuc2V0dGxlX2RlbGF5KTsKK30KKworLyoKKyAqICBUZWxsIHRoZSBTQ1NJIGxheWVyIGFib3V0IGEgQlVTIERFVklDRSBSRVNFVCBtZXNzYWdlIHNlbnQuCisgKi8KK3ZvaWQgc3ltX3hwdF9hc3luY19zZW50X2JkcihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQpCit7CisJcHJpbnRmX25vdGljZSgiJXM6IFRBUkdFVCAlZCBoYXMgYmVlbiByZXNldC5cbiIsIHN5bV9uYW1lKG5wKSwgdGFyZ2V0KTsKK30KKworLyoKKyAqICBDaG9vc2UgdGhlIG1vcmUgYXBwcm9wcmlhdGUgQ0FNIHN0YXR1cyBpZiAKKyAqICB0aGUgSU8gZW5jb3VudGVyZWQgYW4gZXh0ZW5kZWQgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3hlcnJfY2FtX3N0YXR1cyhpbnQgY2FtX3N0YXR1cywgaW50IHhfc3RhdHVzKQoreworCWlmICh4X3N0YXR1cykgeworCQlpZgkoeF9zdGF0dXMgJiBYRV9QQVJJVFlfRVJSKQorCQkJY2FtX3N0YXR1cyA9IERJRF9QQVJJVFk7CisJCWVsc2UgaWYJKHhfc3RhdHVzICYoWEVfRVhUUkFfREFUQXxYRV9TT0RMX1VOUlVOfFhFX1NXSURFX09WUlVOKSkKKwkJCWNhbV9zdGF0dXMgPSBESURfRVJST1I7CisJCWVsc2UgaWYJKHhfc3RhdHVzICYgWEVfQkFEX1BIQVNFKQorCQkJY2FtX3N0YXR1cyA9IERJRF9FUlJPUjsKKwkJZWxzZQorCQkJY2FtX3N0YXR1cyA9IERJRF9FUlJPUjsKKwl9CisJcmV0dXJuIGNhbV9zdGF0dXM7Cit9CisKKy8qCisgKiAgQnVpbGQgQ0FNIHJlc3VsdCBmb3IgYSBmYWlsZWQgb3IgYXV0by1zZW5zZWQgSU8uCisgKi8KK3ZvaWQgc3ltX3NldF9jYW1fcmVzdWx0X2Vycm9yKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwLCBpbnQgcmVzaWQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gY3AtPmNtZDsKKwl1X2ludCBjYW1fc3RhdHVzLCBzY3NpX3N0YXR1cywgZHJ2X3N0YXR1czsKKworCWRydl9zdGF0dXMgID0gMDsKKwljYW1fc3RhdHVzICA9IERJRF9PSzsKKwlzY3NpX3N0YXR1cyA9IGNwLT5zc3NzX3N0YXR1czsKKworCWlmIChjcC0+aG9zdF9mbGFncyAmIEhGX1NFTlNFKSB7CisJCXNjc2lfc3RhdHVzID0gY3AtPnN2X3Njc2lfc3RhdHVzOworCQlyZXNpZCA9IGNwLT5zdl9yZXNpZDsKKwkJaWYgKHN5bV92ZXJib3NlICYmIGNwLT5zdl94ZXJyX3N0YXR1cykKKwkJCXN5bV9wcmludF94ZXJyKGNtZCwgY3AtPnN2X3hlcnJfc3RhdHVzKTsKKwkJaWYgKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19DT01QTEVURSAmJgorCQkgICAgY3AtPnNzc3Nfc3RhdHVzID09IFNfR09PRCAmJgorCQkgICAgY3AtPnhlcnJfc3RhdHVzID09IDApIHsKKwkJCWNhbV9zdGF0dXMgPSBzeW1feGVycl9jYW1fc3RhdHVzKERJRF9PSywKKwkJCQkJCQkgY3AtPnN2X3hlcnJfc3RhdHVzKTsKKwkJCWRydl9zdGF0dXMgPSBEUklWRVJfU0VOU0U7CisJCQkvKgorCQkJICogIEJvdW5jZSBiYWNrIHRoZSBzZW5zZSBkYXRhIHRvIHVzZXIuCisJCQkgKi8KKwkJCW1lbXNldCgmY21kLT5zZW5zZV9idWZmZXIsIDAsIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCBjcC0+c25zX2JidWYsCisJCQkgICAgICBtaW4oc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSwKKwkJCQkgIChzaXplX3QpU1lNX1NOU19CQlVGX0xFTikpOworI2lmIDAKKwkJCS8qCisJCQkgKiAgSWYgdGhlIGRldmljZSByZXBvcnRzIGEgVU5JVCBBVFRFTlRJT04gY29uZGl0aW9uIAorCQkJICogIGR1ZSB0byBhIFJFU0VUIGNvbmRpdGlvbiwgd2Ugc2hvdWxkIGNvbnNpZGVyIGFsbCAKKwkJCSAqICBkaXNjb25uZWN0IENDQnMgZm9yIHRoaXMgdW5pdCBhcyBhYm9ydGVkLgorCQkJICovCisJCQlpZiAoMSkgeworCQkJCXVfY2hhciAqcDsKKwkJCQlwICA9ICh1X2NoYXIgKikgY21kLT5zZW5zZV9kYXRhOworCQkJCWlmIChwWzBdPT0weDcwICYmIHBbMl09PTB4NiAmJiBwWzEyXT09MHgyOSkKKwkJCQkJc3ltX2NsZWFyX3Rhc2tzKG5wLCBESURfQUJPUlQsCisJCQkJCQkJY3AtPnRhcmdldCxjcC0+bHVuLCAtMSk7CisJCQl9CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBFcnJvciByZXR1cm4gZnJvbSBvdXIgaW50ZXJuYWwgcmVxdWVzdCBzZW5zZS4gIFRoaXMKKwkJCSAqIGlzIGJhZDogd2UgbXVzdCBjbGVhciB0aGUgY29udGluZ2VudCBhbGxlZ2lhbmNlCisJCQkgKiBjb25kaXRpb24gb3RoZXJ3aXNlIHRoZSBkZXZpY2Ugd2lsbCBhbHdheXMgcmV0dXJuCisJCQkgKiBCVVNZLiAgVXNlIGEgYmlnIHN0aWNrLgorCQkJICovCisJCQlzeW1fcmVzZXRfc2NzaV90YXJnZXQobnAsIGNtZC0+ZGV2aWNlLT5pZCk7CisJCQljYW1fc3RhdHVzID0gRElEX0VSUk9SOworCQl9CisJfSBlbHNlIGlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUpIAkvKiBCYWQgU0NTSSBzdGF0dXMgKi8KKwkJY2FtX3N0YXR1cyA9IERJRF9PSzsKKwllbHNlIGlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfU0VMX1RJTUVPVVQpCS8qIFNlbGVjdGlvbiB0aW1lb3V0ICovCisJCWNhbV9zdGF0dXMgPSBESURfTk9fQ09OTkVDVDsKKwllbHNlIGlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfVU5FWFBFQ1RFRCkJLyogVW5leHBlY3RlZCBCVVMgRlJFRSovCisJCWNhbV9zdGF0dXMgPSBESURfRVJST1I7CisJZWxzZSB7CQkJCQkJLyogRXh0ZW5kZWQgZXJyb3IgKi8KKwkJaWYgKHN5bV92ZXJib3NlKSB7CisJCQlzeW1fcHJpbnRfYWRkcihjbWQsICJDT01NQU5EIEZBSUxFRCAoJXggJXggJXgpLlxuIiwKKwkJCQljcC0+aG9zdF9zdGF0dXMsIGNwLT5zc3NzX3N0YXR1cywKKwkJCQljcC0+eGVycl9zdGF0dXMpOworCQl9CisJCS8qCisJCSAqICBTZXQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgdmFsdWUgZm9yIENBTSBzdGF0dXMuCisJCSAqLworCQljYW1fc3RhdHVzID0gc3ltX3hlcnJfY2FtX3N0YXR1cyhESURfRVJST1IsIGNwLT54ZXJyX3N0YXR1cyk7CisJfQorCWNtZC0+cmVzaWQgPSByZXNpZDsKKwljbWQtPnJlc3VsdCA9IChkcnZfc3RhdHVzIDw8IDI0KSArIChjYW1fc3RhdHVzIDw8IDE2KSArIHNjc2lfc3RhdHVzOworfQorCisKKy8qCisgKiAgQnVpbGQgdGhlIHNjYXR0ZXIvZ2F0aGVyIGFycmF5IGZvciBhbiBJL08uCisgKi8KKworc3RhdGljIGludCBzeW1fc2NhdHRlcl9ub19zZ2xpc3Qoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3AsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc3ltX3RibG1vdmUgKmRhdGEgPSAmY3AtPnBoeXMuZGF0YVtTWU1fQ09ORl9NQVhfU0ctMV07CisJaW50IHNlZ21lbnQ7CisKKwljcC0+ZGF0YV9sZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKworCWlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikgeworCQlkbWFfYWRkcl90IGJhZGRyID0gbWFwX3Njc2lfc2luZ2xlX2RhdGEobnAsIGNtZCk7CisJCWlmIChiYWRkcikgeworCQkJc3ltX2J1aWxkX3NnZShucCwgZGF0YSwgYmFkZHIsIGNtZC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJCXNlZ21lbnQgPSAxOworCQl9IGVsc2UgeworCQkJc2VnbWVudCA9IC0yOworCQl9CisJfSBlbHNlIHsKKwkJc2VnbWVudCA9IDA7CisJfQorCisJcmV0dXJuIHNlZ21lbnQ7Cit9CisKK3N0YXRpYyBpbnQgc3ltX3NjYXR0ZXIoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3AsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpbnQgc2VnbWVudDsKKwlpbnQgdXNlX3NnID0gKGludCkgY21kLT51c2Vfc2c7CisKKwljcC0+ZGF0YV9sZW4gPSAwOworCisJaWYgKCF1c2Vfc2cpCisJCXNlZ21lbnQgPSBzeW1fc2NhdHRlcl9ub19zZ2xpc3QobnAsIGNwLCBjbWQpOworCWVsc2UgaWYgKCh1c2Vfc2cgPSBtYXBfc2NzaV9zZ19kYXRhKG5wLCBjbWQpKSA+IDApIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2F0dGVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKWNtZC0+YnVmZmVyOworCQlzdHJ1Y3Qgc3ltX3RibG1vdmUgKmRhdGE7CisKKwkJaWYgKHVzZV9zZyA+IFNZTV9DT05GX01BWF9TRykgeworCQkJdW5tYXBfc2NzaV9kYXRhKG5wLCBjbWQpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZGF0YSA9ICZjcC0+cGh5cy5kYXRhW1NZTV9DT05GX01BWF9TRyAtIHVzZV9zZ107CisKKwkJZm9yIChzZWdtZW50ID0gMDsgc2VnbWVudCA8IHVzZV9zZzsgc2VnbWVudCsrKSB7CisJCQlkbWFfYWRkcl90IGJhZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNjYXR0ZXJbc2VnbWVudF0pOworCQkJdW5zaWduZWQgaW50IGxlbiA9IHNnX2RtYV9sZW4oJnNjYXR0ZXJbc2VnbWVudF0pOworCisJCQlzeW1fYnVpbGRfc2dlKG5wLCAmZGF0YVtzZWdtZW50XSwgYmFkZHIsIGxlbik7CisJCQljcC0+ZGF0YV9sZW4gKz0gbGVuOworCQl9CisJfSBlbHNlIHsKKwkJc2VnbWVudCA9IC0yOworCX0KKworCXJldHVybiBzZWdtZW50OworfQorCisvKgorICogIFF1ZXVlIGEgU0NTSSBjb21tYW5kLgorICovCitzdGF0aWMgaW50IHN5bV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOworCXN0cnVjdCBzeW1fdGNiICp0cDsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHA7CisJc3RydWN0IHN5bV9jY2IgKmNwOworCWludAlvcmRlcjsKKworCS8qCisJICogIE1pbmltYWwgY2hlY2tpbmdzLCBzbyB0aGF0IHdlIHdpbGwgbm90IAorCSAqICBnbyBvdXRzaWRlIG91ciB0YWJsZXMuCisJICovCisJaWYgKHNkZXYtPmlkID09IG5wLT5teWFkZHIgfHwKKwkgICAgc2Rldi0+aWQgPj0gU1lNX0NPTkZfTUFYX1RBUkdFVCB8fAorCSAgICBzZGV2LT5sdW4gPj0gU1lNX0NPTkZfTUFYX0xVTikgeworCQlzeW1feHB0X2RvbmUyKG5wLCBjbWQsIENBTV9ERVZfTk9UX1RIRVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgUmV0cmlldmUgdGhlIHRhcmdldCBkZXNjcmlwdG9yLgorCSAqLworCXRwID0gJm5wLT50YXJnZXRbc2Rldi0+aWRdOworCisJLyoKKwkgKiAgQ29tcGxldGUgdGhlIDFzdCBJTlFVSVJZIGNvbW1hbmQgd2l0aCBlcnJvciAKKwkgKiAgY29uZGl0aW9uIGlmIHRoZSBkZXZpY2UgaXMgZmxhZ2dlZCBOT1NDQU4gCisJICogIGF0IEJPT1QgaW4gdGhlIE5WUkFNLiBUaGlzIG1heSBzcGVlZCB1cCAKKwkgKiAgdGhlIGJvb3QgYW5kIG1haW50YWluIGNvaGVyZW5jeSB3aXRoIEJJT1MgCisJICogIGRldmljZSBudW1iZXJpbmcuIENsZWFyaW5nIHRoZSBmbGFnIGFsbG93cyAKKwkgKiAgdXNlciB0byByZXNjYW4gc2tpcHBlZCBkZXZpY2VzIGxhdGVyLgorCSAqICBXZSBhbHNvIHJldHVybiBlcnJvciBmb3IgZGV2aWNlcyBub3QgZmxhZ2dlZCAKKwkgKiAgZm9yIFNDQU4gTFVOUyBpbiB0aGUgTlZSQU0gc2luY2Ugc29tZSBtb25vLWx1biAKKwkgKiAgZGV2aWNlcyBiZWhhdmUgYmFkbHkgd2hlbiBhc2tlZCBmb3Igc29tZSBub24gCisJICogIHplcm8gTFVOLiBCdHcsIHRoaXMgaXMgYW4gYWJzb2x1dGUgaGFjay46LSkKKwkgKi8KKwlpZiAoY21kLT5jbW5kWzBdID09IDB4MTIgfHwgY21kLT5jbW5kWzBdID09IDB4MCkgeworCQlpZiAoKHRwLT51c3JmbGFncyAmIFNZTV9TQ0FOX0JPT1RfRElTQUJMRUQpIHx8CisJCSAgICAoKHRwLT51c3JmbGFncyAmIFNZTV9TQ0FOX0xVTlNfRElTQUJMRUQpICYmIAorCQkgICAgIHNkZXYtPmx1biAhPSAwKSkgeworCQkJdHAtPnVzcmZsYWdzICY9IH5TWU1fU0NBTl9CT09UX0RJU0FCTEVEOworCQkJc3ltX3hwdF9kb25lMihucCwgY21kLCBDQU1fREVWX05PVF9USEVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogIFNlbGVjdCB0YWdnZWQvdW50YWdnZWQuCisJICovCisJbHAgPSBzeW1fbHAodHAsIHNkZXYtPmx1bik7CisJb3JkZXIgPSAobHAgJiYgbHAtPnMucmVxdGFncykgPyBNX1NJTVBMRV9UQUcgOiAwOworCisJLyoKKwkgKiAgUXVldWUgdGhlIFNDU0kgSU8uCisJICovCisJY3AgPSBzeW1fZ2V0X2NjYihucCwgY21kLCBvcmRlcik7CisJaWYgKCFjcCkKKwkJcmV0dXJuIDE7CS8qIE1lYW5zIHJlc291cmNlIHNob3J0YWdlICovCisJc3ltX3F1ZXVlX3Njc2lpbyhucCwgY21kLCBjcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgU2V0dXAgYnVmZmVycyBhbmQgcG9pbnRlcnMgdGhhdCBhZGRyZXNzIHRoZSBDREIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHN5bV9zZXR1cF9jZGIoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwl1MzIJY21kX2JhOworCWludAljbWRfbGVuOworCisJLyoKKwkgKiAgQ0RCIGlzIDE2IGJ5dGVzIG1heC4KKwkgKi8KKwlpZiAoY21kLT5jbWRfbGVuID4gc2l6ZW9mKGNwLT5jZGJfYnVmKSkgeworCQlzeW1fc2V0X2NhbV9zdGF0dXMoY3AtPmNtZCwgQ0FNX1JFUV9JTlZBTElEKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweShjcC0+Y2RiX2J1ZiwgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4pOworCWNtZF9iYSAgPSBDQ0JfQkEgKGNwLCBjZGJfYnVmWzBdKTsKKwljbWRfbGVuID0gY21kLT5jbWRfbGVuOworCisJY3AtPnBoeXMuY21kLmFkZHIJPSBjcHVfdG9fc2NyKGNtZF9iYSk7CisJY3AtPnBoeXMuY21kLnNpemUJPSBjcHVfdG9fc2NyKGNtZF9sZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgU2V0dXAgcG9pbnRlcnMgdGhhdCBhZGRyZXNzIHRoZSBkYXRhIGFuZCBzdGFydCB0aGUgSS9PLgorICovCitpbnQgc3ltX3NldHVwX2RhdGFfYW5kX3N0YXJ0KHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJaW50IGRpcjsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHAgPSBzeW1fbHAodHAsIGNwLT5sdW4pOworCisJLyoKKwkgKiAgQnVpbGQgdGhlIENEQi4KKwkgKi8KKwlpZiAoc3ltX3NldHVwX2NkYihucCwgY21kLCBjcCkpCisJCWdvdG8gb3V0X2Fib3J0OworCisJLyoKKwkgKiAgTm8gZGlyZWN0aW9uIG1lYW5zIG5vIGRhdGEuCisJICovCisJZGlyID0gY21kLT5zY19kYXRhX2RpcmVjdGlvbjsKKwlpZiAoZGlyICE9IERNQV9OT05FKSB7CisJCWNwLT5zZWdtZW50cyA9IHN5bV9zY2F0dGVyKG5wLCBjcCwgY21kKTsKKwkJaWYgKGNwLT5zZWdtZW50cyA8IDApIHsKKwkJCWlmIChjcC0+c2VnbWVudHMgPT0gLTIpCisJCQkJc3ltX3NldF9jYW1fc3RhdHVzKGNtZCwgQ0FNX1JFU1JDX1VOQVZBSUwpOworCQkJZWxzZQorCQkJCXN5bV9zZXRfY2FtX3N0YXR1cyhjbWQsIENBTV9SRVFfVE9PX0JJRyk7CisJCQlnb3RvIG91dF9hYm9ydDsKKwkJfQorCX0gZWxzZSB7CisJCWNwLT5kYXRhX2xlbiA9IDA7CisJCWNwLT5zZWdtZW50cyA9IDA7CisJfQorCisJLyoKKwkgKiAgU2V0IGRhdGEgcG9pbnRlcnMuCisJICovCisJc3ltX3NldHVwX2RhdGFfcG9pbnRlcnMobnAsIGNwLCBkaXIpOworCisJLyoKKwkgKiAgV2hlbiBgI2lmZWQgMScsIHRoZSBjb2RlIGJlbG93IG1ha2VzIHRoZSBkcml2ZXIgCisJICogIHBhbmljIG9uIHRoZSBmaXJzdCBhdHRlbXB0IHRvIHdyaXRlIHRvIGEgU0NTSSBkZXZpY2UuCisJICogIEl0IGlzIHRoZSBmaXJzdCB0ZXN0IHdlIHdhbnQgdG8gZG8gYWZ0ZXIgYSBkcml2ZXIgCisJICogIGNoYW5nZSB0aGF0IGRvZXMgbm90IHNlZW0gb2J2aW91c2x5IHNhZmUuIDopCisJICovCisjaWYgMAorCXN3aXRjaCAoY3AtPmNkYl9idWZbMF0pIHsKKwljYXNlIDB4MEE6IGNhc2UgMHgyQTogY2FzZSAweEFBOgorCQlwYW5pYygiWFhYWFhYWFhYWFhYWCBXUklURSBOT1QgWUVUIEFMTE9XRUQgWFhYWFhYWFhYWFhYWFhcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisjZW5kaWYKKworCS8qCisJICoJYWN0aXZhdGUgdGhpcyBqb2IuCisJICovCisJaWYgKGxwKQorCQlzeW1fc3RhcnRfbmV4dF9jY2JzKG5wLCBscCwgMik7CisJZWxzZQorCQlzeW1fcHV0X3N0YXJ0X3F1ZXVlKG5wLCBjcCk7CisJcmV0dXJuIDA7CisKK291dF9hYm9ydDoKKwlzeW1fZnJlZV9jY2IobnAsIGNwKTsKKwlzeW1feHB0X2RvbmUobnAsIGNtZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICB0aW1lciBkYWVtb24uCisgKgorICogIE1pc3VzZWQgdG8ga2VlcCB0aGUgZHJpdmVyIHJ1bm5pbmcgd2hlbgorICogIGludGVycnVwdHMgYXJlIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4KKyAqLworc3RhdGljIHZvaWQgc3ltX3RpbWVyKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1bnNpZ25lZCBsb25nIHRoaXN0aW1lID0gamlmZmllczsKKworCS8qCisJICogIFJlc3RhcnQgdGhlIHRpbWVyLgorCSAqLworCW5wLT5zLnRpbWVyLmV4cGlyZXMgPSB0aGlzdGltZSArIFNZTV9DT05GX1RJTUVSX0lOVEVSVkFMOworCWFkZF90aW1lcigmbnAtPnMudGltZXIpOworCisJLyoKKwkgKiAgSWYgd2UgYXJlIHJlc2V0dGluZyB0aGUgbmNyLCB3YWl0IGZvciBzZXR0bGVfdGltZSBiZWZvcmUgCisJICogIGNsZWFyaW5nIGl0LiBUaGVuIGNvbW1hbmQgcHJvY2Vzc2luZyB3aWxsIGJlIHJlc3VtZWQuCisJICovCisJaWYgKG5wLT5zLnNldHRsZV90aW1lX3ZhbGlkKSB7CisJCWlmICh0aW1lX2JlZm9yZV9lcShucC0+cy5zZXR0bGVfdGltZSwgdGhpc3RpbWUpKSB7CisJCQlpZiAoc3ltX3ZlcmJvc2UgPj0gMiApCisJCQkJcHJpbnRrKCIlczogY29tbWFuZCBwcm9jZXNzaW5nIHJlc3VtZWRcbiIsCisJCQkJICAgICAgIHN5bV9uYW1lKG5wKSk7CisJCQlucC0+cy5zZXR0bGVfdGltZV92YWxpZCA9IDA7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICoJTm90aGluZyB0byBkbyBmb3Igbm93LCBidXQgdGhhdCBtYXkgY29tZS4KKwkgKi8KKwlpZiAobnAtPnMubGFzdHRpbWUgKyA0KkhaIDwgdGhpc3RpbWUpIHsKKwkJbnAtPnMubGFzdHRpbWUgPSB0aGlzdGltZTsKKwl9CisKKyNpZmRlZiBTWU1fQ09ORl9QQ0lRX01BWV9NSVNTX0NPTVBMRVRJT05TCisJLyoKKwkgKiAgU29tZSB3YXktYnJva2VuIFBDSSBicmlkZ2VzIG1heSBsZWFkIHRvIAorCSAqICBjb21wbGV0aW9ucyBiZWluZyBsb3N0IHdoZW4gdGhlIGNsZWFyaW5nIAorCSAqICBvZiB0aGUgSU5URkxZIGZsYWcgYnkgdGhlIENQVSBvY2N1cnMgCisJICogIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBjaGlwIHJhaXNpbmcgdGhpcyBmbGFnLgorCSAqICBJZiB0aGlzIGV2ZXIgaGFwcGVuLCBsb3N0IGNvbXBsZXRpb25zIHdpbGwgCisJICogYmUgcmVhcGVkIGhlcmUuCisJICovCisJc3ltX3dha2V1cF9kb25lKG5wKTsKKyNlbmRpZgorfQorCisKKy8qCisgKiAgUENJIEJVUyBlcnJvciBoYW5kbGVyLgorICovCit2b2lkIHN5bV9sb2dfYnVzX2Vycm9yKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1X3Nob3J0IHBjaV9zdHM7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQobnAtPnMuZGV2aWNlLCBQQ0lfU1RBVFVTLCAmcGNpX3N0cyk7CisJaWYgKHBjaV9zdHMgJiAweGY5MDApIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKG5wLT5zLmRldmljZSwgUENJX1NUQVRVUywgcGNpX3N0cyk7CisJCXByaW50ZigiJXM6IFBDSSBTVEFUVVMgPSAweCUwNHhcbiIsCisJCQlzeW1fbmFtZShucCksIHBjaV9zdHMgJiAweGY5MDApOworCX0KK30KKworLyoKKyAqIHF1ZXVlY29tbWFuZCBtZXRob2QuICBFbnRlcmVkIHdpdGggdGhlIGhvc3QgYWRhcHRlciBsb2NrIGhlbGQgYW5kCisgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgaW50IHN5bTUzYzh4eF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gU1lNX1NPRlRDX1BUUihjbWQpOworCXN0cnVjdCBzeW1fdWNtZCAqdWNwID0gU1lNX1VDTURfUFRSKGNtZCk7CisJaW50IHN0cyA9IDA7CisKKwljbWQtPnNjc2lfZG9uZSAgICAgPSBkb25lOworCW1lbXNldCh1Y3AsIDAsIHNpemVvZigqdWNwKSk7CisKKwkvKgorCSAqICBTaG9ydGVuIG91ciBzZXR0bGVfdGltZSBpZiBuZWVkZWQgZm9yIAorCSAqICB0aGlzIGNvbW1hbmQgbm90IHRvIHRpbWUgb3V0LgorCSAqLworCWlmIChucC0+cy5zZXR0bGVfdGltZV92YWxpZCAmJiBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQpIHsKKwkJdW5zaWduZWQgbG9uZyB0bGltaXQgPSBqaWZmaWVzICsgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kOworCQl0bGltaXQgLT0gU1lNX0NPTkZfVElNRVJfSU5URVJWQUwqMjsKKwkJaWYgKHRpbWVfYWZ0ZXIobnAtPnMuc2V0dGxlX3RpbWUsIHRsaW1pdCkpIHsKKwkJCW5wLT5zLnNldHRsZV90aW1lID0gdGxpbWl0OworCQl9CisJfQorCisJaWYgKG5wLT5zLnNldHRsZV90aW1lX3ZhbGlkKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCXN0cyA9IHN5bV9xdWV1ZV9jb21tYW5kKG5wLCBjbWQpOworCWlmIChzdHMpCisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCXJldHVybiAwOworfQorCisvKgorICogIExpbnV4IGVudHJ5IHBvaW50IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IHN5bTUzYzh4eF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gKHN0cnVjdCBzeW1faGNiICopZGV2X2lkOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVElOWSkgcHJpbnRmX2RlYnVnICgiWyIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUobnAtPnMuaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc3ltX2ludGVycnVwdChucCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShucC0+cy5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50Zl9kZWJ1ZyAoIl1cbiIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogIExpbnV4IGVudHJ5IHBvaW50IG9mIHRoZSB0aW1lciBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkIHN5bTUzYzh4eF90aW1lcih1bnNpZ25lZCBsb25nIG5wcmVmKQoreworCXN0cnVjdCBzeW1faGNiICpucCA9IChzdHJ1Y3Qgc3ltX2hjYiAqKW5wcmVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShucC0+cy5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlzeW1fdGltZXIobnApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobnAtPnMuaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Cit9CisKKworLyoKKyAqICBXaGF0IHRoZSBlaCB0aHJlYWQgd2FudHMgdXMgdG8gcGVyZm9ybS4KKyAqLworI2RlZmluZSBTWU1fRUhfQUJPUlQJCTAKKyNkZWZpbmUgU1lNX0VIX0RFVklDRV9SRVNFVAkxCisjZGVmaW5lIFNZTV9FSF9CVVNfUkVTRVQJMgorI2RlZmluZSBTWU1fRUhfSE9TVF9SRVNFVAkzCisKKy8qCisgKiAgV2hhdCB3ZSB3aWxsIGRvIHJlZ2FyZGluZyB0aGUgaW52b2x2ZWQgU0NTSSBjb21tYW5kLgorICovCisjZGVmaW5lIFNZTV9FSF9ET19JR05PUkUJMAorI2RlZmluZSBTWU1fRUhfRE9fQ09NUExFVEUJMQorI2RlZmluZSBTWU1fRUhfRE9fV0FJVAkJMgorCisvKgorICogIE91ciBnZW5lcmFsIGNvbXBsZXRpb24gaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgX19zeW1fZWhfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCB0aW1lZF9vdXQpCit7CisJc3RydWN0IHN5bV9laF93YWl0ICplcCA9IFNZTV9VQ01EX1BUUihjbWQpLT5laF93YWl0OworCWlmICghZXApCisJCXJldHVybjsKKworCS8qIFRyeSB0byBhdm9pZCBhIHJhY2UgaGVyZSAobm90IDEwMCUgc2FmZSkgKi8KKwlpZiAoIXRpbWVkX291dCkgeworCQllcC0+dGltZWRfb3V0ID0gMDsKKwkJaWYgKGVwLT50b19kbyA9PSBTWU1fRUhfRE9fV0FJVCAmJiAhZGVsX3RpbWVyKCZlcC0+dGltZXIpKQorCQkJcmV0dXJuOworCX0KKworCS8qIFJldmVydCBldmVyeXRoaW5nICovCisJU1lNX1VDTURfUFRSKGNtZCktPmVoX3dhaXQgPSBOVUxMOworCWNtZC0+c2NzaV9kb25lID0gZXAtPm9sZF9kb25lOworCisJLyogV2FrZSB1cCB0aGUgZWggdGhyZWFkIGlmIGl0IHdhbnRzIHRvIHNsZWVwICovCisJaWYgKGVwLT50b19kbyA9PSBTWU1fRUhfRE9fV0FJVCkKKwkJY29tcGxldGUoJmVwLT5kb25lKTsKK30KKworLyoKKyAqICBzY3NpX2RvbmUoKSBhbGlhcyB3aGVuIGVycm9yIHJlY292ZXJ5IGlzIGluIHByb2dyZXNzLiAKKyAqLworc3RhdGljIHZvaWQgc3ltX2VoX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKSB7IF9fc3ltX2VoX2RvbmUoY21kLCAwKTsgfQorCisvKgorICogIFNvbWUgdGltZW91dCBoYW5kbGVyIHRvIGF2b2lkIHdhaXRpbmcgdG9vIGxvbmcuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9laF90aW1lb3V0KHVfbG9uZyBwKSB7IF9fc3ltX2VoX2RvbmUoKHN0cnVjdCBzY3NpX2NtbmQgKilwLCAxKTsgfQorCisvKgorICogIEdlbmVyaWMgbWV0aG9kIGZvciBvdXIgZWggcHJvY2Vzc2luZy4KKyAqICBUaGUgJ29wJyBhcmd1bWVudCB0ZWxscyB3aGF0IHdlIGhhdmUgdG8gZG8uCisgKi8KK3N0YXRpYyBpbnQgc3ltX2VoX2hhbmRsZXIoaW50IG9wLCBjaGFyICpvcG5hbWUsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBTWU1fU09GVENfUFRSKGNtZCk7CisJU1lNX1FVRUhFQUQgKnFwOworCWludCB0b19kbyA9IFNZTV9FSF9ET19JR05PUkU7CisJaW50IHN0cyA9IC0xOworCXN0cnVjdCBzeW1fZWhfd2FpdCBlaCwgKmVwID0gJmVoOworCisJZGV2X3dhcm4oJmNtZC0+ZGV2aWNlLT5zZGV2X2dlbmRldiwgIiVzIG9wZXJhdGlvbiBzdGFydGVkLlxuIiwgb3BuYW1lKTsKKworI2lmIDAKKwkvKiBUaGlzIG9uZSBzaG91bGQgYmUgdGhlIHJlc3VsdCBvZiBzb21lIHJhY2UsIHRodXMgdG8gaWdub3JlICovCisJaWYgKGNtZC0+c2VyaWFsX251bWJlciAhPSBjbWQtPnNlcmlhbF9udW1iZXJfYXRfdGltZW91dCkKKwkJZ290byBwcmVwYXJlOworI2VuZGlmCisKKwkvKiBUaGlzIG9uZSBpcyBxdWV1ZWQgaW4gc29tZSBwbGFjZSAtPiB0byB3YWl0IGZvciBjb21wbGV0aW9uICovCisJRk9SX0VBQ0hfUVVFVUVEX0VMRU1FTlQoJm5wLT5idXN5X2NjYnEsIHFwKSB7CisJCXN0cnVjdCBzeW1fY2NiICpjcCA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rX2NjYnEpOworCQlpZiAoY3AtPmNtZCA9PSBjbWQpIHsKKwkJCXRvX2RvID0gU1lNX0VIX0RPX1dBSVQ7CisJCQlnb3RvIHByZXBhcmU7CisJCX0KKwl9CisKK3ByZXBhcmU6CisJLyogUHJlcGFyZSBzdHVmZiB0byBlaXRoZXIgaWdub3JlLCBjb21wbGV0ZSBvciB3YWl0IGZvciBjb21wbGV0aW9uICovCisJc3dpdGNoKHRvX2RvKSB7CisJZGVmYXVsdDoKKwljYXNlIFNZTV9FSF9ET19JR05PUkU6CisJCWJyZWFrOworCWNhc2UgU1lNX0VIX0RPX1dBSVQ6CisJCWluaXRfY29tcGxldGlvbigmZXAtPmRvbmUpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNZTV9FSF9ET19DT01QTEVURToKKwkJZXAtPm9sZF9kb25lID0gY21kLT5zY3NpX2RvbmU7CisJCWNtZC0+c2NzaV9kb25lID0gc3ltX2VoX2RvbmU7CisJCVNZTV9VQ01EX1BUUihjbWQpLT5laF93YWl0ID0gZXA7CisJfQorCisJLyogVHJ5IHRvIHByb2NlZWQgdGhlIG9wZXJhdGlvbiB3ZSBoYXZlIGJlZW4gYXNrZWQgZm9yICovCisJc3RzID0gLTE7CisJc3dpdGNoKG9wKSB7CisJY2FzZSBTWU1fRUhfQUJPUlQ6CisJCXN0cyA9IHN5bV9hYm9ydF9zY3NpaW8obnAsIGNtZCwgMSk7CisJCWJyZWFrOworCWNhc2UgU1lNX0VIX0RFVklDRV9SRVNFVDoKKwkJc3RzID0gc3ltX3Jlc2V0X3Njc2lfdGFyZ2V0KG5wLCBjbWQtPmRldmljZS0+aWQpOworCQlicmVhazsKKwljYXNlIFNZTV9FSF9CVVNfUkVTRVQ6CisJCXN5bV9yZXNldF9zY3NpX2J1cyhucCwgMSk7CisJCXN0cyA9IDA7CisJCWJyZWFrOworCWNhc2UgU1lNX0VIX0hPU1RfUkVTRVQ6CisJCXN5bV9yZXNldF9zY3NpX2J1cyhucCwgMCk7CisJCXN5bV9zdGFydF91cCAobnAsIDEpOworCQlzdHMgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBPbiBlcnJvciwgcmVzdG9yZSBldmVyeXRoaW5nIGFuZCBjcm9zcyBmaW5nZXJzIDopICovCisJaWYgKHN0cykgeworCQlTWU1fVUNNRF9QVFIoY21kKS0+ZWhfd2FpdCA9IE5VTEw7CisJCWNtZC0+c2NzaV9kb25lID0gZXAtPm9sZF9kb25lOworCQl0b19kbyA9IFNZTV9FSF9ET19JR05PUkU7CisJfQorCisJZXAtPnRvX2RvID0gdG9fZG87CisJLyogQ29tcGxldGUgdGhlIGNvbW1hbmQgd2l0aCBsb2NrcyBoZWxkIGFzIHJlcXVpcmVkIGJ5IHRoZSBkcml2ZXIgKi8KKwlpZiAodG9fZG8gPT0gU1lNX0VIX0RPX0NPTVBMRVRFKQorCQlzeW1feHB0X2RvbmUyKG5wLCBjbWQsIENBTV9SRVFfQUJPUlRFRCk7CisKKwkvKiBXYWl0IGZvciBjb21wbGV0aW9uIHdpdGggbG9ja3MgcmVsZWFzZWQsIGFzIHJlcXVpcmVkIGJ5IGtlcm5lbCAqLworCWlmICh0b19kbyA9PSBTWU1fRUhfRE9fV0FJVCkgeworCQlpbml0X3RpbWVyKCZlcC0+dGltZXIpOworCQllcC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoNSpIWik7CisJCWVwLT50aW1lci5mdW5jdGlvbiA9IHN5bV9laF90aW1lb3V0OworCQllcC0+dGltZXIuZGF0YSA9ICh1X2xvbmcpY21kOworCQllcC0+dGltZWRfb3V0ID0gMTsJLyogQmUgcGVzc2ltaXN0aWMgZm9yIG9uY2UgOikgKi8KKwkJYWRkX3RpbWVyKCZlcC0+dGltZXIpOworCQlzcGluX3VubG9ja19pcnEobnAtPnMuaG9zdC0+aG9zdF9sb2NrKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZXAtPmRvbmUpOworCQlzcGluX2xvY2tfaXJxKG5wLT5zLmhvc3QtPmhvc3RfbG9jayk7CisJCWlmIChlcC0+dGltZWRfb3V0KQorCQkJc3RzID0gLTI7CisJfQorCWRldl93YXJuKCZjbWQtPmRldmljZS0+c2Rldl9nZW5kZXYsICIlcyBvcGVyYXRpb24gJXMuXG4iLCBvcG5hbWUsCisJCQlzdHM9PTAgPyAiY29tcGxldGUiIDpzdHM9PS0yID8gInRpbWVkLW91dCIgOiAiZmFpbGVkIik7CisJcmV0dXJuIHN0cyA/IFNDU0lfRkFJTEVEIDogU0NTSV9TVUNDRVNTOworfQorCisKKy8qCisgKiBFcnJvciBoYW5kbGVycyBjYWxsZWQgZnJvbSB0aGUgZWggdGhyZWFkIChvbmUgdGhyZWFkIHBlciBIQkEpLgorICovCitzdGF0aWMgaW50IHN5bTUzYzh4eF9laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlyZXR1cm4gc3ltX2VoX2hhbmRsZXIoU1lNX0VIX0FCT1JULCAiQUJPUlQiLCBjbWQpOworfQorCitzdGF0aWMgaW50IHN5bTUzYzh4eF9laF9kZXZpY2VfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJcmV0dXJuIHN5bV9laF9oYW5kbGVyKFNZTV9FSF9ERVZJQ0VfUkVTRVQsICJERVZJQ0UgUkVTRVQiLCBjbWQpOworfQorCitzdGF0aWMgaW50IHN5bTUzYzh4eF9laF9idXNfcmVzZXRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJcmV0dXJuIHN5bV9laF9oYW5kbGVyKFNZTV9FSF9CVVNfUkVTRVQsICJCVVMgUkVTRVQiLCBjbWQpOworfQorCitzdGF0aWMgaW50IHN5bTUzYzh4eF9laF9ob3N0X3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBzeW1fZWhfaGFuZGxlcihTWU1fRUhfSE9TVF9SRVNFVCwgIkhPU1QgUkVTRVQiLCBjbWQpOworfQorCisvKgorICogIFR1bmUgZGV2aWNlIHF1ZXVpbmcgZGVwdGgsIGFjY29yZGluZyB0byB2YXJpb3VzIGxpbWl0cy4KKyAqLworc3RhdGljIHZvaWQgc3ltX3R1bmVfZGV2X3F1ZXVpbmcoc3RydWN0IHN5bV90Y2IgKnRwLCBpbnQgbHVuLCB1X3Nob3J0IHJlcXRhZ3MpCit7CisJc3RydWN0IHN5bV9sY2IgKmxwID0gc3ltX2xwKHRwLCBsdW4pOworCXVfc2hvcnQJb2xkdGFnczsKKworCWlmICghbHApCisJCXJldHVybjsKKworCW9sZHRhZ3MgPSBscC0+cy5yZXF0YWdzOworCisJaWYgKHJlcXRhZ3MgPiBscC0+cy5zY2Rldl9kZXB0aCkKKwkJcmVxdGFncyA9IGxwLT5zLnNjZGV2X2RlcHRoOworCisJbHAtPnN0YXJ0ZWRfbGltaXQgPSByZXF0YWdzID8gcmVxdGFncyA6IDI7CisJbHAtPnN0YXJ0ZWRfbWF4ICAgPSAxOworCWxwLT5zLnJlcXRhZ3MgICAgID0gcmVxdGFnczsKKworCWlmIChyZXF0YWdzICE9IG9sZHRhZ3MpIHsKKwkJZGV2X2luZm8oJnRwLT5zZGV2LT5zZGV2X3RhcmdldC0+ZGV2LAorCQkgICAgICAgICAidGFnZ2VkIGNvbW1hbmQgcXVldWluZyAlcywgY29tbWFuZCBxdWV1ZSBkZXB0aCAlZC5cbiIsCisJCSAgICAgICAgICBscC0+cy5yZXF0YWdzID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKyAJCSAgICAgICAgICBscC0+c3RhcnRlZF9saW1pdCk7CisJfQorfQorCisvKgorICogIExpbnV4IHNlbGVjdCBxdWV1ZSBkZXB0aHMgZnVuY3Rpb24KKyAqLworI2RlZmluZSBERUZfREVQVEgJKHN5bV9kcml2ZXJfc2V0dXAubWF4X3RhZykKKyNkZWZpbmUgQUxMX1RBUkdFVFMJLTIKKyNkZWZpbmUgTk9fVEFSR0VUCS0xCisjZGVmaW5lIEFMTF9MVU5TCS0yCisjZGVmaW5lIE5PX0xVTgkJLTEKKworc3RhdGljIGludCBkZXZpY2VfcXVldWVfZGVwdGgoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKQoreworCWludCBjLCBoLCB0LCB1LCB2OworCWNoYXIgKnAgPSBzeW1fZHJpdmVyX3NldHVwLnRhZ19jdHJsOworCWNoYXIgKmVwOworCisJaCA9IC0xOworCXQgPSBOT19UQVJHRVQ7CisJdSA9IE5PX0xVTjsKKwl3aGlsZSAoKGMgPSAqcCsrKSAhPSAwKSB7CisJCXYgPSBzaW1wbGVfc3RydG91bChwLCAmZXAsIDApOworCQlzd2l0Y2goYykgeworCQljYXNlICcvJzoKKwkJCSsraDsKKwkJCXQgPSBBTExfVEFSR0VUUzsKKwkJCXUgPSBBTExfTFVOUzsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWlmICh0ICE9IHRhcmdldCkKKwkJCQl0ID0gKHRhcmdldCA9PSB2KSA/IHYgOiBOT19UQVJHRVQ7CisJCQl1ID0gQUxMX0xVTlM7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlpZiAodSAhPSBsdW4pCisJCQkJdSA9IChsdW4gPT0gdikgPyB2IDogTk9fTFVOOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJaWYgKGggPT0gbnAtPnMudW5pdCAmJgorCQkJCSh0ID09IEFMTF9UQVJHRVRTIHx8IHQgPT0gdGFyZ2V0KSAmJgorCQkJCSh1ID09IEFMTF9MVU5TICAgIHx8IHUgPT0gbHVuKSkKKwkJCQlyZXR1cm4gdjsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCXQgPSBBTExfVEFSR0VUUzsKKwkJCXUgPSBBTExfTFVOUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcCA9IGVwOworCX0KKwlyZXR1cm4gREVGX0RFUFRIOworfQorCitzdGF0aWMgaW50IHN5bTUzYzh4eF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihkZXZpY2UtPmhvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W2RldmljZS0+aWRdOworCWlmICghdHAtPnNkZXYpCisJCXRwLT5zZGV2ID0gZGV2aWNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN5bTUzYzh4eF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKGRldmljZS0+aG9zdCk7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbZGV2aWNlLT5pZF07CisJaWYgKHRwLT5zZGV2ID09IGRldmljZSkKKwkJdHAtPnNkZXYgPSBOVUxMOworfQorCisvKgorICogTGludXggZW50cnkgcG9pbnQgZm9yIGRldmljZSBxdWV1ZSBzaXppbmcuCisgKi8KK3N0YXRpYyBpbnQgc3ltNTNjOHh4X3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihkZXZpY2UtPmhvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W2RldmljZS0+aWRdOworCXN0cnVjdCBzeW1fbGNiICpscDsKKwlpbnQgcmVxdGFncywgZGVwdGhfdG9fdXNlOworCisJLyoKKwkgKiAgQWxsb2NhdGUgdGhlIExDQiBpZiBub3QgeWV0LgorCSAqICBJZiBpdCBmYWlsLCB3ZSBtYXkgd2VsbCBiZSBpbiB0aGUgc2gqdC4gOikKKwkgKi8KKwlscCA9IHN5bV9hbGxvY19sY2IobnAsIGRldmljZS0+aWQsIGRldmljZS0+bHVuKTsKKwlpZiAoIWxwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogIEdldCB1c2VyIGZsYWdzLgorCSAqLworCWxwLT5jdXJyX2ZsYWdzID0gbHAtPnVzZXJfZmxhZ3M7CisKKwkvKgorCSAqICBTZWxlY3QgcXVldWUgZGVwdGggZnJvbSBkcml2ZXIgc2V0dXAuCisJICogIERvbm5vdCB1c2UgbW9yZSB0aGFuIGNvbmZpZ3VyZWQgYnkgdXNlci4KKwkgKiAgVXNlIGF0IGxlYXN0IDIuCisJICogIERvbm5vdCB1c2UgbW9yZSB0aGFuIG91ciBtYXhpbXVtLgorCSAqLworCXJlcXRhZ3MgPSBkZXZpY2VfcXVldWVfZGVwdGgobnAsIGRldmljZS0+aWQsIGRldmljZS0+bHVuKTsKKwlpZiAocmVxdGFncyA+IHRwLT51c3J0YWdzKQorCQlyZXF0YWdzID0gdHAtPnVzcnRhZ3M7CisJaWYgKCFkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpCisJCXJlcXRhZ3MgPSAwOworI2lmIDEgLyogQXZvaWQgdG8gbG9jYWxseSBxdWV1ZSBjb21tYW5kcyBmb3Igbm8gZ29vZCByZWFzb25zICovCisJaWYgKHJlcXRhZ3MgPiBTWU1fQ09ORl9NQVhfVEFHKQorCQlyZXF0YWdzID0gU1lNX0NPTkZfTUFYX1RBRzsKKwlkZXB0aF90b191c2UgPSAocmVxdGFncyA/IHJlcXRhZ3MgOiAyKTsKKyNlbHNlCisJZGVwdGhfdG9fdXNlID0gKHJlcXRhZ3MgPyBTWU1fQ09ORl9NQVhfVEFHIDogMik7CisjZW5kaWYKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsCisJCQkJKGRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCA/CisJCQkJIE1TR19TSU1QTEVfVEFHIDogMCksCisJCQkJZGVwdGhfdG9fdXNlKTsKKwlscC0+cy5zY2Rldl9kZXB0aCA9IGRlcHRoX3RvX3VzZTsKKwlzeW1fdHVuZV9kZXZfcXVldWluZyh0cCwgZGV2aWNlLT5sdW4sIHJlcXRhZ3MpOworCisJaWYgKCFzcGlfaW5pdGlhbF9kdihkZXZpY2UtPnNkZXZfdGFyZ2V0KSkKKwkJc3BpX2R2X2RldmljZShkZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgTGludXggZW50cnkgcG9pbnQgZm9yIGluZm8oKSBmdW5jdGlvbgorICovCitzdGF0aWMgY29uc3QgY2hhciAqc3ltNTNjOHh4X2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuIFNZTV9EUklWRVJfTkFNRTsKK30KKworCisjaWZkZWYgU1lNX0xJTlVYX1BST0NfSU5GT19TVVBQT1JUCisvKgorICogIFByb2MgZmlsZSBzeXN0ZW0gc3R1ZmYKKyAqCisgKiAgQSByZWFkIG9wZXJhdGlvbiByZXR1cm5zIGFkYXB0ZXIgaW5mb3JtYXRpb24uCisgKiAgQSB3cml0ZSBvcGVyYXRpb24gaXMgYSBjb250cm9sIGNvbW1hbmQuCisgKiAgVGhlIHN0cmluZyBpcyBwYXJzZWQgaW4gdGhlIGRyaXZlciBjb2RlIGFuZCB0aGUgY29tbWFuZCBpcyBwYXNzZWQgCisgKiAgdG8gdGhlIHN5bV91c2VyY21kKCkgZnVuY3Rpb24uCisgKi8KKworI2lmZGVmIFNZTV9MSU5VWF9VU0VSX0NPTU1BTkRfU1VQUE9SVAorCitzdHJ1Y3QJc3ltX3VzcmNtZCB7CisJdV9sb25nCXRhcmdldDsKKwl1X2xvbmcJbHVuOworCXVfbG9uZwlkYXRhOworCXVfbG9uZwljbWQ7Cit9OworCisjZGVmaW5lIFVDX1NFVFNZTkMgICAgICAxMAorI2RlZmluZSBVQ19TRVRUQUdTCTExCisjZGVmaW5lIFVDX1NFVERFQlVHCTEyCisjZGVmaW5lIFVDX1NFVFdJREUJMTQKKyNkZWZpbmUgVUNfU0VURkxBRwkxNQorI2RlZmluZSBVQ19TRVRWRVJCT1NFCTE3CisjZGVmaW5lIFVDX1JFU0VUREVWCTE4CisjZGVmaW5lIFVDX0NMRUFSREVWCTE5CisKK3N0YXRpYyB2b2lkIHN5bV9leGVjX3VzZXJfY29tbWFuZCAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3VzcmNtZCAqdWMpCit7CisJc3RydWN0IHN5bV90Y2IgKnRwOworCWludCB0LCBsOworCisJc3dpdGNoICh1Yy0+Y21kKSB7CisJY2FzZSAwOiByZXR1cm47CisKKyNpZmRlZiBTWU1fTElOVVhfREVCVUdfQ09OVFJPTF9TVVBQT1JUCisJY2FzZSBVQ19TRVRERUJVRzoKKwkJc3ltX2RlYnVnX2ZsYWdzID0gdWMtPmRhdGE7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBVQ19TRVRWRVJCT1NFOgorCQlucC0+dmVyYm9zZSA9IHVjLT5kYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBXZSBhc3N1bWUgdGhhdCBvdGhlciBjb21tYW5kcyBhcHBseSB0byB0YXJnZXRzLgorCQkgKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIGNhc2UgYW5kIGF2b2lkIHRoZSBiZWxvdyAKKwkJICogNCBsaW5lcyB0byBiZSByZXBlYXRlZCA2IHRpbWVzLgorCQkgKi8KKwkJZm9yICh0ID0gMDsgdCA8IFNZTV9DT05GX01BWF9UQVJHRVQ7IHQrKykgeworCQkJaWYgKCEoKHVjLT50YXJnZXQgPj4gdCkgJiAxKSkKKwkJCQljb250aW51ZTsKKwkJCXRwID0gJm5wLT50YXJnZXRbdF07CisKKwkJCXN3aXRjaCAodWMtPmNtZCkgeworCisJCQljYXNlIFVDX1NFVFNZTkM6CisJCQkJaWYgKCF1Yy0+ZGF0YSB8fCB1Yy0+ZGF0YSA+PSAyNTUpIHsKKwkJCQkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0KKwkJCQkJCXRwLT50Z29hbC5xYXMgPSAwOworCQkJCQl0cC0+dGdvYWwub2Zmc2V0ID0gMDsKKwkJCQl9IGVsc2UgaWYgKHVjLT5kYXRhIDw9IDkgJiYgbnAtPm1pbnN5bmNfZHQpIHsKKwkJCQkJaWYgKHVjLT5kYXRhIDwgbnAtPm1pbnN5bmNfZHQpCisJCQkJCQl1Yy0+ZGF0YSA9IG5wLT5taW5zeW5jX2R0OworCQkJCQl0cC0+dGdvYWwuaXUgPSB0cC0+dGdvYWwuZHQgPQorCQkJCQkJdHAtPnRnb2FsLnFhcyA9IDE7CisJCQkJCXRwLT50Z29hbC53aWR0aCA9IDE7CisJCQkJCXRwLT50Z29hbC5wZXJpb2QgPSB1Yy0+ZGF0YTsKKwkJCQkJdHAtPnRnb2FsLm9mZnNldCA9IG5wLT5tYXhvZmZzX2R0OworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh1Yy0+ZGF0YSA8IG5wLT5taW5zeW5jKQorCQkJCQkJdWMtPmRhdGEgPSBucC0+bWluc3luYzsKKwkJCQkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0KKwkJCQkJCXRwLT50Z29hbC5xYXMgPSAwOworCQkJCQl0cC0+dGdvYWwucGVyaW9kID0gdWMtPmRhdGE7CisJCQkJCXRwLT50Z29hbC5vZmZzZXQgPSBucC0+bWF4b2ZmczsKKwkJCQl9CisJCQkJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBVQ19TRVRXSURFOgorCQkJCXRwLT50Z29hbC53aWR0aCA9IHVjLT5kYXRhID8gMSA6IDA7CisJCQkJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBVQ19TRVRUQUdTOgorCQkJCWZvciAobCA9IDA7IGwgPCBTWU1fQ09ORl9NQVhfTFVOOyBsKyspCisJCQkJCXN5bV90dW5lX2Rldl9xdWV1aW5nKHRwLCBsLCB1Yy0+ZGF0YSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVDX1JFU0VUREVWOgorCQkJCXRwLT50b19yZXNldCA9IDE7CisJCQkJbnAtPmlzdGF0X3NlbSA9IFNFTTsKKwkJCQlPVVRCKG5wLCBuY19pc3RhdCwgU0lHUHxTRU0pOworCQkJCWJyZWFrOworCQkJY2FzZSBVQ19DTEVBUkRFVjoKKwkJCQlmb3IgKGwgPSAwOyBsIDwgU1lNX0NPTkZfTUFYX0xVTjsgbCsrKSB7CisJCQkJCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgbCk7CisJCQkJCWlmIChscCkgbHAtPnRvX2NsZWFyID0gMTsKKwkJCQl9CisJCQkJbnAtPmlzdGF0X3NlbSA9IFNFTTsKKwkJCQlPVVRCKG5wLCBuY19pc3RhdCwgU0lHUHxTRU0pOworCQkJCWJyZWFrOworCQkJY2FzZSBVQ19TRVRGTEFHOgorCQkJCXRwLT51c3JmbGFncyA9IHVjLT5kYXRhOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBza2lwX3NwYWNlcyhjaGFyICpwdHIsIGludCBsZW4pCit7CisJaW50IGNudCwgYzsKKworCWZvciAoY250ID0gbGVuOyBjbnQgPiAwICYmIChjID0gKnB0cisrKSAmJiBpc3NwYWNlKGMpOyBjbnQtLSk7CisKKwlyZXR1cm4gKGxlbiAtIGNudCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ludF9hcmcoY2hhciAqcHRyLCBpbnQgbGVuLCB1X2xvbmcgKnB2KQoreworCWNoYXIgKmVuZDsKKworCSpwdiA9IHNpbXBsZV9zdHJ0b3VsKHB0ciwgJmVuZCwgMTApOworCXJldHVybiAoZW5kIC0gcHRyKTsKK30KKworc3RhdGljIGludCBpc19rZXl3b3JkKGNoYXIgKnB0ciwgaW50IGxlbiwgY2hhciAqdmVyYikKK3sKKwlpbnQgdmVyYl9sZW4gPSBzdHJsZW4odmVyYik7CisKKwlpZiAobGVuID49IHZlcmJfbGVuICYmICFtZW1jbXAodmVyYiwgcHRyLCB2ZXJiX2xlbikpCisJCXJldHVybiB2ZXJiX2xlbjsKKwllbHNlCisJCXJldHVybiAwOworfQorCisjZGVmaW5lIFNLSVBfU1BBQ0VTKHB0ciwgbGVuKQkJCQkJCVwKKwlpZiAoKGFyZ19sZW4gPSBza2lwX3NwYWNlcyhwdHIsIGxlbikpIDwgMSkJCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwlwdHIgKz0gYXJnX2xlbjsgbGVuIC09IGFyZ19sZW47CisKKyNkZWZpbmUgR0VUX0lOVF9BUkcocHRyLCBsZW4sIHYpCQkJCQlcCisJaWYgKCEoYXJnX2xlbiA9IGdldF9pbnRfYXJnKHB0ciwgbGVuLCAmKHYpKSkpCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJcHRyICs9IGFyZ19sZW47IGxlbiAtPSBhcmdfbGVuOworCisKKy8qCisgKiBQYXJzZSBhIGNvbnRyb2wgY29tbWFuZAorICovCisKK3N0YXRpYyBpbnQgc3ltX3VzZXJfY29tbWFuZChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwljaGFyICpwdHIJPSBidWZmZXI7CisJaW50IGxlbgkJPSBsZW5ndGg7CisJc3RydWN0IHN5bV91c3JjbWQgY21kLCAqdWMgPSAmY21kOworCWludAkJYXJnX2xlbjsKKwl1X2xvbmcgCQl0YXJnZXQ7CisKKwltZW1zZXQodWMsIDAsIHNpemVvZigqdWMpKTsKKworCWlmIChsZW4gPiAwICYmIHB0cltsZW4tMV0gPT0gJ1xuJykKKwkJLS1sZW47CisKKwlpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2V0c3luYyIpKSAhPSAwKQorCQl1Yy0+Y21kID0gVUNfU0VUU1lOQzsKKwllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJzZXR0YWdzIikpICE9IDApCisJCXVjLT5jbWQgPSBVQ19TRVRUQUdTOworCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInNldHZlcmJvc2UiKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX1NFVFZFUkJPU0U7CisJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2V0d2lkZSIpKSAhPSAwKQorCQl1Yy0+Y21kID0gVUNfU0VUV0lERTsKKyNpZmRlZiBTWU1fTElOVVhfREVCVUdfQ09OVFJPTF9TVVBQT1JUCisJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2V0ZGVidWciKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX1NFVERFQlVHOworI2VuZGlmCisJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAic2V0ZmxhZyIpKSAhPSAwKQorCQl1Yy0+Y21kID0gVUNfU0VURkxBRzsKKwllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJyZXNldGRldiIpKSAhPSAwKQorCQl1Yy0+Y21kID0gVUNfUkVTRVRERVY7CisJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAiY2xlYXJkZXYiKSkgIT0gMCkKKwkJdWMtPmNtZCA9IFVDX0NMRUFSREVWOworCWVsc2UKKwkJYXJnX2xlbiA9IDA7CisKKyNpZmRlZiBERUJVR19QUk9DX0lORk8KK3ByaW50aygic3ltX3VzZXJfY29tbWFuZDogYXJnX2xlbj0lZCwgY21kPSVsZFxuIiwgYXJnX2xlbiwgdWMtPmNtZCk7CisjZW5kaWYKKworCWlmICghYXJnX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHRyICs9IGFyZ19sZW47IGxlbiAtPSBhcmdfbGVuOworCisJc3dpdGNoKHVjLT5jbWQpIHsKKwljYXNlIFVDX1NFVFNZTkM6CisJY2FzZSBVQ19TRVRUQUdTOgorCWNhc2UgVUNfU0VUV0lERToKKwljYXNlIFVDX1NFVEZMQUc6CisJY2FzZSBVQ19SRVNFVERFVjoKKwljYXNlIFVDX0NMRUFSREVWOgorCQlTS0lQX1NQQUNFUyhwdHIsIGxlbik7CisJCWlmICgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJhbGwiKSkgIT0gMCkgeworCQkJcHRyICs9IGFyZ19sZW47IGxlbiAtPSBhcmdfbGVuOworCQkJdWMtPnRhcmdldCA9IH4wOworCQl9IGVsc2UgeworCQkJR0VUX0lOVF9BUkcocHRyLCBsZW4sIHRhcmdldCk7CisJCQl1Yy0+dGFyZ2V0ID0gKDE8PHRhcmdldCk7CisjaWZkZWYgREVCVUdfUFJPQ19JTkZPCitwcmludGsoInN5bV91c2VyX2NvbW1hbmQ6IHRhcmdldD0lbGRcbiIsIHRhcmdldCk7CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwl9CisKKwlzd2l0Y2godWMtPmNtZCkgeworCWNhc2UgVUNfU0VUVkVSQk9TRToKKwljYXNlIFVDX1NFVFNZTkM6CisJY2FzZSBVQ19TRVRUQUdTOgorCWNhc2UgVUNfU0VUV0lERToKKwkJU0tJUF9TUEFDRVMocHRyLCBsZW4pOworCQlHRVRfSU5UX0FSRyhwdHIsIGxlbiwgdWMtPmRhdGEpOworI2lmZGVmIERFQlVHX1BST0NfSU5GTworcHJpbnRrKCJzeW1fdXNlcl9jb21tYW5kOiBkYXRhPSVsZFxuIiwgdWMtPmRhdGEpOworI2VuZGlmCisJCWJyZWFrOworI2lmZGVmIFNZTV9MSU5VWF9ERUJVR19DT05UUk9MX1NVUFBPUlQKKwljYXNlIFVDX1NFVERFQlVHOgorCQl3aGlsZSAobGVuID4gMCkgeworCQkJU0tJUF9TUEFDRVMocHRyLCBsZW4pOworCQkJaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgImFsbG9jIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX0FMTE9DOworCQkJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAicGhhc2UiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfUEhBU0U7CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJxdWV1ZSIpKSkKKwkJCQl1Yy0+ZGF0YSB8PSBERUJVR19RVUVVRTsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInJlc3VsdCIpKSkKKwkJCQl1Yy0+ZGF0YSB8PSBERUJVR19SRVNVTFQ7CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJzY2F0dGVyIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX1NDQVRURVI7CisJCQllbHNlIGlmCSgoYXJnX2xlbiA9IGlzX2tleXdvcmQocHRyLCBsZW4sICJzY3JpcHQiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfU0NSSVBUOworCQkJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAidGlueSIpKSkKKwkJCQl1Yy0+ZGF0YSB8PSBERUJVR19USU5ZOworCQkJZWxzZSBpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAidGltaW5nIikpKQorCQkJCXVjLT5kYXRhIHw9IERFQlVHX1RJTUlORzsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgIm5lZ28iKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfTkVHTzsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInRhZ3MiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfVEFHUzsKKwkJCWVsc2UgaWYJKChhcmdfbGVuID0gaXNfa2V5d29yZChwdHIsIGxlbiwgInBvaW50ZXIiKSkpCisJCQkJdWMtPmRhdGEgfD0gREVCVUdfUE9JTlRFUjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXB0ciArPSBhcmdfbGVuOyBsZW4gLT0gYXJnX2xlbjsKKwkJfQorI2lmZGVmIERFQlVHX1BST0NfSU5GTworcHJpbnRrKCJzeW1fdXNlcl9jb21tYW5kOiBkYXRhPSVsZFxuIiwgdWMtPmRhdGEpOworI2VuZGlmCisJCWJyZWFrOworI2VuZGlmIC8qIFNZTV9MSU5VWF9ERUJVR19DT05UUk9MX1NVUFBPUlQgKi8KKwljYXNlIFVDX1NFVEZMQUc6CisJCXdoaWxlIChsZW4gPiAwKSB7CisJCQlTS0lQX1NQQUNFUyhwdHIsIGxlbik7CisJCQlpZgkoKGFyZ19sZW4gPSBpc19rZXl3b3JkKHB0ciwgbGVuLCAibm9fZGlzYyIpKSkKKwkJCQl1Yy0+ZGF0YSAmPSB+U1lNX0RJU0NfRU5BQkxFRDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXB0ciArPSBhcmdfbGVuOyBsZW4gLT0gYXJnX2xlbjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAobGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShucC0+cy5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJc3ltX2V4ZWNfdXNlcl9jb21tYW5kIChucCwgdWMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG5wLT5zLmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gbGVuZ3RoOworfQorCisjZW5kaWYJLyogU1lNX0xJTlVYX1VTRVJfQ09NTUFORF9TVVBQT1JUICovCisKKworI2lmZGVmIFNZTV9MSU5VWF9VU0VSX0lORk9fU1VQUE9SVAorLyoKKyAqICBJbmZvcm1hdGlvbnMgdGhyb3VnaCB0aGUgcHJvYyBmaWxlIHN5c3RlbS4KKyAqLworc3RydWN0IGluZm9fc3RyIHsKKwljaGFyICpidWZmZXI7CisJaW50IGxlbmd0aDsKKwlpbnQgb2Zmc2V0OworCWludCBwb3M7Cit9OworCitzdGF0aWMgdm9pZCBjb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpZiAoaW5mby0+cG9zICsgbGVuID4gaW5mby0+bGVuZ3RoKQorCQlsZW4gPSBpbmZvLT5sZW5ndGggLSBpbmZvLT5wb3M7CisKKwlpZiAoaW5mby0+cG9zICsgbGVuIDwgaW5mby0+b2Zmc2V0KSB7CisJCWluZm8tPnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisJaWYgKGluZm8tPnBvcyA8IGluZm8tPm9mZnNldCkgeworCQlkYXRhICs9IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOworCQlsZW4gIC09IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOworCX0KKworCWlmIChsZW4gPiAwKSB7CisJCW1lbWNweShpbmZvLT5idWZmZXIgKyBpbmZvLT5wb3MsIGRhdGEsIGxlbik7CisJCWluZm8tPnBvcyArPSBsZW47CisJfQorfQorCitzdGF0aWMgaW50IGNvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIGJ1Zls4MV07CisJaW50IGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiAgQ29weSBmb3JtYXR0ZWQgaW5mb3JtYXRpb24gaW50byB0aGUgaW5wdXQgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHN5bV9ob3N0X2luZm8oc3RydWN0IHN5bV9oY2IgKm5wLCBjaGFyICpwdHIsIG9mZl90IG9mZnNldCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaW5mb19zdHIgaW5mbzsKKworCWluZm8uYnVmZmVyCT0gcHRyOworCWluZm8ubGVuZ3RoCT0gbGVuOworCWluZm8ub2Zmc2V0CT0gb2Zmc2V0OworCWluZm8ucG9zCT0gMDsKKworCWNvcHlfaW5mbygmaW5mbywgIkNoaXAgIiBOQU1FNTNDICIlcywgZGV2aWNlIGlkIDB4JXgsICIKKwkJCSAicmV2aXNpb24gaWQgMHgleFxuIiwKKwkJCSBucC0+cy5jaGlwX25hbWUsIG5wLT5kZXZpY2VfaWQsIG5wLT5yZXZpc2lvbl9pZCk7CisJY29weV9pbmZvKCZpbmZvLCAiQXQgUENJIGFkZHJlc3MgJXMsIElSUSAiIElSUV9GTVQgIlxuIiwKKwkJcGNpX25hbWUobnAtPnMuZGV2aWNlKSwgSVJRX1BSTShucC0+cy5pcnEpKTsKKwljb3B5X2luZm8oJmluZm8sICJNaW4uIHBlcmlvZCBmYWN0b3IgJWQsICVzIFNDU0kgQlVTJXNcbiIsCisJCQkgKGludCkgKG5wLT5taW5zeW5jX2R0ID8gbnAtPm1pbnN5bmNfZHQgOiBucC0+bWluc3luYyksCisJCQkgbnAtPm1heHdpZGUgPyAiV2lkZSIgOiAiTmFycm93IiwKKwkJCSBucC0+bWluc3luY19kdCA/ICIsIERUIGNhcGFibGUiIDogIiIpOworCisJY29weV9pbmZvKCZpbmZvLCAiTWF4LiBzdGFydGVkIGNvbW1hbmRzICVkLCAiCisJCQkgIm1heC4gY29tbWFuZHMgcGVyIExVTiAlZFxuIiwKKwkJCSBTWU1fQ09ORl9NQVhfU1RBUlQsIFNZTV9DT05GX01BWF9UQUcpOworCisJcmV0dXJuIGluZm8ucG9zID4gaW5mby5vZmZzZXQ/IGluZm8ucG9zIC0gaW5mby5vZmZzZXQgOiAwOworfQorI2VuZGlmIC8qIFNZTV9MSU5VWF9VU0VSX0lORk9fU1VQUE9SVCAqLworCisvKgorICogIEVudHJ5IHBvaW50IG9mIHRoZSBzY3NpIHByb2MgZnMgb2YgdGhlIGRyaXZlci4KKyAqICAtIGZ1bmMgPSAwIG1lYW5zIHJlYWQgIChyZXR1cm5zIGFkYXB0ZXIgaW5mb3MpCisgKiAgLSBmdW5jID0gMSBtZWFucyB3cml0ZSAobm90IHlldCBtZXJnZXQgZnJvbSBzeW01M2M4eHgpCisgKi8KK3N0YXRpYyBpbnQgc3ltNTNjOHh4X3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsCisJCQljaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGZ1bmMpCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2IoaG9zdCk7CisJaW50IHJldHY7CisKKwlpZiAoZnVuYykgeworI2lmZGVmCVNZTV9MSU5VWF9VU0VSX0NPTU1BTkRfU1VQUE9SVAorCQlyZXR2ID0gc3ltX3VzZXJfY29tbWFuZChucCwgYnVmZmVyLCBsZW5ndGgpOworI2Vsc2UKKwkJcmV0diA9IC1FSU5WQUw7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpZiAoc3RhcnQpCisJCQkqc3RhcnQgPSBidWZmZXI7CisjaWZkZWYgU1lNX0xJTlVYX1VTRVJfSU5GT19TVVBQT1JUCisJCXJldHYgPSBzeW1faG9zdF9pbmZvKG5wLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyNlbHNlCisJCXJldHYgPSAtRUlOVkFMOworI2VuZGlmCisJfQorCisJcmV0dXJuIHJldHY7Cit9CisjZW5kaWYgLyogU1lNX0xJTlVYX1BST0NfSU5GT19TVVBQT1JUICovCisKKy8qCisgKglGcmVlIGNvbnRyb2xsZXIgcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBzeW1fZnJlZV9yZXNvdXJjZXMoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwkvKgorCSAqICBGcmVlIE8vUyBzcGVjaWZpYyByZXNvdXJjZXMuCisJICovCisJaWYgKG5wLT5zLmlycSkKKwkJZnJlZV9pcnEobnAtPnMuaXJxLCBucCk7CisJaWYgKG5wLT5zLmlvYWRkcikKKwkJcGNpX2lvdW5tYXAocGRldiwgbnAtPnMuaW9hZGRyKTsKKwlpZiAobnAtPnMucmFtYWRkcikKKwkJcGNpX2lvdW5tYXAocGRldiwgbnAtPnMucmFtYWRkcik7CisJLyoKKwkgKiAgRnJlZSBPL1MgaW5kZXBlbmRlbnQgcmVzb3VyY2VzLgorCSAqLworCXN5bV9oY2JfZnJlZShucCk7CisKKwlzeW1fbWZyZWVfZG1hKG5wLCBzaXplb2YoKm5wKSwgIkhDQiIpOworfQorCisvKgorICogIEFzay90ZWxsIHRoZSBzeXN0ZW0gYWJvdXQgRE1BIGFkZHJlc3NpbmcuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3NldHVwX2J1c19kbWFfbWFzayhzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisjaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA+IDAKKyNpZiAgIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMQorI2RlZmluZQlETUFfREFDX01BU0sJMHgwMDAwMDBmZmZmZmZmZmZmVUxMIC8qIDQwLWJpdCAqLworI2VsaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisjZGVmaW5lCURNQV9EQUNfTUFTSwlETUFfNjRCSVRfTUFTSworI2VuZGlmCisJaWYgKChucC0+ZmVhdHVyZXMgJiBGRV9EQUMpICYmCisJCQkhcGNpX3NldF9kbWFfbWFzayhucC0+cy5kZXZpY2UsIERNQV9EQUNfTUFTSykpIHsKKwkJbnAtPnVzZV9kYWMgPSAxOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCWlmICghcGNpX3NldF9kbWFfbWFzayhucC0+cy5kZXZpY2UsIERNQV8zMkJJVF9NQVNLKSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGZfd2FybmluZygiJXM6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIsIHN5bV9uYW1lKG5wKSk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogIEhvc3QgYXR0YWNoIGFuZCBpbml0aWFsaXNhdGlvbnMuCisgKgorICogIEFsbG9jYXRlIGhvc3QgZGF0YSBhbmQgbmNiIHN0cnVjdHVyZS4KKyAqICBSZW1hcCBNTUlPIHJlZ2lvbi4KKyAqICBEbyBjaGlwIGluaXRpYWxpemF0aW9uLgorICogIElmIGFsbCBpcyBPSywgaW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxpbmcgYW5kCisgKiAgc3RhcnQgdGhlIHRpbWVyIGRhZW1vbi4KKyAqLworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKiBfX2RldmluaXQgc3ltX2F0dGFjaChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50LAorCQlpbnQgdW5pdCwgc3RydWN0IHN5bV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaG9zdF9kYXRhICpob3N0X2RhdGE7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3ltX2Z3ICpmdzsKKworCXByaW50ayhLRVJOX0lORk8KKwkJInN5bSVkOiA8JXM+IHJldiAweCV4IGF0IHBjaSAlcyBpcnEgIiBJUlFfRk1UICJcbiIsCisJCXVuaXQsIGRldi0+Y2hpcC5uYW1lLCBkZXYtPmNoaXAucmV2aXNpb25faWQsCisJCXBjaV9uYW1lKHBkZXYpLCBJUlFfUFJNKHBkZXYtPmlycSkpOworCisJLyoKKwkgKiAgR2V0IHRoZSBmaXJtd2FyZSBmb3IgdGhpcyBjaGlwLgorCSAqLworCWZ3ID0gc3ltX2ZpbmRfZmlybXdhcmUoJmRldi0+Y2hpcCk7CisJaWYgKCFmdykKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCisJLyoKKwkgKglBbGxvY2F0ZSBob3N0X2RhdGEgc3RydWN0dXJlCisJICovCisJaW5zdGFuY2UgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKCpob3N0X2RhdGEpKTsKKwlpZiAoIWluc3RhbmNlKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJaG9zdF9kYXRhID0gKHN0cnVjdCBob3N0X2RhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCisJLyoKKwkgKiAgQWxsb2NhdGUgaW1tZWRpYXRlbHkgdGhlIGhvc3QgY29udHJvbCBibG9jaywgCisJICogIHNpbmNlIHdlIGFyZSBvbmx5IGV4cGVjdGluZyB0byBzdWNjZWVkLiA6KQorCSAqICBXZSBrZWVwIHRyYWNrIGluIHRoZSBIQ0Igb2YgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCAKKwkgKiAgYXJlIHRvIGJlIHJlbGVhc2VkIG9uIGVycm9yLgorCSAqLworCW5wID0gX19zeW1fY2FsbG9jX2RtYSgmcGRldi0+ZGV2LCBzaXplb2YoKm5wKSwgIkhDQiIpOworCWlmICghbnApCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKwlucC0+cy5kZXZpY2UgPSBwZGV2OworCW5wLT5idXNfZG1hdCA9ICZwZGV2LT5kZXY7IC8qIFJlc3VsdCBpbiAxIERNQSBwb29sIHBlciBIQkEgKi8KKwlob3N0X2RhdGEtPm5jYiA9IG5wOworCW5wLT5zLmhvc3QgPSBpbnN0YW5jZTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBucCk7CisKKwkvKgorCSAqICBDb3B5IHNvbWUgdXNlZnVsIGluZm9zIHRvIHRoZSBIQ0IuCisJICovCisJbnAtPmhjYl9iYQk9IHZ0b2J1cyhucCk7CisJbnAtPnZlcmJvc2UJPSBzeW1fZHJpdmVyX3NldHVwLnZlcmJvc2U7CisJbnAtPnMuZGV2aWNlCT0gcGRldjsKKwlucC0+cy51bml0CT0gdW5pdDsKKwlucC0+ZGV2aWNlX2lkCT0gZGV2LT5jaGlwLmRldmljZV9pZDsKKwlucC0+cmV2aXNpb25faWQJPSBkZXYtPmNoaXAucmV2aXNpb25faWQ7CisJbnAtPmZlYXR1cmVzCT0gZGV2LT5jaGlwLmZlYXR1cmVzOworCW5wLT5jbG9ja19kaXZuCT0gZGV2LT5jaGlwLm5yX2Rpdmlzb3I7CisJbnAtPm1heG9mZnMJPSBkZXYtPmNoaXAub2Zmc2V0X21heDsKKwlucC0+bWF4YnVyc3QJPSBkZXYtPmNoaXAuYnVyc3RfbWF4OworCW5wLT5teWFkZHIJPSBkZXYtPmhvc3RfaWQ7CisKKwkvKgorCSAqICBFZGl0IGl0cyBuYW1lLgorCSAqLworCXN0cmxjcHkobnAtPnMuY2hpcF9uYW1lLCBkZXYtPmNoaXAubmFtZSwgc2l6ZW9mKG5wLT5zLmNoaXBfbmFtZSkpOworCXNwcmludGYobnAtPnMuaW5zdF9uYW1lLCAic3ltJWQiLCBucC0+cy51bml0KTsKKworCWlmIChzeW1fc2V0dXBfYnVzX2RtYV9tYXNrKG5wKSkKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCisJLyoKKwkgKiAgVHJ5IHRvIG1hcCB0aGUgY29udHJvbGxlciBjaGlwIHRvCisJICogIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1lbW9yeS4KKwkgKi8KKwlucC0+bW1pb19iYSA9ICh1MzIpZGV2LT5tbWlvX2Jhc2U7CisJbnAtPnMuaW9hZGRyCT0gZGV2LT5zLmlvYWRkcjsKKwlucC0+cy5yYW1hZGRyCT0gZGV2LT5zLnJhbWFkZHI7CisJbnAtPnMuaW9fd3MgPSAobnAtPmZlYXR1cmVzICYgRkVfSU8yNTYpID8gMjU2IDogMTI4OworCisJLyoKKwkgKiAgTWFwIG9uLWNoaXAgUkFNIGlmIHByZXNlbnQgYW5kIHN1cHBvcnRlZC4KKwkgKi8KKwlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9SQU0pKQorCQlkZXYtPnJhbV9iYXNlID0gMDsKKwlpZiAoZGV2LT5yYW1fYmFzZSkgeworCQlucC0+cmFtX2JhID0gKHUzMilkZXYtPnJhbV9iYXNlOworCQlucC0+cmFtX3dzID0gKG5wLT5mZWF0dXJlcyAmIEZFX1JBTThLKSA/IDgxOTIgOiA0MDk2OworCX0KKworCWlmIChzeW1faGNiX2F0dGFjaChpbnN0YW5jZSwgZncsIGRldi0+bnZyYW0pKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisKKwkvKgorCSAqICBJbnN0YWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKwkgKiAgSWYgd2Ugc3luY2hvbml6ZSB0aGUgQyBjb2RlIHdpdGggU0NSSVBUUyBvbiBpbnRlcnJ1cHQsIAorCSAqICB3ZSBkbyBub3Qgd2FudCB0byBzaGFyZSB0aGUgSU5UUiBsaW5lIGF0IGFsbC4KKwkgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBzeW01M2M4eHhfaW50ciwgU0FfU0hJUlEsIE5BTUU1M0M4WFgsIG5wKSkgeworCQlwcmludGZfZXJyKCIlczogcmVxdWVzdCBpcnEgJWQgZmFpbHVyZVxuIiwKKwkJCXN5bV9uYW1lKG5wKSwgcGRldi0+aXJxKTsKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCX0KKwlucC0+cy5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKgorCSAqICBBZnRlciBTQ1NJIGRldmljZXMgaGF2ZSBiZWVuIG9wZW5lZCwgd2UgY2Fubm90CisJICogIHJlc2V0IHRoZSBidXMgc2FmZWx5LCBzbyB3ZSBkbyBpdCBoZXJlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlpZiAoc3ltX3Jlc2V0X3Njc2lfYnVzKG5wLCAwKSkKKwkJZ290byByZXNldF9mYWlsZWQ7CisKKwkvKgorCSAqICBTdGFydCB0aGUgU0NSSVBUUy4KKwkgKi8KKwlzeW1fc3RhcnRfdXAgKG5wLCAxKTsKKworCS8qCisJICogIFN0YXJ0IHRoZSB0aW1lciBkYWVtb24KKwkgKi8KKwlpbml0X3RpbWVyKCZucC0+cy50aW1lcik7CisJbnAtPnMudGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZykgbnA7CisJbnAtPnMudGltZXIuZnVuY3Rpb24gPSBzeW01M2M4eHhfdGltZXI7CisJbnAtPnMubGFzdHRpbWU9MDsKKwlzeW1fdGltZXIgKG5wKTsKKworCS8qCisJICogIEZpbGwgTGludXggaG9zdCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwkgKiAgYW5kIHJldHVybiBzdWNjZXNzLgorCSAqLworCWluc3RhbmNlLT5tYXhfY2hhbm5lbAk9IDA7CisJaW5zdGFuY2UtPnRoaXNfaWQJPSBucC0+bXlhZGRyOworCWluc3RhbmNlLT5tYXhfaWQJPSBucC0+bWF4d2lkZSA/IDE2IDogODsKKwlpbnN0YW5jZS0+bWF4X2x1bgk9IFNZTV9DT05GX01BWF9MVU47CisJaW5zdGFuY2UtPnVuaXF1ZV9pZAk9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpbnN0YW5jZS0+Y21kX3Blcl9sdW4JPSBTWU1fQ09ORl9NQVhfVEFHOworCWluc3RhbmNlLT5jYW5fcXVldWUJPSAoU1lNX0NPTkZfTUFYX1NUQVJULTIpOworCWluc3RhbmNlLT5zZ190YWJsZXNpemUJPSBTWU1fQ09ORl9NQVhfU0c7CisJaW5zdGFuY2UtPm1heF9jbWRfbGVuCT0gMTY7CisJQlVHX09OKHN5bTJfdHJhbnNwb3J0X3RlbXBsYXRlID09IE5VTEwpOworCWluc3RhbmNlLT50cmFuc3BvcnR0CT0gc3ltMl90cmFuc3BvcnRfdGVtcGxhdGU7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbnN0YW5jZTsKKworIHJlc2V0X2ZhaWxlZDoKKwlwcmludGZfZXJyKCIlczogRkFUQUwgRVJST1I6IENIRUNLIFNDU0kgQlVTIC0gQ0FCTEVTLCAiCisJCSAgICJURVJNSU5BVElPTiwgREVWSUNFIFBPV0VSIGV0Yy4hXG4iLCBzeW1fbmFtZShucCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOworIGF0dGFjaF9mYWlsZWQ6CisJaWYgKCFpbnN0YW5jZSkKKwkJcmV0dXJuIE5VTEw7CisJcHJpbnRmX2luZm8oIiVzOiBnaXZpbmcgdXAgLi4uXG4iLCBzeW1fbmFtZShucCkpOworCWlmIChucCkKKwkJc3ltX2ZyZWVfcmVzb3VyY2VzKG5wLCBwZGV2KTsKKwlzY3NpX2hvc3RfcHV0KGluc3RhbmNlKTsKKworCXJldHVybiBOVUxMOworIH0KKworCisvKgorICogICAgRGV0ZWN0IGFuZCB0cnkgdG8gcmVhZCBTWU1CSU9TIGFuZCBURUtSQU0gTlZSQU0uCisgKi8KKyNpZiBTWU1fQ09ORl9OVlJBTV9TVVBQT1JUCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc3ltX2dldF9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqZGV2cCwgc3RydWN0IHN5bV9udnJhbSAqbnZwKQoreworCWRldnAtPm52cmFtID0gbnZwOworCWRldnAtPmRldmljZV9pZCA9IGRldnAtPmNoaXAuZGV2aWNlX2lkOworCW52cC0+dHlwZSA9IDA7CisKKwlzeW1fcmVhZF9udnJhbShkZXZwLCBudnApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeW1fZ2V0X252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpkZXZwLCBzdHJ1Y3Qgc3ltX252cmFtICpudnApCit7Cit9CisjZW5kaWYJLyogU1lNX0NPTkZfTlZSQU1fU1VQUE9SVCAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzeW1fY2hlY2tfc3VwcG9ydGVkKHN0cnVjdCBzeW1fZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN5bV9jaGlwICpjaGlwOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2aWNlLT5wZGV2OworCXVfY2hhciByZXZpc2lvbjsKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaW50IGk7CisKKwkvKgorCSAqICBJZiB1c2VyIGV4Y2x1ZGVkIHRoaXMgY2hpcCwgZG8gbm90IGluaXRpYWxpemUgaXQuCisJICogIEkgaGF0ZSB0aGlzIGNvZGUgc28gbXVjaC4gIE11c3Qga2lsbCBpdC4KKwkgKi8KKwlpZiAoaW9fcG9ydCkgeworCQlmb3IgKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJCWlmIChzeW1fZHJpdmVyX3NldHVwLmV4Y2x1ZGVzW2ldID09IGlvX3BvcnQpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBjaGlwIGlzIHN1cHBvcnRlZC4gIFRoZW4gY29weSB0aGUgY2hpcCBkZXNjcmlwdGlvbgorCSAqIHRvIG91ciBkZXZpY2Ugc3RydWN0dXJlIHNvIHdlIGNhbiBtYWtlIGl0IG1hdGNoIHRoZSBhY3R1YWwgZGV2aWNlCisJICogYW5kIG9wdGlvbnMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOworCWNoaXAgPSBzeW1fbG9va3VwX2NoaXBfdGFibGUocGRldi0+ZGV2aWNlLCByZXZpc2lvbik7CisJaWYgKCFjaGlwKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkZXZpY2Ugbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltZW1jcHkoJmRldmljZS0+Y2hpcCwgY2hpcCwgc2l6ZW9mKGRldmljZS0+Y2hpcCkpOworCWRldmljZS0+Y2hpcC5yZXZpc2lvbl9pZCA9IHJldmlzaW9uOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZ25vcmUgU3ltYmlvcyBjaGlwcyBjb250cm9sbGVkIGJ5IHZhcmlvdXMgUkFJRCBjb250cm9sbGVycy4KKyAqIFRoZXNlIGNvbnRyb2xsZXJzIHNldCB2YWx1ZSAweDUyNDE0OTQ0IGF0IFJBTSBlbmQgLSAxNi4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc3ltX2NoZWNrX3JhaWQoc3RydWN0IHN5bV9kZXZpY2UgKmRldmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmFtX3NpemUsIHJhbV92YWw7CisKKwlpZiAoIWRldmljZS0+cy5yYW1hZGRyKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXZpY2UtPmNoaXAuZmVhdHVyZXMgJiBGRV9SQU04SykKKwkJcmFtX3NpemUgPSA4MTkyOworCWVsc2UKKwkJcmFtX3NpemUgPSA0MDk2OworCisJcmFtX3ZhbCA9IHJlYWRsKGRldmljZS0+cy5yYW1hZGRyICsgcmFtX3NpemUgLSAxNik7CisJaWYgKHJhbV92YWwgIT0gMHg1MjQxNDk0NCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbygmZGV2aWNlLT5wZGV2LT5kZXYsCisJCQkibm90IGluaXRpYWxpemluZywgZHJpdmVuIGJ5IFJBSUQgY29udHJvbGxlci5cbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzeW1fc2V0X3dvcmthcm91bmRzKHN0cnVjdCBzeW1fZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN5bV9jaGlwICpjaGlwID0gJmRldmljZS0+Y2hpcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldmljZS0+cGRldjsKKwl1X3Nob3J0IHN0YXR1c19yZWc7CisKKwkvKgorCSAqICAoSVRFTSAxMiBvZiBhIERFTCBhYm91dCB0aGUgODk2IEkgaGF2ZW4ndCB5ZXQpLgorCSAqICBXZSBtdXN0IGVuc3VyZSB0aGUgY2hpcCB3aWxsIHVzZSBXUklURSBBTkQgSU5WQUxJREFURS4KKwkgKiAgVGhlIHJldmlzaW9uIG51bWJlciBsaW1pdCBpcyBmb3Igbm93IGFyYml0cmFyeS4KKwkgKi8KKwlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NiAmJiBjaGlwLT5yZXZpc2lvbl9pZCA8IDB4NCkgeworCQljaGlwLT5mZWF0dXJlcwl8PSAoRkVfV1JJRSB8IEZFX0NMU0UpOworCX0KKworCS8qIElmIHRoZSBjaGlwIGNhbiBkbyBNZW1vcnkgV3JpdGUgSW52YWxpZGF0ZSwgZW5hYmxlIGl0ICovCisJaWYgKGNoaXAtPmZlYXR1cmVzICYgRkVfV1JJRSkgeworCQlpZiAocGNpX3NldF9td2kocGRldikpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqICBXb3JrIGFyb3VuZCBmb3IgZXJyYW50IGJpdCBpbiA4OTVBLiBUaGUgNjZNaHoKKwkgKiAgY2FwYWJsZSBiaXQgaXMgc2V0IGVycm9uZW91c2x5LiBDbGVhciB0aGlzIGJpdC4KKwkgKiAgKEl0ZW0gMSBERUwgNTMzKQorCSAqCisJICogIE1ha2Ugc3VyZSBDb25maWcgc3BhY2UgYW5kIEZlYXR1cmVzIGFncmVlLgorCSAqCisJICogIFJlY2FsbDogd3JpdGVzIGFyZSBub3Qgbm9ybWFsIHRvIHN0YXR1cyByZWdpc3RlciAtCisJICogIHdyaXRlIGEgMSB0byBjbGVhciBhbmQgYSAwIHRvIGxlYXZlIHVuY2hhbmdlZC4KKwkgKiAgQ2FuIG9ubHkgcmVzZXQgYml0cy4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCAmc3RhdHVzX3JlZyk7CisJaWYgKGNoaXAtPmZlYXR1cmVzICYgRkVfNjZNSFopIHsKKwkJaWYgKCEoc3RhdHVzX3JlZyAmIFBDSV9TVEFUVVNfNjZNSFopKQorCQkJY2hpcC0+ZmVhdHVyZXMgJj0gfkZFXzY2TUhaOworCX0gZWxzZSB7CisJCWlmIChzdGF0dXNfcmVnICYgUENJX1NUQVRVU182Nk1IWikgeworCQkJc3RhdHVzX3JlZyA9IFBDSV9TVEFUVVNfNjZNSFo7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywgc3RhdHVzX3JlZyk7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCAmc3RhdHVzX3JlZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBSZWFkIGFuZCBjaGVjayB0aGUgUENJIGNvbmZpZ3VyYXRpb24gZm9yIGFueSBkZXRlY3RlZCBOQ1IgCisgKiAgYm9hcmRzIGFuZCBzYXZlIGRhdGEgZm9yIGF0dGFjaGluZyBhZnRlciBhbGwgYm9hcmRzIGhhdmUgCisgKiAgYmVlbiBkZXRlY3RlZC4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0CitzeW1faW5pdF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzeW1fZGV2aWNlICpkZXZpY2UpCit7CisJaW50IGk7CisKKwlkZXZpY2UtPmhvc3RfaWQgPSBTWU1fU0VUVVBfSE9TVF9JRDsKKwlkZXZpY2UtPnBkZXYgPSBwZGV2OworCisJaSA9IHBjaV9nZXRfYmFzZV9hZGRyZXNzKHBkZXYsIDEsICZkZXZpY2UtPm1taW9fYmFzZSk7CisJcGNpX2dldF9iYXNlX2FkZHJlc3MocGRldiwgaSwgJmRldmljZS0+cmFtX2Jhc2UpOworCisjaWZuZGVmIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRAorCWlmIChkZXZpY2UtPm1taW9fYmFzZSkKKwkJZGV2aWNlLT5zLmlvYWRkciA9IHBjaV9pb21hcChwZGV2LCAxLAorCQkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CisjZW5kaWYKKwlpZiAoIWRldmljZS0+cy5pb2FkZHIpCisJCWRldmljZS0+cy5pb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMCwKKwkJCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWlmIChkZXZpY2UtPnJhbV9iYXNlKQorCQlkZXZpY2UtPnMucmFtYWRkciA9IHBjaV9pb21hcChwZGV2LCBpLAorCQkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSk7Cit9CisKKy8qCisgKiBUaGUgTkNSIFBRUyBhbmQgUERTIGNhcmRzIGFyZSBjb25zdHJ1Y3RlZCBhcyBhIERFQyBicmlkZ2UKKyAqIGJlaGluZCB3aGljaCBzaXRzIGEgcHJvcHJpZXRhcnkgTkNSIG1lbW9yeSBjb250cm9sbGVyIGFuZAorICogZWl0aGVyIGZvdXIgb3IgdHdvIDUzYzg3NXMgYXMgc2VwYXJhdGUgZGV2aWNlcy4gIFdlIGNhbiB0ZWxsCisgKiBpZiBhbiA4NzUgaXMgcGFydCBvZiBhIFBRUy9QRFMgb3Igbm90IHNpbmNlIGlmIGl0IGlzLCBpdCB3aWxsCisgKiBiZSBvbiB0aGUgc2FtZSBidXMgYXMgdGhlIG1lbW9yeSBjb250cm9sbGVyLiAgSW4gaXRzIHVzdWFsCisgKiBtb2RlIG9mIG9wZXJhdGlvbiwgdGhlIDg3NXMgYXJlIHNsYXZlZCB0byB0aGUgbWVtb3J5CisgKiBjb250cm9sbGVyIGZvciBhbGwgdHJhbnNmZXJzLiAgVG8gb3BlcmF0ZSB3aXRoIHRoZSBMaW51eAorICogZHJpdmVyLCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgaXMgZGlzYWJsZWQgYW5kIHRoZSA4NzVzCisgKiBmcmVlZCB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5LiAgVGhlIG9ubHkgd3JpbmtsZSBpcyB0aGF0CisgKiB0aGUgcHJlc2V0IFNDU0kgSUQgKHdoaWNoIG1heSBiZSB6ZXJvKSBtdXN0IGJlIHJlYWQgaW4gZnJvbQorICogYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXIgb2YgdGhlIDg3NS4KKyAqLworc3RhdGljIHZvaWQgc3ltX2NvbmZpZ19wcXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzeW1fZGV2aWNlICpzeW1fZGV2KQoreworCWludCBzbG90OworCXU4IHRtcDsKKworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCAyNTY7IHNsb3QrKykgeworCQlzdHJ1Y3QgcGNpX2RldiAqbWVtYyA9IHBjaV9nZXRfc2xvdChwZGV2LT5idXMsIHNsb3QpOworCisJCWlmICghbWVtYyB8fCBtZW1jLT52ZW5kb3IgIT0gMHgxMDFhIHx8IG1lbWMtPmRldmljZSA9PSAweDAwMDkpIHsKKwkJCXBjaV9kZXZfcHV0KG1lbWMpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBiaXQgMTogYWxsb3cgaW5kaXZpZHVhbCA4NzUgY29uZmlndXJhdGlvbiAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShtZW1jLCAweDQ0LCAmdG1wKTsKKwkJaWYgKCh0bXAgJiAweDIpID09IDApIHsKKwkJCXRtcCB8PSAweDI7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUobWVtYywgMHg0NCwgdG1wKTsKKwkJfQorCisJCS8qIGJpdCAyOiBkcml2ZSBpbmRpdmlkdWFsIDg3NSBpbnRlcnJ1cHRzIHRvIHRoZSBidXMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUobWVtYywgMHg0NSwgJnRtcCk7CisJCWlmICgodG1wICYgMHg0KSA9PSAwKSB7CisJCQl0bXAgfD0gMHg0OworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKG1lbWMsIDB4NDUsIHRtcCk7CisJCX0KKworCQlwY2lfZGV2X3B1dChtZW1jKTsKKwkJYnJlYWs7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg4NCwgJnRtcCk7CisJc3ltX2Rldi0+aG9zdF9pZCA9IHRtcDsKK30KKworLyoKKyAqICBDYWxsZWQgYmVmb3JlIHVubG9hZGluZyB0aGUgbW9kdWxlLgorICogIERldGFjaCB0aGUgaG9zdC4KKyAqICBXZSBoYXZlIHRvIGZyZWUgcmVzb3VyY2VzIGFuZCBoYWx0IHRoZSBOQ1IgY2hpcC4KKyAqLworc3RhdGljIGludCBzeW1fZGV0YWNoKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcHJpbnRrKCIlczogZGV0YWNoaW5nIC4uLlxuIiwgc3ltX25hbWUobnApKTsKKworCWRlbF90aW1lcl9zeW5jKCZucC0+cy50aW1lcik7CisKKwkvKgorCSAqIFJlc2V0IE5DUiBjaGlwLgorCSAqIFdlIHNob3VsZCB1c2Ugc3ltX3NvZnRfcmVzZXQoKSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gZG8gCisJICogc28sIHNpbmNlIHdlIG1heSBub3QgYmUgc2FmZSBpZiBpbnRlcnJ1cHRzIG9jY3VyLgorCSAqLworCXByaW50aygiJXM6IHJlc2V0dGluZyBjaGlwXG4iLCBzeW1fbmFtZShucCkpOworCU9VVEIobnAsIG5jX2lzdGF0LCBTUlNUKTsKKwl1ZGVsYXkoMTApOworCU9VVEIobnAsIG5jX2lzdGF0LCAwKTsKKworCXN5bV9mcmVlX3Jlc291cmNlcyhucCwgcGRldik7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERyaXZlciBob3N0IHRlbXBsYXRlLgorICovCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzeW0yX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAic3ltNTNjOHh4IiwKKwkuaW5mbwkJCT0gc3ltNTNjOHh4X2luZm8sIAorCS5xdWV1ZWNvbW1hbmQJCT0gc3ltNTNjOHh4X3F1ZXVlX2NvbW1hbmQsCisJLnNsYXZlX2FsbG9jCQk9IHN5bTUzYzh4eF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gc3ltNTNjOHh4X3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBzeW01M2M4eHhfc2xhdmVfZGVzdHJveSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IHN5bTUzYzh4eF9laF9hYm9ydF9oYW5kbGVyLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHN5bTUzYzh4eF9laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBzeW01M2M4eHhfZWhfYnVzX3Jlc2V0X2hhbmRsZXIsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHN5bTUzYzh4eF9laF9ob3N0X3Jlc2V0X2hhbmRsZXIsCisJLnRoaXNfaWQJCT0gNywKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorI2lmZGVmIFNZTV9MSU5VWF9QUk9DX0lORk9fU1VQUE9SVAorCS5wcm9jX2luZm8JCT0gc3ltNTNjOHh4X3Byb2NfaW5mbywKKwkucHJvY19uYW1lCQk9IE5BTUU1M0M4WFgsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgYXR0YWNoX2NvdW50OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzeW0yX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IHN5bV9kZXZpY2Ugc3ltX2RldjsKKwlzdHJ1Y3Qgc3ltX252cmFtIG52cmFtOworCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOworCisJbWVtc2V0KCZzeW1fZGV2LCAwLCBzaXplb2Yoc3ltX2RldikpOworCW1lbXNldCgmbnZyYW0sIDAsIHNpemVvZihudnJhbSkpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIGxlYXZlOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBOQU1FNTNDOFhYKSkKKwkJZ290byBkaXNhYmxlOworCisJc3ltX2luaXRfZGV2aWNlKHBkZXYsICZzeW1fZGV2KTsKKwlpZiAoc3ltX2NoZWNrX3N1cHBvcnRlZCgmc3ltX2RldikpCisJCWdvdG8gZnJlZTsKKworCWlmIChzeW1fY2hlY2tfcmFpZCgmc3ltX2RldikpCisJCWdvdG8gbGVhdmU7CS8qIERvbid0IGRpc2FibGUgdGhlIGRldmljZSAqLworCisJaWYgKHN5bV9zZXRfd29ya2Fyb3VuZHMoJnN5bV9kZXYpKQorCQlnb3RvIGZyZWU7CisKKwlzeW1fY29uZmlnX3BxcyhwZGV2LCAmc3ltX2Rldik7CisKKwlzeW1fZ2V0X252cmFtKCZzeW1fZGV2LCAmbnZyYW0pOworCisJaW5zdGFuY2UgPSBzeW1fYXR0YWNoKCZzeW0yX3RlbXBsYXRlLCBhdHRhY2hfY291bnQsICZzeW1fZGV2KTsKKwlpZiAoIWluc3RhbmNlKQorCQlnb3RvIGZyZWU7CisKKwlpZiAoc2NzaV9hZGRfaG9zdChpbnN0YW5jZSwgJnBkZXYtPmRldikpCisJCWdvdG8gZGV0YWNoOworCXNjc2lfc2Nhbl9ob3N0KGluc3RhbmNlKTsKKworCWF0dGFjaF9jb3VudCsrOworCisJcmV0dXJuIDA7CisKKyBkZXRhY2g6CisJc3ltX2RldGFjaChwY2lfZ2V0X2RydmRhdGEocGRldiksIHBkZXYpOworIGZyZWU6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyBkaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBsZWF2ZToKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHN5bTJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzeW1faGNiICpucCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gbnAtPnMuaG9zdDsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaG9zdCk7CisJc2NzaV9ob3N0X3B1dChob3N0KTsKKworCXN5bV9kZXRhY2gobnAsIHBkZXYpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlhdHRhY2hfY291bnQtLTsKK30KKworc3RhdGljIHZvaWQgc3ltMl9nZXRfc2lnbmFsbGluZyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihzaG9zdCk7CisJZW51bSBzcGlfc2lnbmFsX3R5cGUgdHlwZTsKKworCXN3aXRjaCAobnAtPnNjc2lfbW9kZSkgeworCWNhc2UgU01PREVfU0U6CisJCXR5cGUgPSBTUElfU0lHTkFMX1NFOworCQlicmVhazsKKwljYXNlIFNNT0RFX0xWRDoKKwkJdHlwZSA9IFNQSV9TSUdOQUxfTFZEOworCQlicmVhazsKKwljYXNlIFNNT0RFX0hWRDoKKwkJdHlwZSA9IFNQSV9TSUdOQUxfSFZEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eXBlID0gU1BJX1NJR05BTF9VTktOT1dOOworCQlicmVhazsKKwl9CisJc3BpX3NpZ25hbGxpbmcoc2hvc3QpID0gdHlwZTsKK30KKworc3RhdGljIHZvaWQgc3ltMl9zZXRfb2Zmc2V0KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihzaG9zdCk7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbc3RhcmdldC0+aWRdOworCisJdHAtPnRnb2FsLm9mZnNldCA9IG9mZnNldDsKKwl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHN5bTJfc2V0X3BlcmlvZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBwZXJpb2QpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3N0YXJnZXQtPmlkXTsKKworCS8qIGhhdmUgdG8gaGF2ZSBEVCBmb3IgdGhlc2UgdHJhbnNmZXJzICovCisJaWYgKHBlcmlvZCA8PSBucC0+bWluc3luYykKKwkJdHAtPnRnb2FsLmR0ID0gMTsKKworCXRwLT50Z29hbC5wZXJpb2QgPSBwZXJpb2Q7CisJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAxOworfQorCitzdGF0aWMgdm9pZCBzeW0yX3NldF93aWR0aChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCB3aWR0aCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChzdGFyZ2V0LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc3ltX2hjYiAqbnAgPSBzeW1fZ2V0X2hjYihzaG9zdCk7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbc3RhcmdldC0+aWRdOworCisJLyogSXQgaXMgaWxsZWdhbCB0byBoYXZlIERUIHNldCBvbiBuYXJyb3cgdHJhbnNmZXJzLiAgSWYgRFQgaXMKKwkgKiBjbGVhciwgd2UgbXVzdCBhbHNvIGNsZWFyIElVIGFuZCBRQVMuICAqLworCWlmICh3aWR0aCA9PSAwKQorCQl0cC0+dGdvYWwuaXUgPSB0cC0+dGdvYWwuZHQgPSB0cC0+dGdvYWwucWFzID0gMDsKKworCXRwLT50Z29hbC53aWR0aCA9IHdpZHRoOworCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKK30KKworc3RhdGljIHZvaWQgc3ltMl9zZXRfZHQoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgZHQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3N0YXJnZXQtPmlkXTsKKworCS8qIFdlIG11c3QgY2xlYXIgUUFTIGFuZCBJVSBpZiBEVCBpcyBjbGVhciAqLworCWlmIChkdCkKKwkJdHAtPnRnb2FsLmR0ID0gMTsKKwllbHNlCisJCXRwLT50Z29hbC5pdSA9IHRwLT50Z29hbC5kdCA9IHRwLT50Z29hbC5xYXMgPSAwOworCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKK30KKworc3RhdGljIHZvaWQgc3ltMl9zZXRfaXUoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgaXUpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3N0YXJnZXQtPmlkXTsKKworCWlmIChpdSkKKwkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0gMTsKKwllbHNlCisJCXRwLT50Z29hbC5pdSA9IDA7CisJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAxOworfQorCitzdGF0aWMgdm9pZCBzeW0yX3NldF9xYXMoc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0LCBpbnQgcWFzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzeW1faGNiICpucCA9IHN5bV9nZXRfaGNiKHNob3N0KTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtzdGFyZ2V0LT5pZF07CisKKwlpZiAocWFzKQorCQl0cC0+dGdvYWwuZHQgPSB0cC0+dGdvYWwucWFzID0gMTsKKwllbHNlCisJCXRwLT50Z29hbC5xYXMgPSAwOworCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKK30KKworCitzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBzeW0yX3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7CisJLnNldF9vZmZzZXQJPSBzeW0yX3NldF9vZmZzZXQsCisJLnNob3dfb2Zmc2V0CT0gMSwKKwkuc2V0X3BlcmlvZAk9IHN5bTJfc2V0X3BlcmlvZCwKKwkuc2hvd19wZXJpb2QJPSAxLAorCS5zZXRfd2lkdGgJPSBzeW0yX3NldF93aWR0aCwKKwkuc2hvd193aWR0aAk9IDEsCisJLnNldF9kdAkJPSBzeW0yX3NldF9kdCwKKwkuc2hvd19kdAk9IDEsCisJLnNldF9pdQkJPSBzeW0yX3NldF9pdSwKKwkuc2hvd19pdQk9IDEsCisJLnNldF9xYXMJPSBzeW0yX3NldF9xYXMsCisJLnNob3dfcWFzCT0gMSwKKwkuZ2V0X3NpZ25hbGxpbmcJPSBzeW0yX2dldF9zaWduYWxsaW5nLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN5bTJfaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgxMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgyMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LCAvKiBuZXcgKi8KKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4MjUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV81M0M4MTBBUCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LCAvKiBuZXcgKi8KKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX05DUl81M0M4NjAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV81M0MxNTEwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODk2LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODk1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODg1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODc1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDMTUxMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LCAvKiBuZXcgKi8KKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV81M0M4OTVBLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfNTNDODc1QSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMTBfMzMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzY2LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9OQ1JfNTNDODc1SiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN5bTJfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3ltMl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gTkFNRTUzQzhYWCwKKwkuaWRfdGFibGUJPSBzeW0yX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBzeW0yX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3ltMl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3ltMl9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJc3ltMl9zZXR1cF9wYXJhbXMoKTsKKwlzeW0yX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHNwaV9hdHRhY2hfdHJhbnNwb3J0KCZzeW0yX3RyYW5zcG9ydF9mdW5jdGlvbnMpOworCWlmICghc3ltMl90cmFuc3BvcnRfdGVtcGxhdGUpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzeW0yX2RyaXZlcik7CisJaWYgKGVycm9yKQorCQlzcGlfcmVsZWFzZV90cmFuc3BvcnQoc3ltMl90cmFuc3BvcnRfdGVtcGxhdGUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN5bTJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3ltMl9kcml2ZXIpOworCXNwaV9yZWxlYXNlX3RyYW5zcG9ydChzeW0yX3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK21vZHVsZV9pbml0KHN5bTJfaW5pdCk7Cittb2R1bGVfZXhpdChzeW0yX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQzZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBTWU1fR0xVRV9ICisjZGVmaW5lIFNZTV9HTFVFX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaWZkZWYgX19zcGFyY19fCisjICBpbmNsdWRlIDxhc20vaXJxLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfc3BpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgInN5bTUzYzh4eC5oIgorI2luY2x1ZGUgInN5bV9kZWZzLmgiCisjaW5jbHVkZSAic3ltX21pc2MuaCIKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gYWRkZW5kdW0gZm9yIExpbnV4LgorICovCisjZGVmaW5lCVNZTV9DT05GX1RJTUVSX0lOVEVSVkFMCQkoKEhaKzEpLzIpCisKKyNkZWZpbmUgU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKyNkZWZpbmUgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisjZGVmaW5lIFNZTV9PUFRfTElNSVRfQ09NTUFORF9SRU9SREVSSU5HCisKKy8qCisgKiAgUHJpbnQgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkuCisgKi8KKyNkZWZpbmUgcHJpbnRmX2VtZXJnKGFyZ3MuLi4pCXByaW50ayhLRVJOX0VNRVJHIGFyZ3MpCisjZGVmaW5lCXByaW50Zl9hbGVydChhcmdzLi4uKQlwcmludGsoS0VSTl9BTEVSVCBhcmdzKQorI2RlZmluZQlwcmludGZfY3JpdChhcmdzLi4uKQlwcmludGsoS0VSTl9DUklUIGFyZ3MpCisjZGVmaW5lCXByaW50Zl9lcnIoYXJncy4uLikJcHJpbnRrKEtFUk5fRVJSCWFyZ3MpCisjZGVmaW5lCXByaW50Zl93YXJuaW5nKGFyZ3MuLi4pCXByaW50ayhLRVJOX1dBUk5JTkcgYXJncykKKyNkZWZpbmUJcHJpbnRmX25vdGljZShhcmdzLi4uKQlwcmludGsoS0VSTl9OT1RJQ0UgYXJncykKKyNkZWZpbmUJcHJpbnRmX2luZm8oYXJncy4uLikJcHJpbnRrKEtFUk5fSU5GTyBhcmdzKQorI2RlZmluZQlwcmludGZfZGVidWcoYXJncy4uLikJcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNkZWZpbmUJcHJpbnRmKGFyZ3MuLi4pCQlwcmludGsoYXJncykKKworLyoKKyAqICBBICdyZWFkIGJhcnJpZXInIGZsdXNoZXMgYW55IGRhdGEgdGhhdCBoYXZlIGJlZW4gcHJlZmV0Y2hlZCAKKyAqICBieSB0aGUgcHJvY2Vzc29yIGR1ZSB0byBvdXQgb2Ygb3JkZXIgZXhlY3V0aW9uLiBTdWNoIGEgYmFycmllciAKKyAqICBtdXN0IG5vdGFibHkgYmUgaW5zZXJ0ZWQgcHJpb3IgdG8gbG9va2luZyBhdCBkYXRhIHRoYXQgaGF2ZSAKKyAqICBiZWVuIERNQWVkLCBhc3N1bWluZyB0aGF0IHByb2dyYW0gZG9lcyBtZW1vcnkgUkVBRHMgaW4gcHJvcGVyIAorICogIG9yZGVyIGFuZCB0aGF0IHRoZSBkZXZpY2UgZW5zdXJlZCBwcm9wZXIgb3JkZXJpbmcgb2YgV1JJVEVzLgorICoKKyAqICBBICd3cml0ZSBiYXJyaWVyJyBwcmV2ZW50cyBhbnkgcHJldmlvdXMgV1JJVEVzIHRvIHBhc3MgZnVydGhlciAKKyAqICBXUklURXMuIFN1Y2ggYmFycmllcnMgbXVzdCBiZSBpbnNlcnRlZCBlYWNoIHRpbWUgYW5vdGhlciBhZ2VudCAKKyAqICByZWxpZXMgb24gb3JkZXJpbmcgb2YgV1JJVEVzLgorICoKKyAqICBOb3RlIHRoYXQsIGR1ZSB0byBwb3N0aW5nIG9mIFBDSSBtZW1vcnkgd3JpdGVzLCB3ZSBhbHNvIG11c3QgCisgKiAgaW5zZXJ0IGR1bW15IFBDSSByZWFkIHRyYW5zYWN0aW9ucyB3aGVuIHNvbWUgb3JkZXJpbmcgaW52b2x2aW5nIAorICogIGJvdGggZGlyZWN0aW9ucyBvdmVyIHRoZSBQQ0kgZG9lcyBtYXR0ZXIuIFBDSSB0cmFuc2FjdGlvbnMgYXJlIAorICogIGZ1bGx5IG9yZGVyZWQgaW4gZWFjaCBkaXJlY3Rpb24uCisgKi8KKworI2RlZmluZSBNRU1PUllfUkVBRF9CQVJSSUVSKCkJcm1iKCkKKyNkZWZpbmUgTUVNT1JZX1dSSVRFX0JBUlJJRVIoKQl3bWIoKQorCisvKgorICogIElPIGZ1bmN0aW9ucyBkZWZpbml0aW9uIGZvciBiaWcvbGl0dGxlIGVuZGlhbiBDUFUgc3VwcG9ydC4KKyAqICBGb3Igbm93LCBQQ0kgY2hpcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxpdHRsZSBlbmRpYW4gYWRkcmVzc2luZyBtb2RlLCAKKyAqLworCisjaWZkZWYJX19CSUdfRU5ESUFOCisKKyNkZWZpbmUJcmVhZHdfbDJiCXJlYWR3CisjZGVmaW5lCXJlYWRsX2wyYglyZWFkbAorI2RlZmluZQl3cml0ZXdfYjJsCXdyaXRldworI2RlZmluZQl3cml0ZWxfYjJsCXdyaXRlbAorCisjZWxzZQkvKiBsaXR0bGUgZW5kaWFuICovCisKKyNkZWZpbmUJcmVhZHdfcmF3CXJlYWR3CisjZGVmaW5lCXJlYWRsX3JhdwlyZWFkbAorI2RlZmluZQl3cml0ZXdfcmF3CXdyaXRldworI2RlZmluZQl3cml0ZWxfcmF3CXdyaXRlbAorCisjZW5kaWYgLyogZW5kaWFuICovCisKKyNpZmRlZglTWU1fQ09ORl9DSElQX0JJR19FTkRJQU4KKyNlcnJvcgkiQ2hpcHMgaW4gQklHIEVORElBTiBhZGRyZXNzaW5nIG1vZGUgYXJlIG5vdCAoeWV0KSBzdXBwb3J0ZWQiCisjZW5kaWYKKworLyoKKyAqICBJZiB0aGUgQ1BVIGFuZCB0aGUgY2hpcCB1c2Ugc2FtZSBlbmRpYW4tbmVzcyBhZGRyZXNzaW5nLAorICogIG5vIGJ5dGUgcmVvcmRlcmluZyBpcyBuZWVkZWQgZm9yIHNjcmlwdCBwYXRjaGluZy4KKyAqICBNYWNybyBjcHVfdG9fc2NyKCkgaXMgdG8gYmUgdXNlZCBmb3Igc2NyaXB0IHBhdGNoaW5nLgorICogIE1hY3JvIHNjcl90b19jcHUoKSBpcyB0byBiZSB1c2VkIGZvciBnZXR0aW5nIGEgRFdPUkQgCisgKiAgZnJvbSB0aGUgc2NyaXB0LgorICovCisKKyNkZWZpbmUgY3B1X3RvX3NjcihkdykJY3B1X3RvX2xlMzIoZHcpCisjZGVmaW5lIHNjcl90b19jcHUoZHcpCWxlMzJfdG9fY3B1KGR3KQorCisvKgorICogIFJlbWFwIHNvbWUgc3RhdHVzIGZpZWxkIHZhbHVlcy4KKyAqLworI2RlZmluZSBDQU1fUkVRX0NNUAkJRElEX09LCisjZGVmaW5lIENBTV9TRUxfVElNRU9VVAkJRElEX05PX0NPTk5FQ1QKKyNkZWZpbmUgQ0FNX0NNRF9USU1FT1VUCQlESURfVElNRV9PVVQKKyNkZWZpbmUgQ0FNX1JFUV9BQk9SVEVECQlESURfQUJPUlQKKyNkZWZpbmUgQ0FNX1VOQ09SX1BBUklUWQlESURfUEFSSVRZCisjZGVmaW5lIENBTV9TQ1NJX0JVU19SRVNFVAlESURfUkVTRVQJCisjZGVmaW5lIENBTV9SRVFVRVVFX1JFUQkJRElEX1NPRlRfRVJST1IKKyNkZWZpbmUJQ0FNX1VORVhQX0JVU0ZSRUUJRElEX0VSUk9SCisjZGVmaW5lCUNBTV9TQ1NJX0JVU1kJCURJRF9CVVNfQlVTWQorCisjZGVmaW5lCUNBTV9ERVZfTk9UX1RIRVJFCURJRF9OT19DT05ORUNUCisjZGVmaW5lCUNBTV9SRVFfSU5WQUxJRAkJRElEX0VSUk9SCisjZGVmaW5lCUNBTV9SRVFfVE9PX0JJRwkJRElEX0VSUk9SCisKKyNkZWZpbmUJQ0FNX1JFU1JDX1VOQVZBSUwJRElEX0VSUk9SCisKKy8qCisgKiAgUmVtYXAgZGF0YSBkaXJlY3Rpb24gdmFsdWVzLgorICovCisjZGVmaW5lIENBTV9ESVJfTk9ORQkJRE1BX05PTkUKKyNkZWZpbmUgQ0FNX0RJUl9JTgkJRE1BX0ZST01fREVWSUNFCisjZGVmaW5lIENBTV9ESVJfT1VUCQlETUFfVE9fREVWSUNFCisjZGVmaW5lIENBTV9ESVJfVU5LTk9XTgkJRE1BX0JJRElSRUNUSU9OQUwKKworLyoKKyAqICBUaGVzZSBvbmVzIGFyZSB1c2VkIGFzIHJldHVybiBjb2RlIGZyb20gCisgKiAgZXJyb3IgcmVjb3ZlcnkgaGFuZGxlcnMgdW5kZXIgTGludXguCisgKi8KKyNkZWZpbmUgU0NTSV9TVUNDRVNTCVNVQ0NFU1MKKyNkZWZpbmUgU0NTSV9GQUlMRUQJRkFJTEVECisKKy8qCisgKiAgU3lzdGVtIHNwZWNpZmljIHRhcmdldCBkYXRhIHN0cnVjdHVyZS4KKyAqICBOb25lIGZvciBub3csIHVuZGVyIExpbnV4LgorICovCisvKiAjZGVmaW5lIFNZTV9IQVZFX1NUQ0IgKi8KKworLyoKKyAqICBTeXN0ZW0gc3BlY2lmaWMgbHVuIGRhdGEgc3RydWN0dXJlLgorICovCisjZGVmaW5lIFNZTV9IQVZFX1NMQ0IKK3N0cnVjdCBzeW1fc2xjYiB7CisJdV9zaG9ydAlyZXF0YWdzOwkvKiBOdW1iZXIgb2YgdGFncyByZXF1ZXN0ZWQgYnkgdXNlciAqLworCXVfc2hvcnQgc2NkZXZfZGVwdGg7CS8qIFF1ZXVlIGRlcHRoIHNldCBpbiBzZWxlY3RfcXVldWVfZGVwdGgoKSAqLworfTsKKworLyoKKyAqICBTeXN0ZW0gc3BlY2lmaWMgY29tbWFuZCBkYXRhIHN0cnVjdHVyZS4KKyAqICBOb3QgbmVlZGVkIHVuZGVyIExpbnV4LgorICovCisvKiBzdHJ1Y3Qgc3ltX3NjY2IgKi8KKworLyoKKyAqICBTeXN0ZW0gc3BlY2lmaWMgaG9zdCBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHN5bV9zaGNiIHsKKwkvKgorCSAqICBDaGlwIGFuZCBjb250cm9sbGVyIGluZGVudGlmaWNhdGlvbi4KKwkgKi8KKwlpbnQJCXVuaXQ7CisJY2hhcgkJaW5zdF9uYW1lWzE2XTsKKwljaGFyCQljaGlwX25hbWVbOF07CisJc3RydWN0IHBjaV9kZXYJKmRldmljZTsKKworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisKKwl2b2lkIF9faW9tZW0gKglpb2FkZHI7CQkvKiBNTUlPIGtlcm5lbCBpbyBhZGRyZXNzCSovCisJdm9pZCBfX2lvbWVtICoJcmFtYWRkcjsJLyogUkFNICBrZXJuZWwgaW8gYWRkcmVzcwkqLworCXVfc2hvcnQJCWlvX3dzOwkJLyogSU8gd2luZG93IHNpemUJCSovCisJaW50CQlpcnE7CQkvKiBJUlEgbnVtYmVyCQkJKi8KKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBUaW1lciBoYW5kbGVyIGxpbmsgaGVhZGVyCSovCisJdV9sb25nCQlsYXN0dGltZTsKKwl1X2xvbmcJCXNldHRsZV90aW1lOwkvKiBSZXNldHRpbmcgdGhlIFNDU0kgQlVTCSovCisJdV9jaGFyCQlzZXR0bGVfdGltZV92YWxpZDsKK307CisKKy8qCisgKiAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGVyLgorICovCisjZGVmaW5lIHN5bV9uYW1lKG5wKSAobnApLT5zLmluc3RfbmFtZQorCitzdHJ1Y3Qgc3ltX252cmFtOworCisvKgorICogVGhlIElPIG1hY3JvcyByZXF1aXJlIGEgc3RydWN0IGNhbGxlZCAncycgYW5kIGFyZSBhYnVzZWQgaW4gc3ltX252cmFtLmMKKyAqLworc3RydWN0IHN5bV9kZXZpY2UgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOworCXVuc2lnbmVkIGxvbmcgcmFtX2Jhc2U7CisJc3RydWN0IHsKKwkJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJCXZvaWQgX19pb21lbSAqcmFtYWRkcjsKKwl9IHM7CisJc3RydWN0IHN5bV9jaGlwIGNoaXA7CisJc3RydWN0IHN5bV9udnJhbSAqbnZyYW07CisJdV9zaG9ydCBkZXZpY2VfaWQ7CisJdV9jaGFyIGhvc3RfaWQ7Cit9OworCisvKgorICogIERyaXZlciBob3N0IGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgaG9zdF9kYXRhIHsKKwlzdHJ1Y3Qgc3ltX2hjYiAqbmNiOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ltX2hjYiAqIHN5bV9nZXRfaGNiKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuICgoc3RydWN0IGhvc3RfZGF0YSAqKWhvc3QtPmhvc3RkYXRhKS0+bmNiOworfQorCisjaW5jbHVkZSAic3ltX2Z3LmgiCisjaW5jbHVkZSAic3ltX2hpcGQuaCIKKworLyoKKyAqICBTZXQgdGhlIHN0YXR1cyBmaWVsZCBvZiBhIENBTSBDQ0IuCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIAorc3ltX3NldF9jYW1fc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHN0YXR1cykKK3sKKwljbWQtPnJlc3VsdCAmPSB+KDB4ZmYgIDw8IDE2KTsKKwljbWQtPnJlc3VsdCB8PSAoc3RhdHVzIDw8IDE2KTsKK30KKworLyoKKyAqICBHZXQgdGhlIHN0YXR1cyBmaWVsZCBvZiBhIENBTSBDQ0IuCisgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQgCitzeW1fZ2V0X2NhbV9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXJldHVybiBob3N0X2J5dGUoY21kLT5yZXN1bHQpOworfQorCisvKgorICogIEJ1aWxkIENBTSByZXN1bHQgZm9yIGEgc3VjY2Vzc2Z1bCBJTyBhbmQgZm9yIGEgZmFpbGVkIElPLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBzeW1fc2V0X2NhbV9yZXN1bHRfb2soc3RydWN0IHN5bV9jY2IgKmNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZXNpZCkKK3sKKwljbWQtPnJlc2lkID0gcmVzaWQ7CisJY21kLT5yZXN1bHQgPSAoKChESURfT0spIDw8IDE2KSArICgoY3AtPnNzc3Nfc3RhdHVzKSAmIDB4N2YpKTsKK30KK3ZvaWQgc3ltX3NldF9jYW1fcmVzdWx0X2Vycm9yKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwLCBpbnQgcmVzaWQpOworCit2b2lkIHN5bV94cHRfZG9uZShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNjYik7CisjZGVmaW5lIHN5bV9wcmludF9hZGRyKGNtZCwgYXJnLi4uKSBkZXZfaW5mbygmY21kLT5kZXZpY2UtPnNkZXZfZ2VuZGV2ICwgIyMgYXJnKQordm9pZCBzeW1feHB0X2FzeW5jX2J1c19yZXNldChzdHJ1Y3Qgc3ltX2hjYiAqbnApOwordm9pZCBzeW1feHB0X2FzeW5jX3NlbnRfYmRyKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCk7CitpbnQgIHN5bV9zZXR1cF9kYXRhX2FuZF9zdGFydCAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjc2lvLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApOwordm9pZCBzeW1fbG9nX2J1c19lcnJvcihzdHJ1Y3Qgc3ltX2hjYiAqbnApOwordm9pZCBzeW1fc25pZmZfaW5xdWlyeShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHJlc2lkKTsKKworI2VuZGlmIC8qIFNZTV9HTFVFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhMTc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jCkBAIC0wLDAgKzEsNTg2NSBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1ICBNYXR0aGV3IFdpbGNveCA8bWF0dGhld0B3aWwuY3g+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlICJzeW1fZ2x1ZS5oIgorI2luY2x1ZGUgInN5bV9udnJhbS5oIgorCisjaWYgMAorI2RlZmluZSBTWU1fREVCVUdfR0VORVJJQ19TVVBQT1JUCisjZW5kaWYKKworLyoKKyAqICBOZWVkZWQgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworc3RhdGljIHZvaWQgc3ltX2ludF9tYSAoc3RydWN0IHN5bV9oY2IgKm5wKTsKK3N0YXRpYyB2b2lkIHN5bV9pbnRfc2lyIChzdHJ1Y3Qgc3ltX2hjYiAqbnApOworc3RhdGljIHN0cnVjdCBzeW1fY2NiICpzeW1fYWxsb2NfY2NiKHN0cnVjdCBzeW1faGNiICpucCk7CitzdGF0aWMgc3RydWN0IHN5bV9jY2IgKnN5bV9jY2JfZnJvbV9kc2Eoc3RydWN0IHN5bV9oY2IgKm5wLCB1MzIgZHNhKTsKK3N0YXRpYyB2b2lkIHN5bV9hbGxvY19sY2JfdGFncyAoc3RydWN0IHN5bV9oY2IgKm5wLCB1X2NoYXIgdG4sIHVfY2hhciBsbik7CitzdGF0aWMgdm9pZCBzeW1fY29tcGxldGVfZXJyb3IgKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwKTsKK3N0YXRpYyB2b2lkIHN5bV9jb21wbGV0ZV9vayAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApOworc3RhdGljIGludCBzeW1fY29tcHV0ZV9yZXNpZHVhbChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCk7CisKKy8qCisgKiAgUHJpbnQgYSBidWZmZXIgaW4gaGV4YWRlY2ltYWwgZm9ybWF0IHdpdGggYSAiLlxuIiBhdCBlbmQuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9wcmludGxfaGV4KHVfY2hhciAqcCwgaW50IG4pCit7CisJd2hpbGUgKG4tLSA+IDApCisJCXByaW50ZiAoIiAleCIsICpwKyspOworCXByaW50ZiAoIi5cbiIpOworfQorCisvKgorICogIFByaW50IG91dCB0aGUgY29udGVudCBvZiBhIFNDU0kgbWVzc2FnZS4KKyAqLworc3RhdGljIGludCBzeW1fc2hvd19tc2cgKHVfY2hhciAqIG1zZykKK3sKKwl1X2NoYXIgaTsKKwlwcmludGYgKCIleCIsKm1zZyk7CisJaWYgKCptc2c9PU1fRVhURU5ERUQpIHsKKwkJZm9yIChpPTE7aTw4O2krKykgeworCQkJaWYgKGktMT5tc2dbMV0pIGJyZWFrOworCQkJcHJpbnRmICgiLSV4Iixtc2dbaV0pOworCQl9CisJCXJldHVybiAoaSsxKTsKKwl9IGVsc2UgaWYgKCgqbXNnICYgMHhmMCkgPT0gMHgyMCkgeworCQlwcmludGYgKCItJXgiLG1zZ1sxXSk7CisJCXJldHVybiAoMik7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV9wcmludF9tc2coc3RydWN0IHN5bV9jY2IgKmNwLCBjaGFyICpsYWJlbCwgdV9jaGFyICptc2cpCit7CisJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwgIiVzOiAiLCBsYWJlbCk7CisKKwlzeW1fc2hvd19tc2cobXNnKTsKKwlwcmludGYoIi5cbiIpOworfQorCitzdGF0aWMgdm9pZCBzeW1fcHJpbnRfbmVnb19tc2coc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCBjaGFyICpsYWJlbCwgdV9jaGFyICptc2cpCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwlkZXZfaW5mbygmdHAtPnNkZXYtPnNkZXZfdGFyZ2V0LT5kZXYsICIlczogIiwgbGFiZWwpOworCisJc3ltX3Nob3dfbXNnKG1zZyk7CisJcHJpbnRmKCIuXG4iKTsKK30KKworLyoKKyAqICBQcmludCBzb21ldGhpbmcgdGhhdCB0ZWxscyBhYm91dCBleHRlbmRlZCBlcnJvcnMuCisgKi8KK3ZvaWQgc3ltX3ByaW50X3hlcnIoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgeF9zdGF0dXMpCit7CisJaWYgKHhfc3RhdHVzICYgWEVfUEFSSVRZX0VSUikgeworCQlzeW1fcHJpbnRfYWRkcihjbWQsICJ1bnJlY292ZXJlZCBTQ1NJIHBhcml0eSBlcnJvci5cbiIpOworCX0KKwlpZiAoeF9zdGF0dXMgJiBYRV9FWFRSQV9EQVRBKSB7CisJCXN5bV9wcmludF9hZGRyKGNtZCwgImV4dHJhbmVvdXMgZGF0YSBkaXNjYXJkZWQuXG4iKTsKKwl9CisJaWYgKHhfc3RhdHVzICYgWEVfQkFEX1BIQVNFKSB7CisJCXN5bV9wcmludF9hZGRyKGNtZCwgImlsbGVnYWwgc2NzaSBwaGFzZSAoNC81KS5cbiIpOworCX0KKwlpZiAoeF9zdGF0dXMgJiBYRV9TT0RMX1VOUlVOKSB7CisJCXN5bV9wcmludF9hZGRyKGNtZCwgIk9ERCB0cmFuc2ZlciBpbiBEQVRBIE9VVCBwaGFzZS5cbiIpOworCX0KKwlpZiAoeF9zdGF0dXMgJiBYRV9TV0lERV9PVlJVTikgeworCQlzeW1fcHJpbnRfYWRkcihjbWQsICJPREQgdHJhbnNmZXIgaW4gREFUQSBJTiBwaGFzZS5cbiIpOworCX0KK30KKworLyoKKyAqICBSZXR1cm4gYSBzdHJpbmcgZm9yIFNDU0kgQlVTIG1vZGUuCisgKi8KK3N0YXRpYyBjaGFyICpzeW1fc2NzaV9idXNfbW9kZShpbnQgbW9kZSkKK3sKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgU01PREVfSFZEOglyZXR1cm4gIkhWRCI7CisJY2FzZSBTTU9ERV9TRToJcmV0dXJuICJTRSI7CisJY2FzZSBTTU9ERV9MVkQ6IHJldHVybiAiTFZEIjsKKwl9CisJcmV0dXJuICI/PyI7Cit9CisKKy8qCisgKiAgU29mdCByZXNldCB0aGUgY2hpcC4KKyAqCisgKiAgUmFpc2luZyBTUlNUIHdoZW4gdGhlIGNoaXAgaXMgcnVubmluZyBtYXkgY2F1c2UgCisgKiAgcHJvYmxlbXMgb24gZHVhbCBmdW5jdGlvbiBjaGlwcyAoc2VlIGJlbG93KS4KKyAqICBPbiB0aGUgb3RoZXIgaGFuZCwgTFZEIGRldmljZXMgbmVlZCBzb21lIGRlbGF5IAorICogIHRvIHNldHRsZSBhbmQgcmVwb3J0IGFjdHVhbCBCVVMgbW9kZSBpbiBTVEVTVDQuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9jaGlwX3Jlc2V0IChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJT1VUQihucCwgbmNfaXN0YXQsIFNSU1QpOworCXVkZWxheSgxMCk7CisJT1VUQihucCwgbmNfaXN0YXQsIDApOworCXVkZWxheSgyMDAwKTsJLyogRm9yIEJVUyBNT0RFIHRvIHNldHRsZSAqLworfQorCisvKgorICogIFJlYWxseSBzb2Z0IHJlc2V0IHRoZSBjaGlwLjopCisgKgorICogIFNvbWUgODk2IGFuZCA4NzYgY2hpcCByZXZpc2lvbnMgbWF5IGhhbmctdXAgaWYgd2Ugc2V0IAorICogIHRoZSBTUlNUIChzb2Z0IHJlc2V0KSBiaXQgYXQgdGhlIHdyb25nIHRpbWUgd2hlbiBTQ1JJUFRTIAorICogIGFyZSBydW5uaW5nLgorICogIFNvLCB3ZSBuZWVkIHRvIGFib3J0IHRoZSBjdXJyZW50IG9wZXJhdGlvbiBwcmlvciB0byAKKyAqICBzb2Z0IHJlc2V0dGluZyB0aGUgY2hpcC4KKyAqLworc3RhdGljIHZvaWQgc3ltX3NvZnRfcmVzZXQgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1X2NoYXIgaXN0YXQgPSAwOworCWludCBpOworCisJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfSVNUQVQxKSB8fCAhKElOQihucCwgbmNfaXN0YXQxKSAmIFNDUlVOKSkKKwkJZ290byBkb19jaGlwX3Jlc2V0OworCisJT1VUQihucCwgbmNfaXN0YXQsIENBQlJUKTsKKwlmb3IgKGkgPSAxMDAwMDAgOyBpIDsgLS1pKSB7CisJCWlzdGF0ID0gSU5CKG5wLCBuY19pc3RhdCk7CisJCWlmIChpc3RhdCAmIFNJUCkgeworCQkJSU5XKG5wLCBuY19zaXN0KTsKKwkJfQorCQllbHNlIGlmIChpc3RhdCAmIERJUCkgeworCQkJaWYgKElOQihucCwgbmNfZHN0YXQpICYgQUJSVCkKKwkJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoNSk7CisJfQorCU9VVEIobnAsIG5jX2lzdGF0LCAwKTsKKwlpZiAoIWkpCisJCXByaW50ZigiJXM6IHVuYWJsZSB0byBhYm9ydCBjdXJyZW50IGNoaXAgb3BlcmF0aW9uLCAiCisJCSAgICAgICAiSVNUQVQ9MHglMDJ4LlxuIiwgc3ltX25hbWUobnApLCBpc3RhdCk7Citkb19jaGlwX3Jlc2V0OgorCXN5bV9jaGlwX3Jlc2V0KG5wKTsKK30KKworLyoKKyAqICBTdGFydCByZXNldCBwcm9jZXNzLgorICoKKyAqICBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCByZWluaXRpYWxpemUgdGhlIGNoaXAuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zdGFydF9yZXNldChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJc3ltX3Jlc2V0X3Njc2lfYnVzKG5wLCAxKTsKK30KKyAKK2ludCBzeW1fcmVzZXRfc2NzaV9idXMoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgZW5hYl9pbnQpCit7CisJdTMyIHRlcm07CisJaW50IHJldHYgPSAwOworCisJc3ltX3NvZnRfcmVzZXQobnApOwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwICovCisJaWYgKGVuYWJfaW50KQorCQlPVVRXKG5wLCBuY19zaWVuLCBSU1QpOworCS8qCisJICogIEVuYWJsZSBUb2xlcmFudCwgcmVzZXQgSVJRRCBpZiBwcmVzZW50IGFuZCAKKwkgKiAgcHJvcGVybHkgc2V0IElSUSBtb2RlLCBwcmlvciB0byByZXNldHRpbmcgdGhlIGJ1cy4KKwkgKi8KKwlPVVRCKG5wLCBuY19zdGVzdDMsIFRFKTsKKwlPVVRCKG5wLCBuY19kY250bCwgKG5wLT5ydl9kY250bCAmIElSUU0pKTsKKwlPVVRCKG5wLCBuY19zY250bDEsIENSU1QpOworCXVkZWxheSgyMDApOworCisJaWYgKCFTWU1fU0VUVVBfU0NTSV9CVVNfQ0hFQ0spCisJCWdvdG8gb3V0OworCS8qCisJICogIENoZWNrIGZvciBubyB0ZXJtaW5hdG9ycyBvciBTQ1NJIGJ1cyBzaG9ydHMgdG8gZ3JvdW5kLgorCSAqICBSZWFkIFNDU0kgZGF0YSBidXMsIGRhdGEgcGFyaXR5IGJpdHMgYW5kIGNvbnRyb2wgc2lnbmFscy4KKwkgKiAgV2UgYXJlIGV4cGVjdGluZyBSRVNFVCB0byBiZSBUUlVFIGFuZCBvdGhlciBzaWduYWxzIHRvIGJlIAorCSAqICBGQUxTRS4KKwkgKi8KKwl0ZXJtID0JSU5CKG5wLCBuY19zc3RhdDApOworCXRlcm0gPQkoKHRlcm0gJiAyKSA8PCA3KSArICgodGVybSAmIDEpIDw8IDE3KTsJLyogcnN0IHNkcDAgKi8KKwl0ZXJtIHw9ICgoSU5CKG5wLCBuY19zc3RhdDIpICYgMHgwMSkgPDwgMjYpIHwJLyogc2RwMSAgICAgKi8KKwkJKChJTlcobnAsIG5jX3NiZGwpICYgMHhmZikgICA8PCA5KSAgfAkvKiBkNy0wICAgICAqLworCQkoKElOVyhucCwgbmNfc2JkbCkgJiAweGZmMDApIDw8IDEwKSB8CS8qIGQxNS04ICAgICovCisJCUlOQihucCwgbmNfc2JjbCk7CS8qIHJlcSBhY2sgYnN5IHNlbCBhdG4gbXNnIGNkIGlvICAgICovCisKKwlpZiAoIW5wLT5tYXh3aWRlKQorCQl0ZXJtICY9IDB4M2ZmZmY7CisKKwlpZiAodGVybSAhPSAoMjw8NykpIHsKKwkJcHJpbnRmKCIlczogc3VzcGljaW91cyBTQ1NJIGRhdGEgd2hpbGUgcmVzZXR0aW5nIHRoZSBCVVMuXG4iLAorCQkJc3ltX25hbWUobnApKTsKKwkJcHJpbnRmKCIlczogJXNkcDAsZDctMCxyc3QscmVxLGFjayxic3ksc2VsLGF0bixtc2csYy9kLGkvbyA9ICIKKwkJCSIweCVseCwgZXhwZWN0aW5nIDB4JWx4XG4iLAorCQkJc3ltX25hbWUobnApLAorCQkJKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpID8gImRwMSxkMTUtOCwiIDogIiIsCisJCQkodV9sb25nKXRlcm0sICh1X2xvbmcpKDI8PDcpKTsKKwkJaWYgKFNZTV9TRVRVUF9TQ1NJX0JVU19DSEVDSyA9PSAxKQorCQkJcmV0diA9IDE7CisJfQorb3V0OgorCU9VVEIobnAsIG5jX3NjbnRsMSwgMCk7CisJcmV0dXJuIHJldHY7Cit9CisKKy8qCisgKiAgU2VsZWN0IFNDU0kgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zZWxlY3RjbG9jayhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfY2hhciBzY250bDMpCit7CisJLyoKKwkgKiAgSWYgbXVsdGlwbGllciBub3QgcHJlc2VudCBvciBub3Qgc2VsZWN0ZWQsIGxlYXZlIGhlcmUuCisJICovCisJaWYgKG5wLT5tdWx0aXBsaWVyIDw9IDEpIHsKKwkJT1VUQihucCwgbmNfc2NudGwzLCBzY250bDMpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN5bV92ZXJib3NlID49IDIpCisJCXByaW50ZiAoIiVzOiBlbmFibGluZyBjbG9jayBtdWx0aXBsaWVyXG4iLCBzeW1fbmFtZShucCkpOworCisJT1VUQihucCwgbmNfc3Rlc3QxLCBEQkxFTik7CSAgIC8qIEVuYWJsZSBjbG9jayBtdWx0aXBsaWVyICovCisJLyoKKwkgKiAgV2FpdCBmb3IgdGhlIExDS0ZSUSBiaXQgdG8gYmUgc2V0IGlmIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KKwkgKiAgT3RoZXJ3aXNlIHdhaXQgNTAgbWljcm8tc2Vjb25kcyAoYXQgbGVhc3QpLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9MQ0tGUlEpIHsKKwkJaW50IGkgPSAyMDsKKwkJd2hpbGUgKCEoSU5CKG5wLCBuY19zdGVzdDQpICYgTENLRlJRKSAmJiAtLWkgPiAwKQorCQkJdWRlbGF5KDIwKTsKKwkJaWYgKCFpKQorCQkJcHJpbnRmKCIlczogdGhlIGNoaXAgY2Fubm90IGxvY2sgdGhlIGZyZXF1ZW5jeVxuIiwKKwkJCQlzeW1fbmFtZShucCkpOworCX0gZWxzZQorCQl1ZGVsYXkoKDUwKzEwKSk7CisJT1VUQihucCwgbmNfc3Rlc3QzLCBIU0MpOwkJLyogSGFsdCB0aGUgc2NzaSBjbG9jawkqLworCU9VVEIobnAsIG5jX3NjbnRsMywgc2NudGwzKTsKKwlPVVRCKG5wLCBuY19zdGVzdDEsIChEQkxFTnxEQkxTRUwpKTsvKiBTZWxlY3QgY2xvY2sgbXVsdGlwbGllcgkqLworCU9VVEIobnAsIG5jX3N0ZXN0MywgMHgwMCk7CQkvKiBSZXN0YXJ0IHNjc2kgY2xvY2sgCSovCit9CisKKworLyoKKyAqICBEZXRlcm1pbmUgdGhlIGNoaXAncyBjbG9jayBmcmVxdWVuY3kuCisgKgorICogIFRoaXMgaXMgZXNzZW50aWFsIGZvciB0aGUgbmVnb3RpYXRpb24gb2YgdGhlIHN5bmNocm9ub3VzIAorICogIHRyYW5zZmVyIHJhdGUuCisgKgorICogIE5vdGU6IHdlIGhhdmUgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlLgorICogIFRIRVJFIElTIE5PIFNBRkUgREVGQVVMVCBWQUxVRS4KKyAqCisgKiAgTW9zdCBOQ1IvU1lNQklPUyBib2FyZHMgYXJlIGRlbGl2ZXJlZCB3aXRoIGEgNDAgTWh6IGNsb2NrLgorICogIDUzQzg2MCBhbmQgNTNDODc1IHJldi4gMSBzdXBwb3J0IGZhc3QyMCB0cmFuc2ZlcnMgYnV0IAorICogIGRvIG5vdCBoYXZlIGEgY2xvY2sgZG91YmxlciBhbmQgc28gYXJlIHByb3ZpZGVkIHdpdGggYSAKKyAqICA4MCBNSHogY2xvY2suIEFsbCBvdGhlciBmYXN0MjAgYm9hcmRzIGluY29ycG9yYXRlIGEgZG91YmxlciAKKyAqICBhbmQgc28gc2hvdWxkIGJlIGRlbGl2ZXJlZCB3aXRoIGEgNDAgTUh6IGNsb2NrLgorICogIFRoZSByZWNlbnQgZmFzdDQwIGNoaXBzICg4OTUvODk2Lzg5NUEvMTAxMCkgdXNlIGEgNDAgTWh6IGJhc2UgCisgKiAgY2xvY2sgYW5kIHByb3ZpZGUgYSBjbG9jayBxdWFkcnVwbGVyICgxNjAgTWh6KS4KKyAqLworCisvKgorICogIGNhbGN1bGF0ZSBTQ1NJIGNsb2NrIGZyZXF1ZW5jeSAoaW4gS0h6KQorICovCitzdGF0aWMgdW5zaWduZWQgZ2V0ZnJlcSAoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgZ2VuKQoreworCXVuc2lnbmVkIGludCBtcyA9IDA7CisJdW5zaWduZWQgaW50IGY7CisKKwkvKgorCSAqIE1lYXN1cmUgR0VOIHRpbWVyIGRlbGF5IGluIG9yZGVyIAorCSAqIHRvIGNhbGN1bGF0ZSBTQ1NJIGNsb2NrIGZyZXF1ZW5jeQorCSAqCisJICogVGhpcyBjb2RlIHdpbGwgbmV2ZXIgZXhlY3V0ZSB0b28KKwkgKiBtYW55IGxvb3AgaXRlcmF0aW9ucyAoaWYgREVMQVkgaXMgCisJICogcmVhc29uYWJseSBjb3JyZWN0KS4gSXQgY291bGQgZ2V0CisJICogdG9vIGxvdyBhIGRlbGF5ICh0b28gaGlnaCBhIGZyZXEuKQorCSAqIGlmIHRoZSBDUFUgaXMgc2xvdyBleGVjdXRpbmcgdGhlIAorCSAqIGxvb3AgZm9yIHNvbWUgcmVhc29uIChhbiBOTUksIGZvcgorCSAqIGV4YW1wbGUpLiBGb3IgdGhpcyByZWFzb24gd2Ugd2lsbAorCSAqIGlmIG11bHRpcGxlIG1lYXN1cmVtZW50cyBhcmUgdG8gYmUgCisJICogcGVyZm9ybWVkIHRydXN0IHRoZSBoaWdoZXIgZGVsYXkgCisJICogKGxvd2VyIGZyZXF1ZW5jeSByZXR1cm5lZCkuCisJICovCisJT1VUVyhucCwgbmNfc2llbiwgMCk7CS8qIG1hc2sgYWxsIHNjc2kgaW50ZXJydXB0cyAqLworCUlOVyhucCwgbmNfc2lzdCk7CS8qIGNsZWFyIHBlbmRpbmcgc2NzaSBpbnRlcnJ1cHQgKi8KKwlPVVRCKG5wLCBuY19kaWVuLCAwKTsJLyogbWFzayBhbGwgZG1hIGludGVycnVwdHMgKi8KKwlJTlcobnAsIG5jX3Npc3QpOwkvKiBhbm90aGVyIG9uZSwganVzdCB0byBiZSBzdXJlIDopICovCisJLyoKKwkgKiBUaGUgQzEwMTAtMzMgY29yZSBkb2VzIG5vdCByZXBvcnQgR0VOIGluIFNJU1QsCisJICogaWYgdGhpcyBpbnRlcnJ1cHQgaXMgbWFza2VkIGluIFNJRU4uCisJICogSSBkb24ndCBrbm93IHlldCBpZiB0aGUgQzEwMTAtNjYgYmVoYXZlcyB0aGUgc2FtZSB3YXkuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkgeworCQlPVVRXKG5wLCBuY19zaWVuLCBHRU4pOworCQlPVVRCKG5wLCBuY19pc3RhdDEsIFNJUlFEKTsKKwl9CisJT1VUQihucCwgbmNfc2NudGwzLCA0KTsJICAgLyogc2V0IHByZS1zY2FsZXIgdG8gZGl2aWRlIGJ5IDMgKi8KKwlPVVRCKG5wLCBuY19zdGltZTEsIDApOwkgICAvKiBkaXNhYmxlIGdlbmVyYWwgcHVycG9zZSB0aW1lciAqLworCU9VVEIobnAsIG5jX3N0aW1lMSwgZ2VuKTsgIC8qIHNldCB0byBub21pbmFsIGRlbGF5IG9mIDE8PGdlbiAqIDEyNXVzICovCisJd2hpbGUgKCEoSU5XKG5wLCBuY19zaXN0KSAmIEdFTikgJiYgbXMrKyA8IDEwMDAwMCkKKwkJdWRlbGF5KDEwMDAvNCk7ICAgIC8qIGNvdW50IGluIDEvNCBvZiBtcyAqLworCU9VVEIobnAsIG5jX3N0aW1lMSwgMCk7ICAgIC8qIGRpc2FibGUgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyICovCisJLyoKKwkgKiBVbmRvIEMxMDEwLTMzIHNwZWNpZmljIHNldHRpbmdzLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApIHsKKwkJT1VUVyhucCwgbmNfc2llbiwgMCk7CisJCU9VVEIobnAsIG5jX2lzdGF0MSwgMCk7CisJfQorIAkvKgorIAkgKiBzZXQgcHJlc2NhbGVyIHRvIGRpdmlkZSBieSB3aGF0ZXZlciAwIG1lYW5zCisgCSAqIDAgb3VnaHQgdG8gY2hvb3NlIGRpdmlkZSBieSAyLCBidXQgYXBwZWFycworIAkgKiB0byBzZXQgZGl2aWRlIGJ5IDMuNSBtb2RlIGluIG15IDUzYzgxMCAuLi4KKyAJICovCisgCU9VVEIobnAsIG5jX3NjbnRsMywgMCk7CisKKyAgCS8qCisgCSAqIGFkanVzdCBmb3IgcHJlc2NhbGVyLCBhbmQgY29udmVydCBpbnRvIEtIeiAKKyAgCSAqLworCWYgPSBtcyA/ICgoMSA8PCBnZW4pICogKDQzNDAqNCkpIC8gbXMgOiAwOworCisJLyoKKwkgKiBUaGUgQzEwMTAtMzMgcmVzdWx0IGlzIGJpYXNlZCBieSBhIGZhY3RvciAKKwkgKiBvZiAyLzMgY29tcGFyZWQgdG8gZWFybGllciBjaGlwcy4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQzEwKQorCQlmID0gKGYgKiAyKSAvIDM7CisKKwlpZiAoc3ltX3ZlcmJvc2UgPj0gMikKKwkJcHJpbnRmICgiJXM6IERlbGF5IChHRU49JWQpOiAldSBtc2VjLCAldSBLSHpcbiIsCisJCQlzeW1fbmFtZShucCksIGdlbiwgbXMvNCwgZik7CisKKwlyZXR1cm4gZjsKK30KKworc3RhdGljIHVuc2lnbmVkIHN5bV9nZXRmcmVxIChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdV9pbnQgZjEsIGYyOworCWludCBnZW4gPSA4OworCisJZ2V0ZnJlcSAobnAsIGdlbik7CS8qIHRocm93IGF3YXkgZmlyc3QgcmVzdWx0ICovCisJZjEgPSBnZXRmcmVxIChucCwgZ2VuKTsKKwlmMiA9IGdldGZyZXEgKG5wLCBnZW4pOworCWlmIChmMSA+IGYyKSBmMSA9IGYyOwkJLyogdHJ1c3QgbG93ZXIgcmVzdWx0CSovCisJcmV0dXJuIGYxOworfQorCisvKgorICogIEdldC9wcm9iZSBjaGlwIFNDU0kgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB2b2lkIHN5bV9nZXRjbG9jayAoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgbXVsdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNjbnRsMyA9IG5wLT5zdl9zY250bDM7CisJdW5zaWduZWQgY2hhciBzdGVzdDEgPSBucC0+c3Zfc3Rlc3QxOworCXVuc2lnbmVkIGYxOworCisJbnAtPm11bHRpcGxpZXIgPSAxOworCWYxID0gNDAwMDA7CisJLyoKKwkgKiAgVHJ1ZSB3aXRoIDg3NS84OTUvODk2Lzg5NUEgd2l0aCBjbG9jayBtdWx0aXBsaWVyIHNlbGVjdGVkCisJICovCisJaWYgKG11bHQgPiAxICYmIChzdGVzdDEgJiAoREJMRU4rREJMU0VMKSkgPT0gREJMRU4rREJMU0VMKSB7CisJCWlmIChzeW1fdmVyYm9zZSA+PSAyKQorCQkJcHJpbnRmICgiJXM6IGNsb2NrIG11bHRpcGxpZXIgZm91bmRcbiIsIHN5bV9uYW1lKG5wKSk7CisJCW5wLT5tdWx0aXBsaWVyID0gbXVsdDsKKwl9CisKKwkvKgorCSAqICBJZiBtdWx0aXBsaWVyIG5vdCBmb3VuZCBvciBzY250bDMgbm90IDcsNSwzLAorCSAqICByZXNldCBjaGlwIGFuZCBnZXQgZnJlcXVlbmN5IGZyb20gZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorCSAqICBPdGhlcndpc2UgdHJ1c3Qgc2NudGwzIEJJT1Mgc2V0dGluZy4KKwkgKi8KKwlpZiAobnAtPm11bHRpcGxpZXIgIT0gbXVsdCB8fCAoc2NudGwzICYgNykgPCAzIHx8ICEoc2NudGwzICYgMSkpIHsKKwkJT1VUQihucCwgbmNfc3Rlc3QxLCAwKTsJCS8qIG1ha2Ugc3VyZSBkb3VibGVyIGlzIE9GRiAqLworCQlmMSA9IHN5bV9nZXRmcmVxIChucCk7CisKKwkJaWYgKHN5bV92ZXJib3NlKQorCQkJcHJpbnRmICgiJXM6IGNoaXAgY2xvY2sgaXMgJXVLSHpcbiIsIHN5bV9uYW1lKG5wKSwgZjEpOworCisJCWlmCShmMSA8CTQ1MDAwKQkJZjEgPSAgNDAwMDA7CisJCWVsc2UgaWYgKGYxIDwJNTUwMDApCQlmMSA9ICA1MDAwMDsKKwkJZWxzZQkJCQlmMSA9ICA4MDAwMDsKKworCQlpZiAoZjEgPCA4MDAwMCAmJiBtdWx0ID4gMSkgeworCQkJaWYgKHN5bV92ZXJib3NlID49IDIpCisJCQkJcHJpbnRmICgiJXM6IGNsb2NrIG11bHRpcGxpZXIgYXNzdW1lZFxuIiwKKwkJCQkJc3ltX25hbWUobnApKTsKKwkJCW5wLT5tdWx0aXBsaWVyCT0gbXVsdDsKKwkJfQorCX0gZWxzZSB7CisJCWlmCSgoc2NudGwzICYgNykgPT0gMykJZjEgPSAgNDAwMDA7CisJCWVsc2UgaWYJKChzY250bDMgJiA3KSA9PSA1KQlmMSA9ICA4MDAwMDsKKwkJZWxzZSAJCQkJZjEgPSAxNjAwMDA7CisKKwkJZjEgLz0gbnAtPm11bHRpcGxpZXI7CisJfQorCisJLyoKKwkgKiAgQ29tcHV0ZSBjb250cm9sbGVyIHN5bmNocm9ub3VzIHBhcmFtZXRlcnMuCisJICovCisJZjEJCSo9IG5wLT5tdWx0aXBsaWVyOworCW5wLT5jbG9ja19raHoJPSBmMTsKK30KKworLyoKKyAqICBHZXQvcHJvYmUgUENJIGNsb2NrIGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHN5bV9nZXRwY2ljbG9jayAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCWludCBmID0gMDsKKworCS8qCisJICogIEZvciBub3csIHdlIG9ubHkgbmVlZCB0byBrbm93IGFib3V0IHRoZSBhY3R1YWwgCisJICogIFBDSSBCVVMgY2xvY2sgZnJlcXVlbmN5IGZvciBDMTAxMC02NiBjaGlwcy4KKwkgKi8KKyNpZiAxCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFXzY2TUhaKSB7CisjZWxzZQorCWlmICgxKSB7CisjZW5kaWYKKwkJT1VUQihucCwgbmNfc3Rlc3QxLCBTQ0xLKTsgLyogVXNlIHRoZSBQQ0kgY2xvY2sgYXMgU0NTSSBjbG9jayAqLworCQlmID0gc3ltX2dldGZyZXEobnApOworCQlPVVRCKG5wLCBuY19zdGVzdDEsIDApOworCX0KKwlucC0+cGNpY2xrX2toeiA9IGY7CisKKwlyZXR1cm4gZjsKK30KKworLyoKKyAqICBTWU1CSU9TIGNoaXAgY2xvY2sgZGl2aXNvciB0YWJsZS4KKyAqCisgKiAgRGl2aXNvcnMgYXJlIG11bHRpcGxpZWQgYnkgMTAsMDAwLDAwMCBpbiBvcmRlciB0byBtYWtlIAorICogIGNhbGN1bGF0aW9ucyBtb3JlIHNpbXBsZS4KKyAqLworI2RlZmluZSBfNU0gNTAwMDAwMAorc3RhdGljIHUzMiBkaXZfMTBNW10gPSB7MipfNU0sIDMqXzVNLCA0Kl81TSwgNipfNU0sIDgqXzVNLCAxMipfNU0sIDE2Kl81TX07CisKKy8qCisgKiAgR2V0IGNsb2NrIGZhY3RvciBhbmQgc3luYyBkaXZpc29yIGZvciBhIGdpdmVuIAorICogIHN5bmNocm9ub3VzIGZhY3RvciBwZXJpb2QuCisgKi8KK3N0YXRpYyBpbnQgCitzeW1fZ2V0c3luYyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfY2hhciBkdCwgdV9jaGFyIHNmYWMsIHVfY2hhciAqZGl2cCwgdV9jaGFyICpmYWtwKQoreworCXUzMgljbGsgPSBucC0+Y2xvY2tfa2h6OwkvKiBTQ1NJIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoJKi8KKwlpbnQJZGl2ID0gbnAtPmNsb2NrX2Rpdm47CS8qIE51bWJlciBvZiBkaXZpc29ycyBzdXBwb3J0ZWQJKi8KKwl1MzIJZmFrOwkJCS8qIFN5bmMgZmFjdG9yIGluIHN4ZmVyCQkqLworCXUzMglwZXI7CQkJLyogUGVyaW9kIGluIHRlbnRocyBvZiBucwkqLworCXUzMglrcGM7CQkJLyogKHBlciAqIGNsaykJCQkqLworCWludAlyZXQ7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSBzeW5jaHJvbm91cyBwZXJpb2QgaW4gdGVudGhzIG9mIG5hbm8tc2Vjb25kcworCSAqLworCWlmIChkdCAmJiBzZmFjIDw9IDkpCXBlciA9IDEyNTsKKwllbHNlIGlmCShzZmFjIDw9IDEwKQlwZXIgPSAyNTA7CisJZWxzZSBpZgkoc2ZhYyA9PSAxMSkJcGVyID0gMzAzOworCWVsc2UgaWYJKHNmYWMgPT0gMTIpCXBlciA9IDUwMDsKKwllbHNlCQkJcGVyID0gNDAgKiBzZmFjOworCXJldCA9IHBlcjsKKworCWtwYyA9IHBlciAqIGNsazsKKwlpZiAoZHQpCisJCWtwYyA8PD0gMTsKKworCS8qCisJICogIEZvciBlYXJsaWVzdCBDMTAgcmV2aXNpb24gMCwgd2UgY2Fubm90IHVzZSBleHRyYSAKKwkgKiAgY2xvY2tzIGZvciB0aGUgc2V0dGluZyBvZiB0aGUgU0NTSSBjbG9ja2luZy4KKwkgKiAgTm90ZSB0aGF0IHRoaXMgbGltaXRzIHRoZSBsb3dlc3Qgc3luYyBkYXRhIHRyYW5zZmVyIAorCSAqICB0byA1IE1lZ2EtdHJhbnNmZXJzIHBlciBzZWNvbmQgYW5kIG1heSByZXN1bHQgaW4KKwkgKiAgdXNpbmcgaGlnaGVyIGNsb2NrIGRpdmlzb3JzLgorCSAqLworI2lmIDEKKwlpZiAoKG5wLT5mZWF0dXJlcyAmIChGRV9DMTB8RkVfVTNFTikpID09IEZFX0MxMCkgeworCQkvKgorCQkgKiAgTG9vayBmb3IgdGhlIGxvd2VzdCBjbG9jayBkaXZpc29yIHRoYXQgYWxsb3dzIGFuIAorCQkgKiAgb3V0cHV0IHNwZWVkIG5vdCBmYXN0ZXIgdGhhbiB0aGUgcGVyaW9kLgorCQkgKi8KKwkJd2hpbGUgKGRpdiA+IDApIHsKKwkJCS0tZGl2OworCQkJaWYgKGtwYyA+IChkaXZfMTBNW2Rpdl0gPDwgMikpIHsKKwkJCQkrK2RpdjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmYWsgPSAwOwkJCS8qIE5vIGV4dHJhIGNsb2NrcyAqLworCQlpZiAoZGl2ID09IG5wLT5jbG9ja19kaXZuKSB7CS8qIEFyZSB3ZSB0b28gZmFzdCA/ICovCisJCQlyZXQgPSAtMTsKKwkJfQorCQkqZGl2cCA9IGRpdjsKKwkJKmZha3AgPSBmYWs7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKwkvKgorCSAqICBMb29rIGZvciB0aGUgZ3JlYXRlc3QgY2xvY2sgZGl2aXNvciB0aGF0IGFsbG93cyBhbiAKKwkgKiAgaW5wdXQgc3BlZWQgZmFzdGVyIHRoYW4gdGhlIHBlcmlvZC4KKwkgKi8KKwl3aGlsZSAoZGl2LS0gPiAwKQorCQlpZiAoa3BjID49IChkaXZfMTBNW2Rpdl0gPDwgMikpIGJyZWFrOworCisJLyoKKwkgKiAgQ2FsY3VsYXRlIHRoZSBsb3dlc3QgY2xvY2sgZmFjdG9yIHRoYXQgYWxsb3dzIGFuIG91dHB1dCAKKwkgKiAgc3BlZWQgbm90IGZhc3RlciB0aGFuIHRoZSBwZXJpb2QsIGFuZCB0aGUgbWF4IG91dHB1dCBzcGVlZC4KKwkgKiAgSWYgZmFrID49IDEgd2Ugd2lsbCBzZXQgYm90aCBYQ0xLSF9TVCBhbmQgWENMS0hfRFQuCisJICogIElmIGZhayA+PSAyIHdlIHdpbGwgYWxzbyBzZXQgWENMS1NfU1QgYW5kIFhDTEtTX0RULgorCSAqLworCWlmIChkdCkgeworCQlmYWsgPSAoa3BjIC0gMSkgLyAoZGl2XzEwTVtkaXZdIDw8IDEpICsgMSAtIDI7CisJCS8qIHJldCA9ICgoMitmYWspKmRpdl8xME1bZGl2XSkvbnAtPmNsb2NrX2toejsgKi8KKwl9IGVsc2UgeworCQlmYWsgPSAoa3BjIC0gMSkgLyBkaXZfMTBNW2Rpdl0gKyAxIC0gNDsKKwkJLyogcmV0ID0gKCg0K2ZhaykqZGl2XzEwTVtkaXZdKS9ucC0+Y2xvY2tfa2h6OyAqLworCX0KKworCS8qCisJICogIENoZWNrIGFnYWluc3Qgb3VyIGhhcmR3YXJlIGxpbWl0cywgb3IgYnVncyA6KS4KKwkgKi8KKwlpZiAoZmFrID4gMikgeworCQlmYWsgPSAyOworCQlyZXQgPSAtMTsKKwl9CisKKwkvKgorCSAqICBDb21wdXRlIGFuZCByZXR1cm4gc3luYyBwYXJhbWV0ZXJzLgorCSAqLworCSpkaXZwID0gZGl2OworCSpmYWtwID0gZmFrOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICBTWU1CSU9TIGNoaXBzIGFsbG93IGJ1cnN0IGxlbmd0aHMgb2YgMiwgNCwgOCwgMTYsIDMyLCA2NCwKKyAqICAxMjggdHJhbnNmZXJzLiBBbGwgY2hpcHMgc3VwcG9ydCBhdCBsZWFzdCAxNiB0cmFuc2ZlcnMgCisgKiAgYnVyc3RzLiBUaGUgODI1QSwgODc1IGFuZCA4OTUgY2hpcHMgc3VwcG9ydCBidXJzdHMgb2YgdXAgCisgKiAgdG8gMTI4IHRyYW5zZmVycyBhbmQgdGhlIDg5NUEgYW5kIDg5NiBzdXBwb3J0IGJ1cnN0cyBvZiB1cAorICogIHRvIDY0IHRyYW5zZmVycy4gQWxsIG90aGVyIGNoaXBzIHN1cHBvcnQgdXAgdG8gMTYgCisgKiAgdHJhbnNmZXJzIGJ1cnN0cy4KKyAqCisgKiAgRm9yIFBDSSAzMiBiaXQgZGF0YSB0cmFuc2ZlcnMgZWFjaCB0cmFuc2ZlciBpcyBhIERXT1JELgorICogIEl0IGlzIGEgUVVBRFdPUkQgKDggYnl0ZXMpIGZvciBQQ0kgNjQgYml0IGRhdGEgdHJhbnNmZXJzLgorICoKKyAqICBXZSB1c2UgbG9nIGJhc2UgMiAoYnVyc3QgbGVuZ3RoKSBhcyBpbnRlcm5hbCBjb2RlLCB3aXRoIAorICogIHZhbHVlIDAgbWVhbmluZyAiYnVyc3QgZGlzYWJsZWQiLgorICovCisKKy8qCisgKiAgQnVyc3QgbGVuZ3RoIGZyb20gYnVyc3QgY29kZS4KKyAqLworI2RlZmluZSBidXJzdF9sZW5ndGgoYmMpICghKGJjKSk/IDAgOiAxIDw8IChiYykKKworLyoKKyAqICBCdXJzdCBjb2RlIGZyb20gaW8gcmVnaXN0ZXIgYml0cy4KKyAqLworI2RlZmluZSBidXJzdF9jb2RlKGRtb2RlLCBjdGVzdDQsIGN0ZXN0NSkgXAorCShjdGVzdDQpICYgMHg4MD8gMCA6ICgoKGRtb2RlKSAmIDB4YzApID4+IDYpICsgKChjdGVzdDUpICYgMHgwNCkgKyAxCisKKy8qCisgKiAgU2V0IGluaXRpYWwgaW8gcmVnaXN0ZXIgYml0cyBmcm9tIGJ1cnN0IGNvZGUuCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkIHN5bV9pbml0X2J1cnN0KHN0cnVjdCBzeW1faGNiICpucCwgdV9jaGFyIGJjKQoreworCW5wLT5ydl9jdGVzdDQJJj0gfjB4ODA7CisJbnAtPnJ2X2Rtb2RlCSY9IH4oMHgzIDw8IDYpOworCW5wLT5ydl9jdGVzdDUJJj0gfjB4NDsKKworCWlmICghYmMpIHsKKwkJbnAtPnJ2X2N0ZXN0NAl8PSAweDgwOworCX0KKwllbHNlIHsKKwkJLS1iYzsKKwkJbnAtPnJ2X2Rtb2RlCXw9ICgoYmMgJiAweDMpIDw8IDYpOworCQlucC0+cnZfY3Rlc3Q1CXw9IChiYyAmIDB4NCk7CisJfQorfQorCisKKy8qCisgKiBQcmludCBvdXQgdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0aGF0IGhhdmUgc29tZSBmbGFnIGRpc2FibGVkIGJ5IHVzZXIuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9wcmludF90YXJnZXRzX2ZsYWcoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgbWFzaywgY2hhciAqbXNnKQoreworCWludCBjbnQ7CisJaW50IGk7CisKKwlmb3IgKGNudCA9IDAsIGkgPSAwIDsgaSA8IFNZTV9DT05GX01BWF9UQVJHRVQgOyBpKyspIHsKKwkJaWYgKGkgPT0gbnAtPm15YWRkcikKKwkJCWNvbnRpbnVlOworCQlpZiAobnAtPnRhcmdldFtpXS51c3JmbGFncyAmIG1hc2spIHsKKwkJCWlmICghY250KyspCisJCQkJcHJpbnRmKCIlczogJXMgZGlzYWJsZWQgZm9yIHRhcmdldHMiLAorCQkJCQlzeW1fbmFtZShucCksIG1zZyk7CisJCQlwcmludGYoIiAlZCIsIGkpOworCQl9CisJfQorCWlmIChjbnQpCisJCXByaW50ZigiLlxuIik7Cit9CisKKy8qCisgKiAgU2F2ZSBpbml0aWFsIHNldHRpbmdzIG9mIHNvbWUgSU8gcmVnaXN0ZXJzLgorICogIEFzc3VtZWQgdG8gaGF2ZSBiZWVuIHNldCBieSBCSU9TLgorICogIFdlIGNhbm5vdCByZXNldCB0aGUgY2hpcCBwcmlvciB0byByZWFkaW5nIHRoZSAKKyAqICBJTyByZWdpc3RlcnMsIHNpbmNlIGluZm9ybWF0aW9ucyB3aWxsIGJlIGxvc3QuCisgKiAgU2luY2UgdGhlIFNDUklQVFMgcHJvY2Vzc29yIG1heSBiZSBydW5uaW5nLCB0aGlzIAorICogIGlzIG5vdCBzYWZlIG9uIHBhcGVyLCBidXQgaXQgc2VlbXMgdG8gd29yayBxdWl0ZSAKKyAqICB3ZWxsLiA6KQorICovCitzdGF0aWMgdm9pZCBzeW1fc2F2ZV9pbml0aWFsX3NldHRpbmcgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwlucC0+c3Zfc2NudGwwCT0gSU5CKG5wLCBuY19zY250bDApICYgMHgwYTsKKwlucC0+c3Zfc2NudGwzCT0gSU5CKG5wLCBuY19zY250bDMpICYgMHgwNzsKKwlucC0+c3ZfZG1vZGUJPSBJTkIobnAsIG5jX2Rtb2RlKSAgJiAweGNlOworCW5wLT5zdl9kY250bAk9IElOQihucCwgbmNfZGNudGwpICAmIDB4YTg7CisJbnAtPnN2X2N0ZXN0Mwk9IElOQihucCwgbmNfY3Rlc3QzKSAmIDB4MDE7CisJbnAtPnN2X2N0ZXN0NAk9IElOQihucCwgbmNfY3Rlc3Q0KSAmIDB4ODA7CisJbnAtPnN2X2dwY250bAk9IElOQihucCwgbmNfZ3BjbnRsKTsKKwlucC0+c3Zfc3Rlc3QxCT0gSU5CKG5wLCBuY19zdGVzdDEpOworCW5wLT5zdl9zdGVzdDIJPSBJTkIobnAsIG5jX3N0ZXN0MikgJiAweDIwOworCW5wLT5zdl9zdGVzdDQJPSBJTkIobnAsIG5jX3N0ZXN0NCk7CisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkgewkvKiBBbHdheXMgbGFyZ2UgRE1BIGZpZm8gKyB1bHRyYTMgKi8KKwkJbnAtPnN2X3NjbnRsNAk9IElOQihucCwgbmNfc2NudGw0KTsKKwkJbnAtPnN2X2N0ZXN0NQk9IElOQihucCwgbmNfY3Rlc3Q1KSAmIDB4MDQ7CisJfQorCWVsc2UKKwkJbnAtPnN2X2N0ZXN0NQk9IElOQihucCwgbmNfY3Rlc3Q1KSAmIDB4MjQ7Cit9CisKKy8qCisgKiAgUHJlcGFyZSBpbyByZWdpc3RlciB2YWx1ZXMgdXNlZCBieSBzeW1fc3RhcnRfdXAoKSAKKyAqICBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgYW5kIHN1cHBvcnRlZCBmZWF0dXJlcy4KKyAqLworc3RhdGljIGludCBzeW1fcHJlcGFyZV9zZXR0aW5nKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKQoreworCXVfY2hhcglidXJzdF9tYXg7CisJdTMyCXBlcmlvZDsKKwlpbnQgaTsKKworCS8qCisJICogIFdpZGUgPworCSAqLworCW5wLT5tYXh3aWRlCT0gKG5wLT5mZWF0dXJlcyAmIEZFX1dJREUpPyAxIDogMDsKKworCS8qCisJICogIEd1ZXNzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNoaXAncyBjbG9jay4KKwkgKi8KKwlpZgkobnAtPmZlYXR1cmVzICYgKEZFX1VMVFJBMyB8IEZFX1VMVFJBMikpCisJCW5wLT5jbG9ja19raHogPSAxNjAwMDA7CisJZWxzZSBpZgkobnAtPmZlYXR1cmVzICYgRkVfVUxUUkEpCisJCW5wLT5jbG9ja19raHogPSA4MDAwMDsKKwllbHNlCisJCW5wLT5jbG9ja19raHogPSA0MDAwMDsKKworCS8qCisJICogIEdldCB0aGUgY2xvY2sgbXVsdGlwbGllciBmYWN0b3IuCisgCSAqLworCWlmCShucC0+ZmVhdHVyZXMgJiBGRV9RVUFEKQorCQlucC0+bXVsdGlwbGllcgk9IDQ7CisJZWxzZSBpZgkobnAtPmZlYXR1cmVzICYgRkVfREJMUikKKwkJbnAtPm11bHRpcGxpZXIJPSAyOworCWVsc2UKKwkJbnAtPm11bHRpcGxpZXIJPSAxOworCisJLyoKKwkgKiAgTWVhc3VyZSBTQ1NJIGNsb2NrIGZyZXF1ZW5jeSBmb3IgY2hpcHMgCisJICogIGl0IG1heSB2YXJ5IGZyb20gYXNzdW1lZCBvbmUuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX1ZBUkNMSykKKwkJc3ltX2dldGNsb2NrKG5wLCBucC0+bXVsdGlwbGllcik7CisKKwkvKgorCSAqIERpdmlzb3IgdG8gYmUgdXNlZCBmb3IgYXN5bmMgKHRpbWVyIHByZS1zY2FsZXIpLgorCSAqLworCWkgPSBucC0+Y2xvY2tfZGl2biAtIDE7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWlmICgxMHVsICogU1lNX0NPTkZfTUlOX0FTWU5DICogbnAtPmNsb2NrX2toeiA+IGRpdl8xME1baV0pIHsKKwkJCSsraTsKKwkJCWJyZWFrOworCQl9CisJfQorCW5wLT5ydl9zY250bDMgPSBpKzE7CisKKwkvKgorCSAqIFRoZSBDMTAxMCB1c2VzIGhhcmR3aXJlZCBkaXZpc29ycyBmb3IgYXN5bmMuCisJICogU28sIHdlIGp1c3QgdGhyb3cgYXdheSwgdGhlIGFzeW5jLiBkaXZpc29yLjotKQorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApCisJCW5wLT5ydl9zY250bDMgPSAwOworCisJLyoKKwkgKiBNaW5pbXVtIHN5bmNocm9ub3VzIHBlcmlvZCBmYWN0b3Igc3VwcG9ydGVkIGJ5IHRoZSBjaGlwLgorCSAqIEJ0dywgJ3BlcmlvZCcgaXMgaW4gdGVudGhzIG9mIG5hbm9zZWNvbmRzLgorCSAqLworCXBlcmlvZCA9ICg0ICogZGl2XzEwTVswXSArIG5wLT5jbG9ja19raHogLSAxKSAvIG5wLT5jbG9ja19raHo7CisKKwlpZgkocGVyaW9kIDw9IDI1MCkJCW5wLT5taW5zeW5jID0gMTA7CisJZWxzZSBpZgkocGVyaW9kIDw9IDMwMykJCW5wLT5taW5zeW5jID0gMTE7CisJZWxzZSBpZgkocGVyaW9kIDw9IDUwMCkJCW5wLT5taW5zeW5jID0gMTI7CisJZWxzZQkJCQlucC0+bWluc3luYyA9IChwZXJpb2QgKyA0MCAtIDEpIC8gNDA7CisKKwkvKgorCSAqIENoZWNrIGFnYWluc3QgY2hpcCBTQ1NJIHN0YW5kYXJkIHN1cHBvcnQgKFNDU0ktMixVTFRSQSxVTFRSQTIpLgorCSAqLworCWlmCShucC0+bWluc3luYyA8IDI1ICYmCisJCSAhKG5wLT5mZWF0dXJlcyAmIChGRV9VTFRSQXxGRV9VTFRSQTJ8RkVfVUxUUkEzKSkpCisJCW5wLT5taW5zeW5jID0gMjU7CisJZWxzZSBpZgkobnAtPm1pbnN5bmMgPCAxMiAmJgorCQkgIShucC0+ZmVhdHVyZXMgJiAoRkVfVUxUUkEyfEZFX1VMVFJBMykpKQorCQlucC0+bWluc3luYyA9IDEyOworCisJLyoKKwkgKiBNYXhpbXVtIHN5bmNocm9ub3VzIHBlcmlvZCBmYWN0b3Igc3VwcG9ydGVkIGJ5IHRoZSBjaGlwLgorCSAqLworCXBlcmlvZCA9ICgxMSAqIGRpdl8xME1bbnAtPmNsb2NrX2Rpdm4gLSAxXSkgLyAoNCAqIG5wLT5jbG9ja19raHopOworCW5wLT5tYXhzeW5jID0gcGVyaW9kID4gMjU0MCA/IDI1NCA6IHBlcmlvZCAvIDEwOworCisJLyoKKwkgKiBJZiBjaGlwIGlzIGEgQzEwMTAsIGd1ZXNzIHRoZSBzeW5jIGxpbWl0cyBpbiBEVCBtb2RlLgorCSAqLworCWlmICgobnAtPmZlYXR1cmVzICYgKEZFX0MxMHxGRV9VTFRSQTMpKSA9PSAoRkVfQzEwfEZFX1VMVFJBMykpIHsKKwkJaWYgKG5wLT5jbG9ja19raHogPT0gMTYwMDAwKSB7CisJCQlucC0+bWluc3luY19kdCA9IDk7CisJCQlucC0+bWF4c3luY19kdCA9IDUwOworCQkJbnAtPm1heG9mZnNfZHQgPSBudnJhbS0+dHlwZSA/IDYyIDogMzE7CisJCX0KKwl9CisJCisJLyoKKwkgKiAgNjQgYml0IGFkZHJlc3NpbmcgICg4OTVBLzg5Ni8xMDEwKSA/CisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0RBQykgeworI2lmICAgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAwCisJCW5wLT5ydl9jY250bDEJfD0gKEREQUMpOworI2VsaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAxCisJCWlmICghbnAtPnVzZV9kYWMpCisJCQlucC0+cnZfY2NudGwxCXw9IChEREFDKTsKKwkJZWxzZQorCQkJbnAtPnJ2X2NjbnRsMQl8PSAoWFRJTU9EIHwgRVhUSUJNVik7CisjZWxpZiBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwkJaWYgKCFucC0+dXNlX2RhYykKKwkJCW5wLT5ydl9jY250bDEJfD0gKEREQUMpOworCQllbHNlCisJCQlucC0+cnZfY2NudGwxCXw9ICgwIHwgRVhUSUJNVik7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqICBQaGFzZSBtaXNtYXRjaCBoYW5kbGVkIGJ5IFNDUklQVFMgKDg5NUEvODk2LzEwMTApID8KKyAgCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9OT1BNKQorCQlucC0+cnZfY2NudGwwCXw9IChFTlBNSik7CisKKyAJLyoKKwkgKiAgQzEwMTAtMzMgRXJyYXRhOiBQYXJ0IE51bWJlcjo2MDktMDM5NjM4IChyZXYuIDEpIGlzIGZpeGVkLgorCSAqICBJbiBkdWFsIGNoYW5uZWwgbW9kZSwgY29udGVudGlvbiBvY2N1cnMgaWYgaW50ZXJuYWwgY3ljbGVzCisJICogIGFyZSB1c2VkLiBEaXNhYmxlIGludGVybmFsIGN5Y2xlcy4KKwkgKi8KKwlpZiAobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzMzICYmCisJICAgIG5wLT5yZXZpc2lvbl9pZCA8IDB4MSkKKwkJbnAtPnJ2X2NjbnRsMAl8PSAgRElMUzsKKworCS8qCisJICogIFNlbGVjdCBidXJzdCBsZW5ndGggKGR3b3JkcykKKwkgKi8KKwlidXJzdF9tYXgJPSBTWU1fU0VUVVBfQlVSU1RfT1JERVI7CisJaWYgKGJ1cnN0X21heCA9PSAyNTUpCisJCWJ1cnN0X21heCA9IGJ1cnN0X2NvZGUobnAtPnN2X2Rtb2RlLCBucC0+c3ZfY3Rlc3Q0LAorCQkJCSAgICAgICBucC0+c3ZfY3Rlc3Q1KTsKKwlpZiAoYnVyc3RfbWF4ID4gNykKKwkJYnVyc3RfbWF4ID0gNzsKKwlpZiAoYnVyc3RfbWF4ID4gbnAtPm1heGJ1cnN0KQorCQlidXJzdF9tYXggPSBucC0+bWF4YnVyc3Q7CisKKwkvKgorCSAqICBERUwgMzUyIC0gNTNDODEwIFJldiB4MTEgLSBQYXJ0IE51bWJlciA2MDktMDM5MjE0MCAtIElURU0gMi4KKwkgKiAgVGhpcyBjaGlwIGFuZCB0aGUgODYwIFJldiAxIG1heSB3cm9uZ2x5IHVzZSBQQ0kgY2FjaGUgbGluZSAKKwkgKiAgYmFzZWQgdHJhbnNhY3Rpb25zIG9uIExPQUQvU1RPUkUgaW5zdHJ1Y3Rpb25zLiBTbyB3ZSBoYXZlIAorCSAqICB0byBwcmV2ZW50IHRoZXNlIGNoaXBzIGZyb20gdXNpbmcgc3VjaCBQQ0kgdHJhbnNhY3Rpb25zIGluIAorCSAqICB0aGlzIGRyaXZlci4gVGhlIGdlbmVyaWMgbmNyIGRyaXZlciB0aGF0IGRvZXMgbm90IHVzZSAKKwkgKiAgTE9BRC9TVE9SRSBpbnN0cnVjdGlvbnMgZG9lcyBub3QgbmVlZCB0aGlzIHdvcmstYXJvdW5kLgorCSAqLworCWlmICgobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAgJiYKKwkgICAgIG5wLT5yZXZpc2lvbl9pZCA+PSAweDEwICYmIG5wLT5yZXZpc2lvbl9pZCA8PSAweDExKSB8fAorCSAgICAobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05DUl81M0M4NjAgJiYKKwkgICAgIG5wLT5yZXZpc2lvbl9pZCA8PSAweDEpKQorCQlucC0+ZmVhdHVyZXMgJj0gfihGRV9XUklFfEZFX0VSTHxGRV9FUk1QKTsKKworCS8qCisJICogIFNlbGVjdCBhbGwgc3VwcG9ydGVkIHNwZWNpYWwgZmVhdHVyZXMuCisJICogIElmIHdlIGFyZSB1c2luZyBvbi1ib2FyZCBSQU0gZm9yIHNjcmlwdHMsIHByZWZldGNoIChQRkVOKSAKKwkgKiAgZG9lcyBub3QgaGVscCwgYnV0IGJ1cnN0IG9wIGZldGNoIChCT0YpIGRvZXMuCisJICogIERpc2FibGluZyBQRkVOIG1ha2VzIHN1cmUgQk9GIHdpbGwgYmUgdXNlZC4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRVJMKQorCQlucC0+cnZfZG1vZGUJfD0gRVJMOwkJLyogRW5hYmxlIFJlYWQgTGluZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9CT0YpCisJCW5wLT5ydl9kbW9kZQl8PSBCT0Y7CQkvKiBCdXJzdCBPcGNvZGUgRmV0Y2ggKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfRVJNUCkKKwkJbnAtPnJ2X2Rtb2RlCXw9IEVSTVA7CS8qIEVuYWJsZSBSZWFkIE11bHRpcGxlICovCisjaWYgMQorCWlmICgobnAtPmZlYXR1cmVzICYgRkVfUEZFTikgJiYgIW5wLT5yYW1fYmEpCisjZWxzZQorCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9QRkVOKQorI2VuZGlmCisJCW5wLT5ydl9kY250bAl8PSBQRkVOOwkvKiBQcmVmZXRjaCBFbmFibGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQ0xTRSkKKwkJbnAtPnJ2X2RjbnRsCXw9IENMU0U7CS8qIENhY2hlIExpbmUgU2l6ZSBFbmFibGUgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfV1JJRSkKKwkJbnAtPnJ2X2N0ZXN0Mwl8PSBXUklFOwkvKiBXcml0ZSBhbmQgSW52YWxpZGF0ZSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9ERlMpCisJCW5wLT5ydl9jdGVzdDUJfD0gREZTOwkJLyogRG1hIEZpZm8gU2l6ZSAqLworCisJLyoKKwkgKiAgU2VsZWN0IHNvbWUgb3RoZXIKKwkgKi8KKwlucC0+cnZfY3Rlc3Q0CXw9IE1QRUU7IC8qIE1hc3RlciBwYXJpdHkgY2hlY2tpbmcgKi8KKwlucC0+cnZfc2NudGwwCXw9IDB4MGE7IC8qICBmdWxsIGFyYi4sIGVuYSBwYXJpdHksIHBhci0+QVROICAqLworCisJLyoKKwkgKiAgR2V0IHBhcml0eSBjaGVja2luZywgaG9zdCBJRCBhbmQgdmVyYm9zZSBtb2RlIGZyb20gTlZSQU0KKwkgKi8KKwlucC0+bXlhZGRyID0gMjU1OworCXN5bV9udnJhbV9zZXR1cF9ob3N0KHNob3N0LCBucCwgbnZyYW0pOworCisJLyoKKwkgKiAgR2V0IFNDU0kgYWRkciBvZiBob3N0IGFkYXB0ZXIgKHNldCBieSBiaW9zPykuCisJICovCisJaWYgKG5wLT5teWFkZHIgPT0gMjU1KSB7CisJCW5wLT5teWFkZHIgPSBJTkIobnAsIG5jX3NjaWQpICYgMHgwNzsKKwkJaWYgKCFucC0+bXlhZGRyKQorCQkJbnAtPm15YWRkciA9IFNZTV9TRVRVUF9IT1NUX0lEOworCX0KKworCS8qCisJICogIFByZXBhcmUgaW5pdGlhbCBpbyByZWdpc3RlciBiaXRzIGZvciBidXJzdCBsZW5ndGgKKwkgKi8KKwlzeW1faW5pdF9idXJzdChucCwgYnVyc3RfbWF4KTsKKworCS8qCisJICogIFNldCBTQ1NJIEJVUyBtb2RlLgorCSAqICAtIExWRCBjYXBhYmxlIGNoaXBzICg4OTUvODk1QS84OTYvMTAxMCkgcmVwb3J0IHRoZSAKKwkgKiAgICBjdXJyZW50IEJVUyBtb2RlIHRocm91Z2ggdGhlIFNURVNUNCBJTyByZWdpc3Rlci4KKwkgKiAgLSBGb3IgcHJldmlvdXMgZ2VuZXJhdGlvbiBjaGlwcyAoODI1LzgyNUEvODc1KSwgCisJICogICAgdXNlciBoYXMgdG8gdGVsbCB1cyBob3cgdG8gY2hlY2sgYWdhaW5zdCBIVkQsIAorCSAqICAgIHNpbmNlIGEgMTAwJSBzYWZlIGFsZ29yaXRobSBpcyBub3QgcG9zc2libGUuCisJICovCisJbnAtPnNjc2lfbW9kZSA9IFNNT0RFX1NFOworCWlmIChucC0+ZmVhdHVyZXMgJiAoRkVfVUxUUkEyfEZFX1VMVFJBMykpCisJCW5wLT5zY3NpX21vZGUgPSAobnAtPnN2X3N0ZXN0NCAmIFNNT0RFKTsKKwllbHNlIGlmCShucC0+ZmVhdHVyZXMgJiBGRV9ESUZGKSB7CisJCWlmIChTWU1fU0VUVVBfU0NTSV9ESUZGID09IDEpIHsKKwkJCWlmIChucC0+c3Zfc2NudGwzKSB7CisJCQkJaWYgKG5wLT5zdl9zdGVzdDIgJiAweDIwKQorCQkJCQlucC0+c2NzaV9tb2RlID0gU01PREVfSFZEOworCQkJfQorCQkJZWxzZSBpZiAobnZyYW0tPnR5cGUgPT0gU1lNX1NZTUJJT1NfTlZSQU0pIHsKKwkJCQlpZiAoIShJTkIobnAsIG5jX2dwcmVnKSAmIDB4MDgpKQorCQkJCQlucC0+c2NzaV9tb2RlID0gU01PREVfSFZEOworCQkJfQorCQl9CisJCWVsc2UgaWYJKFNZTV9TRVRVUF9TQ1NJX0RJRkYgPT0gMikKKwkJCW5wLT5zY3NpX21vZGUgPSBTTU9ERV9IVkQ7CisJfQorCWlmIChucC0+c2NzaV9tb2RlID09IFNNT0RFX0hWRCkKKwkJbnAtPnJ2X3N0ZXN0MiB8PSAweDIwOworCisJLyoKKwkgKiAgU2V0IExFRCBzdXBwb3J0IGZyb20gU0NSSVBUUy4KKwkgKiAgSWdub3JlIHRoaXMgZmVhdHVyZSBmb3IgYm9hcmRzIGtub3duIHRvIHVzZSBhIAorCSAqICBzcGVjaWZpYyBHUElPIHdpcmluZyBhbmQgZm9yIHRoZSA4OTVBLCA4OTYgCisJICogIGFuZCAxMDEwIHRoYXQgZHJpdmUgdGhlIExFRCBkaXJlY3RseS4KKwkgKi8KKwlpZiAoKFNZTV9TRVRVUF9TQ1NJX0xFRCB8fCAKKwkgICAgIChudnJhbS0+dHlwZSA9PSBTWU1fU1lNQklPU19OVlJBTSB8fAorCSAgICAgIChudnJhbS0+dHlwZSA9PSBTWU1fVEVLUkFNX05WUkFNICYmCisJICAgICAgIG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OQ1JfNTNDODk1KSkpICYmCisJICAgICEobnAtPmZlYXR1cmVzICYgRkVfTEVEQykgJiYgIShucC0+c3ZfZ3BjbnRsICYgMHgwMSkpCisJCW5wLT5mZWF0dXJlcyB8PSBGRV9MRUQwOworCisJLyoKKwkgKiAgU2V0IGlycSBtb2RlLgorCSAqLworCXN3aXRjaChTWU1fU0VUVVBfSVJRX01PREUgJiAzKSB7CisJY2FzZSAyOgorCQlucC0+cnZfZGNudGwJfD0gSVJRTTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlucC0+cnZfZGNudGwJfD0gKG5wLT5zdl9kY250bCAmIElSUU0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqICBDb25maWd1cmUgdGFyZ2V0cyBhY2NvcmRpbmcgdG8gZHJpdmVyIHNldHVwLgorCSAqICBJZiBOVlJBTSBwcmVzZW50IGdldCB0YXJnZXRzIHNldHVwIGZyb20gTlZSQU0uCisJICovCisJZm9yIChpID0gMCA7IGkgPCBTWU1fQ09ORl9NQVhfVEFSR0VUIDsgaSsrKSB7CisJCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W2ldOworCisJCXRwLT51c3JmbGFncyB8PSAoU1lNX0RJU0NfRU5BQkxFRCB8IFNZTV9UQUdTX0VOQUJMRUQpOworCQl0cC0+dXNydGFncyA9IFNZTV9TRVRVUF9NQVhfVEFHOworCisJCXN5bV9udnJhbV9zZXR1cF90YXJnZXQobnAsIGksIG52cmFtKTsKKworCQlpZiAoIXRwLT51c3J0YWdzKQorCQkJdHAtPnVzcmZsYWdzICY9IH5TWU1fVEFHU19FTkFCTEVEOworCX0KKworCS8qCisJICogIExldCB1c2VyIGtub3cgYWJvdXQgdGhlIHNldHRpbmdzLgorCSAqLworCXByaW50ZigiJXM6ICVzLCBJRCAlZCwgRmFzdC0lZCwgJXMsICVzXG4iLCBzeW1fbmFtZShucCksCisJCXN5bV9udnJhbV90eXBlKG52cmFtKSwgbnAtPm15YWRkciwKKwkJKG5wLT5mZWF0dXJlcyAmIEZFX1VMVFJBMykgPyA4MCA6IAorCQkobnAtPmZlYXR1cmVzICYgRkVfVUxUUkEyKSA/IDQwIDogCisJCShucC0+ZmVhdHVyZXMgJiBGRV9VTFRSQSkgID8gMjAgOiAxMCwKKwkJc3ltX3Njc2lfYnVzX21vZGUobnAtPnNjc2lfbW9kZSksCisJCShucC0+cnZfc2NudGwwICYgMHhhKQk/ICJwYXJpdHkgY2hlY2tpbmciIDogIk5PIHBhcml0eSIpOworCS8qCisJICogIFRlbGwgaGltIG1vcmUgb24gZGVtYW5kLgorCSAqLworCWlmIChzeW1fdmVyYm9zZSkgeworCQlwcmludGYoIiVzOiAlcyBJUlEgbGluZSBkcml2ZXIlc1xuIiwKKwkJCXN5bV9uYW1lKG5wKSwKKwkJCW5wLT5ydl9kY250bCAmIElSUU0gPyAidG90ZW0gcG9sZSIgOiAib3BlbiBkcmFpbiIsCisJCQlucC0+cmFtX2JhID8gIiwgdXNpbmcgb24tY2hpcCBTUkFNIiA6ICIiKTsKKwkJcHJpbnRmKCIlczogdXNpbmcgJXMgZmlybXdhcmUuXG4iLCBzeW1fbmFtZShucCksIG5wLT5md19uYW1lKTsKKwkJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX05PUE0pCisJCQlwcmludGYoIiVzOiBoYW5kbGluZyBwaGFzZSBtaXNtYXRjaCBmcm9tIFNDUklQVFMuXG4iLCAKKwkJCSAgICAgICBzeW1fbmFtZShucCkpOworCX0KKwkvKgorCSAqICBBbmQgc3RpbGwgbW9yZS4KKwkgKi8KKwlpZiAoc3ltX3ZlcmJvc2UgPj0gMikgeworCQlwcmludGYgKCIlczogaW5pdGlhbCBTQ05UTDMvRE1PREUvRENOVEwvQ1RFU1QzLzQvNSA9ICIKKwkJCSIoaGV4KSAlMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMngvJTAyeFxuIiwKKwkJCXN5bV9uYW1lKG5wKSwgbnAtPnN2X3NjbnRsMywgbnAtPnN2X2Rtb2RlLCBucC0+c3ZfZGNudGwsCisJCQlucC0+c3ZfY3Rlc3QzLCBucC0+c3ZfY3Rlc3Q0LCBucC0+c3ZfY3Rlc3Q1KTsKKworCQlwcmludGYgKCIlczogZmluYWwgICBTQ05UTDMvRE1PREUvRENOVEwvQ1RFU1QzLzQvNSA9ICIKKwkJCSIoaGV4KSAlMDJ4LyUwMngvJTAyeC8lMDJ4LyUwMngvJTAyeFxuIiwKKwkJCXN5bV9uYW1lKG5wKSwgbnAtPnJ2X3NjbnRsMywgbnAtPnJ2X2Rtb2RlLCBucC0+cnZfZGNudGwsCisJCQlucC0+cnZfY3Rlc3QzLCBucC0+cnZfY3Rlc3Q0LCBucC0+cnZfY3Rlc3Q1KTsKKwl9CisJLyoKKwkgKiAgTGV0IHVzZXIgYmUgYXdhcmUgb2YgdGFyZ2V0cyB0aGF0IGhhdmUgc29tZSBkaXNhYmxlIGZsYWdzIHNldC4KKwkgKi8KKwlzeW1fcHJpbnRfdGFyZ2V0c19mbGFnKG5wLCBTWU1fU0NBTl9CT09UX0RJU0FCTEVELCAiU0NBTiBBVCBCT09UIik7CisJaWYgKHN5bV92ZXJib3NlKQorCQlzeW1fcHJpbnRfdGFyZ2V0c19mbGFnKG5wLCBTWU1fU0NBTl9MVU5TX0RJU0FCTEVELAorCQkJCSAgICAgICAiU0NBTiBGT1IgTFVOUyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgVGVzdCB0aGUgcGNpIGJ1cyBzbm9vcCBsb2dpYyA6LSgKKyAqCisgKiAgSGFzIHRvIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KKyNpZm5kZWYgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVECitzdGF0aWMgaW50IHN5bV9yZWd0ZXN0IChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJcmVnaXN0ZXIgdm9sYXRpbGUgdTMyIGRhdGE7CisJLyoKKwkgKiAgY2hpcCByZWdpc3RlcnMgbWF5IE5PVCBiZSBjYWNoZWQuCisJICogIHdyaXRlIDB4ZmZmZmZmZmYgdG8gYSByZWFkIG9ubHkgcmVnaXN0ZXIgYXJlYSwKKwkgKiAgYW5kIHRyeSB0byByZWFkIGl0IGJhY2suCisJICovCisJZGF0YSA9IDB4ZmZmZmZmZmY7CisJT1VUTChucCwgbmNfZHN0YXQsIGRhdGEpOworCWRhdGEgPSBJTkwobnAsIG5jX2RzdGF0KTsKKyNpZiAxCisJaWYgKGRhdGEgPT0gMHhmZmZmZmZmZikgeworI2Vsc2UKKwlpZiAoKGRhdGEgJiAweGUyZjBmZmZkKSAhPSAweDAyMDAwMDgwKSB7CisjZW5kaWYKKwkJcHJpbnRmICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IHJlZyBkc3RhdC1zc3RhdDIgcmVhZGJhY2sgJXguXG4iLAorCQkJKHVuc2lnbmVkKSBkYXRhKTsKKwkJcmV0dXJuICgweDEwKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHN5bV9zbm9vcHRlc3QgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1MzIJc3ltX3JkLCBzeW1fd3IsIHN5bV9iaywgaG9zdF9yZCwgaG9zdF93ciwgcGMsIGRzdGF0OworCWludAlpLCBlcnI9MDsKKyNpZm5kZWYgQ09ORklHX1NDU0lfU1lNNTNDOFhYX0lPTUFQUEVECisJZXJyIHw9IHN5bV9yZWd0ZXN0IChucCk7CisJaWYgKGVycikgcmV0dXJuIChlcnIpOworI2VuZGlmCityZXN0YXJ0X3Rlc3Q6CisJLyoKKwkgKiAgRW5hYmxlIE1hc3RlciBQYXJpdHkgQ2hlY2tpbmcgYXMgd2UgaW50ZW5kIAorCSAqICB0byBlbmFibGUgaXQgZm9yIG5vcm1hbCBvcGVyYXRpb25zLgorCSAqLworCU9VVEIobnAsIG5jX2N0ZXN0NCwgKG5wLT5ydl9jdGVzdDQgJiBNUEVFKSk7CisJLyoKKwkgKiAgaW5pdAorCSAqLworCXBjICA9IFNDUklQVFpfQkEobnAsIHNub29wdGVzdCk7CisJaG9zdF93ciA9IDE7CisJc3ltX3dyICA9IDI7CisJLyoKKwkgKiAgU2V0IG1lbW9yeSBhbmQgcmVnaXN0ZXIuCisJICovCisJbnAtPnNjcmF0Y2ggPSBjcHVfdG9fc2NyKGhvc3Rfd3IpOworCU9VVEwobnAsIG5jX3RlbXAsIHN5bV93cik7CisJLyoKKwkgKiAgU3RhcnQgc2NyaXB0IChleGNoYW5nZSB2YWx1ZXMpCisJICovCisJT1VUTChucCwgbmNfZHNhLCBucC0+aGNiX2JhKTsKKwlPVVRMX0RTUChucCwgcGMpOworCS8qCisJICogIFdhaXQgJ3RpbCBkb25lICh3aXRoIHRpbWVvdXQpCisJICovCisJZm9yIChpPTA7IGk8U1lNX1NOT09QX1RJTUVPVVQ7IGkrKykKKwkJaWYgKElOQihucCwgbmNfaXN0YXQpICYgKElOVEZ8U0lQfERJUCkpCisJCQlicmVhazsKKwlpZiAoaT49U1lNX1NOT09QX1RJTUVPVVQpIHsKKwkJcHJpbnRmICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IHRpbWVvdXQuXG4iKTsKKwkJcmV0dXJuICgweDIwKTsKKwl9CisJLyoKKwkgKiAgQ2hlY2sgZm9yIGZhdGFsIERNQSBlcnJvcnMuCisJICovCisJZHN0YXQgPSBJTkIobnAsIG5jX2RzdGF0KTsKKyNpZiAxCS8qIEJhbmQgYWlkaW5nIGZvciBicm9rZW4gaGFyZHdhcmVzIHRoYXQgZmFpbCBQQ0kgcGFyaXR5ICovCisJaWYgKChkc3RhdCAmIE1EUEUpICYmIChucC0+cnZfY3Rlc3Q0ICYgTVBFRSkpIHsKKwkJcHJpbnRmICgiJXM6IFBDSSBEQVRBIFBBUklUWSBFUlJPUiBERVRFQ1RFRCAtICIKKwkJCSJESVNBQkxJTkcgTUFTVEVSIERBVEEgUEFSSVRZIENIRUNLSU5HLlxuIiwKKwkJCXN5bV9uYW1lKG5wKSk7CisJCW5wLT5ydl9jdGVzdDQgJj0gfk1QRUU7CisJCWdvdG8gcmVzdGFydF90ZXN0OworCX0KKyNlbmRpZgorCWlmIChkc3RhdCAmIChNRFBFfEJGfElJRCkpIHsKKwkJcHJpbnRmICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IERNQSBlcnJvciAoZHN0YXQ9MHglMDJ4KS4iLCBkc3RhdCk7CisJCXJldHVybiAoMHg4MCk7CisJfQorCS8qCisJICogIFNhdmUgdGVybWluYXRpb24gcG9zaXRpb24uCisJICovCisJcGMgPSBJTkwobnAsIG5jX2RzcCk7CisJLyoKKwkgKiAgUmVhZCBtZW1vcnkgYW5kIHJlZ2lzdGVyLgorCSAqLworCWhvc3RfcmQgPSBzY3JfdG9fY3B1KG5wLT5zY3JhdGNoKTsKKwlzeW1fcmQgID0gSU5MKG5wLCBuY19zY3JhdGNoYSk7CisJc3ltX2JrICA9IElOTChucCwgbmNfdGVtcCk7CisJLyoKKwkgKiAgQ2hlY2sgdGVybWluYXRpb24gcG9zaXRpb24uCisJICovCisJaWYgKHBjICE9IFNDUklQVFpfQkEobnAsIHNub29wZW5kKSs4KSB7CisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBzY3JpcHQgZXhlY3V0aW9uIGZhaWxlZC5cbiIpOworCQlwcmludGYgKCJzdGFydD0lMDhseCwgcGM9JTA4bHgsIGVuZD0lMDhseFxuIiwgCisJCQkodV9sb25nKSBTQ1JJUFRaX0JBKG5wLCBzbm9vcHRlc3QpLCAodV9sb25nKSBwYywKKwkJCSh1X2xvbmcpIFNDUklQVFpfQkEobnAsIHNub29wZW5kKSArOCk7CisJCXJldHVybiAoMHg0MCk7CisJfQorCS8qCisJICogIFNob3cgcmVzdWx0cy4KKwkgKi8KKwlpZiAoaG9zdF93ciAhPSBzeW1fcmQpIHsKKwkJcHJpbnRmICgiQ0FDSEUgVEVTVCBGQUlMRUQ6IGhvc3Qgd3JvdGUgJWQsIGNoaXAgcmVhZCAlZC5cbiIsCisJCQkoaW50KSBob3N0X3dyLCAoaW50KSBzeW1fcmQpOworCQllcnIgfD0gMTsKKwl9CisJaWYgKGhvc3RfcmQgIT0gc3ltX3dyKSB7CisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBjaGlwIHdyb3RlICVkLCBob3N0IHJlYWQgJWQuXG4iLAorCQkJKGludCkgc3ltX3dyLCAoaW50KSBob3N0X3JkKTsKKwkJZXJyIHw9IDI7CisJfQorCWlmIChzeW1fYmsgIT0gc3ltX3dyKSB7CisJCXByaW50ZiAoIkNBQ0hFIFRFU1QgRkFJTEVEOiBjaGlwIHdyb3RlICVkLCByZWFkIGJhY2sgJWQuXG4iLAorCQkJKGludCkgc3ltX3dyLCAoaW50KSBzeW1fYmspOworCQllcnIgfD0gNDsKKwl9CisKKwlyZXR1cm4gKGVycik7Cit9CisKKy8qCisgKiAgbG9nIG1lc3NhZ2UgZm9yIHJlYWwgaGFyZCBlcnJvcnMKKyAqCisgKiAgc3ltMCB0YXJnIDA/OiBFUlJPUiAoZHM6c2kpIChzby1zaS1zZCkgKHN4L3MzL3M0KSBAIG5hbWUgKGRzcDpkYmMpLgorICogIAkgICAgICByZWc6IHIwIHIxIHIyIHIzIHI0IHI1IHI2IC4uLi4uIHJmLgorICoKKyAqICBleGNlcHRpb24gcmVnaXN0ZXI6CisgKiAgCWRzOglkc3RhdAorICogIAlzaToJc2lzdAorICoKKyAqICBTQ1NJIGJ1cyBsaW5lczoKKyAqICAJc286CWNvbnRyb2wgbGluZXMgYXMgZHJpdmVuIGJ5IGNoaXAuCisgKiAgCXNpOgljb250cm9sIGxpbmVzIGFzIHNlZW4gYnkgY2hpcC4KKyAqICAJc2Q6CXNjc2kgZGF0YSBsaW5lcyBhcyBzZWVuIGJ5IGNoaXAuCisgKgorICogIHdpZGUvZmFzdG1vZGU6CisgKiAgCXN4OglzeGZlciAgKHNlZSB0aGUgbWFudWFsKQorICogIAlzMzoJc2NudGwzIChzZWUgdGhlIG1hbnVhbCkKKyAqICAJczQ6CXNjbnRsNCAoc2VlIHRoZSBtYW51YWwpCisgKgorICogIGN1cnJlbnQgc2NyaXB0IGNvbW1hbmQ6CisgKiAgCWRzcDoJc2NyaXB0IGFkZHJlc3MgKHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHNjcmlwdCkuCisgKiAgCWRiYzoJZmlyc3Qgd29yZCBvZiBzY3JpcHQgY29tbWFuZC4KKyAqCisgKiAgRmlyc3QgMjQgcmVnaXN0ZXIgb2YgdGhlIGNoaXA6CisgKiAgCXIwLi5yZgorICovCitzdGF0aWMgdm9pZCBzeW1fbG9nX2hhcmRfZXJyb3Ioc3RydWN0IHN5bV9oY2IgKm5wLCB1X3Nob3J0IHNpc3QsIHVfY2hhciBkc3RhdCkKK3sKKwl1MzIJZHNwOworCWludAlzY3JpcHRfb2ZzOworCWludAlzY3JpcHRfc2l6ZTsKKwljaGFyCSpzY3JpcHRfbmFtZTsKKwl1X2NoYXIJKnNjcmlwdF9iYXNlOworCWludAlpOworCisJZHNwCT0gSU5MKG5wLCBuY19kc3ApOworCisJaWYJKGRzcCA+IG5wLT5zY3JpcHRhX2JhICYmCisJCSBkc3AgPD0gbnAtPnNjcmlwdGFfYmEgKyBucC0+c2NyaXB0YV9zeikgeworCQlzY3JpcHRfb2ZzCT0gZHNwIC0gbnAtPnNjcmlwdGFfYmE7CisJCXNjcmlwdF9zaXplCT0gbnAtPnNjcmlwdGFfc3o7CisJCXNjcmlwdF9iYXNlCT0gKHVfY2hhciAqKSBucC0+c2NyaXB0YTA7CisJCXNjcmlwdF9uYW1lCT0gInNjcmlwdGEiOworCX0KKwllbHNlIGlmIChucC0+c2NyaXB0Yl9iYSA8IGRzcCAmJiAKKwkJIGRzcCA8PSBucC0+c2NyaXB0Yl9iYSArIG5wLT5zY3JpcHRiX3N6KSB7CisJCXNjcmlwdF9vZnMJPSBkc3AgLSBucC0+c2NyaXB0Yl9iYTsKKwkJc2NyaXB0X3NpemUJPSBucC0+c2NyaXB0Yl9zejsKKwkJc2NyaXB0X2Jhc2UJPSAodV9jaGFyICopIG5wLT5zY3JpcHRiMDsKKwkJc2NyaXB0X25hbWUJPSAic2NyaXB0YiI7CisJfSBlbHNlIHsKKwkJc2NyaXB0X29mcwk9IGRzcDsKKwkJc2NyaXB0X3NpemUJPSAwOworCQlzY3JpcHRfYmFzZQk9IE5VTEw7CisJCXNjcmlwdF9uYW1lCT0gIm1lbSI7CisJfQorCisJcHJpbnRmICgiJXM6JWQ6IEVSUk9SICgleDoleCkgKCV4LSV4LSV4KSAoJXgvJXgvJXgpIEAgKCVzICV4OiUwOHgpLlxuIiwKKwkJc3ltX25hbWUobnApLCAodW5zaWduZWQpSU5CKG5wLCBuY19zZGlkKSYweDBmLCBkc3RhdCwgc2lzdCwKKwkJKHVuc2lnbmVkKUlOQihucCwgbmNfc29jbCksICh1bnNpZ25lZClJTkIobnAsIG5jX3NiY2wpLAorCQkodW5zaWduZWQpSU5CKG5wLCBuY19zYmRsKSwgKHVuc2lnbmVkKUlOQihucCwgbmNfc3hmZXIpLAorCQkodW5zaWduZWQpSU5CKG5wLCBuY19zY250bDMpLAorCQkobnAtPmZlYXR1cmVzICYgRkVfQzEwKSA/ICAodW5zaWduZWQpSU5CKG5wLCBuY19zY250bDQpIDogMCwKKwkJc2NyaXB0X25hbWUsIHNjcmlwdF9vZnMsICAgKHVuc2lnbmVkKUlOTChucCwgbmNfZGJjKSk7CisKKwlpZiAoKChzY3JpcHRfb2ZzICYgMykgPT0gMCkgJiYKKwkgICAgKHVuc2lnbmVkKXNjcmlwdF9vZnMgPCBzY3JpcHRfc2l6ZSkgeworCQlwcmludGYgKCIlczogc2NyaXB0IGNtZCA9ICUwOHhcbiIsIHN5bV9uYW1lKG5wKSwKKwkJCXNjcl90b19jcHUoKGludCkgKih1MzIgKikoc2NyaXB0X2Jhc2UgKyBzY3JpcHRfb2ZzKSkpOworCX0KKworICAgICAgICBwcmludGYgKCIlczogcmVnZHVtcDoiLCBzeW1fbmFtZShucCkpOworICAgICAgICBmb3IgKGk9MDsgaTwyNDtpKyspCisgICAgICAgICAgICBwcmludGYgKCIgJTAyeCIsICh1bnNpZ25lZClJTkJfT0ZGKG5wLCBpKSk7CisgICAgICAgIHByaW50ZiAoIi5cbiIpOworCisJLyoKKwkgKiAgUENJIEJVUyBlcnJvci4KKwkgKi8KKwlpZiAoZHN0YXQgJiAoTURQRXxCRikpCisJCXN5bV9sb2dfYnVzX2Vycm9yKG5wKTsKK30KKworc3RhdGljIHN0cnVjdCBzeW1fY2hpcCBzeW1fZGV2X3RhYmxlW10gPSB7Cisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzgxMCwgMHgwZiwgIjgxMCIsIDQsIDgsIDQsIDY0LAorIEZFX0VSTH0KKyAsCisjaWZkZWYgU1lNX0RFQlVHX0dFTkVSSUNfU1VQUE9SVAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4MTAsIDB4ZmYsICI4MTBhIiwgNCwgIDgsIDQsIDEsCisgRkVfQk9GfQorICwKKyNlbHNlCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzgxMCwgMHhmZiwgIjgxMGEiLCA0LCAgOCwgNCwgMSwKKyBGRV9DQUNIRV9TRVR8RkVfTERTVFJ8RkVfUEZFTnxGRV9CT0Z9CisgLAorI2VuZGlmCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzgxNSwgMHhmZiwgIjgxNSIsIDQsICA4LCA0LCA2NCwKKyBGRV9CT0Z8RkVfRVJMfQorICwKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODI1LCAweDBmLCAiODI1IiwgNiwgIDgsIDQsIDY0LAorIEZFX1dJREV8RkVfQk9GfEZFX0VSTHxGRV9ESUZGfQorICwKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODI1LCAweGZmLCAiODI1YSIsIDYsICA4LCA0LCAyLAorIEZFX1dJREV8RkVfQ0FDSEUwX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58RkVfUkFNfEZFX0RJRkZ9CisgLAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4NjAsIDB4ZmYsICI4NjAiLCA0LCAgOCwgNSwgMSwKKyBGRV9VTFRSQXxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0xEU1RSfEZFX1BGRU59CisgLAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4NzUsIDB4MDEsICI4NzUiLCA2LCAxNiwgNSwgMiwKKyBGRV9XSURFfEZFX1VMVFJBfEZFX0NBQ0hFMF9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9ESUZGfEZFX1ZBUkNMS30KKyAsCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NSwgMHhmZiwgIjg3NSIsIDYsIDE2LCA1LCAyLAorIEZFX1dJREV8RkVfVUxUUkF8RkVfREJMUnxGRV9DQUNIRTBfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfRElGRnxGRV9WQVJDTEt9CisgLAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4NzVKLCAweGZmLCAiODc1SiIsIDYsIDE2LCA1LCAyLAorIEZFX1dJREV8RkVfVUxUUkF8RkVfREJMUnxGRV9DQUNIRTBfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfRElGRnxGRV9WQVJDTEt9CisgLAorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4ODUsIDB4ZmYsICI4ODUiLCA2LCAxNiwgNSwgMiwKKyBGRV9XSURFfEZFX1VMVFJBfEZFX0RCTFJ8RkVfQ0FDSEUwX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX0RJRkZ8RkVfVkFSQ0xLfQorICwKKyNpZmRlZiBTWU1fREVCVUdfR0VORVJJQ19TVVBQT1JUCisge1BDSV9ERVZJQ0VfSURfTkNSXzUzQzg5NSwgMHhmZiwgIjg5NSIsIDYsIDMxLCA3LCAyLAorIEZFX1dJREV8RkVfVUxUUkEyfEZFX1FVQUR8RkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9ERlN8CisgRkVfUkFNfEZFX0xDS0ZSUX0KKyAsCisjZWxzZQorIHtQQ0lfREVWSUNFX0lEX05DUl81M0M4OTUsIDB4ZmYsICI4OTUiLCA2LCAzMSwgNywgMiwKKyBGRV9XSURFfEZFX1VMVFJBMnxGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX0xDS0ZSUX0KKyAsCisjZW5kaWYKKyB7UENJX0RFVklDRV9JRF9OQ1JfNTNDODk2LCAweGZmLCAiODk2IiwgNiwgMzEsIDcsIDQsCisgRkVfV0lERXxGRV9VTFRSQTJ8RkVfUVVBRHxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9SQU04S3xGRV82NEJJVHxGRV9EQUN8RkVfSU8yNTZ8RkVfTk9QTXxGRV9MRURDfEZFX0xDS0ZSUX0KKyAsCisge1BDSV9ERVZJQ0VfSURfTFNJXzUzQzg5NUEsIDB4ZmYsICI4OTVhIiwgNiwgMzEsIDcsIDQsCisgRkVfV0lERXxGRV9VTFRSQTJ8RkVfUVVBRHxGRV9DQUNIRV9TRVR8RkVfQk9GfEZFX0RGU3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9SQU04S3xGRV9EQUN8RkVfSU8yNTZ8RkVfTk9QTXxGRV9MRURDfEZFX0xDS0ZSUX0KKyAsCisge1BDSV9ERVZJQ0VfSURfTFNJXzUzQzg3NUEsIDB4ZmYsICI4NzVhIiwgNiwgMzEsIDcsIDQsCisgRkVfV0lERXxGRV9VTFRSQXxGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZTfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX0RBQ3xGRV9JTzI1NnxGRV9OT1BNfEZFX0xFREN8RkVfTENLRlJRfQorICwKKyB7UENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF8zMywgMHgwMCwgIjEwMTAtMzMiLCA2LCAzMSwgNywgOCwKKyBGRV9XSURFfEZFX1VMVFJBM3xGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZCQ3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9SQU04S3xGRV82NEJJVHxGRV9EQUN8RkVfSU8yNTZ8RkVfTk9QTXxGRV9MRURDfEZFX0NSQ3wKKyBGRV9DMTB9CisgLAorIHtQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzMzLCAweGZmLCAiMTAxMC0zMyIsIDYsIDMxLCA3LCA4LAorIEZFX1dJREV8RkVfVUxUUkEzfEZFX1FVQUR8RkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9ERkJDfEZFX0xEU1RSfEZFX1BGRU58CisgRkVfUkFNfEZFX1JBTThLfEZFXzY0QklUfEZFX0RBQ3xGRV9JTzI1NnxGRV9OT1BNfEZFX0xFREN8RkVfQ1JDfAorIEZFX0MxMHxGRV9VM0VOfQorICwKKyB7UENJX0RFVklDRV9JRF9MU0lfNTNDMTAxMF82NiwgMHhmZiwgIjEwMTAtNjYiLCA2LCAzMSwgNywgOCwKKyBGRV9XSURFfEZFX1VMVFJBM3xGRV9RVUFEfEZFX0NBQ0hFX1NFVHxGRV9CT0Z8RkVfREZCQ3xGRV9MRFNUUnxGRV9QRkVOfAorIEZFX1JBTXxGRV9SQU04S3xGRV82NEJJVHxGRV9EQUN8RkVfSU8yNTZ8RkVfTk9QTXxGRV9MRURDfEZFXzY2TUhafEZFX0NSQ3wKKyBGRV9DMTB8RkVfVTNFTn0KKyAsCisge1BDSV9ERVZJQ0VfSURfTFNJXzUzQzE1MTAsIDB4ZmYsICIxNTEwZCIsIDYsIDMxLCA3LCA0LAorIEZFX1dJREV8RkVfVUxUUkEyfEZFX1FVQUR8RkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnwKKyBGRV9SQU18RkVfSU8yNTZ8RkVfTEVEQ30KK307CisKKyNkZWZpbmUgc3ltX251bV9kZXZzIFwKKwkoc2l6ZW9mKHN5bV9kZXZfdGFibGUpIC8gc2l6ZW9mKHN5bV9kZXZfdGFibGVbMF0pKQorCisvKgorICogIExvb2sgdXAgdGhlIGNoaXAgdGFibGUuCisgKgorICogIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNoaXAgZW50cnkgaWYgZm91bmQsIAorICogIHplcm8gb3RoZXJ3aXNlLgorICovCitzdHJ1Y3Qgc3ltX2NoaXAgKgorc3ltX2xvb2t1cF9jaGlwX3RhYmxlICh1X3Nob3J0IGRldmljZV9pZCwgdV9jaGFyIHJldmlzaW9uKQoreworCXN0cnVjdAlzeW1fY2hpcCAqY2hpcDsKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBzeW1fbnVtX2RldnM7IGkrKykgeworCQljaGlwID0gJnN5bV9kZXZfdGFibGVbaV07CisJCWlmIChkZXZpY2VfaWQgIT0gY2hpcC0+ZGV2aWNlX2lkKQorCQkJY29udGludWU7CisJCWlmIChyZXZpc2lvbiA+IGNoaXAtPnJldmlzaW9uX2lkKQorCQkJY29udGludWU7CisJCXJldHVybiBjaGlwOworCX0KKworCXJldHVybiBOVUxMOworfQorCisjaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisvKgorICogIExvb2t1cCB0aGUgNjQgYml0IERNQSBzZWdtZW50cyBtYXAuCisgKiAgVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGRpcmVjdCBtYXBwaW5nIAorICogIGhhcyBiZWVuIHVuc3VjY2Vzc2Z1bC4KKyAqLworaW50IHN5bV9sb29rdXBfZG1hcChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHUzMiBoLCBpbnQgcykKK3sKKwlpbnQgaTsKKworCWlmICghbnAtPnVzZV9kYWMpCisJCWdvdG8gd2VpcmQ7CisKKwkvKiBMb29rIHVwIGV4aXN0aW5nIG1hcHBpbmdzICovCisJZm9yIChpID0gU1lNX0RNQVBfU0laRS0xOyBpID4gMDsgaS0tKSB7CisJCWlmIChoID09IG5wLT5kbWFwX2JhaFtpXSkKKwkJCXJldHVybiBpOworCX0KKwkvKiBJZiBkaXJlY3QgbWFwcGluZyBpcyBmcmVlLCBnZXQgaXQgKi8KKwlpZiAoIW5wLT5kbWFwX2JhaFtzXSkKKwkJZ290byBuZXc7CisJLyogQ29sbGlzaW9uIC0+IGxvb2t1cCBmcmVlIG1hcHBpbmdzICovCisJZm9yIChzID0gU1lNX0RNQVBfU0laRS0xOyBzID4gMDsgcy0tKSB7CisJCWlmICghbnAtPmRtYXBfYmFoW3NdKQorCQkJZ290byBuZXc7CisJfQord2VpcmQ6CisJcGFuaWMoInN5bTogcmFuIG91dCBvZiA2NCBiaXQgRE1BIHNlZ21lbnQgcmVnaXN0ZXJzIik7CisJcmV0dXJuIC0xOworbmV3OgorCW5wLT5kbWFwX2JhaFtzXSA9IGg7CisJbnAtPmRtYXBfZGlydHkgPSAxOworCXJldHVybiBzOworfQorCisvKgorICogIFVwZGF0ZSBJTyByZWdpc3RlcnMgc2NyYXRjaCBDLi5SIHNvIHRoZXkgd2lsbCBiZSAKKyAqICBpbiBzeW5jLiB3aXRoIHF1ZXVlZCBDQ0IgZXhwZWN0YXRpb25zLgorICovCitzdGF0aWMgdm9pZCBzeW1fdXBkYXRlX2RtYXBfcmVncyhzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJaW50IG8sIGk7CisKKwlpZiAoIW5wLT5kbWFwX2RpcnR5KQorCQlyZXR1cm47CisJbyA9IG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCBuY19zY3J4WzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1lNX0RNQVBfU0laRTsgaSsrKSB7CisJCU9VVExfT0ZGKG5wLCBvLCBucC0+ZG1hcF9iYWhbaV0pOworCQlvICs9IDQ7CisJfQorCW5wLT5kbWFwX2RpcnR5ID0gMDsKK30KKyNlbmRpZgorCisvKiBFbmZvcmNlIGFsbCB0aGUgZmlkZGx5IFNQSSBydWxlcyBhbmQgdGhlIGNoaXAgbGltaXRhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHN5bV9jaGVja19nb2FscyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwKKwkJc3RydWN0IHN5bV90cmFucyAqZ29hbCkKK3sKKwlpZiAoIXNwaV9zdXBwb3J0X3dpZGUoc3RhcmdldCkpCisJCWdvYWwtPndpZHRoID0gMDsKKworCWlmICghc3BpX3N1cHBvcnRfc3luYyhzdGFyZ2V0KSkgeworCQlnb2FsLT5pdSA9IDA7CisJCWdvYWwtPmR0ID0gMDsKKwkJZ29hbC0+cWFzID0gMDsKKwkJZ29hbC0+cGVyaW9kID0gMDsKKwkJZ29hbC0+b2Zmc2V0ID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGlfc3VwcG9ydF9kdChzdGFyZ2V0KSkgeworCQlpZiAoc3BpX3N1cHBvcnRfZHRfb25seShzdGFyZ2V0KSkKKwkJCWdvYWwtPmR0ID0gMTsKKworCQlpZiAoZ29hbC0+b2Zmc2V0ID09IDApCisJCQlnb2FsLT5kdCA9IDA7CisJfSBlbHNlIHsKKwkJZ29hbC0+ZHQgPSAwOworCX0KKworCS8qIFNvbWUgdGFyZ2V0cyBmYWlsIHRvIHByb3Blcmx5IG5lZ290aWF0ZSBEVCBpbiBTRSBtb2RlICovCisJaWYgKChucC0+c2NzaV9tb2RlICE9IFNNT0RFX0xWRCkgfHwgIShucC0+ZmVhdHVyZXMgJiBGRV9VM0VOKSkKKwkJZ29hbC0+ZHQgPSAwOworCisJaWYgKGdvYWwtPmR0KSB7CisJCS8qIGFsbCBEVCB0cmFuc2ZlcnMgbXVzdCBiZSB3aWRlICovCisJCWdvYWwtPndpZHRoID0gMTsKKwkJaWYgKGdvYWwtPm9mZnNldCA+IG5wLT5tYXhvZmZzX2R0KQorCQkJZ29hbC0+b2Zmc2V0ID0gbnAtPm1heG9mZnNfZHQ7CisJCWlmIChnb2FsLT5wZXJpb2QgPCBucC0+bWluc3luY19kdCkKKwkJCWdvYWwtPnBlcmlvZCA9IG5wLT5taW5zeW5jX2R0OworCQlpZiAoZ29hbC0+cGVyaW9kID4gbnAtPm1heHN5bmNfZHQpCisJCQlnb2FsLT5wZXJpb2QgPSBucC0+bWF4c3luY19kdDsKKwl9IGVsc2UgeworCQlnb2FsLT5pdSA9IGdvYWwtPnFhcyA9IDA7CisJCWlmIChnb2FsLT5vZmZzZXQgPiBucC0+bWF4b2ZmcykKKwkJCWdvYWwtPm9mZnNldCA9IG5wLT5tYXhvZmZzOworCQlpZiAoZ29hbC0+cGVyaW9kIDwgbnAtPm1pbnN5bmMpCisJCQlnb2FsLT5wZXJpb2QgPSBucC0+bWluc3luYzsKKwkJaWYgKGdvYWwtPnBlcmlvZCA+IG5wLT5tYXhzeW5jKQorCQkJZ29hbC0+cGVyaW9kID0gbnAtPm1heHN5bmM7CisJfQorfQorCisvKgorICogIFByZXBhcmUgdGhlIG5leHQgbmVnb3RpYXRpb24gbWVzc2FnZSBpZiBuZWVkZWQuCisgKgorICogIEZpbGwgaW4gdGhlIHBhcnQgb2YgbWVzc2FnZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgCisgKiAgbmVnb3RpYXRpb24gYW5kIHRoZSBuZWdvX3N0YXR1cyBmaWVsZCBvZiB0aGUgQ0NCLgorICogIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaW4gYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3ByZXBhcmVfbmVnbyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCwgdV9jaGFyICptc2dwdHIpCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbY3AtPnRhcmdldF07CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHAtPnNkZXYtPnNkZXZfdGFyZ2V0OworCXN0cnVjdCBzeW1fdHJhbnMgKmdvYWwgPSAmdHAtPnRnb2FsOworCWludCBtc2dsZW4gPSAwOworCWludCBuZWdvOworCisJc3ltX2NoZWNrX2dvYWxzKG5wLCBzdGFyZ2V0LCBnb2FsKTsKKworCS8qCisJICogTWFueSBkZXZpY2VzIGltcGxlbWVudCBQUFIgaW4gYSBidWdneSB3YXksIHNvIG9ubHkgdXNlIGl0IGlmIHdlCisJICogcmVhbGx5IHdhbnQgdG8uCisJICovCisJaWYgKGdvYWwtPml1IHx8IGdvYWwtPmR0IHx8IGdvYWwtPnFhcyB8fCAoZ29hbC0+cGVyaW9kIDwgMHhhKSkgeworCQluZWdvID0gTlNfUFBSOworCX0gZWxzZSBpZiAoc3BpX3dpZHRoKHN0YXJnZXQpICE9IGdvYWwtPndpZHRoKSB7CisJCW5lZ28gPSBOU19XSURFOworCX0gZWxzZSBpZiAoc3BpX3BlcmlvZChzdGFyZ2V0KSAhPSBnb2FsLT5wZXJpb2QgfHwKKwkJICAgc3BpX29mZnNldChzdGFyZ2V0KSAhPSBnb2FsLT5vZmZzZXQpIHsKKwkJbmVnbyA9IE5TX1NZTkM7CisJfSBlbHNlIHsKKwkJZ29hbC0+Y2hlY2tfbmVnbyA9IDA7CisJCW5lZ28gPSAwOworCX0KKworCXN3aXRjaCAobmVnbykgeworCWNhc2UgTlNfU1lOQzoKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fRVhURU5ERUQ7CisJCW1zZ3B0clttc2dsZW4rK10gPSAzOworCQltc2dwdHJbbXNnbGVuKytdID0gTV9YX1NZTkNfUkVROworCQltc2dwdHJbbXNnbGVuKytdID0gZ29hbC0+cGVyaW9kOworCQltc2dwdHJbbXNnbGVuKytdID0gZ29hbC0+b2Zmc2V0OworCQlicmVhazsKKwljYXNlIE5TX1dJREU6CisJCW1zZ3B0clttc2dsZW4rK10gPSBNX0VYVEVOREVEOworCQltc2dwdHJbbXNnbGVuKytdID0gMjsKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fWF9XSURFX1JFUTsKKwkJbXNncHRyW21zZ2xlbisrXSA9IGdvYWwtPndpZHRoOworCQlicmVhazsKKwljYXNlIE5TX1BQUjoKKwkJbXNncHRyW21zZ2xlbisrXSA9IE1fRVhURU5ERUQ7CisJCW1zZ3B0clttc2dsZW4rK10gPSA2OworCQltc2dwdHJbbXNnbGVuKytdID0gTV9YX1BQUl9SRVE7CisJCW1zZ3B0clttc2dsZW4rK10gPSBnb2FsLT5wZXJpb2Q7CisJCW1zZ3B0clttc2dsZW4rK10gPSAwOworCQltc2dwdHJbbXNnbGVuKytdID0gZ29hbC0+b2Zmc2V0OworCQltc2dwdHJbbXNnbGVuKytdID0gZ29hbC0+d2lkdGg7CisJCW1zZ3B0clttc2dsZW4rK10gPSAoZ29hbC0+aXUgPyBQUFJfT1BUX0lVIDogMCkgfAorCQkJCQkoZ29hbC0+ZHQgPyBQUFJfT1BUX0RUIDogMCkgfAorCQkJCQkoZ29hbC0+cWFzID8gUFBSX09QVF9RQVMgOiAwKTsKKwkJYnJlYWs7CisJfQorCisJY3AtPm5lZ29fc3RhdHVzID0gbmVnbzsKKworCWlmIChuZWdvKSB7CisJCXRwLT5uZWdvX2NwID0gY3A7IC8qIEtlZXAgdHJhY2sgYSBuZWdvIHdpbGwgYmUgcGVyZm9ybWVkICovCisJCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJCXN5bV9wcmludF9uZWdvX21zZyhucCwgY3AtPnRhcmdldCwgCisJCQkJCSAgbmVnbyA9PSBOU19TWU5DID8gInN5bmMgbXNnb3V0IiA6CisJCQkJCSAgbmVnbyA9PSBOU19XSURFID8gIndpZGUgbXNnb3V0IiA6CisJCQkJCSAgInBwciBtc2dvdXQiLCBtc2dwdHIpOworCQl9CisJfQorCisJcmV0dXJuIG1zZ2xlbjsKK30KKworLyoKKyAqICBJbnNlcnQgYSBqb2IgaW50byB0aGUgc3RhcnQgcXVldWUuCisgKi8KK3ZvaWQgc3ltX3B1dF9zdGFydF9xdWV1ZShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwl1X3Nob3J0CXFpZHg7CisKKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwkvKgorCSAqICBJZiB0aGUgcHJldmlvdXNseSBxdWV1ZWQgQ0NCIGlzIG5vdCB5ZXQgZG9uZSwgCisJICogIHNldCB0aGUgSUFSQiBoaW50LiBUaGUgU0NSSVBUUyB3aWxsIGdvIHdpdGggSUFSQiAKKwkgKiAgZm9yIHRoaXMgam9iIHdoZW4gc3RhcnRpbmcgdGhlIHByZXZpb3VzIG9uZS4KKwkgKiAgV2UgbGVhdmUgZGV2aWNlcyBhIGNoYW5jZSB0byB3aW4gYXJiaXRyYXRpb24gYnkgCisJICogIG5vdCB1c2luZyBtb3JlIHRoYW4gJ2lhcmJfbWF4JyBjb25zZWN1dGl2ZSAKKwkgKiAgaW1tZWRpYXRlIGFyYml0cmF0aW9ucy4KKwkgKi8KKwlpZiAobnAtPmxhc3RfY3AgJiYgbnAtPmlhcmJfY291bnQgPCBucC0+aWFyYl9tYXgpIHsKKwkJbnAtPmxhc3RfY3AtPmhvc3RfZmxhZ3MgfD0gSEZfSElOVF9JQVJCOworCQkrK25wLT5pYXJiX2NvdW50OworCX0KKwllbHNlCisJCW5wLT5pYXJiX2NvdW50ID0gMDsKKwlucC0+bGFzdF9jcCA9IGNwOworI2VuZGlmCisKKyNpZiAgIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorCS8qCisJICogIE1ha2UgU0NSSVBUUyBhd2FyZSBvZiB0aGUgNjQgYml0IERNQSAKKwkgKiAgc2VnbWVudCByZWdpc3RlcnMgbm90IGJlaW5nIHVwLXRvLWRhdGUuCisJICovCisJaWYgKG5wLT5kbWFwX2RpcnR5KQorCQljcC0+aG9zdF94ZmxhZ3MgfD0gSFhfRE1BUF9ESVJUWTsKKyNlbmRpZgorCisJLyoKKwkgKiAgSW5zZXJ0IGZpcnN0IHRoZSBpZGxlIHRhc2sgYW5kIHRoZW4gb3VyIGpvYi4KKwkgKiAgVGhlIE1CcyBzaG91bGQgZW5zdXJlIHByb3BlciBvcmRlcmluZy4KKwkgKi8KKwlxaWR4ID0gbnAtPnNxdWV1ZXB1dCArIDI7CisJaWYgKHFpZHggPj0gTUFYX1FVRVVFKjIpIHFpZHggPSAwOworCisJbnAtPnNxdWV1ZSBbcWlkeF0JICAgPSBjcHVfdG9fc2NyKG5wLT5pZGxldGFza19iYSk7CisJTUVNT1JZX1dSSVRFX0JBUlJJRVIoKTsKKwlucC0+c3F1ZXVlIFtucC0+c3F1ZXVlcHV0XSA9IGNwdV90b19zY3IoY3AtPmNjYl9iYSk7CisKKwlucC0+c3F1ZXVlcHV0ID0gcWlkeDsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1FVRVVFKQorCQlwcmludGYgKCIlczogcXVldWVwb3M9JWQuXG4iLCBzeW1fbmFtZSAobnApLCBucC0+c3F1ZXVlcHV0KTsKKworCS8qCisJICogIFNjcmlwdCBwcm9jZXNzb3IgbWF5IGJlIHdhaXRpbmcgZm9yIHJlc2VsZWN0LgorCSAqICBXYWtlIGl0IHVwLgorCSAqLworCU1FTU9SWV9XUklURV9CQVJSSUVSKCk7CisJT1VUQihucCwgbmNfaXN0YXQsIFNJR1B8bnAtPmlzdGF0X3NlbSk7Cit9CisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKy8qCisgKiAgU3RhcnQgbmV4dCByZWFkeS10by1zdGFydCBDQ0JzLgorICovCit2b2lkIHN5bV9zdGFydF9uZXh0X2NjYnMoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2xjYiAqbHAsIGludCBtYXhuKQoreworCVNZTV9RVUVIRUFEICpxcDsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisKKwkvKiAKKwkgKiAgUGFyYW5vaWEsIGFzIHVzdWFsLiA6LSkKKwkgKi8KKwlhc3NlcnQoIWxwLT5zdGFydGVkX3RhZ3MgfHwgIWxwLT5zdGFydGVkX25vX3RhZyk7CisKKwkvKgorCSAqICBUcnkgdG8gc3RhcnQgYXMgbWFueSBjb21tYW5kcyBhcyBhc2tlZCBieSBjYWxsZXIuCisJICogIFByZXZlbnQgZnJvbSBoYXZpbmcgYm90aCB0YWdnZWQgYW5kIHVudGFnZ2VkIAorCSAqICBjb21tYW5kcyBxdWV1ZWQgdG8gdGhlIGRldmljZSBhdCB0aGUgc2FtZSB0aW1lLgorCSAqLworCXdoaWxlIChtYXhuLS0pIHsKKwkJcXAgPSBzeW1fcmVtcXVlX2hlYWQoJmxwLT53YWl0aW5nX2NjYnEpOworCQlpZiAoIXFwKQorCQkJYnJlYWs7CisJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmsyX2NjYnEpOworCQlpZiAoY3AtPnRhZyAhPSBOT19UQUcpIHsKKwkJCWlmIChscC0+c3RhcnRlZF9ub190YWcgfHwKKwkJCSAgICBscC0+c3RhcnRlZF90YWdzID49IGxwLT5zdGFydGVkX21heCkgeworCQkJCXN5bV9pbnNxdWVfaGVhZChxcCwgJmxwLT53YWl0aW5nX2NjYnEpOworCQkJCWJyZWFrOworCQkJfQorCQkJbHAtPml0bHFfdGJsW2NwLT50YWddID0gY3B1X3RvX3NjcihjcC0+Y2NiX2JhKTsKKwkJCWxwLT5oZWFkLnJlc2VsX3NhID0KKwkJCQljcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIHJlc2VsX3RhZykpOworCQkJKytscC0+c3RhcnRlZF90YWdzOworCQl9IGVsc2UgeworCQkJaWYgKGxwLT5zdGFydGVkX25vX3RhZyB8fCBscC0+c3RhcnRlZF90YWdzKSB7CisJCQkJc3ltX2luc3F1ZV9oZWFkKHFwLCAmbHAtPndhaXRpbmdfY2NicSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlscC0+aGVhZC5pdGxfdGFza19zYSA9IGNwdV90b19zY3IoY3AtPmNjYl9iYSk7CisJCQlscC0+aGVhZC5yZXNlbF9zYSA9CisJCQkgICAgICBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIHJlc2VsX25vX3RhZykpOworCQkJKytscC0+c3RhcnRlZF9ub190YWc7CisJCX0KKwkJY3AtPnN0YXJ0ZWQgPSAxOworCQlzeW1faW5zcXVlX3RhaWwocXAsICZscC0+c3RhcnRlZF9jY2JxKTsKKwkJc3ltX3B1dF9zdGFydF9xdWV1ZShucCwgY3ApOworCX0KK30KKyNlbmRpZiAvKiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcgKi8KKworLyoKKyAqICBUaGUgY2hpcCBtYXkgaGF2ZSBjb21wbGV0ZWQgam9icy4gTG9vayBhdCB0aGUgRE9ORSBRVUVVRS4KKyAqCisgKiAgT24gcGFwZXIsIG1lbW9yeSByZWFkIGJhcnJpZXJzIG1heSBiZSBuZWVkZWQgaGVyZSB0byAKKyAqICBwcmV2ZW50IG91dCBvZiBvcmRlciBMT0FEcyBieSB0aGUgQ1BVIGZyb20gaGF2aW5nIAorICogIHByZWZldGNoZWQgc3RhbGUgZGF0YSBwcmlvciB0byBETUEgaGF2aW5nIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHN5bV93YWtldXBfZG9uZSAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXN0cnVjdCBzeW1fY2NiICpjcDsKKwlpbnQgaSwgbjsKKwl1MzIgZHNhOworCisJbiA9IDA7CisJaSA9IG5wLT5kcXVldWVnZXQ7CisKKwkvKiBNRU1PUllfUkVBRF9CQVJSSUVSKCk7ICovCisJd2hpbGUgKDEpIHsKKwkJZHNhID0gc2NyX3RvX2NwdShucC0+ZHF1ZXVlW2ldKTsKKwkJaWYgKCFkc2EpCisJCQlicmVhazsKKwkJbnAtPmRxdWV1ZVtpXSA9IDA7CisJCWlmICgoaSA9IGkrMikgPj0gTUFYX1FVRVVFKjIpCisJCQlpID0gMDsKKworCQljcCA9IHN5bV9jY2JfZnJvbV9kc2EobnAsIGRzYSk7CisJCWlmIChjcCkgeworCQkJTUVNT1JZX1JFQURfQkFSUklFUigpOworCQkJc3ltX2NvbXBsZXRlX29rIChucCwgY3ApOworCQkJKytuOworCQl9CisJCWVsc2UKKwkJCXByaW50ZiAoIiVzOiBiYWQgRFNBICgleCkgaW4gZG9uZSBxdWV1ZS5cbiIsCisJCQkJc3ltX25hbWUobnApLCAodV9pbnQpIGRzYSk7CisJfQorCW5wLT5kcXVldWVnZXQgPSBpOworCisJcmV0dXJuIG47Cit9CisKKy8qCisgKiAgQ29tcGxldGUgYWxsIENDQnMgcXVldWVkIHRvIHRoZSBDT01QIHF1ZXVlLgorICoKKyAqICBUaGVzZSBDQ0JzIGFyZSBhc3N1bWVkOgorICogIC0gTm90IHRvIGJlIHJlZmVyZW5jZWQgZWl0aGVyIGJ5IGRldmljZXMgb3IgCisgKiAgICBTQ1JJUFRTLXJlbGF0ZWQgcXVldWVzIGFuZCBkYXRhcy4KKyAqICAtIFRvIGhhdmUgdG8gYmUgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgY29uZGl0aW9uIAorICogICAgb3IgcmVxdWV1ZWQuCisgKgorICogIFRoZSBkZXZpY2UgcXVldWUgZnJlZXplIGNvdW50IGlzIGluY3JlbWVudGVkIAorICogIGZvciBlYWNoIENDQiB0aGF0IGRvZXMgbm90IHByZXZlbnQgdGhpcy4KKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFsbCBDQ0JzIGludm9sdmVkIAorICogIGluIGVycm9yIGhhbmRsaW5nL3JlY292ZXJ5IGhhdmUgYmVlbiByZWFwZWQuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9mbHVzaF9jb21wX3F1ZXVlKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGNhbV9zdGF0dXMpCit7CisJU1lNX1FVRUhFQUQgKnFwOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKworCXdoaWxlICgocXAgPSBzeW1fcmVtcXVlX2hlYWQoJm5wLT5jb21wX2NjYnEpKSAhPSAwKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwkJY3AgPSBzeW1fcXVlX2VudHJ5KHFwLCBzdHJ1Y3Qgc3ltX2NjYiwgbGlua19jY2JxKTsKKwkJc3ltX2luc3F1ZV90YWlsKCZjcC0+bGlua19jY2JxLCAmbnAtPmJ1c3lfY2NicSk7CisJCS8qIExlYXZlIHF1aWV0IENDQnMgd2FpdGluZyBmb3IgcmVzb3VyY2VzICovCisJCWlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfV0FJVCkKKwkJCWNvbnRpbnVlOworCQljbWQgPSBjcC0+Y21kOworCQlpZiAoY2FtX3N0YXR1cykKKwkJCXN5bV9zZXRfY2FtX3N0YXR1cyhjbWQsIGNhbV9zdGF0dXMpOworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCQlpZiAoc3ltX2dldF9jYW1fc3RhdHVzKGNtZCkgPT0gQ0FNX1JFUVVFVUVfUkVRKSB7CisJCQlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwkJCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgY3AtPmx1bik7CisJCQlpZiAobHApIHsKKwkJCQlzeW1fcmVtcXVlKCZjcC0+bGluazJfY2NicSk7CisJCQkJc3ltX2luc3F1ZV90YWlsKCZjcC0+bGluazJfY2NicSwKKwkJCQkgICAgICAgICAgICAgICAgJmxwLT53YWl0aW5nX2NjYnEpOworCQkJCWlmIChjcC0+c3RhcnRlZCkgeworCQkJCQlpZiAoY3AtPnRhZyAhPSBOT19UQUcpCisJCQkJCQktLWxwLT5zdGFydGVkX3RhZ3M7CisJCQkJCWVsc2UKKwkJCQkJCS0tbHAtPnN0YXJ0ZWRfbm9fdGFnOworCQkJCX0KKwkJCX0KKwkJCWNwLT5zdGFydGVkID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJc3ltX2ZyZWVfY2NiKG5wLCBjcCk7CisJCXN5bV94cHRfZG9uZShucCwgY21kKTsKKwl9Cit9CisKKy8qCisgKiAgQ29tcGxldGUgYWxsIGFjdGl2ZSBDQ0JzIHdpdGggZXJyb3IuCisgKiAgVXNlZCBvbiBDSElQL1NDU0kgUkVTRVQuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9mbHVzaF9idXN5X3F1ZXVlIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCBjYW1fc3RhdHVzKQoreworCS8qCisJICogIE1vdmUgYWxsIGFjdGl2ZSBDQ0JzIHRvIHRoZSBDT01QIHF1ZXVlIAorCSAqICBhbmQgZmx1c2ggdGhpcyBxdWV1ZS4KKwkgKi8KKwlzeW1fcXVlX3NwbGljZSgmbnAtPmJ1c3lfY2NicSwgJm5wLT5jb21wX2NjYnEpOworCXN5bV9xdWVfaW5pdCgmbnAtPmJ1c3lfY2NicSk7CisJc3ltX2ZsdXNoX2NvbXBfcXVldWUobnAsIGNhbV9zdGF0dXMpOworfQorCisvKgorICogIFN0YXJ0IGNoaXAuCisgKgorICogICdyZWFzb24nIG1lYW5zOgorICogICAgIDA6IGluaXRpYWxpc2F0aW9uLgorICogICAgIDE6IFNDU0kgQlVTIFJFU0VUIGRlbGl2ZXJlZCBvciByZWNlaXZlZC4KKyAqICAgICAyOiBTQ1NJIEJVUyBNT0RFIGNoYW5nZWQuCisgKi8KK3ZvaWQgc3ltX3N0YXJ0X3VwIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCByZWFzb24pCit7CisgCWludAlpOworCXUzMglwaHlzOworCisgCS8qCisJICogIFJlc2V0IGNoaXAgaWYgYXNrZWQsIG90aGVyd2lzZSBqdXN0IGNsZWFyIGZpZm9zLgorIAkgKi8KKwlpZiAocmVhc29uID09IDEpCisJCXN5bV9zb2Z0X3Jlc2V0KG5wKTsKKwllbHNlIHsKKwkJT1VUQihucCwgbmNfc3Rlc3QzLCBURXxDU0YpOworCQlPVVRPTkIobnAsIG5jX2N0ZXN0MywgQ0xGKTsKKwl9CisgCisJLyoKKwkgKiAgQ2xlYXIgU3RhcnQgUXVldWUKKwkgKi8KKwlwaHlzID0gbnAtPnNxdWV1ZV9iYTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1FVRVVFKjI7IGkgKz0gMikgeworCQlucC0+c3F1ZXVlW2ldICAgPSBjcHVfdG9fc2NyKG5wLT5pZGxldGFza19iYSk7CisJCW5wLT5zcXVldWVbaSsxXSA9IGNwdV90b19zY3IocGh5cyArIChpKzIpKjQpOworCX0KKwlucC0+c3F1ZXVlW01BWF9RVUVVRSoyLTFdID0gY3B1X3RvX3NjcihwaHlzKTsKKworCS8qCisJICogIFN0YXJ0IGF0IGZpcnN0IGVudHJ5LgorCSAqLworCW5wLT5zcXVldWVwdXQgPSAwOworCisJLyoKKwkgKiAgQ2xlYXIgRG9uZSBRdWV1ZQorCSAqLworCXBoeXMgPSBucC0+ZHF1ZXVlX2JhOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUVVFVUUqMjsgaSArPSAyKSB7CisJCW5wLT5kcXVldWVbaV0gICA9IDA7CisJCW5wLT5kcXVldWVbaSsxXSA9IGNwdV90b19zY3IocGh5cyArIChpKzIpKjQpOworCX0KKwlucC0+ZHF1ZXVlW01BWF9RVUVVRSoyLTFdID0gY3B1X3RvX3NjcihwaHlzKTsKKworCS8qCisJICogIFN0YXJ0IGF0IGZpcnN0IGVudHJ5LgorCSAqLworCW5wLT5kcXVldWVnZXQgPSAwOworCisJLyoKKwkgKiAgSW5zdGFsbCBwYXRjaGVzIGluIHNjcmlwdHMuCisJICogIFRoaXMgYWxzbyBsZXQgcG9pbnQgdG8gZmlyc3QgcG9zaXRpb24gdGhlIHN0YXJ0IAorCSAqICBhbmQgZG9uZSBxdWV1ZSBwb2ludGVycyB1c2VkIGZyb20gU0NSSVBUUy4KKwkgKi8KKwlucC0+ZndfcGF0Y2gobnApOworCisJLyoKKwkgKiAgV2FrZXVwIGFsbCBwZW5kaW5nIGpvYnMuCisJICovCisJc3ltX2ZsdXNoX2J1c3lfcXVldWUobnAsIENBTV9TQ1NJX0JVU19SRVNFVCk7CisKKwkvKgorCSAqICBJbml0IGNoaXAuCisJICovCisJT1VUQihucCwgbmNfaXN0YXQsICAweDAwKTsJCQkvKiAgUmVtb3ZlIFJlc2V0LCBhYm9ydCAqLworCXVkZWxheSgyMDAwKTsgLyogVGhlIDg5NSBuZWVkcyB0aW1lIGZvciB0aGUgYnVzIG1vZGUgdG8gc2V0dGxlICovCisKKwlPVVRCKG5wLCBuY19zY250bDAsIG5wLT5ydl9zY250bDAgfCAweGMwKTsKKwkJCQkJLyogIGZ1bGwgYXJiLiwgZW5hIHBhcml0eSwgcGFyLT5BVE4gICovCisJT1VUQihucCwgbmNfc2NudGwxLCAweDAwKTsJCS8qICBvZGQgcGFyaXR5LCBhbmQgcmVtb3ZlIENSU1QhISAqLworCisJc3ltX3NlbGVjdGNsb2NrKG5wLCBucC0+cnZfc2NudGwzKTsJLyogU2VsZWN0IFNDU0kgY2xvY2sgKi8KKworCU9VVEIobnAsIG5jX3NjaWQgICwgUlJFfG5wLT5teWFkZHIpOwkvKiBBZGFwdGVyIFNDU0kgYWRkcmVzcyAqLworCU9VVFcobnAsIG5jX3Jlc3BpZCwgMXVsPDxucC0+bXlhZGRyKTsJLyogSWQgdG8gcmVzcG9uZCB0byAqLworCU9VVEIobnAsIG5jX2lzdGF0ICwgU0lHUAkpOwkJLyogIFNpZ25hbCBQcm9jZXNzICovCisJT1VUQihucCwgbmNfZG1vZGUgLCBucC0+cnZfZG1vZGUpOwkJLyogQnVyc3QgbGVuZ3RoLCBkbWEgbW9kZSAqLworCU9VVEIobnAsIG5jX2N0ZXN0NSwgbnAtPnJ2X2N0ZXN0NSk7CS8qIExhcmdlIGZpZm8gKyBsYXJnZSBidXJzdCAqLworCisJT1VUQihucCwgbmNfZGNudGwgLCBOT0NPTXxucC0+cnZfZGNudGwpOwkvKiBQcm90ZWN0IFNGQlIgKi8KKwlPVVRCKG5wLCBuY19jdGVzdDMsIG5wLT5ydl9jdGVzdDMpOwkvKiBXcml0ZSBhbmQgaW52YWxpZGF0ZSAqLworCU9VVEIobnAsIG5jX2N0ZXN0NCwgbnAtPnJ2X2N0ZXN0NCk7CS8qIE1hc3RlciBwYXJpdHkgY2hlY2tpbmcgKi8KKworCS8qIEV4dGVuZGVkIFNyZXEvU2FjayBmaWx0ZXJpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGUgQzEwICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkKKwkJT1VUQihucCwgbmNfc3Rlc3QyLCBucC0+cnZfc3Rlc3QyKTsKKwllbHNlCisJCU9VVEIobnAsIG5jX3N0ZXN0MiwgRVhUfG5wLT5ydl9zdGVzdDIpOworCisJT1VUQihucCwgbmNfc3Rlc3QzLCBURSk7CQkJLyogVG9sZXJBTlQgZW5hYmxlICovCisJT1VUQihucCwgbmNfc3RpbWUwLCAweDBjKTsJCQkvKiBIVEggZGlzYWJsZWQgIFNUTyAwLjI1IHNlYyAqLworCisJLyoKKwkgKiAgRm9yIG5vdywgZGlzYWJsZSBBSVAgZ2VuZXJhdGlvbiBvbiBDMTAxMC02Ni4KKwkgKi8KKwlpZiAobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzY2KQorCQlPVVRCKG5wLCBuY19haXBjbnRsMSwgRElTQUlQKTsKKworCS8qCisJICogIEMxMDEwMSByZXYuIDAgZXJyYXRhLgorCSAqICBFcnJhbnQgU0dFJ3Mgd2hlbiBpbiBuYXJyb3cuIFdyaXRlIGJpdHMgNCAmIDUgb2YKKwkgKiAgU1RFU1QxIHJlZ2lzdGVyIHRvIGRpc2FibGUgU0dFLiBXZSBwcm9iYWJseSBzaG91bGQgZG8gCisJICogIHRoYXQgZnJvbSBTQ1JJUFRTIGZvciBlYWNoIHNlbGVjdGlvbi9yZXNlbGVjdGlvbiwgYnV0IAorCSAqICBJIGp1c3QgZG9uJ3Qgd2FudC4gOikKKwkgKi8KKwlpZiAobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0xTSV81M0MxMDEwXzMzICYmCisJICAgIG5wLT5yZXZpc2lvbl9pZCA8IDEpCisJCU9VVEIobnAsIG5jX3N0ZXN0MSwgSU5CKG5wLCBuY19zdGVzdDEpIHwgMHgzMCk7CisKKwkvKgorCSAqICBERUwgNDQxIC0gNTNDODc2IFJldiA1IC0gUGFydCBOdW1iZXIgNjA5LTAzOTI3ODcvMjc4OCAtIElURU0gMi4KKwkgKiAgRGlzYWJsZSBvdmVybGFwcGVkIGFyYml0cmF0aW9uIGZvciBzb21lIGR1YWwgZnVuY3Rpb24gZGV2aWNlcywgCisJICogIHJlZ2FyZGxlc3MgcmV2aXNpb24gaWQgKGtpbmQgb2YgcG9zdC1jaGlwLWRlc2lnbiBmZWF0dXJlLiA7LSkpCisJICovCisJaWYgKG5wLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9OQ1JfNTNDODc1KQorCQlPVVRCKG5wLCBuY19jdGVzdDAsICgxPDw1KSk7CisJZWxzZSBpZiAobnAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX05DUl81M0M4OTYpCisJCW5wLT5ydl9jY250bDAgfD0gRFBSOworCisJLyoKKwkgKiAgV3JpdGUgQ0NOVEwwL0NDTlRMMSBmb3IgY2hpcHMgY2FwYWJsZSBvZiA2NCBiaXQgYWRkcmVzc2luZyAKKwkgKiAgYW5kL29yIGhhcmR3YXJlIHBoYXNlIG1pc21hdGNoLCBzaW5jZSBvbmx5IHN1Y2ggY2hpcHMgCisJICogIHNlZW0gdG8gc3VwcG9ydCB0aG9zZSBJTyByZWdpc3RlcnMuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIChGRV9EQUN8RkVfTk9QTSkpIHsKKwkJT1VUQihucCwgbmNfY2NudGwwLCBucC0+cnZfY2NudGwwKTsKKwkJT1VUQihucCwgbmNfY2NudGwxLCBucC0+cnZfY2NudGwxKTsKKwl9CisKKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwkvKgorCSAqICBTZXQgdXAgc2NyYXRjaCBDIGFuZCBEUlMgSU8gcmVnaXN0ZXJzIHRvIG1hcCB0aGUgMzIgYml0IAorCSAqICBETUEgYWRkcmVzcyByYW5nZSBvdXIgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBsb2NhdGVkIGluLgorCSAqLworCWlmIChucC0+dXNlX2RhYykgeworCQlucC0+ZG1hcF9iYWhbMF0gPSAwOwkvKiA/Pz8gKi8KKwkJT1VUTChucCwgbmNfc2NyeFswXSwgbnAtPmRtYXBfYmFoWzBdKTsKKwkJT1VUTChucCwgbmNfZHJzLCBucC0+ZG1hcF9iYWhbMF0pOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiAgSWYgcGhhc2UgbWlzbWF0Y2ggaGFuZGxlZCBieSBzY3JpcHRzICg4OTVBLzg5Ni8xMDEwKSwKKwkgKiAgc2V0IFBNIGp1bXAgYWRkcmVzc2VzLgorCSAqLworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9OT1BNKSB7CisJCU9VVEwobnAsIG5jX3BtamFkMSwgU0NSSVBUQl9CQShucCwgcG1faGFuZGxlKSk7CisJCU9VVEwobnAsIG5jX3BtamFkMiwgU0NSSVBUQl9CQShucCwgcG1faGFuZGxlKSk7CisJfQorCisJLyoKKwkgKiAgICBFbmFibGUgR1BJTzAgcGluIGZvciB3cml0aW5nIGlmIExFRCBzdXBwb3J0IGZyb20gU0NSSVBUUy4KKwkgKiAgICBBbHNvIHNldCBHUElPNSBhbmQgY2xlYXIgR1BJTzYgaWYgaGFyZHdhcmUgTEVEIGNvbnRyb2wuCisJICovCisJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0xFRDApCisJCU9VVEIobnAsIG5jX2dwY250bCwgSU5CKG5wLCBuY19ncGNudGwpICYgfjB4MDEpOworCWVsc2UgaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0xFREMpCisJCU9VVEIobnAsIG5jX2dwY250bCwgKElOQihucCwgbmNfZ3BjbnRsKSAmIH4weDQxKSB8IDB4MjApOworCisJLyoKKwkgKiAgICAgIGVuYWJsZSBpbnRzCisJICovCisJT1VUVyhucCwgbmNfc2llbiAsIFNUT3xIVEh8TUF8U0dFfFVEQ3xSU1R8UEFSKTsKKwlPVVRCKG5wLCBuY19kaWVuICwgTURQRXxCRnxTU0l8U0lSfElJRCk7CisKKwkvKgorCSAqICBGb3IgODk1LzYgZW5hYmxlIFNCTUMgaW50ZXJydXB0IGFuZCBzYXZlIGN1cnJlbnQgU0NTSSBidXMgbW9kZS4KKwkgKiAgVHJ5IHRvIGVhdCB0aGUgc3B1cmlvdXMgU0JNQyBpbnRlcnJ1cHQgdGhhdCBtYXkgb2NjdXIgd2hlbiAKKwkgKiAgd2UgcmVzZXQgdGhlIGNoaXAgYnV0IG5vdCB0aGUgU0NTSSBCVVMgKGF0IGluaXRpYWxpemF0aW9uKS4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgKEZFX1VMVFJBMnxGRV9VTFRSQTMpKSB7CisJCU9VVE9OVyhucCwgbmNfc2llbiwgU0JNQyk7CisJCWlmIChyZWFzb24gPT0gMCkgeworCQkJbWRlbGF5KDEwMCk7CisJCQlJTlcobnAsIG5jX3Npc3QpOworCQl9CisJCW5wLT5zY3NpX21vZGUgPSBJTkIobnAsIG5jX3N0ZXN0NCkgJiBTTU9ERTsKKwl9CisKKwkvKgorCSAqICBGaWxsIGluIHRhcmdldCBzdHJ1Y3R1cmUuCisJICogIFJlaW5pdGlhbGl6ZSB1c3JzeW5jLgorCSAqICBSZWluaXRpYWxpemUgdXNyd2lkZS4KKwkgKiAgUHJlcGFyZSBzeW5jIG5lZ290aWF0aW9uIGFjY29yZGluZyB0byBhY3R1YWwgU0NTSSBidXMgbW9kZS4KKwkgKi8KKwlmb3IgKGk9MDtpPFNZTV9DT05GX01BWF9UQVJHRVQ7aSsrKSB7CisJCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W2ldOworCisJCXRwLT50b19yZXNldCAgPSAwOworCQl0cC0+aGVhZC5zdmFsID0gMDsKKwkJdHAtPmhlYWQud3ZhbCA9IG5wLT5ydl9zY250bDM7CisJCXRwLT5oZWFkLnV2YWwgPSAwOworCX0KKworCS8qCisJICogIERvd25sb2FkIFNDU0kgU0NSSVBUUyB0byBvbi1jaGlwIFJBTSBpZiBwcmVzZW50LAorCSAqICBhbmQgc3RhcnQgc2NyaXB0IHByb2Nlc3Nvci4KKwkgKiAgV2UgZG8gdGhlIGRvd25sb2FkIHByZWZlcmVudGx5IGZyb20gdGhlIENQVS4KKwkgKiAgRm9yIHBsYXRmb3JtcyB0aGF0IG1heSBub3Qgc3VwcG9ydCBQQ0kgbWVtb3J5IG1hcHBpbmcsCisJICogIHdlIHVzZSBzaW1wbGUgU0NSSVBUUyB0aGF0IHBlcmZvcm1zIE1FTU9SWSBNT1ZFcy4KKwkgKi8KKwlwaHlzID0gU0NSSVBUQV9CQShucCwgaW5pdCk7CisJaWYgKG5wLT5yYW1fYmEpIHsKKwkJaWYgKHN5bV92ZXJib3NlID49IDIpCisJCQlwcmludGYoIiVzOiBEb3dubG9hZGluZyBTQ1NJIFNDUklQVFMuXG4iLCBzeW1fbmFtZShucCkpOworCQltZW1jcHlfdG9pbyhucC0+cy5yYW1hZGRyLCBucC0+c2NyaXB0YTAsIG5wLT5zY3JpcHRhX3N6KTsKKwkJaWYgKG5wLT5yYW1fd3MgPT0gODE5MikgeworCQkJbWVtY3B5X3RvaW8obnAtPnMucmFtYWRkciArIDQwOTYsIG5wLT5zY3JpcHRiMCwgbnAtPnNjcmlwdGJfc3opOworCQkJcGh5cyA9IHNjcl90b19jcHUobnAtPnNjcl9yYW1fc2VnKTsKKwkJCU9VVEwobnAsIG5jX21td3MsIHBoeXMpOworCQkJT1VUTChucCwgbmNfbW1ycywgcGh5cyk7CisJCQlPVVRMKG5wLCBuY19zZnMsICBwaHlzKTsKKwkJCXBoeXMgPSBTQ1JJUFRCX0JBKG5wLCBzdGFydDY0KTsKKwkJfQorCX0KKworCW5wLT5pc3RhdF9zZW0gPSAwOworCisJT1VUTChucCwgbmNfZHNhLCBucC0+aGNiX2JhKTsKKwlPVVRMX0RTUChucCwgcGh5cyk7CisKKwkvKgorCSAqICBOb3RpZnkgdGhlIFhQVCBhYm91dCB0aGUgUkVTRVQgY29uZGl0aW9uLgorCSAqLworCWlmIChyZWFzb24gIT0gMCkKKwkJc3ltX3hwdF9hc3luY19idXNfcmVzZXQobnApOworfQorCisvKgorICogIFN3aXRjaCB0cmFucyBtb2RlIGZvciBjdXJyZW50IGpvYiBhbmQgaXRzIHRhcmdldC4KKyAqLworc3RhdGljIHZvaWQgc3ltX3NldHRyYW5zKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCwgdV9jaGFyIG9wdHMsIHVfY2hhciBvZnMsCisJCQkgdV9jaGFyIHBlciwgdV9jaGFyIHdpZGUsIHVfY2hhciBkaXYsIHVfY2hhciBmYWspCit7CisJU1lNX1FVRUhFQUQgKnFwOworCXVfY2hhciBzdmFsLCB3dmFsLCB1dmFsOworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisKKwlhc3NlcnQodGFyZ2V0ID09IChJTkIobnAsIG5jX3NkaWQpICYgMHgwZikpOworCisJc3ZhbCA9IHRwLT5oZWFkLnN2YWw7CisJd3ZhbCA9IHRwLT5oZWFkLnd2YWw7CisJdXZhbCA9IHRwLT5oZWFkLnV2YWw7CisKKyNpZiAwCisJcHJpbnRmKCJYWFhYIHN2YWw9JXggd3ZhbD0leCB1dmFsPSV4ICgleClcbiIsIAorCQlzdmFsLCB3dmFsLCB1dmFsLCBucC0+cnZfc2NudGwzKTsKKyNlbmRpZgorCS8qCisJICogIFNldCB0aGUgb2Zmc2V0LgorCSAqLworCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkpCisJCXN2YWwgPSAoc3ZhbCAmIH4weDFmKSB8IG9mczsKKwllbHNlCisJCXN2YWwgPSAoc3ZhbCAmIH4weDNmKSB8IG9mczsKKworCS8qCisJICogIFNldCB0aGUgc3luYyBkaXZpc29yIGFuZCBleHRyYSBjbG9jayBmYWN0b3IuCisJICovCisJaWYgKG9mcyAhPSAwKSB7CisJCXd2YWwgPSAod3ZhbCAmIH4weDcwKSB8ICgoZGl2KzEpIDw8IDQpOworCQlpZiAoIShucC0+ZmVhdHVyZXMgJiBGRV9DMTApKQorCQkJc3ZhbCA9IChzdmFsICYgfjB4ZTApIHwgKGZhayA8PCA1KTsKKwkJZWxzZSB7CisJCQl1dmFsID0gdXZhbCAmIH4oWENMS0hfU1R8WENMS0hfRFR8WENMS1NfU1R8WENMS1NfRFQpOworCQkJaWYgKGZhayA+PSAxKSB1dmFsIHw9IChYQ0xLSF9TVHxYQ0xLSF9EVCk7CisJCQlpZiAoZmFrID49IDIpIHV2YWwgfD0gKFhDTEtTX1NUfFhDTEtTX0RUKTsKKwkJfQorCX0KKworCS8qCisJICogIFNldCB0aGUgYnVzIHdpZHRoLgorCSAqLworCXd2YWwgPSB3dmFsICYgfkVXUzsKKwlpZiAod2lkZSAhPSAwKQorCQl3dmFsIHw9IEVXUzsKKworCS8qCisJICogIFNldCBtaXNjLiB1bHRyYSBlbmFibGUgYml0cy4KKwkgKi8KKwlpZiAobnAtPmZlYXR1cmVzICYgRkVfQzEwKSB7CisJCXV2YWwgPSB1dmFsICYgfihVM0VOfEFJUENLRU4pOworCQlpZiAob3B0cykJeworCQkJYXNzZXJ0KG5wLT5mZWF0dXJlcyAmIEZFX1UzRU4pOworCQkJdXZhbCB8PSBVM0VOOworCQl9CisJfSBlbHNlIHsKKwkJd3ZhbCA9IHd2YWwgJiB+VUxUUkE7CisJCWlmIChwZXIgPD0gMTIpCXd2YWwgfD0gVUxUUkE7CisJfQorCisJLyoKKwkgKiAgIFN0b3AgdGhlcmUgaWYgc3luYyBwYXJhbWV0ZXJzIGFyZSB1bmNoYW5nZWQuCisJICovCisJaWYgKHRwLT5oZWFkLnN2YWwgPT0gc3ZhbCAmJiAKKwkgICAgdHAtPmhlYWQud3ZhbCA9PSB3dmFsICYmCisJICAgIHRwLT5oZWFkLnV2YWwgPT0gdXZhbCkKKwkJcmV0dXJuOworCXRwLT5oZWFkLnN2YWwgPSBzdmFsOworCXRwLT5oZWFkLnd2YWwgPSB3dmFsOworCXRwLT5oZWFkLnV2YWwgPSB1dmFsOworCisJLyoKKwkgKiAgRGlzYWJsZSBleHRlbmRlZCBTcmVxL1NhY2sgZmlsdGVyaW5nIGlmIHBlciA8IDUwLgorCSAqICBOb3Qgc3VwcG9ydGVkIG9uIHRoZSBDMTAxMC4KKwkgKi8KKwlpZiAocGVyIDwgNTAgJiYgIShucC0+ZmVhdHVyZXMgJiBGRV9DMTApKQorCQlPVVRPRkZCKG5wLCBuY19zdGVzdDIsIEVYVCk7CisKKwkvKgorCSAqICBzZXQgYWN0dWFsIHZhbHVlIGFuZCBzeW5jX3N0YXR1cworCSAqLworCU9VVEIobnAsIG5jX3N4ZmVyLCAgdHAtPmhlYWQuc3ZhbCk7CisJT1VUQihucCwgbmNfc2NudGwzLCB0cC0+aGVhZC53dmFsKTsKKworCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9DMTApIHsKKwkJT1VUQihucCwgbmNfc2NudGw0LCB0cC0+aGVhZC51dmFsKTsKKwl9CisKKwkvKgorCSAqICBwYXRjaCBBTEwgYnVzeSBjY2JzIG9mIHRoaXMgdGFyZ2V0LgorCSAqLworCUZPUl9FQUNIX1FVRVVFRF9FTEVNRU5UKCZucC0+YnVzeV9jY2JxLCBxcCkgeworCQlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisJCWlmIChjcC0+dGFyZ2V0ICE9IHRhcmdldCkKKwkJCWNvbnRpbnVlOworCQljcC0+cGh5cy5zZWxlY3Quc2VsX3NjbnRsMyA9IHRwLT5oZWFkLnd2YWw7CisJCWNwLT5waHlzLnNlbGVjdC5zZWxfc3hmZXIgID0gdHAtPmhlYWQuc3ZhbDsKKwkJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkgeworCQkJY3AtPnBoeXMuc2VsZWN0LnNlbF9zY250bDQgPSB0cC0+aGVhZC51dmFsOworCQl9CisJfQorfQorCisvKgorICogIFdlIHJlY2VpdmVkIGEgV0RUUi4KKyAqICBMZXQgZXZlcnl0aGluZyBiZSBhd2FyZSBvZiB0aGUgY2hhbmdlcy4KKyAqLworc3RhdGljIHZvaWQgc3ltX3NldHdpZGUoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCB1X2NoYXIgd2lkZSkKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9IHRwLT5zZGV2LT5zZGV2X3RhcmdldDsKKworCWlmIChzcGlfd2lkdGgoc3RhcmdldCkgPT0gd2lkZSkKKwkJcmV0dXJuOworCisJc3ltX3NldHRyYW5zKG5wLCB0YXJnZXQsIDAsIDAsIDAsIHdpZGUsIDAsIDApOworCisJdHAtPnRnb2FsLndpZHRoID0gd2lkZTsKKwlzcGlfb2Zmc2V0KHN0YXJnZXQpID0gMDsKKwlzcGlfcGVyaW9kKHN0YXJnZXQpID0gMDsKKwlzcGlfd2lkdGgoc3RhcmdldCkgPSB3aWRlOworCXNwaV9pdShzdGFyZ2V0KSA9IDA7CisJc3BpX2R0KHN0YXJnZXQpID0gMDsKKwlzcGlfcWFzKHN0YXJnZXQpID0gMDsKKworCWlmIChzeW1fdmVyYm9zZSA+PSAzKQorCQlzcGlfZGlzcGxheV94ZmVyX2FncmVlbWVudChzdGFyZ2V0KTsKK30KKworLyoKKyAqICBXZSByZWNlaXZlZCBhIFNEVFIuCisgKiAgTGV0IGV2ZXJ5dGhpbmcgYmUgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCisgKi8KK3N0YXRpYyB2b2lkCitzeW1fc2V0c3luYyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQsCisgICAgICAgICAgICB1X2NoYXIgb2ZzLCB1X2NoYXIgcGVyLCB1X2NoYXIgZGl2LCB1X2NoYXIgZmFrKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gdHAtPnNkZXYtPnNkZXZfdGFyZ2V0OworCXVfY2hhciB3aWRlID0gKHRwLT5oZWFkLnd2YWwgJiBFV1MpID8gQlVTXzE2X0JJVCA6IEJVU184X0JJVDsKKworCXN5bV9zZXR0cmFucyhucCwgdGFyZ2V0LCAwLCBvZnMsIHBlciwgd2lkZSwgZGl2LCBmYWspOworCisJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IHBlcjsKKwlzcGlfb2Zmc2V0KHN0YXJnZXQpID0gb2ZzOworCXNwaV9pdShzdGFyZ2V0KSA9IHNwaV9kdChzdGFyZ2V0KSA9IHNwaV9xYXMoc3RhcmdldCkgPSAwOworCisJaWYgKCF0cC0+dGdvYWwuZHQgJiYgIXRwLT50Z29hbC5pdSAmJiAhdHAtPnRnb2FsLnFhcykgeworCQl0cC0+dGdvYWwucGVyaW9kID0gcGVyOworCQl0cC0+dGdvYWwub2Zmc2V0ID0gb2ZzOworCQl0cC0+dGdvYWwuY2hlY2tfbmVnbyA9IDA7CisJfQorCisJc3BpX2Rpc3BsYXlfeGZlcl9hZ3JlZW1lbnQoc3RhcmdldCk7Cit9CisKKy8qCisgKiAgV2UgcmVjZWl2ZWQgYSBQUFIuCisgKiAgTGV0IGV2ZXJ5dGhpbmcgYmUgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCisgKi8KK3N0YXRpYyB2b2lkIAorc3ltX3NldHBwcm90KHN0cnVjdCBzeW1faGNiICpucCwgaW50IHRhcmdldCwgdV9jaGFyIG9wdHMsIHVfY2hhciBvZnMsCisgICAgICAgICAgICAgdV9jaGFyIHBlciwgdV9jaGFyIHdpZGUsIHVfY2hhciBkaXYsIHVfY2hhciBmYWspCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSB0cC0+c2Rldi0+c2Rldl90YXJnZXQ7CisKKwlzeW1fc2V0dHJhbnMobnAsIHRhcmdldCwgb3B0cywgb2ZzLCBwZXIsIHdpZGUsIGRpdiwgZmFrKTsKKworCXNwaV93aWR0aChzdGFyZ2V0KSA9IHRwLT50Z29hbC53aWR0aCA9IHdpZGU7CisJc3BpX3BlcmlvZChzdGFyZ2V0KSA9IHRwLT50Z29hbC5wZXJpb2QgPSBwZXI7CisJc3BpX29mZnNldChzdGFyZ2V0KSA9IHRwLT50Z29hbC5vZmZzZXQgPSBvZnM7CisJc3BpX2l1KHN0YXJnZXQpID0gdHAtPnRnb2FsLml1ID0gISEob3B0cyAmIFBQUl9PUFRfSVUpOworCXNwaV9kdChzdGFyZ2V0KSA9IHRwLT50Z29hbC5kdCA9ICEhKG9wdHMgJiBQUFJfT1BUX0RUKTsKKwlzcGlfcWFzKHN0YXJnZXQpID0gdHAtPnRnb2FsLnFhcyA9ICEhKG9wdHMgJiBQUFJfT1BUX1FBUyk7CisJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAwOworCisJc3BpX2Rpc3BsYXlfeGZlcl9hZ3JlZW1lbnQoc3RhcmdldCk7Cit9CisKKy8qCisgKiAgZ2VuZXJpYyByZWNvdmVyeSBmcm9tIHNjc2kgaW50ZXJydXB0CisgKgorICogIFRoZSBkb2Mgc2F5cyB0aGF0IHdoZW4gdGhlIGNoaXAgZ2V0cyBhbiBTQ1NJIGludGVycnVwdCwKKyAqICBpdCB0cmllcyB0byBzdG9wIGluIGFuIG9yZGVybHkgZmFzaGlvbiwgYnkgY29tcGxldGluZyAKKyAqICBhbiBpbnN0cnVjdGlvbiBmZXRjaCB0aGF0IGhhZCBzdGFydGVkIG9yIGJ5IGZsdXNoaW5nIAorICogIHRoZSBETUEgZmlmbyBmb3IgYSB3cml0ZSB0byBtZW1vcnkgdGhhdCB3YXMgZXhlY3V0aW5nLgorICogIFN1Y2ggYSBmYXNoaW9uIGlzIG5vdCBlbm91Z2ggdG8ga25vdyBpZiB0aGUgaW5zdHJ1Y3Rpb24gCisgKiAgdGhhdCB3YXMganVzdCBiZWZvcmUgdGhlIGN1cnJlbnQgRFNQIHZhbHVlIGhhcyBiZWVuIAorICogIGV4ZWN1dGVkIG9yIG5vdC4KKyAqCisgKiAgVGhlcmUgYXJlIHNvbWUgc21hbGwgU0NSSVBUUyBzZWN0aW9ucyB0aGF0IGRlYWwgd2l0aCAKKyAqICB0aGUgc3RhcnQgcXVldWUgYW5kIHRoZSBkb25lIHF1ZXVlIHRoYXQgbWF5IGJyZWFrIGFueSAKKyAqICBhc3NvbXB0aW9uIGZyb20gdGhlIEMgY29kZSBpZiB3ZSBhcmUgaW50ZXJydXB0ZWQgCisgKiAgaW5zaWRlLCBzbyB3ZSByZXNldCBpZiB0aGlzIGhhcHBlbnMuIEJ0dywgc2luY2UgdGhlc2UgCisgKiAgU0NSSVBUUyBzZWN0aW9ucyBhcmUgZXhlY3V0ZWQgd2hpbGUgdGhlIFNDUklQVFMgaGFzbid0IAorICogIHN0YXJ0ZWQgU0NTSSBvcGVyYXRpb25zLCBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRvIGhhcHBlbi4KKyAqCisgKiAgQWxsIHRoZSBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBzdXBwb3NlZCB0byBiZSAKKyAqICBhbGxvY2F0ZWQgZnJvbSB0aGUgc2FtZSA0IEdCIG1lbW9yeSB3aW5kb3csIHNvIHRoZXJlIAorICogIGlzIGEgMSB0byAxIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIERTQSBhbmQgZHJpdmVyIGRhdGEgCisgKiAgc3RydWN0dXJlcy4gU2luY2Ugd2UgYXJlIGNhcmVmdWwgOikgdG8gaW52YWxpZGF0ZSB0aGUgCisgKiAgRFNBIHdoZW4gd2UgY29tcGxldGUgYSBjb21tYW5kIG9yIHdoZW4gdGhlIFNDUklQVFMgCisgKiAgcHVzaGVzIGEgRFNBIGludG8gYSBxdWV1ZSwgd2UgY2FuIHRydXN0IGl0IHdoZW4gaXQgCisgKiAgcG9pbnRzIHRvIGEgQ0NCLgorICovCitzdGF0aWMgdm9pZCBzeW1fcmVjb3Zlcl9zY3NpX2ludCAoc3RydWN0IHN5bV9oY2IgKm5wLCB1X2NoYXIgaHN0cykKK3sKKwl1MzIJZHNwCT0gSU5MKG5wLCBuY19kc3ApOworCXUzMglkc2EJPSBJTkwobnAsIG5jX2RzYSk7CisJc3RydWN0IHN5bV9jY2IgKmNwCT0gc3ltX2NjYl9mcm9tX2RzYShucCwgZHNhKTsKKworCS8qCisJICogIElmIHdlIGhhdmVuJ3QgYmVlbiBpbnRlcnJ1cHRlZCBpbnNpZGUgdGhlIFNDUklQVFMgCisJICogIGNyaXRpY2FsIHBhdGhlcywgd2UgY2FuIHNhZmVseSByZXN0YXJ0IHRoZSBTQ1JJUFRTIAorCSAqICBhbmQgdHJ1c3QgdGhlIERTQSB2YWx1ZSBpZiBpdCBtYXRjaGVzIGEgQ0NCLgorCSAqLworCWlmICgoIShkc3AgPiBTQ1JJUFRBX0JBKG5wLCBnZXRqb2JfYmVnaW4pICYmCisJICAgICAgIGRzcCA8IFNDUklQVEFfQkEobnAsIGdldGpvYl9lbmQpICsgMSkpICYmCisJICAgICghKGRzcCA+IFNDUklQVEFfQkEobnAsIHVuZ2V0am9iKSAmJgorCSAgICAgICBkc3AgPCBTQ1JJUFRBX0JBKG5wLCByZXNlbGVjdCkgKyAxKSkgJiYKKwkgICAgKCEoZHNwID4gU0NSSVBUQl9CQShucCwgc2VsX2Zvcl9hYm9ydCkgJiYKKwkgICAgICAgZHNwIDwgU0NSSVBUQl9CQShucCwgc2VsX2Zvcl9hYm9ydF8xKSArIDEpKSAmJgorCSAgICAoIShkc3AgPiBTQ1JJUFRBX0JBKG5wLCBkb25lKSAmJgorCSAgICAgICBkc3AgPCBTQ1JJUFRBX0JBKG5wLCBkb25lX2VuZCkgKyAxKSkpIHsKKwkJT1VUQihucCwgbmNfY3Rlc3QzLCBucC0+cnZfY3Rlc3QzIHwgQ0xGKTsgLyogY2xlYXIgZG1hIGZpZm8gICovCisJCU9VVEIobnAsIG5jX3N0ZXN0MywgVEV8Q1NGKTsJCS8qIGNsZWFyIHNjc2kgZmlmbyAqLworCQkvKgorCQkgKiAgSWYgd2UgaGF2ZSBhIENDQiwgbGV0IHRoZSBTQ1JJUFRTIGNhbGwgdXMgYmFjayBmb3IgCisJCSAqICB0aGUgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHdpdGggU0NSQVRDSEEgZmlsbGVkIHdpdGggCisJCSAqICBTVEFSVFBPUy4gVGhpcyB3YXksIHdlIHdpbGwgYmUgYWJsZSB0byBmcmVlemUgdGhlIAorCQkgKiAgZGV2aWNlIHF1ZXVlIGFuZCByZXF1ZXVlIGF3YWl0aW5nIElPcy4KKwkJICovCisJCWlmIChjcCkgeworCQkJY3AtPmhvc3Rfc3RhdHVzID0gaHN0czsKKwkJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBjb21wbGV0ZV9lcnJvcikpOworCQl9CisJCS8qCisJCSAqICBPdGhlcndpc2UganVzdCByZXN0YXJ0IHRoZSBTQ1JJUFRTLgorCQkgKi8KKwkJZWxzZSB7CisJCQlPVVRMKG5wLCBuY19kc2EsIDB4ZmZmZmZmKTsKKwkJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBzdGFydCkpOworCQl9CisJfQorCWVsc2UKKwkJZ290byByZXNldF9hbGw7CisKKwlyZXR1cm47CisKK3Jlc2V0X2FsbDoKKwlzeW1fc3RhcnRfcmVzZXQobnApOworfQorCisvKgorICogIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHNlbGVjdGlvbiB0aW1lb3V0CisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbnRfc3RvIChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdTMyIGRzcAk9IElOTChucCwgbmNfZHNwKTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpIHByaW50ZiAoIlQiKTsKKworCWlmIChkc3AgPT0gU0NSSVBUQV9CQShucCwgd2Zfc2VsX2RvbmUpICsgOCkKKwkJc3ltX3JlY292ZXJfc2NzaV9pbnQobnAsIEhTX1NFTF9USU1FT1VUKTsKKwllbHNlCisJCXN5bV9zdGFydF9yZXNldChucCk7Cit9CisKKy8qCisgKiAgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgdW5leHBlY3RlZCBkaXNjb25uZWN0CisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbnRfdWRjIChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJcHJpbnRmICgiJXM6IHVuZXhwZWN0ZWQgZGlzY29ubmVjdFxuIiwgc3ltX25hbWUobnApKTsKKwlzeW1fcmVjb3Zlcl9zY3NpX2ludChucCwgSFNfVU5FWFBFQ1RFRCk7Cit9CisKKy8qCisgKiAgY2hpcCBleGNlcHRpb24gaGFuZGxlciBmb3IgU0NTSSBidXMgbW9kZSBjaGFuZ2UKKyAqCisgKiAgc3BpMi1yMTIgMTEuMi4zIHNheXMgYSB0cmFuc2NlaXZlciBtb2RlIGNoYW5nZSBtdXN0IAorICogIGdlbmVyYXRlIGEgcmVzZXQgZXZlbnQgYW5kIGEgZGV2aWNlIHRoYXQgZGV0ZWN0cyBhIHJlc2V0IAorICogIGV2ZW50IHNoYWxsIGluaXRpYXRlIGEgaGFyZCByZXNldC4gSXQgc2F5cyBhbHNvIHRoYXQgYQorICogIGRldmljZSB0aGF0IGRldGVjdHMgYSBtb2RlIGNoYW5nZSBzaGFsbCBzZXQgZGF0YSB0cmFuc2ZlciAKKyAqICBtb2RlIHRvIGVpZ2h0IGJpdCBhc3luY2hyb25vdXMsIGV0Yy4uLgorICogIFNvLCBqdXN0IHJlaW5pdGlhbGl6aW5nIGFsbCBleGNlcHQgY2hpcCBzaG91bGQgYmUgZW5vdWdoLgorICovCitzdGF0aWMgdm9pZCBzeW1faW50X3NibWMgKHN0cnVjdCBzeW1faGNiICpucCkKK3sKKwl1X2NoYXIgc2NzaV9tb2RlID0gSU5CKG5wLCBuY19zdGVzdDQpICYgU01PREU7CisKKwkvKgorCSAqICBOb3RpZnkgdXNlci4KKwkgKi8KKwlwcmludGYoIiVzOiBTQ1NJIEJVUyBtb2RlIGNoYW5nZSBmcm9tICVzIHRvICVzLlxuIiwgc3ltX25hbWUobnApLAorCQlzeW1fc2NzaV9idXNfbW9kZShucC0+c2NzaV9tb2RlKSwgc3ltX3Njc2lfYnVzX21vZGUoc2NzaV9tb2RlKSk7CisKKwkvKgorCSAqICBTaG91bGQgc3VzcGVuZCBjb21tYW5kIHByb2Nlc3NpbmcgZm9yIGEgZmV3IHNlY29uZHMgYW5kIAorCSAqICByZWluaXRpYWxpemUgYWxsIGV4Y2VwdCB0aGUgY2hpcC4KKwkgKi8KKwlzeW1fc3RhcnRfdXAgKG5wLCAyKTsKK30KKworLyoKKyAqICBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBTQ1NJIHBhcml0eSBlcnJvci4KKyAqCisgKiAgV2hlbiB0aGUgY2hpcCBkZXRlY3RzIGEgU0NTSSBwYXJpdHkgZXJyb3IgYW5kIGlzIAorICogIGN1cnJlbnRseSBleGVjdXRpbmcgYSAoQ0gpTU9WIGluc3RydWN0aW9uLCBpdCBkb2VzIAorICogIG5vdCBpbnRlcnJ1cHQgaW1tZWRpYXRlbHksIGJ1dCB0cmllcyB0byBmaW5pc2ggdGhlIAorICogIHRyYW5zZmVyIG9mIHRoZSBjdXJyZW50IHNjYXR0ZXIgZW50cnkgYmVmb3JlIAorICogIGludGVycnVwdGluZy4gVGhlIGZvbGxvd2luZyBzaXR1YXRpb25zIG1heSBvY2N1cjoKKyAqCisgKiAgLSBUaGUgY29tcGxldGUgc2NhdHRlciBlbnRyeSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCAKKyAqICAgIHdpdGhvdXQgdGhlIGRldmljZSBoYXZpbmcgY2hhbmdlZCBwaGFzZS4KKyAqICAgIFRoZSBjaGlwIHdpbGwgdGhlbiBpbnRlcnJ1cHQgd2l0aCB0aGUgRFNQIHBvaW50aW5nIAorICogICAgdG8gdGhlIGluc3RydWN0aW9uIHRoYXQgZm9sbG93cyB0aGUgTU9WLgorICoKKyAqICAtIEEgcGhhc2UgbWlzbWF0Y2ggb2NjdXJzIGJlZm9yZSB0aGUgTU9WIGZpbmlzaGVkIAorICogICAgYW5kIHBoYXNlIGVycm9ycyBhcmUgdG8gYmUgaGFuZGxlZCBieSB0aGUgQyBjb2RlLgorICogICAgVGhlIGNoaXAgd2lsbCB0aGVuIGludGVycnVwdCB3aXRoIGJvdGggUEFSIGFuZCBNQSAKKyAqICAgIGNvbmRpdGlvbnMgc2V0LgorICoKKyAqICAtIEEgcGhhc2UgbWlzbWF0Y2ggb2NjdXJzIGJlZm9yZSB0aGUgTU9WIGZpbmlzaGVkIGFuZCAKKyAqICAgIHBoYXNlIGVycm9ycyBhcmUgdG8gYmUgaGFuZGxlZCBieSBTQ1JJUFRTLgorICogICAgVGhlIGNoaXAgd2lsbCBsb2FkIHRoZSBEU1Agd2l0aCB0aGUgcGhhc2UgbWlzbWF0Y2ggCisgKiAgICBKVU1QIGFkZHJlc3MgYW5kIGludGVycnVwdCB0aGUgaG9zdCBwcm9jZXNzb3IuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbnRfcGFyIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfc2hvcnQgc2lzdCkKK3sKKwl1X2NoYXIJaHN0cwk9IElOQihucCwgSFNfUFJUKTsKKwl1MzIJZHNwCT0gSU5MKG5wLCBuY19kc3ApOworCXUzMglkYmMJPSBJTkwobnAsIG5jX2RiYyk7CisJdTMyCWRzYQk9IElOTChucCwgbmNfZHNhKTsKKwl1X2NoYXIJc2JjbAk9IElOQihucCwgbmNfc2JjbCk7CisJdV9jaGFyCWNtZAk9IGRiYyA+PiAyNDsKKwlpbnQgcGhhc2UJPSBjbWQgJiA3OworCXN0cnVjdCBzeW1fY2NiICpjcAk9IHN5bV9jY2JfZnJvbV9kc2EobnAsIGRzYSk7CisKKwlwcmludGYoIiVzOiBTQ1NJIHBhcml0eSBlcnJvciBkZXRlY3RlZDogU0NSMT0lZCBEQkM9JXggU0JDTD0leFxuIiwKKwkJc3ltX25hbWUobnApLCBoc3RzLCBkYmMsIHNiY2wpOworCisJLyoKKwkgKiAgQ2hlY2sgdGhhdCB0aGUgY2hpcCBpcyBjb25uZWN0ZWQgdG8gdGhlIFNDU0kgQlVTLgorCSAqLworCWlmICghKElOQihucCwgbmNfc2NudGwxKSAmIElTQ09OKSkgeworCQlzeW1fcmVjb3Zlcl9zY3NpX2ludChucCwgSFNfVU5FWFBFQ1RFRCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICBJZiB0aGUgbmV4dXMgaXMgbm90IGNsZWFybHkgaWRlbnRpZmllZCwgcmVzZXQgdGhlIGJ1cy4KKwkgKiAgV2Ugd2lsbCB0cnkgdG8gZG8gYmV0dGVyIGxhdGVyLgorCSAqLworCWlmICghY3ApCisJCWdvdG8gcmVzZXRfYWxsOworCisJLyoKKwkgKiAgQ2hlY2sgaW5zdHJ1Y3Rpb24gd2FzIGEgTU9WLCBkaXJlY3Rpb24gd2FzIElOUFVUIGFuZCAKKwkgKiAgQVROIGlzIGFzc2VydGVkLgorCSAqLworCWlmICgoY21kICYgMHhjMCkgfHwgIShwaGFzZSAmIDEpIHx8ICEoc2JjbCAmIDB4OCkpCisJCWdvdG8gcmVzZXRfYWxsOworCisJLyoKKwkgKiAgS2VlcCB0cmFjayBvZiB0aGUgcGFyaXR5IGVycm9yLgorCSAqLworCU9VVE9OQihucCwgSEZfUFJULCBIRl9FWFRfRVJSKTsKKwljcC0+eGVycl9zdGF0dXMgfD0gWEVfUEFSSVRZX0VSUjsKKworCS8qCisJICogIFByZXBhcmUgdGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgZGV2aWNlLgorCSAqLworCW5wLT5tc2dvdXRbMF0gPSAocGhhc2UgPT0gNykgPyBNX1BBUklUWSA6IE1fSURfRVJST1I7CisKKwkvKgorCSAqICBJZiB0aGUgb2xkIHBoYXNlIHdhcyBEQVRBIElOIHBoYXNlLCB3ZSBoYXZlIHRvIGRlYWwgd2l0aAorCSAqICB0aGUgMyBzaXR1YXRpb25zIGRlc2NyaWJlZCBhYm92ZS4KKwkgKiAgRm9yIG90aGVyIGlucHV0IHBoYXNlcyAoTVNHIElOIGFuZCBTVEFUVVMpLCB0aGUgZGV2aWNlIAorCSAqICBtdXN0IHJlc2VuZCB0aGUgd2hvbGUgdGhpbmcgdGhhdCBmYWlsZWQgcGFyaXR5IGNoZWNraW5nIAorCSAqICBvciBzaWduYWwgZXJyb3IuIFNvLCBqdW1waW5nIHRvIGRpc3BhdGNoZXIgc2hvdWxkIGJlIE9LLgorCSAqLworCWlmIChwaGFzZSA9PSAxIHx8IHBoYXNlID09IDUpIHsKKwkJLyogUGhhc2UgbWlzbWF0Y2ggaGFuZGxlZCBieSBTQ1JJUFRTICovCisJCWlmIChkc3AgPT0gU0NSSVBUQl9CQShucCwgcG1faGFuZGxlKSkKKwkJCU9VVExfRFNQKG5wLCBkc3ApOworCQkvKiBQaGFzZSBtaXNtYXRjaCBoYW5kbGVkIGJ5IHRoZSBDIGNvZGUgKi8KKwkJZWxzZSBpZiAoc2lzdCAmIE1BKQorCQkJc3ltX2ludF9tYSAobnApOworCQkvKiBObyBwaGFzZSBtaXNtYXRjaCBvY2N1cnJlZCAqLworCQllbHNlIHsKKwkJCXN5bV9zZXRfc2NyaXB0X2RwIChucCwgY3AsIGRzcCk7CisJCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgZGlzcGF0Y2gpKTsKKwkJfQorCX0KKwllbHNlIGlmIChwaGFzZSA9PSA3KQkvKiBXZSBkZWZpbml0ZWx5IGNhbm5vdCBoYW5kbGUgcGFyaXR5IGVycm9ycyAqLworI2lmIDEJCQkJLyogaW4gbWVzc2FnZS1pbiBwaGFzZSBkdWUgdG8gdGhlIHJlbGVjdGlvbiAgKi8KKwkJZ290byByZXNldF9hbGw7IC8qIHBhdGggYW5kIHZhcmlvdXMgbWVzc2FnZSBhbnRpY2lwYXRpb25zLiAgICovCisjZWxzZQorCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgY2xyYWNrKSk7CisjZW5kaWYKKwllbHNlCisJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBkaXNwYXRjaCkpOworCXJldHVybjsKKworcmVzZXRfYWxsOgorCXN5bV9zdGFydF9yZXNldChucCk7CisJcmV0dXJuOworfQorCisvKgorICogIGNoaXAgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHBoYXNlIGVycm9ycy4KKyAqCisgKiAgV2UgaGF2ZSB0byBjb25zdHJ1Y3QgYSBuZXcgdHJhbnNmZXIgZGVzY3JpcHRvciwKKyAqICB0byB0cmFuc2ZlciB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBibG9jay4KKyAqLworc3RhdGljIHZvaWQgc3ltX2ludF9tYSAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXUzMglkYmM7CisJdTMyCXJlc3Q7CisJdTMyCWRzcDsKKwl1MzIJZHNhOworCXUzMglueHRkc3A7CisJdTMyCSp2ZHNwOworCXUzMglvYWRyLCBvbGVuOworCXUzMgkqdGJscDsKKyAgICAgICAgdTMyCW5ld2NtZDsKKwl1X2ludAlkZWx0YTsKKwl1X2NoYXIJY21kOworCXVfY2hhcgloZmxhZ3MsIGhmbGFnczA7CisJc3RydWN0CXN5bV9wbWMgKnBtOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKworCWRzcAk9IElOTChucCwgbmNfZHNwKTsKKwlkYmMJPSBJTkwobnAsIG5jX2RiYyk7CisJZHNhCT0gSU5MKG5wLCBuY19kc2EpOworCisJY21kCT0gZGJjID4+IDI0OworCXJlc3QJPSBkYmMgJiAweGZmZmZmZjsKKwlkZWx0YQk9IDA7CisKKwkvKgorCSAqICBsb2NhdGUgbWF0Y2hpbmcgY3AgaWYgYW55LgorCSAqLworCWNwID0gc3ltX2NjYl9mcm9tX2RzYShucCwgZHNhKTsKKworCS8qCisJICogIERvbm5vdCB0YWtlIGludG8gYWNjb3VudCBkbWEgZmlmbyBhbmQgdmFyaW91cyBidWZmZXJzIGluIAorCSAqICBJTlBVVCBwaGFzZSBzaW5jZSB0aGUgY2hpcCBmbHVzaGVzIGV2ZXJ5dGhpbmcgYmVmb3JlIAorCSAqICByYWlzaW5nIHRoZSBNQSBpbnRlcnJ1cHQgZm9yIGludGVycnVwdGVkIElOUFVUIHBoYXNlcy4KKwkgKiAgRm9yIERBVEEgSU4gcGhhc2UsIHdlIHdpbGwgY2hlY2sgZm9yIHRoZSBTV0lERSBsYXRlci4KKwkgKi8KKwlpZiAoKGNtZCAmIDcpICE9IDEgJiYgKGNtZCAmIDcpICE9IDUpIHsKKwkJdV9jaGFyIHNzMCwgc3MyOworCisJCWlmIChucC0+ZmVhdHVyZXMgJiBGRV9ERkJDKQorCQkJZGVsdGEgPSBJTlcobnAsIG5jX2RmYmMpOworCQllbHNlIHsKKwkJCXUzMiBkZmlmbzsKKworCQkJLyoKKwkJCSAqIFJlYWQgREZJRk8sIENURVNUWzQtNl0gdXNpbmcgMSBQQ0kgYnVzIG93bmVyc2hpcC4KKwkJCSAqLworCQkJZGZpZm8gPSBJTkwobnAsIG5jX2RmaWZvKTsKKworCQkJLyoKKwkJCSAqICBDYWxjdWxhdGUgcmVtYWluaW5nIGJ5dGVzIGluIERNQSBmaWZvLgorCQkJICogIChDVEVTVDUgPSBkZmlmbyA+PiAxNikKKwkJCSAqLworCQkJaWYgKGRmaWZvICYgKERGUyA8PCAxNikpCisJCQkJZGVsdGEgPSAoKCgoZGZpZm8gPj4gOCkgJiAweDMwMCkgfAorCQkJCSAgICAgICAgICAoZGZpZm8gJiAweGZmKSkgLSByZXN0KSAmIDB4M2ZmOworCQkJZWxzZQorCQkJCWRlbHRhID0gKChkZmlmbyAmIDB4ZmYpIC0gcmVzdCkgJiAweDdmOworCQl9CisKKwkJLyoKKwkJICogIFRoZSBkYXRhIGluIHRoZSBkbWEgZmlmbyBoYXMgbm90IGJlZW4gdHJhbnNmZXJlZCB0bworCQkgKiAgdGhlIHRhcmdldCAtPiBhZGQgdGhlIGFtb3VudCB0byB0aGUgcmVzdAorCQkgKiAgYW5kIGNsZWFyIHRoZSBkYXRhLgorCQkgKiAgQ2hlY2sgdGhlIHNzdGF0MiByZWdpc3RlciBpbiBjYXNlIG9mIHdpZGUgdHJhbnNmZXIuCisJCSAqLworCQlyZXN0ICs9IGRlbHRhOworCQlzczAgID0gSU5CKG5wLCBuY19zc3RhdDApOworCQlpZiAoc3MwICYgT0xGKSByZXN0Kys7CisJCWlmICghKG5wLT5mZWF0dXJlcyAmIEZFX0MxMCkpCisJCQlpZiAoc3MwICYgT1JGKSByZXN0Kys7CisJCWlmIChjcCAmJiAoY3AtPnBoeXMuc2VsZWN0LnNlbF9zY250bDMgJiBFV1MpKSB7CisJCQlzczIgPSBJTkIobnAsIG5jX3NzdGF0Mik7CisJCQlpZiAoc3MyICYgT0xGMSkgcmVzdCsrOworCQkJaWYgKCEobnAtPmZlYXR1cmVzICYgRkVfQzEwKSkKKwkJCQlpZiAoc3MyICYgT1JGMSkgcmVzdCsrOworCQl9CisKKwkJLyoKKwkJICogIENsZWFyIGZpZm9zLgorCQkgKi8KKwkJT1VUQihucCwgbmNfY3Rlc3QzLCBucC0+cnZfY3Rlc3QzIHwgQ0xGKTsJLyogZG1hIGZpZm8gICovCisJCU9VVEIobnAsIG5jX3N0ZXN0MywgVEV8Q1NGKTsJCS8qIHNjc2kgZmlmbyAqLworCX0KKworCS8qCisJICogIGxvZyB0aGUgaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAoREVCVUdfRkxBR1MgJiAoREVCVUdfVElOWXxERUJVR19QSEFTRSkpCisJCXByaW50ZiAoIlAleCV4IFJMPSVkIEQ9JWQgIiwgY21kJjcsIElOQihucCwgbmNfc2JjbCkmNywKKwkJCSh1bnNpZ25lZCkgcmVzdCwgKHVuc2lnbmVkKSBkZWx0YSk7CisKKwkvKgorCSAqICB0cnkgdG8gZmluZCB0aGUgaW50ZXJydXB0ZWQgc2NyaXB0IGNvbW1hbmQsCisJICogIGFuZCB0aGUgYWRkcmVzcyBhdCB3aGljaCB0byBjb250aW51ZS4KKwkgKi8KKwl2ZHNwCT0gTlVMTDsKKwlueHRkc3AJPSAwOworCWlmCShkc3AgPiAgbnAtPnNjcmlwdGFfYmEgJiYKKwkJIGRzcCA8PSBucC0+c2NyaXB0YV9iYSArIG5wLT5zY3JpcHRhX3N6KSB7CisJCXZkc3AgPSAodTMyICopKChjaGFyKilucC0+c2NyaXB0YTAgKyAoZHNwLW5wLT5zY3JpcHRhX2JhLTgpKTsKKwkJbnh0ZHNwID0gZHNwOworCX0KKwllbHNlIGlmCShkc3AgPiAgbnAtPnNjcmlwdGJfYmEgJiYKKwkJIGRzcCA8PSBucC0+c2NyaXB0Yl9iYSArIG5wLT5zY3JpcHRiX3N6KSB7CisJCXZkc3AgPSAodTMyICopKChjaGFyKilucC0+c2NyaXB0YjAgKyAoZHNwLW5wLT5zY3JpcHRiX2JhLTgpKTsKKwkJbnh0ZHNwID0gZHNwOworCX0KKworCS8qCisJICogIGxvZyB0aGUgaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19QSEFTRSkgeworCQlwcmludGYgKCJcbkNQPSVwIERTUD0leCBOWFQ9JXggVkRTUD0lcCBDTUQ9JXggIiwKKwkJCWNwLCAodW5zaWduZWQpZHNwLCAodW5zaWduZWQpbnh0ZHNwLCB2ZHNwLCBjbWQpOworCX0KKworCWlmICghdmRzcCkgeworCQlwcmludGYgKCIlczogaW50ZXJydXB0ZWQgU0NSSVBUIGFkZHJlc3Mgbm90IGZvdW5kLlxuIiwgCisJCQlzeW1fbmFtZSAobnApKTsKKwkJZ290byByZXNldF9hbGw7CisJfQorCisJaWYgKCFjcCkgeworCQlwcmludGYgKCIlczogU0NTSSBwaGFzZSBlcnJvciBmaXh1cDogQ0NCIGFscmVhZHkgZGVxdWV1ZWQuXG4iLCAKKwkJCXN5bV9uYW1lIChucCkpOworCQlnb3RvIHJlc2V0X2FsbDsKKwl9CisKKwkvKgorCSAqICBnZXQgb2xkIHN0YXJ0YWRkcmVzcyBhbmQgb2xkIGxlbmd0aC4KKwkgKi8KKwlvYWRyID0gc2NyX3RvX2NwdSh2ZHNwWzFdKTsKKworCWlmIChjbWQgJiAweDEwKSB7CS8qIFRhYmxlIGluZGlyZWN0ICovCisJCXRibHAgPSAodTMyICopICgoY2hhciopICZjcC0+cGh5cyArIG9hZHIpOworCQlvbGVuID0gc2NyX3RvX2NwdSh0YmxwWzBdKTsKKwkJb2FkciA9IHNjcl90b19jcHUodGJscFsxXSk7CisJfSBlbHNlIHsKKwkJdGJscCA9ICh1MzIgKikgMDsKKwkJb2xlbiA9IHNjcl90b19jcHUodmRzcFswXSkgJiAweGZmZmZmZjsKKwl9CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19QSEFTRSkgeworCQlwcmludGYgKCJPQ01EPSV4XG5UQkxQPSVwIE9MRU49JXggT0FEUj0leFxuIiwKKwkJCSh1bnNpZ25lZCkgKHNjcl90b19jcHUodmRzcFswXSkgPj4gMjQpLAorCQkJdGJscCwKKwkJCSh1bnNpZ25lZCkgb2xlbiwKKwkJCSh1bnNpZ25lZCkgb2Fkcik7CisJfQorCisJLyoKKwkgKiAgY2hlY2sgY21kIGFnYWluc3QgYXNzdW1lZCBpbnRlcnJ1cHRlZCBzY3JpcHQgY29tbWFuZC4KKwkgKiAgSWYgZHQgZGF0YSBwaGFzZSwgdGhlIE1PVkUgaW5zdHJ1Y3Rpb24gaGFzbid0IGJpdCA0IG9mIAorCSAqICB0aGUgcGhhc2UuCisJICovCisJaWYgKCgoY21kICYgMikgPyBjbWQgOiAoY21kICYgfjQpKSAhPSAoc2NyX3RvX2NwdSh2ZHNwWzBdKSA+PiAyNCkpIHsKKwkJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwKKwkJCSJpbnRlcm5hbCBlcnJvcjogY21kPSUwMnggIT0gJTAyeD0odmRzcFswXSA+PiAyNClcbiIsCisJCQljbWQsIHNjcl90b19jcHUodmRzcFswXSkgPj4gMjQpOworCisJCWdvdG8gcmVzZXRfYWxsOworCX0KKworCS8qCisJICogIGlmIG9sZCBwaGFzZSBub3QgZGF0YXBoYXNlLCBsZWF2ZSBoZXJlLgorCSAqLworCWlmIChjbWQgJiAyKSB7CisJCXN5bV9wcmludF9hZGRyKGNwLT5jbWQsCisJCQkicGhhc2UgY2hhbmdlICV4LSV4ICVkQCUwOHggcmVzaWQ9JWQuXG4iLAorCQkJY21kJjcsIElOQihucCwgbmNfc2JjbCkmNywgKHVuc2lnbmVkKW9sZW4sCisJCQkodW5zaWduZWQpb2FkciwgKHVuc2lnbmVkKXJlc3QpOworCQlnb3RvIHVuZXhwZWN0ZWRfcGhhc2U7CisJfQorCisJLyoKKwkgKiAgQ2hvb3NlIHRoZSBjb3JyZWN0IFBNIHNhdmUgYXJlYS4KKwkgKgorCSAqICBMb29rIGF0IHRoZSBQTV9TQVZFIFNDUklQVCBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIAorCSAqICB0aGlzIHN0dWZmLiBUaGUgZXF1aXZhbGVudCBjb2RlIGlzIGltcGxlbWVudGVkIGluIAorCSAqICBTQ1JJUFRTIGZvciB0aGUgODk1QSwgODk2IGFuZCAxMDEwIHRoYXQgYXJlIGFibGUgdG8gCisJICogIGhhbmRsZSBQTSBmcm9tIHRoZSBTQ1JJUFRTIHByb2Nlc3Nvci4KKwkgKi8KKwloZmxhZ3MwID0gSU5CKG5wLCBIRl9QUlQpOworCWhmbGFncyA9IGhmbGFnczA7CisKKwlpZiAoaGZsYWdzICYgKEhGX0lOX1BNMCB8IEhGX0lOX1BNMSB8IEhGX0RQX1NBVkVEKSkgeworCQlpZiAoaGZsYWdzICYgSEZfSU5fUE0wKQorCQkJbnh0ZHNwID0gc2NyX3RvX2NwdShjcC0+cGh5cy5wbTAucmV0KTsKKwkJZWxzZSBpZgkoaGZsYWdzICYgSEZfSU5fUE0xKQorCQkJbnh0ZHNwID0gc2NyX3RvX2NwdShjcC0+cGh5cy5wbTEucmV0KTsKKworCQlpZiAoaGZsYWdzICYgSEZfRFBfU0FWRUQpCisJCQloZmxhZ3MgXj0gSEZfQUNUX1BNOworCX0KKworCWlmICghKGhmbGFncyAmIEhGX0FDVF9QTSkpIHsKKwkJcG0gPSAmY3AtPnBoeXMucG0wOworCQluZXdjbWQgPSBTQ1JJUFRBX0JBKG5wLCBwbTBfZGF0YSk7CisJfQorCWVsc2UgeworCQlwbSA9ICZjcC0+cGh5cy5wbTE7CisJCW5ld2NtZCA9IFNDUklQVEFfQkEobnAsIHBtMV9kYXRhKTsKKwl9CisKKwloZmxhZ3MgJj0gfihIRl9JTl9QTTAgfCBIRl9JTl9QTTEgfCBIRl9EUF9TQVZFRCk7CisJaWYgKGhmbGFncyAhPSBoZmxhZ3MwKQorCQlPVVRCKG5wLCBIRl9QUlQsIGhmbGFncyk7CisKKwkvKgorCSAqICBmaWxsaW4gdGhlIHBoYXNlIG1pc21hdGNoIGNvbnRleHQKKwkgKi8KKwlwbS0+c2cuYWRkciA9IGNwdV90b19zY3Iob2FkciArIG9sZW4gLSByZXN0KTsKKwlwbS0+c2cuc2l6ZSA9IGNwdV90b19zY3IocmVzdCk7CisJcG0tPnJldCAgICAgPSBjcHVfdG9fc2NyKG54dGRzcCk7CisKKwkvKgorCSAqICBJZiB3ZSBoYXZlIGEgU1dJREUsCisJICogIC0gcHJlcGFyZSB0aGUgYWRkcmVzcyB0byB3cml0ZSB0aGUgU1dJREUgZnJvbSBTQ1JJUFRTLAorCSAqICAtIGNvbXB1dGUgdGhlIFNDUklQVFMgYWRkcmVzcyB0byByZXN0YXJ0IGZyb20sCisJICogIC0gbW92ZSBjdXJyZW50IGRhdGEgcG9pbnRlciBjb250ZXh0IGJ5IG9uZSBieXRlLgorCSAqLworCW54dGRzcCA9IFNDUklQVEFfQkEobnAsIGRpc3BhdGNoKTsKKwlpZiAoKGNtZCAmIDcpID09IDEgJiYgY3AgJiYgKGNwLT5waHlzLnNlbGVjdC5zZWxfc2NudGwzICYgRVdTKSAmJgorCSAgICAoSU5CKG5wLCBuY19zY250bDIpICYgV1NSKSkgeworCQl1MzIgdG1wOworCisJCS8qCisJCSAqICBTZXQgdXAgdGhlIHRhYmxlIGluZGlyZWN0IGZvciB0aGUgTU9WRQorCQkgKiAgb2YgdGhlIHJlc2lkdWFsIGJ5dGUgYW5kIGFkanVzdCB0aGUgZGF0YSAKKwkJICogIHBvaW50ZXIgY29udGV4dC4KKwkJICovCisJCXRtcCA9IHNjcl90b19jcHUocG0tPnNnLmFkZHIpOworCQljcC0+cGh5cy53cmVzaWQuYWRkciA9IGNwdV90b19zY3IodG1wKTsKKwkJcG0tPnNnLmFkZHIgPSBjcHVfdG9fc2NyKHRtcCArIDEpOworCQl0bXAgPSBzY3JfdG9fY3B1KHBtLT5zZy5zaXplKTsKKwkJY3AtPnBoeXMud3Jlc2lkLnNpemUgPSBjcHVfdG9fc2NyKCh0bXAmMHhmZjAwMDAwMCkgfCAxKTsKKwkJcG0tPnNnLnNpemUgPSBjcHVfdG9fc2NyKHRtcCAtIDEpOworCisJCS8qCisJCSAqICBJZiBvbmx5IHRoZSByZXNpZHVhbCBieXRlIGlzIHRvIGJlIG1vdmVkLCAKKwkJICogIG5vIFBNIGNvbnRleHQgaXMgbmVlZGVkLgorCQkgKi8KKwkJaWYgKCh0bXAmMHhmZmZmZmYpID09IDEpCisJCQluZXdjbWQgPSBwbS0+cmV0OworCisJCS8qCisJCSAqICBQcmVwYXJlIHRoZSBhZGRyZXNzIG9mIFNDUklQVFMgdGhhdCB3aWxsIAorCQkgKiAgbW92ZSB0aGUgcmVzaWR1YWwgYnl0ZSB0byBtZW1vcnkuCisJCSAqLworCQlueHRkc3AgPSBTQ1JJUFRCX0JBKG5wLCB3c3JfbWFfaGVscGVyKTsKKwl9CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19QSEFTRSkgeworCQlzeW1fcHJpbnRfYWRkcihjcC0+Y21kLCAiUE0gJXggJXggJXggLyAleCAleCAleC5cbiIsCisJCQloZmxhZ3MwLCBoZmxhZ3MsIG5ld2NtZCwKKwkJCSh1bnNpZ25lZClzY3JfdG9fY3B1KHBtLT5zZy5hZGRyKSwKKwkJCSh1bnNpZ25lZClzY3JfdG9fY3B1KHBtLT5zZy5zaXplKSwKKwkJCSh1bnNpZ25lZClzY3JfdG9fY3B1KHBtLT5yZXQpKTsKKwl9CisKKwkvKgorCSAqICBSZXN0YXJ0IHRoZSBTQ1JJUFRTIHByb2Nlc3Nvci4KKwkgKi8KKwlzeW1fc2V0X3NjcmlwdF9kcCAobnAsIGNwLCBuZXdjbWQpOworCU9VVExfRFNQKG5wLCBueHRkc3ApOworCXJldHVybjsKKworCS8qCisJICogIFVuZXhwZWN0ZWQgcGhhc2UgY2hhbmdlcyB0aGF0IG9jY3VycyB3aGVuIHRoZSBjdXJyZW50IHBoYXNlIAorCSAqICBpcyBub3QgYSBEQVRBIElOIG9yIERBVEEgT1VUIHBoYXNlIGFyZSBkdWUgdG8gZXJyb3IgY29uZGl0aW9ucy4KKwkgKiAgU3VjaCBldmVudCBtYXkgb25seSBoYXBwZW4gd2hlbiB0aGUgU0NSSVBUUyBpcyB1c2luZyBhIAorCSAqICBtdWx0aWJ5dGUgU0NTSSBNT1ZFLgorCSAqCisJICogIFBoYXNlIGNoYW5nZQkJU29tZSBwb3NzaWJsZSBjYXVzZQorCSAqCisJICogIENPTU1BTkQgIC0tPiBNU0cgSU4JU0NTSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgYnkgdGFyZ2V0LgorCSAqICBDT01NQU5EICAtLT4gU1RBVFVTCUJhZCBjb21tYW5kIG9yIHJlZnVzZWQgYnkgdGFyZ2V0LgorCSAqICBNU0cgT1VUICAtLT4gTVNHIElOICAgICBNZXNzYWdlIHJlamVjdGVkIGJ5IHRhcmdldC4KKwkgKiAgTVNHIE9VVCAgLS0+IENPTU1BTkQgICAgQm9ndXMgdGFyZ2V0IHRoYXQgZGlzY2FyZHMgZXh0ZW5kZWQKKwkgKiAgCQkJbmVnb3RpYXRpb24gbWVzc2FnZXMuCisJICoKKwkgKiAgVGhlIGNvZGUgYmVsb3cgZG9lcyBub3QgY2FyZSBvZiB0aGUgbmV3IHBoYXNlIGFuZCBzbyAKKwkgKiAgdHJ1c3RzIHRoZSB0YXJnZXQuIFdoeSB0byBhbm5veSBpdCA/CisJICogIElmIHRoZSBpbnRlcnJ1cHRlZCBwaGFzZSBpcyBDT01NQU5EIHBoYXNlLCB3ZSByZXN0YXJ0IGF0CisJICogIGRpc3BhdGNoZXIuCisJICogIElmIGEgdGFyZ2V0IGRvZXMgbm90IGdldCBhbGwgdGhlIG1lc3NhZ2VzIGFmdGVyIHNlbGVjdGlvbiwgCisJICogIHRoZSBjb2RlIGFzc3VtZXMgYmxpbmRseSB0aGF0IHRoZSB0YXJnZXQgZGlzY2FyZHMgZXh0ZW5kZWQgCisJICogIG1lc3NhZ2VzIGFuZCBjbGVhcnMgdGhlIG5lZ290aWF0aW9uIHN0YXR1cy4KKwkgKiAgSWYgdGhlIHRhcmdldCBkb2VzIG5vdCB3YW50IGFsbCBvdXIgcmVzcG9uc2UgdG8gbmVnb3RpYXRpb24sCisJICogIHdlIGZvcmNlIGEgU0lSX05FR09fUFJPVE8gaW50ZXJydXB0IChpdCBpcyBhIGhhY2sgdGhhdCBhdm9pZHMgCisJICogIGJsb2F0IGZvciBzdWNoIGEgc2hvdWxkX25vdF9oYXBwZW4gc2l0dWF0aW9uKS4KKwkgKiAgSW4gYWxsIG90aGVyIHNpdHVhdGlvbiwgd2UgcmVzZXQgdGhlIEJVUy4KKwkgKiAgQXJlIHRoZXNlIGFzc3VtcHRpb25zIHJlYXNvbm5hYmxlID8gKFdhaXQgYW5kIHNlZSAuLi4pCisJICovCit1bmV4cGVjdGVkX3BoYXNlOgorCWRzcCAtPSA4OworCW54dGRzcCA9IDA7CisKKwlzd2l0Y2ggKGNtZCAmIDcpIHsKKwljYXNlIDI6CS8qIENPTU1BTkQgcGhhc2UgKi8KKwkJbnh0ZHNwID0gU0NSSVBUQV9CQShucCwgZGlzcGF0Y2gpOworCQlicmVhazsKKyNpZiAwCisJY2FzZSAzOgkvKiBTVEFUVVMgIHBoYXNlICovCisJCW54dGRzcCA9IFNDUklQVEFfQkEobnAsIGRpc3BhdGNoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIDY6CS8qIE1TRyBPVVQgcGhhc2UgKi8KKwkJLyoKKwkJICogIElmIHRoZSBkZXZpY2UgbWF5IHdhbnQgdG8gdXNlIHVudGFnZ2VkIHdoZW4gd2Ugd2FudCAKKwkJICogIHRhZ2dlZCwgd2UgcHJlcGFyZSBhbiBJREVOVElGWSB3aXRob3V0IGRpc2MuIGdyYW50ZWQsIAorCQkgKiAgc2luY2Ugd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBoYW5kbGUgcmVzZWxlY3QuCisJCSAqICBPdGhlcndpc2UsIHdlIGp1c3QgZG9uJ3QgY2FyZS4KKwkJICovCisJCWlmCShkc3AgPT0gU0NSSVBUQV9CQShucCwgc2VuZF9pZGVudCkpIHsKKwkJCWlmIChjcC0+dGFnICE9IE5PX1RBRyAmJiBvbGVuIC0gcmVzdCA8PSAzKSB7CisJCQkJY3AtPmhvc3Rfc3RhdHVzID0gSFNfQlVTWTsKKwkJCQlucC0+bXNnb3V0WzBdID0gSURFTlRJRlkoMCwgY3AtPmx1bik7CisJCQkJbnh0ZHNwID0gU0NSSVBUQl9CQShucCwgaWRlbnRfYnJlYWtfYXRuKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlueHRkc3AgPSBTQ1JJUFRCX0JBKG5wLCBpZGVudF9icmVhayk7CisJCX0KKwkJZWxzZSBpZgkoZHNwID09IFNDUklQVEJfQkEobnAsIHNlbmRfd2R0cikgfHwKKwkJCSBkc3AgPT0gU0NSSVBUQl9CQShucCwgc2VuZF9zZHRyKSB8fAorCQkJIGRzcCA9PSBTQ1JJUFRCX0JBKG5wLCBzZW5kX3BwcikpIHsKKwkJCW54dGRzcCA9IFNDUklQVEJfQkEobnAsIG5lZ29fYmFkX3BoYXNlKTsKKwkJCWlmIChkc3AgPT0gU0NSSVBUQl9CQShucCwgc2VuZF9wcHIpKSB7CisJCQkJc3RydWN0IHNjc2lfZGV2aWNlICpkZXYgPSBjcC0+Y21kLT5kZXZpY2U7CisJCQkJZGV2LT5wcHIgPSAwOworCQkJfQorCQl9CisJCWJyZWFrOworI2lmIDAKKwljYXNlIDc6CS8qIE1TRyBJTiAgcGhhc2UgKi8KKwkJbnh0ZHNwID0gU0NSSVBUQV9CQShucCwgY2xyYWNrKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwlpZiAobnh0ZHNwKSB7CisJCU9VVExfRFNQKG5wLCBueHRkc3ApOworCQlyZXR1cm47CisJfQorCityZXNldF9hbGw6CisJc3ltX3N0YXJ0X3Jlc2V0KG5wKTsKK30KKworLyoKKyAqICBjaGlwIGludGVycnVwdCBoYW5kbGVyCisgKgorICogIEluIG5vcm1hbCBzaXR1YXRpb25zLCBpbnRlcnJ1cHQgY29uZGl0aW9ucyBvY2N1ciBvbmUgYXQgCisgKiAgYSB0aW1lLiBCdXQgd2hlbiBzb21ldGhpbmcgYmFkIGhhcHBlbnMgb24gdGhlIFNDU0kgQlVTLCAKKyAqICB0aGUgY2hpcCBtYXkgcmFpc2Ugc2V2ZXJhbCBpbnRlcnJ1cHQgZmxhZ3MgYmVmb3JlIAorICogIHN0b3BwaW5nIGFuZCBpbnRlcnJ1cHRpbmcgdGhlIENQVS4gVGhlIGFkZGl0aW9ubmFsIAorICogIGludGVycnVwdCBmbGFncyBhcmUgc3RhY2tlZCBpbiBzb21lIGV4dHJhIHJlZ2lzdGVycyAKKyAqICBhZnRlciB0aGUgU0lQIGFuZC9vciBESVAgZmxhZyBoYXMgYmVlbiByYWlzZWQgaW4gdGhlIAorICogIElTVEFULiBBZnRlciB0aGUgQ1BVIGhhcyByZWFkIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uIAorICogIGZsYWcgZnJvbSBTSVNUIG9yIERTVEFULCB0aGUgY2hpcCB1bnN0YWNrcyB0aGUgb3RoZXIgCisgKiAgaW50ZXJydXB0IGZsYWdzIGFuZCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgaW4gCisgKiAgU0lTVCBvciBEU1RBVC4gU2luY2UgdGhlIGNoaXAgc3RhcnRzIHN0YWNraW5nIG9uY2UgdGhlIAorICogIFNJUCBvciBESVAgZmxhZyBpcyBzZXQsIHRoZXJlIGlzIGEgc21hbGwgd2luZG93IG9mIHRpbWUgCisgKiAgd2hlcmUgdGhlIHN0YWNraW5nIGRvZXMgbm90IG9jY3VyLgorICoKKyAqICBUeXBpY2FsbHksIG11bHRpcGxlIGludGVycnVwdCBjb25kaXRpb25zIG1heSBoYXBwZW4gaW4gCisgKiAgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgorICoKKyAqICAtIFNDU0kgcGFyaXR5IGVycm9yICsgUGhhc2UgbWlzbWF0Y2ggIChQQVJ8TUEpCisgKiAgICBXaGVuIGFuIHBhcml0eSBlcnJvciBpcyBkZXRlY3RlZCBpbiBpbnB1dCBwaGFzZSAKKyAqICAgIGFuZCB0aGUgZGV2aWNlIHN3aXRjaGVzIHRvIG1zZy1pbiBwaGFzZSBpbnNpZGUgYSAKKyAqICAgIGJsb2NrIE1PVi4KKyAqICAtIFNDU0kgcGFyaXR5IGVycm9yICsgVW5leHBlY3RlZCBkaXNjb25uZWN0IChQQVJ8VURDKQorICogICAgV2hlbiBhIHN0dXBpZCBkZXZpY2UgZG9lcyBub3Qgd2FudCB0byBoYW5kbGUgdGhlIAorICogICAgcmVjb3Zlcnkgb2YgYW4gU0NTSSBwYXJpdHkgZXJyb3IuCisgKiAgLSBTb21lIGNvbWJpbmF0aW9ucyBvZiBTVE8sIFBBUiwgVURDLCAuLi4KKyAqICAgIFdoZW4gdXNpbmcgbm9uIGNvbXBsaWFudCBTQ1NJIHN0dWZmLCB3aGVuIHVzZXIgaXMgCisgKiAgICBkb2luZyBub24gY29tcGxpYW50IGhvdCB0YW1wZXJpbmcgb24gdGhlIEJVUywgd2hlbiAKKyAqICAgIHNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbnMgdG8gYSBkZXZpY2UsIGV0YyAuLi4KKyAqCisgKiAgVGhlIGhldXJpc3RpYyBzdWdnZXN0ZWQgYnkgU1lNQklPUyB0byBoYW5kbGUgCisgKiAgbXVsdGlwbGUgaW50ZXJydXB0cyBpcyB0byB0cnkgdW5zdGFja2luZyBhbGwgCisgKiAgaW50ZXJydXB0cyBjb25kaXRpb25zIGFuZCB0byBoYW5kbGUgdGhlbSBvbiBzb21lIAorICogIHByaW9yaXR5IGJhc2VkIG9uIGVycm9yIHNldmVyaXR5LgorICogIFRoaXMgd2lsbCB3b3JrIHdoZW4gdGhlIHVuc3RhY2tpbmcgaGFzIGJlZW4gCisgKiAgc3VjY2Vzc2Z1bCwgYnV0IHdlIGNhbm5vdCBiZSAxMDAgJSBzdXJlIG9mIHRoYXQsIAorICogIHNpbmNlIHRoZSBDUFUgbWF5IGhhdmUgYmVlbiBmYXN0ZXIgdG8gdW5zdGFjayB0aGFuIAorICogIHRoZSBjaGlwIGlzIGFibGUgdG8gc3RhY2suIEhtbW0gLi4uIEJ1dCBpdCBzZWVtcyB0aGF0IAorICogIHN1Y2ggYSBzaXR1YXRpb24gaXMgdmVyeSB1bmxpa2VseSB0byBoYXBwZW4uCisgKgorICogIElmIHRoaXMgaGFwcGVuLCBmb3IgZXhhbXBsZSBTVE8gY2F1Z2h0IGJ5IHRoZSBDUFUgCisgKiAgdGhlbiBVREMgaGFwcGVubmluZyBiZWZvcmUgdGhlIENQVSBoYXZlIHJlc3RhcnRlZCAKKyAqICB0aGUgU0NSSVBUUywgdGhlIGRyaXZlciBtYXkgd3JvbmdseSBjb21wbGV0ZSB0aGUgCisgKiAgc2FtZSBjb21tYW5kIG9uIFVEQywgc2luY2UgdGhlIFNDUklQVFMgZGlkbid0IHJlc3RhcnQgCisgKiAgYW5kIHRoZSBEU0Egc3RpbGwgcG9pbnRzIHRvIHRoZSBzYW1lIGNvbW1hbmQuCisgKiAgV2UgYXZvaWQgdGhpcyBzaXR1YXRpb24gYnkgc2V0dGluZyB0aGUgRFNBIHRvIGFuIAorICogIGludmFsaWQgdmFsdWUgd2hlbiB0aGUgQ0NCIGlzIGNvbXBsZXRlZCBhbmQgYmVmb3JlIAorICogIHJlc3RhcnRpbmcgdGhlIFNDUklQVFMuCisgKgorICogIEFub3RoZXIgaXNzdWUgaXMgdGhhdCB3ZSBuZWVkIHNvbWUgc2VjdGlvbiBvZiBvdXIgCisgKiAgcmVjb3ZlcnkgcHJvY2VkdXJlcyB0byBiZSBzb21laG93IHVuaW50ZXJydXB0aWJsZSBidXQgCisgKiAgdGhlIFNDUklQVFMgcHJvY2Vzc29yIGRvZXMgbm90IHByb3ZpZGVzIHN1Y2ggYSAKKyAqICBmZWF0dXJlLiBGb3IgdGhpcyByZWFzb24sIHdlIGhhbmRsZSByZWNvdmVyeSBwcmVmZXJlbnRseSAKKyAqICBmcm9tIHRoZSBDIGNvZGUgYW5kIGNoZWNrIGFnYWluc3Qgc29tZSBTQ1JJUFRTIGNyaXRpY2FsIAorICogIHNlY3Rpb25zIGZyb20gdGhlIEMgY29kZS4KKyAqCisgKiAgSG9wZWZ1bGx5LCB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIG9mIHRoZSBkcml2ZXIgaXMgbm93IAorICogIGFibGUgdG8gcmVzaXN0IHRvIHdlaXJkIEJVUyBlcnJvciBjb25kaXRpb25zLCBidXQgZG9ubm90IAorICogIGFzayBtZSBmb3IgYW55IGd1YXJhbnRlZSB0aGF0IGl0IHdpbGwgbmV2ZXIgZmFpbC4gOi0pCisgKiAgVXNlIGF0IHlvdXIgb3duIGRlY2lzaW9uIGFuZCByaXNrLgorICovCisKK3ZvaWQgc3ltX2ludGVycnVwdCAoc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXVfY2hhcglpc3RhdCwgaXN0YXRjOworCXVfY2hhcglkc3RhdDsKKwl1X3Nob3J0CXNpc3Q7CisKKwkvKgorCSAqICBpbnRlcnJ1cHQgb24gdGhlIGZseSA/CisJICogIChTQ1JJUFRTIG1heSBzdGlsbCBiZSBydW5uaW5nKQorCSAqCisJICogIEEgYGR1bW15IHJlYWQnIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgCisJICogIGNsZWFyIG9mIHRoZSBJTlRGIGZsYWcgcmVhY2hlcyB0aGUgZGV2aWNlIAorCSAqICBhbmQgdGhhdCBwb3N0ZWQgd3JpdGVzIGFyZSBmbHVzaGVkIHRvIG1lbW9yeQorCSAqICBiZWZvcmUgdGhlIHNjYW5uaW5nIG9mIHRoZSBET05FIHF1ZXVlLgorCSAqICBOb3RlIHRoYXQgU0NSSVBUUyBhbHNvIChkdW1teSkgcmVhZCB0byBtZW1vcnkgCisJICogIHByaW9yIHRvIGRlbGl2ZXIgdGhlIElOVEYgaW50ZXJydXB0IGNvbmRpdGlvbi4KKwkgKi8KKwlpc3RhdCA9IElOQihucCwgbmNfaXN0YXQpOworCWlmIChpc3RhdCAmIElOVEYpIHsKKwkJT1VUQihucCwgbmNfaXN0YXQsIChpc3RhdCAmIFNJR1ApIHwgSU5URiB8IG5wLT5pc3RhdF9zZW0pOworCQlpc3RhdCA9IElOQihucCwgbmNfaXN0YXQpOwkJLyogRFVNTVkgUkVBRCAqLworCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGYgKCJGICIpOworCQlzeW1fd2FrZXVwX2RvbmUobnApOworCX0KKworCWlmICghKGlzdGF0ICYgKFNJUHxESVApKSkKKwkJcmV0dXJuOworCisjaWYgMAkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IHRoaXMgb25lICovCisJaWYgKGlzdGF0ICYgQ0FCUlQpCisJCU9VVEIobnAsIG5jX2lzdGF0LCBDQUJSVCk7CisjZW5kaWYKKworCS8qCisJICogIFBBUiBhbmQgTUEgaW50ZXJydXB0cyBtYXkgb2NjdXIgYXQgdGhlIHNhbWUgdGltZSwKKwkgKiAgYW5kIHdlIG5lZWQgdG8ga25vdyBvZiBib3RoIGluIG9yZGVyIHRvIGhhbmRsZSAKKwkgKiAgdGhpcyBzaXR1YXRpb24gcHJvcGVybHkuIFdlIHRyeSB0byB1bnN0YWNrIFNDU0kgCisJICogIGludGVycnVwdHMgZm9yIHRoYXQgcmVhc29uLiBCVFcsIEkgZGlzbGlrZSBhIExPVCAKKwkgKiAgc3VjaCBhIGxvb3AgaW5zaWRlIHRoZSBpbnRlcnJ1cHQgcm91dGluZS4KKwkgKiAgRXZlbiBpZiBETUEgaW50ZXJydXB0IHN0YWNraW5nIGlzIHZlcnkgdW5saWtlbHkgdG8gCisJICogIGhhcHBlbiwgd2UgYWxzbyB0cnkgdW5zdGFja2luZyB0aGVzZSBvbmVzLCBzaW5jZSAKKwkgKiAgdGhpcyBoYXMgbm8gcGVyZm9ybWFuY2UgaW1wYWN0LgorCSAqLworCXNpc3QJPSAwOworCWRzdGF0CT0gMDsKKwlpc3RhdGMJPSBpc3RhdDsKKwlkbyB7CisJCWlmIChpc3RhdGMgJiBTSVApCisJCQlzaXN0ICB8PSBJTlcobnAsIG5jX3Npc3QpOworCQlpZiAoaXN0YXRjICYgRElQKQorCQkJZHN0YXQgfD0gSU5CKG5wLCBuY19kc3RhdCk7CisJCWlzdGF0YyA9IElOQihucCwgbmNfaXN0YXQpOworCQlpc3RhdCB8PSBpc3RhdGM7CisJfSB3aGlsZSAoaXN0YXRjICYgKFNJUHxESVApKTsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RJTlkpCisJCXByaW50ZiAoIjwlZHwleDoleHwleDoleD4iLAorCQkJKGludClJTkIobnAsIG5jX3NjcjApLAorCQkJZHN0YXQsc2lzdCwKKwkJCSh1bnNpZ25lZClJTkwobnAsIG5jX2RzcCksCisJCQkodW5zaWduZWQpSU5MKG5wLCBuY19kYmMpKTsKKwkvKgorCSAqICBPbiBwYXBlciwgYSBtZW1vcnkgcmVhZCBiYXJyaWVyIG1heSBiZSBuZWVkZWQgaGVyZSB0byAKKwkgKiAgcHJldmVudCBvdXQgb2Ygb3JkZXIgTE9BRHMgYnkgdGhlIENQVSBmcm9tIGhhdmluZyAKKwkgKiAgcHJlZmV0Y2hlZCBzdGFsZSBkYXRhIHByaW9yIHRvIERNQSBoYXZpbmcgb2NjdXJyZWQuCisJICogIEFuZCBzaW5jZSB3ZSBhcmUgcGFyYW5vaWQgLi4uIDopCisJICovCisJTUVNT1JZX1JFQURfQkFSUklFUigpOworCisJLyoKKwkgKiAgRmlyc3QsIGludGVycnVwdHMgd2Ugd2FudCB0byBzZXJ2aWNlIGNsZWFubHkuCisJICoKKwkgKiAgUGhhc2UgbWlzbWF0Y2ggKE1BKSBpcyB0aGUgbW9zdCBmcmVxdWVudCBpbnRlcnJ1cHQgCisJICogIGZvciBjaGlwIGVhcmxpZXIgdGhhbiB0aGUgODk2IGFuZCBzbyB3ZSBoYXZlIHRvIHNlcnZpY2UgCisJICogIGl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCisJICogIEEgU0NTSSBwYXJpdHkgZXJyb3IgKFBBUikgbWF5IGJlIGNvbWJpbmVkIHdpdGggYSBwaGFzZSAKKwkgKiAgbWlzbWF0Y2ggY29uZGl0aW9uIChNQSkuCisJICogIFByb2dyYW1tZWQgaW50ZXJydXB0cyAoU0lSKSBhcmUgdXNlZCB0byBjYWxsIHRoZSBDIGNvZGUgCisJICogIGZyb20gU0NSSVBUUy4KKwkgKiAgVGhlIHNpbmdsZSBzdGVwIGludGVycnVwdCAoU1NJKSBpcyBub3QgdXNlZCBpbiB0aGlzIAorCSAqICBkcml2ZXIuCisJICovCisJaWYgKCEoc2lzdCAgJiAoU1RPfEdFTnxIVEh8U0dFfFVEQ3xTQk1DfFJTVCkpICYmCisJICAgICEoZHN0YXQgJiAoTURQRXxCRnxBQlJUfElJRCkpKSB7CisJCWlmCShzaXN0ICYgUEFSKQlzeW1faW50X3BhciAobnAsIHNpc3QpOworCQllbHNlIGlmIChzaXN0ICYgTUEpCXN5bV9pbnRfbWEgKG5wKTsKKwkJZWxzZSBpZiAoZHN0YXQgJiBTSVIpCXN5bV9pbnRfc2lyIChucCk7CisJCWVsc2UgaWYgKGRzdGF0ICYgU1NJKQlPVVRPTkJfU1REKCk7CisJCWVsc2UJCQlnb3RvIHVua25vd25faW50OworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgTm93LCBpbnRlcnJ1cHRzIHRoYXQgZG9ubm90IGhhcHBlbiBpbiBub3JtYWwgCisJICogIHNpdHVhdGlvbnMgYW5kIHRoYXQgd2UgbWF5IG5lZWQgdG8gcmVjb3ZlciBmcm9tLgorCSAqCisJICogIE9uIFNDU0kgUkVTRVQgKFJTVCksIHdlIHJlc2V0IGV2ZXJ5dGhpbmcuCisJICogIE9uIFNDU0kgQlVTIE1PREUgQ0hBTkdFIChTQk1DKSwgd2UgY29tcGxldGUgYWxsIAorCSAqICBhY3RpdmUgQ0NCcyB3aXRoIFJFU0VUIHN0YXR1cywgcHJlcGFyZSBhbGwgZGV2aWNlcyAKKwkgKiAgZm9yIG5lZ290aWF0aW5nIGFnYWluIGFuZCByZXN0YXJ0IHRoZSBTQ1JJUFRTLgorCSAqICBPbiBTVE8gYW5kIFVEQywgd2UgY29tcGxldGUgdGhlIENDQiB3aXRoIHRoZSBjb3JyZXMtIAorCSAqICBwb25kaW5nIHN0YXR1cyBhbmQgcmVzdGFydCB0aGUgU0NSSVBUUy4KKwkgKi8KKwlpZiAoc2lzdCAmIFJTVCkgeworCQlwcmludGYoIiVzOiBTQ1NJIEJVUyByZXNldCBkZXRlY3RlZC5cbiIsIHN5bV9uYW1lKG5wKSk7CisJCXN5bV9zdGFydF91cCAobnAsIDEpOworCQlyZXR1cm47CisJfQorCisJT1VUQihucCwgbmNfY3Rlc3QzLCBucC0+cnZfY3Rlc3QzIHwgQ0xGKTsJLyogY2xlYXIgZG1hIGZpZm8gICovCisJT1VUQihucCwgbmNfc3Rlc3QzLCBURXxDU0YpOwkJLyogY2xlYXIgc2NzaSBmaWZvICovCisKKwlpZiAoIShzaXN0ICAmIChHRU58SFRIfFNHRSkpICYmCisJICAgICEoZHN0YXQgJiAoTURQRXxCRnxBQlJUfElJRCkpKSB7CisJCWlmCShzaXN0ICYgU0JNQykJc3ltX2ludF9zYm1jIChucCk7CisJCWVsc2UgaWYgKHNpc3QgJiBTVE8pCXN5bV9pbnRfc3RvIChucCk7CisJCWVsc2UgaWYgKHNpc3QgJiBVREMpCXN5bV9pbnRfdWRjIChucCk7CisJCWVsc2UJCQlnb3RvIHVua25vd25faW50OworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgTm93LCBpbnRlcnJ1cHRzIHdlIGFyZSBub3QgYWJsZSB0byByZWNvdmVyIGNsZWFubHkuCisJICoKKwkgKiAgTG9nIG1lc3NhZ2UgZm9yIGhhcmQgZXJyb3JzLgorCSAqICBSZXNldCBldmVyeXRoaW5nLgorCSAqLworCisJc3ltX2xvZ19oYXJkX2Vycm9yKG5wLCBzaXN0LCBkc3RhdCk7CisKKwlpZiAoKHNpc3QgJiAoR0VOfEhUSHxTR0UpKSB8fAorCQkoZHN0YXQgJiAoTURQRXxCRnxBQlJUfElJRCkpKSB7CisJCXN5bV9zdGFydF9yZXNldChucCk7CisJCXJldHVybjsKKwl9CisKK3Vua25vd25faW50OgorCS8qCisJICogIFdlIGp1c3QgbWlzcyB0aGUgY2F1c2Ugb2YgdGhlIGludGVycnVwdC4gOigKKwkgKiAgUHJpbnQgYSBtZXNzYWdlLiBUaGUgdGltZW91dCB3aWxsIGRvIHRoZSByZWFsIHdvcmsuCisJICovCisJcHJpbnRmKAkiJXM6IHVua25vd24gaW50ZXJydXB0KHMpIGlnbm9yZWQsICIKKwkJIklTVEFUPTB4JXggRFNUQVQ9MHgleCBTSVNUPTB4JXhcbiIsCisJCXN5bV9uYW1lKG5wKSwgaXN0YXQsIGRzdGF0LCBzaXN0KTsKK30KKworLyoKKyAqICBEZXF1ZXVlIGZyb20gdGhlIFNUQVJUIHF1ZXVlIGFsbCBDQ0JzIHRoYXQgbWF0Y2ggCisgKiAgYSBnaXZlbiB0YXJnZXQvbHVuL3Rhc2sgY29uZGl0aW9uICgtMSBtZWFucyBhbGwpLAorICogIGFuZCBtb3ZlIHRoZW0gZnJvbSB0aGUgQlVTWSBxdWV1ZSB0byB0aGUgQ09NUCBxdWV1ZSAKKyAqICB3aXRoIENBTV9SRVFVRVVFX1JFUSBzdGF0dXMgY29uZGl0aW9uLgorICogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBkdXJpbmcgZXJyb3IgaGFuZGxpbmcvcmVjb3ZlcnkuCisgKiAgSXQgaXMgY2FsbGVkIHdpdGggU0NSSVBUUyBub3QgcnVubmluZy4KKyAqLworc3RhdGljIGludCAKK3N5bV9kZXF1ZXVlX2Zyb21fc3F1ZXVlKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGksIGludCB0YXJnZXQsIGludCBsdW4sIGludCB0YXNrKQoreworCWludCBqOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKworCS8qCisJICogIE1ha2Ugc3VyZSB0aGUgc3RhcnRpbmcgaW5kZXggaXMgd2l0aGluIHJhbmdlLgorCSAqLworCWFzc2VydCgoaSA+PSAwKSAmJiAoaSA8IDIqTUFYX1FVRVVFKSk7CisKKwkvKgorCSAqICBXYWxrIHVudGlsIGVuZCBvZiBTVEFSVCBxdWV1ZSBhbmQgZGVxdWV1ZSBldmVyeSBqb2IgCisJICogIHRoYXQgbWF0Y2hlcyB0aGUgdGFyZ2V0L2x1bi90YXNrIGNvbmRpdGlvbi4KKwkgKi8KKwlqID0gaTsKKwl3aGlsZSAoaSAhPSBucC0+c3F1ZXVlcHV0KSB7CisJCWNwID0gc3ltX2NjYl9mcm9tX2RzYShucCwgc2NyX3RvX2NwdShucC0+c3F1ZXVlW2ldKSk7CisJCWFzc2VydChjcCk7CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJCS8qIEZvcmdldCBoaW50cyBmb3IgSUFSQiwgdGhleSBtYXkgYmUgbm8gbG9uZ2VyIHJlbGV2YW50ICovCisJCWNwLT5ob3N0X2ZsYWdzICY9IH5IRl9ISU5UX0lBUkI7CisjZW5kaWYKKwkJaWYgKCh0YXJnZXQgPT0gLTEgfHwgY3AtPnRhcmdldCA9PSB0YXJnZXQpICYmCisJCSAgICAobHVuICAgID09IC0xIHx8IGNwLT5sdW4gICAgPT0gbHVuKSAgICAmJgorCQkgICAgKHRhc2sgICA9PSAtMSB8fCBjcC0+dGFnICAgID09IHRhc2spKSB7CisJCQlzeW1fc2V0X2NhbV9zdGF0dXMoY3AtPmNtZCwgQ0FNX1JFUVVFVUVfUkVRKTsKKwkJCXN5bV9yZW1xdWUoJmNwLT5saW5rX2NjYnEpOworCQkJc3ltX2luc3F1ZV90YWlsKCZjcC0+bGlua19jY2JxLCAmbnAtPmNvbXBfY2NicSk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoaSAhPSBqKQorCQkJCW5wLT5zcXVldWVbal0gPSBucC0+c3F1ZXVlW2ldOworCQkJaWYgKChqICs9IDIpID49IE1BWF9RVUVVRSoyKSBqID0gMDsKKwkJfQorCQlpZiAoKGkgKz0gMikgPj0gTUFYX1FVRVVFKjIpIGkgPSAwOworCX0KKwlpZiAoaSAhPSBqKQkJLyogQ29weSBiYWNrIHRoZSBpZGxlIHRhc2sgaWYgbmVlZGVkICovCisJCW5wLT5zcXVldWVbal0gPSBucC0+c3F1ZXVlW2ldOworCW5wLT5zcXVldWVwdXQgPSBqOwkvKiBVcGRhdGUgb3VyIGN1cnJlbnQgc3RhcnQgcXVldWUgcG9pbnRlciAqLworCisJcmV0dXJuIChpIC0gaikgLyAyOworfQorCisvKgorICogIGNoaXAgaGFuZGxlciBmb3IgYmFkIFNDU0kgc3RhdHVzIGNvbmRpdGlvbgorICoKKyAqICBJbiBjYXNlIG9mIGJhZCBTQ1NJIHN0YXR1cywgd2UgdW5xdWV1ZSBhbGwgdGhlIHRhc2tzIAorICogIGN1cnJlbnRseSBxdWV1ZWQgdG8gdGhlIGNvbnRyb2xsZXIgYnV0IG5vdCB5ZXQgc3RhcnRlZCAKKyAqICBhbmQgdGhlbiByZXN0YXJ0IHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBpbW1lZGlhdGVseS4KKyAqCisgKiAgUVVFVUUgRlVMTCBhbmQgQlVTWSBjb25kaXRpb25zIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4KKyAqICBCYXNpY2FsbHkgYWxsIHRoZSBub3QgeWV0IHN0YXJ0ZWQgdGFza3MgYXJlIHJlcXVldWVkIGluIAorICogIGRldmljZSBxdWV1ZSBhbmQgdGhlIHF1ZXVlIGlzIGZyb3plbiB1bnRpbCBhIGNvbXBsZXRpb24uCisgKgorICogIEZvciBDSEVDSyBDT05ESVRJT04gYW5kIENPTU1BTkQgVEVSTUlOQVRFRCBzdGF0dXMsIHdlIHVzZSAKKyAqICB0aGUgQ0NCIG9mIHRoZSBmYWlsZWQgY29tbWFuZCB0byBwcmVwYXJlIGEgUkVRVUVTVCBTRU5TRSAKKyAqICBTQ1NJIGNvbW1hbmQgYW5kIHF1ZXVlIGl0IHRvIHRoZSBjb250cm9sbGVyIHF1ZXVlLgorICoKKyAqICBTQ1JBVENIQSBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbiBsb2FkZWQgd2l0aCBTVEFSVFBPUyAKKyAqICBiZWZvcmUgdGhlIFNDUklQVFMgY2FsbGVkIHRoZSBDIGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9zaXJfYmFkX3Njc2lfc3RhdHVzKHN0cnVjdCBzeW1faGNiICpucCwgaW50IG51bSwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCXUzMgkJc3RhcnRwOworCXVfY2hhcgkJc19zdGF0dXMgPSBjcC0+c3Nzc19zdGF0dXM7CisJdV9jaGFyCQloX2ZsYWdzICA9IGNwLT5ob3N0X2ZsYWdzOworCWludAkJbXNnbGVuOworCWludAkJaTsKKworCS8qCisJICogIENvbXB1dGUgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGpvYiB0byBzdGFydCBmcm9tIFNDUklQVFMuCisJICovCisJaSA9IChJTkwobnAsIG5jX3NjcmF0Y2hhKSAtIG5wLT5zcXVldWVfYmEpIC8gNDsKKworCS8qCisJICogIFRoZSBsYXN0IENDQiBxdWV1ZWQgdXNlZCBmb3IgSUFSQiBoaW50IG1heSBiZSAKKwkgKiAgbm8gbG9uZ2VyIHJlbGV2YW50LiBGb3JnZXQgaXQuCisJICovCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJaWYgKG5wLT5sYXN0X2NwKQorCQlucC0+bGFzdF9jcCA9IDA7CisjZW5kaWYKKworCS8qCisJICogIE5vdyBkZWFsIHdpdGggdGhlIFNDU0kgc3RhdHVzLgorCSAqLworCXN3aXRjaChzX3N0YXR1cykgeworCWNhc2UgU19CVVNZOgorCWNhc2UgU19RVUVVRV9GVUxMOgorCQlpZiAoc3ltX3ZlcmJvc2UgPj0gMikgeworCQkJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwgIiVzXG4iLAorCQkJICAgICAgICBzX3N0YXR1cyA9PSBTX0JVU1kgPyAiQlVTWSIgOiAiUVVFVUUgRlVMTFxuIik7CisJCX0KKwlkZWZhdWx0OgkvKiBTX0lOVCwgU19JTlRfQ09ORF9NRVQsIFNfQ09ORkxJQ1QgKi8KKwkJc3ltX2NvbXBsZXRlX2Vycm9yIChucCwgY3ApOworCQlicmVhazsKKwljYXNlIFNfVEVSTUlOQVRFRDoKKwljYXNlIFNfQ0hFQ0tfQ09ORDoKKwkJLyoKKwkJICogIElmIHdlIGdldCBhbiBTQ1NJIGVycm9yIHdoZW4gcmVxdWVzdGluZyBzZW5zZSwgZ2l2ZSB1cC4KKwkJICovCisJCWlmIChoX2ZsYWdzICYgSEZfU0VOU0UpIHsKKwkJCXN5bV9jb21wbGV0ZV9lcnJvciAobnAsIGNwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIERlcXVldWUgYWxsIHF1ZXVlZCBDQ0JzIGZvciB0aGF0IGRldmljZSBub3QgeWV0IHN0YXJ0ZWQsCisJCSAqICBhbmQgcmVzdGFydCB0aGUgU0NSSVBUUyBwcm9jZXNzb3IgaW1tZWRpYXRlbHkuCisJCSAqLworCQlzeW1fZGVxdWV1ZV9mcm9tX3NxdWV1ZShucCwgaSwgY3AtPnRhcmdldCwgY3AtPmx1biwgLTEpOworCQlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgc3RhcnQpKTsKKworIAkJLyoKKwkJICogIFNhdmUgc29tZSBpbmZvIG9mIHRoZSBhY3R1YWwgSU8uCisJCSAqICBDb21wdXRlIHRoZSBkYXRhIHJlc2lkdWFsLgorCQkgKi8KKwkJY3AtPnN2X3Njc2lfc3RhdHVzID0gY3AtPnNzc3Nfc3RhdHVzOworCQljcC0+c3ZfeGVycl9zdGF0dXMgPSBjcC0+eGVycl9zdGF0dXM7CisJCWNwLT5zdl9yZXNpZCA9IHN5bV9jb21wdXRlX3Jlc2lkdWFsKG5wLCBjcCk7CisKKwkJLyoKKwkJICogIFByZXBhcmUgYWxsIG5lZWRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIAorCQkgKiAgcmVxdWVzdGluZyBzZW5zZSBkYXRhLgorCQkgKi8KKworCQljcC0+c2NzaV9zbXNnMlswXSA9IElERU5USUZZKDAsIGNwLT5sdW4pOworCQltc2dsZW4gPSAxOworCisJCS8qCisJCSAqICBJZiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIAorCQkgKiAgYXN5bmMuIDggYml0IGRhdGEgdHJhbnNmZXJzIHdpdGggdGhhdCB0YXJnZXQsCisJCSAqICBzdGFydCBhIG5lZ290aWF0aW9uLCBzaW5jZSB0aGUgZGV2aWNlIG1heSB3YW50IAorCQkgKiAgdG8gcmVwb3J0IHVzIGEgVU5JVCBBVFRFTlRJT04gY29uZGl0aW9uIGR1ZSB0byAKKwkJICogIGEgY2F1c2Ugd2UgY3VycmVudGx5IGlnbm9yZSwgYW5kIHdlIGRvbm5vdCB3YW50IAorCQkgKiAgdG8gYmUgc3R1Y2sgd2l0aCBXSURFIGFuZC9vciBTWU5DIGRhdGEgdHJhbnNmZXIuCisJCSAqCisJCSAqICBjcC0+bmVnb19zdGF0dXMgaXMgZmlsbGVkIGJ5IHN5bV9wcmVwYXJlX25lZ28oKS4KKwkJICovCisJCWNwLT5uZWdvX3N0YXR1cyA9IDA7CisJCW1zZ2xlbiArPSBzeW1fcHJlcGFyZV9uZWdvKG5wLCBjcCwgJmNwLT5zY3NpX3Ntc2cyW21zZ2xlbl0pOworCQkvKgorCQkgKiAgTWVzc2FnZSB0YWJsZSBpbmRpcmVjdCBzdHJ1Y3R1cmUuCisJCSAqLworCQljcC0+cGh5cy5zbXNnLmFkZHIJPSBjcHVfdG9fc2NyKENDQl9CQShjcCwgc2NzaV9zbXNnMikpOworCQljcC0+cGh5cy5zbXNnLnNpemUJPSBjcHVfdG9fc2NyKG1zZ2xlbik7CisKKwkJLyoKKwkJICogIHNlbnNlIGNvbW1hbmQKKwkJICovCisJCWNwLT5waHlzLmNtZC5hZGRyCT0gY3B1X3RvX3NjcihDQ0JfQkEoY3AsIHNlbnNlY21kKSk7CisJCWNwLT5waHlzLmNtZC5zaXplCT0gY3B1X3RvX3Njcig2KTsKKworCQkvKgorCQkgKiAgcGF0Y2ggcmVxdWVzdGVkIHNpemUgaW50byBzZW5zZSBjb21tYW5kCisJCSAqLworCQljcC0+c2Vuc2VjbWRbMF0JCT0gUkVRVUVTVF9TRU5TRTsKKwkJY3AtPnNlbnNlY21kWzFdCQk9IDA7CisJCWlmIChjcC0+Y21kLT5kZXZpY2UtPnNjc2lfbGV2ZWwgPD0gU0NTSV8yICYmIGNwLT5sdW4gPD0gNykKKwkJCWNwLT5zZW5zZWNtZFsxXQk9IGNwLT5sdW4gPDwgNTsKKwkJY3AtPnNlbnNlY21kWzRdCQk9IFNZTV9TTlNfQkJVRl9MRU47CisJCWNwLT5kYXRhX2xlbgkJPSBTWU1fU05TX0JCVUZfTEVOOworCisJCS8qCisJCSAqICBzZW5zZSBkYXRhCisJCSAqLworCQltZW1zZXQoY3AtPnNuc19iYnVmLCAwLCBTWU1fU05TX0JCVUZfTEVOKTsKKwkJY3AtPnBoeXMuc2Vuc2UuYWRkcgk9IGNwdV90b19zY3IoQ0NCX0JBKGNwLCBzbnNfYmJ1ZikpOworCQljcC0+cGh5cy5zZW5zZS5zaXplCT0gY3B1X3RvX3NjcihTWU1fU05TX0JCVUZfTEVOKTsKKworCQkvKgorCQkgKiAgcmVxdWV1ZSB0aGUgY29tbWFuZC4KKwkJICovCisJCXN0YXJ0cCA9IFNDUklQVEJfQkEobnAsIHNkYXRhX2luKTsKKworCQljcC0+cGh5cy5oZWFkLnNhdmVwCT0gY3B1X3RvX3NjcihzdGFydHApOworCQljcC0+cGh5cy5oZWFkLmxhc3RwCT0gY3B1X3RvX3NjcihzdGFydHApOworCQljcC0+c3RhcnRwCQk9IGNwdV90b19zY3Ioc3RhcnRwKTsKKwkJY3AtPmdvYWxwCQk9IGNwdV90b19zY3Ioc3RhcnRwICsgMTYpOworCisJCWNwLT5ob3N0X3hmbGFncyA9IDA7CisJCWNwLT5ob3N0X3N0YXR1cwk9IGNwLT5uZWdvX3N0YXR1cyA/IEhTX05FR09USUFURSA6IEhTX0JVU1k7CisJCWNwLT5zc3NzX3N0YXR1cyA9IFNfSUxMRUdBTDsKKwkJY3AtPmhvc3RfZmxhZ3MJPSAoSEZfU0VOU0V8SEZfREFUQV9JTik7CisJCWNwLT54ZXJyX3N0YXR1cyA9IDA7CisJCWNwLT5leHRyYV9ieXRlcyA9IDA7CisKKwkJY3AtPnBoeXMuaGVhZC5nby5zdGFydCA9IGNwdV90b19zY3IoU0NSSVBUQV9CQShucCwgc2VsZWN0KSk7CisKKwkJLyoKKwkJICogIFJlcXVldWUgdGhlIGNvbW1hbmQuCisJCSAqLworCQlzeW1fcHV0X3N0YXJ0X3F1ZXVlKG5wLCBjcCk7CisKKwkJLyoKKwkJICogIEdpdmUgYmFjayB0byB1cHBlciBsYXllciBldmVyeXRoaW5nIHdlIGhhdmUgZGVxdWV1ZWQuCisJCSAqLworCQlzeW1fZmx1c2hfY29tcF9xdWV1ZShucCwgMCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqICBBZnRlciBhIGRldmljZSBoYXMgYWNjZXB0ZWQgc29tZSBtYW5hZ2VtZW50IG1lc3NhZ2UgCisgKiAgYXMgQlVTIERFVklDRSBSRVNFVCwgQUJPUlQgVEFTSywgZXRjIC4uLiwgb3Igd2hlbiAKKyAqICBhIGRldmljZSBzaWduYWxzIGEgVU5JVCBBVFRFTlRJT04gY29uZGl0aW9uLCBzb21lIAorICogIHRhc2tzIGFyZSB0aHJvd24gYXdheSBieSB0aGUgZGV2aWNlLiBXZSBhcmUgcmVxdWlyZWQgCisgKiAgdG8gcmVmbGVjdCB0aGF0IG9uIG91ciB0YXNrcyBsaXN0IHNpbmNlIHRoZSBkZXZpY2UgCisgKiAgd2lsbCBuZXZlciBjb21wbGV0ZSB0aGVzZSB0YXNrcy4KKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBtb3ZlIGZyb20gdGhlIEJVU1kgcXVldWUgdG8gdGhlIENPTVAgCisgKiAgcXVldWUgYWxsIGRpc2Nvbm5lY3RlZCBDQ0JzIGZvciBhIGdpdmVuIHRhcmdldCB0aGF0IAorICogIG1hdGNoIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CisgKiAgLSBsdW49LTEgIG1lYW5zIGFueSBsb2dpY2FsIFVOSVQgb3RoZXJ3aXNlIGEgZ2l2ZW4gb25lLgorICogIC0gdGFzaz0tMSBtZWFucyBhbnkgdGFzaywgb3RoZXJ3aXNlIGEgZ2l2ZW4gb25lLgorICovCitpbnQgc3ltX2NsZWFyX3Rhc2tzKHN0cnVjdCBzeW1faGNiICpucCwgaW50IGNhbV9zdGF0dXMsIGludCB0YXJnZXQsIGludCBsdW4sIGludCB0YXNrKQoreworCVNZTV9RVUVIRUFEIHF0bXAsICpxcDsKKwlpbnQgaSA9IDA7CisJc3RydWN0IHN5bV9jY2IgKmNwOworCisJLyoKKwkgKiAgTW92ZSB0aGUgZW50aXJlIEJVU1kgcXVldWUgdG8gb3VyIHRlbXBvcmFyeSBxdWV1ZS4KKwkgKi8KKwlzeW1fcXVlX2luaXQoJnF0bXApOworCXN5bV9xdWVfc3BsaWNlKCZucC0+YnVzeV9jY2JxLCAmcXRtcCk7CisJc3ltX3F1ZV9pbml0KCZucC0+YnVzeV9jY2JxKTsKKworCS8qCisJICogIFB1dCBhbGwgQ0NCcyB0aGF0IG1hdGNoZXMgb3VyIGNyaXRlcmlhIGludG8gCisJICogIHRoZSBDT01QIHF1ZXVlIGFuZCBwdXQgYmFjayBvdGhlciBvbmVzIGludG8gCisJICogIHRoZSBCVVNZIHF1ZXVlLgorCSAqLworCXdoaWxlICgocXAgPSBzeW1fcmVtcXVlX2hlYWQoJnF0bXApKSAhPSAwKSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwkJY3AgPSBzeW1fcXVlX2VudHJ5KHFwLCBzdHJ1Y3Qgc3ltX2NjYiwgbGlua19jY2JxKTsKKwkJY21kID0gY3AtPmNtZDsKKwkJaWYgKGNwLT5ob3N0X3N0YXR1cyAhPSBIU19ESVNDT05ORUNUIHx8CisJCSAgICBjcC0+dGFyZ2V0ICE9IHRhcmdldAkgICAgIHx8CisJCSAgICAobHVuICAhPSAtMSAmJiBjcC0+bHVuICE9IGx1bikgICB8fAorCQkgICAgKHRhc2sgIT0gLTEgJiYgCisJCQkoY3AtPnRhZyAhPSBOT19UQUcgJiYgY3AtPnNjc2lfc21zZ1syXSAhPSB0YXNrKSkpIHsKKwkJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmtfY2NicSwgJm5wLT5idXN5X2NjYnEpOworCQkJY29udGludWU7CisJCX0KKwkJc3ltX2luc3F1ZV90YWlsKCZjcC0+bGlua19jY2JxLCAmbnAtPmNvbXBfY2NicSk7CisKKwkJLyogUHJlc2VydmUgdGhlIHNvZnR3YXJlIHRpbWVvdXQgY29uZGl0aW9uICovCisJCWlmIChzeW1fZ2V0X2NhbV9zdGF0dXMoY21kKSAhPSBDQU1fQ01EX1RJTUVPVVQpCisJCQlzeW1fc2V0X2NhbV9zdGF0dXMoY21kLCBjYW1fc3RhdHVzKTsKKwkJKytpOworI2lmIDAKK3ByaW50ZigiWFhYWCBUQVNLIEAlcCBDTEVBUkVEXG4iLCBjcCk7CisjZW5kaWYKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiAgY2hpcCBoYW5kbGVyIGZvciBUQVNLUyByZWNvdmVyeQorICoKKyAqICBXZSBjYW5ub3Qgc2FmZWx5IGFib3J0IGEgY29tbWFuZCwgd2hpbGUgdGhlIFNDUklQVFMgCisgKiAgcHJvY2Vzc29yIGlzIHJ1bm5pbmcsIHNpbmNlIHdlIGp1c3Qgd291bGQgYmUgaW4gcmFjZSAKKyAqICB3aXRoIGl0LgorICoKKyAqICBBcyBsb25nIGFzIHdlIGhhdmUgdGFza3MgdG8gYWJvcnQsIHdlIGtlZXAgdGhlIFNFTSAKKyAqICBiaXQgc2V0IGluIHRoZSBJU1RBVC4gV2hlbiB0aGlzIGJpdCBpcyBzZXQsIHRoZSAKKyAqICBTQ1JJUFRTIHByb2Nlc3NvciBpbnRlcnJ1cHRzIChTSVJfU0NSSVBUX1NUT1BQRUQpIAorICogIGVhY2ggdGltZSBpdCBlbnRlcnMgdGhlIHNjaGVkdWxlci4KKyAqCisgKiAgSWYgd2UgaGF2ZSB0byByZXNldCBhIHRhcmdldCwgY2xlYXIgdGFza3Mgb2YgYSB1bml0LAorICogIG9yIHRvIHBlcmZvcm0gdGhlIGFib3J0IG9mIGEgZGlzY29ubmVjdGVkIGpvYiwgd2UgCisgKiAgcmVzdGFydCB0aGUgU0NSSVBUUyBmb3Igc2VsZWN0aW5nIHRoZSB0YXJnZXQuIE9uY2UgCisgKiAgc2VsZWN0ZWQsIHRoZSBTQ1JJUFRTIGludGVycnVwdHMgKFNJUl9UQVJHRVRfU0VMRUNURUQpLgorICogIElmIGl0IGxvc2VzIGFyYml0cmF0aW9uLCB0aGUgU0NSSVBUUyB3aWxsIGludGVycnVwdCBhZ2FpbiAKKyAqICB0aGUgbmV4dCB0aW1lIGl0IHdpbGwgZW50ZXIgaXRzIHNjaGVkdWxlciwgYW5kIHNvIG9uIC4uLgorICoKKyAqICBPbiBTSVJfVEFSR0VUX1NFTEVDVEVELCB3ZSBzY2FuIGZvciB0aGUgbW9yZSAKKyAqICBhcHByb3ByaWF0ZSB0aGluZyB0byBkbzoKKyAqCisgKiAgLSBJZiBub3RoaW5nLCB3ZSBqdXN0IHNlbnQgYSBNX0FCT1JUIG1lc3NhZ2UgdG8gdGhlIAorICogICAgdGFyZ2V0IHRvIGdldCByaWQgb2YgdGhlIHVzZWxlc3MgU0NTSSBidXMgb3duZXJzaGlwLgorICogICAgQWNjb3JkaW5nIHRvIHRoZSBzcGVjcywgbm8gdGFza3Mgc2hhbGwgYmUgYWZmZWN0ZWQuCisgKiAgLSBJZiB0aGUgdGFyZ2V0IGlzIHRvIGJlIHJlc2V0LCB3ZSBzZW5kIGl0IGEgTV9SRVNFVCAKKyAqICAgIG1lc3NhZ2UuCisgKiAgLSBJZiBhIGxvZ2ljYWwgVU5JVCBpcyB0byBiZSBjbGVhcmVkICwgd2Ugc2VuZCB0aGUgCisgKiAgICBJREVOVElGWShsdW4pICsgTV9BQk9SVC4KKyAqICAtIElmIGFuIHVudGFnZ2VkIHRhc2sgaXMgdG8gYmUgYWJvcnRlZCwgd2Ugc2VuZCB0aGUgCisgKiAgICBJREVOVElGWShsdW4pICsgTV9BQk9SVC4KKyAqICAtIElmIGEgdGFnZ2VkIHRhc2sgaXMgdG8gYmUgYWJvcnRlZCwgd2Ugc2VuZCB0aGUgCisgKiAgICBJREVOVElGWShsdW4pICsgdGFzayBhdHRyaWJ1dGVzICsgTV9BQk9SVF9UQUcuCisgKgorICogIE9uY2Ugb3VyICdraXNzIG9mIGRlYXRoJyA6KSBtZXNzYWdlIGhhcyBiZWVuIGFjY2VwdGVkIAorICogIGJ5IHRoZSB0YXJnZXQsIHRoZSBTQ1JJUFRTIGludGVycnVwdHMgYWdhaW4gCisgKiAgKFNJUl9BQk9SVF9TRU5UKS4gT24gdGhpcyBpbnRlcnJ1cHQsIHdlIGNvbXBsZXRlIAorICogIGFsbCB0aGUgQ0NCcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gYWJvcnRlZCBieSB0aGUgCisgKiAgdGFyZ2V0IGFjY29yZGluZyB0byBvdXIgbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQgc3ltX3Npcl90YXNrX3JlY292ZXJ5KHN0cnVjdCBzeW1faGNiICpucCwgaW50IG51bSkKK3sKKwlTWU1fUVVFSEVBRCAqcXA7CisJc3RydWN0IHN5bV9jY2IgKmNwOworCXN0cnVjdCBzeW1fdGNiICp0cCA9IE5VTEw7IC8qIGdjYyBpc24ndCBxdWl0ZSBzbWFydCBlbm91Z2ggeWV0ICovCisJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OworCWludCB0YXJnZXQ9LTEsIGx1bj0tMSwgdGFzazsKKwlpbnQgaSwgazsKKworCXN3aXRjaChudW0pIHsKKwkvKgorCSAqICBUaGUgU0NSSVBUUyBwcm9jZXNzb3Igc3RvcHBlZCBiZWZvcmUgc3RhcnRpbmcKKwkgKiAgdGhlIG5leHQgY29tbWFuZCBpbiBvcmRlciB0byBhbGxvdyB1cyB0byBwZXJmb3JtIAorCSAqICBzb21lIHRhc2sgcmVjb3ZlcnkuCisJICovCisJY2FzZSBTSVJfU0NSSVBUX1NUT1BQRUQ6CisJCS8qCisJCSAqICBEbyB3ZSBoYXZlIGFueSB0YXJnZXQgdG8gcmVzZXQgb3IgdW5pdCB0byBjbGVhciA/CisJCSAqLworCQlmb3IgKGkgPSAwIDsgaSA8IFNZTV9DT05GX01BWF9UQVJHRVQgOyBpKyspIHsKKwkJCXRwID0gJm5wLT50YXJnZXRbaV07CisJCQlpZiAodHAtPnRvX3Jlc2V0IHx8IAorCQkJICAgICh0cC0+bHVuMHAgJiYgdHAtPmx1bjBwLT50b19jbGVhcikpIHsKKwkJCQl0YXJnZXQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCF0cC0+bHVubXApCisJCQkJY29udGludWU7CisJCQlmb3IgKGsgPSAxIDsgayA8IFNZTV9DT05GX01BWF9MVU4gOyBrKyspIHsKKwkJCQlpZiAodHAtPmx1bm1wW2tdICYmIHRwLT5sdW5tcFtrXS0+dG9fY2xlYXIpIHsKKwkJCQkJdGFyZ2V0CT0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHRhcmdldCAhPSAtMSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqICBJZiBub3QsIHdhbGsgdGhlIGJ1c3kgcXVldWUgZm9yIGFueSAKKwkJICogIGRpc2Nvbm5lY3RlZCBDQ0IgdG8gYmUgYWJvcnRlZC4KKwkJICovCisJCWlmICh0YXJnZXQgPT0gLTEpIHsKKwkJCUZPUl9FQUNIX1FVRVVFRF9FTEVNRU5UKCZucC0+YnVzeV9jY2JxLCBxcCkgeworCQkJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCxzdHJ1Y3Qgc3ltX2NjYixsaW5rX2NjYnEpOworCQkJCWlmIChjcC0+aG9zdF9zdGF0dXMgIT0gSFNfRElTQ09OTkVDVCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGNwLT50b19hYm9ydCkgeworCQkJCQl0YXJnZXQgPSBjcC0+dGFyZ2V0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiAgSWYgc29tZSB0YXJnZXQgaXMgdG8gYmUgc2VsZWN0ZWQsIAorCQkgKiAgcHJlcGFyZSBhbmQgc3RhcnQgdGhlIHNlbGVjdGlvbi4KKwkJICovCisJCWlmICh0YXJnZXQgIT0gLTEpIHsKKwkJCXRwID0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwkJCW5wLT5hYnJ0X3NlbC5zZWxfaWQJPSB0YXJnZXQ7CisJCQlucC0+YWJydF9zZWwuc2VsX3NjbnRsMyA9IHRwLT5oZWFkLnd2YWw7CisJCQlucC0+YWJydF9zZWwuc2VsX3N4ZmVyICA9IHRwLT5oZWFkLnN2YWw7CisJCQlPVVRMKG5wLCBuY19kc2EsIG5wLT5oY2JfYmEpOworCQkJT1VUTF9EU1AobnAsIFNDUklQVEJfQkEobnAsIHNlbF9mb3JfYWJvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqICBOb3cgbG9vayBmb3IgYSBDQ0IgdG8gYWJvcnQgdGhhdCBoYXZlbid0IHN0YXJ0ZWQgeWV0LgorCQkgKiAgQnR3LCB0aGUgU0NSSVBUUyBwcm9jZXNzb3IgaXMgc3RpbGwgc3RvcHBlZCwgc28gCisJCSAqICB3ZSBhcmUgbm90IGluIHJhY2UuCisJCSAqLworCQlpID0gMDsKKwkJY3AgPSBOVUxMOworCQlGT1JfRUFDSF9RVUVVRURfRUxFTUVOVCgmbnAtPmJ1c3lfY2NicSwgcXApIHsKKwkJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisJCQlpZiAoY3AtPmhvc3Rfc3RhdHVzICE9IEhTX0JVU1kgJiYKKwkJCSAgICBjcC0+aG9zdF9zdGF0dXMgIT0gSFNfTkVHT1RJQVRFKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFjcC0+dG9fYWJvcnQpCisJCQkJY29udGludWU7CisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJCQkvKgorCQkJICogICAgSWYgd2UgYXJlIHVzaW5nIElNTUVESUFURSBBUkJJVFJBVElPTiwgd2UgZG9ubm90IAorCQkJICogICAgd2FudCB0byBjYW5jZWwgdGhlIGxhc3QgcXVldWVkIENDQiwgc2luY2UgdGhlIAorCQkJICogICAgU0NSSVBUUyBtYXkgaGF2ZSBhbnRpY2lwYXRlZCB0aGUgc2VsZWN0aW9uLgorCQkJICovCisJCQlpZiAoY3AgPT0gbnAtPmxhc3RfY3ApIHsKKwkJCQljcC0+dG9fYWJvcnQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpID0gMTsJLyogTWVhbnMgd2UgaGF2ZSBmb3VuZCBzb21lICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoIWkpIHsKKwkJCS8qCisJCQkgKiAgV2UgYXJlIGRvbmUsIHNvIHdlIGRvbm5vdCBuZWVkIAorCQkJICogIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIFNDUklQVFMgYW55bG9uZ2VyLgorCQkJICogIFJlbW92ZSB0aGUgU0VNIGZsYWcgZnJvbSB0aGUgSVNUQVQuCisJCQkgKi8KKwkJCW5wLT5pc3RhdF9zZW0gPSAwOworCQkJT1VUQihucCwgbmNfaXN0YXQsIFNJR1ApOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogIENvbXB1dGUgaW5kZXggb2YgbmV4dCBwb3NpdGlvbiBpbiB0aGUgc3RhcnQgCisJCSAqICBxdWV1ZSB0aGUgU0NSSVBUUyBpbnRlbmRzIHRvIHN0YXJ0IGFuZCBkZXF1ZXVlIAorCQkgKiAgYWxsIENDQnMgZm9yIHRoYXQgZGV2aWNlIHRoYXQgaGF2ZW4ndCBiZWVuIHN0YXJ0ZWQuCisJCSAqLworCQlpID0gKElOTChucCwgbmNfc2NyYXRjaGEpIC0gbnAtPnNxdWV1ZV9iYSkgLyA0OworCQlpID0gc3ltX2RlcXVldWVfZnJvbV9zcXVldWUobnAsIGksIGNwLT50YXJnZXQsIGNwLT5sdW4sIC0xKTsKKworCQkvKgorCQkgKiAgTWFrZSBzdXJlIGF0IGxlYXN0IG91ciBJTyB0byBhYm9ydCBoYXMgYmVlbiBkZXF1ZXVlZC4KKwkJICovCisjaWZuZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCQlhc3NlcnQoaSAmJiBzeW1fZ2V0X2NhbV9zdGF0dXMoY3AtPmNtZCkgPT0gQ0FNX1JFUVVFVUVfUkVRKTsKKyNlbHNlCisJCXN5bV9yZW1xdWUoJmNwLT5saW5rX2NjYnEpOworCQlzeW1faW5zcXVlX3RhaWwoJmNwLT5saW5rX2NjYnEsICZucC0+Y29tcF9jY2JxKTsKKyNlbmRpZgorCQkvKgorCQkgKiAgS2VlcCB0cmFjayBpbiBjYW0gc3RhdHVzIG9mIHRoZSByZWFzb24gb2YgdGhlIGFib3J0LgorCQkgKi8KKwkJaWYgKGNwLT50b19hYm9ydCA9PSAyKQorCQkJc3ltX3NldF9jYW1fc3RhdHVzKGNwLT5jbWQsIENBTV9DTURfVElNRU9VVCk7CisJCWVsc2UKKwkJCXN5bV9zZXRfY2FtX3N0YXR1cyhjcC0+Y21kLCBDQU1fUkVRX0FCT1JURUQpOworCisJCS8qCisJCSAqICBDb21wbGV0ZSB3aXRoIGVycm9yIGV2ZXJ5dGhpbmcgdGhhdCB3ZSBoYXZlIGRlcXVldWVkLgorCSAJICovCisJCXN5bV9mbHVzaF9jb21wX3F1ZXVlKG5wLCAwKTsKKwkJYnJlYWs7CisJLyoKKwkgKiAgVGhlIFNDUklQVFMgcHJvY2Vzc29yIGhhcyBzZWxlY3RlZCBhIHRhcmdldCAKKwkgKiAgd2UgbWF5IGhhdmUgc29tZSBtYW51YWwgcmVjb3ZlcnkgdG8gcGVyZm9ybSBmb3IuCisJICovCisJY2FzZSBTSVJfVEFSR0VUX1NFTEVDVEVEOgorCQl0YXJnZXQgPSBJTkIobnAsIG5jX3NkaWQpICYgMHhmOworCQl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisKKwkJbnAtPmFicnRfdGJsLmFkZHIgPSBjcHVfdG9fc2NyKHZ0b2J1cyhucC0+YWJydF9tc2cpKTsKKworCQkvKgorCQkgKiAgSWYgdGhlIHRhcmdldCBpcyB0byBiZSByZXNldCwgcHJlcGFyZSBhIAorCQkgKiAgTV9SRVNFVCBtZXNzYWdlIGFuZCBjbGVhciB0aGUgdG9fcmVzZXQgZmxhZyAKKwkJICogIHNpbmNlIHdlIGRvbm5vdCBleHBlY3QgdGhpcyBvcGVyYXRpb24gdG8gZmFpbC4KKwkJICovCisJCWlmICh0cC0+dG9fcmVzZXQpIHsKKwkJCW5wLT5hYnJ0X21zZ1swXSA9IE1fUkVTRVQ7CisJCQlucC0+YWJydF90Ymwuc2l6ZSA9IDE7CisJCQl0cC0+dG9fcmVzZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiAgT3RoZXJ3aXNlLCBsb29rIGZvciBzb21lIGxvZ2ljYWwgdW5pdCB0byBiZSBjbGVhcmVkLgorCQkgKi8KKwkJaWYgKHRwLT5sdW4wcCAmJiB0cC0+bHVuMHAtPnRvX2NsZWFyKQorCQkJbHVuID0gMDsKKwkJZWxzZSBpZiAodHAtPmx1bm1wKSB7CisJCQlmb3IgKGsgPSAxIDsgayA8IFNZTV9DT05GX01BWF9MVU4gOyBrKyspIHsKKwkJCQlpZiAodHAtPmx1bm1wW2tdICYmIHRwLT5sdW5tcFtrXS0+dG9fY2xlYXIpIHsKKwkJCQkJbHVuID0gazsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogIElmIGEgbG9naWNhbCB1bml0IGlzIHRvIGJlIGNsZWFyZWQsIHByZXBhcmUgCisJCSAqICBhbiBJREVOVElGWShsdW4pICsgQUJPUlQgTUVTU0FHRS4KKwkJICovCisJCWlmIChsdW4gIT0gLTEpIHsKKwkJCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgbHVuKTsKKwkJCWxwLT50b19jbGVhciA9IDA7IC8qIFdlIGRvbid0IGV4cGVjdCB0byBmYWlsIGhlcmUgKi8KKwkJCW5wLT5hYnJ0X21zZ1swXSA9IElERU5USUZZKDAsIGx1bik7CisJCQlucC0+YWJydF9tc2dbMV0gPSBNX0FCT1JUOworCQkJbnAtPmFicnRfdGJsLnNpemUgPSAyOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiAgT3RoZXJ3aXNlLCBsb29rIGZvciBzb21lIGRpc2Nvbm5lY3RlZCBqb2IgdG8gCisJCSAqICBhYm9ydCBmb3IgdGhpcyB0YXJnZXQuCisJCSAqLworCQlpID0gMDsKKwkJY3AgPSBOVUxMOworCQlGT1JfRUFDSF9RVUVVRURfRUxFTUVOVCgmbnAtPmJ1c3lfY2NicSwgcXApIHsKKwkJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisJCQlpZiAoY3AtPmhvc3Rfc3RhdHVzICE9IEhTX0RJU0NPTk5FQ1QpCisJCQkJY29udGludWU7CisJCQlpZiAoY3AtPnRhcmdldCAhPSB0YXJnZXQpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNwLT50b19hYm9ydCkKKwkJCQljb250aW51ZTsKKwkJCWkgPSAxOwkvKiBNZWFucyB3ZSBoYXZlIHNvbWUgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIElmIHdlIGhhdmUgbm9uZSwgcHJvYmFibHkgc2luY2UgdGhlIGRldmljZSBoYXMgCisJCSAqICBjb21wbGV0ZWQgdGhlIGNvbW1hbmQgYmVmb3JlIHdlIHdvbiBhYml0cmF0aW9uLAorCQkgKiAgc2VuZCBhIE1fQUJPUlQgbWVzc2FnZSB3aXRob3V0IElERU5USUZZLgorCQkgKiAgQWNjb3JkaW5nIHRvIHRoZSBzcGVjcywgdGhlIGRldmljZSBtdXN0IGp1c3QgCisJCSAqICBkaXNjb25uZWN0IHRoZSBCVVMgYW5kIG5vdCBhYm9ydCBhbnkgdGFzay4KKwkJICovCisJCWlmICghaSkgeworCQkJbnAtPmFicnRfbXNnWzBdID0gTV9BQk9SVDsKKwkJCW5wLT5hYnJ0X3RibC5zaXplID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogIFdlIGhhdmUgc29tZSB0YXNrIHRvIGFib3J0LgorCQkgKiAgU2V0IHRoZSBJREVOVElGWShsdW4pCisJCSAqLworCQlucC0+YWJydF9tc2dbMF0gPSBJREVOVElGWSgwLCBjcC0+bHVuKTsKKworCQkvKgorCQkgKiAgSWYgd2Ugd2FudCB0byBhYm9ydCBhbiB1bnRhZ2dlZCBjb21tYW5kLCB3ZSAKKwkJICogIHdpbGwgc2VuZCBhIElERU5USUZZICsgTV9BQk9SVC4KKwkJICogIE90aGVyd2lzZSAodGFnZ2VkIGNvbW1hbmQpLCB3ZSB3aWxsIHNlbmQgCisJCSAqICBhIElERU5USVRGWSArIHRhc2sgYXR0cmlidXRlcyArIEFCT1JUIFRBRy4KKwkJICovCisJCWlmIChjcC0+dGFnID09IE5PX1RBRykgeworCQkJbnAtPmFicnRfbXNnWzFdID0gTV9BQk9SVDsKKwkJCW5wLT5hYnJ0X3RibC5zaXplID0gMjsKKwkJfSBlbHNlIHsKKwkJCW5wLT5hYnJ0X21zZ1sxXSA9IGNwLT5zY3NpX3Ntc2dbMV07CisJCQlucC0+YWJydF9tc2dbMl0gPSBjcC0+c2NzaV9zbXNnWzJdOworCQkJbnAtPmFicnRfbXNnWzNdID0gTV9BQk9SVF9UQUc7CisJCQlucC0+YWJydF90Ymwuc2l6ZSA9IDQ7CisJCX0KKwkJLyoKKwkJICogIEtlZXAgdHJhY2sgb2Ygc29mdHdhcmUgdGltZW91dCBjb25kaXRpb24sIHNpbmNlIHRoZSAKKwkJICogIHBlcmlwaGVyYWwgZHJpdmVyIG1heSBub3QgY291bnQgcmV0cmllcyBvbiBhYm9ydCAKKwkJICogIGNvbmRpdGlvbnMgbm90IGR1ZSB0byB0aW1lb3V0LgorCQkgKi8KKwkJaWYgKGNwLT50b19hYm9ydCA9PSAyKQorCQkJc3ltX3NldF9jYW1fc3RhdHVzKGNwLT5jbWQsIENBTV9DTURfVElNRU9VVCk7CisJCWNwLT50b19hYm9ydCA9IDA7IC8qIFdlIGRvbm5vdCBleHBlY3QgdG8gZmFpbCBoZXJlICovCisJCWJyZWFrOworCisJLyoKKwkgKiAgVGhlIHRhcmdldCBoYXMgYWNjZXB0ZWQgb3VyIG1lc3NhZ2UgYW5kIHN3aXRjaGVkIAorCSAqICB0byBCVVMgRlJFRSBwaGFzZSBhcyB3ZSBleHBlY3RlZC4KKwkgKi8KKwljYXNlIFNJUl9BQk9SVF9TRU5UOgorCQl0YXJnZXQgPSBJTkIobnAsIG5jX3NkaWQpICYgMHhmOworCQl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJCXN0YXJnZXQgPSB0cC0+c2Rldi0+c2Rldl90YXJnZXQ7CisJCQorCQkvKgorCQkqKiAgSWYgd2UgZGlkbid0IGFib3J0IGFueXRoaW5nLCBsZWF2ZSBoZXJlLgorCQkqLworCQlpZiAobnAtPmFicnRfbXNnWzBdID09IE1fQUJPUlQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiAgSWYgd2Ugc2VudCBhIE1fUkVTRVQsIHRoZW4gYSBoYXJkd2FyZSByZXNldCBoYXMgCisJCSAqICBiZWVuIHBlcmZvcm1lZCBieSB0aGUgdGFyZ2V0LgorCQkgKiAgLSBSZXNldCBldmVyeXRoaW5nIHRvIGFzeW5jIDggYml0CisJCSAqICAtIFRlbGwgb3Vyc2VsZiB0byBuZWdvdGlhdGUgbmV4dCB0aW1lIDotKQorCQkgKiAgLSBQcmVwYXJlIHRvIGNsZWFyIGFsbCBkaXNjb25uZWN0ZWQgQ0NCcyBmb3IgCisJCSAqICAgIHRoaXMgdGFyZ2V0IGZyb20gb3VyIHRhc2sgbGlzdCAobHVuPXRhc2s9LTEpCisJCSAqLworCQlsdW4gPSAtMTsKKwkJdGFzayA9IC0xOworCQlpZiAobnAtPmFicnRfbXNnWzBdID09IE1fUkVTRVQpIHsKKwkJCXRwLT5oZWFkLnN2YWwgPSAwOworCQkJdHAtPmhlYWQud3ZhbCA9IG5wLT5ydl9zY250bDM7CisJCQl0cC0+aGVhZC51dmFsID0gMDsKKwkJCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSAwOworCQkJc3BpX29mZnNldChzdGFyZ2V0KSA9IDA7CisJCQlzcGlfd2lkdGgoc3RhcmdldCkgPSAwOworCQkJc3BpX2l1KHN0YXJnZXQpID0gMDsKKwkJCXNwaV9kdChzdGFyZ2V0KSA9IDA7CisJCQlzcGlfcWFzKHN0YXJnZXQpID0gMDsKKwkJCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKKwkJfQorCisJCS8qCisJCSAqICBPdGhlcndpc2UsIGNoZWNrIGZvciB0aGUgTFVOIGFuZCBUQVNLKHMpIAorCQkgKiAgY29uY2VybmVkIGJ5IHRoZSBjYW5jZWxhdGlvbi4KKwkJICogIElmIGl0IGlzIG5vdCBBQk9SVF9UQUcgdGhlbiBpdCBpcyBDTEVBUl9RVUVVRSAKKwkJICogIG9yIGFuIEFCT1JUIG1lc3NhZ2UgOi0pCisJCSAqLworCQllbHNlIHsKKwkJCWx1biA9IG5wLT5hYnJ0X21zZ1swXSAmIDB4M2Y7CisJCQlpZiAobnAtPmFicnRfbXNnWzFdID09IE1fQUJPUlRfVEFHKQorCQkJCXRhc2sgPSBucC0+YWJydF9tc2dbMl07CisJCX0KKworCQkvKgorCQkgKiAgQ29tcGxldGUgYWxsIHRoZSBDQ0JzIHRoZSBkZXZpY2Ugc2hvdWxkIGhhdmUgCisJCSAqICBhYm9ydGVkIGR1ZSB0byBvdXIgJ2tpc3Mgb2YgZGVhdGgnIG1lc3NhZ2UuCisJCSAqLworCQlpID0gKElOTChucCwgbmNfc2NyYXRjaGEpIC0gbnAtPnNxdWV1ZV9iYSkgLyA0OworCQlzeW1fZGVxdWV1ZV9mcm9tX3NxdWV1ZShucCwgaSwgdGFyZ2V0LCBsdW4sIC0xKTsKKwkJc3ltX2NsZWFyX3Rhc2tzKG5wLCBDQU1fUkVRX0FCT1JURUQsIHRhcmdldCwgbHVuLCB0YXNrKTsKKwkJc3ltX2ZsdXNoX2NvbXBfcXVldWUobnAsIDApOworCisgCQkvKgorCQkgKiAgSWYgd2Ugc2VudCBhIEJEUiwgbWFrZSB1cHBlciBsYXllciBhd2FyZSBvZiB0aGF0LgorIAkJICovCisJCWlmIChucC0+YWJydF9tc2dbMF0gPT0gTV9SRVNFVCkKKwkJCXN5bV94cHRfYXN5bmNfc2VudF9iZHIobnAsIHRhcmdldCk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogIFByaW50IHRvIHRoZSBsb2cgdGhlIG1lc3NhZ2Ugd2UgaW50ZW5kIHRvIHNlbmQuCisJICovCisJaWYgKG51bSA9PSBTSVJfVEFSR0VUX1NFTEVDVEVEKSB7CisJCWRldl9pbmZvKCZ0cC0+c2Rldi0+c2Rldl90YXJnZXQtPmRldiwgImNvbnRyb2wgbXNnb3V0OiIpOworCQlzeW1fcHJpbnRsX2hleChucC0+YWJydF9tc2csIG5wLT5hYnJ0X3RibC5zaXplKTsKKwkJbnAtPmFicnRfdGJsLnNpemUgPSBjcHVfdG9fc2NyKG5wLT5hYnJ0X3RibC5zaXplKTsKKwl9CisKKwkvKgorCSAqICBMZXQgdGhlIFNDUklQVFMgcHJvY2Vzc29yIGNvbnRpbnVlLgorCSAqLworCU9VVE9OQl9TVEQoKTsKK30KKworLyoKKyAqICBHZXJhcmQncyBhbGNoZW15OikgdGhhdCBkZWFscyB3aXRoIHdpdGggdGhlIGRhdGEgCisgKiAgcG9pbnRlciBmb3IgYm90aCBNRFAgYW5kIHRoZSByZXNpZHVhbCBjYWxjdWxhdGlvbi4KKyAqCisgKiAgSSBkaWRuJ3Qgd2FudCB0byBibG9hdCB0aGUgY29kZSBieSBtb3JlIHRoYW4gMjAwIAorICogIGxpbmVzIGZvciB0aGUgaGFuZGxpbmcgb2YgYm90aCBNRFAgYW5kIHRoZSByZXNpZHVhbC4KKyAqICBUaGlzIGhhcyBiZWVuIGFjaGlldmVkIGJ5IHVzaW5nIGEgZGF0YSBwb2ludGVyIAorICogIHJlcHJlc2VudGF0aW9uIGNvbnNpc3RpbmcgaW4gYW4gaW5kZXggaW4gdGhlIGRhdGEgCisgKiAgYXJyYXkgKGRwX3NnKSBhbmQgYSBuZWdhdGl2ZSBvZmZzZXQgKGRwX29mcykgdGhhdCAKKyAqICBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZzoKKyAqCisgKiAgLSBkcF9zZyA9IFNZTV9DT05GX01BWF9TRworICogICAgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgc2NyaXB0LgorICogIC0gZHBfc2cgPCBTWU1fQ09ORl9NQVhfU0cKKyAqICAgIGRwX3NnIHBvaW50cyB0byB0aGUgbmV4dCBlbnRyeSBvZiB0aGUgc2NhdHRlciBhcnJheSAKKyAqICAgIHdlIHdhbnQgdG8gdHJhbnNmZXIuCisgKiAgLSBkcF9vZnMgPCAwCisgKiAgICBkcF9vZnMgcmVwcmVzZW50cyB0aGUgcmVzaWR1YWwgb2YgYnl0ZXMgb2YgdGhlIAorICogICAgcHJldmlvdXMgZW50cnkgc2NhdHRlciBlbnRyeSB3ZSB3aWxsIHNlbmQgZmlyc3QuCisgKiAgLSBkcF9vZnMgPSAwCisgKiAgICBubyByZXNpZHVhbCB0byBzZW5kIGZpcnN0LgorICoKKyAqICBUaGUgZnVuY3Rpb24gc3ltX2V2YWx1YXRlX2RwKCkgYWNjZXB0cyBhbiBhcmJpdHJheSAKKyAqICBvZmZzZXQgKGJhc2ljYWxseSBmcm9tIHRoZSBNRFAgbWVzc2FnZSkgYW5kIHJldHVybnMgCisgKiAgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9mIGRwX3NnIGFuZCBkcF9vZnMuCisgKi8KKworc3RhdGljIGludCBzeW1fZXZhbHVhdGVfZHAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3AsIHUzMiBzY3IsIGludCAqb2ZzKQoreworCXUzMglkcF9zY3I7CisJaW50CWRwX29mcywgZHBfc2csIGRwX3NnbWluOworCWludAl0bXA7CisJc3RydWN0IHN5bV9wbWMgKnBtOworCisJLyoKKwkgKiAgQ29tcHV0ZSB0aGUgcmVzdWx0ZWQgZGF0YSBwb2ludGVyIGluIHRlcm0gb2YgYSBzY3JpcHQgCisJICogIGFkZHJlc3Mgd2l0aGluIHNvbWUgREFUQSBzY3JpcHQgYW5kIGEgc2lnbmVkIGJ5dGUgb2Zmc2V0LgorCSAqLworCWRwX3NjciA9IHNjcjsKKwlkcF9vZnMgPSAqb2ZzOworCWlmCShkcF9zY3IgPT0gU0NSSVBUQV9CQShucCwgcG0wX2RhdGEpKQorCQlwbSA9ICZjcC0+cGh5cy5wbTA7CisJZWxzZSBpZiAoZHBfc2NyID09IFNDUklQVEFfQkEobnAsIHBtMV9kYXRhKSkKKwkJcG0gPSAmY3AtPnBoeXMucG0xOworCWVsc2UKKwkJcG0gPSBOVUxMOworCisJaWYgKHBtKSB7CisJCWRwX3NjciAgPSBzY3JfdG9fY3B1KHBtLT5yZXQpOworCQlkcF9vZnMgLT0gc2NyX3RvX2NwdShwbS0+c2cuc2l6ZSk7CisJfQorCisJLyoKKwkgKiAgSWYgd2UgYXJlIGF1dG8tc2Vuc2luZywgdGhlbiB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAoY3AtPmhvc3RfZmxhZ3MgJiBIRl9TRU5TRSkgeworCQkqb2ZzID0gZHBfb2ZzOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqICBEZWR1Y2UgdGhlIGluZGV4IG9mIHRoZSBzZyBlbnRyeS4KKwkgKiAgS2VlcCB0cmFjayBvZiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHZhbGlkIGVudHJ5LgorCSAqICBJZiByZXN1bHQgaXMgZHBfc2cgPSBTWU1fQ09ORl9NQVhfU0csIHRoZW4gd2UgYXJlIGF0IHRoZSAKKwkgKiAgZW5kIG9mIHRoZSBkYXRhLgorCSAqLworCXRtcCA9IHNjcl90b19jcHUoc3ltX2dvYWxwKGNwKSk7CisJZHBfc2cgPSBTWU1fQ09ORl9NQVhfU0c7CisJaWYgKGRwX3NjciAhPSB0bXApCisJCWRwX3NnIC09ICh0bXAgLSA4IC0gKGludClkcF9zY3IpIC8gKDIqNCk7CisJZHBfc2dtaW4gPSBTWU1fQ09ORl9NQVhfU0cgLSBjcC0+c2VnbWVudHM7CisKKwkvKgorCSAqICBNb3ZlIHRvIHRoZSBzZyBlbnRyeSB0aGUgZGF0YSBwb2ludGVyIGJlbG9uZ3MgdG8uCisJICoKKwkgKiAgSWYgd2UgYXJlIGluc2lkZSB0aGUgZGF0YSBhcmVhLCB3ZSBleHBlY3QgcmVzdWx0IHRvIGJlOgorCSAqCisJICogIEVpdGhlciwKKwkgKiAgICAgIGRwX29mcyA9IDAgYW5kIGRwX3NnIGlzIHRoZSBpbmRleCBvZiB0aGUgc2cgZW50cnkKKwkgKiAgICAgIHRoZSBkYXRhIHBvaW50ZXIgYmVsb25ncyB0byAob3IgdGhlIGVuZCBvZiB0aGUgZGF0YSkKKwkgKiAgT3IsCisJICogICAgICBkcF9vZnMgPCAwIGFuZCBkcF9zZyBpcyB0aGUgaW5kZXggb2YgdGhlIHNnIGVudHJ5IAorCSAqICAgICAgdGhlIGRhdGEgcG9pbnRlciBiZWxvbmdzIHRvICsgMS4KKwkgKi8KKwlpZiAoZHBfb2ZzIDwgMCkgeworCQlpbnQgbjsKKwkJd2hpbGUgKGRwX3NnID4gZHBfc2dtaW4pIHsKKwkJCS0tZHBfc2c7CisJCQl0bXAgPSBzY3JfdG9fY3B1KGNwLT5waHlzLmRhdGFbZHBfc2ddLnNpemUpOworCQkJbiA9IGRwX29mcyArICh0bXAgJiAweGZmZmZmZik7CisJCQlpZiAobiA+IDApIHsKKwkJCQkrK2RwX3NnOworCQkJCWJyZWFrOworCQkJfQorCQkJZHBfb2ZzID0gbjsKKwkJfQorCX0KKwllbHNlIGlmIChkcF9vZnMgPiAwKSB7CisJCXdoaWxlIChkcF9zZyA8IFNZTV9DT05GX01BWF9TRykgeworCQkJdG1wID0gc2NyX3RvX2NwdShjcC0+cGh5cy5kYXRhW2RwX3NnXS5zaXplKTsKKwkJCWRwX29mcyAtPSAodG1wICYgMHhmZmZmZmYpOworCQkJKytkcF9zZzsKKwkJCWlmIChkcF9vZnMgPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogIE1ha2Ugc3VyZSB0aGUgZGF0YSBwb2ludGVyIGlzIGluc2lkZSB0aGUgZGF0YSBhcmVhLgorCSAqICBJZiBub3QsIHJldHVybiBzb21lIGVycm9yLgorCSAqLworCWlmCShkcF9zZyA8IGRwX3NnbWluIHx8IChkcF9zZyA9PSBkcF9zZ21pbiAmJiBkcF9vZnMgPCAwKSkKKwkJZ290byBvdXRfZXJyOworCWVsc2UgaWYJKGRwX3NnID4gU1lNX0NPTkZfTUFYX1NHIHx8CisJCSAoZHBfc2cgPT0gU1lNX0NPTkZfTUFYX1NHICYmIGRwX29mcyA+IDApKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKgorCSAqICBTYXZlIHRoZSBleHRyZW1lIHBvaW50ZXIgaWYgbmVlZGVkLgorCSAqLworCWlmIChkcF9zZyA+IGNwLT5leHRfc2cgfHwKKyAgICAgICAgICAgIChkcF9zZyA9PSBjcC0+ZXh0X3NnICYmIGRwX29mcyA+IGNwLT5leHRfb2ZzKSkgeworCQljcC0+ZXh0X3NnICA9IGRwX3NnOworCQljcC0+ZXh0X29mcyA9IGRwX29mczsKKwl9CisKKwkvKgorCSAqICBSZXR1cm4gZGF0YS4KKwkgKi8KKwkqb2ZzID0gZHBfb2ZzOworCXJldHVybiBkcF9zZzsKKworb3V0X2VycjoKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiAgY2hpcCBoYW5kbGVyIGZvciBNT0RJRlkgREFUQSBQT0lOVEVSIE1FU1NBR0UKKyAqCisgKiAgV2UgYWxzbyBjYWxsIHRoaXMgZnVuY3Rpb24gb24gSUdOT1JFIFdJREUgUkVTSURVRSAKKyAqICBtZXNzYWdlcyB0aGF0IGRvIG5vdCBtYXRjaCBhIFNXSURFIGZ1bGwgY29uZGl0aW9uLgorICogIEJ0dywgd2UgYXNzdW1lIGluIHRoYXQgc2l0dWF0aW9uIHRoYXQgc3VjaCBhIG1lc3NhZ2UgCisgKiAgaXMgZXF1aXZhbGVudCB0byBhIE1PRElGWSBEQVRBIFBPSU5URVIgKG9mZnNldD0tMSkuCisgKi8KKworc3RhdGljIHZvaWQgc3ltX21vZGlmeV9kcChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fdGNiICp0cCwgc3RydWN0IHN5bV9jY2IgKmNwLCBpbnQgb2ZzKQoreworCWludCBkcF9vZnMJPSBvZnM7CisJdTMyCWRwX3Njcgk9IHN5bV9nZXRfc2NyaXB0X2RwIChucCwgY3ApOworCXUzMglkcF9yZXQ7CisJdTMyCXRtcDsKKwl1X2NoYXIJaGZsYWdzOworCWludAlkcF9zZzsKKwlzdHJ1Y3QJc3ltX3BtYyAqcG07CisKKwkvKgorCSAqICBOb3Qgc3VwcG9ydGVkIGZvciBhdXRvLXNlbnNlLgorCSAqLworCWlmIChjcC0+aG9zdF9mbGFncyAmIEhGX1NFTlNFKQorCQlnb3RvIG91dF9yZWplY3Q7CisKKwkvKgorCSAqICBBcHBseSBvdXIgYWxjaGVteTopIChzZWUgY29tbWVudHMgaW4gc3ltX2V2YWx1YXRlX2RwKCkpLCAKKwkgKiAgdG8gdGhlIHJlc3VsdGVkIGRhdGEgcG9pbnRlci4KKwkgKi8KKwlkcF9zZyA9IHN5bV9ldmFsdWF0ZV9kcChucCwgY3AsIGRwX3NjciwgJmRwX29mcyk7CisJaWYgKGRwX3NnIDwgMCkKKwkJZ290byBvdXRfcmVqZWN0OworCisJLyoKKwkgKiAgQW5kIG91ciBhbGNoZW15OikgYWxsb3dzIHRvIGVhc2lseSBjYWxjdWxhdGUgdGhlIGRhdGEgCisJICogIHNjcmlwdCBhZGRyZXNzIHdlIHdhbnQgdG8gcmV0dXJuIGZvciB0aGUgbmV4dCBkYXRhIHBoYXNlLgorCSAqLworCWRwX3JldCA9IGNwdV90b19zY3Ioc3ltX2dvYWxwKGNwKSk7CisJZHBfcmV0ID0gZHBfcmV0IC0gOCAtIChTWU1fQ09ORl9NQVhfU0cgLSBkcF9zZykgKiAoMio0KTsKKworCS8qCisJICogIElmIG9mZnNldCAvIHNjYXR0ZXIgZW50cnkgaXMgemVybyB3ZSBkb25ub3QgbmVlZCAKKwkgKiAgYSBjb250ZXh0IGZvciB0aGUgbmV3IGN1cnJlbnQgZGF0YSBwb2ludGVyLgorCSAqLworCWlmIChkcF9vZnMgPT0gMCkgeworCQlkcF9zY3IgPSBkcF9yZXQ7CisJCWdvdG8gb3V0X29rOworCX0KKworCS8qCisJICogIEdldCBhIGNvbnRleHQgZm9yIHRoZSBuZXcgY3VycmVudCBkYXRhIHBvaW50ZXIuCisJICovCisJaGZsYWdzID0gSU5CKG5wLCBIRl9QUlQpOworCisJaWYgKGhmbGFncyAmIEhGX0RQX1NBVkVEKQorCQloZmxhZ3MgXj0gSEZfQUNUX1BNOworCisJaWYgKCEoaGZsYWdzICYgSEZfQUNUX1BNKSkgeworCQlwbSAgPSAmY3AtPnBoeXMucG0wOworCQlkcF9zY3IgPSBTQ1JJUFRBX0JBKG5wLCBwbTBfZGF0YSk7CisJfQorCWVsc2UgeworCQlwbSA9ICZjcC0+cGh5cy5wbTE7CisJCWRwX3NjciA9IFNDUklQVEFfQkEobnAsIHBtMV9kYXRhKTsKKwl9CisKKwloZmxhZ3MgJj0gfihIRl9EUF9TQVZFRCk7CisKKwlPVVRCKG5wLCBIRl9QUlQsIGhmbGFncyk7CisKKwkvKgorCSAqICBTZXQgdXAgdGhlIG5ldyBjdXJyZW50IGRhdGEgcG9pbnRlci4KKwkgKiAgb2ZzIDwgMCB0aGVyZSwgYW5kIGZvciB0aGUgbmV4dCBkYXRhIHBoYXNlLCB3ZSAKKwkgKiAgd2FudCB0byB0cmFuc2ZlciBwYXJ0IG9mIHRoZSBkYXRhIG9mIHRoZSBzZyBlbnRyeSAKKwkgKiAgY29ycmVzcG9uZGluZyB0byBpbmRleCBkcF9zZy0xIHByaW9yIHRvIHJldHVybmluZyAKKwkgKiAgdG8gdGhlIG1haW4gZGF0YSBzY3JpcHQuCisJICovCisJcG0tPnJldCA9IGNwdV90b19zY3IoZHBfcmV0KTsKKwl0bXAgID0gc2NyX3RvX2NwdShjcC0+cGh5cy5kYXRhW2RwX3NnLTFdLmFkZHIpOworCXRtcCArPSBzY3JfdG9fY3B1KGNwLT5waHlzLmRhdGFbZHBfc2ctMV0uc2l6ZSkgKyBkcF9vZnM7CisJcG0tPnNnLmFkZHIgPSBjcHVfdG9fc2NyKHRtcCk7CisJcG0tPnNnLnNpemUgPSBjcHVfdG9fc2NyKC1kcF9vZnMpOworCitvdXRfb2s6CisJc3ltX3NldF9zY3JpcHRfZHAgKG5wLCBjcCwgZHBfc2NyKTsKKwlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgY2xyYWNrKSk7CisJcmV0dXJuOworCitvdXRfcmVqZWN0OgorCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCBtc2dfYmFkKSk7Cit9CisKKworLyoKKyAqICBjaGlwIGNhbGN1bGF0aW9uIG9mIHRoZSBkYXRhIHJlc2lkdWFsLgorICoKKyAqICBBcyBJIHVzZWQgdG8gc2F5LCB0aGUgcmVxdWlyZW1lbnQgb2YgZGF0YSByZXNpZHVhbCAKKyAqICBpbiBTQ1NJIGlzIGJyb2tlbiwgdXNlbGVzcyBhbmQgY2Fubm90IGJlIGFjaGlldmVkIAorICogIHdpdGhvdXQgaHVnZSBjb21wbGV4aXR5LgorICogIEJ1dCBtb3N0IE9TZXMgYW5kIGV2ZW4gdGhlIG9mZmljaWFsIENBTSByZXF1aXJlIGl0LgorICogIFdoZW4gc3R1cGlkaXR5IGhhcHBlbnMgdG8gYmUgc28gd2lkZWx5IHNwcmVhZCBpbnNpZGUgCisgKiAgYSBjb21tdW5pdHksIGl0IGdldHMgaGFyZCB0byBjb252aW5jZS4KKyAqCisgKiAgQW55d2F5LCBJIGRvbid0IGNhcmUsIHNpbmNlIEkgYW0gbm90IGdvaW5nIHRvIHVzZSAKKyAqICBhbnkgc29mdHdhcmUgdGhhdCBjb25zaWRlcnMgdGhpcyBkYXRhIHJlc2lkdWFsIGFzIAorICogIGEgcmVsZXZhbnQgaW5mb3JtYXRpb24uIDopCisgKi8KKworaW50IHN5bV9jb21wdXRlX3Jlc2lkdWFsKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCWludCBkcF9zZywgZHBfc2dtaW4sIHJlc2lkID0gMDsKKwlpbnQgZHBfb2ZzID0gMDsKKworCS8qCisJICogIENoZWNrIGZvciBzb21lIGRhdGEgbG9zdCBvciBqdXN0IHRocm93biBhd2F5LgorCSAqICBXZSBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIHF1aXRlIGFjY3VyYXRlIGluIHRoaXMgCisJICogIHNpdHVhdGlvbi4gQnR3LCBpZiB3ZSBhcmUgb2RkIGZvciBvdXRwdXQgYW5kIHRoZSAKKwkgKiAgZGV2aWNlIGNsYWltcyBzb21lIG1vcmUgZGF0YSwgaXQgbWF5IHdlbGwgaGFwcGVuIAorCSAqICB0aGFuIG91ciByZXNpZHVhbCBiZSB6ZXJvLiA6LSkKKwkgKi8KKwlpZiAoY3AtPnhlcnJfc3RhdHVzICYgKFhFX0VYVFJBX0RBVEF8WEVfU09ETF9VTlJVTnxYRV9TV0lERV9PVlJVTikpIHsKKwkJaWYgKGNwLT54ZXJyX3N0YXR1cyAmIFhFX0VYVFJBX0RBVEEpCisJCQlyZXNpZCAtPSBjcC0+ZXh0cmFfYnl0ZXM7CisJCWlmIChjcC0+eGVycl9zdGF0dXMgJiBYRV9TT0RMX1VOUlVOKQorCQkJKytyZXNpZDsKKwkJaWYgKGNwLT54ZXJyX3N0YXR1cyAmIFhFX1NXSURFX09WUlVOKQorCQkJLS1yZXNpZDsKKwl9CisKKwkvKgorCSAqICBJZiBhbGwgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCwKKwkgKiAgdGhlcmUgaXMgbm8gcmVzaWR1YWwuCisJICovCisJaWYgKGNwLT5waHlzLmhlYWQubGFzdHAgPT0gc3ltX2dvYWxwKGNwKSkKKwkJcmV0dXJuIHJlc2lkOworCisJLyoKKwkgKiAgSWYgbm8gZGF0YSB0cmFuc2ZlciBvY2N1cnMsIG9yIGlmIHRoZSBkYXRhCisJICogIHBvaW50ZXIgaXMgd2VpcmQsIHJldHVybiBmdWxsIHJlc2lkdWFsLgorCSAqLworCWlmIChjcC0+c3RhcnRwID09IGNwLT5waHlzLmhlYWQubGFzdHAgfHwKKwkgICAgc3ltX2V2YWx1YXRlX2RwKG5wLCBjcCwgc2NyX3RvX2NwdShjcC0+cGh5cy5oZWFkLmxhc3RwKSwKKwkJCSAgICAmZHBfb2ZzKSA8IDApIHsKKwkJcmV0dXJuIGNwLT5kYXRhX2xlbjsKKwl9CisKKwkvKgorCSAqICBJZiB3ZSB3ZXJlIGF1dG8tc2Vuc2luZywgdGhlbiB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAoY3AtPmhvc3RfZmxhZ3MgJiBIRl9TRU5TRSkgeworCQlyZXR1cm4gLWRwX29mczsKKwl9CisKKwkvKgorCSAqICBXZSBhcmUgbm93IGZ1bGwgY29tZm9ydGFibGUgaW4gdGhlIGNvbXB1dGF0aW9uIAorCSAqICBvZiB0aGUgZGF0YSByZXNpZHVhbCAoMidzIGNvbXBsZW1lbnQpLgorCSAqLworCWRwX3NnbWluID0gU1lNX0NPTkZfTUFYX1NHIC0gY3AtPnNlZ21lbnRzOworCXJlc2lkID0gLWNwLT5leHRfb2ZzOworCWZvciAoZHBfc2cgPSBjcC0+ZXh0X3NnOyBkcF9zZyA8IFNZTV9DT05GX01BWF9TRzsgKytkcF9zZykgeworCQl1X2ludCB0bXAgPSBzY3JfdG9fY3B1KGNwLT5waHlzLmRhdGFbZHBfc2ddLnNpemUpOworCQlyZXNpZCArPSAodG1wICYgMHhmZmZmZmYpOworCX0KKworCS8qCisJICogIEhvcGVmdWxseSwgdGhlIHJlc3VsdCBpcyBub3QgdG9vIHdyb25nLgorCSAqLworCXJldHVybiByZXNpZDsKK30KKworLyoKKyAqICBOZWdvdGlhdGlvbiBmb3IgV0lERSBhbmQgU1lOQ0hST05PVVMgREFUQSBUUkFOU0ZFUi4KKyAqCisgKiAgV2hlbiB3ZSB0cnkgdG8gbmVnb3RpYXRlLCB3ZSBhcHBlbmQgdGhlIG5lZ290aWF0aW9uIG1lc3NhZ2UKKyAqICB0byB0aGUgaWRlbnRpZnkgYW5kIChtYXliZSkgc2ltcGxlIHRhZyBtZXNzYWdlLgorICogIFRoZSBob3N0IHN0YXR1cyBmaWVsZCBpcyBzZXQgdG8gSFNfTkVHT1RJQVRFIHRvIG1hcmsgdGhpcworICogIHNpdHVhdGlvbi4KKyAqCisgKiAgSWYgdGhlIHRhcmdldCBkb2Vzbid0IGFuc3dlciB0aGlzIG1lc3NhZ2UgaW1tZWRpYXRlbHkKKyAqICAoYXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkKSwgdGhlIFNJUl9ORUdPX0ZBSUxFRCBpbnRlcnJ1cHQKKyAqICB3aWxsIGJlIHJhaXNlZCBldmVudHVhbGx5LgorICogIFRoZSBoYW5kbGVyIHJlbW92ZXMgdGhlIEhTX05FR09USUFURSBzdGF0dXMsIGFuZCBzZXRzIHRoZQorICogIG5lZ290aWF0ZWQgdmFsdWUgdG8gdGhlIGRlZmF1bHQgKGFzeW5jIC8gbm93aWRlKS4KKyAqCisgKiAgSWYgd2UgcmVjZWl2ZSBhIG1hdGNoaW5nIGFuc3dlciBpbW1lZGlhdGVseSwgd2UgY2hlY2sgaXQKKyAqICBmb3IgdmFsaWRpdHksIGFuZCBzZXQgdGhlIHZhbHVlcy4KKyAqCisgKiAgSWYgd2UgcmVjZWl2ZSBhIFJlamVjdCBtZXNzYWdlIGltbWVkaWF0ZWx5LCB3ZSBhc3N1bWUgdGhlCisgKiAgbmVnb3RpYXRpb24gaGFzIGZhaWxlZCwgYW5kIGZhbGwgYmFjayB0byBzdGFuZGFyZCB2YWx1ZXMuCisgKgorICogIElmIHdlIHJlY2VpdmUgYSBuZWdvdGlhdGlvbiBtZXNzYWdlIHdoaWxlIG5vdCBpbiBIU19ORUdPVElBVEUKKyAqICBzdGF0ZSwgaXQncyBhIHRhcmdldCBpbml0aWF0ZWQgbmVnb3RpYXRpb24uIFdlIHByZXBhcmUgYQorICogIChob3BlZnVsbHkpIHZhbGlkIGFuc3dlciwgc2V0IG91ciBwYXJhbWV0ZXJzLCBhbmQgc2VuZCBiYWNrIAorICogIHRoaXMgYW5zd2VyIHRvIHRoZSB0YXJnZXQuCisgKgorICogIElmIHRoZSB0YXJnZXQgZG9lc24ndCBmZXRjaCB0aGUgYW5zd2VyIChubyBtZXNzYWdlIG91dCBwaGFzZSksCisgKiAgd2UgYXNzdW1lIHRoZSBuZWdvdGlhdGlvbiBoYXMgZmFpbGVkLCBhbmQgZmFsbCBiYWNrIHRvIGRlZmF1bHQKKyAqICBzZXR0aW5ncyAoU0lSX05FR09fUFJPVE8gaW50ZXJydXB0KS4KKyAqCisgKiAgV2hlbiB3ZSBzZXQgdGhlIHZhbHVlcywgd2UgYWRqdXN0IHRoZW0gaW4gYWxsIGNjYnMgYmVsb25naW5nIAorICogIHRvIHRoaXMgdGFyZ2V0LCBpbiB0aGUgY29udHJvbGxlcidzIHJlZ2lzdGVyLCBhbmQgaW4gdGhlICJwaHlzIgorICogIGZpZWxkIG9mIHRoZSBjb250cm9sbGVyJ3Mgc3RydWN0IHN5bV9oY2IuCisgKi8KKworLyoKKyAqICBjaGlwIGhhbmRsZXIgZm9yIFNZTkNIUk9OT1VTIERBVEEgVFJBTlNGRVIgUkVRVUVTVCAoU0RUUikgbWVzc2FnZS4KKyAqLworc3RhdGljIGludCAgCitzeW1fc3luY19uZWdvX2NoZWNrKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHJlcSwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCWludCB0YXJnZXQgPSBjcC0+dGFyZ2V0OworCXVfY2hhcgljaGcsIG9mcywgcGVyLCBmYWssIGRpdjsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJc3ltX3ByaW50X25lZ29fbXNnKG5wLCB0YXJnZXQsICJzeW5jIG1zZ2luIiwgbnAtPm1zZ2luKTsKKwl9CisKKwkvKgorCSAqICBHZXQgcmVxdWVzdGVkIHZhbHVlcy4KKwkgKi8KKwljaGcgPSAwOworCXBlciA9IG5wLT5tc2dpblszXTsKKwlvZnMgPSBucC0+bXNnaW5bNF07CisKKwkvKgorCSAqICBDaGVjayB2YWx1ZXMgYWdhaW5zdCBvdXIgbGltaXRzLgorCSAqLworCWlmIChvZnMpIHsKKwkJaWYgKG9mcyA+IG5wLT5tYXhvZmZzKQorCQkJe2NoZyA9IDE7IG9mcyA9IG5wLT5tYXhvZmZzO30KKwl9CisKKwlpZiAob2ZzKSB7CisJCWlmIChwZXIgPCBucC0+bWluc3luYykKKwkJCXtjaGcgPSAxOyBwZXIgPSBucC0+bWluc3luYzt9CisJfQorCisJLyoKKwkgKiAgR2V0IG5ldyBjaGlwIHN5bmNocm9ub3VzIHBhcmFtZXRlcnMgdmFsdWUuCisJICovCisJZGl2ID0gZmFrID0gMDsKKwlpZiAob2ZzICYmIHN5bV9nZXRzeW5jKG5wLCAwLCBwZXIsICZkaXYsICZmYWspIDwgMCkKKwkJZ290byByZWplY3RfaXQ7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCXN5bV9wcmludF9hZGRyKGNwLT5jbWQsCisJCQkJInNkdHI6IG9mcz0lZCBwZXI9JWQgZGl2PSVkIGZhaz0lZCBjaGc9JWQuXG4iLAorCQkJCW9mcywgcGVyLCBkaXYsIGZhaywgY2hnKTsKKwl9CisKKwkvKgorCSAqICBJZiBpdCB3YXMgYW4gYW5zd2VyIHdlIHdhbnQgdG8gY2hhbmdlLCAKKwkgKiAgdGhlbiBpdCBpc24ndCBhY2NlcHRhYmxlLiBSZWplY3QgaXQuCisJICovCisJaWYgKCFyZXEgJiYgY2hnKQorCQlnb3RvIHJlamVjdF9pdDsKKworCS8qCisJICogIEFwcGx5IG5ldyB2YWx1ZXMuCisJICovCisJc3ltX3NldHN5bmMgKG5wLCB0YXJnZXQsIG9mcywgcGVyLCBkaXYsIGZhayk7CisKKwkvKgorCSAqICBJdCB3YXMgYW4gYW5zd2VyLiBXZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAoIXJlcSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqICBJdCB3YXMgYSByZXF1ZXN0LiBQcmVwYXJlIGFuIGFuc3dlciBtZXNzYWdlLgorCSAqLworCW5wLT5tc2dvdXRbMF0gPSBNX0VYVEVOREVEOworCW5wLT5tc2dvdXRbMV0gPSAzOworCW5wLT5tc2dvdXRbMl0gPSBNX1hfU1lOQ19SRVE7CisJbnAtPm1zZ291dFszXSA9IHBlcjsKKwlucC0+bXNnb3V0WzRdID0gb2ZzOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIHRhcmdldCwgInN5bmMgbXNnb3V0IiwgbnAtPm1zZ291dCk7CisJfQorCisJbnAtPm1zZ2luIFswXSA9IE1fTk9PUDsKKworCXJldHVybiAwOworCityZWplY3RfaXQ6CisJc3ltX3NldHN5bmMgKG5wLCB0YXJnZXQsIDAsIDAsIDAsIDApOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgc3ltX3N5bmNfbmVnbyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fdGNiICp0cCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCWludCByZXEgPSAxOworCWludCByZXN1bHQ7CisKKwkvKgorCSAqICBSZXF1ZXN0IG9yIGFuc3dlciA/CisJICovCisJaWYgKElOQihucCwgSFNfUFJUKSA9PSBIU19ORUdPVElBVEUpIHsKKwkJT1VUQihucCwgSFNfUFJULCBIU19CVVNZKTsKKwkJaWYgKGNwLT5uZWdvX3N0YXR1cyAmJiBjcC0+bmVnb19zdGF0dXMgIT0gTlNfU1lOQykKKwkJCWdvdG8gcmVqZWN0X2l0OworCQlyZXEgPSAwOworCX0KKworCS8qCisJICogIENoZWNrIGFuZCBhcHBseSBuZXcgdmFsdWVzLgorCSAqLworCXJlc3VsdCA9IHN5bV9zeW5jX25lZ29fY2hlY2sobnAsIHJlcSwgY3ApOworCWlmIChyZXN1bHQpCS8qIE5vdCBhY2NlcHRhYmxlLCByZWplY3QgaXQgKi8KKwkJZ290byByZWplY3RfaXQ7CisJaWYgKHJlcSkgewkvKiBXYXMgYSByZXF1ZXN0LCBzZW5kIHJlc3BvbnNlLiAqLworCQljcC0+bmVnb19zdGF0dXMgPSBOU19TWU5DOworCQlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgc2R0cl9yZXNwKSk7CisJfQorCWVsc2UJCS8qIFdhcyBhIHJlc3BvbnNlLCB3ZSBhcmUgZG9uZS4gKi8KKwkJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGNscmFjaykpOworCXJldHVybjsKKworcmVqZWN0X2l0OgorCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCBtc2dfYmFkKSk7Cit9CisKKy8qCisgKiAgY2hpcCBoYW5kbGVyIGZvciBQQVJBTExFTCBQUk9UT0NPTCBSRVFVRVNUIChQUFIpIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQgCitzeW1fcHByX25lZ29fY2hlY2soc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgcmVxLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJdW5zaWduZWQgY2hhciBmYWssIGRpdjsKKwlpbnQgZHQsIGNoZyA9IDA7CisKKwl1bnNpZ25lZCBjaGFyIHBlciA9IG5wLT5tc2dpblszXTsKKwl1bnNpZ25lZCBjaGFyIG9mcyA9IG5wLT5tc2dpbls1XTsKKwl1bnNpZ25lZCBjaGFyIHdpZGUgPSBucC0+bXNnaW5bNl07CisJdW5zaWduZWQgY2hhciBvcHRzID0gbnAtPm1zZ2luWzddICYgUFBSX09QVF9NQVNLOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIHRhcmdldCwgInBwciBtc2dpbiIsIG5wLT5tc2dpbik7CisJfQorCisJLyoKKwkgKiAgQ2hlY2sgdmFsdWVzIGFnYWluc3Qgb3VyIGxpbWl0cy4KKwkgKi8KKwlpZiAod2lkZSA+IG5wLT5tYXh3aWRlKSB7CisJCWNoZyA9IDE7CisJCXdpZGUgPSBucC0+bWF4d2lkZTsKKwl9CisJaWYgKCF3aWRlIHx8ICEobnAtPmZlYXR1cmVzICYgRkVfVTNFTikpCisJCW9wdHMgPSAwOworCisJaWYgKG9wdHMgIT0gKG5wLT5tc2dpbls3XSAmIFBQUl9PUFRfTUFTSykpCisJCWNoZyA9IDE7CisKKwlkdCA9IG9wdHMgJiBQUFJfT1BUX0RUOworCisJaWYgKG9mcykgeworCQl1bnNpZ25lZCBjaGFyIG1heG9mZnMgPSBkdCA/IG5wLT5tYXhvZmZzX2R0IDogbnAtPm1heG9mZnM7CisJCWlmIChvZnMgPiBtYXhvZmZzKSB7CisJCQljaGcgPSAxOworCQkJb2ZzID0gbWF4b2ZmczsKKwkJfQorCX0KKworCWlmIChvZnMpIHsKKwkJdW5zaWduZWQgY2hhciBtaW5zeW5jID0gZHQgPyBucC0+bWluc3luY19kdCA6IG5wLT5taW5zeW5jOworCQlpZiAocGVyIDwgbWluc3luYykgeworCQkJY2hnID0gMTsKKwkJCXBlciA9IG1pbnN5bmM7CisJCX0KKwl9CisKKwkvKgorCSAqICBHZXQgbmV3IGNoaXAgc3luY2hyb25vdXMgcGFyYW1ldGVycyB2YWx1ZS4KKwkgKi8KKwlkaXYgPSBmYWsgPSAwOworCWlmIChvZnMgJiYgc3ltX2dldHN5bmMobnAsIGR0LCBwZXIsICZkaXYsICZmYWspIDwgMCkKKwkJZ290byByZWplY3RfaXQ7CisKKwkvKgorCSAqICBJZiBpdCB3YXMgYW4gYW5zd2VyIHdlIHdhbnQgdG8gY2hhbmdlLCAKKwkgKiAgdGhlbiBpdCBpc24ndCBhY2NlcHRhYmxlLiBSZWplY3QgaXQuCisJICovCisJaWYgKCFyZXEgJiYgY2hnKQorCQlnb3RvIHJlamVjdF9pdDsKKworCS8qCisJICogIEFwcGx5IG5ldyB2YWx1ZXMuCisJICovCisJc3ltX3NldHBwcm90KG5wLCB0YXJnZXQsIG9wdHMsIG9mcywgcGVyLCB3aWRlLCBkaXYsIGZhayk7CisKKwkvKgorCSAqICBJdCB3YXMgYW4gYW5zd2VyLiBXZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAoIXJlcSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqICBJdCB3YXMgYSByZXF1ZXN0LiBQcmVwYXJlIGFuIGFuc3dlciBtZXNzYWdlLgorCSAqLworCW5wLT5tc2dvdXRbMF0gPSBNX0VYVEVOREVEOworCW5wLT5tc2dvdXRbMV0gPSA2OworCW5wLT5tc2dvdXRbMl0gPSBNX1hfUFBSX1JFUTsKKwlucC0+bXNnb3V0WzNdID0gcGVyOworCW5wLT5tc2dvdXRbNF0gPSAwOworCW5wLT5tc2dvdXRbNV0gPSBvZnM7CisJbnAtPm1zZ291dFs2XSA9IHdpZGU7CisJbnAtPm1zZ291dFs3XSA9IG9wdHM7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19ORUdPKSB7CisJCXN5bV9wcmludF9uZWdvX21zZyhucCwgdGFyZ2V0LCAicHByIG1zZ291dCIsIG5wLT5tc2dvdXQpOworCX0KKworCW5wLT5tc2dpbiBbMF0gPSBNX05PT1A7CisKKwlyZXR1cm4gMDsKKworcmVqZWN0X2l0OgorCXN5bV9zZXRwcHJvdCAobnAsIHRhcmdldCwgMCwgMCwgMCwgMCwgMCwgMCk7CisJLyoKKwkgKiAgSWYgaXQgaXMgYSBkZXZpY2UgcmVzcG9uc2UgdGhhdCBzaG91bGQgcmVzdWx0IGluICAKKwkgKiAgU1QsIHdlIG1heSB3YW50IHRvIHRyeSBhIGxlZ2FjeSBuZWdvdGlhdGlvbiBsYXRlci4KKwkgKi8KKwlpZiAoIXJlcSAmJiAhb3B0cykgeworCQl0cC0+dGdvYWwucGVyaW9kID0gcGVyOworCQl0cC0+dGdvYWwub2Zmc2V0ID0gb2ZzOworCQl0cC0+dGdvYWwud2lkdGggPSB3aWRlOworCQl0cC0+dGdvYWwuaXUgPSB0cC0+dGdvYWwuZHQgPSB0cC0+dGdvYWwucWFzID0gMDsKKwkJdHAtPnRnb2FsLmNoZWNrX25lZ28gPSAxOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV9wcHJfbmVnbyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fdGNiICp0cCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCWludCByZXEgPSAxOworCWludCByZXN1bHQ7CisKKwkvKgorCSAqICBSZXF1ZXN0IG9yIGFuc3dlciA/CisJICovCisJaWYgKElOQihucCwgSFNfUFJUKSA9PSBIU19ORUdPVElBVEUpIHsKKwkJT1VUQihucCwgSFNfUFJULCBIU19CVVNZKTsKKwkJaWYgKGNwLT5uZWdvX3N0YXR1cyAmJiBjcC0+bmVnb19zdGF0dXMgIT0gTlNfUFBSKQorCQkJZ290byByZWplY3RfaXQ7CisJCXJlcSA9IDA7CisJfQorCisJLyoKKwkgKiAgQ2hlY2sgYW5kIGFwcGx5IG5ldyB2YWx1ZXMuCisJICovCisJcmVzdWx0ID0gc3ltX3Bwcl9uZWdvX2NoZWNrKG5wLCByZXEsIGNwLT50YXJnZXQpOworCWlmIChyZXN1bHQpCS8qIE5vdCBhY2NlcHRhYmxlLCByZWplY3QgaXQgKi8KKwkJZ290byByZWplY3RfaXQ7CisJaWYgKHJlcSkgewkvKiBXYXMgYSByZXF1ZXN0LCBzZW5kIHJlc3BvbnNlLiAqLworCQljcC0+bmVnb19zdGF0dXMgPSBOU19QUFI7CisJCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCBwcHJfcmVzcCkpOworCX0KKwllbHNlCQkvKiBXYXMgYSByZXNwb25zZSwgd2UgYXJlIGRvbmUuICovCisJCU9VVExfRFNQKG5wLCBTQ1JJUFRBX0JBKG5wLCBjbHJhY2spKTsKKwlyZXR1cm47CisKK3JlamVjdF9pdDoKKwlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgbXNnX2JhZCkpOworfQorCisvKgorICogIGNoaXAgaGFuZGxlciBmb3IgV0lERSBEQVRBIFRSQU5TRkVSIFJFUVVFU1QgKFdEVFIpIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQgIAorc3ltX3dpZGVfbmVnb19jaGVjayhzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCByZXEsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlpbnQgdGFyZ2V0ID0gY3AtPnRhcmdldDsKKwl1X2NoYXIJY2hnLCB3aWRlOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIHRhcmdldCwgIndpZGUgbXNnaW4iLCBucC0+bXNnaW4pOworCX0KKworCS8qCisJICogIEdldCByZXF1ZXN0ZWQgdmFsdWVzLgorCSAqLworCWNoZyAgPSAwOworCXdpZGUgPSBucC0+bXNnaW5bM107CisKKwkvKgorCSAqICBDaGVjayB2YWx1ZXMgYWdhaW5zdCBvdXIgbGltaXRzLgorCSAqLworCWlmICh3aWRlID4gbnAtPm1heHdpZGUpIHsKKwkJY2hnID0gMTsKKwkJd2lkZSA9IG5wLT5tYXh3aWRlOworCX0KKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX05FR08pIHsKKwkJc3ltX3ByaW50X2FkZHIoY3AtPmNtZCwgIndkdHI6IHdpZGU9JWQgY2hnPSVkLlxuIiwKKwkJCQl3aWRlLCBjaGcpOworCX0KKworCS8qCisJICogIElmIGl0IHdhcyBhbiBhbnN3ZXIgd2Ugd2FudCB0byBjaGFuZ2UsIAorCSAqICB0aGVuIGl0IGlzbid0IGFjY2VwdGFibGUuIFJlamVjdCBpdC4KKwkgKi8KKwlpZiAoIXJlcSAmJiBjaGcpCisJCWdvdG8gcmVqZWN0X2l0OworCisJLyoKKwkgKiAgQXBwbHkgbmV3IHZhbHVlcy4KKwkgKi8KKwlzeW1fc2V0d2lkZSAobnAsIHRhcmdldCwgd2lkZSk7CisKKwkvKgorCSAqICBJdCB3YXMgYW4gYW5zd2VyLiBXZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAoIXJlcSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqICBJdCB3YXMgYSByZXF1ZXN0LiBQcmVwYXJlIGFuIGFuc3dlciBtZXNzYWdlLgorCSAqLworCW5wLT5tc2dvdXRbMF0gPSBNX0VYVEVOREVEOworCW5wLT5tc2dvdXRbMV0gPSAyOworCW5wLT5tc2dvdXRbMl0gPSBNX1hfV0lERV9SRVE7CisJbnAtPm1zZ291dFszXSA9IHdpZGU7CisKKwlucC0+bXNnaW4gWzBdID0gTV9OT09QOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQlzeW1fcHJpbnRfbmVnb19tc2cobnAsIHRhcmdldCwgIndpZGUgbXNnb3V0IiwgbnAtPm1zZ291dCk7CisJfQorCisJcmV0dXJuIDA7CisKK3JlamVjdF9pdDoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV93aWRlX25lZ28oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX3RjYiAqdHAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlpbnQgcmVxID0gMTsKKwlpbnQgcmVzdWx0OworCisJLyoKKwkgKiAgUmVxdWVzdCBvciBhbnN3ZXIgPworCSAqLworCWlmIChJTkIobnAsIEhTX1BSVCkgPT0gSFNfTkVHT1RJQVRFKSB7CisJCU9VVEIobnAsIEhTX1BSVCwgSFNfQlVTWSk7CisJCWlmIChjcC0+bmVnb19zdGF0dXMgJiYgY3AtPm5lZ29fc3RhdHVzICE9IE5TX1dJREUpCisJCQlnb3RvIHJlamVjdF9pdDsKKwkJcmVxID0gMDsKKwl9CisKKwkvKgorCSAqICBDaGVjayBhbmQgYXBwbHkgbmV3IHZhbHVlcy4KKwkgKi8KKwlyZXN1bHQgPSBzeW1fd2lkZV9uZWdvX2NoZWNrKG5wLCByZXEsIGNwKTsKKwlpZiAocmVzdWx0KQkvKiBOb3QgYWNjZXB0YWJsZSwgcmVqZWN0IGl0ICovCisJCWdvdG8gcmVqZWN0X2l0OworCWlmIChyZXEpIHsJLyogV2FzIGEgcmVxdWVzdCwgc2VuZCByZXNwb25zZS4gKi8KKwkJY3AtPm5lZ29fc3RhdHVzID0gTlNfV0lERTsKKwkJT1VUTF9EU1AobnAsIFNDUklQVEJfQkEobnAsIHdkdHJfcmVzcCkpOworCX0gZWxzZSB7CQkvKiBXYXMgYSByZXNwb25zZS4gKi8KKwkJLyoKKwkJICogTmVnb3RpYXRlIGZvciBTWU5DIGltbWVkaWF0ZWx5IGFmdGVyIFdJREUgcmVzcG9uc2UuCisJCSAqIFRoaXMgYWxsb3dzIHRvIG5lZ290aWF0ZSBmb3IgYm90aCBXSURFIGFuZCBTWU5DIG9uIAorCQkgKiBhIHNpbmdsZSBTQ1NJIGNvbW1hbmQgKFN1Z2dlc3RlZCBieSBKdXN0aW4gR2liYnMpLgorCQkgKi8KKwkJaWYgKHRwLT50Z29hbC5vZmZzZXQpIHsKKwkJCW5wLT5tc2dvdXRbMF0gPSBNX0VYVEVOREVEOworCQkJbnAtPm1zZ291dFsxXSA9IDM7CisJCQlucC0+bXNnb3V0WzJdID0gTV9YX1NZTkNfUkVROworCQkJbnAtPm1zZ291dFszXSA9IHRwLT50Z29hbC5wZXJpb2Q7CisJCQlucC0+bXNnb3V0WzRdID0gdHAtPnRnb2FsLm9mZnNldDsKKworCQkJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfTkVHTykgeworCQkJCXN5bV9wcmludF9uZWdvX21zZyhucCwgY3AtPnRhcmdldCwKKwkJCQkgICAgICAgICAgICAgICAgICAgInN5bmMgbXNnb3V0IiwgbnAtPm1zZ291dCk7CisJCQl9CisKKwkJCWNwLT5uZWdvX3N0YXR1cyA9IE5TX1NZTkM7CisJCQlPVVRCKG5wLCBIU19QUlQsIEhTX05FR09USUFURSk7CisJCQlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgc2R0cl9yZXNwKSk7CisJCQlyZXR1cm47CisJCX0gZWxzZQorCQkJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGNscmFjaykpOworCX0KKworCXJldHVybjsKKworcmVqZWN0X2l0OgorCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCBtc2dfYmFkKSk7Cit9CisKKy8qCisgKiAgUmVzZXQgRFQsIFNZTkMgb3IgV0lERSB0byBkZWZhdWx0IHNldHRpbmdzLgorICoKKyAqICBDYWxsZWQgd2hlbiBhIG5lZ290aWF0aW9uIGRvZXMgbm90IHN1Y2NlZWQgZWl0aGVyIAorICogIG9uIHJlamVjdGlvbiBvciBvbiBwcm90b2NvbCBlcnJvci4KKyAqCisgKiAgQSB0YXJnZXQgdGhhdCB1bmRlcnN0YW5kcyBhIFBQUiBtZXNzYWdlIHNob3VsZCBuZXZlciAKKyAqICByZWplY3QgaXQsIGFuZCBtZXNzaW5nIHdpdGggaXQgaXMgdmVyeSB1bmxpa2VseS4KKyAqICBTbywgaWYgYSBQUFIgbWFrZXMgcHJvYmxlbXMsIHdlIG1heSBqdXN0IHdhbnQgdG8gCisgKiAgdHJ5IGEgbGVnYWN5IG5lZ290aWF0aW9uIGxhdGVyLgorICovCitzdGF0aWMgdm9pZCBzeW1fbmVnb19kZWZhdWx0KHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV90Y2IgKnRwLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJc3dpdGNoIChjcC0+bmVnb19zdGF0dXMpIHsKKwljYXNlIE5TX1BQUjoKKyNpZiAwCisJCXN5bV9zZXRwcHJvdCAobnAsIGNwLT50YXJnZXQsIDAsIDAsIDAsIDAsIDAsIDApOworI2Vsc2UKKwkJaWYgKHRwLT50Z29hbC5wZXJpb2QgPCBucC0+bWluc3luYykKKwkJCXRwLT50Z29hbC5wZXJpb2QgPSBucC0+bWluc3luYzsKKwkJaWYgKHRwLT50Z29hbC5vZmZzZXQgPiBucC0+bWF4b2ZmcykKKwkJCXRwLT50Z29hbC5vZmZzZXQgPSBucC0+bWF4b2ZmczsKKwkJdHAtPnRnb2FsLml1ID0gdHAtPnRnb2FsLmR0ID0gdHAtPnRnb2FsLnFhcyA9IDA7CisJCXRwLT50Z29hbC5jaGVja19uZWdvID0gMTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIE5TX1NZTkM6CisJCXN5bV9zZXRzeW5jIChucCwgY3AtPnRhcmdldCwgMCwgMCwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgTlNfV0lERToKKwkJc3ltX3NldHdpZGUgKG5wLCBjcC0+dGFyZ2V0LCAwKTsKKwkJYnJlYWs7CisJfQorCW5wLT5tc2dpbiBbMF0gPSBNX05PT1A7CisJbnAtPm1zZ291dFswXSA9IE1fTk9PUDsKKwljcC0+bmVnb19zdGF0dXMgPSAwOworfQorCisvKgorICogIGNoaXAgaGFuZGxlciBmb3IgTUVTU0FHRSBSRUpFQ1QgcmVjZWl2ZWQgaW4gcmVzcG9uc2UgdG8gCisgKiAgUFBSLCBXSURFIG9yIFNZTkNIUk9OT1VTIG5lZ290aWF0aW9uLgorICovCitzdGF0aWMgdm9pZCBzeW1fbmVnb19yZWplY3RlZChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fdGNiICp0cCwgc3RydWN0IHN5bV9jY2IgKmNwKQoreworCXN5bV9uZWdvX2RlZmF1bHQobnAsIHRwLCBjcCk7CisJT1VUQihucCwgSFNfUFJULCBIU19CVVNZKTsKK30KKworLyoKKyAqICBjaGlwIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBwcm9ncmFtbWVkIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHN5bV9pbnRfc2lyIChzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJdV9jaGFyCW51bQk9IElOQihucCwgbmNfZHNwcyk7CisJdTMyCWRzYQk9IElOTChucCwgbmNfZHNhKTsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3AJPSBzeW1fY2NiX2Zyb21fZHNhKG5wLCBkc2EpOworCXVfY2hhcgl0YXJnZXQJPSBJTkIobnAsIG5jX3NkaWQpICYgMHgwZjsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAJPSAmbnAtPnRhcmdldFt0YXJnZXRdOworCWludAl0bXA7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19USU5ZKSBwcmludGYgKCJJIyVkIiwgbnVtKTsKKworCXN3aXRjaCAobnVtKSB7CisjaWYgICBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKwkvKgorCSAqICBTQ1JJUFRTIHRlbGwgdXMgdGhhdCB3ZSBtYXkgaGF2ZSB0byB1cGRhdGUgCisJICogIDY0IGJpdCBETUEgc2VnbWVudCByZWdpc3RlcnMuCisJICovCisJY2FzZSBTSVJfRE1BUF9ESVJUWToKKwkJc3ltX3VwZGF0ZV9kbWFwX3JlZ3MobnApOworCQlnb3RvIG91dDsKKyNlbmRpZgorCS8qCisJICogIENvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkIHdpdGggZXJyb3IgY29uZGl0aW9uIAorCSAqICBvciBoYXMgYmVlbiBhdXRvLXNlbnNlZC4KKwkgKi8KKwljYXNlIFNJUl9DT01QTEVURV9FUlJPUjoKKwkJc3ltX2NvbXBsZXRlX2Vycm9yKG5wLCBjcCk7CisJCXJldHVybjsKKwkvKgorCSAqICBUaGUgQyBjb2RlIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gcmVjb3ZlciBmcm9tIHNvbWV0aGluZy4KKwkgKiAgVHlwaWNhbGx5LCB1c2VyIHdhbnQgdG8gYWJvcnQgc29tZSBjb21tYW5kLgorCSAqLworCWNhc2UgU0lSX1NDUklQVF9TVE9QUEVEOgorCWNhc2UgU0lSX1RBUkdFVF9TRUxFQ1RFRDoKKwljYXNlIFNJUl9BQk9SVF9TRU5UOgorCQlzeW1fc2lyX3Rhc2tfcmVjb3ZlcnkobnAsIG51bSk7CisJCXJldHVybjsKKwkvKgorCSAqICBUaGUgZGV2aWNlIGRpZG4ndCBnbyB0byBNU0cgT1VUIHBoYXNlIGFmdGVyIGhhdmluZyAKKwkgKiAgYmVlbiBzZWxlY3RlZCB3aXRoIEFUTi4gV2UgZG9ubm90IHdhbnQgdG8gaGFuZGxlIAorCSAqICB0aGF0LgorCSAqLworCWNhc2UgU0lSX1NFTF9BVE5fTk9fTVNHX09VVDoKKwkJcHJpbnRmICgiJXM6JWQ6IE5vIE1TRyBPVVQgcGhhc2UgYWZ0ZXIgc2VsZWN0aW9uIHdpdGggQVROLlxuIiwKKwkJCXN5bV9uYW1lIChucCksIHRhcmdldCk7CisJCWdvdG8gb3V0X3N0dWNrOworCS8qCisJICogIFRoZSBkZXZpY2UgZGlkbid0IHN3aXRjaCB0byBNU0cgSU4gcGhhc2UgYWZ0ZXIgCisJICogIGhhdmluZyByZXNlbGV0ZWQgdGhlIGluaXRpYXRvci4KKwkgKi8KKwljYXNlIFNJUl9SRVNFTF9OT19NU0dfSU46CisJCXByaW50ZiAoIiVzOiVkOiBObyBNU0cgSU4gcGhhc2UgYWZ0ZXIgcmVzZWxlY3Rpb24uXG4iLAorCQkJc3ltX25hbWUgKG5wKSwgdGFyZ2V0KTsKKwkJZ290byBvdXRfc3R1Y2s7CisJLyoKKwkgKiAgQWZ0ZXIgcmVzZWxlY3Rpb24sIHRoZSBkZXZpY2Ugc2VudCBhIG1lc3NhZ2UgdGhhdCB3YXNuJ3QgCisJICogIGFuIElERU5USUZZLgorCSAqLworCWNhc2UgU0lSX1JFU0VMX05PX0lERU5USUZZOgorCQlwcmludGYgKCIlczolZDogTm8gSURFTlRJRlkgYWZ0ZXIgcmVzZWxlY3Rpb24uXG4iLAorCQkJc3ltX25hbWUgKG5wKSwgdGFyZ2V0KTsKKwkJZ290byBvdXRfc3R1Y2s7CisJLyoKKwkgKiAgVGhlIGRldmljZSByZXNlbGVjdGVkIGEgTFVOIHdlIGRvbm5vdCBrbm93IGFib3V0LgorCSAqLworCWNhc2UgU0lSX1JFU0VMX0JBRF9MVU46CisJCW5wLT5tc2dvdXRbMF0gPSBNX1JFU0VUOworCQlnb3RvIG91dDsKKwkvKgorCSAqICBUaGUgZGV2aWNlIHJlc2VsZWN0ZWQgZm9yIGFuIHVudGFnZ2VkIG5leHVzIGFuZCB3ZSAKKwkgKiAgaGF2ZW4ndCBhbnkuCisJICovCisJY2FzZSBTSVJfUkVTRUxfQkFEX0lfVF9MOgorCQlucC0+bXNnb3V0WzBdID0gTV9BQk9SVDsKKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgVGhlIGRldmljZSByZXNlbGVjdGVkIGZvciBhIHRhZ2dlZCBuZXh1cyB0aGF0IHdlIGRvbm5vdCAKKwkgKiAgaGF2ZS4KKwkgKi8KKwljYXNlIFNJUl9SRVNFTF9CQURfSV9UX0xfUToKKwkJbnAtPm1zZ291dFswXSA9IE1fQUJPUlRfVEFHOworCQlnb3RvIG91dDsKKwkvKgorCSAqICBUaGUgU0NSSVBUUyBsZXQgdXMga25vdyB0aGF0IHRoZSBkZXZpY2UgaGFzIGdyYWJiZWQgCisJICogIG91ciBtZXNzYWdlIGFuZCB3aWxsIGFib3J0IHRoZSBqb2IuCisJICovCisJY2FzZSBTSVJfUkVTRUxfQUJPUlRFRDoKKwkJbnAtPmxhc3Rtc2cgPSBucC0+bXNnb3V0WzBdOworCQlucC0+bXNnb3V0WzBdID0gTV9OT09QOworCQlwcmludGYgKCIlczolZDogbWVzc2FnZSAleCBzZW50IG9uIGJhZCByZXNlbGVjdGlvbi5cbiIsCisJCQlzeW1fbmFtZSAobnApLCB0YXJnZXQsIG5wLT5sYXN0bXNnKTsKKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgVGhlIFNDUklQVFMgbGV0IHVzIGtub3cgdGhhdCBhIG1lc3NhZ2UgaGFzIGJlZW4gCisJICogIHN1Y2Nlc3NmdWxseSBzZW50IHRvIHRoZSBkZXZpY2UuCisJICovCisJY2FzZSBTSVJfTVNHX09VVF9ET05FOgorCQlucC0+bGFzdG1zZyA9IG5wLT5tc2dvdXRbMF07CisJCW5wLT5tc2dvdXRbMF0gPSBNX05PT1A7CisJCS8qIFNob3VsZCB3ZSByZWFsbHkgY2FyZSBvZiB0aGF0ICovCisJCWlmIChucC0+bGFzdG1zZyA9PSBNX1BBUklUWSB8fCBucC0+bGFzdG1zZyA9PSBNX0lEX0VSUk9SKSB7CisJCQlpZiAoY3ApIHsKKwkJCQljcC0+eGVycl9zdGF0dXMgJj0gflhFX1BBUklUWV9FUlI7CisJCQkJaWYgKCFjcC0+eGVycl9zdGF0dXMpCisJCQkJCU9VVE9GRkIobnAsIEhGX1BSVCwgSEZfRVhUX0VSUik7CisJCQl9CisJCX0KKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgVGhlIGRldmljZSBkaWRuJ3Qgc2VuZCBhIEdPT0QgU0NTSSBzdGF0dXMuCisJICogIFdlIG1heSBoYXZlIHNvbWUgd29yayB0byBkbyBwcmlvciB0byBhbGxvdyAKKwkgKiAgdGhlIFNDUklQVFMgcHJvY2Vzc29yIHRvIGNvbnRpbnVlLgorCSAqLworCWNhc2UgU0lSX0JBRF9TQ1NJX1NUQVRVUzoKKwkJaWYgKCFjcCkKKwkJCWdvdG8gb3V0OworCQlzeW1fc2lyX2JhZF9zY3NpX3N0YXR1cyhucCwgbnVtLCBjcCk7CisJCXJldHVybjsKKwkvKgorCSAqICBXZSBhcmUgYXNrZWQgYnkgdGhlIFNDUklQVFMgdG8gcHJlcGFyZSBhIAorCSAqICBSRUpFQ1QgbWVzc2FnZS4KKwkgKi8KKwljYXNlIFNJUl9SRUpFQ1RfVE9fU0VORDoKKwkJc3ltX3ByaW50X21zZyhjcCwgIk1fUkVKRUNUIHRvIHNlbmQgZm9yICIsIG5wLT5tc2dpbik7CisJCW5wLT5tc2dvdXRbMF0gPSBNX1JFSkVDVDsKKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgV2UgaGF2ZSBiZWVuIE9ERCBhdCB0aGUgZW5kIG9mIGEgREFUQSBJTiAKKwkgKiAgdHJhbnNmZXIgYW5kIHRoZSBkZXZpY2UgZGlkbid0IHNlbmQgYSAKKwkgKiAgSUdOT1JFIFdJREUgUkVTSURVRSBtZXNzYWdlLgorCSAqICBJdCBpcyBhIGRhdGEgb3ZlcnJ1biBjb25kaXRpb24uCisJICovCisJY2FzZSBTSVJfU1dJREVfT1ZFUlJVTjoKKwkJaWYgKGNwKSB7CisJCQlPVVRPTkIobnAsIEhGX1BSVCwgSEZfRVhUX0VSUik7CisJCQljcC0+eGVycl9zdGF0dXMgfD0gWEVfU1dJREVfT1ZSVU47CisJCX0KKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgV2UgaGF2ZSBiZWVuIE9ERCBhdCB0aGUgZW5kIG9mIGEgREFUQSBPVVQgCisJICogIHRyYW5zZmVyLgorCSAqICBJdCBpcyBhIGRhdGEgdW5kZXJydW4gY29uZGl0aW9uLgorCSAqLworCWNhc2UgU0lSX1NPRExfVU5ERVJSVU46CisJCWlmIChjcCkgeworCQkJT1VUT05CKG5wLCBIRl9QUlQsIEhGX0VYVF9FUlIpOworCQkJY3AtPnhlcnJfc3RhdHVzIHw9IFhFX1NPRExfVU5SVU47CisJCX0KKwkJZ290byBvdXQ7CisJLyoKKwkgKiAgVGhlIGRldmljZSB3YW50cyB1cyB0byB0cmFuZmVyIG1vcmUgZGF0YSB0aGFuIAorCSAqICBleHBlY3RlZCBvciBpbiB0aGUgd3JvbmcgZGlyZWN0aW9uLgorCSAqICBUaGUgbnVtYmVyIG9mIGV4dHJhIGJ5dGVzIGlzIGluIHNjcmF0Y2hhLgorCSAqICBJdCBpcyBhIGRhdGEgb3ZlcnJ1biBjb25kaXRpb24uCisJICovCisJY2FzZSBTSVJfREFUQV9PVkVSUlVOOgorCQlpZiAoY3ApIHsKKwkJCU9VVE9OQihucCwgSEZfUFJULCBIRl9FWFRfRVJSKTsKKwkJCWNwLT54ZXJyX3N0YXR1cyB8PSBYRV9FWFRSQV9EQVRBOworCQkJY3AtPmV4dHJhX2J5dGVzICs9IElOTChucCwgbmNfc2NyYXRjaGEpOworCQl9CisJCWdvdG8gb3V0OworCS8qCisJICogIFRoZSBkZXZpY2Ugc3dpdGNoZWQgdG8gYW4gaWxsZWdhbCBwaGFzZSAoNC81KS4KKwkgKi8KKwljYXNlIFNJUl9CQURfUEhBU0U6CisJCWlmIChjcCkgeworCQkJT1VUT05CKG5wLCBIRl9QUlQsIEhGX0VYVF9FUlIpOworCQkJY3AtPnhlcnJfc3RhdHVzIHw9IFhFX0JBRF9QSEFTRTsKKwkJfQorCQlnb3RvIG91dDsKKwkvKgorCSAqICBXZSByZWNlaXZlZCBhIG1lc3NhZ2UuCisJICovCisJY2FzZSBTSVJfTVNHX1JFQ0VJVkVEOgorCQlpZiAoIWNwKQorCQkJZ290byBvdXRfc3R1Y2s7CisJCXN3aXRjaCAobnAtPm1zZ2luIFswXSkgeworCQkvKgorCQkgKiAgV2UgcmVjZWl2ZWQgYW4gZXh0ZW5kZWQgbWVzc2FnZS4KKwkJICogIFdlIGhhbmRsZSBNT0RJRlkgREFUQSBQT0lOVEVSLCBTRFRSLCBXRFRSIAorCQkgKiAgYW5kIHJlamVjdCBhbGwgb3RoZXIgZXh0ZW5kZWQgbWVzc2FnZXMuCisJCSAqLworCQljYXNlIE1fRVhURU5ERUQ6CisJCQlzd2l0Y2ggKG5wLT5tc2dpbiBbMl0pIHsKKwkJCWNhc2UgTV9YX01PRElGWV9EUDoKKwkJCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19QT0lOVEVSKQorCQkJCQlzeW1fcHJpbnRfbXNnKGNwLCJtb2RpZnkgRFAiLG5wLT5tc2dpbik7CisJCQkJdG1wID0gKG5wLT5tc2dpblszXTw8MjQpICsgKG5wLT5tc2dpbls0XTw8MTYpICsgCisJCQkJICAgICAgKG5wLT5tc2dpbls1XTw8OCkgICsgKG5wLT5tc2dpbls2XSk7CisJCQkJc3ltX21vZGlmeV9kcChucCwgdHAsIGNwLCB0bXApOworCQkJCXJldHVybjsKKwkJCWNhc2UgTV9YX1NZTkNfUkVROgorCQkJCXN5bV9zeW5jX25lZ28obnAsIHRwLCBjcCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNX1hfUFBSX1JFUToKKwkJCQlzeW1fcHByX25lZ28obnAsIHRwLCBjcCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBNX1hfV0lERV9SRVE6CisJCQkJc3ltX3dpZGVfbmVnbyhucCwgdHAsIGNwKTsKKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0X3JlamVjdDsKKwkJCX0KKwkJCWJyZWFrOworCQkvKgorCQkgKiAgV2UgcmVjZWl2ZWQgYSAxLzIgYnl0ZSBtZXNzYWdlIG5vdCBoYW5kbGVkIGZyb20gU0NSSVBUUy4KKwkJICogIFdlIGFyZSBvbmx5IGV4cGVjdGluZyBNRVNTQUdFIFJFSkVDVCBhbmQgSUdOT1JFIFdJREUgCisJCSAqICBSRVNJRFVFIG1lc3NhZ2VzIHRoYXQgaGF2ZW4ndCBiZWVuIGFudGljaXBhdGVkIGJ5IAorCQkgKiAgU0NSSVBUUyBvbiBTV0lERSBmdWxsIGNvbmRpdGlvbi4gVW5hbnRpY2lwYXRlZCBJR05PUkUgCisJCSAqICBXSURFIFJFU0lEVUUgbWVzc2FnZXMgYXJlIGFsaWFzZWQgYXMgTU9ESUZZIERQICgtMSkuCisJCSAqLworCQljYXNlIE1fSUdOX1JFU0lEVUU6CisJCQlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19QT0lOVEVSKQorCQkJCXN5bV9wcmludF9tc2coY3AsImlnbiB3aWRlIHJlc2lkdWUiLCBucC0+bXNnaW4pOworCQkJaWYgKGNwLT5ob3N0X2ZsYWdzICYgSEZfU0VOU0UpCisJCQkJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGNscmFjaykpOworCQkJZWxzZQorCQkJCXN5bV9tb2RpZnlfZHAobnAsIHRwLCBjcCwgLTEpOworCQkJcmV0dXJuOworCQljYXNlIE1fUkVKRUNUOgorCQkJaWYgKElOQihucCwgSFNfUFJUKSA9PSBIU19ORUdPVElBVEUpCisJCQkJc3ltX25lZ29fcmVqZWN0ZWQobnAsIHRwLCBjcCk7CisJCQllbHNlIHsKKwkJCQlzeW1fcHJpbnRfYWRkcihjcC0+Y21kLAorCQkJCQkiTV9SRUpFQ1QgcmVjZWl2ZWQgKCV4OiV4KS5cbiIsCisJCQkJCXNjcl90b19jcHUobnAtPmxhc3Rtc2cpLCBucC0+bXNnb3V0WzBdKTsKKwkJCX0KKwkJCWdvdG8gb3V0X2NscmFjazsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXRfcmVqZWN0OworCQl9CisJCWJyZWFrOworCS8qCisJICogIFdlIHJlY2VpdmVkIGFuIHVua25vd24gbWVzc2FnZS4KKwkgKiAgSWdub3JlIGFsbCBNU0cgSU4gcGhhc2VzIGFuZCByZWplY3QgaXQuCisJICovCisJY2FzZSBTSVJfTVNHX1dFSVJEOgorCQlzeW1fcHJpbnRfbXNnKGNwLCAiV0VJUkQgbWVzc2FnZSByZWNlaXZlZCIsIG5wLT5tc2dpbik7CisJCU9VVExfRFNQKG5wLCBTQ1JJUFRCX0JBKG5wLCBtc2dfd2VpcmQpKTsKKwkJcmV0dXJuOworCS8qCisJICogIE5lZ290aWF0aW9uIGZhaWxlZC4KKwkgKiAgVGFyZ2V0IGRvZXMgbm90IHNlbmQgdXMgdGhlIHJlcGx5LgorCSAqICBSZW1vdmUgdGhlIEhTX05FR09USUFURSBzdGF0dXMuCisJICovCisJY2FzZSBTSVJfTkVHT19GQUlMRUQ6CisJCU9VVEIobnAsIEhTX1BSVCwgSFNfQlVTWSk7CisJLyoKKwkgKiAgTmVnb3RpYXRpb24gZmFpbGVkLgorCSAqICBUYXJnZXQgZG9lcyBub3Qgd2FudCBhbnN3ZXIgbWVzc2FnZS4KKwkgKi8KKwljYXNlIFNJUl9ORUdPX1BST1RPOgorCQlzeW1fbmVnb19kZWZhdWx0KG5wLCB0cCwgY3ApOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlPVVRPTkJfU1REKCk7CisJcmV0dXJuOworb3V0X3JlamVjdDoKKwlPVVRMX0RTUChucCwgU0NSSVBUQl9CQShucCwgbXNnX2JhZCkpOworCXJldHVybjsKK291dF9jbHJhY2s6CisJT1VUTF9EU1AobnAsIFNDUklQVEFfQkEobnAsIGNscmFjaykpOworCXJldHVybjsKK291dF9zdHVjazoKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgQWNxdWlyZSBhIGNvbnRyb2wgYmxvY2sKKyAqLworc3RydWN0IHN5bV9jY2IgKnN5bV9nZXRfY2NiIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdV9jaGFyIHRhZ19vcmRlcikKK3sKKwl1X2NoYXIgdG4gPSBjbWQtPmRldmljZS0+aWQ7CisJdV9jaGFyIGxuID0gY21kLT5kZXZpY2UtPmx1bjsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0bl07CisJc3RydWN0IHN5bV9sY2IgKmxwID0gc3ltX2xwKHRwLCBsbik7CisJdV9zaG9ydCB0YWcgPSBOT19UQUc7CisJU1lNX1FVRUhFQUQgKnFwOworCXN0cnVjdCBzeW1fY2NiICpjcCA9IE5VTEw7CisKKwkvKgorCSAqICBMb29rIGZvciBhIGZyZWUgQ0NCCisJICovCisJaWYgKHN5bV9xdWVfZW1wdHkoJm5wLT5mcmVlX2NjYnEpKQorCQlzeW1fYWxsb2NfY2NiKG5wKTsKKwlxcCA9IHN5bV9yZW1xdWVfaGVhZCgmbnAtPmZyZWVfY2NicSk7CisJaWYgKCFxcCkKKwkJZ290byBvdXQ7CisJY3AgPSBzeW1fcXVlX2VudHJ5KHFwLCBzdHJ1Y3Qgc3ltX2NjYiwgbGlua19jY2JxKTsKKworI2lmbmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkvKgorCSAqICBJZiB0aGUgTENCIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGFuZCB0aGUgTFVOCisJICogIGhhcyBiZWVuIHByb2JlZCBvaywgdHJ5IHRvIGFsbG9jYXRlIHRoZSBMQ0IuCisJICovCisJaWYgKCFscCAmJiBzeW1faXNfYml0KHRwLT5sdW5fbWFwLCBsbikpIHsKKwkJbHAgPSBzeW1fYWxsb2NfbGNiKG5wLCB0biwgbG4pOworCQlpZiAoIWxwKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisjZW5kaWYKKworCS8qCisJICogIElmIHRoZSBMQ0IgaXMgbm90IGF2YWlsYWJsZSBoZXJlLCB0aGVuIHRoZSAKKwkgKiAgbG9naWNhbCB1bml0IGlzIG5vdCB5ZXQgZGlzY292ZXJlZC4gRm9yIHRob3NlIAorCSAqICBvbmVzIG9ubHkgYWNjZXB0IDEgU0NTSSBJTyBwZXIgbG9naWNhbCB1bml0LCAKKwkgKiAgc2luY2Ugd2UgY2Fubm90IGFsbG93IGRpc2Nvbm5lY3Rpb25zLgorCSAqLworCWlmICghbHApIHsKKwkJaWYgKCFzeW1faXNfYml0KHRwLT5idXN5MF9tYXAsIGxuKSkKKwkJCXN5bV9zZXRfYml0KHRwLT5idXN5MF9tYXAsIGxuKTsKKwkJZWxzZQorCQkJZ290byBvdXRfZnJlZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAgSWYgd2UgaGF2ZSBiZWVuIGFza2VkIGZvciBhIHRhZ2dlZCBjb21tYW5kLgorCQkgKi8KKwkJaWYgKHRhZ19vcmRlcikgeworCQkJLyoKKwkJCSAqICBEZWJ1Z2dpbmcgcHVycG9zZS4KKwkJCSAqLworI2lmbmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkJCWFzc2VydChscC0+YnVzeV9pdGwgPT0gMCk7CisjZW5kaWYKKwkJCS8qCisJCQkgKiAgQWxsb2NhdGUgcmVzb3VyY2VzIGZvciB0YWdzIGlmIG5vdCB5ZXQuCisJCQkgKi8KKwkJCWlmICghbHAtPmNiX3RhZ3MpIHsKKwkJCQlzeW1fYWxsb2NfbGNiX3RhZ3MobnAsIHRuLCBsbik7CisJCQkJaWYgKCFscC0+Y2JfdGFncykKKwkJCQkJZ290byBvdXRfZnJlZTsKKwkJCX0KKwkJCS8qCisJCQkgKiAgR2V0IGEgdGFnIGZvciB0aGlzIFNDU0kgSU8gYW5kIHNldCB1cAorCQkJICogIHRoZSBDQ0IgYnVzIGFkZHJlc3MgZm9yIHJlc2VsZWN0aW9uLCAKKwkJCSAqICBhbmQgY291bnQgaXQgZm9yIHRoaXMgTFVOLgorCQkJICogIFRvZ2dsZSByZXNlbGVjdCBwYXRoIHRvIHRhZ2dlZC4KKwkJCSAqLworCQkJaWYgKGxwLT5idXN5X2l0bHEgPCBTWU1fQ09ORl9NQVhfVEFTSykgeworCQkJCXRhZyA9IGxwLT5jYl90YWdzW2xwLT5pYV90YWddOworCQkJCWlmICgrK2xwLT5pYV90YWcgPT0gU1lNX0NPTkZfTUFYX1RBU0spCisJCQkJCWxwLT5pYV90YWcgPSAwOworCQkJCSsrbHAtPmJ1c3lfaXRscTsKKyNpZm5kZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJCQkJbHAtPml0bHFfdGJsW3RhZ10gPSBjcHVfdG9fc2NyKGNwLT5jY2JfYmEpOworCQkJCWxwLT5oZWFkLnJlc2VsX3NhID0KKwkJCQkJY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCByZXNlbF90YWcpKTsKKyNlbmRpZgorI2lmZGVmIFNZTV9PUFRfTElNSVRfQ09NTUFORF9SRU9SREVSSU5HCisJCQkJY3AtPnRhZ3Nfc2kgPSBscC0+dGFnc19zaTsKKwkJCQkrK2xwLT50YWdzX3N1bVtjcC0+dGFnc19zaV07CisJCQkJKytscC0+dGFnc19zaW5jZTsKKyNlbmRpZgorCQkJfQorCQkJZWxzZQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJLyoKKwkJICogIFRoaXMgY29tbWFuZCB3aWxsIG5vdCBiZSB0YWdnZWQuCisJCSAqICBJZiB3ZSBhbHJlYWR5IGhhdmUgZWl0aGVyIGEgdGFnZ2VkIG9yIHVudGFnZ2VkIAorCQkgKiAgb25lLCByZWZ1c2UgdG8gb3ZlcmxhcCB0aGlzIHVudGFnZ2VkIG9uZS4KKwkJICovCisJCWVsc2UgeworCQkJLyoKKwkJCSAqICBEZWJ1Z2dpbmcgcHVycG9zZS4KKwkJCSAqLworI2lmbmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkJCWFzc2VydChscC0+YnVzeV9pdGwgPT0gMCAmJiBscC0+YnVzeV9pdGxxID09IDApOworI2VuZGlmCisJCQkvKgorCQkJICogIENvdW50IHRoaXMgbmV4dXMgZm9yIHRoaXMgTFVOLgorCQkJICogIFNldCB1cCB0aGUgQ0NCIGJ1cyBhZGRyZXNzIGZvciByZXNlbGVjdGlvbi4KKwkJCSAqICBUb2dnbGUgcmVzZWxlY3QgcGF0aCB0byB1bnRhZ2dlZC4KKwkJCSAqLworCQkJKytscC0+YnVzeV9pdGw7CisjaWZuZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCQkJaWYgKGxwLT5idXN5X2l0bCA9PSAxKSB7CisJCQkJbHAtPmhlYWQuaXRsX3Rhc2tfc2EgPSBjcHVfdG9fc2NyKGNwLT5jY2JfYmEpOworCQkJCWxwLT5oZWFkLnJlc2VsX3NhID0KKwkJCQkgICAgICBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIHJlc2VsX25vX3RhZykpOworCQkJfQorCQkJZWxzZQorCQkJCWdvdG8gb3V0X2ZyZWU7CisjZW5kaWYKKwkJfQorCX0KKwkvKgorCSAqICBQdXQgdGhlIENDQiBpbnRvIHRoZSBidXN5IHF1ZXVlLgorCSAqLworCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmtfY2NicSwgJm5wLT5idXN5X2NjYnEpOworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCWlmIChscCkgeworCQlzeW1fcmVtcXVlKCZjcC0+bGluazJfY2NicSk7CisJCXN5bV9pbnNxdWVfdGFpbCgmY3AtPmxpbmsyX2NjYnEsICZscC0+d2FpdGluZ19jY2JxKTsKKwl9CisKKyNlbmRpZgorCS8qCisJICogIFJlbWVtYmVyIGFsbCBpbmZvcm1hdGlvbnMgbmVlZGVkIHRvIGZyZWUgdGhpcyBDQ0IuCisJICovCisJY3AtPnRvX2Fib3J0ID0gMDsKKwljcC0+dGFnCSAgID0gdGFnOworCWNwLT5vcmRlciAgPSB0YWdfb3JkZXI7CisJY3AtPnRhcmdldCA9IHRuOworCWNwLT5sdW4gICAgPSBsbjsKKworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX1RBR1MpIHsKKwkJc3ltX3ByaW50X2FkZHIoY21kLCAiY2NiIEAlcCB1c2luZyB0YWcgJWQuXG4iLCBjcCwgdGFnKTsKKwl9CisKK291dDoKKwlyZXR1cm4gY3A7CitvdXRfZnJlZToKKwlzeW1faW5zcXVlX2hlYWQoJmNwLT5saW5rX2NjYnEsICZucC0+ZnJlZV9jY2JxKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqICBSZWxlYXNlIG9uZSBjb250cm9sIGJsb2NrCisgKi8KK3ZvaWQgc3ltX2ZyZWVfY2NiIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFtjcC0+dGFyZ2V0XTsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHAgPSBzeW1fbHAodHAsIGNwLT5sdW4pOworCisJaWYgKERFQlVHX0ZMQUdTICYgREVCVUdfVEFHUykgeworCQlzeW1fcHJpbnRfYWRkcihjcC0+Y21kLCAiY2NiIEAlcCBmcmVlaW5nIHRhZyAlZC5cbiIsCisJCQkJY3AsIGNwLT50YWcpOworCX0KKworCS8qCisJICogIElmIExDQiBhdmFpbGFibGUsCisJICovCisJaWYgKGxwKSB7CisJCS8qCisJCSAqICBJZiB0YWdnZWQsIHJlbGVhc2UgdGhlIHRhZywgc2V0IHRoZSByZWxlY3QgcGF0aCAKKwkJICovCisJCWlmIChjcC0+dGFnICE9IE5PX1RBRykgeworI2lmZGVmIFNZTV9PUFRfTElNSVRfQ09NTUFORF9SRU9SREVSSU5HCisJCQktLWxwLT50YWdzX3N1bVtjcC0+dGFnc19zaV07CisjZW5kaWYKKwkJCS8qCisJCQkgKiAgRnJlZSB0aGUgdGFnIHZhbHVlLgorCQkJICovCisJCQlscC0+Y2JfdGFnc1tscC0+aWZfdGFnXSA9IGNwLT50YWc7CisJCQlpZiAoKytscC0+aWZfdGFnID09IFNZTV9DT05GX01BWF9UQVNLKQorCQkJCWxwLT5pZl90YWcgPSAwOworCQkJLyoKKwkJCSAqICBNYWtlIHRoZSByZXNlbGVjdCBwYXRoIGludmFsaWQsIAorCQkJICogIGFuZCB1bmNvdW50IHRoaXMgQ0NCLgorCQkJICovCisJCQlscC0+aXRscV90YmxbY3AtPnRhZ10gPSBjcHVfdG9fc2NyKG5wLT5iYWRfaXRscV9iYSk7CisJCQktLWxwLT5idXN5X2l0bHE7CisJCX0gZWxzZSB7CS8qIFVudGFnZ2VkICovCisJCQkvKgorCQkJICogIE1ha2UgdGhlIHJlc2VsZWN0IHBhdGggaW52YWxpZCwgCisJCQkgKiAgYW5kIHVuY291bnQgdGhpcyBDQ0IuCisJCQkgKi8KKwkJCWxwLT5oZWFkLml0bF90YXNrX3NhID0gY3B1X3RvX3NjcihucC0+YmFkX2l0bF9iYSk7CisJCQktLWxwLT5idXN5X2l0bDsKKwkJfQorCQkvKgorCQkgKiAgSWYgbm8gSk9CIGFjdGl2ZSwgbWFrZSB0aGUgTFVOIHJlc2VsZWN0IHBhdGggaW52YWxpZC4KKwkJICovCisJCWlmIChscC0+YnVzeV9pdGxxID09IDAgJiYgbHAtPmJ1c3lfaXRsID09IDApCisJCQlscC0+aGVhZC5yZXNlbF9zYSA9CisJCQkJY3B1X3RvX3NjcihTQ1JJUFRCX0JBKG5wLCByZXNlbF9iYWRfbHVuKSk7CisJfQorCS8qCisJICogIE90aGVyd2lzZSwgd2Ugb25seSBhY2NlcHQgMSBJTyBwZXIgTFVOLgorCSAqICBDbGVhciB0aGUgYml0IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhpcyBJTy4KKwkgKi8KKwllbHNlCisJCXN5bV9jbHJfYml0KHRwLT5idXN5MF9tYXAsIGNwLT5sdW4pOworCisJLyoKKwkgKiAgV2UgZG9ubm90IHF1ZXVlIG1vcmUgdGhhbiAxIGNjYiBwZXIgdGFyZ2V0IAorCSAqICB3aXRoIG5lZ290aWF0aW9uIGF0IGFueSB0aW1lLiBJZiB0aGlzIGNjYiB3YXMgCisJICogIHVzZWQgZm9yIG5lZ290aWF0aW9uLCBjbGVhciB0aGlzIGluZm8gaW4gdGhlIHRjYi4KKwkgKi8KKwlpZiAoY3AgPT0gdHAtPm5lZ29fY3ApCisJCXRwLT5uZWdvX2NwID0gTlVMTDsKKworI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorCS8qCisJICogIElmIHdlIGp1c3QgY29tcGxldGUgdGhlIGxhc3QgcXVldWVkIENDQiwKKwkgKiAgY2xlYXIgdGhpcyBpbmZvIHRoYXQgaXMgbm8gbG9uZ2VyIHJlbGV2YW50LgorCSAqLworCWlmIChjcCA9PSBucC0+bGFzdF9jcCkKKwkJbnAtPmxhc3RfY3AgPSAwOworI2VuZGlmCisKKwkvKgorCSAqICBNYWtlIHRoaXMgQ0NCIGF2YWlsYWJsZS4KKwkgKi8KKwljcC0+Y21kID0gTlVMTDsKKwljcC0+aG9zdF9zdGF0dXMgPSBIU19JRExFOworCXN5bV9yZW1xdWUoJmNwLT5saW5rX2NjYnEpOworCXN5bV9pbnNxdWVfaGVhZCgmY3AtPmxpbmtfY2NicSwgJm5wLT5mcmVlX2NjYnEpOworCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJaWYgKGxwKSB7CisJCXN5bV9yZW1xdWUoJmNwLT5saW5rMl9jY2JxKTsKKwkJc3ltX2luc3F1ZV90YWlsKCZjcC0+bGluazJfY2NicSwgJm5wLT5kdW1teV9jY2JxKTsKKwkJaWYgKGNwLT5zdGFydGVkKSB7CisJCQlpZiAoY3AtPnRhZyAhPSBOT19UQUcpCisJCQkJLS1scC0+c3RhcnRlZF90YWdzOworCQkJZWxzZQorCQkJCS0tbHAtPnN0YXJ0ZWRfbm9fdGFnOworCQl9CisJfQorCWNwLT5zdGFydGVkID0gMDsKKyNlbmRpZgorfQorCisvKgorICogIEFsbG9jYXRlIGEgQ0NCIGZyb20gbWVtb3J5IGFuZCBpbml0aWFsaXplIGl0cyBmaXhlZCBwYXJ0LgorICovCitzdGF0aWMgc3RydWN0IHN5bV9jY2IgKnN5bV9hbGxvY19jY2Ioc3RydWN0IHN5bV9oY2IgKm5wKQoreworCXN0cnVjdCBzeW1fY2NiICpjcCA9IE5VTEw7CisJaW50IGhjb2RlOworCisJLyoKKwkgKiAgUHJldmVudCBmcm9tIGFsbG9jYXRpbmcgbW9yZSBDQ0JzIHRoYW4gd2UgY2FuIAorCSAqICBxdWV1ZSB0byB0aGUgY29udHJvbGxlci4KKwkgKi8KKwlpZiAobnAtPmFjdGNjYnMgPj0gU1lNX0NPTkZfTUFYX1NUQVJUKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBDQ0IuCisJICovCisJY3AgPSBzeW1fY2FsbG9jX2RtYShzaXplb2Yoc3RydWN0IHN5bV9jY2IpLCAiQ0NCIik7CisJaWYgKCFjcCkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qCisJICogIENvdW50IGl0LgorCSAqLworCW5wLT5hY3RjY2JzKys7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSBidXMgYWRkcmVzcyBvZiB0aGlzIGNjYi4KKwkgKi8KKwljcC0+Y2NiX2JhID0gdnRvYnVzKGNwKTsKKworCS8qCisJICogIEluc2VydCB0aGlzIGNjYiBpbnRvIHRoZSBoYXNoZWQgbGlzdC4KKwkgKi8KKwloY29kZSA9IENDQl9IQVNIX0NPREUoY3AtPmNjYl9iYSk7CisJY3AtPmxpbmtfY2NiaCA9IG5wLT5jY2JoW2hjb2RlXTsKKwlucC0+Y2NiaFtoY29kZV0gPSBjcDsKKworCS8qCisJICogIEluaXRpYWx5emUgdGhlIHN0YXJ0IGFuZCByZXN0YXJ0IGFjdGlvbnMuCisJICovCisJY3AtPnBoeXMuaGVhZC5nby5zdGFydCAgID0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCBpZGxlKSk7CisJY3AtPnBoeXMuaGVhZC5nby5yZXN0YXJ0ID0gY3B1X3RvX3NjcihTQ1JJUFRCX0JBKG5wLCBiYWRfaV90X2wpKTsKKworIAkvKgorCSAqICBJbml0aWxpYWx5emUgc29tZSBvdGhlciBmaWVsZHMuCisJICovCisJY3AtPnBoeXMuc21zZ19leHQuYWRkciA9IGNwdV90b19zY3IoSENCX0JBKG5wLCBtc2dpblsyXSkpOworCisJLyoKKwkgKiAgQ2hhaW4gaW50byBmcmVlIGNjYiBxdWV1ZS4KKwkgKi8KKwlzeW1faW5zcXVlX2hlYWQoJmNwLT5saW5rX2NjYnEsICZucC0+ZnJlZV9jY2JxKTsKKworCS8qCisJICogIENoYWluIGludG8gb3B0aW9ubmFsIGxpc3RzLgorCSAqLworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCXN5bV9pbnNxdWVfaGVhZCgmY3AtPmxpbmsyX2NjYnEsICZucC0+ZHVtbXlfY2NicSk7CisjZW5kaWYKKwlyZXR1cm4gY3A7CitvdXRfZnJlZToKKwlpZiAoY3ApCisJCXN5bV9tZnJlZV9kbWEoY3AsIHNpemVvZigqY3ApLCAiQ0NCIik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAgTG9vayB1cCBhIENDQiBmcm9tIGEgRFNBIHZhbHVlLgorICovCitzdGF0aWMgc3RydWN0IHN5bV9jY2IgKnN5bV9jY2JfZnJvbV9kc2Eoc3RydWN0IHN5bV9oY2IgKm5wLCB1MzIgZHNhKQoreworCWludCBoY29kZTsKKwlzdHJ1Y3Qgc3ltX2NjYiAqY3A7CisKKwloY29kZSA9IENDQl9IQVNIX0NPREUoZHNhKTsKKwljcCA9IG5wLT5jY2JoW2hjb2RlXTsKKwl3aGlsZSAoY3ApIHsKKwkJaWYgKGNwLT5jY2JfYmEgPT0gZHNhKQorCQkJYnJlYWs7CisJCWNwID0gY3AtPmxpbmtfY2NiaDsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKy8qCisgKiAgVGFyZ2V0IGNvbnRyb2wgYmxvY2sgaW5pdGlhbGlzYXRpb24uCisgKiAgTm90aGluZyBpbXBvcnRhbnQgdG8gZG8gYXQgdGhlIG1vbWVudC4KKyAqLworc3RhdGljIHZvaWQgc3ltX2luaXRfdGNiIChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHVfY2hhciB0bikKK3sKKyNpZiAwCS8qICBIbW1tLi4uIHRoaXMgY2hlY2tpbmcgbG9va3MgcGFyYW5vaWQuICovCisJLyoKKwkgKiAgQ2hlY2sgc29tZSBhbGlnbm1lbnRzIHJlcXVpcmVkIGJ5IHRoZSBjaGlwLgorCSAqLwkKKwlhc3NlcnQgKCgob2Zmc2V0b2Yoc3RydWN0IHN5bV9yZWcsIG5jX3N4ZmVyKSBeCisJCW9mZnNldG9mKHN0cnVjdCBzeW1fdGNiLCBoZWFkLnN2YWwpKSAmMykgPT0gMCk7CisJYXNzZXJ0ICgoKG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCBuY19zY250bDMpIF4KKwkJb2Zmc2V0b2Yoc3RydWN0IHN5bV90Y2IsIGhlYWQud3ZhbCkpICYzKSA9PSAwKTsKKyNlbmRpZgorfQorCisvKgorICogIEx1biBjb250cm9sIGJsb2NrIGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLgorICovCitzdHJ1Y3Qgc3ltX2xjYiAqc3ltX2FsbG9jX2xjYiAoc3RydWN0IHN5bV9oY2IgKm5wLCB1X2NoYXIgdG4sIHVfY2hhciBsbikKK3sKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHAgPSAmbnAtPnRhcmdldFt0bl07CisJc3RydWN0IHN5bV9sY2IgKmxwID0gc3ltX2xwKHRwLCBsbik7CisKKwkvKgorCSAqICBBbHJlYWR5IGRvbmUsIGp1c3QgcmV0dXJuLgorCSAqLworCWlmIChscCkKKwkJcmV0dXJuIGxwOworCisJLyoKKwkgKiAgRG9ubm90IGFsbG93IExVTiBjb250cm9sIGJsb2NrIAorCSAqICBhbGxvY2F0aW9uIGZvciBub3QgcHJvYmVkIExVTnMuCisJICovCisJaWYgKCFzeW1faXNfYml0KHRwLT5sdW5fbWFwLCBsbikpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IGNvbnRyb2wgYmxvY2sgaWYgbm90IHlldC4KKwkgKi8KKwlzeW1faW5pdF90Y2IgKG5wLCB0bik7CisKKwkvKgorCSAqICBBbGxvY2F0ZSB0aGUgTENCIGJ1cyBhZGRyZXNzIGFycmF5LgorCSAqICBDb21wdXRlIHRoZSBidXMgYWRkcmVzcyBvZiB0aGlzIHRhYmxlLgorCSAqLworCWlmIChsbiAmJiAhdHAtPmx1bnRibCkgeworCQlpbnQgaTsKKworCQl0cC0+bHVudGJsID0gc3ltX2NhbGxvY19kbWEoMjU2LCAiTFVOVEJMIik7CisJCWlmICghdHAtPmx1bnRibCkKKwkJCWdvdG8gZmFpbDsKKwkJZm9yIChpID0gMCA7IGkgPCA2NCA7IGkrKykKKwkJCXRwLT5sdW50YmxbaV0gPSBjcHVfdG9fc2NyKHZ0b2J1cygmbnAtPmJhZGx1bl9zYSkpOworCQl0cC0+aGVhZC5sdW50Ymxfc2EgPSBjcHVfdG9fc2NyKHZ0b2J1cyh0cC0+bHVudGJsKSk7CisJfQorCisJLyoKKwkgKiAgQWxsb2NhdGUgdGhlIHRhYmxlIG9mIHBvaW50ZXJzIGZvciBMVU4ocykgPiAwLCBpZiBuZWVkZWQuCisJICovCisJaWYgKGxuICYmICF0cC0+bHVubXApIHsKKwkJdHAtPmx1bm1wID0ga2NhbGxvYyhTWU1fQ09ORl9NQVhfTFVOLCBzaXplb2Yoc3RydWN0IHN5bV9sY2IgKiksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghdHAtPmx1bm1wKQorCQkJZ290byBmYWlsOworCX0KKworCS8qCisJICogIEFsbG9jYXRlIHRoZSBsY2IuCisJICogIE1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBjaGlwLgorCSAqLworCWxwID0gc3ltX2NhbGxvY19kbWEoc2l6ZW9mKHN0cnVjdCBzeW1fbGNiKSwgIkxDQiIpOworCWlmICghbHApCisJCWdvdG8gZmFpbDsKKwlpZiAobG4pIHsKKwkJdHAtPmx1bm1wW2xuXSA9IGxwOworCQl0cC0+bHVudGJsW2xuXSA9IGNwdV90b19zY3IodnRvYnVzKGxwKSk7CisJfQorCWVsc2UgeworCQl0cC0+bHVuMHAgPSBscDsKKwkJdHAtPmhlYWQubHVuMF9zYSA9IGNwdV90b19zY3IodnRvYnVzKGxwKSk7CisJfQorCisJLyoKKwkgKiAgTGV0IHRoZSBpdGwgdGFzayBwb2ludCB0byBlcnJvciBoYW5kbGluZy4KKwkgKi8KKwlscC0+aGVhZC5pdGxfdGFza19zYSA9IGNwdV90b19zY3IobnAtPmJhZF9pdGxfYmEpOworCisJLyoKKwkgKiAgU2V0IHRoZSByZXNlbGVjdCBwYXR0ZXJuIHRvIG91ciBkZWZhdWx0LiA6KQorCSAqLworCWxwLT5oZWFkLnJlc2VsX3NhID0gY3B1X3RvX3NjcihTQ1JJUFRCX0JBKG5wLCByZXNlbF9iYWRfbHVuKSk7CisKKwkvKgorCSAqICBTZXQgdXNlciBjYXBhYmlsaXRpZXMuCisJICovCisJbHAtPnVzZXJfZmxhZ3MgPSB0cC0+dXNyZmxhZ3MgJiAoU1lNX0RJU0NfRU5BQkxFRCB8IFNZTV9UQUdTX0VOQUJMRUQpOworCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSBkZXZpY2UgcXVldWVpbmcuCisJICovCisJc3ltX3F1ZV9pbml0KCZscC0+d2FpdGluZ19jY2JxKTsKKwlzeW1fcXVlX2luaXQoJmxwLT5zdGFydGVkX2NjYnEpOworCWxwLT5zdGFydGVkX21heCAgID0gU1lNX0NPTkZfTUFYX1RBU0s7CisJbHAtPnN0YXJ0ZWRfbGltaXQgPSBTWU1fQ09ORl9NQVhfVEFTSzsKKyNlbmRpZgorCS8qCisJICogIElmIHdlIGFyZSBidXN5LCBjb3VudCB0aGUgSU8uCisJICovCisJaWYgKHN5bV9pc19iaXQodHAtPmJ1c3kwX21hcCwgbG4pKSB7CisJCWxwLT5idXN5X2l0bCA9IDE7CisJCXN5bV9jbHJfYml0KHRwLT5idXN5MF9tYXAsIGxuKTsKKwl9CitmYWlsOgorCXJldHVybiBscDsKK30KKworLyoKKyAqICBBbGxvY2F0ZSBMQ0IgcmVzb3VyY2VzIGZvciB0YWdnZWQgY29tbWFuZCBxdWV1aW5nLgorICovCitzdGF0aWMgdm9pZCBzeW1fYWxsb2NfbGNiX3RhZ3MgKHN0cnVjdCBzeW1faGNiICpucCwgdV9jaGFyIHRuLCB1X2NoYXIgbG4pCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdG5dOworCXN0cnVjdCBzeW1fbGNiICpscCA9IHN5bV9scCh0cCwgbG4pOworCWludCBpOworCisJLyoKKwkgKiAgSWYgTENCIG5vdCBhdmFpbGFibGUsIHRyeSB0byBhbGxvY2F0ZSBpdC4KKwkgKi8KKwlpZiAoIWxwICYmICEobHAgPSBzeW1fYWxsb2NfbGNiKG5wLCB0biwgbG4pKSkKKwkJZ290byBmYWlsOworCisJLyoKKwkgKiAgQWxsb2NhdGUgdGhlIHRhc2sgdGFibGUgYW5kIGFuZCB0aGUgdGFnIGFsbG9jYXRpb24gCisJICogIGNpcmN1bGFyIGJ1ZmZlci4gV2Ugd2FudCBib3RoIG9yIG5vbmUuCisJICovCisJbHAtPml0bHFfdGJsID0gc3ltX2NhbGxvY19kbWEoU1lNX0NPTkZfTUFYX1RBU0sqNCwgIklUTFFfVEJMIik7CisJaWYgKCFscC0+aXRscV90YmwpCisJCWdvdG8gZmFpbDsKKwlscC0+Y2JfdGFncyA9IGtjYWxsb2MoU1lNX0NPTkZfTUFYX1RBU0ssIDEsIEdGUF9LRVJORUwpOworCWlmICghbHAtPmNiX3RhZ3MpIHsKKwkJc3ltX21mcmVlX2RtYShscC0+aXRscV90YmwsIFNZTV9DT05GX01BWF9UQVNLKjQsICJJVExRX1RCTCIpOworCQlscC0+aXRscV90YmwgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aGUgdGFzayB0YWJsZSB3aXRoIGludmFsaWQgZW50cmllcy4KKwkgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IFNZTV9DT05GX01BWF9UQVNLIDsgaSsrKQorCQlscC0+aXRscV90YmxbaV0gPSBjcHVfdG9fc2NyKG5wLT5ub3Rhc2tfYmEpOworCisJLyoKKwkgKiAgRmlsbCB1cCB0aGUgdGFnIGJ1ZmZlciB3aXRoIHRhZyBudW1iZXJzLgorCSAqLworCWZvciAoaSA9IDAgOyBpIDwgU1lNX0NPTkZfTUFYX1RBU0sgOyBpKyspCisJCWxwLT5jYl90YWdzW2ldID0gaTsKKworCS8qCisJICogIE1ha2UgdGhlIHRhc2sgdGFibGUgYXZhaWxhYmxlIHRvIFNDUklQVFMsIAorCSAqICBBbmQgYWNjZXB0IHRhZ2dlZCBjb21tYW5kcyBub3cuCisJICovCisJbHAtPmhlYWQuaXRscV90Ymxfc2EgPSBjcHVfdG9fc2NyKHZ0b2J1cyhscC0+aXRscV90YmwpKTsKKworCXJldHVybjsKK2ZhaWw6CisJcmV0dXJuOworfQorCisvKgorICogIFF1ZXVlIGEgU0NTSSBJTyB0byB0aGUgY29udHJvbGxlci4KKyAqLworaW50IHN5bV9xdWV1ZV9zY3NpaW8oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHA7CisJc3RydWN0IHN5bV9sY2IgKmxwOworCXVfY2hhcgkqbXNncHRyOworCXVfaW50ICAgbXNnbGVuOworCWludCBjYW5fZGlzY29ubmVjdDsKKworCS8qCisJICogIEtlZXAgdHJhY2sgb2YgdGhlIElPIGluIG91ciBDQ0IuCisJICovCisJY3AtPmNtZCA9IGNtZDsKKworCS8qCisJICogIFJldHJpZXZlIHRoZSB0YXJnZXQgZGVzY3JpcHRvci4KKwkgKi8KKwl0cCA9ICZucC0+dGFyZ2V0W2NwLT50YXJnZXRdOworCisJLyoKKwkgKiAgUmV0cmlldmUgdGhlIGx1biBkZXNjcmlwdG9yLgorCSAqLworCWxwID0gc3ltX2xwKHRwLCBzZGV2LT5sdW4pOworCisJY2FuX2Rpc2Nvbm5lY3QgPSAoY3AtPnRhZyAhPSBOT19UQUcpIHx8CisJCShscCAmJiAobHAtPmN1cnJfZmxhZ3MgJiBTWU1fRElTQ19FTkFCTEVEKSk7CisKKwltc2dwdHIgPSBjcC0+c2NzaV9zbXNnOworCW1zZ2xlbiA9IDA7CisJbXNncHRyW21zZ2xlbisrXSA9IElERU5USUZZKGNhbl9kaXNjb25uZWN0LCBzZGV2LT5sdW4pOworCisJLyoKKwkgKiAgQnVpbGQgdGhlIHRhZyBtZXNzYWdlIGlmIHByZXNlbnQuCisJICovCisJaWYgKGNwLT50YWcgIT0gTk9fVEFHKSB7CisJCXVfY2hhciBvcmRlciA9IGNwLT5vcmRlcjsKKworCQlzd2l0Y2gob3JkZXIpIHsKKwkJY2FzZSBNX09SREVSRURfVEFHOgorCQkJYnJlYWs7CisJCWNhc2UgTV9IRUFEX1RBRzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3JkZXIgPSBNX1NJTVBMRV9UQUc7CisJCX0KKyNpZmRlZiBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworCQkvKgorCQkgKiAgQXZvaWQgdG9vIG11Y2ggcmVvcmRlcmluZyBvZiBTQ1NJIGNvbW1hbmRzLgorCQkgKiAgVGhlIGFsZ29yaXRobSB0cmllcyB0byBwcmV2ZW50IGNvbXBsZXRpb24gb2YgYW55IAorCQkgKiAgdGFnZ2VkIGNvbW1hbmQgZnJvbSBiZWluZyBkZWxheWVkIGFnYWluc3QgbW9yZSAKKwkJICogIHRoYW4gMyB0aW1lcyB0aGUgbWF4IG51bWJlciBvZiBxdWV1ZWQgY29tbWFuZHMuCisJCSAqLworCQlpZiAobHAgJiYgbHAtPnRhZ3Nfc2luY2UgPiAzKlNZTV9DT05GX01BWF9UQUcpIHsKKwkJCWxwLT50YWdzX3NpID0gIShscC0+dGFnc19zaSk7CisJCQlpZiAobHAtPnRhZ3Nfc3VtW2xwLT50YWdzX3NpXSkgeworCQkJCW9yZGVyID0gTV9PUkRFUkVEX1RBRzsKKwkJCQlpZiAoKERFQlVHX0ZMQUdTICYgREVCVUdfVEFHUyl8fHN5bV92ZXJib3NlPjEpIHsKKwkJCQkJc3ltX3ByaW50X2FkZHIoY21kLAorCQkJCQkJIm9yZGVyZWQgdGFnIGZvcmNlZC5cbiIpOworCQkJCX0KKwkJCX0KKwkJCWxwLT50YWdzX3NpbmNlID0gMDsKKwkJfQorI2VuZGlmCisJCW1zZ3B0clttc2dsZW4rK10gPSBvcmRlcjsKKworCQkvKgorCQkgKiAgRm9yIGxlc3MgdGhhbiAxMjggdGFncywgYWN0dWFsIHRhZ3MgYXJlIG51bWJlcmVkIAorCQkgKiAgMSwzLDUsLi4yKk1BWFRBR1MrMSxzaW5jZSB3ZSBtYXkgaGF2ZSB0byBkZWFsIAorCQkgKiAgd2l0aCBkZXZpY2VzIHRoYXQgaGF2ZSBwcm9ibGVtcyB3aXRoICNUQUcgMCBvciB0b28gCisJCSAqICBncmVhdCAjVEFHIG51bWJlcnMuIEZvciBtb3JlIHRhZ3MgKHVwIHRvIDI1NiksIAorCQkgKiAgd2UgdXNlIGRpcmVjdGx5IG91ciB0YWcgbnVtYmVyLgorCQkgKi8KKyNpZiBTWU1fQ09ORl9NQVhfVEFTSyA+ICg1MTIvNCkKKwkJbXNncHRyW21zZ2xlbisrXSA9IGNwLT50YWc7CisjZWxzZQorCQltc2dwdHJbbXNnbGVuKytdID0gKGNwLT50YWcgPDwgMSkgKyAxOworI2VuZGlmCisJfQorCisJLyoKKwkgKiAgQnVpbGQgYSBuZWdvdGlhdGlvbiBtZXNzYWdlIGlmIG5lZWRlZC4KKwkgKiAgKG5lZ29fc3RhdHVzIGlzIGZpbGxlZCBieSBzeW1fcHJlcGFyZV9uZWdvKCkpCisJICovCisJY3AtPm5lZ29fc3RhdHVzID0gMDsKKwlpZiAodHAtPnRnb2FsLmNoZWNrX25lZ28gJiYgIXRwLT5uZWdvX2NwICYmIGxwKSB7CisJCW1zZ2xlbiArPSBzeW1fcHJlcGFyZV9uZWdvKG5wLCBjcCwgbXNncHRyICsgbXNnbGVuKTsKKwl9CisKKwkvKgorCSAqICBTdGFydHF1ZXVlCisJICovCisJY3AtPnBoeXMuaGVhZC5nby5zdGFydCAgID0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCBzZWxlY3QpKTsKKwljcC0+cGh5cy5oZWFkLmdvLnJlc3RhcnQgPSBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIHJlc2VsX2RzYSkpOworCisJLyoKKwkgKiAgc2VsZWN0CisJICovCisJY3AtPnBoeXMuc2VsZWN0LnNlbF9pZAkJPSBjcC0+dGFyZ2V0OworCWNwLT5waHlzLnNlbGVjdC5zZWxfc2NudGwzCT0gdHAtPmhlYWQud3ZhbDsKKwljcC0+cGh5cy5zZWxlY3Quc2VsX3N4ZmVyCT0gdHAtPmhlYWQuc3ZhbDsKKwljcC0+cGh5cy5zZWxlY3Quc2VsX3NjbnRsNAk9IHRwLT5oZWFkLnV2YWw7CisKKwkvKgorCSAqICBtZXNzYWdlCisJICovCisJY3AtPnBoeXMuc21zZy5hZGRyCT0gY3B1X3RvX3NjcihDQ0JfQkEoY3AsIHNjc2lfc21zZykpOworCWNwLT5waHlzLnNtc2cuc2l6ZQk9IGNwdV90b19zY3IobXNnbGVuKTsKKworCS8qCisJICogIHN0YXR1cworCSAqLworCWNwLT5ob3N0X3hmbGFncwkJPSAwOworCWNwLT5ob3N0X3N0YXR1cwkJPSBjcC0+bmVnb19zdGF0dXMgPyBIU19ORUdPVElBVEUgOiBIU19CVVNZOworCWNwLT5zc3NzX3N0YXR1cwkJPSBTX0lMTEVHQUw7CisJY3AtPnhlcnJfc3RhdHVzCQk9IDA7CisJY3AtPmhvc3RfZmxhZ3MJCT0gMDsKKwljcC0+ZXh0cmFfYnl0ZXMJCT0gMDsKKworCS8qCisJICogIGV4dHJlbWUgZGF0YSBwb2ludGVyLgorCSAqICBzaGFsbCBiZSBwb3NpdGl2ZSwgc28gLTEgaXMgbG93ZXIgdGhhbiBsb3dlc3QuOikKKwkgKi8KKwljcC0+ZXh0X3NnICA9IC0xOworCWNwLT5leHRfb2ZzID0gMDsKKworCS8qCisJICogIEJ1aWxkIHRoZSBDREIgYW5kIERBVEEgZGVzY3JpcHRvciBibG9jayAKKwkgKiAgYW5kIHN0YXJ0IHRoZSBJTy4KKwkgKi8KKwlyZXR1cm4gc3ltX3NldHVwX2RhdGFfYW5kX3N0YXJ0KG5wLCBjbWQsIGNwKTsKK30KKworLyoKKyAqICBSZXNldCBhIFNDU0kgdGFyZ2V0IChhbGwgTFVOcyBvZiB0aGlzIHRhcmdldCkuCisgKi8KK2ludCBzeW1fcmVzZXRfc2NzaV90YXJnZXQoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBzeW1fdGNiICp0cDsKKworCWlmICh0YXJnZXQgPT0gbnAtPm15YWRkciB8fCAodV9pbnQpdGFyZ2V0ID49IFNZTV9DT05GX01BWF9UQVJHRVQpCisJCXJldHVybiAtMTsKKworCXRwID0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwl0cC0+dG9fcmVzZXQgPSAxOworCisJbnAtPmlzdGF0X3NlbSA9IFNFTTsKKwlPVVRCKG5wLCBuY19pc3RhdCwgU0lHUHxTRU0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgQWJvcnQgYSBTQ1NJIElPLgorICovCitzdGF0aWMgaW50IHN5bV9hYm9ydF9jY2Ioc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3AsIGludCB0aW1lZF9vdXQpCit7CisJLyoKKwkgKiAgQ2hlY2sgdGhhdCB0aGUgSU8gaXMgYWN0aXZlLgorCSAqLworCWlmICghY3AgfHwgIWNwLT5ob3N0X3N0YXR1cyB8fCBjcC0+aG9zdF9zdGF0dXMgPT0gSFNfV0FJVCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiAgSWYgYSBwcmV2aW91cyBhYm9ydCBkaWRuJ3Qgc3VjY2VlZCBpbiB0aW1lLAorCSAqICBwZXJmb3JtIGEgQlVTIHJlc2V0LgorCSAqLworCWlmIChjcC0+dG9fYWJvcnQpIHsKKwkJc3ltX3Jlc2V0X3Njc2lfYnVzKG5wLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgTWFyayB0aGUgQ0NCIGZvciBhYm9ydCBhbmQgYWxsb3cgdGltZSBmb3IuCisJICovCisJY3AtPnRvX2Fib3J0ID0gdGltZWRfb3V0ID8gMiA6IDE7CisKKwkvKgorCSAqICBUZWxsIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciB0byBzdG9wIGFuZCBzeW5jaHJvbml6ZSB3aXRoIHVzLgorCSAqLworCW5wLT5pc3RhdF9zZW0gPSBTRU07CisJT1VUQihucCwgbmNfaXN0YXQsIFNJR1B8U0VNKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN5bV9hYm9ydF9zY3NpaW8oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCB0aW1lZF9vdXQpCit7CisJc3RydWN0IHN5bV9jY2IgKmNwOworCVNZTV9RVUVIRUFEICpxcDsKKworCS8qCisJICogIExvb2sgdXAgb3VyIENDQiBjb250cm9sIGJsb2NrLgorCSAqLworCWNwID0gTlVMTDsKKwlGT1JfRUFDSF9RVUVVRURfRUxFTUVOVCgmbnAtPmJ1c3lfY2NicSwgcXApIHsKKwkJc3RydWN0IHN5bV9jY2IgKmNwMiA9IHN5bV9xdWVfZW50cnkocXAsIHN0cnVjdCBzeW1fY2NiLCBsaW5rX2NjYnEpOworCQlpZiAoY3AyLT5jbWQgPT0gY21kKSB7CisJCQljcCA9IGNwMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHN5bV9hYm9ydF9jY2IobnAsIGNwLCB0aW1lZF9vdXQpOworfQorCisvKgorICogIENvbXBsZXRlIGV4ZWN1dGlvbiBvZiBhIFNDU0kgY29tbWFuZCB3aXRoIGV4dGVudGVkIAorICogIGVycm9yLCBTQ1NJIHN0YXR1cyBlcnJvciwgb3IgaGF2aW5nIGJlZW4gYXV0by1zZW5zZWQuCisgKgorICogIFRoZSBTQ1JJUFRTIHByb2Nlc3NvciBpcyBub3QgcnVubmluZyB0aGVyZSwgc28gd2UgCisgKiAgY2FuIHNhZmVseSBhY2Nlc3MgSU8gcmVnaXN0ZXJzIGFuZCByZW1vdmUgSk9CcyBmcm9tICAKKyAqICB0aGUgU1RBUlQgcXVldWUuCisgKiAgU0NSQVRDSEEgaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gbG9hZGVkIHdpdGggU1RBUlRQT1MgCisgKiAgYmVmb3JlIHRoZSBTQ1JJUFRTIGNhbGxlZCB0aGUgQyBjb2RlLgorICovCit2b2lkIHN5bV9jb21wbGV0ZV9lcnJvcihzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fY2NiICpjcCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBzeW1fdGNiICp0cDsKKwlzdHJ1Y3Qgc3ltX2xjYiAqbHA7CisJaW50IHJlc2lkOworCWludCBpOworCisJLyoKKwkgKiAgUGFyYW5vaWQgY2hlY2suIDopCisJICovCisJaWYgKCFjcCB8fCAhY3AtPmNtZCkKKwkJcmV0dXJuOworCisJY21kID0gY3AtPmNtZDsKKwlzZGV2ID0gY21kLT5kZXZpY2U7CisJaWYgKERFQlVHX0ZMQUdTICYgKERFQlVHX1RJTll8REVCVUdfUkVTVUxUKSkgeworCQlkZXZfaW5mbygmc2Rldi0+c2Rldl9nZW5kZXYsICJDQ0I9JXAgU1RBVD0leC8leC8leFxuIiwgY3AsCisJCQljcC0+aG9zdF9zdGF0dXMsIGNwLT5zc3NzX3N0YXR1cywgY3AtPmhvc3RfZmxhZ3MpOworCX0KKworCS8qCisJICogIEdldCB0YXJnZXQgYW5kIGx1biBwb2ludGVycy4KKwkgKi8KKwl0cCA9ICZucC0+dGFyZ2V0W2NwLT50YXJnZXRdOworCWxwID0gc3ltX2xwKHRwLCBzZGV2LT5sdW4pOworCisJLyoKKwkgKiAgQ2hlY2sgZm9yIGV4dGVuZGVkIGVycm9ycy4KKwkgKi8KKwlpZiAoY3AtPnhlcnJfc3RhdHVzKSB7CisJCWlmIChzeW1fdmVyYm9zZSkKKwkJCXN5bV9wcmludF94ZXJyKGNtZCwgY3AtPnhlcnJfc3RhdHVzKTsKKwkJaWYgKGNwLT5ob3N0X3N0YXR1cyA9PSBIU19DT01QTEVURSkKKwkJCWNwLT5ob3N0X3N0YXR1cyA9IEhTX0NPTVBfRVJSOworCX0KKworCS8qCisJICogIENhbGN1bGF0ZSB0aGUgcmVzaWR1YWwuCisJICovCisJcmVzaWQgPSBzeW1fY29tcHV0ZV9yZXNpZHVhbChucCwgY3ApOworCisJaWYgKCFTWU1fU0VUVVBfUkVTSURVQUxfU1VQUE9SVCkgey8qIElmIHVzZXIgZG9lcyBub3Qgd2FudCByZXNpZHVhbHMgKi8KKwkJcmVzaWQgID0gMDsJCSAvKiB0aHJvdyB0aGVtIGF3YXkuIDopCQkgICAgKi8KKwkJY3AtPnN2X3Jlc2lkID0gMDsKKwl9CisjaWZkZWYgREVCVUdfMl8wX1gKK2lmIChyZXNpZCkKKwlwcmludGYoIlhYWFggUkVTSUQ9ICVkIC0gMHgleFxuIiwgcmVzaWQsIHJlc2lkKTsKKyNlbmRpZgorCisJLyoKKwkgKiAgRGVxdWV1ZSBhbGwgcXVldWVkIENDQnMgZm9yIHRoYXQgZGV2aWNlIAorCSAqICBub3QgeWV0IHN0YXJ0ZWQgYnkgU0NSSVBUUy4KKwkgKi8KKwlpID0gKElOTChucCwgbmNfc2NyYXRjaGEpIC0gbnAtPnNxdWV1ZV9iYSkgLyA0OworCWkgPSBzeW1fZGVxdWV1ZV9mcm9tX3NxdWV1ZShucCwgaSwgY3AtPnRhcmdldCwgc2Rldi0+bHVuLCAtMSk7CisKKwkvKgorCSAqICBSZXN0YXJ0IHRoZSBTQ1JJUFRTIHByb2Nlc3Nvci4KKwkgKi8KKwlPVVRMX0RTUChucCwgU0NSSVBUQV9CQShucCwgc3RhcnQpKTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCWlmIChjcC0+aG9zdF9zdGF0dXMgPT0gSFNfQ09NUExFVEUgJiYKKwkgICAgY3AtPnNzc3Nfc3RhdHVzID09IFNfUVVFVUVfRlVMTCkgeworCQlpZiAoIWxwIHx8IGxwLT5zdGFydGVkX3RhZ3MgLSBpIDwgMikKKwkJCWdvdG8gd2VpcmRuZXNzOworCQkvKgorCQkgKiAgRGVjcmVhc2UgcXVldWUgZGVwdGggYXMgbmVlZGVkLgorCQkgKi8KKwkJbHAtPnN0YXJ0ZWRfbWF4ID0gbHAtPnN0YXJ0ZWRfdGFncyAtIGkgLSAxOworCQlscC0+bnVtX3Nnb29kID0gMDsKKworCQlpZiAoc3ltX3ZlcmJvc2UgPj0gMikgeworCQkJc3ltX3ByaW50X2FkZHIoY21kLCAiIHF1ZXVlIGRlcHRoIGlzIG5vdyAlZFxuIiwKKwkJCQkJbHAtPnN0YXJ0ZWRfbWF4KTsKKwkJfQorCisJCS8qCisJCSAqICBSZXBhaXIgdGhlIENDQi4KKwkJICovCisJCWNwLT5ob3N0X3N0YXR1cyA9IEhTX0JVU1k7CisJCWNwLT5zc3NzX3N0YXR1cyA9IFNfSUxMRUdBTDsKKworCQkvKgorCQkgKiAgTGV0J3MgcmVxdWV1ZSBpdCB0byBkZXZpY2UuCisJCSAqLworCQlzeW1fc2V0X2NhbV9zdGF0dXMoY21kLCBDQU1fUkVRVUVVRV9SRVEpOworCQlnb3RvIGZpbmlzaDsKKwl9Cit3ZWlyZG5lc3M6CisjZW5kaWYKKwkvKgorCSAqICBCdWlsZCByZXN1bHQgaW4gQ0FNIGNjYi4KKwkgKi8KKwlzeW1fc2V0X2NhbV9yZXN1bHRfZXJyb3IobnAsIGNwLCByZXNpZCk7CisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKK2ZpbmlzaDoKKyNlbmRpZgorCS8qCisJICogIEFkZCB0aGlzIG9uZSB0byB0aGUgQ09NUCBxdWV1ZS4KKwkgKi8KKwlzeW1fcmVtcXVlKCZjcC0+bGlua19jY2JxKTsKKwlzeW1faW5zcXVlX2hlYWQoJmNwLT5saW5rX2NjYnEsICZucC0+Y29tcF9jY2JxKTsKKworCS8qCisJICogIENvbXBsZXRlIGFsbCB0aG9zZSBjb21tYW5kcyB3aXRoIGVpdGhlciBlcnJvciAKKwkgKiAgb3IgcmVxdWV1ZSBjb25kaXRpb24uCisJICovCisJc3ltX2ZsdXNoX2NvbXBfcXVldWUobnAsIDApOworCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJLyoKKwkgKiAgRG9ubm90IHN0YXJ0IG1vcmUgdGhhbiAxIGNvbW1hbmQgYWZ0ZXIgYW4gZXJyb3IuCisJICovCisJaWYgKGxwKQorCQlzeW1fc3RhcnRfbmV4dF9jY2JzKG5wLCBscCwgMSk7CisjZW5kaWYKK30KKworLyoKKyAqICBDb21wbGV0ZSBleGVjdXRpb24gb2YgYSBzdWNjZXNzZnVsIFNDU0kgY29tbWFuZC4KKyAqCisgKiAgT25seSBzdWNjZXNzZnVsIGNvbW1hbmRzIGdvIHRvIHRoZSBET05FIHF1ZXVlLCAKKyAqICBzaW5jZSB3ZSBuZWVkIHRvIGhhdmUgdGhlIFNDUklQVFMgcHJvY2Vzc29yIAorICogIHN0b3BwZWQgb24gYW55IGVycm9yIGNvbmRpdGlvbi4KKyAqICBUaGUgU0NSSVBUUyBwcm9jZXNzb3IgaXMgcnVubmluZyB3aGlsZSB3ZSBhcmUgCisgKiAgY29tcGxldGluZyBzdWNjZXNzZnVsIGNvbW1hbmRzLgorICovCit2b2lkIHN5bV9jb21wbGV0ZV9vayAoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApCit7CisJc3RydWN0IHN5bV90Y2IgKnRwOworCXN0cnVjdCBzeW1fbGNiICpscDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJaW50IHJlc2lkOworCisJLyoKKwkgKiAgUGFyYW5vaWQgY2hlY2suIDopCisJICovCisJaWYgKCFjcCB8fCAhY3AtPmNtZCkKKwkJcmV0dXJuOworCWFzc2VydCAoY3AtPmhvc3Rfc3RhdHVzID09IEhTX0NPTVBMRVRFKTsKKworCS8qCisJICogIEdldCB1c2VyIGNvbW1hbmQuCisJICovCisJY21kID0gY3AtPmNtZDsKKworCS8qCisJICogIEdldCB0YXJnZXQgYW5kIGx1biBwb2ludGVycy4KKwkgKi8KKwl0cCA9ICZucC0+dGFyZ2V0W2NwLT50YXJnZXRdOworCWxwID0gc3ltX2xwKHRwLCBjcC0+bHVuKTsKKworCS8qCisJICogIEFzc3VtZSBkZXZpY2UgZGlzY292ZXJlZCBvbiBmaXJzdCBzdWNjZXNzLgorCSAqLworCWlmICghbHApCisJCXN5bV9zZXRfYml0KHRwLT5sdW5fbWFwLCBjcC0+bHVuKTsKKworCS8qCisJICogIElmIGFsbCBkYXRhIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCwgZ2l2ZW4gdGhhbiBubworCSAqICBleHRlbmRlZCBlcnJvciBkaWQgb2NjdXIsIHRoZXJlIGlzIG5vIHJlc2lkdWFsLgorCSAqLworCXJlc2lkID0gMDsKKwlpZiAoY3AtPnBoeXMuaGVhZC5sYXN0cCAhPSBzeW1fZ29hbHAoY3ApKQorCQlyZXNpZCA9IHN5bV9jb21wdXRlX3Jlc2lkdWFsKG5wLCBjcCk7CisKKwkvKgorCSAqICBXcm9uZyB0cmFuc2ZlciByZXNpZHVhbHMgbWF5IGJlIHdvcnNlIHRoYW4ganVzdCBhbHdheXMgCisJICogIHJldHVybmluZyB6ZXJvLiBVc2VyIGNhbiBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpbiAKKwkgKiAgc3ltNTNjOHh4LmguIFJlc2lkdWFsIHN1cHBvcnQgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCSAqLworCWlmICghU1lNX1NFVFVQX1JFU0lEVUFMX1NVUFBPUlQpCisJCXJlc2lkICA9IDA7CisjaWZkZWYgREVCVUdfMl8wX1gKK2lmIChyZXNpZCkKKwlwcmludGYoIlhYWFggUkVTSUQ9ICVkIC0gMHgleFxuIiwgcmVzaWQsIHJlc2lkKTsKKyNlbmRpZgorCisJLyoKKwkgKiAgQnVpbGQgcmVzdWx0IGluIENBTSBjY2IuCisJICovCisJc3ltX3NldF9jYW1fcmVzdWx0X29rKGNwLCBjbWQsIHJlc2lkKTsKKworI2lmZGVmCVNZTV9PUFRfU05JRkZfSU5RVUlSWQorCS8qCisJICogIE9uIHN0YW5kYXJkIElOUVVJUlkgcmVzcG9uc2UgKEVWUEQgYW5kIENtRHQgCisJICogIG5vdCBzZXQpLCBzbmlmZiBvdXQgZGV2aWNlIGNhcGFiaWxpdGllcy4KKwkgKi8KKwlpZiAoY3AtPmNkYl9idWZbMF0gPT0gSU5RVUlSWSAmJiAhKGNwLT5jZGJfYnVmWzFdICYgMHgzKSkKKwkJc3ltX3NuaWZmX2lucXVpcnkobnAsIGNtZCwgcmVzaWQpOworI2VuZGlmCisKKyNpZmRlZiBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKwkvKgorCSAqICBJZiBtYXggbnVtYmVyIG9mIHN0YXJ0ZWQgY2NicyBoYWQgYmVlbiByZWR1Y2VkLAorCSAqICBpbmNyZWFzZSBpdCBpZiAyMDAgZ29vZCBzdGF0dXMgcmVjZWl2ZWQuCisJICovCisJaWYgKGxwICYmIGxwLT5zdGFydGVkX21heCA8IGxwLT5zdGFydGVkX2xpbWl0KSB7CisJCSsrbHAtPm51bV9zZ29vZDsKKwkJaWYgKGxwLT5udW1fc2dvb2QgPj0gMjAwKSB7CisJCQlscC0+bnVtX3Nnb29kID0gMDsKKwkJCSsrbHAtPnN0YXJ0ZWRfbWF4OworCQkJaWYgKHN5bV92ZXJib3NlID49IDIpIHsKKwkJCQlzeW1fcHJpbnRfYWRkcihjbWQsICIgcXVldWUgZGVwdGggaXMgbm93ICVkXG4iLAorCQkJCSAgICAgICBscC0+c3RhcnRlZF9tYXgpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqICBGcmVlIG91ciBDQ0IuCisJICovCisJc3ltX2ZyZWVfY2NiIChucCwgY3ApOworCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJLyoKKwkgKiAgUmVxdWV1ZSBhIGNvdXBsZSBvZiBhd2FpdGluZyBzY3NpIGNvbW1hbmRzLgorCSAqLworCWlmIChscCAmJiAhc3ltX3F1ZV9lbXB0eSgmbHAtPndhaXRpbmdfY2NicSkpCisJCXN5bV9zdGFydF9uZXh0X2NjYnMobnAsIGxwLCAyKTsKKyNlbmRpZgorCS8qCisJICogIENvbXBsZXRlIHRoZSBjb21tYW5kLgorCSAqLworCXN5bV94cHRfZG9uZShucCwgY21kKTsKK30KKworLyoKKyAqICBTb2Z0LWF0dGFjaCB0aGUgY29udHJvbGxlci4KKyAqLworaW50IHN5bV9oY2JfYXR0YWNoKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc3ltX2Z3ICpmdywgc3RydWN0IHN5bV9udnJhbSAqbnZyYW0pCit7CisJc3RydWN0IHN5bV9oY2IgKm5wID0gc3ltX2dldF9oY2Ioc2hvc3QpOworCWludCBpOworCisJLyoKKwkgKiAgR2V0IHNvbWUgaW5mbyBhYm91dCB0aGUgZmlybXdhcmUuCisJICovCisJbnAtPnNjcmlwdGFfc3oJID0gZnctPmFfc2l6ZTsKKwlucC0+c2NyaXB0Yl9zegkgPSBmdy0+Yl9zaXplOworCW5wLT5zY3JpcHR6X3N6CSA9IGZ3LT56X3NpemU7CisJbnAtPmZ3X3NldHVwCSA9IGZ3LT5zZXR1cDsKKwlucC0+ZndfcGF0Y2gJID0gZnctPnBhdGNoOworCW5wLT5md19uYW1lCSA9IGZ3LT5uYW1lOworCisJLyoKKwkgKiAgU2F2ZSBzZXR0aW5nIG9mIHNvbWUgSU8gcmVnaXN0ZXJzLCBzbyB3ZSB3aWxsIAorCSAqICBiZSBhYmxlIHRvIHByb2JlIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucy4KKwkgKi8KKwlzeW1fc2F2ZV9pbml0aWFsX3NldHRpbmcgKG5wKTsKKworCS8qCisJICogIFJlc2V0IHRoZSBjaGlwIG5vdywgc2luY2UgaXQgaGFzIGJlZW4gcmVwb3J0ZWQgCisJICogIHRoYXQgU0NTSSBjbG9jayBjYWxpYnJhdGlvbiBtYXkgbm90IHdvcmsgcHJvcGVybHkgCisJICogIGlmIHRoZSBjaGlwIGlzIGN1cnJlbnRseSBhY3RpdmUuCisJICovCisJc3ltX2NoaXBfcmVzZXQobnApOworCisJLyoKKwkgKiAgUHJlcGFyZSBjb250cm9sbGVyIGFuZCBkZXZpY2VzIHNldHRpbmdzLCBhY2NvcmRpbmcgCisJICogIHRvIGNoaXAgZmVhdHVyZXMsIHVzZXIgc2V0LXVwIGFuZCBkcml2ZXIgc2V0LXVwLgorCSAqLworCXN5bV9wcmVwYXJlX3NldHRpbmcoc2hvc3QsIG5wLCBudnJhbSk7CisKKwkvKgorCSAqICBDaGVjayB0aGUgUENJIGNsb2NrIGZyZXF1ZW5jeS4KKwkgKiAgTXVzdCBiZSBwZXJmb3JtZWQgYWZ0ZXIgcHJlcGFyZV9zZXR0aW5nIHNpbmNlIGl0IGRlc3Ryb3lzIAorCSAqICBTVEVTVDEgdGhhdCBpcyB1c2VkIHRvIHByb2JlIGZvciB0aGUgY2xvY2sgZG91Ymxlci4KKwkgKi8KKwlpID0gc3ltX2dldHBjaWNsb2NrKG5wKTsKKwlpZiAoaSA+IDM3MDAwICYmICEobnAtPmZlYXR1cmVzICYgRkVfNjZNSFopKQorCQlwcmludGYoIiVzOiBQQ0kgQlVTIGNsb2NrIHNlZW1zIHRvbyBoaWdoOiAldSBLSHouXG4iLAorCQkJc3ltX25hbWUobnApLCBpKTsKKworCS8qCisJICogIEFsbG9jYXRlIHRoZSBzdGFydCBxdWV1ZS4KKwkgKi8KKwlucC0+c3F1ZXVlID0gc3ltX2NhbGxvY19kbWEoc2l6ZW9mKHUzMikqKE1BWF9RVUVVRSoyKSwiU1FVRVVFIik7CisJaWYgKCFucC0+c3F1ZXVlKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJbnAtPnNxdWV1ZV9iYSA9IHZ0b2J1cyhucC0+c3F1ZXVlKTsKKworCS8qCisJICogIEFsbG9jYXRlIHRoZSBkb25lIHF1ZXVlLgorCSAqLworCW5wLT5kcXVldWUgPSBzeW1fY2FsbG9jX2RtYShzaXplb2YodTMyKSooTUFYX1FVRVVFKjIpLCJEUVVFVUUiKTsKKwlpZiAoIW5wLT5kcXVldWUpCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKwlucC0+ZHF1ZXVlX2JhID0gdnRvYnVzKG5wLT5kcXVldWUpOworCisJLyoKKwkgKiAgQWxsb2NhdGUgdGhlIHRhcmdldCBidXMgYWRkcmVzcyBhcnJheS4KKwkgKi8KKwlucC0+dGFyZ3RibCA9IHN5bV9jYWxsb2NfZG1hKDI1NiwgIlRBUkdUQkwiKTsKKwlpZiAoIW5wLT50YXJndGJsKQorCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJbnAtPnRhcmd0YmxfYmEgPSB2dG9idXMobnAtPnRhcmd0YmwpOworCisJLyoKKwkgKiAgQWxsb2NhdGUgU0NSSVBUUyBhcmVhcy4KKwkgKi8KKwlucC0+c2NyaXB0YTAgPSBzeW1fY2FsbG9jX2RtYShucC0+c2NyaXB0YV9zeiwgIlNDUklQVEEwIik7CisJbnAtPnNjcmlwdGIwID0gc3ltX2NhbGxvY19kbWEobnAtPnNjcmlwdGJfc3osICJTQ1JJUFRCMCIpOworCW5wLT5zY3JpcHR6MCA9IHN5bV9jYWxsb2NfZG1hKG5wLT5zY3JpcHR6X3N6LCAiU0NSSVBUWjAiKTsKKwlpZiAoIW5wLT5zY3JpcHRhMCB8fCAhbnAtPnNjcmlwdGIwIHx8ICFucC0+c2NyaXB0ejApCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKworCS8qCisJICogIEFsbG9jYXRlIHRoZSBhcnJheSBvZiBsaXN0cyBvZiBDQ0JzIGhhc2hlZCBieSBEU0EuCisJICovCisJbnAtPmNjYmggPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3Qgc3ltX2NjYiAqKiksIENDQl9IQVNIX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbnAtPmNjYmgpCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKworCS8qCisJICogIEluaXRpYWx5emUgdGhlIENDQiBmcmVlIGFuZCBidXN5IHF1ZXVlcy4KKwkgKi8KKwlzeW1fcXVlX2luaXQoJm5wLT5mcmVlX2NjYnEpOworCXN5bV9xdWVfaW5pdCgmbnAtPmJ1c3lfY2NicSk7CisJc3ltX3F1ZV9pbml0KCZucC0+Y29tcF9jY2JxKTsKKworCS8qCisJICogIEluaXRpYWxpemF0aW9uIGZvciBvcHRpb25hbCBoYW5kbGluZyAKKwkgKiAgb2YgZGV2aWNlIHF1ZXVlaW5nLgorCSAqLworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCXN5bV9xdWVfaW5pdCgmbnAtPmR1bW15X2NjYnEpOworI2VuZGlmCisJLyoKKwkgKiAgQWxsb2NhdGUgc29tZSBDQ0IuIFdlIG5lZWQgYXQgbGVhc3QgT05FLgorCSAqLworCWlmICghc3ltX2FsbG9jX2NjYihucCkpCisJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKworCS8qCisJICogIENhbGN1bGF0ZSBCVVMgYWRkcmVzc2VzIHdoZXJlIHdlIGFyZSBnb2luZyAKKwkgKiAgdG8gbG9hZCB0aGUgU0NSSVBUUy4KKwkgKi8KKwlucC0+c2NyaXB0YV9iYQk9IHZ0b2J1cyhucC0+c2NyaXB0YTApOworCW5wLT5zY3JpcHRiX2JhCT0gdnRvYnVzKG5wLT5zY3JpcHRiMCk7CisJbnAtPnNjcmlwdHpfYmEJPSB2dG9idXMobnAtPnNjcmlwdHowKTsKKworCWlmIChucC0+cmFtX2JhKSB7CisJCW5wLT5zY3JpcHRhX2JhCT0gbnAtPnJhbV9iYTsKKwkJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX1JBTThLKSB7CisJCQlucC0+cmFtX3dzID0gODE5MjsKKwkJCW5wLT5zY3JpcHRiX2JhID0gbnAtPnNjcmlwdGFfYmEgKyA0MDk2OworI2lmIDAJLyogTWF5IGdldCB1c2VmdWwgZm9yIDY0IEJJVCBQQ0kgYWRkcmVzc2luZyAqLworCQkJbnAtPnNjcl9yYW1fc2VnID0gY3B1X3RvX3NjcihucC0+c2NyaXB0YV9iYSA+PiAzMik7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCQlucC0+cmFtX3dzID0gNDA5NjsKKwl9CisKKwkvKgorCSAqICBDb3B5IHNjcmlwdHMgdG8gY29udHJvbGxlciBpbnN0YW5jZS4KKwkgKi8KKwltZW1jcHkobnAtPnNjcmlwdGEwLCBmdy0+YV9iYXNlLCBucC0+c2NyaXB0YV9zeik7CisJbWVtY3B5KG5wLT5zY3JpcHRiMCwgZnctPmJfYmFzZSwgbnAtPnNjcmlwdGJfc3opOworCW1lbWNweShucC0+c2NyaXB0ejAsIGZ3LT56X2Jhc2UsIG5wLT5zY3JpcHR6X3N6KTsKKworCS8qCisJICogIFNldHVwIHZhcmlhYmxlIHBhcnRzIGluIHNjcmlwdHMgYW5kIGNvbXB1dGUKKwkgKiAgc2NyaXB0cyBidXMgYWRkcmVzc2VzIHVzZWQgZnJvbSB0aGUgQyBjb2RlLgorCSAqLworCW5wLT5md19zZXR1cChucCwgZncpOworCisJLyoKKwkgKiAgQmluZCBTQ1JJUFRTIHdpdGggcGh5c2ljYWwgYWRkcmVzc2VzIHVzYWJsZSBieSB0aGUgCisJICogIFNDUklQVFMgcHJvY2Vzc29yIChhcyBzZWVuIGZyb20gdGhlIEJVUyA9IEJVUyBhZGRyZXNzZXMpLgorCSAqLworCXN5bV9md19iaW5kX3NjcmlwdChucCwgKHUzMiAqKSBucC0+c2NyaXB0YTAsIG5wLT5zY3JpcHRhX3N6KTsKKwlzeW1fZndfYmluZF9zY3JpcHQobnAsICh1MzIgKikgbnAtPnNjcmlwdGIwLCBucC0+c2NyaXB0Yl9zeik7CisJc3ltX2Z3X2JpbmRfc2NyaXB0KG5wLCAodTMyICopIG5wLT5zY3JpcHR6MCwgbnAtPnNjcmlwdHpfc3opOworCisjaWZkZWYgU1lNX0NPTkZfSUFSQl9TVVBQT1JUCisJLyoKKwkgKiAgICBJZiB1c2VyIHdhbnRzIElBUkIgdG8gYmUgc2V0IHdoZW4gd2Ugd2luIGFyYml0cmF0aW9uIAorCSAqICAgIGFuZCBoYXZlIG90aGVyIGpvYnMsIGNvbXB1dGUgdGhlIG1heCBudW1iZXIgb2YgY29uc2VjdXRpdmUgCisJICogICAgc2V0dGluZ3Mgb2YgSUFSQiBoaW50cyBiZWZvcmUgd2UgbGVhdmUgZGV2aWNlcyBhIGNoYW5jZSB0byAKKwkgKiAgICBhcmJpdHJhdGUgZm9yIHJlc2VsZWN0aW9uLgorCSAqLworI2lmZGVmCVNZTV9TRVRVUF9JQVJCX01BWAorCW5wLT5pYXJiX21heCA9IFNZTV9TRVRVUF9JQVJCX01BWDsKKyNlbHNlCisJbnAtPmlhcmJfbWF4ID0gNDsKKyNlbmRpZgorI2VuZGlmCisKKwkvKgorCSAqICBQcmVwYXJlIHRoZSBpZGxlIGFuZCBpbnZhbGlkIHRhc2sgYWN0aW9ucy4KKwkgKi8KKwlucC0+aWRsZXRhc2suc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIGlkbGUpKTsKKwlucC0+aWRsZXRhc2sucmVzdGFydAk9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgYmFkX2lfdF9sKSk7CisJbnAtPmlkbGV0YXNrX2JhCQk9IHZ0b2J1cygmbnAtPmlkbGV0YXNrKTsKKworCW5wLT5ub3Rhc2suc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIGlkbGUpKTsKKwlucC0+bm90YXNrLnJlc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEJfQkEobnAsIGJhZF9pX3RfbCkpOworCW5wLT5ub3Rhc2tfYmEJCT0gdnRvYnVzKCZucC0+bm90YXNrKTsKKworCW5wLT5iYWRfaXRsLnN0YXJ0CT0gY3B1X3RvX3NjcihTQ1JJUFRBX0JBKG5wLCBpZGxlKSk7CisJbnAtPmJhZF9pdGwucmVzdGFydAk9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgYmFkX2lfdF9sKSk7CisJbnAtPmJhZF9pdGxfYmEJCT0gdnRvYnVzKCZucC0+YmFkX2l0bCk7CisKKwlucC0+YmFkX2l0bHEuc3RhcnQJPSBjcHVfdG9fc2NyKFNDUklQVEFfQkEobnAsIGlkbGUpKTsKKwlucC0+YmFkX2l0bHEucmVzdGFydAk9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCxiYWRfaV90X2xfcSkpOworCW5wLT5iYWRfaXRscV9iYQkJPSB2dG9idXMoJm5wLT5iYWRfaXRscSk7CisKKwkvKgorCSAqICBBbGxvY2F0ZSBhbmQgcHJlcGFyZSB0aGUgbHVuIEpVTVAgdGFibGUgdGhhdCBpcyB1c2VkIAorCSAqICBmb3IgYSB0YXJnZXQgcHJpb3IgdGhlIHByb2Jpbmcgb2YgZGV2aWNlcyAoYmFkIGx1biB0YWJsZSkuCisJICogIEEgcHJpdmF0ZSB0YWJsZSB3aWxsIGJlIGFsbG9jYXRlZCBmb3IgdGhlIHRhcmdldCBvbiB0aGUgCisJICogIGZpcnN0IElOUVVJUlkgcmVzcG9uc2UgcmVjZWl2ZWQuCisJICovCisJbnAtPmJhZGx1bnRibCA9IHN5bV9jYWxsb2NfZG1hKDI1NiwgIkJBRExVTlRCTCIpOworCWlmICghbnAtPmJhZGx1bnRibCkKKwkJZ290byBhdHRhY2hfZmFpbGVkOworCisJbnAtPmJhZGx1bl9zYSA9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgcmVzZWxfYmFkX2x1bikpOworCWZvciAoaSA9IDAgOyBpIDwgNjQgOyBpKyspCS8qIDY0IGx1bnMvdGFyZ2V0LCBubyBsZXNzICovCisJCW5wLT5iYWRsdW50YmxbaV0gPSBjcHVfdG9fc2NyKHZ0b2J1cygmbnAtPmJhZGx1bl9zYSkpOworCisJLyoKKwkgKiAgUHJlcGFyZSB0aGUgYnVzIGFkZHJlc3MgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgYnVzIAorCSAqICBhZGRyZXNzIG9mIGVhY2ggdGFyZ2V0IGNvbnRyb2wgYmxvY2suCisJICogIEZvciBub3csIGFzc3VtZSBhbGwgbG9naWNhbCB1bml0cyBhcmUgd3JvbmcuIDopCisJICovCisJZm9yIChpID0gMCA7IGkgPCBTWU1fQ09ORl9NQVhfVEFSR0VUIDsgaSsrKSB7CisJCW5wLT50YXJndGJsW2ldID0gY3B1X3RvX3Njcih2dG9idXMoJm5wLT50YXJnZXRbaV0pKTsKKwkJbnAtPnRhcmdldFtpXS5oZWFkLmx1bnRibF9zYSA9CisJCQkJY3B1X3RvX3Njcih2dG9idXMobnAtPmJhZGx1bnRibCkpOworCQlucC0+dGFyZ2V0W2ldLmhlYWQubHVuMF9zYSA9CisJCQkJY3B1X3RvX3Njcih2dG9idXMoJm5wLT5iYWRsdW5fc2EpKTsKKwl9CisKKwkvKgorCSAqICBOb3cgY2hlY2sgdGhlIGNhY2hlIGhhbmRsaW5nIG9mIHRoZSBwY2kgY2hpcHNldC4KKwkgKi8KKwlpZiAoc3ltX3Nub29wdGVzdCAobnApKSB7CisJCXByaW50ZigiJXM6IENBQ0hFIElOQ09SUkVDVExZIENPTkZJR1VSRUQuXG4iLCBzeW1fbmFtZShucCkpOworCQlnb3RvIGF0dGFjaF9mYWlsZWQ7CisJfQorCisJLyoKKwkgKiAgU2lnaCEgd2UgYXJlIGRvbmUuCisJICovCisJcmV0dXJuIDA7CisKK2F0dGFjaF9mYWlsZWQ6CisJcmV0dXJuIC1FTlhJTzsKK30KKworLyoKKyAqICBGcmVlIGV2ZXJ5dGhpbmcgdGhhdCBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIHRoaXMgZGV2aWNlLgorICovCit2b2lkIHN5bV9oY2JfZnJlZShzdHJ1Y3Qgc3ltX2hjYiAqbnApCit7CisJU1lNX1FVRUhFQUQgKnFwOworCXN0cnVjdCBzeW1fY2NiICpjcDsKKwlzdHJ1Y3Qgc3ltX3RjYiAqdHA7CisJc3RydWN0IHN5bV9sY2IgKmxwOworCWludCB0YXJnZXQsIGx1bjsKKworCWlmIChucC0+c2NyaXB0ejApCisJCXN5bV9tZnJlZV9kbWEobnAtPnNjcmlwdHowLCBucC0+c2NyaXB0el9zeiwgIlNDUklQVFowIik7CisJaWYgKG5wLT5zY3JpcHRiMCkKKwkJc3ltX21mcmVlX2RtYShucC0+c2NyaXB0YjAsIG5wLT5zY3JpcHRiX3N6LCAiU0NSSVBUQjAiKTsKKwlpZiAobnAtPnNjcmlwdGEwKQorCQlzeW1fbWZyZWVfZG1hKG5wLT5zY3JpcHRhMCwgbnAtPnNjcmlwdGFfc3osICJTQ1JJUFRBMCIpOworCWlmIChucC0+c3F1ZXVlKQorCQlzeW1fbWZyZWVfZG1hKG5wLT5zcXVldWUsIHNpemVvZih1MzIpKihNQVhfUVVFVUUqMiksICJTUVVFVUUiKTsKKwlpZiAobnAtPmRxdWV1ZSkKKwkJc3ltX21mcmVlX2RtYShucC0+ZHF1ZXVlLCBzaXplb2YodTMyKSooTUFYX1FVRVVFKjIpLCAiRFFVRVVFIik7CisKKwlpZiAobnAtPmFjdGNjYnMpIHsKKwkJd2hpbGUgKChxcCA9IHN5bV9yZW1xdWVfaGVhZCgmbnAtPmZyZWVfY2NicSkpICE9IDApIHsKKwkJCWNwID0gc3ltX3F1ZV9lbnRyeShxcCwgc3RydWN0IHN5bV9jY2IsIGxpbmtfY2NicSk7CisJCQlzeW1fbWZyZWVfZG1hKGNwLCBzaXplb2YoKmNwKSwgIkNDQiIpOworCQl9CisJfQorCWtmcmVlKG5wLT5jY2JoKTsKKworCWlmIChucC0+YmFkbHVudGJsKQorCQlzeW1fbWZyZWVfZG1hKG5wLT5iYWRsdW50YmwsIDI1NiwiQkFETFVOVEJMIik7CisKKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IFNZTV9DT05GX01BWF9UQVJHRVQgOyB0YXJnZXQrKykgeworCQl0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJCWZvciAobHVuID0gMCA7IGx1biA8IFNZTV9DT05GX01BWF9MVU4gOyBsdW4rKykgeworCQkJbHAgPSBzeW1fbHAodHAsIGx1bik7CisJCQlpZiAoIWxwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxwLT5pdGxxX3RibCkKKwkJCQlzeW1fbWZyZWVfZG1hKGxwLT5pdGxxX3RibCwgU1lNX0NPTkZfTUFYX1RBU0sqNCwKKwkJCQkgICAgICAgIklUTFFfVEJMIik7CisJCQlrZnJlZShscC0+Y2JfdGFncyk7CisJCQlzeW1fbWZyZWVfZG1hKGxwLCBzaXplb2YoKmxwKSwgIkxDQiIpOworCQl9CisjaWYgU1lNX0NPTkZfTUFYX0xVTiA+IDEKKwkJa2ZyZWUodHAtPmx1bm1wKTsKKyNlbmRpZiAKKwl9CisJaWYgKG5wLT50YXJndGJsKQorCQlzeW1fbWZyZWVfZG1hKG5wLT50YXJndGJsLCAyNTYsICJUQVJHVEJMIik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NWNiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuaApAQCAtMCwwICsxLDEzMDQgQEAKKy8qCisgKiBEZXZpY2UgZHJpdmVyIGZvciB0aGUgU1lNQklPUy9MU0lMT0dJQyA1M0M4WFggYW5kIDUzQzEwMTAgZmFtaWx5IAorICogb2YgUENJLVNDU0kgSU8gcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisgKgorICogVGhpcyBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBMaW51eCBzeW01M2M4eHggZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgIEdlcmFyZCBSb3VkaWVyCisgKgorICogVGhlIHN5bTUzYzh4eCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBuY3I1M2M4eHggZHJpdmVyIHRoYXQgaGFkIGJlZW4gCisgKiBhIHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciB0byBMaW51eC0xLjIuMTMuCisgKgorICogVGhlIG9yaWdpbmFsIG5jciBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiBmb3IgMzg2YnNkIGFuZCBGcmVlQlNEIGJ5CisgKiAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorICogICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyAqIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyAqCisgKiBPdGhlciBtYWpvciBjb250cmlidXRpb25zOgorICoKKyAqIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBTWU1fSElQRF9ICisjZGVmaW5lIFNZTV9ISVBEX0gKKworLyoKKyAqICBHZW5lcmljIGRyaXZlciBvcHRpb25zLgorICoKKyAqICBUaGV5IG1heSBiZSBkZWZpbmVkIGluIHBsYXRmb3JtIHNwZWNpZmljIGhlYWRlcnMsIGlmIHRoZXkgCisgKiAgYXJlIHVzZWZ1bC4KKyAqCisgKiAgICBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorICogICAgICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgU0NSSVBUUyB1c2VkIGJ5IHRoZSBkcml2ZXIgCisgKiAgICAgICAgYXJlIGFibGUgdG8gaGFuZGxlIFNDU0kgdHJhbnNmZXJzIHdpdGggZGlyZWN0aW9uIG5vdCAKKyAqICAgICAgICBzdXBwbGllZCBieSB1c2VyLgorICogICAgICAgIChzZXQgZm9yIExpbnV4LTIuMC5YKQorICoKKyAqICAgIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworICogICAgICAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgZHJpdmVyIHdpbGwgdXNlIGEgcXVldWUgcGVyIAorICogICAgICAgIGRldmljZSBhbmQgaGFuZGxlIFFVRVVFIEZVTEwgc3RhdHVzIHJlcXVldWluZyBpbnRlcm5hbGx5LgorICoKKyAqICAgIFNZTV9PUFRfTElNSVRfQ09NTUFORF9SRU9SREVSSU5HCisgKiAgICAgICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSBkcml2ZXIgdHJpZXMgdG8gbGltaXQgdGFnZ2VkIAorICogICAgICAgIGNvbW1hbmQgcmVvcmRlcmluZyB0byBzb21lIHJlYXNvbm5hYmxlIHZhbHVlLgorICogICAgICAgIChzZXQgZm9yIExpbnV4KQorICovCisjaWYgMAorI2RlZmluZSBTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorI2RlZmluZSBTWU1fT1BUX0hBTkRMRV9ERVZJQ0VfUVVFVUVJTkcKKyNkZWZpbmUgU1lNX09QVF9MSU1JVF9DT01NQU5EX1JFT1JERVJJTkcKKyNlbmRpZgorCisvKgorICogIEFjdGl2ZSBkZWJ1Z2dpbmcgdGFncyBhbmQgdmVyYm9zaXR5LgorICogIEJvdGggREVCVUdfRkxBR1MgYW5kIHN5bV92ZXJib3NlIGNhbiBiZSByZWRlZmluZWQgCisgKiAgYnkgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUgdG8gc29tZXRoaW5nIGVsc2UuCisgKi8KKyNkZWZpbmUgREVCVUdfQUxMT0MJKDB4MDAwMSkKKyNkZWZpbmUgREVCVUdfUEhBU0UJKDB4MDAwMikKKyNkZWZpbmUgREVCVUdfUE9MTAkoMHgwMDA0KQorI2RlZmluZSBERUJVR19RVUVVRQkoMHgwMDA4KQorI2RlZmluZSBERUJVR19SRVNVTFQJKDB4MDAxMCkKKyNkZWZpbmUgREVCVUdfU0NBVFRFUgkoMHgwMDIwKQorI2RlZmluZSBERUJVR19TQ1JJUFQJKDB4MDA0MCkKKyNkZWZpbmUgREVCVUdfVElOWQkoMHgwMDgwKQorI2RlZmluZSBERUJVR19USU1JTkcJKDB4MDEwMCkKKyNkZWZpbmUgREVCVUdfTkVHTwkoMHgwMjAwKQorI2RlZmluZSBERUJVR19UQUdTCSgweDA0MDApCisjZGVmaW5lIERFQlVHX1BPSU5URVIJKDB4MDgwMCkKKworI2lmbmRlZiBERUJVR19GTEFHUworI2RlZmluZSBERUJVR19GTEFHUwkoMHgwMDAwKQorI2VuZGlmCisKKyNpZm5kZWYgc3ltX3ZlcmJvc2UKKyNkZWZpbmUgc3ltX3ZlcmJvc2UJKG5wLT52ZXJib3NlKQorI2VuZGlmCisKKy8qCisgKiAgVGhlc2Ugb25lcyBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgZGVmaW5lZC4KKyAqLworI2lmbmRlZiBhc3NlcnQKKyNkZWZpbmUJYXNzZXJ0KGV4cHJlc3Npb24pIHsgXAorCWlmICghKGV4cHJlc3Npb24pKSB7IFwKKwkJKHZvaWQpcGFuaWMoIFwKKwkJCSJhc3NlcnRpb24gXCIlc1wiIGZhaWxlZDogZmlsZSBcIiVzXCIsIGxpbmUgJWRcbiIsIFwKKwkJCSNleHByZXNzaW9uLCBcCisJCQlfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJfSBcCit9CisjZW5kaWYKKworLyoKKyAqICBOdW1iZXIgb2YgdGFza3MgcGVyIGRldmljZSB3ZSB3YW50IHRvIGhhbmRsZS4KKyAqLworI2lmCVNZTV9DT05GX01BWF9UQUdfT1JERVIgPiA4CisjZXJyb3IJIm1vcmUgdGhhbiAyNTYgdGFncyBwZXIgbG9naWNhbCB1bml0IG5vdCBhbGxvd2VkLiIKKyNlbmRpZgorI2RlZmluZQlTWU1fQ09ORl9NQVhfVEFTSwkoMTw8U1lNX0NPTkZfTUFYX1RBR19PUkRFUikKKworLyoKKyAqICBEb25ub3QgdXNlIG1vcmUgdGFza3MgdGhhdCB3ZSBjYW4gaGFuZGxlLgorICovCisjaWZuZGVmCVNZTV9DT05GX01BWF9UQUcKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1RBRwlTWU1fQ09ORl9NQVhfVEFTSworI2VuZGlmCisjaWYJU1lNX0NPTkZfTUFYX1RBRyA+IFNZTV9DT05GX01BWF9UQVNLCisjdW5kZWYJU1lNX0NPTkZfTUFYX1RBRworI2RlZmluZQlTWU1fQ09ORl9NQVhfVEFHCVNZTV9DT05GX01BWF9UQVNLCisjZW5kaWYKKworLyoKKyAqICAgIFRoaXMgb25lIG1lYW5zICdOTyBUQUcgZm9yIHRoaXMgam9iJworICovCisjZGVmaW5lIE5PX1RBRwkoMjU2KQorCisvKgorICogIE51bWJlciBvZiBTQ1NJIHRhcmdldHMuCisgKi8KKyNpZglTWU1fQ09ORl9NQVhfVEFSR0VUID4gMTYKKyNlcnJvcgkibW9yZSB0aGFuIDE2IHRhcmdldHMgbm90IGFsbG93ZWQuIgorI2VuZGlmCisKKy8qCisgKiAgTnVtYmVyIG9mIGxvZ2ljYWwgdW5pdHMgcGVyIHRhcmdldC4KKyAqLworI2lmCVNZTV9DT05GX01BWF9MVU4gPiA2NAorI2Vycm9yCSJtb3JlIHRoYW4gNjQgbG9naWNhbCB1bml0cyBwZXIgdGFyZ2V0IG5vdCBhbGxvd2VkLiIKKyNlbmRpZgorCisvKgorICogICAgQXN5bmNocm9ub3VzIHByZS1zY2FsZXIgKG5zKS4gU2hhbGwgYmUgNDAgZm9yIAorICogICAgdGhlIFNDU0kgdGltaW5ncyB0byBiZSBjb21wbGlhbnQuCisgKi8KKyNkZWZpbmUJU1lNX0NPTkZfTUlOX0FTWU5DICg0MCkKKworLyoKKyAqICBTaG9ydGVzdCBtZW1vcnkgY2h1bmsgaXMgKDE8PFNZTV9NRU1fU0hJRlQpLCBjdXJyZW50bHkgMTYuCisgKiAgQWN0dWFsIGFsbG9jYXRpb25zIGhhcHBlbiBhcyBTWU1fTUVNX0NMVVNURVJfU0laRSBzaXplZC4KKyAqICAoMSBQQUdFIGF0IGEgdGltZSBpcyBqdXN0IGZpbmUpLgorICovCisjZGVmaW5lIFNZTV9NRU1fU0hJRlQJNAorI2RlZmluZSBTWU1fTUVNX0NMVVNURVJfU0laRQkoMVVMIDw8IFNZTV9NRU1fQ0xVU1RFUl9TSElGVCkKKyNkZWZpbmUgU1lNX01FTV9DTFVTVEVSX01BU0sJKFNZTV9NRU1fQ0xVU1RFUl9TSVpFLTEpCisKKy8qCisgKiAgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIFNUQVJUIGFuZCBET05FIHF1ZXVlcy4KKyAqCisgKiAgV2UgbGltaXQgdG8gMSBQQUdFIGluIG9yZGVyIHRvIHN1Y2NlZWQgYWxsb2NhdGlvbiBvZiAKKyAqICB0aGVzZSBxdWV1ZXMuIEVhY2ggZW50cnkgaXMgOCBieXRlcyBsb25nICgyIERXT1JEUykuCisgKi8KKyNpZmRlZglTWU1fQ09ORl9NQVhfU1RBUlQKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1FVRVVFIChTWU1fQ09ORl9NQVhfU1RBUlQrMikKKyNlbHNlCisjZGVmaW5lCVNZTV9DT05GX01BWF9RVUVVRSAoNypTWU1fQ09ORl9NQVhfVEFTSysyKQorI2RlZmluZQlTWU1fQ09ORl9NQVhfU1RBUlQgKFNZTV9DT05GX01BWF9RVUVVRS0yKQorI2VuZGlmCisKKyNpZglTWU1fQ09ORl9NQVhfUVVFVUUgPiBTWU1fTUVNX0NMVVNURVJfU0laRS84CisjdW5kZWYJU1lNX0NPTkZfTUFYX1FVRVVFCisjZGVmaW5lCVNZTV9DT05GX01BWF9RVUVVRSAoU1lNX01FTV9DTFVTVEVSX1NJWkUvOCkKKyN1bmRlZglTWU1fQ09ORl9NQVhfU1RBUlQKKyNkZWZpbmUJU1lNX0NPTkZfTUFYX1NUQVJUIChTWU1fQ09ORl9NQVhfUVVFVUUtMikKKyNlbmRpZgorCisvKgorICogIEZvciB0aGlzIG9uZSwgd2Ugd2FudCBhIHNob3J0IG5hbWUgOi0pCisgKi8KKyNkZWZpbmUgTUFYX1FVRVVFCVNZTV9DT05GX01BWF9RVUVVRQorCisvKgorICogIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgYm90aCBidXMgc3BhY2UgYmFzZWQgYW5kIGxlZ2FjeSBJTyBtZXRob2RzLgorICovCisKKyNkZWZpbmUgSU5CX09GRihucCwgbykJCWlvcmVhZDgobnAtPnMuaW9hZGRyICsgKG8pKQorI2RlZmluZSBJTldfT0ZGKG5wLCBvKQkJaW9yZWFkMTYobnAtPnMuaW9hZGRyICsgKG8pKQorI2RlZmluZSBJTkxfT0ZGKG5wLCBvKQkJaW9yZWFkMzIobnAtPnMuaW9hZGRyICsgKG8pKQorCisjZGVmaW5lIE9VVEJfT0ZGKG5wLCBvLCB2YWwpCWlvd3JpdGU4KCh2YWwpLCBucC0+cy5pb2FkZHIgKyAobykpCisjZGVmaW5lIE9VVFdfT0ZGKG5wLCBvLCB2YWwpCWlvd3JpdGUxNigodmFsKSwgbnAtPnMuaW9hZGRyICsgKG8pKQorI2RlZmluZSBPVVRMX09GRihucCwgbywgdmFsKQlpb3dyaXRlMzIoKHZhbCksIG5wLT5zLmlvYWRkciArIChvKSkKKworI2RlZmluZSBJTkIobnAsIHIpCQlJTkJfT0ZGKG5wLCBvZmZzZXRvZihzdHJ1Y3Qgc3ltX3JlZywgcikpCisjZGVmaW5lIElOVyhucCwgcikJCUlOV19PRkYobnAsIG9mZnNldG9mKHN0cnVjdCBzeW1fcmVnLCByKSkKKyNkZWZpbmUgSU5MKG5wLCByKQkJSU5MX09GRihucCwgb2Zmc2V0b2Yoc3RydWN0IHN5bV9yZWcsIHIpKQorCisjZGVmaW5lIE9VVEIobnAsIHIsIHYpCQlPVVRCX09GRihucCwgb2Zmc2V0b2Yoc3RydWN0IHN5bV9yZWcsIHIpLCAodikpCisjZGVmaW5lIE9VVFcobnAsIHIsIHYpCQlPVVRXX09GRihucCwgb2Zmc2V0b2Yoc3RydWN0IHN5bV9yZWcsIHIpLCAodikpCisjZGVmaW5lIE9VVEwobnAsIHIsIHYpCQlPVVRMX09GRihucCwgb2Zmc2V0b2Yoc3RydWN0IHN5bV9yZWcsIHIpLCAodikpCisKKyNkZWZpbmUgT1VUT05CKG5wLCByLCBtKQlPVVRCKG5wLCByLCBJTkIobnAsIHIpIHwgKG0pKQorI2RlZmluZSBPVVRPRkZCKG5wLCByLCBtKQlPVVRCKG5wLCByLCBJTkIobnAsIHIpICYgfihtKSkKKyNkZWZpbmUgT1VUT05XKG5wLCByLCBtKQlPVVRXKG5wLCByLCBJTlcobnAsIHIpIHwgKG0pKQorI2RlZmluZSBPVVRPRkZXKG5wLCByLCBtKQlPVVRXKG5wLCByLCBJTlcobnAsIHIpICYgfihtKSkKKyNkZWZpbmUgT1VUT05MKG5wLCByLCBtKQlPVVRMKG5wLCByLCBJTkwobnAsIHIpIHwgKG0pKQorI2RlZmluZSBPVVRPRkZMKG5wLCByLCBtKQlPVVRMKG5wLCByLCBJTkwobnAsIHIpICYgfihtKSkKKworLyoKKyAqICBXZSBub3JtYWxseSB3YW50IHRoZSBjaGlwIHRvIGhhdmUgYSBjb25zaXN0ZW50IHZpZXcKKyAqICBvZiBkcml2ZXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHdoZW4gd2UgcmVzdGFydCBpdC4KKyAqICBUaHVzIHRoZXNlIG1hY3Jvcy4KKyAqLworI2RlZmluZSBPVVRMX0RTUChucCwgdikJCQkJXAorCWRvIHsJCQkJCVwKKwkJTUVNT1JZX1dSSVRFX0JBUlJJRVIoKTsJCVwKKwkJT1VUTChucCwgbmNfZHNwLCAodikpOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgT1VUT05CX1NURCgpCQkJCVwKKwlkbyB7CQkJCQlcCisJCU1FTU9SWV9XUklURV9CQVJSSUVSKCk7CQlcCisJCU9VVE9OQihucCwgbmNfZGNudGwsIChTVER8Tk9DT00pKTsJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiAgQ29tbWFuZCBjb250cm9sIGJsb2NrIHN0YXRlcy4KKyAqLworI2RlZmluZSBIU19JRExFCQkoMCkKKyNkZWZpbmUgSFNfQlVTWQkJKDEpCisjZGVmaW5lIEhTX05FR09USUFURQkoMikJLyogc3luYy93aWRlIGRhdGEgdHJhbnNmZXIqLworI2RlZmluZSBIU19ESVNDT05ORUNUCSgzKQkvKiBEaXNjb25uZWN0ZWQgYnkgdGFyZ2V0ICovCisjZGVmaW5lIEhTX1dBSVQJCSg0KQkvKiB3YWl0aW5nIGZvciByZXNvdXJjZQkgICovCisKKyNkZWZpbmUgSFNfRE9ORU1BU0sJKDB4ODApCisjZGVmaW5lIEhTX0NPTVBMRVRFCSg0fEhTX0RPTkVNQVNLKQorI2RlZmluZSBIU19TRUxfVElNRU9VVAkoNXxIU19ET05FTUFTSykJLyogU2VsZWN0aW9uIHRpbWVvdXQgICAgICAqLworI2RlZmluZSBIU19VTkVYUEVDVEVECSg2fEhTX0RPTkVNQVNLKQkvKiBVbmV4cGVjdGVkIGRpc2Nvbm5lY3QgICovCisjZGVmaW5lIEhTX0NPTVBfRVJSCSg3fEhTX0RPTkVNQVNLKQkvKiBDb21wbGV0ZWQgd2l0aCBlcnJvcgkgICovCisKKy8qCisgKiAgU29mdHdhcmUgSW50ZXJydXB0IENvZGVzCisgKi8KKyNkZWZpbmUJU0lSX0JBRF9TQ1NJX1NUQVRVUwkoMSkKKyNkZWZpbmUJU0lSX1NFTF9BVE5fTk9fTVNHX09VVAkoMikKKyNkZWZpbmUJU0lSX01TR19SRUNFSVZFRAkoMykKKyNkZWZpbmUJU0lSX01TR19XRUlSRAkJKDQpCisjZGVmaW5lCVNJUl9ORUdPX0ZBSUxFRAkJKDUpCisjZGVmaW5lCVNJUl9ORUdPX1BST1RPCQkoNikKKyNkZWZpbmUJU0lSX1NDUklQVF9TVE9QUEVECSg3KQorI2RlZmluZQlTSVJfUkVKRUNUX1RPX1NFTkQJKDgpCisjZGVmaW5lCVNJUl9TV0lERV9PVkVSUlVOCSg5KQorI2RlZmluZQlTSVJfU09ETF9VTkRFUlJVTgkoMTApCisjZGVmaW5lCVNJUl9SRVNFTF9OT19NU0dfSU4JKDExKQorI2RlZmluZQlTSVJfUkVTRUxfTk9fSURFTlRJRlkJKDEyKQorI2RlZmluZQlTSVJfUkVTRUxfQkFEX0xVTgkoMTMpCisjZGVmaW5lCVNJUl9UQVJHRVRfU0VMRUNURUQJKDE0KQorI2RlZmluZQlTSVJfUkVTRUxfQkFEX0lfVF9MCSgxNSkKKyNkZWZpbmUJU0lSX1JFU0VMX0JBRF9JX1RfTF9RCSgxNikKKyNkZWZpbmUJU0lSX0FCT1JUX1NFTlQJCSgxNykKKyNkZWZpbmUJU0lSX1JFU0VMX0FCT1JURUQJKDE4KQorI2RlZmluZQlTSVJfTVNHX09VVF9ET05FCSgxOSkKKyNkZWZpbmUJU0lSX0NPTVBMRVRFX0VSUk9SCSgyMCkKKyNkZWZpbmUJU0lSX0RBVEFfT1ZFUlJVTgkoMjEpCisjZGVmaW5lCVNJUl9CQURfUEhBU0UJCSgyMikKKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKyNkZWZpbmUJU0lSX0RNQVBfRElSVFkJCSgyMykKKyNkZWZpbmUJU0lSX01BWAkJCSgyMykKKyNlbHNlCisjZGVmaW5lCVNJUl9NQVgJCQkoMjIpCisjZW5kaWYKKworLyoKKyAqICBFeHRlbmRlZCBlcnJvciBiaXQgY29kZXMuCisgKiAgeGVycl9zdGF0dXMgZmllbGQgb2Ygc3RydWN0IHN5bV9jY2IuCisgKi8KKyNkZWZpbmUJWEVfRVhUUkFfREFUQQkoMSkJLyogdW5leHBlY3RlZCBkYXRhIHBoYXNlCSAqLworI2RlZmluZQlYRV9CQURfUEhBU0UJKDE8PDEpCS8qIGlsbGVnYWwgcGhhc2UgKDQvNSkJCSAqLworI2RlZmluZQlYRV9QQVJJVFlfRVJSCSgxPDwyKQkvKiB1bnJlY292ZXJlZCBTQ1NJIHBhcml0eSBlcnJvciAqLworI2RlZmluZQlYRV9TT0RMX1VOUlVOCSgxPDwzKQkvKiBPREQgdHJhbnNmZXIgaW4gREFUQSBPVVQgcGhhc2UgKi8KKyNkZWZpbmUJWEVfU1dJREVfT1ZSVU4JKDE8PDQpCS8qIE9ERCB0cmFuc2ZlciBpbiBEQVRBIElOIHBoYXNlICovCisKKy8qCisgKiAgTmVnb3RpYXRpb24gc3RhdHVzLgorICogIG5lZ29fc3RhdHVzIGZpZWxkIG9mIHN0cnVjdCBzeW1fY2NiLgorICovCisjZGVmaW5lIE5TX1NZTkMJCSgxKQorI2RlZmluZSBOU19XSURFCQkoMikKKyNkZWZpbmUgTlNfUFBSCQkoMykKKworLyoKKyAqICBBIENDQiBoYXNoZWQgdGFibGUgaXMgdXNlZCB0byByZXRyaWV2ZSBDQ0IgYWRkcmVzcyAKKyAqICBmcm9tIERTQSB2YWx1ZS4KKyAqLworI2RlZmluZSBDQ0JfSEFTSF9TSElGVAkJOAorI2RlZmluZSBDQ0JfSEFTSF9TSVpFCQkoMVVMIDw8IENDQl9IQVNIX1NISUZUKQorI2RlZmluZSBDQ0JfSEFTSF9NQVNLCQkoQ0NCX0hBU0hfU0laRS0xKQorI2lmIDEKKyNkZWZpbmUgQ0NCX0hBU0hfQ09ERShkc2EpCVwKKwkoKChkc2EpID4+IChfTEdSVTE2XyhzaXplb2Yoc3RydWN0IHN5bV9jY2IpKSkpICYgQ0NCX0hBU0hfTUFTSykKKyNlbHNlCisjZGVmaW5lIENDQl9IQVNIX0NPREUoZHNhKQkoKChkc2EpID4+IDkpICYgQ0NCX0hBU0hfTUFTSykKKyNlbmRpZgorCisjaWYJU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCisvKgorICogIFdlIG1heSB3YW50IHRvIHVzZSBzZWdtZW50IHJlZ2lzdGVycyBmb3IgNjQgYml0IERNQS4KKyAqICAxNiBzZWdtZW50cyByZWdpc3RlcnMgLT4gdXAgdG8gNjQgR0IgYWRkcmVzc2FibGUuCisgKi8KKyNkZWZpbmUgU1lNX0RNQVBfU0hJRlQJKDQpCisjZGVmaW5lIFNZTV9ETUFQX1NJWkUJKDF1PDxTWU1fRE1BUF9TSElGVCkKKyNkZWZpbmUgU1lNX0RNQVBfTUFTSwkoU1lNX0RNQVBfU0laRS0xKQorI2VuZGlmCisKKy8qCisgKiAgRGV2aWNlIGZsYWdzLgorICovCisjZGVmaW5lIFNZTV9ESVNDX0VOQUJMRUQJKDEpCisjZGVmaW5lIFNZTV9UQUdTX0VOQUJMRUQJKDE8PDEpCisjZGVmaW5lIFNZTV9TQ0FOX0JPT1RfRElTQUJMRUQJKDE8PDIpCisjZGVmaW5lIFNZTV9TQ0FOX0xVTlNfRElTQUJMRUQJKDE8PDMpCisKKy8qCisgKiAgSG9zdCBhZGFwdGVyIG1pc2NlbGxhbmVvdXMgZmxhZ3MuCisgKi8KKyNkZWZpbmUgU1lNX0FWT0lEX0JVU19SRVNFVAkoMSkKKworLyoKKyAqICBNaXNjLgorICovCisjZGVmaW5lIFNZTV9TTk9PUF9USU1FT1VUICgxMDAwMDAwMCkKKyNkZWZpbmUgQlVTXzhfQklUCTAKKyNkZWZpbmUgQlVTXzE2X0JJVAkxCisKKy8qCisgKiAgR2F0aGVyIG5lZ290aWFibGUgcGFyYW1ldGVycyB2YWx1ZQorICovCitzdHJ1Y3Qgc3ltX3RyYW5zIHsKKwl1OCBwZXJpb2Q7CisJdTggb2Zmc2V0OworCXVuc2lnbmVkIGludCB3aWR0aDoxOworCXVuc2lnbmVkIGludCBpdToxOworCXVuc2lnbmVkIGludCBkdDoxOworCXVuc2lnbmVkIGludCBxYXM6MTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfbmVnbzoxOworfTsKKworLyoKKyAqICBHbG9iYWwgVENCIEhFQURFUi4KKyAqCisgKiAgRHVlIHRvIGxhY2sgb2YgaW5kaXJlY3QgYWRkcmVzc2luZyBvbiBlYXJsaWVyIE5DUiBjaGlwcywKKyAqICB0aGlzIHN1YnN0cnVjdHVyZSBpcyBjb3BpZWQgZnJvbSB0aGUgVENCIHRvIGEgZ2xvYmFsIAorICogIGFkZHJlc3MgYWZ0ZXIgc2VsZWN0aW9uLgorICogIEZvciBTWU1CSU9TIGNoaXBzIHRoYXQgc3VwcG9ydCBMT0FEL1NUT1JFIHRoaXMgY29weSBpcyAKKyAqICBub3QgbmVlZGVkIGFuZCB0aHVzIG5vdCBwZXJmb3JtZWQuCisgKi8KK3N0cnVjdCBzeW1fdGNiaCB7CisJLyoKKwkgKiAgU2NyaXB0cyBidXMgYWRkcmVzc2VzIG9mIExVTiB0YWJsZSBhY2Nlc3NlZCBmcm9tIHNjcmlwdHMuCisJICogIExVTiAjMCBpcyBhIHNwZWNpYWwgY2FzZSwgc2luY2UgbXVsdGktbHVuIGRldmljZXMgYXJlIHJhcmUsIAorCSAqICBhbmQgd2Ugd2Ugd2FudCB0byBzcGVlZC11cCB0aGUgZ2VuZXJhbCBjYXNlIGFuZCBub3Qgd2FzdGUgCisJICogIHJlc291cmNlcy4KKwkgKi8KKwl1MzIJbHVudGJsX3NhOwkvKiBidXMgYWRkcmVzcyBvZiB0aGlzIHRhYmxlCSovCisJdTMyCWx1bjBfc2E7CS8qIGJ1cyBhZGRyZXNzIG9mIExDQiAjMAkqLworCS8qCisJICogIEFjdHVhbCBTWU5DL1dJREUgSU8gcmVnaXN0ZXJzIHZhbHVlIGZvciB0aGlzIHRhcmdldC4KKwkgKiAgJ3N2YWwnLCAnd3ZhbCcgYW5kICd1dmFsJyBhcmUgcmVhZCBmcm9tIFNDUklQVFMgYW5kIAorCSAqICBzbyBoYXZlIGFsaWdubWVudCBjb25zdHJhaW50cy4KKwkgKi8KKy8qMCovCXVfY2hhcgl1dmFsOwkJLyogLT4gU0NOVEw0IHJlZ2lzdGVyCQkqLworLyoxKi8JdV9jaGFyCXN2YWw7CQkvKiAtPiBTWEZFUiAgaW8gcmVnaXN0ZXIJKi8KKy8qMiovCXVfY2hhcglmaWxsZXIxOworLyozKi8JdV9jaGFyCXd2YWw7CQkvKiAtPiBTQ05UTDMgaW8gcmVnaXN0ZXIJKi8KK307CisKKy8qCisgKiAgVGFyZ2V0IENvbnRyb2wgQmxvY2sKKyAqLworc3RydWN0IHN5bV90Y2IgeworCS8qCisJICogIFRDQiBoZWFkZXIuCisJICogIEFzc3VtZWQgYXQgb2Zmc2V0IDAuCisJICovCisvKjAqLwlzdHJ1Y3Qgc3ltX3RjYmggaGVhZDsKKworCS8qCisJICogIExVTiB0YWJsZSB1c2VkIGJ5IHRoZSBTQ1JJUFRTIHByb2Nlc3Nvci4KKwkgKiAgQW4gYXJyYXkgb2YgYnVzIGFkZHJlc3NlcyBpcyB1c2VkIG9uIHJlc2VsZWN0aW9uLgorCSAqLworCXUzMgkqbHVudGJsOwkvKiBMQ0JzIGJ1cyBhZGRyZXNzIHRhYmxlCSovCisKKwkvKgorCSAqICBMVU4gdGFibGUgdXNlZCBieSB0aGUgQyBjb2RlLgorCSAqLworCXN0cnVjdCBzeW1fbGNiICpsdW4wcDsJCS8qIExDQiBvZiBMVU4gIzAgKHVzdWFsIGNhc2UpCSovCisjaWYgU1lNX0NPTkZfTUFYX0xVTiA+IDEKKwlzdHJ1Y3Qgc3ltX2xjYiAqKmx1bm1wOwkJLyogT3RoZXIgTENCcyBbMS4uTUFYX0xVTl0JKi8KKyNlbmRpZgorCisJLyoKKwkgKiAgQml0bWFwIHRoYXQgdGVsbHMgYWJvdXQgTFVOcyB0aGF0IHN1Y2NlZWRlZCBhdCBsZWFzdCAKKwkgKiAgMSBJTyBhbmQgdGhlcmVmb3JlIGFzc3VtZWQgdG8gYmUgYSByZWFsIGRldmljZS4KKwkgKiAgQXZvaWQgdXNlbGVzcyBhbGxvY2F0aW9uIG9mIHRoZSBMQ0Igc3RydWN0dXJlLgorCSAqLworCXUzMglsdW5fbWFwWyhTWU1fQ09ORl9NQVhfTFVOKzMxKS8zMl07CisKKwkvKgorCSAqICBCaXRtYXAgdGhhdCB0ZWxscyBhYm91dCBMVU5zIHRoYXQgaGF2ZW4ndCB5ZXQgYW4gTENCIAorCSAqICBhbGxvY2F0ZWQgKG5vdCBkaXNjb3ZlcmVkIG9yIExDQiBhbGxvY2F0aW9uIGZhaWxlZCkuCisJICovCisJdTMyCWJ1c3kwX21hcFsoU1lNX0NPTkZfTUFYX0xVTiszMSkvMzJdOworCisjaWZkZWYJU1lNX0hBVkVfU1RDQgorCS8qCisJICogIE8vUyBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwlzdHJ1Y3Qgc3ltX3N0Y2IgczsKKyNlbmRpZgorCisJLyogVHJhbnNmZXIgZ29hbCAqLworCXN0cnVjdCBzeW1fdHJhbnMgdGdvYWw7CisKKwkvKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIENDQiB1c2VkIGZvciB0aGUgbmVnb3RpYXRpb24gaW4gb3JkZXIKKwkgKiB0byBlbnN1cmUgdGhhdCBvbmx5IDEgbmVnb3RpYXRpb24gaXMgcXVldWVkIGF0IGEgdGltZS4KKwkgKi8KKwlzdHJ1Y3Qgc3ltX2NjYiAqICBuZWdvX2NwOwkvKiBDQ0IgdXNlZCBmb3IgdGhlIG5lZ28JCSovCisKKwkvKgorCSAqICBTZXQgd2hlbiB3ZSB3YW50IHRvIHJlc2V0IHRoZSBkZXZpY2UuCisJICovCisJdV9jaGFyCXRvX3Jlc2V0OworCisJLyoKKwkgKiAgT3RoZXIgdXNlciBzZXR0YWJsZSBsaW1pdHMgYW5kIG9wdGlvbnMuCisJICogIFRoZXNlIGxpbWl0cyBhcmUgcmVhZCBmcm9tIHRoZSBOVlJBTSBpZiBwcmVzZW50LgorCSAqLworCXVfY2hhcgl1c3JmbGFnczsKKwl1X3Nob3J0CXVzcnRhZ3M7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworfTsKKworLyoKKyAqICBHbG9iYWwgTENCIEhFQURFUi4KKyAqCisgKiAgRHVlIHRvIGxhY2sgb2YgaW5kaXJlY3QgYWRkcmVzc2luZyBvbiBlYXJsaWVyIE5DUiBjaGlwcywKKyAqICB0aGlzIHN1YnN0cnVjdHVyZSBpcyBjb3BpZWQgZnJvbSB0aGUgTENCIHRvIGEgZ2xvYmFsIAorICogIGFkZHJlc3MgYWZ0ZXIgc2VsZWN0aW9uLgorICogIEZvciBTWU1CSU9TIGNoaXBzIHRoYXQgc3VwcG9ydCBMT0FEL1NUT1JFIHRoaXMgY29weSBpcyAKKyAqICBub3QgbmVlZGVkIGFuZCB0aHVzIG5vdCBwZXJmb3JtZWQuCisgKi8KK3N0cnVjdCBzeW1fbGNiaCB7CisJLyoKKwkgKiAgU0NSSVBUUyBhZGRyZXNzIGp1bXBlZCBieSBTQ1JJUFRTIG9uIHJlc2VsZWN0aW9uLgorCSAqICBGb3Igbm90IHByb2JlZCBsb2dpY2FsIHVuaXRzLCB0aGlzIGFkZHJlc3MgcG9pbnRzIHRvIAorCSAqICBTQ1JJUFRTIHRoYXQgZGVhbCB3aXRoIGJhZCBMVSBoYW5kbGluZyAobXVzdCBiZSBhdCAKKwkgKiAgb2Zmc2V0IHplcm8gb2YgdGhlIExDQiBmb3IgdGhhdCByZWFzb24pLgorCSAqLworLyowKi8JdTMyCXJlc2VsX3NhOworCisJLyoKKwkgKiAgVGFzayAoYnVzIGFkZHJlc3Mgb2YgYSBDQ0IpIHJlYWQgZnJvbSBTQ1JJUFRTIHRoYXQgcG9pbnRzIAorCSAqICB0byB0aGUgdW5pcXVlIElUTCBuZXh1cyBhbGxvd2VkIHRvIGJlIGRpc2Nvbm5lY3RlZC4KKwkgKi8KKwl1MzIJaXRsX3Rhc2tfc2E7CisKKwkvKgorCSAqICBUYXNrIHRhYmxlIGJ1cyBhZGRyZXNzIChyZWFkIGZyb20gU0NSSVBUUykuCisJICovCisJdTMyCWl0bHFfdGJsX3NhOworfTsKKworLyoKKyAqICBMb2dpY2FsIFVuaXQgQ29udHJvbCBCbG9jaworICovCitzdHJ1Y3Qgc3ltX2xjYiB7CisJLyoKKwkgKiAgVENCIGhlYWRlci4KKwkgKiAgQXNzdW1lZCBhdCBvZmZzZXQgMC4KKwkgKi8KKy8qMCovCXN0cnVjdCBzeW1fbGNiaCBoZWFkOworCisJLyoKKwkgKiAgVGFzayB0YWJsZSByZWFkIGZyb20gU0NSSVBUUyB0aGF0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIAorCSAqICBJVExRIG5leHVzZXMuIFRoZSBidXMgYWRkcmVzcyByZWFkIGZyb20gU0NSSVBUUyBpcyAKKwkgKiAgaW5zaWRlIHRoZSBoZWFkZXIuCisJICovCisJdTMyCSppdGxxX3RibDsJLyogS2VybmVsIHZpcnR1YWwgYWRkcmVzcwkqLworCisJLyoKKwkgKiAgQnVzeSBDQ0JzIG1hbmFnZW1lbnQuCisJICovCisJdV9zaG9ydAlidXN5X2l0bHE7CS8qIE51bWJlciBvZiBidXN5IHRhZ2dlZCBDQ0JzCSovCisJdV9zaG9ydAlidXN5X2l0bDsJLyogTnVtYmVyIG9mIGJ1c3kgdW50YWdnZWQgQ0NCcwkqLworCisJLyoKKwkgKiAgQ2lyY3VsYXIgdGFnIGFsbG9jYXRpb24gYnVmZmVyLgorCSAqLworCXVfc2hvcnQJaWFfdGFnOwkJLyogVGFnIGFsbG9jYXRpb24gaW5kZXgJCSovCisJdV9zaG9ydAlpZl90YWc7CQkvKiBUYWcgcmVsZWFzZSBpbmRleAkJKi8KKwl1X2NoYXIJKmNiX3RhZ3M7CS8qIENpcmN1bGFyIHRhZ3MgYnVmZmVyCQkqLworCisJLyoKKwkgKiAgTy9TIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlLgorCSAqLworI2lmZGVmCVNZTV9IQVZFX1NMQ0IKKwlzdHJ1Y3Qgc3ltX3NsY2IgczsKKyNlbmRpZgorCisjaWZkZWYgU1lNX09QVF9IQU5ETEVfREVWSUNFX1FVRVVFSU5HCisJLyoKKwkgKiAgT3B0aW9ubmFseSB0aGUgZHJpdmVyIGNhbiBoYW5kbGUgZGV2aWNlIHF1ZXVlaW5nLCAKKwkgKiAgYW5kIHJlcXVldWVzIGludGVybmFsbHkgY29tbWFuZCB0byByZWRvLgorCSAqLworCVNZTV9RVUVIRUFEIHdhaXRpbmdfY2NicTsKKwlTWU1fUVVFSEVBRCBzdGFydGVkX2NjYnE7CisJaW50CW51bV9zZ29vZDsKKwl1X3Nob3J0CXN0YXJ0ZWRfdGFnczsKKwl1X3Nob3J0CXN0YXJ0ZWRfbm9fdGFnOworCXVfc2hvcnQJc3RhcnRlZF9tYXg7CisJdV9zaG9ydAlzdGFydGVkX2xpbWl0OworI2VuZGlmCisKKyNpZmRlZiBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworCS8qCisJICogIE9wdGlvbmFsbHkgdGhlIGRyaXZlciBjYW4gdHJ5IHRvIHByZXZlbnQgU0NTSSAKKwkgKiAgSU9zIGZyb20gYmVpbmcgcmVvcmRlcmVkIHRvbyBtdWNoLgorCSAqLworCXVfY2hhcgkJdGFnc19zaTsJLyogQ3VycmVudCBpbmRleCB0byB0YWdzIHN1bQkqLworCXVfc2hvcnQJCXRhZ3Nfc3VtWzJdOwkvKiBUYWdzIHN1bSBjb3VudGVycwkJKi8KKwl1X3Nob3J0CQl0YWdzX3NpbmNlOwkvKiAjIG9mIHRhZ3Mgc2luY2UgbGFzdCBzd2l0Y2gJKi8KKyNlbmRpZgorCisJLyoKKwkgKiAgU2V0IHdoZW4gd2Ugd2FudCB0byBjbGVhciBhbGwgdGFza3MuCisJICovCisJdV9jaGFyIHRvX2NsZWFyOworCisJLyoKKwkgKiAgQ2FwYWJpbGl0aWVzLgorCSAqLworCXVfY2hhcgl1c2VyX2ZsYWdzOworCXVfY2hhcgljdXJyX2ZsYWdzOworfTsKKworLyoKKyAqICBBY3Rpb24gZnJvbSBTQ1JJUFRTIG9uIGEgdGFzay4KKyAqICBJcyBwYXJ0IG9mIHRoZSBDQ0IsIGJ1dCBpcyBhbHNvIHVzZWQgc2VwYXJhdGVseSB0byBwbHVnIAorICogIGVycm9yIGhhbmRsaW5nIGFjdGlvbiB0byBwZXJmb3JtIGZyb20gU0NSSVBUUy4KKyAqLworc3RydWN0IHN5bV9hY3RzY3IgeworCXUzMglzdGFydDsJCS8qIEp1bXBlZCBieSBTQ1JJUFRTIGFmdGVyIHNlbGVjdGlvbgkqLworCXUzMglyZXN0YXJ0OwkvKiBKdW1wZWQgYnkgU0NSSVBUUyBvbiByZWxlY3Rpb24JKi8KK307CisKKy8qCisgKiAgUGhhc2UgbWlzbWF0Y2ggY29udGV4dC4KKyAqCisgKiAgSXQgaXMgcGFydCBvZiB0aGUgQ0NCIGFuZCBpcyB1c2VkIGFzIHBhcmFtZXRlcnMgZm9yIHRoZSAKKyAqICBEQVRBIHBvaW50ZXIuIFdlIG5lZWQgdHdvIGNvbnRleHRzIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIAorICogIFNBVkVEIERBVEEgUE9JTlRFUi4KKyAqLworc3RydWN0IHN5bV9wbWMgeworCXN0cnVjdAlzeW1fdGJsbW92ZSBzZzsJLyogVXBkYXRlZCBpbnRlcnJ1cHRlZCBTRyBibG9jawkqLworCXUzMglyZXQ7CQkvKiBTQ1JJUFQgcmV0dXJuIGFkZHJlc3MJKi8KK307CisKKy8qCisgKiAgTFVOIGNvbnRyb2wgYmxvY2sgbG9va3VwLgorICogIFdlIHVzZSBhIGRpcmVjdCBwb2ludGVyIGZvciBMVU4gIzAsIGFuZCBhIHRhYmxlIG9mIAorICogIHBvaW50ZXJzIHdoaWNoIGlzIG9ubHkgYWxsb2NhdGVkIGZvciBkZXZpY2VzIHRoYXQgc3VwcG9ydCAKKyAqICBMVU4ocykgPiAwLgorICovCisjaWYgU1lNX0NPTkZfTUFYX0xVTiA8PSAxCisjZGVmaW5lIHN5bV9scCh0cCwgbHVuKSAoIWx1bikgPyAodHApLT5sdW4wcCA6IE5VTEwKKyNlbHNlCisjZGVmaW5lIHN5bV9scCh0cCwgbHVuKSBcCisJKCFsdW4pID8gKHRwKS0+bHVuMHAgOiAodHApLT5sdW5tcCA/ICh0cCktPmx1bm1wWyhsdW4pXSA6IE5VTEwKKyNlbmRpZgorCisvKgorICogIFN0YXR1cyBhcmUgdXNlZCBieSB0aGUgaG9zdCBhbmQgdGhlIHNjcmlwdCBwcm9jZXNzb3IuCisgKgorICogIFRoZSBsYXN0IGZvdXIgYnl0ZXMgKHN0YXR1c1s0XSkgYXJlIGNvcGllZCB0byB0aGUgCisgKiAgc2NyYXRjaGIgcmVnaXN0ZXIgKGRlY2xhcmVkIGFzIHNjcjAuLnNjcjMpIGp1c3QgYWZ0ZXIgdGhlIAorICogIHNlbGVjdC9yZXNlbGVjdCwgYW5kIGNvcGllZCBiYWNrIGp1c3QgYWZ0ZXIgZGlzY29ubmVjdGluZy4KKyAqICBJbnNpZGUgdGhlIHNjcmlwdCB0aGUgWFhfUkVHIGFyZSB1c2VkLgorICovCisKKy8qCisgKiAgTGFzdCBmb3VyIGJ5dGVzIChzY3JpcHQpCisgKi8KKyNkZWZpbmUgIEhYX1JFRwlzY3IwCisjZGVmaW5lICBIWF9QUlQJbmNfc2NyMAorI2RlZmluZSAgSFNfUkVHCXNjcjEKKyNkZWZpbmUgIEhTX1BSVAluY19zY3IxCisjZGVmaW5lICBTU19SRUcJc2NyMgorI2RlZmluZSAgU1NfUFJUCW5jX3NjcjIKKyNkZWZpbmUgIEhGX1JFRwlzY3IzCisjZGVmaW5lICBIRl9QUlQJbmNfc2NyMworCisvKgorICogIExhc3QgZm91ciBieXRlcyAoaG9zdCkKKyAqLworI2RlZmluZSAgaG9zdF94ZmxhZ3MgICBwaHlzLmhlYWQuc3RhdHVzWzBdCisjZGVmaW5lICBob3N0X3N0YXR1cyAgIHBoeXMuaGVhZC5zdGF0dXNbMV0KKyNkZWZpbmUgIHNzc3Nfc3RhdHVzICAgcGh5cy5oZWFkLnN0YXR1c1syXQorI2RlZmluZSAgaG9zdF9mbGFncyAgICBwaHlzLmhlYWQuc3RhdHVzWzNdCisKKy8qCisgKiAgSG9zdCBmbGFncworICovCisjZGVmaW5lIEhGX0lOX1BNMAkxdQorI2RlZmluZSBIRl9JTl9QTTEJKDF1PDwxKQorI2RlZmluZSBIRl9BQ1RfUE0JKDF1PDwyKQorI2RlZmluZSBIRl9EUF9TQVZFRAkoMXU8PDMpCisjZGVmaW5lIEhGX1NFTlNFCSgxdTw8NCkKKyNkZWZpbmUgSEZfRVhUX0VSUgkoMXU8PDUpCisjZGVmaW5lIEhGX0RBVEFfSU4JKDF1PDw2KQorI2lmZGVmIFNZTV9DT05GX0lBUkJfU1VQUE9SVAorI2RlZmluZSBIRl9ISU5UX0lBUkIJKDF1PDw3KQorI2VuZGlmCisKKy8qCisgKiAgTW9yZSBob3N0IGZsYWdzCisgKi8KKyNpZglTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDIKKyNkZWZpbmUJSFhfRE1BUF9ESVJUWQkoMXU8PDcpCisjZW5kaWYKKworLyoKKyAqICBHbG9iYWwgQ0NCIEhFQURFUi4KKyAqCisgKiAgRHVlIHRvIGxhY2sgb2YgaW5kaXJlY3QgYWRkcmVzc2luZyBvbiBlYXJsaWVyIE5DUiBjaGlwcywKKyAqICB0aGlzIHN1YnN0cnVjdHVyZSBpcyBjb3BpZWQgZnJvbSB0aGUgY2NiIHRvIGEgZ2xvYmFsIAorICogIGFkZHJlc3MgYWZ0ZXIgc2VsZWN0aW9uIChvciByZXNlbGVjdGlvbikgYW5kIGNvcGllZCBiYWNrIAorICogIGJlZm9yZSBkaXNjb25uZWN0LgorICogIEZvciBTWU1CSU9TIGNoaXBzIHRoYXQgc3VwcG9ydCBMT0FEL1NUT1JFIHRoaXMgY29weSBpcyAKKyAqICBub3QgbmVlZGVkIGFuZCB0aHVzIG5vdCBwZXJmb3JtZWQuCisgKi8KKworc3RydWN0IHN5bV9jY2JoIHsKKwkvKgorCSAqICBTdGFydCBhbmQgcmVzdGFydCBTQ1JJUFRTIGFkZHJlc3NlcyAobXVzdCBiZSBhdCAwKS4KKwkgKi8KKy8qMCovCXN0cnVjdCBzeW1fYWN0c2NyIGdvOworCisJLyoKKwkgKiAgU0NSSVBUUyBqdW1wIGFkZHJlc3MgdGhhdCBkZWFsIHdpdGggZGF0YSBwb2ludGVycy4KKwkgKiAgJ3NhdmVwJyBwb2ludHMgdG8gdGhlIHBvc2l0aW9uIGluIHRoZSBzY3JpcHQgcmVzcG9uc2libGUgCisJICogIGZvciB0aGUgYWN0dWFsIHRyYW5zZmVyIG9mIGRhdGEuCisJICogIEl0J3Mgd3JpdHRlbiBvbiByZWNlcHRpb24gb2YgYSBTQVZFX0RBVEFfUE9JTlRFUiBtZXNzYWdlLgorCSAqLworCXUzMglzYXZlcDsJCS8qIEp1bXAgYWRkcmVzcyB0byBzYXZlZCBkYXRhIHBvaW50ZXIJKi8KKwl1MzIJbGFzdHA7CQkvKiBTQ1JJUFRTIGFkZHJlc3MgYXQgZW5kIG9mIGRhdGEJKi8KKyNpZmRlZglTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCXUzMgl3bGFzdHA7CisjZW5kaWYKKworCS8qCisJICogIFN0YXR1cyBmaWVsZHMuCisJICovCisJdTgJc3RhdHVzWzRdOworfTsKKworLyoKKyAqICBHRVQvU0VUIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludGVyIHVzZWQgYnkgU0NSSVBUUy4KKyAqCisgKiAgV2UgbXVzdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBMT0FEL1NUT1JFLWJhc2VkIFNDUklQVFMgCisgKiAgdGhhdCB1c2UgZGlyZWN0bHkgdGhlIGhlYWRlciBpbiB0aGUgQ0NCLCBhbmQgdGhlIE5DUi1HRU5FUklDIAorICogIFNDUklQVFMgdGhhdCB1c2UgdGhlIGNvcHkgb2YgdGhlIGhlYWRlciBpbiB0aGUgSENCLgorICovCisjaWYJU1lNX0NPTkZfR0VORVJJQ19TVVBQT1JUCisjZGVmaW5lIHN5bV9zZXRfc2NyaXB0X2RwKG5wLCBjcCwgZHApCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKG5wLT5mZWF0dXJlcyAmIEZFX0xEU1RSKQkJCVwKKwkJCWNwLT5waHlzLmhlYWQubGFzdHAgPSBjcHVfdG9fc2NyKGRwKTsJXAorCQllbHNlCQkJCQkJXAorCQkJbnAtPmNjYl9oZWFkLmxhc3RwID0gY3B1X3RvX3NjcihkcCk7CVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBzeW1fZ2V0X3NjcmlwdF9kcChucCwgY3ApIAkJCQlcCisJc2NyX3RvX2NwdSgobnAtPmZlYXR1cmVzICYgRkVfTERTVFIpID8JCQlcCisJCWNwLT5waHlzLmhlYWQubGFzdHAgOiBucC0+Y2NiX2hlYWQubGFzdHApCisjZWxzZQorI2RlZmluZSBzeW1fc2V0X3NjcmlwdF9kcChucCwgY3AsIGRwKQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWNwLT5waHlzLmhlYWQubGFzdHAgPSBjcHVfdG9fc2NyKGRwKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHN5bV9nZXRfc2NyaXB0X2RwKG5wLCBjcCkgKGNwLT5waHlzLmhlYWQubGFzdHApCisjZW5kaWYKKworLyoKKyAqICBEYXRhIFN0cnVjdHVyZSBCbG9jaworICoKKyAqICBEdXJpbmcgZXhlY3V0aW9uIG9mIGEgY2NiIGJ5IHRoZSBzY3JpcHQgcHJvY2Vzc29yLCB0aGUgCisgKiAgRFNBIChkYXRhIHN0cnVjdHVyZSBhZGRyZXNzKSByZWdpc3RlciBwb2ludHMgdG8gdGhpcyAKKyAqICBzdWJzdHJ1Y3R1cmUgb2YgdGhlIGNjYi4KKyAqLworc3RydWN0IHN5bV9kc2IgeworCS8qCisJICogIENDQiBoZWFkZXIuCisJICogIEFsc28gYXNzdW1lZCBhdCBvZmZzZXQgMCBvZiB0aGUgc3ltX2NjYiBzdHJ1Y3R1cmUuCisJICovCisvKjAqLwlzdHJ1Y3Qgc3ltX2NjYmggaGVhZDsKKworCS8qCisJICogIFBoYXNlIG1pc21hdGNoIGNvbnRleHRzLgorCSAqICBXZSBuZWVkIHR3byB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSBTQVZFRCBEQVRBIFBPSU5URVIuCisJICogIE1VU1QgQk9USCBCRSBBVCBPRkZTRVQgPCAyNTYsIGR1ZSB0byB1c2luZyA4IGJpdCBhcml0aG1ldGljIAorCSAqICBmb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiBmcm9tIFNDUklQVFMuCisJICovCisJc3RydWN0IHN5bV9wbWMgcG0wOworCXN0cnVjdCBzeW1fcG1jIHBtMTsKKworCS8qCisJICogIFRhYmxlIGRhdGEgZm9yIFNjcmlwdAorCSAqLworCXN0cnVjdCBzeW1fdGJsc2VsICBzZWxlY3Q7CisJc3RydWN0IHN5bV90Ymxtb3ZlIHNtc2c7CisJc3RydWN0IHN5bV90Ymxtb3ZlIHNtc2dfZXh0OworCXN0cnVjdCBzeW1fdGJsbW92ZSBjbWQ7CisJc3RydWN0IHN5bV90Ymxtb3ZlIHNlbnNlOworCXN0cnVjdCBzeW1fdGJsbW92ZSB3cmVzaWQ7CisJc3RydWN0IHN5bV90Ymxtb3ZlIGRhdGEgW1NZTV9DT05GX01BWF9TR107Cit9OworCisvKgorICogIE91ciBDb21tYW5kIENvbnRyb2wgQmxvY2sKKyAqLworc3RydWN0IHN5bV9jY2IgeworCS8qCisJICogIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIHBvaW50ZWQgYnkgdGhlIERTQSAKKwkgKiAgcmVnaXN0ZXIgd2hlbiBpdCBpcyBleGVjdXRlZCBieSB0aGUgc2NyaXB0IHByb2Nlc3Nvci4KKwkgKiAgSXQgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkuCisJICovCisJc3RydWN0IHN5bV9kc2IgcGh5czsKKworCS8qCisJICogIFBvaW50ZXIgdG8gQ0FNIGNjYiBhbmQgcmVsYXRlZCBzdHVmZi4KKwkgKi8KKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CS8qIENBTSBzY3NpaW8gY2NiCQkqLworCXU4CWNkYl9idWZbMTZdOwkvKiBDb3B5IG9mIENEQgkJCSovCisjZGVmaW5lCVNZTV9TTlNfQkJVRl9MRU4gMzIKKwl1OAlzbnNfYmJ1ZltTWU1fU05TX0JCVUZfTEVOXTsgLyogQm91bmNlIGJ1ZmZlciBmb3Igc2Vuc2UgZGF0YSAqLworCWludAlkYXRhX2xlbjsJLyogVG90YWwgZGF0YSBsZW5ndGgJCSovCisJaW50CXNlZ21lbnRzOwkvKiBOdW1iZXIgb2YgU0cgc2VnbWVudHMJKi8KKworCXU4CW9yZGVyOwkJLyogVGFnIHR5cGUgKGlmIHRhZ2dlZCBjb21tYW5kKQkqLworCisJLyoKKwkgKiAgTWlzY2VsbGFuZW91cyBzdGF0dXMnLgorCSAqLworCXVfY2hhcgluZWdvX3N0YXR1czsJLyogTmVnb3RpYXRpb24gc3RhdHVzCQkqLworCXVfY2hhcgl4ZXJyX3N0YXR1czsJLyogRXh0ZW5kZWQgZXJyb3IgZmxhZ3MJCSovCisJdTMyCWV4dHJhX2J5dGVzOwkvKiBFeHRyYW5lb3VzIGJ5dGVzIHRyYW5zZmVycmVkCSovCisKKwkvKgorCSAqICBNZXNzYWdlIGFyZWFzLgorCSAqICBXZSBwcmVwYXJlIGEgbWVzc2FnZSB0byBiZSBzZW50IGFmdGVyIHNlbGVjdGlvbi4KKwkgKiAgV2UgbWF5IHVzZSBhIHNlY29uZCBvbmUgaWYgdGhlIGNvbW1hbmQgaXMgcmVzY2hlZHVsZWQgCisJICogIGR1ZSB0byBDSEVDS19DT05ESVRJT04gb3IgQ09NTUFORCBURVJNSU5BVEVELgorCSAqICBDb250ZW50cyBhcmUgSURFTlRJRlkgYW5kIFNJTVBMRV9UQUcuCisJICogIFdoaWxlIG5lZ290aWF0aW5nIHN5bmMgb3Igd2lkZSB0cmFuc2ZlciwKKwkgKiAgYSBTRFRSIG9yIFdEVFIgbWVzc2FnZSBpcyBhcHBlbmRlZC4KKwkgKi8KKwl1X2NoYXIJc2NzaV9zbXNnIFsxMl07CisJdV9jaGFyCXNjc2lfc21zZzJbMTJdOworCisJLyoKKwkgKiAgQXV0byByZXF1ZXN0IHNlbnNlIHJlbGF0ZWQgZmllbGRzLgorCSAqLworCXVfY2hhcglzZW5zZWNtZFs2XTsJLyogUmVxdWVzdCBTZW5zZSBjb21tYW5kCSovCisJdV9jaGFyCXN2X3Njc2lfc3RhdHVzOwkvKiBTYXZlZCBTQ1NJIHN0YXR1cyAJCSovCisJdV9jaGFyCXN2X3hlcnJfc3RhdHVzOwkvKiBTYXZlZCBleHRlbmRlZCBzdGF0dXMJKi8KKwlpbnQJc3ZfcmVzaWQ7CS8qIFNhdmVkIHJlc2lkdWFsCQkqLworCisJLyoKKwkgKiAgT3RoZXIgZmllbGRzLgorCSAqLworCXUzMgljY2JfYmE7CQkvKiBCVVMgYWRkcmVzcyBvZiB0aGlzIENDQgkqLworCXVfc2hvcnQJdGFnOwkJLyogVGFnIGZvciB0aGlzIHRyYW5zZmVyCSovCisJCQkJLyogIE5PX1RBRyBtZWFucyBubyB0YWcJCSovCisJdV9jaGFyCXRhcmdldDsKKwl1X2NoYXIJbHVuOworCXN0cnVjdCBzeW1fY2NiICpsaW5rX2NjYmg7CS8qIEhvc3QgYWRhcHRlciBDQ0IgaGFzaCBjaGFpbgkqLworCVNZTV9RVUVIRUFEIGxpbmtfY2NicTsJLyogTGluayB0byBmcmVlL2J1c3kgQ0NCIHF1ZXVlCSovCisJdTMyCXN0YXJ0cDsJCS8qIEluaXRpYWwgZGF0YSBwb2ludGVyCQkqLworCXUzMglnb2FscDsJCS8qIEV4cGVjdGVkIGxhc3QgZGF0YSBwb2ludGVyCSovCisjaWZkZWYJU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwl1MzIJd2dvYWxwOworI2VuZGlmCisJaW50CWV4dF9zZzsJCS8qIEV4dHJlbWUgZGF0YSBwb2ludGVyLCB1c2VkCSovCisJaW50CWV4dF9vZnM7CS8qICB0byBjYWxjdWxhdGUgdGhlIHJlc2lkdWFsLgkqLworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCVNZTV9RVUVIRUFEIGxpbmsyX2NjYnE7CS8qIExpbmsgZm9yIGRldmljZSBxdWV1ZWluZwkqLworCXVfY2hhcglzdGFydGVkOwkvKiBDQ0IgcXVldWVkIHRvIHRoZSBzcXVldWUJKi8KKyNlbmRpZgorCXVfY2hhcgl0b19hYm9ydDsJLyogV2FudCB0aGlzIElPIHRvIGJlIGFib3J0ZWQJKi8KKyNpZmRlZiBTWU1fT1BUX0xJTUlUX0NPTU1BTkRfUkVPUkRFUklORworCXVfY2hhcgl0YWdzX3NpOwkvKiBMdW4gdGFncyBzdW0gaW5kZXggKDAsMSkJKi8KKyNlbmRpZgorfTsKKworI2RlZmluZSBDQ0JfQkEoY3AsbGJsKQkoY3AtPmNjYl9iYSArIG9mZnNldG9mKHN0cnVjdCBzeW1fY2NiLCBsYmwpKQorCisjaWZkZWYJU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKyNkZWZpbmUJc3ltX2dvYWxwKGNwKSAoKGNwLT5ob3N0X2ZsYWdzICYgSEZfREFUQV9JTikgPyBjcC0+Z29hbHAgOiBjcC0+d2dvYWxwKQorI2Vsc2UKKyNkZWZpbmUJc3ltX2dvYWxwKGNwKSAoY3AtPmdvYWxwKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGRldmljZSAqbV9wb29sX2lkZW50X3Q7CisKKy8qCisgKiAgSG9zdCBDb250cm9sIEJsb2NrCisgKi8KK3N0cnVjdCBzeW1faGNiIHsKKwkvKgorCSAqICBHbG9iYWwgaGVhZGVycy4KKwkgKiAgRHVlIHRvIHBvb3JuZXNzIG9mIGFkZHJlc3NpbmcgY2FwYWJpbGl0aWVzLCBlYXJsaWVyIAorCSAqICBjaGlwcyAoODEwLCA4MTUsIDgyNSkgY29weSBwYXJ0IG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgCisJICogIChDQ0IsIFRDQiBhbmQgTENCKSBpbiBmaXhlZCBhcmVhcy4KKwkgKi8KKyNpZglTWU1fQ09ORl9HRU5FUklDX1NVUFBPUlQKKwlzdHJ1Y3Qgc3ltX2NjYmgJY2NiX2hlYWQ7CisJc3RydWN0IHN5bV90Y2JoCXRjYl9oZWFkOworCXN0cnVjdCBzeW1fbGNiaAlsY2JfaGVhZDsKKyNlbmRpZgorCS8qCisJICogIElkbGUgdGFzayBhbmQgaW52YWxpZCB0YXNrIGFjdGlvbnMgYW5kIAorCSAqICB0aGVpciBidXMgYWRkcmVzc2VzLgorCSAqLworCXN0cnVjdCBzeW1fYWN0c2NyIGlkbGV0YXNrLCBub3Rhc2ssIGJhZF9pdGwsIGJhZF9pdGxxOworCXUzMiBpZGxldGFza19iYSwgbm90YXNrX2JhLCBiYWRfaXRsX2JhLCBiYWRfaXRscV9iYTsKKworCS8qCisJICogIER1bW15IGx1biB0YWJsZSB0byBwcm90ZWN0IHVzIGFnYWluc3QgdGFyZ2V0IAorCSAqICByZXR1cm5pbmcgYmFkIGx1biBudW1iZXIgb24gcmVzZWxlY3Rpb24uCisJICovCisJdTMyCSpiYWRsdW50Ymw7CS8qIFRhYmxlIHBoeXNpY2FsIGFkZHJlc3MJKi8KKwl1MzIJYmFkbHVuX3NhOwkvKiBTQ1JJUFQgaGFuZGxlciBCVVMgYWRkcmVzcwkqLworCisJLyoKKwkgKiAgQnVzIGFkZHJlc3Mgb2YgdGhpcyBob3N0IGNvbnRyb2wgYmxvY2suCisJICovCisJdTMyCWhjYl9iYTsKKworCS8qCisJICogIEJpdCAzMi02MyBvZiB0aGUgb24tY2hpcCBSQU0gYnVzIGFkZHJlc3MgaW4gTEUgZm9ybWF0LgorCSAqICBUaGUgU1RBUlRfUkFNNjQgc2NyaXB0IGxvYWRzIHRoZSBNTVJTIGFuZCBNTVdTIGZyb20gdGhpcyAKKwkgKiAgZmllbGQuCisJICovCisJdTMyCXNjcl9yYW1fc2VnOworCisJLyoKKwkgKiAgSW5pdGlhbCB2YWx1ZSBvZiBzb21lIElPIHJlZ2lzdGVyIGJpdHMuCisJICogIFRoZXNlIHZhbHVlcyBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gc2V0IGJ5IEJJT1MsIGFuZCBtYXkgCisJICogIGJlIHVzZWQgdG8gcHJvYmUgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbmNlcy4KKwkgKi8KKwl1X2NoYXIJc3Zfc2NudGwwLCBzdl9zY250bDMsIHN2X2Rtb2RlLCBzdl9kY250bCwgc3ZfY3Rlc3QzLCBzdl9jdGVzdDQsCisJCXN2X2N0ZXN0NSwgc3ZfZ3BjbnRsLCBzdl9zdGVzdDIsIHN2X3N0ZXN0NCwgc3Zfc2NudGw0LAorCQlzdl9zdGVzdDE7CisKKwkvKgorCSAqICBBY3R1YWwgaW5pdGlhbCB2YWx1ZSBvZiBJTyByZWdpc3RlciBiaXRzIHVzZWQgYnkgdGhlIAorCSAqICBkcml2ZXIuIFRoZXkgYXJlIGxvYWRlZCBhdCBpbml0aWFsaXNhdGlvbiBhY2NvcmRpbmcgdG8gIAorCSAqICBmZWF0dXJlcyB0aGF0IGFyZSB0byBiZSBlbmFibGVkL2Rpc2FibGVkLgorCSAqLworCXVfY2hhcglydl9zY250bDAsIHJ2X3NjbnRsMywgcnZfZG1vZGUsIHJ2X2RjbnRsLCBydl9jdGVzdDMsIHJ2X2N0ZXN0NCwgCisJCXJ2X2N0ZXN0NSwgcnZfc3Rlc3QyLCBydl9jY250bDAsIHJ2X2NjbnRsMSwgcnZfc2NudGw0OworCisJLyoKKwkgKiAgVGFyZ2V0IGRhdGEuCisJICovCisJc3RydWN0IHN5bV90Y2IJdGFyZ2V0W1NZTV9DT05GX01BWF9UQVJHRVRdOworCisJLyoKKwkgKiAgVGFyZ2V0IGNvbnRyb2wgYmxvY2sgYnVzIGFkZHJlc3MgYXJyYXkgdXNlZCBieSB0aGUgU0NSSVBUIAorCSAqICBvbiByZXNlbGVjdGlvbi4KKwkgKi8KKwl1MzIJCSp0YXJndGJsOworCXUzMgkJdGFyZ3RibF9iYTsKKworCS8qCisJICogIERNQSBwb29sIGhhbmRsZSBmb3IgdGhpcyBIQkEuCisJICovCisJbV9wb29sX2lkZW50X3QJYnVzX2RtYXQ7CisKKwkvKgorCSAqICBPL1Mgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUKKwkgKi8KKwlzdHJ1Y3Qgc3ltX3NoY2IgczsKKworCS8qCisJICogIFBoeXNpY2FsIGJ1cyBhZGRyZXNzZXMgb2YgdGhlIGNoaXAuCisJICovCisJdTMyCQltbWlvX2JhOwkvKiBNTUlPIDMyIGJpdCBCVVMgYWRkcmVzcwkqLworCWludAkJbW1pb193czsJLyogTU1JTyBXaW5kb3cgc2l6ZQkJKi8KKworCXUzMgkJcmFtX2JhOwkJLyogUkFNIDMyIGJpdCBCVVMgYWRkcmVzcwkqLworCWludAkJcmFtX3dzOwkJLyogUkFNIHdpbmRvdyBzaXplCQkqLworCisJLyoKKwkgKiAgU0NSSVBUUyB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBidXMgYWRkcmVzc2VzLgorCSAqICAnc2NyaXB0JyAgaXMgbG9hZGVkIGluIHRoZSBvbi1jaGlwIFJBTSBpZiBwcmVzZW50LgorCSAqICAnc2NyaXB0aCcgc3RheXMgaW4gbWFpbiBtZW1vcnkgZm9yIGFsbCBjaGlwcyBleGNlcHQgdGhlIAorCSAqICA1M0M4OTVBLCA1M0M4OTYgYW5kIDUzQzEwMTAgdGhhdCBwcm92aWRlIDhLIG9uLWNoaXAgUkFNLgorCSAqLworCXVfY2hhcgkJKnNjcmlwdGEwOwkvKiBDb3B5IG9mIHNjcmlwdHMgQSwgQiwgWgkqLworCXVfY2hhcgkJKnNjcmlwdGIwOworCXVfY2hhcgkJKnNjcmlwdHowOworCXUzMgkJc2NyaXB0YV9iYTsJLyogQWN0dWFsIHNjcmlwdHMgQSwgQiwgWgkqLworCXUzMgkJc2NyaXB0Yl9iYTsJLyogMzIgYml0IGJ1cyBhZGRyZXNzZXMuCSovCisJdTMyCQlzY3JpcHR6X2JhOworCXVfc2hvcnQJCXNjcmlwdGFfc3o7CS8qIEFjdHVhbCBzaXplIG9mIHNjcmlwdCBBLCBCLCBaKi8KKwl1X3Nob3J0CQlzY3JpcHRiX3N6OworCXVfc2hvcnQJCXNjcmlwdHpfc3o7CisKKwkvKgorCSAqICBCdXMgYWRkcmVzc2VzLCBzZXR1cCBhbmQgcGF0Y2ggbWV0aG9kcyBmb3IgCisJICogIHRoZSBzZWxlY3RlZCBmaXJtd2FyZS4KKwkgKi8KKwlzdHJ1Y3Qgc3ltX2Z3YV9iYSBmd2FfYmFzOwkvKiBVc2VmdWwgU0NSSVBUQSBidXMgYWRkcmVzc2VzCSovCisJc3RydWN0IHN5bV9md2JfYmEgZndiX2JhczsJLyogVXNlZnVsIFNDUklQVEIgYnVzIGFkZHJlc3NlcwkqLworCXN0cnVjdCBzeW1fZnd6X2JhIGZ3el9iYXM7CS8qIFVzZWZ1bCBTQ1JJUFRaIGJ1cyBhZGRyZXNzZXMJKi8KKwl2b2lkCQkoKmZ3X3NldHVwKShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fZncgKmZ3KTsKKwl2b2lkCQkoKmZ3X3BhdGNoKShzdHJ1Y3Qgc3ltX2hjYiAqbnApOworCWNoYXIJCSpmd19uYW1lOworCisJLyoKKwkgKiAgR2VuZXJhbCBjb250cm9sbGVyIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24uCisJICovCisJdV9zaG9ydAlkZXZpY2VfaWQ7CS8qIFBDSSBkZXZpY2UgaWQJCSovCisJdV9jaGFyCXJldmlzaW9uX2lkOwkvKiBQQ0kgZGV2aWNlIHJldmlzaW9uIGlkCSovCisJdV9pbnQJZmVhdHVyZXM7CS8qIENoaXAgZmVhdHVyZXMgbWFwCQkqLworCXVfY2hhcglteWFkZHI7CQkvKiBTQ1NJIGlkIG9mIHRoZSBhZGFwdGVyCSovCisJdV9jaGFyCW1heGJ1cnN0OwkvKiBsb2cgYmFzZSAyIG9mIGR3b3JkcyBidXJzdAkqLworCXVfY2hhcgltYXh3aWRlOwkvKiBNYXhpbXVtIHRyYW5zZmVyIHdpZHRoCSovCisJdV9jaGFyCW1pbnN5bmM7CS8qIE1pbiBzeW5jIHBlcmlvZCBmYWN0b3IgKFNUKQkqLworCXVfY2hhcgltYXhzeW5jOwkvKiBNYXggc3luYyBwZXJpb2QgZmFjdG9yIChTVCkJKi8KKwl1X2NoYXIJbWF4b2ZmczsJLyogTWF4IHNjc2kgb2Zmc2V0ICAgICAgICAoU1QpCSovCisJdV9jaGFyCW1pbnN5bmNfZHQ7CS8qIE1pbiBzeW5jIHBlcmlvZCBmYWN0b3IgKERUKQkqLworCXVfY2hhcgltYXhzeW5jX2R0OwkvKiBNYXggc3luYyBwZXJpb2QgZmFjdG9yIChEVCkJKi8KKwl1X2NoYXIJbWF4b2Zmc19kdDsJLyogTWF4IHNjc2kgb2Zmc2V0ICAgICAgICAoRFQpCSovCisJdV9jaGFyCW11bHRpcGxpZXI7CS8qIENsb2NrIG11bHRpcGxpZXIgKDEsMiw0KQkqLworCXVfY2hhcgljbG9ja19kaXZuOwkvKiBOdW1iZXIgb2YgY2xvY2sgZGl2aXNvcnMJKi8KKwl1MzIJY2xvY2tfa2h6OwkvKiBTQ1NJIGNsb2NrIGZyZXF1ZW5jeSBpbiBLSHoJKi8KKwl1MzIJcGNpY2xrX2toejsJLyogRXN0aW1hdGVkIFBDSSBjbG9jayAgaW4gS0h6CSovCisJLyoKKwkgKiAgU3RhcnQgcXVldWUgbWFuYWdlbWVudC4KKwkgKiAgSXQgaXMgZmlsbGVkIHVwIGJ5IHRoZSBob3N0IHByb2Nlc3NvciBhbmQgYWNjZXNzZWQgYnkgdGhlIAorCSAqICBTQ1JJUFRTIHByb2Nlc3NvciBpbiBvcmRlciB0byBzdGFydCBTQ1NJIGNvbW1hbmRzLgorCSAqLworCXZvbGF0aWxlCQkvKiBQcmV2ZW50IGNvZGUgb3B0aW1pemF0aW9ucwkqLworCXUzMgkqc3F1ZXVlOwkvKiBTdGFydCBxdWV1ZSB2aXJ0dWFsIGFkZHJlc3MJKi8KKwl1MzIJc3F1ZXVlX2JhOwkvKiBTdGFydCBxdWV1ZSBCVVMgYWRkcmVzcwkqLworCXVfc2hvcnQJc3F1ZXVlcHV0OwkvKiBOZXh0IGZyZWUgc2xvdCBvZiB0aGUgcXVldWUJKi8KKwl1X3Nob3J0CWFjdGNjYnM7CS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgQ0NCcwkqLworCisJLyoKKwkgKiAgQ29tbWFuZCBjb21wbGV0aW9uIHF1ZXVlLgorCSAqICBJdCBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBzdGFydCBxdWV1ZSB0byBhdm9pZCBvdmVyZmxvdy4KKwkgKi8KKwl1X3Nob3J0CWRxdWV1ZWdldDsJLyogTmV4dCBwb3NpdGlvbiB0byBzY2FuCSovCisJdm9sYXRpbGUJCS8qIFByZXZlbnQgY29kZSBvcHRpbWl6YXRpb25zCSovCisJdTMyCSpkcXVldWU7CS8qIENvbXBsZXRpb24gKGRvbmUpIHF1ZXVlCSovCisJdTMyCWRxdWV1ZV9iYTsJLyogRG9uZSBxdWV1ZSBCVVMgYWRkcmVzcwkqLworCisJLyoKKwkgKiAgTWlzY2VsbGFuZW91cyBidWZmZXJzIGFjY2Vzc2VkIGJ5IHRoZSBzY3JpcHRzLXByb2Nlc3Nvci4KKwkgKiAgVGhleSBzaGFsbCBiZSBEV09SRCBhbGlnbmVkLCBiZWNhdXNlIHRoZXkgbWF5IGJlIHJlYWQgb3IgCisJICogIHdyaXR0ZW4gd2l0aCBhIHNjcmlwdCBjb21tYW5kLgorCSAqLworCXVfY2hhcgkJbXNnb3V0WzhdOwkvKiBCdWZmZXIgZm9yIE1FU1NBR0UgT1VUIAkqLworCXVfY2hhcgkJbXNnaW4gWzhdOwkvKiBCdWZmZXIgZm9yIE1FU1NBR0UgSU4JKi8KKwl1MzIJCWxhc3Rtc2c7CS8qIExhc3QgU0NTSSBtZXNzYWdlIHNlbnQJKi8KKwl1MzIJCXNjcmF0Y2g7CS8qIFNjcmF0Y2ggZm9yIFNDU0kgcmVjZWl2ZQkqLworCQkJCQkvKiBBbHNvIHVzZWQgZm9yIGNhY2hlIHRlc3QgCSovCisJLyoKKwkgKiAgTWlzY2VsbGFuZW91cyBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMgcGFyYW1ldGVycy4KKwkgKi8KKwl1X2NoYXIJCXVzcmZsYWdzOwkvKiBNaXNjZWxsYW5lb3VzIHVzZXIgZmxhZ3MJKi8KKwl1X2NoYXIJCXNjc2lfbW9kZTsJLyogQ3VycmVudCBTQ1NJIEJVUyBtb2RlCSovCisJdV9jaGFyCQl2ZXJib3NlOwkvKiBWZXJib3NpdHkgZm9yIHRoaXMgY29udHJvbGxlciovCisKKwkvKgorCSAqICBDQ0IgbGlzdHMgYW5kIHF1ZXVlLgorCSAqLworCXN0cnVjdCBzeW1fY2NiICoqY2NiaDsJCQkvKiBDQ0JzIGhhc2hlZCBieSBEU0EgdmFsdWUJKi8KKwkJCQkJLyogQ0NCX0hBU0hfU0laRSBsaXN0cyBvZiBDQ0JzCSovCisJU1lNX1FVRUhFQUQJZnJlZV9jY2JxOwkvKiBRdWV1ZSBvZiBhdmFpbGFibGUgQ0NCcwkqLworCVNZTV9RVUVIRUFECWJ1c3lfY2NicTsJLyogUXVldWUgb2YgYnVzeSBDQ0JzCQkqLworCisJLyoKKwkgKiAgRHVyaW5nIGVycm9yIGhhbmRsaW5nIGFuZC9vciByZWNvdmVyeSwKKwkgKiAgYWN0aXZlIENDQnMgdGhhdCBhcmUgdG8gYmUgY29tcGxldGVkIHdpdGggCisJICogIGVycm9yIG9yIHJlcXVldWVkIGFyZSBtb3ZlZCBmcm9tIHRoZSBidXN5X2NjYnEKKwkgKiAgdG8gdGhlIGNvbXBfY2NicSBwcmlvciB0byBjb21wbGV0aW9uLgorCSAqLworCVNZTV9RVUVIRUFECWNvbXBfY2NicTsKKworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORworCVNZTV9RVUVIRUFECWR1bW15X2NjYnE7CisjZW5kaWYKKworCS8qCisJICogIElNTUVESUFURSBBUkJJVFJBVElPTiAoSUFSQikgY29udHJvbC4KKwkgKgorCSAqICBXZSBrZWVwIHRyYWNrIGluICdsYXN0X2NwJyBvZiB0aGUgbGFzdCBDQ0IgdGhhdCBoYXMgYmVlbiAKKwkgKiAgcXVldWVkIHRvIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBhbmQgY2xlYXIgJ2xhc3RfY3AnIHdoZW4gCisJICogIHRoaXMgQ0NCIGNvbXBsZXRlcy4gSWYgbGFzdF9jcCBpcyBub3QgemVybyBhdCB0aGUgbW9tZW50IAorCSAqICB3ZSBxdWV1ZSBhIG5ldyBDQ0IsIHdlIHNldCBhIGZsYWcgaW4gJ2xhc3RfY3AnIHRoYXQgaXMgCisJICogIHVzZWQgYnkgdGhlIFNDUklQVFMgYXMgYSBoaW50IGZvciBzZXR0aW5nIElBUkIuCisJICogIFdlIGRvbm5vdCBzZXQgbW9yZSB0aGFuICdpYXJiX21heCcgY29uc2VjdXRpdmUgaGludHMgZm9yIAorCSAqICBJQVJCIGluIG9yZGVyIHRvIGxlYXZlIGRldmljZXMgYSBjaGFuY2UgdG8gcmVzZWxlY3QuCisJICogIEJ5IHRoZSB3YXksIGFueSBub24gemVybyB2YWx1ZSBvZiAnaWFyYl9tYXgnIGlzIHVuZmFpci4gOikKKwkgKi8KKyNpZmRlZiBTWU1fQ09ORl9JQVJCX1NVUFBPUlQKKwl1X3Nob3J0CQlpYXJiX21heDsJLyogTWF4LiAjIGNvbnNlY3V0aXZlIElBUkIgaGludHMqLworCXVfc2hvcnQJCWlhcmJfY291bnQ7CS8qIEFjdHVhbCAjIG9mIHRoZXNlIGhpbnRzCSovCisJc3RydWN0IHN5bV9jY2IgKglsYXN0X2NwOworI2VuZGlmCisKKwkvKgorCSAqICBDb21tYW5kIGFib3J0IGhhbmRsaW5nLgorCSAqICBXZSBuZWVkIHRvIHN5bmNocm9uaXplIHRpZ2h0bHkgd2l0aCB0aGUgU0NSSVBUUyAKKwkgKiAgcHJvY2Vzc29yIGluIG9yZGVyIHRvIGhhbmRsZSB0aGluZ3MgY29ycmVjdGx5LgorCSAqLworCXVfY2hhcgkJYWJydF9tc2dbNF07CS8qIE1lc3NhZ2UgdG8gc2VuZCBidWZmZXIJKi8KKwlzdHJ1Y3Qgc3ltX3RibG1vdmUgYWJydF90Ymw7CS8qIFRhYmxlIGZvciB0aGUgTU9WIG9mIGl0IAkqLworCXN0cnVjdCBzeW1fdGJsc2VsICBhYnJ0X3NlbDsJLyogU3luYyBwYXJhbXMgZm9yIHNlbGVjdGlvbgkqLworCXVfY2hhcgkJaXN0YXRfc2VtOwkvKiBUZWxscyB0aGUgY2hpcCB0byBzdG9wIChTRU0pCSovCisKKwkvKgorCSAqICA2NCBiaXQgRE1BIGhhbmRsaW5nLgorCSAqLworI2lmCVNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgIT0gMAorCXVfY2hhcgl1c2VfZGFjOwkJLyogVXNlIFBDSSBEQUMgY3ljbGVzCQkqLworI2lmCVNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMgorCXVfY2hhcglkbWFwX2RpcnR5OwkJLyogRG1hIHNlZ21lbnRzIHJlZ2lzdGVycyBkaXJ0eQkqLworCXUzMglkbWFwX2JhaFtTWU1fRE1BUF9TSVpFXTsvKiBTZWdtZW50IHJlZ2lzdGVycyBtYXAJKi8KKyNlbmRpZgorI2VuZGlmCit9OworCisjZGVmaW5lIEhDQl9CQShucCwgbGJsKQkobnAtPmhjYl9iYSArIG9mZnNldG9mKHN0cnVjdCBzeW1faGNiLCBsYmwpKQorCisKKy8qCisgKiAgRklSTVdBUkVTIChzeW1fZncuYykKKyAqLworc3RydWN0IHN5bV9mdyAqIHN5bV9maW5kX2Zpcm13YXJlKHN0cnVjdCBzeW1fY2hpcCAqY2hpcCk7Cit2b2lkIHN5bV9md19iaW5kX3NjcmlwdChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHUzMiAqc3RhcnQsIGludCBsZW4pOworCisvKgorICogIERyaXZlciBtZXRob2RzIGNhbGxlZCBmcm9tIE8vUyBzcGVjaWZpYyBjb2RlLgorICovCitjaGFyICpzeW1fZHJpdmVyX25hbWUodm9pZCk7Cit2b2lkIHN5bV9wcmludF94ZXJyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHhfc3RhdHVzKTsKK2ludCBzeW1fcmVzZXRfc2NzaV9idXMoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgZW5hYl9pbnQpOworc3RydWN0IHN5bV9jaGlwICpzeW1fbG9va3VwX2NoaXBfdGFibGUodV9zaG9ydCBkZXZpY2VfaWQsIHVfY2hhciByZXZpc2lvbik7Cit2b2lkIHN5bV9wdXRfc3RhcnRfcXVldWUoc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApOworI2lmZGVmIFNZTV9PUFRfSEFORExFX0RFVklDRV9RVUVVRUlORwordm9pZCBzeW1fc3RhcnRfbmV4dF9jY2JzKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9sY2IgKmxwLCBpbnQgbWF4bik7CisjZW5kaWYKK3ZvaWQgc3ltX3N0YXJ0X3VwKHN0cnVjdCBzeW1faGNiICpucCwgaW50IHJlYXNvbik7Cit2b2lkIHN5bV9pbnRlcnJ1cHQoc3RydWN0IHN5bV9oY2IgKm5wKTsKK2ludCBzeW1fY2xlYXJfdGFza3Moc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgY2FtX3N0YXR1cywgaW50IHRhcmdldCwgaW50IGx1biwgaW50IHRhc2spOworc3RydWN0IHN5bV9jY2IgKnN5bV9nZXRfY2NiKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHNjc2lfY21uZCAqY21kLCB1X2NoYXIgdGFnX29yZGVyKTsKK3ZvaWQgc3ltX2ZyZWVfY2NiKHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9jY2IgKmNwKTsKK3N0cnVjdCBzeW1fbGNiICpzeW1fYWxsb2NfbGNiKHN0cnVjdCBzeW1faGNiICpucCwgdV9jaGFyIHRuLCB1X2NoYXIgbG4pOworaW50IHN5bV9xdWV1ZV9zY3NpaW8oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjc2lvLCBzdHJ1Y3Qgc3ltX2NjYiAqY3ApOworaW50IHN5bV9hYm9ydF9zY3NpaW8oc3RydWN0IHN5bV9oY2IgKm5wLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjY2IsIGludCB0aW1lZF9vdXQpOworaW50IHN5bV9yZXNldF9zY3NpX3RhcmdldChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQpOwordm9pZCBzeW1faGNiX2ZyZWUoc3RydWN0IHN5bV9oY2IgKm5wKTsKK2ludCBzeW1faGNiX2F0dGFjaChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHN5bV9mdyAqZncsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKTsKKworLyoKKyAqICBCdWlsZCBhIHNjYXR0ZXIvZ2F0aGVyIGVudHJ5LgorICoKKyAqICBGb3IgNjQgYml0IHN5c3RlbXMsIHdlIHVzZSB0aGUgOCB1cHBlciBiaXRzIG9mIHRoZSBzaXplIGZpZWxkIAorICogIHRvIHByb3ZpZGUgYnVzIGFkZHJlc3MgYml0cyAzMi0zOSB0byB0aGUgU0NSSVBUUyBwcm9jZXNzb3IuCisgKiAgVGhpcyBhbGxvd3MgdGhlIDg5NUEsIDg5NiwgMTAxMCB0byBhZGRyZXNzIHVwIHRvIDEgVEIgb2YgbWVtb3J5LgorICovCisKKyNpZiAgIFNZTV9DT05GX0RNQV9BRERSRVNTSU5HX01PREUgPT0gMAorI2RlZmluZSBzeW1fYnVpbGRfc2dlKG5wLCBkYXRhLCBiYWRkLCBsZW4pCVwKK2RvIHsJCQkJCQlcCisJKGRhdGEpLT5hZGRyID0gY3B1X3RvX3NjcihiYWRkKTsJXAorCShkYXRhKS0+c2l6ZSA9IGNwdV90b19zY3IobGVuKTsJCVwKK30gd2hpbGUgKDApCisjZWxpZiBTWU1fQ09ORl9ETUFfQUREUkVTU0lOR19NT0RFID09IDEKKyNkZWZpbmUgc3ltX2J1aWxkX3NnZShucCwgZGF0YSwgYmFkZCwgbGVuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCShkYXRhKS0+YWRkciA9IGNwdV90b19zY3IoYmFkZCk7CQkJCVwKKwkoZGF0YSktPnNpemUgPSBjcHVfdG9fc2NyKCgoKGJhZGQpID4+IDgpICYgMHhmZjAwMDAwMCkgKyBsZW4pOwlcCit9IHdoaWxlICgwKQorI2VsaWYgU1lNX0NPTkZfRE1BX0FERFJFU1NJTkdfTU9ERSA9PSAyCitpbnQgc3ltX2xvb2t1cF9kbWFwKHN0cnVjdCBzeW1faGNiICpucCwgdTMyIGgsIGludCBzKTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIAorc3ltX2J1aWxkX3NnZShzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fdGJsbW92ZSAqZGF0YSwgdTY0IGJhZGQsIGludCBsZW4pCit7CisJdTMyIGggPSAoYmFkZD4+MzIpOworCWludCBzID0gKGgmU1lNX0RNQVBfTUFTSyk7CisKKwlpZiAoaCAhPSBucC0+ZG1hcF9iYWhbc10pCisJCWdvdG8gYmFkOworZ29vZDoKKwkoZGF0YSktPmFkZHIgPSBjcHVfdG9fc2NyKGJhZGQpOworCShkYXRhKS0+c2l6ZSA9IGNwdV90b19zY3IoKHM8PDI0KSArIGxlbik7CisJcmV0dXJuOworYmFkOgorCXMgPSBzeW1fbG9va3VwX2RtYXAobnAsIGgsIHMpOworCWdvdG8gZ29vZDsKK30KKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIERNQSBhZGRyZXNzaW5nIG1vZGUiCisjZW5kaWYKKworLyoKKyAqICBTZXQgdXAgZGF0YSBwb2ludGVycyB1c2VkIGJ5IFNDUklQVFMuCisgKiAgQ2FsbGVkIGZyb20gTy9TIHNwZWNpZmljIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeW1fc2V0dXBfZGF0YV9wb2ludGVycyhzdHJ1Y3Qgc3ltX2hjYiAqbnAsCisJCXN0cnVjdCBzeW1fY2NiICpjcCwgaW50IGRpcikKK3sKKwl1MzIgbGFzdHAsIGdvYWxwOworCisJLyoKKwkgKiAgTm8gc2VnbWVudHMgbWVhbnMgbm8gZGF0YS4KKwkgKi8KKwlpZiAoIWNwLT5zZWdtZW50cykKKwkJZGlyID0gQ0FNX0RJUl9OT05FOworCisJLyoKKwkgKiAgU2V0IHRoZSBkYXRhIHBvaW50ZXIuCisJICovCisJc3dpdGNoKGRpcikgeworI2lmZGVmCVNZTV9PUFRfSEFORExFX0RJUl9VTktOT1dOCisJY2FzZSBDQU1fRElSX1VOS05PV046CisjZW5kaWYKKwljYXNlIENBTV9ESVJfT1VUOgorCQlnb2FscCA9IFNDUklQVEFfQkEobnAsIGRhdGFfb3V0MikgKyA4OworCQlsYXN0cCA9IGdvYWxwIC0gOCAtIChjcC0+c2VnbWVudHMgKiAoMio0KSk7CisjaWZkZWYJU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwkJY3AtPndnb2FscCA9IGNwdV90b19zY3IoZ29hbHApOworCQlpZiAoZGlyICE9IENBTV9ESVJfVU5LTk9XTikKKwkJCWJyZWFrOworCQljcC0+cGh5cy5oZWFkLndsYXN0cCA9IGNwdV90b19zY3IobGFzdHApOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKyNlbHNlCisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBDQU1fRElSX0lOOgorCQljcC0+aG9zdF9mbGFncyB8PSBIRl9EQVRBX0lOOworCQlnb2FscCA9IFNDUklQVEFfQkEobnAsIGRhdGFfaW4yKSArIDg7CisJCWxhc3RwID0gZ29hbHAgLSA4IC0gKGNwLT5zZWdtZW50cyAqICgyKjQpKTsKKwkJYnJlYWs7CisJY2FzZSBDQU1fRElSX05PTkU6CisJZGVmYXVsdDoKKyNpZmRlZglTWU1fT1BUX0hBTkRMRV9ESVJfVU5LTk9XTgorCQljcC0+aG9zdF9mbGFncyB8PSBIRl9EQVRBX0lOOworI2VuZGlmCisJCWxhc3RwID0gZ29hbHAgPSBTQ1JJUFRCX0JBKG5wLCBub19kYXRhKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiAgU2V0IGFsbCBwb2ludGVycyB2YWx1ZXMgbmVlZGVkIGJ5IFNDUklQVFMuCisJICovCisJY3AtPnBoeXMuaGVhZC5sYXN0cCA9IGNwdV90b19zY3IobGFzdHApOworCWNwLT5waHlzLmhlYWQuc2F2ZXAgPSBjcHVfdG9fc2NyKGxhc3RwKTsKKwljcC0+c3RhcnRwCSAgICA9IGNwLT5waHlzLmhlYWQuc2F2ZXA7CisJY3AtPmdvYWxwCSAgICA9IGNwdV90b19zY3IoZ29hbHApOworCisjaWZkZWYJU1lNX09QVF9IQU5ETEVfRElSX1VOS05PV04KKwkvKgorCSAqICBJZiBkaXJlY3Rpb24gaXMgdW5rbm93biwgc3RhcnQgYXQgZGF0YV9pby4KKwkgKi8KKwlpZiAoZGlyID09IENBTV9ESVJfVU5LTk9XTikKKwkJY3AtPnBoeXMuaGVhZC5zYXZlcCA9IGNwdV90b19zY3IoU0NSSVBUQl9CQShucCwgZGF0YV9pbykpOworI2VuZGlmCit9CisKKy8qCisgKiAgTUVNT1JZIEFMTE9DQVRPUi4KKyAqLworCisjZGVmaW5lIFNZTV9NRU1fUEFHRV9PUkRFUiAwCS8qIDEgUEFHRSAgbWF4aW11bSAqLworI2RlZmluZSBTWU1fTUVNX0NMVVNURVJfU0hJRlQJKFBBR0VfU0hJRlQrU1lNX01FTV9QQUdFX09SREVSKQorI2RlZmluZSBTWU1fTUVNX0ZSRUVfVU5VU0VECS8qIEZyZWUgdW51c2VkIHBhZ2VzIGltbWVkaWF0ZWx5ICovCisKKyNkZWZpbmUgU1lNX01FTV9XQVJOCTEJLyogV2FybiBvbiBmYWlsZWQgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIHN5bV9nZXRfbWVtX2NsdXN0ZXIoKQlcCisJKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBTWU1fTUVNX1BBR0VfT1JERVIpCisjZGVmaW5lIHN5bV9mcmVlX21lbV9jbHVzdGVyKHApCVwKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXAsIFNZTV9NRU1fUEFHRV9PUkRFUikKKworLyoKKyAqICBMaW5rIGJldHdlZW4gZnJlZSBtZW1vcnkgY2h1bmtzIG9mIGEgZ2l2ZW4gc2l6ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3ltX21fbGluayB7CisJc3RydWN0IHN5bV9tX2xpbmsgKm5leHQ7Cit9ICptX2xpbmtfcDsKKworLyoKKyAqICBWaXJ0dWFsIHRvIGJ1cyBwaHlzaWNhbCB0cmFuc2xhdGlvbiBmb3IgYSBnaXZlbiBjbHVzdGVyLgorICogIFN1Y2ggYSBzdHJ1Y3R1cmUgaXMgb25seSB1c2VmdWwgd2l0aCBETUEgYWJzdHJhY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHN5bV9tX3Z0b2IgewkvKiBWaXJ0dWFsIHRvIEJ1cyBhZGRyZXNzIHRyYW5zbGF0aW9uICovCisJc3RydWN0IHN5bV9tX3Z0b2IgKm5leHQ7CisJdm9pZCAqdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IGJhZGRyOwkvKiBCdXMgcGh5c2ljYWwgYWRkcmVzcyAqLworfSAqbV92dG9iX3A7CisKKy8qIEhhc2ggdGhpcyBzdHVmZiBhIGJpdCB0byBzcGVlZCB1cCB0cmFuc2xhdGlvbnMgKi8KKyNkZWZpbmUgVlRPQl9IQVNIX1NISUZUCQk1CisjZGVmaW5lIFZUT0JfSEFTSF9TSVpFCQkoMVVMIDw8IFZUT0JfSEFTSF9TSElGVCkKKyNkZWZpbmUgVlRPQl9IQVNIX01BU0sJCShWVE9CX0hBU0hfU0laRS0xKQorI2RlZmluZSBWVE9CX0hBU0hfQ09ERShtKQlcCisJKCgoKHVuc2lnbmVkIGxvbmcpKG0pKSA+PiBTWU1fTUVNX0NMVVNURVJfU0hJRlQpICYgVlRPQl9IQVNIX01BU0spCisKKy8qCisgKiAgTWVtb3J5IHBvb2wgb2YgYSBnaXZlbiBraW5kLgorICogIElkZWFsbHksIHdlIHdhbnQgdG8gdXNlOgorICogIDEpIDEgcG9vbCBmb3IgbWVtb3J5IHdlIGRvbm5vdCBuZWVkIHRvIGludm9sdmUgaW4gRE1BLgorICogIDIpIFRoZSBzYW1lIHBvb2wgZm9yIGNvbnRyb2xsZXJzIHRoYXQgcmVxdWlyZSBzYW1lIERNQSAKKyAqICAgICBjb25zdHJhaW50cyBhbmQgZmVhdHVyZXMuCisgKiAgICAgVGhlIE9TIHNwZWNpZmljIG1fcG9vbF9pZF90IHRoaW5nIGFuZCB0aGUgc3ltX21fcG9vbF9tYXRjaCgpIAorICogICAgIG1ldGhvZCBhcmUgZXhwZWN0ZWQgdG8gdGVsbCB0aGUgZHJpdmVyIGFib3V0LgorICovCit0eXBlZGVmIHN0cnVjdCBzeW1fbV9wb29sIHsKKwltX3Bvb2xfaWRlbnRfdAlkZXZfZG1hdDsJLyogSWRlbnRpZmllcyB0aGUgcG9vbCAoc2VlIGFib3ZlKSAqLworCXZvaWQgKiAoKmdldF9tZW1fY2x1c3Rlcikoc3RydWN0IHN5bV9tX3Bvb2wgKik7CisjaWZkZWYJU1lNX01FTV9GUkVFX1VOVVNFRAorCXZvaWQgKCpmcmVlX21lbV9jbHVzdGVyKShzdHJ1Y3Qgc3ltX21fcG9vbCAqLCB2b2lkICopOworI2VuZGlmCisjZGVmaW5lIE1fR0VUX01FTV9DTFVTVEVSKCkJCW1wLT5nZXRfbWVtX2NsdXN0ZXIobXApCisjZGVmaW5lIE1fRlJFRV9NRU1fQ0xVU1RFUihwKQkJbXAtPmZyZWVfbWVtX2NsdXN0ZXIobXAsIHApCisJaW50IG51bXA7CisJbV92dG9iX3AgdnRvYltWVE9CX0hBU0hfU0laRV07CisJc3RydWN0IHN5bV9tX3Bvb2wgKm5leHQ7CisJc3RydWN0IHN5bV9tX2xpbmsgaFtTWU1fTUVNX0NMVVNURVJfU0hJRlQgLSBTWU1fTUVNX1NISUZUICsgMV07Cit9ICptX3Bvb2xfcDsKKworLyoKKyAqICBBbGxvYywgZnJlZSBhbmQgdHJhbnNsYXRlIGFkZHJlc3NlcyB0byBidXMgcGh5c2ljYWwgCisgKiAgZm9yIERNQWFibGUgbWVtb3J5LgorICovCit2b2lkICpfX3N5bV9jYWxsb2NfZG1hKG1fcG9vbF9pZGVudF90IGRldl9kbWF0LCBpbnQgc2l6ZSwgY2hhciAqbmFtZSk7Cit2b2lkIF9fc3ltX21mcmVlX2RtYShtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCwgdm9pZCAqbSwgaW50IHNpemUsIGNoYXIgKm5hbWUpOworZG1hX2FkZHJfdCBfX3Z0b2J1cyhtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCwgdm9pZCAqbSk7CisKKy8qCisgKiBWZXJicyB1c2VkIGJ5IHRoZSBkcml2ZXIgY29kZSBmb3IgRE1BYWJsZSBtZW1vcnkgaGFuZGxpbmcuCisgKiBUaGUgX3V2cHR2XyBtYWNybyBhdm9pZHMgYSBuYXN0eSB3YXJuaW5nIGFib3V0IHBvaW50ZXIgdG8gdm9sYXRpbGUgCisgKiBiZWluZyBkaXNjYXJkZWQuCisgKi8KKyNkZWZpbmUgX3V2cHR2XyhwKSAoKHZvaWQgKikoKHVfbG9uZykocCkpKQorCisjZGVmaW5lIF9zeW1fY2FsbG9jX2RtYShucCwgbCwgbikJX19zeW1fY2FsbG9jX2RtYShucC0+YnVzX2RtYXQsIGwsIG4pCisjZGVmaW5lIF9zeW1fbWZyZWVfZG1hKG5wLCBwLCBsLCBuKQlcCisJCQlfX3N5bV9tZnJlZV9kbWEobnAtPmJ1c19kbWF0LCBfdXZwdHZfKHApLCBsLCBuKQorI2RlZmluZSBzeW1fY2FsbG9jX2RtYShsLCBuKQkJX3N5bV9jYWxsb2NfZG1hKG5wLCBsLCBuKQorI2RlZmluZSBzeW1fbWZyZWVfZG1hKHAsIGwsIG4pCQlfc3ltX21mcmVlX2RtYShucCwgcCwgbCwgbikKKyNkZWZpbmUgdnRvYnVzKHApCQkJX192dG9idXMobnAtPmJ1c19kbWF0LCBfdXZwdHZfKHApKQorCisvKgorICogIFdlIGhhdmUgdG8gcHJvdmlkZSB0aGUgZHJpdmVyIG1lbW9yeSBhbGxvY2F0b3Igd2l0aCBtZXRob2RzIGZvciAKKyAqICBpdCB0byBtYWludGFpbiB2aXJ0dWFsIHRvIGJ1cyBwaHlzaWNhbCBhZGRyZXNzIHRyYW5zbGF0aW9ucy4KKyAqLworCisjZGVmaW5lIHN5bV9tX3Bvb2xfbWF0Y2gobXBfaWQxLCBtcF9pZDIpCShtcF9pZDEgPT0gbXBfaWQyKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCAqc3ltX21fZ2V0X2RtYV9tZW1fY2x1c3RlcihtX3Bvb2xfcCBtcCwgbV92dG9iX3AgdmJwKQoreworCXZvaWQgKnZhZGRyID0gTlVMTDsKKwlkbWFfYWRkcl90IGJhZGRyID0gMDsKKworCXZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KG1wLT5kZXZfZG1hdCwgU1lNX01FTV9DTFVTVEVSX1NJWkUsICZiYWRkciwKKwkJCUdGUF9BVE9NSUMpOworCWlmICh2YWRkcikgeworCQl2YnAtPnZhZGRyID0gdmFkZHI7CisJCXZicC0+YmFkZHIgPSBiYWRkcjsKKwl9CisJcmV0dXJuIHZhZGRyOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBzeW1fbV9mcmVlX2RtYV9tZW1fY2x1c3RlcihtX3Bvb2xfcCBtcCwgbV92dG9iX3AgdmJwKQoreworCWRtYV9mcmVlX2NvaGVyZW50KG1wLT5kZXZfZG1hdCwgU1lNX01FTV9DTFVTVEVSX1NJWkUsIHZicC0+dmFkZHIsCisJCQl2YnAtPmJhZGRyKTsKK30KKworI2VuZGlmIC8qIFNZTV9ISVBEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fbWFsbG9jLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGQ0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX21hbGxvYy5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2luY2x1ZGUgPGRldi9zeW0vc3ltX2dsdWUuaD4KKyNlbHNlCisjaW5jbHVkZSAic3ltX2dsdWUuaCIKKyNlbmRpZgorCisvKgorICogIFNpbXBsZSBwb3dlciBvZiB0d28gYnVkZHktbGlrZSBnZW5lcmljIGFsbG9jYXRvci4KKyAqICBQcm92aWRlcyBuYXR1cmFsbHkgYWxpZ25lZCBtZW1vcnkgY2h1bmtzLgorICoKKyAqICBUaGlzIHNpbXBsZSBjb2RlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBmYXN0LCBidXQgdG8gCisgKiAgcHJvdmlkZSBwb3dlciBvZiAyIGFsaWduZWQgbWVtb3J5IGFsbG9jYXRpb25zLgorICogIFNpbmNlIHRoZSBTQ1JJUFRTIHByb2Nlc3NvciBvbmx5IHN1cHBsaWVzIDggYml0IGFyaXRobWV0aWMsIAorICogIHRoaXMgYWxsb2NhdG9yIGFsbG93cyBzaW1wbGUgYW5kIGZhc3QgYWRkcmVzcyBjYWxjdWxhdGlvbnMgIAorICogIGZyb20gdGhlIFNDUklQVFMgY29kZS4gSW4gYWRkaXRpb24sIGNhY2hlIGxpbmUgYWxpZ25tZW50IAorICogIGlzIGd1YXJhbnRlZWQgZm9yIHBvd2VyIG9mIDIgY2FjaGUgbGluZSBzaXplLgorICoKKyAqICBUaGlzIGFsbG9jYXRvciBoYXMgYmVlbiBkZXZlbG9wcGVkIGZvciB0aGUgTGludXggc3ltNTNjOHh4ICAKKyAqICBkcml2ZXIsIHNpbmNlIHRoaXMgTy9TIGRvZXMgbm90IHByb3ZpZGUgbmF0dXJhbGx5IGFsaWduZWQgCisgKiAgYWxsb2NhdGlvbnMuCisgKiAgSXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgYWxsb3dpbmcgdGhlIGRyaXZlciB0byB1c2UgcHJpdmF0ZSAKKyAqICBwYWdlcyBvZiBtZW1vcnkgdGhhdCB3aWxsIGJlIHVzZWZ1bCBpZiB3ZSBldmVyIG5lZWQgdG8gZGVhbCAKKyAqICB3aXRoIElPIE1NVXMgZm9yIFBDSS4KKyAqLworc3RhdGljIHZvaWQgKl9fX3N5bV9tYWxsb2MobV9wb29sX3AgbXAsIGludCBzaXplKQoreworCWludCBpID0gMDsKKwlpbnQgcyA9ICgxIDw8IFNZTV9NRU1fU0hJRlQpOworCWludCBqOworCXZvaWQgKmE7CisJbV9saW5rX3AgaCA9IG1wLT5oOworCisJaWYgKHNpemUgPiBTWU1fTUVNX0NMVVNURVJfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoc2l6ZSA+IHMpIHsKKwkJcyA8PD0gMTsKKwkJKytpOworCX0KKworCWogPSBpOworCXdoaWxlICghaFtqXS5uZXh0KSB7CisJCWlmIChzID09IFNZTV9NRU1fQ0xVU1RFUl9TSVpFKSB7CisJCQloW2pdLm5leHQgPSAobV9saW5rX3ApIE1fR0VUX01FTV9DTFVTVEVSKCk7CisJCQlpZiAoaFtqXS5uZXh0KQorCQkJCWhbal0ubmV4dC0+bmV4dCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQkrK2o7CisJCXMgPDw9IDE7CisJfQorCWEgPSBoW2pdLm5leHQ7CisJaWYgKGEpIHsKKwkJaFtqXS5uZXh0ID0gaFtqXS5uZXh0LT5uZXh0OworCQl3aGlsZSAoaiA+IGkpIHsKKwkJCWogLT0gMTsKKwkJCXMgPj49IDE7CisJCQloW2pdLm5leHQgPSAobV9saW5rX3ApIChhK3MpOworCQkJaFtqXS5uZXh0LT5uZXh0ID0gTlVMTDsKKwkJfQorCX0KKyNpZmRlZiBERUJVRworCXByaW50ZigiX19fc3ltX21hbGxvYyglZCkgPSAlcFxuIiwgc2l6ZSwgKHZvaWQgKikgYSk7CisjZW5kaWYKKwlyZXR1cm4gYTsKK30KKworLyoKKyAqICBDb3VudGVyLXBhcnQgb2YgdGhlIGdlbmVyaWMgYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCBfX19zeW1fbWZyZWUobV9wb29sX3AgbXAsIHZvaWQgKnB0ciwgaW50IHNpemUpCit7CisJaW50IGkgPSAwOworCWludCBzID0gKDEgPDwgU1lNX01FTV9TSElGVCk7CisJbV9saW5rX3AgcTsKKwl1bnNpZ25lZCBsb25nIGEsIGI7CisJbV9saW5rX3AgaCA9IG1wLT5oOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoIl9fX3N5bV9tZnJlZSglcCwgJWQpXG4iLCBwdHIsIHNpemUpOworI2VuZGlmCisKKwlpZiAoc2l6ZSA+IFNZTV9NRU1fQ0xVU1RFUl9TSVpFKQorCQlyZXR1cm47CisKKwl3aGlsZSAoc2l6ZSA+IHMpIHsKKwkJcyA8PD0gMTsKKwkJKytpOworCX0KKworCWEgPSAodW5zaWduZWQgbG9uZylwdHI7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocyA9PSBTWU1fTUVNX0NMVVNURVJfU0laRSkgeworI2lmZGVmIFNZTV9NRU1fRlJFRV9VTlVTRUQKKwkJCU1fRlJFRV9NRU1fQ0xVU1RFUigodm9pZCAqKWEpOworI2Vsc2UKKwkJCSgobV9saW5rX3ApIGEpLT5uZXh0ID0gaFtpXS5uZXh0OworCQkJaFtpXS5uZXh0ID0gKG1fbGlua19wKSBhOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQliID0gYSBeIHM7CisJCXEgPSAmaFtpXTsKKwkJd2hpbGUgKHEtPm5leHQgJiYgcS0+bmV4dCAhPSAobV9saW5rX3ApIGIpIHsKKwkJCXEgPSBxLT5uZXh0OworCQl9CisJCWlmICghcS0+bmV4dCkgeworCQkJKChtX2xpbmtfcCkgYSktPm5leHQgPSBoW2ldLm5leHQ7CisJCQloW2ldLm5leHQgPSAobV9saW5rX3ApIGE7CisJCQlicmVhazsKKwkJfQorCQlxLT5uZXh0ID0gcS0+bmV4dC0+bmV4dDsKKwkJYSA9IGEgJiBiOworCQlzIDw8PSAxOworCQkrK2k7CisJfQorfQorCisvKgorICogIFZlcmJvc2UgYW5kIHplcm9pbmcgYWxsb2NhdG9yIHRoYXQgd3JhcHBzIHRvIHRoZSBnZW5lcmljIGFsbG9jYXRvci4KKyAqLworc3RhdGljIHZvaWQgKl9fc3ltX2NhbGxvYzIobV9wb29sX3AgbXAsIGludCBzaXplLCBjaGFyICpuYW1lLCBpbnQgdWZsYWdzKQoreworCXZvaWQgKnA7CisKKwlwID0gX19fc3ltX21hbGxvYyhtcCwgc2l6ZSk7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19BTExPQykgeworCQlwcmludGYgKCJuZXcgJS0xMHNbJTRkXSBAJXAuXG4iLCBuYW1lLCBzaXplLCBwKTsKKwl9CisKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIHNpemUpOworCWVsc2UgaWYgKHVmbGFncyAmIFNZTV9NRU1fV0FSTikKKwkJcHJpbnRmICgiX19zeW1fY2FsbG9jMjogZmFpbGVkIHRvIGFsbG9jYXRlICVzWyVkXVxuIiwgbmFtZSwgc2l6ZSk7CisJcmV0dXJuIHA7Cit9CisjZGVmaW5lIF9fc3ltX2NhbGxvYyhtcCwgcywgbikJX19zeW1fY2FsbG9jMihtcCwgcywgbiwgU1lNX01FTV9XQVJOKQorCisvKgorICogIEl0cyBjb3VudGVyLXBhcnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fc3ltX21mcmVlKG1fcG9vbF9wIG1wLCB2b2lkICpwdHIsIGludCBzaXplLCBjaGFyICpuYW1lKQoreworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX0FMTE9DKQorCQlwcmludGYgKCJmcmVlaW5nICUtMTBzWyU0ZF0gQCVwLlxuIiwgbmFtZSwgc2l6ZSwgcHRyKTsKKworCV9fX3N5bV9tZnJlZShtcCwgcHRyLCBzaXplKTsKK30KKworLyoKKyAqICBEZWZhdWx0IG1lbW9yeSBwb29sIHdlIGRvbm5vdCBuZWVkIHRvIGludm9sdmUgaW4gRE1BLgorICoKKyAqICBXaXRoIERNQSBhYnN0cmFjdGlvbiwgd2UgdXNlIGZ1bmN0aW9ucyAobWV0aG9kcyksIHRvIAorICogIGRpc3Rpbmd1aXNoIGJldHdlZW4gbm9uIERNQWFibGUgbWVtb3J5IGFuZCBETUFhYmxlIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgKl9fX21wMF9nZXRfbWVtX2NsdXN0ZXIobV9wb29sX3AgbXApCit7CisJdm9pZCAqbSA9IHN5bV9nZXRfbWVtX2NsdXN0ZXIoKTsKKwlpZiAobSkKKwkJKyttcC0+bnVtcDsKKwlyZXR1cm4gbTsKK30KKworI2lmZGVmCVNZTV9NRU1fRlJFRV9VTlVTRUQKK3N0YXRpYyB2b2lkIF9fX21wMF9mcmVlX21lbV9jbHVzdGVyKG1fcG9vbF9wIG1wLCB2b2lkICptKQoreworCXN5bV9mcmVlX21lbV9jbHVzdGVyKG0pOworCS0tbXAtPm51bXA7Cit9CisjZWxzZQorI2RlZmluZSBfX19tcDBfZnJlZV9tZW1fY2x1c3RlciBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzeW1fbV9wb29sIG1wMCA9IHsKKwlOVUxMLAorCV9fX21wMF9nZXRfbWVtX2NsdXN0ZXIsCisJX19fbXAwX2ZyZWVfbWVtX2NsdXN0ZXIKK307CisKKy8qCisgKiAgTWV0aG9kcyB0aGF0IG1haW50YWlucyBETUFhYmxlIHBvb2xzIGFjY29yZGluZyB0byB1c2VyIGFsbG9jYXRpb25zLgorICogIE5ldyBwb29scyBhcmUgY3JlYXRlZCBvbiB0aGUgZmx5IHdoZW4gYSBuZXcgcG9vbCBpZCBpcyBwcm92aWRlZC4KKyAqICBUaGV5IGFyZSBkZWxldGVkIG9uIHRoZSBmbHkgd2hlbiB0aGV5IGdldCBlbXB0aWVkLgorICovCisvKiBHZXQgYSBtZW1vcnkgY2x1c3RlciB0aGF0IG1hdGNoZXMgdGhlIERNQSBjb25zdHJhaW50cyBvZiBhIGdpdmVuIHBvb2wgKi8KK3N0YXRpYyB2b2lkICogX19fZ2V0X2RtYV9tZW1fY2x1c3RlcihtX3Bvb2xfcCBtcCkKK3sKKwltX3Z0b2JfcCB2YnA7CisJdm9pZCAqdmFkZHI7CisKKwl2YnAgPSBfX3N5bV9jYWxsb2MoJm1wMCwgc2l6ZW9mKCp2YnApLCAiVlRPQiIpOworCWlmICghdmJwKQorCQlnb3RvIG91dF9lcnI7CisKKwl2YWRkciA9IHN5bV9tX2dldF9kbWFfbWVtX2NsdXN0ZXIobXAsIHZicCk7CisJaWYgKHZhZGRyKSB7CisJCWludCBoYyA9IFZUT0JfSEFTSF9DT0RFKHZhZGRyKTsKKwkJdmJwLT5uZXh0ID0gbXAtPnZ0b2JbaGNdOworCQltcC0+dnRvYltoY10gPSB2YnA7CisJCSsrbXAtPm51bXA7CisJfQorCXJldHVybiB2YWRkcjsKK291dF9lcnI6CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZglTWU1fTUVNX0ZSRUVfVU5VU0VECisvKiBGcmVlIGEgbWVtb3J5IGNsdXN0ZXIgYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzIGZvciBETUEgKi8KK3N0YXRpYyB2b2lkIF9fX2ZyZWVfZG1hX21lbV9jbHVzdGVyKG1fcG9vbF9wIG1wLCB2b2lkICptKQoreworCW1fdnRvYl9wICp2YnBwLCB2YnA7CisJaW50IGhjID0gVlRPQl9IQVNIX0NPREUobSk7CisKKwl2YnBwID0gJm1wLT52dG9iW2hjXTsKKwl3aGlsZSAoKnZicHAgJiYgKCp2YnBwKS0+dmFkZHIgIT0gbSkKKwkJdmJwcCA9ICYoKnZicHApLT5uZXh0OworCWlmICgqdmJwcCkgeworCQl2YnAgPSAqdmJwcDsKKwkJKnZicHAgPSAoKnZicHApLT5uZXh0OworCQlzeW1fbV9mcmVlX2RtYV9tZW1fY2x1c3RlcihtcCwgdmJwKTsKKwkJX19zeW1fbWZyZWUoJm1wMCwgdmJwLCBzaXplb2YoKnZicCksICJWVE9CIik7CisJCS0tbXAtPm51bXA7CisJfQorfQorI2VuZGlmCisKKy8qIEZldGNoIHRoZSBtZW1vcnkgcG9vbCBmb3IgYSBnaXZlbiBwb29sIGlkIChpLmUuIERNQSBjb25zdHJhaW50cykgKi8KK3N0YXRpYyBfX2lubGluZSBtX3Bvb2xfcCBfX19nZXRfZG1hX3Bvb2wobV9wb29sX2lkZW50X3QgZGV2X2RtYXQpCit7CisJbV9wb29sX3AgbXA7CisJZm9yIChtcCA9IG1wMC5uZXh0OworCQltcCAmJiAhc3ltX21fcG9vbF9tYXRjaChtcC0+ZGV2X2RtYXQsIGRldl9kbWF0KTsKKwkJCW1wID0gbXAtPm5leHQpOworCXJldHVybiBtcDsKK30KKworLyogQ3JlYXRlIGEgbmV3IG1lbW9yeSBETUFhYmxlIHBvb2wgKHdoZW4gZmV0Y2ggZmFpbGVkKSAqLworc3RhdGljIG1fcG9vbF9wIF9fX2NyZV9kbWFfcG9vbChtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCkKK3sKKwltX3Bvb2xfcCBtcCA9IF9fc3ltX2NhbGxvYygmbXAwLCBzaXplb2YoKm1wKSwgIk1QT09MIik7CisJaWYgKG1wKSB7CisJCW1wLT5kZXZfZG1hdCA9IGRldl9kbWF0OworCQltcC0+Z2V0X21lbV9jbHVzdGVyID0gX19fZ2V0X2RtYV9tZW1fY2x1c3RlcjsKKyNpZmRlZglTWU1fTUVNX0ZSRUVfVU5VU0VECisJCW1wLT5mcmVlX21lbV9jbHVzdGVyID0gX19fZnJlZV9kbWFfbWVtX2NsdXN0ZXI7CisjZW5kaWYKKwkJbXAtPm5leHQgPSBtcDAubmV4dDsKKwkJbXAwLm5leHQgPSBtcDsKKwkJcmV0dXJuIG1wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmCVNZTV9NRU1fRlJFRV9VTlVTRUQKKy8qIERlc3Ryb3kgYSBETUFhYmxlIG1lbW9yeSBwb29sICh3aGVuIGdvdCBlbXB0aWVkKSAqLworc3RhdGljIHZvaWQgX19fZGVsX2RtYV9wb29sKG1fcG9vbF9wIHApCit7CisJbV9wb29sX3AgKnBwID0gJm1wMC5uZXh0OworCisJd2hpbGUgKCpwcCAmJiAqcHAgIT0gcCkKKwkJcHAgPSAmKCpwcCktPm5leHQ7CisJaWYgKCpwcCkgeworCQkqcHAgPSAoKnBwKS0+bmV4dDsKKwkJX19zeW1fbWZyZWUoJm1wMCwgcCwgc2l6ZW9mKCpwKSwgIk1QT09MIik7CisJfQorfQorI2VuZGlmCisKKy8qIFRoaXMgbG9jayBwcm90ZWN0cyBvbmx5IHRoZSBtZW1vcnkgYWxsb2NhdGlvbi9mcmVlLiAgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3ltNTNjOHh4X2xvY2spOworCisvKgorICogIEFjdHVhbCBhbGxvY2F0b3IgZm9yIERNQWFibGUgbWVtb3J5LgorICovCit2b2lkICpfX3N5bV9jYWxsb2NfZG1hKG1fcG9vbF9pZGVudF90IGRldl9kbWF0LCBpbnQgc2l6ZSwgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW1fcG9vbF9wIG1wOworCXZvaWQgKm0gPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bTUzYzh4eF9sb2NrLCBmbGFncyk7CisJbXAgPSBfX19nZXRfZG1hX3Bvb2woZGV2X2RtYXQpOworCWlmICghbXApCisJCW1wID0gX19fY3JlX2RtYV9wb29sKGRldl9kbWF0KTsKKwlpZiAoIW1wKQorCQlnb3RvIG91dDsKKwltID0gX19zeW1fY2FsbG9jKG1wLCBzaXplLCBuYW1lKTsKKyNpZmRlZglTWU1fTUVNX0ZSRUVfVU5VU0VECisJaWYgKCFtcC0+bnVtcCkKKwkJX19fZGVsX2RtYV9wb29sKG1wKTsKKyNlbmRpZgorCisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bTUzYzh4eF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIG07Cit9CisKK3ZvaWQgX19zeW1fbWZyZWVfZG1hKG1fcG9vbF9pZGVudF90IGRldl9kbWF0LCB2b2lkICptLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW1fcG9vbF9wIG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bTUzYzh4eF9sb2NrLCBmbGFncyk7CisJbXAgPSBfX19nZXRfZG1hX3Bvb2woZGV2X2RtYXQpOworCWlmICghbXApCisJCWdvdG8gb3V0OworCV9fc3ltX21mcmVlKG1wLCBtLCBzaXplLCBuYW1lKTsKKyNpZmRlZglTWU1fTUVNX0ZSRUVfVU5VU0VECisJaWYgKCFtcC0+bnVtcCkKKwkJX19fZGVsX2RtYV9wb29sKG1wKTsKKyNlbmRpZgorIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW01M2M4eHhfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogIEFjdHVhbCB2aXJ0dWFsIHRvIGJ1cyBwaHlzaWNhbCBhZGRyZXNzIHRyYW5zbGF0b3IgCisgKiAgZm9yIDMyIGJpdCBhZGRyZXNzYWJsZSBETUFhYmxlIG1lbW9yeS4KKyAqLworZG1hX2FkZHJfdCBfX3Z0b2J1cyhtX3Bvb2xfaWRlbnRfdCBkZXZfZG1hdCwgdm9pZCAqbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW1fcG9vbF9wIG1wOworCWludCBoYyA9IFZUT0JfSEFTSF9DT0RFKG0pOworCW1fdnRvYl9wIHZwID0gTlVMTDsKKwl2b2lkICphID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbSAmIH5TWU1fTUVNX0NMVVNURVJfTUFTSyk7CisJZG1hX2FkZHJfdCBiOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bTUzYzh4eF9sb2NrLCBmbGFncyk7CisJbXAgPSBfX19nZXRfZG1hX3Bvb2woZGV2X2RtYXQpOworCWlmIChtcCkgeworCQl2cCA9IG1wLT52dG9iW2hjXTsKKwkJd2hpbGUgKHZwICYmIHZwLT52YWRkciAhPSBhKQorCQkJdnAgPSB2cC0+bmV4dDsKKwl9CisJaWYgKCF2cCkKKwkJcGFuaWMoInN5bTogVlRPQlVTIEZBSUxFRCFcbiIpOworCWIgPSB2cC0+YmFkZHIgKyAobSAtIGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bTUzYzh4eF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX21pc2MuaCBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzNkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX21pc2MuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIFNZTV9NSVNDX0gKKyNkZWZpbmUgU1lNX01JU0NfSAorCisvKgorICogIEEgbGEgVk1TL0NBTS0zIHF1ZXVlIG1hbmFnZW1lbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHN5bV9xdWVoZWFkIHsKKwlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmZsaW5rOwkvKiBGb3J3YXJkICBwb2ludGVyICovCisJc3RydWN0IHN5bV9xdWVoZWFkICpibGluazsJLyogQmFja3dhcmQgcG9pbnRlciAqLworfSBTWU1fUVVFSEVBRDsKKworI2RlZmluZSBzeW1fcXVlX2luaXQocHRyKSBkbyB7IFwKKwkocHRyKS0+ZmxpbmsgPSAocHRyKTsgKHB0ciktPmJsaW5rID0gKHB0cik7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKnN5bV9xdWVfZmlyc3Qoc3RydWN0IHN5bV9xdWVoZWFkICpoZWFkKQoreworCXJldHVybiAoaGVhZC0+ZmxpbmsgPT0gaGVhZCkgPyAwIDogaGVhZC0+Zmxpbms7Cit9CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKnN5bV9xdWVfbGFzdChzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmhlYWQpCit7CisJcmV0dXJuIChoZWFkLT5ibGluayA9PSBoZWFkKSA/IDAgOiBoZWFkLT5ibGluazsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQgX19zeW1fcXVlX2FkZChzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKiBuZXcsCisJc3RydWN0IHN5bV9xdWVoZWFkICogYmxpbmssCisJc3RydWN0IHN5bV9xdWVoZWFkICogZmxpbmspCit7CisJZmxpbmstPmJsaW5rCT0gbmV3OworCW5ldy0+ZmxpbmsJPSBmbGluazsKKwluZXctPmJsaW5rCT0gYmxpbms7CisJYmxpbmstPmZsaW5rCT0gbmV3OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfX3N5bV9xdWVfZGVsKHN0cnVjdCBzeW1fcXVlaGVhZCAqIGJsaW5rLAorCXN0cnVjdCBzeW1fcXVlaGVhZCAqIGZsaW5rKQoreworCWZsaW5rLT5ibGluayA9IGJsaW5rOworCWJsaW5rLT5mbGluayA9IGZsaW5rOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50IHN5bV9xdWVfZW1wdHkoc3RydWN0IHN5bV9xdWVoZWFkICpoZWFkKQoreworCXJldHVybiBoZWFkLT5mbGluayA9PSBoZWFkOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBzeW1fcXVlX3NwbGljZShzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmxpc3QsCisJc3RydWN0IHN5bV9xdWVoZWFkICpoZWFkKQoreworCXN0cnVjdCBzeW1fcXVlaGVhZCAqZmlyc3QgPSBsaXN0LT5mbGluazsKKworCWlmIChmaXJzdCAhPSBsaXN0KSB7CisJCXN0cnVjdCBzeW1fcXVlaGVhZCAqbGFzdCA9IGxpc3QtPmJsaW5rOworCQlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmF0ICAgPSBoZWFkLT5mbGluazsKKworCQlmaXJzdC0+YmxpbmsgPSBoZWFkOworCQloZWFkLT5mbGluayAgPSBmaXJzdDsKKworCQlsYXN0LT5mbGluayA9IGF0OworCQlhdC0+YmxpbmsgICA9IGxhc3Q7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCBzeW1fcXVlX21vdmUoc3RydWN0IHN5bV9xdWVoZWFkICpvcmlnLAorCXN0cnVjdCBzeW1fcXVlaGVhZCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmZpcnN0LCAqbGFzdDsKKworCWZpcnN0ID0gb3JpZy0+Zmxpbms7CisJaWYgKGZpcnN0ICE9IG9yaWcpIHsKKwkJZmlyc3QtPmJsaW5rID0gZGVzdDsKKwkJZGVzdC0+ZmxpbmsgID0gZmlyc3Q7CisJCWxhc3QgPSBvcmlnLT5ibGluazsKKwkJbGFzdC0+ZmxpbmsgID0gZGVzdDsKKwkJZGVzdC0+YmxpbmsgID0gbGFzdDsKKwkJb3JpZy0+ZmxpbmsgID0gb3JpZzsKKwkJb3JpZy0+YmxpbmsgID0gb3JpZzsKKwl9IGVsc2UgeworCQlkZXN0LT5mbGluayAgPSBkZXN0OworCQlkZXN0LT5ibGluayAgPSBkZXN0OworCX0KK30KKworI2RlZmluZSBzeW1fcXVlX2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJKCh0eXBlICopKChjaGFyICopKHB0ciktKHVuc2lnbmVkIGludCkoJigodHlwZSAqKTApLT5tZW1iZXIpKSkKKworCisjZGVmaW5lIHN5bV9pbnNxdWUobmV3LCBwb3MpCQlfX3N5bV9xdWVfYWRkKG5ldywgcG9zLCAocG9zKS0+ZmxpbmspCisKKyNkZWZpbmUgc3ltX3JlbXF1ZShlbCkJCQlfX3N5bV9xdWVfZGVsKChlbCktPmJsaW5rLCAoZWwpLT5mbGluaykKKworI2RlZmluZSBzeW1faW5zcXVlX2hlYWQobmV3LCBoZWFkKQlfX3N5bV9xdWVfYWRkKG5ldywgaGVhZCwgKGhlYWQpLT5mbGluaykKKworc3RhdGljIF9faW5saW5lIHN0cnVjdCBzeW1fcXVlaGVhZCAqc3ltX3JlbXF1ZV9oZWFkKHN0cnVjdCBzeW1fcXVlaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmVsZW0gPSBoZWFkLT5mbGluazsKKworCWlmIChlbGVtICE9IGhlYWQpCisJCV9fc3ltX3F1ZV9kZWwoaGVhZCwgZWxlbS0+ZmxpbmspOworCWVsc2UKKwkJZWxlbSA9IE5VTEw7CisJcmV0dXJuIGVsZW07Cit9CisKKyNkZWZpbmUgc3ltX2luc3F1ZV90YWlsKG5ldywgaGVhZCkJX19zeW1fcXVlX2FkZChuZXcsIChoZWFkKS0+YmxpbmssIGhlYWQpCisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKnN5bV9yZW1xdWVfdGFpbChzdHJ1Y3Qgc3ltX3F1ZWhlYWQgKmhlYWQpCit7CisJc3RydWN0IHN5bV9xdWVoZWFkICplbGVtID0gaGVhZC0+Ymxpbms7CisKKwlpZiAoZWxlbSAhPSBoZWFkKQorCQlfX3N5bV9xdWVfZGVsKGVsZW0tPmJsaW5rLCBoZWFkKTsKKwllbHNlCisJCWVsZW0gPSAwOworCXJldHVybiBlbGVtOworfQorCisvKgorICogIFRoaXMgb25lIG1heSBiZSB1c2VmdWwuCisgKi8KKyNkZWZpbmUgRk9SX0VBQ0hfUVVFVUVEX0VMRU1FTlQoaGVhZCwgcXApIFwKKwlmb3IgKHFwID0gKGhlYWQpLT5mbGluazsgcXAgIT0gKGhlYWQpOyBxcCA9IHFwLT5mbGluaykKKy8qCisgKiAgRnJlZUJTRCBkb2VzIG5vdCBvZmZlciBvdXIga2luZCBvZiBxdWV1ZSBpbiB0aGUgQ0FNIENDQi4KKyAqICBTbywgd2UgaGF2ZSB0byBjYXN0LgorICovCisjZGVmaW5lIHN5bV9xcHRyKHApCSgoc3RydWN0IHN5bV9xdWVoZWFkICopIChwKSkKKworLyoKKyAqICBTaW1wbGUgYml0bWFwIG9wZXJhdGlvbnMuCisgKi8gCisjZGVmaW5lIHN5bV9zZXRfYml0KHAsIG4pCSgoKHUzMiAqKShwKSlbKG4pPj41XSB8PSAgKDE8PCgobikmMHgxZikpKQorI2RlZmluZSBzeW1fY2xyX2JpdChwLCBuKQkoKCh1MzIgKikocCkpWyhuKT4+NV0gJj0gfigxPDwoKG4pJjB4MWYpKSkKKyNkZWZpbmUgc3ltX2lzX2JpdChwLCBuKQkoKCh1MzIgKikocCkpWyhuKT4+NV0gJiAgICgxPDwoKG4pJjB4MWYpKSkKKworLyoKKyAqIFRoZSBiZWxvdyByb3VuZCB1cC9kb3duIG1hY3JvcyBhcmUgdG8gYmUgdXNlZCB3aXRoIGEgY29uc3RhbnQgCisgKiBhcyBhcmd1bWVudCAoc2l6ZW9mKC4uLikgZm9yIGV4YW1wbGUpLCBmb3IgdGhlIGNvbXBpbGVyIHRvIAorICogb3B0aW1pemUgdGhlIHdob2xlIHRoaW5nLgorICovCisjZGVmaW5lIF9VXyhhLG0pCShhKTw9KDE8PG0pP206CisKKy8qCisgKiBSb3VuZCB1cCBsb2dhcml0aG0gdG8gYmFzZSAyIG9mIGEgMTYgYml0IGNvbnN0YW50LgorICovCisjZGVmaW5lIF9MR1JVMTZfKGEpIFwKKyggXAorIF9VXyhhLCAwKV9VXyhhLCAxKV9VXyhhLCAyKV9VXyhhLCAzKV9VXyhhLCA0KV9VXyhhLCA1KV9VXyhhLCA2KV9VXyhhLCA3KSBcCisgX1VfKGEsIDgpX1VfKGEsIDkpX1VfKGEsMTApX1VfKGEsMTEpX1VfKGEsMTIpX1VfKGEsMTMpX1VfKGEsMTQpX1VfKGEsMTUpIFwKKyAxNikKKworI2VuZGlmIC8qIFNZTV9NSVNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fbnZyYW0uYyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fbnZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcyMWUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9udnJhbS5jCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICogRGV2aWNlIGRyaXZlciBmb3IgdGhlIFNZTUJJT1MvTFNJTE9HSUMgNTNDOFhYIGFuZCA1M0MxMDEwIGZhbWlseSAKKyAqIG9mIFBDSS1TQ1NJIElPIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXggc3ltNTNjOHh4IGRyaXZlci4KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBHZXJhcmQgUm91ZGllcgorICoKKyAqIFRoZSBzeW01M2M4eHggZHJpdmVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgbmNyNTNjOHh4IGRyaXZlciB0aGF0IGhhZCBiZWVuIAorICogYSBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIgdG8gTGludXgtMS4yLjEzLgorICoKKyAqIFRoZSBvcmlnaW5hbCBuY3IgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorICogICAgICAgICBXb2xmZ2FuZyBTdGFuZ2xtZWllciAgICAgICAgPHdvbGZAY29sb2duZS5kZT4KKyAqICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisgKgorICogT3RoZXIgbWFqb3IgY29udHJpYnV0aW9uczoKKyAqCisgKiBOVlJBTSBkZXRlY3Rpb24gYW5kIHJlYWRpbmcuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgUmljaGFyZCBXYWx0aGFtIDxkb3Jtb3VzZUBmYXJzcm9idC5kZW1vbi5jby51az4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJzeW1fZ2x1ZS5oIgorI2luY2x1ZGUgInN5bV9udnJhbS5oIgorCisjaWZkZWYJU1lNX0NPTkZfREVCVUdfTlZSQU0KK3N0YXRpYyB1X2NoYXIgVGVrcmFtX2Jvb3RfZGVsYXlbN10gPSB7MywgNSwgMTAsIDIwLCAzMCwgNjAsIDEyMH07CisjZW5kaWYKKworLyoKKyAqICBHZXQgaG9zdCBzZXR1cCBmcm9tIE5WUkFNLgorICovCit2b2lkIHN5bV9udnJhbV9zZXR1cF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKQoreworCS8qCisJICogIEdldCBwYXJpdHkgY2hlY2tpbmcsIGhvc3QgSUQsIHZlcmJvc2UgbW9kZSAKKwkgKiAgYW5kIG1pc2NlbGxhbmVvdXMgaG9zdCBmbGFncyBmcm9tIE5WUkFNLgorCSAqLworCXN3aXRjaCAobnZyYW0tPnR5cGUpIHsKKwljYXNlIFNZTV9TWU1CSU9TX05WUkFNOgorCQlpZiAoIShudnJhbS0+ZGF0YS5TeW1iaW9zLmZsYWdzICYgU1lNQklPU19QQVJJVFlfRU5BQkxFKSkKKwkJCW5wLT5ydl9zY250bDAgICY9IH4weDBhOworCQlucC0+bXlhZGRyID0gbnZyYW0tPmRhdGEuU3ltYmlvcy5ob3N0X2lkICYgMHgwZjsKKwkJaWYgKG52cmFtLT5kYXRhLlN5bWJpb3MuZmxhZ3MgJiBTWU1CSU9TX1ZFUkJPU0VfTVNHUykKKwkJCW5wLT52ZXJib3NlICs9IDE7CisJCWlmIChudnJhbS0+ZGF0YS5TeW1iaW9zLmZsYWdzMSAmIFNZTUJJT1NfU0NBTl9ISV9MTykKKwkJCXNob3N0LT5yZXZlcnNlX29yZGVyaW5nID0gMTsKKwkJaWYgKG52cmFtLT5kYXRhLlN5bWJpb3MuZmxhZ3MyICYgU1lNQklPU19BVk9JRF9CVVNfUkVTRVQpCisJCQlucC0+dXNyZmxhZ3MgfD0gU1lNX0FWT0lEX0JVU19SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBTWU1fVEVLUkFNX05WUkFNOgorCQlucC0+bXlhZGRyID0gbnZyYW0tPmRhdGEuVGVrcmFtLmhvc3RfaWQgJiAweDBmOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfUEFSSVNDCisJY2FzZSBTWU1fUEFSSVNDX1BEQzoKKwkJaWYgKG52cmFtLT5kYXRhLnBhcmlzYy5ob3N0X2lkICE9IC0xKQorCQkJbnAtPm15YWRkciA9IG52cmFtLT5kYXRhLnBhcmlzYy5ob3N0X2lkOworCQlpZiAobnZyYW0tPmRhdGEucGFyaXNjLmZhY3RvciAhPSAtMSkKKwkJCW5wLT5taW5zeW5jID0gbnZyYW0tPmRhdGEucGFyaXNjLmZhY3RvcjsKKwkJaWYgKG52cmFtLT5kYXRhLnBhcmlzYy53aWR0aCAhPSAtMSkKKwkJCW5wLT5tYXh3aWRlID0gbnZyYW0tPmRhdGEucGFyaXNjLndpZHRoOworCQlzd2l0Y2ggKG52cmFtLT5kYXRhLnBhcmlzYy5tb2RlKSB7CisJCQljYXNlIDA6IG5wLT5zY3NpX21vZGUgPSBTTU9ERV9TRTsgYnJlYWs7CisJCQljYXNlIDE6IG5wLT5zY3NpX21vZGUgPSBTTU9ERV9IVkQ7IGJyZWFrOworCQkJY2FzZSAyOiBucC0+c2NzaV9tb2RlID0gU01PREVfTFZEOyBicmVhazsKKwkJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisjZW5kaWYKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiAgR2V0IHRhcmdldCBzZXQtdXAgZnJvbSBTeW1iaW9zIGZvcm1hdCBOVlJBTS4KKyAqLworc3RhdGljIHZvaWQKK3N5bV9TeW1iaW9zX3NldHVwX3RhcmdldChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQsIFN5bWJpb3NfbnZyYW0gKm52cmFtKQoreworCXN0cnVjdCBzeW1fdGNiICp0cCA9ICZucC0+dGFyZ2V0W3RhcmdldF07CisJU3ltYmlvc190YXJnZXQgKnRuID0gJm52cmFtLT50YXJnZXRbdGFyZ2V0XTsKKworCXRwLT51c3J0YWdzID0KKwkJKHRuLT5mbGFncyAmIFNZTUJJT1NfUVVFVUVfVEFHU19FTkFCTEVEKT8gU1lNX1NFVFVQX01BWF9UQUcgOiAwOworCisJaWYgKCEodG4tPmZsYWdzICYgU1lNQklPU19ESVNDT05ORUNUX0VOQUJMRSkpCisJCXRwLT51c3JmbGFncyAmPSB+U1lNX0RJU0NfRU5BQkxFRDsKKwlpZiAoISh0bi0+ZmxhZ3MgJiBTWU1CSU9TX1NDQU5fQVRfQk9PVF9USU1FKSkKKwkJdHAtPnVzcmZsYWdzIHw9IFNZTV9TQ0FOX0JPT1RfRElTQUJMRUQ7CisJaWYgKCEodG4tPmZsYWdzICYgU1lNQklPU19TQ0FOX0xVTlMpKQorCQl0cC0+dXNyZmxhZ3MgfD0gU1lNX1NDQU5fTFVOU19ESVNBQkxFRDsKK30KKworLyoKKyAqICBHZXQgdGFyZ2V0IHNldC11cCBmcm9tIFRla3JhbSBmb3JtYXQgTlZSQU0uCisgKi8KK3N0YXRpYyB2b2lkCitzeW1fVGVrcmFtX3NldHVwX3RhcmdldChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQsIFRla3JhbV9udnJhbSAqbnZyYW0pCit7CisJc3RydWN0IHN5bV90Y2IgKnRwID0gJm5wLT50YXJnZXRbdGFyZ2V0XTsKKwlzdHJ1Y3QgVGVrcmFtX3RhcmdldCAqdG4gPSAmbnZyYW0tPnRhcmdldFt0YXJnZXRdOworCisJaWYgKHRuLT5mbGFncyAmIFRFS1JBTV9UQUdHRURfQ09NTUFORFMpIHsKKwkJdHAtPnVzcnRhZ3MgPSAyIDw8IG52cmFtLT5tYXhfdGFnc19pbmRleDsKKwl9CisKKwlpZiAodG4tPmZsYWdzICYgVEVLUkFNX0RJU0NPTk5FQ1RfRU5BQkxFKQorCQl0cC0+dXNyZmxhZ3MgfD0gU1lNX0RJU0NfRU5BQkxFRDsKKyAKKwkvKiBJZiBhbnkgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgcGFyaXR5LCB3ZSB3aWxsIG5vdCB1c2UgdGhpcyBvcHRpb24gKi8KKwlpZiAoISh0bi0+ZmxhZ3MgJiBURUtSQU1fUEFSSVRZX0NIRUNLKSkKKwkJbnAtPnJ2X3NjbnRsMCAgJj0gfjB4MGE7IC8qIFNDU0kgcGFyaXR5IGNoZWNraW5nIGRpc2FibGVkICovCit9CisKKy8qCisgKiAgR2V0IHRhcmdldCBzZXR1cCBmcm9tIE5WUkFNLgorICovCit2b2lkIHN5bV9udnJhbV9zZXR1cF90YXJnZXQoc3RydWN0IHN5bV9oY2IgKm5wLCBpbnQgdGFyZ2V0LCBzdHJ1Y3Qgc3ltX252cmFtICpudnApCit7CisJc3dpdGNoIChudnAtPnR5cGUpIHsKKwljYXNlIFNZTV9TWU1CSU9TX05WUkFNOgorCQlzeW1fU3ltYmlvc19zZXR1cF90YXJnZXQobnAsIHRhcmdldCwgJm52cC0+ZGF0YS5TeW1iaW9zKTsKKwkJYnJlYWs7CisJY2FzZSBTWU1fVEVLUkFNX05WUkFNOgorCQlzeW1fVGVrcmFtX3NldHVwX3RhcmdldChucCwgdGFyZ2V0LCAmbnZwLT5kYXRhLlRla3JhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworI2lmZGVmCVNZTV9DT05GX0RFQlVHX05WUkFNCisvKgorICogIER1bXAgU3ltYmlvcyBmb3JtYXQgTlZSQU0gZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgorICovCitzdGF0aWMgdm9pZCBzeW1fZGlzcGxheV9TeW1iaW9zX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgU3ltYmlvc19udnJhbSAqbnZyYW0pCit7CisJaW50IGk7CisKKwkvKiBkaXNwbGF5IFN5bWJpb3MgbnZyYW0gaG9zdCBkYXRhICovCisJcHJpbnRmKCIlczogSE9TVCBJRD0lZCVzJXMlcyVzJXMlc1xuIiwKKwkJc3ltX25hbWUobnApLCBudnJhbS0+aG9zdF9pZCAmIDB4MGYsCisJCShudnJhbS0+ZmxhZ3MgICYgU1lNQklPU19TQ0FNX0VOQUJMRSkJPyAiIFNDQU0iCToiIiwKKwkJKG52cmFtLT5mbGFncyAgJiBTWU1CSU9TX1BBUklUWV9FTkFCTEUpCT8gIiBQQVJJVFkiCToiIiwKKwkJKG52cmFtLT5mbGFncyAgJiBTWU1CSU9TX1ZFUkJPU0VfTVNHUykJPyAiIFZFUkJPU0UiCToiIiwgCisJCShudnJhbS0+ZmxhZ3MgICYgU1lNQklPU19DSFNfTUFQUElORykJPyAiIENIU19BTFQiCToiIiwgCisJCShudnJhbS0+ZmxhZ3MyICYgU1lNQklPU19BVk9JRF9CVVNfUkVTRVQpPyIgTk9fUkVTRVQiCToiIiwKKwkJKG52cmFtLT5mbGFnczEgJiBTWU1CSU9TX1NDQU5fSElfTE8pCT8gIiBISV9MTyIJOiIiKTsKKworCS8qIGRpc3BsYXkgU3ltYmlvcyBudnJhbSBkcml2ZSBkYXRhICovCisJZm9yIChpID0gMCA7IGkgPCAxNSA7IGkrKykgeworCQlzdHJ1Y3QgU3ltYmlvc190YXJnZXQgKnRuID0gJm52cmFtLT50YXJnZXRbaV07CisJCXByaW50ZigiJXMtJWQ6JXMlcyVzJXMgV0lEVEg9JWQgU1lOQz0lZCBUTU89JWRcbiIsCisJCXN5bV9uYW1lKG5wKSwgaSwKKwkJKHRuLT5mbGFncyAmIFNZTUJJT1NfRElTQ09OTkVDVF9FTkFCTEUpCT8gIiBESVNDIgk6ICIiLAorCQkodG4tPmZsYWdzICYgU1lNQklPU19TQ0FOX0FUX0JPT1RfVElNRSkJPyAiIFNDQU5fQk9PVCIJOiAiIiwKKwkJKHRuLT5mbGFncyAmIFNZTUJJT1NfU0NBTl9MVU5TKQkJPyAiIFNDQU5fTFVOUyIJOiAiIiwKKwkJKHRuLT5mbGFncyAmIFNZTUJJT1NfUVVFVUVfVEFHU19FTkFCTEVEKT8gIiBUQ1EiCTogIiIsCisJCXRuLT5idXNfd2lkdGgsCisJCXRuLT5zeW5jX3BlcmlvZCAvIDQsCisJCXRuLT50aW1lb3V0KTsKKwl9Cit9CisKKy8qCisgKiAgRHVtcCBURUtSQU0gZm9ybWF0IE5WUkFNIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KKyAqLworc3RhdGljIHZvaWQgc3ltX2Rpc3BsYXlfVGVrcmFtX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgVGVrcmFtX252cmFtICpudnJhbSkKK3sKKwlpbnQgaSwgdGFncywgYm9vdF9kZWxheTsKKwljaGFyICpyZW07CisKKwkvKiBkaXNwbGF5IFRla3JhbSBudnJhbSBob3N0IGRhdGEgKi8KKwl0YWdzID0gMiA8PCBudnJhbS0+bWF4X3RhZ3NfaW5kZXg7CisJYm9vdF9kZWxheSA9IDA7CisJaWYgKG52cmFtLT5ib290X2RlbGF5X2luZGV4IDwgNikKKwkJYm9vdF9kZWxheSA9IFRla3JhbV9ib290X2RlbGF5W252cmFtLT5ib290X2RlbGF5X2luZGV4XTsKKwlzd2l0Y2ggKChudnJhbS0+ZmxhZ3MgJiBURUtSQU1fUkVNT1ZBQkxFX0ZMQUdTKSA+PiA2KSB7CisJZGVmYXVsdDoKKwljYXNlIDA6CXJlbSA9ICIiOwkJCWJyZWFrOworCWNhc2UgMTogcmVtID0gIiBSRU1PVkFCTEU9Ym9vdCBkZXZpY2UiOwlicmVhazsKKwljYXNlIDI6IHJlbSA9ICIgUkVNT1ZBQkxFPWFsbCI7CQlicmVhazsKKwl9CisKKwlwcmludGYoIiVzOiBIT1NUIElEPSVkJXMlcyVzJXMlcyVzJXMlcyVzIEJPT1QgREVMQVk9JWQgdGFncz0lZFxuIiwKKwkJc3ltX25hbWUobnApLCBudnJhbS0+aG9zdF9pZCAmIDB4MGYsCisJCShudnJhbS0+ZmxhZ3MxICYgU1lNQklPU19TQ0FNX0VOQUJMRSkJPyAiIFNDQU0iCToiIiwKKwkJKG52cmFtLT5mbGFncyAmIFRFS1JBTV9NT1JFX1RIQU5fMl9EUklWRVMpID8gIiA+MkRSSVZFUyI6IiIsCisJCShudnJhbS0+ZmxhZ3MgJiBURUtSQU1fRFJJVkVTX1NVUF8xR0IpCT8gIiA+MUdCIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MgJiBURUtSQU1fUkVTRVRfT05fUE9XRVJfT04pID8gIiBSRVNFVCIJOiIiLAorCQkobnZyYW0tPmZsYWdzICYgVEVLUkFNX0FDVElWRV9ORUdBVElPTikJPyAiIEFDVF9ORUciCToiIiwKKwkJKG52cmFtLT5mbGFncyAmIFRFS1JBTV9JTU1FRElBVEVfU0VFSykJPyAiIElNTV9TRUVLIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MgJiBURUtSQU1fU0NBTl9MVU5TKQk/ICIgU0NBTl9MVU5TIgk6IiIsCisJCShudnJhbS0+ZmxhZ3MxICYgVEVLUkFNX0YyX0Y2X0VOQUJMRUQpCT8gIiBGMl9GNiIJOiIiLAorCQlyZW0sIGJvb3RfZGVsYXksIHRhZ3MpOworCisJLyogZGlzcGxheSBUZWtyYW0gbnZyYW0gZHJpdmUgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgeworCQlpbnQgc3luYywgajsKKwkJc3RydWN0IFRla3JhbV90YXJnZXQgKnRuID0gJm52cmFtLT50YXJnZXRbaV07CisJCWogPSB0bi0+c3luY19pbmRleCAmIDB4ZjsKKwkJc3luYyA9IFRla3JhbV9zeW5jW2pdOworCQlwcmludGYoIiVzLSVkOiVzJXMlcyVzJXMlcyBQRVJJT0Q9JWRcbiIsCisJCXN5bV9uYW1lKG5wKSwgaSwKKwkJKHRuLT5mbGFncyAmIFRFS1JBTV9QQVJJVFlfQ0hFQ0spCT8gIiBQQVJJVFkiCTogIiIsCisJCSh0bi0+ZmxhZ3MgJiBURUtSQU1fU1lOQ19ORUdPKQkJPyAiIFNZTkMiCTogIiIsCisJCSh0bi0+ZmxhZ3MgJiBURUtSQU1fRElTQ09OTkVDVF9FTkFCTEUpCT8gIiBESVNDIgk6ICIiLAorCQkodG4tPmZsYWdzICYgVEVLUkFNX1NUQVJUX0NNRCkJCT8gIiBTVEFSVCIJOiAiIiwKKwkJKHRuLT5mbGFncyAmIFRFS1JBTV9UQUdHRURfQ09NTUFORFMpCT8gIiBUQ1EiCTogIiIsCisJCSh0bi0+ZmxhZ3MgJiBURUtSQU1fV0lERV9ORUdPKQkJPyAiIFdJREUiCTogIiIsCisJCXN5bmMpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzeW1fZGlzcGxheV9TeW1iaW9zX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgU3ltYmlvc19udnJhbSAqbnZyYW0pIHsgKHZvaWQpbnA7ICh2b2lkKW52cmFtOyB9CitzdGF0aWMgdm9pZCBzeW1fZGlzcGxheV9UZWtyYW1fbnZyYW0oc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBUZWtyYW1fbnZyYW0gKm52cmFtKSB7ICh2b2lkKW5wOyAodm9pZCludnJhbTsgfQorI2VuZGlmCS8qIFNZTV9DT05GX0RFQlVHX05WUkFNICovCisKKworLyoKKyAqICAyNEMxNiBFRVBST00gcmVhZGluZy4KKyAqCisgKiAgR1BPSTAgLSBkYXRhIGluL2RhdGEgb3V0CisgKiAgR1BJTzEgLSBjbG9jaworICogIFN5bWJpb3MgTlZSQU0gd2lyaW5nIG5vdyBhbHNvIHVzZWQgYnkgVGVrcmFtLgorICovCisKKyNkZWZpbmUgU0VUX0JJVCAwCisjZGVmaW5lIENMUl9CSVQgMQorI2RlZmluZSBTRVRfQ0xLIDIKKyNkZWZpbmUgQ0xSX0NMSyAzCisKKy8qCisgKiAgU2V0L2NsZWFyIGRhdGEvY2xvY2sgYml0IGluIEdQSU8wCisgKi8KK3N0YXRpYyB2b2lkIFMyNEMxNl9zZXRfYml0KHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9jaGFyIHdyaXRlX2JpdCwgdV9jaGFyICpncHJlZywgCisJCQkgIGludCBiaXRfbW9kZSkKK3sKKwl1ZGVsYXkoNSk7CisJc3dpdGNoIChiaXRfbW9kZSkgeworCWNhc2UgU0VUX0JJVDoKKwkJKmdwcmVnIHw9IHdyaXRlX2JpdDsKKwkJYnJlYWs7CisJY2FzZSBDTFJfQklUOgorCQkqZ3ByZWcgJj0gMHhmZTsKKwkJYnJlYWs7CisJY2FzZSBTRVRfQ0xLOgorCQkqZ3ByZWcgfD0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBDTFJfQ0xLOgorCQkqZ3ByZWcgJj0gMHhmZDsKKwkJYnJlYWs7CisKKwl9CisJT1VUQihucCwgbmNfZ3ByZWcsICpncHJlZyk7CisJdWRlbGF5KDUpOworfQorCisvKgorICogIFNlbmQgU1RBUlQgY29uZGl0aW9uIHRvIE5WUkFNIHRvIHdha2UgaXQgdXAuCisgKi8KK3N0YXRpYyB2b2lkIFMyNEMxNl9zdGFydChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqZ3ByZWcpCit7CisJUzI0QzE2X3NldF9iaXQobnAsIDEsIGdwcmVnLCBTRVRfQklUKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgZ3ByZWcsIFNFVF9DTEspOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCBncHJlZywgQ0xSX0JJVCk7CisJUzI0QzE2X3NldF9iaXQobnAsIDAsIGdwcmVnLCBDTFJfQ0xLKTsKK30KKworLyoKKyAqICBTZW5kIFNUT1AgY29uZGl0aW9uIHRvIE5WUkFNIC0gcHV0cyBOVlJBTSB0byBzbGVlcC4uLiBaWnp6enohIQorICovCitzdGF0aWMgdm9pZCBTMjRDMTZfc3RvcChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqZ3ByZWcpCit7CisJUzI0QzE2X3NldF9iaXQobnAsIDAsIGdwcmVnLCBTRVRfQ0xLKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMSwgZ3ByZWcsIFNFVF9CSVQpOworfQorCisvKgorICogIFJlYWQgb3Igd3JpdGUgYSBiaXQgdG8gdGhlIE5WUkFNLAorICogIHJlYWQgaWYgR1BJTzAgaW5wdXQgZWxzZSB3cml0ZSBpZiBHUElPMCBvdXRwdXQKKyAqLworc3RhdGljIHZvaWQgUzI0QzE2X2RvX2JpdChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqcmVhZF9iaXQsIHVfY2hhciB3cml0ZV9iaXQsIAorCQkJIHVfY2hhciAqZ3ByZWcpCit7CisJUzI0QzE2X3NldF9iaXQobnAsIHdyaXRlX2JpdCwgZ3ByZWcsIFNFVF9CSVQpOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCBncHJlZywgU0VUX0NMSyk7CisJaWYgKHJlYWRfYml0KQorCQkqcmVhZF9iaXQgPSBJTkIobnAsIG5jX2dwcmVnKTsKKwlTMjRDMTZfc2V0X2JpdChucCwgMCwgZ3ByZWcsIENMUl9DTEspOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCBncHJlZywgQ0xSX0JJVCk7Cit9CisKKy8qCisgKiAgT3V0cHV0IGFuIEFDSyB0byB0aGUgTlZSQU0gYWZ0ZXIgcmVhZGluZywKKyAqICBjaGFuZ2UgR1BJTzAgdG8gb3V0cHV0IGFuZCB3aGVuIGRvbmUgYmFjayB0byBhbiBpbnB1dAorICovCitzdGF0aWMgdm9pZCBTMjRDMTZfd3JpdGVfYWNrKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9jaGFyIHdyaXRlX2JpdCwgdV9jaGFyICpncHJlZywgCisJCQkgICAgdV9jaGFyICpncGNudGwpCit7CisJT1VUQihucCwgbmNfZ3BjbnRsLCAqZ3BjbnRsICYgMHhmZSk7CisJUzI0QzE2X2RvX2JpdChucCwgTlVMTCwgd3JpdGVfYml0LCBncHJlZyk7CisJT1VUQihucCwgbmNfZ3BjbnRsLCAqZ3BjbnRsKTsKK30KKworLyoKKyAqICBJbnB1dCBhbiBBQ0sgZnJvbSBOVlJBTSBhZnRlciB3cml0aW5nLAorICogIGNoYW5nZSBHUElPMCB0byBpbnB1dCBhbmQgd2hlbiBkb25lIGJhY2sgdG8gYW4gb3V0cHV0CisgKi8KK3N0YXRpYyB2b2lkIFMyNEMxNl9yZWFkX2FjayhzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqcmVhZF9iaXQsIHVfY2hhciAqZ3ByZWcsIAorCQkJICAgdV9jaGFyICpncGNudGwpCit7CisJT1VUQihucCwgbmNfZ3BjbnRsLCAqZ3BjbnRsIHwgMHgwMSk7CisJUzI0QzE2X2RvX2JpdChucCwgcmVhZF9iaXQsIDEsIGdwcmVnKTsKKwlPVVRCKG5wLCBuY19ncGNudGwsICpncGNudGwpOworfQorCisvKgorICogIFdSSVRFIGEgYnl0ZSB0byB0aGUgTlZSQU0gYW5kIHRoZW4gZ2V0IGFuIEFDSyB0byBzZWUgaXQgd2FzIGFjY2VwdGVkIE9LLAorICogIEdQSU8wIG11c3QgYWxyZWFkeSBiZSBzZXQgYXMgYW4gb3V0cHV0CisgKi8KK3N0YXRpYyB2b2lkIFMyNEMxNl93cml0ZV9ieXRlKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9jaGFyICphY2tfZGF0YSwgdV9jaGFyIHdyaXRlX2RhdGEsIAorCQkJICAgICB1X2NoYXIgKmdwcmVnLCB1X2NoYXIgKmdwY250bCkKK3sKKwlpbnQgeDsKKwkKKwlmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorCQlTMjRDMTZfZG9fYml0KG5wLCBOVUxMLCAod3JpdGVfZGF0YSA+PiAoNyAtIHgpKSAmIDB4MDEsIGdwcmVnKTsKKwkJCisJUzI0QzE2X3JlYWRfYWNrKG5wLCBhY2tfZGF0YSwgZ3ByZWcsIGdwY250bCk7Cit9CisKKy8qCisgKiAgUkVBRCBhIGJ5dGUgZnJvbSB0aGUgTlZSQU0gYW5kIHRoZW4gc2VuZCBhbiBBQ0sgdG8gc2F5IHdlIGhhdmUgZ290IGl0LAorICogIEdQSU8wIG11c3QgYWxyZWFkeSBiZSBzZXQgYXMgYW4gaW5wdXQKKyAqLworc3RhdGljIHZvaWQgUzI0QzE2X3JlYWRfYnl0ZShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqcmVhZF9kYXRhLCB1X2NoYXIgYWNrX2RhdGEsIAorCQkJICAgIHVfY2hhciAqZ3ByZWcsIHVfY2hhciAqZ3BjbnRsKQoreworCWludCB4OworCXVfY2hhciByZWFkX2JpdDsKKworCSpyZWFkX2RhdGEgPSAwOworCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJUzI0QzE2X2RvX2JpdChucCwgJnJlYWRfYml0LCAxLCBncHJlZyk7CisJCSpyZWFkX2RhdGEgfD0gKChyZWFkX2JpdCAmIDB4MDEpIDw8ICg3IC0geCkpOworCX0KKworCVMyNEMxNl93cml0ZV9hY2sobnAsIGFja19kYXRhLCBncHJlZywgZ3BjbnRsKTsKK30KKworI2lmIFNZTV9DT05GX05WUkFNX1dSSVRFX1NVUFBPUlQKKy8qCisgKiAgV3JpdGUgJ2xlbicgYnl0ZXMgc3RhcnRpbmcgYXQgJ29mZnNldCcuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3dyaXRlX1MyNEMxNl9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIGludCBvZmZzZXQsCisJCXVfY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1X2NoYXIJZ3BjbnRsLCBncHJlZzsKKwl1X2NoYXIJb2xkX2dwY250bCwgb2xkX2dwcmVnOworCXVfY2hhcglhY2tfZGF0YTsKKwlpbnQJeDsKKworCS8qIHNhdmUgY3VycmVudCBzdGF0ZSBvZiBHUENOVEwgYW5kIEdQUkVHICovCisJb2xkX2dwcmVnCT0gSU5CKG5wLCBuY19ncHJlZyk7CisJb2xkX2dwY250bAk9IElOQihucCwgbmNfZ3BjbnRsKTsKKwlncGNudGwJCT0gb2xkX2dwY250bCAmIDB4MWM7CisKKwkvKiBzZXQgdXAgR1BSRUcgJiBHUENOVEwgdG8gc2V0IEdQSU8wIGFuZCBHUElPMSBpbiB0byBrbm93biBzdGF0ZSAqLworCU9VVEIobnAsIG5jX2dwcmVnLCAgb2xkX2dwcmVnKTsKKwlPVVRCKG5wLCBuY19ncGNudGwsIGdwY250bCk7CisKKwkvKiB0aGlzIGlzIHRvIHNldCBOVlJBTSBpbnRvIGEga25vd24gc3RhdGUgd2l0aCBHUElPMC8xIGJvdGggbG93ICovCisJZ3ByZWcgPSBvbGRfZ3ByZWc7CisJUzI0QzE2X3NldF9iaXQobnAsIDAsICZncHJlZywgQ0xSX0NMSyk7CisJUzI0QzE2X3NldF9iaXQobnAsIDAsICZncHJlZywgQ0xSX0JJVCk7CisJCQorCS8qIG5vdyBzZXQgTlZSQU0gaW5hY3RpdmUgd2l0aCBHUElPMC8xIGJvdGggaGlnaCAqLworCVMyNEMxNl9zdG9wKG5wLCAmZ3ByZWcpOworCisJLyogTlZSQU0gaGFzIHRvIGJlIHdyaXR0ZW4gaW4gc2VnbWVudHMgb2YgMTYgYnl0ZXMgKi8KKwlmb3IgKHggPSAwOyB4IDwgbGVuIDsgeCArPSAxNikgeworCQlkbyB7CisJCQlTMjRDMTZfc3RhcnQobnAsICZncHJlZyk7CisJCQlTMjRDMTZfd3JpdGVfYnl0ZShucCwgJmFja19kYXRhLAorCQkJCQkgIDB4YTAgfCAoKChvZmZzZXQreCkgPj4gNykgJiAweDBlKSwKKwkJCQkJICAmZ3ByZWcsICZncGNudGwpOworCQl9IHdoaWxlIChhY2tfZGF0YSAmIDB4MDEpOworCisJCVMyNEMxNl93cml0ZV9ieXRlKG5wLCAmYWNrX2RhdGEsIChvZmZzZXQreCkgJiAweGZmLCAKKwkJCQkgICZncHJlZywgJmdwY250bCk7CisKKwkJZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspCisJCQlTMjRDMTZfd3JpdGVfYnl0ZShucCwgJmFja19kYXRhLCBkYXRhW3greV0sIAorCQkJCQkgICZncHJlZywgJmdwY250bCk7CisJCVMyNEMxNl9zdG9wKG5wLCAmZ3ByZWcpOworCX0KKworCS8qIHJldHVybiBHUElPMC8xIHRvIG9yaWdpbmFsIHN0YXRlcyBhZnRlciBoYXZpbmcgYWNjZXNzZWQgTlZSQU0gKi8KKwlPVVRCKG5wLCBuY19ncGNudGwsIG9sZF9ncGNudGwpOworCU9VVEIobnAsIG5jX2dwcmVnLCAgb2xkX2dwcmVnKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIFNZTV9DT05GX05WUkFNX1dSSVRFX1NVUFBPUlQgKi8KKworLyoKKyAqICBSZWFkICdsZW4nIGJ5dGVzIHN0YXJ0aW5nIGF0ICdvZmZzZXQnLgorICovCitzdGF0aWMgaW50IHN5bV9yZWFkX1MyNEMxNl9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIGludCBvZmZzZXQsIHVfY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1X2NoYXIJZ3BjbnRsLCBncHJlZzsKKwl1X2NoYXIJb2xkX2dwY250bCwgb2xkX2dwcmVnOworCXVfY2hhcglhY2tfZGF0YTsKKwlpbnQJcmV0diA9IDE7CisJaW50CXg7CisKKwkvKiBzYXZlIGN1cnJlbnQgc3RhdGUgb2YgR1BDTlRMIGFuZCBHUFJFRyAqLworCW9sZF9ncHJlZwk9IElOQihucCwgbmNfZ3ByZWcpOworCW9sZF9ncGNudGwJPSBJTkIobnAsIG5jX2dwY250bCk7CisJZ3BjbnRsCQk9IG9sZF9ncGNudGwgJiAweDFjOworCisJLyogc2V0IHVwIEdQUkVHICYgR1BDTlRMIHRvIHNldCBHUElPMCBhbmQgR1BJTzEgaW4gdG8ga25vd24gc3RhdGUgKi8KKwlPVVRCKG5wLCBuY19ncHJlZywgIG9sZF9ncHJlZyk7CisJT1VUQihucCwgbmNfZ3BjbnRsLCBncGNudGwpOworCisJLyogdGhpcyBpcyB0byBzZXQgTlZSQU0gaW50byBhIGtub3duIHN0YXRlIHdpdGggR1BJTzAvMSBib3RoIGxvdyAqLworCWdwcmVnID0gb2xkX2dwcmVnOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCAmZ3ByZWcsIENMUl9DTEspOworCVMyNEMxNl9zZXRfYml0KG5wLCAwLCAmZ3ByZWcsIENMUl9CSVQpOworCQkKKwkvKiBub3cgc2V0IE5WUkFNIGluYWN0aXZlIHdpdGggR1BJTzAvMSBib3RoIGhpZ2ggKi8KKwlTMjRDMTZfc3RvcChucCwgJmdwcmVnKTsKKwkKKwkvKiBhY3RpdmF0ZSBOVlJBTSAqLworCVMyNEMxNl9zdGFydChucCwgJmdwcmVnKTsKKworCS8qIHdyaXRlIGRldmljZSBjb2RlIGFuZCByYW5kb20gYWRkcmVzcyBNU0IgKi8KKwlTMjRDMTZfd3JpdGVfYnl0ZShucCwgJmFja19kYXRhLAorCQkweGEwIHwgKChvZmZzZXQgPj4gNykgJiAweDBlKSwgJmdwcmVnLCAmZ3BjbnRsKTsKKwlpZiAoYWNrX2RhdGEgJiAweDAxKQorCQlnb3RvIG91dDsKKworCS8qIHdyaXRlIHJhbmRvbSBhZGRyZXNzIExTQiAqLworCVMyNEMxNl93cml0ZV9ieXRlKG5wLCAmYWNrX2RhdGEsCisJCW9mZnNldCAmIDB4ZmYsICZncHJlZywgJmdwY250bCk7CisJaWYgKGFja19kYXRhICYgMHgwMSkKKwkJZ290byBvdXQ7CisKKwkvKiByZWdlbmVyYXRlIFNUQVJUIHN0YXRlIHRvIHNldCB1cCBmb3IgcmVhZGluZyAqLworCVMyNEMxNl9zdGFydChucCwgJmdwcmVnKTsKKwkKKwkvKiByZXdyaXRlIGRldmljZSBjb2RlIGFuZCBhZGRyZXNzIE1TQiB3aXRoIHJlYWQgYml0IHNldCAobHNiID0gMHgwMSkgKi8KKwlTMjRDMTZfd3JpdGVfYnl0ZShucCwgJmFja19kYXRhLAorCQkweGExIHwgKChvZmZzZXQgPj4gNykgJiAweDBlKSwgJmdwcmVnLCAmZ3BjbnRsKTsKKwlpZiAoYWNrX2RhdGEgJiAweDAxKQorCQlnb3RvIG91dDsKKworCS8qIG5vdyBzZXQgdXAgR1BJTzAgZm9yIGlucHV0dGluZyBkYXRhICovCisJZ3BjbnRsIHw9IDB4MDE7CisJT1VUQihucCwgbmNfZ3BjbnRsLCBncGNudGwpOworCQkKKwkvKiBpbnB1dCBhbGwgcmVxdWVzdGVkIGRhdGEgLSBvbmx5IHBhcnQgb2YgdG90YWwgTlZSQU0gKi8KKwlmb3IgKHggPSAwOyB4IDwgbGVuOyB4KyspIAorCQlTMjRDMTZfcmVhZF9ieXRlKG5wLCAmZGF0YVt4XSwgKHggPT0gKGxlbi0xKSksICZncHJlZywgJmdwY250bCk7CisKKwkvKiBmaW5hbGx5IHB1dCBOVlJBTSBiYWNrIGluIGluYWN0aXZlIG1vZGUgKi8KKwlncGNudGwgJj0gMHhmZTsKKwlPVVRCKG5wLCBuY19ncGNudGwsIGdwY250bCk7CisJUzI0QzE2X3N0b3AobnAsICZncHJlZyk7CisJcmV0diA9IDA7CitvdXQ6CisJLyogcmV0dXJuIEdQSU8wLzEgdG8gb3JpZ2luYWwgc3RhdGVzIGFmdGVyIGhhdmluZyBhY2Nlc3NlZCBOVlJBTSAqLworCU9VVEIobnAsIG5jX2dwY250bCwgb2xkX2dwY250bCk7CisJT1VUQihucCwgbmNfZ3ByZWcsICBvbGRfZ3ByZWcpOworCisJcmV0dXJuIHJldHY7Cit9CisKKyN1bmRlZiBTRVRfQklUCisjdW5kZWYgQ0xSX0JJVAorI3VuZGVmIFNFVF9DTEsKKyN1bmRlZiBDTFJfQ0xLCisKKy8qCisgKiAgVHJ5IHJlYWRpbmcgU3ltYmlvcyBOVlJBTS4KKyAqICBSZXR1cm4gMCBpZiBPSy4KKyAqLworc3RhdGljIGludCBzeW1fcmVhZF9TeW1iaW9zX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgU3ltYmlvc19udnJhbSAqbnZyYW0pCit7CisJc3RhdGljIHVfY2hhciBTeW1iaW9zX3RyYWlsZXJbNl0gPSB7MHhmZSwgMHhmZSwgMCwgMCwgMCwgMH07CisJdV9jaGFyICpkYXRhID0gKHVfY2hhciAqKSBudnJhbTsKKwlpbnQgbGVuICA9IHNpemVvZigqbnZyYW0pOworCXVfc2hvcnQJY3N1bTsKKwlpbnQgeDsKKworCS8qIHByb2JlIHRoZSAyNGMxNiBhbmQgcmVhZCB0aGUgU1lNQklPUyAyNGMxNiBhcmVhICovCisJaWYgKHN5bV9yZWFkX1MyNEMxNl9udnJhbSAobnAsIFNZTUJJT1NfTlZSQU1fQUREUkVTUywgZGF0YSwgbGVuKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBjaGVjayB2YWxpZCBOVlJBTSBzaWduYXR1cmUsIHZlcmlmeSBieXRlIGNvdW50IGFuZCBjaGVja3N1bSAqLworCWlmIChudnJhbS0+dHlwZSAhPSAwIHx8CisJICAgIG1lbWNtcChudnJhbS0+dHJhaWxlciwgU3ltYmlvc190cmFpbGVyLCA2KSB8fAorCSAgICBudnJhbS0+Ynl0ZV9jb3VudCAhPSBsZW4gLSAxMikKKwkJcmV0dXJuIDE7CisKKwkvKiB2ZXJpZnkgY2hlY2tzdW0gKi8KKwlmb3IgKHggPSA2LCBjc3VtID0gMDsgeCA8IGxlbiAtIDY7IHgrKykKKwkJY3N1bSArPSBkYXRhW3hdOworCWlmIChjc3VtICE9IG52cmFtLT5jaGVja3N1bSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICA5M0M0NiBFRVBST00gcmVhZGluZy4KKyAqCisgKiAgR1BPSTAgLSBkYXRhIGluCisgKiAgR1BJTzEgLSBkYXRhIG91dAorICogIEdQSU8yIC0gY2xvY2sKKyAqICBHUElPNCAtIGNoaXAgc2VsZWN0CisgKgorICogIFVzZWQgYnkgVGVrcmFtLgorICovCisKKy8qCisgKiAgUHVsc2UgY2xvY2sgYml0IGluIEdQSU8wCisgKi8KK3N0YXRpYyB2b2lkIFQ5M0M0Nl9DbGsoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X2NoYXIgKmdwcmVnKQoreworCU9VVEIobnAsIG5jX2dwcmVnLCAqZ3ByZWcgfCAweDA0KTsKKwl1ZGVsYXkoMik7CisJT1VUQihucCwgbmNfZ3ByZWcsICpncHJlZyk7Cit9CisKKy8qIAorICogIFJlYWQgYml0IGZyb20gTlZSQU0KKyAqLworc3RhdGljIHZvaWQgVDkzQzQ2X1JlYWRfQml0KHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9jaGFyICpyZWFkX2JpdCwgdV9jaGFyICpncHJlZykKK3sKKwl1ZGVsYXkoMik7CisJVDkzQzQ2X0NsayhucCwgZ3ByZWcpOworCSpyZWFkX2JpdCA9IElOQihucCwgbmNfZ3ByZWcpOworfQorCisvKgorICogIFdyaXRlIGJpdCB0byBHUElPMAorICovCitzdGF0aWMgdm9pZCBUOTNDNDZfV3JpdGVfQml0KHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdV9jaGFyIHdyaXRlX2JpdCwgdV9jaGFyICpncHJlZykKK3sKKwlpZiAod3JpdGVfYml0ICYgMHgwMSkKKwkJKmdwcmVnIHw9IDB4MDI7CisJZWxzZQorCQkqZ3ByZWcgJj0gMHhmZDsKKwkJCisJKmdwcmVnIHw9IDB4MTA7CisJCQorCU9VVEIobnAsIG5jX2dwcmVnLCAqZ3ByZWcpOworCXVkZWxheSgyKTsKKworCVQ5M0M0Nl9DbGsobnAsIGdwcmVnKTsKK30KKworLyoKKyAqICBTZW5kIFNUT1AgY29uZGl0aW9uIHRvIE5WUkFNIC0gcHV0cyBOVlJBTSB0byBzbGVlcC4uLiBaWlp6enohIQorICovCitzdGF0aWMgdm9pZCBUOTNDNDZfU3RvcChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHVfY2hhciAqZ3ByZWcpCit7CisJKmdwcmVnICY9IDB4ZWY7CisJT1VUQihucCwgbmNfZ3ByZWcsICpncHJlZyk7CisJdWRlbGF5KDIpOworCisJVDkzQzQ2X0NsayhucCwgZ3ByZWcpOworfQorCisvKgorICogIFNlbmQgcmVhZCBjb21tYW5kIGFuZCBhZGRyZXNzIHRvIE5WUkFNCisgKi8KK3N0YXRpYyB2b2lkIFQ5M0M0Nl9TZW5kX0NvbW1hbmQoc3RydWN0IHN5bV9kZXZpY2UgKm5wLCB1X3Nob3J0IHdyaXRlX2RhdGEsIAorCQkJCXVfY2hhciAqcmVhZF9iaXQsIHVfY2hhciAqZ3ByZWcpCit7CisJaW50IHg7CisKKwkvKiBzZW5kIDkgYml0cywgc3RhcnQgYml0ICgxKSwgY29tbWFuZCAoMiksIGFkZHJlc3MgKDYpICAqLworCWZvciAoeCA9IDA7IHggPCA5OyB4KyspCisJCVQ5M0M0Nl9Xcml0ZV9CaXQobnAsICh1X2NoYXIpICh3cml0ZV9kYXRhID4+ICg4IC0geCkpLCBncHJlZyk7CisKKwkqcmVhZF9iaXQgPSBJTkIobnAsIG5jX2dwcmVnKTsKK30KKworLyoKKyAqICBSRUFEIDIgYnl0ZXMgZnJvbSB0aGUgTlZSQU0KKyAqLworc3RhdGljIHZvaWQgVDkzQzQ2X1JlYWRfV29yZChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsCisJCXVuc2lnbmVkIHNob3J0ICpudnJhbV9kYXRhLCB1bnNpZ25lZCBjaGFyICpncHJlZykKK3sKKwlpbnQgeDsKKwl1X2NoYXIgcmVhZF9iaXQ7CisKKwkqbnZyYW1fZGF0YSA9IDA7CisJZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspIHsKKwkJVDkzQzQ2X1JlYWRfQml0KG5wLCAmcmVhZF9iaXQsIGdwcmVnKTsKKworCQlpZiAocmVhZF9iaXQgJiAweDAxKQorCQkJKm52cmFtX2RhdGEgfD0gICgweDAxIDw8ICgxNSAtIHgpKTsKKwkJZWxzZQorCQkJKm52cmFtX2RhdGEgJj0gfigweDAxIDw8ICgxNSAtIHgpKTsKKwl9Cit9CisKKy8qCisgKiAgUmVhZCBUZWtyYW0gTnZSQU0gZGF0YS4KKyAqLworc3RhdGljIGludCBUOTNDNDZfUmVhZF9EYXRhKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgdW5zaWduZWQgc2hvcnQgKmRhdGEsCisJCWludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmdwcmVnKQoreworCWludCB4OworCisJZm9yICh4ID0gMDsgeCA8IGxlbjsgeCsrKSAgeworCQl1bnNpZ25lZCBjaGFyIHJlYWRfYml0OworCQkvKiBvdXRwdXQgcmVhZCBjb21tYW5kIGFuZCBhZGRyZXNzICovCisJCVQ5M0M0Nl9TZW5kX0NvbW1hbmQobnAsIDB4MTgwIHwgeCwgJnJlYWRfYml0LCBncHJlZyk7CisJCWlmIChyZWFkX2JpdCAmIDB4MDEpCisJCQlyZXR1cm4gMTsgLyogQmFkICovCisJCVQ5M0M0Nl9SZWFkX1dvcmQobnAsICZkYXRhW3hdLCBncHJlZyk7CisJCVQ5M0M0Nl9TdG9wKG5wLCBncHJlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgVHJ5IHJlYWRpbmcgOTNDNDYgVGVrcmFtIE5WUkFNLgorICovCitzdGF0aWMgaW50IHN5bV9yZWFkX1Q5M0M0Nl9udnJhbShzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIFRla3JhbV9udnJhbSAqbnZyYW0pCit7CisJdV9jaGFyIGdwY250bCwgZ3ByZWc7CisJdV9jaGFyIG9sZF9ncGNudGwsIG9sZF9ncHJlZzsKKwlpbnQgcmV0diA9IDE7CisKKwkvKiBzYXZlIGN1cnJlbnQgc3RhdGUgb2YgR1BDTlRMIGFuZCBHUFJFRyAqLworCW9sZF9ncHJlZwk9IElOQihucCwgbmNfZ3ByZWcpOworCW9sZF9ncGNudGwJPSBJTkIobnAsIG5jX2dwY250bCk7CisKKwkvKiBzZXQgdXAgR1BSRUcgJiBHUENOVEwgdG8gc2V0IEdQSU8wLzEvMi80IGluIHRvIGtub3duIHN0YXRlLCAwIGluLAorCSAgIDEvMi80IG91dCAqLworCWdwcmVnID0gb2xkX2dwcmVnICYgMHhlOTsKKwlPVVRCKG5wLCBuY19ncHJlZywgZ3ByZWcpOworCWdwY250bCA9IChvbGRfZ3BjbnRsICYgMHhlOSkgfCAweDA5OworCU9VVEIobnAsIG5jX2dwY250bCwgZ3BjbnRsKTsKKworCS8qIGlucHV0IGFsbCBvZiBOVlJBTSwgNjQgd29yZHMgKi8KKwlyZXR2ID0gVDkzQzQ2X1JlYWRfRGF0YShucCwgKHVfc2hvcnQgKikgbnZyYW0sCisJCQkJc2l6ZW9mKCpudnJhbSkgLyBzaXplb2Yoc2hvcnQpLCAmZ3ByZWcpOworCQorCS8qIHJldHVybiBHUElPMC8xLzIvNCB0byBvcmlnaW5hbCBzdGF0ZXMgYWZ0ZXIgaGF2aW5nIGFjY2Vzc2VkIE5WUkFNICovCisJT1VUQihucCwgbmNfZ3BjbnRsLCBvbGRfZ3BjbnRsKTsKKwlPVVRCKG5wLCBuY19ncHJlZywgIG9sZF9ncHJlZyk7CisKKwlyZXR1cm4gcmV0djsKK30KKworLyoKKyAqICBUcnkgcmVhZGluZyBUZWtyYW0gTlZSQU0uCisgKiAgUmV0dXJuIDAgaWYgT0suCisgKi8KK3N0YXRpYyBpbnQgc3ltX3JlYWRfVGVrcmFtX252cmFtIChzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIFRla3JhbV9udnJhbSAqbnZyYW0pCit7CisJdV9jaGFyICpkYXRhID0gKHVfY2hhciAqKSBudnJhbTsKKwlpbnQgbGVuID0gc2l6ZW9mKCpudnJhbSk7CisJdV9zaG9ydAljc3VtOworCWludCB4OworCisJc3dpdGNoIChucC0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4ODU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4OTU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX05DUl81M0M4OTY6CisJCXggPSBzeW1fcmVhZF9TMjRDMTZfbnZyYW0obnAsIFRFS1JBTV8yNEMxNl9OVlJBTV9BRERSRVNTLAorCQkJCQkgIGRhdGEsIGxlbik7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9OQ1JfNTNDODc1OgorCQl4ID0gc3ltX3JlYWRfUzI0QzE2X252cmFtKG5wLCBURUtSQU1fMjRDMTZfTlZSQU1fQUREUkVTUywKKwkJCQkJICBkYXRhLCBsZW4pOworCQlpZiAoIXgpCisJCQlicmVhazsKKwlkZWZhdWx0OgorCQl4ID0gc3ltX3JlYWRfVDkzQzQ2X252cmFtKG5wLCBudnJhbSk7CisJCWJyZWFrOworCX0KKwlpZiAoeCkKKwkJcmV0dXJuIDE7CisKKwkvKiB2ZXJpZnkgY2hlY2tzdW0gKi8KKwlmb3IgKHggPSAwLCBjc3VtID0gMDsgeCA8IGxlbiAtIDE7IHggKz0gMikKKwkJY3N1bSArPSBkYXRhW3hdICsgKGRhdGFbeCsxXSA8PCA4KTsKKwlpZiAoY3N1bSAhPSAweDEyMzQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUEFSSVNDCisvKgorICogSG9zdCBmaXJtd2FyZSAoUERDKSBrZWVwcyBhIHRhYmxlIGZvciBhbHRlcmluZyBTQ1NJIGNhcGFiaWxpdGllcy4KKyAqIE1hbnkgbmV3ZXIgbWFjaGluZXMgZXhwb3J0IG9uZSBjaGFubmVsIG9mIDUzYzg5NiBjaGlwIGFzIFNFLCA1MC1waW4gSEQuCisgKiBBbHNvIHVzZWQgZm9yIE11bHRpLWluaXRpYXRvciBTQ1NJIGNsdXN0ZXJzIHRvIHNldCB0aGUgU0NTSSBJbml0aWF0b3IgSUQuCisgKi8KK3N0YXRpYyBpbnQgc3ltX3JlYWRfcGFyaXNjX3BkYyhzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHN0cnVjdCBwZGNfaW5pdGlhdG9yICpwZGMpCit7CisJc3RydWN0IGhhcmR3YXJlX3BhdGggaHdwYXRoOworCWdldF9wY2lfbm9kZV9wYXRoKG5wLT5wZGV2LCAmaHdwYXRoKTsKKwlpZiAoIXBkY19nZXRfaW5pdGlhdG9yKCZod3BhdGgsIHBkYykpCisJCXJldHVybiAwOworCisJcmV0dXJuIFNZTV9QQVJJU0NfUERDOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgc3ltX3JlYWRfcGFyaXNjX3BkYyhzdHJ1Y3Qgc3ltX2RldmljZSAqbnAsIHN0cnVjdCBwZGNfaW5pdGlhdG9yICp4KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiAgVHJ5IHJlYWRpbmcgU3ltYmlvcyBvciBUZWtyYW0gTlZSQU0KKyAqLworaW50IHN5bV9yZWFkX252cmFtKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgc3RydWN0IHN5bV9udnJhbSAqbnZwKQoreworCWlmICghc3ltX3JlYWRfU3ltYmlvc19udnJhbShucCwgJm52cC0+ZGF0YS5TeW1iaW9zKSkgeworCQludnAtPnR5cGUgPSBTWU1fU1lNQklPU19OVlJBTTsKKwkJc3ltX2Rpc3BsYXlfU3ltYmlvc19udnJhbShucCwgJm52cC0+ZGF0YS5TeW1iaW9zKTsKKwl9IGVsc2UgaWYgKCFzeW1fcmVhZF9UZWtyYW1fbnZyYW0obnAsICZudnAtPmRhdGEuVGVrcmFtKSkgeworCQludnAtPnR5cGUgPSBTWU1fVEVLUkFNX05WUkFNOworCQlzeW1fZGlzcGxheV9UZWtyYW1fbnZyYW0obnAsICZudnAtPmRhdGEuVGVrcmFtKTsKKwl9IGVsc2UgeworCQludnAtPnR5cGUgPSBzeW1fcmVhZF9wYXJpc2NfcGRjKG5wLCAmbnZwLT5kYXRhLnBhcmlzYyk7CisJfQorCXJldHVybiBudnAtPnR5cGU7Cit9CisKK2NoYXIgKnN5bV9udnJhbV90eXBlKHN0cnVjdCBzeW1fbnZyYW0gKm52cCkKK3sKKwlzd2l0Y2ggKG52cC0+dHlwZSkgeworCWNhc2UgU1lNX1NZTUJJT1NfTlZSQU06CisJCXJldHVybiAiU3ltYmlvcyBOVlJBTSI7CisJY2FzZSBTWU1fVEVLUkFNX05WUkFNOgorCQlyZXR1cm4gIlRla3JhbSBOVlJBTSI7CisJY2FzZSBTWU1fUEFSSVNDX1BEQzoKKwkJcmV0dXJuICJQQS1SSVNDIEZpcm13YXJlIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIk5vIE5WUkFNIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX252cmFtLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX252cmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzOGJlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fbnZyYW0uaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSBTWU1CSU9TL0xTSUxPR0lDIDUzQzhYWCBhbmQgNTNDMTAxMCBmYW1pbHkgCisgKiBvZiBQQ0ktU0NTSSBJTyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIExpbnV4IHN5bTUzYzh4eCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCAgR2VyYXJkIFJvdWRpZXIKKyAqCisgKiBUaGUgc3ltNTNjOHh4IGRyaXZlciBpcyBkZXJpdmVkIGZyb20gdGhlIG5jcjUzYzh4eCBkcml2ZXIgdGhhdCBoYWQgYmVlbiAKKyAqIGEgcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIHRvIExpbnV4LTEuMi4xMy4KKyAqCisgKiBUaGUgb3JpZ2luYWwgbmNyIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyAqICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisgKiAgICAgICAgIFN0ZWZhbiBFc3NlciAgICAgICAgICAgICAgICA8c2VAbWkuVW5pLUtvZWxuLmRlPgorICogQ29weXJpZ2h0IChDKSAxOTk0ICBXb2xmZ2FuZyBTdGFuZ2xtZWllcgorICoKKyAqIE90aGVyIG1ham9yIGNvbnRyaWJ1dGlvbnM6CisgKgorICogTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIFNZTV9OVlJBTV9ICisjZGVmaW5lIFNZTV9OVlJBTV9ICisKKyNpbmNsdWRlICJzeW01M2M4eHguaCIKKworLyoKKyAqCVN5bWJpb3MgTlZSQU0gZGF0YSBmb3JtYXQKKyAqLworI2RlZmluZSBTWU1CSU9TX05WUkFNX1NJWkUgMzY4CisjZGVmaW5lIFNZTUJJT1NfTlZSQU1fQUREUkVTUyAweDEwMAorCitzdHJ1Y3QgU3ltYmlvc19udnJhbSB7CisvKiBIZWFkZXIgNiBieXRlcyAqLworCXVfc2hvcnQgdHlwZTsJCS8qIDB4MDAwMCAqLworCXVfc2hvcnQgYnl0ZV9jb3VudDsJLyogZXhjbHVkaW5nIGhlYWRlci90cmFpbGVyICovCisJdV9zaG9ydCBjaGVja3N1bTsKKworLyogQ29udHJvbGxlciBzZXQgdXAgMjAgYnl0ZXMgKi8KKwl1X2NoYXIJdl9tYWpvcjsJLyogMHgwMCAqLworCXVfY2hhcgl2X21pbm9yOwkvKiAweDMwICovCisJdTMyCWJvb3RfY3JjOworCXVfc2hvcnQJZmxhZ3M7CisjZGVmaW5lIFNZTUJJT1NfU0NBTV9FTkFCTEUJKDEpCisjZGVmaW5lIFNZTUJJT1NfUEFSSVRZX0VOQUJMRQkoMTw8MSkKKyNkZWZpbmUgU1lNQklPU19WRVJCT1NFX01TR1MJKDE8PDIpCisjZGVmaW5lIFNZTUJJT1NfQ0hTX01BUFBJTkcJKDE8PDMpCisjZGVmaW5lIFNZTUJJT1NfTk9fTlZSQU0JKDE8PDMpCS8qID8/PyAqLworCXVfc2hvcnQJZmxhZ3MxOworI2RlZmluZSBTWU1CSU9TX1NDQU5fSElfTE8JKDEpCisJdV9zaG9ydAl0ZXJtX3N0YXRlOworI2RlZmluZSBTWU1CSU9TX1RFUk1fQ0FOVF9QUk9HUkFNCSgwKQorI2RlZmluZSBTWU1CSU9TX1RFUk1fRU5BQkxFRAkJKDEpCisjZGVmaW5lIFNZTUJJT1NfVEVSTV9ESVNBQkxFRAkJKDIpCisJdV9zaG9ydAlybXZibF9mbGFnczsKKyNkZWZpbmUgU1lNQklPU19STVZCTF9OT19TVVBQT1JUCSgwKQorI2RlZmluZSBTWU1CSU9TX1JNVkJMX0JPT1RfREVWSUNFCSgxKQorI2RlZmluZSBTWU1CSU9TX1JNVkJMX01FRElBX0lOU1RBTExFRAkoMikKKwl1X2NoYXIJaG9zdF9pZDsKKwl1X2NoYXIJbnVtX2hiYTsJLyogMHgwNCAqLworCXVfY2hhcgludW1fZGV2aWNlczsJLyogMHgxMCAqLworCXVfY2hhcgltYXhfc2NhbV9kZXZpY2VzOwkvKiAweDA0ICovCisJdV9jaGFyCW51bV92YWxpZF9zY2FtX2RldmljZXM7CS8qIDB4MDAgKi8KKwl1X2NoYXIJZmxhZ3MyOworI2RlZmluZSBTWU1CSU9TX0FWT0lEX0JVU19SRVNFVAkJKDE8PDIpCisKKy8qIEJvb3Qgb3JkZXIgMTQgYnl0ZXMgKiA0ICovCisJc3RydWN0IFN5bWJpb3NfaG9zdHsKKwkJdV9zaG9ydAl0eXBlOwkJLyogNDo4eHggLyAwOm5vayAqLworCQl1X3Nob3J0CWRldmljZV9pZDsJLyogUENJIGRldmljZSBpZCAqLworCQl1X3Nob3J0CXZlbmRvcl9pZDsJLyogUENJIHZlbmRvciBpZCAqLworCQl1X2NoYXIJYnVzX25yOwkJLyogUENJIGJ1cyBudW1iZXIgKi8KKwkJdV9jaGFyCWRldmljZV9mbjsJLyogUENJIGRldmljZS9mdW5jdGlvbiBudW1iZXIgPDwgMyovCisJCXVfc2hvcnQJd29yZDg7CisJCXVfc2hvcnQJZmxhZ3M7CisjZGVmaW5lCVNZTUJJT1NfSU5JVF9TQ0FOX0FUX0JPT1QJKDEpCisJCXVfc2hvcnQJaW9fcG9ydDsJLyogUENJIGlvX3BvcnQgYWRkcmVzcyAqLworCX0gaG9zdFs0XTsKKworLyogVGFyZ2V0cyA4IGJ5dGVzICogMTYgKi8KKwlzdHJ1Y3QgU3ltYmlvc190YXJnZXQgeworCQl1X2NoYXIJZmxhZ3M7CisjZGVmaW5lIFNZTUJJT1NfRElTQ09OTkVDVF9FTkFCTEUJKDEpCisjZGVmaW5lIFNZTUJJT1NfU0NBTl9BVF9CT09UX1RJTUUJKDE8PDEpCisjZGVmaW5lIFNZTUJJT1NfU0NBTl9MVU5TCQkoMTw8MikKKyNkZWZpbmUgU1lNQklPU19RVUVVRV9UQUdTX0VOQUJMRUQJKDE8PDMpCisJCXVfY2hhcglyc3ZkOworCQl1X2NoYXIJYnVzX3dpZHRoOwkvKiAweDA4LzB4MTAgKi8KKwkJdV9jaGFyCXN5bmNfb2Zmc2V0OworCQl1X3Nob3J0CXN5bmNfcGVyaW9kOwkvKiA0KnBlcmlvZCBmYWN0b3IgKi8KKwkJdV9zaG9ydAl0aW1lb3V0OworCX0gdGFyZ2V0WzE2XTsKKy8qIFNjYW0gdGFibGUgOCBieXRlcyAqIDQgKi8KKwlzdHJ1Y3QgU3ltYmlvc19zY2FtIHsKKwkJdV9zaG9ydAlpZDsKKwkJdV9zaG9ydAltZXRob2Q7CisjZGVmaW5lIFNZTUJJT1NfU0NBTV9ERUZBVUxUX01FVEhPRAkoMCkKKyNkZWZpbmUgU1lNQklPU19TQ0FNX0RPTlRfQVNTSUdOCSgxKQorI2RlZmluZSBTWU1CSU9TX1NDQU1fU0VUX1NQRUNJRklDX0lECSgyKQorI2RlZmluZSBTWU1CSU9TX1NDQU1fVVNFX09SREVSX0dJVkVOCSgzKQorCQl1X3Nob3J0IHN0YXR1czsKKyNkZWZpbmUgU1lNQklPU19TQ0FNX1VOS05PV04JCSgwKQorI2RlZmluZSBTWU1CSU9TX1NDQU1fREVWSUNFX05PVF9GT1VORAkoMSkKKyNkZWZpbmUgU1lNQklPU19TQ0FNX0lEX05PVF9TRVQJCSgyKQorI2RlZmluZSBTWU1CSU9TX1NDQU1fSURfVkFMSUQJCSgzKQorCQl1X2NoYXIJdGFyZ2V0X2lkOworCQl1X2NoYXIJcnN2ZDsKKwl9IHNjYW1bNF07CisKKwl1X2NoYXIJc3BhcmVfZGV2aWNlc1sxNSo4XTsKKwl1X2NoYXIJdHJhaWxlcls2XTsJCS8qIDB4ZmUgMHhmZSAweDAwIDB4MDAgMHgwMCAweDAwICovCit9OwordHlwZWRlZiBzdHJ1Y3QgU3ltYmlvc19udnJhbQlTeW1iaW9zX252cmFtOwordHlwZWRlZiBzdHJ1Y3QgU3ltYmlvc19ob3N0CVN5bWJpb3NfaG9zdDsKK3R5cGVkZWYgc3RydWN0IFN5bWJpb3NfdGFyZ2V0CVN5bWJpb3NfdGFyZ2V0OwordHlwZWRlZiBzdHJ1Y3QgU3ltYmlvc19zY2FtCVN5bWJpb3Nfc2NhbTsKKworLyoKKyAqCVRla3JhbSBOdlJBTSBkYXRhIGZvcm1hdC4KKyAqLworI2RlZmluZSBURUtSQU1fTlZSQU1fU0laRSA2NAorI2RlZmluZSBURUtSQU1fOTNDNDZfTlZSQU1fQUREUkVTUyAwCisjZGVmaW5lIFRFS1JBTV8yNEMxNl9OVlJBTV9BRERSRVNTIDB4NDAKKworc3RydWN0IFRla3JhbV9udnJhbSB7CisJc3RydWN0IFRla3JhbV90YXJnZXQgeworCQl1X2NoYXIJZmxhZ3M7CisjZGVmaW5lCVRFS1JBTV9QQVJJVFlfQ0hFQ0sJCSgxKQorI2RlZmluZSBURUtSQU1fU1lOQ19ORUdPCQkoMTw8MSkKKyNkZWZpbmUgVEVLUkFNX0RJU0NPTk5FQ1RfRU5BQkxFCSgxPDwyKQorI2RlZmluZQlURUtSQU1fU1RBUlRfQ01ECQkoMTw8MykKKyNkZWZpbmUgVEVLUkFNX1RBR0dFRF9DT01NQU5EUwkJKDE8PDQpCisjZGVmaW5lIFRFS1JBTV9XSURFX05FR08JCSgxPDw1KQorCQl1X2NoYXIJc3luY19pbmRleDsKKwkJdV9zaG9ydAl3b3JkMjsKKwl9IHRhcmdldFsxNl07CisJdV9jaGFyCWhvc3RfaWQ7CisJdV9jaGFyCWZsYWdzOworI2RlZmluZSBURUtSQU1fTU9SRV9USEFOXzJfRFJJVkVTCSgxKQorI2RlZmluZSBURUtSQU1fRFJJVkVTX1NVUF8xR0IJCSgxPDwxKQorI2RlZmluZQlURUtSQU1fUkVTRVRfT05fUE9XRVJfT04JKDE8PDIpCisjZGVmaW5lIFRFS1JBTV9BQ1RJVkVfTkVHQVRJT04JCSgxPDwzKQorI2RlZmluZSBURUtSQU1fSU1NRURJQVRFX1NFRUsJCSgxPDw0KQorI2RlZmluZQlURUtSQU1fU0NBTl9MVU5TCQkoMTw8NSkKKyNkZWZpbmUJVEVLUkFNX1JFTU9WQUJMRV9GTEFHUwkJKDM8PDYpCS8qIDA6IGRpc2FibGU7ICovCisJCQkJCQkvKiAxOiBib290IGRldmljZTsgMjphbGwgKi8KKwl1X2NoYXIJYm9vdF9kZWxheV9pbmRleDsKKwl1X2NoYXIJbWF4X3RhZ3NfaW5kZXg7CisJdV9zaG9ydAlmbGFnczE7CisjZGVmaW5lIFRFS1JBTV9GMl9GNl9FTkFCTEVECQkoMSkKKwl1X3Nob3J0CXNwYXJlWzI5XTsKK307Cit0eXBlZGVmIHN0cnVjdCBUZWtyYW1fbnZyYW0JVGVrcmFtX252cmFtOwordHlwZWRlZiBzdHJ1Y3QgVGVrcmFtX3RhcmdldAlUZWtyYW1fdGFyZ2V0OworCisjaWZuZGVmIENPTkZJR19QQVJJU0MKK3N0cnVjdCBwZGNfaW5pdGlhdG9yIHsgaW50IGR1bW15OyB9OworI2VuZGlmCisKKy8qCisgKiAgVW5pb24gb2Ygc3VwcG9ydGVkIE5WUkFNIGZvcm1hdHMuCisgKi8KK3N0cnVjdCBzeW1fbnZyYW0geworCWludCB0eXBlOworI2RlZmluZQlTWU1fU1lNQklPU19OVlJBTQkoMSkKKyNkZWZpbmUJU1lNX1RFS1JBTV9OVlJBTQkoMikKKyNkZWZpbmUgU1lNX1BBUklTQ19QREMJCSgzKQorI2lmIFNZTV9DT05GX05WUkFNX1NVUFBPUlQKKwl1bmlvbiB7CisJCVN5bWJpb3NfbnZyYW0gU3ltYmlvczsKKwkJVGVrcmFtX252cmFtIFRla3JhbTsKKwkJc3RydWN0IHBkY19pbml0aWF0b3IgcGFyaXNjOworCX0gZGF0YTsKKyNlbmRpZgorfTsKKworI2lmIFNZTV9DT05GX05WUkFNX1NVUFBPUlQKK3ZvaWQgc3ltX252cmFtX3NldHVwX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9udnJhbSAqbnZyYW0pOwordm9pZCBzeW1fbnZyYW1fc2V0dXBfdGFyZ2V0IChzdHJ1Y3Qgc3ltX2hjYiAqbnAsIGludCB0YXJnZXQsIHN0cnVjdCBzeW1fbnZyYW0gKm52cCk7CitpbnQgc3ltX3JlYWRfbnZyYW0gKHN0cnVjdCBzeW1fZGV2aWNlICpucCwgc3RydWN0IHN5bV9udnJhbSAqbnZwKTsKK2NoYXIgKnN5bV9udnJhbV90eXBlKHN0cnVjdCBzeW1fbnZyYW0gKm52cCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHN5bV9udnJhbV9zZXR1cF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc3ltX2hjYiAqbnAsIHN0cnVjdCBzeW1fbnZyYW0gKm52cmFtKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeW1fbnZyYW1fc2V0dXBfdGFyZ2V0KHN0cnVjdCBzeW1faGNiICpucCwgc3RydWN0IHN5bV9udnJhbSAqbnZyYW0pIHsgfQorc3RhdGljIGlubGluZSBpbnQgc3ltX3JlYWRfbnZyYW0oc3RydWN0IHN5bV9kZXZpY2UgKm5wLCBzdHJ1Y3Qgc3ltX252cmFtICpudnApCit7CisJbnZwLT50eXBlID0gMDsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgY2hhciAqc3ltX252cmFtX3R5cGUoc3RydWN0IHN5bV9udnJhbSAqbnZwKQoreworCXJldHVybiAiTm8gTlZSQU0iOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBTWU1fTlZSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF9jb21tLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4X2NvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFlMmIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF9jb21tLmgKQEAgLTAsMCArMSw3OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBIaWdoIFBlcmZvcm1hbmNlIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTeW1iaW9zIDUzQzg5NiBjb250cm9sbGVyLgorKioKKyoqICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSAgR2VyYXJkIFJvdWRpZXIgPGdyb3VkaWVyQGZyZWUuZnI+CisqKgorKiogIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgYWxsIHRoZSBTeW1iaW9zIDUzQzhYWCBjb250cm9sbGVyIGZhbWlseSwgCisqKiAgZXhjZXB0IDUzQzgxMCByZXZpc2lvbnMgPCAxNiwgNTNDODI1IHJldmlzaW9ucyA8IDE2IGFuZCBhbGwgCisqKiAgcmV2aXNpb25zIG9mIDUzQzgxNSBjb250cm9sbGVycy4KKyoqCisqKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIExpbnV4IHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlci4KKyoqIAorKiogIENvcHlyaWdodCAoQykgMTk5NCAgV29sZmdhbmcgU3RhbmdsbWVpZXIKKyoqICAKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqICAKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBUaGUgTGludXggcG9ydCBvZiB0aGUgRnJlZUJTRCBuY3IgZHJpdmVyIGhhcyBiZWVuIGFjaGlldmVkIGluIAorKiogIG5vdmVtYmVyIDE5OTUgYnk6CisqKgorKiogICAgICAgICAgR2VyYXJkIFJvdWRpZXIgICAgICAgICAgICAgIDxncm91ZGllckBmcmVlLmZyPgorKioKKyoqICBCZWluZyBnaXZlbiB0aGF0IHRoaXMgZHJpdmVyIG9yaWdpbmF0ZXMgZnJvbSB0aGUgRnJlZUJTRCB2ZXJzaW9uLCBhbmQKKyoqICBpbiBvcmRlciB0byBrZWVwIHN5bmVyZ3kgb24gYm90aCwgYW55IHN1Z2dlc3RlZCBlbmhhbmNlbWVudHMgYW5kIGNvcnJlY3Rpb25zCisqKiAgcmVjZWl2ZWQgb24gTGludXggYXJlIGF1dG9tYXRpY2FsbHkgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGZvciB0aGUgRnJlZUJTRCAKKyoqICB2ZXJzaW9uLgorKioKKyoqICBUaGUgb3JpZ2luYWwgZHJpdmVyIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIDM4NmJzZCBhbmQgRnJlZUJTRCBieQorKiogICAgICAgICAgV29sZmdhbmcgU3RhbmdsbWVpZXIgICAgICAgIDx3b2xmQGNvbG9nbmUuZGU+CisqKiAgICAgICAgICBTdGVmYW4gRXNzZXIgICAgICAgICAgICAgICAgPHNlQG1pLlVuaS1Lb2Vsbi5kZT4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIE1ham9yIGNvbnRyaWJ1dGlvbnM6CisqKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgTlZSQU0gZGV0ZWN0aW9uIGFuZCByZWFkaW5nLgorKiogICAgQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgV2FsdGhhbSA8ZG9ybW91c2VAZmFyc3JvYnQuZGVtb24uY28udWs+CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRGVidWdnaW5nIHRhZ3MKKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNkZWZpbmUgREVCVUdfQUxMT0MgICAgKDB4MDAwMSkKKyNkZWZpbmUgREVCVUdfUEhBU0UgICAgKDB4MDAwMikKKyNkZWZpbmUgREVCVUdfUVVFVUUgICAgKDB4MDAwOCkKKyNkZWZpbmUgREVCVUdfUkVTVUxUICAgKDB4MDAxMCkKKyNkZWZpbmUgREVCVUdfUE9JTlRFUiAgKDB4MDAyMCkKKyNkZWZpbmUgREVCVUdfU0NSSVBUICAgKDB4MDA0MCkKKyNkZWZpbmUgREVCVUdfVElOWSAgICAgKDB4MDA4MCkKKyNkZWZpbmUgREVCVUdfVElNSU5HICAgKDB4MDEwMCkKKyNkZWZpbmUgREVCVUdfTkVHTyAgICAgKDB4MDIwMCkKKyNkZWZpbmUgREVCVUdfVEFHUyAgICAgKDB4MDQwMCkKKyNkZWZpbmUgREVCVUdfU0NBVFRFUiAgKDB4MDgwMCkKKyNkZWZpbmUgREVCVUdfSUMgICAgICAgICgweDEwMDApCisKKy8qCisqKiAgICBFbmFibGUvRGlzYWJsZSBkZWJ1ZyBtZXNzYWdlcy4KKyoqICAgIENhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgdG9vLgorKi8KKworI2lmZGVmIFNDU0lfTkNSX0RFQlVHX0lORk9fU1VQUE9SVAorc3RhdGljIGludCBuY3JfZGVidWcgPSBTQ1NJX05DUl9ERUJVR19GTEFHUzsKKwkjZGVmaW5lIERFQlVHX0ZMQUdTIG5jcl9kZWJ1ZworI2Vsc2UKKwkjZGVmaW5lIERFQlVHX0ZMQUdTCVNDU0lfTkNSX0RFQlVHX0ZMQUdTCisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpuY3JfbGlzdF9wb3Aoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpZiAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZWxlbSA9IGhlYWQtPm5leHQ7CisKKwkJbGlzdF9kZWwoZWxlbSk7CisJCXJldHVybiBlbGVtOworCX0KKworCXJldHVybiBOVUxMOworfQorCisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioKKyoqCVNpbXBsZSBwb3dlciBvZiB0d28gYnVkZHktbGlrZSBhbGxvY2F0b3IuCisqKgorKioJVGhpcyBzaW1wbGUgY29kZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZmFzdCwgYnV0IHRvIAorKioJcHJvdmlkZSBwb3dlciBvZiAyIGFsaWduZWQgbWVtb3J5IGFsbG9jYXRpb25zLgorKioJU2luY2UgdGhlIFNDUklQVFMgcHJvY2Vzc29yIG9ubHkgc3VwcGxpZXMgOCBiaXQgCisqKglhcml0aG1ldGljLCB0aGlzIGFsbG9jYXRvciBhbGxvd3Mgc2ltcGxlIGFuZCBmYXN0IAorKioJYWRkcmVzcyBjYWxjdWxhdGlvbnMgIGZyb20gdGhlIFNDUklQVFMgY29kZS4KKyoqCUluIGFkZGl0aW9uLCBjYWNoZSBsaW5lIGFsaWdubWVudCBpcyBndWFyYW50ZWVkIGZvciAKKyoqCXBvd2VyIG9mIDIgY2FjaGUgbGluZSBzaXplLgorKioJRW5oYW5jZWQgaW4gbGludXgtMi4zLjQ0IHRvIHByb3ZpZGUgYSBtZW1vcnkgcG9vbCAKKyoqCXBlciBwY2lkZXYgdG8gc3VwcG9ydCBkeW5hbWljIGRtYSBtYXBwaW5nLiAoSSB3b3VsZCAKKyoqCWhhdmUgcHJlZmVycmVkIGEgcmVhbCBidXMgYXN0cmFjdGlvbiwgYnR3KS4KKyoqCisqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNkZWZpbmUgTUVNT19TSElGVAk0CS8qIDE2IGJ5dGVzIG1pbmltdW0gbWVtb3J5IGNodW5rICovCisjaWYgUEFHRV9TSVpFID49IDgxOTIKKyNkZWZpbmUgTUVNT19QQUdFX09SREVSCTAJLyogMSBQQUdFICBtYXhpbXVtICovCisjZWxzZQorI2RlZmluZSBNRU1PX1BBR0VfT1JERVIJMQkvKiAyIFBBR0VTIG1heGltdW0gKi8KKyNlbmRpZgorI2RlZmluZSBNRU1PX0ZSRUVfVU5VU0VECS8qIEZyZWUgdW51c2VkIHBhZ2VzIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lIE1FTU9fV0FSTgkxCisjZGVmaW5lIE1FTU9fR0ZQX0ZMQUdTCUdGUF9BVE9NSUMKKyNkZWZpbmUgTUVNT19DTFVTVEVSX1NISUZUCShQQUdFX1NISUZUK01FTU9fUEFHRV9PUkRFUikKKyNkZWZpbmUgTUVNT19DTFVTVEVSX1NJWkUJKDFVTCA8PCBNRU1PX0NMVVNURVJfU0hJRlQpCisjZGVmaW5lIE1FTU9fQ0xVU1RFUl9NQVNLCShNRU1PX0NMVVNURVJfU0laRS0xKQorCit0eXBlZGVmIHVfbG9uZyBtX2FkZHJfdDsJLyogRW5vdWdoIGJpdHMgdG8gYml0LWhhY2sgYWRkcmVzc2VzICovCit0eXBlZGVmIHN0cnVjdCBkZXZpY2UgKm1fYnVzaF90OwkvKiBTb21ldGhpbmcgdGhhdCBhZGRyZXNzZXMgRE1BYWJsZSAqLworCit0eXBlZGVmIHN0cnVjdCBtX2xpbmsgewkJLyogTGluayBiZXR3ZWVuIGZyZWUgbWVtb3J5IGNodW5rcyAqLworCXN0cnVjdCBtX2xpbmsgKm5leHQ7Cit9IG1fbGlua19zOworCit0eXBlZGVmIHN0cnVjdCBtX3Z0b2IgewkJLyogVmlydHVhbCB0byBCdXMgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLworCXN0cnVjdCBtX3Z0b2IgKm5leHQ7CisJbV9hZGRyX3QgdmFkZHI7CisJbV9hZGRyX3QgYmFkZHI7Cit9IG1fdnRvYl9zOworI2RlZmluZSBWVE9CX0hBU0hfU0hJRlQJCTUKKyNkZWZpbmUgVlRPQl9IQVNIX1NJWkUJCSgxVUwgPDwgVlRPQl9IQVNIX1NISUZUKQorI2RlZmluZSBWVE9CX0hBU0hfTUFTSwkJKFZUT0JfSEFTSF9TSVpFLTEpCisjZGVmaW5lIFZUT0JfSEFTSF9DT0RFKG0pCVwKKwkoKCgobV9hZGRyX3QpIChtKSkgPj4gTUVNT19DTFVTVEVSX1NISUZUKSAmIFZUT0JfSEFTSF9NQVNLKQorCit0eXBlZGVmIHN0cnVjdCBtX3Bvb2wgewkJLyogTWVtb3J5IHBvb2wgb2YgYSBnaXZlbiBraW5kICovCisJbV9idXNoX3QgYnVzaDsKKwltX2FkZHJfdCAoKmdldHApKHN0cnVjdCBtX3Bvb2wgKik7CisJdm9pZCAoKmZyZWVwKShzdHJ1Y3QgbV9wb29sICosIG1fYWRkcl90KTsKKwlpbnQgbnVtcDsKKwltX3Z0b2JfcyAqKHZ0b2JbVlRPQl9IQVNIX1NJWkVdKTsKKwlzdHJ1Y3QgbV9wb29sICpuZXh0OworCXN0cnVjdCBtX2xpbmsgaFtQQUdFX1NISUZULU1FTU9fU0hJRlQrTUVNT19QQUdFX09SREVSKzFdOworfSBtX3Bvb2xfczsKKworc3RhdGljIHZvaWQgKl9fX21fYWxsb2MobV9wb29sX3MgKm1wLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHMgPSAoMSA8PCBNRU1PX1NISUZUKTsKKwlpbnQgajsKKwltX2FkZHJfdCBhOworCW1fbGlua19zICpoID0gbXAtPmg7CisKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgTUVNT19QQUdFX09SREVSKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoc2l6ZSA+IHMpIHsKKwkJcyA8PD0gMTsKKwkJKytpOworCX0KKworCWogPSBpOworCXdoaWxlICghaFtqXS5uZXh0KSB7CisJCWlmIChzID09IChQQUdFX1NJWkUgPDwgTUVNT19QQUdFX09SREVSKSkgeworCQkJaFtqXS5uZXh0ID0gKG1fbGlua19zICopbXAtPmdldHAobXApOworCQkJaWYgKGhbal0ubmV4dCkKKwkJCQloW2pdLm5leHQtPm5leHQgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJKytqOworCQlzIDw8PSAxOworCX0KKwlhID0gKG1fYWRkcl90KSBoW2pdLm5leHQ7CisJaWYgKGEpIHsKKwkJaFtqXS5uZXh0ID0gaFtqXS5uZXh0LT5uZXh0OworCQl3aGlsZSAoaiA+IGkpIHsKKwkJCWogLT0gMTsKKwkJCXMgPj49IDE7CisJCQloW2pdLm5leHQgPSAobV9saW5rX3MgKikgKGErcyk7CisJCQloW2pdLm5leHQtPm5leHQgPSBOVUxMOworCQl9CisJfQorI2lmZGVmIERFQlVHCisJcHJpbnRrKCJfX19tX2FsbG9jKCVkKSA9ICVwXG4iLCBzaXplLCAodm9pZCAqKSBhKTsKKyNlbmRpZgorCXJldHVybiAodm9pZCAqKSBhOworfQorCitzdGF0aWMgdm9pZCBfX19tX2ZyZWUobV9wb29sX3MgKm1wLCB2b2lkICpwdHIsIGludCBzaXplKQoreworCWludCBpID0gMDsKKwlpbnQgcyA9ICgxIDw8IE1FTU9fU0hJRlQpOworCW1fbGlua19zICpxOworCW1fYWRkcl90IGEsIGI7CisJbV9saW5rX3MgKmggPSBtcC0+aDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJfX19tX2ZyZWUoJXAsICVkKVxuIiwgcHRyLCBzaXplKTsKKyNlbmRpZgorCisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IE1FTU9fUEFHRV9PUkRFUikpCisJCXJldHVybjsKKworCXdoaWxlIChzaXplID4gcykgeworCQlzIDw8PSAxOworCQkrK2k7CisJfQorCisJYSA9IChtX2FkZHJfdCkgcHRyOworCisJd2hpbGUgKDEpIHsKKyNpZmRlZiBNRU1PX0ZSRUVfVU5VU0VECisJCWlmIChzID09IChQQUdFX1NJWkUgPDwgTUVNT19QQUdFX09SREVSKSkgeworCQkJbXAtPmZyZWVwKG1wLCBhKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJYiA9IGEgXiBzOworCQlxID0gJmhbaV07CisJCXdoaWxlIChxLT5uZXh0ICYmIHEtPm5leHQgIT0gKG1fbGlua19zICopIGIpIHsKKwkJCXEgPSBxLT5uZXh0OworCQl9CisJCWlmICghcS0+bmV4dCkgeworCQkJKChtX2xpbmtfcyAqKSBhKS0+bmV4dCA9IGhbaV0ubmV4dDsKKwkJCWhbaV0ubmV4dCA9IChtX2xpbmtfcyAqKSBhOworCQkJYnJlYWs7CisJCX0KKwkJcS0+bmV4dCA9IHEtPm5leHQtPm5leHQ7CisJCWEgPSBhICYgYjsKKwkJcyA8PD0gMTsKKwkJKytpOworCX0KK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhuY3I1M2M4eHhfbG9jayk7CisKK3N0YXRpYyB2b2lkICpfX21fY2FsbG9jMihtX3Bvb2xfcyAqbXAsIGludCBzaXplLCBjaGFyICpuYW1lLCBpbnQgdWZsYWdzKQoreworCXZvaWQgKnA7CisKKwlwID0gX19fbV9hbGxvYyhtcCwgc2l6ZSk7CisKKwlpZiAoREVCVUdfRkxBR1MgJiBERUJVR19BTExPQykKKwkJcHJpbnRrICgibmV3ICUtMTBzWyU0ZF0gQCVwLlxuIiwgbmFtZSwgc2l6ZSwgcCk7CisKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIHNpemUpOworCWVsc2UgaWYgKHVmbGFncyAmIE1FTU9fV0FSTikKKwkJcHJpbnRrIChOQU1FNTNDOFhYICI6IGZhaWxlZCB0byBhbGxvY2F0ZSAlc1slZF1cbiIsIG5hbWUsIHNpemUpOworCisJcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgX19tX2NhbGxvYyhtcCwgcywgbikJX19tX2NhbGxvYzIobXAsIHMsIG4sIE1FTU9fV0FSTikKKworc3RhdGljIHZvaWQgX19tX2ZyZWUobV9wb29sX3MgKm1wLCB2b2lkICpwdHIsIGludCBzaXplLCBjaGFyICpuYW1lKQoreworCWlmIChERUJVR19GTEFHUyAmIERFQlVHX0FMTE9DKQorCQlwcmludGsgKCJmcmVlaW5nICUtMTBzWyU0ZF0gQCVwLlxuIiwgbmFtZSwgc2l6ZSwgcHRyKTsKKworCV9fX21fZnJlZShtcCwgcHRyLCBzaXplKTsKKworfQorCisvKgorICogV2l0aCBwY2kgYnVzIGlvbW11IHN1cHBvcnQsIHdlIHVzZSBhIGRlZmF1bHQgcG9vbCBvZiB1bm1hcHBlZCBtZW1vcnkgCisgKiBmb3IgbWVtb3J5IHdlIGRvbm5vdCBuZWVkIHRvIERNQSBmcm9tL3RvIGFuZCBvbmUgcG9vbCBwZXIgcGNpZGV2IGZvciAKKyAqIG1lbW9yeSBhY2Nlc3NlZCBieSB0aGUgUENJIGNoaXAuIGBtcDAnIGlzIHRoZSBkZWZhdWx0IG5vdCBETUFhYmxlIHBvb2wuCisgKi8KKworc3RhdGljIG1fYWRkcl90IF9fX21wMF9nZXRwKG1fcG9vbF9zICptcCkKK3sKKwltX2FkZHJfdCBtID0gX19nZXRfZnJlZV9wYWdlcyhNRU1PX0dGUF9GTEFHUywgTUVNT19QQUdFX09SREVSKTsKKwlpZiAobSkKKwkJKyttcC0+bnVtcDsKKwlyZXR1cm4gbTsKK30KKworc3RhdGljIHZvaWQgX19fbXAwX2ZyZWVwKG1fcG9vbF9zICptcCwgbV9hZGRyX3QgbSkKK3sKKwlmcmVlX3BhZ2VzKG0sIE1FTU9fUEFHRV9PUkRFUik7CisJLS1tcC0+bnVtcDsKK30KKworc3RhdGljIG1fcG9vbF9zIG1wMCA9IHtOVUxMLCBfX19tcDBfZ2V0cCwgX19fbXAwX2ZyZWVwfTsKKworLyoKKyAqIERNQWFibGUgcG9vbHMuCisgKi8KKworLyoKKyAqIFdpdGggcGNpIGJ1cyBpb21tdSBzdXBwb3J0LCB3ZSBtYWludGFpbiBvbmUgcG9vbCBwZXIgcGNpZGV2IGFuZCBhIAorICogaGFzaGVkIHJldmVyc2UgdGFibGUgZm9yIHZpcnR1YWwgdG8gYnVzIHBoeXNpY2FsIGFkZHJlc3MgdHJhbnNsYXRpb25zLgorICovCitzdGF0aWMgbV9hZGRyX3QgX19fZG1hX2dldHAobV9wb29sX3MgKm1wKQoreworCW1fYWRkcl90IHZwOworCW1fdnRvYl9zICp2YnA7CisKKwl2YnAgPSBfX21fY2FsbG9jKCZtcDAsIHNpemVvZigqdmJwKSwgIlZUT0IiKTsKKwlpZiAodmJwKSB7CisJCWRtYV9hZGRyX3QgZGFkZHI7CisJCXZwID0gKG1fYWRkcl90KSBkbWFfYWxsb2NfY29oZXJlbnQobXAtPmJ1c2gsCisJCQkJCQlQQUdFX1NJWkU8PE1FTU9fUEFHRV9PUkRFUiwKKwkJCQkJCSZkYWRkciwgR0ZQX0FUT01JQyk7CisJCWlmICh2cCkgeworCQkJaW50IGhjID0gVlRPQl9IQVNIX0NPREUodnApOworCQkJdmJwLT52YWRkciA9IHZwOworCQkJdmJwLT5iYWRkciA9IGRhZGRyOworCQkJdmJwLT5uZXh0ID0gbXAtPnZ0b2JbaGNdOworCQkJbXAtPnZ0b2JbaGNdID0gdmJwOworCQkJKyttcC0+bnVtcDsKKwkJCXJldHVybiB2cDsKKwkJfQorCX0KKwlpZiAodmJwKQorCQlfX21fZnJlZSgmbXAwLCB2YnAsIHNpemVvZigqdmJwKSwgIlZUT0IiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19fZG1hX2ZyZWVwKG1fcG9vbF9zICptcCwgbV9hZGRyX3QgbSkKK3sKKwltX3Z0b2JfcyAqKnZicHAsICp2YnA7CisJaW50IGhjID0gVlRPQl9IQVNIX0NPREUobSk7CisKKwl2YnBwID0gJm1wLT52dG9iW2hjXTsKKwl3aGlsZSAoKnZicHAgJiYgKCp2YnBwKS0+dmFkZHIgIT0gbSkKKwkJdmJwcCA9ICYoKnZicHApLT5uZXh0OworCWlmICgqdmJwcCkgeworCQl2YnAgPSAqdmJwcDsKKwkJKnZicHAgPSAoKnZicHApLT5uZXh0OworCQlkbWFfZnJlZV9jb2hlcmVudChtcC0+YnVzaCwgUEFHRV9TSVpFPDxNRU1PX1BBR0VfT1JERVIsCisJCQkJICAodm9pZCAqKXZicC0+dmFkZHIsIChkbWFfYWRkcl90KXZicC0+YmFkZHIpOworCQlfX21fZnJlZSgmbXAwLCB2YnAsIHNpemVvZigqdmJwKSwgIlZUT0IiKTsKKwkJLS1tcC0+bnVtcDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgbV9wb29sX3MgKl9fX2dldF9kbWFfcG9vbChtX2J1c2hfdCBidXNoKQoreworCW1fcG9vbF9zICptcDsKKwlmb3IgKG1wID0gbXAwLm5leHQ7IG1wICYmIG1wLT5idXNoICE9IGJ1c2g7IG1wID0gbXAtPm5leHQpOworCXJldHVybiBtcDsKK30KKworc3RhdGljIG1fcG9vbF9zICpfX19jcmVfZG1hX3Bvb2wobV9idXNoX3QgYnVzaCkKK3sKKwltX3Bvb2xfcyAqbXA7CisJbXAgPSBfX21fY2FsbG9jKCZtcDAsIHNpemVvZigqbXApLCAiTVBPT0wiKTsKKwlpZiAobXApIHsKKwkJbWVtc2V0KG1wLCAwLCBzaXplb2YoKm1wKSk7CisJCW1wLT5idXNoID0gYnVzaDsKKwkJbXAtPmdldHAgPSBfX19kbWFfZ2V0cDsKKwkJbXAtPmZyZWVwID0gX19fZG1hX2ZyZWVwOworCQltcC0+bmV4dCA9IG1wMC5uZXh0OworCQltcDAubmV4dCA9IG1wOworCX0KKwlyZXR1cm4gbXA7Cit9CisKK3N0YXRpYyB2b2lkIF9fX2RlbF9kbWFfcG9vbChtX3Bvb2xfcyAqcCkKK3sKKwlzdHJ1Y3QgbV9wb29sICoqcHAgPSAmbXAwLm5leHQ7CisKKwl3aGlsZSAoKnBwICYmICpwcCAhPSBwKQorCQlwcCA9ICYoKnBwKS0+bmV4dDsKKwlpZiAoKnBwKSB7CisJCSpwcCA9ICgqcHApLT5uZXh0OworCQlfX21fZnJlZSgmbXAwLCBwLCBzaXplb2YoKnApLCAiTVBPT0wiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICpfX21fY2FsbG9jX2RtYShtX2J1c2hfdCBidXNoLCBpbnQgc2l6ZSwgY2hhciAqbmFtZSkKK3sKKwl1X2xvbmcgZmxhZ3M7CisJc3RydWN0IG1fcG9vbCAqbXA7CisJdm9pZCAqbSA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmNyNTNjOHh4X2xvY2ssIGZsYWdzKTsKKwltcCA9IF9fX2dldF9kbWFfcG9vbChidXNoKTsKKwlpZiAoIW1wKQorCQltcCA9IF9fX2NyZV9kbWFfcG9vbChidXNoKTsKKwlpZiAobXApCisJCW0gPSBfX21fY2FsbG9jKG1wLCBzaXplLCBuYW1lKTsKKwlpZiAobXAgJiYgIW1wLT5udW1wKQorCQlfX19kZWxfZG1hX3Bvb2wobXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jcjUzYzh4eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbTsKK30KKworc3RhdGljIHZvaWQgX19tX2ZyZWVfZG1hKG1fYnVzaF90IGJ1c2gsIHZvaWQgKm0sIGludCBzaXplLCBjaGFyICpuYW1lKQoreworCXVfbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbV9wb29sICptcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuY3I1M2M4eHhfbG9jaywgZmxhZ3MpOworCW1wID0gX19fZ2V0X2RtYV9wb29sKGJ1c2gpOworCWlmIChtcCkKKwkJX19tX2ZyZWUobXAsIG0sIHNpemUsIG5hbWUpOworCWlmIChtcCAmJiAhbXAtPm51bXApCisJCV9fX2RlbF9kbWFfcG9vbChtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmNyNTNjOHh4X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIG1fYWRkcl90IF9fdnRvYnVzKG1fYnVzaF90IGJ1c2gsIHZvaWQgKm0pCit7CisJdV9sb25nIGZsYWdzOworCW1fcG9vbF9zICptcDsKKwlpbnQgaGMgPSBWVE9CX0hBU0hfQ09ERShtKTsKKwltX3Z0b2JfcyAqdnAgPSBOVUxMOworCW1fYWRkcl90IGEgPSAoKG1fYWRkcl90KSBtKSAmIH5NRU1PX0NMVVNURVJfTUFTSzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuY3I1M2M4eHhfbG9jaywgZmxhZ3MpOworCW1wID0gX19fZ2V0X2RtYV9wb29sKGJ1c2gpOworCWlmIChtcCkgeworCQl2cCA9IG1wLT52dG9iW2hjXTsKKwkJd2hpbGUgKHZwICYmIChtX2FkZHJfdCkgdnAtPnZhZGRyICE9IGEpCisJCQl2cCA9IHZwLT5uZXh0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuY3I1M2M4eHhfbG9jaywgZmxhZ3MpOworCXJldHVybiB2cCA/IHZwLT5iYWRkciArICgoKG1fYWRkcl90KSBtKSAtIGEpIDogMDsKK30KKworI2RlZmluZSBfbV9jYWxsb2NfZG1hKG5wLCBzLCBuKQkJX19tX2NhbGxvY19kbWEobnAtPmRldiwgcywgbikKKyNkZWZpbmUgX21fZnJlZV9kbWEobnAsIHAsIHMsIG4pCV9fbV9mcmVlX2RtYShucC0+ZGV2LCBwLCBzLCBuKQorI2RlZmluZSBtX2NhbGxvY19kbWEocywgbikJCV9tX2NhbGxvY19kbWEobnAsIHMsIG4pCisjZGVmaW5lIG1fZnJlZV9kbWEocCwgcywgbikJCV9tX2ZyZWVfZG1hKG5wLCBwLCBzLCBuKQorI2RlZmluZSBfdnRvYnVzKG5wLCBwKQkJCV9fdnRvYnVzKG5wLT5kZXYsIHApCisjZGVmaW5lIHZ0b2J1cyhwKQkJCV92dG9idXMobnAsIHApCisKKy8qCisgKiAgRGVhbCB3aXRoIERNQSBtYXBwaW5nL3VubWFwcGluZy4KKyAqLworCisvKiBUbyBrZWVwIHRyYWNrIG9mIHRoZSBkbWEgbWFwcGluZyAoc2cvc2luZ2xlKSB0aGF0IGhhcyBiZWVuIHNldCAqLworI2RlZmluZSBfX2RhdGFfbWFwcGVkCVNDcC5waGFzZQorI2RlZmluZSBfX2RhdGFfbWFwcGluZwlTQ3AuaGF2ZV9kYXRhX2luCisKK3N0YXRpYyB2b2lkIF9fdW5tYXBfc2NzaV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN3aXRjaChjbWQtPl9fZGF0YV9tYXBwZWQpIHsKKwljYXNlIDI6CisJCWRtYV91bm1hcF9zZyhkZXYsIGNtZC0+YnVmZmVyLCBjbWQtPnVzZV9zZywKKwkJCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgY21kLT5fX2RhdGFfbWFwcGluZywKKwkJCQkgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlicmVhazsKKwl9CisJY21kLT5fX2RhdGFfbWFwcGVkID0gMDsKK30KKworc3RhdGljIHVfbG9uZyBfX21hcF9zY3NpX3NpbmdsZV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCWlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGNtZC0+cmVxdWVzdF9idWZmZXIsCisJCQkJIGNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwljbWQtPl9fZGF0YV9tYXBwZWQgPSAxOworCWNtZC0+X19kYXRhX21hcHBpbmcgPSBtYXBwaW5nOworCisJcmV0dXJuIG1hcHBpbmc7Cit9CisKK3N0YXRpYyBpbnQgX19tYXBfc2NzaV9zZ19kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWludCB1c2Vfc2c7CisKKwlpZiAoY21kLT51c2Vfc2cgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl1c2Vfc2cgPSBkbWFfbWFwX3NnKGRldiwgY21kLT5idWZmZXIsIGNtZC0+dXNlX3NnLAorCQkJY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJY21kLT5fX2RhdGFfbWFwcGVkID0gMjsKKwljbWQtPl9fZGF0YV9tYXBwaW5nID0gdXNlX3NnOworCisJcmV0dXJuIHVzZV9zZzsKK30KKworI2RlZmluZSB1bm1hcF9zY3NpX2RhdGEobnAsIGNtZCkJX191bm1hcF9zY3NpX2RhdGEobnAtPmRldiwgY21kKQorI2RlZmluZSBtYXBfc2NzaV9zaW5nbGVfZGF0YShucCwgY21kKQlfX21hcF9zY3NpX3NpbmdsZV9kYXRhKG5wLT5kZXYsIGNtZCkKKyNkZWZpbmUgbWFwX3Njc2lfc2dfZGF0YShucCwgY21kKQlfX21hcF9zY3NpX3NnX2RhdGEobnAtPmRldiwgY21kKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqCisqKglEcml2ZXIgc2V0dXAuCisqKgorKioJVGhpcyBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQgZnJvbSBsaW51eCBjb25maWcgCisqKglvcHRpb25zLiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBib290LXVwIGJ5IHRoZSBib290IAorKioJY29tbWFuZCBsaW5lLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBzdHJ1Y3QgbmNyX2RyaXZlcl9zZXR1cAorCWRyaXZlcl9zZXR1cAkJCT0gU0NTSV9OQ1JfRFJJVkVSX1NFVFVQOworCisjaWZkZWYJU0NTSV9OQ1JfQk9PVF9DT01NQU5EX0xJTkVfU1VQUE9SVAorc3RhdGljIHN0cnVjdCBuY3JfZHJpdmVyX3NldHVwCisJZHJpdmVyX3NhZmVfc2V0dXAgX19pbml0ZGF0YQk9IFNDU0lfTkNSX0RSSVZFUl9TQUZFX1NFVFVQOworI2VuZGlmCisKKyNkZWZpbmUgaW5pdHZlcmJvc2UgKGRyaXZlcl9zZXR1cC52ZXJib3NlKQorI2RlZmluZSBib290dmVyYm9zZSAobnAtPnZlcmJvc2UpCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJRHJpdmVyIHNldHVwIGZyb20gdGhlIGJvb3QgY29tbWFuZCBsaW5lCisqKgorKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lCUFSR19TRVAJJyAnCisjZWxzZQorI2RlZmluZQlBUkdfU0VQCScsJworI2VuZGlmCisKKyNkZWZpbmUgT1BUX1RBR1MJCTEKKyNkZWZpbmUgT1BUX01BU1RFUl9QQVJJVFkJMgorI2RlZmluZSBPUFRfU0NTSV9QQVJJVFkJCTMKKyNkZWZpbmUgT1BUX0RJU0NPTk5FQ1RJT04JNAorI2RlZmluZSBPUFRfU1BFQ0lBTF9GRUFUVVJFUwk1CisjZGVmaW5lIE9QVF9VTlVTRURfMQkJNgorI2RlZmluZSBPUFRfRk9SQ0VfU1lOQ19ORUdPCTcKKyNkZWZpbmUgT1BUX1JFVkVSU0VfUFJPQkUJOAorI2RlZmluZSBPUFRfREVGQVVMVF9TWU5DCTkKKyNkZWZpbmUgT1BUX1ZFUkJPU0UJCTEwCisjZGVmaW5lIE9QVF9ERUJVRwkJMTEKKyNkZWZpbmUgT1BUX0JVUlNUX01BWAkJMTIKKyNkZWZpbmUgT1BUX0xFRF9QSU4JCTEzCisjZGVmaW5lIE9QVF9NQVhfV0lERQkJMTQKKyNkZWZpbmUgT1BUX1NFVFRMRV9ERUxBWQkxNQorI2RlZmluZSBPUFRfRElGRl9TVVBQT1JUCTE2CisjZGVmaW5lIE9QVF9JUlFNCQkxNworI2RlZmluZSBPUFRfUENJX0ZJWF9VUAkJMTgKKyNkZWZpbmUgT1BUX0JVU19DSEVDSwkJMTkKKyNkZWZpbmUgT1BUX09QVElNSVpFCQkyMAorI2RlZmluZSBPUFRfUkVDT1ZFUlkJCTIxCisjZGVmaW5lIE9QVF9TQUZFX1NFVFVQCQkyMgorI2RlZmluZSBPUFRfVVNFX05WUkFNCQkyMworI2RlZmluZSBPUFRfRVhDTFVERQkJMjQKKyNkZWZpbmUgT1BUX0hPU1RfSUQJCTI1CisKKyNpZmRlZiBTQ1NJX05DUl9JQVJCX1NVUFBPUlQKKyNkZWZpbmUgT1BUX0lBUkIJCTI2CisjZW5kaWYKKworc3RhdGljIGNoYXIgc2V0dXBfdG9rZW5bXSBfX2luaXRkYXRhID0gCisJInRhZ3M6IiAgICJtcGFyOiIKKwkic3BhcjoiICAgImRpc2M6IgorCSJzcGVjZjoiICAidWx0cmE6IgorCSJmc246IiAgICAicmV2cHJvYjoiCisJInN5bmM6IiAgICJ2ZXJiOiIKKwkiZGVidWc6IiAgImJ1cnN0OiIKKwkibGVkOiIgICAgIndpZGU6IgorCSJzZXR0bGU6IiAiZGlmZjoiCisJImlycW06IiAgICJwY2lmaXg6IgorCSJidXNjaGs6IiAib3B0aW06IgorCSJyZWNvdmVyeToiCisJInNhZmU6IiAgICJudnJhbToiCisJImV4Y2w6IiAgICJob3N0aWQ6IgorI2lmZGVmIFNDU0lfTkNSX0lBUkJfU1VQUE9SVAorCSJpYXJiOiIKKyNlbmRpZgorCTsJLyogRE9OTk9UIFJFTU9WRSBUSElTICc7JyAqLworCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lCUFSR19TRVAJJyAnCisjZWxzZQorI2RlZmluZQlBUkdfU0VQCScsJworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGdldF9zZXR1cF90b2tlbihjaGFyICpwKQoreworCWNoYXIgKmN1ciA9IHNldHVwX3Rva2VuOworCWNoYXIgKnBjOworCWludCBpID0gMDsKKworCXdoaWxlIChjdXIgIT0gTlVMTCAmJiAocGMgPSBzdHJjaHIoY3VyLCAnOicpKSAhPSBOVUxMKSB7CisJCSsrcGM7CisJCSsraTsKKwkJaWYgKCFzdHJuY21wKHAsIGN1ciwgcGMgLSBjdXIpKQorCQkJcmV0dXJuIGk7CisJCWN1ciA9IHBjOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzeW01M2M4eHhfX3NldHVwKGNoYXIgKnN0cikKK3sKKyNpZmRlZiBTQ1NJX05DUl9CT09UX0NPTU1BTkRfTElORV9TVVBQT1JUCisJY2hhciAqY3VyID0gc3RyOworCWNoYXIgKnBjLCAqcHY7CisJaW50IGksIHZhbCwgYzsKKwlpbnQgeGkgPSAwOworCisJd2hpbGUgKGN1ciAhPSBOVUxMICYmIChwYyA9IHN0cmNocihjdXIsICc6JykpICE9IE5VTEwpIHsKKwkJY2hhciAqcGU7CisKKwkJdmFsID0gMDsKKwkJcHYgPSBwYzsKKwkJYyA9ICorK3B2OworCisJCWlmCShjID09ICduJykKKwkJCXZhbCA9IDA7CisJCWVsc2UgaWYJKGMgPT0gJ3knKQorCQkJdmFsID0gMTsKKwkJZWxzZQorCQkJdmFsID0gKGludCkgc2ltcGxlX3N0cnRvdWwocHYsICZwZSwgMCk7CisKKwkJc3dpdGNoIChnZXRfc2V0dXBfdG9rZW4oY3VyKSkgeworCQljYXNlIE9QVF9UQUdTOgorCQkJZHJpdmVyX3NldHVwLmRlZmF1bHRfdGFncyA9IHZhbDsKKwkJCWlmIChwZSAmJiAqcGUgPT0gJy8nKSB7CisJCQkJaSA9IDA7CisJCQkJd2hpbGUgKCpwZSAmJiAqcGUgIT0gQVJHX1NFUCAmJiAKKwkJCQkJaSA8IHNpemVvZihkcml2ZXJfc2V0dXAudGFnX2N0cmwpLTEpIHsKKwkJCQkJZHJpdmVyX3NldHVwLnRhZ19jdHJsW2krK10gPSAqcGUrKzsKKwkJCQl9CisJCQkJZHJpdmVyX3NldHVwLnRhZ19jdHJsW2ldID0gJ1wwJzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QVF9NQVNURVJfUEFSSVRZOgorCQkJZHJpdmVyX3NldHVwLm1hc3Rlcl9wYXJpdHkgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfU0NTSV9QQVJJVFk6CisJCQlkcml2ZXJfc2V0dXAuc2NzaV9wYXJpdHkgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRElTQ09OTkVDVElPTjoKKwkJCWRyaXZlcl9zZXR1cC5kaXNjb25uZWN0aW9uID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1NQRUNJQUxfRkVBVFVSRVM6CisJCQlkcml2ZXJfc2V0dXAuc3BlY2lhbF9mZWF0dXJlcyA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9GT1JDRV9TWU5DX05FR086CisJCQlkcml2ZXJfc2V0dXAuZm9yY2Vfc3luY19uZWdvID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1JFVkVSU0VfUFJPQkU6CisJCQlkcml2ZXJfc2V0dXAucmV2ZXJzZV9wcm9iZSA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9ERUZBVUxUX1NZTkM6CisJCQlkcml2ZXJfc2V0dXAuZGVmYXVsdF9zeW5jID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1ZFUkJPU0U6CisJCQlkcml2ZXJfc2V0dXAudmVyYm9zZSA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9ERUJVRzoKKwkJCWRyaXZlcl9zZXR1cC5kZWJ1ZyA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9CVVJTVF9NQVg6CisJCQlkcml2ZXJfc2V0dXAuYnVyc3RfbWF4ID0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0xFRF9QSU46CisJCQlkcml2ZXJfc2V0dXAubGVkX3BpbiA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9NQVhfV0lERToKKwkJCWRyaXZlcl9zZXR1cC5tYXhfd2lkZSA9IHZhbD8gMTowOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX1NFVFRMRV9ERUxBWToKKwkJCWRyaXZlcl9zZXR1cC5zZXR0bGVfZGVsYXkgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRElGRl9TVVBQT1JUOgorCQkJZHJpdmVyX3NldHVwLmRpZmZfc3VwcG9ydCA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9JUlFNOgorCQkJZHJpdmVyX3NldHVwLmlycW0gPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfUENJX0ZJWF9VUDoKKwkJCWRyaXZlcl9zZXR1cC5wY2lfZml4X3VwCT0gdmFsOworCQkJYnJlYWs7CisJCWNhc2UgT1BUX0JVU19DSEVDSzoKKwkJCWRyaXZlcl9zZXR1cC5idXNfY2hlY2sgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfT1BUSU1JWkU6CisJCQlkcml2ZXJfc2V0dXAub3B0aW1pemUgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfUkVDT1ZFUlk6CisJCQlkcml2ZXJfc2V0dXAucmVjb3ZlcnkgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfVVNFX05WUkFNOgorCQkJZHJpdmVyX3NldHVwLnVzZV9udnJhbSA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIE9QVF9TQUZFX1NFVFVQOgorCQkJbWVtY3B5KCZkcml2ZXJfc2V0dXAsICZkcml2ZXJfc2FmZV9zZXR1cCwKKwkJCQlzaXplb2YoZHJpdmVyX3NldHVwKSk7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfRVhDTFVERToKKwkJCWlmICh4aSA8IFNDU0lfTkNSX01BWF9FWENMVURFUykKKwkJCQlkcml2ZXJfc2V0dXAuZXhjbHVkZXNbeGkrK10gPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBPUFRfSE9TVF9JRDoKKwkJCWRyaXZlcl9zZXR1cC5ob3N0X2lkID0gdmFsOworCQkJYnJlYWs7CisjaWZkZWYgU0NTSV9OQ1JfSUFSQl9TVVBQT1JUCisJCWNhc2UgT1BUX0lBUkI6CisJCQlkcml2ZXJfc2V0dXAuaWFyYiA9IHZhbDsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlwcmludGsoInN5bTUzYzh4eF9zZXR1cDogdW5leHBlY3RlZCBib290IG9wdGlvbiAnJS4qcycgaWdub3JlZFxuIiwgKGludCkocGMtY3VyKzEpLCBjdXIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGN1ciA9IHN0cmNocihjdXIsIEFSR19TRVApKSAhPSBOVUxMKQorCQkJKytjdXI7CisJfQorI2VuZGlmIC8qIFNDU0lfTkNSX0JPT1RfQ09NTUFORF9MSU5FX1NVUFBPUlQgKi8KKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKgorKioJR2V0IGRldmljZSBxdWV1ZSBkZXB0aCBmcm9tIGJvb3QgY29tbWFuZCBsaW5lLgorKioKKyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNkZWZpbmUgREVGX0RFUFRICShkcml2ZXJfc2V0dXAuZGVmYXVsdF90YWdzKQorI2RlZmluZSBBTExfVEFSR0VUUwktMgorI2RlZmluZSBOT19UQVJHRVQJLTEKKyNkZWZpbmUgQUxMX0xVTlMJLTIKKyNkZWZpbmUgTk9fTFVOCQktMQorCitzdGF0aWMgaW50IGRldmljZV9xdWV1ZV9kZXB0aChpbnQgdW5pdCwgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlpbnQgYywgaCwgdCwgdSwgdjsKKwljaGFyICpwID0gZHJpdmVyX3NldHVwLnRhZ19jdHJsOworCWNoYXIgKmVwOworCisJaCA9IC0xOworCXQgPSBOT19UQVJHRVQ7CisJdSA9IE5PX0xVTjsKKwl3aGlsZSAoKGMgPSAqcCsrKSAhPSAwKSB7CisJCXYgPSBzaW1wbGVfc3RydG91bChwLCAmZXAsIDApOworCQlzd2l0Y2goYykgeworCQljYXNlICcvJzoKKwkJCSsraDsKKwkJCXQgPSBBTExfVEFSR0VUUzsKKwkJCXUgPSBBTExfTFVOUzsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWlmICh0ICE9IHRhcmdldCkKKwkJCQl0ID0gKHRhcmdldCA9PSB2KSA/IHYgOiBOT19UQVJHRVQ7CisJCQl1ID0gQUxMX0xVTlM7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlpZiAodSAhPSBsdW4pCisJCQkJdSA9IChsdW4gPT0gdikgPyB2IDogTk9fTFVOOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJaWYgKGggPT0gdW5pdCAmJgorCQkJCSh0ID09IEFMTF9UQVJHRVRTIHx8IHQgPT0gdGFyZ2V0KSAmJgorCQkJCSh1ID09IEFMTF9MVU5TICAgIHx8IHUgPT0gbHVuKSkKKwkJCQlyZXR1cm4gdjsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCXQgPSBBTExfVEFSR0VUUzsKKwkJCXUgPSBBTExfTFVOUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcCA9IGVwOworCX0KKwlyZXR1cm4gREVGX0RFUFRIOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF9kZWZzLmggYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRhZTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF9kZWZzLmgKQEAgLTAsMCArMSwxMzMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgSGlnaCBQZXJmb3JtYW5jZSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU3ltYmlvcyA1M0M4OTYgY29udHJvbGxlci4KKyoqCisqKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgIEdlcmFyZCBSb3VkaWVyIDxncm91ZGllckBmcmVlLmZyPgorKioKKyoqICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIGFsbCB0aGUgU3ltYmlvcyA1M0M4WFggY29udHJvbGxlciBmYW1pbHksIAorKiogIGV4Y2VwdCA1M0M4MTAgcmV2aXNpb25zIDwgMTYsIDUzQzgyNSByZXZpc2lvbnMgPCAxNiBhbmQgYWxsIAorKiogIHJldmlzaW9ucyBvZiA1M0M4MTUgY29udHJvbGxlcnMuCisqKgorKiogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBMaW51eCBwb3J0IG9mIHRoZSBGcmVlQlNEIG5jciBkcml2ZXIuCisqKiAKKyoqICBDb3B5cmlnaHQgKEMpIDE5OTQgIFdvbGZnYW5nIFN0YW5nbG1laWVyCisqKiAgCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKiAgCisqKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgVGhlIExpbnV4IHBvcnQgb2YgdGhlIEZyZWVCU0QgbmNyIGRyaXZlciBoYXMgYmVlbiBhY2hpZXZlZCBpbiAKKyoqICBub3ZlbWJlciAxOTk1IGJ5OgorKioKKyoqICAgICAgICAgIEdlcmFyZCBSb3VkaWVyICAgICAgICAgICAgICA8Z3JvdWRpZXJAZnJlZS5mcj4KKyoqCisqKiAgQmVpbmcgZ2l2ZW4gdGhhdCB0aGlzIGRyaXZlciBvcmlnaW5hdGVzIGZyb20gdGhlIEZyZWVCU0QgdmVyc2lvbiwgYW5kCisqKiAgaW4gb3JkZXIgdG8ga2VlcCBzeW5lcmd5IG9uIGJvdGgsIGFueSBzdWdnZXN0ZWQgZW5oYW5jZW1lbnRzIGFuZCBjb3JyZWN0aW9ucworKiogIHJlY2VpdmVkIG9uIExpbnV4IGFyZSBhdXRvbWF0aWNhbGx5IGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBmb3IgdGhlIEZyZWVCU0QgCisqKiAgdmVyc2lvbi4KKyoqCisqKiAgVGhlIG9yaWdpbmFsIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuIGZvciAzODZic2QgYW5kIEZyZWVCU0QgYnkKKyoqICAgICAgICAgIFdvbGZnYW5nIFN0YW5nbG1laWVyICAgICAgICA8d29sZkBjb2xvZ25lLmRlPgorKiogICAgICAgICAgU3RlZmFuIEVzc2VyICAgICAgICAgICAgICAgIDxzZUBtaS5VbmktS29lbG4uZGU+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBNYWpvciBjb250cmlidXRpb25zOgorKiogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIE5WUkFNIGRldGVjdGlvbiBhbmQgcmVhZGluZy4KKyoqICAgIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIFdhbHRoYW0gPGRvcm1vdXNlQGZhcnNyb2J0LmRlbW9uLmNvLnVrPgorKioKKyoqICBBZGRlZCBzdXBwb3J0IGZvciBNSVBTIGJpZyBlbmRpYW4gc3lzdGVtcy4KKyoqICAgIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQorKiogICAgQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqICBBZGRlZCBzdXBwb3J0IGZvciBIUCBQQVJJU0MgYmlnIGVuZGlhbiBzeXN0ZW1zLgorKiogICAgQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgU1lNNTNDOFhYX0RFRlNfSAorI2RlZmluZSBTWU01M0M4WFhfREVGU19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyoqCUlmIHlvdSB3YW50IGEgZHJpdmVyIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCBkb25ub3QgZGVmaW5lIHRoZSAKKyoqCWZvbGxvd2luZyBvcHRpb25zLgorKi8KKyNkZWZpbmUgU0NTSV9OQ1JfQk9PVF9DT01NQU5EX0xJTkVfU1VQUE9SVAorI2RlZmluZSBTQ1NJX05DUl9ERUJVR19JTkZPX1NVUFBPUlQKKworLyoKKyoqCVRvIGRpc2FibGUgaW50ZWdyaXR5IGNoZWNraW5nLCBkbyBub3QgZGVmaW5lIHRoZSAKKyoqCWZvbGxvd2luZyBvcHRpb24uCisqLworI2lmZGVmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9JTlRFR1JJVFlfQ0hFQ0sKKyMJZGVmaW5lIFNDU0lfTkNSX0VOQUJMRV9JTlRFR1JJVFlfQ0hFQ0sKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqIFRha2UgaW50byBhY2NvdW50IGtlcm5lbCBjb25maWd1cmVkIHBhcmFtZXRlcnMuCisqKiBNb3N0IG9mIHRoZXNlIG9wdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gYXQgc3RhcnR1cCBieSBhIGNvbW1hbmQgbGluZS4KKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAqIEZvciBVbHRyYTIgYW5kIFVsdHJhMyBTQ1NJIHN1cHBvcnQgb3B0aW9uLCB1c2Ugc3BlY2lhbCBmZWF0dXJlcy4gCisgKgorICogVmFsdWUgKGRlZmF1bHQpIG1lYW5zOgorICoJYml0IDAgOiBhbGwgZmVhdHVyZXMgZW5hYmxlZCwgZXhjZXB0OgorICoJCWJpdCAxIDogUENJIFdyaXRlIEFuZCBJbnZhbGlkYXRlLgorICoJCWJpdCAyIDogRGF0YSBQaGFzZSBNaXNtYXRjaCBoYW5kbGluZyBmcm9tIFNDUklQVFMuCisgKgorICogVXNlIGJvb3Qgb3B0aW9ucyBuY3I1M2M4eHg9c3BlY2Y6MSBpZiB5b3Ugd2FudCBhbGwgY2hpcCBmZWF0dXJlcyB0byBiZSAKKyAqIGVuYWJsZWQgYnkgdGhlIGRyaXZlci4KKyAqLworI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9TUEVDSUFMX0ZFQVRVUkVTCQkoMykKKworI2RlZmluZSBTQ1NJX05DUl9NQVhfU1lOQwkJCSg4MCkKKworLyoKKyAqIEFsbG93IHRhZ3MgZnJvbSAyIHRvIDI1NiwgZGVmYXVsdCA4CisgKi8KKyNpZmRlZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfTUFYX1RBR1MKKyNpZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfTUFYX1RBR1MgPCAyCisjZGVmaW5lIFNDU0lfTkNSX01BWF9UQUdTCSgyKQorI2VsaWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX01BWF9UQUdTID4gMjU2CisjZGVmaW5lIFNDU0lfTkNSX01BWF9UQUdTCSgyNTYpCisjZWxzZQorI2RlZmluZQlTQ1NJX05DUl9NQVhfVEFHUwlDT05GSUdfU0NTSV9OQ1I1M0M4WFhfTUFYX1RBR1MKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgU0NTSV9OQ1JfTUFYX1RBR1MJKDgpCisjZW5kaWYKKworLyoKKyAqIEFsbG93IHRhZ2dlZCBjb21tYW5kIHF1ZXVpbmcgc3VwcG9ydCBpZiBjb25maWd1cmVkIHdpdGggZGVmYXVsdCBudW1iZXIgCisgKiBvZiB0YWdzIHNldCB0byBtYXggKHNlZSBhYm92ZSkuCisgKi8KKyNpZmRlZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfREVGQVVMVF9UQUdTCisjZGVmaW5lCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfVEFHUwlDT05GSUdfU0NTSV9OQ1I1M0M4WFhfREVGQVVMVF9UQUdTCisjZWxpZglkZWZpbmVkIENPTkZJR19TQ1NJX05DUjUzQzhYWF9UQUdHRURfUVVFVUUKKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9UQUdTCVNDU0lfTkNSX01BWF9UQUdTCisjZWxzZQorI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1RBR1MJKDApCisjZW5kaWYKKworLyoKKyAqIEltbWVkaWF0ZSBhcmJpdHJhdGlvbgorICovCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9OQ1I1M0M4WFhfSUFSQikKKyNkZWZpbmUgU0NTSV9OQ1JfSUFSQl9TVVBQT1JUCisjZW5kaWYKKworLyoKKyAqIFN5bmMgdHJhbnNmZXIgZnJlcXVlbmN5IGF0IHN0YXJ0dXAuCisgKiBBbGxvdyBmcm9tIDVNaHogdG8gODBNaHogZGVmYXVsdCAyMCBNaHouCisgKi8KKyNpZm5kZWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMKKyNkZWZpbmUJQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMJKDIwKQorI2VsaWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMgPiBTQ1NJX05DUl9NQVhfU1lOQworI3VuZGVmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DCisjZGVmaW5lCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DCVNDU0lfTkNSX01BWF9TWU5DCisjZW5kaWYKKworI2lmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DID09IDAKKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9TWU5DCSgyNTUpCisjZWxpZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQyA8PSA1CisjZGVmaW5lCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfU1lOQwkoNTApCisjZWxpZglDT05GSUdfU0NTSV9OQ1I1M0M4WFhfU1lOQyA8PSAyMAorI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1NZTkMJKDI1MC8oQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMpKQorI2VsaWYJQ09ORklHX1NDU0lfTkNSNTNDOFhYX1NZTkMgPD0gMzMKKyNkZWZpbmUJU0NTSV9OQ1JfU0VUVVBfREVGQVVMVF9TWU5DCSgxMSkKKyNlbGlmCUNPTkZJR19TQ1NJX05DUjUzQzhYWF9TWU5DIDw9IDQwCisjZGVmaW5lCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfU1lOQwkoMTApCisjZWxzZQorI2RlZmluZQlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1NZTkMgCSg5KQorI2VuZGlmCisKKy8qCisgKiBEaXNhbGxvdyBkaXNjb25uZWN0aW9ucyBhdCBib290LXVwCisgKi8KKyNpZmRlZiBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfTk9fRElTQ09OTkVDVAorI2RlZmluZSBTQ1NJX05DUl9TRVRVUF9ESVNDT05ORUNUSU9OCSgwKQorI2Vsc2UKKyNkZWZpbmUgU0NTSV9OQ1JfU0VUVVBfRElTQ09OTkVDVElPTgkoMSkKKyNlbmRpZgorCisvKgorICogRm9yY2Ugc3luY2hyb25vdXMgbmVnb3RpYXRpb24gZm9yIGFsbCB0YXJnZXRzCisgKi8KKyNpZmRlZiBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfRk9SQ0VfU1lOQ19ORUdPCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX0ZPUkNFX1NZTkNfTkVHTwkoMSkKKyNlbHNlCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX0ZPUkNFX1NZTkNfTkVHTwkoMCkKKyNlbmRpZgorCisvKgorICogRGlzYWJsZSBtYXN0ZXIgcGFyaXR5IGNoZWNraW5nIChmbGF3ZWQgaGFyZHdhcmVzIG5lZWQgdGhhdCkKKyAqLworI2lmZGVmIENPTkZJR19TQ1NJX05DUjUzQzhYWF9ESVNBQkxFX01QQVJJVFlfQ0hFQ0sKKyNkZWZpbmUgU0NTSV9OQ1JfU0VUVVBfTUFTVEVSX1BBUklUWQkoMCkKKyNlbHNlCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX01BU1RFUl9QQVJJVFkJKDEpCisjZW5kaWYKKworLyoKKyAqIERpc2FibGUgc2NzaSBwYXJpdHkgY2hlY2tpbmcgKGZsYXdlZCBkZXZpY2VzIG1heSBuZWVkIHRoYXQpCisgKi8KKyNpZmRlZiBDT05GSUdfU0NTSV9OQ1I1M0M4WFhfRElTQUJMRV9QQVJJVFlfQ0hFQ0sKKyNkZWZpbmUgU0NTSV9OQ1JfU0VUVVBfU0NTSV9QQVJJVFkJKDApCisjZWxzZQorI2RlZmluZSBTQ1NJX05DUl9TRVRVUF9TQ1NJX1BBUklUWQkoMSkKKyNlbmRpZgorCisvKgorICogU2V0dGxlIHRpbWUgYWZ0ZXIgcmVzZXQgYXQgYm9vdC11cAorICovCisjZGVmaW5lIFNDU0lfTkNSX1NFVFVQX1NFVFRMRV9USU1FCSgyKQorCisvKgorKioJQnJpZGdlIHF1aXJrcyB3b3JrLWFyb3VuZCBvcHRpb24gZGVmYXVsdGVkIHRvIDEuCisqLworI2lmbmRlZglTQ1NJX05DUl9QQ0lRX1dPUktfQVJPVU5EX09QVAorI2RlZmluZQlTQ1NJX05DUl9QQ0lRX1dPUktfQVJPVU5EX09QVAkxCisjZW5kaWYKKworLyoKKyoqCVdvcmstYXJvdW5kIGNvbW1vbiBicmlkZ2UgbWlzYmVoYXZpb3VyLgorKioKKyoqCS0gRG8gbm90IGZsdXNoIHBvc3RlZCB3cml0ZXMgaW4gdGhlIG9wcG9zaXRlIAorKioJICBkaXJlY3Rpb24gb24gcmVhZC4KKyoqCS0gTWF5IHJlb3JkZXIgRE1BIHdyaXRlcyB0byBtZW1vcnkuCisqKgorKioJVGhpcyBvcHRpb24gc2hvdWxkIG5vdCBhZmZlY3QgcGVyZm9ybWFuY2VzIAorKioJc2lnbmlmaWNhbnRseSwgc28gaXQgaXMgdGhlIGRlZmF1bHQuCisqLworI2lmCVNDU0lfTkNSX1BDSVFfV09SS19BUk9VTkRfT1BUID09IDEKKyNkZWZpbmUJU0NTSV9OQ1JfUENJUV9NQVlfTk9UX0ZMVVNIX1BXX1VQU1RSRUFNCisjZGVmaW5lCVNDU0lfTkNSX1BDSVFfTUFZX1JFT1JERVJfV1JJVEVTCisjZGVmaW5lCVNDU0lfTkNSX1BDSVFfTUFZX01JU1NfQ09NUExFVElPTlMKKworLyoKKyoqCVNhbWUgYXMgb3B0aW9uIDEsIGJ1dCBhbHNvIGRlYWwgd2l0aCAKKyoqCW1pc2NvbmZpZ3VyZWQgaW50ZXJydXB0cy4KKyoqCisqKgktIEVkZ2UgdHJpZ2dlcnJlZCBpbnN0ZWFkIG9mIGxldmVsIHNlbnNpdGl2ZS4KKyoqCS0gTm8gaW50ZXJydXB0IGxpbmUgY29ubmVjdGVkLgorKioJLSBJUlEgbnVtYmVyIG1pc2NvbmZpZ3VyZWQuCisqKgkKKyoqCUlmIG5vIGludGVycnVwdCBpcyBkZWxpdmVyZWQsIHRoZSBkcml2ZXIgd2lsbCAKKyoqCWNhdGNoIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9ucyAxMCB0aW1lcyBwZXIgCisqKglzZWNvbmQuIE5vIG5lZWQgdG8gc2F5IHRoYXQgdGhpcyBvcHRpb24gaXMgCisqKglub3QgcmVjb21tZW5kZWQuCisqLworI2VsaWYJU0NTSV9OQ1JfUENJUV9XT1JLX0FST1VORF9PUFQgPT0gMgorI2RlZmluZQlTQ1NJX05DUl9QQ0lRX01BWV9OT1RfRkxVU0hfUFdfVVBTVFJFQU0KKyNkZWZpbmUJU0NTSV9OQ1JfUENJUV9NQVlfUkVPUkRFUl9XUklURVMKKyNkZWZpbmUJU0NTSV9OQ1JfUENJUV9NQVlfTUlTU19DT01QTEVUSU9OUworI2RlZmluZQlTQ1NJX05DUl9QQ0lRX0JST0tFTl9JTlRSCisKKy8qCisqKglTb21lIGJyaWRnZSBkZXNpZ25lcnMgZGVjaWRlZCB0byBmbHVzaCAKKyoqCWV2ZXJ5dGhpbmcgcHJpb3IgdG8gZGVsaXZlciB0aGUgaW50ZXJydXB0LgorKioJVGhpcyBvcHRpb24gdHJpZXMgdG8gZGVhbCB3aXRoIHN1Y2ggYSAKKyoqCWJlaGF2aW91ci4KKyovCisjZWxpZglTQ1NJX05DUl9QQ0lRX1dPUktfQVJPVU5EX09QVCA9PSAzCisjZGVmaW5lCVNDU0lfTkNSX1BDSVFfU1lOQ19PTl9JTlRSCisjZW5kaWYKKworLyoKKyoqCU90aGVyIHBhcmFtZXRlcnMgbm90IGNvbmZpZ3VyYWJsZSB3aXRoICJtYWtlIGNvbmZpZyIKKyoqCUF2b2lkIHRvIGNoYW5nZSB0aGVzZSBjb25zdGFudHMsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisqLworCisjZGVmaW5lIFNDU0lfTkNSX0FMV0FZU19TSU1QTEVfVEFHCisjZGVmaW5lIFNDU0lfTkNSX01BWF9TQ0FUVEVSCSgxMjcpCisjZGVmaW5lIFNDU0lfTkNSX01BWF9UQVJHRVQJKDE2KQorCisvKgorKiogICBDb21wdXRlIHNvbWUgZGVzaXJhYmxlIHZhbHVlIGZvciBDQU5fUVVFVUUgCisqKiAgIGFuZCBDTURfUEVSX0xVTi4KKyoqICAgVGhlIGRyaXZlciB3aWxsIHVzZSBsb3dlciB2YWx1ZXMgaWYgdGhlc2UgCisqKiAgIG9uZXMgYXBwZWFyIHRvIGJlIHRvbyBsYXJnZS4KKyovCisjZGVmaW5lIFNDU0lfTkNSX0NBTl9RVUVVRQkoOCpTQ1NJX05DUl9NQVhfVEFHUyArIDIqU0NTSV9OQ1JfTUFYX1RBUkdFVCkKKyNkZWZpbmUgU0NTSV9OQ1JfQ01EX1BFUl9MVU4JKFNDU0lfTkNSX01BWF9UQUdTKQorCisjZGVmaW5lIFNDU0lfTkNSX1NHX1RBQkxFU0laRQkoU0NTSV9OQ1JfTUFYX1NDQVRURVIpCisjZGVmaW5lIFNDU0lfTkNSX1RJTUVSX0lOVEVSVkFMCShIWikKKworI2lmIDEgLyogZGVmaW5lZCBDT05GSUdfU0NTSV9NVUxUSV9MVU4gKi8KKyNkZWZpbmUgU0NTSV9OQ1JfTUFYX0xVTgkoMTYpCisjZWxzZQorI2RlZmluZSBTQ1NJX05DUl9NQVhfTFVOCSgxKQorI2VuZGlmCisKKy8qCisqKglUaGVzZSBzaW1wbGUgbWFjcm9zIGxpbWl0IGV4cHJlc3Npb24gaW52b2x2aW5nIAorKioJa2VybmVsIHRpbWUgdmFsdWVzIChqaWZmaWVzKSB0byBzb21lIHRoYXQgaGF2ZSAKKyoqCWNoYW5jZSBub3QgdG8gYmUgdG9vIG11Y2ggaW5jb3JyZWN0LiA6LSkKKyovCisjZGVmaW5lIGt0aW1lX2dldChvKQkJKGppZmZpZXMgKyAodV9sb25nKSBvKQorI2RlZmluZSBrdGltZV9leHAoYikJCSgobG9uZykoamlmZmllcykgLSAobG9uZykoYikgPj0gMCkKKyNkZWZpbmUga3RpbWVfZGlmKGEsIGIpCQkoKGxvbmcpKGEpIC0gKGxvbmcpKGIpKQorLyogVGhlc2Ugb25lcyBhcmUgbm90IHVzZWQgaW4gdGhpcyBkcml2ZXIgKi8KKyNkZWZpbmUga3RpbWVfYWRkKGEsIG8pCQkoKGEpICsgKHVfbG9uZykobykpCisjZGVmaW5lIGt0aW1lX3N1YihhLCBvKQkJKChhKSAtICh1X2xvbmcpKG8pKQorCisKKy8qCisgKiAgSU8gZnVuY3Rpb25zIGRlZmluaXRpb24gZm9yIGJpZy9saXR0bGUgZW5kaWFuIENQVSBzdXBwb3J0LgorICogIEZvciBub3csIHRoZSBOQ1IgaXMgb25seSBzdXBwb3J0ZWQgaW4gbGl0dGxlIGVuZGlhbiBhZGRyZXNzaW5nIG1vZGUsIAorICovCisKKyNpZmRlZglfX0JJR19FTkRJQU4KKworI2RlZmluZQlpbndfbDJiCQlpbncKKyNkZWZpbmUJaW5sX2wyYgkJaW5sCisjZGVmaW5lCW91dHdfYjJsCW91dHcKKyNkZWZpbmUJb3V0bF9iMmwJb3V0bAorCisjZGVmaW5lCXJlYWRiX3JhdwlyZWFkYgorI2RlZmluZQl3cml0ZWJfcmF3CXdyaXRlYgorCisjaWYgZGVmaW5lZChTQ1NJX05DUl9CSUdfRU5ESUFOKQorI2RlZmluZQlyZWFkd19sMmIJX19yYXdfcmVhZHcKKyNkZWZpbmUJcmVhZGxfbDJiCV9fcmF3X3JlYWRsCisjZGVmaW5lCXdyaXRld19iMmwJX19yYXdfd3JpdGV3CisjZGVmaW5lCXdyaXRlbF9iMmwJX19yYXdfd3JpdGVsCisjZGVmaW5lCXJlYWR3X3JhdwlfX3Jhd19yZWFkdworI2RlZmluZQlyZWFkbF9yYXcJX19yYXdfcmVhZGwKKyNkZWZpbmUJd3JpdGV3X3JhdwlfX3Jhd193cml0ZXcKKyNkZWZpbmUJd3JpdGVsX3JhdwlfX3Jhd193cml0ZWwKKyNlbHNlCS8qIE90aGVyIGJpZy1lbmRpYW4gKi8KKyNkZWZpbmUJcmVhZHdfbDJiCXJlYWR3CisjZGVmaW5lCXJlYWRsX2wyYglyZWFkbAorI2RlZmluZQl3cml0ZXdfYjJsCXdyaXRldworI2RlZmluZQl3cml0ZWxfYjJsCXdyaXRlbAorI2RlZmluZQlyZWFkd19yYXcJcmVhZHcKKyNkZWZpbmUJcmVhZGxfcmF3CXJlYWRsCisjZGVmaW5lCXdyaXRld19yYXcJd3JpdGV3CisjZGVmaW5lCXdyaXRlbF9yYXcJd3JpdGVsCisjZW5kaWYKKworI2Vsc2UJLyogbGl0dGxlIGVuZGlhbiAqLworCisjZGVmaW5lCWlud19yYXcJCWludworI2RlZmluZQlpbmxfcmF3CQlpbmwKKyNkZWZpbmUJb3V0d19yYXcJb3V0dworI2RlZmluZQlvdXRsX3JhdwlvdXRsCisKKyNkZWZpbmUJcmVhZGJfcmF3CXJlYWRiCisjZGVmaW5lCXJlYWR3X3JhdwlyZWFkdworI2RlZmluZQlyZWFkbF9yYXcJcmVhZGwKKyNkZWZpbmUJd3JpdGViX3Jhdwl3cml0ZWIKKyNkZWZpbmUJd3JpdGV3X3Jhdwl3cml0ZXcKKyNkZWZpbmUJd3JpdGVsX3Jhdwl3cml0ZWwKKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX2hwcGFfXykgJiYgIWRlZmluZWQoX19taXBzX18pCisjaWZkZWYJU0NTSV9OQ1JfQklHX0VORElBTgorI2Vycm9yCSJUaGUgTkNSIGluIEJJRyBFTkRJQU4gYWRkcmVzc2luZyBtb2RlIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQiCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1FTU9SWV9CQVJSSUVSKCkJbWIoKQorCisKKy8qCisgKiAgSWYgdGhlIE5DUiB1c2VzIGJpZyBlbmRpYW4gYWRkcmVzc2luZyBtb2RlIG92ZXIgdGhlIAorICogIFBDSSwgYWN0dWFsIGlvIHJlZ2lzdGVyIGFkZHJlc3NlcyBmb3IgYnl0ZSBhbmQgd29yZCAKKyAqICBhY2Nlc3NlcyBtdXN0IGJlIGNoYW5nZWQgYWNjb3JkaW5nIHRvIGxhbmUgcm91dGluZy4KKyAqICBCdHcsIG5jcl9vZmZiKCkgYW5kIG5jcl9vZmZ3KCkgbWFjcm9zIG9ubHkgYXBwbHkgdG8gCisgKiAgY29uc3RhbnRzIGFuZCBzbyBkb25ub3QgZ2VuZXJhdGUgYmxvYXRlZCBjb2RlLgorICovCisKKyNpZglkZWZpbmVkKFNDU0lfTkNSX0JJR19FTkRJQU4pCisKKyNkZWZpbmUgbmNyX29mZmIobykJKCgobykmfjMpKygofigobykmMykpJjMpKQorI2RlZmluZSBuY3Jfb2ZmdyhvKQkoKChvKSZ+MykrKCh+KChvKSYzKSkmMikpCisKKyNlbHNlCisKKyNkZWZpbmUgbmNyX29mZmIobykJKG8pCisjZGVmaW5lIG5jcl9vZmZ3KG8pCShvKQorCisjZW5kaWYKKworLyoKKyAqICBJZiB0aGUgQ1BVIGFuZCB0aGUgTkNSIHVzZSBzYW1lIGVuZGlhbi1uZXNzIGFkZHJlc3NpbmcsCisgKiAgbm8gYnl0ZSByZW9yZGVyaW5nIGlzIG5lZWRlZCBmb3Igc2NyaXB0IHBhdGNoaW5nLgorICogIE1hY3JvIGNwdV90b19zY3IoKSBpcyB0byBiZSB1c2VkIGZvciBzY3JpcHQgcGF0Y2hpbmcuCisgKiAgTWFjcm8gc2NyX3RvX2NwdSgpIGlzIHRvIGJlIHVzZWQgZm9yIGdldHRpbmcgYSBEV09SRCAKKyAqICBmcm9tIHRoZSBzY3JpcHQuCisgKi8KKworI2lmCWRlZmluZWQoX19CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZChTQ1NJX05DUl9CSUdfRU5ESUFOKQorCisjZGVmaW5lIGNwdV90b19zY3IoZHcpCWNwdV90b19sZTMyKGR3KQorI2RlZmluZSBzY3JfdG9fY3B1KGR3KQlsZTMyX3RvX2NwdShkdykKKworI2VsaWYJZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoU0NTSV9OQ1JfQklHX0VORElBTikKKworI2RlZmluZSBjcHVfdG9fc2NyKGR3KQljcHVfdG9fYmUzMihkdykKKyNkZWZpbmUgc2NyX3RvX2NwdShkdykJYmUzMl90b19jcHUoZHcpCisKKyNlbHNlCisKKyNkZWZpbmUgY3B1X3RvX3NjcihkdykJKGR3KQorI2RlZmluZSBzY3JfdG9fY3B1KGR3KQkoZHcpCisKKyNlbmRpZgorCisvKgorICogIEFjY2VzcyB0byB0aGUgY29udHJvbGxlciBjaGlwLgorICoKKyAqICBJZiB0aGUgQ1BVIGFuZCB0aGUgTkNSIHVzZSBzYW1lIGVuZGlhbi1uZXNzIGFkZHJlc3NpbmcsCisgKiAgbm8gYnl0ZSByZW9yZGVyaW5nIGlzIG5lZWRlZCBmb3IgYWNjZXNzaW5nIGNoaXAgaW8gCisgKiAgcmVnaXN0ZXJzLiBGdW5jdGlvbnMgc3VmZml4ZWQgYnkgJ19yYXcnIGFyZSBhc3N1bWVkIAorICogIHRvIGFjY2VzcyB0aGUgY2hpcCBvdmVyIHRoZSBQQ0kgd2l0aG91dCBkb2luZyBieXRlIAorICogIHJlb3JkZXJpbmcuIEZ1bmN0aW9ucyBzdWZmaXhlZCBieSAnX2wyYicgYXJlIAorICogIGFzc3VtZWQgdG8gcGVyZm9ybSBsaXR0bGUtZW5kaWFuIHRvIGJpZy1lbmRpYW4gYnl0ZSAKKyAqICByZW9yZGVyaW5nLCB0aG9zZSBzdWZmaXhlZCBieSAnX2IybCcgYmxhaCwgYmxhaCwKKyAqICBibGFoLCAuLi4KKyAqLworCisvKgorICogIE1FTU9SWSBtYXBwZWQgSU8gaW5wdXQgLyBvdXRwdXQKKyAqLworCisjZGVmaW5lIElOQl9PRkYobykJCXJlYWRiX3JhdygoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIG5jcl9vZmZiKG8pKQorI2RlZmluZSBPVVRCX09GRihvLCB2YWwpCXdyaXRlYl9yYXcoKHZhbCksIChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZmIobykpCisKKyNpZglkZWZpbmVkKF9fQklHX0VORElBTikgJiYgIWRlZmluZWQoU0NTSV9OQ1JfQklHX0VORElBTikKKworI2RlZmluZSBJTldfT0ZGKG8pCQlyZWFkd19sMmIoKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkKKyNkZWZpbmUgSU5MX09GRihvKQkJcmVhZGxfbDJiKChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgKG8pKQorCisjZGVmaW5lIE9VVFdfT0ZGKG8sIHZhbCkJd3JpdGV3X2IybCgodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkKKyNkZWZpbmUgT1VUTF9PRkYobywgdmFsKQl3cml0ZWxfYjJsKCh2YWwpLCAoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIChvKSkKKworI2VsaWYJZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoU0NTSV9OQ1JfQklHX0VORElBTikKKworI2RlZmluZSBJTldfT0ZGKG8pCQlyZWFkd19iMmwoKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkKKyNkZWZpbmUgSU5MX09GRihvKQkJcmVhZGxfYjJsKChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgKG8pKQorCisjZGVmaW5lIE9VVFdfT0ZGKG8sIHZhbCkJd3JpdGV3X2wyYigodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkKKyNkZWZpbmUgT1VUTF9PRkYobywgdmFsKQl3cml0ZWxfbDJiKCh2YWwpLCAoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIChvKSkKKworI2Vsc2UKKworI2lmZGVmIENPTkZJR19TQ1NJX05DUjUzQzhYWF9OT19XT1JEX1RSQU5TRkVSUworLyogT25seSA4IG9yIDMyIGJpdCB0cmFuc2ZlcnMgYWxsb3dlZCAqLworI2RlZmluZSBJTldfT0ZGKG8pCQkocmVhZGIoKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSkgPDwgOCB8IHJlYWRiKChjaGFyIF9faW9tZW0gKilucC0+cmVnICsgbmNyX29mZncobykgKyAxKSkKKyNlbHNlCisjZGVmaW5lIElOV19PRkYobykJCXJlYWR3X3JhdygoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIG5jcl9vZmZ3KG8pKQorI2VuZGlmCisjZGVmaW5lIElOTF9PRkYobykJCXJlYWRsX3JhdygoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIChvKSkKKworI2lmZGVmIENPTkZJR19TQ1NJX05DUjUzQzhYWF9OT19XT1JEX1RSQU5TRkVSUworLyogT25seSA4IG9yIDMyIGJpdCB0cmFuc2ZlcnMgYWxsb3dlZCAqLworI2RlZmluZSBPVVRXX09GRihvLCB2YWwpCWRvIHsgd3JpdGViKChjaGFyKSgodmFsKSA+PiA4KSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSk7IHdyaXRlYigoY2hhcikodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyBuY3Jfb2ZmdyhvKSArIDEpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgT1VUV19PRkYobywgdmFsKQl3cml0ZXdfcmF3KCh2YWwpLCAoY2hhciBfX2lvbWVtICopbnAtPnJlZyArIG5jcl9vZmZ3KG8pKQorI2VuZGlmCisjZGVmaW5lIE9VVExfT0ZGKG8sIHZhbCkJd3JpdGVsX3JhdygodmFsKSwgKGNoYXIgX19pb21lbSAqKW5wLT5yZWcgKyAobykpCisKKyNlbmRpZgorCisjZGVmaW5lIElOQihyKQkJSU5CX09GRiAob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcscikpCisjZGVmaW5lIElOVyhyKQkJSU5XX09GRiAob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcscikpCisjZGVmaW5lIElOTChyKQkJSU5MX09GRiAob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcscikpCisKKyNkZWZpbmUgT1VUQihyLCB2YWwpCU9VVEJfT0ZGIChvZmZzZXRvZihzdHJ1Y3QgbmNyX3JlZyxyKSwgKHZhbCkpCisjZGVmaW5lIE9VVFcociwgdmFsKQlPVVRXX09GRiAob2Zmc2V0b2Yoc3RydWN0IG5jcl9yZWcsciksICh2YWwpKQorI2RlZmluZSBPVVRMKHIsIHZhbCkJT1VUTF9PRkYgKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLHIpLCAodmFsKSkKKworLyoKKyAqICBTZXQgYml0IGZpZWxkIE9OLCBPRkYgCisgKi8KKworI2RlZmluZSBPVVRPTkIociwgbSkJT1VUQihyLCBJTkIocikgfCAobSkpCisjZGVmaW5lIE9VVE9GRkIociwgbSkJT1VUQihyLCBJTkIocikgJiB+KG0pKQorI2RlZmluZSBPVVRPTlcociwgbSkJT1VUVyhyLCBJTlcocikgfCAobSkpCisjZGVmaW5lIE9VVE9GRlcociwgbSkJT1VUVyhyLCBJTlcocikgJiB+KG0pKQorI2RlZmluZSBPVVRPTkwociwgbSkJT1VUTChyLCBJTkwocikgfCAobSkpCisjZGVmaW5lIE9VVE9GRkwociwgbSkJT1VUTChyLCBJTkwocikgJiB+KG0pKQorCisvKgorICogIFdlIG5vcm1hbGx5IHdhbnQgdGhlIGNoaXAgdG8gaGF2ZSBhIGNvbnNpc3RlbnQgdmlldworICogIG9mIGRyaXZlciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSByZXN0YXJ0IGl0LgorICogIFRodXMgdGhlc2UgbWFjcm9zLgorICovCisjZGVmaW5lIE9VVExfRFNQKHYpCQkJCVwKKwlkbyB7CQkJCQlcCisJCU1FTU9SWV9CQVJSSUVSKCk7CQlcCisJCU9VVEwgKG5jX2RzcCwgKHYpKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIE9VVE9OQl9TVEQoKQkJCQlcCisJZG8gewkJCQkJXAorCQlNRU1PUllfQkFSUklFUigpOwkJXAorCQlPVVRPTkIgKG5jX2RjbnRsLCAoU1REfE5PQ09NKSk7CVwKKwl9IHdoaWxlICgwKQorCisKKy8qCisqKiAgIE5DUjUzQzhYWCBkZXZpY2VzIGZlYXR1cmVzIHRhYmxlLgorKi8KK3N0cnVjdCBuY3JfY2hpcCB7CisJdW5zaWduZWQgc2hvcnQJcmV2aXNpb25faWQ7CisJdW5zaWduZWQgY2hhcglidXJzdF9tYXg7CS8qIGxvZy1iYXNlLTIgb2YgbWF4IGJ1cnN0ICovCisJdW5zaWduZWQgY2hhcglvZmZzZXRfbWF4OworCXVuc2lnbmVkIGNoYXIJbnJfZGl2aXNvcjsKKwl1bnNpZ25lZCBpbnQJZmVhdHVyZXM7CisjZGVmaW5lIEZFX0xFRDAJCSgxPDwwKQorI2RlZmluZSBGRV9XSURFCQkoMTw8MSkgICAgLyogV2lkZSBkYXRhIHRyYW5zZmVycyAqLworI2RlZmluZSBGRV9VTFRSQQkoMTw8MikJICAvKiBVbHRyYSBzcGVlZCAyME10cmFucy9zZWMgKi8KKyNkZWZpbmUgRkVfREJMUgkJKDE8PDQpCSAgLyogQ2xvY2sgZG91YmxlciBwcmVzZW50ICovCisjZGVmaW5lIEZFX1FVQUQJCSgxPDw1KQkgIC8qIENsb2NrIHF1YWRydXBsZXIgcHJlc2VudCAqLworI2RlZmluZSBGRV9FUkwJCSgxPDw2KSAgICAvKiBFbmFibGUgcmVhZCBsaW5lICovCisjZGVmaW5lIEZFX0NMU0UJCSgxPDw3KSAgICAvKiBDYWNoZSBsaW5lIHNpemUgZW5hYmxlICovCisjZGVmaW5lIEZFX1dSSUUJCSgxPDw4KSAgICAvKiBXcml0ZSAmIEludmFsaWRhdGUgZW5hYmxlICovCisjZGVmaW5lIEZFX0VSTVAJCSgxPDw5KSAgICAvKiBFbmFibGUgcmVhZCBtdWx0aXBsZSAqLworI2RlZmluZSBGRV9CT0YJCSgxPDwxMCkgICAvKiBCdXJzdCBvcGNvZGUgZmV0Y2ggKi8KKyNkZWZpbmUgRkVfREZTCQkoMTw8MTEpICAgLyogRE1BIGZpZm8gc2l6ZSAqLworI2RlZmluZSBGRV9QRkVOCQkoMTw8MTIpICAgLyogUHJlZmV0Y2ggZW5hYmxlICovCisjZGVmaW5lIEZFX0xEU1RSCSgxPDwxMykgICAvKiBMb2FkL1N0b3JlIHN1cHBvcnRlZCAqLworI2RlZmluZSBGRV9SQU0JCSgxPDwxNCkgICAvKiBPbiBjaGlwIFJBTSBwcmVzZW50ICovCisjZGVmaW5lIEZFX1ZBUkNMSwkoMTw8MTUpICAgLyogU0NTSSBjbG9jayBtYXkgdmFyeSAqLworI2RlZmluZSBGRV9SQU04SwkoMTw8MTYpICAgLyogT24gY2hpcCBSQU0gc2l6ZWQgOEtiICovCisjZGVmaW5lIEZFXzY0QklUCSgxPDwxNykgICAvKiBIYXZlIGEgNjQtYml0IFBDSSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRkVfSU8yNTYJKDE8PDE4KSAgIC8qIFJlcXVpcmVzIGZ1bGwgMjU2IGJ5dGVzIGluIFBDSSBzcGFjZSAqLworI2RlZmluZSBGRV9OT1BNCQkoMTw8MTkpICAgLyogU2NyaXB0cyBoYW5kbGVzIHBoYXNlIG1pc21hdGNoICovCisjZGVmaW5lIEZFX0xFREMJCSgxPDwyMCkgICAvKiBIYXJkd2FyZSBjb250cm9sIG9mIExFRCAqLworI2RlZmluZSBGRV9ESUZGCQkoMTw8MjEpICAgLyogU3VwcG9ydCBEaWZmZXJlbnRpYWwgU0NTSSAqLworI2RlZmluZSBGRV82Nk1IWiAJKDE8PDIzKSAgIC8qIDY2TUh6IFBDSSBTdXBwb3J0ICovCisjZGVmaW5lIEZFX0RBQwkgCSgxPDwyNCkgICAvKiBTdXBwb3J0IERBQyBjeWNsZXMgKDY0IGJpdCBhZGRyZXNzaW5nKSAqLworI2RlZmluZSBGRV9JU1RBVDEgCSgxPDwyNSkgICAvKiBIYXZlIElTVEFUMSwgTUJPWDAsIE1CT1gxIHJlZ2lzdGVycyAqLworI2RlZmluZSBGRV9EQUNfSU5fVVNFCSgxPDwyNikJICAvKiBQbGF0Zm9ybSBkb2VzIERBQyBjeWNsZXMgKi8KKyNkZWZpbmUgRkVfRUhQCQkoMTw8MjcpICAgLyogNzIwOiBFdmVuIGhvc3QgcGFyaXR5ICovCisjZGVmaW5lIEZFX01VWAkJKDE8PDI4KSAgIC8qIDcyMDogTXVsdGlwbGV4ZWQgYnVzICovCisjZGVmaW5lIEZFX0VBCQkoMTw8MjkpICAgLyogNzIwOiBFbmFibGUgQWNrICovCisKKyNkZWZpbmUgRkVfQ0FDSEVfU0VUCShGRV9FUkx8RkVfQ0xTRXxGRV9XUklFfEZFX0VSTVApCisjZGVmaW5lIEZFX1NDU0lfU0VUCShGRV9XSURFfEZFX1VMVFJBfEZFX0RCTFJ8RkVfUVVBRHxGX0NMSzgwKQorI2RlZmluZSBGRV9TUEVDSUFMX1NFVAkoRkVfQ0FDSEVfU0VUfEZFX0JPRnxGRV9ERlN8RkVfTERTVFJ8RkVfUEZFTnxGRV9SQU0pCit9OworCisKKy8qCisqKglEcml2ZXIgc2V0dXAgc3RydWN0dXJlLgorKioKKyoqCVRoaXMgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkIGZyb20gbGludXggY29uZmlnIG9wdGlvbnMuCisqKglJdCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBib290LXVwIGJ5IHRoZSBib290IGNvbW1hbmQgbGluZS4KKyovCisjZGVmaW5lIFNDU0lfTkNSX01BWF9FWENMVURFUyA4CitzdHJ1Y3QgbmNyX2RyaXZlcl9zZXR1cCB7CisJdTgJbWFzdGVyX3Bhcml0eTsKKwl1OAlzY3NpX3Bhcml0eTsKKwl1OAlkaXNjb25uZWN0aW9uOworCXU4CXNwZWNpYWxfZmVhdHVyZXM7CisJdTgJZm9yY2Vfc3luY19uZWdvOworCXU4CXJldmVyc2VfcHJvYmU7CisJdTgJcGNpX2ZpeF91cDsKKwl1OAl1c2VfbnZyYW07CisJdTgJdmVyYm9zZTsKKwl1OAlkZWZhdWx0X3RhZ3M7CisJdTE2CWRlZmF1bHRfc3luYzsKKwl1MTYJZGVidWc7CisJdTgJYnVyc3RfbWF4OworCXU4CWxlZF9waW47CisJdTgJbWF4X3dpZGU7CisJdTgJc2V0dGxlX2RlbGF5OworCXU4CWRpZmZfc3VwcG9ydDsKKwl1OAlpcnFtOworCXU4CWJ1c19jaGVjazsKKwl1OAlvcHRpbWl6ZTsKKwl1OAlyZWNvdmVyeTsKKwl1OAlob3N0X2lkOworCXUxNglpYXJiOworCXUzMglleGNsdWRlc1tTQ1NJX05DUl9NQVhfRVhDTFVERVNdOworCWNoYXIJdGFnX2N0cmxbMTAwXTsKK307CisKKy8qCisqKglJbml0aWFsIHNldHVwLgorKioJQ2FuIGJlIG92ZXJyaWRlbiBhdCBzdGFydHVwIGJ5IGEgY29tbWFuZCBsaW5lLgorKi8KKyNkZWZpbmUgU0NTSV9OQ1JfRFJJVkVSX1NFVFVQCQkJXAorewkJCQkJCVwKKwlTQ1NJX05DUl9TRVRVUF9NQVNURVJfUEFSSVRZLAkJXAorCVNDU0lfTkNSX1NFVFVQX1NDU0lfUEFSSVRZLAkJXAorCVNDU0lfTkNSX1NFVFVQX0RJU0NPTk5FQ1RJT04sCQlcCisJU0NTSV9OQ1JfU0VUVVBfU1BFQ0lBTF9GRUFUVVJFUywJXAorCVNDU0lfTkNSX1NFVFVQX0ZPUkNFX1NZTkNfTkVHTywJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMSwJCQkJCVwKKwkwLAkJCQkJXAorCVNDU0lfTkNSX1NFVFVQX0RFRkFVTFRfVEFHUywJCVwKKwlTQ1NJX05DUl9TRVRVUF9ERUZBVUxUX1NZTkMsCQlcCisJMHgwMCwJCQkJCVwKKwk3LAkJCQkJXAorCTAsCQkJCQlcCisJMSwJCQkJCVwKKwlTQ1NJX05DUl9TRVRVUF9TRVRUTEVfVElNRSwJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMSwJCQkJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMjU1LAkJCQkJXAorCTB4MDAJCQkJCVwKK30KKworLyoKKyoqCUJvb3QgZmFpbCBzYWZlIHNldHVwLgorKioJT3ZlcnJpZGUgaW5pdGlhbCBzZXR1cCBmcm9tIGJvb3QgY29tbWFuZCBsaW5lOgorKioJbmNyNTNjOHh4PXNhZmU6eQorKi8KKyNkZWZpbmUgU0NTSV9OQ1JfRFJJVkVSX1NBRkVfU0VUVVAJCVwKK3sJCQkJCQlcCisJMCwJCQkJCVwKKwkxLAkJCQkJXAorCTAsCQkJCQlcCisJMCwJCQkJCVwKKwkwLAkJCQkJXAorCTAsCQkJCQlcCisJMCwJCQkJCVwKKwkxLAkJCQkJXAorCTIsCQkJCQlcCisJMCwJCQkJCVwKKwkyNTUsCQkJCQlcCisJMHgwMCwJCQkJCVwKKwkyNTUsCQkJCQlcCisJMCwJCQkJCVwKKwkwLAkJCQkJXAorCTEwLAkJCQkJXAorCTEsCQkJCQlcCisJMSwJCQkJCVwKKwkxLAkJCQkJXAorCTAsCQkJCQlcCisJMCwJCQkJCVwKKwkyNTUJCQkJCVwKK30KKworLyoqKioqKioqKioqKioqKiogT1JJR0lOQUwgQ09OVEVOVCBvZiBuY3JyZWcuaCBmcm9tIEZyZWVCU0QgKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJVGhlIG5jciA1M2M4MTAgcmVnaXN0ZXIgc3RydWN0dXJlLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0cnVjdCBuY3JfcmVnIHsKKy8qMDAqLyAgdTgJbmNfc2NudGwwOyAgICAvKiBmdWxsIGFyYi4sIGVuYSBwYXJpdHksIHBhci0+QVROICAqLworCisvKjAxKi8gIHU4CW5jX3NjbnRsMTsgICAgLyogbm8gcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIElTQ09OICAgMHgxMCAgLyogY29ubmVjdGVkIHRvIHNjc2kJCSAgICAqLworICAgICAgICAjZGVmaW5lICAgQ1JTVCAgICAweDA4ICAvKiBmb3JjZSByZXNldCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSUFSQiAgICAweDAyICAvKiBpbW1lZGlhdGUgYXJiaXRyYXRpb24gICAgICAgICAgICAqLworCisvKjAyKi8gIHU4CW5jX3NjbnRsMjsgICAgLyogbm8gZGlzY29ubmVjdCBleHBlY3RlZCAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgU0RVICAgICAweDgwICAvKiBjbWQ6IGRpc2Nvbm5lY3Qgd2lsbCByYWlzZSBlcnJvciAqLworCSNkZWZpbmUgICBDSE0gICAgIDB4NDAgIC8qIHN0YTogY2hhaW5lZCBtb2RlICAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFdTUyAgICAgMHgwOCAgLyogc3RhOiB3aWRlIHNjc2kgc2VuZCAgICAgICAgICAgW1ddKi8KKwkjZGVmaW5lICAgV1NSICAgICAweDAxICAvKiBzdGE6IHdpZGUgc2NzaSByZWNlaXZlZCAgICAgICBbV10qLworCisvKjAzKi8gIHU4CW5jX3NjbnRsMzsgICAgLyogY25mIHN5c3RlbSBjbG9jayBkZXBlbmRlbnQgICAgICAgKi8KKwkjZGVmaW5lICAgRVdTICAgICAweDA4ICAvKiBjbWQ6IGVuYWJsZSB3aWRlIHNjc2kgICAgICAgICBbV10qLworCSNkZWZpbmUgICBVTFRSQSAgIDB4ODAgIC8qIGNtZDogVUxUUkEgZW5hYmxlICAgICAgICAgICAgICAgICovCisJCQkJLyogYml0cyAwLTIsIDcgcnN2ZCBmb3IgQzEwMTAgICAgICAgKi8KKworLyowNCovICB1OAluY19zY2lkOwkvKiBjbmYgaG9zdCBhZGFwdGVyIHNjc2kgYWRkcmVzcyAgICAqLworCSNkZWZpbmUgICBSUkUgICAgIDB4NDAgIC8qIHIvdzplIGVuYWJsZSByZXNwb25zZSB0byByZXNlbC4gICovCisJI2RlZmluZSAgIFNSRSAgICAgMHgyMCAgLyogci93OmUgZW5hYmxlIHJlc3BvbnNlIHRvIHNlbGVjdCAgKi8KKworLyowNSovICB1OAluY19zeGZlcjsJLyogIyMjIFN5bmMgc3BlZWQgYW5kIGNvdW50ICAgICAgICAgKi8KKwkJCQkvKiBiaXRzIDYtNyByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworCisvKjA2Ki8gIHU4CW5jX3NkaWQ7CS8qICMjIyBEZXN0aW5hdGlvbi1JRCAgICAgICAgICAgICAgICovCisKKy8qMDcqLyAgdTgJbmNfZ3ByZWc7CS8qID8/PyBJTy1QaW5zICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qMDgqLyAgdTgJbmNfc2ZicjsJLyogIyMjIEZpcnN0IGJ5dGUgaW4gcGhhc2UgICAgICAgICAgKi8KKworLyowOSovICB1OAluY19zb2NsOworCSNkZWZpbmUgICBDUkVRCSAgMHg4MAkvKiByL3c6IFNDU0ktUkVRICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQUNLCSAgMHg0MAkvKiByL3c6IFNDU0ktQUNLICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQlNZCSAgMHgyMAkvKiByL3c6IFNDU0ktQlNZICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDU0VMCSAgMHgxMAkvKiByL3c6IFNDU0ktU0VMICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQVROCSAgMHgwOAkvKiByL3c6IFNDU0ktQVROICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDTVNHCSAgMHgwNAkvKiByL3c6IFNDU0ktTVNHICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDQ19ECSAgMHgwMgkvKiByL3c6IFNDU0ktQ19EICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDSV9PCSAgMHgwMQkvKiByL3c6IFNDU0ktSV9PICAgICAgICAgICAgICAgICAgICAqLworCisvKjBhKi8gIHU4CW5jX3NzaWQ7CisKKy8qMGIqLyAgdTgJbmNfc2JjbDsKKworLyowYyovICB1OAluY19kc3RhdDsKKyAgICAgICAgI2RlZmluZSAgIERGRSAgICAgMHg4MCAgLyogc3RhOiBkbWEgZmlmbyBlbXB0eSAgICAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIE1EUEUgICAgMHg0MCAgLyogaW50OiBtYXN0ZXIgZGF0YSBwYXJpdHkgZXJyb3IgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIEJGICAgICAgMHgyMCAgLyogaW50OiBzY3JpcHQ6IGJ1cyBmYXVsdCAgICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIEFCUlQgICAgMHgxMCAgLyogaW50OiBzY3JpcHQ6IGNvbW1hbmQgYWJvcnRlZCAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNTSSAgICAgMHgwOCAgLyogaW50OiBzY3JpcHQ6IHNpbmdsZSBzdGVwICAgICAgICAgKi8KKyAgICAgICAgI2RlZmluZSAgIFNJUiAgICAgMHgwNCAgLyogaW50OiBzY3JpcHQ6IGludGVycnVwdCBpbnN0cnVjdC4gKi8KKyAgICAgICAgI2RlZmluZSAgIElJRCAgICAgMHgwMSAgLyogaW50OiBzY3JpcHQ6IGlsbGVnYWwgaW5zdHJ1Y3QuICAgKi8KKworLyowZCovICB1OAluY19zc3RhdDA7CisgICAgICAgICNkZWZpbmUgICBJTEYgICAgIDB4ODAgIC8qIHN0YTogZGF0YSBpbiBTSURMIHJlZ2lzdGVyIGxzYiAgICovCisgICAgICAgICNkZWZpbmUgICBPUkYgICAgIDB4NDAgIC8qIHN0YTogZGF0YSBpbiBTT0RSIHJlZ2lzdGVyIGxzYiAgICovCisgICAgICAgICNkZWZpbmUgICBPTEYgICAgIDB4MjAgIC8qIHN0YTogZGF0YSBpbiBTT0RMIHJlZ2lzdGVyIGxzYiAgICovCisgICAgICAgICNkZWZpbmUgICBBSVAgICAgIDB4MTAgIC8qIHN0YTogYXJiaXRyYXRpb24gaW4gcHJvZ3Jlc3MgICAgICovCisgICAgICAgICNkZWZpbmUgICBMT0EgICAgIDB4MDggIC8qIHN0YTogYXJiaXRyYXRpb24gbG9zdCAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBXT0EgICAgIDB4MDQgIC8qIHN0YTogYXJiaXRyYXRpb24gd29uICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBJUlNUICAgIDB4MDIgIC8qIHN0YTogc2NzaSByZXNldCBzaWduYWwgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTRFAgICAgIDB4MDEgIC8qIHN0YTogc2NzaSBwYXJpdHkgc2lnbmFsICAgICAgICAgICovCisKKy8qMGUqLyAgdTgJbmNfc3N0YXQxOworCSNkZWZpbmUgICBGRjMyMTAgIDB4ZjAJLyogc3RhOiBieXRlcyBpbiB0aGUgc2NzaSBmaWZvICAgICAgKi8KKworLyowZiovICB1OAluY19zc3RhdDI7CisgICAgICAgICNkZWZpbmUgICBJTEYxICAgIDB4ODAgIC8qIHN0YTogZGF0YSBpbiBTSURMIHJlZ2lzdGVyIG1zYltXXSovCisgICAgICAgICNkZWZpbmUgICBPUkYxICAgIDB4NDAgIC8qIHN0YTogZGF0YSBpbiBTT0RSIHJlZ2lzdGVyIG1zYltXXSovCisgICAgICAgICNkZWZpbmUgICBPTEYxICAgIDB4MjAgIC8qIHN0YTogZGF0YSBpbiBTT0RMIHJlZ2lzdGVyIG1zYltXXSovCisgICAgICAgICNkZWZpbmUgICBETSAgICAgIDB4MDQgIC8qIHN0YTogRElGRlNFTlMgbWlzbWF0Y2ggKDg5NS82IG9ubHkpICovCisgICAgICAgICNkZWZpbmUgICBMRFNDICAgIDB4MDIgIC8qIHN0YTogZGlzY29ubmVjdCAmIHJlY29ubmVjdCAgICAgICovCisKKy8qMTAqLyAgdTgJbmNfZHNhOwkvKiAtLT4gQmFzZSBwYWdlICAgICAgICAgICAgICAgICAgICAqLworLyoxMSovICB1OAluY19kc2ExOworLyoxMiovICB1OAluY19kc2EyOworLyoxMyovICB1OAluY19kc2EzOworCisvKjE0Ki8gIHU4CW5jX2lzdGF0OwkvKiAtLT4gTWFpbiBDb21tYW5kIGFuZCBzdGF0dXMgICAgICAqLworICAgICAgICAjZGVmaW5lICAgQ0FCUlQgICAweDgwICAvKiBjbWQ6IGFib3J0IGN1cnJlbnQgb3BlcmF0aW9uICAgICAqLworICAgICAgICAjZGVmaW5lICAgU1JTVCAgICAweDQwICAvKiBtb2Q6IHJlc2V0IGNoaXAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgU0lHUCAgICAweDIwICAvKiByL3c6IG1lc3NhZ2UgZnJvbSBob3N0IHRvIG5jciAgICAqLworICAgICAgICAjZGVmaW5lICAgU0VNICAgICAweDEwICAvKiByL3c6IG1lc3NhZ2UgYmV0d2VlbiBob3N0ICsgbmNyICAqLworICAgICAgICAjZGVmaW5lICAgQ09OICAgICAweDA4ICAvKiBzdGE6IGNvbm5lY3RlZCB0byBzY3NpICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgSU5URiAgICAweDA0ICAvKiBzdGE6IGludCBvbiB0aGUgZmx5IChyZXNldCBieSB3cikqLworICAgICAgICAjZGVmaW5lICAgU0lQICAgICAweDAyICAvKiBzdGE6IHNjc2ktaW50ZXJydXB0ICAgICAgICAgICAgICAqLworICAgICAgICAjZGVmaW5lICAgRElQICAgICAweDAxICAvKiBzdGE6IGhvc3Qvc2NyaXB0IGludGVycnVwdCAgICAgICAqLworCisvKjE1Ki8gIHU4CW5jX2lzdGF0MTsJLyogODk2IGFuZCBsYXRlciBjb3JlcyBvbmx5ICovCisgICAgICAgICNkZWZpbmUgICBGTFNIICAgIDB4MDQgIC8qIHN0YTogY2hpcCBpcyBmbHVzaGluZyAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTUlVOICAgIDB4MDIgIC8qIHN0YTogc2NyaXB0cyBhcmUgcnVubmluZyAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTSVJRRCAgIDB4MDEgIC8qIHIvdzogZGlzYWJsZSBJTlQgcGluICAgICAgICAgICAgICovCisKKy8qMTYqLyAgdTgJbmNfbWJveDA7CS8qIDg5NiBhbmQgbGF0ZXIgY29yZXMgb25seSAqLworLyoxNyovICB1OAluY19tYm94MTsJLyogODk2IGFuZCBsYXRlciBjb3JlcyBvbmx5ICovCisKKy8qMTgqLwl1OAluY19jdGVzdDA7CisJI2RlZmluZSAgIEVIUCAgICAgMHgwNAkvKiA3MjAgZXZlbiBob3N0IHBhcml0eSAgICAgICAgICAgICAqLworLyoxOSovICB1OAluY19jdGVzdDE7CisKKy8qMWEqLyAgdTgJbmNfY3Rlc3QyOworCSNkZWZpbmUgICBDU0lHUCAgIDB4NDAKKwkJCQkvKiBiaXRzIDAtMiw3IHJzdmQgZm9yIEMxMDEwICAgICAgICAqLworCisvKjFiKi8gIHU4CW5jX2N0ZXN0MzsKKwkjZGVmaW5lICAgRkxGICAgICAweDA4ICAvKiBjbWQ6IGZsdXNoIGRtYSBmaWZvICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBDTEYJICAweDA0CS8qIGNtZDogY2xlYXIgZG1hIGZpZm8JCSAgICAqLworCSNkZWZpbmUgICBGTSAgICAgIDB4MDIgIC8qIG1vZDogZmV0Y2ggcGluIG1vZGUgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFdSSUUgICAgMHgwMSAgLyogbW9kOiB3cml0ZSBhbmQgaW52YWxpZGF0ZSBlbmFibGUgKi8KKwkJCQkvKiBiaXRzIDQtNyByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworCisvKjFjKi8gIHUzMiAgICBuY190ZW1wOwkvKiAjIyMgVGVtcG9yYXJ5IHN0YWNrICAgICAgICAgICAgICAqLworCisvKjIwKi8JdTgJbmNfZGZpZm87CisvKjIxKi8gIHU4CW5jX2N0ZXN0NDsKKwkjZGVmaW5lICAgTVVYICAgICAweDgwICAvKiA3MjAgaG9zdCBidXMgbXVsdGlwbGV4IG1vZGUgICAgICAqLworCSNkZWZpbmUgICBCRElTICAgIDB4ODAgIC8qIG1vZDogYnVyc3QgZGlzYWJsZSAgICAgICAgICAgICAgICovCisJI2RlZmluZSAgIE1QRUUgICAgMHgwOCAgLyogbW9kOiBtYXN0ZXIgcGFyaXR5IGVycm9yIGVuYWJsZSAgKi8KKworLyoyMiovICB1OAluY19jdGVzdDU7CisJI2RlZmluZSAgIERGUyAgICAgMHgyMCAgLyogbW9kOiBkbWEgZmlmbyBzaXplICAgICAgICAgICAgICAgKi8KKwkJCQkvKiBiaXRzIDAtMSwgMy03IHJzdmQgZm9yIEMxMDEwICAgICAgICAgICovCisvKjIzKi8gIHU4CW5jX2N0ZXN0NjsKKworLyoyNCovICB1MzIgICAgbmNfZGJjOwkvKiAjIyMgQnl0ZSBjb3VudCBhbmQgY29tbWFuZCAgICAgICAqLworLyoyOCovICB1MzIgICAgbmNfZG5hZDsJLyogIyMjIE5leHQgY29tbWFuZCByZWdpc3RlciAgICAgICAgKi8KKy8qMmMqLyAgdTMyICAgIG5jX2RzcDsJLyogLS0+IFNjcmlwdCBQb2ludGVyICAgICAgICAgICAgICAgKi8KKy8qMzAqLyAgdTMyICAgIG5jX2RzcHM7CS8qIC0tPiBTY3JpcHQgcG9pbnRlciBzYXZlL29wY29kZSMyICovCisKKy8qMzQqLyAgdTgJbmNfc2NyYXRjaGE7ICAvKiBUZW1wb3JhcnkgcmVnaXN0ZXIgYSAgICAgICAgICAgICovCisvKjM1Ki8gIHU4CW5jX3NjcmF0Y2hhMTsKKy8qMzYqLyAgdTgJbmNfc2NyYXRjaGEyOworLyozNyovICB1OAluY19zY3JhdGNoYTM7CisKKy8qMzgqLyAgdTgJbmNfZG1vZGU7CisJI2RlZmluZSAgIEJMXzIgICAgMHg4MCAgLyogbW9kOiBidXJzdCBsZW5ndGggc2hpZnQgdmFsdWUgKzIgKi8KKwkjZGVmaW5lICAgQkxfMSAgICAweDQwICAvKiBtb2Q6IGJ1cnN0IGxlbmd0aCBzaGlmdCB2YWx1ZSArMSAqLworCSNkZWZpbmUgICBFUkwgICAgIDB4MDggIC8qIG1vZDogZW5hYmxlIHJlYWQgbGluZSAgICAgICAgICAgICovCisJI2RlZmluZSAgIEVSTVAgICAgMHgwNCAgLyogbW9kOiBlbmFibGUgcmVhZCBtdWx0aXBsZSAgICAgICAgKi8KKwkjZGVmaW5lICAgQk9GICAgICAweDAyICAvKiBtb2Q6IGJ1cnN0IG9wIGNvZGUgZmV0Y2ggICAgICAgICAqLworCisvKjM5Ki8gIHU4CW5jX2RpZW47CisvKjNhKi8gIHU4CW5jX3NicjsKKworLyozYiovICB1OAluY19kY250bDsJLyogLS0+IFNjcmlwdCBleGVjdXRpb24gY29udHJvbCAgICAgKi8KKwkjZGVmaW5lICAgQ0xTRSAgICAweDgwICAvKiBtb2Q6IGNhY2hlIGxpbmUgc2l6ZSBlbmFibGUgICAgICAqLworCSNkZWZpbmUgICBQRkYgICAgIDB4NDAgIC8qIGNtZDogcHJlLWZldGNoIGZsdXNoICAgICAgICAgICAgICovCisJI2RlZmluZSAgIFBGRU4gICAgMHgyMCAgLyogbW9kOiBwcmUtZmV0Y2ggZW5hYmxlICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRUEgICAgICAweDIwICAvKiBtb2Q6IDcyMCBlbmFibGUtYWNrICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBTU00gICAgIDB4MTAgIC8qIG1vZDogc2luZ2xlIHN0ZXAgbW9kZSAgICAgICAgICAgICovCisJI2RlZmluZSAgIElSUU0gICAgMHgwOCAgLyogbW9kOiBpcnEgbW9kZSAoMSA9IHRvdGVtIHBvbGUgISkgKi8KKwkjZGVmaW5lICAgU1REICAgICAweDA0ICAvKiBjbWQ6IHN0YXJ0IGRtYSBtb2RlICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBJUlFEICAgIDB4MDIgIC8qIG1vZDogaXJxIGRpc2FibGUgICAgICAgICAgICAgICAgICovCisgCSNkZWZpbmUJICBOT0NPTSAgIDB4MDEJLyogY21kOiBwcm90ZWN0IHNmYnIgd2hpbGUgcmVzZWxlY3QgKi8KKwkJCQkvKiBiaXRzIDAtMSByc3ZkIGZvciBDMTAxMCAgICAgICAgICAqLworCisvKjNjKi8gIHUzMgluY19hZGRlcjsKKworLyo0MCovICB1MTYJbmNfc2llbjsJLyogLS0+OiBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgKi8KKy8qNDIqLyAgdTE2CW5jX3Npc3Q7CS8qIDwtLTogaW50ZXJydXB0IHN0YXR1cyAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTQk1DICAgIDB4MTAwMC8qIHN0YTogU0NTSSBCdXMgTW9kZSBDaGFuZ2UgKDg5NS82IG9ubHkpICovCisgICAgICAgICNkZWZpbmUgICBTVE8gICAgIDB4MDQwMC8qIHN0YTogdGltZW91dCAoc2VsZWN0KSAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBHRU4gICAgIDB4MDIwMC8qIHN0YTogdGltZW91dCAoZ2VuZXJhbCkgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBIVEggICAgIDB4MDEwMC8qIHN0YTogdGltZW91dCAoaGFuZHNoYWtlKSAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBNQSAgICAgIDB4ODAgIC8qIHN0YTogcGhhc2UgbWlzbWF0Y2ggICAgICAgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBDTVAgICAgIDB4NDAgIC8qIHN0YTogYXJiaXRyYXRpb24gY29tcGxldGUgICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBTRUwgICAgIDB4MjAgIC8qIHN0YTogc2VsZWN0ZWQgYnkgYW5vdGhlciBkZXZpY2UgICovCisgICAgICAgICNkZWZpbmUgICBSU0wgICAgIDB4MTAgIC8qIHN0YTogcmVzZWxlY3RlZCBieSBhbm90aGVyIGRldmljZSovCisgICAgICAgICNkZWZpbmUgICBTR0UgICAgIDB4MDggIC8qIHN0YTogZ3Jvc3MgZXJyb3IgKG92ZXIvdW5kZXJmbG93KSovCisgICAgICAgICNkZWZpbmUgICBVREMgICAgIDB4MDQgIC8qIHN0YTogdW5leHBlY3RlZCBkaXNjb25uZWN0ICAgICAgICovCisgICAgICAgICNkZWZpbmUgICBSU1QgICAgIDB4MDIgIC8qIHN0YTogc2NzaSBidXMgcmVzZXQgZGV0ZWN0ZWQgICAgICovCisgICAgICAgICNkZWZpbmUgICBQQVIgICAgIDB4MDEgIC8qIHN0YTogc2NzaSBwYXJpdHkgZXJyb3IgICAgICAgICAgICovCisKKy8qNDQqLyAgdTgJbmNfc2xwYXI7CisvKjQ1Ki8gIHU4CW5jX3N3aWRlOworLyo0NiovICB1OAluY19tYWNudGw7CisvKjQ3Ki8gIHU4CW5jX2dwY250bDsKKy8qNDgqLyAgdTgJbmNfc3RpbWUwOyAgICAvKiBjbWQ6IHRpbWVvdXQgZm9yIHNlbGVjdCZoYW5kc2hha2UqLworLyo0OSovICB1OAluY19zdGltZTE7ICAgIC8qIGNtZDogdGltZW91dCB1c2VyIGRlZmluZWQgICAgICAgICovCisvKjRhKi8gIHUxNiAgIG5jX3Jlc3BpZDsgICAgLyogc3RhOiBSZXNlbGVjdC1JRHMgICAgICAgICAgICAgICAgKi8KKworLyo0YyovICB1OAluY19zdGVzdDA7CisKKy8qNGQqLyAgdTgJbmNfc3Rlc3QxOworCSNkZWZpbmUgICBTQ0xLICAgIDB4ODAJLyogVXNlIHRoZSBQQ0kgY2xvY2sgYXMgU0NTSSBjbG9jawkqLworCSNkZWZpbmUgICBEQkxFTiAgIDB4MDgJLyogY2xvY2sgZG91YmxlciBydW5uaW5nCQkqLworCSNkZWZpbmUgICBEQkxTRUwgIDB4MDQJLyogY2xvY2sgZG91YmxlciBzZWxlY3RlZAkJKi8KKyAgCisKKy8qNGUqLyAgdTgJbmNfc3Rlc3QyOworCSNkZWZpbmUgICBST0YgICAgIDB4NDAJLyogcmVzZXQgc2NzaSBvZmZzZXQgKGFmdGVyIGdyb3NzIGVycm9yISkgKi8KKwkjZGVmaW5lICAgRElGICAgICAweDIwICAvKiA3MjAgU0NTSSBkaWZmZXJlbnRpYWwgbW9kZSAgICAgICAgICAgICAqLworCSNkZWZpbmUgICBFWFQgICAgIDB4MDIgIC8qIGV4dGVuZGVkIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICovCisKKy8qNGYqLyAgdTgJbmNfc3Rlc3QzOworCSNkZWZpbmUgICBURSAgICAgMHg4MAkvKiBjOiB0b2xlckFudCBlbmFibGUgKi8KKwkjZGVmaW5lICAgSFNDICAgIDB4MjAJLyogYzogSGFsdCBTQ1NJIENsb2NrICovCisJI2RlZmluZSAgIENTRiAgICAweDAyCS8qIGM6IGNsZWFyIHNjc2kgZmlmbyAqLworCisvKjUwKi8gIHUxNiAgIG5jX3NpZGw7CS8qIExvd2xldmVsOiBsYXRjaGVkIGZyb20gc2NzaSBkYXRhICovCisvKjUyKi8gIHU4CW5jX3N0ZXN0NDsKKwkjZGVmaW5lICAgU01PREUgIDB4YzAJLyogU0NTSSBidXMgbW9kZSAgICAgICg4OTUvNiBvbmx5KSAqLworCSNkZWZpbmUgICAgU01PREVfSFZEIDB4NDAJLyogSGlnaCBWb2x0YWdlIERpZmZlcmVudGlhbCAgICAgICAqLworCSNkZWZpbmUgICAgU01PREVfU0UgIDB4ODAJLyogU2luZ2xlIEVuZGVkICAgICAgICAgICAgICAgICAgICAqLworCSNkZWZpbmUgICAgU01PREVfTFZEIDB4YzAJLyogTG93IFZvbHRhZ2UgRGlmZmVyZW50aWFsICAgICAgICAqLworCSNkZWZpbmUgICBMQ0tGUlEgMHgyMAkvKiBGcmVxdWVuY3kgTG9jayAoODk1LzYgb25seSkgICAgICovCisJCQkJLyogYml0cyAwLTUgcnN2ZCBmb3IgQzEwMTAgICAgICAgICAgKi8KKworLyo1MyovICB1OAluY181M187CisvKjU0Ki8gIHUxNgluY19zb2RsOwkvKiBMb3dsZXZlbDogZGF0YSBvdXQgdG8gc2NzaSBkYXRhICAqLworLyo1NiovCXU4CW5jX2NjbnRsMDsJLyogQ2hpcCBDb250cm9sIDAgKDg5NikgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRU5QTUogIDB4ODAJLyogRW5hYmxlIFBoYXNlIE1pc21hdGNoIEp1bXAgICAgICAgKi8KKwkjZGVmaW5lICAgUE1KQ1RMIDB4NDAJLyogUGhhc2UgTWlzbWF0Y2ggSnVtcCBDb250cm9sICAgICAgKi8KKwkjZGVmaW5lICAgRU5OREogIDB4MjAJLyogRW5hYmxlIE5vbiBEYXRhIFBNIEp1bXAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRElTRkMgIDB4MTAJLyogRGlzYWJsZSBBdXRvIEZJRk8gQ2xlYXIgICAgICAgICAgKi8KKwkjZGVmaW5lICAgRElMUyAgIDB4MDIJLyogRGlzYWJsZSBJbnRlcm5hbCBMb2FkL1N0b3JlICAgICAgKi8KKwkjZGVmaW5lICAgRFBSICAgIDB4MDEJLyogRGlzYWJsZSBQaXBlIFJlcSAgICAgICAgICAgICAgICAgKi8KKworLyo1NyovCXU4CW5jX2NjbnRsMTsJLyogQ2hpcCBDb250cm9sIDEgKDg5NikgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgWk1PRCAgIDB4ODAJLyogSGlnaCBJbXBlZGFuY2UgTW9kZSAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lCSAgRElDCSAweDEwCS8qIERpc2FibGUgSW50ZXJuYWwgQ3ljbGVzCSAgICAqLworCSNkZWZpbmUgICBEREFDICAgMHgwOAkvKiBEaXNhYmxlIER1YWwgQWRkcmVzcyBDeWNsZSAgICAgICAqLworCSNkZWZpbmUgICBYVElNT0QgMHgwNAkvKiA2NC1iaXQgVGFibGUgSW5kLiBJbmRleGluZyBNb2RlICAqLworCSNkZWZpbmUgICBFWFRJQk1WIDB4MDIJLyogRW5hYmxlIDY0LWJpdCBUYWJsZSBJbmQuIEJNT1YgICAgKi8KKwkjZGVmaW5lICAgRVhEQk1WIDB4MDEJLyogRW5hYmxlIDY0LWJpdCBEaXJlY3QgQk1PViAgICAgICAgKi8KKworLyo1OCovICB1MTYJbmNfc2JkbDsJLyogTG93bGV2ZWw6IGRhdGEgZnJvbSBzY3NpIGRhdGEgICAgKi8KKy8qNWEqLyAgdTE2CW5jXzVhXzsKKworLyo1YyovICB1OAluY19zY3IwOwkvKiBXb3JraW5nIHJlZ2lzdGVyIEIgICAgICAgICAgICAgICAqLworLyo1ZCovICB1OAluY19zY3IxOwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo1ZSovICB1OAluY19zY3IyOwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo1ZiovICB1OAluY19zY3IzOwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKjYwKi8gIHU4CW5jX3NjcnhbNjRdOwkvKiBXb3JraW5nIHJlZ2lzdGVyIEMtUiAgICAgICAgICAgICAqLworLyphMCovCXUzMgluY19tbXJzOwkvKiBNZW1vcnkgTW92ZSBSZWFkIFNlbGVjdG9yICAgICAgICAqLworLyphNCovCXUzMgluY19tbXdzOwkvKiBNZW1vcnkgTW92ZSBXcml0ZSBTZWxlY3RvciAgICAgICAqLworLyphOCovCXUzMgluY19zZnM7CQkvKiBTY3JpcHQgRmV0Y2ggU2VsZWN0b3IgICAgICAgICAgICAqLworLyphYyovCXUzMgluY19kcnM7CQkvKiBEU0EgUmVsYXRpdmUgU2VsZWN0b3IgICAgICAgICAgICAqLworLypiMCovCXUzMgluY19zYm1zOwkvKiBTdGF0aWMgQmxvY2sgTW92ZSBTZWxlY3RvciAgICAgICAqLworLypiNCovCXUzMgluY19kYm1zOwkvKiBEeW5hbWljIEJsb2NrIE1vdmUgU2VsZWN0b3IgICAgICAqLworLypiOCovCXUzMgluY19kbmFkNjQ7CS8qIERNQSBOZXh0IEFkZHJlc3MgNjQgICAgICAgICAgICAgICovCisvKmJjKi8JdTE2CW5jX3NjbnRsNDsJLyogQzEwMTAgb25seSAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgVTNFTiAgIDB4ODAJLyogRW5hYmxlIFVsdHJhIDMgICAgICAgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgQUlQRU4JIDB4NDAgICAvKiBBbGxvdyBjaGVjayB1cHBlciBieXRlIGxhbmVzICAgICAqLworCSNkZWZpbmUgICBYQ0xLSF9EVCAweDA4IC8qIEV4dHJhIGNsb2NrIG9mIGRhdGEgaG9sZCBvbiBEVAorCQkJCQl0cmFuc2ZlciBlZGdlCSAgICAgICAgICAgICovCisJI2RlZmluZSAgIFhDTEtIX1NUIDB4MDQgLyogRXh0cmEgY2xvY2sgb2YgZGF0YSBob2xkIG9uIFNUCisJCQkJCXRyYW5zZmVyIGVkZ2UJICAgICAgICAgICAgKi8KKworLypiZSovICB1OAluY19haXBjbnRsMDsJLyogRXBhdCBDb250cm9sIDEgQzEwMTAgb25seSAgICAgICAgKi8KKy8qYmYqLyAgdTgJbmNfYWlwY250bDE7CS8qIEFJUCBDb250cm9sIEMxMDEwXzY2IE9ubHkgICAgICAgICovCisKKy8qYzAqLwl1MzIJbmNfcG1qYWQxOwkvKiBQaGFzZSBNaXNtYXRjaCBKdW1wIEFkZHJlc3MgMSAgICAqLworLypjNCovCXUzMgluY19wbWphZDI7CS8qIFBoYXNlIE1pc21hdGNoIEp1bXAgQWRkcmVzcyAyICAgICovCisvKmM4Ki8JdTgJbmNfcmJjOwkJLyogUmVtYWluaW5nIEJ5dGUgQ291bnQgICAgICAgICAgICAgKi8KKy8qYzkqLwl1OAluY19yYmMxOwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypjYSovCXU4CW5jX3JiYzI7CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKmNiKi8JdTgJbmNfcmJjMzsJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLypjYyovCXU4CW5jX3VhOwkJLyogVXBkYXRlZCBBZGRyZXNzICAgICAgICAgICAgICAgICAgKi8KKy8qY2QqLwl1OAluY191YTE7CQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypjZSovCXU4CW5jX3VhMjsJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKmNmKi8JdTgJbmNfdWEzOwkJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qZDAqLwl1MzIJbmNfZXNhOwkJLyogRW50cnkgU3RvcmFnZSBBZGRyZXNzICAgICAgICAgICAgKi8KKy8qZDQqLwl1OAluY19pYTsJCS8qIEluc3RydWN0aW9uIEFkZHJlc3MgICAgICAgICAgICAgICovCisvKmQ1Ki8JdTgJbmNfaWExOworLypkNiovCXU4CW5jX2lhMjsKKy8qZDcqLwl1OAluY19pYTM7CisvKmQ4Ki8JdTMyCW5jX3NiYzsJCS8qIFNDU0kgQnl0ZSBDb3VudCAoMyBieXRlcyBvbmx5KSAgICovCisvKmRjKi8JdTMyCW5jX2NzYmM7CS8qIEN1bXVsYXRpdmUgU0NTSSBCeXRlIENvdW50ICAgICAgICovCisKKwkJCQkvKiBGb2xsb3dpbmcgZm9yIEMxMDEwIG9ubHkgICAgICAgICAqLworLyplMCovICB1MTYJbmNfY3JjcGFkOwkvKiBDUkMgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAqLworLyplMiovICB1OAluY19jcmNjbnRsMDsJLyogQ1JDIGNvbnRyb2wgcmVnaXN0ZXIgICAgICAgICAgICAgKi8KKwkjZGVmaW5lICAgU05EQ1JDICAweDEwCS8qIFNlbmQgQ1JDIFJlcXVlc3QgICAgICAgICAgICAgICAgICovCisvKmUzKi8gIHU4CW5jX2NyY2NudGwxOwkvKiBDUkMgY29udHJvbCByZWdpc3RlciAgICAgICAgICAgICAqLworLyplNCovICB1MzIJbmNfY3JjZGF0YTsJLyogQ1JDIGRhdGEgcmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8gCisvKmU4Ki8gIHUzMgluY19lOF87CQkvKiByc3ZkIAkJCSAgICAqLworLyplYyovICB1MzIJbmNfZWNfOwkJLyogcnN2ZCAJCQkgICAgKi8KKy8qZjAqLyAgdTE2CW5jX2RmYmM7CS8qIERNQSBGSUZPIGJ5dGUgY291bnQgICAgICAgICAgICAgICovIAorCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJVXRpbGl0eSBtYWNyb3MgZm9yIHRoZSBzY3JpcHQuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZSBSRUdKKHAscikgKG9mZnNldG9mKHN0cnVjdCBuY3JfcmVnLCBwICMjIHIpKQorI2RlZmluZSBSRUcocikgUkVHSiAobmNfLCByKQorCit0eXBlZGVmIHUzMiBuY3JjbWQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglTQ1NJIHBoYXNlcworKioKKyoqCURUIHBoYXNlcyBpbGxlZ2FsIGZvciBuY3IgZHJpdmVyLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUJU0NSX0RBVEFfT1VUCTB4MDAwMDAwMDAKKyNkZWZpbmUJU0NSX0RBVEFfSU4JMHgwMTAwMDAwMAorI2RlZmluZQlTQ1JfQ09NTUFORAkweDAyMDAwMDAwCisjZGVmaW5lCVNDUl9TVEFUVVMJMHgwMzAwMDAwMAorI2RlZmluZSBTQ1JfRFRfREFUQV9PVVQJMHgwNDAwMDAwMAorI2RlZmluZSBTQ1JfRFRfREFUQV9JTgkweDA1MDAwMDAwCisjZGVmaW5lIFNDUl9NU0dfT1VUCTB4MDYwMDAwMDAKKyNkZWZpbmUgU0NSX01TR19JTiAgICAgIDB4MDcwMDAwMDAKKworI2RlZmluZSBTQ1JfSUxHX09VVAkweDA0MDAwMDAwCisjZGVmaW5lIFNDUl9JTEdfSU4JMHgwNTAwMDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJRGF0YSB0cmFuc2ZlciB2aWEgU0NTSS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJTU9WRV9BQlMgKExFTikKKyoqCTw8c3RhcnQgYWRkcmVzcz4+CisqKgorKioJTU9WRV9JTkQgKExFTikKKyoqCTw8ZG5hZF9vZmZzZXQ+PgorKioKKyoqCU1PVkVfVEJMCisqKgk8PGRuYWRfb2Zmc2V0Pj4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lIE9QQ19NT1ZFICAgICAgICAgIDB4MDgwMDAwMDAKKworI2RlZmluZSBTQ1JfTU9WRV9BQlMobCkgKCgweDAwMDAwMDAwIHwgT1BDX01PVkUpIHwgKGwpKQorI2RlZmluZSBTQ1JfTU9WRV9JTkQobCkgKCgweDIwMDAwMDAwIHwgT1BDX01PVkUpIHwgKGwpKQorI2RlZmluZSBTQ1JfTU9WRV9UQkwgICAgICgweDEwMDAwMDAwIHwgT1BDX01PVkUpCisKKyNkZWZpbmUgU0NSX0NITU9WX0FCUyhsKSAoKDB4MDAwMDAwMDApIHwgKGwpKQorI2RlZmluZSBTQ1JfQ0hNT1ZfSU5EKGwpICgoMHgyMDAwMDAwMCkgfCAobCkpCisjZGVmaW5lIFNDUl9DSE1PVl9UQkwgICAgICgweDEwMDAwMDAwKQorCitzdHJ1Y3Qgc2NyX3RibG1vdmUgeworICAgICAgICB1MzIgIHNpemU7CisgICAgICAgIHUzMiAgYWRkcjsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglTZWxlY3Rpb24KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJU0VMX0FCUyB8IFNDUl9JRCAoMC4uMTUpICAgIFsgfCBSRUxfSk1QXQorKioJPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisqKgorKioJU0VMX1RCTCB8IDw8IGRuYWRfb2Zmc2V0Pj4gIFsgfCBSRUxfSk1QXQorKioJPDxhbHRlcm5hdGVfYWRkcmVzcz4+CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2RlZmluZQlTQ1JfU0VMX0FCUwkweDQwMDAwMDAwCisjZGVmaW5lCVNDUl9TRUxfQUJTX0FUTgkweDQxMDAwMDAwCisjZGVmaW5lCVNDUl9TRUxfVEJMCTB4NDIwMDAwMDAKKyNkZWZpbmUJU0NSX1NFTF9UQkxfQVROCTB4NDMwMDAwMDAKKworCisjaWZkZWYgU0NTSV9OQ1JfQklHX0VORElBTgorc3RydWN0IHNjcl90YmxzZWwgeworICAgICAgICB1OAlzZWxfc2NudGwzOworICAgICAgICB1OAlzZWxfaWQ7CisgICAgICAgIHU4CXNlbF9zeGZlcjsKKyAgICAgICAgdTgJc2VsX3NjbnRsNDsJCit9OworI2Vsc2UKK3N0cnVjdCBzY3JfdGJsc2VsIHsKKyAgICAgICAgdTgJc2VsX3NjbnRsNDsJCisgICAgICAgIHU4CXNlbF9zeGZlcjsKKyAgICAgICAgdTgJc2VsX2lkOworICAgICAgICB1OAlzZWxfc2NudGwzOworfTsKKyNlbmRpZgorCisjZGVmaW5lIFNDUl9KTVBfUkVMICAgICAweDA0MDAwMDAwCisjZGVmaW5lIFNDUl9JRChpZCkJKCgodTMyKShpZCkpIDw8IDE2KQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJV2FpdGluZyBmb3IgRGlzY29ubmVjdCBvciBSZXNlbGVjdAorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglXQUlUX0RJU0MKKyoqCWR1bW15OiA8PGFsdGVybmF0ZV9hZGRyZXNzPj4KKyoqCisqKglXQUlUX1JFU0VMCisqKgk8PGFsdGVybmF0ZV9hZGRyZXNzPj4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lCVNDUl9XQUlUX0RJU0MJMHg0ODAwMDAwMAorI2RlZmluZSBTQ1JfV0FJVF9SRVNFTCAgMHg1MDAwMDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJQml0IFNldCAvIFJlc2V0CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVNFVCAoZmxhZ3Mge3wuLiB9KQorKioKKyoqCUNMUiAoZmxhZ3Mge3wuLiB9KQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUgU0NSX1NFVChmKSAgICAgKDB4NTgwMDAwMDAgfCAoZikpCisjZGVmaW5lIFNDUl9DTFIoZikgICAgICgweDYwMDAwMDAwIHwgKGYpKQorCisjZGVmaW5lCVNDUl9DQVJSWQkweDAwMDAwNDAwCisjZGVmaW5lCVNDUl9UUkcJCTB4MDAwMDAyMDAKKyNkZWZpbmUJU0NSX0FDSwkJMHgwMDAwMDA0MAorI2RlZmluZQlTQ1JfQVROCQkweDAwMDAwMDA4CisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglNZW1vcnkgdG8gbWVtb3J5IG1vdmUKKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJQ09QWSAoYnl0ZWNvdW50KQorKioJPDwgc291cmNlX2FkZHJlc3MgPj4KKyoqCTw8IGRlc3RpbmF0aW9uX2FkZHJlc3MgPj4KKyoqCisqKglTQ1JfQ09QWSAgIHNldHMgdGhlIE5PIEZMVVNIIG9wdGlvbiBieSBkZWZhdWx0LgorKioJU0NSX0NPUFlfRiBkb2VzIG5vdCBzZXQgdGhpcyBvcHRpb24uCisqKgorKioJRm9yIGNoaXBzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoaXMgb3B0aW9uLAorKioJbmNyX2NvcHlfYW5kX2JpbmQoKSB3aWxsIHJlbW92ZSB0aGlzIGJpdC4KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUgU0NSX05PX0ZMVVNIIDB4MDEwMDAwMDAKKworI2RlZmluZSBTQ1JfQ09QWShuKSAoMHhjMDAwMDAwMCB8IFNDUl9OT19GTFVTSCB8IChuKSkKKyNkZWZpbmUgU0NSX0NPUFlfRihuKSAoMHhjMDAwMDAwMCB8IChuKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVJlZ2lzdGVyIG1vdmUgYW5kIGJpbmFyeSBvcGVyYXRpb25zCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCVNGQlJfUkVHIChyZWcsIG9wLCBkYXRhKSAgICAgICAgcmVnICA9IFNGQlIgb3AgZGF0YQorKioJPDwgMCA+PgorKioKKyoqCVJFR19TRkJSIChyZWcsIG9wLCBkYXRhKSAgICAgICAgU0ZCUiA9IHJlZyBvcCBkYXRhCisqKgk8PCAwID4+CisqKgorKioJUkVHX1JFRyAgKHJlZywgb3AsIGRhdGEpICAgICAgICByZWcgID0gcmVnIG9wIGRhdGEKKyoqCTw8IDAgPj4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKglPbiA4MTBBLCA4NjAsIDgyNUEsIDg3NSwgODk1IGFuZCA4OTYgY2hpcHMgdGhlIGNvbnRlbnQgCisqKglvZiBTRkJSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGFzIGRhdGEgKFNDUl9TRkJSX0RBVEEpLgorKioJVGhlIDg5NiBoYXMgYWRkaXRpb25uYWwgSU8gcmVnaXN0ZXJzIHN0YXJ0aW5nIGF0IAorKioJb2Zmc2V0IDB4ODAuIEJpdCA3IG9mIHJlZ2lzdGVyIG9mZnNldCBpcyBzdG9yZWQgaW4gCisqKgliaXQgNyBvZiB0aGUgU0NSSVBUUyBpbnN0cnVjdGlvbiBmaXJzdCBEV09SRC4KKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUgU0NSX1JFR19PRlMob2ZzKSAoKCgob2ZzKSAmIDB4N2YpIDw8IDE2dWwpICsgKChvZnMpICYgMHg4MCkpIAorCisjZGVmaW5lIFNDUl9TRkJSX1JFRyhyZWcsb3AsZGF0YSkgXAorICAgICAgICAoMHg2ODAwMDAwMCB8IChTQ1JfUkVHX09GUyhSRUcocmVnKSkpIHwgKG9wKSB8ICgoKGRhdGEpJjB4ZmYpPDw4dWwpKQorCisjZGVmaW5lIFNDUl9SRUdfU0ZCUihyZWcsb3AsZGF0YSkgXAorICAgICAgICAoMHg3MDAwMDAwMCB8IChTQ1JfUkVHX09GUyhSRUcocmVnKSkpIHwgKG9wKSB8ICgoKGRhdGEpJjB4ZmYpPDw4dWwpKQorCisjZGVmaW5lIFNDUl9SRUdfUkVHKHJlZyxvcCxkYXRhKSBcCisgICAgICAgICgweDc4MDAwMDAwIHwgKFNDUl9SRUdfT0ZTKFJFRyhyZWcpKSkgfCAob3ApIHwgKCgoZGF0YSkmMHhmZik8PDh1bCkpCisKKworI2RlZmluZSAgICAgIFNDUl9MT0FEICAgMHgwMDAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9TSEwgICAgMHgwMTAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9PUiAgICAgMHgwMjAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9YT1IgICAgMHgwMzAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9BTkQgICAgMHgwNDAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9TSFIgICAgMHgwNTAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9BREQgICAgMHgwNjAwMDAwMAorI2RlZmluZSAgICAgIFNDUl9BRERDICAgMHgwNzAwMDAwMAorCisjZGVmaW5lICAgICAgU0NSX1NGQlJfREFUQSAgICgweDAwODAwMDAwPj44dWwpCS8qIFVzZSBTRkJSIGFzIGRhdGEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCUZST01fUkVHIChyZWcpCQkgIFNGQlIgPSByZWcKKyoqCTw8IDAgPj4KKyoqCisqKglUT19SRUcJIChyZWcpCQkgIHJlZyAgPSBTRkJSCisqKgk8PCAwID4+CisqKgorKioJTE9BRF9SRUcgKHJlZywgZGF0YSkJICByZWcgID0gPGRhdGE+CisqKgk8PCAwID4+CisqKgorKioJTE9BRF9TRkJSKGRhdGEpIAkgIFNGQlIgPSA8ZGF0YT4KKyoqCTw8IDAgPj4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lCVNDUl9GUk9NX1JFRyhyZWcpIFwKKwlTQ1JfUkVHX1NGQlIocmVnLFNDUl9PUiwwKQorCisjZGVmaW5lCVNDUl9UT19SRUcocmVnKSBcCisJU0NSX1NGQlJfUkVHKHJlZyxTQ1JfT1IsMCkKKworI2RlZmluZQlTQ1JfTE9BRF9SRUcocmVnLGRhdGEpIFwKKwlTQ1JfUkVHX1JFRyhyZWcsU0NSX0xPQUQsZGF0YSkKKworI2RlZmluZSBTQ1JfTE9BRF9TRkJSKGRhdGEpIFwKKyAgICAgICAgKFNDUl9SRUdfU0ZCUiAoZ3ByZWcsIFNDUl9MT0FELCBkYXRhKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCUxPQUQgIGZyb20gbWVtb3J5ICAgdG8gcmVnaXN0ZXIuCisqKglTVE9SRSBmcm9tIHJlZ2lzdGVyIHRvIG1lbW9yeS4KKyoqCisqKglPbmx5IHN1cHBvcnRlZCBieSA4MTBBLCA4NjAsIDgyNUEsIDg3NSwgODk1IGFuZCA4OTYuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCUxPQURfQUJTIChMRU4pCisqKgk8PHN0YXJ0IGFkZHJlc3M+PgorKioKKyoqCUxPQURfUkVMIChMRU4pICAgICAgICAoRFNBIHJlbGF0aXZlKQorKioJPDxkc2Ffb2Zmc2V0Pj4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjZGVmaW5lIFNDUl9SRUdfT0ZTMihvZnMpICgoKG9mcykgJiAweGZmKSA8PCAxNnVsKQorI2RlZmluZSBTQ1JfTk9fRkxVU0gyCTB4MDIwMDAwMDAKKyNkZWZpbmUgU0NSX0RTQV9SRUwyCTB4MTAwMDAwMDAKKworI2RlZmluZSBTQ1JfTE9BRF9SKHJlZywgaG93LCBuKSBcCisgICAgICAgICgweGUxMDAwMDAwIHwgaG93IHwgKFNDUl9SRUdfT0ZTMihSRUcocmVnKSkpIHwgKG4pKQorCisjZGVmaW5lIFNDUl9TVE9SRV9SKHJlZywgaG93LCBuKSBcCisgICAgICAgICgweGUwMDAwMDAwIHwgaG93IHwgKFNDUl9SRUdfT0ZTMihSRUcocmVnKSkpIHwgKG4pKQorCisjZGVmaW5lIFNDUl9MT0FEX0FCUyhyZWcsIG4pCVNDUl9MT0FEX1IocmVnLCBTQ1JfTk9fRkxVU0gyLCBuKQorI2RlZmluZSBTQ1JfTE9BRF9SRUwocmVnLCBuKQlTQ1JfTE9BRF9SKHJlZywgU0NSX05PX0ZMVVNIMnxTQ1JfRFNBX1JFTDIsIG4pCisjZGVmaW5lIFNDUl9MT0FEX0FCU19GKHJlZywgbikJU0NSX0xPQURfUihyZWcsIDAsIG4pCisjZGVmaW5lIFNDUl9MT0FEX1JFTF9GKHJlZywgbikJU0NSX0xPQURfUihyZWcsIFNDUl9EU0FfUkVMMiwgbikKKworI2RlZmluZSBTQ1JfU1RPUkVfQUJTKHJlZywgbikJU0NSX1NUT1JFX1IocmVnLCBTQ1JfTk9fRkxVU0gyLCBuKQorI2RlZmluZSBTQ1JfU1RPUkVfUkVMKHJlZywgbikJU0NSX1NUT1JFX1IocmVnLCBTQ1JfTk9fRkxVU0gyfFNDUl9EU0FfUkVMMixuKQorI2RlZmluZSBTQ1JfU1RPUkVfQUJTX0YocmVnLCBuKQlTQ1JfU1RPUkVfUihyZWcsIDAsIG4pCisjZGVmaW5lIFNDUl9TVE9SRV9SRUxfRihyZWcsIG4pCVNDUl9TVE9SRV9SKHJlZywgU0NSX0RTQV9SRUwyLCBuKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKglXYWl0aW5nIGZvciBEaXNjb25uZWN0IG9yIFJlc2VsZWN0CisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqCUpVTVAgICAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisqKgk8PGFkZHJlc3M+PgorKioKKyoqCUpVTVBSICAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisqKgk8PGRpc3RhbmNlPj4KKyoqCisqKglDQUxMICAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorKioJPDxhZGRyZXNzPj4KKyoqCisqKglDQUxMUiAgICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorKioJPDxkaXN0YW5jZT4+CisqKgorKioJUkVUVVJOICAgICAgICAgIFsgfCBJRlRSVUUvSUZGQUxTRSAoIC4uLiApIF0KKyoqCTw8ZHVtbXk+PgorKioKKyoqCUlOVCAgICAgICAgICAgICBbIHwgSUZUUlVFL0lGRkFMU0UgKCAuLi4gKSBdCisqKgk8PGlkZW50Pj4KKyoqCisqKglJTlRfRkxZICAgICAgICAgWyB8IElGVFJVRS9JRkZBTFNFICggLi4uICkgXQorKioJPDxpZGVudD4+CisqKgorKioJQ29uZGl0aW9uczoKKyoqCSAgICAgV0hFTiAocGhhc2UpCisqKgkgICAgIElGICAgKHBoYXNlKQorKioJICAgICBDQVJSWVNFVAorKioJICAgICBEQVRBIChkYXRhLCBtYXNrKQorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNkZWZpbmUgU0NSX05PX09QICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgU0NSX0pVTVAgICAgICAgIDB4ODAwODAwMDAKKyNkZWZpbmUgU0NSX0pVTVA2NCAgICAgIDB4ODA0ODAwMDAKKyNkZWZpbmUgU0NSX0pVTVBSICAgICAgIDB4ODA4ODAwMDAKKyNkZWZpbmUgU0NSX0NBTEwgICAgICAgIDB4ODgwODAwMDAKKyNkZWZpbmUgU0NSX0NBTExSICAgICAgIDB4ODg4ODAwMDAKKyNkZWZpbmUgU0NSX1JFVFVSTiAgICAgIDB4OTAwODAwMDAKKyNkZWZpbmUgU0NSX0lOVCAgICAgICAgIDB4OTgwODAwMDAKKyNkZWZpbmUgU0NSX0lOVF9GTFkgICAgIDB4OTgxODAwMDAKKworI2RlZmluZSBJRkZBTFNFKGFyZykgICAoMHgwMDA4MDAwMCB8IChhcmcpKQorI2RlZmluZSBJRlRSVUUoYXJnKSAgICAoMHgwMDAwMDAwMCB8IChhcmcpKQorCisjZGVmaW5lIFdIRU4ocGhhc2UpICAgICgweDAwMDMwMDAwIHwgKHBoYXNlKSkKKyNkZWZpbmUgSUYocGhhc2UpICAgICAgKDB4MDAwMjAwMDAgfCAocGhhc2UpKQorCisjZGVmaW5lIERBVEEoRCkgICAgICAgICgweDAwMDQwMDAwIHwgKChEKSAmIDB4ZmYpKQorI2RlZmluZSBNQVNLKEQsTSkgICAgICAoMHgwMDA0MDAwMCB8ICgoKE0gXiAweGZmKSAmIDB4ZmYpIDw8IDh1bCl8KChEKSAmIDB4ZmYpKQorCisjZGVmaW5lIENBUlJZU0VUICAgICAgICgweDAwMjAwMDAwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKioJU0NTSSAgY29uc3RhbnRzLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisqKglNZXNzYWdlcworKi8KKworI2RlZmluZQlNX0NPTVBMRVRFCUNPTU1BTkRfQ09NUExFVEUKKyNkZWZpbmUJTV9FWFRFTkRFRAlFWFRFTkRFRF9NRVNTQUdFCisjZGVmaW5lCU1fU0FWRV9EUAlTQVZFX1BPSU5URVJTCisjZGVmaW5lCU1fUkVTVE9SRV9EUAlSRVNUT1JFX1BPSU5URVJTCisjZGVmaW5lCU1fRElTQ09OTkVDVAlESVNDT05ORUNUCisjZGVmaW5lCU1fSURfRVJST1IJSU5JVElBVE9SX0VSUk9SCisjZGVmaW5lCU1fQUJPUlQJCUFCT1JUX1RBU0tfU0VUCisjZGVmaW5lCU1fUkVKRUNUCU1FU1NBR0VfUkVKRUNUCisjZGVmaW5lCU1fTk9PUAkJTk9QCisjZGVmaW5lCU1fUEFSSVRZCU1TR19QQVJJVFlfRVJST1IKKyNkZWZpbmUJTV9MQ09NUExFVEUJTElOS0VEX0NNRF9DT01QTEVURQorI2RlZmluZQlNX0ZDT01QTEVURQlMSU5LRURfRkxHX0NNRF9DT01QTEVURQorI2RlZmluZQlNX1JFU0VUCQlUQVJHRVRfUkVTRVQKKyNkZWZpbmUJTV9BQk9SVF9UQUcJQUJPUlRfVEFTSworI2RlZmluZQlNX0NMRUFSX1FVRVVFCUNMRUFSX1RBU0tfU0VUCisjZGVmaW5lCU1fSU5JVF9SRUMJSU5JVElBVEVfUkVDT1ZFUlkKKyNkZWZpbmUJTV9SRUxfUkVDCVJFTEVBU0VfUkVDT1ZFUlkKKyNkZWZpbmUJTV9URVJNSU5BVEUJKDB4MTEpCisjZGVmaW5lCU1fU0lNUExFX1RBRwlTSU1QTEVfUVVFVUVfVEFHCisjZGVmaW5lCU1fSEVBRF9UQUcJSEVBRF9PRl9RVUVVRV9UQUcKKyNkZWZpbmUJTV9PUkRFUkVEX1RBRwlPUkRFUkVEX1FVRVVFX1RBRworI2RlZmluZQlNX0lHTl9SRVNJRFVFCUlHTk9SRV9XSURFX1JFU0lEVUUKKyNkZWZpbmUJTV9JREVOVElGWSAgIAkoMHg4MCkKKworI2RlZmluZQlNX1hfTU9ESUZZX0RQCUVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVIKKyNkZWZpbmUJTV9YX1NZTkNfUkVRCUVYVEVOREVEX1NEVFIKKyNkZWZpbmUJTV9YX1dJREVfUkVRCUVYVEVOREVEX1dEVFIKKyNkZWZpbmUJTV9YX1BQUl9SRVEJRVhURU5ERURfUFBSCisKKy8qCisqKglTdGF0dXMKKyovCisKKyNkZWZpbmUJU19HT09ECQkoMHgwMCkKKyNkZWZpbmUJU19DSEVDS19DT05ECSgweDAyKQorI2RlZmluZQlTX0NPTkRfTUVUCSgweDA0KQorI2RlZmluZQlTX0JVU1kJCSgweDA4KQorI2RlZmluZQlTX0lOVAkJKDB4MTApCisjZGVmaW5lCVNfSU5UX0NPTkRfTUVUCSgweDE0KQorI2RlZmluZQlTX0NPTkZMSUNUCSgweDE4KQorI2RlZmluZQlTX1RFUk1JTkFURUQJKDB4MjApCisjZGVmaW5lCVNfUVVFVUVfRlVMTAkoMHgyOCkKKyNkZWZpbmUJU19JTExFR0FMCSgweGZmKQorI2RlZmluZQlTX1NFTlNFCQkoMHg4MCkKKworLyoKKyAqIEVuZCBvZiBuY3JyZWcgZnJvbSBGcmVlQlNECisgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgU1lNNTNDOFhYX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3QxMjguYyBiL2RyaXZlcnMvc2NzaS90MTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjMjg5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS90MTI4LmMKQEAgLTAsMCArMSw0NDkgQEAKKyNkZWZpbmUgQVVUT1NFTlNFCisjZGVmaW5lIFBTRVVET19ETUEKKworLyoKKyAqIFRyYW50b3IgVDEyOC9UMTI4Ri9UMjI4IGRyaXZlcgorICoJTm90ZSA6IGFyY2hpdGVjdHVyYWxseSwgdGhlIFQxMDAgYW5kIFQxMzAgYXJlIGRpZmZlcmVudCBhbmQgd29uJ3QgCisgKiAJd29yaworICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSAzLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29uc3VsdCAKKyAqCisgKiBUcmFudG9yIFN5c3RlbXMsIEx0ZC4KKyAqIFQxMjgvVDEyOEYvVDIyOCBTQ1NJIEhvc3QgQWRhcHRlcgorICogSGFyZHdhcmUgU3BlY2lmaWNhdGlvbnMKKyAqIAorICogVHJhbnRvciBTeXN0ZW1zLCBMdGQuIAorICogNTQxNSBSYW5kYWxsIFBsYWNlCisgKiBGcmVtb250LCBDQSA5NDUzOAorICogMSsgKDQxNSkgNzcwLTE0MDAsIEZBWCAxKyAoNDE1KSA3NzAtOTkxMAorICogCisgKiBhbmQgCisgKgorICogTkNSIDUzODAgRmFtaWx5CisgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKKyAqIERhdGFib29rCisgKgorICogTkNSIE1pY3JvZWxlY3Ryb25pY3MKKyAqIDE2MzUgQWVyb3BsYXphIERyaXZlCisgKiBDb2xvcmFkbyBTcHJpbmdzLCBDTyA4MDkxNgorICogMSsgKDcxOSkgNTc4LTM0MDAKKyAqIDErICg4MDApIDMzNC01NDU0CisgKi8KKworLyoKKyAqIE9wdGlvbnMgOiAKKyAqIEFVVE9TRU5TRSAtIGlmIGRlZmluZWQsIFJFUVVFU1QgU0VOU0Ugd2lsbCBiZSBwZXJmb3JtZWQgYXV0b21hdGljYWxseQorICogICAgICBmb3IgY29tbWFuZHMgdGhhdCByZXR1cm4gd2l0aCBhIENIRUNLIENPTkRJVElPTiBzdGF0dXMuIAorICoKKyAqIFBTRVVET19ETUEgLSBlbmFibGVzIFBTRVVETy1ETUEgaGFyZHdhcmUsIHNob3VsZCBnaXZlIGEgMy00WCBwZXJmb3JtYW5jZQorICogaW5jcmVhc2UgY29tcGFyZWQgdG8gcG9sbGVkIEkvTy4KKyAqCisgKiBQQVJJVFkgLSBlbmFibGUgcGFyaXR5IGNoZWNraW5nLiAgTm90IHN1cHBvcnRlZC4KKyAqIAorICogU0NTSTIgLSBlbmFibGUgc3VwcG9ydCBmb3IgU0NTSS1JSSB0YWdnZWQgcXVldWVpbmcuICBVbnRlc3RlZC4KKyAqCisgKgorICogVU5TQUZFIC0gbGVhdmUgaW50ZXJydXB0cyBlbmFibGVkIGR1cmluZyBwc2V1ZG8tRE1BIHRyYW5zZmVycy4gIFlvdQorICogICAgICAgICAgb25seSByZWFsbHkgd2FudCB0byB1c2UgdGhpcyBpZiB5b3UncmUgaGF2aW5nIGEgcHJvYmxlbSB3aXRoCisgKiAgICAgICAgICBkcm9wcGVkIGNoYXJhY3RlcnMgZHVyaW5nIGhpZ2ggc3BlZWQgY29tbXVuaWNhdGlvbnMsIGFuZCBldmVuCisgKiAgICAgICAgICB0aGVuLCB5b3UncmUgZ29pbmcgdG8gYmUgYmV0dGVyIG9mZiB0d2lkZGxpbmcgd2l0aCB0cmFuc2ZlcnNpemUuCisgKgorICogVVNMRUVQIC0gZW5hYmxlIHN1cHBvcnQgZm9yIGRldmljZXMgdGhhdCBkb24ndCBkaXNjb25uZWN0LiAgVW50ZXN0ZWQuCisgKgorICogVGhlIGNhcmQgaXMgZGV0ZWN0ZWQgYW5kIGluaXRpYWxpemVkIGluIG9uZSBvZiBzZXZlcmFsIHdheXMgOiAKKyAqIDEuICBBdXRvcHJvYmUgKGRlZmF1bHQpIC0gc2luY2UgdGhlIGJvYXJkIGlzIG1lbW9yeSBtYXBwZWQsIAorICogICAgIGEgQklPUyBzaWduYXR1cmUgaXMgc2Nhbm5lZCBmb3IgdG8gbG9jYXRlIHRoZSByZWdpc3RlcnMuCisgKiAgICAgQW4gaW50ZXJydXB0IGlzIHRyaWdnZXJlZCB0byBhdXRvcHJvYmUgZm9yIHRoZSBpbnRlcnJ1cHQKKyAqICAgICBsaW5lLgorICoKKyAqIDIuICBXaXRoIGNvbW1hbmQgbGluZSBvdmVycmlkZXMgLSB0MTI4PWFkZHJlc3MsaXJxIG1heSBiZSAKKyAqICAgICB1c2VkIG9uIHRoZSBMSUxPIGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCisgKgorICogMy4gIFdpdGggdGhlIFQxMjhfT1ZFUlJJREUgY29tcGlsZSB0aW1lIGRlZmluZS4gIFRoaXMgaXMgCisgKiAgICAgc3BlY2lmaWVkIGFzIGFuIGFycmF5IG9mIGFkZHJlc3MsIGlycSB0dXBsZXMuICBJZSwgZm9yCisgKiAgICAgb25lIGJvYXJkIGF0IHRoZSBkZWZhdWx0IDB4Y2MwMDAgYWRkcmVzcywgSVJRNSwgSSBjb3VsZCBzYXkgCisgKiAgICAgLURUMTI4X09WRVJSSURFPXt7MHhjYzAwMCwgNX19CisgKgkKKyAqICAgICBOb3RlIHRoYXQgaWYgdGhlIG92ZXJyaWRlIG1ldGhvZHMgYXJlIHVzZWQsIHBsYWNlIGhvbGRlcnMgbXVzdAorICogICAgIGJlIHNwZWNpZmllZCBmb3Igb3RoZXIgYm9hcmRzIGluIHRoZSBzeXN0ZW0uCisgKiAKKyAqIFQxMjgvVDEyOEYganVtcGVyL2RpcHN3aXRjaCBzZXR0aW5ncyAobm90ZSA6IG9uIG15IHNhbXBsZSwgdGhlIHN3aXRjaGVzIAorICogd2VyZSBlcG94eSdkIHNodXQsIG1lYW5pbmcgSSBjb3VsZG4ndCBjaGFuZ2UgdGhlIDB4Y2MwMDAgYmFzZSBhZGRyZXNzKSA6CisgKgorICogVDEyOCAgICBTdzcgU3c4IFN3NiA9IDB3cyBTdzUgPSBib290IAorICogVDEyOEYgICBTdzYgU3c3IFN3NSA9IDB3cyBTdzQgPSBib290IFN3OCA9IGZsb3BweSBkaXNhYmxlCisgKiBjYzAwMCAgIG9mZiBvZmYgICAgICAKKyAqIGM4MDAwICAgb2ZmIG9uCisgKiBkYzAwMCAgIG9uICBvZmYKKyAqIGQ4MDAwICAgb24gIG9uCisgKgorICogCisgKiBJbnRlcnJ1cHRzIAorICogVGhlcmUgaXMgYSAxMiBwaW4ganVtcGVyIGJsb2NrLCBqcDEsIG51bWJlcmVkIGFzIGZvbGxvd3MgOiAKKyAqICAgVDEyOCAoSlAxKSAgCSBUMTI4RiAoSjUpCisgKiAyIDQgNiA4IDEwIDEyCTExIDkgIDcgNSAzIDEKKyAqIDEgMyA1IDcgOSAgMTEJMTIgMTAgOCA2IDQgMgorICoKKyAqIDMgICAyLTQKKyAqIDUgICAxLTMKKyAqIDcgICAzLTUKKyAqIFQxMjhGIG9ubHkgCisgKiAxMCA4LTEwCisgKiAxMiA3LTkKKyAqIDE0IDEwLTEyCisgKiAxNSA5LTExCisgKi8KKyAKKy8qCisgKiAkTG9nOiB0MTI4LmMsdiAkCisgKi8KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInNjc2kuaCIKKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgInQxMjguaCIKKyNkZWZpbmUgQVVUT1BST0JFX0lSUQorI2luY2x1ZGUgIk5DUjUzODAuaCIKKworc3RhdGljIHN0cnVjdCBvdmVycmlkZSB7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOworICAgIGludCBpcnE7Cit9IG92ZXJyaWRlcyAKKyNpZmRlZiBUMTI4X09WRVJSSURFCisgICAgW10gX19pbml0ZGF0YSA9IFQxMjhfT1ZFUlJJREU7CisjZWxzZQorICAgIFs0XSBfX2luaXRkYXRhID0ge3swLCBJUlFfQVVUT30sIHswLCBJUlFfQVVUT30sIAorICAgICAgICB7MCAsSVJRX0FVVE99LCB7MCwgSVJRX0FVVE99fTsKKyNlbmRpZgorCisjZGVmaW5lIE5PX09WRVJSSURFUyAoc2l6ZW9mKG92ZXJyaWRlcykgLyBzaXplb2Yoc3RydWN0IG92ZXJyaWRlKSkKKworc3RhdGljIHN0cnVjdCBiYXNlIHsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcmVzczsKKyAgICBpbnQgbm9hdXRvOworfSBiYXNlc1tdIF9faW5pdGRhdGEgPSB7CisgICAgeyAweGNjMDAwLCAwfSwgeyAweGM4MDAwLCAwfSwgeyAweGRjMDAwLCAwfSwgeyAweGQ4MDAwLCAwfQorfTsKKworI2RlZmluZSBOT19CQVNFUyAoc2l6ZW9mIChiYXNlcykgLyBzaXplb2YgKHN0cnVjdCBiYXNlKSkKKworc3RhdGljIHN0cnVjdCBzaWduYXR1cmUgeworICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICBpbnQgb2Zmc2V0OworfSBzaWduYXR1cmVzW10gX19pbml0ZGF0YSA9IHsKK3siVFNST006IFNDU0kgQklPUywgVmVyc2lvbiAxLjEyIiwgMHgzNn0sCit9OworCisjZGVmaW5lIE5PX1NJR05BVFVSRVMgKHNpemVvZiAoc2lnbmF0dXJlcykgLyAgc2l6ZW9mIChzdHJ1Y3Qgc2lnbmF0dXJlKSkKKworLyoKKyAqIEZ1bmN0aW9uIDogdDEyOF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKKyAqCisgKiBQdXJwb3NlIDogTElMTyBjb21tYW5kIGxpbmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG92ZXJyaWRlcyBhcnJheSwKKyAqIAorICogSW5wdXRzIDogc3RyIC0gdW51c2VkLCBpbnRzIC0gYXJyYXkgb2YgaW50ZWdlciBwYXJhbWV0ZXJzIHdpdGggaW50c1swXQorICoJZXF1YWwgdG8gdGhlIG51bWJlciBvZiBpbnRzLgorICoKKyAqLworCit2b2lkIF9faW5pdCB0MTI4X3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKXsKKyAgICBzdGF0aWMgaW50IGNvbW1hbmRsaW5lX2N1cnJlbnQgPSAwOworICAgIGludCBpOworICAgIGlmIChpbnRzWzBdICE9IDIpIAorCXByaW50aygidDEyOF9zZXR1cCA6IHVzYWdlIHQxMjg9YWRkcmVzcyxpcnFcbiIpOworICAgIGVsc2UgCisJaWYgKGNvbW1hbmRsaW5lX2N1cnJlbnQgPCBOT19PVkVSUklERVMpIHsKKwkgICAgb3ZlcnJpZGVzW2NvbW1hbmRsaW5lX2N1cnJlbnRdLmFkZHJlc3MgPSBpbnRzWzFdOworCSAgICBvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uaXJxID0gaW50c1syXTsKKwkgICAgZm9yIChpID0gMDsgaSA8IE5PX0JBU0VTOyArK2kpCisJCWlmIChiYXNlc1tpXS5hZGRyZXNzID09IGludHNbMV0pIHsKKwkJICAgIGJhc2VzW2ldLm5vYXV0byA9IDE7CisJCSAgICBicmVhazsKKwkJfQorCSAgICArK2NvbW1hbmRsaW5lX2N1cnJlbnQ7CisJfQorfQorCisvKiAKKyAqIEZ1bmN0aW9uIDogaW50IHQxMjhfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCisgKgorICogUHVycG9zZSA6IGRldGVjdHMgYW5kIGluaXRpYWxpemVzIFQxMjgsVDEyOEYsIG9yIFQyMjggY29udHJvbGxlcnMKKyAqCXRoYXQgd2VyZSBhdXRvcHJvYmVkLCBvdmVycmlkZGVuIG9uIHRoZSBMSUxPIGNvbW1hbmQgbGluZSwgCisgKglvciBzcGVjaWZpZWQgYXQgY29tcGlsZSB0aW1lLgorICoKKyAqIElucHV0cyA6IHRwbnQgLSB0ZW1wbGF0ZSBmb3IgdGhpcyBTQ1NJIGFkYXB0ZXIuCisgKiAKKyAqIFJldHVybnMgOiAxIGlmIGEgaG9zdCBhZGFwdGVyIHdhcyBmb3VuZCwgMCBpZiBub3QuCisgKgorICovCisKK2ludCBfX2luaXQgdDEyOF9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCl7CisgICAgc3RhdGljIGludCBjdXJyZW50X292ZXJyaWRlID0gMCwgY3VycmVudF9iYXNlID0gMDsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKKyAgICB1bnNpZ25lZCBsb25nIGJhc2U7CisgICAgdm9pZCBfX2lvbWVtICpwOworICAgIGludCBzaWcsIGNvdW50OworCisgICAgdHBudC0+cHJvY19uYW1lID0gInQxMjgiOworICAgIHRwbnQtPnByb2NfaW5mbyA9ICZ0MTI4X3Byb2NfaW5mbzsKKworICAgIGZvciAoY291bnQgPSAwOyBjdXJyZW50X292ZXJyaWRlIDwgTk9fT1ZFUlJJREVTOyArK2N1cnJlbnRfb3ZlcnJpZGUpIHsKKwliYXNlID0gMDsKKwlwID0gTlVMTDsKKworCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uYWRkcmVzcykgeworCSAgICBiYXNlID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmFkZHJlc3M7CisJICAgIHAgPSBpb3JlbWFwKGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzcywgMHgyMDAwKTsKKwkgICAgaWYgKCFwKQorCQliYXNlID0gMDsKKwl9IGVsc2UgCisJICAgIGZvciAoOyAhYmFzZSAmJiAoY3VycmVudF9iYXNlIDwgTk9fQkFTRVMpOyArK2N1cnJlbnRfYmFzZSkgeworI2lmIChUREVCVUcgJiBUREVCVUdfSU5JVCkKKyAgICBwcmludGsoInNjc2ktdDEyOCA6IHByb2JpbmcgYWRkcmVzcyAlMDh4XG4iLCBiYXNlc1tjdXJyZW50X2Jhc2VdLmFkZHJlc3MpOworI2VuZGlmCisJCWlmIChiYXNlc1tjdXJyZW50X2Jhc2VdLm5vYXV0bykKKwkJCWNvbnRpbnVlOworCQlwID0gaW9yZW1hcChiYXNlc1tjdXJyZW50X2Jhc2VdLmFkZHJlc3MsIDB4MjAwMCk7CisJCWlmICghcCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKHNpZyA9IDA7IHNpZyA8IE5PX1NJR05BVFVSRVM7ICsrc2lnKSAKKwkJICAgIGlmIChjaGVja19zaWduYXR1cmUocCArIHNpZ25hdHVyZXNbc2lnXS5vZmZzZXQsCisJCQkJCXNpZ25hdHVyZXNbc2lnXS5zdHJpbmcsCisJCQkJCXN0cmxlbihzaWduYXR1cmVzW3NpZ10uc3RyaW5nKSkpIHsKKwkJCWJhc2UgPSBiYXNlc1tjdXJyZW50X2Jhc2VdLmFkZHJlc3M7CisjaWYgKFRERUJVRyAmIFRERUJVR19JTklUKQorCQkJcHJpbnRrKCJzY3NpLXQxMjggOiBkZXRlY3RlZCBib2FyZC5cbiIpOworI2VuZGlmCisJCQlnb3RvIGZvdW5kOworCQkgICAgfQorCQlpb3VubWFwKHApOworCSAgICB9CisKKyNpZiBkZWZpbmVkKFRERUJVRykgJiYgKFRERUJVRyAmIFRERUJVR19JTklUKQorCXByaW50aygic2NzaS10MTI4IDogYmFzZSA9ICUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIGJhc2UpOworI2VuZGlmCisKKwlpZiAoIWJhc2UpCisJICAgIGJyZWFrOworCitmb3VuZDoKKwlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOworCWlmKGluc3RhbmNlID09IE5VTEwpCisJCWJyZWFrOworCQkKKwlpbnN0YW5jZS0+YmFzZSA9IGJhc2U7CisJKChzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmJhc2UgPSBwOworCisJTkNSNTM4MF9pbml0KGluc3RhbmNlLCAwKTsKKworCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxICE9IElSUV9BVVRPKQorCSAgICBpbnN0YW5jZS0+aXJxID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycTsKKwllbHNlIAorCSAgICBpbnN0YW5jZS0+aXJxID0gTkNSNTM4MF9wcm9iZV9pcnEoaW5zdGFuY2UsIFQxMjhfSVJRUyk7CisKKwlpZiAoaW5zdGFuY2UtPmlycSAhPSBTQ1NJX0lSUV9OT05FKSAKKwkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHQxMjhfaW50ciwgU0FfSU5URVJSVVBULCAidDEyOCIsIGluc3RhbmNlKSkgeworCQlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCAKKwkJICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKwkJaW5zdGFuY2UtPmlycSA9IFNDU0lfSVJRX05PTkU7CisJICAgIH0gCisKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKSB7CisJICAgIHByaW50aygic2NzaSVkIDogaW50ZXJydXB0cyBub3QgZW5hYmxlZC4gZm9yIGJldHRlciBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSxcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwkgICAgcHJpbnRrKCJzY3NpJWQgOiBwbGVhc2UganVtcGVyIHRoZSBib2FyZCBmb3IgYSBmcmVlIElSUS5cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwl9CisKKyNpZiBkZWZpbmVkKFRERUJVRykgJiYgKFRERUJVRyAmIFRERUJVR19JTklUKQorCXByaW50aygic2NzaSVkIDogaXJxID0gJWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKKyNlbmRpZgorCisJcHJpbnRrKCJzY3NpJWQgOiBhdCAweCUwOGx4IiwgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5iYXNlKTsKKwlpZiAoaW5zdGFuY2UtPmlycSA9PSBTQ1NJX0lSUV9OT05FKQorCSAgICBwcmludGsgKCIgaW50ZXJydXB0cyBkaXNhYmxlZCIpOworCWVsc2UgCisJICAgIHByaW50ayAoIiBpcnEgJWQiLCBpbnN0YW5jZS0+aXJxKTsKKwlwcmludGsoIiBvcHRpb25zIENBTl9RVUVVRT0lZCAgQ01EX1BFUl9MVU49JWQgcmVsZWFzZT0lZCIsCisJICAgIENBTl9RVUVVRSwgQ01EX1BFUl9MVU4sIFQxMjhfUFVCTElDX1JFTEVBU0UpOworCU5DUjUzODBfcHJpbnRfb3B0aW9ucyhpbnN0YW5jZSk7CisJcHJpbnRrKCJcbiIpOworCisJKytjdXJyZW50X292ZXJyaWRlOworCSsrY291bnQ7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB0MTI4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisJTkNSNTM4MF9zZXR1cChzaG9zdCk7CisJaWYgKHNob3N0LT5pcnEpCisJCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOworCU5DUjUzODBfZXhpdChzaG9zdCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCWlvdW5tYXAoYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiA6IGludCB0MTI4X2Jpb3NwYXJhbShEaXNrICogZGlzaywgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LCBpbnQgKmlwKQorICoKKyAqIFB1cnBvc2UgOiBHZW5lcmF0ZXMgYSBCSU9TIC8gRE9TIGNvbXBhdGlibGUgSC1DLVMgbWFwcGluZyBmb3IgCisgKgl0aGUgc3BlY2lmaWVkIGRldmljZSAvIHNpemUuCisgKiAKKyAqIElucHV0cyA6IHNpemUgPSBzaXplIG9mIGRldmljZSBpbiBzZWN0b3JzICg1MTIgYnl0ZXMpLCBkZXYgPSBibG9jayBkZXZpY2UKKyAqCW1ham9yIC8gbWlub3IsIGlwW10gPSB7aGVhZHMsIHNlY3RvcnMsIGN5bGluZGVyc30gIAorICoKKyAqIFJldHVybnMgOiBhbHdheXMgMCAoc3VjY2VzcyksIGluaXRpYWxpemVzIGlwCisgKgkKKyAqLworCisvKiAKKyAqIFhYWCBNb3N0IFNDU0kgYm9hcmRzIHVzZSB0aGlzIG1hcHBpbmcsIEkgY291bGQgYmUgaW5jb3JyZWN0LiAgU29tZSBvbmUKKyAqIHVzaW5nIGhhcmQgZGlza3Mgb24gYSB0cmFudG9yIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGlzIG1hcHBpbmcgY29ycmVzcG9uZHMKKyAqIHRvIHRoYXQgdXNlZCBieSB0aGUgQklPUyAvIEFTUEkgZHJpdmVyIGJ5IHJ1bm5pbmcgdGhlIGxpbnV4IGZkaXNrIHByb2dyYW0KKyAqIGFuZCBtYXRjaGluZyB0aGUgSF9DX1MgY29vcmRpbmF0ZXMgdG8gd2hhdCBET1MgdXNlcy4KKyAqLworCitpbnQgdDEyOF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQlzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICogaXApCit7CisgIGlwWzBdID0gNjQ7CisgIGlwWzFdID0gMzI7CisgIGlwWzJdID0gY2FwYWNpdHkgPj4gMTE7CisgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9wcmVhZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAorICoJdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKQorICoKKyAqIFB1cnBvc2UgOiBGYXN0IDUzODAgcHNldWRvLWRtYSByZWFkIGZ1bmN0aW9uLCB0cmFuc2ZlcnMgbGVuIGJ5dGVzIHRvIAorICoJZHN0CisgKiAKKyAqIElucHV0cyA6IGRzdCA9IGRlc3RpbmF0aW9uLCBsZW4gPSBsZW5ndGggaW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBhIGZhaWx1cmUgc3VjaCBhcyBhIHdhdGNoZG9nIAorICogCXRpbWVvdXQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wcmVhZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKmRzdCwKKyAgICBpbnQgbGVuKSB7CisgICAgTkNSNTM4MF9sb2NhbF9kZWNsYXJlKCk7CisgICAgdm9pZCBfX2lvbWVtICpyZWc7CisgICAgdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKyAgICByZWdpc3RlciBpbnQgaSA9IGxlbjsKKworICAgIE5DUjUzODBfc2V0dXAoaW5zdGFuY2UpOworICAgIHJlZyA9IGJhc2UgKyBUX0RBVEFfUkVHX09GRlNFVDsKKworI2lmIDAKKyAgICBmb3IgKDsgaTsgLS1pKSB7CisJd2hpbGUgKCEocmVhZGIoYmFzZStUX1NUQVRVU19SRUdfT0ZGU0VUKSAmIFRfU1RfUkRZKSkgYmFycmllcigpOworI2Vsc2UKKyAgICB3aGlsZSAoIShyZWFkYihiYXNlK1RfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9SRFkpKSBiYXJyaWVyKCk7CisgICAgZm9yICg7IGk7IC0taSkgeworI2VuZGlmCisJKmQrKyA9IHJlYWRiKHJlZyk7CisgICAgfQorCisgICAgaWYgKHJlYWRiKGJhc2UgKyBUX1NUQVRVU19SRUdfT0ZGU0VUKSAmIFRfU1RfVElNKSB7CisJdW5zaWduZWQgY2hhciB0bXA7CisJdm9pZCBfX2lvbWVtICpmb28gPSBiYXNlICsgVF9DT05UUk9MX1JFR19PRkZTRVQ7CisJdG1wID0gcmVhZGIoZm9vKTsKKwl3cml0ZWIodG1wIHwgVF9DUl9DVCwgZm9vKTsKKwl3cml0ZWIodG1wLCBmb28pOworCXByaW50aygic2NzaSVkIDogd2F0Y2hkb2cgdGltZXIgZmlyZWQgaW4gTkNSNTM4MF9wcmVhZCgpXG4iLAorCSAgICBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcmV0dXJuIC0xOworICAgIH0gZWxzZQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9wd3JpdGUgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCAKKyAqCXVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKKyAqCisgKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgd3JpdGUgZnVuY3Rpb24sIHRyYW5zZmVycyBsZW4gYnl0ZXMgZnJvbQorICoJc3JjCisgKiAKKyAqIElucHV0cyA6IHNyYyA9IHNvdXJjZSwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKKyAqIAl0aW1lb3V0LgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IE5DUjUzODBfcHdyaXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgdW5zaWduZWQgY2hhciAqc3JjLAorICAgIGludCBsZW4pIHsKKyAgICBOQ1I1MzgwX2xvY2FsX2RlY2xhcmUoKTsKKyAgICB2b2lkIF9faW9tZW0gKnJlZzsKKyAgICB1bnNpZ25lZCBjaGFyICpzID0gc3JjOworICAgIHJlZ2lzdGVyIGludCBpID0gbGVuOworCisgICAgTkNSNTM4MF9zZXR1cChpbnN0YW5jZSk7CisgICAgcmVnID0gYmFzZSArIFRfREFUQV9SRUdfT0ZGU0VUOworCisjaWYgMAorICAgIGZvciAoOyBpOyAtLWkpIHsKKwl3aGlsZSAoIShyZWFkYihiYXNlK1RfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9SRFkpKSBiYXJyaWVyKCk7CisjZWxzZQorICAgIHdoaWxlICghKHJlYWRiKGJhc2UrVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBUX1NUX1JEWSkpIGJhcnJpZXIoKTsKKyAgICBmb3IgKDsgaTsgLS1pKSB7CisjZW5kaWYKKwl3cml0ZWIoKnMrKywgcmVnKTsKKyAgICB9CisKKyAgICBpZiAocmVhZGIoYmFzZSArIFRfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9USU0pIHsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwl2b2lkIF9faW9tZW0gKmZvbyA9IGJhc2UgKyBUX0NPTlRST0xfUkVHX09GRlNFVDsKKwl0bXAgPSByZWFkYihmb28pOworCXdyaXRlYih0bXAgfCBUX0NSX0NULCBmb28pOworCXdyaXRlYih0bXAsIGZvbyk7CisJcHJpbnRrKCJzY3NpJWQgOiB3YXRjaGRvZyB0aW1lciBmaXJlZCBpbiBOQ1I1MzgwX3B3cml0ZSgpXG4iLAorCSAgICBpbnN0YW5jZS0+aG9zdF9ubyk7CisJcmV0dXJuIC0xOworICAgIH0gZWxzZSAKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSAiTkNSNTM4MC5jIgorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiVHJhbnRvciBUMTI4L1QxMjhGL1QyMjgiLAorCS5kZXRlY3QgICAgICAgICA9IHQxMjhfZGV0ZWN0LAorCS5yZWxlYXNlICAgICAgICA9IHQxMjhfcmVsZWFzZSwKKwkucXVldWVjb21tYW5kICAgPSB0MTI4X3F1ZXVlX2NvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSB0MTI4X2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciAgICA9IHQxMjhfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgICA9IHQxMjhfaG9zdF9yZXNldCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSB0MTI4X2RldmljZV9yZXNldCwKKwkuYmlvc19wYXJhbSAgICAgPSB0MTI4X2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlICAgICAgPSBDQU5fUVVFVUUsCisgICAgICAgIC50aGlzX2lkICAgICAgICA9IDcsCisJLnNnX3RhYmxlc2l6ZSAgID0gU0dfQUxMLAorCS5jbWRfcGVyX2x1biAgICA9IENNRF9QRVJfTFVOLAorCS51c2VfY2x1c3RlcmluZyA9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS90MTI4LmggYi9kcml2ZXJzL3Njc2kvdDEyOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWJhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvdDEyOC5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogVHJhbnRvciBUMTI4L1QxMjhGL1QyMjggZGVmaW5lcworICoJTm90ZSA6IGFyY2hpdGVjdHVyYWxseSwgdGhlIFQxMDAgYW5kIFQxMjggYXJlIGRpZmZlcmVudCBhbmQgd29uJ3Qgd29yaworICoKKyAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0CisgKglWaXNpb25hcnkgQ29tcHV0aW5nCisgKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQorICoJZHJld0Bjb2xvcmFkby5lZHUKKyAqICAgICAgKzEgKDMwMykgNDQwLTQ4OTQKKyAqCisgKiBESVNUUklCVVRJT04gUkVMRUFTRSAzLiAKKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKgorICogVHJhbnRvciBTeXN0ZW1zLCBMdGQuCisgKiBUMTI4L1QxMjhGL1QyMjggU0NTSSBIb3N0IEFkYXB0ZXIKKyAqIEhhcmR3YXJlIFNwZWNpZmljYXRpb25zCisgKiAKKyAqIFRyYW50b3IgU3lzdGVtcywgTHRkLiAKKyAqIDU0MTUgUmFuZGFsbCBQbGFjZQorICogRnJlbW9udCwgQ0EgOTQ1MzgKKyAqIDErICg0MTUpIDc3MC0xNDAwLCBGQVggMSsgKDQxNSkgNzcwLTk5MTAKKyAqIAorICogYW5kIAorICoKKyAqIE5DUiA1MzgwIEZhbWlseQorICogU0NTSSBQcm90b2NvbCBDb250cm9sbGVyCisgKiBEYXRhYm9vaworICoKKyAqIE5DUiBNaWNyb2VsZWN0cm9uaWNzCisgKiAxNjM1IEFlcm9wbGF6YSBEcml2ZQorICogQ29sb3JhZG8gU3ByaW5ncywgQ08gODA5MTYKKyAqIDErICg3MTkpIDU3OC0zNDAwCisgKiAxKyAoODAwKSAzMzQtNTQ1NAorICovCisKKy8qCisgKiAkTG9nOiB0MTI4LmgsdiAkCisgKi8KKworI2lmbmRlZiBUMTI4X0gKKyNkZWZpbmUgVDEyOF9ICisKKyNkZWZpbmUgVDEyOF9QVUJMSUNfUkVMRUFTRSAzCisKKyNkZWZpbmUgVERFQlVHX0lOSVQJMHgxCisjZGVmaW5lIFRERUJVR19UUkFOU0ZFUiAweDIKKworLyoKKyAqIFRoZSB0cmFudG9yIGJvYXJkcyBhcmUgbWVtb3J5IG1hcHBlZC4gVGhleSB1c2UgYW4gTkNSNTM4MCBvciAKKyAqIGVxdWl2YWxlbnQgKG15IHNhbXBsZSBib2FyZCBoYWQgcGFydCBzZWNvbmQgc291cmNlZCBmcm9tIFpJTE9HKS4KKyAqIE5DUidzIHJlY29tbWVuZGVkICJQc2V1ZG8tRE1BIiBhcmNoaXRlY3R1cmUgaXMgdXNlZCwgd2hlcmUgCisgKiBhIFBBTCBkcml2ZXMgdGhlIERNQSBzaWduYWxzIG9uIHRoZSA1MzgwIGFsbG93aW5nIGZhc3QsIGJsaW5kCisgKiB0cmFuc2ZlcnMgd2l0aCBwcm9wZXIgaGFuZHNoYWtpbmcuIAorICovCisKKy8qCisgKiBOb3RlIDogYSBib290IHN3aXRjaCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgaW5mb3JtaW5nIHRoZSAKKyAqIGZpcm13YXJlIHRvIGJvb3Qgb3Igbm90IGJvb3QgZnJvbSBhdHRhY2hlZCBTQ1NJIGRldmljZXMuICBTbywgSSBpbWFnaW5lCisgKiB0aGVyZSBhcmUgZmV3ZXIgcGVvcGxlIHdobyd2ZSB5YW5rZWQgdGhlIFJPTSBsaWtlIHRoZXkgZG8gb24gdGhlIFNlYWdhdGUKKyAqIHRvIG1ha2UgYm9vdHVwIGZhc3RlciwgYW5kIEknbGwgcHJvYmFibHkgdXNlIHRoaXMgZm9yIGF1dG9kZXRlY3Rpb24uCisgKi8KKyNkZWZpbmUgVF9ST01fT0ZGU0VUCQkwCisKKy8qCisgKiBOb3RlIDogbXkgc2FtcGxlIGJvYXJkICpXQVMgTk9UKiBwb3B1bGF0ZWQgd2l0aCB0aGUgU1JBTSwgc28gdGhpcworICogY2FuJ3QgYmUgdXNlZCBmb3IgYXV0b2RldGVjdGlvbiB3aXRob3V0IGEgUk9NIHByZXNlbnQuCisgKi8KKyNkZWZpbmUgVF9SQU1fT0ZGU0VUCQkweDE4MDAKKworLyoKKyAqIEFsbCBvZiB0aGUgcmVnaXN0ZXJzIGFyZSBhbGxvY2F0ZWQgMzIgYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZSwgZXhjZXB0CisgKiBmb3IgdGhlIGRhdGEgcmVnaXN0ZXIgKHJlYWQvd3JpdGUgdG8vZnJvbSB0aGUgNTM4MCBpbiBwc2V1ZG8tRE1BIG1vZGUpCisgKi8gCisjZGVmaW5lIFRfQ09OVFJPTF9SRUdfT0ZGU0VUCTB4MWMwMAkvKiBydyAqLworI2RlZmluZSBUX0NSX0lOVAkJMHgxMAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworI2RlZmluZSBUX0NSX0NUCQkJMHgwMgkvKiBSZXNldCB3YXRjaGRvZyB0aW1lciAqLworCisjZGVmaW5lIFRfU1RBVFVTX1JFR19PRkZTRVQJMHgxYzIwCS8qIHJvICovCisjZGVmaW5lIFRfU1RfQk9PVAkJMHg4MAkvKiBCb290IHN3aXRjaCAqLworI2RlZmluZSBUX1NUX1MzCQkJMHg0MAkvKiBVc2VyIHNldHRhYmxlIHN3aXRjaGVzLCAqLworI2RlZmluZSBUX1NUX1MyCQkJMHgyMAkvKiByZWFkIDAgd2hlbiBzd2l0Y2ggaXMgb24sIDEgb2ZmICovCisjZGVmaW5lIFRfU1RfUzEJCQkweDEwCisjZGVmaW5lIFRfU1RfUFMyCQkweDA4CS8qIFNldCBmb3IgTWljcm9jaGFubmVsIDIyOCAqLworI2RlZmluZSBUX1NUX1JEWQkJMHgwNAkvKiA1MzgwIERSUSAqLworI2RlZmluZSBUX1NUX1RJTQkJMHgwMgkvKiBpbmRpY2F0ZXMgNDB1cyB3YXRjaGRvZyB0aW1lciBmaXJlZCAqLworI2RlZmluZSBUX1NUX1pFUk8JCTB4MDEJLyogQWx3YXlzIHplcm8gKi8KKworI2RlZmluZSBUXzUzODBfT0ZGU0VUCQkweDFkMDAJLyogOCByZWdpc3RlcnMgaGVyZSwgc2VlIE5DUjUzODAuaCAqLworCisjZGVmaW5lIFRfREFUQV9SRUdfT0ZGU0VUCTB4MWUwMAkvKiBydyA1MTIgYnl0ZXMgbG9uZyAqLworCisjaWZuZGVmIEFTTQorc3RhdGljIGludCB0MTI4X2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgdDEyOF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJCSAgc2VjdG9yX3QsIGludCopOworc3RhdGljIGludCB0MTI4X2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgaW50IHQxMjhfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHQxMjhfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHQxMjhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgdDEyOF9kZXZpY2VfcmVzZXQoU2NzaV9DbW5kICopOworCisjaWZuZGVmIENNRF9QRVJfTFVOCisjZGVmaW5lIENNRF9QRVJfTFVOIDIKKyNlbmRpZgorCisjaWZuZGVmIENBTl9RVUVVRQorI2RlZmluZSBDQU5fUVVFVUUgMzIgCisjZW5kaWYKKworI2lmbmRlZiBIT1NUU19DCisKKyNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgXAorICAgIHZvaWQgX19pb21lbSAqYmFzZQorCisjZGVmaW5lIE5DUjUzODBfbG9jYWxfZGVjbGFyZSgpIFwKKyAgICB2b2lkIF9faW9tZW0gKmJhc2UKKworI2RlZmluZSBOQ1I1MzgwX3NldHVwKGluc3RhbmNlKSBcCisgICAgYmFzZSA9ICgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW5zdGFuY2UtPmhvc3RkYXRhKSktPmJhc2UKKworI2RlZmluZSBUMTI4X2FkZHJlc3MocmVnKSAoYmFzZSArIFRfNTM4MF9PRkZTRVQgKyAoKHJlZykgKiAweDIwKSkKKworI2lmICEoVERFQlVHICYgVERFQlVHX1RSQU5TRkVSKSAKKyNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgcmVhZGIoVDEyOF9hZGRyZXNzKHJlZykpCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgd3JpdGViKCh2YWx1ZSksKFQxMjhfYWRkcmVzcyhyZWcpKSkKKyNlbHNlCisjZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpCQkJCQkJXAorICAgICgoKHVuc2lnbmVkIGNoYXIpIHByaW50aygic2NzaSVkIDogcmVhZCByZWdpc3RlciAlZCBhdCBhZGRyZXNzICUwOHhcbiJcCisgICAgLCBpbnN0YW5jZS0+aG9zdG5vLCAocmVnKSwgVDEyOF9hZGRyZXNzKHJlZykpKSwgcmVhZGIoVDEyOF9hZGRyZXNzKHJlZykpKQorCisjZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgewkJCQkJXAorICAgIHByaW50aygic2NzaSVkIDogd3JpdGUgJTAyeCB0byByZWdpc3RlciAlZCBhdCBhZGRyZXNzICUwOHhcbiIsIAlcCisJICAgIGluc3RhbmNlLT5ob3N0bm8sICh2YWx1ZSksIChyZWcpLCBUMTI4X2FkZHJlc3MocmVnKSk7CVwKKyAgICB3cml0ZWIoKHZhbHVlKSwgKFQxMjhfYWRkcmVzcyhyZWcpKSk7CQkJCVwKK30KKyNlbmRpZgorCisjZGVmaW5lIE5DUjUzODBfaW50ciB0MTI4X2ludHIKKyNkZWZpbmUgZG9fTkNSNTM4MF9pbnRyIGRvX3QxMjhfaW50cgorI2RlZmluZSBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgdDEyOF9xdWV1ZV9jb21tYW5kCisjZGVmaW5lIE5DUjUzODBfYWJvcnQgdDEyOF9hYm9ydAorI2RlZmluZSBOQ1I1MzgwX2hvc3RfcmVzZXQgdDEyOF9ob3N0X3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfZGV2aWNlX3Jlc2V0IHQxMjhfZGV2aWNlX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfYnVzX3Jlc2V0IHQxMjhfYnVzX3Jlc2V0CisjZGVmaW5lIE5DUjUzODBfcHJvY19pbmZvIHQxMjhfcHJvY19pbmZvCisKKy8qIDE1IDE0IDEyIDEwIDcgNSAzIAorICAgMTEwMSAwMTAwIDEwMTAgMTAwMCAqLworICAgCisjZGVmaW5lIFQxMjhfSVJRUyAweGM0YTggCisKKyNlbmRpZiAvKiBlbHNlIGRlZiBIT1NUU19DICovCisjZW5kaWYgLyogbmRlZiBBU00gKi8KKyNlbmRpZiAvKiBUMTI4X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS90bXNjc2ltLmMgYi9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWRmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jCkBAIC0wLDAgKzEsMjY5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRklMRSBOQU1FIDogVE1TQ1NJTS5DCQkJCQkJKgorICoJICAgICBCWSAgIDogQy5MLiBIdWFuZywgIGNoaW5nQHRla3JhbS5jb20udHcJCQkqCisgKglEZXNjcmlwdGlvbjogRGV2aWNlIERyaXZlciBmb3IgVGVrcmFtIERDLTM5MChUKSBQQ0kgU0NTSQkqCisgKgkJICAgICBCdXMgTWFzdGVyIEhvc3QgQWRhcHRlcgkJCQkqCisgKiAoQylDb3B5cmlnaHQgMTk5NS0xOTk2IFRla3JhbSBUZWNobm9sb2d5IENvLiwgTHRkLgkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIChDKSBDb3B5cmlnaHQ6IHB1dCB1bmRlciBHTlUgR1BMIGluIDEwLzk2CQkJCSoKKyAqCQkJCShzZWUgRG9jdW1lbnRhdGlvbi9zY3NpL3Rtc2NzaW0udHh0KQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAkSWQ6IHRtc2NzaW0uYyx2IDIuNjAuMi4zMCAyMDAwLzEyLzIwIDAxOjA3OjEyIGdhcmxvZmYgRXhwICQJCSoKKyAqCUVuaGFuY2VtZW50cyBhbmQgYnVnZml4ZXMgYnkJCQkJCSoKKyAqCUt1cnQgR2FybG9mZiA8a3VydEBnYXJsb2ZmLmRlPgk8Z2FybG9mZkBzdXNlLmRlPgkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJSElTVE9SWToJCQkJCQkJKgorICoJCQkJCQkJCQkqCisgKglSRVYjCURBVEUJTkFNRQlERVNDUklQVElPTgkJCQkqCisgKgkxLjAwICA5Ni8wNC8yNAlDTEgJRmlyc3QgcmVsZWFzZQkJCQkqCisgKgkxLjAxICA5Ni8wNi8xMglDTEgJRml4ZWQgYnVnIG9mIE1lZGlhIENoYW5nZSBmb3IgUmVtb3ZhYmxlICoKKyAqCQkJCURldmljZSwgc2NhbiBhbGwgTFVOLiBTdXBwb3J0IFByZTIuMC4xMCAqCisgKgkxLjAyICA5Ni8wNi8xOAlDTEgJRml4ZWQgYnVnIG9mIENvbW1hbmQgdGltZW91dCAuLi4JKgorICoJMS4wMyAgOTYvMDkvMjUJS0cJQWRkZWQgdG1zY3NpbV9wcm9jX2luZm8oKQkJKgorICoJMS4wNCAgOTYvMTAvMTEJQ0xICVVwZGF0aW5nIGZvciBzdXBwb3J0IEtWIDIuMC54CQkqCisgKgkxLjA1ICA5Ni8xMC8xOAlLRwlGaXhlZCBidWcgaW4gREMzOTBfYWJvcnQobnVsbCBwdHIgZGVyZWYpKgorICoJMS4wNiAgOTYvMTAvMjUJS0cJRml4ZWQgbW9kdWxlIHN1cHBvcnQJCQkqCisgKgkxLjA3ICA5Ni8xMS8wOQlLRwlGaXhlZCB0bXNjc2ltX3Byb2NfaW5mbygpCQkqCisgKgkxLjA4ICA5Ni8xMS8xOAlLRwlGaXhlZCBudWxsIHB0ciBpbiBEQzM5MF9EaXNjb25uZWN0KCkJKgorICoJMS4wOSAgOTYvMTEvMzAJS0cJQWRkZWQgcmVnaXN0ZXIgdGhlIGFsbG9jYXRlZCBJTyBzcGFjZQkqCisgKgkxLjEwICA5Ni8xMi8wNQlDTEgJTW9kaWZpZWQgdG1zY3NpbV9wcm9jX2luZm8oKSwgYW5kIHJlc2V0ICoKKyAqCQkJCXBlbmRpbmcgaW50ZXJydXB0IGluIERDMzkwX2RldGVjdCgpCSoKKyAqCTEuMTEgIDk3LzAyLzA1CUtHL0NMSAlGaXhlZHMgcHJvYmxlbSB3aXRoIHBhcnRpdGlvbnMgZ3JlYXRlcgkqCisgKgkJCQl0aGFuIDFHQgkJCQkqCisgKgkxLjEyICA5OC8wMi8xNSAgTUogICAgICBSZXdyaXR0ZW4gUENJIHByb2JpbmcJCQkqCisgKgkxLjEzICA5OC8wNC8wOAlLRwlTdXBwb3J0IGZvciBub24gREMzOTAsIF9faW5pdGZ1bmMgZGVjbHMsKgorICoJCQkJY2hhbmdlZCBtYXggZGV2cyBmcm9tIDEwIHRvIDE2CQkqCisgKgkxLjE0YSA5OC8wNS8wNQlLRwlEeW5hbWljIERDQiBhbGxvY2F0aW9uLCBhZGQtc2luZ2xlLWRldgkqCisgKgkJCQlmb3IgTFVOcyBpZiBMVU5fU0NBTiAoQklPUykgbm90IHNldAkqCisgKgkJCQlydW50aW1lIGNvbmZpZyB1c2luZyAvcHJvYyBpbnRlcmZhY2UJKgorICoJMS4xNGIgOTgvMDUvMDYJS0cJZWxpbWluYXRlZCBjbGkgKCk7IHN0aSAoKTsgc3BpbmxvY2tzCSoKKyAqCTEuMTRjIDk4LzA1LzA3CUtHCTIuMC54IGNvbXBhdGliaWxpdHkJCQkqCisgKgkxLjIwYSA5OC8wNS8wNwlLRwljaGFuZ2VkIG5hbWVzIG9mIGZ1bmNzIHRvIGJlIGNvbnNpc3RlbnQgKgorICoJCQkJREMzOTBfIChlbnRyeSBwb2ludHMpLCBkYzM5MF8gKGludGVybmFsKSoKKyAqCQkJCXJld29ya2VkIGxvY2tpbmcJCQkqCisgKgkxLjIwYiA5OC8wNS8xMglLRwlidWdzOiB2ZXJzaW9uLCBrZnJlZSwgX2N0bXAJCSoKKyAqCQkJCWRlYnVnIG91dHB1dAkJCQkqCisgKgkxLjIwYyA5OC8wNS8xMglLRwlidWdzOiBrZnJlZSwgcGFyc2luZywgRUVwcm9tRGVmYXVsdHMJKgorICoJMS4yMGQgOTgvMDUvMTQJS0cJYnVnczogbGlzdCBsaW5rYWdlLCBjbGVhciBmbGFnIGFmdGVyICAJKgorICoJCQkJcmVzZXQgb24gc3RhcnR1cCwgY29kZSBjbGVhbnVwCQkqCisgKgkxLjIwZSA5OC8wNS8xNQlLRwlzcGlubG9jayBjb21tZW50cywgbmFtZSBzcGFjZSBjbGVhbnVwCSoKKyAqCQkJCXBMYXN0RENCIG5vdyBwYXJ0IG9mIEFDQiBzdHJ1Y3R1cmUJKgorICoJCQkJYWRkZWQgc3RhdHMsIHRpbWVvdXQgZm9yIDIuMSwgVGFnUSBidWcJKgorICoJCQkJUkVTRVQgYW5kIElOUVVJUlkgaW50ZXJmYWNlIGNvbW1hbmRzCSoKKyAqCTEuMjBmIDk4LzA1LzE4CUtHCXNwaW5sb2NrcyBmaXhlcywgbWF4X2x1biBmaXgsIGZyZWUgRENCcwkqCisgKgkJCQlmb3IgbWlzc2luZyBMVU5zLCBwZW5kaW5nIGludAkJKgorICoJMS4yMGcgOTgvMDUvMTkJS0cJQ2xlYW4gdXA6IEF2b2lkIHNob3J0CQkJKgorICoJMS4yMGggOTgvMDUvMjEJS0cJUmVtb3ZlIEFkYXB0U0NTSUlELCBtYXhfbHVuIC4uLgkJKgorICoJMS4yMGkgOTgvMDUvMjEJS0cJQWlpaWU6IEJ1ZyB3aXRoIFRhZ1FNYXNrICAgICAgIAkJKgorICoJMS4yMGogOTgvMDUvMjQJS0cJSGFuZGxlIFNUQVRfQlVTWSwgaGFuZGxlIHBBQ0ItPnBMaW5rRENCCSoKKyAqCQkJCT09IDAgaW4gcmVtb3ZlX2RldiBhbmQgRG9pbmdTUkJfRG9uZQkqCisgKgkxLjIwayA5OC8wNS8yNQlLRwlETUFfSU5UCShleHBlcmltZW50YWwpCSAgICAgICAJCSoKKyAqCTEuMjBsIDk4LzA1LzI3CUtHCXJlbW92ZSBETUFfSU5UOyBETUFfSURMRSBjbWRzIGFkZGVkOwkqCisgKgkxLjIwbSA5OC8wNi8xMAlLRwlnbGl0Y2ggY29uZmlndXJhYmxlOyBtYWRlIHNvbWUgZ2xvYmFsCSoKKyAqCQkJCXZhcnMgcGFydCBvZiBBQ0I7IHVzZSBEQzM5MF9yZWFkWAkqCisgKgkxLjIwbiA5OC8wNi8xMQlLRwlzdGFydHVwIHBhcmFtcwkJCQkqCisgKgkxLjIwbyA5OC8wNi8xNQlLRwlhZGRlZCBUYWdNYXhOdW0gdG8gYm9vdC9tb2R1bGUgcGFyYW1zCSoKKyAqCQkJCURldmljZSBOciAtPiBJZHgsIFRhZ01heE51bSBwb3dlciBvZiAyICAqCisgKgkxLjIwcCA5OC8wNi8xNwlLRwlEb2N1IHVwZGF0ZXMuIFJlc2V0IGRlcGVuZHMgb24gc2V0dGluZ3MgKgorICoJCQkJcGNpX3NldF9tYXN0ZXIgYWRkZWQ7IDIuMC54eDogcGNpYmlvc18qCSoKKyAqCQkJCXVzZWQgaW5zdGVhZCBvZiBNZWNoTnVtIHRoaW5ncyAuLi4JKgorICoJMS4yMHEgOTgvMDYvMjMJS0cJQ2hhbmdlZCBkZWZhdWx0cy4gQWRkZWQgZGVidWcgY29kZSBmb3IJKgorICoJCQkJcmVtb3ZhYmxlIG1lZGlhIGFuZCBmaXhlZCBpdC4gVGFnTWF4TnVtCSoKKyAqCQkJCWZpeGVkIGZvciBEQzM5MC4gTG9ja2luZzogQUNCLCBEUlYgZm9yCSoKKyAqCQkJCWJldHRlciBJUlEgc2hhcmluZy4gU3BlbGxpbmc6IFF1ZXVlaW5nCSoKKyAqCQkJCVBhcnNpbmcgYW5kIGdsaXRjaF9jZmcgY2hhbmdlcy4gRGlzcGxheQkqCisgKgkJCQlyZWFsIFN5bmNTcGVlZCB2YWx1ZS4gTWFkZSBEaXNDb25uCSoKKyAqCQkJCWZ1bmN0aW9uYWwgKCEpCQkJCSoKKyAqCTEuMjByIDk4LzA2LzMwCUtHCURlYnVnIG1hY3JvcywgYWxsb3cgZGlzYWJsaW5nIERzQ24sIHNldAkqCisgKgkJCQlCSVQ0IGluIEN0cmxSNCwgRU5fUEFHRV9JTlQsIDIuMCBtb2R1bGUJKgorICoJCQkJcGFyYW0gLTEgZml4ZWQuCQkJCSoKKyAqCTEuMjBzIDk4LzA4LzIwCUtHCURlYnVnIGluZm8gb24gYWJvcnQoKSwgdHJ5IHRvIGNoZWNrIFBDSSwqCisgKgkJCQlwaHlzX3RvX2J1cyBpbnN0ZWFkIG9mIHBoeXNfdG9fdmlydCwJKgorICoJCQkJZml4ZWQgc2VsLiBwcm9jZXNzLCBmaXhlZCBsb2NraW5nLAkqCisgKgkJCQlhZGRlZCBNT0RVTEVfWFhYIGluZm9zLCBjaGFuZ2VkIElSUQkqCisgKgkJCQlyZXF1ZXN0IGZsYWdzLCBkaXNhYmxlIERNQV9JTlQJCSoKKyAqCTEuMjB0IDk4LzA5LzA3CUtHCVRhZ1EgcmVwb3J0IGZpeGVkOyBXcml0ZSBFcmFzZSBETUEgU3RhdDsqCisgKgkJCQlpbml0ZnVuYyAtPiBfX2luaXQ7IGJldHRlciBhYm9ydDsJKgorICoJCQkJVGltZW91dCBmb3IgWEZFUl9ET05FICYgQkxBU1RfQ09NUExFVEU7CSoKKyAqCQkJCUFsbG93IHVwIHRvIDMzIGNvbW1hbmRzIGJlaW5nIHByb2Nlc3NlZCAqCisgKgkyLjBhICA5OC8xMC8xNAlLRwlNYXggQ21uZHMgYmFjayB0byAxNy4gRE1BX1N0YXQgY2xlYXJpbmcgKgorICoJCQkJYWxsIGZsYWdzLiBDbGVhciB3aXRoaW4gd2hpbGUoKSBsb29wcwkqCisgKgkJCQlpbiBEYXRhSW5fMC9PdXRfMC4gTnVsbCBwdHIgaW4gZHVtcGluZm8JKgorICoJCQkJZm9yIHBTUkI9PTAuIEJldHRlciBsb2NraW5nIGR1cmluZyBpbml0LioKKyAqCQkJCWJpb3NfcGFyYW0oKSBub3cgcmVzcGVjdHMgcGFydC4gdGFibGUuCSoKKyAqCTIuMGIgIDk4LzEwLzI0CUtHCURvY3UgZml4ZXMuIFRpbWVvdXQgTXNnIGluIERNQSBCbGFzdC4JKgorICoJCQkJRGlzYWxsb3cgaWxsZWdhbCBpZHggaW4gSU5RVUlSWS9SRU1PVkUJKgorICoJMi4wYyAgOTgvMTEvMTkJS0cJQ2xlYW5lZCB1cCBkZXRlY3QvaW5pdCBmb3IgU01QIGJveGVzLCAJKgorICoJCQkJV3JpdGUgRXJhc2UgRE1BICgxLjIwdCkgY2F1c2VkIHByb2JsZW1zCSoKKyAqCTIuMGQgIDk4LzEyLzI1CUtHCUNocmlzdG1hcyByZWxlYXNlIDstKSBNZXNzYWdlIGhhbmRsaW5nICAqCisgKgkJCQljb21wbGV0ZWx5IHJld29ya2VkLiBIYW5kbGUgdGFyZ2V0IGluaS0JKgorICoJCQkJdGlhdGVkIFNEVFIgY29ycmVjdGx5LgkJCSoKKyAqCTIuMGQxIDk5LzAxLzI1CUtHCVRyeSB0byBoYW5kbGUgUkVTVE9SRV9QVFIJCSoKKyAqCTIuMGQyIDk5LzAyLzA4CUtHCUNoZWNrIGZvciBmYWlsdXJlIG9mIGttYWxsb2MsIGNvcnJlY3QgCSoKKyAqCQkJCWluY2x1c2lvbiBvZiBzY3NpY2FtLmgsIERlbGF5UmVzZXQJKgorICoJMi4wZDMgOTkvMDUvMzEJS0cJRFJJVkVSX09LIC0+IERJRF9PSywgRElEX05PX0NPTk5FQ1QsCSoKKyAqCQkJCWRldGVjdCBUYXJnZXQgbW9kZSBhbmQgd2Fybi4JCSoKKyAqCQkJCXBjbWQtPnJlc3VsdCBoYW5kbGluZyBjbGVhbmVkIHVwLgkqCisgKgkyLjBkNCA5OS8wNi8wMQlLRwlDbGVhbmVkIHNlbGVjdGlvbiBwcm9jZXNzLiBGb3VuZCBidWcJKgorICoJCQkJd2hpY2ggcHJldmVudGVkIG1vcmUgdGhhbiAxNiB0YWdzLiBOb3c6CSoKKyAqCQkJCTI0LiBTRFRSIGNsZWFudXAuIENsZWFuZXIgbXVsdGktTFVOCSoKKyAqCQkJCWhhbmRsaW5nLiBEb24ndCBtb2RpZnkgQ29udHJvbFJlZ3MvRklGTwkqCisgKgkJCQl3aGVuIGNvbm5lY3RlZC4JCQkJKgorICoJMi4wZDUgOTkvMDYvMDEJS0cJQ2xlYXIgRGV2SUQsIEZpeCBJTlFVSVJZIGFmdGVyIGNmZyBjaGcuCSoKKyAqCTIuMGQ2IDk5LzA2LzAyCUtHCUFkZGVkIEFERCBzcGVjaWFsIGNvbW1hbmQgdG8gYWxsb3cgY2ZnLgkqCisgKgkJCQliZWZvcmUgZGV0ZWN0aW9uLiBSZXNldCBTWU5DX05FR09fRE9ORQkqCisgKgkJCQlhZnRlciBhIGJ1cyByZXNldC4JCQkqCisgKgkyLjBkNyA5OS8wNi8wMwlLRwlGaXhlZCBidWdzIHdydCBhZGQscmVtb3ZlIGNvbW1hbmRzCSoKKyAqCTIuMGQ4IDk5LzA2LzA0CUtHCVJlbW92ZWQgY29weWluZyBvZiBjbW5kIGludG8gQ21kQmxvY2suCSoKKyAqCQkJCUZpeGVkIE9vcHMgaW4gX3JlbGVhc2UoKS4JCSoKKyAqCTIuMGQ5IDk5LzA2LzA2CUtHCUFsc28gdGFnIHF1ZXVlIElOUVVJUlksIFRfVV9SLCAuLi4JKgorICoJCQkJQWxsb3cgYXJiLiBuby4gb2YgVGFnZ2VkIENtbmRzLiBNYXggMzIJKgorICoJMi4wZDEwOTkvMDYvMjAJS0cJVGFnTWF4Tm8gY2hhbmdlcyBub3cgaG9ub3VyZWQhIFF1ZXVlaW5nICoKKyAqCQkJCWNsZWFyaWZpZWQgKHJlbmFtZWQgLi4pIFRhZ01hc2sgaGFuZGxpbmcqCisgKgkJCQljbGVhbmVkLgkJCQkqCisgKgkyLjBkMTE5OS8wNi8yOAlLRwljbWQtPnJlc3VsdCBub3cgaWRlbnRpY2FsIHRvIDIuMGQyCSoKKyAqCTIuMGQxMjk5LzA3LzA0CUtHCUNoYW5nZWQgb3JkZXIgb2YgcHJvY2Vzc2luZyBpbiBJUlEJKgorICoJMi4wZDEzOTkvMDcvMDUJS0cJRG9uJ3QgdXBkYXRlIERDQiBmaWVsZHMgaWYgcmVtb3ZlZAkqCisgKgkyLjBkMTQ5OS8wNy8wNQlLRwlyZW1vdmVfZGV2OiBNb3ZlIGtmcmVlKCkgdG8gdGhlIGVuZAkqCisgKgkyLjBkMTU5OS8wNy8xMglLRwl1c2VfbmV3X2VoX2NvZGU6IDAsIFVMT05HIC0+IFVJTlQgd2hlcmUJKgorICoJCQkJYXBwcm9wcmlhdGUJCQkJKgorICoJMi4wZDE2OTkvMDcvMTMJS0cJUmVlbmFibGUgU3RhcnRTQ1NJIGludGVycnVwdCwgUmV0cnkgbXNnCSoKKyAqCTIuMGQxNzk5LzA3LzE1CUtHCVJlbW92ZSBkZWJ1ZyBtc2cuIERpc2FibGUgcmVjZmcuIHdoZW4JKgorICoJCQkJdGhlcmUgYXJlIHF1ZXVlZCBjbW5kcwkJCSoKKyAqCTIuMGQxODk5LzA3LzE4CUtHCVNlbGVjdGlvbiB0aW1lb3V0OiBEb24ndCByZXF1ZXVlCSoKKyAqCTIuMGQxOTk5LzA3LzE4CUtHCUFib3J0OiBPbmx5IGNhbGwgc2NzaV9kb25lIGlmIGRlcXVldWVkCSoKKyAqCTIuMGQyMDk5LzA3LzE5CUtHCVJzdF9EZXRlY3Q6IERvaW5nU1JCX0RvbmUJCSoKKyAqCTIuMGQyMTk5LzA4LzE1CUtHCWRldl9pZCBmb3IgcmVxdWVzdC9mcmVlX2lycSwgY21uZFswXSBmb3IqCisgKgkJCQlSRVRSWSwgU1JCZG9uZSBkb2VzIERJRF9BQk9SVCBmb3IgdGhlIAkqCisgKgkJCQljbWQgcGFzc2VkIGJ5IERDMzkwX3Jlc2V0KCkJCSoKKyAqCTIuMGQyMjk5LzA4LzI1CUtHCWRldl9pZCBmaXhlZC4gY2FuX3F1ZXVlOiA0MgkJKgorICoJMi4wZDIzOTkvMDgvMjUJS0cJUmVtb3ZlZCBzb21lIGRlYnVnZ2luZyBjb2RlLiBkZXZfaWQgCSoKKyAqCQkJCW5vdyBpcyBzZXQgdG8gcEFDQi4gVXNlIHU4LHUxNix1MzIuIAkqCisgKgkyLjBkMjQ5OS8xMS8xNAlLRwlVbnJlZy4gSS9PIGlmIGZhaWxlZCBJUlEgYWxsb2MuIENhbGwJKgorICogCQkJCWRvbmUgKCkgdy8gRElEX0JBRF9UQVJHRVQgaW4gY2FzZSBvZgkqCisgKgkJCQltaXNzaW5nIERDQi4gV2UJYXJlIG9sZCBFSCEhCQkqCisgKgkyLjBkMjUwMC8wMS8xNQlLRwkyLjMuM3ggY29tcGF0IGZyb20gQW5kcmVhcyBTY2h1bHR6CSoKKyAqCQkJCXNldCB1bmlxdWVfaWQuIERpc2FibGUgUkVUUlkgbWVzc2FnZS4JKgorICoJMi4wZDI2MDAvMDEvMjkJS0cJR28gdG8gbmV3IEVILgkJCQkqCisgKgkyLjBkMjcwMC8wMS8zMQlLRwkuLi4gYnV0IG1haW50YWluIDIuMCBjb21wYXQuCQkqCisgKgkJCQlhbmQgZml4IERDQiBmcmVlaW5nCQkJKgorICoJMi4wZDI4MDAvMDIvMTQJS0cJUXVldWUgc3RhdGlzdGljcyBmaXhlZCwgZHVtcCBzcGVjaWFsIGNtZCoKKyAqCQkJCVdhaXRpbmdfVGltZXIgZm9yIGZhaWxlZCBTdGFydFNDU0kJKgorICoJCQkJTmV3IEVIOiBEb24ndCByZXR1cm4gY21uZHMgdG8gTUwgb24gUlNUICoKKyAqCQkJCVVzZSBvbGQgRUggKGRvbid0IGhhdmUgbmV3IEVIIGZucyB5ZXQpCSoKKyAqIAkJCQlSZXNldDogVW5sb2NrLCBidXQgcmVmdXNlIHRvIHF1ZXVlCSoKKyAqIAkJCQkyLjMgX19zZXR1cCBmdW5jdGlvbgkJCSoKKyAqCTIuMGUgIDAwLzA1LzIyCUtHCVJldHVybiByZXNpZHVhbCBmb3IgMi4zCQkJKgorICoJMi4wZTEgMDAvMDUvMjUJS0cJQ29tcGlsZSBmaXhlcyBmb3IgMi4zLjk5CQkqCisgKgkyLjBlMiAwMC8wNS8yNwlLRwlKZWZmIEdhcnppaydzIHBjaV9lbmFibGVfZGV2aWNlKCkJKgorICoJMi4wZTMgMDAvMDkvMjkJS0cJU29tZSAyLjQgY2hhbmdlcy4gRG9uJ3QgdHJ5IFN5bmMgTmVnbwkqCisgKgkJCQliZWZvcmUgSU5RVUlSWSBoYXMgcmVwb3J0ZWQgYWJpbGl0eS4gCSoKKyAqCQkJCVJlY29nbmlzZSBJTlFVSVJZIGFzIHNjYW5uaW5nIGNvbW1hbmQuCSoKKyAqCTIuMGU0IDAwLzEwLzEzCUtHCUFsbG93IGNvbXBpbGF0aW9uIGludG8gMi40IGtlcm5lbAkqCisgKgkyLjBlNSAwMC8xMS8xNwlLRwlTdG9yZSBJbnEuZmxhZ3MgaW4gRENCCQkJKgorICoJMi4wZTYgMDAvMTEvMjIgIEtHCTIuNCBpbml0IGZ1bmN0aW9uIChUaHggdG8gTy5TY2h1bWFubikJKgorICogCQkJCTIuNCBQQ0kgZGV2aWNlIHRhYmxlIChUaHggdG8gQS5SaWNodGVyKQkqCisgKgkyLjBlNyAwMC8xMS8yOAlLRwlBbGxvdyBvdmVycmlkaW5nIG9mIEJJT1Mgc2V0dGluZ3MJKgorICoJMi4wZiAgMDAvMTIvMjAJS0cJSGFuZGxlIGZhaWxlZCBJTlFVSVJZcyBkdXJpbmcgc2NhbgkqCisgKgkyLjFhICAwMy8xMS8yOSAgR0wsIEtHCUluaXRpYWwgZml4aW5nIGZvciAyLjYuIENvbnZlcnQgdG8JKgorICoJCQkJdXNlIHRoZSBjdXJyZW50IFBDSS1tYXBwaW5nIEFQSSwgdXBkYXRlCSoKKyAqCQkJCWNvbW1hbmQtcXVldWluZy4JCQkqCisgKgkyLjFiICAwNC8wNC8xMyAgR0wJRml4IGZvciA2NC1iaXQgcGxhdGZvcm1zCQkqCisgKgkyLjFiMSAwNC8wMS8zMQlHTAkoYXBwbGllZCAwNS4wNCkgUmVtb3ZlIGludGVybmFsCQkqCisgKgkJCQljb21tYW5kLXF1ZXVpbmcuCQkJKgorICoJMi4xYjIgMDQvMDIvMDEJQ0gJKGFwcGxpZWQgMDUuMDQpIEZpeCBlcnJvci1oYW5kbGluZwkqCisgKgkyLjFjICAwNC8wNS8yMyAgR0wJVXBkYXRlIHRvIHVzZSB0aGUgbmV3IHBjaV9kcml2ZXIgQVBJLAkqCisgKgkJCQlzb21lIHNjc2kgRUggdXBkYXRlcywgbW9yZSBjbGVhbnVwLgkqCisgKgkyLjFkICAwNC8wNS8yNwlHTAlNb3ZlZCBzZXR0aW5nIG9mIHNjYW5fZGV2aWNlcyB0bwkqCisgKgkJCQlzbGF2ZV9hbGxvYy9fY29uZmlndXJlL19kZXN0cm95LCBhcwkqCisgKgkJCQlzdWdnZXN0ZWQgYnkgQ0guCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBERUJVRyBvcHRpb25zICovCisvLyNkZWZpbmUgREMzOTBfREVCVUcwCisvLyNkZWZpbmUgREMzOTBfREVCVUcxCisvLyNkZWZpbmUgREMzOTBfRENCREVCVUcKKy8vI2RlZmluZSBEQzM5MF9QQVJTRURFQlVHCisvLyNkZWZpbmUgREMzOTBfUkVNT1ZBQkxFREVCVUcKKy8vI2RlZmluZSBEQzM5MF9MT0NLREVCVUcKKworLy8jZGVmaW5lIE5PUCBkb3t9d2hpbGUoMCkKKyNkZWZpbmUgQ19OT1AKKworLyogRGVidWcgZGVmaW5pdGlvbnMgKi8KKyNpZmRlZiBEQzM5MF9ERUJVRzAKKyMgZGVmaW5lIERFQlVHMCh4KSB4CisjZWxzZQorIyBkZWZpbmUgREVCVUcwKHgpIENfTk9QCisjZW5kaWYKKyNpZmRlZiBEQzM5MF9ERUJVRzEKKyMgZGVmaW5lIERFQlVHMSh4KSB4CisjZWxzZQorIyBkZWZpbmUgREVCVUcxKHgpIENfTk9QCisjZW5kaWYKKyNpZmRlZiBEQzM5MF9EQ0JERUJVRworIyBkZWZpbmUgRENCREVCVUcoeCkgeAorI2Vsc2UKKyMgZGVmaW5lIERDQkRFQlVHKHgpIENfTk9QCisjZW5kaWYKKyNpZmRlZiBEQzM5MF9QQVJTRURFQlVHCisjIGRlZmluZSBQQVJTRURFQlVHKHgpIHgKKyNlbHNlCisjIGRlZmluZSBQQVJTRURFQlVHKHgpIENfTk9QCisjZW5kaWYKKyNpZmRlZiBEQzM5MF9SRU1PVkFCTEVERUJVRworIyBkZWZpbmUgUkVNT1ZBQkxFREVCVUcoeCkgeAorI2Vsc2UKKyMgZGVmaW5lIFJFTU9WQUJMRURFQlVHKHgpIENfTk9QCisjZW5kaWYKKyNkZWZpbmUgRENCREVCVUcxKHgpIENfTk9QCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisKKworI2RlZmluZSBEQzM5MF9CQU5ORVIgIlRla3JhbSBEQzM5MC9BTTUzQzk3NCIKKyNkZWZpbmUgREMzOTBfVkVSU0lPTiAiMi4xZCAyMDA0LTA1LTI3IgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1ENTNDOTc0IAlQQ0lfREVWSUNFX0lEX0FNRF9TQ1NJCisKKyNpbmNsdWRlICJ0bXNjc2ltLmgiCisKKworc3RhdGljIHZvaWQgZGMzOTBfRGF0YU91dF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfRGF0YUluXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9Db21tYW5kXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9TdGF0dXNfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX01zZ091dF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfTXNnSW5fMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX0RhdGFPdXRQaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX0RhdGFJblBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfQ29tbWFuZFBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworc3RhdGljIHZvaWQgZGMzOTBfU3RhdHVzUGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9Nc2dPdXRQaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX01zZ0luUGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cyk7CitzdGF0aWMgdm9pZCBkYzM5MF9Ob3BfMCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGRjMzkwX05vcF8xKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpOworCitzdGF0aWMgdm9pZCBkYzM5MF9TZXRYZmVyUmF0ZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiApOworc3RhdGljIHZvaWQgZGMzOTBfRGlzY29ubmVjdCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiApOworc3RhdGljIHZvaWQgZGMzOTBfUmVzZWxlY3QoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgKTsKK3N0YXRpYyB2b2lkIGRjMzkwX1NSQmRvbmUoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIgKTsKK3N0YXRpYyB2b2lkIGRjMzkwX1Njc2lSc3REZXRlY3QoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgKTsKK3N0YXRpYyB2b2lkIGRjMzkwX0VuYWJsZU1zZ091dF9BYm9ydChzdHJ1Y3QgZGMzOTBfYWNiKiwgc3RydWN0IGRjMzkwX3NyYiopOworc3RhdGljIHZvaWQgZGMzOTBfZHVtcGluZm8oc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQik7CitzdGF0aWMgdm9pZCBkYzM5MF9SZXNldERldlBhcmFtKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IpOworCitzdGF0aWMgdTMyCWRjMzkwX2xhc3RzdGF0dXMgPSAwOworc3RhdGljIHU4CWRjMzkwX2FkYXB0ZXJDbnQgPSAwOworCisvKiBTdGFydHVwIHZhbHVlcywgdG8gYmUgb3ZlcnJpZGVuIG9uIHRoZSBjb21tYW5kbGluZSAqLworc3RhdGljIGludCB0bXNjc2ltW10gPSB7LTIsIC0yLCAtMiwgLTIsIC0yLCAtMn07CisKK21vZHVsZV9wYXJhbV9hcnJheSh0bXNjc2ltLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyh0bXNjc2ltLCAiSG9zdCBTQ1NJIElELCBTcGVlZCAoMD0xME1IeiksIERldmljZSBGbGFncywgQWRhcHRlciBGbGFncywgTWF4IFRhZ3MgKGxvZzIodGFncyktMSksIERlbGF5UmVzZXQgKHMpIik7CitNT0RVTEVfQVVUSE9SKCJDLkwuIEh1YW5nIC8gS3VydCBHYXJsb2ZmIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgaG9zdCBhZGFwdGVyIGRyaXZlciBmb3IgVGVrcmFtIERDMzkwIGFuZCBvdGhlciBBTUQ1M0M5NzRBIGJhc2VkIFBDSSBTQ1NJIGFkYXB0ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgic2Qsc3Isc2csc3QiKTsKKworc3RhdGljIHZvaWQgKmRjMzkwX3BoYXNlMFtdPXsKKyAgICAgICBkYzM5MF9EYXRhT3V0XzAsCisgICAgICAgZGMzOTBfRGF0YUluXzAsCisgICAgICAgZGMzOTBfQ29tbWFuZF8wLAorICAgICAgIGRjMzkwX1N0YXR1c18wLAorICAgICAgIGRjMzkwX05vcF8wLAorICAgICAgIGRjMzkwX05vcF8wLAorICAgICAgIGRjMzkwX01zZ091dF8wLAorICAgICAgIGRjMzkwX01zZ0luXzAsCisgICAgICAgZGMzOTBfTm9wXzEKKyAgICAgICB9OworCitzdGF0aWMgdm9pZCAqZGMzOTBfcGhhc2UxW109eworICAgICAgIGRjMzkwX0RhdGFPdXRQaGFzZSwKKyAgICAgICBkYzM5MF9EYXRhSW5QaGFzZSwKKyAgICAgICBkYzM5MF9Db21tYW5kUGhhc2UsCisgICAgICAgZGMzOTBfU3RhdHVzUGhhc2UsCisgICAgICAgZGMzOTBfTm9wXzAsCisgICAgICAgZGMzOTBfTm9wXzAsCisgICAgICAgZGMzOTBfTXNnT3V0UGhhc2UsCisgICAgICAgZGMzOTBfTXNnSW5QaGFzZSwKKyAgICAgICBkYzM5MF9Ob3BfMQorICAgICAgIH07CisKKyNpZmRlZiBEQzM5MF9ERUJVRzEKK3N0YXRpYyBjaGFyKiBkYzM5MF9wMF9zdHJbXSA9IHsKKyAgICAgICAiZGMzOTBfRGF0YU91dF8wIiwKKyAgICAgICAiZGMzOTBfRGF0YUluXzAiLAorICAgICAgICJkYzM5MF9Db21tYW5kXzAiLAorICAgICAgICJkYzM5MF9TdGF0dXNfMCIsCisgICAgICAgImRjMzkwX05vcF8wIiwKKyAgICAgICAiZGMzOTBfTm9wXzAiLAorICAgICAgICJkYzM5MF9Nc2dPdXRfMCIsCisgICAgICAgImRjMzkwX01zZ0luXzAiLAorICAgICAgICJkYzM5MF9Ob3BfMSIKKyAgICAgICB9OworICAgICAKK3N0YXRpYyBjaGFyKiBkYzM5MF9wMV9zdHJbXSA9IHsKKyAgICAgICAiZGMzOTBfRGF0YU91dFBoYXNlIiwKKyAgICAgICAiZGMzOTBfRGF0YUluUGhhc2UiLAorICAgICAgICJkYzM5MF9Db21tYW5kUGhhc2UiLAorICAgICAgICJkYzM5MF9TdGF0dXNQaGFzZSIsCisgICAgICAgImRjMzkwX05vcF8wIiwKKyAgICAgICAiZGMzOTBfTm9wXzAiLAorICAgICAgICJkYzM5MF9Nc2dPdXRQaGFzZSIsCisgICAgICAgImRjMzkwX01zZ0luUGhhc2UiLAorICAgICAgICJkYzM5MF9Ob3BfMSIKKyAgICAgICB9OworI2VuZGlmICAgCisKK3N0YXRpYyB1OCAgZGMzOTBfZWVwcm9tQnVmW01BWF9BREFQVEVSX05VTV1bRUVfTEVOXTsKK3N0YXRpYyB1OCAgZGMzOTBfY2xvY2tfcGVyaW9kMVtdID0gezQsIDUsIDYsIDcsIDgsIDEwLCAxMywgMjB9Oworc3RhdGljIHU4ICBkYzM5MF9jbG9ja19zcGVlZFtdID0gezEwMCw4MCw2Nyw1Nyw1MCwgNDAsIDMxLCAyMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb25zIGZvciB0aGUgbWFuYWdlbWVudCBvZiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyAKKyAqIChEQ0JzLCBTUkJzLCBRdWV1ZWluZykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgZGMzOTBfZGNiIF9faW5saW5lX18gKmRjMzkwX2ZpbmREQ0IgKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCB1OCBpZCwgdTggbHVuKQoreworICAgc3RydWN0IGRjMzkwX2RjYiogcERDQiA9IHBBQ0ItPnBMaW5rRENCOyBpZiAoIXBEQ0IpIHJldHVybiBOVUxMOworICAgd2hpbGUgKHBEQ0ItPlRhcmdldElEICE9IGlkIHx8IHBEQ0ItPlRhcmdldExVTiAhPSBsdW4pCisgICAgIHsKKwlwRENCID0gcERDQi0+cE5leHREQ0I7CisJaWYgKHBEQ0IgPT0gcEFDQi0+cExpbmtEQ0IpCisJICAgICByZXR1cm4gTlVMTDsKKyAgICAgfQorICAgRENCREVCVUcxKCBwcmludGsgKEtFUk5fREVCVUcgIkRDQiAlcCAoJTAyeCwlMDJ4KSBmb3VuZC5cbiIsCVwKKwkJICAgICAgcERDQiwgcERDQi0+VGFyZ2V0SUQsIHBEQ0ItPlRhcmdldExVTikpOworICAgcmV0dXJuIHBEQ0I7Cit9CisKKy8qIEluc2VydCBTUkIgb2luIHRvcCBvZiBmcmVlIGxpc3QgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZGMzOTBfRnJlZV9pbnNlcnQgKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisgICAgREVCVUcwKHByaW50ayAoIkRDMzkwOiBGcmVlIFNSQiAlcFxuIiwgcFNSQikpOworICAgIHBTUkItPnBOZXh0U1JCID0gcEFDQi0+cEZyZWVTUkI7CisgICAgcEFDQi0+cEZyZWVTUkIgPSBwU1JCOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGRjMzkwX0dvaW5nX2FwcGVuZCAoc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKyAgICBwRENCLT5Hb2luZ1NSQkNudCsrOworICAgIERFQlVHMChwcmludGsoIkRDMzkwOiBBcHBlbmQgU1JCICVwIHRvIEdvaW5nXG4iLCBwU1JCKSk7CisgICAgLyogQXBwZW5kIHRvIHRoZSBsaXN0IG9mIEdvaW5nIGNvbW1hbmRzICovCisgICAgaWYoIHBEQ0ItPnBHb2luZ1NSQiApCisJcERDQi0+cEdvaW5nTGFzdC0+cE5leHRTUkIgPSBwU1JCOworICAgIGVsc2UKKwlwRENCLT5wR29pbmdTUkIgPSBwU1JCOworCisgICAgcERDQi0+cEdvaW5nTGFzdCA9IHBTUkI7CisgICAgLyogTm8gbmV4dCBvbmUgaW4gc2VudCBsaXN0ICovCisgICAgcFNSQi0+cE5leHRTUkIgPSBOVUxMOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGRjMzkwX0dvaW5nX3JlbW92ZSAoc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKwlERUJVRzAocHJpbnRrKCJEQzM5MDogUmVtb3ZlIFNSQiAlcCBmcm9tIEdvaW5nXG4iLCBwU1JCKSk7CisgICBpZiAocFNSQiA9PSBwRENCLT5wR29pbmdTUkIpCisJcERDQi0+cEdvaW5nU1JCID0gcFNSQi0+cE5leHRTUkI7CisgICBlbHNlCisgICAgIHsKKwlzdHJ1Y3QgZGMzOTBfc3JiKiBwc3JiID0gcERDQi0+cEdvaW5nU1JCOworCXdoaWxlIChwc3JiICYmIHBzcmItPnBOZXh0U1JCICE9IHBTUkIpCisJICBwc3JiID0gcHNyYi0+cE5leHRTUkI7CisJaWYgKCFwc3JiKSAKKwkgIHsgcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IFJlbW92ZSBub24tZXguIFNSQiAlcCBmcm9tIEdvaW5nIVxuIiwgcFNSQik7IHJldHVybjsgfQorCXBzcmItPnBOZXh0U1JCID0gcFNSQi0+cE5leHRTUkI7CisJaWYgKHBTUkIgPT0gcERDQi0+cEdvaW5nTGFzdCkKKwkgIHBEQ0ItPnBHb2luZ0xhc3QgPSBwc3JiOworICAgICB9CisgICBwRENCLT5Hb2luZ1NSQkNudC0tOworfQorCitzdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0KiBkYzM5MF9zZ19idWlsZF9zaW5nbGUoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwltZW1zZXQoc2csIDAsIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKTsKKwlzZy0+cGFnZQk9IHZpcnRfdG9fcGFnZShhZGRyKTsKKwlzZy0+bGVuZ3RoCT0gbGVuZ3RoOworCXNnLT5vZmZzZXQJPSAodW5zaWduZWQgbG9uZylhZGRyICYgflBBR0VfTUFTSzsKKwlyZXR1cm4gc2c7Cit9CisKKy8qIENyZWF0ZSBwY2kgbWFwcGluZyAqLworc3RhdGljIGludCBkYzM5MF9wY2lfbWFwIChzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHNjc2lfY21uZCAqcGNtZCA9IHBTUkItPnBjbWQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwU1JCLT5wU1JCRENCLT5wRENCQUNCLT5wZGV2OworCWRjMzkwX2NtZF9zY3BfdCogY21kcCA9ICgoZGMzOTBfY21kX3NjcF90KikoJnBjbWQtPlNDcCkpOworCisJLyogTWFwIHNlbnNlIGJ1ZmZlciAqLworCWlmIChwU1JCLT5TUkJGbGFnICYgQVVUT19SRVFTRU5TRSkgeworCQlwU1JCLT5wU2VnbWVudExpc3QJPSBkYzM5MF9zZ19idWlsZF9zaW5nbGUoJnBTUkItPlNlZ21lbnR4LCBwY21kLT5zZW5zZV9idWZmZXIsIHNpemVvZihwY21kLT5zZW5zZV9idWZmZXIpKTsKKwkJcFNSQi0+U0djb3VudAkJPSBwY2lfbWFwX3NnKHBkZXYsIHBTUkItPnBTZWdtZW50TGlzdCwgMSwKKwkJCQkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKKwkJY21kcC0+c2F2ZWRfZG1hX2hhbmRsZQk9IHNnX2RtYV9hZGRyZXNzKHBTUkItPnBTZWdtZW50TGlzdCk7CisKKwkJLyogVE9ETzogZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKHBTUkItPlNHY291bnQgIT0gMSkKKwkJCWVycm9yID0gMTsKKwkJREVCVUcxKHByaW50aygiJXMoKTogTWFwcGVkIHNlbnNlIGJ1ZmZlciAlcCBhdCAleFxuIiwgX19GVU5DVElPTl9fLCBwY21kLT5zZW5zZV9idWZmZXIsIGNtZHAtPnNhdmVkX2RtYV9oYW5kbGUpKTsKKwkvKiBNYXAgU0cgbGlzdCAqLworCX0gZWxzZSBpZiAocGNtZC0+dXNlX3NnKSB7CisJCXBTUkItPnBTZWdtZW50TGlzdAk9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgcGNtZC0+cmVxdWVzdF9idWZmZXI7CisJCXBTUkItPlNHY291bnQJCT0gcGNpX21hcF9zZyhwZGV2LCBwU1JCLT5wU2VnbWVudExpc3QsIHBjbWQtPnVzZV9zZywKKwkJCQkJCSAgICAgcGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkvKiBUT0RPOiBlcnJvciBoYW5kbGluZyAqLworCQlpZiAoIXBTUkItPlNHY291bnQpCisJCQllcnJvciA9IDE7CisJCURFQlVHMShwcmludGsoIiVzKCk6IE1hcHBlZCBTRyAlcCB3aXRoICVkICglZCkgZWxlbWVudHNcbiIsXAorCQkJICAgICAgX19GVU5DVElPTl9fLCBwY21kLT5yZXF1ZXN0X2J1ZmZlciwgcFNSQi0+U0djb3VudCwgcGNtZC0+dXNlX3NnKSk7CisJLyogTWFwIHNpbmdsZSBzZWdtZW50ICovCisJfSBlbHNlIGlmIChwY21kLT5yZXF1ZXN0X2J1ZmZlciAmJiBwY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJcFNSQi0+cFNlZ21lbnRMaXN0CT0gZGMzOTBfc2dfYnVpbGRfc2luZ2xlKCZwU1JCLT5TZWdtZW50eCwgcGNtZC0+cmVxdWVzdF9idWZmZXIsIHBjbWQtPnJlcXVlc3RfYnVmZmxlbik7CisJCXBTUkItPlNHY291bnQJCT0gcGNpX21hcF9zZyhwZGV2LCBwU1JCLT5wU2VnbWVudExpc3QsIDEsCisJCQkJCQkgICAgIHBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJY21kcC0+c2F2ZWRfZG1hX2hhbmRsZQk9IHNnX2RtYV9hZGRyZXNzKHBTUkItPnBTZWdtZW50TGlzdCk7CisKKwkJLyogVE9ETzogZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKHBTUkItPlNHY291bnQgIT0gMSkKKwkJCWVycm9yID0gMTsKKwkJREVCVUcxKHByaW50aygiJXMoKTogTWFwcGVkIHJlcXVlc3QgYnVmZmVyICVwIGF0ICV4XG4iLCBfX0ZVTkNUSU9OX18sIHBjbWQtPnJlcXVlc3RfYnVmZmVyLCBjbWRwLT5zYXZlZF9kbWFfaGFuZGxlKSk7CisJLyogTm8gbWFwcGluZyAhPyAqLwkKKyAgICAJfSBlbHNlCisJCXBTUkItPlNHY291bnQgPSAwOworCisJcmV0dXJuIGVycm9yOworfQorCisvKiBSZW1vdmUgcGNpIG1hcHBpbmcgKi8KK3N0YXRpYyB2b2lkIGRjMzkwX3BjaV91bm1hcCAoc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kID0gcFNSQi0+cGNtZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBTUkItPnBTUkJEQ0ItPnBEQ0JBQ0ItPnBkZXY7CisJREVCVUcxKGRjMzkwX2NtZF9zY3BfdCogY21kcCA9ICgoZGMzOTBfY21kX3NjcF90KikoJnBjbWQtPlNDcCkpKTsKKworCWlmIChwU1JCLT5TUkJGbGFnKSB7CisJCXBjaV91bm1hcF9zZyhwZGV2LCAmcFNSQi0+U2VnbWVudHgsIDEsIERNQV9GUk9NX0RFVklDRSk7CisJCURFQlVHMShwcmludGsoIiVzKCk6IFVubWFwcGVkIHNlbnNlIGJ1ZmZlciBhdCAleFxuIiwgX19GVU5DVElPTl9fLCBjbWRwLT5zYXZlZF9kbWFfaGFuZGxlKSk7CisJfSBlbHNlIGlmIChwY21kLT51c2Vfc2cpIHsKKwkJcGNpX3VubWFwX3NnKHBkZXYsIHBjbWQtPnJlcXVlc3RfYnVmZmVyLCBwY21kLT51c2Vfc2csIHBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJREVCVUcxKHByaW50aygiJXMoKTogVW5tYXBwZWQgU0cgYXQgJXAgd2l0aCAlZCBlbGVtZW50c1xuIiwgX19GVU5DVElPTl9fLCBwY21kLT5yZXF1ZXN0X2J1ZmZlciwgcGNtZC0+dXNlX3NnKSk7CisJfSBlbHNlIGlmIChwY21kLT5yZXF1ZXN0X2J1ZmZlciAmJiBwY21kLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJcGNpX3VubWFwX3NnKHBkZXYsICZwU1JCLT5TZWdtZW50eCwgMSwgcGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlERUJVRzEocHJpbnRrKCIlcygpOiBVbm1hcHBlZCByZXF1ZXN0IGJ1ZmZlciBhdCAleFxuIiwgX19GVU5DVElPTl9fLCBjbWRwLT5zYXZlZF9kbWFfaGFuZGxlKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fCitkYzM5MF9mcmVldGFnIChzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworCWlmIChwU1JCLT5UYWdOdW1iZXIgIT0gU0NTSV9OT19UQUcpIHsKKwkJcERDQi0+VGFnTWFzayAmPSB+KDEgPDwgcFNSQi0+VGFnTnVtYmVyKTsgICAvKiBmcmVlIHRhZyBtYXNrICovCisJCXBTUkItPlRhZ051bWJlciA9IFNDU0lfTk9fVEFHOworCX0KK30KKworCitzdGF0aWMgaW50CitkYzM5MF9TdGFydFNDU0koIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIgKQoreworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQgPSBwU1JCLT5wY21kOworICAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNjbWQtPmRldmljZTsKKyAgICB1OCBjbWQsIGRpc2NfYWxsb3dlZCwgdHJ5X3N5bmNfbmVnbzsKKyAgICBjaGFyIHRhZ1syXTsKKworICAgIHBTUkItPlNjc2lQaGFzZSA9IFNDU0lfTk9QMDsKKworICAgIGlmIChwQUNCLT5Db25uZWN0ZWQpCisgICAgeworCS8vIFNob3VsZCBub3QgaGFwcGVuIG5vcm1hbGx5CisJcHJpbnRrIChLRVJOX1dBUk5JTkcgIkRDMzkwOiBDYW4ndCBzZWxlY3Qgd2hlbiBjb25uZWN0ZWQhICglMDh4LCUwMngpXG4iLAorCQlwU1JCLT5TUkJTdGF0ZSwgcFNSQi0+U1JCRmxhZyk7CisJcFNSQi0+U1JCU3RhdGUgPSBTUkJfUkVBRFk7CisJcEFDQi0+U2VsQ29ubisrOworCXJldHVybiAxOworICAgIH0KKyAgICBpZiAodGltZV9iZWZvcmUgKGppZmZpZXMsIHBBQ0ItPnBTY3NpSG9zdC0+bGFzdF9yZXNldCkpCisgICAgeworCURFQlVHMChwcmludGsgKCJEQzM5MDogV2Ugd2VyZSBqdXN0IHJlc2V0IGFuZCBkb24ndCBhY2NlcHQgY29tbWFuZHMgeWV0IVxuIikpOworCXJldHVybiAxOworICAgIH0KKyAgICAvKiBLRzogTW92ZWQgcGNpIG1hcHBpbmcgaGVyZSAqLworICAgIGRjMzkwX3BjaV9tYXAocFNSQik7CisgICAgLyogVE9ETzogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBEQzM5MF93cml0ZTggKFNjc2lfRGVzdF9JRCwgcERDQi0+VGFyZ2V0SUQpOworICAgIERDMzkwX3dyaXRlOCAoU3luY19QZXJpb2QsIHBEQ0ItPlN5bmNQZXJpb2QpOworICAgIERDMzkwX3dyaXRlOCAoU3luY19PZmZzZXQsIHBEQ0ItPlN5bmNPZmZzZXQpOworICAgIERDMzkwX3dyaXRlOCAoQ3RybFJlZzEsIHBEQ0ItPkN0cmxSMSk7CisgICAgREMzOTBfd3JpdGU4IChDdHJsUmVnMywgcERDQi0+Q3RybFIzKTsKKyAgICBEQzM5MF93cml0ZTggKEN0cmxSZWc0LCBwRENCLT5DdHJsUjQpOworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgQ0xFQVJfRklGT19DTUQpOwkJLyogRmx1c2ggRklGTyAqLworICAgIERFQlVHMShwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IFN0YXJ0IFNDU0kgY29tbWFuZDogJTAyeCAoU3luYzolMDJ4KVxuIixcCisgICAgICAgICAgICBzY21kLT5jbW5kWzBdLCBwRENCLT5TeW5jTW9kZSkpOworCisgICAgLyogRG9uJ3QgZGlzY29ubmVjdCBvbiBBVVRPX1JFUVNFTlNFLCBjYXVzZSBpdCBtaWdodCBiZSBhbgorICAgICAqIENvbnRpbmdlbnQgQWxsZWdpYW5jZSBDb25kaXRpb24gKDYuNiksIHdoZXJlIG5vIHRhZ3Mgc2hvdWxkIGJlIHVzZWQuCisgICAgICogQWxsIG90aGVyIGhhdmUgdG8gYmUgYWxsb3dlZCB0byBkaXNjb25uZWN0IHRvIHByZXZlbnQgSW5jb3JyZWN0IAorICAgICAqIEluaXRpYXRvciBDb25uZWN0aW9uICg2LjguMi82LjUuMikgKi8KKyAgICAvKiBDaGFuZ2VkIEtHLCA5OS8wNi8wNiAqLworICAgIGlmICghIChwU1JCLT5TUkJGbGFnICYgQVVUT19SRVFTRU5TRSkpCisJZGlzY19hbGxvd2VkID0gcERDQi0+RGV2TW9kZSAmIEVOX0RJU0NPTk5FQ1RfOworICAgIGVsc2UKKwlkaXNjX2FsbG93ZWQgPSAwOworCisgICAgaWYgKChwRENCLT5TeW5jTW9kZSAmIFNZTkNfRU5BQkxFKSAmJiBwRENCLT5UYXJnZXRMVU4gPT0gMCAmJiBzZGV2LT5zZHRyICYmCisJKCgoc2NtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFIHx8IChwU1JCLT5TUkJGbGFnICYgQVVUT19SRVFTRU5TRSkpICYmCisJICAhKHBEQ0ItPlN5bmNNb2RlICYgU1lOQ19ORUdPX0RPTkUpKSB8fCBzY21kLT5jbW5kWzBdID09IElOUVVJUlkpKQorICAgICAgdHJ5X3N5bmNfbmVnbyA9IDE7CisgICAgZWxzZQorICAgICAgdHJ5X3N5bmNfbmVnbyA9IDA7CisKKyAgICBwU1JCLT5Nc2dDbnQgPSAwOworICAgIGNtZCA9IFNFTF9XX0FUTjsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBJREVOVElGWShkaXNjX2FsbG93ZWQsIHBEQ0ItPlRhcmdldExVTikpOworICAgIC8qIENoYW5nZSA5OS8wNS8zMTogRG9uJ3QgdXNlIHRhZ3Mgd2hlbiBub3QgZGlzY29ubmVjdGluZyAoQlVTWSkgKi8KKyAgICBpZiAoKHBEQ0ItPlN5bmNNb2RlICYgRU5fVEFHX1FVRVVFSU5HKSAmJiBkaXNjX2FsbG93ZWQgJiYgc2NzaV9wb3B1bGF0ZV90YWdfbXNnKHNjbWQsIHRhZykpIHsKKwlEQzM5MF93cml0ZTgoU2NzaUZpZm8sIHRhZ1swXSk7CisJcERDQi0+VGFnTWFzayB8PSAxIDw8IHRhZ1sxXTsKKwlwU1JCLT5UYWdOdW1iZXIgPSB0YWdbMV07CisJREMzOTBfd3JpdGU4KFNjc2lGaWZvLCB0YWdbMV0pOworCURFQlVHMShwcmludGsoS0VSTl9JTkZPICJEQzM5MDogU2VsZWN0IHcvRGlzQ24gZm9yIENtZCAlbGkgKFNSQiAlcCksIGJsb2NrIHRhZyAlMDJ4XG4iLCBzY21kLT5waWQsIHBTUkIsIHRhZ1sxXSkpOworCWNtZCA9IFNFTF9XX0FUTjM7CisgICAgfSBlbHNlIHsKKwkvKiBObyBUYWdRICovCisvL25vX3RhZzoKKwlERUJVRzEocHJpbnRrKEtFUk5fSU5GTyAiREMzOTA6IFNlbGVjdCB3JXMvRGlzQ24gZm9yIENtZCAlbGkgKFNSQiAlcCksIE5vIFRhZ1FcbiIsIGRpc2NfYWxsb3dlZCA/ICIiIDogIm8iLCBzY21kLT5waWQsIHBTUkIpKTsKKyAgICB9CisKKyAgICBwU1JCLT5TUkJTdGF0ZSA9IFNSQl9TVEFSVF87CisKKyAgICBpZiAodHJ5X3N5bmNfbmVnbykKKyAgICAgIHsgCisJdTggU3luY19PZmYgPSBwRENCLT5TeW5jT2Zmc2V0OworICAgICAgICBERUJVRzAocHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBORVcgU3luYyBOZWdvIGNvZGUgdHJpZ2dlcmVkICglaSAlaSlcbiIsIHBEQ0ItPlRhcmdldElELCBwRENCLT5UYXJnZXRMVU4pKTsKKwlwU1JCLT5Nc2dPdXRCdWZbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOworCXBTUkItPk1zZ091dEJ1ZlsxXSA9IDM7CisJcFNSQi0+TXNnT3V0QnVmWzJdID0gRVhURU5ERURfU0RUUjsKKwlwU1JCLT5Nc2dPdXRCdWZbM10gPSBwRENCLT5OZWdvUGVyaW9kOworCWlmICghKFN5bmNfT2ZmICYgMHgwZikpIFN5bmNfT2ZmID0gU1lOQ19ORUdPX09GRlNFVDsKKwlwU1JCLT5Nc2dPdXRCdWZbNF0gPSBTeW5jX09mZjsKKwlwU1JCLT5Nc2dDbnQgPSA1OworCS8vcFNSQi0+U1JCU3RhdGUgPSBTUkJfTVNHT1VUXzsKKwlwU1JCLT5TUkJTdGF0ZSB8PSBET19TWU5DX05FR087CisJY21kID0gU0VMX1dfQVROX1NUT1A7CisgICAgICB9CisKKyAgICAvKiBDb21tYW5kIGlzIHdyaXR0ZW4gaW4gQ29tbWFuZFBoYXNlLCBpZiBTRUxfV19BVE5fU1RPUCAuLi4gKi8KKyAgICBpZiAoY21kICE9IFNFTF9XX0FUTl9TVE9QKQorICAgICAgeworCWlmKCBwU1JCLT5TUkJGbGFnICYgQVVUT19SRVFTRU5TRSApCisJICB7CisJICAgIERDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIFJFUVVFU1RfU0VOU0UpOworCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCBwRENCLT5UYXJnZXRMVU4gPDwgNSk7CisJICAgIERDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIDApOworCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAwKTsKKwkgICAgREMzOTBfd3JpdGU4IChTY3NpRmlmbywgc2l6ZW9mKHNjbWQtPnNlbnNlX2J1ZmZlcikpOworCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAwKTsKKwkgICAgREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiREMzOTA6IEF1dG9SZXFTZW5zZSAhXG4iKSk7CisJICB9CisJZWxzZQkvKiB3cml0ZSBjbW5kIHRvIGJ1cyAqLyAKKwkgIHsKKwkgICAgdTggKnB0cjsgdTggaTsKKwkgICAgcHRyID0gKHU4ICopc2NtZC0+Y21uZDsKKwkgICAgZm9yIChpID0gMDsgaSA8IHNjbWQtPmNtZF9sZW47IGkrKykKKwkgICAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAqKHB0cisrKSk7CisJICB9CisgICAgICB9CisgICAgREVCVUcwKGlmIChwQUNCLT5wQWN0aXZlRENCKQlcCisJICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIkRDMzkwOiBBY3RpdmVEQ0IgIT0gMFxuIikpOworICAgIERFQlVHMChpZiAocERDQi0+cEFjdGl2ZVNSQikJXAorCSAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJEQzM5MDogQWN0aXZlU1JCICE9IDBcbiIpKTsKKyAgICAvL0RDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKKyAgICBpZiAoREMzOTBfcmVhZDggKFNjc2lfU3RhdHVzKSAmIElOVEVSUlVQVCkKKyAgICB7CisJZGMzOTBfZnJlZXRhZyAocERDQiwgcFNSQik7CisJREVCVUcwKHByaW50ayAoIkRDMzkwOiBJbnRlcnJ1cHQgZHVyaW5nIFN0YXJ0IFNDU0kgKHBpZCAlbGksIHRhcmdldCAlMDJpLSUwMmkpXG4iLAorCQlzY21kLT5waWQsIHNjbWQtPmRldmljZS0+aWQsIHNjbWQtPmRldmljZS0+bHVuKSk7CisJcFNSQi0+U1JCU3RhdGUgPSBTUkJfUkVBRFk7CisJLy9EQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKwlwQUNCLT5TZWxMb3N0Kys7CisJcmV0dXJuIDE7CisgICAgfQorICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgY21kKTsKKyAgICBwQUNCLT5wQWN0aXZlRENCID0gcERDQjsKKyAgICBwRENCLT5wQWN0aXZlU1JCID0gcFNSQjsKKyAgICBwQUNCLT5Db25uZWN0ZWQgPSAxOworICAgIHBTUkItPlNjc2lQaGFzZSA9IFNDU0lfTk9QMTsKKyAgICByZXR1cm4gMDsKK30KKworLy8jZGVmaW5lIERNQV9JTlQgRU5fRE1BX0lOVCAvKnwgRU5fUEFHRV9JTlQqLworI2RlZmluZSBETUFfSU5UIDAKKworI2lmIERNQV9JTlQKKy8qIFRoaXMgaXMgc2ltaWxhciB0byBBTTUzQzk3NC5jIC4uLiAqLworc3RhdGljIHU4IAorZGMzOTBfZG1hX2ludHIgKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IpCit7CisgIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkI7CisgIHU4IGRzdGF0ZTsKKyAgREVCVUcwKHUxNiBwc3RhdGU7IHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcEFDQi0+cGRldik7CisgIAorICBERUJVRzAocGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywgJnBzdGF0ZSkpOworICBERUJVRzAoaWYgKHBzdGF0ZSAmIChQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IgfCBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSkpXAorCXsgcHJpbnRrKEtFUk5fV0FSTklORyAiREMzOTA6IFBDSSBzdGF0ZSA9ICUwNHghXG4iLCBwc3RhdGUpOyBcCisJICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywgKFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8IFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZKSk7fSk7CisKKyAgZHN0YXRlID0gREMzOTBfcmVhZDggKERNQV9TdGF0dXMpOyAKKworICBpZiAoISBwQUNCLT5wQWN0aXZlRENCIHx8ICEgcEFDQi0+cEFjdGl2ZURDQi0+cEFjdGl2ZVNSQikgcmV0dXJuIGRzdGF0ZTsKKyAgZWxzZSBwU1JCICA9IHBBQ0ItPnBBY3RpdmVEQ0ItPnBBY3RpdmVTUkI7CisgIAorICBpZiAoZHN0YXRlICYgKERNQV9YRkVSX0FCT1JUIHwgRE1BX1hGRVJfRVJST1IgfCBQT1dFUl9ET1dOIHwgUENJX01TX0FCT1JUKSkKKyAgICB7CisJcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IERNQSBlcnJvciAoJTAyeCkhXG4iLCBkc3RhdGUpOworCXJldHVybiBkc3RhdGU7CisgICAgfQorICBpZiAoZHN0YXRlICYgRE1BX1hGRVJfRE9ORSkKKyAgICB7CisJdTMyIHJlc2lkdWFsLCB4ZmVyQ250OyBpbnQgY3RyID0gNjAwMDAwMDsKKwlpZiAoISAoREMzOTBfcmVhZDggKERNQV9DbWQpICYgUkVBRF9ESVJFQ1RJT04pKQorCSAgeworCSAgICBkbworCSAgICAgIHsKKwkJREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiREMzOTA6IHJlYWQgcmVzaWR1YWwgYnl0ZXMgLi4uIFxuIikpOworCQlkc3RhdGUgPSBEQzM5MF9yZWFkOCAoRE1BX1N0YXR1cyk7CisJCXJlc2lkdWFsID0gREMzOTBfcmVhZDggKEN0Y1JlZ19Mb3cpIHwgREMzOTBfcmVhZDggKEN0Y1JlZ19NaWQpIDw8IDggfAorCQkgIERDMzkwX3JlYWQ4IChDdGNSZWdfSGlnaCkgPDwgMTY7CisJCXJlc2lkdWFsICs9IERDMzkwX3JlYWQ4IChDdXJyZW50X0ZpZm8pICYgMHgxZjsKKwkgICAgICB9IHdoaWxlIChyZXNpZHVhbCAmJiAhIChkc3RhdGUgJiBTQ1NJX0lOVEVSUlVQVCkgJiYgLS1jdHIpOworCSAgICBpZiAoIWN0cikgcHJpbnRrIChLRVJOX0NSSVQgIkRDMzkwOiBkbWFfaW50cjogRE1BIGFib3J0ZWQgdW5maW5pc2hlZDogJTA2eCBieXRlcyByZW1haW4hIVxuIiwgREMzOTBfcmVhZDMyIChETUFfV2tfQnl0ZUNudHIpKTsKKwkgICAgLyogcmVzaWR1YWwgPSAgLi4uICovCisJICB9CisJZWxzZQorCSAgICByZXNpZHVhbCA9IDA7CisJCisJLyogPz8/ICovCisJCisJeGZlckNudCA9IHBTUkItPlNHVG9CZVhmZXJMZW4gLSByZXNpZHVhbDsKKwlwU1JCLT5TR0J1c0FkZHIgKz0geGZlckNudDsKKwlwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gKz0geGZlckNudDsKKwlwU1JCLT5TR1RvQmVYZmVyTGVuID0gcmVzaWR1YWw7CisjIGlmZGVmIERDMzkwX0RFQlVHMAorCXByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogRE1BOiByZXNpZHVhbCA9ICVpLCB4ZmVyID0gJWlcbiIsIAorCQkodW5zaWduZWQgaW50KXJlc2lkdWFsLCAodW5zaWduZWQgaW50KXhmZXJDbnQpOworIyBlbmRpZgorCQorCURDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKKyAgICB9CisgIGRjMzkwX2xhc3RzdGF0dXMgJj0gfjB4ZmYwMDAwMDA7IGRjMzkwX2xhc3RzdGF0dXMgfD0gZHN0YXRlIDw8IDI0OworICByZXR1cm4gZHN0YXRlOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgX19pbmxpbmVfXworZGMzOTBfSW52YWxpZENtZChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCKQoreworCWlmIChwQUNCLT5wQWN0aXZlRENCLT5wQWN0aXZlU1JCLT5TUkJTdGF0ZSAmIChTUkJfU1RBUlRfIHwgU1JCX01TR09VVCkpCisJCURDMzkwX3dyaXRlOChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IF9faW5saW5lX18KK0RDMzkwX0ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBkYzM5MF9hY2IgKnBBQ0IgPSAoc3RydWN0IGRjMzkwX2FjYiopZGV2X2lkOworICAgIHN0cnVjdCBkYzM5MF9kY2IgKnBEQ0I7CisgICAgc3RydWN0IGRjMzkwX3NyYiAqcFNSQjsKKyAgICB1OCAgc3N0YXR1cz0wOworICAgIHU4ICBwaGFzZTsKKyAgICB2b2lkICAgKCpzdGF0ZVYpKCBzdHJ1Y3QgZGMzOTBfYWNiKiwgc3RydWN0IGRjMzkwX3NyYiosIHU4ICopOworICAgIHU4ICBpc3RhdGUsIGlzdGF0dXM7CisjaWYgRE1BX0lOVAorICAgIHU4ICBkc3RhdHVzOworI2VuZGlmCisKKyAgICBzc3RhdHVzID0gREMzOTBfcmVhZDggKFNjc2lfU3RhdHVzKTsKKyAgICBpZiggIShzc3RhdHVzICYgSU5URVJSVVBUKSApCisJcmV0dXJuIElSUV9OT05FOworCisgICAgREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAic3N0YXR1cz0lMDJ4LCIsIHNzdGF0dXMpKTsKKworI2lmIERNQV9JTlQKKyAgICBzcGluX2xvY2tfaXJxKHBBQ0ItPnBTY3NpSG9zdC0+aG9zdF9sb2NrKTsKKyAgICBkc3RhdHVzID0gZGMzOTBfZG1hX2ludHIgKHBBQ0IpOworICAgIHNwaW5fdW5sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisKKyAgICBERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJkc3RhdHVzPSUwMngsIiwgZHN0YXR1cykpOworICAgIGlmICghIChkc3RhdHVzICYgU0NTSV9JTlRFUlJVUFQpKQorICAgICAgeworCURFQlVHMChwcmludGsgKEtFUk5fV0FSTklORyAiREMzOTAgSW50IHcvbyBTQ1NJIGFjdGlvbnMgKG9ubHkgRE1BPylcbiIpKTsKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgICB9CisjZWxzZQorICAgIC8vREMzOTBfd3JpdGUzMiAoRE1BX1Njc2lCdXNDdHJsLCBXUlRfRVJBU0VfRE1BX1NUQVQgfCBFTl9JTlRfT05fUENJX0FCT1JUKTsKKyAgICAvL2RzdGF0dXMgPSBEQzM5MF9yZWFkOCAoRE1BX1N0YXR1cyk7CisgICAgLy9EQzM5MF93cml0ZTMyIChETUFfU2NzaUJ1c0N0cmwsIEVOX0lOVF9PTl9QQ0lfQUJPUlQpOworI2VuZGlmCisKKyAgICBzcGluX2xvY2tfaXJxKHBBQ0ItPnBTY3NpSG9zdC0+aG9zdF9sb2NrKTsKKworICAgIGlzdGF0ZSA9IERDMzkwX3JlYWQ4IChJbnRlcm5fU3RhdGUpOworICAgIGlzdGF0dXMgPSBEQzM5MF9yZWFkOCAoSU5UX1N0YXR1cyk7IC8qIFRoaXMgY2xlYXJzIFNjc2lfU3RhdHVzLCBJbnRlcm5fU3RhdGUgYW5kIElOVF9TdGF0dXMgISAqLworCisgICAgREVCVUcxKHByaW50ayAoS0VSTl9JTkZPICJJc3RhdHVzKFJlcyxJbnYsRGlzLFNlcnYsU3VjYyxSZVMsU2VsQSxTZWwpPSUwMngsIixpc3RhdHVzKSk7CisgICAgZGMzOTBfbGFzdHN0YXR1cyAmPSB+MHgwMGZmZmZmZjsKKyAgICBkYzM5MF9sYXN0c3RhdHVzIHw9IC8qIGRzdGF0dXM8PDI0IHwgKi8gc3N0YXR1czw8MTYgfCBpc3RhdGU8PDggfCBpc3RhdHVzOworCisgICAgaWYgKHNzdGF0dXMgJiBJTExFR0FMX09QX0VSUikKKyAgICB7CisJcHJpbnRrICgiREMzOTA6IElsbGVnYWwgT3BlcmF0aW9uIGRldGVjdGVkICglMDh4KSFcbiIsIGRjMzkwX2xhc3RzdGF0dXMpOworCWRjMzkwX2R1bXBpbmZvIChwQUNCLCBwQUNCLT5wQWN0aXZlRENCLCBwQUNCLT5wQWN0aXZlRENCLT5wQWN0aXZlU1JCKTsKKyAgICB9CisJCisgICAgZWxzZSBpZiAoaXN0YXR1cyAmICBJTlZBTElEX0NNRCkKKyAgICB7CisJcHJpbnRrICgiREMzOTA6IEludmFsaWQgQ29tbWFuZCBkZXRlY3RlZCAoJTA4eCkhXG4iLCBkYzM5MF9sYXN0c3RhdHVzKTsKKwlkYzM5MF9JbnZhbGlkQ21kKCBwQUNCICk7CisJZ290byB1bmxvY2s7CisgICAgfQorCisgICAgaWYgKGlzdGF0dXMgJiAgU0NTSV9SRVNFVCkKKyAgICB7CisJZGMzOTBfU2NzaVJzdERldGVjdCggcEFDQiApOworCWdvdG8gdW5sb2NrOworICAgIH0KKworICAgIGlmIChpc3RhdHVzICYgIERJU0NPTk5FQ1RFRCkKKyAgICB7CisJZGMzOTBfRGlzY29ubmVjdCggcEFDQiApOworCWdvdG8gdW5sb2NrOworICAgIH0KKworICAgIGlmIChpc3RhdHVzICYgIFJFU0VMRUNURUQpCisgICAgeworCWRjMzkwX1Jlc2VsZWN0KCBwQUNCICk7CisJZ290byB1bmxvY2s7CisgICAgfQorCisgICAgZWxzZSBpZiAoaXN0YXR1cyAmIChTRUxFQ1RFRCB8IFNFTF9BVFRFTlRJT04pKQorICAgIHsKKwlwcmludGsgKEtFUk5fRVJSICJEQzM5MDogVGFyZ2V0IG1vZGUgbm90IHN1cHBvcnRlZCFcbiIpOworCWdvdG8gdW5sb2NrOworICAgIH0KKworICAgIGlmIChpc3RhdHVzICYgKFNVQ0NFU1NGVUxfT1B8U0VSVklDRV9SRVFVRVNUKSApCisgICAgeworCXBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworCWlmICghcERDQikKKwl7CisJCXByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBTdWMuIG9wLyBTZXJ2LiByZXE6IHBBY3RpdmVEQ0IgPSAwIVxuIik7CisJCWdvdG8gdW5sb2NrOworCX0KKwlwU1JCID0gcERDQi0+cEFjdGl2ZVNSQjsKKwlpZiggcERDQi0+RENCRmxhZyAmIEFCT1JUX0RFVl8gKQorCSAgZGMzOTBfRW5hYmxlTXNnT3V0X0Fib3J0IChwQUNCLCBwU1JCKTsKKworCXBoYXNlID0gcFNSQi0+U2NzaVBoYXNlOworCURFQlVHMShwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IFslaV0lcygwKSAoJTAyeClcbiIsIHBoYXNlLCBkYzM5MF9wMF9zdHJbcGhhc2VdLCBzc3RhdHVzKSk7CisJc3RhdGVWID0gKHZvaWQgKikgZGMzOTBfcGhhc2UwW3BoYXNlXTsKKwkoICpzdGF0ZVYgKSggcEFDQiwgcFNSQiwgJnNzdGF0dXMgKTsKKworCXBTUkItPlNjc2lQaGFzZSA9IHNzdGF0dXMgJiA3OworCXBoYXNlID0gKHU4KSBzc3RhdHVzICYgNzsKKwlERUJVRzEocHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBbJWldJXMoMSkgKCUwMngpXG4iLCBwaGFzZSwgZGMzOTBfcDFfc3RyW3BoYXNlXSwgc3N0YXR1cykpOworCXN0YXRlViA9ICh2b2lkICopIGRjMzkwX3BoYXNlMVtwaGFzZV07CisJKCAqc3RhdGVWICkoIHBBQ0IsIHBTUkIsICZzc3RhdHVzICk7CisgICAgfQorCisgdW5sb2NrOgorICAgIHNwaW5fdW5sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fREMzOTBfSW50ZXJydXB0KCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIGlycXJldHVybl90IHJldDsKKyAgICBERUJVRzEocHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBJcnEgKCVpKSBjYXVnaHQ6ICIsIGlycSkpOworICAgIC8qIExvY2tpbmcgaXMgZG9uZSBpbiBEQzM5MF9JbnRlcnJ1cHQgKi8KKyAgICByZXQgPSBEQzM5MF9JbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworICAgIERFQlVHMShwcmludGsgKCIuLiBJUlEgcmV0dXJuZWRcbiIpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZGMzOTBfRGF0YU91dF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgdTggICBzc3RhdHVzOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqcHNnbDsKKyAgICB1MzIgICAgUmVzaWRDbnQsIHhmZXJDbnQ7CisgICAgdTggICBkc3RhdGUgPSAwOworCisgICAgc3N0YXR1cyA9ICpwc3N0YXR1czsKKworICAgIGlmKCAhKHBTUkItPlNSQlN0YXRlICYgU1JCX1hGRVJQQUQpICkKKyAgICB7CisJaWYoIHNzdGF0dXMgJiAoUEFSSVRZX0VSUiB8IElMTEVHQUxfT1BfRVJSKSApCisJICAgIHBTUkItPlNSQlN0YXR1cyB8PSBQQVJJVFlfRVJST1I7CisKKwlpZiggc3N0YXR1cyAmIENPVU5UXzJfWkVSTyApCisJeworCSAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisKKwkgICAgLyogRnVuY3Rpb24gY2FsbGVkIGZyb20gdGhlIElTUiB3aXRoIHRoZSBob3N0X2xvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCSAgICBpZiAocFNSQi0+U0dUb0JlWGZlckxlbikKKwkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoKGRzdGF0ZSA9IERDMzkwX3JlYWQ4IChETUFfU3RhdHVzKSkgJiBETUFfWEZFUl9ET05FKSkgeworCQkgICAgc3Bpbl91bmxvY2tfaXJxKHBBQ0ItPnBTY3NpSG9zdC0+aG9zdF9sb2NrKTsKKwkJICAgIHVkZWxheSg1MCk7CisJCSAgICBzcGluX2xvY2tfaXJxKHBBQ0ItPnBTY3NpSG9zdC0+aG9zdF9sb2NrKTsKKwkJfQorCSAgICBpZiAoIXRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQlwcmludGsgKEtFUk5fQ1JJVCAiREMzOTA6IERlYWRsb2NrIGluIERhdGFPdXRfMDogRE1BIGFib3J0ZWQgdW5maW5pc2hlZDogJTA2eCBieXRlcyByZW1haW4hIVxuIiwKKwkJCURDMzkwX3JlYWQzMiAoRE1BX1drX0J5dGVDbnRyKSk7CisJICAgIGRjMzkwX2xhc3RzdGF0dXMgJj0gfjB4ZmYwMDAwMDA7CisJICAgIGRjMzkwX2xhc3RzdGF0dXMgfD0gZHN0YXRlIDw8IDI0OworCSAgICBwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gKz0gcFNSQi0+U0dUb0JlWGZlckxlbjsKKwkgICAgcFNSQi0+U0dJbmRleCsrOworCSAgICBpZiggcFNSQi0+U0dJbmRleCA8IHBTUkItPlNHY291bnQgKQorCSAgICB7CisJCXBTUkItPnBTZWdtZW50TGlzdCsrOworCQlwc2dsID0gcFNSQi0+cFNlZ21lbnRMaXN0OworCisJCXBTUkItPlNHQnVzQWRkciA9IGNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhwc2dsKSkpOworCQlwU1JCLT5TR1RvQmVYZmVyTGVuID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihwc2dsKSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlwU1JCLT5TR1RvQmVYZmVyTGVuID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgUmVzaWRDbnQgID0gKHUzMikgREMzOTBfcmVhZDggKEN1cnJlbnRfRmlmbykgJiAweDFmOworCSAgICBSZXNpZENudCB8PSAodTMyKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX0hpZ2gpIDw8IDE2OworCSAgICBSZXNpZENudCB8PSAodTMyKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX01pZCkgPDwgODsgCisJICAgIFJlc2lkQ250ICs9ICh1MzIpIERDMzkwX3JlYWQ4IChDdGNSZWdfTG93KTsKKworCSAgICB4ZmVyQ250ID0gcFNSQi0+U0dUb0JlWGZlckxlbiAtIFJlc2lkQ250OworCSAgICBwU1JCLT5TR0J1c0FkZHIgKz0geGZlckNudDsKKwkgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuICs9IHhmZXJDbnQ7CisJICAgIHBTUkItPlNHVG9CZVhmZXJMZW4gPSBSZXNpZENudDsKKwl9CisgICAgfQorICAgIGlmICgoKnBzc3RhdHVzICYgNykgIT0gU0NTSV9EQVRBX09VVCkKKyAgICB7CisJICAgIERDMzkwX3dyaXRlOCAoRE1BX0NtZCwgV1JJVEVfRElSRUNUSU9OK0RNQV9JRExFX0NNRCk7IC8qIHwgRE1BX0lOVCAqLworCSAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKyAgICB9CSAgICAKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX0RhdGFJbl8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgdTggICBzc3RhdHVzLCByZXNpZHVhbCwgYnZhbDsKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2w7CisgICAgdTMyICAgIFJlc2lkQ250LCBpOworICAgIHVuc2lnbmVkIGxvbmcgICB4ZmVyQ250OworICAgIHU4ICAgICAgKnB0cjsKKworICAgIHNzdGF0dXMgPSAqcHNzdGF0dXM7CisKKyAgICBpZiggIShwU1JCLT5TUkJTdGF0ZSAmIFNSQl9YRkVSUEFEKSApCisgICAgeworCWlmKCBzc3RhdHVzICYgKFBBUklUWV9FUlIgfCBJTExFR0FMX09QX0VSUikpCisJICAgIHBTUkItPlNSQlN0YXR1cyB8PSBQQVJJVFlfRVJST1I7CisKKwlpZiggc3N0YXR1cyAmIENPVU5UXzJfWkVSTyApCisJeworCSAgICBpbnQgZHN0YXRlID0gMDsKKwkgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOworCisJICAgIC8qIEZ1bmN0aW9uIGNhbGxlZCBmcm9tIHRoZSBJU1Igd2l0aCB0aGUgaG9zdF9sb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwkgICAgaWYgKHBTUkItPlNHVG9CZVhmZXJMZW4pCisJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhKChkc3RhdGUgPSBEQzM5MF9yZWFkOCAoRE1BX1N0YXR1cykpICYgRE1BX1hGRVJfRE9ORSkpIHsKKwkJICAgIHNwaW5fdW5sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisJCSAgICB1ZGVsYXkoNTApOworCQkgICAgc3Bpbl9sb2NrX2lycShwQUNCLT5wU2NzaUhvc3QtPmhvc3RfbG9jayk7CisJCX0KKwkgICAgaWYgKCF0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlwcmludGsgKEtFUk5fQ1JJVCAiREMzOTA6IERlYWRsb2NrIGluIERhdGFJbl8wOiBETUEgYWJvcnRlZCB1bmZpbmlzaGVkOiAlMDZ4IGJ5dGVzIHJlbWFpbiEhXG4iLAorCQkJREMzOTBfcmVhZDMyIChETUFfV2tfQnl0ZUNudHIpKTsKKwkJcHJpbnRrIChLRVJOX0NSSVQgIkRDMzkwOiBEYXRhSW5fMDogRE1BIFN0YXRlOiAlaVxuIiwgZHN0YXRlKTsKKwkgICAgfQorCSAgICBkYzM5MF9sYXN0c3RhdHVzICY9IH4weGZmMDAwMDAwOworCSAgICBkYzM5MF9sYXN0c3RhdHVzIHw9IGRzdGF0ZSA8PCAyNDsKKwkgICAgREVCVUcxKFJlc2lkQ250ID0gKCh1bnNpZ25lZCBsb25nKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX0hpZ2gpIDw8IDE2KQlcCisJCSsgKCh1bnNpZ25lZCBsb25nKSBEQzM5MF9yZWFkOCAoQ3RjUmVnX01pZCkgPDwgOCkJCVwKKwkJKyAoKHVuc2lnbmVkIGxvbmcpIERDMzkwX3JlYWQ4IChDdGNSZWdfTG93KSkpOworCSAgICBERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJDb3VudF8yX1plcm8gKFJlc2lkQ250PSVpLFRvQmVYZmVyPSVsaSksIiwgUmVzaWRDbnQsIHBTUkItPlNHVG9CZVhmZXJMZW4pKTsKKworCSAgICBEQzM5MF93cml0ZTggKERNQV9DbWQsIFJFQURfRElSRUNUSU9OK0RNQV9JRExFX0NNRCk7IC8qIHwgRE1BX0lOVCAqLworCisJICAgIHBTUkItPlRvdGFsWGZlcnJlZExlbiArPSBwU1JCLT5TR1RvQmVYZmVyTGVuOworCSAgICBwU1JCLT5TR0luZGV4Kys7CisJICAgIGlmKCBwU1JCLT5TR0luZGV4IDwgcFNSQi0+U0djb3VudCApCisJICAgIHsKKwkJcFNSQi0+cFNlZ21lbnRMaXN0Kys7CisJCXBzZ2wgPSBwU1JCLT5wU2VnbWVudExpc3Q7CisKKwkJcFNSQi0+U0dCdXNBZGRyID0gY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKHNnX2RtYV9hZGRyZXNzKHBzZ2wpKSk7CisJCXBTUkItPlNHVG9CZVhmZXJMZW4gPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHBzZ2wpKTsKKwkgICAgfQorCSAgICBlbHNlCisJCXBTUkItPlNHVG9CZVhmZXJMZW4gPSAwOworCX0KKwllbHNlCS8qIHBoYXNlIGNoYW5nZWQgKi8KKwl7CisJICAgIHJlc2lkdWFsID0gMDsKKwkgICAgYnZhbCA9IERDMzkwX3JlYWQ4IChDdXJyZW50X0ZpZm8pOworCSAgICB3aGlsZSggYnZhbCAmIDB4MWYgKQorCSAgICB7CisJCURFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIkNoZWNrIGZvciByZXNpZHVhbHMsIikpOworCQlpZiggKGJ2YWwgJiAweDFmKSA9PSAxICkKKwkJeworCQkgICAgZm9yKGk9MDsgaSA8IDB4MTAwOyBpKyspCisJCSAgICB7CisJCQlidmFsID0gREMzOTBfcmVhZDggKEN1cnJlbnRfRmlmbyk7CisJCQlpZiggIShidmFsICYgMHgxZikgKQorCQkJICAgIGdvdG8gZGluXzE7CisJCQllbHNlIGlmKCBpID09IDB4MGZmICkKKwkJCXsKKwkJCSAgICByZXNpZHVhbCA9IDE7ICAgLyogOzEgcmVzaWR1YWwgYnl0ZSAqLworCQkJICAgIGdvdG8gZGluXzE7CisJCQl9CisJCSAgICB9CisJCX0KKwkJZWxzZQorCQkgICAgYnZhbCA9IERDMzkwX3JlYWQ4IChDdXJyZW50X0ZpZm8pOworCSAgICB9CitkaW5fMToKKwkgICAgREMzOTBfd3JpdGU4IChETUFfQ21kLCBSRUFEX0RJUkVDVElPTitETUFfQkxBU1RfQ01EKTsKKwkgICAgZm9yIChpID0gMHhhMDAwOyBpOyBpLS0pCisJICAgIHsKKwkJYnZhbCA9IERDMzkwX3JlYWQ4IChETUFfU3RhdHVzKTsKKwkJaWYgKGJ2YWwgJiBCTEFTVF9DT01QTEVURSkKKwkJICAgIGJyZWFrOworCSAgICB9CisJICAgIC8qIEl0IHNlZW1zIGEgRE1BIEJsYXN0IGFib3J0IGlzbid0IHRoYXQgYmFkIC4uLiAqLworCSAgICBpZiAoIWkpIHByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBETUEgQmxhc3QgYWJvcnRlZCB1bmZpbmlzaGVkIVxuIik7CisJICAgIC8vREMzOTBfd3JpdGU4IChETUFfQ21kLCBSRUFEX0RJUkVDVElPTitETUFfSURMRV9DTUQpOyAvKiB8IERNQV9JTlQgKi8KKwkgICAgZGMzOTBfbGFzdHN0YXR1cyAmPSB+MHhmZjAwMDAwMDsgZGMzOTBfbGFzdHN0YXR1cyB8PSBidmFsIDw8IDI0OworCisJICAgIERFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIkJsYXN0OiBSZWFkICVpIHRpbWVzIERNQV9TdGF0dXMgJTAyeCIsIDB4YTAwMC1pLCBidmFsKSk7CisJICAgIFJlc2lkQ250ID0gKHUzMikgREMzOTBfcmVhZDggKEN0Y1JlZ19IaWdoKTsKKwkgICAgUmVzaWRDbnQgPDw9IDg7CisJICAgIFJlc2lkQ250IHw9ICh1MzIpIERDMzkwX3JlYWQ4IChDdGNSZWdfTWlkKTsKKwkgICAgUmVzaWRDbnQgPDw9IDg7CisJICAgIFJlc2lkQ250IHw9ICh1MzIpIERDMzkwX3JlYWQ4IChDdGNSZWdfTG93KTsKKworCSAgICB4ZmVyQ250ID0gcFNSQi0+U0dUb0JlWGZlckxlbiAtIFJlc2lkQ250OworCSAgICBwU1JCLT5TR0J1c0FkZHIgKz0geGZlckNudDsKKwkgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuICs9IHhmZXJDbnQ7CisJICAgIHBTUkItPlNHVG9CZVhmZXJMZW4gPSBSZXNpZENudDsKKworCSAgICBpZiggcmVzaWR1YWwgKQorCSAgICB7CisJCWJ2YWwgPSBEQzM5MF9yZWFkOCAoU2NzaUZpZm8pOwkgICAgLyogZ2V0IG9uZSByZXNpZHVhbCBieXRlICovCisJCXB0ciA9ICh1OCAqKSBidXNfdG9fdmlydCggcFNSQi0+U0dCdXNBZGRyICk7CisJCSpwdHIgPSBidmFsOworCQlwU1JCLT5TR0J1c0FkZHIrKzsgeGZlckNudCsrOworCQlwU1JCLT5Ub3RhbFhmZXJyZWRMZW4rKzsKKwkJcFNSQi0+U0dUb0JlWGZlckxlbi0tOworCSAgICB9CisJICAgIERFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIlhmZXJlZDogJWxpLCBUb3RhbDogJWxpLCBSZW1haW5pbmc6ICVsaVxuIiwgeGZlckNudCxcCisJCQkgICBwU1JCLT5Ub3RhbFhmZXJyZWRMZW4sIHBTUkItPlNHVG9CZVhmZXJMZW4pKTsKKworCX0KKyAgICB9CisgICAgaWYgKCgqcHNzdGF0dXMgJiA3KSAhPSBTQ1NJX0RBVEFfSU4pCisgICAgeworCSAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKwkgICAgREMzOTBfd3JpdGU4IChETUFfQ21kLCBSRUFEX0RJUkVDVElPTitETUFfSURMRV9DTUQpOyAvKiB8IERNQV9JTlQgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9Db21tYW5kXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cykKK3sKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX1N0YXR1c18wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisKKyAgICBwU1JCLT5UYXJnZXRTdGF0dXMgPSBEQzM5MF9yZWFkOCAoU2NzaUZpZm8pOworICAgIC8vdWRlbGF5ICgxKTsKKyAgICBwU1JCLT5FbmRNZXNzYWdlID0gREMzOTBfcmVhZDggKFNjc2lGaWZvKTsJLyogZ2V0IG1lc3NhZ2UgKi8KKworICAgICpwc3N0YXR1cyA9IFNDU0lfTk9QMDsKKyAgICBwU1JCLT5TUkJTdGF0ZSA9IFNSQl9DT01QTEVURUQ7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBNU0dfQUNDRVBURURfQ01EKTsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX01zZ091dF8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgaWYoIHBTUkItPlNSQlN0YXRlICYgKFNSQl9VTkVYUEVDVF9SRVNFTCtTUkJfQUJPUlRfU0VOVCkgKQorCSpwc3N0YXR1cyA9IFNDU0lfTk9QMDsKKyAgICAvL0RDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2lubGluZV9fCitkYzM5MF9yZXByb2cgKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9kY2IqIHBEQ0IpCit7CisgIERDMzkwX3dyaXRlOCAoU3luY19QZXJpb2QsIHBEQ0ItPlN5bmNQZXJpb2QpOworICBEQzM5MF93cml0ZTggKFN5bmNfT2Zmc2V0LCBwRENCLT5TeW5jT2Zmc2V0KTsKKyAgREMzOTBfd3JpdGU4IChDdHJsUmVnMywgcERDQi0+Q3RybFIzKTsKKyAgREMzOTBfd3JpdGU4IChDdHJsUmVnNCwgcERDQi0+Q3RybFI0KTsKKyAgZGMzOTBfU2V0WGZlclJhdGUgKHBBQ0IsIHBEQ0IpOworfQorCisKKyNpZmRlZiBEQzM5MF9ERUJVRzAKK3N0YXRpYyB2b2lkCitkYzM5MF9wcmludE1zZyAodTggKk1zZ0J1ZiwgdTggbGVuKQoreworICBpbnQgaTsKKyAgcHJpbnRrICgiICUwMngiLCBNc2dCdWZbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspCisgICAgcHJpbnRrICgiICUwMngiLCBNc2dCdWZbaV0pOworICBwcmludGsgKCJcbiIpOworfQorI2VuZGlmCisKKyNkZWZpbmUgREMzOTBfRU5BQkxFX01TR09VVCBEQzM5MF93cml0ZTggKFNjc2lDbWQsIFNFVF9BVE5fQ01EKQorCisvKiByZWplY3RfbXNnICovCitzdGF0aWMgdm9pZCBfX2lubGluZV9fCitkYzM5MF9Nc2dJbl9yZWplY3QgKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisgIHBTUkItPk1zZ091dEJ1ZlswXSA9IE1FU1NBR0VfUkVKRUNUOworICBwU1JCLT5Nc2dDbnQgPSAxOworICBEQzM5MF9FTkFCTEVfTVNHT1VUOworICBERUJVRzAgKHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogUmVqZWN0IG1lc3NhZ2VcbiIpKTsKK30KKworLyogYWJvcnQgY29tbWFuZCAqLworc3RhdGljIHZvaWQKK2RjMzkwX0VuYWJsZU1zZ091dF9BYm9ydCAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIgKQoreworICAgIHBTUkItPk1zZ091dEJ1ZlswXSA9IEFCT1JUOyAKKyAgICBwU1JCLT5Nc2dDbnQgPSAxOyBEQzM5MF9FTkFCTEVfTVNHT1VUOworICAgIHBTUkItPnBTUkJEQ0ItPkRDQkZsYWcgJj0gfkFCT1JUX0RFVl87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGMzOTBfc3JiKgorZGMzOTBfTXNnSW5fUVRhZyAoc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiwgczggdGFnKQoreworICBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCID0gcERDQi0+cEdvaW5nU1JCOworCisgIGlmIChwU1JCKQorICAgIHsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gc2NzaV9maW5kX3RhZyhwU1JCLT5wY21kLT5kZXZpY2UsIHRhZyk7CisJcFNSQiA9IChzdHJ1Y3QgZGMzOTBfc3JiICopc2NtZC0+aG9zdF9zY3JpYmJsZTsKKworCWlmIChwRENCLT5EQ0JGbGFnICYgQUJPUlRfREVWXykKKwl7CisJICBwU1JCLT5TUkJTdGF0ZSA9IFNSQl9BQk9SVF9TRU5UOworCSAgZGMzOTBfRW5hYmxlTXNnT3V0X0Fib3J0KCBwQUNCLCBwU1JCICk7CisJfQorCisJaWYgKCEocFNSQi0+U1JCU3RhdGUgJiBTUkJfRElTQ09OTkVDVCkpCisJCWdvdG8gbWluZ3gwOworCisJcERDQi0+cEFjdGl2ZVNSQiA9IHBTUkI7CisJcFNSQi0+U1JCU3RhdGUgPSBTUkJfREFUQV9YRkVSOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICBtaW5neDA6CisgICAgICBwU1JCID0gcEFDQi0+cFRtcFNSQjsKKyAgICAgIHBTUkItPlNSQlN0YXRlID0gU1JCX1VORVhQRUNUX1JFU0VMOworICAgICAgcERDQi0+cEFjdGl2ZVNSQiA9IHBTUkI7CisgICAgICBwU1JCLT5Nc2dPdXRCdWZbMF0gPSBBQk9SVF9UQUc7CisgICAgICBwU1JCLT5Nc2dDbnQgPSAxOyBEQzM5MF9FTkFCTEVfTVNHT1VUOworICAgIH0KKyAgcmV0dXJuIHBTUkI7Cit9CisKKworLyogc2V0IGFzeW5jIHRyYW5zZmVyIG1vZGUgKi8KK3N0YXRpYyB2b2lkIAorZGMzOTBfTXNnSW5fc2V0X2FzeW5jIChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworICBzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCID0gcFNSQi0+cFNSQkRDQjsKKyAgaWYgKCEocFNSQi0+U1JCU3RhdGUgJiBET19TWU5DX05FR08pKSAKKyAgICBwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IFRhcmdldCAlaSBpbml0aWF0ZXMgTm9uLVN5bmM/XG4iLCBwRENCLT5UYXJnZXRJRCk7CisgIHBTUkItPlNSQlN0YXRlICY9IH5ET19TWU5DX05FR087CisgIHBEQ0ItPlN5bmNNb2RlICY9IH4oU1lOQ19FTkFCTEUrU1lOQ19ORUdPX0RPTkUpOworICBwRENCLT5TeW5jUGVyaW9kID0gMDsKKyAgcERDQi0+U3luY09mZnNldCA9IDA7CisgIC8vcERDQi0+TmVnb1BlcmlvZCA9IDUwOyAvKiAyMDBucyA8PT4gNSBNSHogKi8KKyAgcERDQi0+Q3RybFIzID0gRkFTVF9DTEs7CS8qIGZhc3QgY2xvY2sgLyBub3JtYWwgc2NzaSAqLworICBwRENCLT5DdHJsUjQgJj0gMHgzZjsKKyAgcERDQi0+Q3RybFI0IHw9IHBBQ0ItPmdsaXRjaF9jZmc7CS8qIGdsaXRjaCBlYXRlciAqLworICBkYzM5MF9yZXByb2cgKHBBQ0IsIHBEQ0IpOworfQorCisvKiBzZXQgc3luYyB0cmFuc2ZlciBtb2RlICovCitzdGF0aWMgdm9pZAorZGMzOTBfTXNnSW5fc2V0X3N5bmMgKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIpCit7CisgIHU4IGJ2YWw7CisgIHUxNiB3dmFsLCB3dmFsMTsKKyAgc3RydWN0IGRjMzkwX2RjYiogcERDQiA9IHBTUkItPnBTUkJEQ0I7CisgIHU4IG9sZHN5bmNwZXJpb2QgPSBwRENCLT5TeW5jUGVyaW9kOworICB1OCBvbGRzeW5jb2Zmc2V0ID0gcERDQi0+U3luY09mZnNldDsKKyAgCisgIGlmICghKHBTUkItPlNSQlN0YXRlICYgRE9fU1lOQ19ORUdPKSkKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fSU5GTyAiREMzOTA6IFRhcmdldCAlaSBpbml0aWF0ZXMgU3luYzogJWlucyAlaSAuLi4gYW5zd2VyIC4uLlxuIiwgCisJICAgICAgcERDQi0+VGFyZ2V0SUQsIHBTUkItPk1zZ0luQnVmWzNdPDwyLCBwU1JCLT5Nc2dJbkJ1Zls0XSk7CisKKyAgICAgIC8qIHJlamVjdCAqLworICAgICAgLy9kYzM5MF9Nc2dJbl9yZWplY3QgKHBBQ0IsIHBTUkIpOworICAgICAgLy9yZXR1cm4gZGMzOTBfTXNnSW5fc2V0X2FzeW5jIChwQUNCLCBwU1JCKTsKKworICAgICAgLyogUmVwbHkgd2l0aCBjb3JyZWN0ZWQgU0RUUiBNZXNzYWdlICovCisgICAgICBpZiAocFNSQi0+TXNnSW5CdWZbNF0gPiAxNSkKKwl7IAorCSAgcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBMb3dlciBTeW5jIE9mZnNldCB0byAxNVxuIik7CisJICBwU1JCLT5Nc2dJbkJ1Zls0XSA9IDE1OworCX0KKyAgICAgIGlmIChwU1JCLT5Nc2dJbkJ1ZlszXSA8IHBEQ0ItPk5lZ29QZXJpb2QpCisJeworCSAgcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBTZXQgc3luYyBuZWdvIHBlcmlvZCB0byAlaW5zXG4iLCBwRENCLT5OZWdvUGVyaW9kIDw8IDIpOworCSAgcFNSQi0+TXNnSW5CdWZbM10gPSBwRENCLT5OZWdvUGVyaW9kOworCX0KKyAgICAgIG1lbWNweSAocFNSQi0+TXNnT3V0QnVmLCBwU1JCLT5Nc2dJbkJ1ZiwgNSk7CisgICAgICBwU1JCLT5Nc2dDbnQgPSA1OworICAgICAgREMzOTBfRU5BQkxFX01TR09VVDsKKyAgICB9CisKKyAgcFNSQi0+U1JCU3RhdGUgJj0gfkRPX1NZTkNfTkVHTzsKKyAgcERDQi0+U3luY01vZGUgfD0gU1lOQ19FTkFCTEUrU1lOQ19ORUdPX0RPTkU7CisgIHBEQ0ItPlN5bmNPZmZzZXQgJj0gMHgwZjA7CisgIHBEQ0ItPlN5bmNPZmZzZXQgfD0gcFNSQi0+TXNnSW5CdWZbNF07CisgIHBEQ0ItPk5lZ29QZXJpb2QgPSBwU1JCLT5Nc2dJbkJ1ZlszXTsKKworICB3dmFsID0gKHUxNikgcFNSQi0+TXNnSW5CdWZbM107CisgIHd2YWwgPSB3dmFsIDw8IDI7IHd2YWwgLT0gMzsgd3ZhbDEgPSB3dmFsIC8gMjU7CS8qIGNvbXB1dGUgc3BlZWQgKi8KKyAgaWYoICh3dmFsMSAqIDI1KSAhPSB3dmFsKSB3dmFsMSsrOworICBidmFsID0gRkFTVF9DTEsrRkFTVF9TQ1NJOwkvKiBmYXN0IGNsb2NrIC8gZmFzdCBzY3NpICovCisKKyAgcERDQi0+Q3RybFI0ICY9IDB4M2Y7CQkvKiBHbGl0Y2ggZWF0ZXI6IDEybnMgbGVzcyB0aGFuIG5vcm1hbCAqLworICBpZiAocEFDQi0+Z2xpdGNoX2NmZyAhPSBOU19UT19HTElUQ0goMCkpCisgICAgcERDQi0+Q3RybFI0IHw9IE5TX1RPX0dMSVRDSCgoKEdMSVRDSF9UT19OUyhwQUNCLT5nbGl0Y2hfY2ZnKSkgLSAxKSk7CisgIGVsc2UKKyAgICBwRENCLT5DdHJsUjQgfD0gTlNfVE9fR0xJVENIKDApOworICBpZiAod3ZhbDEgPCA0KSBwRENCLT5DdHJsUjQgfD0gTlNfVE9fR0xJVENIKDApOyAvKiBVbHRyYSAqLworCisgIGlmICh3dmFsMSA+PSA4KQorICAgIHsKKyAgICAgIHd2YWwxLS07CS8qIFRpbWluZyBjb21wdXRhdGlvbiBkaWZmZXJzIGJ5IDEgZnJvbSBGQVNUX1NDU0kgKi8KKyAgICAgIGJ2YWwgPSBGQVNUX0NMSzsJCS8qIGZhc3QgY2xvY2sgLyBub3JtYWwgc2NzaSAqLworICAgICAgcERDQi0+Q3RybFI0IHw9IHBBQ0ItPmdsaXRjaF9jZmc7IAkvKiBnbGl0Y2ggZWF0ZXIgKi8KKyAgICB9CisKKyAgcERDQi0+Q3RybFIzID0gYnZhbDsKKyAgcERDQi0+U3luY1BlcmlvZCA9ICh1OCl3dmFsMTsKKyAgCisgIGlmICgob2xkc3luY3BlcmlvZCAhPSB3dmFsMSB8fCBvbGRzeW5jb2Zmc2V0ICE9IHBEQ0ItPlN5bmNPZmZzZXQpICYmIHBEQ0ItPlRhcmdldExVTiA9PSAwKQorICAgIHsKKyAgICAgIGlmICghIChidmFsICYgRkFTVF9TQ1NJKSkgd3ZhbDErKzsKKyAgICAgIHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogVGFyZ2V0ICVpOiBTeW5jIHRyYW5zZmVyICVpLiUxaSBNSHosIE9mZnNldCAlaVxuIiwgcERDQi0+VGFyZ2V0SUQsIAorCSAgICAgIDQwL3d2YWwxLCAoKDQwJXd2YWwxKSoxMCt3dmFsMS8yKS93dmFsMSwgcERDQi0+U3luY09mZnNldCAmIDB4MGYpOworICAgIH0KKyAgCisgIGRjMzkwX3JlcHJvZyAocEFDQiwgcERDQik7Cit9CisKKworLyogaGFuZGxlIFJFU1RPUkVfUFRSICovCisvKiBJIHByZXN1bWUsIHRoaXMgY29tbWFuZCBpcyBhbHJlYWR5IG1hcHBlZCwgc28sIGhhdmUgdG8gcmVtYXAuICovCitzdGF0aWMgdm9pZCAKK2RjMzkwX3Jlc3RvcmVfcHRyIChzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCKQoreworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnBjbWQgPSBwU1JCLT5wY21kOworICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqcHNnbDsKKyAgICBwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gPSAwOworICAgIHBTUkItPlNHSW5kZXggPSAwOworICAgIGlmIChwY21kLT51c2Vfc2cpIHsKKwlwU1JCLT5wU2VnbWVudExpc3QgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGNtZC0+cmVxdWVzdF9idWZmZXI7CisJcHNnbCA9IHBTUkItPnBTZWdtZW50TGlzdDsKKwkvL2RjMzkwX3BjaV9zeW5jKHBTUkIpOworCisJd2hpbGUgKHBTUkItPlRvdGFsWGZlcnJlZExlbiArICh1bnNpZ25lZCBsb25nKSBzZ19kbWFfbGVuKHBzZ2wpIDwgcFNSQi0+U2F2ZWRfUHRyKQorCXsKKwkgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuICs9ICh1bnNpZ25lZCBsb25nKSBzZ19kbWFfbGVuKHBzZ2wpOworCSAgICBwU1JCLT5TR0luZGV4Kys7CisJICAgIGlmKCBwU1JCLT5TR0luZGV4IDwgcFNSQi0+U0djb3VudCApCisJICAgIHsKKwkJcFNSQi0+cFNlZ21lbnRMaXN0Kys7CisJCXBzZ2wgPSBwU1JCLT5wU2VnbWVudExpc3Q7CisJCXBTUkItPlNHQnVzQWRkciA9IGNwdV90b19sZTMyKHBjaV9kbWFfbG8zMihzZ19kbWFfYWRkcmVzcyhwc2dsKSkpOworCQlwU1JCLT5TR1RvQmVYZmVyTGVuID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihwc2dsKSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlwU1JCLT5TR1RvQmVYZmVyTGVuID0gMDsKKwl9CisJcFNSQi0+U0dUb0JlWGZlckxlbiAtPSAocFNSQi0+U2F2ZWRfUHRyIC0gcFNSQi0+VG90YWxYZmVycmVkTGVuKTsKKwlwU1JCLT5TR0J1c0FkZHIgKz0gKHBTUkItPlNhdmVkX1B0ciAtIHBTUkItPlRvdGFsWGZlcnJlZExlbik7CisJcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBQb2ludGVyIHJlc3RvcmVkLiBTZWdtZW50ICVpLCBUb3RhbCAlbGksIEJ1cyAlMDhseFxuIiwKKwkJcFNSQi0+U0dJbmRleCwgcFNSQi0+U2F2ZWRfUHRyLCBwU1JCLT5TR0J1c0FkZHIpOworCisgICAgfSBlbHNlIGlmKHBjbWQtPnJlcXVlc3RfYnVmZmVyKSB7CisJLy9kYzM5MF9wY2lfc3luYyhwU1JCKTsKKworCXNnX2RtYV9sZW4oJnBTUkItPlNlZ21lbnR4KSA9IHBjbWQtPnJlcXVlc3RfYnVmZmxlbiAtIHBTUkItPlNhdmVkX1B0cjsKKwlwU1JCLT5TR2NvdW50ID0gMTsKKwlwU1JCLT5wU2VnbWVudExpc3QgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopICZwU1JCLT5TZWdtZW50eDsKKyAgICB9IGVsc2UgeworCSBwU1JCLT5TR2NvdW50ID0gMDsKKwkgcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBSRVNUT1JFX1BUUiBtZXNzYWdlIGZvciBUcmFuc2ZlciB3aXRob3V0IFNjYXR0ZXItR2F0aGVyID8/XG4iKTsKKyAgICB9CisKKyAgcFNSQi0+VG90YWxYZmVycmVkTGVuID0gcFNSQi0+U2F2ZWRfUHRyOworfQorCisKKy8qIEFjY29yZGluZyB0byB0aGUgZG9jcywgdGhlIEFNNTNDOTc0IHJlYWRzIHRoZSBtZXNzYWdlIGFuZCAKKyAqIGdlbmVyYXRlcyBhIFN1Y2Nlc3NmdWwgT3BlcmF0aW9uIElSUSBiZWZvcmUgYXNzZXJ0aW5nIEFDSyBmb3IKKyAqIHRoZSBsYXN0IGJ5dGUgKGhvdyBkb2VzIGl0IGtub3cgd2hldGhlciBpdCdzIHRoZSBsYXN0ID8pICovCisvKiBUaGUgb2xkIGNvZGUgaGFuZGxlZCBpdCBpbiBhbm90aGVyIHdheSwgaW5kaWNhdGluZywgdGhhdCBvbgorICogZXZlcnkgbWVzc2FnZSBieXRlIGFuIElSUSBpcyBnZW5lcmF0ZWQgYW5kIGV2ZXJ5IGJ5dGUgaGFzIHRvCisgKiBiZSBtYW51YWxseSBBQ0tlZC4gSG1tbSA/ICAoS0csIDk4LzExLzI4KSAqLworLyogVGhlIG9sZCBpbXBsZW1lbnRhdGlvbiB3YXMgY29ycmVjdC4gU2lnaCEgKi8KKworLyogQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUgKi8KK3N0YXRpYyB1OCBfX2lubGluZV9fCitkYzM5MF9Nc2dJbl9jb21wbGV0ZSAodTggKm1zZ2J1ZiwgdTMyIGxlbikKK3sgCisgIGlmICgqbXNnYnVmID09IEVYVEVOREVEX01FU1NBR0UpCisgIHsKKwlpZiAobGVuIDwgMikgcmV0dXJuIDA7CisJaWYgKGxlbiA8IG1zZ2J1ZlsxXSArIDIpIHJldHVybiAwOworICB9CisgIGVsc2UgaWYgKCptc2didWYgPj0gMHgyMCAmJiAqbXNnYnVmIDw9IDB4MmYpIC8vIHR3byBieXRlIG1lc3NhZ2VzCisJaWYgKGxlbiA8IDIpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworCisKKy8qIHJlYWQgYW5kIGV2YWwgcmVjZWl2ZWQgbWVzc2FnZXMgKi8KK3N0YXRpYyB2b2lkCitkYzM5MF9Nc2dJbl8wKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgc3RydWN0IGRjMzkwX2RjYiogICBwRENCID0gcEFDQi0+cEFjdGl2ZURDQjsKKworICAgIC8qIFJlYWQgdGhlIG1zZyAqLworCisgICAgcFNSQi0+TXNnSW5CdWZbcEFDQi0+TXNnTGVuKytdID0gREMzOTBfcmVhZDggKFNjc2lGaWZvKTsKKyAgICAvL3BTUkItPlNSQlN0YXRlID0gMDsKKworICAgIC8qIE1zZyBjb21wbGV0ZSA/ICovCisgICAgaWYgKGRjMzkwX01zZ0luX2NvbXBsZXRlIChwU1JCLT5Nc2dJbkJ1ZiwgcEFDQi0+TXNnTGVuKSkKKyAgICAgIHsKKwlERUJVRzAgKHByaW50ayAoS0VSTl9JTkZPICJEQzM5MDogTXNnSW46Iik7IGRjMzkwX3ByaW50TXNnIChwU1JCLT5Nc2dJbkJ1ZiwgcEFDQi0+TXNnTGVuKSk7CisJLyogTm93IGV2YWwgdGhlIG1zZyAqLworCXN3aXRjaCAocFNSQi0+TXNnSW5CdWZbMF0pIAorCSAgeworCSAgY2FzZSBESVNDT05ORUNUOiAKKwkgICAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfRElTQ09OTkVDVDsgYnJlYWs7CisJICAgIAorCSAgY2FzZSBTSU1QTEVfUVVFVUVfVEFHOgorCSAgY2FzZSBIRUFEX09GX1FVRVVFX1RBRzoKKwkgIGNhc2UgT1JERVJFRF9RVUVVRV9UQUc6CisJICAgIHBTUkIgPSBkYzM5MF9Nc2dJbl9RVGFnIChwQUNCLCBwRENCLCBwU1JCLT5Nc2dJbkJ1ZlsxXSk7CisJICAgIGJyZWFrOworCSAgICAKKwkgIGNhc2UgTUVTU0FHRV9SRUpFQ1Q6IAorCSAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIFJFU0VUX0FUTl9DTUQpOworCSAgICBwRENCLT5OZWdvUGVyaW9kID0gNTA7IC8qIDIwMG5zIDw9PiA1IE1IeiAqLworCSAgICBpZiggcFNSQi0+U1JCU3RhdGUgJiBET19TWU5DX05FR08pCisJICAgICAgZGMzOTBfTXNnSW5fc2V0X2FzeW5jIChwQUNCLCBwU1JCKTsKKwkgICAgYnJlYWs7CisJICAgIAorCSAgY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCSAgICAvKiByZWplY3QgZXZlcnkgZXh0ZW5kZWQgbXNnIGJ1dCBTRFRSICovCisJICAgIGlmIChwU1JCLT5Nc2dJbkJ1ZlsxXSAhPSAzIHx8IHBTUkItPk1zZ0luQnVmWzJdICE9IEVYVEVOREVEX1NEVFIpCisJICAgICAgZGMzOTBfTXNnSW5fcmVqZWN0IChwQUNCLCBwU1JCKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaWYgKHBTUkItPk1zZ0luQnVmWzNdID09IDAgfHwgcFNSQi0+TXNnSW5CdWZbNF0gPT0gMCkKKwkJICBkYzM5MF9Nc2dJbl9zZXRfYXN5bmMgKHBBQ0IsIHBTUkIpOworCQllbHNlCisJCSAgZGMzOTBfTXNnSW5fc2V0X3N5bmMgKHBBQ0IsIHBTUkIpOworCSAgICAgIH0KKwkgICAgCisJICAgIC8vIG5vdGhpbmcgaGFzIHRvIGJlIGRvbmUKKwkgIGNhc2UgQ09NTUFORF9DT01QTEVURTogYnJlYWs7CisJICAgIAorCSAgICAvLyBTQVZFIFBPSU5URVIgbWF5IGJlIGlnbm9yZWQgYXMgd2UgaGF2ZSB0aGUgc3RydWN0IGRjMzkwX3NyYiogYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAgICAvLyBzY3NpIGNvbW1hbmQuIFRoYW5rcywgR2VyYXJkLCBmb3IgcG9pbnRpbmcgaXQgb3V0LgorCSAgY2FzZSBTQVZFX1BPSU5URVJTOiAKKwkgICAgcFNSQi0+U2F2ZWRfUHRyID0gcFNSQi0+VG90YWxYZmVycmVkTGVuOworCSAgICBicmVhazsKKwkgICAgLy8gVGhlIGRldmljZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdHJhbnNmZXIgd2l0aCBhIFJFU1RPUkUKKwkgIGNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkgICAgREVCVUcwKHByaW50ayAoIkRDMzkwOiBSRVNUT1JFIFBPSU5URVIgbWVzc2FnZSByZWNlaXZlZCAuLi4gdHJ5IHRvIGhhbmRsZVxuIikpOworCSAgICBkYzM5MF9yZXN0b3JlX3B0ciAocEFDQiwgcFNSQik7CisJICAgIGJyZWFrOworCisJICAgIC8vIHJlamVjdCB1bmtub3duIG1lc3NhZ2VzCisJICBkZWZhdWx0OiBkYzM5MF9Nc2dJbl9yZWplY3QgKHBBQ0IsIHBTUkIpOworCSAgfQorCQorCS8qIENsZWFyIGNvdW50ZXIgYW5kIE1zZ0luIHN0YXRlICovCisJcFNSQi0+U1JCU3RhdGUgJj0gflNSQl9NU0dJTjsKKwlwQUNCLT5Nc2dMZW4gPSAwOworICAgICAgfQorCisgICAgKnBzc3RhdHVzID0gU0NTSV9OT1AwOworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgTVNHX0FDQ0VQVEVEX0NNRCk7CisgICAgLy9EQzM5MF93cml0ZTggKERNQV9DbWQsIERNQV9JRExFX0NNRCk7Cit9CisKKworc3RhdGljIHZvaWQKK2RjMzkwX0RhdGFJT19Db21tKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCBpb0RpcikKK3sKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnBzZ2w7CisgICAgdW5zaWduZWQgbG9uZyAgbHZhbDsKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiKiAgIHBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworCisgICAgaWYgKHBTUkIgPT0gcEFDQi0+cFRtcFNSQikKKyAgICB7CisJaWYgKHBEQ0IpCisJCXByaW50ayhLRVJOX0VSUiAiREMzOTA6IHBTUkIgPT0gcFRtcFNSQiEgKFRhZ1EgRXJyb3I/KSAoJTAyaS0laSlcbiIsIHBEQ0ItPlRhcmdldElELCBwRENCLT5UYXJnZXRMVU4pOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJEQzM5MDogcFNSQiA9PSBwVG1wU1JCISAoVGFnUSBFcnJvcj8pIChEQ0IgMCEpXG4iKTsKKworCS8qIFRyeSB0byByZWNvdmVyIC0gc29tZSBicm9rZW4gZGlza3MgcmVhY3QgYmFkbHkgdG8gdGFnZ2VkIElOUVVJUlkgKi8KKwlpZiAocERDQiAmJiBwQUNCLT5zY2FuX2RldmljZXMgJiYgcERDQi0+R29pbmdTUkJDbnQgPT0gMSkgeworCQlwU1JCID0gcERDQi0+cEdvaW5nU1JCOworCQlwRENCLT5wQWN0aXZlU1JCID0gcFNSQjsKKwl9IGVsc2UgeworCQlwU1JCLT5wU1JCRENCID0gcERDQjsKKwkJZGMzOTBfRW5hYmxlTXNnT3V0X0Fib3J0KHBBQ0IsIHBTUkIpOworCQlpZiAocERDQikKKwkJCXBEQ0ItPkRDQkZsYWcgfD0gQUJPUlRfREVWOworCQlyZXR1cm47CisJfQorICAgIH0KKworICAgIGlmKCBwU1JCLT5TR0luZGV4IDwgcFNSQi0+U0djb3VudCApCisgICAgeworCURDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EIHwgaW9EaXIgLyogfCBETUFfSU5UICovKTsKKwlpZiggIXBTUkItPlNHVG9CZVhmZXJMZW4gKQorCXsKKwkgICAgcHNnbCA9IHBTUkItPnBTZWdtZW50TGlzdDsKKwkgICAgcFNSQi0+U0dCdXNBZGRyID0gY3B1X3RvX2xlMzIocGNpX2RtYV9sbzMyKHNnX2RtYV9hZGRyZXNzKHBzZ2wpKSk7CisJICAgIHBTUkItPlNHVG9CZVhmZXJMZW4gPSBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHBzZ2wpKTsKKwkgICAgREVCVUcxKHByaW50ayAoS0VSTl9ERUJVRyAiIERDMzkwOiBOZXh0IFNHIHNlZ21lbnQuIikpOworCX0KKwlsdmFsID0gcFNSQi0+U0dUb0JlWGZlckxlbjsKKwlERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICIgREMzOTA6IFN0YXJ0IHRyYW5zZmVyOiAlbGkgYnl0ZXMgKGFkZHJlc3MgJTA4bHgpXG4iLCBsdmFsLCBwU1JCLT5TR0J1c0FkZHIpKTsKKwlEQzM5MF93cml0ZTggKEN0Y1JlZ19Mb3csICh1OCkgbHZhbCk7CisJbHZhbCA+Pj0gODsKKwlEQzM5MF93cml0ZTggKEN0Y1JlZ19NaWQsICh1OCkgbHZhbCk7CisJbHZhbCA+Pj0gODsKKwlEQzM5MF93cml0ZTggKEN0Y1JlZ19IaWdoLCAodTgpIGx2YWwpOworCisJREMzOTBfd3JpdGUzMiAoRE1BX1hmZXJDbnQsIHBTUkItPlNHVG9CZVhmZXJMZW4pOworCURDMzkwX3dyaXRlMzIgKERNQV9YZmVyQWRkciwgcFNSQi0+U0dCdXNBZGRyKTsKKworCS8vREMzOTBfd3JpdGU4IChETUFfQ21kLCBETUFfSURMRV9DTUQgfCBpb0Rpcik7IC8qIHwgRE1BX0lOVDsgKi8KKwlwU1JCLT5TUkJTdGF0ZSA9IFNSQl9EQVRBX1hGRVI7CisKKwlEQzM5MF93cml0ZTggKFNjc2lDbWQsIERNQV9DT01NQU5EK0lORk9fWEZFUl9DTUQpOworCisJREMzOTBfd3JpdGU4IChETUFfQ21kLCBETUFfU1RBUlRfQ01EIHwgaW9EaXIgfCBETUFfSU5UKTsKKwkvL0RFQlVHMShEQzM5MF93cml0ZTMyIChETUFfU2NzaUJ1c0N0cmwsIFdSVF9FUkFTRV9ETUFfU1RBVCB8IEVOX0lOVF9PTl9QQ0lfQUJPUlQpKTsKKwkvL0RFQlVHMShwcmludGsgKEtFUk5fREVCVUcgIkRDMzkwOiBETUFfU3RhdHVzOiAlMDJ4XG4iLCBEQzM5MF9yZWFkOCAoRE1BX1N0YXR1cykpKTsKKwkvL0RFQlVHMShEQzM5MF93cml0ZTMyIChETUFfU2NzaUJ1c0N0cmwsIEVOX0lOVF9PTl9QQ0lfQUJPUlQpKTsKKyAgICB9CisgICAgZWxzZSAgICAvKiB4ZmVyIHBhZCAqLworICAgIHsKKwlpZiggcFNSQi0+U0djb3VudCApCisJeworCSAgICBwU1JCLT5BZGFwdFN0YXR1cyA9IEhfT1ZFUl9VTkRFUl9SVU47CisJICAgIHBTUkItPlNSQlN0YXR1cyB8PSBPVkVSX1JVTjsKKwkgICAgREVCVUcwKHByaW50ayAoS0VSTl9XQVJOSU5HICIgREMzOTA6IE92ZXJydW4gLSIpKTsKKwl9CisJREVCVUcwKHByaW50ayAoS0VSTl9XQVJOSU5HICIgQ2xlYXIgdHJhbnNmZXIgcGFkIFxuIikpOworCURDMzkwX3dyaXRlOCAoQ3RjUmVnX0xvdywgMCk7CisJREMzOTBfd3JpdGU4IChDdGNSZWdfTWlkLCAwKTsKKwlEQzM5MF93cml0ZTggKEN0Y1JlZ19IaWdoLCAwKTsKKworCXBTUkItPlNSQlN0YXRlIHw9IFNSQl9YRkVSUEFEOworCURDMzkwX3dyaXRlOCAoU2NzaUNtZCwgRE1BX0NPTU1BTkQrWEZFUl9QQURfQllURSk7CisvKgorCURDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EIHwgaW9EaXIpOyAvLyB8IERNQV9JTlQ7CisJREMzOTBfd3JpdGU4IChETUFfQ21kLCBETUFfU1RBUlRfQ01EIHwgaW9EaXIgfCBETUFfSU5UKTsKKyovCisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitkYzM5MF9EYXRhT3V0UGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cykKK3sKKyAgICBkYzM5MF9EYXRhSU9fQ29tbSAocEFDQiwgcFNSQiwgV1JJVEVfRElSRUNUSU9OKTsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX0RhdGFJblBoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgZGMzOTBfRGF0YUlPX0NvbW0gKHBBQ0IsIHBTUkIsIFJFQURfRElSRUNUSU9OKTsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX0NvbW1hbmRQaGFzZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiwgdTggKnBzc3RhdHVzKQoreworICAgIHN0cnVjdCBkYzM5MF9kY2IqICAgcERDQjsKKyAgICB1OCAgaSwgY250OworICAgIHU4ICAgICAqcHRyOworCisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBSRVNFVF9BVE5fQ01EKTsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKyAgICBpZiggIShwU1JCLT5TUkJGbGFnICYgQVVUT19SRVFTRU5TRSkgKQorICAgIHsKKwljbnQgPSAodTgpIHBTUkItPnBjbWQtPmNtZF9sZW47CisJcHRyID0gKHU4ICopIHBTUkItPnBjbWQtPmNtbmQ7CisJZm9yKGk9MDsgaSA8IGNudDsgaSsrKQorCSAgICBEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAqKHB0cisrKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJREMzOTBfd3JpdGU4IChTY3NpRmlmbywgUkVRVUVTVF9TRU5TRSk7CisJcERDQiA9IHBBQ0ItPnBBY3RpdmVEQ0I7CisJREMzOTBfd3JpdGU4IChTY3NpRmlmbywgcERDQi0+VGFyZ2V0TFVOIDw8IDUpOworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIDApOworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIDApOworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIHNpemVvZihwU1JCLT5wY21kLT5zZW5zZV9idWZmZXIpKTsKKwlEQzM5MF93cml0ZTggKFNjc2lGaWZvLCAwKTsKKwlERUJVRzAocHJpbnRrKEtFUk5fREVCVUcgIkRDMzkwOiBBdXRvUmVxU2Vuc2UgKENtbmRQaGFzZSkhXG4iKSk7CisgICAgfQorICAgIHBTUkItPlNSQlN0YXRlID0gU1JCX0NPTU1BTkQ7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBJTkZPX1hGRVJfQ01EKTsKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX1N0YXR1c1BoYXNlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisgICAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfU1RBVFVTOworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgSU5JVElBVE9SX0NNRF9DTVBMVEUpOworICAgIC8vREMzOTBfd3JpdGU4IChETUFfQ21kLCBETUFfSURMRV9DTUQpOworfQorCitzdGF0aWMgdm9pZAorZGMzOTBfTXNnT3V0UGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cykKK3sKKyAgICB1OCAgIGJ2YWwsIGksIGNudDsKKyAgICB1OCAgICAgKnB0cjsKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiKiAgICBwRENCOworCisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBDTEVBUl9GSUZPX0NNRCk7CisgICAgcERDQiA9IHBBQ0ItPnBBY3RpdmVEQ0I7CisgICAgaWYoICEocFNSQi0+U1JCU3RhdGUgJiBTUkJfTVNHT1VUKSApCisgICAgeworCWNudCA9IHBTUkItPk1zZ0NudDsKKwlpZiggY250ICkKKwl7CisJICAgIHB0ciA9ICh1OCAqKSBwU1JCLT5Nc2dPdXRCdWY7CisJICAgIGZvcihpPTA7IGkgPCBjbnQ7IGkrKykKKwkJREMzOTBfd3JpdGU4IChTY3NpRmlmbywgKihwdHIrKykpOworCSAgICBwU1JCLT5Nc2dDbnQgPSAwOworCSAgICBpZiggKHBEQ0ItPkRDQkZsYWcgJiBBQk9SVF9ERVZfKSAmJgorCQkocFNSQi0+TXNnT3V0QnVmWzBdID09IEFCT1JUKSApCisJCXBTUkItPlNSQlN0YXRlID0gU1JCX0FCT1JUX1NFTlQ7CisJfQorCWVsc2UKKwl7CisJICAgIGJ2YWwgPSBBQk9SVDsJLyogPz8/IE1TR19OT1AgKi8KKwkgICAgaWYoIChwU1JCLT5wY21kLT5jbW5kWzBdID09IElOUVVJUlkgKSB8fAorCQkocFNSQi0+cGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSB8fAorCQkocFNSQi0+U1JCRmxhZyAmIEFVVE9fUkVRU0VOU0UpICkKKwkgICAgeworCQlpZiggcERDQi0+U3luY01vZGUgJiBTWU5DX0VOQUJMRSApCisJCSAgICBnb3RvICBtb3AxOworCSAgICB9CisJICAgIERDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIGJ2YWwpOworCX0KKwlEQzM5MF93cml0ZTggKFNjc2lDbWQsIElORk9fWEZFUl9DTUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworbW9wMToKKyAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IE9MRCBTeW5jIE5lZ28gY29kZSB0cmlnZ2VyZWQhICglaSAlaSlcbiIsIHBEQ0ItPlRhcmdldElELCBwRENCLT5UYXJnZXRMVU4pOworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIEVYVEVOREVEX01FU1NBR0UpOworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIDMpOwkvKiAgICA7bGVuZ3RoIG9mIGV4dGVuZGVkIG1zZyAqLworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIEVYVEVOREVEX1NEVFIpOwkvKiAgICA7IHN5bmMgbmVnbyAqLworCURDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIHBEQ0ItPk5lZ29QZXJpb2QpOworCWlmIChwRENCLT5TeW5jT2Zmc2V0ICYgMHgwZikKKwkJICAgIERDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIHBEQ0ItPlN5bmNPZmZzZXQpOworCWVsc2UKKwkJICAgIERDMzkwX3dyaXRlOCAoU2NzaUZpZm8sIFNZTkNfTkVHT19PRkZTRVQpOwkJICAgIAorCXBTUkItPlNSQlN0YXRlIHw9IERPX1NZTkNfTkVHTzsKKwlEQzM5MF93cml0ZTggKFNjc2lDbWQsIElORk9fWEZFUl9DTUQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RjMzkwX01zZ0luUGhhc2UoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cykKK3sKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKyAgICBpZiggIShwU1JCLT5TUkJTdGF0ZSAmIFNSQl9NU0dJTikgKQorICAgIHsKKwlwU1JCLT5TUkJTdGF0ZSAmPSB+U1JCX0RJU0NPTk5FQ1Q7CisJcFNSQi0+U1JCU3RhdGUgfD0gU1JCX01TR0lOOworICAgIH0KKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIElORk9fWEZFUl9DTUQpOworICAgIC8vREMzOTBfd3JpdGU4IChETUFfQ21kLCBETUFfSURMRV9DTUQpOworfQorCitzdGF0aWMgdm9pZAorZGMzOTBfTm9wXzAoIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBkYzM5MF9zcmIqIHBTUkIsIHU4ICpwc3N0YXR1cykKK3sKK30KKworc3RhdGljIHZvaWQKK2RjMzkwX05vcF8xKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfc3JiKiBwU1JCLCB1OCAqcHNzdGF0dXMpCit7Cit9CisKKworc3RhdGljIHZvaWQKK2RjMzkwX1NldFhmZXJSYXRlKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCLCBzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCICkKK3sKKyAgICB1OCAgYnZhbCwgaSwgY250OworICAgIHN0cnVjdCBkYzM5MF9kY2IqICAgcHRyOworCisgICAgaWYoICEocERDQi0+VGFyZ2V0TFVOKSApCisgICAgeworCWlmKCAhcEFDQi0+c2Nhbl9kZXZpY2VzICkKKwl7CisJICAgIHB0ciA9IHBBQ0ItPnBMaW5rRENCOworCSAgICBjbnQgPSBwQUNCLT5EQ0JDbnQ7CisJICAgIGJ2YWwgPSBwRENCLT5UYXJnZXRJRDsKKwkgICAgZm9yKGk9MDsgaTxjbnQ7IGkrKykKKwkgICAgeworCQlpZiggcHRyLT5UYXJnZXRJRCA9PSBidmFsICkKKwkJeworCQkgICAgcHRyLT5TeW5jUGVyaW9kID0gcERDQi0+U3luY1BlcmlvZDsKKwkJICAgIHB0ci0+U3luY09mZnNldCA9IHBEQ0ItPlN5bmNPZmZzZXQ7CisJCSAgICBwdHItPkN0cmxSMyA9IHBEQ0ItPkN0cmxSMzsKKwkJICAgIHB0ci0+Q3RybFI0ID0gcERDQi0+Q3RybFI0OworCQkgICAgcHRyLT5TeW5jTW9kZSA9IHBEQ0ItPlN5bmNNb2RlOworCQl9CisJCXB0ciA9IHB0ci0+cE5leHREQ0I7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZAorZGMzOTBfRGlzY29ubmVjdCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiApCit7CisgICAgc3RydWN0IGRjMzkwX2RjYiAqcERDQjsKKyAgICBzdHJ1Y3QgZGMzOTBfc3JiICpwU1JCLCAqcHNyYjsKKyAgICB1OCAgaSwgY250OworCisgICAgREVCVUcwKHByaW50ayhLRVJOX0lORk8gIkRJU0MsIikpOworCisgICAgaWYgKCFwQUNCLT5Db25uZWN0ZWQpIHByaW50ayhLRVJOX0VSUiAiREMzOTA6IERpc2Nvbm5lY3Qgbm90LWNvbm5lY3RlZCBidXM/XG4iKTsKKyAgICBwQUNCLT5Db25uZWN0ZWQgPSAwOworICAgIHBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworICAgIGlmICghcERDQikKKyAgICAgeworCURFQlVHMChwcmludGsoS0VSTl9FUlIgIkFDQjolcC0+QWN0aXZlRENCOiVwIElPUG9ydDolMDR4IElSUTolMDJ4ICFcbiIsXAorCSAgICAgICBwQUNCLCBwRENCLCBwQUNCLT5JT1BvcnRCYXNlLCBwQUNCLT5JUlFMZXZlbCkpOworCW1kZWxheSg0MDApOworCURDMzkwX3JlYWQ4IChJTlRfU3RhdHVzKTsJLyogUmVzZXQgUGVuZGluZyBJTlQgKi8KKwlEQzM5MF93cml0ZTggKFNjc2lDbWQsIEVOX1NFTF9SRVNFTCk7CisJcmV0dXJuOworICAgICB9CisgICAgREMzOTBfd3JpdGU4IChTY3NpQ21kLCBFTl9TRUxfUkVTRUwpOworICAgIHBTUkIgPSBwRENCLT5wQWN0aXZlU1JCOworICAgIHBBQ0ItPnBBY3RpdmVEQ0IgPSBOVUxMOworICAgIHBTUkItPlNjc2lQaGFzZSA9IFNDU0lfTk9QMDsKKyAgICBpZiggcFNSQi0+U1JCU3RhdGUgJiBTUkJfVU5FWFBFQ1RfUkVTRUwgKQorCXBTUkItPlNSQlN0YXRlID0gMDsKKyAgICBlbHNlIGlmKCBwU1JCLT5TUkJTdGF0ZSAmIFNSQl9BQk9SVF9TRU5UICkKKyAgICB7CisJcERDQi0+VGFnTWFzayA9IDA7CisJcERDQi0+RENCRmxhZyA9IDA7CisJY250ID0gcERDQi0+R29pbmdTUkJDbnQ7CisJcERDQi0+R29pbmdTUkJDbnQgPSAwOworCXBTUkIgPSBwRENCLT5wR29pbmdTUkI7CisJZm9yKCBpPTA7IGkgPCBjbnQ7IGkrKykKKwl7CisJICAgIHBzcmIgPSBwU1JCLT5wTmV4dFNSQjsKKwkgICAgZGMzOTBfRnJlZV9pbnNlcnQgKHBBQ0IsIHBTUkIpOworCSAgICBwU1JCID0gcHNyYjsKKwl9CisJcERDQi0+cEdvaW5nU1JCID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiggKHBTUkItPlNSQlN0YXRlICYgKFNSQl9TVEFSVF8rU1JCX01TR09VVCkpIHx8CisJICAgIShwU1JCLT5TUkJTdGF0ZSAmIChTUkJfRElTQ09OTkVDVCtTUkJfQ09NUExFVEVEKSkgKQorCXsJLyogU2VsZWN0aW9uIHRpbWUgb3V0ICovCisJCXBTUkItPlRhcmdldFN0YXR1cyA9IFNDU0lfU1RBVF9TRUxfVElNRU9VVDsKKwkJZ290byAgZGlzYzE7CisJfQorCWVsc2UgaWYgKCEocFNSQi0+U1JCU3RhdGUgJiBTUkJfRElTQ09OTkVDVCkgJiYgKHBTUkItPlNSQlN0YXRlICYgU1JCX0NPTVBMRVRFRCkpCisJeworZGlzYzE6CisJICAgIGRjMzkwX2ZyZWV0YWcgKHBEQ0IsIHBTUkIpOworCSAgICBwRENCLT5wQWN0aXZlU1JCID0gTlVMTDsKKwkgICAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfRlJFRTsKKwkgICAgZGMzOTBfU1JCZG9uZSggcEFDQiwgcERDQiwgcFNSQik7CisJfQorICAgIH0KKyAgICBwQUNCLT5Nc2dMZW4gPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitkYzM5MF9SZXNlbGVjdCggc3RydWN0IGRjMzkwX2FjYiogcEFDQiApCit7CisgICAgc3RydWN0IGRjMzkwX2RjYiogICBwRENCOworICAgIHN0cnVjdCBkYzM5MF9zcmIqICAgcFNSQjsKKyAgICB1OCAgaWQsIGx1bjsKKworICAgIERFQlVHMChwcmludGsoS0VSTl9JTkZPICJSU0VMLCIpKTsKKyAgICBwQUNCLT5Db25uZWN0ZWQgPSAxOworICAgIHBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworICAgIGlmKCBwRENCICkKKyAgICB7CS8qIEFyYml0cmF0aW9uIGxvc3QgYnV0IFJlc2VsZWN0aW9uIHdvbiAqLworCURFQlVHMChwcmludGsgKCJEQzM5MDogKEFjdGl2ZURDQiAhPSAwOiBBcmIuIGxvc3QgYnV0IHJlc2VsLiB3b24pIVxuIikpOworCXBTUkIgPSBwRENCLT5wQWN0aXZlU1JCOworCWlmKCAhKCBwQUNCLT5zY2FuX2RldmljZXMgKSApCisJeworCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kID0gcFNSQi0+cGNtZDsKKwkgICAgcGNtZC0+cmVzaWQgPSBwY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJICAgIFNFVF9SRVNfRElEKHBjbWQtPnJlc3VsdCwgRElEX1NPRlRfRVJST1IpOworCSAgICBkYzM5MF9Hb2luZ19yZW1vdmUocERDQiwgcFNSQik7CisJICAgIGRjMzkwX0ZyZWVfaW5zZXJ0KHBBQ0IsIHBTUkIpOworCSAgICBwY21kLT5zY3NpX2RvbmUgKHBjbWQpOworCSAgICBERUJVRzAocHJpbnRrKEtFUk5fREVCVUciREMzOTA6IFJldHVybiBTUkIgJXAgdG8gZnJlZVxuIiwgcFNSQikpOworCX0KKyAgICB9CisgICAgLyogR2V0IElEICovCisgICAgbHVuID0gREMzOTBfcmVhZDggKFNjc2lGaWZvKTsKKyAgICBERUJVRzAocHJpbnRrICgiRGV2ICUwMngsIiwgbHVuKSk7CisgICAgaWYgKCEobHVuICYgKDEgPDwgcEFDQi0+cFNjc2lIb3N0LT50aGlzX2lkKSkpCisgICAgICBwcmludGsgKEtFUk5fRVJSICJEQzM5MDogUmVzZWxlY3Rpb24gbXVzdCBzZWxlY3QgaG9zdCBhZGFwdGVyOiAlMDJ4IVxuIiwgbHVuKTsKKyAgICBlbHNlCisgICAgICBsdW4gXj0gMSA8PCBwQUNCLT5wU2NzaUhvc3QtPnRoaXNfaWQ7IC8qIE1hc2sgQWRhcHRlcklEICovCisgICAgaWQgPSAwOyB3aGlsZSAobHVuID4+PSAxKSBpZCsrOworICAgIC8qIEdldCBMVU4gKi8KKyAgICBsdW4gPSBEQzM5MF9yZWFkOCAoU2NzaUZpZm8pOworICAgIGlmICghKGx1biAmIElERU5USUZZX0JBU0UpKSBwcmludGsgKEtFUk5fRVJSICJEQzM5MDogUmVzZWw6IEV4cGVjdCBpZGVudGlmeSBtZXNzYWdlIVxuIik7CisgICAgbHVuICY9IDc7CisgICAgREVCVUcwKHByaW50ayAoIiglMDJpLSVpKSwiLCBpZCwgbHVuKSk7CisgICAgcERDQiA9IGRjMzkwX2ZpbmREQ0IgKHBBQ0IsIGlkLCBsdW4pOworICAgIGlmICghcERDQikKKyAgICB7CisJcHJpbnRrIChLRVJOX0VSUiAiREMzOTA6IFJlc2VsZWN0IGZyb20gbm9uIGV4aXN0aW5nIGRldmljZSAoJTAyaS0laSlcbiIsCisJCSAgICBpZCwgbHVuKTsKKwlyZXR1cm47CisgICAgfQorICAgIHBBQ0ItPnBBY3RpdmVEQ0IgPSBwRENCOworICAgIC8qIFRhZ1E6IFdlIGV4cGVjdCBhIG1lc3NhZ2Ugc29vbiwgc28gbmV2ZXIgbWluZCB0aGUgZXhhY3QgU1JCICovCisgICAgaWYoIHBEQ0ItPlN5bmNNb2RlICYgRU5fVEFHX1FVRVVFSU5HICkKKyAgICB7CisJcFNSQiA9IHBBQ0ItPnBUbXBTUkI7CisJcERDQi0+cEFjdGl2ZVNSQiA9IHBTUkI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcFNSQiA9IHBEQ0ItPnBBY3RpdmVTUkI7CisJaWYoICFwU1JCIHx8ICEocFNSQi0+U1JCU3RhdGUgJiBTUkJfRElTQ09OTkVDVCkgKQorCXsKKwkgICAgcFNSQj0gcEFDQi0+cFRtcFNSQjsKKwkgICAgcFNSQi0+U1JCU3RhdGUgPSBTUkJfVU5FWFBFQ1RfUkVTRUw7CisJICAgIHByaW50ayAoS0VSTl9FUlIgIkRDMzkwOiBSZXNlbGVjdCB3aXRob3V0IG91dHN0YW5kaW5nIGNtbmQgKCUwMmktJWkpXG4iLAorCQkgICAgaWQsIGx1bik7CisJICAgIHBEQ0ItPnBBY3RpdmVTUkIgPSBwU1JCOworCSAgICBkYzM5MF9FbmFibGVNc2dPdXRfQWJvcnQgKCBwQUNCLCBwU1JCICk7CisJfQorCWVsc2UKKwl7CisJICAgIGlmKCBwRENCLT5EQ0JGbGFnICYgQUJPUlRfREVWXyApCisJICAgIHsKKwkJcFNSQi0+U1JCU3RhdGUgPSBTUkJfQUJPUlRfU0VOVDsKKwkJcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBSZXNlbGVjdDogQWJvcnQgKCUwMmktJWkpXG4iLAorCQkJaWQsIGx1bik7CisJCWRjMzkwX0VuYWJsZU1zZ091dF9BYm9ydCggcEFDQiwgcFNSQiApOworCSAgICB9CisJICAgIGVsc2UKKwkJcFNSQi0+U1JCU3RhdGUgPSBTUkJfREFUQV9YRkVSOworCX0KKyAgICB9CisKKyAgICBERUJVRzEocHJpbnRrIChLRVJOX0RFQlVHICJSZXNlbCBTUkIoJXApOiBUYWdOdW0gKCUwMngpXG4iLCBwU1JCLCBwU1JCLT5UYWdOdW1iZXIpKTsKKyAgICBwU1JCLT5TY3NpUGhhc2UgPSBTQ1NJX05PUDA7CisgICAgREMzOTBfd3JpdGU4IChTY3NpX0Rlc3RfSUQsIHBEQ0ItPlRhcmdldElEKTsKKyAgICBEQzM5MF93cml0ZTggKFN5bmNfUGVyaW9kLCBwRENCLT5TeW5jUGVyaW9kKTsKKyAgICBEQzM5MF93cml0ZTggKFN5bmNfT2Zmc2V0LCBwRENCLT5TeW5jT2Zmc2V0KTsKKyAgICBEQzM5MF93cml0ZTggKEN0cmxSZWcxLCBwRENCLT5DdHJsUjEpOworICAgIERDMzkwX3dyaXRlOCAoQ3RybFJlZzMsIHBEQ0ItPkN0cmxSMyk7CisgICAgREMzOTBfd3JpdGU4IChDdHJsUmVnNCwgcERDQi0+Q3RybFI0KTsJLyogOyBHbGl0Y2ggZWF0ZXIgKi8KKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIE1TR19BQ0NFUFRFRF9DTUQpOwkvKiA7dG8gcmVsZWFzZSB0aGUgL0FDSyBzaWduYWwgKi8KK30KKworc3RhdGljIGludCBfX2lubGluZV9fCitkYzM5MF9SZXF1ZXN0U2Vuc2Uoc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kOworCisJcGNtZCA9IHBTUkItPnBjbWQ7CisKKwlSRU1PVkFCTEVERUJVRyhwcmludGsoS0VSTl9JTkZPICJEQzM5MDogUmVxdWVzdFNlbnNlKENtZCAlMDJ4LCBJZCAlMDJ4LCBMVU4gJTAyeClcbiIsXAorCQkJICAgICAgcGNtZC0+Y21uZFswXSwgcERDQi0+VGFyZ2V0SUQsIHBEQ0ItPlRhcmdldExVTikpOworCisJcFNSQi0+U1JCRmxhZyB8PSBBVVRPX1JFUVNFTlNFOworCXBTUkItPlNhdmVkU0dDb3VudCA9IHBjbWQtPnVzZV9zZzsKKwlwU1JCLT5TYXZlZFRvdFhMZW4gPSBwU1JCLT5Ub3RhbFhmZXJyZWRMZW47CisJcFNSQi0+QWRhcHRTdGF0dXMgPSAwOworCXBTUkItPlRhcmdldFN0YXR1cyA9IDA7IC8qIENIRUNLX0NPTkRJVElPTjw8MTsgKi8KKworCS8qIFdlIGFyZSBjYWxsZWQgZnJvbSBTUkJkb25lLCBvcmlnaW5hbCBQQ0kgbWFwcGluZyBoYXMgYmVlbiByZW1vdmVkCisJICogYWxyZWFkeSwgbmV3IG9uZSBpcyBzZXQgdXAgZnJvbSBTdGFydFNDU0kgKi8KKwlwU1JCLT5TR0luZGV4ID0gMDsKKworCXBTUkItPlRvdGFsWGZlcnJlZExlbiA9IDA7CisJcFNSQi0+U0dUb0JlWGZlckxlbiA9IDA7CisJcmV0dXJuIGRjMzkwX1N0YXJ0U0NTSShwQUNCLCBwRENCLCBwU1JCKTsKK30KKworCitzdGF0aWMgdm9pZAorZGMzOTBfU1JCZG9uZSggc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQiApCit7CisgICAgdTggc3RhdHVzOworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnBjbWQ7CisKKyAgICBwY21kID0gcFNSQi0+cGNtZDsKKyAgICAvKiBLRzogTW92ZWQgcGNpX3VubWFwIGhlcmUgKi8KKyAgICBkYzM5MF9wY2lfdW5tYXAocFNSQik7CisKKyAgICBzdGF0dXMgPSBwU1JCLT5UYXJnZXRTdGF0dXM7CisKKyAgICBERUJVRzAocHJpbnRrICgiIFNSQmRvbmUgKCUwMngsJTA4eCksIFNSQiAlcCwgcGlkICVsaVxuIiwgc3RhdHVzLCBwY21kLT5yZXN1bHQsXAorCQlwU1JCLCBwY21kLT5waWQpKTsKKyAgICBpZihwU1JCLT5TUkJGbGFnICYgQVVUT19SRVFTRU5TRSkKKyAgICB7CS8qIExhc3QgY29tbWFuZCB3YXMgYSBSZXF1ZXN0IFNlbnNlICovCisJcFNSQi0+U1JCRmxhZyAmPSB+QVVUT19SRVFTRU5TRTsKKwlwU1JCLT5BZGFwdFN0YXR1cyA9IDA7CisJcFNSQi0+VGFyZ2V0U3RhdHVzID0gQ0hFQ0tfQ09ORElUSU9OIDw8IDE7CisKKwkvL3BjbWQtPnJlc3VsdCA9IE1LX1JFUyhEUklWRVJfU0VOU0UsRElEX09LLDAsc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IChDSEVDS19DT05ESVRJT04gPDwgMSkpCisJICAgIHBjbWQtPnJlc3VsdCA9IE1LX1JFU19MTlgoMCwgRElEX0JBRF9UQVJHRVQsIDAsIC8qQ0hFQ0tfQ09ORElUSU9OKi8wKTsKKwllbHNlIC8qIFJldHJ5ICovCisJeworCSAgICBpZiggcFNSQi0+cGNtZC0+Y21uZFswXSA9PSBURVNUX1VOSVRfUkVBRFkgLyogfHwgcFNSQi0+cGNtZC0+Y21uZFswXSA9PSBTVEFSVF9TVE9QICovKQorCSAgICB7CisJCS8qIERvbid0IHJldHJ5IG9uIFRFU1RfVU5JVF9SRUFEWSAqLworCQlwY21kLT5yZXN1bHQgPSBNS19SRVNfTE5YKERSSVZFUl9TRU5TRSxESURfT0ssMCxDSEVDS19DT05ESVRJT04pOworCQlSRU1PVkFCTEVERUJVRyhwcmludGsoS0VSTl9JTkZPICJDbWQ9JTAyeCwgUmVzdWx0PSUwOHgsIFhmZXJMPSUwOHhcbiIscFNSQi0+cGNtZC0+Y21uZFswXSxcCisJCSAgICAgICAodTMyKSBwY21kLT5yZXN1bHQsICh1MzIpIHBTUkItPlRvdGFsWGZlcnJlZExlbikpOworCSAgICB9IGVsc2UgeworCQlTRVRfUkVTX0RSVihwY21kLT5yZXN1bHQsIERSSVZFUl9TRU5TRSk7CisJCXBjbWQtPnVzZV9zZyA9IHBTUkItPlNhdmVkU0dDb3VudDsKKwkJLy9wU1JCLT5TY3NpQ21kTGVuCSA9ICh1OCkgKHBTUkItPlNlZ21lbnQxWzBdID4+IDgpOworCQlERUJVRzAgKHByaW50ayAoIkRDMzkwOiBSRVRSWSBwaWQgJWxpICglMDJ4KSwgdGFyZ2V0ICUwMmktJTAyaVxuIiwgcGNtZC0+cGlkLCBwY21kLT5jbW5kWzBdLCBwY21kLT5kZXZpY2UtPmlkLCBwY21kLT5kZXZpY2UtPmx1bikpOworCQlwU1JCLT5Ub3RhbFhmZXJyZWRMZW4gPSAwOworCQlTRVRfUkVTX0RJRChwY21kLT5yZXN1bHQsIERJRF9TT0ZUX0VSUk9SKTsKKwkgICAgfQorCX0KKwlnb3RvIGNtZF9kb25lOworICAgIH0KKyAgICBpZiggc3RhdHVzICkKKyAgICB7CisJaWYoIHN0YXR1c19ieXRlKHN0YXR1cykgPT0gQ0hFQ0tfQ09ORElUSU9OICkKKwl7CisJICAgIGlmIChkYzM5MF9SZXF1ZXN0U2Vuc2UocEFDQiwgcERDQiwgcFNSQikpIHsKKwkJU0VUX1JFU19ESUQocGNtZC0+cmVzdWx0LCBESURfRVJST1IpOworCQlnb3RvIGNtZF9kb25lOworCSAgICB9CisJICAgIHJldHVybjsKKwl9CisJZWxzZSBpZiggc3RhdHVzX2J5dGUoc3RhdHVzKSA9PSBRVUVVRV9GVUxMICkKKwl7CisJICAgIHNjc2lfdHJhY2tfcXVldWVfZnVsbChwY21kLT5kZXZpY2UsIHBEQ0ItPkdvaW5nU1JCQ250IC0gMSk7CisJICAgIHBjbWQtPnVzZV9zZyA9IHBTUkItPlNhdmVkU0dDb3VudDsKKwkgICAgREVCVUcwIChwcmludGsgKCJEQzM5MDogUkVUUlkgcGlkICVsaSAoJTAyeCksIHRhcmdldCAlMDJpLSUwMmlcbiIsIHBjbWQtPnBpZCwgcGNtZC0+Y21uZFswXSwgcGNtZC0+ZGV2aWNlLT5pZCwgcGNtZC0+ZGV2aWNlLT5sdW4pKTsKKwkgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuID0gMDsKKwkgICAgU0VUX1JFU19ESUQocGNtZC0+cmVzdWx0LCBESURfU09GVF9FUlJPUik7CisJfQorCWVsc2UgaWYoc3RhdHVzID09IFNDU0lfU1RBVF9TRUxfVElNRU9VVCkKKwl7CisJICAgIHBTUkItPkFkYXB0U3RhdHVzID0gSF9TRUxfVElNRU9VVDsKKwkgICAgcFNSQi0+VGFyZ2V0U3RhdHVzID0gMDsKKwkgICAgcGNtZC0+cmVzdWx0ID0gTUtfUkVTKDAsRElEX05PX0NPTk5FQ1QsMCwwKTsKKwkgICAgLyogRGV2aWNlcyBhcmUgcmVtb3ZlZCBiZWxvdyAuLi4gKi8KKwl9CisJZWxzZSBpZiAoc3RhdHVzX2J5dGUoc3RhdHVzKSA9PSBCVVNZICYmIAorCQkgKHBjbWQtPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZIHx8IHBjbWQtPmNtbmRbMF0gPT0gSU5RVUlSWSkgJiYKKwkJIHBBQ0ItPnNjYW5fZGV2aWNlcykKKwl7CisJICAgIHBTUkItPkFkYXB0U3RhdHVzID0gMDsKKwkgICAgcFNSQi0+VGFyZ2V0U3RhdHVzID0gc3RhdHVzOworCSAgICBwY21kLT5yZXN1bHQgPSBNS19SRVMoMCwwLHBTUkItPkVuZE1lc3NhZ2UsLypzdGF0dXMqLzApOworCX0KKwllbHNlCisJeyAgIC8qIEFub3RoZXIgZXJyb3IgKi8KKwkgICAgcFNSQi0+VG90YWxYZmVycmVkTGVuID0gMDsKKwkgICAgU0VUX1JFU19ESUQocGNtZC0+cmVzdWx0LCBESURfU09GVF9FUlJPUik7CisJICAgIGdvdG8gY21kX2RvbmU7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgewkvKiAgVGFyZ2V0IHN0YXR1cyA9PSAwICovCisJc3RhdHVzID0gcFNSQi0+QWRhcHRTdGF0dXM7CisJaWYoc3RhdHVzICYgSF9PVkVSX1VOREVSX1JVTikKKwl7CisJICAgIHBTUkItPlRhcmdldFN0YXR1cyA9IDA7CisJICAgIFNFVF9SRVNfRElEKHBjbWQtPnJlc3VsdCxESURfT0spOworCSAgICBTRVRfUkVTX01TRyhwY21kLT5yZXN1bHQscFNSQi0+RW5kTWVzc2FnZSk7CisJfQorCWVsc2UgaWYoIHBTUkItPlNSQlN0YXR1cyAmIFBBUklUWV9FUlJPUikKKwl7CisJICAgIC8vcGNtZC0+cmVzdWx0ID0gTUtfUkVTKDAsRElEX1BBUklUWSxwU1JCLT5FbmRNZXNzYWdlLDApOworCSAgICBTRVRfUkVTX0RJRChwY21kLT5yZXN1bHQsRElEX1BBUklUWSk7CisJICAgIFNFVF9SRVNfTVNHKHBjbWQtPnJlc3VsdCxwU1JCLT5FbmRNZXNzYWdlKTsKKwl9CisJZWxzZQkJICAgICAgIC8qIE5vIGVycm9yICovCisJeworCSAgICBwU1JCLT5BZGFwdFN0YXR1cyA9IDA7CisJICAgIHBTUkItPlRhcmdldFN0YXR1cyA9IDA7CisJICAgIFNFVF9SRVNfRElEKHBjbWQtPnJlc3VsdCxESURfT0spOworCX0KKyAgICB9CisKK2NtZF9kb25lOgorICAgIHBjbWQtPnJlc2lkID0gcGNtZC0+cmVxdWVzdF9idWZmbGVuIC0gcFNSQi0+VG90YWxYZmVycmVkTGVuOworCisgICAgZGMzOTBfR29pbmdfcmVtb3ZlIChwRENCLCBwU1JCKTsKKyAgICAvKiBBZGQgdG8gZnJlZSBsaXN0ICovCisgICAgZGMzOTBfRnJlZV9pbnNlcnQgKHBBQ0IsIHBTUkIpOworCisgICAgREVCVUcwKHByaW50ayAoS0VSTl9ERUJVRyAiREMzOTA6IFNSQmRvbmU6IGRvbmUgcGlkICVsaVxuIiwgcGNtZC0+cGlkKSk7CisgICAgcGNtZC0+c2NzaV9kb25lIChwY21kKTsKKworICAgIHJldHVybjsKK30KKworCisvKiBSZW1vdmUgYWxsIFNSQnMgZnJvbSBHb2luZyBsaXN0IGFuZCBpbmZvcm0gbWlkbGV2ZWwgKi8KK3N0YXRpYyB2b2lkCitkYzM5MF9Eb2luZ1NSQl9Eb25lKHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgZGMzOTBfZGNiICpwRENCLCAqcGRjYjsKKyAgICBzdHJ1Y3QgZGMzOTBfc3JiICpwc3JiLCAqcHNyYjI7CisgICAgaW50IGk7CisgICAgc3RydWN0IHNjc2lfY21uZCAqcGNtZDsKKworICAgIHBEQ0IgPSBwQUNCLT5wTGlua0RDQjsKKyAgICBwZGNiID0gcERDQjsKKyAgICBpZiAoISBwZGNiKSByZXR1cm47CisgICAgZG8KKyAgICB7CisJcHNyYiA9IHBkY2ItPnBHb2luZ1NSQjsKKwlmb3IgKGkgPSAwOyBpIDwgcGRjYi0+R29pbmdTUkJDbnQ7IGkrKykKKwl7CisJICAgIHBzcmIyID0gcHNyYi0+cE5leHRTUkI7CisJICAgIHBjbWQgPSBwc3JiLT5wY21kOworCSAgICBkYzM5MF9GcmVlX2luc2VydCAocEFDQiwgcHNyYik7CisJICAgIHBzcmIgID0gcHNyYjI7CisJfQorCXBkY2ItPkdvaW5nU1JCQ250ID0gMDsKKwlwZGNiLT5wR29pbmdTUkIgPSBOVUxMOworCXBkY2ItPlRhZ01hc2sgPSAwOworCXBkY2IgPSBwZGNiLT5wTmV4dERDQjsKKyAgICB9IHdoaWxlKCBwZGNiICE9IHBEQ0IgKTsKK30KKworCitzdGF0aWMgdm9pZAorZGMzOTBfUmVzZXRTQ1NJQnVzKCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCICkKK3sKKyAgICAvL0RDMzkwX3dyaXRlOCAoU2NzaUNtZCwgUlNUX0RFVklDRV9DTUQpOworICAgIC8vdWRlbGF5ICgyNTApOworICAgIC8vREMzOTBfd3JpdGU4IChTY3NpQ21kLCBOT1BfQ01EKTsKKworICAgIERDMzkwX3dyaXRlOCAoU2NzaUNtZCwgQ0xFQVJfRklGT19DTUQpOworICAgIERDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIFJTVF9TQ1NJX0JVU19DTUQpOworICAgIHBBQ0ItPkNvbm5lY3RlZCA9IDA7CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkYzM5MF9TY3NpUnN0RGV0ZWN0KCBzdHJ1Y3QgZGMzOTBfYWNiKiBwQUNCICkKK3sKKyAgICBwcmludGsgKCJEQzM5MDogUnN0X0RldGVjdDogbGFzdHN0YXQgPSAlMDh4XG4iLCBkYzM5MF9sYXN0c3RhdHVzKTsKKyAgICAvL0RFQlVHMChwcmludGsoS0VSTl9JTkZPICJSU1RfREVURUNULCIpKTsKKworICAgIERDMzkwX3dyaXRlOCAoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKKyAgICAvKiBVbmxvY2sgYmVmb3JlID8gKi8KKyAgICAvKiBkZWxheSBoYWxmIGEgc2Vjb25kICovCisgICAgdWRlbGF5ICgxMDAwKTsKKyAgICBEQzM5MF93cml0ZTggKFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKyAgICBwQUNCLT5wU2NzaUhvc3QtPmxhc3RfcmVzZXQgPSBqaWZmaWVzICsgNSpIWi8yCisJCSAgICArIEhaICogZGMzOTBfZWVwcm9tQnVmW3BBQ0ItPkFkYXB0ZXJJbmRleF1bRUVfREVMQVldOworICAgIHBBQ0ItPkNvbm5lY3RlZCA9IDA7CisKKyAgICBpZiggcEFDQi0+QUNCRmxhZyAmIFJFU0VUX0RFViApCisJcEFDQi0+QUNCRmxhZyB8PSBSRVNFVF9ET05FOworICAgIGVsc2UKKyAgICB7ICAgLyogUmVzZXQgd2FzIGlzc3VlZCBieSBzYiBlbHNlICovCisJcEFDQi0+QUNCRmxhZyB8PSBSRVNFVF9ERVRFQ1Q7CisKKwlkYzM5MF9SZXNldERldlBhcmFtKCBwQUNCICk7CisJZGMzOTBfRG9pbmdTUkJfRG9uZSggcEFDQiwgTlVMTCk7CisJLy9kYzM5MF9SZWNvdmVyU1JCKCBwQUNCICk7CisJcEFDQi0+cEFjdGl2ZURDQiA9IE5VTEw7CisJcEFDQi0+QUNCRmxhZyA9IDA7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdGljIGludCBEQzM5MF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKKwlzdHJ1Y3QgZGMzOTBfYWNiICphY2IgPSAoc3RydWN0IGRjMzkwX2FjYiAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBkYzM5MF9kY2IgKmRjYiA9IHNkZXYtPmhvc3RkYXRhOworCXN0cnVjdCBkYzM5MF9zcmIgKnNyYjsKKworCWlmIChzZGV2LT5xdWV1ZV9kZXB0aCA8PSBkY2ItPkdvaW5nU1JCQ250KQorCQlnb3RvIGRldmljZV9idXN5OworCWlmIChhY2ItPnBBY3RpdmVEQ0IpCisJCWdvdG8gaG9zdF9idXN5OworCWlmIChhY2ItPkFDQkZsYWcgJiAoUkVTRVRfREVURUNUfFJFU0VUX0RPTkV8UkVTRVRfREVWKSkKKwkJZ290byBob3N0X2J1c3k7CisKKwlzcmIgPSBhY2ItPnBGcmVlU1JCOworCWlmICh1bmxpa2VseShzcmIgPT0gTlVMTCkpCisJCWdvdG8gaG9zdF9idXN5OworCisJY21kLT5zY3NpX2RvbmUgPSBkb25lOworCWNtZC0+cmVzdWx0ID0gMDsKKwlhY2ItPkNtZHMrKzsKKworCWFjYi0+cEZyZWVTUkIgPSBzcmItPnBOZXh0U1JCOworCXNyYi0+cE5leHRTUkIgPSBOVUxMOworCisJc3JiLT5wU1JCRENCID0gZGNiOworCXNyYi0+cGNtZCA9IGNtZDsKKwljbWQtPmhvc3Rfc2NyaWJibGUgPSAoY2hhciAqKXNyYjsKKyAgICAKKwlzcmItPlNHSW5kZXggPSAwOworCXNyYi0+QWRhcHRTdGF0dXMgPSAwOworCXNyYi0+VGFyZ2V0U3RhdHVzID0gMDsKKwlzcmItPk1zZ0NudCA9IDA7CisKKwlzcmItPlNSQlN0YXR1cyA9IDA7CisJc3JiLT5TUkJGbGFnID0gMDsKKwlzcmItPlNSQlN0YXRlID0gMDsKKwlzcmItPlRvdGFsWGZlcnJlZExlbiA9IDA7CisJc3JiLT5TR0J1c0FkZHIgPSAwOworCXNyYi0+U0dUb0JlWGZlckxlbiA9IDA7CisJc3JiLT5TY3NpUGhhc2UgPSAwOworCXNyYi0+RW5kTWVzc2FnZSA9IDA7CisJc3JiLT5UYWdOdW1iZXIgPSBTQ1NJX05PX1RBRzsKKworCWlmIChkYzM5MF9TdGFydFNDU0koYWNiLCBkY2IsIHNyYikpIHsKKwkJZGMzOTBfRnJlZV9pbnNlcnQoYWNiLCBzcmIpOworCQlnb3RvIGhvc3RfYnVzeTsKKwl9CisKKwlkYzM5MF9Hb2luZ19hcHBlbmQoZGNiLCBzcmIpOworCisJcmV0dXJuIDA7CisKKyBob3N0X2J1c3k6CisJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKyBkZXZpY2VfYnVzeToKKwlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOworfQorCitzdGF0aWMgdm9pZCBkYzM5MF9kdW1waW5mbyAoc3RydWN0IGRjMzkwX2FjYiogcEFDQiwgc3RydWN0IGRjMzkwX2RjYiogcERDQiwgc3RydWN0IGRjMzkwX3NyYiogcFNSQikKK3sKKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKyAgICB1MTYgcHN0YXQ7CisKKyAgICBpZiAoIXBEQ0IpIHBEQ0IgPSBwQUNCLT5wQWN0aXZlRENCOworICAgIGlmICghcFNSQiAmJiBwRENCKSBwU1JCID0gcERDQi0+cEFjdGl2ZVNSQjsKKworICAgIGlmIChwU1JCKSAKKyAgICB7CisJcHJpbnRrICgiREMzOTA6IFNSQjogWGZlcnJlZCAlMDhseCwgUmVtYWluICUwOGx4LCBTdGF0ZSAlMDh4LCBQaGFzZSAlMDJ4XG4iLAorCQlwU1JCLT5Ub3RhbFhmZXJyZWRMZW4sIHBTUkItPlNHVG9CZVhmZXJMZW4sIHBTUkItPlNSQlN0YXRlLAorCQlwU1JCLT5TY3NpUGhhc2UpOworCXByaW50ayAoIkRDMzkwOiBBZHBhdGVyU3RhdHVzOiAlMDJ4LCBTUkIgU3RhdHVzICUwMnhcbiIsIHBTUkItPkFkYXB0U3RhdHVzLCBwU1JCLT5TUkJTdGF0dXMpOworICAgIH0KKyAgICBwcmludGsgKCJEQzM5MDogU3RhdHVzIG9mIGxhc3QgSVJRIChETUEvU0MvSW50L0lSUSk6ICUwOHhcbiIsIGRjMzkwX2xhc3RzdGF0dXMpOworICAgIHByaW50ayAoIkRDMzkwOiBSZWdpc3RlciBkdW1wOiBTQ1NJIGJsb2NrOlxuIik7CisgICAgcHJpbnRrICgiREMzOTA6IFhmZXJDbnQgIENtZCBTdGF0IEludFMgSVJRUyBGRklTIEN0bDEgQ3RsMiBDdGwzIEN0bDRcbiIpOworICAgIHByaW50ayAoIkRDMzkwOiAgJTA2eCAgICUwMnggICAlMDJ4ICAgJTAyeCIsCisJICAgIERDMzkwX3JlYWQ4KEN0Y1JlZ19Mb3cpICsgKERDMzkwX3JlYWQ4KEN0Y1JlZ19NaWQpIDw8IDgpICsgKERDMzkwX3JlYWQ4KEN0Y1JlZ19IaWdoKSA8PCAxNiksCisJICAgIERDMzkwX3JlYWQ4KFNjc2lDbWQpLCBEQzM5MF9yZWFkOChTY3NpX1N0YXR1cyksIERDMzkwX3JlYWQ4KEludGVybl9TdGF0ZSkpOworICAgIHByaW50ayAoIiAgICUwMnggICAlMDJ4ICAgJTAyeCAgICUwMnggICAlMDJ4ICAgJTAyeFxuIiwKKwkgICAgREMzOTBfcmVhZDgoSU5UX1N0YXR1cyksIERDMzkwX3JlYWQ4KEN1cnJlbnRfRmlmbyksIERDMzkwX3JlYWQ4KEN0cmxSZWcxKSwKKwkgICAgREMzOTBfcmVhZDgoQ3RybFJlZzIpLCBEQzM5MF9yZWFkOChDdHJsUmVnMyksIERDMzkwX3JlYWQ4KEN0cmxSZWc0KSk7CisgICAgREMzOTBfd3JpdGUzMiAoRE1BX1Njc2lCdXNDdHJsLCBXUlRfRVJBU0VfRE1BX1NUQVQgfCBFTl9JTlRfT05fUENJX0FCT1JUKTsKKyAgICBpZiAoREMzOTBfcmVhZDgoQ3VycmVudF9GaWZvKSAmIDB4MWYpCisgICAgICB7CisJcHJpbnRrICgiREMzOTA6IEZJRk86Iik7CisJd2hpbGUgKERDMzkwX3JlYWQ4KEN1cnJlbnRfRmlmbykgJiAweDFmKSBwcmludGsgKCIgJTAyeCIsIERDMzkwX3JlYWQ4KFNjc2lGaWZvKSk7CisJcHJpbnRrICgiXG4iKTsKKyAgICAgIH0KKyAgICBwcmludGsgKCJEQzM5MDogUmVnaXN0ZXIgZHVtcDogRE1BIGVuZ2luZTpcbiIpOworICAgIHByaW50ayAoIkRDMzkwOiBDbWQgICBTVHJDbnQgICAgU0J1c0EgICAgV3JrQkMgICAgV3JrQUMgU3RhdCBTQnVzQ3RybFxuIik7CisgICAgcHJpbnRrICgiREMzOTA6ICAlMDJ4ICUwOHggJTA4eCAlMDh4ICUwOHggICAlMDJ4ICUwOHhcbiIsCisJICAgIERDMzkwX3JlYWQ4KERNQV9DbWQpLCBEQzM5MF9yZWFkMzIoRE1BX1hmZXJDbnQpLCBEQzM5MF9yZWFkMzIoRE1BX1hmZXJBZGRyKSwKKwkgICAgREMzOTBfcmVhZDMyKERNQV9Xa19CeXRlQ250ciksIERDMzkwX3JlYWQzMihETUFfV2tfQWRkckNudHIpLAorCSAgICBEQzM5MF9yZWFkOChETUFfU3RhdHVzKSwgREMzOTBfcmVhZDMyKERNQV9TY3NpQnVzQ3RybCkpOworICAgIERDMzkwX3dyaXRlMzIgKERNQV9TY3NpQnVzQ3RybCwgRU5fSU5UX09OX1BDSV9BQk9SVCk7CisKKyAgICBwZGV2ID0gcEFDQi0+cGRldjsKKyAgICBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCAmcHN0YXQpOworICAgIHByaW50ayAoIkRDMzkwOiBSZWdpc3RlciBkdW1wOiBQQ0kgU3RhdHVzOiAlMDR4XG4iLCBwc3RhdCk7CisgICAgcHJpbnRrICgiREMzOTA6IEluIGNhc2Ugb2YgZHJpdmVyIHRyb3VibGUgcmVhZCBEb2N1bWVudGF0aW9uL3Njc2kvdG1zY3NpbS50eHRcbiIpOworfQorCisKK3N0YXRpYyBpbnQgREMzOTBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBkYzM5MF9hY2IgKnBBQ0IgPSAoc3RydWN0IGRjMzkwX2FjYiopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGMzOTBfZGNiICpwRENCID0gKHN0cnVjdCBkYzM5MF9kY2IqKSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CisKKwlwcmludGsoIkRDMzkwOiBBYm9ydCBjb21tYW5kIChwaWQgJWxpLCBEZXZpY2UgJTAyaS0lMDJpKVxuIiwKKwkgICAgICAgY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CisKKwkvKiBhYm9ydCgpIGlzIHRvbyBzdHVwaWQgZm9yIGFscmVhZHkgc2VudCBjb21tYW5kcyBhdCB0aGUgbW9tZW50LiAKKwkgKiBJZiBpdCdzIGNhbGxlZCB3ZSBhcmUgaW4gdHJvdWJsZSBhbnl3YXksIHNvIGxldCdzIGR1bXAgc29tZSBpbmZvIAorCSAqIGludG8gdGhlIHN5c2xvZyBhdCBsZWFzdC4gKEtHLCA5OC8wOC8yMCw5OS8wNi8yMCkgKi8KKwlkYzM5MF9kdW1waW5mbyhwQUNCLCBwRENCLCBOVUxMKTsKKworCXBEQ0ItPkRDQkZsYWcgfD0gQUJPUlRfREVWXzsKKwlwcmludGsoS0VSTl9JTkZPICJEQzM5MDogQWJvcnRlZCBwaWQgJWxpXG4iLCBjbWQtPnBpZCk7CisKKwlyZXR1cm4gRkFJTEVEOworfQorCisKK3N0YXRpYyB2b2lkIGRjMzkwX1Jlc2V0RGV2UGFyYW0oIHN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgKQoreworICAgIHN0cnVjdCBkYzM5MF9kY2IgKnBEQ0IsICpwZGNiOworCisgICAgcERDQiA9IHBBQ0ItPnBMaW5rRENCOworICAgIGlmICghIHBEQ0IpIHJldHVybjsKKyAgICBwZGNiID0gcERDQjsKKyAgICBkbworICAgIHsKKwlwRENCLT5TeW5jTW9kZSAmPSB+U1lOQ19ORUdPX0RPTkU7CisJcERDQi0+U3luY1BlcmlvZCA9IDA7CisJcERDQi0+U3luY09mZnNldCA9IDA7CisJcERDQi0+VGFnTWFzayA9IDA7CisJcERDQi0+Q3RybFIzID0gRkFTVF9DTEs7CisJcERDQi0+Q3RybFI0ICY9IE5FR0FURV9SRVFBQ0tEQVRBIHwgQ1RSTDRfUkVTRVJWRUQgfCBORUdBVEVfUkVRQUNLOworCXBEQ0ItPkN0cmxSNCB8PSBwQUNCLT5nbGl0Y2hfY2ZnOworCXBEQ0IgPSBwRENCLT5wTmV4dERDQjsKKyAgICB9CisgICAgd2hpbGUoIHBkY2IgIT0gcERDQiApOworICAgIHBBQ0ItPkFDQkZsYWcgJj0gfihSRVNFVF9ERVYgfCBSRVNFVF9ET05FIHwgUkVTRVRfREVURUNUKTsKKworfQorCitzdGF0aWMgaW50IERDMzkwX2J1c19yZXNldCAoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBkYzM5MF9hY2IqICAgIHBBQ0IgPSAoc3RydWN0IGRjMzkwX2FjYiopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwl1OCAgIGJ2YWw7CisKKwlidmFsID0gREMzOTBfcmVhZDgoQ3RybFJlZzEpIHwgRElTX0lOVF9PTl9TQ1NJX1JTVDsKKwlEQzM5MF93cml0ZTgoQ3RybFJlZzEsIGJ2YWwpOwkvKiBkaXNhYmxlIElSUSBvbiBidXMgcmVzZXQgKi8KKworCXBBQ0ItPkFDQkZsYWcgfD0gUkVTRVRfREVWOworCWRjMzkwX1Jlc2V0U0NTSUJ1cyhwQUNCKTsKKworCWRjMzkwX1Jlc2V0RGV2UGFyYW0ocEFDQik7CisJdWRlbGF5KDEwMDApOworCXBBQ0ItPnBTY3NpSG9zdC0+bGFzdF9yZXNldCA9IGppZmZpZXMgKyAzKkhaLzIgCisJCSsgSFogKiBkYzM5MF9lZXByb21CdWZbcEFDQi0+QWRhcHRlckluZGV4XVtFRV9ERUxBWV07CisgICAgCisJREMzOTBfd3JpdGU4KFNjc2lDbWQsIENMRUFSX0ZJRk9fQ01EKTsKKwlEQzM5MF9yZWFkOChJTlRfU3RhdHVzKTsJCS8qIFJlc2V0IFBlbmRpbmcgSU5UICovCisKKwlkYzM5MF9Eb2luZ1NSQl9Eb25lKHBBQ0IsIGNtZCk7CisKKwlwQUNCLT5wQWN0aXZlRENCID0gTlVMTDsKKwlwQUNCLT5BQ0JGbGFnID0gMDsKKworCWJ2YWwgPSBEQzM5MF9yZWFkOChDdHJsUmVnMSkgJiB+RElTX0lOVF9PTl9TQ1NJX1JTVDsKKwlEQzM5MF93cml0ZTgoQ3RybFJlZzEsIGJ2YWwpOwkvKiByZS1lbmFibGUgaW50ZXJydXB0ICovCisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqCisgKiBkYzM5MF9zbGF2ZV9hbGxvYyAtIENhbGxlZCBieSB0aGUgc2NzaSBtaWQgbGF5ZXIgdG8gdGVsbCB1cyBhYm91dCBhIG5ldworICogc2NzaSBkZXZpY2UgdGhhdCB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4KKyAqCisgKiBAc2NzaV9kZXZpY2U6IFRoZSBuZXcgc2NzaSBkZXZpY2UgdGhhdCB3ZSBuZWVkIHRvIGhhbmRsZS4KKyAqLworc3RhdGljIGludCBkYzM5MF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlKQoreworCXN0cnVjdCBkYzM5MF9hY2IgKnBBQ0IgPSAoc3RydWN0IGRjMzkwX2FjYiopIHNjc2lfZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGMzOTBfZGNiICpwRENCLCAqcERDQjIgPSBOVUxMOworCXVpbnQgaWQgPSBzY3NpX2RldmljZS0+aWQ7CisJdWludCBsdW4gPSBzY3NpX2RldmljZS0+bHVuOworCisJcERDQiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkYzM5MF9kY2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBEQ0IpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwRENCLCAwLCBzaXplb2Yoc3RydWN0IGRjMzkwX2RjYikpOworCisJaWYgKCFwQUNCLT5EQ0JDbnQrKykgeworCQlwQUNCLT5wTGlua0RDQiA9IHBEQ0I7CisJCXBBQ0ItPnBEQ0JSdW5Sb2JpbiA9IHBEQ0I7CisJfSBlbHNlIHsKKwkJcEFDQi0+cExhc3REQ0ItPnBOZXh0RENCID0gcERDQjsKKwl9CisgICAKKwlwRENCLT5wTmV4dERDQiA9IHBBQ0ItPnBMaW5rRENCOworCXBBQ0ItPnBMYXN0RENCID0gcERDQjsKKworCXBEQ0ItPnBEQ0JBQ0IgPSBwQUNCOworCXBEQ0ItPlRhcmdldElEID0gaWQ7CisJcERDQi0+VGFyZ2V0TFVOID0gbHVuOworCisJLyoKKwkgKiBTb21lIHZhbHVlcyBhcmUgZm9yIGFsbCBMVU5zOiBDb3B5IHRoZW0gCisJICogSW4gYSBjbGVhbiB3YXk6IFdlIHdvdWxkIGhhdmUgYW4gb3duIHN0cnVjdHVyZSBmb3IgYSBTQ1NJLUlEIAorCSAqLworCWlmIChsdW4gJiYgKHBEQ0IyID0gZGMzOTBfZmluZERDQihwQUNCLCBpZCwgMCkpKSB7CisJCXBEQ0ItPkRldk1vZGUgPSBwRENCMi0+RGV2TW9kZTsKKwkJcERDQi0+U3luY01vZGUgPSBwRENCMi0+U3luY01vZGUgJiBTWU5DX05FR09fRE9ORTsKKwkJcERDQi0+U3luY1BlcmlvZCA9IHBEQ0IyLT5TeW5jUGVyaW9kOworCQlwRENCLT5TeW5jT2Zmc2V0ID0gcERDQjItPlN5bmNPZmZzZXQ7CisJCXBEQ0ItPk5lZ29QZXJpb2QgPSBwRENCMi0+TmVnb1BlcmlvZDsKKyAgICAgIAorCQlwRENCLT5DdHJsUjMgPSBwRENCMi0+Q3RybFIzOworCQlwRENCLT5DdHJsUjQgPSBwRENCMi0+Q3RybFI0OworCX0gZWxzZSB7CisJCXU4IGluZGV4ID0gcEFDQi0+QWRhcHRlckluZGV4OworCQlQRUVwcm9tIHByb20gPSAoUEVFcHJvbSkgJmRjMzkwX2VlcHJvbUJ1ZltpbmRleF1baWQgPDwgMl07CisKKwkJcERDQi0+RGV2TW9kZSA9IHByb20tPkVFX01PREUxOworCQlwRENCLT5OZWdvUGVyaW9kID0KKwkJCShkYzM5MF9jbG9ja19wZXJpb2QxW3Byb20tPkVFX1NQRUVEXSAqIDI1KSA+PiAyOworCQlwRENCLT5DdHJsUjMgPSBGQVNUX0NMSzsKKwkJcERDQi0+Q3RybFI0ID0gcEFDQi0+Z2xpdGNoX2NmZyB8IENUUkw0X1JFU0VSVkVEOworCQlpZiAoZGMzOTBfZWVwcm9tQnVmW2luZGV4XVtFRV9NT0RFMl0gJiBBQ1RJVkVfTkVHQVRJT04pCisJCQlwRENCLT5DdHJsUjQgfD0gTkVHQVRFX1JFUUFDS0RBVEEgfCBORUdBVEVfUkVRQUNLOworCX0KKworCWlmIChwRENCLT5EZXZNb2RlICYgU1lOQ19ORUdPXykKKwkJcERDQi0+U3luY01vZGUgfD0gU1lOQ19FTkFCTEU7CisJZWxzZSB7CisJCXBEQ0ItPlN5bmNNb2RlID0gMDsKKwkJcERDQi0+U3luY09mZnNldCAmPSB+MHgwZjsKKwl9CisKKwlwRENCLT5DdHJsUjEgPSBwQUNCLT5wU2NzaUhvc3QtPnRoaXNfaWQ7CisJaWYgKHBEQ0ItPkRldk1vZGUgJiBQQVJJVFlfQ0hLXykKKwkJcERDQi0+Q3RybFIxIHw9IFBBUklUWV9FUlJfUkVQTzsKKworCXBBQ0ItPnNjYW5fZGV2aWNlcyA9IDE7CisJc2NzaV9kZXZpY2UtPmhvc3RkYXRhID0gcERDQjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkYzM5MF9zbGF2ZV9kZXN0cm95IC0gQ2FsbGVkIGJ5IHRoZSBzY3NpIG1pZCBsYXllciB0byB0ZWxsIHVzIGFib3V0IGEKKyAqIGRldmljZSB0aGF0IGlzIGdvaW5nIGF3YXkuCisgKgorICogQHNjc2lfZGV2aWNlOiBUaGUgc2NzaSBkZXZpY2UgdGhhdCB3ZSBuZWVkIHRvIHJlbW92ZS4KKyAqLworc3RhdGljIHZvaWQgZGMzOTBfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlKQoreworCXN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgPSAoc3RydWN0IGRjMzkwX2FjYiopIHNjc2lfZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgZGMzOTBfZGNiKiBwRENCID0gKHN0cnVjdCBkYzM5MF9kY2IqKSBzY3NpX2RldmljZS0+aG9zdGRhdGE7CisJc3RydWN0IGRjMzkwX2RjYiogcFByZXZEQ0IgPSBwQUNCLT5wTGlua0RDQjsKKworCXBBQ0ItPnNjYW5fZGV2aWNlcyA9IDA7CisKKwlCVUdfT04ocERDQi0+R29pbmdTUkJDbnQgPiAxKTsKKwkKKwlpZiAocERDQiA9PSBwQUNCLT5wTGlua0RDQikgeworCQlpZiAocEFDQi0+cExhc3REQ0IgPT0gcERDQikgeworCQkJcERDQi0+cE5leHREQ0IgPSBOVUxMOworCQkJcEFDQi0+cExhc3REQ0IgPSBOVUxMOworCQl9CisJCXBBQ0ItPnBMaW5rRENCID0gcERDQi0+cE5leHREQ0I7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHBQcmV2RENCLT5wTmV4dERDQiAhPSBwRENCKQorCQkJcFByZXZEQ0IgPSBwUHJldkRDQi0+cE5leHREQ0I7CisJCXBQcmV2RENCLT5wTmV4dERDQiA9IHBEQ0ItPnBOZXh0RENCOworCQlpZiAocERDQiA9PSBwQUNCLT5wTGFzdERDQikKKwkJCXBBQ0ItPnBMYXN0RENCID0gcFByZXZEQ0I7CisJfQorCisJaWYgKHBEQ0IgPT0gcEFDQi0+cEFjdGl2ZURDQikKKwkJcEFDQi0+cEFjdGl2ZURDQiA9IE5VTEw7CisJaWYgKHBEQ0IgPT0gcEFDQi0+cExpbmtEQ0IpCisJCXBBQ0ItPnBMaW5rRENCID0gcERDQi0+cE5leHREQ0I7CisJaWYgKHBEQ0IgPT0gcEFDQi0+cERDQlJ1blJvYmluKQorCQlwQUNCLT5wRENCUnVuUm9iaW4gPSBwRENCLT5wTmV4dERDQjsKKwlrZnJlZShwRENCKTsgCisJCisJcEFDQi0+RENCQ250LS07Cit9CisKK3N0YXRpYyBpbnQgZGMzOTBfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgZGMzOTBfYWNiICphY2IgPSAoc3RydWN0IGRjMzkwX2FjYiAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBkYzM5MF9kY2IgKmRjYiA9IChzdHJ1Y3QgZGMzOTBfZGNiICopc2Rldi0+aG9zdGRhdGE7CisKKwlhY2ItPnNjYW5fZGV2aWNlcyA9IDA7CisJaWYgKHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgJiYgKGRjYi0+RGV2TW9kZSAmIFRBR19RVUVVRUlOR18pKSB7CisJCWRjYi0+U3luY01vZGUgfD0gRU5fVEFHX1FVRVVFSU5HOworCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCBhY2ItPlRhZ01heE51bSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lCQk9ICJ0bXNjc2ltIiwgCisJLm5hbWUJCQk9IERDMzkwX0JBTk5FUiAiIFYiIERDMzkwX1ZFUlNJT04sCisJLnNsYXZlX2FsbG9jCQk9IGRjMzkwX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUJPSBkYzM5MF9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gZGMzOTBfc2xhdmVfZGVzdHJveSwKKwkucXVldWVjb21tYW5kCQk9IERDMzkwX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IERDMzkwX2Fib3J0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IERDMzkwX2J1c19yZXNldCwKKwkuY2FuX3F1ZXVlCQk9IDEsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkuY21kX3Blcl9sdW4JCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMgZm9yIGFjY2VzcyB0byBEQzM5MCBFRVBST00KKyAqIGFuZCBzb21lIHRvIGVtdWxhdGUgaXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGRjMzkwX2VlcHJvbV9wcmVwYXJlX3JlYWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IGNtZCkKK3sKKwl1OCBjYXJyeUZsYWcgPSAxLCBqID0gMHg4MCwgYnZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwkJaWYgKGNhcnJ5RmxhZykgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4ODAsIDB4NDApOworCQkJYnZhbCA9IDB4YzA7CisJCX0gZWxzZQorCQkJYnZhbCA9IDB4ODA7CisKKwkJdWRlbGF5KDE2MCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgwLCBidmFsKTsKKwkJdWRlbGF5KDE2MCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgwLCAwKTsKKwkJdWRlbGF5KDE2MCk7CisKKwkJY2FycnlGbGFnID0gKGNtZCAmIGopID8gMSA6IDA7CisJCWogPj49IDE7CisJfQorfQorCitzdGF0aWMgdTE2IF9fZGV2aW5pdCBkYzM5MF9lZXByb21fZ2V0X2RhdGEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGk7CisJdTE2IHd2YWwgPSAwOworCXU4IGJ2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl3dmFsIDw8PSAxOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgwLCAweDgwKTsKKwkJdWRlbGF5KDE2MCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDgwLCAweDQwKTsKKwkJdWRlbGF5KDE2MCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDAsICZidmFsKTsKKworCQlpZiAoYnZhbCA9PSAweDIyKQorCQkJd3ZhbCB8PSAxOworCX0KKworCXJldHVybiB3dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGMzOTBfcmVhZF9lZXByb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUxNiAqcHRyKQoreworCXU4IGNtZCA9IEVFUFJPTV9SRUFELCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHhjMCwgMCk7CisJCXVkZWxheSgxNjApOworCisJCWRjMzkwX2VlcHJvbV9wcmVwYXJlX3JlYWQocGRldiwgY21kKyspOworCQkqcHRyKysgPSBkYzM5MF9lZXByb21fZ2V0X2RhdGEocGRldik7CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4ODAsIDApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4MCwgMCk7CisJCXVkZWxheSgxNjApOworCX0KK30KKworLyogT3ZlcnJpZGUgRUVwcm9tIHZhbHVlcyB3aXRoIGV4cGxpY2l0bHkgc2V0IHZhbHVlcyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGRjMzkwX2VlcHJvbV9vdmVycmlkZSh1OCBpbmRleCkKK3sKKwl1OCAqcHRyID0gKHU4ICopIGRjMzkwX2VlcHJvbUJ1ZltpbmRleF0sIGlkOworCisJLyogQWRhcHRlciBTZXR0aW5ncyAqLworCWlmICh0bXNjc2ltWzBdICE9IC0yKQorCQlwdHJbRUVfQURBUFRfU0NTSV9JRF0gPSAodTgpdG1zY3NpbVswXTsJLyogQWRhcHRlciBJRCAqLworCWlmICh0bXNjc2ltWzNdICE9IC0yKQorCQlwdHJbRUVfTU9ERTJdID0gKHU4KXRtc2NzaW1bM107CisJaWYgKHRtc2NzaW1bNV0gIT0gLTIpCisJCXB0cltFRV9ERUxBWV0gPSB0bXNjc2ltWzVdOwkJLyogUmVzZXQgZGVsYXkgKi8KKwlpZiAodG1zY3NpbVs0XSAhPSAtMikKKwkJcHRyW0VFX1RBR19DTURfTlVNXSA9ICh1OCl0bXNjc2ltWzRdOwkvKiBUYWdnZWQgQ21kcyAqLworCisJLyogRGV2aWNlIFNldHRpbmdzICovCisJZm9yIChpZCA9IDA7IGlkIDwgTUFYX1NDU0lfSUQ7IGlkKyspIHsKKwkJaWYgKHRtc2NzaW1bMl0gIT0gLTIpCisJCQlwdHJbaWQgPDwgMl0gPSAodTgpdG1zY3NpbVsyXTsJCS8qIEVFX01PREUxICovCisJCWlmICh0bXNjc2ltWzFdICE9IC0yKQorCQkJcHRyWyhpZCA8PCAyKSArIDFdID0gKHU4KXRtc2NzaW1bMV07CS8qIEVFX1NwZWVkICovCisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdG1zY3NpbV9kZWZbXSA9IHsKKwk3LAorCTAgLyogMTBNSHogKi8sCisJUEFSSVRZX0NIS18gfCBTRU5EX1NUQVJUXyB8IEVOX0RJU0NPTk5FQ1RfIHwgU1lOQ19ORUdPXyB8IFRBR19RVUVVRUlOR18sCisJTU9SRTJfRFJWIHwgR1JFQVRFUl8xRyB8IFJTVF9TQ1NJX0JVUyB8IEFDVElWRV9ORUdBVElPTiB8IExVTl9DSEVDSywKKwkzIC8qIDE2IFRhZ3MgcGVyIExVTiAqLywKKwkxIC8qIHMgZGVsYXkgYWZ0ZXIgUmVzZXQgKi8sCit9OworCisvKiBDb3B5IGRlZmF1bHRzIG92ZXIgc2V0IHZhbHVlcyB3aGVyZSBtaXNzaW5nICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGMzOTBfZmlsbF93aXRoX2RlZmF1bHRzICh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAodG1zY3NpbVtpXSA8IDAgfHwgdG1zY3NpbVtpXSA+IDI1NSkKKwkJCXRtc2NzaW1baV0gPSB0bXNjc2ltX2RlZltpXTsKKwl9CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKHRtc2NzaW1bMF0gPiA3KQorCQl0bXNjc2ltWzBdID0gNzsKKwlpZiAodG1zY3NpbVsxXSA+IDcpCisJCXRtc2NzaW1bMV0gPSA0OworCWlmICh0bXNjc2ltWzRdID4gNSkKKwkJdG1zY3NpbVs0XSA9IDQ7CisJaWYgKHRtc2NzaW1bNV0gPiAxODApCisJCXRtc2NzaW1bNV0gPSAxODA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBkYzM5MF9jaGVja19lZXByb20oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IGluZGV4KQoreworCXU4IGludGVycGRbXSA9IHsxLCAzLCA1LCAxMCwgMTYsIDMwLCA2MCwgMTIwfTsKKwl1OCBFRWJ1ZlsxMjhdOworCXUxNiAqcHRyID0gKHUxNiAqKUVFYnVmLCB3dmFsID0gMDsKKwlpbnQgaTsKKworCWRjMzkwX3JlYWRfZWVwcm9tKHBkZXYsIHB0cik7CisJbWVtY3B5KGRjMzkwX2VlcHJvbUJ1ZltpbmRleF0sIEVFYnVmLCBFRV9BREFQVF9TQ1NJX0lEKTsKKwltZW1jcHkoJmRjMzkwX2VlcHJvbUJ1ZltpbmRleF1bRUVfQURBUFRfU0NTSV9JRF0sIAorCSAgICAgICAmRUVidWZbUkVBTF9FRV9BREFQVF9TQ1NJX0lEXSwgRUVfTEVOIC0gRUVfQURBUFRfU0NTSV9JRCk7CisKKwlkYzM5MF9lZXByb21CdWZbaW5kZXhdW0VFX0RFTEFZXSA9IGludGVycGRbZGMzOTBfZWVwcm9tQnVmW2luZGV4XVtFRV9ERUxBWV1dOworCisJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKywgcHRyKyspCisJCXd2YWwgKz0gKnB0cjsKKworCS8qIG5vIFRla3JhbSBFRXByb20gZm91bmQgKi8KKwlpZiAod3ZhbCAhPSAweDEyMzQpIHsKKwkJaW50IHNwZWVkOworCisJCXByaW50ayhLRVJOX0lORk8gIkRDMzkwX2luaXQ6IE5vIEVFUFJPTSBmb3VuZCEgVHJ5aW5nIGRlZmF1bHQgc2V0dGluZ3MgLi4uXG4iKTsKKworCQkvKgorCQkgKiBYWFgoaGNoKTogYm9ndXMsIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSB0ZWtyYW0gYW5kCisJCSAqICAgICAgICAgICBub24tdGVrcmFtIGhiYXMgaW4gYSBzaW5nbGUgbWFjaGluZS4KKwkJICovCisJCWRjMzkwX2ZpbGxfd2l0aF9kZWZhdWx0cygpOworCisJCXNwZWVkID0gZGMzOTBfY2xvY2tfc3BlZWRbdG1zY3NpbVsxXV07CisJCXByaW50ayhLRVJOX0lORk8gIkRDMzkwOiBVc2VkIGRlZmF1bHRzOiBBZGFwdElEPSVpLCBTcGVlZElkeD0laSAoJWkuJWkgTUh6KSwgIgorCQkgICAgICAgIkRldk1vZGU9MHglMDJ4LCBBZGFwdE1vZGU9MHglMDJ4LCBUYWdnZWRDbW5kcz0laSAoJWkpLCBEZWxheVJlc2V0PSVpc1xuIiwgCisJCSAgICAgICB0bXNjc2ltWzBdLCB0bXNjc2ltWzFdLCBzcGVlZCAvIDEwLCBzcGVlZCAlIDEwLAorCQkgICAgICAgKHU4KXRtc2NzaW1bMl0sICh1OCl0bXNjc2ltWzNdLCB0bXNjc2ltWzRdLCAyIDw8ICh0bXNjc2ltWzRdKSwgdG1zY3NpbVs1XSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGMzOTBfaW5pdF9odyhzdHJ1Y3QgZGMzOTBfYWNiICpwQUNCLCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBBQ0ItPnBTY3NpSG9zdDsKKwl1OCBkc3RhdGU7CisKKwkvKiBEaXNhYmxlIFNDU0kgYnVzIHJlc2V0IGludGVycnVwdCAqLworCURDMzkwX3dyaXRlOChDdHJsUmVnMSwgRElTX0lOVF9PTl9TQ1NJX1JTVCB8IHNob3N0LT50aGlzX2lkKTsKKworCWlmIChwQUNCLT5HbW9kZTIgJiBSU1RfU0NTSV9CVVMpIHsKKwkJZGMzOTBfUmVzZXRTQ1NJQnVzKHBBQ0IpOworCQl1ZGVsYXkoMTAwMCk7CisJCXNob3N0LT5sYXN0X3Jlc2V0ID0gamlmZmllcyArIEhaLzIgKworCQkJSFogKiBkYzM5MF9lZXByb21CdWZbcEFDQi0+QWRhcHRlckluZGV4XVtFRV9ERUxBWV07CisJfQorCisJcEFDQi0+QUNCRmxhZyA9IDA7CisKKwkvKiBSZXNldCBQZW5kaW5nIElOVCAqLworCURDMzkwX3JlYWQ4KElOVF9TdGF0dXMpOworCQorCS8qIDI1MG1zIHNlbGVjdGlvbiB0aW1lb3V0ICovCisJREMzOTBfd3JpdGU4KFNjc2lfVGltZU91dCwgU0VMX1RJTUVPVVQpOworCQorCS8qIENvbnZlcnNpb24gZmFjdG9yID0gMCAsIDQwTUh6IGNsb2NrICovCisJREMzOTBfd3JpdGU4KENsa19GYWN0b3IsIENMS19GUkVRXzQwTUhaKTsKKwkKKwkvKiBOT1AgY21kIC0gY2xlYXIgY29tbWFuZCByZWdpc3RlciAqLworCURDMzkwX3dyaXRlOChTY3NpQ21kLCBOT1BfQ01EKTsKKwkKKwkvKiBFbmFibGUgRmVhdHVyZSBhbmQgU0NTSS0yICovCisJREMzOTBfd3JpdGU4KEN0cmxSZWcyLCBFTl9GRUFUVVJFK0VOX1NDU0kyX0NNRCk7CisJCisJLyogRmFzdCBjbG9jayAqLworCURDMzkwX3dyaXRlOChDdHJsUmVnMywgRkFTVF9DTEspOworCisJLyogTmVnYXRpb24gKi8KKwlEQzM5MF93cml0ZTgoQ3RybFJlZzQsIHBBQ0ItPmdsaXRjaF9jZmcgfCAvKiBnbGl0Y2ggZWF0ZXIgKi8KKwkJKGRjMzkwX2VlcHJvbUJ1ZltpbmRleF1bRUVfTU9ERTJdICYgQUNUSVZFX05FR0FUSU9OKSA/CisJCSBORUdBVEVfUkVRQUNLREFUQSA6IDApOworCQorCS8qIENsZWFyIFRyYW5zZmVyIENvdW50IEhpZ2g6IElEICovCisJREMzOTBfd3JpdGU4KEN0Y1JlZ19IaWdoLCAwKTsKKwlEQzM5MF93cml0ZTgoRE1BX0NtZCwgRE1BX0lETEVfQ01EKTsKKwlEQzM5MF93cml0ZTgoU2NzaUNtZCwgQ0xFQVJfRklGT19DTUQpOworCURDMzkwX3dyaXRlMzIoRE1BX1Njc2lCdXNDdHJsLCBFTl9JTlRfT05fUENJX0FCT1JUKTsKKworCWRzdGF0ZSA9IERDMzkwX3JlYWQ4KERNQV9TdGF0dXMpOworCURDMzkwX3dyaXRlOChETUFfU3RhdHVzLCBkc3RhdGUpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYzM5MF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGMzOTBfYWNiICpwQUNCOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDsKKwlpbnQgZXJyb3IgPSAtRU5PREVWLCBpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyb3IgPSAtRU5PTUVNOworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZkcml2ZXJfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgZGMzOTBfYWNiKSk7CisJaWYgKCFzaG9zdCkKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisKKwlwQUNCID0gKHN0cnVjdCBkYzM5MF9hY2IgKilzaG9zdC0+aG9zdGRhdGE7CisJbWVtc2V0KHBBQ0IsIDAsIHNpemVvZihzdHJ1Y3QgZGMzOTBfYWNiKSk7CisKKwlkYzM5MF9jaGVja19lZXByb20ocGRldiwgZGMzOTBfYWRhcHRlckNudCk7CisJZGMzOTBfZWVwcm9tX292ZXJyaWRlKGRjMzkwX2FkYXB0ZXJDbnQpOworCisJaW9fcG9ydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCXNob3N0LT50aGlzX2lkID0gZGMzOTBfZWVwcm9tQnVmW2RjMzkwX2FkYXB0ZXJDbnRdW0VFX0FEQVBUX1NDU0lfSURdOworCXNob3N0LT5pb19wb3J0ID0gaW9fcG9ydDsKKwlzaG9zdC0+bl9pb19wb3J0ID0gMHg4MDsKKwlzaG9zdC0+aXJxID0gcGRldi0+aXJxOworCXNob3N0LT5iYXNlID0gaW9fcG9ydDsKKwlzaG9zdC0+dW5pcXVlX2lkID0gaW9fcG9ydDsKKwlzaG9zdC0+bGFzdF9yZXNldCA9IGppZmZpZXM7CisJCisJcEFDQi0+cFNjc2lIb3N0ID0gc2hvc3Q7CisJcEFDQi0+SU9Qb3J0QmFzZSA9ICh1MTYpIGlvX3BvcnQ7CisJcEFDQi0+SVJRTGV2ZWwgPSBwZGV2LT5pcnE7CisJCisJc2hvc3QtPm1heF9pZCA9IDg7CisKKwlpZiAoc2hvc3QtPm1heF9pZCAtIDEgPT0KKwkgICAgZGMzOTBfZWVwcm9tQnVmW2RjMzkwX2FkYXB0ZXJDbnRdW0VFX0FEQVBUX1NDU0lfSURdKQorCQlzaG9zdC0+bWF4X2lkLS07CisKKwlpZiAoZGMzOTBfZWVwcm9tQnVmW2RjMzkwX2FkYXB0ZXJDbnRdW0VFX01PREUyXSAmIExVTl9DSEVDSykKKwkJc2hvc3QtPm1heF9sdW4gPSA4OworCWVsc2UKKwkJc2hvc3QtPm1heF9sdW4gPSAxOworCisJcEFDQi0+cEZyZWVTUkIgPSBwQUNCLT5TUkJfYXJyYXk7CisJcEFDQi0+U1JCQ291bnQgPSBNQVhfU1JCX0NOVDsKKwlwQUNCLT5BZGFwdGVySW5kZXggPSBkYzM5MF9hZGFwdGVyQ250OworCXBBQ0ItPlRhZ01heE51bSA9CisJCTIgPDwgZGMzOTBfZWVwcm9tQnVmW2RjMzkwX2FkYXB0ZXJDbnRdW0VFX1RBR19DTURfTlVNXTsKKwlwQUNCLT5HbW9kZTIgPSBkYzM5MF9lZXByb21CdWZbZGMzOTBfYWRhcHRlckNudF1bRUVfTU9ERTJdOworCisJZm9yIChpID0gMDsgaSA8IHBBQ0ItPlNSQkNvdW50LTE7IGkrKykKKwkJcEFDQi0+U1JCX2FycmF5W2ldLnBOZXh0U1JCID0gJnBBQ0ItPlNSQl9hcnJheVtpKzFdOworCXBBQ0ItPlNSQl9hcnJheVtwQUNCLT5TUkJDb3VudC0xXS5wTmV4dFNSQiA9IE5VTEw7CisJcEFDQi0+cFRtcFNSQiA9ICZwQUNCLT5UbXBTUkI7CisKKwlwQUNCLT5zZWxfdGltZW91dCA9IFNFTF9USU1FT1VUOworCXBBQ0ItPmdsaXRjaF9jZmcgPSBFQVRFUl8yNU5TOworCXBBQ0ItPnBkZXYgPSBwZGV2OworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0LCAidG1zY3NpbSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiREMzOTA6IHJlZ2lzdGVyIElPIHBvcnRzIGVycm9yIVxuIik7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKworCS8qIFJlc2V0IFBlbmRpbmcgSU5UICovCisJREMzOTBfcmVhZDhfKElOVF9TdGF0dXMsIGlvX3BvcnQpOworCisJaWYgKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgZG9fREMzOTBfSW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCQkidG1zY3NpbSIsIHBBQ0IpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiREMzOTA6IHJlZ2lzdGVyIElSUSBlcnJvciFcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlkYzM5MF9pbml0X2h3KHBBQ0IsIGRjMzkwX2FkYXB0ZXJDbnQpOworCQorCWRjMzkwX2FkYXB0ZXJDbnQrKzsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBzaG9zdCk7CisKKwllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsICZwZGV2LT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJc2NzaV9zY2FuX2hvc3Qoc2hvc3QpOworCXJldHVybiAwOworCisgb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgcEFDQik7Cisgb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworIG91dF9ob3N0X3B1dDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKyBvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZGMzOTBfcmVtb3ZlX29uZSAtIENhbGxlZCB0byByZW1vdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCisgKgorICogQGRldjogVGhlIFBDSSBkZXZpY2UgdG8gcmVtb3ZlLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGMzOTBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgaWZsYWdzOworCXN0cnVjdCBkYzM5MF9hY2IqIHBBQ0IgPSAoc3RydWN0IGRjMzkwX2FjYiopIHNjc2lfaG9zdC0+aG9zdGRhdGE7CisJdTggYnZhbDsKKworCXNjc2lfcmVtb3ZlX2hvc3Qoc2NzaV9ob3N0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNjc2lfaG9zdC0+aG9zdF9sb2NrLCBpZmxhZ3MpOworCXBBQ0ItPkFDQkZsYWcgPSBSRVNFVF9ERVY7CisJYnZhbCA9IERDMzkwX3JlYWQ4KEN0cmxSZWcxKSB8IERJU19JTlRfT05fU0NTSV9SU1Q7CisJREMzOTBfd3JpdGU4IChDdHJsUmVnMSwgYnZhbCk7CS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJaWYgKHBBQ0ItPkdtb2RlMiAmIFJTVF9TQ1NJX0JVUykKKwkJZGMzOTBfUmVzZXRTQ1NJQnVzKHBBQ0IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NzaV9ob3N0LT5ob3N0X2xvY2ssIGlmbGFncyk7CisKKwlmcmVlX2lycShzY3NpX2hvc3QtPmlycSwgcEFDQik7CisJcmVsZWFzZV9yZWdpb24oc2NzaV9ob3N0LT5pb19wb3J0LCBzY3NpX2hvc3QtPm5faW9fcG9ydCk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlzY3NpX2hvc3RfcHV0KHNjc2lfaG9zdCk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0bXNjc2ltX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRDUzQzk3NCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0bXNjc2ltX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGMzOTBfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9ICJ0bXNjc2ltIiwKKwkuaWRfdGFibGUgICAgICAgPSB0bXNjc2ltX3BjaV90YmwsCisJLnByb2JlICAgICAgICAgID0gZGMzOTBfcHJvYmVfb25lLAorCS5yZW1vdmUgICAgICAgICA9IF9fZGV2ZXhpdF9wKGRjMzkwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGMzOTBfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpZiAodG1zY3NpbVswXSA9PSAtMSB8fCB0bXNjc2ltWzBdID4gMTUpIHsKKwkJdG1zY3NpbVswXSA9IDc7CisJCXRtc2NzaW1bMV0gPSA0OworCQl0bXNjc2ltWzJdID0gUEFSSVRZX0NIS18gfCBUQUdfUVVFVUVJTkdfOworCQl0bXNjc2ltWzNdID0gTU9SRTJfRFJWIHwgR1JFQVRFUl8xRyB8IFJTVF9TQ1NJX0JVUyB8IEFDVElWRV9ORUdBVElPTjsKKwkJdG1zY3NpbVs0XSA9IDI7CisJCXRtc2NzaW1bNV0gPSAxMDsKKwkJcHJpbnRrIChLRVJOX0lORk8gIkRDMzkwOiBVc2luZyBzYWZlIHNldHRpbmdzLlxuIik7CisJfQorCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZGMzOTBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRjMzkwX21vZHVsZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkYzM5MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkYzM5MF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChkYzM5MF9tb2R1bGVfZXhpdCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBkYzM5MF9zZXR1cCAoY2hhciAqc3RyKQorewkKKwlpbnQgaW50c1s4XSxpLCBpbTsKKworCWdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJaW0gPSBpbnRzWzBdOworCisJaWYgKGltID4gNikgeworCQlwcmludGsgKEtFUk5fTk9USUNFICJEQzM5MDogaWdub3JlIGV4dHJhIHBhcmFtcyFcbiIpOworCQlpbSA9IDY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGltOyBpKyspCisJCXRtc2NzaW1baV0gPSBpbnRzW2krMV07CisJLyogZGMzOTBfY2hlY2twYXJhbXMgKCk7ICovCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInRtc2NzaW09IiwgZGMzOTBfc2V0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdG1zY3NpbS5oIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ5NTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uaApAQCAtMCwwICsxLDU2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KglGaWxlIE5hbWUgOiBUTVNDU0lNLkgJCQkJCSAgICAgICAqCis7KgkJICAgIFRFS1JBTSBEQy0zOTAoVCkgUENJIFNDU0kgQnVzIE1hc3RlciBIb3N0IEFkYXB0ZXIgICoKKzsqCQkgICAgRGV2aWNlIERyaXZlcgkJCQkgICAgICAgKgorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJElkOiB0bXNjc2ltLmgsdiAyLjE1LjIuMyAyMDAwLzExLzE3IDIwOjUyOjI3IGdhcmxvZmYgRXhwICQgKi8KKworI2lmbmRlZiBfVE1TQ1NJTV9ICisjZGVmaW5lIF9UTVNDU0lNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNkZWZpbmUgU0NTSV9JUlFfTk9ORSAyNTUKKworI2RlZmluZSBNQVhfQURBUFRFUl9OVU0gCTQKKyNkZWZpbmUgTUFYX1NHX0xJU1RfQlVGIAkxNgkvKiBOb3QgdXNlZCAqLworI2RlZmluZSBNQVhfU0NTSV9JRAkJOAorI2RlZmluZSBNQVhfU1JCX0NOVAkJNTAJLyogTWF4IG51bWJlciBvZiBzdGFydGVkIGNvbW1hbmRzICovCisKKyNkZWZpbmUgU0VMX1RJTUVPVVQJCTE1MwkvKiAyNTAgbXMgc2VsZWN0aW9uIHRpbWVvdXQgKEAgNDAgTUh6KSAqLworCisjZGVmaW5lIHBjaV9kbWFfbG8zMihhKQkJCShhICYgMHhmZmZmZmZmZikKKwordHlwZWRlZiB1OAkJVUNIQVI7CS8qICA4IGJpdHMgKi8KK3R5cGVkZWYgdTE2CQlVU0hPUlQ7CS8qIDE2IGJpdHMgKi8KK3R5cGVkZWYgdTMyCQlVSU5UOwkvKiAzMiBiaXRzICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJVUxPTkc7CS8qIDMyLzY0IGJpdHMgKi8KKworCisvKgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNDU0kgUmVxdWVzdCBCbG9jaworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RydWN0IGRjMzkwX3NyYgoreworLy91OAkJQ21kQmxvY2tbMTJdOworCitzdHJ1Y3QgZGMzOTBfc3JiCSpwTmV4dFNSQjsKK3N0cnVjdCBkYzM5MF9kY2IJKnBTUkJEQ0I7CitzdHJ1Y3Qgc2NzaV9jbW5kCSpwY21kOworc3RydWN0IHNjYXR0ZXJsaXN0CSpwU2VnbWVudExpc3Q7CisKK3N0cnVjdCBzY2F0dGVybGlzdCBTZWdtZW50eDsJLyogbWFrZSBhIG9uZSBlbnRyeSBvZiBTL0cgbGlzdCB0YWJsZSAqLworCit1bnNpZ25lZCBsb25nCVNHQnVzQWRkcjsJLyo7YSBzZWdtZW50IHN0YXJ0aW5nIGFkZHJlc3MgYXMgc2VlbiBieSBBTTUzQzk3NEEqLwordW5zaWduZWQgbG9uZwlTR1RvQmVYZmVyTGVuOwkvKjsgdG8gYmUgeGZlciBsZW5ndGggKi8KK3Vuc2lnbmVkIGxvbmcJVG90YWxYZmVycmVkTGVuOwordW5zaWduZWQgbG9uZwlTYXZlZFRvdFhMZW47Cit1bnNpZ25lZCBsb25nCVNhdmVkX1B0cjsKK3UzMgkJU1JCU3RhdGU7CisKK3U4CQlTUkJTdGF0dXM7Cit1OAkJU1JCRmxhZzsJLyo7IGIwLUF1dG9SZXFTZW5zZSxiNi1SZWFkLGI3LXdyaXRlICovCisJCQkJLyo7IGI0LXNldHRpbWVvdXQsYjUtUmVzaWR1YWwgdmFsaWQgKi8KK3U4CQlBZGFwdFN0YXR1czsKK3U4CQlUYXJnZXRTdGF0dXM7CisKK3U4CQlTY3NpUGhhc2U7CitzOAkJVGFnTnVtYmVyOwordTgJCVNHSW5kZXg7Cit1OAkJU0djb3VudDsKKwordTgJCU1zZ0NudDsKK3U4CQlFbmRNZXNzYWdlOwordTgJCVNhdmVkU0dDb3VudDsJCQkKKwordTgJCU1zZ0luQnVmWzZdOwordTgJCU1zZ091dEJ1Zls2XTsKKworLy91OAkJSU9SQkZsYWc7CS8qOzgxaC1SZXNldCwgMi1yZXRyeSAqLworfTsKKworCisvKgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERldmljZSBDb250cm9sIEJsb2NrCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdHJ1Y3QgZGMzOTBfZGNiCit7CitzdHJ1Y3QgZGMzOTBfZGNiCSpwTmV4dERDQjsKK3N0cnVjdCBkYzM5MF9hY2IJKnBEQ0JBQ0I7CisKKy8qIFF1ZXVlZCBTUkJzICovCitzdHJ1Y3QgZGMzOTBfc3JiCSpwR29pbmdTUkI7CitzdHJ1Y3QgZGMzOTBfc3JiCSpwR29pbmdMYXN0Oworc3RydWN0IGRjMzkwX3NyYgkqcEFjdGl2ZVNSQjsKK3U4CQlHb2luZ1NSQkNudDsKKwordTMyCQlUYWdNYXNrOworCit1OAkJVGFyZ2V0SUQ7CS8qOyBTQ1NJIFRhcmdldCBJRCAgKFNDU0kgT25seSkgKi8KK3U4CQlUYXJnZXRMVU47CS8qOyBTQ1NJIExvZy4gIFVuaXQgKFNDU0kgT25seSkgKi8KK3U4CQlEZXZNb2RlOwordTgJCURDQkZsYWc7CisKK3U4CQlDdHJsUjE7Cit1OAkJQ3RybFIzOwordTgJCUN0cmxSNDsKKwordTgJCVN5bmNNb2RlOwkvKjsgMDphc3luYyBtb2RlICovCit1OAkJTmVnb1BlcmlvZDsJLyo7Zm9yIG5lZ28uICovCit1OAkJU3luY1BlcmlvZDsJLyo7Zm9yIHJlZy4gKi8KK3U4CQlTeW5jT2Zmc2V0OwkvKjtmb3IgcmVnLiBhbmQgbmVnby4obG93IG5pYmJsZSkgKi8KK307CisKKworLyoKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBBZGFwdGVyIENvbnRyb2wgQmxvY2sKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0cnVjdCBkYzM5MF9hY2IKK3sKK3N0cnVjdCBTY3NpX0hvc3QgKnBTY3NpSG9zdDsKK3UxNgkJSU9Qb3J0QmFzZTsKK3U4CQlJUlFMZXZlbDsKK3U4CQlzdGF0dXM7CisKK3U4CQlTUkJDb3VudDsKK3U4CQlBZGFwdGVySW5kZXg7CS8qOyBudGggQWRhcHRlciB0aGlzIGRyaXZlciAqLwordTgJCURDQkNudDsKKwordTgJCVRhZ01heE51bTsKK3U4CQlBQ0JGbGFnOwordTgJCUdtb2RlMjsKK3U4CQlzY2FuX2RldmljZXM7CisKK3N0cnVjdCBkYzM5MF9kY2IJKnBMaW5rRENCOworc3RydWN0IGRjMzkwX2RjYgkqcExhc3REQ0I7CitzdHJ1Y3QgZGMzOTBfZGNiCSpwRENCUnVuUm9iaW47CisKK3N0cnVjdCBkYzM5MF9kY2IJKnBBY3RpdmVEQ0I7CitzdHJ1Y3QgZGMzOTBfc3JiCSpwRnJlZVNSQjsKK3N0cnVjdCBkYzM5MF9zcmIJKnBUbXBTUkI7CisKK3U4CQltc2dpbjEyM1s0XTsKK3U4CQlDb25uZWN0ZWQ7Cit1OAkJcGFkOworCisjaWYgZGVmaW5lZChVU0VfU1BJTkxPQ0tTKSAmJiBVU0VfU1BJTkxPQ0tTID4gMSAmJiAoZGVmaW5lZChDT05GSUdfU01QKSB8fCBERUJVR19TUElOTE9DS1MgPiAwKQorc3BpbmxvY2tfdAlsb2NrOworI2VuZGlmCit1OAkJc2VsX3RpbWVvdXQ7Cit1OAkJZ2xpdGNoX2NmZzsKKwordTgJCU1zZ0xlbjsKK3U4CQlJZ25vcmVfSVJROwkvKiBOb3QgdXNlZCAqLworCitzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKwordW5zaWduZWQgbG9uZwlDbWRzOwordTMyCQlTZWxMb3N0OwordTMyCQlTZWxDb25uOwordTMyCQlDbWRJblE7Cit1MzIJCUNtZE91dE9mU1JCOworCitzdHJ1Y3QgZGMzOTBfc3JiCVRtcFNSQjsKK3N0cnVjdCBkYzM5MF9zcmIJU1JCX2FycmF5W01BWF9TUkJfQ05UXTsgCS8qIDUwIFNSQnMgKi8KK307CisKKworLyo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNkZWZpbmUgQklUMzEJMHg4MDAwMDAwMAorI2RlZmluZSBCSVQzMAkweDQwMDAwMDAwCisjZGVmaW5lIEJJVDI5CTB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMjgJMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyNwkweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI2CTB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjUJMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNAkweDAxMDAwMDAwCisjZGVmaW5lIEJJVDIzCTB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjIJMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMQkweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIwCTB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMTkJMHgwMDA4MDAwMAorI2RlZmluZSBCSVQxOAkweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE3CTB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTYJMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNQkweDAwMDA4MDAwCisjZGVmaW5lIEJJVDE0CTB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTMJMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxMgkweDAwMDAxMDAwCisjZGVmaW5lIEJJVDExCTB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTAJMHgwMDAwMDQwMAorI2RlZmluZSBCSVQ5CTB4MDAwMDAyMDAKKyNkZWZpbmUgQklUOAkweDAwMDAwMTAwCisjZGVmaW5lIEJJVDcJMHgwMDAwMDA4MAorI2RlZmluZSBCSVQ2CTB4MDAwMDAwNDAKKyNkZWZpbmUgQklUNQkweDAwMDAwMDIwCisjZGVmaW5lIEJJVDQJMHgwMDAwMDAxMAorI2RlZmluZSBCSVQzCTB4MDAwMDAwMDgKKyNkZWZpbmUgQklUMgkweDAwMDAwMDA0CisjZGVmaW5lIEJJVDEJMHgwMDAwMDAwMgorI2RlZmluZSBCSVQwCTB4MDAwMDAwMDEKKworLyo7LS0tVW5pdEN0cmxGbGFnICovCisjZGVmaW5lIFVOSVRfQUxMT0NBVEVECUJJVDAKKyNkZWZpbmUgVU5JVF9JTkZPX0NIQU5HRUQgQklUMQorI2RlZmluZSBGT1JNQVRJTkdfTUVESUEgQklUMgorI2RlZmluZSBVTklUX1JFVFJZCUJJVDMKKworLyo7LS0tVW5pdEZsYWdzICovCisjZGVmaW5lIERBU0RfU1VQUE9SVAlCSVQwCisjZGVmaW5lIFNDU0lfU1VQUE9SVAlCSVQxCisjZGVmaW5lIEFTUElfU1VQUE9SVAlCSVQyCisKKy8qOy0tLS1TUkJTdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgU1JCX0ZSRUUJMAorI2RlZmluZSBTUkJfV0FJVAlCSVQwCisjZGVmaW5lIFNSQl9SRUFEWQlCSVQxCisjZGVmaW5lIFNSQl9NU0dPVVQJQklUMgkvKjthcmJpdHJhdGlvbittc2dfb3V0IDFzdCBieXRlKi8KKyNkZWZpbmUgU1JCX01TR0lOCUJJVDMKKyNkZWZpbmUgU1JCX01TR0lOX01VTFRJIEJJVDQKKyNkZWZpbmUgU1JCX0NPTU1BTkQJQklUNQorI2RlZmluZSBTUkJfU1RBUlRfCUJJVDYJLyo7YXJiaXRyYXRpb24rbXNnX291dCtjb21tYW5kX291dCovCisjZGVmaW5lIFNSQl9ESVNDT05ORUNUCUJJVDcKKyNkZWZpbmUgU1JCX0RBVEFfWEZFUglCSVQ4CisjZGVmaW5lIFNSQl9YRkVSUEFECUJJVDkKKyNkZWZpbmUgU1JCX1NUQVRVUwlCSVQxMAorI2RlZmluZSBTUkJfQ09NUExFVEVECUJJVDExCisjZGVmaW5lIFNSQl9BQk9SVF9TRU5UCUJJVDEyCisjZGVmaW5lIERPX1NZTkNfTkVHTwlCSVQxMworI2RlZmluZSBTUkJfVU5FWFBFQ1RfUkVTRUwgQklUMTQKKworLyo7LS0tU1JCc3RhdHVzICovCisjZGVmaW5lIFNSQl9PSwkJQklUMAorI2RlZmluZSBBQk9SVElPTglCSVQxCisjZGVmaW5lIE9WRVJfUlVOCUJJVDIKKyNkZWZpbmUgVU5ERVJfUlVOCUJJVDMKKyNkZWZpbmUgUEFSSVRZX0VSUk9SCUJJVDQKKyNkZWZpbmUgU1JCX0VSUk9SCUJJVDUKKworLyo7LS0tQUNCRmxhZyAqLworI2RlZmluZSBSRVNFVF9ERVYJQklUMAorI2RlZmluZSBSRVNFVF9ERVRFQ1QJQklUMQorI2RlZmluZSBSRVNFVF9ET05FCUJJVDIKKworLyo7LS0tRENCRmxhZyAqLworI2RlZmluZSBBQk9SVF9ERVZfCUJJVDAKKworLyo7LS0tU1JCRmxhZyAqLworI2RlZmluZSBEQVRBT1VUIAlCSVQ3CisjZGVmaW5lIERBVEFJTgkJQklUNgorI2RlZmluZSBSRVNJRFVBTF9WQUxJRAlCSVQ1CisjZGVmaW5lIEVOQUJMRV9USU1FUglCSVQ0CisjZGVmaW5lIFJFU0VUX0RFVjAJQklUMgorI2RlZmluZSBBQk9SVF9ERVYJQklUMQorI2RlZmluZSBBVVRPX1JFUVNFTlNFCUJJVDAKKworLyo7LS0tQWRhcHRlciBzdGF0dXMgKi8KKyNkZWZpbmUgSF9TVEFUVVNfR09PRAkgMAorI2RlZmluZSBIX1NFTF9USU1FT1VUCSAweDExCisjZGVmaW5lIEhfT1ZFUl9VTkRFUl9SVU4gMHgxMgorI2RlZmluZSBIX1VORVhQX0JVU19GUkVFIDB4MTMKKyNkZWZpbmUgSF9UQVJHRVRfUEhBU0VfRiAweDE0CisjZGVmaW5lIEhfSU5WQUxJRF9DQ0JfT1AgMHgxNgorI2RlZmluZSBIX0xJTktfQ0NCX0JBRAkgMHgxNworI2RlZmluZSBIX0JBRF9UQVJHRVRfRElSIDB4MTgKKyNkZWZpbmUgSF9EVVBMSUNBVEVfQ0NCICAweDE5CisjZGVmaW5lIEhfQkFEX0NDQl9PUl9TRyAgMHgxQQorI2RlZmluZSBIX0FCT1JUIAkgMHgwRkYKKworLyo7IFNDU0kgU3RhdHVzIGJ5dGUgY29kZXMqLyAKKy8qIFRoZSB2YWx1ZXMgZGVmaW5lZCBpbiBpbmNsdWRlL3Njc2kvc2NzaS5oLCB0byBiZSBzaGlmdGVkIDw8IDEgKi8KKworI2RlZmluZSBTQ1NJX1NUQVRfVU5FWFBfQlVTX0YJMHhGRAkvKjsgIFVuZXhwZWN0IEJ1cyBGcmVlICovCisjZGVmaW5lIFNDU0lfU1RBVF9CVVNfUlNUX0RFVEVDVCAweEZFCS8qOyAgU2NzaSBCdXMgUmVzZXQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgU0NTSV9TVEFUX1NFTF9USU1FT1VUCTB4RkYJLyo7ICBTZWxlY3Rpb24gVGltZSBvdXQgKi8KKworLyogY21kLT5yZXN1bHQgKi8KKyNkZWZpbmUgUkVTX1RBUkdFVAkJMHgwMDAwMDBGRgkvKiBUYXJnZXQgU3RhdGUgKi8KKyNkZWZpbmUgUkVTX1RBUkdFVF9MTlgJCVNUQVRVU19NQVNLCS8qIE9ubHkgb2ZmaWNpYWwgLi4uICovCisjZGVmaW5lIFJFU19FTkRNU0cJCTB4MDAwMEZGMDAJLyogRW5kIE1lc3NhZ2UgKi8KKyNkZWZpbmUgUkVTX0RJRAkJCTB4MDBGRjAwMDAJLyogRElEXyBjb2RlcyAqLworI2RlZmluZSBSRVNfRFJWCQkJMHhGRjAwMDAwMAkvKiBEUklWRVJfIGNvZGVzICovCisKKyNkZWZpbmUgTUtfUkVTKGRydixkaWQsbXNnLHRndCkgKChpbnQpKGRydik8PDI0IHwgKGludCkoZGlkKTw8MTYgfCAoaW50KShtc2cpPDw4IHwgKGludCkodGd0KSkKKyNkZWZpbmUgTUtfUkVTX0xOWChkcnYsZGlkLG1zZyx0Z3QpICgoaW50KShkcnYpPDwyNCB8IChpbnQpKGRpZCk8PDE2IHwgKGludCkobXNnKTw8OCB8IChpbnQpKHRndCk8PDEpCisKKyNkZWZpbmUgU0VUX1JFU19UQVJHRVQod2hvLCB0Z3QpIGRvIHsgd2hvICY9IH5SRVNfVEFSR0VUOyB3aG8gfD0gKGludCkodGd0KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgU0VUX1JFU19UQVJHRVRfTE5YKHdobywgdGd0KSBkbyB7IHdobyAmPSB+UkVTX1RBUkdFVF9MTlg7IHdobyB8PSAoaW50KSh0Z3QpIDw8IDE7IH0gd2hpbGUgKDApCisjZGVmaW5lIFNFVF9SRVNfTVNHKHdobywgbXNnKSBkbyB7IHdobyAmPSB+UkVTX0VORE1TRzsgd2hvIHw9IChpbnQpKG1zZykgPDwgODsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgU0VUX1JFU19ESUQod2hvLCBkaWQpIGRvIHsgd2hvICY9IH5SRVNfRElEOyB3aG8gfD0gKGludCkoZGlkKSA8PCAxNjsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgU0VUX1JFU19EUlYod2hvLCBkcnYpIGRvIHsgd2hvICY9IH5SRVNfRFJWOyB3aG8gfD0gKGludCkoZHJ2KSA8PCAyNDsgfSB3aGlsZSAoMCkKKworLyo7LS0tU3luY19Nb2RlICovCisjZGVmaW5lIFNZTkNfRElTQUJMRQkwCisjZGVmaW5lIFNZTkNfRU5BQkxFCUJJVDAKKyNkZWZpbmUgU1lOQ19ORUdPX0RPTkUJQklUMQorI2RlZmluZSBXSURFX0VOQUJMRQlCSVQyCS8qIE5vdCB1c2VkIDstKSAqLworI2RlZmluZSBXSURFX05FR09fRE9ORQlCSVQzCS8qIE5vdCB1c2VkIDstKSAqLworI2RlZmluZSBFTl9UQUdfUVVFVUVJTkcJQklUNAorI2RlZmluZSBFTl9BVE5fU1RPUAlCSVQ1CisKKyNkZWZpbmUgU1lOQ19ORUdPX09GRlNFVCAxNQorCisvKjstLS1TQ1NJIGJ1cyBwaGFzZSovCisjZGVmaW5lIFNDU0lfREFUQV9PVVQJMAorI2RlZmluZSBTQ1NJX0RBVEFfSU4JMQorI2RlZmluZSBTQ1NJX0NPTU1BTkQJMgorI2RlZmluZSBTQ1NJX1NUQVRVU18JMworI2RlZmluZSBTQ1NJX05PUDAJNAorI2RlZmluZSBTQ1NJX05PUDEJNQorI2RlZmluZSBTQ1NJX01TR19PVVQJNgorI2RlZmluZSBTQ1NJX01TR19JTgk3CisKKy8qOy0tLS1TQ1NJIE1TRyBCWVRFKi8gLyogc2VlIHNjc2kvc2NzaS5oICovIC8qIE9uZSBpcyBtaXNzaW5nICEgKi8KKyNkZWZpbmUgQUJPUlRfVEFHCTB4MGQKKworLyoKKyAqCVNJU0MgcXVlcnkgcXVldWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWRtYV9hZGRyX3QJCXNhdmVkX2RtYV9oYW5kbGU7Cit9IGRjMzkwX2NtZF9zY3BfdDsKKworLyoKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7IEVFUFJPTSBieXRlIG9mZnNldAorOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit0eXBlZGVmICBzdHJ1Y3QgIF9FRXByb20KK3sKK3U4CUVFX01PREUxOwordTgJRUVfU1BFRUQ7Cit1OAl4eDE7Cit1OAl4eDI7Cit9IEVFcHJvbSwgKlBFRXByb207CisKKyNkZWZpbmUgUkVBTF9FRV9BREFQVF9TQ1NJX0lEIDY0CisjZGVmaW5lIFJFQUxfRUVfTU9ERTIJNjUKKyNkZWZpbmUgUkVBTF9FRV9ERUxBWQk2NgorI2RlZmluZSBSRUFMX0VFX1RBR19DTURfTlVNCTY3CisKKyNkZWZpbmUgRUVfQURBUFRfU0NTSV9JRCAzMgorI2RlZmluZSBFRV9NT0RFMgkzMworI2RlZmluZSBFRV9ERUxBWQkzNAorI2RlZmluZSBFRV9UQUdfQ01EX05VTQkzNQorCisjZGVmaW5lIEVFX0xFTgkJNDAKKworLyo7IEVFX01PREUxIGJpdHMgZGVmaW5pdGlvbiovCisjZGVmaW5lIFBBUklUWV9DSEtfCUJJVDAKKyNkZWZpbmUgU1lOQ19ORUdPXwlCSVQxCisjZGVmaW5lIEVOX0RJU0NPTk5FQ1RfCUJJVDIKKyNkZWZpbmUgU0VORF9TVEFSVF8JQklUMworI2RlZmluZSBUQUdfUVVFVUVJTkdfCUJJVDQKKworLyo7IEVFX01PREUyIGJpdHMgZGVmaW5pdGlvbiovCisjZGVmaW5lIE1PUkUyX0RSVglCSVQwCisjZGVmaW5lIEdSRUFURVJfMUcJQklUMQorI2RlZmluZSBSU1RfU0NTSV9CVVMJQklUMgorI2RlZmluZSBBQ1RJVkVfTkVHQVRJT04gQklUMworI2RlZmluZSBOT19TRUVLIAlCSVQ0CisjZGVmaW5lIExVTl9DSEVDSwlCSVQ1CisKKyNkZWZpbmUgRU5BQkxFX0NFCTEKKyNkZWZpbmUgRElTQUJMRV9DRQkwCisjZGVmaW5lIEVFUFJPTV9SRUFECTB4ODAKKworLyoKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7CUFNRCA1M0M5NzQgUmVnaXN0ZXJzIGJpdCBEZWZpbml0aW9uCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8qCis7PT09PT09PT09PT09PT09PT09PT0KKzsgU0NTSSBSZWdpc3RlcgorOz09PT09PT09PT09PT09PT09PT09CisqLworCisvKjsgQ29tbWFuZCBSZWcuKCswQ0gpIChydykgKi8KKyNkZWZpbmUgRE1BX0NPTU1BTkQJCUJJVDcKKyNkZWZpbmUgTk9QX0NNRCAJCTAKKyNkZWZpbmUgQ0xFQVJfRklGT19DTUQJCTEKKyNkZWZpbmUgUlNUX0RFVklDRV9DTUQJCTIKKyNkZWZpbmUgUlNUX1NDU0lfQlVTX0NNRAkzCisKKyNkZWZpbmUgSU5GT19YRkVSX0NNRAkJMHgxMAorI2RlZmluZSBJTklUSUFUT1JfQ01EX0NNUExURQkweDExCisjZGVmaW5lIE1TR19BQ0NFUFRFRF9DTUQJMHgxMgorI2RlZmluZSBYRkVSX1BBRF9CWVRFCQkweDE4CisjZGVmaW5lIFNFVF9BVE5fQ01ECQkweDFBCisjZGVmaW5lIFJFU0VUX0FUTl9DTUQJCTB4MUIKKworI2RlZmluZSBTRUxfV09fQVROCQkweDQxCS8qIGN1cnJlbnRseSBub3QgdXNlZCAqLworI2RlZmluZSBTRUxfV19BVE4JCTB4NDIKKyNkZWZpbmUgU0VMX1dfQVROX1NUT1AJCTB4NDMKKyNkZWZpbmUgU0VMX1dfQVROMwkJMHg0NgorI2RlZmluZSBFTl9TRUxfUkVTRUwJCTB4NDQKKyNkZWZpbmUgRElTX1NFTF9SRVNFTAkJMHg0NQkvKiBjdXJyZW50bHkgbm90IHVzZWQgKi8KKyNkZWZpbmUgUkVTRUwJCQkweDQwCS8qICIgKi8KKyNkZWZpbmUgUkVTRUxfQVROMwkJMHg0NwkvKiAiICovCisKKyNkZWZpbmUgREFUQV9YRkVSX0NNRAkJSU5GT19YRkVSX0NNRAorCisKKy8qOyBTQ1NJIFN0YXR1cyBSZWcuKCsxMEgpIChyKSAqLworI2RlZmluZSBJTlRFUlJVUFQJCUJJVDcKKyNkZWZpbmUgSUxMRUdBTF9PUF9FUlIJCUJJVDYKKyNkZWZpbmUgUEFSSVRZX0VSUgkJQklUNQorI2RlZmluZSBDT1VOVF8yX1pFUk8JCUJJVDQKKyNkZWZpbmUgR1JPVVBfQ09ERV9WQUxJRAlCSVQzCisjZGVmaW5lIFNDU0lfUEhBU0VfTUFTSyAJKEJJVDIrQklUMStCSVQwKSAKKy8qIEJJVDI6IE1TRyBwaGFzZTsgQklUMTogQy9EIHBoeXNlOyBCSVQwOiBJL08gcGhhc2UgKi8KKworLyo7IEludGVycnVwdCBTdGF0dXMgUmVnLigrMTRIKSAocikgKi8KKyNkZWZpbmUgU0NTSV9SRVNFVAkJQklUNworI2RlZmluZSBJTlZBTElEX0NNRAkJQklUNgorI2RlZmluZSBESVNDT05ORUNURUQJCUJJVDUKKyNkZWZpbmUgU0VSVklDRV9SRVFVRVNUIAlCSVQ0CisjZGVmaW5lIFNVQ0NFU1NGVUxfT1AJCUJJVDMKKyNkZWZpbmUgUkVTRUxFQ1RFRAkJQklUMgorI2RlZmluZSBTRUxfQVRURU5USU9OCQlCSVQxCisjZGVmaW5lIFNFTEVDVEVECQlCSVQwCisKKy8qOyBJbnRlcm5hbCBTdGF0ZSBSZWcuKCsxOEgpIChyKSAqLworI2RlZmluZSBTWU5DX09GRlNFVF9GTEFHCUJJVDMKKyNkZWZpbmUgSU5UUk5fU1RBVEVfTUFTSwkoQklUMitCSVQxK0JJVDApCisvKiAweDA0OiBTZWwuIHN1Y2Nlc3NmdWwgKHcvbyBzdG9wKSwgMHgwMTogU2VsLiBzdWNjZXNzZnVsICh3LyBzdG9wKSAqLworCisvKjsgQ2xvY2sgRmFjdG9yIFJlZy4oKzI0SCkgKHcpICovCisjZGVmaW5lIENMS19GUkVRXzQwTUhaCQkwCisjZGVmaW5lIENMS19GUkVRXzM1TUhaCQkoQklUMitCSVQxK0JJVDApCisjZGVmaW5lIENMS19GUkVRXzMwTUhaCQkoQklUMitCSVQxKQorI2RlZmluZSBDTEtfRlJFUV8yNU1IWgkJKEJJVDIrQklUMCkKKyNkZWZpbmUgQ0xLX0ZSRVFfMjBNSFoJCUJJVDIKKyNkZWZpbmUgQ0xLX0ZSRVFfMTVNSFoJCShCSVQxK0JJVDApCisjZGVmaW5lIENMS19GUkVRXzEwTUhaCQlCSVQxCisKKy8qOyBDb250cm9sIFJlZy4gMSgrMjBIKSAocncpICovCisjZGVmaW5lIEVYVEVOREVEX1RJTUlORyAJQklUNworI2RlZmluZSBESVNfSU5UX09OX1NDU0lfUlNUCUJJVDYKKyNkZWZpbmUgUEFSSVRZX0VSUl9SRVBPIAlCSVQ0CisjZGVmaW5lIFNDU0lfSURfT05fQlVTCQkoQklUMitCSVQxK0JJVDApIC8qIGhvc3QgYWRhcHRlciBJRCAqLworCisvKjsgQ29udHJvbCBSZWcuIDIoKzJDSCkgKHJ3KSAqLworI2RlZmluZSBFTl9GRUFUVVJFCQlCSVQ2CisjZGVmaW5lIEVOX1NDU0kyX0NNRAkJQklUMworCisvKjsgQ29udHJvbCBSZWcuIDMoKzMwSCkgKHJ3KSAqLworI2RlZmluZSBJRF9NU0dfQ0hFQ0sJCUJJVDcKKyNkZWZpbmUgRU5fUVRBR19NU0cJCUJJVDYKKyNkZWZpbmUgRU5fR1JQMl9DTUQJCUJJVDUKKyNkZWZpbmUgRkFTVF9TQ1NJCQlCSVQ0CS8qIDsxME1CL1NFQyAqLworI2RlZmluZSBGQVNUX0NMSwkJQklUMwkvKiA7MjUgLSA0MCBNSFogKi8KKworLyo7IENvbnRyb2wgUmVnLiA0KCszNEgpIChydykgKi8KKyNkZWZpbmUgRUFURVJfMTJOUwkJMAorI2RlZmluZSBFQVRFUl8yNU5TCQlCSVQ3CisjZGVmaW5lIEVBVEVSXzM1TlMJCUJJVDYKKyNkZWZpbmUgRUFURVJfME5TCQkoQklUNytCSVQ2KQorI2RlZmluZSBSRURVQ0VEX1BPV0VSCQlCSVQ1CisjZGVmaW5lIENUUkw0X1JFU0VSVkVECQlCSVQ0CS8qIG11c3QgYmUgMSBhY2MuIHRvIEFNNTNDOTc0LmMgKi8KKyNkZWZpbmUgTkVHQVRFX1JFUUFDS0RBVEEJQklUMgorI2RlZmluZSBORUdBVEVfUkVRQUNLCQlCSVQzCisKKyNkZWZpbmUgR0xJVENIX1RPX05TKHgpICgoKH54Pj42ICYgMikgPj4gMSkgfCAoKHg+PjYgJiAxKSA8PCAxIF4gKHg+PjYgJiAyKSkpCisjZGVmaW5lIE5TX1RPX0dMSVRDSCh5KSAoKCh+eTw8NykgfCB+KCh5PDw2KSBeICgoeTw8NSAmIDE8PDYpIHwgfjB4NDApKSkgJiAweGMwKQorCisvKgorOz09PT09PT09PT09PT09PT09PT09Cis7IERNQSBSZWdpc3RlcgorOz09PT09PT09PT09PT09PT09PT09CisqLworLyo7IERNQSBDb21tYW5kIFJlZy4oKzQwSCkgKHJ3KSAqLworI2RlZmluZSBSRUFEX0RJUkVDVElPTgkJQklUNworI2RlZmluZSBXUklURV9ESVJFQ1RJT04gCTAKKyNkZWZpbmUgRU5fRE1BX0lOVAkJQklUNgorI2RlZmluZSBFTl9QQUdFX0lOVAkJQklUNQkvKiBwYWdlIHRyYW5zZmVyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTUFQX1RPX01ETAkJQklUNAorI2RlZmluZSBESUFHTk9TVElDCQlCSVQyCisjZGVmaW5lIERNQV9JRExFX0NNRAkJMAorI2RlZmluZSBETUFfQkxBU1RfQ01ECQlCSVQwCisjZGVmaW5lIERNQV9BQk9SVF9DTUQJCUJJVDEKKyNkZWZpbmUgRE1BX1NUQVJUX0NNRAkJKEJJVDErQklUMCkKKworLyo7IERNQSBTdGF0dXMgUmVnLigrNTRIKSAocikgKi8KKyNkZWZpbmUgUENJX01TX0FCT1JUCQlCSVQ2CisjZGVmaW5lIEJMQVNUX0NPTVBMRVRFCQlCSVQ1CisjZGVmaW5lIFNDU0lfSU5URVJSVVBUCQlCSVQ0CisjZGVmaW5lIERNQV9YRkVSX0RPTkUJCUJJVDMKKyNkZWZpbmUgRE1BX1hGRVJfQUJPUlQJCUJJVDIKKyNkZWZpbmUgRE1BX1hGRVJfRVJST1IJCUJJVDEKKyNkZWZpbmUgUE9XRVJfRE9XTgkJQklUMAorCisvKjsgRE1BIFNDU0kgQnVzIGFuZCBDdHJsLigrNzBIKSAqLworI2RlZmluZSBFTl9JTlRfT05fUENJX0FCT1JUCUJJVDI1CisjZGVmaW5lIFdSVF9FUkFTRV9ETUFfU1RBVAlCSVQyNAorI2RlZmluZSBQV19ET1dOX0NUUkwJCUJJVDIxCisjZGVmaW5lIFNDU0lfQlVTWQkJQklUMjAKKyNkZWZpbmUgU0NMSwkJCUJJVDE5CisjZGVmaW5lIFNDQU0JCQlCSVQxOAorI2RlZmluZSBTQ1NJX0xJTkVTCQkweDAwMDNmZmZmCisKKy8qCis7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyBTQ1NJIENoaXAgcmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXQKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7UmVnaXN0ZXJzIGFyZSBydyB1bmxlc3MgZGVjbGFyZWQgb3RoZXJ3aXNlIAorKi8KKyNkZWZpbmUgQ3RjUmVnX0xvdwkweDAwCS8qIHIJY3Vyci4gdHJhbnNmZXIgY291bnQgKi8KKyNkZWZpbmUgQ3RjUmVnX01pZAkweDA0CS8qIHIgKi8KKyNkZWZpbmUgQ3RjUmVnX0hpZ2gJMHgzOAkvKiByICovCisjZGVmaW5lIFNjc2lGaWZvCTB4MDgKKyNkZWZpbmUgU2NzaUNtZCAJMHgwQworI2RlZmluZSBTY3NpX1N0YXR1cwkweDEwCS8qIHIgKi8KKyNkZWZpbmUgSU5UX1N0YXR1cwkweDE0CS8qIHIgKi8KKyNkZWZpbmUgU3luY19QZXJpb2QJMHgxOAkvKiB3ICovCisjZGVmaW5lIFN5bmNfT2Zmc2V0CTB4MUMJLyogdyAqLworI2RlZmluZSBDbGtfRmFjdG9yCTB4MjQJLyogdyAqLworI2RlZmluZSBDdHJsUmVnMQkweDIwCQorI2RlZmluZSBDdHJsUmVnMgkweDJDCisjZGVmaW5lIEN0cmxSZWczCTB4MzAKKyNkZWZpbmUgQ3RybFJlZzQJMHgzNAorI2RlZmluZSBETUFfQ21kIAkweDQwCisjZGVmaW5lIERNQV9YZmVyQ250CTB4NDQJLyogcncJc3RhcnRpbmcgdHJhbnNmZXIgY291bnQgKDMyIGJpdCkgKi8KKyNkZWZpbmUgRE1BX1hmZXJBZGRyCTB4NDgJLyogcncJc3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyAoMzIgYml0KSAqLworI2RlZmluZSBETUFfV2tfQnl0ZUNudHIgMHg0QwkvKiByCXdvcmtpbmcgYnl0ZSBjb3VudGVyICovCisjZGVmaW5lIERNQV9Xa19BZGRyQ250ciAweDUwCS8qIHIJd29ya2luZyBhZGRyZXNzIGNvdW50ZXIgKi8KKyNkZWZpbmUgRE1BX1N0YXR1cwkweDU0CS8qIHIgKi8KKyNkZWZpbmUgRE1BX01ETF9BZGRyCTB4NTgJLyogcncJc3RhcnRpbmcgTURMIGFkZHJlc3MgKi8KKyNkZWZpbmUgRE1BX1drX01ETF9DbnRyIDB4NUMJLyogcgl3b3JraW5nIE1ETCBjb3VudGVyICovCisjZGVmaW5lIERNQV9TY3NpQnVzQ3RybCAweDcwCS8qIHJ3CVNDU0kgQnVzLCBQQ0kvRE1BIEN0cmwgKi8KKworI2RlZmluZSBTdGNSZWdfTG93CUN0Y1JlZ19Mb3cJLyogdwlzdGFydCB0cmFuc2ZlciBjb3VudCAqLworI2RlZmluZSBTdGNSZWdfTWlkCUN0Y1JlZ19NaWQJLyogdyAqLworI2RlZmluZSBTdGNSZWdfSGlnaAlDdGNSZWdfSGlnaAkvKiB3ICovCisjZGVmaW5lIFNjc2lfRGVzdF9JRAlTY3NpX1N0YXR1cwkvKiB3ICovCisjZGVmaW5lIFNjc2lfVGltZU91dAlJTlRfU3RhdHVzCS8qIHcgKi8KKyNkZWZpbmUgSW50ZXJuX1N0YXRlCVN5bmNfUGVyaW9kCS8qIHIgKi8KKyNkZWZpbmUgQ3VycmVudF9GaWZvCVN5bmNfT2Zmc2V0CS8qIHIJQ3Vyci4gRklGTyAvIGludC4gc3RhdGUgKi8KKworCisjZGVmaW5lIERDMzkwX3JlYWQ4KGFkZHJlc3MpCQkJXAorCShpbmIgKHBBQ0ItPklPUG9ydEJhc2UgKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIERDMzkwX3JlYWQ4XyhhZGRyZXNzLCBiYXNlKQkJXAorCShpbmIgKCh1MTYpKGJhc2UpICsgKGFkZHJlc3MpKSkKKworI2RlZmluZSBEQzM5MF9yZWFkMTYoYWRkcmVzcykJCQlcCisJKGludyAocEFDQi0+SU9Qb3J0QmFzZSArIChhZGRyZXNzKSkpCisKKyNkZWZpbmUgREMzOTBfcmVhZDMyKGFkZHJlc3MpCQkJXAorCShpbmwgKHBBQ0ItPklPUG9ydEJhc2UgKyAoYWRkcmVzcykpKQorCisjZGVmaW5lIERDMzkwX3dyaXRlOChhZGRyZXNzLHZhbHVlKQkJXAorCW91dGIgKCh2YWx1ZSksIHBBQ0ItPklPUG9ydEJhc2UgKyAoYWRkcmVzcykpCisKKyNkZWZpbmUgREMzOTBfd3JpdGU4XyhhZGRyZXNzLHZhbHVlLGJhc2UpCVwKKwlvdXRiICgodmFsdWUpLCAodTE2KShiYXNlKSArIChhZGRyZXNzKSkKKworI2RlZmluZSBEQzM5MF93cml0ZTE2KGFkZHJlc3MsdmFsdWUpCQlcCisJb3V0dyAoKHZhbHVlKSwgcEFDQi0+SU9Qb3J0QmFzZSArIChhZGRyZXNzKSkKKworI2RlZmluZSBEQzM5MF93cml0ZTMyKGFkZHJlc3MsdmFsdWUpCQlcCisJb3V0bCAoKHZhbHVlKSwgcEFDQi0+SU9Qb3J0QmFzZSArIChhZGRyZXNzKSkKKworCisjZW5kaWYgLyogX1RNU0NTSU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3UxNC0zNGYuYyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhMjE1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKQEAgLTAsMCArMSwxOTg3IEBACisvKgorICogICAgICB1MTQtMzRmLmMgLSBMb3ctbGV2ZWwgZHJpdmVyIGZvciBVbHRyYVN0b3IgMTRGLzM0RiBTQ1NJIGhvc3QgYWRhcHRlcnMuCisgKgorICogICAgICAwMyBKdW4gMjAwMyBSZXYuIDguMTAgZm9yIGxpbnV4LTIuNS43MAorICogICAgICAgICsgVXBkYXRlIGZvciBuZXcgSVJRIEFQSS4KKyAqICAgICAgICArIFVzZSAiZ290byIgd2hlbiBhcHByb3ByaWF0ZS4KKyAqICAgICAgICArIERyb3AgdTE0LTM0Zi5oLgorICogICAgICAgICsgVXBkYXRlIGZvciBuZXcgbW9kdWxlX3BhcmFtIEFQSS4KKyAqICAgICAgICArIE1vZHVsZSBwYXJhbWV0ZXJzICBjYW4gbm93IGJlIHNwZWNpZmllZCBvbmx5IGluIHRoZQorICogICAgICAgICAgc2FtZSBmb3JtYXQgYXMgdGhlIGtlcm5lbCBib290IG9wdGlvbnMuCisgKgorICogICAgICAgICAgICAgYm9vdCBvcHRpb24gICAgb2xkIG1vZHVsZSBwYXJhbSAKKyAqICAgICAgICAgICAgIC0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgYWRkciwuLi4gICAgICAgaW9fcG9ydD1hZGRyLC4uLgorICogICAgICAgICAgICAgbGM6W3l8bl0gICAgICAgbGlua2VkX2NvbW09WzF8MF0KKyAqICAgICAgICAgICAgIG1xOnh4ICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD14eAorICogICAgICAgICAgICAgdG06WzB8MXwyXSAgICAgdGFnX21vZGU9WzB8MXwyXQorICogICAgICAgICAgICAgZXQ6W3l8bl0gICAgICAgZXh0X3RyYW49WzF8MF0KKyAqICAgICAgICAgICAgIG9mOlt5fG5dICAgICAgIGhhdmVfb2xkX2Zpcm13YXJlPVsxfDBdCisgKgorICogICAgICAgICAgQSB2YWxpZCBleGFtcGxlIHVzaW5nIHRoZSBuZXcgcGFyYW1ldGVyIGZvcm1hdCBpczoKKyAqICAgICAgICAgIG1vZHByb2JlIHUxNC0zNGYgInUxNC0zNGY9MHgzNDAsMHgzMzAsbGM6eSx0bTowLG1xOjQiCisgKgorICogICAgICAgICAgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgb2xkIGZvcm1hdDoKKyAqICAgICAgICAgIG1vZHByb2JlIHUxNC0zNGYgaW9fcG9ydD0weDM0MCwweDMzMCBsaW5rZWRfY29tbT0xIHRhZ19tb2RlPTAgXAorICogICAgICAgICAgICAgICAgICAgICAgICBtYXhfcXVldWVfZGVwdGg9NAorICoKKyAqICAgICAgICAgIFdpdGggYWN0dWFsIG1vZHVsZSBjb2RlLCB1MTQtMzRmIGFuZCB1MTRfMzRmIGFyZSBlcXVpdmFsZW50CisgKiAgICAgICAgICBhcyBtb2R1bGUgcGFyYW1ldGVyIG5hbWVzLgorICoKKyAqICAgICAgMTIgRmViIDIwMDMgUmV2LiA4LjA0IGZvciBsaW51eCAyLjUuNjAKKyAqICAgICAgICArIFJlbGVhc2UgaXJxIGJlZm9yZSBjYWxsaW5nIHNjc2lfcmVnaXN0ZXIuCisgKgorICogICAgICAxMiBOb3YgMjAwMiBSZXYuIDguMDIgZm9yIGxpbnV4IDIuNS40NworICogICAgICAgICsgUmVsZWFzZSBkcml2ZXJfbG9jayBiZWZvcmUgY2FsbGluZyBzY3NpX3JlZ2lzdGVyLgorICoKKyAqICAgICAgMTEgTm92IDIwMDIgUmV2LiA4LjAxIGZvciBsaW51eCAyLjUuNDcKKyAqICAgICAgICArIEZpeGVkIGJpb3NfcGFyYW0gYW5kIHNjc2ljYW1fYmlvc19wYXJhbSBjYWxsaW5nIHBhcmFtZXRlcnMuCisgKgorICogICAgICAyOCBPY3QgMjAwMiBSZXYuIDguMDAgZm9yIGxpbnV4IDIuNS40NC1hYzQKKyAqICAgICAgICArIFVzZSBuZXcgdGNxIGFuZCBhZGp1c3RfcXVldWVfZGVwdGggYXBpLgorICogICAgICAgICsgTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gKHRtOlswLTJdKSB0byBjaG9vc2UgdGhlIHR5cGUgb2YgdGFnczoKKyAqICAgICAgICAgIDAgLT4gZGlzYWJsZSB0YWdnaW5nIDsgMSAtPiBzaW1wbGUgdGFncyAgOyAyIC0+IG9yZGVyZWQgdGFncy4KKyAqICAgICAgICAgIERlZmF1bHQgaXMgdG06MCAodGFnZ2VkIGNvbW1hbmRzIGRpc2FibGVkKS4KKyAqICAgICAgICAgIEZvciBjb21wYXRpYmlsaXR5IHRoZSAidGM6IiBvcHRpb24gaXMgYW4gYWxpYXMgb2YgdGhlICJ0bToiCisgKiAgICAgICAgICBvcHRpb247IHRjOm4gaXMgZXF1aXZhbGVudCB0byB0bTowIGFuZCB0Yzp5IGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgIHRtOjEuCisgKgorICogICAgICAxMCBPY3QgMjAwMiBSZXYuIDcuNzAgZm9yIGxpbnV4IDIuNS40MgorICogICAgICAgICsgRm9yZXBvcnQgZnJvbSByZXZpc2lvbiA2LjcwLgorICoKKyAqICAgICAgMjUgSnVuIDIwMDIgUmV2LiA2LjcwIGZvciBsaW51eCAyLjQuMTkKKyAqICAgICAgICArIEZpeGVkIGVuZGlhbi1uZXNzIHByb2JsZW0gZHVlIHRvIGJpdGZpZWxkcy4KKyAqCisgKiAgICAgIDIxIEZlYiAyMDAyIFJldi4gNi41MiBmb3IgbGludXggMi40LjE4CisgKiAgICAgICAgKyBCYWNrcG9ydCBmcm9tIHJldi4gNy4yMiAodXNlIGlvX3JlcXVlc3RfbG9jaykuCisgKgorICogICAgICAyMCBGZWIgMjAwMiBSZXYuIDcuMjIgZm9yIGxpbnV4IDIuNS41CisgKiAgICAgICAgKyBSZW1vdmUgYW55IHJlZmVyZW5jZSB0byB2aXJ0X3RvX2J1cygpLgorICogICAgICAgICsgRml4IHBpbyBoYW5nIHdoaWxlIGRldGVjdGluZyBtdWx0aXBsZSBIQkFzLgorICoKKyAqICAgICAgMDEgSmFuIDIwMDIgUmV2LiA3LjIwIGZvciBsaW51eCAyLjUuMQorICogICAgICAgICsgVXNlIHRoZSBkeW5hbWljIERNQSBtYXBwaW5nIEFQSS4KKyAqCisgKiAgICAgIDE5IERlYyAyMDAxIFJldi4gNy4wMiBmb3IgbGludXggMi41LjEKKyAqICAgICAgICArIFVzZSBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gaWYgc2V0LgorICogICAgICAgICsgVXNlIHNnbGlzdC5wYWdlIGluc3RlYWQgb2Ygc2dsaXN0LmFkZHJlc3MuCisgKgorICogICAgICAxMSBEZWMgMjAwMSBSZXYuIDcuMDAgZm9yIGxpbnV4IDIuNS4xCisgKiAgICAgICAgKyBVc2UgaG9zdC0+aG9zdF9sb2NrIGluc3RlYWQgb2YgaW9fcmVxdWVzdF9sb2NrLgorICoKKyAqICAgICAgIDEgTWF5IDIwMDEgUmV2LiA2LjA1IGZvciBsaW51eCAyLjQuNAorICogICAgICAgICsgRml4IGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGZvciBvcGNvZGUgU0VORF9DVUVfU0hFRVQgKDB4NWQpCisgKgorICogICAgICAyNSBKYW4gMjAwMSBSZXYuIDYuMDMgZm9yIGxpbnV4IDIuNC4wCisgKiAgICAgICAgKyAiY2hlY2tfcmVnaW9uIiBjYWxsIHJlcGxhY2VkIGJ5ICJyZXF1ZXN0X3JlZ2lvbiIuCisgKgorICogICAgICAyMiBOb3YgMjAwMCBSZXYuIDYuMDIgZm9yIGxpbnV4IDIuNC4wLXRlc3QxMQorICogICAgICAgICsgUmVtb3ZlZCBvbGQgc2NzaSBlcnJvciBoYW5kbGluZyBzdXBwb3J0LgorICogICAgICAgICsgVGhlIG9ic29sZXRlIGJvb3Qgb3B0aW9uIGZsYWcgZWg6biBpcyBzaWxlbnRseSBpZ25vcmVkLgorICogICAgICAgICsgUmVtb3ZlZCBlcnJvciBtZXNzYWdlcyB3aGlsZSBhIGRpc2sgZHJpdmUgaXMgcG93ZXJlZCB1cCBhdAorICogICAgICAgICAgYm9vdCB0aW1lLgorICogICAgICAgICsgSW1wcm92ZWQgYm9vdCBtZXNzYWdlczogYWxsIHRhZ2dlZCBjYXBhYmxlIGRldmljZSBhcmUKKyAqICAgICAgICAgIGluZGljYXRlZCBhcyAidGFnZ2VkIi4KKyAqCisgKiAgICAgIDE2IFNlcCAxOTk5IFJldi4gNS4xMSBmb3IgbGludXggMi4yLjEyIGFuZCAyLjMuMTgKKyAqICAgICAgICArIFVwZGF0ZWQgdG8gdGhlIG5ldyBfX3NldHVwIGludGVyZmFjZSBmb3IgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAqICAgICAgICArIFdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlLCBhY2NlcHRzIHRoZSBuZXcgcGFyYW1ldGVyIGJvb3Rfb3B0aW9ucworICogICAgICAgICAgd2hpY2ggdmFsdWUgaXMgYSBzdHJpbmcgd2l0aCB0aGUgc2FtZSBmb3JtYXQgb2YgdGhlIGtlcm5lbCBib290CisgKiAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9ucy4gQSB2YWxpZCBleGFtcGxlIGlzOgorICogICAgICAgICAgbW9kcHJvYmUgdTE0LTM0ZiAnYm9vdF9vcHRpb25zPSIweDIzMCwweDM0MCxsYzp5LG1xOjQiJworICoKKyAqICAgICAgMjIgSnVsIDE5OTkgUmV2LiA1LjAwIGZvciBsaW51eCAyLjIuMTAgYW5kIDIuMy4xMQorICogICAgICAgICsgUmVtb3ZlZCBwcmUtMi4yIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkuCisgKgorICogICAgICAyNiBKdWwgMTk5OCBSZXYuIDQuMzMgZm9yIGxpbnV4IDIuMC4zNSBhbmQgMi4xLjExMQorICogICAgICAgICAgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbiAoZXQ6W3l8bl0pIHRvIHVzZSB0aGUgZXhpc3RpbmcKKyAqICAgICAgICAgIHRyYW5zbGF0aW9uIChyZXR1cm5lZCBieSBzY3NpY2FtX2Jpb3NfcGFyYW0pIGFzIGRpc2sgZ2VvbWV0cnkuCisgKiAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBldDpuLCB3aGljaCB1c2VzIHRoZSBkaXNrIGdlb21ldHJ5IGp1bXBlcmVkCisgKiAgICAgICAgICBvbiB0aGUgYm9hcmQuCisgKiAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBldDpuIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJldmlvdXMgcmV2aXNpb25zCisgKiAgICAgICAgICBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAgICAgIDI4IE1heSAxOTk4IFJldi4gNC4zMiBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuMTA0CisgKiAgICAgICAgICBJbmNyZWFzZWQgYnVzeSB0aW1lb3V0IGZyb20gMTAgbXNlYy4gdG8gMjAwIG1zZWMuIHdoaWxlCisgKiAgICAgICAgICBwcm9jZXNzaW5nIGludGVycnVwdHMuCisgKgorICogICAgICAxOCBNYXkgMTk5OCBSZXYuIDQuMzEgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjEwMgorICogICAgICAgICAgSW1wcm92ZWQgYWJvcnQgaGFuZGxpbmcgZHVyaW5nIHRoZSBlaCByZWNvdmVyeSBwcm9jZXNzLgorICoKKyAqICAgICAgMTMgTWF5IDE5OTggUmV2LiA0LjMwIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS4xMDEKKyAqICAgICAgICAgIFRoZSBkcml2ZXIgaXMgbm93IGZ1bGx5IFNNUCBzYWZlLCBpbmNsdWRpbmcgdGhlCisgKiAgICAgICAgICBhYm9ydCBhbmQgcmVzZXQgcm91dGluZXMuCisgKiAgICAgICAgICBBZGRlZCBjb21tYW5kIGxpbmUgb3B0aW9ucyAoZWg6W3l8bl0pIHRvIGNob29zZSBiZXR3ZWVuCisgKiAgICAgICAgICBuZXdfZWhfY29kZSBhbmQgdGhlIG9sZCBzY3NpIGNvZGUuCisgKiAgICAgICAgICBJZiBsaW51eCB2ZXJzaW9uID49IDIuMS4xMDEgdGhlIGRlZmF1bHQgaXMgZWg6eSwgd2hpbGUgdGhlIGVoCisgKiAgICAgICAgICBvcHRpb24gaXMgaWdub3JlZCBmb3IgcHJldmlvdXMgcmVsZWFzZXMgYW5kIHRoZSBvbGQgc2NzaSBjb2RlCisgKiAgICAgICAgICBpcyB1c2VkLgorICoKKyAqICAgICAgMTggQXByIDE5OTggUmV2LiA0LjIwIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45NworICogICAgICAgICAgUmV3b3JrZWQgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogICAgICAxMSBBcHIgMTk5OCByZXYuIDQuMDUgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk1CisgKiAgICAgICAgICBNYWpvciByZWxpYWJpbGl0eSBpbXByb3ZlbWVudDogd2hlbiBhIGJhdGNoIHdpdGggb3ZlcmxhcHBpbmcKKyAqICAgICAgICAgIHJlcXVlc3RzIGlzIGRldGVjdGVkLCByZXF1ZXN0cyBhcmUgcXVldWVkIG9uZSBhdCBhIHRpbWUKKyAqICAgICAgICAgIGVsaW1pbmF0aW5nIGFueSBwb3NzaWJsZSBib2FyZCBvciBkcml2ZSByZW9yZGVyaW5nLgorICoKKyAqICAgICAgMTAgQXByIDE5OTggcmV2LiA0LjA0IGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45NQorICogICAgICAgICAgSW1wcm92ZWQgU01QIHN1cHBvcnQgKGlmIGxpbnV4IHZlcnNpb24gPj0gMi4xLjk1KS4KKyAqCisgKiAgICAgICA5IEFwciAxOTk4IHJldi4gNC4wMyBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTQKKyAqICAgICAgICAgIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiB3aGVuIHNlcXVlbnRpYWwgaS9vIGlzIGRldGVjdGVkLAorICogICAgICAgICAgYWx3YXlzIHVzZSBkaXJlY3Qgc29ydCBpbnN0ZWFkIG9mIHJldmVyc2Ugc29ydC4KKyAqCisgKiAgICAgICA0IEFwciAxOTk4IHJldi4gNC4wMiBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTIKKyAqICAgICAgICAgIGlvX3BvcnQgaXMgbm93IHVuc2lnbmVkIGxvbmcuCisgKgorICogICAgICAxNyBNYXIgMTk5OCByZXYuIDQuMDEgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjg4CisgKiAgICAgICAgICBVc2UgbmV3IHNjc2kgZXJyb3IgaGFuZGxpbmcgY29kZSAoaWYgbGludXggdmVyc2lvbiA+PSAyLjEuODgpLgorICogICAgICAgICAgVXNlIG5ldyBpbnRlcnJ1cHQgY29kZS4KKyAqCisgKiAgICAgIDEyIFNlcCAxOTk3IHJldi4gMy4xMSBmb3IgbGludXggMi4wLjMwIGFuZCAyLjEuNTUKKyAqICAgICAgICAgIFVzZSBvZiB1ZGVsYXkgaW5zaWRlIHRoZSB3YWl0IGxvb3BzIHRvIGF2b2lkIHRpbWVvdXQKKyAqICAgICAgICAgIHByb2JsZW1zIHdpdGggZmFzdCBjcHVzLgorICogICAgICAgICAgUmVtb3ZlZCBjaGVjayBhYm91dCB1c2VsZXNzIGNhbGxzIHRvIHRoZSBpbnRlcnJ1cHQgc2VydmljZQorICogICAgICAgICAgcm91dGluZSAocmVwb3J0ZWQgb24gU01QIHN5c3RlbXMgb25seSkuCisgKiAgICAgICAgICBBdCBpbml0aWFsaXphdGlvbiB0aW1lICJzb3J0ZWQvdW5zb3J0ZWQiIGlzIGRpc3BsYXllZCBpbnN0ZWFkCisgKiAgICAgICAgICBvZiAibGlua2VkL3VubGlua2VkIiB0byByZWluZm9yY2UgdGhlIGZhY3QgdGhhdCAibGlua2luZyIgaXMKKyAqICAgICAgICAgIG5vdGhpbmcgYnV0ICJlbGV2YXRvciBzb3J0aW5nIiBpbiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLgorICoKKyAqICAgICAgMTcgTWF5IDE5OTcgcmV2LiAzLjEwIGZvciBsaW51eCAyLjAuMzAgYW5kIDIuMS4zOAorICogICAgICAgICAgVXNlIG9mIHNlcmlhbF9udW1iZXJfYXRfdGltZW91dCBpbiBhYm9ydCBhbmQgcmVzZXQgcHJvY2Vzc2luZy4KKyAqICAgICAgICAgIFVzZSBvZiB0aGUgX19pbml0ZnVuYyBhbmQgX19pbml0ZGF0YSBtYWNybyBpbiBzZXR1cCBjb2RlLgorICogICAgICAgICAgTWlub3IgY2xlYW51cHMgaW4gdGhlIGxpc3Rfc3RhdGlzdGljcyBjb2RlLgorICoKKyAqICAgICAgMjQgRmViIDE5OTcgcmV2LiAzLjAwIGZvciBsaW51eCAyLjAuMjkgYW5kIDIuMS4yNgorICogICAgICAgICAgV2hlbiBsb2FkaW5nIGFzIGEgbW9kdWxlLCBwYXJhbWV0ZXIgcGFzc2luZyBpcyBub3cgc3VwcG9ydGVkCisgKiAgICAgICAgICBib3RoIGluIDIuMCBhbmQgaW4gMi4xIHN0eWxlLgorICogICAgICAgICAgRml4ZWQgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gZm9yIHNvbWUgU0NTSSBvcGNvZGVzLgorICogICAgICAgICAgSW1tZWRpYXRlIGFja25vd2xlZGdlIHRvIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZHMuCisgKiAgICAgICAgICBMaW5rZWQgY29tbWFuZHMgdG8gZWFjaCBkaXNrIGRldmljZSBhcmUgbm93IHJlb3JkZXJlZCBieSBlbGV2YXRvcgorICogICAgICAgICAgc29ydGluZy4gUmFyZSBjYXNlcyBpbiB3aGljaCByZW9yZGVyaW5nIG9mIHdyaXRlIHJlcXVlc3RzIGNvdWxkCisgKiAgICAgICAgICBjYXVzZSB3cm9uZyByZXN1bHRzIGFyZSBtYW5hZ2VkLgorICoKKyAqICAgICAgMTggSmFuIDE5OTcgcmV2LiAyLjYwIGZvciBsaW51eCAyLjEuMjEgYW5kIDIuMC4yOAorICogICAgICAgICAgQWRkZWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUgbGlua2VkIGNvbW1hbmRzCisgKiAgICAgICAgICAobGM6W3l8bl0pLCBvbGQgZmlybXdhcmUgc3VwcG9ydCAob2Y6W3l8bl0pIGFuZCB0byBzZXQgdGhlIG1heAorICogICAgICAgICAgcXVldWUgZGVwdGggKG1xOnh4KS4gRGVmYXVsdCBpcyAidTE0LTM0Zj1sYzpuLG9mOm4sbXE6OCIuCisgKiAgICAgICAgICBJbXByb3ZlZCBjb21tYW5kIGxpbmtpbmcuCisgKgorICogICAgICAgOCBKYW4gMTk5NyByZXYuIDIuNTAgZm9yIGxpbnV4IDIuMS4yMCBhbmQgMi4wLjI3CisgKiAgICAgICAgICBBZGRlZCBsaW5rZWQgY29tbWFuZCBzdXBwb3J0LgorICoKKyAqICAgICAgIDMgRGVjIDE5OTYgcmV2LiAyLjQwIGZvciBsaW51eCAyLjEuMTQgYW5kIDIuMC4yNworICogICAgICAgICAgQWRkZWQgcXVldWUgZGVwdGggYWRqdXN0bWVudC4KKyAqCisgKiAgICAgIDIyIE5vdiAxOTk2IHJldi4gMi4zMCBmb3IgbGludXggMi4xLjEyIGFuZCAyLjAuMjYKKyAqICAgICAgICAgIFRoZSBsaXN0IG9mIGkvbyBwb3J0cyB0byBiZSBwcm9iZWQgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQorICogICAgICAgICAgInUxNC0zNGY9cG9ydDAscG9ydDEsLi4uLiIgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9uLgorICogICAgICAgICAgU2NhdHRlci9nYXRoZXIgbGlzdHMgYXJlIG5vdyBhbGxvY2F0ZWQgYnkgYSBudW1iZXIgb2Yga21hbGxvYworICogICAgICAgICAgY2FsbHMsIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBwcmV2aW91cyBzaXplIGxpbWl0IG9mIDY0S2IuCisgKgorICogICAgICAxNiBOb3YgMTk5NiByZXYuIDIuMjAgZm9yIGxpbnV4IDIuMS4xMCBhbmQgMi4wLjI1CisgKiAgICAgICAgICBBZGRlZCBtdWx0aWNoYW5uZWwgc3VwcG9ydC4KKyAqCisgKiAgICAgIDI3IFNlcCAxOTk2IHJldi4gMi4xMiBmb3IgbGludXggMi4xLjAKKyAqICAgICAgICAgIFBvcnRhYmlsaXR5IGNsZWFudXBzICh2aXJ0dWFsL2J1cyBhZGRyZXNzaW5nLCBsaXR0bGUvYmlnIGVuZGlhbgorICogICAgICAgICAgc3VwcG9ydCkuCisgKgorICogICAgICAwOSBKdWwgMTk5NiByZXYuIDIuMTEgZm9yIGxpbnV4IDIuMC40CisgKiAgICAgICAgICAiRGF0YSBvdmVyL3VuZGVyLXJ1biIgbm8gbG9uZ2VyIGltcGxpZXMgYSByZWRvIG9uIGFsbCB0YXJnZXRzLgorICogICAgICAgICAgTnVtYmVyIG9mIGludGVybmFsIHJldHJpZXMgaXMgbm93IGxpbWl0ZWQuCisgKgorICogICAgICAxNiBBcHIgMTk5NiByZXYuIDIuMTAgZm9yIGxpbnV4IDEuMy45MAorICogICAgICAgICAgTmV3IGFyZ3VtZW50ICJyZXNldF9mbGFncyIgdG8gdGhlIHJlc2V0IHJvdXRpbmUuCisgKgorICogICAgICAyMSBKdWwgMTk5NSByZXYuIDIuMDIgZm9yIGxpbnV4IDEuMy4xMQorICogICAgICAgICAgRml4ZWQgRGF0YSBUcmFuc2ZlciBEaXJlY3Rpb24gZm9yIHNvbWUgU0NTSSBjb21tYW5kcy4KKyAqCisgKiAgICAgIDEzIEp1biAxOTk1IHJldi4gMi4wMSBmb3IgbGludXggMS4yLjEwCisgKiAgICAgICAgICBIQVZFX09MRF9VWDRGX0ZJUk1XQVJFIHNob3VsZCBiZSBkZWZpbmVkIGZvciBVMzRGIGJvYXJkcyB3aGVuCisgKiAgICAgICAgICB0aGUgZmlybXdhcmUgcHJvbSBpcyBub3QgdGhlIGxhdGVzdCBvbmUgKDI4MDA4LTAwNikuCisgKgorICogICAgICAxMSBNYXIgMTk5NSByZXYuIDIuMDAgZm9yIGxpbnV4IDEuMi4wCisgKiAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgbWVkaWEgY2hhbmdlIGRldGVjdGlvbiBmb3IgcmVtb3ZhYmxlCisgKiAgICAgICAgICBkaXNrIGRyaXZlcy4KKyAqCisgKiAgICAgIDIzIEZlYiAxOTk1IHJldi4gMS4xOCBmb3IgbGludXggMS4xLjk0CisgKiAgICAgICAgICBBZGRlZCBhIGNoZWNrIGZvciBzY3NpX3JlZ2lzdGVyIHJldHVybmluZyBOVUxMLgorICoKKyAqICAgICAgMTEgRmViIDE5OTUgcmV2LiAxLjE3IGZvciBsaW51eCAxLjEuOTEKKyAqICAgICAgICAgIFUxNEYgcXVhbGlmaWVkIHRvIHJ1biB3aXRoIDMyIHNnbGlzdHMuCisgKiAgICAgICAgICBOb3cgREVCVUdfUkVTRVQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAqCisgKiAgICAgICA5IEZlYiAxOTk1IHJldi4gMS4xNiBmb3IgbGludXggMS4xLjkwCisgKiAgICAgICAgICBVc2UgaG9zdC0+d2lzaF9ibG9jayBpbnN0ZWFkIG9mIGhvc3QtPmJsb2NrLgorICoKKyAqICAgICAgIDggRmViIDE5OTUgcmV2LiAxLjE1IGZvciBsaW51eCAxLjEuODkKKyAqICAgICAgICAgIENsZWFyZWQgdGFyZ2V0X3RpbWVfb3V0IGNvdW50ZXIgd2hpbGUgcGVyZm9ybWluZyBhIHJlc2V0LgorICoKKyAqICAgICAgMjggSmFuIDE5OTUgcmV2LiAxLjE0IGZvciBsaW51eCAxLjEuODYKKyAqICAgICAgICAgIEFkZGVkIG1vZHVsZSBzdXBwb3J0LgorICogICAgICAgICAgTG9nIGFuZCBkbyBhIHJldHJ5IHdoZW4gYSBkaXNrIGRyaXZlIHJldHVybnMgYSB0YXJnZXQgc3RhdHVzCisgKiAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB6ZXJvIG9uIGEgcmVjb3ZlcmVkIGVycm9yLgorICogICAgICAgICAgQXV0byBkZXRlY3RzIGlmIFUxNEYgYm9hcmRzIGhhdmUgYW4gb2xkIGZpcm13YXJlIHJldmlzaW9uLgorICogICAgICAgICAgTWF4IG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBsaXN0cyBzZXQgdG8gMTYgZm9yIGFsbCBib2FyZHMKKyAqICAgICAgICAgIChtb3N0IGluc3RhbGxhdGlvbiBydW4gZmluZSB1c2luZyAzMyBzZ2xpc3RzLCB3aGlsZSBvdGhlcgorICogICAgICAgICAgaGFzIHByb2JsZW1zIHdoZW4gdXNpbmcgbW9yZSB0aGFuIDE2KS4KKyAqCisgKiAgICAgIDE2IEphbiAxOTk1IHJldi4gMS4xMyBmb3IgbGludXggMS4xLjgxCisgKiAgICAgICAgICBEaXNwbGF5IGEgbWVzc2FnZSBpZiBjaGVja19yZWdpb24gZGV0ZWN0cyBhIHBvcnQgYWRkcmVzcworICogICAgICAgICAgYWxyZWFkeSBpbiB1c2UuCisgKgorICogICAgICAxNSBEZWMgMTk5NCByZXYuIDEuMTIgZm9yIGxpbnV4IDEuMS43NAorICogICAgICAgICAgVGhlIGhvc3QtPmJsb2NrIGZsYWcgaXMgc2V0IGZvciBhbGwgdGhlIGRldGVjdGVkIElTQSBib2FyZHMuCisgKgorICogICAgICAzMCBOb3YgMTk5NCByZXYuIDEuMTEgZm9yIGxpbnV4IDEuMS42OAorICogICAgICAgICAgUmVkbyBpL28gb24gdGFyZ2V0IHN0YXR1cyBDSEVDS19DT05ESVRJT04gZm9yIFRZUEVfRElTSyBvbmx5LgorICogICAgICAgICAgQWRkZWQgb3B0aW9uYWwgc3VwcG9ydCBmb3IgdXNpbmcgYSBzaW5nbGUgYm9hcmQgYXQgYSB0aW1lLgorICoKKyAqICAgICAgMTQgTm92IDE5OTQgcmV2LiAxLjEwIGZvciBsaW51eCAxLjEuNjMKKyAqCisgKiAgICAgIDI4IE9jdCAxOTk0IHJldi4gMS4wOSBmb3IgbGludXggMS4xLjU4ICBGaW5hbCBCRVRBIHJlbGVhc2UuCisgKiAgICAgIDE2IEp1bCAxOTk0IHJldi4gMS4wMCBmb3IgbGludXggMS4xLjI5ICBJbml0aWFsIEFMUEhBIHJlbGVhc2UuCisgKgorICogICAgICAgICAgVGhpcyBkcml2ZXIgaXMgYSB0b3RhbCByZXBsYWNlbWVudCBvZiB0aGUgb3JpZ2luYWwgVWx0cmFTdG9yCisgKiAgICAgICAgICBzY3NpIGRyaXZlciwgYnV0IGl0IHN1cHBvcnRzIE9OTFkgdGhlIDE0RiBhbmQgMzRGIGJvYXJkcy4KKyAqICAgICAgICAgIEl0IGNhbiBiZSBjb25maWd1cmVkIGluIHRoZSBzYW1lIGtlcm5lbCBpbiB3aGljaCB0aGUgb3JpZ2luYWwKKyAqICAgICAgICAgIHVsdHJhc3RvciBkcml2ZXIgaXMgY29uZmlndXJlZCB0byBhbGxvdyB0aGUgb3JpZ2luYWwgVTI0RgorICogICAgICAgICAgc3VwcG9ydC4KKyAqCisgKiAgICAgICAgICBNdWx0aXBsZSBVMTRGIGFuZC9vciBVMzRGIGhvc3QgYWRhcHRlcnMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDMgRGFyaW8gQmFsbGFiaW8gKGJhbGxhYmlvX2RhcmlvQGVtYy5jb20pCisgKgorICogIEFsdGVybmF0ZSBlbWFpbDogZGFyaW8uYmFsbGFiaW9AaW53aW5kLml0LCBkYXJpby5iYWxsYWJpb0B0aXNjYWxpbmV0Lml0CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UKKyAqICBjb2RlIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBjb21tZW50IHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24uCisgKgorICogICAgICBXQVJOSU5HOiBpZiB5b3VyIDE0LzM0RiBib2FyZCBoYXMgYW4gb2xkIGZpcm13YXJlIHJldmlzaW9uIChzZWUgYmVsb3cpCisgKiAgICAgICAgICAgICAgIHlvdSBtdXN0IGNoYW5nZSAiI3VuZGVmIiBpbnRvICIjZGVmaW5lIiBpbiB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgICAgICAgIHN0YXRlbWVudC4KKyAqLworI3VuZGVmIEhBVkVfT0xEX1VYNEZfRklSTVdBUkUKKy8qCisgKiAgVGhlIFVsdHJhU3RvciAxNEYsIDI0RiwgYW5kIDM0RiBhcmUgYSBmYW1pbHkgb2YgaW50ZWxsaWdlbnQsIGhpZ2gKKyAqICBwZXJmb3JtYW5jZSBTQ1NJLTIgaG9zdCBhZGFwdGVycy4KKyAqICBIZXJlIGlzIHRoZSBzY29vcCBvbiB0aGUgdmFyaW91cyBtb2RlbHM6CisgKgorICogIDE0RiAtIElTQSBmaXJzdC1wYXJ0eSBETUEgSEEgd2l0aCBmbG9wcHkgc3VwcG9ydCBhbmQgV0QxMDAzIGVtdWxhdGlvbi4KKyAqICAyNEYgLSBFSVNBIEJ1cyBNYXN0ZXIgSEEgd2l0aCBmbG9wcHkgc3VwcG9ydCBhbmQgV0QxMDAzIGVtdWxhdGlvbi4KKyAqICAzNEYgLSBWRVNBIExvY2FsLUJ1cyBCdXMgTWFzdGVyIEhBIChubyBXRDEwMDMgZW11bGF0aW9uKS4KKyAqCisgKiAgVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHVwIHRvIHR3byBVMTRGIGJvYXJkcywgdXNpbmcgYm90aAorICogIGZpcm13YXJlIDI4MDA0LTAwNS8zODAwNC0wMDQgKEJJT1MgcmV2LiAyLjAwKSBhbmQgdGhlIGxhdGVzdCBmaXJtd2FyZQorICogIDI4MDA0LTAwNi8zODAwNC0wMDUgKEJJT1MgcmV2LiAyLjAxKS4KKyAqCisgKiAgVGhlIGxhdGVzdCBmaXJtd2FyZSBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBnZXQgcmVsaWFibGUgb3BlcmF0aW9ucyB3aGVuCisgKiAgY2x1c3RlcmluZyBpcyBlbmFibGVkLiBFTkFCTEVfQ0xVU1RFUklORyBwcm92aWRlcyBhIHBlcmZvcm1hbmNlIGluY3JlYXNlCisgKiAgdXAgdG8gNTAlIG9uIHNlcXVlbnRpYWwgYWNjZXNzLgorICoKKyAqICBTaW5jZSB0aGUgU2NzaV9Ib3N0X1RlbXBsYXRlIHN0cnVjdHVyZSBpcyBzaGFyZWQgYW1vbmcgYWxsIDE0RiBhbmQgMzRGLAorICogIHRoZSBsYXN0IHNldHRpbmcgb2YgdXNlX2NsdXN0ZXJpbmcgaXMgaW4gZWZmZWN0IGZvciBhbGwgb2YgdGhlc2UgYm9hcmRzLgorICoKKyAqICBIZXJlIGEgc2FtcGxlIGNvbmZpZ3VyYXRpb24gdXNpbmcgdHdvIFUxNEYgYm9hcmRzOgorICoKKyBVMTRGMDogSVNBIDB4MzMwLCBCSU9TIDB4YzgwMDAsIElSUSAxMSwgRE1BIDUsIFNHIDMyLCBNQiAxNiwgb2Y6biwgbGM6eSwgbXE6OC4KKyBVMTRGMTogSVNBIDB4MzQwLCBCSU9TIDB4MDAwMDAsIElSUSAxMCwgRE1BIDYsIFNHIDMyLCBNQiAxNiwgb2Y6biwgbGM6eSwgbXE6OC4KKyAqCisgKiAgVGhlIGJvb3QgY29udHJvbGxlciBtdXN0IGhhdmUgaXRzIEJJT1MgZW5hYmxlZCwgd2hpbGUgb3RoZXIgYm9hcmRzIGNhbgorICogIGhhdmUgdGhlaXIgQklPUyBkaXNhYmxlZCwgb3IgZW5hYmxlZCB0byBhbiBoaWdoZXIgYWRkcmVzcy4KKyAqICBCb2FyZHMgYXJlIG5hbWVkIFV4NEYwLCBVeDRGMS4uLiwgYWNjb3JkaW5nIHRvIHRoZSBwb3J0IGFkZHJlc3Mgb3JkZXIgaW4KKyAqICB0aGUgaW9fcG9ydFtdIGFycmF5LgorICoKKyAqICBUaGUgZm9sbG93aW5nIGZhY3RzIGFyZSBiYXNlZCBvbiByZWFsIHRlc3RpbmcgcmVzdWx0cyAobm90IG9uCisgKiAgZG9jdW1lbnRhdGlvbikgb24gdGhlIGFib3ZlIFUxNEYgYm9hcmQuCisgKgorICogIC0gVGhlIFUxNEYgYm9hcmQgc2hvdWxkIGJlIGp1bXBlcmVkIGZvciBidXMgb24gdGltZSBsZXNzIG9yIGVxdWFsIHRvIDcKKyAqICAgIG1pY3Jvc2Vjb25kcywgd2hpbGUgdGhlIGRlZmF1bHQgaXMgMTEgbWljcm9zZWNvbmRzLiBUaGlzIGlzIG9yZGVyIHRvCisgKiAgICBnZXQgYWNjZXB0YWJsZSBwZXJmb3JtYW5jZSB3aGlsZSB1c2luZyBmbG9wcHkgZHJpdmUgYW5kIGhhcmQgZGlzaworICogICAgdG9nZXRoZXIuIFRoZSBqdW1wZXJpbmcgZm9yIDcgbWljcm9zZWNvbmRzIGlzOiBKUDEzIHBpbiAxNS0xNiwKKyAqICAgIEpQMTQgcGluIDctOCBhbmQgcGluIDktMTAuCisgKiAgICBUaGUgcmVkdWN0aW9uIGhhcyBhIGxpdHRsZSBpbXBhY3Qgb24gc2NzaSBwZXJmb3JtYW5jZS4KKyAqCisgKiAgLSBJZiBzY3NpIGJ1cyBsZW5ndGggZXhjZWVkcyAzbS4sIHRoZSBzY3NpIGJ1cyBzcGVlZCBuZWVkcyB0byBiZSByZWR1Y2VkCisgKiAgICBmcm9tIDEwTWh6IHRvIDVNaHogKGRvIHRoaXMgYnkgaW5zZXJ0aW5nIGEganVtcGVyIG9uIEpQMTMgcGluIDctOCkuCisgKgorICogIC0gSWYgVTE0RiBvbiBib2FyZCBmaXJtd2FyZSBpcyBvbGRlciB0aGFuIDI4MDA0LTAwNi8zODAwNC0wMDUsCisgKiAgICB0aGUgVTE0RiBib2FyZCBpcyB1bmFibGUgdG8gcHJvdmlkZSByZWxpYWJsZSBvcGVyYXRpb25zIGlmIHRoZSBzY3NpCisgKiAgICByZXF1ZXN0IGxlbmd0aCBleGNlZWRzIDE2S2J5dGUuIFdoZW4gdGhpcyBsZW5ndGggaXMgZXhjZWVkZWQgdGhlCisgKiAgICBiZWhhdmlvciBpczoKKyAqICAgIC0gYWRhcHRlcl9zdGF0dXMgZXF1YWwgMHg5NiBvciAweGEzIG9yIDB4OTMgb3IgMHg5NDsKKyAqICAgIC0gYWRhcHRlcl9zdGF0dXMgZXF1YWwgMCBhbmQgdGFyZ2V0X3N0YXR1cyBlcXVhbCAyIG9uIGZvciBhbGwgdGFyZ2V0cworICogICAgICBpbiB0aGUgbmV4dCBvcGVyYXRpb24gZm9sbG93aW5nIHRoZSByZXNldC4KKyAqICAgIFRoaXMgc2VxdWVuY2UgdGFrZXMgYSBsb25nIHRpbWUgKD4zIHNlY29uZHMpLCBzbyBpbiB0aGUgbWVhbnRpbWUKKyAqICAgIHRoZSBTRF9USU1FT1VUIGluIHNkLmMgY291bGQgZXhwaXJlIGdpdmluZyByaXNlIHRvIHNjc2kgYWJvcnRzCisgKiAgICAoU0RfVElNRU9VVCBoYXMgYmVlbiBpbmNyZWFzZWQgZnJvbSAzIHRvIDYgc2Vjb25kcyBpbiAxLjEuMzEpLgorICogICAgQmVjYXVzZSBvZiB0aGlzIEkgaGFkIHRvIERJU0FCTEVfQ0xVU1RFUklORyBhbmQgdG8gd29yayBhcm91bmQgdGhlCisgKiAgICBidXMgcmVzZXQgaW4gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUsIHJldHVybmluZyBESURfQlVTX0JVU1kKKyAqICAgIHNvIHRoYXQgdGhlIG9wZXJhdGlvbnMgYXJlIHJldHJpZWQgd2l0aG91dCBjb21wbGFpbnMgZnJvbSB0aGUgc2NzaS5jCisgKiAgICBjb2RlLgorICogICAgQW55IHJlc2V0IG9mIHRoZSBzY3NpIGJ1cyBpcyBnb2luZyB0byBraWxsIHRhcGUgb3BlcmF0aW9ucywgc2luY2UKKyAqICAgIG5vIHJldHJ5IGlzIGFsbG93ZWQgZm9yIHRhcGVzLiBCdXMgcmVzZXRzIGFyZSBtb3JlIGxpa2VseSB3aGVuIHRoZQorICogICAgc2NzaSBidXMgaXMgdW5kZXIgaGVhdnkgbG9hZC4KKyAqICAgIFJlcXVlc3RzIHVzaW5nIHNjYXR0ZXIvZ2F0aGVyIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxNiB4IDEwMjQgYnl0ZXMKKyAqICAgIHdoZW4gRElTQUJMRV9DTFVTVEVSSU5HIGlzIGluIGVmZmVjdCwgYnV0IHVuc2NhdHRlcmVkIHJlcXVlc3RzIGNvdWxkIGJlCisgKiAgICBsYXJnZXIgdGhhbiAxNktieXRlLgorICoKKyAqICAgIFRoZSBuZXcgZmlybXdhcmUgaGFzIGZpeGVkIGFsbCB0aGUgYWJvdmUgcHJvYmxlbXMuCisgKgorICogIEZvciBVMzRGIGJvYXJkcyB0aGUgbGF0ZXN0IGJpb3MgcHJvbSBpcyAzODAwOC0wMDIgKEJJT1MgcmV2LiAyLjAxKSwKKyAqICB0aGUgbGF0ZXN0IGZpcm13YXJlIHByb20gaXMgMjgwMDgtMDA2LiBPbGRlciBmaXJtd2FyZSAyODAwOC0wMDUgaGFzCisgKiAgcHJvYmxlbXMgd2hlbiB1c2luZyBtb3JlIHRoYW4gMTYgc2NhdHRlci9nYXRoZXIgbGlzdHMuCisgKgorICogIFRoZSBsaXN0IG9mIGkvbyBwb3J0cyB0byBiZSBwcm9iZWQgY2FuIGJlIHRvdGFsbHkgcmVwbGFjZWQgYnkgdGhlCisgKiAgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9uOiAidTE0LTM0Zj1wb3J0MCxwb3J0MSxwb3J0MiwuLi4iLCB3aGVyZSB0aGUKKyAqICBwb3J0MCwgcG9ydDEuLi4gYXJndW1lbnRzIGFyZSBJU0EvVkVTQSBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLgorICogIEZvciBleGFtcGxlIHVzaW5nICJ1MTQtMzRmPTB4MjMwLDB4MzQwIiwgdGhlIGRyaXZlciBwcm9iZXMgb25seSB0aGUgdHdvCisgKiAgYWRkcmVzc2VzIDB4MjMwIGFuZCAweDM0MCBpbiB0aGlzIG9yZGVyOyAidTE0LTM0Zj0wIiB0b3RhbGx5IGRpc2FibGVzCisgKiAgdGhpcyBkcml2ZXIuCisgKgorICogIEFmdGVyIHRoZSBvcHRpb25hbCBsaXN0IG9mIGRldGVjdGlvbiBwcm9iZXMsIG90aGVyIHBvc3NpYmxlIGNvbW1hbmQgbGluZQorICogIG9wdGlvbnMgYXJlOgorICoKKyAqICBldDp5ICB1c2UgZGlzayBnZW9tZXRyeSByZXR1cm5lZCBieSBzY3NpY2FtX2Jpb3NfcGFyYW07CisgKiAgZXQ6biAgdXNlIGRpc2sgZ2VvbWV0cnkganVtcGVyZWQgb24gdGhlIGJvYXJkOworICogIGxjOnkgIGVuYWJsZXMgbGlua2VkIGNvbW1hbmRzOworICogIGxjOm4gIGRpc2FibGVzIGxpbmtlZCBjb21tYW5kczsKKyAqICB0bTowICBkaXNhYmxlcyB0YWdnZWQgY29tbWFuZHMgKHNhbWUgYXMgdGM6bik7CisgKiAgdG06MSAgdXNlIHNpbXBsZSBxdWV1ZSB0YWdzIChzYW1lIGFzIHRjOnkpOworICogIHRtOjIgIHVzZSBvcmRlcmVkIHF1ZXVlIHRhZ3MgKHNhbWUgYXMgdGM6Mik7CisgKiAgb2Y6eSAgZW5hYmxlcyBvbGQgZmlybXdhcmUgc3VwcG9ydDsKKyAqICBvZjpuICBkaXNhYmxlcyBvbGQgZmlybXdhcmUgc3VwcG9ydDsKKyAqICBtcTp4eCBzZXQgdGhlIG1heCBxdWV1ZSBkZXB0aCB0byB0aGUgdmFsdWUgeHggKDIgPD0geHggPD0gOCkuCisgKgorICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAidTE0LTM0Zj1sYzpuLG9mOm4sbXE6OCx0bTowLGV0Om4iLgorICogIEFuIGV4YW1wbGUgdXNpbmcgdGhlIGxpc3Qgb2YgZGV0ZWN0aW9uIHByb2JlcyBjb3VsZCBiZToKKyAqICAidTE0LTM0Zj0weDIzMCwweDM0MCxsYzp5LHRtOjIsb2Y6bixtcTo0LGV0Om4iLgorICoKKyAqICBXaGVuIGxvYWRpbmcgYXMgYSBtb2R1bGUsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBhcyB3ZWxsLgorICogIFRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIGJlICh1c2UgMSBpbiBwbGFjZSBvZiB5IGFuZCAwIGluIHBsYWNlIG9mIG4pOgorICoKKyAqICBtb2Rwcm9iZSB1MTQtMzRmIGlvX3BvcnQ9MHgyMzAsMHgzNDAgbGlua2VkX2NvbW09MSBoYXZlX29sZF9maXJtd2FyZT0wIFwKKyAqICAgICAgICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD00IGV4dF90cmFuPTAgdGFnX21vZGU9MgorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgbGlua2VkIGNvbW1hbmRzIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggYW55IERJU0sKKyAqICBvciBDRC1ST00sIHNpbmNlIHRoaXMgbGlua2luZyBoYXMgb25seSB0aGUgaW50ZW50IG9mIGNsdXN0ZXJpbmcgKHRpbWUtd2lzZSkKKyAqICBhbmQgcmVvcmRlcmluZyBieSBlbGV2YXRvciBzb3J0aW5nIGNvbW1hbmRzIGRpcmVjdGVkIHRvIGVhY2ggZGV2aWNlLAorICogIHdpdGhvdXQgYW55IHJlbGF0aW9uIHdpdGggdGhlIGFjdHVhbCBTQ1NJIHByb3RvY29sIGJldHdlZW4gdGhlIGNvbnRyb2xsZXIKKyAqICBhbmQgdGhlIGRldmljZS4KKyAqICBJZiBRIGlzIHRoZSBxdWV1ZSBkZXB0aCByZXBvcnRlZCBhdCBib290IHRpbWUgZm9yIGVhY2ggZGV2aWNlIChhbHNvIG5hbWVkCisgKiAgY21kcy9sdW4pIGFuZCBRID4gMiwgd2hlbmV2ZXIgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgY29tbWFuZCB0byB0aGUKKyAqICBkZXZpY2UgYWxsIG90aGVyIGNvbW1hbmRzIHRvIHRoZSBzYW1lIGRldmljZSAgKHVwIHRvIFEtMSkgYXJlIGtlcHQgd2FpdGluZworICogIGluIHRoZSBlbGV2YXRvciBzb3J0aW5nIHF1ZXVlLiBXaGVuIHRoZSBhY3RpdmUgY29tbWFuZCBjb21wbGV0ZXMsIHRoZQorICogIGNvbW1hbmRzIGluIHRoaXMgcXVldWUgYXJlIHNvcnRlZCBieSBzZWN0b3IgYWRkcmVzcy4gVGhlIHNvcnQgaXMgY2hvc2VuCisgKiAgYmV0d2VlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgYnkgbWluaW1pemluZyB0aGUgc2VlayBkaXN0YW5jZSBiZXR3ZWVuCisgKiAgdGhlIHNlY3RvciBvZiB0aGUgY29tbWFuZHMganVzdCBjb21wbGV0ZWQgYW5kIHRoZSBzZWN0b3Igb2YgdGhlIGZpcnN0CisgKiAgY29tbWFuZCBpbiB0aGUgbGlzdCB0byBiZSBzb3J0ZWQuCisgKiAgVHJpdmlhbCBtYXRoIGFzc3VyZXMgdGhhdCB0aGUgdW5zb3J0ZWQgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIHdoZW4gZG9pbmcKKyAqICByYW5kb20gc2Vla3Mgb3ZlciBTIHNlY3RvcnMgaXMgUy8zLgorICogIFdoZW4gKFEtMSkgcmVxdWVzdHMgYXJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBvdmVyIFMgc2VjdG9ycywgdGhlIGF2ZXJhZ2UKKyAqICBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhZGphY2VudCByZXF1ZXN0cyBpcyBTLygoUS0xKSArIDEpLCBzbyB0aGUgc29ydGVkCisgKiAgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIGZvciAoUS0xKSByYW5kb20gcmVxdWVzdHMgb3ZlciBTIHNlY3RvcnMgaXMgUy9RLgorICogIFRoZSBlbGV2YXRvciBzb3J0aW5nIGhlbmNlIGRpdmlkZXMgdGhlIHNlZWsgZGlzdGFuY2UgYnkgYSBmYWN0b3IgUS8zLgorICogIFRoZSBhYm92ZSBwdXJlIGdlb21ldHJpYyByZW1hcmtzIGFyZSB2YWxpZCBpbiBhbGwgY2FzZXMgYW5kIHRoZQorICogIGRyaXZlciBlZmZlY3RpdmVseSByZWR1Y2VzIHRoZSBzZWVrIGRpc3RhbmNlIGJ5IHRoZSBwcmVkaWN0ZWQgZmFjdG9yCisgKiAgd2hlbiB0aGVyZSBhcmUgUSBjb25jdXJyZW50IHJlYWQgaS9vIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZSwgYnV0IHRoaXMKKyAqICBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXN1bHRzIGluIGEgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDoKKyAqICB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuLi4uCisgKgorICogIE5vdGU6IGNvbW1hbmQgcmVvcmRlcmluZyBpbnNpZGUgYSBiYXRjaCBvZiBxdWV1ZWQgY29tbWFuZHMgY291bGQgY2F1c2UKKyAqICAgICAgICB3cm9uZyByZXN1bHRzIG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHdyaXRlIHJlcXVlc3QgYW5kIHRoZQorICogICAgICAgIGludGVyc2VjdGlvbiAoc2VjdG9yLXdpc2UpIG9mIGFsbCByZXF1ZXN0cyBpcyBub3QgZW1wdHkuCisgKiAgICAgICAgV2hlbiB0aGUgZHJpdmVyIGRldGVjdHMgYSBiYXRjaCBpbmNsdWRpbmcgb3ZlcmxhcHBpbmcgcmVxdWVzdHMKKyAqICAgICAgICAoYSByZWFsbHkgcmFyZSBldmVudCkgc3RyaWN0IHNlcmlhbCAocGlkKSBvcmRlciBpcyBlbmZvcmNlZC4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoZSBib2FyZHMgYXJlIG5hbWVkIFV4NEYwLCBVeDRGMSwuLi4gYWNjb3JkaW5nIHRvIHRoZSBkZXRlY3Rpb24gb3JkZXIuCisgKgorICogIEluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgSVNBIGJvYXJkcyBpbiBhIHJlbGlhYmxlIHdheSwKKyAqICB0aGUgZHJpdmVyIHNldHMgaG9zdC0+d2lzaF9ibG9jayA9IFRSVUUgZm9yIGFsbCBJU0EgYm9hcmRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KKworc3RhdGljIGludCB1MTRfMzRmX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICopOworc3RhdGljIGludCB1MTRfMzRmX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyBpbnQgdTE0XzM0Zl9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitzdGF0aWMgaW50IHUxNF8zNGZfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgdTE0XzM0Zl9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IHUxNF8zNGZfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdG9yX3QsIGludCAqKTsKK3N0YXRpYyBpbnQgdTE0XzM0Zl9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICopOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgICAgICAgICAgID0gIlVsdHJhU3RvciAxNEYvMzRGIHJldi4gOC4xMC4wMCAiLAorICAgICAgICAgICAgICAgIC5kZXRlY3QgICAgICAgICAgICAgICAgICA9IHUxNF8zNGZfZGV0ZWN0LAorICAgICAgICAgICAgICAgIC5yZWxlYXNlICAgICAgICAgICAgICAgICA9IHUxNF8zNGZfcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAucXVldWVjb21tYW5kICAgICAgICAgICAgPSB1MTRfMzRmX3F1ZXVlY29tbWFuZCwKKyAgICAgICAgICAgICAgICAuZWhfYWJvcnRfaGFuZGxlciAgICAgICAgPSB1MTRfMzRmX2VoX2Fib3J0LAorICAgICAgICAgICAgICAgIC5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgLmVoX2J1c19yZXNldF9oYW5kbGVyICAgID0gTlVMTCwKKyAgICAgICAgICAgICAgICAuZWhfaG9zdF9yZXNldF9oYW5kbGVyICAgPSB1MTRfMzRmX2VoX2hvc3RfcmVzZXQsCisgICAgICAgICAgICAgICAgLmJpb3NfcGFyYW0gICAgICAgICAgICAgID0gdTE0XzM0Zl9iaW9zX3BhcmFtLAorICAgICAgICAgICAgICAgIC5zbGF2ZV9jb25maWd1cmUgICAgICAgICA9IHUxNF8zNGZfc2xhdmVfY29uZmlndXJlLAorICAgICAgICAgICAgICAgIC50aGlzX2lkICAgICAgICAgICAgICAgICA9IDcsCisgICAgICAgICAgICAgICAgLnVuY2hlY2tlZF9pc2FfZG1hICAgICAgID0gMSwKKyAgICAgICAgICAgICAgICAudXNlX2NsdXN0ZXJpbmcgICAgICAgICAgPSBFTkFCTEVfQ0xVU1RFUklORworICAgICAgICAgICAgICAgIH07CisKKyNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpICYmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKyNlcnJvciAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIHRoZSBQUk9EVUNUX0lEIHBvcnRzIGZvciB0aGUgMTQvMzRGICovCisjZGVmaW5lIFBST0RVQ1RfSUQxICAweDU2CisjZGVmaW5lIFBST0RVQ1RfSUQyICAweDQwICAgICAgICAvKiBOT1RFOiBPbmx5IHVwcGVyIG5pYmJsZSBpcyB1c2VkICovCisKKy8qIFN1YnZlcnNpb24gdmFsdWVzICovCisjZGVmaW5lIElTQSAgMAorI2RlZmluZSBFU0EgMQorCisjZGVmaW5lIE9QX0hPU1RfQURBUFRFUiAgIDB4MQorI2RlZmluZSBPUF9TQ1NJICAgICAgICAgICAweDIKKyNkZWZpbmUgT1BfUkVTRVQgICAgICAgICAgMHg0CisjZGVmaW5lIERURF9TQ1NJICAgICAgICAgIDB4MAorI2RlZmluZSBEVERfSU4gICAgICAgICAgICAweDEKKyNkZWZpbmUgRFREX09VVCAgICAgICAgICAgMHgyCisjZGVmaW5lIERURF9OT05FICAgICAgICAgIDB4MworI2RlZmluZSBIQV9DTURfSU5RVUlSWSAgICAweDEKKyNkZWZpbmUgSEFfQ01EX1NFTEZfRElBRyAgMHgyCisjZGVmaW5lIEhBX0NNRF9SRUFEX0JVRkYgIDB4MworI2RlZmluZSBIQV9DTURfV1JJVEVfQlVGRiAweDQKKworI3VuZGVmICBERUJVR19MSU5LRURfQ09NTUFORFMKKyN1bmRlZiAgREVCVUdfREVURUNUCisjdW5kZWYgIERFQlVHX0lOVEVSUlVQVAorI3VuZGVmICBERUJVR19SRVNFVAorI3VuZGVmICBERUJVR19HRU5FUkFURV9FUlJPUlMKKyN1bmRlZiAgREVCVUdfR0VORVJBVEVfQUJPUlRTCisjdW5kZWYgIERFQlVHX0dFT01FVFJZCisKKyNkZWZpbmUgTUFYX0lTQSAzCisjZGVmaW5lIE1BWF9WRVNBIDEKKyNkZWZpbmUgTUFYX0VJU0EgMAorI2RlZmluZSBNQVhfUENJIDAKKyNkZWZpbmUgTUFYX0JPQVJEUyAoTUFYX0lTQSArIE1BWF9WRVNBICsgTUFYX0VJU0EgKyBNQVhfUENJKQorI2RlZmluZSBNQVhfQ0hBTk5FTCAxCisjZGVmaW5lIE1BWF9MVU4gOAorI2RlZmluZSBNQVhfVEFSR0VUIDgKKyNkZWZpbmUgTUFYX01BSUxCT1hFUyAxNgorI2RlZmluZSBNQVhfU0dMSVNUIDMyCisjZGVmaW5lIE1BWF9TQUZFX1NHTElTVCAxNgorI2RlZmluZSBNQVhfSU5URVJOQUxfUkVUUklFUyA2NAorI2RlZmluZSBNQVhfQ01EX1BFUl9MVU4gMgorI2RlZmluZSBNQVhfVEFHR0VEX0NNRF9QRVJfTFVOIChNQVhfTUFJTEJPWEVTIC0gTUFYX0NNRF9QRVJfTFVOKQorCisjZGVmaW5lIFNLSVAgVUxPTkdfTUFYCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZSRUUgMAorI2RlZmluZSBJTl9VU0UgICAxCisjZGVmaW5lIExPQ0tFRCAgIDIKKyNkZWZpbmUgSU5fUkVTRVQgMworI2RlZmluZSBJR05PUkUgICA0CisjZGVmaW5lIFJFQURZICAgIDUKKyNkZWZpbmUgQUJPUlRJTkcgNgorI2RlZmluZSBOT19ETUEgIDB4ZmYKKyNkZWZpbmUgTUFYTE9PUCAgMTAwMDAKKyNkZWZpbmUgVEFHX0RJU0FCTEVEIDAKKyNkZWZpbmUgVEFHX1NJTVBMRSAgIDEKKyNkZWZpbmUgVEFHX09SREVSRUQgIDIKKworI2RlZmluZSBSRUdfTENMX01BU0sgICAgICAwCisjZGVmaW5lIFJFR19MQ0xfSU5UUiAgICAgIDEKKyNkZWZpbmUgUkVHX1NZU19NQVNLICAgICAgMgorI2RlZmluZSBSRUdfU1lTX0lOVFIgICAgICAzCisjZGVmaW5lIFJFR19QUk9EVUNUX0lEMSAgIDQKKyNkZWZpbmUgUkVHX1BST0RVQ1RfSUQyICAgNQorI2RlZmluZSBSRUdfQ09ORklHMSAgICAgICA2CisjZGVmaW5lIFJFR19DT05GSUcyICAgICAgIDcKKyNkZWZpbmUgUkVHX09HTSAgICAgICAgICAgOAorI2RlZmluZSBSRUdfSUNNICAgICAgICAgICAxMgorI2RlZmluZSBSRUdJT05fU0laRSAgICAgICAxM1VMCisjZGVmaW5lIEJTWV9BU1NFUlRFRCAgICAgIDB4MDEKKyNkZWZpbmUgSVJRX0FTU0VSVEVEICAgICAgMHgwMQorI2RlZmluZSBDTURfUkVTRVQgICAgICAgICAweGMwCisjZGVmaW5lIENNRF9PR01fSU5UUiAgICAgIDB4MDEKKyNkZWZpbmUgQ01EX0NMUl9JTlRSICAgICAgMHgwMQorI2RlZmluZSBDTURfRU5BX0lOVFIgICAgICAweDgxCisjZGVmaW5lIEFTT0sgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVNTVCAgICAgICAgICAgICAgMHg5MQorCisjZGVmaW5lIFlFU05PKGEpICgoYSkgPyAneScgOiAnbicpCisjZGVmaW5lIFRMREVWKHR5cGUpICgodHlwZSkgPT0gVFlQRV9ESVNLIHx8ICh0eXBlKSA9PSBUWVBFX1JPTSkKKworI2RlZmluZSBQQUNLRUQgICAgICAgICAgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKworc3RydWN0IHNnX2xpc3QgeworICAgdW5zaWduZWQgaW50IGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIFNlZ21lbnQgQWRkcmVzcyAqLworICAgdW5zaWduZWQgaW50IG51bV9ieXRlczsgICAgICAgICAgICAgIC8qIFNlZ21lbnQgTGVuZ3RoICovCisgICB9OworCisvKiBNYWlsQm94IFNDU0kgQ29tbWFuZCBQYWNrZXQgKi8KK3N0cnVjdCBtc2NwIHsKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgdW5zaWduZWQgY2hhciBzZzoxLCBjYToxLCBkY246MSwgeGRpcjoyLCBvcGNvZGU6MzsKKyAgIHVuc2lnbmVkIGNoYXIgbHVuOiAzLCBjaGFubmVsOjIsIHRhcmdldDozOworI2Vsc2UKKyAgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOiAzLCAgICAgICAgICAgICAvKiB0eXBlIG9mIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICAgeGRpcjogMiwgICAgICAgICAgICAgICAvKiBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAqLworICAgICAgICAgICAgICAgICBkY246IDEsICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgZGlzY29ubmVjdCAqLworICAgICAgICAgICAgICAgICBjYTogMSwgICAgICAgICAgICAgICAgIC8qIHVzZSBjYWNoZSAoaWYgYXZhaWxhYmxlKSAqLworICAgICAgICAgICAgICAgICBzZzogMTsgICAgICAgICAgICAgICAgIC8qIHNjYXR0ZXIvZ2F0aGVyIG9wZXJhdGlvbiAqLworICAgdW5zaWduZWQgY2hhciB0YXJnZXQ6IDMsICAgICAgICAgICAgIC8qIFNDU0kgdGFyZ2V0IGlkICovCisgICAgICAgICAgICAgICAgIGNoYW5uZWw6IDIsICAgICAgICAgICAgLyogU0NTSSBjaGFubmVsIG51bWJlciAqLworICAgICAgICAgICAgICAgICBsdW46IDM7ICAgICAgICAgICAgICAgIC8qIFNDU0kgbG9naWNhbCB1bml0IG51bWJlciAqLworI2VuZGlmCisKKyAgIHVuc2lnbmVkIGludCBkYXRhX2FkZHJlc3MgUEFDS0VEOyAgICAvKiB0cmFuc2ZlciBkYXRhIHBvaW50ZXIgKi8KKyAgIHVuc2lnbmVkIGludCBkYXRhX2xlbiBQQUNLRUQ7ICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgIHVuc2lnbmVkIGludCBsaW5rX2FkZHJlc3MgUEFDS0VEOyAgICAvKiBmb3IgbGlua2luZyBjb21tYW5kIGNoYWlucyAqLworICAgdW5zaWduZWQgY2hhciBjbGlua19pZDsgICAgICAgICAgICAgIC8qIGlkZW50aWZpZXMgY29tbWFuZCBpbiBjaGFpbiAqLworICAgdW5zaWduZWQgY2hhciB1c2Vfc2c7ICAgICAgICAgICAgICAgIC8qIChpZiBzZyBpcyBzZXQpIDggYnl0ZXMgcGVyIGxpc3QgKi8KKyAgIHVuc2lnbmVkIGNoYXIgc2Vuc2VfbGVuOworICAgdW5zaWduZWQgY2hhciBjZGJfbGVuOyAgICAgICAgICAgICAgIC8qIDYsIDEwLCBvciAxMiAqLworICAgdW5zaWduZWQgY2hhciBjZGJbMTJdOyAgICAgICAgICAgICAgIC8qIFNDU0kgQ29tbWFuZCBEZXNjcmlwdG9yIEJsb2NrICovCisgICB1bnNpZ25lZCBjaGFyIGFkYXB0ZXJfc3RhdHVzOyAgICAgICAgLyogbm9uLXplcm8gaW5kaWNhdGVzIEhBIGVycm9yICovCisgICB1bnNpZ25lZCBjaGFyIHRhcmdldF9zdGF0dXM7ICAgICAgICAgLyogbm9uLXplcm8gaW5kaWNhdGVzIHRhcmdldCBlcnJvciAqLworICAgdW5zaWduZWQgaW50IHNlbnNlX2FkZHIgUEFDS0VEOworCisgICAvKiBBZGRpdGlvbmFsIGZpZWxkcyBiZWdpbiBoZXJlLiAqLworICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisgICB1bnNpZ25lZCBpbnQgY3BwX2luZGV4OyAgICAgICAgICAgICAgLyogY3AgaW5kZXggKi8KKworICAgLyogQWxsIHRoZSBjcCBzdHJ1Y3R1cmUgaXMgemVybyBmaWxsZWQgYnkgcXVldWVjb21tYW5kIGV4Y2VwdCB0aGUKKyAgICAgIGZvbGxvd2luZyBDUF9UQUlMX1NJWkUgYnl0ZXMsIGluaXRpYWxpemVkIGJ5IGRldGVjdCAqLworICAgZG1hX2FkZHJfdCBjcF9kbWFfYWRkcjsgLyogZG1hIGhhbmRsZSBmb3IgdGhpcyBjcCBzdHJ1Y3R1cmUgKi8KKyAgIHN0cnVjdCBzZ19saXN0ICpzZ2xpc3Q7IC8qIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBTRyBsaXN0ICovCisgICB9OworCisjZGVmaW5lIENQX1RBSUxfU0laRSAoc2l6ZW9mKHN0cnVjdCBzZ2xpc3QgKikgKyBzaXplb2YoZG1hX2FkZHJfdCkpCisKK3N0cnVjdCBob3N0ZGF0YSB7CisgICBzdHJ1Y3QgbXNjcCBjcFtNQVhfTUFJTEJPWEVTXTsgICAgICAgLyogTWFpbGJveGVzIGZvciB0aGlzIGJvYXJkICovCisgICB1bnNpZ25lZCBpbnQgY3Bfc3RhdFtNQVhfTUFJTEJPWEVTXTsgLyogRlJFRSwgSU5fVVNFLCBMT0NLRUQsIElOX1JFU0VUICovCisgICB1bnNpZ25lZCBpbnQgbGFzdF9jcF91c2VkOyAgICAgICAgICAgLyogSW5kZXggb2YgbGFzdCBtYWlsYm94IHVzZWQgKi8KKyAgIHVuc2lnbmVkIGludCBpb2NvdW50OyAgICAgICAgICAgICAgICAvKiBUb3RhbCBpL28gZG9uZSBmb3IgdGhpcyBib2FyZCAqLworICAgaW50IGJvYXJkX251bWJlcjsgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB0aGlzIGJvYXJkICovCisgICBjaGFyIGJvYXJkX25hbWVbMTZdOyAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiB0aGlzIGJvYXJkICovCisgICBpbnQgaW5fcmVzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ1ZSBpZiBib2FyZCBpcyBkb2luZyBhIHJlc2V0ICovCisgICBpbnQgdGFyZ2V0X3RvW01BWF9UQVJHRVRdW01BWF9DSEFOTkVMXTsgLyogTi4gb2YgdGltZW91dCBlcnJvcnMgb24gdGFyZ2V0ICovCisgICBpbnQgdGFyZ2V0X3JlZG9bTUFYX1RBUkdFVF1bTUFYX0NIQU5ORUxdOyAvKiBJZiBUUlVFIHJlZG8gaS9vIG9uIHRhcmdldCAqLworICAgdW5zaWduZWQgaW50IHJldHJpZXM7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnRlcm5hbCByZXRyaWVzICovCisgICB1bnNpZ25lZCBsb25nIGxhc3RfcmV0cmllZF9waWQ7ICAgICAgLyogUGlkIG9mIGxhc3QgcmV0cmllZCBjb21tYW5kICovCisgICB1bnNpZ25lZCBjaGFyIHN1YnZlcnNpb247ICAgICAgICAgICAgLyogQnVzIHR5cGUsIGVpdGhlciBJU0Egb3IgRVNBICovCisgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsgICAgICAgICAgICAgICAgLyogQWx3YXlzIE5VTEwgKi8KKyAgIHVuc2lnbmVkIGNoYXIgaGVhZHM7CisgICB1bnNpZ25lZCBjaGFyIHNlY3RvcnM7CisgICBjaGFyIGJvYXJkX2lkWzI1Nl07ICAgICAgICAgICAgICAgICAgLyogZGF0YSBmcm9tIElOUVVJUlkgb24gdGhpcyBib2FyZCAqLworICAgfTsKKworc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKnNoW01BWF9CT0FSRFMgKyAxXTsKK3N0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJVeDRGIjsKK3N0YXRpYyBjaGFyIHNoYVtNQVhfQk9BUkRTXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHJpdmVyX2xvY2spOworCisvKiBJbml0aWFsaXplIG51bV9ib2FyZHMgc28gdGhhdCBpaGRsciBjYW4gd29yayB3aGlsZSBkZXRlY3QgaXMgaW4gcHJvZ3Jlc3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2JvYXJkcyA9IE1BWF9CT0FSRFM7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvX3BvcnRbXSA9IHsKKworICAgLyogU3BhY2UgZm9yIE1BWF9JTlRfUEFSQU0gcG9ydHMgdXNhYmxlIHdoaWxlIGxvYWRpbmcgYXMgYSBtb2R1bGUgKi8KKyAgIFNLSVAsICAgIFNLSVAsICAgU0tJUCwgICBTS0lQLCAgIFNLSVAsICAgU0tJUCwgICBTS0lQLCAgIFNLSVAsCisgICBTS0lQLCAgICBTS0lQLAorCisgICAvKiBQb3NzaWJsZSBJU0EvVkVTQSBwb3J0cyAqLworICAgMHgzMzAsIDB4MzQwLCAweDIzMCwgMHgyNDAsIDB4MjEwLCAweDEzMCwgMHgxNDAsCisKKyAgIC8qIEVuZCBvZiBsaXN0ICovCisgICAweDAKKyAgIH07CisKKyNkZWZpbmUgSEQoYm9hcmQpICgoc3RydWN0IGhvc3RkYXRhICopICZzaFtib2FyZF0tPmhvc3RkYXRhKQorI2RlZmluZSBCTihib2FyZCkgKEhEKGJvYXJkKS0+Ym9hcmRfbmFtZSkKKworLyogRGV2aWNlIGlzIExpdHRsZSBFbmRpYW4gKi8KKyNkZWZpbmUgSDJERVYoeCkgY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgREVWMkgoeCkgbGUzMl90b19jcHUoeCkKKworc3RhdGljIGlycXJldHVybl90IGRvX2ludGVycnVwdF9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIGZsdXNoX2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBkb190cmFjZSA9IEZBTFNFOworc3RhdGljIGludCBzZXR1cF9kb25lID0gRkFMU0U7CitzdGF0aWMgaW50IGxpbmtfc3RhdGlzdGljczsKK3N0YXRpYyBpbnQgZXh0X3RyYW4gPSBGQUxTRTsKKworI2lmIGRlZmluZWQoSEFWRV9PTERfVVg0Rl9GSVJNV0FSRSkKK3N0YXRpYyBpbnQgaGF2ZV9vbGRfZmlybXdhcmUgPSBUUlVFOworI2Vsc2UKK3N0YXRpYyBpbnQgaGF2ZV9vbGRfZmlybXdhcmUgPSBGQUxTRTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0NTSV9VMTRfMzRGX1RBR0dFRF9RVUVVRSkKK3N0YXRpYyBpbnQgdGFnX21vZGUgPSBUQUdfU0lNUExFOworI2Vsc2UKK3N0YXRpYyBpbnQgdGFnX21vZGUgPSBUQUdfRElTQUJMRUQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfVTE0XzM0Rl9MSU5LRURfQ09NTUFORFMpCitzdGF0aWMgaW50IGxpbmtlZF9jb21tID0gVFJVRTsKKyNlbHNlCitzdGF0aWMgaW50IGxpbmtlZF9jb21tID0gRkFMU0U7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfVTE0XzM0Rl9NQVhfVEFHUykKK3N0YXRpYyBpbnQgbWF4X3F1ZXVlX2RlcHRoID0gQ09ORklHX1NDU0lfVTE0XzM0Rl9NQVhfVEFHUzsKKyNlbHNlCitzdGF0aWMgaW50IG1heF9xdWV1ZV9kZXB0aCA9IE1BWF9DTURfUEVSX0xVTjsKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9JTlRfUEFSQU0gMTAKKyNkZWZpbmUgTUFYX0JPT1RfT1BUSU9OU19TSVpFIDI1Ngorc3RhdGljIGNoYXIgYm9vdF9vcHRpb25zW01BWF9CT09UX09QVElPTlNfU0laRV07CisKKyNpZiBkZWZpbmVkKE1PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCittb2R1bGVfcGFyYW1fc3RyaW5nKHUxNF8zNGYsIGJvb3Rfb3B0aW9ucywgTUFYX0JPT1RfT1BUSU9OU19TSVpFLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModTE0XzM0ZiwgIiBlcXVpdmFsZW50IHRvIHRoZSBcInUxNC0zNGY9Li4uXCIga2VybmVsIGJvb3QgIiBcCisib3B0aW9uLiIgXAorIiAgICAgIEV4YW1wbGU6IG1vZHByb2JlIHUxNC0zNGYgXCJ1MTRfMzRmPTB4MzQwLDB4MzMwLGxjOnksdG06MCxtcTo0XCIiKTsKK01PRFVMRV9BVVRIT1IoIkRhcmlvIEJhbGxhYmlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVsdHJhU3RvciAxNEYvMzRGIFNDU0kgRHJpdmVyIik7CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHUxNF8zNGZfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2KSB7CisgICBpbnQgaiwgdHFkLCB1dHFkOworICAgY2hhciAqdGFnX3N1ZmZpeCwgKmxpbmtfc3VmZml4OworICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldi0+aG9zdDsKKworICAgaiA9ICgoc3RydWN0IGhvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhKS0+Ym9hcmRfbnVtYmVyOworCisgICB1dHFkID0gTUFYX0NNRF9QRVJfTFVOOworICAgdHFkID0gbWF4X3F1ZXVlX2RlcHRoOworCisgICBpZiAoVExERVYoZGV2LT50eXBlKSAmJiBkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCisKKyAgICAgIGlmICh0YWdfbW9kZSA9PSBUQUdfU0lNUExFKSB7CisgICAgICAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIE1TR19TSU1QTEVfVEFHLCB0cWQpOworICAgICAgICAgdGFnX3N1ZmZpeCA9ICIsIHNpbXBsZSB0YWdzIjsKKyAgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHRhZ19tb2RlID09IFRBR19PUkRFUkVEKSB7CisgICAgICAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIE1TR19PUkRFUkVEX1RBRywgdHFkKTsKKyAgICAgICAgIHRhZ19zdWZmaXggPSAiLCBvcmRlcmVkIHRhZ3MiOworICAgICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXYsIDAsIHRxZCk7CisgICAgICAgICB0YWdfc3VmZml4ID0gIiwgbm8gdGFncyI7CisgICAgICAgICB9CisKKyAgIGVsc2UgaWYgKFRMREVWKGRldi0+dHlwZSkgJiYgbGlua2VkX2NvbW0pIHsKKyAgICAgIHNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldiwgMCwgdHFkKTsKKyAgICAgIHRhZ19zdWZmaXggPSAiLCB1bnRhZ2dlZCI7CisgICAgICB9CisKKyAgIGVsc2UgeworICAgICAgc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2LCAwLCB1dHFkKTsKKyAgICAgIHRhZ19zdWZmaXggPSAiIjsKKyAgICAgIH0KKworICAgaWYgKFRMREVWKGRldi0+dHlwZSkgJiYgbGlua2VkX2NvbW0gJiYgZGV2LT5xdWV1ZV9kZXB0aCA+IDIpCisgICAgICBsaW5rX3N1ZmZpeCA9ICIsIHNvcnRlZCI7CisgICBlbHNlIGlmIChUTERFVihkZXYtPnR5cGUpKQorICAgICAgbGlua19zdWZmaXggPSAiLCB1bnNvcnRlZCI7CisgICBlbHNlCisgICAgICBsaW5rX3N1ZmZpeCA9ICIiOworCisgICBwcmludGsoIiVzOiBzY3NpJWQsIGNoYW5uZWwgJWQsIGlkICVkLCBsdW4gJWQsIGNtZHMvbHVuICVkJXMlcy5cbiIsCisgICAgICAgICAgQk4oaiksIGhvc3QtPmhvc3Rfbm8sIGRldi0+Y2hhbm5lbCwgZGV2LT5pZCwgZGV2LT5sdW4sCisgICAgICAgICAgZGV2LT5xdWV1ZV9kZXB0aCwgbGlua19zdWZmaXgsIHRhZ19zdWZmaXgpOworCisgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9vbl9idXN5KHVuc2lnbmVkIGxvbmcgaW9iYXNlLCB1bnNpZ25lZCBpbnQgbG9vcCkgeworCisgICB3aGlsZSAoaW5iKGlvYmFzZSArIFJFR19MQ0xfSU5UUikgJiBCU1lfQVNTRVJURUQpIHsKKyAgICAgIHVkZWxheSgxTCk7CisgICAgICBpZiAoLS1sb29wID09IDApIHJldHVybiBUUlVFOworICAgICAgfQorCisgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgYm9hcmRfaW5xdWlyeSh1bnNpZ25lZCBpbnQgaikgeworICAgc3RydWN0IG1zY3AgKmNwcDsKKyAgIGRtYV9hZGRyX3QgaWRfZG1hX2FkZHI7CisgICB1bnNpZ25lZCBpbnQgdGltZSwgbGltaXQgPSAwOworCisgICBpZF9kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBIRChqKS0+Ym9hcmRfaWQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRChqKS0+Ym9hcmRfaWQpLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworICAgY3BwID0gJkhEKGopLT5jcFswXTsKKyAgIGNwcC0+Y3BfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShIRChqKS0+cGRldiwgY3BwLCBzaXplb2Yoc3RydWN0IG1zY3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisgICBtZW1zZXQoY3BwLCAwLCBzaXplb2Yoc3RydWN0IG1zY3ApIC0gQ1BfVEFJTF9TSVpFKTsKKyAgIGNwcC0+b3Bjb2RlID0gT1BfSE9TVF9BREFQVEVSOworICAgY3BwLT54ZGlyID0gRFREX0lOOworICAgY3BwLT5kYXRhX2FkZHJlc3MgPSBIMkRFVihpZF9kbWFfYWRkcik7CisgICBjcHAtPmRhdGFfbGVuID0gSDJERVYoc2l6ZW9mKEhEKGopLT5ib2FyZF9pZCkpOworICAgY3BwLT5jZGJfbGVuID0gNjsKKyAgIGNwcC0+Y2RiWzBdID0gSEFfQ01EX0lOUVVJUlk7CisKKyAgIGlmICh3YWl0X29uX2J1c3koc2hbal0tPmlvX3BvcnQsIE1BWExPT1ApKSB7CisgICAgICBwcmludGsoIiVzOiBib2FyZF9pbnF1aXJ5LCBhZGFwdGVyIGJ1c3kuXG4iLCBCTihqKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgSEQoaiktPmNwX3N0YXRbMF0gPSBJR05PUkU7CisKKyAgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgaW5kaWNhdGlvbiAqLworICAgb3V0YihDTURfQ0xSX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX1NZU19JTlRSKTsKKworICAgLyogU3RvcmUgcG9pbnRlciBpbiBPR00gYWRkcmVzcyBieXRlcyAqLworICAgb3V0bChIMkRFVihjcHAtPmNwX2RtYV9hZGRyKSwgc2hbal0tPmlvX3BvcnQgKyBSRUdfT0dNKTsKKworICAgLyogSXNzdWUgT0dNIGludGVycnVwdCAqLworICAgb3V0YihDTURfT0dNX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX0xDTF9JTlRSKTsKKworICAgc3Bpbl91bmxvY2tfaXJxKCZkcml2ZXJfbG9jayk7CisgICB0aW1lID0gamlmZmllczsKKyAgIHdoaWxlICgoamlmZmllcyAtIHRpbWUpIDwgSFogJiYgbGltaXQrKyA8IDIwMDAwKSB1ZGVsYXkoMTAwTCk7CisgICBzcGluX2xvY2tfaXJxKCZkcml2ZXJfbG9jayk7CisKKyAgIGlmIChjcHAtPmFkYXB0ZXJfc3RhdHVzIHx8IEhEKGopLT5jcF9zdGF0WzBdICE9IEZSRUUpIHsKKyAgICAgIEhEKGopLT5jcF9zdGF0WzBdID0gRlJFRTsKKyAgICAgIHByaW50aygiJXM6IGJvYXJkX2lucXVpcnksIGVyciAweCV4LlxuIiwgQk4oaiksIGNwcC0+YWRhcHRlcl9zdGF0dXMpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgIHBjaV91bm1hcF9zaW5nbGUoSEQoaiktPnBkZXYsIGNwcC0+Y3BfZG1hX2FkZHIsIHNpemVvZihzdHJ1Y3QgbXNjcCksCisgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisgICBwY2lfdW5tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBpZF9kbWFfYWRkciwgc2l6ZW9mKEhEKGopLT5ib2FyZF9pZCksCisgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9kZXRlY3QgXAorICAgICAgKHVuc2lnbmVkIGxvbmcgcG9ydF9iYXNlLCB1bnNpZ25lZCBpbnQgaiwgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkgeworICAgdW5zaWduZWQgY2hhciBpcnEsIGRtYV9jaGFubmVsLCBzdWJ2ZXJzaW9uLCBpOworICAgdW5zaWduZWQgY2hhciBpbl9ieXRlOworICAgY2hhciAqYnVzX3R5cGUsIGRtYV9uYW1lWzE2XTsKKworICAgLyogQWxsb3dlZCBCSU9TIGJhc2UgYWRkcmVzc2VzIChOVUxMIGluZGljYXRlcyByZXNlcnZlZCkgKi8KKyAgIHVuc2lnbmVkIGxvbmcgYmlvc19zZWdtZW50X3RhYmxlWzhdID0geworICAgICAgMCwKKyAgICAgIDB4YzQwMDAsIDB4YzgwMDAsIDB4Y2MwMDAsIDB4ZDAwMDAsCisgICAgICAweGQ0MDAwLCAweGQ4MDAwLCAweGRjMDAwCisgICAgICB9OworCisgICAvKiBBbGxvd2VkIElSUXMgKi8KKyAgIHVuc2lnbmVkIGNoYXIgaW50ZXJydXB0X3RhYmxlWzRdID0geyAxNSwgMTQsIDExLCAxMCB9OworCisgICAvKiBBbGxvd2VkIERNQSBjaGFubmVscyBmb3IgSVNBICgwIGluZGljYXRlcyByZXNlcnZlZCkgKi8KKyAgIHVuc2lnbmVkIGNoYXIgZG1hX2NoYW5uZWxfdGFibGVbNF0gPSB7IDUsIDYsIDcsIDAgfTsKKworICAgLyogSGVhZC9zZWN0b3IgbWFwcGluZ3MgKi8KKyAgIHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBjaGFyIGhlYWRzOworICAgICAgdW5zaWduZWQgY2hhciBzZWN0b3JzOworICAgICAgfSBtYXBwaW5nX3RhYmxlWzRdID0geworICAgICAgICAgICB7IDE2LCA2MyB9LCB7IDY0LCAzMiB9LCB7IDY0LCA2MyB9LCB7IDY0LCAzMiB9CisgICAgICAgICAgIH07CisKKyAgIHN0cnVjdCBjb25maWdfMSB7CisKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKyAgICAgIHVuc2lnbmVkIGNoYXIgZG1hX2NoYW5uZWw6IDIsIGludGVycnVwdDoyLAorICAgICAgICAgICAgICAgICAgICByZW1vdmFibGVfZGlza3NfYXNfZml4ZWQ6MSwgYmlvc19zZWdtZW50OiAzOworI2Vsc2UKKyAgICAgIHVuc2lnbmVkIGNoYXIgYmlvc19zZWdtZW50OiAzLCByZW1vdmFibGVfZGlza3NfYXNfZml4ZWQ6IDEsCisgICAgICAgICAgICAgICAgICAgIGludGVycnVwdDogMiwgZG1hX2NoYW5uZWw6IDI7CisjZW5kaWYKKworICAgICAgfSBjb25maWdfMTsKKworICAgc3RydWN0IGNvbmZpZ18yIHsKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgdW5zaWduZWQgY2hhciB0ZnJfcG9ydDogMiwgYmlvc19kcml2ZV9udW1iZXI6IDEsCisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdfbW9kZTogMiwgaGFfc2NzaV9pZDogMzsKKyNlbHNlCisgICAgICB1bnNpZ25lZCBjaGFyIGhhX3Njc2lfaWQ6IDMsIG1hcHBpbmdfbW9kZTogMiwKKyAgICAgICAgICAgICAgICAgICAgYmlvc19kcml2ZV9udW1iZXI6IDEsIHRmcl9wb3J0OiAyOworI2VuZGlmCisKKyAgICAgIH0gY29uZmlnXzI7CisKKyAgIGNoYXIgbmFtZVsxNl07CisKKyAgIHNwcmludGYobmFtZSwgIiVzJWQiLCBkcml2ZXJfbmFtZSwgaik7CisKKyAgIGlmICghcmVxdWVzdF9yZWdpb24ocG9ydF9iYXNlLCBSRUdJT05fU0laRSwgZHJpdmVyX25hbWUpKSB7CisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisgICAgICBwcmludGsoIiVzOiBhZGRyZXNzIDB4JTAzbHggaW4gdXNlLCBza2lwcGluZyBwcm9iZS5cbiIsIG5hbWUsIHBvcnRfYmFzZSk7CisjZW5kaWYKKyAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKworICAgc3Bpbl9sb2NrX2lycSgmZHJpdmVyX2xvY2spOworCisgICBpZiAoaW5iKHBvcnRfYmFzZSArIFJFR19QUk9EVUNUX0lEMSkgIT0gUFJPRFVDVF9JRDEpIGdvdG8gZnJlZWxvY2s7CisKKyAgIGluX2J5dGUgPSBpbmIocG9ydF9iYXNlICsgUkVHX1BST0RVQ1RfSUQyKTsKKworICAgaWYgKChpbl9ieXRlICYgMHhmMCkgIT0gUFJPRFVDVF9JRDIpIGdvdG8gZnJlZWxvY2s7CisKKyAgICooY2hhciAqKSZjb25maWdfMSA9IGluYihwb3J0X2Jhc2UgKyBSRUdfQ09ORklHMSk7CisgICAqKGNoYXIgKikmY29uZmlnXzIgPSBpbmIocG9ydF9iYXNlICsgUkVHX0NPTkZJRzIpOworCisgICBpcnEgPSBpbnRlcnJ1cHRfdGFibGVbY29uZmlnXzEuaW50ZXJydXB0XTsKKyAgIGRtYV9jaGFubmVsID0gZG1hX2NoYW5uZWxfdGFibGVbY29uZmlnXzEuZG1hX2NoYW5uZWxdOworICAgc3VidmVyc2lvbiA9IChpbl9ieXRlICYgMHgwZik7CisKKyAgIC8qIEJvYXJkIGRldGVjdGVkLCBhbGxvY2F0ZSBpdHMgSVJRICovCisgICBpZiAocmVxdWVzdF9pcnEoaXJxLCBkb19pbnRlcnJ1cHRfaGFuZGxlciwKKyAgICAgICAgICAgICBTQV9JTlRFUlJVUFQgfCAoKHN1YnZlcnNpb24gPT0gRVNBKSA/IFNBX1NISVJRIDogMCksCisgICAgICAgICAgICAgZHJpdmVyX25hbWUsICh2b2lkICopICZzaGFbal0pKSB7CisgICAgICBwcmludGsoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBkZXRhY2hpbmcuXG4iLCBuYW1lLCBpcnEpOworICAgICAgZ290byBmcmVlbG9jazsKKyAgICAgIH0KKworICAgaWYgKHN1YnZlcnNpb24gPT0gSVNBICYmIHJlcXVlc3RfZG1hKGRtYV9jaGFubmVsLCBkcml2ZXJfbmFtZSkpIHsKKyAgICAgIHByaW50aygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbCAldSwgZGV0YWNoaW5nLlxuIiwKKyAgICAgICAgICAgICBuYW1lLCBkbWFfY2hhbm5lbCk7CisgICAgICBnb3RvIGZyZWVpcnE7CisgICAgICB9CisKKyAgIGlmIChoYXZlX29sZF9maXJtd2FyZSkgdHBudC0+dXNlX2NsdXN0ZXJpbmcgPSBESVNBQkxFX0NMVVNURVJJTkc7CisKKyAgIHNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOworICAgc2hbal0gPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgaG9zdGRhdGEpKTsKKyAgIHNwaW5fbG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKworICAgaWYgKHNoW2pdID09IE5VTEwpIHsKKyAgICAgIHByaW50aygiJXM6IHVuYWJsZSB0byByZWdpc3RlciBob3N0LCBkZXRhY2hpbmcuXG4iLCBuYW1lKTsKKyAgICAgIGdvdG8gZnJlZWRtYTsKKyAgICAgIH0KKworICAgc2hbal0tPmlvX3BvcnQgPSBwb3J0X2Jhc2U7CisgICBzaFtqXS0+dW5pcXVlX2lkID0gcG9ydF9iYXNlOworICAgc2hbal0tPm5faW9fcG9ydCA9IFJFR0lPTl9TSVpFOworICAgc2hbal0tPmJhc2UgPSBiaW9zX3NlZ21lbnRfdGFibGVbY29uZmlnXzEuYmlvc19zZWdtZW50XTsKKyAgIHNoW2pdLT5pcnEgPSBpcnE7CisgICBzaFtqXS0+c2dfdGFibGVzaXplID0gTUFYX1NHTElTVDsKKyAgIHNoW2pdLT50aGlzX2lkID0gY29uZmlnXzIuaGFfc2NzaV9pZDsKKyAgIHNoW2pdLT5jYW5fcXVldWUgPSBNQVhfTUFJTEJPWEVTOworICAgc2hbal0tPmNtZF9wZXJfbHVuID0gTUFYX0NNRF9QRVJfTFVOOworCisjaWYgZGVmaW5lZChERUJVR19ERVRFQ1QpCisgICB7CisgICB1bnNpZ25lZCBjaGFyIHN5c19tYXNrLCBsY2xfbWFzazsKKworICAgc3lzX21hc2sgPSBpbmIoc2hbal0tPmlvX3BvcnQgKyBSRUdfU1lTX01BU0spOworICAgbGNsX21hc2sgPSBpbmIoc2hbal0tPmlvX3BvcnQgKyBSRUdfTENMX01BU0spOworICAgcHJpbnRrKCJTWVNfTUFTSyAweCV4LCBMQ0xfTUFTSyAweCV4LlxuIiwgc3lzX21hc2ssIGxjbF9tYXNrKTsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBQcm9iYWJseSBhIGJvZ3VzIGhvc3Qgc2NzaSBpZCwgc2V0IGl0IHRvIHRoZSBkdW1teSB2YWx1ZSAqLworICAgaWYgKHNoW2pdLT50aGlzX2lkID09IDApIHNoW2pdLT50aGlzX2lkID0gLTE7CisKKyAgIC8qIElmIEJJT1MgaXMgZGlzYWJsZWQsIGZvcmNlIGVuYWJsZSBpbnRlcnJ1cHRzICovCisgICBpZiAoc2hbal0tPmJhc2UgPT0gMCkgb3V0YihDTURfRU5BX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX1NZU19NQVNLKTsKKworICAgbWVtc2V0KEhEKGopLCAwLCBzaXplb2Yoc3RydWN0IGhvc3RkYXRhKSk7CisgICBIRChqKS0+aGVhZHMgPSBtYXBwaW5nX3RhYmxlW2NvbmZpZ18yLm1hcHBpbmdfbW9kZV0uaGVhZHM7CisgICBIRChqKS0+c2VjdG9ycyA9IG1hcHBpbmdfdGFibGVbY29uZmlnXzIubWFwcGluZ19tb2RlXS5zZWN0b3JzOworICAgSEQoaiktPnN1YnZlcnNpb24gPSBzdWJ2ZXJzaW9uOworICAgSEQoaiktPnBkZXYgPSBOVUxMOworICAgSEQoaiktPmJvYXJkX251bWJlciA9IGo7CisKKyAgIGlmIChoYXZlX29sZF9maXJtd2FyZSkgc2hbal0tPnNnX3RhYmxlc2l6ZSA9IE1BWF9TQUZFX1NHTElTVDsKKworICAgaWYgKEhEKGopLT5zdWJ2ZXJzaW9uID09IEVTQSkgeworICAgICAgc2hbal0tPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7CisgICAgICBzaFtqXS0+ZG1hX2NoYW5uZWwgPSBOT19ETUE7CisgICAgICBzcHJpbnRmKEJOKGopLCAiVTM0RiVkIiwgaik7CisgICAgICBidXNfdHlwZSA9ICJWRVNBIjsKKyAgICAgIH0KKyAgIGVsc2UgeworICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgIHNoW2pdLT51bmNoZWNrZWRfaXNhX2RtYSA9IFRSVUU7CisKKyAgICAgIGZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisgICAgICBkaXNhYmxlX2RtYShkbWFfY2hhbm5lbCk7CisgICAgICBjbGVhcl9kbWFfZmYoZG1hX2NoYW5uZWwpOworICAgICAgc2V0X2RtYV9tb2RlKGRtYV9jaGFubmVsLCBETUFfTU9ERV9DQVNDQURFKTsKKyAgICAgIGVuYWJsZV9kbWEoZG1hX2NoYW5uZWwpOworICAgICAgcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKKyAgICAgIHNoW2pdLT5kbWFfY2hhbm5lbCA9IGRtYV9jaGFubmVsOworICAgICAgc3ByaW50ZihCTihqKSwgIlUxNEYlZCIsIGopOworICAgICAgYnVzX3R5cGUgPSAiSVNBIjsKKyAgICAgIH0KKworICAgc2hbal0tPm1heF9jaGFubmVsID0gTUFYX0NIQU5ORUwgLSAxOworICAgc2hbal0tPm1heF9pZCA9IE1BWF9UQVJHRVQ7CisgICBzaFtqXS0+bWF4X2x1biA9IE1BWF9MVU47CisKKyAgIGlmIChIRChqKS0+c3VidmVyc2lvbiA9PSBJU0EgJiYgIWJvYXJkX2lucXVpcnkoaikpIHsKKyAgICAgIEhEKGopLT5ib2FyZF9pZFs0MF0gPSAwOworCisgICAgICBpZiAoc3RyY21wKCZIRChqKS0+Ym9hcmRfaWRbMzJdLCAiMDYwMDA2MDAiKSkgeworICAgICAgICAgcHJpbnRrKCIlczogJXMuXG4iLCBCTihqKSwgJkhEKGopLT5ib2FyZF9pZFs4XSk7CisgICAgICAgICBwcmludGsoIiVzOiBmaXJtd2FyZSAlcyBpcyBvdXRkYXRlZCwgRlcgUFJPTSBzaG91bGQgYmUgMjgwMDQtMDA2LlxuIiwKKyAgICAgICAgICAgICAgICBCTihqKSwgJkhEKGopLT5ib2FyZF9pZFszMl0pOworICAgICAgICAgc2hbal0tPmhvc3R0LT51c2VfY2x1c3RlcmluZyA9IERJU0FCTEVfQ0xVU1RFUklORzsKKyAgICAgICAgIHNoW2pdLT5zZ190YWJsZXNpemUgPSBNQVhfU0FGRV9TR0xJU1Q7CisgICAgICAgICB9CisgICAgICB9CisKKyAgIGlmIChkbWFfY2hhbm5lbCA9PSBOT19ETUEpIHNwcmludGYoZG1hX25hbWUsICIlcyIsICJCTVNUIik7CisgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGRtYV9uYW1lLCAiRE1BICV1IiwgZG1hX2NoYW5uZWwpOworCisgICBzcGluX3VubG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKKworICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKKyAgICAgIEhEKGopLT5jcFtpXS5jcF9kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKEhEKGopLT5wZGV2LAorICAgICAgICAgICAgJkhEKGopLT5jcFtpXSwgc2l6ZW9mKHN0cnVjdCBtc2NwKSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKKyAgICAgIGlmICghICgoJkhEKGopLT5jcFtpXSktPnNnbGlzdCA9IGttYWxsb2MoCisgICAgICAgICAgICBzaFtqXS0+c2dfdGFibGVzaXplICogc2l6ZW9mKHN0cnVjdCBzZ19saXN0KSwKKyAgICAgICAgICAgIChzaFtqXS0+dW5jaGVja2VkX2lzYV9kbWEgPyBHRlBfRE1BIDogMCkgfCBHRlBfQVRPTUlDKSkpIHsKKyAgICAgICAgIHByaW50aygiJXM6IGttYWxsb2MgU0dsaXN0IGZhaWxlZCwgbWJveCAlZCwgZGV0YWNoaW5nLlxuIiwgQk4oaiksIGkpOworICAgICAgICAgZ290byByZWxlYXNlOworICAgICAgICAgfQorCisgICBpZiAobWF4X3F1ZXVlX2RlcHRoID4gTUFYX1RBR0dFRF9DTURfUEVSX0xVTikKKyAgICAgICBtYXhfcXVldWVfZGVwdGggPSBNQVhfVEFHR0VEX0NNRF9QRVJfTFVOOworCisgICBpZiAobWF4X3F1ZXVlX2RlcHRoIDwgTUFYX0NNRF9QRVJfTFVOKSBtYXhfcXVldWVfZGVwdGggPSBNQVhfQ01EX1BFUl9MVU47CisKKyAgIGlmICh0YWdfbW9kZSAhPSBUQUdfRElTQUJMRUQgJiYgdGFnX21vZGUgIT0gVEFHX1NJTVBMRSkKKyAgICAgIHRhZ19tb2RlID0gVEFHX09SREVSRUQ7CisKKyAgIGlmIChqID09IDApIHsKKyAgICAgIHByaW50aygiVWx0cmFTdG9yIDE0Ri8zNEY6IENvcHlyaWdodCAoQykgMTk5NC0yMDAzIERhcmlvIEJhbGxhYmlvLlxuIik7CisgICAgICBwcmludGsoIiVzIGNvbmZpZyBvcHRpb25zIC0+IG9mOiVjLCB0bTolZCwgbGM6JWMsIG1xOiVkLCBldDolYy5cbiIsCisgICAgICAgICAgICAgZHJpdmVyX25hbWUsIFlFU05PKGhhdmVfb2xkX2Zpcm13YXJlKSwgdGFnX21vZGUsCisgICAgICAgICAgICAgWUVTTk8obGlua2VkX2NvbW0pLCBtYXhfcXVldWVfZGVwdGgsIFlFU05PKGV4dF90cmFuKSk7CisgICAgICB9CisKKyAgIHByaW50aygiJXM6ICVzIDB4JTAzbHgsIEJJT1MgMHglMDV4LCBJUlEgJXUsICVzLCBTRyAlZCwgTUIgJWQuXG4iLAorICAgICAgICAgIEJOKGopLCBidXNfdHlwZSwgKHVuc2lnbmVkIGxvbmcpc2hbal0tPmlvX3BvcnQsIChpbnQpc2hbal0tPmJhc2UsCisgICAgICAgICAgc2hbal0tPmlycSwgZG1hX25hbWUsIHNoW2pdLT5zZ190YWJsZXNpemUsIHNoW2pdLT5jYW5fcXVldWUpOworCisgICBpZiAoc2hbal0tPm1heF9pZCA+IDggfHwgc2hbal0tPm1heF9sdW4gPiA4KQorICAgICAgcHJpbnRrKCIlczogd2lkZSBTQ1NJIHN1cHBvcnQgZW5hYmxlZCwgbWF4X2lkICV1LCBtYXhfbHVuICV1LlxuIiwKKyAgICAgICAgICAgICBCTihqKSwgc2hbal0tPm1heF9pZCwgc2hbal0tPm1heF9sdW4pOworCisgICBmb3IgKGkgPSAwOyBpIDw9IHNoW2pdLT5tYXhfY2hhbm5lbDsgaSsrKQorICAgICAgcHJpbnRrKCIlczogU0NTSSBjaGFubmVsICV1IGVuYWJsZWQsIGhvc3QgdGFyZ2V0IElEICVkLlxuIiwKKyAgICAgICAgICAgICBCTihqKSwgaSwgc2hbal0tPnRoaXNfaWQpOworCisgICByZXR1cm4gVFJVRTsKKworZnJlZWRtYToKKyAgIGlmIChzdWJ2ZXJzaW9uID09IElTQSkgZnJlZV9kbWEoZG1hX2NoYW5uZWwpOworZnJlZWlycToKKyAgIGZyZWVfaXJxKGlycSwgJnNoYVtqXSk7CitmcmVlbG9jazoKKyAgIHNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOworICAgcmVsZWFzZV9yZWdpb24ocG9ydF9iYXNlLCBSRUdJT05fU0laRSk7CitmYWlsOgorICAgcmV0dXJuIEZBTFNFOworCityZWxlYXNlOgorICAgdTE0XzM0Zl9yZWxlYXNlKHNoW2pdKTsKKyAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpIHsKKyAgIGludCBpLCBhcmdjID0gaW50c1swXTsKKyAgIGNoYXIgKmN1ciA9IHN0ciwgKnBjOworCisgICBpZiAoYXJnYyA+IDApIHsKKworICAgICAgaWYgKGFyZ2MgPiBNQVhfSU5UX1BBUkFNKSBhcmdjID0gTUFYX0lOVF9QQVJBTTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgaW9fcG9ydFtpXSA9IGludHNbaSArIDFdOworCisgICAgICBpb19wb3J0W2ldID0gMDsKKyAgICAgIHNldHVwX2RvbmUgPSBUUlVFOworICAgICAgfQorCisgICB3aGlsZSAoY3VyICYmIChwYyA9IHN0cmNocihjdXIsICc6JykpKSB7CisgICAgICBpbnQgdmFsID0gMCwgYyA9ICorK3BjOworCisgICAgICBpZiAoYyA9PSAnbicgfHwgYyA9PSAnTicpIHZhbCA9IEZBTFNFOworICAgICAgZWxzZSBpZiAoYyA9PSAneScgfHwgYyA9PSAnWScpIHZhbCA9IFRSVUU7CisgICAgICBlbHNlIHZhbCA9IChpbnQpIHNpbXBsZV9zdHJ0b3VsKHBjLCBOVUxMLCAwKTsKKworICAgICAgaWYgKCFzdHJuY21wKGN1ciwgImxjOiIsIDMpKSBsaW5rZWRfY29tbSA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGN1ciwgIm9mOiIsIDMpKSBoYXZlX29sZF9maXJtd2FyZSA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGN1ciwgInRtOiIsIDMpKSB0YWdfbW9kZSA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGN1ciwgInRjOiIsIDMpKSB0YWdfbW9kZSA9IHZhbDsKKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGN1ciwgIm1xOiIsIDMpKSAgbWF4X3F1ZXVlX2RlcHRoID0gdmFsOworICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAibHM6IiwgMykpICBsaW5rX3N0YXRpc3RpY3MgPSB2YWw7CisgICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJldDoiLCAzKSkgIGV4dF90cmFuID0gdmFsOworCisgICAgICBpZiAoKGN1ciA9IHN0cmNocihjdXIsICcsJykpKSArK2N1cjsKKyAgICAgIH0KKworICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IG9wdGlvbl9zZXR1cChjaGFyICpzdHIpIHsKKyAgIGludCBpbnRzW01BWF9JTlRfUEFSQU1dOworICAgY2hhciAqY3VyID0gc3RyOworICAgaW50IGkgPSAxOworCisgICB3aGlsZSAoY3VyICYmIGlzZGlnaXQoKmN1cikgJiYgaSA8PSBNQVhfSU5UX1BBUkFNKSB7CisgICAgICBpbnRzW2krK10gPSBzaW1wbGVfc3RydG91bChjdXIsIE5VTEwsIDApOworCisgICAgICBpZiAoKGN1ciA9IHN0cmNocihjdXIsICcsJykpICE9IE5VTEwpIGN1cisrOworICAgfQorCisgICBpbnRzWzBdID0gaSAtIDE7CisgICBpbnRlcm5hbF9zZXR1cChjdXIsIGludHMpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdTE0XzM0Zl9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkgeworICAgdW5zaWduZWQgaW50IGogPSAwLCBrOworCisgICB0cG50LT5wcm9jX25hbWUgPSAidTE0LTM0ZiI7CisKKyAgIGlmKHN0cmxlbihib290X29wdGlvbnMpKSBvcHRpb25fc2V0dXAoYm9vdF9vcHRpb25zKTsKKworI2lmIGRlZmluZWQoTU9EVUxFKQorICAgLyogaW9fcG9ydCBjb3VsZCBoYXZlIGJlZW4gbW9kaWZpZWQgd2hlbiBsb2FkaW5nIGFzIGEgbW9kdWxlICovCisgICBpZihpb19wb3J0WzBdICE9IFNLSVApIHsKKyAgICAgIHNldHVwX2RvbmUgPSBUUlVFOworICAgICAgaW9fcG9ydFtNQVhfSU5UX1BBUkFNXSA9IDA7CisgICAgICB9CisjZW5kaWYKKworICAgZm9yIChrID0gMDsgayA8IE1BWF9CT0FSRFMgKyAxOyBrKyspIHNoW2tdID0gTlVMTDsKKworICAgZm9yIChrID0gMDsgaW9fcG9ydFtrXTsgaysrKSB7CisKKyAgICAgIGlmIChpb19wb3J0W2tdID09IFNLSVApIGNvbnRpbnVlOworCisgICAgICBpZiAoaiA8IE1BWF9CT0FSRFMgJiYgcG9ydF9kZXRlY3QoaW9fcG9ydFtrXSwgaiwgdHBudCkpIGorKzsKKyAgICAgIH0KKworICAgbnVtX2JvYXJkcyA9IGo7CisgICByZXR1cm4gajsKK30KKworc3RhdGljIHZvaWQgbWFwX2RtYSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopIHsKKyAgIHVuc2lnbmVkIGludCBkYXRhX2xlbiA9IDA7CisgICB1bnNpZ25lZCBpbnQgaywgY291bnQsIHBjaV9kaXI7CisgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50OworICAgc3RydWN0IG1zY3AgKmNwcDsKKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisgICBjcHAgPSAmSEQoaiktPmNwW2ldOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisgICBwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisgICBpZiAoU0NwbnQtPnNlbnNlX2J1ZmZlcikKKyAgICAgIGNwcC0+c2Vuc2VfYWRkciA9IEgyREVWKHBjaV9tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBTQ3BudC0+c2Vuc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIFNDcG50LT5zZW5zZV9idWZmZXIsIFBDSV9ETUFfRlJPTURFVklDRSkpOworCisgICBjcHAtPnNlbnNlX2xlbiA9IHNpemVvZiBTQ3BudC0+c2Vuc2VfYnVmZmVyOworCisgICBpZiAoIVNDcG50LT51c2Vfc2cpIHsKKworICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBQQ0lfRE1BX05PTkUsIHBjaV9tYXBfc2luZ2xlIHRyaWdnZXJzIGEgQlVHKCkgKi8KKyAgICAgIGlmICghU0NwbnQtPnJlcXVlc3RfYnVmZmxlbikgcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKKworICAgICAgaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZlcikKKyAgICAgICAgIGNwcC0+ZGF0YV9hZGRyZXNzID0gSDJERVYocGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsCisgICAgICAgICAgICAgICAgICBTQ3BudC0+cmVxdWVzdF9idWZmZXIsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIHBjaV9kaXIpKTsKKworICAgICAgY3BwLT5kYXRhX2xlbiA9IEgyREVWKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworICAgICAgcmV0dXJuOworICAgICAgfQorCisgICBzZ3BudCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworICAgY291bnQgPSBwY2lfbWFwX3NnKEhEKGopLT5wZGV2LCBzZ3BudCwgU0NwbnQtPnVzZV9zZywgcGNpX2Rpcik7CisKKyAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CisgICAgICBjcHAtPnNnbGlzdFtrXS5hZGRyZXNzID0gSDJERVYoc2dfZG1hX2FkZHJlc3MoJnNncG50W2tdKSk7CisgICAgICBjcHAtPnNnbGlzdFtrXS5udW1fYnl0ZXMgPSBIMkRFVihzZ19kbWFfbGVuKCZzZ3BudFtrXSkpOworICAgICAgZGF0YV9sZW4gKz0gc2dwbnRba10ubGVuZ3RoOworICAgICAgfQorCisgICBjcHAtPnNnID0gVFJVRTsKKyAgIGNwcC0+dXNlX3NnID0gU0NwbnQtPnVzZV9zZzsKKyAgIGNwcC0+ZGF0YV9hZGRyZXNzID0gSDJERVYocGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsIGNwcC0+c2dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ3BudC0+dXNlX3NnICogc2l6ZW9mKHN0cnVjdCBzZ19saXN0KSwgcGNpX2RpcikpOworICAgY3BwLT5kYXRhX2xlbiA9IEgyREVWKGRhdGFfbGVuKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXBfZG1hKHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgaikgeworICAgdW5zaWduZWQgaW50IHBjaV9kaXI7CisgICBzdHJ1Y3QgbXNjcCAqY3BwOworICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKyAgIGNwcCA9ICZIRChqKS0+Y3BbaV07IFNDcG50ID0gY3BwLT5TQ3BudDsKKyAgIHBjaV9kaXIgPSBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKyAgIGlmIChERVYySChjcHAtPnNlbnNlX2FkZHIpKQorICAgICAgcGNpX3VubWFwX3NpbmdsZShIRChqKS0+cGRldiwgREVWMkgoY3BwLT5zZW5zZV9hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5zZW5zZV9sZW4pLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisgICBpZiAoU0NwbnQtPnVzZV9zZykKKyAgICAgIHBjaV91bm1hcF9zZyhIRChqKS0+cGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+dXNlX3NnLCBwY2lfZGlyKTsKKworICAgaWYgKCFERVYySChjcHAtPmRhdGFfbGVuKSkgcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKKworICAgaWYgKERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSkKKyAgICAgIHBjaV91bm1hcF9zaW5nbGUoSEQoaiktPnBkZXYsIERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5kYXRhX2xlbiksIHBjaV9kaXIpOworfQorCitzdGF0aWMgdm9pZCBzeW5jX2RtYSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopIHsKKyAgIHVuc2lnbmVkIGludCBwY2lfZGlyOworICAgc3RydWN0IG1zY3AgKmNwcDsKKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworCisgICBjcHAgPSAmSEQoaiktPmNwW2ldOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisgICBwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCisgICBpZiAoREVWMkgoY3BwLT5zZW5zZV9hZGRyKSkKKyAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShIRChqKS0+cGRldiwgREVWMkgoY3BwLT5zZW5zZV9hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5zZW5zZV9sZW4pLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisgICBpZiAoU0NwbnQtPnVzZV9zZykKKyAgICAgIHBjaV9kbWFfc3luY19zZ19mb3JfY3B1KEhEKGopLT5wZGV2LCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NwbnQtPnVzZV9zZywgcGNpX2Rpcik7CisKKyAgIGlmICghREVWMkgoY3BwLT5kYXRhX2xlbikpIHBjaV9kaXIgPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7CisKKyAgIGlmIChERVYySChjcHAtPmRhdGFfYWRkcmVzcykpCisgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoSEQoaiktPnBkZXYsIERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5kYXRhX2xlbiksIHBjaV9kaXIpOworfQorCitzdGF0aWMgdm9pZCBzY3NpX3RvX2Rldl9kaXIodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7CisgICB1bnNpZ25lZCBpbnQgazsKKworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9vdXRfY21kc1tdID0geworICAgICAgMHgwYSwgMHgyYSwgMHgxNSwgMHg1NSwgMHgwNCwgMHgwNywgMHgxOCwgMHgxZCwgMHgyNCwgMHgyZSwKKyAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2QsIDB4M2YsIDB4NDAsCisgICAgICAweDQxLCAweDRjLCAweGFhLCAweGFlLCAweGIwLCAweGIxLCAweGIyLCAweGI2LCAweGVhLCAweDFiLCAweDVkCisgICAgICB9OworCisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXRhX25vbmVfY21kc1tdID0geworICAgICAgMHgwMSwgMHgwYiwgMHgxMCwgMHgxMSwgMHgxMywgMHgxNiwgMHgxNywgMHgxOSwgMHgyYiwgMHgxZSwKKyAgICAgIDB4MmMsIDB4YWMsIDB4MmYsIDB4YWYsIDB4MzMsIDB4YjMsIDB4MzUsIDB4MzYsIDB4NDUsIDB4NDcsCisgICAgICAweDQ4LCAweDQ5LCAweGE5LCAweDRiLCAweGE1LCAweGE2LCAweGI1LCAweDAwCisgICAgICB9OworCisgICBzdHJ1Y3QgbXNjcCAqY3BwOworICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisKKyAgIGNwcCA9ICZIRChqKS0+Y3BbaV07IFNDcG50ID0gY3BwLT5TQ3BudDsKKworICAgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKyAgICAgIGNwcC0+eGRpciA9IERURF9JTjsKKyAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgIGVsc2UgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKyAgICAgIGNwcC0+eGRpciA9IERURF9PVVQ7CisgICAgICByZXR1cm47CisgICAgICB9CisgICBlbHNlIGlmIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX05PTkUpIHsKKyAgICAgIGNwcC0+eGRpciA9IERURF9OT05FOworICAgICAgcmV0dXJuOworICAgICAgfQorCisgICBpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uICE9IERNQV9CSURJUkVDVElPTkFMKQorICAgICAgcGFuaWMoIiVzOiBxY29tbSwgaW52YWxpZCBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24uXG4iLCBCTihqKSk7CisKKyAgIGNwcC0+eGRpciA9IERURF9JTjsKKworICAgZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUoZGF0YV9vdXRfY21kcyk7IGsrKykKKyAgICAgIGlmIChTQ3BudC0+Y21uZFswXSA9PSBkYXRhX291dF9jbWRzW2tdKSB7CisgICAgICAgICBjcHAtPnhkaXIgPSBEVERfT1VUOworICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisKKyAgIGlmIChjcHAtPnhkaXIgPT0gRFREX0lOKQorICAgICAgZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUoZGF0YV9ub25lX2NtZHMpOyBrKyspCisgICAgICAgICBpZiAoU0NwbnQtPmNtbmRbMF0gPT0gZGF0YV9ub25lX2NtZHNba10pIHsKKyAgICAgICAgICAgIGNwcC0+eGRpciA9IERURF9OT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKK30KKworc3RhdGljIGludCB1MTRfMzRmX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpIHsKKyAgIHVuc2lnbmVkIGludCBpLCBqLCBrOworICAgc3RydWN0IG1zY3AgKmNwcDsKKworICAgLyogaiBpcyB0aGUgYm9hcmQgbnVtYmVyICovCisgICBqID0gKChzdHJ1Y3QgaG9zdGRhdGEgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpLT5ib2FyZF9udW1iZXI7CisKKyAgIGlmIChTQ3BudC0+aG9zdF9zY3JpYmJsZSkKKyAgICAgIHBhbmljKCIlczogcWNvbW0sIHBpZCAlbGQsIFNDcG50ICVwIGFscmVhZHkgYWN0aXZlLlxuIiwKKyAgICAgICAgICAgIEJOKGopLCBTQ3BudC0+cGlkLCBTQ3BudCk7CisKKyAgIC8qIGkgaXMgdGhlIG1haWxib3ggbnVtYmVyLCBsb29rIGZvciB0aGUgZmlyc3QgZnJlZSBtYWlsYm94CisgICAgICBzdGFydGluZyBmcm9tIGxhc3RfY3BfdXNlZCAqLworICAgaSA9IEhEKGopLT5sYXN0X2NwX3VzZWQgKyAxOworCisgICBmb3IgKGsgPSAwOyBrIDwgc2hbal0tPmNhbl9xdWV1ZTsgaysrLCBpKyspIHsKKworICAgICAgaWYgKGkgPj0gc2hbal0tPmNhbl9xdWV1ZSkgaSA9IDA7CisKKyAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBGUkVFKSB7CisgICAgICAgICBIRChqKS0+bGFzdF9jcF91c2VkID0gaTsKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgfQorCisgICBpZiAoayA9PSBzaFtqXS0+Y2FuX3F1ZXVlKSB7CisgICAgICBwcmludGsoIiVzOiBxY29tbSwgbm8gZnJlZSBtYWlsYm94LlxuIiwgQk4oaikpOworICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgIC8qIFNldCBwb2ludGVyIHRvIGNvbnRyb2wgcGFja2V0IHN0cnVjdHVyZSAqLworICAgY3BwID0gJkhEKGopLT5jcFtpXTsKKworICAgbWVtc2V0KGNwcCwgMCwgc2l6ZW9mKHN0cnVjdCBtc2NwKSAtIENQX1RBSUxfU0laRSk7CisgICBTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKyAgIGNwcC0+Y3BwX2luZGV4ID0gaTsKKyAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgJmNwcC0+Y3BwX2luZGV4OworCisgICBpZiAoZG9fdHJhY2UpIHByaW50aygiJXM6IHFjb21tLCBtYm94ICVkLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgQk4oaiksIGksIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgU0NwbnQtPmRldmljZS0+bHVuLCBTQ3BudC0+cGlkKTsKKworICAgY3BwLT5vcGNvZGUgPSBPUF9TQ1NJOworICAgY3BwLT5jaGFubmVsID0gU0NwbnQtPmRldmljZS0+Y2hhbm5lbDsKKyAgIGNwcC0+dGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisgICBjcHAtPmx1biA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKyAgIGNwcC0+U0NwbnQgPSBTQ3BudDsKKyAgIGNwcC0+Y2RiX2xlbiA9IFNDcG50LT5jbWRfbGVuOworICAgbWVtY3B5KGNwcC0+Y2RiLCBTQ3BudC0+Y21uZCwgU0NwbnQtPmNtZF9sZW4pOworCisgICAvKiBVc2UgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uICovCisgICBzY3NpX3RvX2Rldl9kaXIoaSwgaik7CisKKyAgIC8qIE1hcCBETUEgYnVmZmVycyBhbmQgU0cgbGlzdCAqLworICAgbWFwX2RtYShpLCBqKTsKKworICAgaWYgKGxpbmtlZF9jb21tICYmIFNDcG50LT5kZXZpY2UtPnF1ZXVlX2RlcHRoID4gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFRMREVWKFNDcG50LT5kZXZpY2UtPnR5cGUpKSB7CisgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IFJFQURZOworICAgICAgZmx1c2hfZGV2KFNDcG50LT5kZXZpY2UsIFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IsIGosIEZBTFNFKTsKKyAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCBNQVhMT09QKSkgeworICAgICAgdW5tYXBfZG1hKGksIGopOworICAgICAgU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgICAgcHJpbnRrKCIlczogcWNvbW0sIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCwgYWRhcHRlciBidXN5LlxuIiwKKyAgICAgICAgICAgICBCTihqKSwgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1biwgU0NwbnQtPnBpZCk7CisgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgLyogU3RvcmUgcG9pbnRlciBpbiBPR00gYWRkcmVzcyBieXRlcyAqLworICAgb3V0bChIMkRFVihjcHAtPmNwX2RtYV9hZGRyKSwgc2hbal0tPmlvX3BvcnQgKyBSRUdfT0dNKTsKKworICAgLyogSXNzdWUgT0dNIGludGVycnVwdCAqLworICAgb3V0YihDTURfT0dNX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX0xDTF9JTlRSKTsKKworICAgSEQoaiktPmNwX3N0YXRbaV0gPSBJTl9VU0U7CisgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1MTRfMzRmX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDYXJnKSB7CisgICB1bnNpZ25lZCBpbnQgaSwgajsKKworICAgaiA9ICgoc3RydWN0IGhvc3RkYXRhICopIFNDYXJnLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+Ym9hcmRfbnVtYmVyOworCisgICBpZiAoU0NhcmctPmhvc3Rfc2NyaWJibGUgPT0gTlVMTCkgeworICAgICAgcHJpbnRrKCIlczogYWJvcnQsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZCBpbmFjdGl2ZS5cbiIsCisgICAgICAgICAgICAgQk4oaiksIFNDYXJnLT5kZXZpY2UtPmNoYW5uZWwsIFNDYXJnLT5kZXZpY2UtPmlkLCBTQ2FyZy0+ZGV2aWNlLT5sdW4sIFNDYXJnLT5waWQpOworICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgICB9CisKKyAgIGkgPSAqKHVuc2lnbmVkIGludCAqKVNDYXJnLT5ob3N0X3NjcmliYmxlOworICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQsIHRhcmdldCAlZC4lZDolZCwgcGlkICVsZC5cbiIsCisgICAgICAgICAgQk4oaiksIGksIFNDYXJnLT5kZXZpY2UtPmNoYW5uZWwsIFNDYXJnLT5kZXZpY2UtPmlkLCBTQ2FyZy0+ZGV2aWNlLT5sdW4sIFNDYXJnLT5waWQpOworCisgICBpZiAoaSA+PSBzaFtqXS0+Y2FuX3F1ZXVlKQorICAgICAgcGFuaWMoIiVzOiBhYm9ydCwgaW52YWxpZCBTQ2FyZy0+aG9zdF9zY3JpYmJsZS5cbiIsIEJOKGopKTsKKworICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKKyAgICAgIHByaW50aygiJXM6IGFib3J0LCB0aW1lb3V0IGVycm9yLlxuIiwgQk4oaikpOworICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgIH0KKworICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKKyAgICAgIHByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGZyZWUuXG4iLCBCTihqKSwgaSk7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICAgIH0KKworICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IElOX1VTRSkgeworICAgICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgaW4gdXNlLlxuIiwgQk4oaiksIGkpOworCisgICAgICBpZiAoU0NhcmcgIT0gSEQoaiktPmNwW2ldLlNDcG50KQorICAgICAgICAgcGFuaWMoIiVzOiBhYm9ydCwgbWJveCAlZCwgU0NhcmcgJXAsIGNwIFNDcG50ICVwLlxuIiwKKyAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ2FyZywgSEQoaiktPmNwW2ldLlNDcG50KTsKKworICAgICAgaWYgKGluYihzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUikgJiBJUlFfQVNTRVJURUQpCisgICAgICAgICBwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCwgaW50ZXJydXB0IHBlbmRpbmcuXG4iLCBCTihqKSwgaSk7CisKKyAgICAgIGlmIChTQ2FyZy0+ZWhfc3RhdGUgPT0gU0NTSV9TVEFURV9USU1FT1VUKSB7CisgICAgICAgICB1bm1hcF9kbWEoaSwgaik7CisgICAgICAgICBTQ2FyZy0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisgICAgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisgICAgICAgICBwcmludGsoIiVzLCBhYm9ydCwgbWJveCAlZCwgZWhfc3RhdGUgdGltZW91dCwgcGlkICVsZC5cbiIsCisgICAgICAgICAgICAgICAgQk4oaiksIGksIFNDYXJnLT5waWQpOworICAgICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgICAgICB9CisKKyAgICAgIHJldHVybiBGQUlMRUQ7CisgICAgICB9CisKKyAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBJTl9SRVNFVCkgeworICAgICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgaW4gcmVzZXQuXG4iLCBCTihqKSwgaSk7CisgICAgICByZXR1cm4gRkFJTEVEOworICAgICAgfQorCisgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gTE9DS0VEKSB7CisgICAgICBwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCBpcyBsb2NrZWQuXG4iLCBCTihqKSwgaSk7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICAgIH0KKworICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IFJFQURZIHx8IEhEKGopLT5jcF9zdGF0W2ldID09IEFCT1JUSU5HKSB7CisgICAgICB1bm1hcF9kbWEoaSwgaik7CisgICAgICBTQ2FyZy0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworICAgICAgU0NhcmctPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOworICAgICAgcHJpbnRrKCIlcywgYWJvcnQsIG1ib3ggJWQgcmVhZHksIERJRF9BQk9SVCwgcGlkICVsZCBkb25lLlxuIiwKKyAgICAgICAgICAgICBCTihqKSwgaSwgU0NhcmctPnBpZCk7CisgICAgICBTQ2FyZy0+c2NzaV9kb25lKFNDYXJnKTsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgfQorCisgICBwYW5pYygiJXM6IGFib3J0LCBtYm94ICVkLCBpbnZhbGlkIGNwX3N0YXQuXG4iLCBCTihqKSwgaSk7Cit9CisKK3N0YXRpYyBpbnQgdTE0XzM0Zl9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDYXJnKSB7CisgICB1bnNpZ25lZCBpbnQgaSwgaiwgdGltZSwgaywgYywgbGltaXQgPSAwOworICAgaW50IGFyZ19kb25lID0gRkFMU0U7CisgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKworICAgaiA9ICgoc3RydWN0IGhvc3RkYXRhICopIFNDYXJnLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+Ym9hcmRfbnVtYmVyOworICAgcHJpbnRrKCIlczogcmVzZXQsIGVudGVyLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQuXG4iLAorICAgICAgICAgIEJOKGopLCBTQ2FyZy0+ZGV2aWNlLT5jaGFubmVsLCBTQ2FyZy0+ZGV2aWNlLT5pZCwgU0NhcmctPmRldmljZS0+bHVuLCBTQ2FyZy0+cGlkKTsKKworICAgaWYgKFNDYXJnLT5ob3N0X3NjcmliYmxlID09IE5VTEwpCisgICAgICBwcmludGsoIiVzOiByZXNldCwgcGlkICVsZCBpbmFjdGl2ZS5cbiIsIEJOKGopLCBTQ2FyZy0+cGlkKTsKKworICAgaWYgKEhEKGopLT5pbl9yZXNldCkgeworICAgICAgcHJpbnRrKCIlczogcmVzZXQsIGV4aXQsIGFscmVhZHkgaW4gcmVzZXQuXG4iLCBCTihqKSk7CisgICAgICByZXR1cm4gRkFJTEVEOworICAgICAgfQorCisgICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCBNQVhMT09QKSkgeworICAgICAgcHJpbnRrKCIlczogcmVzZXQsIGV4aXQsIHRpbWVvdXQgZXJyb3IuXG4iLCBCTihqKSk7CisgICAgICByZXR1cm4gRkFJTEVEOworICAgICAgfQorCisgICBIRChqKS0+cmV0cmllcyA9IDA7CisKKyAgIGZvciAoYyA9IDA7IGMgPD0gc2hbal0tPm1heF9jaGFubmVsOyBjKyspCisgICAgICBmb3IgKGsgPSAwOyBrIDwgc2hbal0tPm1heF9pZDsgaysrKSB7CisgICAgICAgICBIRChqKS0+dGFyZ2V0X3JlZG9ba11bY10gPSBUUlVFOworICAgICAgICAgSEQoaiktPnRhcmdldF90b1trXVtjXSA9IDA7CisgICAgICAgICB9CisKKyAgIGZvciAoaSA9IDA7IGkgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBpKyspIHsKKworICAgICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEZSRUUpIGNvbnRpbnVlOworCisgICAgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gTE9DS0VEKSB7CisgICAgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisgICAgICAgICBwcmludGsoIiVzOiByZXNldCwgbG9ja2VkIG1ib3ggJWQgZm9yY2VkIGZyZWUuXG4iLCBCTihqKSwgaSk7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKCEoU0NwbnQgPSBIRChqKS0+Y3BbaV0uU0NwbnQpKQorICAgICAgICAgcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgU0NwbnQgPT0gTlVMTC5cbiIsIEJOKGopLCBpKTsKKworICAgICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IFJFQURZIHx8IEhEKGopLT5jcF9zdGF0W2ldID09IEFCT1JUSU5HKSB7CisgICAgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEFCT1JUSU5HOworICAgICAgICAgcHJpbnRrKCIlczogcmVzZXQsIG1ib3ggJWQgYWJvcnRpbmcsIHBpZCAlbGQuXG4iLAorICAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ3BudC0+cGlkKTsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSB7CisgICAgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IElOX1JFU0VUOworICAgICAgICAgcHJpbnRrKCIlczogcmVzZXQsIG1ib3ggJWQgaW4gcmVzZXQsIHBpZCAlbGQuXG4iLAorICAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ3BudC0+cGlkKTsKKyAgICAgICAgIH0KKworICAgICAgaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlID09IE5VTEwpCisgICAgICAgICBwYW5pYygiJXM6IHJlc2V0LCBtYm94ICVkLCBnYXJibGVkIFNDcG50LlxuIiwgQk4oaiksIGkpOworCisgICAgICBpZiAoKih1bnNpZ25lZCBpbnQgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSAhPSBpKQorICAgICAgICAgcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgaW5kZXggbWlzbWF0Y2guXG4iLCBCTihqKSwgaSk7CisKKyAgICAgIGlmIChTQ3BudC0+c2NzaV9kb25lID09IE5VTEwpCisgICAgICAgICBwYW5pYygiJXM6IHJlc2V0LCBtYm94ICVkLCBTQ3BudC0+c2NzaV9kb25lID09IE5VTEwuXG4iLCBCTihqKSwgaSk7CisKKyAgICAgIGlmIChTQ3BudCA9PSBTQ2FyZykgYXJnX2RvbmUgPSBUUlVFOworICAgICAgfQorCisgICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCBNQVhMT09QKSkgeworICAgICAgcHJpbnRrKCIlczogcmVzZXQsIGNhbm5vdCByZXNldCwgdGltZW91dCBlcnJvci5cbiIsIEJOKGopKTsKKyAgICAgIHJldHVybiBGQUlMRUQ7CisgICAgICB9CisKKyAgIG91dGIoQ01EX1JFU0VULCBzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfSU5UUik7CisgICBwcmludGsoIiVzOiByZXNldCwgYm9hcmQgcmVzZXQgZG9uZSwgZW5hYmxpbmcgaW50ZXJydXB0cy5cbiIsIEJOKGopKTsKKworI2lmIGRlZmluZWQoREVCVUdfUkVTRVQpCisgICBkb190cmFjZSA9IFRSVUU7CisjZW5kaWYKKworICAgSEQoaiktPmluX3Jlc2V0ID0gVFJVRTsKKworICAgc3Bpbl91bmxvY2tfaXJxKHNoW2pdLT5ob3N0X2xvY2spOworICAgdGltZSA9IGppZmZpZXM7CisgICB3aGlsZSAoKGppZmZpZXMgLSB0aW1lKSA8ICgxMCAqIEhaKSAmJiBsaW1pdCsrIDwgMjAwMDAwKSB1ZGVsYXkoMTAwTCk7CisgICBzcGluX2xvY2tfaXJxKHNoW2pdLT5ob3N0X2xvY2spOworCisgICBwcmludGsoIiVzOiByZXNldCwgaW50ZXJydXB0cyBkaXNhYmxlZCwgbG9vcHMgJWQuXG4iLCBCTihqKSwgbGltaXQpOworCisgICBmb3IgKGkgPSAwOyBpIDwgc2hbal0tPmNhbl9xdWV1ZTsgaSsrKSB7CisKKyAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBJTl9SRVNFVCkgeworICAgICAgICAgU0NwbnQgPSBIRChqKS0+Y3BbaV0uU0NwbnQ7CisgICAgICAgICB1bm1hcF9kbWEoaSwgaik7CisgICAgICAgICBTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworICAgICAgICAgU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisgICAgICAgICAvKiBUaGlzIG1haWxib3ggaXMgc3RpbGwgd2FpdGluZyBmb3IgaXRzIGludGVycnVwdCAqLworICAgICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBMT0NLRUQ7CisKKyAgICAgICAgIHByaW50aygiJXMsIHJlc2V0LCBtYm94ICVkIGxvY2tlZCwgRElEX1JFU0VULCBwaWQgJWxkIGRvbmUuXG4iLAorICAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ3BudC0+cGlkKTsKKyAgICAgICAgIH0KKworICAgICAgZWxzZSBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gQUJPUlRJTkcpIHsKKyAgICAgICAgIFNDcG50ID0gSEQoaiktPmNwW2ldLlNDcG50OworICAgICAgICAgdW5tYXBfZG1hKGksIGopOworICAgICAgICAgU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKyAgICAgICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworICAgICAgICAgLyogVGhpcyBtYWlsYm94IHdhcyBuZXZlciBxdWV1ZWQgdG8gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKKworICAgICAgICAgcHJpbnRrKCIlcywgcmVzZXQsIG1ib3ggJWQgYWJvcnRpbmcsIERJRF9SRVNFVCwgcGlkICVsZCBkb25lLlxuIiwKKyAgICAgICAgICAgICAgICBCTihqKSwgaSwgU0NwbnQtPnBpZCk7CisgICAgICAgICB9CisKKyAgICAgIGVsc2UKKworICAgICAgICAgLyogQW55IG90aGVyIG1haWxib3ggaGFzIGFscmVhZHkgYmVlbiBzZXQgZnJlZSBieSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgIGNvbnRpbnVlOworCisgICAgICBTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKKyAgICAgIH0KKworICAgSEQoaiktPmluX3Jlc2V0ID0gRkFMU0U7CisgICBkb190cmFjZSA9IEZBTFNFOworCisgICBpZiAoYXJnX2RvbmUpIHByaW50aygiJXM6IHJlc2V0LCBleGl0LCBwaWQgJWxkIGRvbmUuXG4iLCBCTihqKSwgU0NhcmctPnBpZCk7CisgICBlbHNlICAgICAgICAgIHByaW50aygiJXM6IHJlc2V0LCBleGl0LlxuIiwgQk4oaikpOworCisgICByZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB1MTRfMzRmX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpkaXNrLAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICpka2luZm8pIHsKKyAgIHVuc2lnbmVkIGludCBqID0gMDsKKyAgIHVuc2lnbmVkIGludCBzaXplID0gY2FwYWNpdHk7CisKKyAgIGRraW5mb1swXSA9IEhEKGopLT5oZWFkczsKKyAgIGRraW5mb1sxXSA9IEhEKGopLT5zZWN0b3JzOworICAgZGtpbmZvWzJdID0gc2l6ZSAvIChIRChqKS0+aGVhZHMgKiBIRChqKS0+c2VjdG9ycyk7CisKKyAgIGlmIChleHRfdHJhbiAmJiAoc2NzaWNhbV9iaW9zX3BhcmFtKGJkZXYsIGNhcGFjaXR5LCBka2luZm8pIDwgMCkpIHsKKyAgICAgIGRraW5mb1swXSA9IDI1NTsKKyAgICAgIGRraW5mb1sxXSA9IDYzOworICAgICAgZGtpbmZvWzJdID0gc2l6ZSAvIChka2luZm9bMF0gKiBka2luZm9bMV0pOworICAgICAgfQorCisjaWYgZGVmaW5lZCAoREVCVUdfR0VPTUVUUlkpCisgICBwcmludGsgKCIlczogYmlvc19wYXJhbSwgaGVhZD0lZCwgc2VjPSVkLCBjeWw9JWQuXG4iLCBkcml2ZXJfbmFtZSwKKyAgICAgICAgICAgZGtpbmZvWzBdLCBka2luZm9bMV0sIGRraW5mb1syXSk7CisjZW5kaWYKKworICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZCBzb3J0KHVuc2lnbmVkIGxvbmcgc2tbXSwgdW5zaWduZWQgaW50IGRhW10sIHVuc2lnbmVkIGludCBuLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmV2KSB7CisgICB1bnNpZ25lZCBpbnQgaSwgaiwgaywgeTsKKyAgIHVuc2lnbmVkIGxvbmcgeDsKKworICAgZm9yIChpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKKyAgICAgIGsgPSBpOworCisgICAgICBmb3IgKGogPSBrICsgMTsgaiA8IG47IGorKykKKyAgICAgICAgIGlmIChyZXYpIHsKKyAgICAgICAgICAgIGlmIChza1tqXSA+IHNrW2tdKSBrID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHNrW2pdIDwgc2tba10pIGsgPSBqOworICAgICAgICAgICAgfQorCisgICAgICBpZiAoayAhPSBpKSB7CisgICAgICAgICB4ID0gc2tba107IHNrW2tdID0gc2tbaV07IHNrW2ldID0geDsKKyAgICAgICAgIHkgPSBkYVtrXTsgZGFba10gPSBkYVtpXTsgZGFbaV0gPSB5OworICAgICAgICAgfQorICAgICAgfQorCisgICByZXR1cm47CisgICB9CisKK3N0YXRpYyBpbnQgcmVvcmRlcih1bnNpZ25lZCBpbnQgaiwgdW5zaWduZWQgbG9uZyBjdXJzZWMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpaGRsciwgdW5zaWduZWQgaW50IGlsW10sIHVuc2lnbmVkIGludCBuX3JlYWR5KSB7CisgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKKyAgIHN0cnVjdCBtc2NwICpjcHA7CisgICB1bnNpZ25lZCBpbnQgaywgbjsKKyAgIHVuc2lnbmVkIGludCByZXYgPSBGQUxTRSwgcyA9IFRSVUUsIHIgPSBUUlVFOworICAgdW5zaWduZWQgaW50IGlucHV0X29ubHkgPSBUUlVFLCBvdmVybGFwID0gRkFMU0U7CisgICB1bnNpZ25lZCBsb25nIHNsW25fcmVhZHldLCBwbFtuX3JlYWR5XSwgbGxbbl9yZWFkeV07CisgICB1bnNpZ25lZCBsb25nIG1heHNlYyA9IDAsIG1pbnNlYyA9IFVMT05HX01BWCwgc2VlayA9IDAsIGlzZWVrID0gMDsKKyAgIHVuc2lnbmVkIGxvbmcgaW9zZWVrID0gMDsKKworICAgc3RhdGljIHVuc2lnbmVkIGludCBmbHVzaGNvdW50ID0gMCwgYmF0Y2hjb3VudCA9IDAsIHNvcnRjb3VudCA9IDA7CisgICBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWR5Y291bnQgPSAwLCBvdmxjb3VudCA9IDAsIGlucHV0Y291bnQgPSAwOworICAgc3RhdGljIHVuc2lnbmVkIGludCByZWFkeXNvcnRlZCA9IDAsIHJldmNvdW50ID0gMDsKKyAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNlZWtzb3J0ZWQgPSAwLCBzZWVrbm9zb3J0ID0gMDsKKworICAgaWYgKGxpbmtfc3RhdGlzdGljcyAmJiAhKCsrZmx1c2hjb3VudCAlIGxpbmtfc3RhdGlzdGljcykpCisgICAgICBwcmludGsoImZjICVkIGJjICVkIGljICVkIG9jICVkIHJjICVkIHJzICVkIHNjICVkIHJlICVkIlwKKyAgICAgICAgICAgICAiIGF2ICVsZEsgYXMgJWxkSy5cbiIsIGZsdXNoY291bnQsIGJhdGNoY291bnQsIGlucHV0Y291bnQsCisgICAgICAgICAgICAgb3ZsY291bnQsIHJlYWR5Y291bnQsIHJlYWR5c29ydGVkLCBzb3J0Y291bnQsIHJldmNvdW50LAorICAgICAgICAgICAgIHNlZWtub3NvcnQgLyAocmVhZHljb3VudCArIDEpLAorICAgICAgICAgICAgIHNlZWtzb3J0ZWQgLyAocmVhZHljb3VudCArIDEpKTsKKworICAgaWYgKG5fcmVhZHkgPD0gMSkgcmV0dXJuIEZBTFNFOworCisgICBmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7CisgICAgICBrID0gaWxbbl07IGNwcCA9ICZIRChqKS0+Y3Bba107IFNDcG50ID0gY3BwLT5TQ3BudDsKKworICAgICAgaWYgKCEoY3BwLT54ZGlyID09IERURF9JTikpIGlucHV0X29ubHkgPSBGQUxTRTsKKworICAgICAgaWYgKFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IgPCBtaW5zZWMpIG1pbnNlYyA9IFNDcG50LT5yZXF1ZXN0LT5zZWN0b3I7CisgICAgICBpZiAoU0NwbnQtPnJlcXVlc3QtPnNlY3RvciA+IG1heHNlYykgbWF4c2VjID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcjsKKworICAgICAgc2xbbl0gPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworICAgICAgaW9zZWVrICs9IFNDcG50LT5yZXF1ZXN0LT5ucl9zZWN0b3JzOworCisgICAgICBpZiAoIW4pIGNvbnRpbnVlOworCisgICAgICBpZiAoc2xbbl0gPCBzbFtuIC0gMV0pIHMgPSBGQUxTRTsKKyAgICAgIGlmIChzbFtuXSA+IHNsW24gLSAxXSkgciA9IEZBTFNFOworCisgICAgICBpZiAobGlua19zdGF0aXN0aWNzKSB7CisgICAgICAgICBpZiAoc2xbbl0gPiBzbFtuIC0gMV0pCisgICAgICAgICAgICBzZWVrICs9IHNsW25dIC0gc2xbbiAtIDFdOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VlayArPSBzbFtuIC0gMV0gLSBzbFtuXTsKKyAgICAgICAgIH0KKworICAgICAgfQorCisgICBpZiAobGlua19zdGF0aXN0aWNzKSB7CisgICAgICBpZiAoY3Vyc2VjID4gc2xbMF0pIHNlZWsgKz0gY3Vyc2VjIC0gc2xbMF07IGVsc2Ugc2VlayArPSBzbFswXSAtIGN1cnNlYzsKKyAgICAgIH0KKworICAgaWYgKGN1cnNlYyA+ICgobWF4c2VjICsgbWluc2VjKSAvIDIpKSByZXYgPSBUUlVFOworCisgICBpZiAoaW9zZWVrID4gKChtYXhzZWMgLSBtaW5zZWMpIC8gMikpIHJldiA9IEZBTFNFOworCisgICBpZiAoISgocmV2ICYmIHIpIHx8ICghcmV2ICYmIHMpKSkgc29ydChzbCwgaWwsIG5fcmVhZHksIHJldik7CisKKyAgIGlmICghaW5wdXRfb25seSkgZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworICAgICAgayA9IGlsW25dOyBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisgICAgICBsbFtuXSA9IFNDcG50LT5yZXF1ZXN0LT5ucl9zZWN0b3JzOyBwbFtuXSA9IFNDcG50LT5waWQ7CisKKyAgICAgIGlmICghbikgY29udGludWU7CisKKyAgICAgIGlmICgoc2xbbl0gPT0gc2xbbiAtIDFdKSB8fCAoIXJldiAmJiAoKHNsW24gLSAxXSArIGxsW24gLSAxXSkgPiBzbFtuXSkpCisgICAgICAgICAgfHwgKHJldiAmJiAoKHNsW25dICsgbGxbbl0pID4gc2xbbiAtIDFdKSkpIG92ZXJsYXAgPSBUUlVFOworICAgICAgfQorCisgICBpZiAob3ZlcmxhcCkgc29ydChwbCwgaWwsIG5fcmVhZHksIEZBTFNFKTsKKworICAgaWYgKGxpbmtfc3RhdGlzdGljcykgeworICAgICAgaWYgKGN1cnNlYyA+IHNsWzBdKSBpc2VlayA9IGN1cnNlYyAtIHNsWzBdOyBlbHNlIGlzZWVrID0gc2xbMF0gLSBjdXJzZWM7CisgICAgICBiYXRjaGNvdW50Kys7IHJlYWR5Y291bnQgKz0gbl9yZWFkeTsgc2Vla25vc29ydCArPSBzZWVrIC8gMTAyNDsKKyAgICAgIGlmIChpbnB1dF9vbmx5KSBpbnB1dGNvdW50Kys7CisgICAgICBpZiAob3ZlcmxhcCkgeyBvdmxjb3VudCsrOyBzZWVrc29ydGVkICs9IGlzZWVrIC8gMTAyNDsgfQorICAgICAgZWxzZSBzZWVrc29ydGVkICs9IChpc2VlayArIG1heHNlYyAtIG1pbnNlYykgLyAxMDI0OworICAgICAgaWYgKHJldiAmJiAhcikgICAgIHsgIHJldmNvdW50Kys7IHJlYWR5c29ydGVkICs9IG5fcmVhZHk7IH0KKyAgICAgIGlmICghcmV2ICYmICFzKSAgICB7IHNvcnRjb3VudCsrOyByZWFkeXNvcnRlZCArPSBuX3JlYWR5OyB9CisgICAgICB9CisKKyNpZiBkZWZpbmVkKERFQlVHX0xJTktFRF9DT01NQU5EUykKKyAgIGlmIChsaW5rX3N0YXRpc3RpY3MgJiYgKG92ZXJsYXAgfHwgIShmbHVzaGNvdW50ICUgbGlua19zdGF0aXN0aWNzKSkpCisgICAgICBmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7CisgICAgICAgICBrID0gaWxbbl07IGNwcCA9ICZIRChqKS0+Y3Bba107IFNDcG50ID0gY3BwLT5TQ3BudDsKKyAgICAgICAgIHByaW50aygiJXMgJWQuJWQ6JWQgcGlkICVsZCBtYiAlZCBmYyAlZCBuciAlZCBzZWMgJWxkIG5zICVsZCJcCisgICAgICAgICAgICAgICAgIiBjdXIgJWxkIHM6JWMgcjolYyByZXY6JWMgaW46JWMgb3Y6JWMgeGQgJWQuXG4iLAorICAgICAgICAgICAgICAgIChpaGRsciA/ICJpaGRsciIgOiAicWNvbW0iKSwgU0NwbnQtPmNoYW5uZWwsIFNDcG50LT50YXJnZXQsCisgICAgICAgICAgICAgICAgU0NwbnQtPmx1biwgU0NwbnQtPnBpZCwgaywgZmx1c2hjb3VudCwgbl9yZWFkeSwKKyAgICAgICAgICAgICAgICBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9ycywgY3Vyc2VjLAorICAgICAgICAgICAgICAgIFlFU05PKHMpLCBZRVNOTyhyKSwgWUVTTk8ocmV2KSwgWUVTTk8oaW5wdXRfb25seSksCisgICAgICAgICAgICAgICAgWUVTTk8ob3ZlcmxhcCksIGNwcC0+eGRpcik7CisgICAgICAgICB9CisjZW5kaWYKKyAgIHJldHVybiBvdmVybGFwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9kZXYoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY3Vyc2VjLCB1bnNpZ25lZCBpbnQgaiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWhkbHIpIHsKKyAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OworICAgc3RydWN0IG1zY3AgKmNwcDsKKyAgIHVuc2lnbmVkIGludCBrLCBuLCBuX3JlYWR5ID0gMCwgaWxbTUFYX01BSUxCT1hFU107CisKKyAgIGZvciAoayA9IDA7IGsgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBrKyspIHsKKworICAgICAgaWYgKEhEKGopLT5jcF9zdGF0W2tdICE9IFJFQURZICYmIEhEKGopLT5jcF9zdGF0W2tdICE9IElOX1VTRSkgY29udGludWU7CisKKyAgICAgIGNwcCA9ICZIRChqKS0+Y3Bba107IFNDcG50ID0gY3BwLT5TQ3BudDsKKworICAgICAgaWYgKFNDcG50LT5kZXZpY2UgIT0gZGV2KSBjb250aW51ZTsKKworICAgICAgaWYgKEhEKGopLT5jcF9zdGF0W2tdID09IElOX1VTRSkgcmV0dXJuOworCisgICAgICBpbFtuX3JlYWR5KytdID0gazsKKyAgICAgIH0KKworICAgaWYgKHJlb3JkZXIoaiwgY3Vyc2VjLCBpaGRsciwgaWwsIG5fcmVhZHkpKSBuX3JlYWR5ID0gMTsKKworICAgZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgeworICAgICAgayA9IGlsW25dOyBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKyAgICAgIGlmICh3YWl0X29uX2J1c3koc2hbal0tPmlvX3BvcnQsIE1BWExPT1ApKSB7CisgICAgICAgICBwcmludGsoIiVzOiAlcywgdGFyZ2V0ICVkLiVkOiVkLCBwaWQgJWxkLCBtYm94ICVkLCBhZGFwdGVyIlwKKyAgICAgICAgICAgICAgICAiIGJ1c3ksIHdpbGwgYWJvcnQuXG4iLCBCTihqKSwgKGloZGxyID8gImloZGxyIiA6ICJxY29tbSIpLAorICAgICAgICAgICAgICAgIFNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+ZGV2aWNlLT5sdW4sIFNDcG50LT5waWQsIGspOworICAgICAgICAgSEQoaiktPmNwX3N0YXRba10gPSBBQk9SVElORzsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorCisgICAgICBvdXRsKEgyREVWKGNwcC0+Y3BfZG1hX2FkZHIpLCBzaFtqXS0+aW9fcG9ydCArIFJFR19PR00pOworICAgICAgb3V0YihDTURfT0dNX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX0xDTF9JTlRSKTsKKyAgICAgIEhEKGopLT5jcF9zdGF0W2tdID0gSU5fVVNFOworICAgICAgfQorCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpaGRscihpbnQgaXJxLCB1bnNpZ25lZCBpbnQgaikgeworICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisgICB1bnNpZ25lZCBpbnQgaSwgaywgYywgc3RhdHVzLCB0c3RhdHVzLCByZWcsIHJldDsKKyAgIHN0cnVjdCBtc2NwICpzcHAsICpjcHA7CisKKyAgIGlmIChzaFtqXS0+aXJxICE9IGlycSkKKyAgICAgICBwYW5pYygiJXM6IGloZGxyLCBpcnEgJWQsIHNoW2pdLT5pcnEgJWQuXG4iLCBCTihqKSwgaXJxLCBzaFtqXS0+aXJxKTsKKworICAgLyogQ2hlY2sgaWYgdGhpcyBib2FyZCBuZWVkIHRvIGJlIHNlcnZpY2VkICovCisgICBpZiAoISgocmVnID0gaW5iKHNoW2pdLT5pb19wb3J0ICsgUkVHX1NZU19JTlRSKSkgJiBJUlFfQVNTRVJURUQpKSBnb3RvIG5vbmU7CisKKyAgIEhEKGopLT5pb2NvdW50Kys7CisKKyAgIGlmIChkb190cmFjZSkgcHJpbnRrKCIlczogaWhkbHIsIGVudGVyLCBpcnEgJWQsIGNvdW50ICVkLlxuIiwgQk4oaiksIGlycSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhEKGopLT5pb2NvdW50KTsKKworICAgLyogQ2hlY2sgaWYgdGhpcyBib2FyZCBpcyBzdGlsbCBidXN5ICovCisgICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCAyMCAqIE1BWExPT1ApKSB7CisgICAgICBvdXRiKENNRF9DTFJfSU5UUiwgc2hbal0tPmlvX3BvcnQgKyBSRUdfU1lTX0lOVFIpOworICAgICAgcHJpbnRrKCIlczogaWhkbHIsIGJ1c3kgdGltZW91dCBlcnJvciwgIGlycSAlZCwgcmVnIDB4JXgsIGNvdW50ICVkLlxuIiwKKyAgICAgICAgICAgICBCTihqKSwgaXJxLCByZWcsIEhEKGopLT5pb2NvdW50KTsKKyAgICAgIGdvdG8gbm9uZTsKKyAgICAgIH0KKworICAgcmV0ID0gaW5sKHNoW2pdLT5pb19wb3J0ICsgUkVHX0lDTSk7CisKKyAgIC8qIENsZWFyIGludGVycnVwdCBwZW5kaW5nIGZsYWcgKi8KKyAgIG91dGIoQ01EX0NMUl9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUik7CisKKyAgIC8qIEZpbmQgdGhlIG1haWxib3ggdG8gYmUgc2VydmljZWQgb24gdGhpcyBib2FyZCAqLworICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKKyAgICAgIGlmIChIMkRFVihIRChqKS0+Y3BbaV0uY3BfZG1hX2FkZHIpID09IHJldCkgYnJlYWs7CisKKyAgIGlmIChpID49IHNoW2pdLT5jYW5fcXVldWUpCisgICAgICBwYW5pYygiJXM6IGloZGxyLCBpbnZhbGlkIG1zY3AgYnVzIGFkZHJlc3MgJXAsIGNwMCAlcC5cbiIsIEJOKGopLAorICAgICAgICAgICAgKHZvaWQgKilyZXQsICh2b2lkICopSDJERVYoSEQoaiktPmNwWzBdLmNwX2RtYV9hZGRyKSk7CisKKyAgIGNwcCA9ICYoSEQoaiktPmNwW2ldKTsKKyAgIHNwcCA9IGNwcDsKKworI2lmIGRlZmluZWQoREVCVUdfR0VORVJBVEVfQUJPUlRTKQorICAgaWYgKChIRChqKS0+aW9jb3VudCA+IDUwMCkgJiYgKChIRChqKS0+aW9jb3VudCAlIDUwMCkgPCAzKSkgZ290byBoYW5kbGVkOworI2VuZGlmCisKKyAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBJR05PUkUpIHsKKyAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKKyAgICAgIGdvdG8gaGFuZGxlZDsKKyAgICAgIH0KKyAgIGVsc2UgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IExPQ0tFRCkgeworICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOworICAgICAgcHJpbnRrKCIlczogaWhkbHIsIG1ib3ggJWQgdW5sb2NrZWQsIGNvdW50ICVkLlxuIiwgQk4oaiksIGksCisgICAgICAgICAgICAgSEQoaiktPmlvY291bnQpOworICAgICAgZ290byBoYW5kbGVkOworICAgICAgfQorICAgZWxzZSBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gRlJFRSkgeworICAgICAgcHJpbnRrKCIlczogaWhkbHIsIG1ib3ggJWQgaXMgZnJlZSwgY291bnQgJWQuXG4iLCBCTihqKSwgaSwKKyAgICAgICAgICAgICBIRChqKS0+aW9jb3VudCk7CisgICAgICBnb3RvIGhhbmRsZWQ7CisgICAgICB9CisgICBlbHNlIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBJTl9SRVNFVCkKKyAgICAgIHByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIGlzIGluIHJlc2V0LlxuIiwgQk4oaiksIGkpOworICAgZWxzZSBpZiAoSEQoaiktPmNwX3N0YXRbaV0gIT0gSU5fVVNFKQorICAgICAgcGFuaWMoIiVzOiBpaGRsciwgbWJveCAlZCwgaW52YWxpZCBjcF9zdGF0OiAlZC5cbiIsCisgICAgICAgICAgICBCTihqKSwgaSwgSEQoaiktPmNwX3N0YXRbaV0pOworCisgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEZSRUU7CisgICBTQ3BudCA9IGNwcC0+U0NwbnQ7CisKKyAgIGlmIChTQ3BudCA9PSBOVUxMKSBwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBTQ3BudCA9PSBOVUxMLlxuIiwgQk4oaiksIGkpOworCisgICBpZiAoU0NwbnQtPmhvc3Rfc2NyaWJibGUgPT0gTlVMTCkKKyAgICAgIHBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIHBpZCAlbGQsIFNDcG50ICVwIGdhcmJsZWQuXG4iLCBCTihqKSwgaSwKKyAgICAgICAgICAgIFNDcG50LT5waWQsIFNDcG50KTsKKworICAgaWYgKCoodW5zaWduZWQgaW50ICopU0NwbnQtPmhvc3Rfc2NyaWJibGUgIT0gaSkKKyAgICAgIHBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIHBpZCAlbGQsIGluZGV4IG1pc21hdGNoICVkLlxuIiwKKyAgICAgICAgICAgIEJOKGopLCBpLCBTQ3BudC0+cGlkLCAqKHVuc2lnbmVkIGludCAqKVNDcG50LT5ob3N0X3NjcmliYmxlKTsKKworICAgc3luY19kbWEoaSwgaik7CisKKyAgIGlmIChsaW5rZWRfY29tbSAmJiBTQ3BudC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCA+IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUTERFVihTQ3BudC0+ZGV2aWNlLT50eXBlKSkKKyAgICAgIGZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBqLCBUUlVFKTsKKworICAgdHN0YXR1cyA9IHN0YXR1c19ieXRlKHNwcC0+dGFyZ2V0X3N0YXR1cyk7CisKKyNpZiBkZWZpbmVkKERFQlVHX0dFTkVSQVRFX0VSUk9SUykKKyAgIGlmICgoSEQoaiktPmlvY291bnQgPiA1MDApICYmICgoSEQoaiktPmlvY291bnQgJSAyMDApIDwgMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwLT5hZGFwdGVyX3N0YXR1cyA9IDB4MDE7CisjZW5kaWYKKworICAgc3dpdGNoIChzcHAtPmFkYXB0ZXJfc3RhdHVzKSB7CisgICAgICBjYXNlIEFTT0s6ICAgICAvKiBzdGF0dXMgT0sgKi8KKworICAgICAgICAgLyogRm9yY2VzIGEgcmVzZXQgaWYgYSBkaXNrIGRyaXZlIGtlZXBzIHJldHVybmluZyBCVVNZICovCisgICAgICAgICBpZiAodHN0YXR1cyA9PSBCVVNZICYmIFNDcG50LT5kZXZpY2UtPnR5cGUgIT0gVFlQRV9UQVBFKQorICAgICAgICAgICAgc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OworCisgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBidXMgcmVzZXQsIHJlZG8gb3BlcmF0aW9uIG9uIGVhY2ggdGFyZ2V0ICovCisgICAgICAgICBlbHNlIGlmICh0c3RhdHVzICE9IEdPT0QgJiYgU0NwbnQtPmRldmljZS0+dHlwZSA9PSBUWVBFX0RJU0sKKyAgICAgICAgICAgICAgICAgICYmIEhEKGopLT50YXJnZXRfcmVkb1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+Y2hhbm5lbF0pCisgICAgICAgICAgICBzdGF0dXMgPSBESURfQlVTX0JVU1kgPDwgMTY7CisKKyAgICAgICAgIC8qIFdvcmtzIGFyb3VuZCBhIGZsYXcgaW4gc2NzaS5jICovCisgICAgICAgICBlbHNlIGlmICh0c3RhdHVzID09IENIRUNLX0NPTkRJVElPTgorICAgICAgICAgICAgICAgICAgJiYgU0NwbnQtPmRldmljZS0+dHlwZSA9PSBUWVBFX0RJU0sKKyAgICAgICAgICAgICAgICAgICYmIChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhmKSA9PSBSRUNPVkVSRURfRVJST1IpCisgICAgICAgICAgICBzdGF0dXMgPSBESURfQlVTX0JVU1kgPDwgMTY7CisKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXR1cyA9IERJRF9PSyA8PCAxNjsKKworICAgICAgICAgaWYgKHRzdGF0dXMgPT0gR09PRCkKKyAgICAgICAgICAgIEhEKGopLT50YXJnZXRfcmVkb1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+Y2hhbm5lbF0gPSBGQUxTRTsKKworICAgICAgICAgaWYgKHNwcC0+dGFyZ2V0X3N0YXR1cyAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfRElTSyAmJgorICAgICAgICAgICAgICghKHRzdGF0dXMgPT0gQ0hFQ0tfQ09ORElUSU9OICYmIEhEKGopLT5pb2NvdW50IDw9IDEwMDAgJiYKKyAgICAgICAgICAgICAgIChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdICYgMHhmKSA9PSBOT1RfUkVBRFkpKSkKKyAgICAgICAgICAgIHByaW50aygiJXM6IGloZGxyLCB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQsICJcCisgICAgICAgICAgICAgICAgICAgInRhcmdldF9zdGF0dXMgMHgleCwgc2Vuc2Uga2V5IDB4JXguXG4iLCBCTihqKSwKKyAgICAgICAgICAgICAgICAgICBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmRldmljZS0+bHVuLAorICAgICAgICAgICAgICAgICAgIFNDcG50LT5waWQsIHNwcC0+dGFyZ2V0X3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICBTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdKTsKKworICAgICAgICAgSEQoaiktPnRhcmdldF90b1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+Y2hhbm5lbF0gPSAwOworCisgICAgICAgICBpZiAoSEQoaiktPmxhc3RfcmV0cmllZF9waWQgPT0gU0NwbnQtPnBpZCkgSEQoaiktPnJldHJpZXMgPSAwOworCisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVNTVDogICAgIC8qIFNlbGVjdGlvbiBUaW1lIE91dCAqLworCisgICAgICAgICBpZiAoSEQoaiktPnRhcmdldF90b1tTQ3BudC0+ZGV2aWNlLT5pZF1bU0NwbnQtPmRldmljZS0+Y2hhbm5lbF0gPiAxKQorICAgICAgICAgICAgc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OworICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBESURfVElNRV9PVVQgPDwgMTY7CisgICAgICAgICAgICBIRChqKS0+dGFyZ2V0X3RvW1NDcG50LT5kZXZpY2UtPmlkXVtTQ3BudC0+ZGV2aWNlLT5jaGFubmVsXSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICBicmVhazsKKworICAgICAgLyogUGVyZm9ybSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGludGVybmFsIHJldHJpZXMgKi8KKyAgICAgIGNhc2UgMHg5MzogICAgIC8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUgKi8KKyAgICAgIGNhc2UgMHg5NDogICAgIC8qIFRhcmdldCBidXMgcGhhc2Ugc2VxdWVuY2UgZmFpbHVyZSAqLworICAgICAgY2FzZSAweDk2OiAgICAgLyogSWxsZWdhbCBTQ1NJIGNvbW1hbmQgKi8KKyAgICAgIGNhc2UgMHhhMzogICAgIC8qIFNDU0kgYnVzIHJlc2V0IGVycm9yICovCisKKyAgICAgICAgIGZvciAoYyA9IDA7IGMgPD0gc2hbal0tPm1heF9jaGFubmVsOyBjKyspCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2hbal0tPm1heF9pZDsgaysrKQorICAgICAgICAgICAgICAgSEQoaiktPnRhcmdldF9yZWRvW2tdW2NdID0gVFJVRTsKKworCisgICAgICBjYXNlIDB4OTI6ICAgICAvKiBEYXRhIG92ZXIvdW5kZXItcnVuICovCisKKyAgICAgICAgIGlmIChTQ3BudC0+ZGV2aWNlLT50eXBlICE9IFRZUEVfVEFQRQorICAgICAgICAgICAgICYmIEhEKGopLT5yZXRyaWVzIDwgTUFYX0lOVEVSTkFMX1JFVFJJRVMpIHsKKworI2lmIGRlZmluZWQoRElEX1NPRlRfRVJST1IpCisgICAgICAgICAgICBzdGF0dXMgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKyNlbHNlCisgICAgICAgICAgICBzdGF0dXMgPSBESURfQlVTX0JVU1kgPDwgMTY7CisjZW5kaWYKKworICAgICAgICAgICAgSEQoaiktPnJldHJpZXMrKzsKKyAgICAgICAgICAgIEhEKGopLT5sYXN0X3JldHJpZWRfcGlkID0gU0NwbnQtPnBpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MDE6ICAgICAvKiBJbnZhbGlkIGNvbW1hbmQgKi8KKyAgICAgIGNhc2UgMHgwMjogICAgIC8qIEludmFsaWQgcGFyYW1ldGVycyAqLworICAgICAgY2FzZSAweDAzOiAgICAgLyogSW52YWxpZCBkYXRhIGxpc3QgKi8KKyAgICAgIGNhc2UgMHg4NDogICAgIC8qIFNDU0kgYnVzIGFib3J0IGVycm9yICovCisgICAgICBjYXNlIDB4OWI6ICAgICAvKiBBdXRvIHJlcXVlc3Qgc2Vuc2UgZXJyb3IgKi8KKyAgICAgIGNhc2UgMHg5ZjogICAgIC8qIFVuZXhwZWN0ZWQgY29tbWFuZCBjb21wbGV0ZSBtZXNzYWdlIGVycm9yICovCisgICAgICBjYXNlIDB4ZmY6ICAgICAvKiBJbnZhbGlkIHBhcmFtZXRlciBpbiB0aGUgUy9HIGxpc3QgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBzdGF0dXMgPSBESURfRVJST1IgPDwgMTY7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgU0NwbnQtPnJlc3VsdCA9IHN0YXR1cyB8IHNwcC0+dGFyZ2V0X3N0YXR1czsKKworI2lmIGRlZmluZWQoREVCVUdfSU5URVJSVVBUKQorICAgaWYgKFNDcG50LT5yZXN1bHQgfHwgZG9fdHJhY2UpCisjZWxzZQorICAgaWYgKChzcHAtPmFkYXB0ZXJfc3RhdHVzICE9IEFTT0sgJiYgSEQoaiktPmlvY291bnQgPiAgMTAwMCkgfHwKKyAgICAgICAoc3BwLT5hZGFwdGVyX3N0YXR1cyAhPSBBU09LICYmCisgICAgICAgIHNwcC0+YWRhcHRlcl9zdGF0dXMgIT0gQVNTVCAmJiBIRChqKS0+aW9jb3VudCA8PSAxMDAwKSB8fAorICAgICAgICBkb190cmFjZSB8fCBtc2dfYnl0ZShzcHAtPnRhcmdldF9zdGF0dXMpKQorI2VuZGlmCisgICAgICBwcmludGsoIiVzOiBpaGRsciwgbWJveCAlMmQsIGVyciAweCV4OiV4LCJcCisgICAgICAgICAgICAgIiB0YXJnZXQgJWQuJWQ6JWQsIHBpZCAlbGQsIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCisgICAgICAgICAgICAgQk4oaiksIGksIHNwcC0+YWRhcHRlcl9zdGF0dXMsIHNwcC0+dGFyZ2V0X3N0YXR1cywKKyAgICAgICAgICAgICBTQ3BudC0+ZGV2aWNlLT5jaGFubmVsLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmRldmljZS0+bHVuLCBTQ3BudC0+cGlkLAorICAgICAgICAgICAgIHJlZywgSEQoaiktPmlvY291bnQpOworCisgICB1bm1hcF9kbWEoaSwgaik7CisKKyAgIC8qIFNldCB0aGUgY29tbWFuZCBzdGF0ZSB0byBpbmFjdGl2ZSAqLworICAgU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCisgICBTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKKworICAgaWYgKGRvX3RyYWNlKSBwcmludGsoIiVzOiBpaGRsciwgZXhpdCwgaXJxICVkLCBjb3VudCAlZC5cbiIsIEJOKGopLCBpcnEsCisgICAgICAgICAgICAgICAgICAgICAgICBIRChqKS0+aW9jb3VudCk7CisKK2hhbmRsZWQ6CisgICByZXR1cm4gSVJRX0hBTkRMRUQ7Citub25lOgorICAgcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqc2hhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykgeworICAgdW5zaWduZWQgaW50IGo7CisgICB1bnNpZ25lZCBsb25nIHNwaW5fZmxhZ3M7CisgICBpcnFyZXR1cm5fdCByZXQ7CisKKyAgIC8qIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgbXVzdCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBoYW5kbGVyICovCisgICBpZiAoKGogPSAodW5zaWduZWQgaW50KSgoY2hhciAqKXNoYXAgLSBzaGEpKSA+PSBudW1fYm9hcmRzKSByZXR1cm4gSVJRX05PTkU7CisKKyAgIHNwaW5fbG9ja19pcnFzYXZlKHNoW2pdLT5ob3N0X2xvY2ssIHNwaW5fZmxhZ3MpOworICAgcmV0ID0gaWhkbHIoaXJxLCBqKTsKKyAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hbal0tPmhvc3RfbG9jaywgc3Bpbl9mbGFncyk7CisgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHUxNF8zNGZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkgeworICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgIGZvciAoaiA9IDA7IHNoW2pdICE9IE5VTEwgJiYgc2hbal0gIT0gc2hwbnQ7IGorKyk7CisKKyAgIGlmIChzaFtqXSA9PSBOVUxMKSBwYW5pYygiJXM6IHJlbGVhc2UsIGludmFsaWQgU2NzaV9Ib3N0IHBvaW50ZXIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl9uYW1lKTsKKworICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKKyAgICAgIGlmICgoJkhEKGopLT5jcFtpXSktPnNnbGlzdCkga2ZyZWUoKCZIRChqKS0+Y3BbaV0pLT5zZ2xpc3QpOworCisgICBmb3IgKGkgPSAwOyBpIDwgc2hbal0tPmNhbl9xdWV1ZTsgaSsrKQorICAgICAgcGNpX3VubWFwX3NpbmdsZShIRChqKS0+cGRldiwgSEQoaiktPmNwW2ldLmNwX2RtYV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBtc2NwKSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworICAgZnJlZV9pcnEoc2hbal0tPmlycSwgJnNoYVtqXSk7CisKKyAgIGlmIChzaFtqXS0+ZG1hX2NoYW5uZWwgIT0gTk9fRE1BKSBmcmVlX2RtYShzaFtqXS0+ZG1hX2NoYW5uZWwpOworCisgICByZWxlYXNlX3JlZ2lvbihzaFtqXS0+aW9fcG9ydCwgc2hbal0tPm5faW9fcG9ydCk7CisgICBzY3NpX3VucmVnaXN0ZXIoc2hbal0pOworICAgcmV0dXJuIEZBTFNFOworfQorCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKworI2lmbmRlZiBNT0RVTEUKK19fc2V0dXAoInUxNC0zNGY9Iiwgb3B0aW9uX3NldHVwKTsKKyNlbmRpZiAvKiBlbmQgTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmMgYi9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4NDkxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuYwpAQCAtMCwwICsxLDEyMDQgQEAKKy8qCisgKgl1bHRyYXN0b3IuYwlDb3B5cmlnaHQgKEMpIDE5OTIgRGF2aWQgQi4gR2VudHplbAorICoJTG93LWxldmVsIFNDU0kgZHJpdmVyIGZvciBVbHRyYVN0b3IgMTRGLCAyNEYsIGFuZCAzNEYKKyAqCWJ5IERhdmlkIEIuIEdlbnR6ZWwsIFdoaXRmaWVsZCBTb2Z0d2FyZSBTZXJ2aWNlcywgQ2FybmVnaWUsIFBBCisgKgkgICAgKGdlbnR6ZWxAbm92YS5lbmV0LmRlYy5jb20pCisgKiAgc2NhdHRlci9nYXRoZXIgYWRkZWQgYnkgU2NvdHQgVGF5bG9yIChuMjE3Y2dAdGFtdXRzLnRhbXUuZWR1KQorICogIDI0RiBhbmQgbXVsdGlwbGUgY29tbWFuZCBzdXBwb3J0IGJ5IEpvaG4gRi4gQ2FyciAoamZjQGF0aGVuYS5taXQuZWR1KQorICogICAgSm9obidzIHdvcmsgbW9kaWZpZWQgYnkgQ2FsZWIgRXBzdGVpbiAoY2FlQGpwbW9yZ2FuLmNvbSkgYW5kIAorICogICAgRXJpYyBZb3VuZ2RhbGUgKGVyaWN5QGNhaXMuY29tKS4KKyAqCVRoYW5rcyB0byBVbHRyYVN0b3IgZm9yIHByb3ZpZGluZyB0aGUgbmVjZXNzYXJ5IGRvY3VtZW50YXRpb24KKyAqCisgKiAgVGhpcyBpcyBhbiBvbGQgZHJpdmVyLCBmb3IgdGhlIDE0RiBhbmQgMzRGIHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlCisgKiAgdTE0LTM0ZiBkcml2ZXIgaW5zdGVhZC4KKyAqLworCisvKgorICogVE9ETzoKKyAqCTEuIEZpbmQgb3V0IHdoeSBzY2F0dGVyL2dhdGhlciBpcyBsaW1pdGVkIHRvIDE2IHJlcXVlc3RzIHBlciBjb21tYW5kLgorICogICAgICAgICBUaGlzIGlzIGZpeGVkLCBhdCBsZWFzdCBvbiB0aGUgMjRGLCBhcyBvZiB2ZXJzaW9uIDEuMTIgLSBDQUUuCisgKgkyLiBMb29rIGF0IGNvbW1hbmQgbGlua2luZyAobXNjcC5jb21tYW5kX2xpbmsgYW5kCisgKgkgICBtc2NwLmNvbW1hbmRfbGlua19pZCkuICAoRG9lcyBub3Qgd29yayB3aXRoIG1hbnkgZGlza3MsIAorICoJCQkJYW5kIG5vIHBlcmZvcm1hbmNlIGluY3JlYXNlLiAgRVJZKS4KKyAqCTMuIEFsbG93IG11bHRpcGxlIGFkYXB0ZXJzLgorICovCisKKy8qCisgKiBOT1RFUzoKKyAqICAgIFRoZSBVbHRyYVN0b3IgMTRGLCAyNEYsIGFuZCAzNEYgYXJlIGEgZmFtaWx5IG9mIGludGVsbGlnZW50LCBoaWdoCisgKiAgICBwZXJmb3JtYW5jZSBTQ1NJLTIgaG9zdCBhZGFwdGVycy4gIFRoZXkgYWxsIHN1cHBvcnQgY29tbWFuZCBxdWV1ZWluZworICogICAgYW5kIHNjYXR0ZXIvZ2F0aGVyIEkvTy4gIFNvbWUgb2YgdGhlbSBjYW4gYWxzbyBlbXVsYXRlIHRoZSBzdGFuZGFyZAorICogICAgV0QxMDAzIGludGVyZmFjZSBmb3IgdXNlIHdpdGggT1MncyB3aGljaCBkb24ndCBzdXBwb3J0IFNDU0kuICBIZXJlCisgKiAgICBpcyB0aGUgc2Nvb3Agb24gdGhlIHZhcmlvdXMgbW9kZWxzOgorICoJMTRGIC0gSVNBIGZpcnN0LXBhcnR5IERNQSBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IGFuZCBXRDEwMDMgZW11bGF0aW9uLgorICoJMTROIC0gSVNBIEhBIHdpdGggZmxvcHB5IHN1cHBvcnQuICBJIHRoaW5rIHRoYXQgdGhpcyBpcyBhIG5vbi1ETUEKKyAqCSAgICAgIEhBLiAgTm90aGluZyBmdXJ0aGVyIGtub3duLgorICoJMjRGIC0gRUlTQSBCdXMgTWFzdGVyIEhBIHdpdGggZmxvcHB5IHN1cHBvcnQgYW5kIFdEMTAwMyBlbXVsYXRpb24uCisgKgkzNEYgLSBWTC1CdXMgQnVzIE1hc3RlciBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IChubyBXRDEwMDMgZW11bGF0aW9uKS4KKyAqCisgKiAgICBUaGUgMTRGLCAyNEYsIGFuZCAzNEYgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKyAqCisgKiAgICBQbGFjZXMgZmxhZ2dlZCB3aXRoIGEgdHJpcGxlIHF1ZXN0aW9uLW1hcmsgYXJlIHRoaW5ncyB3aGljaCBhcmUgZWl0aGVyCisgKiAgICB1bmZpbmlzaGVkLCBxdWVzdGlvbmFibGUsIG9yIHdyb25nLgorICovCisKKy8qIENoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMTEgYWxwaGEgdG8gMS4xMgorICoKKyAqIEluY3JlYXNlZCB0aGUgc2l6ZSBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCB0byAzMyBlbnRyaWVzIGZvcgorICogdGhlIDI0RiBhZGFwdGVyIChpdCB3YXMgMTYpLiAgSSBkb24ndCBoYXZlIHRoZSBzcGVjcyBmb3IgdGhlIDE0RgorICogb3IgdGhlIDM0Riwgc28gdGhleSBtYXkgc3VwcG9ydCBsYXJnZXIgcy1nIGxpc3RzIGFzIHdlbGwuCisgKgorICogQ2FsZWIgRXBzdGVpbiA8Y2FlQGpwbW9yZ2FuLmNvbT4KKyAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjkgdG8gMS4xMQorICoKKyAqIFBhdGNoZXMgdG8gYnJpbmcgdGhpcyBkcml2ZXIgdXAgdG8gc3BlZWQgd2l0aCB0aGUgZGVmYXVsdCBrZXJuZWwKKyAqIGRyaXZlciB3aGljaCBzdXBwb3J0cyBvbmx5IHRoZSAxNEYgYW5kIDM0RiBhZGFwdGVycy4gIFRoaXMgdmVyc2lvbgorICogc2hvdWxkIGNvbXBpbGUgY2xlYW5seSBpbnRvIDAuOTkuMTMsIDAuOTkuMTIgYW5kIHByb2JhYmx5IDAuOTkuMTEuCisgKgorICogRml4ZXMgZnJvbSBFcmljIFlvdW5nZGFsZSB0byBmaXggYSBmZXcgcG9zc2libGUgcmFjZSBjb25kaXRpb25zIGFuZAorICogc2V2ZXJhbCBwcm9ibGVtcyB3aXRoIGJpdCB0ZXN0aW5nIG9wZXJhdGlvbnMgKGluc3VmZmljaWVudAorICogcGFyZW50aGVzZXMpLgorICoKKyAqIFJlbW92ZWQgdGhlIHVsdHJhc3Rvcl9hYm9ydCgpIGFuZCB1bHRyYXN0b3JfcmVzZXQoKSBmdW5jdGlvbnMKKyAqIChlbmNsb3NlZCB0aGVtIGluICNpZiAwIC8gI2VuZGlmKS4gIFRoZXNlIGZ1bmN0aW9ucywgYXQgbGVhc3Qgb24KKyAqIHRoZSAyNEYsIGNhdXNlIHRoZSBTQ1NJIGJ1cyB0byBkbyBvZGQgdGhpbmdzIGFuZCBnZW5lcmFsbHkgbGVhZCB0bworICoga2VybmVsIHBhbmljcyBhbmQgbWFjaGluZSBoYW5ncy4gIFRoaXMgaXMgbGlrZSB0aGUgQWRhcHRlYyBjb2RlLgorICoKKyAqIFVzZSBjaGVjay9zbmFyZl9yZWdpb24gZm9yIDE0ZiwgMzRmIHRvIGF2b2lkIEkvTyBzcGFjZSBhZGRyZXNzIGNvbmZsaWN0cy4KKyAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjggdG8gdmVyc2lvbiAxLjkKKyAqCisgKiAgMC45OS4xMSBwYXRjaGVzIChjYWVAanBtb3JnYW4uY29tKSAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjcgdG8gdmVyc2lvbiAxLjgKKyAqCisgKiBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgorICovCisKKy8qIENoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuNiB0byB2ZXJzaW9uIDEuNworICoKKyAqIFJlbW92ZWQgQ1NJUiBjb21tYW5kIGNvZGUuCisgKgorICogQmV0dGVyIHJhY2UgY29uZGl0aW9uIGF2b2lkYW5jZSAoeGNoZ2IgZnVuY3Rpb24gYWRkZWQpLgorICoKKyAqIFNldCBJQ00gYW5kIE9HTSBzdGF0dXMgdG8gemVybyBhdCBwcm9iZSAoMjRGKQorICoKKyAqIHJlc2V0IHNlbmRzIHNvZnQgcmVzZXQgdG8gVWx0cmFTdG9yIGFkYXB0ZXIKKyAqCisgKiByZXNldCBhZGFwdGVyIGlmIGFkYXB0ZXIgaW50ZXJydXB0cyB3aXRoIGFuIGludmFsaWQgTVNDUCBhZGRyZXNzCisgKgorICogaGFuZGxlIGFib3J0ZWQgY29tbWFuZCBpbnRlcnJ1cHQgKDI0RikKKyAqCisgKi8KKworLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS41IHRvIHZlcnNpb24gMS42OgorICoKKyAqIFJlYWQgTVNDUCBhZGRyZXNzIGZyb20gSUNNIF9iZWZvcmVfIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgZmxhZy4KKyAqIFRoaXMgZml4ZXMgYSByYWNlIGNvbmRpdGlvbi4KKyAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjQgdG8gdmVyc2lvbiAxLjU6CisgKgorICogQWJvcnQgbm93IGNhbGxzIGRvbmUgd2hlbiBtdWx0aXBsZSBjb21tYW5kcyBhcmUgZW5hYmxlZC4KKyAqCisgKiBDbGVhciBidXN5IHdoZW4gYWJvcnRlZCBjb21tYW5kIGZpbmlzaGVzLCBub3Qgd2hlbiBhYm9ydCBpcyBjYWxsZWQuCisgKgorICogTW9yZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgZm9yIGFib3J0cy4KKyAqLworCisvKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjMgdG8gdmVyc2lvbiAxLjQ6CisgKgorICogRW5hYmxlIGF1dG9tYXRpYyByZXF1ZXN0IG9mIHNlbnNlIGRhdGEgb24gZXJyb3IgKHJlcXVpcmVzIG5ld2VyIHZlcnNpb24KKyAqIG9mIHNjc2kuYyB0byBiZSB1c2VmdWwpLgorICoKKyAqIEZpeCBQT1JUX09WRVJSSURFIGZvciAxNEYuCisgKgorICogRml4IGFib3J0IGFuZCByZXNldCB0byB3b3JrIHByb3Blcmx5IChjb25maWcuYWJvcnRlZCB3YXNuJ3QgY2xlYXJlZAorICogYWZ0ZXIgaXQgd2FzIHRlc3RlZCwgc28gYWZ0ZXIgYSBjb21tYW5kIGFib3J0IG5vIGZ1cnRoZXIgY29tbWFuZHMgd291bGQKKyAqIHdvcmspLgorICoKKyAqIEJvb3QgdGltZSB0ZXN0IHRvIGVuYWJsZSBTQ1NJIGJ1cyByZXNldCAoZGVmYXVsdHMgdG8gbm90IGFsbG93aW5nIHJlc2V0KS4KKyAqCisgKiBGaXggdGVzdCBmb3IgT0dNIGJ1c3kgLS0gdGhlIGJ1c3kgYml0IGlzIGluIGRpZmZlcmVudCBwbGFjZXMgb24gdGhlIDI0Ri4KKyAqCisgKiBSZWxlYXNlIElDTSBzbG90IGJ5IGNsZWFyaW5nIGZpcnN0IGJ5dGUgb24gMjRGLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjZGVmaW5lIFVMVFJBU1RPUl9QUklWQVRFCS8qIEdldCB0aGUgcHJpdmF0ZSBzdHVmZiBmcm9tIHVsdHJhc3Rvci5oICovCisjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSAidWx0cmFzdG9yLmgiCisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFIDEKKworI2lmbmRlZiBVTFRSQVNUT1JfREVCVUcKKyNkZWZpbmUgVUxUUkFTVE9SX0RFQlVHIChVRF9BQk9SVHxVRF9DU0lSfFVEX1JFU0VUKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4xMiIKKworI2RlZmluZSBQQUNLRUQJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjZGVmaW5lIEFMSUdORUQoeCkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpCisKKworLyogVGhlIDE0RiB1c2VzIGFuIGFycmF5IG9mIDQtYnl0ZSBpbnRzIGZvciBpdHMgc2NhdHRlci9nYXRoZXIgbGlzdC4KKyAgIFRoZSBkYXRhIGNhbiBiZSB1bmFsaWduZWQsIGJ1dCBuZWVkIG5vdCBiZS4gIEl0J3MgZWFzaWVyIHRvIGdpdmUKKyAgIHRoZSBsaXN0IG5vcm1hbCBhbGlnbm1lbnQgc2luY2UgaXQgZG9lc24ndCBuZWVkIHRvIGZpdCBpbnRvIGEKKyAgIHBhY2tlZCBzdHJ1Y3R1cmUuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHUzMiBhZGRyZXNzOworICB1MzIgbnVtX2J5dGVzOworfSB1bHRyYXN0b3Jfc2dfbGlzdDsKKworCisvKiBNYWlsQm94IFNDU0kgQ29tbWFuZCBQYWNrZXQuICBCYXNpYyBjb21tYW5kIHN0cnVjdHVyZSBmb3IgY29tbXVuaWNhdGluZworICAgd2l0aCBjb250cm9sbGVyLiAqLworc3RydWN0IG1zY3AgeworICB1bnNpZ25lZCBjaGFyIG9wY29kZTogMzsJCS8qIHR5cGUgb2YgY29tbWFuZCAqLworICB1bnNpZ25lZCBjaGFyIHhkaXI6IDI7CQkvKiBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAqLworICB1bnNpZ25lZCBjaGFyIGRjbjogMTsJCS8qIGRpc2FibGUgZGlzY29ubmVjdCAqLworICB1bnNpZ25lZCBjaGFyIGNhOiAxOwkJLyogdXNlIGNhY2hlIChpZiBhdmFpbGFibGUpICovCisgIHVuc2lnbmVkIGNoYXIgc2c6IDE7CQkvKiBzY2F0dGVyL2dhdGhlciBvcGVyYXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciB0YXJnZXRfaWQ6IDM7CQkvKiB0YXJnZXQgU0NTSSBpZCAqLworICB1bnNpZ25lZCBjaGFyIGNoX25vOiAyOwkJLyogU0NTSSBjaGFubmVsIChhbHdheXMgMCBmb3IgMTRmKSAqLworICB1bnNpZ25lZCBjaGFyIGx1bjogMzsJCS8qIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2RhdGEgUEFDS0VEOwkvKiB0cmFuc2ZlciBkYXRhIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2RhdGFfbGVuZ3RoIFBBQ0tFRDsJLyogbGVuZ3RoIGluIGJ5dGVzICovCisgIHVuc2lnbmVkIGludCBjb21tYW5kX2xpbmsgUEFDS0VEOwkvKiBmb3IgbGlua2luZyBjb21tYW5kIGNoYWlucyAqLworICB1bnNpZ25lZCBjaGFyIHNjc2lfY29tbWFuZF9saW5rX2lkOwkvKiBpZGVudGlmaWVzIGNvbW1hbmQgaW4gY2hhaW4gKi8KKyAgdW5zaWduZWQgY2hhciBudW1iZXJfb2Zfc2dfbGlzdDsJLyogKGlmIHNnIGlzIHNldCkgOCBieXRlcyBwZXIgbGlzdCAqLworICB1bnNpZ25lZCBjaGFyIGxlbmd0aF9vZl9zZW5zZV9ieXRlOworICB1bnNpZ25lZCBjaGFyIGxlbmd0aF9vZl9zY3NpX2NkYnM7CS8qIDYsIDEwLCBvciAxMiAqLworICB1bnNpZ25lZCBjaGFyIHNjc2lfY2Ric1sxMl07CS8qIFNDU0kgY29tbWFuZHMgKi8KKyAgdW5zaWduZWQgY2hhciBhZGFwdGVyX3N0YXR1czsJLyogbm9uLXplcm8gaW5kaWNhdGVzIEhBIGVycm9yICovCisgIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X3N0YXR1czsJLyogbm9uLXplcm8gaW5kaWNhdGVzIHRhcmdldCBlcnJvciAqLworICB1MzIgc2Vuc2VfZGF0YSBQQUNLRUQ7CisgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBmb3Igc29mdHdhcmUgb25seS4gIFRoZXkgYXJlIGluY2x1ZGVkIGluCisgICAgIHRoZSBNU0NQIHN0cnVjdHVyZSBiZWNhdXNlIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aCBTQ1NJIHJlcXVlc3RzLiAgKi8KKyAgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKTsKKyAgU2NzaV9DbW5kICpTQ2ludDsKKyAgdWx0cmFzdG9yX3NnX2xpc3Qgc2dsaXN0W1VMVFJBU1RPUl8yNEZfTUFYX1NHXTsgLyogdXNlIGxhcmdlciBzaXplIGZvciAyNEYgKi8KK307CisKKworLyogUG9ydCBhZGRyZXNzZXMgKHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MpICovCisjZGVmaW5lIFUxNEZfUFJPRFVDVF9JRChwb3J0KSAoKHBvcnQpICsgMHg0KQorI2RlZmluZSBDT05GSUcocG9ydCkgKChwb3J0KSArIDB4NikKKworLyogUG9ydCBhZGRyZXNzZXMgcmVsYXRpdmUgdG8gdGhlIGRvb3JiZWxsIGJhc2UgYWRkcmVzcy4gICovCisjZGVmaW5lIExDTF9ET09SQkVMTF9NQVNLKHBvcnQpICgocG9ydCkgKyAweDApCisjZGVmaW5lIExDTF9ET09SQkVMTF9JTlRSKHBvcnQpICgocG9ydCkgKyAweDEpCisjZGVmaW5lIFNZU19ET09SQkVMTF9NQVNLKHBvcnQpICgocG9ydCkgKyAweDIpCisjZGVmaW5lIFNZU19ET09SQkVMTF9JTlRSKHBvcnQpICgocG9ydCkgKyAweDMpCisKKworLyogVXNlZCB0byBzdG9yZSBjb25maWd1cmF0aW9uIGluZm8gcmVhZCBmcm9tIGNvbmZpZyBpL28gcmVnaXN0ZXJzLiAgTW9zdCBvZgorICAgdGhpcyBpcyBub3QgdXNlZCB5ZXQsIGJ1dCBtaWdodCBhcyB3ZWxsIHNhdmUgaXQuCisgICAKKyAgIFRoaXMgc3RydWN0dXJlIGFsc28gaG9sZHMgcG9ydCBhZGRyZXNzZXMgdGhhdCBhcmUgbm90IGF0IHRoZSBzYW1lIG9mZnNldAorICAgb24gdGhlIDE0RiBhbmQgMjRGLgorICAgCisgICBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgZGF0YSB0aGF0IG11c3QgYmUgZHVwbGljYXRlZCB0byBzdXBwb3J0IG11bHRpcGxlCisgICBhZGFwdGVycy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdWx0cmFzdG9yX2NvbmZpZworeworICB1bnNpZ25lZCBzaG9ydCBwb3J0X2FkZHJlc3M7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgY2FyZCAqLworICB1bnNpZ25lZCBzaG9ydCBkb29yYmVsbF9hZGRyZXNzOwkvKiBiYXNlIGFkZHJlc3Mgb2YgZG9vcmJlbGwgQ1NScyAqLworICB1bnNpZ25lZCBzaG9ydCBvZ21fYWRkcmVzczsJCS8qIGJhc2UgYWRkcmVzcyBvZiBPR00gKi8KKyAgdW5zaWduZWQgc2hvcnQgaWNtX2FkZHJlc3M7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgSUNNICovCisgIGNvbnN0IHZvaWQgKmJpb3Nfc2VnbWVudDsKKyAgdW5zaWduZWQgY2hhciBpbnRlcnJ1cHQ6IDQ7CisgIHVuc2lnbmVkIGNoYXIgZG1hX2NoYW5uZWw6IDM7CisgIHVuc2lnbmVkIGNoYXIgYmlvc19kcml2ZV9udW1iZXI6IDE7CisgIHVuc2lnbmVkIGNoYXIgaGVhZHM7CisgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKyAgdW5zaWduZWQgY2hhciBoYV9zY3NpX2lkOiAzOworICB1bnNpZ25lZCBjaGFyIHN1YnZlcnNpb246IDQ7CisgIHVuc2lnbmVkIGNoYXIgcmV2aXNpb247CisgIC8qIFRoZSBzbG90IG51bWJlciBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSAyNEYgKHNsb3QgIT0gMCkgZnJvbQorICAgICB0aGUgMTRGIGFuZCAzNEYgKHNsb3QgPT0gMCkuICovCisgIHVuc2lnbmVkIGNoYXIgc2xvdDsKKworI2lmZGVmIFBSSU5UX1UyNEZfVkVSU0lPTgorICB2b2xhdGlsZSBpbnQgY3Npcl9kb25lOworI2VuZGlmCisKKyAgLyogQSBwb29sIG9mIE1TQ1Agc3RydWN0dXJlcyBmb3IgdGhpcyBhZGFwdGVyLCBhbmQgYSBiaXRtYXNrIG9mCisgICAgIGJ1c3kgc3RydWN0dXJlcy4gIChJZiBVTFRSQVNUT1JfMTRGX01BWF9DTURTID09IDEsIGEgMSBieXRlCisgICAgIGJ1c3kgZmxhZyBpcyB1c2VkIGluc3RlYWQuKSAgKi8KKworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA9PSAxCisgIHVuc2lnbmVkIGNoYXIgbXNjcF9idXN5OworI2Vsc2UKKyAgdW5zaWduZWQgbG9uZyBtc2NwX2ZyZWU7CisjZW5kaWYKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBhYm9ydGVkW1VMVFJBU1RPUl9NQVhfQ01EU107CisgIHN0cnVjdCBtc2NwIG1zY3BbVUxUUkFTVE9SX01BWF9DTURTXTsKK30gY29uZmlnID0gezB9OworCisvKiBTZXQgdGhpcyB0byAxIHRvIHJlc2V0IHRoZSBTQ1NJIGJ1cyBvbiBlcnJvci4gICovCitzdGF0aWMgaW50IHVsdHJhc3Rvcl9idXNfcmVzZXQ7CisKKworLyogQWxsb3dlZCBCSU9TIGJhc2UgYWRkcmVzc2VzIChOVUxMIGluZGljYXRlcyByZXNlcnZlZCkgKi8KK3N0YXRpYyBjb25zdCB2b2lkICpjb25zdCBiaW9zX3NlZ21lbnRfdGFibGVbOF0gPSB7CisgIE5VTEwsCSAgICAgKHZvaWQgKikweEM0MDAwLCAodm9pZCAqKTB4QzgwMDAsICh2b2lkICopMHhDQzAwMCwKKyAgKHZvaWQgKikweEQwMDAwLCAodm9pZCAqKTB4RDQwMDAsICh2b2lkICopMHhEODAwMCwgKHZvaWQgKikweERDMDAwLAorfTsKKworLyogQWxsb3dlZCBJUlFzIGZvciAxNGYgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGludGVycnVwdF90YWJsZV8xNGZbNF0gPSB7IDE1LCAxNCwgMTEsIDEwIH07CisKKy8qIEFsbG93ZWQgRE1BIGNoYW5uZWxzIGZvciAxNGYgKDAgaW5kaWNhdGVzIHJlc2VydmVkKSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZG1hX2NoYW5uZWxfdGFibGVfMTRmWzRdID0geyA1LCA2LCA3LCAwIH07CisKKy8qIEhlYWQvc2VjdG9yIG1hcHBpbmdzIGFsbG93ZWQgYnkgMTRmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBoZWFkczsKKyAgdW5zaWduZWQgY2hhciBzZWN0b3JzOworfSBtYXBwaW5nX3RhYmxlWzRdID0geyB7IDE2LCA2MyB9LCB7IDY0LCAzMiB9LCB7IDY0LCA2MyB9LCB7IDY0LCAzMiB9IH07CisKKyNpZm5kZWYgUE9SVF9PVkVSUklERQorLyogPz8/IEEgcHJvYmUgb2YgYWRkcmVzcyAweDMxMCBzY3Jld3MgdXAgTkUyMDAwIGNhcmRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdWx0cmFzdG9yX3BvcnRzXzE0ZltdID0geworICAweDMzMCwgMHgzNDAsIC8qMHgzMTAsKi8gMHgyMzAsIDB4MjQwLCAweDIxMCwgMHgxMzAsIDB4MTQwLAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB1bHRyYXN0b3JfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkb191bHRyYXN0b3JfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF9zZ19saXN0KHN0cnVjdCBtc2NwICosIFNjc2lfQ21uZCAqU0NwbnQpOworCisKKy8qIEFsd2F5cyBjYWxsZWQgd2l0aCBob3N0IGxvY2sgaGVsZCAqLworCitzdGF0aWMgaW5saW5lIGludCBmaW5kX2FuZF9jbGVhcl9iaXRfMTYodW5zaWduZWQgbG9uZyAqZmllbGQpCit7CisgIGludCBydjsKKworICBpZiAoKmZpZWxkID09IDApIHBhbmljKCJObyBmcmVlIG1zY3AiKTsKKyAgYXNtKCJ4b3JsICUwLCUwXG4wOlx0YnNmdyAlMSwldzBcblx0YnRyICUwLCUxXG5cdGpuYyAwYiIKKyAgICAgIDogIj0mciIgKHJ2KSwgIj1tIiAoKmZpZWxkKSA6ICIxIiAoKmZpZWxkKSk7CisgIHJldHVybiBydjsKK30KKworLyogVGhpcyBoYXMgYmVlbiByZS1pbXBsZW1lbnRlZCB3aXRoIHRoZSBoZWxwIG9mIFJpY2hhcmQgRWFybnNoYXcsCisgICA8cndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZz4gYW5kIHdvcmtzIHdpdGggZ2NjLTIuNS44IGFuZCBnY2MtMi42LjAuCisgICBUaGUgaW5zdGFiaWxpdHkgbm90ZWQgYnkgamZjIGJlbG93IGFwcGVhcnMgdG8gYmUgYSBidWcgaW4KKyAgIGdjYy0yLjUueCB3aGVuIGNvbXBpbGluZyB3L28gb3B0aW1pemF0aW9uLiAgLS1DYWxlYgorCisgICBUaGlzIGFzbSBpcyBmcmFnaWxlOiBpdCBkb2Vzbid0IHdvcmsgd2l0aG91dCB0aGUgY2FzdHMgYW5kIGl0IG1heQorICAgbm90IHdvcmsgd2l0aG91dCBvcHRpbWl6YXRpb24uICBNYXliZSBJIHNob3VsZCBhZGQgYSBzd2FwIGJ1aWx0aW4KKyAgIHRvIGdjYy4gIC0tamZjICAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHhjaGdiKHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJCSAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqbWVtKQoreworICBfX2FzbV9fICgieGNoZ2IgJTAsJTEiIDogIj1xIiAocmVnKSwgIj1tIiAoKm1lbSkgOiAiMCIgKHJlZykpOworICByZXR1cm4gcmVnOworfQorCisjaWYgVUxUUkFTVE9SX0RFQlVHICYgKFVEX0NPTU1BTkQgfCBVRF9BQk9SVCkKKworLyogQWx3YXlzIGNhbGxlZCB3aXRoIHRoZSBob3N0IGxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgbG9nX3VsdHJhc3Rvcl9hYm9ydChzdHJ1Y3QgdWx0cmFzdG9yX2NvbmZpZyAqY29uZmlnLAorCQkJCWludCBjb21tYW5kKQoreworICBzdGF0aWMgY2hhciBmbXRbODBdID0gImFib3J0ICVkICgleCk7IE1TQ1AgZnJlZSBwb29sOiAleDsiOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgVUxUUkFTVE9SX01BWF9DTURTOyBpKyspCisgICAgeworICAgICAgZm10WzIwICsgaSoyXSA9ICcgJzsKKyAgICAgIGlmICghIChjb25maWctPm1zY3BfZnJlZSAmICgxIDw8IGkpKSkKKwlmbXRbMjEgKyBpKjJdID0gJzAnICsgY29uZmlnLT5tc2NwW2ldLnRhcmdldF9pZDsKKyAgICAgIGVsc2UKKwlmbXRbMjEgKyBpKjJdID0gJy0nOworICAgIH0KKyAgZm10WzIwICsgVUxUUkFTVE9SX01BWF9DTURTICogMl0gPSAnXG4nOworICBmbXRbMjEgKyBVTFRSQVNUT1JfTUFYX0NNRFMgKiAyXSA9IDA7CisgIHByaW50ayhmbXQsIGNvbW1hbmQsICZjb25maWctPm1zY3BbY29tbWFuZF0sIGNvbmZpZy0+bXNjcF9mcmVlKTsKKworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdWx0cmFzdG9yXzE0Zl9kZXRlY3QoU2NzaV9Ib3N0X1RlbXBsYXRlICogdHBudCkKK3sKKyAgICBzaXplX3QgaTsKKyAgICB1bnNpZ25lZCBjaGFyIGluX2J5dGUsIHZlcnNpb25fYnl0ZSA9IDA7CisgICAgc3RydWN0IGNvbmZpZ18xIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYmlvc19zZWdtZW50OiAzOworICAgICAgdW5zaWduZWQgY2hhciByZW1vdmFibGVfZGlza3NfYXNfZml4ZWQ6IDE7CisgICAgICB1bnNpZ25lZCBjaGFyIGludGVycnVwdDogMjsKKyAgICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsOiAyOworICAgIH0gY29uZmlnXzE7CisgICAgc3RydWN0IGNvbmZpZ18yIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaGFfc2NzaV9pZDogMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgbWFwcGluZ19tb2RlOiAyOworICAgICAgdW5zaWduZWQgY2hhciBiaW9zX2RyaXZlX251bWJlcjogMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdGZyX3BvcnQ6IDI7CisgICAgfSBjb25maWdfMjsKKworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBjYWxsZWRcbiIpOworI2VuZGlmCisKKyAgICAvKiBJZiBhIDI0RiBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIGRvbid0IGxvb2sgZm9yIGEgMTRGLiAgKi8KKyAgICBpZiAoY29uZmlnLmJpb3Nfc2VnbWVudCkKKwlyZXR1cm4gRkFMU0U7CisKKyNpZmRlZiBQT1JUX09WRVJSSURFCisgICAgaWYoIXJlcXVlc3RfcmVnaW9uKFBPUlRfT1ZFUlJJREUsIDB4YywgInVsdHJhc3RvciIpKSB7CisgICAgICBwcmludGsoIlVsdHJhc3RvciBJL08gc3BhY2UgYWxyZWFkeSBpbiB1c2VcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH07CisgICAgY29uZmlnLnBvcnRfYWRkcmVzcyA9IFBPUlRfT1ZFUlJJREU7CisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHVsdHJhc3Rvcl9wb3J0c18xNGYpOyBpKyspIHsKKyAgICAgIGlmKCFyZXF1ZXN0X3JlZ2lvbih1bHRyYXN0b3JfcG9ydHNfMTRmW2ldLCAweDBjLCAidWx0cmFzdG9yIikpIGNvbnRpbnVlOworICAgICAgY29uZmlnLnBvcnRfYWRkcmVzcyA9IHVsdHJhc3Rvcl9wb3J0c18xNGZbaV07CisjZW5kaWYKKworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisJcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiB0ZXN0aW5nIHBvcnQgYWRkcmVzcyAlMDNYXG4iLCBjb25maWcucG9ydF9hZGRyZXNzKTsKKyNlbmRpZgorCisJaW5fYnl0ZSA9IGluYihVMTRGX1BST0RVQ1RfSUQoY29uZmlnLnBvcnRfYWRkcmVzcykpOworCWlmIChpbl9ieXRlICE9IFVTMTRGX1BST0RVQ1RfSURfMCkgeworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisjIGlmZGVmIFBPUlRfT1ZFUlJJREUKKwkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiB3cm9uZyBwcm9kdWN0IElEIDAgLSAlMDJYXG4iLCBpbl9ieXRlKTsKKyMgZWxzZQorCSAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IG5vIGFkYXB0ZXIgYXQgcG9ydCAlMDNYXG4iLCBjb25maWcucG9ydF9hZGRyZXNzKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIFBPUlRfT1ZFUlJJREUKKwkgICAgZ290byBvdXRfcmVsZWFzZV9wb3J0OworI2Vsc2UKKwkgICAgcmVsZWFzZV9yZWdpb24oY29uZmlnLnBvcnRfYWRkcmVzcywgMHgwYyk7CisJICAgIGNvbnRpbnVlOworI2VuZGlmCisJfQorCWluX2J5dGUgPSBpbmIoVTE0Rl9QUk9EVUNUX0lEKGNvbmZpZy5wb3J0X2FkZHJlc3MpICsgMSk7CisJLyogT25seSB1cHBlciBuaWJibGUgaXMgc2lnbmlmaWNhbnQgZm9yIFByb2R1Y3QgSUQgMSAqLworCWlmICgoaW5fYnl0ZSAmIDB4RjApICE9IFVTMTRGX1BST0RVQ1RfSURfMSkgeworI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCisjIGlmZGVmIFBPUlRfT1ZFUlJJREUKKwkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiB3cm9uZyBwcm9kdWN0IElEIDEgLSAlMDJYXG4iLCBpbl9ieXRlKTsKKyMgZWxzZQorCSAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IG5vIGFkYXB0ZXIgYXQgcG9ydCAlMDNYXG4iLCBjb25maWcucG9ydF9hZGRyZXNzKTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIFBPUlRfT1ZFUlJJREUKKwkgICAgZ290byBvdXRfcmVsZWFzZV9wb3J0OworI2Vsc2UKKwkgICAgcmVsZWFzZV9yZWdpb24oY29uZmlnLnBvcnRfYWRkcmVzcywgMHgwYyk7CisJICAgIGNvbnRpbnVlOworI2VuZGlmCisJfQorCXZlcnNpb25fYnl0ZSA9IGluX2J5dGU7CisjaWZuZGVmIFBPUlRfT1ZFUlJJREUKKwlicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gQVJSQVlfU0laRSh1bHRyYXN0b3JfcG9ydHNfMTRmKSkgeworIyBpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorCXByaW50aygiVVMxNEY6IGRldGVjdDogbm8gcG9ydCBhZGRyZXNzIGZvdW5kIVxuIik7CisjIGVuZGlmCisJLyogYWxsIHBvcnRzIHByb2JlZCBhbHJlYWR5IHJlbGVhc2VkIC0gd2UgY2FuIGp1c3QgZ28gc3RyYWlnaHQgb3V0ICovCisJcmV0dXJuIEZBTFNFOworICAgIH0KKyNlbmRpZgorCisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKyAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IGFkYXB0ZXIgZm91bmQgYXQgcG9ydCBhZGRyZXNzICUwM1hcbiIsCisJICAgY29uZmlnLnBvcnRfYWRkcmVzcyk7CisjZW5kaWYKKworICAgIC8qIFNldCBsb2NhbCBkb29yYmVsbCBtYXNrIHRvIGRpc2FsbG93IGJ1cyByZXNldCB1bmxlc3MKKyAgICAgICB1bHRyYXN0b3JfYnVzX3Jlc2V0IGlzIHRydWUuICAqLworICAgIG91dGIodWx0cmFzdG9yX2J1c19yZXNldCA/IDB4YzIgOiAweDgyLCBMQ0xfRE9PUkJFTExfTUFTSyhjb25maWcucG9ydF9hZGRyZXNzKSk7CisKKyAgICAvKiBBbGwgYWJvdmUgdGVzdHMgcGFzc2VkLCBtdXN0IGJlIHRoZSByaWdodCB0aGluZy4gIEdldCBzb21lIHVzZWZ1bAorICAgICAgIGluZm8uICovCisKKyAgICAvKiBSZWdpc3RlciB0aGUgSS9PIHNwYWNlIHRoYXQgd2UgdXNlICovCisKKyAgICAqKGNoYXIgKikmY29uZmlnXzEgPSBpbmIoQ09ORklHKGNvbmZpZy5wb3J0X2FkZHJlc3MgKyAwKSk7CisgICAgKihjaGFyICopJmNvbmZpZ18yID0gaW5iKENPTkZJRyhjb25maWcucG9ydF9hZGRyZXNzICsgMSkpOworICAgIGNvbmZpZy5iaW9zX3NlZ21lbnQgPSBiaW9zX3NlZ21lbnRfdGFibGVbY29uZmlnXzEuYmlvc19zZWdtZW50XTsKKyAgICBjb25maWcuZG9vcmJlbGxfYWRkcmVzcyA9IGNvbmZpZy5wb3J0X2FkZHJlc3M7CisgICAgY29uZmlnLm9nbV9hZGRyZXNzID0gY29uZmlnLnBvcnRfYWRkcmVzcyArIDB4ODsKKyAgICBjb25maWcuaWNtX2FkZHJlc3MgPSBjb25maWcucG9ydF9hZGRyZXNzICsgMHhDOworICAgIGNvbmZpZy5pbnRlcnJ1cHQgPSBpbnRlcnJ1cHRfdGFibGVfMTRmW2NvbmZpZ18xLmludGVycnVwdF07CisgICAgY29uZmlnLmhhX3Njc2lfaWQgPSBjb25maWdfMi5oYV9zY3NpX2lkOworICAgIGNvbmZpZy5oZWFkcyA9IG1hcHBpbmdfdGFibGVbY29uZmlnXzIubWFwcGluZ19tb2RlXS5oZWFkczsKKyAgICBjb25maWcuc2VjdG9ycyA9IG1hcHBpbmdfdGFibGVbY29uZmlnXzIubWFwcGluZ19tb2RlXS5zZWN0b3JzOworICAgIGNvbmZpZy5iaW9zX2RyaXZlX251bWJlciA9IGNvbmZpZ18yLmJpb3NfZHJpdmVfbnVtYmVyOworICAgIGNvbmZpZy5zdWJ2ZXJzaW9uID0gKHZlcnNpb25fYnl0ZSAmIDB4MEYpOworICAgIGlmIChjb25maWcuc3VidmVyc2lvbiA9PSBVMzRGKQorCWNvbmZpZy5kbWFfY2hhbm5lbCA9IDA7CisgICAgZWxzZQorCWNvbmZpZy5kbWFfY2hhbm5lbCA9IGRtYV9jaGFubmVsX3RhYmxlXzE0Zltjb25maWdfMS5kbWFfY2hhbm5lbF07CisKKyAgICBpZiAoIWNvbmZpZy5iaW9zX3NlZ21lbnQpIHsKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorCXByaW50aygiVVMxNEY6IGRldGVjdDogbm90IGRldGVjdGVkLlxuIik7CisjZW5kaWYKKwlnb3RvIG91dF9yZWxlYXNlX3BvcnQ7CisgICAgfQorCisgICAgLyogRmluYWwgY29uc2lzdGVuY3kgY2hlY2ssIHZlcmlmeSBwcmV2aW91cyBpbmZvLiAqLworICAgIGlmIChjb25maWcuc3VidmVyc2lvbiAhPSBVMzRGKQorCWlmICghY29uZmlnLmRtYV9jaGFubmVsIHx8ICEoY29uZmlnXzIudGZyX3BvcnQgJiAweDIpKSB7CisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKwkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBjb25zaXN0ZW5jeSBjaGVjayBmYWlsZWRcbiIpOworI2VuZGlmCisgICAgICAgICAgIGdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKKwl9CisKKyAgICAvKiBJZiB3ZSB3ZXJlIFRSVUxZIHBhcmFub2lkLCB3ZSBjb3VsZCBpc3N1ZSBhIGhvc3QgYWRhcHRlciBpbnF1aXJ5CisgICAgICAgY29tbWFuZCBoZXJlIGFuZCB2ZXJpZnkgdGhlIGRhdGEgcmV0dXJuZWQuICBCdXQgZnJhbmtseSwgSSdtCisgICAgICAgZXhoYXVzdGVkISAqLworCisgICAgLyogRmluYWxseSEgIE5vdyBJJ20gc2F0aXNmaWVkLi4uICovCisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKyAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IGRldGVjdCBzdWNjZWVkZWRcbiIKKwkgICAiICBQb3J0IGFkZHJlc3M6ICUwM1hcbiIKKwkgICAiICBCSU9TIHNlZ21lbnQ6ICUwNVhcbiIKKwkgICAiICBJbnRlcnJ1cHQ6ICV1XG4iCisJICAgIiAgRE1BIGNoYW5uZWw6ICV1XG4iCisJICAgIiAgSC9BIFNDU0kgSUQ6ICV1XG4iCisJICAgIiAgU3VidmVyc2lvbjogJXVcbiIsCisJICAgY29uZmlnLnBvcnRfYWRkcmVzcywgY29uZmlnLmJpb3Nfc2VnbWVudCwgY29uZmlnLmludGVycnVwdCwKKwkgICBjb25maWcuZG1hX2NoYW5uZWwsIGNvbmZpZy5oYV9zY3NpX2lkLCBjb25maWcuc3VidmVyc2lvbik7CisjZW5kaWYKKyAgICB0cG50LT50aGlzX2lkID0gY29uZmlnLmhhX3Njc2lfaWQ7CisgICAgdHBudC0+dW5jaGVja2VkX2lzYV9kbWEgPSAoY29uZmlnLnN1YnZlcnNpb24gIT0gVTM0Rik7CisKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCisgICAgY29uZmlnLm1zY3BfZnJlZSA9IH4wOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEJycnIsICZjb25maWcubXNjcFswXS5TQ2ludC0+aG9zdCkgaXQgaXMgc29tZXRoaW5nIG1hZ2ljYWwuLi4uCisgICAgICogWFhYIGFuZCBGSVhNRQorICAgICAqLworICAgIGlmIChyZXF1ZXN0X2lycShjb25maWcuaW50ZXJydXB0LCBkb191bHRyYXN0b3JfaW50ZXJydXB0LCAwLCAiVWx0cmFzdG9yIiwgJmNvbmZpZy5tc2NwWzBdLlNDaW50LT5kZXZpY2UtPmhvc3QpKSB7CisJcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgSVJRJXUgZm9yIFVsdHJhU3RvciBjb250cm9sbGVyLlxuIiwKKwkgICAgICAgY29uZmlnLmludGVycnVwdCk7CisJZ290byBvdXRfcmVsZWFzZV9wb3J0OworICAgIH0KKyAgICBpZiAoY29uZmlnLmRtYV9jaGFubmVsICYmIHJlcXVlc3RfZG1hKGNvbmZpZy5kbWFfY2hhbm5lbCwiVWx0cmFzdG9yIikpIHsKKwlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbCAldSBmb3IgVWx0cmFTdG9yIGNvbnRyb2xsZXIuXG4iLAorCSAgICAgICBjb25maWcuZG1hX2NoYW5uZWwpOworCWZyZWVfaXJxKGNvbmZpZy5pbnRlcnJ1cHQsIE5VTEwpOworCWdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKKyAgICB9CisgICAgdHBudC0+c2dfdGFibGVzaXplID0gVUxUUkFTVE9SXzE0Rl9NQVhfU0c7CisgICAgcHJpbnRrKCJVbHRyYVN0b3IgZHJpdmVyIHZlcnNpb24iIFZFUlNJT04gIi4gIFVzaW5nICVkIFNHIGxpc3RzLlxuIiwKKwkgICBVTFRSQVNUT1JfMTRGX01BWF9TRyk7CisKKyAgICByZXR1cm4gVFJVRTsKK291dF9yZWxlYXNlX3BvcnQ6CisgICAgcmVsZWFzZV9yZWdpb24oY29uZmlnLnBvcnRfYWRkcmVzcywgMHgwYyk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IHVsdHJhc3Rvcl8yNGZfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisgIGludCBpOworICBzdHJ1Y3QgU2NzaV9Ib3N0ICogc2hwbnQgPSBOVUxMOworCisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKyAgcHJpbnRrKCJVUzI0RjogZGV0ZWN0Iik7CisjZW5kaWYKKworICAvKiBwcm9iZSBlYWNoIEVJU0Egc2xvdCBhdCBzbG90IGFkZHJlc3MgQzgwICovCisgIGZvciAoaSA9IDE7IGkgPCAxNTsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgY29uZmlnXzEsIGNvbmZpZ18yOworICAgICAgdW5zaWduZWQgc2hvcnQgYWRkciA9IChpIDw8IDEyKSB8IFVMVFJBU1RPUl8yNEZfUE9SVDsKKworICAgICAgaWYgKGluYihhZGRyKSAhPSBVUzI0Rl9QUk9EVUNUX0lEXzAgJiYKKwkgIGluYihhZGRyKzEpICE9IFVTMjRGX1BST0RVQ1RfSURfMSAmJgorCSAgaW5iKGFkZHIrMikgIT0gVVMyNEZfUFJPRFVDVF9JRF8yKQorCWNvbnRpbnVlOworCisgICAgICBjb25maWcucmV2aXNpb24gPSBpbmIoYWRkciszKTsKKyAgICAgIGNvbmZpZy5zbG90ID0gaTsKKyAgICAgIGlmICghIChpbmIoYWRkcis0KSAmIDEpKQorCXsKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQorCSAgcHJpbnRrKCJVMjRGOiBmb3VuZCBkaXNhYmxlZCBjYXJkIGluIHNsb3QgJXVcbiIsIGkpOworI2VuZGlmCisJICBjb250aW51ZTsKKwl9CisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKyAgICAgIHByaW50aygiVTI0RjogZm91bmQgY2FyZCBpbiBzbG90ICV1XG4iLCBpKTsKKyNlbmRpZgorICAgICAgY29uZmlnXzEgPSBpbmIoYWRkciArIDUpOworICAgICAgY29uZmlnLmJpb3Nfc2VnbWVudCA9IGJpb3Nfc2VnbWVudF90YWJsZVtjb25maWdfMSAmIDddOworICAgICAgc3dpdGNoKGNvbmZpZ18xID4+IDQpCisJeworCWNhc2UgMToKKwkgIGNvbmZpZy5pbnRlcnJ1cHQgPSAxNTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIGNvbmZpZy5pbnRlcnJ1cHQgPSAxNDsKKwkgIGJyZWFrOworCWNhc2UgNDoKKwkgIGNvbmZpZy5pbnRlcnJ1cHQgPSAxMTsKKwkgIGJyZWFrOworCWNhc2UgODoKKwkgIGNvbmZpZy5pbnRlcnJ1cHQgPSAxMDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGsoIlUyNEY6IGludmFsaWQgSVJRXG4iKTsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisKKyAgICAgIC8qIEJJT1MgYWRkciBzZXQgKi8KKyAgICAgIC8qIGJhc2UgcG9ydCBzZXQgKi8KKyAgICAgIGNvbmZpZy5wb3J0X2FkZHJlc3MgPSBhZGRyOworICAgICAgY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MgPSBhZGRyICsgMTI7CisgICAgICBjb25maWcub2dtX2FkZHJlc3MgPSBhZGRyICsgMHgxNzsKKyAgICAgIGNvbmZpZy5pY21fYWRkcmVzcyA9IGFkZHIgKyAweDFDOworICAgICAgY29uZmlnXzIgPSBpbmIoYWRkciArIDcpOworICAgICAgY29uZmlnLmhhX3Njc2lfaWQgPSBjb25maWdfMiAmIDc7CisgICAgICBjb25maWcuaGVhZHMgPSBtYXBwaW5nX3RhYmxlWyhjb25maWdfMiA+PiAzKSAmIDNdLmhlYWRzOworICAgICAgY29uZmlnLnNlY3RvcnMgPSBtYXBwaW5nX3RhYmxlWyhjb25maWdfMiA+PiAzKSAmIDNdLnNlY3RvcnM7CisjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKKyAgICAgIHByaW50aygiVVMyNEY6IGRldGVjdDogZGV0ZWN0IHN1Y2NlZWRlZFxuIgorCSAgICAgIiAgUG9ydCBhZGRyZXNzOiAlMDNYXG4iCisJICAgICAiICBCSU9TIHNlZ21lbnQ6ICUwNVhcbiIKKwkgICAgICIgIEludGVycnVwdDogJXVcbiIKKwkgICAgICIgIEgvQSBTQ1NJIElEOiAldVxuIiwKKwkgICAgIGNvbmZpZy5wb3J0X2FkZHJlc3MsIGNvbmZpZy5iaW9zX3NlZ21lbnQsCisJICAgICBjb25maWcuaW50ZXJydXB0LCBjb25maWcuaGFfc2NzaV9pZCk7CisjZW5kaWYKKyAgICAgIHRwbnQtPnRoaXNfaWQgPSBjb25maWcuaGFfc2NzaV9pZDsKKyAgICAgIHRwbnQtPnVuY2hlY2tlZF9pc2FfZG1hID0gMDsKKyAgICAgIHRwbnQtPnNnX3RhYmxlc2l6ZSA9IFVMVFJBU1RPUl8yNEZfTUFYX1NHOworCisgICAgICBzaHBudCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgMCk7CisgICAgICBpZiAoIXNocG50KSB7CisgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiKHVsdHJhc3RvcjopIENvdWxkIG5vdCByZWdpc3RlciBzY3NpIGRldmljZS4gQWJvcnRpbmcgcmVnaXN0cmF0aW9uLlxuIik7CisgICAgICAgICAgICAgZnJlZV9pcnEoY29uZmlnLmludGVycnVwdCwgZG9fdWx0cmFzdG9yX2ludGVycnVwdCk7CisgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgCisgICAgICBpZiAocmVxdWVzdF9pcnEoY29uZmlnLmludGVycnVwdCwgZG9fdWx0cmFzdG9yX2ludGVycnVwdCwgMCwgIlVsdHJhc3RvciIsIHNocG50KSkKKwl7CisJICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEldSBmb3IgVWx0cmFTdG9yIGNvbnRyb2xsZXIuXG4iLAorCQkgY29uZmlnLmludGVycnVwdCk7CisJICByZXR1cm4gRkFMU0U7CisJfQorCisgICAgICBzaHBudC0+aXJxID0gY29uZmlnLmludGVycnVwdDsKKyAgICAgIHNocG50LT5kbWFfY2hhbm5lbCA9IGNvbmZpZy5kbWFfY2hhbm5lbDsKKyAgICAgIHNocG50LT5pb19wb3J0ID0gY29uZmlnLnBvcnRfYWRkcmVzczsKKworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA+IDEKKyAgICAgIGNvbmZpZy5tc2NwX2ZyZWUgPSB+MDsKKyNlbmRpZgorICAgICAgLyogTWFyayBJQ00gYW5kIE9HTSBmcmVlICovCisgICAgICBvdXRiKDAsIGFkZHIgKyAweDE2KTsKKyAgICAgIG91dGIoMCwgYWRkciArIDB4MUIpOworCisgICAgICAvKiBTZXQgbG9jYWwgZG9vcmJlbGwgbWFzayB0byBkaXNhbGxvdyBidXMgcmVzZXQgdW5sZXNzCisJIHVsdHJhc3Rvcl9idXNfcmVzZXQgaXMgdHJ1ZS4gICovCisgICAgICBvdXRiKHVsdHJhc3Rvcl9idXNfcmVzZXQgPyAweGMyIDogMHg4MiwgTENMX0RPT1JCRUxMX01BU0soYWRkcisxMikpOworICAgICAgb3V0YigweDAyLCBTWVNfRE9PUkJFTExfTUFTSyhhZGRyKzEyKSk7CisgICAgICBwcmludGsoIlVsdHJhU3RvciBkcml2ZXIgdmVyc2lvbiAiIFZFUlNJT04gIi4gIFVzaW5nICVkIFNHIGxpc3RzLlxuIiwKKwkgICAgIHRwbnQtPnNnX3RhYmxlc2l6ZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCB1bHRyYXN0b3JfZGV0ZWN0KFNjc2lfSG9zdF9UZW1wbGF0ZSAqIHRwbnQpCit7CisJdHBudC0+cHJvY19uYW1lID0gInVsdHJhc3RvciI7CisJcmV0dXJuIHVsdHJhc3Rvcl8xNGZfZGV0ZWN0KHRwbnQpIHx8IHVsdHJhc3Rvcl8yNGZfZGV0ZWN0KHRwbnQpOworfQorCitzdGF0aWMgaW50IHVsdHJhc3Rvcl9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IDB4ZmYpCisJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdWx0cmFzdG9yX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIHNocG50KQoreworICAgIHN0YXRpYyBjaGFyIGJ1Zls2NF07CisKKyAgICBpZiAoY29uZmlnLnNsb3QpCisgICAgICBzcHJpbnRmKGJ1ZiwgIlVsdHJhU3RvciAyNEYgU0NTSSBAIFNsb3QgJXUgSVJRJXUiLAorCSAgICAgIGNvbmZpZy5zbG90LCBjb25maWcuaW50ZXJydXB0KTsKKyAgICBlbHNlIGlmIChjb25maWcuc3VidmVyc2lvbikKKyAgICAgIHNwcmludGYoYnVmLCAiVWx0cmFTdG9yIDM0RiBTQ1NJIEAgUG9ydCAlMDNYIEJJT1MgJTA1WCBJUlEldSIsCisJICAgICAgY29uZmlnLnBvcnRfYWRkcmVzcywgKGludCljb25maWcuYmlvc19zZWdtZW50LAorCSAgICAgIGNvbmZpZy5pbnRlcnJ1cHQpOworICAgIGVsc2UKKyAgICAgIHNwcmludGYoYnVmLCAiVWx0cmFTdG9yIDE0RiBTQ1NJIEAgUG9ydCAlMDNYIEJJT1MgJTA1WCBJUlEldSBETUEldSIsCisJICAgICAgY29uZmlnLnBvcnRfYWRkcmVzcywgKGludCljb25maWcuYmlvc19zZWdtZW50LAorCSAgICAgIGNvbmZpZy5pbnRlcnJ1cHQsIGNvbmZpZy5kbWFfY2hhbm5lbCk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3NnX2xpc3Qoc3RydWN0IG1zY3AgKm1zY3AsIFNjc2lfQ21uZCAqU0NwbnQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbDsKKwlsb25nIHRyYW5zZmVyX2xlbmd0aCA9IDA7CisJaW50IGksIG1heDsKKworCXNsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJbWF4ID0gU0NwbnQtPnVzZV9zZzsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJbXNjcC0+c2dsaXN0W2ldLmFkZHJlc3MgPSBpc2FfcGFnZV90b19idXMoc2xbaV0ucGFnZSkgKyBzbFtpXS5vZmZzZXQ7CisJCW1zY3AtPnNnbGlzdFtpXS5udW1fYnl0ZXMgPSBzbFtpXS5sZW5ndGg7CisJCXRyYW5zZmVyX2xlbmd0aCArPSBzbFtpXS5sZW5ndGg7CisJfQorCW1zY3AtPm51bWJlcl9vZl9zZ19saXN0ID0gbWF4OworCW1zY3AtPnRyYW5zZmVyX2RhdGEgPSBpc2FfdmlydF90b19idXMobXNjcC0+c2dsaXN0KTsKKwkvKiA/Pz8gTWF5IG5vdCBiZSBuZWNlc3NhcnkuICBEb2NzIGFyZSB1bmNsZWFyIGFzIHRvIHdoZXRoZXIgdHJhbnNmZXIKKwkgICBsZW5ndGggZmllbGQgaXMgaWdub3JlZCBvciB3aGV0aGVyIGl0IHNob3VsZCBiZSBzZXQgdG8gdGhlIHRvdGFsCisJICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSB0cmFuc2Zlci4gICovCisJbXNjcC0+dHJhbnNmZXJfZGF0YV9sZW5ndGggPSB0cmFuc2Zlcl9sZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworICAgIHN0cnVjdCBtc2NwICpteV9tc2NwOworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA+IDEKKyAgICBpbnQgbXNjcF9pbmRleDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGludCBzdGF0dXM7CisKKyAgICAvKiBOZXh0IHRlc3QgaXMgZm9yIGRlYnVnZ2luZzsgImNhbid0IGhhcHBlbiIgKi8KKyAgICBpZiAoKGNvbmZpZy5tc2NwX2ZyZWUgJiAoKDFVIDw8IFVMVFJBU1RPUl9NQVhfQ01EUykgLSAxKSkgPT0gMCkKKwlwYW5pYygidWx0cmFzdG9yX3F1ZXVlY29tbWFuZDogbm8gZnJlZSBNU0NQXG4iKTsKKyAgICBtc2NwX2luZGV4ID0gZmluZF9hbmRfY2xlYXJfYml0XzE2KCZjb25maWcubXNjcF9mcmVlKTsKKworICAgIC8qIEhhcyB0aGUgY29tbWFuZCBiZWVuIGFib3J0ZWQ/ICAqLworICAgIGlmICh4Y2hnYigweGZmLCAmY29uZmlnLmFib3J0ZWRbbXNjcF9pbmRleF0pICE9IDApCisgICAgICB7CisJc3RhdHVzID0gRElEX0FCT1JUIDw8IDE2OworCWdvdG8gYWJvcnRlZDsKKyAgICAgIH0KKworICAgIG15X21zY3AgPSAmY29uZmlnLm1zY3BbbXNjcF9pbmRleF07CisKKyAgICAqKHVuc2lnbmVkIGNoYXIgKilteV9tc2NwID0gT1BfU0NTSSB8IChEVERfU0NTSSA8PCAzKTsKKworICAgIC8qIFRhcGUgZHJpdmVzIGRvbid0IHdvcmsgcHJvcGVybHkgaWYgdGhlIGNhY2hlIGlzIHVzZWQuICBUaGUgU0NTSQorICAgICAgIFJFQUQgY29tbWFuZCBmb3IgYSB0YXBlIGRvZXNuJ3QgaGF2ZSBhIGJsb2NrIG9mZnNldCwgYW5kIHRoZSBhZGFwdGVyCisgICAgICAgaW5jb3JyZWN0bHkgYXNzdW1lcyB0aGF0IGFsbCByZWFkcyBmcm9tIHRoZSB0YXBlIHJlYWQgdGhlIHNhbWUKKyAgICAgICBibG9ja3MuICBSZXN1bHRzIHdpbGwgZGVwZW5kIG9uIHJlYWQgYnVmZmVyIHNpemUgYW5kIG90aGVyIGRpc2sKKyAgICAgICBhY3Rpdml0eS4gCisKKyAgICAgICA/Pz8gIFdoaWNoIG90aGVyIGRldmljZSB0eXBlcyBzaG91bGQgbmV2ZXIgdXNlIHRoZSBjYWNoZT8gICAqLworICAgIG15X21zY3AtPmNhID0gU0NwbnQtPmRldmljZS0+dHlwZSAhPSBUWVBFX1RBUEU7CisgICAgbXlfbXNjcC0+dGFyZ2V0X2lkID0gU0NwbnQtPmRldmljZS0+aWQ7CisgICAgbXlfbXNjcC0+Y2hfbm8gPSAwOworICAgIG15X21zY3AtPmx1biA9IFNDcG50LT5kZXZpY2UtPmx1bjsKKyAgICBpZiAoU0NwbnQtPnVzZV9zZykgeworCS8qIFNldCBzY2F0dGVyL2dhdGhlciBmbGFnIGluIFNDU0kgY29tbWFuZCBwYWNrZXQgKi8KKwlteV9tc2NwLT5zZyA9IFRSVUU7CisJYnVpbGRfc2dfbGlzdChteV9tc2NwLCBTQ3BudCk7CisgICAgfSBlbHNlIHsKKwkvKiBVbnNldCBzY2F0dGVyL2dhdGhlciBmbGFnIGluIFNDU0kgY29tbWFuZCBwYWNrZXQgKi8KKwlteV9tc2NwLT5zZyA9IEZBTFNFOworCW15X21zY3AtPnRyYW5zZmVyX2RhdGEgPSBpc2FfdmlydF90b19idXMoU0NwbnQtPnJlcXVlc3RfYnVmZmVyKTsKKwlteV9tc2NwLT50cmFuc2Zlcl9kYXRhX2xlbmd0aCA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisgICAgfQorICAgIG15X21zY3AtPmNvbW1hbmRfbGluayA9IDA7CQkvKj8/PyovCisgICAgbXlfbXNjcC0+c2NzaV9jb21tYW5kX2xpbmtfaWQgPSAwOwkvKj8/PyovCisgICAgbXlfbXNjcC0+bGVuZ3RoX29mX3NlbnNlX2J5dGUgPSBzaXplb2YgU0NwbnQtPnNlbnNlX2J1ZmZlcjsKKyAgICBteV9tc2NwLT5sZW5ndGhfb2Zfc2NzaV9jZGJzID0gU0NwbnQtPmNtZF9sZW47CisgICAgbWVtY3B5KG15X21zY3AtPnNjc2lfY2RicywgU0NwbnQtPmNtbmQsIG15X21zY3AtPmxlbmd0aF9vZl9zY3NpX2NkYnMpOworICAgIG15X21zY3AtPmFkYXB0ZXJfc3RhdHVzID0gMDsKKyAgICBteV9tc2NwLT50YXJnZXRfc3RhdHVzID0gMDsKKyAgICBteV9tc2NwLT5zZW5zZV9kYXRhID0gaXNhX3ZpcnRfdG9fYnVzKCZTQ3BudC0+c2Vuc2VfYnVmZmVyKTsKKyAgICBteV9tc2NwLT5kb25lID0gZG9uZTsKKyAgICBteV9tc2NwLT5TQ2ludCA9IFNDcG50OworICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilteV9tc2NwOworCisgICAgLyogRmluZCBmcmVlIE9HTSBzbG90LiAgT24gMjRGLCBsb29rIGZvciBPR00gc3RhdHVzIGJ5dGUgPT0gMC4KKyAgICAgICBPbiAxNEYgYW5kIDM0Riwgd2FpdCBmb3IgbG9jYWwgaW50ZXJydXB0IHBlbmRpbmcgZmxhZyB0byBjbGVhci4gCisgICAgICAgCisgICAgICAgRklYTUU6IG5vdyB3ZSBhcmUgdXNpbmcgbmV3X2VoIHdlIHNob3VsZCBwdW50IGhlcmUgYW5kIGxldCB0aGUKKyAgICAgICBtaWRsYXllciBzb3J0IGl0IG91dCAqLworCityZXRyeToKKyAgICBpZiAoY29uZmlnLnNsb3QpCisJd2hpbGUgKGluYihjb25maWcub2dtX2FkZHJlc3MgLSAxKSAhPSAwICYmIGNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdID09IDB4ZmYpCisJCWJhcnJpZXIoKTsKKworICAgIC8qIGVsc2U/Pz8gKi8KKworICAgIHdoaWxlICgoaW5iKExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAoY29uZmlnLnNsb3QgPyAyIDogMSkpICAmJiBjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSA9PSAweGZmKQorICAgIAliYXJyaWVyKCk7CisKKyAgICAvKiBUbyBhdm9pZCByYWNlIGNvbmRpdGlvbnMsIGtlZXAgdGhlIGNvZGUgdG8gd3JpdGUgdG8gdGhlIGFkYXB0ZXIKKyAgICAgICBhdG9taWMuICBUaGlzIHNpbXBsaWZpZXMgdGhlIGFib3J0IGNvZGUuICBSaWdodCBub3cgdGhlCisgICAgICAgc2NzaSBtaWQgbGF5ZXIgaGFzIHRoZSBob3N0X2xvY2sgYWxyZWFkeSBoZWxkCisgICAgICovCisKKyAgICBpZiAoaW5iKExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAoY29uZmlnLnNsb3QgPyAyIDogMSkpCisgICAgICBnb3RvIHJldHJ5OworCisgICAgc3RhdHVzID0geGNoZ2IoMCwgJmNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKTsKKyAgICBpZiAoc3RhdHVzICE9IDB4ZmYpIHsKKworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIChVRF9DT01NQU5EIHwgVURfQUJPUlQpCisJcHJpbnRrKCJVU3g0RjogcXVldWVjb21tYW5kOiBhYm9ydGVkXG4iKTsKKyNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCisJbG9nX3VsdHJhc3Rvcl9hYm9ydCgmY29uZmlnLCBtc2NwX2luZGV4KTsKKyNlbmRpZgorI2VuZGlmCisJc3RhdHVzIDw8PSAxNjsKKworICAgICAgYWJvcnRlZDoKKwlzZXRfYml0KG1zY3BfaW5kZXgsICZjb25maWcubXNjcF9mcmVlKTsKKwkvKiBJZiB0aGUgZHJpdmVyIHF1ZXVlcyBjb21tYW5kcywgY2FsbCB0aGUgZG9uZSBwcm9jIGhlcmUuICBPdGhlcndpc2UKKwkgICByZXR1cm4gYW4gZXJyb3IuICAqLworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA+IDEKKwlTQ3BudC0+cmVzdWx0ID0gc3RhdHVzOworCWRvbmUoU0NwbnQpOworCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gc3RhdHVzOworI2VuZGlmCisgICAgfQorCisgICAgLyogU3RvcmUgcG9pbnRlciBpbiBPR00gYWRkcmVzcyBieXRlcyAqLworICAgIG91dGwoaXNhX3ZpcnRfdG9fYnVzKG15X21zY3ApLCBjb25maWcub2dtX2FkZHJlc3MpOworCisgICAgLyogSXNzdWUgT0dNIGludGVycnVwdCAqLworICAgIGlmIChjb25maWcuc2xvdCkgeworCS8qIFdyaXRlIE9HTSBjb21tYW5kIHJlZ2lzdGVyIG9uIDI0RiAqLworCW91dGIoMSwgY29uZmlnLm9nbV9hZGRyZXNzIC0gMSk7CisJb3V0YigweDIsIExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7CisgICAgfSBlbHNlIHsKKwlvdXRiKDB4MSwgTENMX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKTsKKyAgICB9CisKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfQ09NTUFORCkKKyAgICBwcmludGsoIlVTeDRGOiBxdWV1ZWNvbW1hbmQ6IHJldHVybmluZ1xuIik7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKiBUaGlzIGNvZGUgbXVzdCBkZWFsIHdpdGggMiBjYXNlczoKKworICAgMS4gVGhlIGNvbW1hbmQgaGFzIG5vdCBiZWVuIHdyaXR0ZW4gdG8gdGhlIE9HTS4gIEluIHRoaXMgY2FzZSwgc2V0CisgICB0aGUgYWJvcnQgZmxhZyBhbmQgcmV0dXJuLgorCisgICAyLiBUaGUgY29tbWFuZCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBPR00gYW5kIGlzIHN0dWNrIHNvbWV3aGVyZSBpbgorICAgdGhlIGFkYXB0ZXIuCisKKyAgIDJhLiAgT24gYSAyNEYsIGFzayB0aGUgYWRhcHRlciB0byBhYm9ydCB0aGUgY29tbWFuZC4gIEl0IHdpbGwgaW50ZXJydXB0CisgICB3aGVuIGl0IGRvZXMuCisKKyAgIDJiLiAgQ2FsbCB0aGUgY29tbWFuZCdzIGRvbmUgcHJvY2VkdXJlLgorCisgKi8KKworc3RhdGljIGludCB1bHRyYXN0b3JfYWJvcnQoU2NzaV9DbW5kICpTQ3BudCkKK3sKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiBVRF9BQk9SVAorICAgIGNoYXIgb3V0WzEwOF07CisgICAgdW5zaWduZWQgY2hhciBpY21fc3RhdHVzID0gMCwgb2dtX3N0YXR1cyA9IDA7CisgICAgdW5zaWduZWQgaW50IGljbV9hZGRyID0gMCwgb2dtX2FkZHIgPSAwOworI2VuZGlmCisgICAgdW5zaWduZWQgaW50IG1zY3BfaW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBvbGRfYWJvcnRlZDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKik7CisgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisKKyAgICBpZihjb25maWcuc2xvdCkgCisgICAgICByZXR1cm4gRkFJTEVEOyAgLyogRG8gbm90IGF0dGVtcHQgYW4gYWJvcnQgZm9yIHRoZSAyNGYgKi8KKyAgICAgIAorICAgIC8qIFNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja2luZyAqLworICAgIGlmKCFTQ3BudC0+aG9zdF9zY3JpYmJsZSkKKyAgICAgIHJldHVybiBGQUlMRUQ7CisKKyAgICBtc2NwX2luZGV4ID0gKChzdHJ1Y3QgbXNjcCAqKVNDcG50LT5ob3N0X3NjcmliYmxlKSAtIGNvbmZpZy5tc2NwOworICAgIGlmIChtc2NwX2luZGV4ID49IFVMVFJBU1RPUl9NQVhfQ01EUykKKwlwYW5pYygiVXg0RiBhYm9ydGluZyBpbnZhbGlkIE1TQ1AiKTsKKworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIFVEX0FCT1JUCisgICAgaWYgKGNvbmZpZy5zbG90KQorICAgICAgeworCWludCBwb3J0MCA9IChjb25maWcuc2xvdCA8PCAxMikgfCAweGM4MDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXN0cmNweShvdXQsICJPR00gJWQ6JXggSUNNICVkOiV4IHBvcnRzOiAgIik7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJICB7CisJICAgIHVuc2lnbmVkIGNoYXIgcCA9IGluYihwb3J0MCArIGkpOworCSAgICBvdXRbMjggKyBpICogM10gPSAiMDEyMzQ1Njc4OWFiY2RlZiJbcCA+PiA0XTsKKwkgICAgb3V0WzI5ICsgaSAqIDNdID0gIjAxMjM0NTY3ODlhYmNkZWYiW3AgJiAxNV07CisJICAgIG91dFszMCArIGkgKiAzXSA9ICcgJzsKKwkgIH0KKwlvdXRbMjggKyBpICogM10gPSAnXG4nOworCW91dFsyOSArIGkgKiAzXSA9IDA7CisJb2dtX3N0YXR1cyA9IGluYihwb3J0MCArIDIyKTsKKwlvZ21fYWRkciA9ICh1bnNpZ25lZCBpbnQpaXNhX2J1c190b192aXJ0KGlubChwb3J0MCArIDIzKSk7CisJaWNtX3N0YXR1cyA9IGluYihwb3J0MCArIDI3KTsKKwlpY21fYWRkciA9ICh1bnNpZ25lZCBpbnQpaXNhX2J1c190b192aXJ0KGlubChwb3J0MCArIDI4KSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisgICAgICB9CisKKyAgICAvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgYW4gaW50ZXJydXB0IGlzIHBlbmRpbmcuICBJIHN1c3BlY3QgdGhlIFNpUworICAgICAgIGNoaXBzZXQgbG9zZXMgaW50ZXJydXB0cy4gIChJIGFsc28gc3VzcGVjdCBpcyBtYW5nbGVzIGRhdGEsIGJ1dAorICAgICAgIG9uZSBidWcgYXQgYSB0aW1lLi4uICovCisgICAgaWYgKGNvbmZpZy5zbG90ID8gaW5iKGNvbmZpZy5pY21fYWRkcmVzcyAtIDEpID09IDIgOgorCShpbmIoU1lTX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKSAmIDEpKQorICAgICAgeworCXByaW50aygiVXg0RjogYWJvcnQgd2hpbGUgY29tcGxldGVkIGNvbW1hbmQgcGVuZGluZ1xuIik7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJLyogRklYTUU6IEV3d3cuLi4gbmVlZCB0byB0aGluayBhYm91dCBwYXNzaW5nIGhvc3QgYXJvdW5kIHByb3Blcmx5ICovCisJdWx0cmFzdG9yX2ludGVycnVwdCgwLCBOVUxMLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBTVUNDRVNTOworICAgICAgfQorI2VuZGlmCisKKyAgICBvbGRfYWJvcnRlZCA9IHhjaGdiKERJRF9BQk9SVCwgJmNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKTsKKworICAgIC8qIGFib3J0ZWQgPT0gMHhmZiBpcyB0aGUgc2lnbmFsIHRoYXQgcXVldWVjb21tYW5kIGhhcyBub3QgeWV0IHNlbnQKKyAgICAgICB0aGUgY29tbWFuZC4gIEl0IHdpbGwgbm90aWNlIHRoZSBuZXcgYWJvcnQgZmxhZyBhbmQgZmFpbC4gICovCisgICAgaWYgKG9sZF9hYm9ydGVkID09IDB4ZmYpCisJcmV0dXJuIFNVQ0NFU1M7CisKKyAgICAvKiBPbiAyNEYsIHNlbmQgYW4gYWJvcnQgTVNDUCByZXF1ZXN0LiAgVGhlIGFkYXB0ZXIgd2lsbCBpbnRlcnJ1cHQKKyAgICAgICBhbmQgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgY2FsbCBkb25lLiAgKi8KKyAgICBpZiAoY29uZmlnLnNsb3QgJiYgaW5iKGNvbmZpZy5vZ21fYWRkcmVzcyAtIDEpID09IDApCisgICAgICB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCW91dGwoaXNhX3ZpcnRfdG9fYnVzKCZjb25maWcubXNjcFttc2NwX2luZGV4XSksIGNvbmZpZy5vZ21fYWRkcmVzcyk7CisJdWRlbGF5KDgpOworCW91dGIoMHg4MCwgY29uZmlnLm9nbV9hZGRyZXNzIC0gMSk7CisJb3V0YigweDIsIExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7CisjaWYgVUxUUkFTVE9SX0RFQlVHICYgVURfQUJPUlQKKwlsb2dfdWx0cmFzdG9yX2Fib3J0KCZjb25maWcsIG1zY3BfaW5kZXgpOworCXByaW50ayhvdXQsIG9nbV9zdGF0dXMsIG9nbV9hZGRyLCBpY21fc3RhdHVzLCBpY21fYWRkcik7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCS8qIEZJWE1FOiBhZGQgYSB3YWl0IGZvciB0aGUgYWJvcnQgdG8gY29tcGxldGUgKi8KKwlyZXR1cm4gU1VDQ0VTUzsKKyAgICAgIH0KKworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIFVEX0FCT1JUCisgICAgbG9nX3VsdHJhc3Rvcl9hYm9ydCgmY29uZmlnLCBtc2NwX2luZGV4KTsKKyNlbmRpZgorCisgICAgLyogQ2FuJ3QgcmVxdWVzdCBhIGdyYWNlZnVsIGFib3J0LiAgRWl0aGVyIHRoaXMgaXMgbm90IGEgMjRGIG9yCisgICAgICAgdGhlIE9HTSBpcyBidXN5LiAgRG9uJ3QgZnJlZSB0aGUgY29tbWFuZCAtLSB0aGUgYWRhcHRlciBtaWdodAorICAgICAgIHN0aWxsIGJlIHVzaW5nIGl0LiAgU2V0dGluZyBTQ2ludCA9IDAgY2F1c2VzIHRoZSBpbnRlcnJ1cHQKKyAgICAgICBoYW5kbGVyIHRvIGlnbm9yZSB0aGUgY29tbWFuZC4gICovCisKKyAgICAvKiBGSVhNRSAtIGRldmljZXMgdGhhdCBpbXBsZW1lbnQgc29mdCByZXNldHMgd2lsbCBzdGlsbCBiZSBydW5uaW5nCisgICAgICAgdGhlIGNvbW1hbmQgYWZ0ZXIgYSBidXMgcmVzZXQuICBXZSB3b3VsZCBwcm9iYWJseSByYXRoZXIgbGVhdmUKKyAgICAgICB0aGUgY29tbWFuZCBpbiB0aGUgcXVldWUuICBUaGUgdXBwZXIgbGV2ZWwgY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgICBsZWF2ZSB0aGUgY29tbWFuZCBpbiB0aGUgYWN0aXZlIHN0YXRlIGluc3RlYWQgb2YgcmVxdWV1ZWluZyBpdC4gRVJZICovCisKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiBVRF9BQk9SVAorICAgIGlmIChjb25maWcubXNjcFttc2NwX2luZGV4XS5TQ2ludCAhPSBTQ3BudCkKKwlwcmludGsoImFib3J0OiBjb21tYW5kIG1pc21hdGNoLCAlcCAhPSAlcFxuIiwKKwkgICAgICAgY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQsIFNDcG50KTsKKyNlbmRpZgorICAgIGlmIChjb25maWcubXNjcFttc2NwX2luZGV4XS5TQ2ludCA9PSAwKQorCXJldHVybiBTQ1NJX0FCT1JUX05PVF9SVU5OSU5HOworCisgICAgaWYgKGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLlNDaW50ICE9IFNDcG50KSBwYW5pYygiQmFkIGFib3J0Iik7CisgICAgY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQgPSBOVUxMOworICAgIGRvbmUgPSBjb25maWcubXNjcFttc2NwX2luZGV4XS5kb25lOworICAgIGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLmRvbmUgPSBOVUxMOworICAgIFNDcG50LT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisgICAgCisgICAgLyogVGFrZSB0aGUgaG9zdCBsb2NrIHRvIGd1YXJkIGFnYWluc3Qgc2NzaSBsYXllciByZS1lbnRyeSAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworICAgIGRvbmUoU0NwbnQpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKyAgICAvKiBOZWVkIHRvIHNldCBhIHRpbWVvdXQgaGVyZSBpbiBjYXNlIGNvbW1hbmQgbmV2ZXIgY29tcGxldGVzLiAgKi8KKyAgICByZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB1bHRyYXN0b3JfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBpOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworICAgIAorI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9SRVNFVCkKKyAgICBwcmludGsoIlVTMTRGOiByZXNldDogY2FsbGVkXG4iKTsKKyNlbmRpZgorCisgICAgaWYoY29uZmlnLnNsb3QpCisgICAgCXJldHVybiBGQUlMRUQ7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICAvKiBSZXNldCB0aGUgYWRhcHRlciBhbmQgU0NTSSBidXMuICBUaGUgU0NTSSBidXMgcmVzZXQgY2FuIGJlCisgICAgICAgaW5oaWJpdGVkIGJ5IGNsZWFyaW5nIHVsdHJhc3Rvcl9idXNfcmVzZXQgYmVmb3JlIHByb2JlLiAgKi8KKyAgICBvdXRiKDB4YzAsIExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7CisgICAgaWYgKGNvbmZpZy5zbG90KQorICAgICAgeworCW91dGIoMCwgY29uZmlnLm9nbV9hZGRyZXNzIC0gMSk7CisJb3V0YigwLCBjb25maWcuaWNtX2FkZHJlc3MgLSAxKTsKKyAgICAgIH0KKworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA9PSAxCisgICAgaWYgKGNvbmZpZy5tc2NwX2J1c3kgJiYgY29uZmlnLm1zY3AtPmRvbmUgJiYgY29uZmlnLm1zY3AtPlNDaW50KQorICAgICAgeworCWNvbmZpZy5tc2NwLT5TQ2ludC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCWNvbmZpZy5tc2NwLT5kb25lKGNvbmZpZy5tc2NwLT5TQ2ludCk7CisgICAgICB9CisgICAgY29uZmlnLm1zY3AtPlNDaW50ID0gMDsKKyNlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IFVMVFJBU1RPUl9NQVhfQ01EUzsgaSsrKQorICAgICAgeworCWlmICghIChjb25maWcubXNjcF9mcmVlICYgKDEgPDwgaSkpICYmCisJICAgIGNvbmZpZy5tc2NwW2ldLmRvbmUgJiYgY29uZmlnLm1zY3BbaV0uU0NpbnQpCisJICB7CisJICAgIGNvbmZpZy5tc2NwW2ldLlNDaW50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJICAgIGNvbmZpZy5tc2NwW2ldLmRvbmUoY29uZmlnLm1zY3BbaV0uU0NpbnQpOworCSAgICBjb25maWcubXNjcFtpXS5kb25lID0gTlVMTDsKKwkgIH0KKwljb25maWcubXNjcFtpXS5TQ2ludCA9IE5VTEw7CisgICAgICB9CisjZW5kaWYKKworICAgIC8qIEZJWE1FIC0gaWYgdGhlIGRldmljZSBpbXBsZW1lbnRzIHNvZnQgcmVzZXRzLCB0aGVuIHRoZSBjb21tYW5kCisgICAgICAgd2lsbCBzdGlsbCBiZSBydW5uaW5nLiAgRVJZICAKKyAgICAgICAKKyAgICAgICBFdmVuIGJpZ2dlciBkZWFsIHdpdGggbmV3X2VoISAKKyAgICAgKi8KKworICAgIG1lbXNldCgodW5zaWduZWQgY2hhciAqKWNvbmZpZy5hYm9ydGVkLCAwLCBzaXplb2YgY29uZmlnLmFib3J0ZWQpOworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA9PSAxCisgICAgY29uZmlnLm1zY3BfYnVzeSA9IDA7CisjZWxzZQorICAgIGNvbmZpZy5tc2NwX2ZyZWUgPSB+MDsKKyNlbmRpZgorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gU0NTSV9SRVNFVF9TVUNDRVNTOworCit9CisKK2ludCB1bHRyYXN0b3JfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqIGRraW5mbykKK3sKKyAgICBpbnQgc2l6ZSA9IGNhcGFjaXR5OworICAgIHVuc2lnbmVkIGludCBzID0gY29uZmlnLmhlYWRzICogY29uZmlnLnNlY3RvcnM7CisKKyAgICBka2luZm9bMF0gPSBjb25maWcuaGVhZHM7CisgICAgZGtpbmZvWzFdID0gY29uZmlnLnNlY3RvcnM7CisgICAgZGtpbmZvWzJdID0gc2l6ZSAvIHM7CS8qIElnbm9yZSBwYXJ0aWFsIGN5bGluZGVycyAqLworI2lmIDAKKyAgICBpZiAoZGtpbmZvWzJdID4gMTAyNCkKKwlka2luZm9bMl0gPSAxMDI0OworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhc3Rvcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3RhdHVzOworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA+IDEKKyAgICB1bnNpZ25lZCBpbnQgbXNjcF9pbmRleDsKKyNlbmRpZgorICAgIHN0cnVjdCBtc2NwICptc2NwOworICAgIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKik7CisgICAgU2NzaV9DbW5kICpTQ3RtcDsKKworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA9PSAxCisgICAgbXNjcCA9ICZjb25maWcubXNjcFswXTsKKyNlbHNlCisgICAgbXNjcCA9IChzdHJ1Y3QgbXNjcCAqKWlzYV9idXNfdG9fdmlydChpbmwoY29uZmlnLmljbV9hZGRyZXNzKSk7CisgICAgbXNjcF9pbmRleCA9IG1zY3AgLSBjb25maWcubXNjcDsKKyAgICBpZiAobXNjcF9pbmRleCA+PSBVTFRSQVNUT1JfTUFYX0NNRFMpIHsKKwlwcmludGsoIlV4NEYgaW50ZXJydXB0OiBiYWQgTVNDUCBhZGRyZXNzICV4XG4iLCAodW5zaWduZWQgaW50KSBtc2NwKTsKKwkvKiBBIGNvbW1hbmQgaGFzIGJlZW4gbG9zdC4gIFJlc2V0IGFuZCByZXBvcnQgYW4gZXJyb3IKKwkgICBmb3IgYWxsIGNvbW1hbmRzLiAgKi8KKwl1bHRyYXN0b3JfaG9zdF9yZXNldChkZXZfaWQpOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIENsZWFuIElDTSBzbG90IChzZXQgSUNNSU5UIGJpdCB0byAwKSAqLworICAgIGlmIChjb25maWcuc2xvdCkgeworCXVuc2lnbmVkIGNoYXIgaWNtX3N0YXR1cyA9IGluYihjb25maWcuaWNtX2FkZHJlc3MgLSAxKTsKKyNpZiBVTFRSQVNUT1JfREVCVUcgJiAoVURfSU5URVJSVVBUfFVEX0VSUk9SfFVEX0FCT1JUKQorCWlmIChpY21fc3RhdHVzICE9IDEgJiYgaWNtX3N0YXR1cyAhPSAyKQorCSAgICBwcmludGsoIlVTMjRGOiBJQ00gc3RhdHVzICV4IGZvciBNU0NQICVkICgleClcbiIsIGljbV9zdGF0dXMsCisJCSAgIG1zY3BfaW5kZXgsICh1bnNpZ25lZCBpbnQpIG1zY3ApOworI2VuZGlmCisJLyogVGhlIG1hbnVhbCBzYXlzIGNsZWFyIGludGVycnVwdCB0aGVuIHdyaXRlIDAgdG8gSUNNIHN0YXR1cy4KKwkgICBUaGlzIHNlZW1zIGJhY2t3YXJkcywgYnV0IEknbGwgZG8gaXQgYW55d2F5LiAgLS1qZmMgKi8KKwlvdXRiKDIsIFNZU19ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7CisJb3V0YigwLCBjb25maWcuaWNtX2FkZHJlc3MgLSAxKTsKKwlpZiAoaWNtX3N0YXR1cyA9PSA0KSB7CisJICAgIHByaW50aygiVWx0cmFTdG9yIGFib3J0IGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkgICAgcmV0dXJuOworCX0KKwlpZiAoaWNtX3N0YXR1cyA9PSAzKSB7CisJICAgIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikgPSBtc2NwLT5kb25lOworCSAgICBpZiAoZG9uZSkgeworCQltc2NwLT5kb25lID0gTlVMTDsKKwkJbXNjcC0+U0NpbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJZG9uZShtc2NwLT5TQ2ludCk7CisJICAgIH0KKwkgICAgcmV0dXJuOworCX0KKyAgICB9IGVsc2UgeworCW91dGIoMSwgU1lTX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKTsKKyAgICB9CisKKyAgICBTQ3RtcCA9IG1zY3AtPlNDaW50OworICAgIG1zY3AtPlNDaW50ID0gTlVMTDsKKworICAgIGlmIChTQ3RtcCA9PSAwKQorICAgICAgeworI2lmIFVMVFJBU1RPUl9ERUJVRyAmIChVRF9BQk9SVHxVRF9JTlRFUlJVUFQpCisJcHJpbnRrKCJNU0NQICVkICgleCk6IG5vIGNvbW1hbmRcbiIsIG1zY3BfaW5kZXgsICh1bnNpZ25lZCBpbnQpIG1zY3ApOworI2VuZGlmCQorI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA9PSAxCisJY29uZmlnLm1zY3BfYnVzeSA9IEZBTFNFOworI2Vsc2UKKwlzZXRfYml0KG1zY3BfaW5kZXgsICZjb25maWcubXNjcF9mcmVlKTsKKyNlbmRpZgorCWNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdID0gMDsKKwlyZXR1cm47CisgICAgICB9CisKKyAgICAvKiBTYXZlIGRvbmUgbG9jYWxseSBhbmQgemVybyBiZWZvcmUgY2FsbGluZy4gIFRoaXMgaXMgbmVlZGVkIGFzCisgICAgICAgb25jZSB3ZSBjYWxsIGRvbmUsIHdlIG1heSBnZXQgYW5vdGhlciBjb21tYW5kIHF1ZXVlZCBiZWZvcmUgdGhpcworICAgICAgIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgY2FuIHJldHVybi4gKi8KKyAgICBkb25lID0gbXNjcC0+ZG9uZTsKKyAgICBtc2NwLT5kb25lID0gTlVMTDsKKworICAgIC8qIExldCB0aGUgaGlnaGVyIGxldmVscyBrbm93IHRoYXQgd2UncmUgZG9uZSAqLworICAgIHN3aXRjaCAobXNjcC0+YWRhcHRlcl9zdGF0dXMpCisgICAgICB7CisgICAgICBjYXNlIDA6CisJc3RhdHVzID0gRElEX09LIDw8IDE2OworCWJyZWFrOworICAgICAgY2FzZSAweDAxOgkvKiBpbnZhbGlkIGNvbW1hbmQgKi8KKyAgICAgIGNhc2UgMHgwMjoJLyogaW52YWxpZCBwYXJhbWV0ZXJzICovCisgICAgICBjYXNlIDB4MDM6CS8qIGludmFsaWQgZGF0YSBsaXN0ICovCisgICAgICBkZWZhdWx0OgorCXN0YXR1cyA9IERJRF9FUlJPUiA8PCAxNjsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg4NDoJLyogU0NTSSBidXMgYWJvcnQgKi8KKwlzdGF0dXMgPSBESURfQUJPUlQgPDwgMTY7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTE6CisJc3RhdHVzID0gRElEX1RJTUVfT1VUIDw8IDE2OworCWJyZWFrOworICAgICAgfQorCisgICAgU0N0bXAtPnJlc3VsdCA9IHN0YXR1cyB8IG1zY3AtPnRhcmdldF9zdGF0dXM7CisKKyAgICBTQ3RtcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisKKyAgICAvKiBGcmVlIHVwIG1zY3AgYmxvY2sgZm9yIG5leHQgY29tbWFuZCAqLworI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA9PSAxCisgICAgY29uZmlnLm1zY3BfYnVzeSA9IEZBTFNFOworI2Vsc2UKKyAgICBzZXRfYml0KG1zY3BfaW5kZXgsICZjb25maWcubXNjcF9mcmVlKTsKKyNlbmRpZgorCisjaWYgVUxUUkFTVE9SX0RFQlVHICYgKFVEX0FCT1JUfFVEX0lOVEVSUlVQVCkKKyAgICBpZiAoY29uZmlnLmFib3J0ZWRbbXNjcF9pbmRleF0pCisJcHJpbnRrKCJVeDQgaW50ZXJydXB0OiBNU0NQICVkICgleCkgYWJvcnRlZCA9ICVkXG4iLAorCSAgICAgICBtc2NwX2luZGV4LCAodW5zaWduZWQgaW50KSBtc2NwLCBjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSk7CisjZW5kaWYKKyAgICBjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSA9IDA7CisKKyAgICBpZiAoZG9uZSkKKwlkb25lKFNDdG1wKTsKKyAgICBlbHNlCisJcHJpbnRrKCJVUzE0RjogaW50ZXJydXB0OiB1bmV4cGVjdGVkIGludGVycnVwdFxuIik7CisKKyAgICBpZiAoY29uZmlnLnNsb3QgPyBpbmIoY29uZmlnLmljbV9hZGRyZXNzIC0gMSkgOgorICAgICAgIChpbmIoU1lTX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKSAmIDEpKQorI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9NVUxUSV9DTUQpCisgICAgICBwcmludGsoIlV4NEY6IG11bHRpcGxlIGNvbW1hbmRzIGNvbXBsZXRlZFxuIik7CisjZWxzZQorICAgICAgOworI2VuZGlmCisKKyNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfSU5URVJSVVBUKQorICAgIHByaW50aygiVVN4NEY6IGludGVycnVwdDogcmV0dXJuaW5nXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9fdWx0cmFzdG9yX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOworICAgIHVsdHJhc3Rvcl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5ob3N0X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7CisJLm5hbWUgICAgICAgICAgICAgID0gIlVsdHJhU3RvciAxNEYvMjRGLzM0RiIsCisJLmRldGVjdCAgICAgICAgICAgID0gdWx0cmFzdG9yX2RldGVjdCwKKwkucmVsZWFzZQkgICA9IHVsdHJhc3Rvcl9yZWxlYXNlLAorCS5pbmZvICAgICAgICAgICAgICA9IHVsdHJhc3Rvcl9pbmZvLAorCS5xdWV1ZWNvbW1hbmQgICAgICA9IHVsdHJhc3Rvcl9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgID0gdWx0cmFzdG9yX2Fib3J0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgID0gdWx0cmFzdG9yX2hvc3RfcmVzZXQsCQorCS5iaW9zX3BhcmFtICAgICAgICA9IHVsdHJhc3Rvcl9iaW9zcGFyYW0sCisJLmNhbl9xdWV1ZSAgICAgICAgID0gVUxUUkFTVE9SX01BWF9DTURTLAorCS5zZ190YWJsZXNpemUgICAgICA9IFVMVFJBU1RPUl8xNEZfTUFYX1NHLAorCS5jbWRfcGVyX2x1biAgICAgICA9IFVMVFJBU1RPUl9NQVhfQ01EU19QRVJfTFVOLAorCS51bmNoZWNrZWRfaXNhX2RtYSA9IDEsCisJLnVzZV9jbHVzdGVyaW5nICAgID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmggYi9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwZjhkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuaApAQCAtMCwwICsxLDc5IEBACisvKgorICoJdWx0cmFzdG9yLmMJKEMpIDE5OTEgRGF2aWQgQi4gR2VudHplbAorICoJTG93LWxldmVsIHNjc2kgZHJpdmVyIGZvciBVbHRyYVN0b3IgMTRGCisgKglieSBEYXZpZCBCLiBHZW50emVsLCBXaGl0ZmllbGQgU29mdHdhcmUgU2VydmljZXMsIENhcm5lZ2llLCBQQQorICoJICAgIChnZW50emVsQG5vdmEuZW5ldC5kZWMuY29tKQorICogIHNjYXR0ZXIvZ2F0aGVyIGFkZGVkIGJ5IFNjb3R0IFRheWxvciAobjIxN2NnQHRhbXV0cy50YW11LmVkdSkKKyAqICAyNEYgc3VwcG9ydCBieSBKb2huIEYuIENhcnIgKGpmY0BhdGhlbmEubWl0LmVkdSkKKyAqICAgIEpvaG4ncyB3b3JrIG1vZGlmaWVkIGJ5IENhbGViIEVwc3RlaW4gKGNhZUBqcG1vcmdhbi5jb20pIGFuZCAKKyAqICAgIEVyaWMgWW91bmdkYWxlIChlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbCkuCisgKglUaGFua3MgdG8gVWx0cmFTdG9yIGZvciBwcm92aWRpbmcgdGhlIG5lY2Vzc2FyeSBkb2N1bWVudGF0aW9uCisgKi8KKworI2lmbmRlZiBfVUxUUkFTVE9SX0gKKyNkZWZpbmUgX1VMVFJBU1RPUl9ICisKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX2RldGVjdChTY3NpX0hvc3RfVGVtcGxhdGUgKik7CitzdGF0aWMgY29uc3QgY2hhciAqdWx0cmFzdG9yX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqIHNocG50KTsKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHVsdHJhc3Rvcl9hYm9ydChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHVsdHJhc3Rvcl9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgdWx0cmFzdG9yX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLCBzZWN0b3JfdCwgaW50ICopOworCisKKyNkZWZpbmUgVUxUUkFTVE9SXzE0Rl9NQVhfU0cgMTYKKyNkZWZpbmUgVUxUUkFTVE9SXzI0Rl9NQVhfU0cgMzMKKworI2RlZmluZSBVTFRSQVNUT1JfTUFYX0NNRFNfUEVSX0xVTiA1CisjZGVmaW5lIFVMVFJBU1RPUl9NQVhfQ01EUyAxNgorCisjZGVmaW5lIFVMVFJBU1RPUl8yNEZfUE9SVCAweEM4MAorCisKKyNpZmRlZiBVTFRSQVNUT1JfUFJJVkFURQorCisjZGVmaW5lIFVEX0FCT1JUCTB4MDAwMQorI2RlZmluZSBVRF9DT01NQU5ECTB4MDAwMgorI2RlZmluZSBVRF9ERVRFQ1QJMHgwMDA0CisjZGVmaW5lIFVEX0lOVEVSUlVQVAkweDAwMDgKKyNkZWZpbmUgVURfUkVTRVQJMHgwMDEwCisjZGVmaW5lIFVEX01VTFRJX0NNRAkweDAwMjAKKyNkZWZpbmUgVURfQ1NJUgkJMHgwMDQwCisjZGVmaW5lIFVEX0VSUk9SCTB4MDA4MAorCisvKiAjZGVmaW5lIFBPUlRfT1ZFUlJJREUgMHgzMzAgKi8KKworLyogVmFsdWVzIGZvciB0aGUgUFJPRFVDVF9JRCBwb3J0cyBmb3IgdGhlIDE0RiAqLworI2RlZmluZSBVUzE0Rl9QUk9EVUNUX0lEXzAgMHg1NgorI2RlZmluZSBVUzE0Rl9QUk9EVUNUX0lEXzEgMHg0MAkJLyogTk9URTogT25seSB1cHBlciBuaWJibGUgaXMgdXNlZCAqLworCisjZGVmaW5lIFVTMjRGX1BST0RVQ1RfSURfMCAweDU2CisjZGVmaW5lIFVTMjRGX1BST0RVQ1RfSURfMSAweDYzCisjZGVmaW5lIFVTMjRGX1BST0RVQ1RfSURfMiAweDAyCisKKy8qIFN1YnZlcnNpb24gdmFsdWVzICovCisjZGVmaW5lIFUxNEYgMAorI2RlZmluZSBVMzRGIDEKKworLyogTVNDUCBmaWVsZCB2YWx1ZXMgKi8KKworLyogT3Bjb2RlICovCisjZGVmaW5lIE9QX0hPU1RfQURBUFRFUiAweDEKKyNkZWZpbmUgT1BfU0NTSSAweDIKKyNkZWZpbmUgT1BfUkVTRVQgMHg0CisKKy8qIERhdGUgVHJhbnNmZXIgRGlyZWN0aW9uICovCisjZGVmaW5lIERURF9TQ1NJIDB4MAorI2RlZmluZSBEVERfSU4gMHgxCisjZGVmaW5lIERURF9PVVQgMHgyCisjZGVmaW5lIERURF9OT05FIDB4MworCisvKiBIb3N0IEFkYXB0ZXIgY29tbWFuZCBzdWJjb2RlcyAqLworI2RlZmluZSBIQV9DTURfSU5RVUlSWSAweDEKKyNkZWZpbmUgSEFfQ01EX1NFTEZfRElBRyAweDIKKyNkZWZpbmUgSEFfQ01EX1JFQURfQlVGRiAweDMKKyNkZWZpbmUgSEFfQ01EX1dSSVRFX0JVRkYgMHg0CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDMzYzkzLmMgYi9kcml2ZXJzL3Njc2kvd2QzM2M5My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTQ0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvd2QzM2M5My5jCkBAIC0wLDAgKzEsMjA3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NiBKb2huIFNoaWZmbGV0dCwgR2VvTG9nIENvbnN1bHRpbmcKKyAqICAgIGpvaG5AZ2VvbG9nLmNvbQorICogICAganNoaWZmbGVAbmV0Y29tLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogRHJldyBFY2toYXJkdCdzIGV4Y2VsbGVudCAnR2VuZXJpYyBOQ1I1MzgwJyBzb3VyY2VzIGZyb20gTGludXgtUEMKKyAqIHByb3ZpZGVkIG11Y2ggb2YgdGhlIGluc3BpcmF0aW9uIGFuZCBzb21lIG9mIHRoZSBjb2RlIGZvciB0aGlzCisgKiBkcml2ZXIuIEV2ZXJ5dGhpbmcgSSBrbm93IGFib3V0IEFtaWdhIERNQSB3YXMgZ2xlYW5lZCBmcm9tIGNhcmVmdWwKKyAqIHJlYWRpbmcgb2YgSGFtaXNoIE1jZG9uYWxkJ3Mgb3JpZ2luYWwgd2QzM2M5MyBkcml2ZXI7IGluIGZhY3QsIEkKKyAqIGJvcnJvd2VkIHNoYW1lbGVzc2x5IGZyb20gYWxsIG92ZXIgdGhhdCBzb3VyY2UuIFRoYW5rcyBIYW1pc2ghCisgKgorICogX1RoaXNfIGRyaXZlciBpcyAoSSBmZWVsKSBhbiBpbXByb3ZlbWVudCBvdmVyIHRoZSBvbGQgb25lIGluCisgKiBzZXZlcmFsIHJlc3BlY3RzOgorICoKKyAqICAgIC0gIFRhcmdldCBEaXNjb25uZWN0aW9uL1JlY29ubmVjdGlvbiAgaXMgbm93IHN1cHBvcnRlZC4gQW55CisgKiAgICAgICAgICBzeXN0ZW0gd2l0aCBtb3JlIHRoYW4gb25lIGRldmljZSBhY3RpdmUgb24gdGhlIFNDU0kgYnVzCisgKiAgICAgICAgICB3aWxsIGJlbmVmaXQgZnJvbSB0aGlzLiBUaGUgZHJpdmVyIGRlZmF1bHRzIHRvIHdoYXQgSQorICogICAgICAgICAgY2FsbCAnYWRhcHRpdmUgZGlzY29ubmVjdCcgLSBtZWFuaW5nIHRoYXQgZWFjaCBjb21tYW5kCisgKiAgICAgICAgICBpcyBldmFsdWF0ZWQgaW5kaXZpZHVhbGx5IGFzIHRvIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZAorICogICAgICAgICAgYmUgcnVuIHdpdGggdGhlIG9wdGlvbiB0byBkaXNjb25uZWN0L3Jlc2VsZWN0IChpZiB0aGUKKyAqICAgICAgICAgIGRldmljZSBjaG9vc2VzKSwgb3IgYXMgYSAiU0NTSS1idXMtaG9nIi4KKyAqCisgKiAgICAtICBTeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVycyBhcmUgbm93IHN1cHBvcnRlZC4gQmVjYXVzZSBvZgorICogICAgICAgICAgYSBmZXcgZGV2aWNlcyB0aGF0IGNob2tlIGFmdGVyIHRlbGxpbmcgdGhlIGRyaXZlciB0aGF0CisgKiAgICAgICAgICB0aGV5IGNhbiBkbyBzeW5jIHRyYW5zZmVycywgd2UgZG9uJ3QgYXV0b21hdGljYWxseSB1c2UKKyAqICAgICAgICAgIHRoaXMgZmFzdGVyIHByb3RvY29sIC0gaXQgY2FuIGJlIGVuYWJsZWQgdmlhIHRoZSBjb21tYW5kLQorICogICAgICAgICAgbGluZSBvbiBhIGRldmljZS1ieS1kZXZpY2UgYmFzaXMuCisgKgorICogICAgLSAgUnVudGltZSBvcGVyYXRpbmcgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB0aHJvdWdoCisgKiAgICAgICB0aGUgJ2FtaWJvb3QnIG9yIHRoZSAnaW5zbW9kJyBjb21tYW5kIGxpbmUuIEZvciBhbWlib290IGRvOgorICogICAgICAgICAgImFtaWJvb3QgW3VzdWFsIHN0dWZmXSB3ZDMzYzkzPWJsYWgsYmxhaCxibGFoIgorICogICAgICAgVGhlIGRlZmF1bHRzIHNob3VsZCBiZSBnb29kIGZvciBtb3N0IHBlb3BsZS4gU2VlIHRoZSBjb21tZW50CisgKiAgICAgICBmb3IgJ3NldHVwX3N0cmluZ3MnIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgLSAgVGhlIG9sZCBkcml2ZXIgcmVsaWVkIGV4Y2x1c2l2ZWx5IG9uIHdoYXQgdGhlIFdlc3Rlcm4gRGlnaXRhbAorICogICAgICAgICAgZG9jcyBjYWxsICJDb21iaW5hdGlvbiBMZXZlbCAyIENvbW1hbmRzIiwgd2hpY2ggYXJlIGEgZ3JlYXQKKyAqICAgICAgICAgIGlkZWEgaW4gdGhhdCB0aGUgQ1BVIGlzIHJlbGlldmVkIG9mIGEgbG90IG9mIGludGVycnVwdAorICogICAgICAgICAgb3ZlcmhlYWQuIEhvd2V2ZXIsIGJ5IGFjY2VwdGluZyBhIGNlcnRhaW4gKHVzZXItc2V0dGFibGUpCisgKiAgICAgICAgICBhbW91bnQgb2YgYWRkaXRpb25hbCBpbnRlcnJ1cHRzLCB0aGlzIGRyaXZlciBhY2hpZXZlcworICogICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb3ZlciB0aGUgU0NTSSBidXMsIGFuZCBkYXRhIHRyYW5zZmVycyBhcmUKKyAqICAgICAgICAgIGFsbW9zdCBhcyBmYXN0IHdoaWxlIGJlaW5nIG11Y2ggZWFzaWVyIHRvIGRlZmluZSwgdHJhY2ssCisgKiAgICAgICAgICBhbmQgZGVidWcuCisgKgorICoKKyAqIFRPRE86CisgKiAgICAgICBtb3JlIHNwZWVkLiBsaW5rZWQgY29tbWFuZHMuCisgKgorICoKKyAqIFBlb3BsZSB3aXRoIGJ1ZyByZXBvcnRzLCB3aXNoLWxpc3RzLCBjb21wbGFpbnRzLCBjb21tZW50cywKKyAqIG9yIGltcHJvdmVtZW50cyBhcmUgYXNrZWQgdG8gcGFoLWxlZWV6IGVtYWlsIG1lIChKb2huIFNoaWZmbGV0dCkKKyAqIGF0IGpvaG5AZ2VvbG9nLmNvbSBvciBqc2hpZmZsZUBuZXRjb20uY29tISBJJ20gYW54aW91cyB0byBnZXQKKyAqIHRoaXMgdGhpbmcgaW50byBhcyBnb29kIGEgc2hhcGUgYXMgcG9zc2libGUsIGFuZCBJJ20gcG9zaXRpdmUKKyAqIHRoZXJlIGFyZSBsb3RzIG9mIGx1cmtpbmcgYnVncyBhbmQgIlN0dXBpZCBQbGFjZXMiLgorICoKKyAqIFVwZGF0ZXM6CisgKgorICogQWRkZWQgc3VwcG9ydCBmb3IgcHJlIC1BIGNoaXBzLCB3aGljaCBkb24ndCBoYXZlIGFkdmFuY2VkIGZlYXR1cmVzCisgKiBhbmQgd2lsbCBnZW5lcmF0ZSBDU1JfUkVTRUwgcmF0aGVyIHRoYW4gQ1NSX1JFU0VMX0FNLgorICoJUmljaGFyZCBIaXJzdCA8cmljaGFyZEBzbGVlcGllLmRlbW9uLmNvLnVrPiAgQXVndXN0IDIwMDAKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSAid2QzM2M5My5oIgorCisKKyNkZWZpbmUgV0QzM0M5M19WRVJTSU9OICAgICIxLjI2IgorI2RlZmluZSBXRDMzQzkzX0RBVEUgICAgICAgIjIyL0ZlYi8yMDAzIgorCitNT0RVTEVfQVVUSE9SKCJKb2huIFNoaWZmbGV0dCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIFdEMzNDOTMgU0NTSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqICdzZXR1cF9zdHJpbmdzJyBpcyBhIHNpbmdsZSBzdHJpbmcgdXNlZCB0byBwYXNzIG9wZXJhdGluZyBwYXJhbWV0ZXJzIGFuZAorICogc2V0dGluZ3MgZnJvbSB0aGUga2VybmVsL21vZHVsZSBjb21tYW5kLWxpbmUgdG8gdGhlIGRyaXZlci4gJ3NldHVwX2FyZ3NbXScKKyAqIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBkZWZpbmUgdGhlIGNvbXBpbGUtdGltZSBkZWZhdWx0IHZhbHVlcyBmb3IKKyAqIHRoZXNlIHNldHRpbmdzLiBJZiBMaW51eCBib290cyB3aXRoIGFuIGFtaWJvb3Qgb3IgaW5zbW9kIGNvbW1hbmQtbGluZSwKKyAqIHRob3NlIHNldHRpbmdzIGFyZSBjb21iaW5lZCB3aXRoICdzZXR1cF9hcmdzW10nLiBOb3RlIHRoYXQgYW1pYm9vdAorICogY29tbWFuZC1saW5lcyBhcmUgcHJlZml4ZWQgd2l0aCAid2QzM2M5Mz0iIHdoaWxlIGluc21vZCB1c2VzIGEKKyAqICJzZXR1cF9zdHJpbmdzPSIgcHJlZml4LiBUaGUgZHJpdmVyIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBrZXl3b3JkcworICogKGxvd2VyIGNhc2UgcmVxdWlyZWQpIGFuZCBhcmd1bWVudHM6CisgKgorICogLSAgbm9zeW5jOmJpdG1hc2sgLWJpdG1hc2sgaXMgYSBieXRlIHdoZXJlIHRoZSAxc3QgNyBiaXRzIGNvcnJlc3BvbmQgd2l0aAorICogICAgICAgICAgICAgICAgICAgIHRoZSA3IHBvc3NpYmxlIFNDU0kgZGV2aWNlcy4gU2V0IGEgYml0IHRvIG5lZ290aWF0ZSBmb3IKKyAqICAgICAgICAgICAgICAgICAgICBhc3luY2hyb25vdXMgdHJhbnNmZXJzIG9uIHRoYXQgZGV2aWNlLiBUbyBtYWludGFpbgorICogICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhIGNvbW1hbmQtbGluZSBzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgICAgIndkMzNjOTM9MjU1IiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCB0bworICogICAgICAgICAgICAgICAgICAgICJ3ZDMzYzkzPW5vc3luYzoweGZmIi4KKyAqIC0gIG5vZG1hOnggICAgICAgIC14ID0gMSB0byBkaXNhYmxlIERNQSwgeCA9IDAgdG8gZW5hYmxlIGl0LiBBcmd1bWVudCBpcworICogICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIC0gaWYgbm90IHByZXNlbnQsIHNhbWUgYXMgIm5vZG1hOjEiLgorICogLSAgcGVyaW9kOm5zICAgICAgLW5zIGlzIHRoZSBtaW5pbXVtICMgb2YgbmFub3NlY29uZHMgaW4gYSBTQ1NJIGRhdGEgdHJhbnNmZXIKKyAqICAgICAgICAgICAgICAgICAgICBwZXJpb2QuIERlZmF1bHQgaXMgNTAwOyBhY2NlcHRhYmxlIHZhbHVlcyBhcmUgMjUwIC0gMTAwMC4KKyAqIC0gIGRpc2Nvbm5lY3Q6eCAgIC14ID0gMCB0byBuZXZlciBhbGxvdyBkaXNjb25uZWN0cywgMiB0byBhbHdheXMgYWxsb3cgdGhlbS4KKyAqICAgICAgICAgICAgICAgICAgICB4ID0gMSBkb2VzICdhZGFwdGl2ZScgZGlzY29ubmVjdHMsIHdoaWNoIGlzIHRoZSBkZWZhdWx0CisgKiAgICAgICAgICAgICAgICAgICAgYW5kIGdlbmVyYWxseSB0aGUgYmVzdCBjaG9pY2UuCisgKiAtICBkZWJ1Zzp4ICAgICAgICAtSWYgJ0RFQlVHR0lOR19PTicgaXMgZGVmaW5lZCwgeCBpcyBhIGJpdCBtYXNrIHRoYXQgY2F1c2VzCisgKiAgICAgICAgICAgICAgICAgICAgdmFyaW91cyB0eXBlcyBvZiBkZWJ1ZyBvdXRwdXQgdG8gcHJpbnRlZCAtIHNlZSB0aGUgREJfeHh4CisgKiAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyBpbiB3ZDMzYzkzLmgKKyAqIC0gIGNsb2NrOnggICAgICAgIC14ID0gY2xvY2sgaW5wdXQgaW4gTUh6IGZvciBXRDMzYzkzIGNoaXAuIE5vcm1hbCB2YWx1ZXMKKyAqICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBmcm9tIDggdGhyb3VnaCAyMC4gRGVmYXVsdCBpcyA4LgorICogLSAgbmV4dCAgICAgICAgICAgLU5vIGFyZ3VtZW50LiBVc2VkIHRvIHNlcGFyYXRlIGJsb2NrcyBvZiBrZXl3b3JkcyB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgdGhlcmUncyBtb3JlIHRoYW4gb25lIGhvc3QgYWRhcHRlciBpbiB0aGUgc3lzdGVtLgorICoKKyAqIFN5bnRheCBOb3RlczoKKyAqIC0gIE51bWVyaWMgYXJndW1lbnRzIGNhbiBiZSBkZWNpbWFsIG9yIHRoZSAnMHgnIGZvcm0gb2YgaGV4IG5vdGF0aW9uLiBUaGVyZQorICogICAgX211c3RfIGJlIGEgY29sb24gYmV0d2VlbiBhIGtleXdvcmQgYW5kIGl0cyBudW1lcmljIGFyZ3VtZW50LCB3aXRoIG5vCisgKiAgICBzcGFjZXMuCisgKiAtICBLZXl3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbm8gc3BhY2VzLCBpbiB0aGUgc3RhbmRhcmQga2VybmVsCisgKiAgICBjb21tYW5kLWxpbmUgbWFubmVyLgorICogLSAgQSBrZXl3b3JkIGluIHRoZSAnbnRoJyBjb21tYS1zZXBhcmF0ZWQgY29tbWFuZC1saW5lIG1lbWJlciB3aWxsIG92ZXJ3cml0ZQorICogICAgdGhlICdudGgnIGVsZW1lbnQgb2Ygc2V0dXBfYXJnc1tdLiBBIGJsYW5rIGNvbW1hbmQtbGluZSBtZW1iZXIgKGluCisgKiAgICBvdGhlciB3b3JkcywgYSBjb21tYSB3aXRoIG5vIHByZWNlZGluZyBrZXl3b3JkKSB3aWxsIF9ub3RfIG92ZXJ3cml0ZQorICogICAgdGhlIGNvcnJlc3BvbmRpbmcgc2V0dXBfYXJnc1tdIGVsZW1lbnQuCisgKiAtICBJZiBhIGtleXdvcmQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSwgdGhlIGZpcnN0IG9uZSBhcHBsaWVzIHRvIHRoZSBmaXJzdAorICogICAgU0NTSSBob3N0IGZvdW5kLCB0aGUgc2Vjb25kIHRvIHRoZSBzZWNvbmQgY2FyZCwgZXRjLCB1bmxlc3MgdGhlICduZXh0JworICogICAga2V5d29yZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgb3JkZXIuCisgKgorICogU29tZSBhbWlib290IGV4YW1wbGVzIChmb3IgaW5zbW9kLCB1c2UgJ3NldHVwX3N0cmluZ3MnIGluc3RlYWQgb2YgJ3dkMzNjOTMnKToKKyAqIC0gIHdkMzNjOTM9bm9zeW5jOjI1NQorICogLSAgd2QzM2M5Mz1ub2RtYQorICogLSAgd2QzM2M5Mz1ub2RtYToxCisgKiAtICB3ZDMzYzkzPWRpc2Nvbm5lY3Q6Mixub3N5bmM6MHgwOCxwZXJpb2Q6MjUwCisgKiAtICB3ZDMzYzkzPWRlYnVnOjB4MWMKKyAqLworCisvKiBOb3JtYWxseSwgbm8gZGVmYXVsdHMgYXJlIHNwZWNpZmllZCAqLworc3RhdGljIGNoYXIgKnNldHVwX2FyZ3NbXSA9IHsgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiB9OworCitzdGF0aWMgY2hhciAqc2V0dXBfc3RyaW5nczsKK21vZHVsZV9wYXJhbShzZXR1cF9zdHJpbmdzLCBjaGFycCwgMCk7CisKK3N0YXRpYyB2b2lkIHdkMzNjOTNfZXhlY3V0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CisKKyNpZmRlZiBDT05GSUdfV0QzM0M5M19QSU8KK3N0YXRpYyBpbmxpbmUgdWNoYXIKK3JlYWRfd2QzM2M5Myhjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywgdWNoYXIgcmVnX251bSkKK3sKKwl1Y2hhciBkYXRhOworCisJb3V0YihyZWdfbnVtLCByZWdzLlNBU1IpOworCWRhdGEgPSBpbmIocmVncy5TQ01EKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCityZWFkX3dkMzNjOTNfY291bnQoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCW91dGIoV0RfVFJBTlNGRVJfQ09VTlRfTVNCLCByZWdzLlNBU1IpOworCXZhbHVlID0gaW5iKHJlZ3MuU0NNRCkgPDwgMTY7CisJdmFsdWUgfD0gaW5iKHJlZ3MuU0NNRCkgPDwgODsKKwl2YWx1ZSB8PSBpbmIocmVncy5TQ01EKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWNoYXIKK3JlYWRfYXV4X3N0YXQoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MpCit7CisJcmV0dXJuIGluYihyZWdzLlNBU1IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3dkMzNjOTMoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHVjaGFyIHJlZ19udW0sIHVjaGFyIHZhbHVlKQoreworICAgICAgb3V0YihyZWdfbnVtLCByZWdzLlNBU1IpOworICAgICAgb3V0Yih2YWx1ZSwgcmVncy5TQ01EKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV93ZDMzYzkzX2NvdW50KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCW91dGIoV0RfVFJBTlNGRVJfQ09VTlRfTVNCLCByZWdzLlNBU1IpOworCW91dGIoKHZhbHVlID4+IDE2KSAmIDB4ZmYsIHJlZ3MuU0NNRCk7CisJb3V0YigodmFsdWUgPj4gOCkgJiAweGZmLCByZWdzLlNDTUQpOworCW91dGIoIHZhbHVlICYgMHhmZiwgcmVncy5TQ01EKTsKK30KKworI2RlZmluZSB3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBjbWQpIFwKKwl3cml0ZV93ZDMzYzkzKChyZWdzKSwgV0RfQ09NTUFORCwgKGNtZCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfd2QzM2M5M19jZGIoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHVpbnQgbGVuLCB1Y2hhciBjbW5kW10pCit7CisJaW50IGk7CisKKwlvdXRiKFdEX0NEQl8xLCByZWdzLlNBU1IpOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQlvdXRiKGNtbmRbaV0sIHJlZ3MuU0NNRCk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19XRDMzQzkzX1BJTyAqLworc3RhdGljIGlubGluZSB1Y2hhcgorcmVhZF93ZDMzYzkzKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1Y2hhciByZWdfbnVtKQoreworCSpyZWdzLlNBU1IgPSByZWdfbnVtOworCW1iKCk7CisJcmV0dXJuICgqcmVncy5TQ01EKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3JlYWRfd2QzM2M5M19jb3VudChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJKnJlZ3MuU0FTUiA9IFdEX1RSQU5TRkVSX0NPVU5UX01TQjsKKwltYigpOworCXZhbHVlID0gKnJlZ3MuU0NNRCA8PCAxNjsKKwl2YWx1ZSB8PSAqcmVncy5TQ01EIDw8IDg7CisJdmFsdWUgfD0gKnJlZ3MuU0NNRDsKKwltYigpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB1Y2hhcgorcmVhZF9hdXhfc3RhdChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncykKK3sKKwlyZXR1cm4gKnJlZ3MuU0FTUjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV93ZDMzYzkzKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1Y2hhciByZWdfbnVtLCB1Y2hhciB2YWx1ZSkKK3sKKwkqcmVncy5TQVNSID0gcmVnX251bTsKKwltYigpOworCSpyZWdzLlNDTUQgPSB2YWx1ZTsKKwltYigpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfd2QzM2M5M19jb3VudChjb25zdCB3ZDMzYzkzX3JlZ3MgcmVncywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwkqcmVncy5TQVNSID0gV0RfVFJBTlNGRVJfQ09VTlRfTVNCOworCW1iKCk7CisJKnJlZ3MuU0NNRCA9IHZhbHVlID4+IDE2OworCSpyZWdzLlNDTUQgPSB2YWx1ZSA+PiA4OworCSpyZWdzLlNDTUQgPSB2YWx1ZTsKKwltYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3dkMzNjOTNfY21kKGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLCB1Y2hhciBjbWQpCit7CisJKnJlZ3MuU0FTUiA9IFdEX0NPTU1BTkQ7CisJbWIoKTsKKwkqcmVncy5TQ01EID0gY21kOworCW1iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfd2QzM2M5M19jZGIoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHVpbnQgbGVuLCB1Y2hhciBjbW5kW10pCit7CisJaW50IGk7CisKKwkqcmVncy5TQVNSID0gV0RfQ0RCXzE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkqcmVncy5TQ01EID0gY21uZFtpXTsKK30KKyNlbmRpZiAvKiBDT05GSUdfV0QzM0M5M19QSU8gKi8KKworc3RhdGljIGlubGluZSB1Y2hhcgorcmVhZF8xX2J5dGUoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MpCit7CisJdWNoYXIgYXNyOworCXVjaGFyIHggPSAwOworCisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOworCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9UUkFOU19JTkZPIHwgMHg4MCk7CisJZG8geworCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQlpZiAoYXNyICYgQVNSX0RCUikKKwkJCXggPSByZWFkX3dkMzNjOTMocmVncywgV0RfREFUQSk7CisJfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3hfcGVyaW9kIHN4X3RhYmxlW10gPSB7CisJezEsIDB4MjB9LAorCXsyNTIsIDB4MjB9LAorCXszNzYsIDB4MzB9LAorCXs1MDAsIDB4NDB9LAorCXs2MjQsIDB4NTB9LAorCXs3NTIsIDB4NjB9LAorCXs4NzYsIDB4NzB9LAorCXsxMDAwLCAweDAwfSwKKwl7MCwgMH0KK307CisKK3N0YXRpYyBpbnQKK3JvdW5kX3BlcmlvZCh1bnNpZ25lZCBpbnQgcGVyaW9kKQoreworCWludCB4OworCisJZm9yICh4ID0gMTsgc3hfdGFibGVbeF0ucGVyaW9kX25zOyB4KyspIHsKKwkJaWYgKChwZXJpb2QgPD0gc3hfdGFibGVbeCAtIDBdLnBlcmlvZF9ucykgJiYKKwkJICAgIChwZXJpb2QgPiBzeF90YWJsZVt4IC0gMV0ucGVyaW9kX25zKSkgeworCQkJcmV0dXJuIHg7CisJCX0KKwl9CisJcmV0dXJuIDc7Cit9CisKK3N0YXRpYyB1Y2hhcgorY2FsY19zeW5jX3hmZXIodW5zaWduZWQgaW50IHBlcmlvZCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1Y2hhciByZXN1bHQ7CisKKwlwZXJpb2QgKj0gNDsJCS8qIGNvbnZlcnQgU0RUUiBjb2RlIHRvIG5zICovCisJcmVzdWx0ID0gc3hfdGFibGVbcm91bmRfcGVyaW9kKHBlcmlvZCldLnJlZ192YWx1ZTsKKwlyZXN1bHQgfD0gKG9mZnNldCA8IE9QVElNVU1fU1hfT0ZGKSA/IG9mZnNldCA6IE9QVElNVU1fU1hfT0ZGOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAord2QzM2M5M19xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQl2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqaG9zdGRhdGE7CisJc3RydWN0IHNjc2lfY21uZCAqdG1wOworCisJaG9zdGRhdGEgPSAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJREIoREJfUVVFVUVfQ09NTUFORCwKKwkgICBwcmludGsoIlEtJWQtJTAyeC0lbGQoICIsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5jbW5kWzBdLCBjbWQtPnBpZCkpCisKKy8qIFNldCB1cCBhIGZldyBmaWVsZHMgaW4gdGhlIHNjc2lfY21uZCBzdHJ1Y3R1cmUgZm9yIG91ciBvd24gdXNlOgorICogIC0gaG9zdF9zY3JpYmJsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBjbWQgaW4gdGhlIGlucHV0IHF1ZXVlCisgKiAgLSBzY3NpX2RvbmUgcG9pbnRzIHRvIHRoZSByb3V0aW5lIHdlIGNhbGwgd2hlbiBhIGNtZCBpcyBmaW5pc2hlZAorICogIC0gcmVzdWx0IGlzIHdoYXQgeW91J2QgZXhwZWN0CisgKi8KKwljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKy8qIFdlIHVzZSB0aGUgU2NzaV9Qb2ludGVyIHN0cnVjdHVyZSB0aGF0J3MgaW5jbHVkZWQgd2l0aCBlYWNoIGNvbW1hbmQKKyAqIGFzIGEgc2NyYXRjaHBhZCAoYXMgaXQncyBpbnRlbmRlZCB0byBiZSB1c2VkISkuIFRoZSBoYW5keSB0aGluZyBhYm91dAorICogdGhlIFNDcC54eHggZmllbGRzIGlzIHRoYXQgdGhleSdyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKyAqIGNtZCwgYW5kIGFyZSBwcmVzZXJ2ZWQgYWNyb3NzIGRpc2Nvbm5lY3QtcmVzZWxlY3QuIFRoaXMgbWVhbnMgd2UKKyAqIGNhbiBwcmV0dHkgbXVjaCBpZ25vcmUgU0FWRV9QT0lOVEVSUyBhbmQgUkVTVE9SRV9QT0lOVEVSUyBtZXNzYWdlcworICogaWYgd2Uga2VlcCBhbGwgdGhlIGNyaXRpY2FsIHBvaW50ZXJzIGFuZCBjb3VudGVycyBpbiBTQ3A6CisgKiAgLSBTQ3AucHRyIGlzIHRoZSBwb2ludGVyIGludG8gdGhlIFJBTSBidWZmZXIKKyAqICAtIFNDcC50aGlzX3Jlc2lkdWFsIGlzIHRoZSBzaXplIG9mIHRoYXQgYnVmZmVyCisgKiAgLSBTQ3AuYnVmZmVyIHBvaW50cyB0byB0aGUgY3VycmVudCBzY2F0dGVyLWdhdGhlciBidWZmZXIKKyAqICAtIFNDcC5idWZmZXJzX3Jlc2lkdWFsIHRlbGxzIHVzIGhvdyBtYW55IFMuRy4gYnVmZmVycyB0aGVyZSBhcmUKKyAqICAtIFNDcC5oYXZlX2RhdGFfaW4gaXMgbm90IHVzZWQKKyAqICAtIFNDcC5zZW50X2NvbW1hbmQgaXMgbm90IHVzZWQKKyAqICAtIFNDcC5waGFzZSByZWNvcmRzIHRoaXMgY29tbWFuZCdzIFNSQ0lEX0VSIGJpdCBzZXR0aW5nCisgKi8KKworCWlmIChjbWQtPnVzZV9zZykgeworCQljbWQtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIGNtZC0+YnVmZmVyOworCQljbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gY21kLT51c2Vfc2cgLSAxOworCQljbWQtPlNDcC5wdHIgPSBwYWdlX2FkZHJlc3MoY21kLT5TQ3AuYnVmZmVyLT5wYWdlKSArCisJCSAgICBjbWQtPlNDcC5idWZmZXItPm9mZnNldDsKKwkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCX0gZWxzZSB7CisJCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7CisJCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCQljbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJfQorCisvKiBXRCBkb2NzIHN0YXRlIHRoYXQgYXQgdGhlIGNvbmNsdXNpb24gb2YgYSAiTEVWRUwyIiBjb21tYW5kLCB0aGUKKyAqIHN0YXR1cyBieXRlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgTFVOIHJlZ2lzdGVyLiBBcHBhcmVudGx5LAorICogdGhpcyBpcyB0aGUgY2FzZSBvbmx5IGZvciAqdW5pbnRlcnJ1cHRlZCogTEVWRUwyIGNvbW1hbmRzISBJZgorICogdGhlcmUgYXJlIGFueSB1bmV4cGVjdGVkIHBoYXNlcyBlbnRlcmVkLCBldmVuIGlmIHRoZXkgYXJlIDEwMCUKKyAqIGxlZ2FsIChkaWZmZXJlbnQgZGV2aWNlcyBtYXkgY2hvb3NlIHRvIGRvIHRoaW5ncyBkaWZmZXJlbnRseSksCisgKiB0aGUgTEVWRUwyIGNvbW1hbmQgc2VxdWVuY2UgaXMgZXhpdGVkLiBUaGlzIG9mdGVuIG9jY3VycyBwcmlvcgorICogdG8gcmVjZWl2aW5nIHRoZSBzdGF0dXMgYnl0ZSwgaW4gd2hpY2ggY2FzZSB0aGUgZHJpdmVyIGRvZXMgYQorICogc3RhdHVzIHBoYXNlIGludGVycnVwdCBhbmQgZ2V0cyB0aGUgc3RhdHVzIGJ5dGUgb24gaXRzIG93bi4KKyAqIFdoaWxlIHN1Y2ggYSBjb21tYW5kIGNhbiB0aGVuIGJlICJyZXN1bWVkIiAoaWUgcmVzdGFydGVkIHRvCisgKiBmaW5pc2ggdXAgYXMgYSBMRVZFTDIgY29tbWFuZCksIHRoZSBMVU4gcmVnaXN0ZXIgd2lsbCBOT1QgYmUKKyAqIGEgdmFsaWQgc3RhdHVzIGJ5dGUgYXQgdGhlIGNvbW1hbmQncyBjb25jbHVzaW9uLCBhbmQgd2UgbXVzdAorICogdXNlIHRoZSBieXRlIG9idGFpbmVkIGR1cmluZyB0aGUgZWFybGllciBpbnRlcnJ1cHQuIEhlcmUsIHdlCisgKiBwcmVzZXQgU0NwLlN0YXR1cyB0byBhbiBpbGxlZ2FsIHZhbHVlICgweGZmKSBzbyB0aGF0IHdoZW4KKyAqIHRoaXMgY29tbWFuZCBmaW5hbGx5IGNvbXBsZXRlcywgd2UgY2FuIHRlbGwgd2hlcmUgdGhlIGFjdHVhbAorICogc3RhdHVzIGJ5dGUgaXMgc3RvcmVkLgorICovCisKKwljbWQtPlNDcC5TdGF0dXMgPSBJTExFR0FMX1NUQVRVU19CWVRFOworCisJLyoKKwkgKiBBZGQgdGhlIGNtZCB0byB0aGUgZW5kIG9mICdpbnB1dF9RJy4gTm90ZSB0aGF0IFJFUVVFU1QgU0VOU0UKKwkgKiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHNvIHRoYXQgdGhlIGRlc2lyZWQKKwkgKiBzZW5zZSBkYXRhIGlzIG5vdCBsb3N0IGJlZm9yZSBSRVFVRVNUX1NFTlNFIGV4ZWN1dGVzLgorCSAqLworCisJc3Bpbl9sb2NrX2lycSgmaG9zdGRhdGEtPmxvY2spOworCisJaWYgKCEoaG9zdGRhdGEtPmlucHV0X1EpIHx8IChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkpIHsKKwkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKKwl9IGVsc2UgewkJLyogZmluZCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAqLworCQlmb3IgKHRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQkgICAgIHRtcC0+aG9zdF9zY3JpYmJsZTsKKwkJICAgICB0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpIDsKKwkJdG1wLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGNtZDsKKwl9CisKKy8qIFdlIGtub3cgdGhhdCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjb21tYW5kIGluICdpbnB1dF9RJyBub3cuCisgKiBHbyBzZWUgaWYgYW55IG9mIHRoZW0gYXJlIHJ1bm5hYmxlIQorICovCisKKwl3ZDMzYzkzX2V4ZWN1dGUoY21kLT5kZXZpY2UtPmhvc3QpOworCisJREIoREJfUVVFVUVfQ09NTUFORCwgcHJpbnRrKCIpUS0lbGQgIiwgY21kLT5waWQpKQorCisJc3Bpbl91bmxvY2tfaXJxKCZob3N0ZGF0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gc3RhcnQgYSBzY3NpIGNvbW1hbmQuIElmIHRoZSBob3N0X2NhcmQgaXMKKyAqIGFscmVhZHkgY29ubmVjdGVkLCB3ZSBnaXZlIHVwIGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsIGxvb2sgdGhyb3VnaAorICogdGhlIGlucHV0X1EsIHVzaW5nIHRoZSBmaXJzdCBjb21tYW5kIHdlIGZpbmQgdGhhdCdzIGludGVuZGVkCisgKiBmb3IgYSBjdXJyZW50bHkgbm9uLWJ1c3kgdGFyZ2V0L2x1bi4KKyAqCisgKiB3ZDMzYzkzX2V4ZWN1dGUoKSBpcyBhbHdheXMgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBvciBmcm9tCisgKiB0aGUgd2QzM2M5M19pbnRyIGl0c2VsZiwgd2hpY2ggbWVhbnMgdGhhdCBhIHdkMzNjOTMgaW50ZXJydXB0CisgKiBjYW5ub3Qgb2NjdXIgd2hpbGUgd2UgYXJlIGluIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCit3ZDMzYzkzX2V4ZWN1dGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKwljb25zdCB3ZDMzYzkzX3JlZ3MgcmVncyA9IGhvc3RkYXRhLT5yZWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgKnByZXY7CisKKwlEQihEQl9FWEVDVVRFLCBwcmludGsoIkVYKCIpKQorCWlmIChob3N0ZGF0YS0+c2VsZWN0aW5nIHx8IGhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKKwkJREIoREJfRVhFQ1VURSwgcHJpbnRrKCIpRVgtMCAiKSkKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogU2VhcmNoIHRocm91Z2ggdGhlIGlucHV0X1EgZm9yIGEgY29tbWFuZCBkZXN0aW5lZAorCSAqIGZvciBhbiBpZGxlIHRhcmdldC9sdW4uCisJICovCisKKwljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwlwcmV2ID0gMDsKKwl3aGlsZSAoY21kKSB7CisJCWlmICghKGhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJiAoMSA8PCBjbWQtPmRldmljZS0+bHVuKSkpCisJCQlicmVhazsKKwkJcHJldiA9IGNtZDsKKwkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCX0KKworCS8qIHF1aXQgaWYgcXVldWUgZW1wdHkgb3IgYWxsIHBvc3NpYmxlIHRhcmdldHMgYXJlIGJ1c3kgKi8KKworCWlmICghY21kKSB7CisJCURCKERCX0VYRUNVVEUsIHByaW50aygiKUVYLTEgIikpCisJCXJldHVybjsKKwl9CisKKwkvKiAgcmVtb3ZlIGNvbW1hbmQgZnJvbSBxdWV1ZSAqLworCisJaWYgKHByZXYpCisJCXByZXYtPmhvc3Rfc2NyaWJibGUgPSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJZWxzZQorCQlob3N0ZGF0YS0+aW5wdXRfUSA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKworI2lmZGVmIFBST0NfU1RBVElTVElDUworCWhvc3RkYXRhLT5jbWRfY250W2NtZC0+ZGV2aWNlLT5pZF0rKzsKKyNlbmRpZgorCisJLyoKKwkgKiBTdGFydCB0aGUgc2VsZWN0aW9uIHByb2Nlc3MKKwkgKi8KKworCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfREVTVElOQVRJT05fSUQsIGNtZC0+ZGV2aWNlLT5pZCk7CisJZWxzZQorCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQgfCBEU1RJRF9EUEQpOworCisvKiBOb3cgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBpcyBhIGdvb2QKKyAqIGNhbmRpZGF0ZSBmb3IgZGlzY29ubmVjdC9yZXNlbGVjdC4gV2UgZ3Vlc3MgdG8gdGhlIGJlc3Qgb2Ygb3VyCisgKiBhYmlsaXR5LCBiYXNlZCBvbiBhIHNldCBvZiBoaWVyYXJjaGljYWwgcnVsZXMuIFdoZW4gc2V2ZXJhbAorICogZGV2aWNlcyBhcmUgb3BlcmF0aW5nIHNpbXVsdGFuZW91c2x5LCBkaXNjb25uZWN0cyBhcmUgdXN1YWxseQorICogYW4gYWR2YW50YWdlLiBJbiBhIHNpbmdsZSBkZXZpY2Ugc3lzdGVtLCBvciBpZiBvbmx5IDEgZGV2aWNlCisgKiBpcyBiZWluZyBhY2Nlc3NlZCwgdHJhbnNmZXJzIHVzdWFsbHkgZ28gZmFzdGVyIGlmIGRpc2Nvbm5lY3RzCisgKiBhcmUgbm90IGFsbG93ZWQ6CisgKgorICogKyBDb21tYW5kcyBzaG91bGQgTkVWRVIgZGlzY29ubmVjdCBpZiBob3N0ZGF0YS0+ZGlzY29ubmVjdCA9CisgKiAgIERJU19ORVZFUiAodGhpcyBob2xkcyBmb3IgdGFwZSBkcml2ZXMgYWxzbyksIGFuZCBBTFdBWVMKKyAqICAgZGlzY29ubmVjdCBpZiBob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IERJU19BTFdBWVMuCisgKiArIFRhcGUgZHJpdmUgY29tbWFuZHMgc2hvdWxkIGFsd2F5cyBiZSBhbGxvd2VkIHRvIGRpc2Nvbm5lY3QuCisgKiArIERpc2Nvbm5lY3Qgc2hvdWxkIGJlIGFsbG93ZWQgaWYgZGlzY29ubmVjdGVkX1EgaXNuJ3QgZW1wdHkuCisgKiArIENvbW1hbmRzIHNob3VsZCBOT1QgZGlzY29ubmVjdCBpZiBpbnB1dF9RIGlzIGVtcHR5LgorICogKyBEaXNjb25uZWN0IHNob3VsZCBiZSBhbGxvd2VkIGlmIHRoZXJlIGFyZSBjb21tYW5kcyBpbiBpbnB1dF9RCisgKiAgIGZvciBhIGRpZmZlcmVudCB0YXJnZXQvbHVuLiBJbiB0aGlzIGNhc2UsIHRoZSBvdGhlciBjb21tYW5kcworICogICBzaG91bGQgYmUgbWFkZSBkaXNjb25uZWN0LWFibGUsIGlmIG5vdCBhbHJlYWR5LgorICoKKyAqIEkga25vdywgSSBrbm93IC0gdGhpcyBjb2RlIHdvdWxkIGZsdW5rIG1lIG91dCBvZiBhbnkKKyAqICJDIFByb2dyYW1taW5nIDEwMSIgY2xhc3MgZXZlciBvZmZlcmVkLiBCdXQgaXQncyBlYXN5CisgKiB0byBjaGFuZ2UgYXJvdW5kIGFuZCBleHBlcmltZW50IHdpdGggZm9yIG5vdy4KKyAqLworCisJY21kLT5TQ3AucGhhc2UgPSAwOwkvKiBhc3N1bWUgbm8gZGlzY29ubmVjdCAqLworCWlmIChob3N0ZGF0YS0+ZGlzY29ubmVjdCA9PSBESVNfTkVWRVIpCisJCWdvdG8gbm87CisJaWYgKGhvc3RkYXRhLT5kaXNjb25uZWN0ID09IERJU19BTFdBWVMpCisJCWdvdG8geWVzOworCWlmIChjbWQtPmRldmljZS0+dHlwZSA9PSAxKQkvKiB0YXBlIGRyaXZlPyAqLworCQlnb3RvIHllczsKKwlpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RKQkvKiBvdGhlciBjb21tYW5kcyBkaXNjb25uZWN0ZWQ/ICovCisJCWdvdG8geWVzOworCWlmICghKGhvc3RkYXRhLT5pbnB1dF9RKSkJLyogaW5wdXRfUSBlbXB0eT8gKi8KKwkJZ290byBubzsKKwlmb3IgKHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsgcHJldjsKKwkgICAgIHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBwcmV2LT5ob3N0X3NjcmliYmxlKSB7CisJCWlmICgocHJldi0+ZGV2aWNlLT5pZCAhPSBjbWQtPmRldmljZS0+aWQpIHx8CisJCSAgICAocHJldi0+ZGV2aWNlLT5sdW4gIT0gY21kLT5kZXZpY2UtPmx1bikpIHsKKwkJCWZvciAocHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROyBwcmV2OworCQkJICAgICBwcmV2ID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgcHJldi0+aG9zdF9zY3JpYmJsZSkKKwkJCQlwcmV2LT5TQ3AucGhhc2UgPSAxOworCQkJZ290byB5ZXM7CisJCX0KKwl9CisKKwlnb3RvIG5vOworCisgeWVzOgorCWNtZC0+U0NwLnBoYXNlID0gMTsKKworI2lmZGVmIFBST0NfU1RBVElTVElDUworCWhvc3RkYXRhLT5kaXNjX2FsbG93ZWRfY250W2NtZC0+ZGV2aWNlLT5pZF0rKzsKKyNlbmRpZgorCisgbm86CisKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1NPVVJDRV9JRCwgKChjbWQtPlNDcC5waGFzZSkgPyBTUkNJRF9FUiA6IDApKTsKKworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfVEFSR0VUX0xVTiwgY21kLT5kZXZpY2UtPmx1bik7CisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiwKKwkJICAgICAgaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdKTsKKwlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCisJaWYgKChob3N0ZGF0YS0+bGV2ZWwyID09IEwyX05PTkUpIHx8CisJICAgIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfVU5TRVQpKSB7CisKKwkJLyoKKwkJICogRG8gYSAnU2VsZWN0LVdpdGgtQVROJyBjb21tYW5kLiBUaGlzIHdpbGwgZW5kIHdpdGgKKwkJICogb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKKwkJICogICAgQ1NSX1JFU0VMX0FNOiAgZmFpbHVyZSAtIGNhbiB0cnkgYWdhaW4gbGF0ZXIuCisJCSAqICAgIENTUl9USU1FT1VUOiAgIGZhaWx1cmUgLSBnaXZlIHVwLgorCQkgKiAgICBDU1JfU0VMRUNUOiAgICBzdWNjZXNzIC0gcHJvY2VlZC4KKwkJICovCisKKwkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IGNtZDsKKworLyogRXZlcnkgdGFyZ2V0IGhhcyBpdHMgb3duIHN5bmNocm9ub3VzIHRyYW5zZmVyIHNldHRpbmcsIGtlcHQgaW4gdGhlCisgKiBzeW5jX3hmZXIgYXJyYXksIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3RhdHVzIGJ5dGUgaW4gc3luY19zdGF0W10uCisgKiBFYWNoIHRhcmdldCdzIHN5bmNfc3RhdFtdIGVudHJ5IGlzIGluaXRpYWxpemVkIHRvIFNYX1VOU0VULCBhbmQgaXRzCisgKiBzeW5jX3hmZXJbXSBlbnRyeSBpcyBpbml0aWFsaXplZCB0byB0aGUgZGVmYXVsdC9zYWZlIHZhbHVlLiBTU19VTlNFVAorICogbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgdW5kZXRlcm1pbmVkIGFzIHlldCwgYW5kIHRoYXQgd2UKKyAqIG5lZWQgdG8gc2VuZCBhbiBTRFRSIG1lc3NhZ2UgdG8gdGhpcyBkZXZpY2UgYWZ0ZXIgc2VsZWN0aW9uIGlzCisgKiBjb21wbGV0ZTogV2Ugc2V0IFNTX0ZJUlNUIHRvIHRlbGwgdGhlIGludGVycnVwdCByb3V0aW5lIHRvIGRvIHNvLgorICogSWYgd2UndmUgYmVlbiBhc2tlZCBub3QgdG8gdHJ5IHN5bmNocm9ub3VzIHRyYW5zZmVycyBvbiB0aGlzCisgKiB0YXJnZXQgKGFuZCBfYWxsXyBsdW5zIHdpdGhpbiBpdCksIHdlJ2xsIHN0aWxsIHNlbmQgdGhlIFNEVFIgbWVzc2FnZQorICogbGF0ZXIsIGJ1dCBhdCB0aGF0IHRpbWUgd2UnbGwgbmVnb3RpYXRlIGZvciBhc3luYyBieSBzcGVjaWZ5aW5nIGEKKyAqIHN5bmMgZmlmbyBkZXB0aCBvZiAwLgorICovCisJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfVU5TRVQpCisJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19GSVJTVDsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19TRUxFQ1RJTkc7CisJCXdyaXRlX3dkMzNjOTNfY291bnQocmVncywgMCk7CS8qIGd1YXJhbnRlZSBhIERBVEFfUEhBU0UgaW50ZXJydXB0ICovCisJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9TRUxfQVROKTsKKwl9IGVsc2UgeworCisJCS8qCisJCSAqIERvIGEgJ1NlbGVjdC1XaXRoLUFUTi1YZmVyJyBjb21tYW5kLiBUaGlzIHdpbGwgZW5kIHdpdGgKKwkJICogb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKKwkJICogICAgQ1NSX1JFU0VMX0FNOiAgZmFpbHVyZSAtIGNhbiB0cnkgYWdhaW4gbGF0ZXIuCisJCSAqICAgIENTUl9USU1FT1VUOiAgIGZhaWx1cmUgLSBnaXZlIHVwLgorCQkgKiAgICBhbnl0aGluZyBlbHNlOiBzdWNjZXNzIC0gcHJvY2VlZC4KKwkJICovCisKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IGNtZDsKKwkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5EX1BIQVNFLCAwKTsKKworCQkvKiBjb3B5IGNvbW1hbmRfZGVzY3JpcHRvcl9ibG9jayBpbnRvIFdEIGNoaXAKKwkJICogKHRha2UgYWR2YW50YWdlIG9mIGF1dG8taW5jcmVtZW50aW5nKQorCQkgKi8KKworCQl3cml0ZV93ZDMzYzkzX2NkYihyZWdzLCBjbWQtPmNtZF9sZW4sIGNtZC0+Y21uZCk7CisKKwkJLyogVGhlIHdkMzNjOTMgb25seSBrbm93cyBhYm91dCBHcm91cCAwLCAxLCBhbmQgNSBjb21tYW5kcyB3aGVuCisJCSAqIGl0J3MgZG9pbmcgYSAnc2VsZWN0LWFuZC10cmFuc2ZlcicuIFRvIGJlIHNhZmUsIHdlIHdyaXRlIHRoZQorCQkgKiBzaXplIG9mIHRoZSBDREIgaW50byB0aGUgT1dOX0lEIHJlZ2lzdGVyIGZvciBldmVyeSBjYXNlLiBUaGlzCisJCSAqIHdheSB0aGVyZSB3b24ndCBiZSBwcm9ibGVtcyB3aXRoIHZlbmRvci11bmlxdWUsIGF1ZGlvLCBldGMuCisJCSAqLworCisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfT1dOX0lELCBjbWQtPmNtZF9sZW4pOworCisJCS8qIFdoZW4gZG9pbmcgYSBub24tZGlzY29ubmVjdCBjb21tYW5kIHdpdGggRE1BLCB3ZSBjYW4gc2F2ZQorCQkgKiBvdXJzZWx2ZXMgYSBEQVRBIHBoYXNlIGludGVycnVwdCBsYXRlciBieSBzZXR0aW5nIGV2ZXJ5dGhpbmcKKwkJICogdXAgYWhlYWQgb2YgdGltZS4KKwkJICovCisKKwkJaWYgKChjbWQtPlNDcC5waGFzZSA9PSAwKSAmJiAoaG9zdGRhdGEtPm5vX2RtYSA9PSAwKSkgeworCQkJaWYgKGhvc3RkYXRhLT5kbWFfc2V0dXAoY21kLAorCQkJICAgIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpID8KKwkJCSAgICAgREFUQV9PVVRfRElSIDogREFUQV9JTl9ESVIpKQorCQkJCXdyaXRlX3dkMzNjOTNfY291bnQocmVncywgMCk7CS8qIGd1YXJhbnRlZSBhIERBVEFfUEhBU0UgaW50ZXJydXB0ICovCisJCQllbHNlIHsKKwkJCQl3cml0ZV93ZDMzYzkzX2NvdW50KHJlZ3MsCisJCQkJCQkgICAgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJCQkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT05UUk9MLAorCQkJCQkgICAgICBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9ETUEpOworCQkJCWhvc3RkYXRhLT5kbWEgPSBEX0RNQV9SVU5OSU5HOworCQkJfQorCQl9IGVsc2UKKwkJCXdyaXRlX3dkMzNjOTNfY291bnQocmVncywgMCk7CS8qIGd1YXJhbnRlZSBhIERBVEFfUEhBU0UgaW50ZXJydXB0ICovCisKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJfQorCisJLyoKKwkgKiBTaW5jZSB0aGUgU0NTSSBidXMgY2FuIGhhbmRsZSBvbmx5IDEgY29ubmVjdGlvbiBhdCBhIHRpbWUsCisJICogd2UgZ2V0IG91dCBvZiBoZXJlIG5vdy4gSWYgdGhlIHNlbGVjdGlvbiBmYWlscywgb3Igd2hlbgorCSAqIHRoZSBjb21tYW5kIGRpc2Nvbm5lY3RzLCB3ZSdsbCBjb21lIGJhY2sgdG8gdGhpcyByb3V0aW5lCisJICogdG8gc2VhcmNoIHRoZSBpbnB1dF9RIGFnYWluLi4uCisJICovCisKKwlEQihEQl9FWEVDVVRFLAorCSAgIHByaW50aygiJXMlbGQpRVgtMiAiLCAoY21kLT5TQ3AucGhhc2UpID8gImQ6IiA6ICIiLCBjbWQtPnBpZCkpCit9CisKK3N0YXRpYyB2b2lkCit0cmFuc2Zlcl9waW8oY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHVjaGFyICogYnVmLCBpbnQgY250LAorCSAgICAgaW50IGRhdGFfaW5fZGlyLCBzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqaG9zdGRhdGEpCit7CisJdWNoYXIgYXNyOworCisJREIoREJfVFJBTlNGRVIsCisJICAgcHJpbnRrKCIoJXAsJWQsJXM6IiwgYnVmLCBjbnQsIGRhdGFfaW5fZGlyID8gImluIiA6ICJvdXQiKSkKKworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwl3cml0ZV93ZDMzYzkzX2NvdW50KHJlZ3MsIGNudCk7CisJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX1RSQU5TX0lORk8pOworCWlmIChkYXRhX2luX2RpcikgeworCQlkbyB7CisJCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQkJKmJ1ZisrID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX0RBVEEpOworCQl9IHdoaWxlICghKGFzciAmIEFTUl9JTlQpKTsKKwl9IGVsc2UgeworCQlkbyB7CisJCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQkJaWYgKGFzciAmIEFTUl9EQlIpCisJCQkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9EQVRBLCAqYnVmKyspOworCQl9IHdoaWxlICghKGFzciAmIEFTUl9JTlQpKTsKKwl9CisKKwkvKiBOb3RlOiB3ZSBhcmUgcmV0dXJuaW5nIHdpdGggdGhlIGludGVycnVwdCBVTi1jbGVhcmVkLgorCSAqIFNpbmNlIChwcmVzdW1hYmx5KSBhbiBlbnRpcmUgSS9PIG9wZXJhdGlvbiBoYXMKKwkgKiBjb21wbGV0ZWQsIHRoZSBidXMgcGhhc2UgaXMgcHJvYmFibHkgZGlmZmVyZW50LCBhbmQKKwkgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2lsbCBkaXNjb3ZlciB0aGlzIHdoZW4gaXQKKwkgKiByZXNwb25kcyB0byB0aGUgdW5jbGVhcmVkIGludC4KKwkgKi8KKworfQorCitzdGF0aWMgdm9pZAordHJhbnNmZXJfYnl0ZXMoY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJaW50IGRhdGFfaW5fZGlyKQoreworCXN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICpob3N0ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsKKworCWhvc3RkYXRhID0gKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworLyogTm9ybWFsbHksIHlvdSdkIGV4cGVjdCAndGhpc19yZXNpZHVhbCcgdG8gYmUgbm9uLXplcm8gaGVyZS4KKyAqIEluIGEgc2VyaWVzIG9mIHNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVycywgaG93ZXZlciwgdGhpcworICogcm91dGluZSB3aWxsIHVzdWFsbHkgYmUgY2FsbGVkIHdpdGggJ3RoaXNfcmVzaWR1YWwnIGVxdWFsCisgKiB0byAwIGFuZCAnYnVmZmVyc19yZXNpZHVhbCcgbm9uLXplcm8uIFRoaXMgbWVhbnMgdGhhdCBhCisgKiBwcmV2aW91cyB0cmFuc2ZlciBjb21wbGV0ZWQsIGNsZWFyaW5nICd0aGlzX3Jlc2lkdWFsJywgYW5kCisgKiBub3cgd2UgbmVlZCB0byBzZXR1cCB0aGUgbmV4dCBzY2F0dGVyLWdhdGhlciBidWZmZXIgYXMgdGhlCisgKiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gZm9yIFRISVMgdHJhbnNmZXIuCisgKi8KKwlpZiAoIWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJiYgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkgeworCQkrK2NtZC0+U0NwLmJ1ZmZlcjsKKwkJLS1jbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gY21kLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCWNtZC0+U0NwLnB0ciA9IHBhZ2VfYWRkcmVzcyhjbWQtPlNDcC5idWZmZXItPnBhZ2UpICsKKwkJICAgIGNtZC0+U0NwLmJ1ZmZlci0+b2Zmc2V0OworCX0KKworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfU1lOQ0hST05PVVNfVFJBTlNGRVIsCisJCSAgICAgIGhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSk7CisKKy8qICdob3N0ZGF0YS0+bm9fZG1hJyBpcyBUUlVFIGlmIHdlIGRvbid0IGV2ZW4gd2FudCB0byB0cnkgRE1BLgorICogVXBkYXRlICd0aGlzX3Jlc2lkdWFsJyBhbmQgJ3B0cicgYWZ0ZXIgJ3RyYW5zZmVyX3BpbygpJyByZXR1cm5zLgorICovCisKKwlpZiAoaG9zdGRhdGEtPm5vX2RtYSB8fCBob3N0ZGF0YS0+ZG1hX3NldHVwKGNtZCwgZGF0YV9pbl9kaXIpKSB7CisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJCWhvc3RkYXRhLT5waW9fY250Kys7CisjZW5kaWYKKwkJdHJhbnNmZXJfcGlvKHJlZ3MsICh1Y2hhciAqKSBjbWQtPlNDcC5wdHIsCisJCQkgICAgIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsIGRhdGFfaW5fZGlyLCBob3N0ZGF0YSk7CisJCWxlbmd0aCA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWw7CisJCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSByZWFkX3dkMzNjOTNfY291bnQocmVncyk7CisJCWNtZC0+U0NwLnB0ciArPSAobGVuZ3RoIC0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7CisJfQorCisvKiBXZSBhcmUgYWJsZSB0byBkbyBETUEgKGluIGZhY3QsIHRoZSBBbWlnYSBoYXJkd2FyZSBpcworICogYWxyZWFkeSBnb2luZyEpLCBzbyBzdGFydCB1cCB0aGUgd2QzM2M5MyBpbiBETUEgbW9kZS4KKyAqIFdlIHNldCAnaG9zdGRhdGEtPmRtYScgPSBEX0RNQV9SVU5OSU5HIHNvIHRoYXQgd2hlbiB0aGUKKyAqIHRyYW5zZmVyIGNvbXBsZXRlcyBhbmQgY2F1c2VzIGFuIGludGVycnVwdCwgd2UncmUKKyAqIHJlbWluZGVkIHRvIHRlbGwgdGhlIEFtaWdhIHRvIHNodXQgZG93biBpdHMgZW5kLiBXZSdsbAorICogcG9zdHBvbmUgdGhlIHVwZGF0aW5nIG9mICd0aGlzX3Jlc2lkdWFsJyBhbmQgJ3B0cicKKyAqIHVudGlsIHRoZW4uCisgKi8KKworCWVsc2UgeworI2lmZGVmIFBST0NfU1RBVElTVElDUworCQlob3N0ZGF0YS0+ZG1hX2NudCsrOworI2VuZGlmCisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfRE1BKTsKKwkJd3JpdGVfd2QzM2M5M19jb3VudChyZWdzLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsKTsKKworCQlpZiAoKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfREFUQSkgfHwKKwkJICAgIChob3N0ZGF0YS0+bGV2ZWwyID09IEwyX0JBU0lDICYmIGNtZC0+U0NwLnBoYXNlID09IDApKSB7CisJCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOworCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX1NFTF9BVE5fWEZFUik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQl9IGVsc2UKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9UUkFOU19JTkZPKTsKKworCQlob3N0ZGF0YS0+ZG1hID0gRF9ETUFfUlVOTklORzsKKwl9Cit9CisKK3ZvaWQKK3dkMzNjOTNfaW50cihzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqaG9zdGRhdGEgPQorCSAgICAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCWNvbnN0IHdkMzNjOTNfcmVncyByZWdzID0gaG9zdGRhdGEtPnJlZ3M7CisJc3RydWN0IHNjc2lfY21uZCAqcGF0Y2gsICpjbWQ7CisJdWNoYXIgYXNyLCBzciwgcGhzLCBpZCwgbHVuLCAqdWNwLCBtc2c7CisJdW5zaWduZWQgbG9uZyBsZW5ndGgsIGZsYWdzOworCisJYXNyID0gcmVhZF9hdXhfc3RhdChyZWdzKTsKKwlpZiAoIShhc3IgJiBBU1JfSU5UKSB8fCAoYXNyICYgQVNSX0JTWSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJaG9zdGRhdGEtPmludF9jbnQrKzsKKyNlbmRpZgorCisJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsJLyogYXNzdW1lIHdlJ3JlIGNvbm5lY3RlZCAqLworCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLworCXBocyA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5EX1BIQVNFKTsKKworCURCKERCX0lOVFIsIHByaW50aygieyUwMng6JTAyeC0iLCBhc3IsIHNyKSkKKworLyogQWZ0ZXIgc3RhcnRpbmcgYSBETUEgdHJhbnNmZXIsIHRoZSBuZXh0IGludGVycnVwdAorICogaXMgZ3VhcmFudGVlZCB0byBiZSBpbiByZXNwb25zZSB0byBjb21wbGV0aW9uIG9mCisgKiB0aGUgdHJhbnNmZXIuIFNpbmNlIHRoZSBBbWlnYSBETUEgaGFyZHdhcmUgcnVucyBpbgorICogaW4gYW4gb3Blbi1lbmRlZCBmYXNoaW9uLCBpdCBuZWVkcyB0byBiZSB0b2xkIHdoZW4KKyAqIHRvIHN0b3A7IGRvIHRoYXQgaGVyZSBpZiBEX0RNQV9SVU5OSU5HIGlzIHRydWUuCisgKiBBbHNvLCB3ZSBoYXZlIHRvIHVwZGF0ZSAndGhpc19yZXNpZHVhbCcgYW5kICdwdHInCisgKiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIFRSQU5TRkVSX0NPVU5UIHJlZ2lzdGVyLAorICogaW4gY2FzZSB0aGUgZGV2aWNlIGRlY2lkZWQgdG8gZG8gYW4gaW50ZXJtZWRpYXRlCisgKiBkaXNjb25uZWN0IChhIGRldmljZSBtYXkgZG8gdGhpcyBpZiBpdCBoYXMgdG8gZG8gYQorICogc2Vlaywgb3IganVzdCB0byBiZSBuaWNlIGFuZCBsZXQgb3RoZXIgZGV2aWNlcyBoYXZlCisgKiBzb21lIGJ1cyB0aW1lIGR1cmluZyBsb25nIHRyYW5zZmVycykuIEFmdGVyIGRvaW5nCisgKiB3aGF0ZXZlciBpcyBuZWVkZWQsIHdlIGdvIG9uIGFuZCBzZXJ2aWNlIHRoZSBXRDMzOTMKKyAqIGludGVycnVwdCBub3JtYWxseS4KKyAqLworCSAgICBpZiAoaG9zdGRhdGEtPmRtYSA9PSBEX0RNQV9SVU5OSU5HKSB7CisJCURCKERCX1RSQU5TRkVSLAorCQkgICBwcmludGsoIlslcC8lZDoiLCBjbWQtPlNDcC5wdHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKQorCQkgICAgaG9zdGRhdGEtPmRtYV9zdG9wKGNtZC0+ZGV2aWNlLT5ob3N0LCBjbWQsIDEpOworCQlob3N0ZGF0YS0+ZG1hID0gRF9ETUFfT0ZGOworCQlsZW5ndGggPSBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsOworCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gcmVhZF93ZDMzYzkzX2NvdW50KHJlZ3MpOworCQljbWQtPlNDcC5wdHIgKz0gKGxlbmd0aCAtIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpOworCQlEQihEQl9UUkFOU0ZFUiwKKwkJICAgcHJpbnRrKCIlcC8lZF0iLCBjbWQtPlNDcC5wdHIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpKQorCX0KKworLyogUmVzcG9uZCB0byB0aGUgc3BlY2lmaWMgV0QzMzkzIGludGVycnVwdCAtIHRoZXJlIGFyZSBxdWl0ZSBhIGZldyEgKi8KKwlzd2l0Y2ggKHNyKSB7CisJY2FzZSBDU1JfVElNRU9VVDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJUSU1FT1VUIikpCisKKwkJICAgIGlmIChob3N0ZGF0YS0+c3RhdGUgPT0gU19SVU5OSU5HX0xFVkVMMikKKwkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQllbHNlIHsKKwkJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5zZWxlY3Rpbmc7CS8qIGdldCBhIHZhbGlkIGNtZCAqLworCQkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisJCX0KKworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKworCQkvKiBGcm9tIGVzcC5jOgorCQkgKiBUaGVyZSBpcyBhIHdpbmRvdyBvZiB0aW1lIHdpdGhpbiB0aGUgc2NzaV9kb25lKCkgcGF0aAorCQkgKiBvZiBleGVjdXRpb24gd2hlcmUgaW50ZXJydXB0cyBhcmUgdHVybmVkIGJhY2sgb24gZnVsbAorCQkgKiBibGFzdCBhbmQgbGVmdCB0aGF0IHdheS4gIER1cmluZyB0aGF0IHRpbWUgd2UgY291bGQKKwkJICogcmVjb25uZWN0IHRvIGEgZGlzY29ubmVjdGVkIGNvbW1hbmQsIHRoZW4gd2UnZCBib21iCisJCSAqIG91dCBiZWxvdy4gIFdlIGNvdWxkIGFsc28gZW5kIHVwIGV4ZWN1dGluZyB0d28gY29tbWFuZHMKKwkJICogYXQgX29uY2VfLiAgLi4uanVzdCBzbyB5b3Uga25vdyB3aHkgdGhlIHJlc3RvcmVfZmxhZ3MoKQorCQkgKiBpcyBoZXJlLi4uCisJCSAqLworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisKKy8qIFdlIGFyZSBub3QgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmIHRoZXJlCisgKiBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAqLworCisJCXdkMzNjOTNfZXhlY3V0ZShpbnN0YW5jZSk7CisJCWJyZWFrOworCisvKiBOb3RlOiB0aGlzIGludGVycnVwdCBzaG91bGQgbm90IG9jY3VyIGluIGEgTEVWRUwyIGNvbW1hbmQgKi8KKworCWNhc2UgQ1NSX1NFTEVDVDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJTRUxFQ1QiKSkKKwkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQgPQorCQkgICAgKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPnNlbGVjdGluZzsKKwkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisKKwkJLyogY29uc3RydWN0IGFuIElERU5USUZZIG1lc3NhZ2Ugd2l0aCBjb3JyZWN0IGRpc2Nvbm5lY3QgYml0ICovCisKKwkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9ICgweDgwIHwgMHgwMCB8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQlpZiAoY21kLT5TQ3AucGhhc2UpCisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdIHw9IDB4NDA7CisKKwkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19GSVJTVCkgeworI2lmZGVmIFNZTkNfREVCVUcKKwkJCXByaW50aygiIHNlbmRpbmcgU0RUUiAiKTsKKyNlbmRpZgorCisJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19XQUlUSU5HOworCisvKiBUYWNrIG9uIGEgMm5kIG1lc3NhZ2UgdG8gYXNrIGFib3V0IHN5bmNocm9ub3VzIHRyYW5zZmVycy4gSWYgd2UndmUKKyAqIGJlZW4gYXNrZWQgdG8gZG8gb25seSBhc3luY2hyb25vdXMgdHJhbnNmZXJzIG9uIHRoaXMgZGV2aWNlLCB3ZQorICogcmVxdWVzdCBhIGZpZm8gZGVwdGggb2YgMCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBhc3luYyAtIHNob3VsZAorICogc29sdmUgdGhlIHByb2JsZW1zIHNvbWUgcGVvcGxlIGhhdmUgaGFkIHdpdGggR1ZQJ3MgR3VydSBST00uCisgKi8KKworCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1sxXSA9IEVYVEVOREVEX01FU1NBR0U7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzJdID0gMzsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbM10gPSBFWFRFTkRFRF9TRFRSOworCQkJaWYgKGhvc3RkYXRhLT5ub19zeW5jICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkgeworCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbNF0gPQorCQkJCSAgICBob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgLyA0OworCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbNV0gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzRdID0gT1BUSU1VTV9TWF9QRVIgLyA0OworCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbNV0gPSBPUFRJTVVNX1NYX09GRjsKKwkJCX0KKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSA2OworCQl9IGVsc2UKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19EQVRBX0lOOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX0RBVEFfSU46CisJY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19EQVRBX0lOOgorCQlEQihEQl9JTlRSLAorCQkgICBwcmludGsoIklOLSVkLiVkIiwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCwKKwkJCSAgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkpCisJCSAgICB0cmFuc2Zlcl9ieXRlcyhyZWdzLCBjbWQsIERBVEFfSU5fRElSKTsKKwkJaWYgKGhvc3RkYXRhLT5zdGF0ZSAhPSBTX1JVTk5JTkdfTEVWRUwyKQorCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX0RBVEFfT1VUOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX0RBVEFfT1VUOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfREFUQV9PVVQ6CisJCURCKERCX0lOVFIsCisJCSAgIHByaW50aygiT1VULSVkLiVkIiwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCwKKwkJCSAgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkpCisJCSAgICB0cmFuc2Zlcl9ieXRlcyhyZWdzLCBjbWQsIERBVEFfT1VUX0RJUik7CisJCWlmIChob3N0ZGF0YS0+c3RhdGUgIT0gU19SVU5OSU5HX0xFVkVMMikKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfQ09NTUFORDoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19DT01NQU5EOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfQ09NTUFORDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJDTU5ELSUwMngsJWxkIiwgY21kLT5jbW5kWzBdLCBjbWQtPnBpZCkpCisJCSAgICB0cmFuc2Zlcl9waW8ocmVncywgY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4sIERBVEFfT1VUX0RJUiwKKwkJCQkgaG9zdGRhdGEpOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfU1RBVFVTOgorCWNhc2UgQ1NSX1VORVhQIHwgUEhTX1NUQVRVUzoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX1NUQVRVUzoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJTVEFUVVM9IikpCisJCWNtZC0+U0NwLlN0YXR1cyA9IHJlYWRfMV9ieXRlKHJlZ3MpOworCQlEQihEQl9JTlRSLCBwcmludGsoIiUwMngiLCBjbWQtPlNDcC5TdGF0dXMpKQorCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfQkFTSUMpIHsKKwkJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgaW50ZXJydXB0ICovCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5EX1BIQVNFLCAweDUwKTsKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQl9IGVsc2UgeworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfTUVTU19JTjoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19NRVNTX0lOOgorCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfTUVTU19JTjoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJNU0dfSU49IikpCisKKwkJbXNnID0gcmVhZF8xX2J5dGUocmVncyk7CisJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgaW50ZXJydXB0ICovCisKKwkJaG9zdGRhdGEtPmluY29taW5nX21zZ1tob3N0ZGF0YS0+aW5jb21pbmdfcHRyXSA9IG1zZzsKKwkJaWYgKGhvc3RkYXRhLT5pbmNvbWluZ19tc2dbMF0gPT0gRVhURU5ERURfTUVTU0FHRSkKKwkJCW1zZyA9IEVYVEVOREVEX01FU1NBR0U7CisJCWVsc2UKKwkJCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOworCisJCWNtZC0+U0NwLk1lc3NhZ2UgPSBtc2c7CisJCXN3aXRjaCAobXNnKSB7CisKKwkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJDQ01QLSVsZCIsIGNtZC0+cGlkKSkKKwkJCSAgICB3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1BSRV9DTVBfRElTQzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0FWRV9QT0lOVEVSUzoKKwkJCURCKERCX0lOVFIsIHByaW50aygiU0RQIikpCisJCQkgICAgd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQlicmVhazsKKworCQljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlJEUCIpKQorCQkJICAgIGlmIChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX0JBU0lDKSB7CisJCQkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5EX1BIQVNFLCAweDQ1KTsKKwkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfU0VMX0FUTl9YRkVSKTsKKwkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERJU0NPTk5FQ1Q6CisJCQlEQihEQl9JTlRSLCBwcmludGsoIkRJUyIpKQorCQkJICAgIGNtZC0+ZGV2aWNlLT5kaXNjb25uZWN0ID0gMTsKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUFJFX1RNUF9ESVNDOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKKwkJCURCKERCX0lOVFIsIHByaW50aygiUkVKIikpCisjaWZkZWYgU1lOQ19ERUJVRworCQkJICAgIHByaW50aygiLVJFSi0iKTsKKyNlbmRpZgorCQkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19XQUlUSU5HKQorCQkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9IFNTX1NFVDsKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgorCQkJREIoREJfSU5UUiwgcHJpbnRrKCJFWFQiKSkKKworCQkJICAgIHVjcCA9IGhvc3RkYXRhLT5pbmNvbWluZ19tc2c7CisKKyNpZmRlZiBTWU5DX0RFQlVHCisJCQlwcmludGsoIiUwMngiLCB1Y3BbaG9zdGRhdGEtPmluY29taW5nX3B0cl0pOworI2VuZGlmCisJCQkvKiBJcyB0aGlzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGV4dGVuZGVkIG1lc3NhZ2U/ICovCisKKwkJCWlmICgoaG9zdGRhdGEtPmluY29taW5nX3B0ciA+PSAyKSAmJgorCQkJICAgIChob3N0ZGF0YS0+aW5jb21pbmdfcHRyID09ICh1Y3BbMV0gKyAxKSkpIHsKKworCQkJCXN3aXRjaCAodWNwWzJdKSB7CS8qIHdoYXQncyB0aGUgRVhURU5ERUQgY29kZT8gKi8KKwkJCQljYXNlIEVYVEVOREVEX1NEVFI6CisJCQkJCWlkID0gY2FsY19zeW5jX3hmZXIodWNwWzNdLCB1Y3BbNF0pOworCQkJCQlpZiAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdICE9CisJCQkJCSAgICBTU19XQUlUSU5HKSB7CisKKy8qIEEgZGV2aWNlIGhhcyBzZW50IGFuIHVuc29saWNpdGVkIFNEVFIgbWVzc2FnZTsgcmF0aGVyIHRoYW4gZ28KKyAqIHRocm91Z2ggdGhlIGVmZm9ydCBvZiBkZWNvZGluZyBpdCBhbmQgdGhlbiBmaWd1cmluZyBvdXQgd2hhdAorICogb3VyIHJlcGx5IHNob3VsZCBiZSwgd2UncmUganVzdCBnb25uYSBzYXkgdGhhdCB3ZSBoYXZlIGEKKyAqIHN5bmNocm9ub3VzIGZpZm8gZGVwdGggb2YgMC4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhc3luY2hyb25vdXMKKyAqIHRyYW5zZmVycyAtIG5vdCBpZGVhbCBidXQgc28gbXVjaCBlYXNpZXIuCisgKiBBY3R1YWxseSwgdGhpcyBpcyBPSyBiZWNhdXNlIGl0IGFzc3VyZXMgdXMgdGhhdCBpZiB3ZSBkb24ndAorICogc3BlY2lmaWNhbGx5IGFzayBmb3Igc3luYyB0cmFuc2ZlcnMsIHdlIHdvbid0IGRvIGFueS4KKyAqLworCisJCQkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPQorCQkJCQkJICAgIEVYVEVOREVEX01FU1NBR0U7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzFdID0gMzsKKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMl0gPQorCQkJCQkJICAgIEVYVEVOREVEX1NEVFI7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzNdID0KKwkJCQkJCSAgICBob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgLworCQkJCQkJICAgIDQ7CisJCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzRdID0gMDsKKwkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSA1OworCQkJCQkJaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdID0KKwkJCQkJCSAgICBjYWxjX3N5bmNfeGZlcihob3N0ZGF0YS0+CisJCQkJCQkJCSAgIGRlZmF1bHRfc3hfcGVyCisJCQkJCQkJCSAgIC8gNCwgMCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0gPSBpZDsKKwkJCQkJfQorI2lmZGVmIFNZTkNfREVCVUcKKwkJCQkJcHJpbnRrKCJzeW5jX3hmZXI9JTAyeCIsCisJCQkJCSAgICAgICBob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0pOworI2VuZGlmCisJCQkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9CisJCQkJCSAgICBTU19TRVQ7CisJCQkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsCisJCQkJCQkJICBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVYVEVOREVEX1dEVFI6CisJCQkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9BU1NFUlRfQVROKTsJLyogd2FudCBNRVNTX09VVCAqLworCQkJCQlwcmludGsoInNlbmRpbmcgV0RUUiAiKTsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9CisJCQkJCSAgICBFWFRFTkRFRF9NRVNTQUdFOworCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzFdID0gMjsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1syXSA9CisJCQkJCSAgICBFWFRFTkRFRF9XRFRSOworCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzNdID0gMDsJLyogOCBiaXQgdHJhbnNmZXIgd2lkdGggKi8KKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDQ7CisJCQkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsCisJCQkJCQkJICBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIlJlamVjdGluZyBVbmtub3duIEV4dGVuZGVkIE1lc3NhZ2UoJTAyeCkuICIsCisJCQkJCSAgICAgdWNwWzJdKTsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9CisJCQkJCSAgICBNRVNTQUdFX1JFSkVDVDsKKwkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDE7CisJCQkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsCisJCQkJCQkJICBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7CisJCQl9CisKKwkJCS8qIFdlIG5lZWQgdG8gcmVhZCBtb3JlIE1FU1NfSU4gYnl0ZXMgZm9yIHRoZSBleHRlbmRlZCBtZXNzYWdlICovCisKKwkJCWVsc2UgeworCQkJCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIrKzsKKwkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJSZWplY3RpbmcgVW5rbm93biBNZXNzYWdlKCUwMngpICIsIG1zZyk7CisJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfQVNTRVJUX0FUTik7CS8qIHdhbnQgTUVTU19PVVQgKi8KKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAxOworCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX05FR0FURV9BQ0spOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKy8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHdpbGwgb2NjdXIgb25seSBhZnRlciBhIExFVkVMMiBjb21tYW5kICovCisKKwljYXNlIENTUl9TRUxfWEZFUl9ET05FOgorCisvKiBNYWtlIHN1cmUgdGhhdCByZXNlbGVjdGlvbiBpcyBlbmFibGVkIGF0IHRoaXMgcG9pbnQgLSBpdCBtYXkKKyAqIGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGZvciB0aGUgY29tbWFuZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICovCisKKwkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9TT1VSQ0VfSUQsIFNSQ0lEX0VSKTsKKwkJaWYgKHBocyA9PSAweDYwKSB7CisJCQlEQihEQl9JTlRSLCBwcmludGsoIlNYLURPTkUtJWxkIiwgY21kLT5waWQpKQorCQkJICAgIGNtZC0+U0NwLk1lc3NhZ2UgPSBDT01NQU5EX0NPTVBMRVRFOworCQkJbHVuID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1RBUkdFVF9MVU4pOworCQkJREIoREJfSU5UUiwgcHJpbnRrKCI6JWQuJWQiLCBjbWQtPlNDcC5TdGF0dXMsIGx1bikpCisJCQkgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCQlpZiAoY21kLT5TQ3AuU3RhdHVzID09IElMTEVHQUxfU1RBVFVTX0JZVEUpCisJCQkJY21kLT5TQ3AuU3RhdHVzID0gbHVuOworCQkJaWYgKGNtZC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFCisJCQkgICAgJiYgY21kLT5TQ3AuU3RhdHVzICE9IEdPT0QpCisJCQkJY21kLT5yZXN1bHQgPQorCQkJCSAgICAoY21kLT4KKwkJCQkgICAgIHJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOworCQkJZWxzZQorCQkJCWNtZC0+cmVzdWx0ID0KKwkJCQkgICAgY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7CisJCQljbWQtPnNjc2lfZG9uZShjbWQpOworCisvKiBXZSBhcmUgbm8gbG9uZ2VyICBjb25uZWN0ZWQgdG8gYSB0YXJnZXQgLSBjaGVjayB0byBzZWUgaWYKKyAqIHRoZXJlIGFyZSBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQkJd2QzM2M5M19leGVjdXRlKGluc3RhbmNlKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aworCQkJICAgICgiJTAyeDolMDJ4OiUwMngtJWxkOiBVbmtub3duIFNFTF9YRkVSX0RPTkUgcGhhc2UhIS0tLSIsCisJCQkgICAgIGFzciwgc3IsIHBocywgY21kLT5waWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlicmVhazsKKworLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgd2lsbCBvY2N1ciBvbmx5IGFmdGVyIGEgTEVWRUwyIGNvbW1hbmQgKi8KKworCWNhc2UgQ1NSX1NEUDoKKwkJREIoREJfSU5UUiwgcHJpbnRrKCJTRFAiKSkKKwkJICAgIGhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfQ09NTUFORF9QSEFTRSwgMHg0MSk7CisJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19NRVNTX09VVDoKKwljYXNlIENTUl9VTkVYUCB8IFBIU19NRVNTX09VVDoKKwljYXNlIENTUl9TUlZfUkVRIHwgUEhTX01FU1NfT1VUOgorCQlEQihEQl9JTlRSLCBwcmludGsoIk1TR19PVVQ9IikpCisKKy8qIFRvIGdldCBoZXJlLCB3ZSd2ZSBwcm9iYWJseSByZXF1ZXN0ZWQgTUVTU0FHRV9PVVQgYW5kIGhhdmUKKyAqIGFscmVhZHkgcHV0IHRoZSBjb3JyZWN0IGJ5dGVzIGluIG91dGdvaW5nX21zZ1tdIGFuZCBmaWxsZWQKKyAqIGluIG91dGdvaW5nX2xlbi4gV2Ugc2ltcGx5IHNlbmQgdGhlbSBvdXQgdG8gdGhlIFNDU0kgYnVzLgorICogU29tZXRpbWVzIHdlIGdldCBNRVNTQUdFX09VVCBwaGFzZSB3aGVuIHdlJ3JlIG5vdCBleHBlY3RpbmcKKyAqIGl0IC0gbGlrZSB3aGVuIG91ciBTRFRSIG1lc3NhZ2UgaXMgcmVqZWN0ZWQgYnkgYSB0YXJnZXQuIFNvbWUKKyAqIHRhcmdldHMgc2VuZCB0aGUgUkVKRUNUIGJlZm9yZSByZWNlaXZpbmcgYWxsIG9mIHRoZSBleHRlbmRlZAorICogbWVzc2FnZSwgYW5kIHRoZW4gc2VlbSB0byBnbyBiYWNrIHRvIE1FU1NBR0VfT1VUIGZvciBhIGJ5dGUKKyAqIG9yIHR3by4gTm90IHN1cmUgd2h5LCBvciBpZiBJJ20gZG9pbmcgc29tZXRoaW5nIHdyb25nIHRvCisgKiBjYXVzZSB0aGlzIHRvIGhhcHBlbi4gUmVnYXJkbGVzcywgaXQgc2VlbXMgdGhhdCBzZW5kaW5nCisgKiBOT1AgbWVzc2FnZXMgaW4gdGhlc2Ugc2l0dWF0aW9ucyByZXN1bHRzIGluIG5vIGhhcm0gYW5kCisgKiBtYWtlcyBldmVyeW9uZSBoYXBweS4KKyAqLworCQkgICAgaWYgKGhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPT0gMCkgeworCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDE7CisJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0gTk9QOworCQl9CisJCXRyYW5zZmVyX3BpbyhyZWdzLCBob3N0ZGF0YS0+b3V0Z29pbmdfbXNnLAorCQkJICAgICBob3N0ZGF0YS0+b3V0Z29pbmdfbGVuLCBEQVRBX09VVF9ESVIsIGhvc3RkYXRhKTsKKwkJREIoREJfSU5UUiwgcHJpbnRrKCIlMDJ4IiwgaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSkpCisJCSAgICBob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMDsKKwkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBDU1JfVU5FWFBfRElTQzoKKworLyogSSB0aGluayBJJ3ZlIHNlZW4gdGhpcyBhZnRlciBhIHJlcXVlc3Qtc2Vuc2UgdGhhdCB3YXMgaW4gcmVzcG9uc2UKKyAqIHRvIGFuIGVycm9yIGNvbmRpdGlvbiwgYnV0IG5vdCBzdXJlLiBXZSBjZXJ0YWlubHkgbmVlZCB0byBkbworICogc29tZXRoaW5nIHdoZW4gd2UgZ2V0IHRoaXMgaW50ZXJydXB0IC0gdGhlIHF1ZXN0aW9uIGlzICd3aGF0PycuCisgKiBMZXQncyB0aGluayBwb3NpdGl2ZWx5LCBhbmQgYXNzdW1lIHNvbWUgY29tbWFuZCBoYXMgZmluaXNoZWQKKyAqIGluIGEgbGVnYWwgbWFubmVyIChsaWtlIGEgY29tbWFuZCB0aGF0IHByb3Zva2VzIGEgcmVxdWVzdC1zZW5zZSksCisgKiBzbyB3ZSB0cmVhdCBpdCBhcyBhIG5vcm1hbCBjb21tYW5kLWNvbXBsZXRlLWRpc2Nvbm5lY3QuCisgKi8KKworLyogTWFrZSBzdXJlIHRoYXQgcmVzZWxlY3Rpb24gaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50IC0gaXQgbWF5CisgKiBoYXZlIGJlZW4gdHVybmVkIG9mZiBmb3IgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGNvbXBsZXRlZC4KKyAqLworCisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfU09VUkNFX0lELCBTUkNJRF9FUik7CisJCWlmIChjbWQgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIgLSBBbHJlYWR5IGRpc2Nvbm5lY3RlZCEgIik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlEQihEQl9JTlRSLCBwcmludGsoIlVORVhQX0RJU0MtJWxkIiwgY21kLT5waWQpKQorCQkgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQlpZiAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgJiYgY21kLT5TQ3AuU3RhdHVzICE9IEdPT0QpCisJCQljbWQtPnJlc3VsdCA9CisJCQkgICAgKGNtZC0+cmVzdWx0ICYgMHgwMGZmZmYpIHwgKERJRF9FUlJPUiA8PCAxNik7CisJCWVsc2UKKwkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisKKy8qIFdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmCisgKiB0aGVyZSBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAqLworCQkvKiBsb29rIGFib3ZlIGZvciBjb21tZW50cyBvbiBzY3NpX2RvbmUoKSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQl3ZDMzYzkzX2V4ZWN1dGUoaW5zdGFuY2UpOworCQlicmVhazsKKworCWNhc2UgQ1NSX0RJU0M6CisKKy8qIE1ha2Ugc3VyZSB0aGF0IHJlc2VsZWN0aW9uIGlzIGVuYWJsZWQgYXQgdGhpcyBwb2ludCAtIGl0IG1heQorICogaGF2ZSBiZWVuIHR1cm5lZCBvZmYgZm9yIHRoZSBjb21tYW5kIHRoYXQganVzdCBjb21wbGV0ZWQuCisgKi8KKworCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1NPVVJDRV9JRCwgU1JDSURfRVIpOworCQlEQihEQl9JTlRSLCBwcmludGsoIkRJU0MtJWxkIiwgY21kLT5waWQpKQorCQkgICAgaWYgKGNtZCA9PSBOVUxMKSB7CisJCQlwcmludGsoIiAtIEFscmVhZHkgZGlzY29ubmVjdGVkISAiKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCX0KKwkJc3dpdGNoIChob3N0ZGF0YS0+c3RhdGUpIHsKKwkJY2FzZSBTX1BSRV9DTVBfRElTQzoKKwkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCQkJREIoREJfSU5UUiwgcHJpbnRrKCI6JWQiLCBjbWQtPlNDcC5TdGF0dXMpKQorCQkJICAgIGlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRQorCQkJCSYmIGNtZC0+U0NwLlN0YXR1cyAhPSBHT09EKQorCQkJCWNtZC0+cmVzdWx0ID0KKwkJCQkgICAgKGNtZC0+CisJCQkJICAgICByZXN1bHQgJiAweDAwZmZmZikgfCAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCWVsc2UKKwkJCQljbWQtPnJlc3VsdCA9CisJCQkJICAgIGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOworCQkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNfUFJFX1RNUF9ESVNDOgorCQljYXNlIFNfUlVOTklOR19MRVZFTDI6CisJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9ROworCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gY21kOworCQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOworCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJCQlob3N0ZGF0YS0+ZGlzY19kb25lX2NudFtjbWQtPmRldmljZS0+aWRdKys7CisjZW5kaWYKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIioqKiBVbmV4cGVjdGVkIERJU0NPTk5FQ1QgaW50ZXJydXB0ISAqKioiKTsKKwkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCX0KKworLyogV2UgYXJlIG5vIGxvbmdlciBjb25uZWN0ZWQgdG8gYSB0YXJnZXQgLSBjaGVjayB0byBzZWUgaWYKKyAqIHRoZXJlIGFyZSBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RkYXRhLT5sb2NrLCBmbGFncyk7CisJCXdkMzNjOTNfZXhlY3V0ZShpbnN0YW5jZSk7CisJCWJyZWFrOworCisJY2FzZSBDU1JfUkVTRUxfQU06CisJY2FzZSBDU1JfUkVTRUw6CisJCURCKERCX0lOVFIsIHByaW50aygiUkVTRUwlcyIsIHNyID09IENTUl9SRVNFTF9BTSA/ICJfQU0iIDogIiIpKQorCisJCSAgICAvKiBPbGQgY2hpcHMgKHByZSAtQSA/Pz8pIGRvbid0IGhhdmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIHdpbGwKKwkJICAgICAqIGdlbmVyYXRlIENTUl9SRVNFTC4gIEluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGV4dHJhY3QgdGhlIExVTiB0aGUKKwkJICAgICAqIGhhcmQgd2F5IChzZWUgYmVsb3cpLgorCQkgICAgICogRmlyc3Qgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhpcyByZXNlbGVjdGlvbiBkaWRuJ3QKKwkJICAgICAqIGhhcHBlbiBkdXJpbmcgQXJiaXRyYXRpb24vU2VsZWN0aW9uIG9mIHNvbWUgb3RoZXIgZGV2aWNlLgorCQkgICAgICogSWYgeWVzLCBwdXQgbG9zaW5nIGNvbW1hbmQgYmFjayBvbiB0b3Agb2YgaW5wdXRfUS4KKwkJICAgICAqLworCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPD0gTDJfTk9ORSkgeworCisJCQlpZiAoaG9zdGRhdGEtPnNlbGVjdGluZykgeworCQkJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5zZWxlY3Rpbmc7CisJCQkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7CisJCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7CisJCQkJY21kLT5ob3N0X3NjcmliYmxlID0KKwkJCQkgICAgKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQkJCWhvc3RkYXRhLT5pbnB1dF9RID0gY21kOworCQkJfQorCQl9CisKKwkJZWxzZSB7CisKKwkJCWlmIChjbWQpIHsKKwkJCQlpZiAocGhzID09IDB4MDApIHsKKwkJCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPQorCQkJCQkgICAgfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOworCQkJCQljbWQtPmhvc3Rfc2NyaWJibGUgPQorCQkJCQkgICAgKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROworCQkJCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgiLS0tJTAyeDolMDJ4OiUwMngtVFJPVUJMRTogSW50cnVzaXZlIFJlU2VsZWN0IS0tLSIsCisJCQkJCSAgICAgYXNyLCBzciwgcGhzKTsKKwkJCQkJd2hpbGUgKDEpCisJCQkJCQlwcmludGsoIlxyIik7CisJCQkJfQorCQkJfQorCisJCX0KKworCQkvKiBPSyAtIGZpbmQgb3V0IHdoaWNoIGRldmljZSByZXNlbGVjdGVkIHVzLiAqLworCisJCWlkID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NPVVJDRV9JRCk7CisJCWlkICY9IFNSQ0lEX01BU0s7CisKKwkJLyogYW5kIGV4dHJhY3QgdGhlIGx1biBmcm9tIHRoZSBJRCBtZXNzYWdlLiAoTm90ZSB0aGF0IHdlIGRvbid0CisJCSAqIGJvdGhlciB0byBjaGVjayBmb3IgYSB2YWxpZCBtZXNzYWdlIGhlcmUgLSBJIGd1ZXNzIHRoaXMgaXMKKwkJICogbm90IHRoZSByaWdodCB3YXkgdG8gZ28sIGJ1dC4uLikKKwkJICovCisKKwkJaWYgKHNyID09IENTUl9SRVNFTF9BTSkgeworCQkJbHVuID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX0RBVEEpOworCQkJaWYgKGhvc3RkYXRhLT5sZXZlbDIgPCBMMl9SRVNFTEVDVCkKKwkJCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfTkVHQVRFX0FDSyk7CisJCQlsdW4gJj0gNzsKKwkJfSBlbHNlIHsKKwkJCS8qIE9sZCBjaGlwOyB3YWl0IGZvciBtc2dpbiBwaGFzZSB0byBwaWNrIHVwIHRoZSBMVU4uICovCisJCQlmb3IgKGx1biA9IDI1NTsgbHVuOyBsdW4tLSkgeworCQkJCWlmICgoYXNyID0gcmVhZF9hdXhfc3RhdChyZWdzKSkgJiBBU1JfSU5UKQorCQkJCQlicmVhazsKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCQkJaWYgKCEoYXNyICYgQVNSX0lOVCkpIHsKKwkJCQlwcmludGsKKwkJCQkgICAgKCJ3ZDMzYzkzOiBSZXNlbGVjdGVkIHdpdGhvdXQgSURFTlRJRllcbiIpOworCQkJCWx1biA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qIFZlcmlmeSB0aGlzIGlzIGEgY2hhbmdlIHRvIE1TR19JTiBhbmQgcmVhZCB0aGUgbWVzc2FnZSAqLworCQkJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsKKwkJCQlpZiAoc3IgPT0gKENTUl9BQk9SVCB8IFBIU19NRVNTX0lOKSB8fAorCQkJCSAgICBzciA9PSAoQ1NSX1VORVhQIHwgUEhTX01FU1NfSU4pIHx8CisJCQkJICAgIHNyID09IChDU1JfU1JWX1JFUSB8IFBIU19NRVNTX0lOKSkgeworCQkJCQkvKiBHb3QgTVNHX0lOLCBncmFiIHRhcmdldCBMVU4gKi8KKwkJCQkJbHVuID0gcmVhZF8xX2J5dGUocmVncyk7CisJCQkJCS8qIE5vdyB3ZSBleHBlY3QgYSAncGF1c2VkIHdpdGggQUNLIGFzc2VydGVkJyBpbnQuLiAqLworCQkJCQlhc3IgPSByZWFkX2F1eF9zdGF0KHJlZ3MpOworCQkJCQlpZiAoIShhc3IgJiBBU1JfSU5UKSkgeworCQkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJCWFzciA9IHJlYWRfYXV4X3N0YXQocmVncyk7CisJCQkJCQlpZiAoIShhc3IgJiBBU1JfSU5UKSkKKwkJCQkJCQlwcmludGsKKwkJCQkJCQkgICAgKCJ3ZDMzYzkzOiBObyBpbnQgYWZ0ZXIgTFVOIG9uIFJFU0VMICglMDJ4KVxuIiwKKwkJCQkJCQkgICAgIGFzcik7CisJCQkJCX0KKwkJCQkJc3IgPSByZWFkX3dkMzNjOTMocmVncywgV0RfU0NTSV9TVEFUVVMpOworCQkJCQlpZiAoc3IgIT0gQ1NSX01TR0lOKQorCQkJCQkJcHJpbnRrCisJCQkJCQkgICAgKCJ3ZDMzYzkzOiBOb3QgcGF1c2VkIHdpdGggQUNLIG9uIFJFU0VMICglMDJ4KVxuIiwKKwkJCQkJCSAgICAgc3IpOworCQkJCQlsdW4gJj0gNzsKKwkJCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywKKwkJCQkJCQkgIFdEX0NNRF9ORUdBVEVfQUNLKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgid2QzM2M5MzogTm90IE1TR19JTiBvbiByZXNlbGVjdCAoJTAyeClcbiIsCisJCQkJCSAgICAgc3IpOworCQkJCQlsdW4gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIE5vdyB3ZSBsb29rIGZvciB0aGUgY29tbWFuZCB0aGF0J3MgcmVjb25uZWN0aW5nLiAqLworCisJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUTsKKwkJcGF0Y2ggPSBOVUxMOworCQl3aGlsZSAoY21kKSB7CisJCQlpZiAoaWQgPT0gY21kLT5kZXZpY2UtPmlkICYmIGx1biA9PSBjbWQtPmRldmljZS0+bHVuKQorCQkJCWJyZWFrOworCQkJcGF0Y2ggPSBjbWQ7CisJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCX0KKworCQkvKiBIbW0uIENvdWxkbid0IGZpbmQgYSB2YWxpZCBjb21tYW5kLi4uLiBXaGF0IHRvIGRvPyAqLworCisJCWlmICghY21kKSB7CisJCQlwcmludGsKKwkJCSAgICAoIi0tLVRST1VCTEU6IHRhcmdldCAlZC4lZCBub3QgaW4gZGlzY29ubmVjdCBxdWV1ZS0tLSIsCisJCQkgICAgIGlkLCBsdW4pOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIE9rLCBmb3VuZCB0aGUgY29tbWFuZCAtIG5vdyBzdGFydCBpdCB1cCBhZ2Fpbi4gKi8KKworCQlpZiAocGF0Y2gpCisJCQlwYXRjaC0+aG9zdF9zY3JpYmJsZSA9IGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJZWxzZQorCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0KKwkJCSAgICAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CisJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7CisKKwkJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCAnaW5pdGlhbGl6ZV9TQ3AoKScgb3IgJ2hvc3RkYXRhLT5idXN5W10nCisJCSAqIGJlY2F1c2UgdGhlc2UgdGhpbmdzIGFyZSBwcmVzZXJ2ZWQgb3ZlciBhIGRpc2Nvbm5lY3QuCisJCSAqIEJ1dCB3ZSBETyBuZWVkIHRvIGZpeCB0aGUgRFBEIGJpdCBzbyBpdCdzIGNvcnJlY3QgZm9yIHRoaXMgY29tbWFuZC4KKwkJICovCisKKwkJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfREVTVElOQVRJT05fSUQsIGNtZC0+ZGV2aWNlLT5pZCk7CisJCWVsc2UKKwkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfREVTVElOQVRJT05fSUQsCisJCQkJICAgICAgY21kLT5kZXZpY2UtPmlkIHwgRFNUSURfRFBEKTsKKwkJaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfUkVTRUxFQ1QpIHsKKwkJCXdyaXRlX3dkMzNjOTNfY291bnQocmVncywgMCk7CS8qIHdlIHdhbnQgYSBEQVRBX1BIQVNFIGludGVycnVwdCAqLworCQkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5EX1BIQVNFLCAweDQ1KTsKKwkJCXdyaXRlX3dkMzNjOTNfY21kKHJlZ3MsIFdEX0NNRF9TRUxfQVROX1hGRVIpOworCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKKwkJfSBlbHNlCisJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKKworCQlEQihEQl9JTlRSLCBwcmludGsoIi0lbGQiLCBjbWQtPnBpZCkpCisJCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0ZGF0YS0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiLS1VTktOT1dOIElOVEVSUlVQVDolMDJ4OiUwMng6JTAyeC0tIiwgYXNyLCBzciwgcGhzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdGRhdGEtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlEQihEQl9JTlRSLCBwcmludGsoIn0gIikpCisKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X3dkMzNjOTMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCit7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhID0KKwkgICAgKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKwljb25zdCB3ZDMzYzkzX3JlZ3MgcmVncyA9IGhvc3RkYXRhLT5yZWdzOworCXVjaGFyIHNyOworCisjaWZkZWYgQ09ORklHX1NHSV9JUDIyCisJeworCQlpbnQgYnVzeWNvdW50ID0gMDsKKwkJZXh0ZXJuIHZvaWQgc2dpd2Q5M19yZXNldCh1bnNpZ25lZCBsb25nKTsKKwkJLyogd2FpdCAndGlsIHRoZSBjaGlwIGdldHMgc29tZSB0aW1lIGZvciB1cyAqLworCQl3aGlsZSAoKHJlYWRfYXV4X3N0YXQocmVncykgJiBBU1JfQlNZKSAmJiBidXN5Y291bnQrKyA8IDEwMCkKKwkJCXVkZWxheSAoMTApOworCS8qCisgCSAqIHRoZXJlIGFyZSBzY3NpIGRldmljZXMgb3V0IHRoZXJlLCB3aGljaCBtYW5hZ2UgdG8gbG9jayB1cAorCSAqIHRoZSB3ZDMzYzkzIGluIGEgYnVzeSBjb25kaXRpb24uIEluIHRoaXMgc3RhdGUgaXQgd29uJ3QKKwkgKiBhY2NlcHQgdGhlIHJlc2V0IGNvbW1hbmQuIFRoZSBvbmx5IHdheSB0byBzb2x2ZSB0aGlzIGlzIHRvCisgCSAqIGdpdmUgdGhlIGNoaXAgYSBoYXJkd2FyZSByZXNldCAoaWYgcG9zc2libGUpLiBUaGUgY29kZSBiZWxvdworCSAqIGRvZXMgdGhpcyBmb3IgdGhlIFNHSSBJbmR5LCB3aGVyZSB0aGlzIGlzIHBvc3NpYmxlCisJICovCisJLyogc3RpbGwgYnVzeSA/ICovCisJaWYgKHJlYWRfYXV4X3N0YXQocmVncykgJiBBU1JfQlNZKQorCQlzZ2l3ZDkzX3Jlc2V0KGluc3RhbmNlLT5iYXNlKTsgLyogeWVhaCwgZ2l2ZSBpdCB0aGUgaGFyZCBvbmUgKi8KKwl9CisjZW5kaWYKKworCXdyaXRlX3dkMzNjOTMocmVncywgV0RfT1dOX0lELCBPV05JRF9FQUYgfCBPV05JRF9SQUYgfAorCQkgICAgICBpbnN0YW5jZS0+dGhpc19pZCB8IGhvc3RkYXRhLT5jbG9ja19mcmVxKTsKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7CisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiwKKwkJICAgICAgY2FsY19zeW5jX3hmZXIoaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8gNCwKKwkJCQkgICAgIERFRkFVTFRfU1hfT0ZGKSk7CisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT01NQU5ELCBXRF9DTURfUkVTRVQpOworCisKKyNpZmRlZiBDT05GSUdfTVZNRTE0N19TQ1NJCisJdWRlbGF5KDI1KTsJCS8qIFRoZSBvbGQgd2QzM2M5MyBvbiBNVk1FMTQ3IG5lZWRzIHRoaXMsIGF0IGxlYXN0ICovCisjZW5kaWYKKworCXdoaWxlICghKHJlYWRfYXV4X3N0YXQocmVncykgJiBBU1JfSU5UKSkKKwkJOworCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsKKworCWhvc3RkYXRhLT5taWNyb2NvZGUgPSByZWFkX3dkMzNjOTMocmVncywgV0RfQ0RCXzEpOworCWlmIChzciA9PSAweDAwKQorCQlob3N0ZGF0YS0+Y2hpcCA9IENfV0QzM0M5MzsKKwllbHNlIGlmIChzciA9PSAweDAxKSB7CisJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfUVVFVUVfVEFHLCAweGE1KTsJLyogYW55IHJhbmRvbSBudW1iZXIgKi8KKwkJc3IgPSByZWFkX3dkMzNjOTMocmVncywgV0RfUVVFVUVfVEFHKTsKKwkJaWYgKHNyID09IDB4YTUpIHsKKwkJCWhvc3RkYXRhLT5jaGlwID0gQ19XRDMzQzkzQjsKKwkJCXdyaXRlX3dkMzNjOTMocmVncywgV0RfUVVFVUVfVEFHLCAwKTsKKwkJfSBlbHNlCisJCQlob3N0ZGF0YS0+Y2hpcCA9IENfV0QzM0M5M0E7CisJfSBlbHNlCisJCWhvc3RkYXRhLT5jaGlwID0gQ19VTktOT1dOX0NISVA7CisKKwl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX1RJTUVPVVRfUEVSSU9ELCBUSU1FT1VUX1BFUklPRF9WQUxVRSk7CisJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOworfQorCitpbnQKK3dkMzNjOTNfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhOworCWludCBpOworCisJaW5zdGFuY2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCWhvc3RkYXRhID0gKHN0cnVjdCBXRDMzQzkzX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKKworCXByaW50aygic2NzaSVkOiByZXNldC4gIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOworCWRpc2FibGVfaXJxKGluc3RhbmNlLT5pcnEpOworCisJaG9zdGRhdGEtPmRtYV9zdG9wKGluc3RhbmNlLCBOVUxMLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKwkJaG9zdGRhdGEtPnN5bmNfeGZlcltpXSA9CisJCSAgICBjYWxjX3N5bmNfeGZlcihERUZBVUxUX1NYX1BFUiAvIDQsIERFRkFVTFRfU1hfT0ZGKTsKKwkJaG9zdGRhdGEtPnN5bmNfc3RhdFtpXSA9IFNTX1VOU0VUOwkvKiB1c2luZyBkZWZhdWx0IHN5bmMgdmFsdWVzICovCisJfQorCWhvc3RkYXRhLT5pbnB1dF9RID0gTlVMTDsKKwlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKKwlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKKwlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1EgPSBOVUxMOworCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJaG9zdGRhdGEtPmRtYSA9IERfRE1BX09GRjsKKwlob3N0ZGF0YS0+aW5jb21pbmdfcHRyID0gMDsKKwlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMDsKKworCXJlc2V0X3dkMzNjOTMoaW5zdGFuY2UpOworCVNDcG50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJZW5hYmxlX2lycShpbnN0YW5jZS0+aXJxKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworaW50Cit3ZDMzYzkzX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7CisJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKmhvc3RkYXRhOworCXdkMzNjOTNfcmVncyByZWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKnRtcCwgKnByZXY7CisKKwlkaXNhYmxlX2lycShjbWQtPmRldmljZS0+aG9zdC0+aXJxKTsKKworCWluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7CisJaG9zdGRhdGEgPSAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOworCXJlZ3MgPSBob3N0ZGF0YS0+cmVnczsKKworLyoKKyAqIENhc2UgMSA6IElmIHRoZSBjb21tYW5kIGhhc24ndCBiZWVuIGlzc3VlZCB5ZXQsIHdlIHNpbXBseSByZW1vdmUgaXQKKyAqICAgICBmcm9tIHRoZSBpbnB1dF9RLgorICovCisKKwl0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsKKwlwcmV2ID0gMDsKKwl3aGlsZSAodG1wKSB7CisJCWlmICh0bXAgPT0gY21kKSB7CisJCQlpZiAocHJldikKKwkJCQlwcmV2LT5ob3N0X3NjcmliYmxlID0gY21kLT5ob3N0X3NjcmliYmxlOworCQkJZWxzZQorCQkJCWhvc3RkYXRhLT5pbnB1dF9RID0KKwkJCQkgICAgKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQkJY21kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJCWNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkJcHJpbnRrCisJCQkgICAgKCJzY3NpJWQ6IEFib3J0IC0gcmVtb3ZpbmcgY29tbWFuZCAlbGQgZnJvbSBpbnB1dF9RLiAiLAorCQkJICAgICBpbnN0YW5jZS0+aG9zdF9ubywgY21kLT5waWQpOworCQkJZW5hYmxlX2lycShjbWQtPmRldmljZS0+aG9zdC0+aXJxKTsKKwkJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCQlwcmV2ID0gdG1wOworCQl0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGU7CisJfQorCisvKgorICogQ2FzZSAyIDogSWYgdGhlIGNvbW1hbmQgaXMgY29ubmVjdGVkLCB3ZSdyZSBnb2luZyB0byBmYWlsIHRoZSBhYm9ydAorICogICAgIGFuZCBsZXQgdGhlIGhpZ2ggbGV2ZWwgU0NTSSBkcml2ZXIgcmV0cnkgYXQgYSBsYXRlciB0aW1lIG9yCisgKiAgICAgaXNzdWUgYSByZXNldC4KKyAqCisgKiAgICAgVGltZW91dHMsIGFuZCB0aGVyZWZvcmUgYWJvcnRlZCBjb21tYW5kcywgd2lsbCBiZSBoaWdobHkgdW5saWtlbHkKKyAqICAgICBhbmQgaGFuZGxpbmcgdGhlbSBjbGVhbmx5IGluIHRoaXMgc2l0dWF0aW9uIHdvdWxkIG1ha2UgdGhlIGNvbW1vbgorICogICAgIGNhc2Ugb2Ygbm9yZXNldHMgbGVzcyBlZmZpY2llbnQsIGFuZCB3b3VsZCBwb2xsdXRlIG91ciBjb2RlLiAgU28sCisgKiAgICAgd2UgZmFpbC4KKyAqLworCisJaWYgKGhvc3RkYXRhLT5jb25uZWN0ZWQgPT0gY21kKSB7CisJCXVjaGFyIHNyLCBhc3I7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCQlwcmludGsoInNjc2klZDogQWJvcnRpbmcgY29ubmVjdGVkIGNvbW1hbmQgJWxkIC0gIiwKKwkJICAgICAgIGluc3RhbmNlLT5ob3N0X25vLCBjbWQtPnBpZCk7CisKKwkJcHJpbnRrKCJzdG9wcGluZyBETUEgLSAiKTsKKwkJaWYgKGhvc3RkYXRhLT5kbWEgPT0gRF9ETUFfUlVOTklORykgeworCQkJaG9zdGRhdGEtPmRtYV9zdG9wKGluc3RhbmNlLCBjbWQsIDApOworCQkJaG9zdGRhdGEtPmRtYSA9IERfRE1BX09GRjsKKwkJfQorCisJCXByaW50aygic2VuZGluZyB3ZDMzYzkzIEFCT1JUIGNvbW1hbmQgLSAiKTsKKwkJd3JpdGVfd2QzM2M5MyhyZWdzLCBXRF9DT05UUk9MLAorCQkJICAgICAgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKKwkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX0FCT1JUKTsKKworLyogTm93IHdlIGhhdmUgdG8gYXR0ZW1wdCB0byBmbHVzaCBvdXQgdGhlIEZJRk8uLi4gKi8KKworCQlwcmludGsoImZsdXNoaW5nIGZpZm8gLSAiKTsKKwkJdGltZW91dCA9IDEwMDAwMDA7CisJCWRvIHsKKwkJCWFzciA9IHJlYWRfYXV4X3N0YXQocmVncyk7CisJCQlpZiAoYXNyICYgQVNSX0RCUikKKwkJCQlyZWFkX3dkMzNjOTMocmVncywgV0RfREFUQSk7CisJCX0gd2hpbGUgKCEoYXNyICYgQVNSX0lOVCkgJiYgdGltZW91dC0tID4gMCk7CisJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsKKwkJcHJpbnRrCisJCSAgICAoImFzcj0lMDJ4LCBzcj0lMDJ4LCAlbGQgYnl0ZXMgdW4tdHJhbnNmZXJyZWQgKHRpbWVvdXQ9JWxkKSAtICIsCisJCSAgICAgYXNyLCBzciwgcmVhZF93ZDMzYzkzX2NvdW50KHJlZ3MpLCB0aW1lb3V0KTsKKworCQkvKgorCQkgKiBBYm9ydCBjb21tYW5kIHByb2Nlc3NlZC4KKwkJICogU3RpbGwgY29ubmVjdGVkLgorCQkgKiBXZSBtdXN0IGRpc2Nvbm5lY3QuCisJCSAqLworCisJCXByaW50aygic2VuZGluZyB3ZDMzYzkzIERJU0NPTk5FQ1QgY29tbWFuZCAtICIpOworCQl3cml0ZV93ZDMzYzkzX2NtZChyZWdzLCBXRF9DTURfRElTQ09OTkVDVCk7CisKKwkJdGltZW91dCA9IDEwMDAwMDA7CisJCWFzciA9IHJlYWRfYXV4X3N0YXQocmVncyk7CisJCXdoaWxlICgoYXNyICYgQVNSX0NJUCkgJiYgdGltZW91dC0tID4gMCkKKwkJCWFzciA9IHJlYWRfYXV4X3N0YXQocmVncyk7CisJCXNyID0gcmVhZF93ZDMzYzkzKHJlZ3MsIFdEX1NDU0lfU1RBVFVTKTsKKwkJcHJpbnRrKCJhc3I9JTAyeCwgc3I9JTAyeC4iLCBhc3IsIHNyKTsKKworCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKKwkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7CisJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7CisJCWNtZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCisvKiAgICAgIHN0aSgpOyovCisJCXdkMzNjOTNfZXhlY3V0ZShpbnN0YW5jZSk7CisKKwkJZW5hYmxlX2lycShjbWQtPmRldmljZS0+aG9zdC0+aXJxKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisvKgorICogQ2FzZSAzOiBJZiB0aGUgY29tbWFuZCBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGVkIGZyb20gdGhlIGJ1cywKKyAqIHdlJ3JlIG5vdCBnb2luZyB0byBleHBlbmQgbXVjaCBlZmZvcnQgaGVyZTogTGV0J3MganVzdCByZXR1cm4KKyAqIGFuIEFCT1JUX1NOT09aRSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuLi4KKyAqLworCisJdG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9ROworCXdoaWxlICh0bXApIHsKKwkJaWYgKHRtcCA9PSBjbWQpIHsKKwkJCXByaW50aworCQkJICAgICgic2NzaSVkOiBBYm9ydCAtIGNvbW1hbmQgJWxkIGZvdW5kIG9uIGRpc2Nvbm5lY3RlZF9RIC0gIiwKKwkJCSAgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGNtZC0+cGlkKTsKKwkJCXByaW50aygiQWJvcnQgU05PT1pFLiAiKTsKKwkJCWVuYWJsZV9pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmlycSk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJCXRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZTsKKwl9CisKKy8qCisgKiBDYXNlIDQgOiBJZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQgaW4gYW55IG9mCisgKiAgICAgdGhlIHF1ZXVlcy4KKyAqCisgKiBXZSBwcm9iYWJseSByZWFjaGVkIHRoaXMgcG9pbnQgYmVjYXVzZSBvZiBhbiB1bmxpa2VseSByYWNlIGNvbmRpdGlvbgorICogYmV0d2VlbiB0aGUgY29tbWFuZCBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGFib3J0aW9uIGNvZGUsCisgKiBzbyB3ZSB3b24ndCBwYW5pYywgYnV0IHdlIHdpbGwgbm90aWZ5IHRoZSB1c2VyIGluIGNhc2Ugc29tZXRoaW5nIHJlYWxseQorICogYnJva2UuCisgKi8KKworLyogICBzdGkoKTsqLworCXdkMzNjOTNfZXhlY3V0ZShpbnN0YW5jZSk7CisKKwllbmFibGVfaXJxKGNtZC0+ZGV2aWNlLT5ob3N0LT5pcnEpOworCXByaW50aygic2NzaSVkOiB3YXJuaW5nIDogU0NTSSBjb21tYW5kIHByb2JhYmx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCisJICAgICAgICIgICAgICAgICBiZWZvcmUgYWJvcnRpb24uICIsIGluc3RhbmNlLT5ob3N0X25vKTsKKwlyZXR1cm4gRkFJTEVEOworfQorCisjZGVmaW5lIE1BWF9XRDMzQzkzX0hPU1RTIDQKKyNkZWZpbmUgTUFYX1NFVFVQX0FSR1MgKChpbnQpKHNpemVvZihzZXR1cF9hcmdzKSAvIHNpemVvZihjaGFyICopKSkKKyNkZWZpbmUgU0VUVVBfQlVGRkVSX1NJWkUgMjAwCitzdGF0aWMgY2hhciBzZXR1cF9idWZmZXJbU0VUVVBfQlVGRkVSX1NJWkVdOworc3RhdGljIGNoYXIgc2V0dXBfdXNlZFtNQVhfU0VUVVBfQVJHU107CitzdGF0aWMgaW50IGRvbmVfc2V0dXAgPSAwOworCitpbnQKK3dkMzNjOTNfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpOworCWNoYXIgKnAxLCAqcDI7CisKKwkvKiBUaGUga2VybmVsIGRvZXMgc29tZSBwcm9jZXNzaW5nIG9mIHRoZSBjb21tYW5kLWxpbmUgYmVmb3JlIGNhbGxpbmcKKwkgKiB0aGlzIGZ1bmN0aW9uOiBJZiBpdCBiZWdpbnMgd2l0aCBhbnkgZGVjaW1hbCBvciBoZXggbnVtYmVyIGFyZ3VtZW50cywKKwkgKiBpbnRzWzBdID0gaG93IG1hbnkgbnVtYmVycyBmb3VuZCBhbmQgaW50c1sxXSB0aHJvdWdoIFtuXSBhcmUgdGhlIHZhbHVlcworCSAqIHRoZW1zZWx2ZXMuIHN0ciBwb2ludHMgdG8gd2hlcmUgdGhlIG5vbi1udW1lcmljIGFyZ3VtZW50cyAoaWYgYW55KQorCSAqIHN0YXJ0OiBXZSBkbyBvdXIgb3duIHBhcnNpbmcgb2YgdGhvc2UuIFdlIGNvbnN0cnVjdCBzeW50aGV0aWMgJ25vc3luYycKKwkgKiBrZXl3b3JkcyBvdXQgb2YgbnVtZXJpYyBhcmdzICh0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKKwkgKiB2ZXJzaW9ucykgYW5kIHRoZW4gYWRkIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCisJICovCisKKwlwMSA9IHNldHVwX2J1ZmZlcjsKKwkqcDEgPSAnXDAnOworCWlmIChzdHIpCisJCXN0cm5jcHkocDEsIHN0ciwgU0VUVVBfQlVGRkVSX1NJWkUgLSBzdHJsZW4oc2V0dXBfYnVmZmVyKSk7CisJc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFIC0gMV0gPSAnXDAnOworCXAxID0gc2V0dXBfYnVmZmVyOworCWkgPSAwOworCXdoaWxlICgqcDEgJiYgKGkgPCBNQVhfU0VUVVBfQVJHUykpIHsKKwkJcDIgPSBzdHJjaHIocDEsICcsJyk7CisJCWlmIChwMikgeworCQkJKnAyID0gJ1wwJzsKKwkJCWlmIChwMSAhPSBwMikKKwkJCQlzZXR1cF9hcmdzW2ldID0gcDE7CisJCQlwMSA9IHAyICsgMTsKKwkJCWkrKzsKKwkJfSBlbHNlIHsKKwkJCXNldHVwX2FyZ3NbaV0gPSBwMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VUVVBfQVJHUzsgaSsrKQorCQlzZXR1cF91c2VkW2ldID0gMDsKKwlkb25lX3NldHVwID0gMTsKKworCXJldHVybiAxOworfQorX19zZXR1cCgid2QzM2M5Mz0iLCB3ZDMzYzkzX3NldHVwKTsKKworLyogY2hlY2tfc2V0dXBfYXJncygpIHJldHVybnMgaW5kZXggaWYga2V5IGZvdW5kLCAwIGlmIG5vdAorICovCitzdGF0aWMgaW50CitjaGVja19zZXR1cF9hcmdzKGNoYXIgKmtleSwgaW50ICpmbGFncywgaW50ICp2YWwsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgeDsKKwljaGFyICpjcDsKKworCWZvciAoeCA9IDA7IHggPCBNQVhfU0VUVVBfQVJHUzsgeCsrKSB7CisJCWlmIChzZXR1cF91c2VkW3hdKQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcChzZXR1cF9hcmdzW3hdLCBrZXksIHN0cmxlbihrZXkpKSkKKwkJCWJyZWFrOworCQlpZiAoIXN0cm5jbXAoc2V0dXBfYXJnc1t4XSwgIm5leHQiLCBzdHJsZW4oIm5leHQiKSkpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKHggPT0gTUFYX1NFVFVQX0FSR1MpCisJCXJldHVybiAwOworCXNldHVwX3VzZWRbeF0gPSAxOworCWNwID0gc2V0dXBfYXJnc1t4XSArIHN0cmxlbihrZXkpOworCSp2YWwgPSAtMTsKKwlpZiAoKmNwICE9ICc6JykKKwkJcmV0dXJuICsreDsKKwljcCsrOworCWlmICgoKmNwID49ICcwJykgJiYgKCpjcCA8PSAnOScpKSB7CisJCSp2YWwgPSBzaW1wbGVfc3RydG91bChjcCwgTlVMTCwgMCk7CisJfQorCXJldHVybiArK3g7Cit9CisKK3ZvaWQKK3dkMzNjOTNfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY29uc3Qgd2QzM2M5M19yZWdzIHJlZ3MsCisJICAgICBkbWFfc2V0dXBfdCBzZXR1cCwgZG1hX3N0b3BfdCBzdG9wLCBpbnQgY2xvY2tfZnJlcSkKK3sKKwlzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqaG9zdGRhdGE7CisJaW50IGk7CisJaW50IGZsYWdzOworCWludCB2YWw7CisJY2hhciBidWZbMzJdOworCisJaWYgKCFkb25lX3NldHVwICYmIHNldHVwX3N0cmluZ3MpCisJCXdkMzNjOTNfc2V0dXAoc2V0dXBfc3RyaW5ncyk7CisKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKwlob3N0ZGF0YS0+cmVncyA9IHJlZ3M7CisJaG9zdGRhdGEtPmNsb2NrX2ZyZXEgPSBjbG9ja19mcmVxOworCWhvc3RkYXRhLT5kbWFfc2V0dXAgPSBzZXR1cDsKKwlob3N0ZGF0YS0+ZG1hX3N0b3AgPSBzdG9wOworCWhvc3RkYXRhLT5kbWFfYm91bmNlX2J1ZmZlciA9IE5VTEw7CisJaG9zdGRhdGEtPmRtYV9ib3VuY2VfbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWhvc3RkYXRhLT5idXN5W2ldID0gMDsKKwkJaG9zdGRhdGEtPnN5bmNfeGZlcltpXSA9CisJCSAgICBjYWxjX3N5bmNfeGZlcihERUZBVUxUX1NYX1BFUiAvIDQsIERFRkFVTFRfU1hfT0ZGKTsKKwkJaG9zdGRhdGEtPnN5bmNfc3RhdFtpXSA9IFNTX1VOU0VUOwkvKiB1c2luZyBkZWZhdWx0IHN5bmMgdmFsdWVzICovCisjaWZkZWYgUFJPQ19TVEFUSVNUSUNTCisJCWhvc3RkYXRhLT5jbWRfY250W2ldID0gMDsKKwkJaG9zdGRhdGEtPmRpc2NfYWxsb3dlZF9jbnRbaV0gPSAwOworCQlob3N0ZGF0YS0+ZGlzY19kb25lX2NudFtpXSA9IDA7CisjZW5kaWYKKwl9CisJaG9zdGRhdGEtPmlucHV0X1EgPSBOVUxMOworCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOworCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOworCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9IE5VTEw7CisJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKKwlob3N0ZGF0YS0+ZG1hID0gRF9ETUFfT0ZGOworCWhvc3RkYXRhLT5sZXZlbDIgPSBMMl9CQVNJQzsKKwlob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IERJU19BREFQVElWRTsKKwlob3N0ZGF0YS0+YXJncyA9IERFQlVHX0RFRkFVTFRTOworCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOworCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAwOworCWhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciA9IERFRkFVTFRfU1hfUEVSOworCWhvc3RkYXRhLT5ub19zeW5jID0gMHhmZjsJLyogc3luYyBkZWZhdWx0cyB0byBvZmYgKi8KKwlob3N0ZGF0YS0+bm9fZG1hID0gMDsJLyogZGVmYXVsdCBpcyBETUEgZW5hYmxlZCAqLworCisjaWZkZWYgUFJPQ19JTlRFUkZBQ0UKKwlob3N0ZGF0YS0+cHJvYyA9IFBSX1ZFUlNJT04gfCBQUl9JTkZPIHwgUFJfU1RBVElTVElDUyB8CisJICAgIFBSX0NPTk5FQ1RFRCB8IFBSX0lOUFVUUSB8IFBSX0RJU0NRIHwgUFJfU1RPUDsKKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKwlob3N0ZGF0YS0+ZG1hX2NudCA9IDA7CisJaG9zdGRhdGEtPnBpb19jbnQgPSAwOworCWhvc3RkYXRhLT5pbnRfY250ID0gMDsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygibm9zeW5jIiwgJmZsYWdzLCAmdmFsLCBidWYpKQorCQlob3N0ZGF0YS0+bm9fc3luYyA9IHZhbDsKKworCWlmIChjaGVja19zZXR1cF9hcmdzKCJub2RtYSIsICZmbGFncywgJnZhbCwgYnVmKSkKKwkJaG9zdGRhdGEtPm5vX2RtYSA9ICh2YWwgPT0gLTEpID8gMSA6IHZhbDsKKworCWlmIChjaGVja19zZXR1cF9hcmdzKCJwZXJpb2QiLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpCisJCWhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciA9CisJCSAgICBzeF90YWJsZVtyb3VuZF9wZXJpb2QoKHVuc2lnbmVkIGludCkgdmFsKV0ucGVyaW9kX25zOworCisJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImRpc2Nvbm5lY3QiLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpIHsKKwkJaWYgKCh2YWwgPj0gRElTX05FVkVSKSAmJiAodmFsIDw9IERJU19BTFdBWVMpKQorCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3QgPSB2YWw7CisJCWVsc2UKKwkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ID0gRElTX0FEQVBUSVZFOworCX0KKworCWlmIChjaGVja19zZXR1cF9hcmdzKCJsZXZlbDIiLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpCisJCWhvc3RkYXRhLT5sZXZlbDIgPSB2YWw7CisKKwlpZiAoY2hlY2tfc2V0dXBfYXJncygiZGVidWciLCAmZmxhZ3MsICZ2YWwsIGJ1ZikpCisJCWhvc3RkYXRhLT5hcmdzID0gdmFsICYgREJfTUFTSzsKKworCWlmIChjaGVja19zZXR1cF9hcmdzKCJjbG9jayIsICZmbGFncywgJnZhbCwgYnVmKSkgeworCQlpZiAodmFsID4gNyAmJiB2YWwgPCAxMSkKKwkJCXZhbCA9IFdEMzNDOTNfRlNfOF8xMDsKKwkJZWxzZSBpZiAodmFsID4gMTEgJiYgdmFsIDwgMTYpCisJCQl2YWwgPSBXRDMzQzkzX0ZTXzEyXzE1OworCQllbHNlIGlmICh2YWwgPiAxNSAmJiB2YWwgPCAyMSkKKwkJCXZhbCA9IFdEMzNDOTNfRlNfMTZfMjA7CisJCWVsc2UKKwkJCXZhbCA9IFdEMzNDOTNfRlNfOF8xMDsKKwkJaG9zdGRhdGEtPmNsb2NrX2ZyZXEgPSB2YWw7CisJfQorCisJaWYgKChpID0gY2hlY2tfc2V0dXBfYXJncygibmV4dCIsICZmbGFncywgJnZhbCwgYnVmKSkpIHsKKwkJd2hpbGUgKGkpCisJCQlzZXR1cF91c2VkWy0taV0gPSAxOworCX0KKyNpZmRlZiBQUk9DX0lOVEVSRkFDRQorCWlmIChjaGVja19zZXR1cF9hcmdzKCJwcm9jIiwgJmZsYWdzLCAmdmFsLCBidWYpKQorCQlob3N0ZGF0YS0+cHJvYyA9IHZhbDsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSgmaG9zdGRhdGEtPmxvY2spOworCXJlc2V0X3dkMzNjOTMoaW5zdGFuY2UpOworCXNwaW5fdW5sb2NrX2lycSgmaG9zdGRhdGEtPmxvY2spOworCisJcHJpbnRrKCJ3ZDMzYzkzLSVkOiBjaGlwPSVzLyVkIG5vX3N5bmM9MHgleCBub19kbWE9JWQiLAorCSAgICAgICBpbnN0YW5jZS0+aG9zdF9ubywKKwkgICAgICAgKGhvc3RkYXRhLT5jaGlwID09IENfV0QzM0M5MykgPyAiV0QzM2M5MyIgOiAoaG9zdGRhdGEtPmNoaXAgPT0KKwkJCQkJCQkgICAgQ19XRDMzQzkzQSkgPworCSAgICAgICAiV0QzM2M5M0EiIDogKGhvc3RkYXRhLT5jaGlwID09CisJCQkgICAgIENfV0QzM0M5M0IpID8gIldEMzNjOTNCIiA6ICJ1bmtub3duIiwKKwkgICAgICAgaG9zdGRhdGEtPm1pY3JvY29kZSwgaG9zdGRhdGEtPm5vX3N5bmMsIGhvc3RkYXRhLT5ub19kbWEpOworI2lmZGVmIERFQlVHR0lOR19PTgorCXByaW50aygiIGRlYnVnX2ZsYWdzPTB4JTAyeFxuIiwgaG9zdGRhdGEtPmFyZ3MpOworI2Vsc2UKKwlwcmludGsoIiBkZWJ1Z2dpbmc9T0ZGXG4iKTsKKyNlbmRpZgorCXByaW50aygiICAgICAgICAgICBzZXR1cF9hcmdzPSIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VUVVBfQVJHUzsgaSsrKQorCQlwcmludGsoIiVzLCIsIHNldHVwX2FyZ3NbaV0pOworCXByaW50aygiXG4iKTsKKwlwcmludGsoIiAgICAgICAgICAgVmVyc2lvbiAlcyAtICVzLCBDb21waWxlZCAlcyBhdCAlc1xuIiwKKwkgICAgICAgV0QzM0M5M19WRVJTSU9OLCBXRDMzQzkzX0RBVEUsIF9fREFURV9fLCBfX1RJTUVfXyk7Cit9CisKK2ludAord2QzM2M5M19wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBsZW4sIGludCBpbikKK3sKKworI2lmZGVmIFBST0NfSU5URVJGQUNFCisKKwljaGFyICpicDsKKwljaGFyIHRidWZbMTI4XTsKKwlzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqaGQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCWludCB4LCBpOworCXN0YXRpYyBpbnQgc3RvcCA9IDA7CisKKwloZCA9IChzdHJ1Y3QgV0QzM0M5M19ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7CisKKy8qIElmICdpbicgaXMgVFJVRSB3ZSBuZWVkIHRvIF9yZWFkXyB0aGUgcHJvYyBmaWxlLiBXZSBhY2NlcHQgdGhlIGZvbGxvd2luZworICoga2V5d29yZHMgKHNhbWUgZm9ybWF0IGFzIGNvbW1hbmQtbGluZSwgYnV0IG9ubHkgT05FIHBlciByZWFkKToKKyAqICAgIGRlYnVnCisgKiAgICBkaXNjb25uZWN0CisgKiAgICBwZXJpb2QKKyAqICAgIHJlc3luYworICogICAgcHJvYworICogICAgbm9kbWEKKyAqLworCisJaWYgKGluKSB7CisJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJYnAgPSBidWY7CisJCWlmICghc3RybmNtcChicCwgImRlYnVnOiIsIDYpKSB7CisJCQlicCArPSA2OworCQkJaGQtPmFyZ3MgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCkgJiBEQl9NQVNLOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAiZGlzY29ubmVjdDoiLCAxMSkpIHsKKwkJCWJwICs9IDExOworCQkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJCWlmICh4IDwgRElTX05FVkVSIHx8IHggPiBESVNfQUxXQVlTKQorCQkJCXggPSBESVNfQURBUFRJVkU7CisJCQloZC0+ZGlzY29ubmVjdCA9IHg7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJwZXJpb2Q6IiwgNykpIHsKKwkJCWJwICs9IDc7CisJCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOworCQkJaGQtPmRlZmF1bHRfc3hfcGVyID0KKwkJCSAgICBzeF90YWJsZVtyb3VuZF9wZXJpb2QoKHVuc2lnbmVkIGludCkgeCldLnBlcmlvZF9uczsKKwkJfSBlbHNlIGlmICghc3RybmNtcChicCwgInJlc3luYzoiLCA3KSkgeworCQkJYnAgKz0gNzsKKwkJCXggPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQkJCWlmICh4ICYgKDEgPDwgaSkpCisJCQkJCWhkLT5zeW5jX3N0YXRbaV0gPSBTU19VTlNFVDsKKwkJfSBlbHNlIGlmICghc3RybmNtcChicCwgInByb2M6IiwgNSkpIHsKKwkJCWJwICs9IDU7CisJCQloZC0+cHJvYyA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChicCwgIm5vZG1hOiIsIDYpKSB7CisJCQlicCArPSA2OworCQkJaGQtPm5vX2RtYSA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChicCwgImxldmVsMjoiLCA3KSkgeworCQkJYnAgKz0gNzsKKwkJCWhkLT5sZXZlbDIgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7CisJCX0KKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZoZC0+bG9jayk7CisJYnAgPSBidWY7CisJKmJwID0gJ1wwJzsKKwlpZiAoaGQtPnByb2MgJiBQUl9WRVJTSU9OKSB7CisJCXNwcmludGYodGJ1ZiwgIlxuVmVyc2lvbiAlcyAtICVzLiBDb21waWxlZCAlcyAlcyIsCisJCQlXRDMzQzkzX1ZFUlNJT04sIFdEMzNDOTNfREFURSwgX19EQVRFX18sIF9fVElNRV9fKTsKKwkJc3RyY2F0KGJwLCB0YnVmKTsKKwl9CisJaWYgKGhkLT5wcm9jICYgUFJfSU5GTykgeworCQlzcHJpbnRmKHRidWYsICJcbmNsb2NrX2ZyZXE9JTAyeCBub19zeW5jPSUwMnggbm9fZG1hPSVkIiwKKwkJCWhkLT5jbG9ja19mcmVxLCBoZC0+bm9fc3luYywgaGQtPm5vX2RtYSk7CisJCXN0cmNhdChicCwgdGJ1Zik7CisJCXN0cmNhdChicCwgIlxuc3luY194ZmVyW10gPSAgICAgICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlMDJ4IiwgaGQtPnN5bmNfeGZlclt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJCXN0cmNhdChicCwgIlxuc3luY19zdGF0W10gPSAgICAgICAiKTsKKwkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykgeworCQkJc3ByaW50Zih0YnVmLCAiXHQlMDJ4IiwgaGQtPnN5bmNfc3RhdFt4XSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQl9CisJfQorI2lmZGVmIFBST0NfU1RBVElTVElDUworCWlmIChoZC0+cHJvYyAmIFBSX1NUQVRJU1RJQ1MpIHsKKwkJc3RyY2F0KGJwLCAiXG5jb21tYW5kcyBpc3N1ZWQ6ICAgICIpOworCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKSB7CisJCQlzcHJpbnRmKHRidWYsICJcdCVsZCIsIGhkLT5jbWRfY250W3hdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwkJc3RyY2F0KGJwLCAiXG5kaXNjb25uZWN0cyBhbGxvd2VkOiIpOworCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKSB7CisJCQlzcHJpbnRmKHRidWYsICJcdCVsZCIsIGhkLT5kaXNjX2FsbG93ZWRfY250W3hdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwkJc3RyY2F0KGJwLCAiXG5kaXNjb25uZWN0cyBkb25lOiAgICIpOworCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKSB7CisJCQlzcHJpbnRmKHRidWYsICJcdCVsZCIsIGhkLT5kaXNjX2RvbmVfY250W3hdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwkJc3ByaW50Zih0YnVmLAorCQkJIlxuaW50ZXJydXB0czogJWxkLCBEQVRBX1BIQVNFIGludHM6ICVsZCBETUEsICVsZCBQSU8iLAorCQkJaGQtPmludF9jbnQsIGhkLT5kbWFfY250LCBoZC0+cGlvX2NudCk7CisJCXN0cmNhdChicCwgdGJ1Zik7CisJfQorI2VuZGlmCisJaWYgKGhkLT5wcm9jICYgUFJfQ09OTkVDVEVEKSB7CisJCXN0cmNhdChicCwgIlxuY29ubmVjdGVkOiAgICAgIik7CisJCWlmIChoZC0+Y29ubmVjdGVkKSB7CisJCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBoZC0+Y29ubmVjdGVkOworCQkJc3ByaW50Zih0YnVmLCAiICVsZC0lZDolZCglMDJ4KSIsCisJCQkJY21kLT5waWQsIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5jbW5kWzBdKTsKKwkJCXN0cmNhdChicCwgdGJ1Zik7CisJCX0KKwl9CisJaWYgKGhkLT5wcm9jICYgUFJfSU5QVVRRKSB7CisJCXN0cmNhdChicCwgIlxuaW5wdXRfUTogICAgICAgIik7CisJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhkLT5pbnB1dF9ROworCQl3aGlsZSAoY21kKSB7CisJCQlzcHJpbnRmKHRidWYsICIgJWxkLSVkOiVkKCUwMngpIiwKKwkJCQljbWQtPnBpZCwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOworCQkJc3RyY2F0KGJwLCB0YnVmKTsKKwkJCWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJfQorCX0KKwlpZiAoaGQtPnByb2MgJiBQUl9ESVNDUSkgeworCQlzdHJjYXQoYnAsICJcbmRpc2Nvbm5lY3RlZF9ROiIpOworCQljbWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBoZC0+ZGlzY29ubmVjdGVkX1E7CisJCXdoaWxlIChjbWQpIHsKKwkJCXNwcmludGYodGJ1ZiwgIiAlbGQtJWQ6JWQoJTAyeCkiLAorCQkJCWNtZC0+cGlkLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+Y21uZFswXSk7CisJCQlzdHJjYXQoYnAsIHRidWYpOworCQkJY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOworCQl9CisJfQorCXN0cmNhdChicCwgIlxuIik7CisJc3Bpbl91bmxvY2tfaXJxKCZoZC0+bG9jayk7CisJKnN0YXJ0ID0gYnVmOworCWlmIChzdG9wKSB7CisJCXN0b3AgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG9mZiA+IDB4NDAwMDApCS8qIEFMV0FZUyBzdG9wIGFmdGVyIDI1NmsgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgKi8KKwkJc3RvcCA9IDE7CisJaWYgKGhkLT5wcm9jICYgUFJfU1RPUCkJLyogc3RvcCBldmVyeSBvdGhlciB0aW1lICovCisJCXN0b3AgPSAxOworCXJldHVybiBzdHJsZW4oYnApOworCisjZWxzZQkJCQkvKiBQUk9DX0lOVEVSRkFDRSAqLworCisJcmV0dXJuIDA7CisKKyNlbmRpZgkJCQkvKiBQUk9DX0lOVEVSRkFDRSAqLworCit9CisKK3ZvaWQKK3dkMzNjOTNfcmVsZWFzZSh2b2lkKQoreworfQorCitFWFBPUlRfU1lNQk9MKHdkMzNjOTNfaG9zdF9yZXNldCk7CitFWFBPUlRfU1lNQk9MKHdkMzNjOTNfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHdkMzNjOTNfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKHdkMzNjOTNfYWJvcnQpOworRVhQT1JUX1NZTUJPTCh3ZDMzYzkzX3F1ZXVlY29tbWFuZCk7CitFWFBPUlRfU1lNQk9MKHdkMzNjOTNfaW50cik7CitFWFBPUlRfU1lNQk9MKHdkMzNjOTNfcHJvY19pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDMzYzkzLmggYi9kcml2ZXJzL3Njc2kvd2QzM2M5My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2VjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvd2QzM2M5My5oCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogICAgd2QzM2M5My5oIC0gIExpbnV4IGRldmljZSBkcml2ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZQorICogICAgICAgICAgICAgICAgIENvbW1vZG9yZSBBbWlnYSBBMjA5MS81OTAgU0NTSSBjb250cm9sbGVyIGNhcmQKKyAqCisgKiAgICBJTVBPUlRBTlQ6IFRoaXMgZmlsZSBpcyBmb3IgdmVyc2lvbiAxLjI1IC0gMDkvSnVsLzE5OTcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCisgKiAgICBqb2huQGdlb2xvZy5jb20KKyAqICAgIGpzaGlmZmxlQG5ldGNvbS5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIFdEMzNDOTNfSAorI2RlZmluZSBXRDMzQzkzX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIFBST0NfSU5URVJGQUNFICAgICAvKiBhZGQgY29kZSBmb3IgL3Byb2Mvc2NzaS93ZDMzYzkzL3h4eCBpbnRlcmZhY2UgKi8KKyNpZmRlZiAgUFJPQ19JTlRFUkZBQ0UKKyNkZWZpbmUgUFJPQ19TVEFUSVNUSUNTICAgIC8qIGFkZCBjb2RlIGZvciBrZWVwaW5nIHZhcmlvdXMgcmVhbCB0aW1lIHN0YXRzICovCisjZW5kaWYKKworI2RlZmluZSBTWU5DX0RFQlVHICAgICAgICAgLyogZXh0cmEgaW5mbyBvbiBzeW5jIG5lZ290aWF0aW9uIHByaW50ZWQgKi8KKyNkZWZpbmUgREVCVUdHSU5HX09OICAgICAgIC8qIGVuYWJsZSBjb21tYW5kLWxpbmUgZGVidWdnaW5nIGJpdG1hc2sgKi8KKyNkZWZpbmUgREVCVUdfREVGQVVMVFMgMCAgIC8qIGRlZmF1bHQgZGVidWdnaW5nIGJpdG1hc2sgKi8KKworCisjaWZkZWYgREVCVUdHSU5HX09OCisjZGVmaW5lIERCKGYsYSkgaWYgKGhvc3RkYXRhLT5hcmdzICYgKGYpKSBhOworI2Vsc2UKKyNkZWZpbmUgREIoZixhKQorI2VuZGlmCisKKyNkZWZpbmUgdWNoYXIgdW5zaWduZWQgY2hhcgorCisKKy8qIHdkIHJlZ2lzdGVyIG5hbWVzICovCisjZGVmaW5lIFdEX09XTl9JRCAgICAweDAwCisjZGVmaW5lIFdEX0NPTlRST0wgICAgICAweDAxCisjZGVmaW5lIFdEX1RJTUVPVVRfUEVSSU9EICAweDAyCisjZGVmaW5lIFdEX0NEQl8xICAgICAweDAzCisjZGVmaW5lIFdEX0NEQl8yICAgICAweDA0CisjZGVmaW5lIFdEX0NEQl8zICAgICAweDA1CisjZGVmaW5lIFdEX0NEQl80ICAgICAweDA2CisjZGVmaW5lIFdEX0NEQl81ICAgICAweDA3CisjZGVmaW5lIFdEX0NEQl82ICAgICAweDA4CisjZGVmaW5lIFdEX0NEQl83ICAgICAweDA5CisjZGVmaW5lIFdEX0NEQl84ICAgICAweDBhCisjZGVmaW5lIFdEX0NEQl85ICAgICAweDBiCisjZGVmaW5lIFdEX0NEQl8xMCAgICAweDBjCisjZGVmaW5lIFdEX0NEQl8xMSAgICAweDBkCisjZGVmaW5lIFdEX0NEQl8xMiAgICAweDBlCisjZGVmaW5lIFdEX1RBUkdFVF9MVU4gICAgICAweDBmCisjZGVmaW5lIFdEX0NPTU1BTkRfUEhBU0UgICAweDEwCisjZGVmaW5lIFdEX1NZTkNIUk9OT1VTX1RSQU5TRkVSIDB4MTEKKyNkZWZpbmUgV0RfVFJBTlNGRVJfQ09VTlRfTVNCIDB4MTIKKyNkZWZpbmUgV0RfVFJBTlNGRVJfQ09VTlQgIDB4MTMKKyNkZWZpbmUgV0RfVFJBTlNGRVJfQ09VTlRfTFNCIDB4MTQKKyNkZWZpbmUgV0RfREVTVElOQVRJT05fSUQgIDB4MTUKKyNkZWZpbmUgV0RfU09VUkNFX0lEICAgIDB4MTYKKyNkZWZpbmUgV0RfU0NTSV9TVEFUVVMgICAgIDB4MTcKKyNkZWZpbmUgV0RfQ09NTUFORCAgICAgIDB4MTgKKyNkZWZpbmUgV0RfREFUQSAgICAgIDB4MTkKKyNkZWZpbmUgV0RfUVVFVUVfVEFHICAgIDB4MWEKKyNkZWZpbmUgV0RfQVVYSUxJQVJZX1NUQVRVUyAgIDB4MWYKKworLyogV0QgY29tbWFuZHMgKi8KKyNkZWZpbmUgV0RfQ01EX1JFU0VUICAgIDB4MDAKKyNkZWZpbmUgV0RfQ01EX0FCT1JUICAgIDB4MDEKKyNkZWZpbmUgV0RfQ01EX0FTU0VSVF9BVE4gIDB4MDIKKyNkZWZpbmUgV0RfQ01EX05FR0FURV9BQ0sgIDB4MDMKKyNkZWZpbmUgV0RfQ01EX0RJU0NPTk5FQ1QgIDB4MDQKKyNkZWZpbmUgV0RfQ01EX1JFU0VMRUNUICAgIDB4MDUKKyNkZWZpbmUgV0RfQ01EX1NFTF9BVE4gICAgIDB4MDYKKyNkZWZpbmUgV0RfQ01EX1NFTCAgICAgIDB4MDcKKyNkZWZpbmUgV0RfQ01EX1NFTF9BVE5fWEZFUiAgIDB4MDgKKyNkZWZpbmUgV0RfQ01EX1NFTF9YRkVSICAgIDB4MDkKKyNkZWZpbmUgV0RfQ01EX1JFU0VMX1JFQ0VJVkUgIDB4MGEKKyNkZWZpbmUgV0RfQ01EX1JFU0VMX1NFTkQgIDB4MGIKKyNkZWZpbmUgV0RfQ01EX1dBSVRfU0VMX1JFQ0VJVkUgMHgwYworI2RlZmluZSBXRF9DTURfVFJBTlNfQUREUiAgMHgxOAorI2RlZmluZSBXRF9DTURfVFJBTlNfSU5GTyAgMHgyMAorI2RlZmluZSBXRF9DTURfVFJBTlNGRVJfUEFEICAgMHgyMQorI2RlZmluZSBXRF9DTURfU0JUX01PREUgICAgMHg4MAorCisvKiBBU1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNSX0lOVCAgICAgICAgICgweDgwKQorI2RlZmluZSBBU1JfTENJICAgICAgICAgKDB4NDApCisjZGVmaW5lIEFTUl9CU1kgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgQVNSX0NJUCAgICAgICAgICgweDEwKQorI2RlZmluZSBBU1JfUEUgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIEFTUl9EQlIgICAgICAgICAoMHgwMSkKKworLyogU0NTSSBCdXMgUGhhc2VzICovCisjZGVmaW5lIFBIU19EQVRBX09VVCAgICAweDAwCisjZGVmaW5lIFBIU19EQVRBX0lOICAgICAweDAxCisjZGVmaW5lIFBIU19DT01NQU5EICAgICAweDAyCisjZGVmaW5lIFBIU19TVEFUVVMgICAgICAweDAzCisjZGVmaW5lIFBIU19NRVNTX09VVCAgICAweDA2CisjZGVmaW5lIFBIU19NRVNTX0lOICAgICAweDA3CisKKy8qIENvbW1hbmQgU3RhdHVzIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyAgLyogcmVzZXQgc3RhdGUgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfUkVTRVQgICAgMHgwMAorI2RlZmluZSBDU1JfUkVTRVRfQUYgICAgMHgwMQorCisgIC8qIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIENTUl9SRVNFTEVDVCAgICAweDEwCisjZGVmaW5lIENTUl9TRUxFQ1QgICAgICAweDExCisjZGVmaW5lIENTUl9TRUxfWEZFUl9ET05FICAweDE2CisjZGVmaW5lIENTUl9YRkVSX0RPTkUgICAgICAweDE4CisKKyAgLyogcGF1c2VkIG9yIGFib3J0ZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfTVNHSU4gICAgMHgyMAorI2RlZmluZSBDU1JfU0RQICAgICAgICAgMHgyMQorI2RlZmluZSBDU1JfU0VMX0FCT1JUICAgICAgMHgyMgorI2RlZmluZSBDU1JfUkVTRUxfQUJPUlQgICAgMHgyNQorI2RlZmluZSBDU1JfUkVTRUxfQUJPUlRfQU0gMHgyNworI2RlZmluZSBDU1JfQUJPUlQgICAgMHgyOAorCisgIC8qIHRlcm1pbmF0ZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfSU5WQUxJRCAgICAgMHg0MAorI2RlZmluZSBDU1JfVU5FWFBfRElTQyAgICAgMHg0MQorI2RlZmluZSBDU1JfVElNRU9VVCAgICAgMHg0MgorI2RlZmluZSBDU1JfUEFSSVRZICAgICAgMHg0MworI2RlZmluZSBDU1JfUEFSSVRZX0FUTiAgICAgMHg0NAorI2RlZmluZSBDU1JfQkFEX1NUQVRVUyAgICAgMHg0NQorI2RlZmluZSBDU1JfVU5FWFAgICAgMHg0OAorCisgIC8qIHNlcnZpY2UgcmVxdWlyZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBDU1JfUkVTRUwgICAgMHg4MAorI2RlZmluZSBDU1JfUkVTRUxfQU0gICAgMHg4MQorI2RlZmluZSBDU1JfRElTQyAgICAgMHg4NQorI2RlZmluZSBDU1JfU1JWX1JFUSAgICAgMHg4OAorCisgICAvKiBPd24gSUQvQ0RCIFNpemUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT1dOSURfRUFGICAgIDB4MDgKKyNkZWZpbmUgT1dOSURfRUhQICAgIDB4MTAKKyNkZWZpbmUgT1dOSURfUkFGICAgIDB4MjAKKyNkZWZpbmUgT1dOSURfRlNfOCAgIDB4MDAKKyNkZWZpbmUgT1dOSURfRlNfMTIgIDB4NDAKKyNkZWZpbmUgT1dOSURfRlNfMTYgIDB4ODAKKworICAgLyogZGVmaW5lIHRoZXNlIHNvIHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlIGEyMDkxLmMsIGV0Yy4gKi8KKyNkZWZpbmUgV0QzM0M5M19GU184XzEwICBPV05JRF9GU184CisjZGVmaW5lIFdEMzNDOTNfRlNfMTJfMTUgT1dOSURfRlNfMTIKKyNkZWZpbmUgV0QzM0M5M19GU18xNl8yMCBPV05JRF9GU18xNgorCisgICAvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIENUUkxfSFNQICAgICAweDAxCisjZGVmaW5lIENUUkxfSEEgICAgICAweDAyCisjZGVmaW5lIENUUkxfSURJICAgICAweDA0CisjZGVmaW5lIENUUkxfRURJICAgICAweDA4CisjZGVmaW5lIENUUkxfSEhQICAgICAweDEwCisjZGVmaW5lIENUUkxfUE9MTEVEICAweDAwCisjZGVmaW5lIENUUkxfQlVSU1QgICAweDIwCisjZGVmaW5lIENUUkxfQlVTICAgICAweDQwCisjZGVmaW5lIENUUkxfRE1BICAgICAweDgwCisKKyAgIC8qIFRpbWVvdXQgUGVyaW9kIHJlZ2lzdGVyICovCisjZGVmaW5lIFRJTUVPVVRfUEVSSU9EX1ZBTFVFICAyMCAgICAvKiAyMCA9IDIwMCBtcyAqLworCisgICAvKiBTeW5jaHJvbm91cyBUcmFuc2ZlciBSZWdpc3RlciAqLworI2RlZmluZSBTVFJfRlNTICAgICAgMHg4MAorCisgICAvKiBEZXN0aW5hdGlvbiBJRCByZWdpc3RlciAqLworI2RlZmluZSBEU1RJRF9EUEQgICAgMHg0MAorI2RlZmluZSBEQVRBX09VVF9ESVIgMAorI2RlZmluZSBEQVRBX0lOX0RJUiAgMQorI2RlZmluZSBEU1RJRF9TQ0MgICAgMHg4MAorCisgICAvKiBTb3VyY2UgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JDSURfTUFTSyAgIDB4MDcKKyNkZWZpbmUgU1JDSURfU0lWICAgIDB4MDgKKyNkZWZpbmUgU1JDSURfRFNQICAgIDB4MjAKKyNkZWZpbmUgU1JDSURfRVMgICAgIDB4NDAKKyNkZWZpbmUgU1JDSURfRVIgICAgIDB4ODAKKworICAgLyogVGhpcyBpcyB3aGF0IHRoZSAzMzkzIGNoaXAgbG9va3MgbGlrZSB0byB1cyAqLwordHlwZWRlZiBzdHJ1Y3QgeworI2lmZGVmIENPTkZJR19XRDMzQzkzX1BJTworICAgdW5zaWduZWQgaW50ICAgU0FTUjsKKyAgIHVuc2lnbmVkIGludCAgIFNDTUQ7CisjZWxzZQorICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKlNBU1I7CisgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqU0NNRDsKKyNlbmRpZgorfSB3ZDMzYzkzX3JlZ3M7CisKKwordHlwZWRlZiBpbnQgKCpkbWFfc2V0dXBfdCkgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBpbnQgZGlyX2luKTsKK3R5cGVkZWYgdm9pZCAoKmRtYV9zdG9wX3QpIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKKwkJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIGludCBzdGF0dXMpOworCisKKyNkZWZpbmUgSUxMRUdBTF9TVEFUVVNfQllURSAgIDB4ZmYKKworI2RlZmluZSBERUZBVUxUX1NYX1BFUiAgIDM3NiAgICAgLyogKG5zKSBmYWlybHkgc2FmZSAqLworI2RlZmluZSBERUZBVUxUX1NYX09GRiAgIDAgICAgICAgLyogYWthIGFzeW5jICovCisKKyNkZWZpbmUgT1BUSU1VTV9TWF9QRVIgICAyNTIgICAgIC8qIChucykgYmVzdCB3ZSBjYW4gZG8gKG11bHQtb2YtNCkgKi8KKyNkZWZpbmUgT1BUSU1VTV9TWF9PRkYgICAxMiAgICAgIC8qIHNpemUgb2Ygd2QzMzkzIGZpZm8gKi8KKworc3RydWN0IHN4X3BlcmlvZCB7CisgICB1bnNpZ25lZCBpbnQgICBwZXJpb2RfbnM7CisgICB1Y2hhciAgICAgICAgICByZWdfdmFsdWU7CisgICB9OworCisvKiBGRUY6IGRlZmluZXMgZm9yIGhvc3RkYXRhLT5kbWFfYnVmZmVyX3Bvb2wgKi8KKworI2RlZmluZSBCVUZfQ0hJUF9BTExPQ0VEIDAKKyNkZWZpbmUgQlVGX1NDU0lfQUxMT0NFRCAxCisKK3N0cnVjdCBXRDMzQzkzX2hvc3RkYXRhIHsKKyAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpuZXh0OworICAgIHdkMzNjOTNfcmVncyAgICAgcmVnczsKKyAgICBzcGlubG9ja190ICAgICAgIGxvY2s7CisgICAgdWNoYXIgICAgICAgICAgICBjbG9ja19mcmVxOworICAgIHVjaGFyICAgICAgICAgICAgY2hpcDsgICAgICAgICAgICAgLyogd2hhdCBraW5kIG9mIHdkMzNjOTM/ICovCisgICAgdWNoYXIgICAgICAgICAgICBtaWNyb2NvZGU7ICAgICAgICAvKiBtaWNyb2NvZGUgcmV2ICovCisgICAgdWNoYXIgICAgICAgICAgICBkbWFfYnVmZmVyX3Bvb2w7ICAvKiBGRUY6IGJ1ZmZlciBmcm9tIGNoaXBfcmFtPyAqLworICAgIGludCAgICAgICAgICAgICAgZG1hX2RpcjsgICAgICAgICAgLyogZGF0YSB0cmFuc2ZlciBkaXIuICovCisgICAgZG1hX3NldHVwX3QgICAgICBkbWFfc2V0dXA7CisgICAgZG1hX3N0b3BfdCAgICAgICBkbWFfc3RvcDsKKyAgICB1bnNpZ25lZCBpbnQgICAgIGRtYV94ZmVyX21hc2s7CisgICAgdWNoYXIgICAgICAgICAgICAqZG1hX2JvdW5jZV9idWZmZXI7CisgICAgdW5zaWduZWQgaW50ICAgICBkbWFfYm91bmNlX2xlbjsKKyAgICB2b2xhdGlsZSB1Y2hhciAgIGJ1c3lbOF07ICAgICAgICAgIC8qIGluZGV4ID0gdGFyZ2V0LCBiaXQgPSBsdW4gKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc2NzaV9jbW5kICppbnB1dF9ROyAgICAgICAvKiBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIHN0YXJ0ZWQgKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qgc2NzaV9jbW5kICpzZWxlY3Rpbmc7ICAgICAvKiB0cnlpbmcgdG8gc2VsZWN0IHRoaXMgY29tbWFuZCAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBzY3NpX2NtbmQgKmNvbm5lY3RlZDsgICAgIC8qIGN1cnJlbnRseSBjb25uZWN0ZWQgY29tbWFuZCAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBzY3NpX2NtbmQgKmRpc2Nvbm5lY3RlZF9ROy8qIGNvbW1hbmRzIHdhaXRpbmcgZm9yIHJlY29ubmVjdCAqLworICAgIHVjaGFyICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAgLyogd2hhdCB3ZSBhcmUgY3VycmVudGx5IGRvaW5nICovCisgICAgdWNoYXIgICAgICAgICAgICBkbWE7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHN0YXRlIG9mIERNQSAob24vb2ZmKSAqLworICAgIHVjaGFyICAgICAgICAgICAgbGV2ZWwyOyAgICAgICAgICAgLyogZXh0ZW50IHRvIHdoaWNoIExldmVsLTIgY29tbWFuZHMgYXJlIHVzZWQgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIGRpc2Nvbm5lY3Q7ICAgICAgIC8qIGRpc2Nvbm5lY3QvcmVzZWxlY3QgcG9saWN5ICovCisgICAgdW5zaWduZWQgaW50ICAgICBhcmdzOyAgICAgICAgICAgICAvKiBzZXQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnQgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIGluY29taW5nX21zZ1s4XTsgIC8qIGZpbGxlZCBkdXJpbmcgbWVzc2FnZV9pbiBwaGFzZSAqLworICAgIGludCAgICAgICAgICAgICAgaW5jb21pbmdfcHRyOyAgICAgLyogbWFpbmx5IHVzZWQgd2l0aCBFWFRFTkRFRCBtZXNzYWdlcyAqLworICAgIHVjaGFyICAgICAgICAgICAgb3V0Z29pbmdfbXNnWzhdOyAgLyogc2VuZCB0aGlzIGR1cmluZyBuZXh0IG1lc3NhZ2Vfb3V0ICovCisgICAgaW50ICAgICAgICAgICAgICBvdXRnb2luZ19sZW47ICAgICAvKiBsZW5ndGggb2Ygb3V0Z29pbmcgbWVzc2FnZSAqLworICAgIHVuc2lnbmVkIGludCAgICAgZGVmYXVsdF9zeF9wZXI7ICAgLyogZGVmYXVsdCB0cmFuc2ZlciBwZXJpb2QgZm9yIFNDU0kgYnVzICovCisgICAgdWNoYXIgICAgICAgICAgICBzeW5jX3hmZXJbOF07ICAgICAvKiBzeW5jX3hmZXIgcmVnIHNldHRpbmdzIHBlciB0YXJnZXQgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIHN5bmNfc3RhdFs4XTsgICAgIC8qIHN0YXR1cyBvZiBzeW5jIG5lZ290aWF0aW9uIHBlciB0YXJnZXQgKi8KKyAgICB1Y2hhciAgICAgICAgICAgIG5vX3N5bmM7ICAgICAgICAgIC8qIGJpdG1hc2s6IGRvbid0IGRvIHN5bmMgb24gdGhlc2UgdGFyZ2V0cyAqLworICAgIHVjaGFyICAgICAgICAgICAgbm9fZG1hOyAgICAgICAgICAgLyogc2V0IHRoaXMgZmxhZyB0byBkaXNhYmxlIERNQSAqLworI2lmZGVmIFBST0NfSU5URVJGQUNFCisgICAgdWNoYXIgICAgICAgICAgICBwcm9jOyAgICAgICAgICAgICAvKiBiaXRtYXNrOiB3aGF0J3MgaW4gcHJvYyBvdXRwdXQgKi8KKyNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKKyAgICB1bnNpZ25lZCBsb25nICAgIGNtZF9jbnRbOF07ICAgICAgIC8qICMgb2YgY29tbWFuZHMgaXNzdWVkIHBlciB0YXJnZXQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGludF9jbnQ7ICAgICAgICAgIC8qICMgb2YgaW50ZXJydXB0cyBzZXJ2aWNlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgcGlvX2NudDsgICAgICAgICAgLyogIyBvZiBwaW8gZGF0YSB0cmFuc2ZlcnMgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGRtYV9jbnQ7ICAgICAgICAgIC8qICMgb2YgRE1BIGRhdGEgdHJhbnNmZXJzICovCisgICAgdW5zaWduZWQgbG9uZyAgICBkaXNjX2FsbG93ZWRfY250WzhdOyAvKiAjIG9mIGRpc2Nvbm5lY3RzIGFsbG93ZWQgcGVyIHRhcmdldCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgZGlzY19kb25lX2NudFs4XTsgLyogIyBvZiBkaXNjb25uZWN0cyBkb25lIHBlciB0YXJnZXQqLworI2VuZGlmCisjZW5kaWYKKyAgICB9OworCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5jaGlwICovCisKKyNkZWZpbmUgQ19XRDMzQzkzICAgICAgIDAKKyNkZWZpbmUgQ19XRDMzQzkzQSAgICAgIDEKKyNkZWZpbmUgQ19XRDMzQzkzQiAgICAgIDIKKyNkZWZpbmUgQ19VTktOT1dOX0NISVAgIDEwMAorCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+c3RhdGUgKi8KKworI2RlZmluZSBTX1VOQ09OTkVDVEVEICAgICAgICAgMAorI2RlZmluZSBTX1NFTEVDVElORyAgICAgICAgICAgMQorI2RlZmluZSBTX1JVTk5JTkdfTEVWRUwyICAgICAgMgorI2RlZmluZSBTX0NPTk5FQ1RFRCAgICAgICAgICAgMworI2RlZmluZSBTX1BSRV9UTVBfRElTQyAgICAgICAgNAorI2RlZmluZSBTX1BSRV9DTVBfRElTQyAgICAgICAgNQorCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+ZG1hICovCisKKyNkZWZpbmUgRF9ETUFfT0ZGICAgICAgICAgIDAKKyNkZWZpbmUgRF9ETUFfUlVOTklORyAgICAgIDEKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmxldmVsMiAqLworLyogTk9URTogb25seSB0aGUgZmlyc3QgMyBhcmUgaW1wbGVtZW50ZWQgc28gZmFyICovCisKKyNkZWZpbmUgTDJfTk9ORSAgICAgIDEgIC8qIG5vIGNvbWJpbmF0aW9uIGNvbW1hbmRzIC0gd2UgZ2V0IGxvdHMgb2YgaW50cyAqLworI2RlZmluZSBMMl9TRUxFQ1QgICAgMiAgLyogc3RhcnQgd2l0aCBTRUxfQVROX1hGRVIsIGJ1dCBuZXZlciByZXN1bWUgaXQgKi8KKyNkZWZpbmUgTDJfQkFTSUMgICAgIDMgIC8qIHJlc3VtZSBhZnRlciBTVEFUVVMgaW50cyAmIFJEUCBtZXNzYWdlcyAqLworI2RlZmluZSBMMl9EQVRBICAgICAgNCAgLyogcmVzdW1lIGFmdGVyIERBVEFfSU4vT1VUIGludHMgKi8KKyNkZWZpbmUgTDJfTU9TVCAgICAgIDUgIC8qIHJlc3VtZSBhZnRlciBhbnl0aGluZyBleGNlcHQgYSBSRVNFTEVDVCBpbnQgKi8KKyNkZWZpbmUgTDJfUkVTRUxFQ1QgIDYgIC8qIHJlc3VtZSBhZnRlciBldmVyeXRoaW5nLCBpbmNsdWRpbmcgUkVTRUxFQ1QgaW50cyAqLworI2RlZmluZSBMMl9BTEwgICAgICAgNyAgLyogYWx3YXlzIHJlc3VtZSAqLworCisvKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+ZGlzY29ubmVjdCAqLworCisjZGVmaW5lIERJU19ORVZFUiAgICAwCisjZGVmaW5lIERJU19BREFQVElWRSAxCisjZGVmaW5lIERJU19BTFdBWVMgICAyCisKKy8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5hcmdzICovCisKKyNkZWZpbmUgREJfVEVTVDEgICAgICAgICAgICAgIDE8PDAKKyNkZWZpbmUgREJfVEVTVDIgICAgICAgICAgICAgIDE8PDEKKyNkZWZpbmUgREJfUVVFVUVfQ09NTUFORCAgICAgIDE8PDIKKyNkZWZpbmUgREJfRVhFQ1VURSAgICAgICAgICAgIDE8PDMKKyNkZWZpbmUgREJfSU5UUiAgICAgICAgICAgICAgIDE8PDQKKyNkZWZpbmUgREJfVFJBTlNGRVIgICAgICAgICAgIDE8PDUKKyNkZWZpbmUgREJfTUFTSyAgICAgICAgICAgICAgIDB4M2YKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnN5bmNfc3RhdFtdICovCisKKyNkZWZpbmUgU1NfVU5TRVQgICAgIDAKKyNkZWZpbmUgU1NfRklSU1QgICAgIDEKKyNkZWZpbmUgU1NfV0FJVElORyAgIDIKKyNkZWZpbmUgU1NfU0VUICAgICAgIDMKKworLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnByb2MgKi8KKworI2RlZmluZSBQUl9WRVJTSU9OICAgMTw8MAorI2RlZmluZSBQUl9JTkZPICAgICAgMTw8MQorI2RlZmluZSBQUl9TVEFUSVNUSUNTIDE8PDIKKyNkZWZpbmUgUFJfQ09OTkVDVEVEIDE8PDMKKyNkZWZpbmUgUFJfSU5QVVRRICAgIDE8PDQKKyNkZWZpbmUgUFJfRElTQ1EgICAgIDE8PDUKKyNkZWZpbmUgUFJfVEVTVCAgICAgIDE8PDYKKyNkZWZpbmUgUFJfU1RPUCAgICAgIDE8PDcKKworCit2b2lkIHdkMzNjOTNfaW5pdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLAorICAgICAgICAgZG1hX3NldHVwX3Qgc2V0dXAsIGRtYV9zdG9wX3Qgc3RvcCwgaW50IGNsb2NrX2ZyZXEpOworaW50IHdkMzNjOTNfYWJvcnQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CitpbnQgd2QzM2M5M19xdWV1ZWNvbW1hbmQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOwordm9pZCB3ZDMzYzkzX2ludHIgKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKK2ludCB3ZDMzYzkzX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCwgaW50KTsKK2ludCB3ZDMzYzkzX2hvc3RfcmVzZXQgKHN0cnVjdCBzY3NpX2NtbmQgKik7Cit2b2lkIHdkMzNjOTNfcmVsZWFzZSh2b2lkKTsKKworI2VuZGlmIC8qIFdEMzNDOTNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKQEAgLTAsMCArMSwxNjY3IEBACisvKiAkSWQ6ICQKKyAqICBsaW51eC9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBUaG9tYXMgV3VlbnNjaGUKKyAqCWNsb3NlbHkgcmVsYXRlZCB0byB0aGUgYWhhMTU0MiBkcml2ZXIgZnJvbSBUb21teSBUaG9ybgorICoJKCBhcyBjbG9zZSBhcyBkaWZmZXJlbnQgaGFyZHdhcmUgYWxsb3dzIG9uIGEgbG93bGV2ZWwtZHJpdmVyIDotKSApCisgKgorICogIFJldmlzZWQgKGFuZCByZW5hbWVkKSBieSBKb2huIEJveWQgPGJveWRAY2lzLm9oaW8tc3RhdGUuZWR1PiB0bworICogIGFjY29tbW9kYXRlIEVyaWMgWW91bmdkYWxlJ3MgbW9kaWZpY2F0aW9ucyB0byBzY3NpLmMuICBOb3YgMTk5Mi4KKyAqCisgKiAgQWRkaXRpb25hbCBjaGFuZ2VzIHRvIHN1cHBvcnQgc2NhdHRlci9nYXRoZXIuICBEZWMuIDE5OTIuICB0dy9qYgorICoKKyAqICBObyBsb25nZXIgdHJpZXMgdG8gcmVzZXQgU0NTSSBidXMgYXQgYm9vdCAoaXQgd2Fzbid0IHdvcmtpbmcgYW55d2F5KS4KKyAqICBSZXdyaXR0ZW4gdG8gc3VwcG9ydCBtdWx0aXBsZSBob3N0IGFkYXB0ZXJzLgorICogIE1pc2NlbGxhbmVvdXMgY2xlYW51cC4KKyAqICBTbyBmYXIsIHN0aWxsIGRvZXNuJ3QgZG8gcmVzZXQgb3IgYWJvcnQgY29ycmVjdGx5LCBzaW5jZSBJIGhhdmUgbm8gaWRlYQorICogIGhvdyB0byBkbyB0aGVtIHdpdGggdGhpcyBib2FyZCAoOF4oLiAgICAgICAgICAgICAgICAgICAgICBKYW4gMTk5NCBqYgorICoKKyAqIFRoaXMgZHJpdmVyIG5vdyBzdXBwb3J0cyBib3RoIG9mIHRoZSB0d28gc3RhbmRhcmQgY29uZmlndXJhdGlvbnMgKHBlcgorICogdGhlIDMuMzYgT3duZXIncyBNYW51YWwsIG15IGxhdGVzdCByZWZlcmVuY2UpIGJ5IHRoZSBzYW1lIG1ldGhvZCBhcworICogYmVmb3JlOyBuYW1lbHksIGJ5IGxvb2tpbmcgZm9yIGEgQklPUyBzaWduYXR1cmUuICBUaHVzLCB0aGUgbG9jYXRpb24gb2YKKyAqIHRoZSBCSU9TIHNpZ25hdHVyZSBkZXRlcm1pbmVzIHRoZSBib2FyZCBjb25maWd1cmF0aW9uLiAgVW50aWwgSSBoYXZlCisgKiB0aW1lIHRvIGRvIHNvbWV0aGluZyBtb3JlIGZsZXhpYmxlLCB1c2VycyBzaG91bGQgc3RpY2sgdG8gb25lIG9mIHRoZQorICogZm9sbG93aW5nOgorICoKKyAqIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIHNpbmdsZS1hZGFwdGVyIHN5c3RlbXM6CisgKiAgICAtIEJJT1MgYXQgQ0UwMGgKKyAqICAgIC0gSS9PIGJhc2UgYWRkcmVzcyAzNTBoCisgKiAgICAtIElSUSBsZXZlbCAxNQorICogICAgLSBETUEgY2hhbm5lbCA2CisgKiBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBhIHNlY29uZCBhZGFwdGVyIGluIGEgc3lzdGVtOgorICogICAgLSBCSU9TIGF0IEM4MDBoCisgKiAgICAtIEkvTyBiYXNlIGFkZHJlc3MgMzMwaAorICogICAgLSBJUlEgbGV2ZWwgMTEKKyAqICAgIC0gRE1BIGNoYW5uZWwgNQorICoKKyAqIEFueW9uZSB3aG8gY2FuIHJlY29tcGlsZSB0aGUga2VybmVsIGlzIHdlbGNvbWUgdG8gYWRkIG90aGVycyBhcyBuZWVkCisgKiBhcmlzZXMsIGJ1dCB1bnByZWRpY3RhYmxlIHJlc3VsdHMgbWF5IG9jY3VyIGlmIHRoZXJlIGFyZSBjb25mbGljdHMuCisgKiBJbiBhbnkgZXZlbnQsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBhZGFwdGVycyBpbiBhIHN5c3RlbSwgdGhleSBNVVNUCisgKiB1c2UgZGlmZmVyZW50IEkvTyBiYXNlcywgSVJRIGxldmVscywgYW5kIERNQSBjaGFubmVscywgc2luY2UgdGhleSB3aWxsIGJlCisgKiBpbmRpc3Rpbmd1aXNoYWJsZSAoYW5kIGluIGRpcmVjdCBjb25mbGljdCkgb3RoZXJ3aXNlLgorICoKKyAqICAgQXMgYSBwb2ludCBvZiBpbmZvcm1hdGlvbiwgdGhlIE5PX09QIGNvbW1hbmQgdG9nZ2xlcyB0aGUgQ01EX1JEWSBiaXQKKyAqIG9mIHRoZSBzdGF0dXMgcG9ydCwgYW5kIHRoaXMgZmFjdCBjb3VsZCBiZSB1c2VkIGFzIGEgdGVzdCBmb3IgdGhlIEkvTworICogYmFzZSBhZGRyZXNzIChvciBtb3JlIGdlbmVyYWxseSwgYm9hcmQgZGV0ZWN0aW9uKS4gIFRoZXJlIGlzIGFuIGludGVycnVwdAorICogc3RhdHVzIHBvcnQsIHNvIElSUSBwcm9iaW5nIGNvdWxkIGFsc28gYmUgZG9uZS4gIEkgc3VwcG9zZSB0aGUgZnVsbAorICogRE1BIGRpYWdub3N0aWMgY291bGQgYmUgdXNlZCB0byBkZXRlY3QgdGhlIERNQSBjaGFubmVsIGJlaW5nIHVzZWQuICBJCisgKiBoYXZlbid0IGRvbmUgYW55IG9mIHRoaXMsIHRob3VnaCwgYmVjYXVzZSBJIHRoaW5rIHRoZXJlJ3MgdG9vIG11Y2ggb2YKKyAqIGEgY2hhbmNlIHRoYXQgc3VjaCBleHBsb3JhdGlvbnMgY291bGQgYmUgZGVzdHJ1Y3RpdmUsIGlmIHNvbWUgb3RoZXIKKyAqIGJvYXJkJ3MgcmVzb3VyY2VzIGFyZSB1c2VkIGluYWR2ZXJ0ZW50bHkuICBTbywgY2FsbCBtZSBhIHdpbXAsIGJ1dCBJCisgKiBkb24ndCB3YW50IHRvIHRyeSBpdC4gIFRoZSBvbmx5IGtpbmQgb2YgZXhwbG9yYXRpb24gSSB0cnVzdCBpcyBtZW1vcnkKKyAqIGV4cGxvcmF0aW9uLCBzaW5jZSBpdCdzIG1vcmUgY2VydGFpbiB0aGF0IHJlYWRpbmcgbWVtb3J5IHdvbid0IGJlCisgKiBkZXN0cnVjdGl2ZS4KKyAqCisgKiBNb3JlIHRvIG15IGxpa2luZyB3b3VsZCBiZSBhIExJTE8gYm9vdCBjb21tYW5kIGxpbmUgc3BlY2lmaWNhdGlvbiwgc3VjaAorICogYXMgaXMgdXNlZCBieSB0aGUgYWhhMTUyeCBkcml2ZXIgKGFuZCBwb3NzaWJseSBvdGhlcnMpLiAgSSdsbCBsb29rIGludG8KKyAqIGl0LCBhcyBJIGhhdmUgdGltZS4uLgorICoKKyAqICAgSSBnZXQgbWFpbCBvY2Nhc2lvbmFsbHkgZnJvbSBwZW9wbGUgd2hvIGVpdGhlciBhcmUgdXNpbmcgb3IgYXJlCisgKiBjb25zaWRlcmluZyB1c2luZyBhIFdENzAwMCB3aXRoIExpbnV4LiAgVGhlcmUgaXMgYSB2YXJpZXR5IG9mCisgKiBub21lbmNsYXR1cmUgZGVzY3JpYmluZyBXRDcwMDAncy4gIFRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRnZSwgdGhlCisgKiBmb2xsb3dpbmcgaXMgYSBicmllZiBzdW1tYXJ5IChmcm9tIGFuIG9sZCBXRCBkb2MgLSBJIGRvbid0IHdvcmsgZm9yCisgKiB0aGVtIG9yIGFueXRoaW5nIGxpa2UgdGhhdCk6CisgKgorICogV0Q3MDAwLUZBU1NUMjogVGhpcyBpcyBhIFdENzAwMCBib2FyZCB3aXRoIHRoZSByZWFsLW1vZGUgU1NUIFJPTSBCSU9TCisgKiAgICAgICAgaW5zdGFsbGVkLiAgTGFzdCBJIGhlYXJkLCB0aGUgQklPUyB3YXMgYWN0dWFsbHkgZG9uZSBieSBDb2x1bWJpYQorICogICAgICAgIERhdGEgUHJvZHVjdHMuICBUaGUgQklPUyBpcyBvbmx5IHVzZWQgYnkgdGhpcyBkcml2ZXIgKGFuZCB0aHVzCisgKiAgICAgICAgYnkgTGludXgpIHRvIGlkZW50aWZ5IHRoZSBib2FyZDsgbm9uZSBvZiBpdCBjYW4gYmUgZXhlY3V0ZWQgdW5kZXIKKyAqICAgICAgICBMaW51eC4KKyAqCisgKiBXRDcwMDAtQVNDOiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBhZGFwdGVyIGJvYXJkLCB3aXRoIG9yIHdpdGhvdXQgQklPUy4KKyAqICAgICAgICBUaGUgYm9hcmQgdXNlcyBhIFdEMzNDOTMgb3IgV0QzM0M5M0EgU0JJQywgd2hpY2ggaW4gdHVybiBpcworICogICAgICAgIGNvbnRyb2xsZWQgYnkgYW4gb25ib2FyZCBaODAgcHJvY2Vzc29yLiAgVGhlIGJvYXJkIGludGVyZmFjZQorICogICAgICAgIHZpc2libGUgdG8gdGhlIGhvc3QgQ1BVIGlzIGRlZmluZWQgZWZmZWN0aXZlbHkgYnkgdGhlIFo4MCdzCisgKiAgICAgICAgZmlybXdhcmUsIGFuZCBpdCBpcyB0aGlzIGZpcm13YXJlJ3MgcmV2aXNpb24gbGV2ZWwgdGhhdCBpcworICogICAgICAgIGRldGVybWluZWQgYW5kIHJlcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAgKFRoZSB2ZXJzaW9uIG9mIHRoZQorICogICAgICAgIG9uLWJvYXJkIEJJT1MgaXMgb2Ygbm8gaW50ZXJlc3Qgd2hhdHNvZXZlci4pICBUaGUgaG9zdCBDUFUgaGFzCisgKiAgICAgICAgbm8gYWNjZXNzIHRvIHRoZSBTQklDOyBoZW5jZSB0aGUgZmFjdCB0aGF0IGl0IGlzIGEgV0QzM0M5MyBpcworICogICAgICAgIGFsc28gb2Ygbm8gaW50ZXJlc3QgdG8gdGhpcyBkcml2ZXIuCisgKgorICogV0Q3MDAwLUFYOgorICogV0Q3MDAwLU1YOgorICogV0Q3MDAwLUVYOiBUaGVzZSBhcmUgbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIFdENzAwMC1BU0MuICBUaGUgLUFTQyBpcworICogICAgICAgIGxhcmdlbHkgYnVpbHQgZnJvbSBkaXNjcmV0ZSBjb21wb25lbnRzOyB0aGVzZSBib2FyZHMgdXNlIG1vcmUKKyAqICAgICAgICBpbnRlZ3JhdGlvbi4gIFRoZSAtQVggaXMgYW4gSVNBIGJ1cyBib2FyZCAobGlrZSB0aGUgLUFTQyksCisgKiAgICAgICAgdGhlIC1NWCBpcyBhbiBNQ0EgKGkuZS4sIFBTLzIpIGJ1cyBib2FyZCksIGFuZCB0aGUgLUVYIGlzIGFuCisgKiAgICAgICAgRUlTQSBidXMgYm9hcmQuCisgKgorICogIEF0IHRoZSB0aW1lIG9mIG15IGRvY3VtZW50YXRpb24sIHRoZSAtP1ggYm9hcmRzIHdlcmUgImZ1dHVyZSIgcHJvZHVjdHMsCisgKiAgYW5kIHdlcmUgbm90IHlldCBhdmFpbGFibGUuICBIb3dldmVyLCBJIHZhZ3VlbHkgcmVjYWxsIHRoYXQgVGhvbWFzCisgKiAgV3VlbnNjaGUgaGFkIGFuIC1BWCwgc28gSSBiZWxpZXZlIGF0IGxlYXN0IGl0IGlzIHN1cHBvcnRlZCBieSB0aGlzCisgKiAgZHJpdmVyLiAgSSBoYXZlIG5vIHBlcnNvbmFsIGtub3dsZWRnZSBvZiBlaXRoZXIgLU1YIG9yIC1FWCBib2FyZHMuCisgKgorICogIFAuUy4gSnVzdCByZWNlbnRseSwgSSd2ZSBkaXNjb3ZlcmVkIChkaXJlY3RseSBmcm9tIFdEIGFuZCBGdXR1cmUKKyAqICBEb21haW4pIHRoYXQgYWxsIGJ1dCB0aGUgV0Q3MDAwLUVYIGhhdmUgYmVlbiBvdXQgb2YgcHJvZHVjdGlvbiBmb3IKKyAqICB0d28geWVhcnMgbm93LiAgRkQgaGFzIHByb2R1Y3Rpb24gcmlnaHRzIHRvIHRoZSA3MDAwLUVYLCBhbmQgYXJlCisgKiAgcHJvZHVjaW5nIGl0IHVuZGVyIGEgbmV3IG5hbWUsIGFuZCB3aXRoIGEgbmV3IEJJT1MuICBJZiBhbnlvbmUgaGFzCisgKiAgb25lIG9mIHRoZSBGRCBib2FyZHMsIGl0IHdvdWxkIGJlIG5pY2UgdG8gY29tZSB1cCB3aXRoIGEgc2lnbmF0dXJlCisgKiAgZm9yIGl0LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEouQi4gSmFuIDE5OTQuCisgKgorICoKKyAqICBSZXZpc2lvbnMgYnkgTWlyb3NsYXYgWmFnb3JhYyA8emFnYUBmbHkuY2MuZmVyLmhyPgorICoKKyAqICAwOC8yNC8xOTk2LgorICoKKyAqICBFbmhhbmNlbWVudCBmb3Igd2Q3MDAwX2RldGVjdCBmdW5jdGlvbiBoYXMgYmVlbiBtYWRlLCBzbyB5b3UgZG9uJ3QgaGF2ZQorICogIHRvIGVudGVyIEJJT1MgUk9NIGFkZHJlc3MgaW4gaW5pdGlhbGlzYXRpb24gZGF0YSAoc2VlIHN0cnVjdCBDb25maWcpLgorICogIFdlIGNhbm5vdCBkZXRlY3QgSVJRLCBETUEgYW5kIEkvTyBiYXNlIGFkZHJlc3MgZm9yIG5vdywgc28gd2UgaGF2ZSB0bworICogIGVudGVyIHRoZW0gYXMgYXJndW1lbnRzIHdoaWxlIHdkXzcwMDAgaXMgZGV0ZWN0ZWQuIElmIHNvbWVvbmUgaGFzIElSUSwKKyAqICBETUEgb3IgSS9PIGJhc2UgYWRkcmVzcyBzZXQgdG8gc29tZSBvdGhlciB2YWx1ZSwgaGUgY2FuIGVudGVyIHRoZW0gaW4KKyAqICBjb25maWd1cmF0aW9uIHdpdGhvdXQgYW55IHByb2JsZW0uIEFsc28gSSB3cm90ZSBhIGZ1bmN0aW9uIHdkNzAwMF9zZXR1cCwKKyAqICBzbyBub3cgeW91IGNhbiBlbnRlciBXRC03MDAwIGRlZmluaXRpb24gYXMga2VybmVsIGFyZ3VtZW50cywKKyAqICBhcyBpbiBsaWxvLmNvbmY6CisgKgorICogICAgIGFwcGVuZD0id2Q3MDAwPUlSUSxETUEsSU8iCisgKgorICogIFBTOiBJZiBjYXJkIEJJT1MgUk9NIGlzIGRpc2FibGVkLCBmdW5jdGlvbiB3ZDcwMDBfZGV0ZWN0IG5vdyB3aWxsIHJlY29nbml6ZQorICogICAgICBhZGFwdGVyLCB1bmxpa2UgdGhlIG9sZCBvbmUuIEFueXdheSwgQklPUyBST00gZnJvbSBXRDcwMDAgYWRhcHRlciBpcworICogICAgICB1c2VsZXNzIGZvciBMaW51eC4gQl4pCisgKgorICoKKyAqICAwOS8wNi8xOTk2LgorICoKKyAqICBBdXRvZGV0ZWN0aW5nIG9mIEkvTyBiYXNlIGFkZHJlc3MgZnJvbSB3ZDcwMDBfZGV0ZWN0IGZ1bmN0aW9uIGlzIHJlbW92ZWQsCisgKiAgc29tZSBsaXR0bGUgYnVncyByZW1vdmVkLCBldGMuLi4KKyAqCisgKiAgVGhhbmtzIHRvIFJvZ2VyIFNjb3R0IGZvciBkcml2ZXIgZGVidWdnaW5nLgorICoKKyAqICAwNi8wNy8xOTk3CisgKgorICogIEFkZGVkIHN1cHBvcnQgZm9yIC9wcm9jIGZpbGUgc3lzdGVtICgvcHJvYy9zY3NpL3dkNzAwMC9bMC4uLl0gZmlsZXMpLgorICogIE5vdywgZHJpdmVyIGNhbiBoYW5kbGUgaGFyZCBkaXNrcyB3aXRoIGNhcGFjaXR5ID4xR0IuCisgKgorICogIDAxLzE1LzE5OTgKKyAqCisgKiAgQWRkZWQgc3VwcG9ydCBmb3IgQlVTX09OIGFuZCBCVVNfT0ZGIHBhcmFtZXRlcnMgaW4gY29uZmlnIGxpbmUuCisgKiAgTWlzY2VsbGFuZW91cyBjbGVhbnVwLgorICoKKyAqICAwMy8wMS8xOTk4CisgKgorICogIFdENzAwMCBkcml2ZXIgbm93IHdvcmsgb24ga2VybmVscyA+PSAyLjEueAorICoKKyAqCisgKiAxMi8zMS8yMDAxIC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogdXNlIGhvc3QtPmhvc3RfbG9jaywgbm90IGlvX3JlcXVlc3RfbG9jaywgY2xlYW51cHMKKyAqCisgKiAyMDAyLzEwLzA0IC0gQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKiBVc2UgZGV2X2lkIGZvciBpbnRlcnJ1cHRzLCBraWxsIF9fRlVOQ1RJT05fXyBwYXN0aW5nCisgKiBBZGQgYSBsb2NrIGZvciB0aGUgc2NiIHBvb2wsIGNsZWFuIHVwIGFsbCBvdGhlciBjbGkvc3RpIHVzYWdlIHN0dWZmCisgKiBVc2UgdGhlIGFkYXB0ZXIgbG9jayBmb3IgdGhlIG90aGVyIHBsYWNlcyB3ZSBoYWQgdGhlIGNsaSdzCisgKgorICogMjAwMi8xMC8wNiAtIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogU3dpdGNoIHRvIG5ldyBzdHlsZSBlcnJvciBoYW5kbGluZworICogQ2xlYW4gdXAgZGVsYXkgdG8gdWRlbGF5LCBhbmQgeWllbGRpbmcgc2xlZXBzCisgKiBNYWtlIGhvc3QgcmVzZXQgYWN0dWFsbHkgcmVzZXQgdGhlIGNhcmQKKyAqIE1ha2UgZXZlcnl0aGluZyBzdGF0aWMKKyAqCisgKiAyMDAzLzAyLzEyIC0gQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgorICoKKyAqIENsZWFuZWQgdXAgaG9zdCB0ZW1wbGF0ZSBkZWZpbnRpb24KKyAqIFJlbW92ZWQgbm93IG9ic29sZXRlIHdkNzAwMC5oCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgorCisKKyN1bmRlZiAgV0Q3MDAwX0RFQlVHCQkvKiBnZW5lcmFsIGRlYnVnICAgICAgICAgICAgICAgICovCisjaWZkZWYgV0Q3MDAwX0RFQlVHCisjZGVmaW5lIGRwcmludGsgcHJpbnRrCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKy8qCisgKiAgTWFpbGJveCBzdHJ1Y3R1cmUgc2l6ZXMuCisgKiAgSSBwcmVmZXIgdG8ga2VlcCB0aGUgbnVtYmVyIG9mIElDTUJzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZgorICogIE9HTUJzLiAgT0dNQnMgYXJlIHVzZWQgdmVyeSBxdWlja2x5IGJ5IHRoZSBkcml2ZXIgdG8gc3RhcnQgb25lIG9yCisgKiAgbW9yZSBjb21tYW5kcywgd2hpbGUgSUNNQnMgYXJlIHVzZWQgYnkgdGhlIGhvc3QgYWRhcHRlciBwZXIgY29tbWFuZC4KKyAqLworI2RlZmluZSBPR01CX0NOVAkxNgorI2RlZmluZSBJQ01CX0NOVAkzMgorCisvKgorICogIFNjYidzIGFyZSBzaGFyZWQgYnkgYWxsIGFjdGl2ZSBhZGFwdGVycy4gIFNvLCBpZiB0aGV5IGFsbCBiZWNvbWUgYnVzeSwKKyAqICBjYWxsZXJzIG1heSBiZSBtYWRlIHRvIHdhaXQgaW4gYWxsb2Nfc2NicyBmb3IgdGhlbSB0byBmcmVlLiAgVGhhdCBjYW4KKyAqICBiZSBhdm9pZGVkIGJ5IHNldHRpbmcgTUFYX1NDQlMgdG8gTlVNX0NPTkZJRyAqIFdENzAwMF9RLiAgSWYgeW91J2QKKyAqICByYXRoZXIgY29uc2VydmUgbWVtb3J5LCB1c2UgYSBzbWFsbGVyIG51bWJlciAoPiAwLCBvZiBjb3Vyc2UpIC0gdGhpbmdzCisgKiAgd2lsbCBzaG91bGQgc3RpbGwgd29yayBPSy4KKyAqLworI2RlZmluZSBNQVhfU0NCUyAgICAgICAgMzIKKworLyoKKyAqICBJbiB0aGlzIHZlcnNpb24sIHNnX3RhYmxlc2l6ZSBub3cgZGVmYXVsdHMgdG8gV0Q3MDAwX1NHLCBhbmQgd2lsbAorICogIGJlIHNldCB0byBTR19OT05FIGZvciBvbGRlciBib2FyZHMuICBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIHRoZQorICogIHByZXZpb3VzIGRlZmF1bHQsIGFuZCB3YXMgY2hhbmdlZCBzbyB0aGF0IHRoZSBkcml2ZXItbGV2ZWwKKyAqICBzY3NpX2hvc3RfdGVtcGxhdGUgd291bGQgcmVmbGVjdCB0aGUgZHJpdmVyJ3Mgc3VwcG9ydCBmb3Igc2NhdHRlci8KKyAqICBnYXRoZXIuCisgKgorICogIEFsc28sIGl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgYm9hcmRzIGF0IFJldmlzaW9uIDYgc3VwcG9ydCBzY2F0dGVyLworICogIGdhdGhlciwgc28gdGhlIG5ldyBkZWZpbml0aW9uIG9mIGFuICJvbGRlciIgYm9hcmQgaGFzIGJlZW4gY2hhbmdlZAorICogIGFjY29yZGluZ2x5LgorICovCisjZGVmaW5lIFdENzAwMF9RCTE2CisjZGVmaW5lIFdENzAwMF9TRwkxNgorCisKKy8qCisgKiAgV0Q3MDAwLXNwZWNpZmljIG1haWxib3ggc3RydWN0dXJlCisgKgorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBtYWlsYm94IHsKKwl1bmNoYXIgc3RhdHVzOworCXVuY2hhciBzY2JwdHJbM107CS8qIFNDU0ktc3R5bGUgLSBNU0IgZmlyc3QgKGJpZyBlbmRpYW4pICovCit9IE1haWxib3g7CisKKy8qCisgKiAgVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGNvbnRhaW4gYWxsIHBlci1hZGFwdGVyIGdsb2JhbCBkYXRhLiAgSS5lLiwgYW55CisgKiAgbmV3IGdsb2JhbCBwZXItYWRhcHRlciBkYXRhIHNob3VsZCBwdXQgaW4gaGVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWRhcHRlciB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2g7CS8qIFBvaW50ZXIgdG8gU2NzaV9Ib3N0IHN0cnVjdHVyZSAgICAqLworCWludCBpb2Jhc2U7CQkvKiBUaGlzIGFkYXB0ZXIncyBJL08gYmFzZSBhZGRyZXNzICAgKi8KKwlpbnQgaXJxOwkJLyogVGhpcyBhZGFwdGVyJ3MgSVJRIGxldmVsICAgICAgICAgICovCisJaW50IGRtYTsJCS8qIFRoaXMgYWRhcHRlcidzIERNQSBjaGFubmVsICAgICAgICAqLworCWludCBpbnRfY291bnRlcjsJLyogVGhpcyBhZGFwdGVyJ3MgaW50ZXJydXB0IGNvdW50ZXIgICovCisJaW50IGJ1c19vbjsJCS8qIFRoaXMgYWRhcHRlcidzIEJVU19PTiB0aW1lICAgICAgICAqLworCWludCBidXNfb2ZmOwkJLyogVGhpcyBhZGFwdGVyJ3MgQlVTX09GRiB0aW1lICAgICAgICovCisJc3RydWN0IHsJCS8qIFRoaXMgYWRhcHRlcidzIG1haWxib3hlcyAgICAgICAgICAqLworCQlNYWlsYm94IG9nbWJbT0dNQl9DTlRdOwkvKiBPdXRnb2luZyBtYWlsYm94ZXMgICAgICAgICAgICAgICAgKi8KKwkJTWFpbGJveCBpY21iW0lDTUJfQ05UXTsJLyogSW5jb21pbmcgbWFpbGJveGVzICAgICAgICAgICAgICAgICovCisJfSBtYjsKKwlpbnQgbmV4dF9vZ21iOwkJLyogdG8gcmVkdWNlIGNvbnRlbnRpb24gYXQgbWFpbGJveGVzICovCisJdW5jaGFyIGNvbnRyb2w7CQkvKiBzaGFkb3dzIENPTlRST0wgcG9ydCB2YWx1ZSAgICAgICAgKi8KKwl1bmNoYXIgcmV2MSwgcmV2MjsJLyogZmlsbGVkIGluIGJ5IHdkNzAwMF9yZXZpc2lvbiAgICAgICovCit9IEFkYXB0ZXI7CisKKy8qCisgKiAobGluZWFyKSBiYXNlIGFkZHJlc3MgZm9yIFJPTSBCSU9TCisgKi8KK3N0YXRpYyBjb25zdCBsb25nIHdkNzAwMF9iaW9zYWRkcltdID0geworCTB4YzAwMDAsIDB4YzIwMDAsIDB4YzQwMDAsIDB4YzYwMDAsIDB4YzgwMDAsIDB4Y2EwMDAsIDB4Y2MwMDAsIDB4Y2UwMDAsCisJMHhkMDAwMCwgMHhkMjAwMCwgMHhkNDAwMCwgMHhkNjAwMCwgMHhkODAwMCwgMHhkYTAwMCwgMHhkYzAwMCwgMHhkZTAwMAorfTsKKyNkZWZpbmUgTlVNX0FERFJTIChzaXplb2Yod2Q3MDAwX2Jpb3NhZGRyKS9zaXplb2YobG9uZykpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3ZDcwMDBfaW9iYXNlW10gPSB7CisJMHgwMzAwLCAweDAzMDgsIDB4MDMxMCwgMHgwMzE4LCAweDAzMjAsIDB4MDMyOCwgMHgwMzMwLCAweDAzMzgsCisJMHgwMzQwLCAweDAzNDgsIDB4MDM1MCwgMHgwMzU4LCAweDAzNjAsIDB4MDM2OCwgMHgwMzcwLCAweDAzNzgsCisJMHgwMzgwLCAweDAzODgsIDB4MDM5MCwgMHgwMzk4LCAweDAzYTAsIDB4MDNhOCwgMHgwM2IwLCAweDAzYjgsCisJMHgwM2MwLCAweDAzYzgsIDB4MDNkMCwgMHgwM2Q4LCAweDAzZTAsIDB4MDNlOCwgMHgwM2YwLCAweDAzZjgKK307CisjZGVmaW5lIE5VTV9JT1BPUlRTIChzaXplb2Yod2Q3MDAwX2lvYmFzZSkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkKKworc3RhdGljIGNvbnN0IHNob3J0IHdkNzAwMF9pcnFbXSA9IHsgMywgNCwgNSwgNywgOSwgMTAsIDExLCAxMiwgMTQsIDE1IH07CisjZGVmaW5lIE5VTV9JUlFTIChzaXplb2Yod2Q3MDAwX2lycSkvc2l6ZW9mKHNob3J0KSkKKworc3RhdGljIGNvbnN0IHNob3J0IHdkNzAwMF9kbWFbXSA9IHsgNSwgNiwgNyB9OworI2RlZmluZSBOVU1fRE1BUyAoc2l6ZW9mKHdkNzAwMF9kbWEpL3NpemVvZihzaG9ydCkpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIHNldCB1cCBieSB3ZDcwMDBfZGV0ZWN0LCBhbmQgdXNlZCB0aGVyZWFmdGVyIGZvcgorICogcHJvYyBhbmQgb3RoZXIgZ2xvYmFsIG9va3VwcworICovCisKKyNkZWZpbmUgVU5JVFMJOAorc3RhdGljIHN0cnVjdCBTY3NpX0hvc3QgKndkNzAwMF9ob3N0W1VOSVRTXTsKKworI2RlZmluZSBCVVNfT04gICAgNjQJCS8qIHggMTI1bnMgPSA4MDAwbnMgKEJJT1MgZGVmYXVsdCkgKi8KKyNkZWZpbmUgQlVTX09GRiAgIDE1CQkvKiB4IDEyNW5zID0gMTg3NW5zIChCSU9TIGRlZmF1bHQpICovCisKKy8qCisgKiAgU3RhbmRhcmQgQWRhcHRlciBDb25maWd1cmF0aW9ucyAtIHVzZWQgYnkgd2Q3MDAwX2RldGVjdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisJc2hvcnQgaXJxOwkJLyogSVJRIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJc2hvcnQgZG1hOwkJLyogRE1BIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW9iYXNlOwkvKiBJL08gYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlzaG9ydCBidXNfb247CQkvKiBUaW1lIHRoYXQgV0Q3MDAwIHNwZW5kcyBvbiB0aGUgQVQtYnVzIHdoZW4gKi8KKwkvKiB0cmFuc2ZlcnJpbmcgZGF0YS4gQklPUyBkZWZhdWx0IGlzIDgwMDBucy4gKi8KKwlzaG9ydCBidXNfb2ZmOwkJLyogVGltZSB0aGF0IFdENzAwMCBzcGVuZHMgT0ZGIFRIRSBCVVMgYWZ0ZXIgICovCisJLyogd2hpbGUgaXQgaXMgdHJhbnNmZXJyaW5nIGRhdGEuICAgICAgICAgICAgICovCisJLyogQklPUyBkZWZhdWx0IGlzIDE4NzVucyAgICAgICAgICAgICAgICAgICAgICovCit9IENvbmZpZzsKKworLyoKKyAqIEFkZCBoZXJlIHlvdXIgY29uZmlndXJhdGlvbi4uLgorICovCitzdGF0aWMgQ29uZmlnIGNvbmZpZ3NbXSA9IHsKKwl7MTUsIDYsIDB4MzUwLCBCVVNfT04sIEJVU19PRkZ9LAkvKiBkZWZhdWx0cyBmb3Igc2luZ2xlIGFkYXB0ZXIgKi8KKwl7MTEsIDUsIDB4MzIwLCBCVVNfT04sIEJVU19PRkZ9LAkvKiBkZWZhdWx0cyBmb3Igc2Vjb25kIGFkYXB0ZXIgKi8KKwl7NywgNiwgMHgzNTAsIEJVU19PTiwgQlVTX09GRn0sCS8qIE15IGNvbmZpZ3VyYXRpb24gKFphZ2EpICAgICAqLworCXstMSwgLTEsIDB4MCwgQlVTX09OLCBCVVNfT0ZGfQkvKiBFbXB0eSBzbG90ICAgICAgICAgICAgICAgICAgKi8KK307CisjZGVmaW5lIE5VTV9DT05GSUdTIChzaXplb2YoY29uZmlncykvc2l6ZW9mKENvbmZpZykpCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBsaXN0IGRlZmluZXMgc3RyaW5ncyB0byBsb29rIGZvciBpbiB0aGUgQklPUyB0aGF0IGlkZW50aWZ5CisgKiAgaXQgYXMgdGhlIFdENzAwMC1GQVNTVDIgU1NUIEJJT1MuICBJIHN1c3BlY3QgdGhhdCBzb21ldGhpbmcgc2hvdWxkIGJlCisgKiAgYWRkZWQgZm9yIHRoZSBGdXR1cmUgRG9tYWluIHZlcnNpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHNpZ25hdHVyZSB7CisJY29uc3QgY2hhciAqc2lnOwkvKiBTdHJpbmcgdG8gbG9vayBmb3IgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgb2ZzOwkvKiBvZmZzZXQgZnJvbSBCSU9TIGJhc2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgICAgICAgICAgICAgICovCit9IFNpZ25hdHVyZTsKKworc3RhdGljIGNvbnN0IFNpZ25hdHVyZSBzaWduYXR1cmVzW10gPSB7CisJeyJTU1RCSU9TIiwgMHgwMDAwZCwgN30JLyogIlNTVEJJT1MiIEAgb2Zmc2V0IDB4MDAwMGQgKi8KK307CisjZGVmaW5lIE5VTV9TSUdOQVRVUkVTIChzaXplb2Yoc2lnbmF0dXJlcykvc2l6ZW9mKFNpZ25hdHVyZSkpCisKKworLyoKKyAqICBJL08gUG9ydCBPZmZzZXRzIGFuZCBCaXQgRGVmaW5pdGlvbnMKKyAqICA0IGFkZHJlc3NlcyBhcmUgdXNlZC4gIFRob3NlIG5vdCBkZWZpbmVkIGhlcmUgYXJlIHJlc2VydmVkLgorICovCisjZGVmaW5lIEFTQ19TVEFUICAgICAgICAwCS8qIFN0YXR1cywgIFJlYWQgICAgICAgICAgKi8KKyNkZWZpbmUgQVNDX0NPTU1BTkQgICAgIDAJLyogQ29tbWFuZCwgV3JpdGUgICAgICAgICAqLworI2RlZmluZSBBU0NfSU5UUl9TVEFUICAgMQkvKiBJbnRlcnJ1cHQgU3RhdHVzLCBSZWFkICovCisjZGVmaW5lIEFTQ19JTlRSX0FDSyAgICAxCS8qIEFja25vd2xlZGdlLCBXcml0ZSAgICAgKi8KKyNkZWZpbmUgQVNDX0NPTlRST0wgICAgIDIJLyogQ29udHJvbCwgV3JpdGUgICAgICAgICAqLworCisvKgorICogQVNDIFN0YXR1cyBQb3J0CisgKi8KKyNkZWZpbmUgSU5UX0lNCQkweDgwCS8qIEludGVycnVwdCBJbWFnZSBGbGFnICAgICAgICAgICAqLworI2RlZmluZSBDTURfUkRZCQkweDQwCS8qIENvbW1hbmQgUG9ydCBSZWFkeSAgICAgICAgICAgICAqLworI2RlZmluZSBDTURfUkVKCQkweDIwCS8qIENvbW1hbmQgUG9ydCBCeXRlIFJlamVjdGVkICAgICAqLworI2RlZmluZSBBU0NfSU5JVCAgICAgICAgMHgxMAkvKiBBU0MgSW5pdGlhbGl6ZWQgRmxhZyAgICAgICAgICAgKi8KKyNkZWZpbmUgQVNDX1NUQVRNQVNLICAgIDB4ZjAJLyogVGhlIGxvd2VyIDQgQnl0ZXMgYXJlIHJlc2VydmVkICovCisKKy8qCisgKiBDT01NQU5EIG9wY29kZXMKKyAqCisgKiAgVW5mb3J0dW5hdGVseSwgSSBoYXZlIG5vIGlkZWEgaG93IHRvIHByb3Blcmx5IHVzZSBzb21lIG9mIHRoZXNlIGNvbW1hbmRzLAorICogIGFzIHRoZSBPRU0gbWFudWFsIGRvZXMgbm90IG1ha2UgaXQgY2xlYXIuICBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byB1c2UKKyAqICBlbmFibGUvZGlzYWJsZSB1bnNvbGljaXRlZCBpbnRlcnJ1cHRzIG9yIHRoZSByZXNldCBjb21tYW5kcyB3aXRoIGFueQorICogIGRpc2Nlcm5pYmxlIGVmZmVjdCB3aGF0c29ldmVyLiAgSSB0aGluayB0aGV5IG1heSBiZSByZWxhdGVkIHRvIGNlcnRhaW4KKyAqICBJQ0IgY29tbWFuZHMsIGJ1dCBhZ2FpbiwgdGhlIE9FTSBtYW51YWwgZG9lc24ndCBtYWtlIHRoYXQgY2xlYXIuCisgKi8KKyNkZWZpbmUgTk9fT1AgICAgICAgICAgICAgMAkvKiBOTy1PUCB0b2dnbGVzIENNRF9SRFkgYml0IGluIEFTQ19TVEFUICAqLworI2RlZmluZSBJTklUSUFMSVpBVElPTiAgICAxCS8qIGluaXRpYWxpemF0aW9uICgxMCBieXRlcykgICAgICAgICAgICAgICovCisjZGVmaW5lIERJU0FCTEVfVU5TX0lOVFIgIDIJLyogZGlzYWJsZSB1bnNvbGljaXRlZCBpbnRlcnJ1cHRzICAgICAgICAgKi8KKyNkZWZpbmUgRU5BQkxFX1VOU19JTlRSICAgMwkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgaW50ZXJydXB0cyAgICAgICAgICAqLworI2RlZmluZSBJTlRSX09OX0ZSRUVfT0dNQiA0CS8qIGludGVycnVwdCBvbiBmcmVlIE9HTUIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNPRlRfUkVTRVQgICAgICAgIDUJLyogU0NTSSBidXMgc29mdCByZXNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFSRF9SRVNFVF9BQ0sgICAgNgkvKiBTQ1NJIGJ1cyBoYXJkIHJlc2V0IGFja25vd2xlZGdlICAgICAgICAqLworI2RlZmluZSBTVEFSVF9PR01CICAgICAgICAweDgwCS8qIHN0YXJ0IGNvbW1hbmQgaW4gT0dNQiAobikgICAgICAgICAgICAgICovCisjZGVmaW5lIFNDQU5fT0dNQlMgICAgICAgIDB4YzAJLyogc3RhcnQgbXVsdGlwbGUgY29tbWFuZHMsIHNpZ25hdHVyZSAobikgKi8KKwkJCQkvKiAgICB3aGVyZSAobikgPSBsb3dlciA2IGJpdHMgICAgICAgICAgICAqLworLyoKKyAqIEZvciBJTklUSUFMSVpBVElPTjoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaW5pdENtZCB7CisJdW5jaGFyIG9wOwkJLyogY29tbWFuZCBvcGNvZGUgKD0gMSkgICAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIElEOwkJLyogQWRhcHRlcidzIFNDU0kgSUQgICAgICAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIGJ1c19vbjsJCS8qIEJ1cyBvbiB0aW1lLCB4IDEyNW5zIChzZWUgYmVsb3cpICAgICAgICAqLworCXVuY2hhciBidXNfb2ZmOwkJLyogQnVzIG9mZiB0aW1lLCAiIiAgICAgICAgICIiICAgICAgICAgICAgICovCisJdW5jaGFyIHJzdmQ7CQkvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgbWFpbGJveGVzWzNdOwkvKiBBZGRyZXNzIG9mIE1haWxib3hlcywgTVNCIGZpcnN0ICAgICAgICAgKi8KKwl1bmNoYXIgb2dtYnM7CQkvKiBOdW1iZXIgb2Ygb3V0Z29pbmcgTUJzLCBtYXggNjQsIDAsMSA9IDEgKi8KKwl1bmNoYXIgaWNtYnM7CQkvKiBOdW1iZXIgb2YgaW5jb21pbmcgTUJzLCAgICIiICAgICAgICIiICAgKi8KK30gSW5pdENtZDsKKworLyoKKyAqIEludGVycnVwdCBTdGF0dXMgUG9ydCAtIGFsc28gcmV0dXJucyBkaWFnbm9zdGljIGNvZGVzIGF0IEFTQyByZXNldAorICoKKyAqIGlmIG1zYiBpcyB6ZXJvLCB0aGUgbG93ZXIgYml0cyBhcmUgZGlhZ25vc3RpYyBzdGF0dXMKKyAqIERpYWdub3N0aWNzOgorICogMDEgICBObyBkaWFnbm9zdGljIGVycm9yIG9jY3VycmVkCisgKiAwMiAgIFJBTSBmYWlsdXJlCisgKiAwMyAgIEZJRk8gUi9XIGZhaWxlZAorICogMDQgICBTQklDIHJlZ2lzdGVyIHJlYWQvd3JpdGUgZmFpbGVkCisgKiAwNSAgIEluaXRpYWxpemF0aW9uIEQtRkYgZmFpbGVkCisgKiAwNiAgIEhvc3QgSVJRIEQtRkYgZmFpbGVkCisgKiAwNyAgIFJPTSBjaGVja3N1bSBlcnJvcgorICogSW50ZXJydXB0IHN0YXR1cyAoYml0d2lzZSk6CisgKiAxME5OTk5OTiAgIG91dGdvaW5nIG1haWxib3ggTk5OTk5OIGlzIGZyZWUKKyAqIDExTk5OTk5OICAgaW5jb21pbmcgbWFpbGJveCBOTk5OTk4gbmVlZHMgc2VydmljZQorICovCisjZGVmaW5lIE1CX0lOVFIgICAgMHhDMAkJLyogTWFpbGJveCBTZXJ2aWNlIHBvc3NpYmxlL3JlcXVpcmVkICovCisjZGVmaW5lIElNQl9JTlRSICAgMHg0MAkJLyogMSBJbmNvbWluZyAvIDAgT3V0Z29pbmcgICAgICAgICAgICovCisjZGVmaW5lIE1CX01BU0sgICAgMHgzZgkJLyogbWFzayBmb3IgbWFpbGJveCBudW1iZXIgICAgICAgICAgICovCisKKy8qCisgKiBDT05UUk9MIHBvcnQgYml0cworICovCisjZGVmaW5lIElOVF9FTiAgICAgMHgwOAkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBETUFfRU4gICAgIDB4MDQJCS8qIERNQSBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgU0NTSV9SRVMgICAweDAyCQkvKiBTQ1NJIFJlc2V0ICAgICAgICovCisjZGVmaW5lIEFTQ19SRVMgICAgMHgwMQkJLyogQVNDIFJlc2V0ICAgICAgICAqLworCisvKgorICogRHJpdmVyIGRhdGEgc3RydWN0dXJlczoKKyAqICAgLSBtYiBhbmQgc2NicyBhcmUgcmVxdWlyZWQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIGhvc3QgYWRhcHRlci4KKyAqICAgICBBbiBTQ0IgaGFzIGV4dHJhIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgYWRhcHRlcjsgbWIncworICogICAgIF9jYW5ub3RfIGRvIHRoaXMsIHNpbmNlIHRoZSBhZGFwdGVyIGFzc3VtZXMgdGhleSBhcmUgY29udGlndW91cyBpbgorICogICAgIG1lbW9yeSwgNCBieXRlcyBlYWNoLCB3aXRoIElDTUJzIGZvbGxvd2luZyBPR01CcywgYW5kIHVzZXMgdGhpcyBmYWN0CisgKiAgICAgdG8gYWNjZXNzIHRoZW0uCisgKiAgIC0gQW4gaWNiIGlzIGZvciBob3N0LW9ubHkgKG5vbi1TQ1NJKSBjb21tYW5kcy4gIElDQnMgYXJlIDE2IGJ5dGVzIGVhY2g7CisgKiAgICAgdGhlIGFkZGl0aW9uYWwgYnl0ZXMgYXJlIHVzZWQgb25seSBieSB0aGUgZHJpdmVyLgorICogICAtIEZvciBub3csIGEgcG9vbCBvZiBTQ0JzIGFyZSBrZXB0IGluIGdsb2JhbCBzdG9yYWdlIGJ5IHRoaXMgZHJpdmVyLAorICogICAgIGFuZCBhcmUgYWxsb2NhdGVkIGFuZCBmcmVlZCBhcyBuZWVkZWQuCisgKgorICogIFRoZSA3MDAwLUZBU1NUMiBtYXJrcyBPR01CcyBlbXB0eSBhcyBzb29uIGFzIGl0IGhhcyBfc3RhcnRlZF8gYSBjb21tYW5kLAorICogIG5vdCB3aGVuIGl0IGhhcyBmaW5pc2hlZC4gIFNpbmNlIHRoZSBTQ0IgbXVzdCBiZSBhcm91bmQgZm9yIGNvbXBsZXRpb24sCisgKiAgcHJvYmxlbXMgYXJpc2Ugd2hlbiBTQ0JzIGNvcnJlc3BvbmQgdG8gT0dNQnMsIHdoaWNoIG1heSBiZSByZWFsbG9jYXRlZAorICogIGVhcmxpZXIgKG9yIGRlbGF5ZWQgdW5uZWNlc3NhcmlseSB1bnRpbCBhIGNvbW1hbmQgY29tcGxldGVzKS4KKyAqICBNYWlsYm94ZXMgYXJlIHVzZWQgYXMgdHJhbnNpZW50IGRhdGEgc3RydWN0dXJlcywgc2ltcGx5IGZvcgorICogIGNhcnJ5aW5nIFNDQiBhZGRyZXNzZXMgdG8vZnJvbSB0aGUgNzAwMC1GQVNTVDIuCisgKgorICogIE5vdGUgYWxzbyBzaW5jZSBTQ0JzIGFyZSBub3QgInBlcm1hbmVudGx5IiBhc3NvY2lhdGVkIHdpdGggbWFpbGJveGVzLAorICogIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCBhIGdsb2JhbCBsaXN0IG9mIHNjc2lfY21uZCBwb2ludGVycyBpbmRleGVkCisgKiAgYnkgT0dNQi4gICBBZ2FpbiwgU0NCcyByZWZlcmVuY2UgdGhlaXIgc2NzaV9jbW5kcyBkaXJlY3RseSwgc28gbWFpbGJveAorICogIGluZGljZXMgbmVlZCBub3QgYmUgaW52b2x2ZWQuCisgKi8KKworLyoKKyAqICBXRDcwMDAtc3BlY2lmaWMgc2NhdHRlci9nYXRoZXIgZWxlbWVudCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2diIHsKKwl1bmNoYXIgbGVuWzNdOworCXVuY2hhciBwdHJbM107CQkvKiBBbHNvIFNDU0ktc3R5bGUgLSBNU0IgZmlyc3QgKi8KK30gU2diOworCit0eXBlZGVmIHN0cnVjdCBzY2IgewkJLyogQ29tbWFuZCBDb250cm9sIEJsb2NrIDUuNC4xICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgb3A7CQkvKiBDb21tYW5kIENvbnRyb2wgQmxvY2sgT3BlcmF0aW9uIENvZGUgICAgICAqLworCXVuY2hhciBpZGx1bjsJCS8qIG9wPTAsMjpUYXJnZXQgSWQsIG9wPTE6SW5pdGlhdG9yIElkICAgICAgICovCisJLyogT3V0Ym91bmQgZGF0YSB0cmFuc2ZlciwgbGVuZ3RoIGlzIGNoZWNrZWQgKi8KKwkvKiBJbmJvdW5kIGRhdGEgdHJhbnNmZXIsIGxlbmd0aCBpcyBjaGVja2VkICAqLworCS8qIExvZ2ljYWwgVW5pdCBOdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIGNkYlsxMl07CQkvKiBTQ1NJIENvbW1hbmQgQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIFNDU0kgUmV0dXJuIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogVmVuZG9yIFVuaXF1ZSBFcnJvciBDb2RlICAgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgbWF4bGVuWzNdOwkvKiBNYXhpbXVtIERhdGEgVHJhbnNmZXIgTGVuZ3RoICAgICAgICAgICAgICAqLworCXVuY2hhciBkYXRhcHRyWzNdOwkvKiBTQ1NJIERhdGEgQmxvY2sgUG9pbnRlciAgICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBsaW5rcHRyWzNdOwkvKiBOZXh0IENvbW1hbmQgTGluayBQb2ludGVyICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBkaXJlYzsJCS8qIFRyYW5zZmVyIERpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIHJlc2VydmVkMls2XTsJLyogU0NTSSBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sgICAgICAgICAgICAgKi8KKwkvKiBlbmQgb2YgaGFyZHdhcmUgU0NCICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50Oy8qIHNjc2lfY21uZCB1c2luZyB0aGlzIFNDQiAgICAgICAgICAgICAgICAgICovCisJU2diIHNnYltXRDcwMDBfU0ddOwkvKiBTY2F0dGVyL2dhdGhlciBsaXN0IGZvciB0aGlzIFNDQiAgICAgICAgICAqLworCUFkYXB0ZXIgKmhvc3Q7CQkvKiBob3N0IGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBzY2IgKm5leHQ7CS8qIGZvciBsaXN0cyBvZiBzY2JzICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IFNjYjsKKworLyoKKyAqICBUaGlzIGRyaXZlciBpcyB3cml0dGVuIHRvIGFsbG93IGhvc3Qtb25seSBjb21tYW5kcyB0byBiZSBleGVjdXRlZC4KKyAqICBUaGVzZSB1c2UgYSAxNi1ieXRlIGJsb2NrIGNhbGxlZCBhbiBJQ0IuICBUaGUgZm9ybWF0IGlzIGV4dGVuZGVkIGJ5IHRoZQorICogIGRyaXZlciB0byAxOCBieXRlcywgdG8gc3VwcG9ydCB0aGUgc3RhdHVzIHJldHVybmVkIGluIHRoZSBJQ01CIGFuZAorICogIGFuIGV4ZWN1dGlvbiBwaGFzZSBjb2RlLgorICoKKyAqICBUaGVyZSBhcmUgb3RoZXIgZm9ybWF0cyBiZXNpZGVzIHRoZXNlOyB0aGVzZSBhcmUgdGhlIG9uZXMgSSd2ZSB0cmllZAorICogIHRvIHVzZS4gIEZvcm1hdHMgZm9yIHNvbWUgb2YgdGhlIGRlZmluZWQgSUNCIG9wY29kZXMgYXJlIG5vdCBkZWZpbmVkCisgKiAgKG5vdGFibHksIGdldC9zZXQgdW5zb2xpY2l0ZWQgaW50ZXJydXB0IHN0YXR1cykgaW4gbXkgY29weSBvZiB0aGUgT0VNCisgKiAgbWFudWFsLCBhbmQgb3RoZXJzIGFyZSBhbWJpZ3VvdXMvaGFyZCB0byBmb2xsb3cuCisgKi8KKyNkZWZpbmUgSUNCX09QX01BU0sgICAgICAgICAgIDB4ODAJLyogZGlzdGluZ3Vpc2hlcyBzY2JzIGZyb20gaWNicyAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX09QRU5fUkJVRiAgICAgIDB4ODAJLyogb3BlbiByZWNlaXZlIGJ1ZmZlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1JFQ1ZfQ01EICAgICAgIDB4ODEJLyogcmVjZWl2ZSBjb21tYW5kIGZyb20gaW5pdGlhdG9yICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1JFQ1ZfREFUQSAgICAgIDB4ODIJLyogcmVjZWl2ZSBkYXRhIGZyb20gaW5pdGlhdG9yICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1JFQ1ZfU0RBVEEgICAgIDB4ODMJLyogcmVjZWl2ZSBkYXRhIHdpdGggc3RhdHVzIGZyb20gaW5pdC4gKi8KKyNkZWZpbmUgSUNCX09QX1NFTkRfREFUQSAgICAgIDB4ODQJLyogc2VuZCBkYXRhIHdpdGggc3RhdHVzIHRvIGluaXRpYXRvciAgKi8KKyNkZWZpbmUgSUNCX09QX1NFTkRfU1RBVCAgICAgIDB4ODYJLyogc2VuZCBjb21tYW5kIHN0YXR1cyB0byBpbml0aWF0b3IgICAgKi8KKwkJCQkJLyogMHg4NyBpcyByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1JFQURfSU5JVCAgICAgIDB4ODgJLyogcmVhZCBpbml0aWFsaXphdGlvbiBieXRlcyAgICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1JFQURfSUQgICAgICAgIDB4ODkJLyogcmVhZCBhZGFwdGVyJ3MgU0NTSSBJRCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1NFVF9VTUFTSyAgICAgIDB4OEEJLyogc2V0IHVuc29saWNpdGVkIGludGVycnVwdCBtYXNrICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX0dFVF9VTUFTSyAgICAgIDB4OEIJLyogcmVhZCB1bnNvbGljaXRlZCBpbnRlcnJ1cHQgbWFzayAgICAgKi8KKyNkZWZpbmUgSUNCX09QX0dFVF9SRVZJU0lPTiAgIDB4OEMJLyogcmVhZCBmaXJtd2FyZSByZXZpc2lvbiBsZXZlbCAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX0RJQUdOT1NUSUNTICAgIDB4OEQJLyogZXhlY3V0ZSBkaWFnbm9zdGljcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX1NFVF9FUEFSTVMgICAgIDB4OEUJLyogc2V0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUNCX09QX0dFVF9FUEFSTVMgICAgIDB4OEYJLyogcmVhZCBleGVjdXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaWNiUmVjdkNtZCB7CisJdW5jaGFyIG9wOworCXVuY2hhciBJRGx1bjsJCS8qIEluaXRpYXRvciBTQ1NJIElEL2x1biAgICAgKi8KKwl1bmNoYXIgbGVuWzNdOwkJLyogY29tbWFuZCBidWZmZXIgbGVuZ3RoICAgICAqLworCXVuY2hhciBwdHJbM107CQkvKiBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzICAgICovCisJdW5jaGFyIHJzdmRbN107CQkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KK30gSWNiUmVjdkNtZDsKKwordHlwZWRlZiBzdHJ1Y3QgaWNiU2VuZFN0YXQgeworCXVuY2hhciBvcDsKKwl1bmNoYXIgSURsdW47CQkvKiBUYXJnZXQgU0NTSSBJRC9sdW4gICAgICAgICAgICAgICAgICAqLworCXVuY2hhciBzdGF0OwkJLyogKG91dGdvaW5nKSBjb21wbGV0aW9uIHN0YXR1cyBieXRlIDEgKi8KKwl1bmNoYXIgcnN2ZFsxMl07CS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiByZXR1cm5lZCAoaWNtYikgc3RhdHVzICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciBwaGFzZTsJLyogdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgKi8KK30gSWNiU2VuZFN0YXQ7CisKK3R5cGVkZWYgc3RydWN0IGljYlJldkx2bCB7CisJdW5jaGFyIG9wOworCXZvbGF0aWxlIHVuY2hhciBwcmltYXJ5OwkvKiBwcmltYXJ5IHJldmlzaW9uIGxldmVsIChyZXR1cm5lZCkgICAqLworCXZvbGF0aWxlIHVuY2hhciBzZWNvbmRhcnk7CS8qIHNlY29uZGFyeSByZXZpc2lvbiBsZXZlbCAocmV0dXJuZWQpICovCisJdW5jaGFyIHJzdmRbMTJdOwkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgICAgICAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHN0YXR1czsJLyogcmV0dXJuZWQgKGljbWIpIHN0YXR1cyAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICovCit9IEljYlJldkx2bDsKKwordHlwZWRlZiBzdHJ1Y3QgaWNiVW5zTWFzayB7CS8qIEknbSB0b3RhbGx5IGd1ZXNzaW5nIGhlcmUgKi8KKwl1bmNoYXIgb3A7CisJdm9sYXRpbGUgdW5jaGFyIG1hc2tbMTRdOwkvKiBtYXNrIGJpdHMgICAgICAgICAgICAgICAgICovCisjaWYgMAorCXVuY2hhciByc3ZkWzEyXTsJLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAqLworI2VuZGlmCisJdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KK30gSWNiVW5zTWFzazsKKwordHlwZWRlZiBzdHJ1Y3QgaWNiRGlhZyB7CisJdW5jaGFyIG9wOworCXVuY2hhciB0eXBlOwkJLyogZGlhZ25vc3RpY3MgdHlwZSBjb2RlICgwLTMpICovCisJdW5jaGFyIGxlblszXTsJCS8qIGJ1ZmZlciBsZW5ndGggICAgICAgICAgICAgICAqLworCXVuY2hhciBwdHJbM107CQkvKiBidWZmZXIgYWRkcmVzcyAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgcnN2ZFs3XTsJCS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgICAqLworCXZvbGF0aWxlIHVuY2hhciBwaGFzZTsJLyogdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAgICovCit9IEljYkRpYWc7CisKKyNkZWZpbmUgSUNCX0RJQUdfUE9XRVJVUCAgIDAJLyogUG93ZXItdXAgZGlhZ3Mgb25seSAgICAgICAqLworI2RlZmluZSBJQ0JfRElBR19XQUxLSU5HICAgMQkvKiB3YWxraW5nIDEncyBwYXR0ZXJuICAgICAgICovCisjZGVmaW5lIElDQl9ESUFHX0RNQSAgICAgICAyCS8qIERNQSAtIHN5c3RlbSBtZW1vcnkgZGlhZ3MgKi8KKyNkZWZpbmUgSUNCX0RJQUdfRlVMTCAgICAgIDMJLyogZG8gYm90aCAxICYgMiAgICAgICAgICAgICAqLworCit0eXBlZGVmIHN0cnVjdCBpY2JQYXJtcyB7CisJdW5jaGFyIG9wOworCXVuY2hhciByc3ZkMTsJCS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgKi8KKwl1bmNoYXIgbGVuWzNdOwkJLyogcGFybXMgYnVmZmVyIGxlbmd0aCAgICAgICAqLworCXVuY2hhciBwdHJbM107CQkvKiBwYXJtcyBidWZmZXIgYWRkcmVzcyAgICAgICovCisJdW5jaGFyIGlkeFsyXTsJCS8qIGluZGV4IChNU0ItTFNCKSAgICAgICAgICAgKi8KKwl1bmNoYXIgcnN2ZDJbNV07CS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgdnVlOwkvKiB2ZW5kb3ItdW5pcXVlIGVycm9yIGNvZGUgICovCisJdm9sYXRpbGUgdW5jaGFyIHN0YXR1czsJLyogcmV0dXJuZWQgKGljbWIpIHN0YXR1cyAgICAqLworCXZvbGF0aWxlIHVuY2hhciBwaGFzZTsJLyogdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAqLworfSBJY2JQYXJtczsKKwordHlwZWRlZiBzdHJ1Y3QgaWNiQW55IHsKKwl1bmNoYXIgb3A7CisJdW5jaGFyIGRhdGFbMTRdOwkvKiBmb3JtYXQtc3BlY2lmaWMgZGF0YSAgICAgICovCisJdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLworCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KKwl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KK30gSWNiQW55OworCit0eXBlZGVmIHVuaW9uIGljYiB7CisJdW5jaGFyIG9wOwkJLyogSUNCIG9wY29kZSAgICAgICAgICAgICAgICAgICAgICovCisJSWNiUmVjdkNtZCByZWN2X2NtZDsJLyogZm9ybWF0IGZvciByZWNlaXZlIGNvbW1hbmQgICAgICovCisJSWNiU2VuZFN0YXQgc2VuZF9zdGF0OwkvKiBmb3JtYXQgZm9yIHNlbmQgc3RhdHVzICAgICAgICAgKi8KKwlJY2JSZXZMdmwgcmV2X2x2bDsJLyogZm9ybWF0IGZvciBnZXQgcmV2aXNpb24gbGV2ZWwgICovCisJSWNiRGlhZyBkaWFnOwkJLyogZm9ybWF0IGZvciBleGVjdXRlIGRpYWdub3N0aWNzICovCisJSWNiUGFybXMgZXBhcm1zOwkvKiBmb3JtYXQgZm9yIGdldC9zZXQgZXhlYyBwYXJtcyAgKi8KKwlJY2JBbnkgaWNiOwkJLyogZ2VuZXJpYyBmb3JtYXQgICAgICAgICAgICAgICAgICovCisJdW5jaGFyIGRhdGFbMThdOworfSBJY2I7CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBjaGFyICp3ZDcwMDA7Cittb2R1bGVfcGFyYW0od2Q3MDAwLCBjaGFycCwgMCk7CisjZW5kaWYKKworLyoKKyAqICBEcml2ZXIgU0NCIHN0cnVjdHVyZSBwb29sLgorICoKKyAqICBUaGUgU0NCcyBkZWNsYXJlZCBoZXJlIGFyZSBzaGFyZWQgYnkgYWxsIGhvc3QgYWRhcHRlcnM7IGhlbmNlLCB0aGlzCisgKiAgc3RydWN0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSBBZGFwdGVyIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIFNjYiBzY2JzW01BWF9TQ0JTXTsKK3N0YXRpYyBTY2IgKnNjYmZyZWU7CQkvKiBmcmVlIGxpc3QgICAgICAgICAqLworc3RhdGljIGludCBmcmVlc2NicyA9IE1BWF9TQ0JTOwkvKiBmcmVlIGxpc3QgY291bnRlciAqLworc3RhdGljIHNwaW5sb2NrX3Qgc2NicG9vbF9sb2NrOwkvKiBndWFyZHMgdGhlIHNjYiBmcmVlIGxpc3QgYW5kIGNvdW50ICovCisKKy8qCisgKiAgRU5EIG9mIGRhdGEvZGVjbGFyYXRpb25zIC0gY29kZSBmb2xsb3dzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfZXJyb3IoY2hhciAqbWVzZywgaW50ICppbnRzKQoreworCWlmIChpbnRzWzBdID09IDMpCisJCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX3NldHVwOiBcIndkNzAwMD0lZCwlZCwweCV4XCIgLT4gJXNcbiIsIGludHNbMV0sIGludHNbMl0sIGludHNbM10sIG1lc2cpOworCWVsc2UgaWYgKGludHNbMF0gPT0gNCkKKwkJcHJpbnRrKEtFUk5fRVJSICJ3ZDcwMDBfc2V0dXA6IFwid2Q3MDAwPSVkLCVkLDB4JXgsJWRcIiAtPiAlc1xuIiwgaW50c1sxXSwgaW50c1syXSwgaW50c1szXSwgaW50c1s0XSwgbWVzZyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMF9zZXR1cDogXCJ3ZDcwMDA9JWQsJWQsMHgleCwlZCwlZFwiIC0+ICVzXG4iLCBpbnRzWzFdLCBpbnRzWzJdLCBpbnRzWzNdLCBpbnRzWzRdLCBpbnRzWzVdLCBtZXNnKTsKK30KKworCisvKgorICogTm90ZTogWW91IGNhbiBub3cgc2V0IHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUga2VybmVsJ3MgImNvbW1hbmQgbGluZSIuCisgKiBUaGUgc3ludGF4IGlzOgorICoKKyAqICAgICB3ZDcwMDA9PElSUT4sPERNQT4sPElPPlssPEJVU19PTj5bLDxCVVNfT0ZGPl1dCisgKgorICogLCB3aGVyZSBCVVNfT04gYW5kIEJVU19PRkYgYXJlIGluIG5hbm9zZWNvbmRzLiBCSU9TIGRlZmF1bHQgdmFsdWVzCisgKiBhcmUgODAwMG5zIGZvciBCVVNfT04gYW5kIDE4NzVucyBmb3IgQlVTX09GRi4KKyAqIGVnOgorICogICAgIHdkNzAwMD03LDYsMHgzNTAKKyAqCisgKiB3aWxsIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBhIFdELTcwMDAgY29udHJvbGxlcgorICogdXNpbmcgSVJRIDE1IHdpdGggYSBETUEgY2hhbm5lbCA2LCBhdCBJTyBiYXNlIGFkZHJlc3MgMHgzNTAuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHdkNzAwMF9zZXR1cChjaGFyICpzdHIpCit7CisJc3RhdGljIHNob3J0IHdkNzAwMF9jYXJkX251bTsJLyogLmJzcyB3aWxsIHplcm8gdGhpcyAqLworCXNob3J0IGk7CisJaW50IGludHNbNl07CisKKwkodm9pZCkgZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlmICh3ZDcwMDBfY2FyZF9udW0gPj0gTlVNX0NPTkZJR1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVG9vIG1hbnkgXCJ3ZDcwMDA9XCIgY29uZmlndXJhdGlvbnMgaW4gIiAiY29tbWFuZCBsaW5lIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChpbnRzWzBdIDwgMykgfHwgKGludHNbMF0gPiA1KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBpbiBjb21tYW5kIGxpbmUhICAiICJVc2FnZTogd2Q3MDAwPTxJUlE+LDxETUE+LElPPlssPEJVU19PTj4iICJbLDxCVVNfT0ZGPl1dXG4iLCBfX0ZVTkNUSU9OX18pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fSVJRUzsgaSsrKQorCQkJaWYgKGludHNbMV0gPT0gd2Q3MDAwX2lycVtpXSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBOVU1fSVJRUykgeworCQkJc2V0dXBfZXJyb3IoImludmFsaWQgSVJRLiIsIGludHMpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmlycSA9IGludHNbMV07CisKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9ETUFTOyBpKyspCisJCQlpZiAoaW50c1syXSA9PSB3ZDcwMDBfZG1hW2ldKQorCQkJCWJyZWFrOworCisJCWlmIChpID09IE5VTV9ETUFTKSB7CisJCQlzZXR1cF9lcnJvcigiaW52YWxpZCBETUEgY2hhbm5lbC4iLCBpbnRzKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5kbWEgPSBpbnRzWzJdOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fSU9QT1JUUzsgaSsrKQorCQkJaWYgKGludHNbM10gPT0gd2Q3MDAwX2lvYmFzZVtpXSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBOVU1fSU9QT1JUUykgeworCQkJc2V0dXBfZXJyb3IoImludmFsaWQgSS9PIGJhc2UgYWRkcmVzcy4iLCBpbnRzKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5pb2Jhc2UgPSBpbnRzWzNdOworCisJCWlmIChpbnRzWzBdID4gMykgeworCQkJaWYgKChpbnRzWzRdIDwgNTAwKSB8fCAoaW50c1s0XSA+IDMxODc1KSkgeworCQkJCXNldHVwX2Vycm9yKCJCVVNfT04gdmFsdWUgaXMgb3V0IG9mIHJhbmdlICg1MDAiICIgdG8gMzE4NzUgbmFub3NlY29uZHMpISIsIGludHMpOworCQkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5idXNfb24gPSBCVVNfT047CisJCQl9IGVsc2UKKwkJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29uID0gaW50c1s0XSAvIDEyNTsKKwkJfSBlbHNlCisJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29uID0gQlVTX09OOworCisJCWlmIChpbnRzWzBdID4gNCkgeworCQkJaWYgKChpbnRzWzVdIDwgNTAwKSB8fCAoaW50c1s1XSA+IDMxODc1KSkgeworCQkJCXNldHVwX2Vycm9yKCJCVVNfT0ZGIHZhbHVlIGlzIG91dCBvZiByYW5nZSAoNTAwIiAiIHRvIDMxODc1IG5hbm9zZWNvbmRzKSEiLCBpbnRzKTsKKwkJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29mZiA9IEJVU19PRkY7CisJCQl9IGVsc2UKKwkJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29mZiA9IGludHNbNV0gLyAxMjU7CisJCX0gZWxzZQorCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgPSBCVVNfT0ZGOworCisJCWlmICh3ZDcwMDBfY2FyZF9udW0pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCAod2Q3MDAwX2NhcmRfbnVtIC0gMSk7IGkrKykgeworCQkJCWludCBqID0gaSArIDE7CisKKwkJCQlmb3IgKDsgaiA8IHdkNzAwMF9jYXJkX251bTsgaisrKQorCQkJCQlpZiAoY29uZmlnc1tpXS5pcnEgPT0gY29uZmlnc1tqXS5pcnEpIHsKKwkJCQkJCXNldHVwX2Vycm9yKCJkdXBsaWNhdGVkIElSUSEiLCBpbnRzKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJaWYgKGNvbmZpZ3NbaV0uZG1hID09IGNvbmZpZ3Nbal0uZG1hKSB7CisJCQkJCXNldHVwX2Vycm9yKCJkdXBsaWNhdGVkIERNQSAiICJjaGFubmVsISIsIGludHMpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJaWYgKGNvbmZpZ3NbaV0uaW9iYXNlID09IGNvbmZpZ3Nbal0uaW9iYXNlKSB7CisJCQkJCXNldHVwX2Vycm9yKCJkdXBsaWNhdGVkIEkvTyAiICJiYXNlIGFkZHJlc3MhIiwgaW50cyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWRwcmludGsoS0VSTl9ERUJVRyAid2Q3MDAwX3NldHVwOiBJUlE9JWQsIERNQT0lZCwgSS9PPTB4JXgsICIKKwkJCSJCVVNfT049JWRucywgQlVTX09GRj0lZG5zXG4iLCBjb25maWdzW3dkNzAwMF9jYXJkX251bV0uaXJxLCBjb25maWdzW3dkNzAwMF9jYXJkX251bV0uZG1hLCBjb25maWdzW3dkNzAwMF9jYXJkX251bV0uaW9iYXNlLCBjb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29uICogMTI1LCBjb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29mZiAqIDEyNSk7CisKKwkJd2Q3MDAwX2NhcmRfbnVtKys7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJ3ZDcwMDA9Iiwgd2Q3MDAwX3NldHVwKTsKKworc3RhdGljIGlubGluZSB2b2lkIGFueTJzY3NpKHVuY2hhciAqIHNjc2ksIGludCBhbnkpCit7CisJKnNjc2krKyA9ICh1bnNpZ25lZClhbnkgPj4gMTY7CisJKnNjc2krKyA9ICh1bnNpZ25lZClhbnkgPj4gODsKKwkqc2NzaSsrID0gYW55OworfQorCitzdGF0aWMgaW5saW5lIGludCBzY3NpMmludCh1bmNoYXIgKiBzY3NpKQoreworCXJldHVybiAoc2NzaVswXSA8PCAxNikgfCAoc2NzaVsxXSA8PCA4KSB8IHNjc2lbMl07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZDcwMDBfZW5hYmxlX2ludHIoQWRhcHRlciAqIGhvc3QpCit7CisJaG9zdC0+Y29udHJvbCB8PSBJTlRfRU47CisJb3V0Yihob3N0LT5jb250cm9sLCBob3N0LT5pb2Jhc2UgKyBBU0NfQ09OVFJPTCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHdkNzAwMF9lbmFibGVfZG1hKEFkYXB0ZXIgKiBob3N0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaG9zdC0+Y29udHJvbCB8PSBETUFfRU47CisJb3V0Yihob3N0LT5jb250cm9sLCBob3N0LT5pb2Jhc2UgKyBBU0NfQ09OVFJPTCk7CisKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJc2V0X2RtYV9tb2RlKGhvc3QtPmRtYSwgRE1BX01PREVfQ0FTQ0FERSk7CisJZW5hYmxlX2RtYShob3N0LT5kbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCit9CisKKworI2RlZmluZSBXQUlUbmV4dHRpbWVvdXQgMjAwCS8qIDIgc2Vjb25kcyAqLworCitzdGF0aWMgaW5saW5lIHNob3J0IFdBSVQodW5zaWduZWQgcG9ydCwgdW5zaWduZWQgbWFzaywgdW5zaWduZWQgYWxsb2YsIHVuc2lnbmVkIG5vbmVvZikKK3sKKwl1bnNpZ25lZCBXQUlUYml0czsKKwl1bnNpZ25lZCBsb25nIFdBSVR0aW1lb3V0ID0gamlmZmllcyArIFdBSVRuZXh0dGltZW91dDsKKworCXdoaWxlICh0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBXQUlUdGltZW91dCkpIHsKKwkJV0FJVGJpdHMgPSBpbmIocG9ydCkgJiBtYXNrOworCisJCWlmICgoKFdBSVRiaXRzICYgYWxsb2YpID09IGFsbG9mKSAmJiAoKFdBSVRiaXRzICYgbm9uZW9mKSA9PSAwKSkKKwkJCXJldHVybiAoMCk7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBjb21tYW5kX291dChBZGFwdGVyICogaG9zdCwgdW5jaGFyICogY21kLCBpbnQgbGVuKQoreworCWlmICghV0FJVChob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCwgQVNDX1NUQVRNQVNLLCBDTURfUkRZLCAwKSkgeworCQl3aGlsZSAobGVuLS0pIHsKKwkJCWRvIHsKKwkJCQlvdXRiKCpjbWQsIGhvc3QtPmlvYmFzZSArIEFTQ19DT01NQU5EKTsKKwkJCQlXQUlUKGhvc3QtPmlvYmFzZSArIEFTQ19TVEFULCBBU0NfU1RBVE1BU0ssIENNRF9SRFksIDApOworCQkJfSB3aGlsZSAoaW5iKGhvc3QtPmlvYmFzZSArIEFTQ19TVEFUKSAmIENNRF9SRUopOworCisJCQljbWQrKzsKKwkJfQorCisJCXJldHVybiAoMSk7CisJfQorCisJcHJpbnRrKEtFUk5fV0FSTklORyAid2Q3MDAwIGNvbW1hbmRfb3V0OiBXQUlUIGZhaWxlZCglZClcbiIsIGxlbiArIDEpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogIFRoaXMgdmVyc2lvbiBvZiBhbGxvY19zY2JzIGlzIGluIHByZXBhcmF0aW9uIGZvciBzdXBwb3J0aW5nIG11bHRpcGxlCisgKiAgY29tbWFuZHMgcGVyIGx1biBhbmQgY29tbWFuZCBjaGFpbmluZywgYnkgcXVldWVpbmcgcGVuZGluZyBjb21tYW5kcy4KKyAqICBXZSB3aWxsIG5lZWQgdG8gYWxsb2NhdGUgU2NicyBpbiBibG9ja3Mgc2luY2UgdGhleSB3aWxsIHdhaXQgdG8gYmUKKyAqICBleGVjdXRlZCBzbyB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgb2YgZGVhZGxvY2sgb3RoZXJ3aXNlLgorICogIEFsc28sIHRvIGtlZXAgbGFyZ2VyIHJlcXVlc3RzIGZyb20gYmVpbmcgc3RhcnZlZCBieSBzbWFsbGVyIHJlcXVlc3RzLAorICogIHdlIGxpbWl0IGFjY2VzcyB0byB0aGlzIHJvdXRpbmUgd2l0aCBhbiBpbnRlcm5hbCBidXN5IGZsYWcsIHNvIHRoYXQKKyAqICB0aGUgc2F0aXNmaWFiaWxpdHkgb2YgYSByZXF1ZXN0IGlzIG5vdCBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlCisgKiAgcmVxdWVzdC4KKyAqLworc3RhdGljIGlubGluZSBTY2IgKmFsbG9jX3NjYnMoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgaW50IG5lZWRlZCkKK3sKKwlTY2IgKnNjYiwgKnAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFdBSVRuZXh0dGltZW91dDsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwlpbnQgaTsKKworCWlmIChuZWVkZWQgPD0gMCkKKwkJcmV0dXJuIChOVUxMKTsJLyogc2FuaXR5IGNoZWNrICovCisKKwlzcGluX3VubG9ja19pcnEoaG9zdC0+aG9zdF9sb2NrKTsKKworICAgICAgcmV0cnk6CisJd2hpbGUgKGZyZWVzY2JzIDwgbmVlZGVkKSB7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgV0FJVG5leHR0aW1lb3V0OworCQlkbyB7CisJCQkvKiBGSVhNRTogY2FuIHdlIGFjdHVhbGx5IGp1c3QgeWllbGQgaGVyZSA/PyAqLworCQkJZm9yIChub3cgPSBqaWZmaWVzOyBub3cgPT0gamlmZmllczspCisJCQkJY3B1X3JlbGF4KCk7CS8qIHdhaXQgYSBqaWZmeSAqLworCQl9IHdoaWxlIChmcmVlc2NicyA8IG5lZWRlZCAmJiB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCB0aW1lb3V0KSk7CisJCS8qCisJCSAqICBJZiB3ZSBnZXQgaGVyZSB3aXRoIGVub3VnaCBmcmVlIFNjYnMsIHdlIGNhbiB0YWtlIHRoZW0uCisJCSAqICBPdGhlcndpc2UsIHdlIHRpbWVkIG91dCBhbmQgZGlkbid0IGdldCBlbm91Z2guCisJCSAqLworCQlpZiAoZnJlZXNjYnMgPCBuZWVkZWQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwOiBjYW4ndCBnZXQgZW5vdWdoIGZyZWUgU0NCcy5cbiIpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCX0KKworCS8qIFRha2UgdGhlIGxvY2ssIHRoZW4gY2hlY2sgd2UgZGlkbnQgZ2V0IGJlYXRlbiwgaWYgc28gdHJ5IGFnYWluICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYnBvb2xfbG9jaywgZmxhZ3MpOworCWlmIChmcmVlc2NicyA8IG5lZWRlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2Jwb29sX2xvY2ssIGZsYWdzKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlzY2IgPSBzY2JmcmVlOworCWZyZWVzY2JzIC09IG5lZWRlZDsKKwlmb3IgKGkgPSAwOyBpIDwgbmVlZGVkOyBpKyspIHsKKwkJcCA9IHNjYmZyZWU7CisJCXNjYmZyZWUgPSBwLT5uZXh0OworCX0KKwlwLT5uZXh0ID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYnBvb2xfbG9jaywgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spOworCXJldHVybiAoc2NiKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zY2IoU2NiICogc2NiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NicG9vbF9sb2NrLCBmbGFncyk7CisKKwltZW1zZXQoc2NiLCAwLCBzaXplb2YoU2NiKSk7CisJc2NiLT5uZXh0ID0gc2NiZnJlZTsKKwlzY2JmcmVlID0gc2NiOworCWZyZWVzY2JzKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2Jwb29sX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zY2JzKHZvaWQpCit7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmc2NicG9vbF9sb2NrKTsKKworCS8qIFRoaXMgaXMgb25seSBldmVyIGNhbGxlZCBiZWZvcmUgdGhlIFNDQiBwb29sIGlzIGFjdGl2ZSAqLworCisJc2NiZnJlZSA9ICYoc2Nic1swXSk7CisJbWVtc2V0KHNjYnMsIDAsIHNpemVvZihzY2JzKSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9TQ0JTIC0gMTsgaSsrKSB7CisJCXNjYnNbaV0ubmV4dCA9ICYoc2Nic1tpICsgMV0pOworCQlzY2JzW2ldLlNDcG50ID0gTlVMTDsKKwl9CisJc2Nic1tNQVhfU0NCUyAtIDFdLm5leHQgPSBOVUxMOworCXNjYnNbTUFYX1NDQlMgLSAxXS5TQ3BudCA9IE5VTEw7Cit9CisKKworc3RhdGljIGludCBtYWlsX291dChBZGFwdGVyICogaG9zdCwgU2NiICogc2NicHRyKQorLyoKKyAqICBOb3RlOiB0aGlzIGNhbiBhbHNvIGJlIHVzZWQgZm9yIElDQnM7IGp1c3QgY2FzdCB0byB0aGUgcGFybSB0eXBlLgorICovCit7CisJaW50IGksIG9nbWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmNoYXIgc3RhcnRfb2dtYjsKKwlNYWlsYm94ICpvZ21icyA9IGhvc3QtPm1iLm9nbWI7CisJaW50ICpuZXh0X29nbWIgPSAmKGhvc3QtPm5leHRfb2dtYik7CisKKwlkcHJpbnRrKCJ3ZDcwMDBfbWFpbF9vdXQ6IDB4JTA2bHgiLCAobG9uZykgc2NicHRyKTsKKworCS8qIFdlIGZpcnN0IGxvb2sgZm9yIGEgZnJlZSBvdXRnb2luZyBtYWlsYm94ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+c2gtPmhvc3RfbG9jaywgZmxhZ3MpOworCW9nbWIgPSAqbmV4dF9vZ21iOworCWZvciAoaSA9IDA7IGkgPCBPR01CX0NOVDsgaSsrKSB7CisJCWlmIChvZ21ic1tvZ21iXS5zdGF0dXMgPT0gMCkgeworCQkJZHByaW50aygiIHVzaW5nIE9HTUIgMHgleCIsIG9nbWIpOworCQkJb2dtYnNbb2dtYl0uc3RhdHVzID0gMTsKKwkJCWFueTJzY3NpKCh1bmNoYXIgKikgb2dtYnNbb2dtYl0uc2NicHRyLCAoaW50KSBzY2JwdHIpOworCisJCQkqbmV4dF9vZ21iID0gKG9nbWIgKyAxKSAlIE9HTUJfQ05UOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJb2dtYiA9IChvZ21iICsgMSkgJSBPR01CX0NOVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5zaC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlkcHJpbnRrKCIsIHNjYiBpcyAweCUwNmx4IiwgKGxvbmcpIHNjYnB0cik7CisKKwlpZiAoaSA+PSBPR01CX0NOVCkgeworCQkvKgorCQkgKiAgQWx0ZXJuYXRpdmVseSwgd2UgbWlnaHQgaXNzdWUgdGhlICJpbnRlcnJ1cHQgb24gZnJlZSBPR01CIiwKKwkJICogIGFuZCBzbGVlcCwgYnV0IGl0IG11c3QgYmUgZW5zdXJlZCB0aGF0IGl0IGlzbid0IHRoZSBpbml0CisJCSAqICB0YXNrIHJ1bm5pbmcuICBJbnN0ZWFkLCB0aGlzIHZlcnNpb24gYXNzdW1lcyB0aGF0IHRoZSBjYWxsZXIKKwkJICogIHdpbGwgYmUgcGVyc2lzdGVudCwgYW5kIHRyeSBhZ2Fpbi4gIFNpbmNlIGl0J3MgdGhlIGFkYXB0ZXIKKwkJICogIHRoYXQgbWFya3MgT0dNQidzIGZyZWUsIHdhaXRpbmcgZXZlbiB3aXRoIGludGVycnVwdHMgb2ZmCisJCSAqICBzaG91bGQgd29yaywgc2luY2UgdGhleSBhcmUgZnJlZWQgdmVyeSBxdWlja2x5IGluIG1vc3QgY2FzZXMuCisJCSAqLworCQlkcHJpbnRrKCIsIG5vIGZyZWUgT0dNQnMuXG4iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwl3ZDcwMDBfZW5hYmxlX2ludHIoaG9zdCk7CisKKwlzdGFydF9vZ21iID0gU1RBUlRfT0dNQiB8IG9nbWI7CisJY29tbWFuZF9vdXQoaG9zdCwgJnN0YXJ0X29nbWIsIDEpOworCisJZHByaW50aygiLCBhd2FpdGluZyBpbnRlcnJ1cHQuXG4iKTsKKworCXJldHVybiAoMSk7Cit9CisKKworc3RhdGljIGludCBtYWtlX2NvZGUodW5zaWduZWQgaG9zdGVyciwgdW5zaWduZWQgc2NzaWVycikKK3sKKyNpZmRlZiBXRDcwMDBfREVCVUcKKwlpbnQgaW5fZXJyb3IgPSBob3N0ZXJyOworI2VuZGlmCisKKwlzd2l0Y2ggKChob3N0ZXJyID4+IDgpICYgMHhmZikgeworCWNhc2UgMDoJCS8qIFJlc2VydmVkICovCisJCWhvc3RlcnIgPSBESURfRVJST1I7CisJCWJyZWFrOworCWNhc2UgMToJCS8qIENvbW1hbmQgQ29tcGxldGUsIG5vIGVycm9ycyAqLworCQlob3N0ZXJyID0gRElEX09LOworCQlicmVhazsKKwljYXNlIDI6CQkvKiBDb21tYW5kIGNvbXBsZXRlLCBlcnJvciBsb2dnZWQgaW4gc2NiIHN0YXR1cyAoc2NzaWVycikgKi8KKwkJaG9zdGVyciA9IERJRF9PSzsKKwkJYnJlYWs7CisJY2FzZSA0OgkJLyogQ29tbWFuZCBmYWlsZWQgdG8gY29tcGxldGUgLSB0aW1lb3V0ICovCisJCWhvc3RlcnIgPSBESURfVElNRV9PVVQ7CisJCWJyZWFrOworCWNhc2UgNToJCS8qIENvbW1hbmQgdGVybWluYXRlZDsgQnVzIHJlc2V0IGJ5IGV4dGVybmFsIGRldmljZSAqLworCQlob3N0ZXJyID0gRElEX1JFU0VUOworCQlicmVhazsKKwljYXNlIDY6CQkvKiBVbmV4cGVjdGVkIENvbW1hbmQgUmVjZWl2ZWQgdy8gaG9zdCBhcyB0YXJnZXQgKi8KKwkJaG9zdGVyciA9IERJRF9CQURfVEFSR0VUOworCQlicmVhazsKKwljYXNlIDgwOgkJLyogVW5leHBlY3RlZCBSZXNlbGVjdGlvbiAqLworCWNhc2UgODE6CQkvKiBVbmV4cGVjdGVkIFNlbGVjdGlvbiAqLworCQlob3N0ZXJyID0gRElEX0JBRF9JTlRSOworCQlicmVhazsKKwljYXNlIDgyOgkJLyogQWJvcnQgQ29tbWFuZCBNZXNzYWdlICAqLworCQlob3N0ZXJyID0gRElEX0FCT1JUOworCQlicmVhazsKKwljYXNlIDgzOgkJLyogU0NTSSBCdXMgU29mdHdhcmUgUmVzZXQgKi8KKwljYXNlIDg0OgkJLyogU0NTSSBCdXMgSGFyZHdhcmUgUmVzZXQgKi8KKwkJaG9zdGVyciA9IERJRF9SRVNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIFJlc2VydmVkICovCisJCWhvc3RlcnIgPSBESURfRVJST1I7CisJfQorI2lmZGVmIFdENzAwMF9ERUJVRworCWlmIChzY3NpZXJyIHx8IGhvc3RlcnIpCisJCWRwcmludGsoIlxuU0NTSSBjb21tYW5kIGVycm9yOiBTQ1NJIDB4JTAyeCBob3N0IDB4JTA0eCByZXR1cm4gJWRcbiIsIHNjc2llcnIsIGluX2Vycm9yLCBob3N0ZXJyKTsKKyNlbmRpZgorCXJldHVybiAoc2NzaWVyciB8IChob3N0ZXJyIDw8IDE2KSk7Cit9CisKKyNkZWZpbmUgd2Q3MDAwX2ludHJfYWNrKGhvc3QpICAgb3V0YiAoMCwgaG9zdC0+aW9iYXNlICsgQVNDX0lOVFJfQUNLKQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3ZDcwMDBfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCUFkYXB0ZXIgKmhvc3QgPSAoQWRhcHRlciAqKSBkZXZfaWQ7CisJaW50IGZsYWcsIGljbWIsIGVycnN0YXR1cywgaWNtYl9zdGF0dXM7CisJaW50IGhvc3RfZXJyb3IsIHNjc2lfZXJyb3I7CisJU2NiICpzY2I7CS8qIGZvciBTQ1NJIGNvbW1hbmRzICovCisJSWNiQW55ICppY2I7CS8qIGZvciBob3N0IGNvbW1hbmRzICovCisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisJTWFpbGJveCAqaWNtYnMgPSBob3N0LT5tYi5pY21iOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5zaC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaG9zdC0+aW50X2NvdW50ZXIrKzsKKworCWRwcmludGsoIndkNzAwMF9pbnRyOiBpcnEgPSAlZCwgaG9zdCA9IDB4JTA2bHhcbiIsIGlycSwgKGxvbmcpIGhvc3QpOworCisJZmxhZyA9IGluYihob3N0LT5pb2Jhc2UgKyBBU0NfSU5UUl9TVEFUKTsKKworCWRwcmludGsoIndkNzAwMF9pbnRyOiBpbnRyIHN0YXQgPSAweCUwMnhcbiIsIGZsYWcpOworCisJaWYgKCEoaW5iKGhvc3QtPmlvYmFzZSArIEFTQ19TVEFUKSAmIElOVF9JTSkpIHsKKwkJLyogTkI6IHRoZXNlIGFyZSBfdmVyeV8gcG9zc2libGUgaWYgSVJRIDE1IGlzIGJlaW5nIHVzZWQsIHNpbmNlCisJCSAqIGl0J3MgdGhlICJnYXJiYWdlIGNvbGxlY3RvciIgb24gdGhlIDJuZCA4MjU5IFBJQy4gIFNwZWNpZmljYWxseSwKKwkJICogYW55IGludGVycnVwdCBzaWduYWwgaW50byB0aGUgODI1OSB3aGljaCBjYW4ndCBiZSBpZGVudGlmaWVkCisJCSAqIGNvbWVzIG91dCBhcyA3IGZyb20gdGhlIDgyNTksIHdoaWNoIGlzIDE1IHRvIHRoZSBob3N0LiAgVGh1cywgaXQKKwkJICogaXMgYSBnb29kIHRoaW5nIHRoZSBXRDcwMDAgaGFzIGFuIGludGVycnVwdCBzdGF0dXMgcG9ydCwgc28gd2UKKwkJICogY2FuIHNvcnQgdGhlc2Ugb3V0LiAgT3RoZXJ3aXNlLCBlbGVjdHJpY2FsIG5vaXNlIGFuZCBvdGhlciBzdWNoCisJCSAqIHByb2JsZW1zIHdvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdmFsaWQgaW50ZXJydXB0cy4uLgorCQkgKi8KKwkJZHByaW50aygid2Q3MDAwX2ludHI6IHBoYW50b20gaW50ZXJydXB0Li4uXG4iKTsKKwkJZ290byBhY2s7CisJfQorCisJaWYgKCEoZmxhZyAmIE1CX0lOVFIpKQorCQlnb3RvIGFjazsKKworCS8qIFRoZSBpbnRlcnJ1cHQgaXMgZm9yIGEgbWFpbGJveCAqLworCWlmICghKGZsYWcgJiBJTUJfSU5UUikpIHsKKwkJZHByaW50aygid2Q3MDAwX2ludHI6IGZyZWUgb3V0Z29pbmcgbWFpbGJveFxuIik7CisJCS8qCisJCSAqIElmIHNsZWVwX29uKCkgYW5kIHRoZSAiaW50ZXJydXB0IG9uIGZyZWUgT0dNQiIgY29tbWFuZCBhcmUKKwkJICogdXNlZCBpbiBtYWlsX291dCgpLCB3YWtlX3VwKCkgc2hvdWxkIGNvcnJlc3BvbmRpbmdseSBiZSBjYWxsZWQKKwkJICogaGVyZS4gIEZvciBub3csIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKwkJICovCisJCWdvdG8gYWNrOworCX0KKworCS8qIFRoZSBpbnRlcnJ1cHQgaXMgZm9yIGFuIGluY29taW5nIG1haWxib3ggKi8KKwlpY21iID0gZmxhZyAmIE1CX01BU0s7CisJaWNtYl9zdGF0dXMgPSBpY21ic1tpY21iXS5zdGF0dXM7CisJaWYgKGljbWJfc3RhdHVzICYgMHg4MCkgewkvKiB1bnNvbGljaXRlZCAtIHJlc3VsdCBpbiBJQ01CICovCisJCWRwcmludGsoIndkNzAwMF9pbnRyOiB1bnNvbGljaXRlZCBpbnRlcnJ1cHQgMHglMDJ4XG4iLCBpY21iX3N0YXR1cyk7CisJCWdvdG8gYWNrOworCX0KKworCS8qIEFhYWFyZ2ghIChaYWdhKSAqLworCXNjYiA9IGlzYV9idXNfdG9fdmlydChzY3NpMmludCgodW5jaGFyICopIGljbWJzW2ljbWJdLnNjYnB0cikpOworCWljbWJzW2ljbWJdLnN0YXR1cyA9IDA7CisJaWYgKHNjYi0+b3AgJiBJQ0JfT1BfTUFTSykgewkvKiBhbiBTQ0IgaXMgZG9uZSAqLworCQlpY2IgPSAoSWNiQW55ICopIHNjYjsKKwkJaWNiLT5zdGF0dXMgPSBpY21iX3N0YXR1czsKKwkJaWNiLT5waGFzZSA9IDA7CisJCWdvdG8gYWNrOworCX0KKworCVNDcG50ID0gc2NiLT5TQ3BudDsKKwlpZiAoLS0oU0NwbnQtPlNDcC5waGFzZSkgPD0gMCkgewkvKiBhbGwgc2NicyBhcmUgZG9uZSAqLworCQlob3N0X2Vycm9yID0gc2NiLT52dWUgfCAoaWNtYl9zdGF0dXMgPDwgOCk7CisJCXNjc2lfZXJyb3IgPSBzY2ItPnN0YXR1czsKKwkJZXJyc3RhdHVzID0gbWFrZV9jb2RlKGhvc3RfZXJyb3IsIHNjc2lfZXJyb3IpOworCQlTQ3BudC0+cmVzdWx0ID0gZXJyc3RhdHVzOworCisJCWZyZWVfc2NiKHNjYik7CisKKwkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CisJfQorCisgYWNrOgorCWRwcmludGsoIndkNzAwMF9pbnRyOiByZXR1cm4gZnJvbSBpbnRlcnJ1cHQgaGFuZGxlclxuIik7CisJd2Q3MDAwX2ludHJfYWNrKGhvc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5zaC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHdkNzAwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCVNjYiAqc2NiOworCVNnYiAqc2diOworCXVuY2hhciAqY2RiID0gKHVuY2hhciAqKSBTQ3BudC0+Y21uZDsKKwl1bmNoYXIgaWRsdW47CisJc2hvcnQgY2RibGVuOworCUFkYXB0ZXIgKmhvc3QgPSAoQWRhcHRlciAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKworCWNkYmxlbiA9IFNDcG50LT5jbWRfbGVuOworCWlkbHVuID0gKChTQ3BudC0+ZGV2aWNlLT5pZCA8PCA1KSAmIDB4ZTApIHwgKFNDcG50LT5kZXZpY2UtPmx1biAmIDcpOworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCVNDcG50LT5TQ3AucGhhc2UgPSAxOworCXNjYiA9IGFsbG9jX3NjYnMoU0NwbnQtPmRldmljZS0+aG9zdCwgMSk7CisJc2NiLT5pZGx1biA9IGlkbHVuOworCW1lbWNweShzY2ItPmNkYiwgY2RiLCBjZGJsZW4pOworCXNjYi0+ZGlyZWMgPSAweDQwOwkvKiBEaXNhYmxlIGRpcmVjdGlvbiBjaGVjayAqLworCisJc2NiLT5TQ3BudCA9IFNDcG50OwkvKiBzbyB3ZSBjYW4gZmluZCBzdHVmZiBsYXRlciAqLworCVNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuY2hhciAqKSBzY2I7CisJc2NiLT5ob3N0ID0gaG9zdDsKKworCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwkJdW5zaWduZWQgaTsKKworCQlpZiAoU0NwbnQtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplID09IFNHX05PTkUpIHsKKwkJCXBhbmljKCJ3ZDcwMDBfcXVldWVjb21tYW5kOiBzY2F0dGVyL2dhdGhlciBub3Qgc3VwcG9ydGVkLlxuIik7CisJCX0KKwkJZHByaW50aygiVXNpbmcgc2NhdHRlci9nYXRoZXIgd2l0aCAlZCBlbGVtZW50cy5cbiIsIFNDcG50LT51c2Vfc2cpOworCisJCXNnYiA9IHNjYi0+c2diOworCQlzY2ItPm9wID0gMTsKKwkJYW55MnNjc2koc2NiLT5kYXRhcHRyLCAoaW50KSBzZ2IpOworCQlhbnkyc2NzaShzY2ItPm1heGxlbiwgU0NwbnQtPnVzZV9zZyAqIHNpemVvZihTZ2IpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0NwbnQtPnVzZV9zZzsgaSsrKSB7CisJCQlhbnkyc2NzaShzZ2JbaV0ucHRyLCBpc2FfcGFnZV90b19idXMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQpOworCQkJYW55MnNjc2koc2diW2ldLmxlbiwgc2dbaV0ubGVuZ3RoKTsKKwkJfQorCX0gZWxzZSB7CisJCXNjYi0+b3AgPSAwOworCQlhbnkyc2NzaShzY2ItPmRhdGFwdHIsIGlzYV92aXJ0X3RvX2J1cyhTQ3BudC0+cmVxdWVzdF9idWZmZXIpKTsKKwkJYW55MnNjc2koc2NiLT5tYXhsZW4sIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOworCX0KKworCS8qIEZJWE1FOiBkcm9wIGxvY2sgYW5kIHlpZWxkIGhlcmUgPyAqLworCisJd2hpbGUgKCFtYWlsX291dChob3N0LCBzY2IpKQorCQljcHVfcmVsYXgoKTsJLyoga2VlcCB0cnlpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdkNzAwMF9kaWFnbm9zdGljcyhBZGFwdGVyICogaG9zdCwgaW50IGNvZGUpCit7CisJc3RhdGljIEljYkRpYWcgaWNiID0geyBJQ0JfT1BfRElBR05PU1RJQ1MgfTsKKwlzdGF0aWMgdW5jaGFyIGJ1ZlsyNTZdOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWljYi50eXBlID0gY29kZTsKKwlhbnkyc2NzaShpY2IubGVuLCBzaXplb2YoYnVmKSk7CisJYW55MnNjc2koaWNiLnB0ciwgKGludCkgJmJ1Zik7CisJaWNiLnBoYXNlID0gMTsKKwkvKgorCSAqIFRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCBhdCBpbml0LCBzbyB0aGVyZSBzaG91bGQgYmUgT0dNQnMKKwkgKiBhdmFpbGFibGUuICBJJ20gYXNzdW1pbmcgc28gaGVyZS4gIElmIHRoaXMgaXMgZ29pbmcgdG8KKwkgKiBmYWlsLCBJIGNhbiBqdXN0IGxldCB0aGUgdGltZW91dCBjYXRjaCB0aGUgZmFpbHVyZS4KKwkgKi8KKwltYWlsX291dChob3N0LCAoc3RydWN0IHNjYiAqKSAmaWNiKTsKKwl0aW1lb3V0ID0gamlmZmllcyArIFdBSVRuZXh0dGltZW91dDsJLyogd2FpdCB1cCB0byAyIHNlY29uZHMgKi8KKwl3aGlsZSAoaWNiLnBoYXNlICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWNwdV9yZWxheCgpOwkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCWJhcnJpZXIoKTsKKwl9CisKKwlpZiAoaWNiLnBoYXNlKSB7CisJCXByaW50aygid2Q3MDAwX2RpYWdub3N0aWNzOiB0aW1lZCBvdXQuXG4iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKG1ha2VfY29kZShpY2IudnVlIHwgKGljYi5zdGF0dXMgPDwgOCksIDApKSB7CisJCXByaW50aygid2Q3MDAwX2RpYWdub3N0aWNzOiBmYWlsZWQgKDB4JTAyeCwweCUwMngpXG4iLCBpY2IudnVlLCBpY2Iuc3RhdHVzKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisKK3N0YXRpYyBpbnQgd2Q3MDAwX2FkYXB0ZXJfcmVzZXQoQWRhcHRlciAqIGhvc3QpCit7CisJSW5pdENtZCBpbml0X2NtZCA9IHsKKwkJSU5JVElBTElaQVRJT04sCisJCTcsCisJCWhvc3QtPmJ1c19vbiwKKwkJaG9zdC0+YnVzX29mZiwKKwkJMCwKKwkJezAsIDAsIDB9LAorCQlPR01CX0NOVCwKKwkJSUNNQl9DTlQKKwl9OworCWludCBkaWFnOworCS8qCisJICogIFJlc2V0IHRoZSBhZGFwdGVyIC0gb25seS4gIFRoZSBTQ1NJIGJ1cyB3YXMgaW5pdGlhbGl6ZWQgYXQgcG93ZXItdXAsCisJICogIGFuZCB3ZSBuZWVkIHRvIGRvIHRoaXMganVzdCBzbyB3ZSBjb250cm9sIHRoZSBtYWlsYm94ZXMsIGV0Yy4KKwkgKi8KKwlvdXRiKEFTQ19SRVMsIGhvc3QtPmlvYmFzZSArIEFTQ19DT05UUk9MKTsKKwl1ZGVsYXkoNDApOwkJLyogcmVzZXQgcHVsc2U6IHRoaXMgaXMgNDB1cywgb25seSBuZWVkIDI1dXMgKi8KKwlvdXRiKDAsIGhvc3QtPmlvYmFzZSArIEFTQ19DT05UUk9MKTsKKwlob3N0LT5jb250cm9sID0gMDsJLyogdGhpcyBtdXN0IGFsd2F5cyBzaGFkb3cgQVNDX0NPTlRST0wgKi8KKworCWlmIChXQUlUKGhvc3QtPmlvYmFzZSArIEFTQ19TVEFULCBBU0NfU1RBVE1BU0ssIENNRF9SRFksIDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX2luaXQ6IFdBSVQgdGltZWQgb3V0LlxuIik7CisJCXJldHVybiAtMTsJLyogLTEgPSBub3Qgb2sgKi8KKwl9CisKKwlpZiAoKGRpYWcgPSBpbmIoaG9zdC0+aW9iYXNlICsgQVNDX0lOVFJfU1RBVCkpICE9IDEpIHsKKwkJcHJpbnRrKCJ3ZDcwMDBfaW5pdDogIik7CisKKwkJc3dpdGNoIChkaWFnKSB7CisJCWNhc2UgMjoKKwkJCXByaW50ayhLRVJOX0VSUiAiUkFNIGZhaWx1cmUuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlwcmludGsoS0VSTl9FUlIgIkZJRk8gUi9XIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJTQklDIHJlZ2lzdGVyIFIvVyBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXByaW50ayhLRVJOX0VSUiAiSW5pdGlhbGl6YXRpb24gRC1GRiBmYWlsZWQuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlwcmludGsoS0VSTl9FUlIgIkhvc3QgSVJRIEQtRkYgZmFpbGVkLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJcHJpbnRrKEtFUk5fRVJSICJST00gY2hlY2tzdW0gZXJyb3IuXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJkaWFnbm9zdGljIGNvZGUgMHglMDJYaCByZWNlaXZlZC5cbiIsIGRpYWcpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJLyogQ2xlYXIgbWFpbGJveGVzICovCisJbWVtc2V0KCYoaG9zdC0+bWIpLCAwLCBzaXplb2YoaG9zdC0+bWIpKTsKKworCS8qIEV4ZWN1dGUgaW5pdCBjb21tYW5kICovCisJYW55MnNjc2koKHVuY2hhciAqKSAmIChpbml0X2NtZC5tYWlsYm94ZXMpLCAoaW50KSAmKGhvc3QtPm1iKSk7CisJaWYgKCFjb21tYW5kX291dChob3N0LCAodW5jaGFyICopICYgaW5pdF9jbWQsIHNpemVvZihpbml0X2NtZCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX2FkYXB0ZXJfcmVzZXQ6IGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoV0FJVChob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCwgQVNDX1NUQVRNQVNLLCBBU0NfSU5JVCwgMCkpIHsKKwkJcHJpbnRrKCJ3ZDcwMDBfYWRhcHRlcl9yZXNldDogV0FJVCB0aW1lZCBvdXQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZDcwMDBfaW5pdChBZGFwdGVyICogaG9zdCkKK3sKKwlpZiAod2Q3MDAwX2FkYXB0ZXJfcmVzZXQoaG9zdCkgPT0gLTEpCisJCXJldHVybiAwOworCisKKwlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCB3ZDcwMDBfaW50ciwgU0FfSU5URVJSVVBULCAid2Q3MDAwIiwgaG9zdCkpIHsKKwkJcHJpbnRrKCJ3ZDcwMDBfaW5pdDogY2FuJ3QgZ2V0IElSUSAlZC5cbiIsIGhvc3QtPmlycSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChyZXF1ZXN0X2RtYShob3N0LT5kbWEsICJ3ZDcwMDAiKSkgeworCQlwcmludGsoIndkNzAwMF9pbml0OiBjYW4ndCBnZXQgRE1BIGNoYW5uZWwgJWQuXG4iLCBob3N0LT5kbWEpOworCQlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCQlyZXR1cm4gKDApOworCX0KKwl3ZDcwMDBfZW5hYmxlX2RtYShob3N0KTsKKwl3ZDcwMDBfZW5hYmxlX2ludHIoaG9zdCk7CisKKwlpZiAoIXdkNzAwMF9kaWFnbm9zdGljcyhob3N0LCBJQ0JfRElBR19GVUxMKSkgeworCQlmcmVlX2RtYShob3N0LT5kbWEpOworCQlmcmVlX2lycShob3N0LT5pcnEsIE5VTEwpOworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoMSk7Cit9CisKKworc3RhdGljIHZvaWQgd2Q3MDAwX3JldmlzaW9uKEFkYXB0ZXIgKiBob3N0KQoreworCXN0YXRpYyBJY2JSZXZMdmwgaWNiID0geyBJQ0JfT1BfR0VUX1JFVklTSU9OIH07CisKKwlpY2IucGhhc2UgPSAxOworCS8qCisJICogTGlrZSBkaWFnbm9zdGljcywgdGhpcyBpcyBvbmx5IGRvbmUgYXQgaW5pdCB0aW1lLCBpbiBmYWN0LCBmcm9tCisJICogd2Q3MDAwX2RldGVjdCwgc28gdGhlcmUgc2hvdWxkIGJlIE9HTUJzIGF2YWlsYWJsZS4gIElmIGl0IGZhaWxzLAorCSAqIHRoZSBvbmx5IGRhbWFnZSB3aWxsIGJlIHRoYXQgdGhlIHJldmlzaW9uIHdpbGwgc2hvdyB1cCBhcyAwLjAsCisJICogd2hpY2ggaW4gdHVybiBtZWFucyB0aGF0IHNjYXR0ZXIvZ2F0aGVyIHdpbGwgYmUgZGlzYWJsZWQuCisJICovCisJbWFpbF9vdXQoaG9zdCwgKHN0cnVjdCBzY2IgKikgJmljYik7CisJd2hpbGUgKGljYi5waGFzZSkgeworCQljcHVfcmVsYXgoKTsJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCQliYXJyaWVyKCk7CisJfQorCWhvc3QtPnJldjEgPSBpY2IucHJpbWFyeTsKKwlob3N0LT5yZXYyID0gaWNiLnNlY29uZGFyeTsKK30KKworCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIHsgaWYgKHBvcyA8IChidWZmZXIgKyBsZW5ndGgpKSBwb3MgKz0gc3ByaW50ZiAocG9zLCAjIyBhcmdzKTsgfQorCitzdGF0aWMgaW50IHdkNzAwMF9zZXRfaW5mbyhjaGFyICpidWZmZXIsIGludCBsZW5ndGgsIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJZHByaW50aygiQnVmZmVyID0gPCUuKnM+LCBsZW5ndGggPSAlZFxuIiwgbGVuZ3RoLCBidWZmZXIsIGxlbmd0aCk7CisKKwkvKgorCSAqIEN1cnJlbnRseSB0aGlzIGlzIGEgbm8tb3AKKwkgKi8KKwlkcHJpbnRrKCJTb3JyeSwgdGhpcyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgb3V0IG9mIG9yZGVyLi4uXG4iKTsKKwlyZXR1cm4gKGxlbmd0aCk7Cit9CisKKworc3RhdGljIGludCB3ZDcwMDBfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsICBpbnQgaW5vdXQpCit7CisJQWRhcHRlciAqYWRhcHRlciA9IChBZGFwdGVyICopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpwb3MgPSBidWZmZXI7CisjaWZkZWYgV0Q3MDAwX0RFQlVHCisJTWFpbGJveCAqb2dtYnMsICppY21iczsKKwlzaG9ydCBjb3VudDsKKyNlbmRpZgorCisJLyoKKwkgKiBIYXMgZGF0YSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbGUgPworCSAqLworCWlmIChpbm91dCkKKwkJcmV0dXJuICh3ZDcwMDBfc2V0X2luZm8oYnVmZmVyLCBsZW5ndGgsIGhvc3QpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCVNQUklOVEYoIkhvc3Qgc2NzaSVkOiBXZXN0ZXJuIERpZ2l0YWwgV0QtNzAwMCAocmV2ICVkLiVkKVxuIiwgaG9zdC0+aG9zdF9ubywgYWRhcHRlci0+cmV2MSwgYWRhcHRlci0+cmV2Mik7CisJU1BSSU5URigiICBJTyBiYXNlOiAgICAgIDB4JXhcbiIsIGFkYXB0ZXItPmlvYmFzZSk7CisJU1BSSU5URigiICBJUlE6ICAgICAgICAgICVkXG4iLCBhZGFwdGVyLT5pcnEpOworCVNQUklOVEYoIiAgRE1BIGNoYW5uZWw6ICAlZFxuIiwgYWRhcHRlci0+ZG1hKTsKKwlTUFJJTlRGKCIgIEludGVycnVwdHM6ICAgJWRcbiIsIGFkYXB0ZXItPmludF9jb3VudGVyKTsKKwlTUFJJTlRGKCIgIEJVU19PTiB0aW1lOiAgJWQgbmFub3NlY29uZHNcbiIsIGFkYXB0ZXItPmJ1c19vbiAqIDEyNSk7CisJU1BSSU5URigiICBCVVNfT0ZGIHRpbWU6ICVkIG5hbm9zZWNvbmRzXG4iLCBhZGFwdGVyLT5idXNfb2ZmICogMTI1KTsKKworI2lmZGVmIFdENzAwMF9ERUJVRworCW9nbWJzID0gYWRhcHRlci0+bWIub2dtYjsKKwlpY21icyA9IGFkYXB0ZXItPm1iLmljbWI7CisKKwlTUFJJTlRGKCJcbkNvbnRyb2wgcG9ydCB2YWx1ZTogMHgleFxuIiwgYWRhcHRlci0+Y29udHJvbCk7CisJU1BSSU5URigiSW5jb21pbmcgbWFpbGJveDpcbiIpOworCVNQUklOVEYoIiAgc2l6ZTogJWRcbiIsIElDTUJfQ05UKTsKKwlTUFJJTlRGKCIgIHF1ZXVlZCBtZXNzYWdlczogIik7CisKKwlmb3IgKGkgPSBjb3VudCA9IDA7IGkgPCBJQ01CX0NOVDsgaSsrKQorCQlpZiAoaWNtYnNbaV0uc3RhdHVzKSB7CisJCQljb3VudCsrOworCQkJU1BSSU5URigiMHgleCAiLCBpKTsKKwkJfQorCisJU1BSSU5URihjb3VudCA/ICJcbiIgOiAibm9uZVxuIik7CisKKwlTUFJJTlRGKCJPdXRnb2luZyBtYWlsYm94OlxuIik7CisJU1BSSU5URigiICBzaXplOiAlZFxuIiwgT0dNQl9DTlQpOworCVNQUklOVEYoIiAgbmV4dCBtZXNzYWdlOiAweCV4XG4iLCBhZGFwdGVyLT5uZXh0X29nbWIpOworCVNQUklOVEYoIiAgcXVldWVkIG1lc3NhZ2VzOiAiKTsKKworCWZvciAoaSA9IGNvdW50ID0gMDsgaSA8IE9HTUJfQ05UOyBpKyspCisJCWlmIChvZ21ic1tpXS5zdGF0dXMpIHsKKwkJCWNvdW50Kys7CisJCQlTUFJJTlRGKCIweCV4ICIsIGkpOworCQl9CisKKwlTUFJJTlRGKGNvdW50ID8gIlxuIiA6ICJub25lXG4iKTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogQ2FsY3VsYXRlIHN0YXJ0IG9mIG5leHQgYnVmZmVyLCBhbmQgcmV0dXJuIHZhbHVlLgorCSAqLworCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKKworCWlmICgocG9zIC0gYnVmZmVyKSA8IG9mZnNldCkKKwkJcmV0dXJuICgwKTsKKwllbHNlIGlmICgocG9zIC0gYnVmZmVyIC0gb2Zmc2V0KSA8IGxlbmd0aCkKKwkJcmV0dXJuIChwb3MgLSBidWZmZXIgLSBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIChsZW5ndGgpOworfQorCisKKy8qCisgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkYXB0ZXJzIHRoaXMgZHJpdmVyIGlzIHN1cHBvcnRpbmcuCisgKgorICogIFRoZSBzb3VyY2UgZm9yIGhvc3RzLmMgc2F5cyB0byB3YWl0IHRvIGNhbGwgc2NzaV9yZWdpc3RlciB1bnRpbCAxMDAlCisgKiAgc3VyZSBhYm91dCBhbiBhZGFwdGVyLiAgV2UgbmVlZCB0byBkbyBpdCBhIGxpdHRsZSBzb29uZXIgaGVyZTsgd2UKKyAqICBuZWVkIHRoZSBzdG9yYWdlIHNldCB1cCBieSBzY3NpX3JlZ2lzdGVyIGJlZm9yZSB3ZDcwMDBfaW5pdCwgYW5kCisgKiAgY2hhbmdpbmcgdGhlIGxvY2F0aW9uIG9mIGFuIEFkYXB0ZXIgc3RydWN0dXJlIGlzIG1vcmUgdHJvdWJsZSB0aGFuCisgKiAgY2FsbGluZyBzY3NpX3VucmVnaXN0ZXIuCisgKgorICovCisKK3N0YXRpYyBpbnQgd2Q3MDAwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQoreworCXNob3J0IHByZXNlbnQgPSAwLCBiaW9zYWRkcl9wdHIsIHNpZ19wdHIsIGksIHBhc3M7CisJc2hvcnQgYmlvc3B0cltOVU1fQ09ORklHU107CisJdW5zaWduZWQgaW9iYXNlOworCUFkYXB0ZXIgKmhvc3QgPSBOVUxMOworCXN0cnVjdCBTY3NpX0hvc3QgKnNoOworCWludCB1bml0ID0gMDsKKworCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IHN0YXJ0ZWRcbiIpOworCisjaWZkZWYgTU9EVUxFCisJaWYgKHdkNzAwMCkKKwkJd2Q3MDAwX3NldHVwKHdkNzAwMCk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBVTklUUzsgd2Q3MDAwX2hvc3RbaSsrXSA9IE5VTEwpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09ORklHUzsgYmlvc3B0cltpKytdID0gLTEpOworCisJdHBudC0+cHJvY19uYW1lID0gIndkNzAwMCI7CisJdHBudC0+cHJvY19pbmZvID0gJndkNzAwMF9wcm9jX2luZm87CisKKwkvKgorCSAqIFNldCB1cCBTQ0IgZnJlZSBsaXN0LCB3aGljaCBpcyBzaGFyZWQgYnkgYWxsIGFkYXB0ZXJzCisJICovCisJaW5pdF9zY2JzKCk7CisKKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgTlVNX0NPTkZJR1M7IHBhc3MrKykgeworCQkvKgorCQkgKiBGaXJzdCwgc2VhcmNoIGZvciBCSU9TIFNJR05BVFVSRS4uLgorCQkgKi8KKwkJZm9yIChiaW9zYWRkcl9wdHIgPSAwOyBiaW9zYWRkcl9wdHIgPCBOVU1fQUREUlM7IGJpb3NhZGRyX3B0cisrKQorCQkJZm9yIChzaWdfcHRyID0gMDsgc2lnX3B0ciA8IE5VTV9TSUdOQVRVUkVTOyBzaWdfcHRyKyspIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcGFzczsgaSsrKQorCQkJCQlpZiAoYmlvc3B0cltpXSA9PSBiaW9zYWRkcl9wdHIpCisJCQkJCQlicmVhazsKKworCQkJCWlmIChpID09IHBhc3MpIHsKKwkJCQkJdm9pZCBfX2lvbWVtICpiaW9zYWRkciA9IGlvcmVtYXAod2Q3MDAwX2Jpb3NhZGRyW2Jpb3NhZGRyX3B0cl0gKyBzaWduYXR1cmVzW3NpZ19wdHJdLm9mcywKKwkJCQkJCQkJIHNpZ25hdHVyZXNbc2lnX3B0cl0ubGVuKTsKKwkJCQkJc2hvcnQgYmlvc19tYXRjaCA9IDE7CisKKwkJCQkJaWYgKGJpb3NhZGRyKQorCQkJCQkJYmlvc19tYXRjaCA9IGNoZWNrX3NpZ25hdHVyZShiaW9zYWRkciwgc2lnbmF0dXJlc1tzaWdfcHRyXS5zaWcsIHNpZ25hdHVyZXNbc2lnX3B0cl0ubGVuKTsKKworCQkJCQlpb3VubWFwKGJpb3NhZGRyKTsKKworCQkJCQlpZiAoYmlvc19tYXRjaCkKKwkJCQkJCWdvdG8gYmlvc19tYXRjaGVkOworCQkJCX0KKwkJCX0KKworCSAgICAgIGJpb3NfbWF0Y2hlZDoKKwkJLyoKKwkJICogQklPUyBTSUdOQVRVUkUgaGFzIGJlZW4gZm91bmQuCisJCSAqLworI2lmZGVmIFdENzAwMF9ERUJVRworCQlkcHJpbnRrKCJ3ZDcwMDBfZGV0ZWN0OiBwYXNzICVkXG4iLCBwYXNzICsgMSk7CisKKwkJaWYgKGJpb3NhZGRyX3B0ciA9PSBOVU1fQUREUlMpCisJCQlkcHJpbnRrKCJXRC03MDAwIFNTVCBCSU9TIG5vdCBkZXRlY3RlZC4uLlxuIik7CisJCWVsc2UKKwkJCWRwcmludGsoIldELTcwMDAgU1NUIEJJT1MgZGV0ZWN0ZWQgYXQgMHglbHg6IGNoZWNraW5nLi4uXG4iLCB3ZDcwMDBfYmlvc2FkZHJbYmlvc2FkZHJfcHRyXSk7CisjZW5kaWYKKworCQlpZiAoY29uZmlnc1twYXNzXS5pcnEgPCAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHVuaXQgPT0gVU5JVFMpCisJCQljb250aW51ZTsKKworCQlpb2Jhc2UgPSBjb25maWdzW3Bhc3NdLmlvYmFzZTsKKworCQlkcHJpbnRrKCJ3ZDcwMDBfZGV0ZWN0OiBjaGVjayBJTyAweCV4IHJlZ2lvbi4uLlxuIiwgaW9iYXNlKTsKKworCQlpZiAocmVxdWVzdF9yZWdpb24oaW9iYXNlLCA0LCAid2Q3MDAwIikpIHsKKworCQkJZHByaW50aygid2Q3MDAwX2RldGVjdDogQVNDIHJlc2V0IChJTyAweCV4KSAuLi4iLCBpb2Jhc2UpOworCQkJLyoKKwkJCSAqIEFTQyByZXNldC4uLgorCQkJICovCisJCQlvdXRiKEFTQ19SRVMsIGlvYmFzZSArIEFTQ19DT05UUk9MKTsKKwkJCW1zbGVlcCgxMCk7CisJCQlvdXRiKDAsIGlvYmFzZSArIEFTQ19DT05UUk9MKTsKKworCQkJaWYgKFdBSVQoaW9iYXNlICsgQVNDX1NUQVQsIEFTQ19TVEFUTUFTSywgQ01EX1JEWSwgMCkpIHsKKwkJCQlkcHJpbnRrKCJmYWlsZWQhXG4iKTsKKwkJCQlnb3RvIGVycl9yZWxlYXNlOworCQkJfSBlbHNlCisJCQkJZHByaW50aygib2shXG4iKTsKKworCQkJaWYgKGluYihpb2Jhc2UgKyBBU0NfSU5UUl9TVEFUKSA9PSAxKSB7CisJCQkJLyoKKwkJCQkgKiAgV2UgcmVnaXN0ZXIgaGVyZSwgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgZXh0cmEgc3BhY2UsCisJCQkJICogIHdoaWNoIHdlJ2xsIHVzZSBhcyB0aGUgQWRhcHRlciBzdHJ1Y3R1cmUgKGhvc3QpIGZvcgorCQkJCSAqICB0aGlzIGFkYXB0ZXIuICBJdCBpcyBsb2NhdGVkIGp1c3QgYWZ0ZXIgdGhlIHJlZ2lzdGVyZWQKKwkJCQkgKiAgU2NzaV9Ib3N0IHN0cnVjdHVyZSAoc2gpLCBhbmQgaXMgbG9jYXRlZCBieSB0aGUgZW1wdHkKKwkJCQkgKiAgYXJyYXkgaG9zdGRhdGEuCisJCQkJICovCisJCQkJc2ggPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihBZGFwdGVyKSk7CisJCQkJaWYgKHNoID09IE5VTEwpCisJCQkJCWdvdG8gZXJyX3JlbGVhc2U7CisKKwkJCQlob3N0ID0gKEFkYXB0ZXIgKikgc2gtPmhvc3RkYXRhOworCisJCQkJZHByaW50aygid2Q3MDAwX2RldGVjdDogYWRhcHRlciBhbGxvY2F0ZWQgYXQgMHgleFxuIiwgKGludCkgaG9zdCk7CisJCQkJbWVtc2V0KGhvc3QsIDAsIHNpemVvZihBZGFwdGVyKSk7CisKKwkJCQlob3N0LT5pcnEgPSBjb25maWdzW3Bhc3NdLmlycTsKKwkJCQlob3N0LT5kbWEgPSBjb25maWdzW3Bhc3NdLmRtYTsKKwkJCQlob3N0LT5pb2Jhc2UgPSBpb2Jhc2U7CisJCQkJaG9zdC0+aW50X2NvdW50ZXIgPSAwOworCQkJCWhvc3QtPmJ1c19vbiA9IGNvbmZpZ3NbcGFzc10uYnVzX29uOworCQkJCWhvc3QtPmJ1c19vZmYgPSBjb25maWdzW3Bhc3NdLmJ1c19vZmY7CisJCQkJaG9zdC0+c2ggPSB3ZDcwMDBfaG9zdFt1bml0XSA9IHNoOworCQkJCXVuaXQrKzsKKworCQkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IFRyeWluZyBpbml0IFdELTcwMDAgY2FyZCBhdCBJTyAiICIweCV4LCBJUlEgJWQsIERNQSAlZC4uLlxuIiwgaG9zdC0+aW9iYXNlLCBob3N0LT5pcnEsIGhvc3QtPmRtYSk7CisKKwkJCQlpZiAoIXdkNzAwMF9pbml0KGhvc3QpKQkvKiBJbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KKwkJCQkJZ290byBlcnJfdW5yZWdpc3RlcjsKKworCQkJCS8qCisJCQkJICogIE9LIGZyb20gaGVyZSAtIHdlJ2xsIHVzZSB0aGlzIGFkYXB0ZXIvY29uZmlndXJhdGlvbi4KKwkJCQkgKi8KKwkJCQl3ZDcwMDBfcmV2aXNpb24oaG9zdCk7CS8qIGltcG9ydGFudCBmb3Igc2NhdHRlci9nYXRoZXIgKi8KKworCQkJCS8qCisJCQkJICogIEZvciBib2FyZHMgYmVmb3JlIHJldiA2LjAsIHNjYXR0ZXIvZ2F0aGVyIGlzbid0IHN1cHBvcnRlZC4KKwkJCQkgKi8KKwkJCQlpZiAoaG9zdC0+cmV2MSA8IDYpCisJCQkJCXNoLT5zZ190YWJsZXNpemUgPSBTR19OT05FOworCisJCQkJcHJlc2VudCsrOwkvKiBjb3VudCBpdCAqLworCisJCQkJaWYgKGJpb3NhZGRyX3B0ciAhPSBOVU1fQUREUlMpCisJCQkJCWJpb3NwdHJbcGFzc10gPSBiaW9zYWRkcl9wdHI7CisKKwkJCQlwcmludGsoS0VSTl9JTkZPICJXZXN0ZXJuIERpZ2l0YWwgV0QtNzAwMCAocmV2ICVkLiVkKSAiLCBob3N0LT5yZXYxLCBob3N0LT5yZXYyKTsKKwkJCQlwcmludGsoInVzaW5nIElPIDB4JXgsIElSUSAlZCwgRE1BICVkLlxuIiwgaG9zdC0+aW9iYXNlLCBob3N0LT5pcnEsIGhvc3QtPmRtYSk7CisJCQkJcHJpbnRrKCIgIEJVU19PTiB0aW1lOiAlZG5zLCBCVVNfT0ZGIHRpbWU6ICVkbnNcbiIsIGhvc3QtPmJ1c19vbiAqIDEyNSwgaG9zdC0+YnVzX29mZiAqIDEyNSk7CisJCQl9CisJCX0gZWxzZQorCQkJZHByaW50aygid2Q3MDAwX2RldGVjdDogSU8gMHgleCByZWdpb24gYWxyZWFkeSBhbGxvY2F0ZWQhXG4iLCBpb2Jhc2UpOworCisJCWNvbnRpbnVlOworCisJICAgICAgZXJyX3VucmVnaXN0ZXI6CisJCXNjc2lfdW5yZWdpc3RlcihzaCk7CisJICAgICAgZXJyX3JlbGVhc2U6CisJCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgNCk7CisKKwl9CisKKwlpZiAoIXByZXNlbnQpCisJCXByaW50aygiRmFpbGVkIGluaXRpYWxpemF0aW9uIG9mIFdELTcwMDAgU0NTSSBjYXJkIVxuIik7CisKKwlyZXR1cm4gKHByZXNlbnQpOworfQorCitzdGF0aWMgaW50IHdkNzAwMF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCWlmIChzaG9zdC0+aXJxKQorCQlmcmVlX2lycShzaG9zdC0+aXJxLCBOVUxMKTsKKwlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisvKgorICogIEkgaGF2ZSBhYnNvbHV0ZWx5IE5PIGlkZWEgaG93IHRvIGRvIGFuIGFib3J0IHdpdGggdGhlIFdENzAwMC4uLgorICovCitzdGF0aWMgaW50IHdkNzAwMF9hYm9ydChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKwlBZGFwdGVyICpob3N0ID0gKEFkYXB0ZXIgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoaW5iKGhvc3QtPmlvYmFzZSArIEFTQ19TVEFUKSAmIElOVF9JTSkgeworCQlwcmludGsoIndkNzAwMF9hYm9ydDogbG9zdCBpbnRlcnJ1cHRcbiIpOworCQl3ZDcwMDBfaW50cl9oYW5kbGUoaG9zdC0+aXJxLCBOVUxMLCBOVUxMKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJcmV0dXJuIEZBSUxFRDsKK30KKyNlbmRpZgorCisvKgorICogIExhc3QgcmVzb3J0LiBSZWluaXRpYWxpemUgdGhlIGJvYXJkLgorICovCisKK3N0YXRpYyBpbnQgd2Q3MDAwX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJQWRhcHRlciAqaG9zdCA9IChBZGFwdGVyICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJaWYgKHdkNzAwMF9hZGFwdGVyX3Jlc2V0KGhvc3QpIDwgMCkKKwkJcmV0dXJuIEZBSUxFRDsKKwl3ZDcwMDBfZW5hYmxlX2ludHIoaG9zdCk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgKiAgVGhpcyB3YXMgYm9ycm93ZWQgZGlyZWN0bHkgZnJvbSBhaGExNTQyLmMuIChaYWdhKQorICovCisKK3N0YXRpYyBpbnQgd2Q3MDAwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmlwKQoreworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWRwcmludGsoIndkNzAwMF9iaW9zcGFyYW06IGRldj0lcywgc2l6ZT0lZCwgIiwKKwkJYmRldm5hbWUoYmRldiwgYiksIGNhcGFjaXR5KTsKKwkodm9pZCliOwkvKiB1bnVzZWQgdmFyIHdhcm5pbmc/ICovCisKKwkvKgorCSAqIHRyeSBkZWZhdWx0IHRyYW5zbGF0aW9uCisJICovCisJaXBbMF0gPSA2NDsKKwlpcFsxXSA9IDMyOworCWlwWzJdID0gY2FwYWNpdHkgPj4gMTE7CisKKwkvKgorCSAqIGZvciBkaXNrcyA+MUdCIGRvIHNvbWUgZ3Vlc3NpbmcKKwkgKi8KKwlpZiAoaXBbMl0gPj0gMTAyNCkgeworCQlpbnQgaW5mb1szXTsKKworCQkvKgorCQkgKiB0cnkgdG8gZmlndXJlIG91dCB0aGUgZ2VvbWV0cnkgZnJvbSB0aGUgcGFydGl0aW9uIHRhYmxlCisJCSAqLworCQlpZiAoKHNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBjYXBhY2l0eSwgaW5mbykgPCAwKSB8fCAhKCgoaW5mb1swXSA9PSA2NCkgJiYgKGluZm9bMV0gPT0gMzIpKSB8fCAoKGluZm9bMF0gPT0gMjU1KSAmJiAoaW5mb1sxXSA9PSA2MykpKSkgeworCQkJcHJpbnRrKCJ3ZDcwMDBfYmlvc3BhcmFtOiB1bmFibGUgdG8gdmVyaWZ5IGdlb21ldHJ5IGZvciBkaXNrIHdpdGggPjFHQi5cbiIgIiAgICAgICAgICAgICAgICAgIHVzaW5nIGV4dGVuZGVkIHRyYW5zbGF0aW9uLlxuIik7CisKKwkJCWlwWzBdID0gMjU1OworCQkJaXBbMV0gPSA2MzsKKwkJCWlwWzJdID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKDI1NSAqIDYzKTsKKwkJfSBlbHNlIHsKKwkJCWlwWzBdID0gaW5mb1swXTsKKwkJCWlwWzFdID0gaW5mb1sxXTsKKwkJCWlwWzJdID0gaW5mb1syXTsKKworCQkJaWYgKGluZm9bMF0gPT0gMjU1KQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjdXJyZW50IHBhcnRpdGlvbiB0YWJsZSBpcyAiICJ1c2luZyBleHRlbmRlZCB0cmFuc2xhdGlvbi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKwl9CisKKwlkcHJpbnRrKCJiaW9zIGdlb21ldHJ5OiBoZWFkPSVkLCBzZWM9JWQsIGN5bD0lZFxuIiwgaXBbMF0sIGlwWzFdLCBpcFsyXSk7CisJZHByaW50aygiV0FSTklORzogY2hlY2ssIGlmIHRoZSBiaW9zIGdlb21ldHJ5IGlzIGNvcnJlY3QuXG4iKTsKKworCXJldHVybiAoMCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBXdWVuc2NoZSwgSm9obiBCb3lkLCBNaXJvc2xhdiBaYWdvcmFjIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIFdENzAwMCBzZXJpZXMgSVNBIGNvbnRyb2xsZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lCQk9ICJ3ZDcwMDAiLAorCS5wcm9jX2luZm8JCT0gd2Q3MDAwX3Byb2NfaW5mbywKKwkubmFtZQkJCT0gIldlc3Rlcm4gRGlnaXRhbCBXRC03MDAwIiwKKwkuZGV0ZWN0CQkJPSB3ZDcwMDBfZGV0ZWN0LAorCS5yZWxlYXNlCQk9IHdkNzAwMF9yZWxlYXNlLAorCS5xdWV1ZWNvbW1hbmQJCT0gd2Q3MDAwX3F1ZXVlY29tbWFuZCwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gd2Q3MDAwX2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0JCT0gd2Q3MDAwX2Jpb3NwYXJhbSwKKwkuY2FuX3F1ZXVlCQk9IFdENzAwMF9RLAorCS50aGlzX2lkCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJPSBXRDcwMDBfU0csCisJLmNtZF9wZXJfbHVuCQk9IDEsCisJLnVuY2hlY2tlZF9pc2FfZG1hCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworCisjaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS96YWxvbi5jIGIvZHJpdmVycy9zY3NpL3phbG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MTA1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS96YWxvbi5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogWmFsb24gNTNjN3h4IGRldmljZSBkcml2ZXIuCisgKiBCeSBSaWNoYXJkIEhpcnN0IChyaGlyc3RAbGludXhjYXJlLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICIuLi9wYXJpc2MvZ3NjLmgiCisKKyNpbmNsdWRlICJuY3I1M2M4eHguaCIKKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBIaXJzdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVlZmlzaC9aYWxvbiA3MjAgU0NTSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBHU0NfU0NTSV9aQUxPTl9PRkZTRVQgMHg4MDAKKworI2RlZmluZSBJT19NT0RVTEVfRUlNCQkoMSo0KQorI2RlZmluZSBJT19NT0RVTEVfRENfQURBVEEJKDIqNCkKKyNkZWZpbmUgSU9fTU9EVUxFX0lJX0NEQVRBCSgzKjQpCisjZGVmaW5lIElPX01PRFVMRV9JT19DT01NQU5ECSgxMio0KQorI2RlZmluZSBJT19NT0RVTEVfSU9fU1RBVFVTCSgxMyo0KQorCisjZGVmaW5lIElPU1RBVFVTX1JZCQkweDQwCisjZGVmaW5lIElPU1RBVFVTX0ZFCQkweDgwCisjZGVmaW5lIElPSUlEQVRBX1NNSU5UNUwJMHg0MDAwMDAwMAorI2RlZmluZSBJT0lJREFUQV9NSU5UNUVOCTB4MjAwMDAwMDAKKyNkZWZpbmUgSU9JSURBVEFfUEFDS0VOCQkweDEwMDAwMDAwCisjZGVmaW5lIElPSUlEQVRBX1BSRUZFVENIRU4JMHgwODAwMDAwMAorI2RlZmluZSBJT0lJREFUQV9JT0lJCQkweDAwMDAwMDIwCisKKyNkZWZpbmUgQ01EX1JFU0VUCQk1CisKK3N0YXRpYyBzdHJ1Y3QgbmNyX2NoaXAgemFsb243MjBfY2hpcCBfX2luaXRkYXRhID0geworCS5yZXZpc2lvbl9pZCA9CTB4MGYsCisJLmJ1cnN0X21heCA9CTMsCisJLm9mZnNldF9tYXggPQk4LAorCS5ucl9kaXZpc29yID0JNCwKKwkuZmVhdHVyZXMgPQlGRV9XSURFIHwgRkVfRElGRiB8IEZFX0VIUHwgRkVfTVVYIHwgRkVfRUEsCit9OworCisKKworI2lmIDAKKy8qIEZJWE1FOgorICogSXMgdGhpcyBmdW5jdGlvbiBkZWFkIGNvZGU/IG9yIGlzIHNvbWVvbmUgcGxhbm5pbmcgb24gdXNpbmcgaXQgaW4gdGhlCisgKiBmdXR1cmUuICBUaGUgY2xvY2sgPSAoaW50KSBwZGNfcmVzdWx0WzE2XSBkb2VzIG5vdCBsb29rIGNvcnJlY3QgdG8KKyAqIG1lIC4uLiBJIHRoaW5rIGl0IHNob3VsZCBiZSBpb2RjX2RhdGFbMTZdLiAgU2luY2UgdGhpcyBjYXVzZSBhIGNvbXBpbGUKKyAqIGVycm9yIHdpdGggdGhlIG5ldyBlbmNhcHN1bGF0ZWQgUERDLCBJJ20gbm90IGNvbXBpbGluZyBpbiB0aGlzIGZ1bmN0aW9uLgorICogLSBSQgorICovCisvKiBwb2tlIFNDU0kgY2xvY2sgb3V0IG9mIGlvZGMgZGF0YSAqLworCitzdGF0aWMgdTggaW9kY19kYXRhWzMyXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNjQpKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZGNfcmVzdWx0WzMyXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSkgPXswLDAsMCwwfTsKKworc3RhdGljIGludCAKK2xhc2lfc2NzaV9jbG9jayh2b2lkICogaHBhLCBpbnQgZGVmYXVsdGNsb2NrKQoreworCWludCBjbG9jaywgc3RhdHVzOworCisJc3RhdHVzID0gcGRjX2lvZGNfcmVhZCgmcGRjX3Jlc3VsdCwgaHBhLCAwLCAmaW9kY19kYXRhLCAzMiApOworCWlmIChzdGF0dXMgPT0gUERDX1JFVF9PSykgeworCQljbG9jayA9IChpbnQpIHBkY19yZXN1bHRbMTZdOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwZGNfaW9kY19yZWFkIHJldHVybmVkICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWNsb2NrID0gZGVmYXVsdGNsb2NrOyAKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNDU0kgY2xvY2sgJWRcbiIsIF9fRlVOQ1RJT05fXywgY2xvY2spOworIAlyZXR1cm4gY2xvY2s7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgemFsb243eHhfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkucHJvY19uYW1lCT0gInphbG9uN3h4IiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit6YWxvbl9wcm9iZShzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnc2NfaXJxIGdzY19pcnE7CisJdTMyIHphbG9uX3ZlcnM7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKwl2b2lkIF9faW9tZW0gKnphbG9uID0gaW9yZW1hcChkZXYtPmhwYSwgNDA5Nik7CisJdm9pZCBfX2lvbWVtICppb19wb3J0ID0gemFsb24gKyBHU0NfU0NTSV9aQUxPTl9PRkZTRVQ7CisJc3RhdGljIGludCB1bml0ID0gMDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBuY3JfZGV2aWNlIGRldmljZTsKKworCV9fcmF3X3dyaXRlbChDTURfUkVTRVQsIHphbG9uICsgSU9fTU9EVUxFX0lPX0NPTU1BTkQpOworCXdoaWxlICghKF9fcmF3X3JlYWRsKHphbG9uICsgSU9fTU9EVUxFX0lPX1NUQVRVUykgJiBJT1NUQVRVU19SWSkpCisJCWNwdV9yZWxheCgpOworCV9fcmF3X3dyaXRlbChJT0lJREFUQV9NSU5UNUVOIHwgSU9JSURBVEFfUEFDS0VOIHwgSU9JSURBVEFfUFJFRkVUQ0hFTiwKKwkJemFsb24gKyBJT19NT0RVTEVfSUlfQ0RBVEEpOworCisJLyogWFhYOiBTYXZlIHRoZSBaYWxvbiB2ZXJzaW9uIGZvciBidWcgd29ya2Fyb3VuZHM/ICovCisJemFsb25fdmVycyA9IChfX3Jhd19yZWFkbCh6YWxvbiArIElPX01PRFVMRV9JSV9DREFUQSkgPj4gMjQpICYgMHgwNzsKKworCS8qIFNldHVwIHRoZSBpbnRlcnJ1cHRzIGZpcnN0LgorCSoqIExhdGVyIG9uIHJlcXVlc3RfaXJxKCkgd2lsbCByZWdpc3RlciB0aGUgaGFuZGxlci4KKwkqLworCWRldi0+aXJxID0gZ3NjX2FsbG9jX2lycSgmZ3NjX2lycSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogWmFsb24gdmVyc2lvbiAlZCwgSVJRICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCXphbG9uX3ZlcnMsIGRldi0+aXJxKTsKKworCV9fcmF3X3dyaXRlbChnc2NfaXJxLnR4bl9hZGRyIHwgZ3NjX2lycS50eG5fZGF0YSwgemFsb24gKyBJT19NT0RVTEVfRUlNKTsKKworCWlmICh6YWxvbl92ZXJzID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBaYWxvbiAxLjEgb3IgZWFybGllclxuIiwgX19GVU5DVElPTl9fKTsKKworCW1lbXNldCgmZGV2aWNlLCAwLCBzaXplb2Yoc3RydWN0IG5jcl9kZXZpY2UpKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgYXJlIG5lZWRlZCBiZWZvcmUgYW55IG90aGVyIGFjY2Vzcy4gKi8KKwlfX3Jhd193cml0ZWIoMHgyMCwgaW9fcG9ydCArIDB4MzgpOyAvKiBEQ05UTF9SRUcsICBFQSAgKi8KKwlfX3Jhd193cml0ZWIoMHgwNCwgaW9fcG9ydCArIDB4MWIpOyAvKiBDVEVTVDBfUkVHLCBFSFAgKi8KKwlfX3Jhd193cml0ZWIoMHg4MCwgaW9fcG9ydCArIDB4MjIpOyAvKiBDVEVTVDRfUkVHLCBNVVggKi8KKworCS8qIEluaXRpYWxpc2UgbmNyX2RldmljZSBzdHJ1Y3R1cmUgd2l0aCBpdGVtcyByZXF1aXJlZCBieSBuY3JfYXR0YWNoLiAqLworCWRldmljZS5jaGlwCQk9IHphbG9uNzIwX2NoaXA7CisJZGV2aWNlLmhvc3RfaWQJCT0gNzsKKwlkZXZpY2UuZGV2CQk9ICZkZXYtPmRldjsKKwlkZXZpY2Uuc2xvdC5iYXNlCT0gZGV2LT5ocGEgKyBHU0NfU0NTSV9aQUxPTl9PRkZTRVQ7CisJZGV2aWNlLnNsb3QuYmFzZV92CT0gaW9fcG9ydDsKKwlkZXZpY2Uuc2xvdC5pcnEJCT0gZGV2LT5pcnE7CisJZGV2aWNlLmRpZmZlcmVudGlhbAk9IDI7CisKKwlob3N0ID0gbmNyX2F0dGFjaCgmemFsb243eHhfdGVtcGxhdGUsIHVuaXQsICZkZXZpY2UpOworCWlmICghaG9zdCkKKwkJZ290byBmYWlsOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBuY3I1M2M4eHhfaW50ciwgU0FfU0hJUlEsICJ6YWxvbiIsIGhvc3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSBwcm9ibGVtIHdpdGggJWQsIGRldGFjaGluZ1xuICIsCisJCQlkZXYtPmRldi5idXNfaWQsIGRldi0+aXJxKTsKKwkJZ290byBmYWlsOworCX0KKworCXVuaXQrKzsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGhvc3QpOworCisJZXJyb3IgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZkZXYtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisKKwlzY3NpX3NjYW5faG9zdChob3N0KTsKKwlyZXR1cm4gMDsKKworIGZhaWxfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGhvc3QpOworIGZhaWw6CisJbmNyNTNjOHh4X3JlbGVhc2UoaG9zdCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IHBhcmlzY19kZXZpY2VfaWQgemFsb25fdGJsW10gPSB7CisJeyBIUEhXX0FfRE1BLCBIVkVSU0lPTl9SRVZfQU5ZX0lELCBIVkVSU0lPTl9BTllfSUQsIDB4MDAwODkgfSwgCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBhcmlzYywgemFsb25fdGJsKTsKKworc3RhdGljIGludCBfX2V4aXQgemFsb25fcmVtb3ZlKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKwluY3I1M2M4eHhfcmVsZWFzZShob3N0KTsKKwlmcmVlX2lycShkZXYtPmlycSwgaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYXJpc2NfZHJpdmVyIHphbG9uX2RyaXZlciA9IHsKKwkubmFtZSA9CQkiemFsb24iLAorCS5pZF90YWJsZSA9CXphbG9uX3RibCwKKwkucHJvYmUgPQl6YWxvbl9wcm9iZSwKKwkucmVtb3ZlID0JX19kZXZleGl0X3AoemFsb25fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHphbG9uN3h4X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gbmNyNTNjOHh4X2luaXQoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmemFsb25fZHJpdmVyKTsKKwlpZiAocmV0KQorCQluY3I1M2M4eHhfZXhpdCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6YWxvbjd4eF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9wYXJpc2NfZHJpdmVyKCZ6YWxvbl9kcml2ZXIpOworCW5jcjUzYzh4eF9leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KHphbG9uN3h4X2luaXQpOworbW9kdWxlX2V4aXQoemFsb243eHhfZXhpdCk7Cg==